From 5ff7386356fc40875bd0de5ca64ad81712ab3328 Mon Sep 17 00:00:00 2001 From: Brandon Schabell Date: Fri, 2 Oct 2026 19:29:31 -0500 Subject: [PATCH 01/20] Remove unnecessary python version checks. --- CHANGELOG.md | 1 + .../tests/integration/store/test_store_data.py | 5 ----- dash/_hooks.py | 8 +++----- dash/_jupyter.py | 3 +-- dash/development/component_generator.py | 18 +----------------- .../tools/tool_get_dash_component.py | 4 ++-- dash/resources.py | 3 +-- dash/types.py | 4 ++-- requirements/ci.txt | 2 +- .../test_async_background_callbacks.py | 5 ----- .../test_basic_long_callback001.py | 5 ----- .../test_basic_long_callback002.py | 6 ------ .../test_basic_long_callback003.py | 5 ----- .../test_basic_long_callback004.py | 6 ------ .../test_basic_long_callback005.py | 4 ---- .../test_basic_long_callback006.py | 5 ----- .../test_basic_long_callback007.py | 6 ------ .../test_basic_long_callback008.py | 7 ------- .../test_basic_long_callback009.py | 5 ----- .../test_basic_long_callback010.py | 7 ------- .../test_basic_long_callback011.py | 7 ------- .../test_basic_long_callback012.py | 5 ----- .../test_basic_long_callback013.py | 7 ------- .../test_basic_long_callback014.py | 7 ------- .../test_basic_long_callback015.py | 7 ------- .../test_basic_long_callback016.py | 6 ------ tests/unit/test_app_runners.py | 4 ---- 27 files changed, 12 insertions(+), 140 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2fb24b979c..4f523a7126 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ This project adheres to [Semantic Versioning](https://semver.org/). ### Removed - [#3646](https://github.com/plotly/dash/pull/3646) Remove React 16 support (`16.14.0` is no longer an accepted value for `REACT_VERSION` / `_set_react_version`). +- [#4039](https://github.com/plotly/dash/pull/4039) Remove unnecessary Python version checks (pre 3.9). ### Changed - [#3987](https://github.com/plotly/dash/pull/3987) Forward FastAPI reload scope options (`reload_dirs`, `reload_excludes`, and `reload_includes`) to Uvicorn when reloading. diff --git a/components/dash-core-components/tests/integration/store/test_store_data.py b/components/dash-core-components/tests/integration/store/test_store_data.py index 7b5465463f..41689cb072 100644 --- a/components/dash-core-components/tests/integration/store/test_store_data.py +++ b/components/dash-core-components/tests/integration/store/test_store_data.py @@ -1,4 +1,3 @@ -import sys import json import hashlib import itertools @@ -120,10 +119,6 @@ def on_ts(ts, data): assert dash_dcc.get_logs() == [] -@pytest.mark.skipif( - sys.version_info < (3, 6), - reason="tests requires dependency only available in 3.6+", -) @pytest.mark.parametrize("storage_type", ("memory", "local", "session")) def test_stda003_large_data_size(storage_type, csv_5mb, dash_dcc): def fingerprint(data): diff --git a/dash/_hooks.py b/dash/_hooks.py index f260b1fcb0..c70e8210cd 100644 --- a/dash/_hooks.py +++ b/dash/_hooks.py @@ -2,8 +2,6 @@ from importlib import metadata as _importlib_metadata -import typing_extensions as _tx - from .exceptions import HookError from .resources import ResourceType from ._callback import ClientsideFuncType @@ -20,12 +18,12 @@ Dash = None -HookDataType = _tx.TypeVar("HookDataType") -DevtoolPosition = _tx.Literal["right", "left"] +HookDataType = _t.TypeVar("HookDataType") +DevtoolPosition = _t.Literal["right", "left"] # pylint: disable=too-few-public-methods -class _Hook(_tx.Generic[HookDataType]): +class _Hook(_t.Generic[HookDataType]): def __init__( self, func, priority=0, final=False, data: _t.Optional[HookDataType] = None ): diff --git a/dash/_jupyter.py b/dash/_jupyter.py index 85668127df..9ae361a0d2 100644 --- a/dash/_jupyter.py +++ b/dash/_jupyter.py @@ -9,8 +9,7 @@ import threading import time -from typing import Optional, Any -from typing_extensions import Literal +from typing import Optional, Any, Literal from werkzeug.serving import make_server diff --git a/dash/development/component_generator.py b/dash/development/component_generator.py index 660d9986ab..a9e9a70bbc 100644 --- a/dash/development/component_generator.py +++ b/dash/development/component_generator.py @@ -173,10 +173,7 @@ def generate_components( def safe_json_loads(s): - jsondata_unicode = json.loads(s, object_pairs_hook=OrderedDict) - if sys.version_info[0] >= 3: - return jsondata_unicode - return byteify(jsondata_unicode) + return json.loads(s, object_pairs_hook=OrderedDict) def component_build_arg_parser(): @@ -282,18 +279,5 @@ def cli(): ) -# pylint: disable=undefined-variable -def byteify(input_object): - if isinstance(input_object, dict): - return OrderedDict( - [(byteify(key), byteify(value)) for key, value in input_object.items()] - ) - if isinstance(input_object, list): - return [byteify(element) for element in input_object] - if isinstance(input_object, str): # noqa:F821 - return input_object.encode(encoding="utf-8") - return input_object - - if __name__ == "__main__": cli() diff --git a/dash/mcp/primitives/tools/tool_get_dash_component.py b/dash/mcp/primitives/tools/tool_get_dash_component.py index b3f43bd063..caaa0ab206 100644 --- a/dash/mcp/primitives/tools/tool_get_dash_component.py +++ b/dash/mcp/primitives/tools/tool_get_dash_component.py @@ -3,10 +3,10 @@ from __future__ import annotations import json -from typing import Any +from typing import Annotated, Any from pydantic import Field, TypeAdapter -from typing_extensions import Annotated, NotRequired, TypedDict +from typing_extensions import NotRequired, TypedDict from dash import get_app from dash._layout_utils import find_component diff --git a/dash/resources.py b/dash/resources.py index bb55328b3b..337cb55887 100644 --- a/dash/resources.py +++ b/dash/resources.py @@ -3,14 +3,13 @@ import os import typing as _t -import typing_extensions as _tx from .development.base_component import ComponentRegistry from . import exceptions # ResourceType has `async` key, use the init form to be able to provide it. -ResourceType = _tx.TypedDict( +ResourceType = _t.TypedDict( "ResourceType", { "namespace": str, diff --git a/dash/types.py b/dash/types.py index 175a1f61ca..c3297a5147 100644 --- a/dash/types.py +++ b/dash/types.py @@ -1,9 +1,9 @@ import typing -from typing import Any, Dict, List, Union +from typing import Annotated, Any, Dict, List, Union from pydantic import Field, GetCoreSchemaHandler, GetJsonSchemaHandler from pydantic_core import core_schema -from typing_extensions import Annotated, TypedDict, NotRequired +from typing_extensions import TypedDict, NotRequired class _NumberSchema: # pylint: disable=too-few-public-methods diff --git a/requirements/ci.txt b/requirements/ci.txt index db3c682712..0d1067d6be 100644 --- a/requirements/ci.txt +++ b/requirements/ci.txt @@ -22,5 +22,5 @@ xlrd>=2.0.1 pytest-rerunfailures pytest-timeout jupyterlab<4.0.0 -pyright==1.1.411;python_version>="3.7" +pyright==1.1.411 mypy==1.15.0;python_version>="3.12" diff --git a/tests/async_tests/test_async_background_callbacks.py b/tests/async_tests/test_async_background_callbacks.py index 2efcf0b030..7db69d7c1a 100644 --- a/tests/async_tests/test_async_background_callbacks.py +++ b/tests/async_tests/test_async_background_callbacks.py @@ -1,8 +1,6 @@ -import sys import time from multiprocessing import Lock -import pytest from flaky import flaky from tests.utils import is_dash_async @@ -34,9 +32,6 @@ def test_001ab_arbitrary(dash_duo, manager): dash_duo.wait_for_text_to_equal("#no-output", "completed") -@pytest.mark.skipif( - sys.version_info < (3, 7), reason="Python 3.6 long callbacks tests hangs up" -) @flaky(max_runs=3) def test_002ab_basic(dash_duo, manager): """ diff --git a/tests/background_callback/test_basic_long_callback001.py b/tests/background_callback/test_basic_long_callback001.py index af8c80d3ee..49d5def35b 100644 --- a/tests/background_callback/test_basic_long_callback001.py +++ b/tests/background_callback/test_basic_long_callback001.py @@ -1,15 +1,10 @@ -import sys from multiprocessing import Lock -import pytest from flaky import flaky from .utils import setup_background_callback_app -@pytest.mark.skipif( - sys.version_info < (3, 7), reason="Python 3.6 long callbacks tests hangs up" -) @flaky(max_runs=3) def test_lcbc001_fast_input(dash_duo, manager): """ diff --git a/tests/background_callback/test_basic_long_callback002.py b/tests/background_callback/test_basic_long_callback002.py index 0a3c1dd315..1430fb4d70 100644 --- a/tests/background_callback/test_basic_long_callback002.py +++ b/tests/background_callback/test_basic_long_callback002.py @@ -1,14 +1,8 @@ -import sys - -import pytest from flaky import flaky from tests.background_callback.utils import setup_background_callback_app -@pytest.mark.skipif( - sys.version_info < (3, 7), reason="Python 3.6 long callbacks tests hangs up" -) @flaky(max_runs=3) def test_lcbc002_long_callback_running(dash_duo, manager): with setup_background_callback_app(manager, "app2") as app: diff --git a/tests/background_callback/test_basic_long_callback003.py b/tests/background_callback/test_basic_long_callback003.py index f6194a139e..6eee46d50f 100644 --- a/tests/background_callback/test_basic_long_callback003.py +++ b/tests/background_callback/test_basic_long_callback003.py @@ -1,15 +1,10 @@ -import sys from multiprocessing import Lock -import pytest from flaky import flaky from tests.background_callback.utils import setup_background_callback_app -@pytest.mark.skipif( - sys.version_info < (3, 7), reason="Python 3.6 long callbacks tests hangs up" -) @flaky(max_runs=3) def test_lcbc003_long_callback_running_cancel(dash_duo, manager): lock = Lock() diff --git a/tests/background_callback/test_basic_long_callback004.py b/tests/background_callback/test_basic_long_callback004.py index 8b3d646225..24cfe3a557 100644 --- a/tests/background_callback/test_basic_long_callback004.py +++ b/tests/background_callback/test_basic_long_callback004.py @@ -1,14 +1,8 @@ -import sys - -import pytest from flaky import flaky from tests.background_callback.utils import setup_background_callback_app -@pytest.mark.skipif( - sys.version_info < (3, 7), reason="Python 3.6 long callbacks tests hangs up" -) @flaky(max_runs=3) def test_lcbc004_long_callback_progress(dash_duo, manager): with setup_background_callback_app(manager, "app4") as app: diff --git a/tests/background_callback/test_basic_long_callback005.py b/tests/background_callback/test_basic_long_callback005.py index 5dabf2c14a..7b3dbd7630 100644 --- a/tests/background_callback/test_basic_long_callback005.py +++ b/tests/background_callback/test_basic_long_callback005.py @@ -1,4 +1,3 @@ -import sys from multiprocessing import Lock import pytest @@ -6,9 +5,6 @@ from tests.background_callback.utils import setup_background_callback_app -@pytest.mark.skipif( - sys.version_info < (3, 7), reason="Python 3.6 long callbacks tests hangs up" -) @pytest.mark.skip(reason="Timeout often") def test_lcbc005_long_callback_caching(dash_duo, manager): lock = Lock() diff --git a/tests/background_callback/test_basic_long_callback006.py b/tests/background_callback/test_basic_long_callback006.py index 24121d4e3e..e500af1111 100644 --- a/tests/background_callback/test_basic_long_callback006.py +++ b/tests/background_callback/test_basic_long_callback006.py @@ -1,15 +1,10 @@ -import sys from multiprocessing import Lock -import pytest from flaky import flaky from tests.background_callback.utils import setup_background_callback_app -@pytest.mark.skipif( - sys.version_info < (3, 7), reason="Python 3.6 long callbacks tests hangs up" -) @flaky(max_runs=3) def test_lcbc006_long_callback_caching_multi(dash_duo, manager): lock = Lock() diff --git a/tests/background_callback/test_basic_long_callback007.py b/tests/background_callback/test_basic_long_callback007.py index 93bbaa2eec..ace823366e 100644 --- a/tests/background_callback/test_basic_long_callback007.py +++ b/tests/background_callback/test_basic_long_callback007.py @@ -1,14 +1,8 @@ -import sys - -import pytest from flaky import flaky from tests.background_callback.utils import setup_background_callback_app -@pytest.mark.skipif( - sys.version_info < (3, 7), reason="Python 3.6 long callbacks tests hangs up" -) @flaky(max_runs=3) def test_lcbc007_validation_layout(dash_duo, manager): with setup_background_callback_app(manager, "app7") as app: diff --git a/tests/background_callback/test_basic_long_callback008.py b/tests/background_callback/test_basic_long_callback008.py index dcd70420f8..ad22833830 100644 --- a/tests/background_callback/test_basic_long_callback008.py +++ b/tests/background_callback/test_basic_long_callback008.py @@ -1,13 +1,6 @@ -import sys - -import pytest - from tests.background_callback.utils import setup_background_callback_app -@pytest.mark.skipif( - sys.version_info < (3, 7), reason="Python 3.6 long callbacks tests hangs up" -) def test_lcbc008_long_callbacks_error(dash_duo, manager): with setup_background_callback_app(manager, "app_error") as app: dash_duo.start_server( diff --git a/tests/background_callback/test_basic_long_callback009.py b/tests/background_callback/test_basic_long_callback009.py index a78e82a203..7fdef57468 100644 --- a/tests/background_callback/test_basic_long_callback009.py +++ b/tests/background_callback/test_basic_long_callback009.py @@ -1,14 +1,9 @@ -import sys import time -import pytest from tests.background_callback.utils import setup_background_callback_app -@pytest.mark.skipif( - sys.version_info < (3, 7), reason="Python 3.6 long callbacks tests hangs up" -) def test_lcbc009_short_interval(dash_duo, manager): with setup_background_callback_app(manager, "app_short_interval") as app: dash_duo.start_server(app) diff --git a/tests/background_callback/test_basic_long_callback010.py b/tests/background_callback/test_basic_long_callback010.py index ff51221a8b..80e94137f2 100644 --- a/tests/background_callback/test_basic_long_callback010.py +++ b/tests/background_callback/test_basic_long_callback010.py @@ -1,13 +1,6 @@ -import sys - -import pytest - from tests.background_callback.utils import setup_background_callback_app -@pytest.mark.skipif( - sys.version_info < (3, 7), reason="Python 3.6 long callbacks tests hangs up" -) def test_lcbc010_side_updates(dash_duo, manager): with setup_background_callback_app(manager, "app_side_update") as app: dash_duo.start_server(app) diff --git a/tests/background_callback/test_basic_long_callback011.py b/tests/background_callback/test_basic_long_callback011.py index 54b7a3a1f8..29975e4e07 100644 --- a/tests/background_callback/test_basic_long_callback011.py +++ b/tests/background_callback/test_basic_long_callback011.py @@ -1,13 +1,6 @@ -import sys - -import pytest - from tests.background_callback.utils import setup_background_callback_app -@pytest.mark.skipif( - sys.version_info < (3, 7), reason="Python 3.6 long callbacks tests hangs up" -) def test_lcbc011_long_pattern_matching(dash_duo, manager): with setup_background_callback_app(manager, "app_pattern_matching") as app: dash_duo.start_server(app) diff --git a/tests/background_callback/test_basic_long_callback012.py b/tests/background_callback/test_basic_long_callback012.py index acde983d5f..5e15302df7 100644 --- a/tests/background_callback/test_basic_long_callback012.py +++ b/tests/background_callback/test_basic_long_callback012.py @@ -1,14 +1,9 @@ import json -import sys -import pytest from tests.background_callback.utils import setup_background_callback_app -@pytest.mark.skipif( - sys.version_info < (3, 7), reason="Python 3.6 long callbacks tests hangs up" -) def test_lcbc012_long_callback_ctx(dash_duo, manager): with setup_background_callback_app(manager, "app_callback_ctx") as app: dash_duo.start_server(app) diff --git a/tests/background_callback/test_basic_long_callback013.py b/tests/background_callback/test_basic_long_callback013.py index e3f2715286..2fc36b8971 100644 --- a/tests/background_callback/test_basic_long_callback013.py +++ b/tests/background_callback/test_basic_long_callback013.py @@ -1,13 +1,6 @@ -import sys - -import pytest - from tests.background_callback.utils import setup_background_callback_app -@pytest.mark.skipif( - sys.version_info < (3, 7), reason="Python 3.6 long callbacks tests hangs up" -) def test_lcbc013_unordered_state_input(dash_duo, manager): with setup_background_callback_app(manager, "app_unordered") as app: dash_duo.start_server(app) diff --git a/tests/background_callback/test_basic_long_callback014.py b/tests/background_callback/test_basic_long_callback014.py index 927cbe4373..52e602854b 100644 --- a/tests/background_callback/test_basic_long_callback014.py +++ b/tests/background_callback/test_basic_long_callback014.py @@ -1,13 +1,6 @@ -import sys - -import pytest - from tests.background_callback.utils import setup_background_callback_app -@pytest.mark.skipif( - sys.version_info < (3, 7), reason="Python 3.6 long callbacks tests hangs up" -) def test_lcbc014_progress_delete(dash_duo, manager): with setup_background_callback_app(manager, "app_progress_delete") as app: dash_duo.start_server(app) diff --git a/tests/background_callback/test_basic_long_callback015.py b/tests/background_callback/test_basic_long_callback015.py index a4e3cae426..cd0c57531e 100644 --- a/tests/background_callback/test_basic_long_callback015.py +++ b/tests/background_callback/test_basic_long_callback015.py @@ -1,13 +1,6 @@ -import sys - -import pytest - from tests.background_callback.utils import setup_background_callback_app -@pytest.mark.skipif( - sys.version_info < (3, 7), reason="Python 3.6 long callbacks tests hangs up" -) def test_lcbc015_diff_outputs_same_func(dash_duo, manager): with setup_background_callback_app(manager, "app_diff_outputs") as app: dash_duo.start_server(app) diff --git a/tests/background_callback/test_basic_long_callback016.py b/tests/background_callback/test_basic_long_callback016.py index 952a74dae3..be4ab6309f 100644 --- a/tests/background_callback/test_basic_long_callback016.py +++ b/tests/background_callback/test_basic_long_callback016.py @@ -1,14 +1,8 @@ -import sys - -import pytest from flaky import flaky from tests.background_callback.utils import setup_background_callback_app -@pytest.mark.skipif( - sys.version_info < (3, 9), reason="Python 3.8 long callbacks tests hangs up" -) @flaky(max_runs=3) def test_lcbc016_multi_page_cancel(dash_duo, manager): with setup_background_callback_app(manager, "app_page_cancel") as app: diff --git a/tests/unit/test_app_runners.py b/tests/unit/test_app_runners.py index 76cf4e0ac2..841603f505 100644 --- a/tests/unit/test_app_runners.py +++ b/tests/unit/test_app_runners.py @@ -1,5 +1,4 @@ import os -import sys import time from types import SimpleNamespace from unittest.mock import Mock @@ -58,9 +57,6 @@ def run(**options): runner.stop() -@pytest.mark.skipif( - sys.version_info < (3,), reason="requires python3 for process testing" -) def test_process_server_smoke(dash_process_server): cwd = os.getcwd() this_dir = os.path.dirname(__file__) From c001bb19dbd2a4969beff8c83ce7f20c09994966 Mon Sep 17 00:00:00 2001 From: 0d00ciallo0721 <259874237+0d00ciallo0721@users.noreply.github.com> Date: Wed, 7 Oct 2026 00:23:20 +0800 Subject: [PATCH 02/20] fix(renderer): clear child paths when callback returns None --- .../src/observers/executedCallbacks.ts | 2 +- .../callbacks/test_children_none.py | 50 +++++++++++++++++++ 2 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 tests/integration/callbacks/test_children_none.py diff --git a/dash/dash-renderer/src/observers/executedCallbacks.ts b/dash/dash-renderer/src/observers/executedCallbacks.ts index 11fdcd023c..32514f67ba 100644 --- a/dash/dash-renderer/src/observers/executedCallbacks.ts +++ b/dash/dash-renderer/src/observers/executedCallbacks.ts @@ -321,7 +321,7 @@ const observer: IStoreObserverDefinition = { childrenPropPath, appliedProps ); - if (!children) { + if (children === undefined) { return; } diff --git a/tests/integration/callbacks/test_children_none.py b/tests/integration/callbacks/test_children_none.py new file mode 100644 index 0000000000..6e00c8c47c --- /dev/null +++ b/tests/integration/callbacks/test_children_none.py @@ -0,0 +1,50 @@ +import time + +from dash import Dash, Input, Output, dcc, html +from dash.testing.wait import until + + +def test_callback_returning_none_removes_child_paths_and_can_remount(dash_duo): + view_calls = [] + + app = Dash(__name__, suppress_callback_exceptions=True) + app.layout = html.Div( + [ + html.Button("Toggle", id="toggle"), + dcc.Interval(id="tick", interval=200), + html.Div(id="container"), + ] + ) + + @app.callback( + Output("container", "children"), + Input("toggle", "n_clicks"), + prevent_initial_call=True, + ) + def toggle_view(n_clicks): + if n_clicks % 2: + return html.Div(html.Span(id="view-child"), id="view") + return None + + @app.callback(Output("view-child", "children"), Input("tick", "n_intervals")) + def update_view(n_intervals): + view_calls.append(n_intervals) + return f"tick {n_intervals}" + + dash_duo.start_server(app) + + dash_duo.find_element("#toggle").click() + dash_duo.wait_for_element("#view-child") + until(lambda: "view-child" in dash_duo.redux_state_paths["strs"], timeout=3) + until(lambda: view_calls, timeout=3) + + dash_duo.find_element("#toggle").click() + dash_duo.wait_for_no_elements("#view-child") + until(lambda: "view-child" not in dash_duo.redux_state_paths["strs"], timeout=3) + calls_after_unmount = len(view_calls) + time.sleep(0.5) + assert len(view_calls) == calls_after_unmount + + dash_duo.find_element("#toggle").click() + dash_duo.wait_for_element("#view-child") + until(lambda: "view-child" in dash_duo.redux_state_paths["strs"], timeout=3) From b2eb098fbad0d03bc267d4adc19b3bf3e38926bf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 15 Oct 2026 18:06:40 +0000 Subject: [PATCH 03/20] Bump the npm-dependencies group across 1 directory with 2 updates Bumps the npm-dependencies group with 2 updates in the /components/dash-html-components directory: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) and [webpack-sources](https://github.com/webpack/webpack-sources). Updates `@types/node` from 26.6.2 to 26.6.5 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) Updates `webpack-sources` from 3.5.1 to 3.6.0 - [Release notes](https://github.com/webpack/webpack-sources/releases) - [Changelog](https://github.com/webpack/webpack-sources/blob/main/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack-sources/compare/v3.5.1...v3.6.0) --- updated-dependencies: - dependency-name: "@types/node" dependency-version: 26.6.5 dependency-type: indirect update-type: version-update:semver-patch dependency-group: npm-dependencies - dependency-name: webpack-sources dependency-version: 3.6.0 dependency-type: indirect update-type: version-update:semver-minor dependency-group: npm-dependencies ... Signed-off-by: dependabot[bot] --- .../dash-html-components/package-lock.json | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/components/dash-html-components/package-lock.json b/components/dash-html-components/package-lock.json index d70fac868d..67b6360b6f 100644 --- a/components/dash-html-components/package-lock.json +++ b/components/dash-html-components/package-lock.json @@ -2058,9 +2058,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-26.6.2.tgz", - "integrity": "sha512-X1P21scMv4zGKLYqjdGjaKa7COa0RKVYYZZN/NfvLQ1JegxFhdhpZG/Lyn8AXx6CDUavKAd11v6BvfpkDByK8g==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.6.3.tgz", + "integrity": "sha512-dsqMQQoeTLqu9wynDD00q573mNzso3IdQOAfHRJqLCcmCFPoGo9A1bDpUcv/9tnKpErQWv9uKeGfl37EIS02Yg==", "dev": true, "license": "MIT", "dependencies": { @@ -8163,9 +8163,9 @@ } }, "node_modules/webpack-sources": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.5.1.tgz", - "integrity": "sha512-jyuiGJdtvY434z5bUZrjz67v76/ePNvFZTp9Mdz29IlH4+GPsgyGjiv0fKI+M7BdkU6ADjulUcKAd3tUK3WlEw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.6.0.tgz", + "integrity": "sha512-EIMmPVvNI0CYXyRPp34F2Qk7W37/BZVZIofS6LAUnrNjCVahS+hO4mxwFJDjQjODTGZDtVzLYoN2+1dYkhk9qA==", "dev": true, "license": "MIT", "engines": { @@ -9680,9 +9680,9 @@ "dev": true }, "@types/node": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-26.6.2.tgz", - "integrity": "sha512-X1P21scMv4zGKLYqjdGjaKa7COa0RKVYYZZN/NfvLQ1JegxFhdhpZG/Lyn8AXx6CDUavKAd11v6BvfpkDByK8g==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.6.3.tgz", + "integrity": "sha512-dsqMQQoeTLqu9wynDD00q573mNzso3IdQOAfHRJqLCcmCFPoGo9A1bDpUcv/9tnKpErQWv9uKeGfl37EIS02Yg==", "dev": true, "requires": { "undici-types": "~8.9.0" @@ -13754,9 +13754,9 @@ } }, "webpack-sources": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.5.1.tgz", - "integrity": "sha512-jyuiGJdtvY434z5bUZrjz67v76/ePNvFZTp9Mdz29IlH4+GPsgyGjiv0fKI+M7BdkU6ADjulUcKAd3tUK3WlEw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.6.0.tgz", + "integrity": "sha512-EIMmPVvNI0CYXyRPp34F2Qk7W37/BZVZIofS6LAUnrNjCVahS+hO4mxwFJDjQjODTGZDtVzLYoN2+1dYkhk9qA==", "dev": true }, "which": { From a1ce682905a59fb9b5815af89f3a46e0c49bcd6f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 15 Oct 2026 18:07:51 +0000 Subject: [PATCH 04/20] Bump the npm-dependencies group across 1 directory with 3 updates Bumps the npm-dependencies group with 3 updates in the /dash/dash-renderer directory: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node), [@types/ws](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/ws) and [webpack-sources](https://github.com/webpack/webpack-sources). Updates `@types/node` from 26.6.2 to 26.6.5 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) Updates `@types/ws` from 8.18.1 to 8.18.2 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/ws) Updates `webpack-sources` from 3.5.1 to 3.6.0 - [Release notes](https://github.com/webpack/webpack-sources/releases) - [Changelog](https://github.com/webpack/webpack-sources/blob/main/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack-sources/compare/v3.5.1...v3.6.0) --- updated-dependencies: - dependency-name: "@types/node" dependency-version: 26.6.5 dependency-type: indirect update-type: version-update:semver-patch dependency-group: npm-dependencies - dependency-name: "@types/ws" dependency-version: 8.18.2 dependency-type: indirect update-type: version-update:semver-patch dependency-group: npm-dependencies - dependency-name: webpack-sources dependency-version: 3.6.0 dependency-type: indirect update-type: version-update:semver-minor dependency-group: npm-dependencies ... Signed-off-by: dependabot[bot] --- dash/dash-renderer/package-lock.json | 36 ++++++++++++++-------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/dash/dash-renderer/package-lock.json b/dash/dash-renderer/package-lock.json index 318127c163..db837bdf0c 100644 --- a/dash/dash-renderer/package-lock.json +++ b/dash/dash-renderer/package-lock.json @@ -2663,9 +2663,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-26.6.2.tgz", - "integrity": "sha512-X1P21scMv4zGKLYqjdGjaKa7COa0RKVYYZZN/NfvLQ1JegxFhdhpZG/Lyn8AXx6CDUavKAd11v6BvfpkDByK8g==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.6.3.tgz", + "integrity": "sha512-dsqMQQoeTLqu9wynDD00q573mNzso3IdQOAfHRJqLCcmCFPoGo9A1bDpUcv/9tnKpErQWv9uKeGfl37EIS02Yg==", "dev": true, "license": "MIT", "dependencies": { @@ -2742,9 +2742,9 @@ "license": "MIT" }, "node_modules/@types/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "version": "8.18.2", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.2.tgz", + "integrity": "sha512-67MQl+fpWKVTT1NYdnmo3U4sc/xPo/zQBncVnI74qmQa0z/b+1g6iYqNmGCPbxO+zz2aklb08a0oHfegiVd0/w==", "dev": true, "license": "MIT", "dependencies": { @@ -12151,9 +12151,9 @@ } }, "node_modules/webpack-sources": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.5.1.tgz", - "integrity": "sha512-jyuiGJdtvY434z5bUZrjz67v76/ePNvFZTp9Mdz29IlH4+GPsgyGjiv0fKI+M7BdkU6ADjulUcKAd3tUK3WlEw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.6.0.tgz", + "integrity": "sha512-EIMmPVvNI0CYXyRPp34F2Qk7W37/BZVZIofS6LAUnrNjCVahS+hO4mxwFJDjQjODTGZDtVzLYoN2+1dYkhk9qA==", "dev": true, "license": "MIT", "engines": { @@ -14169,9 +14169,9 @@ "dev": true }, "@types/node": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-26.6.2.tgz", - "integrity": "sha512-X1P21scMv4zGKLYqjdGjaKa7COa0RKVYYZZN/NfvLQ1JegxFhdhpZG/Lyn8AXx6CDUavKAd11v6BvfpkDByK8g==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.6.3.tgz", + "integrity": "sha512-dsqMQQoeTLqu9wynDD00q573mNzso3IdQOAfHRJqLCcmCFPoGo9A1bDpUcv/9tnKpErQWv9uKeGfl37EIS02Yg==", "dev": true, "requires": { "undici-types": "~8.9.0" @@ -14238,9 +14238,9 @@ "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==" }, "@types/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "version": "8.18.2", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.2.tgz", + "integrity": "sha512-67MQl+fpWKVTT1NYdnmo3U4sc/xPo/zQBncVnI74qmQa0z/b+1g6iYqNmGCPbxO+zz2aklb08a0oHfegiVd0/w==", "dev": true, "requires": { "@types/node": "*" @@ -20577,9 +20577,9 @@ } }, "webpack-sources": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.5.1.tgz", - "integrity": "sha512-jyuiGJdtvY434z5bUZrjz67v76/ePNvFZTp9Mdz29IlH4+GPsgyGjiv0fKI+M7BdkU6ADjulUcKAd3tUK3WlEw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.6.0.tgz", + "integrity": "sha512-EIMmPVvNI0CYXyRPp34F2Qk7W37/BZVZIofS6LAUnrNjCVahS+hO4mxwFJDjQjODTGZDtVzLYoN2+1dYkhk9qA==", "dev": true }, "whatwg-fetch": { From 6e3e448960eba655ba717f9b4eb459d78427d257 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 15 Oct 2026 18:08:45 +0000 Subject: [PATCH 05/20] Bump the npm-dependencies group across 1 directory with 2 updates Bumps the npm-dependencies group with 2 updates in the /components/dash-core-components directory: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) and [webpack-sources](https://github.com/webpack/webpack-sources). Updates `@types/node` from 26.6.2 to 26.6.5 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) Updates `webpack-sources` from 3.5.1 to 3.6.0 - [Release notes](https://github.com/webpack/webpack-sources/releases) - [Changelog](https://github.com/webpack/webpack-sources/blob/main/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack-sources/compare/v3.5.1...v3.6.0) --- updated-dependencies: - dependency-name: "@types/node" dependency-version: 26.6.5 dependency-type: indirect update-type: version-update:semver-patch dependency-group: npm-dependencies - dependency-name: webpack-sources dependency-version: 3.6.0 dependency-type: indirect update-type: version-update:semver-minor dependency-group: npm-dependencies ... Signed-off-by: dependabot[bot] --- .../dash-core-components/package-lock.json | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/components/dash-core-components/package-lock.json b/components/dash-core-components/package-lock.json index 780f2c3172..7694840eb7 100644 --- a/components/dash-core-components/package-lock.json +++ b/components/dash-core-components/package-lock.json @@ -4285,9 +4285,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-26.6.2.tgz", - "integrity": "sha512-X1P21scMv4zGKLYqjdGjaKa7COa0RKVYYZZN/NfvLQ1JegxFhdhpZG/Lyn8AXx6CDUavKAd11v6BvfpkDByK8g==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.6.3.tgz", + "integrity": "sha512-dsqMQQoeTLqu9wynDD00q573mNzso3IdQOAfHRJqLCcmCFPoGo9A1bDpUcv/9tnKpErQWv9uKeGfl37EIS02Yg==", "dev": true, "license": "MIT", "dependencies": { @@ -16322,9 +16322,9 @@ } }, "node_modules/webpack-sources": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.5.1.tgz", - "integrity": "sha512-jyuiGJdtvY434z5bUZrjz67v76/ePNvFZTp9Mdz29IlH4+GPsgyGjiv0fKI+M7BdkU6ADjulUcKAd3tUK3WlEw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.6.0.tgz", + "integrity": "sha512-EIMmPVvNI0CYXyRPp34F2Qk7W37/BZVZIofS6LAUnrNjCVahS+hO4mxwFJDjQjODTGZDtVzLYoN2+1dYkhk9qA==", "dev": true, "license": "MIT", "engines": { @@ -19301,9 +19301,9 @@ "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==" }, "@types/node": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-26.6.2.tgz", - "integrity": "sha512-X1P21scMv4zGKLYqjdGjaKa7COa0RKVYYZZN/NfvLQ1JegxFhdhpZG/Lyn8AXx6CDUavKAd11v6BvfpkDByK8g==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.6.3.tgz", + "integrity": "sha512-dsqMQQoeTLqu9wynDD00q573mNzso3IdQOAfHRJqLCcmCFPoGo9A1bDpUcv/9tnKpErQWv9uKeGfl37EIS02Yg==", "dev": true, "requires": { "undici-types": "~8.9.0" @@ -27305,9 +27305,9 @@ } }, "webpack-sources": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.5.1.tgz", - "integrity": "sha512-jyuiGJdtvY434z5bUZrjz67v76/ePNvFZTp9Mdz29IlH4+GPsgyGjiv0fKI+M7BdkU6ADjulUcKAd3tUK3WlEw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.6.0.tgz", + "integrity": "sha512-EIMmPVvNI0CYXyRPp34F2Qk7W37/BZVZIofS6LAUnrNjCVahS+hO4mxwFJDjQjODTGZDtVzLYoN2+1dYkhk9qA==", "dev": true }, "whatwg-encoding": { From d9682564bcc35aa04580f32abbc54262c61bed88 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 19 Oct 2026 16:48:08 +0000 Subject: [PATCH 06/20] Bump the npm-dependencies-security group across 2 directories with 4 updates Bumps the npm-dependencies-security group with 3 updates in the /@plotly/dash-jupyterlab directory: [fast-uri](https://github.com/fastify/fast-uri), [lodash-es](https://github.com/lodash/lodash) and [minimist](https://github.com/minimistjs/minimist). Bumps the npm-dependencies-security group with 1 update in the /@plotly/eslint-config-dash directory: [@babel/traverse](https://github.com/babel/babel/tree/HEAD/packages/babel-traverse). Updates `fast-uri` from 3.1.7 to 3.1.8 - [Release notes](https://github.com/fastify/fast-uri/releases) - [Commits](https://github.com/fastify/fast-uri/compare/v3.1.7...v3.1.8) Updates `fast-uri` from 3.1.7 to 3.1.8 - [Release notes](https://github.com/fastify/fast-uri/releases) - [Commits](https://github.com/fastify/fast-uri/compare/v3.1.7...v3.1.8) Updates `lodash-es` from 4.17.23 to 4.18.1 - [Release notes](https://github.com/lodash/lodash/releases) - [Commits](https://github.com/lodash/lodash/compare/4.17.23...4.18.1) Updates `minimist` from 1.2.5 to 1.2.8 - [Changelog](https://github.com/minimistjs/minimist/blob/main/CHANGELOG.md) - [Commits](https://github.com/minimistjs/minimist/compare/v1.2.5...v1.2.8) Updates `minimist` from 1.2.5 to 1.2.8 - [Changelog](https://github.com/minimistjs/minimist/blob/main/CHANGELOG.md) - [Commits](https://github.com/minimistjs/minimist/compare/v1.2.5...v1.2.8) Updates `@babel/traverse` from 7.16.3 to 7.29.10 - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.29.10/packages/babel-traverse) Updates `@babel/traverse` from 7.16.3 to 7.29.10 - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.29.10/packages/babel-traverse) --- updated-dependencies: - dependency-name: "@babel/traverse" dependency-version: 7.29.10 dependency-type: indirect dependency-group: npm-dependencies-security - dependency-name: fast-uri dependency-version: 3.1.8 dependency-type: indirect dependency-group: npm-dependencies-security - dependency-name: lodash-es dependency-version: 4.18.1 dependency-type: indirect dependency-group: npm-dependencies-security - dependency-name: minimist dependency-version: 1.2.8 dependency-type: indirect dependency-group: npm-dependencies-security ... Signed-off-by: dependabot[bot] --- .../package-lock.json | 16 +- @plotly/dash-jupyterlab/yarn.lock | 19 +- @plotly/eslint-config-dash/package-lock.json | 579 +++++++----------- 3 files changed, 231 insertions(+), 383 deletions(-) diff --git a/@plotly/dash-generator-test-component-typescript/package-lock.json b/@plotly/dash-generator-test-component-typescript/package-lock.json index d93972836c..619c0f0b21 100644 --- a/@plotly/dash-generator-test-component-typescript/package-lock.json +++ b/@plotly/dash-generator-test-component-typescript/package-lock.json @@ -1716,16 +1716,16 @@ } }, "node_modules/@babel/traverse": { - "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", - "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", + "version": "7.29.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.10.tgz", + "integrity": "sha512-B3lYAs2nkKskbgQ1nfy8Ma9ao9Q1rntTAQHrzzyDuj+TSO+X3le6PfWwqDvodsb+OumE10eMFfuMCTQSQ5iuIQ==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.8", "@babel/helper-globals": "^7.29.7", - "@babel/parser": "^7.29.8", + "@babel/parser": "^7.29.9", "@babel/template": "^7.29.7", "@babel/types": "^7.29.8", "debug": "^4.3.1" @@ -9875,15 +9875,15 @@ } }, "@babel/traverse": { - "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", - "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", + "version": "7.29.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.10.tgz", + "integrity": "sha512-B3lYAs2nkKskbgQ1nfy8Ma9ao9Q1rntTAQHrzzyDuj+TSO+X3le6PfWwqDvodsb+OumE10eMFfuMCTQSQ5iuIQ==", "dev": true, "requires": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.8", "@babel/helper-globals": "^7.29.7", - "@babel/parser": "^7.29.8", + "@babel/parser": "^7.29.9", "@babel/template": "^7.29.7", "@babel/types": "^7.29.8", "debug": "^4.3.1" diff --git a/@plotly/dash-jupyterlab/yarn.lock b/@plotly/dash-jupyterlab/yarn.lock index 2ad9270908..c83479d7ce 100644 --- a/@plotly/dash-jupyterlab/yarn.lock +++ b/@plotly/dash-jupyterlab/yarn.lock @@ -1209,9 +1209,9 @@ fast-deep-equal@^3.1.3: integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-uri@^3.0.1: - version "3.1.7" - resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.1.7.tgz#743157d957f3cbb4c65310e033dc2ad4ad7dc60a" - integrity sha512-dOvZVzjdZdz7phd9v6jCbwxrBW3fK6n8Rc0CtdmM4bumzMnxywBYhuph6J819RRw/ku+rLbelwfMunktuzVVHg== + version "3.1.8" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.1.8.tgz#f7db8d942e20eead3cfe93b0beeb4eb0169e938b" + integrity sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg== free-style@3.1.0: version "3.1.0" @@ -1312,9 +1312,9 @@ lib0@^0.2.85, lib0@^0.2.98: isomorphic.js "^0.2.4" lodash-es@^4.17.21: - version "4.17.23" - resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.23.tgz#58c4360fd1b5d33afc6c0bbd3d1149349b1138e0" - integrity sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg== + version "4.18.1" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.18.1.tgz#b962eeb80d9d983a900bf342961fb7418ca10b1d" + integrity sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A== lodash.escape@^4.0.1: version "4.0.1" @@ -1350,16 +1350,11 @@ minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" -minimist@^1.2.6: +minimist@^1.2.6, minimist@~1.2.0: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -minimist@~1.2.0: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== - mkdirp@^0.5.1: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" diff --git a/@plotly/eslint-config-dash/package-lock.json b/@plotly/eslint-config-dash/package-lock.json index c34836a1d7..e1f998943f 100644 --- a/@plotly/eslint-config-dash/package-lock.json +++ b/@plotly/eslint-config-dash/package-lock.json @@ -26,109 +26,76 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", - "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.16.0" + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/generator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.0.tgz", - "integrity": "sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz", - "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==", - "dev": true, - "dependencies": { - "@babel/helper-get-function-arity": "^7.16.0", - "@babel/template": "^7.16.0", - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-get-function-arity": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz", - "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.16.0" + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz", - "integrity": "sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==", + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", "dev": true, - "dependencies": { - "@babel/types": "^7.16.0" - }, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz", - "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==", + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", "dev": true, - "dependencies": { - "@babel/types": "^7.16.0" - }, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", - "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", + "node_modules/@babel/parser": { + "version": "7.29.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.9.tgz", + "integrity": "sha512-CjXrNHTnvqBVqHgdBysY3vk2T8tpJHb5/RMeHJBTyVa9xgugCB0CJTx/3oO8RV2QRQP391RWpB7D6hLjm8V9uA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.15.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "@babel/types": "^7.29.8" }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.4.tgz", - "integrity": "sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng==", - "dev": true, "bin": { "parser": "bin/babel-parser.js" }, @@ -137,47 +104,48 @@ } }, "node_modules/@babel/template": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", - "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.16.0", - "@babel/parser": "^7.16.0", - "@babel/types": "^7.16.0" + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.3.tgz", - "integrity": "sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag==", + "version": "7.29.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.10.tgz", + "integrity": "sha512-B3lYAs2nkKskbgQ1nfy8Ma9ao9Q1rntTAQHrzzyDuj+TSO+X3le6PfWwqDvodsb+OumE10eMFfuMCTQSQ5iuIQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.16.0", - "@babel/generator": "^7.16.0", - "@babel/helper-function-name": "^7.16.0", - "@babel/helper-hoist-variables": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/parser": "^7.16.3", - "@babel/types": "^7.16.0", - "debug": "^4.1.0", - "globals": "^11.1.0" + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.8", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.9", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.8", + "debug": "^4.3.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", - "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.15.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -254,6 +222,45 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -342,18 +349,6 @@ "node": ">=8" } }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -474,35 +469,6 @@ "node": ">=6" } }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -638,15 +604,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/eslint": { "version": "8.26.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.26.0.tgz", @@ -1337,15 +1294,6 @@ "node": ">=10.13.0" } }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/grapheme-splitter": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", @@ -1373,15 +1321,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/has-property-descriptors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", @@ -1721,15 +1660,16 @@ } }, "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, + "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/json-schema-traverse": { @@ -1827,10 +1767,14 @@ } }, "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/ms": { "version": "2.1.2", @@ -2054,6 +1998,13 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -2276,15 +2227,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/string.prototype.matchall": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", @@ -2365,18 +2307,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -2395,15 +2325,6 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/tsconfig-paths": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", @@ -2525,122 +2446,90 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", - "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", "dev": true, "requires": { - "@babel/highlight": "^7.16.0" + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" } }, "@babel/generator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.0.tgz", - "integrity": "sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz", - "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.16.0", - "@babel/template": "^7.16.0", - "@babel/types": "^7.16.0" + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" } }, - "@babel/helper-get-function-arity": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz", - "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz", - "integrity": "sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } + "@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true }, - "@babel/helper-split-export-declaration": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz", - "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } + "@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "dev": true }, "@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "dev": true }, - "@babel/highlight": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", - "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", + "@babel/parser": { + "version": "7.29.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.9.tgz", + "integrity": "sha512-CjXrNHTnvqBVqHgdBysY3vk2T8tpJHb5/RMeHJBTyVa9xgugCB0CJTx/3oO8RV2QRQP391RWpB7D6hLjm8V9uA==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.15.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "@babel/types": "^7.29.8" } }, - "@babel/parser": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.4.tgz", - "integrity": "sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng==", - "dev": true - }, "@babel/template": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", - "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "dev": true, "requires": { - "@babel/code-frame": "^7.16.0", - "@babel/parser": "^7.16.0", - "@babel/types": "^7.16.0" + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" } }, "@babel/traverse": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.3.tgz", - "integrity": "sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag==", + "version": "7.29.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.10.tgz", + "integrity": "sha512-B3lYAs2nkKskbgQ1nfy8Ma9ao9Q1rntTAQHrzzyDuj+TSO+X3le6PfWwqDvodsb+OumE10eMFfuMCTQSQ5iuIQ==", "dev": true, "requires": { - "@babel/code-frame": "^7.16.0", - "@babel/generator": "^7.16.0", - "@babel/helper-function-name": "^7.16.0", - "@babel/helper-hoist-variables": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/parser": "^7.16.3", - "@babel/types": "^7.16.0", - "debug": "^4.1.0", - "globals": "^11.1.0" + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.8", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.9", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.8", + "debug": "^4.3.1" } }, "@babel/types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", - "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.15.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" } }, "@eslint/eslintrc": { @@ -2694,6 +2583,38 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "requires": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -2756,15 +2677,6 @@ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -2853,32 +2765,6 @@ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -2982,12 +2868,6 @@ "is-symbol": "^1.0.2" } }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, "eslint": { "version": "8.26.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.26.0.tgz", @@ -3511,12 +3391,6 @@ "is-glob": "^4.0.3" } }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, "grapheme-splitter": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", @@ -3538,12 +3412,6 @@ "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, "has-property-descriptors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", @@ -3770,9 +3638,9 @@ } }, "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true }, "json-schema-traverse": { @@ -3851,9 +3719,9 @@ } }, "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true }, "ms": { @@ -4021,6 +3889,12 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true + }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -4157,12 +4031,6 @@ "object-inspect": "^1.9.0" } }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, "string.prototype.matchall": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", @@ -4222,15 +4090,6 @@ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, "supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -4243,12 +4102,6 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - }, "tsconfig-paths": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", From 07a67d7c8e3c450d90f5956995307fd5d7f7b6c7 Mon Sep 17 00:00:00 2001 From: philippe Date: Tue, 20 Oct 2026 11:53:55 -0400 Subject: [PATCH 07/20] Bump numpy cap in CI requirements to 2.5.4 numpy<=2.2.6 kept CI on a numpy that has no Python 3.14 wheels and never tested the numpy 2.5 that users get on 3.13/3.14. Python 3.9 jobs still resolve to numpy 2.0.2. --- requirements/ci.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/ci.txt b/requirements/ci.txt index 277310fd4b..4ea6288186 100644 --- a/requirements/ci.txt +++ b/requirements/ci.txt @@ -8,7 +8,7 @@ ipython<9.0.0 mimesis<=11.1.0; python_version < "3.10" mimesis<=21.0.0; python_version >= "3.10" mock==5.2.0 -numpy<=2.2.6 +numpy<=2.5.4 orjson>=3.10.11 openpyxl pandas>=1.4.0 From 227d09b588ab45c5579047b1779315838c532859 Mon Sep 17 00:00:00 2001 From: philippe Date: Tue, 20 Oct 2026 11:59:12 -0400 Subject: [PATCH 08/20] Move plotly-cloud back to the optional cloud extra plotly-cloud is not on conda-forge, so as a hard dependency the dash conda-forge package can't be built for 4.5.0. It stays installable with dash[cloud], and Dash already handles it being absent. Reverts #3947. --- CHANGELOG.md | 1 - dash/_plotly_cli.py | 3 +-- requirements/install.txt | 1 - .../devtools/test_callback_validation.py | 2 +- tests/unit/test_plotly_cli.py | 24 +++++++++++++++++++ 5 files changed, 26 insertions(+), 5 deletions(-) create mode 100644 tests/unit/test_plotly_cli.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 1ed4634415..ec2d3eba34 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,6 @@ This project adheres to [Semantic Versioning](https://semver.org/). - [#4026](https://github.com/plotly/dash/pull/4026) Add `DASH_SHARED_STORAGE` to pick the shared-storage backend when the app does not pass `shared_storage=`: `local`, `none`, `diskcache:///abs/path`, or a `redis://` / `rediss://` URL. - [#4024](https://github.com/plotly/dash/pull/4024) Add support for social media meta tags in regular Dash apps using `app.title`, `app.description`, and `app.image`. - [#3976](https://github.com/plotly/dash/pull/3976) Add a new `scrollToTop` prop to `dcc.Link` to control whether the page scrolls to the top after client-side navigation. It defaults to `True` to preserve the existing behavior. Fixes [#3974](https://github.com/plotly/dash/issues/3974). -- [#3947](https://github.com/plotly/dash/pull/3947) Make `plotly-cloud` a default install dependency of Dash instead of an optional extra, so the `plotly` CLI and Dash's cloud integration work out of the box. The `dash[cloud]` extra is kept for backward compatibility. - [#3930](https://github.com/plotly/dash/pull/3930) Add shared storage: a backend-agnostic cross-process state manager (key/value with optional TTL, plus ordered replayable pub/sub) on every app via `dash.ctx.shared_storage`, started lazily and disabled with `shared_storage=None`. Ships `LocalSharedStorage` (default, in-memory with optional disk persistence), `DiskcacheSharedStorage`, and `RedisSharedStorage` for horizontally-scaled deployments; see `.ai/ARCHITECTURE.md`. - [#3931](https://github.com/plotly/dash/pull/3931) Add streaming callbacks: an `async def` generator callback streams its yields to the browser as they are produced (`dash.Patch` yields apply incrementally). A browser's streams share one SharedWorker-hosted connection so they do not count against the per-host connection limit; closing a tab cancels its streams. - [#3977](https://github.com/plotly/dash/pull/3977) Add partial WebSocket prop reads with `get_prop(..., path=...)`. Closes [#3975](https://github.com/plotly/dash/issues/3975). diff --git a/dash/_plotly_cli.py b/dash/_plotly_cli.py index 4456962746..9974cd23b9 100644 --- a/dash/_plotly_cli.py +++ b/dash/_plotly_cli.py @@ -9,8 +9,7 @@ def cli(): except ImportError: print( "Plotly cloud is not installed," - " install it with `pip install plotly-cloud` (or reinstall dash)" - " to use the plotly command", + " install it with `pip install dash[cloud]` to use the plotly command", file=sys.stderr, ) sys.exit(-1) diff --git a/requirements/install.txt b/requirements/install.txt index 71e0dafb32..795f0c85c8 100644 --- a/requirements/install.txt +++ b/requirements/install.txt @@ -1,7 +1,6 @@ Flask>=1.0.4,<3.2 Werkzeug<3.2 plotly>=5.0.0 -plotly-cloud importlib-metadata typing_extensions>=4.1.1 requests diff --git a/tests/integration/devtools/test_callback_validation.py b/tests/integration/devtools/test_callback_validation.py index e4f89432d5..33a5ad485d 100644 --- a/tests/integration/devtools/test_callback_validation.py +++ b/tests/integration/devtools/test_callback_validation.py @@ -33,7 +33,7 @@ def check_errors(dash_duo, specs): found = [] for i in range(cnt): msg = dash_duo.find_elements(".dash-fe-error__title")[i].text - # plotly-cloud (a default install dep) injects a `_plotly-cloud-*` + # plotly-cloud (installed with dash[cloud]) injects a `_plotly-cloud-*` # component into every layout via a dash_hooks entry point, so it # shows up in the "string ids in the current layout" list. Strip it # so these assertions hold whether or not plotly-cloud is installed. diff --git a/tests/unit/test_plotly_cli.py b/tests/unit/test_plotly_cli.py new file mode 100644 index 0000000000..9cbe34021e --- /dev/null +++ b/tests/unit/test_plotly_cli.py @@ -0,0 +1,24 @@ +import sys +from pathlib import Path + +import pytest + +from dash._plotly_cli import cli + + +def test_plotly_cli_hints_cloud_extra_when_missing(monkeypatch, capsys): + # A None entry in sys.modules makes the import raise ImportError. + monkeypatch.setitem(sys.modules, "plotly_cloud", None) + monkeypatch.setitem(sys.modules, "plotly_cloud.cli", None) + + with pytest.raises(SystemExit) as exc: + cli() + + assert exc.value.code == -1 + assert "pip install dash[cloud]" in capsys.readouterr().err + + +def test_plotly_cloud_is_not_an_install_requirement(): + install = Path(__file__).parents[2] / "requirements" / "install.txt" + required = install.read_text(encoding="utf-8").lower().split() + assert "plotly-cloud" not in required From 970c4fdeafd48096529fb4018de875fec8841b4c Mon Sep 17 00:00:00 2001 From: philippe Date: Tue, 20 Oct 2026 12:11:36 -0400 Subject: [PATCH 09/20] Keep the #3947 CHANGELOG entry and note the move back to dash[cloud] --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ec2d3eba34..5f53980dee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ This project adheres to [Semantic Versioning](https://semver.org/). - [#4026](https://github.com/plotly/dash/pull/4026) Add `DASH_SHARED_STORAGE` to pick the shared-storage backend when the app does not pass `shared_storage=`: `local`, `none`, `diskcache:///abs/path`, or a `redis://` / `rediss://` URL. - [#4024](https://github.com/plotly/dash/pull/4024) Add support for social media meta tags in regular Dash apps using `app.title`, `app.description`, and `app.image`. - [#3976](https://github.com/plotly/dash/pull/3976) Add a new `scrollToTop` prop to `dcc.Link` to control whether the page scrolls to the top after client-side navigation. It defaults to `True` to preserve the existing behavior. Fixes [#3974](https://github.com/plotly/dash/issues/3974). +- [#3947](https://github.com/plotly/dash/pull/3947) Make `plotly-cloud` a default install dependency of Dash instead of an optional extra, so the `plotly` CLI and Dash's cloud integration work out of the box. The `dash[cloud]` extra is kept for backward compatibility. - [#3930](https://github.com/plotly/dash/pull/3930) Add shared storage: a backend-agnostic cross-process state manager (key/value with optional TTL, plus ordered replayable pub/sub) on every app via `dash.ctx.shared_storage`, started lazily and disabled with `shared_storage=None`. Ships `LocalSharedStorage` (default, in-memory with optional disk persistence), `DiskcacheSharedStorage`, and `RedisSharedStorage` for horizontally-scaled deployments; see `.ai/ARCHITECTURE.md`. - [#3931](https://github.com/plotly/dash/pull/3931) Add streaming callbacks: an `async def` generator callback streams its yields to the browser as they are produced (`dash.Patch` yields apply incrementally). A browser's streams share one SharedWorker-hosted connection so they do not count against the per-host connection limit; closing a tab cancels its streams. - [#3977](https://github.com/plotly/dash/pull/3977) Add partial WebSocket prop reads with `get_prop(..., path=...)`. Closes [#3975](https://github.com/plotly/dash/issues/3975). @@ -23,6 +24,7 @@ This project adheres to [Semantic Versioning](https://semver.org/). - [#3646](https://github.com/plotly/dash/pull/3646) Remove React 16 support (`16.14.0` is no longer an accepted value for `REACT_VERSION` / `_set_react_version`). ### Changed +- [#4073](https://github.com/plotly/dash/pull/4073) Move `plotly-cloud` back to the optional `dash[cloud]` extra (it was a default dependency in 4.5.0rc0/rc1), since it is not available on conda-forge. - [#4026](https://github.com/plotly/dash/pull/4026) Log a warning, once per process, when a streaming request is refused because its stream token failed verification, which on multi-worker deployments usually means the workers do not share a signing secret. - [#3987](https://github.com/plotly/dash/pull/3987) Forward FastAPI reload scope options (`reload_dirs`, `reload_excludes`, and `reload_includes`) to Uvicorn when reloading. - [#3986](https://github.com/plotly/dash/pull/3986) Adjust `_run_before_hooks` in the `fastapi` backend to honor a response returned by a `before_request` function, matching the `flask` backend's behavior. From 7ce93b629071f526467e81be1d85221525da3275 Mon Sep 17 00:00:00 2001 From: philippe Date: Tue, 20 Oct 2026 12:37:52 -0400 Subject: [PATCH 10/20] Fix security findings reported against 4.5.0rc1 - fastapi: run before_request hooks on every route, when mounted and on the WebSocket handshake, and send a hook's returned response. - Background callbacks: key results per run when cache_by is unset and per callback always, so equal inputs never share another request's result. - dcc.Location(refresh=True).href and html.Area.href go through clean_url. - Pages path_template matching: no IndexError or regex backtracking on pathnames containing a newline. - MCP: build the callback adapter collection per request so values computed for one user are not served to another. --- .ai/ARCHITECTURE.md | 3 +- CHANGELOG.md | 5 + .../src/components/Location.react.js | 11 ++ .../scripts/generate-components.js | 3 +- dash/_callback.py | 1 + dash/_pages.py | 22 +-- dash/backends/_fastapi.py | 108 ++++++++++--- dash/background_callback/managers/__init__.py | 13 +- dash/dash.py | 15 +- dash/mcp/_server.py | 16 +- .../test_fastapi_before_request.py | 146 ++++++++++++++++++ .../mcp/test_mcp_request_isolation.py | 104 +++++++++++++ .../multi_page/test_pages_path_template.py | 64 ++++++++ .../security/test_background_isolation.py | 121 +++++++++++++++ tests/integration/security/test_xss.py | 54 ++++++- 15 files changed, 645 insertions(+), 41 deletions(-) create mode 100644 tests/backend_tests/test_fastapi_before_request.py create mode 100644 tests/integration/mcp/test_mcp_request_isolation.py create mode 100644 tests/integration/multi_page/test_pages_path_template.py create mode 100644 tests/integration/security/test_background_isolation.py diff --git a/.ai/ARCHITECTURE.md b/.ai/ARCHITECTURE.md index bdd27d6367..f72189bdaa 100644 --- a/.ai/ARCHITECTURE.md +++ b/.ai/ARCHITECTURE.md @@ -186,6 +186,7 @@ The backend system uses an abstract interface: - `FastAPIRequestAdapter` - Uses context variable for current request - `FastAPIResponseAdapter` - Uses Starlette responses - `DashMiddleware` - Consolidated ASGI middleware for request handling + - Runs `before_request` hooks on every HTTP route (user routes, assets, mounted apps) and the WebSocket handshake; a non-None hook result is sent as the response, like Flask. Only Dash's own routes get their JSON body pre-read and timing recorded. - Runs with uvicorn, supports hot reload - Built-in GZip compression @@ -596,7 +597,7 @@ cache_manager = DiskcacheManager( 4. **Completion**: When job finishes, poll returns final result 5. **Cleanup**: Results cleared from cache (unless `cache_by` specified) -Cache key is SHA256 hash of: function source + arguments + triggered inputs + cache_by values. +Cache key is SHA256 hash of: callback key + function source + arguments + triggered inputs + cache_by values. Without `cache_by` a random nonce is added, so every run gets its own key: the job runs with the requester's context, so two users with equal inputs must never share a result. ### Key Files diff --git a/CHANGELOG.md b/CHANGELOG.md index 1ed4634415..9705441d41 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,11 @@ This project adheres to [Semantic Versioning](https://semver.org/). - [#3986](https://github.com/plotly/dash/pull/3986) Adjust `_run_before_hooks` in the `fastapi` backend to honor a response returned by a `before_request` function, matching the `flask` backend's behavior. ### Fixed +- [#]() `fastapi` backend: run `before_request` hooks on every route of the Dash app (assets, hook routes, `api_endpoint`, pages, when mounted, the WebSocket handshake). A non-None hook result is now sent as the response, as on Flask. +- [#]() Background callbacks without `cache_by` no longer share a result between requests with equal inputs, and callbacks with the same source no longer share a cache key. `build_cache_key` takes a new `callback_key` argument. +- [#]() `dcc.Location(refresh=True).href` and `html.Area.href` now block `javascript:` URLs like `html.A`. +- [#]() Pages `path_template` matching no longer errors or backtracks badly on paths with a newline. +- [#]() MCP server: no longer caches callback outputs and layout values from one request and serves them to other users. - [#4027](https://github.com/plotly/dash/pull/4027) Support `async def` hook routes (`dash.hooks.route`) on all backends, stop hook routes from leaking the app context to the caller, and let hook routes and MCP read the request on the `fastapi` backend. - [#4053](https://github.com/plotly/dash/pull/4053) Fix callbacks being registered twice under a reloader (e.g. `uvicorn --reload`) when `Dash()` is given an explicit `name` or is built by an app factory called from the main module. Fixes [#3912](https://github.com/plotly/dash/issues/3912). - [#3980](https://github.com/plotly/dash/pull/3980) Fix the three `before_request` hooks (`Dash._setup_server` and the pages `router_sync` / `router_async`) publishing their "already done" guard flag before the setup work behind it had run. Under a multi-threaded WSGI worker such as `gunicorn -k gthread` (or under an ASGI worker for the async router), a second request arriving mid-setup could observe the flag already set, skip setup, then read `registered_paths` / `callback_map` / the pages router callback while they were still being registered - causing the first burst of component bundle requests after a restart to 500 with `Error loading dependency. "" is not a registered library`, or the pages router to hit `DuplicateCallback` when two workers raced past the guard. Each hook body now runs under a lock (`threading.Lock` for the two sync hooks, an `asyncio.Lock` bound to the running loop for the async router) and only publishes the flag after all work completes. Fixes [#3971](https://github.com/plotly/dash/issues/3971). diff --git a/components/dash-core-components/src/components/Location.react.js b/components/dash-core-components/src/components/Location.react.js index 27815db741..cfd4a55868 100644 --- a/components/dash-core-components/src/components/Location.react.js +++ b/components/dash-core-components/src/components/Location.react.js @@ -45,6 +45,17 @@ export default class Location extends Component { // Prop has changed? if (refresh === true) { // Refresh the page? + if ( + fieldName === 'href' && + window.dash_clientside.clean_url(propVal) !== propVal + ) { + setProps({ + _dash_error: new Error( + `Dangerous link detected: ${propVal}` + ), + }); + return false; + } window.location[fieldName] = propVal; } else if (this.props[fieldName] !== propVal) { // If this prop has changed, need to setProps diff --git a/components/dash-html-components/scripts/generate-components.js b/components/dash-html-components/scripts/generate-components.js index 9a4472804b..91972ac9d5 100644 --- a/components/dash-html-components/scripts/generate-components.js +++ b/components/dash-html-components/scripts/generate-components.js @@ -259,7 +259,8 @@ const customCodesForComponents = { iframe: createXSSProtection('src'), object: createXSSProtection('data'), embed: createXSSProtection('src'), - button: createXSSProtection('formAction') + button: createXSSProtection('formAction'), + area: createXSSProtection('href') } function generateComponent(Component, element, attributes) { diff --git a/dash/_callback.py b/dash/_callback.py index 91624c04eb..4191e85e7d 100644 --- a/dash/_callback.py +++ b/dash/_callback.py @@ -588,6 +588,7 @@ def _setup_background_callback( None if cache_ignore_triggered else callback_ctx.get("triggered_inputs", []), + callback_key=background_key, ) job_fn = callback_manager.func_registry.get(background_key) ctx_value = AttributeDict(**context_value.get()) diff --git a/dash/_pages.py b/dash/_pages.py index b63d37c669..22b7cecb4a 100644 --- a/dash/_pages.py +++ b/dash/_pages.py @@ -1,4 +1,5 @@ import collections +import functools import importlib import importlib.util # to make the type checker happy import os @@ -129,23 +130,26 @@ def _parse_path_variables(pathname, path_template): returns **{"asset_id": "a100"} """ - # parse variable definitions e.g. from template - # and create pattern to match wildcard_pattern = re.sub("<.*?>", "*", path_template) - var_pattern = re.sub("<.*?>", "(.*)", path_template) - # check that static sections of the pathname match the template + # fnmatch compiles to a pattern that cannot backtrack, so it gates out + # non-matching paths cheaply before the capturing match below runs. if not fnmatch(pathname, wildcard_pattern): return None - # parse variable names e.g. var_name from template + match = _path_template_regex(path_template).fullmatch(pathname) + if match is None: + return None + var_names = re.findall("<(.*?)>", path_template) + return dict(zip(var_names, match.groups())) - # parse variables from path - variables = re.findall(var_pattern, pathname) - variables = variables[0] if isinstance(variables[0], tuple) else variables - return dict(zip(var_names, variables)) +@functools.lru_cache(maxsize=None) +def _path_template_regex(path_template): + static_parts = re.split("<.*?>", path_template) + # DOTALL to agree with fnmatch, whose * also matches newlines. + return re.compile("(.*)".join(re.escape(p) for p in static_parts), re.DOTALL) def _set_redirect(redirect_from, path): diff --git a/dash/backends/_fastapi.py b/dash/backends/_fastapi.py index 5e72f65570..da11ca2d08 100644 --- a/dash/backends/_fastapi.py +++ b/dash/backends/_fastapi.py @@ -24,6 +24,8 @@ from fastapi.staticfiles import StaticFiles from starlette.responses import Response as StarletteResponse from starlette.datastructures import MutableHeaders + from starlette.exceptions import HTTPException + from starlette.requests import HTTPConnection from starlette.types import ASGIApp, Scope, Receive, Send from starlette.websockets import WebSocket, WebSocketDisconnect import uvicorn @@ -162,6 +164,20 @@ async def replay(): return replay +def _hook_response(result: Any) -> StarletteResponse: + """Turn a before_request hook's return value into a response, following the + Flask/Quart contract: a response, a body, or ``(body, status[, headers])``.""" + if isinstance(result, StarletteResponse): + return result + status, headers = 200, None + if isinstance(result, tuple): + result, status, *rest = result + headers = rest[0] if rest else None + if isinstance(result, (dict, list)): + return JSONResponse(content=result, status_code=status, headers=headers) + return Response(content=result, status_code=status, headers=headers) + + class DashMiddleware: # pylint: disable=too-few-public-methods """Consolidated middleware for all Dash/FastAPI integration needs.""" @@ -209,15 +225,15 @@ async def _setup_timing(self, request: Request) -> bytes | None: } return body - async def _run_before_hooks(self) -> None: - """Run all before-request hooks.""" + async def _run_before_hooks(self) -> Any: + """Run the before-request hooks, returning the first non-None result.""" for func in self.before_request_funcs: - if inspect.iscoroutinefunction(func): - result = await func() - else: - result = func() + result = func() + if inspect.isawaitable(result): + result = await result if result is not None: return result + return None async def _run_after_hooks(self) -> None: """Run after-request hook if configured.""" @@ -245,6 +261,12 @@ async def _handle_error( """Handle exceptions during request processing.""" if isinstance(error, PreventUpdate): response = Response(status_code=204) + elif isinstance(error, HTTPException): + response = JSONResponse( + status_code=error.status_code, + content={"detail": error.detail}, + headers=error.headers, + ) elif self.dash_server.error_handling_mode in ["raise", "prune"]: tb = self.dash_server._get_traceback(None, error) # pylint: disable=W0212 response = Response(content=tb, media_type="text/html", status_code=500) @@ -281,32 +303,39 @@ async def _receive_with_shutdown(): await self.app(scope, _receive_with_shutdown, send) return - # Non-HTTP/WebSocket scopes pass through - if scope["type"] != "http": - await self.app(scope, receive, send) + if scope["type"] == "websocket": + await self._gate_websocket(scope, receive, send) return - # Non-Dash routes pass through to avoid consuming body stream. - # Routes registered through Dash (hook routes, MCP) are Dash routes too. - path = scope["path"] - prefix = self.dash_app.config.routes_pathname_prefix - dash_prefix = prefix.rstrip("/") + "/_dash-" - if ( - not path.startswith(dash_prefix) - and path != prefix - and path != prefix.rstrip("/") - and path not in self.dash_app.routes - ): + if scope["type"] != "http": await self.app(scope, receive, send) return - # HTTP request handling + # before_request hooks run for every route, like Flask and Quart. Only + # Dash's own routes get their JSON body parsed and timing recorded, so + # user routes keep their raw body stream. + is_dash_route = self._is_dash_route(scope) request = Request(scope, receive=receive) token = set_current_request(request) try: - body = await self._setup_timing(request) - await self._run_before_hooks() + body = None + if is_dash_route: + body = await self._setup_timing(request) + else: + request.state.json_body = None + + denied = await self._run_before_hooks() + if denied is not None: + await _hook_response(denied)(scope, receive, send) + return + + if not is_dash_route: + # User routes keep their own error handling. + reset_current_request(token) + token = None + await self.app(scope, receive, send) + return if body is not None: # The body stream is consumed, replay it for handlers reading it. @@ -318,8 +347,41 @@ async def _receive_with_shutdown(): except Exception as e: # pylint: disable=W0718 await self._handle_error(e, scope, receive, send) + finally: + if token is not None: + reset_current_request(token) + + def _is_dash_route(self, scope: Scope) -> bool: + path = scope["path"] + # When mounted under a parent app the path still carries the mount + # prefix, which Starlette also reports as root_path. + root_path = scope.get("root_path", "") + if root_path and (path == root_path or path.startswith(root_path + "/")): + path = path[len(root_path) :] or "/" + prefix = self.dash_app.config.routes_pathname_prefix + return ( + path.startswith(prefix.rstrip("/") + "/_dash-") + or path in (prefix, prefix.rstrip("/")) + or path in self.dash_app.routes + ) + + async def _gate_websocket(self, scope: Scope, receive: Receive, send: Send): + """Run the before_request hooks on the WebSocket handshake so the + WebSocket callback transport has the same access check as HTTP.""" + connection = HTTPConnection(scope) + connection.state.json_body = None + token = set_current_request(connection) + try: + denied = await self._run_before_hooks() + except Exception: # pylint: disable=broad-exception-caught + denied = True finally: reset_current_request(token) + if denied is not None: + # Closing before accept makes the server reject the handshake (403). + await send({"type": "websocket.close", "code": 1008}) + return + await self.app(scope, receive, send) class FastAPIDashServer(BaseDashServer[FastAPI]): diff --git a/dash/background_callback/managers/__init__.py b/dash/background_callback/managers/__init__.py index f7faa1fbb5..9b9723c2c2 100644 --- a/dash/background_callback/managers/__init__.py +++ b/dash/background_callback/managers/__init__.py @@ -1,6 +1,7 @@ from abc import ABC import inspect import hashlib +import secrets from typing import Any, List @@ -69,7 +70,9 @@ def get_or_create_signing_secret(self, generate): """ raise NotImplementedError - def build_cache_key(self, fn, args, cache_args_to_ignore, triggered): + def build_cache_key( + self, fn, args, cache_args_to_ignore, triggered, callback_key=None + ): try: fn_source = inspect.getsource(fn) fn_str = fn_source @@ -87,13 +90,19 @@ def build_cache_key(self, fn, args, cache_args_to_ignore, triggered): arg for i, arg in enumerate(args) if i not in cache_args_to_ignore ] - hash_dict = dict(args=args, fn_source=fn_str, triggered=triggered) + hash_dict = dict( + args=args, fn_source=fn_str, triggered=triggered, callback=callback_key + ) if self.cache_by is not None: # Caching enabled for i, cache_item in enumerate(self.cache_by): # Call cache function hash_dict[f"cache_key_{i}"] = cache_item() + else: + # Without caching the job runs in the requester's context, so two + # requests with equal inputs must never share a result. + hash_dict["nonce"] = secrets.token_hex(16) return hashlib.sha256(str(hash_dict).encode("utf-8")).hexdigest() diff --git a/dash/dash.py b/dash/dash.py index 0b37862157..57e63d5db7 100644 --- a/dash/dash.py +++ b/dash/dash.py @@ -11,6 +11,7 @@ from importlib import metadata import pkgutil import threading +from contextvars import ContextVar import re import logging import mimetypes @@ -689,7 +690,11 @@ def __init__( # pylint: disable=too-many-statements, too-many-branches self._callback_list: list = [] self.callback_api_paths: dict = {} self.mcp_decorated_functions: dict = {} - self.mcp_callback_map: Any = None + # Request scoped: the adapters cache values computed in the caller's + # request context, so they must not outlive one MCP request. + self._mcp_callback_map: ContextVar = ContextVar( + "mcp_callback_map", default=None + ) # list of inline scripts self._inline_scripts: list = [] @@ -998,6 +1003,14 @@ def _setup_plotlyjs(self): ) self._plotlyjs_url = url + @property + def mcp_callback_map(self) -> Any: + return self._mcp_callback_map.get() + + @mcp_callback_map.setter + def mcp_callback_map(self, value: Any): + self._mcp_callback_map.set(value) + @property def layout(self) -> Any: return self._layout diff --git a/dash/mcp/_server.py b/dash/mcp/_server.py index fdbf9bc81a..8e1b82dd3c 100644 --- a/dash/mcp/_server.py +++ b/dash/mcp/_server.py @@ -259,10 +259,20 @@ def _process_mcp_message(data: dict[str, Any]) -> dict[str, Any] | None: request_id: str | int = _id if isinstance(_id, (str, int)) else "" app = get_app() - if app.mcp_callback_map is None: - app.mcp_callback_map = CallbackAdapterCollection(app) - app.mcp_decorated_functions = dict(MCP_DECORATED_FUNCTIONS) + app.mcp_decorated_functions = dict(MCP_DECORATED_FUNCTIONS) + # A fresh collection per message: its adapters cache values computed from + # this caller's request, which must never be served to another user. + # pylint: disable-next=protected-access + token = app._mcp_callback_map.set(CallbackAdapterCollection(app)) + try: + return _dispatch_mcp_message(method, params, request_id) + finally: + app._mcp_callback_map.reset(token) # pylint: disable=protected-access + +def _dispatch_mcp_message( + method: str, params: dict[str, Any], request_id: str | int +) -> dict[str, Any] | None: mcp_methods = { "initialize": _handle_initialize, "tools/list": list_tools, diff --git a/tests/backend_tests/test_fastapi_before_request.py b/tests/backend_tests/test_fastapi_before_request.py new file mode 100644 index 0000000000..bd9566cfd6 --- /dev/null +++ b/tests/backend_tests/test_fastapi_before_request.py @@ -0,0 +1,146 @@ +"""before_request hooks on the FastAPI backend gate every route, as on Flask +and Quart.""" +import pytest + +from dash import Dash, Input, Output, _get_app, hooks, html + +pytest.importorskip("fastapi") + + +@pytest.fixture(autouse=True) +def _fresh_app_context(): + # Lifespan resolves the app through get_app(); a context left by an earlier + # test would win over the app built here. + _get_app.app_context.set(None) + + +ROUTES = [ + ("GET", ""), + ("GET", "_dash-layout"), + ("GET", "_dash-dependencies"), + ("GET", "_reload-hash"), + ("GET", "healthz"), + ("GET", "secret-export"), + ("GET", "assets/load.css"), + ("POST", "api/echo"), + ("GET", "some/page"), +] + + +@pytest.fixture +def secret_route(): + @hooks.route(name="secret-export") + def secret_export(): + return "route secret" + + yield + hooks._ns["routes"] = [] + + +def _make_app(deny, assets): + (assets / "load.css").write_text("body {}") + app = Dash( + __name__, + backend="fastapi", + health_endpoint="healthz", + assets_folder=str(assets), + ) + app.layout = html.Div([html.Div("layout", id="o"), html.Button(id="b")]) + + @app.callback( + Output("o", "children"), Input("b", "n_clicks"), api_endpoint="/api/echo" + ) + def echo(n_clicks=None): + return "api" + + app.setup_apis() + + def check_auth(): + if app.backend.request_adapter().headers.get("authorization") != "good": + return deny() + return None + + app.backend.before_request(check_auth) + return app + + +def _deny_with_response(): + from starlette.responses import Response + + return Response("denied", status_code=401) + + +def _deny_with_tuple(): + return ("denied", 401) + + +def _deny_with_raise(): + from fastapi import HTTPException + + raise HTTPException(status_code=401, detail="denied") + + +@pytest.mark.parametrize( + "deny", [_deny_with_response, _deny_with_tuple, _deny_with_raise] +) +def test_fabr001_hook_gates_every_route(secret_route, deny, tmp_path): + from starlette.testclient import TestClient + + with TestClient(_make_app(deny, tmp_path).server) as client: + for method, route in ROUTES: + kwargs = {"json": {"n_clicks": 1}} if method == "POST" else {} + denied = client.request(method, f"/{route}", **kwargs) + assert denied.status_code == 401, f"{method} /{route} was not gated" + allowed = client.request( + method, f"/{route}", headers={"authorization": "good"}, **kwargs + ) + assert allowed.status_code == 200, f"{method} /{route}" + + +def test_fabr002_hook_gates_mounted_app(): + from fastapi import FastAPI + from starlette.testclient import TestClient + + app = Dash( + __name__, + backend="fastapi", + requests_pathname_prefix="/dash/", + routes_pathname_prefix="/", + ) + app.layout = html.Div("layout") + app.backend.before_request( + lambda: None + if app.backend.request_adapter().headers.get("authorization") == "good" + else ("denied", 401) + ) + parent = FastAPI() + parent.mount("/dash", app.server) + + with TestClient(parent) as client: + for route in ("_dash-layout", "_dash-dependencies", ""): + assert client.get(f"/dash/{route}").status_code == 401 + ok = client.get(f"/dash/{route}", headers={"authorization": "good"}) + assert ok.status_code == 200 + + +def test_fabr003_hook_gates_websocket_handshake(): + from starlette.testclient import TestClient + from starlette.websockets import WebSocketDisconnect + + app = Dash(__name__, backend="fastapi", websocket_callbacks=True) + app.layout = html.Div("layout") + app.backend.before_request( + lambda: None + if app.backend.request_adapter().headers.get("authorization") == "good" + else ("denied", 401) + ) + origin = {"origin": "http://testserver"} + + with TestClient(app.server) as client: + with pytest.raises(WebSocketDisconnect): + with client.websocket_connect("/_dash-ws-callback", headers=origin): + pass + with client.websocket_connect( + "/_dash-ws-callback", headers={**origin, "authorization": "good"} + ): + pass diff --git a/tests/integration/mcp/test_mcp_request_isolation.py b/tests/integration/mcp/test_mcp_request_isolation.py new file mode 100644 index 0000000000..5493bf0803 --- /dev/null +++ b/tests/integration/mcp/test_mcp_request_isolation.py @@ -0,0 +1,104 @@ +"""Values the MCP server computes from one caller's request must not be served +to another caller.""" + +import base64 +import json + +import flask + +from dash import Dash, Input, Output, dcc, html + +USERS = {"alice": "pw-a", "bob": "pw-b"} +SECRETS = {"alice": "alice-secret-111", "bob": "bob-secret-222"} + + +def _auth_header(user): + token = base64.b64encode(f"{user}:{USERS[user]}".encode()).decode() + return {"Authorization": f"Basic {token}", "Content-Type": "application/json"} + + +def _add_basic_auth(app): + @app.server.before_request + def basic_auth(): + auth = flask.request.authorization + if not auth or USERS.get(auth.username) != auth.password: + return flask.Response("auth required", 401) + flask.g.user = auth.username + return None + + +def _rpc(client, user, method, params=None): + r = client.post( + "/_mcp", + headers=_auth_header(user), + data=json.dumps( + {"jsonrpc": "2.0", "id": 1, "method": method, "params": params or {}} + ), + ) + assert r.status_code == 200 + return json.dumps(r.get_json()) + + +def test_mcpi001_callback_initial_output_is_per_request(): + app = Dash(__name__, enable_mcp=True) + app.layout = html.Div( + [ + dcc.Location(id="url"), + html.Div(id="profile"), + dcc.Input(id="note", value="hi"), + html.Div(id="summary"), + ] + ) + _add_basic_auth(app) + + @app.callback(Output("profile", "children"), Input("url", "pathname")) + def load_profile(_pathname): + return f"record: {SECRETS[flask.g.user]}" + + @app.callback( + Output("summary", "children"), + Input("profile", "children"), + Input("note", "value"), + ) + def summarize(profile, note): + return f"{profile} / {note}" + + client = app.server.test_client() + get_profile = { + "name": "get_dash_component", + "arguments": {"component_id": "profile"}, + } + + alice = _rpc(client, "alice", "tools/call", get_profile) + assert SECRETS["alice"] in alice + + bob = _rpc(client, "bob", "tools/call", get_profile) + assert SECRETS["alice"] not in bob + assert SECRETS["bob"] in bob + + bob_tools = _rpc(client, "bob", "tools/list") + assert SECRETS["alice"] not in bob_tools + + +def test_mcpi002_layout_function_values_are_per_request(): + app = Dash(__name__, enable_mcp=True, suppress_callback_exceptions=True) + + def serve_layout(): + user = getattr(flask.g, "user", None) if flask.has_app_context() else None + return html.Div( + [dcc.Input(id="apikey", value=SECRETS.get(user, "")), html.Div(id="out")] + ) + + app.layout = serve_layout + _add_basic_auth(app) + + @app.callback(Output("out", "children"), Input("apikey", "value")) + def use_key(apikey): + return "ok" if apikey else "no key" + + client = app.server.test_client() + assert SECRETS["alice"] in _rpc(client, "alice", "tools/list") + + bob_tools = _rpc(client, "bob", "tools/list") + assert SECRETS["alice"] not in bob_tools + assert SECRETS["bob"] in bob_tools diff --git a/tests/integration/multi_page/test_pages_path_template.py b/tests/integration/multi_page/test_pages_path_template.py new file mode 100644 index 0000000000..202600db0a --- /dev/null +++ b/tests/integration/multi_page/test_pages_path_template.py @@ -0,0 +1,64 @@ +import time + +import dash +from dash import Dash, html + + +def _make_app(): + app = Dash(__name__, use_pages=True, pages_folder="") + dash.register_page("home", path="/", layout=html.Div("home")) + dash.register_page( + "asset", + path_template="/asset//view", + layout=lambda asset_id=None, **_: html.Div(f"asset:{asset_id}", id="asset-out"), + ) + dash.register_page( + "cmp", + path_template="/cmp////view", + layout=lambda a=None, b=None, c=None, **_: html.Div(f"cmp:{a},{b},{c}"), + ) + app.layout = html.Div(dash.page_container) + return app + + +def _route(client, pathname): + body = { + "output": ".._pages_content.children..._pages_store.data..", + "outputs": [ + {"id": "_pages_content", "property": "children"}, + {"id": "_pages_store", "property": "data"}, + ], + "inputs": [ + {"id": "_pages_location", "property": "pathname", "value": pathname}, + {"id": "_pages_location", "property": "search", "value": ""}, + ], + "changedPropIds": ["_pages_location.pathname"], + "state": [], + } + start = time.time() + r = client.post("/_dash-update-component", json=body) + return r, time.time() - start + + +def test_pgpt001_path_template_variables(dash_duo): + app = _make_app() + dash_duo.start_server(app) + dash_duo.wait_for_page(f"{dash_duo.server_url}/asset/a1/view") + dash_duo.wait_for_text_to_equal("#asset-out", "asset:a1") + assert dash_duo.get_logs() == [] + + +def test_pgpt002_newline_pathname_is_rejected_fast(): + app = _make_app() + client = app.server.test_client() + client.get("/") + + r, _ = _route(client, "/asset/a\nb/view") + assert r.status_code == 200 + + r, elapsed = _route(client, "/cmp/" + "/" * 2000 + "\n/view") + assert r.status_code == 200 + assert elapsed < 1 + + r, _ = _route(client, "/cmp/x/y/z/view") + assert "cmp:x,y,z" in r.get_data(as_text=True) diff --git a/tests/integration/security/test_background_isolation.py b/tests/integration/security/test_background_isolation.py new file mode 100644 index 0000000000..34ff507c0b --- /dev/null +++ b/tests/integration/security/test_background_isolation.py @@ -0,0 +1,121 @@ +import json +import re +import tempfile +import time + +import pytest + +from dash import Dash, DiskcacheManager, Input, Output, callback_context, dcc, html + +diskcache = pytest.importorskip("diskcache") + + +def _end_id(client): + index = client.get("/").get_data(as_text=True) + config = re.search(r'id="_dash-config"[^>]*>(.*?)', index, re.S) + return json.loads(config.group(1))["end_id"] + + +def _body(name): + return { + "output": f"out-{name}.children", + "outputs": {"id": f"out-{name}", "property": "children"}, + "inputs": [{"id": f"in-{name}", "property": "value", "value": "go"}], + "changedPropIds": [f"in-{name}.value"], + "state": [], + } + + +def _start(client, end_id, body): + return client.post( + "/_dash-update-component", json=body, query_string={"endId": end_id} + ).get_json() + + +def _poll(client, end_id, body, handles): + query = {"endId": end_id, "cacheKey": handles["cacheKey"], "job": handles["job"]} + r = client.post("/_dash-update-component", json=body, query_string=query) + return r.get_data(as_text=True) + + +def _poll_until_done(client, end_id, body, handles): + for _ in range(50): + out = _poll(client, end_id, body, handles) + if '"response"' in out: + return out + time.sleep(0.2) + raise AssertionError("background callback never finished") + + +def test_bgiso001_equal_inputs_do_not_share_results(): + manager = DiskcacheManager(diskcache.Cache(tempfile.mkdtemp())) + app = Dash(__name__, background_callback_manager=manager) + app.layout = html.Div( + [dcc.Input(id="in-report", value="go"), html.Div(id="out-report")] + ) + + @app.callback( + Output("out-report", "children"), + Input("in-report", "value"), + background=True, + prevent_initial_call=True, + ) + def report(_value): + return f"report for {callback_context.cookies.get('user')}" + + alice = app.server.test_client() + alice.set_cookie("user", "alice") + mallory = app.server.test_client() + mallory.set_cookie("user", "mallory") + alice_end, mallory_end = _end_id(alice), _end_id(mallory) + body = _body("report") + + alice_handles = _start(alice, alice_end, body) + time.sleep(1.5) + + mallory_handles = _start(mallory, mallory_end, body) + assert mallory_handles["cacheKey"] != alice_handles["cacheKey"] + assert "alice" not in _poll_until_done(mallory, mallory_end, body, mallory_handles) + + assert "report for alice" in _poll_until_done(alice, alice_end, body, alice_handles) + + +def test_bgiso002_callbacks_from_one_factory_do_not_share_results(): + manager = DiskcacheManager( + diskcache.Cache(tempfile.mkdtemp()), cache_by=[lambda: "fixed"] + ) + app = Dash(__name__, background_callback_manager=manager) + tables = {"public": "public stats", "admin": "admin payroll"} + app.layout = html.Div( + [ + dcc.Input(id="in-public", value="go"), + html.Div(id="out-public"), + dcc.Input(id="in-admin", value="go"), + html.Div(id="out-admin"), + ] + ) + + def make(name): + @app.callback( + Output(f"out-{name}", "children"), + Input(f"in-{name}", "value"), + background=True, + prevent_initial_call=True, + ) + def render(_value): + return tables[name] + + make("admin") + make("public") + + client = app.server.test_client() + end_id = _end_id(client) + + admin = _start(client, end_id, _body("admin")) + assert "admin payroll" in _poll_until_done(client, end_id, _body("admin"), admin) + + public = _start(client, end_id, _body("public")) + assert public["cacheKey"] != admin["cacheKey"] + out = _poll_until_done(client, end_id, _body("public"), public) + assert "public stats" in out + assert "admin payroll" not in out diff --git a/tests/integration/security/test_xss.py b/tests/integration/security/test_xss.py index fe1341d860..bc52d426d6 100644 --- a/tests/integration/security/test_xss.py +++ b/tests/integration/security/test_xss.py @@ -1,4 +1,5 @@ -from dash import Dash, html, dcc +from dash import Dash, Input, Output, ctx, dcc, html +from dash.testing.wait import until def test_xss001_banned_protocols(dash_duo): @@ -91,3 +92,54 @@ def test_xss003_data_allowed(dash_duo): element = dash_duo.find_element("#image") assert element.get_attribute("src") != "about:blank" assert dash_duo.get_logs() == [] + + +def test_xss004_area_href(dash_duo): + app = Dash() + app.layout = html.MapEl( + html.Area(href="javascript:alert(1)", id="area", shape="default"), + name="map", + ) + + dash_duo.start_server(app) + dash_duo.wait_for_element("#area") + assert dash_duo.find_element("#area").get_attribute("href") == "about:blank" + + +def test_xss005_location_refresh_href(dash_duo): + app = Dash() + app.layout = html.Div( + [ + dcc.Location(id="url", refresh=True), + html.Button("bad", id="bad"), + html.Button("good", id="good"), + ] + ) + + @app.callback( + Output("url", "href"), + Input("bad", "n_clicks"), + Input("good", "n_clicks"), + prevent_initial_call=True, + ) + def navigate(_bad, _good): + if ctx.triggered_id == "bad": + return "javascript:void(window.xss_ran = true)" + return "/next" + + dash_duo.start_server( + app, + debug=True, + use_reloader=False, + use_debugger=True, + dev_tools_hot_reload=False, + ) + dash_duo.wait_for_element("#bad").click() + dash_duo.wait_for_text_to_equal( + ".dash-fe-error__title", + "Dangerous link detected: javascript:void(window.xss_ran = true)", + ) + assert dash_duo.driver.execute_script("return window.xss_ran") is None + + dash_duo.find_element("#good").click() + until(lambda: dash_duo.driver.current_url.endswith("/next"), timeout=5) From 602187fad9b0f3d62a45f1fdda03d73e74515eba Mon Sep 17 00:00:00 2001 From: philippe Date: Tue, 20 Oct 2026 12:38:42 -0400 Subject: [PATCH 11/20] Add PR number to CHANGELOG --- CHANGELOG.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9705441d41..ce947a8929 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,11 +29,11 @@ This project adheres to [Semantic Versioning](https://semver.org/). - [#3986](https://github.com/plotly/dash/pull/3986) Adjust `_run_before_hooks` in the `fastapi` backend to honor a response returned by a `before_request` function, matching the `flask` backend's behavior. ### Fixed -- [#]() `fastapi` backend: run `before_request` hooks on every route of the Dash app (assets, hook routes, `api_endpoint`, pages, when mounted, the WebSocket handshake). A non-None hook result is now sent as the response, as on Flask. -- [#]() Background callbacks without `cache_by` no longer share a result between requests with equal inputs, and callbacks with the same source no longer share a cache key. `build_cache_key` takes a new `callback_key` argument. -- [#]() `dcc.Location(refresh=True).href` and `html.Area.href` now block `javascript:` URLs like `html.A`. -- [#]() Pages `path_template` matching no longer errors or backtracks badly on paths with a newline. -- [#]() MCP server: no longer caches callback outputs and layout values from one request and serves them to other users. +- [#4075](https://github.com/plotly/dash/pull/4075) `fastapi` backend: run `before_request` hooks on every route of the Dash app (assets, hook routes, `api_endpoint`, pages, when mounted, the WebSocket handshake). A non-None hook result is now sent as the response, as on Flask. +- [#4075](https://github.com/plotly/dash/pull/4075) Background callbacks without `cache_by` no longer share a result between requests with equal inputs, and callbacks with the same source no longer share a cache key. `build_cache_key` takes a new `callback_key` argument. +- [#4075](https://github.com/plotly/dash/pull/4075) `dcc.Location(refresh=True).href` and `html.Area.href` now block `javascript:` URLs like `html.A`. +- [#4075](https://github.com/plotly/dash/pull/4075) Pages `path_template` matching no longer errors or backtracks badly on paths with a newline. +- [#4075](https://github.com/plotly/dash/pull/4075) MCP server: no longer caches callback outputs and layout values from one request and serves them to other users. - [#4027](https://github.com/plotly/dash/pull/4027) Support `async def` hook routes (`dash.hooks.route`) on all backends, stop hook routes from leaking the app context to the caller, and let hook routes and MCP read the request on the `fastapi` backend. - [#4053](https://github.com/plotly/dash/pull/4053) Fix callbacks being registered twice under a reloader (e.g. `uvicorn --reload`) when `Dash()` is given an explicit `name` or is built by an app factory called from the main module. Fixes [#3912](https://github.com/plotly/dash/issues/3912). - [#3980](https://github.com/plotly/dash/pull/3980) Fix the three `before_request` hooks (`Dash._setup_server` and the pages `router_sync` / `router_async`) publishing their "already done" guard flag before the setup work behind it had run. Under a multi-threaded WSGI worker such as `gunicorn -k gthread` (or under an ASGI worker for the async router), a second request arriving mid-setup could observe the flag already set, skip setup, then read `registered_paths` / `callback_map` / the pages router callback while they were still being registered - causing the first burst of component bundle requests after a restart to 500 with `Error loading dependency. "" is not a registered library`, or the pages router to hit `DuplicateCallback` when two workers raced past the guard. Each hook body now runs under a lock (`threading.Lock` for the two sync hooks, an `asyncio.Lock` bound to the running loop for the async router) and only publishes the flag after all work completes. Fixes [#3971](https://github.com/plotly/dash/issues/3971). From b0998376b92d5a4d6c5c1eace372cdf351262b34 Mon Sep 17 00:00:00 2001 From: 0d00ciallo0721 <259874237+0d00ciallo0721@users.noreply.github.com> Date: Wed, 21 Oct 2026 12:48:51 +0800 Subject: [PATCH 12/20] test(renderer): cover falsy callback children --- .../callbacks/test_children_none.py | 50 ---------------- .../test_layout_paths_with_callbacks.py | 58 +++++++++++++++++++ 2 files changed, 58 insertions(+), 50 deletions(-) delete mode 100644 tests/integration/callbacks/test_children_none.py diff --git a/tests/integration/callbacks/test_children_none.py b/tests/integration/callbacks/test_children_none.py deleted file mode 100644 index 6e00c8c47c..0000000000 --- a/tests/integration/callbacks/test_children_none.py +++ /dev/null @@ -1,50 +0,0 @@ -import time - -from dash import Dash, Input, Output, dcc, html -from dash.testing.wait import until - - -def test_callback_returning_none_removes_child_paths_and_can_remount(dash_duo): - view_calls = [] - - app = Dash(__name__, suppress_callback_exceptions=True) - app.layout = html.Div( - [ - html.Button("Toggle", id="toggle"), - dcc.Interval(id="tick", interval=200), - html.Div(id="container"), - ] - ) - - @app.callback( - Output("container", "children"), - Input("toggle", "n_clicks"), - prevent_initial_call=True, - ) - def toggle_view(n_clicks): - if n_clicks % 2: - return html.Div(html.Span(id="view-child"), id="view") - return None - - @app.callback(Output("view-child", "children"), Input("tick", "n_intervals")) - def update_view(n_intervals): - view_calls.append(n_intervals) - return f"tick {n_intervals}" - - dash_duo.start_server(app) - - dash_duo.find_element("#toggle").click() - dash_duo.wait_for_element("#view-child") - until(lambda: "view-child" in dash_duo.redux_state_paths["strs"], timeout=3) - until(lambda: view_calls, timeout=3) - - dash_duo.find_element("#toggle").click() - dash_duo.wait_for_no_elements("#view-child") - until(lambda: "view-child" not in dash_duo.redux_state_paths["strs"], timeout=3) - calls_after_unmount = len(view_calls) - time.sleep(0.5) - assert len(view_calls) == calls_after_unmount - - dash_duo.find_element("#toggle").click() - dash_duo.wait_for_element("#view-child") - until(lambda: "view-child" in dash_duo.redux_state_paths["strs"], timeout=3) diff --git a/tests/integration/callbacks/test_layout_paths_with_callbacks.py b/tests/integration/callbacks/test_layout_paths_with_callbacks.py index 7ce0296bc4..602635e25d 100644 --- a/tests/integration/callbacks/test_layout_paths_with_callbacks.py +++ b/tests/integration/callbacks/test_layout_paths_with_callbacks.py @@ -1,6 +1,9 @@ import os import json from multiprocessing import Value +import time + +import pytest from dash import Dash, Input, Output, dcc, html import dash.testing.wait as wait @@ -248,3 +251,58 @@ def check_call_counts(chapters, count): ) check_chapter("chapter1") snapshot(name="chapter-1-again") + + +@pytest.mark.parametrize( + "replacement", [None, "", 0], ids=["none", "empty-string", "zero"] +) +def test_cblp002_callback_replaces_children_with_falsy_value_and_can_remount( + dash_duo, replacement +): + view_calls = [] + + app = Dash(__name__, suppress_callback_exceptions=True) + app.layout = html.Div( + [ + html.Button("Toggle", id="toggle"), + dcc.Interval(id="tick", interval=200), + html.Div(id="container"), + ] + ) + + @app.callback( + Output("container", "children"), + Input("toggle", "n_clicks"), + prevent_initial_call=True, + ) + def toggle_view(n_clicks): + if n_clicks % 2: + return html.Div(html.Span(id="view-child"), id="view") + return replacement + + @app.callback(Output("view-child", "children"), Input("tick", "n_intervals")) + def update_view(n_intervals): + view_calls.append(n_intervals) + return f"tick {n_intervals}" + + dash_duo.start_server(app) + + dash_duo.find_element("#toggle").click() + dash_duo.wait_for_element("#view-child") + wait.until(lambda: "view-child" in dash_duo.redux_state_paths["strs"], timeout=3) + dash_duo.wait_for_contains_text("#view-child", "tick") + wait.until(lambda: view_calls, timeout=3) + + dash_duo.find_element("#toggle").click() + dash_duo.wait_for_no_elements("#view-child") + wait.until( + lambda: "view-child" not in dash_duo.redux_state_paths["strs"], timeout=3 + ) + calls_after_unmount = len(view_calls) + time.sleep(0.5) + assert len(view_calls) == calls_after_unmount + + dash_duo.find_element("#toggle").click() + dash_duo.wait_for_element("#view-child") + wait.until(lambda: "view-child" in dash_duo.redux_state_paths["strs"], timeout=3) + dash_duo.wait_for_contains_text("#view-child", "tick") From 482bac02d20a93a4b03e2a6abd5784c5ebfb9150 Mon Sep 17 00:00:00 2001 From: philippe Date: Wed, 21 Oct 2026 10:36:47 -0400 Subject: [PATCH 13/20] Address review on #4075 - fastapi: accept Flask style (body, headers) and string status hook tuples. - Log a before_request hook failure before rejecting a WebSocket; Quart now runs before_request hooks on the WebSocket handshake too. - Diskcache: expire uncached background results after a day so results nobody polls for do not pile up. - MCP: keep the cached callback map, keyed by configure_mcp_server(cache_by=...) so apps can cache per user; a failing cache_by returns a JSON-RPC error. - Sanitize html.Base href. --- .ai/ARCHITECTURE.md | 4 +- CHANGELOG.md | 8 +-- .../scripts/generate-components.js | 3 +- dash/backends/_fastapi.py | 21 ++++++-- dash/backends/_quart.py | 13 ++++- .../managers/diskcache_manager.py | 28 ++++++++--- dash/dash.py | 6 ++- dash/mcp/_configure.py | 21 ++++++-- dash/mcp/_server.py | 41 +++++++++++++-- .../test_fastapi_before_request.py | 43 ++++++++++++++++ .../test_quart_before_request.py | 37 ++++++++++++++ .../mcp/test_mcp_request_isolation.py | 50 +++++++++++++++++-- .../security/test_background_isolation.py | 28 +++++++++++ tests/integration/security/test_xss.py | 14 ++++++ .../test_async_background_callback_job_fn.py | 2 +- 15 files changed, 285 insertions(+), 34 deletions(-) create mode 100644 tests/backend_tests/test_quart_before_request.py diff --git a/.ai/ARCHITECTURE.md b/.ai/ARCHITECTURE.md index f72189bdaa..1ad587e2c4 100644 --- a/.ai/ARCHITECTURE.md +++ b/.ai/ARCHITECTURE.md @@ -186,7 +186,7 @@ The backend system uses an abstract interface: - `FastAPIRequestAdapter` - Uses context variable for current request - `FastAPIResponseAdapter` - Uses Starlette responses - `DashMiddleware` - Consolidated ASGI middleware for request handling - - Runs `before_request` hooks on every HTTP route (user routes, assets, mounted apps) and the WebSocket handshake; a non-None hook result is sent as the response, like Flask. Only Dash's own routes get their JSON body pre-read and timing recorded. + - Runs `before_request` hooks on every HTTP route (user routes, assets, mounted apps) and the WebSocket handshake; a non-None hook result is sent as the response, like Flask. Only Dash's own routes get their JSON body pre-read, timing recorded and Dash's error handling. Quart registers the same hooks as `before_websocket` too. - Runs with uvicorn, supports hot reload - Built-in GZip compression @@ -597,7 +597,7 @@ cache_manager = DiskcacheManager( 4. **Completion**: When job finishes, poll returns final result 5. **Cleanup**: Results cleared from cache (unless `cache_by` specified) -Cache key is SHA256 hash of: callback key + function source + arguments + triggered inputs + cache_by values. Without `cache_by` a random nonce is added, so every run gets its own key: the job runs with the requester's context, so two users with equal inputs must never share a result. +Cache key is SHA256 hash of: callback key + function source + arguments + triggered inputs + cache_by values. Without `cache_by` a random nonce is added, so every run gets its own key: the job runs with the requester's context, so two users with equal inputs must never share a result. Diskcache writes those uncached entries with a one day expiry (`UNCACHED_RESULT_EXPIRE`) so results nobody polls for do not pile up; Celery's result backend already expires them. ### Key Files diff --git a/CHANGELOG.md b/CHANGELOG.md index ce947a8929..e01591625d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,11 +29,11 @@ This project adheres to [Semantic Versioning](https://semver.org/). - [#3986](https://github.com/plotly/dash/pull/3986) Adjust `_run_before_hooks` in the `fastapi` backend to honor a response returned by a `before_request` function, matching the `flask` backend's behavior. ### Fixed -- [#4075](https://github.com/plotly/dash/pull/4075) `fastapi` backend: run `before_request` hooks on every route of the Dash app (assets, hook routes, `api_endpoint`, pages, when mounted, the WebSocket handshake). A non-None hook result is now sent as the response, as on Flask. -- [#4075](https://github.com/plotly/dash/pull/4075) Background callbacks without `cache_by` no longer share a result between requests with equal inputs, and callbacks with the same source no longer share a cache key. `build_cache_key` takes a new `callback_key` argument. -- [#4075](https://github.com/plotly/dash/pull/4075) `dcc.Location(refresh=True).href` and `html.Area.href` now block `javascript:` URLs like `html.A`. +- [#4075](https://github.com/plotly/dash/pull/4075) `fastapi` backend: run `before_request` hooks on every route of the Dash app (assets, hook routes, `api_endpoint`, pages, when mounted) and send a non-None hook result as the response, as on Flask. `fastapi` and `quart` also run them on the WebSocket handshake. +- [#4075](https://github.com/plotly/dash/pull/4075) Background callbacks without `cache_by` no longer share a result between requests with equal inputs (unread Diskcache results now expire after a day, or after `expire` when set, even with `cache_by`), and callbacks with the same source no longer share a cache key. `build_cache_key` takes a new `callback_key` argument. +- [#4075](https://github.com/plotly/dash/pull/4075) `dcc.Location(refresh=True).href`, `html.Area.href` and `html.Base.href` now block `javascript:` URLs like `html.A`. - [#4075](https://github.com/plotly/dash/pull/4075) Pages `path_template` matching no longer errors or backtracks badly on paths with a newline. -- [#4075](https://github.com/plotly/dash/pull/4075) MCP server: no longer caches callback outputs and layout values from one request and serves them to other users. +- [#4075](https://github.com/plotly/dash/pull/4075) Add `configure_mcp_server(cache_by=...)` so apps whose layout or callbacks depend on the user can keep the MCP server's cached tool descriptions and initial values per user. - [#4027](https://github.com/plotly/dash/pull/4027) Support `async def` hook routes (`dash.hooks.route`) on all backends, stop hook routes from leaking the app context to the caller, and let hook routes and MCP read the request on the `fastapi` backend. - [#4053](https://github.com/plotly/dash/pull/4053) Fix callbacks being registered twice under a reloader (e.g. `uvicorn --reload`) when `Dash()` is given an explicit `name` or is built by an app factory called from the main module. Fixes [#3912](https://github.com/plotly/dash/issues/3912). - [#3980](https://github.com/plotly/dash/pull/3980) Fix the three `before_request` hooks (`Dash._setup_server` and the pages `router_sync` / `router_async`) publishing their "already done" guard flag before the setup work behind it had run. Under a multi-threaded WSGI worker such as `gunicorn -k gthread` (or under an ASGI worker for the async router), a second request arriving mid-setup could observe the flag already set, skip setup, then read `registered_paths` / `callback_map` / the pages router callback while they were still being registered - causing the first burst of component bundle requests after a restart to 500 with `Error loading dependency. "" is not a registered library`, or the pages router to hit `DuplicateCallback` when two workers raced past the guard. Each hook body now runs under a lock (`threading.Lock` for the two sync hooks, an `asyncio.Lock` bound to the running loop for the async router) and only publishes the flag after all work completes. Fixes [#3971](https://github.com/plotly/dash/issues/3971). diff --git a/components/dash-html-components/scripts/generate-components.js b/components/dash-html-components/scripts/generate-components.js index 91972ac9d5..634a7554ab 100644 --- a/components/dash-html-components/scripts/generate-components.js +++ b/components/dash-html-components/scripts/generate-components.js @@ -260,7 +260,8 @@ const customCodesForComponents = { object: createXSSProtection('data'), embed: createXSSProtection('src'), button: createXSSProtection('formAction'), - area: createXSSProtection('href') + area: createXSSProtection('href'), + base: createXSSProtection('href') } function generateComponent(Component, element, attributes) { diff --git a/dash/backends/_fastapi.py b/dash/backends/_fastapi.py index da11ca2d08..ec1514a405 100644 --- a/dash/backends/_fastapi.py +++ b/dash/backends/_fastapi.py @@ -4,6 +4,7 @@ import asyncio import concurrent.futures import json +import logging import queue from typing import TYPE_CHECKING, Any, Callable, Dict, List import sys @@ -23,7 +24,7 @@ from fastapi.responses import JSONResponse, RedirectResponse, StreamingResponse from fastapi.staticfiles import StaticFiles from starlette.responses import Response as StarletteResponse - from starlette.datastructures import MutableHeaders + from starlette.datastructures import Headers, MutableHeaders from starlette.exceptions import HTTPException from starlette.requests import HTTPConnection from starlette.types import ASGIApp, Scope, Receive, Send @@ -78,6 +79,8 @@ if TYPE_CHECKING: # pragma: no cover - typing only from dash import Dash +logger = logging.getLogger(__name__) + def _run_subprocess(args, env): proc = subprocess.Popen(args, env=env) # pylint: disable=R1732 @@ -166,13 +169,22 @@ async def replay(): def _hook_response(result: Any) -> StarletteResponse: """Turn a before_request hook's return value into a response, following the - Flask/Quart contract: a response, a body, or ``(body, status[, headers])``.""" + Flask/Quart contract: a response, a body, ``(body, status)``, + ``(body, headers)`` or ``(body, status, headers)``.""" if isinstance(result, StarletteResponse): return result status, headers = 200, None if isinstance(result, tuple): - result, status, *rest = result - headers = rest[0] if rest else None + if len(result) == 3: + result, status, headers = result + elif isinstance(result[1], (dict, Headers, list, tuple)): + result, headers = result + else: + result, status = result + if isinstance(status, str): + status = int(status.split(" ", 1)[0]) + if isinstance(headers, (list, tuple)): + headers = dict(headers) if isinstance(result, (dict, list)): return JSONResponse(content=result, status_code=status, headers=headers) return Response(content=result, status_code=status, headers=headers) @@ -374,6 +386,7 @@ async def _gate_websocket(self, scope: Scope, receive: Receive, send: Send): try: denied = await self._run_before_hooks() except Exception: # pylint: disable=broad-exception-caught + logger.exception("before_request hook failed, rejecting WebSocket") denied = True finally: reset_current_request(token) diff --git a/dash/backends/_quart.py b/dash/backends/_quart.py index 242e9f8e5f..ac58e1acf5 100644 --- a/dash/backends/_quart.py +++ b/dash/backends/_quart.py @@ -28,6 +28,7 @@ Blueprint, g as quart_g, has_request_context, + has_websocket_context, redirect, websocket, ) @@ -253,6 +254,9 @@ async def catchall( def before_request(self, func: _t.Callable[[], _t.Any]): self.server.before_request(func) + # Also gate the WebSocket handshake, so the WebSocket callback + # transport gets the same access check as HTTP. + self.server.before_websocket(func) def after_request(self, func: _t.Callable[[], _t.Any]): @self.server.after_request @@ -820,13 +824,18 @@ async def websocket_handler(): # pylint: disable=too-many-branches class QuartRequestAdapter(RequestAdapter): def __init__(self) -> None: - self._request = request # type: ignore[assignment] + # Inside a before_websocket hook there is no request, only the websocket. + self._request = ( # type: ignore[assignment] + websocket + if not has_request_context() and has_websocket_context() + else request + ) if self._request is None: raise RuntimeError("Quart not installed; cannot access request context") @property def context(self): - if not has_request_context(): + if not (has_request_context() or has_websocket_context()): raise RuntimeError("No active request in context") return quart_g diff --git a/dash/background_callback/managers/diskcache_manager.py b/dash/background_callback/managers/diskcache_manager.py index 80170af284..6312d20696 100644 --- a/dash/background_callback/managers/diskcache_manager.py +++ b/dash/background_callback/managers/diskcache_manager.py @@ -17,6 +17,10 @@ class DiskcacheManager(BaseBackgroundCallbackManager): """Manage the background execution of callbacks with subprocesses and a diskcache result backend.""" + # Without cache_by each run has its own result key, so a result nobody polls + # for (the page was closed or refreshed first) is never read and deleted. + UNCACHED_RESULT_EXPIRE = 24 * 60 * 60 + def __init__(self, cache=None, cache_by=None, expire=None): """ Background callback manager that runs callback logic in a subprocess and stores @@ -140,9 +144,13 @@ def call_job_fn(self, key, job_fn, args, context): from multiprocess import Process # type: ignore # pylint: disable-next=not-callable + expire = self.expire + if expire is None and self.cache_by is None: + expire = self.UNCACHED_RESULT_EXPIRE process = Process( target=job_fn, args=(key, self._make_progress_key(key), args, context), + kwargs={"expire": expire}, ) process.start() return process.pid @@ -217,12 +225,12 @@ def get_updated_props(self, key): # pylint: disable-next=too-many-statements def _make_job_fn(fn, cache, progress): # pylint: disable-next=too-many-statements - def job_fn(result_key, progress_key, user_callback_args, context): + def job_fn(result_key, progress_key, user_callback_args, context, expire=None): def _set_progress(progress_value): if not isinstance(progress_value, (list, tuple)): progress_value = [progress_value] - cache.set(progress_key, progress_value) + cache.set(progress_key, progress_value, expire=expire) maybe_progress = [_set_progress] if progress else [] @@ -231,7 +239,7 @@ def _set_props(_id, props): old = cache.get(key, {}) old_props = old.get(_id, {}) old[_id] = {**old_props, **props} - cache.set(key, old) + cache.set(key, old, expire=expire) ctx = copy_context() @@ -251,7 +259,9 @@ def run(): user_callback_output = fn(*maybe_progress, user_callback_args) except PreventUpdate: errored = True - cache.set(result_key, {"_dash_no_update": "_dash_no_update"}) + cache.set( + result_key, {"_dash_no_update": "_dash_no_update"}, expire=expire + ) except Exception as err: # pylint: disable=broad-except errored = True cache.set( @@ -262,10 +272,11 @@ def run(): "tb": traceback.format_exc(), } }, + expire=expire, ) if not errored: - cache.set(result_key, user_callback_output) + cache.set(result_key, user_callback_output, expire=expire) async def async_run(): c = AttributeDict(**context) @@ -287,7 +298,9 @@ async def async_run(): user_callback_output = await fn(*maybe_progress, user_callback_args) except PreventUpdate: errored = True - cache.set(result_key, {"_dash_no_update": "_dash_no_update"}) + cache.set( + result_key, {"_dash_no_update": "_dash_no_update"}, expire=expire + ) except Exception as err: # pylint: disable=broad-except errored = True cache.set( @@ -298,13 +311,14 @@ async def async_run(): "tb": traceback.format_exc(), } }, + expire=expire, ) if not errored: if asyncio.iscoroutine(user_callback_output): user_callback_output = await user_callback_output try: - cache.set(result_key, user_callback_output) + cache.set(result_key, user_callback_output, expire=expire) except Exception as err: # pylint: disable=broad-except print(f"Diskcache manager couldn't save output: {err}") diff --git a/dash/dash.py b/dash/dash.py index 57e63d5db7..8c3bf625ef 100644 --- a/dash/dash.py +++ b/dash/dash.py @@ -690,11 +690,13 @@ def __init__( # pylint: disable=too-many-statements, too-many-branches self._callback_list: list = [] self.callback_api_paths: dict = {} self.mcp_decorated_functions: dict = {} - # Request scoped: the adapters cache values computed in the caller's - # request context, so they must not outlive one MCP request. + # The collection serving the current MCP request, picked from + # _mcp_callback_maps by the configured cache_by key. self._mcp_callback_map: ContextVar = ContextVar( "mcp_callback_map", default=None ) + self._mcp_callback_maps: collections.OrderedDict = collections.OrderedDict() + self._mcp_callback_maps_lock = threading.Lock() # list of inline scripts self._inline_scripts: list = [] diff --git a/dash/mcp/_configure.py b/dash/mcp/_configure.py index 2844483a64..50dfcf69a2 100644 --- a/dash/mcp/_configure.py +++ b/dash/mcp/_configure.py @@ -6,7 +6,7 @@ from __future__ import annotations -from typing import Optional +from typing import Callable, List, Optional, Union from dash import get_app from dash.exceptions import AppNotFoundError @@ -38,6 +38,7 @@ "include_clientside_callbacks": True, "include_pages": True, "expose_callback_docstrings": False, + "cache_by": [], } _current_config = dict(_DEFAULT_CONFIG) @@ -49,6 +50,7 @@ def configure_mcp_server( include_clientside_callbacks: Optional[bool] = None, include_pages: Optional[bool] = None, expose_callback_docstrings: Optional[bool] = None, + cache_by: Optional[Union[Callable[[], object], List[Callable[[], object]]]] = None, ) -> None: """ Configure which content the Dash MCP server exposes. @@ -69,6 +71,13 @@ def configure_mcp_server( ``dash://page-layout/{path}``. Defaults to ``True``. :param expose_callback_docstrings: Include callback docstrings in tool descriptions. Defaults to ``False``. + :param cache_by: Zero-argument functions, called during each MCP request, + whose return values key the server's cache of tool descriptions and + initial values (computed by walking the layout and running callbacks). + By default one cache is shared by every MCP client. If your layout or + callbacks depend on who is asking, pass a function that returns the + user or session id (a string or int) so each user gets their own + values, the same way ``cache_by`` works for background callbacks. Example — expose only ``@mcp_enabled``-decorated functions:: @@ -93,6 +102,7 @@ def configure_mcp_server( "include_clientside_callbacks": include_clientside_callbacks, "include_pages": include_pages, "expose_callback_docstrings": expose_callback_docstrings, + "cache_by": [cache_by] if callable(cache_by) else cache_by, } _current_config.update( {key: value for key, value in passed.items() if value is not None} @@ -125,9 +135,12 @@ def configure_mcp_server( tool for tool in _ALL_MCP_TOOL_PROVIDERS if tool not in excluded_tools ] - # Invalidate the cached callback map so it is rebuilt with the new config. + # Invalidate the cached callback maps so they are rebuilt with the new config. # No app yet (configured before `Dash()`) means there is no cache to clear. try: - get_app().mcp_callback_map = None + app = get_app() except AppNotFoundError: - pass + return + app.mcp_callback_map = None + with app._mcp_callback_maps_lock: # pylint: disable=protected-access + app._mcp_callback_maps.clear() # pylint: disable=protected-access diff --git a/dash/mcp/_server.py b/dash/mcp/_server.py index 8e1b82dd3c..3284c8eb62 100644 --- a/dash/mcp/_server.py +++ b/dash/mcp/_server.py @@ -26,6 +26,7 @@ ) from dash import get_app +from dash.mcp import _configure from dash.mcp._decorator import MCP_DECORATED_FUNCTIONS from dash.mcp.primitives import ( call_tool, @@ -46,6 +47,9 @@ logger = logging.getLogger(__name__) +# Bounds memory when cache_by yields one key per user. +_MAX_CACHED_CALLBACK_MAPS = 128 + def enable_mcp_server(app: Dash, mcp_path: str) -> None: """Add MCP routes to a Dash app.""" @@ -260,16 +264,47 @@ def _process_mcp_message(data: dict[str, Any]) -> dict[str, Any] | None: app = get_app() app.mcp_decorated_functions = dict(MCP_DECORATED_FUNCTIONS) - # A fresh collection per message: its adapters cache values computed from - # this caller's request, which must never be served to another user. + try: + collection = _callback_map_for_request(app) + except Exception as e: # pylint: disable=broad-exception-caught + # Never fall back to a shared cache: it could serve another user's values. + logger.error("MCP cache_by failed: %s", e, exc_info=True) + return JSONRPCError( + jsonrpc="2.0", + id=request_id, + error=ErrorData(code=-32603, message=f"cache_by failed: {e}"), + ).model_dump(exclude_none=True) # pylint: disable-next=protected-access - token = app._mcp_callback_map.set(CallbackAdapterCollection(app)) + token = app._mcp_callback_map.set(collection) try: return _dispatch_mcp_message(method, params, request_id) finally: app._mcp_callback_map.reset(token) # pylint: disable=protected-access +def _callback_map_for_request(app: Dash) -> CallbackAdapterCollection: + """Return the cached adapter collection for this request's cache_by key. + + The adapters lazily cache values computed in the request that first reads + them, so requests only share a collection when their cache_by values match. + """ + # pylint: disable-next=protected-access + cache_by = _configure._current_config["cache_by"] or [] + cache_key = str([fn() for fn in cache_by]) + # pylint: disable=protected-access + with app._mcp_callback_maps_lock: + maps = app._mcp_callback_maps + collection = maps.get(cache_key) + if collection is None: + collection = CallbackAdapterCollection(app) + maps[cache_key] = collection + if len(maps) > _MAX_CACHED_CALLBACK_MAPS: + maps.popitem(last=False) + else: + maps.move_to_end(cache_key) + return collection + + def _dispatch_mcp_message( method: str, params: dict[str, Any], request_id: str | int ) -> dict[str, Any] | None: diff --git a/tests/backend_tests/test_fastapi_before_request.py b/tests/backend_tests/test_fastapi_before_request.py index bd9566cfd6..b094bbcd7f 100644 --- a/tests/backend_tests/test_fastapi_before_request.py +++ b/tests/backend_tests/test_fastapi_before_request.py @@ -144,3 +144,46 @@ def test_fabr003_hook_gates_websocket_handshake(): "/_dash-ws-callback", headers={**origin, "authorization": "good"} ): pass + + +@pytest.mark.parametrize( + "returned, status", + [ + (("blocked", {"X-Blocked": "1"}), 200), + (("blocked", [("X-Blocked", "1")]), 200), + (("blocked", "403 FORBIDDEN", {"X-Blocked": "1"}), 403), + ], +) +def test_fabr004_hook_returns_flask_style_tuples(returned, status): + from starlette.testclient import TestClient + + app = Dash(__name__, backend="fastapi") + app.layout = html.Div("layout") + app.backend.before_request(lambda: returned) + + with TestClient(app.server) as client: + r = client.get("/_dash-layout") + assert r.status_code == status + assert r.text == "blocked" + assert r.headers["X-Blocked"] == "1" + + +def test_fabr005_failing_hook_logs_and_rejects_websocket(caplog): + from starlette.testclient import TestClient + from starlette.websockets import WebSocketDisconnect + + app = Dash(__name__, backend="fastapi", websocket_callbacks=True) + app.layout = html.Div("layout") + + def broken(): + raise ValueError("hook bug") + + app.backend.before_request(broken) + + with TestClient(app.server) as client: + with pytest.raises(WebSocketDisconnect): + with client.websocket_connect( + "/_dash-ws-callback", headers={"origin": "http://testserver"} + ): + pass + assert "hook bug" in caplog.text diff --git a/tests/backend_tests/test_quart_before_request.py b/tests/backend_tests/test_quart_before_request.py new file mode 100644 index 0000000000..a8ae31fdb7 --- /dev/null +++ b/tests/backend_tests/test_quart_before_request.py @@ -0,0 +1,37 @@ +"""before_request hooks on the Quart backend also gate the WebSocket handshake.""" +import asyncio + +import pytest + +from dash import Dash, html + +pytest.importorskip("quart") + + +def test_qbr001_hook_gates_websocket_handshake(): + from quart.testing import WebsocketResponseError + + app = Dash(__name__, backend="quart", websocket_callbacks=True) + app.layout = html.Div("layout") + app.backend.before_request( + lambda: None + if app.backend.request_adapter().headers.get("authorization") == "good" + else ("denied", 401) + ) + origin = {"origin": "http://localhost"} + + async def connect(headers): + client = app.server.test_client() + try: + async with client.websocket("/_dash-ws-callback", headers=headers) as ws: + # The test client only surfaces a rejected handshake on receive. + try: + await asyncio.wait_for(ws.receive(), 1) + except asyncio.TimeoutError: + pass + return "accepted" + except WebsocketResponseError as err: + return err.response.status_code + + assert asyncio.run(connect(origin)) == 401 + assert asyncio.run(connect({**origin, "authorization": "good"})) == "accepted" diff --git a/tests/integration/mcp/test_mcp_request_isolation.py b/tests/integration/mcp/test_mcp_request_isolation.py index 5493bf0803..52bfc73837 100644 --- a/tests/integration/mcp/test_mcp_request_isolation.py +++ b/tests/integration/mcp/test_mcp_request_isolation.py @@ -1,5 +1,6 @@ -"""Values the MCP server computes from one caller's request must not be served -to another caller.""" +"""The MCP server caches tool descriptions and initial values. With +``cache_by`` keyed on the user, values computed for one user are not served to +another.""" import base64 import json @@ -7,6 +8,7 @@ import flask from dash import Dash, Input, Output, dcc, html +from dash.mcp import configure_mcp_server USERS = {"alice": "pw-a", "bob": "pw-b"} SECRETS = {"alice": "alice-secret-111", "bob": "bob-secret-222"} @@ -39,8 +41,9 @@ def _rpc(client, user, method, params=None): return json.dumps(r.get_json()) -def test_mcpi001_callback_initial_output_is_per_request(): +def test_mcpi001_callback_initial_output_is_per_user(): app = Dash(__name__, enable_mcp=True) + configure_mcp_server(cache_by=lambda: flask.g.user) app.layout = html.Div( [ dcc.Location(id="url"), @@ -80,8 +83,9 @@ def summarize(profile, note): assert SECRETS["alice"] not in bob_tools -def test_mcpi002_layout_function_values_are_per_request(): +def test_mcpi002_layout_function_values_are_per_user(): app = Dash(__name__, enable_mcp=True, suppress_callback_exceptions=True) + configure_mcp_server(cache_by=[lambda: flask.g.user]) def serve_layout(): user = getattr(flask.g, "user", None) if flask.has_app_context() else None @@ -102,3 +106,41 @@ def use_key(apikey): bob_tools = _rpc(client, "bob", "tools/list") assert SECRETS["alice"] not in bob_tools assert SECRETS["bob"] in bob_tools + + +def test_mcpi003_cache_is_reused_across_requests(): + app = Dash(__name__, enable_mcp=True) + app.layout = html.Div([dcc.Input(id="in", value="x"), html.Div(id="out")]) + _add_basic_auth(app) + runs = [] + + @app.callback(Output("out", "children"), Input("in", "value")) + def echo(value): + runs.append(value) + return value + + client = app.server.test_client() + get_out = {"name": "get_dash_component", "arguments": {"component_id": "out"}} + _rpc(client, "alice", "tools/call", get_out) + _rpc(client, "bob", "tools/call", get_out) + _rpc(client, "alice", "tools/list") + assert len(runs) == 1 + + +def test_mcpi004_failing_cache_by_returns_error(): + app = Dash(__name__, enable_mcp=True) + app.layout = html.Div([dcc.Input(id="in", value="x"), html.Div(id="out")]) + _add_basic_auth(app) + + def broken(): + raise KeyError("no user") + + configure_mcp_server(cache_by=broken) + + @app.callback(Output("out", "children"), Input("in", "value")) + def echo(value): + return value + + body = json.loads(_rpc(app.server.test_client(), "alice", "tools/list")) + assert body["error"]["code"] == -32603 + assert "result" not in body diff --git a/tests/integration/security/test_background_isolation.py b/tests/integration/security/test_background_isolation.py index 34ff507c0b..421af8c867 100644 --- a/tests/integration/security/test_background_isolation.py +++ b/tests/integration/security/test_background_isolation.py @@ -119,3 +119,31 @@ def render(_value): out = _poll_until_done(client, end_id, _body("public"), public) assert "public stats" in out assert "admin payroll" not in out + + +def test_bgiso003_unread_results_expire_without_cache_by(): + manager = DiskcacheManager(diskcache.Cache(tempfile.mkdtemp())) + app = Dash(__name__, background_callback_manager=manager) + app.layout = html.Div([dcc.Input(id="in-x", value="go"), html.Div(id="out-x")]) + + @app.callback( + Output("out-x", "children"), + Input("in-x", "value"), + background=True, + prevent_initial_call=True, + ) + def slow(value): + return value + + client = app.server.test_client() + handles = _start(client, _end_id(client), _body("x")) + raw_key = handles["cacheKey"].split("~")[0] + + # Nobody polls (the page was closed): the stored result must still expire. + for _ in range(50): + _, expire_time = manager.handle.get(raw_key, expire_time=True) + if expire_time is not None: + break + time.sleep(0.2) + remaining = expire_time - time.time() + assert 0 < remaining <= manager.UNCACHED_RESULT_EXPIRE diff --git a/tests/integration/security/test_xss.py b/tests/integration/security/test_xss.py index bc52d426d6..0f877a5370 100644 --- a/tests/integration/security/test_xss.py +++ b/tests/integration/security/test_xss.py @@ -143,3 +143,17 @@ def navigate(_bad, _good): dash_duo.find_element("#good").click() until(lambda: dash_duo.driver.current_url.endswith("/next"), timeout=5) + + +def test_xss006_base_href(dash_duo): + app = Dash() + app.layout = html.Div( + [ + html.Div("ready", id="ready"), + html.Base(href="javascript:alert(1)", id="base"), + ] + ) + + dash_duo.start_server(app) + dash_duo.wait_for_text_to_equal("#ready", "ready") + assert dash_duo.find_element("#base").get_attribute("href") == "about:blank" diff --git a/tests/unit/test_async_background_callback_job_fn.py b/tests/unit/test_async_background_callback_job_fn.py index de93c9c5ed..04ffa8d8e7 100644 --- a/tests/unit/test_async_background_callback_job_fn.py +++ b/tests/unit/test_async_background_callback_job_fn.py @@ -25,7 +25,7 @@ class FakeCache: def __init__(self): self.store = {} - def set(self, key, value): + def set(self, key, value, expire=None): # pylint: disable=unused-argument self.store[key] = value def get(self, key, default=None): From ae02ca2d7087520c59766c1758fa53cd308cc6cd Mon Sep 17 00:00:00 2001 From: philippe Date: Wed, 21 Oct 2026 10:58:26 -0400 Subject: [PATCH 14/20] Type the MCP config dict so mypy accepts the cache_by entry --- dash/mcp/_configure.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dash/mcp/_configure.py b/dash/mcp/_configure.py index 50dfcf69a2..e2cc15a4f7 100644 --- a/dash/mcp/_configure.py +++ b/dash/mcp/_configure.py @@ -6,7 +6,7 @@ from __future__ import annotations -from typing import Callable, List, Optional, Union +from typing import Any, Callable, Dict, List, Optional, Union from dash import get_app from dash.exceptions import AppNotFoundError @@ -32,7 +32,7 @@ _PAGE_RESOURCES = {PagesResource, PageLayoutResource} _LAYOUT_TOOLS = {GetDashComponentTool} -_DEFAULT_CONFIG = { +_DEFAULT_CONFIG: Dict[str, Any] = { "include_layout": True, "include_callbacks": True, "include_clientside_callbacks": True, @@ -40,7 +40,7 @@ "expose_callback_docstrings": False, "cache_by": [], } -_current_config = dict(_DEFAULT_CONFIG) +_current_config: Dict[str, Any] = dict(_DEFAULT_CONFIG) def configure_mcp_server( From 24ff68ca4894415ba39b2496e8ceb1698a45377a Mon Sep 17 00:00:00 2001 From: philippe Date: Wed, 21 Oct 2026 13:11:19 -0400 Subject: [PATCH 15/20] Make the MCP per-user cache limit configurable with cache_maxsize --- CHANGELOG.md | 2 +- dash/mcp/_configure.py | 11 ++++++++++ dash/mcp/_server.py | 6 ++---- .../mcp/test_mcp_request_isolation.py | 21 +++++++++++++++++++ 4 files changed, 35 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e01591625d..5a7de25dab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,7 +33,7 @@ This project adheres to [Semantic Versioning](https://semver.org/). - [#4075](https://github.com/plotly/dash/pull/4075) Background callbacks without `cache_by` no longer share a result between requests with equal inputs (unread Diskcache results now expire after a day, or after `expire` when set, even with `cache_by`), and callbacks with the same source no longer share a cache key. `build_cache_key` takes a new `callback_key` argument. - [#4075](https://github.com/plotly/dash/pull/4075) `dcc.Location(refresh=True).href`, `html.Area.href` and `html.Base.href` now block `javascript:` URLs like `html.A`. - [#4075](https://github.com/plotly/dash/pull/4075) Pages `path_template` matching no longer errors or backtracks badly on paths with a newline. -- [#4075](https://github.com/plotly/dash/pull/4075) Add `configure_mcp_server(cache_by=...)` so apps whose layout or callbacks depend on the user can keep the MCP server's cached tool descriptions and initial values per user. +- [#4075](https://github.com/plotly/dash/pull/4075) Add `configure_mcp_server(cache_by=..., cache_maxsize=...)` so apps whose layout or callbacks depend on the user can keep the MCP server's cached tool descriptions and initial values per user (128 users by default, `None` for no limit). - [#4027](https://github.com/plotly/dash/pull/4027) Support `async def` hook routes (`dash.hooks.route`) on all backends, stop hook routes from leaking the app context to the caller, and let hook routes and MCP read the request on the `fastapi` backend. - [#4053](https://github.com/plotly/dash/pull/4053) Fix callbacks being registered twice under a reloader (e.g. `uvicorn --reload`) when `Dash()` is given an explicit `name` or is built by an app factory called from the main module. Fixes [#3912](https://github.com/plotly/dash/issues/3912). - [#3980](https://github.com/plotly/dash/pull/3980) Fix the three `before_request` hooks (`Dash._setup_server` and the pages `router_sync` / `router_async`) publishing their "already done" guard flag before the setup work behind it had run. Under a multi-threaded WSGI worker such as `gunicorn -k gthread` (or under an ASGI worker for the async router), a second request arriving mid-setup could observe the flag already set, skip setup, then read `registered_paths` / `callback_map` / the pages router callback while they were still being registered - causing the first burst of component bundle requests after a restart to 500 with `Error loading dependency. "" is not a registered library`, or the pages router to hit `DuplicateCallback` when two workers raced past the guard. Each hook body now runs under a lock (`threading.Lock` for the two sync hooks, an `asyncio.Lock` bound to the running loop for the async router) and only publishes the flag after all work completes. Fixes [#3971](https://github.com/plotly/dash/issues/3971). diff --git a/dash/mcp/_configure.py b/dash/mcp/_configure.py index e2cc15a4f7..698f5b1d3e 100644 --- a/dash/mcp/_configure.py +++ b/dash/mcp/_configure.py @@ -39,9 +39,13 @@ "include_pages": True, "expose_callback_docstrings": False, "cache_by": [], + "cache_maxsize": 128, } _current_config: Dict[str, Any] = dict(_DEFAULT_CONFIG) +# None is a meaningful cache_maxsize (no limit), so "not passed" needs its own value. +_UNSET: Any = object() + def configure_mcp_server( *, @@ -51,6 +55,7 @@ def configure_mcp_server( include_pages: Optional[bool] = None, expose_callback_docstrings: Optional[bool] = None, cache_by: Optional[Union[Callable[[], object], List[Callable[[], object]]]] = None, + cache_maxsize: Optional[int] = _UNSET, ) -> None: """ Configure which content the Dash MCP server exposes. @@ -78,6 +83,10 @@ def configure_mcp_server( callbacks depend on who is asking, pass a function that returns the user or session id (a string or int) so each user gets their own values, the same way ``cache_by`` works for background callbacks. + :param cache_maxsize: How many ``cache_by`` keys (for example users) keep + a cache at once; the least recently used is dropped past that. + Defaults to ``128``. ``None`` keeps every key for the life of the + process. Example — expose only ``@mcp_enabled``-decorated functions:: @@ -107,6 +116,8 @@ def configure_mcp_server( _current_config.update( {key: value for key, value in passed.items() if value is not None} ) + if cache_maxsize is not _UNSET: + _current_config["cache_maxsize"] = cache_maxsize CallbackTools.callbacks_mcp_enabled_by_default = _current_config[ "include_callbacks" diff --git a/dash/mcp/_server.py b/dash/mcp/_server.py index 3284c8eb62..c314c8d5d4 100644 --- a/dash/mcp/_server.py +++ b/dash/mcp/_server.py @@ -47,9 +47,6 @@ logger = logging.getLogger(__name__) -# Bounds memory when cache_by yields one key per user. -_MAX_CACHED_CALLBACK_MAPS = 128 - def enable_mcp_server(app: Dash, mcp_path: str) -> None: """Add MCP routes to a Dash app.""" @@ -298,7 +295,8 @@ def _callback_map_for_request(app: Dash) -> CallbackAdapterCollection: if collection is None: collection = CallbackAdapterCollection(app) maps[cache_key] = collection - if len(maps) > _MAX_CACHED_CALLBACK_MAPS: + maxsize = _configure._current_config["cache_maxsize"] + if maxsize is not None and len(maps) > maxsize: maps.popitem(last=False) else: maps.move_to_end(cache_key) diff --git a/tests/integration/mcp/test_mcp_request_isolation.py b/tests/integration/mcp/test_mcp_request_isolation.py index 52bfc73837..4d3e723ecd 100644 --- a/tests/integration/mcp/test_mcp_request_isolation.py +++ b/tests/integration/mcp/test_mcp_request_isolation.py @@ -6,6 +6,7 @@ import json import flask +import pytest from dash import Dash, Input, Output, dcc, html from dash.mcp import configure_mcp_server @@ -144,3 +145,23 @@ def echo(value): body = json.loads(_rpc(app.server.test_client(), "alice", "tools/list")) assert body["error"]["code"] == -32603 assert "result" not in body + + +@pytest.mark.parametrize("maxsize, expected_runs", [(1, 3), (None, 2)]) +def test_mcpi005_cache_maxsize(maxsize, expected_runs): + app = Dash(__name__, enable_mcp=True) + app.layout = html.Div([dcc.Input(id="in", value="x"), html.Div(id="out")]) + _add_basic_auth(app) + configure_mcp_server(cache_by=lambda: flask.g.user, cache_maxsize=maxsize) + runs = [] + + @app.callback(Output("out", "children"), Input("in", "value")) + def echo(value): + runs.append(value) + return value + + client = app.server.test_client() + get_out = {"name": "get_dash_component", "arguments": {"component_id": "out"}} + for user in ("alice", "bob", "alice"): + _rpc(client, user, "tools/call", get_out) + assert len(runs) == expected_runs From 843514e14971ecba922c0068a8203896455bcab6 Mon Sep 17 00:00:00 2001 From: philippe Date: Thu, 22 Oct 2026 10:10:30 -0400 Subject: [PATCH 16/20] Bump selenium to 4.50.0 and mimesis to 22.2.0 --- requirements/ci.txt | 2 +- requirements/testing.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements/ci.txt b/requirements/ci.txt index 4ea6288186..af242627b2 100644 --- a/requirements/ci.txt +++ b/requirements/ci.txt @@ -6,7 +6,7 @@ flask-talisman==1.1.0 httpx # fastapi.testclient (tests/websocket/test_ws_stream.py) ipython<9.0.0 mimesis<=11.1.0; python_version < "3.10" -mimesis<=21.0.0; python_version >= "3.10" +mimesis<=22.2.0; python_version >= "3.10" mock==5.2.0 numpy<=2.5.4 orjson>=3.10.11 diff --git a/requirements/testing.txt b/requirements/testing.txt index eadde6ec98..65f2866db0 100644 --- a/requirements/testing.txt +++ b/requirements/testing.txt @@ -5,7 +5,7 @@ lxml>=4.6.2 percy-python-selenium>=1.0.0 pytest>=6.0.2 requests[security]>=2.21.0 -selenium>=4.11.0,<=4.49.0 +selenium>=4.11.0,<=4.50.0 waitress>=1.4.4 multiprocess>=0.70.12 psutil>=5.8.0 From 026514a79b90a4379603e6ae43ec1b2eef16787f Mon Sep 17 00:00:00 2001 From: philippe Date: Fri, 23 Oct 2026 09:27:38 -0400 Subject: [PATCH 17/20] version 4.5.0rc2 --- dash/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dash/version.py b/dash/version.py index 0bee7884c6..025e8a2c5c 100644 --- a/dash/version.py +++ b/dash/version.py @@ -1 +1 @@ -__version__ = "4.5.0rc1" +__version__ = "4.5.0rc2" From 5351c639112734a7a01a86ce845b475f006536e7 Mon Sep 17 00:00:00 2001 From: philippe Date: Fri, 23 Oct 2026 09:27:40 -0400 Subject: [PATCH 18/20] Bump npm package versions for 4.5.0rc2 rc1 published dcc/html 4.5.1, dash-table 7.5.1 and dash-renderer 3.5.1 to npm, so the packages move to the next patch for rc2. --- components/dash-core-components/package-lock.json | 4 ++-- components/dash-core-components/package.json | 2 +- components/dash-html-components/package-lock.json | 4 ++-- components/dash-html-components/package.json | 2 +- components/dash-table/package-lock.json | 4 ++-- components/dash-table/package.json | 2 +- dash/_dash_renderer.py | 4 ++-- dash/dash-renderer/package-lock.json | 4 ++-- dash/dash-renderer/package.json | 2 +- 9 files changed, 14 insertions(+), 14 deletions(-) diff --git a/components/dash-core-components/package-lock.json b/components/dash-core-components/package-lock.json index 7694840eb7..c4da37688e 100644 --- a/components/dash-core-components/package-lock.json +++ b/components/dash-core-components/package-lock.json @@ -1,12 +1,12 @@ { "name": "dash-core-components", - "version": "4.5.1", + "version": "4.5.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "dash-core-components", - "version": "4.5.1", + "version": "4.5.2", "license": "MIT", "dependencies": { "@fortawesome/fontawesome-svg-core": "1.2.36", diff --git a/components/dash-core-components/package.json b/components/dash-core-components/package.json index 3b1c929a3f..67011908dd 100644 --- a/components/dash-core-components/package.json +++ b/components/dash-core-components/package.json @@ -1,6 +1,6 @@ { "name": "dash-core-components", - "version": "4.5.1", + "version": "4.5.2", "description": "Core component suite for Dash", "repository": { "type": "git", diff --git a/components/dash-html-components/package-lock.json b/components/dash-html-components/package-lock.json index 67b6360b6f..acf014de05 100644 --- a/components/dash-html-components/package-lock.json +++ b/components/dash-html-components/package-lock.json @@ -1,12 +1,12 @@ { "name": "dash-html-components", - "version": "4.5.1", + "version": "4.5.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "dash-html-components", - "version": "4.5.1", + "version": "4.5.2", "license": "MIT", "dependencies": { "prop-types": "^15.8.1", diff --git a/components/dash-html-components/package.json b/components/dash-html-components/package.json index 485de51b27..c8a91b33f9 100644 --- a/components/dash-html-components/package.json +++ b/components/dash-html-components/package.json @@ -1,6 +1,6 @@ { "name": "dash-html-components", - "version": "4.5.1", + "version": "4.5.2", "description": "Vanilla HTML components for Dash", "main": "lib/index.js", "repository": { diff --git a/components/dash-table/package-lock.json b/components/dash-table/package-lock.json index 56f628c31a..0eb13e3678 100644 --- a/components/dash-table/package-lock.json +++ b/components/dash-table/package-lock.json @@ -1,12 +1,12 @@ { "name": "dash-table", - "version": "7.5.1", + "version": "7.5.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "dash-table", - "version": "7.5.1", + "version": "7.5.2", "license": "MIT", "devDependencies": { "@babel/cli": "^7.28.6", diff --git a/components/dash-table/package.json b/components/dash-table/package.json index f03bb77173..5552ef209a 100644 --- a/components/dash-table/package.json +++ b/components/dash-table/package.json @@ -1,6 +1,6 @@ { "name": "dash-table", - "version": "7.5.1", + "version": "7.5.2", "description": "Dash table", "repository": { "type": "git", diff --git a/dash/_dash_renderer.py b/dash/_dash_renderer.py index 53849fac0d..dbc8b78518 100644 --- a/dash/_dash_renderer.py +++ b/dash/_dash_renderer.py @@ -1,7 +1,7 @@ import os from typing import Any, List, Dict -__version__ = "3.5.1" +__version__ = "3.5.2" _available_react_versions = {"18.3.1", "18.2.0", "19.2.4"} _available_reactdom_versions = {"18.3.1", "18.2.0", "19.2.4"} @@ -85,7 +85,7 @@ def _set_react_version(v_react, v_reactdom=None): { "relative_package_path": "dash-renderer/build/dash_renderer.min.js", "dev_package_path": "dash-renderer/build/dash_renderer.dev.js", - "external_url": "https://unpkg.com/dash-renderer@3.5.1" + "external_url": "https://unpkg.com/dash-renderer@3.5.2" "/build/dash_renderer.min.js", "namespace": "dash", }, diff --git a/dash/dash-renderer/package-lock.json b/dash/dash-renderer/package-lock.json index db837bdf0c..dd04896cb7 100644 --- a/dash/dash-renderer/package-lock.json +++ b/dash/dash-renderer/package-lock.json @@ -1,12 +1,12 @@ { "name": "dash-renderer", - "version": "3.5.1", + "version": "3.5.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "dash-renderer", - "version": "3.5.1", + "version": "3.5.2", "license": "MIT", "dependencies": { "@babel/polyfill": "^7.12.1", diff --git a/dash/dash-renderer/package.json b/dash/dash-renderer/package.json index 3897a96ccf..e7875a6c10 100644 --- a/dash/dash-renderer/package.json +++ b/dash/dash-renderer/package.json @@ -1,6 +1,6 @@ { "name": "dash-renderer", - "version": "3.5.1", + "version": "3.5.2", "description": "render dash components in react", "main": "build/dash_renderer.min.js", "scripts": { From 759cff45f2a42e267ca932fa930fae4967deeeae Mon Sep 17 00:00:00 2001 From: philippe Date: Fri, 23 Oct 2026 09:27:41 -0400 Subject: [PATCH 19/20] Add missing CHANGELOG entry for #4052 --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 61402396aa..ec744d19e4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,6 +36,7 @@ This project adheres to [Semantic Versioning](https://semver.org/). - [#4075](https://github.com/plotly/dash/pull/4075) `dcc.Location(refresh=True).href`, `html.Area.href` and `html.Base.href` now block `javascript:` URLs like `html.A`. - [#4075](https://github.com/plotly/dash/pull/4075) Pages `path_template` matching no longer errors or backtracks badly on paths with a newline. - [#4075](https://github.com/plotly/dash/pull/4075) Add `configure_mcp_server(cache_by=..., cache_maxsize=...)` so apps whose layout or callbacks depend on the user can keep the MCP server's cached tool descriptions and initial values per user (128 users by default, `None` for no limit). +- [#4052](https://github.com/plotly/dash/pull/4052) Fix callbacks of removed components still firing after a callback returns `None` for `children`: the renderer now clears their paths. Fixes [#4033](https://github.com/plotly/dash/issues/4033). - [#4027](https://github.com/plotly/dash/pull/4027) Support `async def` hook routes (`dash.hooks.route`) on all backends, stop hook routes from leaking the app context to the caller, and let hook routes and MCP read the request on the `fastapi` backend. - [#4053](https://github.com/plotly/dash/pull/4053) Fix callbacks being registered twice under a reloader (e.g. `uvicorn --reload`) when `Dash()` is given an explicit `name` or is built by an app factory called from the main module. Fixes [#3912](https://github.com/plotly/dash/issues/3912). - [#3980](https://github.com/plotly/dash/pull/3980) Fix the three `before_request` hooks (`Dash._setup_server` and the pages `router_sync` / `router_async`) publishing their "already done" guard flag before the setup work behind it had run. Under a multi-threaded WSGI worker such as `gunicorn -k gthread` (or under an ASGI worker for the async router), a second request arriving mid-setup could observe the flag already set, skip setup, then read `registered_paths` / `callback_map` / the pages router callback while they were still being registered - causing the first burst of component bundle requests after a restart to 500 with `Error loading dependency. "" is not a registered library`, or the pages router to hit `DuplicateCallback` when two workers raced past the guard. Each hook body now runs under a lock (`threading.Lock` for the two sync hooks, an `asyncio.Lock` bound to the running loop for the async router) and only publishes the flag after all work completes. Fixes [#3971](https://github.com/plotly/dash/issues/3971). From 06ca46dab2634f3896dc4214012621e2d67f4c95 Mon Sep 17 00:00:00 2001 From: philippe Date: Fri, 23 Oct 2026 11:14:32 -0400 Subject: [PATCH 20/20] Version 4.5.0rc2 build artifacts --- dash/dash-renderer/build/dash_renderer.dev.js | 4 ++-- dash/dash-renderer/build/dash_renderer.min.js | 2 +- dash/dash_table/bundle.js | 2 +- dash/dash_table/bundle.js.map | 2 +- dash/dash_table/demo.js | 2 +- dash/dash_table/demo.js.map | 2 +- dash/dash_table/package-info.json | 2 +- dash/dcc/dash_core_components.js | 2 +- dash/dcc/dash_core_components.js.map | 2 +- dash/dcc/package-info.json | 2 +- dash/html/dash_html_components.min.js | 2 +- dash/html/dash_html_components.min.js.map | 2 +- dash/html/package-info.json | 2 +- 13 files changed, 14 insertions(+), 14 deletions(-) diff --git a/dash/dash-renderer/build/dash_renderer.dev.js b/dash/dash-renderer/build/dash_renderer.dev.js index 0ac23a1363..b6d303ea98 100644 --- a/dash/dash-renderer/build/dash_renderer.dev.js +++ b/dash/dash-renderer/build/dash_renderer.dev.js @@ -3480,7 +3480,7 @@ var observer = { } else { var childrenPropPath = childrenProp.split('.'); var children = (0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(childrenPropPath, appliedProps); - if (!children) { + if (children === undefined) { return; } var oldChildrenPath = (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])((0,_actions_paths__WEBPACK_IMPORTED_MODULE_14__.getPath)(oldPaths, parsedId), ['props'].concat(childrenPropPath)); @@ -94993,4 +94993,4 @@ window.DashRenderer = _DashRenderer__WEBPACK_IMPORTED_MODULE_1__.DashRenderer; window.dash_renderer = __webpack_exports__; /******/ })() ; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQzs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0M7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQzs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0M7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQzs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0M7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQzs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0M7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQzs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0M7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQzs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0M7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQzs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCOztBQUVsQixnQ0FBZ0M7O0FBRWhD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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQzs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0M7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQzs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0M7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQzs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0M7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQzs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0M7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQzs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7OztBQ3ZCWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUFjLG1CQUFtQjtBQUNqQztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsY0FBYyxjQUFjO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0IsY0FBYztBQUNoQztBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzRUFBc0UsbUNBQW1DOztBQUV6RztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQixnQkFBZ0I7QUFDbEM7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQSxrQkFBa0IsT0FBTztBQUN6QjtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFOztBQUVGOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUJBQWlCLFlBQVk7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUNqZUE7QUFDQSxrQkFBa0IsbUJBQU8sQ0FBQyx5RUFBWTs7QUFFdEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU8sMkJBQTJCO0FBQ2xDLE9BQU8sMkJBQTJCO0FBQ2xDLE9BQU8sMkJBQTJCO0FBQ2xDLE9BQU8sMkJBQTJCO0FBQ2xDLFFBQVEsNEJBQTRCO0FBQ3BDLE9BQU8sMkJBQTJCO0FBQ2xDLE9BQU8sMkJBQTJCO0FBQ2xDLE9BQU8sMkJBQTJCO0FBQ2xDLE9BQU8sNkJBQTZCO0FBQ3BDLFdBQVcsaUNBQWlDO0FBQzVDLFVBQVUsZ0NBQWdDO0FBQzFDLFdBQVcsaUNBQWlDO0FBQzVDLE9BQU8scUNBQXFDO0FBQzVDLFNBQVMsMkNBQTJDO0FBQ3BELFFBQVE7QUFDUjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRCxnQkFBZ0I7QUFDckUsbURBQW1ELGNBQWM7QUFDakU7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxpQkFBaUIsT0FBTztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsd0JBQXdCOztBQUV4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsT0FBTyxRQUFRO0FBQ2hDLGlCQUFpQixPQUFPLFFBQVE7QUFDaEMsa0JBQWtCLE9BQU8sT0FBTztBQUNoQyxrQkFBa0IsT0FBTyxPQUFPO0FBQ2hDLGlCQUFpQixRQUFRLE9BQU87QUFDaEMsaUJBQWlCLFFBQVEsT0FBTztBQUNoQzs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1RUFBdUU7O0FBRXZFOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwrQ0FBK0MsRUFBRSxVQUFVLEVBQUU7QUFDN0Q7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxrQkFBa0Isa0JBQWtCO0FBQ3BDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCLGtCQUFrQjtBQUNwQzs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0IsOEJBQThCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtCQUFrQiw4QkFBOEI7O0FBRWhEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9CQUFvQixnQkFBZ0I7QUFDcEM7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsb0JBQW9CLHFCQUFxQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0Isa0NBQWtDO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQiw4QkFBOEI7QUFDaEQ7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLCtCQUErQixrQkFBa0I7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0Isa0JBQWtCO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLGtCQUFrQjtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixrQkFBa0I7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLDJCQUEyQjtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxPQUFPOztBQUVQO0FBQ0EsMENBQTBDLGdDQUFtQjs7OztBQUk3RCxtQkFBbUIsZ0NBQW1CO0FBQ3RDLFlBQVksZ0NBQW1COztBQUUvQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGtCQUFrQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsT0FBTzs7QUFFUDtBQUNBLDBDQUEwQyxnQ0FBbUI7Ozs7QUFJN0QsbUNBQW1DLDBCQUEwQiwwQ0FBMEMsZ0JBQWdCLE9BQU8sb0JBQW9CLGVBQWUsT0FBTzs7QUFFeEssb0JBQW9CLGdDQUFtQjtBQUN2QyxpQkFBaUIsZ0NBQW1CO0FBQ3BDLGFBQWEsZ0NBQW1CO0FBQ2hDLFVBQVUsZ0NBQW1COztBQUU3Qjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHFCQUFxQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLGFBQWE7QUFDYjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUwsYUFBYTtBQUNiOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNkRBQTZELGdFQUFnRTtBQUM3SDs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSzs7QUFFTCxpQ0FBaUM7QUFDakMsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSx5REFBeUQ7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG9FQUFvRSxtRUFBbUU7QUFDdkk7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxzRUFBc0UsbUVBQW1FO0FBQ3pJOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0Esc0VBQXNFLG1FQUFtRTtBQUN6STs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0EsdUJBQXVCLHVCQUF1QjtBQUM5QztBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sd0JBQXdCLHdCQUF3QjtBQUNoRDtBQUNBO0FBQ0EsTUFBTTtBQUNOLHdCQUF3Qix3QkFBd0I7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkMsMkRBQTJEO0FBQ3RHLE9BQU87QUFDUCxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSx5Q0FBeUMsMkRBQTJEO0FBQ3BHLE9BQU87QUFDUCxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBLHlCQUF5QjtBQUN6Qix5QkFBeUI7QUFDekIsc0NBQXNDO0FBQ3RDLDhCQUE4QjtBQUM5QjtBQUNBLHVCQUF1QjtBQUN2QixpQ0FBaUM7QUFDakMsdUJBQXVCOztBQUV2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEMsb0VBQW9FO0FBQzlHLFVBQVU7QUFDVixzQ0FBc0Msb0VBQW9FO0FBQzFHO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EseUNBQXlDLG1FQUFtRTtBQUM1RyxVQUFVO0FBQ1YscUNBQXFDLG1FQUFtRTtBQUN4RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLDJHQUEyRzs7QUFFM0c7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7O0FBRUEsNEJBQTRCLDRCQUE0QjtBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLDJHQUEyRzs7QUFFM0c7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7O0FBRUEsNEJBQTRCLDhCQUE4QjtBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IseUJBQXlCO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1ELGtDQUFrQztBQUNyRixjQUFjO0FBQ2Q7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1ELGtDQUFrQztBQUNyRjtBQUNBLFdBQVc7QUFDWCxTQUFTOztBQUVUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrRUFBa0U7QUFDbEUsa0VBQWtFOztBQUVsRTtBQUNBLHdCQUF3QixvQ0FBb0M7QUFDNUQ7QUFDQTtBQUNBOztBQUVBO0FBQ0EsdUdBQXVHO0FBQ3ZHLDJDQUEyQztBQUMzQyx5RkFBeUY7O0FBRXpGO0FBQ0Esd0JBQXdCLHdCQUF3QjtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxnQ0FBZ0M7QUFDaEM7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSx5R0FBeUc7O0FBRXpHO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7O0FBRUEsMEJBQTBCLHFCQUFxQjtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSx5R0FBeUc7O0FBRXpHO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7O0FBRUEsMkJBQTJCLHNCQUFzQjtBQUNqRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTs7QUFFQSwrQkFBK0IsaUNBQWlDO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBOztBQUVBLCtCQUErQixtQ0FBbUM7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCO0FBQy9CLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0IsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx1RUFBdUUsbUVBQW1FO0FBQzFJOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFNBQVM7O0FBRVQ7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFlBQVk7QUFDWjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EseUZBQXlGLG1FQUFtRTtBQUM1Sjs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixZQUFZO0FBQ1o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHVGQUF1RixtRUFBbUU7QUFDMUo7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBLHFCQUFxQix3QkFBd0I7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLE9BQU87O0FBRVA7QUFDQTs7QUFFQTs7QUFFQSxPQUFPOztBQUVQLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLGlDQUFtQjtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlFQUFpRSxpQ0FBbUI7QUFDcEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLDBCQUFtQixHQUFHLGlDQUFtQjtBQUN2RDtBQUNBLGlCQUFpQiwwQkFBbUI7QUFDcEMsVUFBVTtBQUNWO0FBQ0EsQ0FBQyxFOzs7Ozs7Ozs7Ozs7Ozs7O0FDN29HRDtBQUNnSDtBQUNqQjtBQUMvRiw4QkFBOEIsbUZBQTJCLENBQUMsNEZBQXFDO0FBQy9GO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLGtHQUFrRyxVQUFVLFVBQVUsVUFBVSxVQUFVLFlBQVksV0FBVyxZQUFZLE1BQU0sS0FBSyxZQUFZLE1BQU0sS0FBSyxVQUFVLFVBQVUsWUFBWSxhQUFhLGFBQWEsV0FBVyxNQUFNLEtBQUssVUFBVSxLQUFLLEtBQUssVUFBVSxZQUFZLE1BQU0sS0FBSyxVQUFVLFlBQVksTUFBTSxLQUFLLFVBQVUsNENBQTRDLHNCQUFzQixtQkFBbUIsaUJBQWlCLHNCQUFzQix5QkFBeUIsb0JBQW9CLGlEQUFpRCxHQUFHLDBCQUEwQix5QkFBeUIsR0FBRyx5QkFBeUIscUJBQXFCLHNCQUFzQix3QkFBd0IseUJBQXlCLDRCQUE0QixtQkFBbUIsR0FBRywrQkFBK0IsaUJBQWlCLEdBQUcsMENBQTBDLHNCQUFzQixnQ0FBZ0MsR0FBRywwQ0FBMEMsc0JBQXNCLCtCQUErQixHQUFHLGdEQUFnRCxzQkFBc0IsR0FBRyxxQkFBcUI7QUFDdHBDO0FBQ0EsK0RBQWUsdUJBQXVCLEVBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDekN2QztBQUNtSDtBQUNqQjtBQUNsRyw4QkFBOEIsbUZBQTJCLENBQUMsNEZBQXFDO0FBQy9GO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxnSUFBZ0ksWUFBWSxXQUFXLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLFdBQVcsTUFBTSxPQUFPLE9BQU8sS0FBSyxZQUFZLGFBQWEsV0FBVyxVQUFVLFVBQVUsWUFBWSxXQUFXLFVBQVUsWUFBWSxhQUFhLGFBQWEsYUFBYSxPQUFPLEtBQUssVUFBVSxZQUFZLGFBQWEsYUFBYSxXQUFXLFlBQVksYUFBYSxPQUFPLEtBQUssWUFBWSxXQUFXLFVBQVUsd0RBQXdELHlCQUF5QixrQkFBa0IseUJBQXlCLGlDQUFpQyx1QkFBdUIsNkJBQTZCLDBCQUEwQiw0QkFBNEIsMktBQTJLLEdBQUcsOEJBQThCLHlCQUF5Qix5QkFBeUIsbUJBQW1CLG1CQUFtQixpQkFBaUIsbUNBQW1DLHNCQUFzQixxQkFBcUIsNkJBQTZCLDJDQUEyQyw2QkFBNkIsdUNBQXVDLEdBQUcsaUNBQWlDLG9CQUFvQiw2QkFBNkIsOEJBQThCLDBCQUEwQixtQkFBbUIsdUJBQXVCLHVDQUF1QyxHQUFHLHdDQUF3Qyx5QkFBeUIsZUFBZSxpQkFBaUIsR0FBRyxxQkFBcUI7QUFDeHBEO0FBQ0EsK0RBQWUsdUJBQXVCLEVBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDcER2QztBQUNtSDtBQUNqQjtBQUNsRyw4QkFBOEIsbUZBQTJCLENBQUMsNEZBQXFDO0FBQy9GO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxrSEFBa0gsVUFBVSxZQUFZLE9BQU8sS0FBSyxZQUFZLFdBQVcsVUFBVSxVQUFVLFVBQVUsVUFBVSxPQUFPLEtBQUssVUFBVSxPQUFPLEtBQUssWUFBWSxhQUFhLGFBQWEsYUFBYSxPQUFPLEtBQUssVUFBVSxVQUFVLFlBQVksYUFBYSxNQUFNLEtBQUssVUFBVSxVQUFVLFlBQVksV0FBVyxVQUFVLFlBQVksTUFBTSxLQUFLLFVBQVUsVUFBVSxVQUFVLE1BQU0sS0FBSyxPQUFPLE9BQU8sV0FBVyxLQUFLLEtBQUssWUFBWSxhQUFhLE1BQU0sS0FBSyxZQUFZLFdBQVcsWUFBWSxXQUFXLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sS0FBSyxZQUFZLE1BQU0sS0FBSyxZQUFZLGFBQWEsYUFBYSxPQUFPLEtBQUssVUFBVSxVQUFVLFVBQVUsWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLFdBQVcsT0FBTyxLQUFLLFlBQVksYUFBYSxZQUFZLFlBQVksYUFBYSxXQUFXLFVBQVUsWUFBWSxPQUFPLEtBQUssWUFBWSxPQUFPLEtBQUssWUFBWSxhQUFhLGFBQWEsT0FBTyxLQUFLLFlBQVksYUFBYSxhQUFhLE9BQU8sS0FBSyxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxPQUFPLEtBQUssWUFBWSxhQUFhLFdBQVcsVUFBVSxZQUFZLGFBQWEsT0FBTyxLQUFLLFVBQVUsT0FBTyxLQUFLLFVBQVUsVUFBVSxZQUFZLGFBQWEsV0FBVyxZQUFZLGFBQWEsT0FBTyxLQUFLLFlBQVksYUFBYSxXQUFXLFlBQVksYUFBYSxXQUFXLFlBQVksYUFBYSxXQUFXLEtBQUssS0FBSyxZQUFZLFdBQVcsVUFBVSxVQUFVLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxXQUFXLE1BQU0sS0FBSyxVQUFVLFVBQVUsWUFBWSxhQUFhLGFBQWEsV0FBVyxZQUFZLE9BQU8sT0FBTyxPQUFPLEtBQUssVUFBVSxVQUFVLFVBQVUsWUFBWSxXQUFXLFlBQVksYUFBYSxhQUFhLGFBQWEsTUFBTSxLQUFLLFVBQVUsT0FBTyxLQUFLLFVBQVUsT0FBTyxLQUFLLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE9BQU8sS0FBSyxZQUFZLGFBQWEsV0FBVyxZQUFZLGFBQWEsV0FBVyxVQUFVLE9BQU8sS0FBSyxLQUFLLFVBQVUsWUFBWSxhQUFhLGFBQWEsYUFBYSxNQUFNLEtBQUssVUFBVSxZQUFZLGFBQWEsYUFBYSxhQUFhLE1BQU0sMkNBQTJDLHNCQUFzQiwyQkFBMkIsR0FBRyw0QkFBNEIseUJBQXlCLGVBQWUsYUFBYSxxQkFBcUIsc0JBQXNCLHNCQUFzQixHQUFHLGtDQUFrQyxxQkFBcUIsR0FBRyxxQkFBcUIsdUJBQXVCLHVCQUF1Qix3QkFBd0IsNEJBQTRCLEdBQUcsZ0NBQWdDLGtCQUFrQixtQkFBbUIsNEJBQTRCLHlCQUF5QixHQUFHLDhCQUE4QixrQkFBa0IsbUJBQW1CLHlCQUF5QixrQkFBa0IsZ0JBQWdCLDRCQUE0QixHQUFHLDhCQUE4QixpQkFBaUIsbUJBQW1CLHNCQUFzQixHQUFHLHlDQUF5Qyx1TkFBdU4sR0FBRyw2QkFBNkIsMkJBQTJCLDBCQUEwQixHQUFHLHlCQUF5Qix1QkFBdUIsa0JBQWtCLHVCQUF1QixtQkFBbUIsd0JBQXdCLDRCQUE0Qiw4QkFBOEIsMEJBQTBCLHVCQUF1Qix3QkFBd0IsR0FBRyw2QkFBNkIseUJBQXlCLEdBQUcscUNBQXFDLHdDQUF3QyxvQ0FBb0MsZ0NBQWdDLEdBQUcsZ0NBQWdDLGdCQUFnQixxQkFBcUIsc0JBQXNCLGdDQUFnQyxnQ0FBZ0MsNkJBQTZCLGtDQUFrQyxtQ0FBbUMsb0JBQW9CLEdBQUcsMEJBQTBCLGdDQUFnQyx3QkFBd0Isb0JBQW9CLGdDQUFnQyxnQ0FBZ0MscUJBQXFCLHFCQUFxQiw0QkFBNEIsR0FBRyw0QkFBNEIseUJBQXlCLEdBQUcsZ0NBQWdDLGtDQUFrQyxtQ0FBbUMsK0JBQStCLEdBQUcsbUNBQW1DLHFDQUFxQyxzQ0FBc0MsZ0NBQWdDLEdBQUcsd0JBQXdCLGdDQUFnQyx1QkFBdUIsdUJBQXVCLHlFQUF5RSw0QkFBNEIsR0FBRyx5QkFBeUIsZ0NBQWdDLHVCQUF1QixrQkFBa0IscUJBQXFCLHdCQUF3Qix5QkFBeUIsR0FBRyx5QkFBeUIsbUJBQW1CLEdBQUcsc0JBQXNCLHFCQUFxQixzQkFBc0Isd0JBQXdCLDZCQUE2QixzQkFBc0IsK0NBQStDLDZCQUE2QixHQUFHLHNCQUFzQiw2QkFBNkIsNEJBQTRCLDZDQUE2QyxnREFBZ0Qsb0JBQW9CLHVCQUF1Qiw4QkFBOEIsa0JBQWtCLEdBQUcsaUNBQWlDLHlCQUF5QixrQkFBa0IsaUJBQWlCLHNCQUFzQix1QkFBdUIsZ0NBQWdDLHVCQUF1QixxQ0FBcUMsc0NBQXNDLG1CQUFtQixHQUFHLCtCQUErQixvQkFBb0IsbUJBQW1CLHVCQUF1Qix5QkFBeUIsOEJBQThCLHFCQUFxQix5QkFBeUIsMkpBQTJKLEdBQUcsOEJBQThCLGtCQUFrQixtQkFBbUIsb0JBQW9CLGtDQUFrQyxzQkFBc0IsMEJBQTBCLHlCQUF5QiwyQkFBMkIsdUJBQXVCLEdBQUcsNkJBQTZCLHNCQUFzQixHQUFHLHdDQUF3QyxxQkFBcUIsR0FBRywrQkFBK0IsNkJBQTZCLDhCQUE4Qix5QkFBeUIsMEJBQTBCLGtDQUFrQyx3QkFBd0IsR0FBRyx5QkFBeUIsMEJBQTBCLHlCQUF5QixvQkFBb0IscUNBQXFDLDBCQUEwQixtQkFBbUIsc0JBQXNCLEdBQUcsMENBQTBDLFlBQVkscUJBQXFCLHdDQUF3QyxxQ0FBcUMsb0NBQW9DLGdDQUFnQyxPQUFPLFVBQVUscUJBQXFCLHNDQUFzQyxtQ0FBbUMsa0NBQWtDLDhCQUE4QixPQUFPLEdBQUcscUJBQXFCO0FBQzN4TztBQUNBLCtEQUFlLHVCQUF1QixFQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQ3JQdkM7QUFDZ0g7QUFDakI7QUFDL0YsOEJBQThCLG1GQUEyQixDQUFDLDRGQUFxQztBQUMvRjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxpR0FBaUcsVUFBVSxPQUFPLEtBQUssS0FBSyxVQUFVLE1BQU0sS0FBSyxVQUFVLE1BQU0sc0NBQXNDLG9CQUFvQixHQUFHLHVCQUF1QixtQkFBbUIsd0JBQXdCLE9BQU8sbUJBQW1CLHlCQUF5QixPQUFPLEdBQUcscUJBQXFCO0FBQ3pYO0FBQ0EsK0RBQWUsdUJBQXVCLEVBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbkJ2QztBQUNtSDtBQUNqQjtBQUNsRyw4QkFBOEIsbUZBQTJCLENBQUMsNEZBQXFDO0FBQy9GO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8sMEdBQTBHLFlBQVksV0FBVyxVQUFVLFVBQVUsVUFBVSxZQUFZLGFBQWEsV0FBVyxZQUFZLGFBQWEsV0FBVyxVQUFVLFVBQVUsTUFBTSxLQUFLLFlBQVksT0FBTyxLQUFLLFVBQVUsVUFBVSxZQUFZLGFBQWEsV0FBVyxZQUFZLGFBQWEsYUFBYSxXQUFXLFVBQVUsVUFBVSxZQUFZLFdBQVcsVUFBVSxZQUFZLE9BQU8sS0FBSyxVQUFVLFlBQVksYUFBYSxXQUFXLFVBQVUsVUFBVSxZQUFZLGFBQWEsT0FBTyxLQUFLLFVBQVUsVUFBVSxVQUFVLFlBQVksYUFBYSxXQUFXLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE9BQU8sT0FBTyxPQUFPLEtBQUssWUFBWSxPQUFPLEtBQUssVUFBVSxZQUFZLE9BQU8sS0FBSyxZQUFZLE9BQU8sS0FBSyxVQUFVLFVBQVUsWUFBWSxhQUFhLGFBQWEsYUFBYSxXQUFXLFlBQVksYUFBYSxPQUFPLEtBQUssVUFBVSxVQUFVLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxPQUFPLEtBQUssVUFBVSxVQUFVLFlBQVksT0FBTyxLQUFLLFlBQVksV0FBVyxZQUFZLE9BQU8sS0FBSyxZQUFZLE9BQU8sS0FBSyxZQUFZLGFBQWEsV0FBVyxVQUFVLFVBQVUsVUFBVSxVQUFVLFlBQVksYUFBYSxXQUFXLFlBQVksYUFBYSxXQUFXLFlBQVksV0FBVyxZQUFZLE1BQU0sT0FBTyxhQUFhLE1BQU0sS0FBSyxVQUFVLE1BQU0sS0FBSyxZQUFZLE9BQU8sS0FBSyxZQUFZLGFBQWEsV0FBVyxVQUFVLFlBQVksYUFBYSxhQUFhLGFBQWEsV0FBVyxZQUFZLFdBQVcsT0FBTyxLQUFLLFVBQVUsWUFBWSxNQUFNLEtBQUssWUFBWSxNQUFNLEtBQUssVUFBVSxVQUFVLFlBQVksYUFBYSxhQUFhLFdBQVcsVUFBVSxLQUFLLEtBQUssVUFBVSxZQUFZLFdBQVcsTUFBTSxLQUFLLFVBQVUs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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHFDQUFxQyx5QkFBeUI7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCw0QkFBNEI7QUFDNUIsNEJBQTRCO0FBQzVCLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZEQUE2RDtBQUM3RCw2REFBNkQ7QUFDN0Q7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7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RztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FB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QTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLHdDQUF3QywrQzs7Ozs7Ozs7OztBQ2xDeEMsUUFBUSxtQkFBTyxDQUFDLHdEQUFXOztBQUUzQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxlQUFlO0FBQ3BEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNENBQTRDO0FBQzVDO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLDZCQUE2QjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDdkphOztBQUViLFFBQVEsbUJBQU8sQ0FBQyx1REFBVTs7QUFFMUI7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0VBQW9FLFdBQVc7QUFDL0U7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsYUFBYSxjQUFjO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLE9BQU87QUFDM0I7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsa0JBQWtCLE9BQU87QUFDekI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCLE9BQU87QUFDekI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLGtCQUFrQixPQUFPO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0IsT0FBTztBQUN6QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsVUFBVTtBQUM5QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsT0FBTztBQUNQO0FBQ0EsaUNBQWlDLGdDQUFtQjs7QUFFcEQ7OztBQUdBO0FBQ0EsWUFBWSxnQ0FBbUI7O0FBRS9CO0FBQ0EsV0FBVyxnQ0FBbUIsS0FBSztBQUNuQzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0Esb0JBQW9CLE9BQU87QUFDM0I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLG9CQUFvQixPQUFPO0FBQzNCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixPQUFPO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLG1CQUFtQjtBQUN2QztBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0IsT0FBTztBQUN6Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOztBQUVOO0FBQ0EsSUFBSTs7QUFFSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCLE9BQU87QUFDekI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQixPQUFPO0FBQ3pCOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCLDBCQUEwQjtBQUM1QztBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxPQUFPO0FBQ1A7QUFDQSxpQ0FBaUMsZ0NBQW1COztBQUVwRDs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFlBQVksZ0NBQW1COztBQUUvQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Es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QTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLENBQUM7O0FBRUQ7O0FBRUEsT0FBTztBQUNQO0FBQ0E7O0FBRUE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBLE9BQU87QUFDUDtBQUNBOztBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsT0FBTztBQUNQO0FBQ0E7O0FBRUE7OztBQUdBLHFHQUFxRyxxQkFBcUIsbUJBQW1COztBQUU3STs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLE9BQU87QUFDUDtBQUNBLGlDQUFpQyxnQ0FBbUI7O0FBRXBEOzs7QUFHQSxtQ0FBbUMsMEJBQTBCLDBDQUEwQyxnQkFBZ0IsT0FBTyxvQkFBb0IsZUFBZSxPQUFPOztBQUV4SyxzQkFBc0IsZ0NBQW1CO0FBQ3pDLG9CQUFvQixnQ0FBbUI7QUFDdkMsWUFBWSxnQ0FBbUI7QUFDL0IsWUFBWSxnQ0FBbUI7QUFDL0IsYUFBYSxnQ0FBbUI7QUFDaEMsYUFBYSxnQ0FBbUI7QUFDaEMsZ0JBQWdCLGdDQUFtQjtBQUNuQyxjQUFjLGdDQUFtQjs7QUFFakM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLHFCQUFxQjtBQUN6QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGtCQUFrQjtBQUN0QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGtCQUFrQjtBQUN4QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxzQkFBc0Isa0JBQWtCO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7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Q1A7QUFDQTs7QUFFQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1EQUFtRDs7QUFFbkQ7QUFDQSw4Q0FBOEM7O0FBRTlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDOztBQUVoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkM7QUFDM0Msc0VBQXNFO0FBQ3RFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0Es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QUNBO0FBQ0E7QUFDQSxNQUFNOztBQUVOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFROztBQUVSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FB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QUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksR0FBRztBQUNmLGNBQWMsU0FBUztBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksR0FBRztBQUNmLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLFVBQVU7QUFDdEIsWUFBWSxRQUFRO0FBQ3BCLFlBQVksUUFBUSxXQUFXO0FBQy9CLFlBQVksU0FBUztBQUNyQjtBQUNBLFlBQVksUUFBUTtBQUNwQjtBQUNBLFlBQVksU0FBUztBQUNyQjtBQUNBLGNBQWMsVUFBVTtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLGdEQUFnRCxpQkFBaUI7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsaUJBQWlCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FB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Q0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxjQUFjOztBQUVkOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5REFBeUQsbUNBQW1DLDBCQUEwQjtBQUN0SDtBQUNBLE9BQU87QUFDUDtBQUNBLHdDQUF3QyxXQUFXO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsV0FBVztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDLFdBQVc7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRCxzQ0FBc0M7QUFDdkY7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSzs7QUFFTCxHQUFHO0FBQ0gsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsb0JBQW9CLGtCQUFrQjtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLGlCQUFpQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0Isd0JBQXdCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1IsTUFBTTs7QUFFTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjs7QUFFbkI7QUFDQSxzQkFBc0IsbUJBQW1CO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG9CQUFvQixjQUFjO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLHFCQUFxQixlQUFlO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0Isb0JBQW9CO0FBQzFDOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUixNQUFNOztBQUVOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLEdB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0IsWUFBWTtBQUM5QjtBQUNBOztBQUVBO0FBQ0EsbUJBQW1CLGFBQWE7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixnQkFBZ0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixPQUFPO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0Esb0JBQW9CLFNBQVM7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNB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QkFBMEIsZ0JBQWdCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLDBCQUEwQixnQkFBZ0I7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esc0JBQXNCLGdCQUFnQjtBQUN0QztBQUNBO0FBQ0EsdUJBQXVCLG1CQUFtQjtBQUMxQztBQUNBLHdCQUF3QixnQkFBZ0I7QUFDeEM7QUFDQTs7QUFFQTtBQUNBLHdCQUF3QixnQkFBZ0I7QUFDeEMsMEJBQTBCLGdCQUFnQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixnQkFBZ0I7QUFDeEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSixHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGNBQWM7QUFDcEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixlQUFlO0FBQ3RDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtB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O0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLHlEQUF5RDs7QUFFekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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Q25CO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLFdBQVcsR0FBRztBQUNkLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksT0FBTztBQUNuQixZQUFZLEdBQUc7QUFDZixjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksUUFBUTtBQUNwQixjQUFjLFNBQVM7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxRQUFRO0FBQ3BCLGNBQWMsR0FBRztBQUNqQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksUUFBUTtBQUNwQixjQUFjLFNBQVM7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxRQUFRO0FBQ3BCLFlBQVksR0FBRztBQUNmLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxPQUFPO0FBQ25CO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYSxTQUFTO0FBQ3RCOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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LE1BQU07QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLDJCQUEyQjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0Esa0JBQWtCLGlCQUFpQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHVCQUF1QixrQkFBa0I7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsMkJBQTJCO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0Isa0JBQWtCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsaUJBQWlCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjs7QUFFM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCLFlBQVk7QUFDWjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixnQkFBZ0I7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVixRQUFRO0FBQ1I7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSLE1BQU07O0FBRU47QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDOztBQUVsQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDOztBQUVyQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixpQkFBaUI7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsaUJBQWlCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXVEO0FBQ3ZELFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLElBQUk7O0FBRUwsMEJBQTBCOztBQUUxQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMkNBQTJDO0FBQzNDO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsNENBQTRDO0FBQzVDLCtCQUErQjs7QUFFL0I7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQix5QkFBeUI7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixPQUFPO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0Esb0JBQW9CLGlCQUFpQjtBQUNyQztBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLG1DQUFtQztBQUMzRDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QztBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLDhDQUE4QyxPQUFPO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0EsNENBQTRDOztBQUU1QztBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0Isa0JBQWtCO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxzQkFBc0Isa0JBQWtCO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1AsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxpQkFBaUI7QUFDakIsR0FBRztBQUNIO0FBQ0E7QUFDQSxrQ0FBa0M7QUFDbEM7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEM7QUFDMUMsTUFBTTtBQUNOLGlDQUFp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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxvQkFBb0IsZ0JBQWdCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDO0FBQ3JDO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixrQkFBa0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFROztBQUVSO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDLFFBQVE7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHFDQUFxQyxRQUFRO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0Esa0JBQWtCLGlCQUFpQjtBQUNuQztBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7QUFFTjtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOztBQUVOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQSxNQUFNOztBQUVOOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsZ0JBQWdCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLDBCQUEwQjs7QUFFMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLCtCQUErQjtBQUMvQixNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTs7QUFFUjtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsa0JBQWtCLDZCQUE2QjtBQUMvQztBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0Esa0NBQWtDO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsbUJBQW1CLGlDQUFpQztBQUNwRDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTCxHQUFHLElBQUk7QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSxvQkFBb0Isb0JBQW9CO0FBQ3hDO0FBQ0EsNkJBQTZCO0FBQzdCOztBQUVBO0FBQ0Esb0JBQW9CLHNCQUFzQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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O0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOztBQUVOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7QUFFTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsS0FBSztBQUNMLGlCQUFpQjtBQUNqQixHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsdUJBQXVCO0FBQ3pDO0FBQ0Esb0JBQW9CLHNCQUFzQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQix5QkFBeUI7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsZ0JBQWdCOztBQUVoQjs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCLHlCQUF5QjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IscUJBQXFCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCLGdDQUFnQztBQUNsRDtBQUNBLG9CQUFvQixrQkFBa0I7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0IseUJBQXlCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsbUJBQW1CO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQixrQkFBa0I7QUFDcEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHlCQUF5QjtBQUMzQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGdDQUFnQztBQUNsRDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9CQUFvQixjQUFjO0FBQ2xDO0FBQ0EsMEJBQTBCLGNBQWM7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IseUJBQXlCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCLGdDQUFnQztBQUNsRDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG9CQUFvQixjQUFjO0FBQ2xDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFF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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGtCQUFrQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7O0FBRXZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EscUJBQXFCLG1CQUFtQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjs7QUFFQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0EsMkJBQTJCO0FBQzNCOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjs7QUFFQTtBQUNBO0FBQ0EsZUFBZTtBQUNmOztBQUVBO0FBQ0E7QUFDQSx5Q0FBeUMsbUJBQW1CO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILGVBQWU7QUFDZjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsaUJBQWlCLEtBQUs7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixnQkFBZ0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixnQkFBZ0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBLHdCQUF3QjtBQUN4QjtBQUNBO0FBQ0EsMkVBQTJFO0FBQzNFOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQix5QkFBeUI7QUFDekIsc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0Isa0JBQWtCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQzs7QUFFakM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGVBQWU7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsYUFBYTtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9FQUFvRTtBQUNwRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEM7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBEQUEwRDtBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0RBQStEO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsMkJBQTJCO0FBQy9DO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQiwwQkFBMEI7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0Isa0JBQWtCO0FBQ3BDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQiw0QkFBNEI7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNFQUFzRTtBQUN0RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxrQkFBa0Isb0JBQW9CO0FBQ3RDO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGdCQUFnQjtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxrQ0FBa0M7O0FBRWxDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVixVQUFVOztBQUVWLFlBQVk7QUFDWixZQUFZOztBQUVaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKLDRCQUE0QjtBQUM1QixJQUFJO0FBQ0o7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSiw0QkFBNEI7QUFDNUIsSUFBSTtBQUNKO0FBQ0E7QUFDQSxNQUFNO0FB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGtCQUFrQjtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRDtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLDJCQUEyQjtBQUNqRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOztBQUVOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsdUNBQXVDOztBQUV2QztBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOztBQUVOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixrQkFBa0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLG1CQUFtQjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0Esc0RBQXNEOztBQUV0RDtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0EsMERBQTBEOztBQUUxRDtBQUNBLHFEQUFxRDs7QUFFckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLHNCQUFzQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07O0FBRU47QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7O0FBRXZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEM7O0FBRTFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixXQUFXO0FBQ1g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7QUFFTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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O0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixnQkFBZ0I7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGdCQUFnQjtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0Isd0JBQXdCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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UUFBUTs7QUFFUjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxRQUFROztBQUVSO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxRQUFROztBQUVSO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxRQUFROztBQUVSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLHdCQUF3QjtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsU0FBUztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLHlCQUF5QjtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQSxvQkFBb0IsNEJBQTRCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixZQUFZO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGdCQUFnQjtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQscUJBQXFCO0FBQzFFLHVEQUF1RDtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlFQUFpRTs7QUFFakU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDO0FBQzVDO0FBQ0EscUNBQXFDO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQix1QkFBdUI7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQ7QUFDakQsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQsNkJBQTZCOztBQUU3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixxQkFBcUI7QUFDakQ7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSw2Q0FBNkM7QUFDN0M7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLHVDQUF1Qzs7QUFFdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDOztBQUVELGtCQUFrQjtB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLGdDQUFnQztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLGdDQUFnQztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLG9CQUFvQjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLHFCQUFxQjtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLDhCQUE4QjtBQUM5RDtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWLDRCQUE0QixzQkFBc0I7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0Isb0JBQW9CO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxvQ0FBb0M7O0FBRXBDO0FBQ0E7QUFDQSxvQ0FBb0M7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDOztBQUUvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQiw0QkFBNEI7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCOztBQUU5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1EO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0VBQWtFOztBQUVsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVO0FBQ1YsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixrQkFBa0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsaUJBQWlCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixtQkFBbUI7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLHlCQUF5QjtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsV0FBVztBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0I7O0FBRWxCO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjs7QUFFbEI7QUFDQTtBQUNBO0FBQ0Esa0JB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Qjs7QUFFdkI7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHFCQUFxQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0Isb0JBQW9CO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsZUFBZTtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1EO0FBQ25EO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2Isc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsZ0NBQWdDO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLDhCQUE4QjtBQUMxRDtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFD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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2Qzs7QUFFN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0M7QUFDaEMsZ0NBQWdDO0FBQ2hDLGdDQUFnQztBQUNoQyxnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtFQUFrRTtBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QztBQUN6Qyx5Q0FBeUM7QUFDekMseUNBQXlDO0FBQ3pDLHlDQUF5Qzs7QUFFekM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSx3QkFBd0IsdUJBQXVCO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0Esc0JBQXNCLGVBQWU7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFVBQVU7QUFDVixnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSx3QkFBd0Isc0JBQXNCO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsZ0NBQWdDO0FBQzdEO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixvQkFBb0I7QUFDMUM7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLHNCQUFzQjtBQUM5QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkM7O0FBRTNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7O0FBRUQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsaUJBQWlCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsaUJBQWlCO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsaURBQWlEO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscURBQXFEOztBQUVyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGtCQUFrQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsV0FBVztBQUNYLFVBQVU7QUFDVjtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBEQUEwRDtBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQix1QkFBdUI7QUFDekMsd0VBQXdFO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHNCQUFzQjtBQUN4QyxpRUFBaUU7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLHFCQUFxQixrQkFBa0I7QUFDdkM7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0Esb0JBQW9CLGlCQUFpQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsK0NBQStDO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IseUJBQXlCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNEJBQTRCLHFCQUFxQjtBQUNqRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQSxxQ0FBcUMsNEJBQTRCO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsNkJBQTZCLDBCQUEwQixlQUFlO0FBQ3RFOztBQUVPO0FBQ1A7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7OztBQ2pvQnNCLENBQUM7QUFDcUI7QUFDUDs7QUFFckM7QUFDQXBULE1BQU0sQ0FBQzhuQyxZQUFZLEdBQUdBLHVEQUFZLEMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BwbG90bHkvZGFzaC1jb21wb25lbnQtcGx1Z2lucy9kaXN0L2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9pY29ucy9DaGVja0ljb24uc3ZnIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9pY29ucy9DbG9ja0ljb24uc3ZnIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9pY29ucy9DbG91ZFNsYXNoSWNvbi5zdmciLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL2ljb25zL0NvbGxhcHNlSWNvbi5zdmciLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL2ljb25zL0Vycm9ySWNvbi5zdmciLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL2ljb25zL0V4cGFuZC5zdmciLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL2ljb25zL0dyYXBoSWNvbi5zdmciLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL2ljb25zL09mZkljb24uc3ZnIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvQXBwUHJvdmlkZXIucmVhY3QudHN4Iiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvU3RvcmVPYnNlcnZlci50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2FjdGlvbnMvY2FsbGJhY2tzLnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvYWN0aW9ucy9kZXBlbmRlbmNpZXNfdHMudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9hY3Rpb25zL2lzTG9hZGluZy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2FjdGlvbnMvbG9hZGluZy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2FjdGlvbnMvcGF0Y2gudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9hY3Rpb25zL3BhdGNoQW5hbHlzaXMudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9hY3Rpb25zL3BhdHRlcm5NYXRjaGluZy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2FjdGlvbnMvcmVxdWVzdERlcGVuZGVuY2llcy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbmZpZy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2Rhc2hBcGkudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9vYnNlcnZlcnMvZG9jdW1lbnRUaXRsZS50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL29ic2VydmVycy9leGVjdXRlZENhbGxiYWNrcy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL29ic2VydmVycy9leGVjdXRpbmdDYWxsYmFja3MudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9vYnNlcnZlcnMvaXNMb2FkaW5nLnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvb2JzZXJ2ZXJzL3ByaW9yaXRpemVkQ2FsbGJhY2tzLnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvb2JzZXJ2ZXJzL3JlcXVlc3RTbG90LnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvb2JzZXJ2ZXJzL3JlcXVlc3RlZENhbGxiYWNrcy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL29ic2VydmVycy9zdG9yZWRDYWxsYmFja3MudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9vYnNlcnZlcnMvd2Vic29ja2V0T2JzZXJ2ZXIudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9yZWR1Y2Vycy9jYWxsYmFja0pvYnMudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9yZWR1Y2Vycy9jYWxsYmFja3MudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9yZWR1Y2Vycy9pc0xvYWRpbmcudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9yZWR1Y2Vycy9sb2FkaW5nLnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvc3RvcmUudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy91dGlscy9jYWxsYmFja3MudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy91dGlscy9jbGllbnRzaWRlRnVuY3Rpb25zLnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvdXRpbHMvbGlicmFyaWVzLnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvdXRpbHMvcHJvcFBhdGgudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy91dGlscy9yZW5kZXJlcklkLnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvdXRpbHMvc3RvcmVzLnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvdXRpbHMvc3RyZWFtQ2xpZW50LnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvdXRpbHMvd2FpdC50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3V0aWxzL3dvcmtlckNsaWVudC50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3dyYXBwZXIvQ2hlY2tlZENvbXBvbmVudC50c3giLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy93cmFwcGVyL0Rhc2hDb250ZXh0LnRzeCIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3dyYXBwZXIvRGFzaFdyYXBwZXIudHN4Iiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvd3JhcHBlci9FeHRlcm5hbFdyYXBwZXIudHN4Iiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvd3JhcHBlci9zZWxlY3RvcnMudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy93cmFwcGVyL3dyYXBwaW5nLnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvQVBJQ29udHJvbGxlci5yZWFjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL0FwcENvbnRhaW5lci5yZWFjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL0Rhc2hSZW5kZXJlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2FjdGlvbnMvYXBpLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvYWN0aW9ucy9jb25zdGFudHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9hY3Rpb25zL2RlcGVuZGVuY2llcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2FjdGlvbnMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9hY3Rpb25zL2lzQXBwUmVhZHkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9hY3Rpb25zL3BhdGhzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvYWN0aW9ucy91dGlscy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NoZWNrUHJvcFR5cGVzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9jb3JlL0xvYWRpbmcucmVhY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2NvcmUvUmVsb2FkZXIucmVhY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2NvcmUvVG9vbGJhci5yZWFjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvQ2FsbGJhY2tHcmFwaC9DYWxsYmFja0dyYXBoQ29udGFpbmVyLnJlYWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9DYWxsYmFja0dyYXBoL0NhbGxiYWNrR3JhcGhDb250YWluZXJTdHlsZXNoZWV0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9DYWxsYmFja0dyYXBoL0NhbGxiYWNrR3JhcGhFZmZlY3RzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9Db21wb25lbnRFcnJvckJvdW5kYXJ5LnJlYWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9Gcm9udEVuZC9Gcm9udEVuZEVycm9yLnJlYWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9Gcm9udEVuZC9Gcm9udEVuZEVycm9yQ29udGFpbmVyLnJlYWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9HbG9iYWxFcnJvckNvbnRhaW5lci5yZWFjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvbWVudS9EZWJ1Z01lbnUucmVhY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL21lbnUvRGV2dG9vbENvbnRleHQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL21lbnUvUGxvdGx5Q2xvdWQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL21lbnUvVmVyc2lvbkluZm8ucmVhY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL3dlcmt6ZXVnY3NzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29uc3RhbnRzL2NvbnN0YW50cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2V4Y2VwdGlvbnMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9pc1NpbXBsZUNvbXBvbmVudC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3BlcnNpc3RlbmNlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvcmVhY3Qtc2hpbS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2FwaS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2FwcExpZmVjeWNsZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2NoYW5nZWQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9yZWR1Y2Vycy9jb25maWcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9yZWR1Y2Vycy9jb25zdGFudHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9yZWR1Y2Vycy9kZXBlbmRlbmN5R3JhcGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9yZWR1Y2Vycy9lcnJvci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2hpc3RvcnkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9yZWR1Y2Vycy9ob29rcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2xheW91dC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL3BhdGhzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvcmVkdWNlcnMvcHJvZmlsZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL3JlZHVjZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9yZWdpc3RyeS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2N5dG9zY2FwZS1mY29zZS9jeXRvc2NhcGUtZmNvc2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uLi9zcmMvdHlwZXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uLi9zcmMvZGlmZi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4uL3NyYy9qc29uLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi4vc3JjL2RlZmF1bHRzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi4vc3JjL3BhdGNoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi4vc3JjL2NvbXBvbmVudC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2NvbXBvbmVudHMvQ29udGV4dC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2NvbXBvbmVudHMvUHJvdmlkZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9jb21wb25lbnRzL2Nvbm5lY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9jb25uZWN0L2ludmFsaWRBcmdGYWN0b3J5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvY29ubmVjdC9tYXBEaXNwYXRjaFRvUHJvcHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9jb25uZWN0L21hcFN0YXRlVG9Qcm9wcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2Nvbm5lY3QvbWVyZ2VQcm9wcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2Nvbm5lY3Qvc2VsZWN0b3JGYWN0b3J5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvY29ubmVjdC92ZXJpZnlTdWJzZWxlY3RvcnMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9jb25uZWN0L3dyYXBNYXBUb1Byb3BzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvZXhwb3J0cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2hvb2tzL3VzZURpc3BhdGNoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvaG9va3MvdXNlUmVkdXhDb250ZXh0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvaG9va3MvdXNlU2VsZWN0b3IuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9ob29rcy91c2VTdG9yZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvdHlwZXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy91dGlscy9TdWJzY3JpcHRpb24uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy91dGlscy9iYXRjaC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL3V0aWxzL2JpbmRBY3Rpb25DcmVhdG9ycy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL3V0aWxzL2lzUGxhaW5PYmplY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy91dGlscy9yZWFjdEJhdGNoZWRVcGRhdGVzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvdXRpbHMvc2hhbGxvd0VxdWFsLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvdXRpbHMvdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL3V0aWxzL3VzZVN5bmNFeHRlcm5hbFN0b3JlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvdXRpbHMvdmVyaWZ5UGxhaW5PYmplY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy91dGlscy93YXJuaW5nLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvbm9kZV9tb2R1bGVzL3JlYWN0LWlzL2Nqcy9yZWFjdC1pcy5kZXZlbG9wbWVudC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L25vZGVfbW9kdWxlcy9yZWFjdC1pcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvYXBhdGh5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9hc2hlcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvYXRlbGllci1kdW5lLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9hdGVsaWVyLWZvcmVzdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvYXRlbGllci1oZWF0aC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvYXRlbGllci1sYWtlc2lkZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvYXRlbGllci1zZWFzaWRlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9iZXNwaW4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL2JyZXdlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvYnJpZ2h0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9jaGFsay5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvY29kZXNjaG9vbC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvY29sb3JzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9kZWZhdWx0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9laWdodGllcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvZW1iZXJzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9mbGF0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9nb29nbGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL2dyYXlzY2FsZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvZ3JlZW5zY3JlZW4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL2hhcm1vbmljLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9ob3BzY290Y2guanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9pc290b3BlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9tYXJyYWtlc2guanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL21vY2hhLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9tb25va2FpLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9vY2Vhbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvcGFyYWlzby5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvcG9wLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9yYWlsc2Nhc3RzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9zaGFwZXNoaWZ0ZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL3NvbGFyaXplZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvc3VtbWVyZnJ1aXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL3RocmVlemVyb3R3b2ZvdXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL3RvbW9ycm93LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi90dWJlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi90d2lsaWdodC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2NvbG9yLW5hbWUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9jb2xvci1zdHJpbmcvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9jb2xvci9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2NvbG9yL25vZGVfbW9kdWxlcy9jb2xvci1jb252ZXJ0L2NvbnZlcnNpb25zLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvY29sb3Ivbm9kZV9tb2R1bGVzL2NvbG9yLWNvbnZlcnQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9jb2xvci9ub2RlX21vZHVsZXMvY29sb3ItY29udmVydC9yb3V0ZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2NvbG9yL25vZGVfbW9kdWxlcy9jb2xvci1uYW1lL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvY29zZS1iYXNlL2Nvc2UtYmFzZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvY29yZS9Ub29sYmFyLmNzcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvQ2FsbGJhY2tHcmFwaC9DYWxsYmFja0dyYXBoQ29udGFpbmVyLmNzcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvRnJvbnRFbmQvRnJvbnRFbmRFcnJvci5jc3MiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL1BlcmN5LmNzcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvbWVudS9EZWJ1Z01lbnUuY3NzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9tZW51L1Bsb3RseUNsb3VkLmNzcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvbWVudS9WZXJzaW9uSW5mby5jc3MiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvY3l0b3NjYXBlLWRhZ3JlL2N5dG9zY2FwZS1kYWdyZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL2FjeWNsaWMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvYWRkLWJvcmRlci1zZWdtZW50cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9jb29yZGluYXRlLXN5c3RlbS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9kYXRhL2xpc3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvZGVidWcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvZ3JhcGhsaWIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvZ3JlZWR5LWZhcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9sYXlvdXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvbG9kYXNoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL25lc3RpbmctZ3JhcGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvbm9ybWFsaXplLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL29yZGVyL2FkZC1zdWJncmFwaC1jb25zdHJhaW50cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9vcmRlci9iYXJ5Y2VudGVyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL29yZGVyL2J1aWxkLWxheWVyLWdyYXBoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL29yZGVyL2Nyb3NzLWNvdW50LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL29yZGVyL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL29yZGVyL2luaXQtb3JkZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvb3JkZXIvcmVzb2x2ZS1jb25mbGljdHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvb3JkZXIvc29ydC1zdWJncmFwaC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9vcmRlci9zb3J0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL3BhcmVudC1kdW1teS1jaGFpbnMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvcG9zaXRpb24vYmsuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvcG9zaXRpb24vaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvcmFuay9mZWFzaWJsZS10cmVlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL3JhbmsvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvcmFuay9uZXR3b3JrLXNpbXBsZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvcmFuay91dGlsLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL3V0aWwuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvdmVyc2lvbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RlcGVuZGVuY3ktZ3JhcGgvbGliL2RlcF9ncmFwaC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Zhc3QtaXNudW1lcmljL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvYWxnL2NvbXBvbmVudHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvYWxnL2Rmcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9hbGcvZGlqa3N0cmEtYWxsLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy9kaWprc3RyYS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9hbGcvZmluZC1jeWNsZXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvYWxnL2Zsb3lkLXdhcnNoYWxsLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9hbGcvaXMtYWN5Y2xpYy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9hbGcvcG9zdG9yZGVyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy9wcmVvcmRlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9hbGcvcHJpbS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9hbGcvdGFyamFuLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy90b3Bzb3J0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2RhdGEvcHJpb3JpdHktcXVldWUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvZ3JhcGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvanNvbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9sb2Rhc2guanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvdmVyc2lvbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2hvaXN0LW5vbi1yZWFjdC1zdGF0aWNzL2Rpc3QvaG9pc3Qtbm9uLXJlYWN0LXN0YXRpY3MuY2pzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvaW52YXJpYW50L2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9pcy1zdHJpbmctYmxhbmsvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sYXlvdXQtYmFzZS9sYXlvdXQtYmFzZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC5jdXJyeS9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fRGF0YVZpZXcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX0hhc2guanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX0xpc3RDYWNoZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fTWFwLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19NYXBDYWNoZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fUHJvbWlzZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fU2V0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19TZXRDYWNoZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fU3RhY2suanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX1N5bWJvbC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fVWludDhBcnJheS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fV2Vha01hcC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXBwbHkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2FycmF5RWFjaC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlGaWx0ZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2FycmF5SW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2FycmF5SW5jbHVkZXNXaXRoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheUxpa2VLZXlzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheU1hcC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlQdXNoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheVJlZHVjZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlTb21lLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hc2NpaVNpemUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Fzc2lnbk1lcmdlVmFsdWUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Fzc2lnblZhbHVlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hc3NvY0luZGV4T2YuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VBc3NpZ24uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VBc3NpZ25Jbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUFzc2lnblZhbHVlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlQ2xvbmUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VDcmVhdGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VFYWNoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlRXh0cmVtdW0uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VGaWx0ZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VGaW5kSW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VGbGF0dGVuLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlRm9yLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlRm9yT3duLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlR2V0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlR2V0QWxsS2V5cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUdldFRhZy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUd0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSGFzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSGFzSW4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJbmRleE9mLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXNBcmd1bWVudHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc0VxdWFsLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXNFcXVhbERlZXAuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc01hcC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzTWF0Y2guanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc05hTi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzTmF0aXZlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXNTZXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc1R5cGVkQXJyYXkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJdGVyYXRlZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUtleXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VLZXlzSW4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VMdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZU1hcC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZU1hdGNoZXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VNYXRjaGVzUHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VNZXJnZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZU1lcmdlRGVlcC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZU9yZGVyQnkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VQaWNrLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlUGlja0J5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlUHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VQcm9wZXJ0eURlZXAuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VSYW5nZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVJlZHVjZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVJlc3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VTZXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VTZXRUb1N0cmluZy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVNvcnRCeS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVRpbWVzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlVG9TdHJpbmcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VUcmltLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlVW5hcnkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VVbmlxLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlVmFsdWVzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlWmlwT2JqZWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jYWNoZUhhcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY2FzdEZ1bmN0aW9uLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jYXN0UGF0aC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY2xvbmVBcnJheUJ1ZmZlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY2xvbmVCdWZmZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Nsb25lRGF0YVZpZXcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Nsb25lUmVnRXhwLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jbG9uZVN5bWJvbC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY2xvbmVUeXBlZEFycmF5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jb21wYXJlQXNjZW5kaW5nLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jb21wYXJlTXVsdGlwbGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NvcHlBcnJheS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY29weU9iamVjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY29weVN5bWJvbHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NvcHlTeW1ib2xzSW4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NvcmVKc0RhdGEuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NyZWF0ZUFzc2lnbmVyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jcmVhdGVCYXNlRWFjaC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY3JlYXRlQmFzZUZvci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY3JlYXRlRmluZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY3JlYXRlUmFuZ2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NyZWF0ZVNldC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZGVmaW5lUHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2VxdWFsQXJyYXlzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19lcXVhbEJ5VGFnLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19lcXVhbE9iamVjdHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2ZsYXRSZXN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19mcmVlR2xvYmFsLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXRBbGxLZXlzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXRBbGxLZXlzSW4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldE1hcERhdGEuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldE1hdGNoRGF0YS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0TmF0aXZlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXRQcm90b3R5cGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldFJhd1RhZy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0U3ltYm9scy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0U3ltYm9sc0luLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXRUYWcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldFZhbHVlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19oYXNQYXRoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19oYXNVbmljb2RlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19oYXNoQ2xlYXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc2hEZWxldGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc2hHZXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc2hIYXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc2hTZXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2luaXRDbG9uZUFycmF5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19pbml0Q2xvbmVCeVRhZy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faW5pdENsb25lT2JqZWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19pc0ZsYXR0ZW5hYmxlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19pc0luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19pc0l0ZXJhdGVlQ2FsbC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faXNLZXkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzS2V5YWJsZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faXNNYXNrZWQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzUHJvdG90eXBlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19pc1N0cmljdENvbXBhcmFibGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2xpc3RDYWNoZUNsZWFyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19saXN0Q2FjaGVEZWxldGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2xpc3RDYWNoZUdldC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbGlzdENhY2hlSGFzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19saXN0Q2FjaGVTZXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX21hcENhY2hlQ2xlYXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX21hcENhY2hlRGVsZXRlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19tYXBDYWNoZUdldC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbWFwQ2FjaGVIYXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX21hcENhY2hlU2V0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19tYXBUb0FycmF5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19tYXRjaGVzU3RyaWN0Q29tcGFyYWJsZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbWVtb2l6ZUNhcHBlZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbmF0aXZlQ3JlYXRlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19uYXRpdmVLZXlzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19uYXRpdmVLZXlzSW4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX25vZGVVdGlsLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19vYmplY3RUb1N0cmluZy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fb3ZlckFyZy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fb3ZlclJlc3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3Jvb3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3NhZmVHZXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3NldENhY2hlQWRkLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zZXRDYWNoZUhhcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc2V0VG9BcnJheS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc2V0VG9TdHJpbmcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3Nob3J0T3V0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zdGFja0NsZWFyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zdGFja0RlbGV0ZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc3RhY2tHZXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3N0YWNrSGFzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zdGFja1NldC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc3RyaWN0SW5kZXhPZi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc3RyaW5nU2l6ZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc3RyaW5nVG9QYXRoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL190b0tleS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fdG9Tb3VyY2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3RyaW1tZWRFbmRJbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fdW5pY29kZVNpemUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvY2xvbmUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvY2xvbmVEZWVwLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2NvbnN0YW50LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2RlZmF1bHRzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2VhY2guanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvZXEuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvZmlsdGVyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2ZpbmQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvZmluZEluZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2ZsYXR0ZW4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvZm9yRWFjaC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9mb3JJbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9nZXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaGFzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2hhc0luLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lkZW50aXR5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzQXJndW1lbnRzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzQXJyYXkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNBcnJheUxpa2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNBcnJheUxpa2VPYmplY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNCdWZmZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNFbXB0eS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0Z1bmN0aW9uLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzTGVuZ3RoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzTWFwLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzT2JqZWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzT2JqZWN0TGlrZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc1BsYWluT2JqZWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzU2V0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzU3RyaW5nLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzU3ltYm9sLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzVHlwZWRBcnJheS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc1VuZGVmaW5lZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9rZXlzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2tleXNJbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9sYXN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL21hcC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9tYXBWYWx1ZXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvbWF4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL21lbW9pemUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvbWVyZ2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvbWluLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL21pbkJ5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL25vb3AuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvbm93LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3BpY2suanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvcmFuZ2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvcmVkdWNlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3NpemUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvc29ydEJ5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3N0dWJBcnJheS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9zdHViRmFsc2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvdG9GaW5pdGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvdG9JbnRlZ2VyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3RvTnVtYmVyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3RvUGxhaW5PYmplY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvdG9TdHJpbmcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvdHJhbnNmb3JtLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3VuaW9uLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3VuaXF1ZUlkLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3ZhbHVlcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC96aXBPYmplY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9wcm9wLXR5cGVzL2xpYi9SZWFjdFByb3BUeXBlc1NlY3JldC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJhc2UxNi1zdHlsaW5nL2xpYi9lc20vY29sb3JDb252ZXJ0ZXJzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtYmFzZTE2LXN0eWxpbmcvbGliL2VzbS9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWlzL2Nqcy9yZWFjdC1pcy5kZXZlbG9wbWVudC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWlzL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtanNvbi10cmVlL2xpYi9lc20vSXRlbVJhbmdlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtanNvbi10cmVlL2xpYi9lc20vSlNPTkFycmF5Tm9kZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWpzb24tdHJlZS9saWIvZXNtL0pTT05BcnJvdy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWpzb24tdHJlZS9saWIvZXNtL0pTT05JdGVyYWJsZU5vZGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1qc29uLXRyZWUvbGliL2VzbS9KU09OTmVzdGVkTm9kZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWpzb24tdHJlZS9saWIvZXNtL0pTT05Ob2RlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtanNvbi10cmVlL2xpYi9lc20vSlNPTk9iamVjdE5vZGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1qc29uLXRyZWUvbGliL2VzbS9KU09OVmFsdWVOb2RlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtanNvbi10cmVlL2xpYi9lc20vY3JlYXRlU3R5bGluZ0Zyb21UaGVtZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWpzb24tdHJlZS9saWIvZXNtL2dldENvbGxlY3Rpb25FbnRyaWVzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtanNvbi10cmVlL2xpYi9lc20vaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1qc29uLXRyZWUvbGliL2VzbS9vYmpUeXBlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtanNvbi10cmVlL2xpYi9lc20vdGhlbWVzL3NvbGFyaXplZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlZHV4LWFjdGlvbnMvZXMvY3JlYXRlQWN0aW9uLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVkdXgtYWN0aW9ucy9lcy91dGlscy9pZGVudGl0eS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlZHV4LWFjdGlvbnMvZXMvdXRpbHMvaXNGdW5jdGlvbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlZHV4LWFjdGlvbnMvZXMvdXRpbHMvaXNOdWxsLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVkdXgtdGh1bmsvZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWR1eC9lcy9yZWR1eC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3NpbXBsZS1zd2l6emxlL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvc2ltcGxlLXN3aXp6bGUvbm9kZV9tb2R1bGVzL2lzLWFycmF5aXNoL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9jb3JlL1Rvb2xiYXIuY3NzP2Q4MTMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL0NhbGxiYWNrR3JhcGgvQ2FsbGJhY2tHcmFwaENvbnRhaW5lci5jc3M/NThlMiIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvRnJvbnRFbmQvRnJvbnRFbmRFcnJvci5jc3M/YTkwMCIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvUGVyY3kuY3NzP2FmMzgiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL21lbnUvRGVidWdNZW51LmNzcz82ZDU0Iiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9tZW51L1Bsb3RseUNsb3VkLmNzcz85YThiIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9tZW51L1ZlcnNpb25JbmZvLmNzcz9kYjIyIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS9janMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUtc2hpbS5kZXZlbG9wbWVudC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlL2Nqcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS1zaGltL3dpdGgtc2VsZWN0b3IuZGV2ZWxvcG1lbnQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS9zaGltL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUvc2hpbS93aXRoLXNlbGVjdG9yLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvZXh0ZXJuYWwgd2luZG93IFwiUHJvcFR5cGVzXCIiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci9leHRlcm5hbCB3aW5kb3cgXCJSZWFjdFwiIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvZXh0ZXJuYWwgd2luZG93IFwiUmVhY3RET01cIiIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2FycmF5TGlrZVRvQXJyYXkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hcnJheVdpdGhIb2xlcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2FycmF5V2l0aG91dEhvbGVzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vYXNzZXJ0VGhpc0luaXRpYWxpemVkLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2suanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2dldFByb3RvdHlwZU9mLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaW5oZXJpdHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pdGVyYWJsZVRvQXJyYXkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pdGVyYWJsZVRvQXJyYXlMaW1pdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL25vbkl0ZXJhYmxlUmVzdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL25vbkl0ZXJhYmxlU3ByZWFkLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zZXRQcm90b3R5cGVPZi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvUHJpbWl0aXZlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Qcm9wZXJ0eUtleS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi4vc3JjL2luZGV4LnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvYWxsLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvYWx3YXlzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvYW55LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvYXAuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9hcHBlbmQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9hc3NvYy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2Fzc29jUGF0aC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2JpbmQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9jbG9uZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2NvbXBhcmF0b3IuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9jb25jYXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9jb252ZXJnZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2N1cnJ5Ti5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2RlZmF1bHRUby5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2RpZmZlcmVuY2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9kaXNzb2MuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9kaXNzb2NQYXRoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvZW1wdHkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9lcXVhbHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9ldm9sdmUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9maWx0ZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9maW5kLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvZmluZEluZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvZmxhdHRlbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ZvckVhY2guanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9mb3JFYWNoT2JqSW5kZXhlZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2dyb3VwQnkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9oYXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9oYXNQYXRoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaWRlbnRpdHkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbmNsdWRlcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2luZGV4T2YuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnNlcnQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fU2V0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2FyaXR5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2FycmF5RnJvbUl0ZXJhdG9yLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2FycmF5UmVkdWNlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2Fzc29jLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2NoZWNrRm9yTWV0aG9kLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2Nsb25lLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2Nsb25lUmVnRXhwLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2NvbXBsZW1lbnQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fY29uY2F0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2NyZWF0ZVJlZHVjZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19jdXJyeTEuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fY3VycnkyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2N1cnJ5My5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19jdXJyeU4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fZGlzcGF0Y2hhYmxlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2Rpc3NvYy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19lcXVhbHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fZmlsdGVyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2Z1bmN0aW9uTmFtZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19oYXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9faWRlbnRpdHkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9faW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9faW5jbHVkZXNXaXRoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2luZGV4T2YuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9faXNBcmd1bWVudHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9faXNBcnJheS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19pc0FycmF5TGlrZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19pc0Z1bmN0aW9uLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2lzSW50ZWdlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19pc09iamVjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19pc1BsYWNlaG9sZGVyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2lzU3RyaW5nLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2lzVHJhbnNmb3JtZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9faXNUeXBlZEFycmF5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX21ha2VGbGF0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX21hcC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19udGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fb2JqZWN0QXNzaWduLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX29iamVjdElzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX3BhdGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fcXVvdGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fcmVkdWNlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX3JlZHVjZWQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fdG9JU09TdHJpbmcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fdG9TdHJpbmcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9feEFycmF5UmVkdWNlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX3hSZWR1Y2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9feGFsbC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL194YW55LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX3hmQmFzZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL194ZmlsdGVyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX3hmaW5kLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX3hmaW5kSW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9feG1hcC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL194cmVkdWNlQnkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9feHRha2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9feHVuaXFCeS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL194d3JhcC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVyc2VjdGlvbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludm9rZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2lzRW1wdHkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pc05pbC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2pvaW4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9qdXh0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMva2V5cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2xlbnMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9sZW5zUGF0aC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2x0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvbWFwLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvbWFwT2JqSW5kZXhlZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL21heC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL21lbW9pemVXaXRoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvbWVyZ2VEZWVwUmlnaHQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9tZXJnZURlZXBXaXRoS2V5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvbWVyZ2VMZWZ0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvbWVyZ2VSaWdodC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL21lcmdlV2l0aC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL21lcmdlV2l0aEtleS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL29taXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9vbmNlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvb3Zlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3BhcnRpdGlvbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3BhdGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9wYXRoT3IuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9waWNrLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvcGlja0J5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvcGx1Y2suanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9wcmVwZW5kLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvcHJvcC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3Byb3BFcS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3Byb3BzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvcmVkdWNlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvcmVkdWNlQnkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9yZWplY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9yZW1vdmUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9yZXZlcnNlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvc2V0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvc2xpY2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9zb3J0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvc3RhcnRzV2l0aC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3Rha2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy90b1BhaXJzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvdG9TdHJpbmcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy90eXBlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvdW5pcS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3VuaXFCeS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3ZhbHVlcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3ZpZXcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy96aXAuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy96aXBPYmouanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9jeXRvc2NhcGUvZGlzdC9jeXRvc2NhcGUuZXNtLm1qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvd2VicGFjay9ydW50aW1lL2NvbXBhdCBnZXQgZGVmYXVsdCBleHBvcnQiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci93ZWJwYWNrL3J1bnRpbWUvZ2xvYmFsIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci93ZWJwYWNrL3J1bnRpbWUvbm9kZSBtb2R1bGUgZGVjb3JhdG9yIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvd2VicGFjay9ydW50aW1lL25vbmNlIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvd2hhdHdnLWZldGNoL2ZldGNoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiIWZ1bmN0aW9uKGUsbil7XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9bihyZXF1aXJlKFwicmVhY3RcIikpOlwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW1wicmVhY3RcIl0sbik6XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHM/ZXhwb3J0c1tcImRhc2gtY29tcG9uZW50LXBsdWdpbnNcIl09bihyZXF1aXJlKFwicmVhY3RcIikpOmVbXCJkYXNoLWNvbXBvbmVudC1wbHVnaW5zXCJdPW4oZS5SZWFjdCl9KHdpbmRvdywoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciBuPXt9O2Z1bmN0aW9uIHQocil7aWYobltyXSlyZXR1cm4gbltyXS5leHBvcnRzO3ZhciBvPW5bcl09e2k6cixsOiExLGV4cG9ydHM6e319O3JldHVybiBlW3JdLmNhbGwoby5leHBvcnRzLG8sby5leHBvcnRzLHQpLG8ubD0hMCxvLmV4cG9ydHN9cmV0dXJuIHQubT1lLHQuYz1uLHQuZD1mdW5jdGlvbihlLG4scil7dC5vKGUsbil8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLG4se2VudW1lcmFibGU6ITAsZ2V0OnJ9KX0sdC5yPWZ1bmN0aW9uKGUpe1widW5kZWZpbmVkXCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZTpcIk1vZHVsZVwifSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSl9LHQudD1mdW5jdGlvbihlLG4pe2lmKDEmbiYmKGU9dChlKSksOCZuKXJldHVybiBlO2lmKDQmbiYmXCJvYmplY3RcIj09dHlwZW9mIGUmJmUmJmUuX19lc01vZHVsZSlyZXR1cm4gZTt2YXIgcj1PYmplY3QuY3JlYXRlKG51bGwpO2lmKHQucihyKSxPYmplY3QuZGVmaW5lUHJvcGVydHkocixcImRlZmF1bHRcIix7ZW51bWVyYWJsZTohMCx2YWx1ZTplfSksMiZuJiZcInN0cmluZ1wiIT10eXBlb2YgZSlmb3IodmFyIG8gaW4gZSl0LmQocixvLGZ1bmN0aW9uKG4pe3JldHVybiBlW25dfS5iaW5kKG51bGwsbykpO3JldHVybiByfSx0Lm49ZnVuY3Rpb24oZSl7dmFyIG49ZSYmZS5fX2VzTW9kdWxlP2Z1bmN0aW9uKCl7cmV0dXJuIGUuZGVmYXVsdH06ZnVuY3Rpb24oKXtyZXR1cm4gZX07cmV0dXJuIHQuZChuLFwiYVwiLG4pLG59LHQubz1mdW5jdGlvbihlLG4pe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxuKX0sdC5wPVwiXCIsdCh0LnM9MSl9KFtmdW5jdGlvbihuLHQpe24uZXhwb3J0cz1lfSxmdW5jdGlvbihlLG4sdCl7XCJ1c2Ugc3RyaWN0XCI7dC5yKG4pLHQuZChuLFwiYXN5bmNEZWNvcmF0b3JcIiwoZnVuY3Rpb24oKXtyZXR1cm4gdX0pKSx0LmQobixcImluaGVyaXRBc3luY0RlY29yYXRvclwiLChmdW5jdGlvbigpe3JldHVybiBhfSkpLHQuZChuLFwiaXNSZWFkeVwiLChmdW5jdGlvbigpe3JldHVybiBjfSkpLHQuZChuLFwiSGlzdG9yeVwiLChmdW5jdGlvbigpe3JldHVybiBkfSkpO3ZhciByPXQoMCk7ZnVuY3Rpb24gbyhlLG4sdCxyLG8saSx1KXt0cnl7dmFyIGE9ZVtpXSh1KSxjPWEudmFsdWV9Y2F0Y2goZSl7cmV0dXJuIHZvaWQgdChlKX1hLmRvbmU/bihjKTpQcm9taXNlLnJlc29sdmUoYykudGhlbihyLG8pfWZ1bmN0aW9uIGkoZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49dGhpcyx0PWFyZ3VtZW50cztyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHIsaSl7dmFyIHU9ZS5hcHBseShuLHQpO2Z1bmN0aW9uIGEoZSl7byh1LHIsaSxhLGMsXCJuZXh0XCIsZSl9ZnVuY3Rpb24gYyhlKXtvKHUscixpLGEsYyxcInRocm93XCIsZSl9YSh2b2lkIDApfSkpfX12YXIgdT1mdW5jdGlvbihlLG4pe3ZhciB0LG89e2lzUmVhZHk6bmV3IFByb21pc2UoKGZ1bmN0aW9uKGUpe3Q9ZX0pKSxnZXQ6T2JqZWN0KHIubGF6eSkoKGZ1bmN0aW9uKCl7cmV0dXJuIFByb21pc2UucmVzb2x2ZShuKCkpLnRoZW4oKGZ1bmN0aW9uKGUpe3JldHVybiBzZXRUaW1lb3V0KGkocmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoKGZ1bmN0aW9uIGUoKXtyZXR1cm4gcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoKGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5wcmV2PWUubmV4dCl7Y2FzZSAwOnJldHVybiBlLm5leHQ9Mix0KCEwKTtjYXNlIDI6by5pc1JlYWR5PSEwO2Nhc2UgMzpjYXNlXCJlbmRcIjpyZXR1cm4gZS5zdG9wKCl9fSksZSl9KSkpLDApLGV9KSl9KSl9O3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9kYXNocHJpdmF0ZV9pc0xhenlDb21wb25lbnRSZWFkeVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gby5pc1JlYWR5fX0pLG8uZ2V0fSxhPWZ1bmN0aW9uKGUsbil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfZGFzaHByaXZhdGVfaXNMYXp5Q29tcG9uZW50UmVhZHlcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGMobil9fSl9LGM9ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJmUuX2Rhc2hwcml2YXRlX2lzTGF6eUNvbXBvbmVudFJlYWR5fTtmdW5jdGlvbiBmKGUsbil7Zm9yKHZhciB0PTA7dDxuLmxlbmd0aDt0Kyspe3ZhciByPW5bdF07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX12YXIgcz1cIl9kYXNocHJpdmF0ZV9oaXN0b3J5Y2hhbmdlXCIsZD1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXshZnVuY3Rpb24oZSxuKXtpZighKGUgaW5zdGFuY2VvZiBuKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfSh0aGlzLGUpfXZhciBuLHQscjtyZXR1cm4gbj1lLHI9W3trZXk6XCJkaXNwYXRjaENoYW5nZUV2ZW50XCIsdmFsdWU6ZnVuY3Rpb24oKXt3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQocykpfX0se2tleTpcIm9uQ2hhbmdlXCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKHMsZSksZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIocyxlKX19fV0sKHQ9bnVsbCkmJmYobi5wcm90b3R5cGUsdCksciYmZihuLHIpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLFwicHJvdG90eXBlXCIse3dyaXRhYmxlOiExfSksZX0oKX1dKX0pKTsiLCJ2YXIgX3BhdGg7XG5mdW5jdGlvbiBfZXh0ZW5kcygpIHsgcmV0dXJuIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKG4pIHsgZm9yICh2YXIgZSA9IDE7IGUgPCBhcmd1bWVudHMubGVuZ3RoOyBlKyspIHsgdmFyIHQgPSBhcmd1bWVudHNbZV07IGZvciAodmFyIHIgaW4gdCkgKHt9KS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIHIpICYmIChuW3JdID0gdFtyXSk7IH0gcmV0dXJuIG47IH0sIF9leHRlbmRzLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH1cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xudmFyIFN2Z0NoZWNrSWNvbiA9IGZ1bmN0aW9uIFN2Z0NoZWNrSWNvbihwcm9wcykge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgX2V4dGVuZHMoe1xuICAgIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gICAgd2lkdGg6IDE4LFxuICAgIGhlaWdodDogMTgsXG4gICAgZmlsbDogXCJub25lXCIsXG4gICAgdmlld0JveDogXCIwIDAgMTQgMTRcIlxuICB9LCBwcm9wcyksIF9wYXRoIHx8IChfcGF0aCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbDogXCIjMDY4MDBBXCIsXG4gICAgZmlsbE9wYWNpdHk6IDAuOCxcbiAgICBkOiBcIk05Ljg1NCA1LjE0NmEuNS41IDAgMCAxIDAgLjcwOGwtMy41IDMuNWEuNS41IDAgMCAxLS43MDggMGwtMS41LTEuNWEuNS41IDAgMSAxIC43MDgtLjcwOEw2IDguMjkzbDMuMTQ2LTMuMTQ3YS41LjUgMCAwIDEgLjcwOCAwTTEzLjUgN0E2LjUgNi41IDAgMSAxIDcgLjUgNi41MDcgNi41MDcgMCAwIDEgMTMuNSA3bS0xIDBBNS41IDUuNSAwIDEgMCA3IDEyLjUgNS41MDcgNS41MDcgMCAwIDAgMTIuNSA3XCJcbiAgfSkpKTtcbn07XG5leHBvcnQgZGVmYXVsdCBTdmdDaGVja0ljb247IiwidmFyIF9wYXRoO1xuZnVuY3Rpb24gX2V4dGVuZHMoKSB7IHJldHVybiBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uIChuKSB7IGZvciAodmFyIGUgPSAxOyBlIDwgYXJndW1lbnRzLmxlbmd0aDsgZSsrKSB7IHZhciB0ID0gYXJndW1lbnRzW2VdOyBmb3IgKHZhciByIGluIHQpICh7fSkuaGFzT3duUHJvcGVydHkuY2FsbCh0LCByKSAmJiAobltyXSA9IHRbcl0pOyB9IHJldHVybiBuOyB9LCBfZXh0ZW5kcy5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbnZhciBTdmdDbG9ja0ljb24gPSBmdW5jdGlvbiBTdmdDbG9ja0ljb24ocHJvcHMpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIF9leHRlbmRzKHtcbiAgICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICAgIHZpZXdCb3g6IFwiMCAwIDU0IDI0XCJcbiAgfSwgcHJvcHMpLCBfcGF0aCB8fCAoX3BhdGggPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGw6IFwibm9uZVwiLFxuICAgIHN0cm9rZTogXCIjZmZmXCIsXG4gICAgc3Ryb2tlV2lkdGg6IDQsXG4gICAgZDogXCJNMjcgMHYyMmgyMlwiXG4gIH0pKSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgU3ZnQ2xvY2tJY29uOyIsInZhciBfcGF0aDtcbmZ1bmN0aW9uIF9leHRlbmRzKCkgeyByZXR1cm4gX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAobikgeyBmb3IgKHZhciBlID0gMTsgZSA8IGFyZ3VtZW50cy5sZW5ndGg7IGUrKykgeyB2YXIgdCA9IGFyZ3VtZW50c1tlXTsgZm9yICh2YXIgciBpbiB0KSAoe30pLmhhc093blByb3BlcnR5LmNhbGwodCwgcikgJiYgKG5bcl0gPSB0W3JdKTsgfSByZXR1cm4gbjsgfSwgX2V4dGVuZHMuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG52YXIgU3ZnQ2xvdWRTbGFzaEljb24gPSBmdW5jdGlvbiBTdmdDbG91ZFNsYXNoSWNvbihwcm9wcykge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgX2V4dGVuZHMoe1xuICAgIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gICAgd2lkdGg6IDMyLFxuICAgIGhlaWdodDogMzIsXG4gICAgdmlld0JveDogXCIwIDAgMjU2IDI1NlwiXG4gIH0sIHByb3BzKSwgX3BhdGggfHwgKF9wYXRoID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0yNDggMTI4LjcyQTg3Ljc0IDg3Ljc0IDAgMCAxIDIyMi40MSAxOTBhNCA0IDAgMCAxLTUuNzctLjE2TDEwMy43OCA2NS42N2E0IDQgMCAwIDEgLjM5LTUuNzZBODcuODIgODcuODIgMCAwIDEgMTYwLjg3IDQwYzQ4LjI4LjQ3IDg3LjUxIDQwLjQzIDg3LjEzIDg4LjcyTTUzLjkyIDM0LjYyYTggOCAwIDEgMC0xMS44NCAxMC43NmwzOS4yNSA0My4xOC0uMDYuMTFBNjQgNjQgMCAwIDAgOCAxNTNjLjUzIDM1LjEyIDI5Ljg0IDYzIDY1IDYzaDg3YTg3LjcgODcuNyAwIDAgMCAzMS43OC01Ljk1bDEwLjMgMTEuMzNhOCA4IDAgMCAwIDExLjMzLjUyIDguMzIgOC4zMiAwIDAgMCAuMjktMTEuNTJaXCJcbiAgfSkpKTtcbn07XG5leHBvcnQgZGVmYXVsdCBTdmdDbG91ZFNsYXNoSWNvbjsiLCJ2YXIgX3BhdGg7XG5mdW5jdGlvbiBfZXh0ZW5kcygpIHsgcmV0dXJuIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKG4pIHsgZm9yICh2YXIgZSA9IDE7IGUgPCBhcmd1bWVudHMubGVuZ3RoOyBlKyspIHsgdmFyIHQgPSBhcmd1bWVudHNbZV07IGZvciAodmFyIHIgaW4gdCkgKHt9KS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIHIpICYmIChuW3JdID0gdFtyXSk7IH0gcmV0dXJuIG47IH0sIF9leHRlbmRzLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH1cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xudmFyIFN2Z0NvbGxhcHNlSWNvbiA9IGZ1bmN0aW9uIFN2Z0NvbGxhcHNlSWNvbihwcm9wcykge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgX2V4dGVuZHMoe1xuICAgIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gICAgd2lkdGg6IDEwLFxuICAgIGhlaWdodDogNixcbiAgICBmaWxsOiBcIm5vbmVcIlxuICB9LCBwcm9wcyksIF9wYXRoIHx8IChfcGF0aCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgc3Ryb2tlOiBcIiNBMkIxQzZcIixcbiAgICBkOiBcIm0xIDEgNCA0IDQtNFwiXG4gIH0pKSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgU3ZnQ29sbGFwc2VJY29uOyIsInZhciBfcGF0aDtcbmZ1bmN0aW9uIF9leHRlbmRzKCkgeyByZXR1cm4gX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAobikgeyBmb3IgKHZhciBlID0gMTsgZSA8IGFyZ3VtZW50cy5sZW5ndGg7IGUrKykgeyB2YXIgdCA9IGFyZ3VtZW50c1tlXTsgZm9yICh2YXIgciBpbiB0KSAoe30pLmhhc093blByb3BlcnR5LmNhbGwodCwgcikgJiYgKG5bcl0gPSB0W3JdKTsgfSByZXR1cm4gbjsgfSwgX2V4dGVuZHMuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG52YXIgU3ZnRXJyb3JJY29uID0gZnVuY3Rpb24gU3ZnRXJyb3JJY29uKHByb3BzKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCBfZXh0ZW5kcyh7XG4gICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgICB3aWR0aDogMzIsXG4gICAgaGVpZ2h0OiAzMixcbiAgICB2aWV3Qm94OiBcIjAgMCAyNTYgMjU2XCJcbiAgfSwgcHJvcHMpLCBfcGF0aCB8fCAoX3BhdGggPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTIzNi44IDE4OC4wOSAxNDkuMzUgMzYuMjJhMjQuNzYgMjQuNzYgMCAwIDAtNDIuNyAwTDE5LjIgMTg4LjA5YTIzLjUxIDIzLjUxIDAgMCAwIDAgMjMuNzJBMjQuMzUgMjQuMzUgMCAwIDAgNDAuNTUgMjI0aDE3NC45YTI0LjM1IDI0LjM1IDAgMCAwIDIxLjMzLTEyLjE5IDIzLjUxIDIzLjUxIDAgMCAwIC4wMi0yMy43Mm0tMTMuODcgMTUuNzFhOC41IDguNSAwIDAgMS03LjQ4IDQuMkg0MC41NWE4LjUgOC41IDAgMCAxLTcuNDgtNC4yIDcuNTkgNy41OSAwIDAgMSAwLTcuNzJsODcuNDUtMTUxLjg3YTguNzUgOC43NSAwIDAgMSAxNSAwbDg3LjQ1IDE1MS44N2E3LjU5IDcuNTkgMCAwIDEtLjA0IDcuNzJNMTIwIDE0NHYtNDBhOCA4IDAgMCAxIDE2IDB2NDBhOCA4IDAgMCAxLTE2IDBtMjAgMzZhMTIgMTIgMCAxIDEtMTItMTIgMTIgMTIgMCAwIDEgMTIgMTJcIlxuICB9KSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IFN2Z0Vycm9ySWNvbjsiLCJ2YXIgX3BhdGg7XG5mdW5jdGlvbiBfZXh0ZW5kcygpIHsgcmV0dXJuIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKG4pIHsgZm9yICh2YXIgZSA9IDE7IGUgPCBhcmd1bWVudHMubGVuZ3RoOyBlKyspIHsgdmFyIHQgPSBhcmd1bWVudHNbZV07IGZvciAodmFyIHIgaW4gdCkgKHt9KS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIHIpICYmIChuW3JdID0gdFtyXSk7IH0gcmV0dXJuIG47IH0sIF9leHRlbmRzLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH1cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xudmFyIFN2Z0V4cGFuZCA9IGZ1bmN0aW9uIFN2Z0V4cGFuZChwcm9wcykge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgX2V4dGVuZHMoe1xuICAgIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gICAgd2lkdGg6IDMwLFxuICAgIGhlaWdodDogMzAsXG4gICAgZmlsbDogXCJjdXJyZW50Q29sb3JcIixcbiAgICB2aWV3Qm94OiBcIjAgMCAyNTYgMjU2XCJcbiAgfSwgcHJvcHMpLCBfcGF0aCB8fCAoX3BhdGggPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTIwMS41NCA1NC40NkExMDQgMTA0IDAgMCAwIDU0LjQ2IDIwMS41NCAxMDQgMTA0IDAgMCAwIDIwMS41NCA1NC40Nm0tMTEuMzEgMTM1Ljc3YTg4IDg4IDAgMSAxIDAtMTI0LjQ2IDg4LjExIDg4LjExIDAgMCAxIDAgMTI0LjQ2bS0xNi41Ny04OC41N0wxNDcuMzEgMTI4bDI2LjM1IDI2LjM0YTggOCAwIDAgMS0xMS4zMiAxMS4zMmwtMzItMzJhOCA4IDAgMCAxIDAtMTEuMzJsMzItMzJhOCA4IDAgMCAxIDExLjMyIDExLjMybS01NiAwTDkxLjMxIDEyOGwyNi4zNSAyNi4zNGE4IDggMCAwIDEtMTEuMzIgMTEuMzJsLTMyLTMyYTggOCAwIDAgMSAwLTExLjMybDMyLTMyYTggOCAwIDAgMSAxMS4zMiAxMS4zMlwiXG4gIH0pKSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgU3ZnRXhwYW5kOyIsInZhciBfcGF0aDtcbmZ1bmN0aW9uIF9leHRlbmRzKCkgeyByZXR1cm4gX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAobikgeyBmb3IgKHZhciBlID0gMTsgZSA8IGFyZ3VtZW50cy5sZW5ndGg7IGUrKykgeyB2YXIgdCA9IGFyZ3VtZW50c1tlXTsgZm9yICh2YXIgciBpbiB0KSAoe30pLmhhc093blByb3BlcnR5LmNhbGwodCwgcikgJiYgKG5bcl0gPSB0W3JdKTsgfSByZXR1cm4gbjsgfSwgX2V4dGVuZHMuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG52YXIgU3ZnR3JhcGhJY29uID0gZnVuY3Rpb24gU3ZnR3JhcGhJY29uKHByb3BzKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCBfZXh0ZW5kcyh7XG4gICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgICB3aWR0aDogMzIsXG4gICAgaGVpZ2h0OiAzMixcbiAgICB2aWV3Qm94OiBcIjAgMCAyNTYgMjU2XCJcbiAgfSwgcHJvcHMpLCBfcGF0aCB8fCAoX3BhdGggPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTIwMCAxNTJhMzEuODQgMzEuODQgMCAwIDAtMTkuNTMgNi42OGwtMjMuMTEtMThBMzEuNjUgMzEuNjUgMCAwIDAgMTYwIDEyOGMwLS43NCAwLTEuNDgtLjA4LTIuMjFsMTMuMjMtNC40MUEzMiAzMiAwIDEgMCAxNjggMTA0YzAgLjc0IDAgMS40OC4wOCAyLjIxbC0xMy4yMyA0LjQxQTMyIDMyIDAgMCAwIDEyOCA5NmEzMi42IDMyLjYgMCAwIDAtNS4yNy40NEwxMTUuODkgODFBMzIgMzIgMCAxIDAgOTYgODhhMzIuNiAzMi42IDAgMCAwIDUuMjctLjQ0bDYuODQgMTUuNGEzMS45MiAzMS45MiAwIDAgMC04LjU3IDM5LjY0bC0yNS43MSAyMi44NGEzMi4wNiAzMi4wNiAwIDEgMCAxMC42MyAxMmwyNS43MS0yMi44NGEzMS45MSAzMS45MSAwIDAgMCAzNy4zNi0xLjI0bDIzLjExIDE4QTMxLjY1IDMxLjY1IDAgMCAwIDE2OCAxODRhMzIgMzIgMCAxIDAgMzItMzJtMC02NGExNiAxNiAwIDEgMS0xNiAxNiAxNiAxNiAwIDAgMSAxNi0xNk04MCA1NmExNiAxNiAwIDEgMSAxNiAxNiAxNiAxNiAwIDAgMS0xNi0xNk01NiAyMDhhMTYgMTYgMCAxIDEgMTYtMTYgMTYgMTYgMCAwIDEtMTYgMTZtNTYtODBhMTYgMTYgMCAxIDEgMTYgMTYgMTYgMTYgMCAwIDEtMTYtMTZtODggNzJhMTYgMTYgMCAxIDEgMTYtMTYgMTYgMTYgMCAwIDEtMTYgMTZcIlxuICB9KSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IFN2Z0dyYXBoSWNvbjsiLCJ2YXIgX3BhdGg7XG5mdW5jdGlvbiBfZXh0ZW5kcygpIHsgcmV0dXJuIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKG4pIHsgZm9yICh2YXIgZSA9IDE7IGUgPCBhcmd1bWVudHMubGVuZ3RoOyBlKyspIHsgdmFyIHQgPSBhcmd1bWVudHNbZV07IGZvciAodmFyIHIgaW4gdCkgKHt9KS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIHIpICYmIChuW3JdID0gdFtyXSk7IH0gcmV0dXJuIG47IH0sIF9leHRlbmRzLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH1cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xudmFyIFN2Z09mZkljb24gPSBmdW5jdGlvbiBTdmdPZmZJY29uKHByb3BzKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCBfZXh0ZW5kcyh7XG4gICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgICB3aWR0aDogMTgsXG4gICAgaGVpZ2h0OiAxOCxcbiAgICBmaWxsOiBcIiNDNzNBM0FcIixcbiAgICB2aWV3Qm94OiBcIjAgMCAyNTYgMjU2XCJcbiAgfSwgcHJvcHMpLCBfcGF0aCB8fCAoX3BhdGggPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTE2NS42NiAxMDEuNjYgMTM5LjMxIDEyOGwyNi4zNSAyNi4zNGE4IDggMCAwIDEtMTEuMzIgMTEuMzJMMTI4IDEzOS4zMWwtMjYuMzQgMjYuMzVhOCA4IDAgMCAxLTExLjMyLTExLjMyTDExNi42OSAxMjhsLTI2LjM1LTI2LjM0YTggOCAwIDAgMSAxMS4zMi0xMS4zMkwxMjggMTE2LjY5bDI2LjM0LTI2LjM1YTggOCAwIDAgMSAxMS4zMiAxMS4zMk0yMzIgMTI4QTEwNCAxMDQgMCAxIDEgMTI4IDI0YTEwNC4xMSAxMDQuMTEgMCAwIDEgMTA0IDEwNG0tMTYgMGE4OCA4OCAwIDEgMC04OCA4OCA4OC4xIDg4LjEgMCAwIDAgODgtODhcIlxuICB9KSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IFN2Z09mZkljb247IiwiaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCwgeyB1c2VTdGF0ZSwgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgUHJvdmlkZXIgfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgU3RvcmUgZnJvbSAnLi9zdG9yZSc7XG5pbXBvcnQgQXBwQ29udGFpbmVyIGZyb20gJy4vQXBwQ29udGFpbmVyLnJlYWN0JztcbmltcG9ydCBnZXRDb25maWdGcm9tRE9NIGZyb20gJy4vY29uZmlnJztcbmltcG9ydCB7IGluaXRpYWxpemVXZWJTb2NrZXQsIGRpc2Nvbm5lY3RXZWJTb2NrZXQgfSBmcm9tICcuL29ic2VydmVycy93ZWJzb2NrZXRPYnNlcnZlcic7XG5jb25zdCBBcHBQcm92aWRlciA9ICh7IGhvb2tzID0ge1xuICAgIGxheW91dF9wcmU6IG51bGwsXG4gICAgbGF5b3V0X3Bvc3Q6IG51bGwsXG4gICAgcmVxdWVzdF9wcmU6IG51bGwsXG4gICAgcmVxdWVzdF9wb3N0OiBudWxsLFxuICAgIGNhbGxiYWNrX3Jlc29sdmVkOiBudWxsLFxuICAgIHJlcXVlc3RfcmVmcmVzaF9qd3Q6IG51bGxcbn0gfSkgPT4ge1xuICAgIGNvbnN0IFt7IHN0b3JlIH1dID0gdXNlU3RhdGUoKCkgPT4gbmV3IFN0b3JlKCkpO1xuICAgIC8vIFJlZ2lzdGVyIHRoZSBXZWJTb2NrZXQgb2JzZXJ2ZXIgd2hlbmV2ZXIgdGhlIGJhY2tlbmQgZXhwb3NlcyB3ZWJzb2NrZXRcbiAgICAvLyBpbmZyYXN0cnVjdHVyZS4gaW5pdGlhbGl6ZVdlYlNvY2tldCBvbmx5IG9wZW5zIHRoZSBzb2NrZXQgZWFnZXJseSB3aGVuXG4gICAgLy8gd2Vic29ja2V0IGNhbGxiYWNrcyBhcmUgZW5hYmxlZCBnbG9iYWxseTsgcGVyLWNhbGxiYWNrIHdlYnNvY2tldD1UcnVlXG4gICAgLy8gb3BlbnMgaXQgbGF6aWx5IG9uIGZpcnN0IGRpc3BhdGNoLlxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGdldENvbmZpZ0Zyb21ET00oKTtcbiAgICAgICAgaWYgKGNvbmZpZy53ZWJzb2NrZXQ/LnVybCAmJiBjb25maWcud2Vic29ja2V0Py53b3JrZXJfdXJsKSB7XG4gICAgICAgICAgICAvLyBBZGQgZmV0Y2ggY29uZmlnIGZvciBjb25zaXN0ZW5jeVxuICAgICAgICAgICAgY29uc3QgZnVsbENvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICAuLi5jb25maWcsXG4gICAgICAgICAgICAgICAgZmV0Y2g6IHtcbiAgICAgICAgICAgICAgICAgICAgY3JlZGVudGlhbHM6ICdzYW1lLW9yaWdpbicsXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGluaXRpYWxpemVXZWJTb2NrZXQoc3RvcmUsIGZ1bGxDb25maWcpO1xuICAgICAgICB9XG4gICAgICAgIC8vIENsZWFudXAgb24gdW5tb3VudFxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgZGlzY29ubmVjdFdlYlNvY2tldCgpO1xuICAgICAgICB9O1xuICAgIH0sIFtzdG9yZV0pO1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChQcm92aWRlciwgeyBzdG9yZTogc3RvcmUgfSxcbiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChBcHBDb250YWluZXIsIHsgaG9va3M6IGhvb2tzIH0pKSk7XG59O1xuQXBwUHJvdmlkZXIucHJvcFR5cGVzID0ge1xuICAgIGhvb2tzOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgICBsYXlvdXRfcHJlOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAgICAgbGF5b3V0X3Bvc3Q6IFByb3BUeXBlcy5mdW5jLFxuICAgICAgICByZXF1ZXN0X3ByZTogUHJvcFR5cGVzLmZ1bmMsXG4gICAgICAgIHJlcXVlc3RfcG9zdDogUHJvcFR5cGVzLmZ1bmMsXG4gICAgICAgIGNhbGxiYWNrX3Jlc29sdmVkOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAgICAgcmVxdWVzdF9yZWZyZXNoX2p3dDogUHJvcFR5cGVzLmZ1bmNcbiAgICB9KVxufTtcbmV4cG9ydCBkZWZhdWx0IEFwcFByb3ZpZGVyO1xuIiwiaW1wb3J0IHsgYW55LCBmaWx0ZXIsIG1hcCwgcGF0aCB9IGZyb20gJ3JhbWRhJztcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN0b3JlT2JzZXJ2ZXIge1xuICAgIF9zdG9yZTtcbiAgICBfdW5zdWJzY3JpYmU7XG4gICAgX29ic2VydmVycyA9IFtdO1xuICAgIGNvbnN0cnVjdG9yKHN0b3JlKSB7XG4gICAgICAgIHRoaXMuX19pbml0X18oc3RvcmUpO1xuICAgIH1cbiAgICBvYnNlcnZlID0gKG9ic2VydmVyLCBpbnB1dHMpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBvYnNlcnZlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGlucHV0cykpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2lucHV0cyBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmFkZChvYnNlcnZlciwgaW5wdXRzKTtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB0aGlzLnJlbW92ZShvYnNlcnZlcik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hZGQob2JzZXJ2ZXIub2JzZXJ2ZXIsIG9ic2VydmVyLmlucHV0cyk7XG4gICAgICAgIHJldHVybiAoKSA9PiB0aGlzLnJlbW92ZShvYnNlcnZlci5vYnNlcnZlcik7XG4gICAgfTtcbiAgICBzZXRTdG9yZSA9IChzdG9yZSkgPT4ge1xuICAgICAgICB0aGlzLl9fZmluYWxpemVfXygpO1xuICAgICAgICB0aGlzLl9faW5pdF9fKHN0b3JlKTtcbiAgICB9O1xuICAgIF9fZmluYWxpemVfXyA9ICgpID0+IHRoaXMuX3Vuc3Vic2NyaWJlPy4oKTtcbiAgICBfX2luaXRfXyA9IChzdG9yZSkgPT4ge1xuICAgICAgICB0aGlzLl9zdG9yZSA9IHN0b3JlO1xuICAgICAgICBpZiAoc3RvcmUpIHtcbiAgICAgICAgICAgIHRoaXMuX3Vuc3Vic2NyaWJlID0gc3RvcmUuc3Vic2NyaWJlKHRoaXMubm90aWZ5KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9vYnNlcnZlcnMuZm9yRWFjaChvID0+IHtcbiAgICAgICAgICAgIG8ubGFzdFN0YXRlID0gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBhZGQgPSAob2JzZXJ2ZXIsIGlucHV0cykgPT4gdGhpcy5fb2JzZXJ2ZXJzLnB1c2goe1xuICAgICAgICBpbnB1dFBhdGhzOiBtYXAocCA9PiBwLnNwbGl0KCcuJyksIGlucHV0cyksXG4gICAgICAgIGxhc3RTdGF0ZTogbnVsbCxcbiAgICAgICAgb2JzZXJ2ZXIsXG4gICAgICAgIHRyaWdnZXJlZDogZmFsc2VcbiAgICB9KTtcbiAgICBub3RpZnkgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0b3JlID0gdGhpcy5fc3RvcmU7XG4gICAgICAgIGlmICghc3RvcmUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdGF0ZSA9IHN0b3JlLmdldFN0YXRlKCk7XG4gICAgICAgIGNvbnN0IHRyaWdnZXJlZCA9IGZpbHRlcihvID0+ICFvLnRyaWdnZXJlZCAmJlxuICAgICAgICAgICAgYW55KGkgPT4gcGF0aChpLCBzdGF0ZSkgIT09IHBhdGgoaSwgby5sYXN0U3RhdGUpLCBvLmlucHV0UGF0aHMpLCB0aGlzLl9vYnNlcnZlcnMpO1xuICAgICAgICB0cmlnZ2VyZWQuZm9yRWFjaChvID0+IHtcbiAgICAgICAgICAgIG8udHJpZ2dlcmVkID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRyaWdnZXJlZC5mb3JFYWNoKG8gPT4ge1xuICAgICAgICAgICAgby5sYXN0U3RhdGUgPSBzdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICAgICAgby5vYnNlcnZlcihzdG9yZSk7XG4gICAgICAgICAgICBvLnRyaWdnZXJlZCA9IGZhbHNlO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJlbW92ZSA9IChvYnNlcnZlcikgPT4gdGhpcy5fb2JzZXJ2ZXJzLnNwbGljZSh0aGlzLl9vYnNlcnZlcnMuZmluZEluZGV4KG8gPT4gb2JzZXJ2ZXIgPT09IG8ub2JzZXJ2ZXIsIHRoaXMuX29ic2VydmVycyksIDEpO1xufVxuIiwiaW1wb3J0IHsgY29uY2F0LCBmbGF0dGVuLCBpbnRlcnNlY3Rpb24sIGtleXMsIG1hcCwgbWVyZ2VEZWVwUmlnaHQsIHBhdGgsIHBpY2ssIHBsdWNrLCB2YWx1ZXMsIHRvUGFpcnMsIHppcCwgYXNzb2NQYXRoIH0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IHsgU1RBVFVTLCBKV1RfRVhQSVJFRF9NRVNTQUdFIH0gZnJvbSAnLi4vY29uc3RhbnRzL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBNQVhfQVVUSF9SRVRSSUVTIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgQ2FsbGJhY2tBY3Rpb25UeXBlLCBDYWxsYmFja0FnZ3JlZ2F0ZUFjdGlvblR5cGUgfSBmcm9tICcuLi9yZWR1Y2Vycy9jYWxsYmFja3MnO1xuaW1wb3J0IHsgaXNNdWx0aVZhbHVlZCwgc3RyaW5naWZ5SWQsIGlzTXVsdGlPdXRwdXRQcm9wIH0gZnJvbSAnLi9kZXBlbmRlbmNpZXMnO1xuaW1wb3J0IHsgdXJsQmFzZSB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgZ2V0Q1NSRkhlYWRlciwgZGlzcGF0Y2hFcnJvciwgc2V0UGF0aHMgfSBmcm9tICcuJztcbmltcG9ydCB7IGNyZWF0ZUFjdGlvbiB9IGZyb20gJ3JlZHV4LWFjdGlvbnMnO1xuaW1wb3J0IHsgYWRkSHR0cEhlYWRlcnMgfSBmcm9tICcuLi9hY3Rpb25zJztcbmltcG9ydCB7IG5vdGlmeU9ic2VydmVycywgdXBkYXRlUHJvcHMgfSBmcm9tICcuL2luZGV4JztcbmltcG9ydCB7IGlzUGF0Y2gsIHBhcnNlUGF0Y2hQcm9wcyB9IGZyb20gJy4vcGF0Y2gnO1xuaW1wb3J0IHsgY3JlYXRlUGF0Y2hBbmFseXNpcyB9IGZyb20gJy4vcGF0Y2hBbmFseXNpcyc7XG5pbXBvcnQgeyBjb21wdXRlUGF0aHMsIGdldFBhdGggfSBmcm9tICcuL3BhdGhzJztcbmltcG9ydCB7IHJlcXVlc3REZXBlbmRlbmNpZXMgfSBmcm9tICcuL3JlcXVlc3REZXBlbmRlbmNpZXMnO1xuaW1wb3J0IHsgbG9hZExpYnJhcnkgfSBmcm9tICcuLi91dGlscy9saWJyYXJpZXMnO1xuaW1wb3J0IHsgZ2V0U3RyZWFtQ2xpZW50LCBpc1N0cmVhbU11bHRpcGxleGVkIH0gZnJvbSAnLi4vdXRpbHMvc3RyZWFtQ2xpZW50JztcbmltcG9ydCB7IHBhcnNlUE1DSWQgfSBmcm9tICcuL3BhdHRlcm5NYXRjaGluZyc7XG5pbXBvcnQgeyByZXBsYWNlUE1DIH0gZnJvbSAnLi9wYXR0ZXJuTWF0Y2hpbmcnO1xuaW1wb3J0IHsgbG9hZGVkLCBsb2FkaW5nIH0gZnJvbSAnLi9sb2FkaW5nJztcbmltcG9ydCB7IGdldENvbXBvbmVudExheW91dCB9IGZyb20gJy4uL3dyYXBwZXIvd3JhcHBpbmcnO1xuaW1wb3J0IHsgZ2V0V29ya2VyQ2xpZW50LCBpc1dlYlNvY2tldEVuYWJsZWQsIGlzV2ViU29ja2V0QXZhaWxhYmxlIH0gZnJvbSAnLi4vdXRpbHMvd29ya2VyQ2xpZW50JztcbmV4cG9ydCBjb25zdCBhZGRCbG9ja2VkQ2FsbGJhY2tzID0gY3JlYXRlQWN0aW9uKENhbGxiYWNrQWN0aW9uVHlwZS5BZGRCbG9ja2VkKTtcbmV4cG9ydCBjb25zdCBhZGRDb21wbGV0ZWRDYWxsYmFja3MgPSBjcmVhdGVBY3Rpb24oQ2FsbGJhY2tBZ2dyZWdhdGVBY3Rpb25UeXBlLkFkZENvbXBsZXRlZCk7XG5leHBvcnQgY29uc3QgYWRkRXhlY3V0ZWRDYWxsYmFja3MgPSBjcmVhdGVBY3Rpb24oQ2FsbGJhY2tBY3Rpb25UeXBlLkFkZEV4ZWN1dGVkKTtcbmV4cG9ydCBjb25zdCBhZGRFeGVjdXRpbmdDYWxsYmFja3MgPSBjcmVhdGVBY3Rpb24oQ2FsbGJhY2tBY3Rpb25UeXBlLkFkZEV4ZWN1dGluZyk7XG5leHBvcnQgY29uc3QgYWRkUHJpb3JpdGl6ZWRDYWxsYmFja3MgPSBjcmVhdGVBY3Rpb24oQ2FsbGJhY2tBY3Rpb25UeXBlLkFkZFByaW9yaXRpemVkKTtcbmV4cG9ydCBjb25zdCBhZGRSZXF1ZXN0ZWRDYWxsYmFja3MgPSBjcmVhdGVBY3Rpb24oQ2FsbGJhY2tBY3Rpb25UeXBlLkFkZFJlcXVlc3RlZCk7XG5leHBvcnQgY29uc3QgYWRkU3RvcmVkQ2FsbGJhY2tzID0gY3JlYXRlQWN0aW9uKENhbGxiYWNrQWN0aW9uVHlwZS5BZGRTdG9yZWQpO1xuZXhwb3J0IGNvbnN0IGFkZFdhdGNoZWRDYWxsYmFja3MgPSBjcmVhdGVBY3Rpb24oQ2FsbGJhY2tBY3Rpb25UeXBlLkFkZFdhdGNoZWQpO1xuZXhwb3J0IGNvbnN0IHJlbW92ZUV4ZWN1dGVkQ2FsbGJhY2tzID0gY3JlYXRlQWN0aW9uKENhbGxiYWNrQWN0aW9uVHlwZS5SZW1vdmVFeGVjdXRlZCk7XG5leHBvcnQgY29uc3QgcmVtb3ZlQmxvY2tlZENhbGxiYWNrcyA9IGNyZWF0ZUFjdGlvbihDYWxsYmFja0FjdGlvblR5cGUuUmVtb3ZlQmxvY2tlZCk7XG5leHBvcnQgY29uc3QgcmVtb3ZlRXhlY3V0aW5nQ2FsbGJhY2tzID0gY3JlYXRlQWN0aW9uKENhbGxiYWNrQWN0aW9uVHlwZS5SZW1vdmVFeGVjdXRpbmcpO1xuZXhwb3J0IGNvbnN0IHJlbW92ZVByaW9yaXRpemVkQ2FsbGJhY2tzID0gY3JlYXRlQWN0aW9uKENhbGxiYWNrQWN0aW9uVHlwZS5SZW1vdmVQcmlvcml0aXplZCk7XG5leHBvcnQgY29uc3QgcmVtb3ZlUmVxdWVzdGVkQ2FsbGJhY2tzID0gY3JlYXRlQWN0aW9uKENhbGxiYWNrQWN0aW9uVHlwZS5SZW1vdmVSZXF1ZXN0ZWQpO1xuZXhwb3J0IGNvbnN0IHJlbW92ZVN0b3JlZENhbGxiYWNrcyA9IGNyZWF0ZUFjdGlvbihDYWxsYmFja0FjdGlvblR5cGUuUmVtb3ZlU3RvcmVkKTtcbmV4cG9ydCBjb25zdCByZW1vdmVXYXRjaGVkQ2FsbGJhY2tzID0gY3JlYXRlQWN0aW9uKENhbGxiYWNrQWN0aW9uVHlwZS5SZW1vdmVXYXRjaGVkKTtcbmV4cG9ydCBjb25zdCBhZ2dyZWdhdGVDYWxsYmFja3MgPSBjcmVhdGVBY3Rpb24oQ2FsbGJhY2tBZ2dyZWdhdGVBY3Rpb25UeXBlLkFnZ3JlZ2F0ZSk7XG5jb25zdCB1cGRhdGVSZXNvdXJjZVVzYWdlID0gY3JlYXRlQWN0aW9uKCdVUERBVEVfUkVTT1VSQ0VfVVNBR0UnKTtcbmNvbnN0IGFkZENhbGxiYWNrSm9iID0gY3JlYXRlQWN0aW9uKCdBRERfQ0FMTEJBQ0tfSk9CJyk7XG5jb25zdCByZW1vdmVDYWxsYmFja0pvYiA9IGNyZWF0ZUFjdGlvbignUkVNT1ZFX0NBTExCQUNLX0pPQicpO1xuY29uc3Qgc2V0Q2FsbGJhY2tKb2JPdXRkYXRlZCA9IGNyZWF0ZUFjdGlvbignQ0FMTEJBQ0tfSk9CX09VVERBVEVEJyk7XG5mdW5jdGlvbiB1bndyYXBJZk5vdE11bHRpKHBhdGhzLCBpZFByb3BzLCBzcGVjLCBhbnlWYWxzLCBkZXBUeXBlKSB7XG4gICAgbGV0IG1zZyA9ICcnO1xuICAgIGlmIChpc011bHRpVmFsdWVkKHNwZWMpKSB7XG4gICAgICAgIHJldHVybiBbaWRQcm9wcywgbXNnXTtcbiAgICB9XG4gICAgaWYgKGlkUHJvcHMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIGlmICghaWRQcm9wcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChzcGVjLmFsbG93X29wdGlvbmFsKSB7XG4gICAgICAgICAgICAgICAgaWRQcm9wcyA9IFt7IC4uLnNwZWMsIHZhbHVlOiBudWxsIH1dO1xuICAgICAgICAgICAgICAgIG1zZyA9ICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNTdHIgPSB0eXBlb2Ygc3BlYy5pZCA9PT0gJ3N0cmluZyc7XG4gICAgICAgICAgICAgICAgbXNnID1cbiAgICAgICAgICAgICAgICAgICAgJ0Egbm9uZXhpc3RlbnQgb2JqZWN0IHdhcyB1c2VkIGluIGFuIGAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlcFR5cGUgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2Agb2YgYSBEYXNoIGNhbGxiYWNrLiBUaGUgaWQgb2YgdGhpcyBvYmplY3QgaXMgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAoaXNTdHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdgJyArIHNwZWMuaWQgKyAnYCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEpTT04uc3RyaW5naWZ5KHNwZWMuaWQpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFueVZhbHMgPyAnIHdpdGggTUFUQ0ggdmFsdWVzICcgKyBhbnlWYWxzIDogJycpKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAnIGFuZCB0aGUgcHJvcGVydHkgaXMgYCcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgc3BlYy5wcm9wZXJ0eSArXG4gICAgICAgICAgICAgICAgICAgICAgICAoaXNTdHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdgLiBUaGUgc3RyaW5nIGlkcyBpbiB0aGUgY3VycmVudCBsYXlvdXQgYXJlOiBbJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXMocGF0aHMuc3Rycykuam9pbignLCAnKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICddJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ2AuIFRoZSB3aWxkY2FyZCBpZHMgY3VycmVudGx5IGF2YWlsYWJsZSBhcmUgbG9nZ2VkIGFib3ZlLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbXNnID1cbiAgICAgICAgICAgICAgICAnTXVsdGlwbGUgb2JqZWN0cyB3ZXJlIGZvdW5kIGZvciBhbiBgJyArXG4gICAgICAgICAgICAgICAgICAgIGRlcFR5cGUgK1xuICAgICAgICAgICAgICAgICAgICAnYCBvZiBhIGNhbGxiYWNrIHRoYXQgb25seSB0YWtlcyBvbmUgdmFsdWUuIFRoZSBpZCBzcGVjIGlzICcgK1xuICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShzcGVjLmlkKSArXG4gICAgICAgICAgICAgICAgICAgIChhbnlWYWxzID8gJyB3aXRoIE1BVENIIHZhbHVlcyAnICsgYW55VmFscyA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAgICcgYW5kIHRoZSBwcm9wZXJ0eSBpcyBgJyArXG4gICAgICAgICAgICAgICAgICAgIHNwZWMucHJvcGVydHkgK1xuICAgICAgICAgICAgICAgICAgICAnYC4gVGhlIG9iamVjdHMgd2UgZm91bmQgYXJlOiAnICtcbiAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkobWFwKHBpY2soWydpZCcsICdwcm9wZXJ0eSddKSwgaWRQcm9wcykpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBbaWRQcm9wc1swXSwgbXNnXTtcbn1cbmZ1bmN0aW9uIGZpbGxWYWxzKHBhdGhzLCBsYXlvdXQsIGNiLCBzcGVjcywgZGVwVHlwZSwgYWxsb3dBbGxNaXNzaW5nID0gZmFsc2UpIHtcbiAgICBjb25zdCBnZXR0ZXIgPSBkZXBUeXBlID09PSAnSW5wdXQnID8gY2IuZ2V0SW5wdXRzIDogY2IuZ2V0U3RhdGU7XG4gICAgY29uc3QgZXJyb3JzID0gW107XG4gICAgbGV0IGVtcHR5TXVsdGlWYWx1ZXMgPSAwO1xuICAgIGNvbnN0IGlucHV0VmFscyA9IGdldHRlcihwYXRocykubWFwKChpbnB1dExpc3QsIGkpID0+IHtcbiAgICAgICAgY29uc3QgW2lucHV0cywgaW5wdXRFcnJvcl0gPSB1bndyYXBJZk5vdE11bHRpKHBhdGhzLCBpbnB1dExpc3QubWFwKCh7IGlkLCBwcm9wZXJ0eSwgcGF0aDogcGF0aF8gfSkgPT4gKHtcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgcHJvcGVydHksXG4gICAgICAgICAgICB2YWx1ZTogcGF0aChbLi4ucGF0aF8sICdwcm9wcycsIHByb3BlcnR5XSwgbGF5b3V0KVxuICAgICAgICB9KSksIHNwZWNzW2ldLCBjYi5hbnlWYWxzLCBkZXBUeXBlKTtcbiAgICAgICAgaWYgKGlzTXVsdGlWYWx1ZWQoc3BlY3NbaV0pICYmICFpbnB1dHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBlbXB0eU11bHRpVmFsdWVzKys7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlucHV0RXJyb3IpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKGlucHV0RXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbnB1dHM7XG4gICAgfSk7XG4gICAgaWYgKGVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgaWYgKGFsbG93QWxsTWlzc2luZyAmJlxuICAgICAgICAgICAgZXJyb3JzLmxlbmd0aCArIGVtcHR5TXVsdGlWYWx1ZXMgPT09IGlucHV0VmFscy5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIFdlIGhhdmUgYXQgbGVhc3Qgb25lIG5vbi1tdWx0aXZhbHVlZCBpbnB1dCwgYnV0IGFsbCBzaW1wbGUgYW5kXG4gICAgICAgICAgICAvLyBtdWx0aS12YWx1ZWQgaW5wdXRzIGFyZSBtaXNzaW5nLlxuICAgICAgICAgICAgLy8gKGlmIGFsbCBpbnB1dHMgYXJlIG11bHRpdmFsdWVkIGFuZCBhbGwgbWlzc2luZyB3ZSBzdGlsbCByZXR1cm5cbiAgICAgICAgICAgIC8vIHRoZW0gYXMgbm9ybWFsLCBhbmQgZmlyZSB0aGUgY2FsbGJhY2suKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgd2UgZ2V0IGhlcmUgd2UgaGF2ZSBzb21lIG1pc3NpbmcgYW5kIHNvbWUgcHJlc2VudCBpbnB1dHMuXG4gICAgICAgIC8vIE9yIGFsbCBtaXNzaW5nIGluIGEgY29udGV4dCB0aGF0IGRvZXNuJ3QgYWxsb3cgdGhpcy5cbiAgICAgICAgLy8gVGhhdCdzIGEgcmVhbCBwcm9ibGVtLCBzbyB0aHJvdyB0aGUgZmlyc3QgbWVzc2FnZSBhcyBhbiBlcnJvci5cbiAgICAgICAgcmVmRXJyKGVycm9ycywgcGF0aHMpO1xuICAgIH1cbiAgICByZXR1cm4gaW5wdXRWYWxzO1xufVxuZnVuY3Rpb24gcmVmRXJyKGVycm9ycywgcGF0aHMpIHtcbiAgICBjb25zdCBlcnIgPSBlcnJvcnNbMF07XG4gICAgaWYgKGVyci5pbmRleE9mKCdsb2dnZWQgYWJvdmUnKSAhPT0gLTEpIHtcbiAgICAgICAgLy8gV2lsZGNhcmQgcmVmZXJlbmNlIGVycm9ycyBtZW50aW9uIGEgbGlzdCBvZiB3aWxkY2FyZCBzcGVjcyBsb2dnZWRcbiAgICAgICAgLy8gVE9ETzogdW53cmFwcGVkIGxpc3Qgb2Ygd2lsZGNhcmQgaWRzP1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICBjb25zb2xlLmVycm9yKHBhdGhzLm9ianMpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoZXJyKTtcbn1cbmNvbnN0IGdldFZhbHMgPSAoaW5wdXQpID0+IEFycmF5LmlzQXJyYXkoaW5wdXQpID8gcGx1Y2soJ3ZhbHVlJywgaW5wdXQpIDogaW5wdXQudmFsdWU7XG5jb25zdCB6aXBJZkFycmF5ID0gKGEsIGIpID0+IHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhKSkge1xuICAgICAgICAvLyBGb3IgY2xpZW50LXNpZGUgY2FsbGJhY2tzIHdpdGggbXVsdGlwbGUgT3V0cHV0cywgb25seSByZXR1cm4gYSBzaW5nbGUgZGFzaF9jbGllbnRzaWRlLm5vX3VwZGF0ZVxuICAgICAgICBpZiAoYiA9PT0gd2luZG93LmRhc2hfY2xpZW50c2lkZS5ub191cGRhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiB6aXAoYSwgW2JdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gemlwKGEsIGIpO1xuICAgIH1cbiAgICByZXR1cm4gW1thLCBiXV07XG59O1xuZnVuY3Rpb24gY2xlYW5PdXRwdXRQcm9wKHByb3BlcnR5KSB7XG4gICAgcmV0dXJuIHByb3BlcnR5LnNwbGl0KCdAJylbMF07XG59XG5mdW5jdGlvbiBwYXRjaGVkUmVzdWx0RmllbGRzKHBhdGNoZWRPdXRwdXRzKSB7XG4gICAgcmV0dXJuIGtleXMocGF0Y2hlZE91dHB1dHMpLmxlbmd0aCA/IHsgcGF0Y2hlZE91dHB1dHMgfSA6IHt9O1xufVxuLy8gV2hlbiB0aGUgTGF5b3V0IG1heSBoYXZlIGNoYW5nZWQsIHJ1biBlYWNoIG91dHB1dCB0aHJvdWdoIHBhcnNlUGF0Y2hQcm9wcyBhZ2FpbnN0XG4vLyB0aGUgY3VycmVudCBsYXlvdXQsIHJlY29yZGluZyBhIFBhdGNoQW5hbHlzaXMgZm9yIGVhY2ggb3V0cHV0IHRoYXRcbi8vIHJldHVybmVkIGEgUGF0Y2guIFNoYXJlZCBieSB0aGUgY2xpZW50c2lkZSBhbmQgc2VydmVyc2lkZSByZXN1bHQgcGF0aHNcbmZ1bmN0aW9uIGFwcGx5UGF0Y2hlZE91dHB1dHMob3V0cHV0cywgcGF0aHMsIGN1cnJlbnRMYXlvdXQsIGRhdGEpIHtcbiAgICBjb25zdCBwYXRjaGVkT3V0cHV0cyA9IHt9O1xuICAgIGZsYXR0ZW4ob3V0cHV0cykuZm9yRWFjaCgob3V0KSA9PiB7XG4gICAgICAgIGNvbnN0IHByb3BOYW1lID0gY2xlYW5PdXRwdXRQcm9wKG91dC5wcm9wZXJ0eSk7XG4gICAgICAgIGNvbnN0IG91dHB1dFBhdGggPSBnZXRQYXRoKHBhdGhzLCBvdXQuaWQpO1xuICAgICAgICBjb25zdCBpZFN0ciA9IHN0cmluZ2lmeUlkKG91dC5pZCk7XG4gICAgICAgIGNvbnN0IGRhdGFQYXRoID0gW2lkU3RyLCBwcm9wTmFtZV07XG4gICAgICAgIGNvbnN0IG91dHB1dFZhbHVlID0gcGF0aChkYXRhUGF0aCwgZGF0YSk7XG4gICAgICAgIGlmIChvdXRwdXRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzUGF0Y2gob3V0cHV0VmFsdWUpKSB7XG4gICAgICAgICAgICAvLyBPbmUgYW5hbHlzaXMgcGVyIG91dHB1dCwgc2hhcmVkIGJ5IGFsbCBvZiBpdHNcbiAgICAgICAgICAgIC8vIHBhdGNoZWQgcHJvcHNcbiAgICAgICAgICAgIHBhdGNoZWRPdXRwdXRzW2lkU3RyXSA9XG4gICAgICAgICAgICAgICAgcGF0Y2hlZE91dHB1dHNbaWRTdHJdIHx8IGNyZWF0ZVBhdGNoQW5hbHlzaXMoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvbGRQcm9wcyA9IHBhdGgob3V0cHV0UGF0aC5jb25jYXQoWydwcm9wcyddKSwgY3VycmVudExheW91dCkgfHwge307XG4gICAgICAgIGNvbnN0IG5ld1Byb3BzID0gcGFyc2VQYXRjaFByb3BzKHsgW3Byb3BOYW1lXTogb3V0cHV0VmFsdWUgfSwgb2xkUHJvcHMsIHBhdGNoZWRPdXRwdXRzW2lkU3RyXSk7XG4gICAgICAgIGRhdGEgPSBhc3NvY1BhdGgoZGF0YVBhdGgsIG5ld1Byb3BzW3Byb3BOYW1lXSwgZGF0YSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHsgZGF0YSwgcGF0Y2hlZE91dHB1dHMgfTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZUNsaWVudHNpZGUoZGlzcGF0Y2gsIGNsaWVudHNpZGVfZnVuY3Rpb24sIGNvbmZpZywgcGF5bG9hZCkge1xuICAgIGNvbnN0IGRjID0gKHdpbmRvdy5kYXNoX2NsaWVudHNpZGUgPVxuICAgICAgICB3aW5kb3cuZGFzaF9jbGllbnRzaWRlIHx8IHt9KTtcbiAgICBpZiAoIWRjLm5vX3VwZGF0ZSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZGMsICdub191cGRhdGUnLCB7XG4gICAgICAgICAgICB2YWx1ZTogeyBkZXNjcmlwdGlvbjogJ1JldHVybiB0byBwcmV2ZW50IHVwZGF0aW5nIGFuIE91dHB1dC4nIH0sXG4gICAgICAgICAgICB3cml0YWJsZTogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkYywgJ1ByZXZlbnRVcGRhdGUnLCB7XG4gICAgICAgICAgICB2YWx1ZTogeyBkZXNjcmlwdGlvbjogJ1Rocm93IHRvIHByZXZlbnQgdXBkYXRpbmcgYWxsIE91dHB1dHMuJyB9LFxuICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCB7IGlucHV0cywgb3V0cHV0cywgc3RhdGUgfSA9IHBheWxvYWQ7XG4gICAgY29uc3QgcmVxdWVzdFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGlucHV0RGljdCA9IGlucHV0c1RvRGljdChpbnB1dHMpO1xuICAgIGNvbnN0IHN0YXRlRGljdCA9IGlucHV0c1RvRGljdChzdGF0ZSk7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgbGV0IHN0YXR1cyA9IFNUQVRVUy5PSztcbiAgICB0cnkge1xuICAgICAgICBjb25zdCB7IG5hbWVzcGFjZSwgZnVuY3Rpb25fbmFtZSB9ID0gY2xpZW50c2lkZV9mdW5jdGlvbjtcbiAgICAgICAgbGV0IGFyZ3MgPSBpbnB1dHMubWFwKGdldFZhbHMpO1xuICAgICAgICBpZiAoc3RhdGUpIHtcbiAgICAgICAgICAgIGFyZ3MgPSBjb25jYXQoYXJncywgc3RhdGUubWFwKGdldFZhbHMpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBzZXR1cCBjYWxsYmFjayBjb250ZXh0XG4gICAgICAgIGRjLmNhbGxiYWNrX2NvbnRleHQgPSB7fTtcbiAgICAgICAgZGMuY2FsbGJhY2tfY29udGV4dC50cmlnZ2VyZWQgPSBwYXlsb2FkLmNoYW5nZWRQcm9wSWRzLm1hcChwcm9wX2lkID0+ICh7XG4gICAgICAgICAgICBwcm9wX2lkOiBwcm9wX2lkLFxuICAgICAgICAgICAgdmFsdWU6IGlucHV0RGljdFtwcm9wX2lkXVxuICAgICAgICB9KSk7XG4gICAgICAgIGRjLmNhbGxiYWNrX2NvbnRleHQudHJpZ2dlcmVkX2lkID0gZ2V0VHJpZ2dlcmVkSWQocGF5bG9hZC5jaGFuZ2VkUHJvcElkcyk7XG4gICAgICAgIGRjLmNhbGxiYWNrX2NvbnRleHQuaW5wdXRzX2xpc3QgPSBpbnB1dHM7XG4gICAgICAgIGRjLmNhbGxiYWNrX2NvbnRleHQuaW5wdXRzID0gaW5wdXREaWN0O1xuICAgICAgICBkYy5jYWxsYmFja19jb250ZXh0LnN0YXRlc19saXN0ID0gc3RhdGU7XG4gICAgICAgIGRjLmNhbGxiYWNrX2NvbnRleHQuc3RhdGVzID0gc3RhdGVEaWN0O1xuICAgICAgICBkYy5jYWxsYmFja19jb250ZXh0Lm91dHB1dHNfbGlzdCA9IG91dHB1dHM7XG4gICAgICAgIGxldCByZXR1cm5WYWx1ZSA9IGRjW25hbWVzcGFjZV1bZnVuY3Rpb25fbmFtZV0oLi4uYXJncyk7XG4gICAgICAgIGRlbGV0ZSBkYy5jYWxsYmFja19jb250ZXh0O1xuICAgICAgICBpZiAodHlwZW9mIHJldHVyblZhbHVlPy50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm5WYWx1ZSA9IGF3YWl0IHJldHVyblZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvdXRwdXRzKSB7XG4gICAgICAgICAgICB6aXBJZkFycmF5KG91dHB1dHMsIHJldHVyblZhbHVlKS5mb3JFYWNoKChbb3V0aSwgcmV0aV0pID0+IHtcbiAgICAgICAgICAgICAgICB6aXBJZkFycmF5KG91dGksIHJldGkpLmZvckVhY2goKFtvdXRpaiwgcmV0aWpdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgaWQsIHByb3BlcnR5IH0gPSBvdXRpajtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaWRTdHIgPSBzdHJpbmdpZnlJZChpZCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFGb3JJZCA9IChyZXN1bHRbaWRTdHJdID0gcmVzdWx0W2lkU3RyXSB8fCB7fSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXRpaiAhPT0gZGMubm9fdXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhRm9ySWRbY2xlYW5PdXRwdXRQcm9wKHByb3BlcnR5KV0gPSByZXRpajtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGUgPT09IGRjLlByZXZlbnRVcGRhdGUpIHtcbiAgICAgICAgICAgIHN0YXR1cyA9IFNUQVRVUy5QUkVWRU5UX1VQREFURTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0YXR1cyA9IFNUQVRVUy5DTElFTlRTSURFX0VSUk9SO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgZGVsZXRlIGRjLmNhbGxiYWNrX2NvbnRleHQ7XG4gICAgICAgIC8vIFNldHRpbmcgc2VydmVyID0gY2xpZW50IGZvcmNlcyBuZXR3b3JrID0gMFxuICAgICAgICBjb25zdCB0b3RhbFRpbWUgPSBEYXRlLm5vdygpIC0gcmVxdWVzdFRpbWU7XG4gICAgICAgIGNvbnN0IHJlc291cmNlcyA9IHtcbiAgICAgICAgICAgIF9fZGFzaF9zZXJ2ZXI6IHRvdGFsVGltZSxcbiAgICAgICAgICAgIF9fZGFzaF9jbGllbnQ6IHRvdGFsVGltZSxcbiAgICAgICAgICAgIF9fZGFzaF91cGxvYWQ6IDAsXG4gICAgICAgICAgICBfX2Rhc2hfZG93bmxvYWQ6IDBcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGNvbmZpZy51aSkge1xuICAgICAgICAgICAgZGlzcGF0Y2godXBkYXRlUmVzb3VyY2VVc2FnZSh7XG4gICAgICAgICAgICAgICAgaWQ6IHBheWxvYWQub3V0cHV0LFxuICAgICAgICAgICAgICAgIHVzYWdlOiByZXNvdXJjZXMsXG4gICAgICAgICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgICAgICBpbnB1dHMsXG4gICAgICAgICAgICAgICAgc3RhdGVcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gdXBkYXRlQ29tcG9uZW50KGNvbXBvbmVudF9pZCwgcHJvcHMsIGNiKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkaXNwYXRjaCwgZ2V0U3RhdGUpIHtcbiAgICAgICAgY29uc3QgeyBwYXRocywgY29uZmlnIH0gPSBnZXRTdGF0ZSgpO1xuICAgICAgICBjb25zdCBjb21wb25lbnRQYXRoID0gZ2V0UGF0aChwYXRocywgY29tcG9uZW50X2lkKTtcbiAgICAgICAgaWYgKCFjb21wb25lbnRQYXRoKSB7XG4gICAgICAgICAgICBpZiAoIWNvbmZpZy5zdXBwcmVzc19jYWxsYmFja19leGNlcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2hFcnJvcihkaXNwYXRjaCkoJ0lEIHJ1bm5pbmcgY29tcG9uZW50IG5vdCBmb3VuZCBpbiBsYXlvdXQnLCBbXG4gICAgICAgICAgICAgICAgICAgICdDb21wb25lbnQgZGVmaW5lZCBpbiBydW5uaW5nIGtleXdvcmQgbm90IGZvdW5kIGluIGxheW91dC4nLFxuICAgICAgICAgICAgICAgICAgICBgQ29tcG9uZW50IGlkOiBcIiR7c3RyaW5naWZ5SWQoY29tcG9uZW50X2lkKX1cImAsXG4gICAgICAgICAgICAgICAgICAgICdUaGlzIElEIHdhcyB1c2VkIGluIHRoZSBjYWxsYmFjayhzKSBmb3IgT3V0cHV0KHMpOicsXG4gICAgICAgICAgICAgICAgICAgIGAke2NiLm91dHB1dH1gLFxuICAgICAgICAgICAgICAgICAgICAnWW91IGNhbiBzdXBwcmVzcyB0aGlzIGV4Y2VwdGlvbiBieSBzZXR0aW5nJyxcbiAgICAgICAgICAgICAgICAgICAgJ2BzdXBwcmVzc19jYWxsYmFja19leGNlcHRpb25zPVRydWVgLidcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gc3RvcCBmdXJ0aGVyIHByb2Nlc3NpbmcgYmVjYXVzZSBmdW5jdGlvbnMgZnVydGhlciBvblxuICAgICAgICAgICAgLy8gY2FuJ3Qgb3BlcmF0ZSBvbiBhbiAndW5kZWZpbmVkJyBvYmplY3QsIGFuZCB0aGV5IHdpbGwgdGhyb3cgYW5cbiAgICAgICAgICAgIC8vIGVycm9yLlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGRpc3BhdGNoKHVwZGF0ZVByb3BzKHtcbiAgICAgICAgICAgIHByb3BzLFxuICAgICAgICAgICAgaXRlbXBhdGg6IGNvbXBvbmVudFBhdGgsXG4gICAgICAgICAgICByZW5kZXJUeXBlOiAnY2FsbGJhY2snXG4gICAgICAgIH0pKTtcbiAgICAgICAgZGlzcGF0Y2gobm90aWZ5T2JzZXJ2ZXJzKHsgaWQ6IGNvbXBvbmVudF9pZCwgcHJvcHMgfSkpO1xuICAgIH07XG59XG4vKipcbiAqIFVwZGF0ZSBhIGNvbXBvbmVudCBwcm9wcyB3aXRoIGBydW5uaW5nYC9gcHJvZ3Jlc3NgL2BzZXRfcHJvcHNgIGNhbGxzLlxuICpcbiAqIEBwYXJhbSBvdXRwdXRzIFByb3BzIHRvIHVwZGF0ZS5cbiAqIEBwYXJhbSBjYiBUaGUgb3JpZ2luYXRpbmcgY2FsbGJhY2sgaW5mby5cbiAqIEByZXR1cm5zXG4gKi9cbmZ1bmN0aW9uIHNpZGVVcGRhdGUob3V0cHV0cywgY2IpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGRpc3BhdGNoLCBnZXRTdGF0ZSkge1xuICAgICAgICB0b1BhaXJzKG91dHB1dHMpXG4gICAgICAgICAgICAucmVkdWNlKChhY2MsIFtpZCwgdmFsdWVdLCBpKSA9PiB7XG4gICAgICAgICAgICBsZXQgY29tcG9uZW50SWQgPSBpZCwgcHJvcE5hbWUsIHJlcGxhY2VkSWRzID0gW107XG4gICAgICAgICAgICBpZiAoaWQuc3RhcnRzV2l0aCgneycpKSB7XG4gICAgICAgICAgICAgICAgW2NvbXBvbmVudElkLCBwcm9wTmFtZV0gPSBwYXJzZVBNQ0lkKGlkKTtcbiAgICAgICAgICAgICAgICByZXBsYWNlZElkcyA9IHJlcGxhY2VQTUMoY29tcG9uZW50SWQsIGNiLCBpLCBnZXRTdGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpZC5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgICAgICAgICAgW2NvbXBvbmVudElkLCBwcm9wTmFtZV0gPSBpZC5zcGxpdCgnLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcHJvcHMgPSBwcm9wTmFtZSA/IHsgW3Byb3BOYW1lXTogdmFsdWUgfSA6IHZhbHVlO1xuICAgICAgICAgICAgaWYgKHJlcGxhY2VkSWRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGFjYy5wdXNoKFtjb21wb25lbnRJZCwgcHJvcHNdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHJlcGxhY2VkSWRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGFjYy5wdXNoKFtyZXBsYWNlZElkc1swXSwgcHJvcHNdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlcGxhY2VkSWRzLmZvckVhY2goKHJlcCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhY2MucHVzaChbcmVwLCBwcm9wc10pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwgW10pXG4gICAgICAgICAgICAuZm9yRWFjaCgoW2lkLCBpZFByb3BzXSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSBnZXRTdGF0ZSgpO1xuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50UGF0aCA9IGdldFBhdGgoc3RhdGUucGF0aHMsIGlkKTtcbiAgICAgICAgICAgIGxldCBvbGRDb21wb25lbnQgPSB7IHByb3BzOiB7fSB9O1xuICAgICAgICAgICAgaWYgKGNvbXBvbmVudFBhdGgpIHtcbiAgICAgICAgICAgICAgICBvbGRDb21wb25lbnQgPSBnZXRDb21wb25lbnRMYXlvdXQoY29tcG9uZW50UGF0aCwgc3RhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgb2xkUHJvcHMgPSBvbGRDb21wb25lbnQ/LnByb3BzIHx8IHt9O1xuICAgICAgICAgICAgY29uc3QgcGF0Y2hlZFByb3BzID0gcGFyc2VQYXRjaFByb3BzKGlkUHJvcHMsIG9sZFByb3BzKTtcbiAgICAgICAgICAgIGRpc3BhdGNoKHVwZGF0ZUNvbXBvbmVudChpZCwgcGF0Y2hlZFByb3BzLCBjYikpO1xuICAgICAgICAgICAgaWYgKCFjb21wb25lbnRQYXRoKSB7XG4gICAgICAgICAgICAgICAgLy8gQ29tcG9uZW50IGRvZXNuJ3QgZXhpc3QsIGRvZXNuJ3QgbWF0dGVyIGp1c3QgYWxsb3cgdGhlXG4gICAgICAgICAgICAgICAgLy8gY2FsbGJhY2sgdG8gY29udGludWUuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGlzcGF0Y2goc2V0UGF0aHMoY29tcHV0ZVBhdGhzKHtcbiAgICAgICAgICAgICAgICAuLi5vbGRDb21wb25lbnQsXG4gICAgICAgICAgICAgICAgcHJvcHM6IHsgLi4ub2xkQ29tcG9uZW50LnByb3BzLCAuLi5wYXRjaGVkUHJvcHMgfVxuICAgICAgICAgICAgfSwgWy4uLmNvbXBvbmVudFBhdGhdLCBzdGF0ZS5wYXRocywgc3RhdGUucGF0aHMuZXZlbnRzKSkpO1xuICAgICAgICB9KTtcbiAgICB9O1xufVxuLyoqXG4gKiBBcHBseSBhbiBpbnRlcm1lZGlhdGUgZnJhbWUgZnJvbSBhIHN0cmVhbWluZyBjYWxsYmFjay5cbiAqXG4gKiBUaGUgZnJhbWUncyBkZWNsYXJlZCBvdXRwdXRzIGFyZSBmbGF0dGVuZWQgdG8gYGlkLnByb3BgIGtleXMgYW5kIGFwcGxpZWRcbiAqIHRocm91Z2ggdGhlIHNpZGVVcGRhdGUgcGF0aCAocGFyc2VQYXRjaFByb3BzICsgdXBkYXRlQ29tcG9uZW50KSwgc28gUGF0Y2hcbiAqIHZhbHVlcyBhcHBseSBpbmNyZW1lbnRhbGx5LCBwYXRocyByZWNvbXB1dGUgZm9yIG5ld2x5IGFkZGVkIGNvbXBvbmVudHMsXG4gKiBhbmQgb2JzZXJ2ZXJzIGFyZSBub3RpZmllZCDigJQgdGhlIHNhbWUgc2VtYW50aWNzIGFzIHNldF9wcm9wcy4gVGhlXG4gKiBjYWxsYmFjaydzIGV4ZWN1dGlvbiBwcm9taXNlIHN0YXlzIHBlbmRpbmcgdW50aWwgdGhlIHRlcm1pbmFsIGZyYW1lLlxuICovXG5mdW5jdGlvbiBhcHBseVN0cmVhbUZyYW1lKGRpc3BhdGNoLCBmcmFtZSwgcGF5bG9hZCkge1xuICAgIGlmIChmcmFtZS5yZXNwb25zZSkge1xuICAgICAgICBjb25zdCBmbGF0ID0ge307XG4gICAgICAgIHRvUGFpcnMoZnJhbWUucmVzcG9uc2UpLmZvckVhY2goKFtpZCwgcHJvcHNdKSA9PiB7XG4gICAgICAgICAgICB0b1BhaXJzKHByb3BzKS5mb3JFYWNoKChbcHJvcCwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICAgICAgZmxhdFtgJHtpZH0uJHtwcm9wfWBdID0gdmFsdWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChrZXlzKGZsYXQpLmxlbmd0aCkge1xuICAgICAgICAgICAgZGlzcGF0Y2goc2lkZVVwZGF0ZShmbGF0LCBwYXlsb2FkKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZyYW1lLnNpZGVVcGRhdGUpIHtcbiAgICAgICAgZGlzcGF0Y2goc2lkZVVwZGF0ZShmcmFtZS5zaWRlVXBkYXRlLCBwYXlsb2FkKSk7XG4gICAgfVxufVxuLyoqXG4gKiBSdW4gYSBzdHJlYW1pbmcgY2FsbGJhY2sgb3ZlciB0aGUgbXVsdGlwbGV4ZWQgdHJhbnNwb3J0OiBhIHNpbmdsZSBkb3dubGlua1xuICogc2hhcmVkIGJ5IGFsbCBvZiB0aGUgcGFnZSdzIHN0cmVhbXMgLS0gYW5kLCBob3N0ZWQgaW4gYSBTaGFyZWRXb3JrZXIsIGJ5IGFsbFxuICogb2YgdGhlIGJyb3dzZXIncyB0YWJzIChzZWUgdXRpbHMvc3RyZWFtQ2xpZW50KS4gRnJhbWVzIGFyZVxuICogYXBwbGllZCBhcyB0aGV5IGFycml2ZSwgc28gdGhlIHJlc29sdmVkIHZhbHVlIGlzIGVtcHR5IGxpa2UgdGhlIFdlYlNvY2tldFxuICogc3RyZWFtaW5nIHBhdGguXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZVN0cmVhbUNhbGxiYWNrKGRpc3BhdGNoLCBjb25maWcsIHBheWxvYWQsIHJ1bm5pbmcpIHtcbiAgICBsZXQgcnVubmluZ09mZjtcbiAgICBpZiAocnVubmluZykge1xuICAgICAgICBkaXNwYXRjaChzaWRlVXBkYXRlKHJ1bm5pbmcucnVubmluZywgcGF5bG9hZCkpO1xuICAgICAgICBydW5uaW5nT2ZmID0gcnVubmluZy5ydW5uaW5nT2ZmO1xuICAgIH1cbiAgICBjb25zdCB1cmwgPSBgJHt1cmxCYXNlKGNvbmZpZyl9X2Rhc2gtdXBkYXRlLWNvbXBvbmVudGA7XG4gICAgY29uc3QgaW5pdCA9IG1lcmdlRGVlcFJpZ2h0KGNvbmZpZy5mZXRjaCwge1xuICAgICAgICBoZWFkZXJzOiBnZXRDU1JGSGVhZGVyKGNvbmZpZylcbiAgICB9KTtcbiAgICB0cnkge1xuICAgICAgICBhd2FpdCBnZXRTdHJlYW1DbGllbnQoY29uZmlnKS5ydW4odXJsLCBpbml0LCBjb25maWcuZW5kX2lkLCBwYXlsb2FkLCAoZnJhbWUpID0+IHtcbiAgICAgICAgICAgIGlmIChmcmFtZS5kaXN0KSB7XG4gICAgICAgICAgICAgICAgUHJvbWlzZS5hbGwoZnJhbWUuZGlzdC5tYXAobG9hZExpYnJhcnkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFwcGx5U3RyZWFtRnJhbWUoZGlzcGF0Y2gsIGZyYW1lLCBwYXlsb2FkKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICBpZiAocnVubmluZ09mZikge1xuICAgICAgICAgICAgZGlzcGF0Y2goc2lkZVVwZGF0ZShydW5uaW5nT2ZmLCBwYXlsb2FkKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gRnJhbWVzIHdlcmUgYXBwbGllZCBhcyB0aGV5IGFycml2ZWQ7IHRoZSB0ZXJtaW5hbCBzdG9yZSB1cGRhdGUgaXMgYSBuby1vcC5cbiAgICByZXR1cm4ge307XG59XG5mdW5jdGlvbiBoYW5kbGVTZXJ2ZXJzaWRlKGRpc3BhdGNoLCBob29rcywgY29uZmlnLCBwYXlsb2FkLCBiYWNrZ3JvdW5kLCBhZGRpdGlvbmFsQXJncywgZ2V0U3RhdGUsIHJ1bm5pbmcsIGNvbXByZXNzUGF5bG9hZCwgY29tcHJlc3NUaHJlc2hvbGQpIHtcbiAgICBpZiAoaG9va3MucmVxdWVzdF9wcmUpIHtcbiAgICAgICAgaG9va3MucmVxdWVzdF9wcmUocGF5bG9hZCk7XG4gICAgfVxuICAgIGNvbnN0IHJlcXVlc3RUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBib2R5ID0gSlNPTi5zdHJpbmdpZnkocGF5bG9hZCk7XG4gICAgbGV0IGNhY2hlS2V5O1xuICAgIGxldCBqb2I7XG4gICAgbGV0IHJ1bm5pbmdPZmY7XG4gICAgbGV0IHByb2dyZXNzRGVmYXVsdDtcbiAgICBsZXQgbW9yZUFyZ3MgPSBhZGRpdGlvbmFsQXJncztcbiAgICBpZiAocnVubmluZykge1xuICAgICAgICBkaXNwYXRjaChzaWRlVXBkYXRlKHJ1bm5pbmcucnVubmluZywgcGF5bG9hZCkpO1xuICAgICAgICBydW5uaW5nT2ZmID0gcnVubmluZy5ydW5uaW5nT2ZmO1xuICAgIH1cbiAgICBjb25zdCBmZXRjaENhbGxiYWNrID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBoZWFkZXJzID0gZ2V0Q1NSRkhlYWRlcihjb25maWcpO1xuICAgICAgICBsZXQgdXJsID0gYCR7dXJsQmFzZShjb25maWcpfV9kYXNoLXVwZGF0ZS1jb21wb25lbnRgO1xuICAgICAgICBsZXQgbmV3Qm9keSA9IGJvZHk7XG4gICAgICAgIGNvbnN0IGFkZEFyZyA9IChuYW1lLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgbGV0IGRlbGltID0gJz8nO1xuICAgICAgICAgICAgaWYgKHVybC5pbmNsdWRlcygnPycpKSB7XG4gICAgICAgICAgICAgICAgZGVsaW0gPSAnJic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB1cmwgPSBgJHt1cmx9JHtkZWxpbX0ke25hbWV9PSR7dmFsdWV9YDtcbiAgICAgICAgfTtcbiAgICAgICAgLy8gRWNobyB0aGUgc2VydmVyLWlzc3VlZCB0b2tlbiBzbyB0aGUgc2VydmVyIGNhbiBiaW5kL3ZlcmlmeSB0aGVcbiAgICAgICAgLy8gYmFja2dyb3VuZC1jYWxsYmFjayBoYW5kbGVzIChjYWNoZUtleS9qb2Ivb2xkSm9iL2NhbmNlbEpvYikgaXQgc2lnbnMuXG4gICAgICAgIGlmIChjb25maWcuZW5kX2lkKSB7XG4gICAgICAgICAgICBhZGRBcmcoJ2VuZElkJywgY29uZmlnLmVuZF9pZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNhY2hlS2V5IHx8IGpvYikge1xuICAgICAgICAgICAgaWYgKGNhY2hlS2V5KVxuICAgICAgICAgICAgICAgIGFkZEFyZygnY2FjaGVLZXknLCBjYWNoZUtleSk7XG4gICAgICAgICAgICBpZiAoam9iKVxuICAgICAgICAgICAgICAgIGFkZEFyZygnam9iJywgam9iKTtcbiAgICAgICAgICAgIC8vIGNsZWFyIGlucHV0cyBhcyBiYWNrZ3JvdW5kIGNhbGxiYWNrIGRvZXNudCBuZWVkIGlucHV0cywganVzdCB2ZXJpZnkgZm9yIGNvbnRleHRcbiAgICAgICAgICAgIGNvbnN0IHRtcEJvZHkgPSBKU09OLnBhcnNlKG5ld0JvZHkpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0bXBCb2R5LmlucHV0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHRtcEJvZHkuaW5wdXRzW2ldWyd2YWx1ZSddID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgKHRtcEJvZHk/LnN0YXRlIHx8IFtdKS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHRtcEJvZHkuc3RhdGVbaV1bJ3ZhbHVlJ10gPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmV3Qm9keSA9IEpTT04uc3RyaW5naWZ5KHRtcEJvZHkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtb3JlQXJncykge1xuICAgICAgICAgICAgbW9yZUFyZ3MuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiBhZGRBcmcoa2V5LCB2YWx1ZSkpO1xuICAgICAgICAgICAgbW9yZUFyZ3MgPSBtb3JlQXJncy5maWx0ZXIoKFtfLCBfXywgc2luZ2xlXSkgPT4gIXNpbmdsZSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZldGNoQm9keSA9IG5ld0JvZHk7XG4gICAgICAgIC8vIENvbXByZXNzIHBheWxvYWQgaWYgZW5hYmxlZCBhbmQgc2l6ZSB0aHJlc2hvbGQgaXMgbWV0XG4gICAgICAgIGlmIChjb21wcmVzc1BheWxvYWQgJiZcbiAgICAgICAgICAgIGNvbXByZXNzVGhyZXNob2xkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIG5ld0JvZHkubGVuZ3RoID4gY29tcHJlc3NUaHJlc2hvbGQpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RyZWFtID0gbmV3IEJsb2IoW25ld0JvZHldKVxuICAgICAgICAgICAgICAgICAgICAuc3RyZWFtKClcbiAgICAgICAgICAgICAgICAgICAgLnBpcGVUaHJvdWdoKG5ldyBDb21wcmVzc2lvblN0cmVhbSgnZ3ppcCcpKTtcbiAgICAgICAgICAgICAgICBmZXRjaEJvZHkgPSBhd2FpdCBuZXcgUmVzcG9uc2Uoc3RyZWFtKS5ibG9iKCk7XG4gICAgICAgICAgICAgICAgaGVhZGVyc1snQ29udGVudC1FbmNvZGluZyddID0gJ2d6aXAnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgLy8gRmFsbCB0aHJvdWdoIHRvIHNlbmQgdW5jb21wcmVzc2VkXG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1NlbmRpbmcgdW5jb21wcmVzc2VkIHBheWxvYWQsIGJlY2F1c2UgY29tcHJlc3NpbmcgZmFpbGVkOicsIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmV0Y2godXJsLCBtZXJnZURlZXBSaWdodChjb25maWcuZmV0Y2gsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAgIGJvZHk6IGZldGNoQm9keVxuICAgICAgICB9KSk7XG4gICAgfTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCBoYW5kbGVPdXRwdXQgPSAocmVzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IHN0YXR1cyB9ID0gcmVzO1xuICAgICAgICAgICAgaWYgKGpvYikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrSm9iID0gZ2V0U3RhdGUoKS5jYWxsYmFja0pvYnNbam9iXTtcbiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2tKb2I/Lm91dGRhdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKHJlbW92ZUNhbGxiYWNrSm9iKHsgam9iSWQ6IGpvYiB9KSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHt9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiByZWNvcmRQcm9maWxlKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIGlmIChjb25maWcudWkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2FsbGJhY2sgcHJvZmlsaW5nIC0gb25seSByZWxldmFudCBpZiB3ZSdyZSBzaG93aW5nIHRoZSBkZWJ1ZyB1aVxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvdXJjZXMgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfX2Rhc2hfc2VydmVyOiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgX19kYXNoX2NsaWVudDogRGF0ZS5ub3coKSAtIHJlcXVlc3RUaW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgX19kYXNoX3VwbG9hZDogYm9keS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBfX2Rhc2hfZG93bmxvYWQ6IE51bWJlcihyZXMuaGVhZGVycy5nZXQoJ0NvbnRlbnQtTGVuZ3RoJykpXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpbWluZ0hlYWRlcnMgPSByZXMuaGVhZGVycy5nZXQoJ1NlcnZlci1UaW1pbmcnKSB8fCAnJztcbiAgICAgICAgICAgICAgICAgICAgdGltaW5nSGVhZGVycy5zcGxpdCgnLCcpLmZvckVhY2goKGhlYWRlcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IGhlYWRlci5zcGxpdCgnOycpWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHVyID0gaGVhZGVyLm1hdGNoKC87ZHVyPVswLTkuXSsvKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkdXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXNbbmFtZV0gPSBOdW1iZXIoZHVyWzBdLnNsaWNlKDUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKHVwZGF0ZVJlc291cmNlVXNhZ2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHBheWxvYWQub3V0cHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2U6IHJlc291cmNlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0czogcGF5bG9hZC5pbnB1dHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZTogcGF5bG9hZC5zdGF0ZVxuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZmluaXNoTGluZSA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBtdWx0aSwgcmVzcG9uc2UgfSA9IGRhdGE7XG4gICAgICAgICAgICAgICAgaWYgKGhvb2tzLnJlcXVlc3RfcG9zdCkge1xuICAgICAgICAgICAgICAgICAgICBob29rcy5yZXF1ZXN0X3Bvc3QocGF5bG9hZCwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICAgICAgICAgIGlmIChtdWx0aSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZXNwb25zZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgb3V0cHV0IH0gPSBwYXlsb2FkO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpZCA9IG91dHB1dC5zdWJzdHIoMCwgb3V0cHV0Lmxhc3RJbmRleE9mKCcuJykpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB7IFtpZF06IHJlc3BvbnNlLnByb3BzIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlY29yZFByb2ZpbGUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgY29tcGxldGVKb2IgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGpvYikge1xuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChyZW1vdmVDYWxsYmFja0pvYih7IGpvYklkOiBqb2IgfSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocnVubmluZ09mZikge1xuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChzaWRlVXBkYXRlKHJ1bm5pbmdPZmYsIHBheWxvYWQpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHByb2dyZXNzRGVmYXVsdCkge1xuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChzaWRlVXBkYXRlKHByb2dyZXNzRGVmYXVsdCwgcGF5bG9hZCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAvLyBTdHJlYW1pbmcgY2FsbGJhY2tzOiByZWFkIE5ESlNPTiBmcmFtZXMgYXMgdGhleSBhcnJpdmUsXG4gICAgICAgICAgICAvLyBhcHBseSBlYWNoIG9uZSBpbW1lZGlhdGVseSwgYW5kIHJlc29sdmUgb24gdGhlIHRlcm1pbmFsIGZyYW1lLlxuICAgICAgICAgICAgY29uc3QgaGFuZGxlU3RyZWFtZWRSZXNwb25zZSA9IGFzeW5jIChzdHJlYW1SZXMpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWFkZXIgPSBzdHJlYW1SZXMuYm9keS5nZXRSZWFkZXIoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG4gICAgICAgICAgICAgICAgbGV0IGJ1ZmZlciA9ICcnO1xuICAgICAgICAgICAgICAgIGxldCBsYXN0UmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgbGV0IGZpbmlzaGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvY2Vzc0ZyYW1lID0gYXN5bmMgKGZyYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZS5kb25lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZUpvYigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkUHJvZmlsZSh7fSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihmcmFtZS5lcnJvci5tZXNzYWdlIHx8ICdDYWxsYmFjayBlcnJvcicpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaG9va3MucmVxdWVzdF9wb3N0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9va3MucmVxdWVzdF9wb3N0KHBheWxvYWQsIGxhc3RSZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRQcm9maWxlKGxhc3RSZXNwb25zZSB8fCB7fSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGcmFtZXMgd2VyZSBhbHJlYWR5IGFwcGxpZWQ7IHJlc29sdmUgZW1wdHkgc28gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXJtaW5hbCBzdG9yZSB1cGRhdGUgaXMgYSBuby1vcCAoUGF0Y2ggZnJhbWVzIG11c3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCByZS1hcHBseSkuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHt9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWUuZGlzdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoZnJhbWUuZGlzdC5tYXAobG9hZExpYnJhcnkpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsYXN0UmVzcG9uc2UgPSBmcmFtZS5yZXNwb25zZTtcbiAgICAgICAgICAgICAgICAgICAgYXBwbHlTdHJlYW1GcmFtZShkaXNwYXRjaCwgZnJhbWUsIHBheWxvYWQpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBkb25lLCB2YWx1ZSB9ID0gYXdhaXQgcmVhZGVyLnJlYWQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb25lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgKz0gZGVjb2Rlci5kZWNvZGUodmFsdWUsIHsgc3RyZWFtOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGluZXMgPSBidWZmZXIuc3BsaXQoJ1xcbicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyID0gbGluZXMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxpbmUudHJpbSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm9jZXNzRnJhbWUoSlNPTi5wYXJzZShsaW5lKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmlzaGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5jYW5jZWwoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoYnVmZmVyLnRyaW0oKSAmJiAhZmluaXNoZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb2Nlc3NGcmFtZShKU09OLnBhcnNlKGJ1ZmZlcikpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmaW5pc2hlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVKb2IoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0UmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRQcm9maWxlKGxhc3RSZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh7fSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRQcm9maWxlKHt9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWZpbmlzaGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFN0cmVhbSBlbmRlZCB3aXRob3V0IGEgdGVybWluYWwgZnJhbWUgKGNvbm5lY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgLy8gZHJvcHBlZCk6IGNsZWFyIGxvYWRpbmcsIGtlZXAgYXBwbGllZCBmcmFtZXMuXG4gICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlSm9iKCk7XG4gICAgICAgICAgICAgICAgICAgIHJlY29yZFByb2ZpbGUobGFzdFJlc3BvbnNlIHx8IHt9KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh7fSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChzdGF0dXMgPT09IFNUQVRVUy5PSykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gcmVzLmhlYWRlcnMuZ2V0KCdDb250ZW50LVR5cGUnKSB8fCAnJztcbiAgICAgICAgICAgICAgICBpZiAoY29udGVudFR5cGUuaW5jbHVkZXMoJ2FwcGxpY2F0aW9uL3gtbmRqc29uJykgJiYgcmVzLmJvZHkpIHtcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlU3RyZWFtZWRSZXNwb25zZShyZXMpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlcy5qc29uKCkudGhlbigoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNhY2hlS2V5ICYmIGRhdGEuY2FjaGVLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlS2V5ID0gZGF0YS5jYWNoZUtleTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWpvYiAmJiBkYXRhLmpvYikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgam9iSW5mbyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2JJZDogZGF0YS5qb2IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVLZXk6IGRhdGEuY2FjaGVLZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsSW5wdXRzOiBkYXRhLmNhbmNlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc0RlZmF1bHQ6IGRhdGEucHJvZ3Jlc3NEZWZhdWx0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dDogSlNPTi5zdHJpbmdpZnkocGF5bG9hZC5vdXRwdXRzKVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKGFkZENhbGxiYWNrSm9iKGpvYkluZm8pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGpvYiA9IGRhdGEuam9iO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLnNpZGVVcGRhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKHNpZGVVcGRhdGUoZGF0YS5zaWRlVXBkYXRlLCBwYXlsb2FkKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEucHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKHNpZGVVcGRhdGUoZGF0YS5wcm9ncmVzcywgcGF5bG9hZCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghcHJvZ3Jlc3NEZWZhdWx0ICYmIGRhdGEucHJvZ3Jlc3NEZWZhdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc0RlZmF1bHQgPSBkYXRhLnByb2dyZXNzRGVmYXVsdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWJhY2tncm91bmQgfHwgZGF0YS5yZXNwb25zZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5kaXN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvbWlzZS5hbGwoZGF0YS5kaXN0Lm1hcChsb2FkTGlicmFyeSkpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZUpvYigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hMaW5lKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVKb2IoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hMaW5lKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUG9sbCBjaGFpbi5cbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoaGFuZGxlLCBiYWNrZ3JvdW5kLmludGVydmFsICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGJhY2tncm91bmQuaW50ZXJ2YWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDUwMCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHN0YXR1cyA9PT0gU1RBVFVTLlBSRVZFTlRfVVBEQVRFKSB7XG4gICAgICAgICAgICAgICAgY29tcGxldGVKb2IoKTtcbiAgICAgICAgICAgICAgICByZWNvcmRQcm9maWxlKHt9KTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHt9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbXBsZXRlSm9iKCk7XG4gICAgICAgICAgICAgICAgcmVqZWN0KHJlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGhhbmRsZUVycm9yID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbmZpZy51aSkge1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoKHVwZGF0ZVJlc291cmNlVXNhZ2Uoe1xuICAgICAgICAgICAgICAgICAgICBpZDogcGF5bG9hZC5vdXRwdXQsXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1czogU1RBVFVTLk5PX1JFU1BPTlNFLFxuICAgICAgICAgICAgICAgICAgICByZXN1bHQ6IHt9LFxuICAgICAgICAgICAgICAgICAgICBpbnB1dHM6IHBheWxvYWQuaW5wdXRzLFxuICAgICAgICAgICAgICAgICAgICBzdGF0ZTogcGF5bG9hZC5zdGF0ZVxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0NhbGxiYWNrIGZhaWxlZDogdGhlIHNlcnZlciBkaWQgbm90IHJlc3BvbmQuJykpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBoYW5kbGUgPSAoKSA9PiB7XG4gICAgICAgICAgICBmZXRjaENhbGxiYWNrKCkudGhlbihoYW5kbGVPdXRwdXQsIGhhbmRsZUVycm9yKTtcbiAgICAgICAgfTtcbiAgICAgICAgaGFuZGxlKCk7XG4gICAgfSk7XG59XG4vKipcbiAqIEhhbmRsZSBzZXJ2ZXJzaWRlIGNhbGxiYWNrIHZpYSBXZWJTb2NrZXQgY29ubmVjdGlvbi5cbiAqXG4gKiBVc2VzIHRoZSBTaGFyZWRXb3JrZXIgdG8gc2VuZCB0aGUgY2FsbGJhY2sgcmVxdWVzdCB0aHJvdWdoIHRoZSBwZXJzaXN0ZW50XG4gKiBXZWJTb2NrZXQgY29ubmVjdGlvbiBpbnN0ZWFkIG9mIEhUVFAgUE9TVC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gaGFuZGxlV2Vic29ja2V0Q2FsbGJhY2soZGlzcGF0Y2gsIGhvb2tzLCBjb25maWcsIHBheWxvYWQsIHJ1bm5pbmcpIHtcbiAgICBpZiAoaG9va3MucmVxdWVzdF9wcmUpIHtcbiAgICAgICAgaG9va3MucmVxdWVzdF9wcmUocGF5bG9hZCk7XG4gICAgfVxuICAgIGNvbnN0IHJlcXVlc3RUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBsZXQgcnVubmluZ09mZjtcbiAgICBpZiAocnVubmluZykge1xuICAgICAgICBkaXNwYXRjaChzaWRlVXBkYXRlKHJ1bm5pbmcucnVubmluZywgcGF5bG9hZCkpO1xuICAgICAgICBydW5uaW5nT2ZmID0gcnVubmluZy5ydW5uaW5nT2ZmO1xuICAgIH1cbiAgICBjb25zdCB3b3JrZXJDbGllbnQgPSBnZXRXb3JrZXJDbGllbnQoKTtcbiAgICB0cnkge1xuICAgICAgICAvLyBFbnN1cmUgV2ViU29ja2V0IGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWRcbiAgICAgICAgYXdhaXQgd29ya2VyQ2xpZW50LmVuc3VyZUNvbm5lY3RlZChjb25maWcpO1xuICAgICAgICAvLyBTdHJlYW1pbmcgY2FsbGJhY2tzIGRlbGl2ZXIgaW50ZXJtZWRpYXRlIGZyYW1lcyBiZWZvcmUgdGhlXG4gICAgICAgIC8vIHRlcm1pbmFsIHJlc3BvbnNlOyBhcHBseSBlYWNoIG9uZSBhcyBpdCBhcnJpdmVzLlxuICAgICAgICBsZXQgbGFzdFN0cmVhbVJlc3BvbnNlO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHdvcmtlckNsaWVudC5zZW5kQ2FsbGJhY2socGF5bG9hZCwgKGZyYW1lKSA9PiB7XG4gICAgICAgICAgICBsYXN0U3RyZWFtUmVzcG9uc2UgPSBmcmFtZT8ucmVzcG9uc2U7XG4gICAgICAgICAgICBhcHBseVN0cmVhbUZyYW1lKGRpc3BhdGNoLCBmcmFtZSwgcGF5bG9hZCk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBIYW5kbGUgcnVubmluZyBvZmYgc3RhdGVcbiAgICAgICAgaWYgKHJ1bm5pbmdPZmYpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoKHNpZGVVcGRhdGUocnVubmluZ09mZiwgcGF5bG9hZCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09ICdwcmV2ZW50X3VwZGF0ZScpIHtcbiAgICAgICAgICAgIC8vIFJlY29yZCB0aW1pbmcgZm9yIHByb2ZpbGluZ1xuICAgICAgICAgICAgaWYgKGNvbmZpZy51aSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvdGFsVGltZSA9IERhdGUubm93KCkgLSByZXF1ZXN0VGltZTtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaCh1cGRhdGVSZXNvdXJjZVVzYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHBheWxvYWQub3V0cHV0LFxuICAgICAgICAgICAgICAgICAgICB1c2FnZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgX19kYXNoX3NlcnZlcjogdG90YWxUaW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgX19kYXNoX2NsaWVudDogdG90YWxUaW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgX19kYXNoX3VwbG9hZDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIF9fZGFzaF9kb3dubG9hZDogMFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IFNUQVRVUy5QUkVWRU5UX1VQREFURSxcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiB7fSxcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRzOiBwYXlsb2FkLmlucHV0cyxcbiAgICAgICAgICAgICAgICAgICAgc3RhdGU6IHBheWxvYWQuc3RhdGVcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gJ2Vycm9yJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHJlc3BvbnNlLm1lc3NhZ2UgfHwgJ0NhbGxiYWNrIGVycm9yJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0cmVhbSkge1xuICAgICAgICAgICAgLy8gVGVybWluYWwgZnJhbWUgb2YgYSBzdHJlYW1lZCBjYWxsYmFjazogZXZlcnkgZnJhbWUgd2FzIGFscmVhZHlcbiAgICAgICAgICAgIC8vIGFwcGxpZWQgb24gYXJyaXZhbCwgc28gcmVzb2x2ZSBlbXB0eSAodGhlIHRlcm1pbmFsIHN0b3JlIHVwZGF0ZVxuICAgICAgICAgICAgLy8gbXVzdCBiZSBhIG5vLW9wIOKAlCBQYXRjaCBmcmFtZXMgbXVzdCBub3QgcmUtYXBwbHkpLlxuICAgICAgICAgICAgaWYgKGhvb2tzLnJlcXVlc3RfcG9zdCkge1xuICAgICAgICAgICAgICAgIGhvb2tzLnJlcXVlc3RfcG9zdChwYXlsb2FkLCBsYXN0U3RyZWFtUmVzcG9uc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvbmZpZy51aSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvdGFsVGltZSA9IERhdGUubm93KCkgLSByZXF1ZXN0VGltZTtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaCh1cGRhdGVSZXNvdXJjZVVzYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHBheWxvYWQub3V0cHV0LFxuICAgICAgICAgICAgICAgICAgICB1c2FnZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgX19kYXNoX3NlcnZlcjogdG90YWxUaW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgX19kYXNoX2NsaWVudDogdG90YWxUaW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgX19kYXNoX3VwbG9hZDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIF9fZGFzaF9kb3dubG9hZDogMFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IFNUQVRVUy5PSyxcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiBsYXN0U3RyZWFtUmVzcG9uc2UgfHwge30sXG4gICAgICAgICAgICAgICAgICAgIGlucHV0czogcGF5bG9hZC5pbnB1dHMsXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlOiBwYXlsb2FkLnN0YXRlXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG4gICAgICAgIC8vIEV4dHJhY3QgdGhlIGNhbGxiYWNrIGRhdGEgLSBzdHJ1Y3R1cmUgaXMge211bHRpOiBib29sZWFuLCByZXNwb25zZTogey4uLn19XG4gICAgICAgIGNvbnN0IGNhbGxiYWNrRGF0YSA9IHJlc3BvbnNlLmRhdGE7XG4gICAgICAgIC8vIEhhbmRsZSBzaWRlVXBkYXRlIGlmIHByZXNlbnRcbiAgICAgICAgaWYgKGNhbGxiYWNrRGF0YT8uc2lkZVVwZGF0ZSkge1xuICAgICAgICAgICAgZGlzcGF0Y2goc2lkZVVwZGF0ZShjYWxsYmFja0RhdGEuc2lkZVVwZGF0ZSwgcGF5bG9hZCkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEV4dHJhY3QgdGhlIGFjdHVhbCBvdXRwdXRzIGZyb20gdGhlIHJlc3BvbnNlXG4gICAgICAgIC8vIEZvcm1hdCBpcyBzaW1pbGFyIHRvIEhUVFAgcGF0aCdzIGZpbmlzaExpbmUgZnVuY3Rpb25cbiAgICAgICAgbGV0IHJlc3VsdDtcbiAgICAgICAgY29uc3QgeyBtdWx0aSwgcmVzcG9uc2U6IGNhbGxiYWNrUmVzcG9uc2UgfSA9IGNhbGxiYWNrRGF0YSB8fCB7fTtcbiAgICAgICAgaWYgKGhvb2tzLnJlcXVlc3RfcG9zdCkge1xuICAgICAgICAgICAgaG9va3MucmVxdWVzdF9wb3N0KHBheWxvYWQsIGNhbGxiYWNrUmVzcG9uc2UpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtdWx0aSkge1xuICAgICAgICAgICAgcmVzdWx0ID0gY2FsbGJhY2tSZXNwb25zZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIFNpbmdsZSBvdXRwdXQgLSBjb252ZXJ0IHRvIHRoZSBleHBlY3RlZCBmb3JtYXRcbiAgICAgICAgICAgIGNvbnN0IHsgb3V0cHV0IH0gPSBwYXlsb2FkO1xuICAgICAgICAgICAgY29uc3QgaWQgPSBvdXRwdXQuc3Vic3RyKDAsIG91dHB1dC5sYXN0SW5kZXhPZignLicpKTtcbiAgICAgICAgICAgIHJlc3VsdCA9IHsgW2lkXTogY2FsbGJhY2tSZXNwb25zZT8ucHJvcHMgfTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZWNvcmQgdGltaW5nIGZvciBwcm9maWxpbmdcbiAgICAgICAgaWYgKGNvbmZpZy51aSkge1xuICAgICAgICAgICAgY29uc3QgdG90YWxUaW1lID0gRGF0ZS5ub3coKSAtIHJlcXVlc3RUaW1lO1xuICAgICAgICAgICAgZGlzcGF0Y2godXBkYXRlUmVzb3VyY2VVc2FnZSh7XG4gICAgICAgICAgICAgICAgaWQ6IHBheWxvYWQub3V0cHV0LFxuICAgICAgICAgICAgICAgIHVzYWdlOiB7XG4gICAgICAgICAgICAgICAgICAgIF9fZGFzaF9zZXJ2ZXI6IHRvdGFsVGltZSxcbiAgICAgICAgICAgICAgICAgICAgX19kYXNoX2NsaWVudDogdG90YWxUaW1lLFxuICAgICAgICAgICAgICAgICAgICBfX2Rhc2hfdXBsb2FkOiAwLFxuICAgICAgICAgICAgICAgICAgICBfX2Rhc2hfZG93bmxvYWQ6IDBcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHN0YXR1czogU1RBVFVTLk9LLFxuICAgICAgICAgICAgICAgIHJlc3VsdDogcmVzdWx0IHx8IHt9LFxuICAgICAgICAgICAgICAgIGlucHV0czogcGF5bG9hZC5pbnB1dHMsXG4gICAgICAgICAgICAgICAgc3RhdGU6IHBheWxvYWQuc3RhdGVcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0IHx8IHt9O1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gSGFuZGxlIHJ1bm5pbmcgb2ZmIHN0YXRlIG9uIGVycm9yXG4gICAgICAgIGlmIChydW5uaW5nT2ZmKSB7XG4gICAgICAgICAgICBkaXNwYXRjaChzaWRlVXBkYXRlKHJ1bm5pbmdPZmYsIHBheWxvYWQpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnLnVpKSB7XG4gICAgICAgICAgICBkaXNwYXRjaCh1cGRhdGVSZXNvdXJjZVVzYWdlKHtcbiAgICAgICAgICAgICAgICBpZDogcGF5bG9hZC5vdXRwdXQsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBTVEFUVVMuTk9fUkVTUE9OU0UsXG4gICAgICAgICAgICAgICAgcmVzdWx0OiB7fSxcbiAgICAgICAgICAgICAgICBpbnB1dHM6IHBheWxvYWQuaW5wdXRzLFxuICAgICAgICAgICAgICAgIHN0YXRlOiBwYXlsb2FkLnN0YXRlXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxufVxuZnVuY3Rpb24gaW5wdXRzVG9EaWN0KGlucHV0c19saXN0KSB7XG4gICAgLy8gUG9ydGVkIGRpcmVjdGx5IGZyb20gX3V0aWxzLnB5LCBpbnB1dHNfdG9fZGljdFxuICAgIC8vIHRha2VzIGFuIGFycmF5IG9mIGlucHV0cyAoc29tZSBpbnB1dHMgbWF5IGJlIGFuIGFycmF5KVxuICAgIC8vIHJldHVybnMgYW4gT2JqZWN0IChtYXApOlxuICAgIC8vICBrZXlzIG9mIHRoZSBmb3JtIGBpZC5wcm9wZXJ0eWAgb3IgYHtcImlkXCI6IDB9LnByb3BlcnR5YFxuICAgIC8vICB2YWx1ZXMgY29udGFpbiB0aGUgcHJvcGVydHkgdmFsdWVcbiAgICBpZiAoIWlucHV0c19saXN0KSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0ge307XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dHNfbGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpbnB1dHNfbGlzdFtpXSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0c2kgPSBpbnB1dHNfbGlzdFtpXTtcbiAgICAgICAgICAgIGZvciAobGV0IGlpID0gMDsgaWkgPCBpbnB1dHNpLmxlbmd0aDsgaWkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkX3N0ciA9IGAke3N0cmluZ2lmeUlkKGlucHV0c2lbaWldLmlkKX0uJHtpbnB1dHNpW2lpXS5wcm9wZXJ0eX1gO1xuICAgICAgICAgICAgICAgIGlucHV0c1tpZF9zdHJdID0gaW5wdXRzaVtpaV0udmFsdWUgPz8gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGlkX3N0ciA9IGAke3N0cmluZ2lmeUlkKGlucHV0c19saXN0W2ldLmlkKX0uJHtpbnB1dHNfbGlzdFtpXS5wcm9wZXJ0eX1gO1xuICAgICAgICAgICAgaW5wdXRzW2lkX3N0cl0gPSBpbnB1dHNfbGlzdFtpXS52YWx1ZSA/PyBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpbnB1dHM7XG59XG5mdW5jdGlvbiBnZXRUcmlnZ2VyZWRJZCh0cmlnZ2VyZWQpIHtcbiAgICAvLyBmb3IgcmVndWxhciBjYWxsYmFja3MsICB0YWtlcyB0aGUgZmlyc3QgdHJpZ2dlcmVkIHByb3BfaWQsIGUuZy4gIFwiYnRuLm5fY2xpY2tzXCIgYW5kIHJldHVybnMgXCJidG5cIlxuICAgIC8vIGZvciBwYXR0ZXJuIG1hdGNoaW5nIGNhbGxiYWNrLCBlLmcuICd7XCJpbmRleFwiOjAsIFwidHlwZVwiOlwiYnRuXCJ9JyBhbmQgcmV0dXJucyB7aW5kZXg6MCwgdHlwZTogXCJidG5cIn0nXG4gICAgaWYgKHRyaWdnZXJlZCAmJiB0cmlnZ2VyZWQubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHRyaWcgPSB0cmlnZ2VyZWRbMF07XG4gICAgICAgIGxldCBjb21wb25lbnRJZDtcbiAgICAgICAgaWYgKHRyaWcuc3RhcnRzV2l0aCgneycpKSB7XG4gICAgICAgICAgICBjb21wb25lbnRJZCA9IEpTT04ucGFyc2UodHJpZy5zdWJzdHJpbmcoMCwgdHJpZy5sYXN0SW5kZXhPZignfScpICsgMSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29tcG9uZW50SWQgPSB0cmlnLnNwbGl0KCcuJylbMF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudElkO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBleGVjdXRlQ2FsbGJhY2soY2IsIGNvbmZpZywgaG9va3MsIHBhdGhzLCBsYXlvdXQsIHsgYWxsT3V0cHV0cyB9LCBkaXNwYXRjaCwgZ2V0U3RhdGUpIHtcbiAgICBjb25zdCB7IG91dHB1dCwgaW5wdXRzLCBzdGF0ZSwgY2xpZW50c2lkZV9mdW5jdGlvbiwgYmFja2dyb3VuZCwgZHluYW1pY19jcmVhdG9yIH0gPSBjYi5jYWxsYmFjaztcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBpblZhbHMgPSBmaWxsVmFscyhwYXRocywgbGF5b3V0LCBjYiwgaW5wdXRzLCAnSW5wdXQnLCB0cnVlKTtcbiAgICAgICAgLyogUHJldmVudCBjYWxsYmFjayBpZiB0aGVyZSdzIG5vIGlucHV0cyAqL1xuICAgICAgICBpZiAoaW5WYWxzID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLmNiLFxuICAgICAgICAgICAgICAgIGV4ZWN1dGlvblByb21pc2U6IG51bGxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3V0cHV0cyA9IFtdO1xuICAgICAgICBjb25zdCBvdXRwdXRFcnJvcnMgPSBbXTtcbiAgICAgICAgYWxsT3V0cHV0cy5mb3JFYWNoKChvdXQsIGkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IFtvdXRpLCBlcnJpXSA9IHVud3JhcElmTm90TXVsdGkocGF0aHMsIG1hcChwaWNrKFsnaWQnLCAncHJvcGVydHknXSksIG91dCksIGNiLmNhbGxiYWNrLm91dHB1dHNbaV0sIGNiLmFueVZhbHMsICdPdXRwdXQnKTtcbiAgICAgICAgICAgIG91dHB1dHMucHVzaChvdXRpKTtcbiAgICAgICAgICAgIGlmIChlcnJpKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0RXJyb3JzLnB1c2goZXJyaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAob3V0cHV0RXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGZsYXR0ZW4oaW5WYWxzKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZWZFcnIob3V0cHV0RXJyb3JzLCBwYXRocyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUaGlzIGNhc2UgaXMgYWxsLWVtcHR5IG11bHRpdmFsdWVkIHdpbGRjYXJkIGlucHV0cyxcbiAgICAgICAgICAgIC8vIHdoaWNoIHdlIHdvdWxkIG5vcm1hbGx5IGZpcmUgdGhlIGNhbGxiYWNrIGZvciwgZXhjZXB0XG4gICAgICAgICAgICAvLyBzb21lIG91dHB1dHMgYXJlIG1pc3NpbmcuIFNvIGluc3RlYWQgd2UgdHJlYXQgaXQgbGlrZVxuICAgICAgICAgICAgLy8gcmVndWxhciBtaXNzaW5nIGlucHV0cyBhbmQganVzdCBzaWxlbnRseSBwcmV2ZW50IGl0LlxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5jYixcbiAgICAgICAgICAgICAgICBleGVjdXRpb25Qcm9taXNlOiBudWxsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IF9fZXhlY3V0ZSA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvYWRpbmdPdXRwdXRzID0gZmxhdHRlbihvdXRwdXRzKS5tYXAob3V0ID0+ICh7XG4gICAgICAgICAgICAgICAgcGF0aDogZ2V0UGF0aChwYXRocywgb3V0LmlkKSxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eTogb3V0LnByb3BlcnR5Py5zcGxpdCgnQCcpWzBdLFxuICAgICAgICAgICAgICAgIGlkOiBzdHJpbmdpZnlJZChvdXQuaWQpXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICBkaXNwYXRjaChsb2FkaW5nKGxvYWRpbmdPdXRwdXRzKSk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoYW5nZWRQcm9wSWRzID0ga2V5cyhjYi5jaGFuZ2VkUHJvcElkcyk7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkQ2hhbmdlZFByb3BzSWRzID0gY2hhbmdlZFByb3BJZHMubWFwKHByb3BJZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wSWQuc3RhcnRzV2l0aCgneycpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VQTUNJZChwcm9wSWQpWzBdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9wSWQ7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0LFxuICAgICAgICAgICAgICAgICAgICBvdXRwdXRzOiBpc011bHRpT3V0cHV0UHJvcChvdXRwdXQpID8gb3V0cHV0cyA6IG91dHB1dHNbMF0sXG4gICAgICAgICAgICAgICAgICAgIGlucHV0czogaW5WYWxzLFxuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkUHJvcElkcyxcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VkQ2hhbmdlZFByb3BzSWRzLFxuICAgICAgICAgICAgICAgICAgICBzdGF0ZTogY2IuY2FsbGJhY2suc3RhdGUubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGZpbGxWYWxzKHBhdGhzLCBsYXlvdXQsIGNiLCBzdGF0ZSwgJ1N0YXRlJylcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBpZiAoY2xpZW50c2lkZV9mdW5jdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGhhbmRsZUNsaWVudHNpZGUoZGlzcGF0Y2gsIGNsaWVudHNpZGVfZnVuY3Rpb24sIGNvbmZpZywgcGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBMYXlvdXQgbWF5IGhhdmUgY2hhbmdlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gIFJ1biBldmVyeSBvdXRwdXQgdGhyb3VnaCBwYXJzZVBhdGNoUHJvcHMgYWdhaW5zdCB0aGUgY3VycmVudCBsYXlvdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgZGF0YTogcGF0Y2hlZERhdGEsIHBhdGNoZWRPdXRwdXRzIH0gPSBhcHBseVBhdGNoZWRPdXRwdXRzKG91dHB1dHMsIHBhdGhzLCBnZXRTdGF0ZSgpLmxheW91dCwgZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHBhdGNoZWREYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ucGF0Y2hlZFJlc3VsdEZpZWxkcyhwYXRjaGVkT3V0cHV0cylcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBlcnJvciwgcGF5bG9hZCB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBuZXdDb25maWcgPSBjb25maWc7XG4gICAgICAgICAgICAgICAgbGV0IG5ld0hlYWRlcnMgPSBudWxsO1xuICAgICAgICAgICAgICAgIGxldCBsYXN0RXJyb3I7XG4gICAgICAgICAgICAgICAgY29uc3QgYWRkaXRpb25hbEFyZ3MgPSBbXTtcbiAgICAgICAgICAgICAgICBjb25zdCBqc29uT3V0cHV0ID0gSlNPTi5zdHJpbmdpZnkocGF5bG9hZC5vdXRwdXRzKTtcbiAgICAgICAgICAgICAgICB2YWx1ZXMoZ2V0U3RhdGUoKS5jYWxsYmFja0pvYnMpLmZvckVhY2goKGpvYikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoanNvbk91dHB1dCA9PT0gam9iLm91dHB1dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGVybWluYXRlIHRoZSBvbGQgam9icyB0aGF0IGFyZSBub3QgY29tcGxldGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgYXMgb3V0ZGF0ZWQgZm9yIHRoZSBjYWxsYmFjayBwcm9taXNlIHRvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNvbHZlIGFuZCByZW1vdmUgYWZ0ZXIuXG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsQXJncy5wdXNoKFsnb2xkSm9iJywgam9iLmpvYklkLCB0cnVlXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChzZXRDYWxsYmFja0pvYk91dGRhdGVkKHsgam9iSWQ6IGpvYi5qb2JJZCB9KSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFqb2IuY2FuY2VsSW5wdXRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ZXIgPSBpbnRlcnNlY3Rpb24oam9iLmNhbmNlbElucHV0cywgY2IuY2FsbGJhY2suaW5wdXRzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGludGVyLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbEFyZ3MucHVzaChbJ2NhbmNlbEpvYicsIGpvYi5qb2JJZF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpvYi5wcm9ncmVzc0RlZmF1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChzaWRlVXBkYXRlKGpvYi5wcm9ncmVzc0RlZmF1bHQsIHBheWxvYWQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIFVzZSBXZWJTb2NrZXQgZm9yIGNhbGxiYWNrcyB3aGVuOlxuICAgICAgICAgICAgICAgIC8vIDEuIEdsb2JhbCBXZWJTb2NrZXQgaXMgZW5hYmxlZCwgT1JcbiAgICAgICAgICAgICAgICAvLyAyLiBQZXItY2FsbGJhY2sgd2Vic29ja2V0IGZsYWcgaXMgc2V0IChhbmQgV2ViU29ja2V0IGlzIGF2YWlsYWJsZSlcbiAgICAgICAgICAgICAgICAvLyAoYnV0IG5ldmVyIGZvciBiYWNrZ3JvdW5kIGNhbGxiYWNrcylcbiAgICAgICAgICAgICAgICBjb25zdCB1c2VXZWJTb2NrZXQgPSAhYmFja2dyb3VuZCAmJlxuICAgICAgICAgICAgICAgICAgICAoaXNXZWJTb2NrZXRFbmFibGVkKGNvbmZpZykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIChjYi5jYWxsYmFjay53ZWJzb2NrZXQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1dlYlNvY2tldEF2YWlsYWJsZShjb25maWcpKSk7XG4gICAgICAgICAgICAgICAgLy8gU3RyZWFtaW5nIGNhbGxiYWNrcyByaWRlIHRoZSBzaW5nbGUgbXVsdGlwbGV4ZWQgZG93bmxpbmsgd2hlblxuICAgICAgICAgICAgICAgIC8vIHRoZSBzZXJ2ZXIgb2ZmZXJzIGl0IChzaGFyZWQgc3RvcmFnZSBlbmFibGVkKSBhbmQgdGhleSBhcmUgbm90XG4gICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBvbiB0aGUgV2ViU29ja2V0IHRyYW5zcG9ydCBvciBhIGJhY2tncm91bmQgam9iLlxuICAgICAgICAgICAgICAgIGNvbnN0IHVzZVN0cmVhbSA9ICFiYWNrZ3JvdW5kICYmXG4gICAgICAgICAgICAgICAgICAgICF1c2VXZWJTb2NrZXQgJiZcbiAgICAgICAgICAgICAgICAgICAgY2IuY2FsbGJhY2suc3RyZWFtICYmXG4gICAgICAgICAgICAgICAgICAgIGlzU3RyZWFtTXVsdGlwbGV4ZWQoY29uZmlnKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCByZXRyeSA9IDA7IHJldHJ5IDw9IE1BWF9BVVRIX1JFVFJJRVM7IHJldHJ5KyspIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVzZVdlYlNvY2tldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSBXZWJTb2NrZXQgcGF0aCBmb3IgcmVhbC10aW1lIGNhbGxiYWNrc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBhd2FpdCBoYW5kbGVXZWJzb2NrZXRDYWxsYmFjayhkaXNwYXRjaCwgaG9va3MsIG5ld0NvbmZpZywgcGF5bG9hZCwgY2IuY2FsbGJhY2sucnVubmluZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh1c2VTdHJlYW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gYXdhaXQgaGFuZGxlU3RyZWFtQ2FsbGJhY2soZGlzcGF0Y2gsIG5ld0NvbmZpZywgcGF5bG9hZCwgY2IuY2FsbGJhY2sucnVubmluZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChzdHJlYW1FcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbUVycj8ubWVzc2FnZT8uaW5jbHVkZXMoJzQwMycpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gYXdhaXQgaGFuZGxlU2VydmVyc2lkZShkaXNwYXRjaCwgaG9va3MsIG5ld0NvbmZpZywgcGF5bG9hZCwgYmFja2dyb3VuZCwgYWRkaXRpb25hbEFyZ3MubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBhZGRpdGlvbmFsQXJnc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLCBnZXRTdGF0ZSwgY2IuY2FsbGJhY2sucnVubmluZywgY2IuY2FsbGJhY2suY29tcHJlc3NfcGF5bG9hZCwgY2IuY2FsbGJhY2suY29tcHJlc3NfdGhyZXNob2xkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHN0cmVhbUVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSB0cmFkaXRpb25hbCBIVFRQIHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gYXdhaXQgaGFuZGxlU2VydmVyc2lkZShkaXNwYXRjaCwgaG9va3MsIG5ld0NvbmZpZywgcGF5bG9hZCwgYmFja2dyb3VuZCwgYWRkaXRpb25hbEFyZ3MubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYWRkaXRpb25hbEFyZ3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsIGdldFN0YXRlLCBjYi5jYWxsYmFjay5ydW5uaW5nLCBjYi5jYWxsYmFjay5jb21wcmVzc19wYXlsb2FkLCBjYi5jYWxsYmFjay5jb21wcmVzc190aHJlc2hvbGQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0hlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChhZGRIdHRwSGVhZGVycyhuZXdIZWFkZXJzKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBMYXlvdXQgbWF5IGhhdmUgY2hhbmdlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJ1biBwYXJzZVBhdGNoUHJvcHMgYWdhaW5zdCB0aGUgY3VycmVudCBsYXlvdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgZGF0YTogcGF0Y2hlZERhdGEsIHBhdGNoZWRPdXRwdXRzIH0gPSBhcHBseVBhdGNoZWRPdXRwdXRzKG91dHB1dHMsIHBhdGhzLCBnZXRTdGF0ZSgpLmxheW91dCwgZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHluYW1pY19jcmVhdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiBkaXNwYXRjaChyZXF1ZXN0RGVwZW5kZW5jaWVzKCkpLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogcGF0Y2hlZERhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5wYXRjaGVkUmVzdWx0RmllbGRzKHBhdGNoZWRPdXRwdXRzKVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAocmVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0RXJyb3IgPSByZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0cnkgPD0gTUFYX0FVVEhfUkVUUklFUyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXMuc3RhdHVzID09PSBTVEFUVVMuVU5BVVRIT1JJWkVEIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5zdGF0dXMgPT09IFNUQVRVUy5CQURfUkVRVUVTVCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib2R5ID0gYXdhaXQgcmVzLnRleHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYm9keS5pbmNsdWRlcyhKV1RfRVhQSVJFRF9NRVNTQUdFKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaG9va3MucmVxdWVzdF9yZWZyZXNoX2p3dCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9sZEp3dCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmZldGNoLmhlYWRlcnMuQXV0aG9yaXphdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZEp3dCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5mZXRjaC5oZWFkZXJzLkF1dGhvcml6YXRpb24uc3Vic3RyKCdCZWFyZXIgJy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3Snd0ID0gYXdhaXQgaG9va3MucmVxdWVzdF9yZWZyZXNoX2p3dChvbGRKd3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0p3dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0hlYWRlcnMgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtuZXdKd3R9YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29uZmlnID0gbWVyZ2VEZWVwUmlnaHQoY29uZmlnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZldGNoOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBuZXdIZWFkZXJzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIHdlIHJlYWNoIGhlcmUgd2hlbiB3ZSBydW4gb3V0IG9mIHJldHJpZXMuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZXJyb3I6IGxhc3RFcnJvciwgcGF5bG9hZDogbnVsbCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZXJyb3IsIHBheWxvYWQ6IG51bGwgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoKGxvYWRlZChsb2FkaW5nT3V0cHV0cykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBuZXdDYiA9IHtcbiAgICAgICAgICAgIC4uLmNiLFxuICAgICAgICAgICAgZXhlY3V0aW9uUHJvbWlzZTogX19leGVjdXRlKClcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIG5ld0NiO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLmNiLFxuICAgICAgICAgICAgZXhlY3V0aW9uUHJvbWlzZTogeyBlcnJvciwgcGF5bG9hZDogbnVsbCB9XG4gICAgICAgIH07XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgYWxsLCBhc3NvYywgY29uY2F0LCBkaWZmZXJlbmNlLCBmaWx0ZXIsIGZsYXR0ZW4sIGlzRW1wdHksIGtleXMsIG1hcCwgbWVyZ2VXaXRoLCBwYXJ0aXRpb24sIHBhdGgsIHBpY2tCeSwgcHJvcHMsIHJlZHVjZSwgemlwT2JqIH0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IHsgYWRkQWxsUmVzb2x2ZWRGcm9tT3V0cHV0cywgZ2V0QW55VmFscywgZ2V0VW5maWx0ZXJlZExheW91dENhbGxiYWNrcywgaWRNYXRjaCwgaXNNdWx0aVZhbHVlZCwgcGFydGlhbElkTWF0Y2gsIHNwbGl0SWRBbmRQcm9wLCBzdHJpbmdpZnlJZCB9IGZyb20gJy4vZGVwZW5kZW5jaWVzJztcbmltcG9ydCB7IGdldFBhdGggfSBmcm9tICcuL3BhdGhzJztcbmV4cG9ydCBjb25zdCBESVJFQ1QgPSAyO1xuZXhwb3J0IGNvbnN0IElORElSRUNUID0gMTtcbmV4cG9ydCBjb25zdCBtZXJnZU1heCA9IG1lcmdlV2l0aChNYXRoLm1heCk7XG5leHBvcnQgY29uc3QgY29tYmluZUlkQW5kUHJvcCA9ICh7IGlkLCBwcm9wZXJ0eSB9KSA9PiBgJHtzdHJpbmdpZnlJZChpZCl9LiR7cHJvcGVydHl9YDtcbmV4cG9ydCBmdW5jdGlvbiBnZXRDYWxsYmFja3NCeUlucHV0KGdyYXBocywgcGF0aHMsIGlkLCBwcm9wLCBjaGFuZ2VUeXBlLCB3aXRoUHJpb3JpdHkgPSB0cnVlKSB7XG4gICAgY29uc3QgbWF0Y2hlcyA9IFtdO1xuICAgIGNvbnN0IGlkQW5kUHJvcCA9IGNvbWJpbmVJZEFuZFByb3AoeyBpZCwgcHJvcGVydHk6IHByb3AgfSk7XG4gICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgLy8gc3RhbmRhcmQgaWQgdmVyc2lvblxuICAgICAgICBjb25zdCBjYWxsYmFja3MgPSAoZ3JhcGhzLmlucHV0TWFwW2lkXSB8fCB7fSlbcHJvcF07XG4gICAgICAgIGlmICghY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgY2FsbGJhY2tzLmZvckVhY2goYWRkQWxsUmVzb2x2ZWRGcm9tT3V0cHV0cyhyZXNvbHZlRGVwcygpLCBwYXRocywgbWF0Y2hlcykpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gd2lsZGNhcmQgdmVyc2lvblxuICAgICAgICBjb25zdCBpZEtleXMgPSBPYmplY3Qua2V5cyhpZCkuc29ydCgpO1xuICAgICAgICBjb25zdCB2YWxzID0gcHJvcHMoaWRLZXlzLCBpZCk7XG4gICAgICAgIGNvbnN0IGlkS2V5U3RyID0gaWRLZXlzLmpvaW4oJywnKTtcbiAgICAgICAgY29uc3QgcGF0dGVybnMgPSAoZ3JhcGhzLmlucHV0UGF0dGVybnNbaWRLZXlTdHJdIHx8IHt9KVtwcm9wXTtcbiAgICAgICAgaWYgKHBhdHRlcm5zKSB7XG4gICAgICAgICAgICBwYXR0ZXJucy5mb3JFYWNoKChwYXR0ZXJuKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHBhdHRlcm4ucGFydGlhbCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBQYXJ0aWFsIHBhdHRlcm5zIHN0b3JlZCB1bmRlciBzYW1lIGlkS2V5U3RyIHdvbid0IGhhcHBlblxuICAgICAgICAgICAgICAgICAgICAvLyBub3JtYWxseSwgYnV0IGhhbmRsZSBpdCBmb3IgY29tcGxldGVuZXNzXG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0aWFsSWRNYXRjaChwYXR0ZXJuLmtleXMsIHBhdHRlcm4udmFsdWVzLCBpZEtleXMsIHZhbHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0cmlnZ2VyQW55VmFscyA9IGdldEFueVZhbHMocGF0dGVybi52YWx1ZXMsIHZhbHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXh0cmFjdCB2YWxzIGZvciBwYXR0ZXJuIGtleXMgZnJvbSB0aGUgY29tcG9uZW50XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXR0ZXJuUmVmVmFscyA9IHBhdHRlcm4ua2V5cy5tYXAoKGspID0+IHZhbHNbaWRLZXlzLmluZGV4T2YoayldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4uY2FsbGJhY2tzLmZvckVhY2goYWRkQWxsUmVzb2x2ZWRGcm9tT3V0cHV0cyhyZXNvbHZlUGFydGlhbERlcHMocGF0dGVybi5rZXlzLCBwYXR0ZXJuUmVmVmFscywgcGF0dGVybi52YWx1ZXMsIGlkS2V5cyksIHBhdGhzLCBtYXRjaGVzLCB0cmlnZ2VyQW55VmFscykpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlkTWF0Y2goaWRLZXlzLCB2YWxzLCBwYXR0ZXJuLnZhbHVlcykpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHJpZ2dlckFueVZhbHMgPSBnZXRBbnlWYWxzKHBhdHRlcm4udmFsdWVzLCB2YWxzKTtcbiAgICAgICAgICAgICAgICAgICAgcGF0dGVybi5jYWxsYmFja3MuZm9yRWFjaChhZGRBbGxSZXNvbHZlZEZyb21PdXRwdXRzKHJlc29sdmVEZXBzKGlkS2V5cywgdmFscywgcGF0dGVybi52YWx1ZXMpLCBwYXRocywgbWF0Y2hlcywgdHJpZ2dlckFueVZhbHMpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBbHNvIGNoZWNrIHBhcnRpYWwgcGF0dGVybnMgd2hvc2Uga2V5cyBhcmUgYSBzdWJzZXQgb2YgdGhpc1xuICAgICAgICAvLyBjb21wb25lbnQncyBrZXlzXG4gICAgICAgIGlmIChncmFwaHMuaGFzUGFydGlhbElucHV0UGF0dGVybnMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcGF0S2V5U3RyIGluIGdyYXBocy5wYXJ0aWFsSW5wdXRQYXR0ZXJucykge1xuICAgICAgICAgICAgICAgIGlmIChwYXRLZXlTdHIgPT09IGlkS2V5U3RyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBhbHJlYWR5IGhhbmRsZWQgYWJvdmVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcGF0S2V5cyA9IHBhdEtleVN0ci5zcGxpdCgnLCcpO1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHBhdHRlcm4ga2V5cyBhcmUgYSBzdWJzZXQgb2YgY29tcG9uZW50IGtleXNcbiAgICAgICAgICAgICAgICBpZiAoIXBhdEtleXMuZXZlcnkoKGspID0+IGlkS2V5cy5pbmRleE9mKGspICE9PSAtMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHBhdFByb3BQYXR0ZXJucyA9IGdyYXBocy5wYXJ0aWFsSW5wdXRQYXR0ZXJuc1twYXRLZXlTdHJdW3Byb3BdO1xuICAgICAgICAgICAgICAgIGlmICghcGF0UHJvcFBhdHRlcm5zKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwYXRQcm9wUGF0dGVybnMuZm9yRWFjaCgocGF0dGVybikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFydGlhbElkTWF0Y2gocGF0dGVybi5rZXlzLCBwYXR0ZXJuLnZhbHVlcywgaWRLZXlzLCB2YWxzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHJpZ2dlckFueVZhbHMgPSBnZXRBbnlWYWxzKHBhdHRlcm4udmFsdWVzLCB2YWxzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4dHJhY3QgdmFscyBmb3IgcGF0dGVybiBrZXlzIGZyb20gdGhlIGNvbXBvbmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGF0dGVyblJlZlZhbHMgPSBwYXR0ZXJuLmtleXMubWFwKChrKSA9PiB2YWxzW2lkS2V5cy5pbmRleE9mKGspXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuLmNhbGxiYWNrcy5mb3JFYWNoKGFkZEFsbFJlc29sdmVkRnJvbU91dHB1dHMocmVzb2x2ZVBhcnRpYWxEZXBzKHBhdHRlcm4ua2V5cywgcGF0dGVyblJlZlZhbHMsIHBhdHRlcm4udmFsdWVzLCBpZEtleXMpLCBwYXRocywgbWF0Y2hlcywgdHJpZ2dlckFueVZhbHMpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IC8vIGVuZCBoYXNQYXJ0aWFsSW5wdXRQYXR0ZXJucyBndWFyZFxuICAgIH1cbiAgICBtYXRjaGVzLmZvckVhY2gobWF0Y2ggPT4ge1xuICAgICAgICBtYXRjaC5jaGFuZ2VkUHJvcElkc1tpZEFuZFByb3BdID0gY2hhbmdlVHlwZSB8fCBESVJFQ1Q7XG4gICAgICAgIGlmICh3aXRoUHJpb3JpdHkpIHtcbiAgICAgICAgICAgIG1hdGNoLnByaW9yaXR5ID0gZ2V0UHJpb3JpdHkoZ3JhcGhzLCBwYXRocywgbWF0Y2gpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG1hdGNoZXM7XG59XG4vKlxuICogQnVpbGRzIGEgdHJlZSBvZiBhbGwgY2FsbGJhY2tzIHRoYXQgY2FuIGJlIHRyaWdnZXJlZCBieSB0aGUgcHJvdmlkZWQgY2FsbGJhY2suXG4gKiBVc2VzIHRoZSBudW1iZXIgb2YgY2FsbGJhY2tzIGF0IGVhY2ggdHJlZSBkZXB0aCBhbmQgdGhlIHRvdGFsIGRlcHRoIG9mIHRoZSB0cmVlXG4gKiB0byBjcmVhdGUgYSBzb3J0YWJsZSBwcmlvcml0eSBoYXNoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJpb3JpdHkoZ3JhcGhzLCBwYXRocywgY2FsbGJhY2spIHtcbiAgICBsZXQgY2FsbGJhY2tzID0gW2NhbGxiYWNrXTtcbiAgICBjb25zdCB0b3VjaGVkT3V0cHV0cyA9IHt9O1xuICAgIGNvbnN0IHRvdWNoZWRDYklkcyA9IHt9O1xuICAgIGNvbnN0IHByaW9yaXR5ID0gW107XG4gICAgd2hpbGUgKGNhbGxiYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgY2FsbGJhY2tzID0gZmlsdGVyKGMgPT4ge1xuICAgICAgICAgICAgY29uc3QgdG91Y2hlZCA9IHRvdWNoZWRDYklkc1tjLnJlc29sdmVkSWRdO1xuICAgICAgICAgICAgdG91Y2hlZENiSWRzW2MucmVzb2x2ZWRJZF0gPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIHRvdWNoZWQ7XG4gICAgICAgIH0sIGNhbGxiYWNrcyk7XG4gICAgICAgIGNvbnN0IG91dHB1dHMgPSBmaWx0ZXIobyA9PiAhdG91Y2hlZE91dHB1dHNbY29tYmluZUlkQW5kUHJvcChvKV0sIGZsYXR0ZW4obWFwKGNiID0+IGZsYXR0ZW4oY2IuZ2V0T3V0cHV0cyhwYXRocykpLCBjYWxsYmFja3MpKSk7XG4gICAgICAgIG91dHB1dHMuZm9yRWFjaChvID0+ICh0b3VjaGVkT3V0cHV0c1tjb21iaW5lSWRBbmRQcm9wKG8pXSA9IHRydWUpKTtcbiAgICAgICAgY2FsbGJhY2tzID0gZmxhdHRlbihtYXAoKHsgaWQsIHByb3BlcnR5IH0pID0+IGdldENhbGxiYWNrc0J5SW5wdXQoZ3JhcGhzLCBwYXRocywgaWQsIHByb3BlcnR5LCBJTkRJUkVDVCwgZmFsc2UpLCBvdXRwdXRzKSk7XG4gICAgICAgIGlmIChjYWxsYmFja3MubGVuZ3RoKSB7XG4gICAgICAgICAgICBwcmlvcml0eS5wdXNoKGNhbGxiYWNrcy5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByaW9yaXR5LnVuc2hpZnQocHJpb3JpdHkubGVuZ3RoKTtcbiAgICByZXR1cm4gbWFwKGkgPT4gTWF0aC5taW4oaSwgMzUpLnRvU3RyaW5nKDM2KSwgcHJpb3JpdHkpLmpvaW4oJycpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEFsbFN1YnNlcXVlbnRPdXRwdXRzRm9yQ2FsbGJhY2soZ3JhcGhzLCBwYXRocywgY2FsbGJhY2spIHtcbiAgICBsZXQgY2FsbGJhY2tzID0gW2NhbGxiYWNrXTtcbiAgICBsZXQgdG91Y2hlZE91dHB1dHMgPSB7fTtcbiAgICAvLyB0aGlzIHRyYXZlcnNlcyB0aGUgZ3JhcGggYWxsIHRoZSB3YXkgdG8gdGhlIGVuZFxuICAgIHdoaWxlIChjYWxsYmFja3MubGVuZ3RoKSB7XG4gICAgICAgIC8vIGRvbid0IGFkZCBpdCBpZiBpdCBhbHJlYWR5IGV4aXN0cyBiYXNlZCBvbiBpZCBhbmQgcHJvcHNcbiAgICAgICAgY29uc3Qgb3V0cHV0cyA9IGZpbHRlcihvID0+ICF0b3VjaGVkT3V0cHV0c1tjb21iaW5lSWRBbmRQcm9wKG8pXSwgZmxhdHRlbihtYXAoY2IgPT4gZmxhdHRlbihjYi5nZXRPdXRwdXRzKHBhdGhzKSksIGNhbGxiYWNrcykpKTtcbiAgICAgICAgdG91Y2hlZE91dHB1dHMgPSByZWR1Y2UoKHRvdWNoZWQsIG8pID0+IGFzc29jKGNvbWJpbmVJZEFuZFByb3AobyksIHRydWUsIHRvdWNoZWQpLCB0b3VjaGVkT3V0cHV0cywgb3V0cHV0cyk7XG4gICAgICAgIGNhbGxiYWNrcyA9IGZsYXR0ZW4obWFwKCh7IGlkLCBwcm9wZXJ0eSB9KSA9PiBnZXRDYWxsYmFja3NCeUlucHV0KGdyYXBocywgcGF0aHMsIGlkLCBwcm9wZXJ0eSwgSU5ESVJFQ1QsIGZhbHNlKSwgb3V0cHV0cykpO1xuICAgIH1cbiAgICByZXR1cm4gdG91Y2hlZE91dHB1dHM7XG59XG5leHBvcnQgY29uc3QgZ2V0UmVhZHlDYWxsYmFja3MgPSAocGF0aHMsIGNhbmRpZGF0ZXMsIGNhbGxiYWNrcyA9IGNhbmRpZGF0ZXMsIGdyYXBocyA9IHt9KSA9PiB7XG4gICAgLy8gU2tpcCBpZiB0aGVyZSdzIG5vIGNhbmRpZGF0ZXNcbiAgICBpZiAoIWNhbmRpZGF0ZXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgLy8gRmluZCBhbGwgb3V0cHV0cyBvZiBhbGwgYWN0aXZlIGNhbGxiYWNrc1xuICAgIGNvbnN0IG91dHB1dHMgPSBtYXAoY29tYmluZUlkQW5kUHJvcCwgcmVkdWNlKChvLCBjYikgPT4gY29uY2F0KG8sIGZsYXR0ZW4oY2IuZ2V0T3V0cHV0cyhwYXRocykpKSwgW10sIGNhbGxiYWNrcykpO1xuICAgIC8vIE1ha2UgYG91dHB1dHNgIGhhc2ggdGFibGUgZm9yIGZhc3RlciBhY2Nlc3NcbiAgICBsZXQgb3V0cHV0c01hcCA9IHt9O1xuICAgIG91dHB1dHMuZm9yRWFjaChvdXRwdXQgPT4gKG91dHB1dHNNYXBbb3V0cHV0XSA9IHRydWUpKTtcbiAgICAvLyBmaW5kIGFsbCB0aGUgb3V0cHV0cyB0b3VjaGVkIGJ5IGFjdGl2ZUNhbGxiYWNrc1xuICAgIC8vIHJlbW92ZSB0aGlzIGNoZWNrIGlmIGdyYXBoIGlzIGFjY2Vzc2libGUgYWxsIHRoZSB0aW1lXG4gICAgaWYgKE9iamVjdC5rZXlzKGdyYXBocykubGVuZ3RoKSB7XG4gICAgICAgIC8vbm90IHN1cmUgaWYgZ3JhcGggd2lsbCBiZSBhY2Nlc3NpYmxlIGFsbCB0aGUgdGltZVxuICAgICAgICBjb25zdCBhbGxUb3VjaGVkT3V0cHV0cyA9IGZsYXR0ZW4obWFwKGNiID0+IGdldEFsbFN1YnNlcXVlbnRPdXRwdXRzRm9yQ2FsbGJhY2soZ3JhcGhzLCBwYXRocywgY2IpLCBjYWxsYmFja3MpKTtcbiAgICAgICAgLy8gb3ZlcnJyaWRlcyB0aGUgb3V0cHV0c01hcCwgd2lsbCBkdXBsaWNhdGUgY2FsbGJhY2tzIGZpbHRlcmVkXG4gICAgICAgIC8vIHRoaXMgaXMgb25seSBkb25lIHRvIHNpbGVuY2UgdHlwZXNjcmlwdCBlcnJvcnNcbiAgICAgICAgaWYgKGFsbFRvdWNoZWRPdXRwdXRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIG91dHB1dHNNYXAgPSBPYmplY3QuYXNzaWduKGFsbFRvdWNoZWRPdXRwdXRzWzBdLCAuLi5hbGxUb3VjaGVkT3V0cHV0cyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gUmFtZGEuSlMgYGRpZmZlcmVuY2VgIGZ1bmN0aW9uIGlzIHNsb3cgYmVjYXVzZSBpdCBjb21wYXJlcyBvYmplY3RzIGVudGlyZWx5XG4gICAgLy8gVGhpcyBjYXVzZSB0aGUgZm9sbG93aW5nIGBmaWx0ZXJgIHRvIGJlIGV4cG9uZW50aWFsbHkgc2xvdyBhcyB0aGUgbnVtYmVyIG9mIGlucHV0cyBvciBvdXRwdXRzIGdyb3dcbiAgICAvLyBXZSBjYW4gb3B0aW1pemUgdGhpcyBieSBjb21wYXJpbmcgb25seSB0aGUgYGlkK3Byb3BgIHBhcnQgb2YgdGhlIGlucHV0cyAmIG91dHB1dHMuXG4gICAgLy8gT3JpZ2luYWwgZGlmZmVyZW5jZSB0YWtlcyAzODBtcyBvbiBhdmVyYWdlIHRvIGNvbXB1dGUgZGlmZmVyZW5jZSBiZXR3ZWVuIDIwMCBpbnB1dHMgYW5kIDEgb3V0cHV0LlxuICAgIC8vIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gdGFrZXMgMS0ybXMgb24gYXZlcmFnZS5cbiAgICBjb25zdCBkaWZmZXJlbmNlQmFzZWRPbklkID0gKGlucHV0cywgb3V0cHV0cykgPT4gaW5wdXRzLmZpbHRlcihpbnB1dCA9PiAhb3V0cHV0cy5zb21lKG91dHB1dCA9PiBjb21iaW5lSWRBbmRQcm9wKGlucHV0KSA9PT0gY29tYmluZUlkQW5kUHJvcChvdXRwdXQpKSk7XG4gICAgLy8gRmluZCBgcmVxdWVzdGVkYCBjYWxsYmFja3MgdGhhdCBkbyBub3QgZGVwZW5kIG9uIGEgb3V0c3RhbmRpbmcgb3V0cHV0IChhcyBlaXRoZXIgaW5wdXQgb3Igc3RhdGUpXG4gICAgLy8gT3V0cHV0cyB3aGljaCBvdmVybGFwIGFuIGlucHV0IGRvIG5vdCBjb3VudCBhcyBhbiBvdXRzdGFuZGluZyBvdXRwdXRcbiAgICByZXR1cm4gZmlsdGVyKGNiID0+IGFsbChjYnAgPT4gIW91dHB1dHNNYXBbY29tYmluZUlkQW5kUHJvcChjYnApXSwgZGlmZmVyZW5jZUJhc2VkT25JZChmbGF0dGVuKGNiLmdldElucHV0cyhwYXRocykpLCBmbGF0dGVuKGNiLmdldE91dHB1dHMocGF0aHMpKSkpLCBjYW5kaWRhdGVzKTtcbn07XG5leHBvcnQgY29uc3QgZ2V0TGF5b3V0Q2FsbGJhY2tzID0gKGdyYXBocywgcGF0aHMsIGxheW91dCwgb3B0aW9ucykgPT4ge1xuICAgIGxldCBleGNsdXNpb25zID0gW107XG4gICAgbGV0IGNhbGxiYWNrcyA9IGdldFVuZmlsdGVyZWRMYXlvdXRDYWxsYmFja3MoZ3JhcGhzLCBwYXRocywgbGF5b3V0LCBvcHRpb25zKTtcbiAgICAvKlxuICAgICAgICBSZW1vdmUgZnJvbSB0aGUgaW5pdGlhbCBjYWxsYmFja3MgdGhvc2UgdGhhdCBhcmUgbGVmdCB3aXRoIG9ubHkgZXhjbHVkZWQgaW5wdXRzLlxuXG4gICAgICAgIEV4Y2x1c2lvbiBvZiBpbnB1dHMgaGFwcGVucyB3aGVuOlxuICAgICAgICAtIGFuIGlucHV0IGlzIG1pc3NpbmdcbiAgICAgICAgLSBhbiBpbnB1dCBpbiB0aGUgaW5pdGlhbCBjYWxsYmFjayBjaGFpbiBkZXBlbmRzIG9ubHkgb24gZXhjbHVkZWQgaW5wdXRzXG5cbiAgICAgICAgRnVydGhlciBleGNsdXNpb24gbWlnaHQgaGFwcGVuIGFmdGVyIGNhbGxiYWNrcyByZXR1cm4gd2l0aDpcbiAgICAgICAgLSBQcmV2ZW50VXBkYXRlXG4gICAgICAgIC0gbm9fdXBkYXRlXG4gICAgKi9cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAvLyBGaW5kIGNhbGxiYWNrcyBmb3Igd2hpY2ggYWxsIGlucHV0cyBhcmUgbWlzc2luZyBvciBpbiB0aGUgZXhjbHVzaW9uc1xuICAgICAgICBjb25zdCBbaW5jbHVkZWQsIGV4Y2x1ZGVkXSA9IHBhcnRpdGlvbigoeyBjYWxsYmFjazogeyBpbnB1dHMgfSwgZ2V0SW5wdXRzIH0pID0+IGFsbChpc011bHRpVmFsdWVkLCBpbnB1dHMpIHx8XG4gICAgICAgICAgICAhaXNFbXB0eShkaWZmZXJlbmNlKG1hcChjb21iaW5lSWRBbmRQcm9wLCBmbGF0dGVuKGdldElucHV0cyhwYXRocykpKSwgZXhjbHVzaW9ucykpLCBjYWxsYmFja3MpO1xuICAgICAgICAvLyBJZiB0aGVyZSdzIG5vIGFkZGl0aW9uYWwgZXhjbHVzaW9ucywgYnJlYWsgbG9vcCAtIGNhbGxiYWNrcyBoYXZlIGJlZW4gY2xlYW5lZFxuICAgICAgICBpZiAoIWV4Y2x1ZGVkLmxlbmd0aCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FsbGJhY2tzID0gaW5jbHVkZWQ7XG4gICAgICAgIC8vIHVwZGF0ZSBleGNsdXNpb25zIHdpdGggYWxsIGFkZGl0aW9uYWwgZXhjbHVkZWQgb3V0cHV0c1xuICAgICAgICBleGNsdXNpb25zID0gY29uY2F0KGV4Y2x1c2lvbnMsIG1hcChjb21iaW5lSWRBbmRQcm9wLCBmbGF0dGVuKG1hcCgoeyBnZXRPdXRwdXRzIH0pID0+IGdldE91dHB1dHMocGF0aHMpLCBleGNsdWRlZCkpKSk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmZpbHRlclJvb3QpIHtcbiAgICAgICAgbGV0IHJvb3RJZCA9IHBhdGgoWydwcm9wcycsICdpZCddLCBsYXlvdXQpO1xuICAgICAgICBpZiAocm9vdElkKSB7XG4gICAgICAgICAgICByb290SWQgPSBzdHJpbmdpZnlJZChyb290SWQpO1xuICAgICAgICAgICAgLy8gRmlsdGVyIGlucHV0cyB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiB0aGUgcmVzcG9uc2VcbiAgICAgICAgICAgIGNhbGxiYWNrcyA9IGNhbGxiYWNrcy5maWx0ZXIoY2IgPT4gY2IuY2FsbGJhY2suaW5wdXRzLnJlZHVjZSgocHJldmlvdXMsIGlucHV0KSA9PiBwcmV2aW91cyB8fFxuICAgICAgICAgICAgICAgIChzdHJpbmdpZnlJZChpbnB1dC5pZCkgPT0gcm9vdElkICYmXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsdGVyUm9vdC5pbmNsdWRlcyhpbnB1dC5wcm9wZXJ0eSkpLCBmYWxzZSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qXG4gICAgICAgIFJldHVybiBhbGwgY2FsbGJhY2tzIHdpdGggYW4gYGV4ZWN1dGlvbkdyb3VwYCB0byBhbGxvdyBncm91cC1wcm9jZXNzaW5nXG4gICAgKi9cbiAgICBjb25zdCBleGVjdXRpb25Hcm91cCA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMTYpO1xuICAgIHJldHVybiBtYXAoY2IgPT4gKHsgLi4uY2IsIGV4ZWN1dGlvbkdyb3VwIH0pLCBjYWxsYmFja3MpO1xufTtcbmV4cG9ydCBjb25zdCBnZXRVbmlxdWVJZGVudGlmaWVyID0gKHsgYW55VmFscywgY2FsbGJhY2s6IHsgaW5wdXRzLCBvdXRwdXRzLCBzdGF0ZSwgb3V0cHV0IH0gfSkgPT4ge1xuICAgIGNvbnN0IGlkUGFydHMgPSBtYXAoY29tYmluZUlkQW5kUHJvcCwgWy4uLmlucHV0cywgLi4ub3V0cHV0cywgLi4uc3RhdGVdKTtcbiAgICAvLyBGb3Igbm8tb3V0cHV0IGNhbGxiYWNrcywgaW5jbHVkZSB0aGUgb3V0cHV0IGhhc2ggdG8gZW5zdXJlIHVuaXF1ZW5lc3NcbiAgICBpZiAob3V0cHV0cy5sZW5ndGggPT09IDAgJiYgb3V0cHV0KSB7XG4gICAgICAgIGlkUGFydHMucHVzaChvdXRwdXQpO1xuICAgIH1cbiAgICByZXR1cm4gY29uY2F0KGlkUGFydHMsIEFycmF5LmlzQXJyYXkoYW55VmFscykgPyBhbnlWYWxzIDogYW55VmFscyA9PT0gJycgPyBbXSA6IFthbnlWYWxzXSkuam9pbignLCcpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBpbmNsdWRlT2JzZXJ2ZXJzKGlkLCBwcm9wZXJ0aWVzLCBncmFwaHMsIHBhdGhzKSB7XG4gICAgcmV0dXJuIGZsYXR0ZW4obWFwKHByb3BOYW1lID0+IGdldENhbGxiYWNrc0J5SW5wdXQoZ3JhcGhzLCBwYXRocywgaWQsIHByb3BOYW1lKSwga2V5cyhwcm9wZXJ0aWVzKSkpO1xufVxuLypcbiAqIENyZWF0ZSBhIHBlbmRpbmcgY2FsbGJhY2sgb2JqZWN0LiBJbmNsdWRlcyB0aGUgb3JpZ2luYWwgY2FsbGJhY2sgZGVmaW5pdGlvbixcbiAqIGl0cyByZXNvbHZlZCBJRCAoaW5jbHVkaW5nIHRoZSB2YWx1ZSBvZiBhbGwgTUFUQ0ggd2lsZGNhcmRzKSxcbiAqIGFjY2Vzc29ycyB0byBmaW5kIGFsbCBpbnB1dHMsIG91dHB1dHMsIGFuZCBzdGF0ZSBpbnZvbHZlZCBpbiB0aGlzXG4gKiBjYWxsYmFjayAobGF6eSBhcyBub3QgYWxsIHVzZXJzIHdpbGwgd2FudCBhbGwgb2YgdGhlc2UpLlxuICovXG5leHBvcnQgY29uc3QgbWFrZVJlc29sdmVkQ2FsbGJhY2sgPSAoY2FsbGJhY2ssIHJlc29sdmUsIGFueVZhbHMpID0+ICh7XG4gICAgY2FsbGJhY2ssXG4gICAgYW55VmFscyxcbiAgICByZXNvbHZlZElkOiBjYWxsYmFjay5vdXRwdXQgKyBhbnlWYWxzLFxuICAgIGdldE91dHB1dHM6IHBhdGhzID0+IGNhbGxiYWNrLm91dHB1dHMubWFwKHJlc29sdmUocGF0aHMpKSxcbiAgICBnZXRJbnB1dHM6IHBhdGhzID0+IGNhbGxiYWNrLmlucHV0cy5tYXAocmVzb2x2ZShwYXRocykpLFxuICAgIGdldFN0YXRlOiBwYXRocyA9PiBjYWxsYmFjay5zdGF0ZS5tYXAocmVzb2x2ZShwYXRocykpLFxuICAgIGNoYW5nZWRQcm9wSWRzOiB7fSxcbiAgICBpbml0aWFsQ2FsbDogZmFsc2Vcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIHBydW5lQ2FsbGJhY2tzKGNhbGxiYWNrcywgcGF0aHMpIHtcbiAgICBjb25zdCBbLCByZW1vdmVkXSA9IHBhcnRpdGlvbigoeyBnZXRPdXRwdXRzLCBjYWxsYmFjazogeyBvdXRwdXRzIH0gfSkgPT4gZmxhdHRlbihnZXRPdXRwdXRzKHBhdGhzKSkubGVuZ3RoID09PSBvdXRwdXRzLmxlbmd0aCwgY2FsbGJhY2tzKTtcbiAgICBjb25zdCBbLCBtb2RpZmllZF0gPSBwYXJ0aXRpb24oKHsgZ2V0T3V0cHV0cyB9KSA9PiAhZmxhdHRlbihnZXRPdXRwdXRzKHBhdGhzKSkubGVuZ3RoLCByZW1vdmVkKTtcbiAgICBjb25zdCBhZGRlZCA9IG1hcChjYiA9PiBhc3NvYygnY2hhbmdlZFByb3BJZHMnLCBwaWNrQnkoKF8sIHByb3BJZCkgPT4gZ2V0UGF0aChwYXRocywgc3BsaXRJZEFuZFByb3AocHJvcElkKS5pZCksIGNiLmNoYW5nZWRQcm9wSWRzKSwgY2IpLCBtb2RpZmllZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYWRkZWQsXG4gICAgICAgIHJlbW92ZWRcbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVEZXBzKHJlZktleXMsIHJlZlZhbHMsIHJlZlBhdHRlcm5WYWxzKSB7XG4gICAgcmV0dXJuIChwYXRocykgPT4gKHsgaWQ6IGlkUGF0dGVybiwgcHJvcGVydHksIHBhcnRpYWw6IGlzUGFydGlhbCB9KSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgaWRQYXR0ZXJuID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc3QgcGF0aCA9IGdldFBhdGgocGF0aHMsIGlkUGF0dGVybik7XG4gICAgICAgICAgICByZXR1cm4gcGF0aCA/IFt7IGlkOiBpZFBhdHRlcm4sIHByb3BlcnR5LCBwYXRoIH1dIDogW107XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaWRLZXlzID0gT2JqZWN0LmtleXMoaWRQYXR0ZXJuKS5zb3J0KCk7XG4gICAgICAgIGNvbnN0IHBhdHRlcm5WYWxzID0gcHJvcHMoaWRLZXlzLCBpZFBhdHRlcm4pO1xuICAgICAgICBjb25zdCBpZEtleVN0ciA9IGlkS2V5cy5qb2luKCcsJyk7XG4gICAgICAgIGNvbnN0IGtleVBhdGhzID0gcGF0aHMub2Jqc1tpZEtleVN0cl07XG4gICAgICAgIGlmIChrZXlQYXRocykge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgICAgICBrZXlQYXRocy5mb3JFYWNoKCh7IHZhbHVlczogdmFscywgcGF0aCB9KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGlkTWF0Y2goaWRLZXlzLCB2YWxzLCBwYXR0ZXJuVmFscywgcmVmS2V5cywgcmVmVmFscywgcmVmUGF0dGVyblZhbHMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHsgaWQ6IHppcE9iaihpZEtleXMsIHZhbHMpLCBwcm9wZXJ0eSwgcGF0aCB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgbm8gZXhhY3QgaWRLZXlTdHIgbWF0Y2ggYW5kIGlucHV0IGlzIHBhcnRpYWwsIHNlYXJjaCBmb3JcbiAgICAgICAgLy8gc3VwZXJzZXQga2V5U3RycyAoc2FtZSBsb2dpYyBhcyByZXNvbHZlUGFydGlhbERlcHMpXG4gICAgICAgIGlmIChpc1BhcnRpYWwpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBvYmpLZXlTdHIgaW4gcGF0aHMub2Jqcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9iaktleXMgPSBvYmpLZXlTdHIuc3BsaXQoJywnKTtcbiAgICAgICAgICAgICAgICBpZiAoIWlkS2V5cy5ldmVyeSgoaykgPT4gb2JqS2V5cy5pbmRleE9mKGspICE9PSAtMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IG9iaktleVBhdGhzID0gcGF0aHMub2Jqc1tvYmpLZXlTdHJdO1xuICAgICAgICAgICAgICAgIG9iaktleVBhdGhzLmZvckVhY2goKHsgdmFsdWVzOiB2YWxzLCBwYXRoIH0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnRpYWxJZE1hdGNoKGlkS2V5cywgcGF0dGVyblZhbHMsIG9iaktleXMsIHZhbHMsIHJlZktleXMsIHJlZlZhbHMsIHJlZlBhdHRlcm5WYWxzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB6aXBPYmoob2JqS2V5cywgdmFscyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH07XG59XG4vKlxuICogcmVzb2x2ZVBhcnRpYWxEZXBzOiBsaWtlIHJlc29sdmVEZXBzIGJ1dCBmb3IgcGFydGlhbCBwYXR0ZXJucy5cbiAqIFRoZSBwYXR0ZXJuIG1heSBoYXZlIGZld2VyIGtleXMgdGhhbiB0aGUgY29tcG9uZW50cyBpbiB0aGUgbGF5b3V0LlxuICogV2Ugc2VhcmNoIGFsbCBwYXRocy5vYmpzIGVudHJpZXMgd2hvc2Uga2V5cyBhcmUgYSBzdXBlcnNldCBvZiB0aGVcbiAqIHBhdHRlcm4ncyBrZXlzLlxuICpcbiAqIHBhdHRlcm5LZXlzOiB0aGUga2V5cyBkZWZpbmVkIGluIHRoZSB0cmlnZ2VyaW5nIHBhdHRlcm5cbiAqIHJlZlZhbHM6IHRoZSB0cmlnZ2VyaW5nIGNvbXBvbmVudCdzIHZhbHVlcyBmb3IgdGhlIHBhdHRlcm4ga2V5c1xuICogcmVmUGF0dGVyblZhbHM6IHRoZSBwYXR0ZXJuIHZhbHVlcyAod2lsZGNhcmRzL2xpdGVyYWxzKSBmb3IgdGhlIHBhdHRlcm4ga2V5c1xuICogY29tcG9uZW50S2V5czogdGhlIGZ1bGwga2V5cyBvZiB0aGUgdHJpZ2dlcmluZyBjb21wb25lbnQgKHN1cGVyc2V0KVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVBhcnRpYWxEZXBzKHBhdHRlcm5LZXlzLCByZWZWYWxzLCByZWZQYXR0ZXJuVmFscywgX2NvbXBvbmVudEtleXMpIHtcbiAgICByZXR1cm4gKHBhdGhzKSA9PiAoeyBpZDogaWRQYXR0ZXJuLCBwcm9wZXJ0eSwgcGFydGlhbDogaXNQYXJ0aWFsIH0pID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBpZFBhdHRlcm4gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCBwYXRoID0gZ2V0UGF0aChwYXRocywgaWRQYXR0ZXJuKTtcbiAgICAgICAgICAgIHJldHVybiBwYXRoID8gW3sgaWQ6IGlkUGF0dGVybiwgcHJvcGVydHksIHBhdGggfV0gOiBbXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpZEtleXMgPSBPYmplY3Qua2V5cyhpZFBhdHRlcm4pLnNvcnQoKTtcbiAgICAgICAgY29uc3QgcGF0dGVyblZhbHMgPSBwcm9wcyhpZEtleXMsIGlkUGF0dGVybik7XG4gICAgICAgIGlmICghaXNQYXJ0aWFsKSB7XG4gICAgICAgICAgICAvLyBOb24tcGFydGlhbCBkZXBlbmRlbmN5IGluIHRoZSBzYW1lIGNhbGxiYWNrIC0gdXNlIGV4YWN0IG1hdGNoXG4gICAgICAgICAgICBjb25zdCBpZEtleVN0ciA9IGlkS2V5cy5qb2luKCcsJyk7XG4gICAgICAgICAgICBjb25zdCBrZXlQYXRocyA9IHBhdGhzLm9ianNbaWRLZXlTdHJdO1xuICAgICAgICAgICAgaWYgKCFrZXlQYXRocykge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgICAgICAgICAgLy8gTWFwIHJlZlZhbHMgZnJvbSBwYXR0ZXJuS2V5cyB0byBpZEtleXMgb3JkZXJpbmdcbiAgICAgICAgICAgIGNvbnN0IG1hcHBlZFJlZlZhbHMgPSByZWZWYWxzXG4gICAgICAgICAgICAgICAgPyBpZEtleXMubWFwKChrKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkeCA9IHBhdHRlcm5LZXlzLmluZGV4T2Yoayk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpZHggIT09IC0xID8gcmVmVmFsc1tpZHhdIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBtYXBwZWRSZWZQYXR0ZXJuVmFscyA9IHJlZlBhdHRlcm5WYWxzXG4gICAgICAgICAgICAgICAgPyBpZEtleXMubWFwKChrKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkeCA9IHBhdHRlcm5LZXlzLmluZGV4T2Yoayk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpZHggIT09IC0xID8gcmVmUGF0dGVyblZhbHNbaWR4XSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAga2V5UGF0aHMuZm9yRWFjaCgoeyB2YWx1ZXM6IHZhbHMsIHBhdGggfSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpZE1hdGNoKGlkS2V5cywgdmFscywgcGF0dGVyblZhbHMsIHBhdHRlcm5LZXlzLCBtYXBwZWRSZWZWYWxzLCBtYXBwZWRSZWZQYXR0ZXJuVmFscykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goeyBpZDogemlwT2JqKGlkS2V5cywgdmFscyksIHByb3BlcnR5LCBwYXRoIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICAvLyBQYXJ0aWFsOiBzZWFyY2ggYWxsIHBhdGhzLm9ianMgZW50cmllcyB3aG9zZSBrZXlzIGFyZSBhXG4gICAgICAgIC8vIHN1cGVyc2V0IG9mIHRoaXMgcGF0dGVybidzIGtleXNcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgIGZvciAoY29uc3Qgb2JqS2V5U3RyIGluIHBhdGhzLm9ianMpIHtcbiAgICAgICAgICAgIGNvbnN0IG9iaktleXMgPSBvYmpLZXlTdHIuc3BsaXQoJywnKTtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIG9iaktleXMgaXMgYSBzdXBlcnNldCBvZiBpZEtleXNcbiAgICAgICAgICAgIGlmICghaWRLZXlzLmV2ZXJ5KChrKSA9PiBvYmpLZXlzLmluZGV4T2YoaykgIT09IC0xKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qga2V5UGF0aHMgPSBwYXRocy5vYmpzW29iaktleVN0cl07XG4gICAgICAgICAgICBrZXlQYXRocy5mb3JFYWNoKCh7IHZhbHVlczogdmFscywgcGF0aCB9KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnRpYWxJZE1hdGNoKGlkS2V5cywgcGF0dGVyblZhbHMsIG9iaktleXMsIHZhbHMsIHBhdHRlcm5LZXlzLCByZWZWYWxzLCByZWZQYXR0ZXJuVmFscykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHppcE9iaihvYmpLZXlzLCB2YWxzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG59XG4iLCJpbXBvcnQgeyBjcmVhdGVBY3Rpb24gfSBmcm9tICdyZWR1eC1hY3Rpb25zJztcbmltcG9ydCB7IElzTG9hZGluZ0FjdGlvblR5cGUgfSBmcm9tICcuLi9yZWR1Y2Vycy9pc0xvYWRpbmcnO1xuZXhwb3J0IGNvbnN0IHNldElzTG9hZGluZyA9IGNyZWF0ZUFjdGlvbihJc0xvYWRpbmdBY3Rpb25UeXBlLlNldCk7XG4iLCJpbXBvcnQgeyBjcmVhdGVBY3Rpb24gfSBmcm9tICdyZWR1eC1hY3Rpb25zJztcbmV4cG9ydCBjb25zdCBsb2FkaW5nID0gY3JlYXRlQWN0aW9uKCdMT0FESU5HJyk7XG5leHBvcnQgY29uc3QgbG9hZGVkID0gY3JlYXRlQWN0aW9uKCdMT0FERUQnKTtcbiIsImltcG9ydCB7IGFwcGVuZCwgYXNzb2NQYXRoLCBjb25jYXQsIGRpc3NvY1BhdGgsIGVtcHR5LCBlcXVhbHMsIGhhcywgaW5zZXJ0LCBpcywgcGF0aCwgcHJlcGVuZCwgcmV2ZXJzZSB9IGZyb20gJ3JhbWRhJztcbmltcG9ydCB7IHN0cmluZ2lmeUlkIH0gZnJvbSAnLi9kZXBlbmRlbmNpZXMnO1xuaW1wb3J0IHsgaXNEcnlDb21wb25lbnQgfSBmcm9tICcuLi93cmFwcGVyL3dyYXBwaW5nJztcbmV4cG9ydCBmdW5jdGlvbiBpc1BhdGNoKG9iaikge1xuICAgIHJldHVybiBoYXMoJ19fZGFzaF9wYXRjaF91cGRhdGUnLCBvYmopO1xufVxuZnVuY3Rpb24gZ2V0TG9jYXRpb25JbmRleCh2YWx1ZSwgcHJldmlvdXMpIHtcbiAgICBpZiAoaXMoTnVtYmVyLCB2YWx1ZSkgJiYgdmFsdWUgPCAwKSB7XG4gICAgICAgIHJldHVybiBwcmV2aW91cy5sZW5ndGggKyB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuZnVuY3Rpb24gZ2V0TG9jYXRpb25QYXRoKGxvY2F0aW9uLCBvYmopIHtcbiAgICBjb25zdCBjdXJyZW50ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2NhdGlvbi5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGdldExvY2F0aW9uSW5kZXgobG9jYXRpb25baV0sIHBhdGgoY3VycmVudCwgb2JqKSk7XG4gICAgICAgIGN1cnJlbnQucHVzaCh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBjdXJyZW50O1xufVxuZXhwb3J0IGNsYXNzIFBhdGNoQnVpbGRlciB7XG4gICAgb3BlcmF0aW9ucyA9IFtdO1xuICAgIGFzc2lnbihsb2NhdGlvbiwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5vcGVyYXRpb25zLnB1c2goe1xuICAgICAgICAgICAgb3BlcmF0aW9uOiAnQXNzaWduJyxcbiAgICAgICAgICAgIGxvY2F0aW9uLFxuICAgICAgICAgICAgcGFyYW1zOiB7IHZhbHVlIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBtZXJnZShsb2NhdGlvbiwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5vcGVyYXRpb25zLnB1c2goe1xuICAgICAgICAgICAgb3BlcmF0aW9uOiAnTWVyZ2UnLFxuICAgICAgICAgICAgbG9jYXRpb24sXG4gICAgICAgICAgICBwYXJhbXM6IHsgdmFsdWUgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGV4dGVuZChsb2NhdGlvbiwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5vcGVyYXRpb25zLnB1c2goe1xuICAgICAgICAgICAgb3BlcmF0aW9uOiAnRXh0ZW5kJyxcbiAgICAgICAgICAgIGxvY2F0aW9uLFxuICAgICAgICAgICAgcGFyYW1zOiB7IHZhbHVlIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBkZWxldGUobG9jYXRpb24pIHtcbiAgICAgICAgdGhpcy5vcGVyYXRpb25zLnB1c2goe1xuICAgICAgICAgICAgb3BlcmF0aW9uOiAnRGVsZXRlJyxcbiAgICAgICAgICAgIGxvY2F0aW9uLFxuICAgICAgICAgICAgcGFyYW1zOiB7fVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGluc2VydChsb2NhdGlvbiwgaW5kZXgsIHZhbHVlKSB7XG4gICAgICAgIHRoaXMub3BlcmF0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIG9wZXJhdGlvbjogJ0luc2VydCcsXG4gICAgICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgICAgIHBhcmFtczogeyBpbmRleCwgdmFsdWUgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGFwcGVuZChsb2NhdGlvbiwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5vcGVyYXRpb25zLnB1c2goe1xuICAgICAgICAgICAgb3BlcmF0aW9uOiAnQXBwZW5kJyxcbiAgICAgICAgICAgIGxvY2F0aW9uLFxuICAgICAgICAgICAgcGFyYW1zOiB7IHZhbHVlIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBwcmVwZW5kKGxvY2F0aW9uLCB2YWx1ZSkge1xuICAgICAgICB0aGlzLm9wZXJhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBvcGVyYXRpb246ICdQcmVwZW5kJyxcbiAgICAgICAgICAgIGxvY2F0aW9uLFxuICAgICAgICAgICAgcGFyYW1zOiB7IHZhbHVlIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBhZGQobG9jYXRpb24sIHZhbHVlKSB7XG4gICAgICAgIHRoaXMub3BlcmF0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIG9wZXJhdGlvbjogJ0FkZCcsXG4gICAgICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgICAgIHBhcmFtczogeyB2YWx1ZSB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc3ViKGxvY2F0aW9uLCB2YWx1ZSkge1xuICAgICAgICB0aGlzLm9wZXJhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBvcGVyYXRpb246ICdTdWInLFxuICAgICAgICAgICAgbG9jYXRpb24sXG4gICAgICAgICAgICBwYXJhbXM6IHsgdmFsdWUgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIG11bChsb2NhdGlvbiwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5vcGVyYXRpb25zLnB1c2goe1xuICAgICAgICAgICAgb3BlcmF0aW9uOiAnTXVsJyxcbiAgICAgICAgICAgIGxvY2F0aW9uLFxuICAgICAgICAgICAgcGFyYW1zOiB7IHZhbHVlIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBkaXYobG9jYXRpb24sIHZhbHVlKSB7XG4gICAgICAgIHRoaXMub3BlcmF0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIG9wZXJhdGlvbjogJ0RpdicsXG4gICAgICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgICAgIHBhcmFtczogeyB2YWx1ZSB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgY2xlYXIobG9jYXRpb24pIHtcbiAgICAgICAgdGhpcy5vcGVyYXRpb25zLnB1c2goe1xuICAgICAgICAgICAgb3BlcmF0aW9uOiAnQ2xlYXInLFxuICAgICAgICAgICAgbG9jYXRpb24sXG4gICAgICAgICAgICBwYXJhbXM6IHt9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmV2ZXJzZShsb2NhdGlvbikge1xuICAgICAgICB0aGlzLm9wZXJhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBvcGVyYXRpb246ICdSZXZlcnNlJyxcbiAgICAgICAgICAgIGxvY2F0aW9uLFxuICAgICAgICAgICAgcGFyYW1zOiB7fVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHJlbW92ZShsb2NhdGlvbiwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5vcGVyYXRpb25zLnB1c2goe1xuICAgICAgICAgICAgb3BlcmF0aW9uOiAnUmVtb3ZlJyxcbiAgICAgICAgICAgIGxvY2F0aW9uLFxuICAgICAgICAgICAgcGFyYW1zOiB7IHZhbHVlIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBidWlsZCgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIF9fZGFzaF9wYXRjaF91cGRhdGU6ICdfX2Rhc2hfcGF0Y2hfdXBkYXRlJyxcbiAgICAgICAgICAgIG9wZXJhdGlvbnM6IHRoaXMub3BlcmF0aW9uc1xuICAgICAgICB9O1xuICAgIH1cbn1cbmNvbnN0IHBhdGNoSGFuZGxlcnMgPSB7XG4gICAgQXNzaWduOiAocHJldmlvdXMsIHBhdGNoT3BlcmF0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgcGFyYW1zLCBsb2NhdGlvbiB9ID0gcGF0Y2hPcGVyYXRpb247XG4gICAgICAgIHJldHVybiBhc3NvY1BhdGgobG9jYXRpb24sIHBhcmFtcy52YWx1ZSwgcHJldmlvdXMpO1xuICAgIH0sXG4gICAgTWVyZ2U6IChwcmV2aW91cywgcGF0Y2hPcGVyYXRpb24pID0+IHtcbiAgICAgICAgY29uc3QgcHJldiA9IHBhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIHByZXZpb3VzKTtcbiAgICAgICAgcmV0dXJuIGFzc29jUGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwge1xuICAgICAgICAgICAgLi4ucHJldixcbiAgICAgICAgICAgIC4uLnBhdGNoT3BlcmF0aW9uLnBhcmFtcy52YWx1ZVxuICAgICAgICB9LCBwcmV2aW91cyk7XG4gICAgfSxcbiAgICBFeHRlbmQ6IChwcmV2aW91cywgcGF0Y2hPcGVyYXRpb24pID0+IHtcbiAgICAgICAgY29uc3QgcHJldiA9IHBhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIHByZXZpb3VzKTtcbiAgICAgICAgcmV0dXJuIGFzc29jUGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwgY29uY2F0KHByZXYsIHBhdGNoT3BlcmF0aW9uLnBhcmFtcy52YWx1ZSksIHByZXZpb3VzKTtcbiAgICB9LFxuICAgIERlbGV0ZTogKHByZXZpb3VzLCBwYXRjaE9wZXJhdGlvbikgPT4ge1xuICAgICAgICByZXR1cm4gZGlzc29jUGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwgcHJldmlvdXMpO1xuICAgIH0sXG4gICAgSW5zZXJ0OiAocHJldmlvdXMsIHBhdGNoT3BlcmF0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IHByZXYgPSBwYXRoKHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLCBwcmV2aW91cyk7XG4gICAgICAgIHJldHVybiBhc3NvY1BhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIGluc2VydChnZXRMb2NhdGlvbkluZGV4KHBhdGNoT3BlcmF0aW9uLnBhcmFtcy5pbmRleCwgcHJldiksIHBhdGNoT3BlcmF0aW9uLnBhcmFtcy52YWx1ZSwgcHJldiksIHByZXZpb3VzKTtcbiAgICB9LFxuICAgIEFwcGVuZDogKHByZXZpb3VzLCBwYXRjaE9wZXJhdGlvbikgPT4ge1xuICAgICAgICBjb25zdCBwcmV2ID0gcGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwgcHJldmlvdXMpO1xuICAgICAgICByZXR1cm4gYXNzb2NQYXRoKHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLCBhcHBlbmQocGF0Y2hPcGVyYXRpb24ucGFyYW1zLnZhbHVlLCBwcmV2KSwgcHJldmlvdXMpO1xuICAgIH0sXG4gICAgUHJlcGVuZDogKHByZXZpb3VzLCBwYXRjaE9wZXJhdGlvbikgPT4ge1xuICAgICAgICBjb25zdCBwcmV2ID0gcGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwgcHJldmlvdXMpO1xuICAgICAgICByZXR1cm4gYXNzb2NQYXRoKHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLCBwcmVwZW5kKHBhdGNoT3BlcmF0aW9uLnBhcmFtcy52YWx1ZSwgcHJldiksIHByZXZpb3VzKTtcbiAgICB9LFxuICAgIEFkZDogKHByZXZpb3VzLCBwYXRjaE9wZXJhdGlvbikgPT4ge1xuICAgICAgICBjb25zdCBwcmV2ID0gcGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwgcHJldmlvdXMpO1xuICAgICAgICByZXR1cm4gYXNzb2NQYXRoKHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLCBwcmV2ICsgcGF0Y2hPcGVyYXRpb24ucGFyYW1zLnZhbHVlLCBwcmV2aW91cyk7XG4gICAgfSxcbiAgICBTdWI6IChwcmV2aW91cywgcGF0Y2hPcGVyYXRpb24pID0+IHtcbiAgICAgICAgY29uc3QgcHJldiA9IHBhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIHByZXZpb3VzKTtcbiAgICAgICAgcmV0dXJuIGFzc29jUGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwgcHJldiAtIHBhdGNoT3BlcmF0aW9uLnBhcmFtcy52YWx1ZSwgcHJldmlvdXMpO1xuICAgIH0sXG4gICAgTXVsOiAocHJldmlvdXMsIHBhdGNoT3BlcmF0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IHByZXYgPSBwYXRoKHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLCBwcmV2aW91cyk7XG4gICAgICAgIHJldHVybiBhc3NvY1BhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIHByZXYgKiBwYXRjaE9wZXJhdGlvbi5wYXJhbXMudmFsdWUsIHByZXZpb3VzKTtcbiAgICB9LFxuICAgIERpdjogKHByZXZpb3VzLCBwYXRjaE9wZXJhdGlvbikgPT4ge1xuICAgICAgICBjb25zdCBwcmV2ID0gcGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwgcHJldmlvdXMpO1xuICAgICAgICByZXR1cm4gYXNzb2NQYXRoKHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLCBwcmV2IC8gcGF0Y2hPcGVyYXRpb24ucGFyYW1zLnZhbHVlLCBwcmV2aW91cyk7XG4gICAgfSxcbiAgICBDbGVhcjogKHByZXZpb3VzLCBwYXRjaE9wZXJhdGlvbikgPT4ge1xuICAgICAgICBjb25zdCBwcmV2ID0gcGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwgcHJldmlvdXMpO1xuICAgICAgICByZXR1cm4gYXNzb2NQYXRoKHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLCBlbXB0eShwcmV2KSwgcHJldmlvdXMpO1xuICAgIH0sXG4gICAgUmV2ZXJzZTogKHByZXZpb3VzLCBwYXRjaE9wZXJhdGlvbikgPT4ge1xuICAgICAgICBjb25zdCBwcmV2ID0gcGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwgcHJldmlvdXMpO1xuICAgICAgICByZXR1cm4gYXNzb2NQYXRoKHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLCByZXZlcnNlKHByZXYpLCBwcmV2aW91cyk7XG4gICAgfSxcbiAgICBSZW1vdmU6IChwcmV2aW91cywgcGF0Y2hPcGVyYXRpb24pID0+IHtcbiAgICAgICAgY29uc3QgcHJldiA9IHBhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIHByZXZpb3VzKTtcbiAgICAgICAgcmV0dXJuIGFzc29jUGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwgcHJldi5maWx0ZXIoKGl0ZW0pID0+ICFlcXVhbHMoaXRlbSwgcGF0Y2hPcGVyYXRpb24ucGFyYW1zLnZhbHVlKSksIHByZXZpb3VzKTtcbiAgICB9XG59O1xuLypcbiAqIE9wZXJhdGlvbnMgdGhhdCBwdXQgYSB2YWx1ZSBpbnRvIHRoZSB0cmVlLCB3aGljaCBhZGQvcmVtb3ZlIGlkcyxcbiAqIGFuZCBuZWVkIHRvIGJlIGhhbmRsZWQgZHVyaW5nIGEgcGF0Y2hcbiAqL1xuY29uc3QgaW5zZXJ0aW5nT3BlcmF0aW9ucyA9IHtcbiAgICBBc3NpZ246IHRydWUsXG4gICAgTWVyZ2U6IHRydWUsXG4gICAgRXh0ZW5kOiB0cnVlLFxuICAgIEluc2VydDogdHJ1ZSxcbiAgICBBcHBlbmQ6IHRydWUsXG4gICAgUHJlcGVuZDogdHJ1ZVxufTtcbmZ1bmN0aW9uIGNvbGxlY3RDb21wb25lbnRJZHModmFsdWUsIGZyZXNoSWRzLCB2aXNpdGVkKSB7XG4gICAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IHZpc2l0ZWQuaGFzKHZhbHVlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZpc2l0ZWQuYWRkKHZhbHVlKTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUuZm9yRWFjaChpdGVtID0+IGNvbGxlY3RDb21wb25lbnRJZHMoaXRlbSwgZnJlc2hJZHMsIHZpc2l0ZWQpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaXNEcnlDb21wb25lbnQodmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IHsgaWQgfSA9IHZhbHVlLnByb3BzO1xuICAgICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCAmJiBpZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgZnJlc2hJZHNbc3RyaW5naWZ5SWQoaWQpXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY29sbGVjdENvbXBvbmVudElkcyh2YWx1ZS5wcm9wcywgZnJlc2hJZHMsIHZpc2l0ZWQpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IGluIHZhbHVlKSB7XG4gICAgICAgIGNvbGxlY3RDb21wb25lbnRJZHModmFsdWVba2V5XSwgZnJlc2hJZHMsIHZpc2l0ZWQpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJlY29yZFdyaXR0ZW5Qcm9wKHByZXZpb3VzLCBsb2NhdGlvbiwgd3JpdHRlblByb3BzKSB7XG4gICAgbGV0IGN1cnJlbnQgPSBwcmV2aW91cztcbiAgICBsZXQgaWRTdHIgPSBudWxsO1xuICAgIGxldCBwcm9wZXJ0eSA9IG51bGw7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2NhdGlvbi5sZW5ndGggJiYgY3VycmVudDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGxvY2F0aW9uW2ldO1xuICAgICAgICBpZiAoa2V5ID09PSAncHJvcHMnICYmXG4gICAgICAgICAgICBpICsgMSA8IGxvY2F0aW9uLmxlbmd0aCAmJlxuICAgICAgICAgICAgaXNEcnlDb21wb25lbnQoY3VycmVudCkgJiZcbiAgICAgICAgICAgIGN1cnJlbnQucHJvcHMuaWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgY3VycmVudC5wcm9wcy5pZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWRTdHIgPSBzdHJpbmdpZnlJZChjdXJyZW50LnByb3BzLmlkKTtcbiAgICAgICAgICAgIHByb3BlcnR5ID0gU3RyaW5nKGxvY2F0aW9uW2kgKyAxXSk7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudCA9IGN1cnJlbnRba2V5XTtcbiAgICB9XG4gICAgaWYgKGlkU3RyICE9PSBudWxsICYmIHByb3BlcnR5ICE9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHByb3BzID0gd3JpdHRlblByb3BzW2lkU3RyXSB8fCAod3JpdHRlblByb3BzW2lkU3RyXSA9IHt9KTtcbiAgICAgICAgcHJvcHNbcHJvcGVydHldID0gdHJ1ZTtcbiAgICB9XG59XG4vKlxuICogT3BlcmF0aW9ucyB0aGF0IG9ubHkgYWRkIGl0ZW1zIGF0IHRoZSBlbmQgb2YgYSBsaXN0LCBhbmQgaG93IG1hbnkgaXRlbXNcbiAqIGVhY2ggb25lIGFkZHMuIGBsb2NhdGlvbmAgaXMgdGhlIGxpc3QgdGhleSBhcHBlbmQgdG8uIEFueXRoaW5nIGVsc2UgdGhhdFxuICogdG91Y2hlcyBhIGxpc3QgKEluc2VydCwgUHJlcGVuZCwgRGVsZXRlLCBSZW1vdmUsIENsZWFyLCBSZXZlcnNlLCBBc3NpZ24pXG4gKiBpbnZhbGlkYXRlcyB0aGUgYXBwZW5kLW9ubHkgc2hvcnRjdXQgZm9yIHRoYXQgcHJvcGVydHksIHNpbmNlIG9sZCBpdGVtcyBjYW5cbiAqIG5vIGxvbmdlciBiZSBhc3N1bWVkIHRvIGhhdmUga2VwdCB0aGVpciBpbmRpY2VzLlxuICovXG5jb25zdCB0YWlsQXBwZW5kQ291bnRzID0ge1xuICAgIEFwcGVuZDogKCkgPT4gMSxcbiAgICBFeHRlbmQ6IHBhcmFtcyA9PiAoQXJyYXkuaXNBcnJheShwYXJhbXMudmFsdWUpID8gcGFyYW1zLnZhbHVlLmxlbmd0aCA6IDApXG59O1xuZnVuY3Rpb24gcmVjb3JkVGFpbEFwcGVuZChwcm9wZXJ0eSwgbG9jYXRpb24sIG9wZXJhdGlvbiwgcGFyYW1zLCBhbmFseXNpcykge1xuICAgIGlmIChwcm9wZXJ0eSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZXhpc3RpbmcgPSBhbmFseXNpcy50YWlsQXBwZW5kc1twcm9wZXJ0eV07XG4gICAgaWYgKGV4aXN0aW5nID09PSBmYWxzZSkge1xuICAgICAgICAvLyBBbHJlYWR5IGludmFsaWRhdGVkIGZvciB0aGlzIHByb3BlcnR5OyBub3RoaW5nIGNhbiB1bmRvIHRoYXQuXG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG9wZXJhdGlvbiBpbiB0YWlsQXBwZW5kQ291bnRzKSB7XG4gICAgICAgIGNvbnN0IGNvdW50ID0gdGFpbEFwcGVuZENvdW50c1tvcGVyYXRpb25dKHBhcmFtcyk7XG4gICAgICAgIGlmIChleGlzdGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBGaXJzdCBhcHBlbmQgdG8gdGhpcyBwcm9wZXJ0eTogcmVtZW1iZXIgd2hpY2ggbGlzdCBpdCBncmV3LlxuICAgICAgICAgICAgYW5hbHlzaXMudGFpbEFwcGVuZHNbcHJvcGVydHldID0geyBsb2NhdGlvbiwgY291bnQgfTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXF1YWxzKGV4aXN0aW5nLmxvY2F0aW9uLCBsb2NhdGlvbikpIHtcbiAgICAgICAgICAgIC8vIEFub3RoZXIgYXBwZW5kIHRvIHRoZSBzYW1lIGxpc3QgLSBzdGlsbCBhIHB1cmUgc2luZ2xlLWxpc3RcbiAgICAgICAgICAgIC8vIGFwcGVuZCwganVzdCBtb3JlIGl0ZW1zLlxuICAgICAgICAgICAgZXhpc3RpbmcuY291bnQgKz0gY291bnQ7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gQXBwZW5kZWQgdG8gYSBzZWNvbmQsIGRpZmZlcmVudCBsaXN0LiBXZSBjYW4gb25seSBleHByZXNzIG9uZVxuICAgICAgICAvLyBncm93biBsaXN0IHBlciBwcm9wZXJ0eSwgc28gZmFsbCBiYWNrIHRvIGEgZnVsbCByZWNvbXB1dGUuXG4gICAgfVxuICAgIGFuYWx5c2lzLnRhaWxBcHBlbmRzW3Byb3BlcnR5XSA9IGZhbHNlO1xufVxuZnVuY3Rpb24gcmVjb3JkUGF0Y2hPcGVyYXRpb24ocHJldmlvdXMsIHBhdGNoT3BlcmF0aW9uLCBhbmFseXNpcywgcHJvcGVydHkpIHtcbiAgICBjb25zdCB7IG9wZXJhdGlvbiwgbG9jYXRpb24sIHBhcmFtcyB9ID0gcGF0Y2hPcGVyYXRpb247XG4gICAgaWYgKGluc2VydGluZ09wZXJhdGlvbnNbb3BlcmF0aW9uXSkge1xuICAgICAgICBjb2xsZWN0Q29tcG9uZW50SWRzKHBhcmFtcy52YWx1ZSwgYW5hbHlzaXMuZnJlc2hJZHMsIG5ldyBTZXQoKSk7XG4gICAgfVxuICAgIHJlY29yZFRhaWxBcHBlbmQocHJvcGVydHksIGxvY2F0aW9uLCBvcGVyYXRpb24sIHBhcmFtcywgYW5hbHlzaXMpO1xuICAgIGlmIChvcGVyYXRpb24gPT09ICdNZXJnZScgJiYgcGFyYW1zLnZhbHVlICYmIGlzKE9iamVjdCwgcGFyYW1zLnZhbHVlKSkge1xuICAgICAgICBPYmplY3Qua2V5cyhwYXJhbXMudmFsdWUpLmZvckVhY2goa2V5ID0+IHJlY29yZFdyaXR0ZW5Qcm9wKHByZXZpb3VzLCBsb2NhdGlvbi5jb25jYXQoa2V5KSwgYW5hbHlzaXMud3JpdHRlblByb3BzKSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmVjb3JkV3JpdHRlblByb3AocHJldmlvdXMsIGxvY2F0aW9uLCBhbmFseXNpcy53cml0dGVuUHJvcHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZVBhdGNoKHByZXZpb3VzVmFsdWUsIHBhdGNoVmFsdWUsIGFuYWx5c2lzLCBwcm9wZXJ0eSkge1xuICAgIGxldCByZWR1Y2VkVmFsdWUgPSBwcmV2aW91c1ZhbHVlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0Y2hWYWx1ZS5vcGVyYXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHBhdGNoID0gcGF0Y2hWYWx1ZS5vcGVyYXRpb25zW2ldO1xuICAgICAgICBwYXRjaC5sb2NhdGlvbiA9IGdldExvY2F0aW9uUGF0aChwYXRjaC5sb2NhdGlvbiwgcmVkdWNlZFZhbHVlKTtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IHBhdGNoSGFuZGxlcnNbcGF0Y2gub3BlcmF0aW9uXTtcbiAgICAgICAgaWYgKCFoYW5kbGVyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgT3BlcmF0aW9uICR7cGF0Y2gub3BlcmF0aW9ufWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhbmFseXNpcykge1xuICAgICAgICAgICAgcmVjb3JkUGF0Y2hPcGVyYXRpb24ocmVkdWNlZFZhbHVlLCBwYXRjaCwgYW5hbHlzaXMsIHByb3BlcnR5KTtcbiAgICAgICAgfVxuICAgICAgICByZWR1Y2VkVmFsdWUgPSBoYW5kbGVyKHJlZHVjZWRWYWx1ZSwgcGF0Y2gpO1xuICAgIH1cbiAgICByZXR1cm4gcmVkdWNlZFZhbHVlO1xufVxuLypcbiAqIGBhbmFseXNpc2AsIHdoZW4gcHJvdmlkZWQsIGlzIGZpbGxlZCBpbiB3aXRoIHdoYXQgdGhlIHBhdGNoZXMgZGlkLlxuICogUHJvcHMgdGhhdCBhcmUgbm90IHBhdGNoZXMgYXJlIGxlZnQgb3V0IG9mIGl0LCBzbyBjYWxsZXJzXG4gKiBjYW4gdGVsbCBhIHBhdGNoZWQgcHJvcCBmcm9tIGEgZnVsbHkgcmVwbGFjZWQgb25lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVBhdGNoUHJvcHMocHJvcHMsIHByZXZpb3VzUHJvcHMsIGFuYWx5c2lzKSB7XG4gICAgaWYgKCFpcyhPYmplY3QsIHByb3BzKSkge1xuICAgICAgICByZXR1cm4gcHJvcHM7XG4gICAgfVxuICAgIGNvbnN0IHBhdGNoZWRQcm9wcyA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHByb3BzKSkge1xuICAgICAgICBjb25zdCB2YWwgPSBwcm9wc1trZXldO1xuICAgICAgICBpZiAoaXNQYXRjaCh2YWwpKSB7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gcHJldmlvdXNQcm9wc1trZXldO1xuICAgICAgICAgICAgaWYgKHByZXZpb3VzVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHBhdGNoIHVuZGVmaW5lZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFuYWx5c2lzKSB7XG4gICAgICAgICAgICAgICAgYW5hbHlzaXMucGF0Y2hlZFByb3BzW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGF0Y2hlZFByb3BzW2tleV0gPSBoYW5kbGVQYXRjaChwcmV2aW91c1ZhbHVlLCB2YWwsIGFuYWx5c2lzLCBrZXkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcGF0Y2hlZFByb3BzW2tleV0gPSB2YWw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBhdGNoZWRQcm9wcztcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQYXRjaEFuYWx5c2lzKCkge1xuICAgIHJldHVybiB7IHBhdGNoZWRQcm9wczoge30sIGZyZXNoSWRzOiB7fSwgd3JpdHRlblByb3BzOiB7fSwgdGFpbEFwcGVuZHM6IHt9IH07XG59XG4vKlxuICogVGhlIGFuYWx5c2lzLCBidXQgb25seSBpZiBgcHJvcGVydHlgIGlzIG9uZSBvZiB0aGUgcHJvcHMgaXQgZGVzY3JpYmVzLlxuICogQSBjYWxsYmFjayBjYW4gcmV0dXJuIGEgUGF0Y2ggZm9yIG9uZSBwcm9wIGFuZCBhIGZ1bGwgdmFsdWUgZm9yIGFub3RoZXIsIGFuZFxuICogYSBmdWxsIHZhbHVlIGlzIGEgZnJlc2ggc3ViLXRyZWUgaW4gd2hpY2ggbm90aGluZyB3YXMgY2FycmllZCBvdmVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbmFseXNpc0ZvclByb3AoYW5hbHlzaXMsIHByb3BlcnR5KSB7XG4gICAgcmV0dXJuIGFuYWx5c2lzPy5wYXRjaGVkUHJvcHNbcHJvcGVydHldID8gYW5hbHlzaXMgOiB1bmRlZmluZWQ7XG59XG4vKlxuICogRm9yIGNvbnN1bWVycyB0aGF0IGxvb2sgYXQgc2V2ZXJhbCBwcm9wcyBvZiBhbiBvdXRwdXQgYXQgb25jZSwgdGhlXG4gKiBhbmFseXNpcyBvbmx5IGFwcGxpZXMgaWYgZXZlcnkgb25lIG9mIHRoZW0gY2FtZSBmcm9tIGEgUGF0Y2hcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFuYWx5c2lzRm9yQWxsUHJvcHMoYW5hbHlzaXMsIHByb3BlcnRpZXMpIHtcbiAgICByZXR1cm4gYW5hbHlzaXMgJiZcbiAgICAgICAgcHJvcGVydGllcy5sZW5ndGggJiZcbiAgICAgICAgcHJvcGVydGllcy5ldmVyeShwcm9wZXJ0eSA9PiBhbmFseXNpcy5wYXRjaGVkUHJvcHNbcHJvcGVydHldKVxuICAgICAgICA/IGFuYWx5c2lzXG4gICAgICAgIDogdW5kZWZpbmVkO1xufVxuLypcbiAqIFdhcyB0aGlzIGNvbXBvbmVudCBhbHJlYWR5IGluIHRoZSBsYXlvdXQgYmVmb3JlIHRoZSBwYXRjaD9cbiAqIFdpdGhvdXQgYW4gYW5hbHlzaXMgdGhlIGNodW5rIGRpZCBub3QgY29tZSBmcm9tIGEgcGF0Y2gsIHNvXG4gKiBub3RoaW5nIHdhcyBjYXJyaWVkIG92ZXIsIHNvIGV2ZXJ5IGNvbXBvbmVudCBpcyBuZXdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ2FycmllZE92ZXJCeVBhdGNoKGFuYWx5c2lzLCBpZFN0cikge1xuICAgIGlmICghYW5hbHlzaXMgfHwgIWlkU3RyKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuICFhbmFseXNpcy5mcmVzaElkc1tpZFN0cl07XG59XG4vKlxuICogU3RyaWN0ZXIgdmVyc2lvbiBvZiBgaXNDYXJyaWVkT3ZlckJ5UGF0Y2hgIGZvciBwZXJzaXN0ZW5jZSB3aGVyZSBhIGNvbXBvbmVudFxuICogd2FzIGtlcHQgYW5kIHRoZSBwYXRjaCBkaWQgbm90IHdyaXRlIGFueSBwcm9wIG9uLiBUaGVzZSBjb21wb25lbnRzIHN0aWxsIGhvbGRcbiAqIHVzZXIgZWRpdHMgaW4gUmVkdXgsIHNvIHBlcnNpc3RlbmNlIG11c3QgbGVhdmUgaXQgYWxvbmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVW50b3VjaGVkQnlQYXRjaChhbmFseXNpcywgaWRTdHIpIHtcbiAgICBpZiAoIWFuYWx5c2lzIHx8ICFpZFN0cikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiAhYW5hbHlzaXMuZnJlc2hJZHNbaWRTdHJdICYmICFhbmFseXNpcy53cml0dGVuUHJvcHNbaWRTdHJdO1xufVxuLypcbiAqIERpZCB0aGUgcGF0Y2ggd3JpdGUgZGlyZWN0bHkgb24gdGhpcyBwcm9wIG9mIGEgY29tcG9uZW50IGl0IGRpZCBub3RcbiAqIHJlY3JlYXRlPyBUaGlzIGNhbiBiZSB0cnVlIGZvciBhIGNvbXBvbmVudCB3aG9zZSBvd24gaW5pdGlhbCBjYWxsIHN0YXlzXG4gKiBzdXBwcmVzc2VkIGJ5IGBpc0NhcnJpZWRPdmVyQnlQYXRjaGAsIGl0J3Mgbm90IGZyZXNoLCBldmVuIHRob3VnaCBvbmUgb2ZcbiAqIGl0cyBwcm9wcyBjaGFuZ2VkLCBjYWxsYmFja3MgdGhhdCBkZXBlbmQgb24gdGhhdCBwcm9wIGFzIGFuIElucHV0XG4gKiBzdGlsbCBuZWVkIHRvIHJ1blxuICovXG5leHBvcnQgZnVuY3Rpb24gd2FzV3JpdHRlbkJ5UGF0Y2goYW5hbHlzaXMsIGlkU3RyLCBwcm9wZXJ0eSkge1xuICAgIGlmICghYW5hbHlzaXMgfHwgIWlkU3RyKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIEJvb2xlYW4oYW5hbHlzaXMud3JpdHRlblByb3BzW2lkU3RyXT8uW3Byb3BlcnR5XSk7XG59XG4vKlxuICogV2hlcmUgYW5kIGhvdyBtdWNoIHRoaXMgcGF0Y2ggYXBwZW5kZWQsIGlmIGFwcGVuZGluZyB0byBvbmUgc2luZ2xlIGxpc3RcbiAqIChwb3NzaWJseSBuZXN0ZWQpIGlzICphbGwqIGl0IGRpZCB0byBgcHJvcGVydHlgIC0gd2hhdCBwYXRocy5qcyBuZWVkcyB0b1xuICogY29tcHV0ZSBwYXRocyBmb3Igb25seSB0aGUgbmV3IGl0ZW1zIGluc3RlYWQgb2YgcmUtY3Jhd2xpbmcgZXZlcnlcbiAqIHByZS1leGlzdGluZyBvbmUuIGBudWxsYCB3aGVuIHRoZSBhbmFseXNpcyBkb2Vzbid0IGNvdmVyIHRoaXMgcHJvcGVydHksIG9yXG4gKiB3aGVuIHRoZSBwYXRjaCB0b3VjaGVkIGEgbGlzdCBpbiBzb21lIG90aGVyIHdheSAoc2VlIGB0YWlsQXBwZW5kc2ApLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdGFpbEFwcGVuZChhbmFseXNpcywgcHJvcGVydHkpIHtcbiAgICBjb25zdCBlbnRyeSA9IGFuYWx5c2lzPy50YWlsQXBwZW5kc1twcm9wZXJ0eV07XG4gICAgcmV0dXJuIGVudHJ5ICYmIHR5cGVvZiBlbnRyeSA9PT0gJ29iamVjdCcgPyBlbnRyeSA6IG51bGw7XG59XG4vKlxuICogSG93IG1hbnkgaXRlbXMgYHRhaWxBcHBlbmRgIHJlcG9ydHMgZm9yIGBwcm9wZXJ0eWAgKDAgd2hlbiBpdCByZXBvcnRzIG5vbmUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdGFpbEFwcGVuZENvdW50KGFuYWx5c2lzLCBwcm9wZXJ0eSkge1xuICAgIHJldHVybiB0YWlsQXBwZW5kKGFuYWx5c2lzLCBwcm9wZXJ0eSk/LmNvdW50ID8/IDA7XG59XG4iLCJpbXBvcnQgeyBrZXlzLCBlcXVhbHMsIGRpc3NvYywgdG9QYWlycyB9IGZyb20gJ3JhbWRhJztcbi8qKlxuICogRGVzZXJpYWxpemUgcGF0dGVybiBtYXRjaGluZyBpZHMgdGhhdCBjb21lIGluIG9uZSBvZiB0aGUgZm9ybTpcbiAqIC0gJ3tcInR5cGVcIjpcImNvbXBvbmVudFwiLFwiaW5kZXhcIjpbXCJNQVRDSFwiXX0uY2hpbGRyZW4nXG4gKiAtICd7XCJ0eXBlXCI6XCJjb21wb25lbnRcIixcImluZGV4XCI6W1wiTUFUQ0hcIl19J1xuICpcbiAqIEBwYXJhbSBpZCBUaGUgcmF3IG9iamVjdCBhcyBhIHN0cmluZyBpZC5cbiAqIEByZXR1cm5zIFRoZSBpZCBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVBNQ0lkKGlkKSB7XG4gICAgbGV0IGNvbXBvbmVudElkLCBwcm9wTmFtZTtcbiAgICBjb25zdCBpbmRleCA9IGlkLmxhc3RJbmRleE9mKCd9Jyk7XG4gICAgaWYgKGluZGV4ICsgMiA8IGlkLmxlbmd0aCkge1xuICAgICAgICBwcm9wTmFtZSA9IGlkLnN1YnN0cmluZyhpbmRleCArIDIpO1xuICAgICAgICBjb21wb25lbnRJZCA9IEpTT04ucGFyc2UoaWQuc3Vic3RyaW5nKDAsIGluZGV4ICsgMSkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29tcG9uZW50SWQgPSBKU09OLnBhcnNlKGlkKTtcbiAgICB9XG4gICAgcmV0dXJuIFtjb21wb25lbnRJZCwgcHJvcE5hbWVdO1xufVxuLyoqXG4gKiBHZXQgYWxsIHRoZSBhc3NvY2lhdGVkIGlkcyBmb3IgYW4gaWQuXG4gKlxuICogQHBhcmFtIGlkIElkIHRvIGdldCBhbGwgdGhlIHBtYyBpZHMgZnJvbS5cbiAqIEBwYXJhbSBzdGF0ZSBTdGF0ZSBvZiB0aGUgc3RvcmUuXG4gKiBAcGFyYW0gdHJpZ2dlcktleSBLZXkgdG8gcmVtb3ZlIGZyb20gdGhlIGVxdWFsaXR5IGNvbXBhcmlzb24uXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWxsUE1DSWRzKGlkLCBzdGF0ZSwgdHJpZ2dlcktleSkge1xuICAgIGNvbnN0IGtleXNPZklkcyA9IGtleXMoaWQpO1xuICAgIGNvbnN0IGlkS2V5ID0ga2V5c09mSWRzLmpvaW4oJywnKTtcbiAgICByZXR1cm4gc3RhdGUucGF0aHMub2Jqc1tpZEtleV1cbiAgICAgICAgLm1hcCgob2JqKSA9PiBrZXlzT2ZJZHMucmVkdWNlKChhY2MsIGtleSwgaSkgPT4ge1xuICAgICAgICBhY2Nba2V5XSA9IG9iai52YWx1ZXNbaV07XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30pKVxuICAgICAgICAuZmlsdGVyKChvYmopID0+IGVxdWFscyhkaXNzb2ModHJpZ2dlcktleSwgb2JqKSwgZGlzc29jKHRyaWdnZXJLZXksIGlkKSkpO1xufVxuLyoqXG4gKiBSZXBsYWNlIHRoZSBwYXR0ZXJuIG1hdGNoaW5nIGlkcyB3aXRoIHRoZSBhY3R1YWwgdHJpZ2dlciB2YWx1ZVxuICogZm9yIE1BVENILCBhbGwgdGhlIGlkcyBmb3IgQUxMIGFuZCBzbWFsbGVyIHRoYW4gdGhlIHRyaWdnZXIgdmFsdWVcbiAqIGZvciBBTExTTUFMTEVSLlxuICpcbiAqIEBwYXJhbSBpZCBUaGUgcGFyc2VkIGlkIGluIGRpY3Rpb25hcnkgZm9ybWF0LlxuICogQHBhcmFtIGNiIE9yaWdpbmFsIGNhbGxiYWNrIGluZm8uXG4gKiBAcGFyYW0gaW5kZXggSW5kZXggb2YgdGhlIGRlcGVuZGVuY3kgaW4gY2FzZSB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIGNoYW5nZWQgaWQuXG4gKiBAcGFyYW0gZ2V0U3RhdGUgRnVuY3Rpb24gdG8gZ2V0IHRoZSBzdGF0ZSBvZiB0aGUgcmVkdXggc3RvcmUuXG4gKiBAcmV0dXJucyBMaXN0IG9mIHJlcGxhY2VkIGlkcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcGxhY2VQTUMoaWQsIGNiLCBpbmRleCwgZ2V0U3RhdGUpIHtcbiAgICBsZXQgZXh0cmFzID0gW107XG4gICAgY29uc3QgcmVwbGFjZWQgPSB7fTtcbiAgICB0b1BhaXJzKGlkKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgaWYgKGV4dHJhcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIEFsbCBkb25lLlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgY29uc3QgdHJpZ2dlclZhbHVlID0gKGNiLnBhcnNlZENoYW5nZWRQcm9wc0lkc1tpbmRleF0gfHxcbiAgICAgICAgICAgICAgICBjYi5wYXJzZWRDaGFuZ2VkUHJvcHNJZHNbMF0pW2tleV07XG4gICAgICAgICAgICBpZiAodmFsdWUuaW5jbHVkZXMoJ01BVENIJykpIHtcbiAgICAgICAgICAgICAgICByZXBsYWNlZFtrZXldID0gdHJpZ2dlclZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUuaW5jbHVkZXMoJ0FMTCcpKSB7XG4gICAgICAgICAgICAgICAgZXh0cmFzID0gZ2V0QWxsUE1DSWRzKGlkLCBnZXRTdGF0ZSgpLCBrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUuaW5jbHVkZXMoJ0FMTFNNQUxMRVInKSkge1xuICAgICAgICAgICAgICAgIGV4dHJhcyA9IGdldEFsbFBNQ0lkcyhpZCwgZ2V0U3RhdGUoKSwga2V5KS5maWx0ZXIoKG9iaikgPT4gb2JqW2tleV0gPCB0cmlnZ2VyVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVwbGFjZWRba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgaWYgKGV4dHJhcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGV4dHJhcztcbiAgICB9XG4gICAgcmV0dXJuIFtyZXBsYWNlZF07XG59XG4iLCJpbXBvcnQgeyBiYXRjaCB9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCB7IHNldEdyYXBocyB9IGZyb20gJy4vaW5kZXgnO1xuaW1wb3J0IGFwaVRodW5rIGZyb20gJy4vYXBpJztcbmV4cG9ydCBmdW5jdGlvbiByZXF1ZXN0RGVwZW5kZW5jaWVzKCkge1xuICAgIHJldHVybiAoZGlzcGF0Y2gsIGdldFN0YXRlKSA9PiB7XG4gICAgICAgIGJhdGNoKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgZ3JhcGhzIH0gPSBnZXRTdGF0ZSgpO1xuICAgICAgICAgICAgZGlzcGF0Y2goc2V0R3JhcGhzKHsgLi4uZ3JhcGhzLCByZXNldDogdHJ1ZSB9KSk7XG4gICAgICAgICAgICBkaXNwYXRjaChhcGlUaHVuaygnX2Rhc2gtZGVwZW5kZW5jaWVzJywgJ0dFVCcsICdkZXBlbmRlbmNpZXNSZXF1ZXN0JykpO1xuICAgICAgICB9KTtcbiAgICB9O1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Q29uZmlnRnJvbURPTSgpIHtcbiAgICBjb25zdCBjb25maWdFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ19kYXNoLWNvbmZpZycpO1xuICAgIHJldHVybiBKU09OLnBhcnNlKGNvbmZpZ0VsZW1lbnQ/LnRleHRDb250ZW50ID8gY29uZmlnRWxlbWVudD8udGV4dENvbnRlbnQgOiAne30nKTtcbn1cbiIsImltcG9ydCB7IHBhdGggfSBmcm9tICdyYW1kYSc7XG5pbXBvcnQgeyBEYXNoQ29udGV4dCwgdXNlRGFzaENvbnRleHQgfSBmcm9tICcuL3dyYXBwZXIvRGFzaENvbnRleHQnO1xuaW1wb3J0IHsgZ2V0UGF0aCB9IGZyb20gJy4vYWN0aW9ucy9wYXRocyc7XG5pbXBvcnQgeyBnZXRTdG9yZXMgfSBmcm9tICcuL3V0aWxzL3N0b3Jlcyc7XG5pbXBvcnQgRXh0ZXJuYWxXcmFwcGVyIGZyb20gJy4vd3JhcHBlci9FeHRlcm5hbFdyYXBwZXInO1xuaW1wb3J0IHsgc3RyaW5naWZ5SWQgfSBmcm9tICcuL2FjdGlvbnMvZGVwZW5kZW5jaWVzJztcbmltcG9ydCB7IERldnRvb2xDb250ZXh0LCB1c2VEZXZ0b29sLCB1c2VEZXZ0b29sTWVudUJ1dHRvbkNsYXNzTmFtZSB9IGZyb20gJy4vY29tcG9uZW50cy9lcnJvci9tZW51L0RldnRvb2xDb250ZXh0Jztcbi8qKlxuICogR2V0IHRoZSBkYXNoIHByb3BzIGZyb20gYSBjb21wb25lbnQgcGF0aCBvciBpZC5cbiAqXG4gKiBAcGFyYW0gY29tcG9uZW50UGF0aE9ySWQgVGhlIHBhdGggb3IgdGhlIGlkIG9mIHRoZSBjb21wb25lbnQgdG8gZ2V0IHRoZSBwcm9wcyBvZi5cbiAqIEBwYXJhbSBwcm9wUGF0aCBBZGRpdGlvbmFsIGtleSB0byBnZXQgdGhlIHByb3BlcnR5IGluc3RlYWQgb2YgcGxhaW4gcHJvcHMuXG4gKiBAcmV0dXJuc1xuICovXG5mdW5jdGlvbiBnZXRMYXlvdXQoY29tcG9uZW50UGF0aE9ySWQpIHtcbiAgICBjb25zdCBkcyA9IGdldFN0b3JlcygpO1xuICAgIGZvciAobGV0IHkgPSAwOyB5IDwgZHMubGVuZ3RoOyB5KyspIHtcbiAgICAgICAgY29uc3QgeyBwYXRocywgbGF5b3V0IH0gPSBkc1t5XS5nZXRTdGF0ZSgpO1xuICAgICAgICBsZXQgY29tcG9uZW50UGF0aDtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbXBvbmVudFBhdGhPcklkKSkge1xuICAgICAgICAgICAgY29tcG9uZW50UGF0aCA9IGdldFBhdGgocGF0aHMsIGNvbXBvbmVudFBhdGhPcklkKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbXBvbmVudFBhdGggPSBjb21wb25lbnRQYXRoT3JJZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm9wcyA9IHBhdGgoY29tcG9uZW50UGF0aCwgbGF5b3V0KTtcbiAgICAgICAgaWYgKHByb3BzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9wcztcbiAgICAgICAgfVxuICAgIH1cbn1cbndpbmRvdy5kYXNoX2NvbXBvbmVudF9hcGkgPSBPYmplY3QuYXNzaWduKHdpbmRvdy5kYXNoX2NvbXBvbmVudF9hcGkgfHwge30sIHtcbiAgICBFeHRlcm5hbFdyYXBwZXIsXG4gICAgRGFzaENvbnRleHQsXG4gICAgdXNlRGFzaENvbnRleHQsXG4gICAgZ2V0TGF5b3V0LFxuICAgIHN0cmluZ2lmeUlkLFxuICAgIGRldnRvb2w6IHtcbiAgICAgICAgRGV2dG9vbENvbnRleHQsXG4gICAgICAgIHVzZURldnRvb2wsXG4gICAgICAgIHVzZURldnRvb2xNZW51QnV0dG9uQ2xhc3NOYW1lXG4gICAgfVxufSk7XG4iLCJjb25zdCB1cGRhdGVUaXRsZSA9IChnZXRTdGF0ZSkgPT4ge1xuICAgIGNvbnN0IHsgY29uZmlnLCBpc0xvYWRpbmcgfSA9IGdldFN0YXRlKCk7XG4gICAgY29uc3QgdXBkYXRlX3RpdGxlID0gY29uZmlnPy51cGRhdGVfdGl0bGU7XG4gICAgaWYgKCF1cGRhdGVfdGl0bGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaXNMb2FkaW5nKSB7XG4gICAgICAgIGlmIChkb2N1bWVudC50aXRsZSAhPT0gdXBkYXRlX3RpdGxlKSB7XG4gICAgICAgICAgICBvYnNlcnZlci50aXRsZSA9IGRvY3VtZW50LnRpdGxlO1xuICAgICAgICAgICAgZG9jdW1lbnQudGl0bGUgPSB1cGRhdGVfdGl0bGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmIChkb2N1bWVudC50aXRsZSA9PT0gdXBkYXRlX3RpdGxlKSB7XG4gICAgICAgICAgICBkb2N1bWVudC50aXRsZSA9IG9ic2VydmVyLnRpdGxlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb2JzZXJ2ZXIudGl0bGUgPSBkb2N1bWVudC50aXRsZTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5jb25zdCBvYnNlcnZlciA9IHtcbiAgICBpbnB1dHM6IFsnaXNMb2FkaW5nJ10sXG4gICAgbXV0YXRpb25PYnNlcnZlcjogdW5kZWZpbmVkLFxuICAgIG9ic2VydmVyOiAoeyBnZXRTdGF0ZSB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgY29uZmlnIH0gPSBnZXRTdGF0ZSgpO1xuICAgICAgICBpZiAob2JzZXJ2ZXIuY29uZmlnICE9PSBjb25maWcpIHtcbiAgICAgICAgICAgIG9ic2VydmVyLmNvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgICAgIG9ic2VydmVyLm11dGF0aW9uT2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICAgIG9ic2VydmVyLm11dGF0aW9uT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB1cGRhdGVUaXRsZShnZXRTdGF0ZSkpO1xuICAgICAgICAgICAgY29uc3QgdGl0bGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCd0aXRsZScpO1xuICAgICAgICAgICAgaWYgKHRpdGxlKSB7XG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIubXV0YXRpb25PYnNlcnZlci5vYnNlcnZlKHRpdGxlLCB7XG4gICAgICAgICAgICAgICAgICAgIHN1YnRyZWU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkTGlzdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlczogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyRGF0YTogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZVRpdGxlKGdldFN0YXRlKTtcbiAgICB9XG59O1xuZXhwb3J0IGRlZmF1bHQgb2JzZXJ2ZXI7XG4iLCJpbXBvcnQgeyBjb25jYXQsIGZsYXR0ZW4sIGlzRW1wdHksIGlzTmlsLCBtYXAsIHBhdGgsIGtleXMsIHBpY2tCeSwgdG9QYWlycywgcGF0aE9yIH0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IHsgYWdncmVnYXRlQ2FsbGJhY2tzLCBhZGRSZXF1ZXN0ZWRDYWxsYmFja3MsIHJlbW92ZUV4ZWN1dGVkQ2FsbGJhY2tzLCBhZGRDb21wbGV0ZWRDYWxsYmFja3MsIGFkZFN0b3JlZENhbGxiYWNrcyB9IGZyb20gJy4uL2FjdGlvbnMvY2FsbGJhY2tzJztcbmltcG9ydCB7IHBhcnNlSWZXaWxkY2FyZCB9IGZyb20gJy4uL2FjdGlvbnMvZGVwZW5kZW5jaWVzJztcbmltcG9ydCB7IGNvbWJpbmVJZEFuZFByb3AsIGdldENhbGxiYWNrc0J5SW5wdXQsIGdldExheW91dENhbGxiYWNrcywgaW5jbHVkZU9ic2VydmVycyB9IGZyb20gJy4uL2FjdGlvbnMvZGVwZW5kZW5jaWVzX3RzJztcbmltcG9ydCB7IHVwZGF0ZVByb3BzLCBzZXRQYXRocywgaGFuZGxlQXN5bmNFcnJvciB9IGZyb20gJy4uL2FjdGlvbnMnO1xuaW1wb3J0IHsgZ2V0UGF0aCwgY29tcHV0ZVBhdGhzLCBhcHBlbmRQYXRocyB9IGZyb20gJy4uL2FjdGlvbnMvcGF0aHMnO1xuaW1wb3J0IHsgYW5hbHlzaXNGb3JBbGxQcm9wcywgYW5hbHlzaXNGb3JQcm9wLCB0YWlsQXBwZW5kIH0gZnJvbSAnLi4vYWN0aW9ucy9wYXRjaEFuYWx5c2lzJztcbmltcG9ydCB7IGFwcGx5UGVyc2lzdGVuY2UsIHBydW5lUGVyc2lzdGVuY2UgfSBmcm9tICcuLi9wZXJzaXN0ZW5jZSc7XG5jb25zdCBvYnNlcnZlciA9IHtcbiAgICBvYnNlcnZlcjogKHsgZGlzcGF0Y2gsIGdldFN0YXRlIH0pID0+IHtcbiAgICAgICAgY29uc3QgeyBjYWxsYmFja3M6IHsgZXhlY3V0ZWQgfSB9ID0gZ2V0U3RhdGUoKTtcbiAgICAgICAgZnVuY3Rpb24gYXBwbHlQcm9wcyhpZCwgdXBkYXRlZFByb3BzLCBwYXRjaEFuYWx5c2lzKSB7XG4gICAgICAgICAgICBjb25zdCB7IGxheW91dCwgcGF0aHMgfSA9IGdldFN0YXRlKCk7XG4gICAgICAgICAgICBjb25zdCBpdGVtcGF0aCA9IGdldFBhdGgocGF0aHMsIGlkKTtcbiAgICAgICAgICAgIGlmICghaXRlbXBhdGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUaGlzIGlzIGEgY2FsbGJhY2stZ2VuZXJhdGVkIHVwZGF0ZS5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgaW52YWxpZGF0ZXMgZXhpc3RpbmcgcGVyc2lzdGVkIHByb3AgdmFsdWVzLFxuICAgICAgICAgICAgLy8gb3IgaWYgcGVyc2lzdGVuY2UgY2hhbmdlZCwgd2hldGhlciB0aGlzIHVwZGF0ZXMgb3RoZXIgcHJvcHMuXG4gICAgICAgICAgICB1cGRhdGVkUHJvcHMgPSBwcnVuZVBlcnNpc3RlbmNlKHBhdGgoaXRlbXBhdGgsIGxheW91dCksIHVwZGF0ZWRQcm9wcywgZGlzcGF0Y2gpO1xuICAgICAgICAgICAgLy8gSW4gY2FzZSB0aGUgdXBkYXRlIGNvbnRhaW5zIHdob2xlIGNvbXBvbmVudHMsIHNlZSBpZiBhbnkgb2ZcbiAgICAgICAgICAgIC8vIHRob3NlIGNvbXBvbmVudHMgaGF2ZSBwcm9wcyB0byB1cGRhdGUgdG8gcGVyc2lzdCB1c2VyIGVkaXRzLlxuICAgICAgICAgICAgLy8gQSBQYXRjaCByZXNvbHZlcyBieSBjYXJyeWluZyBwcmUtZXhpc3RpbmcgY2hpbGRyZW4gb3ZlciBmcm9tXG4gICAgICAgICAgICAvLyBSZWR1eCwgdXNlciBlZGl0cyBpbmNsdWRlZCwgc28gYXBwbHlQZXJzaXN0ZW5jZSBtdXN0IGxlYXZlIHRob3NlXG4gICAgICAgICAgICAvLyBhbG9uZS4gSXQgd291bGQgb3RoZXJ3aXNlIHNlZSBhIFwic2VydmVyIG92ZXJyaWRlXCIgYW5kIGNsZWFyIHRoZVxuICAgICAgICAgICAgLy8gc3RvcmVkIGVkaXQuIFRoZSBhbmFseXNpcyBzYXlzIHdoaWNoIGNvbXBvbmVudHMgdGhlIHBhdGNoIHJlYWxseVxuICAgICAgICAgICAgLy8gY3JlYXRlZC4gRXZlcnl0aGluZyBlbHNlIGNhbWUgZnJvbSBhIGZ1bGwgcmVwbGFjZW1lbnQsIHdoZXJlIHRoZVxuICAgICAgICAgICAgLy8gc2VydmVyIHJldHVybnMgZnJlc2ggZGVmYXVsdCB2YWx1ZXMgYW5kIHBlcnNpc3RlZCBlZGl0cyBtdXN0IGJlXG4gICAgICAgICAgICAvLyByZXN0b3JlZCAoZS5nLiBhZnRlciBhIGNvbXBvbmVudCBtb3ZlcyBvbiBwYWdlKS5cbiAgICAgICAgICAgIC8vIE9ubHkgdGhlIGBjaGlsZHJlbmAgcHJvcCBtYXR0ZXJzIGhlcmUsIHRoYXQgaXMgdGhlIG9uZVxuICAgICAgICAgICAgLy8gYXBwbHlQZXJzaXN0ZW5jZSByZWN1cnNlcyB0aHJvdWdoXG4gICAgICAgICAgICBjb25zdCB7IHByb3BzIH0gPSBhcHBseVBlcnNpc3RlbmNlKHsgcHJvcHM6IHVwZGF0ZWRQcm9wcyB9LCBkaXNwYXRjaCwgYW5hbHlzaXNGb3JQcm9wKHBhdGNoQW5hbHlzaXMsICdjaGlsZHJlbicpKTtcbiAgICAgICAgICAgIGRpc3BhdGNoKHVwZGF0ZVByb3BzKHtcbiAgICAgICAgICAgICAgICBpdGVtcGF0aCxcbiAgICAgICAgICAgICAgICBwcm9wcyxcbiAgICAgICAgICAgICAgICBzb3VyY2U6ICdyZXNwb25zZScsXG4gICAgICAgICAgICAgICAgcmVuZGVyVHlwZTogJ2NhbGxiYWNrJ1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgcmV0dXJuIHByb3BzO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXF1ZXN0ZWRDYWxsYmFja3MgPSBbXTtcbiAgICAgICAgY29uc3Qgc3RvcmVkQ2FsbGJhY2tzID0gW107XG4gICAgICAgIGV4ZWN1dGVkLmZvckVhY2goY2IgPT4ge1xuICAgICAgICAgICAgY29uc3QgcHJlZGVjZXNzb3JzID0gY29uY2F0KGNiLnByZWRlY2Vzc29ycyA/PyBbXSwgW2NiLmNhbGxiYWNrXSk7XG4gICAgICAgICAgICBjb25zdCB7IGNhbGxiYWNrOiB7IGNsaWVudHNpZGVfZnVuY3Rpb24sIG91dHB1dCB9LCBleGVjdXRpb25SZXN1bHQgfSA9IGNiO1xuICAgICAgICAgICAgaWYgKGlzTmlsKGV4ZWN1dGlvblJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IGRhdGEsIGVycm9yLCBwYXlsb2FkLCBwYXRjaGVkT3V0cHV0cyB9ID0gZXhlY3V0aW9uUmVzdWx0O1xuICAgICAgICAgICAgaWYgKGRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGRhdGEpLmZvckVhY2goKFtpZCwgcHJvcHNdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZElkID0gcGFyc2VJZldpbGRjYXJkKGlkKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBncmFwaHMsIGxheW91dDogb2xkTGF5b3V0LCBwYXRoczogb2xkUGF0aHMgfSA9IGdldFN0YXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdoYXQgdGhlIFBhdGNoIG9wZXJhdGlvbnMgb2YgdGhpcyBvdXRwdXQgY2hhbmdlZFxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXRjaEFuYWx5c2lzID0gcGF0Y2hlZE91dHB1dHM/LltpZF07XG4gICAgICAgICAgICAgICAgICAgIC8vIENvbXBvbmVudHMgd2lsbCB0cmlnZ2VyIGNhbGxiYWNrcyBvbiB0aGVpciBvd24gYXMgcmVxdWlyZWQgKGVnLiBkZXJpdmVkKVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhcHBsaWVkUHJvcHMgPSBhcHBseVByb3BzKHBhcnNlZElkLCBwcm9wcywgcGF0Y2hBbmFseXNpcyk7XG4gICAgICAgICAgICAgICAgICAgIC8vIEFkZCBjYWxsYmFja3MgZm9yIG1vZGlmaWVkIGlucHV0c1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRDYWxsYmFja3MgPSBjb25jYXQocmVxdWVzdGVkQ2FsbGJhY2tzLCBmbGF0dGVuKG1hcChwcm9wID0+IGdldENhbGxiYWNrc0J5SW5wdXQoZ3JhcGhzLCBvbGRQYXRocywgcGFyc2VkSWQsIHByb3AsIHRydWUpLCBrZXlzKHByb3BzKSkpLm1hcChyY2IgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnJjYixcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZWRlY2Vzc29yc1xuICAgICAgICAgICAgICAgICAgICB9KSkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlUGF0aCA9IGdldFBhdGgob2xkUGF0aHMsIHBhcnNlZElkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFiYXNlUGF0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9sZE9iaiA9IHBhdGgoYmFzZVBhdGgsIG9sZExheW91dCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuUHJvcHMgPSBwYXRoT3IoJ2RlZmF1bHRWYWx1ZScsIFtvbGRPYmoubmFtZXNwYWNlLCBvbGRPYmoudHlwZV0sIHdpbmRvdy5fX2Rhc2hwcml2YXRlX2NoaWxkcmVuUHJvcHMpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGVQYXRocyA9IChjaGlsZHJlbiwgb2xkQ2hpbGRyZW4sIG9sZENoaWxkcmVuUGF0aCwgZmlsdGVyUm9vdCA9IGZhbHNlLCBwcm9wQW5hbHlzaXMsIGFwcGVuZCA9IG51bGwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9QYXRocyA9IGdldFN0YXRlKCkucGF0aHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIHBhdGNoJ3Mgb25seSBzdHJ1Y3R1cmFsIGNoYW5nZSB3YXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFwcGVuZGluZyBpdGVtcyB0byB0aGUgdGFpbCBvZiBvbmUgbGlzdCAodHJhY2tlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnkgcGF0Y2hBbmFseXNpcy50YWlsQXBwZW5kcyksIHRoZSBwcmUtZXhpc3RpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoaWxkcmVuIGtlcHQgdGhlaXIgcG9zaXRpb25zIGFuZCBpZGVudGl0aWVzLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29tcHV0ZSBwYXRocyBvbmx5IGZvciB0aGUgbmV3IHRhaWwgc2xpY2UgaW5zdGVhZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgcmUtY3Jhd2xpbmcgdGhlIHdob2xlIGFycmF5IC0gdGhlIGRvbWluYW50IGNvc3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIGEgcmVwZWF0ZWQgUGF0Y2goKS5hcHBlbmQoKSBpbnRvIGEgbGFyZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRhaW5lci4gYGxvY2F0aW9uYCBwb2ludHMgYXQgdGhlIGdyb3duIGxpc3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCBtYXkgYmUgbmVzdGVkIChgW11gIGZvciBhIHBsYWluIGBjaGlsZHJlbmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgWzAsICdwcm9wcycsICdjaGlsZHJlbiddYCBmb3IgYSBuZXN0ZWQgZXh0ZW5kKS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0xpc3QgPSBhcHBlbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGFwcGVuZC5sb2NhdGlvbi5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBwYXRoKGFwcGVuZC5sb2NhdGlvbiwgY2hpbGRyZW4pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY2hpbGRyZW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9sZExpc3QgPSBhcHBlbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGFwcGVuZC5sb2NhdGlvbi5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBwYXRoKGFwcGVuZC5sb2NhdGlvbiwgb2xkQ2hpbGRyZW4pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogb2xkQ2hpbGRyZW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzVGFpbEFwcGVuZCA9ICEhYXBwZW5kICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kLmNvdW50ID4gMCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkobmV3TGlzdCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KG9sZExpc3QpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGlzdC5sZW5ndGggPT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZExpc3QubGVuZ3RoICsgYXBwZW5kLmNvdW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGF0aHMgPSBpc1RhaWxBcHBlbmQgJiYgYXBwZW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBhcHBlbmRQYXRocyhuZXdMaXN0LnNsaWNlKG9sZExpc3QubGVuZ3RoKSwgb2xkQ2hpbGRyZW5QYXRoLmNvbmNhdChhcHBlbmQubG9jYXRpb24pLCBvbGRMaXN0Lmxlbmd0aCwgb1BhdGhzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY29tcHV0ZVBhdGhzKGNoaWxkcmVuLCBvbGRDaGlsZHJlblBhdGgsIG9QYXRocyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChzZXRQYXRocyhwYXRocykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IGNhbGxiYWNrcyBmb3IgbmV3IGxheW91dCAody8gZXhlY3V0aW9uIGdyb3VwKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQ2FsbGJhY2tzID0gY29uY2F0KHJlcXVlc3RlZENhbGxiYWNrcywgZ2V0TGF5b3V0Q2FsbGJhY2tzKGdyYXBocywgcGF0aHMsIGNoaWxkcmVuLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtQYXRoOiBvbGRDaGlsZHJlblBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2hBbmFseXNpczogcHJvcEFuYWx5c2lzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclJvb3RcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLm1hcChyY2IgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5yY2IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGVjZXNzb3JzXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2lsZGNhcmQgY2FsbGJhY2tzIHdpdGggYXJyYXkgaW5wdXRzIChBTEwgLyBBTExTTUFMTEVSKSBuZWVkIHRvIHRyaWdnZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW4gZHVlIHRvIHRoZSBkZWxldGlvbiBvZiBjb21wb25lbnRzLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSB0YWlsIGFwcGVuZCBuZXZlciByZW1vdmVzIGFueXRoaW5nLCBzbyBvbGRDaGlsZHJlblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgdW5jaGFuZ2VkIGFuZCB0aGlzIHBhc3MgY2FuIG9ubHkgZmluZCB3aGF0IGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3VuZCBsYXN0IHRpbWUgKG5vdGhpbmcgbmV3KSAtIHNraXAgdGhlIGNyYXdsLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1RhaWxBcHBlbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRDYWxsYmFja3MgPSBjb25jYXQocmVxdWVzdGVkQ2FsbGJhY2tzLCBnZXRMYXlvdXRDYWxsYmFja3MoZ3JhcGhzLCBvbGRQYXRocywgb2xkQ2hpbGRyZW4sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZEFycmF5SW5wdXRzT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGF0aHM6IHBhdGhzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHVua1BhdGg6IG9sZENoaWxkcmVuUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyUm9vdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLm1hcChyY2IgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ucmNiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkZWNlc3NvcnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVjb21wdXRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBbJ2NoaWxkcmVuJ11cbiAgICAgICAgICAgICAgICAgICAgICAgIC5jb25jYXQoY2hpbGRyZW5Qcm9wcylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKGNoaWxkcmVuUHJvcCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVjb21wdXRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlblByb3AuaW5jbHVkZXMoJ1tdJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBbZnJvbnRQYXRoXSA9IGNoaWxkcmVuUHJvcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3BsaXQoJ1tdJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChwID0+IHAuc3BsaXQoJy4nKS5maWx0ZXIoZSA9PiBlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZnJvbnRPYmogPSBwYXRoKGZyb250UGF0aCwgYXBwbGllZFByb3BzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZyb250T2JqKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ3Jhd2wgbGF5b3V0IG5lZWRzIHRoZSBucy90eXBlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBjcmF3bHMgZXZlcnkgcHJvcCBvZiB0aGUgY29tcG9uZW50IGF0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25jZSwgc28gdGhlIGFuYWx5c2lzIG9ubHkgYXBwbGllcyBpZiBhbGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiB0aGVtIGNhbWUgZnJvbSBhIFBhdGNoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlUGF0aHMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5vbGRPYmosXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5vbGRPYmoucHJvcHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5hcHBsaWVkUHJvcHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9sZE9iaiwgYmFzZVBhdGgsIGtleXMoYXBwbGllZFByb3BzKSwgYW5hbHlzaXNGb3JBbGxQcm9wcyhwYXRjaEFuYWx5c2lzLCBrZXlzKHByb3BzKSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgZG8gaXQgb25jZSBmb3IgdGhlIGNvbXBvbmVudC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvbXB1dGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuUHJvcFBhdGggPSBjaGlsZHJlblByb3Auc3BsaXQoJy4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHBhdGgoY2hpbGRyZW5Qcm9wUGF0aCwgYXBwbGllZFByb3BzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2xkQ2hpbGRyZW5QYXRoID0gY29uY2F0KGdldFBhdGgob2xkUGF0aHMsIHBhcnNlZElkKSwgWydwcm9wcyddLmNvbmNhdChjaGlsZHJlblByb3BQYXRoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2xkQ2hpbGRyZW4gPSBwYXRoKG9sZENoaWxkcmVuUGF0aCwgb2xkTGF5b3V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZHJlblByb3BBbmFseXNpcyA9IGFuYWx5c2lzRm9yUHJvcChwYXRjaEFuYWx5c2lzLCBjaGlsZHJlblByb3BQYXRoWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVQYXRocyhjaGlsZHJlbiwgb2xkQ2hpbGRyZW4sIG9sZENoaWxkcmVuUGF0aCwgZmFsc2UsIGNoaWxkcmVuUHJvcEFuYWx5c2lzLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBgdGFpbEFwcGVuZHNgIGxvY2F0aW9ucyBhcmUgcmVsYXRpdmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byB0aGUgdG9wLWxldmVsIHByb3BlcnR5J3MgdmFsdWUsIHNvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNob3J0Y3V0IG9ubHkgYXBwbGllcyB3aGVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYGNoaWxkcmVuYCAqaXMqIHRoYXQgdmFsdWUgKGEgcGxhaW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBgY2hpbGRyZW5gKSwgbm90IGEgZG90dGVkIHN1Yi1wYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGBmaWd1cmUuZGF0YWApIGludG8gaXQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5Qcm9wUGF0aC5sZW5ndGggPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB0YWlsQXBwZW5kKGNoaWxkcmVuUHJvcEFuYWx5c2lzLCBjaGlsZHJlblByb3BQYXRoWzBdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gcGVyc2lzdGVuY2UgZWRnZSBjYXNlOiBpZiB5b3UgZXhwbGljaXRseSB1cGRhdGUgdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIHBlcnNpc3RlbmNlIGtleSwgb3RoZXIgcHJvcHMgbWF5IGNoYW5nZSB0aGF0IHJlcXVpcmUgdXNcbiAgICAgICAgICAgICAgICAgICAgLy8gdG8gZmlyZSBhZGRpdGlvbmFsIGNhbGxiYWNrc1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhZGRlZFByb3BzID0gcGlja0J5KChfLCBrKSA9PiAhKGsgaW4gcHJvcHMpLCBhcHBsaWVkUHJvcHMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzRW1wdHkoYWRkZWRQcm9wcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgZ3JhcGhzOiBjdXJyZW50R3JhcGhzLCBwYXRocyB9ID0gZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZENhbGxiYWNrcyA9IGNvbmNhdChyZXF1ZXN0ZWRDYWxsYmFja3MsIGluY2x1ZGVPYnNlcnZlcnMoaWQsIGFkZGVkUHJvcHMsIGN1cnJlbnRHcmFwaHMsIHBhdGhzKS5tYXAocmNiID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ucmNiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRlY2Vzc29yc1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIEFkZCBpbmZvcm1hdGlvbiBhYm91dCBwb3RlbnRpYWxseSB1cGRhdGVkIG91dHB1dHMgdnMuIHVwZGF0ZWQgb3V0cHV0cyxcbiAgICAgICAgICAgICAgICAvLyB0aGlzIHdpbGwgYmUgdXNlZCB0byBkcm9wIGNhbGxiYWNrcyBmcm9tIGV4ZWN1dGlvbiBncm91cHMgd2hlbiBubyBvdXRwdXRcbiAgICAgICAgICAgICAgICAvLyBtYXRjaGluZyB0aGUgZG93bnN0cmVhbSBjYWxsYmFjaydzIGlucHV0cyB3ZXJlIG1vZGlmaWVkXG4gICAgICAgICAgICAgICAgc3RvcmVkQ2FsbGJhY2tzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAuLi5jYixcbiAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uTWV0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWxsUHJvcHM6IG1hcChjb21iaW5lSWRBbmRQcm9wLCBmbGF0dGVuKGNiLmdldE91dHB1dHMoZ2V0U3RhdGUoKS5wYXRocykpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRQcm9wczogZmxhdHRlbihtYXAoKFtpZCwgdmFsdWVdKSA9PiBtYXAocHJvcGVydHkgPT4gY29tYmluZUlkQW5kUHJvcCh7IGlkLCBwcm9wZXJ0eSB9KSwga2V5cyh2YWx1ZSkpLCB0b1BhaXJzKGRhdGEpKSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZTtcbiAgICAgICAgICAgICAgICBpZiAoY2IuY2FsbGJhY2subm9fb3V0cHV0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHRzID0ga2V5cyhjYi5jaGFuZ2VkUHJvcElkcykuam9pbignLCAnKTtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IGBDYWxsYmFjayBlcnJvciB3aXRoIG5vIG91dHB1dCBmcm9tIGlucHV0ICR7aW5wdHN9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG91dHB1dHMgPSBwYXlsb2FkXG4gICAgICAgICAgICAgICAgICAgICAgICA/IG1hcChjb21iaW5lSWRBbmRQcm9wLCBmbGF0dGVuKFtwYXlsb2FkLm91dHB1dHNdKSkuam9pbignLCAnKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBvdXRwdXQ7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgQ2FsbGJhY2sgZXJyb3IgdXBkYXRpbmcgJHtvdXRwdXRzfWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjbGllbnRzaWRlX2Z1bmN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgbmFtZXNwYWNlOiBucywgZnVuY3Rpb25fbmFtZTogZm4gfSA9IGNsaWVudHNpZGVfZnVuY3Rpb247XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgKz0gYCB2aWEgY2xpZW50c2lkZSBmdW5jdGlvbiAke25zfS4ke2ZufWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGhhbmRsZUFzeW5jRXJyb3IoZXJyb3IsIG1lc3NhZ2UsIGRpc3BhdGNoKTtcbiAgICAgICAgICAgICAgICBzdG9yZWRDYWxsYmFja3MucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIC4uLmNiLFxuICAgICAgICAgICAgICAgICAgICBleGVjdXRpb25NZXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbGxQcm9wczogbWFwKGNvbWJpbmVJZEFuZFByb3AsIGZsYXR0ZW4oY2IuZ2V0T3V0cHV0cyhnZXRTdGF0ZSgpLnBhdGhzKSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZFByb3BzOiBbXVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBkaXNwYXRjaChhZ2dyZWdhdGVDYWxsYmFja3MoW1xuICAgICAgICAgICAgZXhlY3V0ZWQubGVuZ3RoID8gcmVtb3ZlRXhlY3V0ZWRDYWxsYmFja3MoZXhlY3V0ZWQpIDogbnVsbCxcbiAgICAgICAgICAgIGV4ZWN1dGVkLmxlbmd0aCA/IGFkZENvbXBsZXRlZENhbGxiYWNrcyhleGVjdXRlZC5sZW5ndGgpIDogbnVsbCxcbiAgICAgICAgICAgIHN0b3JlZENhbGxiYWNrcy5sZW5ndGhcbiAgICAgICAgICAgICAgICA/IGFkZFN0b3JlZENhbGxiYWNrcyhzdG9yZWRDYWxsYmFja3MpXG4gICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgICAgcmVxdWVzdGVkQ2FsbGJhY2tzLmxlbmd0aFxuICAgICAgICAgICAgICAgID8gYWRkUmVxdWVzdGVkQ2FsbGJhY2tzKHJlcXVlc3RlZENhbGxiYWNrcylcbiAgICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgXSkpO1xuICAgIH0sXG4gICAgaW5wdXRzOiBbJ2NhbGxiYWNrcy5leGVjdXRlZCddXG59O1xuZXhwb3J0IGRlZmF1bHQgb2JzZXJ2ZXI7XG4iLCJpbXBvcnQgeyBhc3NvYywgZmluZCwgcGFydGl0aW9uIH0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IHsgYWRkRXhlY3V0ZWRDYWxsYmFja3MsIGFkZFdhdGNoZWRDYWxsYmFja3MsIGFnZ3JlZ2F0ZUNhbGxiYWNrcywgcmVtb3ZlRXhlY3V0aW5nQ2FsbGJhY2tzLCByZW1vdmVXYXRjaGVkQ2FsbGJhY2tzIH0gZnJvbSAnLi4vYWN0aW9ucy9jYWxsYmFja3MnO1xuaW1wb3J0IHsgZ2V0QXBwU3RhdGUgfSBmcm9tICcuLi9yZWR1Y2Vycy9jb25zdGFudHMnO1xuY29uc3Qgb2JzZXJ2ZXIgPSB7XG4gICAgb2JzZXJ2ZXI6ICh7IGRpc3BhdGNoLCBnZXRTdGF0ZSB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgY2FsbGJhY2tzOiB7IGV4ZWN1dGluZyB9IH0gPSBnZXRTdGF0ZSgpO1xuICAgICAgICBjb25zdCBbZGVmZXJyZWQsIHNraXBwZWRPclJlYWR5XSA9IHBhcnRpdGlvbihjYiA9PiBjYi5leGVjdXRpb25Qcm9taXNlIGluc3RhbmNlb2YgUHJvbWlzZSwgZXhlY3V0aW5nKTtcbiAgICAgICAgZGlzcGF0Y2goYWdncmVnYXRlQ2FsbGJhY2tzKFtcbiAgICAgICAgICAgIGV4ZWN1dGluZy5sZW5ndGggPyByZW1vdmVFeGVjdXRpbmdDYWxsYmFja3MoZXhlY3V0aW5nKSA6IG51bGwsXG4gICAgICAgICAgICBkZWZlcnJlZC5sZW5ndGggPyBhZGRXYXRjaGVkQ2FsbGJhY2tzKGRlZmVycmVkKSA6IG51bGwsXG4gICAgICAgICAgICBza2lwcGVkT3JSZWFkeS5sZW5ndGhcbiAgICAgICAgICAgICAgICA/IGFkZEV4ZWN1dGVkQ2FsbGJhY2tzKHNraXBwZWRPclJlYWR5Lm1hcChjYiA9PiBhc3NvYygnZXhlY3V0aW9uUmVzdWx0JywgY2IuZXhlY3V0aW9uUHJvbWlzZSwgY2IpKSlcbiAgICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgXSkpO1xuICAgICAgICBkZWZlcnJlZC5mb3JFYWNoKGFzeW5jIChjYikgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2IuZXhlY3V0aW9uUHJvbWlzZTtcbiAgICAgICAgICAgIGNvbnN0IHsgY2FsbGJhY2tzOiB7IHdhdGNoZWQgfSwgYXBwTGlmZWN5Y2xlLCBob29rczogeyBjYWxsYmFja19yZXNvbHZlZCB9IH0gPSBnZXRTdGF0ZSgpO1xuICAgICAgICAgICAgaWYgKGFwcExpZmVjeWNsZSAhPT0gZ2V0QXBwU3RhdGUoJ0hZRFJBVEVEJykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY2FsbGJhY2tfcmVzb2x2ZWQpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFja19yZXNvbHZlZChjYi5jYWxsYmFjaywgcmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIGl0J3MgYmVlbiByZW1vdmVkIGZyb20gdGhlIGB3YXRjaGVkYCBsaXN0IHNpbmNlIC0gb24gY2FsbGJhY2sgY29tcGxldGlvbiwgYW5vdGhlciBjYWxsYmFjayBtYXkgYmUgY2FuY2VsbGVkXG4gICAgICAgICAgICAvLyBGaW5kIHRoZSBjYWxsYmFjayBpbnN0YW5jZSBvciBvbmUgdGhhdCBtYXRjaGVzIGl0cyBwcm9taXNlIChlZy4gY291bGQgaGF2ZSBiZWVuIHBydW5lZClcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRDYiA9IGZpbmQoX2NiID0+IF9jYiA9PT0gY2IgfHwgX2NiLmV4ZWN1dGlvblByb21pc2UgPT09IGNiLmV4ZWN1dGlvblByb21pc2UsIHdhdGNoZWQpO1xuICAgICAgICAgICAgaWYgKCFjdXJyZW50Q2IpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBPdGhlcndpc2UgbW92ZSB0byBgZXhlY3V0ZWRgIGFuZCByZW1vdmUgZnJvbSBgd2F0Y2hlZGBcbiAgICAgICAgICAgIGRpc3BhdGNoKGFnZ3JlZ2F0ZUNhbGxiYWNrcyhbXG4gICAgICAgICAgICAgICAgcmVtb3ZlV2F0Y2hlZENhbGxiYWNrcyhbY3VycmVudENiXSksXG4gICAgICAgICAgICAgICAgYWRkRXhlY3V0ZWRDYWxsYmFja3MoW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50Q2IsXG4gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb25SZXN1bHQ6IHJlc3VsdFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgIF0pKTtcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBpbnB1dHM6IFsnY2FsbGJhY2tzLmV4ZWN1dGluZyddXG59O1xuZXhwb3J0IGRlZmF1bHQgb2JzZXJ2ZXI7XG4iLCJpbXBvcnQgeyBnZXRQZW5kaW5nQ2FsbGJhY2tzIH0gZnJvbSAnLi4vdXRpbHMvY2FsbGJhY2tzJztcbmltcG9ydCB7IHNldElzTG9hZGluZyB9IGZyb20gJy4uL2FjdGlvbnMvaXNMb2FkaW5nJztcbmNvbnN0IG9ic2VydmVyID0ge1xuICAgIG9ic2VydmVyOiAoeyBkaXNwYXRjaCwgZ2V0U3RhdGUgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IGNhbGxiYWNrcywgaXNMb2FkaW5nIH0gPSBnZXRTdGF0ZSgpO1xuICAgICAgICBjb25zdCBwZW5kaW5nQ2FsbGJhY2tzID0gZ2V0UGVuZGluZ0NhbGxiYWNrcyhjYWxsYmFja3MpO1xuICAgICAgICAvLyBGaWx0ZXIgb3V0IHBlcnNpc3RlbnQgY2FsbGJhY2tzIC0gdGhleSBzaG91bGRuJ3QgdHJpZ2dlciB0aGUgbG9hZGluZyBpbmRpY2F0b3JcbiAgICAgICAgY29uc3Qgbm9uUGVyc2lzdGVudENhbGxiYWNrcyA9IHBlbmRpbmdDYWxsYmFja3MuZmlsdGVyKGNiID0+ICFjYi5jYWxsYmFjay5wZXJzaXN0ZW50KTtcbiAgICAgICAgY29uc3QgbmV4dCA9IEJvb2xlYW4obm9uUGVyc2lzdGVudENhbGxiYWNrcy5sZW5ndGgpO1xuICAgICAgICBpZiAoaXNMb2FkaW5nICE9PSBuZXh0KSB7XG4gICAgICAgICAgICBkaXNwYXRjaChzZXRJc0xvYWRpbmcobmV4dCkpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBpbnB1dHM6IFsnY2FsbGJhY2tzJ11cbn07XG5leHBvcnQgZGVmYXVsdCBvYnNlcnZlcjtcbiIsImltcG9ydCB7IGZpbmQsIGZsYXR0ZW4sIG1hcCwgcGFydGl0aW9uLCBzb3J0IH0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IHsgYWRkQmxvY2tlZENhbGxiYWNrcywgYWRkRXhlY3V0aW5nQ2FsbGJhY2tzLCBhZ2dyZWdhdGVDYWxsYmFja3MsIGV4ZWN1dGVDYWxsYmFjaywgcmVtb3ZlQmxvY2tlZENhbGxiYWNrcywgcmVtb3ZlUHJpb3JpdGl6ZWRDYWxsYmFja3MgfSBmcm9tICcuLi9hY3Rpb25zL2NhbGxiYWNrcyc7XG5pbXBvcnQgeyBzdHJpbmdpZnlJZCB9IGZyb20gJy4uL2FjdGlvbnMvZGVwZW5kZW5jaWVzJztcbmltcG9ydCB7IGNvbWJpbmVJZEFuZFByb3AgfSBmcm9tICcuLi9hY3Rpb25zL2RlcGVuZGVuY2llc190cyc7XG5pbXBvcnQgaXNBcHBSZWFkeSBmcm9tICcuLi9hY3Rpb25zL2lzQXBwUmVhZHknO1xuaW1wb3J0IHsgTUFYX0NPTkNVUlJFTlRfSFRUUF9DQUxMQkFDS1MsIHVzZXNSZXF1ZXN0U2xvdCB9IGZyb20gJy4vcmVxdWVzdFNsb3QnO1xuaW1wb3J0IHsgZ2V0QXBwU3RhdGUgfSBmcm9tICcuLi9yZWR1Y2Vycy9jb25zdGFudHMnO1xuY29uc3Qgc29ydFByaW9yaXR5ID0gKGMxLCBjMikgPT4ge1xuICAgIHJldHVybiAoYzEucHJpb3JpdHkgPz8gJycpID4gKGMyLnByaW9yaXR5ID8/ICcnKSA/IC0xIDogMTtcbn07XG5jb25zdCBnZXRTdGFzaCA9IChjYiwgcGF0aHMpID0+IHtcbiAgICBjb25zdCB7IGdldE91dHB1dHMgfSA9IGNiO1xuICAgIGNvbnN0IGFsbE91dHB1dHMgPSBnZXRPdXRwdXRzKHBhdGhzKTtcbiAgICBjb25zdCBmbGF0T3V0cHV0cyA9IGZsYXR0ZW4oYWxsT3V0cHV0cyk7XG4gICAgY29uc3QgYWxsUHJvcElkcyA9IFtdO1xuICAgIGNvbnN0IHJlcU91dCA9IHt9O1xuICAgIGZsYXRPdXRwdXRzLmZvckVhY2goKHsgaWQsIHByb3BlcnR5IH0pID0+IHtcbiAgICAgICAgY29uc3QgaWRTdHIgPSBzdHJpbmdpZnlJZChpZCk7XG4gICAgICAgIGNvbnN0IGlkT3V0ID0gKHJlcU91dFtpZFN0cl0gPSByZXFPdXRbaWRTdHJdIHx8IFtdKTtcbiAgICAgICAgaWRPdXQucHVzaChwcm9wZXJ0eSk7XG4gICAgICAgIGFsbFByb3BJZHMucHVzaChjb21iaW5lSWRBbmRQcm9wKHsgaWQ6IGlkU3RyLCBwcm9wZXJ0eSB9KSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHsgYWxsT3V0cHV0cywgYWxsUHJvcElkcyB9O1xufTtcbmNvbnN0IGdldElkcyA9IChjYiwgcGF0aHMpID0+IHtcbiAgICBjb25zdCBpdGVtcyA9IFtcbiAgICAgICAgLi4uZmxhdHRlbihjYi5nZXRJbnB1dHMocGF0aHMpKSxcbiAgICAgICAgLi4uZmxhdHRlbihjYi5nZXRTdGF0ZShwYXRocykpXG4gICAgXTtcbiAgICBjb25zdCB1bmlxdWVJZHMgPSBuZXcgTWFwKGl0ZW1zLm1hcChpdGVtID0+IFtzdHJpbmdpZnlJZChpdGVtLmlkKSwgaXRlbV0pKTtcbiAgICBjb25zdCB1bmlxdWVJdGVtcyA9IEFycmF5LmZyb20odW5pcXVlSWRzLnZhbHVlcygpKTtcbiAgICByZXR1cm4gdW5pcXVlSXRlbXM7XG59O1xuY29uc3Qgb2JzZXJ2ZXIgPSB7XG4gICAgb2JzZXJ2ZXI6IGFzeW5jICh7IGRpc3BhdGNoLCBnZXRTdGF0ZSB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgY2FsbGJhY2tzOiB7IGV4ZWN1dGluZywgd2F0Y2hlZCB9LCBjb25maWcsIGhvb2tzLCBsYXlvdXQsIHBhdGhzLCBhcHBMaWZlY3ljbGUgfSA9IGdldFN0YXRlKCk7XG4gICAgICAgIGxldCB7IGNhbGxiYWNrczogeyBwcmlvcml0aXplZCB9IH0gPSBnZXRTdGF0ZSgpO1xuICAgICAgICBpZiAoYXBwTGlmZWN5Y2xlICE9PSBnZXRBcHBTdGF0ZSgnSFlEUkFURUQnKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIE9ubHkgY2FsbGJhY2tzIGhvbGRpbmcgYW4gaW4tZmxpZ2h0IEhUVFAgcmVxdWVzdCBjb3VudCB0b3dhcmQgdGhlXG4gICAgICAgIC8vIGJ1ZGdldDsgY2xpZW50c2lkZSwgc3RyZWFtaW5nIGFuZCB3ZWJzb2NrZXQtcm91dGVkIG9uZXMgYXJlIGV4ZW1wdC5cbiAgICAgICAgY29uc3QgY291bnRzVG93YXJkID0gKGNiKSA9PiB1c2VzUmVxdWVzdFNsb3QoY2IsIGNvbmZpZyk7XG4gICAgICAgIGNvbnN0IGluRmxpZ2h0ID0gZXhlY3V0aW5nLmZpbHRlcihjb3VudHNUb3dhcmQpLmxlbmd0aCArXG4gICAgICAgICAgICB3YXRjaGVkLmZpbHRlcihjb3VudHNUb3dhcmQpLmxlbmd0aDtcbiAgICAgICAgY29uc3QgYXZhaWxhYmxlID0gTWF0aC5tYXgoMCwgTUFYX0NPTkNVUlJFTlRfSFRUUF9DQUxMQkFDS1MgLSBpbkZsaWdodCk7XG4gICAgICAgIC8vIE9yZGVyIHByaW9yaXRpemVkIGNhbGxiYWNrcyBiYXNlZCBvbiBkZXB0aCBhbmQgYnJlYWR0aCBvZiBjYWxsYmFjayBjaGFpblxuICAgICAgICBwcmlvcml0aXplZCA9IHNvcnQoc29ydFByaW9yaXR5LCBwcmlvcml0aXplZCk7XG4gICAgICAgIC8vIEV4ZW1wdCBjYWxsYmFja3MgYWx3YXlzIGRpc3BhdGNoOyBvbmx5IHJlcXVlc3Qtc2xvdCBjYWxsYmFja3MgYXJlXG4gICAgICAgIC8vIGxpbWl0ZWQgdG8gdGhlIGF2YWlsYWJsZSBidWRnZXQgKHJlYWR5IG9uZXMgZmlyc3QsIGFzIGJlZm9yZSkuXG4gICAgICAgIGNvbnN0IFtidWRnZXRlZCwgZXhlbXB0XSA9IHBhcnRpdGlvbihjb3VudHNUb3dhcmQsIHByaW9yaXRpemVkKTtcbiAgICAgICAgY29uc3QgaXNSZWFkeSA9IChjYikgPT4gaXNBcHBSZWFkeShsYXlvdXQsIHBhdGhzLCBnZXRJZHMoY2IsIHBhdGhzKSkgPT09IHRydWU7XG4gICAgICAgIGNvbnN0IFtidWRnZXRlZFN5bmMsIGJ1ZGdldGVkQXN5bmNdID0gcGFydGl0aW9uKGlzUmVhZHksIGJ1ZGdldGVkKTtcbiAgICAgICAgY29uc3QgcGlja2VkQnVkZ2V0ZWRTeW5jID0gYnVkZ2V0ZWRTeW5jLnNsaWNlKDAsIGF2YWlsYWJsZSk7XG4gICAgICAgIGNvbnN0IHBpY2tlZEJ1ZGdldGVkQXN5bmMgPSBidWRnZXRlZEFzeW5jLnNsaWNlKDAsIGF2YWlsYWJsZSAtIHBpY2tlZEJ1ZGdldGVkU3luYy5sZW5ndGgpO1xuICAgICAgICBjb25zdCBbZXhlbXB0U3luYywgZXhlbXB0QXN5bmNdID0gcGFydGl0aW9uKGlzUmVhZHksIGV4ZW1wdCk7XG4gICAgICAgIC8vIERpdmlkZSBiZXR3ZWVuIHN5bmMgKGNvbXBvbmVudHMgcmVhZHkpIGFuZCBhc3luYyAoZGVmZXJyZWQgdW50aWwgcmVhZHkpXG4gICAgICAgIGNvbnN0IHBpY2tlZFN5bmNDYWxsYmFja3MgPSBbLi4uZXhlbXB0U3luYywgLi4ucGlja2VkQnVkZ2V0ZWRTeW5jXTtcbiAgICAgICAgY29uc3QgcGlja2VkQXN5bmNDYWxsYmFja3MgPSBbLi4uZXhlbXB0QXN5bmMsIC4uLnBpY2tlZEJ1ZGdldGVkQXN5bmNdO1xuICAgICAgICBpZiAocGlja2VkU3luY0NhbGxiYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoKGFnZ3JlZ2F0ZUNhbGxiYWNrcyhbXG4gICAgICAgICAgICAgICAgcmVtb3ZlUHJpb3JpdGl6ZWRDYWxsYmFja3MocGlja2VkU3luY0NhbGxiYWNrcyksXG4gICAgICAgICAgICAgICAgYWRkRXhlY3V0aW5nQ2FsbGJhY2tzKG1hcChjYiA9PiBleGVjdXRlQ2FsbGJhY2soY2IsIGNvbmZpZywgaG9va3MsIHBhdGhzLCBsYXlvdXQsIGdldFN0YXNoKGNiLCBwYXRocyksIGRpc3BhdGNoLCBnZXRTdGF0ZSksIHBpY2tlZFN5bmNDYWxsYmFja3MpKVxuICAgICAgICAgICAgXSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwaWNrZWRBc3luY0NhbGxiYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlZmVycmVkID0gbWFwKGNiID0+ICh7XG4gICAgICAgICAgICAgICAgLi4uY2IsXG4gICAgICAgICAgICAgICAgLi4uZ2V0U3Rhc2goY2IsIHBhdGhzKSxcbiAgICAgICAgICAgICAgICBpc1JlYWR5OiBpc0FwcFJlYWR5KGxheW91dCwgcGF0aHMsIGdldElkcyhjYiwgcGF0aHMpKVxuICAgICAgICAgICAgfSksIHBpY2tlZEFzeW5jQ2FsbGJhY2tzKTtcbiAgICAgICAgICAgIGRpc3BhdGNoKGFnZ3JlZ2F0ZUNhbGxiYWNrcyhbXG4gICAgICAgICAgICAgICAgcmVtb3ZlUHJpb3JpdGl6ZWRDYWxsYmFja3MocGlja2VkQXN5bmNDYWxsYmFja3MpLFxuICAgICAgICAgICAgICAgIGFkZEJsb2NrZWRDYWxsYmFja3MoZGVmZXJyZWQpXG4gICAgICAgICAgICBdKSk7XG4gICAgICAgICAgICBkZWZlcnJlZC5mb3JFYWNoKGFzeW5jIChjYikgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IGNiLmlzUmVhZHk7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBjYWxsYmFja3M6IHsgYmxvY2tlZCB9IH0gPSBnZXRTdGF0ZSgpO1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGl0J3MgYmVlbiByZW1vdmVkIGZyb20gdGhlIGBibG9ja2VkYCBsaXN0IHNpbmNlIC0gb25cbiAgICAgICAgICAgICAgICAvLyBjYWxsYmFjayBjb21wbGV0aW9uLCBhbm90aGVyIGNhbGxiYWNrIG1heSBiZSBjYW5jZWxsZWRcbiAgICAgICAgICAgICAgICAvLyBGaW5kIHRoZSBjYWxsYmFjayBpbnN0YW5jZSBvciBvbmUgdGhhdCBtYXRjaGVzIGl0cyBwcm9taXNlXG4gICAgICAgICAgICAgICAgLy8gKGVnLiBjb3VsZCBoYXZlIGJlZW4gcHJ1bmVkKVxuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRDYiA9IGZpbmQoX2NiID0+IF9jYiA9PT0gY2IgfHwgX2NiLmlzUmVhZHkgPT09IGNiLmlzUmVhZHksIGJsb2NrZWQpO1xuICAgICAgICAgICAgICAgIGlmICghY3VycmVudENiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgZXhlY3V0aW5nQ2FsbGJhY2sgPSBleGVjdXRlQ2FsbGJhY2soY2IsIGNvbmZpZywgaG9va3MsIHBhdGhzLCBsYXlvdXQsIGNiLCBkaXNwYXRjaCwgZ2V0U3RhdGUpO1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoKGFnZ3JlZ2F0ZUNhbGxiYWNrcyhbXG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZUJsb2NrZWRDYWxsYmFja3MoW2NiXSksXG4gICAgICAgICAgICAgICAgICAgIGFkZEV4ZWN1dGluZ0NhbGxiYWNrcyhbZXhlY3V0aW5nQ2FsbGJhY2tdKVxuICAgICAgICAgICAgICAgIF0pKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBpbnB1dHM6IFsnY2FsbGJhY2tzLnByaW9yaXRpemVkJywgJ2NhbGxiYWNrcy5jb21wbGV0ZWQnXVxufTtcbmV4cG9ydCBkZWZhdWx0IG9ic2VydmVyO1xuIiwiaW1wb3J0IHsgaXNXZWJTb2NrZXRBdmFpbGFibGUsIGlzV2ViU29ja2V0RW5hYmxlZCB9IGZyb20gJy4uL3V0aWxzL3dvcmtlckNsaWVudCc7XG4vLyBDYXAgb24gaG93IG1hbnkgY2FsbGJhY2tzIG1heSBoYXZlIGFuIGluLWZsaWdodCBIVFRQIHJlcXVlc3QgdG8gdGhlIHNlcnZlciBhdFxuLy8gb25jZS4gVGhpcyBpcyBOT1QgYSBsaW1pdCBvbiB0b3RhbCBjYWxsYmFja3MgLS0gaXQgb25seSB0aHJvdHRsZXMgdGhlIGZhbi1vdXRcbi8vIG9mIGNvbmN1cnJlbnQgSFRUUCByZXF1ZXN0cyBzbyB0aGUgYnJvd3NlcidzIH42LWNvbm5lY3Rpb25zLXBlci1ob3N0IGNlaWxpbmdcbi8vIGRvZXNuJ3Qgc3RhbGwgdGhlIGFwcCB1bmRlciBhIHdpZGUgY2FsbGJhY2sgZ3JhcGguIENhbGxiYWNrcyB0aGF0IGRvbid0IGhvbGRcbi8vIGFuIEhUVFAgY29ubmVjdGlvbiBmb3IgdGhlaXIgbGlmZXRpbWUgYXJlIGV4ZW1wdCAoc2VlIGB1c2VzUmVxdWVzdFNsb3RgKTpcbi8vIGNsaWVudHNpZGUgY2FsbGJhY2tzIChydW4gaW4tYnJvd3NlciksIHN0cmVhbWluZyBjYWxsYmFja3MgKGxvbmctbGl2ZWQpLCBhbmRcbi8vIGFueXRoaW5nIHJvdXRlZCBvdmVyIHRoZSBtdWx0aXBsZXhlZCBXZWJTb2NrZXQgdHJhbnNwb3J0LlxuZXhwb3J0IGNvbnN0IE1BWF9DT05DVVJSRU5UX0hUVFBfQ0FMTEJBQ0tTID0gMTI7XG4vLyBBIGNhbGxiYWNrIHJpZGVzIHRoZSBtdWx0aXBsZXhlZCBXZWJTb2NrZXQgdHJhbnNwb3J0IChyYXRoZXIgdGhhbiBpdHMgb3duIEhUVFBcbi8vIHJlcXVlc3QpIHdoZW4gd2Vic29ja2V0IGNhbGxiYWNrcyBhcmUgZW5hYmxlZCBnbG9iYWxseSwgb3Igd2hlbiBpdCBvcHRzIGluXG4vLyBwZXItY2FsbGJhY2sgYW5kIHRoZSB0cmFuc3BvcnQgaXMgYXZhaWxhYmxlLiBOZXZlciBmb3IgYmFja2dyb3VuZCBjYWxsYmFja3MsXG4vLyB3aGljaCBhbHdheXMgcG9sbCBvdmVyIEhUVFAuIE1pcnJvcnMgdGhlIHJvdXRpbmcgZGVjaXNpb24gaW4gaGFuZGxlU2VydmVyc2lkZS5cbmV4cG9ydCBjb25zdCByb3V0ZWRPdmVyV2ViU29ja2V0ID0gKGNiLCBjb25maWcpID0+ICFjYi5jYWxsYmFjay5iYWNrZ3JvdW5kICYmXG4gICAgKGlzV2ViU29ja2V0RW5hYmxlZChjb25maWcpIHx8XG4gICAgICAgIChCb29sZWFuKGNiLmNhbGxiYWNrLndlYnNvY2tldCkgJiYgaXNXZWJTb2NrZXRBdmFpbGFibGUoY29uZmlnKSkpO1xuLy8gVHJ1ZSBvbmx5IGZvciBjYWxsYmFja3MgdGhhdCBob2xkIGFuIEhUVFAgY29ubmVjdGlvbiBmb3IgdGhlaXIgbGlmZXRpbWUgLS0gdGhlXG4vLyBvbmx5IG9uZXMgdGhhdCBjb3VudCBhZ2FpbnN0IE1BWF9DT05DVVJSRU5UX0hUVFBfQ0FMTEJBQ0tTLiBDbGllbnRzaWRlXG4vLyBjYWxsYmFja3MgbWFrZSBubyByZXF1ZXN0LCBzdHJlYW1pbmcgY2FsbGJhY2tzIGFyZSBsb25nLWxpdmVkICh0aGV5IG11c3Qgbm90XG4vLyBwaW4gYSBzbG90IGZvciB0aGVpciB3aG9sZSBsaWZlIC0tIHRoYXQgd291bGQgc3RhcnZlIGV2ZXJ5dGhpbmcgZWxzZSxcbi8vIGluY2x1ZGluZyBjbGllbnRzaWRlIGNhbGxiYWNrcyksIGFuZCB3ZWJzb2NrZXQtcm91dGVkIGNhbGxiYWNrcyBzaGFyZSBvbmVcbi8vIHNvY2tldCwgc28gbm9uZSBvZiB0aG9zZSBjb3VudC5cbmV4cG9ydCBjb25zdCB1c2VzUmVxdWVzdFNsb3QgPSAoY2IsIGNvbmZpZykgPT4gIWNiLmNhbGxiYWNrLmNsaWVudHNpZGVfZnVuY3Rpb24gJiZcbiAgICAhY2IuY2FsbGJhY2suc3RyZWFtICYmXG4gICAgIXJvdXRlZE92ZXJXZWJTb2NrZXQoY2IsIGNvbmZpZyk7XG4iLCJpbXBvcnQgeyBhbGwsIGNvbmNhdCwgZGlmZmVyZW5jZSwgZmlsdGVyLCBmbGF0dGVuLCBncm91cEJ5LCBpbmNsdWRlcywgaW50ZXJzZWN0aW9uLCBpc0VtcHR5LCBpc05pbCwgbWFwLCBtZXJnZUxlZnQsIG1lcmdlV2l0aCwgcGx1Y2ssIHJlZHVjZSwgdmFsdWVzIH0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IHsgYWdncmVnYXRlQ2FsbGJhY2tzLCByZW1vdmVQcmlvcml0aXplZENhbGxiYWNrcywgcmVtb3ZlRXhlY3V0aW5nQ2FsbGJhY2tzLCByZW1vdmVXYXRjaGVkQ2FsbGJhY2tzLCBhZGRQcmlvcml0aXplZENhbGxiYWNrcywgYWRkRXhlY3V0aW5nQ2FsbGJhY2tzLCBhZGRXYXRjaGVkQ2FsbGJhY2tzLCByZW1vdmVCbG9ja2VkQ2FsbGJhY2tzLCBhZGRCbG9ja2VkQ2FsbGJhY2tzLCBhZGRSZXF1ZXN0ZWRDYWxsYmFja3MsIHJlbW92ZVJlcXVlc3RlZENhbGxiYWNrcyB9IGZyb20gJy4uL2FjdGlvbnMvY2FsbGJhY2tzJztcbmltcG9ydCB7IGlzTXVsdGlWYWx1ZWQgfSBmcm9tICcuLi9hY3Rpb25zL2RlcGVuZGVuY2llcyc7XG5pbXBvcnQgeyBjb21iaW5lSWRBbmRQcm9wLCBnZXRSZWFkeUNhbGxiYWNrcywgZ2V0VW5pcXVlSWRlbnRpZmllciwgcHJ1bmVDYWxsYmFja3MgfSBmcm9tICcuLi9hY3Rpb25zL2RlcGVuZGVuY2llc190cyc7XG5pbXBvcnQgd2FpdCBmcm9tICcuLy4uL3V0aWxzL3dhaXQnO1xuaW1wb3J0IHsgZ2V0UGVuZGluZ0NhbGxiYWNrcyB9IGZyb20gJy4uL3V0aWxzL2NhbGxiYWNrcyc7XG5jb25zdCBvYnNlcnZlciA9IHtcbiAgICBvYnNlcnZlcjogYXN5bmMgKHsgZGlzcGF0Y2gsIGdldFN0YXRlIH0pID0+IHtcbiAgICAgICAgYXdhaXQgd2FpdCgwKTtcbiAgICAgICAgY29uc3QgeyBjYWxsYmFja3MsIGNhbGxiYWNrczogeyBwcmlvcml0aXplZCwgYmxvY2tlZCwgZXhlY3V0aW5nLCB3YXRjaGVkLCBzdG9yZWQgfSwgcGF0aHMsIGdyYXBocyB9ID0gZ2V0U3RhdGUoKTtcbiAgICAgICAgbGV0IHsgY2FsbGJhY2tzOiB7IHJlcXVlc3RlZCB9IH0gPSBnZXRTdGF0ZSgpO1xuICAgICAgICBjb25zdCBpbml0aWFsUmVxdWVzdGVkID0gcmVxdWVzdGVkLnNsaWNlKDApO1xuICAgICAgICBjb25zdCBwZW5kaW5nQ2FsbGJhY2tzID0gZ2V0UGVuZGluZ0NhbGxiYWNrcyhjYWxsYmFja3MpO1xuICAgICAgICAvKlxuICAgICAgICAgICAgMC4gUHJ1bmUgY2lyY3VsYXIgY2FsbGJhY2tzIHRoYXQgaGF2ZSBjb21wbGV0ZWQgdGhlIGxvb3BcbiAgICAgICAgICAgIC0gY2IuY2FsbGJhY2sgaW5jbHVkZWQgaW4gY2IucHJlZGVjZXNzb3JzXG4gICAgICAgICovXG4gICAgICAgIGNvbnN0IHJDaXJjdWxhcnMgPSBmaWx0ZXIoY2IgPT4gaW5jbHVkZXMoY2IuY2FsbGJhY2ssIGNiLnByZWRlY2Vzc29ycyA/PyBbXSksIHJlcXVlc3RlZCk7XG4gICAgICAgIC8qXG4gICAgICAgICAgICBUT0RPP1xuICAgICAgICAgICAgQ2xlYW4gdXAgdGhlIGByZXF1ZXN0ZWRgIGxpc3QgLSBkdXJpbmcgdGhlIGRpc3BhdGNoIHBoYXNlLFxuICAgICAgICAgICAgY2lyY3VsYXJzIHdpbGwgYmUgcmVtb3ZlZCBmb3IgcmVhbFxuICAgICAgICAqL1xuICAgICAgICByZXF1ZXN0ZWQgPSBkaWZmZXJlbmNlKHJlcXVlc3RlZCwgckNpcmN1bGFycyk7XG4gICAgICAgIC8qXG4gICAgICAgICAgICAxLiBSZW1vdmUgZHVwbGljYXRlZCBgcmVxdWVzdGVkYCBjYWxsYmFja3MgLSBnaXZlIHByZWNlZGVuY2UgdG8gbmV3ZXIgY2FsbGJhY2tzIG92ZXIgb2xkZXIgb25lc1xuICAgICAgICAqL1xuICAgICAgICBsZXQgckR1cGxpY2F0ZXMgPSBbXTtcbiAgICAgICAgY29uc3Qgck1lcmdlZER1cGxpY2F0ZXMgPSBbXTtcbiAgICAgICAgdmFsdWVzKGdyb3VwQnkoZ2V0VW5pcXVlSWRlbnRpZmllciwgcmVxdWVzdGVkKSkuZm9yRWFjaChncm91cCA9PiB7XG4gICAgICAgICAgICBpZiAoZ3JvdXAubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgLy8ga2VlcCBjYWxsYmFjayBpZiBpdHMgdGhlIG9ubHkgb25lIG9mIGl0cyBraW5kXG4gICAgICAgICAgICAgICAgck1lcmdlZER1cGxpY2F0ZXMucHVzaChncm91cFswXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbml0aWFsID0gZ3JvdXAuZmluZChjYiA9PiBjYi5pbml0aWFsQ2FsbCk7XG4gICAgICAgICAgICAgICAgaWYgKGluaXRpYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZHJvcCB0aGUgaW5pdGlhbCBjYWxsYmFjayBpZiBpdCdzIG5vdCBhbG9uZVxuICAgICAgICAgICAgICAgICAgICByRHVwbGljYXRlcy5wdXNoKGluaXRpYWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBncm91cFdpdGhvdXRJbml0aWFsID0gZ3JvdXAuZmlsdGVyKGNiID0+IGNiICE9PSBpbml0aWFsKTtcbiAgICAgICAgICAgICAgICBpZiAoZ3JvdXBXaXRob3V0SW5pdGlhbC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUncyBvbmx5IG9uZSBjYWxsYmFjayBiZXNpZGUgdGhlIGluaXRpYWwgb25lLCBrZWVwIHRoYXQgY2FsbGJhY2tcbiAgICAgICAgICAgICAgICAgICAgck1lcmdlZER1cGxpY2F0ZXMucHVzaChncm91cFdpdGhvdXRJbml0aWFsWzBdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSBtZXJnZSBhbGwgcmVtYWluaW5nIGNhbGxiYWNrcyB0b2dldGhlclxuICAgICAgICAgICAgICAgICAgICByRHVwbGljYXRlcyA9IGNvbmNhdChyRHVwbGljYXRlcywgZ3JvdXBXaXRob3V0SW5pdGlhbCk7XG4gICAgICAgICAgICAgICAgICAgIHJNZXJnZWREdXBsaWNhdGVzLnB1c2gobWVyZ2VMZWZ0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWRQcm9wSWRzOiByZWR1Y2UobWVyZ2VXaXRoKE1hdGgubWF4KSwge30sIHBsdWNrKCdjaGFuZ2VkUHJvcElkcycsIGdyb3VwV2l0aG91dEluaXRpYWwpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkdyb3VwOiBmaWx0ZXIoZXhnID0+IEJvb2xlYW4oZXhnKSwgcGx1Y2soJ2V4ZWN1dGlvbkdyb3VwJywgZ3JvdXBXaXRob3V0SW5pdGlhbCkpLnNsaWNlKC0xKVswXVxuICAgICAgICAgICAgICAgICAgICB9LCBncm91cFdpdGhvdXRJbml0aWFsLnNsaWNlKC0xKVswXSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8qXG4gICAgICAgICAgICBUT0RPP1xuICAgICAgICAgICAgQ2xlYW4gdXAgdGhlIGByZXF1ZXN0ZWRgIGxpc3QgLSBkdXJpbmcgdGhlIGRpc3BhdGNoIHBoYXNlLFxuICAgICAgICAgICAgZHVwbGljYXRlcyB3aWxsIGJlIHJlbW92ZWQgZm9yIHJlYWxcbiAgICAgICAgKi9cbiAgICAgICAgcmVxdWVzdGVkID0gck1lcmdlZER1cGxpY2F0ZXM7XG4gICAgICAgIC8qXG4gICAgICAgICAgICAyLiBSZW1vdmUgZHVwbGljYXRlZCBgcHJpb3JpdGl6ZWRgLCBgZXhlY3V0aW5nYCBhbmQgYHdhdGNoaW5nYCBjYWxsYmFja3NcbiAgICAgICAgKi9cbiAgICAgICAgLypcbiAgICAgICAgICAgIEV4dHJhY3QgYWxsIGJ1dCB0aGUgZmlyc3QgY2FsbGJhY2sgZnJvbSBlYWNoIElPUy1rZXkgZ3JvdXBcbiAgICAgICAgICAgIHRoZXNlIGNhbGxiYWNrcyBhcmUgYHByaW9yaXRpemVkYCBhbmQgZHVwbGljYXRlcy5cbiAgICAgICAgKi9cbiAgICAgICAgY29uc3QgcER1cGxpY2F0ZXMgPSBmbGF0dGVuKG1hcChncm91cCA9PiBncm91cC5zbGljZSgwLCAtMSksIHZhbHVlcyhncm91cEJ5KGdldFVuaXF1ZUlkZW50aWZpZXIsIGNvbmNhdChwcmlvcml0aXplZCwgcmVxdWVzdGVkKSkpKSk7XG4gICAgICAgIGNvbnN0IGJEdXBsaWNhdGVzID0gZmxhdHRlbihtYXAoZ3JvdXAgPT4gZ3JvdXAuc2xpY2UoMCwgLTEpLCB2YWx1ZXMoZ3JvdXBCeShnZXRVbmlxdWVJZGVudGlmaWVyLCBjb25jYXQoYmxvY2tlZCwgcmVxdWVzdGVkKSkpKSk7XG4gICAgICAgIGNvbnN0IGVEdXBsaWNhdGVzID0gZmxhdHRlbihtYXAoZ3JvdXAgPT4gZ3JvdXAuc2xpY2UoMCwgLTEpLCB2YWx1ZXMoZ3JvdXBCeShnZXRVbmlxdWVJZGVudGlmaWVyLCBjb25jYXQoZXhlY3V0aW5nLCByZXF1ZXN0ZWQpKSkpKTtcbiAgICAgICAgY29uc3Qgd0R1cGxpY2F0ZXMgPSBmbGF0dGVuKG1hcChncm91cCA9PiBncm91cC5zbGljZSgwLCAtMSksIHZhbHVlcyhncm91cEJ5KGdldFVuaXF1ZUlkZW50aWZpZXIsIGNvbmNhdCh3YXRjaGVkLCByZXF1ZXN0ZWQpKSkpKTtcbiAgICAgICAgLypcbiAgICAgICAgICAgIDMuIE1vZGlmeSBvciByZW1vdmUgY2FsbGJhY2tzIHRoYXQgYXJlIG91dHB1dHRpbmcgdG8gbm9uLWV4aXN0aW5nIGxheW91dCBgaWRgLlxuICAgICAgICAqL1xuICAgICAgICBjb25zdCB7IGFkZGVkOiByQWRkZWQsIHJlbW92ZWQ6IHJSZW1vdmVkIH0gPSBwcnVuZUNhbGxiYWNrcyhyZXF1ZXN0ZWQsIHBhdGhzKTtcbiAgICAgICAgY29uc3QgeyBhZGRlZDogcEFkZGVkLCByZW1vdmVkOiBwUmVtb3ZlZCB9ID0gcHJ1bmVDYWxsYmFja3MocHJpb3JpdGl6ZWQsIHBhdGhzKTtcbiAgICAgICAgY29uc3QgeyBhZGRlZDogYkFkZGVkLCByZW1vdmVkOiBiUmVtb3ZlZCB9ID0gcHJ1bmVDYWxsYmFja3MoYmxvY2tlZCwgcGF0aHMpO1xuICAgICAgICBjb25zdCB7IGFkZGVkOiBlQWRkZWQsIHJlbW92ZWQ6IGVSZW1vdmVkIH0gPSBwcnVuZUNhbGxiYWNrcyhleGVjdXRpbmcsIHBhdGhzKTtcbiAgICAgICAgY29uc3QgeyBhZGRlZDogd0FkZGVkLCByZW1vdmVkOiB3UmVtb3ZlZCB9ID0gcHJ1bmVDYWxsYmFja3Mod2F0Y2hlZCwgcGF0aHMpO1xuICAgICAgICAvKlxuICAgICAgICAgICAgVE9ETz9cbiAgICAgICAgICAgIENsZWFuIHVwIHRoZSBgcmVxdWVzdGVkYCBsaXN0IC0gZHVyaW5nIHRoZSBkaXNwYXRjaCBwaGFzZSxcbiAgICAgICAgICAgIGl0IHdpbGwgYmUgdXBkYXRlZCBmb3IgcmVhbFxuICAgICAgICAqL1xuICAgICAgICByZXF1ZXN0ZWQgPSBjb25jYXQoZGlmZmVyZW5jZShyZXF1ZXN0ZWQsIHJSZW1vdmVkKSwgckFkZGVkKTtcbiAgICAgICAgLypcbiAgICAgICAgICAgIDQuIEZpbmQgYHJlcXVlc3RlZGAgY2FsbGJhY2tzIHRoYXQgZG8gbm90IGRlcGVuZCBvbiBhIG91dHN0YW5kaW5nIG91dHB1dCAoYXMgZWl0aGVyIGlucHV0IG9yIHN0YXRlKVxuICAgICAgICAqL1xuICAgICAgICBsZXQgcmVhZHlDYWxsYmFja3MgPSBnZXRSZWFkeUNhbGxiYWNrcyhwYXRocywgcmVxdWVzdGVkLCBwZW5kaW5nQ2FsbGJhY2tzLCBncmFwaHMpO1xuICAgICAgICBsZXQgb2xkQmxvY2tlZCA9IFtdO1xuICAgICAgICBsZXQgbmV3QmxvY2tlZCA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogSWYgdGhlcmUgaXMgOlxuICAgICAgICAgKiAtIG5vIHJlYWR5IGNhbGxiYWNrc1xuICAgICAgICAgKiAtIGF0IGxlYXN0IG9uZSByZXF1ZXN0ZWQgY2FsbGJhY2tcbiAgICAgICAgICogLSBubyBhZGRpdGlvbmFsIHBlbmRpbmcgY2FsbGJhY2tzXG4gICAgICAgICAqXG4gICAgICAgICAqIGNhbiBhc3N1bWU6XG4gICAgICAgICAqIC0gdGhlIHJlcXVlc3RlZCBjYWxsYmFja3MgYXJlIHBhcnQgb2YgYSBjaXJjdWxhciBkZXBlbmRlbmN5IGxvb3BcbiAgICAgICAgICpcbiAgICAgICAgICogdGhlbiByZWN1cnNpdmVseTpcbiAgICAgICAgICogLSBhc3N1bWUgdGhlIGZpcnN0IGNhbGxiYWNrIGluIHRoZSBsaXN0IGlzIHJlYWR5ICh0aGUgZW50cnkgcG9pbnQgZm9yIHRoZSBsb29wKVxuICAgICAgICAgKiAtIGNoZWNrIHdoYXQgY2FsbGJhY2tzIGFyZSBibG9ja2VkIC8gcmVhZHkgd2l0aCB0aGUgYXNzdW1wdGlvblxuICAgICAgICAgKiAtIHVwZGF0ZSB0aGUgbWlzc2luZyBwcmVkZWNlc3NvcnMgYmFzZWQgb24gYXNzdW1wdGlvbnNcbiAgICAgICAgICogLSBjb250aW51ZSB1bnRpbCB0aGVyZSBhcmUgbm8gcmVtYWluaW5nIGNhbmRpZGF0ZXNcbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGlmICghcmVhZHlDYWxsYmFja3MubGVuZ3RoICYmXG4gICAgICAgICAgICByZXF1ZXN0ZWQubGVuZ3RoICYmXG4gICAgICAgICAgICByZXF1ZXN0ZWQubGVuZ3RoID09PSBwZW5kaW5nQ2FsbGJhY2tzLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IGNhbmRpZGF0ZXMgPSByZXF1ZXN0ZWQuc2xpY2UoMCk7XG4gICAgICAgICAgICB3aGlsZSAoY2FuZGlkYXRlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAvLyBBc3N1bWUgMXN0IGNhbGxiYWNrIGlzIHJlYWR5IGFuZFxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBjYW5kaWRhdGVzIC8gcmVhZHlDYWxsYmFja3MgYWNjb3JkaW5nbHlcbiAgICAgICAgICAgICAgICBjb25zdCByZWFkeUNhbGxiYWNrID0gY2FuZGlkYXRlc1swXTtcbiAgICAgICAgICAgICAgICByZWFkeUNhbGxiYWNrcy5wdXNoKHJlYWR5Q2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIGNhbmRpZGF0ZXMgPSBjYW5kaWRhdGVzLnNsaWNlKDEpO1xuICAgICAgICAgICAgICAgIC8vIFJlbWFpbmluZyBjYW5kaWRhdGVzIGFyZSBub3QgYmxvY2tlZCBieSBjdXJyZW50IGFzc3VtcHRpb25zXG4gICAgICAgICAgICAgICAgY2FuZGlkYXRlcyA9IGdldFJlYWR5Q2FsbGJhY2tzKHBhdGhzLCBjYW5kaWRhdGVzLCByZWFkeUNhbGxiYWNrcyk7XG4gICAgICAgICAgICAgICAgLy8gQmxvY2tlZCByZXF1ZXN0cyBuZWVkIHRvIG1ha2Ugc3VyZSB0aGV5IGhhdmUgdGhlIGNhbGxiYWNrIGFzIGEgcHJlZGVjZXNzb3JcbiAgICAgICAgICAgICAgICBjb25zdCBibG9ja2VkQnlBc3N1bXB0aW9ucyA9IGRpZmZlcmVuY2UoY2FuZGlkYXRlcywgY2FuZGlkYXRlcyk7XG4gICAgICAgICAgICAgICAgY29uc3QgbW9kaWZpZWQgPSBmaWx0ZXIoY2IgPT4gIWNiLnByZWRlY2Vzc29ycyB8fFxuICAgICAgICAgICAgICAgICAgICAhaW5jbHVkZXMocmVhZHlDYWxsYmFjay5jYWxsYmFjaywgY2IucHJlZGVjZXNzb3JzKSwgYmxvY2tlZEJ5QXNzdW1wdGlvbnMpO1xuICAgICAgICAgICAgICAgIG9sZEJsb2NrZWQgPSBjb25jYXQob2xkQmxvY2tlZCwgbW9kaWZpZWQpO1xuICAgICAgICAgICAgICAgIG5ld0Jsb2NrZWQgPSBjb25jYXQobmV3QmxvY2tlZCwgbW9kaWZpZWQubWFwKGNiID0+ICh7XG4gICAgICAgICAgICAgICAgICAgIC4uLmNiLFxuICAgICAgICAgICAgICAgICAgICBwcmVkZWNlc3NvcnM6IGNvbmNhdChjYi5wcmVkZWNlc3NvcnMgPz8gW10sIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWR5Q2FsbGJhY2suY2FsbGJhY2tcbiAgICAgICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICB9KSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qXG4gICAgICAgICAgICBUT0RPP1xuICAgICAgICAgICAgQ2xlYW4gdXAgdGhlIGByZXF1ZXN0ZWRgIGxpc3QgLSBkdXJpbmcgdGhlIGRpc3BhdGNoIHBoYXNlLFxuICAgICAgICAgICAgaXQgd2lsbCBiZSB1cGRhdGVkIGZvciByZWFsXG4gICAgICAgICovXG4gICAgICAgIHJlcXVlc3RlZCA9IGNvbmNhdChkaWZmZXJlbmNlKHJlcXVlc3RlZCwgb2xkQmxvY2tlZCksIG5ld0Jsb2NrZWQpO1xuICAgICAgICAvKlxuICAgICAgICAgICAgNS4gUHJ1bmUgY2FsbGJhY2tzIHRoYXQgYmVjYW1lIGlycmVsZXZhbnQgaW4gdGhlaXIgYGV4ZWN1dGlvbkdyb3VwYFxuICAgICAgICAqL1xuICAgICAgICAvLyBHcm91cCBieSBleGVjdXRpb25Hcm91cCwgZHJvcCBub24tZXhlY3V0aW9uR3JvdXAgY2FsbGJhY2tzXG4gICAgICAgIC8vIHRob3NlIHdlcmUgbm90IHRyaWdnZXJlZCBieSBsYXlvdXQgY2hhbmdlcyBhbmQgZG9uJ3QgaGF2ZSBcInN0cm9uZ1wiIGludGVyZGVwZW5kZW5jeSBmb3JcbiAgICAgICAgLy8gY2FsbGJhY2sgY2hhaW4gY29tcGxldGlvblxuICAgICAgICBjb25zdCBwZW5kaW5nR3JvdXBzID0gZ3JvdXBCeShjYiA9PiBjYi5leGVjdXRpb25Hcm91cCwgZmlsdGVyKGNiID0+ICFpc05pbChjYi5leGVjdXRpb25Hcm91cCksIHN0b3JlZCkpO1xuICAgICAgICBjb25zdCBkcm9wcGVkID0gZmlsdGVyKGNiID0+IHtcbiAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIG5vIGBzdG9yZWRgIGNhbGxiYWNrIGZvciB0aGUgZ3JvdXAsIG5vIG91dHB1dHMgd2VyZSBkcm9wcGVkIC0+IGBjYmAgaXMga2VwdFxuICAgICAgICAgICAgaWYgKCFjYi5leGVjdXRpb25Hcm91cCB8fFxuICAgICAgICAgICAgICAgICFwZW5kaW5nR3JvdXBzW2NiLmV4ZWN1dGlvbkdyb3VwXSB8fFxuICAgICAgICAgICAgICAgICFwZW5kaW5nR3JvdXBzW2NiLmV4ZWN1dGlvbkdyb3VwXS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBHZXQgYWxsIGlucHV0cyBmb3IgYGNiYFxuICAgICAgICAgICAgY29uc3QgaW5wdXRzID0gbWFwKGNvbWJpbmVJZEFuZFByb3AsIGZsYXR0ZW4oY2IuZ2V0SW5wdXRzKHBhdGhzKSkpO1xuICAgICAgICAgICAgLy8gR2V0IGFsbCB0aGUgcG90ZW50aWFsbHkgdXBkYXRlZCBwcm9wcyBmb3IgdGhlIGdyb3VwIHNvIGZhclxuICAgICAgICAgICAgY29uc3QgYWxsUHJvcHMgPSBmbGF0dGVuKG1hcChnY2IgPT4gZ2NiLmV4ZWN1dGlvbk1ldGEuYWxsUHJvcHMsIHBlbmRpbmdHcm91cHNbY2IuZXhlY3V0aW9uR3JvdXBdKSk7XG4gICAgICAgICAgICAvLyBHZXQgYWxsIHRoZSB1cGRhdGVkIHByb3BzIGZvciB0aGUgZ3JvdXAgc28gZmFyXG4gICAgICAgICAgICBjb25zdCB1cGRhdGVkID0gZmxhdHRlbihtYXAoZ2NiID0+IGdjYi5leGVjdXRpb25NZXRhLnVwZGF0ZWRQcm9wcywgcGVuZGluZ0dyb3Vwc1tjYi5leGVjdXRpb25Hcm91cF0pKTtcbiAgICAgICAgICAgIC8vIElmIHRoZXJlJ3Mgbm8gb3ZlcmxhcCBiZXR3ZWVuIHRoZSB1cGRhdGVkIHByb3BzIGFuZCB0aGUgaW5wdXRzLFxuICAgICAgICAgICAgLy8gKyB0aGVyZSdzIG5vIHByb3BzIHRoYXQgYXJlbid0IGNvdmVyZWQgYnkgdGhlIHBvdGVudGlhbGx5IHVwZGF0ZWQgcHJvcHMsXG4gICAgICAgICAgICAvLyBhbmQgbm90IGFsbCBpbnB1dHMgYXJlIG11bHRpIHZhbHVlZFxuICAgICAgICAgICAgLy8gLT4gZHJvcCBgY2JgXG4gICAgICAgICAgICBjb25zdCByZXMgPSBpc0VtcHR5KGludGVyc2VjdGlvbihpbnB1dHMsIHVwZGF0ZWQpKSAmJlxuICAgICAgICAgICAgICAgIGlzRW1wdHkoZGlmZmVyZW5jZShpbnB1dHMsIGFsbFByb3BzKSkgJiZcbiAgICAgICAgICAgICAgICAhYWxsKGRlcCA9PiBpc011bHRpVmFsdWVkKGRlcCksIGNiLmNhbGxiYWNrLmlucHV0cyk7XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9LCByZWFkeUNhbGxiYWNrcyk7XG4gICAgICAgIC8qXG4gICAgICAgICAgICBUT0RPP1xuICAgICAgICAgICAgQ2xlYW4gdXAgdGhlIGByZXF1ZXN0ZWRgIGxpc3QgLSBkdXJpbmcgdGhlIGRpc3BhdGNoIHBoYXNlLFxuICAgICAgICAgICAgaXQgd2lsbCBiZSB1cGRhdGVkIGZvciByZWFsXG4gICAgICAgICovXG4gICAgICAgIHJlcXVlc3RlZCA9IGRpZmZlcmVuY2UocmVxdWVzdGVkLCBkcm9wcGVkKTtcbiAgICAgICAgcmVhZHlDYWxsYmFja3MgPSBkaWZmZXJlbmNlKHJlYWR5Q2FsbGJhY2tzLCBkcm9wcGVkKTtcbiAgICAgICAgcmVxdWVzdGVkID0gZGlmZmVyZW5jZShyZXF1ZXN0ZWQsIHJlYWR5Q2FsbGJhY2tzKTtcbiAgICAgICAgY29uc3QgYWRkZWQgPSBkaWZmZXJlbmNlKHJlcXVlc3RlZCwgaW5pdGlhbFJlcXVlc3RlZCk7XG4gICAgICAgIGNvbnN0IHJlbW92ZWQgPSBkaWZmZXJlbmNlKGluaXRpYWxSZXF1ZXN0ZWQsIHJlcXVlc3RlZCk7XG4gICAgICAgIGRpc3BhdGNoKGFnZ3JlZ2F0ZUNhbGxiYWNrcyhbXG4gICAgICAgICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0ZWQgY2FsbGJhY2tzXG4gICAgICAgICAgICBhZGRlZC5sZW5ndGggPyBhZGRSZXF1ZXN0ZWRDYWxsYmFja3MoYWRkZWQpIDogbnVsbCxcbiAgICAgICAgICAgIHJlbW92ZWQubGVuZ3RoID8gcmVtb3ZlUmVxdWVzdGVkQ2FsbGJhY2tzKHJlbW92ZWQpIDogbnVsbCxcbiAgICAgICAgICAgIC8vIENsZWFuIHVwIGR1cGxpY2F0ZWQgY2FsbGJhY2tzXG4gICAgICAgICAgICBwRHVwbGljYXRlcy5sZW5ndGhcbiAgICAgICAgICAgICAgICA/IHJlbW92ZVByaW9yaXRpemVkQ2FsbGJhY2tzKHBEdXBsaWNhdGVzKVxuICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgIGJEdXBsaWNhdGVzLmxlbmd0aCA/IHJlbW92ZUJsb2NrZWRDYWxsYmFja3MoYkR1cGxpY2F0ZXMpIDogbnVsbCxcbiAgICAgICAgICAgIGVEdXBsaWNhdGVzLmxlbmd0aFxuICAgICAgICAgICAgICAgID8gcmVtb3ZlRXhlY3V0aW5nQ2FsbGJhY2tzKGVEdXBsaWNhdGVzKVxuICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgIHdEdXBsaWNhdGVzLmxlbmd0aCA/IHJlbW92ZVdhdGNoZWRDYWxsYmFja3Mod0R1cGxpY2F0ZXMpIDogbnVsbCxcbiAgICAgICAgICAgIC8vIFBydW5lIGNhbGxiYWNrc1xuICAgICAgICAgICAgcFJlbW92ZWQubGVuZ3RoID8gcmVtb3ZlUHJpb3JpdGl6ZWRDYWxsYmFja3MocFJlbW92ZWQpIDogbnVsbCxcbiAgICAgICAgICAgIHBBZGRlZC5sZW5ndGggPyBhZGRQcmlvcml0aXplZENhbGxiYWNrcyhwQWRkZWQpIDogbnVsbCxcbiAgICAgICAgICAgIGJSZW1vdmVkLmxlbmd0aCA/IHJlbW92ZUJsb2NrZWRDYWxsYmFja3MoYlJlbW92ZWQpIDogbnVsbCxcbiAgICAgICAgICAgIGJBZGRlZC5sZW5ndGggPyBhZGRCbG9ja2VkQ2FsbGJhY2tzKGJBZGRlZCkgOiBudWxsLFxuICAgICAgICAgICAgZVJlbW92ZWQubGVuZ3RoID8gcmVtb3ZlRXhlY3V0aW5nQ2FsbGJhY2tzKGVSZW1vdmVkKSA6IG51bGwsXG4gICAgICAgICAgICBlQWRkZWQubGVuZ3RoID8gYWRkRXhlY3V0aW5nQ2FsbGJhY2tzKGVBZGRlZCkgOiBudWxsLFxuICAgICAgICAgICAgd1JlbW92ZWQubGVuZ3RoID8gcmVtb3ZlV2F0Y2hlZENhbGxiYWNrcyh3UmVtb3ZlZCkgOiBudWxsLFxuICAgICAgICAgICAgd0FkZGVkLmxlbmd0aCA/IGFkZFdhdGNoZWRDYWxsYmFja3Mod0FkZGVkKSA6IG51bGwsXG4gICAgICAgICAgICAvLyBQcm9tb3RlIGNhbGxiYWNrc1xuICAgICAgICAgICAgcmVhZHlDYWxsYmFja3MubGVuZ3RoXG4gICAgICAgICAgICAgICAgPyBhZGRQcmlvcml0aXplZENhbGxiYWNrcyhyZWFkeUNhbGxiYWNrcylcbiAgICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgXSkpO1xuICAgIH0sXG4gICAgaW5wdXRzOiBbJ2NhbGxiYWNrcy5yZXF1ZXN0ZWQnLCAnY2FsbGJhY2tzLmNvbXBsZXRlZCddXG59O1xuZXhwb3J0IGRlZmF1bHQgb2JzZXJ2ZXI7XG4iLCJpbXBvcnQgeyBjb25jYXQsIGZpbHRlciwgZ3JvdXBCeSwgaXNOaWwsIHBhcnRpdGlvbiwgcmVkdWNlLCB0b1BhaXJzIH0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IHsgYWdncmVnYXRlQ2FsbGJhY2tzLCByZW1vdmVTdG9yZWRDYWxsYmFja3MgfSBmcm9tICcuLi9hY3Rpb25zL2NhbGxiYWNrcyc7XG5pbXBvcnQgeyBnZXRQZW5kaW5nQ2FsbGJhY2tzIH0gZnJvbSAnLi4vdXRpbHMvY2FsbGJhY2tzJztcbmNvbnN0IG9ic2VydmVyID0ge1xuICAgIG9ic2VydmVyOiAoeyBkaXNwYXRjaCwgZ2V0U3RhdGUgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IGNhbGxiYWNrcyB9ID0gZ2V0U3RhdGUoKTtcbiAgICAgICAgY29uc3QgcGVuZGluZ0NhbGxiYWNrcyA9IGdldFBlbmRpbmdDYWxsYmFja3MoY2FsbGJhY2tzKTtcbiAgICAgICAgY29uc3QgeyBjYWxsYmFja3M6IHsgc3RvcmVkIH0gfSA9IGdldFN0YXRlKCk7XG4gICAgICAgIGNvbnN0IFtudWxsR3JvdXBDYWxsYmFja3MsIGdyb3VwQ2FsbGJhY2tzXSA9IHBhcnRpdGlvbihjYiA9PiBpc05pbChjYi5leGVjdXRpb25Hcm91cCksIHN0b3JlZCk7XG4gICAgICAgIGNvbnN0IGV4ZWN1dGlvbkdyb3VwcyA9IGdyb3VwQnkoY2IgPT4gY2IuZXhlY3V0aW9uR3JvdXAsIGdyb3VwQ2FsbGJhY2tzKTtcbiAgICAgICAgY29uc3QgcGVuZGluZ0dyb3VwcyA9IGdyb3VwQnkoY2IgPT4gY2IuZXhlY3V0aW9uR3JvdXAsIGZpbHRlcihjYiA9PiAhaXNOaWwoY2IuZXhlY3V0aW9uR3JvdXApLCBwZW5kaW5nQ2FsbGJhY2tzKSk7XG4gICAgICAgIGNvbnN0IGRyb3BwZWQgPSByZWR1Y2UoKHJlcywgW2V4ZWN1dGlvbkdyb3VwLCBleGVjdXRpb25Hcm91cENhbGxiYWNrc10pID0+ICFwZW5kaW5nR3JvdXBzW2V4ZWN1dGlvbkdyb3VwXVxuICAgICAgICAgICAgPyBjb25jYXQocmVzLCBleGVjdXRpb25Hcm91cENhbGxiYWNrcylcbiAgICAgICAgICAgIDogcmVzLCBbXSwgdG9QYWlycyhleGVjdXRpb25Hcm91cHMpKTtcbiAgICAgICAgZGlzcGF0Y2goYWdncmVnYXRlQ2FsbGJhY2tzKFtcbiAgICAgICAgICAgIG51bGxHcm91cENhbGxiYWNrcy5sZW5ndGhcbiAgICAgICAgICAgICAgICA/IHJlbW92ZVN0b3JlZENhbGxiYWNrcyhudWxsR3JvdXBDYWxsYmFja3MpXG4gICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgICAgZHJvcHBlZC5sZW5ndGggPyByZW1vdmVTdG9yZWRDYWxsYmFja3MoZHJvcHBlZCkgOiBudWxsXG4gICAgICAgIF0pKTtcbiAgICB9LFxuICAgIGlucHV0czogWydjYWxsYmFja3Muc3RvcmVkJywgJ2NhbGxiYWNrcy5jb21wbGV0ZWQnXVxufTtcbmV4cG9ydCBkZWZhdWx0IG9ic2VydmVyO1xuIiwiLyoqXG4gKiBPYnNlcnZlciBmb3IgaGFuZGxpbmcgaW5jb21pbmcgV2ViU29ja2V0IG1lc3NhZ2VzIChTRVRfUFJPUFMsIEdFVF9QUk9QU19SRVFVRVNUKS5cbiAqL1xuaW1wb3J0IHsgaGFzLCBwYXRoIH0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IHsgdXBkYXRlUHJvcHMsIG5vdGlmeU9ic2VydmVycywgc2V0UGF0aHMgfSBmcm9tICcuLi9hY3Rpb25zJztcbmltcG9ydCB7IHBhcnNlUGF0Y2hQcm9wcyB9IGZyb20gJy4uL2FjdGlvbnMvcGF0Y2gnO1xuaW1wb3J0IHsgcmVzb2x2ZVByb3BQYXRoIH0gZnJvbSAnLi4vdXRpbHMvcHJvcFBhdGgnO1xuaW1wb3J0IHsgY29tcHV0ZVBhdGhzLCBnZXRQYXRoIH0gZnJvbSAnLi4vYWN0aW9ucy9wYXRocyc7XG5pbXBvcnQgeyBiYXRjaCB9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCB7IGdldFdvcmtlckNsaWVudCB9IGZyb20gJy4uL3V0aWxzL3dvcmtlckNsaWVudCc7XG5pbXBvcnQgeyBhZGRSZXF1ZXN0ZWRDYWxsYmFja3MgfSBmcm9tICcuLi9hY3Rpb25zL2NhbGxiYWNrcyc7XG5pbXBvcnQgeyBtYWtlUmVzb2x2ZWRDYWxsYmFjaywgcmVzb2x2ZURlcHMgfSBmcm9tICcuLi9hY3Rpb25zL2RlcGVuZGVuY2llc190cyc7XG4vKipcbiAqIFBhcnNlIGEgY29tcG9uZW50IElEIHRoYXQgbWF5IGJlIGEgc3RyaW5naWZpZWQgSlNPTiBvYmplY3QuXG4gKiBUaGlzIGhhbmRsZXMgZGljdCBJRHMgbGlrZSAne1wiaW5kZXhcIjowLFwidHlwZVwiOlwib3V0cHV0XCJ9JyB0aGF0IG5lZWRcbiAqIHRvIGJlIHBhcnNlZCBiYWNrIHRvIG9iamVjdHMgZm9yIGdldFBhdGggdG8gd29yayBjb3JyZWN0bHkuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlQ29tcG9uZW50SWQoY29tcG9uZW50SWQpIHtcbiAgICBpZiAoY29tcG9uZW50SWQuc3RhcnRzV2l0aCgneycpICYmIGNvbXBvbmVudElkLmVuZHNXaXRoKCd9JykpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKGNvbXBvbmVudElkKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCB7XG4gICAgICAgICAgICAvLyBOb3QgdmFsaWQgSlNPTiwgcmV0dXJuIGFzLWlzXG4gICAgICAgICAgICByZXR1cm4gY29tcG9uZW50SWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvbXBvbmVudElkO1xufVxuZnVuY3Rpb24gcmVhZFJlcXVlc3RlZFByb3BzKGNvbXBvbmVudFByb3BzLCBwcm9wZXJ0aWVzLCBwcm9wUGF0aCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHByb3BQYXRoID09PSB1bmRlZmluZWQgPyB7fSA6IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgaWYgKCFjb21wb25lbnRQcm9wcykge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHByb3BOYW1lIG9mIHByb3BlcnRpZXMpIHtcbiAgICAgICAgaWYgKHByb3BQYXRoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdFtwcm9wTmFtZV0gPSBjb21wb25lbnRQcm9wc1twcm9wTmFtZV07XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWx1ZSA9IGhhcyhwcm9wTmFtZSwgY29tcG9uZW50UHJvcHMpXG4gICAgICAgICAgICA/IGNvbXBvbmVudFByb3BzW3Byb3BOYW1lXVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIHJlc3VsdFtwcm9wTmFtZV0gPSByZXNvbHZlUHJvcFBhdGgodmFsdWUsIHByb3BQYXRoKSA/PyBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiBJbml0aWFsaXplIHRoZSBXZWJTb2NrZXQgb2JzZXJ2ZXIuXG4gKlxuICogU2V0cyB1cCBoYW5kbGVycyBmb3I6XG4gKiAtIFNFVF9QUk9QUzogVXBkYXRlIGNvbXBvbmVudCBwcm9wcyB3aGVuIHJlY2VpdmVkIGZyb20gc2VydmVyXG4gKiAtIEdFVF9QUk9QU19SRVFVRVNUOiBTZW5kIGN1cnJlbnQgcHJvcCB2YWx1ZXMgYmFjayB0byBzZXJ2ZXJcbiAqXG4gKiBAcGFyYW0gc3RvcmUgUmVkdXggc3RvcmVcbiAqIEBwYXJhbSBjb25maWcgRGFzaCBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbml0aWFsaXplV2ViU29ja2V0KHN0b3JlLCBjb25maWcpIHtcbiAgICAvLyBSZWdpc3RlciB0aGUgb2JzZXJ2ZXIgd2hlbmV2ZXIgdGhlIGJhY2tlbmQgZXhwb3NlcyB3ZWJzb2NrZXRcbiAgICAvLyBpbmZyYXN0cnVjdHVyZS4gVGhlIGhhbmRsZXJzIGJlbG93IGFyZSBzZXQgdXAgaW4gYm90aCBjYXNlcywgYnV0IHRoZVxuICAgIC8vIHNvY2tldCBpcyBvbmx5IG9wZW5lZCBlYWdlcmx5IHdoZW4gd2Vic29ja2V0IGNhbGxiYWNrcyBhcmUgZW5hYmxlZFxuICAgIC8vIGdsb2JhbGx5IChzZWUgdGhlIGVuZCBvZiB0aGlzIGZ1bmN0aW9uKS4gV2hlbiBvbmx5IHBlci1jYWxsYmFja1xuICAgIC8vIHdlYnNvY2tldD1UcnVlIGlzIHVzZWQsIHRoZSBjb25uZWN0aW9uIGlzIG9wZW5lZCBsYXppbHkgb24gZmlyc3QgZGlzcGF0Y2hcbiAgICAvLyAoaGFuZGxlV2Vic29ja2V0Q2FsbGJhY2sgLT4gd29ya2VyQ2xpZW50LmVuc3VyZUNvbm5lY3RlZCkuXG4gICAgY29uc3Qgd3NBdmFpbGFibGUgPSAhIShjb25maWcud2Vic29ja2V0Py51cmwgJiYgY29uZmlnLndlYnNvY2tldD8ud29ya2VyX3VybCk7XG4gICAgaWYgKCF3c0F2YWlsYWJsZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIENoZWNrIGlmIFNoYXJlZFdvcmtlciBpcyBzdXBwb3J0ZWRcbiAgICBpZiAodHlwZW9mIFNoYXJlZFdvcmtlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdTaGFyZWRXb3JrZXIgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGJyb3dzZXIuICcgK1xuICAgICAgICAgICAgJ1dlYlNvY2tldCBjYWxsYmFja3Mgd2lsbCBmYWxsIGJhY2sgdG8gSFRUUC4nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB3b3JrZXJDbGllbnQgPSBnZXRXb3JrZXJDbGllbnQoKTtcbiAgICAvLyBIZWxwZXIgdG8gcHJvY2VzcyBhIHNpbmdsZSBzZXRfcHJvcHMgcGF5bG9hZFxuICAgIGNvbnN0IHByb2Nlc3NTZXRQcm9wcyA9IChwYXlsb2FkKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgY29tcG9uZW50SWQsIHByb3BzOiByYXdQcm9wcyB9ID0gcGF5bG9hZDtcbiAgICAgICAgY29uc3QgcGFyc2VkSWQgPSBwYXJzZUNvbXBvbmVudElkKGNvbXBvbmVudElkKTtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBzdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICBjb25zdCBjb21wb25lbnRQYXRoID0gZ2V0UGF0aChzdGF0ZS5wYXRocywgcGFyc2VkSWQpO1xuICAgICAgICBpZiAoIWNvbXBvbmVudFBhdGgpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgU0VUX1BST1BTOiBDb21wb25lbnQgJHtjb21wb25lbnRJZH0gbm90IGZvdW5kIGluIGxheW91dGApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEdldCBvbGQgY29tcG9uZW50IGZvciBQYXRjaCBwcm9jZXNzaW5nIGFuZCBwYXRoIHJlY29tcHV0YXRpb25cbiAgICAgICAgY29uc3Qgb2xkQ29tcG9uZW50ID0gcGF0aChjb21wb25lbnRQYXRoLCBzdGF0ZS5sYXlvdXQpO1xuICAgICAgICBjb25zdCBvbGRQcm9wcyA9IChvbGRDb21wb25lbnQ/LnByb3BzIHx8IHt9KTtcbiAgICAgICAgLy8gUHJvY2VzcyBwcm9wcyB0byBoYW5kbGUgUGF0Y2ggb2JqZWN0c1xuICAgICAgICBjb25zdCBwcm9jZXNzZWRQcm9wcyA9IHBhcnNlUGF0Y2hQcm9wcyhyYXdQcm9wcywgb2xkUHJvcHMpO1xuICAgICAgICAvLyBVcGRhdGUgdGhlIGNvbXBvbmVudCBwcm9wc1xuICAgICAgICBzdG9yZS5kaXNwYXRjaCh1cGRhdGVQcm9wcyh7XG4gICAgICAgICAgICBwcm9wczogcHJvY2Vzc2VkUHJvcHMsXG4gICAgICAgICAgICBpdGVtcGF0aDogY29tcG9uZW50UGF0aCxcbiAgICAgICAgICAgIHJlbmRlclR5cGU6ICd3ZWJzb2NrZXQnXG4gICAgICAgIH0pKTtcbiAgICAgICAgLy8gTm90aWZ5IG9ic2VydmVyc1xuICAgICAgICBzdG9yZS5kaXNwYXRjaChub3RpZnlPYnNlcnZlcnMoeyBpZDogcGFyc2VkSWQsIHByb3BzOiBwcm9jZXNzZWRQcm9wcyB9KSk7XG4gICAgICAgIC8vIFJlY29tcHV0ZSBwYXRocyBmb3IgYW55IG5ldyBjaGlsZCBjb21wb25lbnRzXG4gICAgICAgIGlmIChvbGRDb21wb25lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRTdGF0ZSA9IHN0b3JlLmdldFN0YXRlKCk7XG4gICAgICAgICAgICBzdG9yZS5kaXNwYXRjaChzZXRQYXRocyhjb21wdXRlUGF0aHMoe1xuICAgICAgICAgICAgICAgIC4uLm9sZENvbXBvbmVudCxcbiAgICAgICAgICAgICAgICBwcm9wczogeyAuLi5vbGRQcm9wcywgLi4ucHJvY2Vzc2VkUHJvcHMgfVxuICAgICAgICAgICAgfSwgWy4uLmNvbXBvbmVudFBhdGhdLCB1cGRhdGVkU3RhdGUucGF0aHMsIHVwZGF0ZWRTdGF0ZS5wYXRocy5ldmVudHMpKSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8vIEhhbmRsZSBzaW5nbGUgU0VUX1BST1BTIG1lc3NhZ2VcbiAgICB3b3JrZXJDbGllbnQub25TZXRQcm9wcyA9IHByb2Nlc3NTZXRQcm9wcztcbiAgICAvLyBIYW5kbGUgYmF0Y2hlZCBTRVRfUFJPUFNfQkFUQ0ggbWVzc2FnZVxuICAgIHdvcmtlckNsaWVudC5vblNldFByb3BzQmF0Y2ggPSAocGF5bG9hZHMpID0+IHtcbiAgICAgICAgYmF0Y2goKCkgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCBwYXlsb2FkIG9mIHBheWxvYWRzKSB7XG4gICAgICAgICAgICAgICAgcHJvY2Vzc1NldFByb3BzKHBheWxvYWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8vIEhhbmRsZSBHRVRfUFJPUFNfUkVRVUVTVCBtZXNzYWdlc1xuICAgIHdvcmtlckNsaWVudC5vbkdldFByb3BzUmVxdWVzdCA9IChyZXF1ZXN0SWQsIHBheWxvYWQpID0+IHtcbiAgICAgICAgY29uc3QgeyBjb21wb25lbnRJZCwgcHJvcGVydGllcywgcGF0aDogcHJvcFBhdGggfSA9IHBheWxvYWQ7XG4gICAgICAgIGNvbnN0IHBhcnNlZElkID0gcGFyc2VDb21wb25lbnRJZChjb21wb25lbnRJZCk7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gc3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50UGF0aCA9IGdldFBhdGgoc3RhdGUucGF0aHMsIHBhcnNlZElkKTtcbiAgICAgICAgbGV0IGNvbXBvbmVudFByb3BzO1xuICAgICAgICBpZiAoY29tcG9uZW50UGF0aCkge1xuICAgICAgICAgICAgY29tcG9uZW50UHJvcHMgPSBwYXRoKFsuLi5jb21wb25lbnRQYXRoLCAncHJvcHMnXSwgc3RhdGUubGF5b3V0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgR0VUX1BST1BTX1JFUVVFU1Q6IENvbXBvbmVudCAke2NvbXBvbmVudElkfSBub3QgZm91bmQgaW4gbGF5b3V0YCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2VuZCB0aGUgcmVzcG9uc2VcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcmVhZFJlcXVlc3RlZFByb3BzKGNvbXBvbmVudFByb3BzLCBwcm9wZXJ0aWVzLCBwcm9wUGF0aCk7XG4gICAgICAgIHdvcmtlckNsaWVudC5zZW5kR2V0UHJvcHNSZXNwb25zZShyZXF1ZXN0SWQsIHJlc3VsdCk7XG4gICAgfTtcbiAgICAvLyBUcmFjayBjb25uZWN0aW9uIHN0YXRlIGZvciByZWNvbm5lY3Rpb24gaGFuZGxpbmdcbiAgICBsZXQgd2FzRGlzY29ubmVjdGVkID0gZmFsc2U7XG4gICAgLy8gSGFuZGxlIGNvbm5lY3Rpb24gZXZlbnRzXG4gICAgd29ya2VyQ2xpZW50Lm9uQ29ubmVjdGVkID0gKCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnW0Rhc2hdIFdlYlNvY2tldCBjb25uZWN0ZWQnKTtcbiAgICAgICAgLy8gT24gcmVjb25uZWN0IChub3QgaW5pdGlhbCBjb25uZWN0KSwgcmUtdHJpZ2dlciBwZXJzaXN0ZW50IGNhbGxiYWNrc1xuICAgICAgICBpZiAod2FzRGlzY29ubmVjdGVkKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnW0Rhc2hdIFJlY29ubmVjdGVkIC0gcmUtdHJpZ2dlcmluZyBwZXJzaXN0ZW50IGNhbGxiYWNrcycpO1xuICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSBzdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICAgICAgY29uc3QgeyBncmFwaHMgfSA9IHN0YXRlO1xuICAgICAgICAgICAgaWYgKGdyYXBocz8uY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGVyc2lzdGVudENhbGxiYWNrcyA9IGdyYXBocy5jYWxsYmFja3MucmVkdWNlKChhY2MsIGNiKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgcmUtdHJpZ2dlciBuby1vdXRwdXQgY2FsbGJhY2tzIHdpdGggbm8gaW5wdXRzXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZXNlIGFyZSB0aGUgXCJwZXJzaXN0ZW50XCIgY2FsbGJhY2tzIHRoYXQgc2hvdWxkIHJlc3RhcnRcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNiLm5vT3V0cHV0ICYmIGNiLmlucHV0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkID0gbWFrZVJlc29sdmVkQ2FsbGJhY2soY2IsIHJlc29sdmVEZXBzKCksICcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVkLmluaXRpYWxDYWxsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjYy5wdXNoKHJlc29sdmVkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgICAgICAgIH0sIFtdKTtcbiAgICAgICAgICAgICAgICBpZiAocGVyc2lzdGVudENhbGxiYWNrcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBbRGFzaF0gUmUtdHJpZ2dlcmluZyAke3BlcnNpc3RlbnRDYWxsYmFja3MubGVuZ3RofSBwZXJzaXN0ZW50IGNhbGxiYWNrKHMpYCk7XG4gICAgICAgICAgICAgICAgICAgIHN0b3JlLmRpc3BhdGNoKGFkZFJlcXVlc3RlZENhbGxiYWNrcyhwZXJzaXN0ZW50Q2FsbGJhY2tzKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICB3b3JrZXJDbGllbnQub25EaXNjb25uZWN0ZWQgPSAocmVhc29uKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBbRGFzaF0gV2ViU29ja2V0IGRpc2Nvbm5lY3RlZDogJHtyZWFzb259YCk7XG4gICAgICAgIHdhc0Rpc2Nvbm5lY3RlZCA9IHRydWU7XG4gICAgfTtcbiAgICB3b3JrZXJDbGllbnQub25FcnJvciA9IChtZXNzYWdlLCBjb2RlKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFtEYXNoXSBXZWJTb2NrZXQgZXJyb3I6ICR7bWVzc2FnZX1gLCBjb2RlKTtcbiAgICB9O1xuICAgIC8vIEhhbmRsZSB0YWIgdmlzaWJpbGl0eSBjaGFuZ2VzLiBPbmx5IHJlY29ubmVjdCBhIHNvY2tldCB0aGF0IHdhc1xuICAgIC8vIHByZXZpb3VzbHkgZXN0YWJsaXNoZWQgKHdhc0Rpc2Nvbm5lY3RlZCk7IG5ldmVyIG9wZW4gdGhlIGZpcnN0IGNvbm5lY3Rpb25cbiAgICAvLyBoZXJlLCBzbyBhcHBzIHdpdGhvdXQgYW4gYWN0aXZlIHdlYnNvY2tldCBjYWxsYmFjayBzdGF5IHNvY2tldC1mcmVlLlxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgIGlmIChkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgPT09ICd2aXNpYmxlJykge1xuICAgICAgICAgICAgaWYgKHdvcmtlckNsaWVudC5jb25uZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBUYWIgdmlzaWJsZSBhbmQgY29ubmVjdGVkIC0gcmVzZXQgaW5hY3Rpdml0eSB0aW1lclxuICAgICAgICAgICAgICAgIHdvcmtlckNsaWVudC5ub3RpZnlUYWJWaXNpYmxlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh3YXNEaXNjb25uZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBUYWIgdmlzaWJsZSBidXQgZHJvcHBlZCAtIHJlY29ubmVjdFxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbRGFzaF0gVGFiIHZpc2libGUsIHJlY29ubmVjdGluZyBXZWJTb2NrZXQuLi4nKTtcbiAgICAgICAgICAgICAgICB3b3JrZXJDbGllbnRcbiAgICAgICAgICAgICAgICAgICAgLmVuc3VyZUNvbm5lY3RlZChjb25maWcpXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaChlcnIgPT4gY29uc29sZS5lcnJvcignW0Rhc2hdIEZhaWxlZCB0byByZWNvbm5lY3Q6JywgZXJyKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICAvLyBPbmx5IG9wZW4gdGhlIHNvY2tldCBlYWdlcmx5IHdoZW4gd2Vic29ja2V0IGNhbGxiYWNrcyBhcmUgZW5hYmxlZFxuICAgIC8vIGdsb2JhbGx5LiBXaXRoIG9ubHkgcGVyLWNhbGxiYWNrIHdlYnNvY2tldD1UcnVlLCB0aGUgaGFuZGxlcnMgYWJvdmUgc3RheVxuICAgIC8vIHJlZ2lzdGVyZWQgYnV0IG5vIHNvY2tldCBpcyBvcGVuZWQgdW50aWwgYSB3ZWJzb2NrZXQgY2FsbGJhY2sgYWN0dWFsbHlcbiAgICAvLyBydW5zIGFuZCBjYWxscyBlbnN1cmVDb25uZWN0ZWQuXG4gICAgaWYgKCFjb25maWcud2Vic29ja2V0Py5lbmFibGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gQ29ubmVjdCB0byB0aGUgd29ya2VyXG4gICAgY29uc3Qgd3NVcmwgPSBidWlsZFdlYlNvY2tldFVybChjb25maWcpO1xuICAgIHRyeSB7XG4gICAgICAgIC8vIGNvbmZpZy53ZWJzb2NrZXQgaXMgZ3VhcmFudGVlZCB0byBleGlzdCBkdWUgdG8gd3NBdmFpbGFibGUgY2hlY2sgYWJvdmVcbiAgICAgICAgYXdhaXQgd29ya2VyQ2xpZW50LmNvbm5lY3QoY29uZmlnLndlYnNvY2tldC53b3JrZXJfdXJsLCB3c1VybCwgY29uZmlnLndlYnNvY2tldC5pbmFjdGl2aXR5X3RpbWVvdXQpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignW0Rhc2hdIEZhaWxlZCB0byBjb25uZWN0IHRvIFdlYlNvY2tldCB3b3JrZXI6JywgZXJyb3IpO1xuICAgIH1cbn1cbi8qKlxuICogQnVpbGQgdGhlIFdlYlNvY2tldCBVUkwgZnJvbSBjb25maWcuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkV2ViU29ja2V0VXJsKGNvbmZpZykge1xuICAgIGlmICghY29uZmlnLndlYnNvY2tldD8udXJsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignV2ViU29ja2V0IFVSTCBub3QgY29uZmlndXJlZCcpO1xuICAgIH1cbiAgICAvLyBDb252ZXJ0IEhUVFAoUykgVVJMIHRvIFdTKFMpXG4gICAgY29uc3Qgd3NQcm90b2NvbCA9IHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCA9PT0gJ2h0dHBzOicgPyAnd3NzOicgOiAnd3M6JztcbiAgICBjb25zdCBob3N0ID0gd2luZG93LmxvY2F0aW9uLmhvc3Q7XG4gICAgLy8gVGhlIGNvbmZpZy53ZWJzb2NrZXQudXJsIGlzIGEgcGF0aCBsaWtlIFwiL19kYXNoLXdzLWNhbGxiYWNrXCJcbiAgICByZXR1cm4gYCR7d3NQcm90b2NvbH0vLyR7aG9zdH0ke2NvbmZpZy53ZWJzb2NrZXQudXJsfWA7XG59XG4vKipcbiAqIERpc2Nvbm5lY3QgZnJvbSB0aGUgV2ViU29ja2V0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlzY29ubmVjdFdlYlNvY2tldCgpIHtcbiAgICBjb25zdCB3b3JrZXJDbGllbnQgPSBnZXRXb3JrZXJDbGllbnQoKTtcbiAgICB3b3JrZXJDbGllbnQuZGlzY29ubmVjdCgpO1xufVxuIiwiaW1wb3J0IHsgYXNzb2MsIGFzc29jUGF0aCwgZGlzc29jIH0gZnJvbSAncmFtZGEnO1xuY29uc3Qgc2V0Sm9iID0gKGpvYiwgc3RhdGUpID0+IGFzc29jKGpvYi5qb2JJZCwgam9iLCBzdGF0ZSk7XG5jb25zdCByZW1vdmVKb2IgPSAoam9iSWQsIHN0YXRlKSA9PiBkaXNzb2Moam9iSWQsIHN0YXRlKTtcbmNvbnN0IHNldE91dGRhdGVkID0gKGpvYklkLCBzdGF0ZSkgPT4gYXNzb2NQYXRoKFtqb2JJZCwgJ291dGRhdGVkJ10sIHRydWUsIHN0YXRlKTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChzdGF0ZSA9IHt9LCBhY3Rpb24pIHtcbiAgICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgICAgIGNhc2UgJ0FERF9DQUxMQkFDS19KT0InOlxuICAgICAgICAgICAgcmV0dXJuIHNldEpvYihhY3Rpb24ucGF5bG9hZCwgc3RhdGUpO1xuICAgICAgICBjYXNlICdSRU1PVkVfQ0FMTEJBQ0tfSk9CJzpcbiAgICAgICAgICAgIHJldHVybiByZW1vdmVKb2IoYWN0aW9uLnBheWxvYWQuam9iSWQsIHN0YXRlKTtcbiAgICAgICAgY2FzZSAnQ0FMTEJBQ0tfSk9CX09VVERBVEVEJzpcbiAgICAgICAgICAgIHJldHVybiBzZXRPdXRkYXRlZChhY3Rpb24ucGF5bG9hZC5qb2JJZCwgc3RhdGUpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IGNvbmNhdCwgZGlmZmVyZW5jZSwgcmVkdWNlIH0gZnJvbSAncmFtZGEnO1xuZXhwb3J0IHZhciBDYWxsYmFja0FjdGlvblR5cGU7XG4oZnVuY3Rpb24gKENhbGxiYWNrQWN0aW9uVHlwZSkge1xuICAgIENhbGxiYWNrQWN0aW9uVHlwZVtcIkFkZEJsb2NrZWRcIl0gPSBcIkNhbGxiYWNrcy5BZGRCbG9ja2VkXCI7XG4gICAgQ2FsbGJhY2tBY3Rpb25UeXBlW1wiQWRkRXhlY3V0ZWRcIl0gPSBcIkNhbGxiYWNrcy5BZGRFeGVjdXRlZFwiO1xuICAgIENhbGxiYWNrQWN0aW9uVHlwZVtcIkFkZEV4ZWN1dGluZ1wiXSA9IFwiQ2FsbGJhY2tzLkFkZEV4ZWN1dGluZ1wiO1xuICAgIENhbGxiYWNrQWN0aW9uVHlwZVtcIkFkZFByaW9yaXRpemVkXCJdID0gXCJDYWxsYmFja3MuQWRkUHJpb3JpdGl6ZWRcIjtcbiAgICBDYWxsYmFja0FjdGlvblR5cGVbXCJBZGRSZXF1ZXN0ZWRcIl0gPSBcIkNhbGxiYWNrcy5BZGRSZXF1ZXN0ZWRcIjtcbiAgICBDYWxsYmFja0FjdGlvblR5cGVbXCJBZGRTdG9yZWRcIl0gPSBcIkNhbGxiYWNrcy5BZGRTdG9yZWRcIjtcbiAgICBDYWxsYmFja0FjdGlvblR5cGVbXCJBZGRXYXRjaGVkXCJdID0gXCJDYWxsYmFja3MuQWRkV2F0Y2hlZFwiO1xuICAgIENhbGxiYWNrQWN0aW9uVHlwZVtcIlJlbW92ZUJsb2NrZWRcIl0gPSBcIkNhbGxiYWNrcy5SZW1vdmVCbG9ja2VkXCI7XG4gICAgQ2FsbGJhY2tBY3Rpb25UeXBlW1wiUmVtb3ZlRXhlY3V0ZWRcIl0gPSBcIkNhbGxiYWNrcy5SZW1vdmVFeGVjdXRlZFwiO1xuICAgIENhbGxiYWNrQWN0aW9uVHlwZVtcIlJlbW92ZUV4ZWN1dGluZ1wiXSA9IFwiQ2FsbGJhY2tzLlJlbW92ZUV4ZWN1dGluZ1wiO1xuICAgIENhbGxiYWNrQWN0aW9uVHlwZVtcIlJlbW92ZVByaW9yaXRpemVkXCJdID0gXCJDYWxsYmFja3MuUmVtb3ZlUHJpb3JpdGl6ZWRcIjtcbiAgICBDYWxsYmFja0FjdGlvblR5cGVbXCJSZW1vdmVSZXF1ZXN0ZWRcIl0gPSBcIkNhbGxiYWNrcy5SZW1vdmVSZXF1ZXN0ZWRcIjtcbiAgICBDYWxsYmFja0FjdGlvblR5cGVbXCJSZW1vdmVTdG9yZWRcIl0gPSBcIkNhbGxiYWNrcy5SZW1vdmVTdG9yZWRcIjtcbiAgICBDYWxsYmFja0FjdGlvblR5cGVbXCJSZW1vdmVXYXRjaGVkXCJdID0gXCJDYWxsYmFja3MuUmVtb3ZlV2F0Y2hlZFwiO1xufSkoQ2FsbGJhY2tBY3Rpb25UeXBlIHx8IChDYWxsYmFja0FjdGlvblR5cGUgPSB7fSkpO1xuZXhwb3J0IHZhciBDYWxsYmFja0FnZ3JlZ2F0ZUFjdGlvblR5cGU7XG4oZnVuY3Rpb24gKENhbGxiYWNrQWdncmVnYXRlQWN0aW9uVHlwZSkge1xuICAgIENhbGxiYWNrQWdncmVnYXRlQWN0aW9uVHlwZVtcIkFkZENvbXBsZXRlZFwiXSA9IFwiQ2FsbGJhY2tzLkNvbXBsZXRlZFwiO1xuICAgIENhbGxiYWNrQWdncmVnYXRlQWN0aW9uVHlwZVtcIkFnZ3JlZ2F0ZVwiXSA9IFwiQ2FsbGJhY2tzLkFnZ3JlZ2F0ZVwiO1xufSkoQ2FsbGJhY2tBZ2dyZWdhdGVBY3Rpb25UeXBlIHx8IChDYWxsYmFja0FnZ3JlZ2F0ZUFjdGlvblR5cGUgPSB7fSkpO1xuY29uc3QgREVGQVVMVF9TVEFURSA9IHtcbiAgICBibG9ja2VkOiBbXSxcbiAgICBleGVjdXRlZDogW10sXG4gICAgZXhlY3V0aW5nOiBbXSxcbiAgICBwcmlvcml0aXplZDogW10sXG4gICAgcmVxdWVzdGVkOiBbXSxcbiAgICBzdG9yZWQ6IFtdLFxuICAgIHdhdGNoZWQ6IFtdLFxuICAgIGNvbXBsZXRlZDogMFxufTtcbmNvbnN0IHRyYW5zZm9ybXMgPSB7XG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5BZGRCbG9ja2VkXTogY29uY2F0LFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuQWRkRXhlY3V0ZWRdOiBjb25jYXQsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5BZGRFeGVjdXRpbmddOiBjb25jYXQsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5BZGRQcmlvcml0aXplZF06IGNvbmNhdCxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLkFkZFJlcXVlc3RlZF06IGNvbmNhdCxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLkFkZFN0b3JlZF06IGNvbmNhdCxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLkFkZFdhdGNoZWRdOiBjb25jYXQsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5SZW1vdmVCbG9ja2VkXTogZGlmZmVyZW5jZSxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLlJlbW92ZUV4ZWN1dGVkXTogZGlmZmVyZW5jZSxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLlJlbW92ZUV4ZWN1dGluZ106IGRpZmZlcmVuY2UsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5SZW1vdmVQcmlvcml0aXplZF06IGRpZmZlcmVuY2UsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5SZW1vdmVSZXF1ZXN0ZWRdOiBkaWZmZXJlbmNlLFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuUmVtb3ZlU3RvcmVkXTogZGlmZmVyZW5jZSxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLlJlbW92ZVdhdGNoZWRdOiBkaWZmZXJlbmNlXG59O1xuY29uc3QgZmllbGRzID0ge1xuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuQWRkQmxvY2tlZF06ICdibG9ja2VkJyxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLkFkZEV4ZWN1dGVkXTogJ2V4ZWN1dGVkJyxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLkFkZEV4ZWN1dGluZ106ICdleGVjdXRpbmcnLFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuQWRkUHJpb3JpdGl6ZWRdOiAncHJpb3JpdGl6ZWQnLFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuQWRkUmVxdWVzdGVkXTogJ3JlcXVlc3RlZCcsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5BZGRTdG9yZWRdOiAnc3RvcmVkJyxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLkFkZFdhdGNoZWRdOiAnd2F0Y2hlZCcsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5SZW1vdmVCbG9ja2VkXTogJ2Jsb2NrZWQnLFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuUmVtb3ZlRXhlY3V0ZWRdOiAnZXhlY3V0ZWQnLFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuUmVtb3ZlRXhlY3V0aW5nXTogJ2V4ZWN1dGluZycsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5SZW1vdmVQcmlvcml0aXplZF06ICdwcmlvcml0aXplZCcsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5SZW1vdmVSZXF1ZXN0ZWRdOiAncmVxdWVzdGVkJyxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLlJlbW92ZVN0b3JlZF06ICdzdG9yZWQnLFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuUmVtb3ZlV2F0Y2hlZF06ICd3YXRjaGVkJ1xufTtcbmNvbnN0IG11dGF0ZUNvbXBsZXRlZCA9IChzdGF0ZSwgYWN0aW9uKSA9PiAoe1xuICAgIC4uLnN0YXRlLFxuICAgIGNvbXBsZXRlZDogc3RhdGUuY29tcGxldGVkICsgYWN0aW9uLnBheWxvYWRcbn0pO1xuY29uc3QgbXV0YXRlQ2FsbGJhY2tzID0gKHN0YXRlLCBhY3Rpb24pID0+IHtcbiAgICBjb25zdCB0cmFuc2Zvcm0gPSB0cmFuc2Zvcm1zW2FjdGlvbi50eXBlXTtcbiAgICBjb25zdCBmaWVsZCA9IGZpZWxkc1thY3Rpb24udHlwZV07XG4gICAgcmV0dXJuICF0cmFuc2Zvcm0gfHwgIWZpZWxkIHx8IGFjdGlvbi5wYXlsb2FkLmxlbmd0aCA9PT0gMFxuICAgICAgICA/IHN0YXRlXG4gICAgICAgIDoge1xuICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICBbZmllbGRdOiB0cmFuc2Zvcm0oc3RhdGVbZmllbGRdLCBhY3Rpb24ucGF5bG9hZClcbiAgICAgICAgfTtcbn07XG5leHBvcnQgZGVmYXVsdCAoc3RhdGUgPSBERUZBVUxUX1NUQVRFLCBhY3Rpb24pID0+IHJlZHVjZSgocywgYSkgPT4ge1xuICAgIGlmIChhID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBzO1xuICAgIH1cbiAgICBlbHNlIGlmIChhLnR5cGUgPT09IENhbGxiYWNrQWdncmVnYXRlQWN0aW9uVHlwZS5BZGRDb21wbGV0ZWQpIHtcbiAgICAgICAgcmV0dXJuIG11dGF0ZUNvbXBsZXRlZChzLCBhKTtcbiAgICB9XG4gICAgcmV0dXJuIG11dGF0ZUNhbGxiYWNrcyhzLCBhKTtcbn0sIHN0YXRlLCBhY3Rpb24udHlwZSA9PT0gQ2FsbGJhY2tBZ2dyZWdhdGVBY3Rpb25UeXBlLkFnZ3JlZ2F0ZVxuICAgID8gYWN0aW9uLnBheWxvYWRcbiAgICA6IFthY3Rpb25dKTtcbiIsImV4cG9ydCB2YXIgSXNMb2FkaW5nQWN0aW9uVHlwZTtcbihmdW5jdGlvbiAoSXNMb2FkaW5nQWN0aW9uVHlwZSkge1xuICAgIElzTG9hZGluZ0FjdGlvblR5cGVbXCJTZXRcIl0gPSBcIklzTG9hZGluZy5TZXRcIjtcbn0pKElzTG9hZGluZ0FjdGlvblR5cGUgfHwgKElzTG9hZGluZ0FjdGlvblR5cGUgPSB7fSkpO1xuY29uc3QgREVGQVVMVF9TVEFURSA9IHRydWU7XG5leHBvcnQgZGVmYXVsdCAoc3RhdGUgPSBERUZBVUxUX1NUQVRFLCBhY3Rpb24pID0+IChhY3Rpb24udHlwZSA9PT0gSXNMb2FkaW5nQWN0aW9uVHlwZS5TZXQgPyBhY3Rpb24ucGF5bG9hZCA6IHN0YXRlKTtcbiIsImltcG9ydCB7IGFzc29jUGF0aCwgaW5jbHVkZXMsIHBhdGhPciB9IGZyb20gJ3JhbWRhJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGxvYWRpbmcoc3RhdGUgPSB7fSwgYWN0aW9uKSB7XG4gICAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgICAgICBjYXNlICdMT0FERUQnOlxuICAgICAgICAgICAgcmV0dXJuIGFjdGlvbi5wYXlsb2FkLnJlZHVjZSgoYWNjLCBsb2FkKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbG9hZFBhdGggPSBbSlNPTi5zdHJpbmdpZnkobG9hZC5wYXRoKV07XG4gICAgICAgICAgICAgICAgY29uc3QgcHJldiA9IHBhdGhPcihbXSwgbG9hZFBhdGgsIGFjYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFzc29jUGF0aChsb2FkUGF0aCwgcHJldi5maWx0ZXIoKGxvYWRpbmcpID0+IGxvYWRpbmcucHJvcGVydHkgIT09IGxvYWQucHJvcGVydHkpLCBhY2MpO1xuICAgICAgICAgICAgfSwgc3RhdGUpO1xuICAgICAgICBjYXNlICdMT0FESU5HJzpcbiAgICAgICAgICAgIHJldHVybiBhY3Rpb24ucGF5bG9hZC5yZWR1Y2UoKGFjYywgbG9hZCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRQYXRoID0gW0pTT04uc3RyaW5naWZ5KGxvYWQucGF0aCldO1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXYgPSBwYXRoT3IoW10sIGxvYWRQYXRoLCBhY2MpO1xuICAgICAgICAgICAgICAgIGlmICghaW5jbHVkZXMobG9hZCwgcHJldikpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZHVwbGljYXRlIG91dHB1dHNcbiAgICAgICAgICAgICAgICAgICAgcHJldi5wdXNoKGxvYWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYXNzb2NQYXRoKGxvYWRQYXRoLCBwcmV2LCBhY2MpO1xuICAgICAgICAgICAgfSwgc3RhdGUpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IG9uY2UgfSBmcm9tICdyYW1kYSc7XG5pbXBvcnQgeyBjcmVhdGVTdG9yZSwgYXBwbHlNaWRkbGV3YXJlIH0gZnJvbSAncmVkdXgnO1xuaW1wb3J0IHRodW5rIGZyb20gJ3JlZHV4LXRodW5rJztcbmltcG9ydCB7IGNyZWF0ZVJlZHVjZXIgfSBmcm9tICcuL3JlZHVjZXJzL3JlZHVjZXInO1xuaW1wb3J0IFN0b3JlT2JzZXJ2ZXIgZnJvbSAnLi9TdG9yZU9ic2VydmVyJztcbmltcG9ydCBkb2N1bWVudFRpdGxlIGZyb20gJy4vb2JzZXJ2ZXJzL2RvY3VtZW50VGl0bGUnO1xuaW1wb3J0IGV4ZWN1dGVkQ2FsbGJhY2tzIGZyb20gJy4vb2JzZXJ2ZXJzL2V4ZWN1dGVkQ2FsbGJhY2tzJztcbmltcG9ydCBleGVjdXRpbmdDYWxsYmFja3MgZnJvbSAnLi9vYnNlcnZlcnMvZXhlY3V0aW5nQ2FsbGJhY2tzJztcbmltcG9ydCBpc0xvYWRpbmcgZnJvbSAnLi9vYnNlcnZlcnMvaXNMb2FkaW5nJztcbmltcG9ydCBwcmlvcml0aXplZENhbGxiYWNrcyBmcm9tICcuL29ic2VydmVycy9wcmlvcml0aXplZENhbGxiYWNrcyc7XG5pbXBvcnQgcmVxdWVzdGVkQ2FsbGJhY2tzIGZyb20gJy4vb2JzZXJ2ZXJzL3JlcXVlc3RlZENhbGxiYWNrcyc7XG5pbXBvcnQgc3RvcmVkQ2FsbGJhY2tzIGZyb20gJy4vb2JzZXJ2ZXJzL3N0b3JlZENhbGxiYWNrcyc7XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZW5kZXJlclN0b3JlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5fX3N0b3JlID0gdGhpcy5pbml0aWFsaXplU3RvcmUoKTtcbiAgICB9XG4gICAgX19zdG9yZTtcbiAgICBnZXQgc3RvcmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9fc3RvcmU7XG4gICAgfVxuICAgIHN0b3JlT2JzZXJ2ZXIgPSBuZXcgU3RvcmVPYnNlcnZlcigpO1xuICAgIHNldE9ic2VydmVycyA9IG9uY2UoKCkgPT4ge1xuICAgICAgICBjb25zdCBvYnNlcnZlID0gdGhpcy5zdG9yZU9ic2VydmVyLm9ic2VydmU7XG4gICAgICAgIC8vIEZJWE1FIFJlbW92ZSBvYnNlcnZlciBwYXR0ZXJuIGFuZCByZWZhY3RvciB0byBzdGFuZGFyZCByZWR1Y2Vycy9hY3Rpb25zL3NlbGVjdG9ycy5cbiAgICAgICAgb2JzZXJ2ZShkb2N1bWVudFRpdGxlKTtcbiAgICAgICAgb2JzZXJ2ZShpc0xvYWRpbmcpO1xuICAgICAgICBvYnNlcnZlKHJlcXVlc3RlZENhbGxiYWNrcyk7XG4gICAgICAgIG9ic2VydmUocHJpb3JpdGl6ZWRDYWxsYmFja3MpO1xuICAgICAgICBvYnNlcnZlKGV4ZWN1dGluZ0NhbGxiYWNrcyk7XG4gICAgICAgIG9ic2VydmUoZXhlY3V0ZWRDYWxsYmFja3MpO1xuICAgICAgICBvYnNlcnZlKHN0b3JlZENhbGxiYWNrcyk7XG4gICAgfSk7XG4gICAgY3JlYXRlQXBwU3RvcmUgPSAocmVkdWNlciwgbWlkZGxld2FyZSkgPT4ge1xuICAgICAgICB0aGlzLl9fc3RvcmUgPSBjcmVhdGVTdG9yZShyZWR1Y2VyLCBtaWRkbGV3YXJlKTtcbiAgICAgICAgdGhpcy5zdG9yZU9ic2VydmVyLnNldFN0b3JlKHRoaXMuX19zdG9yZSk7XG4gICAgICAgIGNvbnN0IGRzID0gKHdpbmRvdy5kYXNoX3N0b3JlcyA9XG4gICAgICAgICAgICB3aW5kb3cuZGFzaF9zdG9yZXMgfHwgW10pO1xuICAgICAgICBpZiAoIWRzLmluY2x1ZGVzKHRoaXMuX19zdG9yZSkpIHtcbiAgICAgICAgICAgIGRzLnB1c2godGhpcy5fX3N0b3JlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldE9ic2VydmVycygpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSBhIFJlZHV4IHN0b3JlIHdpdGggdGh1bmssIHBsdXMgbG9nZ2luZyAob25seSBpbiBkZXZlbG9wbWVudCBtb2RlKSBtaWRkbGV3YXJlXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2Jvb2x9IHJlc2V0OiBkaXNjYXJkIGFueSBwcmV2aW91cyBzdG9yZVxuICAgICAqXG4gICAgICogQHJldHVybnMge1N0b3JlPEdlbmVyaWNTdG9yZUVuaGFuY2VyPn1cbiAgICAgKiAgQW4gaW5pdGlhbGl6ZWQgcmVkdXggc3RvcmUgd2l0aCBtaWRkbGV3YXJlIGFuZCBwb3NzaWJsZSBob3QgcmVsb2FkaW5nIG9mIHJlZHVjZXJzXG4gICAgICovXG4gICAgaW5pdGlhbGl6ZVN0b3JlID0gKHJlc2V0KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLl9fc3RvcmUgJiYgIXJlc2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fX3N0b3JlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlZHVjZXIgPSBjcmVhdGVSZWR1Y2VyKCk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm9jZXNzLWVudlxuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVBcHBTdG9yZShyZWR1Y2VyLCBhcHBseU1pZGRsZXdhcmUodGh1bmspKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIG9ubHkgYXR0YWNoIGxvZ2dlciB0byBtaWRkbGV3YXJlIGluIG5vbi1wcm9kdWN0aW9uIG1vZGVcbiAgICAgICAgICAgIGNvbnN0IHJlZHV4RFRFQyA9IHdpbmRvd1xuICAgICAgICAgICAgICAgIC5fX1JFRFVYX0RFVlRPT0xTX0VYVEVOU0lPTl9DT01QT1NFX187XG4gICAgICAgICAgICBpZiAocmVkdXhEVEVDKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVBcHBTdG9yZShyZWR1Y2VyLCByZWR1eERURUMoeyBhY3Rpb25zRGVueWxpc3Q6IFsncmVsb2FkUmVxdWVzdCddIH0pKGFwcGx5TWlkZGxld2FyZSh0aHVuaykpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlQXBwU3RvcmUocmVkdWNlciwgYXBwbHlNaWRkbGV3YXJlKHRodW5rKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFyZXNldCkge1xuICAgICAgICAgICAgLy8gVE9ETyAtIFByb3RlY3QgdGhpcyB1bmRlciBhIGRlYnVnIG1vZGU/XG4gICAgICAgICAgICB3aW5kb3cuc3RvcmUgPSB0aGlzLl9fc3RvcmU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1vZHVsZS5ob3QpIHtcbiAgICAgICAgICAgIC8vIEVuYWJsZSBob3QgbW9kdWxlIHJlcGxhY2VtZW50IGZvciByZWR1Y2Vyc1xuICAgICAgICAgICAgbW9kdWxlLmhvdC5hY2NlcHQoJy4vcmVkdWNlcnMvcmVkdWNlcicsICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0Um9vdFJlZHVjZXIgPSByZXF1aXJlKCcuL3JlZHVjZXJzL3JlZHVjZXInKS5jcmVhdGVSZWR1Y2VyKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fX3N0b3JlLnJlcGxhY2VSZWR1Y2VyKG5leHRSb290UmVkdWNlcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fX3N0b3JlO1xuICAgIH07XG59XG4iLCJpbXBvcnQgeyBvbWl0LCB2YWx1ZXMgfSBmcm9tICdyYW1kYSc7XG5leHBvcnQgY29uc3QgZ2V0UGVuZGluZ0NhbGxiYWNrcyA9IChzdGF0ZSkgPT4gQXJyYXkoKS5jb25jYXQoLi4udmFsdWVzKG9taXQoWydzdG9yZWQnLCAnY29tcGxldGVkJ10sIHN0YXRlKSkpO1xuIiwiaW1wb3J0IHsgdXBkYXRlUHJvcHMsIG5vdGlmeU9ic2VydmVycywgc2V0UGF0aHMgfSBmcm9tICcuLi9hY3Rpb25zL2luZGV4JztcbmltcG9ydCB7IHBhcnNlUGF0Y2hQcm9wcywgUGF0Y2hCdWlsZGVyIH0gZnJvbSAnLi4vYWN0aW9ucy9wYXRjaCc7XG5pbXBvcnQgeyBjb21wdXRlUGF0aHMsIGdldFBhdGggfSBmcm9tICcuLi9hY3Rpb25zL3BhdGhzJztcbmltcG9ydCB7IGdldENvbXBvbmVudExheW91dCB9IGZyb20gJy4uL3dyYXBwZXIvd3JhcHBpbmcnO1xuaW1wb3J0IHsgZ2V0U3RvcmVzIH0gZnJvbSAnLi9zdG9yZXMnO1xuLyoqXG4gKiBTZXQgdGhlIHByb3BzIG9mIGEgZGFzaCBjb21wb25lbnQgYnkgaWQgb3IgcGF0aC5cbiAqXG4gKiBAcGFyYW0gaWRPclBhdGggUGF0aCBvciBpZCBvZiB0aGUgZGFzaCBjb21wb25lbnQgdG8gdXBkYXRlLlxuICogQHBhcmFtIHByb3BzIFRoZSBwcm9wcyB0byB1cGRhdGUuXG4gKi9cbmZ1bmN0aW9uIHNldF9wcm9wcyhpZE9yUGF0aCwgcHJvcHMpIHtcbiAgICBjb25zdCBkcyA9IGdldFN0b3JlcygpO1xuICAgIGZvciAobGV0IHkgPSAwOyB5IDwgZHMubGVuZ3RoOyB5KyspIHtcbiAgICAgICAgY29uc3QgeyBkaXNwYXRjaCwgZ2V0U3RhdGUgfSA9IGRzW3ldO1xuICAgICAgICBsZXQgY29tcG9uZW50UGF0aDtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBnZXRTdGF0ZSgpO1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoaWRPclBhdGgpKSB7XG4gICAgICAgICAgICBjb21wb25lbnRQYXRoID0gZ2V0UGF0aChzdGF0ZS5wYXRocywgaWRPclBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29tcG9uZW50UGF0aCA9IGlkT3JQYXRoO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9sZENvbXBvbmVudCA9IGdldENvbXBvbmVudExheW91dChjb21wb25lbnRQYXRoLCBzdGF0ZSk7XG4gICAgICAgIC8vIEhhbmRsZSBhbnkgcGF0Y2ggcHJvcHNcbiAgICAgICAgcHJvcHMgPSBwYXJzZVBhdGNoUHJvcHMocHJvcHMsIG9sZENvbXBvbmVudD8ucHJvcHMgfHwge30pO1xuICAgICAgICAvLyBVcGRhdGUgdGhlIHByb3BzXG4gICAgICAgIGRpc3BhdGNoKHVwZGF0ZVByb3BzKHtcbiAgICAgICAgICAgIHByb3BzLFxuICAgICAgICAgICAgaXRlbXBhdGg6IGNvbXBvbmVudFBhdGgsXG4gICAgICAgICAgICByZW5kZXJUeXBlOiAnY2xpZW50c2lkZUFwaSdcbiAgICAgICAgfSkpO1xuICAgICAgICBkaXNwYXRjaChub3RpZnlPYnNlcnZlcnMoeyBpZDogaWRPclBhdGgsIHByb3BzIH0pKTtcbiAgICAgICAgaWYgKCFvbGRDb21wb25lbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBkaXNwYXRjaChzZXRQYXRocyhjb21wdXRlUGF0aHMoe1xuICAgICAgICAgICAgLi4ub2xkQ29tcG9uZW50LFxuICAgICAgICAgICAgcHJvcHM6IHsgLi4ub2xkQ29tcG9uZW50LnByb3BzLCAuLi5wcm9wcyB9XG4gICAgICAgIH0sIFsuLi5jb21wb25lbnRQYXRoXSwgc3RhdGUucGF0aHMsIHN0YXRlLnBhdGhzLmV2ZW50cykpKTtcbiAgICB9XG59XG4vLyBDbGVhbiB1cmwgY29kZSBhZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2JyYWludHJlZS9zYW5pdGl6ZS11cmwvYmxvYi9tYWluL3NyYy9jb25zdGFudHMudHNcbi8vIHRvIGFsbG93IGZvciBkYXRhIHByb3RvY29sLlxuY29uc3QgaW52YWxpZFByb3RvY29scyA9IC9eKFteXFx3XSopKGphdmFzY3JpcHR8dmJzY3JpcHQpL2ltO1xuY29uc3QgbmV3TGluZXMgPSAvJih0YWJ8bmV3bGluZSk7L2dpO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRyb2wtcmVnZXhcbmNvbnN0IGN0cmxDaGFycyA9IC9bXFx1MDAwMC1cXHUwMDFGXFx1MDA3Ri1cXHUwMDlGXFx1MjAwMC1cXHUyMDBEXFx1RkVGRl0vZ2ltO1xuY29uc3QgaHRtbEVudGl0aWVzID0gLyYjKFxcdyspKF5cXHd8Oyk/L2c7XG5jb25zdCBjbGVhbl91cmwgPSAodXJsLCBmYWxsYmFjayA9ICdhYm91dDpibGFuaycpID0+IHtcbiAgICBpZiAodXJsID09PSAnJykge1xuICAgICAgICByZXR1cm4gdXJsO1xuICAgIH1cbiAgICBjb25zdCBjbGVhbmVkID0gdXJsXG4gICAgICAgIC5yZXBsYWNlKG5ld0xpbmVzLCAnJylcbiAgICAgICAgLnJlcGxhY2UoY3RybENoYXJzLCAnJylcbiAgICAgICAgLnJlcGxhY2UoaHRtbEVudGl0aWVzLCAoXywgZGVjKSA9PiBTdHJpbmcuZnJvbUNoYXJDb2RlKGRlYykpXG4gICAgICAgIC50cmltKCk7XG4gICAgaWYgKGludmFsaWRQcm90b2NvbHMudGVzdChjbGVhbmVkKSkge1xuICAgICAgICByZXR1cm4gZmFsbGJhY2s7XG4gICAgfVxuICAgIHJldHVybiB1cmw7XG59O1xuY29uc3QgZGMgPSAod2luZG93LmRhc2hfY2xpZW50c2lkZSA9XG4gICAgd2luZG93LmRhc2hfY2xpZW50c2lkZSB8fCB7fSk7XG5kY1snc2V0X3Byb3BzJ10gPSBzZXRfcHJvcHM7XG5kY1snY2xlYW5fdXJsJ10gPSBkY1snY2xlYW5fdXJsJ10gPT09IHVuZGVmaW5lZCA/IGNsZWFuX3VybCA6IGRjWydjbGVhbl91cmwnXTtcbmRjWydQYXRjaCddID0gUGF0Y2hCdWlsZGVyO1xuIiwiZXhwb3J0IGZ1bmN0aW9uIGxvYWRMaWJyYXJ5KHJlc291cmNlKSB7XG4gICAgbGV0IHByb207XG4gICAgY29uc3QgaGVhZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2hlYWQnKTtcbiAgICBpZiAocmVzb3VyY2UudHlwZSA9PT0gJ19qc19kaXN0Jykge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICAgIGVsZW1lbnQuc3JjID0gcmVzb3VyY2UudXJsO1xuICAgICAgICBlbGVtZW50LmFzeW5jID0gdHJ1ZTtcbiAgICAgICAgcHJvbSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGVsZW1lbnQub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBlbGVtZW50Lm9uZXJyb3IgPSBlcnJvciA9PiByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICAgICAgaGVhZD8uYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHJlc291cmNlLnR5cGUgPT09ICdfY3NzX2Rpc3QnKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7XG4gICAgICAgIGVsZW1lbnQuaHJlZiA9IHJlc291cmNlLnVybDtcbiAgICAgICAgZWxlbWVudC5yZWwgPSAnc3R5bGVzaGVldCc7XG4gICAgICAgIHByb20gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBlbGVtZW50Lm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZWxlbWVudC5vbmVycm9yID0gZXJyb3IgPT4gcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGhlYWQ/LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgIH1cbiAgICByZXR1cm4gcHJvbTtcbn1cbiIsImltcG9ydCB7IGhhcyB9IGZyb20gJ3JhbWRhJztcbmZ1bmN0aW9uIHJlc29sdmVBcnJheUtleSh2YWx1ZSwga2V5KSB7XG4gICAgaWYgKHR5cGVvZiBrZXkgIT09ICdudW1iZXInIHx8ICFOdW1iZXIuaXNTYWZlSW50ZWdlcihrZXkpKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IGluZGV4ID0ga2V5IDwgMCA/IHZhbHVlLmxlbmd0aCArIGtleSA6IGtleTtcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHZhbHVlLmxlbmd0aCB8fCAhaGFzKFN0cmluZyhpbmRleCksIHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWVbaW5kZXhdO1xufVxuZnVuY3Rpb24gcmVzb2x2ZU9iamVjdEtleSh2YWx1ZSwga2V5KSB7XG4gICAgaWYgKHR5cGVvZiBrZXkgIT09ICdzdHJpbmcnIHx8ICFoYXMoa2V5LCB2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlW2tleV07XG59XG4vKipcbiAqIFJlYWQgYSBkaWN0aW9uYXJ5L2xpc3QgbG9jYXRpb24gd2l0aG91dCBjb3B5aW5nIG9yIGNoYW5naW5nIHRoZSBzb3VyY2UgdmFsdWUuXG4gKiBMaWtlIFBhdGNoIGxvY2F0aW9ucywgbmVnYXRpdmUgaW5kaWNlcyBhcmUgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgbGlzdC5cbiAqIFN0cmluZyBrZXlzIHNlbGVjdCBvd24gZGljdGlvbmFyeSBwcm9wZXJ0aWVzOyBpbnRlZ2VycyBzZWxlY3QgbGlzdCBlbnRyaWVzLlxuICogTWlzc2luZyBvciBpbmNvbXBhdGlibGUgbG9jYXRpb25zIHJldHVybiB1bmRlZmluZWQuIEVtcHR5IHBhdGhzIHNlbGVjdCB0aGVcbiAqIGVudGlyZSB2YWx1ZS4gSXRlcmF0aW9uIHRha2VzIE8ocGF0aC5sZW5ndGgpIHRpbWUgYW5kIE8oMSkgZXh0cmEgc3BhY2U7IGl0XG4gKiBuZXZlciB0cmF2ZXJzZXMgc2libGluZ3Mgb3IgY2xvbmVzIHRoZSBzZWxlY3RlZCBzdWJ0cmVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVByb3BQYXRoKHZhbHVlLCBwYXRoKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHBhdGgpKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGxldCBjdXJyZW50ID0gdmFsdWU7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgcGF0aCkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjdXJyZW50KSkge1xuICAgICAgICAgICAgY3VycmVudCA9IHJlc29sdmVBcnJheUtleShjdXJyZW50LCBrZXkpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGN1cnJlbnQgPT09IG51bGwgfHwgdHlwZW9mIGN1cnJlbnQgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnQgPSByZXNvbHZlT2JqZWN0S2V5KGN1cnJlbnQsIGtleSk7XG4gICAgfVxuICAgIHJldHVybiBjdXJyZW50O1xufVxuIiwiLyoqIENhY2hlZCByZW5kZXJlciBJRCBmb3IgdGhpcyBwYWdlIGluc3RhbmNlICovXG5sZXQgY2FjaGVkUmVuZGVyZXJJZCA9IG51bGw7XG4vKipcbiAqIEdlbmVyYXRlIGEgdW5pcXVlIHJlbmRlcmVyIElEIGZvciB0aGlzIHBhZ2UgaW5zdGFuY2UuXG4gKlxuICogRWFjaCBwYWdlIGxvYWQgZ2V0cyBhIGZyZXNoIElEIHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIHN0YWxlXG4gKiBjb25uZWN0aW9ucyBpbiB0aGUgU2hhcmVkV29ya2VyIGFmdGVyIHBhZ2UgcmVsb2Fkcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJlbmRlcmVySWQoKSB7XG4gICAgaWYgKCFjYWNoZWRSZW5kZXJlcklkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY3J5cHRvICE9PSAndW5kZWZpbmVkJyAmJiBjcnlwdG8ucmFuZG9tVVVJRCkge1xuICAgICAgICAgICAgY2FjaGVkUmVuZGVyZXJJZCA9IGNyeXB0by5yYW5kb21VVUlEKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBGYWxsYmFjayBmb3Igb2xkZXIgYnJvd3NlcnNcbiAgICAgICAgICAgIGNhY2hlZFJlbmRlcmVySWQgPSBgJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKClcbiAgICAgICAgICAgICAgICAudG9TdHJpbmcoMzYpXG4gICAgICAgICAgICAgICAgLnNsaWNlKDIpfWA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNhY2hlZFJlbmRlcmVySWQ7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gZ2V0U3RvcmVzKCkge1xuICAgIGNvbnN0IHN0b3JlcyA9ICh3aW5kb3cuZGFzaF9zdG9yZXMgPVxuICAgICAgICB3aW5kb3cuZGFzaF9zdG9yZXMgfHwgW10pO1xuICAgIHJldHVybiBzdG9yZXM7XG59XG4iLCIvKipcbiAqIE11bHRpcGxleGVkIHN0cmVhbWluZyB0cmFuc3BvcnQgZm9yIHN0cmVhbWluZyBjYWxsYmFja3MuXG4gKlxuICogSW5zdGVhZCBvZiBvbmUgbG9uZy1saXZlZCBOREpTT04gY29ubmVjdGlvbiBwZXIgc3RyZWFtaW5nIGNhbGxiYWNrICh3aGljaCBoaXRzXG4gKiB0aGUgYnJvd3NlcidzIH42LWNvbm5lY3Rpb25zLXBlci1ob3N0IGNlaWxpbmcpLCBldmVyeSBzdHJlYW1pbmcgY2FsbGJhY2sgc2hhcmVzXG4gKiBPTkUgZG93bmxpbmsgY29ubmVjdGlvbi4gQSBjYWxsYmFjayBQT1NUcyBpdHMgcmVxdWVzdCAod2hpY2ggcmV0dXJucyBhIGZhc3QgYWNrKVxuICogY2FycnlpbmcgYSByZXF1ZXN0IGlkOyB0aGUgc2VydmVyIHB1bXBzIHRoYXQgY2FsbGJhY2sncyBmcmFtZXMgb250byB0aGVcbiAqIGNvbm5lY3Rpb24ncyBzaGFyZWQtc3RvcmFnZSB0b3BpYzsgdGhlIHNpbmdsZSBkb3dubGluayByZWxheXMgdGhlbSBhbmQgdGhlXG4gKiBjbGllbnQgcm91dGVzIGVhY2ggZnJhbWUgYmFjayB0byB0aGUgcmlnaHQgY2FsbGJhY2sgYnkgcmVxdWVzdCBpZC5cbiAqXG4gKiBUaGUgY29ubmVjdGlvbiBpcyBrZXllZCBzZXJ2ZXItc2lkZSBvbiB0aGUgcGFnZSdzIHNpZ25lZCBlbmRJZCAoc2VudCBhcyBhIHF1ZXJ5XG4gKiBwYXJhbWV0ZXIgb24gZXZlcnkgdXBsaW5rLCBkb3dubGluayBhbmQgY2FuY2VsKSwgbmV2ZXIgb24gYW55dGhpbmcgdGhlIGNsaWVudFxuICogcGlja3MsIHNvIGEgcGFnZSBjYW4gb25seSBldmVyIHJlYWQgb3Igd3JpdGUgaXRzIG93biB0b3BpYy5cbiAqXG4gKiBUd28gaG9zdHMgcnVuIHRoaXMgdHJhbnNwb3J0OlxuICpcbiAqIC0gYFN0cmVhbUNsaWVudGAgb3ducyB0aGUgSFRUUCBzaWRlOiB0aGUgdXBsaW5rIFBPU1RzIGFuZCB0aGUgZG93bmxpbmsgcmVhZFxuICogICBsb29wLiBJdCBydW5zIGluc2lkZSB0aGUgcGFnZSB3aGVuIG5vIHdvcmtlciBpcyBhdmFpbGFibGUuXG4gKiAtIGBTaGFyZWRTdHJlYW1DbGllbnRgIGlzIHRoZSBwYWdlJ3MgcHJveHkgdG8gYSBgU3RyZWFtQ2xpZW50YCBob3N0ZWQgaW4gYVxuICogICBTaGFyZWRXb3JrZXIgKGB3b3JrZXJzL3N0cmVhbVdvcmtlci50c2ApLCBzbyBldmVyeSB0YWIgb2YgdGhlIGJyb3dzZXIgc2hhcmVzXG4gKiAgIG9uZSBkb3dubGluayAtLSB0aGUgcGVyLWhvc3QgY29ubmVjdGlvbiBjYXAgaXMgc2hhcmVkIGFjcm9zcyB0YWJzLCBhbmQgYVxuICogICBkb3dubGluayBwZXIgdGFiIHN0YWxscyB0aGUgc2l4dGggdGFiLiBUaGUgd29ya2VyIHBpbnMgdGhlIGVuZElkIG9mIHRoZVxuICogICBmaXJzdCB0YWIgdGhhdCBzdHJlYW1zIGZvciBhcyBsb25nIGFzIHRoZSBjb25uZWN0aW9uIGhhcyBzdHJlYW1zIGluXG4gKiAgIGZsaWdodCwga2VlcHMgdGhlIGRvd25saW5rIG9wZW4gd2hpbGUgYW55IHRhYiBoYXMgYSBzdHJlYW0sIGFuZCBjYW5jZWxzIGFcbiAqICAgdGFiJ3Mgc3RyZWFtcyBzZXJ2ZXItc2lkZSB3aGVuIHRoYXQgdGFiIGdvZXMgYXdheS5cbiAqXG4gKiBUd28gZG93bmxpbmsgbW9kZXMsIGNob3NlbiBieSB0aGUgc2VydmVyIChjb25maWcuc3RyZWFtLm1vZGUpOlxuICpcbiAqIC0gJ3N0cmVhbScgKEFTR0kpOiBvbmUgbG9uZy1saXZlZCBOREpTT04gcmVzcG9uc2U7IGZyYW1lcyBhcnJpdmUgYXMgcHJvZHVjZWQuXG4gKiAtICdwb2xsJyAoV1NHSSk6IGVhY2ggZG93bmxpbmsgcmVxdWVzdCByZXR1cm5zIHRoZSBmcmFtZXMgcXVldWVkIHNpbmNlIHRoZVxuICogICBjdXJzb3IgYW5kIGVuZHMgYXQgb25jZSwgc28gaXQgaG9sZHMgYSBzZXJ2ZXIgd29ya2VyIHRocmVhZCBmb3JcbiAqICAgbWlsbGlzZWNvbmRzIHJhdGhlciB0aGFuIGZvciB0aGUgd2hvbGUgdmlzaXQuIFRoZSBjbGllbnQgcmUtcG9sbHMgYWZ0ZXJcbiAqICAgYHBvbGxJbnRlcnZhbGAgd2hpbGUgZnJhbWVzIGtlZXAgY29taW5nLCBiYWNrcyBvZmYgdG8gdGVuIHRpbWVzIHRoYXQgd2hpbGVcbiAqICAgcXVpZXQsIGFuZCBwb2xscyBpbW1lZGlhdGVseSB3aGVuIGEgbmV3IHN0cmVhbSBzdGFydHMuXG4gKlxuICogTGlmZWN5Y2xlOiB0aGUgZG93bmxpbmsgb3BlbnMgb25jZSB0aGUgZmlyc3QgdXBsaW5rIGlzIGFja25vd2xlZGdlZCBhbmQgY2xvc2VzXG4gKiB3aGVuIG5vIGFja25vd2xlZGdlZCBjYWxsYmFjayByZW1haW5zIGluIGZsaWdodCAoXCJjb2xsZWN0IHRoZSBkb25lcyB0byBtYXRjaFxuICogdGhlIHJ1bm5pbmdzXCIpLiBXYWl0aW5nIGZvciB0aGUgYWNrIGxldHMgYSBzaW5nbGUgcmVxdWVzdCBzbG90IHNlcnZlIHRoZSB0d29cbiAqIGluIHR1cm47IGZyYW1lcyBwdWJsaXNoZWQgYmVmb3JlIHRoZSBkb3dubGluayBzdWJzY3JpYmVzIGFyZSByZXBsYXllZCBmcm9tXG4gKiB0aGUgY3Vyc29yLiBJZiB0aGUgZG93bmxpbmsgZHJvcHMgd2hpbGUgY2FsbGJhY2tzIGFyZSBzdGlsbCBydW5uaW5nIGl0XG4gKiByZWNvbm5lY3RzLCByZXN1bWluZyBmcm9tIHRoZSBsYXN0IHNlcXVlbmNlIGl0IHNhdywgYmFja2luZyBvZmYgdW50aWwgdGhlXG4gKiBzZXJ2ZXIgaGFzIGJlZW4gdW5yZWFjaGFibGUgZm9yIHRoZSB3aG9sZSByZWNvbm5lY3Qgd2luZG93LlxuICovXG5pbXBvcnQgeyBnZXRSZW5kZXJlcklkIH0gZnJvbSAnLi9yZW5kZXJlcklkJztcbmNvbnN0IERFRkFVTFRfUE9MTF9JTlRFUlZBTCA9IDEwMDtcbi8vIElkbGUgcG9sbHMgc3RheSBhdCB0aGUgaW50ZXJ2YWwgZm9yIHRoaXMgbWFueSBlbXB0eSBwb2xscyAoYSBjYWxsYmFjaydzXG4vLyBuZXh0IGZyYW1lIGlzIHVzdWFsbHkgbW9tZW50cyBhd2F5KSwgdGhlbiBiYWNrIG9mZiBnZW9tZXRyaWNhbGx5IHVwIHRvXG4vLyBNQVhfQkFDS09GRl9GQUNUT1IgdGltZXMgdGhlIGludGVydmFsLiBUd28ga2VlcHMgYSBzdHJlYW0gdGhhdCB5aWVsZHMgZXZlcnlcbi8vIGhhbGYgc2Vjb25kIGF0IGFib3V0IGZvdXIgcG9sbHMgcGVyIGZyYW1lIGluc3RlYWQgb2YgdGVuOyB0aGUgY2FwIGJvdW5kc1xuLy8gdGhlIGxhdGVuY3kgb2YgYSBzbG93IHN0cmVhbSdzIG5leHQgZnJhbWUgc28gY29uc2VjdXRpdmUgZnJhbWVzIHN0aWxsXG4vLyByZW5kZXIgb25lIGF0IGEgdGltZSBpbnN0ZWFkIG9mIGJ1bmNoaW5nIGludG8gb25lIHBvbGwuXG5jb25zdCBFTVBUWV9QT0xMU19CRUZPUkVfQkFDS09GRiA9IDI7XG5jb25zdCBNQVhfQkFDS09GRl9GQUNUT1IgPSA1O1xuY29uc3QgZ2VuSWQgPSAoKSA9PiBgJHtEYXRlLm5vdygpLnRvU3RyaW5nKDM2KX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCAxMCl9YDtcbmNvbnN0IHNsZWVwID0gKG1zKSA9PiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbmV4cG9ydCBjbGFzcyBTdHJlYW1DbGllbnQge1xuICAgIC8vIExvY2FsIGlkLCB1c2VkIG9ubHkgdG8gbWFrZSByZXF1ZXN0IGlkcyB1bmlxdWUgb24gdGhpcyBob3N0LiBUaGUgc2VydmVyXG4gICAgLy8gZG9lcyBOT1Qga2V5IHRoZSB0b3BpYyBvbiBpdDogdGhlIGNvbm5lY3Rpb24gaXMga2V5ZWQgb24gdGhlIHNpZ25lZCBlbmRJZFxuICAgIC8vIGluc3RlYWQsIHNvIGEgY2xpZW50IGNhbid0IG5hbWUgYW5vdGhlciBwYWdlJ3MgdG9waWMuIFNlZSBzdHJlYW1VcmwuXG4gICAgbG9jYWxJZCA9IGdlbklkKCk7XG4gICAgLy8gVGhlIGVuZElkIHRoaXMgY29ubmVjdGlvbiBpcyBrZXllZCBvbi4gUGlubmVkIGJ5IHRoZSBmaXJzdCBzdHJlYW0gYW5kXG4gICAgLy8ga2VwdCB3aGlsZSBhbnkgc3RyZWFtIGlzIGluIGZsaWdodCwgc28gZXZlcnkgdGFiIGJlaGluZCBhIHNoYXJlZCB3b3JrZXJcbiAgICAvLyBwdWJsaXNoZXMgdG8gYW5kIHJlYWRzIGZyb20gdGhlIHNhbWUgdG9waWMuXG4gICAgZW5kSWQgPSAnJztcbiAgICAvLyBQaWNrZWQgZnJlc2ggd2l0aCB0aGUgZW5kSWQgZm9yIGVhY2ggcnVuIG9mIHN0cmVhbXMsIHNvIGVhY2ggcnVuIHJlYWRzIGFcbiAgICAvLyB0b3BpYyBvZiBpdHMgb3duOiB0aGUgcHJldmlvdXMgcnVuJ3MgdG9waWMgbWF5IGhhdmUgYmVlbiByZWxlYXNlZCBieSB0aGVcbiAgICAvLyBzZXJ2ZXIgd2hpbGUgdGhlIHBhZ2Ugc2F0IGlkbGUsIGFuZCBpdHMgY3Vyc29yIG1lYW5zIG5vdGhpbmcgaGVyZS5cbiAgICBkb3dubGlua0lkID0gJyc7XG4gICAgcGVuZGluZyA9IG5ldyBNYXAoKTtcbiAgICBjb3VudGVyID0gMDtcbiAgICAvLyBMYXN0IHNlcXVlbmNlIGFwcGxpZWQ7IHRoZSBkb3dubGluayByZXN1bWVzIGZyb20gaGVyZSBvbiByZWNvbm5lY3QuIFN0YXJ0c1xuICAgIC8vIGVhY2ggcnVuIGF0IDAgc28gdGhlIGZpcnN0IGNvbm5lY3QgcmVwbGF5cyBhbnl0aGluZyBwdWJsaXNoZWQgYmVmb3JlIGl0XG4gICAgLy8gc3Vic2NyaWJlZCAodGhlIHVwbGluayBQT1NUIGFuZCB0aGUgZG93bmxpbmsgb3BlbiByYWNlKS5cbiAgICBjdXJzb3IgPSAwO1xuICAgIGRvd25saW5rT3BlbiA9IGZhbHNlO1xuICAgIGFib3J0ID0gbnVsbDtcbiAgICAvLyBCdW1wZWQgd2hlbmV2ZXIgYSByZWFkIGxvb3Agc3RhcnRzIG9yIHRoZSBkb3dubGluayBpcyBjbG9zZWQsIHNvIGFcbiAgICAvLyByZXRpcmVkIGxvb3AgKGNsb3NlZCB3aGlsZSBpdCB3YXMgbWlkLWF3YWl0KSBub3RpY2VzIGFuZCBleGl0cyBpbnN0ZWFkXG4gICAgLy8gb2YgZmlnaHRpbmcgYSBuZXdlciBsb29wIGZvciB0aGUgY29ubmVjdGlvbi5cbiAgICBsb29wR2VuID0gMDtcbiAgICByZWNvbm5lY3REZWxheTtcbiAgICBtYXhSZWNvbm5lY3REZWxheTtcbiAgICByZWNvbm5lY3RXaW5kb3c7XG4gICAgZmV0Y2hJbXBsO1xuICAgIF90cmFuc3BvcnQgPSB7fTtcbiAgICAvLyBSZXNvbHZlcyB0aGUgY3VycmVudCBpZGxlIHBhdXNlIGVhcmx5IChhIG5ldyBzdHJlYW0gc3RhcnRlZCkuXG4gICAgd2FrZVVwID0gbnVsbDtcbiAgICAvLyBTZXQgYnkgc3RhcnQoKTogdGhlIHJlYWQgbG9vcCByZXNldHMgaXRzIGlkbGUgYmFja29mZiBvbiB0aGUgbmV4dCB0dXJuLlxuICAgIHdva2VuRm9yTmV3U3RyZWFtID0gZmFsc2U7XG4gICAgY29uc3RydWN0b3Iob3B0cyA9IHt9KSB7XG4gICAgICAgIC8vIE5hdGl2ZSBmZXRjaCBtdXN0IGJlIGludm9rZWQgd2l0aCBgdGhpcyA9PT0gd2luZG93YDsgY2FsbGluZyBpdCBhcyBhXG4gICAgICAgIC8vIG1ldGhvZCBvZiB0aGlzIG9iamVjdCB0aHJvd3MgXCJJbGxlZ2FsIGludm9jYXRpb25cIiwgc28gYmluZCBpdC5cbiAgICAgICAgLy8gZ2xvYmFsVGhpcyBpcyB3aW5kb3cgb24gYSBwYWdlIGFuZCBzZWxmIGluIGEgd29ya2VyLlxuICAgICAgICB0aGlzLmZldGNoSW1wbCA9IG9wdHMuZmV0Y2hJbXBsID8/IGZldGNoLmJpbmQoZ2xvYmFsVGhpcyk7XG4gICAgICAgIHRoaXMucmVjb25uZWN0RGVsYXkgPSBvcHRzLnJlY29ubmVjdERlbGF5ID8/IDEwMDA7XG4gICAgICAgIHRoaXMubWF4UmVjb25uZWN0RGVsYXkgPSBvcHRzLm1heFJlY29ubmVjdERlbGF5ID8/IDUwMDA7XG4gICAgICAgIHRoaXMucmVjb25uZWN0V2luZG93ID0gb3B0cy5yZWNvbm5lY3RXaW5kb3cgPz8gMzAwMDA7XG4gICAgICAgIHRoaXMuY29uZmlndXJlKG9wdHMpO1xuICAgIH1cbiAgICAvKiogQWRvcHQgdGhlIHNlcnZlcidzIGRvd25saW5rIG1vZGUgKHRoZSB3b3JrZXIgaG9zdCBsZWFybnMgaXQgZnJvbSB0aGUgcGFnZSkuICovXG4gICAgY29uZmlndXJlKHRyYW5zcG9ydCkge1xuICAgICAgICBpZiAodHJhbnNwb3J0Lm1vZGUpIHtcbiAgICAgICAgICAgIHRoaXMuX3RyYW5zcG9ydC5tb2RlID0gdHJhbnNwb3J0Lm1vZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0cmFuc3BvcnQucG9sbEludGVydmFsID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdGhpcy5fdHJhbnNwb3J0LnBvbGxJbnRlcnZhbCA9IHRyYW5zcG9ydC5wb2xsSW50ZXJ2YWw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IHRyYW5zcG9ydCgpIHtcbiAgICAgICAgcmV0dXJuIHsgLi4udGhpcy5fdHJhbnNwb3J0IH07XG4gICAgfVxuICAgIGdldCBhY3RpdmVDb3VudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGVuZGluZy5zaXplO1xuICAgIH1cbiAgICAvKiogVGhlIGVuZElkIHRoaXMgY29ubmVjdGlvbiBpcyBjdXJyZW50bHkga2V5ZWQgb24gKGVtcHR5IHdoZW4gaWRsZSkuICovXG4gICAgZ2V0IGNvbm5lY3Rpb25FbmRJZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5kSWQ7XG4gICAgfVxuICAgIC8qKiBBcHBlbmQgdGhlIHNpZ25lZCBlbmRJZCBzbyB0aGUgc2VydmVyIGNhbiBkZXJpdmUgKGFuZCBhdXRob3JpemUpIHRoZVxuICAgICAqIGNvbm5lY3Rpb24gdG9waWMuIFRoZSBzZXJ2ZXIgbmV2ZXIgdHJ1c3RzIGEgY2xpZW50LXN1cHBsaWVkIHRvcGljIGlkLiAqL1xuICAgIHN0cmVhbVVybCh1cmwpIHtcbiAgICAgICAgaWYgKCF0aGlzLmVuZElkKSB7XG4gICAgICAgICAgICByZXR1cm4gdXJsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRlbGltID0gdXJsLmluY2x1ZGVzKCc/JykgPyAnJicgOiAnPyc7XG4gICAgICAgIHJldHVybiAoYCR7dXJsfSR7ZGVsaW19ZW5kSWQ9JHtlbmNvZGVVUklDb21wb25lbnQodGhpcy5lbmRJZCl9YCArXG4gICAgICAgICAgICBgJmRvd25saW5rSWQ9JHtlbmNvZGVVUklDb21wb25lbnQodGhpcy5kb3dubGlua0lkKX1gKTtcbiAgICB9XG4gICAgcnVuKHVybCwgaW5pdCwgZW5kSWQsIHBheWxvYWQsIG9uRnJhbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnQodXJsLCBpbml0LCBlbmRJZCwgcGF5bG9hZCwgb25GcmFtZSkuc2V0dGxlZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogYHJ1bmAsIGFsc28gaGFuZGluZyBiYWNrIHRoZSByZXF1ZXN0IGlkIHNvIHRoZSBjYWxsZXIgY2FuIGBjYW5jZWxgIHRoZVxuICAgICAqIHN0cmVhbSBsYXRlciAodGhlIHdvcmtlciBob3N0IGRvZXMsIGZvciBhIHRhYiB0aGF0IHdlbnQgYXdheSkuXG4gICAgICovXG4gICAgc3RhcnQodXJsLCBpbml0LCBlbmRJZCwgcGF5bG9hZCwgb25GcmFtZSkge1xuICAgICAgICBpZiAodGhpcy5wZW5kaW5nLnNpemUgPT09IDAgfHwgIXRoaXMuZW5kSWQpIHtcbiAgICAgICAgICAgIC8vIE5vdGhpbmcgaW4gZmxpZ2h0OiB0aGlzIHN0cmVhbSdzIHBhZ2Uga2V5cyB0aGUgY29ubmVjdGlvbi4gV2hpbGVcbiAgICAgICAgICAgIC8vIHN0cmVhbXMgYXJlIGluIGZsaWdodCB0aGUga2V5IHN0YXlzIHB1dCwgc28gYSBzdHJlYW0gZnJvbVxuICAgICAgICAgICAgLy8gYW5vdGhlciB0YWIgKHNoYXJlZCB3b3JrZXIpIGxhbmRzIG9uIHRoZSBzYW1lIHRvcGljLlxuICAgICAgICAgICAgdGhpcy5lbmRJZCA9IGVuZElkIHx8ICcnO1xuICAgICAgICAgICAgdGhpcy5kb3dubGlua0lkID0gZ2VuSWQoKTtcbiAgICAgICAgICAgIHRoaXMuY3Vyc29yID0gMDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXF1ZXN0SWQgPSBgJHt0aGlzLmxvY2FsSWR9LSR7Kyt0aGlzLmNvdW50ZXJ9YDtcbiAgICAgICAgY29uc3Qgc2V0dGxlZCA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZy5zZXQocmVxdWVzdElkLCB7XG4gICAgICAgICAgICAgICAgb25GcmFtZSxcbiAgICAgICAgICAgICAgICByZXNvbHZlLFxuICAgICAgICAgICAgICAgIHJlamVjdCxcbiAgICAgICAgICAgICAgICBhY2tlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgZ290RnJhbWU6IGZhbHNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIFVwbGluayBQT1NUOiByZXR1cm5zIGEgZmFzdCBhY2s7IHRoZSBvdXRwdXRzIGFycml2ZSBvbiB0aGUgZG93bmxpbmssXG4gICAgICAgIC8vIHdoaWNoIG9wZW5zIG9uY2UgdGhlIGFjayBpcyBpbi5cbiAgICAgICAgdGhpcy5mZXRjaEltcGwodGhpcy5zdHJlYW1VcmwodXJsKSwge1xuICAgICAgICAgICAgLi4uaW5pdCxcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgIC4uLnBheWxvYWQsXG4gICAgICAgICAgICAgICAgc3RyZWFtQ29ubmVjdGlvbjogeyByZXF1ZXN0SWQgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKHJlcyA9PiB0aGlzLmNoZWNrVXBsaW5rKHJlcXVlc3RJZCwgcmVzLCB1cmwsIGluaXQpKVxuICAgICAgICAgICAgLmNhdGNoKGVyciA9PiB0aGlzLmZhaWwocmVxdWVzdElkLCBlcnIpKTtcbiAgICAgICAgcmV0dXJuIHsgcmVxdWVzdElkLCBzZXR0bGVkIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFiYW5kb24gb25lIGluLWZsaWdodCBjYWxsYmFjayB3aG9zZSBjb25zdW1lciBpcyBnb25lOiBzdG9wIHdhaXRpbmcgZm9yXG4gICAgICogaXRzIGZyYW1lcyAodGhleSBhcmUgZHJvcHBlZCBvbiBhcnJpdmFsKSBhbmQgdGVsbCB0aGUgc2VydmVyIHRvIGNhbmNlbFxuICAgICAqIGl0LCBzbyBpdCBkb2VzIG5vdCBydW4gdG8gY29tcGxldGlvbiBmb3Igbm9ib2R5LiBJdHMgcHJvbWlzZSByZWplY3RzLlxuICAgICAqL1xuICAgIGNhbmNlbChyZXF1ZXN0SWQsIHVybCwgaW5pdCkge1xuICAgICAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5wZW5kaW5nLmdldChyZXF1ZXN0SWQpO1xuICAgICAgICBpZiAoIXBlbmRpbmcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBlbmRpbmcuZGVsZXRlKHJlcXVlc3RJZCk7XG4gICAgICAgIHBlbmRpbmcucmVqZWN0KG5ldyBFcnJvcignU3RyZWFtaW5nIGNhbGxiYWNrIGNhbmNlbGxlZCcpKTtcbiAgICAgICAgdGhpcy5mZXRjaEltcGwodGhpcy5zdHJlYW1VcmwodXJsKSwge1xuICAgICAgICAgICAgLi4uaW5pdCxcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBzdHJlYW1DYW5jZWw6IHsgcmVxdWVzdElkIH0gfSlcbiAgICAgICAgfSkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICAgICAgdGhpcy5zdG9wRG93bmxpbmtJZklkbGUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHVwbGluayByZXR1cm5zIGEgZmFzdCBhY2sgKDIwMCk7IHRoZSBmcmFtZXMgdGhlbiBhcnJpdmUgb24gdGhlXG4gICAgICogZG93bmxpbmssIHNvIG1ha2Ugc3VyZSBvbmUgaXMgb3Blbi4gQW55IG5vbi1vayBzdGF0dXMgKGUuZy4gNDAzIHdoZW4gdGhlXG4gICAgICogY29ubmVjdGlvbiBkaWQgbm90IHZlcmlmeSkgbWVhbnMgbm8gZnJhbWVzIGFyZSBjb21pbmcsIHNvIGZhaWwgdGhlXG4gICAgICogcmVxdWVzdCBsb3VkbHkgcmF0aGVyIHRoYW4gbGVhdmUgdGhlIGNhbGxiYWNrIHBlbmRpbmcgZm9yZXZlci5cbiAgICAgKi9cbiAgICBjaGVja1VwbGluayhyZXF1ZXN0SWQsIHJlcywgdXJsLCBpbml0KSB7XG4gICAgICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgICAgICB0aGlzLmZhaWwocmVxdWVzdElkLCBuZXcgRXJyb3IoYHN0cmVhbSB1cGxpbmsgcmVzcG9uZGVkICR7cmVzLnN0YXR1c31gKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGVuZGluZyA9IHRoaXMucGVuZGluZy5nZXQocmVxdWVzdElkKTtcbiAgICAgICAgaWYgKHBlbmRpbmcpIHtcbiAgICAgICAgICAgIHBlbmRpbmcuYWNrZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5lbnN1cmVEb3dubGluayh1cmwsIGluaXQpO1xuICAgICAgICAgICAgLy8gQSBwb2xsaW5nIGRvd25saW5rIG1heSBiZSBwYXVzaW5nIGJldHdlZW4gcG9sbHM6IHRoaXMgc3RyZWFtJ3NcbiAgICAgICAgICAgIC8vIGZpcnN0IGZyYW1lIHNob3VsZCBub3Qgd2FpdCBvdXQgdGhhdCBwYXVzZS5cbiAgICAgICAgICAgIHRoaXMud29rZW5Gb3JOZXdTdHJlYW0gPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy53YWtlVXA/LigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKiBXaGV0aGVyIGFueSBhY2tub3dsZWRnZWQgY2FsbGJhY2sgaXMgc3RpbGwgd2FpdGluZyBvbiB0aGUgZG93bmxpbmsuICovXG4gICAgaGFzQWNrZWQoKSB7XG4gICAgICAgIGZvciAoY29uc3QgcCBvZiB0aGlzLnBlbmRpbmcudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIGlmIChwLmFja2VkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvKiogUm91dGUgb25lIGRvd25saW5rIGVudmVsb3BlIHRvIGl0cyBjYWxsYmFjay4gUHVibGljIGZvciB0ZXN0aW5nLiAqL1xuICAgIGRpc3BhdGNoRW52ZWxvcGUoZW52ZWxvcGUpIHtcbiAgICAgICAgaWYgKGVudmVsb3BlLnJlc2V0KSB7XG4gICAgICAgICAgICAvLyBPdXIgY3Vyc29yIHBvaW50cyBpbnRvIGEgc2VydmVyIGluY2FybmF0aW9uIHRoYXQgbG9zdCBvdXIgZnJhbWVzXG4gICAgICAgICAgICAvLyAoaXQgcmVzdGFydGVkLCBvciB0aGUgc3RvcmFnZSBvd25lciBjaGFuZ2VkKS4gUmVzZXQgdG8gdGhlIGhlYWQgc29cbiAgICAgICAgICAgIC8vIGEgbGF0ZXIgZG93bmxpbmsgc3RhcnRzIGZyb20gd2hhdCB0aGUgZnJlc2ggdG9waWMgYWN0dWFsbHkgaGFzLFxuICAgICAgICAgICAgLy8gYW5kIHNldHRsZSB0aGUgY2FsbGJhY2tzIGluIGZsaWdodDogdGhlIGZyYW1lcyB0aGV5IHdlcmUgd2FpdGluZ1xuICAgICAgICAgICAgLy8gb24gYXJlIGdvbmUsIGFuZCBhZnRlciBhIHJlc3RhcnQgbm90aGluZyB3aWxsIGV2ZXIgZmluaXNoIHRoZW0uXG4gICAgICAgICAgICB0aGlzLmN1cnNvciA9IDA7XG4gICAgICAgICAgICB0aGlzLnNldHRsZUFsbChuZXcgRXJyb3IoJ3N0cmVhbSByZXNldDogdGhlIHNlcnZlciBsb3N0IHRoaXMgY29ubmVjdGlvbiAocmVzdGFydCBvciBvd25lciBjaGFuZ2UpJykpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZW52ZWxvcGUuc2VxID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdGhpcy5jdXJzb3IgPSBlbnZlbG9wZS5zZXE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVudmVsb3BlLnJpZCA9PT0gdW5kZWZpbmVkIHx8IGVudmVsb3BlLmZyYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5wZW5kaW5nLmdldChlbnZlbG9wZS5yaWQpO1xuICAgICAgICBpZiAoIXBlbmRpbmcpIHtcbiAgICAgICAgICAgIC8vIEEgZnJhbWUgZm9yIGEgY2FsbGJhY2sgd2UgYWxyZWFkeSByZXNvbHZlZCAoZS5nLiBhIHJlcGxheWVkXG4gICAgICAgICAgICAvLyBkdXBsaWNhdGUgYWZ0ZXIgcmVjb25uZWN0KSAtLSBzYWZlIHRvIGRyb3AuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBmcmFtZSB9ID0gZW52ZWxvcGU7XG4gICAgICAgIGlmIChmcmFtZS5kb25lKSB7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmcuZGVsZXRlKGVudmVsb3BlLnJpZCk7XG4gICAgICAgICAgICBpZiAoZnJhbWUuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBwZW5kaW5nLnJlamVjdChuZXcgRXJyb3IoZnJhbWUuZXJyb3IubWVzc2FnZSB8fCAnU3RyZWFtaW5nIGNhbGxiYWNrIGVycm9yJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcGVuZGluZy5yZXNvbHZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnN0b3BEb3dubGlua0lmSWRsZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcGVuZGluZy5nb3RGcmFtZSA9IHRydWU7XG4gICAgICAgICAgICBwZW5kaW5nLm9uRnJhbWUoZnJhbWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBkb3dubGluayBpcyBnb25lIGZvciBnb29kIChyZWZ1c2VkIGJ5IHRoZSBzZXJ2ZXIsIHJlc2V0LCBvclxuICAgICAqIHVucmVhY2hhYmxlIHBhc3QgdGhlIHJlY29ubmVjdCB3aW5kb3cpLiBDYWxsYmFja3MgdGhhdCBhbHJlYWR5IGFwcGxpZWRcbiAgICAgKiBmcmFtZXMgcmVzb2x2ZSBzbyB0aG9zZSBmcmFtZXMgc3RheSBvbiB0aGUgcGFnZTsgb25lcyB0aGF0IG5ldmVyIGdvdCBhXG4gICAgICogZnJhbWUgcmVqZWN0IHdpdGggYGVycmAsIGFuZCB0aGUgcmVhZCBsb29wIHdpbmRzIGRvd24gc2luY2Ugbm90aGluZyBpc1xuICAgICAqIHBlbmRpbmcgYW55IG1vcmUuXG4gICAgICovXG4gICAgc2V0dGxlQWxsKGVycikge1xuICAgICAgICBjb25zdCBwZW5kaW5nID0gQXJyYXkuZnJvbSh0aGlzLnBlbmRpbmcudmFsdWVzKCkpO1xuICAgICAgICB0aGlzLnBlbmRpbmcuY2xlYXIoKTtcbiAgICAgICAgLy8gQ2xvc2UgYmVmb3JlIHNldHRsaW5nOiBhIGNvbnRpbnVhdGlvbiBvZiBhIHNldHRsZWQgcHJvbWlzZSBtYXkgc3RhcnRcbiAgICAgICAgLy8gYSBuZXcgc3RyZWFtIHJpZ2h0IGF3YXksIGFuZCBpdCBtdXN0IGdldCBhIGZyZXNoIGRvd25saW5rIHJhdGhlclxuICAgICAgICAvLyB0aGFuIGZpbmQgdGhpcyBvbmUgc3RpbGwgbWFya2VkIG9wZW4uXG4gICAgICAgIHRoaXMuY2xvc2VEb3dubGluaygpO1xuICAgICAgICBwZW5kaW5nLmZvckVhY2gocCA9PiAocC5nb3RGcmFtZSA/IHAucmVzb2x2ZSgpIDogcC5yZWplY3QoZXJyKSkpO1xuICAgIH1cbiAgICBmYWlsKHJlcXVlc3RJZCwgZXJyKSB7XG4gICAgICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlzLnBlbmRpbmcuZ2V0KHJlcXVlc3RJZCk7XG4gICAgICAgIGlmIChwZW5kaW5nKSB7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmcuZGVsZXRlKHJlcXVlc3RJZCk7XG4gICAgICAgICAgICBwZW5kaW5nLnJlamVjdChlcnIpO1xuICAgICAgICAgICAgdGhpcy5zdG9wRG93bmxpbmtJZklkbGUoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdG9wRG93bmxpbmtJZklkbGUoKSB7XG4gICAgICAgIGlmICh0aGlzLmRvd25saW5rT3BlbiAmJiAhdGhpcy5oYXNBY2tlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlRG93bmxpbmsoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKiogUmV0aXJlIHRoZSBjdXJyZW50IHJlYWQgbG9vcCBhbmQgZW5kIGl0cyBjb25uZWN0aW9uLiAqL1xuICAgIGNsb3NlRG93bmxpbmsoKSB7XG4gICAgICAgIGNvbnN0IGFib3J0ID0gdGhpcy5hYm9ydDtcbiAgICAgICAgdGhpcy5hYm9ydCA9IG51bGw7XG4gICAgICAgIHRoaXMuZG93bmxpbmtPcGVuID0gZmFsc2U7XG4gICAgICAgIHRoaXMubG9vcEdlbisrO1xuICAgICAgICB0aGlzLndha2VVcD8uKCk7XG4gICAgICAgIGlmIChhYm9ydCkge1xuICAgICAgICAgICAgYWJvcnQuYWJvcnQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbnN1cmVEb3dubGluayh1cmwsIGluaXQpIHtcbiAgICAgICAgaWYgKHRoaXMuZG93bmxpbmtPcGVuKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kb3dubGlua09wZW4gPSB0cnVlO1xuICAgICAgICAvLyBGaXJlLWFuZC1mb3JnZXQgcmVhZCBsb29wOyBpdCBleGl0cyB3aGVuIG5vIGNhbGxiYWNrcyByZW1haW4uXG4gICAgICAgIHRoaXMucmVhZExvb3AodXJsLCBpbml0LCArK3RoaXMubG9vcEdlbik7XG4gICAgfVxuICAgIGFzeW5jIHJlYWRMb29wKHVybCwgaW5pdCwgZ2VuKSB7XG4gICAgICAgIGNvbnN0IHBvbGxpbmcgPSB0aGlzLl90cmFuc3BvcnQubW9kZSA9PT0gJ3BvbGwnO1xuICAgICAgICBjb25zdCBiYXNlID0gdGhpcy5fdHJhbnNwb3J0LnBvbGxJbnRlcnZhbCA/PyBERUZBVUxUX1BPTExfSU5URVJWQUw7XG4gICAgICAgIGxldCBpZGxlUGF1c2UgPSBiYXNlO1xuICAgICAgICBsZXQgZW1wdHlQb2xscyA9IDA7XG4gICAgICAgIGxldCB1bnJlYWNoYWJsZVNpbmNlID0gbnVsbDtcbiAgICAgICAgbGV0IGRlbGF5ID0gdGhpcy5yZWNvbm5lY3REZWxheTtcbiAgICAgICAgd2hpbGUgKHRoaXMuaGFzQWNrZWQoKSAmJiB0aGlzLmxvb3BHZW4gPT09IGdlbikge1xuICAgICAgICAgICAgaWYgKHRoaXMud29rZW5Gb3JOZXdTdHJlYW0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLndva2VuRm9yTmV3U3RyZWFtID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgZW1wdHlQb2xscyA9IDA7XG4gICAgICAgICAgICAgICAgaWRsZVBhdXNlID0gYmFzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYWJvcnQgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICAgICAgICBsZXQgcmVjZWl2ZWQgPSAwO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmZldGNoSW1wbCh0aGlzLnN0cmVhbVVybCh1cmwpLCB7XG4gICAgICAgICAgICAgICAgICAgIC4uLmluaXQsXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgICAgICBzaWduYWw6IHRoaXMuYWJvcnQuc2lnbmFsLFxuICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1Eb3dubGluazogeyBmcm9tOiB0aGlzLmN1cnNvciB9XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlcy5zdGF0dXMgPj0gNDAwICYmIHJlcy5zdGF0dXMgPCA1MDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHNlcnZlciByZWZ1c2VzIHRoaXMgY29ubmVjdGlvbiBvdXRyaWdodCwgdHlwaWNhbGx5XG4gICAgICAgICAgICAgICAgICAgIC8vIDQwMyBhZnRlciBhIHJlc3RhcnQgbWludGVkIGEgbmV3IHNpZ25pbmcgc2VjcmV0IHNvIG91clxuICAgICAgICAgICAgICAgICAgICAvLyBlbmRJZCBubyBsb25nZXIgdmVyaWZpZXMuIFJldHJ5aW5nIGNhbm5vdCBmaXggdGhhdC5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0bGVBbGwobmV3IEVycm9yKGBzdHJlYW0gZG93bmxpbmsgcmVzcG9uZGVkICR7cmVzLnN0YXR1c31gKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXJlcy5vayB8fCAhcmVzLmJvZHkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBkb3dubGluayByZXNwb25kZWQgJHtyZXMuc3RhdHVzfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZWNlaXZlZCA9IGF3YWl0IHRoaXMuY29uc3VtZShyZXMuYm9keSwgZ2VuKTtcbiAgICAgICAgICAgICAgICBpZiAocmVjZWl2ZWQgPT09IDAgJiYgIXBvbGxpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQWNjZXB0ZWQgdGhlbiBjbG9zZWQgd2l0aG91dCBhIHNpbmdsZSBlbnZlbG9wZSAoYSBzZXJ2ZXJcbiAgICAgICAgICAgICAgICAgICAgLy8gbWlkLXNodXRkb3duLCBhIHByb3h5IGRyb3BwaW5nIGlkbGUgY29ubmVjdGlvbnMpOiBiYWNrXG4gICAgICAgICAgICAgICAgICAgIC8vIG9mZiBsaWtlIGEgZmFpbHVyZSBpbnN0ZWFkIG9mIHJlY29ubmVjdGluZyBpbiBhIGJ1cnN0LlxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Rvd25saW5rIGNsb3NlZCB3aXRob3V0IGRhdGEnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQSBwcm9kdWN0aXZlIGNvbm5lY3Rpb24gZW5kZWQgKHByb3h5IHRpbWVvdXQsIHdvcmtlclxuICAgICAgICAgICAgICAgIC8vIHJlY3ljbGUpIG9yIGEgcG9sbCBjb21wbGV0ZWQ6IGZyZXNoIGJhY2tvZmYuXG4gICAgICAgICAgICAgICAgdW5yZWFjaGFibGVTaW5jZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgZGVsYXkgPSB0aGlzLnJlY29ubmVjdERlbGF5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5oYXNBY2tlZCgpIHx8IHRoaXMubG9vcEdlbiAhPT0gZ2VuKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBjbG9zZWQgb24gcHVycG9zZTogaWRsZSwgb3Igc2V0dGxlZCBhbmQgcmV0aXJlZFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBHZW51aW5lIGRyb3Agd2l0aCB3b3JrIG91dHN0YW5kaW5nOiByZWNvbm5lY3QgZnJvbSB0aGVcbiAgICAgICAgICAgICAgICAvLyBjdXJzb3IsIGJhY2tpbmcgb2ZmLCB1bnRpbCB0aGUgc2VydmVyIGhhcyBiZWVuIHVucmVhY2hhYmxlXG4gICAgICAgICAgICAgICAgLy8gZm9yIHRoZSB3aG9sZSB3aW5kb3cuIFBhc3QgdGhhdCB0aGUgY2FsbGJhY2tzIGFyZSBsb3N0LlxuICAgICAgICAgICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgdW5yZWFjaGFibGVTaW5jZSA9IHVucmVhY2hhYmxlU2luY2UgPz8gbm93O1xuICAgICAgICAgICAgICAgIGlmIChub3cgLSB1bnJlYWNoYWJsZVNpbmNlID49IHRoaXMucmVjb25uZWN0V2luZG93KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0dGxlQWxsKG5ldyBFcnJvcignc3RyZWFtIGRvd25saW5rIGxvc3Q6IGNvdWxkIG5vdCByZWNvbm5lY3QgdG8gdGhlIHNlcnZlcicpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGF3YWl0IHNsZWVwKGRlbGF5KTtcbiAgICAgICAgICAgICAgICBkZWxheSA9IE1hdGgubWluKGRlbGF5ICogMiwgdGhpcy5tYXhSZWNvbm5lY3REZWxheSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocG9sbGluZyAmJiB0aGlzLmhhc0Fja2VkKCkgJiYgdGhpcy5sb29wR2VuID09PSBnZW4pIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgcmVzcG9uc2Ugd2FzIG9uZSBwb2xsLiBGcmFtZXMgY2FtZTogcG9sbCBhZ2FpbiBzb29uLlxuICAgICAgICAgICAgICAgIC8vIE5vdGhpbmcgY2FtZToga2VlcCB0aGUgcGFjZSBmb3IgYSBmZXcgcG9sbHMsIHRoZW4gYmFjayBvZmZcbiAgICAgICAgICAgICAgICAvLyB1cCB0byBhIGJvdW5kLCB1bnRpbCBmcmFtZXMgb3IgYSBuZXcgc3RyZWFtIHdha2UgdXMuXG4gICAgICAgICAgICAgICAgaWYgKHJlY2VpdmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGVtcHR5UG9sbHMgPSAwO1xuICAgICAgICAgICAgICAgICAgICBpZGxlUGF1c2UgPSBiYXNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICgrK2VtcHR5UG9sbHMgPiBFTVBUWV9QT0xMU19CRUZPUkVfQkFDS09GRikge1xuICAgICAgICAgICAgICAgICAgICBpZGxlUGF1c2UgPSBNYXRoLm1pbihpZGxlUGF1c2UgKiAyLCBiYXNlICogTUFYX0JBQ0tPRkZfRkFDVE9SKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wYXVzZShpZGxlUGF1c2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmxvb3BHZW4gPT09IGdlbikge1xuICAgICAgICAgICAgdGhpcy5kb3dubGlua09wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuYWJvcnQgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKiBTbGVlcCBmb3IgYG1zYCwgb3IgdW50aWwgYSBuZXcgc3RyZWFtIHN0YXJ0cyBvciB0aGUgZG93bmxpbmsgY2xvc2VzLiAqL1xuICAgIHBhdXNlKG1zKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy53YWtlVXAgPSBudWxsO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH0sIG1zKTtcbiAgICAgICAgICAgIHRoaXMud2FrZVVwID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgICAgICAgdGhpcy53YWtlVXAgPSBudWxsO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKiogUmVsYXkgZW52ZWxvcGVzIHVudGlsIHRoZSBjb25uZWN0aW9uIGVuZHM7IHJldHVybnMgaG93IG1hbnkgYXJyaXZlZC4gKi9cbiAgICBhc3luYyBjb25zdW1lKGJvZHksIGdlbikge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBib2R5LmdldFJlYWRlcigpO1xuICAgICAgICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG4gICAgICAgIGxldCBidWZmZXIgPSAnJztcbiAgICAgICAgbGV0IHJlY2VpdmVkID0gMDtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgY29uc3QgeyBkb25lLCB2YWx1ZSB9ID0gYXdhaXQgcmVhZGVyLnJlYWQoKTtcbiAgICAgICAgICAgIGlmIChkb25lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlY2VpdmVkOyAvLyBjb25uZWN0aW9uIGVuZGVkIC0+IHRoZSByZWFkIGxvb3AgZGVjaWRlc1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnVmZmVyICs9IGRlY29kZXIuZGVjb2RlKHZhbHVlLCB7IHN0cmVhbTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIGxldCBubDtcbiAgICAgICAgICAgIHdoaWxlICgobmwgPSBidWZmZXIuaW5kZXhPZignXFxuJykpID49IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsaW5lID0gYnVmZmVyLnNsaWNlKDAsIG5sKTtcbiAgICAgICAgICAgICAgICBidWZmZXIgPSBidWZmZXIuc2xpY2UobmwgKyAxKTtcbiAgICAgICAgICAgICAgICBpZiAoIWxpbmUudHJpbSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBrZWVwYWxpdmUgYmxhbmsgbGluZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5sb29wR2VuICE9PSBnZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUmV0aXJlZCB3aGlsZSByZWFkaW5nOiBhIG5ld2VyIHJ1biBvd25zIHRoZSBjdXJzb3IuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWNlaXZlZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQrKztcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRW52ZWxvcGUoSlNPTi5wYXJzZShsaW5lKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIFRoZSBwYWdlJ3MgZW5kIG9mIHRoZSBTaGFyZWRXb3JrZXIgdHJhbnNwb3J0OiBmb3J3YXJkcyBlYWNoIHN0cmVhbSB0byB0aGVcbiAqIHdvcmtlciBhbmQgcm91dGVzIGl0cyBmcmFtZXMgYmFjayB0byB0aGUgY2FsbGJhY2sgdGhhdCBzdGFydGVkIGl0LlxuICovXG5leHBvcnQgY2xhc3MgU2hhcmVkU3RyZWFtQ2xpZW50IHtcbiAgICBwZW5kaW5nID0gbmV3IE1hcCgpO1xuICAgIGNvdW50ZXIgPSAwO1xuICAgIHBvcnQ7XG4gICAgcmVuZGVyZXJJZDtcbiAgICB0cmFuc3BvcnQ7XG4gICAgX2Jyb2tlbiA9IGZhbHNlO1xuICAgIGNvbnN0cnVjdG9yKHBvcnQsIHJlbmRlcmVySWQgPSBnZXRSZW5kZXJlcklkKCksIHRyYW5zcG9ydCA9IHt9KSB7XG4gICAgICAgIHRoaXMucG9ydCA9IHBvcnQ7XG4gICAgICAgIHRoaXMucmVuZGVyZXJJZCA9IHJlbmRlcmVySWQ7XG4gICAgICAgIHRoaXMudHJhbnNwb3J0ID0gdHJhbnNwb3J0O1xuICAgICAgICBwb3J0Lm9ubWVzc2FnZSA9IGV2ZW50ID0+IHRoaXMuaGFuZGxlTWVzc2FnZShldmVudC5kYXRhKTtcbiAgICAgICAgcG9ydC5zdGFydD8uKCk7XG4gICAgfVxuICAgIC8qKiBUcnVlIG9uY2UgdGhlIHdvcmtlciBmYWlsZWQ7IGNhbGxlcnMgc2hvdWxkIGZhbGwgYmFjayB0byBgU3RyZWFtQ2xpZW50YC4gKi9cbiAgICBnZXQgYnJva2VuKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYnJva2VuO1xuICAgIH1cbiAgICBnZXQgYWN0aXZlQ291bnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBlbmRpbmcuc2l6ZTtcbiAgICB9XG4gICAgcnVuKHVybCwgaW5pdCwgZW5kSWQsIHBheWxvYWQsIG9uRnJhbWUpIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdElkID0gYCR7dGhpcy5yZW5kZXJlcklkfS0keysrdGhpcy5jb3VudGVyfWA7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmcuc2V0KHJlcXVlc3RJZCwge1xuICAgICAgICAgICAgICAgIG9uRnJhbWUsXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSxcbiAgICAgICAgICAgICAgICByZWplY3QsXG4gICAgICAgICAgICAgICAgYWNrZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGdvdEZyYW1lOiBmYWxzZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdzdHJlYW0nLFxuICAgICAgICAgICAgICAgIHJlbmRlcmVySWQ6IHRoaXMucmVuZGVyZXJJZCxcbiAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgICAgIGluaXQsXG4gICAgICAgICAgICAgICAgZW5kSWQ6IGVuZElkIHx8ICcnLFxuICAgICAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICAgICAgICAgdHJhbnNwb3J0OiB0aGlzLnRyYW5zcG9ydFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMucG9ydC5wb3N0TWVzc2FnZShtZXNzYWdlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoaXMgdGFiIGlzIGdvaW5nIGF3YXkgKHBhZ2VoaWRlKTogaXRzIHN0cmVhbXMgaGF2ZSBubyBjb25zdW1lciBhbnlcbiAgICAgKiBtb3JlLCBzbyB0aGUgd29ya2VyIGNhbmNlbHMgdGhlbSBzZXJ2ZXItc2lkZS5cbiAgICAgKi9cbiAgICByZWxlYXNlKCkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICAgICAgdHlwZTogJ3VucmVnaXN0ZXInLFxuICAgICAgICAgICAgcmVuZGVyZXJJZDogdGhpcy5yZW5kZXJlcklkXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucG9ydC5wb3N0TWVzc2FnZShtZXNzYWdlKTtcbiAgICB9XG4gICAgLyoqIFRoZSB3b3JrZXIgZGllZCBvciBmYWlsZWQgdG8gbG9hZDogcmVqZWN0IGV2ZXJ5dGhpbmcgaW4gZmxpZ2h0LiAqL1xuICAgIGZhaWwoZXJyKSB7XG4gICAgICAgIHRoaXMuX2Jyb2tlbiA9IHRydWU7XG4gICAgICAgIGZvciAoY29uc3QgcGVuZGluZyBvZiB0aGlzLnBlbmRpbmcudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIHBlbmRpbmcucmVqZWN0KGVycik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wZW5kaW5nLmNsZWFyKCk7XG4gICAgfVxuICAgIGhhbmRsZU1lc3NhZ2UobWVzc2FnZSkge1xuICAgICAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5wZW5kaW5nLmdldChtZXNzYWdlLnJlcXVlc3RJZCk7XG4gICAgICAgIGlmICghcGVuZGluZykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnR5cGUgPT09ICdmcmFtZScpIHtcbiAgICAgICAgICAgIHBlbmRpbmcub25GcmFtZShtZXNzYWdlLmZyYW1lKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBlbmRpbmcuZGVsZXRlKG1lc3NhZ2UucmVxdWVzdElkKTtcbiAgICAgICAgaWYgKG1lc3NhZ2UudHlwZSA9PT0gJ2RvbmUnKSB7XG4gICAgICAgICAgICBwZW5kaW5nLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHBlbmRpbmcucmVqZWN0KG5ldyBFcnJvcihtZXNzYWdlLm1lc3NhZ2UpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmxldCBzaW5nbGV0b24gPSBudWxsO1xuLyoqXG4gKiBUaGUgcGFnZSdzIHN0cmVhbWluZyB0cmFuc3BvcnQ6IHRoZSBTaGFyZWRXb3JrZXItaG9zdGVkIGRvd25saW5rIHdoZW4gdGhlXG4gKiBzZXJ2ZXIgcHJvdmlkZXMgdGhlIHdvcmtlciBzY3JpcHQgYW5kIHRoZSBicm93c2VyIHN1cHBvcnRzIFNoYXJlZFdvcmtlcixcbiAqIG90aGVyd2lzZSBhIGRvd25saW5rIG9mIHRoZSBwYWdlJ3Mgb3duLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RyZWFtQ2xpZW50KGNvbmZpZyA9IHt9KSB7XG4gICAgaWYgKHNpbmdsZXRvbiBpbnN0YW5jZW9mIFNoYXJlZFN0cmVhbUNsaWVudCAmJiBzaW5nbGV0b24uYnJva2VuKSB7XG4gICAgICAgIHNpbmdsZXRvbiA9IG51bGw7XG4gICAgfVxuICAgIGlmIChzaW5nbGV0b24pIHtcbiAgICAgICAgcmV0dXJuIHNpbmdsZXRvbjtcbiAgICB9XG4gICAgY29uc3QgdHJhbnNwb3J0ID0ge1xuICAgICAgICBtb2RlOiBjb25maWcuc3RyZWFtPy5tb2RlLFxuICAgICAgICBwb2xsSW50ZXJ2YWw6IGNvbmZpZy5zdHJlYW0/LnBvbGxfaW50ZXJ2YWxcbiAgICB9O1xuICAgIGNvbnN0IHdvcmtlclVybCA9IGNvbmZpZy5zdHJlYW0/Lndvcmtlcl91cmw7XG4gICAgaWYgKHdvcmtlclVybCAmJiB0eXBlb2YgU2hhcmVkV29ya2VyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qgd29ya2VyID0gbmV3IFNoYXJlZFdvcmtlcih3b3JrZXJVcmwsIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnZGFzaC1zdHJlYW0td29ya2VyJ1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBjbGllbnQgPSBuZXcgU2hhcmVkU3RyZWFtQ2xpZW50KHdvcmtlci5wb3J0LCBnZXRSZW5kZXJlcklkKCksIHRyYW5zcG9ydCk7XG4gICAgICAgICAgICB3b3JrZXIub25lcnJvciA9ICgpID0+IGNsaWVudC5mYWlsKG5ldyBFcnJvcignRGFzaCBzdHJlYW0gd29ya2VyIGZhaWxlZCcpKTtcbiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdwYWdlaGlkZScsICgpID0+IGNsaWVudC5yZWxlYXNlKCkpO1xuICAgICAgICAgICAgc2luZ2xldG9uID0gY2xpZW50O1xuICAgICAgICAgICAgcmV0dXJuIHNpbmdsZXRvbjtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAvLyBGYWxsIHRocm91Z2ggdG8gdGhlIGluLXBhZ2UgdHJhbnNwb3J0LlxuICAgICAgICB9XG4gICAgfVxuICAgIHNpbmdsZXRvbiA9IG5ldyBTdHJlYW1DbGllbnQodHJhbnNwb3J0KTtcbiAgICByZXR1cm4gc2luZ2xldG9uO1xufVxuLyoqXG4gKiBXaGV0aGVyIHRoZSBzZXJ2ZXIgb2ZmZXJzIHRoZSBtdWx0aXBsZXhlZCBzdHJlYW1pbmcgdHJhbnNwb3J0IChpLmUuIGl0IGhhcyBhXG4gKiBzaGFyZWQtc3RvcmFnZSBiYWNrZW5kKS4gV2hlbiBmYWxzZSwgc3RyZWFtaW5nIGNhbGxiYWNrcyBmYWxsIGJhY2sgdG8gb25lXG4gKiBOREpTT04gY29ubmVjdGlvbiBlYWNoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJlYW1NdWx0aXBsZXhlZChjb25maWcpIHtcbiAgICByZXR1cm4gISFjb25maWcuc3RyZWFtPy5lbmFibGVkO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgYXN5bmMgKGR1cmF0aW9uKSA9PiB7XG4gICAgbGV0IF9yZXNvbHZlO1xuICAgIGNvbnN0IHAgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IChfcmVzb2x2ZSA9IHJlc29sdmUpKTtcbiAgICBzZXRUaW1lb3V0KF9yZXNvbHZlLCBkdXJhdGlvbik7XG4gICAgcmV0dXJuIHA7XG59O1xuIiwiLyoqXG4gKiBDbGllbnQgZm9yIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgRGFzaCBXZWJTb2NrZXQgU2hhcmVkV29ya2VyLlxuICovXG5pbXBvcnQgeyBnZXRSZW5kZXJlcklkIH0gZnJvbSAnLi9yZW5kZXJlcklkJztcbi8qKiBNZXNzYWdlIHR5cGVzIGZvciB3b3JrZXIgY29tbXVuaWNhdGlvbiAqL1xuZXhwb3J0IHZhciBXb3JrZXJNZXNzYWdlVHlwZTtcbihmdW5jdGlvbiAoV29ya2VyTWVzc2FnZVR5cGUpIHtcbiAgICBXb3JrZXJNZXNzYWdlVHlwZVtcIkNPTk5FQ1RcIl0gPSBcImNvbm5lY3RcIjtcbiAgICBXb3JrZXJNZXNzYWdlVHlwZVtcIkRJU0NPTk5FQ1RcIl0gPSBcImRpc2Nvbm5lY3RcIjtcbiAgICBXb3JrZXJNZXNzYWdlVHlwZVtcIkNBTExCQUNLX1JFUVVFU1RcIl0gPSBcImNhbGxiYWNrX3JlcXVlc3RcIjtcbiAgICBXb3JrZXJNZXNzYWdlVHlwZVtcIkdFVF9QUk9QU19SRVNQT05TRVwiXSA9IFwiZ2V0X3Byb3BzX3Jlc3BvbnNlXCI7XG4gICAgV29ya2VyTWVzc2FnZVR5cGVbXCJUQUJfVklTSUJMRVwiXSA9IFwidGFiX3Zpc2libGVcIjtcbiAgICBXb3JrZXJNZXNzYWdlVHlwZVtcIkNPTk5FQ1RFRFwiXSA9IFwiY29ubmVjdGVkXCI7XG4gICAgV29ya2VyTWVzc2FnZVR5cGVbXCJESVNDT05ORUNURURcIl0gPSBcImRpc2Nvbm5lY3RlZFwiO1xuICAgIFdvcmtlck1lc3NhZ2VUeXBlW1wiQ0FMTEJBQ0tfUkVTUE9OU0VcIl0gPSBcImNhbGxiYWNrX3Jlc3BvbnNlXCI7XG4gICAgV29ya2VyTWVzc2FnZVR5cGVbXCJTRVRfUFJPUFNcIl0gPSBcInNldF9wcm9wc1wiO1xuICAgIFdvcmtlck1lc3NhZ2VUeXBlW1wiU0VUX1BST1BTX0JBVENIXCJdID0gXCJzZXRfcHJvcHNfYmF0Y2hcIjtcbiAgICBXb3JrZXJNZXNzYWdlVHlwZVtcIkdFVF9QUk9QU19SRVFVRVNUXCJdID0gXCJnZXRfcHJvcHNfcmVxdWVzdFwiO1xuICAgIFdvcmtlck1lc3NhZ2VUeXBlW1wiRVJST1JcIl0gPSBcImVycm9yXCI7XG59KShXb3JrZXJNZXNzYWdlVHlwZSB8fCAoV29ya2VyTWVzc2FnZVR5cGUgPSB7fSkpO1xuLyoqXG4gKiBDbGllbnQgZm9yIHRoZSBEYXNoIFdlYlNvY2tldCBTaGFyZWRXb3JrZXIuXG4gKi9cbmNsYXNzIFdvcmtlckNsaWVudCB7XG4gICAgd29ya2VyID0gbnVsbDtcbiAgICByZW5kZXJlcklkO1xuICAgIHBlbmRpbmdDYWxsYmFja3MgPSBuZXcgTWFwKCk7XG4gICAgcmVxdWVzdENvdW50ZXIgPSAwO1xuICAgIGlzQ29ubmVjdGVkID0gZmFsc2U7XG4gICAgY29ubmVjdGlvblByb21pc2UgPSBudWxsO1xuICAgIGNvbm5lY3Rpb25SZXNvbHZlID0gbnVsbDtcbiAgICAvKiogQ2FsbGJhY2sgd2hlbiBTRVRfUFJPUFMgbWVzc2FnZSBpcyByZWNlaXZlZCAqL1xuICAgIG9uU2V0UHJvcHMgPSBudWxsO1xuICAgIC8qKiBDYWxsYmFjayB3aGVuIFNFVF9QUk9QU19CQVRDSCBtZXNzYWdlIGlzIHJlY2VpdmVkICovXG4gICAgb25TZXRQcm9wc0JhdGNoID0gbnVsbDtcbiAgICAvKiogQ2FsbGJhY2sgd2hlbiBHRVRfUFJPUFNfUkVRVUVTVCBtZXNzYWdlIGlzIHJlY2VpdmVkICovXG4gICAgb25HZXRQcm9wc1JlcXVlc3QgPSBudWxsO1xuICAgIC8qKiBDYWxsYmFjayB3aGVuIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQgKi9cbiAgICBvbkNvbm5lY3RlZCA9IG51bGw7XG4gICAgLyoqIENhbGxiYWNrIHdoZW4gY29ubmVjdGlvbiBpcyBsb3N0ICovXG4gICAgb25EaXNjb25uZWN0ZWQgPSBudWxsO1xuICAgIC8qKiBDYWxsYmFjayB3aGVuIGFuIGVycm9yIG9jY3VycyAqL1xuICAgIG9uRXJyb3IgPSBudWxsO1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnJlbmRlcmVySWQgPSBnZXRSZW5kZXJlcklkKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgdGhlIHdvcmtlciBjb25uZWN0aW9uLlxuICAgICAqIEBwYXJhbSB3b3JrZXJVcmwgVVJMIHRvIHRoZSBTaGFyZWRXb3JrZXIgc2NyaXB0XG4gICAgICogQHBhcmFtIHNlcnZlclVybCBXZWJTb2NrZXQgc2VydmVyIFVSTFxuICAgICAqIEBwYXJhbSBpbmFjdGl2aXR5VGltZW91dCBPcHRpb25hbCBpbmFjdGl2aXR5IHRpbWVvdXQgaW4gbXNcbiAgICAgKiBAcGFyYW0gaGVhcnRiZWF0SW50ZXJ2YWwgT3B0aW9uYWwgaGVhcnRiZWF0IGludGVydmFsIGluIG1zXG4gICAgICovXG4gICAgYXN5bmMgY29ubmVjdCh3b3JrZXJVcmwsIHNlcnZlclVybCwgaW5hY3Rpdml0eVRpbWVvdXQsIGhlYXJ0YmVhdEludGVydmFsKSB7XG4gICAgICAgIGlmICh0aGlzLndvcmtlcikge1xuICAgICAgICAgICAgLy8gQWxyZWFkeSBjb25uZWN0ZWRcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBDcmVhdGUgdGhlIFNoYXJlZFdvcmtlclxuICAgICAgICB0aGlzLndvcmtlciA9IG5ldyBTaGFyZWRXb3JrZXIod29ya2VyVXJsLCB7XG4gICAgICAgICAgICBuYW1lOiAnZGFzaC13cy13b3JrZXInXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBTZXQgdXAgbWVzc2FnZSBoYW5kbGluZ1xuICAgICAgICB0aGlzLndvcmtlci5wb3J0Lm9ubWVzc2FnZSA9IHRoaXMuaGFuZGxlTWVzc2FnZS5iaW5kKHRoaXMpO1xuICAgICAgICAvLyBDcmVhdGUgcHJvbWlzZSBmb3IgY29ubmVjdGlvblxuICAgICAgICB0aGlzLmNvbm5lY3Rpb25Qcm9taXNlID0gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25SZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIFN0YXJ0IHRoZSBwb3J0XG4gICAgICAgIHRoaXMud29ya2VyLnBvcnQuc3RhcnQoKTtcbiAgICAgICAgLy8gU2VuZCBjb25uZWN0IG1lc3NhZ2VcbiAgICAgICAgdGhpcy53b3JrZXIucG9ydC5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICB0eXBlOiBXb3JrZXJNZXNzYWdlVHlwZS5DT05ORUNULFxuICAgICAgICAgICAgcmVuZGVyZXJJZDogdGhpcy5yZW5kZXJlcklkLFxuICAgICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgICAgIHNlcnZlclVybCxcbiAgICAgICAgICAgICAgICBpbmFjdGl2aXR5VGltZW91dCxcbiAgICAgICAgICAgICAgICBoZWFydGJlYXRJbnRlcnZhbFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gV2FpdCBmb3IgY29ubmVjdGlvblxuICAgICAgICBhd2FpdCB0aGlzLmNvbm5lY3Rpb25Qcm9taXNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEaXNjb25uZWN0IGZyb20gdGhlIHdvcmtlci5cbiAgICAgKi9cbiAgICBkaXNjb25uZWN0KCkge1xuICAgICAgICBpZiAodGhpcy53b3JrZXIpIHtcbiAgICAgICAgICAgIHRoaXMud29ya2VyLnBvcnQucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgIHR5cGU6IFdvcmtlck1lc3NhZ2VUeXBlLkRJU0NPTk5FQ1QsXG4gICAgICAgICAgICAgICAgcmVuZGVyZXJJZDogdGhpcy5yZW5kZXJlcklkXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMud29ya2VyLnBvcnQuY2xvc2UoKTtcbiAgICAgICAgICAgIHRoaXMud29ya2VyID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzQ29ubmVjdGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvblByb21pc2UgPSBudWxsO1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb25SZXNvbHZlID0gbnVsbDtcbiAgICAgICAgLy8gUmVzb2x2ZSBwZW5kaW5nIGNhbGxiYWNrcyB3aXRoIHByZXZlbnRfdXBkYXRlIHNvIGxvYWRpbmcgc3RhdGVzIGNsZWFyXG4gICAgICAgIGZvciAoY29uc3QgWywgcGVuZGluZ10gb2YgdGhpcy5wZW5kaW5nQ2FsbGJhY2tzKSB7XG4gICAgICAgICAgICBwZW5kaW5nLnJlc29sdmUoeyBzdGF0dXM6ICdwcmV2ZW50X3VwZGF0ZScgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wZW5kaW5nQ2FsbGJhY2tzLmNsZWFyKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVuc3VyZSB0aGUgd29ya2VyIGlzIGNvbm5lY3RlZCwgaW5pdGlhdGluZyBjb25uZWN0aW9uIGlmIG5lZWRlZC5cbiAgICAgKiBAcGFyYW0gY29uZmlnIFRoZSBEYXNoIGNvbmZpZyB3aXRoIHdlYnNvY2tldCBzZXR0aW5nc1xuICAgICAqL1xuICAgIGFzeW5jIGVuc3VyZUNvbm5lY3RlZChjb25maWcpIHtcbiAgICAgICAgLy8gQWxyZWFkeSBjb25uZWN0ZWRcbiAgICAgICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBDb25uZWN0aW9uIGluIHByb2dyZXNzLCB3YWl0IGZvciBpdFxuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uUHJvbWlzZSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jb25uZWN0aW9uUHJvbWlzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBOZWVkIHRvIGluaXRpYXRlIGNvbm5lY3Rpb25cbiAgICAgICAgaWYgKCFjb25maWcud2Vic29ja2V0Py51cmwgfHwgIWNvbmZpZy53ZWJzb2NrZXQ/Lndvcmtlcl91cmwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV2ViU29ja2V0IGNvbmZpZyBub3QgYXZhaWxhYmxlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBTaGFyZWRXb3JrZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NoYXJlZFdvcmtlciBub3Qgc3VwcG9ydGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQnVpbGQgV2ViU29ja2V0IFVSTFxuICAgICAgICBjb25zdCB3c1Byb3RvY29sID0gd2luZG93LmxvY2F0aW9uLnByb3RvY29sID09PSAnaHR0cHM6JyA/ICd3c3M6JyA6ICd3czonO1xuICAgICAgICBjb25zdCBob3N0ID0gd2luZG93LmxvY2F0aW9uLmhvc3Q7XG4gICAgICAgIGNvbnN0IHdzVXJsID0gYCR7d3NQcm90b2NvbH0vLyR7aG9zdH0ke2NvbmZpZy53ZWJzb2NrZXQudXJsfWA7XG4gICAgICAgIGF3YWl0IHRoaXMuY29ubmVjdChjb25maWcud2Vic29ja2V0Lndvcmtlcl91cmwsIHdzVXJsLCBjb25maWcud2Vic29ja2V0LmluYWN0aXZpdHlfdGltZW91dCwgY29uZmlnLndlYnNvY2tldC5oZWFydGJlYXRfaW50ZXJ2YWwpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIGEgY2FsbGJhY2sgcmVxdWVzdCB0byB0aGUgc2VydmVyIHZpYSB0aGUgd29ya2VyLlxuICAgICAqIEBwYXJhbSBwYXlsb2FkIFRoZSBjYWxsYmFjayBwYXlsb2FkXG4gICAgICogQHBhcmFtIG9uRnJhbWUgT3B0aW9uYWwgaGFuZGxlciBmb3IgaW50ZXJtZWRpYXRlIGZyYW1lcyBmcm9tIGFcbiAgICAgKiAgIHN0cmVhbWluZyBjYWxsYmFjazsgdGhlIHJldHVybmVkIHByb21pc2Ugc3RpbGwgcmVzb2x2ZXMgb25jZSB3aXRoXG4gICAgICogICB0aGUgdGVybWluYWwgcmVzcG9uc2UuXG4gICAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGNhbGxiYWNrIHJlc3BvbnNlXG4gICAgICovXG4gICAgYXN5bmMgc2VuZENhbGxiYWNrKHBheWxvYWQsIG9uRnJhbWUpIHtcbiAgICAgICAgLy8gV2FpdCBmb3IgaW5pdGlhbCBjb25uZWN0aW9uIGlmIG9uZSBpcyBpbiBwcm9ncmVzc1xuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uUHJvbWlzZSAmJiAhdGhpcy5pc0Nvbm5lY3RlZCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jb25uZWN0aW9uUHJvbWlzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMud29ya2VyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dvcmtlciBub3QgY29ubmVjdGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVxdWVzdElkID0gYCR7dGhpcy5yZW5kZXJlcklkfS0keysrdGhpcy5yZXF1ZXN0Q291bnRlcn1gO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nQ2FsbGJhY2tzLnNldChyZXF1ZXN0SWQsIHsgcmVzb2x2ZSwgcmVqZWN0LCBvbkZyYW1lIH0pO1xuICAgICAgICAgICAgdGhpcy53b3JrZXIucG9ydC5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgdHlwZTogV29ya2VyTWVzc2FnZVR5cGUuQ0FMTEJBQ0tfUkVRVUVTVCxcbiAgICAgICAgICAgICAgICByZW5kZXJlcklkOiB0aGlzLnJlbmRlcmVySWQsXG4gICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZCBhIGdldF9wcm9wcyByZXNwb25zZSBiYWNrIHRvIHRoZSBzZXJ2ZXIuXG4gICAgICogQHBhcmFtIHJlcXVlc3RJZCBUaGUgcmVxdWVzdCBJRCBmcm9tIHRoZSBnZXRfcHJvcHMgcmVxdWVzdFxuICAgICAqIEBwYXJhbSBwcm9wcyBUaGUgcHJvcGVydHkgdmFsdWVzXG4gICAgICovXG4gICAgc2VuZEdldFByb3BzUmVzcG9uc2UocmVxdWVzdElkLCBwcm9wcykge1xuICAgICAgICBpZiAoIXRoaXMud29ya2VyIHx8ICF0aGlzLmlzQ29ubmVjdGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy53b3JrZXIucG9ydC5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICB0eXBlOiBXb3JrZXJNZXNzYWdlVHlwZS5HRVRfUFJPUFNfUkVTUE9OU0UsXG4gICAgICAgICAgICByZW5kZXJlcklkOiB0aGlzLnJlbmRlcmVySWQsXG4gICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICBwYXlsb2FkOiBwcm9wc1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIHdvcmtlciBpcyBjb25uZWN0ZWQuXG4gICAgICovXG4gICAgZ2V0IGNvbm5lY3RlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNDb25uZWN0ZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE5vdGlmeSB0aGUgd29ya2VyIHRoYXQgdGhlIHRhYiBpcyBub3cgdmlzaWJsZS5cbiAgICAgKiBUaGlzIHJlc2V0cyB0aGUgaW5hY3Rpdml0eSB0aW1lciB0byBwcmV2ZW50IHRpbWVvdXQgd2hpbGUgdXNlciBpcyB2aWV3aW5nLlxuICAgICAqL1xuICAgIG5vdGlmeVRhYlZpc2libGUoKSB7XG4gICAgICAgIGlmICh0aGlzLndvcmtlciAmJiB0aGlzLmlzQ29ubmVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLndvcmtlci5wb3J0LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBXb3JrZXJNZXNzYWdlVHlwZS5UQUJfVklTSUJMRSxcbiAgICAgICAgICAgICAgICByZW5kZXJlcklkOiB0aGlzLnJlbmRlcmVySWRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZU1lc3NhZ2UoZXZlbnQpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGV2ZW50LmRhdGE7XG4gICAgICAgIHN3aXRjaCAobWVzc2FnZS50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFdvcmtlck1lc3NhZ2VUeXBlLkNPTk5FQ1RFRDpcbiAgICAgICAgICAgICAgICB0aGlzLmlzQ29ubmVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uUmVzb2x2ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25SZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvblJlc29sdmUgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vbkNvbm5lY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uQ29ubmVjdGVkKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBXb3JrZXJNZXNzYWdlVHlwZS5ESVNDT05ORUNURUQ6XG4gICAgICAgICAgICAgICAgdGhpcy5pc0Nvbm5lY3RlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIC8vIFJlc29sdmUgcGVuZGluZyBjYWxsYmFja3Mgd2l0aCBwcmV2ZW50X3VwZGF0ZSBzbyBsb2FkaW5nIHN0YXRlcyBjbGVhclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgWywgcGVuZGluZ10gb2YgdGhpcy5wZW5kaW5nQ2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAgICAgICAgIHBlbmRpbmcucmVzb2x2ZSh7IHN0YXR1czogJ3ByZXZlbnRfdXBkYXRlJyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nQ2FsbGJhY2tzLmNsZWFyKCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub25EaXNjb25uZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkRpc2Nvbm5lY3RlZChtZXNzYWdlLnBheWxvYWQ/LnJlYXNvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBXb3JrZXJNZXNzYWdlVHlwZS5DQUxMQkFDS19SRVNQT05TRToge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RJZCA9IG1lc3NhZ2UucmVxdWVzdElkO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlzLnBlbmRpbmdDYWxsYmFja3MuZ2V0KHJlcXVlc3RJZCk7XG4gICAgICAgICAgICAgICAgaWYgKHBlbmRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IG1lc3NhZ2UucGF5bG9hZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBheWxvYWQ/LnN0cmVhbSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgIXBheWxvYWQuZG9uZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZC5zdGF0dXMgPT09ICdvaycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybWVkaWF0ZSBzdHJlYW0gZnJhbWU6IGRlbGl2ZXIgaXQgYW5kIGtlZXAgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXF1ZXN0IHBlbmRpbmcgdW50aWwgdGhlIHRlcm1pbmFsIGZyYW1lIGFycml2ZXMuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGVuZGluZy5vbkZyYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZy5vbkZyYW1lKHBheWxvYWQuZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmdDYWxsYmFja3MuZGVsZXRlKHJlcXVlc3RJZCk7XG4gICAgICAgICAgICAgICAgICAgIHBlbmRpbmcucmVzb2x2ZShwYXlsb2FkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFdvcmtlck1lc3NhZ2VUeXBlLlNFVF9QUk9QUzpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vblNldFByb3BzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25TZXRQcm9wcyhtZXNzYWdlLnBheWxvYWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgV29ya2VyTWVzc2FnZVR5cGUuU0VUX1BST1BTX0JBVENIOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uU2V0UHJvcHNCYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uU2V0UHJvcHNCYXRjaChtZXNzYWdlLnBheWxvYWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgV29ya2VyTWVzc2FnZVR5cGUuR0VUX1BST1BTX1JFUVVFU1Q6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub25HZXRQcm9wc1JlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkdldFByb3BzUmVxdWVzdChtZXNzYWdlLnJlcXVlc3RJZCwgbWVzc2FnZS5wYXlsb2FkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFdvcmtlck1lc3NhZ2VUeXBlLkVSUk9SOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkVycm9yKG1lc3NhZ2UucGF5bG9hZD8ubWVzc2FnZSB8fCAnVW5rbm93biBlcnJvcicsIG1lc3NhZ2UucGF5bG9hZD8uY29kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8gU2luZ2xldG9uIGluc3RhbmNlXG5sZXQgd29ya2VyQ2xpZW50SW5zdGFuY2UgPSBudWxsO1xuLyoqXG4gKiBHZXQgdGhlIHNpbmdsZXRvbiBXb3JrZXJDbGllbnQgaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXb3JrZXJDbGllbnQoKSB7XG4gICAgaWYgKCF3b3JrZXJDbGllbnRJbnN0YW5jZSkge1xuICAgICAgICB3b3JrZXJDbGllbnRJbnN0YW5jZSA9IG5ldyBXb3JrZXJDbGllbnQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHdvcmtlckNsaWVudEluc3RhbmNlO1xufVxuLyoqXG4gKiBDaGVjayBpZiBXZWJTb2NrZXQgY2FsbGJhY2tzIGFyZSBnbG9iYWxseSBlbmFibGVkIGFuZCBzdXBwb3J0ZWQuXG4gKiBAcGFyYW0gY29uZmlnIFRoZSBEYXNoIGNvbmZpZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNXZWJTb2NrZXRFbmFibGVkKGNvbmZpZykge1xuICAgIHJldHVybiAhIShjb25maWcud2Vic29ja2V0Py5lbmFibGVkICYmIHR5cGVvZiBTaGFyZWRXb3JrZXIgIT09ICd1bmRlZmluZWQnKTtcbn1cbi8qKlxuICogQ2hlY2sgaWYgV2ViU29ja2V0IGluZnJhc3RydWN0dXJlIGlzIGF2YWlsYWJsZSAoZm9yIHBlci1jYWxsYmFjayB3ZWJzb2NrZXQpLlxuICogQHBhcmFtIGNvbmZpZyBUaGUgRGFzaCBjb25maWdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzV2ViU29ja2V0QXZhaWxhYmxlKGNvbmZpZykge1xuICAgIHJldHVybiAhIShjb25maWcud2Vic29ja2V0Py51cmwgJiZcbiAgICAgICAgY29uZmlnLndlYnNvY2tldD8ud29ya2VyX3VybCAmJlxuICAgICAgICB0eXBlb2YgU2hhcmVkV29ya2VyICE9PSAndW5kZWZpbmVkJyk7XG59XG4iLCJpbXBvcnQgY2hlY2tQcm9wVHlwZXMgZnJvbSAnLi4vY2hlY2tQcm9wVHlwZXMnO1xuaW1wb3J0IHsgcHJvcFR5cGVFcnJvckhhbmRsZXIgfSBmcm9tICcuLi9leGNlcHRpb25zJztcbmltcG9ydCB7IHZhbGlkYXRlQ29tcG9uZW50IH0gZnJvbSAnLi93cmFwcGluZyc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBDaGVja2VkQ29tcG9uZW50KHApIHtcbiAgICBjb25zdCB7IGVsZW1lbnQsIHByb3BzLCBjaGlsZHJlbiwgY29tcG9uZW50IH0gPSBwO1xuICAgIHZhbGlkYXRlQ29tcG9uZW50KGNvbXBvbmVudCk7XG4gICAgY29uc3QgZXJyb3JNZXNzYWdlID0gY2hlY2tQcm9wVHlwZXMoZWxlbWVudC5wcm9wVHlwZXMsIHByb3BzLCAnY29tcG9uZW50IHByb3AnLCBlbGVtZW50KTtcbiAgICBpZiAoZXJyb3JNZXNzYWdlKSB7XG4gICAgICAgIHByb3BUeXBlRXJyb3JIYW5kbGVyKGVycm9yTWVzc2FnZSwgcHJvcHMsIGNvbXBvbmVudC50eXBlKTtcbiAgICB9XG4gICAgcmV0dXJuIGNoaWxkcmVuO1xufVxuIiwiaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VDb250ZXh0LCB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlU3RvcmUsIHVzZVNlbGVjdG9yLCB1c2VEaXNwYXRjaCB9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCB7IGNvbmNhdCwgcGF0aE9yIH0gZnJvbSAncmFtZGEnO1xuZXhwb3J0IGNvbnN0IERhc2hDb250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dCh7fSk7XG5leHBvcnQgZnVuY3Rpb24gRGFzaENvbnRleHRQcm92aWRlcihwcm9wcykge1xuICAgIGNvbnN0IHsgY2hpbGRyZW4sIGNvbXBvbmVudFBhdGggfSA9IHByb3BzO1xuICAgIGNvbnN0IHN0cmluZ1BhdGggPSB1c2VNZW1vKCgpID0+IEpTT04uc3RyaW5naWZ5KGNvbXBvbmVudFBhdGgpLCBbY29tcG9uZW50UGF0aF0pO1xuICAgIGNvbnN0IHN0b3JlID0gdXNlU3RvcmUoKTtcbiAgICBjb25zdCBpc0xvYWRpbmcgPSB1c2VDYWxsYmFjaygob3B0aW9ucykgPT4ge1xuICAgICAgICBjb25zdCB7IGV4dHJhUGF0aCwgcmF3UGF0aCwgZmlsdGVyRnVuYyB9ID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgbGV0IGxvYWRpbmdQYXRoID0gW3N0cmluZ1BhdGhdO1xuICAgICAgICBpZiAoZXh0cmFQYXRoKSB7XG4gICAgICAgICAgICBsb2FkaW5nUGF0aCA9IFtcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShjb25jYXQoY29tcG9uZW50UGF0aCwgZXh0cmFQYXRoKSlcbiAgICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocmF3UGF0aCkge1xuICAgICAgICAgICAgbG9hZGluZ1BhdGggPSBbSlNPTi5zdHJpbmdpZnkocmF3UGF0aCldO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxvYWRpbmcgPSBwYXRoT3IoW10sIGxvYWRpbmdQYXRoLCBzdG9yZS5nZXRTdGF0ZSgpLmxvYWRpbmcpO1xuICAgICAgICByZXR1cm4gZmlsdGVyRnVuY1xuICAgICAgICAgICAgPyBsb2FkaW5nLmZpbHRlcihmaWx0ZXJGdW5jKS5sZW5ndGggPiAwXG4gICAgICAgICAgICA6IGxvYWRpbmcubGVuZ3RoID4gMDtcbiAgICB9LCBbc3RyaW5nUGF0aF0pO1xuICAgIGNvbnN0IHVzZUxvYWRpbmcgPSB1c2VDYWxsYmFjaygob3B0aW9ucykgPT4ge1xuICAgICAgICBjb25zdCB7IGZpbHRlckZ1bmMsIGV4dHJhUGF0aCwgcmF3UGF0aCB9ID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgcmV0dXJuIHVzZVNlbGVjdG9yKChzdGF0ZSkgPT4ge1xuICAgICAgICAgICAgbGV0IGxvYWRpbmdQYXRoID0gW3N0cmluZ1BhdGhdO1xuICAgICAgICAgICAgaWYgKGV4dHJhUGF0aCkge1xuICAgICAgICAgICAgICAgIGxvYWRpbmdQYXRoID0gW1xuICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShjb25jYXQoY29tcG9uZW50UGF0aCwgZXh0cmFQYXRoKSlcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocmF3UGF0aCkge1xuICAgICAgICAgICAgICAgIGxvYWRpbmdQYXRoID0gW0pTT04uc3RyaW5naWZ5KHJhd1BhdGgpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGxvYWQgPSBwYXRoT3IoW10sIGxvYWRpbmdQYXRoLCBzdGF0ZS5sb2FkaW5nKTtcbiAgICAgICAgICAgIGlmIChmaWx0ZXJGdW5jKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvYWQuZmlsdGVyKGZpbHRlckZ1bmMpLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbG9hZC5sZW5ndGggPiAwO1xuICAgICAgICB9KTtcbiAgICB9LCBbc3RyaW5nUGF0aF0pO1xuICAgIGNvbnN0IGN0eFZhbHVlID0gdXNlTWVtbygoKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb21wb25lbnRQYXRoLFxuICAgICAgICAgICAgaXNMb2FkaW5nLFxuICAgICAgICAgICAgdXNlTG9hZGluZyxcbiAgICAgICAgICAgIHVzZVNlbGVjdG9yLFxuICAgICAgICAgICAgdXNlU3RvcmUsXG4gICAgICAgICAgICB1c2VEaXNwYXRjaFxuICAgICAgICB9O1xuICAgIH0sIFtzdHJpbmdQYXRoXSk7XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KERhc2hDb250ZXh0LlByb3ZpZGVyLCB7IHZhbHVlOiBjdHhWYWx1ZSB9LCBjaGlsZHJlbikpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHVzZURhc2hDb250ZXh0KCkge1xuICAgIGNvbnN0IGN0eCA9IHVzZUNvbnRleHQoRGFzaENvbnRleHQpO1xuICAgIGlmICghY3R4KSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Rhc2ggQ29udGV4dCB3YXMgbm90IGZvdW5kLCBjb21wb25lbnQgd2FzIHJlbmRlcmVkIHdpdGhvdXQgYSB3cmFwcGVyLiBVc2UgYHdpbmRvdy5kYXNoX2NvbXBvbmVudF9hcGkuRXh0ZXJuYWxXcmFwcGVyYCB0byBtYWtlIHN1cmUgdGhlIGNvbXBvbmVudCBpcyBwcm9wZXJseSBjb25uZWN0ZWQuJyk7XG4gICAgfVxuICAgIHJldHVybiBjdHggfHwge307XG59XG4iLCJpbXBvcnQgUmVhY3QsIHsgdXNlQ2FsbGJhY2ssIHVzZVJlZiwgdXNlTWVtbywgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgcGF0aCwgY29uY2F0LCBwaWNrQnksIGVxdWFscywga2V5cywgaXMsIGlzRW1wdHksIHBpY2ssIGFzc29jUGF0aCwgcGF0aE9yLCBtZXJnZVJpZ2h0LCBkaXNzb2MsIGFzc29jLCBtYXBPYmpJbmRleGVkLCB0eXBlIH0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IHsgdXNlU2VsZWN0b3IsIHVzZURpc3BhdGNoLCBiYXRjaCB9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCBDb21wb25lbnRFcnJvckJvdW5kYXJ5IGZyb20gJy4uL2NvbXBvbmVudHMvZXJyb3IvQ29tcG9uZW50RXJyb3JCb3VuZGFyeS5yZWFjdCc7XG5pbXBvcnQgeyBub3RpZnlPYnNlcnZlcnMsIG9uRXJyb3IsIHVwZGF0ZVByb3BzLCByZXNldENvbXBvbmVudFN0YXRlIH0gZnJvbSAnLi4vYWN0aW9ucyc7XG5pbXBvcnQgeyBnZXRXYXRjaGVkS2V5cywgc3RyaW5naWZ5SWQgfSBmcm9tICcuLi9hY3Rpb25zL2RlcGVuZGVuY2llcyc7XG5pbXBvcnQgeyBjcmVhdGVFbGVtZW50LCBnZXRDb21wb25lbnRMYXlvdXQsIGlzRHJ5Q29tcG9uZW50LCBjaGVja1JlbmRlclR5cGVQcm9wLCBzdHJpbmdpZnlQYXRoIH0gZnJvbSAnLi93cmFwcGluZyc7XG5pbXBvcnQgUmVnaXN0cnkgZnJvbSAnLi4vcmVnaXN0cnknO1xuaW1wb3J0IGlzU2ltcGxlQ29tcG9uZW50IGZyb20gJy4uL2lzU2ltcGxlQ29tcG9uZW50JztcbmltcG9ydCB7IHNlbGVjdERhc2hQcm9wcywgc2VsZWN0RGFzaFByb3BzRXF1YWxpdHlGbiwgc2VsZWN0Q29uZmlnIH0gZnJvbSAnLi9zZWxlY3RvcnMnO1xuaW1wb3J0IENoZWNrZWRDb21wb25lbnQgZnJvbSAnLi9DaGVja2VkQ29tcG9uZW50JztcbmltcG9ydCB7IERhc2hDb250ZXh0UHJvdmlkZXIgfSBmcm9tICcuL0Rhc2hDb250ZXh0Jztcbi8vIElkZW50aXR5IG9mIGEgZGFzaCBjb21wb25lbnQ6IHdoaWNoIGNvbXBvbmVudCBpdCBpcywgbm90IHdoYXQgaXRzXG4vLyBjdXJyZW50IHByb3AgdmFsdWVzIGFyZS4gVXNlZCB0byBkZWNpZGUgYmV0d2VlbiByZW1vdW50aW5nIChpZGVudGl0eVxuLy8gY2hhbmdlZCkgYW5kIHJlY29uY2lsaW5nIGluIHBsYWNlIChzYW1lIGNvbXBvbmVudCwgbmV3IHByb3BzKS5cbmNvbnN0IGNvbXBvbmVudElkZW50aXR5ID0gKGNvbXBvbmVudCkgPT4ge1xuICAgIGNvbnN0IGlkID0gY29tcG9uZW50Py5wcm9wcz8uaWQ7XG4gICAgcmV0dXJuIGAke2NvbXBvbmVudD8ubmFtZXNwYWNlfS4ke2NvbXBvbmVudD8udHlwZX0uJHtpZCA/IHN0cmluZ2lmeUlkKGlkKSA6ICcnfWA7XG59O1xuZnVuY3Rpb24gRGFzaFdyYXBwZXIoeyBjb21wb25lbnRQYXRoLCBfZGFzaHByaXZhdGVfZXJyb3IsIF9wYXNzZWRDb21wb25lbnQsIC8vIHBhc3MgY29tcG9uZW50IHRvIHRoZSBEYXNoV3JhcHBlciBpbiB0aGUgZXZlbnQgdGhhdCBpdCBpcyBhIG5ld1JlbmRlciBhbmQgdGhlcmUgYXJlIG5vIGxheW91dGhhc2hlc1xuX25ld1JlbmRlciwgLy8gdGhpcyBpcyB0byBmb3JjZSB0aGUgY29tcG9uZW50IHRvIG5ld2x5IHJlbmRlciByZWdhcmRsZXNzIG9mIHByb3BzIChyZWRyYXcgYW5kIGNvbXBvbmVudCBhcyBwcm9wcykgaXMgcGFzc2VkIGZyb20gdGhlIHBhcmVudFxuLi4uZXh0cmFzIH0pIHtcbiAgICBjb25zdCBkaXNwYXRjaCA9IHVzZURpc3BhdGNoKCk7XG4gICAgY29uc3QgbWVtb2l6ZWRLZXlzID0gdXNlUmVmKHt9KTtcbiAgICBjb25zdCBuZXdSZW5kZXIgPSB1c2VSZWYoZmFsc2UpO1xuICAgIGNvbnN0IGZyZXNoUmVuZGVycyA9IHVzZVJlZigwKTtcbiAgICAvLyBEaWQgKnRoaXMqIHJlbmRlciByZW1vdW50IHRoZSBzdWJ0cmVlIChpZGVudGl0eSBjaGFuZ2VkIG9yIGFuIGV4cGxpY2l0XG4gICAgLy8gZGFzaC5yZW1vdW50KCkpPyBBIHJlbW91bnQgcmVidWlsZHMgZXZlcnkgZGVzY2VuZGFudCBmcm9tIHNjcmF0Y2gsIHNvXG4gICAgLy8gdGhlIGl0ZW0tYnktaXRlbSByZWYtc2tpcCBiZWxvdyBtdXN0IG5vdCBjYXJyeSBhbnl0aGluZyBvdmVyIGFjcm9zcyBpdC5cbiAgICBjb25zdCByZW1vdW50ZWRUaGlzUmVuZGVyID0gdXNlUmVmKGZhbHNlKTtcbiAgICBjb25zdCByZW5kZXJlZElkZW50aXR5ID0gdXNlUmVmKG51bGwpO1xuICAgIGNvbnN0IGhhc0ZyZXNoUmVuZGVyZWQgPSB1c2VSZWYoZmFsc2UpO1xuICAgIGNvbnN0IHJlbmRlcmVkUGF0aCA9IHVzZVJlZihjb21wb25lbnRQYXRoKTtcbiAgICBjb25zdCBwcmV2Q2hpbGRyZW5BcnJheXMgPSB1c2VSZWYoe30pO1xuICAgIGxldCByZW5kZXJDb21wb25lbnQgPSBudWxsO1xuICAgIGxldCByZW5kZXJDb21wb25lbnRQcm9wcyA9IG51bGw7XG4gICAgbGV0IHJlbmRlckggPSBudWxsO1xuICAgIC8vIEdldCB0aGUgY29uZmlnIGZvciB0aGUgY29tcG9uZW50IGFzIHByb3BzXG4gICAgY29uc3QgY29uZmlnID0gdXNlU2VsZWN0b3Ioc2VsZWN0Q29uZmlnKTtcbiAgICAvLyBTZWxlY3QgY29tcG9uZW50IGFuZCBpdCdzIHByb3BzLCBhbG9uZyB3aXRoIHJlbmRlciBoYXNoLCBjaGFuZ2VkIHByb3BzIGFuZCB0aGUgcmVhc29uIGZvciByZW5kZXJcbiAgICBjb25zdCBbY29tcG9uZW50LCBjb21wb25lbnRQcm9wcywgaCwgY2hhbmdlZFByb3BzLCByZW5kZXJUeXBlXSA9IHVzZVNlbGVjdG9yKHNlbGVjdERhc2hQcm9wcyhjb21wb25lbnRQYXRoKSwgc2VsZWN0RGFzaFByb3BzRXF1YWxpdHlGbik7XG4gICAgcmVuZGVyQ29tcG9uZW50ID0gY29tcG9uZW50O1xuICAgIHJlbmRlckNvbXBvbmVudFByb3BzID0gY29tcG9uZW50UHJvcHM7XG4gICAgcmVuZGVySCA9IGg7XG4gICAgdXNlTWVtbygoKSA9PiB7XG4gICAgICAgIGlmIChfbmV3UmVuZGVyKSB7XG4gICAgICAgICAgICBuZXdSZW5kZXIuY3VycmVudCA9IHRydWU7XG4gICAgICAgICAgICByZW5kZXJIID0gMDtcbiAgICAgICAgICAgIC8vIE9ubHkgZm9yY2UgYSByZW1vdW50ICh2aWEgdGhlIGBrZXlgIGJ1bXAgYmVsb3cpIHdoZW4gdGhlXG4gICAgICAgICAgICAvLyBjb21wb25lbnQgaWRlbnRpdHkgYXQgdGhpcyBwYXRoIGFjdHVhbGx5IGNoYW5nZWQuIFdoZW4gdGhlXG4gICAgICAgICAgICAvLyBzYW1lIGNvbXBvbmVudCBpcyBwYXNzZWQgYWdhaW4gKGVnOiBhIGNhbGxiYWNrIHJldHVybmluZ1xuICAgICAgICAgICAgLy8gdXBkYXRlZCBjaGlsZHJlbiB3aXRoIHRoZSBzYW1lIHN0cnVjdHVyZSksIHJlY29uY2lsZSBpblxuICAgICAgICAgICAgLy8gcGxhY2UgaW5zdGVhZCBvZiB1bm1vdW50aW5nIHRoZSB3aG9sZSBzdWJ0cmVlLiAoIzM4NDYpXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gYF9kYXNocHJpdmF0ZV9yZW1vdW50YCBpcyBzZXQgYnkgYGRhc2gucmVtb3VudCgpYCBhbmQgZm9yY2VzXG4gICAgICAgICAgICAvLyBhIHJlbW91bnQgZXZlbiB3aGVuIHRoZSBpZGVudGl0eSBpcyB1bmNoYW5nZWQsIGxldHRpbmcgYVxuICAgICAgICAgICAgLy8gY2FsbGJhY2sgZXhwbGljaXRseSByZXNldCBhIGNvbXBvbmVudCdzIGludGVybmFsIHN0YXRlLlxuICAgICAgICAgICAgY29uc3QgaWRlbnRpdHkgPSBjb21wb25lbnRJZGVudGl0eShfcGFzc2VkQ29tcG9uZW50KTtcbiAgICAgICAgICAgIGNvbnN0IGlzUmVtb3VudCA9IEJvb2xlYW4oX3Bhc3NlZENvbXBvbmVudD8uX2Rhc2hwcml2YXRlX3JlbW91bnQgfHxcbiAgICAgICAgICAgICAgICAocmVuZGVyZWRJZGVudGl0eS5jdXJyZW50ICE9PSBudWxsICYmXG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkSWRlbnRpdHkuY3VycmVudCAhPT0gaWRlbnRpdHkpKTtcbiAgICAgICAgICAgIHJlbW91bnRlZFRoaXNSZW5kZXIuY3VycmVudCA9IGlzUmVtb3VudDtcbiAgICAgICAgICAgIGlmIChpc1JlbW91bnQpIHtcbiAgICAgICAgICAgICAgICBmcmVzaFJlbmRlcnMuY3VycmVudCArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVuZGVyZWRJZGVudGl0eS5jdXJyZW50ID0gaWRlbnRpdHk7XG4gICAgICAgICAgICBpZiAocmVuZGVySCBpbiBtZW1vaXplZEtleXMuY3VycmVudCkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBtZW1vaXplZEtleXMuY3VycmVudFtyZW5kZXJIXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG5ld1JlbmRlci5jdXJyZW50ID0gZmFsc2U7XG4gICAgICAgICAgICByZW1vdW50ZWRUaGlzUmVuZGVyLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZW5kZXJlZFBhdGguY3VycmVudCA9IGNvbXBvbmVudFBhdGg7XG4gICAgfSwgW19uZXdSZW5kZXJdKTtcbiAgICBjb25zdCBzZXRQcm9wcyA9IChuZXdQcm9wcykgPT4ge1xuICAgICAgICBjb25zdCB7IGlkIH0gPSByZW5kZXJDb21wb25lbnRQcm9wcztcbiAgICAgICAgY29uc3QgeyBfZGFzaF9lcnJvciwgLi4ucmVzdFByb3BzIH0gPSBuZXdQcm9wcztcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGRpc3BhdGNoKChkaXNwYXRjaCwgZ2V0U3RhdGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IGdldFN0YXRlKCk7XG4gICAgICAgICAgICBjb25zdCB7IGdyYXBocyB9ID0gY3VycmVudFN0YXRlO1xuICAgICAgICAgICAgY29uc3Qgb2xkTGF5b3V0ID0gZ2V0Q29tcG9uZW50TGF5b3V0KHJlbmRlcmVkUGF0aC5jdXJyZW50LCBjdXJyZW50U3RhdGUpO1xuICAgICAgICAgICAgaWYgKCFvbGRMYXlvdXQpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgeyBwcm9wczogb2xkUHJvcHMgfSA9IG9sZExheW91dDtcbiAgICAgICAgICAgIGlmICghb2xkUHJvcHMpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgY2hhbmdlZFByb3BzID0gcGlja0J5KCh2YWwsIGtleSkgPT4gIWVxdWFscyh2YWwsIG9sZFByb3BzW2tleV0pLCByZXN0UHJvcHMpO1xuICAgICAgICAgICAgaWYgKF9kYXNoX2Vycm9yKSB7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2gob25FcnJvcih7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdmcm9udEVuZCcsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiBfZGFzaF9lcnJvclxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc0VtcHR5KGNoYW5nZWRQcm9wcykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJZGVudGlmeSB0aGUgbW9kaWZpZWQgcHJvcHMgdGhhdCBhcmUgcmVxdWlyZWQgZm9yIGNhbGxiYWNrc1xuICAgICAgICAgICAgY29uc3Qgd2F0Y2hlZEtleXMgPSBnZXRXYXRjaGVkS2V5cyhpZCwga2V5cyhjaGFuZ2VkUHJvcHMpLCBncmFwaHMpO1xuICAgICAgICAgICAgYmF0Y2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIE9ubHkgZGlzcGF0Y2ggY2hhbmdlcyB0byBEYXNoIGlmIGEgd2F0Y2hlZCBwcm9wIGNoYW5nZWRcbiAgICAgICAgICAgICAgICBpZiAod2F0Y2hlZEtleXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKG5vdGlmeU9ic2VydmVycyh7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzOiBwaWNrKHdhdGNoZWRLZXlzLCBjaGFuZ2VkUHJvcHMpXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQWx3YXlzIHVwZGF0ZSB0aGlzIGNvbXBvbmVudCdzIHByb3BzXG4gICAgICAgICAgICAgICAgZGlzcGF0Y2godXBkYXRlUHJvcHMoe1xuICAgICAgICAgICAgICAgICAgICBwcm9wczogY2hhbmdlZFByb3BzLFxuICAgICAgICAgICAgICAgICAgICBpdGVtcGF0aDogcmVuZGVyZWRQYXRoLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgIHJlbmRlclR5cGU6ICdpbnRlcm5hbCdcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBjb25zdCBjcmVhdGVDb250YWluZXIgPSB1c2VDYWxsYmFjaygoY29udGFpbmVyLCBjb250YWluZXJQYXRoLCBfY2hpbGROZXdSZW5kZXIpID0+IHtcbiAgICAgICAgaWYgKGlzU2ltcGxlQ29tcG9uZW50KHJlbmRlckNvbXBvbmVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiByZW5kZXJDb21wb25lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KERhc2hXcmFwcGVyLCB7IGtleTogY29udGFpbmVyPy5wcm9wcz8uaWRcbiAgICAgICAgICAgICAgICA/IHN0cmluZ2lmeUlkKGNvbnRhaW5lci5wcm9wcy5pZClcbiAgICAgICAgICAgICAgICA6IHN0cmluZ2lmeVBhdGgoY29udGFpbmVyUGF0aCksIF9kYXNocHJpdmF0ZV9lcnJvcjogX2Rhc2hwcml2YXRlX2Vycm9yLCBjb21wb25lbnRQYXRoOiBjb250YWluZXJQYXRoLCBfcGFzc2VkQ29tcG9uZW50OiBjb250YWluZXIsIF9uZXdSZW5kZXI6IF9jaGlsZE5ld1JlbmRlciB9KSk7XG4gICAgfSwgW10pO1xuICAgIGNvbnN0IHdyYXBDaGlsZHJlblByb3AgPSB1c2VDYWxsYmFjaygobm9kZSwgY2hpbGRyZW5QYXRoLCBfY2hpbGROZXdSZW5kZXIsIGFsbG93UmVmU2tpcCA9IGZhbHNlKSA9PiB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG5vZGUpKSB7XG4gICAgICAgICAgICBjb25zdCBwYXRoS2V5ID0gc3RyaW5naWZ5UGF0aChjaGlsZHJlblBhdGgpO1xuICAgICAgICAgICAgY29uc3QgcHJldkFycmF5ID0gYWxsb3dSZWZTa2lwXG4gICAgICAgICAgICAgICAgPyBwcmV2Q2hpbGRyZW5BcnJheXMuY3VycmVudFtwYXRoS2V5XVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgcHJldkNoaWxkcmVuQXJyYXlzLmN1cnJlbnRbcGF0aEtleV0gPSBub2RlO1xuICAgICAgICAgICAgcmV0dXJuIG5vZGUubWFwKChuLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGlzRHJ5Q29tcG9uZW50KG4pKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuY2hhbmdlZCA9IGFsbG93UmVmU2tpcCAmJiBwcmV2QXJyYXk/LltpXSA9PT0gbjtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUNvbnRhaW5lcihuLCBjb25jYXQoY29tcG9uZW50UGF0aCwgW1xuICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3BzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmNoaWxkcmVuUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlcbiAgICAgICAgICAgICAgICAgICAgXSksIHVuY2hhbmdlZCA/IDAgOiBfY2hpbGROZXdSZW5kZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNEcnlDb21wb25lbnQobm9kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjcmVhdGVDb250YWluZXIobm9kZSwgY29uY2F0KGNvbXBvbmVudFBhdGgsIFsncHJvcHMnLCAuLi5jaGlsZHJlblBhdGhdKSwgX2NoaWxkTmV3UmVuZGVyKTtcbiAgICB9LCBbY29tcG9uZW50UGF0aF0pO1xuICAgIGNvbnN0IGV4dHJhUHJvcHMgPSB7XG4gICAgICAgIHNldFByb3BzLFxuICAgICAgICAuLi5leHRyYXNcbiAgICB9O1xuICAgIGlmIChjaGVja1JlbmRlclR5cGVQcm9wKHJlbmRlckNvbXBvbmVudCkpIHtcbiAgICAgICAgZXh0cmFQcm9wc1snZGFzaFJlbmRlclR5cGUnXSA9IG5ld1JlbmRlci5jdXJyZW50XG4gICAgICAgICAgICA/ICdwYXJlbnQnXG4gICAgICAgICAgICA6IGNoYW5nZWRQcm9wc1xuICAgICAgICAgICAgICAgID8gcmVuZGVyVHlwZVxuICAgICAgICAgICAgICAgIDogJ3BhcmVudCc7XG4gICAgfVxuICAgIGNvbnN0IHNldEh5ZHJhdGVkUHJvcHMgPSAoY29tcG9uZW50LCBjb21wb25lbnRQcm9wcykgPT4ge1xuICAgICAgICAvLyBIeWRyYXRlIGNvbXBvbmVudHMgcHJvcHNcbiAgICAgICAgY29uc3QgY2hpbGRyZW5Qcm9wcyA9IHBhdGhPcihbXSwgWydjaGlsZHJlbl9wcm9wcycsIGNvbXBvbmVudD8ubmFtZXNwYWNlLCBjb21wb25lbnQ/LnR5cGVdLCBjb25maWcpO1xuICAgICAgICBsZXQgcHJvcHMgPSBtZXJnZVJpZ2h0KGRpc3NvYygnY2hpbGRyZW4nLCBjb21wb25lbnRQcm9wcyksIGV4dHJhUHJvcHMpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuUHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuUHJvcCA9IGNoaWxkcmVuUHJvcHNbaV07XG4gICAgICAgICAgICBsZXQgY2hpbGROZXdSZW5kZXIgPSAwO1xuICAgICAgICAgICAgaWYgKGNoaWxkcmVuUHJvcFxuICAgICAgICAgICAgICAgIC5zcGxpdCgnLicpWzBdXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoJ1tdJywgJycpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoJ3t9JywgJycpIGluIGNoYW5nZWRQcm9wcyB8fFxuICAgICAgICAgICAgICAgIG5ld1JlbmRlci5jdXJyZW50IHx8XG4gICAgICAgICAgICAgICAgIXJlbmRlckgpIHtcbiAgICAgICAgICAgICAgICBjaGlsZE5ld1JlbmRlciA9IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaGFuZGxlT2JqZWN0ID0gKG9iaiwgb3BhdGgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWFwT2JqSW5kZXhlZCgobm9kZSwgaykgPT4gd3JhcENoaWxkcmVuUHJvcChub2RlLCBbLi4ub3BhdGgsIGtdLCBjaGlsZE5ld1JlbmRlciksIG9iaik7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKGNoaWxkcmVuUHJvcC5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNoaWxkcmVuUGF0aCA9IGNoaWxkcmVuUHJvcC5zcGxpdCgnLicpO1xuICAgICAgICAgICAgICAgIGxldCBub2RlO1xuICAgICAgICAgICAgICAgIGxldCBub2RlVmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuUHJvcC5pbmNsdWRlcygnW10nKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmcm9udFBhdGggPSBbXSwgYmFja1BhdGggPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZvdW5kID0gZmFsc2UsIGhhc09iamVjdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAvLyBBdCBmaXJzdCB0aGUgY2hpbGRyZW5QYXRoIGlzIGFsd2F5cyBhIGxpc3Qgb2Ygc3RyaW5ncy5cbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5QYXRoLmZvckVhY2gocCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHAuaW5jbHVkZXMoJ1tdJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocC5pbmNsdWRlcygne30nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzT2JqZWN0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb250UGF0aC5wdXNoKHAucmVwbGFjZSgne30nLCAnJykucmVwbGFjZSgnW10nLCAnJykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbnRQYXRoLnB1c2gocC5yZXBsYWNlKCdbXScsICcnKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocC5pbmNsdWRlcygne30nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNPYmplY3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9udFBhdGgucHVzaChwLnJlcGxhY2UoJ3t9JywgJycpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb250UGF0aC5wdXNoKHApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwLmluY2x1ZGVzKCd7fScpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc09iamVjdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tQYXRoLnB1c2gocC5yZXBsYWNlKCd7fScsICcnKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrUGF0aC5wdXNoKHApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUgPSBwYXRoKGZyb250UGF0aCwgcHJvcHMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZSA9PT0gdW5kZWZpbmVkIHx8ICFub2RlPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpcnN0Tm9kZSA9IHBhdGgoYmFja1BhdGgsIG5vZGVbMF0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWZpcnN0Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbm9kZVZhbHVlID0gbm9kZS5tYXAoKGVsLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50UGF0aCA9IGNvbmNhdChmcm9udFBhdGgsIGNvbmNhdChbaV0sIGJhY2tQYXRoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGlzdFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc09iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiYWNrUGF0aC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdFZhbHVlID0gaGFuZGxlT2JqZWN0KHBhdGgoYmFja1BhdGgsIGVsKSwgZWxlbWVudFBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdFZhbHVlID0gaGFuZGxlT2JqZWN0KGVsLCBlbGVtZW50UGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdFZhbHVlID0gd3JhcENoaWxkcmVuUHJvcChwYXRoKGJhY2tQYXRoLCBlbCksIGVsZW1lbnRQYXRoLCBjaGlsZE5ld1JlbmRlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXNzb2NQYXRoKGJhY2tQYXRoLCBsaXN0VmFsdWUsIGVsKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuUGF0aCA9IGZyb250UGF0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlblByb3AuaW5jbHVkZXMoJ3t9JykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgc3VwcG9ydHMgb25lIGxldmVsIG9mIG5lc3RpbmcuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmcm9udCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGR5bmFtaWMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoYXNCYWNrID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYWNrUGF0aCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjaGlsZHJlblBhdGgubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXIgPSBjaGlsZHJlblBhdGhbal07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1ci5pbmNsdWRlcygne30nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljID0gY29uY2F0KGZyb250LCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXIucmVwbGFjZSgne30nLCAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqIDwgY2hpbGRyZW5QYXRoLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0JhY2sgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzQmFjaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja1BhdGgucHVzaChjdXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbnQucHVzaChjdXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHluVmFsdWUgPSBwYXRoKGR5bmFtaWMsIHByb3BzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkeW5WYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG9vIGR5bmFtaWMgZm9yIHByb3BlciB0cy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVWYWx1ZSA9IG1hcE9iakluZGV4ZWQoKGQsIGspID0+IHdyYXBDaGlsZHJlblByb3AoaGFzQmFjayA/IHBhdGgoYmFja1BhdGgsIGQpIDogZCwgaGFzQmFja1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGNvbmNhdChkeW5hbWljLCBjb25jYXQoW2tdLCBiYWNrUGF0aCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY29uY2F0KGR5bmFtaWMsIFtrXSksIGNoaWxkTmV3UmVuZGVyKSwgZHluVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuUGF0aCA9IGR5bmFtaWM7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlID0gcGF0aChjaGlsZHJlblBhdGgsIHByb3BzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVWYWx1ZSA9IHdyYXBDaGlsZHJlblByb3Aobm9kZSwgY2hpbGRyZW5QYXRoLCBjaGlsZE5ld1JlbmRlcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHJvcHMgPSBhc3NvY1BhdGgoY2hpbGRyZW5QYXRoLCBub2RlVmFsdWUsIHByb3BzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlblByb3AuaW5jbHVkZXMoJ3t9JykpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9wYXRoID0gY2hpbGRyZW5Qcm9wLnJlcGxhY2UoJ3t9JywgJycpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpc0FycmF5ID0gY2hpbGRyZW5Qcm9wLmluY2x1ZGVzKCdbXScpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNBcnJheSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3BhdGggPSBvcGF0aC5yZXBsYWNlKCdbXScsICcnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gcHJvcHNbb3BhdGhdO1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNBcnJheSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbm9kZS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhUGF0aCA9IGNvbmNhdChbb3BhdGhdLCBbal0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wcyA9IGFzc29jUGF0aChhUGF0aCwgaGFuZGxlT2JqZWN0KG5vZGVbal0sIGFQYXRoKSwgcHJvcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzID0gYXNzb2Mob3BhdGgsIGhhbmRsZU9iamVjdChub2RlLCBbb3BhdGhdKSwgcHJvcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gcHJvcHNbY2hpbGRyZW5Qcm9wXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHMgPSBhc3NvYyhjaGlsZHJlblByb3AsIHdyYXBDaGlsZHJlblByb3Aobm9kZSwgW2NoaWxkcmVuUHJvcF0sIGNoaWxkTmV3UmVuZGVyKSwgcHJvcHMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlKHByb3BzLmlkKSA9PT0gJ09iamVjdCcpIHtcbiAgICAgICAgICAgIC8vIFR1cm4gb2JqZWN0IGlkcyAoZm9yIHdpbGRjYXJkcykgaW50byB1bmlxdWUgc3RyaW5ncy5cbiAgICAgICAgICAgIC8vIEJlY2F1c2Ugb2YgdGhlIGBkaXNzb2NgIGFib3ZlIHdlJ3JlIG5vdCBtdXRhdGluZyB0aGUgbGF5b3V0LFxuICAgICAgICAgICAgLy8ganVzdCB0aGUgaWQgd2UgcGFzcyBvbiB0byB0aGUgcmVuZGVyZWQgY29tcG9uZW50XG4gICAgICAgICAgICBwcm9wcy5pZCA9IHN0cmluZ2lmeUlkKHByb3BzLmlkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvcHM7XG4gICAgfTtcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAoX25ld1JlbmRlcikge1xuICAgICAgICAgICAgLy8gRG9uJ3QgcmVzZXQgZGVzY2VuZGFudCBsYXlvdXQgaGFzaGVzIG9uIHRoZSBjb21wb25lbnQncyB2ZXJ5XG4gICAgICAgICAgICAvLyBmaXJzdCBmcmVzaCByZW5kZXI6IGNvbXBvbmVudHMgdGhhdCBzZXQgdGhlaXIgaW5pdGlhbCBzdGF0ZSBvblxuICAgICAgICAgICAgLy8gbW91bnQgKGVnLiBkYmMgVGFicyBwaWNraW5nIHRoZSBkZWZhdWx0IGFjdGl2ZSB0YWIpIHdvdWxkIGhhdmVcbiAgICAgICAgICAgIC8vIHRoYXQgc3RhdGUgd2lwZWQgYmVmb3JlIGl0IHRha2VzIGVmZmVjdC4gU3RhbGUgZGVzY2VuZGFudFxuICAgICAgICAgICAgLy8gaGFzaGVzIGFyZSBvbmx5IGEgY29uY2VybiBvbmNlIHRoZSBzdWJ0cmVlIGhhcyByZW5kZXJlZCBhdFxuICAgICAgICAgICAgLy8gbGVhc3Qgb25jZSwgc28gcmVzZXQgZnJvbSB0aGUgc2Vjb25kIGZyZXNoIHJlbmRlciBvbndhcmQuXG4gICAgICAgICAgICAvLyAoIzM5MjksIGtlZXBzICMzMzMwIGZpeGVkLilcbiAgICAgICAgICAgIGlmIChoYXNGcmVzaFJlbmRlcmVkLmN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaChyZXNldENvbXBvbmVudFN0YXRlKHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbXBhdGg6IGNvbXBvbmVudFBhdGhcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoYXNGcmVzaFJlbmRlcmVkLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfSwgW19uZXdSZW5kZXJdKTtcbiAgICBjb25zdCBoeWRyYXRlRnVuYyA9ICgpID0+IHtcbiAgICAgICAgaWYgKG5ld1JlbmRlci5jdXJyZW50KSB7XG4gICAgICAgICAgICByZW5kZXJDb21wb25lbnQgPSBfcGFzc2VkQ29tcG9uZW50O1xuICAgICAgICAgICAgcmVuZGVyQ29tcG9uZW50UHJvcHMgPSBfcGFzc2VkQ29tcG9uZW50Py5wcm9wcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJlbmRlckNvbXBvbmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZWxlbWVudCA9IFJlZ2lzdHJ5LnJlc29sdmUocmVuZGVyQ29tcG9uZW50KTtcbiAgICAgICAgY29uc3QgaHlkcmF0ZWRQcm9wcyA9IHNldEh5ZHJhdGVkUHJvcHMocmVuZGVyQ29tcG9uZW50LCByZW5kZXJDb21wb25lbnRQcm9wcyk7XG4gICAgICAgIGxldCBoeWRyYXRlZENoaWxkcmVuO1xuICAgICAgICBpZiAocmVuZGVyQ29tcG9uZW50UHJvcHMuY2hpbGRyZW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaHlkcmF0ZWRDaGlsZHJlbiA9IHdyYXBDaGlsZHJlblByb3AocmVuZGVyQ29tcG9uZW50UHJvcHMuY2hpbGRyZW4sIFsnY2hpbGRyZW4nXSwgIXJlbmRlckggfHwgbmV3UmVuZGVyLmN1cnJlbnQgfHwgJ2NoaWxkcmVuJyBpbiBjaGFuZ2VkUHJvcHNcbiAgICAgICAgICAgICAgICA/IHt9XG4gICAgICAgICAgICAgICAgOiAwLCAhcmVtb3VudGVkVGhpc1JlbmRlci5jdXJyZW50KTtcbiAgICAgICAgfVxuICAgICAgICBuZXdSZW5kZXIuY3VycmVudCA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gY29uZmlnLnByb3BzX2NoZWNrID8gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ2hlY2tlZENvbXBvbmVudCwgeyBlbGVtZW50OiBlbGVtZW50LCBwcm9wczogaHlkcmF0ZWRQcm9wcywgY29tcG9uZW50OiByZW5kZXJDb21wb25lbnQgfSwgY3JlYXRlRWxlbWVudChlbGVtZW50LCBoeWRyYXRlZFByb3BzLCBleHRyYVByb3BzLCBoeWRyYXRlZENoaWxkcmVuKSkpIDogKGNyZWF0ZUVsZW1lbnQoZWxlbWVudCwgaHlkcmF0ZWRQcm9wcywgZXh0cmFQcm9wcywgaHlkcmF0ZWRDaGlsZHJlbikpO1xuICAgIH07XG4gICAgbGV0IGh5ZHJhdGVkID0gbnVsbDtcbiAgICBpZiAocmVuZGVySCBpbiBtZW1vaXplZEtleXMuY3VycmVudCAmJiAhbmV3UmVuZGVyLmN1cnJlbnQpIHtcbiAgICAgICAgaHlkcmF0ZWQgPSBSZWFjdC5pc1ZhbGlkRWxlbWVudChtZW1vaXplZEtleXMuY3VycmVudFtyZW5kZXJIXSlcbiAgICAgICAgICAgID8gbWVtb2l6ZWRLZXlzLmN1cnJlbnRbcmVuZGVySF1cbiAgICAgICAgICAgIDogbnVsbDtcbiAgICB9XG4gICAgaWYgKCFoeWRyYXRlZCkge1xuICAgICAgICBoeWRyYXRlZCA9IGh5ZHJhdGVGdW5jKCk7XG4gICAgICAgIG1lbW9pemVkS2V5cy5jdXJyZW50ID0geyBbcmVuZGVySF06IGh5ZHJhdGVkIH07XG4gICAgfVxuICAgIHJldHVybiByZW5kZXJDb21wb25lbnQgPyAoUmVhY3QuY3JlYXRlRWxlbWVudChDb21wb25lbnRFcnJvckJvdW5kYXJ5LCB7IGNvbXBvbmVudFR5cGU6IHJlbmRlckNvbXBvbmVudC50eXBlLCBjb21wb25lbnRJZDogaXMoT2JqZWN0LCByZW5kZXJDb21wb25lbnRQcm9wcy5pZClcbiAgICAgICAgICAgID8gc3RyaW5naWZ5SWQocmVuZGVyQ29tcG9uZW50UHJvcHMuaWQpXG4gICAgICAgICAgICA6IHJlbmRlckNvbXBvbmVudFByb3BzLmlkLCBlcnJvcjogX2Rhc2hwcml2YXRlX2Vycm9yLCBkaXNwYXRjaDogZGlzcGF0Y2gsIGtleTogZnJlc2hSZW5kZXJzLmN1cnJlbnQgfSxcbiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChEYXNoQ29udGV4dFByb3ZpZGVyLCB7IGNvbXBvbmVudFBhdGg6IGNvbXBvbmVudFBhdGggfSwgUmVhY3QuaXNWYWxpZEVsZW1lbnQoaHlkcmF0ZWQpID8gaHlkcmF0ZWQgOiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIG51bGwpKSkpIDogKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgbnVsbCkpO1xufVxuZXhwb3J0IGRlZmF1bHQgRGFzaFdyYXBwZXI7XG4iLCJpbXBvcnQgUmVhY3QsIHsgdXNlU3RhdGUsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHBhdGggfSBmcm9tICdyYW1kYSc7XG5pbXBvcnQgeyBiYXRjaCwgdXNlRGlzcGF0Y2ggfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgRGFzaFdyYXBwZXIgZnJvbSAnLi9EYXNoV3JhcHBlcic7XG5pbXBvcnQgeyBhZGRDb21wb25lbnRUb0xheW91dCwgbm90aWZ5T2JzZXJ2ZXJzLCByZW1vdmVDb21wb25lbnQsIHVwZGF0ZVByb3BzIH0gZnJvbSAnLi4vYWN0aW9ucyc7XG4vKipcbiAqIEZvciByZW5kZXJpbmcgY29tcG9uZW50cyB0aGF0IGFyZSBvdXQgb2YgdGhlIHJlZ3VsYXIgbGF5b3V0IHRyZWUuXG4gKi9cbmZ1bmN0aW9uIEV4dGVybmFsV3JhcHBlcih7IGNvbXBvbmVudCwgY29tcG9uZW50UGF0aCwgdGVtcCA9IGZhbHNlIH0pIHtcbiAgICBjb25zdCBkaXNwYXRjaCA9IHVzZURpc3BhdGNoKCk7XG4gICAgY29uc3QgW2luc2VydGVkLCBzZXRJbnNlcnRlZF0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgLy8gR2l2ZSBlbXB0eSBwcm9wcyBmb3IgdGhlIGluc2VydGVkIGNvbXBvbmVudHMuXG4gICAgICAgIC8vIFRoZSBwcm9wcyB3aWxsIGNvbWUgZnJvbSB0aGUgcGFyZW50IHNvIHRoZXkgY2FuIGJlIHVwZGF0ZWQuXG4gICAgICAgIGRpc3BhdGNoKGFkZENvbXBvbmVudFRvTGF5b3V0KHtcbiAgICAgICAgICAgIGNvbXBvbmVudCxcbiAgICAgICAgICAgIGNvbXBvbmVudFBhdGhcbiAgICAgICAgfSkpO1xuICAgICAgICBzZXRJbnNlcnRlZCh0cnVlKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0ZW1wKSB7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2gocmVtb3ZlQ29tcG9uZW50KHsgY29tcG9uZW50UGF0aCB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfSwgW10pO1xuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBkaXNwYXRjaCgoX2Rpc3BhdGNoLCBnZXRTdGF0ZSkgPT4ge1xuICAgICAgICAgICAgLy8gVGhlIGhvc3Qgc3VidHJlZSBtYXkgaGF2ZSBiZWVuIHJlcGxhY2VkIChlZy4gYSBjYWxsYmFja1xuICAgICAgICAgICAgLy8gcmV0dXJuZWQgbmV3IGNoaWxkcmVuKSB3aGlsZSB0aGlzIHdyYXBwZXIgcmVjb25jaWxlZCBpbiBwbGFjZVxuICAgICAgICAgICAgLy8gcmF0aGVyIHRoYW4gcmVtb3VudGluZy4gSW4gdGhhdCBjYXNlIHRoZSBjb21wb25lbnQgaXMgZ29uZSBmcm9tXG4gICAgICAgICAgICAvLyB0aGUgbGF5b3V0IGF0IGBjb21wb25lbnRQYXRoYCwgc28gcmUtaW5zZXJ0IGl0IGluc3RlYWQgb2ZcbiAgICAgICAgICAgIC8vIHVwZGF0aW5nIGEgcGF0aCB0aGF0IG5vIGxvbmdlciBleGlzdHMuXG4gICAgICAgICAgICBjb25zdCBleGlzdHMgPSBwYXRoKGNvbXBvbmVudFBhdGgsIGdldFN0YXRlKCkubGF5b3V0KTtcbiAgICAgICAgICAgIGJhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXhpc3RzKSB7XG4gICAgICAgICAgICAgICAgICAgIF9kaXNwYXRjaCh1cGRhdGVQcm9wcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtcGF0aDogY29tcG9uZW50UGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzOiBjb21wb25lbnQucHJvcHNcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgX2Rpc3BhdGNoKGFkZENvbXBvbmVudFRvTGF5b3V0KHsgY29tcG9uZW50LCBjb21wb25lbnRQYXRoIH0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5wcm9wcy5pZCkge1xuICAgICAgICAgICAgICAgICAgICBfZGlzcGF0Y2gobm90aWZ5T2JzZXJ2ZXJzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBjb21wb25lbnQucHJvcHMuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wczogY29tcG9uZW50LnByb3BzXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSwgW2NvbXBvbmVudC5wcm9wc10pO1xuICAgIGlmICghaW5zZXJ0ZWQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8vIFJlbmRlciBhIHdyYXBwZXIgd2l0aCB0aGUgYWN0dWFsIHByb3BzLlxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KERhc2hXcmFwcGVyLCB7IGNvbXBvbmVudFBhdGg6IGNvbXBvbmVudFBhdGggfSk7XG59XG5leHBvcnQgZGVmYXVsdCBFeHRlcm5hbFdyYXBwZXI7XG4iLCJpbXBvcnQgeyBnZXRDb21wb25lbnRMYXlvdXQsIHN0cmluZ2lmeVBhdGgsIGNoZWNrRGFzaENoaWxkcmVuVXBkYXRlIH0gZnJvbSAnLi93cmFwcGluZyc7XG5pbXBvcnQgeyBwYXRoT3IgfSBmcm9tICdyYW1kYSc7XG5jb25zdCBwcmV2aW91c0hhc2hlcyA9IHt9O1xuY29uc3QgaXNGaXJzdExldmVsUHJvcHNDaGlsZCA9ICh1cGRhdGVkUGF0aCwgc3RyUGF0aCkgPT4ge1xuICAgIGNvbnN0IHVwZGF0ZWRTZWdtZW50cyA9IHVwZGF0ZWRQYXRoLnNwbGl0KCcsJyk7XG4gICAgY29uc3QgZnVsbFNlZ21lbnRzID0gc3RyUGF0aC5zcGxpdCgnLCcpO1xuICAgIC8vIENoZWNrIHRoYXQgc3RyUGF0aCBhY3R1YWxseSBzdGFydHMgd2l0aCB1cGRhdGVkUGF0aFxuICAgIGNvbnN0IHN0YXJ0c1dpdGhQYXRoID0gZnVsbFNlZ21lbnRzLmV2ZXJ5KChzZWcsIGkpID0+IHVwZGF0ZWRTZWdtZW50c1tpXSA9PT0gc2VnKTtcbiAgICBpZiAoIXN0YXJ0c1dpdGhQYXRoKVxuICAgICAgICByZXR1cm4gW2ZhbHNlLCBbXV07XG4gICAgLy8gR2V0IHRoZSByZW1haW5pbmcgcGF0aCBhZnRlciB0aGUgcHJlZml4XG4gICAgY29uc3QgcmVtYWluaW5nU2VnbWVudHMgPSB1cGRhdGVkU2VnbWVudHMuc2xpY2UoZnVsbFNlZ21lbnRzLmxlbmd0aCk7XG4gICAgY29uc3QgcHJvcHNDb3VudCA9IHJlbWFpbmluZ1NlZ21lbnRzLmZpbHRlcihzID0+IHMgPT09ICdwcm9wcycpLmxlbmd0aDtcbiAgICByZXR1cm4gW3Byb3BzQ291bnQgPCAyLCByZW1haW5pbmdTZWdtZW50c107XG59O1xuZnVuY3Rpb24gZGV0ZXJtaW5lQ2hhbmdlZFByb3BzKHN0YXRlLCBzdHJQYXRoKSB7XG4gICAgbGV0IGNvbWJpbmVkSGFzaCA9IDA7XG4gICAgbGV0IHJlbmRlclR5cGU7IC8vIERlZmF1bHQgcmVuZGVyIHR5cGUsIGFkanVzdCBhcyBuZWVkZWRcbiAgICBjb25zdCBjaGFuZ2VkUHJvcHMgPSB7fTtcbiAgICBPYmplY3QuZW50cmllcyhzdGF0ZS5sYXlvdXRIYXNoZXMpLmZvckVhY2goKFt1cGRhdGVkUGF0aCwgcGF0aEhhc2hdKSA9PiB7XG4gICAgICAgIGNvbnN0IFtkZXNjZW5kYW50LCByZW1haW5pbmdTZWdtZW50c10gPSBpc0ZpcnN0TGV2ZWxQcm9wc0NoaWxkKHVwZGF0ZWRQYXRoLCBzdHJQYXRoKTtcbiAgICAgICAgaWYgKGRlc2NlbmRhbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzSGFzaCA9IHBhdGhPcih7fSwgW3VwZGF0ZWRQYXRoXSwgcHJldmlvdXNIYXNoZXMpO1xuICAgICAgICAgICAgY29tYmluZWRIYXNoICs9IHBhdGhPcigwLCBbJ2hhc2gnXSwgcGF0aEhhc2gpO1xuICAgICAgICAgICAgaWYgKHByZXZpb3VzSGFzaCAhPT0gcGF0aEhhc2gpIHtcbiAgICAgICAgICAgICAgICBpZiAodXBkYXRlZFBhdGggIT09IHN0clBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihjaGFuZ2VkUHJvcHMsIHsgW3JlbWFpbmluZ1NlZ21lbnRzWzFdXTogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyVHlwZSA9ICdjb21wb25lbnRzJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oY2hhbmdlZFByb3BzLCBwYXRoT3Ioe30sIFsnY2hhbmdlZFByb3BzJ10sIHBhdGhIYXNoKSk7XG4gICAgICAgICAgICAgICAgICAgIHJlbmRlclR5cGUgPSBwYXRoT3Ioe30sIFsncmVuZGVyVHlwZSddLCBwYXRoSGFzaCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHByZXZpb3VzSGFzaGVzW3VwZGF0ZWRQYXRoXSA9IHBhdGhIYXNoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaGFzaDogY29tYmluZWRIYXNoLFxuICAgICAgICBjaGFuZ2VkUHJvcHMsXG4gICAgICAgIHJlbmRlclR5cGVcbiAgICB9O1xufVxuZXhwb3J0IGNvbnN0IHNlbGVjdERhc2hQcm9wcyA9IChjb21wb25lbnRQYXRoKSA9PiAoc3RhdGUpID0+IHtcbiAgICBjb25zdCBjID0gZ2V0Q29tcG9uZW50TGF5b3V0KGNvbXBvbmVudFBhdGgsIHN0YXRlKTtcbiAgICAvLyBMYXlvdXQgaGFzaGVzIHJlY29yZHMgdGhlIG51bWJlciBvZiB0aW1lcyBhIHBhdGggaGFzIGJlZW4gdXBkYXRlZC5cbiAgICAvLyBzdW0gd2l0aCB0aGUgcGFyZW50cyBoYXNoIChtYXRjaCB3aXRob3V0IHRoZSBsYXN0ICddJykgdG8gZ2V0IHRoZSByZWFsIGhhc2hcbiAgICAvLyBUaGVuIGl0IGNhbiBiZSBlYXNpbHkgY29tcGFyZWQgd2l0aG91dCBoYXZpbmcgdG8gY29tcGFyZSB0aGUgcHJvcHMuXG4gICAgY29uc3Qgc3RyUGF0aCA9IHN0cmluZ2lmeVBhdGgoY29tcG9uZW50UGF0aCk7XG4gICAgbGV0IGhhc2g7XG4gICAgaWYgKGNoZWNrRGFzaENoaWxkcmVuVXBkYXRlKGMpKSB7XG4gICAgICAgIGhhc2ggPSBkZXRlcm1pbmVDaGFuZ2VkUHJvcHMoc3RhdGUsIHN0clBhdGgpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaGFzaCA9IHN0YXRlLmxheW91dEhhc2hlc1tzdHJQYXRoXTtcbiAgICB9XG4gICAgbGV0IGggPSAwO1xuICAgIGxldCBjaGFuZ2VkUHJvcHMgPSB7fTtcbiAgICBsZXQgcmVuZGVyVHlwZSA9ICcnO1xuICAgIGlmIChoYXNoKSB7XG4gICAgICAgIGggPSBoYXNoWydoYXNoJ107XG4gICAgICAgIGNoYW5nZWRQcm9wcyA9IGhhc2hbJ2NoYW5nZWRQcm9wcyddO1xuICAgICAgICByZW5kZXJUeXBlID0gaGFzaFsncmVuZGVyVHlwZSddO1xuICAgIH1cbiAgICByZXR1cm4gW2MsIGM/LnByb3BzLCBoLCBjaGFuZ2VkUHJvcHMsIHJlbmRlclR5cGVdO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3REYXNoUHJvcHNFcXVhbGl0eUZuKFtfLCBfXywgaGFzaF0sIFtfX18sIF9fX18sIHByZXZpb3VzSGFzaF0pIHtcbiAgICAvLyBPbmx5IG5lZWQgdG8gY29tcGFyZSB0aGUgaGFzaCBhcyBhbnkgY2hhbmdlIGlzIHN1bW1lZCB1cFxuICAgIHJldHVybiBoYXNoID09PSBwcmV2aW91c0hhc2g7XG59XG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0Q29uZmlnKHN0YXRlKSB7XG4gICAgcmV0dXJuIHN0YXRlLmNvbmZpZztcbn1cbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBtZXJnZVJpZ2h0LCBwYXRoLCB0eXBlLCBoYXMsIGpvaW4sIHBhdGhPciB9IGZyb20gJ3JhbWRhJztcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbGVtZW50KGVsZW1lbnQsIHByb3BzLCBleHRyYVByb3BzLCBjaGlsZHJlbikge1xuICAgIGNvbnN0IGFsbFByb3BzID0gbWVyZ2VSaWdodChwcm9wcywgZXh0cmFQcm9wcyk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KGVsZW1lbnQsIGFsbFByb3BzLCAuLi5jaGlsZHJlbik7XG4gICAgfVxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KGVsZW1lbnQsIGFsbFByb3BzLCBjaGlsZHJlbik7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNEcnlDb21wb25lbnQob2JqKSB7XG4gICAgcmV0dXJuICh0eXBlKG9iaikgPT09ICdPYmplY3QnICYmXG4gICAgICAgIGhhcygndHlwZScsIG9iaikgJiZcbiAgICAgICAgaGFzKCduYW1lc3BhY2UnLCBvYmopICYmXG4gICAgICAgIGhhcygncHJvcHMnLCBvYmopKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUNvbXBvbmVudChjb21wb25lbnREZWZpbml0aW9uKSB7XG4gICAgaWYgKHR5cGUoY29tcG9uZW50RGVmaW5pdGlvbikgPT09ICdBcnJheScpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgY2hpbGRyZW4gcHJvcGVydHkgb2YgYSBjb21wb25lbnQgaXMgYSBsaXN0IG9mIGxpc3RzLCBpbnN0ZWFkICcgK1xuICAgICAgICAgICAgJ29mIGp1c3QgYSBsaXN0LiBUaGlzIGNhbiBzb21ldGltZXMgYmUgZHVlIHRvIGEgdHJhaWxpbmcgY29tbWEuICcgK1xuICAgICAgICAgICAgJ0NoZWNrIHRoZSBjb21wb25lbnQgdGhhdCBoYXMgdGhlIGZvbGxvd2luZyBjb250ZW50cyAnICtcbiAgICAgICAgICAgICdhbmQgcmVtb3ZlIG9uZSBvZiB0aGUgbGV2ZWxzIG9mIG5lc3Rpbmc6IFxcbicgK1xuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoY29tcG9uZW50RGVmaW5pdGlvbiwgbnVsbCwgMikpO1xuICAgIH1cbiAgICBpZiAodHlwZShjb21wb25lbnREZWZpbml0aW9uKSA9PT0gJ09iamVjdCcgJiZcbiAgICAgICAgIShoYXMoJ25hbWVzcGFjZScsIGNvbXBvbmVudERlZmluaXRpb24pICYmXG4gICAgICAgICAgICBoYXMoJ3R5cGUnLCBjb21wb25lbnREZWZpbml0aW9uKSAmJlxuICAgICAgICAgICAgaGFzKCdwcm9wcycsIGNvbXBvbmVudERlZmluaXRpb24pKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FuIG9iamVjdCB3YXMgcHJvdmlkZWQgYXMgYGNoaWxkcmVuYCBpbnN0ZWFkIG9mIGEgY29tcG9uZW50LCAnICtcbiAgICAgICAgICAgICdzdHJpbmcsIG9yIG51bWJlciAob3IgbGlzdCBvZiB0aG9zZSkuICcgK1xuICAgICAgICAgICAgJ0NoZWNrIHRoZSBjaGlsZHJlbiBwcm9wZXJ0eSB0aGF0IGxvb2tzIHNvbWV0aGluZyBsaWtlOlxcbicgK1xuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoY29tcG9uZW50RGVmaW5pdGlvbiwgbnVsbCwgMikpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdpZnlQYXRoKGxheW91dFBhdGgpIHtcbiAgICByZXR1cm4gam9pbignLCcsIGxheW91dFBhdGgpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbXBvbmVudExheW91dChjb21wb25lbnRQYXRoLCBzdGF0ZSkge1xuICAgIHJldHVybiBwYXRoKGNvbXBvbmVudFBhdGgsIHN0YXRlLmxheW91dCk7XG59XG5leHBvcnQgZnVuY3Rpb24gY2hlY2tSZW5kZXJUeXBlUHJvcChjb21wb25lbnREZWZpbml0aW9uKSB7XG4gICAgcmV0dXJuICgnZGFzaFJlbmRlclR5cGUnIGluXG4gICAgICAgIHBhdGhPcih7fSwgW2NvbXBvbmVudERlZmluaXRpb24/Lm5hbWVzcGFjZSwgY29tcG9uZW50RGVmaW5pdGlvbj8udHlwZV0sIHdpbmRvdykpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrRGFzaENoaWxkcmVuVXBkYXRlKGNvbXBvbmVudERlZmluaXRpb24pIHtcbiAgICByZXR1cm4gKCdkYXNoQ2hpbGRyZW5VcGRhdGUnIGluXG4gICAgICAgIHBhdGhPcih7fSwgW2NvbXBvbmVudERlZmluaXRpb24/Lm5hbWVzcGFjZSwgY29tcG9uZW50RGVmaW5pdGlvbj8udHlwZV0sIHdpbmRvdykpO1xufVxuIiwiaW1wb3J0IHtiYXRjaCwgY29ubmVjdH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IHtpbmNsdWRlcywgaXNFbXB0eX0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IFJlYWN0LCB7dXNlRWZmZWN0LCB1c2VSZWYsIHVzZVN0YXRlfSBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgR2xvYmFsRXJyb3JDb250YWluZXIgZnJvbSAnLi9jb21wb25lbnRzL2Vycm9yL0dsb2JhbEVycm9yQ29udGFpbmVyLnJlYWN0JztcbmltcG9ydCB7XG4gICAgZGlzcGF0Y2hFcnJvcixcbiAgICBoeWRyYXRlSW5pdGlhbE91dHB1dHMsXG4gICAgb25FcnJvcixcbiAgICBzZXRHcmFwaHMsXG4gICAgc2V0UGF0aHMsXG4gICAgc2V0TGF5b3V0XG59IGZyb20gJy4vYWN0aW9ucyc7XG5pbXBvcnQge2NvbXB1dGVQYXRoc30gZnJvbSAnLi9hY3Rpb25zL3BhdGhzJztcbmltcG9ydCB7Y29tcHV0ZUdyYXBoc30gZnJvbSAnLi9hY3Rpb25zL2RlcGVuZGVuY2llcyc7XG5pbXBvcnQgYXBpVGh1bmsgZnJvbSAnLi9hY3Rpb25zL2FwaSc7XG5pbXBvcnQge0V2ZW50RW1pdHRlcn0gZnJvbSAnLi9hY3Rpb25zL3V0aWxzJztcbmltcG9ydCB7YXBwbHlQZXJzaXN0ZW5jZX0gZnJvbSAnLi9wZXJzaXN0ZW5jZSc7XG5pbXBvcnQge2dldEFwcFN0YXRlfSBmcm9tICcuL3JlZHVjZXJzL2NvbnN0YW50cyc7XG5pbXBvcnQge1NUQVRVU30gZnJvbSAnLi9jb25zdGFudHMvY29uc3RhbnRzJztcbmltcG9ydCB3YWl0IGZyb20gJy4vdXRpbHMvd2FpdCc7XG5pbXBvcnQgaXNTaW1wbGVDb21wb25lbnQgZnJvbSAnLi9pc1NpbXBsZUNvbXBvbmVudCc7XG5pbXBvcnQgRGFzaFdyYXBwZXIgZnJvbSAnLi93cmFwcGVyL0Rhc2hXcmFwcGVyJztcblxuLyoqXG4gKiBGaXJlIG9mZiBBUEkgY2FsbHMgZm9yIGluaXRpYWxpemF0aW9uXG4gKiBAcGFyYW0geyp9IHByb3BzIHByb3BzXG4gKiBAcmV0dXJucyB7Kn0gY29tcG9uZW50XG4gKi9cbmNvbnN0IFVuY29ubmVjdGVkQ29udGFpbmVyID0gcHJvcHMgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgICAgYXBwTGlmZWN5Y2xlLFxuICAgICAgICBjb25maWcsXG4gICAgICAgIGRlcGVuZGVuY2llc1JlcXVlc3QsXG4gICAgICAgIGVycm9yLFxuICAgICAgICBsYXlvdXRSZXF1ZXN0LFxuICAgICAgICBsYXlvdXRcbiAgICB9ID0gcHJvcHM7XG5cbiAgICBjb25zdCBbZXJyb3JMb2FkaW5nLCBzZXRFcnJvckxvYWRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xuXG4gICAgY29uc3QgZXZlbnRzID0gdXNlUmVmKG51bGwpO1xuICAgIGlmICghZXZlbnRzLmN1cnJlbnQpIHtcbiAgICAgICAgZXZlbnRzLmN1cnJlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgfVxuICAgIGNvbnN0IHJlbmRlcmVkVHJlZSA9IHVzZVJlZihmYWxzZSk7XG5cbiAgICB1c2VFZmZlY3Qoc3RvcmVFZmZlY3QuYmluZChudWxsLCBwcm9wcywgZXZlbnRzLCBzZXRFcnJvckxvYWRpbmcpKTtcblxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmIChyZW5kZXJlZFRyZWUuY3VycmVudCkge1xuICAgICAgICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICByZW5kZXJlZFRyZWUuY3VycmVudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGF3YWl0IHdhaXQoMCk7XG4gICAgICAgICAgICAgICAgZXZlbnRzLmN1cnJlbnQuZW1pdCgncmVuZGVyZWQnKTtcbiAgICAgICAgICAgIH0pKCk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmIChjb25maWcuc2VydmVfbG9jYWxseSkge1xuICAgICAgICAgICAgd2luZG93Ll9kYXNoUGxvdGx5SlNVUkwgPSBgJHtjb25maWcucmVxdWVzdHNfcGF0aG5hbWVfcHJlZml4fV9kYXNoLWNvbXBvbmVudC1zdWl0ZXMvcGxvdGx5L3BhY2thZ2VfZGF0YS9wbG90bHkubWluLmpzYDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdpbmRvdy5fZGFzaFBsb3RseUpTVVJMID0gY29uZmlnLnBsb3RseWpzX3VybDtcbiAgICAgICAgfVxuICAgIH0sIFtdKTtcblxuICAgIGxldCBjb250ZW50O1xuICAgIGlmIChcbiAgICAgICAgbGF5b3V0UmVxdWVzdC5zdGF0dXMgJiZcbiAgICAgICAgIWluY2x1ZGVzKGxheW91dFJlcXVlc3Quc3RhdHVzLCBbU1RBVFVTLk9LLCAnbG9hZGluZyddKVxuICAgICkge1xuICAgICAgICBpZiAoY29uZmlnLnVpKSB7XG4gICAgICAgICAgICBjb250ZW50ID0gKFxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3tfX2h0bWw6IGxheW91dFJlcXVlc3QuY29udGVudH19XG4gICAgICAgICAgICAgICAgPjwvZGl2PlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRlbnQgPSA8ZGl2IGNsYXNzTmFtZT0nX2Rhc2gtZXJyb3InPkVycm9yIGxvYWRpbmcgbGF5b3V0PC9kaXY+O1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgICAgZXJyb3JMb2FkaW5nIHx8XG4gICAgICAgIChkZXBlbmRlbmNpZXNSZXF1ZXN0LnN0YXR1cyAmJlxuICAgICAgICAgICAgIWluY2x1ZGVzKGRlcGVuZGVuY2llc1JlcXVlc3Quc3RhdHVzLCBbU1RBVFVTLk9LLCAnbG9hZGluZyddKSlcbiAgICApIHtcbiAgICAgICAgaWYgKGNvbmZpZy51aSkge1xuICAgICAgICAgICAgY29udGVudCA9IChcbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7XG4gICAgICAgICAgICAgICAgICAgICAgICBfX2h0bWw6IGRlcGVuZGVuY2llc1JlcXVlc3QuY29udGVudFxuICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgID48L2Rpdj5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb250ZW50ID0gKFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdfZGFzaC1lcnJvcic+RXJyb3IgbG9hZGluZyBkZXBlbmRlbmNpZXM8L2Rpdj5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGFwcExpZmVjeWNsZSA9PT0gZ2V0QXBwU3RhdGUoJ0hZRFJBVEVEJykpIHtcbiAgICAgICAgcmVuZGVyZWRUcmVlLmN1cnJlbnQgPSB0cnVlO1xuXG4gICAgICAgIGNvbnRlbnQgPSAoXG4gICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgIHtBcnJheS5pc0FycmF5KGxheW91dC5jb21wb25lbnRzKSA/IChcbiAgICAgICAgICAgICAgICAgICAgbGF5b3V0LmNvbXBvbmVudHMubWFwKChjLCBpKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgaXNTaW1wbGVDb21wb25lbnQoYykgPyAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY1xuICAgICAgICAgICAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RGFzaFdyYXBwZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Rhc2hwcml2YXRlX2Vycm9yPXtlcnJvcn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50UGF0aD17Wydjb21wb25lbnRzJywgaV19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleT17aX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICAgICAgPERhc2hXcmFwcGVyXG4gICAgICAgICAgICAgICAgICAgICAgICBfZGFzaHByaXZhdGVfZXJyb3I9e2Vycm9yfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50UGF0aD17Wydjb21wb25lbnRzJ119XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDwvPlxuICAgICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRlbnQgPSA8ZGl2IGNsYXNzTmFtZT0nX2Rhc2gtbG9hZGluZyc+TG9hZGluZy4uLjwvZGl2PjtcbiAgICB9XG5cbiAgICByZXR1cm4gY29uZmlnICYmIGNvbmZpZy51aSA9PT0gdHJ1ZSA/IChcbiAgICAgICAgPEdsb2JhbEVycm9yQ29udGFpbmVyPntjb250ZW50fTwvR2xvYmFsRXJyb3JDb250YWluZXI+XG4gICAgKSA6IChcbiAgICAgICAgY29udGVudFxuICAgICk7XG59O1xuXG5mdW5jdGlvbiBzdG9yZUVmZmVjdChwcm9wcywgZXZlbnRzLCBzZXRFcnJvckxvYWRpbmcpIHtcbiAgICBjb25zdCB7XG4gICAgICAgIGFwcExpZmVjeWNsZSxcbiAgICAgICAgZGVwZW5kZW5jaWVzUmVxdWVzdCxcbiAgICAgICAgZGlzcGF0Y2gsXG4gICAgICAgIGVycm9yLFxuICAgICAgICBncmFwaHMsXG4gICAgICAgIGhvb2tzLFxuICAgICAgICBsYXlvdXQsXG4gICAgICAgIGxheW91dFJlcXVlc3QsXG4gICAgICAgIGNvbmZpZ1xuICAgIH0gPSBwcm9wcztcblxuICAgIGJhdGNoKCgpID0+IHtcbiAgICAgICAgaWYgKGlzRW1wdHkobGF5b3V0UmVxdWVzdCkpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaG9va3MubGF5b3V0X3ByZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIGhvb2tzLmxheW91dF9wcmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRpc3BhdGNoKGFwaVRodW5rKCdfZGFzaC1sYXlvdXQnLCAnR0VUJywgJ2xheW91dFJlcXVlc3QnKSk7XG4gICAgICAgIH0gZWxzZSBpZiAobGF5b3V0UmVxdWVzdC5zdGF0dXMgPT09IFNUQVRVUy5PSykge1xuICAgICAgICAgICAgaWYgKGlzRW1wdHkobGF5b3V0LmNvbXBvbmVudHMpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBob29rcy5sYXlvdXRfcG9zdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBob29rcy5sYXlvdXRfcG9zdChsYXlvdXRSZXF1ZXN0LmNvbnRlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBmaW5hbExheW91dCA9IGFwcGx5UGVyc2lzdGVuY2UoXG4gICAgICAgICAgICAgICAgICAgIGxheW91dFJlcXVlc3QuY29udGVudCxcbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoKFxuICAgICAgICAgICAgICAgICAgICBzZXRQYXRocyhcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVQYXRocyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbExheW91dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ2NvbXBvbmVudHMnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cy5jdXJyZW50XG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoKHNldExheW91dChmaW5hbExheW91dCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzRW1wdHkoZGVwZW5kZW5jaWVzUmVxdWVzdCkpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoKFxuICAgICAgICAgICAgICAgIGFwaVRodW5rKCdfZGFzaC1kZXBlbmRlbmNpZXMnLCAnR0VUJywgJ2RlcGVuZGVuY2llc1JlcXVlc3QnKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIGRlcGVuZGVuY2llc1JlcXVlc3Quc3RhdHVzID09PSBTVEFUVVMuT0sgJiZcbiAgICAgICAgICAgIChpc0VtcHR5KGdyYXBocykgfHwgZ3JhcGhzLnJlc2V0KVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGRpc3BhdGNoKFxuICAgICAgICAgICAgICAgIHNldEdyYXBocyhcbiAgICAgICAgICAgICAgICAgICAgY29tcHV0ZUdyYXBocyhcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY2llc1JlcXVlc3QuY29udGVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoRXJyb3IoZGlzcGF0Y2gpLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgLy8gZGVwZW5kZW5jaWVzUmVxdWVzdCBhbmQgaXRzIGNvbXB1dGVkIHN0b3Jlc1xuICAgICAgICAgICAgZGVwZW5kZW5jaWVzUmVxdWVzdC5zdGF0dXMgPT09IFNUQVRVUy5PSyAmJlxuICAgICAgICAgICAgIWlzRW1wdHkoZ3JhcGhzKSAmJlxuICAgICAgICAgICAgLy8gTGF5b3V0UmVxdWVzdCBhbmQgaXRzIGNvbXB1dGVkIHN0b3Jlc1xuICAgICAgICAgICAgbGF5b3V0UmVxdWVzdC5zdGF0dXMgPT09IFNUQVRVUy5PSyAmJlxuICAgICAgICAgICAgIWlzRW1wdHkobGF5b3V0LmNvbXBvbmVudHMpICYmXG4gICAgICAgICAgICAvLyBIYXNuJ3QgYWxyZWFkeSBoeWRyYXRlZFxuICAgICAgICAgICAgYXBwTGlmZWN5Y2xlID09PSBnZXRBcHBTdGF0ZSgnU1RBUlRFRCcpXG4gICAgICAgICkge1xuICAgICAgICAgICAgbGV0IGhhc0Vycm9yID0gZmFsc2U7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoKGh5ZHJhdGVJbml0aWFsT3V0cHV0cyhkaXNwYXRjaEVycm9yKGRpc3BhdGNoKSkpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgLy8gRGlzcGxheSB0aGlzIGVycm9yIGluIGRldnRvb2xzLCB1bmxlc3Mgd2UgaGF2ZSBlcnJvcnNcbiAgICAgICAgICAgICAgICAvLyBhbHJlYWR5LCBpbiB3aGljaCBjYXNlIHdlIGFzc3VtZSB0aGlzIG5ldyBvbmUgaXMgbW9vdFxuICAgICAgICAgICAgICAgIGlmICghZXJyb3IuZnJvbnRFbmQubGVuZ3RoICYmICFlcnJvci5iYWNrRW5kLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChvbkVycm9yKHt0eXBlOiAnYmFja0VuZCcsIGVycm9yOiBlcnJ9KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgc2V0RXJyb3JMb2FkaW5nKGhhc0Vycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG5VbmNvbm5lY3RlZENvbnRhaW5lci5wcm9wVHlwZXMgPSB7XG4gICAgYXBwTGlmZWN5Y2xlOiBQcm9wVHlwZXMub25lT2YoW1xuICAgICAgICBnZXRBcHBTdGF0ZSgnU1RBUlRFRCcpLFxuICAgICAgICBnZXRBcHBTdGF0ZSgnSFlEUkFURUQnKSxcbiAgICAgICAgZ2V0QXBwU3RhdGUoJ0RFU1RST1lFRCcpXG4gICAgXSksXG4gICAgZGlzcGF0Y2g6IFByb3BUeXBlcy5mdW5jLFxuICAgIGRlcGVuZGVuY2llc1JlcXVlc3Q6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgZ3JhcGhzOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIGhvb2tzOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIGxheW91dFJlcXVlc3Q6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgbGF5b3V0OiBQcm9wVHlwZXMuYW55LFxuICAgIGhpc3Rvcnk6IFByb3BUeXBlcy5hbnksXG4gICAgZXJyb3I6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgY29uZmlnOiBQcm9wVHlwZXMub2JqZWN0XG59O1xuXG5jb25zdCBDb250YWluZXIgPSBjb25uZWN0KFxuICAgIC8vIG1hcCBzdGF0ZSB0byBwcm9wc1xuICAgIHN0YXRlID0+ICh7XG4gICAgICAgIGFwcExpZmVjeWNsZTogc3RhdGUuYXBwTGlmZWN5Y2xlLFxuICAgICAgICBkZXBlbmRlbmNpZXNSZXF1ZXN0OiBzdGF0ZS5kZXBlbmRlbmNpZXNSZXF1ZXN0LFxuICAgICAgICBob29rczogc3RhdGUuaG9va3MsXG4gICAgICAgIGxheW91dFJlcXVlc3Q6IHN0YXRlLmxheW91dFJlcXVlc3QsXG4gICAgICAgIGxheW91dDogc3RhdGUubGF5b3V0LFxuICAgICAgICBncmFwaHM6IHN0YXRlLmdyYXBocyxcbiAgICAgICAgaGlzdG9yeTogc3RhdGUuaGlzdG9yeSxcbiAgICAgICAgZXJyb3I6IHN0YXRlLmVycm9yLFxuICAgICAgICBjb25maWc6IHN0YXRlLmNvbmZpZ1xuICAgIH0pLFxuICAgIGRpc3BhdGNoID0+ICh7ZGlzcGF0Y2h9KVxuKShVbmNvbm5lY3RlZENvbnRhaW5lcik7XG5cbmV4cG9ydCBkZWZhdWx0IENvbnRhaW5lcjtcbiIsImltcG9ydCB7Y29ubmVjdH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgQVBJQ29udHJvbGxlciBmcm9tICcuL0FQSUNvbnRyb2xsZXIucmVhY3QnO1xuaW1wb3J0IExvYWRpbmcgZnJvbSAnLi9jb21wb25lbnRzL2NvcmUvTG9hZGluZy5yZWFjdCc7XG5pbXBvcnQgVG9vbGJhciBmcm9tICcuL2NvbXBvbmVudHMvY29yZS9Ub29sYmFyLnJlYWN0JztcbmltcG9ydCBSZWxvYWRlciBmcm9tICcuL2NvbXBvbmVudHMvY29yZS9SZWxvYWRlci5yZWFjdCc7XG5pbXBvcnQgZ2V0Q29uZmlnRnJvbURPTSBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQge3NldEhvb2tzLCBzZXRDb25maWd9IGZyb20gJy4vYWN0aW9ucy9pbmRleCc7XG5pbXBvcnQge3R5cGUsIG1lbW9pemVXaXRoLCBpZGVudGl0eX0gZnJvbSAncmFtZGEnO1xuXG5jbGFzcyBVbmNvbm5lY3RlZEFwcENvbnRhaW5lciBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBwcm9wcy5ob29rcy5sYXlvdXRfcHJlICE9PSBudWxsIHx8XG4gICAgICAgICAgICBwcm9wcy5ob29rcy5sYXlvdXRfcG9zdCAhPT0gbnVsbCB8fFxuICAgICAgICAgICAgcHJvcHMuaG9va3MucmVxdWVzdF9wcmUgIT09IG51bGwgfHxcbiAgICAgICAgICAgIHByb3BzLmhvb2tzLnJlcXVlc3RfcG9zdCAhPT0gbnVsbCB8fFxuICAgICAgICAgICAgcHJvcHMuaG9va3MuY2FsbGJhY2tfcmVzb2x2ZWQgIT09IG51bGwgfHxcbiAgICAgICAgICAgIHByb3BzLmhvb2tzLnJlcXVlc3RfcmVmcmVzaF9qd3QgIT09IG51bGxcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBsZXQgaG9va3MgPSBwcm9wcy5ob29rcztcblxuICAgICAgICAgICAgaWYgKGhvb2tzLnJlcXVlc3RfcmVmcmVzaF9qd3QpIHtcbiAgICAgICAgICAgICAgICBob29rcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uaG9va3MsXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RfcmVmcmVzaF9qd3Q6IG1lbW9pemVXaXRoKFxuICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpdHksXG4gICAgICAgICAgICAgICAgICAgICAgICBob29rcy5yZXF1ZXN0X3JlZnJlc2hfand0XG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwcm9wcy5kaXNwYXRjaChzZXRIb29rcyhob29rcykpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCgpIHtcbiAgICAgICAgY29uc3Qge2Rpc3BhdGNofSA9IHRoaXMucHJvcHM7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGdldENvbmZpZ0Zyb21ET00oKTtcblxuICAgICAgICAvLyBwcmVzZXQgY29tbW9uIHJlcXVlc3QgcGFyYW1zIGluIHRoZSBjb25maWdcbiAgICAgICAgY29uZmlnLmZldGNoID0ge1xuICAgICAgICAgICAgY3JlZGVudGlhbHM6ICdzYW1lLW9yaWdpbicsXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgQWNjZXB0OiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGRpc3BhdGNoKHNldENvbmZpZyhjb25maWcpKTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGNvbnN0IHtjb25maWd9ID0gdGhpcy5wcm9wcztcbiAgICAgICAgaWYgKHR5cGUoY29uZmlnKSA9PT0gJ051bGwnKSB7XG4gICAgICAgICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9J19kYXNoLWxvYWRpbmcnPkxvYWRpbmcuLi48L2Rpdj47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qge3Nob3dfdW5kb19yZWRvfSA9IGNvbmZpZztcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxSZWFjdC5GcmFnbWVudD5cbiAgICAgICAgICAgICAgICB7c2hvd191bmRvX3JlZG8gPyA8VG9vbGJhciAvPiA6IG51bGx9XG4gICAgICAgICAgICAgICAgPEFQSUNvbnRyb2xsZXIgLz5cbiAgICAgICAgICAgICAgICA8TG9hZGluZyAvPlxuICAgICAgICAgICAgICAgIDxSZWxvYWRlciAvPlxuICAgICAgICAgICAgPC9SZWFjdC5GcmFnbWVudD5cbiAgICAgICAgKTtcbiAgICB9XG59XG5cblVuY29ubmVjdGVkQXBwQ29udGFpbmVyLnByb3BUeXBlcyA9IHtcbiAgICBob29rczogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBkaXNwYXRjaDogUHJvcFR5cGVzLmZ1bmMsXG4gICAgY29uZmlnOiBQcm9wVHlwZXMub2JqZWN0XG59O1xuXG5jb25zdCBBcHBDb250YWluZXIgPSBjb25uZWN0KFxuICAgIHN0YXRlID0+ICh7XG4gICAgICAgIGhpc3Rvcnk6IHN0YXRlLmhpc3RvcnksXG4gICAgICAgIGNvbmZpZzogc3RhdGUuY29uZmlnXG4gICAgfSksXG4gICAgZGlzcGF0Y2ggPT4gKHtkaXNwYXRjaH0pXG4pKFVuY29ubmVjdGVkQXBwQ29udGFpbmVyKTtcblxuZXhwb3J0IGRlZmF1bHQgQXBwQ29udGFpbmVyO1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nO1xuXG5pbXBvcnQgQXBwUHJvdmlkZXIgZnJvbSAnLi9BcHBQcm92aWRlci5yZWFjdCc7XG5cbmltcG9ydCAnLi9kYXNoQXBpJztcblxuY2xhc3MgRGFzaFJlbmRlcmVyIHtcbiAgICBjb25zdHJ1Y3Rvcihob29rcykge1xuICAgICAgICAvLyByZW5kZXIgRGFzaCBSZW5kZXJlciB1cG9uIGluaXRpYWxpc2luZyFcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlYWN0LWVudHJ5LXBvaW50Jyk7XG5cbiAgICAgICAgaWYgKFJlYWN0RE9NLmNyZWF0ZVJvb3QpIHtcbiAgICAgICAgICAgIGNvbnN0IHJvb3QgPSBSZWFjdERPTS5jcmVhdGVSb290KGNvbnRhaW5lcik7XG4gICAgICAgICAgICByb290LnJlbmRlcig8QXBwUHJvdmlkZXIgaG9va3M9e2hvb2tzfSAvPik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBSZWFjdERPTS5yZW5kZXIoPEFwcFByb3ZpZGVyIGhvb2tzPXtob29rc30gLz4sIGNvbnRhaW5lcik7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCB7RGFzaFJlbmRlcmVyfTtcbiIsImltcG9ydCB7bWVyZ2VEZWVwUmlnaHQsIG9uY2V9IGZyb20gJ3JhbWRhJztcbmltcG9ydCB7Z2V0Q1NSRkhlYWRlciwgaGFuZGxlQXN5bmNFcnJvciwgYWRkSHR0cEhlYWRlcnN9IGZyb20gJy4uL2FjdGlvbnMnO1xuaW1wb3J0IHt1cmxCYXNlfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7TUFYX0FVVEhfUkVUUklFU30gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHtKV1RfRVhQSVJFRF9NRVNTQUdFLCBTVEFUVVN9IGZyb20gJy4uL2NvbnN0YW50cy9jb25zdGFudHMnO1xuXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZSAqL1xuY29uc3QgbG9nV2FybmluZ09uY2UgPSBvbmNlKGNvbnNvbGUud2Fybik7XG5cbmZ1bmN0aW9uIEdFVChwYXRoLCBmZXRjaENvbmZpZywgX2JvZHksIGNvbmZpZykge1xuICAgIHJldHVybiBmZXRjaChcbiAgICAgICAgcGF0aCxcbiAgICAgICAgbWVyZ2VEZWVwUmlnaHQoZmV0Y2hDb25maWcsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgICBoZWFkZXJzOiBnZXRDU1JGSGVhZGVyKGNvbmZpZylcbiAgICAgICAgfSlcbiAgICApO1xufVxuXG5mdW5jdGlvbiBQT1NUKHBhdGgsIGZldGNoQ29uZmlnLCBib2R5ID0ge30sIGNvbmZpZykge1xuICAgIHJldHVybiBmZXRjaChcbiAgICAgICAgcGF0aCxcbiAgICAgICAgbWVyZ2VEZWVwUmlnaHQoZmV0Y2hDb25maWcsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgaGVhZGVyczogZ2V0Q1NSRkhlYWRlcihjb25maWcpLFxuICAgICAgICAgICAgYm9keTogYm9keSA/IEpTT04uc3RyaW5naWZ5KGJvZHkpIDogbnVsbFxuICAgICAgICB9KVxuICAgICk7XG59XG5cbmNvbnN0IHJlcXVlc3QgPSB7R0VULCBQT1NUfTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYXBpVGh1bmsoZW5kcG9pbnQsIG1ldGhvZCwgc3RvcmUsIGlkLCBib2R5KSB7XG4gICAgcmV0dXJuIGFzeW5jIChkaXNwYXRjaCwgZ2V0U3RhdGUpID0+IHtcbiAgICAgICAgbGV0IHtjb25maWcsIGhvb2tzfSA9IGdldFN0YXRlKCk7XG4gICAgICAgIGxldCBuZXdIZWFkZXJzID0gbnVsbDtcblxuICAgICAgICBjb25zdCB1cmwgPSBgJHt1cmxCYXNlKGNvbmZpZyl9JHtlbmRwb2ludH1gO1xuXG4gICAgICAgIGZ1bmN0aW9uIHNldENvbm5lY3Rpb25TdGF0dXMoY29ubmVjdGVkKSB7XG4gICAgICAgICAgICBpZiAoZ2V0U3RhdGUoKS5lcnJvci5iYWNrRW5kQ29ubmVjdGVkICE9PSBjb25uZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdTRVRfQ09OTkVDVElPTl9TVEFUVVMnLFxuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiBjb25uZWN0ZWRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgICAgIHR5cGU6IHN0b3JlLFxuICAgICAgICAgICAgcGF5bG9hZDoge2lkLCBzdGF0dXM6ICdsb2FkaW5nJ31cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCByZXM7XG4gICAgICAgICAgICBmb3IgKGxldCByZXRyeSA9IDA7IHJldHJ5IDw9IE1BWF9BVVRIX1JFVFJJRVM7IHJldHJ5KyspIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXMgPSBhd2FpdCByZXF1ZXN0W21ldGhvZF0oXG4gICAgICAgICAgICAgICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuZmV0Y2gsXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5LFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBmZXRjaCByZWplY3Rpb24gLSB0aGlzIG1lYW5zIHRoZSByZXF1ZXN0IGRpZG4ndCByZXR1cm4sXG4gICAgICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IGdldCBoZXJlIGZyb20gNDAwLzUwMCBlcnJvcnMsIG9ubHkgbmV0d29ya1xuICAgICAgICAgICAgICAgICAgICAvLyBlcnJvcnMgb3IgdW5yZXNwb25zaXZlIHNlcnZlcnMuXG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdmZXRjaCBlcnJvcicsIHJlcyk7XG4gICAgICAgICAgICAgICAgICAgIHNldENvbm5lY3Rpb25TdGF0dXMoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICByZXMuc3RhdHVzID09PSBTVEFUVVMuVU5BVVRIT1JJWkVEIHx8XG4gICAgICAgICAgICAgICAgICAgIHJlcy5zdGF0dXMgPT09IFNUQVRVUy5CQURfUkVRVUVTVFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaG9va3MucmVxdWVzdF9yZWZyZXNoX2p3dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IGF3YWl0IHJlcy50ZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYm9keS5pbmNsdWRlcyhKV1RfRVhQSVJFRF9NRVNTQUdFKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0p3dCA9IGF3YWl0IGhvb2tzLnJlcXVlc3RfcmVmcmVzaF9qd3QoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5mZXRjaC5oZWFkZXJzLkF1dGhvcml6YXRpb24uc3Vic3RyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0JlYXJlciAnLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Snd0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0hlYWRlcnMgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7bmV3Snd0fWBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcgPSBtZXJnZURlZXBSaWdodChjb25maWcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZldGNoOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogbmV3SGVhZGVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gcmVzLmhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnKTtcblxuICAgICAgICAgICAgaWYgKG5ld0hlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaChhZGRIdHRwSGVhZGVycyhuZXdIZWFkZXJzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXRDb25uZWN0aW9uU3RhdHVzKHRydWUpO1xuICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlICYmIGNvbnRlbnRUeXBlLmluZGV4T2YoJ2FwcGxpY2F0aW9uL2pzb24nKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzLmpzb24oKS50aGVuKGpzb24gPT4ge1xuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBzdG9yZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHJlcy5zdGF0dXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudDoganNvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGpzb247XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVzLnRleHQoKTtcbiAgICAgICAgICAgIGxvZ1dhcm5pbmdPbmNlKFxuICAgICAgICAgICAgICAgICdSZXNwb25zZSBpcyBtaXNzaW5nIGhlYWRlcjogY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBkaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogc3RvcmUsXG4gICAgICAgICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiByZXMuc3RhdHVzLFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9ICdFcnJvciBmcm9tIEFQSSBjYWxsOiAnICsgZW5kcG9pbnQ7XG4gICAgICAgICAgICBoYW5kbGVBc3luY0Vycm9yKGVyciwgbWVzc2FnZSwgZGlzcGF0Y2gpO1xuICAgICAgICB9XG4gICAgfTtcbn1cbiIsImNvbnN0IGFjdGlvbkxpc3QgPSB7XG4gICAgT05fUFJPUF9DSEFOR0U6IDEsXG4gICAgU0VUX1JFUVVFU1RfUVVFVUU6IDEsXG4gICAgU0VUX0dSQVBIUzogMSxcbiAgICBTRVRfUEFUSFM6IDEsXG4gICAgU0VUX0xBWU9VVDogMSxcbiAgICBTRVRfQVBQX0xJRkVDWUNMRTogMSxcbiAgICBTRVRfQ09ORklHOiAxLFxuICAgIEFERF9IVFRQX0hFQURFUlM6IDEsXG4gICAgT05fRVJST1I6IDEsXG4gICAgU0VUX0hPT0tTOiAxLFxuICAgIElOU0VSVF9DT01QT05FTlQ6IDEsXG4gICAgUkVNT1ZFX0NPTVBPTkVOVDogMSxcbiAgICBSRVNFVF9DT01QT05FTlRfU1RBVEU6IDFcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRBY3Rpb24gPSBhY3Rpb24gPT4ge1xuICAgIGlmIChhY3Rpb25MaXN0W2FjdGlvbl0pIHtcbiAgICAgICAgcmV0dXJuIGFjdGlvbjtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke2FjdGlvbn0gaXMgbm90IGRlZmluZWQuYCk7XG59O1xuXG5leHBvcnQgY29uc3QgTUFYX0FVVEhfUkVUUklFUyA9IDE7XG4iLCJpbXBvcnQge0RlcEdyYXBofSBmcm9tICdkZXBlbmRlbmN5LWdyYXBoJztcbmltcG9ydCBpc051bWVyaWMgZnJvbSAnZmFzdC1pc251bWVyaWMnO1xuaW1wb3J0IHtcbiAgICBhbGwsXG4gICAgYW55LFxuICAgIGFwLFxuICAgIGFzc29jLFxuICAgIGNvbmNhdCxcbiAgICBkaWZmZXJlbmNlLFxuICAgIGVxdWFscyxcbiAgICBldm9sdmUsXG4gICAgZmluZEluZGV4LFxuICAgIGZsYXR0ZW4sXG4gICAgZm9yRWFjaE9iakluZGV4ZWQsXG4gICAgaW5jbHVkZXMsXG4gICAgaW50ZXJzZWN0aW9uLFxuICAgIGlzRW1wdHksXG4gICAga2V5cyxcbiAgICBtYXAsXG4gICAgbWVyZ2VSaWdodCxcbiAgICBwYXRoLFxuICAgIHBsdWNrLFxuICAgIHByb3BzLFxuICAgIHN0YXJ0c1dpdGgsXG4gICAgdmFsdWVzLFxuICAgIHppcCxcbiAgICB6aXBPYmpcbn0gZnJvbSAncmFtZGEnO1xuXG5pbXBvcnQge1xuICAgIGNvbWJpbmVJZEFuZFByb3AsXG4gICAgZ2V0Q2FsbGJhY2tzQnlJbnB1dCxcbiAgICBnZXRQcmlvcml0eSxcbiAgICBJTkRJUkVDVCxcbiAgICBtZXJnZU1heCxcbiAgICBtYWtlUmVzb2x2ZWRDYWxsYmFjayxcbiAgICByZXNvbHZlRGVwcyxcbiAgICByZXNvbHZlUGFydGlhbERlcHNcbn0gZnJvbSAnLi9kZXBlbmRlbmNpZXNfdHMnO1xuaW1wb3J0IHtjb21wdXRlUGF0aHMsIGdldFBhdGh9IGZyb20gJy4vcGF0aHMnO1xuaW1wb3J0IHtpc0NhcnJpZWRPdmVyQnlQYXRjaCwgd2FzV3JpdHRlbkJ5UGF0Y2h9IGZyb20gJy4vcGF0Y2hBbmFseXNpcyc7XG5cbmltcG9ydCB7Y3Jhd2xMYXlvdXR9IGZyb20gJy4vdXRpbHMnO1xuXG5pbXBvcnQgUmVnaXN0cnkgZnJvbSAnLi4vcmVnaXN0cnknO1xuXG4vKlxuICogSWYgdGhpcyB1cGRhdGUgaXMgZm9yIG11bHRpcGxlIG91dHB1dHMsIHRoZW4gaXQgaGFzXG4gKiBzdGFydGluZyAmIHRyYWlsaW5nIGAuLmAgYW5kIGVhY2ggcHJvcElkIHBhaXIgaXMgc2VwYXJhdGVkXG4gKiBieSBgLi4uYCwgZS5nLlxuICogXCIuLm91dHB1dC0xLnZhbHVlLi4ub3V0cHV0LTIudmFsdWUuLi5vdXRwdXQtMy52YWx1ZS4uLm91dHB1dC00LnZhbHVlLi5cIlxuICovXG5leHBvcnQgY29uc3QgaXNNdWx0aU91dHB1dFByb3AgPSBpZEFuZFByb3AgPT4gaWRBbmRQcm9wLnN0YXJ0c1dpdGgoJy4uJyk7XG5cbmNvbnN0IEFMTCA9IHt3aWxkOiAnQUxMJywgbXVsdGk6IDF9O1xuY29uc3QgTUFUQ0ggPSB7d2lsZDogJ01BVENIJ307XG5jb25zdCBBTExTTUFMTEVSID0ge3dpbGQ6ICdBTExTTUFMTEVSJywgbXVsdGk6IDEsIGV4cGFuZDogMX07XG5jb25zdCB3aWxkY2FyZHMgPSB7QUxMLCBNQVRDSCwgQUxMU01BTExFUn07XG5jb25zdCBhbGxvd2VkV2lsZGNhcmRzID0ge1xuICAgIE91dHB1dDoge0FMTCwgTUFUQ0h9LFxuICAgIElucHV0OiB3aWxkY2FyZHMsXG4gICAgU3RhdGU6IHdpbGRjYXJkc1xufTtcbmNvbnN0IHdpbGRjYXJkVmFsVHlwZXMgPSBbJ3N0cmluZycsICdudW1iZXInLCAnYm9vbGVhbiddO1xuXG5jb25zdCBpZEludmFsaWRDaGFycyA9IFsnLicsICd7J107XG5cbi8qXG4gKiBJZiB0aGlzIElEIGlzIGEgd2lsZGNhcmQsIGl0IGlzIGEgc3RyaW5naWZpZWQgSlNPTiBvYmplY3RcbiAqIHRoZSBcIntcIiBjaGFyYWN0ZXIgaXMgZGlzYWxsb3dlZCBmcm9tIHJlZ3VsYXIgc3RyaW5nIElEc1xuICovXG5jb25zdCBpc1dpbGRjYXJkSWQgPSBpZFN0ciA9PiBpZFN0ci5zdGFydHNXaXRoKCd7Jyk7XG5cbi8qXG4gKiBUdXJuIHN0cmluZ2lmaWVkIHdpbGRjYXJkIElEcyBpbnRvIG9iamVjdHMuXG4gKiBXaWxkY2FyZHMgYXJlIGVuY29kZWQgYXMgc2luZ2xlLWl0ZW0gYXJyYXlzIGNvbnRhaW5pbmcgdGhlIHdpbGRjYXJkIG5hbWVcbiAqIGFzIGEgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBwYXJzZVdpbGRjYXJkSWQoaWRTdHIpIHtcbiAgICByZXR1cm4gbWFwKFxuICAgICAgICB2YWwgPT4gKEFycmF5LmlzQXJyYXkodmFsKSAmJiB3aWxkY2FyZHNbdmFsWzBdXSkgfHwgdmFsLFxuICAgICAgICBKU09OLnBhcnNlKGlkU3RyKVxuICAgICk7XG59XG5cbi8qXG4gKiBJZiB0aGlzIHVwZGF0ZSBpcyBmb3IgbXVsdGlwbGUgb3V0cHV0cywgdGhlbiBpdCBoYXNcbiAqIHN0YXJ0aW5nICYgdHJhaWxpbmcgYC4uYCBhbmQgZWFjaCBwcm9wSWQgcGFpciBpcyBzZXBhcmF0ZWRcbiAqIGJ5IGAuLi5gLCBlLmcuXG4gKiBcIi4ub3V0cHV0LTEudmFsdWUuLi5vdXRwdXQtMi52YWx1ZS4uLm91dHB1dC0zLnZhbHVlLi4ub3V0cHV0LTQudmFsdWUuLlwiXG4gKi9cbmZ1bmN0aW9uIHBhcnNlTXVsdGlwbGVPdXRwdXRzKG91dHB1dElkQW5kUHJvcCkge1xuICAgIHJldHVybiBvdXRwdXRJZEFuZFByb3Auc3Vic3RyKDIsIG91dHB1dElkQW5kUHJvcC5sZW5ndGggLSA0KS5zcGxpdCgnLi4uJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdElkQW5kUHJvcChpZEFuZFByb3ApIHtcbiAgICAvLyBzaW5jZSB3aWxkY2FyZCBpZHMgY2FuIGhhdmUgLiBpbiB0aGVtIGJ1dCBwcm9wcyBjYW4ndCxcbiAgICAvLyBsb29rIGZvciB0aGUgbGFzdCAuIGluIHRoZSBzdHJpbmcgYW5kIHNwbGl0IHRoZXJlXG4gICAgY29uc3QgZG90UG9zID0gaWRBbmRQcm9wLmxhc3RJbmRleE9mKCcuJyk7XG4gICAgY29uc3QgaWRTdHIgPSBpZEFuZFByb3Auc3Vic3RyKDAsIGRvdFBvcyk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IHBhcnNlSWZXaWxkY2FyZChpZFN0ciksXG4gICAgICAgIHByb3BlcnR5OiBpZEFuZFByb3Auc3Vic3RyKGRvdFBvcyArIDEpXG4gICAgfTtcbn1cblxuLypcbiAqIENoZWNrIGlmIHRoaXMgSUQgaXMgYSBzdHJpbmdpZmllZCBvYmplY3QsIGFuZCBpZiBzbyBwYXJzZSBpdCB0byB0aGF0IG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VJZldpbGRjYXJkKGlkU3RyKSB7XG4gICAgcmV0dXJuIGlzV2lsZGNhcmRJZChpZFN0cikgPyBwYXJzZVdpbGRjYXJkSWQoaWRTdHIpIDogaWRTdHI7XG59XG5cbi8qXG4gKiBKU09OLnN0cmluZ2lmeSAtIGZvciB0aGUgb2JqZWN0IGZvcm0gLSBidXQgZW5zdXJpbmcga2V5cyBhcmUgc29ydGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdpZnlJZChpZCkge1xuICAgIGlmICh0eXBlb2YgaWQgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBpZDtcbiAgICB9XG4gICAgY29uc3Qgc3RyaW5naWZ5VmFsID0gdiA9PiAodiAmJiB2LndpbGQpIHx8IEpTT04uc3RyaW5naWZ5KHYpO1xuICAgIGNvbnN0IHBhcnRzID0gT2JqZWN0LmtleXMoaWQpXG4gICAgICAgIC5zb3J0KClcbiAgICAgICAgLm1hcChrID0+IEpTT04uc3RyaW5naWZ5KGspICsgJzonICsgc3RyaW5naWZ5VmFsKGlkW2tdKSk7XG4gICAgcmV0dXJuICd7JyArIHBhcnRzLmpvaW4oJywnKSArICd9Jztcbn1cblxuLypcbiAqIGlkIGRpY3QgdmFsdWVzIGNhbiBiZSBudW1iZXJzLCBzdHJpbmdzLCBhbmQgYm9vbGVhbnMuXG4gKiBXZSBuZWVkIGEgZGVmaW5pdGUgb3JkZXJpbmcgdGhhdCB3aWxsIHdvcmsgYWNyb3NzIHR5cGVzLFxuICogZXZlbiBpZiBzYW5lIHVzZXJzIHdvdWxkIG5vdCBtaXggdHlwZXMuXG4gKiAtIG51bWVyaWMgc3RyaW5ncyBhcmUgdHJlYXRlZCBhcyBudW1iZXJzXG4gKiAtIGJvb2xlYW5zIGNvbWUgYWZ0ZXIgbnVtYmVycywgYmVmb3JlIHN0cmluZ3MuIGZhbHNlLCB0aGVuIHRydWUuXG4gKiAtIG5vbi1udW1lcmljIHN0cmluZ3MgY29tZSBsYXN0XG4gKi9cbmZ1bmN0aW9uIGlkVmFsU29ydChhLCBiKSB7XG4gICAgY29uc3QgYklzTnVtZXJpYyA9IGlzTnVtZXJpYyhiKTtcbiAgICBpZiAoaXNOdW1lcmljKGEpKSB7XG4gICAgICAgIGlmIChiSXNOdW1lcmljKSB7XG4gICAgICAgICAgICBjb25zdCBhTiA9IE51bWJlcihhKTtcbiAgICAgICAgICAgIGNvbnN0IGJOID0gTnVtYmVyKGIpO1xuICAgICAgICAgICAgcmV0dXJuIGFOID4gYk4gPyAxIDogYU4gPCBiTiA/IC0xIDogMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuICAgIGlmIChiSXNOdW1lcmljKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICBjb25zdCBhSXNCb29sID0gdHlwZW9mIGEgPT09ICdib29sZWFuJztcbiAgICBpZiAoYUlzQm9vbCAhPT0gKHR5cGVvZiBiID09PSAnYm9vbGVhbicpKSB7XG4gICAgICAgIHJldHVybiBhSXNCb29sID8gLTEgOiAxO1xuICAgIH1cbiAgICByZXR1cm4gYSA+IGIgPyAxIDogYSA8IGIgPyAtMSA6IDA7XG59XG5cbi8qXG4gKiBQcm92aWRlIGEgdmFsdWUga25vd24gdG8gYmUgYmVmb3JlIG9yIGFmdGVyIHYsIGFjY29yZGluZyB0byBpZFZhbFNvcnRcbiAqL1xuY29uc3QgdmFsQmVmb3JlID0gdiA9PiAoaXNOdW1lcmljKHYpID8gdiAtIDEgOiAwKTtcbmNvbnN0IHZhbEFmdGVyID0gdiA9PiAodHlwZW9mIHYgPT09ICdzdHJpbmcnID8gdiArICd6JyA6ICd6Jyk7XG5cbmZ1bmN0aW9uIGFkZE1hcChkZXBNYXAsIGlkLCBwcm9wLCBkZXBlbmRlbmN5KSB7XG4gICAgY29uc3QgaWRNYXAgPSAoZGVwTWFwW2lkXSA9IGRlcE1hcFtpZF0gfHwge30pO1xuICAgIGNvbnN0IGNhbGxiYWNrcyA9IChpZE1hcFtwcm9wXSA9IGlkTWFwW3Byb3BdIHx8IFtdKTtcbiAgICBjYWxsYmFja3MucHVzaChkZXBlbmRlbmN5KTtcbn1cblxuLy8gUGF0dGVybnMgYXJlIHN0b3JlZCBpbiBhIG5lc3RlZCBNYXAgc3RydWN0dXJlIHRvIGF2b2lkIHRoZSBvdmVyaGVhZCBvZlxuLy8gc3RyaW5naWZ5aW5nIGlkcyBmb3IgZXZlcnkgY2FsbGJhY2suXG5mdW5jdGlvbiBhZGRQYXR0ZXJuKHBhdHRlcm5zLCBpZFNwZWMsIHByb3AsIGRlcGVuZGVuY3kpIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaWRTcGVjKS5zb3J0KCk7XG4gICAgY29uc3Qga2V5U3RyID0ga2V5cy5qb2luKCcsJyk7XG4gICAgY29uc3QgdmFsdWVzID0gcHJvcHMoa2V5cywgaWRTcGVjKTtcbiAgICBjb25zdCB2YWx1ZXNLZXkgPSB2YWx1ZXNcbiAgICAgICAgLm1hcCh2ID0+XG4gICAgICAgICAgICB0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdiAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gdi53aWxkXG4gICAgICAgICAgICAgICAgICAgID8gdi53aWxkXG4gICAgICAgICAgICAgICAgICAgIDogSlNPTi5zdHJpbmdpZnkodilcbiAgICAgICAgICAgICAgICA6IFN0cmluZyh2KVxuICAgICAgICApXG4gICAgICAgIC5qb2luKCd8Jyk7XG5cbiAgICBpZiAoIXBhdHRlcm5zLmhhcyhrZXlTdHIpKSB7XG4gICAgICAgIHBhdHRlcm5zLnNldChrZXlTdHIsIG5ldyBNYXAoKSk7XG4gICAgfVxuICAgIGNvbnN0IHByb3BNYXAgPSBwYXR0ZXJucy5nZXQoa2V5U3RyKTtcbiAgICBpZiAoIXByb3BNYXAuaGFzKHByb3ApKSB7XG4gICAgICAgIHByb3BNYXAuc2V0KHByb3AsIG5ldyBNYXAoKSk7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlTWFwID0gcHJvcE1hcC5nZXQocHJvcCk7XG5cbiAgICBsZXQgdmFsTWF0Y2ggPSB2YWx1ZU1hcC5nZXQodmFsdWVzS2V5KTtcbiAgICBpZiAoIXZhbE1hdGNoKSB7XG4gICAgICAgIHZhbE1hdGNoID0ge2tleXMsIHZhbHVlcywgY2FsbGJhY2tzOiBbXSwgcGFydGlhbDogZmFsc2V9O1xuICAgICAgICB2YWx1ZU1hcC5zZXQodmFsdWVzS2V5LCB2YWxNYXRjaCk7XG4gICAgfVxuICAgIHZhbE1hdGNoLmNhbGxiYWNrcy5wdXNoKGRlcGVuZGVuY3kpO1xufVxuXG4vLyBBZGQgYSBwYXJ0aWFsIHBhdHRlcm4gLSBzdG9yZWQgd2l0aCBwYXJ0aWFsIGZsYWcgc28gbG9va3VwIGtub3dzIHRvIGRvXG4vLyBzdWJzZXQga2V5IG1hdGNoaW5nLlxuZnVuY3Rpb24gYWRkUGFydGlhbFBhdHRlcm4ocGF0dGVybnMsIGlkU3BlYywgcHJvcCwgZGVwZW5kZW5jeSkge1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhpZFNwZWMpLnNvcnQoKTtcbiAgICBjb25zdCBrZXlTdHIgPSBrZXlzLmpvaW4oJywnKTtcbiAgICBjb25zdCB2YWx1ZXMgPSBwcm9wcyhrZXlzLCBpZFNwZWMpO1xuICAgIGNvbnN0IHZhbHVlc0tleSA9IHZhbHVlc1xuICAgICAgICAubWFwKHYgPT5cbiAgICAgICAgICAgIHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiB2ICE9PSBudWxsXG4gICAgICAgICAgICAgICAgPyB2LndpbGRcbiAgICAgICAgICAgICAgICAgICAgPyB2LndpbGRcbiAgICAgICAgICAgICAgICAgICAgOiBKU09OLnN0cmluZ2lmeSh2KVxuICAgICAgICAgICAgICAgIDogU3RyaW5nKHYpXG4gICAgICAgIClcbiAgICAgICAgLmpvaW4oJ3wnKTtcblxuICAgIGlmICghcGF0dGVybnMuaGFzKGtleVN0cikpIHtcbiAgICAgICAgcGF0dGVybnMuc2V0KGtleVN0ciwgbmV3IE1hcCgpKTtcbiAgICB9XG4gICAgY29uc3QgcHJvcE1hcCA9IHBhdHRlcm5zLmdldChrZXlTdHIpO1xuICAgIGlmICghcHJvcE1hcC5oYXMocHJvcCkpIHtcbiAgICAgICAgcHJvcE1hcC5zZXQocHJvcCwgbmV3IE1hcCgpKTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWVNYXAgPSBwcm9wTWFwLmdldChwcm9wKTtcblxuICAgIGxldCB2YWxNYXRjaCA9IHZhbHVlTWFwLmdldCh2YWx1ZXNLZXkpO1xuICAgIGlmICghdmFsTWF0Y2gpIHtcbiAgICAgICAgdmFsTWF0Y2ggPSB7a2V5cywgdmFsdWVzLCBjYWxsYmFja3M6IFtdLCBwYXJ0aWFsOiB0cnVlfTtcbiAgICAgICAgdmFsdWVNYXAuc2V0KHZhbHVlc0tleSwgdmFsTWF0Y2gpO1xuICAgIH1cbiAgICB2YWxNYXRjaC5jYWxsYmFja3MucHVzaChkZXBlbmRlbmN5KTtcbn1cblxuLy8gQ29udmVydCB0aGUgbmVzdGVkIE1hcCBzdHJ1Y3R1cmUgb2YgcGF0dGVybnMgaW50byB0aGUgcGxhaW4gbmVzdGVkIG9iamVjdCBzdHJ1Y3R1cmVcbi8vIGV4cGVjdGVkIGJ5IHRoZSByZXN0IG9mIHRoZSBjb2RlLCB3aXRoIHN0cmluZ2lmaWVkIGlkIGtleXMuXG4vLyBUaGlzIGlzIG9ubHkgZG9uZSBvbmNlIHBlciBwYXR0ZXJuLCBhdCB0aGUgZW5kIG9mIGdyYXBoIGNvbnN0cnVjdGlvbixcbi8vIHRvIG1pbmltaXplIHRoZSBvdmVyaGVhZCBvZiBzdHJpbmdpZnlpbmcgaWRzLlxuZnVuY3Rpb24gb2ZmbG9hZFBhdHRlcm5zKHBhdHRlcm5zTWFwLCB0YXJnZXRNYXApIHtcbiAgICBmb3IgKGNvbnN0IFtrZXlTdHIsIHByb3BNYXBdIG9mIHBhdHRlcm5zTWFwLmVudHJpZXMoKSkge1xuICAgICAgICB0YXJnZXRNYXBba2V5U3RyXSA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IFtwcm9wLCB2YWx1ZU1hcF0gb2YgcHJvcE1hcC5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIHRhcmdldE1hcFtrZXlTdHJdW3Byb3BdID0gQXJyYXkuZnJvbSh2YWx1ZU1hcC52YWx1ZXMoKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldE1hcDtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVEZXBlbmRlbmNpZXMocGFyc2VkRGVwZW5kZW5jaWVzLCBkaXNwYXRjaEVycm9yKSB7XG4gICAgY29uc3Qgb3V0U3RycyA9IHt9O1xuICAgIGNvbnN0IG91dE9ianMgPSBbXTtcblxuICAgIHBhcnNlZERlcGVuZGVuY2llcy5mb3JFYWNoKGRlcCA9PiB7XG4gICAgICAgIGNvbnN0IHtpbnB1dHMsIG91dHB1dHMsIHN0YXRlfSA9IGRlcDtcbiAgICAgICAgbGV0IGhhc091dHB1dHMgPSB0cnVlO1xuICAgICAgICBpZiAob3V0cHV0cy5sZW5ndGggPT09IDEgJiYgIW91dHB1dHNbMF0uaWQgJiYgIW91dHB1dHNbMF0ucHJvcGVydHkpIHtcbiAgICAgICAgICAgIGhhc091dHB1dHMgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhlYWQgPVxuICAgICAgICAgICAgJ0luIHRoZSBjYWxsYmFjayBmb3Igb3V0cHV0KHMpOlxcbiAgJyArXG4gICAgICAgICAgICBvdXRwdXRzLm1hcChjb21iaW5lSWRBbmRQcm9wKS5qb2luKCdcXG4gICcpO1xuXG4gICAgICAgIGlmICghaW5wdXRzLmxlbmd0aCAmJiBkZXAucHJldmVudF9pbml0aWFsX2NhbGwpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoRXJyb3IoJ0EgY2FsbGJhY2sgaXMgbWlzc2luZyBJbnB1dHMnLCBbXG4gICAgICAgICAgICAgICAgaGVhZCxcbiAgICAgICAgICAgICAgICAndGhlcmUgYXJlIG5vIGBJbnB1dGAgZWxlbWVudHMuJyxcbiAgICAgICAgICAgICAgICAnV2l0aG91dCBgSW5wdXRgIGVsZW1lbnRzLCBpdCB3aWxsIG5ldmVyIGdldCBjYWxsZWQuJyxcbiAgICAgICAgICAgICAgICAnJyxcbiAgICAgICAgICAgICAgICAnU3Vic2NyaWJpbmcgdG8gYElucHV0YCBjb21wb25lbnRzIHdpbGwgY2F1c2UgdGhlJyxcbiAgICAgICAgICAgICAgICAnY2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW5ldmVyIHRoZWlyIHZhbHVlcyBjaGFuZ2UuJyxcbiAgICAgICAgICAgICAgICAnJyxcbiAgICAgICAgICAgICAgICAnSWYgeW91IHdhbnQgYSBjYWxsYmFjayB3aXRob3V0IGlucHV0cyB0aGF0IGZpcmVzIG9uIGluaXRpYWwgbG9hZCwnLFxuICAgICAgICAgICAgICAgICdzZXQgcHJldmVudF9pbml0aWFsX2NhbGw9RmFsc2UuJ1xuICAgICAgICAgICAgXSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzcGVjID0gW1xuICAgICAgICAgICAgW291dHB1dHMsICdPdXRwdXQnXSxcbiAgICAgICAgICAgIFtpbnB1dHMsICdJbnB1dCddLFxuICAgICAgICAgICAgW3N0YXRlLCAnU3RhdGUnXVxuICAgICAgICBdO1xuICAgICAgICBzcGVjLmZvckVhY2goKFthcmdzLCBjbHNdKSA9PiB7XG4gICAgICAgICAgICBpZiAoY2xzID09PSAnT3V0cHV0JyAmJiAhaGFzT3V0cHV0cykge1xuICAgICAgICAgICAgICAgIC8vIGp1c3QgYSBxdWlyayBvZiBob3cgd2UgcGFzcyAmIHBhcnNlIG91dHB1dHMgLSBpZiB5b3UgZG9uJ3RcbiAgICAgICAgICAgICAgICAvLyBwcm92aWRlIG9uZSwgaXQgbG9va3MgbGlrZSBhIHNpbmdsZSBibGFuayBvdXRwdXQuIFRoaXMgaXNcbiAgICAgICAgICAgICAgICAvLyBhY3R1YWxseSB1c2VmdWwgZm9yIGdyYWNlZnVsIGZhaWx1cmUsIHNvIHdlIHdvcmsgYXJvdW5kIGl0LlxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGFyZ3MpKSB7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2hFcnJvcihgQ2FsbGJhY2sgJHtjbHN9KHMpIG11c3QgYmUgYW4gQXJyYXlgLCBbXG4gICAgICAgICAgICAgICAgICAgIGhlYWQsXG4gICAgICAgICAgICAgICAgICAgIGBGb3IgJHtjbHN9KHMpIHdlIGZvdW5kOmAsXG4gICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGFyZ3MpLFxuICAgICAgICAgICAgICAgICAgICAnYnV0IHdlIGV4cGVjdGVkIGFuIEFycmF5LidcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFyZ3MuZm9yRWFjaCgoaWRQcm9wLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgdmFsaWRhdGVBcmcoaWRQcm9wLCBoZWFkLCBjbHMsIGksIGRpc3BhdGNoRXJyb3IpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChoYXNPdXRwdXRzKSB7XG4gICAgICAgICAgICBmaW5kRHVwbGljYXRlT3V0cHV0cyhcbiAgICAgICAgICAgICAgICBvdXRwdXRzLFxuICAgICAgICAgICAgICAgIGhlYWQsXG4gICAgICAgICAgICAgICAgZGlzcGF0Y2hFcnJvcixcbiAgICAgICAgICAgICAgICBvdXRTdHJzLFxuICAgICAgICAgICAgICAgIG91dE9ianNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBmaW5kTWlzbWF0Y2hlZFdpbGRjYXJkcyhcbiAgICAgICAgICAgICAgICBvdXRwdXRzLFxuICAgICAgICAgICAgICAgIGlucHV0cyxcbiAgICAgICAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICAgICAgICBoZWFkLFxuICAgICAgICAgICAgICAgIGRpc3BhdGNoRXJyb3JcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVBcmcoe2lkLCBwcm9wZXJ0eX0sIGhlYWQsIGNscywgaSwgZGlzcGF0Y2hFcnJvcikge1xuICAgIGlmICh0eXBlb2YgcHJvcGVydHkgIT09ICdzdHJpbmcnIHx8ICFwcm9wZXJ0eSkge1xuICAgICAgICBkaXNwYXRjaEVycm9yKCdDYWxsYmFjayBwcm9wZXJ0eSBlcnJvcicsIFtcbiAgICAgICAgICAgIGhlYWQsXG4gICAgICAgICAgICBgJHtjbHN9WyR7aX1dLnByb3BlcnR5ID0gJHtKU09OLnN0cmluZ2lmeShwcm9wZXJ0eSl9YCxcbiAgICAgICAgICAgICdidXQgd2UgZXhwZWN0ZWQgYHByb3BlcnR5YCB0byBiZSBhIG5vbi1lbXB0eSBzdHJpbmcuJ1xuICAgICAgICBdKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGlkID09PSAnb2JqZWN0Jykge1xuICAgICAgICBpZiAoaXNFbXB0eShpZCkpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoRXJyb3IoJ0NhbGxiYWNrIGl0ZW0gbWlzc2luZyBJRCcsIFtcbiAgICAgICAgICAgICAgICBoZWFkLFxuICAgICAgICAgICAgICAgIGAke2Nsc31bJHtpfV0uaWQgPSB7fWAsXG4gICAgICAgICAgICAgICAgJ0V2ZXJ5IGl0ZW0gbGlua2VkIHRvIGEgY2FsbGJhY2sgbmVlZHMgYW4gSUQnXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvckVhY2hPYmpJbmRleGVkKCh2LCBrKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWspIHtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaEVycm9yKCdDYWxsYmFjayB3aWxkY2FyZCBJRCBlcnJvcicsIFtcbiAgICAgICAgICAgICAgICAgICAgaGVhZCxcbiAgICAgICAgICAgICAgICAgICAgYCR7Y2xzfVske2l9XS5pZCBoYXMga2V5IFwiJHtrfVwiYCxcbiAgICAgICAgICAgICAgICAgICAgJ0tleXMgbXVzdCBiZSBub24tZW1wdHkgc3RyaW5ncy4nXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdi53aWxkKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFsbG93ZWRXaWxkY2FyZHNbY2xzXVt2LndpbGRdICE9PSB2KSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoRXJyb3IoJ0NhbGxiYWNrIHdpbGRjYXJkIElEIGVycm9yJywgW1xuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGAke2Nsc31bJHtpfV0uaWRbXCIke2t9XCJdID0gJHt2LndpbGR9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGBBbGxvd2VkIHdpbGRjYXJkcyBmb3IgJHtjbHN9cyBhcmU6YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleXMoYWxsb3dlZFdpbGRjYXJkc1tjbHNdKS5qb2luKCcsICcpXG4gICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWluY2x1ZGVzKHR5cGVvZiB2LCB3aWxkY2FyZFZhbFR5cGVzKSkge1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoRXJyb3IoJ0NhbGxiYWNrIHdpbGRjYXJkIElEIGVycm9yJywgW1xuICAgICAgICAgICAgICAgICAgICBoZWFkLFxuICAgICAgICAgICAgICAgICAgICBgJHtjbHN9WyR7aX1dLmlkW1wiJHtrfVwiXSA9ICR7SlNPTi5zdHJpbmdpZnkodil9YCxcbiAgICAgICAgICAgICAgICAgICAgJ1dpbGRjYXJkIGNhbGxiYWNrIElEIHZhbHVlcyBtdXN0IGJlIGVpdGhlciB3aWxkY2FyZHMnLFxuICAgICAgICAgICAgICAgICAgICAnb3IgY29uc3RhbnRzIG9mIG9uZSBvZiB0aGVzZSB0eXBlczonLFxuICAgICAgICAgICAgICAgICAgICB3aWxkY2FyZFZhbFR5cGVzLmpvaW4oJywgJylcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgaWQpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGlkID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAoIWlkKSB7XG4gICAgICAgICAgICBkaXNwYXRjaEVycm9yKCdDYWxsYmFjayBpdGVtIG1pc3NpbmcgSUQnLCBbXG4gICAgICAgICAgICAgICAgaGVhZCxcbiAgICAgICAgICAgICAgICBgJHtjbHN9WyR7aX1dLmlkID0gXCIke2lkfVwiYCxcbiAgICAgICAgICAgICAgICAnRXZlcnkgaXRlbSBsaW5rZWQgdG8gYSBjYWxsYmFjayBuZWVkcyBhbiBJRCdcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGludmFsaWRDaGFycyA9IGlkSW52YWxpZENoYXJzLmZpbHRlcihjID0+IGluY2x1ZGVzKGMsIGlkKSk7XG4gICAgICAgIGlmIChpbnZhbGlkQ2hhcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBkaXNwYXRjaEVycm9yKCdDYWxsYmFjayBpbnZhbGlkIElEIHN0cmluZycsIFtcbiAgICAgICAgICAgICAgICBoZWFkLFxuICAgICAgICAgICAgICAgIGAke2Nsc31bJHtpfV0uaWQgPSAnJHtpZH0nYCxcbiAgICAgICAgICAgICAgICBgY2hhcmFjdGVycyAnJHtpbnZhbGlkQ2hhcnMuam9pbihcIicsICdcIil9JyBhcmUgbm90IGFsbG93ZWQuYFxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBkaXNwYXRjaEVycm9yKCdDYWxsYmFjayBJRCB0eXBlIGVycm9yJywgW1xuICAgICAgICAgICAgaGVhZCxcbiAgICAgICAgICAgIGAke2Nsc31bJHtpfV0uaWQgPSAke0pTT04uc3RyaW5naWZ5KGlkKX1gLFxuICAgICAgICAgICAgJ0lEcyBtdXN0IGJlIHN0cmluZ3Mgb3Igd2lsZGNhcmQtY29tcGF0aWJsZSBvYmplY3RzLidcbiAgICAgICAgXSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBmaW5kRHVwbGljYXRlT3V0cHV0cyhvdXRwdXRzLCBoZWFkLCBkaXNwYXRjaEVycm9yLCBvdXRTdHJzLCBvdXRPYmpzKSB7XG4gICAgY29uc3QgbmV3T3V0cHV0U3RycyA9IHt9O1xuICAgIGNvbnN0IG5ld091dHB1dE9ianMgPSBbXTtcbiAgICBvdXRwdXRzLmZvckVhY2goKHtpZCwgcHJvcGVydHl9LCBpKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgaWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCBpZFByb3AgPSBjb21iaW5lSWRBbmRQcm9wKHtpZCwgcHJvcGVydHl9KTtcbiAgICAgICAgICAgIGlmIChuZXdPdXRwdXRTdHJzW2lkUHJvcF0pIHtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaEVycm9yKCdEdXBsaWNhdGUgY2FsbGJhY2sgT3V0cHV0cycsIFtcbiAgICAgICAgICAgICAgICAgICAgaGVhZCxcbiAgICAgICAgICAgICAgICAgICAgYE91dHB1dCAke2l9ICgke2lkUHJvcH0pIGlzIGFscmVhZHkgdXNlZCBieSB0aGlzIGNhbGxiYWNrLmBcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob3V0U3Ryc1tpZFByb3BdKSB7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2hFcnJvcignRHVwbGljYXRlIGNhbGxiYWNrIG91dHB1dHMnLCBbXG4gICAgICAgICAgICAgICAgICAgIGhlYWQsXG4gICAgICAgICAgICAgICAgICAgIGBPdXRwdXQgJHtpfSAoJHtpZFByb3B9KSBpcyBhbHJlYWR5IGluIHVzZS5gLFxuICAgICAgICAgICAgICAgICAgICAnVG8gcmVzb2x2ZSB0aGlzLCBzZXQgYGFsbG93X2R1cGxpY2F0ZT1UcnVlYCBvbicsXG4gICAgICAgICAgICAgICAgICAgICdkdXBsaWNhdGUgb3V0cHV0cywgb3IgY29tYmluZSB0aGUgb3V0cHV0cyBpbnRvJyxcbiAgICAgICAgICAgICAgICAgICAgJ29uZSBjYWxsYmFjayBmdW5jdGlvbiwgZGlzdGluZ3Vpc2hpbmcgdGhlIHRyaWdnZXInLFxuICAgICAgICAgICAgICAgICAgICAnYnkgdXNpbmcgYGRhc2guY2FsbGJhY2tfY29udGV4dGAgaWYgbmVjZXNzYXJ5LidcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbmV3T3V0cHV0U3Ryc1tpZFByb3BdID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGlkT2JqID0ge2lkLCBwcm9wZXJ0eX07XG4gICAgICAgICAgICBjb25zdCBzZWxmT3ZlcmxhcCA9IHdpbGRjYXJkT3ZlcmxhcChpZE9iaiwgbmV3T3V0cHV0T2Jqcyk7XG4gICAgICAgICAgICBjb25zdCBvdGhlck92ZXJsYXAgPSBzZWxmT3ZlcmxhcCB8fCB3aWxkY2FyZE92ZXJsYXAoaWRPYmosIG91dE9ianMpO1xuICAgICAgICAgICAgaWYgKHNlbGZPdmVybGFwIHx8IG90aGVyT3ZlcmxhcCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkUHJvcCA9IGNvbWJpbmVJZEFuZFByb3AoaWRPYmopO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkUHJvcDIgPSBjb21iaW5lSWRBbmRQcm9wKHNlbGZPdmVybGFwIHx8IG90aGVyT3ZlcmxhcCk7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2hFcnJvcignT3ZlcmxhcHBpbmcgd2lsZGNhcmQgY2FsbGJhY2sgb3V0cHV0cycsIFtcbiAgICAgICAgICAgICAgICAgICAgaGVhZCxcbiAgICAgICAgICAgICAgICAgICAgYE91dHB1dCAke2l9ICgke2lkUHJvcH0pYCxcbiAgICAgICAgICAgICAgICAgICAgYG92ZXJsYXBzIGFub3RoZXIgb3V0cHV0ICgke2lkUHJvcDJ9KWAsXG4gICAgICAgICAgICAgICAgICAgIGB1c2VkIGluICR7c2VsZk92ZXJsYXAgPyAndGhpcycgOiAnYSBkaWZmZXJlbnQnfSBjYWxsYmFjay5gXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG5ld091dHB1dE9ianMucHVzaChpZE9iaik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBrZXlzKG5ld091dHB1dFN0cnMpLmZvckVhY2goayA9PiB7XG4gICAgICAgIG91dFN0cnNba10gPSAxO1xuICAgIH0pO1xuICAgIG5ld091dHB1dE9ianMuZm9yRWFjaChpZE9iaiA9PiB7XG4gICAgICAgIG91dE9ianMucHVzaChpZE9iaik7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGNoZWNrSW5PdXRPdmVybGFwKG91dCwgaW5wdXRzKSB7XG4gICAgY29uc3Qge2lkOiBvdXRJZCwgcHJvcGVydHk6IG91dFByb3B9ID0gb3V0O1xuICAgIHJldHVybiBpbnB1dHMuc29tZShpbl8gPT4ge1xuICAgICAgICBjb25zdCB7aWQ6IGluSWQsIHByb3BlcnR5OiBpblByb3B9ID0gaW5fO1xuICAgICAgICBpZiAob3V0UHJvcCAhPT0gaW5Qcm9wIHx8IHR5cGVvZiBvdXRJZCAhPT0gdHlwZW9mIGluSWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG91dElkID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKG91dElkID09PSBpbklkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAod2lsZGNhcmRPdmVybGFwKGluXywgW291dF0pKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGZpbmRNaXNtYXRjaGVkV2lsZGNhcmRzKG91dHB1dHMsIGlucHV0cywgc3RhdGUsIGhlYWQsIGRpc3BhdGNoRXJyb3IpIHtcbiAgICBjb25zdCB7bWF0Y2hLZXlzOiBvdXQwTWF0Y2hLZXlzfSA9IGZpbmRXaWxkY2FyZEtleXMoXG4gICAgICAgIG91dHB1dHMubGVuZ3RoID8gb3V0cHV0c1swXS5pZCA6IHVuZGVmaW5lZFxuICAgICk7XG4gICAgb3V0cHV0cy5mb3JFYWNoKChvdXQsIGkpID0+IHtcbiAgICAgICAgaWYgKGkgJiYgIWVxdWFscyhmaW5kV2lsZGNhcmRLZXlzKG91dC5pZCkubWF0Y2hLZXlzLCBvdXQwTWF0Y2hLZXlzKSkge1xuICAgICAgICAgICAgZGlzcGF0Y2hFcnJvcignTWlzbWF0Y2hlZCBgTUFUQ0hgIHdpbGRjYXJkcyBhY3Jvc3MgYE91dHB1dGBzJywgW1xuICAgICAgICAgICAgICAgIGhlYWQsXG4gICAgICAgICAgICAgICAgYE91dHB1dCAke2l9ICgke2NvbWJpbmVJZEFuZFByb3Aob3V0KX0pYCxcbiAgICAgICAgICAgICAgICAnZG9lcyBub3QgaGF2ZSBNQVRDSCB3aWxkY2FyZHMgb24gdGhlIHNhbWUga2V5cyBhcycsXG4gICAgICAgICAgICAgICAgYE91dHB1dCAwICgke2NvbWJpbmVJZEFuZFByb3Aob3V0cHV0c1swXSl9KS5gLFxuICAgICAgICAgICAgICAgICdNQVRDSCB3aWxkY2FyZHMgbXVzdCBiZSBvbiB0aGUgc2FtZSBrZXlzIGZvciBhbGwgT3V0cHV0cy4nLFxuICAgICAgICAgICAgICAgICdBTEwgd2lsZGNhcmRzIG5lZWQgbm90IG1hdGNoLCBvbmx5IE1BVENILidcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgLy8gV2hlbiB0aGUgT3V0cHV0cyBkb24ndCBjYXJyeSBhbnkgTUFUQ0gga2V5cyAoZml4ZWQtaWQgb3V0cHV0cywgbm9cbiAgICAvLyBvdXRwdXRzLCBvciB3aWxkY2FyZCBvdXRwdXRzIHdpdGggb25seSBBTEwpLCB0aGUgSW5wdXRzL1N0YXRlIG1heSB1c2VcbiAgICAvLyBNQVRDSCBmcmVlbHkg4oCUIGVhY2ggZmlyaW5nIGlzIGlkZW50aWZpZWQgYnkgdGhlIHRyaWdnZXJpbmcgaW5wdXQnc1xuICAgIC8vIE1BVENIIHZhbHVlcy4gQUxMU01BTExFUiBzdGlsbCByZXF1aXJlcyBhIE1BVENIIHJlZmVyZW5jZSwgc28gdGhhdFxuICAgIC8vIGNhc2UgcmVtYWlucyBhbiBlcnJvci4gU2VlIGlzc3VlICMyNDYyLlxuICAgIGNvbnN0IG91dHB1dHNIYXZlTWF0Y2ggPSBvdXQwTWF0Y2hLZXlzLmxlbmd0aCA+IDA7XG4gICAgW1xuICAgICAgICBbaW5wdXRzLCAnSW5wdXQnXSxcbiAgICAgICAgW3N0YXRlLCAnU3RhdGUnXVxuICAgIF0uZm9yRWFjaCgoW2FyZ3MsIGNsc10pID0+IHtcbiAgICAgICAgYXJncy5mb3JFYWNoKChhcmcsIGkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHttYXRjaEtleXMsIGFsbHNtYWxsZXJLZXlzfSA9IGZpbmRXaWxkY2FyZEtleXMoYXJnLmlkKTtcbiAgICAgICAgICAgIGNvbnN0IGRpZmZLZXlzID0gb3V0cHV0c0hhdmVNYXRjaFxuICAgICAgICAgICAgICAgID8gbWF0Y2hLZXlzLmNvbmNhdChhbGxzbWFsbGVyS2V5cylcbiAgICAgICAgICAgICAgICA6IGFsbHNtYWxsZXJLZXlzO1xuICAgICAgICAgICAgY29uc3QgZGlmZiA9IGRpZmZlcmVuY2UoZGlmZktleXMsIG91dDBNYXRjaEtleXMpO1xuICAgICAgICAgICAgaWYgKGRpZmYubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZGlmZi5zb3J0KCk7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3V0RGVzYyA9IG91dHB1dHMubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgID8gYE91dHB1dCAwICgke2NvbWJpbmVJZEFuZFByb3Aob3V0cHV0c1swXSl9KWBcbiAgICAgICAgICAgICAgICAgICAgOiAndGhlIChhYnNlbnQpIE91dHB1dCc7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2hFcnJvcignYElucHV0YCAvIGBTdGF0ZWAgd2lsZGNhcmRzIG5vdCBpbiBgT3V0cHV0YHMnLCBbXG4gICAgICAgICAgICAgICAgICAgIGhlYWQsXG4gICAgICAgICAgICAgICAgICAgIGAke2Nsc30gJHtpfSAoJHtjb21iaW5lSWRBbmRQcm9wKGFyZyl9KWAsXG4gICAgICAgICAgICAgICAgICAgIGBoYXMgTUFUQ0ggb3IgQUxMU01BTExFUiBvbiBrZXkocykgJHtkaWZmLmpvaW4oJywgJyl9YCxcbiAgICAgICAgICAgICAgICAgICAgYHdoZXJlICR7b3V0RGVzY31gLFxuICAgICAgICAgICAgICAgICAgICAnZG9lcyBub3QgaGF2ZSBhIE1BVENIIHdpbGRjYXJkLiBJbnB1dHMgYW5kIFN0YXRlIGRvIG5vdCcsXG4gICAgICAgICAgICAgICAgICAgICduZWVkIGV2ZXJ5IE1BVENIIGZyb20gdGhlIE91dHB1dChzKSwgYnV0IEFMTFNNQUxMRVInLFxuICAgICAgICAgICAgICAgICAgICAncmVxdWlyZXMgYSBtYXRjaGluZyBNQVRDSCBpbiB0aGUgT3V0cHV0KHMpLCBhbmQgd2hlbicsXG4gICAgICAgICAgICAgICAgICAgICd0aGUgT3V0cHV0KHMpIGhhdmUgYW55IE1BVENILCBJbnB1dC9TdGF0ZSBNQVRDSCBrZXlzJyxcbiAgICAgICAgICAgICAgICAgICAgJ211c3QgYmUgYSBzdWJzZXQgb2YgdGhlbS4nXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuXG5jb25zdCBtYXRjaFdpbGRLZXlzID0gKFthLCBiXSkgPT4ge1xuICAgIGNvbnN0IGFXaWxkID0gYSAmJiBhLndpbGQ7XG4gICAgY29uc3QgYldpbGQgPSBiICYmIGIud2lsZDtcbiAgICBpZiAoYVdpbGQgJiYgYldpbGQpIHtcbiAgICAgICAgLy8gRXZlcnkgd2lsZGNhcmQgY29tYmluYXRpb24gb3ZlcmxhcHMgZXhjZXB0IE1BVENIPC0+QUxMU01BTExFUlxuICAgICAgICByZXR1cm4gIShcbiAgICAgICAgICAgIChhID09PSBNQVRDSCAmJiBiID09PSBBTExTTUFMTEVSKSB8fFxuICAgICAgICAgICAgKGEgPT09IEFMTFNNQUxMRVIgJiYgYiA9PT0gTUFUQ0gpXG4gICAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBhID09PSBiIHx8IGFXaWxkIHx8IGJXaWxkO1xufTtcblxuZnVuY3Rpb24gd2lsZGNhcmRPdmVybGFwKHtpZCwgcHJvcGVydHl9LCBvYmpzKSB7XG4gICAgY29uc3QgaWRLZXlzID0ga2V5cyhpZCkuc29ydCgpO1xuICAgIGNvbnN0IGlkVmFscyA9IHByb3BzKGlkS2V5cywgaWQpO1xuICAgIGZvciAoY29uc3Qgb2JqIG9mIG9ianMpIHtcbiAgICAgICAgY29uc3Qge2lkOiBpZDIsIHByb3BlcnR5OiBwcm9wZXJ0eTJ9ID0gb2JqO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBwcm9wZXJ0eTIgPT09IHByb3BlcnR5ICYmXG4gICAgICAgICAgICB0eXBlb2YgaWQyICE9PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgZXF1YWxzKGtleXMoaWQyKS5zb3J0KCksIGlkS2V5cykgJiZcbiAgICAgICAgICAgIGFsbChtYXRjaFdpbGRLZXlzLCB6aXAoaWRWYWxzLCBwcm9wcyhpZEtleXMsIGlkMikpKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBvYmo7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVDYWxsYmFja3NUb0xheW91dChzdGF0ZV8sIGRpc3BhdGNoRXJyb3IpIHtcbiAgICBjb25zdCB7Y29uZmlnLCBncmFwaHMsIGxheW91dDogbGF5b3V0XywgcGF0aHM6IHBhdGhzX30gPSBzdGF0ZV87XG4gICAgY29uc3QgdmFsaWRhdGVJZHMgPSAhY29uZmlnLnN1cHByZXNzX2NhbGxiYWNrX2V4Y2VwdGlvbnM7XG4gICAgbGV0IGxheW91dCwgcGF0aHM7XG4gICAgaWYgKHZhbGlkYXRlSWRzICYmIGNvbmZpZy52YWxpZGF0aW9uX2xheW91dCkge1xuICAgICAgICBsYXlvdXQgPSBjb25maWcudmFsaWRhdGlvbl9sYXlvdXQ7XG4gICAgICAgIHBhdGhzID0gY29tcHV0ZVBhdGhzKGxheW91dCwgW10sIG51bGwsIHBhdGhzXy5ldmVudHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxheW91dCA9IGxheW91dF87XG4gICAgICAgIHBhdGhzID0gcGF0aHNfO1xuICAgIH1cbiAgICBjb25zdCB7b3V0cHV0TWFwLCBpbnB1dE1hcCwgb3V0cHV0UGF0dGVybnMsIGlucHV0UGF0dGVybnN9ID0gZ3JhcGhzO1xuXG4gICAgZnVuY3Rpb24gdGFpbChjYWxsYmFja3MpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICdUaGlzIElEIHdhcyB1c2VkIGluIHRoZSBjYWxsYmFjayhzKSBmb3IgT3V0cHV0KHMpOlxcbiAgJyArXG4gICAgICAgICAgICBjYWxsYmFja3NcbiAgICAgICAgICAgICAgICAubWFwKCh7b3V0cHV0c30pID0+IG91dHB1dHMubWFwKGNvbWJpbmVJZEFuZFByb3ApLmpvaW4oJywgJykpXG4gICAgICAgICAgICAgICAgLmpvaW4oJ1xcbiAgJylcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtaXNzaW5nSWQoaWQsIGNscywgY2FsbGJhY2tzKSB7XG4gICAgICAgIGRpc3BhdGNoRXJyb3IoJ0lEIG5vdCBmb3VuZCBpbiBsYXlvdXQnLCBbXG4gICAgICAgICAgICBgQXR0ZW1wdGluZyB0byBjb25uZWN0IGEgY2FsbGJhY2sgJHtjbHN9IGl0ZW0gdG8gY29tcG9uZW50OmAsXG4gICAgICAgICAgICBgICBcIiR7c3RyaW5naWZ5SWQoaWQpfVwiYCxcbiAgICAgICAgICAgICdidXQgbm8gY29tcG9uZW50cyB3aXRoIHRoYXQgaWQgZXhpc3QgaW4gdGhlIGxheW91dC4nLFxuICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAnSWYgeW91IGFyZSBhc3NpZ25pbmcgY2FsbGJhY2tzIHRvIGNvbXBvbmVudHMgdGhhdCBhcmUnLFxuICAgICAgICAgICAgJ2dlbmVyYXRlZCBieSBvdGhlciBjYWxsYmFja3MgKGFuZCB0aGVyZWZvcmUgbm90IGluIHRoZScsXG4gICAgICAgICAgICAnaW5pdGlhbCBsYXlvdXQpLCB5b3UgY2FuIHN1cHByZXNzIHRoaXMgZXhjZXB0aW9uIGJ5IHNldHRpbmcnLFxuICAgICAgICAgICAgJ2BzdXBwcmVzc19jYWxsYmFja19leGNlcHRpb25zPVRydWVgLicsXG4gICAgICAgICAgICB0YWlsKGNhbGxiYWNrcylcbiAgICAgICAgXSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGVQcm9wKGlkLCBpZFBhdGgsIHJhd1Byb3AsIGNscywgY2FsbGJhY2tzKSB7XG4gICAgICAgIGNvbnN0IHByb3AgPSByYXdQcm9wLnNwbGl0KCdAJylbMF07XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHBhdGgoaWRQYXRoLCBsYXlvdXQpO1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gUmVnaXN0cnkucmVzb2x2ZShjb21wb25lbnQpO1xuXG4gICAgICAgIC8vIG5vdGU6IEZsb3cgY29tcG9uZW50cyBkbyBub3QgaGF2ZSBwcm9wVHlwZXMsIHNvIHdlIGNhbid0IHZhbGlkYXRlLlxuICAgICAgICBpZiAoZWxlbWVudCAmJiBlbGVtZW50LnByb3BUeXBlcyAmJiAhZWxlbWVudC5wcm9wVHlwZXNbcHJvcF0pIHtcbiAgICAgICAgICAgIC8vIGxvb2sgZm9yIHdpbGRjYXJkIHByb3BzIChpZSBkYXRhLSogZXRjKVxuICAgICAgICAgICAgZm9yIChjb25zdCBwcm9wTmFtZSBpbiBlbGVtZW50LnByb3BUeXBlcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3QgPSBwcm9wTmFtZS5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgcHJvcE5hbWUuY2hhckF0KGxhc3QpID09PSAnKicgJiZcbiAgICAgICAgICAgICAgICAgICAgcHJvcC5zdWJzdHIoMCwgbGFzdCkgPT09IHByb3BOYW1lLnN1YnN0cigwLCBsYXN0KVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qge3R5cGUsIG5hbWVzcGFjZX0gPSBjb21wb25lbnQ7XG4gICAgICAgICAgICBkaXNwYXRjaEVycm9yKCdJbnZhbGlkIHByb3AgZm9yIHRoaXMgY29tcG9uZW50JywgW1xuICAgICAgICAgICAgICAgIGBQcm9wZXJ0eSBcIiR7cHJvcH1cIiB3YXMgdXNlZCB3aXRoIGNvbXBvbmVudCBJRDpgLFxuICAgICAgICAgICAgICAgIGAgICR7SlNPTi5zdHJpbmdpZnkoaWQpfWAsXG4gICAgICAgICAgICAgICAgYGluIG9uZSBvZiB0aGUgJHtjbHN9IGl0ZW1zIG9mIGEgY2FsbGJhY2suYCxcbiAgICAgICAgICAgICAgICBgVGhpcyBJRCBpcyBhc3NpZ25lZCB0byBhICR7bmFtZXNwYWNlfS4ke3R5cGV9IGNvbXBvbmVudGAsXG4gICAgICAgICAgICAgICAgJ2luIHRoZSBsYXlvdXQsIHdoaWNoIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBwcm9wZXJ0eS4nLFxuICAgICAgICAgICAgICAgIHRhaWwoY2FsbGJhY2tzKVxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZUlkUGF0dGVyblByb3AoaWQsIHByb3BlcnR5LCBjbHMsIGNhbGxiYWNrcykge1xuICAgICAgICByZXNvbHZlRGVwcygpKHBhdGhzKSh7aWQsIHByb3BlcnR5fSkuZm9yRWFjaChkZXAgPT4ge1xuICAgICAgICAgICAgY29uc3Qge2lkOiBpZFJlc29sdmVkLCBwYXRoOiBpZFBhdGh9ID0gZGVwO1xuICAgICAgICAgICAgdmFsaWRhdGVQcm9wKGlkUmVzb2x2ZWQsIGlkUGF0aCwgcHJvcGVydHksIGNscywgY2FsbGJhY2tzKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgY2FsbGJhY2tJZHNDaGVja2VkRm9yU3RhdGUgPSB7fTtcblxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlU3RhdGUoY2FsbGJhY2spIHtcbiAgICAgICAgY29uc3Qge3N0YXRlLCBvdXRwdXR9ID0gY2FsbGJhY2s7XG5cbiAgICAgICAgLy8gZW5zdXJlIHdlIGRvbid0IGNoZWNrIHRoZSBzYW1lIGNhbGxiYWNrIGZvciBzdGF0ZSBtdWx0aXBsZSB0aW1lc1xuICAgICAgICBpZiAoY2FsbGJhY2tJZHNDaGVja2VkRm9yU3RhdGVbb3V0cHV0XSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNhbGxiYWNrSWRzQ2hlY2tlZEZvclN0YXRlW291dHB1dF0gPSAxO1xuXG4gICAgICAgIGNvbnN0IGNscyA9ICdTdGF0ZSc7XG5cbiAgICAgICAgc3RhdGUuZm9yRWFjaCgoe2lkLCBwcm9wZXJ0eX0pID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaWRQYXRoID0gZ2V0UGF0aChwYXRocywgaWQpO1xuICAgICAgICAgICAgICAgIGlmICghaWRQYXRoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0ZUlkcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWlzc2luZ0lkKGlkLCBjbHMsIFtjYWxsYmFja10pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVQcm9wKGlkLCBpZFBhdGgsIHByb3BlcnR5LCBjbHMsIFtjYWxsYmFja10pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIE9ubHkgdmFsaWRhdGUgcHJvcHMgZm9yIFN0YXRlIG9iamVjdCBpZHMgdGhhdCB3ZSBkb24ndCBuZWVkIHRvXG4gICAgICAgICAgICAvLyByZXNvbHZlIHRoZW0gdG8gc3BlY2lmaWMgaW5wdXRzIG9yIG91dHB1dHNcbiAgICAgICAgICAgIGVsc2UgaWYgKCFpbnRlcnNlY3Rpb24oW01BVENILCBBTExTTUFMTEVSXSwgdmFsdWVzKGlkKSkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdmFsaWRhdGVJZFBhdHRlcm5Qcm9wKGlkLCBwcm9wZXJ0eSwgY2xzLCBbY2FsbGJhY2tdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGVNYXAobWFwLCBjbHMsIGRvU3RhdGUpIHtcbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiBtYXApIHtcbiAgICAgICAgICAgIGNvbnN0IGlkUHJvcHMgPSBtYXBbaWRdO1xuICAgICAgICAgICAgY29uc3QgZmNiID0gZmxhdHRlbih2YWx1ZXMoaWRQcm9wcykpO1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9uYWwgPSBmY2IucmVkdWNlKChhY2MsIGNiKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGFjYyA9PT0gZmFsc2UgfHwgY2Iub3B0aW9uYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgZGVwcyA9IGNvbmNhdChjYi5vdXRwdXRzLCBjYi5pbnB1dHMsIGNiLnN0YXRlcykuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICBkZXAgPT4gZGVwLmlkID09PSBpZFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgIWRlcHMubGVuZ3RoIHx8XG4gICAgICAgICAgICAgICAgICAgIGFsbCgoe2FsbG93X29wdGlvbmFsfSkgPT4gYWxsb3dfb3B0aW9uYWwsIGRlcHMpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0sIHRydWUpO1xuICAgICAgICAgICAgaWYgKG9wdGlvbmFsKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpZFBhdGggPSBnZXRQYXRoKHBhdGhzLCBpZCk7XG4gICAgICAgICAgICBpZiAoIWlkUGF0aCkge1xuICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0ZUlkcykge1xuICAgICAgICAgICAgICAgICAgICBtaXNzaW5nSWQoaWQsIGNscywgZmNiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gaWRQcm9wcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYWxsYmFja3MgPSBpZFByb3BzW3Byb3BlcnR5XTtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVQcm9wKGlkLCBpZFBhdGgsIHByb3BlcnR5LCBjbHMsIGNhbGxiYWNrcyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkb1N0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJdCB3b3VsZCBiZSByZWR1bmRhbnQgdG8gY2hlY2sgc3RhdGUgb24gYm90aCBpbnB1dHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBvdXRwdXRzIC0gc28gb25seSBzZXQgZG9TdGF0ZSBmb3Igb3V0cHV0cy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcy5mb3JFYWNoKHZhbGlkYXRlU3RhdGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFsaWRhdGVNYXAob3V0cHV0TWFwLCAnT3V0cHV0JywgdHJ1ZSk7XG4gICAgdmFsaWRhdGVNYXAoaW5wdXRNYXAsICdJbnB1dCcpO1xuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGVQYXR0ZXJucyhwYXR0ZXJucywgY2xzLCBkb1N0YXRlKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5U3RyIGluIHBhdHRlcm5zKSB7XG4gICAgICAgICAgICBjb25zdCBrZXlQYXR0ZXJucyA9IHBhdHRlcm5zW2tleVN0cl07XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIGtleVBhdHRlcm5zKSB7XG4gICAgICAgICAgICAgICAga2V5UGF0dGVybnNbcHJvcGVydHldLmZvckVhY2goKHtrZXlzLCB2YWx1ZXMsIGNhbGxiYWNrc30pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaWQgPSB6aXBPYmooa2V5cywgdmFsdWVzKTtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVJZFBhdHRlcm5Qcm9wKGlkLCBwcm9wZXJ0eSwgY2xzLCBjYWxsYmFja3MpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZG9TdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLmZvckVhY2godmFsaWRhdGVTdGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhbGlkYXRlUGF0dGVybnMob3V0cHV0UGF0dGVybnMsICdPdXRwdXQnLCB0cnVlKTtcbiAgICB2YWxpZGF0ZVBhdHRlcm5zKGlucHV0UGF0dGVybnMsICdJbnB1dCcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZUdyYXBocyhkZXBlbmRlbmNpZXMsIGRpc3BhdGNoRXJyb3IsIGNvbmZpZykge1xuICAgIC8vIG11bHRpR3JhcGggaXMganVzdCBmb3IgZmluZGluZyBjaXJjdWxhciBkZXBzXG4gICAgY29uc3QgbXVsdGlHcmFwaCA9IG5ldyBEZXBHcmFwaCgpO1xuICAgIGNvbnN0IHN0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG5cbiAgICBjb25zdCB3aWxkY2FyZFBsYWNlaG9sZGVycyA9IHt9O1xuXG4gICAgY29uc3QgZml4SWRzID0gbWFwKGV2b2x2ZSh7aWQ6IHBhcnNlSWZXaWxkY2FyZH0pKTtcbiAgICBjb25zdCBwYXJzZWREZXBlbmRlbmNpZXMgPSBtYXAoZGVwID0+IHtcbiAgICAgICAgY29uc3Qge291dHB1dCwgbm9fb3V0cHV0LCBvdXRwdXRzX21ldGF9ID0gZGVwO1xuICAgICAgICBjb25zdCBvdXQgPSBldm9sdmUoe2lucHV0czogZml4SWRzLCBzdGF0ZTogZml4SWRzfSwgZGVwKTtcbiAgICAgICAgaWYgKG5vX291dHB1dCkge1xuICAgICAgICAgICAgLy8gTm8gb3V0cHV0IGNhc2VcbiAgICAgICAgICAgIG91dC5vdXRwdXRzID0gW107XG4gICAgICAgICAgICBvdXQubm9PdXRwdXQgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgb3V0cHV0U3RycyA9IGlzTXVsdGlPdXRwdXRQcm9wKG91dHB1dClcbiAgICAgICAgICAgICAgICA/IHBhcnNlTXVsdGlwbGVPdXRwdXRzKG91dHB1dClcbiAgICAgICAgICAgICAgICA6IFtvdXRwdXRdO1xuICAgICAgICAgICAgb3V0Lm91dHB1dHMgPSBvdXRwdXRTdHJzLm1hcCgob3V0aSwgaWR4KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gYXNzb2MoJ291dCcsIHRydWUsIHNwbGl0SWRBbmRQcm9wKG91dGkpKTtcbiAgICAgICAgICAgICAgICAvLyBBdHRhY2ggcGFydGlhbCBmbGFnIGZyb20gb3V0cHV0c19tZXRhIGlmIGF2YWlsYWJsZVxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0c19tZXRhICYmXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dHNfbWV0YVtpZHhdICYmXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dHNfbWV0YVtpZHhdLnBhcnRpYWxcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VkLnBhcnRpYWwgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VkO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH0sIGRlcGVuZGVuY2llcyk7XG5cbiAgICBsZXQgaGFzRXJyb3IgPSBmYWxzZTtcbiAgICBjb25zdCB3cmFwcGVkREUgPSAobWVzc2FnZSwgbGluZXMpID0+IHtcbiAgICAgICAgaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICBkaXNwYXRjaEVycm9yKG1lc3NhZ2UsIGxpbmVzKTtcbiAgICB9O1xuICAgIGlmIChjb25maWcudmFsaWRhdGVfY2FsbGJhY2tzKSB7XG4gICAgICAgIHZhbGlkYXRlRGVwZW5kZW5jaWVzKHBhcnNlZERlcGVuZGVuY2llcywgd3JhcHBlZERFKTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIEZvciByZWd1bGFyIGlkcywgb3V0cHV0TWFwIGFuZCBpbnB1dE1hcCBhcmU6XG4gICAgICogICB7W2lkXToge1twcm9wXTogW2NhbGxiYWNrLCAuLi5dfX1cbiAgICAgKiB3aGVyZSBjYWxsYmFja3MgYXJlIHRoZSBtYXRjaGluZyBzcGVjcyBmcm9tIHRoZSBvcmlnaW5hbFxuICAgICAqIGRlcGVuZGVuY2llc1JlcXVlc3QsIGJ1dCB3aXRoIG91dHB1dHMgcGFyc2VkIHRvIGxvb2sgbGlrZSBpbnB1dHMsXG4gICAgICogYW5kIGEgbGlzdCBtYXRjaEtleXMgYWRkZWQgaWYgdGhlIG91dHB1dHMgaGF2ZSBNQVRDSCB3aWxkY2FyZHMuXG4gICAgICogRm9yIG91dHB1dE1hcCB0aGVyZSBzaG91bGQgb25seSBldmVyIGJlIG9uZSBjYWxsYmFjayBwZXIgaWQvcHJvcFxuICAgICAqIGJ1dCBmb3IgaW5wdXRNYXAgdGhlcmUgbWF5IGJlIG1hbnkuXG4gICAgICpcbiAgICAgKiBGb3Igd2lsZGNhcmQgaWRzLCBvdXRwdXRQYXR0ZXJucyBhbmQgaW5wdXRQYXR0ZXJucyBhcmU6XG4gICAgICogICB7XG4gICAgICogICAgICAgW2tleXN0cl06IHtcbiAgICAgKiAgICAgICAgICAgW3Byb3BdOiBbXG4gICAgICogICAgICAgICAgICAgICB7a2V5czogWy4uLl0sIHZhbHVlczogWy4uLl0sIGNhbGxiYWNrczogW2NhbGxiYWNrLCAuLi5dfSxcbiAgICAgKiAgICAgICAgICAgICAgIHsuLi59XG4gICAgICogICAgICAgICAgIF1cbiAgICAgKiAgICAgICB9XG4gICAgICogICB9XG4gICAgICoga2V5c3RyIGlzIGEgc3RyaW5naWZpZWQgb3JkZXJlZCBsaXN0IG9mIGtleXMgaW4gdGhlIGlkXG4gICAgICoga2V5cyBpcyB0aGUgc2FtZSBvcmRlcmVkIGxpc3QgKGp1c3QgY29waWVkIGZvciBjb252ZW5pZW5jZSlcbiAgICAgKiB2YWx1ZXMgaXMgYW4gYXJyYXkgb2YgZXhwbGljaXQgb3Igd2lsZGNhcmQgdmFsdWVzIGZvciBlYWNoIGtleSBpbiBrZXlzXG4gICAgICovXG4gICAgY29uc3Qgb3V0cHV0TWFwID0ge307XG4gICAgY29uc3QgaW5wdXRNYXAgPSB7fTtcbiAgICBjb25zdCBvdXRwdXRQYXR0ZXJuTWFwID0gbmV3IE1hcCgpO1xuICAgIGNvbnN0IGlucHV0UGF0dGVybk1hcCA9IG5ldyBNYXAoKTtcbiAgICBjb25zdCBwYXJ0aWFsT3V0cHV0UGF0dGVybk1hcCA9IG5ldyBNYXAoKTtcbiAgICBjb25zdCBwYXJ0aWFsSW5wdXRQYXR0ZXJuTWFwID0gbmV3IE1hcCgpO1xuICAgIGxldCBvdXRwdXRQYXR0ZXJucyA9IHt9O1xuICAgIGxldCBpbnB1dFBhdHRlcm5zID0ge307XG4gICAgbGV0IHBhcnRpYWxPdXRwdXRQYXR0ZXJucyA9IHt9O1xuICAgIGxldCBwYXJ0aWFsSW5wdXRQYXR0ZXJucyA9IHt9O1xuXG4gICAgbGV0IGhhc1BhcnRpYWxPdXRwdXRQYXR0ZXJucyA9IGZhbHNlO1xuICAgIGxldCBoYXNQYXJ0aWFsSW5wdXRQYXR0ZXJucyA9IGZhbHNlO1xuXG4gICAgY29uc3QgZmluYWxHcmFwaHMgPSB7XG4gICAgICAgIE11bHRpR3JhcGg6IG11bHRpR3JhcGgsXG4gICAgICAgIG91dHB1dE1hcCxcbiAgICAgICAgaW5wdXRNYXAsXG4gICAgICAgIG91dHB1dFBhdHRlcm5zLFxuICAgICAgICBpbnB1dFBhdHRlcm5zLFxuICAgICAgICBwYXJ0aWFsT3V0cHV0UGF0dGVybnMsXG4gICAgICAgIHBhcnRpYWxJbnB1dFBhdHRlcm5zLFxuICAgICAgICBoYXNQYXJ0aWFsT3V0cHV0UGF0dGVybnMsXG4gICAgICAgIGhhc1BhcnRpYWxJbnB1dFBhdHRlcm5zLFxuICAgICAgICBjYWxsYmFja3M6IHBhcnNlZERlcGVuZGVuY2llc1xuICAgIH07XG5cbiAgICBpZiAoaGFzRXJyb3IpIHtcbiAgICAgICAgLy8gbGVhdmUgdGhlIGdyYXBocyBlbXB0eSBpZiB3ZSBmb3VuZCBhbiBlcnJvciwgc28gd2UgZG9uJ3QgdHJ5IHRvXG4gICAgICAgIC8vIGV4ZWN1dGUgdGhlIGJyb2tlbiBjYWxsYmFja3MuXG4gICAgICAgIHJldHVybiBmaW5hbEdyYXBocztcbiAgICB9XG5cbiAgICAvLyBidWlsZHMgdXAgd2lsZGNhcmRQbGFjZWhvbGRlcnMgd2l0aCBhbGwgdGhlIHdpbGRjYXJkIGtleXMgYW5kIHZhbHVlcyB1c2VkIGluIHRoZSBjYWxsYmFja3MsIHNvIHdlIGNhbiBnZW5lcmF0ZSB0aGUgZnVsbCBsaXN0IG9mIGlkcyB0aGF0IGVhY2ggY2FsbGJhY2sgZGVwZW5kcyBvbi5cbiAgICBwYXJzZWREZXBlbmRlbmNpZXMuZm9yRWFjaChkZXBlbmRlbmN5ID0+IHtcbiAgICAgICAgY29uc3Qge291dHB1dHMsIGlucHV0c30gPSBkZXBlbmRlbmN5O1xuXG4gICAgICAgIG91dHB1dHNcbiAgICAgICAgICAgIC5jb25jYXQoaW5wdXRzKVxuICAgICAgICAgICAgLmZpbHRlcihpdGVtID0+IHR5cGVvZiBpdGVtLmlkID09PSAnb2JqZWN0JylcbiAgICAgICAgICAgIC5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgIGZvckVhY2hPYmpJbmRleGVkKCh2YWwsIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbGRjYXJkUGxhY2Vob2xkZXJzW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbGRjYXJkUGxhY2Vob2xkZXJzW2tleV0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhhY3Q6IFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZDogMFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXlQbGFjZWhvbGRlcnMgPSB3aWxkY2FyZFBsYWNlaG9sZGVyc1trZXldO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsICYmIHZhbC53aWxkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsLmV4cGFuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVBsYWNlaG9sZGVycy5leHBhbmQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXlQbGFjZWhvbGRlcnMuZXhhY3QuaW5kZXhPZih2YWwpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5UGxhY2Vob2xkZXJzLmV4YWN0LnB1c2godmFsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIGl0ZW0uaWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBFZmZpY2llbnRseSBidWlsZCB3aWxkY2FyZFBsYWNlaG9sZGVycy52YWxzIGFycmF5c1xuICAgIGZvckVhY2hPYmpJbmRleGVkKGtleVBsYWNlaG9sZGVycyA9PiB7XG4gICAgICAgIGNvbnN0IHtleGFjdCwgZXhwYW5kfSA9IGtleVBsYWNlaG9sZGVycztcbiAgICAgICAgY29uc3QgdmFscyA9IGV4YWN0LnNsaWNlKCkuc29ydChpZFZhbFNvcnQpO1xuICAgICAgICBpZiAoZXhwYW5kKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4cGFuZDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGV4YWN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB2YWxzLnNwbGljZSgwLCAwLCBbdmFsQmVmb3JlKHZhbHNbMF0pXSk7XG4gICAgICAgICAgICAgICAgICAgIHZhbHMucHVzaCh2YWxBZnRlcih2YWxzW3ZhbHMubGVuZ3RoIC0gMV0pKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YWxzLnB1c2goaSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKCFleGFjdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIG9ubHkgTUFUQ0gvQUxMIC0gc3RpbGwgbmVlZCBhIHZhbHVlXG4gICAgICAgICAgICB2YWxzLnB1c2goMCk7XG4gICAgICAgIH1cbiAgICAgICAga2V5UGxhY2Vob2xkZXJzLnZhbHMgPSB2YWxzO1xuICAgIH0sIHdpbGRjYXJkUGxhY2Vob2xkZXJzKTtcblxuICAgIGZ1bmN0aW9uIG1ha2VBbGxJZHMoaWRTcGVjLCBvdXRJZEZpbmFsKSB7XG4gICAgICAgIGxldCBpZExpc3QgPSBbe31dO1xuICAgICAgICBmb3JFYWNoT2JqSW5kZXhlZCgodmFsLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRlc3RWYWxzID0gd2lsZGNhcmRQbGFjZWhvbGRlcnNba2V5XS52YWxzO1xuICAgICAgICAgICAgY29uc3Qgb3V0VmFsSW5kZXggPSB0ZXN0VmFscy5pbmRleE9mKG91dElkRmluYWxba2V5XSk7XG4gICAgICAgICAgICBsZXQgbmV3VmFscyA9IFt2YWxdO1xuICAgICAgICAgICAgaWYgKHZhbCAmJiB2YWwud2lsZCkge1xuICAgICAgICAgICAgICAgIGlmICh2YWwgPT09IEFMTFNNQUxMRVIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG91dFZhbEluZGV4ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3VmFscyA9IHRlc3RWYWxzLnNsaWNlKDAsIG91dFZhbEluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHNtYWxsZXIgaXRlbXMgLSBkZWxldGUgYWxsIG91dHB1dHMuXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdWYWxzID0gW107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBNQVRDSCBvciBBTExcbiAgICAgICAgICAgICAgICAgICAgLy8gTUFUQ0ggKmlzKiBBTEwgZm9yIG91dHB1dHMsIGllIHdlIGRvbid0IGFscmVhZHkgaGF2ZSBhXG4gICAgICAgICAgICAgICAgICAgIC8vIHZhbHVlIHNwZWNpZmllZCBpbiBgb3V0SWRGaW5hbGBcbiAgICAgICAgICAgICAgICAgICAgbmV3VmFscyA9XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRWYWxJbmRleCA9PT0gLTEgfHwgdmFsID09PSBBTExcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHRlc3RWYWxzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBbb3V0SWRGaW5hbFtrZXldXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyByZXBsaWNhdGVzIGV2ZXJ5dGhpbmcgaW4gaWRMaXN0IG9uY2UgZm9yIGVhY2ggaXRlbSBpblxuICAgICAgICAgICAgLy8gbmV3VmFscywgYXR0YWNoaW5nIGVhY2ggdmFsdWUgYXQga2V5LlxuICAgICAgICAgICAgaWRMaXN0ID0gYXAoYXAoW2Fzc29jKGtleSldLCBuZXdWYWxzKSwgaWRMaXN0KTtcbiAgICAgICAgfSwgaWRTcGVjKTtcbiAgICAgICAgcmV0dXJuIGlkTGlzdDtcbiAgICB9XG5cbiAgICAvKiBtdWx0aUdyYXBoIGlzIHVzZWQgb25seSBmb3IgdGVzdGluZyBjaXJjdWxhcml0eVxuICAgICAqXG4gICAgICogRWFjaCBjb21wb25lbnQrcHJvcGVydHkgdGhhdCBpcyB1c2VkIGFzIGFuIGlucHV0IG9yIG91dHB1dCBpcyBhZGRlZCBhcyBhIG5vZGVcbiAgICAgKiB0byBhIGRpcmVjdGVkIGdyYXBoIHdpdGggYSBkZXBlbmRlbmN5IGZyb20gZWFjaCBpbnB1dCB0byBlYWNoIG91dHB1dC4gVGhlXG4gICAgICogZnVuY3Rpb24gdHJpZ2dlckRlZmF1bHRTdGF0ZSBpbiBpbmRleC5qcyB0aGVuIGNoZWNrcyB0aGlzIGdyYXBoIGZvciBjaXJjdWxhcml0eS5cbiAgICAgKlxuICAgICAqIEluIG9yZGVyIHRvIGFsbG93IHRoZSBzYW1lIGNvbXBvbmVudCtwcm9wZXJ0eSB0byBiZSBib3RoIGFuIGlucHV0IGFuZCBvdXRwdXRcbiAgICAgKiBvZiB0aGUgc2FtZSBjYWxsYmFjaywgYSB0d28gcGFzcyBhcHByb2FjaCBpcyB1c2VkLlxuICAgICAqXG4gICAgICogSW4gdGhlIGZpcnN0IHBhc3MsIHRoZSBncmFwaCBpcyBidWlsdCB1cCBub3JtYWxseSB3aXRoIHRoZSBleGNlcHRpb24gdGhhdFxuICAgICAqIGluIGNhc2VzIHdoZXJlIGFuIG91dHB1dCBpcyBhbHNvIGFuIGlucHV0IHRvIHRoZSBzYW1lIGNhbGxiYWNrIGEgc3BlY2lhbFxuICAgICAqIFwib3V0cHV0XCIgbm9kZSBpcyBhZGRlZCBhbmQgdGhlIGRlcGVuZGVuY2llcyB0YXJnZXQgdGhpcyBvdXRwdXQgbm9kZSBpbnN0ZWFkLlxuICAgICAqIEZvciBleGFtcGxlLCBpZiBgc2xpZGVyLnZhbHVlYCBpcyBib3RoIGFuIGlucHV0IGFuZCBhbiBvdXRwdXQsIHRoZW4gdGhlIGEgbmV3XG4gICAgICogbm9kZSBgc2xpZGVyLnZhbHVlX19vdXRwdXRgIHdpbGwgYmUgYWRkZWQgd2l0aCBhIGRlcGVuZGVuY3kgZnJvbSBgc2xpZGVyLnZhbHVlYFxuICAgICAqIHRvIGBzbGlkZXIudmFsdWVfX291dHB1dGAuIFNwbGl0dGluZyB0aGUgaW5wdXQgYW5kIG91dHB1dCBpbnRvIHNlcGFyYXRlIG5vZGVzXG4gICAgICogcmVtb3ZlcyB0aGUgY2lyY3VsYXJpdHkuXG4gICAgICpcbiAgICAgKiBJbiBvcmRlciB0byBzdGlsbCBkZXRlY3Qgb3RoZXIgZm9ybXMgb2YgY2lyY3VsYXJpdHksIGl0IGlzIG5lY2Vzc2FyeSB0byBkbyBhXG4gICAgICogc2Vjb25kIHBhc3MgYW5kIGFkZCB0aGUgbmV3IG91dHB1dCBub2RlcyBhcyBhIGRlcGVuZGVuY3kgaW4gYW55ICpvdGhlciogY2FsbGJhY2tzXG4gICAgICogd2hlcmUgdGhlIG9yaWdpbmFsIG5vZGUgd2FzIGFuIGlucHV0LiBDb250aW51aW5nIHRoZSBleGFtcGxlLCBhbnkgb3RoZXIgY2FsbGJhY2tcbiAgICAgKiB0aGF0IGhhZCBgc2xpZGVyLnZhbHVlYCBhcyBhbiBpbnB1dCBkZXBlbmRlbmN5IGFsc28gbmVlZHMgdG8gaGF2ZVxuICAgICAqIGBzbGlkZXIudmFsdWVfX291dHB1dGAgYXMgYSBkZXBlbmRlbmN5LiBUbyBtYWtlIHRoaXMgZWZmaWNpZW50LCBhbGwgdGhlIGlucHV0c1xuICAgICAqIGFuZCBvdXRwdXRzIGZvciBlYWNoIGNhbGxiYWNrIGFyZSBzdG9yZWQgZHVyaW5nIHRoZSBmaXJzdCBwYXNzLlxuICAgICAqL1xuXG4gICAgY29uc3Qgb3V0cHV0VGFnID0gJ19fb3V0cHV0JztcbiAgICBjb25zdCBkdXBsaWNhdGVPdXRwdXRzID0gW107XG4gICAgY29uc3QgY2JJbiA9IFtdO1xuICAgIGNvbnN0IGNiT3V0ID0gW107XG5cbiAgICBmdW5jdGlvbiBhZGRJbnB1dFRvTXVsdGkoaW5JZFByb3AsIG91dElkUHJvcCwgZmlyc3RQYXNzID0gdHJ1ZSkge1xuICAgICAgICBpZiAoIWNvbmZpZy52YWxpZGF0ZV9jYWxsYmFja3MpIHJldHVybjtcbiAgICAgICAgbXVsdGlHcmFwaC5hZGROb2RlKGluSWRQcm9wKTtcbiAgICAgICAgbXVsdGlHcmFwaC5hZGREZXBlbmRlbmN5KGluSWRQcm9wLCBvdXRJZFByb3ApO1xuICAgICAgICAvLyBvbmx5IHN0b3JlIGNhbGxiYWNrIGlucHV0cyBhbmQgb3V0cHV0cyBkdXJpbmcgdGhlIGZpcnN0IHBhc3NcbiAgICAgICAgaWYgKGZpcnN0UGFzcykge1xuICAgICAgICAgICAgY2JJbltjYkluLmxlbmd0aCAtIDFdLnB1c2goaW5JZFByb3ApO1xuICAgICAgICAgICAgY2JPdXRbY2JPdXQubGVuZ3RoIC0gMV0ucHVzaChvdXRJZFByb3ApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcGFyc2VkRGVwZW5kZW5jaWVzLmZvckVhY2goZGVwZW5kZW5jeSA9PiB7XG4gICAgICAgIGNvbnN0IHtvdXRwdXRzLCBpbnB1dHN9ID0gZGVwZW5kZW5jeTtcblxuICAgICAgICAvLyBuZXcgY2FsbGJhY2ssIGFkZCBhbiBlbXB0eSBhcnJheSBmb3IgaXRzIGlucHV0cyBhbmQgb3V0cHV0c1xuICAgICAgICBjYkluLnB1c2goW10pO1xuICAgICAgICBjYk91dC5wdXNoKFtdKTtcblxuICAgICAgICBmdW5jdGlvbiBhZGRPdXRwdXRUb011bHRpKG91dElkRmluYWwsIG91dElkUHJvcCkge1xuICAgICAgICAgICAgaWYgKCFjb25maWcudmFsaWRhdGVfY2FsbGJhY2tzKSByZXR1cm47XG4gICAgICAgICAgICBtdWx0aUdyYXBoLmFkZE5vZGUob3V0SWRQcm9wKTtcbiAgICAgICAgICAgIGlucHV0cy5mb3JFYWNoKGluT2JqID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7aWQ6IGluSWQsIHByb3BlcnR5fSA9IGluT2JqO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaW5JZCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5JZExpc3QgPSBtYWtlQWxsSWRzKGluSWQsIG91dElkRmluYWwpO1xuICAgICAgICAgICAgICAgICAgICBpbklkTGlzdC5mb3JFYWNoKGlkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZElucHV0VG9NdWx0aShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21iaW5lSWRBbmRQcm9wKHtpZCwgcHJvcGVydHl9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRJZFByb3BcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZElucHV0VG9NdWx0aShjb21iaW5lSWRBbmRQcm9wKGluT2JqKSwgb3V0SWRQcm9wKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdlJ2xsIGNvbnRpbnVlIHRvIHVzZSBkZXAub3V0cHV0IGFzIGl0cyBpZCwgYnV0IGFkZCBvdXRwdXRzIGFzIHdlbGxcbiAgICAgICAgLy8gZm9yIGNvbnZlbmllbmNlIGFuZCBzeW1tZXRyeSB3aXRoIHRoZSBzdHJ1Y3R1cmUgb2YgaW5wdXRzIGFuZCBzdGF0ZS5cbiAgICAgICAgLy8gQWxzbyBjb2xsZWN0IE1BVENIIGtleXMgaW4gdGhlIG91dHB1dCAoYWxsIG91dHB1dHMgbXVzdCBzaGFyZSB0aGVzZSlcbiAgICAgICAgLy8gYW5kIEFMTCBrZXlzIGluIHRoZSBmaXJzdCBvdXRwdXQgKG5lZWQgbm90IGJlIHNoYXJlZCBidXQgd2UnbGwgdXNlXG4gICAgICAgIC8vIHRoZSBmaXJzdCBvdXRwdXQgZm9yIGNhbGN1bGF0aW9ucykgZm9yIGxhdGVyIGNvbnZlbmllbmNlLlxuICAgICAgICBjb25zdCB7bWF0Y2hLZXlzfSA9IGZpbmRXaWxkY2FyZEtleXMoXG4gICAgICAgICAgICBvdXRwdXRzLmxlbmd0aCA/IG91dHB1dHNbMF0uaWQgOiB1bmRlZmluZWRcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgZmlyc3RTaW5nbGVPdXRwdXQgPSBmaW5kSW5kZXgobyA9PiAhaXNNdWx0aVZhbHVlZChvKSwgb3V0cHV0cyk7XG4gICAgICAgIGNvbnN0IGZpbmFsRGVwZW5kZW5jeSA9IG1lcmdlUmlnaHQoXG4gICAgICAgICAgICB7bWF0Y2hLZXlzLCBmaXJzdFNpbmdsZU91dHB1dCwgb3V0cHV0c30sXG4gICAgICAgICAgICBkZXBlbmRlbmN5XG4gICAgICAgICk7XG5cbiAgICAgICAgb3V0cHV0cy5mb3JFYWNoKG91dElkUHJvcCA9PiB7XG4gICAgICAgICAgICBjb25zdCB7aWQ6IG91dElkLCBwcm9wZXJ0eSwgcGFydGlhbDogb3V0UGFydGlhbH0gPSBvdXRJZFByb3A7XG4gICAgICAgICAgICAvLyBjaGVjayBpZiB0aGlzIG91dHB1dCBpcyBhbHNvIGFuIGlucHV0IHRvIHRoZSBzYW1lIGNhbGxiYWNrXG4gICAgICAgICAgICBsZXQgYWxzb0lucHV0O1xuICAgICAgICAgICAgaWYgKGNvbmZpZy52YWxpZGF0ZV9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgICAgICBhbHNvSW5wdXQgPSBjaGVja0luT3V0T3ZlcmxhcChvdXRJZFByb3AsIGlucHV0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIG91dElkID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIGlmIChjb25maWcudmFsaWRhdGVfY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG91dElkTGlzdCA9IG1ha2VBbGxJZHMob3V0SWQsIHt9KTtcbiAgICAgICAgICAgICAgICAgICAgb3V0SWRMaXN0LmZvckVhY2goaWQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGVtcE91dElkUHJvcCA9IHtpZCwgcHJvcGVydHl9O1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG91dElkTmFtZSA9IGNvbWJpbmVJZEFuZFByb3AodGVtcE91dElkUHJvcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIG91dHB1dCBpcyBhbHNvIGFuIGlucHV0LCBhZGQgYG91dHB1dFRhZ2AgdG8gdGhlIG5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbHNvSW5wdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVPdXRwdXRzLnB1c2godGVtcE91dElkUHJvcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0SWROYW1lICs9IG91dHB1dFRhZztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZE91dHB1dFRvTXVsdGkoaWQsIG91dElkTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAob3V0UGFydGlhbCkge1xuICAgICAgICAgICAgICAgICAgICBhZGRQYXJ0aWFsUGF0dGVybihcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBhdHRlcm5NYXAsXG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxEZXBlbmRlbmN5XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGFkZFBhcnRpYWxQYXR0ZXJuKFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFydGlhbE91dHB1dFBhdHRlcm5NYXAsXG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxEZXBlbmRlbmN5XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGhhc1BhcnRpYWxPdXRwdXRQYXR0ZXJucyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkUGF0dGVybihcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBhdHRlcm5NYXAsXG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxEZXBlbmRlbmN5XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLnZhbGlkYXRlX2NhbGxiYWNrcykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3V0SWROYW1lID0gY29tYmluZUlkQW5kUHJvcChvdXRJZFByb3ApO1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIG91dHB1dCBpcyBhbHNvIGFuIGlucHV0LCBhZGQgYG91dHB1dFRhZ2AgdG8gdGhlIG5hbWVcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFsc29JbnB1dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZHVwbGljYXRlT3V0cHV0cy5wdXNoKG91dElkUHJvcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRJZE5hbWUgKz0gb3V0cHV0VGFnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGFkZE91dHB1dFRvTXVsdGkoe30sIG91dElkTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFkZE1hcChvdXRwdXRNYXAsIG91dElkLCBwcm9wZXJ0eSwgZmluYWxEZXBlbmRlbmN5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaW5wdXRzLmZvckVhY2goaW5wdXRPYmplY3QgPT4ge1xuICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICAgIGlkOiBpbklkLFxuICAgICAgICAgICAgICAgIHByb3BlcnR5OiBpblByb3AsXG4gICAgICAgICAgICAgICAgcGFydGlhbDogaW5QYXJ0aWFsXG4gICAgICAgICAgICB9ID0gaW5wdXRPYmplY3Q7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGluSWQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgaWYgKGluUGFydGlhbCkge1xuICAgICAgICAgICAgICAgICAgICBhZGRQYXJ0aWFsUGF0dGVybihcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0UGF0dGVybk1hcCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGluSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBpblByb3AsXG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbERlcGVuZGVuY3lcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgYWRkUGFydGlhbFBhdHRlcm4oXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aWFsSW5wdXRQYXR0ZXJuTWFwLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGluUHJvcCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsRGVwZW5kZW5jeVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBoYXNQYXJ0aWFsSW5wdXRQYXR0ZXJucyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkUGF0dGVybihpbnB1dFBhdHRlcm5NYXAsIGluSWQsIGluUHJvcCwgZmluYWxEZXBlbmRlbmN5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGFkZE1hcChpbnB1dE1hcCwgaW5JZCwgaW5Qcm9wLCBmaW5hbERlcGVuZGVuY3kpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICBvdXRwdXRQYXR0ZXJucyA9IG9mZmxvYWRQYXR0ZXJucyhvdXRwdXRQYXR0ZXJuTWFwLCBvdXRwdXRQYXR0ZXJucyk7XG4gICAgaW5wdXRQYXR0ZXJucyA9IG9mZmxvYWRQYXR0ZXJucyhpbnB1dFBhdHRlcm5NYXAsIGlucHV0UGF0dGVybnMpO1xuICAgIHBhcnRpYWxPdXRwdXRQYXR0ZXJucyA9IG9mZmxvYWRQYXR0ZXJucyhcbiAgICAgICAgcGFydGlhbE91dHB1dFBhdHRlcm5NYXAsXG4gICAgICAgIHBhcnRpYWxPdXRwdXRQYXR0ZXJuc1xuICAgICk7XG4gICAgcGFydGlhbElucHV0UGF0dGVybnMgPSBvZmZsb2FkUGF0dGVybnMoXG4gICAgICAgIHBhcnRpYWxJbnB1dFBhdHRlcm5NYXAsXG4gICAgICAgIHBhcnRpYWxJbnB1dFBhdHRlcm5zXG4gICAgKTtcbiAgICBmaW5hbEdyYXBocy5vdXRwdXRQYXR0ZXJucyA9IG91dHB1dFBhdHRlcm5zO1xuICAgIGZpbmFsR3JhcGhzLmlucHV0UGF0dGVybnMgPSBpbnB1dFBhdHRlcm5zO1xuICAgIGZpbmFsR3JhcGhzLnBhcnRpYWxPdXRwdXRQYXR0ZXJucyA9IHBhcnRpYWxPdXRwdXRQYXR0ZXJucztcbiAgICBmaW5hbEdyYXBocy5wYXJ0aWFsSW5wdXRQYXR0ZXJucyA9IHBhcnRpYWxJbnB1dFBhdHRlcm5zO1xuICAgIGZpbmFsR3JhcGhzLmhhc1BhcnRpYWxPdXRwdXRQYXR0ZXJucyA9IGhhc1BhcnRpYWxPdXRwdXRQYXR0ZXJucztcbiAgICBmaW5hbEdyYXBocy5oYXNQYXJ0aWFsSW5wdXRQYXR0ZXJucyA9IGhhc1BhcnRpYWxJbnB1dFBhdHRlcm5zO1xuXG4gICAgLy8gc2Vjb25kIHBhc3MgZm9yIGFkZGluZyBuZXcgb3V0cHV0IG5vZGVzIGFzIGRlcGVuZGVuY2llcyB3aGVyZSBuZWVkZWRcbiAgICBkdXBsaWNhdGVPdXRwdXRzLmZvckVhY2goZHVwZU91dElkUHJvcCA9PiB7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsTmFtZSA9IGNvbWJpbmVJZEFuZFByb3AoZHVwZU91dElkUHJvcCk7XG4gICAgICAgIGNvbnN0IG5ld05hbWUgPSBvcmlnaW5hbE5hbWUuY29uY2F0KG91dHB1dFRhZyk7XG4gICAgICAgIGZvciAodmFyIGNudCA9IDA7IGNudCA8IGNiSW4ubGVuZ3RoOyBjbnQrKykge1xuICAgICAgICAgICAgLy8gY2hlY2sgaWYgaW5wdXQgdG8gdGhlIGNhbGxiYWNrXG4gICAgICAgICAgICBpZiAoY2JJbltjbnRdLnNvbWUoaW5OYW1lID0+IGluTmFtZSA9PT0gb3JpZ2luYWxOYW1lKSkge1xuICAgICAgICAgICAgICAgIC8qIG1ha2Ugc3VyZSBpdCdzIG5vdCBhbHNvIGFuIG91dHB1dCBvZiB0aGUgY2FsbGJhY2tcbiAgICAgICAgICAgICAgICAgKiAodGhpcyB3aWxsIGJlIHRoZSBvcmlnaW5hbCBjYWxsYmFjaylcbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBpZiAoIWNiT3V0W2NudF0uc29tZShvdXROYW1lID0+IG91dE5hbWUgPT09IG5ld05hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNiT3V0W2NudF0uZm9yRWFjaChvdXROYW1lID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZElucHV0VG9NdWx0aShuZXdOYW1lLCBvdXROYW1lLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGVuZCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIGlmICghd2luZG93LmRhc2hfY29tcG9uZW50X2FwaSkge1xuICAgICAgICB3aW5kb3cuZGFzaF9jb21wb25lbnRfYXBpID0ge307XG4gICAgfVxuICAgIHdpbmRvdy5kYXNoX2NvbXBvbmVudF9hcGkuY2FsbGJhY2tHcmFwaFRpbWUgPSAoZW5kIC0gc3RhcnQpLnRvRml4ZWQoMik7XG5cbiAgICByZXR1cm4gZmluYWxHcmFwaHM7XG59XG5cbmZ1bmN0aW9uIGZpbmRXaWxkY2FyZEtleXMoaWQpIHtcbiAgICBjb25zdCBtYXRjaEtleXMgPSBbXTtcbiAgICBjb25zdCBhbGxzbWFsbGVyS2V5cyA9IFtdO1xuICAgIGlmICh0eXBlb2YgaWQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGZvckVhY2hPYmpJbmRleGVkKCh2YWwsIGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKHZhbCA9PT0gTUFUQ0gpIHtcbiAgICAgICAgICAgICAgICBtYXRjaEtleXMucHVzaChrZXkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWwgPT09IEFMTFNNQUxMRVIpIHtcbiAgICAgICAgICAgICAgICBhbGxzbWFsbGVyS2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIGlkKTtcbiAgICAgICAgbWF0Y2hLZXlzLnNvcnQoKTtcbiAgICAgICAgYWxsc21hbGxlcktleXMuc29ydCgpO1xuICAgIH1cbiAgICByZXR1cm4ge21hdGNoS2V5cywgYWxsc21hbGxlcktleXN9O1xufVxuXG4vKlxuICogRG8gdGhlIGdpdmVuIGlkIHZhbHVlcyBgdmFsc2AgbWF0Y2ggdGhlIHBhdHRlcm4gYHBhdHRlcm5WYWxzYD9cbiAqIGBrZXlzYCwgYHBhdHRlcm5WYWxzYCwgYW5kIGB2YWxzYCBhcmUgYWxsIGFycmF5cywgYW5kIHdlIGFscmVhZHkga25vdyB0aGF0XG4gKiB3ZSdyZSBvbmx5IGxvb2tpbmcgYXQgaWRzIHdpdGggdGhlIHNhbWUga2V5cyBhcyB0aGUgcGF0dGVybi5cbiAqXG4gKiBPcHRpb25hbGx5LCBpbmNsdWRlIGFub3RoZXIgcmVmZXJlbmNlIHNldCBvZiB0aGUgc2FtZSAtIHRvIGVuc3VyZSB0aGVcbiAqIGNvcnJlY3QgbWF0Y2hpbmcgb2YgTUFUQ0ggb3IgQUxMU01BTExFUiBiZXR3ZWVuIGlucHV0IGFuZCBvdXRwdXQgaXRlbXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpZE1hdGNoKFxuICAgIGtleXMsXG4gICAgdmFscyxcbiAgICBwYXR0ZXJuVmFscyxcbiAgICByZWZLZXlzLFxuICAgIHJlZlZhbHMsXG4gICAgcmVmUGF0dGVyblZhbHNcbikge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCB2YWwgPSB2YWxzW2ldO1xuICAgICAgICBjb25zdCBwYXR0ZXJuVmFsID0gcGF0dGVyblZhbHNbaV07XG4gICAgICAgIGlmIChwYXR0ZXJuVmFsLndpbGQpIHtcbiAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYSBzZWNvbmQgaWQsIGNvbXBhcmUgdGhlIHdpbGRjYXJkIHZhbHVlcy5cbiAgICAgICAgICAgIC8vIFdpdGhvdXQgYSBzZWNvbmQgaWQsIGFsbCB3aWxkY2FyZHMgcGFzcyBhdCB0aGlzIHN0YWdlLlxuICAgICAgICAgICAgaWYgKHJlZktleXMgJiYgcGF0dGVyblZhbCAhPT0gQUxMKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVmSW5kZXggPSByZWZLZXlzLmluZGV4T2Yoa2V5c1tpXSk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVmUGF0dGVyblZhbCA9IHJlZlBhdHRlcm5WYWxzW3JlZkluZGV4XTtcbiAgICAgICAgICAgICAgICAvLyBTYW5pdHkgY2hlY2suIFNob3VsZG4ndCBldmVyIGZhaWwgdGhpcywgaWYgdGhlIGJhY2sgZW5kXG4gICAgICAgICAgICAgICAgLy8gZGlkIGl0cyBqb2IgdmFsaWRhdGluZyBjYWxsYmFja3MuXG4gICAgICAgICAgICAgICAgLy8gWW91IGNhbid0IHJlc29sdmUgYW4gaW5wdXQgYWdhaW5zdCBhbiBpbnB1dCwgYmVjYXVzZVxuICAgICAgICAgICAgICAgIC8vIHR3byBBTExTTUFMTEVSJ3Mgd291bGRuJ3QgbWFrZSBzZW5zZSFcbiAgICAgICAgICAgICAgICBpZiAocGF0dGVyblZhbCA9PT0gQUxMU01BTExFUiAmJiByZWZQYXR0ZXJuVmFsID09PSBBTExTTUFMTEVSKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICdpbnZhbGlkIHdpbGRjYXJkIGlkIHBhaXI6ICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVyblZhbHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZktleXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZlBhdHRlcm5WYWxzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZWYWxzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBpZFZhbFNvcnQodmFsLCByZWZWYWxzW3JlZkluZGV4XSkgIT09XG4gICAgICAgICAgICAgICAgICAgIChwYXR0ZXJuVmFsID09PSBBTExTTUFMTEVSXG4gICAgICAgICAgICAgICAgICAgICAgICA/IC0xXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHJlZlBhdHRlcm5WYWwgPT09IEFMTFNNQUxMRVJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gMVxuICAgICAgICAgICAgICAgICAgICAgICAgOiAwKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHZhbCAhPT0gcGF0dGVyblZhbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuXG4vKlxuICogUGFydGlhbCBpZCBtYXRjaGluZzogY2hlY2sgaWYgdGhlIHBhdHRlcm4gKHdpdGggZmV3ZXIga2V5cykgbWF0Y2hlc1xuICogYSBjb21wb25lbnQgaWQgKHdpdGggbW9yZSBrZXlzKS4gT25seSBrZXlzIHByZXNlbnQgaW4gdGhlIHBhdHRlcm5cbiAqIGFyZSBjaGVja2VkOyBleHRyYSBrZXlzIGluIHRoZSBjb21wb25lbnQgaWQgYXJlIGlnbm9yZWQuXG4gKlxuICogYHBhdHRlcm5LZXlzYCBhbmQgYHBhdHRlcm5WYWxzYCBkZXNjcmliZSB0aGUgcGF0dGVybi5cbiAqIGBjb21wb25lbnRLZXlzYCBhbmQgYGNvbXBvbmVudFZhbHNgIGRlc2NyaWJlIHRoZSBhY3R1YWwgY29tcG9uZW50IGlkLlxuICogVGhlIGNvbXBvbmVudCBtdXN0IGhhdmUgYWxsIHRoZSBwYXR0ZXJuJ3Mga2V5cyAoc3VwZXJzZXQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFydGlhbElkTWF0Y2goXG4gICAgcGF0dGVybktleXMsXG4gICAgcGF0dGVyblZhbHMsXG4gICAgY29tcG9uZW50S2V5cyxcbiAgICBjb21wb25lbnRWYWxzLFxuICAgIHJlZktleXMsXG4gICAgcmVmVmFscyxcbiAgICByZWZQYXR0ZXJuVmFsc1xuKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXR0ZXJuS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBwYXR0ZXJuS2V5ID0gcGF0dGVybktleXNbaV07XG4gICAgICAgIGNvbnN0IHBhdHRlcm5WYWwgPSBwYXR0ZXJuVmFsc1tpXTtcbiAgICAgICAgLy8gRmluZCB0aGlzIGtleSBpbiB0aGUgY29tcG9uZW50XG4gICAgICAgIGNvbnN0IGNvbXBJbmRleCA9IGNvbXBvbmVudEtleXMuaW5kZXhPZihwYXR0ZXJuS2V5KTtcbiAgICAgICAgaWYgKGNvbXBJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIC8vIENvbXBvbmVudCBkb2Vzbid0IGhhdmUgdGhpcyBrZXkgLSBubyBtYXRjaFxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbCA9IGNvbXBvbmVudFZhbHNbY29tcEluZGV4XTtcbiAgICAgICAgaWYgKHBhdHRlcm5WYWwud2lsZCkge1xuICAgICAgICAgICAgaWYgKHJlZktleXMgJiYgcGF0dGVyblZhbCAhPT0gQUxMKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVmSW5kZXggPSByZWZLZXlzLmluZGV4T2YocGF0dGVybktleSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlZkluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcmVmUGF0dGVyblZhbCA9IHJlZlBhdHRlcm5WYWxzW3JlZkluZGV4XTtcbiAgICAgICAgICAgICAgICBpZiAocGF0dGVyblZhbCA9PT0gQUxMU01BTExFUiAmJiByZWZQYXR0ZXJuVmFsID09PSBBTExTTUFMTEVSKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICdpbnZhbGlkIHdpbGRjYXJkIGlkIHBhaXIgKHBhcnRpYWwpOiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm5LZXlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuVmFscyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50S2V5cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50VmFscyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmS2V5cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmUGF0dGVyblZhbHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZlZhbHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGlkVmFsU29ydCh2YWwsIHJlZlZhbHNbcmVmSW5kZXhdKSAhPT1cbiAgICAgICAgICAgICAgICAgICAgKHBhdHRlcm5WYWwgPT09IEFMTFNNQUxMRVJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gLTFcbiAgICAgICAgICAgICAgICAgICAgICAgIDogcmVmUGF0dGVyblZhbCA9PT0gQUxMU01BTExFUlxuICAgICAgICAgICAgICAgICAgICAgICAgPyAxXG4gICAgICAgICAgICAgICAgICAgICAgICA6IDApXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodmFsICE9PSBwYXR0ZXJuVmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbnlWYWxzKHBhdHRlcm5WYWxzLCB2YWxzKSB7XG4gICAgY29uc3QgbWF0Y2hlcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0dGVyblZhbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHBhdHRlcm5WYWxzW2ldID09PSBNQVRDSCkge1xuICAgICAgICAgICAgbWF0Y2hlcy5wdXNoKHZhbHNbaV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYXRjaGVzLmxlbmd0aCA/IEpTT04uc3RyaW5naWZ5KG1hdGNoZXMpIDogJyc7XG59XG5cbi8qXG4gKiBEb2VzIHRoaXMgaXRlbSAoaW5wdXQgLyBvdXRwdXQgLyBzdGF0ZSkgc3VwcG9ydCBtdWx0aXBsZSB2YWx1ZXM/XG4gKiBzdHJpbmcgSURzIGRvIG5vdDsgd2lsZGNhcmQgSURzIG9ubHkgZG8gaWYgdGhleSBjb250YWluIEFMTCBvciBBTExTTUFMTEVSLlxuICogUGFydGlhbCBwYXR0ZXJucyB3aXRoIG5vIHdpbGRjYXJkcyBhcmUgaW1wbGljaXRseSBtdWx0aS12YWx1ZWQgc2luY2UgdGhleVxuICogY2FuIG1hdGNoIG11bHRpcGxlIGNvbXBvbmVudHMgd2l0aCBkaWZmZXJlbnQga2V5IHNldHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc011bHRpVmFsdWVkKHtpZCwgcGFydGlhbCA9IGZhbHNlfSkge1xuICAgIGlmICh0eXBlb2YgaWQgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGFueSh2ID0+IHYubXVsdGksIHZhbHVlcyhpZCkpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvLyBwYXJ0aWFsIHdpdGggbm8gd2lsZGNhcmRzOiBpbXBsaWNpdGx5IG11bHRpLXZhbHVlZFxuICAgIGlmIChwYXJ0aWFsICYmICFhbnkodiA9PiB2ICYmIHYud2lsZCwgdmFsdWVzKGlkKSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuLypcbiAqIEZvciBhIGdpdmVuIG91dHB1dCBpZCBhbmQgcHJvcCwgZmluZCB0aGUgY2FsbGJhY2sgZ2VuZXJhdGluZyBpdC5cbiAqIElmIG5vIGNhbGxiYWNrIGlzIGZvdW5kLCByZXR1cm5zIGZhbHNlLlxuICogSWYgb25lIGlzIGZvdW5kLCByZXR1cm5zOlxuICoge1xuICogICAgIGNhbGxiYWNrOiB0aGUgY2FsbGJhY2sgc3BlYyB7b3V0cHV0cywgaW5wdXRzLCBzdGF0ZSBldGN9XG4gKiAgICAgYW55VmFsczogc3RyaW5naWZpZWQgbGlzdCBvZiByZXNvbHZlZCBNQVRDSCBrZXlzIHdlIG1hdGNoZWRcbiAqICAgICByZXNvbHZlZElkOiB0aGUgXCJvdXRwdXRzXCIgaWQgc3RyaW5nIHBsdXMgTUFUQ0ggdmFsdWVzIHdlIG1hdGNoZWRcbiAqICAgICBnZXRPdXRwdXRzOiBhY2Nlc3NvciBmdW5jdGlvbiB0byBnaXZlIGFsbCByZXNvbHZlZCBvdXRwdXRzIG9mIHRoaXNcbiAqICAgICAgICAgY2FsbGJhY2suIFRha2VzIGBwYXRoc2AgYXMgYXJndW1lbnQgdG8gYXBwbHkgd2hlbiB0aGUgY2FsbGJhY2sgaXNcbiAqICAgICAgICAgZGlzcGF0Y2hlZCwgaW4gY2FzZSBhIHByZXZpb3VzIGNhbGxiYWNrIGhhcyBhbHRlcmVkIHRoZSBsYXlvdXQuXG4gKiAgICAgICAgIFRoZSByZXN1bHQgaXMgYSBsaXN0IG9mIHtpZCAoc3RyaW5nIG9yIG9iamVjdCksIHByb3BlcnR5IChzdHJpbmcpfVxuICogICAgIGdldElucHV0czogc2FtZSBmb3IgaW5wdXRzXG4gKiAgICAgZ2V0U3RhdGU6IHNhbWUgZm9yIHN0YXRlXG4gKiAgICAgY2hhbmdlZFByb3BJZHM6IGFuIG9iamVjdCBvZiB7W2lkQW5kUHJvcF06IHZ9IHRyaWdnZXJpbmcgdGhpcyBjYWxsYmFja1xuICogICAgICAgICB2ID0gRElSRUNUICgyKTogdGhlIHByb3Agd2FzIGNoYW5nZWQgaW4gdGhlIGZyb250IGVuZCwgc28gZGVwZW5kZW50XG4gKiAgICAgICAgICAgICBjYWxsYmFja3MgKk1VU1QqIGJlIGV4ZWN1dGVkLlxuICogICAgICAgICB2ID0gSU5ESVJFQ1QgKDEpOiB0aGUgcHJvcCBpcyBleHBlY3RlZCB0byBiZSBjaGFuZ2VkIGJ5IGEgY2FsbGJhY2ssXG4gKiAgICAgICAgICAgICBidXQgaWYgdGhpcyBpcyBwcmV2ZW50ZWQsIGRlcGVuZGVudCBjYWxsYmFja3MgbWF5IGJlIHBydW5lZC5cbiAqICAgICBpbml0aWFsQ2FsbDogYm9vbGVhbiwgaWYgdHJ1ZSB3ZSBkb24ndCByZXF1aXJlIGFueSBjaGFuZ2VkUHJvcElkc1xuICogICAgICAgICB0byBrZWVwIHRoaXMgY2FsbGJhY2sgYXJvdW5kLCBhcyBpdCdzIHRoZSBpbml0aWFsIGNhbGwgdG8gcG9wdWxhdGVcbiAqICAgICAgICAgdGhpcyB2YWx1ZSBvbiBwYWdlIGxvYWQgb3IgY2hhbmdpbmcgcGFydCBvZiB0aGUgbGF5b3V0LlxuICogICAgICAgICBCeSBkZWZhdWx0IHRoaXMgaXMgdHJ1ZSBmb3IgY2FsbGJhY2tzIGdlbmVyYXRlZCBieVxuICogICAgICAgICBnZXRDYWxsYmFja0J5T3V0cHV0LCBmYWxzZSBmcm9tIGdldENhbGxiYWNrc0J5SW5wdXQuXG4gKiB9XG4gKi9cbmZ1bmN0aW9uIGdldENhbGxiYWNrQnlPdXRwdXQoZ3JhcGhzLCBwYXRocywgaWQsIHByb3ApIHtcbiAgICBsZXQgcmVzb2x2ZTtcbiAgICBsZXQgY2FsbGJhY2s7XG4gICAgbGV0IGFueVZhbHMgPSAnJztcbiAgICBpZiAodHlwZW9mIGlkID09PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBzdGFuZGFyZCBpZCB2ZXJzaW9uXG4gICAgICAgIGNvbnN0IGNhbGxiYWNrcyA9IChncmFwaHMub3V0cHV0TWFwW2lkXSB8fCB7fSlbcHJvcF07XG4gICAgICAgIGlmIChjYWxsYmFja3MpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2tzWzBdO1xuICAgICAgICAgICAgcmVzb2x2ZSA9IHJlc29sdmVEZXBzKCk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyB3aWxkY2FyZCB2ZXJzaW9uXG4gICAgICAgIGNvbnN0IF9rZXlzID0gT2JqZWN0LmtleXMoaWQpLnNvcnQoKTtcbiAgICAgICAgY29uc3QgdmFscyA9IHByb3BzKF9rZXlzLCBpZCk7XG4gICAgICAgIGNvbnN0IGtleVN0ciA9IF9rZXlzLmpvaW4oJywnKTtcbiAgICAgICAgY29uc3QgcGF0dGVybnMgPSAoZ3JhcGhzLm91dHB1dFBhdHRlcm5zW2tleVN0cl0gfHwge30pW3Byb3BdO1xuICAgICAgICBpZiAocGF0dGVybnMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0dGVybnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXR0ZXJuVmFscyA9IHBhdHRlcm5zW2ldLnZhbHVlcztcbiAgICAgICAgICAgICAgICBpZiAocGF0dGVybnNbaV0ucGFydGlhbCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aWFsSWRNYXRjaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuc1tpXS5rZXlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm5WYWxzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9rZXlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHNcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXR0ZXJuUmVmVmFscyA9IHByb3BzKHBhdHRlcm5zW2ldLmtleXMsIGlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gcGF0dGVybnNbaV0uY2FsbGJhY2tzWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSA9IHJlc29sdmVQYXJ0aWFsRGVwcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuc1tpXS5rZXlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm5SZWZWYWxzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm5WYWxzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9rZXlzXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYW55VmFscyA9IGdldEFueVZhbHMocGF0dGVyblZhbHMsIHBhdHRlcm5SZWZWYWxzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpZE1hdGNoKF9rZXlzLCB2YWxzLCBwYXR0ZXJuVmFscykpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBwYXR0ZXJuc1tpXS5jYWxsYmFja3NbMF07XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUgPSByZXNvbHZlRGVwcyhfa2V5cywgdmFscywgcGF0dGVyblZhbHMpO1xuICAgICAgICAgICAgICAgICAgICBhbnlWYWxzID0gZ2V0QW55VmFscyhwYXR0ZXJuVmFscywgdmFscyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBJZiBub3QgZm91bmQsIGFsc28gY2hlY2sgcGFydGlhbCBwYXR0ZXJucyB3aXRoIGZld2VyIGtleXNcbiAgICAgICAgaWYgKCFyZXNvbHZlICYmIGdyYXBocy5oYXNQYXJ0aWFsT3V0cHV0UGF0dGVybnMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcGF0S2V5U3RyIGluIGdyYXBocy5wYXJ0aWFsT3V0cHV0UGF0dGVybnMpIHtcbiAgICAgICAgICAgICAgICBpZiAocGF0S2V5U3RyID09PSBrZXlTdHIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHBhdEtleXMgPSBwYXRLZXlTdHIuc3BsaXQoJywnKTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhdEtleXMuZXZlcnkoayA9PiBfa2V5cy5pbmRleE9mKGspICE9PSAtMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHBhdFByb3BQYXR0ZXJucyA9XG4gICAgICAgICAgICAgICAgICAgIGdyYXBocy5wYXJ0aWFsT3V0cHV0UGF0dGVybnNbcGF0S2V5U3RyXVtwcm9wXTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhdFByb3BQYXR0ZXJucykge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRQcm9wUGF0dGVybnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGF0dGVyblZhbHMgPSBwYXRQcm9wUGF0dGVybnNbaV0udmFsdWVzO1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aWFsSWRNYXRjaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRQcm9wUGF0dGVybnNbaV0ua2V5cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuVmFscyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfa2V5cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxzXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGF0dGVyblJlZlZhbHMgPSBwcm9wcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRQcm9wUGF0dGVybnNbaV0ua2V5cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gcGF0UHJvcFBhdHRlcm5zW2ldLmNhbGxiYWNrc1swXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUgPSByZXNvbHZlUGFydGlhbERlcHMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0UHJvcFBhdHRlcm5zW2ldLmtleXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVyblJlZlZhbHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVyblZhbHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2tleXNcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbnlWYWxzID0gZ2V0QW55VmFscyhwYXR0ZXJuVmFscywgcGF0dGVyblJlZlZhbHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJlc29sdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlmICghcmVzb2x2ZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1ha2VSZXNvbHZlZENhbGxiYWNrKGNhbGxiYWNrLCByZXNvbHZlLCBhbnlWYWxzKTtcbn1cblxuZnVuY3Rpb24gYWRkUmVzb2x2ZWRGcm9tT3V0cHV0cyhjYWxsYmFjaywgb3V0UGF0dGVybiwgb3V0cywgbWF0Y2hlcykge1xuICAgIGNvbnN0IG91dDBLZXlzID0gT2JqZWN0LmtleXMob3V0UGF0dGVybi5pZCkuc29ydCgpO1xuICAgIGNvbnN0IG91dDBQYXR0ZXJuVmFscyA9IHByb3BzKG91dDBLZXlzLCBvdXRQYXR0ZXJuLmlkKTtcbiAgICBjb25zdCBmb3VuZENiSWRzID0ge307XG4gICAgb3V0cy5mb3JFYWNoKCh7aWQ6IG91dElkfSkgPT4ge1xuICAgICAgICBjb25zdCBvdXRWYWxzID0gcHJvcHMob3V0MEtleXMsIG91dElkKTtcbiAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSBtYWtlUmVzb2x2ZWRDYWxsYmFjayhcbiAgICAgICAgICAgIGNhbGxiYWNrLFxuICAgICAgICAgICAgcmVzb2x2ZURlcHMob3V0MEtleXMsIG91dFZhbHMsIG91dDBQYXR0ZXJuVmFscyksXG4gICAgICAgICAgICBnZXRBbnlWYWxzKG91dDBQYXR0ZXJuVmFscywgb3V0VmFscylcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qge3Jlc29sdmVkSWR9ID0gcmVzb2x2ZWQ7XG4gICAgICAgIGlmICghZm91bmRDYklkc1tyZXNvbHZlZElkXSkge1xuICAgICAgICAgICAgbWF0Y2hlcy5wdXNoKHJlc29sdmVkKTtcbiAgICAgICAgICAgIGZvdW5kQ2JJZHNbcmVzb2x2ZWRJZF0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRBbGxSZXNvbHZlZEZyb21PdXRwdXRzKFxuICAgIHJlc29sdmUsXG4gICAgcGF0aHMsXG4gICAgbWF0Y2hlcyxcbiAgICB0cmlnZ2VyQW55VmFscyA9ICcnXG4pIHtcbiAgICByZXR1cm4gY2FsbGJhY2sgPT4ge1xuICAgICAgICBjb25zdCB7bWF0Y2hLZXlzLCBmaXJzdFNpbmdsZU91dHB1dCwgb3V0cHV0c30gPSBjYWxsYmFjaztcbiAgICAgICAgaWYgKG1hdGNoS2V5cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IHNpbmdsZU91dFBhdHRlcm4gPSBvdXRwdXRzW2ZpcnN0U2luZ2xlT3V0cHV0XTtcbiAgICAgICAgICAgIGlmIChzaW5nbGVPdXRQYXR0ZXJuKSB7XG4gICAgICAgICAgICAgICAgYWRkUmVzb2x2ZWRGcm9tT3V0cHV0cyhcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgICAgICAgICAgICAgIHNpbmdsZU91dFBhdHRlcm4sXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocGF0aHMpKHNpbmdsZU91dFBhdHRlcm4pLFxuICAgICAgICAgICAgICAgICAgICBtYXRjaGVzXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICAgKiBJZiBldmVyeSBvdXRwdXQgaGFzIEFMTCB3ZSBuZWVkIHRvIHJlZHVjZSByZXNvbHZlZCBzZXRcbiAgICAgICAgICAgICAgICAgKiB0byBvbmUgaXRlbSBwZXIgY29tYmluYXRpb24gb2YgTUFUQ0ggdmFsdWVzLlxuICAgICAgICAgICAgICAgICAqIFRoYXQgd2lsbCBnaXZlIG9uZSByZXN1bHQgcGVyIGNhbGxiYWNrIGludm9jYXRpb24uXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgY29uc3QgYW55U2VlbiA9IHt9O1xuICAgICAgICAgICAgICAgIG91dHB1dHMuZm9yRWFjaChvdXRQYXR0ZXJuID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3V0U2V0ID0gcmVzb2x2ZShwYXRocykob3V0UGF0dGVybikuZmlsdGVyKGkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF0Y2hTdHIgPSBKU09OLnN0cmluZ2lmeShwcm9wcyhtYXRjaEtleXMsIGkuaWQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYW55U2VlblttYXRjaFN0cl0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnlTZWVuW21hdGNoU3RyXSA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBhZGRSZXNvbHZlZEZyb21PdXRwdXRzKFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRQYXR0ZXJuLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3V0U2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlc1xuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gT3V0cHV0cyBoYXZlIG5vIE1BVENIIGtleXMgKGZpeGVkLWlkIG91dHB1dHMgb3Igbm8gb3V0cHV0KS5cbiAgICAgICAgICAgIC8vIEZhbGwgYmFjayB0byB0aGUgdHJpZ2dlcmluZyBpbnB1dCdzIE1BVENIIHZhbHVlcyBzbyB0aGF0XG4gICAgICAgICAgICAvLyBzZXBhcmF0ZSBNQVRDSCB0cmlnZ2VycyBwcm9kdWNlIGRpc3RpbmN0IHJlc29sdmVkSWRzIGFuZFxuICAgICAgICAgICAgLy8gYXJlbid0IGRlZHVwbGljYXRlZCBpbnRvIGEgc2luZ2xlIGZpcmluZy4gU2VlIGlzc3VlICMyNDYyLlxuICAgICAgICAgICAgY29uc3QgY2IgPSBtYWtlUmVzb2x2ZWRDYWxsYmFjayhjYWxsYmFjaywgcmVzb2x2ZSwgdHJpZ2dlckFueVZhbHMpO1xuICAgICAgICAgICAgbWF0Y2hlcy5wdXNoKGNiKTtcbiAgICAgICAgfVxuICAgIH07XG59XG5cbi8qXG4gKiBGb3IgYSBnaXZlbiBpZCBhbmQgcHJvcCBmaW5kIGFsbCBjYWxsYmFja3MgaXQncyBhbiBpbnB1dCBvZi5cbiAqXG4gKiBSZXR1cm5zIGFuIGFycmF5IG9mIG9iamVjdHM6XG4gKiAgIHtjYWxsYmFjaywgcmVzb2x2ZWRJZCwgZ2V0T3V0cHV0cywgZ2V0SW5wdXRzLCBnZXRTdGF0ZX1cbiAqICAgU2VlIGdldENhbGxiYWNrQnlPdXRwdXQgZm9yIGRldGFpbHMuXG4gKlxuICogTm90ZSB0aGF0IGlmIHRoZSBvcmlnaW5hbCBpbnB1dCBjb250YWlucyBhbiBBTExTTUFMTEVSIHdpbGRjYXJkLFxuICogdGhlcmUgbWF5IGJlIG1hbnkgZW50cmllcyBmb3IgdGhlIHNhbWUgY2FsbGJhY2ssIGJ1dCBhbnkgZ2l2ZW4gb3V0cHV0XG4gKiAod2l0aCBhbiBNQVRDSCBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbnB1dCdzIEFMTFNNQUxMRVIpIHdpbGwgb25seSBhcHBlYXJcbiAqIGluIG9uZSBlbnRyeS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdhdGNoZWRLZXlzKGlkLCBuZXdQcm9wcywgZ3JhcGhzKSB7XG4gICAgaWYgKCEoaWQgJiYgZ3JhcGhzICYmIG5ld1Byb3BzLmxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnN0IGlucHV0cyA9IGdyYXBocy5pbnB1dE1hcFtpZF07XG4gICAgICAgIHJldHVybiBpbnB1dHMgPyBuZXdQcm9wcy5maWx0ZXIobmV3UHJvcCA9PiBpbnB1dHNbbmV3UHJvcF0pIDogW107XG4gICAgfVxuXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGlkKS5zb3J0KCk7XG4gICAgY29uc3QgdmFscyA9IHByb3BzKGtleXMsIGlkKTtcbiAgICBjb25zdCBrZXlTdHIgPSBrZXlzLmpvaW4oJywnKTtcbiAgICBjb25zdCBrZXlQYXR0ZXJucyA9IGdyYXBocy5pbnB1dFBhdHRlcm5zW2tleVN0cl07XG5cbiAgICBpZiAoIWtleVBhdHRlcm5zICYmICFncmFwaHMuaGFzUGFydGlhbElucHV0UGF0dGVybnMpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHJldHVybiBuZXdQcm9wcy5maWx0ZXIocHJvcCA9PiB7XG4gICAgICAgIC8vIENoZWNrIGV4YWN0IGtleVN0ciBwYXR0ZXJuc1xuICAgICAgICBpZiAoa2V5UGF0dGVybnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhdHRlcm5zID0ga2V5UGF0dGVybnNbcHJvcF07XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgcGF0dGVybnMgJiZcbiAgICAgICAgICAgICAgICBwYXR0ZXJucy5zb21lKHBhdHRlcm4gPT4gaWRNYXRjaChrZXlzLCB2YWxzLCBwYXR0ZXJuLnZhbHVlcykpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBDaGVjayBwYXJ0aWFsIHBhdHRlcm5zIHdob3NlIGtleXMgYXJlIGEgc3Vic2V0IG9mIHRoaXMgY29tcG9uZW50J3Mga2V5c1xuICAgICAgICBpZiAoIWdyYXBocy5oYXNQYXJ0aWFsSW5wdXRQYXR0ZXJucykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgcGF0S2V5U3RyIGluIGdyYXBocy5wYXJ0aWFsSW5wdXRQYXR0ZXJucykge1xuICAgICAgICAgICAgaWYgKHBhdEtleVN0ciA9PT0ga2V5U3RyKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBwYXRLZXlzID0gcGF0S2V5U3RyLnNwbGl0KCcsJyk7XG4gICAgICAgICAgICBpZiAoIXBhdEtleXMuZXZlcnkoayA9PiBrZXlzLmluZGV4T2YoaykgIT09IC0xKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcGF0UHJvcFBhdHRlcm5zID1cbiAgICAgICAgICAgICAgICBncmFwaHMucGFydGlhbElucHV0UGF0dGVybnNbcGF0S2V5U3RyXVtwcm9wXTtcbiAgICAgICAgICAgIGlmICghcGF0UHJvcFBhdHRlcm5zKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgcGF0UHJvcFBhdHRlcm5zLnNvbWUocGF0dGVybiA9PlxuICAgICAgICAgICAgICAgICAgICBwYXJ0aWFsSWRNYXRjaChwYXRLZXlzLCBwYXR0ZXJuLnZhbHVlcywga2V5cywgdmFscylcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG59XG5cbi8qXG4gKiBSZXR1cm4gYSBsaXN0IG9mIGFsbCBjYWxsYmFja3MgcmVmZXJlbmNpbmcgYSBjaHVuayBvZiB0aGUgbGF5b3V0LFxuICogZWl0aGVyIGFzIGlucHV0cyBvciBvdXRwdXRzLlxuICpcbiAqIG9wdHMub3V0cHV0c09ubHk6IGJvb2xlYW4sIHNldCB0cnVlIHdoZW4gY3Jhd2xpbmcgdGhlICp3aG9sZSogbGF5b3V0LFxuICogICBiZWNhdXNlIG91dHB1dHMgYXJlIGVub3VnaCB0byBnZXQgZXZlcnl0aGluZy5cbiAqIG9wdHMucmVtb3ZlZEFycmF5SW5wdXRzT25seTogYm9vbGVhbiwgc2V0IHRydWUgdG8gb25seSBsb29rIGZvciBpbnB1dHMgaW5cbiAqICAgd2lsZGNhcmQgYXJyYXlzIChBTEwgb3IgQUxMU01BTExFUiksIG5vIG91dHB1dHMuIFRoaXMgZ2V0cyB1c2VkIHRvIHRlbGxcbiAqICAgd2hlbiB0aGUgbmV3ICphYnNlbmNlKiBvZiBhIGdpdmVuIGNvbXBvbmVudCBzaG91bGQgdHJpZ2dlciBhIGNhbGxiYWNrLlxuICogb3B0cy5uZXdQYXRoczogcGF0aHMgb2JqZWN0IGFmdGVyIHRoZSBlZGl0IC0gdG8gYmUgdXNlZCB3aXRoXG4gKiAgIHJlbW92ZWRBcnJheUlucHV0c09ubHkgdG8gZGV0ZXJtaW5lIGlmIHRoZSBjYWxsYmFjayBzdGlsbCBoYXMgaXRzIG91dHB1dHNcbiAqIG9wdHMuY2h1bmtQYXRoOiBwYXRoIHRvIHRoZSBuZXcgY2h1bmsgLSB1c2VkIHRvIGRldGVybWluZSBpZiBhbnkgb3V0cHV0cyBhcmVcbiAqICAgb3V0c2lkZSBvZiB0aGlzIGNodW5rLCBiZWNhdXNlIHRoaXMgZGV0ZXJtaW5lcyB3aGV0aGVyIGlucHV0cyBpbnNpZGUgdGhlXG4gKiAgIGNodW5rIGNvdW50IGFzIGhhdmluZyBjaGFuZ2VkXG4gKiBvcHRzLnBhdGNoQW5hbHlzaXM6IHdoYXQgdGhlIGBQYXRjaCgpYCBvcGVyYXRpb25zIHRoYXQgcHJvZHVjZWQgdGhpcyBjaHVua1xuICogICBjaGFuZ2VkLiBPbmx5IHRoZSBjb21wb25lbnRzIHRoZSBwYXRjaCBjcmVhdGVkIGdldCB0aGVpciBpbml0aWFsIGNhbGxcbiAqICAgSXQgYWxzbyBhbGxvd3MgYW4gaW5wdXQgdGhlIHBhdGNoIHdyb3RlIGRpcmVjdGx5IHRvIGJ5cGFzcyB0aGUgY2h1bmtQYXRoXG4gKiAgIGRlZHVwLCB3aGVuIHRoYXQgaW5wdXQncyBvd24gY29tcG9uZW50IHdhcyBjYXJyaWVkIG92ZXIgKHNvXG4gKiAgIGl0cyBvd24gaW5pdGlhbCBjYWxsIHN0YXlzIHN1cHByZXNzZWQpIGJ1dCBkb3duc3RyZWFtIGNhbGxiYWNrcyBzdGlsbFxuICogICBuZWVkIHRvIHNlZSB0aGUgbmV3IHZhbHVlXG4gKiAgIEFic2VudCB3aGVuIHRoZSBjaHVuayBpcyBub3QgdGhlIHJlc3VsdCBvZiBhIHBhdGNoXG4gKlxuICogUmV0dXJucyBhbiBhcnJheSBvZiBvYmplY3RzOlxuICogICB7Y2FsbGJhY2ssIHJlc29sdmVkSWQsIGdldE91dHB1dHMsIGdldElucHV0cywgZ2V0U3RhdGUsIC4uLmV0Y31cbiAqICAgU2VlIGdldENhbGxiYWNrQnlPdXRwdXQgZm9yIGRldGFpbHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRVbmZpbHRlcmVkTGF5b3V0Q2FsbGJhY2tzKGdyYXBocywgcGF0aHMsIGxheW91dENodW5rLCBvcHRzKSB7XG4gICAgY29uc3Qge1xuICAgICAgICBvdXRwdXRzT25seSxcbiAgICAgICAgcmVtb3ZlZEFycmF5SW5wdXRzT25seSxcbiAgICAgICAgbmV3UGF0aHMsXG4gICAgICAgIGNodW5rUGF0aCxcbiAgICAgICAgcGF0Y2hBbmFseXNpc1xuICAgIH0gPSBvcHRzO1xuICAgIGNvbnN0IGZvdW5kQ2JJZHMgPSB7fTtcbiAgICBjb25zdCBjYWxsYmFja3MgPSBbXTtcblxuICAgIGZ1bmN0aW9uIGFkZENhbGxiYWNrKGNhbGxiYWNrKSB7XG4gICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgICAgY29uc3QgZm91bmRJbmRleCA9IGZvdW5kQ2JJZHNbY2FsbGJhY2sucmVzb2x2ZWRJZF07XG4gICAgICAgICAgICBpZiAoZm91bmRJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZm91bmRDYiA9IGNhbGxiYWNrc1tmb3VuZEluZGV4XTtcbiAgICAgICAgICAgICAgICBmb3VuZENiLmNoYW5nZWRQcm9wSWRzID0gbWVyZ2VNYXgoXG4gICAgICAgICAgICAgICAgICAgIGZvdW5kQ2IuY2hhbmdlZFByb3BJZHMsXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNoYW5nZWRQcm9wSWRzXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2suaW5pdGlhbENhbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgZm91bmRDYi5pbml0aWFsQ2FsbCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3VuZENiSWRzW2NhbGxiYWNrLnJlc29sdmVkSWRdID0gY2FsbGJhY2tzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBjYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZGRDYWxsYmFja0lmQXJyYXkoaWRTdHIpIHtcbiAgICAgICAgcmV0dXJuIGNiID0+XG4gICAgICAgICAgICBjYi5nZXRJbnB1dHMocGF0aHMpLnNvbWUoaW5pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoaW5pKSAmJlxuICAgICAgICAgICAgICAgICAgICBpbmkuc29tZShpbmlqID0+IHN0cmluZ2lmeUlkKGluaWouaWQpID09PSBpZFN0cilcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBjYWxsYmFjayBzaG91bGQgdHJpZ2dlciBldmVuIHdpdGggbm8gY2hhbmdlZFByb3BzLFxuICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGUgcHJvcHMgdGhhdCBjaGFuZ2VkIG5vIGxvbmdlciBleGlzdC5cbiAgICAgICAgICAgICAgICAgICAgLy8gV2UncmUga2luZCBvZiBhYnVzaW5nIHRoZSBgaW5pdGlhbENhbGxgIGZsYWcgaGVyZSwgaXQnc1xuICAgICAgICAgICAgICAgICAgICAvLyBtb3JlIGxpa2UgYSBcImZpbmFsIGNhbGxcIiBmb3IgdGhlIHJlbW92ZWQgaW5wdXRzLCBidXRcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBjYXNlIGlzIG5vdCBzdWJqZWN0IHRvIGBwcmV2ZW50X2luaXRpYWxfY2FsbGAuXG4gICAgICAgICAgICAgICAgICAgIGlmIChmbGF0dGVuKGNiLmdldE91dHB1dHMobmV3UGF0aHMpKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNiLmluaXRpYWxDYWxsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNiLmNoYW5nZWRQcm9wSWRzID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRDYWxsYmFjayhjYik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGhhbmRsZU9uZUlkKGlkLCBvdXRJZENhbGxiYWNrcywgaW5JZENhbGxiYWNrcykge1xuICAgICAgICBpZiAob3V0SWRDYWxsYmFja3MpIHtcbiAgICAgICAgICAgIC8vIFN1cHByZXNzIHRoZSBpbml0aWFsIGNhbGwgZm9yIGNvbXBvbmVudHMgYSBQYXRjaCBjYXJyaWVkIG92ZXJcbiAgICAgICAgICAgIC8vIFRoZSBwYXRjaCBpdHNlbGYgdGVsbHMgdXMgd2hpY2ggY29tcG9uZW50cyBpdCBjcmVhdGVkLCBpbmNsdWRpbmdcbiAgICAgICAgICAgIC8vIGNvbXBvbmVudHMgcmVidWlsdCB3aXRoIGFuIGlkIHRoYXQgd2FzIGFscmVhZHkgaW4gdXNlLFxuICAgICAgICAgICAgLy8gd2hvc2UgaW5pdGlhbCBjYWxsYmFja3MgbXVzdCBydW4gYWdhaW4gZXZlbiBpZiB0aGVpciBuZXcgZGVmYXVsdHNcbiAgICAgICAgICAgIC8vIGhhcHBlbiB0byBtYXRjaCB0aGUgdmFsdWVzIG9mIHRoZSBpbnN0YW5jZSB0aGV5IHJlcGxhY2VkLlxuICAgICAgICAgICAgLy8gSXQgZXhjbHVkZXMgdGhlIGNvbnRhaW5lcnMgYmV0d2VlbiB0aGUgcGF0Y2hlZCBwcm9wIGFuZCB0aGUgdmFsdWVcbiAgICAgICAgICAgIC8vIHRoYXQgY2hhbmdlZDogcmFtZGEncyBhc3NvY1BhdGggaGFzIHRvIHJlYnVpbGQgdGhvc2UsIGJ1dCB0aGVcbiAgICAgICAgICAgIC8vIHBhdGNoIGRpZCBub3QgY3JlYXRlIHRoZW0sIHNvIHRoZXkga2VlcCB0aGVpciBpbml0aWFsIGNhbGxcbiAgICAgICAgICAgIC8vIHN1cHByZXNzZWRcbiAgICAgICAgICAgIGNvbnN0IGlzQ2FycnlPdmVyID0gcGF0Y2hBbmFseXNpc1xuICAgICAgICAgICAgICAgID8gaXNDYXJyaWVkT3ZlckJ5UGF0Y2gocGF0Y2hBbmFseXNpcywgc3RyaW5naWZ5SWQoaWQpKVxuICAgICAgICAgICAgICAgIDogZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIG91dElkQ2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2IgPSBnZXRDYWxsYmFja0J5T3V0cHV0KGdyYXBocywgcGF0aHMsIGlkLCBwcm9wZXJ0eSk7XG4gICAgICAgICAgICAgICAgaWYgKGNiKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrcyBmb3VuZCBpbiB0aGUgbGF5b3V0IGJ5IG91dHB1dCBzaG91bGQgYWx3YXlzIHJ1blxuICAgICAgICAgICAgICAgICAgICAvLyB1bmxlc3Mgc3BlY2lmaWNhbGx5IHJlcXVlc3RlZCBub3QgdG8uXG4gICAgICAgICAgICAgICAgICAgIC8vIGllIHRoaXMgaXMgdGhlIGluaXRpYWwgY2FsbCBvZiB0aGlzIGNhbGxiYWNrIGV2ZW4gaWYgaXQnc1xuICAgICAgICAgICAgICAgICAgICAvLyBub3QgdGhlIHBhZ2UgaW5pdGlhbGl6YXRpb24gYnV0IGp1c3QgYSBuZXcgbGF5b3V0IGNodW5rXG4gICAgICAgICAgICAgICAgICAgIGlmICghY2IuY2FsbGJhY2sucHJldmVudF9pbml0aWFsX2NhbGwgJiYgIWlzQ2FycnlPdmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYi5pbml0aWFsQ2FsbCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRDYWxsYmFjayhjYik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFvdXRwdXRzT25seSAmJiBpbklkQ2FsbGJhY2tzKSB7XG4gICAgICAgICAgICBjb25zdCBpZFN0ciA9IHN0cmluZ2lmeUlkKGlkKTtcbiAgICAgICAgICAgIGNvbnN0IG1heWJlQWRkQ2FsbGJhY2sgPSByZW1vdmVkQXJyYXlJbnB1dHNPbmx5XG4gICAgICAgICAgICAgICAgPyBhZGRDYWxsYmFja0lmQXJyYXkoaWRTdHIpXG4gICAgICAgICAgICAgICAgOiBhZGRDYWxsYmFjaztcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gaW5JZENhbGxiYWNrcykge1xuICAgICAgICAgICAgICAgIC8vIEEgY2FsbGJhY2ssIHdob3NlIG91dHB1dHMgYXJlIGFsbCBpbnNpZGUgdGhlIGNodW5rLCBpc1xuICAgICAgICAgICAgICAgIC8vIG5vcm1hbGx5IGRyb3BwZWQgaGVyZSBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZVxuICAgICAgICAgICAgICAgIC8vIG91dHB1dCBoYW5kbGluZyBhYm92ZSBhbHJlYWR5IGNvdmVycyBpdFxuICAgICAgICAgICAgICAgIC8vIFRoYXQgYXNzdW1wdGlvbiBmYWlscyB3aGVuIHRoZSBwYXRjaFxuICAgICAgICAgICAgICAgIC8vIHdyb3RlIGEgbmV3IHZhbHVlIGRpcmVjdGx5IG9uIHRoaXMgaW5wdXQgd2l0aG91dFxuICAgICAgICAgICAgICAgIC8vIHJlY3JlYXRpbmcgdGhlIGlucHV0J3Mgb3duIGNvbXBvbmVudFxuICAgICAgICAgICAgICAgIC8vIFRoZSBvdXRwdXQgc2lkZSBzdGF5cyBzdXBwcmVzc2VkIGJlY2F1c2UgdGhlIG91dHB1dFxuICAgICAgICAgICAgICAgIC8vIGNvbXBvbmVudCB3YXMgY2FycmllZCBvdmVyLCBidXQgdGhpcyBpbnB1dCdzIHZhbHVlXG4gICAgICAgICAgICAgICAgLy8gZ2VudWluZWx5IGNoYW5nZWQsIHNvIHRoZSBjYWxsYmFjayBtdXN0IHN0aWxsIGJlIGFkZGVkXG4gICAgICAgICAgICAgICAgbGV0IGhhbmRsZVRoaXNDYWxsYmFjayA9IG1heWJlQWRkQ2FsbGJhY2s7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBjaHVua1BhdGggJiZcbiAgICAgICAgICAgICAgICAgICAgIXdhc1dyaXR0ZW5CeVBhdGNoKHBhdGNoQW5hbHlzaXMsIGlkU3RyLCBwcm9wZXJ0eSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlVGhpc0NhbGxiYWNrID0gY2IgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFhbGwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0c1dpdGgoY2h1bmtQYXRoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Y2soJ3BhdGgnLCBmbGF0dGVuKGNiLmdldE91dHB1dHMocGF0aHMpKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXliZUFkZENhbGxiYWNrKGNiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZ2V0Q2FsbGJhY2tzQnlJbnB1dChcbiAgICAgICAgICAgICAgICAgICAgZ3JhcGhzLFxuICAgICAgICAgICAgICAgICAgICBwYXRocyxcbiAgICAgICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LFxuICAgICAgICAgICAgICAgICAgICBJTkRJUkVDVFxuICAgICAgICAgICAgICAgICkuZm9yRWFjaChoYW5kbGVUaGlzQ2FsbGJhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgY3Jhd2xMYXlvdXQobGF5b3V0Q2h1bmssIGNoaWxkID0+IHtcbiAgICAgICAgY29uc3QgaWQgPSBjaGlsZC5wcm9wcyAmJiBjaGlsZC5wcm9wcy5pZDtcbiAgICAgICAgaWYgKGlkKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGlkID09PSAnc3RyaW5nJyAmJiAhcmVtb3ZlZEFycmF5SW5wdXRzT25seSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZU9uZUlkKGlkLCBncmFwaHMub3V0cHV0TWFwW2lkXSwgZ3JhcGhzLmlucHV0TWFwW2lkXSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IF9rZXlzID0gT2JqZWN0LmtleXMoaWQpLnNvcnQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXlTdHIgPSBfa2V5cy5qb2luKCcsJyk7XG4gICAgICAgICAgICAgICAgaGFuZGxlT25lSWQoXG4gICAgICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgICAgICAhcmVtb3ZlZEFycmF5SW5wdXRzT25seSAmJiBncmFwaHMub3V0cHV0UGF0dGVybnNba2V5U3RyXSxcbiAgICAgICAgICAgICAgICAgICAgZ3JhcGhzLmlucHV0UGF0dGVybnNba2V5U3RyXVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgLy8gQWxzbyBjaGVjayBwYXJ0aWFsIHBhdHRlcm5zIHdob3NlIGtleXMgYXJlIGEgc3Vic2V0IG9mXG4gICAgICAgICAgICAgICAgLy8gdGhpcyBjb21wb25lbnQncyBrZXlzXG4gICAgICAgICAgICAgICAgaWYgKGdyYXBocy5oYXNQYXJ0aWFsSW5wdXRQYXR0ZXJucykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHBhdEtleVN0ciBpbiBncmFwaHMucGFydGlhbElucHV0UGF0dGVybnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXRLZXlTdHIgPT09IGtleVN0cikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGF0S2V5cyA9IHBhdEtleVN0ci5zcGxpdCgnLCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXRLZXlzLmV2ZXJ5KGsgPT4gX2tleXMuaW5kZXhPZihrKSAhPT0gLTEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVPbmVJZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYXBocy5wYXJ0aWFsSW5wdXRQYXR0ZXJuc1twYXRLZXlTdHJdXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSAvLyBlbmQgaGFzUGFydGlhbElucHV0UGF0dGVybnMgZ3VhcmRcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICFyZW1vdmVkQXJyYXlJbnB1dHNPbmx5ICYmXG4gICAgICAgICAgICAgICAgICAgIGdyYXBocy5oYXNQYXJ0aWFsT3V0cHV0UGF0dGVybnNcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBwYXRLZXlTdHIgaW4gZ3JhcGhzLnBhcnRpYWxPdXRwdXRQYXR0ZXJucykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdEtleVN0ciA9PT0ga2V5U3RyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXRLZXlzID0gcGF0S2V5U3RyLnNwbGl0KCcsJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhdEtleXMuZXZlcnkoayA9PiBfa2V5cy5pbmRleE9mKGspICE9PSAtMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZU9uZUlkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYXBocy5wYXJ0aWFsT3V0cHV0UGF0dGVybnNbcGF0S2V5U3RyXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbWFwKFxuICAgICAgICBjYiA9PiAoe1xuICAgICAgICAgICAgLi4uY2IsXG4gICAgICAgICAgICBwcmlvcml0eTogZ2V0UHJpb3JpdHkoZ3JhcGhzLCBwYXRocywgY2IpXG4gICAgICAgIH0pLFxuICAgICAgICBjYWxsYmFja3NcbiAgICApO1xufVxuIiwiaW1wb3J0IHtvbmNlLCBwYXRofSBmcm9tICdyYW1kYSc7XG5pbXBvcnQge2NyZWF0ZUFjdGlvbn0gZnJvbSAncmVkdXgtYWN0aW9ucyc7XG5pbXBvcnQge2FkZFJlcXVlc3RlZENhbGxiYWNrc30gZnJvbSAnLi9jYWxsYmFja3MnO1xuaW1wb3J0IHtnZXRBcHBTdGF0ZX0gZnJvbSAnLi4vcmVkdWNlcnMvY29uc3RhbnRzJztcbmltcG9ydCB7Z2V0QWN0aW9ufSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQge3BhcnNlQ29va2llfSBmcm9tICdjb29raWUnO1xuaW1wb3J0IHt2YWxpZGF0ZUNhbGxiYWNrc1RvTGF5b3V0fSBmcm9tICcuL2RlcGVuZGVuY2llcyc7XG5pbXBvcnQge1xuICAgIGluY2x1ZGVPYnNlcnZlcnMsXG4gICAgZ2V0TGF5b3V0Q2FsbGJhY2tzLFxuICAgIG1ha2VSZXNvbHZlZENhbGxiYWNrLFxuICAgIHJlc29sdmVEZXBzXG59IGZyb20gJy4vZGVwZW5kZW5jaWVzX3RzJztcbmltcG9ydCB7Y29tcHV0ZVBhdGhzLCBnZXRQYXRofSBmcm9tICcuL3BhdGhzJztcbmltcG9ydCB7cmVjb3JkVWlFZGl0fSBmcm9tICcuLi9wZXJzaXN0ZW5jZSc7XG5cbmV4cG9ydCBjb25zdCBvbkVycm9yID0gY3JlYXRlQWN0aW9uKGdldEFjdGlvbignT05fRVJST1InKSk7XG5leHBvcnQgY29uc3Qgc2V0QXBwTGlmZWN5Y2xlID0gY3JlYXRlQWN0aW9uKGdldEFjdGlvbignU0VUX0FQUF9MSUZFQ1lDTEUnKSk7XG5leHBvcnQgY29uc3Qgc2V0Q29uZmlnID0gY3JlYXRlQWN0aW9uKGdldEFjdGlvbignU0VUX0NPTkZJRycpKTtcbmV4cG9ydCBjb25zdCBhZGRIdHRwSGVhZGVycyA9IGNyZWF0ZUFjdGlvbihnZXRBY3Rpb24oJ0FERF9IVFRQX0hFQURFUlMnKSk7XG5leHBvcnQgY29uc3Qgc2V0R3JhcGhzID0gY3JlYXRlQWN0aW9uKGdldEFjdGlvbignU0VUX0dSQVBIUycpKTtcbmV4cG9ydCBjb25zdCBzZXRIb29rcyA9IGNyZWF0ZUFjdGlvbihnZXRBY3Rpb24oJ1NFVF9IT09LUycpKTtcbmV4cG9ydCBjb25zdCBzZXRMYXlvdXQgPSBjcmVhdGVBY3Rpb24oZ2V0QWN0aW9uKCdTRVRfTEFZT1VUJykpO1xuZXhwb3J0IGNvbnN0IHNldFBhdGhzID0gY3JlYXRlQWN0aW9uKGdldEFjdGlvbignU0VUX1BBVEhTJykpO1xuZXhwb3J0IGNvbnN0IHNldFJlcXVlc3RRdWV1ZSA9IGNyZWF0ZUFjdGlvbihnZXRBY3Rpb24oJ1NFVF9SRVFVRVNUX1FVRVVFJykpO1xuZXhwb3J0IGNvbnN0IGluc2VydENvbXBvbmVudCA9IGNyZWF0ZUFjdGlvbihnZXRBY3Rpb24oJ0lOU0VSVF9DT01QT05FTlQnKSk7XG5leHBvcnQgY29uc3QgcmVtb3ZlQ29tcG9uZW50ID0gY3JlYXRlQWN0aW9uKGdldEFjdGlvbignUkVNT1ZFX0NPTVBPTkVOVCcpKTtcblxuZXhwb3J0IGNvbnN0IG9uUHJvcENoYW5nZSA9IGNyZWF0ZUFjdGlvbihnZXRBY3Rpb24oJ09OX1BST1BfQ0hBTkdFJykpO1xuZXhwb3J0IGNvbnN0IHJlc2V0Q29tcG9uZW50U3RhdGUgPSBjcmVhdGVBY3Rpb24oXG4gICAgZ2V0QWN0aW9uKCdSRVNFVF9DT01QT05FTlRfU1RBVEUnKVxuKTtcblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVByb3BzKHBheWxvYWQpIHtcbiAgICByZXR1cm4gKGRpc3BhdGNoLCBnZXRTdGF0ZSkgPT4ge1xuICAgICAgICBjb25zdCBjb21wb25lbnQgPSBwYXRoKHBheWxvYWQuaXRlbXBhdGgsIGdldFN0YXRlKCkubGF5b3V0KTtcbiAgICAgICAgLy8gVGhlIGNvbXBvbmVudCBtYXkgbm8gbG9uZ2VyIGV4aXN0IGF0IHRoaXMgcGF0aCAtIGVnLiBhblxuICAgICAgICAvLyBgRXh0ZXJuYWxXcmFwcGVyYCAoY29tcG9uZW50cyBhcyBwcm9wcykgd2hvc2UgaG9zdCBzdWJ0cmVlIHdhc1xuICAgICAgICAvLyByZXBsYWNlZCBieSBhIGNhbGxiYWNrLiBVcGRhdGluZyBwcm9wcyBvZiBhIGNvbXBvbmVudCB0aGF0IGlzbid0XG4gICAgICAgIC8vIGluIHRoZSBsYXlvdXQgaXMgYSBuby1vcCBhbmQgd291bGQgY3Jhc2ggYHJlY29yZFVpRWRpdGAuXG4gICAgICAgIGlmICghY29tcG9uZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVjb3JkVWlFZGl0KGNvbXBvbmVudCwgcGF5bG9hZC5wcm9wcywgZGlzcGF0Y2gpO1xuICAgICAgICBkaXNwYXRjaChvblByb3BDaGFuZ2UocGF5bG9hZCkpO1xuICAgIH07XG59XG5cbmV4cG9ydCBjb25zdCBhZGRDb21wb25lbnRUb0xheW91dCA9IHBheWxvYWQgPT4gKGRpc3BhdGNoLCBnZXRTdGF0ZSkgPT4ge1xuICAgIGNvbnN0IHtwYXRoc30gPSBnZXRTdGF0ZSgpO1xuICAgIGRpc3BhdGNoKGluc2VydENvbXBvbmVudChwYXlsb2FkKSk7XG4gICAgZGlzcGF0Y2goXG4gICAgICAgIHNldFBhdGhzKGNvbXB1dGVQYXRocyhwYXlsb2FkLmNvbXBvbmVudCwgcGF5bG9hZC5jb21wb25lbnRQYXRoLCBwYXRocykpXG4gICAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBkaXNwYXRjaEVycm9yID0gZGlzcGF0Y2ggPT4gKG1lc3NhZ2UsIGxpbmVzKSA9PlxuICAgIGRpc3BhdGNoKFxuICAgICAgICBvbkVycm9yKHtcbiAgICAgICAgICAgIHR5cGU6ICdiYWNrRW5kJyxcbiAgICAgICAgICAgIGVycm9yOiB7bWVzc2FnZSwgaHRtbDogbGluZXMuam9pbignXFxuJyl9XG4gICAgICAgIH0pXG4gICAgKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGh5ZHJhdGVJbml0aWFsT3V0cHV0cygpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGRpc3BhdGNoLCBnZXRTdGF0ZSkge1xuICAgICAgICB2YWxpZGF0ZUNhbGxiYWNrc1RvTGF5b3V0KGdldFN0YXRlKCksIGRpc3BhdGNoRXJyb3IoZGlzcGF0Y2gpKTtcbiAgICAgICAgdHJpZ2dlckRlZmF1bHRTdGF0ZShkaXNwYXRjaCwgZ2V0U3RhdGUpO1xuICAgICAgICBkaXNwYXRjaChzZXRBcHBMaWZlY3ljbGUoZ2V0QXBwU3RhdGUoJ0hZRFJBVEVEJykpKTtcbiAgICB9O1xufVxuXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZSAqL1xuY29uc3QgbG9nV2FybmluZ09uY2UgPSBvbmNlKGNvbnNvbGUud2Fybik7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDU1JGSGVhZGVyKGNvbmZpZykge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHRva2VuTmFtZSA9IChjb25maWcgJiYgY29uZmlnLmNzcmZfdG9rZW5fbmFtZSkgfHwgJ19jc3JmX3Rva2VuJztcbiAgICAgICAgY29uc3QgaGVhZGVyTmFtZSA9IChjb25maWcgJiYgY29uZmlnLmNzcmZfaGVhZGVyX25hbWUpIHx8ICdYLUNTUkZUb2tlbic7XG4gICAgICAgIGNvbnN0IGNvb2tpZXMgPSBwYXJzZUNvb2tpZShkb2N1bWVudC5jb29raWUpO1xuICAgICAgICBjb25zdCB0b2tlbiA9IGNvb2tpZXNbdG9rZW5OYW1lXTtcbiAgICAgICAgaWYgKCF0b2tlbikge1xuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7W2hlYWRlck5hbWVdOiB0b2tlbn07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dXYXJuaW5nT25jZShlKTtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbn1cblxuZnVuY3Rpb24gdHJpZ2dlckRlZmF1bHRTdGF0ZShkaXNwYXRjaCwgZ2V0U3RhdGUpIHtcbiAgICBjb25zdCB7Z3JhcGhzLCBwYXRocywgbGF5b3V0fSA9IGdldFN0YXRlKCk7XG5cbiAgICAvLyBvdmVyYWxsT3JkZXIgd2lsbCBhc3NlcnQgY2lyY3VsYXIgZGVwZW5kZW5jaWVzIGZvciBtdWx0aSBvdXRwdXQuXG4gICAgdHJ5IHtcbiAgICAgICAgZ3JhcGhzLk11bHRpR3JhcGgub3ZlcmFsbE9yZGVyKCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGRpc3BhdGNoKFxuICAgICAgICAgICAgb25FcnJvcih7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2JhY2tFbmQnLFxuICAgICAgICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdDaXJjdWxhciBEZXBlbmRlbmNpZXMnLFxuICAgICAgICAgICAgICAgICAgICBodG1sOiBlcnIudG9TdHJpbmcoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgbGF5b3V0Q2FsbGJhY2tzID0gZ2V0TGF5b3V0Q2FsbGJhY2tzKFxuICAgICAgICBncmFwaHMsXG4gICAgICAgIHBhdGhzLFxuICAgICAgICBsYXlvdXQuY29tcG9uZW50cyxcbiAgICAgICAge1xuICAgICAgICAgICAgb3V0cHV0c09ubHk6IHRydWVcbiAgICAgICAgfVxuICAgICk7XG5cbiAgICAvLyBBbHNvIGluY2x1ZGUgbm8tb3V0cHV0IGFuZCBuby1pbnB1dCBjYWxsYmFja3MgdGhhdCBzaG91bGQgZmlyZSBvbiBpbml0aWFsIGxvYWRcbiAgICBjb25zdCBzcGVjaWFsQ2FsbGJhY2tzID0gKGdyYXBocy5jYWxsYmFja3MgfHwgW10pLnJlZHVjZSgoYWNjLCBjYikgPT4ge1xuICAgICAgICBpZiAoY2IucHJldmVudF9pbml0aWFsX2NhbGwpIHtcbiAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc05vT3V0cHV0ID0gY2Iubm9PdXRwdXQ7XG4gICAgICAgIGNvbnN0IGlzTm9JbnB1dCA9ICFjYi5ub091dHB1dCAmJiBjYi5pbnB1dHMubGVuZ3RoID09PSAwO1xuXG4gICAgICAgIGlmICghaXNOb091dHB1dCAmJiAhaXNOb0lucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSBtYWtlUmVzb2x2ZWRDYWxsYmFjayhjYiwgcmVzb2x2ZURlcHMoKSwgJycpO1xuICAgICAgICByZXNvbHZlZC5pbml0aWFsQ2FsbCA9IHRydWU7XG5cbiAgICAgICAgaWYgKGlzTm9PdXRwdXQpIHtcbiAgICAgICAgICAgIC8vIE5vLW91dHB1dDogaW5jbHVkZSBpZiBubyBpbnB1dHMgb3IgYW55IGlucHV0IGlzIGluIGxheW91dFxuICAgICAgICAgICAgaWYgKGNiLmlucHV0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBhY2MucHVzaChyZXNvbHZlZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0cyA9IHJlc29sdmVkLmdldElucHV0cyhwYXRocyk7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBpbnB1dHMuc29tZShpbnAgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoaW5wKSA/IGlucC5sZW5ndGggPiAwIDogaW5wXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgYWNjLnB1c2gocmVzb2x2ZWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE5vLWlucHV0OiBpbmNsdWRlIGlmIGFueSBvdXRwdXQgaXMgaW4gbGF5b3V0XG4gICAgICAgICAgICBjb25zdCBvdXRwdXRzID0gcmVzb2x2ZWQuZ2V0T3V0cHV0cyhwYXRocyk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgb3V0cHV0cy5zb21lKG91dCA9PiAoQXJyYXkuaXNBcnJheShvdXQpID8gb3V0Lmxlbmd0aCA+IDAgOiBvdXQpKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgYWNjLnB1c2gocmVzb2x2ZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBbXSk7XG5cbiAgICBkaXNwYXRjaChhZGRSZXF1ZXN0ZWRDYWxsYmFja3MoWy4uLmxheW91dENhbGxiYWNrcywgLi4uc3BlY2lhbENhbGxiYWNrc10pKTtcbn1cblxuZXhwb3J0IGNvbnN0IHJlZG8gPSBtb3ZlSGlzdG9yeSgnUkVETycpO1xuZXhwb3J0IGNvbnN0IHVuZG8gPSBtb3ZlSGlzdG9yeSgnVU5ETycpO1xuZXhwb3J0IGNvbnN0IHJldmVydCA9IG1vdmVIaXN0b3J5KCdSRVZFUlQnKTtcblxuZnVuY3Rpb24gbW92ZUhpc3RvcnkoY2hhbmdlVHlwZSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZGlzcGF0Y2gsIGdldFN0YXRlKSB7XG4gICAgICAgIGNvbnN0IHtoaXN0b3J5LCBwYXRoc30gPSBnZXRTdGF0ZSgpO1xuICAgICAgICBkaXNwYXRjaChjcmVhdGVBY3Rpb24oY2hhbmdlVHlwZSkoKSk7XG4gICAgICAgIGNvbnN0IHtpZCwgcHJvcHN9ID1cbiAgICAgICAgICAgIChjaGFuZ2VUeXBlID09PSAnUkVETydcbiAgICAgICAgICAgICAgICA/IGhpc3RvcnkuZnV0dXJlWzBdXG4gICAgICAgICAgICAgICAgOiBoaXN0b3J5LnBhc3RbaGlzdG9yeS5wYXN0Lmxlbmd0aCAtIDFdKSB8fCB7fTtcbiAgICAgICAgaWYgKGlkKSB7XG4gICAgICAgICAgICAvLyBVcGRhdGUgcHJvcHNcbiAgICAgICAgICAgIGRpc3BhdGNoKFxuICAgICAgICAgICAgICAgIGNyZWF0ZUFjdGlvbignVU5ET19QUk9QX0NIQU5HRScpKHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbXBhdGg6IGdldFBhdGgocGF0aHMsIGlkKSxcbiAgICAgICAgICAgICAgICAgICAgcHJvcHNcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgZGlzcGF0Y2gobm90aWZ5T2JzZXJ2ZXJzKHtpZCwgcHJvcHN9KSk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbm90aWZ5T2JzZXJ2ZXJzKHtpZCwgcHJvcHN9KSB7XG4gICAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIChkaXNwYXRjaCwgZ2V0U3RhdGUpIHtcbiAgICAgICAgY29uc3Qge2dyYXBocywgcGF0aHN9ID0gZ2V0U3RhdGUoKTtcbiAgICAgICAgZGlzcGF0Y2goXG4gICAgICAgICAgICBhZGRSZXF1ZXN0ZWRDYWxsYmFja3MoaW5jbHVkZU9ic2VydmVycyhpZCwgcHJvcHMsIGdyYXBocywgcGF0aHMpKVxuICAgICAgICApO1xuICAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVBc3luY0Vycm9yKGVyciwgbWVzc2FnZSwgZGlzcGF0Y2gpIHtcbiAgICAvLyBIYW5kbGUgaHRtbCBlcnJvciByZXNwb25zZXNcbiAgICBpZiAoZXJyICYmIHR5cGVvZiBlcnIudGV4dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBlcnIudGV4dCgpLnRoZW4odGV4dCA9PiB7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IHttZXNzYWdlLCBodG1sOiB0ZXh0fTtcbiAgICAgICAgICAgIGRpc3BhdGNoKG9uRXJyb3Ioe3R5cGU6ICdiYWNrRW5kJywgZXJyb3J9KSk7XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIgOiB7bWVzc2FnZSwgaHRtbDogZXJyfTtcbiAgICAgICAgZGlzcGF0Y2gob25FcnJvcih7dHlwZTogJ2JhY2tFbmQnLCBlcnJvcn0pKTtcbiAgICB9XG59XG4iLCJpbXBvcnQge3BhdGh9IGZyb20gJ3JhbWRhJztcbmltcG9ydCB7aXNSZWFkeX0gZnJvbSAnQHBsb3RseS9kYXNoLWNvbXBvbmVudC1wbHVnaW5zJztcblxuaW1wb3J0IFJlZ2lzdHJ5IGZyb20gJy4uL3JlZ2lzdHJ5JztcbmltcG9ydCB7Z2V0UGF0aH0gZnJvbSAnLi9wYXRocyc7XG5pbXBvcnQge3N0cmluZ2lmeUlkfSBmcm9tICcuL2RlcGVuZGVuY2llcyc7XG5cbmV4cG9ydCBkZWZhdWx0IChsYXlvdXQsIHBhdGhzLCB0YXJnZXRzKSA9PiB7XG4gICAgaWYgKCF0YXJnZXRzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcblxuICAgIGNvbnN0IHtldmVudHN9ID0gcGF0aHM7XG4gICAgY29uc3QgcmVuZGVyZWQgPSBuZXcgUHJvbWlzZShyZXNvbHZlUmVuZGVyZWQgPT4ge1xuICAgICAgICBldmVudHMub25jZSgncmVuZGVyZWQnLCByZXNvbHZlUmVuZGVyZWQpO1xuICAgIH0pO1xuXG4gICAgdGFyZ2V0cy5mb3JFYWNoKGlkID0+IHtcbiAgICAgICAgY29uc3QgcGF0aE9mSWQgPSBnZXRQYXRoKHBhdGhzLCBpZCk7XG4gICAgICAgIGlmICghcGF0aE9mSWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHBhdGgocGF0aE9mSWQsIGxheW91dCk7XG4gICAgICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb21wb25lbnQgPSBSZWdpc3RyeS5yZXNvbHZlKHRhcmdldCk7XG4gICAgICAgIGNvbnN0IHJlYWR5ID0gaXNSZWFkeShjb21wb25lbnQpO1xuXG4gICAgICAgIGlmIChyZWFkeSAmJiB0eXBlb2YgcmVhZHkudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcHJvbWlzZXMucHVzaChcbiAgICAgICAgICAgICAgICBQcm9taXNlLnJhY2UoW1xuICAgICAgICAgICAgICAgICAgICByZWFkeSxcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyZWQudGhlbihcbiAgICAgICAgICAgICAgICAgICAgICAgICgpID0+IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHN0cmluZ2lmeUlkKGlkKSkgJiYgcmVhZHlcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcHJvbWlzZXMubGVuZ3RoID8gUHJvbWlzZS5hbGwocHJvbWlzZXMpIDogdHJ1ZTtcbn07XG4iLCJpbXBvcnQge1xuICAgIGNvbmNhdCxcbiAgICBmaWx0ZXIsXG4gICAgZmluZCxcbiAgICBmb3JFYWNoT2JqSW5kZXhlZCxcbiAgICBpbnNlcnQsXG4gICAgcHJvcEVxLFxuICAgIHByb3BzLFxuICAgIGluZGV4T2Zcbn0gZnJvbSAncmFtZGEnO1xuXG5pbXBvcnQge2NyYXdsTGF5b3V0fSBmcm9tICcuL3V0aWxzJztcblxuLypcbiAqIHN0YXRlLnBhdGhzIGhhcyBzdHJ1Y3R1cmU6XG4gKiB7XG4gKiAgIHN0cnM6IHtbaWRdOiBwYXRofSAvLyBmb3IgcmVndWxhciBzdHJpbmcgaWRzXG4gKiAgIG9ianM6IHtba2V5U3RyXTogW3t2YWx1ZXMsIHBhdGh9XX0gLy8gZm9yIHdpbGRjYXJkIGlkcywgaW4gbGF5b3V0IG9yZGVyXG4gKiAgIG9iakluZGV4OiB7W2tleVN0cl06IHtbdmFsdWVzS2V5XTogcGF0aH19IC8vIE8oMSkgZXhhY3QgbG9va3VwIGZvciBnZXRQYXRoXG4gKiB9XG4gKiBrZXlTdHI6IHNvcnRlZCBrZXlzIG9mIHRoZSBpZCwgam9pbmVkIHdpdGggJywnIGludG8gb25lIHN0cmluZ1xuICogdmFsdWVzOiBhcnJheSBvZiB2YWx1ZXMgaW4gdGhlIGlkLCBpbiBvcmRlciBvZiBrZXlzXG4gKiB2YWx1ZXNLZXk6IHRob3NlIHZhbHVlcyBzZXJpYWxpemVkLCBzbyBhbiBleGFjdCBpZCByZXNvbHZlcyB0byBpdHMgcGF0aFxuICogICB3aXRob3V0IGEgbGluZWFyIHNjYW4gb2YgZXZlcnkgY29tcG9uZW50IHRoYXQgc2hhcmVzIHRoZSBpZCdzIGtleSBzZXRcbiAqICAgKHdoYXQgbWFkZSByZXNvbHZpbmcgYW4gQUxML01BVENIIGNhbGxiYWNrIG92ZXIgTiBjb21wb25lbnRzIE8oTl4yKSlcbiAqXG4gKiBgb2Jqc2Agc3RheXMgYW4gb3JkZXJlZCBhcnJheSBiZWNhdXNlIHBhdHRlcm4gbWF0Y2hpbmcgKE1BVENIL0FMTFNNQUxMRVIpXG4gKiBhbmQgYGdldEFsbFBNQ0lkc2Agd2FsayBpdCBpbiBvcmRlcjsgYG9iakluZGV4YCBpcyB0aGUgZmFzdCBwYXRoIG9ubHkgZm9yXG4gKiBleGFjdCBsb29rdXBzLiBBIHBhdGhzIG9iamVjdCB0aGF0IHByZWRhdGVzIGBvYmpJbmRleGAgKGFuIGVtcHR5IGluaXRpYWxcbiAqIHN0YXRlLCBhIGhhbmQtYnVpbHQgdGVzdCBmaXh0dXJlKSBzaW1wbHkgaGFzIG5vbmUsIGFuZCBnZXRQYXRoIGZhbGxzIGJhY2tcbiAqIHRvIHRoZSBsaW5lYXIgc2NhbiAtIHNvIHRoZSB0d28gYXJlIGFsd2F5cyBrZXB0IGNvbnNpc3RlbnQgYnkgY29uc3RydWN0aW9uLlxuICovXG5cbmNvbnN0IHZhbHVlc0tleSA9IHZhbHVlcyA9PiBKU09OLnN0cmluZ2lmeSh2YWx1ZXMpO1xuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVBhdGhzKHN1YlRyZWUsIHN0YXJ0aW5nUGF0aCwgb2xkUGF0aHMsIGV2ZW50cykge1xuICAgIGNvbnN0IHtcbiAgICAgICAgc3Ryczogb2xkU3RycyxcbiAgICAgICAgb2Jqczogb2xkT2JqcyxcbiAgICAgICAgb2JqSW5kZXg6IG9sZE9iakluZGV4ID0ge31cbiAgICB9ID0gb2xkUGF0aHMgfHwge3N0cnM6IHt9LCBvYmpzOiB7fX07XG5cbiAgICBjb25zdCBkaWZmSGVhZCA9IHBhdGggPT4gc3RhcnRpbmdQYXRoLnNvbWUoKHYsIGkpID0+IHBhdGhbaV0gIT09IHYpO1xuXG4gICAgY29uc3Qgc3BMZW4gPSBzdGFydGluZ1BhdGgubGVuZ3RoO1xuICAgIC8vIGlmIHdlJ3JlIHVwZGF0aW5nIGEgc3VidHJlZSwgY2xlYXIgb3V0IGFsbCBvZiB0aGUgZXhpc3RpbmcgaXRlbXNcbiAgICBjb25zdCBzdHJzID0gc3BMZW4gPyBmaWx0ZXIoZGlmZkhlYWQsIG9sZFN0cnMpIDoge307XG4gICAgY29uc3Qgb2JqcyA9IHt9O1xuXG4gICAgLy8gb2JqSW5kZXggbWlycm9ycyBvYmpzIGFzIGEgdmFsdWVzS2V5LT5wYXRoIG1hcCBmb3IgTygxKSBnZXRQYXRoLiBGb3IgYVxuICAgIC8vIHN1YnRyZWUgdXBkYXRlIHdlIGtlZXAgdGhlIG9sZCBtYXBzIGFuZCBvbmx5IHRvdWNoIHRoZSBrZXlTdHJzIHdob3NlXG4gICAgLy8gZW50cmllcyBhY3R1YWxseSBjaGFuZ2UgKGNvcHktb24td3JpdGUpLCBzbyByZS1yZXNvbHZpbmcgb25lIHNtYWxsXG4gICAgLy8gY2h1bmsgZG9lc24ndCByZWJ1aWxkIHRoZSBpbmRleCBmb3IgZXZlcnkgdW5yZWxhdGVkIHdpbGRjYXJkIGNvbXBvbmVudC5cbiAgICBjb25zdCBvYmpJbmRleCA9IHNwTGVuID8gey4uLm9sZE9iakluZGV4fSA6IHt9O1xuICAgIGNvbnN0IHRvdWNoZWQgPSBuZXcgU2V0KCk7XG4gICAgY29uc3QgZWRpdE1hcCA9IGtleVN0ciA9PiB7XG4gICAgICAgIGlmICghdG91Y2hlZC5oYXMoa2V5U3RyKSkge1xuICAgICAgICAgICAgb2JqSW5kZXhba2V5U3RyXSA9IHsuLi4ob2JqSW5kZXhba2V5U3RyXSB8fCB7fSl9O1xuICAgICAgICAgICAgdG91Y2hlZC5hZGQoa2V5U3RyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqSW5kZXhba2V5U3RyXTtcbiAgICB9O1xuXG4gICAgaWYgKHNwTGVuKSB7XG4gICAgICAgIGZvckVhY2hPYmpJbmRleGVkKChvbGRWYWxQYXRocywgb2xkS2V5cykgPT4ge1xuICAgICAgICAgICAgY29uc3QgbmV3VmFscyA9IFtdO1xuICAgICAgICAgICAgb2xkVmFsUGF0aHMuZm9yRWFjaChlbnRyeSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGRpZmZIZWFkKGVudHJ5LnBhdGgpKSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld1ZhbHMucHVzaChlbnRyeSk7IC8vIG91dHNpZGUgdGhlIGNodW5rOiBjYXJyaWVkIG92ZXJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBpbnNpZGUgdGhlIGNodW5rIGJlaW5nIHJlcGxhY2VkOiBkcm9wIGl0LCB0aGUgY3Jhd2xcbiAgICAgICAgICAgICAgICAgICAgLy8gYmVsb3cgcmUtYWRkcyB3aGF0ZXZlciBpcyBzdGlsbCB0aGVyZVxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgZWRpdE1hcChvbGRLZXlzKVt2YWx1ZXNLZXkoZW50cnkudmFsdWVzKV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAobmV3VmFscy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBvYmpzW29sZEtleXNdID0gbmV3VmFscztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgb2xkT2Jqcyk7XG4gICAgfVxuXG4gICAgY3Jhd2xMYXlvdXQoc3ViVHJlZSwgKGNoaWxkLCBpdGVtcGF0aCkgPT4ge1xuICAgICAgICBjb25zdCBpZCA9IGNoaWxkLnByb3BzICYmIGNoaWxkLnByb3BzLmlkO1xuICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaWQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGlkKS5zb3J0KCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gcHJvcHMoa2V5cywgaWQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleVN0ciA9IGtleXMuam9pbignLCcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhdGhzID0gKG9ianNba2V5U3RyXSA9IG9ianNba2V5U3RyXSB8fCBbXSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2xkaWUgPSBvbGRPYmpzW2tleVN0cl0gfHwgW107XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IHt2YWx1ZXMsIHBhdGg6IGNvbmNhdChzdGFydGluZ1BhdGgsIGl0ZW1wYXRoKX07XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBpbmRleE9mKGl0ZW0sIG9sZGllKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhdGhzLnB1c2goaXRlbSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgb2Jqc1trZXlTdHJdID0gaW5zZXJ0KGluZGV4LCBpdGVtLCBwYXRocyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IG1hcCA9IGVkaXRNYXAoa2V5U3RyKTtcbiAgICAgICAgICAgICAgICBjb25zdCBrID0gdmFsdWVzS2V5KHZhbHVlcyk7XG4gICAgICAgICAgICAgICAgaWYgKCEoayBpbiBtYXApKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IG1hdGNoIHdpbnMsIG1hdGNoaW5nIHRoZSBvbGQgYGZpbmRgIHNlbWFudGljc1xuICAgICAgICAgICAgICAgICAgICBtYXBba10gPSBpdGVtLnBhdGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdHJzW2lkXSA9IGNvbmNhdChzdGFydGluZ1BhdGgsIGl0ZW1wYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gV2UgaW5jbHVkZSBhbiBldmVudCBlbWl0dGVyIGhlcmUgYmVjYXVzZSBpdCB3aWxsIGJlIHVzZWQgYWxvbmcgd2l0aFxuICAgIC8vIHBhdGhzIHRvIGRldGVybWluZSB3aGVuIHRoZSBhcHAgaXMgcmVhZHkgZm9yIGNhbGxiYWNrcy5cbiAgICByZXR1cm4ge3N0cnMsIG9ianMsIG9iakluZGV4LCBldmVudHM6IGV2ZW50cyB8fCBvbGRQYXRocy5ldmVudHN9O1xufVxuXG4vKlxuICogRmFzdCBwYXRoIGZvciBhIFBhdGNoIHRoYXQgb25seSBhcHBlbmRlZCBpdGVtcyB0byB0aGUgdGFpbCBvZiBhIGNoaWxkcmVuXG4gKiBsaXN0OiBpbnN0ZWFkIG9mIHJlLWNyYXdsaW5nIGV2ZXJ5IHByZS1leGlzdGluZyBjaGlsZCB0byByZWJ1aWxkIHRoZSB3aG9sZVxuICogaWQtPnBhdGggdGFibGUgKE8odG90YWwgY2hpbGRyZW4pKSwgY29tcHV0ZSBwYXRocyBvbmx5IGZvciBgbmV3SXRlbXNgXG4gKiAodGhlIHRhaWwgc2xpY2UgdGhlIHBhdGNoIGFkZGVkKSBhbmQgbGF5ZXIgdGhlbSBvbnRvIHRoZSBleGlzdGluZyB0YWJsZS5cbiAqIFRoZSBwcmUtZXhpc3RpbmcgZW50cmllcyBhcmUgdmFsaWQgYXMtaXMgYmVjYXVzZSBhbiBhcHBlbmQtb25seSBwYXRjaFxuICogbmV2ZXIgY2hhbmdlcyB0aGUgcG9zaXRpb24gb3IgaWRlbnRpdHkgb2YgdGhlIGl0ZW1zIHRoYXQgd2VyZSBhbHJlYWR5XG4gKiB0aGVyZSAoc2VlIGB0YWlsQXBwZW5kc2AgaW4gcGF0Y2hBbmFseXNpcy50cywgd2hpY2ggZ3VhcmFudGVlcyB0aGlzIGJlZm9yZVxuICogdGhpcyBmdW5jdGlvbiBpcyB1c2VkKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGVuZFBhdGhzKG5ld0l0ZW1zLCBzdGFydGluZ1BhdGgsIGFwcGVuZE9mZnNldCwgb2xkUGF0aHMpIHtcbiAgICBjb25zdCBzdHJzID0gey4uLm9sZFBhdGhzLnN0cnN9O1xuICAgIGNvbnN0IG9ianMgPSB7Li4ub2xkUGF0aHMub2Jqc307XG4gICAgY29uc3QgbmV3T2JqSXRlbXMgPSB7fTtcbiAgICAvLyBPbmx5IGV4dGVuZCB0aGUgaW5kZXggaWYgdGhlIG9sZCB0YWJsZSBhbHJlYWR5IGhhZCBvbmUgLSBvdGhlcndpc2VcbiAgICAvLyBpdCB3b3VsZCBiZSBpbmNvbXBsZXRlIChtaXNzaW5nIHRoZSBwcmUtZXhpc3RpbmcgZW50cmllcykgYW5kIGdldFBhdGhcbiAgICAvLyBtdXN0IGtlZXAgZmFsbGluZyBiYWNrIHRvIHRoZSBsaW5lYXIgc2NhbiBvbiBgb2Jqc2AuXG4gICAgY29uc3Qgb2JqSW5kZXggPSBvbGRQYXRocy5vYmpJbmRleCA/IHsuLi5vbGRQYXRocy5vYmpJbmRleH0gOiBudWxsO1xuXG4gICAgbmV3SXRlbXMuZm9yRWFjaCgoY2hpbGQsIGkpID0+IHtcbiAgICAgICAgY3Jhd2xMYXlvdXQoY2hpbGQsIChjLCBpdGVtcGF0aCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaWQgPSBjLnByb3BzICYmIGMucHJvcHMuaWQ7XG4gICAgICAgICAgICBpZiAoIWlkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZnVsbFBhdGggPSBjb25jYXQoc3RhcnRpbmdQYXRoLCBbYXBwZW5kT2Zmc2V0ICsgaV0pLmNvbmNhdChcbiAgICAgICAgICAgICAgICBpdGVtcGF0aFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaWQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGlkKS5zb3J0KCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gcHJvcHMoa2V5cywgaWQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleVN0ciA9IGtleXMuam9pbignLCcpO1xuICAgICAgICAgICAgICAgIChuZXdPYmpJdGVtc1trZXlTdHJdID0gbmV3T2JqSXRlbXNba2V5U3RyXSB8fCBbXSkucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlcyxcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogZnVsbFBhdGhcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc3Ryc1tpZF0gPSBmdWxsUGF0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBPYmplY3Qua2V5cyhuZXdPYmpJdGVtcykuZm9yRWFjaChrZXlTdHIgPT4ge1xuICAgICAgICBvYmpzW2tleVN0cl0gPSBjb25jYXQob2Jqc1trZXlTdHJdIHx8IFtdLCBuZXdPYmpJdGVtc1trZXlTdHJdKTtcbiAgICAgICAgaWYgKG9iakluZGV4KSB7XG4gICAgICAgICAgICBjb25zdCBtYXAgPSB7Li4uKG9iakluZGV4W2tleVN0cl0gfHwge30pfTtcbiAgICAgICAgICAgIG5ld09iakl0ZW1zW2tleVN0cl0uZm9yRWFjaCgoe3ZhbHVlcywgcGF0aDogcH0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBrID0gdmFsdWVzS2V5KHZhbHVlcyk7XG4gICAgICAgICAgICAgICAgaWYgKCEoayBpbiBtYXApKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hcFtrXSA9IHA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBvYmpJbmRleFtrZXlTdHJdID0gbWFwO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBzdHJzLFxuICAgICAgICBvYmpzLFxuICAgICAgICAuLi4ob2JqSW5kZXggPyB7b2JqSW5kZXh9IDoge30pLFxuICAgICAgICBldmVudHM6IG9sZFBhdGhzLmV2ZW50c1xuICAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYXRoKHBhdGhzLCBpZCkge1xuICAgIGlmICh0eXBlb2YgaWQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhpZCkuc29ydCgpO1xuICAgICAgICBjb25zdCBrZXlTdHIgPSBrZXlzLmpvaW4oJywnKTtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gcHJvcHMoa2V5cywgaWQpO1xuICAgICAgICAvLyBPKDEpIGV4YWN0IGxvb2t1cCB3aGVuIHRoZSB0YWJsZSBjYXJyaWVzIGFuIGluZGV4IChhbHdheXMsIG9uY2UgaXRcbiAgICAgICAgLy8gaGFzIGJlZW4gdGhyb3VnaCBjb21wdXRlUGF0aHMvYXBwZW5kUGF0aHMpLiBBIHByZXNlbnQgaW5kZXggaXNcbiAgICAgICAgLy8gY29tcGxldGUsIHNvIGEgbWlzcyBtZWFucyB0aGUgaWQgZ2VudWluZWx5IGlzbid0IG9uIHRoZSBwYWdlLlxuICAgICAgICBpZiAocGF0aHMub2JqSW5kZXgpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hcCA9IHBhdGhzLm9iakluZGV4W2tleVN0cl07XG4gICAgICAgICAgICByZXR1cm4gKG1hcCAmJiBtYXBbdmFsdWVzS2V5KHZhbHVlcyldKSB8fCBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBrZXlQYXRocyA9IHBhdGhzLm9ianNba2V5U3RyXTtcbiAgICAgICAgaWYgKCFrZXlQYXRocykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhdGhPYmogPSBmaW5kKHByb3BFcSh2YWx1ZXMsICd2YWx1ZXMnKSwga2V5UGF0aHMpO1xuICAgICAgICByZXR1cm4gcGF0aE9iaiAmJiBwYXRoT2JqLnBhdGg7XG4gICAgfVxuICAgIHJldHVybiBwYXRocy5zdHJzW2lkXTtcbn1cbiIsImltcG9ydCB7Y29uY2F0LCBoYXMsIHBhdGgsIHR5cGUsIGZpbmRJbmRleCwgaW5jbHVkZXMsIHNsaWNlfSBmcm9tICdyYW1kYSc7XG5cbi8qXG4gKiByZXF1ZXN0c19wYXRobmFtZV9wcmVmaXggaXMgdGhlIG5ldyBjb25maWcgcGFyYW1ldGVyIGludHJvZHVjZWQgaW5cbiAqIGRhc2g9PTAuMTguMC4gVGhlIHByZXZpb3VzIHZlcnNpb25zIGp1c3QgaGFkIHVybF9iYXNlX3BhdGhuYW1lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cmxCYXNlKGNvbmZpZykge1xuICAgIGNvbnN0IGhhc1VybEJhc2UgPSBoYXMoJ3VybF9iYXNlX3BhdGhuYW1lJywgY29uZmlnKTtcbiAgICBjb25zdCBoYXNSZXFQcmVmaXggPSBoYXMoJ3JlcXVlc3RzX3BhdGhuYW1lX3ByZWZpeCcsIGNvbmZpZyk7XG4gICAgaWYgKHR5cGUoY29uZmlnKSAhPT0gJ09iamVjdCcgfHwgKCFoYXNVcmxCYXNlICYmICFoYXNSZXFQcmVmaXgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBcbiAgICAgICAgICAgIFRyeWluZyB0byBtYWtlIGFuIEFQSSByZXF1ZXN0IGJ1dCBuZWl0aGVyXG4gICAgICAgICAgICBcInVybF9iYXNlX3BhdGhuYW1lXCIgbm9yIFwicmVxdWVzdHNfcGF0aG5hbWVfcHJlZml4XCJcbiAgICAgICAgICAgIGlzIGluIFxcYGNvbmZpZ1xcYC4gXFxgY29uZmlnXFxgIGlzOiBgLFxuICAgICAgICAgICAgY29uZmlnXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgYmFzZSA9IGhhc1JlcVByZWZpeFxuICAgICAgICA/IGNvbmZpZy5yZXF1ZXN0c19wYXRobmFtZV9wcmVmaXhcbiAgICAgICAgOiBjb25maWcudXJsX2Jhc2VfcGF0aG5hbWU7XG5cbiAgICByZXR1cm4gYmFzZS5jaGFyQXQoYmFzZS5sZW5ndGggLSAxKSA9PT0gJy8nID8gYmFzZSA6IGJhc2UgKyAnLyc7XG59XG5cbmNvbnN0IHByb3BzQ2hpbGRyZW4gPSBbJ3Byb3BzJywgJ2NoaWxkcmVuJ107XG5cbi8vIGNyYXdsIGEgbGF5b3V0IG9iamVjdCBvciBjaGlsZHJlbiBhcnJheSwgYXBwbHkgYSBmdW5jdGlvbiBvbiBldmVyeSBvYmplY3RcbmV4cG9ydCBjb25zdCBjcmF3bExheW91dCA9IChcbiAgICBvYmplY3QsXG4gICAgZnVuYyxcbiAgICBjdXJyZW50UGF0aCA9IFtdLFxuICAgIGV4dHJhUGF0aCA9IHVuZGVmaW5lZFxuKSA9PiB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqZWN0KSkge1xuICAgICAgICAvLyBjaGlsZHJlbiBhcnJheVxuICAgICAgICBvYmplY3QuZm9yRWFjaCgoY2hpbGQsIGkpID0+IHtcbiAgICAgICAgICAgIGlmIChleHRyYVBhdGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvYmpPZiA9IGZpbmRJbmRleChwID0+IGluY2x1ZGVzKCd7fScsIHApLCBleHRyYVBhdGgpO1xuICAgICAgICAgICAgICAgIGlmIChvYmpPZiAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZnJvbnQgPSBzbGljZSgwLCBvYmpPZiwgZXh0cmFQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFjayA9IHNsaWNlKG9iak9mLCBleHRyYVBhdGgubGVuZ3RoLCBleHRyYVBhdGgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZnJvbnQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjcmF3bExheW91dChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoKGZyb250LCBjaGlsZCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25jYXQoY3VycmVudFBhdGgsIGNvbmNhdChbaV0sIGZyb250KSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja1xuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhY2tQYXRoID0gYmFja1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAocCA9PiBwLnJlcGxhY2UoJ3t9JywgJycpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoZSA9PiBlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaGlsZE9iaixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZFBhdGggPSBjb25jYXQoW2ldLCBiYWNrUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmFja1BhdGgubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRPYmogPSBwYXRoKGJhY2tQYXRoLCBjaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkT2JqID0gY2hpbGQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBjaGlsZE9iaikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY2hpbGRPYmpba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmF3bExheW91dChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmNhdChjdXJyZW50UGF0aCwgY2hpbGRQYXRoLmNvbmNhdChba2V5XSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNyYXdsTGF5b3V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aChleHRyYVBhdGgsIGNoaWxkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25jYXQoY3VycmVudFBhdGgsIGNvbmNhdChbaV0sIGV4dHJhUGF0aCkpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjcmF3bExheW91dChjaGlsZCwgZnVuYywgY3VycmVudFBhdGguY29uY2F0KGkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh0eXBlKG9iamVjdCkgPT09ICdPYmplY3QnKSB7XG4gICAgICAgIGZ1bmMob2JqZWN0LCBjdXJyZW50UGF0aCk7XG5cbiAgICAgICAgLy8gSG90IHBhdGg6IGV2ZXJ5IGNvbXBvbmVudCBoaXRzIHRoaXMgb24gZXZlcnkgY3Jhd2wgKHBhdGggcmVjb21wdXRlLFxuICAgICAgICAvLyBjYWxsYmFjayBnYXRoZXIpLiBEaXJlY3QgYWNjZXNzIGF2b2lkcyByYW1kYSdzIGN1cnJpZWQgYHBhdGhgL1xuICAgICAgICAvLyBgcGF0aE9yYCBkaXNwYXRjaCAoYW5kIHRoZSBgX2lzUGxhY2Vob2xkZXJgIGNoZWNrcyB0aGV5IGRvKSBwZXIgbm9kZS5cbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBvYmplY3QucHJvcHMgJiYgb2JqZWN0LnByb3BzLmNoaWxkcmVuO1xuICAgICAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld1BhdGggPSBjdXJyZW50UGF0aC5jb25jYXQocHJvcHNDaGlsZHJlbik7XG4gICAgICAgICAgICBjcmF3bExheW91dChjaGlsZHJlbiwgZnVuYywgbmV3UGF0aCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjcCA9IHdpbmRvdy5fX2Rhc2hwcml2YXRlX2NoaWxkcmVuUHJvcHM7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuUHJvcHMgPVxuICAgICAgICAgICAgKGNwICYmIGNwW29iamVjdC5uYW1lc3BhY2VdICYmIGNwW29iamVjdC5uYW1lc3BhY2VdW29iamVjdC50eXBlXSkgfHxcbiAgICAgICAgICAgIFtdO1xuICAgICAgICBjaGlsZHJlblByb3BzLmZvckVhY2goY2hpbGRyZW5Qcm9wID0+IHtcbiAgICAgICAgICAgIGlmIChjaGlsZHJlblByb3AuaW5jbHVkZXMoJ1tdJykpIHtcbiAgICAgICAgICAgICAgICBsZXQgW2Zyb250UGF0aCwgYmFja1BhdGhdID0gY2hpbGRyZW5Qcm9wXG4gICAgICAgICAgICAgICAgICAgIC5zcGxpdCgnW10nKVxuICAgICAgICAgICAgICAgICAgICAubWFwKHAgPT4gcC5zcGxpdCgnLicpLmZpbHRlcihlID0+IGUpKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGZyb250ID0gY29uY2F0KFsncHJvcHMnXSwgZnJvbnRQYXRoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBiYXNlUGF0aCA9IGNvbmNhdChjdXJyZW50UGF0aCwgZnJvbnQpO1xuICAgICAgICAgICAgICAgIGNyYXdsTGF5b3V0KHBhdGgoZnJvbnQsIG9iamVjdCksIGZ1bmMsIGJhc2VQYXRoLCBiYWNrUGF0aCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlblByb3AuaW5jbHVkZXMoJ3t9JykpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3BhdGggPSBjaGlsZHJlblByb3Auc3BsaXQoJy4nKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZnJvbnRQYXRoID0gW107XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhY2tQYXRoID0gW107XG4gICAgICAgICAgICAgICAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3BhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1clBhdGggPSBvcGF0aFtpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQgJiYgY3VyUGF0aC5pbmNsdWRlcygne30nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9udFBhdGgucHVzaChjdXJQYXRoLnJlcGxhY2UoJ3t9JywgJycpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tQYXRoLnB1c2goY3VyUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbnRQYXRoLnB1c2goY3VyUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld1BhdGggPSBjb25jYXQoY3VycmVudFBhdGgsIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wcycsXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5mcm9udFBhdGhcbiAgICAgICAgICAgICAgICAgICAgXSk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb1ZhbHVlID0gcGF0aChbJ3Byb3BzJywgLi4uZnJvbnRQYXRoXSwgb2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9WYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IG9WYWx1ZVtrZXldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiYWNrUGF0aC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Jhd2xMYXlvdXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoKGJhY2tQYXRoLCB2YWx1ZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uY2F0KG5ld1BhdGgsIFtrZXksIC4uLmJhY2tQYXRoXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmF3bExheW91dCh2YWx1ZSwgZnVuYywgWy4uLm5ld1BhdGgsIGtleV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld1BhdGggPSBjb25jYXQoY3VycmVudFBhdGgsIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wcycsXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5jaGlsZHJlblByb3Auc3BsaXQoJy4nKVxuICAgICAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICAgICAgY3Jhd2xMYXlvdXQoXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoKFsncHJvcHMnLCAuLi5jaGlsZHJlblByb3Auc3BsaXQoJy4nKV0sIG9iamVjdCksXG4gICAgICAgICAgICAgICAgICAgICAgICBmdW5jLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGF0aFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufTtcblxuLy8gVGhlcmUgYXJlIHBhY2thZ2VzIGZvciB0aGlzIGJ1dCBpdCdzIHNpbXBsZSBlbm91Z2gsIEkganVzdFxuLy8gYWRhcHRlZCBpdCBmcm9tIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL211ZGdlLzU4MzAzODJcbmV4cG9ydCBjbGFzcyBFdmVudEVtaXR0ZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLl9ldiA9IHt9O1xuICAgIH1cbiAgICBvbihldmVudCwgbGlzdGVuZXIpIHtcbiAgICAgICAgY29uc3QgZXZlbnRzID0gKHRoaXMuX2V2W2V2ZW50XSA9IHRoaXMuX2V2W2V2ZW50XSB8fCBbXSk7XG4gICAgICAgIGV2ZW50cy5wdXNoKGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHRoaXMucmVtb3ZlTGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKTtcbiAgICB9XG4gICAgcmVtb3ZlTGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKSB7XG4gICAgICAgIGNvbnN0IGV2ZW50cyA9IHRoaXMuX2V2W2V2ZW50XTtcbiAgICAgICAgaWYgKGV2ZW50cykge1xuICAgICAgICAgICAgY29uc3QgaWR4ID0gZXZlbnRzLmluZGV4T2YobGlzdGVuZXIpO1xuICAgICAgICAgICAgaWYgKGlkeCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgZXZlbnRzLnNwbGljZShpZHgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGVtaXQoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgICAgICAgY29uc3QgZXZlbnRzID0gdGhpcy5fZXZbZXZlbnRdO1xuICAgICAgICBpZiAoZXZlbnRzKSB7XG4gICAgICAgICAgICBldmVudHMuZm9yRWFjaChsaXN0ZW5lciA9PiBsaXN0ZW5lci5hcHBseSh0aGlzLCBhcmdzKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgb25jZShldmVudCwgbGlzdGVuZXIpIHtcbiAgICAgICAgY29uc3QgcmVtb3ZlID0gdGhpcy5vbihldmVudCwgKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICAgIHJlbW92ZSgpO1xuICAgICAgICAgICAgbGlzdGVuZXIuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsIi8qXG4gKiBDb3BpZWQgb3V0IG9mIHByb3AtdHlwZXMgYW5kIG1vZGlmaWVkIC0gaW5zcGlyZWQgYnkgY2hlY2stcHJvcC10eXBlcywgYnV0XG4gKiBzaW1wbGlmaWVkIGFuZCB0d2Vha2VkIHRvIG91ciBuZWVkczogd2UgZG9uJ3QgbmVlZCB0aGUgTk9ERV9FTlYgY2hlY2ssXG4gKiB3ZSByZXBvcnQgYWxsIGVycm9ycywgbm90IGp1c3QgdGhlIGZpcnN0IG9uZSwgYW5kIHdlIGRvbid0IG5lZWQgdGhlIHRocm93aW5nXG4gKiB2YXJpYW50IGBhc3NlcnRQcm9wVHlwZXNgLlxuICovXG5pbXBvcnQgUmVhY3RQcm9wVHlwZXNTZWNyZXQgZnJvbSAncHJvcC10eXBlcy9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQnO1xuXG4vKipcbiAqIEFzc2VydCB0aGF0IHRoZSB2YWx1ZXMgbWF0Y2ggd2l0aCB0aGUgdHlwZSBzcGVjcy5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gdHlwZVNwZWNzIE1hcCBvZiBuYW1lIHRvIGEgUmVhY3RQcm9wVHlwZVxuICogQHBhcmFtIHtvYmplY3R9IHZhbHVlcyBSdW50aW1lIHZhbHVlcyB0aGF0IG5lZWQgdG8gYmUgdHlwZS1jaGVja2VkXG4gKiBAcGFyYW0ge3N0cmluZ30gbG9jYXRpb24gZS5nLiBcInByb3BcIiwgXCJjb250ZXh0XCIsIFwiY2hpbGQgY29udGV4dFwiXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tcG9uZW50TmFtZSBOYW1lIG9mIHRoZSBjb21wb25lbnQgZm9yIGVycm9yIG1lc3NhZ2VzLlxuICogQHBhcmFtIHs/RnVuY3Rpb259IGdldFN0YWNrIFJldHVybnMgdGhlIGNvbXBvbmVudCBzdGFjay5cbiAqIEByZXR1cm4ge3N0cmluZ30gQW55IGVycm9yIG1lc3NhZ2UgcmVzdWx0aW5nIGZyb20gY2hlY2tpbmcgdGhlIHR5cGVzXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNoZWNrUHJvcFR5cGVzKFxuICAgIHR5cGVTcGVjcyxcbiAgICB2YWx1ZXMsXG4gICAgbG9jYXRpb24sXG4gICAgY29tcG9uZW50TmFtZSxcbiAgICBnZXRTdGFjayA9IG51bGxcbikge1xuICAgIGNvbnN0IGVycm9ycyA9IFtdO1xuICAgIGZvciAoY29uc3QgdHlwZVNwZWNOYW1lIGluIHR5cGVTcGVjcykge1xuICAgICAgICBpZiAodHlwZVNwZWNzLmhhc093blByb3BlcnR5KHR5cGVTcGVjTmFtZSkpIHtcbiAgICAgICAgICAgIGxldCBlcnJvcjtcbiAgICAgICAgICAgIC8vIFByb3AgdHlwZSB2YWxpZGF0aW9uIG1heSB0aHJvdy4gSW4gY2FzZSB0aGV5IGRvLCB3ZSBkb24ndCB3YW50IHRvXG4gICAgICAgICAgICAvLyBmYWlsIHRoZSByZW5kZXIgcGhhc2Ugd2hlcmUgaXQgZGlkbid0IGZhaWwgYmVmb3JlLiBTbyB3ZSBsb2cgaXQuXG4gICAgICAgICAgICAvLyBBZnRlciB0aGVzZSBoYXZlIGJlZW4gY2xlYW5lZCB1cCwgd2UnbGwgbGV0IHRoZW0gdGhyb3cuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBhbiBpbnZhcmlhbnQgdGhhdCBnZXRzIGNhdWdodC4gSXQncyB0aGUgc2FtZVxuICAgICAgICAgICAgICAgIC8vIGJlaGF2aW9yIGFzIHdpdGhvdXQgdGhpcyBzdGF0ZW1lbnQgZXhjZXB0IHdpdGggYSBiZXR0ZXIgbWVzc2FnZS5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yID0gRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAoY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzogJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgdHlwZSBgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZVNwZWNOYW1lICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYCBpcyBpbnZhbGlkOyAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXQgbXVzdCBiZSBhIGZ1bmN0aW9uLCB1c3VhbGx5IGZyb20gdGhlIGBwcm9wLXR5cGVzYCBwYWNrYWdlLCBidXQgcmVjZWl2ZWQgYCcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2AuJ1xuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBlcnJvci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yID0gdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0oXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlU3BlY05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgUmVhY3RQcm9wVHlwZXNTZWNyZXRcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgICAgICAgIGVycm9yID0gZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXJyb3IgJiYgIShlcnJvciBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAoY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAnOiB0eXBlIHNwZWNpZmljYXRpb24gb2YgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiArXG4gICAgICAgICAgICAgICAgICAgICAgICAnIGAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVTcGVjTmFtZSArXG4gICAgICAgICAgICAgICAgICAgICAgICAnYCBpcyBpbnZhbGlkOyB0aGUgdHlwZSBjaGVja2VyICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2Z1bmN0aW9uIG11c3QgcmV0dXJuIGBudWxsYCBvciBhbiBgRXJyb3JgIGJ1dCByZXR1cm5lZCBhICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIGVycm9yICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcuICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1lvdSBtYXkgaGF2ZSBmb3Jnb3R0ZW4gdG8gcGFzcyBhbiBhcmd1bWVudCB0byB0aGUgdHlwZSBjaGVja2VyICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2NyZWF0b3IgKGFycmF5T2YsIGluc3RhbmNlT2YsIG9iamVjdE9mLCBvbmVPZiwgb25lT2ZUeXBlLCBhbmQgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnc2hhcGUgYWxsIHJlcXVpcmUgYW4gYXJndW1lbnQpLidcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICB2YXIgc3RhY2sgPSAoZ2V0U3RhY2sgJiYgZ2V0U3RhY2soKSkgfHwgJyc7XG5cbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgJ0ZhaWxlZCAnICsgbG9jYXRpb24gKyAnIHR5cGU6ICcgKyBlcnJvci5tZXNzYWdlICsgc3RhY2tcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBlcnJvcnMuam9pbignXFxuXFxuJyk7XG59XG4iLCJpbXBvcnQge2Nvbm5lY3R9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuXG5mdW5jdGlvbiBMb2FkaW5nKHByb3BzKSB7XG4gICAgaWYgKHByb3BzLmlzTG9hZGluZykge1xuICAgICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9J19kYXNoLWxvYWRpbmctY2FsbGJhY2snIC8+O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuTG9hZGluZy5wcm9wVHlwZXMgPSB7XG4gICAgaXNMb2FkaW5nOiBQcm9wVHlwZXMuYm9vbC5pc1JlcXVpcmVkXG59O1xuXG5leHBvcnQgZGVmYXVsdCBjb25uZWN0KHN0YXRlID0+ICh7XG4gICAgaXNMb2FkaW5nOiBzdGF0ZS5pc0xvYWRpbmdcbn0pKShMb2FkaW5nKTtcbiIsImltcG9ydCB7XG4gICAgY29tcGFyYXRvcixcbiAgICBlcXVhbHMsXG4gICAgZm9yRWFjaCxcbiAgICBoYXMsXG4gICAgaXNFbXB0eSxcbiAgICBsdCxcbiAgICBwYXRoLFxuICAgIHBhdGhPcixcbiAgICBzb3J0XG59IGZyb20gJ3JhbWRhJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHtjb25uZWN0fSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgYXBpVGh1bmsgZnJvbSAnLi4vLi4vYWN0aW9ucy9hcGknO1xuXG5jbGFzcyBSZWxvYWRlciBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgICBpZiAocHJvcHMuY29uZmlnLmhvdF9yZWxvYWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHtpbnRlcnZhbCwgbWF4X3JldHJ5fSA9IHByb3BzLmNvbmZpZy5ob3RfcmVsb2FkO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICBpbnRlcnZhbCxcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgaW50ZXJ2YWxJZDogbnVsbCxcbiAgICAgICAgICAgICAgICBwYWNrYWdlczogbnVsbCxcbiAgICAgICAgICAgICAgICBtYXhfcmV0cnlcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgICAgIGRpc2FibGVkOiB0cnVlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3JldHJ5ID0gMDtcbiAgICAgICAgdGhpcy5faGVhZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2hlYWQnKTtcbiAgICAgICAgdGhpcy5jbGVhckludGVydmFsID0gdGhpcy5jbGVhckludGVydmFsLmJpbmQodGhpcyk7XG4gICAgfVxuXG4gICAgY2xlYXJJbnRlcnZhbCgpIHtcbiAgICAgICAgd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5zdGF0ZS5pbnRlcnZhbElkKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7aW50ZXJ2YWxJZDogbnVsbH0pO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMocHJvcHMpIHtcbiAgICAgICAgLypcbiAgICAgICAgICogU2F2ZSB0aGUgbm9uLWxvYWRpbmcgcmVxdWVzdHMgaW4gdGhlIHN0YXRlIGluIG9yZGVyIHRvIGNvbXBhcmVcbiAgICAgICAgICogY3VycmVudCBoYXNoZXMgd2l0aCBwcmV2aW91cyBoYXNoZXMuXG4gICAgICAgICAqIE5vdGUgdGhhdCBpZiB0aGVyZSB3YXNuJ3QgYSBcImxvYWRpbmdcIiBzdGF0ZSBmb3IgdGhlIHJlcXVlc3RzLFxuICAgICAgICAgKiB0aGVuIHdlICBjb3VsZCBzaW1wbHkgY29tcGFyZSBgcHJvcHNgIHdpdGggYHByZXZQcm9wc2AgaW5cbiAgICAgICAgICogYGNvbXBvbmVudERpZFVwZGF0ZWAuXG4gICAgICAgICAqL1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICAhaXNFbXB0eShwcm9wcy5yZWxvYWRSZXF1ZXN0KSAmJlxuICAgICAgICAgICAgcHJvcHMucmVsb2FkUmVxdWVzdC5zdGF0dXMgIT09ICdsb2FkaW5nJ1xuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiB7cmVsb2FkUmVxdWVzdDogcHJvcHMucmVsb2FkUmVxdWVzdH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcywgcHJldlN0YXRlKSB7XG4gICAgICAgIGNvbnN0IHtyZWxvYWRSZXF1ZXN0fSA9IHRoaXMuc3RhdGU7XG4gICAgICAgIGNvbnN0IHtkaXNwYXRjaH0gPSB0aGlzLnByb3BzO1xuXG4gICAgICAgIC8vIEluIHRoZSBiZWdpbm5pbmcsIHJlbG9hZFJlcXVlc3Qgd29uJ3QgYmUgZGVmaW5lZFxuICAgICAgICBpZiAoIXJlbG9hZFJlcXVlc3QpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qXG4gICAgICAgICAqIFdoZW4gcmVsb2FkUmVxdWVzdCBpcyBmaXJzdCBkZWZpbmVkLCBwcmV2U3RhdGUgd29uJ3QgYmUgZGVmaW5lZFxuICAgICAgICAgKiBmb3Igb25lIHJlbmRlciBsb29wLlxuICAgICAgICAgKiBUaGUgZmlyc3QgcmVsb2FkUmVxdWVzdCBkZWZpbmVzIHRoZSBpbml0aWFsL2Jhc2VsaW5lIGhhc2ggLVxuICAgICAgICAgKiBpdCBkb2Vzbid0IHJlcXVpcmUgYSByZWxvYWRcbiAgICAgICAgICovXG4gICAgICAgIGlmICghaGFzKCdyZWxvYWRSZXF1ZXN0JywgcHJldlN0YXRlKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgcmVsb2FkUmVxdWVzdC5zdGF0dXMgPT09IDIwMCAmJlxuICAgICAgICAgICAgcGF0aChbJ2NvbnRlbnQnLCAncmVsb2FkSGFzaCddLCByZWxvYWRSZXF1ZXN0KSAhPT1cbiAgICAgICAgICAgICAgICBwYXRoKFsncmVsb2FkUmVxdWVzdCcsICdjb250ZW50JywgJ3JlbG9hZEhhc2gnXSwgcHJldlN0YXRlKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGZvciBDU1MgKCFjb250ZW50LmhhcmQpIG9yIG5ldyBwYWNrYWdlIGFzc2V0c1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHJlbG9hZFJlcXVlc3QuY29udGVudC5oYXJkIHx8XG4gICAgICAgICAgICAgICAgIWVxdWFscyhcbiAgICAgICAgICAgICAgICAgICAgcmVsb2FkUmVxdWVzdC5jb250ZW50LnBhY2thZ2VzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgcGF0aE9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgW10sXG4gICAgICAgICAgICAgICAgICAgICAgICBbJ3JlbG9hZFJlcXVlc3QnLCAnY29udGVudCcsICdwYWNrYWdlcyddLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJldlN0YXRlXG4gICAgICAgICAgICAgICAgICAgICkubGVuZ3RoXG4gICAgICAgICAgICAgICAgKSB8fFxuICAgICAgICAgICAgICAgICFlcXVhbHMoXG4gICAgICAgICAgICAgICAgICAgIHNvcnQoY29tcGFyYXRvcihsdCksIHJlbG9hZFJlcXVlc3QuY29udGVudC5wYWNrYWdlcyksXG4gICAgICAgICAgICAgICAgICAgIHNvcnQoXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJhdG9yKGx0KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhPcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ3JlbG9hZFJlcXVlc3QnLCAnY29udGVudCcsICdwYWNrYWdlcyddLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZTdGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgLy8gTG9vayBpZiBpdCB3YXMgYSBjc3MgZmlsZS5cbiAgICAgICAgICAgICAgICBsZXQgd2FzX2NzcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBhIG9mIHJlbG9hZFJlcXVlc3QuY29udGVudC5maWxlcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYS5pc19jc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdhc19jc3MgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZXNUb0Rpc2FibGUgPSBbXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VhcmNoIGZvciB0aGUgb2xkIGZpbGUgYnkgeHBhdGguXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpdCA9IGRvY3VtZW50LmV2YWx1YXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAvL2xpbmtbY29udGFpbnMoQGhyZWYsIFwiJHthLnVybH1cIildYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9oZWFkXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5vZGUgPSBpdC5pdGVyYXRlTmV4dCgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobm9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzVG9EaXNhYmxlLnB1c2gobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9IGl0Lml0ZXJhdGVOZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvckVhY2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9PiBuLnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCAnZGlzYWJsZWQnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2Rlc1RvRGlzYWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEubW9kaWZpZWQgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rLmhyZWYgPSBgJHthLnVybH0/bT0ke2EubW9kaWZpZWR9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rLnR5cGUgPSAndGV4dC9jc3MnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmsucmVsID0gJ3N0eWxlc2hlZXQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2hlYWQuYXBwZW5kQ2hpbGQobGluayk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRWxzZSB0aGUgZmlsZSB3YXMgZGVsZXRlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlJ3MgYW5vdGhlciBraW5kIG9mIGZpbGUgaGVyZSBkbyBhIGhhcmQgcmVsb2FkLlxuICAgICAgICAgICAgICAgICAgICAgICAgd2FzX2NzcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCF3YXNfY3NzKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEFzc2V0cyBmaWxlIGhhdmUgY2hhbmdlZFxuICAgICAgICAgICAgICAgICAgICAvLyBvciBhIGNvbXBvbmVudCBsaWIgaGFzIGJlZW4gYWRkZWQvcmVtb3ZlZCAtXG4gICAgICAgICAgICAgICAgICAgIC8vIE11c3QgZG8gYSBoYXJkIHJlbG9hZFxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBCYWNrZW5kIGNvZGUgY2hhbmdlZCAtIGNhbiBkbyBhIHNvZnQgcmVsb2FkIGluIHBsYWNlXG4gICAgICAgICAgICAgICAgZGlzcGF0Y2goe3R5cGU6ICdSRUxPQUQnfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICB0aGlzLnN0YXRlLmludGVydmFsSWQgIT09IG51bGwgJiZcbiAgICAgICAgICAgIHJlbG9hZFJlcXVlc3Quc3RhdHVzID09PSA1MDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fcmV0cnkgPiB0aGlzLnN0YXRlLm1heF9yZXRyeSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJJbnRlcnZhbCgpO1xuICAgICAgICAgICAgICAgIC8vIEludGVncmF0ZSB3aXRoIGRldiB0b29scyB1aT8hXG4gICAgICAgICAgICAgICAgd2luZG93LmFsZXJ0KFxuICAgICAgICAgICAgICAgICAgICBgSG90IHJlbG9hZGluZyBpcyBkaXNhYmxlZCBhZnRlciBmYWlsaW5nICR7dGhpcy5fcmV0cnl9IHRpbWVzLiBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdQbGVhc2UgY2hlY2sgeW91ciBhcHBsaWNhdGlvbiBmb3IgZXJyb3JzLCB0aGVuIHJlZnJlc2ggdGhlIHBhZ2UuJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9yZXRyeSsrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICAgIGNvbnN0IHtkaXNwYXRjaCwgcmVsb2FkUmVxdWVzdH0gPSB0aGlzLnByb3BzO1xuICAgICAgICBjb25zdCB7ZGlzYWJsZWQsIGludGVydmFsfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgIGlmICghZGlzYWJsZWQgJiYgIXRoaXMuc3RhdGUuaW50ZXJ2YWxJZCkge1xuICAgICAgICAgICAgY29uc3QgaW50ZXJ2YWxJZCA9IHdpbmRvdy5zZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gUHJldmVudCByZXF1ZXN0cyBmcm9tIHBpbGluZyB1cCAtIHJlbG9hZGluZyBjYW4gdGFrZVxuICAgICAgICAgICAgICAgIC8vIG1hbnkgc2Vjb25kcyAoMTAtMzApIGFuZCB0aGUgaW50ZXJ2YWwgaXMgM3MgYnkgZGVmYXVsdFxuICAgICAgICAgICAgICAgIGlmIChyZWxvYWRSZXF1ZXN0LnN0YXR1cyAhPT0gJ2xvYWRpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKGFwaVRodW5rKCdfcmVsb2FkLWhhc2gnLCAnR0VUJywgJ3JlbG9hZFJlcXVlc3QnKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgaW50ZXJ2YWwpO1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7aW50ZXJ2YWxJZH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5zdGF0ZS5kaXNhYmxlZCAmJiB0aGlzLnN0YXRlLmludGVydmFsSWQpIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJJbnRlcnZhbCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG5cblJlbG9hZGVyLmRlZmF1bHRQcm9wcyA9IHt9O1xuXG5SZWxvYWRlci5wcm9wVHlwZXMgPSB7XG4gICAgaWQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgY29uZmlnOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIHJlbG9hZFJlcXVlc3Q6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgZGlzcGF0Y2g6IFByb3BUeXBlcy5mdW5jLFxuICAgIGludGVydmFsOiBQcm9wVHlwZXMubnVtYmVyXG59O1xuXG5leHBvcnQgZGVmYXVsdCBjb25uZWN0KFxuICAgIHN0YXRlID0+ICh7XG4gICAgICAgIGNvbmZpZzogc3RhdGUuY29uZmlnLFxuICAgICAgICByZWxvYWRSZXF1ZXN0OiBzdGF0ZS5yZWxvYWRSZXF1ZXN0XG4gICAgfSksXG4gICAgZGlzcGF0Y2ggPT4gKHtkaXNwYXRjaH0pXG4pKFJlbG9hZGVyKTtcbiIsImltcG9ydCB7Y29ubmVjdH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQge3JlZG8sIHVuZG99IGZyb20gJy4uLy4uL2FjdGlvbnMvaW5kZXguanMnO1xuaW1wb3J0ICcuL1Rvb2xiYXIuY3NzJztcblxuZnVuY3Rpb24gVW5jb25uZWN0ZWRUb29sYmFyKHByb3BzKSB7XG4gICAgY29uc3Qge2Rpc3BhdGNoLCBoaXN0b3J5fSA9IHByb3BzO1xuXG4gICAgY29uc3QgdW5kb0xpbmsgPSAoXG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgICBrZXk9J3VuZG9MaW5rJ1xuICAgICAgICAgICAgY2xhc3NOYW1lPSdfZGFzaC11bmRvLXJlZG8tbGluaydcbiAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGRpc3BhdGNoKHVuZG8pfVxuICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nX2Rhc2gtaWNvbi11bmRvJz7ihro8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdfZGFzaC11bmRvLXJlZG8tbGFiZWwnPnVuZG88L2Rpdj5cbiAgICAgICAgPC9zcGFuPlxuICAgICk7XG5cbiAgICBjb25zdCByZWRvTGluayA9IChcbiAgICAgICAgPHNwYW5cbiAgICAgICAgICAgIGtleT0ncmVkb0xpbmsnXG4gICAgICAgICAgICBjbGFzc05hbWU9J19kYXNoLXVuZG8tcmVkby1saW5rJ1xuICAgICAgICAgICAgb25DbGljaz17KCkgPT4gZGlzcGF0Y2gocmVkbyl9XG4gICAgICAgID5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdfZGFzaC1pY29uLXJlZG8nPuKGuzwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J19kYXNoLXVuZG8tcmVkby1sYWJlbCc+cmVkbzwvZGl2PlxuICAgICAgICA8L3NwYW4+XG4gICAgKTtcblxuICAgIHJldHVybiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdfZGFzaC11bmRvLXJlZG8nPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICB7aGlzdG9yeS5wYXN0Lmxlbmd0aCA+IDAgPyB1bmRvTGluayA6IG51bGx9XG4gICAgICAgICAgICAgICAge2hpc3RvcnkuZnV0dXJlLmxlbmd0aCA+IDAgPyByZWRvTGluayA6IG51bGx9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgKTtcbn1cblxuVW5jb25uZWN0ZWRUb29sYmFyLnByb3BUeXBlcyA9IHtcbiAgICBoaXN0b3J5OiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIGRpc3BhdGNoOiBQcm9wVHlwZXMuZnVuY1xufTtcblxuY29uc3QgVG9vbGJhciA9IGNvbm5lY3QoXG4gICAgc3RhdGUgPT4gKHtcbiAgICAgICAgaGlzdG9yeTogc3RhdGUuaGlzdG9yeVxuICAgIH0pLFxuICAgIGRpc3BhdGNoID0+ICh7ZGlzcGF0Y2h9KVxuKShVbmNvbm5lY3RlZFRvb2xiYXIpO1xuXG5leHBvcnQgZGVmYXVsdCBUb29sYmFyO1xuIiwiaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50LCB1c2VTdGF0ZSwgdXNlTWVtbywgdXNlRWZmZWN0LCB1c2VSZWZ9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQge2Nvbm5lY3QsIHVzZVNlbGVjdG9yfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgQ3l0b3NjYXBlIGZyb20gJ2N5dG9zY2FwZSc7XG5pbXBvcnQgQ3l0b3NjYXBlQ29tcG9uZW50IGZyb20gJ3JlYWN0LWN5dG9zY2FwZWpzJztcbmltcG9ydCBkYWdyZSBmcm9tICdjeXRvc2NhcGUtZGFncmUnO1xuaW1wb3J0IGZjb3NlIGZyb20gJ2N5dG9zY2FwZS1mY29zZSc7XG5pbXBvcnQge0pTT05UcmVlfSBmcm9tICdyZWFjdC1qc29uLXRyZWUnO1xuaW1wb3J0IHtrZXlzLCBtZXJnZVJpZ2h0LCBvbWl0LCBwYXRoLCB2YWx1ZXN9IGZyb20gJ3JhbWRhJztcblxuaW1wb3J0IHtnZXRQYXRofSBmcm9tICcuLi8uLi8uLi9hY3Rpb25zL3BhdGhzJztcbmltcG9ydCB7c3RyaW5naWZ5SWR9IGZyb20gJy4uLy4uLy4uL2FjdGlvbnMvZGVwZW5kZW5jaWVzJztcbmltcG9ydCB7b25FcnJvcn0gZnJvbSAnLi4vLi4vLi4vYWN0aW9ucyc7XG5cbmltcG9ydCAnLi9DYWxsYmFja0dyYXBoQ29udGFpbmVyLmNzcyc7XG5pbXBvcnQgc3R5bGVzaGVldCBmcm9tICcuL0NhbGxiYWNrR3JhcGhDb250YWluZXJTdHlsZXNoZWV0JztcbmltcG9ydCB7XG4gICAgdXBkYXRlU2VsZWN0ZWROb2RlLFxuICAgIHVwZGF0ZUNoYW5nZWRQcm9wcyxcbiAgICB1cGRhdGVDYWxsYmFja1xufSBmcm9tICcuL0NhbGxiYWNrR3JhcGhFZmZlY3RzJztcblxuQ3l0b3NjYXBlLnVzZShkYWdyZSk7XG5DeXRvc2NhcGUudXNlKGZjb3NlKTtcblxuLypcbiAqIEdlbmVyYXRlcyBhbGwgdGhlIGVsZW1lbnRzIChub2RlcywgZWRnZXMpIGZvciB0aGUgZGVwZW5kZW5jeSBncmFwaC5cbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVFbGVtZW50cyhncmFwaHMsIHByb2ZpbGUsIGV4dHJhTGlua3MpIHtcbiAgICBjb25zdCBjb25zdW1lZCA9IFtdO1xuICAgIGNvbnN0IGVsZW1lbnRzID0gW107XG4gICAgY29uc3Qgc3RydWN0dXJlID0ge307XG5cbiAgICBmdW5jdGlvbiByZWNvcmROb2RlKGlkLCByYXdQcm9wZXJ0eSkge1xuICAgICAgICBjb25zdCBwcm9wZXJ0eSA9IHJhd1Byb3BlcnR5LnNwbGl0KCdAJylbMF07XG4gICAgICAgIGNvbnN0IGlkU3RyID0gc3RyaW5naWZ5SWQoaWQpO1xuICAgICAgICBjb25zdCBpZFR5cGUgPSB0eXBlb2YgaWQgPT09ICdvYmplY3QnID8gJ3dpbGRjYXJkJyA6ICdjb21wb25lbnQnO1xuXG4gICAgICAgIC8vIGRhZ3JlIGxheW91dCBoYXMgcHJvYmxlbXMgd2l0aCBlZyBgd2lkdGhgIHByb3BlcnR5IC0gc28gcHJlcGVuZCBhbiBYXG4gICAgICAgIGNvbnN0IHBhcmVudElkID0gaWRTdHI7XG4gICAgICAgIGNvbnN0IGNoaWxkSWQgPSBgJHtwYXJlbnRJZH0uWCR7cHJvcGVydHl9YDtcblxuICAgICAgICBpZiAoIWNvbnN1bWVkLmluY2x1ZGVzKHBhcmVudElkKSkge1xuICAgICAgICAgICAgY29uc3VtZWQucHVzaChwYXJlbnRJZCk7XG4gICAgICAgICAgICBlbGVtZW50cy5wdXNoKHtcbiAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBwYXJlbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGlkU3RyLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBpZFR5cGVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHN0cnVjdHVyZVtwYXJlbnRJZF0gPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghY29uc3VtZWQuaW5jbHVkZXMoY2hpbGRJZCkpIHtcbiAgICAgICAgICAgIGNvbnN1bWVkLnB1c2goY2hpbGRJZCk7XG4gICAgICAgICAgICBlbGVtZW50cy5wdXNoKHtcbiAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBjaGlsZElkLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogcHJvcGVydHksXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogcGFyZW50SWQsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdwcm9wZXJ0eSdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHN0cnVjdHVyZVtwYXJlbnRJZF0ucHVzaChjaGlsZElkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjaGlsZElkO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlY29yZEVkZ2Uoc291cmNlLCB0YXJnZXQsIHR5cGUpIHtcbiAgICAgICAgZWxlbWVudHMucHVzaCh7XG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICAgICAgICAgICAgdGFyZ2V0OiB0YXJnZXQsXG4gICAgICAgICAgICAgICAgdHlwZTogdHlwZVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAoZ3JhcGhzLmNhbGxiYWNrcyB8fCBbXSkucmVkdWNlKCh2aXNpYmxlSW5kZXgsIGNhbGxiYWNrKSA9PiB7XG4gICAgICAgIGlmIChjYWxsYmFjay5oaWRkZW4pIHtcbiAgICAgICAgICAgIHJldHVybiB2aXNpYmxlSW5kZXg7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjYiA9IGBfX2Rhc2hfY2FsbGJhY2tfXy4ke2NhbGxiYWNrLm91dHB1dH1gO1xuICAgICAgICBjb25zdCBjYlByb2ZpbGUgPSBwcm9maWxlLmNhbGxiYWNrc1tjYWxsYmFjay5vdXRwdXRdIHx8IHt9O1xuICAgICAgICBjb25zdCBjb3VudCA9IGNiUHJvZmlsZS5jb3VudCB8fCAwO1xuICAgICAgICBjb25zdCB0aW1lID0gY2JQcm9maWxlLnRvdGFsIHx8IDA7XG5cbiAgICAgICAgZWxlbWVudHMucHVzaCh7XG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgaWQ6IGNiLFxuICAgICAgICAgICAgICAgIGxhYmVsOiBgY2FsbGJhY2suJHt2aXNpYmxlSW5kZXh9YCxcbiAgICAgICAgICAgICAgICB0eXBlOiAnY2FsbGJhY2snLFxuICAgICAgICAgICAgICAgIG1vZGU6IGNhbGxiYWNrLmNsaWVudHNpZGVfZnVuY3Rpb24gPyAnY2xpZW50JyA6ICdzZXJ2ZXInLFxuICAgICAgICAgICAgICAgIGNvdW50OiBjb3VudCxcbiAgICAgICAgICAgICAgICB0aW1lOiBjb3VudCA+IDAgPyBNYXRoLnJvdW5kKHRpbWUgLyBjb3VudCkgOiAwLFxuICAgICAgICAgICAgICAgIGxvYWRpbmdTZXQ6IERhdGUubm93KCksXG4gICAgICAgICAgICAgICAgZXJyb3JTZXQ6IERhdGUubm93KClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgY2FsbGJhY2sub3V0cHV0cy5mb3JFYWNoKCh7aWQsIHByb3BlcnR5fSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgbm9kZUlkID0gcmVjb3JkTm9kZShpZCwgcHJvcGVydHkpO1xuICAgICAgICAgICAgcmVjb3JkRWRnZShjYiwgbm9kZUlkLCAnb3V0cHV0Jyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNhbGxiYWNrLmlucHV0cy5mb3JFYWNoKCh7aWQsIHByb3BlcnR5fSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgbm9kZUlkID0gcmVjb3JkTm9kZShpZCwgcHJvcGVydHkpO1xuICAgICAgICAgICAgcmVjb3JkRWRnZShub2RlSWQsIGNiLCAnaW5wdXQnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY2FsbGJhY2suc3RhdGUuZm9yRWFjaCgoe2lkLCBwcm9wZXJ0eX0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGVJZCA9IHJlY29yZE5vZGUoaWQsIHByb3BlcnR5KTtcbiAgICAgICAgICAgIHJlY29yZEVkZ2Uobm9kZUlkLCBjYiwgJ3N0YXRlJyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB2aXNpYmxlSW5kZXggKyAxO1xuICAgIH0sIDApO1xuXG4gICAgLy8gcHVsbCB0b2dldGhlciBwcm9wcyBpbiB0aGUgc2FtZSBjb21wb25lbnRcbiAgICBpZiAoZXh0cmFMaW5rcykge1xuICAgICAgICB2YWx1ZXMoc3RydWN0dXJlKS5mb3JFYWNoKGNoaWxkSWRzID0+IHtcbiAgICAgICAgICAgIGNoaWxkSWRzLmZvckVhY2goY2hpbGRGcm9tID0+IHtcbiAgICAgICAgICAgICAgICBjaGlsZElkcy5mb3JFYWNoKGNoaWxkVG8gPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRGcm9tICE9PSBjaGlsZFRvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRFZGdlKGNoaWxkRnJvbSwgY2hpbGRUbywgJ2hpZGRlbicpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVsZW1lbnRzO1xufVxuXG5mdW5jdGlvbiByZWR1Y2VTdGF0dXMoc3RhdHVzKSB7XG4gICAgaWYgKGtleXMoc3RhdHVzKS5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgcmV0dXJuIHN0YXR1cy5sYXRlc3Q7XG4gICAgfVxuICAgIHJldHVybiBzdGF0dXM7XG59XG5cbmZ1bmN0aW9uIGZsYXR0ZW5PdXRwdXRzKHJlcykge1xuICAgIGNvbnN0IG91dHB1dHMgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGlkU3RyIGluIHJlcykge1xuICAgICAgICBmb3IgKGNvbnN0IHByb3AgaW4gcmVzW2lkU3RyXSkge1xuICAgICAgICAgICAgb3V0cHV0c1tpZFN0ciArICcuJyArIHByb3BdID0gcmVzW2lkU3RyXVtwcm9wXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0cztcbn1cblxuZnVuY3Rpb24gZmxhdHRlbklucHV0cyhpbkFycmF5LCBmaW5hbCkge1xuICAgIChpbkFycmF5IHx8IFtdKS5mb3JFYWNoKGluSXRlbSA9PiB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGluSXRlbSkpIHtcbiAgICAgICAgICAgIGZsYXR0ZW5JbnB1dHMoaW5JdGVtLCBmaW5hbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB7aWQsIHByb3BlcnR5LCB2YWx1ZX0gPSBpbkl0ZW07XG4gICAgICAgICAgICBmaW5hbFtzdHJpbmdpZnlJZChpZCkgKyAnLicgKyBwcm9wZXJ0eV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBmaW5hbDtcbn1cblxuZnVuY3Rpb24gY2xlYW5PdXRwdXRJZChvdXRwdXRJZCkge1xuICAgIHJldHVybiBvdXRwdXRJZFxuICAgICAgICAucmVwbGFjZSgvKF5cXC5cXC58XFwuXFwuJCkvZywgJycpXG4gICAgICAgIC5zcGxpdCgnLi4uJylcbiAgICAgICAgLnJlZHVjZShcbiAgICAgICAgICAgIChhZ2csIG5leHQpID0+XG4gICAgICAgICAgICAgICAgYWdnLmNvbmNhdChcbiAgICAgICAgICAgICAgICAgICAgbmV4dC5yZXBsYWNlKC8oLipcXC4uKikoQC4rKSQvLCAoYSwgYikgPT4gYiArICcgKER1cGxpY2F0ZSknKVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICBbXVxuICAgICAgICApXG4gICAgICAgIC5qb2luKCcuLi4nKTtcbn1cblxuLy8gbGVuKCdfX2Rhc2hfY2FsbGJhY2tfXy4nKVxuY29uc3QgY2JQcmVmaXhMZW4gPSAxODtcblxuY29uc3QgZGFncmVMYXlvdXQgPSB7XG4gICAgbmFtZTogJ2RhZ3JlJyxcbiAgICBwYWRkaW5nOiAxMCxcbiAgICByYW5rZXI6ICd0aWdodC10cmVlJ1xufTtcblxuY29uc3QgZm9yY2VMYXlvdXQgPSB7bmFtZTogJ2Zjb3NlJywgcGFkZGluZzogMTAsIGFuaW1hdGU6IGZhbHNlfTtcblxuY29uc3QgbGF5b3V0cyA9IHtcbiAgICAndG9wLWRvd24nOiB7Li4uZGFncmVMYXlvdXQsIHNwYWNpbmdGYWN0b3I6IDAuOH0sXG4gICAgJ2xlZnQtcmlnaHQnOiB7Li4uZGFncmVMYXlvdXQsIG5vZGVTZXA6IDAsIHJhbmtTZXA6IDgwLCByYW5rRGlyOiAnTFInfSxcbiAgICBmb3JjZTogZm9yY2VMYXlvdXQsXG4gICAgJ2ZvcmNlLWxvb3NlJzogZm9yY2VMYXlvdXRcbn07XG5cbmZ1bmN0aW9uIENhbGxiYWNrR3JhcGgoKSB7XG4gICAgLy8gR3JhYiBpdGVtcyBmcm9tIHRoZSByZWR1eCBzdG9yZS5cbiAgICBjb25zdCBwYXRocyA9IHVzZVNlbGVjdG9yKHN0YXRlID0+IHN0YXRlLnBhdGhzKTtcbiAgICBjb25zdCBsYXlvdXQgPSB1c2VTZWxlY3RvcihzdGF0ZSA9PiBzdGF0ZS5sYXlvdXQpO1xuICAgIGNvbnN0IGdyYXBocyA9IHVzZVNlbGVjdG9yKHN0YXRlID0+IHN0YXRlLmdyYXBocyk7XG4gICAgY29uc3QgcHJvZmlsZSA9IHVzZVNlbGVjdG9yKHN0YXRlID0+IHN0YXRlLnByb2ZpbGUpO1xuICAgIGNvbnN0IGNoYW5nZWQgPSB1c2VTZWxlY3RvcihzdGF0ZSA9PiBzdGF0ZS5jaGFuZ2VkKTtcbiAgICBjb25zdCBsaWZlY3ljbGVTdGF0ZSA9IHVzZVNlbGVjdG9yKHN0YXRlID0+IHN0YXRlLmFwcExpZmVjeWNsZSk7XG5cbiAgICAvLyBLZWVwIHRyYWNrIG9mIGN5dG9zY2FwZSByZWZlcmVuY2UgYW5kIHVzZXIgc2VsZWN0ZWQgaXRlbXMuXG4gICAgY29uc3QgW3NlbGVjdGVkLCBzZXRTZWxlY3RlZF0gPSB1c2VTdGF0ZShudWxsKTtcbiAgICBjb25zdCBbY3l0b3NjYXBlLCBzZXRDeXRvc2NhcGVdID0gdXNlU3RhdGUobnVsbCk7XG5cbiAgICBjb25zdCB7Z3JhcGhMYXlvdXR9ID0gcHJvZmlsZTtcbiAgICBjb25zdCBjaG9zZW5UeXBlID0gZ3JhcGhMYXlvdXQ/Ll9jaG9zZW5UeXBlO1xuICAgIGNvbnN0IGxheW91dFNlbGVjdG9yID0gdXNlUmVmKG51bGwpO1xuICAgIGNvbnN0IFtsYXlvdXRUeXBlLCBzZXRMYXlvdXRUeXBlXSA9IHVzZVN0YXRlKGNob3NlblR5cGUgfHwgJ3RvcC1kb3duJyk7XG5cbiAgICAvLyBHZW5lcmF0ZSBhbmQgbWVtb2l6ZSB0aGUgZWxlbWVudHMuXG4gICAgY29uc3QgZWxlbWVudHMgPSB1c2VNZW1vKFxuICAgICAgICAoKSA9PiBnZW5lcmF0ZUVsZW1lbnRzKGdyYXBocywgcHJvZmlsZSwgbGF5b3V0VHlwZSA9PT0gJ2ZvcmNlJyksXG4gICAgICAgIFtncmFwaHMsIGxheW91dFR5cGVdXG4gICAgKTtcblxuICAgIC8vIEN1c3RvbSBob29rIHRvIG1ha2Ugc3VyZSBjeXRvc2NhcGUgaXMgbG9hZGVkLlxuICAgIGNvbnN0IHVzZUN5dG9zY2FwZUVmZmVjdCA9IChlZmZlY3QsIGNvbmRpdGlvbikgPT4ge1xuICAgICAgICB1c2VFZmZlY3QoXG4gICAgICAgICAgICAoKSA9PiAoY3l0b3NjYXBlICYmIGVmZmVjdChjeXRvc2NhcGUpKSB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgICBjb25kaXRpb25cbiAgICAgICAgKTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gZ2V0Q29tcG9uZW50KGlkKSB7XG4gICAgICAgIC8vIGZvciBub3cgaWdub3JlIHBhdHRlcm4tbWF0Y2hpbmcgSURzXG4gICAgICAgIC8vIHRvIGRvIGJldHRlciB3ZSBtYXkgbmVlZCB0byBzdG9yZSB0aGUgKmFjdHVhbCogSURzIHVzZWQgZm9yIGVhY2hcbiAgICAgICAgLy8gY2FsbGJhY2sgaW52b2NhdGlvbiwgc2luY2UgdGhleSBuZWVkIG5vdCBtYXRjaCB3aGF0J3Mgb24gdGhlIHBhZ2Ugbm93LlxuICAgICAgICBpZiAoaWQuY2hhckF0KDApID09PSAneycpIHtcbiAgICAgICAgICAgIGhhc1BhdHRlcm5zID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaWRQYXRoID0gZ2V0UGF0aChwYXRocywgaWQpO1xuICAgICAgICByZXR1cm4gaWRQYXRoID8gcGF0aChpZFBhdGgsIGxheW91dCkgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0UHJvcFZhbHVlKGRhdGEpIHtcbiAgICAgICAgY29uc3QgcGFyZW50ID0gZ2V0Q29tcG9uZW50KGRhdGEucGFyZW50KTtcbiAgICAgICAgcmV0dXJuIHBhcmVudCA/IHBhcmVudC5wcm9wc1tkYXRhLmxhYmVsXSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRQcmVzZXRMYXlvdXQoe2N5fSkge1xuICAgICAgICBjb25zdCBwb3NpdGlvbnMgPSB7fTtcbiAgICAgICAgY3kubm9kZXMoKS5lYWNoKG4gPT4ge1xuICAgICAgICAgICAgcG9zaXRpb25zW24uaWQoKV0gPSBuLnBvc2l0aW9uKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEhhY2shIFdlJ3JlIG11dGF0aW5nIHRoZSByZWR1eCBzdG9yZSBkaXJlY3RseSBoZXJlLCByYXRoZXIgdGhhblxuICAgICAgICAvLyBkaXNwYXRjaGluZyBhbiBhY3Rpb24sIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0aGlzIHRvIHRyaWdnZXIgYVxuICAgICAgICAvLyByZXJlbmRlciwgd2UganVzdCB3YW50IHRoZSBsYXlvdXQgdG8gcGVyc2lzdCB3aGVuIHRoZSBjYWxsYmFjayBncmFwaFxuICAgICAgICAvLyBpcyByZXJlbmRlcmVkIC0gZWl0aGVyIGJlY2F1c2UgdGhlcmUncyBuZXcgcHJvZmlsZSBpbmZvcm1hdGlvbiB0b1xuICAgICAgICAvLyBkaXNwbGF5IG9yIGJlY2F1c2UgdGhlIGdyYXBoIHdhcyBjbG9zZWQgYW5kIHJlb3BlbmVkLiBUaGUgbGF0dGVyIGlzXG4gICAgICAgIC8vIHRoZSByZWFzb24gd2UncmUgbm90IHVzaW5nIGNvbXBvbmVudCBzdGF0ZSB0byBzdG9yZSB0aGUgbGF5b3V0LlxuICAgICAgICBwcm9maWxlLmdyYXBoTGF5b3V0ID0ge1xuICAgICAgICAgICAgbmFtZTogJ3ByZXNldCcsXG4gICAgICAgICAgICBmaXQ6IGZhbHNlLFxuICAgICAgICAgICAgcG9zaXRpb25zLFxuICAgICAgICAgICAgem9vbTogY3kuem9vbSgpLFxuICAgICAgICAgICAgcGFuOiBjeS5wYW4oKSxcbiAgICAgICAgICAgIF9jaG9zZW5UeXBlOiBsYXlvdXRTZWxlY3Rvci5jdXJyZW50Py52YWx1ZVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIEFkZHMgY2FsbGJhY2tzIG9uY2UgY3ljdG9zY2FwZSBpcyBpbml0aWFsaXplZC5cbiAgICB1c2VDeXRvc2NhcGVFZmZlY3QoXG4gICAgICAgIGN5ID0+IHtcbiAgICAgICAgICAgIGN5dG9zY2FwZS5vbigndGFwJywgJ25vZGUnLCBlID0+IHNldFNlbGVjdGVkKGUudGFyZ2V0KSk7XG4gICAgICAgICAgICBjeXRvc2NhcGUub24oJ3RhcCcsIGUgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlLnRhcmdldCA9PT0gY3kpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0U2VsZWN0ZWQobnVsbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjeXRvc2NhcGUub24oJ3pvb20nLCBzZXRQcmVzZXRMYXlvdXQpO1xuICAgICAgICAgICAgY3l0b3NjYXBlLm9uKCdwYW4nLCBzZXRQcmVzZXRMYXlvdXQpO1xuICAgICAgICAgICAgY3l0b3NjYXBlLm5vZGVzKCkub24oJ3Bvc2l0aW9uJywgc2V0UHJlc2V0TGF5b3V0KTtcbiAgICAgICAgfSxcbiAgICAgICAgW2N5dG9zY2FwZV1cbiAgICApO1xuXG4gICAgLy8gU2V0IG5vZGUgY2xhc3NlcyBvbiBzZWxlY3RlZC5cbiAgICB1c2VDeXRvc2NhcGVFZmZlY3QoXG4gICAgICAgIGN5ID0+IHNlbGVjdGVkICYmIHVwZGF0ZVNlbGVjdGVkTm9kZShjeSwgc2VsZWN0ZWQuZGF0YSgpLmlkKSxcbiAgICAgICAgW3NlbGVjdGVkXVxuICAgICk7XG5cbiAgICAvLyBGbGFzaCBjbGFzc2VzIHdoZW4gcHJvcHMgY2hhbmdlLiBVc2VzIGNoYW5nZWQgYXMgYSB0cmlnZ2VyLiBBbHNvXG4gICAgLy8gZmxhc2ggYWxsIGlucHV0IGVkZ2VzIG9yaWdpbmF0aW5nIGZyb20gdGhpcyBub2RlIGFuZCBoaWdobGlnaHRcbiAgICAvLyB0aGUgc3VidHJlZSB0aGF0IGNvbnRhaW5zIHRoZSBzZWxlY3RlZCBub2RlLlxuICAgIHVzZUN5dG9zY2FwZUVmZmVjdChcbiAgICAgICAgY3kgPT4gY2hhbmdlZCAmJiB1cGRhdGVDaGFuZ2VkUHJvcHMoY3ksIGNoYW5nZWQuaWQsIGNoYW5nZWQucHJvcHMpLFxuICAgICAgICBbY2hhbmdlZF1cbiAgICApO1xuXG4gICAgLy8gVXBkYXRlIGNhbGxiYWNrcyBmcm9tIHByb2ZpbGluZyBpbmZvcm1hdGlvbi5cbiAgICB1c2VDeXRvc2NhcGVFZmZlY3QoXG4gICAgICAgIGN5ID0+XG4gICAgICAgICAgICBwcm9maWxlLnVwZGF0ZWQuZm9yRWFjaChjYiA9PlxuICAgICAgICAgICAgICAgIHVwZGF0ZUNhbGxiYWNrKGN5LCBjYiwgcHJvZmlsZS5jYWxsYmFja3NbY2JdKVxuICAgICAgICAgICAgKSxcbiAgICAgICAgW3Byb2ZpbGUudXBkYXRlZF1cbiAgICApO1xuXG4gICAgaWYgKGxpZmVjeWNsZVN0YXRlICE9PSAnSFlEUkFURUQnKSB7XG4gICAgICAgIC8vIElmIHdlIGdldCBoZXJlIHRvbyBlYXJseSAtIG1vc3QgbGlrZWx5IGR1cmluZyBob3QgcmVsb2FkaW5nIC0gdGhlblxuICAgICAgICAvLyB3ZSBuZWVkIHRvIGJhaWwgb3V0IGFuZCB3YWl0IGZvciB0aGUgZnVsbCBzdGF0ZSB0byBiZSBhdmFpbGFibGVcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdkYXNoLWNhbGxiYWNrLWRhZy0tY29udGFpbmVyJz5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1jYWxsYmFjay1kYWctLW1lc3NhZ2UnPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2PldhaXRpbmcgZm9yIGFwcCB0byBiZSByZWFkeS4uLjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRklYTUU6IE1vdmUgdG8gYSBuZXcgY29tcG9uZW50P1xuICAgIC8vIEdlbmVyYXRlIHRoZSBlbGVtZW50IGludHJvc3BlY3Rpb24gZGF0YS5cbiAgICBsZXQgZWxlbWVudE5hbWUgPSAnJztcbiAgICBsZXQgZWxlbWVudEluZm8gPSB7fTtcbiAgICBsZXQgaGFzUGF0dGVybnMgPSBmYWxzZTtcblxuICAgIGlmIChzZWxlY3RlZCkge1xuICAgICAgICBjb25zdCBkYXRhID0gc2VsZWN0ZWQuZGF0YSgpO1xuXG4gICAgICAgIHN3aXRjaCAoZGF0YS50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdjb21wb25lbnQnOiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdCA9IG9taXQoWydpZCddLCBnZXRDb21wb25lbnQoZGF0YS5pZCk/LnByb3BzKTtcbiAgICAgICAgICAgICAgICBlbGVtZW50SW5mbyA9IHJlc3Q7XG4gICAgICAgICAgICAgICAgZWxlbWVudE5hbWUgPSBkYXRhLmlkO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlICdwcm9wZXJ0eSc6IHtcbiAgICAgICAgICAgICAgICBlbGVtZW50TmFtZSA9IGRhdGEucGFyZW50O1xuICAgICAgICAgICAgICAgIGVsZW1lbnRJbmZvW2RhdGEubGFiZWxdID0gZ2V0UHJvcFZhbHVlKGRhdGEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBjYWxsYmFja1xuICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIGVsZW1lbnRJbmZvLnR5cGUgPSBkYXRhLm1vZGU7XG5cbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdWlkIGFuZCBzZXQgcHJvZmlsZS5cbiAgICAgICAgICAgICAgICBjb25zdCBjYWxsYmFja091dHB1dElkID0gZGF0YS5pZC5zbGljZShjYlByZWZpeExlbik7XG4gICAgICAgICAgICAgICAgZWxlbWVudE5hbWUgPSBjbGVhbk91dHB1dElkKGNhbGxiYWNrT3V0cHV0SWQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNiUHJvZmlsZSA9IHByb2ZpbGUuY2FsbGJhY2tzW2NhbGxiYWNrT3V0cHV0SWRdO1xuICAgICAgICAgICAgICAgIGlmIChjYlByb2ZpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICAgICAgICAgICAgY291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXR3b3JrLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLFxuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWwsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVcbiAgICAgICAgICAgICAgICAgICAgfSA9IGNiUHJvZmlsZTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhdmcgPSB2ID0+IE1hdGgucm91bmQodiAvIChjb3VudCB8fCAxKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudEluZm9bJ2NhbGwgY291bnQnXSA9IGNvdW50O1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50SW5mby5zdGF0dXMgPSByZWR1Y2VTdGF0dXMoc3RhdHVzKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0aW1pbmcgPSAoZWxlbWVudEluZm9bJ3RpbWUgKGF2ZyBtaWxsaXNlY29uZHMpJ10gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbDogYXZnKHRvdGFsKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGU6IGF2Zyhjb21wdXRlKVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEubW9kZSA9PT0gJ3NlcnZlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbWluZy5uZXR3b3JrID0gYXZnKG5ldHdvcmsudGltZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJbmZvWydkYXRhIHRyYW5zZmVyIChhdmcgYnl0ZXMpJ10gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWQ6IGF2ZyhuZXR3b3JrLmRvd25sb2FkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGxvYWQ6IGF2ZyhuZXR3b3JrLnVwbG9hZClcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcmVzb3VyY2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aW1pbmdbJ3VzZXI6ICcgKyBrZXldID0gYXZnKHJlc291cmNlc1trZXldKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJbmZvLm91dHB1dHMgPSBmbGF0dGVuT3V0cHV0cyhyZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50SW5mby5pbnB1dHMgPSBmbGF0dGVuSW5wdXRzKGlucHV0cywge30pO1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50SW5mby5zdGF0ZSA9IGZsYXR0ZW5JbnB1dHMoc3RhdGUsIHt9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50SW5mb1snY2FsbCBjb3VudCddID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjeUxheW91dCA9XG4gICAgICAgIGNob3NlblR5cGUgPT09IGxheW91dFR5cGVcbiAgICAgICAgICAgID8gZ3JhcGhMYXlvdXRcbiAgICAgICAgICAgIDogbWVyZ2VSaWdodChsYXlvdXRzW2xheW91dFR5cGVdLCB7cmVhZHk6IHNldFByZXNldExheW91dH0pO1xuXG4gICAgcmV0dXJuIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtY2FsbGJhY2stZGFnLS1jb250YWluZXInPlxuICAgICAgICAgICAgPEN5dG9zY2FwZUNvbXBvbmVudFxuICAgICAgICAgICAgICAgIHN0eWxlPXt7d2lkdGg6ICcxMDAlJywgaGVpZ2h0OiAnMTAwJSd9fVxuICAgICAgICAgICAgICAgIGN5PXtzZXRDeXRvc2NhcGV9XG4gICAgICAgICAgICAgICAgZWxlbWVudHM9e2VsZW1lbnRzfVxuICAgICAgICAgICAgICAgIGxheW91dD17Y3lMYXlvdXR9XG4gICAgICAgICAgICAgICAgc3R5bGVzaGVldD17c3R5bGVzaGVldH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICB7c2VsZWN0ZWQgPyAoXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtY2FsbGJhY2stZGFnLS1pbmZvJz5cbiAgICAgICAgICAgICAgICAgICAge2hhc1BhdHRlcm5zID8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmZvIGlzbid0IHN1cHBvcnRlZCBmb3IgcGF0dGVybi1tYXRjaGluZyBJRHMgYXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIHRpbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgICAgICAgICAgPEpTT05UcmVlXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhPXtlbGVtZW50SW5mb31cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lPSdzdW1tZXJmcnVpdCdcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsUmVuZGVyZXI9e19rZXlzID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2tleXMubGVuZ3RoID09PSAxID8gZWxlbWVudE5hbWUgOiBfa2V5c1swXVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SXRlbVN0cmluZz17KHR5cGUsIGRhdGEsIGl0ZW1UeXBlKSA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e2l0ZW1UeXBlfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRFeHBhbmROb2RlPXsoa2V5TmFtZSwgZGF0YSwgbGV2ZWwpID0+IGxldmVsIDwgMX1cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0nZGFzaC1jYWxsYmFjay1kYWctLWxheW91dFNlbGVjdG9yJ1xuICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtlID0+IHNldExheW91dFR5cGUoZS50YXJnZXQudmFsdWUpfVxuICAgICAgICAgICAgICAgIHZhbHVlPXtsYXlvdXRUeXBlfVxuICAgICAgICAgICAgICAgIHJlZj17bGF5b3V0U2VsZWN0b3J9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge2tleXMobGF5b3V0cykubWFwKGsgPT4gKFxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPXtrfSBrZXk9e2t9PlxuICAgICAgICAgICAgICAgICAgICAgICAge2t9XG4gICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICk7XG59XG5cbkNhbGxiYWNrR3JhcGgucHJvcFR5cGVzID0ge307XG5cbmNsYXNzIFVuY29ubmVjdGVkQ2FsbGJhY2tHcmFwaENvbnRhaW5lciBleHRlbmRzIENvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgICB0aGlzLnN0YXRlID0ge2hhc0Vycm9yOiBmYWxzZX07XG4gICAgfVxuXG4gICAgc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcihfKSB7XG4gICAgICAgIHJldHVybiB7aGFzRXJyb3I6IHRydWV9O1xuICAgIH1cblxuICAgIGNvbXBvbmVudERpZENhdGNoKGVycm9yLCBpbmZvKSB7XG4gICAgICAgIGNvbnN0IHtkaXNwYXRjaH0gPSB0aGlzLnByb3BzO1xuICAgICAgICBkaXNwYXRjaChcbiAgICAgICAgICAgIG9uRXJyb3Ioe1xuICAgICAgICAgICAgICAgIG15SUQ6IHRoaXMuc3RhdGUubXlJRCxcbiAgICAgICAgICAgICAgICB0eXBlOiAnZnJvbnRFbmQnLFxuICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgIGluZm9cbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS5oYXNFcnJvciA/IChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdkYXNoLWNhbGxiYWNrLWRhZy0tY29udGFpbmVyJz5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1jYWxsYmFjay1kYWctLW1lc3NhZ2UnPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2Pk9vcHMhIFRoZSBjYWxsYmFjayBncmFwaCB0aHJldyBhbiBlcnJvci48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5DaGVjayB0aGUgZXJyb3IgbGlzdCBmb3IgZGV0YWlscy48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICApIDogKFxuICAgICAgICAgICAgPENhbGxiYWNrR3JhcGggLz5cbiAgICAgICAgKTtcbiAgICB9XG59XG5cblVuY29ubmVjdGVkQ2FsbGJhY2tHcmFwaENvbnRhaW5lci5wcm9wVHlwZXMgPSB7XG4gICAgZGlzcGF0Y2g6IFByb3BUeXBlcy5mdW5jXG59O1xuXG5jb25zdCBDYWxsYmFja0dyYXBoQ29udGFpbmVyID0gY29ubmVjdChudWxsLCBkaXNwYXRjaCA9PiAoe2Rpc3BhdGNofSkpKFxuICAgIFVuY29ubmVjdGVkQ2FsbGJhY2tHcmFwaENvbnRhaW5lclxuKTtcblxuZXhwb3J0IHtDYWxsYmFja0dyYXBoQ29udGFpbmVyfTtcbiIsImNvbnN0IHN0eWxlc2hlZXQgPSBbXG4gICAge1xuICAgICAgICBzZWxlY3RvcjogJyonLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgJ2ZvbnQtc2l6ZSc6IDEyLFxuICAgICAgICAgICAgJ2ZvbnQtZmFtaWx5JzogJ1ZlcmRhbmEsIHNhbnMtc2VyaWYnXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAge1xuICAgICAgICBzZWxlY3RvcjogJ2VkZ2UnLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgd2lkdGg6IDIsXG4gICAgICAgICAgICAnbGluZS1jb2xvcic6ICcjODg4ODg4JyxcbiAgICAgICAgICAgICd0YXJnZXQtYXJyb3ctY29sb3InOiAnIzg4ODg4OCcsXG4gICAgICAgICAgICAndGFyZ2V0LWFycm93LXNoYXBlJzogJ3RyaWFuZ2xlJyxcbiAgICAgICAgICAgICd0YXJnZXQtYXJyb3ctZmlsbCc6ICdmaWxsZWQnLFxuICAgICAgICAgICAgJ2Fycm93LXNjYWxlJzogMSxcbiAgICAgICAgICAgICdjdXJ2ZS1zdHlsZSc6ICdiZXppZXInLFxuICAgICAgICAgICAgJ2NvbnRyb2wtcG9pbnQtc3RlcC1zaXplJzogNDAsXG4gICAgICAgICAgICAndHJhbnNpdGlvbi1wcm9wZXJ0eSc6ICdsaW5lLWNvbG9yLCB0YXJnZXQtYXJyb3ctY29sb3InLFxuICAgICAgICAgICAgJ3RyYW5zaXRpb24tZHVyYXRpb24nOiAnMC4yNXMnLFxuICAgICAgICAgICAgJ3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uJzogJ2Vhc2UtaW4tb3V0LXNpbmUnXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAge1xuICAgICAgICBzZWxlY3RvcjogJ2VkZ2VbdHlwZT1cImhpZGRlblwiXScsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICBkaXNwbGF5OiAnbm9uZSdcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICB7XG4gICAgICAgIHNlbGVjdG9yOiAnZWRnZVt0eXBlPVwib3V0cHV0XCJdJyxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgICdsaW5lLWNvbG9yJzogJyMwMDgwRDAnLFxuICAgICAgICAgICAgJ3RhcmdldC1hcnJvdy1jb2xvcic6ICcjMDA4MEQwJ1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHtcbiAgICAgICAgc2VsZWN0b3I6ICdlZGdlW3R5cGU9XCJzdGF0ZVwiXScsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAnbGluZS1zdHlsZSc6ICdkYXNoZWQnXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAge1xuICAgICAgICBzZWxlY3RvcjogJ25vZGUnLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgY29sb3I6ICcjMzMzMzMzJyxcbiAgICAgICAgICAgIHBhZGRpbmc6IDYsXG4gICAgICAgICAgICAndGV4dC12YWxpZ24nOiAnY2VudGVyJyxcbiAgICAgICAgICAgICd0ZXh0LWhhbGlnbic6ICdjZW50ZXInLFxuICAgICAgICAgICAgJ2JvcmRlci13aWR0aCc6IDIsXG4gICAgICAgICAgICAnYm9yZGVyLW9wYWNpdHknOiAwLFxuICAgICAgICAgICAgJ2JvcmRlci1zdHlsZSc6ICdzb2xpZCcsXG4gICAgICAgICAgICAnYm9yZGVyLWNvbG9yJzogJyM4ODg4ODgnLFxuICAgICAgICAgICAgJ3RyYW5zaXRpb24tcHJvcGVydHknOiAnYm9yZGVyLW9wYWNpdHknLFxuICAgICAgICAgICAgJ3RyYW5zaXRpb24tZHVyYXRpb24nOiAnMC4yNXMnLFxuICAgICAgICAgICAgJ3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uJzogJ2Vhc2UtaW4tb3V0LXNpbmUnXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAge1xuICAgICAgICBzZWxlY3RvcjogJ25vZGVbdHlwZT1cImNhbGxiYWNrXCJdJyxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgIHdpZHRoOiAzNSxcbiAgICAgICAgICAgIGhlaWdodDogMjUsXG4gICAgICAgICAgICBzaGFwZTogJ3JvdW5kLXJlY3RhbmdsZScsXG4gICAgICAgICAgICBsYWJlbDogZSA9PiBgJHtlLmRhdGEoKS5jb3VudH1cXG4ke2UuZGF0YSgpLnRpbWV9IG1zYCxcbiAgICAgICAgICAgICd0ZXh0LXdyYXAnOiAnd3JhcCcsXG4gICAgICAgICAgICAndGV4dC1qdXN0aWZpY2F0aW9uJzogJ2NlbnRlcidcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICB7XG4gICAgICAgIHNlbGVjdG9yOiAnbm9kZVt0eXBlPVwiY2FsbGJhY2tcIl1bbW9kZT1cImNsaWVudFwiXScsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICBjb2xvcjogJyMzMjMzMzAnLFxuICAgICAgICAgICAgJ2JhY2tncm91bmQtY29sb3InOiAnI0YwREI0RidcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICB7XG4gICAgICAgIHNlbGVjdG9yOiAnbm9kZVt0eXBlPVwiY2FsbGJhY2tcIl1bbW9kZT1cInNlcnZlclwiXScsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICBjb2xvcjogJyMzMjMzMzAnLFxuICAgICAgICAgICAgJ2JhY2tncm91bmQtY29sb3InOiAnIzAwQ0M5NidcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICB7XG4gICAgICAgIHNlbGVjdG9yOiAnbm9kZVt0eXBlPVwiY29tcG9uZW50XCJdLCBub2RlW3R5cGU9XCJ3aWxkY2FyZFwiXScsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICB3aWR0aDogJ2xhYmVsJyxcbiAgICAgICAgICAgIC8vIGhlaWdodDogJ2xhYmVsJyxcbiAgICAgICAgICAgIHNoYXBlOiAncmVjdGFuZ2xlJyxcbiAgICAgICAgICAgIGNvbnRlbnQ6IGUgPT4gZS5kYXRhKCkubGFiZWwucmVwbGFjZSgvXCIvZywgJycpLFxuICAgICAgICAgICAgJ3RleHQtdmFsaWduJzogJ3RvcCcsXG4gICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6ICcjQjlDMkNFJ1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHtcbiAgICAgICAgc2VsZWN0b3I6ICdub2RlW3R5cGU9XCJwcm9wZXJ0eVwiXScsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICB3aWR0aDogJ2xhYmVsJyxcbiAgICAgICAgICAgIGhlaWdodDogMjAsXG4gICAgICAgICAgICBzaGFwZTogJ3JlY3RhbmdsZScsXG4gICAgICAgICAgICBjb250ZW50OiAnZGF0YShsYWJlbCknLFxuICAgICAgICAgICAgY29sb3I6ICd3aGl0ZScsXG4gICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6ICcjMTA5REZGJ1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHtcbiAgICAgICAgc2VsZWN0b3I6ICcuc2VsZWN0ZWQtbm9kZScsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICBnaG9zdDogJ3llcycsXG4gICAgICAgICAgICAnZ2hvc3Qtb2Zmc2V0LXgnOiAyLFxuICAgICAgICAgICAgJ2dob3N0LW9mZnNldC15JzogMixcbiAgICAgICAgICAgICdnaG9zdC1vcGFjaXR5JzogMC4yNSxcbiAgICAgICAgICAgICdib3JkZXItb3BhY2l0eSc6IDFcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICB7XG4gICAgICAgIHNlbGVjdG9yOiAnLnByb3AtY2hhbmdlZCwgLmNhbGxiYWNrLWxvYWRpbmcnLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgJ2JvcmRlci1jb2xvcic6ICcjQ0M0M0I3JyxcbiAgICAgICAgICAgICdib3JkZXItd2lkdGgnOiAyLFxuICAgICAgICAgICAgJ2JvcmRlci1vcGFjaXR5JzogMVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIHtcbiAgICAgICAgc2VsZWN0b3I6ICcuY2FsbGJhY2stZXJyb3InLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgJ2JhY2tncm91bmQtY29sb3InOiAnI0UxMzMyRSdcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICB7XG4gICAgICAgIHNlbGVjdG9yOiAnLnRyaWdnZXJlZCcsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAnbGluZS1jb2xvcic6ICcjQ0M0M0I3JyxcbiAgICAgICAgICAgICd0YXJnZXQtYXJyb3ctY29sb3InOiAnI0NDNDNCNydcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICB7XG4gICAgICAgIHNlbGVjdG9yOiAnLmluYWN0aXZlJyxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgIG9wYWNpdHk6IDAuNVxuICAgICAgICB9XG4gICAgfVxuXTtcblxuZXhwb3J0IGRlZmF1bHQgc3R5bGVzaGVldDtcbiIsImltcG9ydCB7U1RBVFVTLCBTVEFUVVNNQVB9IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cy9jb25zdGFudHMnO1xuXG4vKipcbiAqIGdldEVkZ2VUeXBlc1xuICpcbiAqIEZpbmRzIGFsbCBlZGdlcyBjb25uZWN0ZWQgdG8gYSBub2RlIGFuZCBzcGxpdHMgdGhlbSBieSB0eXBlLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBub2RlIC0gQ3l0b3NjYXBlIG5vZGUuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSAtIE9iamVjdCBjb250YWluaW5nIHRoZSBlZGdlcywgc29ydGVkIGJ5IHR5cGUuXG4gKi9cbmZ1bmN0aW9uIGdldEVkZ2VUeXBlcyhub2RlKSB7XG4gICAgY29uc3QgZWxlbWVudHMgPSBub2RlLmNvbm5lY3RlZEVkZ2VzKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaW5wdXQ6IGVsZW1lbnRzLmZpbHRlcignW3R5cGUgPSBcImlucHV0XCJdJyksXG4gICAgICAgIHN0YXRlOiBlbGVtZW50cy5maWx0ZXIoJ1t0eXBlID0gXCJzdGF0ZVwiXScpLFxuICAgICAgICBvdXRwdXQ6IGVsZW1lbnRzLmZpbHRlcignW3R5cGUgPSBcIm91dHB1dFwiXScpXG4gICAgfTtcbn1cblxuLyoqXG4gKiB1cGRhdGVTZWxlY3RlZFxuICpcbiAqIFVwZGF0ZXMgdGhlIGNsYXNzZXMgb2YgdGhlIHNlbGVjdGVkIG5vZGUgYW5kIHJlY2VudGVycyB0aGUgdmlld3BvcnQuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGN5IC0gUmVmZXJlbmNlIHRvIHRoZSBjeXRvc2NhcGUgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge1N0cmluZ30gaWQgLSBUaGUgaWQgb2YgdGhlIHNlbGVjdGVkIG5vZGUuXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb259IC0gY2xlYW51cCBmdW5jdGlvbiwgZm9yIHVzZUVmZmVjdCBob29rXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTZWxlY3RlZE5vZGUoY3ksIGlkKSB7XG4gICAgZnVuY3Rpb24gYXNjZW5kKG5vZGUsIGNvbGxlY3Rpb24sIHZpc2l0ZWQgPSBuZXcgU2V0KCkpIHtcbiAgICAgICAgaWYgKHZpc2l0ZWQuaGFzKG5vZGUuaWQoKSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2aXNpdGVkLmFkZChub2RlLmlkKCkpO1xuICAgICAgICBjb25zdCB0eXBlID0gbm9kZS5kYXRhKCkudHlwZSA9PT0gJ2NhbGxiYWNrJyA/ICdpbnB1dCcgOiAnb3V0cHV0JztcbiAgICAgICAgY29uc3QgZWRnZXMgPSBnZXRFZGdlVHlwZXMobm9kZSlbdHlwZV07XG4gICAgICAgIGNvbnN0IHBhcmVudHMgPSBlZGdlcy5zb3VyY2VzKCk7XG4gICAgICAgIGNvbGxlY3Rpb24ubWVyZ2UoZWRnZXMpO1xuICAgICAgICBjb2xsZWN0aW9uLm1lcmdlKHBhcmVudHMpO1xuICAgICAgICBpZiAobm9kZS5kYXRhKCkudHlwZSA9PT0gJ3Byb3BlcnR5Jykge1xuICAgICAgICAgICAgY29sbGVjdGlvbi5tZXJnZShub2RlLmFuY2VzdG9ycygpKTtcbiAgICAgICAgfVxuICAgICAgICBwYXJlbnRzLmZvckVhY2gobm9kZSA9PiBhc2NlbmQobm9kZSwgY29sbGVjdGlvbiwgdmlzaXRlZCkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlc2NlbmQobm9kZSwgY29sbGVjdGlvbiwgdmlzaXRlZCA9IG5ldyBTZXQoKSkge1xuICAgICAgICBpZiAodmlzaXRlZC5oYXMobm9kZS5pZCgpKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZpc2l0ZWQuYWRkKG5vZGUuaWQoKSk7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBub2RlLmRhdGEoKS50eXBlID09PSAnY2FsbGJhY2snID8gJ291dHB1dCcgOiAnaW5wdXQnO1xuICAgICAgICBjb25zdCBlZGdlcyA9IGdldEVkZ2VUeXBlcyhub2RlKVt0eXBlXTtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBlZGdlcy50YXJnZXRzKCk7XG4gICAgICAgIGNvbGxlY3Rpb24ubWVyZ2UoZWRnZXMpO1xuICAgICAgICBjb2xsZWN0aW9uLm1lcmdlKGNoaWxkcmVuKTtcbiAgICAgICAgaWYgKG5vZGUuZGF0YSgpLnR5cGUgPT09ICdwcm9wZXJ0eScpIHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb24ubWVyZ2Uobm9kZS5hbmNlc3RvcnMoKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2hpbGRyZW4uZm9yRWFjaChub2RlID0+IGRlc2NlbmQobm9kZSwgY29sbGVjdGlvbiwgdmlzaXRlZCkpO1xuICAgIH1cblxuICAgIGlmIChpZCkge1xuICAgICAgICBjb25zdCBub2RlID0gY3kuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuXG4gICAgICAgIC8vIEhpZ2hsaWdodCB0aGUgc2VsZWN0ZWQgbm9kZS5cblxuICAgICAgICBub2RlLmFkZENsYXNzKCdzZWxlY3RlZC1ub2RlJyk7XG5cbiAgICAgICAgLy8gRmluZCB0aGUgc3VidHJlZSB0aGF0IHRoZSBub2RlIGJlbG9uZ3MgdG8uIEEgc3VidHJlZSBjb250YWluc1xuICAgICAgICAvLyBhbGwgYWxsIGFuY2VzdG9ycyBhbmQgZGVzY2VuZGFudHMgdGhhdCBhcmUgY29ubmVjdGVkIHZpYSBJbnB1dHNcbiAgICAgICAgLy8gb3IgT3V0cHV0cyAoYnV0IG5vdCBTdGF0ZSkuXG5cbiAgICAgICAgY29uc3Qgc3VidHJlZSA9IGN5LmNvbGxlY3Rpb24oKTtcbiAgICAgICAgc3VidHJlZS5tZXJnZShub2RlKTtcbiAgICAgICAgYXNjZW5kKG5vZGUsIHN1YnRyZWUpO1xuICAgICAgICBkZXNjZW5kKG5vZGUsIHN1YnRyZWUpO1xuXG4gICAgICAgIGNvbnN0IG90aGVyID0gc3VidHJlZS5hYnNvbHV0ZUNvbXBsZW1lbnQoKTtcbiAgICAgICAgb3RoZXIuYWRkQ2xhc3MoJ2luYWN0aXZlJyk7XG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIG5vZGUucmVtb3ZlQ2xhc3MoJ3NlbGVjdGVkLW5vZGUnKTtcbiAgICAgICAgICAgIG90aGVyLnJlbW92ZUNsYXNzKCdpbmFjdGl2ZScpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIHVwZGF0ZUNoYW5nZWRQcm9wXG4gKlxuICogRmxhc2hlcyBwcm9wZXJ0eSBub2RlcyB0aGF0IHVwZGF0ZWQgYW5kIGFueSBpbnB1dHMgdGhleSBhcmUgY29ubmVjdGVkIHRvLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBjeSAtIFJlZmVyZW5jZSB0byB0aGUgY3l0b3NjYXBlIGluc3RhbmNlLlxuICogQHBhcmFtIHtTdHJpbmd9IGlkIC0gVGhlIGNvbXBvbmVudCBpZCB3aGljaCB1cGRhdGVkLlxuICogQHBhcmFtIHtPYmplY3R9IHByb3BzIC0gVGhlIHByb3BzIHRoYXQgdXBkYXRlZC5cbiAqIEBwYXJhbSB7TnVtYmVyfSBmbGFzaFRpbWUgLSBUaGUgdGltZSB0byBmbGFzaCBjbGFzc2VzIGZvciBpbiBtcy5cbiAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVDaGFuZ2VkUHJvcHMoY3ksIGlkLCBwcm9wcywgZmxhc2hUaW1lID0gNTAwKSB7XG4gICAgT2JqZWN0LmtleXMocHJvcHMpLmZvckVhY2gocHJvcCA9PiB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBjeS5nZXRFbGVtZW50QnlJZChgJHtpZH0uJHtwcm9wfWApO1xuICAgICAgICBub2RlLmZsYXNoQ2xhc3MoJ3Byb3AtY2hhbmdlZCcsIGZsYXNoVGltZSk7XG4gICAgICAgIG5vZGUuZWRnZXNUbygnKicpXG4gICAgICAgICAgICAuZmlsdGVyKCdbdHlwZSA9IFwiaW5wdXRcIl0nKVxuICAgICAgICAgICAgLmZsYXNoQ2xhc3MoJ3RyaWdnZXJlZCcsIGZsYXNoVGltZSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogdXBkYXRlQ2FsbGJhY2tcbiAqXG4gKiBVcGRhdGVzIGEgY2FsbGJhY2sgbm9kZSB3aXRoIHByb2ZpbGluZyBpbmZvcm1hdGlvbiAoY2FsbCBjb3VudCwgYXZnIHRpbWUpXG4gKiBhbmQgYWRkcyBvciByZW1vdmVzIGNsYXNzZXMgYXMgbmVjZXNzYXJ5LiBDbGFzc2VzIGFyZSBhbHdheXMgYXNzZXJ0IGZvclxuICogYXQgbGVhc3QgZmxhc2hUaW1lIG1zIHNvIHRoYXQgdGhleSBjYW4gYmUgdmlzdWFsbHkgb2JzZXJ2ZWQuIFdoZW4gY2FsbGJhY2tzXG4gKiByZXNvbHZlLCBhbGwgb3V0cHV0IGVkZ2VzIGFyZSBmbGFzaGVkLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBjeSAtIFJlZmVyZW5jZSB0byB0aGUgY3l0b3NjYXBlIGluc3RhbmNlLlxuICogQHBhcmFtIHtTdHJpbmd9IGlkIC0gVGhlIGlkIG9mIHRoZSBjYWxsYmFjayAoaS5lLiwgaXQncyBvdXRwdXQgaWRlbnRpZmllcilcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9maWxlIC0gVGhlIGNhbGxiYWNrIHByb2ZpbGluZyBpbmZvcm1hdGlvbi5cbiAqIEBwYXJhbSB7TnVtYmVyfSBmbGFzaFRpbWUgLSBUaGUgdGltZSB0byBmbGFzaCBjbGFzc2VzIGZvciBpbiBtcy5cbiAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVDYWxsYmFjayhjeSwgaWQsIHByb2ZpbGUsIGZsYXNoVGltZSA9IDUwMCkge1xuICAgIGNvbnN0IG5vZGUgPSBjeS5nZXRFbGVtZW50QnlJZChgX19kYXNoX2NhbGxiYWNrX18uJHtpZH1gKTtcbiAgICBjb25zdCB7Y291bnQsIHRvdGFsLCBzdGF0dXN9ID0gcHJvZmlsZTtcbiAgICBjb25zdCB7bGF0ZXN0fSA9IHN0YXR1cztcblxuICAgIC8vIFVwZGF0ZSBkYXRhLlxuICAgIGNvbnN0IGF2Z1RpbWUgPSBjb3VudCA+IDAgPyB0b3RhbCAvIGNvdW50IDogMDtcbiAgICBub2RlLmRhdGEoJ2NvdW50JywgY291bnQpO1xuICAgIG5vZGUuZGF0YSgndGltZScsIE1hdGgucm91bmQoYXZnVGltZSkpO1xuXG4gICAgLy8gRWl0aGVyIGZsYXNoIHRoZSBjbGFzc2VzIE9SIG1haW50YWluIGl0IGZvciBsb25nIGNhbGxiYWNrcy5cbiAgICBpZiAobGF0ZXN0ID09PSAnbG9hZGluZycpIHtcbiAgICAgICAgbm9kZS5kYXRhKCdsb2FkaW5nU2V0JywgRGF0ZS5ub3coKSk7XG4gICAgICAgIG5vZGUuYWRkQ2xhc3MoJ2NhbGxiYWNrLWxvYWRpbmcnKTtcbiAgICB9IGVsc2UgaWYgKG5vZGUuaGFzQ2xhc3MoJ2NhbGxiYWNrLWxvYWRpbmcnKSkge1xuICAgICAgICBjb25zdCB0aW1lTGVmdCA9IG5vZGUuZGF0YSgnbG9hZGluZ1NldCcpICsgZmxhc2hUaW1lIC0gRGF0ZS5ub3coKTtcbiAgICAgICAgc2V0VGltZW91dChcbiAgICAgICAgICAgICgpID0+IG5vZGUucmVtb3ZlQ2xhc3MoJ2NhbGxiYWNrLWxvYWRpbmcnKSxcbiAgICAgICAgICAgIE1hdGgubWF4KHRpbWVMZWZ0LCAwKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgICAgbGF0ZXN0ICE9PSAnbG9hZGluZycgJiZcbiAgICAgICAgbGF0ZXN0ICE9PSBTVEFUVVNNQVBbU1RBVFVTLk9LXSAmJlxuICAgICAgICBsYXRlc3QgIT09IFNUQVRVU01BUFtTVEFUVVMuUFJFVkVOVF9VUERBVEVdXG4gICAgKSB7XG4gICAgICAgIG5vZGUuZGF0YSgnZXJyb3JTZXQnLCBEYXRlLm5vdygpKTtcbiAgICAgICAgbm9kZS5hZGRDbGFzcygnY2FsbGJhY2stZXJyb3InKTtcbiAgICB9IGVsc2UgaWYgKG5vZGUuaGFzQ2xhc3MoJ2NhbGxiYWNrLWVycm9yJykpIHtcbiAgICAgICAgY29uc3QgdGltZUxlZnQgPSBub2RlLmRhdGEoJ2Vycm9yU2V0JykgKyBmbGFzaFRpbWUgLSBEYXRlLm5vdygpO1xuICAgICAgICBzZXRUaW1lb3V0KFxuICAgICAgICAgICAgKCkgPT4gbm9kZS5yZW1vdmVDbGFzcygnY2FsbGJhY2stZXJyb3InKSxcbiAgICAgICAgICAgIE1hdGgubWF4KHRpbWVMZWZ0LCAwKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8vIEZJWE1FOiBUaGlzIHdpbGwgZmxhc2ggYnJhbmNoZXMgdGhhdCByZXR1cm4gbm9fdXBkYXRlISFcbiAgICAvLyBJZiB0aGUgY2FsbGJhY2sgcmVzb2x2ZWQgcHJvcGVybHksIGZsYXNoIHRoZSBvdXRwdXRzLlxuICAgIGlmIChsYXRlc3QgPT09IFNUQVRVU01BUFtTVEFUVVMuT0tdKSB7XG4gICAgICAgIG5vZGUuZWRnZXNUbygnKicpLmZsYXNoQ2xhc3MoJ3RyaWdnZXJlZCcsIGZsYXNoVGltZSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHtDb21wb25lbnR9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQge29uRXJyb3IsIHJldmVydH0gZnJvbSAnLi4vLi4vYWN0aW9ucyc7XG5cbmNsYXNzIENvbXBvbmVudEVycm9yQm91bmRhcnkgZXh0ZW5kcyBDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIG15SUQ6IHByb3BzLmNvbXBvbmVudElkLFxuICAgICAgICAgICAgb2xkQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBoYXNFcnJvcjogZmFsc2VcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKF8pIHtcbiAgICAgICAgcmV0dXJuIHtoYXNFcnJvcjogdHJ1ZX07XG4gICAgfVxuXG4gICAgY29tcG9uZW50RGlkQ2F0Y2goZXJyb3IsIGluZm8pIHtcbiAgICAgICAgY29uc3Qge2Rpc3BhdGNofSA9IHRoaXMucHJvcHM7XG4gICAgICAgIGRpc3BhdGNoKFxuICAgICAgICAgICAgb25FcnJvcih7XG4gICAgICAgICAgICAgICAgbXlJRDogdGhpcy5zdGF0ZS5teUlELFxuICAgICAgICAgICAgICAgIHR5cGU6ICdmcm9udEVuZCcsXG4gICAgICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICAgICAgaW5mb1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgICAgZGlzcGF0Y2gocmV2ZXJ0KTtcbiAgICB9XG5cbiAgICBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzLCBwcmV2U3RhdGUpIHtcbiAgICAgICAgY29uc3QgcHJldkNoaWxkcmVuID0gcHJldlByb3BzLmNoaWxkcmVuO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICAhdGhpcy5zdGF0ZS5oYXNFcnJvciAmJlxuICAgICAgICAgICAgcHJldkNoaWxkcmVuICE9PSBwcmV2U3RhdGUub2xkQ2hpbGRyZW4gJiZcbiAgICAgICAgICAgIHByZXZDaGlsZHJlbiAhPT0gdGhpcy5wcm9wcy5jaGlsZHJlblxuICAgICAgICApIHtcbiAgICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC9uby1kaWQtdXBkYXRlLXNldC1zdGF0ZSAqL1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgb2xkQ2hpbGRyZW46IHByZXZDaGlsZHJlblxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGNvbnN0IHtoYXNFcnJvciwgb2xkQ2hpbGRyZW59ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgcmV0dXJuIGhhc0Vycm9yID8gb2xkQ2hpbGRyZW4gOiB0aGlzLnByb3BzLmNoaWxkcmVuO1xuICAgIH1cbn1cblxuQ29tcG9uZW50RXJyb3JCb3VuZGFyeS5wcm9wVHlwZXMgPSB7XG4gICAgY2hpbGRyZW46IFByb3BUeXBlcy5vYmplY3QsXG4gICAgY29tcG9uZW50SWQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgZXJyb3I6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgZGlzcGF0Y2g6IFByb3BUeXBlcy5mdW5jXG59O1xuXG5leHBvcnQgZGVmYXVsdCBDb21wb25lbnRFcnJvckJvdW5kYXJ5O1xuIiwiaW1wb3J0IHtjb25uZWN0fSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgJy4vRnJvbnRFbmRFcnJvci5jc3MnO1xuaW1wb3J0IHtDb21wb25lbnQsIHVzZVJlZiwgdXNlU3RhdGUsIHVzZUVmZmVjdH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IENvbGxhcHNlSWNvbiBmcm9tICcuLi9pY29ucy9Db2xsYXBzZUljb24uc3ZnJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgJy4uL1BlcmN5LmNzcyc7XG5pbXBvcnQge3VybEJhc2V9IGZyb20gJy4uLy4uLy4uL2FjdGlvbnMvdXRpbHMnO1xuXG5pbXBvcnQgd2Vya3pldWdDc3MgZnJvbSAnLi4vd2Vya3pldWdjc3MnO1xuXG5jbGFzcyBGcm9udEVuZEVycm9yIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBjb2xsYXBzZWQ6IHRoaXMucHJvcHMuaXNMaXN0SXRlbVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgY29uc3Qge2UsIGluQWxlcnRzVHJheX0gPSB0aGlzLnByb3BzO1xuICAgICAgICBjb25zdCB7Y29sbGFwc2VkfSA9IHRoaXMuc3RhdGU7XG5cbiAgICAgICAgY29uc3QgY2FyZENsYXNzZXMgPVxuICAgICAgICAgICAgJ2Rhc2gtZXJyb3ItY2FyZF9fY29udGVudCcgK1xuICAgICAgICAgICAgKGluQWxlcnRzVHJheSA/ICcgZGFzaC1lcnJvci1jYXJkLS1hbGVydHMtdHJheScgOiAnJyk7XG5cbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8taW5saW5lLWNvbW1lbnRzICovXG4gICAgICAgIGNvbnN0IGVycm9ySGVhZGVyID0gKFxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0nZGFzaC1mZS1lcnJvci1pdGVtIHRlc3QtZGV2dG9vbHMtZXJyb3ItdG9nZ2xlJ1xuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHRoaXMuc2V0U3RhdGUoe2NvbGxhcHNlZDogIWNvbGxhcHNlZH0pfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0nZGFzaC1mZS1lcnJvci10b3BfX2dyb3VwJz5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSdkYXNoLWZlLWVycm9yX190aXRsZSc+XG4gICAgICAgICAgICAgICAgICAgICAgICB7ZS5lcnJvci5tZXNzYWdlIHx8ICdFcnJvcid9XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSdkYXNoLWZlLWVycm9yLXRvcF9fZ3JvdXAnPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9J2Rhc2gtZmUtZXJyb3JfX3RpbWVzdGFtcCBwZXJjeS1oaWRlJz5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtgJHtlLnRpbWVzdGFtcC50b0xvY2FsZVRpbWVTdHJpbmcoKX1gfVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0nZGFzaC1mZS1lcnJvcl9fdGltZXN0YW1wIHBlcmN5LXNob3cnPlxuICAgICAgICAgICAgICAgICAgICAgICAgey8qIFNwZWNpYWwgcGVyY3kgdGltZXN0YW1wIGZvciB2aXN1YWwgdGVzdGluZy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAqIEhpZGRlbiBkdXJpbmcgcmVndWxhciB1c2FnZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAqL31cbiAgICAgICAgICAgICAgICAgICAgICAgIDAwOjAwOjAwIFBNXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICA8Q29sbGFwc2VJY29uXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2BkYXNoLWZlLWVycm9yX19jb2xsYXBzZSAke1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlZCA/ICdkYXNoLWZlLWVycm9yX19jb2xsYXBzZS0tZmxpcHBlZCcgOiAnJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB0aGlzLnNldFN0YXRlKHtjb2xsYXBzZWQ6ICFjb2xsYXBzZWR9KX1cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2NhcmRDbGFzc2VzfT5cbiAgICAgICAgICAgICAgICB7ZXJyb3JIZWFkZXJ9XG4gICAgICAgICAgICAgICAgeyFjb2xsYXBzZWQgJiYgPEVycm9yQ29udGVudCBlcnJvcj17ZS5lcnJvcn0gLz59XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIEJhY2tlbmRFcnJvcih7ZXJyb3IsIGJhc2V9KSB7XG4gICAgY29uc3QgaWZyYW1lUmVmID0gdXNlUmVmKG51bGwpO1xuICAgIGNvbnN0IFtoZWlnaHQsIHNldEhlaWdodF0gPSB1c2VTdGF0ZSgnNTAwcHgnKTsgLy8gRGVmYXVsdCBoZWlnaHRcblxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGhhbmRsZU1lc3NhZ2UgPSBldmVudCA9PiB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgZXZlbnQuZGF0YSAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBldmVudC5kYXRhID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgICAgIGV2ZW50LmRhdGEudHlwZSA9PT0gJ0lGUkFNRV9IRUlHSFQnXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBzZXRIZWlnaHQoYCR7ZXZlbnQuZGF0YS5oZWlnaHR9cHhgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGhhbmRsZU1lc3NhZ2UpO1xuICAgICAgICByZXR1cm4gKCkgPT4gd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBoYW5kbGVNZXNzYWdlKTtcbiAgICB9LCBbXSk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8aWZyYW1lXG4gICAgICAgICAgICByZWY9e2lmcmFtZVJlZn1cbiAgICAgICAgICAgIHNyY0RvYz17ZXJyb3IuaHRtbFxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKFxuICAgICAgICAgICAgICAgICAgICAnPC9oZWFkPicsXG4gICAgICAgICAgICAgICAgICAgIGA8c3R5bGUgdHlwZT1cInRleHQvY3NzXCI+JHt3ZXJremV1Z0Nzc308L3N0eWxlPlxuICAgICAgICAgICAgICAgICAgICA8c2NyaXB0PlxuICBmdW5jdGlvbiBzZW5kSGVpZ2h0KCkge1xuICAgIGNvbnN0IGhlaWdodCA9IGRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0O1xuICAgIHdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2UoeyB0eXBlOiBcIklGUkFNRV9IRUlHSFRcIiwgaGVpZ2h0IH0sIFwiKlwiKTtcbiAgfVxuXG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwibG9hZFwiLCBzZW5kSGVpZ2h0KTtcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgc2VuZEhlaWdodCk7XG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgc2VuZEhlaWdodCk7XG48L3NjcmlwdD48L2hlYWQ+YFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgnPVwiP19fZGVidWdnZXJfXycsIGA9XCIke2Jhc2V9P19fZGVidWdnZXJfX2ApfVxuICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAvKlxuICAgICAgICAgICAgICAgICAqIDY3cHggb2YgcGFkZGluZyBhbmQgbWFyZ2luIGJldHdlZW4gdGhpc1xuICAgICAgICAgICAgICAgICAqIGlmcmFtZSBhbmQgdGhlIHBhcmVudCBjb250YWluZXIuXG4gICAgICAgICAgICAgICAgICogNjcgd2FzIGRldGVybWluZWQgbWFudWFsbHkgaW4gdGhlXG4gICAgICAgICAgICAgICAgICogYnJvd3NlcidzIGRldiB0b29scy5cbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICB3aWR0aDogJ2NhbGMoNjAwcHggLSA2N3B4KScsXG4gICAgICAgICAgICAgICAgYm9yZGVyOiAnbm9uZScsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBoZWlnaHRcbiAgICAgICAgICAgIH19XG4gICAgICAgIC8+XG4gICAgKTtcbn1cblxuY29uc3QgTUFYX01FU1NBR0VfTEVOR1RIID0gNDA7XG4vKiBlc2xpbnQtZGlzYWJsZSBuby1pbmxpbmUtY29tbWVudHMgKi9cbmZ1bmN0aW9uIFVuY29ubmVjdGVkRXJyb3JDb250ZW50KHtlcnJvciwgYmFzZX0pIHtcbiAgICAvLyBIZWxwZXIgdG8gZGV0ZWN0IGZ1bGwgSFRNTCBkb2N1bWVudFxuICAgIGNvbnN0IGlzRnVsbEh0bWxEb2MgPVxuICAgICAgICB0eXBlb2YgZXJyb3IuaHRtbCA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgZXJyb3IuaHRtbC50cmltKCkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCc8IWRvY3R5cGUnKTtcblxuICAgIC8vIEhlbHBlciB0byBkZXRlY3QgSFRNTCBmcmFnbWVudFxuICAgIGNvbnN0IGlzSHRtbEZyYWdtZW50ID1cbiAgICAgICAgdHlwZW9mIGVycm9yLmh0bWwgPT09ICdzdHJpbmcnICYmIGVycm9yLmh0bWwudHJpbSgpLnN0YXJ0c1dpdGgoJzwnKTtcblxuICAgIHJldHVybiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdlcnJvci1jb250YWluZXInPlxuICAgICAgICAgICAgey8qIEZyb250ZW5kIGVycm9yIG1lc3NhZ2UgKi99XG4gICAgICAgICAgICB7dHlwZW9mIGVycm9yLm1lc3NhZ2UgIT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICBlcnJvci5tZXNzYWdlLmxlbmd0aCA8IE1BWF9NRVNTQUdFX0xFTkdUSCA/IG51bGwgOiAoXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtZmUtZXJyb3JfX3N0Jz5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtZmUtZXJyb3JfX2luZm8gZGFzaC1mZS1lcnJvcl9fY3VydmVkJz5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtlcnJvci5tZXNzYWdlfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICl9XG5cbiAgICAgICAgICAgIHsvKiBGcm9udGVuZCBzdGFjayB0cmFjZSAqL31cbiAgICAgICAgICAgIHt0eXBlb2YgZXJyb3Iuc3RhY2sgIT09ICdzdHJpbmcnID8gbnVsbCA6IChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1mZS1lcnJvcl9fc3QnPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1mZS1lcnJvcl9faW5mbyc+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGV0YWlscz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3VtbWFyeT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVGhpcyBlcnJvciBvcmlnaW5hdGVkIGZyb20gdGhlIGJ1aWx0LWluXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKYXZhU2NyaXB0IGNvZGUgdGhhdCBydW5zIERhc2ggYXBwcy4gQ2xpY2tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHNlZSB0aGUgZnVsbCBzdGFjayB0cmFjZSBvciBvcGVuIHlvdXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyb3dzZXIncyBjb25zb2xlLilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3VtbWFyeT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ZXJyb3Iuc3RhY2suc3BsaXQoJ1xcbicpLm1hcCgobGluZSwgaSkgPT4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBrZXk9e2l9PntsaW5lfTwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGV0YWlscz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApfVxuXG4gICAgICAgICAgICB7LyogQmFja2VuZCBlcnJvcjogZnVsbCBIVE1MIGRvY3VtZW50ICovfVxuICAgICAgICAgICAge2lzRnVsbEh0bWxEb2MgPyAoXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtYmUtZXJyb3JfX3N0Jz5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtYmFja2VuZC1lcnJvcic+XG4gICAgICAgICAgICAgICAgICAgICAgICA8QmFja2VuZEVycm9yIGVycm9yPXtlcnJvcn0gYmFzZT17YmFzZX0gLz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApIDogaXNIdG1sRnJhZ21lbnQgPyAoXG4gICAgICAgICAgICAgICAgLy8gQmFja2VuZCBlcnJvcjogSFRNTCBmcmFnbWVudFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdkYXNoLWJlLWVycm9yX19zdHInPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9J2Rhc2gtYmFja2VuZC1lcnJvcidcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7X19odG1sOiBlcnJvci5odG1sfX1cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICkgOiB0eXBlb2YgZXJyb3IuaHRtbCA9PT0gJ3N0cmluZycgPyAoXG4gICAgICAgICAgICAgICAgLy8gQmFja2VuZCBlcnJvcjogcGxhaW4gdGV4dFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdkYXNoLWJlLWVycm9yX19zdHInPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1iYWNrZW5kLWVycm9yJz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwcmU+e2Vycm9yLmh0bWx9PC9wcmU+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgIDwvZGl2PlxuICAgICk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG5vLWlubGluZS1jb21tZW50cyAqL1xuXG5jb25zdCBlcnJvclByb3BUeXBlcyA9IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgbWVzc2FnZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAgIC8qIGZyb250LWVuZCBlcnJvciBtZXNzYWdlcyAqL1xuICAgIHN0YWNrOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gICAgLyogYmFja2VuZCBlcnJvciBtZXNzYWdlcyAqL1xuICAgIGh0bWw6IFByb3BUeXBlcy5zdHJpbmdcbn0pO1xuXG5VbmNvbm5lY3RlZEVycm9yQ29udGVudC5wcm9wVHlwZXMgPSB7XG4gICAgZXJyb3I6IGVycm9yUHJvcFR5cGVzLFxuICAgIGJhc2U6IFByb3BUeXBlcy5zdHJpbmdcbn07XG5cbmNvbnN0IEVycm9yQ29udGVudCA9IGNvbm5lY3Qoc3RhdGUgPT4gKHtiYXNlOiB1cmxCYXNlKHN0YXRlLmNvbmZpZyl9KSkoXG4gICAgVW5jb25uZWN0ZWRFcnJvckNvbnRlbnRcbik7XG5cbkZyb250RW5kRXJyb3IucHJvcFR5cGVzID0ge1xuICAgIGU6IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgICAgIHRpbWVzdGFtcDogUHJvcFR5cGVzLm9iamVjdCxcbiAgICAgICAgZXJyb3I6IGVycm9yUHJvcFR5cGVzXG4gICAgfSksXG4gICAgaW5BbGVydHNUcmF5OiBQcm9wVHlwZXMuYm9vbCxcbiAgICBpc0xpc3RJdGVtOiBQcm9wVHlwZXMuYm9vbFxufTtcblxuRnJvbnRFbmRFcnJvci5kZWZhdWx0UHJvcHMgPSB7XG4gICAgaW5BbGVydHNUcmF5OiBmYWxzZSxcbiAgICBpc0xpc3RJdGVtOiBmYWxzZVxufTtcblxuZXhwb3J0IHtGcm9udEVuZEVycm9yfTtcbiIsImltcG9ydCBSZWFjdCwge0NvbXBvbmVudH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0ICcuL0Zyb250RW5kRXJyb3IuY3NzJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQge0Zyb250RW5kRXJyb3J9IGZyb20gJy4vRnJvbnRFbmRFcnJvci5yZWFjdCc7XG5cbmNsYXNzIEZyb250RW5kRXJyb3JDb250YWluZXIgZXh0ZW5kcyBDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGNvbnN0IHtlcnJvcnMsIGNvbm5lY3RlZCwgY2xpY2tIYW5kbGVyfSA9IHRoaXMucHJvcHM7XG5cbiAgICAgICAgY29uc3QgaW5BbGVydHNUcmF5ID0gdGhpcy5wcm9wcy5pbkFsZXJ0c1RyYXk7XG4gICAgICAgIGxldCBjYXJkQ2xhc3NlcyA9ICdkYXNoLWVycm9yLWNhcmQgZGFzaC1lcnJvci1jYXJkLS1jb250YWluZXInO1xuXG4gICAgICAgIGNvbnN0IGVycm9yRWxlbWVudHMgPSBlcnJvcnMubWFwKChlcnJvciwgaSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIDxGcm9udEVuZEVycm9yIGU9e2Vycm9yfSBpc0xpc3RJdGVtPXt0cnVlfSBrZXk9e2l9IC8+O1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGluQWxlcnRzVHJheSkge1xuICAgICAgICAgICAgY2FyZENsYXNzZXMgKz0gJyBkYXNoLWVycm9yLWNhcmQtLWFsZXJ0cy10cmF5JztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2NhcmRDbGFzc2VzfT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1lcnJvci1jYXJkX190b3BiYXInPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1lcnJvci1jYXJkX19tZXNzYWdlJz5cbiAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yc1xuICAgICAgICAgICAgICAgICAgICAgICAge2Nvbm5lY3RlZCA/IG51bGwgOiAnXFx1MDBhMCDwn5qrIFNlcnZlciBVbmF2YWlsYWJsZSd9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9J2Rhc2gtZmUtZXJyb3JfX2ljb24teCdcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGNsaWNrSGFuZGxlcigpfVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICDDl1xuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1lcnJvci1jYXJkX19saXN0Jz57ZXJyb3JFbGVtZW50c308L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICApO1xuICAgIH1cbn1cblxuRnJvbnRFbmRFcnJvckNvbnRhaW5lci5wcm9wVHlwZXMgPSB7XG4gICAgaWQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgZXJyb3JzOiBQcm9wVHlwZXMuYXJyYXksXG4gICAgY29ubmVjdGVkOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBpbkFsZXJ0c1RyYXk6IFByb3BUeXBlcy5hbnlcbn07XG5cbkZyb250RW5kRXJyb3JDb250YWluZXIucHJvcFR5cGVzID0ge1xuICAgIGluQWxlcnRzVHJheTogUHJvcFR5cGVzLmFueVxufTtcblxuZXhwb3J0IHtGcm9udEVuZEVycm9yQ29udGFpbmVyfTtcbiIsImltcG9ydCB7Y29ubmVjdH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHtEZWJ1Z01lbnV9IGZyb20gJy4vbWVudS9EZWJ1Z01lbnUucmVhY3QnO1xuXG5jbGFzcyBVbmNvbm5lY3RlZEdsb2JhbEVycm9yQ29udGFpbmVyIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICBjb25zdCB7Y29uZmlnLCBlcnJvciwgY2hpbGRyZW59ID0gdGhpcy5wcm9wcztcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXYgaWQ9J19kYXNoLWdsb2JhbC1lcnJvci1jb250YWluZXInPlxuICAgICAgICAgICAgICAgIDxEZWJ1Z01lbnVcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnPXtjb25maWd9XG4gICAgICAgICAgICAgICAgICAgIGVycm9yPXtlcnJvcn1cbiAgICAgICAgICAgICAgICAgICAgaG90UmVsb2FkPXtCb29sZWFuKGNvbmZpZy5ob3RfcmVsb2FkKX1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9J19kYXNoLWFwcC1jb250ZW50Jz57Y2hpbGRyZW59PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9EZWJ1Z01lbnU+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKTtcbiAgICB9XG59XG5cblVuY29ubmVjdGVkR2xvYmFsRXJyb3JDb250YWluZXIucHJvcFR5cGVzID0ge1xuICAgIGNoaWxkcmVuOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIGNvbmZpZzogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBlcnJvcjogUHJvcFR5cGVzLm9iamVjdFxufTtcblxuY29uc3QgR2xvYmFsRXJyb3JDb250YWluZXIgPSBjb25uZWN0KHN0YXRlID0+ICh7XG4gICAgY29uZmlnOiBzdGF0ZS5jb25maWcsXG4gICAgZXJyb3I6IHN0YXRlLmVycm9yXG59KSkoVW5jb25uZWN0ZWRHbG9iYWxFcnJvckNvbnRhaW5lcik7XG5cbmV4cG9ydCBkZWZhdWx0IEdsb2JhbEVycm9yQ29udGFpbmVyO1xuIiwiaW1wb3J0IFJlYWN0LCB7dXNlRWZmZWN0LCB1c2VTdGF0ZX0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7Y29uY2F0fSBmcm9tICdyYW1kYSc7XG5pbXBvcnQge3VzZVNlbGVjdG9yfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5cbmltcG9ydCAnLi9EZWJ1Z01lbnUuY3NzJztcblxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICcuLi9pY29ucy9DaGVja0ljb24uc3ZnJztcbmltcG9ydCBDbG9ja0ljb24gZnJvbSAnLi4vaWNvbnMvQ2xvY2tJY29uLnN2Zyc7XG5pbXBvcnQgRXJyb3JJY29uIGZyb20gJy4uL2ljb25zL0Vycm9ySWNvbi5zdmcnO1xuaW1wb3J0IEdyYXBoSWNvbiBmcm9tICcuLi9pY29ucy9HcmFwaEljb24uc3ZnJztcbmltcG9ydCBPZmZJY29uIGZyb20gJy4uL2ljb25zL09mZkljb24uc3ZnJztcbmltcG9ydCBFeHBhbmQgZnJvbSAnLi4vaWNvbnMvRXhwYW5kLnN2Zyc7XG5pbXBvcnQge1ZlcnNpb25JbmZvfSBmcm9tICcuL1ZlcnNpb25JbmZvLnJlYWN0JztcbmltcG9ydCB7Q2FsbGJhY2tHcmFwaENvbnRhaW5lcn0gZnJvbSAnLi4vQ2FsbGJhY2tHcmFwaC9DYWxsYmFja0dyYXBoQ29udGFpbmVyLnJlYWN0JztcbmltcG9ydCB7RnJvbnRFbmRFcnJvckNvbnRhaW5lcn0gZnJvbSAnLi4vRnJvbnRFbmQvRnJvbnRFbmRFcnJvckNvbnRhaW5lci5yZWFjdCc7XG5pbXBvcnQgRXh0ZXJuYWxXcmFwcGVyIGZyb20gJy4uLy4uLy4uL3dyYXBwZXIvRXh0ZXJuYWxXcmFwcGVyJztcbmltcG9ydCBQbG90bHlDbG91ZCBmcm9tICcuL1Bsb3RseUNsb3VkJztcbmltcG9ydCB7RGV2dG9vbFByb3ZpZGVyLCB1c2VEZXZ0b29sfSBmcm9tICcuL0RldnRvb2xDb250ZXh0JztcblxuY29uc3QgY2xhc3NlcyA9IChiYXNlLCB2YXJpYW50LCB2YXJpYW50MikgPT5cbiAgICBgJHtiYXNlfSAke2Jhc2V9LS0ke3ZhcmlhbnR9YCArICh2YXJpYW50MiA/IGAgJHtiYXNlfS0tJHt2YXJpYW50Mn1gIDogJycpO1xuXG5jb25zdCBpc0NvbGxhcHNlZCA9ICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2Rhc2hfZGVidWdfbWVudV9jb2xsYXBzZWQnKSA9PT0gJ3RydWUnO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gSWYgbG9jYWxTdG9yYWdlIGlzIG5vdCBhdmFpbGFibGUsIGRlZmF1bHQgdG8gZmFsc2VcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn07XG5cbmNvbnN0IE1lbnVDb250ZW50ID0gKHtcbiAgICBob3RSZWxvYWQsXG4gICAgY29ubmVjdGVkLFxuICAgIHBvcHVwLFxuICAgIHRvZ2dsZUVycm9ycyxcbiAgICBlcnJDb3VudCxcbiAgICB0b2dnbGVDYWxsYmFja0dyYXBoLFxuICAgIGNvbmZpZ1xufSkgPT4ge1xuICAgIGNvbnN0IHJlYWR5ID0gdXNlU2VsZWN0b3Ioc3RhdGUgPT4gc3RhdGUuYXBwTGlmZWN5Y2xlID09PSAnSFlEUkFURUQnKTtcbiAgICBjb25zdCBfU3RhdHVzSWNvbiA9IGhvdFJlbG9hZFxuICAgICAgICA/IGNvbm5lY3RlZFxuICAgICAgICAgICAgPyBDaGVja0ljb25cbiAgICAgICAgICAgIDogT2ZmSWNvblxuICAgICAgICA6IENsb2NrSWNvbjtcblxuICAgIGNvbnN0IHN0YXR1cyA9IGhvdFJlbG9hZFxuICAgICAgICA/IGNvbm5lY3RlZFxuICAgICAgICAgICAgPyAnYXZhaWxhYmxlJ1xuICAgICAgICAgICAgOiAndW5hdmFpbGFibGUnXG4gICAgICAgIDogJ2NvbGQnO1xuXG4gICAgbGV0IGN1c3RvbSA9IG51bGw7XG4gICAgaWYgKGNvbmZpZy5kZXZfdG9vbHM/Lmxlbmd0aCAmJiByZWFkeSkge1xuICAgICAgICBjdXN0b20gPSBjb25maWcuZGV2X3Rvb2xzLnJlZHVjZShcbiAgICAgICAgICAgIChhY2MsIGRldnRvb2wsIGkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb21wID0gKFxuICAgICAgICAgICAgICAgICAgICA8RXh0ZXJuYWxXcmFwcGVyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQ9e2RldnRvb2x9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRQYXRoPXtbJ19fZGFzaF9kZXZ0b29scycsIGldfVxuICAgICAgICAgICAgICAgICAgICAgICAga2V5PXtkZXZ0b29sPy5wcm9wcz8uaWQgPyBkZXZ0b29sLnByb3BzLmlkIDogaX1cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmIChkZXZ0b29sLnBvc2l0aW9uID09PSAnbGVmdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgYWNjLmxlZnQucHVzaChjb21wKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhY2MucmlnaHQucHVzaChjb21wKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7bGVmdDogW10sIHJpZ2h0OiBbXX1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1kZWJ1Zy1tZW51X19jb250ZW50Jz5cbiAgICAgICAgICAgIHtjdXN0b20gJiYgPD57Y3VzdG9tLmxlZnR9PC8+fVxuICAgICAgICAgICAgeyFjb25maWcucGxvdGx5X2Nsb3VkX2luc3RhbGxlZCA/IDxQbG90bHlDbG91ZCAvPiA6IG51bGx9XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgb25DbGljaz17dG9nZ2xlRXJyb3JzfVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17XG4gICAgICAgICAgICAgICAgICAgIChwb3B1cCA9PSAnZXJyb3JzJ1xuICAgICAgICAgICAgICAgICAgICAgICAgPyAnZGFzaC1kZWJ1Zy1tZW51X19idXR0b24tLXNlbGVjdGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsKSArICcgZGFzaC1kZWJ1Zy1tZW51X19idXR0b24nXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlkPSdkYXNoLWRlYnVnLW1lbnVfX2Vycm9ycy1idXR0b24nXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPEVycm9ySWNvblxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9J2Rhc2gtZGVidWctbWVudV9faWNvbidcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg9ezE2fVxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9ezE2fVxuICAgICAgICAgICAgICAgICAgICBmaWxsPSdjdXJyZW50Q29sb3InXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICBFcnJvcnNcbiAgICAgICAgICAgICAgICB7ZXJyQ291bnQgPiAwID8gKFxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9J3Rlc3QtZGV2dG9vbHMtZXJyb3ItY291bnQgZGFzaC1kZWJ1Zy1tZW51X19lcnJvci1jb3VudCc+XG4gICAgICAgICAgICAgICAgICAgICAgICB7ZXJyQ291bnR9XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RvZ2dsZUNhbGxiYWNrR3JhcGh9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtcbiAgICAgICAgICAgICAgICAgICAgKHBvcHVwID09ICdjYWxsYmFja0dyYXBoJ1xuICAgICAgICAgICAgICAgICAgICAgICAgPyAnZGFzaC1kZWJ1Zy1tZW51X19idXR0b24tLXNlbGVjdGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiAnJykgKyAnIGRhc2gtZGVidWctbWVudV9fYnV0dG9uJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZD0nZGFzaC1kZWJ1Zy1tZW51X19jYWxsYmFjay1ncmFwaC1idXR0b24nXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPEdyYXBoSWNvblxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9J2Rhc2gtZGVidWctbWVudV9faWNvbidcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg9ezE2fVxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9ezE2fVxuICAgICAgICAgICAgICAgICAgICBmaWxsPSdjdXJyZW50Q29sb3InXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICBDYWxsYmFja3NcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtZGVidWctbWVudV9fZGl2aWRlcicgLz5cbiAgICAgICAgICAgIDxWZXJzaW9uSW5mbyBjb25maWc9e2NvbmZpZ30gLz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdkYXNoLWRlYnVnLW1lbnVfX2RpdmlkZXInIC8+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgZGFzaC1kZWJ1Zy1tZW51X19zdGF0dXMgZGFzaC1kZWJ1Zy1tZW51X19idXR0b24tLSR7c3RhdHVzfWB9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgU2VydmVyXG4gICAgICAgICAgICAgICAgPF9TdGF0dXNJY29uIGNsYXNzTmFtZT0nZGFzaC1kZWJ1Zy1tZW51X19pY29uJyAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB7Y3VzdG9tICYmIDw+e2N1c3RvbS5yaWdodH08Lz59XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPSdkYXNoLWRlYnVnLW1lbnVfX2RpdmlkZXInXG4gICAgICAgICAgICAgICAgc3R5bGU9e3ttYXJnaW5SaWdodDogMH19XG4gICAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cbiAgICApO1xufTtcblxuY29uc3QgRGVidWcgPSAoe2Vycm9yLCBob3RSZWxvYWQsIGNvbmZpZywgY2hpbGRyZW59KSA9PiB7XG4gICAgY29uc3Qge3BvcHVwLCBzZXRQb3B1cH0gPSB1c2VEZXZ0b29sKCk7XG4gICAgY29uc3QgW2NvbGxhcHNlZCwgc2V0Q29sbGFwc2VkXSA9IHVzZVN0YXRlKGlzQ29sbGFwc2VkKTtcblxuICAgIGNvbnN0IGVyckNvdW50ID0gZXJyb3IuZnJvbnRFbmQubGVuZ3RoICsgZXJyb3IuYmFja0VuZC5sZW5ndGg7XG4gICAgY29uc3QgY29ubmVjdGVkID0gZXJyb3IuYmFja0VuZENvbm5lY3RlZDtcblxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmIChlcnJDb3VudCA+IDAgJiYgcG9wdXAgPT0gbnVsbCkge1xuICAgICAgICAgICAgc2V0UG9wdXAoJ2Vycm9ycycpO1xuICAgICAgICB9XG4gICAgfSwgW2VyckNvdW50XSk7XG5cbiAgICBjb25zdCB0b2dnbGVFcnJvcnMgPSAoKSA9PiB7XG4gICAgICAgIHNldFBvcHVwKHBvcHVwID09ICdlcnJvcnMnID8gbnVsbCA6ICdlcnJvcnMnKTtcbiAgICB9O1xuXG4gICAgY29uc3QgdG9nZ2xlQ2FsbGJhY2tHcmFwaCA9ICgpID0+IHtcbiAgICAgICAgc2V0UG9wdXAocG9wdXAgPT0gJ2NhbGxiYWNrR3JhcGgnID8gbnVsbCA6ICdjYWxsYmFja0dyYXBoJyk7XG4gICAgfTtcblxuICAgIGNvbnN0IHRvZ2dsZUNvbGxhcHNlZCA9ICgpID0+IHtcbiAgICAgICAgc2V0Q29sbGFwc2VkKCFjb2xsYXBzZWQpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2Rhc2hfZGVidWdfbWVudV9jb2xsYXBzZWQnLCAhY29sbGFwc2VkKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gSWYgbG9jYWxTdG9yYWdlIGlzIG5vdCBhdmFpbGFibGUsIGRvIG5vdGhpbmdcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBlcnJvcnMgPSBjb25jYXQoZXJyb3IuZnJvbnRFbmQsIGVycm9yLmJhY2tFbmQpO1xuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKGVycm9ycy5sZW5ndGggJiYgcG9wdXAgIT09ICdlcnJvcnMnKSB7XG4gICAgICAgICAgICBzZXRQb3B1cCgnZXJyb3JzJyk7XG4gICAgICAgIH1cbiAgICB9LCBbZXJyb3JdKTtcblxuICAgIGNvbnN0IHBvcHVwQ29udGVudCA9IChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtZGVidWctbWVudV9fcG9wdXAnPlxuICAgICAgICAgICAge3BvcHVwID09ICdjYWxsYmFja0dyYXBoJyA/IDxDYWxsYmFja0dyYXBoQ29udGFpbmVyIC8+IDogdW5kZWZpbmVkfVxuICAgICAgICAgICAge3BvcHVwID09ICdlcnJvcnMnICYmIGVyckNvdW50ID4gMCA/IChcbiAgICAgICAgICAgICAgICA8RnJvbnRFbmRFcnJvckNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICBjbGlja0hhbmRsZXI9e3RvZ2dsZUVycm9yc31cbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzPXtlcnJvcnN9XG4gICAgICAgICAgICAgICAgICAgIGNvbm5lY3RlZD17ZXJyb3IuYmFja0VuZENvbm5lY3RlZH1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKSA6IHVuZGVmaW5lZH1cbiAgICAgICAgPC9kaXY+XG4gICAgKTtcblxuICAgIGNvbnN0IG1lbnVDb250ZW50ID0gY29sbGFwc2VkID8gdW5kZWZpbmVkIDogKFxuICAgICAgICA8TWVudUNvbnRlbnRcbiAgICAgICAgICAgIHBvcHVwPXtwb3B1cH1cbiAgICAgICAgICAgIGVyckNvdW50PXtlcnJDb3VudH1cbiAgICAgICAgICAgIHRvZ2dsZUVycm9ycz17dG9nZ2xlRXJyb3JzfVxuICAgICAgICAgICAgdG9nZ2xlQ2FsbGJhY2tHcmFwaD17dG9nZ2xlQ2FsbGJhY2tHcmFwaH1cbiAgICAgICAgICAgIGNvbmZpZz17Y29uZmlnfVxuICAgICAgICAgICAgaG90UmVsb2FkPXtob3RSZWxvYWR9XG4gICAgICAgICAgICBjb25uZWN0ZWQ9e2Nvbm5lY3RlZH1cbiAgICAgICAgLz5cbiAgICApO1xuXG4gICAgcmV0dXJuIChcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzZXMoXG4gICAgICAgICAgICAgICAgICAgICdkYXNoLWRlYnVnLW1lbnVfX291dGVyJyxcbiAgICAgICAgICAgICAgICAgICAgY29sbGFwc2VkID8gJ2NvbGxhcHNlZCcgOiAnZXhwYW5kZWQnXG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7cG9wdXBDb250ZW50fVxuICAgICAgICAgICAgICAgIHttZW51Q29udGVudH1cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RvZ2dsZUNvbGxhcHNlZH1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc2VzKFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2Rhc2gtZGVidWctbWVudV9fdG9nZ2xlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlZCA/ICdjb2xsYXBzZWQnIDogJ2V4cGFuZGVkJ1xuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPEV4cGFuZCAvPlxuICAgICAgICAgICAgICAgICAgICB7ZXJyQ291bnQgPiAwICYmIGNvbGxhcHNlZCA/IChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdkYXNoLWRlYnVnLW1lbnVfX2Vycm9yLWluZGljYXRvcicgLz5cbiAgICAgICAgICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIHtjaGlsZHJlbn1cbiAgICAgICAgPC9kaXY+XG4gICAgKTtcbn07XG5cbmNvbnN0IERlYnVnTWVudSA9ICh7Y2hpbGRyZW4sIC4uLnByb3BzfSkgPT4ge1xuICAgIHJldHVybiAoXG4gICAgICAgIDxEZXZ0b29sUHJvdmlkZXI+XG4gICAgICAgICAgICA8RGVidWcgey4uLnByb3BzfT57Y2hpbGRyZW59PC9EZWJ1Zz5cbiAgICAgICAgPC9EZXZ0b29sUHJvdmlkZXI+XG4gICAgKTtcbn07XG5cbkRlYnVnTWVudS5wcm9wVHlwZXMgPSB7XG4gICAgY2hpbGRyZW46IFByb3BUeXBlcy5vYmplY3QsXG4gICAgZXJyb3I6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgaG90UmVsb2FkOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBjb25maWc6IFByb3BUeXBlcy5vYmplY3Rcbn07XG5cbmV4cG9ydCB7RGVidWdNZW51fTtcbiIsImltcG9ydCBSZWFjdCwge3VzZUNvbnRleHQsIHVzZU1lbW8sIHVzZVN0YXRlfSBmcm9tICdyZWFjdCc7XG5cbmV4cG9ydCBjb25zdCBEZXZ0b29sQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQoe30pO1xuXG5leHBvcnQgY29uc3QgRGV2dG9vbFByb3ZpZGVyID0gKHtjaGlsZHJlbn0pID0+IHtcbiAgICBjb25zdCBbcG9wdXAsIHNldFBvcHVwXSA9IHVzZVN0YXRlKCcnKTtcblxuICAgIHJldHVybiAoXG4gICAgICAgIDxEZXZ0b29sQ29udGV4dC5Qcm92aWRlclxuICAgICAgICAgICAgdmFsdWU9e3tcbiAgICAgICAgICAgICAgICBwb3B1cCxcbiAgICAgICAgICAgICAgICBzZXRQb3B1cFxuICAgICAgICAgICAgfX1cbiAgICAgICAgPlxuICAgICAgICAgICAge2NoaWxkcmVufVxuICAgICAgICA8L0RldnRvb2xDb250ZXh0LlByb3ZpZGVyPlxuICAgICk7XG59O1xuXG5leHBvcnQgY29uc3QgdXNlRGV2dG9vbCA9ICgpID0+IHtcbiAgICByZXR1cm4gdXNlQ29udGV4dChEZXZ0b29sQ29udGV4dCk7XG59O1xuXG5leHBvcnQgY29uc3QgdXNlRGV2dG9vbE1lbnVCdXR0b25DbGFzc05hbWUgPSBwb3B1cE5hbWUgPT4ge1xuICAgIGNvbnN0IHtwb3B1cH0gPSB1c2VEZXZ0b29sKCk7XG5cbiAgICBjb25zdCBjbGFzc05hbWUgPSB1c2VNZW1vKCgpID0+IHtcbiAgICAgICAgY29uc3QgYmFzZSA9ICdkYXNoLWRlYnVnLW1lbnVfX2J1dHRvbic7XG4gICAgICAgIGlmIChwb3B1cCA9PT0gcG9wdXBOYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gYmFzZSArICcgZGFzaC1kZWJ1Zy1tZW51X19idXR0b24tLXNlbGVjdGVkJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYmFzZTtcbiAgICB9LCBbcG9wdXBdKTtcblxuICAgIHJldHVybiBjbGFzc05hbWU7XG59O1xuIiwiaW1wb3J0IFJlYWN0LCB7dXNlTWVtb30gZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQge3VzZURldnRvb2wsIHVzZURldnRvb2xNZW51QnV0dG9uQ2xhc3NOYW1lfSBmcm9tICcuL0RldnRvb2xDb250ZXh0JztcblxuaW1wb3J0ICcuL1Bsb3RseUNsb3VkLmNzcyc7XG5pbXBvcnQgQ2xvdWRTbGFzaEljb24gZnJvbSAnLi4vaWNvbnMvQ2xvdWRTbGFzaEljb24uc3ZnJztcblxuY29uc3QgQ0xPVURfUE9QVVAgPSAnY2xvdWQnO1xuXG5jb25zdCBQbG90bHlDbG91ZCA9ICgpID0+IHtcbiAgICBjb25zdCB7cG9wdXAsIHNldFBvcHVwfSA9IHVzZURldnRvb2woKTtcblxuICAgIGNvbnN0IGNsYXNzTmFtZSA9IHVzZURldnRvb2xNZW51QnV0dG9uQ2xhc3NOYW1lKENMT1VEX1BPUFVQKTtcblxuICAgIGNvbnN0IGlzT3BlbiA9IHVzZU1lbW8oKCkgPT4gcG9wdXAgPT09IENMT1VEX1BPUFVQLCBbcG9wdXBdKTtcblxuICAgIGNvbnN0IG9uQ2xpY2sgPSAoKSA9PiB7XG4gICAgICAgIGlmIChwb3B1cCA9PT0gQ0xPVURfUE9QVVApIHtcbiAgICAgICAgICAgIHNldFBvcHVwKCcnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNldFBvcHVwKENMT1VEX1BPUFVQKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvbkNvcHkgPSAoKSA9PiB7XG4gICAgICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KCdwaXAgaW5zdGFsbCBcImRhc2hbY2xvdWRdXCInKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIChcbiAgICAgICAgPD5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3NOYW1lPXtjbGFzc05hbWV9IG9uQ2xpY2s9e29uQ2xpY2t9PlxuICAgICAgICAgICAgICAgIDxDbG91ZFNsYXNoSWNvblxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9J2Rhc2gtZGVidWctbWVudV9faWNvbidcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg9ezE2fVxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9ezE2fVxuICAgICAgICAgICAgICAgICAgICBmaWxsPSdjdXJyZW50Q29sb3InXG4gICAgICAgICAgICAgICAgLz57JyAnfVxuICAgICAgICAgICAgICAgIFBsb3RseSBDbG91ZFxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB7aXNPcGVuID8gKFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdwbG90bHktY2xvdWQtbW9kYWwtb3ZlcmxheSc+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdwbG90bHktY2xvdWQtbW9kYWwtY29udGVudCc+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncGxvdGx5LWNsb3VkLW1vZGFsLWhlYWRlcic+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGtleT0nbW9kYWwtdGl0bGUnPlBsb3RseSBDbG91ZDwvaDM+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk9J21vZGFsLWNsb3NlJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9J3Bsb3RseS1jbG91ZC1tb2RhbC1jbG9zZSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0UG9wdXAoJycpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgw5dcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleT0nbW9kYWwtYm9keSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9J3Bsb3RseS1jbG91ZC1tb2RhbC1ib2R5J1xuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RhbGwgdGhlIGV4dGVuc2lvbiB0byBwdWJsaXNoIHRvIFBsb3RseVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbG91ZC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncGxvdGx5LWNsb3VkLWNvcHktaW5zdGFsbCc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnsncGlwIGluc3RhbGwgXCJkYXNoW2Nsb3VkXVwiJ308L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e29uQ29weX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0ncGxvdGx5LWNsb3VkLW1vZGFsLWJ1dHRvbidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29weVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICA8Lz5cbiAgICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgUGxvdGx5Q2xvdWQ7XG4iLCJpbXBvcnQgUmVhY3QsIHt1c2VFZmZlY3QsIHVzZVN0YXRlfSBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCAnLi9WZXJzaW9uSW5mby5jc3MnO1xuXG5jb25zdCBEQVlfSU5fTVMgPSA4NjQwMDAwMDtcblxuZnVuY3Rpb24gY29tcGFyZVZlcnNpb25zKHYxLCB2Mikge1xuICAgIC8vIFJlbW92ZSBhbnkgbm9uLW51bWVyaWMgY2hhcmFjdGVycyBmcm9tIHRoZSB2ZXJzaW9uIHN0cmluZ3NcbiAgICAvLyBhbmQgYW55dGhpbmcgYWZ0ZXIgdGhlbSAoZS5nLiAxLjIuMy1yYy4xIC0+IDEuMi4zLCAxLjIuMytidWlsZC4xIC0+IDEuMi4zKVxuICAgIHYxID0gdjEucmVwbGFjZSgvXFwuP1teMC05Ll0uKiQvLCAnJyk7XG4gICAgdjIgPSB2Mi5yZXBsYWNlKC9cXC4/W14wLTkuXS4qJC8sICcnKTtcblxuICAgIGNvbnN0IHYxUGFydHMgPSB2MS5zcGxpdCgnLicpLm1hcChOdW1iZXIpO1xuICAgIGNvbnN0IHYyUGFydHMgPSB2Mi5zcGxpdCgnLicpLm1hcChOdW1iZXIpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBNYXRoLm1heCh2MVBhcnRzLmxlbmd0aCwgdjJQYXJ0cy5sZW5ndGgpOyBpKyspIHtcbiAgICAgICAgY29uc3QgcGFydDEgPSB2MVBhcnRzW2ldIHx8IDA7XG4gICAgICAgIGNvbnN0IHBhcnQyID0gdjJQYXJ0c1tpXSB8fCAwO1xuXG4gICAgICAgIGlmIChwYXJ0MSA+IHBhcnQyKSByZXR1cm4gMTtcbiAgICAgICAgaWYgKHBhcnQxIDwgcGFydDIpIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVxdWVzdERhc2hWZXJzaW9uSW5mbyhjb25maWcpIHtcbiAgICBjb25zdCB7XG4gICAgICAgIGRhc2hfdmVyc2lvbjogY3VycmVudERhc2hWZXJzaW9uLFxuICAgICAgICBkYXNoX3ZlcnNpb25fdXJsOiBkYXNoVmVyc2lvblVybCxcbiAgICAgICAgcHl0aG9uX3ZlcnNpb246IHB5dGhvblZlcnNpb24sXG4gICAgICAgIGRka192ZXJzaW9uOiBkZGtWZXJzaW9uLFxuICAgICAgICBwbG90bHlfdmVyc2lvbjogcGxvdGx5VmVyc2lvblxuICAgIH0gPSBjb25maWc7XG4gICAgbGV0IGNhY2hlZFZlcnNpb25JbmZvLCBjYWNoZWROZXdEYXNoVmVyc2lvbkxpbmssIGxhc3RGZXRjaGVkO1xuICAgIHRyeSB7XG4gICAgICAgIGNhY2hlZFZlcnNpb25JbmZvID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2NhY2hlZE5ld0Rhc2hWZXJzaW9uJyk7XG4gICAgICAgIGNhY2hlZE5ld0Rhc2hWZXJzaW9uTGluayA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFxuICAgICAgICAgICAgJ2NhY2hlZE5ld0Rhc2hWZXJzaW9uTGluaydcbiAgICAgICAgKTtcbiAgICAgICAgbGFzdEZldGNoZWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbGFzdEZldGNoZWQnKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIElmIGxvY2FsU3RvcmFnZSBpcyBub3QgYXZhaWxhYmxlLCByZXR1cm4gYW4gZW1wdHkgb2JqZWN0XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgICBsYXN0RmV0Y2hlZCAmJlxuICAgICAgICBEYXRlLm5vdygpIC0gTnVtYmVyKGxhc3RGZXRjaGVkKSA8IERBWV9JTl9NUyAmJlxuICAgICAgICBjYWNoZWRWZXJzaW9uSW5mb1xuICAgICkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmVyc2lvbjogSlNPTi5wYXJzZShjYWNoZWRWZXJzaW9uSW5mbyksXG4gICAgICAgICAgICBsaW5rOiBjYWNoZWROZXdEYXNoVmVyc2lvbkxpbmtcbiAgICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHNob3VsZFJlcXVlc3REYXNoVmVyc2lvbihjb25maWcpKSB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7XG4gICAgICAgICAgICBkYXNoX3ZlcnNpb246IGN1cnJlbnREYXNoVmVyc2lvbixcbiAgICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiBweXRob25WZXJzaW9uLFxuICAgICAgICAgICAgZGRrX3ZlcnNpb246IGRka1ZlcnNpb24sXG4gICAgICAgICAgICBwbG90bHlfdmVyc2lvbjogcGxvdGx5VmVyc2lvblxuICAgICAgICB9KS50b1N0cmluZygpO1xuICAgICAgICByZXR1cm4gZmV0Y2goZGFzaFZlcnNpb25VcmwgKyAnPycgKyBxdWVyeVBhcmFtcywge21vZGU6ICdjb3JzJ30pXG4gICAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS5qc29uKCkpXG4gICAgICAgICAgICAudGhlbihib2R5ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoYm9keSAmJiBib2R5LnZlcnNpb24gJiYgYm9keS5saW5rKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2FjaGVkTmV3RGFzaFZlcnNpb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGJvZHkudmVyc2lvbilcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2FjaGVkTmV3RGFzaFZlcnNpb25MaW5rJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5LmxpbmtcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnbGFzdEZldGNoZWQnLCBEYXRlLm5vdygpKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIGVycm9ycyBpZiBsb2NhbFN0b3JhZ2UgaXMgbm90IGF2YWlsYWJsZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBib2R5O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgICAgICB9KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZFJlcXVlc3REYXNoVmVyc2lvbihjb25maWcpIHtcbiAgICAvLyBJZiB2ZXJzaW9uIGNoZWNrIGlzIGRpc2FibGVkLCByZXR1cm4gZmFsc2UgdG8gYXZvaWRcbiAgICAvLyBjaGVja2luZyBsb2NhbFN0b3JhZ2UgdW5uZWNlc3NhcmlseVxuICAgIGlmIChjb25maWcuZGlzYWJsZV92ZXJzaW9uX2NoZWNrKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgbGV0IHNob3dOb3RpZmljYXRpb25zLCBsYXN0RmV0Y2hlZDtcbiAgICB0cnkge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9ucyA9XG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnc2hvd05vdGlmaWNhdGlvbnMnKSAhPT0gJ2ZhbHNlJztcbiAgICAgICAgbGFzdEZldGNoZWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbGFzdEZldGNoZWQnKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIElmIGxvY2FsU3RvcmFnZSBpcyBub3QgYXZhaWxhYmxlLCByZXR1cm4gZmFsc2VcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgICBzaG93Tm90aWZpY2F0aW9ucyAmJlxuICAgICAgICAoIWxhc3RGZXRjaGVkIHx8IERhdGUubm93KCkgLSBOdW1iZXIobGFzdEZldGNoZWQpID4gREFZX0lOX01TKVxuICAgICk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFNob3dVcGdyYWRlTm90aWZpY2F0aW9uKFxuICAgIGN1cnJlbnREYXNoVmVyc2lvbixcbiAgICBuZXdEYXNoVmVyc2lvbixcbiAgICBjb25maWdcbikge1xuICAgIC8vIElmIHZlcnNpb24gY2hlY2sgaXMgZGlzYWJsZWQsIHJldHVybiBmYWxzZSB0byBhdm9pZFxuICAgIC8vIGNoZWNraW5nIGxvY2FsU3RvcmFnZSB1bm5lY2Vzc2FyaWx5XG4gICAgaWYgKGNvbmZpZy5kaXNhYmxlX3ZlcnNpb25fY2hlY2spIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBsZXQgc2hvd05vdGlmaWNhdGlvbnMsIGxhc3REaXNtaXNzZWQsIGxhc3REaXNtaXNzZWRWZXJzaW9uO1xuICAgIHRyeSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb25zID1cbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdzaG93Tm90aWZpY2F0aW9ucycpICE9PSAnZmFsc2UnO1xuICAgICAgICBsYXN0RGlzbWlzc2VkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2xhc3REaXNtaXNzZWQnKTtcbiAgICAgICAgbGFzdERpc21pc3NlZFZlcnNpb24gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbGFzdERpc21pc3NlZFZlcnNpb24nKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIElmIGxvY2FsU3RvcmFnZSBpcyBub3QgYXZhaWxhYmxlLCByZXR1cm4gZmFsc2VcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICAgIG5ld0Rhc2hWZXJzaW9uID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgY29tcGFyZVZlcnNpb25zKGN1cnJlbnREYXNoVmVyc2lvbiwgbmV3RGFzaFZlcnNpb24pID49IDAgfHxcbiAgICAgICAgIXNob3dOb3RpZmljYXRpb25zXG4gICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgICBsYXN0RGlzbWlzc2VkICYmXG4gICAgICAgIERhdGUubm93KCkgLSBOdW1iZXIobGFzdERpc21pc3NlZCkgPiBEQVlfSU5fTVNcbiAgICApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgICAgbGFzdERpc21pc3NlZFZlcnNpb24gJiZcbiAgICAgICAgIWxhc3REaXNtaXNzZWQgJiZcbiAgICAgICAgY29tcGFyZVZlcnNpb25zKGxhc3REaXNtaXNzZWRWZXJzaW9uLCBuZXdEYXNoVmVyc2lvbikgPCAwXG4gICAgKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAhbGFzdERpc21pc3NlZCAmJiAhbGFzdERpc21pc3NlZFZlcnNpb247XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgVmVyc2lvbkluZm8gPSAoe2NvbmZpZ30pID0+IHtcbiAgICBjb25zdCBbbmV3RGFzaFZlcnNpb24sIHNldE5ld0Rhc2hWZXJzaW9uXSA9IHVzZVN0YXRlKHVuZGVmaW5lZCk7XG4gICAgY29uc3QgW25ld0Rhc2hWZXJzaW9uTGluaywgc2V0TmV3RGFzaFZlcnNpb25MaW5rXSA9IHVzZVN0YXRlKHVuZGVmaW5lZCk7XG4gICAgY29uc3QgW3VwZ3JhZGVUb29sdGlwT3BlbmVkLCBzZXRVcGdyYWRlVG9vbHRpcE9wZW5lZF0gPSB1c2VTdGF0ZShmYWxzZSk7XG5cbiAgICBjb25zdCBzZXREb250U2hvd0FnYWluID0gKCkgPT4ge1xuICAgICAgICAvLyBTZXQgbG9jYWwgc3RvcmFnZSB0byByZWNvcmQgdGhlIGxhc3QgZGlzbWlzc2VkIG5vdGlmaWNhdGlvblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3Nob3dOb3RpZmljYXRpb25zJywgZmFsc2UpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBJZ25vcmUgZXJyb3JzIGlmIGxvY2FsU3RvcmFnZSBpcyBub3QgYXZhaWxhYmxlXG4gICAgICAgIH1cbiAgICAgICAgc2V0VXBncmFkZVRvb2x0aXBPcGVuZWQoZmFsc2UpO1xuICAgIH07XG5cbiAgICBjb25zdCBzZXRSZW1pbmRNZUxhdGVyID0gKCkgPT4ge1xuICAgICAgICAvLyBTZXQgbG9jYWwgc3RvcmFnZSB0byByZWNvcmQgdGhlIGxhc3QgZGlzbWlzc2VkIG5vdGlmaWNhdGlvblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2xhc3REaXNtaXNzZWQnLCBEYXRlLm5vdygpKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gSWdub3JlIGVycm9ycyBpZiBsb2NhbFN0b3JhZ2UgaXMgbm90IGF2YWlsYWJsZVxuICAgICAgICB9XG4gICAgICAgIHNldFVwZ3JhZGVUb29sdGlwT3BlbmVkKGZhbHNlKTtcbiAgICB9O1xuXG4gICAgY29uc3Qgc2V0U2tpcFRoaXNWZXJzaW9uID0gKCkgPT4ge1xuICAgICAgICAvLyBTZXQgbG9jYWwgc3RvcmFnZSB0byByZWNvcmQgdGhlIGxhc3QgZGlzbWlzc2VkIHZlcnNpb25cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdsYXN0RGlzbWlzc2VkVmVyc2lvbicsIG5ld0Rhc2hWZXJzaW9uKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gSWdub3JlIGVycm9ycyBpZiBsb2NhbFN0b3JhZ2UgaXMgbm90IGF2YWlsYWJsZVxuICAgICAgICB9XG4gICAgICAgIHNldFVwZ3JhZGVUb29sdGlwT3BlbmVkKGZhbHNlKTtcbiAgICB9O1xuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgcmVxdWVzdERhc2hWZXJzaW9uSW5mbyhjb25maWcpLnRoZW4oYm9keSA9PiB7XG4gICAgICAgICAgICBpZiAoYm9keSkge1xuICAgICAgICAgICAgICAgIHNldE5ld0Rhc2hWZXJzaW9uTGluayhib2R5LmxpbmspO1xuICAgICAgICAgICAgICAgIHNldE5ld0Rhc2hWZXJzaW9uKGJvZHkudmVyc2lvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0sIFtdKTtcblxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGhpZGVVcGdyYWRlVG9vbHRpcCA9IGUgPT4ge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHVwZ3JhZGVUb29sdGlwT3BlbmVkICYmXG4gICAgICAgICAgICAgICAgIWUudGFyZ2V0Lm1hdGNoZXMoXG4gICAgICAgICAgICAgICAgICAgICcuZGFzaC1kZWJ1Zy1tZW51X192ZXJzaW9uLCAuZGFzaC1kZWJ1Zy1tZW51X192ZXJzaW9uIConXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgc2V0VXBncmFkZVRvb2x0aXBPcGVuZWQoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvLyBDbG9zZSB0aGUgdXBncmFkZSB0b29sdGlwIGlmIHRoZSB1c2VyIGNsaWNrcyBvdXRzaWRlIG9mIGl0XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGlkZVVwZ3JhZGVUb29sdGlwKTtcblxuICAgICAgICByZXR1cm4gKCkgPT4gZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoaWRlVXBncmFkZVRvb2x0aXApO1xuICAgIH0sIFt1cGdyYWRlVG9vbHRpcE9wZW5lZF0pO1xuXG4gICAgcmV0dXJuIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtZGVidWctbWVudV9fdmVyc2lvbic+XG4gICAgICAgICAgICB7dXBncmFkZVRvb2x0aXBPcGVuZWQgPyAoXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtZGVidWctbWVudV9fdXBncmFkZS10b29sdGlwJz5cbiAgICAgICAgICAgICAgICAgICAge25ld0Rhc2hWZXJzaW9uTGluayA/IChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxhIHRhcmdldD0nX2JsYW5rJyBocmVmPXtuZXdEYXNoVmVyc2lvbkxpbmt9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWQgZGV0YWlsc1xuICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBvbkNsaWNrPXtzZXRTa2lwVGhpc1ZlcnNpb259PlxuICAgICAgICAgICAgICAgICAgICAgICAgU2tpcCB0aGlzIHZlcnNpb25cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gb25DbGljaz17c2V0UmVtaW5kTWVMYXRlcn0+XG4gICAgICAgICAgICAgICAgICAgICAgICBSZW1pbmQgbWUgdG9tb3Jyb3dcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gb25DbGljaz17c2V0RG9udFNob3dBZ2Fpbn0+XG4gICAgICAgICAgICAgICAgICAgICAgICBTaWxlbmNlIGFsbCB2ZXJzaW9uIG5vdGlmaWNhdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgIDxzcGFuPnZ7Y29uZmlnLmRhc2hfdmVyc2lvbn08L3NwYW4+XG4gICAgICAgICAgICB7c2hvdWxkU2hvd1VwZ3JhZGVOb3RpZmljYXRpb24oXG4gICAgICAgICAgICAgICAgY29uZmlnLmRhc2hfdmVyc2lvbixcbiAgICAgICAgICAgICAgICBuZXdEYXNoVmVyc2lvbixcbiAgICAgICAgICAgICAgICBjb25maWdcbiAgICAgICAgICAgICkgPyAoXG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9J2Rhc2gtZGVidWctbWVudV9fdXBncmFkZS1idXR0b24nXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRVcGdyYWRlVG9vbHRpcE9wZW5lZCghdXBncmFkZVRvb2x0aXBPcGVuZWQpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIERhc2ggdXBkYXRlIGF2YWlsYWJsZSAtIHZ7bmV3RGFzaFZlcnNpb259XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgPC9kaXY+XG4gICAgKTtcbn07XG4iLCIvLyBXZXJremV1ZyBjc3MgaW5jbHVkZWQgYXMgYSBzdHJpbmcsIGJlY2F1c2Ugd2Ugd2FudCB0byBpbmplY3Rcbi8vIGl0IGludG8gYW4gaWZyYW1lIHNyY0RvY1xuXG5leHBvcnQgZGVmYXVsdCBgXG5ib2R5IHtcbiAgICBtYXJnaW46IDBweDtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4udHJhY2ViYWNrIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgICBib3JkZXI6IDJweCBzb2xpZCAjZGZlOGYzO1xuICAgIGJvcmRlci1yYWRpdXM6IDBweCAwcHggNHB4IDRweDtcbiAgICBjb2xvcjogIzUwNjc4NDtcbn1cblxuaDIudHJhY2ViYWNrIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjNmNmZhO1xuICAgIGJvcmRlcjogMnB4IHNvbGlkICNkZmU4ZjM7XG4gICAgYm9yZGVyLWJvdHRvbTogMHB4O1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgYm9yZGVyLXJhZGl1czogNHB4IDRweCAwcHggMHB4O1xuICAgIGNvbG9yOiAjNTA2Nzg0O1xufVxuXG5oMi50cmFjZWJhY2sgZW0ge1xuICAgIGNvbG9yOiAjNTA2Nzg0O1xuICAgIGZvbnQtd2VpZ2h0OiAxMDA7XG59XG5cbi50cmFjZWJhY2sgcHJlLCAuZGVidWdnZXIgdGV4dGFyZWEge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNGM0Y2RkE7XG59XG5cbi5kZWJ1Z2dlciBoMSB7XG4gICAgY29sb3I6ICM1MDY3ODQ7XG4gICAgZm9udC1mYW1pbHk6IFJvYm90bztcbn1cblxuLmV4cGxhbmF0aW9uIHtcbiAgICBjb2xvcjogI0EyQjFDNjtcbn1cblxuLyogSGlkZSB0aGUgRG9uJ3QgUGFuaWMhIGZvb3RlciAqL1xuLmRlYnVnZ2VyIC5mb290ZXIge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbi8qIEhpZGUgYWxsIG9mIHRoZSBEYXNoIHRyYWNlYmFjayBzdHVmZiB0aGF0IGxlYWRzIHVwIHRvIHRoZSBjYWxsICovXG4ubGluZS5iZWZvcmUge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbmRpdi5kZWJ1Z2dlciB7XG4gICAgcGFkZGluZzogMHB4O1xufVxuXG4uZGVidWdnZXIgaDEge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbi5kZWJ1Z2dlciAuZXJyb3Jtc2cge1xuICAgIG1hcmdpbjogMDtcbiAgICBjb2xvcjogIzUwNjc4NDtcbiAgICBmb250LXNpemU6IDE2cHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2YzZjZmYTtcbiAgICBib3JkZXI6IDJweCBzb2xpZCAjZGZlOGYzO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgIHBhZGRpbmc6IDEwcHg7XG59XG5cbi5kZWJ1Z2dlciAucGFzdGVtZXNzYWdlIGlucHV0IHtcbiAgICBkaXNwbGF5OiBub25lO1xufVxuXG4uZGVidWdnZXIgLmV4cGxhbmF0aW9uIHtcbiAgICBkaXNwbGF5OiBub25lO1xufVxuXG4uZGVidWdnZXIgZGl2LnBsYWluIHtcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgYm9yZGVyLXdpZHRoOiAycHg7XG4gICAgY29sb3I6ICM1MDY3ODQ7XG59XG5cbi5wbGFpbiB7XG4gICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbn1cbi5wbGFpbiA+IGZvcm0gPiBwIHtcbiAgICBkaXNwbGF5OiBub25lO1xufVxuLnBsYWluIHByZSB7XG4gICAgcGFkZGluZzogMTVweCAhaW1wb3J0YW50O1xuICAgIG92ZXJmbG93LXg6IHNjcm9sbDtcbn1cblxuLmRlYnVnZ2VyIGRpdi50cmFjZWJhY2sgcHJlIHtcbiAgICBjdXJzb3I6IGRlZmF1bHQ7XG59XG5cbi5kZWJ1Z2dlciAudHJhY2ViYWNrIC5zb3VyY2UgcHJlLmxpbmUgaW1nIHtcbiAgICBkaXNwbGF5OiBub25lO1xufVxuYDtcbiIsImV4cG9ydCBjb25zdCBSRURJUkVDVF9VUklfUEFUSE5BTUUgPSAnL19vYXV0aDIvY2FsbGJhY2snO1xuZXhwb3J0IGNvbnN0IE9BVVRIX0NPT0tJRV9OQU1FID0gJ3Bsb3RseV9vYXV0aF90b2tlbic7XG5leHBvcnQgY29uc3QgSldUX0VYUElSRURfTUVTU0FHRSA9ICdKV1QgRXhwaXJlZCc7XG5cbmV4cG9ydCBjb25zdCBTVEFUVVMgPSB7XG4gICAgT0s6IDIwMCxcbiAgICBQUkVWRU5UX1VQREFURTogMjA0LFxuICAgIC8vIFdlIGFjY2VwdCBib3RoIDQwMCBhbmQgNDAxIGZvciBKV1QgdG9rZW4gZXhwaXJ5IHJlc3BvbnNlcy5cbiAgICAvLyBTb21lIHNlcnZlcnMgdXNlIGNvZGUgNDAwIGZvciBleHBpcmVkIHRva2VucywgYmVjYXVzZVxuICAgIC8vIHRoZXkgcmVzZXJ2ZSA0MDEgZm9yIGNhc2VzIHRoYXQgcmVxdWlyZSB1c2VyIGFjdGlvblxuICAgIEJBRF9SRVFVRVNUOiA0MDAsXG4gICAgVU5BVVRIT1JJWkVEOiA0MDEsXG4gICAgQ0xJRU5UU0lERV9FUlJPUjogJ0NMSUVOVFNJREVfRVJST1InLFxuICAgIE5PX1JFU1BPTlNFOiAnTk9fUkVTUE9OU0UnXG59O1xuXG5leHBvcnQgY29uc3QgU1RBVFVTTUFQID0ge1xuICAgIFtTVEFUVVMuT0tdOiAnU1VDQ0VTUycsXG4gICAgW1NUQVRVUy5QUkVWRU5UX1VQREFURV06ICdOT19VUERBVEUnXG59O1xuIiwiaW1wb3J0IHtoYXMsIGluY2x1ZGVzfSBmcm9tICdyYW1kYSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm9wVHlwZUVycm9ySGFuZGxlcihtZXNzYWdlLCBwcm9wcywgdHlwZSkge1xuICAgIC8qXG4gICAgICogcHJvcFR5cGUgZXJyb3IgbWVzc2FnZXMgYXJlIGNvbnN0cnVjdGVkIGluXG4gICAgICogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3Byb3AtdHlwZXMvYmxvYi92MTUuNy4yL2ZhY3RvcnlXaXRoVHlwZUNoZWNrZXJzLmpzXG4gICAgICogKFZlcnNpb24gMTUuNy4yKVxuICAgICAqXG4gICAgICogUGFyc2UgdGhlc2UgZXhjZXB0aW9uIG9iamVjdHMgdG8gcmVtb3ZlIEpTIHNvdXJjZSBjb2RlIGFuZCBpbXByb3ZlXG4gICAgICogdGhlIGNsYXJpdHkuXG4gICAgICpcbiAgICAgKiBJZiB3cm9uZyBwcm9wIHR5cGUgd2FzIHBhc3NlZCBpbiwgbWVzc2FnZSBsb29rcyBsaWtlOlxuICAgICAqXG4gICAgICogRXJyb3I6IFwiRmFpbGVkIGNvbXBvbmVudCBwcm9wIHR5cGU6IEludmFsaWQgY29tcG9uZW50IHByb3AgYGFuaW1hdGVgIG9mIHR5cGUgYG51bWJlcmAgc3VwcGxpZWQgdG8gYGZ1bmN0aW9uIEdyYXBoV2l0aERlZmF1bHRzKHByb3BzKSB7XG4gICAgICogICB2YXIgaWQgPSBwcm9wcy5pZCA/IHByb3BzLmlkIDogZ2VuZXJhdGVJZCgpO1xuICAgICAqICAgcmV0dXJuIHJlYWN0X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19fZGVmYXVsdC5hLmNyZWF0ZUVsZW1lbnQoUGxvdGx5R3JhcGgsIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgICAqICAgICBpZDogaWRcbiAgICAgKiAgIH0pKTtcbiAgICAgKiB9YCwgZXhwZWN0ZWQgYGJvb2xlYW5gLlwiXG4gICAgICpcbiAgICAgKlxuICAgICAqIElmIGEgcmVxdWlyZWQgcHJvcCB0eXBlIHdhcyBvbWl0dGVkLCBtZXNzYWdlIGxvb2tzIGxpa2U6XG4gICAgICpcbiAgICAgKiBcIkZhaWxlZCBjb21wb25lbnQgcHJvcCB0eXBlOiBUaGUgY29tcG9uZW50IHByb3AgYG9wdGlvbnNbMF0udmFsdWVgIGlzIG1hcmtlZCBhcyByZXF1aXJlZCBpbiBgZnVuY3Rpb24gQ2hlY2tsaXN0KHByb3BzKSB7XG4gICAgICogICAgdmFyIF90aGlzO1xuICAgICAqXG4gICAgICogICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENoZWNrbGlzdCk7XG4gICAgICpcbiAgICAgKiAgICAgX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfZ2V0UHJvdG90eXBlT2YoQ2hlY2tsaXN0KS5jYWxsKHRoaXMsIHByb3BzKSk7XG4gICAgICogICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAqICAgICAgIHZhbHVlczogcHJvcHMudmFsdWVzXG4gICAgICogICAgIH07XG4gICAgICogICAgIHJldHVybiBfdGhpcztcbiAgICAgKiAgIH1gLCBidXQgaXRzIHZhbHVlIGlzIGB1bmRlZmluZWRgLlwiXG4gICAgICpcbiAgICAgKi9cblxuICAgIGNvbnN0IG1lc3NhZ2VQYXJ0cyA9IG1lc3NhZ2Uuc3BsaXQoJ2AnKTtcbiAgICBsZXQgZXJyb3JNZXNzYWdlO1xuICAgIGlmIChpbmNsdWRlcygnaXMgbWFya2VkIGFzIHJlcXVpcmVkJywgbWVzc2FnZSkpIHtcbiAgICAgICAgY29uc3QgaW52YWxpZFByb3BQYXRoID0gbWVzc2FnZVBhcnRzWzFdO1xuICAgICAgICBlcnJvck1lc3NhZ2UgPSBgJHtpbnZhbGlkUHJvcFBhdGh9IGluICR7dHlwZX1gO1xuICAgICAgICBpZiAocHJvcHMuaWQpIHtcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZSArPSBgIHdpdGggSUQgXCIke3Byb3BzLmlkfVwiYDtcbiAgICAgICAgfVxuICAgICAgICBlcnJvck1lc3NhZ2UgKz0gJyBpcyByZXF1aXJlZCBidXQgaXQgd2FzIG5vdCBwcm92aWRlZC4nO1xuICAgIH0gZWxzZSBpZiAoaW5jbHVkZXMoJ0JhZCBvYmplY3QnLCBtZXNzYWdlKSkge1xuICAgICAgICAvKlxuICAgICAgICAgKiBIYW5kbGUgLmV4YWN0IGVycm9yc1xuICAgICAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcHJvcC10eXBlcy9ibG9iL3YxNS43LjIvZmFjdG9yeVdpdGhUeXBlQ2hlY2tlcnMuanMjTDQzOC1MNDQyXG4gICAgICAgICAqL1xuICAgICAgICBlcnJvck1lc3NhZ2UgPVxuICAgICAgICAgICAgbWVzc2FnZS5zcGxpdCgnc3VwcGxpZWQgdG8gJylbMF0gK1xuICAgICAgICAgICAgYHN1cHBsaWVkIHRvICR7dHlwZX1gICtcbiAgICAgICAgICAgICcuXFxuQmFkJyArXG4gICAgICAgICAgICBtZXNzYWdlLnNwbGl0KCcuXFxuQmFkJylbMV07XG4gICAgfSBlbHNlIGlmIChcbiAgICAgICAgaW5jbHVkZXMoJ0ludmFsaWQgJywgbWVzc2FnZSkgJiZcbiAgICAgICAgaW5jbHVkZXMoJyBzdXBwbGllZCB0byAnLCBtZXNzYWdlKVxuICAgICkge1xuICAgICAgICBjb25zdCBpbnZhbGlkUHJvcFBhdGggPSBtZXNzYWdlUGFydHNbMV07XG5cbiAgICAgICAgZXJyb3JNZXNzYWdlID0gYEludmFsaWQgYXJndW1lbnQgXFxgJHtpbnZhbGlkUHJvcFBhdGh9XFxgIHBhc3NlZCBpbnRvICR7dHlwZX1gO1xuICAgICAgICBpZiAocHJvcHMuaWQpIHtcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZSArPSBgIHdpdGggSUQgXCIke3Byb3BzLmlkfVwiYDtcbiAgICAgICAgfVxuICAgICAgICBlcnJvck1lc3NhZ2UgKz0gJy4nO1xuXG4gICAgICAgIC8qXG4gICAgICAgICAqIE5vdCBhbGwgZXJyb3IgbWVzc2FnZXMgaW5jbHVkZSB0aGUgZXhwZWN0ZWQgdmFsdWUuXG4gICAgICAgICAqIEluIHBhcnRpY3VsYXIsIG9uZU9mVHlwZS5cbiAgICAgICAgICogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3Byb3AtdHlwZXMvYmxvYi92MTUuNy4yL2ZhY3RvcnlXaXRoVHlwZUNoZWNrZXJzLmpzI0wzODhcbiAgICAgICAgICovXG4gICAgICAgIGlmIChpbmNsdWRlcygnLCBleHBlY3RlZCAnLCBtZXNzYWdlKSkge1xuICAgICAgICAgICAgY29uc3QgZXhwZWN0ZWRQcm9wVHlwZSA9IG1lc3NhZ2Uuc3BsaXQoJywgZXhwZWN0ZWQgJylbMV07XG4gICAgICAgICAgICBlcnJvck1lc3NhZ2UgKz0gYFxcbkV4cGVjdGVkICR7ZXhwZWN0ZWRQcm9wVHlwZX1gO1xuICAgICAgICB9XG5cbiAgICAgICAgLypcbiAgICAgICAgICogTm90IGFsbCBlcnJvciBtZXNzYWdlcyBpbmNsdWRlIHRoZSB0eXBlXG4gICAgICAgICAqIEluIHBhcnRpY3VsYXIsIG9uZU9mVHlwZS5cbiAgICAgICAgICogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3Byb3AtdHlwZXMvYmxvYi92MTUuNy4yL2ZhY3RvcnlXaXRoVHlwZUNoZWNrZXJzLmpzI0wzODhcbiAgICAgICAgICovXG4gICAgICAgIGlmIChpbmNsdWRlcygnIG9mIHR5cGUgYCcsIG1lc3NhZ2UpKSB7XG4gICAgICAgICAgICBjb25zdCBpbnZhbGlkUHJvcFR5cGVQcm92aWRlZCA9IG1lc3NhZ2VcbiAgICAgICAgICAgICAgICAuc3BsaXQoJyBvZiB0eXBlIGAnKVsxXVxuICAgICAgICAgICAgICAgIC5zcGxpdCgnYCcpWzBdO1xuICAgICAgICAgICAgZXJyb3JNZXNzYWdlICs9IGBcXG5XYXMgc3VwcGxpZWQgdHlwZSBcXGAke2ludmFsaWRQcm9wVHlwZVByb3ZpZGVkfVxcYC5gO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhcyhpbnZhbGlkUHJvcFBhdGgsIHByb3BzKSkge1xuICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAqIGludmFsaWRQcm9wUGF0aCBtYXkgYmUgbmVzdGVkIGxpa2UgYG9wdGlvbnNbMF0udmFsdWVgLlxuICAgICAgICAgICAgICogRm9yIG5vdywgd2Ugd29uJ3QgdHJ5IHRvIHVucGFjayB0aGVzZSBuZXN0ZWQgb3B0aW9uc1xuICAgICAgICAgICAgICogYnV0IHdlIGNvdWxkIGluIHRoZSBmdXR1cmUuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGNvbnN0IGpzb25TdXBwbGllZFZhbHVlID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAgICAgcHJvcHNbaW52YWxpZFByb3BQYXRoXSxcbiAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgIDJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoanNvblN1cHBsaWVkVmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5jbHVkZXMoJ1xcbicsIGpzb25TdXBwbGllZFZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgKz0gYFxcblZhbHVlIHByb3ZpZGVkOiBcXG4ke2pzb25TdXBwbGllZFZhbHVlfWA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlICs9IGBcXG5WYWx1ZSBwcm92aWRlZDogJHtqc29uU3VwcGxpZWRWYWx1ZX1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIC8qXG4gICAgICAgICAqIE5vdCBhd2FyZSBvZiBvdGhlciBwcm9wIHR5cGUgd2FybmluZyBtZXNzYWdlcy5cbiAgICAgICAgICogQnV0LCBpZiB0aGV5IGV4aXN0LCB0aGVuIGF0IGxlYXN0IHRocm93IHRoZSBkZWZhdWx0XG4gICAgICAgICAqIHJlYWN0IHByb3AgdHlwZXMgZXJyb3JcbiAgICAgICAgICovXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbn1cbiIsImltcG9ydCB7aW5jbHVkZXMsIHR5cGV9IGZyb20gJ3JhbWRhJztcblxuY29uc3QgU0lNUExFX0NPTVBPTkVOVF9UWVBFUyA9IFsnU3RyaW5nJywgJ051bWJlcicsICdOdWxsJywgJ0Jvb2xlYW4nXTtcblxuZXhwb3J0IGRlZmF1bHQgY29tcG9uZW50ID0+IGluY2x1ZGVzKHR5cGUoY29tcG9uZW50KSwgU0lNUExFX0NPTVBPTkVOVF9UWVBFUyk7XG4iLCIvKipcbiAqIEdlbmVyYWxpemVkIHBlcnNpc3RlbmNlIGZvciBjb21wb25lbnQgcHJvcHNcbiAqXG4gKiBXaGVuIHVzZXJzIGlucHV0IG5ldyBwcm9wIHZhbHVlcywgdGhleSBjYW4gYmUgc3RvcmVkIGFuZCByZWFwcGxpZWQgbGF0ZXIsXG4gKiB3aGVuIHRoZSBjb21wb25lbnQgaXMgcmVjcmVhdGVkIChjaGFuZ2luZyBgVGFiYCBmb3IgZXhhbXBsZSkgb3Igd2hlbiB0aGVcbiAqIHBhZ2UgaXMgcmVsb2FkZWQgKGRlcGVuZGluZyBvbiBgcGVyc2lzdGVuY2VfdHlwZWApLiBTdG9yYWdlIGlzIHRpZWQgdG9cbiAqIGNvbXBvbmVudCBJRCwgYW5kIHRoZSBwcm9wIHZhbHVlcyB3aWxsIG5vdCBiZSBzdG9yZWQgd2l0aCBjb21wb25lbnRzXG4gKiB3aXRob3V0IGFuIElELlxuICpcbiAqIFJlbmRlcmVyIGhhbmRsZXMgdGhlIG1lY2hhbmljcywgYnV0IGNvbXBvbmVudHMgbXVzdCBkZWZpbmUgYSBmZXcgcHJvcHM6XG4gKlxuICogLSBgcGVyc2lzdGVuY2VgOiBib29sZWFuLCBzdHJpbmcsIG9yIG51bWJlci4gRm9yIHNpbXBsZSB1c2FnZSwgc2V0IHRvIGB0cnVlYFxuICogICB0byBlbmFibGUgcGVyc2lzdGVuY2UsIG9taXQgb3Igc2V0IGBmYWxzZWAgdG8gZGlzYWJsZS4gRm9yIG1vcmUgY29tcGxleFxuICogICBzY2VuYXJpb3MsIHVzZSBhbnkgdHJ1dGh5IHZhbHVlLCBhbmQgY2hhbmdlIHRvIGEgKmRpZmZlcmVudCogdHJ1dGh5IHZhbHVlXG4gKiAgIHdoZW4geW91IHdhbnQgdGhlIHBlcnNpc3RlZCB2YWx1ZXMgY2xlYXJlZC4gKG1vZGVsZWQgb2ZmIGB1aXJldmlzaW9uYCBpbilcbiAqICAgcGxvdGx5LmpzXG4gKiAgIFR5cGljYWxseSBzaG91bGQgaGF2ZSBubyBkZWZhdWx0LCBidXQgdGhlIG90aGVyIHBlcnNpc3RlbmNlIHByb3BzIHNob3VsZFxuICogICBoYXZlIGRlZmF1bHRzLCBzbyBhbGwgYSB1c2VyIG5lZWRzIHRvIGRvIHRvIGVuYWJsZSBwZXJzaXN0ZW5jZSBpcyBzZXQgdGhpc1xuICogICBvbmUgcHJvcC5cbiAqXG4gKiAtIGBwZXJzaXN0ZWRfcHJvcHNgOiBhcnJheSBvZiBwcm9wIG5hbWVzIG9yIFwibmVzdGVkIHByb3AgSURzXCIgYWxsb3dlZCB0b1xuICogICBwZXJzaXN0LiBOb3JtYWxseSBzaG91bGQgZGVmYXVsdCB0byB0aGUgZnVsbCBsaXN0IG9mIHN1cHBvcnRlZCBwcm9wcyxcbiAqICAgc28gdGhleSBjYW4gYWxsIGJlIGVuYWJsZWQgYXQgb25jZS4gVGhlIG1haW4gZXhjZXB0aW9uIHRvIHRoaXMgaXMgaWZcbiAqICAgdGhlcmUncyBhIHByb3AgdGhhdCAqY2FuKiBiZSBwZXJzaXN0ZWQgYnV0IG1vc3QgdXNlcnMgd291bGRuJ3Qgd2FudCB0aGlzLlxuICogICBBIG5lc3RlZCBwcm9wIElEIGRlc2NyaWJlcyAqcGFydCogb2YgYSBwcm9wIHRvIHN0b3JlLiBJdCBtdXN0IGJlXG4gKiAgIFwiPHByb3BOYW1lPi48cGllY2U+XCIgd2hlcmUgcHJvcE5hbWUgaXMgdGhlIHByb3AgdGhhdCBoYXMgdGhpcyBpbmZvLCBhbmRcbiAqICAgcGllY2UgbWF5IG9yIG1heSBub3QgbWFwIHRvIHRoZSBleGFjdCBzdWJzdHJ1Y3R1cmUgYmVpbmcgc3RvcmVkIGJ1dCBpc1xuICogICBtZWFuaW5nZnVsIHRvIHRoZSB1c2VyLiBGb3IgZXhhbXBsZSwgaW4gYGRhc2hfdGFibGVgLCBgY29sdW1ucy5uYW1lYFxuICogICBzdG9yZXMgYGNvbHVtbnNbaV0ubmFtZWAgZm9yIGFsbCBjb2x1bW5zIGBpYC4gTmVzdGVkIHByb3BzIGFsc28gbmVlZFxuICogICBlbnRyaWVzIGluIGBwZXJzaXN0ZW5jZVRyYW5zZm9ybXNgIC0gc2VlIGJlbG93LlxuICpcbiAqIC0gYHBlcnNpc3RlbmNlX3R5cGVgOiBvbmUgb2YgXCJsb2NhbFwiLCBcInNlc3Npb25cIiwgb3IgXCJtZW1vcnlcIiwganVzdCBsaWtlXG4gKiAgIGBkY2MuU3RvcmVgLiBCdXQgdGhlIGRlZmF1bHQgaGVyZSBzaG91bGQgYmUgXCJsb2NhbFwiIGJlY2F1c2UgdGhlIG1haW4gdXNlXG4gKiAgIGNhc2UgaXMgdG8gbWFpbnRhaW4gc2V0dGluZ3MgYWNyb3NzIHJlbG9hZHMuXG4gKlxuICogSWYgYW55IGBwZXJzaXN0ZWRfcHJvcHNgIGFyZSBuZXN0ZWQgcHJvcCBJRHMsIHRoZSBjb21wb25lbnQgc2hvdWxkIGRlZmluZSBhXG4gKiBjbGFzcyBwcm9wZXJ0eSAobm90IGEgUmVhY3QgcHJvcCkgYHBlcnNpc3RlbmNlVHJhbnNmb3Jtc2AsIGFzIGFuIG9iamVjdDpcbiAqIHtcbiAqICAgW3Byb3BOYW1lXToge1xuICogICAgIFtwaWVjZV06IHtcbiAqICAgICAgIGV4dHJhY3Q6IHByb3BWYWx1ZSA9PiB2YWx1ZVRvU3RvcmUsXG4gKiAgICAgICBhcHBseTogKHN0b3JlZFZhbHVlLCBwcm9wVmFsdWUpID0+IG5ld1Byb3BWYWx1ZVxuICogICAgIH1cbiAqICAgfVxuICogfVxuICogLSBgZXh0cmFjdGAgdHVybnMgYSBwcm9wIHZhbHVlIGludG8gYSByZWR1Y2VkIHZhbHVlIHRvIHN0b3JlLlxuICogLSBgYXBwbHlgIHB1dHMgYW4gZXh0cmFjdGVkIHZhbHVlIGJhY2sgaW50byB0aGUgcHJvcC4gTWFrZSBzdXJlIHRoaXMgY3JlYXRlc1xuICogICBhIG5ldyBvYmplY3QgcmF0aGVyIHRoYW4gbXV0YXRpbmcgYHByb1ZhbHVlYCwgYW5kIHRoYXQgaWYgdGhlcmUgYXJlXG4gKiAgIG11bHRpcGxlIGBwaWVjZWAgZW50cmllcyBmb3Igb25lIGBwcm9wTmFtZWAsIHRoZWlyIGBhcHBseWAgZnVuY3Rpb25zXG4gKiAgIGNvbW11dGUgLSB3aGljaCBzaG91bGQgbm90IGJlIGFuIGlzc3VlIGlmIHRoZXkgZXh0cmFjdCBhbmQgYXBwbHlcbiAqICAgbm9uLWludGVyc2VjdGluZyBwYXJ0cyBvZiB0aGUgZnVsbCBwcm9wLlxuICogWW91IG9ubHkgbmVlZCB0byBkZWZpbmUgdGhlc2UgZm9yIHRoZSBwcm9wcyB0aGF0IG5lZWQgdGhlbS5cbiAqIEl0J3MgaW1wb3J0YW50IHRoYXQgYGV4dHJhY3RgIHB1bGxzIG91dCAqb25seSogdGhlIHJlbGV2YW50IHBpZWNlcyBvZiB0aGVcbiAqIHByb3AsIGJlY2F1c2UgcGVyc2lzdGVuY2UgaXMgb25seSBtYWludGFpbmVkIGlmIHRoZSBleHRyYWN0ZWQgdmFsdWUgb2YgdGhlXG4gKiBwcm9wIGJlZm9yZSBhcHBseWluZyBwZXJzaXN0ZW5jZSBpcyB0aGUgc2FtZSBhcyBpdCB3YXMgYmVmb3JlIHRoZSB1c2VyJ3NcbiAqIGNoYW5nZXMuXG4gKi9cblxuaW1wb3J0IHtcbiAgICBlcXVhbHMsXG4gICAgZmlsdGVyLFxuICAgIGZvckVhY2gsXG4gICAga2V5cyxcbiAgICBsZW5zUGF0aCxcbiAgICBtZXJnZVJpZ2h0LFxuICAgIHNldCxcbiAgICB0eXBlXG59IGZyb20gJ3JhbWRhJztcbmltcG9ydCB7Y3JlYXRlQWN0aW9ufSBmcm9tICdyZWR1eC1hY3Rpb25zJztcblxuaW1wb3J0IFJlZ2lzdHJ5IGZyb20gJy4vcmVnaXN0cnknO1xuaW1wb3J0IHtzdHJpbmdpZnlJZH0gZnJvbSAnLi9hY3Rpb25zL2RlcGVuZGVuY2llcyc7XG5pbXBvcnQge2lzVW50b3VjaGVkQnlQYXRjaH0gZnJvbSAnLi9hY3Rpb25zL3BhdGNoQW5hbHlzaXMnO1xuaW1wb3J0IHtpc0RyeUNvbXBvbmVudH0gZnJvbSAnLi93cmFwcGVyL3dyYXBwaW5nJztcblxuZXhwb3J0IGNvbnN0IHN0b3JlUHJlZml4ID0gJ19kYXNoX3BlcnNpc3RlbmNlLic7XG5cbmZ1bmN0aW9uIGVycihlKSB7XG4gICAgY29uc3QgZXJyb3IgPSB0eXBlb2YgZSA9PT0gJ3N0cmluZycgPyBuZXcgRXJyb3IoZSkgOiBlO1xuXG4gICAgcmV0dXJuIGNyZWF0ZUFjdGlvbignT05fRVJST1InKSh7XG4gICAgICAgIHR5cGU6ICdmcm9udEVuZCcsXG4gICAgICAgIGVycm9yXG4gICAgfSk7XG59XG5cbi8qXG4gKiBEb2VzIGEga2V5IGZpdCB0aGlzIHByZWZpeD8gTXVzdCBlaXRoZXIgYmUgYW4gZXhhY3QgbWF0Y2hcbiAqIG9yLCBpZiBhIHNlcGFyYXRvciBpcyBwcm92aWRlZCwgYSBzY29wZWQgbWF0Y2ggLSBleGFjdCBwcmVmaXhcbiAqIGZvbGxvd2VkIGJ5IHRoZSBzZXBhcmF0b3IgKHRoZW4gYW55dGhpbmcgZWxzZSlcbiAqL1xuZnVuY3Rpb24ga2V5UHJlZml4TWF0Y2gocHJlZml4LCBzZXBhcmF0b3IpIHtcbiAgICBjb25zdCBmdWxsU3RyID0gcHJlZml4ICsgc2VwYXJhdG9yO1xuICAgIGNvbnN0IGZ1bGxMZW4gPSBmdWxsU3RyLmxlbmd0aDtcbiAgICByZXR1cm4ga2V5ID0+IGtleSA9PT0gcHJlZml4IHx8IGtleS5zdWJzdHIoMCwgZnVsbExlbikgPT09IGZ1bGxTdHI7XG59XG5cbmNvbnN0IFVOREVGSU5FRCA9ICdVJztcbmNvbnN0IF9wYXJzZSA9IHZhbCA9PiAodmFsID09PSBVTkRFRklORUQgPyB1bmRlZmluZWQgOiBKU09OLnBhcnNlKHZhbCB8fCBudWxsKSk7XG5jb25zdCBfc3RyaW5naWZ5ID0gdmFsID0+ICh2YWwgPT09IHVuZGVmaW5lZCA/IFVOREVGSU5FRCA6IEpTT04uc3RyaW5naWZ5KHZhbCkpO1xuXG5jbGFzcyBXZWJTdG9yZSB7XG4gICAgY29uc3RydWN0b3IoYmFja0VuZCkge1xuICAgICAgICB0aGlzLl9uYW1lID0gYmFja0VuZDtcbiAgICAgICAgdGhpcy5fc3RvcmFnZSA9IHdpbmRvd1tiYWNrRW5kXTtcbiAgICB9XG5cbiAgICBoYXNJdGVtKGtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RvcmFnZS5nZXRJdGVtKHN0b3JlUHJlZml4ICsga2V5KSAhPT0gbnVsbDtcbiAgICB9XG5cbiAgICBnZXRJdGVtKGtleSkge1xuICAgICAgICAvLyBub3RlOiBfc3RvcmFnZS5nZXRJdGVtIHJldHVybnMgbnVsbCBvbiBtaXNzaW5nIGtleXNcbiAgICAgICAgLy8gYW5kIEpTT04ucGFyc2UobnVsbCkgcmV0dXJucyBudWxsIGFzIHdlbGxcbiAgICAgICAgcmV0dXJuIF9wYXJzZSh0aGlzLl9zdG9yYWdlLmdldEl0ZW0oc3RvcmVQcmVmaXggKyBrZXkpKTtcbiAgICB9XG5cbiAgICBfc2V0SXRlbShrZXksIHZhbHVlKSB7XG4gICAgICAgIC8vIHVucHJvdGVjdGVkIHZlcnNpb24gb2Ygc2V0SXRlbSwgZm9yIHVzZSBieSB0cnlHZXRXZWJTdG9yZVxuICAgICAgICB0aGlzLl9zdG9yYWdlLnNldEl0ZW0oc3RvcmVQcmVmaXggKyBrZXksIF9zdHJpbmdpZnkodmFsdWUpKTtcbiAgICB9XG4gICAgLypcbiAgICAgKiBJbiBhZGRpdGlvbiB0byB0aGUgcmVndWxhciBrZXktPnZhbHVlIHRvIHNldCwgc2V0SXRlbSB0YWtlc1xuICAgICAqIGRpc3BhdGNoIGFzIGEgcGFyYW1ldGVyLCBzbyBpdCBjYW4gcmVwb3J0IE9PTSB0byBkZXZ0b29sc1xuICAgICAqL1xuICAgIHNldEl0ZW0oa2V5LCB2YWx1ZSwgZGlzcGF0Y2gpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuX3NldEl0ZW0oa2V5LCB2YWx1ZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoKFxuICAgICAgICAgICAgICAgIGVycihcbiAgICAgICAgICAgICAgICAgICAgYCR7a2V5fSBmYWlsZWQgdG8gc2F2ZSBpbiAke3RoaXMuX25hbWV9LiBQZXJzaXN0ZWQgcHJvcHMgbWF5IGJlIGxvc3QuYFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvLyBUT0RPOiBhdCBzb21lIHBvaW50IHdlIG1heSB3YW50IHRvIGNvbnZlcnQgdGhpcyB0byBmYWxsIGJhY2tcbiAgICAgICAgICAgIC8vIG9uIG1lbW9yeSwgcHVsbGluZyBvdXQgYWxsIHBlcnNpc3RlbmNlIGtleXMgYW5kIHB1dHRpbmcgdGhlbVxuICAgICAgICAgICAgLy8gaW4gYSBNZW1TdG9yZSB0aGF0IGdldHMgdXNlZCBmcm9tIHRoZW4gb253YXJkLlxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVtb3ZlSXRlbShrZXkpIHtcbiAgICAgICAgdGhpcy5fc3RvcmFnZS5yZW1vdmVJdGVtKHN0b3JlUHJlZml4ICsga2V5KTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIGNsZWFyIG1hdGNoaW5nIGtleXMgbWF0Y2hpbmcgKG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgYSBkb3QgYW5kIG1vcmVcbiAgICAgKiBjaGFyYWN0ZXJzKSAtIG9yIGFsbCBrZXlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN0b3JlIGlmIG5vIHByZWZpeC5cbiAgICAgKi9cbiAgICBjbGVhcihrZXlQcmVmaXgpIHtcbiAgICAgICAgY29uc3QgZnVsbFByZWZpeCA9IHN0b3JlUHJlZml4ICsgKGtleVByZWZpeCB8fCAnJyk7XG4gICAgICAgIGNvbnN0IGtleU1hdGNoID0ga2V5UHJlZml4TWF0Y2goZnVsbFByZWZpeCwga2V5UHJlZml4ID8gJy4nIDogJycpO1xuICAgICAgICBjb25zdCBrZXlzVG9SZW1vdmUgPSBbXTtcbiAgICAgICAgLy8gMi1zdGVwIHByb2Nlc3MsIHNvIHdlIGRvbid0IGRlcGVuZCBvbiBhbnkgcGFydGljdWxhciBiZWhhdmlvciBvZlxuICAgICAgICAvLyBrZXkgb3JkZXIgd2hpbGUgcmVtb3Zpbmcgc29tZVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX3N0b3JhZ2UubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGZ1bGxLZXkgPSB0aGlzLl9zdG9yYWdlLmtleShpKTtcbiAgICAgICAgICAgIGlmIChrZXlNYXRjaChmdWxsS2V5KSkge1xuICAgICAgICAgICAgICAgIGtleXNUb1JlbW92ZS5wdXNoKGZ1bGxLZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvckVhY2goayA9PiB0aGlzLl9zdG9yYWdlLnJlbW92ZUl0ZW0oayksIGtleXNUb1JlbW92ZSk7XG4gICAgfVxufVxuXG5jbGFzcyBNZW1TdG9yZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX2RhdGEgPSB7fTtcbiAgICB9XG5cbiAgICBoYXNJdGVtKGtleSkge1xuICAgICAgICByZXR1cm4ga2V5IGluIHRoaXMuX2RhdGE7XG4gICAgfVxuXG4gICAgZ2V0SXRlbShrZXkpIHtcbiAgICAgICAgLy8gcnVuIHRoaXMgc3RvcmFnZSB0aHJvdWdoIEpTT04gdG9vIHNvIHdlIGtub3cgd2UgZ2V0IGEgZnJlc2ggb2JqZWN0XG4gICAgICAgIC8vIGVhY2ggcmV0cmlldmFsXG4gICAgICAgIHJldHVybiBfcGFyc2UodGhpcy5fZGF0YVtrZXldKTtcbiAgICB9XG5cbiAgICBzZXRJdGVtKGtleSwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5fZGF0YVtrZXldID0gX3N0cmluZ2lmeSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcmVtb3ZlSXRlbShrZXkpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuX2RhdGFba2V5XTtcbiAgICB9XG5cbiAgICBjbGVhcihrZXlQcmVmaXgpIHtcbiAgICAgICAgaWYgKGtleVByZWZpeCkge1xuICAgICAgICAgICAgZm9yRWFjaChcbiAgICAgICAgICAgICAgICBrZXkgPT4gZGVsZXRlIHRoaXMuX2RhdGFba2V5XSxcbiAgICAgICAgICAgICAgICBmaWx0ZXIoa2V5UHJlZml4TWF0Y2goa2V5UHJlZml4LCAnLicpLCBrZXlzKHRoaXMuX2RhdGEpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2RhdGEgPSB7fTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8gTWFrZSBhIHN0cmluZyAyXjE2IGNoYXJhY3RlcnMgbG9uZyAoKjIgYnl0ZXMvY2hhciA9IDEzMGtCKSwgdG8gdGVzdCBzdG9yYWdlLlxuLy8gVGhhdCBzaG91bGQgYmUgcGxlbnR5IGZvciBjb21tb24gcGVyc2lzdGVuY2UgdXNlIGNhc2VzLFxuLy8gd2l0aG91dCBnZXR0aW5nIGFueXdoZXJlIG5lYXIgdHlwaWNhbCBicm93c2VyIGxpbWl0c1xuY29uc3QgcG93ID0gMTY7XG5mdW5jdGlvbiBsb25nU3RyaW5nKCkge1xuICAgIGxldCBzID0gJ1NwYW0nO1xuICAgIGZvciAobGV0IGkgPSAyOyBpIDwgcG93OyBpKyspIHtcbiAgICAgICAgcyArPSBzO1xuICAgIH1cbiAgICByZXR1cm4gcztcbn1cblxuZXhwb3J0IGNvbnN0IHN0b3JlcyA9IHtcbiAgICBtZW1vcnk6IG5ldyBNZW1TdG9yZSgpXG4gICAgLy8gRGVmZXIgdGVzdGluZyAmIG1ha2luZyBsb2NhbC9zZXNzaW9uIHN0b3JlcyB1bnRpbCByZXF1ZXN0ZWQuXG4gICAgLy8gVGhhdCB3YXkgaWYgd2UgaGF2ZSBlcnJvcnMgaGVyZSB0aGV5IGNhbiBzaG93IHVwIGluIGRldnRvb2xzLlxufTtcblxuY29uc3QgYmFja0VuZHMgPSB7XG4gICAgbG9jYWw6ICdsb2NhbFN0b3JhZ2UnLFxuICAgIHNlc3Npb246ICdzZXNzaW9uU3RvcmFnZSdcbn07XG5cbmZ1bmN0aW9uIHRyeUdldFdlYlN0b3JlKGJhY2tFbmQsIGRpc3BhdGNoKSB7XG4gICAgY29uc3Qgc3RvcmUgPSBuZXcgV2ViU3RvcmUoYmFja0VuZCk7XG4gICAgY29uc3QgZmFsbGJhY2tTdG9yZSA9IHN0b3Jlcy5tZW1vcnk7XG4gICAgY29uc3Qgc3RvcmVUZXN0ID0gbG9uZ1N0cmluZygpO1xuICAgIGNvbnN0IHRlc3RLZXkgPSBzdG9yZVByZWZpeCArICd4LngnO1xuICAgIHRyeSB7XG4gICAgICAgIHN0b3JlLl9zZXRJdGVtKHRlc3RLZXksIHN0b3JlVGVzdCk7XG4gICAgICAgIGlmIChzdG9yZS5nZXRJdGVtKHRlc3RLZXkpICE9PSBzdG9yZVRlc3QpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoKFxuICAgICAgICAgICAgICAgIGVycihgJHtiYWNrRW5kfSBpbml0IGZhaWxlZCBzZXQvZ2V0LCBmYWxsaW5nIGJhY2sgdG8gbWVtb3J5YClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gZmFsbGJhY2tTdG9yZTtcbiAgICAgICAgfVxuICAgICAgICBzdG9yZS5yZW1vdmVJdGVtKHRlc3RLZXkpO1xuICAgICAgICByZXR1cm4gc3RvcmU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBkaXNwYXRjaChcbiAgICAgICAgICAgIGVycihgJHtiYWNrRW5kfSBpbml0IGZpcnN0IHRyeSBmYWlsZWQ7IGNsZWFyaW5nIGFuZCByZXRyeWluZ2ApXG4gICAgICAgICk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIHN0b3JlLmNsZWFyKCk7XG4gICAgICAgIHN0b3JlLl9zZXRJdGVtKHRlc3RLZXksIHN0b3JlVGVzdCk7XG4gICAgICAgIGlmIChzdG9yZS5nZXRJdGVtKHRlc3RLZXkpICE9PSBzdG9yZVRlc3QpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbm9wZScpO1xuICAgICAgICB9XG4gICAgICAgIHN0b3JlLnJlbW92ZUl0ZW0odGVzdEtleSk7XG4gICAgICAgIGRpc3BhdGNoKGVycihgJHtiYWNrRW5kfSBpbml0IHNldC9nZXQgc3VjY2VlZGVkIGFmdGVyIGNsZWFyaW5nIWApKTtcbiAgICAgICAgcmV0dXJuIHN0b3JlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgZGlzcGF0Y2goZXJyKGAke2JhY2tFbmR9IGluaXQgc3RpbGwgZmFpbGVkLCBmYWxsaW5nIGJhY2sgdG8gbWVtb3J5YCkpO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2tTdG9yZTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGdldFN0b3JlKHR5cGUsIGRpc3BhdGNoKSB7XG4gICAgaWYgKCFzdG9yZXNbdHlwZV0pIHtcbiAgICAgICAgc3RvcmVzW3R5cGVdID0gdHJ5R2V0V2ViU3RvcmUoYmFja0VuZHNbdHlwZV0sIGRpc3BhdGNoKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0b3Jlc1t0eXBlXTtcbn1cblxuY29uc3Qgbm9vcFRyYW5zZm9ybSA9IHtcbiAgICBleHRyYWN0OiBwcm9wVmFsdWUgPT4gcHJvcFZhbHVlLFxuICAgIGFwcGx5OiAoc3RvcmVkVmFsdWUsIF9wcm9wVmFsdWUpID0+IHN0b3JlZFZhbHVlXG59O1xuXG5jb25zdCBnZXRUcmFuc2Zvcm0gPSAoZWxlbWVudCwgcHJvcE5hbWUsIHByb3BQYXJ0KSA9PiB7XG4gICAgaWYgKFxuICAgICAgICBlbGVtZW50LnBlcnNpc3RlbmNlVHJhbnNmb3JtcyAmJlxuICAgICAgICBlbGVtZW50LnBlcnNpc3RlbmNlVHJhbnNmb3Jtc1twcm9wTmFtZV1cbiAgICApIHtcbiAgICAgICAgaWYgKHByb3BQYXJ0KSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5wZXJzaXN0ZW5jZVRyYW5zZm9ybXNbcHJvcE5hbWVdW3Byb3BQYXJ0XTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZWxlbWVudC5wZXJzaXN0ZW5jZVRyYW5zZm9ybXNbcHJvcE5hbWVdO1xuICAgIH1cbiAgICByZXR1cm4gbm9vcFRyYW5zZm9ybTtcbn07XG5cbmNvbnN0IGdldFZhbHNLZXkgPSAoaWQsIHBlcnNpc3RlZFByb3AsIHBlcnNpc3RlbmNlKSA9PlxuICAgIGAke3N0cmluZ2lmeUlkKGlkKX0uJHtwZXJzaXN0ZWRQcm9wfS4ke0pTT04uc3RyaW5naWZ5KHBlcnNpc3RlbmNlKX1gO1xuXG5jb25zdCBnZXRQcm9wcyA9IGxheW91dCA9PiB7XG4gICAgY29uc3Qge3Byb3BzLCB0eXBlLCBuYW1lc3BhY2V9ID0gbGF5b3V0O1xuICAgIGlmICghdHlwZSB8fCAhbmFtZXNwYWNlKSB7XG4gICAgICAgIC8vIG5vdCBhIHJlYWwgY29tcG9uZW50IC0ganVzdCBuZWVkIHRoZSBwcm9wcyBmb3IgcmVjdXJzaW9uXG4gICAgICAgIHJldHVybiB7cHJvcHN9O1xuICAgIH1cbiAgICBjb25zdCB7aWQsIHBlcnNpc3RlbmNlfSA9IHByb3BzO1xuXG4gICAgY29uc3QgZWxlbWVudCA9IFJlZ2lzdHJ5LnJlc29sdmUobGF5b3V0KTtcbiAgICBjb25zdCBnZXRWYWwgPSBwcm9wID0+XG4gICAgICAgIHByb3BzW3Byb3BdIHx8XG4gICAgICAgIChlbGVtZW50LmRlZmF1bHRQcm9wcyB8fCBlbGVtZW50LmRhc2hQZXJzaXN0ZW5jZSB8fCB7fSlbcHJvcF07XG4gICAgY29uc3QgcGVyc2lzdGVkX3Byb3BzID0gZ2V0VmFsKCdwZXJzaXN0ZWRfcHJvcHMnKTtcbiAgICBjb25zdCBwZXJzaXN0ZW5jZV90eXBlID0gZ2V0VmFsKCdwZXJzaXN0ZW5jZV90eXBlJyk7XG4gICAgY29uc3QgY2FuUGVyc2lzdCA9IGlkICYmIHBlcnNpc3RlZF9wcm9wcyAmJiBwZXJzaXN0ZW5jZV90eXBlO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgY2FuUGVyc2lzdCxcbiAgICAgICAgaWQsXG4gICAgICAgIHByb3BzLFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICBwZXJzaXN0ZW5jZSxcbiAgICAgICAgcGVyc2lzdGVkX3Byb3BzLFxuICAgICAgICBwZXJzaXN0ZW5jZV90eXBlXG4gICAgfTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiByZWNvcmRVaUVkaXQobGF5b3V0LCBuZXdQcm9wcywgZGlzcGF0Y2gpIHtcbiAgICBjb25zdCB7XG4gICAgICAgIGNhblBlcnNpc3QsXG4gICAgICAgIGlkLFxuICAgICAgICBwcm9wcyxcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgcGVyc2lzdGVuY2UsXG4gICAgICAgIHBlcnNpc3RlZF9wcm9wcyxcbiAgICAgICAgcGVyc2lzdGVuY2VfdHlwZVxuICAgIH0gPSBnZXRQcm9wcyhsYXlvdXQpO1xuXG4gICAgLy8gaWYgdGhlIFwicGVyc2lzdGVuY2VcIiBwcm9wZXJ0eSBpcyBjaGFuZ2VkIGFzIGEgY2FsbGJhY2sgb3V0cHV0LFxuICAgIC8vIHNraXAgdGhlIHBlcnNpc3RlbmNlIHN0b3JhZ2Ugb3ZlcndyaXRpbmcuXG4gICAgY29uc3QgaXNQZXJzaXN0ZW5jZU1pc21hdGNoID1cbiAgICAgICAgbmV3UHJvcHM/LnBlcnNpc3RlbmNlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgbmV3UHJvcHMucGVyc2lzdGVuY2UgIT09IHBlcnNpc3RlbmNlO1xuXG4gICAgaWYgKCFjYW5QZXJzaXN0IHx8ICFwZXJzaXN0ZW5jZSB8fCBpc1BlcnNpc3RlbmNlTWlzbWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvckVhY2gocGVyc2lzdGVkUHJvcCA9PiB7XG4gICAgICAgIGNvbnN0IFtwcm9wTmFtZSwgcHJvcFBhcnRdID0gcGVyc2lzdGVkUHJvcC5zcGxpdCgnLicpO1xuICAgICAgICBpZiAobmV3UHJvcHNbcHJvcE5hbWVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0b3JhZ2UgPSBnZXRTdG9yZShwZXJzaXN0ZW5jZV90eXBlLCBkaXNwYXRjaCk7XG4gICAgICAgICAgICBjb25zdCB7ZXh0cmFjdH0gPSBnZXRUcmFuc2Zvcm0oZWxlbWVudCwgcHJvcE5hbWUsIHByb3BQYXJ0KTtcblxuICAgICAgICAgICAgY29uc3QgdmFsc0tleSA9IGdldFZhbHNLZXkoaWQsIHBlcnNpc3RlZFByb3AsIHBlcnNpc3RlbmNlKTtcbiAgICAgICAgICAgIGxldCBvcmlnaW5hbFZhbCA9IGV4dHJhY3QocHJvcHNbcHJvcE5hbWVdKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld1ZhbCA9IGV4dHJhY3QobmV3UHJvcHNbcHJvcE5hbWVdKTtcblxuICAgICAgICAgICAgLy8gbWFpbmx5IGZvciBuZXN0ZWQgcHJvcHMgd2l0aCBtdWx0aXBsZSBwZXJzaXN0ZWQgcGFydHMsIGl0J3NcbiAgICAgICAgICAgIC8vIHBvc3NpYmxlIHRvIGhhdmUgdGhlIHNhbWUgdmFsdWUgYXMgYmVmb3JlIC0gc2hvdWxkIG5vdCBzdG9yZVxuICAgICAgICAgICAgLy8gaW4gdGhpcyBjYXNlLlxuICAgICAgICAgICAgaWYgKG9yaWdpbmFsVmFsICE9PSBuZXdWYWwpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RvcmFnZS5oYXNJdGVtKHZhbHNLZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsVmFsID0gc3RvcmFnZS5nZXRJdGVtKHZhbHNLZXkpWzFdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCB2YWxzID1cbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxWYWwgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBbbmV3VmFsXVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBbbmV3VmFsLCBvcmlnaW5hbFZhbF07XG4gICAgICAgICAgICAgICAgc3RvcmFnZS5zZXRJdGVtKHZhbHNLZXksIHZhbHMsIGRpc3BhdGNoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sIHBlcnNpc3RlZF9wcm9wcyk7XG59XG5cbi8qXG4gKiBVc2VkIGZvciBlbnRpcmUgbGF5b3V0cyAob24gbG9hZCkgb3IgcGFydGlhbCBsYXlvdXRzIChmcm9tIGNoaWxkcmVuXG4gKiBjYWxsYmFja3MpIHRvIGFwcGx5IHByZXZpb3VzbHktc3RvcmVkIFVJIGVkaXRzIHRvIGNvbXBvbmVudHNcbiAqXG4gKiBgcGF0Y2hBbmFseXNpc2AgKG9wdGlvbmFsKSBkZXNjcmliZXMgd2hhdCB0aGUgYFBhdGNoKClgIHRoYXQgcHJvZHVjZWQgdGhpc1xuICogbGF5b3V0IGNoYW5nZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5UGVyc2lzdGVuY2UobGF5b3V0LCBkaXNwYXRjaCwgcGF0Y2hBbmFseXNpcykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGxheW91dCkpIHtcbiAgICAgICAgcmV0dXJuIGxheW91dC5tYXAobGF5ID0+XG4gICAgICAgICAgICBpc0RyeUNvbXBvbmVudChsYXkpXG4gICAgICAgICAgICAgICAgPyBwZXJzaXN0ZW5jZU1vZHMobGF5LCBsYXksIFtdLCBkaXNwYXRjaCwgcGF0Y2hBbmFseXNpcylcbiAgICAgICAgICAgICAgICA6IGxheVxuICAgICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcGVyc2lzdGVuY2VNb2RzKGxheW91dCwgbGF5b3V0LCBbXSwgZGlzcGF0Y2gsIHBhdGNoQW5hbHlzaXMpO1xufVxuXG5jb25zdCBVTkRPID0gdHJ1ZTtcbmZ1bmN0aW9uIG1vZFByb3Aoa2V5LCBzdG9yYWdlLCBlbGVtZW50LCBwcm9wcywgcGVyc2lzdGVkUHJvcCwgdXBkYXRlLCB1bmRvKSB7XG4gICAgaWYgKHN0b3JhZ2UuaGFzSXRlbShrZXkpKSB7XG4gICAgICAgIGNvbnN0IFtuZXdWYWwsIG9yaWdpbmFsVmFsXSA9IHN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuICAgICAgICBjb25zdCBmcm9tVmFsID0gdW5kbyA/IG5ld1ZhbCA6IG9yaWdpbmFsVmFsO1xuICAgICAgICBjb25zdCB0b1ZhbCA9IHVuZG8gPyBvcmlnaW5hbFZhbCA6IG5ld1ZhbDtcbiAgICAgICAgY29uc3QgW3Byb3BOYW1lLCBwcm9wUGFydF0gPSBwZXJzaXN0ZWRQcm9wLnNwbGl0KCcuJyk7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IGdldFRyYW5zZm9ybShlbGVtZW50LCBwcm9wTmFtZSwgcHJvcFBhcnQpO1xuXG4gICAgICAgIGlmIChlcXVhbHMoZnJvbVZhbCwgdHJhbnNmb3JtLmV4dHJhY3QocHJvcHNbcHJvcE5hbWVdKSkpIHtcbiAgICAgICAgICAgIHVwZGF0ZVtwcm9wTmFtZV0gPSB0cmFuc2Zvcm0uYXBwbHkoXG4gICAgICAgICAgICAgICAgdG9WYWwsXG4gICAgICAgICAgICAgICAgcHJvcE5hbWUgaW4gdXBkYXRlID8gdXBkYXRlW3Byb3BOYW1lXSA6IHByb3BzW3Byb3BOYW1lXVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGNsZWFyIHRoaXMgc2F2ZWQgZWRpdCAtIHdlJ3ZlIHN0YXJ0ZWQgd2l0aCB0aGUgd3JvbmdcbiAgICAgICAgICAgIC8vIHZhbHVlIGZvciB0aGlzIHBlcnNpc3RlbmNlIElEXG4gICAgICAgICAgICBzdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gcGVyc2lzdGVuY2VNb2RzKGxheW91dCwgY29tcG9uZW50LCB0cmVlUGF0aCwgZGlzcGF0Y2gsIHBhdGNoQW5hbHlzaXMpIHtcbiAgICBjb25zdCB7XG4gICAgICAgIGNhblBlcnNpc3QsXG4gICAgICAgIGlkLFxuICAgICAgICBwcm9wcyxcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgcGVyc2lzdGVuY2UsXG4gICAgICAgIHBlcnNpc3RlZF9wcm9wcyxcbiAgICAgICAgcGVyc2lzdGVuY2VfdHlwZVxuICAgIH0gPSBnZXRQcm9wcyhjb21wb25lbnQpO1xuXG4gICAgbGV0IGxheW91dE91dCA9IGxheW91dDtcblxuICAgIC8vIFNraXAgdGhlIGNvbXBvbmVudHMgYSBQYXRjaCBjYXJyaWVkIG92ZXIgZnJvbSB0aGUgcHJldmlvdXMgbGF5b3V0XG4gICAgLy8gdW50b3VjaGVkLiBUaGUgcGF0Y2ggaXRzZWxmIHRlbGxzIHVzIHdoaWNoXG4gICAgLy8gY29tcG9uZW50cyBpdCBjcmVhdGVkIGFuZCB3aGljaCBwcm9wcyBpdCB3cm90ZVxuICAgIC8vIE5vdGUgdGhhdCBhIGNvbXBvbmVudCByZWJ1aWx0IHdpdGggYW4gaWQgdGhhdCB3YXMgYWxyZWFkeSBpbiB1c2UgaXNcbiAgICAvLyBub3QgY2FycmllZCBvdmVyLiBJdCBjb21lcyB3aXRoIHRoZSBzZXJ2ZXIncyBkZWZhdWx0IHZhbHVlLCBzbyBpdHNcbiAgICAvLyBwZXJzaXN0ZWQgZWRpdCBtdXN0IGJlIHJlc3RvcmVkXG4gICAgY29uc3QgY2FycmllZE92ZXIgPSBwYXRjaEFuYWx5c2lzXG4gICAgICAgID8gaXNVbnRvdWNoZWRCeVBhdGNoKHBhdGNoQW5hbHlzaXMsIGlkICYmIHN0cmluZ2lmeUlkKGlkKSlcbiAgICAgICAgOiBmYWxzZTtcblxuICAgIGlmIChjYW5QZXJzaXN0ICYmIHBlcnNpc3RlbmNlICYmICFjYXJyaWVkT3Zlcikge1xuICAgICAgICBjb25zdCBzdG9yYWdlID0gZ2V0U3RvcmUocGVyc2lzdGVuY2VfdHlwZSwgZGlzcGF0Y2gpO1xuICAgICAgICBjb25zdCB1cGRhdGUgPSB7fTtcbiAgICAgICAgZm9yRWFjaChcbiAgICAgICAgICAgIHBlcnNpc3RlZFByb3AgPT5cbiAgICAgICAgICAgICAgICBtb2RQcm9wKFxuICAgICAgICAgICAgICAgICAgICBnZXRWYWxzS2V5KGlkLCBwZXJzaXN0ZWRQcm9wLCBwZXJzaXN0ZW5jZSksXG4gICAgICAgICAgICAgICAgICAgIHN0b3JhZ2UsXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIHByb3BzLFxuICAgICAgICAgICAgICAgICAgICBwZXJzaXN0ZWRQcm9wLFxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgcGVyc2lzdGVkX3Byb3BzXG4gICAgICAgICk7XG5cbiAgICAgICAgZm9yIChjb25zdCBwcm9wTmFtZSBpbiB1cGRhdGUpIHtcbiAgICAgICAgICAgIGxheW91dE91dCA9IHNldChcbiAgICAgICAgICAgICAgICBsZW5zUGF0aCh0cmVlUGF0aC5jb25jYXQoJ3Byb3BzJywgcHJvcE5hbWUpKSxcbiAgICAgICAgICAgICAgICB1cGRhdGVbcHJvcE5hbWVdLFxuICAgICAgICAgICAgICAgIGxheW91dE91dFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHJlY3Vyc2UgaW53YXJkXG4gICAgY29uc3Qge2NoaWxkcmVufSA9IHByb3BzO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkge1xuICAgICAgICBjaGlsZHJlbi5mb3JFYWNoKChjaGlsZCwgaSkgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGUoY2hpbGQpID09PSAnT2JqZWN0JyAmJiBjaGlsZC5wcm9wcykge1xuICAgICAgICAgICAgICAgIGxheW91dE91dCA9IHBlcnNpc3RlbmNlTW9kcyhcbiAgICAgICAgICAgICAgICAgICAgbGF5b3V0T3V0LFxuICAgICAgICAgICAgICAgICAgICBjaGlsZCxcbiAgICAgICAgICAgICAgICAgICAgdHJlZVBhdGguY29uY2F0KCdwcm9wcycsICdjaGlsZHJlbicsIGkpLFxuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaCxcbiAgICAgICAgICAgICAgICAgICAgcGF0Y2hBbmFseXNpc1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodHlwZShjaGlsZHJlbikgPT09ICdPYmplY3QnICYmIGNoaWxkcmVuLnByb3BzKSB7XG4gICAgICAgIGxheW91dE91dCA9IHBlcnNpc3RlbmNlTW9kcyhcbiAgICAgICAgICAgIGxheW91dE91dCxcbiAgICAgICAgICAgIGNoaWxkcmVuLFxuICAgICAgICAgICAgdHJlZVBhdGguY29uY2F0KCdwcm9wcycsICdjaGlsZHJlbicpLFxuICAgICAgICAgICAgZGlzcGF0Y2gsXG4gICAgICAgICAgICBwYXRjaEFuYWx5c2lzXG4gICAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBsYXlvdXRPdXQ7XG59XG5cbi8qXG4gKiBXaGVuIHdlIHJlY2VpdmUgbmV3IGV4cGxpY2l0IHByb3BzIGZyb20gYSBjYWxsYmFjayxcbiAqIHRoZXNlIG92ZXJyaWRlIFVJLWRyaXZlbiBlZGl0cyBvZiB0aG9zZSBleGFjdCBwcm9wc1xuICogYnV0IG5vdCBmb3IgcHJvcHMgbmVzdGVkIGluc2lkZSBjaGlsZHJlblxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJ1bmVQZXJzaXN0ZW5jZShsYXlvdXQsIG5ld1Byb3BzLCBkaXNwYXRjaCkge1xuICAgIGNvbnN0IHtcbiAgICAgICAgY2FuUGVyc2lzdCxcbiAgICAgICAgaWQsXG4gICAgICAgIHByb3BzLFxuICAgICAgICBwZXJzaXN0ZW5jZSxcbiAgICAgICAgcGVyc2lzdGVkX3Byb3BzLFxuICAgICAgICBwZXJzaXN0ZW5jZV90eXBlLFxuICAgICAgICBlbGVtZW50XG4gICAgfSA9IGdldFByb3BzKGxheW91dCk7XG5cbiAgICBjb25zdCBnZXRGaW5hbCA9IChwcm9wTmFtZSwgcHJldlZhbCkgPT5cbiAgICAgICAgcHJvcE5hbWUgaW4gbmV3UHJvcHMgPyBuZXdQcm9wc1twcm9wTmFtZV0gOiBwcmV2VmFsO1xuICAgIGNvbnN0IGZpbmFsUGVyc2lzdGVuY2UgPSBnZXRGaW5hbCgncGVyc2lzdGVuY2UnLCBwZXJzaXN0ZW5jZSk7XG5cbiAgICBpZiAoIWNhblBlcnNpc3QgfHwgIShwZXJzaXN0ZW5jZSB8fCBmaW5hbFBlcnNpc3RlbmNlKSkge1xuICAgICAgICByZXR1cm4gbmV3UHJvcHM7XG4gICAgfVxuXG4gICAgY29uc3QgZmluYWxQZXJzaXN0ZW5jZVR5cGUgPSBnZXRGaW5hbCgncGVyc2lzdGVuY2VfdHlwZScsIHBlcnNpc3RlbmNlX3R5cGUpO1xuICAgIGNvbnN0IGZpbmFsUGVyc2lzdGVkUHJvcHMgPSBnZXRGaW5hbCgncGVyc2lzdGVkX3Byb3BzJywgcGVyc2lzdGVkX3Byb3BzKTtcbiAgICBjb25zdCBwZXJzaXN0ZW5jZUNoYW5nZWQgPVxuICAgICAgICBmaW5hbFBlcnNpc3RlbmNlICE9PSBwZXJzaXN0ZW5jZSB8fFxuICAgICAgICBmaW5hbFBlcnNpc3RlbmNlVHlwZSAhPT0gcGVyc2lzdGVuY2VfdHlwZSB8fFxuICAgICAgICBmaW5hbFBlcnNpc3RlZFByb3BzICE9PSBwZXJzaXN0ZWRfcHJvcHM7XG5cbiAgICBjb25zdCBub3RJbk5ld1Byb3BzID0gcGVyc2lzdGVkUHJvcCA9PlxuICAgICAgICAhKHBlcnNpc3RlZFByb3Auc3BsaXQoJy4nKVswXSBpbiBuZXdQcm9wcyk7XG5cbiAgICBjb25zdCB1cGRhdGUgPSB7fTtcblxuICAgIGxldCBkZXBlcnNpc3RlZFByb3BzID0gcHJvcHM7XG5cbiAgICBpZiAocGVyc2lzdGVuY2VDaGFuZ2VkICYmIHBlcnNpc3RlbmNlKSB7XG4gICAgICAgIC8vIGNsZWFyIHByZXZpb3VzbHktYXBwbGllZCBwZXJzaXN0ZW5jZVxuICAgICAgICBjb25zdCBzdG9yYWdlID0gZ2V0U3RvcmUocGVyc2lzdGVuY2VfdHlwZSwgZGlzcGF0Y2gpO1xuICAgICAgICBmb3JFYWNoKFxuICAgICAgICAgICAgcGVyc2lzdGVkUHJvcCA9PlxuICAgICAgICAgICAgICAgIG1vZFByb3AoXG4gICAgICAgICAgICAgICAgICAgIGdldFZhbHNLZXkoaWQsIHBlcnNpc3RlZFByb3AsIHBlcnNpc3RlbmNlKSxcbiAgICAgICAgICAgICAgICAgICAgc3RvcmFnZSxcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgICAgICAgICAgIHBlcnNpc3RlZFByb3AsXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgVU5ET1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICBmaWx0ZXIobm90SW5OZXdQcm9wcywgcGVyc2lzdGVkX3Byb3BzKVxuICAgICAgICApO1xuICAgICAgICBkZXBlcnNpc3RlZFByb3BzID0gbWVyZ2VSaWdodChwcm9wcywgdXBkYXRlKTtcbiAgICB9XG5cbiAgICBpZiAoZmluYWxQZXJzaXN0ZW5jZSAmJiBwZXJzaXN0ZW5jZUNoYW5nZWQpIHtcbiAgICAgICAgY29uc3QgZmluYWxTdG9yYWdlID0gZ2V0U3RvcmUoZmluYWxQZXJzaXN0ZW5jZVR5cGUsIGRpc3BhdGNoKTtcbiAgICAgICAgLy8gYXBwbHkgbmV3IHBlcnNpc3RlbmNlXG4gICAgICAgIGZvckVhY2goXG4gICAgICAgICAgICBwZXJzaXN0ZWRQcm9wID0+XG4gICAgICAgICAgICAgICAgbW9kUHJvcChcbiAgICAgICAgICAgICAgICAgICAgZ2V0VmFsc0tleShpZCwgcGVyc2lzdGVkUHJvcCwgZmluYWxQZXJzaXN0ZW5jZSksXG4gICAgICAgICAgICAgICAgICAgIGZpbmFsU3RvcmFnZSxcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgZGVwZXJzaXN0ZWRQcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgcGVyc2lzdGVkUHJvcCxcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGZpbHRlcihub3RJbk5ld1Byb3BzLCBmaW5hbFBlcnNpc3RlZFByb3BzKVxuICAgICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcGVyc2lzdGVuY2VDaGFuZ2VkID8gbWVyZ2VSaWdodChuZXdQcm9wcywgdXBkYXRlKSA6IG5ld1Byb3BzO1xufVxuIiwiLyoqXG4gKiBSZWFjdCBjb21wYXRpYmlsaXR5IHNoaW1cbiAqXG4gKiBQcm92aWRlcyBjb21wYXRpYmlsaXR5IGZvciBjb21wb25lbnQgcGFja2FnZXMgYnVuZGxlZCBhZ2FpbnN0IG90aGVyIFJlYWN0XG4gKiB2ZXJzaW9ucyB0aGFuIHRoZSBvbmUgbG9hZGVkIG9uIHRoZSBwYWdlOlxuICpcbiAqIDEuIFJlYWN0Q3VycmVudE93bmVyIHN0dWIgLSBSZWFjdCAxOSByZW1vdmVkXG4gKiAgICBfX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRCBidXQgbWFueSBjb21wb25lbnRcbiAqICAgIGxpYnJhcmllcyBidWlsdCBhZ2FpbnN0IFJlYWN0IDw9MTggc3RpbGwgYWNjZXNzIGl0IGF0IGxvYWQgdGltZS5cbiAqXG4gKiAyLiBMZWdhY3kgZWxlbWVudCBzeW1ib2wgLSBSZWFjdCAxOSBjaGFuZ2VkIHRoZSBlbGVtZW50ICQkdHlwZW9mIHN5bWJvbFxuICogICAgZnJvbSAncmVhY3QuZWxlbWVudCcgdG8gJ3JlYWN0LnRyYW5zaXRpb25hbC5lbGVtZW50JyBhbmQgdGhyb3dzXG4gKiAgICBlcnJvciAjNTI1IG9uIGVsZW1lbnRzIGNhcnJ5aW5nIHRoZSBvbGQgc3ltYm9sLiBMaWJyYXJpZXMgdGhhdFxuICogICAgcHJlLWJ1bmRsZWQgYSBSZWFjdCA8PTE4IGNvcHkgb2YgcmVhY3QvanN4LXJ1bnRpbWUgY3JlYXRlIHN1Y2hcbiAqICAgIGVsZW1lbnRzLiBUaGlzIHNoaW0gcnVucyBhZnRlciBSZWFjdCAod2hvc2Ugb3duIHN5bWJvbHMgYXJlIGFscmVhZHlcbiAqICAgIGNvbXB1dGVkKSBidXQgYmVmb3JlIGNvbXBvbmVudCBwYWNrYWdlcywgc28gcmVkaXJlY3RpbmdcbiAqICAgIFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKSB0byB0aGUgdHJhbnNpdGlvbmFsIHN5bWJvbCBtYWtlcyB0aG9zZVxuICogICAgYnVuZGxlZCBydW50aW1lcyBwcm9kdWNlIGVsZW1lbnRzIHRoZSBsb2FkZWQgUmVhY3QgMTkgYWNjZXB0cy5cbiAqXG4gKiAzLiBHbG9iYWwganN4LXJ1bnRpbWUgKHdpbmRvdy5SZWFjdEpTWFJ1bnRpbWUpIC0gY29tcG9uZW50cyBleHRlcm5hbGl6ZVxuICogICAgcmVhY3QvanN4LXJ1bnRpbWUgYW5kIHJlYWN0L2pzeC1kZXYtcnVudGltZSB0byB0aGlzIGdsb2JhbCwgc28gdGhlaXJcbiAqICAgIGVsZW1lbnRzIGFyZSBhbHdheXMgY3JlYXRlZCBieSB0aGUgUmVhY3QgdmVyc2lvbiBsb2FkZWQgb24gdGhlIHBhZ2UuXG4gKlxuICogVGhpcyBmaWxlIGlzIGxvYWRlZCBzdGFuZGFsb25lIHJpZ2h0IGFmdGVyIHJlYWN0L3JlYWN0LWRvbSwgYmVmb3JlIGFueVxuICogY29tcG9uZW50IHBhY2thZ2UuIEl0IGlzIGFsc28gaW1wb3J0ZWQgYXQgdGhlIHRvcCBvZiB0aGUgZGFzaC1yZW5kZXJlclxuICogYnVuZGxlLCBhbmQgdGhlIHdlYnBhY2sgY29uZmlncyAocmVuZGVyZXIsIGRjYywgaHRtbCwgdGFibGUpIGVtYmVkIGEgY29weVxuICogb2YgdGhlIGpzeCBmYWxsYmFjayBpbiB0aGVpciByZWFjdC9qc3gtcnVudGltZSBleHRlcm5hbCBzbyBidW5kbGVzIGJ1aWx0XG4gKiB3aXRoIHRoYXQgY29udmVudGlvbiBrZWVwIHdvcmtpbmcgb24gb2xkZXIgRGFzaCwgd2hpY2ggbmV2ZXIgZGVmaW5lc1xuICogd2luZG93LlJlYWN0SlNYUnVudGltZS4gSXQgbXVzdCBzdGF5IGlkZW1wb3RlbnQsIGFuZCB0aGUganN4IGltcGxlbWVudGF0aW9uXG4gKiBtdXN0IHN0YXkgaW4gc3luYyB3aXRoIHRoZSBmYWxsYmFjayBpbiB0aG9zZSBjb25maWdzLlxuICovXG4oZnVuY3Rpb24gKCkge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2Ygd2luZG93LlJlYWN0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIFJlYWN0ID0gd2luZG93LlJlYWN0O1xuXG4gICAgLy8gUHJvdmlkZSBSZWFjdEN1cnJlbnRPd25lciBzdHViIGZvciBSZWFjdCAxOVxuICAgIHZhciBpbnRlcm5hbHMgPSBSZWFjdC5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRDtcbiAgICBpZiAoIWludGVybmFscykge1xuICAgICAgICBSZWFjdC5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRCA9IHtcbiAgICAgICAgICAgIFJlYWN0Q3VycmVudE93bmVyOiB7Y3VycmVudDogbnVsbH0sXG4gICAgICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyOiB7Y3VycmVudDogbnVsbH0sXG4gICAgICAgICAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZzoge3RyYW5zaXRpb246IG51bGx9XG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmICghaW50ZXJuYWxzLlJlYWN0Q3VycmVudE93bmVyKSB7XG4gICAgICAgIGludGVybmFscy5SZWFjdEN1cnJlbnRPd25lciA9IHtjdXJyZW50OiBudWxsfTtcbiAgICB9XG5cbiAgICAvLyBSZWRpcmVjdCB0aGUgbGVnYWN5IGVsZW1lbnQgc3ltYm9sIGZvciBjb2RlIGxvYWRlZCBhZnRlciB0aGlzIHNoaW1cbiAgICB2YXIgcmVhY3RNYWpvciA9IHBhcnNlSW50KChSZWFjdC52ZXJzaW9uIHx8ICcnKS5zcGxpdCgnLicpWzBdLCAxMCk7XG4gICAgaWYgKFxuICAgICAgICByZWFjdE1ham9yID49IDE5ICYmXG4gICAgICAgIFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKSAhPT0gU3ltYm9sLmZvcigncmVhY3QudHJhbnNpdGlvbmFsLmVsZW1lbnQnKVxuICAgICkge1xuICAgICAgICB2YXIgZWxlbWVudFN5bWJvbCA9IFN5bWJvbC5mb3IoJ3JlYWN0LnRyYW5zaXRpb25hbC5lbGVtZW50Jyk7XG4gICAgICAgIHZhciBvcmlnaW5hbFN5bWJvbEZvciA9IFN5bWJvbC5mb3I7XG4gICAgICAgIFN5bWJvbC5mb3IgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBpZiAoa2V5ID09PSAncmVhY3QuZWxlbWVudCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudFN5bWJvbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbFN5bWJvbEZvci5hcHBseShTeW1ib2wsIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKHdpbmRvdy5SZWFjdEpTWFJ1bnRpbWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFByb3ZpZGUgYSBnbG9iYWwganN4LXJ1bnRpbWUgYmFja2VkIGJ5IHRoZSBsb2FkZWQgUmVhY3QncyBjcmVhdGVFbGVtZW50XG4gICAgLy8gc28gZWxlbWVudHMgYXJlIGNyZWF0ZWQgaW4gdGhlIGZvcm1hdCB0aGUgbG9hZGVkIFJlYWN0IGV4cGVjdHMuXG4gICAgZnVuY3Rpb24ganN4KHR5cGUsIGNvbmZpZywgbWF5YmVLZXkpIHtcbiAgICAgICAgdmFyIHByb3BzID0ge307XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IG51bGw7XG5cbiAgICAgICAgaWYgKGNvbmZpZyAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoY29uZmlnLmtleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcHJvcHMua2V5ID0gJycgKyBjb25maWcua2V5O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiBjb25maWcpIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsIHByb3BOYW1lKSAmJlxuICAgICAgICAgICAgICAgICAgICBwcm9wTmFtZSAhPT0gJ2tleScgJiZcbiAgICAgICAgICAgICAgICAgICAgcHJvcE5hbWUgIT09ICdfX3NlbGYnICYmXG4gICAgICAgICAgICAgICAgICAgIHByb3BOYW1lICE9PSAnX19zb3VyY2UnXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wTmFtZSA9PT0gJ2NoaWxkcmVuJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBjb25maWdbcHJvcE5hbWVdO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gY29uZmlnW3Byb3BOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEtleSBwYXNzZWQgYXMgdGhpcmQgYXJndW1lbnQgb3ZlcnJpZGVzIGNvbmZpZy5rZXlcbiAgICAgICAgaWYgKG1heWJlS2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHByb3BzLmtleSA9ICcnICsgbWF5YmVLZXk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hpbGRyZW4gIT09IG51bGwgJiYgY2hpbGRyZW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQuYXBwbHkoXG4gICAgICAgICAgICAgICAgICAgIFJlYWN0LFxuICAgICAgICAgICAgICAgICAgICBbdHlwZSwgcHJvcHNdLmNvbmNhdChjaGlsZHJlbilcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQodHlwZSwgcHJvcHMsIGNoaWxkcmVuKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudCh0eXBlLCBwcm9wcyk7XG4gICAgfVxuXG4gICAgd2luZG93LlJlYWN0SlNYUnVudGltZSA9IHtcbiAgICAgICAganN4OiBqc3gsXG4gICAgICAgIGpzeHM6IGpzeCwgLy8ganN4cyBpcyBqc3ggd2l0aCBzdGF0aWMgY2hpbGRyZW5cbiAgICAgICAganN4REVWOiBqc3gsIC8vIGpzeC1kZXYtcnVudGltZTsgZXh0cmEgZGV2LW9ubHkgYXJndW1lbnRzIGFyZSBpZ25vcmVkXG4gICAgICAgIEZyYWdtZW50OiBSZWFjdC5GcmFnbWVudFxuICAgIH07XG59KSgpO1xuIiwiaW1wb3J0IHthc3NvYywgYXNzb2NQYXRoLCBtZXJnZVJpZ2h0fSBmcm9tICdyYW1kYSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNyZWF0ZUFwaVJlZHVjZXIoc3RvcmUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gQXBpUmVkdWNlcihzdGF0ZSA9IHt9LCBhY3Rpb24pIHtcbiAgICAgICAgbGV0IG5ld1N0YXRlID0gc3RhdGU7XG4gICAgICAgIGlmIChhY3Rpb24udHlwZSA9PT0gc3RvcmUpIHtcbiAgICAgICAgICAgIGNvbnN0IHtpZCwgc3RhdHVzLCBjb250ZW50fSA9IGFjdGlvbi5wYXlsb2FkO1xuICAgICAgICAgICAgY29uc3QgbmV3UmVxdWVzdCA9IHtzdGF0dXMsIGNvbnRlbnR9O1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaWQpKSB7XG4gICAgICAgICAgICAgICAgbmV3U3RhdGUgPSBhc3NvY1BhdGgoaWQsIG5ld1JlcXVlc3QsIHN0YXRlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaWQpIHtcbiAgICAgICAgICAgICAgICBuZXdTdGF0ZSA9IGFzc29jKGlkLCBuZXdSZXF1ZXN0LCBzdGF0ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG5ld1N0YXRlID0gbWVyZ2VSaWdodChzdGF0ZSwgbmV3UmVxdWVzdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ld1N0YXRlO1xuICAgIH07XG59XG4iLCJpbXBvcnQge2dldEFjdGlvbn0gZnJvbSAnLi4vYWN0aW9ucy9jb25zdGFudHMnO1xuaW1wb3J0IHtnZXRBcHBTdGF0ZX0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG5mdW5jdGlvbiBhcHBMaWZlY3ljbGUoc3RhdGUgPSBnZXRBcHBTdGF0ZSgnU1RBUlRFRCcpLCBhY3Rpb24pIHtcbiAgICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgICAgIGNhc2UgZ2V0QWN0aW9uKCdTRVRfQVBQX0xJRkVDWUNMRScpOlxuICAgICAgICAgICAgcmV0dXJuIGdldEFwcFN0YXRlKGFjdGlvbi5wYXlsb2FkKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGFwcExpZmVjeWNsZTtcbiIsImNvbnN0IGluaXRpYWxDaGFuZ2UgPSB7XG4gICAgaWQ6IG51bGwsXG4gICAgcHJvcHM6IHt9XG59O1xuXG5mdW5jdGlvbiBjaGFuZ2VkKHN0YXRlID0gaW5pdGlhbENoYW5nZSkge1xuICAgIC8vIFRoaXMgaXMgZW1wdHkganVzdCB0byBpbml0aWFsaXplIHRoZSBzdG9yZS4gQ2hhbmdlc1xuICAgIC8vIGFyZSBhY3R1YWxseSByZWNvcmRlZCBpbiByZWR1Y2VyLmpzIHNvIHRoYXQgd2UgY2FuXG4gICAgLy8gcmVzb2x2ZSBwYXRocyB0byBpZC5cbiAgICByZXR1cm4gc3RhdGU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNoYW5nZWQ7XG4iLCJpbXBvcnQge2dldEFjdGlvbn0gZnJvbSAnLi4vYWN0aW9ucy9jb25zdGFudHMnO1xuaW1wb3J0IHttZXJnZURlZXBSaWdodH0gZnJvbSAncmFtZGEnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb25maWcoc3RhdGUgPSBudWxsLCBhY3Rpb24pIHtcbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGdldEFjdGlvbignU0VUX0NPTkZJRycpKSB7XG4gICAgICAgIC8vIFB1dCB0aGUgY29tcG9uZW50cyBjaGlsZHJlblByb3BzIGluIHdpbmRvd3MgZm9yIHNpZGUgdXNhZ2UuXG4gICAgICAgIHdpbmRvdy5fX2Rhc2hwcml2YXRlX2NoaWxkcmVuUHJvcHMgPSBtZXJnZURlZXBSaWdodChcbiAgICAgICAgICAgIHdpbmRvdy5fX2Rhc2hwcml2YXRlX2NoaWxkcmVuUHJvcHMgfHwge30sXG4gICAgICAgICAgICBhY3Rpb24ucGF5bG9hZC5jaGlsZHJlbl9wcm9wc1xuICAgICAgICApO1xuICAgICAgICByZXR1cm4gYWN0aW9uLnBheWxvYWQ7XG4gICAgfSBlbHNlIGlmIChhY3Rpb24udHlwZSA9PT0gZ2V0QWN0aW9uKCdBRERfSFRUUF9IRUFERVJTJykpIHtcbiAgICAgICAgcmV0dXJuIG1lcmdlRGVlcFJpZ2h0KHN0YXRlLCB7XG4gICAgICAgICAgICBmZXRjaDoge1xuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGFjdGlvbi5wYXlsb2FkXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gc3RhdGU7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gZ2V0QXBwU3RhdGUoc3RhdGUpIHtcbiAgICBjb25zdCBzdGF0ZUxpc3QgPSB7XG4gICAgICAgIFNUQVJURUQ6ICdTVEFSVEVEJyxcbiAgICAgICAgSFlEUkFURUQ6ICdIWURSQVRFRCcsXG4gICAgICAgIERFU1RST1lFRDogJ0RFU1RST1lFRCdcbiAgICB9O1xuICAgIGlmIChzdGF0ZUxpc3Rbc3RhdGVdKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZUxpc3Rbc3RhdGVdO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c3RhdGV9IGlzIG5vdCBhIHZhbGlkIGFwcCBzdGF0ZS5gKTtcbn1cbiIsImNvbnN0IGluaXRpYWxHcmFwaCA9IHt9O1xuXG5jb25zdCBncmFwaHMgPSAoc3RhdGUgPSBpbml0aWFsR3JhcGgsIGFjdGlvbikgPT4ge1xuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gJ1NFVF9HUkFQSFMnKSB7XG4gICAgICAgIHJldHVybiBhY3Rpb24ucGF5bG9hZDtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZ3JhcGhzO1xuIiwiaW1wb3J0IHttZXJnZVJpZ2h0fSBmcm9tICdyYW1kYSc7XG5cbmNvbnN0IGluaXRpYWxFcnJvciA9IHtcbiAgICBmcm9udEVuZDogW10sXG4gICAgYmFja0VuZDogW10sXG4gICAgYmFja0VuZENvbm5lY3RlZDogdHJ1ZVxufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZXJyb3Ioc3RhdGUgPSBpbml0aWFsRXJyb3IsIGFjdGlvbikge1xuICAgIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnT05fRVJST1InOiB7XG4gICAgICAgICAgICBjb25zdCB7ZnJvbnRFbmQsIGJhY2tFbmQsIGJhY2tFbmRDb25uZWN0ZWR9ID0gc3RhdGU7XG4gICAgICAgICAgICAvLyBsb2cgZXJyb3JzIHRvIHRoZSBjb25zb2xlIGZvciBzdGFjayB0cmFjaW5nIGFuZCBzbyB0aGV5J3JlXG4gICAgICAgICAgICAvLyBhdmFpbGFibGUgZXZlbiB3aXRoIGRlYnVnZ2luZyBvZmZcbiAgICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlICovXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGFjdGlvbi5wYXlsb2FkLmVycm9yKTtcblxuICAgICAgICAgICAgaWYgKGFjdGlvbi5wYXlsb2FkLnR5cGUgPT09ICdmcm9udEVuZCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBmcm9udEVuZDogW1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2VSaWdodChhY3Rpb24ucGF5bG9hZCwge3RpbWVzdGFtcDogbmV3IERhdGUoKX0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uZnJvbnRFbmRcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgYmFja0VuZCxcbiAgICAgICAgICAgICAgICAgICAgYmFja0VuZENvbm5lY3RlZFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5wYXlsb2FkLnR5cGUgPT09ICdiYWNrRW5kJykge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGZyb250RW5kLFxuICAgICAgICAgICAgICAgICAgICBiYWNrRW5kOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXJnZVJpZ2h0KGFjdGlvbi5wYXlsb2FkLCB7dGltZXN0YW1wOiBuZXcgRGF0ZSgpfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5iYWNrRW5kXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIGJhY2tFbmRDb25uZWN0ZWRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ1NFVF9DT05ORUNUSU9OX1NUQVRVUyc6IHtcbiAgICAgICAgICAgIHJldHVybiBtZXJnZVJpZ2h0KHN0YXRlLCB7YmFja0VuZENvbm5lY3RlZDogYWN0aW9uLnBheWxvYWR9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImNvbnN0IGluaXRpYWxIaXN0b3J5ID0ge1xuICAgIHBhc3Q6IFtdLFxuICAgIHByZXNlbnQ6IHt9LFxuICAgIGZ1dHVyZTogW11cbn07XG5cbmZ1bmN0aW9uIGhpc3Rvcnkoc3RhdGUgPSBpbml0aWFsSGlzdG9yeSwgYWN0aW9uKSB7XG4gICAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgICAgICBjYXNlICdVTkRPJzoge1xuICAgICAgICAgICAgY29uc3Qge3Bhc3QsIHByZXNlbnQsIGZ1dHVyZX0gPSBzdGF0ZTtcbiAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzID0gcGFzdFtwYXN0Lmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgY29uc3QgbmV3UGFzdCA9IHBhc3Quc2xpY2UoMCwgcGFzdC5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgcGFzdDogbmV3UGFzdCxcbiAgICAgICAgICAgICAgICBwcmVzZW50OiBwcmV2aW91cyxcbiAgICAgICAgICAgICAgICBmdXR1cmU6IFtwcmVzZW50LCAuLi5mdXR1cmVdXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAnUkVETyc6IHtcbiAgICAgICAgICAgIGNvbnN0IHtwYXN0LCBwcmVzZW50LCBmdXR1cmV9ID0gc3RhdGU7XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gZnV0dXJlWzBdO1xuICAgICAgICAgICAgY29uc3QgbmV3RnV0dXJlID0gZnV0dXJlLnNsaWNlKDEpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBwYXN0OiBbLi4ucGFzdCwgcHJlc2VudF0sXG4gICAgICAgICAgICAgICAgcHJlc2VudDogbmV4dCxcbiAgICAgICAgICAgICAgICBmdXR1cmU6IG5ld0Z1dHVyZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ1JFVkVSVCc6IHtcbiAgICAgICAgICAgIGNvbnN0IHtwYXN0LCBmdXR1cmV9ID0gc3RhdGU7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IHBhc3RbcGFzdC5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIGNvbnN0IG5ld1Bhc3QgPSBwYXN0LnNsaWNlKDAsIHBhc3QubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHBhc3Q6IG5ld1Bhc3QsXG4gICAgICAgICAgICAgICAgcHJlc2VudDogcHJldmlvdXMsXG4gICAgICAgICAgICAgICAgZnV0dXJlOiBbLi4uZnV0dXJlXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgaGlzdG9yeTtcbiIsImNvbnN0IGN1c3RvbUhvb2tzID0gKFxuICAgIHN0YXRlID0ge1xuICAgICAgICBsYXlvdXRfcHJlOiBudWxsLFxuICAgICAgICBsYXlvdXRfcG9zdDogbnVsbCxcbiAgICAgICAgcmVxdWVzdF9wcmU6IG51bGwsXG4gICAgICAgIHJlcXVlc3RfcG9zdDogbnVsbCxcbiAgICAgICAgY2FsbGJhY2tfcmVzb2x2ZWQ6IG51bGwsXG4gICAgICAgIHJlcXVlc3RfcmVmcmVzaF9qd3Q6IG51bGwsXG4gICAgICAgIGJlYXI6IGZhbHNlXG4gICAgfSxcbiAgICBhY3Rpb25cbikgPT4ge1xuICAgIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnU0VUX0hPT0tTJzpcbiAgICAgICAgICAgIHJldHVybiBhY3Rpb24ucGF5bG9hZDtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjdXN0b21Ib29rcztcbiIsImltcG9ydCB7XG4gICAgaW5jbHVkZXMsXG4gICAgbWVyZ2VSaWdodCxcbiAgICBhcHBlbmQsXG4gICAgdmlldyxcbiAgICBsZW5zUGF0aCxcbiAgICBhc3NvY1BhdGgsXG4gICAgZGlzc29jUGF0aFxufSBmcm9tICdyYW1kYSc7XG5cbmltcG9ydCB7Z2V0QWN0aW9ufSBmcm9tICcuLi9hY3Rpb25zL2NvbnN0YW50cyc7XG5cbmNvbnN0IGxheW91dCA9IChzdGF0ZSA9IHtjb21wb25lbnRzOiBbXX0sIGFjdGlvbikgPT4ge1xuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gZ2V0QWN0aW9uKCdTRVRfTEFZT1VUJykpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYWN0aW9uLnBheWxvYWQpKSB7XG4gICAgICAgICAgICBzdGF0ZS5jb21wb25lbnRzID0gWy4uLmFjdGlvbi5wYXlsb2FkXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXRlLmNvbXBvbmVudHMgPSB7Li4uYWN0aW9uLnBheWxvYWR9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIGluY2x1ZGVzKGFjdGlvbi50eXBlLCBbXG4gICAgICAgICAgICAnVU5ET19QUk9QX0NIQU5HRScsXG4gICAgICAgICAgICAnUkVET19QUk9QX0NIQU5HRScsXG4gICAgICAgICAgICBnZXRBY3Rpb24oJ09OX1BST1BfQ0hBTkdFJylcbiAgICAgICAgXSlcbiAgICApIHtcbiAgICAgICAgY29uc3QgcHJvcFBhdGggPSBhcHBlbmQoJ3Byb3BzJywgYWN0aW9uLnBheWxvYWQuaXRlbXBhdGgpO1xuICAgICAgICBjb25zdCBleGlzdGluZ1Byb3BzID0gdmlldyhsZW5zUGF0aChwcm9wUGF0aCksIHN0YXRlKTtcbiAgICAgICAgY29uc3QgbWVyZ2VkUHJvcHMgPSBtZXJnZVJpZ2h0KGV4aXN0aW5nUHJvcHMsIGFjdGlvbi5wYXlsb2FkLnByb3BzKTtcbiAgICAgICAgcmV0dXJuIGFzc29jUGF0aChwcm9wUGF0aCwgbWVyZ2VkUHJvcHMsIHN0YXRlKTtcbiAgICB9XG4gICAgLy8gQ3VzdG9tIGNvbXBvbmVudCByZW5kZXJlZCBvdXQgb2YgdHJlZS5cbiAgICBlbHNlIGlmIChhY3Rpb24udHlwZSA9PT0gZ2V0QWN0aW9uKCdJTlNFUlRfQ09NUE9ORU5UJykpIHtcbiAgICAgICAgY29uc3Qge2NvbXBvbmVudCwgY29tcG9uZW50UGF0aH0gPSBhY3Rpb24ucGF5bG9hZDtcbiAgICAgICAgcmV0dXJuIGFzc29jUGF0aChjb21wb25lbnRQYXRoLCBjb21wb25lbnQsIHN0YXRlKTtcbiAgICB9IGVsc2UgaWYgKGFjdGlvbi50eXBlID09PSBnZXRBY3Rpb24oJ1JFTU9WRV9DT01QT05FTlQnKSkge1xuICAgICAgICBjb25zdCB7Y29tcG9uZW50UGF0aH0gPSBhY3Rpb24ucGF5bG9hZDtcbiAgICAgICAgcmV0dXJuIGRpc3NvY1BhdGgoY29tcG9uZW50UGF0aCwgc3RhdGUpO1xuICAgIH1cblxuICAgIHJldHVybiBzdGF0ZTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGxheW91dDtcbiIsImltcG9ydCB7Z2V0QWN0aW9ufSBmcm9tICcuLi9hY3Rpb25zL2NvbnN0YW50cyc7XG5cbmNvbnN0IGluaXRpYWxQYXRocyA9IHtzdHJzOiB7fSwgb2Jqczoge30sIG9iakluZGV4OiB7fX07XG5cbmNvbnN0IHBhdGhzID0gKHN0YXRlID0gaW5pdGlhbFBhdGhzLCBhY3Rpb24pID0+IHtcbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGdldEFjdGlvbignU0VUX1BBVEhTJykpIHtcbiAgICAgICAgcmV0dXJuIGFjdGlvbi5wYXlsb2FkO1xuICAgIH1cbiAgICByZXR1cm4gc3RhdGU7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBwYXRocztcbiIsImltcG9ydCB7Y2xvbmV9IGZyb20gJ3JhbWRhJztcblxuaW1wb3J0IHtTVEFUVVNNQVB9IGZyb20gJy4uL2NvbnN0YW50cy9jb25zdGFudHMnO1xuXG5jb25zdCBkZWZhdWx0UHJvZmlsZSA9IHtcbiAgICBjb3VudDogMCxcbiAgICB0b3RhbDogMCxcbiAgICBjb21wdXRlOiAwLFxuICAgIG5ldHdvcms6IHtcbiAgICAgICAgdGltZTogMCxcbiAgICAgICAgdXBsb2FkOiAwLFxuICAgICAgICBkb3dubG9hZDogMFxuICAgIH0sXG4gICAgcmVzb3VyY2VzOiB7fSxcbiAgICBzdGF0dXM6IHtcbiAgICAgICAgbGF0ZXN0OiBudWxsXG4gICAgfSxcbiAgICByZXN1bHQ6IHt9XG59O1xuXG5jb25zdCBkZWZhdWx0U3RhdGUgPSB7XG4gICAgdXBkYXRlZDogW10sXG4gICAgcmVzb3VyY2VzOiB7fSxcbiAgICBjYWxsYmFja3M6IHt9LFxuICAgIGdyYXBoTGF5b3V0OiBudWxsXG59O1xuXG5jb25zdCBwcm9maWxlID0gKHN0YXRlID0gZGVmYXVsdFN0YXRlLCBhY3Rpb24pID0+IHtcbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09ICdVUERBVEVfUkVTT1VSQ0VfVVNBR0UnKSB7XG4gICAgICAgIC8vIEtlZXAgYSByZWNvcmQgb2YgdGhlIG1vc3QgcmVjZW50IGNoYW5nZS4gVGhpc1xuICAgICAgICAvLyBpcyBzdWJ0bHkgZGlmZmVyZW50IGZyb20gaGlzdG9yeS5wcmVzZW50IGJlY2F1c2VcbiAgICAgICAgLy8gaXQgd2F0Y2hlcyBhbGwgcHJvcHMsIG5vdCBqdXN0IGlucHV0cy5cbiAgICAgICAgY29uc3Qge2lkLCB1c2FnZSwgc3RhdHVzfSA9IGFjdGlvbi5wYXlsb2FkO1xuICAgICAgICBjb25zdCBzdGF0dXNNYXBwZWQgPSBTVEFUVVNNQVBbc3RhdHVzXSB8fCBzdGF0dXM7XG5cbiAgICAgICAgLy8gS2VlcCB0cmFjayBvZiB0aGUgY2FsbGJhY2sgdGhhdCBhY3R1YWxseSBjaGFuZ2VkLlxuICAgICAgICBjb25zdCBuZXdTdGF0ZSA9IHtcbiAgICAgICAgICAgIHVwZGF0ZWQ6IFtpZF0sXG4gICAgICAgICAgICByZXNvdXJjZXM6IHN0YXRlLnJlc291cmNlcyxcbiAgICAgICAgICAgIGNhbGxiYWNrczogc3RhdGUuY2FsbGJhY2tzLFxuICAgICAgICAgICAgLy8gZ3JhcGhMYXlvdXQgaXMgbmV2ZXIgcGFzc2VkIGluIHZpYSBhY3Rpb25zLCBiZWNhdXNlIHdlIGRvbid0XG4gICAgICAgICAgICAvLyB3YW50IGl0IHRvIHRyaWdnZXIgYSByZXJlbmRlciBvZiB0aGUgY2FsbGJhY2sgZ3JhcGguXG4gICAgICAgICAgICAvLyBTZWUgQ2FsbGJhY2tHcmFwaENvbnRhaW5lci5yZWFjdFxuICAgICAgICAgICAgZ3JhcGhMYXlvdXQ6IHN0YXRlLmdyYXBoTGF5b3V0XG4gICAgICAgIH07XG5cbiAgICAgICAgbmV3U3RhdGUuY2FsbGJhY2tzW2lkXSA9XG4gICAgICAgICAgICBuZXdTdGF0ZS5jYWxsYmFja3NbaWRdIHx8IGNsb25lKGRlZmF1bHRQcm9maWxlKTtcblxuICAgICAgICBjb25zdCBjYiA9IG5ld1N0YXRlLmNhbGxiYWNrc1tpZF07XG4gICAgICAgIGNvbnN0IGNiUmVzb3VyY2VzID0gY2IucmVzb3VyY2VzO1xuICAgICAgICBjb25zdCB0b3RhbFJlc291cmNlcyA9IG5ld1N0YXRlLnJlc291cmNlcztcblxuICAgICAgICAvLyBVcGRhdGUgcmVzb3VyY2UgdXNhZ2UgJiBwYXJhbXMuXG4gICAgICAgIGNiLmNvdW50ICs9IDE7XG4gICAgICAgIGNiLnN0YXR1cy5sYXRlc3QgPSBzdGF0dXNNYXBwZWQ7XG4gICAgICAgIGNiLnN0YXR1c1tzdGF0dXNNYXBwZWRdID0gKGNiLnN0YXR1c1tzdGF0dXNNYXBwZWRdIHx8IDApICsgMTtcbiAgICAgICAgY2IucmVzdWx0ID0gYWN0aW9uLnBheWxvYWQucmVzdWx0O1xuICAgICAgICBjYi5pbnB1dHMgPSBhY3Rpb24ucGF5bG9hZC5pbnB1dHM7XG4gICAgICAgIGNiLnN0YXRlID0gYWN0aW9uLnBheWxvYWQuc3RhdGU7XG5cbiAgICAgICAgaWYgKHVzYWdlKSB7XG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgX19kYXNoX2NsaWVudCxcbiAgICAgICAgICAgICAgICBfX2Rhc2hfc2VydmVyLFxuICAgICAgICAgICAgICAgIF9fZGFzaF91cGxvYWQsXG4gICAgICAgICAgICAgICAgX19kYXNoX2Rvd25sb2FkLFxuICAgICAgICAgICAgICAgIC4uLnVzZXJcbiAgICAgICAgICAgIH0gPSB1c2FnZTtcblxuICAgICAgICAgICAgY2IudG90YWwgKz0gX19kYXNoX2NsaWVudDtcbiAgICAgICAgICAgIGNiLmNvbXB1dGUgKz0gX19kYXNoX3NlcnZlcjtcbiAgICAgICAgICAgIGNiLm5ldHdvcmsudGltZSArPSBfX2Rhc2hfY2xpZW50IC0gX19kYXNoX3NlcnZlcjtcbiAgICAgICAgICAgIGNiLm5ldHdvcmsudXBsb2FkICs9IF9fZGFzaF91cGxvYWQ7XG4gICAgICAgICAgICBjYi5uZXR3b3JrLmRvd25sb2FkICs9IF9fZGFzaF9kb3dubG9hZDtcblxuICAgICAgICAgICAgZm9yIChjb25zdCByIGluIHVzZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAodXNlci5oYXNPd25Qcm9wZXJ0eShyKSkge1xuICAgICAgICAgICAgICAgICAgICBjYlJlc291cmNlc1tyXSA9IChjYlJlc291cmNlc1tyXSB8fCAwKSArIHVzZXJbcl07XG4gICAgICAgICAgICAgICAgICAgIHRvdGFsUmVzb3VyY2VzW3JdID0gKHRvdGFsUmVzb3VyY2VzW3JdIHx8IDApICsgdXNlcltyXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3U3RhdGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0YXRlO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgcHJvZmlsZTtcbiIsImltcG9ydCB7Zm9yRWFjaCwgaW5jbHVkZXMsIGlzRW1wdHksIGtleXMsIHBhdGgsIGFzc29jLCBwYXRoT3J9IGZyb20gJ3JhbWRhJztcbmltcG9ydCB7Y29tYmluZVJlZHVjZXJzfSBmcm9tICdyZWR1eCc7XG5cbmltcG9ydCB7Z2V0Q2FsbGJhY2tzQnlJbnB1dH0gZnJvbSAnLi4vYWN0aW9ucy9kZXBlbmRlbmNpZXNfdHMnO1xuXG5pbXBvcnQgY3JlYXRlQXBpUmVkdWNlciBmcm9tICcuL2FwaSc7XG5pbXBvcnQgYXBwTGlmZWN5Y2xlIGZyb20gJy4vYXBwTGlmZWN5Y2xlJztcbmltcG9ydCBjYWxsYmFja3MgZnJvbSAnLi9jYWxsYmFja3MnO1xuaW1wb3J0IGNvbmZpZyBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQgZ3JhcGhzIGZyb20gJy4vZGVwZW5kZW5jeUdyYXBoJztcbmltcG9ydCBlcnJvciBmcm9tICcuL2Vycm9yJztcbmltcG9ydCBoaXN0b3J5IGZyb20gJy4vaGlzdG9yeSc7XG5pbXBvcnQgaG9va3MgZnJvbSAnLi9ob29rcyc7XG5pbXBvcnQgcHJvZmlsZSBmcm9tICcuL3Byb2ZpbGUnO1xuaW1wb3J0IGNoYW5nZWQgZnJvbSAnLi9jaGFuZ2VkJztcbmltcG9ydCBpc0xvYWRpbmcgZnJvbSAnLi9pc0xvYWRpbmcnO1xuaW1wb3J0IGxheW91dCBmcm9tICcuL2xheW91dCc7XG5pbXBvcnQgcGF0aHMgZnJvbSAnLi9wYXRocyc7XG5pbXBvcnQgY2FsbGJhY2tKb2JzIGZyb20gJy4vY2FsbGJhY2tKb2JzJztcbmltcG9ydCBsb2FkaW5nIGZyb20gJy4vbG9hZGluZyc7XG5pbXBvcnQge3N0cmluZ2lmeVBhdGh9IGZyb20gJy4uL3dyYXBwZXIvd3JhcHBpbmcnO1xuXG5leHBvcnQgY29uc3QgYXBpUmVxdWVzdHMgPSBbXG4gICAgJ2RlcGVuZGVuY2llc1JlcXVlc3QnLFxuICAgICdsYXlvdXRSZXF1ZXN0JyxcbiAgICAncmVsb2FkUmVxdWVzdCcsXG4gICAgJ2xvZ2luUmVxdWVzdCdcbl07XG5cbmNvbnN0IGxheW91dEhhc2hlcyA9IChzdGF0ZSA9IHt9LCBhY3Rpb24pID0+IHtcbiAgICBpZiAoXG4gICAgICAgIGluY2x1ZGVzKGFjdGlvbi50eXBlLCBbXG4gICAgICAgICAgICAnVU5ET19QUk9QX0NIQU5HRScsXG4gICAgICAgICAgICAnUkVET19QUk9QX0NIQU5HRScsXG4gICAgICAgICAgICAnT05fUFJPUF9DSEFOR0UnXG4gICAgICAgIF0pXG4gICAgKSB7XG4gICAgICAgIC8vIExldCB1cyBjb21wYXJlIHRoZSBwYXRocyBzdW1zIHRvIGdldCB1cGRhdGVzIHdpdGhvdXQgdHJpZ2dlcmluZ1xuICAgICAgICAvLyByZW5kZXIgb24gdGhlIHBhcmVudCBjb250YWluZXJzLlxuICAgICAgICBjb25zdCBhY3Rpb25QYXRoID0gYWN0aW9uLnBheWxvYWQuaXRlbXBhdGg7XG4gICAgICAgIGNvbnN0IHN0clBhdGggPSBzdHJpbmdpZnlQYXRoKGFjdGlvblBhdGgpO1xuICAgICAgICBjb25zdCBwcmV2ID0gcGF0aE9yKDAsIFtzdHJQYXRoLCAnaGFzaCddLCBzdGF0ZSk7XG4gICAgICAgIHN0YXRlID0gYXNzb2MoXG4gICAgICAgICAgICBzdHJQYXRoLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGhhc2g6IHByZXYgKyAxLFxuICAgICAgICAgICAgICAgIGNoYW5nZWRQcm9wczogYWN0aW9uLnBheWxvYWQucHJvcHMsXG4gICAgICAgICAgICAgICAgcmVuZGVyVHlwZTogYWN0aW9uLnBheWxvYWQucmVuZGVyVHlwZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN0YXRlXG4gICAgICAgICk7XG4gICAgfSBlbHNlIGlmIChhY3Rpb24udHlwZSA9PT0gJ1JFU0VUX0NPTVBPTkVOVF9TVEFURScpIHtcbiAgICAgICAgY29uc3Qge2l0ZW1wYXRofSA9IGFjdGlvbi5wYXlsb2FkO1xuICAgICAgICBpZiAoaXRlbXBhdGgpIHtcbiAgICAgICAgICAgIGNvbnN0IHByZWZpeFN0ciA9IHN0cmluZ2lmeVBhdGgoaXRlbXBhdGgpO1xuICAgICAgICAgICAgLy8gUmVtb3ZlIGFsbCBoYXNoZXMgZm9yIGtleXMgc3RhcnRpbmcgd2l0aCBwcmVmaXhTdHJcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoc3RhdGUpLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgKFtrZXldKSA9PiAha2V5LnN0YXJ0c1dpdGgocHJlZml4U3RyKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlO1xufTtcblxuZnVuY3Rpb24gbWFpblJlZHVjZXIoKSB7XG4gICAgY29uc3QgcGFydHMgPSB7XG4gICAgICAgIGFwcExpZmVjeWNsZSxcbiAgICAgICAgY2FsbGJhY2tzLFxuICAgICAgICBjb25maWcsXG4gICAgICAgIGVycm9yLFxuICAgICAgICBncmFwaHMsXG4gICAgICAgIGhpc3RvcnksXG4gICAgICAgIGhvb2tzLFxuICAgICAgICBwcm9maWxlLFxuICAgICAgICBjaGFuZ2VkLFxuICAgICAgICBpc0xvYWRpbmcsXG4gICAgICAgIGxheW91dCxcbiAgICAgICAgcGF0aHMsXG4gICAgICAgIGxheW91dEhhc2hlcyxcbiAgICAgICAgbG9hZGluZ1xuICAgIH07XG4gICAgZm9yRWFjaChyID0+IHtcbiAgICAgICAgcGFydHNbcl0gPSBjcmVhdGVBcGlSZWR1Y2VyKHIpO1xuICAgIH0sIGFwaVJlcXVlc3RzKTtcblxuICAgIHBhcnRzLmNhbGxiYWNrSm9icyA9IGNhbGxiYWNrSm9icztcblxuICAgIHJldHVybiBjb21iaW5lUmVkdWNlcnMocGFydHMpO1xufVxuXG5mdW5jdGlvbiBnZXRJbnB1dEhpc3RvcnlTdGF0ZShwYXlsb2FkLCBzdGF0ZSwgcmVjb3JkQ2hhbmdlcykge1xuICAgIGNvbnN0IHtncmFwaHMsIHBhdGhzLCBsYXlvdXR9ID0gc3RhdGU7XG4gICAgY29uc3Qge2l0ZW1wYXRoLCBwcm9wc30gPSBwYXlsb2FkO1xuICAgIGNvbnN0IHJlZlByb3BzID0gcGF0aChpdGVtcGF0aC5jb25jYXQoWydwcm9wcyddKSwgbGF5b3V0KSB8fCB7fTtcbiAgICBjb25zdCB7aWR9ID0gcmVmUHJvcHM7XG5cbiAgICBsZXQgaGlzdG9yeUVudHJ5O1xuICAgIGlmIChpZCkge1xuICAgICAgICBpZiAocmVjb3JkQ2hhbmdlcykge1xuICAgICAgICAgICAgc3RhdGUuY2hhbmdlZCA9IHtpZCwgcHJvcHN9O1xuICAgICAgICB9XG5cbiAgICAgICAgaGlzdG9yeUVudHJ5ID0ge2lkLCBwcm9wczoge319O1xuICAgICAgICBrZXlzKHByb3BzKS5mb3JFYWNoKHByb3BLZXkgPT4ge1xuICAgICAgICAgICAgaWYgKGdldENhbGxiYWNrc0J5SW5wdXQoZ3JhcGhzLCBwYXRocywgaWQsIHByb3BLZXkpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGhpc3RvcnlFbnRyeS5wcm9wc1twcm9wS2V5XSA9IHJlZlByb3BzW3Byb3BLZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGhpc3RvcnlFbnRyeTtcbn1cblxuZnVuY3Rpb24gcmVjb3JkSGlzdG9yeShyZWR1Y2VyKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uKSB7XG4gICAgICAgIC8vIFJlY29yZCBpbml0aWFsIHN0YXRlXG4gICAgICAgIGNvbnN0IHt0eXBlLCBwYXlsb2FkfSA9IGFjdGlvbjtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdPTl9QUk9QX0NIQU5HRScpIHtcbiAgICAgICAgICAgIC8vIGhpc3RvcnkgcmVjb3JkcyBhbGwgcHJvcCBjaGFuZ2VzIHRoYXQgYXJlIGlucHV0cy5cbiAgICAgICAgICAgIGNvbnN0IGhpc3RvcnlFbnRyeSA9IGdldElucHV0SGlzdG9yeVN0YXRlKHBheWxvYWQsIHN0YXRlLCB0cnVlKTtcbiAgICAgICAgICAgIGlmIChoaXN0b3J5RW50cnkgJiYgIWlzRW1wdHkoaGlzdG9yeUVudHJ5LnByb3BzKSkge1xuICAgICAgICAgICAgICAgIHN0YXRlLmhpc3RvcnkucHJlc2VudCA9IGhpc3RvcnlFbnRyeTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5leHRTdGF0ZSA9IHJlZHVjZXIoc3RhdGUsIGFjdGlvbik7XG5cbiAgICAgICAgaWYgKHR5cGUgPT09ICdPTl9QUk9QX0NIQU5HRScgJiYgcGF5bG9hZC5zb3VyY2UgIT09ICdyZXNwb25zZScpIHtcbiAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgKiBpZiB0aGUgcHJvcCBjaGFuZ2UgaXMgYW4gaW5wdXQsIHRoZW5cbiAgICAgICAgICAgICAqIHJlY29yZCBpdCBzbyB0aGF0IGl0IGNhbiBiZSBwbGF5ZWQgYmFja1xuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBjb25zdCBoaXN0b3J5RW50cnkgPSBnZXRJbnB1dEhpc3RvcnlTdGF0ZShwYXlsb2FkLCBuZXh0U3RhdGUpO1xuICAgICAgICAgICAgaWYgKGhpc3RvcnlFbnRyeSAmJiAhaXNFbXB0eShoaXN0b3J5RW50cnkucHJvcHMpKSB7XG4gICAgICAgICAgICAgICAgbmV4dFN0YXRlLmhpc3RvcnkgPSB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3Q6IFsuLi5uZXh0U3RhdGUuaGlzdG9yeS5wYXN0LCBzdGF0ZS5oaXN0b3J5LnByZXNlbnRdLFxuICAgICAgICAgICAgICAgICAgICBwcmVzZW50OiBoaXN0b3J5RW50cnksXG4gICAgICAgICAgICAgICAgICAgIGZ1dHVyZTogW11cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5leHRTdGF0ZTtcbiAgICB9O1xufVxuXG5mdW5jdGlvbiByZWxvYWRlclJlZHVjZXIocmVkdWNlcikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbikge1xuICAgICAgICBjb25zdCB7aGlzdG9yeSwgY29uZmlnLCBob29rc30gPSBzdGF0ZSB8fCB7fTtcbiAgICAgICAgbGV0IG5ld1N0YXRlID0gc3RhdGU7XG4gICAgICAgIGlmIChhY3Rpb24udHlwZSA9PT0gJ1JFTE9BRCcpIHtcbiAgICAgICAgICAgIG5ld1N0YXRlID0ge2hpc3RvcnksIGNvbmZpZywgaG9va3N9O1xuICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi50eXBlID09PSAnU0VUX0NPTkZJRycpIHtcbiAgICAgICAgICAgIC8vIG5ldyBjb25maWcgYWxzbyByZWxvYWRzLCBhbmQgZXZlbiBjbGVhcnMgaGlzdG9yeSxcbiAgICAgICAgICAgIC8vIGluIGNhc2UgdGhlcmUncyBhIG5ldyB1c2VyIG9yIGV2ZW4gYSB0b3RhbGx5IGRpZmZlcmVudCBhcHAhXG4gICAgICAgICAgICAvLyBob29rcyBhcmUgc2V0IGF0IGFuIGV2ZW4gaGlnaGVyIGxldmVsIHRoYW4gY29uZmlnIHRob3VnaC5cbiAgICAgICAgICAgIG5ld1N0YXRlID0ge2hvb2tzfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVkdWNlcihuZXdTdGF0ZSwgYWN0aW9uKTtcbiAgICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVkdWNlcigpIHtcbiAgICByZXR1cm4gcmVsb2FkZXJSZWR1Y2VyKHJlY29yZEhpc3RvcnkobWFpblJlZHVjZXIoKSkpO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQge1xuICAgIHJlc29sdmU6IGNvbXBvbmVudCA9PiB7XG4gICAgICAgIGNvbnN0IHt0eXBlLCBuYW1lc3BhY2V9ID0gY29tcG9uZW50O1xuXG4gICAgICAgIGNvbnN0IG5zID0gd2luZG93W25hbWVzcGFjZV07XG5cbiAgICAgICAgaWYgKG5zKSB7XG4gICAgICAgICAgICBpZiAobnNbdHlwZV0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnNbdHlwZV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ29tcG9uZW50ICR7dHlwZX0gbm90IGZvdW5kIGluICR7bmFtZXNwYWNlfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke25hbWVzcGFjZX0gd2FzIG5vdCBmb3VuZC5gKTtcbiAgICB9XG59O1xuIiwiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiY29zZS1iYXNlXCIpKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtcImNvc2UtYmFzZVwiXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJjeXRvc2NhcGVGY29zZVwiXSA9IGZhY3RvcnkocmVxdWlyZShcImNvc2UtYmFzZVwiKSk7XG5cdGVsc2Vcblx0XHRyb290W1wiY3l0b3NjYXBlRmNvc2VcIl0gPSBmYWN0b3J5KHJvb3RbXCJjb3NlQmFzZVwiXSk7XG59KSh0aGlzLCBmdW5jdGlvbihfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX18xNDBfXykge1xucmV0dXJuIC8qKioqKiovICgoKSA9PiB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0XCJ1c2Ugc3RyaWN0XCI7XG4vKioqKioqLyBcdHZhciBfX3dlYnBhY2tfbW9kdWxlc19fID0gKHtcblxuLyoqKi8gNjU4OlxuLyoqKi8gKChtb2R1bGUpID0+IHtcblxuXG5cbi8vIFNpbXBsZSwgaW50ZXJuYWwgT2JqZWN0LmFzc2lnbigpIHBvbHlmaWxsIGZvciBvcHRpb25zIG9iamVjdHMgZXRjLlxuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5hc3NpZ24gIT0gbnVsbCA/IE9iamVjdC5hc3NpZ24uYmluZChPYmplY3QpIDogZnVuY3Rpb24gKHRndCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgc3JjcyA9IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBzcmNzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHNyY3MuZm9yRWFjaChmdW5jdGlvbiAoc3JjKSB7XG4gICAgT2JqZWN0LmtleXMoc3JjKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgICByZXR1cm4gdGd0W2tdID0gc3JjW2tdO1xuICAgIH0pO1xuICB9KTtcblxuICByZXR1cm4gdGd0O1xufTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDU0ODpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG5cbnZhciBfc2xpY2VkVG9BcnJheSA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gc2xpY2VJdGVyYXRvcihhcnIsIGkpIHsgdmFyIF9hcnIgPSBbXTsgdmFyIF9uID0gdHJ1ZTsgdmFyIF9kID0gZmFsc2U7IHZhciBfZSA9IHVuZGVmaW5lZDsgdHJ5IHsgZm9yICh2YXIgX2kgPSBhcnJbU3ltYm9sLml0ZXJhdG9yXSgpLCBfczsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkgeyBfYXJyLnB1c2goX3MudmFsdWUpOyBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7IH0gfSBjYXRjaCAoZXJyKSB7IF9kID0gdHJ1ZTsgX2UgPSBlcnI7IH0gZmluYWxseSB7IHRyeSB7IGlmICghX24gJiYgX2lbXCJyZXR1cm5cIl0pIF9pW1wicmV0dXJuXCJdKCk7IH0gZmluYWxseSB7IGlmIChfZCkgdGhyb3cgX2U7IH0gfSByZXR1cm4gX2FycjsgfSByZXR1cm4gZnVuY3Rpb24gKGFyciwgaSkgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7IHJldHVybiBhcnI7IH0gZWxzZSBpZiAoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChhcnIpKSB7IHJldHVybiBzbGljZUl0ZXJhdG9yKGFyciwgaSk7IH0gZWxzZSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlXCIpOyB9IH07IH0oKTtcblxuLypcbiAqIEF1eGlsaWFyeSBmdW5jdGlvbnNcbiAqL1xuXG52YXIgTGlua2VkTGlzdCA9IF9fd2VicGFja19yZXF1aXJlX18oMTQwKS5sYXlvdXRCYXNlLkxpbmtlZExpc3Q7XG5cbnZhciBhdXhpbGlhcnkgPSB7fTtcblxuLy8gZ2V0IHRoZSB0b3AgbW9zdCBub2Rlc1xuYXV4aWxpYXJ5LmdldFRvcE1vc3ROb2RlcyA9IGZ1bmN0aW9uIChub2Rlcykge1xuICB2YXIgbm9kZXNNYXAgPSB7fTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIG5vZGVzTWFwW25vZGVzW2ldLmlkKCldID0gdHJ1ZTtcbiAgfVxuICB2YXIgcm9vdHMgPSBub2Rlcy5maWx0ZXIoZnVuY3Rpb24gKGVsZSwgaSkge1xuICAgIGlmICh0eXBlb2YgZWxlID09PSBcIm51bWJlclwiKSB7XG4gICAgICBlbGUgPSBpO1xuICAgIH1cbiAgICB2YXIgcGFyZW50ID0gZWxlLnBhcmVudCgpWzBdO1xuICAgIHdoaWxlIChwYXJlbnQgIT0gbnVsbCkge1xuICAgICAgaWYgKG5vZGVzTWFwW3BhcmVudC5pZCgpXSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50KClbMF07XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9KTtcblxuICByZXR1cm4gcm9vdHM7XG59O1xuXG4vLyBmaW5kIGRpc2Nvbm5lY3RlZCBjb21wb25lbnRzIGFuZCBjcmVhdGUgZHVtbXkgbm9kZXMgdGhhdCBjb25uZWN0IHRoZW1cbmF1eGlsaWFyeS5jb25uZWN0Q29tcG9uZW50cyA9IGZ1bmN0aW9uIChjeSwgZWxlcywgdG9wTW9zdE5vZGVzLCBkdW1teU5vZGVzKSB7XG4gIHZhciBxdWV1ZSA9IG5ldyBMaW5rZWRMaXN0KCk7XG4gIHZhciB2aXNpdGVkID0gbmV3IFNldCgpO1xuICB2YXIgdmlzaXRlZFRvcE1vc3ROb2RlcyA9IFtdO1xuICB2YXIgY3VycmVudE5laWdoYm9yID0gdm9pZCAwO1xuICB2YXIgbWluRGVncmVlTm9kZSA9IHZvaWQgMDtcbiAgdmFyIG1pbkRlZ3JlZSA9IHZvaWQgMDtcblxuICB2YXIgaXNDb25uZWN0ZWQgPSBmYWxzZTtcbiAgdmFyIGNvdW50ID0gMTtcbiAgdmFyIG5vZGVzQ29ubmVjdGVkVG9EdW1teSA9IFtdO1xuICB2YXIgY29tcG9uZW50cyA9IFtdO1xuXG4gIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKCkge1xuICAgIHZhciBjbXB0ID0gY3kuY29sbGVjdGlvbigpO1xuICAgIGNvbXBvbmVudHMucHVzaChjbXB0KTtcblxuICAgIHZhciBjdXJyZW50Tm9kZSA9IHRvcE1vc3ROb2Rlc1swXTtcbiAgICB2YXIgY2hpbGRyZW5PZkN1cnJlbnROb2RlID0gY3kuY29sbGVjdGlvbigpO1xuICAgIGNoaWxkcmVuT2ZDdXJyZW50Tm9kZS5tZXJnZShjdXJyZW50Tm9kZSkubWVyZ2UoY3VycmVudE5vZGUuZGVzY2VuZGFudHMoKS5pbnRlcnNlY3Rpb24oZWxlcykpO1xuICAgIHZpc2l0ZWRUb3BNb3N0Tm9kZXMucHVzaChjdXJyZW50Tm9kZSk7XG5cbiAgICBjaGlsZHJlbk9mQ3VycmVudE5vZGUuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgcXVldWUucHVzaChub2RlKTtcbiAgICAgIHZpc2l0ZWQuYWRkKG5vZGUpO1xuICAgICAgY21wdC5tZXJnZShub2RlKTtcbiAgICB9KTtcblxuICAgIHZhciBfbG9vcDIgPSBmdW5jdGlvbiBfbG9vcDIoKSB7XG4gICAgICBjdXJyZW50Tm9kZSA9IHF1ZXVlLnNoaWZ0KCk7XG5cbiAgICAgIC8vIFRyYXZlcnNlIGFsbCBuZWlnaGJvcnMgb2YgdGhpcyBub2RlXG4gICAgICB2YXIgbmVpZ2hib3JOb2RlcyA9IGN5LmNvbGxlY3Rpb24oKTtcbiAgICAgIGN1cnJlbnROb2RlLm5laWdoYm9yaG9vZCgpLm5vZGVzKCkuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICBpZiAoZWxlcy5pbnRlcnNlY3Rpb24oY3VycmVudE5vZGUuZWRnZXNXaXRoKG5vZGUpKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgbmVpZ2hib3JOb2Rlcy5tZXJnZShub2RlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmVpZ2hib3JOb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgbmVpZ2hib3JOb2RlID0gbmVpZ2hib3JOb2Rlc1tpXTtcbiAgICAgICAgY3VycmVudE5laWdoYm9yID0gdG9wTW9zdE5vZGVzLmludGVyc2VjdGlvbihuZWlnaGJvck5vZGUudW5pb24obmVpZ2hib3JOb2RlLmFuY2VzdG9ycygpKSk7XG4gICAgICAgIGlmIChjdXJyZW50TmVpZ2hib3IgIT0gbnVsbCAmJiAhdmlzaXRlZC5oYXMoY3VycmVudE5laWdoYm9yWzBdKSkge1xuICAgICAgICAgIHZhciBjaGlsZHJlbk9mTmVpZ2hib3IgPSBjdXJyZW50TmVpZ2hib3IudW5pb24oY3VycmVudE5laWdoYm9yLmRlc2NlbmRhbnRzKCkpO1xuXG4gICAgICAgICAgY2hpbGRyZW5PZk5laWdoYm9yLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgIHF1ZXVlLnB1c2gobm9kZSk7XG4gICAgICAgICAgICB2aXNpdGVkLmFkZChub2RlKTtcbiAgICAgICAgICAgIGNtcHQubWVyZ2Uobm9kZSk7XG4gICAgICAgICAgICBpZiAodG9wTW9zdE5vZGVzLmhhcyhub2RlKSkge1xuICAgICAgICAgICAgICB2aXNpdGVkVG9wTW9zdE5vZGVzLnB1c2gobm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCAhPSAwKSB7XG4gICAgICBfbG9vcDIoKTtcbiAgICB9XG5cbiAgICBjbXB0LmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIGVsZXMuaW50ZXJzZWN0aW9uKG5vZGUuY29ubmVjdGVkRWRnZXMoKSkuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xuICAgICAgICAvLyBjb25uZWN0ZWRFZGdlcygpIHVzdWFsbHkgY2FjaGVkXG4gICAgICAgIGlmIChjbXB0LmhhcyhlLnNvdXJjZSgpKSAmJiBjbXB0LmhhcyhlLnRhcmdldCgpKSkge1xuICAgICAgICAgIC8vIGhhcygpIGlzIGNoZWFwXG4gICAgICAgICAgY21wdC5tZXJnZShlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpZiAodmlzaXRlZFRvcE1vc3ROb2Rlcy5sZW5ndGggPT0gdG9wTW9zdE5vZGVzLmxlbmd0aCkge1xuICAgICAgaXNDb25uZWN0ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmICghaXNDb25uZWN0ZWQgfHwgaXNDb25uZWN0ZWQgJiYgY291bnQgPiAxKSB7XG4gICAgICBtaW5EZWdyZWVOb2RlID0gdmlzaXRlZFRvcE1vc3ROb2Rlc1swXTtcbiAgICAgIG1pbkRlZ3JlZSA9IG1pbkRlZ3JlZU5vZGUuY29ubmVjdGVkRWRnZXMoKS5sZW5ndGg7XG4gICAgICB2aXNpdGVkVG9wTW9zdE5vZGVzLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUuY29ubmVjdGVkRWRnZXMoKS5sZW5ndGggPCBtaW5EZWdyZWUpIHtcbiAgICAgICAgICBtaW5EZWdyZWUgPSBub2RlLmNvbm5lY3RlZEVkZ2VzKCkubGVuZ3RoO1xuICAgICAgICAgIG1pbkRlZ3JlZU5vZGUgPSBub2RlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIG5vZGVzQ29ubmVjdGVkVG9EdW1teS5wdXNoKG1pbkRlZ3JlZU5vZGUuaWQoKSk7XG4gICAgICAvLyBUTyBETzogQ2hlY2sgZWZmaWNpZW5jeSBvZiB0aGlzIHBhcnRcbiAgICAgIHZhciB0ZW1wID0gY3kuY29sbGVjdGlvbigpO1xuICAgICAgdGVtcC5tZXJnZSh2aXNpdGVkVG9wTW9zdE5vZGVzWzBdKTtcbiAgICAgIHZpc2l0ZWRUb3BNb3N0Tm9kZXMuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICB0ZW1wLm1lcmdlKG5vZGUpO1xuICAgICAgfSk7XG4gICAgICB2aXNpdGVkVG9wTW9zdE5vZGVzID0gW107XG4gICAgICB0b3BNb3N0Tm9kZXMgPSB0b3BNb3N0Tm9kZXMuZGlmZmVyZW5jZSh0ZW1wKTtcbiAgICAgIGNvdW50Kys7XG4gICAgfVxuICB9O1xuXG4gIGRvIHtcbiAgICBfbG9vcCgpO1xuICB9IHdoaWxlICghaXNDb25uZWN0ZWQpO1xuXG4gIGlmIChkdW1teU5vZGVzKSB7XG4gICAgaWYgKG5vZGVzQ29ubmVjdGVkVG9EdW1teS5sZW5ndGggPiAwKSB7XG4gICAgICBkdW1teU5vZGVzLnNldCgnZHVtbXknICsgKGR1bW15Tm9kZXMuc2l6ZSArIDEpLCBub2Rlc0Nvbm5lY3RlZFRvRHVtbXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY29tcG9uZW50cztcbn07XG5cbi8vIHJlbG9jYXRlcyBjb21wb25lbnRSZXN1bHQgdG8gb3JpZ2luYWxDZW50ZXIgaWYgdGhlcmUgaXMgbm8gZml4ZWROb2RlQ29uc3RyYWludFxuYXV4aWxpYXJ5LnJlbG9jYXRlQ29tcG9uZW50ID0gZnVuY3Rpb24gKG9yaWdpbmFsQ2VudGVyLCBjb21wb25lbnRSZXN1bHQsIG9wdGlvbnMpIHtcbiAgaWYgKCFvcHRpb25zLmZpeGVkTm9kZUNvbnN0cmFpbnQpIHtcbiAgICB2YXIgbWluWENvb3JkID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICAgIHZhciBtYXhYQ29vcmQgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG4gICAgdmFyIG1pbllDb29yZCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgICB2YXIgbWF4WUNvb3JkID0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO1xuICAgIGlmIChvcHRpb25zLnF1YWxpdHkgPT0gXCJkcmFmdFwiKSB7XG4gICAgICAvLyBjYWxjdWxhdGUgY3VycmVudCBib3VuZGluZyBib3hcbiAgICAgIHZhciBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gdHJ1ZTtcbiAgICAgIHZhciBfZGlkSXRlcmF0b3JFcnJvciA9IGZhbHNlO1xuICAgICAgdmFyIF9pdGVyYXRvckVycm9yID0gdW5kZWZpbmVkO1xuXG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3IgPSBjb21wb25lbnRSZXN1bHQubm9kZUluZGV4ZXNbU3ltYm9sLml0ZXJhdG9yXSgpLCBfc3RlcDsgIShfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gKF9zdGVwID0gX2l0ZXJhdG9yLm5leHQoKSkuZG9uZSk7IF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlKSB7XG4gICAgICAgICAgdmFyIF9yZWYgPSBfc3RlcC52YWx1ZTtcblxuICAgICAgICAgIHZhciBfcmVmMiA9IF9zbGljZWRUb0FycmF5KF9yZWYsIDIpO1xuXG4gICAgICAgICAgdmFyIGtleSA9IF9yZWYyWzBdO1xuICAgICAgICAgIHZhciB2YWx1ZSA9IF9yZWYyWzFdO1xuXG4gICAgICAgICAgdmFyIGN5Tm9kZSA9IG9wdGlvbnMuY3kuZ2V0RWxlbWVudEJ5SWQoa2V5KTtcbiAgICAgICAgICBpZiAoY3lOb2RlKSB7XG4gICAgICAgICAgICB2YXIgbm9kZUJCID0gY3lOb2RlLmJvdW5kaW5nQm94KCk7XG4gICAgICAgICAgICB2YXIgbGVmdFggPSBjb21wb25lbnRSZXN1bHQueENvb3Jkc1t2YWx1ZV0gLSBub2RlQkIudyAvIDI7XG4gICAgICAgICAgICB2YXIgcmlnaHRYID0gY29tcG9uZW50UmVzdWx0LnhDb29yZHNbdmFsdWVdICsgbm9kZUJCLncgLyAyO1xuICAgICAgICAgICAgdmFyIHRvcFkgPSBjb21wb25lbnRSZXN1bHQueUNvb3Jkc1t2YWx1ZV0gLSBub2RlQkIuaCAvIDI7XG4gICAgICAgICAgICB2YXIgYm90dG9tWSA9IGNvbXBvbmVudFJlc3VsdC55Q29vcmRzW3ZhbHVlXSArIG5vZGVCQi5oIC8gMjtcblxuICAgICAgICAgICAgaWYgKGxlZnRYIDwgbWluWENvb3JkKSBtaW5YQ29vcmQgPSBsZWZ0WDtcbiAgICAgICAgICAgIGlmIChyaWdodFggPiBtYXhYQ29vcmQpIG1heFhDb29yZCA9IHJpZ2h0WDtcbiAgICAgICAgICAgIGlmICh0b3BZIDwgbWluWUNvb3JkKSBtaW5ZQ29vcmQgPSB0b3BZO1xuICAgICAgICAgICAgaWYgKGJvdHRvbVkgPiBtYXhZQ29vcmQpIG1heFlDb29yZCA9IGJvdHRvbVk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGZpbmQgZGlmZmVyZW5jZSBiZXR3ZWVuIGN1cnJlbnQgYW5kIG9yaWdpbmFsIGNlbnRlclxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIF9kaWRJdGVyYXRvckVycm9yID0gdHJ1ZTtcbiAgICAgICAgX2l0ZXJhdG9yRXJyb3IgPSBlcnI7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiAmJiBfaXRlcmF0b3IucmV0dXJuKSB7XG4gICAgICAgICAgICBfaXRlcmF0b3IucmV0dXJuKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGlmIChfZGlkSXRlcmF0b3JFcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciBkaWZmT25YID0gb3JpZ2luYWxDZW50ZXIueCAtIChtYXhYQ29vcmQgKyBtaW5YQ29vcmQpIC8gMjtcbiAgICAgIHZhciBkaWZmT25ZID0gb3JpZ2luYWxDZW50ZXIueSAtIChtYXhZQ29vcmQgKyBtaW5ZQ29vcmQpIC8gMjtcbiAgICAgIC8vIG1vdmUgY29tcG9uZW50IHRvIG9yaWdpbmFsIGNlbnRlclxuICAgICAgY29tcG9uZW50UmVzdWx0LnhDb29yZHMgPSBjb21wb25lbnRSZXN1bHQueENvb3Jkcy5tYXAoZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgcmV0dXJuIHggKyBkaWZmT25YO1xuICAgICAgfSk7XG4gICAgICBjb21wb25lbnRSZXN1bHQueUNvb3JkcyA9IGNvbXBvbmVudFJlc3VsdC55Q29vcmRzLm1hcChmdW5jdGlvbiAoeSkge1xuICAgICAgICByZXR1cm4geSArIGRpZmZPblk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gY2FsY3VsYXRlIGN1cnJlbnQgYm91bmRpbmcgYm94XG4gICAgICBPYmplY3Qua2V5cyhjb21wb25lbnRSZXN1bHQpLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgdmFyIG5vZGUgPSBjb21wb25lbnRSZXN1bHRbaXRlbV07XG4gICAgICAgIHZhciBsZWZ0WCA9IG5vZGUuZ2V0UmVjdCgpLng7XG4gICAgICAgIHZhciByaWdodFggPSBub2RlLmdldFJlY3QoKS54ICsgbm9kZS5nZXRSZWN0KCkud2lkdGg7XG4gICAgICAgIHZhciB0b3BZID0gbm9kZS5nZXRSZWN0KCkueTtcbiAgICAgICAgdmFyIGJvdHRvbVkgPSBub2RlLmdldFJlY3QoKS55ICsgbm9kZS5nZXRSZWN0KCkuaGVpZ2h0O1xuXG4gICAgICAgIGlmIChsZWZ0WCA8IG1pblhDb29yZCkgbWluWENvb3JkID0gbGVmdFg7XG4gICAgICAgIGlmIChyaWdodFggPiBtYXhYQ29vcmQpIG1heFhDb29yZCA9IHJpZ2h0WDtcbiAgICAgICAgaWYgKHRvcFkgPCBtaW5ZQ29vcmQpIG1pbllDb29yZCA9IHRvcFk7XG4gICAgICAgIGlmIChib3R0b21ZID4gbWF4WUNvb3JkKSBtYXhZQ29vcmQgPSBib3R0b21ZO1xuICAgICAgfSk7XG4gICAgICAvLyBmaW5kIGRpZmZlcmVuY2UgYmV0d2VlbiBjdXJyZW50IGFuZCBvcmlnaW5hbCBjZW50ZXJcbiAgICAgIHZhciBfZGlmZk9uWCA9IG9yaWdpbmFsQ2VudGVyLnggLSAobWF4WENvb3JkICsgbWluWENvb3JkKSAvIDI7XG4gICAgICB2YXIgX2RpZmZPblkgPSBvcmlnaW5hbENlbnRlci55IC0gKG1heFlDb29yZCArIG1pbllDb29yZCkgLyAyO1xuICAgICAgLy8gbW92ZSBjb21wb25lbnQgdG8gb3JpZ2luYWwgY2VudGVyXG4gICAgICBPYmplY3Qua2V5cyhjb21wb25lbnRSZXN1bHQpLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgdmFyIG5vZGUgPSBjb21wb25lbnRSZXN1bHRbaXRlbV07XG4gICAgICAgIG5vZGUuc2V0Q2VudGVyKG5vZGUuZ2V0Q2VudGVyWCgpICsgX2RpZmZPblgsIG5vZGUuZ2V0Q2VudGVyWSgpICsgX2RpZmZPblkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59O1xuXG5hdXhpbGlhcnkuY2FsY0JvdW5kaW5nQm94ID0gZnVuY3Rpb24gKHBhcmVudE5vZGUsIHhDb29yZHMsIHlDb29yZHMsIG5vZGVJbmRleGVzKSB7XG4gIC8vIGNhbGN1bGF0ZSBib3VuZHNcbiAgdmFyIGxlZnQgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbiAgdmFyIHJpZ2h0ID0gTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVI7XG4gIHZhciB0b3AgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbiAgdmFyIGJvdHRvbSA9IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSO1xuICB2YXIgbm9kZUxlZnQgPSB2b2lkIDA7XG4gIHZhciBub2RlUmlnaHQgPSB2b2lkIDA7XG4gIHZhciBub2RlVG9wID0gdm9pZCAwO1xuICB2YXIgbm9kZUJvdHRvbSA9IHZvaWQgMDtcblxuICB2YXIgbm9kZXMgPSBwYXJlbnROb2RlLmRlc2NlbmRhbnRzKCkubm90KFwiOnBhcmVudFwiKTtcbiAgdmFyIHMgPSBub2Rlcy5sZW5ndGg7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgczsgaSsrKSB7XG4gICAgdmFyIG5vZGUgPSBub2Rlc1tpXTtcblxuICAgIG5vZGVMZWZ0ID0geENvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZS5pZCgpKV0gLSBub2RlLndpZHRoKCkgLyAyO1xuICAgIG5vZGVSaWdodCA9IHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGUuaWQoKSldICsgbm9kZS53aWR0aCgpIC8gMjtcbiAgICBub2RlVG9wID0geUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZS5pZCgpKV0gLSBub2RlLmhlaWdodCgpIC8gMjtcbiAgICBub2RlQm90dG9tID0geUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZS5pZCgpKV0gKyBub2RlLmhlaWdodCgpIC8gMjtcblxuICAgIGlmIChsZWZ0ID4gbm9kZUxlZnQpIHtcbiAgICAgIGxlZnQgPSBub2RlTGVmdDtcbiAgICB9XG5cbiAgICBpZiAocmlnaHQgPCBub2RlUmlnaHQpIHtcbiAgICAgIHJpZ2h0ID0gbm9kZVJpZ2h0O1xuICAgIH1cblxuICAgIGlmICh0b3AgPiBub2RlVG9wKSB7XG4gICAgICB0b3AgPSBub2RlVG9wO1xuICAgIH1cblxuICAgIGlmIChib3R0b20gPCBub2RlQm90dG9tKSB7XG4gICAgICBib3R0b20gPSBub2RlQm90dG9tO1xuICAgIH1cbiAgfVxuXG4gIHZhciBib3VuZGluZ0JveCA9IHt9O1xuICBib3VuZGluZ0JveC50b3BMZWZ0WCA9IGxlZnQ7XG4gIGJvdW5kaW5nQm94LnRvcExlZnRZID0gdG9wO1xuICBib3VuZGluZ0JveC53aWR0aCA9IHJpZ2h0IC0gbGVmdDtcbiAgYm91bmRpbmdCb3guaGVpZ2h0ID0gYm90dG9tIC0gdG9wO1xuICByZXR1cm4gYm91bmRpbmdCb3g7XG59O1xuXG4vLyBUaGlzIGZ1bmN0aW9uIGZpbmRzIGFuZCByZXR1cm5zIHBhcmVudCBub2RlcyB3aG9zZSBhbGwgY2hpbGRyZW4gYXJlIGhpZGRlblxuYXV4aWxpYXJ5LmNhbGNQYXJlbnRzV2l0aG91dENoaWxkcmVuID0gZnVuY3Rpb24gKGN5LCBlbGVzKSB7XG4gIHZhciBwYXJlbnRzV2l0aG91dENoaWxkcmVuID0gY3kuY29sbGVjdGlvbigpO1xuICBlbGVzLm5vZGVzKCc6cGFyZW50JykuZm9yRWFjaChmdW5jdGlvbiAocGFyZW50KSB7XG4gICAgdmFyIGNoZWNrID0gZmFsc2U7XG4gICAgcGFyZW50LmNoaWxkcmVuKCkuZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgIGlmIChjaGlsZC5jc3MoJ2Rpc3BsYXknKSAhPSAnbm9uZScpIHtcbiAgICAgICAgY2hlY2sgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmICghY2hlY2spIHtcbiAgICAgIHBhcmVudHNXaXRob3V0Q2hpbGRyZW4ubWVyZ2UocGFyZW50KTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBwYXJlbnRzV2l0aG91dENoaWxkcmVuO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBhdXhpbGlhcnk7XG5cbi8qKiovIH0pLFxuXG4vKioqLyA4MTY6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxuXG4vKipcbiAgVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBwb3N0cHJvY2Vzc2luZyBwYXJ0IHRoYXQgYXBwbGllcyBDb1NFIGxheW91dCBvdmVyIHRoZSBzcGVjdHJhbCBsYXlvdXRcbiovXG5cbnZhciBhdXggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU0OCk7XG52YXIgQ29TRUxheW91dCA9IF9fd2VicGFja19yZXF1aXJlX18oMTQwKS5Db1NFTGF5b3V0O1xudmFyIENvU0VOb2RlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDApLkNvU0VOb2RlO1xudmFyIFBvaW50RCA9IF9fd2VicGFja19yZXF1aXJlX18oMTQwKS5sYXlvdXRCYXNlLlBvaW50RDtcbnZhciBEaW1lbnNpb25EID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDApLmxheW91dEJhc2UuRGltZW5zaW9uRDtcbnZhciBMYXlvdXRDb25zdGFudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0MCkubGF5b3V0QmFzZS5MYXlvdXRDb25zdGFudHM7XG52YXIgRkRMYXlvdXRDb25zdGFudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0MCkubGF5b3V0QmFzZS5GRExheW91dENvbnN0YW50cztcbnZhciBDb1NFQ29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDApLkNvU0VDb25zdGFudHM7XG5cbi8vIG1haW4gZnVuY3Rpb24gdGhhdCBjb3NlIGxheW91dCBpcyBwcm9jZXNzZWRcbnZhciBjb3NlTGF5b3V0ID0gZnVuY3Rpb24gY29zZUxheW91dChvcHRpb25zLCBzcGVjdHJhbFJlc3VsdCkge1xuXG4gIHZhciBjeSA9IG9wdGlvbnMuY3k7XG4gIHZhciBlbGVzID0gb3B0aW9ucy5lbGVzO1xuICB2YXIgbm9kZXMgPSBlbGVzLm5vZGVzKCk7XG4gIHZhciBlZGdlcyA9IGVsZXMuZWRnZXMoKTtcblxuICB2YXIgbm9kZUluZGV4ZXMgPSB2b2lkIDA7XG4gIHZhciB4Q29vcmRzID0gdm9pZCAwO1xuICB2YXIgeUNvb3JkcyA9IHZvaWQgMDtcbiAgdmFyIGlkVG9MTm9kZSA9IHt9O1xuXG4gIGlmIChvcHRpb25zLnJhbmRvbWl6ZSkge1xuICAgIG5vZGVJbmRleGVzID0gc3BlY3RyYWxSZXN1bHRbXCJub2RlSW5kZXhlc1wiXTtcbiAgICB4Q29vcmRzID0gc3BlY3RyYWxSZXN1bHRbXCJ4Q29vcmRzXCJdO1xuICAgIHlDb29yZHMgPSBzcGVjdHJhbFJlc3VsdFtcInlDb29yZHNcIl07XG4gIH1cblxuICB2YXIgaXNGbiA9IGZ1bmN0aW9uIGlzRm4oZm4pIHtcbiAgICByZXR1cm4gdHlwZW9mIGZuID09PSAnZnVuY3Rpb24nO1xuICB9O1xuXG4gIHZhciBvcHRGbiA9IGZ1bmN0aW9uIG9wdEZuKG9wdCwgZWxlKSB7XG4gICAgaWYgKGlzRm4ob3B0KSkge1xuICAgICAgcmV0dXJuIG9wdChlbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gb3B0O1xuICAgIH1cbiAgfTtcblxuICAvKioqKiBQb3N0cHJvY2Vzc2luZyBmdW5jdGlvbnMgKioqKi9cblxuICB2YXIgcGFyZW50c1dpdGhvdXRDaGlsZHJlbiA9IGF1eC5jYWxjUGFyZW50c1dpdGhvdXRDaGlsZHJlbihjeSwgZWxlcyk7XG5cbiAgLy8gdHJhbnNmZXIgY3l0b3NjYXBlIG5vZGVzIHRvIGNvc2Ugbm9kZXNcbiAgdmFyIHByb2Nlc3NDaGlsZHJlbkxpc3QgPSBmdW5jdGlvbiBwcm9jZXNzQ2hpbGRyZW5MaXN0KHBhcmVudCwgY2hpbGRyZW4sIGxheW91dCwgb3B0aW9ucykge1xuICAgIHZhciBzaXplID0gY2hpbGRyZW4ubGVuZ3RoO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgICB2YXIgdGhlQ2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICAgIHZhciBjaGlsZHJlbl9vZl9jaGlsZHJlbiA9IG51bGw7XG4gICAgICBpZiAodGhlQ2hpbGQuaW50ZXJzZWN0aW9uKHBhcmVudHNXaXRob3V0Q2hpbGRyZW4pLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgIGNoaWxkcmVuX29mX2NoaWxkcmVuID0gdGhlQ2hpbGQuY2hpbGRyZW4oKTtcbiAgICAgIH1cbiAgICAgIHZhciB0aGVOb2RlID0gdm9pZCAwO1xuXG4gICAgICB2YXIgZGltZW5zaW9ucyA9IHRoZUNoaWxkLmxheW91dERpbWVuc2lvbnMoe1xuICAgICAgICBub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHM6IG9wdGlvbnMubm9kZURpbWVuc2lvbnNJbmNsdWRlTGFiZWxzXG4gICAgICB9KTtcblxuICAgICAgaWYgKHRoZUNoaWxkLm91dGVyV2lkdGgoKSAhPSBudWxsICYmIHRoZUNoaWxkLm91dGVySGVpZ2h0KCkgIT0gbnVsbCkge1xuICAgICAgICBpZiAob3B0aW9ucy5yYW5kb21pemUpIHtcbiAgICAgICAgICBpZiAoIXRoZUNoaWxkLmlzUGFyZW50KCkpIHtcbiAgICAgICAgICAgIHRoZU5vZGUgPSBwYXJlbnQuYWRkKG5ldyBDb1NFTm9kZShsYXlvdXQuZ3JhcGhNYW5hZ2VyLCBuZXcgUG9pbnREKHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KHRoZUNoaWxkLmlkKCkpXSAtIGRpbWVuc2lvbnMudyAvIDIsIHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KHRoZUNoaWxkLmlkKCkpXSAtIGRpbWVuc2lvbnMuaCAvIDIpLCBuZXcgRGltZW5zaW9uRChwYXJzZUZsb2F0KGRpbWVuc2lvbnMudyksIHBhcnNlRmxvYXQoZGltZW5zaW9ucy5oKSkpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHBhcmVudEluZm8gPSBhdXguY2FsY0JvdW5kaW5nQm94KHRoZUNoaWxkLCB4Q29vcmRzLCB5Q29vcmRzLCBub2RlSW5kZXhlcyk7XG4gICAgICAgICAgICBpZiAodGhlQ2hpbGQuaW50ZXJzZWN0aW9uKHBhcmVudHNXaXRob3V0Q2hpbGRyZW4pLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgIHRoZU5vZGUgPSBwYXJlbnQuYWRkKG5ldyBDb1NFTm9kZShsYXlvdXQuZ3JhcGhNYW5hZ2VyLCBuZXcgUG9pbnREKHBhcmVudEluZm8udG9wTGVmdFgsIHBhcmVudEluZm8udG9wTGVmdFkpLCBuZXcgRGltZW5zaW9uRChwYXJlbnRJbmZvLndpZHRoLCBwYXJlbnRJbmZvLmhlaWdodCkpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIGZvciB0aGUgcGFyZW50c1dpdGhvdXRDaGlsZHJlblxuICAgICAgICAgICAgICB0aGVOb2RlID0gcGFyZW50LmFkZChuZXcgQ29TRU5vZGUobGF5b3V0LmdyYXBoTWFuYWdlciwgbmV3IFBvaW50RChwYXJlbnRJbmZvLnRvcExlZnRYLCBwYXJlbnRJbmZvLnRvcExlZnRZKSwgbmV3IERpbWVuc2lvbkQocGFyc2VGbG9hdChkaW1lbnNpb25zLncpLCBwYXJzZUZsb2F0KGRpbWVuc2lvbnMuaCkpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoZU5vZGUgPSBwYXJlbnQuYWRkKG5ldyBDb1NFTm9kZShsYXlvdXQuZ3JhcGhNYW5hZ2VyLCBuZXcgUG9pbnREKHRoZUNoaWxkLnBvc2l0aW9uKCd4JykgLSBkaW1lbnNpb25zLncgLyAyLCB0aGVDaGlsZC5wb3NpdGlvbigneScpIC0gZGltZW5zaW9ucy5oIC8gMiksIG5ldyBEaW1lbnNpb25EKHBhcnNlRmxvYXQoZGltZW5zaW9ucy53KSwgcGFyc2VGbG9hdChkaW1lbnNpb25zLmgpKSkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGVOb2RlID0gcGFyZW50LmFkZChuZXcgQ29TRU5vZGUodGhpcy5ncmFwaE1hbmFnZXIpKTtcbiAgICAgIH1cbiAgICAgIC8vIEF0dGFjaCBpZCB0byB0aGUgbGF5b3V0IG5vZGUgYW5kIHJlcHVsc2lvbiB2YWx1ZVxuICAgICAgdGhlTm9kZS5pZCA9IHRoZUNoaWxkLmRhdGEoXCJpZFwiKTtcbiAgICAgIHRoZU5vZGUubm9kZVJlcHVsc2lvbiA9IG9wdEZuKG9wdGlvbnMubm9kZVJlcHVsc2lvbiwgdGhlQ2hpbGQpO1xuICAgICAgLy8gQXR0YWNoIHRoZSBwYWRkaW5ncyBvZiBjeSBub2RlIHRvIGxheW91dCBub2RlXG4gICAgICB0aGVOb2RlLnBhZGRpbmdMZWZ0ID0gcGFyc2VJbnQodGhlQ2hpbGQuY3NzKCdwYWRkaW5nJykpO1xuICAgICAgdGhlTm9kZS5wYWRkaW5nVG9wID0gcGFyc2VJbnQodGhlQ2hpbGQuY3NzKCdwYWRkaW5nJykpO1xuICAgICAgdGhlTm9kZS5wYWRkaW5nUmlnaHQgPSBwYXJzZUludCh0aGVDaGlsZC5jc3MoJ3BhZGRpbmcnKSk7XG4gICAgICB0aGVOb2RlLnBhZGRpbmdCb3R0b20gPSBwYXJzZUludCh0aGVDaGlsZC5jc3MoJ3BhZGRpbmcnKSk7XG5cbiAgICAgIC8vQXR0YWNoIHRoZSBsYWJlbCBwcm9wZXJ0aWVzIHRvIGJvdGggY29tcG91bmQgYW5kIHNpbXBsZSBub2RlcyBpZiBsYWJlbHMgd2lsbCBiZSBpbmNsdWRlZCBpbiBub2RlIGRpbWVuc2lvbnNcbiAgICAgIC8vVGhlc2UgcHJvcGVydGllcyB3aWxsIGJlIHVzZWQgd2hpbGUgdXBkYXRpbmcgYm91bmRzIG9mIGNvbXBvdW5kcyBkdXJpbmcgaXRlcmF0aW9ucyBvciB0aWxpbmdcbiAgICAgIC8vYW5kIHdpbGwgYmUgdXNlZCBmb3Igc2ltcGxlIG5vZGVzIHdoaWxlIHRyYW5zZmVycmluZyBmaW5hbCBwb3NpdGlvbnMgdG8gY3l0b3NjYXBlXG4gICAgICBpZiAob3B0aW9ucy5ub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHMpIHtcbiAgICAgICAgdGhlTm9kZS5sYWJlbFdpZHRoID0gdGhlQ2hpbGQuYm91bmRpbmdCb3goeyBpbmNsdWRlTGFiZWxzOiB0cnVlLCBpbmNsdWRlTm9kZXM6IGZhbHNlLCBpbmNsdWRlT3ZlcmxheXM6IGZhbHNlIH0pLnc7XG4gICAgICAgIHRoZU5vZGUubGFiZWxIZWlnaHQgPSB0aGVDaGlsZC5ib3VuZGluZ0JveCh7IGluY2x1ZGVMYWJlbHM6IHRydWUsIGluY2x1ZGVOb2RlczogZmFsc2UsIGluY2x1ZGVPdmVybGF5czogZmFsc2UgfSkuaDtcbiAgICAgICAgdGhlTm9kZS5sYWJlbFBvc1ZlcnRpY2FsID0gdGhlQ2hpbGQuY3NzKFwidGV4dC12YWxpZ25cIik7XG4gICAgICAgIHRoZU5vZGUubGFiZWxQb3NIb3Jpem9udGFsID0gdGhlQ2hpbGQuY3NzKFwidGV4dC1oYWxpZ25cIik7XG4gICAgICB9XG5cbiAgICAgIC8vIE1hcCB0aGUgbGF5b3V0IG5vZGVcbiAgICAgIGlkVG9MTm9kZVt0aGVDaGlsZC5kYXRhKFwiaWRcIildID0gdGhlTm9kZTtcblxuICAgICAgaWYgKGlzTmFOKHRoZU5vZGUucmVjdC54KSkge1xuICAgICAgICB0aGVOb2RlLnJlY3QueCA9IDA7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc05hTih0aGVOb2RlLnJlY3QueSkpIHtcbiAgICAgICAgdGhlTm9kZS5yZWN0LnkgPSAwO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hpbGRyZW5fb2ZfY2hpbGRyZW4gIT0gbnVsbCAmJiBjaGlsZHJlbl9vZl9jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZhciB0aGVOZXdHcmFwaCA9IHZvaWQgMDtcbiAgICAgICAgdGhlTmV3R3JhcGggPSBsYXlvdXQuZ2V0R3JhcGhNYW5hZ2VyKCkuYWRkKGxheW91dC5uZXdHcmFwaCgpLCB0aGVOb2RlKTtcbiAgICAgICAgcHJvY2Vzc0NoaWxkcmVuTGlzdCh0aGVOZXdHcmFwaCwgY2hpbGRyZW5fb2ZfY2hpbGRyZW4sIGxheW91dCwgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8vIHRyYW5zZmVyIGN5dG9zY2FwZSBlZGdlcyB0byBjb3NlIGVkZ2VzXG4gIHZhciBwcm9jZXNzRWRnZXMgPSBmdW5jdGlvbiBwcm9jZXNzRWRnZXMobGF5b3V0LCBnbSwgZWRnZXMpIHtcbiAgICB2YXIgaWRlYWxMZW5ndGhUb3RhbCA9IDA7XG4gICAgdmFyIGVkZ2VDb3VudCA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlZGdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVkZ2UgPSBlZGdlc1tpXTtcbiAgICAgIHZhciBzb3VyY2VOb2RlID0gaWRUb0xOb2RlW2VkZ2UuZGF0YShcInNvdXJjZVwiKV07XG4gICAgICB2YXIgdGFyZ2V0Tm9kZSA9IGlkVG9MTm9kZVtlZGdlLmRhdGEoXCJ0YXJnZXRcIildO1xuICAgICAgaWYgKHNvdXJjZU5vZGUgJiYgdGFyZ2V0Tm9kZSAmJiBzb3VyY2VOb2RlICE9PSB0YXJnZXROb2RlICYmIHNvdXJjZU5vZGUuZ2V0RWRnZXNCZXR3ZWVuKHRhcmdldE5vZGUpLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgIHZhciBlMSA9IGdtLmFkZChsYXlvdXQubmV3RWRnZSgpLCBzb3VyY2VOb2RlLCB0YXJnZXROb2RlKTtcbiAgICAgICAgZTEuaWQgPSBlZGdlLmlkKCk7XG4gICAgICAgIGUxLmlkZWFsTGVuZ3RoID0gb3B0Rm4ob3B0aW9ucy5pZGVhbEVkZ2VMZW5ndGgsIGVkZ2UpO1xuICAgICAgICBlMS5lZGdlRWxhc3RpY2l0eSA9IG9wdEZuKG9wdGlvbnMuZWRnZUVsYXN0aWNpdHksIGVkZ2UpO1xuICAgICAgICBpZGVhbExlbmd0aFRvdGFsICs9IGUxLmlkZWFsTGVuZ3RoO1xuICAgICAgICBlZGdlQ291bnQrKztcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gd2UgbmVlZCB0byB1cGRhdGUgdGhlIGlkZWFsIGVkZ2UgbGVuZ3RoIGNvbnN0YW50IHdpdGggdGhlIGF2Zy4gaWRlYWwgbGVuZ3RoIHZhbHVlIGFmdGVyIHByb2Nlc3NpbmcgZWRnZXNcbiAgICAvLyBpbiBjYXNlIHRoZXJlIGlzIG5vIGVkZ2UsIHVzZSBvdGhlciBvcHRpb25zXG4gICAgaWYgKG9wdGlvbnMuaWRlYWxFZGdlTGVuZ3RoICE9IG51bGwpIHtcbiAgICAgIGlmIChlZGdlQ291bnQgPiAwKSBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfRURHRV9MRU5HVEggPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIID0gaWRlYWxMZW5ndGhUb3RhbCAvIGVkZ2VDb3VudDtlbHNlIGlmICghaXNGbihvcHRpb25zLmlkZWFsRWRnZUxlbmd0aCkpIC8vIGluIGNhc2UgdGhlcmUgaXMgbm8gZWRnZSwgYnV0IG9wdGlvbiBnaXZlcyBhIHZhbHVlIHRvIHVzZVxuICAgICAgICBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfRURHRV9MRU5HVEggPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIID0gb3B0aW9ucy5pZGVhbEVkZ2VMZW5ndGg7ZWxzZSAvLyBpbiBjYXNlIHRoZXJlIGlzIG5vIGVkZ2UgYW5kIHdlIGNhbm5vdCBnZXQgYSB2YWx1ZSBmcm9tIG9wdGlvbiAoYmVjYXVzZSBpdCdzIGEgZnVuY3Rpb24pXG4gICAgICAgIENvU0VDb25zdGFudHMuREVGQVVMVF9FREdFX0xFTkdUSCA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfRURHRV9MRU5HVEggPSA1MDtcbiAgICAgIC8vIHdlIG5lZWQgdG8gdXBkYXRlIHRoZXNlIGNvbnN0YW50IHZhbHVlcyBiYXNlZCBvbiB0aGUgaWRlYWwgZWRnZSBsZW5ndGggY29uc3RhbnRcbiAgICAgIENvU0VDb25zdGFudHMuTUlOX1JFUFVMU0lPTl9ESVNUID0gRkRMYXlvdXRDb25zdGFudHMuTUlOX1JFUFVMU0lPTl9ESVNUID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9FREdFX0xFTkdUSCAvIDEwLjA7XG4gICAgICBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfUkFESUFMX1NFUEFSQVRJT04gPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIO1xuICAgIH1cbiAgfTtcblxuICAvLyB0cmFuc2ZlciBjeXRvc2NhcGUgY29uc3RyYWludHMgdG8gY29zZSBsYXlvdXRcbiAgdmFyIHByb2Nlc3NDb25zdHJhaW50cyA9IGZ1bmN0aW9uIHByb2Nlc3NDb25zdHJhaW50cyhsYXlvdXQsIG9wdGlvbnMpIHtcbiAgICAvLyBnZXQgbm9kZXMgdG8gYmUgZml4ZWRcbiAgICBpZiAob3B0aW9ucy5maXhlZE5vZGVDb25zdHJhaW50KSB7XG4gICAgICBsYXlvdXQuY29uc3RyYWludHNbXCJmaXhlZE5vZGVDb25zdHJhaW50XCJdID0gb3B0aW9ucy5maXhlZE5vZGVDb25zdHJhaW50O1xuICAgIH1cbiAgICAvLyBnZXQgbm9kZXMgdG8gYmUgYWxpZ25lZFxuICAgIGlmIChvcHRpb25zLmFsaWdubWVudENvbnN0cmFpbnQpIHtcbiAgICAgIGxheW91dC5jb25zdHJhaW50c1tcImFsaWdubWVudENvbnN0cmFpbnRcIl0gPSBvcHRpb25zLmFsaWdubWVudENvbnN0cmFpbnQ7XG4gICAgfVxuICAgIC8vIGdldCBub2RlcyB0byBiZSByZWxhdGl2ZWx5IHBsYWNlZFxuICAgIGlmIChvcHRpb25zLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludCkge1xuICAgICAgbGF5b3V0LmNvbnN0cmFpbnRzW1wicmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50XCJdID0gb3B0aW9ucy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQ7XG4gICAgfVxuICB9O1xuXG4gIC8qKioqIEFwcGx5IHBvc3Rwcm9jZXNzaW5nICoqKiovXG4gIGlmIChvcHRpb25zLm5lc3RpbmdGYWN0b3IgIT0gbnVsbCkgQ29TRUNvbnN0YW50cy5QRVJfTEVWRUxfSURFQUxfRURHRV9MRU5HVEhfRkFDVE9SID0gRkRMYXlvdXRDb25zdGFudHMuUEVSX0xFVkVMX0lERUFMX0VER0VfTEVOR1RIX0ZBQ1RPUiA9IG9wdGlvbnMubmVzdGluZ0ZhY3RvcjtcbiAgaWYgKG9wdGlvbnMuZ3Jhdml0eSAhPSBudWxsKSBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfR1JBVklUWV9TVFJFTkdUSCA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfR1JBVklUWV9TVFJFTkdUSCA9IG9wdGlvbnMuZ3Jhdml0eTtcbiAgaWYgKG9wdGlvbnMubnVtSXRlciAhPSBudWxsKSBDb1NFQ29uc3RhbnRzLk1BWF9JVEVSQVRJT05TID0gRkRMYXlvdXRDb25zdGFudHMuTUFYX0lURVJBVElPTlMgPSBvcHRpb25zLm51bUl0ZXI7XG4gIGlmIChvcHRpb25zLmdyYXZpdHlSYW5nZSAhPSBudWxsKSBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfR1JBVklUWV9SQU5HRV9GQUNUT1IgPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0dSQVZJVFlfUkFOR0VfRkFDVE9SID0gb3B0aW9ucy5ncmF2aXR5UmFuZ2U7XG4gIGlmIChvcHRpb25zLmdyYXZpdHlDb21wb3VuZCAhPSBudWxsKSBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfQ09NUE9VTkRfR1JBVklUWV9TVFJFTkdUSCA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQ09NUE9VTkRfR1JBVklUWV9TVFJFTkdUSCA9IG9wdGlvbnMuZ3Jhdml0eUNvbXBvdW5kO1xuICBpZiAob3B0aW9ucy5ncmF2aXR5UmFuZ2VDb21wb3VuZCAhPSBudWxsKSBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfQ09NUE9VTkRfR1JBVklUWV9SQU5HRV9GQUNUT1IgPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0NPTVBPVU5EX0dSQVZJVFlfUkFOR0VfRkFDVE9SID0gb3B0aW9ucy5ncmF2aXR5UmFuZ2VDb21wb3VuZDtcbiAgaWYgKG9wdGlvbnMuaW5pdGlhbEVuZXJneU9uSW5jcmVtZW50YWwgIT0gbnVsbCkgQ29TRUNvbnN0YW50cy5ERUZBVUxUX0NPT0xJTkdfRkFDVE9SX0lOQ1JFTUVOVEFMID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9DT09MSU5HX0ZBQ1RPUl9JTkNSRU1FTlRBTCA9IG9wdGlvbnMuaW5pdGlhbEVuZXJneU9uSW5jcmVtZW50YWw7XG5cbiAgaWYgKG9wdGlvbnMudGlsaW5nQ29tcGFyZUJ5ICE9IG51bGwpIENvU0VDb25zdGFudHMuVElMSU5HX0NPTVBBUkVfQlkgPSBvcHRpb25zLnRpbGluZ0NvbXBhcmVCeTtcblxuICBpZiAob3B0aW9ucy5xdWFsaXR5ID09ICdwcm9vZicpIExheW91dENvbnN0YW50cy5RVUFMSVRZID0gMjtlbHNlIExheW91dENvbnN0YW50cy5RVUFMSVRZID0gMDtcblxuICBDb1NFQ29uc3RhbnRzLk5PREVfRElNRU5TSU9OU19JTkNMVURFX0xBQkVMUyA9IEZETGF5b3V0Q29uc3RhbnRzLk5PREVfRElNRU5TSU9OU19JTkNMVURFX0xBQkVMUyA9IExheW91dENvbnN0YW50cy5OT0RFX0RJTUVOU0lPTlNfSU5DTFVERV9MQUJFTFMgPSBvcHRpb25zLm5vZGVEaW1lbnNpb25zSW5jbHVkZUxhYmVscztcbiAgQ29TRUNvbnN0YW50cy5ERUZBVUxUX0lOQ1JFTUVOVEFMID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9JTkNSRU1FTlRBTCA9IExheW91dENvbnN0YW50cy5ERUZBVUxUX0lOQ1JFTUVOVEFMID0gIW9wdGlvbnMucmFuZG9taXplO1xuICBDb1NFQ29uc3RhbnRzLkFOSU1BVEUgPSBGRExheW91dENvbnN0YW50cy5BTklNQVRFID0gTGF5b3V0Q29uc3RhbnRzLkFOSU1BVEUgPSBvcHRpb25zLmFuaW1hdGU7XG4gIENvU0VDb25zdGFudHMuVElMRSA9IG9wdGlvbnMudGlsZTtcbiAgQ29TRUNvbnN0YW50cy5USUxJTkdfUEFERElOR19WRVJUSUNBTCA9IHR5cGVvZiBvcHRpb25zLnRpbGluZ1BhZGRpbmdWZXJ0aWNhbCA9PT0gJ2Z1bmN0aW9uJyA/IG9wdGlvbnMudGlsaW5nUGFkZGluZ1ZlcnRpY2FsLmNhbGwoKSA6IG9wdGlvbnMudGlsaW5nUGFkZGluZ1ZlcnRpY2FsO1xuICBDb1NFQ29uc3RhbnRzLlRJTElOR19QQURESU5HX0hPUklaT05UQUwgPSB0eXBlb2Ygb3B0aW9ucy50aWxpbmdQYWRkaW5nSG9yaXpvbnRhbCA9PT0gJ2Z1bmN0aW9uJyA/IG9wdGlvbnMudGlsaW5nUGFkZGluZ0hvcml6b250YWwuY2FsbCgpIDogb3B0aW9ucy50aWxpbmdQYWRkaW5nSG9yaXpvbnRhbDtcblxuICBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfSU5DUkVNRU5UQUwgPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0lOQ1JFTUVOVEFMID0gTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfSU5DUkVNRU5UQUwgPSB0cnVlO1xuICBDb1NFQ29uc3RhbnRzLlBVUkVfSU5DUkVNRU5UQUwgPSAhb3B0aW9ucy5yYW5kb21pemU7XG4gIExheW91dENvbnN0YW50cy5ERUZBVUxUX1VOSUZPUk1fTEVBRl9OT0RFX1NJWkVTID0gb3B0aW9ucy51bmlmb3JtTm9kZURpbWVuc2lvbnM7XG5cbiAgLy8gVGhpcyBwYXJ0IGlzIGZvciBkZWJ1Zy9kZW1vIHB1cnBvc2VcbiAgaWYgKG9wdGlvbnMuc3RlcCA9PSBcInRyYW5zZm9ybWVkXCIpIHtcbiAgICBDb1NFQ29uc3RhbnRzLlRSQU5TRk9STV9PTl9DT05TVFJBSU5UX0hBTkRMSU5HID0gdHJ1ZTtcbiAgICBDb1NFQ29uc3RhbnRzLkVORk9SQ0VfQ09OU1RSQUlOVFMgPSBmYWxzZTtcbiAgICBDb1NFQ29uc3RhbnRzLkFQUExZX0xBWU9VVCA9IGZhbHNlO1xuICB9XG4gIGlmIChvcHRpb25zLnN0ZXAgPT0gXCJlbmZvcmNlZFwiKSB7XG4gICAgQ29TRUNvbnN0YW50cy5UUkFOU0ZPUk1fT05fQ09OU1RSQUlOVF9IQU5ETElORyA9IGZhbHNlO1xuICAgIENvU0VDb25zdGFudHMuRU5GT1JDRV9DT05TVFJBSU5UUyA9IHRydWU7XG4gICAgQ29TRUNvbnN0YW50cy5BUFBMWV9MQVlPVVQgPSBmYWxzZTtcbiAgfVxuICBpZiAob3B0aW9ucy5zdGVwID09IFwiY29zZVwiKSB7XG4gICAgQ29TRUNvbnN0YW50cy5UUkFOU0ZPUk1fT05fQ09OU1RSQUlOVF9IQU5ETElORyA9IGZhbHNlO1xuICAgIENvU0VDb25zdGFudHMuRU5GT1JDRV9DT05TVFJBSU5UUyA9IGZhbHNlO1xuICAgIENvU0VDb25zdGFudHMuQVBQTFlfTEFZT1VUID0gdHJ1ZTtcbiAgfVxuICBpZiAob3B0aW9ucy5zdGVwID09IFwiYWxsXCIpIHtcbiAgICBpZiAob3B0aW9ucy5yYW5kb21pemUpIENvU0VDb25zdGFudHMuVFJBTlNGT1JNX09OX0NPTlNUUkFJTlRfSEFORExJTkcgPSB0cnVlO2Vsc2UgQ29TRUNvbnN0YW50cy5UUkFOU0ZPUk1fT05fQ09OU1RSQUlOVF9IQU5ETElORyA9IGZhbHNlO1xuICAgIENvU0VDb25zdGFudHMuRU5GT1JDRV9DT05TVFJBSU5UUyA9IHRydWU7XG4gICAgQ29TRUNvbnN0YW50cy5BUFBMWV9MQVlPVVQgPSB0cnVlO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuZml4ZWROb2RlQ29uc3RyYWludCB8fCBvcHRpb25zLmFsaWdubWVudENvbnN0cmFpbnQgfHwgb3B0aW9ucy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQpIHtcbiAgICBDb1NFQ29uc3RhbnRzLlRSRUVfUkVEVUNUSU9OX09OX0lOQ1JFTUVOVEFMID0gZmFsc2U7XG4gIH0gZWxzZSB7XG4gICAgQ29TRUNvbnN0YW50cy5UUkVFX1JFRFVDVElPTl9PTl9JTkNSRU1FTlRBTCA9IHRydWU7XG4gIH1cblxuICB2YXIgY29zZUxheW91dCA9IG5ldyBDb1NFTGF5b3V0KCk7XG4gIHZhciBnbSA9IGNvc2VMYXlvdXQubmV3R3JhcGhNYW5hZ2VyKCk7XG5cbiAgcHJvY2Vzc0NoaWxkcmVuTGlzdChnbS5hZGRSb290KCksIGF1eC5nZXRUb3BNb3N0Tm9kZXMobm9kZXMpLCBjb3NlTGF5b3V0LCBvcHRpb25zKTtcbiAgcHJvY2Vzc0VkZ2VzKGNvc2VMYXlvdXQsIGdtLCBlZGdlcyk7XG4gIHByb2Nlc3NDb25zdHJhaW50cyhjb3NlTGF5b3V0LCBvcHRpb25zKTtcblxuICBjb3NlTGF5b3V0LnJ1bkxheW91dCgpO1xuXG4gIHJldHVybiBpZFRvTE5vZGU7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHsgY29zZUxheW91dDogY29zZUxheW91dCB9O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gMjEyOlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cblxudmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuLyoqXG4gIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZmNvc2UgbGF5b3V0IGFsZ29yaXRobVxuKi9cblxudmFyIGFzc2lnbiA9IF9fd2VicGFja19yZXF1aXJlX18oNjU4KTtcbnZhciBhdXggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU0OCk7XG5cbnZhciBfcmVxdWlyZSA9IF9fd2VicGFja19yZXF1aXJlX18oNjU3KSxcbiAgICBzcGVjdHJhbExheW91dCA9IF9yZXF1aXJlLnNwZWN0cmFsTGF5b3V0O1xuXG52YXIgX3JlcXVpcmUyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MTYpLFxuICAgIGNvc2VMYXlvdXQgPSBfcmVxdWlyZTIuY29zZUxheW91dDtcblxudmFyIGRlZmF1bHRzID0gT2JqZWN0LmZyZWV6ZSh7XG5cbiAgLy8gJ2RyYWZ0JywgJ2RlZmF1bHQnIG9yICdwcm9vZicgXG4gIC8vIC0gJ2RyYWZ0JyBvbmx5IGFwcGxpZXMgc3BlY3RyYWwgbGF5b3V0IFxuICAvLyAtICdkZWZhdWx0JyBpbXByb3ZlcyB0aGUgcXVhbGl0eSB3aXRoIHN1YnNlcXVlbnQgQ29TRSBsYXlvdXQgKGZhc3QgY29vbGluZyByYXRlKVxuICAvLyAtICdwcm9vZicgaW1wcm92ZXMgdGhlIHF1YWxpdHkgd2l0aCBzdWJzZXF1ZW50IENvU0UgbGF5b3V0IChzbG93IGNvb2xpbmcgcmF0ZSkgXG4gIHF1YWxpdHk6IFwiZGVmYXVsdFwiLFxuICAvLyBVc2UgcmFuZG9tIG5vZGUgcG9zaXRpb25zIGF0IGJlZ2lubmluZyBvZiBsYXlvdXRcbiAgLy8gaWYgdGhpcyBpcyBzZXQgdG8gZmFsc2UsIHRoZW4gcXVhbGl0eSBvcHRpb24gbXVzdCBiZSBcInByb29mXCJcbiAgcmFuZG9taXplOiB0cnVlLFxuICAvLyBXaGV0aGVyIG9yIG5vdCB0byBhbmltYXRlIHRoZSBsYXlvdXRcbiAgYW5pbWF0ZTogdHJ1ZSxcbiAgLy8gRHVyYXRpb24gb2YgYW5pbWF0aW9uIGluIG1zLCBpZiBlbmFibGVkXG4gIGFuaW1hdGlvbkR1cmF0aW9uOiAxMDAwLFxuICAvLyBFYXNpbmcgb2YgYW5pbWF0aW9uLCBpZiBlbmFibGVkXG4gIGFuaW1hdGlvbkVhc2luZzogdW5kZWZpbmVkLFxuICAvLyBGaXQgdGhlIHZpZXdwb3J0IHRvIHRoZSByZXBvc2l0aW9uZWQgbm9kZXNcbiAgZml0OiB0cnVlLFxuICAvLyBQYWRkaW5nIGFyb3VuZCBsYXlvdXRcbiAgcGFkZGluZzogMzAsXG4gIC8vIFdoZXRoZXIgdG8gaW5jbHVkZSBsYWJlbHMgaW4gbm9kZSBkaW1lbnNpb25zLiBWYWxpZCBpbiBcInByb29mXCIgcXVhbGl0eVxuICBub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHM6IGZhbHNlLFxuICAvLyBXaGV0aGVyIG9yIG5vdCBzaW1wbGUgbm9kZXMgKG5vbi1jb21wb3VuZCBub2RlcykgYXJlIG9mIHVuaWZvcm0gZGltZW5zaW9uc1xuICB1bmlmb3JtTm9kZURpbWVuc2lvbnM6IGZhbHNlLFxuICAvLyBXaGV0aGVyIHRvIHBhY2sgZGlzY29ubmVjdGVkIGNvbXBvbmVudHMgLSB2YWxpZCBvbmx5IGlmIHJhbmRvbWl6ZTogdHJ1ZVxuICBwYWNrQ29tcG9uZW50czogdHJ1ZSxcbiAgLy8gTGF5b3V0IHN0ZXAgLSBhbGwsIHRyYW5zZm9ybWVkLCBlbmZvcmNlZCwgY29zZSAtIGZvciBkZWJ1ZyBwdXJwb3NlIG9ubHlcbiAgc3RlcDogXCJhbGxcIixcblxuICAvKiBzcGVjdHJhbCBsYXlvdXQgb3B0aW9ucyAqL1xuXG4gIC8vIEZhbHNlIGZvciByYW5kb20sIHRydWUgZm9yIGdyZWVkeVxuICBzYW1wbGluZ1R5cGU6IHRydWUsXG4gIC8vIFNhbXBsZSBzaXplIHRvIGNvbnN0cnVjdCBkaXN0YW5jZSBtYXRyaXhcbiAgc2FtcGxlU2l6ZTogMjUsXG4gIC8vIFNlcGFyYXRpb24gYW1vdW50IGJldHdlZW4gbm9kZXNcbiAgbm9kZVNlcGFyYXRpb246IDc1LFxuICAvLyBQb3dlciBpdGVyYXRpb24gdG9sZXJhbmNlXG4gIHBpVG9sOiAwLjAwMDAwMDEsXG5cbiAgLyogQ29TRSBsYXlvdXQgb3B0aW9ucyAqL1xuXG4gIC8vIE5vZGUgcmVwdWxzaW9uIChub24gb3ZlcmxhcHBpbmcpIG11bHRpcGxpZXJcbiAgbm9kZVJlcHVsc2lvbjogZnVuY3Rpb24gbm9kZVJlcHVsc2lvbihub2RlKSB7XG4gICAgcmV0dXJuIDQ1MDA7XG4gIH0sXG4gIC8vIElkZWFsIGVkZ2UgKG5vbiBuZXN0ZWQpIGxlbmd0aFxuICBpZGVhbEVkZ2VMZW5ndGg6IGZ1bmN0aW9uIGlkZWFsRWRnZUxlbmd0aChlZGdlKSB7XG4gICAgcmV0dXJuIDUwO1xuICB9LFxuICAvLyBEaXZpc29yIHRvIGNvbXB1dGUgZWRnZSBmb3JjZXNcbiAgZWRnZUVsYXN0aWNpdHk6IGZ1bmN0aW9uIGVkZ2VFbGFzdGljaXR5KGVkZ2UpIHtcbiAgICByZXR1cm4gMC40NTtcbiAgfSxcbiAgLy8gTmVzdGluZyBmYWN0b3IgKG11bHRpcGxpZXIpIHRvIGNvbXB1dGUgaWRlYWwgZWRnZSBsZW5ndGggZm9yIG5lc3RlZCBlZGdlc1xuICBuZXN0aW5nRmFjdG9yOiAwLjEsXG4gIC8vIEdyYXZpdHkgZm9yY2UgKGNvbnN0YW50KVxuICBncmF2aXR5OiAwLjI1LFxuICAvLyBNYXhpbXVtIG51bWJlciBvZiBpdGVyYXRpb25zIHRvIHBlcmZvcm1cbiAgbnVtSXRlcjogMjUwMCxcbiAgLy8gRm9yIGVuYWJsaW5nIHRpbGluZ1xuICB0aWxlOiB0cnVlLFxuICAvLyBUaGUgZnVuY3Rpb24gdGhhdCBzcGVjaWZpZXMgdGhlIGNyaXRlcmlhIGZvciBjb21wYXJpbmcgbm9kZXMgd2hpbGUgc29ydGluZyB0aGVtIGR1cmluZyB0aWxpbmcgb3BlcmF0aW9uLlxuICAvLyBUYWtlcyB0aGUgbm9kZSBpZCBhcyBhIHBhcmFtZXRlciBhbmQgdGhlIGRlZmF1bHQgdGlsaW5nIG9wZXJhdGlvbiBpcyBwZXJmb21lZCB3aGVuIHRoaXMgb3B0aW9uIGlzIG5vdCBzZXQuXG4gIHRpbGluZ0NvbXBhcmVCeTogdW5kZWZpbmVkLFxuICAvLyBSZXByZXNlbnRzIHRoZSBhbW91bnQgb2YgdGhlIHZlcnRpY2FsIHNwYWNlIHRvIHB1dCBiZXR3ZWVuIHRoZSB6ZXJvIGRlZ3JlZSBtZW1iZXJzIGR1cmluZyB0aGUgdGlsaW5nIG9wZXJhdGlvbihjYW4gYWxzbyBiZSBhIGZ1bmN0aW9uKVxuICB0aWxpbmdQYWRkaW5nVmVydGljYWw6IDEwLFxuICAvLyBSZXByZXNlbnRzIHRoZSBhbW91bnQgb2YgdGhlIGhvcml6b250YWwgc3BhY2UgdG8gcHV0IGJldHdlZW4gdGhlIHplcm8gZGVncmVlIG1lbWJlcnMgZHVyaW5nIHRoZSB0aWxpbmcgb3BlcmF0aW9uKGNhbiBhbHNvIGJlIGEgZnVuY3Rpb24pXG4gIHRpbGluZ1BhZGRpbmdIb3Jpem9udGFsOiAxMCxcbiAgLy8gR3Jhdml0eSByYW5nZSAoY29uc3RhbnQpIGZvciBjb21wb3VuZHNcbiAgZ3Jhdml0eVJhbmdlQ29tcG91bmQ6IDEuNSxcbiAgLy8gR3Jhdml0eSBmb3JjZSAoY29uc3RhbnQpIGZvciBjb21wb3VuZHNcbiAgZ3Jhdml0eUNvbXBvdW5kOiAxLjAsXG4gIC8vIEdyYXZpdHkgcmFuZ2UgKGNvbnN0YW50KVxuICBncmF2aXR5UmFuZ2U6IDMuOCxcbiAgLy8gSW5pdGlhbCBjb29saW5nIGZhY3RvciBmb3IgaW5jcmVtZW50YWwgbGF5b3V0ICBcbiAgaW5pdGlhbEVuZXJneU9uSW5jcmVtZW50YWw6IDAuMyxcblxuICAvKiBjb25zdHJhaW50IG9wdGlvbnMgKi9cblxuICAvLyBGaXggcmVxdWlyZWQgbm9kZXMgdG8gcHJlZGVmaW5lZCBwb3NpdGlvbnNcbiAgLy8gW3tub2RlSWQ6ICduMScsIHBvc2l0aW9uOiB7eDogMTAwLCB5OiAyMDB9LCB7Li4ufV1cbiAgZml4ZWROb2RlQ29uc3RyYWludDogdW5kZWZpbmVkLFxuICAvLyBBbGlnbiByZXF1aXJlZCBub2RlcyBpbiB2ZXJ0aWNhbC9ob3Jpem9udGFsIGRpcmVjdGlvblxuICAvLyB7dmVydGljYWw6IFtbJ24xJywgJ24yJyldLCBbJ24zJywgJ240J11dLCBob3Jpem9udGFsOiBbJ24yJywgJ240J119XG4gIGFsaWdubWVudENvbnN0cmFpbnQ6IHVuZGVmaW5lZCxcbiAgLy8gUGxhY2UgdHdvIG5vZGVzIHJlbGF0aXZlbHkgaW4gdmVydGljYWwvaG9yaXpvbnRhbCBkaXJlY3Rpb24gXG4gIC8vIFt7dG9wOiAnbjEnLCBib3R0b206ICduMicsIGdhcDogMTAwfSwge2xlZnQ6ICduMycsIHJpZ2h0OiAnbjQnLCBnYXA6IDc1fV1cbiAgcmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50OiB1bmRlZmluZWQsXG5cbiAgLyogbGF5b3V0IGV2ZW50IGNhbGxiYWNrcyAqL1xuICByZWFkeTogZnVuY3Rpb24gcmVhZHkoKSB7fSwgLy8gb24gbGF5b3V0cmVhZHlcbiAgc3RvcDogZnVuY3Rpb24gc3RvcCgpIHt9IC8vIG9uIGxheW91dHN0b3Bcbn0pO1xuXG52YXIgTGF5b3V0ID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBMYXlvdXQob3B0aW9ucykge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBMYXlvdXQpO1xuXG4gICAgdGhpcy5vcHRpb25zID0gYXNzaWduKHt9LCBkZWZhdWx0cywgb3B0aW9ucyk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoTGF5b3V0LCBbe1xuICAgIGtleTogJ3J1bicsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJ1bigpIHtcbiAgICAgIHZhciBsYXlvdXQgPSB0aGlzO1xuICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICB2YXIgY3kgPSBvcHRpb25zLmN5O1xuICAgICAgdmFyIGVsZXMgPSBvcHRpb25zLmVsZXM7XG5cbiAgICAgIHZhciBzcGVjdHJhbFJlc3VsdCA9IFtdO1xuICAgICAgdmFyIHhDb29yZHMgPSB2b2lkIDA7XG4gICAgICB2YXIgeUNvb3JkcyA9IHZvaWQgMDtcbiAgICAgIHZhciBjb3NlUmVzdWx0ID0gW107XG4gICAgICB2YXIgY29tcG9uZW50cyA9IHZvaWQgMDtcbiAgICAgIHZhciBjb21wb25lbnRDZW50ZXJzID0gW107XG5cbiAgICAgIC8vIGJhc2ljIHZhbGlkaXR5IGNoZWNrIGZvciBjb25zdHJhaW50IGlucHV0cyBcbiAgICAgIGlmIChvcHRpb25zLmZpeGVkTm9kZUNvbnN0cmFpbnQgJiYgKCFBcnJheS5pc0FycmF5KG9wdGlvbnMuZml4ZWROb2RlQ29uc3RyYWludCkgfHwgb3B0aW9ucy5maXhlZE5vZGVDb25zdHJhaW50Lmxlbmd0aCA9PSAwKSkge1xuICAgICAgICBvcHRpb25zLmZpeGVkTm9kZUNvbnN0cmFpbnQgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLmFsaWdubWVudENvbnN0cmFpbnQpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuYWxpZ25tZW50Q29uc3RyYWludC52ZXJ0aWNhbCAmJiAoIUFycmF5LmlzQXJyYXkob3B0aW9ucy5hbGlnbm1lbnRDb25zdHJhaW50LnZlcnRpY2FsKSB8fCBvcHRpb25zLmFsaWdubWVudENvbnN0cmFpbnQudmVydGljYWwubGVuZ3RoID09IDApKSB7XG4gICAgICAgICAgb3B0aW9ucy5hbGlnbm1lbnRDb25zdHJhaW50LnZlcnRpY2FsID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmFsaWdubWVudENvbnN0cmFpbnQuaG9yaXpvbnRhbCAmJiAoIUFycmF5LmlzQXJyYXkob3B0aW9ucy5hbGlnbm1lbnRDb25zdHJhaW50Lmhvcml6b250YWwpIHx8IG9wdGlvbnMuYWxpZ25tZW50Q29uc3RyYWludC5ob3Jpem9udGFsLmxlbmd0aCA9PSAwKSkge1xuICAgICAgICAgIG9wdGlvbnMuYWxpZ25tZW50Q29uc3RyYWludC5ob3Jpem9udGFsID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludCAmJiAoIUFycmF5LmlzQXJyYXkob3B0aW9ucy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQpIHx8IG9wdGlvbnMucmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50Lmxlbmd0aCA9PSAwKSkge1xuICAgICAgICBvcHRpb25zLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgLy8gaWYgYW55IGNvbnN0cmFpbnQgZXhpc3RzLCBzZXQgc29tZSBvcHRpb25zXG4gICAgICB2YXIgY29uc3RyYWludEV4aXN0ID0gb3B0aW9ucy5maXhlZE5vZGVDb25zdHJhaW50IHx8IG9wdGlvbnMuYWxpZ25tZW50Q29uc3RyYWludCB8fCBvcHRpb25zLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludDtcbiAgICAgIGlmIChjb25zdHJhaW50RXhpc3QpIHtcbiAgICAgICAgLy8gY29uc3RyYWludHMgd29yayB3aXRoIHRoZXNlIG9wdGlvbnNcbiAgICAgICAgb3B0aW9ucy50aWxlID0gZmFsc2U7XG4gICAgICAgIG9wdGlvbnMucGFja0NvbXBvbmVudHMgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gZGVjaWRlIGNvbXBvbmVudCBwYWNraW5nIGlzIGVuYWJsZWQgb3Igbm90XG4gICAgICB2YXIgbGF5VXRpbCA9IHZvaWQgMDtcbiAgICAgIHZhciBwYWNraW5nRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgaWYgKGN5LmxheW91dFV0aWxpdGllcyAmJiBvcHRpb25zLnBhY2tDb21wb25lbnRzKSB7XG4gICAgICAgIGxheVV0aWwgPSBjeS5sYXlvdXRVdGlsaXRpZXMoXCJnZXRcIik7XG4gICAgICAgIGlmICghbGF5VXRpbCkgbGF5VXRpbCA9IGN5LmxheW91dFV0aWxpdGllcygpO1xuICAgICAgICBwYWNraW5nRW5hYmxlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChlbGVzLm5vZGVzKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyBpZiBwYWNraW5nIGlzIG5vdCBlbmFibGVkLCBwZXJmb3JtIGxheW91dCBvbiB0aGUgd2hvbGUgZ3JhcGhcbiAgICAgICAgaWYgKCFwYWNraW5nRW5hYmxlZCkge1xuICAgICAgICAgIC8vIHN0b3JlIGNvbXBvbmVudCBjZW50ZXJcbiAgICAgICAgICB2YXIgYm91bmRpbmdCb3ggPSBvcHRpb25zLmVsZXMuYm91bmRpbmdCb3goKTtcbiAgICAgICAgICBjb21wb25lbnRDZW50ZXJzLnB1c2goeyB4OiBib3VuZGluZ0JveC54MSArIGJvdW5kaW5nQm94LncgLyAyLCB5OiBib3VuZGluZ0JveC55MSArIGJvdW5kaW5nQm94LmggLyAyIH0pO1xuICAgICAgICAgIC8vIGFwcGx5IHNwZWN0cmFsIGxheW91dFxuICAgICAgICAgIGlmIChvcHRpb25zLnJhbmRvbWl6ZSkge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHNwZWN0cmFsTGF5b3V0KG9wdGlvbnMpO1xuICAgICAgICAgICAgc3BlY3RyYWxSZXN1bHQucHVzaChyZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBhcHBseSBjb3NlIGxheW91dCBhcyBwb3N0cHJvY2Vzc2luZ1xuICAgICAgICAgIGlmIChvcHRpb25zLnF1YWxpdHkgPT0gXCJkZWZhdWx0XCIgfHwgb3B0aW9ucy5xdWFsaXR5ID09IFwicHJvb2ZcIikge1xuICAgICAgICAgICAgY29zZVJlc3VsdC5wdXNoKGNvc2VMYXlvdXQob3B0aW9ucywgc3BlY3RyYWxSZXN1bHRbMF0pKTtcbiAgICAgICAgICAgIGF1eC5yZWxvY2F0ZUNvbXBvbmVudChjb21wb25lbnRDZW50ZXJzWzBdLCBjb3NlUmVzdWx0WzBdLCBvcHRpb25zKTsgLy8gcmVsb2NhdGUgY2VudGVyIHRvIG9yaWdpbmFsIHBvc2l0aW9uXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGF1eC5yZWxvY2F0ZUNvbXBvbmVudChjb21wb25lbnRDZW50ZXJzWzBdLCBzcGVjdHJhbFJlc3VsdFswXSwgb3B0aW9ucyk7IC8vIHJlbG9jYXRlIGNlbnRlciB0byBvcmlnaW5hbCBwb3NpdGlvblxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBwYWNraW5nIGlzIGVuYWJsZWRcbiAgICAgICAgICB2YXIgdG9wTW9zdE5vZGVzID0gYXV4LmdldFRvcE1vc3ROb2RlcyhvcHRpb25zLmVsZXMubm9kZXMoKSk7XG4gICAgICAgICAgY29tcG9uZW50cyA9IGF1eC5jb25uZWN0Q29tcG9uZW50cyhjeSwgb3B0aW9ucy5lbGVzLCB0b3BNb3N0Tm9kZXMpO1xuICAgICAgICAgIC8vIHN0b3JlIGNvbXBvbmVudCBjZW50ZXJzXG4gICAgICAgICAgY29tcG9uZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChjb21wb25lbnQpIHtcbiAgICAgICAgICAgIHZhciBib3VuZGluZ0JveCA9IGNvbXBvbmVudC5ib3VuZGluZ0JveCgpO1xuICAgICAgICAgICAgY29tcG9uZW50Q2VudGVycy5wdXNoKHsgeDogYm91bmRpbmdCb3gueDEgKyBib3VuZGluZ0JveC53IC8gMiwgeTogYm91bmRpbmdCb3gueTEgKyBib3VuZGluZ0JveC5oIC8gMiB9KTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vc2VuZCBlYWNoIGNvbXBvbmVudCB0byBzcGVjdHJhbCBsYXlvdXQgaWYgcmFuZG9taXplZFxuICAgICAgICAgIGlmIChvcHRpb25zLnJhbmRvbWl6ZSkge1xuICAgICAgICAgICAgY29tcG9uZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChjb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgb3B0aW9ucy5lbGVzID0gY29tcG9uZW50O1xuICAgICAgICAgICAgICBzcGVjdHJhbFJlc3VsdC5wdXNoKHNwZWN0cmFsTGF5b3V0KG9wdGlvbnMpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChvcHRpb25zLnF1YWxpdHkgPT0gXCJkZWZhdWx0XCIgfHwgb3B0aW9ucy5xdWFsaXR5ID09IFwicHJvb2ZcIikge1xuICAgICAgICAgICAgdmFyIHRvQmVUaWxlZE5vZGVzID0gY3kuY29sbGVjdGlvbigpO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMudGlsZSkge1xuICAgICAgICAgICAgICAvLyBiZWhhdmUgbm9kZXMgdG8gYmUgdGlsZWQgYXMgb25lIGNvbXBvbmVudFxuICAgICAgICAgICAgICB2YXIgbm9kZUluZGV4ZXMgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICAgIHZhciBfeENvb3JkcyA9IFtdO1xuICAgICAgICAgICAgICB2YXIgX3lDb29yZHMgPSBbXTtcbiAgICAgICAgICAgICAgdmFyIGNvdW50ID0gMDtcbiAgICAgICAgICAgICAgdmFyIHRlbXBTcGVjdHJhbFJlc3VsdCA9IHsgbm9kZUluZGV4ZXM6IG5vZGVJbmRleGVzLCB4Q29vcmRzOiBfeENvb3JkcywgeUNvb3JkczogX3lDb29yZHMgfTtcbiAgICAgICAgICAgICAgdmFyIGluZGV4ZXNUb0JlRGVsZXRlZCA9IFtdO1xuICAgICAgICAgICAgICBjb21wb25lbnRzLmZvckVhY2goZnVuY3Rpb24gKGNvbXBvbmVudCwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50LmVkZ2VzKCkubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5ub2RlcygpLmZvckVhY2goZnVuY3Rpb24gKG5vZGUsIGkpIHtcbiAgICAgICAgICAgICAgICAgICAgdG9CZVRpbGVkTm9kZXMubWVyZ2UoY29tcG9uZW50Lm5vZGVzKClbaV0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW5vZGUuaXNQYXJlbnQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgIHRlbXBTcGVjdHJhbFJlc3VsdC5ub2RlSW5kZXhlcy5zZXQoY29tcG9uZW50Lm5vZGVzKClbaV0uaWQoKSwgY291bnQrKyk7XG4gICAgICAgICAgICAgICAgICAgICAgdGVtcFNwZWN0cmFsUmVzdWx0LnhDb29yZHMucHVzaChjb21wb25lbnQubm9kZXMoKVswXS5wb3NpdGlvbigpLngpO1xuICAgICAgICAgICAgICAgICAgICAgIHRlbXBTcGVjdHJhbFJlc3VsdC55Q29vcmRzLnB1c2goY29tcG9uZW50Lm5vZGVzKClbMF0ucG9zaXRpb24oKS55KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICBpbmRleGVzVG9CZURlbGV0ZWQucHVzaChpbmRleCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgaWYgKHRvQmVUaWxlZE5vZGVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICB2YXIgX2JvdW5kaW5nQm94ID0gdG9CZVRpbGVkTm9kZXMuYm91bmRpbmdCb3goKTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRDZW50ZXJzLnB1c2goeyB4OiBfYm91bmRpbmdCb3gueDEgKyBfYm91bmRpbmdCb3gudyAvIDIsIHk6IF9ib3VuZGluZ0JveC55MSArIF9ib3VuZGluZ0JveC5oIC8gMiB9KTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRzLnB1c2godG9CZVRpbGVkTm9kZXMpO1xuICAgICAgICAgICAgICAgIHNwZWN0cmFsUmVzdWx0LnB1c2godGVtcFNwZWN0cmFsUmVzdWx0KTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gaW5kZXhlc1RvQmVEZWxldGVkLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgICBjb21wb25lbnRzLnNwbGljZShpbmRleGVzVG9CZURlbGV0ZWRbaV0sIDEpO1xuICAgICAgICAgICAgICAgICAgc3BlY3RyYWxSZXN1bHQuc3BsaWNlKGluZGV4ZXNUb0JlRGVsZXRlZFtpXSwgMSk7XG4gICAgICAgICAgICAgICAgICBjb21wb25lbnRDZW50ZXJzLnNwbGljZShpbmRleGVzVG9CZURlbGV0ZWRbaV0sIDEpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbXBvbmVudHMuZm9yRWFjaChmdW5jdGlvbiAoY29tcG9uZW50LCBpbmRleCkge1xuICAgICAgICAgICAgICAvLyBzZW5kIGVhY2ggY29tcG9uZW50IHRvIGNvc2UgbGF5b3V0XG4gICAgICAgICAgICAgIG9wdGlvbnMuZWxlcyA9IGNvbXBvbmVudDtcbiAgICAgICAgICAgICAgY29zZVJlc3VsdC5wdXNoKGNvc2VMYXlvdXQob3B0aW9ucywgc3BlY3RyYWxSZXN1bHRbaW5kZXhdKSk7XG4gICAgICAgICAgICAgIGF1eC5yZWxvY2F0ZUNvbXBvbmVudChjb21wb25lbnRDZW50ZXJzW2luZGV4XSwgY29zZVJlc3VsdFtpbmRleF0sIG9wdGlvbnMpOyAvLyByZWxvY2F0ZSBjZW50ZXIgdG8gb3JpZ2luYWwgcG9zaXRpb25cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb21wb25lbnRzLmZvckVhY2goZnVuY3Rpb24gKGNvbXBvbmVudCwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgYXV4LnJlbG9jYXRlQ29tcG9uZW50KGNvbXBvbmVudENlbnRlcnNbaW5kZXhdLCBzcGVjdHJhbFJlc3VsdFtpbmRleF0sIG9wdGlvbnMpOyAvLyByZWxvY2F0ZSBjZW50ZXIgdG8gb3JpZ2luYWwgcG9zaXRpb25cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIHBhY2tpbmdcbiAgICAgICAgICB2YXIgY29tcG9uZW50c0V2YWx1YXRlZCA9IG5ldyBTZXQoKTtcbiAgICAgICAgICBpZiAoY29tcG9uZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICB2YXIgc3ViZ3JhcGhzID0gW107XG4gICAgICAgICAgICB2YXIgaGlkZGVuRWxlcyA9IGVsZXMuZmlsdGVyKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGVsZS5jc3MoJ2Rpc3BsYXknKSA9PSAnbm9uZSc7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbXBvbmVudHMuZm9yRWFjaChmdW5jdGlvbiAoY29tcG9uZW50LCBpbmRleCkge1xuICAgICAgICAgICAgICB2YXIgbm9kZUluZGV4ZXMgPSB2b2lkIDA7XG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLnF1YWxpdHkgPT0gXCJkcmFmdFwiKSB7XG4gICAgICAgICAgICAgICAgbm9kZUluZGV4ZXMgPSBzcGVjdHJhbFJlc3VsdFtpbmRleF0ubm9kZUluZGV4ZXM7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAoY29tcG9uZW50Lm5vZGVzKCkubm90KGhpZGRlbkVsZXMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB2YXIgc3ViZ3JhcGggPSB7fTtcbiAgICAgICAgICAgICAgICBzdWJncmFwaC5lZGdlcyA9IFtdO1xuICAgICAgICAgICAgICAgIHN1YmdyYXBoLm5vZGVzID0gW107XG4gICAgICAgICAgICAgICAgdmFyIG5vZGVJbmRleCA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQubm9kZXMoKS5ub3QoaGlkZGVuRWxlcykuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucXVhbGl0eSA9PSBcImRyYWZ0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlLmlzUGFyZW50KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICBub2RlSW5kZXggPSBub2RlSW5kZXhlcy5nZXQobm9kZS5pZCgpKTtcbiAgICAgICAgICAgICAgICAgICAgICBzdWJncmFwaC5ub2Rlcy5wdXNoKHsgeDogc3BlY3RyYWxSZXN1bHRbaW5kZXhdLnhDb29yZHNbbm9kZUluZGV4XSAtIG5vZGUuYm91bmRpbmdib3goKS53IC8gMiwgeTogc3BlY3RyYWxSZXN1bHRbaW5kZXhdLnlDb29yZHNbbm9kZUluZGV4XSAtIG5vZGUuYm91bmRpbmdib3goKS5oIC8gMiwgd2lkdGg6IG5vZGUuYm91bmRpbmdib3goKS53LCBoZWlnaHQ6IG5vZGUuYm91bmRpbmdib3goKS5oIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJlbnRJbmZvID0gYXV4LmNhbGNCb3VuZGluZ0JveChub2RlLCBzcGVjdHJhbFJlc3VsdFtpbmRleF0ueENvb3Jkcywgc3BlY3RyYWxSZXN1bHRbaW5kZXhdLnlDb29yZHMsIG5vZGVJbmRleGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICBzdWJncmFwaC5ub2Rlcy5wdXNoKHsgeDogcGFyZW50SW5mby50b3BMZWZ0WCwgeTogcGFyZW50SW5mby50b3BMZWZ0WSwgd2lkdGg6IHBhcmVudEluZm8ud2lkdGgsIGhlaWdodDogcGFyZW50SW5mby5oZWlnaHQgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb3NlUmVzdWx0W2luZGV4XVtub2RlLmlkKCldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgc3ViZ3JhcGgubm9kZXMucHVzaCh7IHg6IGNvc2VSZXN1bHRbaW5kZXhdW25vZGUuaWQoKV0uZ2V0TGVmdCgpLCB5OiBjb3NlUmVzdWx0W2luZGV4XVtub2RlLmlkKCldLmdldFRvcCgpLCB3aWR0aDogY29zZVJlc3VsdFtpbmRleF1bbm9kZS5pZCgpXS5nZXRXaWR0aCgpLCBoZWlnaHQ6IGNvc2VSZXN1bHRbaW5kZXhdW25vZGUuaWQoKV0uZ2V0SGVpZ2h0KCkgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuZWRnZXMoKS5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgc291cmNlID0gZWRnZS5zb3VyY2UoKTtcbiAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSBlZGdlLnRhcmdldCgpO1xuICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZS5jc3MoXCJkaXNwbGF5XCIpICE9IFwibm9uZVwiICYmIHRhcmdldC5jc3MoXCJkaXNwbGF5XCIpICE9IFwibm9uZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnF1YWxpdHkgPT0gXCJkcmFmdFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdmFyIHNvdXJjZU5vZGVJbmRleCA9IG5vZGVJbmRleGVzLmdldChzb3VyY2UuaWQoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgdmFyIHRhcmdldE5vZGVJbmRleCA9IG5vZGVJbmRleGVzLmdldCh0YXJnZXQuaWQoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgdmFyIHNvdXJjZUNlbnRlciA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXRDZW50ZXIgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlLmlzUGFyZW50KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJlbnRJbmZvID0gYXV4LmNhbGNCb3VuZGluZ0JveChzb3VyY2UsIHNwZWN0cmFsUmVzdWx0W2luZGV4XS54Q29vcmRzLCBzcGVjdHJhbFJlc3VsdFtpbmRleF0ueUNvb3Jkcywgbm9kZUluZGV4ZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlQ2VudGVyLnB1c2gocGFyZW50SW5mby50b3BMZWZ0WCArIHBhcmVudEluZm8ud2lkdGggLyAyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUNlbnRlci5wdXNoKHBhcmVudEluZm8udG9wTGVmdFkgKyBwYXJlbnRJbmZvLmhlaWdodCAvIDIpO1xuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VDZW50ZXIucHVzaChzcGVjdHJhbFJlc3VsdFtpbmRleF0ueENvb3Jkc1tzb3VyY2VOb2RlSW5kZXhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUNlbnRlci5wdXNoKHNwZWN0cmFsUmVzdWx0W2luZGV4XS55Q29vcmRzW3NvdXJjZU5vZGVJbmRleF0pO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LmlzUGFyZW50KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfcGFyZW50SW5mbyA9IGF1eC5jYWxjQm91bmRpbmdCb3godGFyZ2V0LCBzcGVjdHJhbFJlc3VsdFtpbmRleF0ueENvb3Jkcywgc3BlY3RyYWxSZXN1bHRbaW5kZXhdLnlDb29yZHMsIG5vZGVJbmRleGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldENlbnRlci5wdXNoKF9wYXJlbnRJbmZvLnRvcExlZnRYICsgX3BhcmVudEluZm8ud2lkdGggLyAyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldENlbnRlci5wdXNoKF9wYXJlbnRJbmZvLnRvcExlZnRZICsgX3BhcmVudEluZm8uaGVpZ2h0IC8gMik7XG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldENlbnRlci5wdXNoKHNwZWN0cmFsUmVzdWx0W2luZGV4XS54Q29vcmRzW3RhcmdldE5vZGVJbmRleF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Q2VudGVyLnB1c2goc3BlY3RyYWxSZXN1bHRbaW5kZXhdLnlDb29yZHNbdGFyZ2V0Tm9kZUluZGV4XSk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIHN1YmdyYXBoLmVkZ2VzLnB1c2goeyBzdGFydFg6IHNvdXJjZUNlbnRlclswXSwgc3RhcnRZOiBzb3VyY2VDZW50ZXJbMV0sIGVuZFg6IHRhcmdldENlbnRlclswXSwgZW5kWTogdGFyZ2V0Q2VudGVyWzFdIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChjb3NlUmVzdWx0W2luZGV4XVtzb3VyY2UuaWQoKV0gJiYgY29zZVJlc3VsdFtpbmRleF1bdGFyZ2V0LmlkKCldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdWJncmFwaC5lZGdlcy5wdXNoKHsgc3RhcnRYOiBjb3NlUmVzdWx0W2luZGV4XVtzb3VyY2UuaWQoKV0uZ2V0Q2VudGVyWCgpLCBzdGFydFk6IGNvc2VSZXN1bHRbaW5kZXhdW3NvdXJjZS5pZCgpXS5nZXRDZW50ZXJZKCksIGVuZFg6IGNvc2VSZXN1bHRbaW5kZXhdW3RhcmdldC5pZCgpXS5nZXRDZW50ZXJYKCksIGVuZFk6IGNvc2VSZXN1bHRbaW5kZXhdW3RhcmdldC5pZCgpXS5nZXRDZW50ZXJZKCkgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHN1YmdyYXBoLm5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgIHN1YmdyYXBocy5wdXNoKHN1YmdyYXBoKTtcbiAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHNFdmFsdWF0ZWQuYWRkKGluZGV4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdmFyIHNoaWZ0UmVzdWx0ID0gbGF5VXRpbC5wYWNrQ29tcG9uZW50cyhzdWJncmFwaHMsIG9wdGlvbnMucmFuZG9taXplKS5zaGlmdHM7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5xdWFsaXR5ID09IFwiZHJhZnRcIikge1xuICAgICAgICAgICAgICBzcGVjdHJhbFJlc3VsdC5mb3JFYWNoKGZ1bmN0aW9uIChyZXN1bHQsIGluZGV4KSB7XG4gICAgICAgICAgICAgICAgdmFyIG5ld1hDb29yZHMgPSByZXN1bHQueENvb3Jkcy5tYXAoZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB4ICsgc2hpZnRSZXN1bHRbaW5kZXhdLmR4O1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHZhciBuZXdZQ29vcmRzID0gcmVzdWx0LnlDb29yZHMubWFwKGZ1bmN0aW9uICh5KSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4geSArIHNoaWZ0UmVzdWx0W2luZGV4XS5keTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXN1bHQueENvb3JkcyA9IG5ld1hDb29yZHM7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnlDb29yZHMgPSBuZXdZQ29vcmRzO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZhciBfY291bnQgPSAwO1xuICAgICAgICAgICAgICBjb21wb25lbnRzRXZhbHVhdGVkLmZvckVhY2goZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoY29zZVJlc3VsdFtpbmRleF0pLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgIHZhciBub2RlUmVjdGFuZ2xlID0gY29zZVJlc3VsdFtpbmRleF1baXRlbV07XG4gICAgICAgICAgICAgICAgICBub2RlUmVjdGFuZ2xlLnNldENlbnRlcihub2RlUmVjdGFuZ2xlLmdldENlbnRlclgoKSArIHNoaWZ0UmVzdWx0W19jb3VudF0uZHgsIG5vZGVSZWN0YW5nbGUuZ2V0Q2VudGVyWSgpICsgc2hpZnRSZXN1bHRbX2NvdW50XS5keSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgX2NvdW50Kys7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBnZXQgZWFjaCBlbGVtZW50J3MgY2FsY3VsYXRlZCBwb3NpdGlvblxuICAgICAgdmFyIGdldFBvc2l0aW9ucyA9IGZ1bmN0aW9uIGdldFBvc2l0aW9ucyhlbGUsIGkpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMucXVhbGl0eSA9PSBcImRlZmF1bHRcIiB8fCBvcHRpb25zLnF1YWxpdHkgPT0gXCJwcm9vZlwiKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBlbGUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIGVsZSA9IGk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBwb3MgPSB2b2lkIDA7XG4gICAgICAgICAgdmFyIG5vZGUgPSB2b2lkIDA7XG4gICAgICAgICAgdmFyIHRoZUlkID0gZWxlLmRhdGEoJ2lkJyk7XG4gICAgICAgICAgY29zZVJlc3VsdC5mb3JFYWNoKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICh0aGVJZCBpbiByZXN1bHQpIHtcbiAgICAgICAgICAgICAgcG9zID0geyB4OiByZXN1bHRbdGhlSWRdLmdldFJlY3QoKS5nZXRDZW50ZXJYKCksIHk6IHJlc3VsdFt0aGVJZF0uZ2V0UmVjdCgpLmdldENlbnRlclkoKSB9O1xuICAgICAgICAgICAgICBub2RlID0gcmVzdWx0W3RoZUlkXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAob3B0aW9ucy5ub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHMpIHtcbiAgICAgICAgICAgIGlmIChub2RlLmxhYmVsV2lkdGgpIHtcbiAgICAgICAgICAgICAgaWYgKG5vZGUubGFiZWxQb3NIb3Jpem9udGFsID09IFwibGVmdFwiKSB7XG4gICAgICAgICAgICAgICAgcG9zLnggKz0gbm9kZS5sYWJlbFdpZHRoIC8gMjtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlLmxhYmVsUG9zSG9yaXpvbnRhbCA9PSBcInJpZ2h0XCIpIHtcbiAgICAgICAgICAgICAgICBwb3MueCAtPSBub2RlLmxhYmVsV2lkdGggLyAyO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobm9kZS5sYWJlbEhlaWdodCkge1xuICAgICAgICAgICAgICBpZiAobm9kZS5sYWJlbFBvc1ZlcnRpY2FsID09IFwidG9wXCIpIHtcbiAgICAgICAgICAgICAgICBwb3MueSArPSBub2RlLmxhYmVsSGVpZ2h0IC8gMjtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlLmxhYmVsUG9zVmVydGljYWwgPT0gXCJib3R0b21cIikge1xuICAgICAgICAgICAgICAgIHBvcy55IC09IG5vZGUubGFiZWxIZWlnaHQgLyAyO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwb3MgPT0gdW5kZWZpbmVkKSBwb3MgPSB7IHg6IGVsZS5wb3NpdGlvbihcInhcIiksIHk6IGVsZS5wb3NpdGlvbihcInlcIikgfTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogcG9zLngsXG4gICAgICAgICAgICB5OiBwb3MueVxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIF9wb3MgPSB2b2lkIDA7XG4gICAgICAgICAgc3BlY3RyYWxSZXN1bHQuZm9yRWFjaChmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgICAgICB2YXIgaW5kZXggPSByZXN1bHQubm9kZUluZGV4ZXMuZ2V0KGVsZS5pZCgpKTtcbiAgICAgICAgICAgIGlmIChpbmRleCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgX3BvcyA9IHsgeDogcmVzdWx0LnhDb29yZHNbaW5kZXhdLCB5OiByZXN1bHQueUNvb3Jkc1tpbmRleF0gfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoX3BvcyA9PSB1bmRlZmluZWQpIF9wb3MgPSB7IHg6IGVsZS5wb3NpdGlvbihcInhcIiksIHk6IGVsZS5wb3NpdGlvbihcInlcIikgfTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogX3Bvcy54LFxuICAgICAgICAgICAgeTogX3Bvcy55XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgLy8gcXVhbGl0eSA9IFwiZHJhZnRcIiBhbmQgcmFuZG9taXplID0gZmFsc2UgYXJlIGNvbnRyYWRpY3RpdmUgc28gaW4gdGhhdCBjYXNlIHBvc2l0aW9ucyBkb24ndCBjaGFuZ2VcbiAgICAgIGlmIChvcHRpb25zLnF1YWxpdHkgPT0gXCJkZWZhdWx0XCIgfHwgb3B0aW9ucy5xdWFsaXR5ID09IFwicHJvb2ZcIiB8fCBvcHRpb25zLnJhbmRvbWl6ZSkge1xuICAgICAgICAvLyB0cmFuc2ZlciBjYWxjdWxhdGVkIHBvc2l0aW9ucyB0byBub2RlcyAocG9zaXRpb25zIG9mIG9ubHkgc2ltcGxlIG5vZGVzIGFyZSBldmFsdWF0ZWQsIGNvbXBvdW5kcyBhcmUgcG9zaXRpb25lZCBhdXRvbWF0aWNhbGx5KVxuICAgICAgICB2YXIgcGFyZW50c1dpdGhvdXRDaGlsZHJlbiA9IGF1eC5jYWxjUGFyZW50c1dpdGhvdXRDaGlsZHJlbihjeSwgZWxlcyk7XG4gICAgICAgIHZhciBfaGlkZGVuRWxlcyA9IGVsZXMuZmlsdGVyKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgICByZXR1cm4gZWxlLmNzcygnZGlzcGxheScpID09ICdub25lJztcbiAgICAgICAgfSk7XG4gICAgICAgIG9wdGlvbnMuZWxlcyA9IGVsZXMubm90KF9oaWRkZW5FbGVzKTtcblxuICAgICAgICBlbGVzLm5vZGVzKCkubm90KFwiOnBhcmVudFwiKS5ub3QoX2hpZGRlbkVsZXMpLmxheW91dFBvc2l0aW9ucyhsYXlvdXQsIG9wdGlvbnMsIGdldFBvc2l0aW9ucyk7XG5cbiAgICAgICAgaWYgKHBhcmVudHNXaXRob3V0Q2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHBhcmVudHNXaXRob3V0Q2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgICAgICBlbGUucG9zaXRpb24oZ2V0UG9zaXRpb25zKGVsZSkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmxvZyhcIklmIHJhbmRvbWl6ZSBvcHRpb24gaXMgc2V0IHRvIGZhbHNlLCB0aGVuIHF1YWxpdHkgb3B0aW9uIG11c3QgYmUgJ2RlZmF1bHQnIG9yICdwcm9vZicuXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBMYXlvdXQ7XG59KCk7XG5cbm1vZHVsZS5leHBvcnRzID0gTGF5b3V0O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gNjU3OlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cblxuLyoqXG4gIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc3BlY3RyYWwgbGF5b3V0IHRoYXQgaXMgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIGZjb3NlIGxheW91dCBhbGdvcml0aG1cbiovXG5cbnZhciBhdXggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU0OCk7XG52YXIgTWF0cml4ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDApLmxheW91dEJhc2UuTWF0cml4O1xudmFyIFNWRCA9IF9fd2VicGFja19yZXF1aXJlX18oMTQwKS5sYXlvdXRCYXNlLlNWRDtcblxuLy8gbWFpbiBmdW5jdGlvbiB0aGF0IHNwZWN0cmFsIGxheW91dCBpcyBwcm9jZXNzZWRcbnZhciBzcGVjdHJhbExheW91dCA9IGZ1bmN0aW9uIHNwZWN0cmFsTGF5b3V0KG9wdGlvbnMpIHtcblxuICB2YXIgY3kgPSBvcHRpb25zLmN5O1xuICB2YXIgZWxlcyA9IG9wdGlvbnMuZWxlcztcbiAgdmFyIG5vZGVzID0gZWxlcy5ub2RlcygpO1xuICB2YXIgcGFyZW50Tm9kZXMgPSBlbGVzLm5vZGVzKFwiOnBhcmVudFwiKTtcblxuICB2YXIgZHVtbXlOb2RlcyA9IG5ldyBNYXAoKTsgLy8gbWFwIHRvIGtlZXAgZHVtbXkgbm9kZXMgYW5kIHRoZWlyIG5laWdoYm9yc1xuICB2YXIgbm9kZUluZGV4ZXMgPSBuZXcgTWFwKCk7IC8vIG1hcCB0byBrZWVwIGluZGV4ZXMgdG8gbm9kZXNcbiAgdmFyIHBhcmVudENoaWxkTWFwID0gbmV3IE1hcCgpOyAvLyBtYXBwaW5nIGJ0dy4gY29tcG91bmQgYW5kIGl0cyByZXByZXNlbnRhdGl2ZSBub2RlIFxuICB2YXIgYWxsTm9kZXNOZWlnaGJvcmhvb2QgPSBbXTsgLy8gYXJyYXkgdG8ga2VlcCBuZWlnaGJvcmhvb2Qgb2YgYWxsIG5vZGVzXG4gIHZhciB4Q29vcmRzID0gW107XG4gIHZhciB5Q29vcmRzID0gW107XG5cbiAgdmFyIHNhbXBsZXNDb2x1bW4gPSBbXTsgLy8gc2FtcGxlZCB2ZXJ0aWNlc1xuICB2YXIgbWluRGlzdGFuY2VzQ29sdW1uID0gW107XG4gIHZhciBDID0gW107IC8vIGNvbHVtbiBzYW1wbGluZyBtYXRyaXhcbiAgdmFyIFBISSA9IFtdOyAvLyBpbnRlcnNlY3Rpb24gb2YgY29sdW1uIGFuZCByb3cgc2FtcGxpbmcgbWF0cmljZXMgXG4gIHZhciBJTlYgPSBbXTsgLy8gaW52ZXJzZSBvZiBQSEkgXG5cbiAgdmFyIGZpcnN0U2FtcGxlID0gdm9pZCAwOyAvLyB0aGUgZmlyc3Qgc2FtcGxlZCBub2RlXG4gIHZhciBub2RlU2l6ZSA9IHZvaWQgMDtcblxuICB2YXIgaW5maW5pdHkgPSAxMDAwMDAwMDA7XG4gIHZhciBzbWFsbCA9IDAuMDAwMDAwMDAxO1xuXG4gIHZhciBwaVRvbCA9IG9wdGlvbnMucGlUb2w7XG4gIHZhciBzYW1wbGluZ1R5cGUgPSBvcHRpb25zLnNhbXBsaW5nVHlwZTsgLy8gZmFsc2UgZm9yIHJhbmRvbSwgdHJ1ZSBmb3IgZ3JlZWR5XG4gIHZhciBub2RlU2VwYXJhdGlvbiA9IG9wdGlvbnMubm9kZVNlcGFyYXRpb247XG4gIHZhciBzYW1wbGVTaXplID0gdm9pZCAwO1xuXG4gIC8qKioqIFNwZWN0cmFsLXByZXByb2Nlc3NpbmcgZnVuY3Rpb25zICoqKiovXG5cbiAgLyoqKiogU3BlY3RyYWwgbGF5b3V0IGZ1bmN0aW9ucyAqKioqL1xuXG4gIC8vIGRldGVybWluZSB3aGljaCBjb2x1bW5zIHRvIGJlIHNhbXBsZWRcbiAgdmFyIHJhbmRvbVNhbXBsZUNSID0gZnVuY3Rpb24gcmFuZG9tU2FtcGxlQ1IoKSB7XG4gICAgdmFyIHNhbXBsZSA9IDA7XG4gICAgdmFyIGNvdW50ID0gMDtcbiAgICB2YXIgZmxhZyA9IGZhbHNlO1xuXG4gICAgd2hpbGUgKGNvdW50IDwgc2FtcGxlU2l6ZSkge1xuICAgICAgc2FtcGxlID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogbm9kZVNpemUpO1xuXG4gICAgICBmbGFnID0gZmFsc2U7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgaWYgKHNhbXBsZXNDb2x1bW5baV0gPT0gc2FtcGxlKSB7XG4gICAgICAgICAgZmxhZyA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFmbGFnKSB7XG4gICAgICAgIHNhbXBsZXNDb2x1bW5bY291bnRdID0gc2FtcGxlO1xuICAgICAgICBjb3VudCsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8vIHRha2VzIHRoZSBpbmRleCBvZiB0aGUgbm9kZShwaXZvdCkgdG8gaW5pdGlhdGUgQkZTIGFzIGEgcGFyYW1ldGVyXG4gIHZhciBCRlMgPSBmdW5jdGlvbiBCRlMocGl2b3QsIGluZGV4LCBzYW1wbGluZ01ldGhvZCkge1xuICAgIHZhciBwYXRoID0gW107IC8vIHRoZSBmcm9udCBvZiB0aGUgcGF0aFxuICAgIHZhciBmcm9udCA9IDA7IC8vIHRoZSBiYWNrIG9mIHRoZSBwYXRoXG4gICAgdmFyIGJhY2sgPSAwO1xuICAgIHZhciBjdXJyZW50ID0gMDtcbiAgICB2YXIgdGVtcCA9IHZvaWQgMDtcbiAgICB2YXIgZGlzdGFuY2UgPSBbXTtcblxuICAgIHZhciBtYXhfZGlzdCA9IDA7IC8vIHRoZSBmdXJ0aGVzdCBub2RlIHRvIGJlIHJldHVybmVkXG4gICAgdmFyIG1heF9pbmQgPSAxO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlU2l6ZTsgaSsrKSB7XG4gICAgICBkaXN0YW5jZVtpXSA9IGluZmluaXR5O1xuICAgIH1cblxuICAgIHBhdGhbYmFja10gPSBwaXZvdDtcbiAgICBkaXN0YW5jZVtwaXZvdF0gPSAwO1xuXG4gICAgd2hpbGUgKGJhY2sgPj0gZnJvbnQpIHtcbiAgICAgIGN1cnJlbnQgPSBwYXRoW2Zyb250KytdO1xuICAgICAgdmFyIG5laWdoYm9ycyA9IGFsbE5vZGVzTmVpZ2hib3Job29kW2N1cnJlbnRdO1xuICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IG5laWdoYm9ycy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdGVtcCA9IG5vZGVJbmRleGVzLmdldChuZWlnaGJvcnNbX2ldKTtcbiAgICAgICAgaWYgKGRpc3RhbmNlW3RlbXBdID09IGluZmluaXR5KSB7XG4gICAgICAgICAgZGlzdGFuY2VbdGVtcF0gPSBkaXN0YW5jZVtjdXJyZW50XSArIDE7XG4gICAgICAgICAgcGF0aFsrK2JhY2tdID0gdGVtcDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgQ1tjdXJyZW50XVtpbmRleF0gPSBkaXN0YW5jZVtjdXJyZW50XSAqIG5vZGVTZXBhcmF0aW9uO1xuICAgIH1cblxuICAgIGlmIChzYW1wbGluZ01ldGhvZCkge1xuICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgbm9kZVNpemU7IF9pMisrKSB7XG4gICAgICAgIGlmIChDW19pMl1baW5kZXhdIDwgbWluRGlzdGFuY2VzQ29sdW1uW19pMl0pIG1pbkRpc3RhbmNlc0NvbHVtbltfaTJdID0gQ1tfaTJdW2luZGV4XTtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgX2kzID0gMDsgX2kzIDwgbm9kZVNpemU7IF9pMysrKSB7XG4gICAgICAgIGlmIChtaW5EaXN0YW5jZXNDb2x1bW5bX2kzXSA+IG1heF9kaXN0KSB7XG4gICAgICAgICAgbWF4X2Rpc3QgPSBtaW5EaXN0YW5jZXNDb2x1bW5bX2kzXTtcbiAgICAgICAgICBtYXhfaW5kID0gX2kzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYXhfaW5kO1xuICB9O1xuXG4gIC8vIGFwcGx5IEJGUyB0byBhbGwgbm9kZXMgb3Igc2VsZWN0ZWQgc2FtcGxlc1xuICB2YXIgYWxsQkZTID0gZnVuY3Rpb24gYWxsQkZTKHNhbXBsaW5nTWV0aG9kKSB7XG5cbiAgICB2YXIgc2FtcGxlID0gdm9pZCAwO1xuXG4gICAgaWYgKCFzYW1wbGluZ01ldGhvZCkge1xuICAgICAgcmFuZG9tU2FtcGxlQ1IoKTtcblxuICAgICAgLy8gY2FsbCBCRlNcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2FtcGxlU2l6ZTsgaSsrKSB7XG4gICAgICAgIEJGUyhzYW1wbGVzQ29sdW1uW2ldLCBpLCBzYW1wbGluZ01ldGhvZCwgZmFsc2UpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzYW1wbGUgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBub2RlU2l6ZSk7XG4gICAgICBmaXJzdFNhbXBsZSA9IHNhbXBsZTtcblxuICAgICAgZm9yICh2YXIgX2k0ID0gMDsgX2k0IDwgbm9kZVNpemU7IF9pNCsrKSB7XG4gICAgICAgIG1pbkRpc3RhbmNlc0NvbHVtbltfaTRdID0gaW5maW5pdHk7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIF9pNSA9IDA7IF9pNSA8IHNhbXBsZVNpemU7IF9pNSsrKSB7XG4gICAgICAgIHNhbXBsZXNDb2x1bW5bX2k1XSA9IHNhbXBsZTtcbiAgICAgICAgc2FtcGxlID0gQkZTKHNhbXBsZSwgX2k1LCBzYW1wbGluZ01ldGhvZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZm9ybSB0aGUgc3F1YXJlZCBkaXN0YW5jZXMgZm9yIENcbiAgICBmb3IgKHZhciBfaTYgPSAwOyBfaTYgPCBub2RlU2l6ZTsgX2k2KyspIHtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgc2FtcGxlU2l6ZTsgaisrKSB7XG4gICAgICAgIENbX2k2XVtqXSAqPSBDW19pNl1bal07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZm9ybSBQSElcbiAgICBmb3IgKHZhciBfaTcgPSAwOyBfaTcgPCBzYW1wbGVTaXplOyBfaTcrKykge1xuICAgICAgUEhJW19pN10gPSBbXTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBfaTggPSAwOyBfaTggPCBzYW1wbGVTaXplOyBfaTgrKykge1xuICAgICAgZm9yICh2YXIgX2ogPSAwOyBfaiA8IHNhbXBsZVNpemU7IF9qKyspIHtcbiAgICAgICAgUEhJW19pOF1bX2pdID0gQ1tzYW1wbGVzQ29sdW1uW19qXV1bX2k4XTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLy8gcGVyZm9ybSB0aGUgU1ZEIGFsZ29yaXRobSBhbmQgYXBwbHkgYSByZWd1bGFyaXphdGlvbiBzdGVwXG4gIHZhciBzYW1wbGUgPSBmdW5jdGlvbiBzYW1wbGUoKSB7XG5cbiAgICB2YXIgU1ZEUmVzdWx0ID0gU1ZELnN2ZChQSEkpO1xuXG4gICAgdmFyIGFfcSA9IFNWRFJlc3VsdC5TO1xuICAgIHZhciBhX3UgPSBTVkRSZXN1bHQuVTtcbiAgICB2YXIgYV92ID0gU1ZEUmVzdWx0LlY7XG5cbiAgICB2YXIgbWF4X3MgPSBhX3FbMF0gKiBhX3FbMF0gKiBhX3FbMF07XG5cbiAgICB2YXIgYV9TaWcgPSBbXTtcblxuICAgIC8vICByZWd1bGFyaXphdGlvblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2FtcGxlU2l6ZTsgaSsrKSB7XG4gICAgICBhX1NpZ1tpXSA9IFtdO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzYW1wbGVTaXplOyBqKyspIHtcbiAgICAgICAgYV9TaWdbaV1bal0gPSAwO1xuICAgICAgICBpZiAoaSA9PSBqKSB7XG4gICAgICAgICAgYV9TaWdbaV1bal0gPSBhX3FbaV0gLyAoYV9xW2ldICogYV9xW2ldICsgbWF4X3MgLyAoYV9xW2ldICogYV9xW2ldKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBJTlYgPSBNYXRyaXgubXVsdE1hdChNYXRyaXgubXVsdE1hdChhX3YsIGFfU2lnKSwgTWF0cml4LnRyYW5zcG9zZShhX3UpKTtcbiAgfTtcblxuICAvLyBjYWxjdWxhdGUgZmluYWwgY29vcmRpbmF0ZXMgXG4gIHZhciBwb3dlckl0ZXJhdGlvbiA9IGZ1bmN0aW9uIHBvd2VySXRlcmF0aW9uKCkge1xuICAgIC8vIHR3byBsYXJnZXN0IGVpZ2VudmFsdWVzXG4gICAgdmFyIHRoZXRhMSA9IHZvaWQgMDtcbiAgICB2YXIgdGhldGEyID0gdm9pZCAwO1xuXG4gICAgLy8gaW5pdGlhbCBndWVzc2VzIGZvciBlaWdlbnZlY3RvcnNcbiAgICB2YXIgWTEgPSBbXTtcbiAgICB2YXIgWTIgPSBbXTtcblxuICAgIHZhciBWMSA9IFtdO1xuICAgIHZhciBWMiA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlU2l6ZTsgaSsrKSB7XG4gICAgICBZMVtpXSA9IE1hdGgucmFuZG9tKCk7XG4gICAgICBZMltpXSA9IE1hdGgucmFuZG9tKCk7XG4gICAgfVxuXG4gICAgWTEgPSBNYXRyaXgubm9ybWFsaXplKFkxKTtcbiAgICBZMiA9IE1hdHJpeC5ub3JtYWxpemUoWTIpO1xuXG4gICAgdmFyIGNvdW50ID0gMDtcbiAgICAvLyB0byBrZWVwIHRyYWNrIG9mIHRoZSBpbXByb3ZlbWVudCByYXRpbyBpbiBwb3dlciBpdGVyYXRpb25cbiAgICB2YXIgY3VycmVudCA9IHNtYWxsO1xuICAgIHZhciBwcmV2aW91cyA9IHNtYWxsO1xuXG4gICAgdmFyIHRlbXAgPSB2b2lkIDA7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY291bnQrKztcblxuICAgICAgZm9yICh2YXIgX2k5ID0gMDsgX2k5IDwgbm9kZVNpemU7IF9pOSsrKSB7XG4gICAgICAgIFYxW19pOV0gPSBZMVtfaTldO1xuICAgICAgfVxuXG4gICAgICBZMSA9IE1hdHJpeC5tdWx0R2FtbWEoTWF0cml4Lm11bHRMKE1hdHJpeC5tdWx0R2FtbWEoVjEpLCBDLCBJTlYpKTtcbiAgICAgIHRoZXRhMSA9IE1hdHJpeC5kb3RQcm9kdWN0KFYxLCBZMSk7XG4gICAgICBZMSA9IE1hdHJpeC5ub3JtYWxpemUoWTEpO1xuXG4gICAgICBjdXJyZW50ID0gTWF0cml4LmRvdFByb2R1Y3QoVjEsIFkxKTtcblxuICAgICAgdGVtcCA9IE1hdGguYWJzKGN1cnJlbnQgLyBwcmV2aW91cyk7XG5cbiAgICAgIGlmICh0ZW1wIDw9IDEgKyBwaVRvbCAmJiB0ZW1wID49IDEpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHByZXZpb3VzID0gY3VycmVudDtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBfaTEwID0gMDsgX2kxMCA8IG5vZGVTaXplOyBfaTEwKyspIHtcbiAgICAgIFYxW19pMTBdID0gWTFbX2kxMF07XG4gICAgfVxuXG4gICAgY291bnQgPSAwO1xuICAgIHByZXZpb3VzID0gc21hbGw7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvdW50Kys7XG5cbiAgICAgIGZvciAodmFyIF9pMTEgPSAwOyBfaTExIDwgbm9kZVNpemU7IF9pMTErKykge1xuICAgICAgICBWMltfaTExXSA9IFkyW19pMTFdO1xuICAgICAgfVxuXG4gICAgICBWMiA9IE1hdHJpeC5taW51c09wKFYyLCBNYXRyaXgubXVsdENvbnMoVjEsIE1hdHJpeC5kb3RQcm9kdWN0KFYxLCBWMikpKTtcbiAgICAgIFkyID0gTWF0cml4Lm11bHRHYW1tYShNYXRyaXgubXVsdEwoTWF0cml4Lm11bHRHYW1tYShWMiksIEMsIElOVikpO1xuICAgICAgdGhldGEyID0gTWF0cml4LmRvdFByb2R1Y3QoVjIsIFkyKTtcbiAgICAgIFkyID0gTWF0cml4Lm5vcm1hbGl6ZShZMik7XG5cbiAgICAgIGN1cnJlbnQgPSBNYXRyaXguZG90UHJvZHVjdChWMiwgWTIpO1xuXG4gICAgICB0ZW1wID0gTWF0aC5hYnMoY3VycmVudCAvIHByZXZpb3VzKTtcblxuICAgICAgaWYgKHRlbXAgPD0gMSArIHBpVG9sICYmIHRlbXAgPj0gMSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgcHJldmlvdXMgPSBjdXJyZW50O1xuICAgIH1cblxuICAgIGZvciAodmFyIF9pMTIgPSAwOyBfaTEyIDwgbm9kZVNpemU7IF9pMTIrKykge1xuICAgICAgVjJbX2kxMl0gPSBZMltfaTEyXTtcbiAgICB9XG5cbiAgICAvLyB0aGV0YTEgbm93IGNvbnRhaW5zIGRvbWluYW50IGVpZ2VudmFsdWVcbiAgICAvLyB0aGV0YTIgbm93IGNvbnRhaW5zIHRoZSBzZWNvbmQtbGFyZ2VzdCBlaWdlbnZhbHVlXG4gICAgLy8gVjEgbm93IGNvbnRhaW5zIHRoZXRhMSdzIGVpZ2VudmVjdG9yXG4gICAgLy8gVjIgbm93IGNvbnRhaW5zIHRoZXRhMidzIGVpZ2VudmVjdG9yXG5cbiAgICAvL3BvcHVsYXRlIHRoZSB0d28gdmVjdG9yc1xuICAgIHhDb29yZHMgPSBNYXRyaXgubXVsdENvbnMoVjEsIE1hdGguc3FydChNYXRoLmFicyh0aGV0YTEpKSk7XG4gICAgeUNvb3JkcyA9IE1hdHJpeC5tdWx0Q29ucyhWMiwgTWF0aC5zcXJ0KE1hdGguYWJzKHRoZXRhMikpKTtcbiAgfTtcblxuICAvKioqKiBQcmVwYXJhdGlvbiBmb3Igc3BlY3RyYWwgbGF5b3V0IChQcmVwcm9jZXNzaW5nKSAqKioqL1xuXG4gIC8vIGNvbm5lY3QgZGlzY29ubmVjdGVkIGNvbXBvbmVudHMgKGZpcnN0IHRvcCBsZXZlbCwgdGhlbiBpbnNpZGUgb2YgZWFjaCBjb21wb3VuZCBub2RlKVxuICBhdXguY29ubmVjdENvbXBvbmVudHMoY3ksIGVsZXMsIGF1eC5nZXRUb3BNb3N0Tm9kZXMobm9kZXMpLCBkdW1teU5vZGVzKTtcblxuICBwYXJlbnROb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHtcbiAgICBhdXguY29ubmVjdENvbXBvbmVudHMoY3ksIGVsZXMsIGF1eC5nZXRUb3BNb3N0Tm9kZXMoZWxlLmRlc2NlbmRhbnRzKCkuaW50ZXJzZWN0aW9uKGVsZXMpKSwgZHVtbXlOb2Rlcyk7XG4gIH0pO1xuXG4gIC8vIGFzc2lnbiBpbmRleGVzIHRvIG5vZGVzIChmaXJzdCByZWFsLCB0aGVuIGR1bW15IG5vZGVzKVxuICB2YXIgaW5kZXggPSAwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKCFub2Rlc1tpXS5pc1BhcmVudCgpKSB7XG4gICAgICBub2RlSW5kZXhlcy5zZXQobm9kZXNbaV0uaWQoKSwgaW5kZXgrKyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlO1xuICB2YXIgX2RpZEl0ZXJhdG9yRXJyb3IgPSBmYWxzZTtcbiAgdmFyIF9pdGVyYXRvckVycm9yID0gdW5kZWZpbmVkO1xuXG4gIHRyeSB7XG4gICAgZm9yICh2YXIgX2l0ZXJhdG9yID0gZHVtbXlOb2Rlcy5rZXlzKClbU3ltYm9sLml0ZXJhdG9yXSgpLCBfc3RlcDsgIShfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gKF9zdGVwID0gX2l0ZXJhdG9yLm5leHQoKSkuZG9uZSk7IF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlKSB7XG4gICAgICB2YXIga2V5ID0gX3N0ZXAudmFsdWU7XG5cbiAgICAgIG5vZGVJbmRleGVzLnNldChrZXksIGluZGV4KyspO1xuICAgIH1cblxuICAgIC8vIGluc3RhbnRpYXRlIHRoZSBuZWlnaGJvcmhvb2QgbWF0cml4XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIF9kaWRJdGVyYXRvckVycm9yID0gdHJ1ZTtcbiAgICBfaXRlcmF0b3JFcnJvciA9IGVycjtcbiAgfSBmaW5hbGx5IHtcbiAgICB0cnkge1xuICAgICAgaWYgKCFfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uICYmIF9pdGVyYXRvci5yZXR1cm4pIHtcbiAgICAgICAgX2l0ZXJhdG9yLnJldHVybigpO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoX2RpZEl0ZXJhdG9yRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3I7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yICh2YXIgX2kxMyA9IDA7IF9pMTMgPCBub2RlSW5kZXhlcy5zaXplOyBfaTEzKyspIHtcbiAgICBhbGxOb2Rlc05laWdoYm9yaG9vZFtfaTEzXSA9IFtdO1xuICB9XG5cbiAgLy8gZm9ybSBhIHBhcmVudC1jaGlsZCBtYXAgdG8ga2VlcCByZXByZXNlbnRhdGl2ZSBub2RlIG9mIGVhY2ggY29tcG91bmQgbm9kZSAgXG4gIHBhcmVudE5vZGVzLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgIHZhciBjaGlsZHJlbiA9IGVsZS5jaGlsZHJlbigpLmludGVyc2VjdGlvbihlbGVzKTtcblxuICAgIC8vICAgICAgbGV0IHJhbmRvbSA9IDA7XG4gICAgd2hpbGUgKGNoaWxkcmVuLm5vZGVzKFwiOmNoaWxkbGVzc1wiKS5sZW5ndGggPT0gMCkge1xuICAgICAgLy8gICAgICAgIHJhbmRvbSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGNoaWxkcmVuLm5vZGVzKCkubGVuZ3RoKTsgLy8gaWYgYWxsIGNoaWxkcmVuIGFyZSBjb21wb3VuZCB0aGVuIHByb2NlZWQgcmFuZG9tbHlcbiAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4ubm9kZXMoKVswXS5jaGlsZHJlbigpLmludGVyc2VjdGlvbihlbGVzKTtcbiAgICB9XG4gICAgLy8gIHNlbGVjdCB0aGUgcmVwcmVzZW50YXRpdmUgbm9kZSAtIHdlIGNhbiBhcHBseSBkaWZmZXJlbnQgbWV0aG9kcyBoZXJlXG4gICAgLy8gICAgICByYW5kb20gPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjaGlsZHJlbi5ub2RlcyhcIjpjaGlsZGxlc3NcIikubGVuZ3RoKTtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciBtaW4gPSBjaGlsZHJlbi5ub2RlcyhcIjpjaGlsZGxlc3NcIilbMF0uY29ubmVjdGVkRWRnZXMoKS5sZW5ndGg7XG4gICAgY2hpbGRyZW4ubm9kZXMoXCI6Y2hpbGRsZXNzXCIpLmZvckVhY2goZnVuY3Rpb24gKGVsZTIsIGkpIHtcbiAgICAgIGlmIChlbGUyLmNvbm5lY3RlZEVkZ2VzKCkubGVuZ3RoIDwgbWluKSB7XG4gICAgICAgIG1pbiA9IGVsZTIuY29ubmVjdGVkRWRnZXMoKS5sZW5ndGg7XG4gICAgICAgIGluZGV4ID0gaTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBwYXJlbnRDaGlsZE1hcC5zZXQoZWxlLmlkKCksIGNoaWxkcmVuLm5vZGVzKFwiOmNoaWxkbGVzc1wiKVtpbmRleF0uaWQoKSk7XG4gIH0pO1xuXG4gIC8vIGFkZCBuZWlnaGJvcmhvb2QgcmVsYXRpb25zIChmaXJzdCByZWFsLCB0aGVuIGR1bW15IG5vZGVzKVxuICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHtcbiAgICB2YXIgZWxlSW5kZXggPSB2b2lkIDA7XG5cbiAgICBpZiAoZWxlLmlzUGFyZW50KCkpIGVsZUluZGV4ID0gbm9kZUluZGV4ZXMuZ2V0KHBhcmVudENoaWxkTWFwLmdldChlbGUuaWQoKSkpO2Vsc2UgZWxlSW5kZXggPSBub2RlSW5kZXhlcy5nZXQoZWxlLmlkKCkpO1xuXG4gICAgZWxlLm5laWdoYm9yaG9vZCgpLm5vZGVzKCkuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgaWYgKGVsZXMuaW50ZXJzZWN0aW9uKGVsZS5lZGdlc1dpdGgobm9kZSkpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKG5vZGUuaXNQYXJlbnQoKSkgYWxsTm9kZXNOZWlnaGJvcmhvb2RbZWxlSW5kZXhdLnB1c2gocGFyZW50Q2hpbGRNYXAuZ2V0KG5vZGUuaWQoKSkpO2Vsc2UgYWxsTm9kZXNOZWlnaGJvcmhvb2RbZWxlSW5kZXhdLnB1c2gobm9kZS5pZCgpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoX2tleSkge1xuICAgIHZhciBlbGVJbmRleCA9IG5vZGVJbmRleGVzLmdldChfa2V5KTtcbiAgICB2YXIgZGlzY29ubmVjdGVkSWQgPSB2b2lkIDA7XG4gICAgZHVtbXlOb2Rlcy5nZXQoX2tleSkuZm9yRWFjaChmdW5jdGlvbiAoaWQpIHtcbiAgICAgIGlmIChjeS5nZXRFbGVtZW50QnlJZChpZCkuaXNQYXJlbnQoKSkgZGlzY29ubmVjdGVkSWQgPSBwYXJlbnRDaGlsZE1hcC5nZXQoaWQpO2Vsc2UgZGlzY29ubmVjdGVkSWQgPSBpZDtcblxuICAgICAgYWxsTm9kZXNOZWlnaGJvcmhvb2RbZWxlSW5kZXhdLnB1c2goZGlzY29ubmVjdGVkSWQpO1xuICAgICAgYWxsTm9kZXNOZWlnaGJvcmhvb2Rbbm9kZUluZGV4ZXMuZ2V0KGRpc2Nvbm5lY3RlZElkKV0ucHVzaChfa2V5KTtcbiAgICB9KTtcbiAgfTtcblxuICB2YXIgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjIgPSB0cnVlO1xuICB2YXIgX2RpZEl0ZXJhdG9yRXJyb3IyID0gZmFsc2U7XG4gIHZhciBfaXRlcmF0b3JFcnJvcjIgPSB1bmRlZmluZWQ7XG5cbiAgdHJ5IHtcbiAgICBmb3IgKHZhciBfaXRlcmF0b3IyID0gZHVtbXlOb2Rlcy5rZXlzKClbU3ltYm9sLml0ZXJhdG9yXSgpLCBfc3RlcDI7ICEoX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjIgPSAoX3N0ZXAyID0gX2l0ZXJhdG9yMi5uZXh0KCkpLmRvbmUpOyBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMiA9IHRydWUpIHtcbiAgICAgIHZhciBfa2V5ID0gX3N0ZXAyLnZhbHVlO1xuXG4gICAgICBfbG9vcChfa2V5KTtcbiAgICB9XG5cbiAgICAvLyBub2RlU2l6ZSBub3cgb25seSBjb25zaWRlcnMgdGhlIHNpemUgb2YgdHJhbnNmb3JtZWQgZ3JhcGhcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgX2RpZEl0ZXJhdG9yRXJyb3IyID0gdHJ1ZTtcbiAgICBfaXRlcmF0b3JFcnJvcjIgPSBlcnI7XG4gIH0gZmluYWxseSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjIgJiYgX2l0ZXJhdG9yMi5yZXR1cm4pIHtcbiAgICAgICAgX2l0ZXJhdG9yMi5yZXR1cm4oKTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKF9kaWRJdGVyYXRvckVycm9yMikge1xuICAgICAgICB0aHJvdyBfaXRlcmF0b3JFcnJvcjI7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbm9kZVNpemUgPSBub2RlSW5kZXhlcy5zaXplO1xuXG4gIHZhciBzcGVjdHJhbFJlc3VsdCA9IHZvaWQgMDtcblxuICAvLyBJZiBudW1iZXIgb2Ygbm9kZXMgaW4gdHJhbnNmb3JtZWQgZ3JhcGggaXMgMSBvciAyLCBlaXRoZXIgU1ZEIG9yIHBvd2VySXRlcmF0aW9uIGNhdXNlcyBwcm9ibGVtXG4gIC8vIFNvIHNraXAgc3BlY3RyYWwgYW5kIGxheW91dCB0aGUgZ3JhcGggd2l0aCBjb3NlXG4gIGlmIChub2RlU2l6ZSA+IDIpIHtcbiAgICAvLyBpZiAjIG9mIG5vZGVzIGluIHRyYW5zZm9ybWVkIGdyYXBoIGlzIHNtYWxsZXIgdGhhbiBzYW1wbGUgc2l6ZSxcbiAgICAvLyB0aGVuIHVzZSAjIG9mIG5vZGVzIGFzIHNhbXBsZSBzaXplXG4gICAgc2FtcGxlU2l6ZSA9IG5vZGVTaXplIDwgb3B0aW9ucy5zYW1wbGVTaXplID8gbm9kZVNpemUgOiBvcHRpb25zLnNhbXBsZVNpemU7XG5cbiAgICAvLyBpbnN0YW50aWF0ZXMgdGhlIHBhcnRpYWwgbWF0cmljZXMgdGhhdCB3aWxsIGJlIHVzZWQgaW4gc3BlY3RyYWwgbGF5b3V0XG4gICAgZm9yICh2YXIgX2kxNCA9IDA7IF9pMTQgPCBub2RlU2l6ZTsgX2kxNCsrKSB7XG4gICAgICBDW19pMTRdID0gW107XG4gICAgfVxuICAgIGZvciAodmFyIF9pMTUgPSAwOyBfaTE1IDwgc2FtcGxlU2l6ZTsgX2kxNSsrKSB7XG4gICAgICBJTlZbX2kxNV0gPSBbXTtcbiAgICB9XG5cbiAgICAvKioqKiBBcHBseSBzcGVjdHJhbCBsYXlvdXQgKioqKi9cblxuICAgIGlmIChvcHRpb25zLnF1YWxpdHkgPT0gXCJkcmFmdFwiIHx8IG9wdGlvbnMuc3RlcCA9PSBcImFsbFwiKSB7XG4gICAgICBhbGxCRlMoc2FtcGxpbmdUeXBlKTtcbiAgICAgIHNhbXBsZSgpO1xuICAgICAgcG93ZXJJdGVyYXRpb24oKTtcblxuICAgICAgc3BlY3RyYWxSZXN1bHQgPSB7IG5vZGVJbmRleGVzOiBub2RlSW5kZXhlcywgeENvb3JkczogeENvb3JkcywgeUNvb3JkczogeUNvb3JkcyB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBub2RlSW5kZXhlcy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICAgIHhDb29yZHMucHVzaChjeS5nZXRFbGVtZW50QnlJZChrZXkpLnBvc2l0aW9uKFwieFwiKSk7XG4gICAgICAgIHlDb29yZHMucHVzaChjeS5nZXRFbGVtZW50QnlJZChrZXkpLnBvc2l0aW9uKFwieVwiKSk7XG4gICAgICB9KTtcbiAgICAgIHNwZWN0cmFsUmVzdWx0ID0geyBub2RlSW5kZXhlczogbm9kZUluZGV4ZXMsIHhDb29yZHM6IHhDb29yZHMsIHlDb29yZHM6IHlDb29yZHMgfTtcbiAgICB9XG4gICAgcmV0dXJuIHNwZWN0cmFsUmVzdWx0O1xuICB9IGVsc2Uge1xuICAgIHZhciBpdGVyYXRvciA9IG5vZGVJbmRleGVzLmtleXMoKTtcbiAgICB2YXIgZmlyc3ROb2RlID0gY3kuZ2V0RWxlbWVudEJ5SWQoaXRlcmF0b3IubmV4dCgpLnZhbHVlKTtcbiAgICB2YXIgZmlyc3ROb2RlUG9zID0gZmlyc3ROb2RlLnBvc2l0aW9uKCk7XG4gICAgdmFyIGZpcnN0Tm9kZVdpZHRoID0gZmlyc3ROb2RlLm91dGVyV2lkdGgoKTtcbiAgICB4Q29vcmRzLnB1c2goZmlyc3ROb2RlUG9zLngpO1xuICAgIHlDb29yZHMucHVzaChmaXJzdE5vZGVQb3MueSk7XG4gICAgaWYgKG5vZGVTaXplID09IDIpIHtcbiAgICAgIHZhciBzZWNvbmROb2RlID0gY3kuZ2V0RWxlbWVudEJ5SWQoaXRlcmF0b3IubmV4dCgpLnZhbHVlKTtcbiAgICAgIHZhciBzZWNvbmROb2RlV2lkdGggPSBzZWNvbmROb2RlLm91dGVyV2lkdGgoKTtcbiAgICAgIHhDb29yZHMucHVzaChmaXJzdE5vZGVQb3MueCArIGZpcnN0Tm9kZVdpZHRoIC8gMiArIHNlY29uZE5vZGVXaWR0aCAvIDIgKyBvcHRpb25zLmlkZWFsRWRnZUxlbmd0aCk7XG4gICAgICB5Q29vcmRzLnB1c2goZmlyc3ROb2RlUG9zLnkpO1xuICAgIH1cblxuICAgIHNwZWN0cmFsUmVzdWx0ID0geyBub2RlSW5kZXhlczogbm9kZUluZGV4ZXMsIHhDb29yZHM6IHhDb29yZHMsIHlDb29yZHM6IHlDb29yZHMgfTtcbiAgICByZXR1cm4gc3BlY3RyYWxSZXN1bHQ7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0geyBzcGVjdHJhbExheW91dDogc3BlY3RyYWxMYXlvdXQgfTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDU3OTpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG5cbnZhciBpbXBsID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMTIpO1xuXG4vLyByZWdpc3RlcnMgdGhlIGV4dGVuc2lvbiBvbiBhIGN5dG9zY2FwZSBsaWIgcmVmXG52YXIgcmVnaXN0ZXIgPSBmdW5jdGlvbiByZWdpc3RlcihjeXRvc2NhcGUpIHtcbiAgaWYgKCFjeXRvc2NhcGUpIHtcbiAgICByZXR1cm47XG4gIH0gLy8gY2FuJ3QgcmVnaXN0ZXIgaWYgY3l0b3NjYXBlIHVuc3BlY2lmaWVkXG5cbiAgY3l0b3NjYXBlKCdsYXlvdXQnLCAnZmNvc2UnLCBpbXBsKTsgLy8gcmVnaXN0ZXIgd2l0aCBjeXRvc2NhcGUuanNcbn07XG5cbmlmICh0eXBlb2YgY3l0b3NjYXBlICE9PSAndW5kZWZpbmVkJykge1xuICAvLyBleHBvc2UgdG8gZ2xvYmFsIGN5dG9zY2FwZSAoaS5lLiB3aW5kb3cuY3l0b3NjYXBlKVxuICByZWdpc3RlcihjeXRvc2NhcGUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlZ2lzdGVyO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gMTQwOlxuLyoqKi8gKChtb2R1bGUpID0+IHtcblxubW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX18xNDBfXztcblxuLyoqKi8gfSlcblxuLyoqKioqKi8gXHR9KTtcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuLyoqKioqKi8gXHRcbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi8gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuLyoqKioqKi8gXHRcdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuLyoqKioqKi8gXHRcdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuLyoqKioqKi8gXHRcdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovIFx0XG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqLyBcdFxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIFx0XG4vKioqKioqLyBcdC8vIHN0YXJ0dXBcbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdC8vIFRoaXMgZW50cnkgbW9kdWxlIGlzIHJlZmVyZW5jZWQgYnkgb3RoZXIgbW9kdWxlcyBzbyBpdCBjYW4ndCBiZSBpbmxpbmVkXG4vKioqKioqLyBcdHZhciBfX3dlYnBhY2tfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NzkpO1xuLyoqKioqKi8gXHRcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19leHBvcnRzX187XG4vKioqKioqLyB9KSgpXG47XG59KTsiLCJpbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuXG5jb25zdCB7IHN0cmluZywgYXJyYXksIG9iamVjdCwgbnVtYmVyLCBib29sLCBvbmVPZlR5cGUsIGFueSwgZnVuYyB9ID0gUHJvcFR5cGVzO1xuXG5leHBvcnQgY29uc3QgdHlwZXMgPSB7XG4gIC8qKlxuICAgKiBUaGUgYGlkYCBIVE1MIGF0dHJpYnV0ZSBvZiB0aGUgY29tcG9uZW50LlxuICAgKiAqL1xuICBpZDogc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBUaGUgYGNsYXNzYCBIVE1MIGF0dHJpYnV0ZSBvZiB0aGUgY29tcG9uZW50LiAgVXNlIHRoaXMgdG8gc2V0IHRoZSBkaW1lbnNpb25zIG9mXG4gICAqIHRoZSBncmFwaCB2aXN1YWxpc2F0aW9uIHZpYSBhIHN0eWxlIGJsb2NrIGluIHlvdXIgQ1NTIGZpbGUuXG4gICAqL1xuICBjbGFzc05hbWU6IHN0cmluZyxcblxuICAvKipcbiAgICogVGhlIGBzdHlsZWAgSFRNTCBhdHRyaWJ1dGUgb2YgdGhlIGNvbXBvbmVudC4gIFVzZSB0aGlzIHRvIHNldCB0aGUgZGltZW5zaW9ucyBvZlxuICAgKiB0aGUgZ3JhcGggdmlzdWFsaXNhdGlvbiBpZiB5b3UgZG8gbm90IHVzZSBzZXBhcmF0ZSBDU1MgZmlsZXMuXG4gICAqL1xuICBzdHlsZTogb25lT2ZUeXBlKFtzdHJpbmcsIG9iamVjdF0pLFxuXG4gIC8qKlxuICAgKiBUaGUgZmxhdCBsaXN0IG9mIEN5dG9zY2FwZSBlbGVtZW50cyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgZ3JhcGgsIGVhY2ggcmVwcmVzZW50ZWRcbiAgICogYXMgbm9uLXN0cmluZ2lmaWVkIEpTT04uICBFLmcuOlxuICAgKlxuICAgKiBgYGBcbiAgICogZWxlbWVudHM6IFtcbiAgICogICB7IGRhdGE6IHsgaWQ6ICdvbmUnLCBsYWJlbDogJ05vZGUgMScgfSwgcG9zaXRpb246IHsgeDogMCwgeTogMCB9IH0sXG4gICAqICAgeyBkYXRhOiB7IGlkOiAndHdvJywgbGFiZWw6ICdOb2RlIDInIH0sIHBvc2l0aW9uOiB7IHg6IDEwMCwgeTogMCB9IH0sXG4gICAqICAgeyBkYXRhOiB7IHNvdXJjZTogJ29uZScsIHRhcmdldDogJ3R3bycsIGxhYmVsOiAnRWRnZSBmcm9tIE5vZGUxIHRvIE5vZGUyJyB9IH1cbiAgICogXVxuICAgKiBgYGBcbiAgICpcbiAgICogU2VlIGh0dHA6Ly9qcy5jeXRvc2NhcGUub3JnLyNub3RhdGlvbi9lbGVtZW50cy1qc29uXG4gICAqICovXG4gIGVsZW1lbnRzOiBvbmVPZlR5cGUoW2FycmF5LCBhbnldKSxcblxuICAvKipcbiAgICogVGhlIEN5dG9zY2FwZSBzdHlsZXNoZWV0IGFzIG5vbi1zdHJpbmdpZmllZCBKU09OLiAgRS5nLjpcbiAgICpcbiAgICogYGBgXG4gICAqIHN0eWxlc2hlZXQ6IFtcbiAgICogICB7XG4gICAqICAgICAgc2VsZWN0b3I6ICdub2RlJyxcbiAgICogICAgICBzdHlsZToge1xuICAgKiAgICAgICAgJ3dpZHRoJzogMzAsXG4gICAqICAgICAgICAnaGVpZ2h0JzogMzAsXG4gICAqICAgICAgICAnc2hhcGUnOiAncmVjdGFuZ2xlJ1xuICAgKiAgICAgIH1cbiAgICogICB9XG4gICAqIF1cbiAgICogYGBgXG4gICAqXG4gICAqIFNlZSBodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jc3R5bGVcbiAgICovXG4gIHN0eWxlc2hlZXQ6IG9uZU9mVHlwZShbYXJyYXksIGFueV0pLFxuXG4gIC8qKlxuICAgKiBVc2UgYSBsYXlvdXQgdG8gYXV0b21hdGljYWxseSBwb3NpdGlvbiB0aGUgbm9kZXMgaW4gdGhlIGdyYXBoLiAgRS5nLlxuICAgKlxuICAgKiBgYGBcbiAgICogbGF5b3V0OiB7IG5hbWU6ICdyYW5kb20nIH1cbiAgICogYGBgXG4gICAqXG4gICAqIE4uYi4gdG8gdXNlIGFuIGV4dGVybmFsIGxheW91dCBleHRlbnNpb24sIHlvdSBtdXN0IHJlZ2lzdGVyIHRoZSBleHRlbnNpb25cbiAgICogcHJpb3IgdG8gcmVuZGVyaW5nIHRoaXMgY29tcG9uZW50LCBlLmcuOlxuICAgKlxuICAgKiBgYGBcbiAgICogaW1wb3J0IEN5dG9zY2FwZSBmcm9tICdjeXRvc2NhcGUnO1xuICAgKiBpbXBvcnQgQ09TRUJpbGtlbnQgZnJvbSAnY3l0b3NjYXBlLWNvc2UtYmlsa2VudCc7XG4gICAqIGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG4gICAqIGltcG9ydCBDeXRvc2NhcGVDb21wb25lbnQgZnJvbSAnY3l0b3NjYXBlLXJlYWN0anMnO1xuICAgKlxuICAgKiBDeXRvc2NhcGUudXNlKENPU0VCaWxrZW50KTtcbiAgICpcbiAgICogY2xhc3MgTXlBcHAgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgKiAgIHJlbmRlcigpIHtcbiAgICogICAgIGNvbnN0IGVsZW1lbnRzID0gW1xuICAgKiAgICAgICB7IGRhdGE6IHsgaWQ6ICdvbmUnLCBsYWJlbDogJ05vZGUgMScgfSwgcG9zaXRpb246IHsgeDogMCwgeTogMCB9IH0sXG4gICAqICAgICAgIHsgZGF0YTogeyBpZDogJ3R3bycsIGxhYmVsOiAnTm9kZSAyJyB9LCBwb3NpdGlvbjogeyB4OiAxMDAsIHk6IDAgfSB9LFxuICAgKiAgICAgICB7IGRhdGE6IHsgc291cmNlOiAnb25lJywgdGFyZ2V0OiAndHdvJywgbGFiZWw6ICdFZGdlIGZyb20gTm9kZTEgdG8gTm9kZTInIH0gfVxuICAgKiAgICAgXTtcbiAgICpcbiAgICogICAgIGNvbnN0IGxheW91dCA9IHsgbmFtZTogJ2Nvc2UtYmlsa2VudCcgfTtcbiAgICpcbiAgICogICAgIHJldHVybiA8Q3l0b3NjYXBlQ29tcG9uZW50IGVsZW1lbnRzPXtlbGVtZW50c30gbGF5b3V0PXtsYXlvdXR9PjtcbiAgICogICB9XG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIFNlZSBodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jbGF5b3V0c1xuICAgKi9cbiAgbGF5b3V0OiBvbmVPZlR5cGUoW29iamVjdCwgYW55XSksXG5cbiAgLyoqXG4gICAqIFRoZSBwYW5uaW5nIHBvc2l0aW9uIG9mIHRoZSBncmFwaC5cbiAgICpcbiAgICogU2VlIGh0dHA6Ly9qcy5jeXRvc2NhcGUub3JnLyNpbml0LW9wdHMvcGFuXG4gICAqL1xuICBwYW46IG9uZU9mVHlwZShbb2JqZWN0LCBhbnldKSxcblxuICAvKipcbiAgICogVGhlIHpvb20gbGV2ZWwgb2YgdGhlIGdyYXBoLlxuICAgKlxuICAgKiBTZWUgaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI2luaXQtb3B0cy96b29tXG4gICAqL1xuICB6b29tOiBudW1iZXIsXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBhbm5pbmcgcG9zaXRpb24gb2YgdGhlIGdyYXBoIGlzIG11dGFibGUgb3ZlcmFsbC5cbiAgICpcbiAgICogU2VlIGh0dHA6Ly9qcy5jeXRvc2NhcGUub3JnLyNpbml0LW9wdHMvcGFubmluZ0VuYWJsZWRcbiAgICovXG4gIHBhbm5pbmdFbmFibGVkOiBib29sLFxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBwYW5uaW5nIHBvc2l0aW9uIG9mIHRoZSBncmFwaCBpcyBtdXRhYmxlIGJ5IHVzZXIgZ2VzdHVyZXMgKGUuZy4gc3dpcGUpLlxuICAgKlxuICAgKiBTZWUgaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI2luaXQtb3B0cy91c2VyUGFubmluZ0VuYWJsZWRcbiAgICovXG4gIHVzZXJQYW5uaW5nRW5hYmxlZDogYm9vbCxcblxuICAvKipcbiAgICogVGhlIG1pbmltdW0gem9vbSBsZXZlbCBvZiB0aGUgZ3JhcGguXG4gICAqXG4gICAqIFNlZSBodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jaW5pdC1vcHRzL21pblpvb21cbiAgICovXG4gIG1pblpvb206IG51bWJlcixcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gem9vbSBsZXZlbCBvZiB0aGUgZ3JhcGguXG4gICAqXG4gICAqIFNlZSBodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jaW5pdC1vcHRzL21heFpvb21cbiAgICovXG4gIG1heFpvb206IG51bWJlcixcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgem9vbSBsZXZlbCBvZiB0aGUgZ3JhcGggaXMgbXV0YWJsZSBvdmVyYWxsLlxuICAgKlxuICAgKiBTZWUgaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI2luaXQtb3B0cy96b29taW5nRW5hYmxlZFxuICAgKi9cbiAgem9vbWluZ0VuYWJsZWQ6IGJvb2wsXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHpvb20gbGV2ZWwgb2YgdGhlIGdyYXBoIGlzIG11dGFibGUgYnkgdXNlciBnZXN0dXJlcyAoZS5nLiBwaW5jaC10by16b29tKS5cbiAgICpcbiAgICogU2VlIGh0dHA6Ly9qcy5jeXRvc2NhcGUub3JnLyNpbml0LW9wdHMvdXNlclpvb21pbmdFbmFibGVkXG4gICAqL1xuICB1c2VyWm9vbWluZ0VuYWJsZWQ6IGJvb2wsXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgc2hpZnQrY2xpY2stYW5kLWRyYWcgYm94IHNlbGVjdGlvbiBpcyBlbmFibGVkLlxuICAgKlxuICAgKiBTZWUgaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI2luaXQtb3B0cy9ib3hTZWxlY3Rpb25FbmFibGVkXG4gICAqL1xuICBib3hTZWxlY3Rpb25FbmFibGVkOiBib29sLFxuXG4gIC8qKlxuICAgKiBJZiB0cnVlLCBub2RlcyBhdXRvbWF0aWNhbGx5IGNhbiBub3QgYmUgZ3JhYmJlZCByZWdhcmRsZXNzIG9mIHdoZXRoZXJcbiAgICogZWFjaCBub2RlIGlzIG1hcmtlZCBhcyBncmFiYmFibGUuXG4gICAqXG4gICAqIFNlZSBodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jaW5pdC1vcHRzL2F1dG91bmdyYWJpZnlcbiAgICovXG4gIGF1dG91bmdyYWJpZnk6IGJvb2wsXG5cbiAgLyoqXG4gICAqIElmIHRydWUsIG5vZGVzIGNhbiBub3QgYmUgbW92ZWQgYXQgYWxsLlxuICAgKlxuICAgKiBTZWUgaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI2luaXQtb3B0cy9hdXRvbG9ja1xuICAgKi9cbiAgYXV0b2xvY2s6IGJvb2wsXG5cbiAgLyoqXG4gICAqIElmIHRydWUsIGVsZW1lbnRzIGhhdmUgaW1tdXRhYmxlIHNlbGVjdGlvbiBzdGF0ZS5cbiAgICpcbiAgICogU2VlIGh0dHA6Ly9qcy5jeXRvc2NhcGUub3JnLyNpbml0LW9wdHMvYXV0b3Vuc2VsZWN0aWZ5XG4gICAqL1xuICBhdXRvdW5zZWxlY3RpZnk6IGJvb2wsXG5cbiAgLyoqXG4gICAqIGBnZXQob2JqZWN0LCBrZXkpYFxuICAgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgYG9iamVjdGAgYXQgdGhlIGBrZXlgLCB3aGljaCBtYXkgYmUgYW4gaW50ZWdlclxuICAgKiBpbiB0aGUgY2FzZSBvZiBsaXN0cy9hcnJheXMgb3Igc3RyaW5ncyBpbiB0aGUgY2FzZSBvZiBtYXBzL29iamVjdHMuXG4gICAqL1xuICBnZXQ6IGZ1bmMsXG5cbiAgLyoqXG4gICAqIGB0b0pzb24ob2JqZWN0KWBcbiAgICogR2V0IHRoZSBkZWVwIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgYG9iamVjdGAgYXMgbm9uLXN0cmluZ2lmaWVkIEpTT04uXG4gICAqL1xuICB0b0pzb246IGZ1bmMsXG5cbiAgLyoqXG4gICAqIGRpZmYob2JqZWN0QSwgb2JqZWN0QilcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhlIHR3byBvYmplY3RzIGhhdmUgZXF1YWwgdmFsdWUuIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWZcbiAgICogYW5kIHdoZXJlIEN5dG9zY2FwZSBuZWVkcyB0byBiZSBwYXRjaGVkLlxuICAgKi9cbiAgZGlmZjogZnVuYyxcblxuICAvKipcbiAgICogZm9yRWFjaChsaXN0LCBpdGVyYXRvcilcbiAgICogQ2FsbCBgaXRlcmF0b3JgIG9uIGVhY2ggZWxlbWVudCBpbiB0aGUgYGxpc3RgLCBpbiBvcmRlci5cbiAgICovXG4gIGZvckVhY2g6IGZ1bmMsXG5cbiAgLyoqXG4gICAqIGN5KGN5UmVmKVxuICAgKiBUaGUgYGN5YCBwcm9wIGFsbG93cyBmb3IgZ2V0dGluZyBhIHJlZmVyZW5jZSB0byB0aGUgYGN5YCBDeXRvc2NhcGUgb2JqZWN0LCBlLmcuOlxuICAgKlxuICAgKiBgPEN5dG9zY2FwZUNvbXBvbmVudCBjeT17Y3kgPT4gKG15Q3lSZWYgPSBjeSl9IC8+YFxuICAgKi9cbiAgY3k6IGZ1bmMsXG5cbiAgLyoqXG4gICAqIGhlYWRsZXNzXG4gICAqIFRoZSBgaGVhZGxlc3NgIHByb3BlciBhbGxvd3MgZm9yIHNldHRpbmcgd2hldGhlciB0aGUgQ3l0b3NjYXBlIGluc3RhbmNlIGlzIGhlYWRsZXNzLCBpLmUuXG4gICAqIG5vdCByZW5kZXJlZC4gIFRoaXMgdmFsdWUgY2FuIG5vdCBiZSBjaGFuZ2VkIGFmdGVyIGluaXRpYWxpc2F0aW9uIG9mIHRoZSBjb21wb25lbnQuXG4gICAqL1xuICBoZWFkbGVzczogYm9vbCxcblxuICAvKipcbiAgICogc3R5bGVFbmFibGVkXG4gICAqIFRoZSBgc3R5bGVFbmFibGVkYCBmbGFnIGlzIHVzZWQgdG8gZW5hYmxlIHN0eWxlIGZ1bmN0aW9uYWxpdHkgaW4gYSBoZWFkbGVzcyBpbnN0YW5jZSAoaS5lLlxuICAgKiBgaGVhZGxlc3M6IHRydWUsIHN0eWxlRW5hYmxlZDogdHJ1ZWApLiAgRm9yIGEgcmVuZGVyZWQgaW5zdGFuY2UsIGRvIG5vdCBzZXQgdGhpcyB2YWx1ZS5cbiAgICovXG4gIHN0eWxlRW5hYmxlZDogYm9vbCxcblxuICAvKipcbiAgICogaGlkZUVkZ2VzT25WaWV3cG9ydFxuICAgKiBBIHJlbmRlcmluZyBoaW50IHRoYXQgc3BlY2lmaWVzLCBmb3IgcmVuZGVyZXJzIHdoaWNoIHN1cHBvcnQgdGhlIGhpbnQsIHdoZXRoZXIgZWRnZXMgc2hvdWxkXG4gICAqIGJlIGhpZGRlbiBkdXJpbmcgem9vbSBhbmQgcGFuIG9wZXJhdGlvbnMuXG4gICAqL1xuICBoaWRlRWRnZXNPblZpZXdwb3J0OiBib29sLFxuXG4gIC8qKlxuICAgKiB0ZXh0dXJlT25WaWV3cG9ydFxuICAgKiBBIHJlbmRlcmluZyBoaW50IHRoYXQgc3BlY2lmaWVzLCBmb3IgcmVuZGVyZXJzIHdoaWNoIHN1cHBvcnQgdGhlIGhpbnQsIHdoZXRoZXIgYSBwcmV2aWV3XG4gICAqIGJhc2VkIG9uIHRoZSBleGlzdGluZyBzY2VuZSBzaG91bGQgYmUgdXNlZCBpbiBwbGFjZSBvZiBidWlsZGluZyBhIG5ldyBzY2VuZS5cbiAgICovXG4gIHRleHR1cmVPblZpZXdwb3J0OiBib29sLFxuXG4gIC8qKlxuICAgKiBtb3Rpb25CbHVyXG4gICAqIEEgcmVuZGVyaW5nIGhpbnQgdGhhdCBzcGVjaWZpZXMsIGZvciByZW5kZXJlcnMgd2hpY2ggc3VwcG9ydCB0aGUgaGludCwgd2hldGhlciBhIG1vdGlvbiBibHVyXG4gICAqIGVmZmVjdCBzaG91bGQgYmUgYXBwbGllZC5cbiAgICovXG4gIG1vdGlvbkJsdXI6IGJvb2wsXG5cbiAgLyoqXG4gICAqIG1vdGlvbkJsdXJPcGFjaXR5XG4gICAqIEEgcmVuZGVyaW5nIGhpbnQgdGhhdCBzcGVjaWZpZXMsIGZvciByZW5kZXJlcnMgd2hpY2ggc3VwcG9ydCB0aGUgaGludCwgaG93IHN0cm9uZyB0aGUgbW90aW9uXG4gICAqIGJsdXIgZWZmZWN0IHNob3VsZCBiZS4gIFRoZSB2YWx1ZSByYW5nZXMgZnJvbSAwIHRvIDEsIHdpdGggbGFyZ2VyIHZhbHVlcyBpbmRpY2F0aW5nIGxhcmdlclxuICAgKiBzdHJlbmd0aC5cbiAgICovXG4gIG1vdGlvbkJsdXJPcGFjaXR5OiBudW1iZXIsXG5cbiAgLyoqXG4gICAqIHdoZWVsU2Vuc2l0aXZpdHlcbiAgICogQSByZW5kZXJpbmcgaGludCB0aGF0IHNwZWNpZmllcywgZm9yIHJlbmRlcmVycyB3aGljaCBzdXBwb3J0IHRoZSBoaW50LCBob3cgZmFzdCB3aGVlbCB6b29taW5nXG4gICAqIHNob3VsZCBiZS4gIFRoZSB2YWx1ZSBpcyBhIHBvc2l0aXZlIG11bHRpcGxpZXIuICBEbyBub3Qgc2V0IHRoaXMgdmFsdWUgdW5sZXNzIHlvdSBhcmUgdXNpbmdcbiAgICogdW5jb252ZW50aW9uYWwgaGFyZHdhcmUgYW5kIGNhbiBndWFyYW50ZWUgdGhhdCBhbGwgeW91ciB1c2VycyB3aWxsIHVzZSB0aGUgc2FtZSBoYXJkd2FyZS4gIFRoZVxuICAgKiBkZWZhdWx0IHZhbHVlIHdvcmtzIHdlbGwgZm9yIHN0YW5kYXJkIG1pY2Ugb24gY29tbW9uIG9wZXJhdGluZyBzeXN0ZW1zLiAgSWYgeW91IGNoYW5nZSB0aGlzXG4gICAqIHZhbHVlLCBpdCBpcyB2ZXJ5IGxpa2VseSB0aGF0IHlvdSB3aWxsIGNyZWF0ZSBhIGJhZCB1c2VyIGV4cGVyaWVuY2UgZm9yIG1hbnkgb3IgbW9zdCBvZiB5b3VyXG4gICAqIHVzZXJzLlxuICAgKi9cbiAgd2hlZWxTZW5zaXRpdml0eTogbnVtYmVyLFxuXG4gIC8qKlxuICAgKiBwaXhlbFJhdGlvXG4gICAqIEEgcmVuZGVyaW5nIGhpbnQgdGhhdCBzcGVjaWZpZXMsIGZvciByZW5kZXJlcnMgd2hpY2ggc3VwcG9ydCB0aGUgaGludCwgdGhlIHBpeGVsIHJhdGlvIHRoYXRcbiAgICogc2hvdWxkIGJlIHVzZWQuICBNYXkgYmUgJ2F1dG8nIG9yIGEgcG9zaXRpdmUgbnVtYmVyLlxuICAgKi9cbiAgcGl4ZWxSYXRpbzogb25lT2ZUeXBlKFtzdHJpbmcsIG9iamVjdF0pLFxufTtcbiIsImNvbnN0IGVpdGhlcklzTmlsID0gKGEsIGIpID0+IGEgPT0gbnVsbCB8fCBiID09IG51bGw7XG5cbmV4cG9ydCBjb25zdCBoYXNoRGlmZiA9IChhLCBiKSA9PiB7XG4gIHJldHVybiBlaXRoZXJJc05pbChhLCBiKSB8fCBhLmhhc2goKSAhPT0gYi5oYXNoKCk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2hhbGxvd09iakRpZmYgPSAoYSwgYikgPT4ge1xuICBpZiAoZWl0aGVySXNOaWwoYSwgYikgJiYgIShhID09IG51bGwgJiYgYiA9PSBudWxsKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGEgPT09IGIpIHtcbiAgICAvLyBjYW4ndCBkbyBhIGRpZmYgb24gdGhlIHNhbWUgb2JqXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gbm9uLW9iamVjdCB2YWx1ZXMgY2FuIGJlIGNvbXBhcmVkIHdpdGggdGhlIGVxdWFsaXR5IG9wZXJhdG9yXG4gIGlmICh0eXBlb2YgYSAhPT0gJ29iamVjdCcgfHwgdHlwZW9mIGIgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGEgIT09IGI7XG4gIH1cblxuICBjb25zdCBhS2V5cyA9IE9iamVjdC5rZXlzKGEpO1xuICBjb25zdCBiS2V5cyA9IE9iamVjdC5rZXlzKGIpO1xuICBjb25zdCBtaXNtYXRjaGVzID0gKGtleSkgPT4gYVtrZXldICE9PSBiW2tleV07XG5cbiAgaWYgKGFLZXlzLmxlbmd0aCAhPT0gYktleXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoYUtleXMuc29tZShtaXNtYXRjaGVzKSB8fCBiS2V5cy5zb21lKG1pc21hdGNoZXMpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59O1xuIiwiZXhwb3J0IGNvbnN0IGdldCA9IChvYmosIGtleSkgPT4gKG9iaiAhPSBudWxsID8gb2JqW2tleV0gOiBudWxsKTtcblxuZXhwb3J0IGNvbnN0IHRvSnNvbiA9IChvYmopID0+IG9iajtcblxuZXhwb3J0IGNvbnN0IGZvckVhY2ggPSAoYXJyLCBpdGVyYXRvcikgPT4gYXJyLmZvckVhY2goaXRlcmF0b3IpO1xuIiwiaW1wb3J0IHsgc2hhbGxvd09iakRpZmYgfSBmcm9tICcuL2RpZmYnO1xuaW1wb3J0IHsgZ2V0LCB0b0pzb24sIGZvckVhY2ggfSBmcm9tICcuL2pzb24nO1xuXG5leHBvcnQgY29uc3QgaWRlbnRpdHkgPSAoeCkgPT4geDtcblxuZXhwb3J0IGNvbnN0IGVsZW1lbnRzID0gW1xuICB7IGRhdGE6IHsgaWQ6ICdhJywgbGFiZWw6ICdFeGFtcGxlIG5vZGUgQScgfSB9LFxuICB7IGRhdGE6IHsgaWQ6ICdiJywgbGFiZWw6ICdFeGFtcGxlIG5vZGUgQicgfSB9LFxuICB7IGRhdGE6IHsgaWQ6ICdlJywgc291cmNlOiAnYScsIHRhcmdldDogJ2InIH0gfSxcbl07XG5cbmV4cG9ydCBjb25zdCBzdHlsZXNoZWV0ID0gW1xuICB7XG4gICAgc2VsZWN0b3I6ICdub2RlJyxcbiAgICBzdHlsZToge1xuICAgICAgbGFiZWw6ICdkYXRhKGxhYmVsKScsXG4gICAgfSxcbiAgfSxcbl07XG5cbmV4cG9ydCBjb25zdCB6b29tID0gMTtcblxuZXhwb3J0IGNvbnN0IHBhbiA9IHtcbiAgeDogMCxcbiAgeTogMCxcbn07XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0cyA9IHtcbiAgZGlmZjogc2hhbGxvd09iakRpZmYsXG4gIGdldCxcbiAgdG9Kc29uLFxuICBmb3JFYWNoLFxuICBlbGVtZW50cyxcbiAgc3R5bGVzaGVldCxcbiAgem9vbSxcbiAgcGFuLFxufTtcbiIsImltcG9ydCB7IGdldCBhcyBhdEtleSB9IGZyb20gJy4vanNvbic7XG5pbXBvcnQgeyBzaGFsbG93T2JqRGlmZiB9IGZyb20gJy4vZGlmZic7XG5cbmNvbnN0IGlzRGlmZkF0S2V5ID0gKGpzb24xLCBqc29uMiwgZGlmZiwga2V5KSA9PlxuICBkaWZmKGF0S2V5KGpzb24xLCBrZXkpLCBhdEtleShqc29uMiwga2V5KSk7XG5cbmV4cG9ydCBjb25zdCBwYXRjaCA9IChjeSwganNvbjEsIGpzb24yLCBkaWZmLCB0b0pzb24sIGdldCwgZm9yRWFjaCkgPT4ge1xuICBjeS5iYXRjaCgoKSA9PiB7XG4gICAgLy8gVGhlIHNoYWxsb3cgb2JqZWN0IGRpZmYoKSBtdXN0IGRlZmVyIHRvIHBhdGNoRWxlbWVudHMoKSBhcyBpdCBtdXN0IGNvbXBhcmUgdGhlXG4gICAgLy8gZWxlbWVudHMgYXMgYW4gdW5vcmRlcmVkIHNldC4gIEEgY3VzdG9tIGRpZmYoKSwgd2l0aCBJbW11dGFibGUgZm9yIGV4YW1wbGUsXG4gICAgLy8gY291bGQganVzdCB1c2UgYW4gZXF1YWxpdHkgY2hlY2sgKD09PSkuXG4gICAgaWYgKFxuICAgICAgZGlmZiA9PT0gc2hhbGxvd09iakRpZmYgfHxcbiAgICAgIGlzRGlmZkF0S2V5KGpzb24xLCBqc29uMiwgZGlmZiwgJ2VsZW1lbnRzJylcbiAgICApIHtcbiAgICAgIHBhdGNoRWxlbWVudHMoXG4gICAgICAgIGN5LFxuICAgICAgICBhdEtleShqc29uMSwgJ2VsZW1lbnRzJyksXG4gICAgICAgIGF0S2V5KGpzb24yLCAnZWxlbWVudHMnKSxcbiAgICAgICAgdG9Kc29uLFxuICAgICAgICBnZXQsXG4gICAgICAgIGZvckVhY2gsXG4gICAgICAgIGRpZmZcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGlzRGlmZkF0S2V5KGpzb24xLCBqc29uMiwgZGlmZiwgJ3N0eWxlc2hlZXQnKSkge1xuICAgICAgcGF0Y2hTdHlsZShcbiAgICAgICAgY3ksXG4gICAgICAgIGF0S2V5KGpzb24xLCAnc3R5bGVzaGVldCcpLFxuICAgICAgICBhdEtleShqc29uMiwgJ3N0eWxlc2hlZXQnKSxcbiAgICAgICAgdG9Kc29uXG4gICAgICApO1xuICAgIH1cblxuICAgIFtcbiAgICAgIC8vIHNpbXBsZSBrZXlzIHRoYXQgY2FuIGJlIHBhdGNoZWQgZGlyZWN0bHkgKGtleSBzYW1lIGFzIGZuIG5hbWUpXG4gICAgICAnem9vbScsXG4gICAgICAnbWluWm9vbScsXG4gICAgICAnbWF4Wm9vbScsXG4gICAgICAnem9vbWluZ0VuYWJsZWQnLFxuICAgICAgJ3VzZXJab29taW5nRW5hYmxlZCcsXG4gICAgICAncGFuJyxcbiAgICAgICdwYW5uaW5nRW5hYmxlZCcsXG4gICAgICAndXNlclBhbm5pbmdFbmFibGVkJyxcbiAgICAgICdib3hTZWxlY3Rpb25FbmFibGVkJyxcbiAgICAgICdhdXRvdW5ncmFiaWZ5JyxcbiAgICAgICdhdXRvbG9jaycsXG4gICAgICAnYXV0b3Vuc2VsZWN0aWZ5JyxcbiAgICBdLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgaWYgKGlzRGlmZkF0S2V5KGpzb24xLCBqc29uMiwgZGlmZiwga2V5KSkge1xuICAgICAgICBwYXRjaEpzb24oY3ksIGtleSwgYXRLZXkoanNvbjEsIGtleSksIGF0S2V5KGpzb24yLCBrZXkpLCB0b0pzb24pO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICBpZiAoaXNEaWZmQXRLZXkoanNvbjEsIGpzb24yLCBkaWZmLCAnbGF5b3V0JykpIHtcbiAgICBwYXRjaExheW91dChjeSwgYXRLZXkoanNvbjEsICdsYXlvdXQnKSwgYXRLZXkoanNvbjIsICdsYXlvdXQnKSwgdG9Kc29uKTtcbiAgfVxufTtcblxuY29uc3QgcGF0Y2hKc29uID0gKGN5LCBrZXksIHZhbDEsIHZhbDIsIHRvSnNvbikgPT4ge1xuICBjeVtrZXldKHRvSnNvbih2YWwyKSk7XG59O1xuXG5jb25zdCBwYXRjaExheW91dCA9IChjeSwgbGF5b3V0MSwgbGF5b3V0MiwgdG9Kc29uKSA9PiB7XG4gIGNvbnN0IGxheW91dE9wdHMgPSB0b0pzb24obGF5b3V0Mik7XG5cbiAgaWYgKGxheW91dE9wdHMgIT0gbnVsbCkge1xuICAgIGN5LmxheW91dChsYXlvdXRPcHRzKS5ydW4oKTtcbiAgfVxufTtcblxuY29uc3QgcGF0Y2hTdHlsZSA9IChjeSwgc3R5bGUxLCBzdHlsZTIsIHRvSnNvbikgPT4ge1xuICBjb25zdCBzdHlsZSA9IGN5LnN0eWxlKCk7XG5cbiAgaWYgKHN0eWxlID09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBzdHlsZS5mcm9tSnNvbih0b0pzb24oc3R5bGUyKSkudXBkYXRlKCk7XG59O1xuXG5jb25zdCBwYXRjaEVsZW1lbnRzID0gKGN5LCBlbGVzMSwgZWxlczIsIHRvSnNvbiwgZ2V0LCBmb3JFYWNoLCBkaWZmKSA9PiB7XG4gIGNvbnN0IHRvQWRkID0gW107XG4gIGNvbnN0IHRvUm0gPSBjeS5jb2xsZWN0aW9uKCk7XG4gIGNvbnN0IHRvUGF0Y2ggPSBbXTtcbiAgY29uc3QgZWxlczFNYXAgPSB7fTtcbiAgY29uc3QgZWxlczJNYXAgPSB7fTtcbiAgY29uc3QgZWxlczFIYXNJZCA9IChpZCkgPT4gZWxlczFNYXBbaWRdICE9IG51bGw7XG4gIGNvbnN0IGVsZXMySGFzSWQgPSAoaWQpID0+IGVsZXMyTWFwW2lkXSAhPSBudWxsO1xuICBjb25zdCBnZXRFbGUxID0gKGlkKSA9PiBlbGVzMU1hcFtpZF07XG4gIGNvbnN0IGdldElkID0gKGVsZSkgPT4gZ2V0KGdldChlbGUsICdkYXRhJyksICdpZCcpO1xuXG4gIGZvckVhY2goZWxlczIsIChlbGUyKSA9PiB7XG4gICAgY29uc3QgaWQgPSBnZXRJZChlbGUyKTtcblxuICAgIGVsZXMyTWFwW2lkXSA9IGVsZTI7XG4gIH0pO1xuXG4gIGlmIChlbGVzMSAhPSBudWxsKSB7XG4gICAgZm9yRWFjaChlbGVzMSwgKGVsZTEpID0+IHtcbiAgICAgIGNvbnN0IGlkID0gZ2V0SWQoZWxlMSk7XG5cbiAgICAgIGVsZXMxTWFwW2lkXSA9IGVsZTE7XG5cbiAgICAgIGlmICghZWxlczJIYXNJZChpZCkpIHtcbiAgICAgICAgdG9SbS5tZXJnZShjeS5nZXRFbGVtZW50QnlJZChpZCkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZm9yRWFjaChlbGVzMiwgKGVsZTIpID0+IHtcbiAgICBjb25zdCBpZCA9IGdldElkKGVsZTIpO1xuICAgIGNvbnN0IGVsZTEgPSBnZXRFbGUxKGlkKTtcblxuICAgIGlmIChlbGVzMUhhc0lkKGlkKSkge1xuICAgICAgdG9QYXRjaC5wdXNoKHsgZWxlMSwgZWxlMiB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdG9BZGQucHVzaCh0b0pzb24oZWxlMikpO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKHRvUm0ubGVuZ3RoID4gMCkge1xuICAgIGN5LnJlbW92ZSh0b1JtKTtcbiAgfVxuXG4gIGlmICh0b0FkZC5sZW5ndGggPiAwKSB7XG4gICAgY3kuYWRkKHRvQWRkKTtcbiAgfVxuXG4gIHRvUGF0Y2guZm9yRWFjaCgoeyBlbGUxLCBlbGUyIH0pID0+XG4gICAgcGF0Y2hFbGVtZW50KGN5LCBlbGUxLCBlbGUyLCB0b0pzb24sIGdldCwgZGlmZilcbiAgKTtcbn07XG5cbmNvbnN0IHBhdGNoRWxlbWVudCA9IChjeSwgZWxlMSwgZWxlMiwgdG9Kc29uLCBnZXQsIGRpZmYpID0+IHtcbiAgY29uc3QgaWQgPSBnZXQoZ2V0KGVsZTIsICdkYXRhJyksICdpZCcpO1xuICBjb25zdCBjeUVsZSA9IGN5LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgY29uc3QgcGF0Y2ggPSB7fTtcbiAgY29uc3QganNvbktleXMgPSBbXG4gICAgJ2RhdGEnLFxuICAgICdwb3NpdGlvbicsXG4gICAgJ3NlbGVjdGVkJyxcbiAgICAnc2VsZWN0YWJsZScsXG4gICAgJ2xvY2tlZCcsXG4gICAgJ2dyYWJiYWJsZScsXG4gICAgJ2NsYXNzZXMnLFxuICBdO1xuXG4gIGpzb25LZXlzLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGNvbnN0IGRhdGEyID0gZ2V0KGVsZTIsIGtleSk7XG5cbiAgICBpZiAoZGlmZihkYXRhMiwgZ2V0KGVsZTEsIGtleSkpKSB7XG4gICAgICBwYXRjaFtrZXldID0gdG9Kc29uKGRhdGEyKTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IHNjcmF0Y2gyID0gZ2V0KGVsZTIsICdzY3JhdGNoJyk7XG4gIGlmIChkaWZmKHNjcmF0Y2gyLCBnZXQoZWxlMSwgJ3NjcmF0Y2gnKSkpIHtcbiAgICBjeUVsZS5zY3JhdGNoKHRvSnNvbihzY3JhdGNoMikpO1xuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKHBhdGNoKS5sZW5ndGggPiAwKSB7XG4gICAgY3lFbGUuanNvbihwYXRjaCk7XG4gIH1cbn07XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdHlwZXMgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGRlZmF1bHRzIH0gZnJvbSAnLi9kZWZhdWx0cyc7XG5pbXBvcnQgQ3l0b3NjYXBlIGZyb20gJ2N5dG9zY2FwZSc7XG5pbXBvcnQgeyBwYXRjaCB9IGZyb20gJy4vcGF0Y2gnO1xuXG4vKipcbiAqIFRoZSBgQ3l0b3NjYXBlQ29tcG9uZW50YCBpcyBhIFJlYWN0IGNvbXBvbmVudCB0aGF0IGFsbG93cyBmb3IgdGhlIGRlY2xhcmF0aXZlIGNyZWF0aW9uXG4gKiBhbmQgbW9kaWZpY2F0aW9uIG9mIGEgQ3l0b3NjYXBlIGluc3RhbmNlLCBhIGdyYXBoIHZpc3VhbGlzYXRpb24uXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEN5dG9zY2FwZUNvbXBvbmVudCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHN0YXRpYyBnZXQgcHJvcFR5cGVzKCkge1xuICAgIHJldHVybiB0eXBlcztcbiAgfVxuXG4gIHN0YXRpYyBnZXQgZGVmYXVsdFByb3BzKCkge1xuICAgIHJldHVybiBkZWZhdWx0cztcbiAgfVxuXG4gIHN0YXRpYyBub3JtYWxpemVFbGVtZW50cyhlbGVtZW50cykge1xuICAgIGNvbnN0IGlzQXJyYXkgPSBlbGVtZW50cy5sZW5ndGggIT0gbnVsbDtcblxuICAgIGlmIChpc0FycmF5KSB7XG4gICAgICByZXR1cm4gZWxlbWVudHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCB7IG5vZGVzLCBlZGdlcyB9ID0gZWxlbWVudHM7XG5cbiAgICAgIGlmIChub2RlcyA9PSBudWxsKSB7XG4gICAgICAgIG5vZGVzID0gW107XG4gICAgICB9XG5cbiAgICAgIGlmIChlZGdlcyA9PSBudWxsKSB7XG4gICAgICAgIGVkZ2VzID0gW107XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBub2Rlcy5jb25jYXQoZWRnZXMpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuZGlzcGxheU5hbWUgPSAnQ3l0b3NjYXBlQ29tcG9uZW50JztcbiAgICB0aGlzLmNvbnRhaW5lclJlZiA9IFJlYWN0LmNyZWF0ZVJlZigpO1xuICB9XG5cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5jb250YWluZXJSZWYuY3VycmVudDtcblxuICAgIGNvbnN0IHtcbiAgICAgIGdsb2JhbCxcbiAgICAgIGhlYWRsZXNzLFxuICAgICAgc3R5bGVFbmFibGVkLFxuICAgICAgaGlkZUVkZ2VzT25WaWV3cG9ydCxcbiAgICAgIHRleHR1cmVPblZpZXdwb3J0LFxuICAgICAgbW90aW9uQmx1cixcbiAgICAgIG1vdGlvbkJsdXJPcGFjaXR5LFxuICAgICAgd2hlZWxTZW5zaXRpdml0eSxcbiAgICAgIHBpeGVsUmF0aW8sXG4gICAgfSA9IHRoaXMucHJvcHM7XG5cbiAgICBjb25zdCBjeSA9ICh0aGlzLl9jeSA9IG5ldyBDeXRvc2NhcGUoe1xuICAgICAgY29udGFpbmVyLFxuICAgICAgaGVhZGxlc3MsXG4gICAgICBzdHlsZUVuYWJsZWQsXG4gICAgICBoaWRlRWRnZXNPblZpZXdwb3J0LFxuICAgICAgdGV4dHVyZU9uVmlld3BvcnQsXG4gICAgICBtb3Rpb25CbHVyLFxuICAgICAgbW90aW9uQmx1ck9wYWNpdHksXG4gICAgICB3aGVlbFNlbnNpdGl2aXR5LFxuICAgICAgcGl4ZWxSYXRpbyxcbiAgICB9KSk7XG5cbiAgICBpZiAoZ2xvYmFsKSB7XG4gICAgICB3aW5kb3dbZ2xvYmFsXSA9IGN5O1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlQ3l0b3NjYXBlKG51bGwsIHRoaXMucHJvcHMpO1xuICB9XG5cbiAgdXBkYXRlQ3l0b3NjYXBlKHByZXZQcm9wcywgbmV3UHJvcHMpIHtcbiAgICBjb25zdCBjeSA9IHRoaXMuX2N5O1xuICAgIGNvbnN0IHsgZGlmZiwgdG9Kc29uLCBnZXQsIGZvckVhY2ggfSA9IG5ld1Byb3BzO1xuXG4gICAgcGF0Y2goY3ksIHByZXZQcm9wcywgbmV3UHJvcHMsIGRpZmYsIHRvSnNvbiwgZ2V0LCBmb3JFYWNoKTtcblxuICAgIGlmIChuZXdQcm9wcy5jeSAhPSBudWxsKSB7XG4gICAgICBuZXdQcm9wcy5jeShjeSk7XG4gICAgfVxuICB9XG5cbiAgY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcykge1xuICAgIHRoaXMudXBkYXRlQ3l0b3NjYXBlKHByZXZQcm9wcywgdGhpcy5wcm9wcyk7XG4gIH1cblxuICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICB0aGlzLl9jeS5kZXN0cm95KCk7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgY29uc3QgeyBpZCwgY2xhc3NOYW1lLCBzdHlsZSB9ID0gdGhpcy5wcm9wcztcblxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KCdkaXYnLCB7XG4gICAgICByZWY6IHRoaXMuY29udGFpbmVyUmVmLFxuICAgICAgaWQsXG4gICAgICBjbGFzc05hbWUsXG4gICAgICBzdHlsZSxcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuY29uc3QgQ29udGV4dEtleSA9IFN5bWJvbC5mb3IoYHJlYWN0LXJlZHV4LWNvbnRleHRgKTtcbmNvbnN0IGdUID0gdHlwZW9mIGdsb2JhbFRoaXMgIT09IFwidW5kZWZpbmVkXCIgPyBnbG9iYWxUaGlzIDpcbi8qIGZhbGwgYmFjayB0byBhIHBlci1tb2R1bGUgc2NvcGUgKHByZS04LjEgYmVoYXZpb3VyKSBpZiBgZ2xvYmFsVGhpc2AgaXMgbm90IGF2YWlsYWJsZSAqL1xue307XG5cbmZ1bmN0aW9uIGdldENvbnRleHQoKSB7XG4gIHZhciBfZ1QkQ29udGV4dEtleTtcblxuICBpZiAoIVJlYWN0LmNyZWF0ZUNvbnRleHQpIHJldHVybiB7fTtcbiAgY29uc3QgY29udGV4dE1hcCA9IChfZ1QkQ29udGV4dEtleSA9IGdUW0NvbnRleHRLZXldKSAhPSBudWxsID8gX2dUJENvbnRleHRLZXkgOiBnVFtDb250ZXh0S2V5XSA9IG5ldyBNYXAoKTtcbiAgbGV0IHJlYWxDb250ZXh0ID0gY29udGV4dE1hcC5nZXQoUmVhY3QuY3JlYXRlQ29udGV4dCk7XG5cbiAgaWYgKCFyZWFsQ29udGV4dCkge1xuICAgIHJlYWxDb250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICByZWFsQ29udGV4dC5kaXNwbGF5TmFtZSA9ICdSZWFjdFJlZHV4JztcbiAgICB9XG5cbiAgICBjb250ZXh0TWFwLnNldChSZWFjdC5jcmVhdGVDb250ZXh0LCByZWFsQ29udGV4dCk7XG4gIH1cblxuICByZXR1cm4gcmVhbENvbnRleHQ7XG59XG5cbmV4cG9ydCBjb25zdCBSZWFjdFJlZHV4Q29udGV4dCA9IC8qI19fUFVSRV9fKi9nZXRDb250ZXh0KCk7XG5leHBvcnQgZGVmYXVsdCBSZWFjdFJlZHV4Q29udGV4dDsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBSZWFjdFJlZHV4Q29udGV4dCB9IGZyb20gJy4vQ29udGV4dCc7XG5pbXBvcnQgeyBjcmVhdGVTdWJzY3JpcHRpb24gfSBmcm9tICcuLi91dGlscy9TdWJzY3JpcHRpb24nO1xuaW1wb3J0IHsgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCB9IGZyb20gJy4uL3V0aWxzL3VzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QnO1xuXG5mdW5jdGlvbiBQcm92aWRlcih7XG4gIHN0b3JlLFxuICBjb250ZXh0LFxuICBjaGlsZHJlbixcbiAgc2VydmVyU3RhdGUsXG4gIHN0YWJpbGl0eUNoZWNrID0gJ29uY2UnLFxuICBub29wQ2hlY2sgPSAnb25jZSdcbn0pIHtcbiAgY29uc3QgY29udGV4dFZhbHVlID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gY3JlYXRlU3Vic2NyaXB0aW9uKHN0b3JlKTtcbiAgICByZXR1cm4ge1xuICAgICAgc3RvcmUsXG4gICAgICBzdWJzY3JpcHRpb24sXG4gICAgICBnZXRTZXJ2ZXJTdGF0ZTogc2VydmVyU3RhdGUgPyAoKSA9PiBzZXJ2ZXJTdGF0ZSA6IHVuZGVmaW5lZCxcbiAgICAgIHN0YWJpbGl0eUNoZWNrLFxuICAgICAgbm9vcENoZWNrXG4gICAgfTtcbiAgfSwgW3N0b3JlLCBzZXJ2ZXJTdGF0ZSwgc3RhYmlsaXR5Q2hlY2ssIG5vb3BDaGVja10pO1xuICBjb25zdCBwcmV2aW91c1N0YXRlID0gUmVhY3QudXNlTWVtbygoKSA9PiBzdG9yZS5nZXRTdGF0ZSgpLCBbc3RvcmVdKTtcbiAgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgc3Vic2NyaXB0aW9uXG4gICAgfSA9IGNvbnRleHRWYWx1ZTtcbiAgICBzdWJzY3JpcHRpb24ub25TdGF0ZUNoYW5nZSA9IHN1YnNjcmlwdGlvbi5ub3RpZnlOZXN0ZWRTdWJzO1xuICAgIHN1YnNjcmlwdGlvbi50cnlTdWJzY3JpYmUoKTtcblxuICAgIGlmIChwcmV2aW91c1N0YXRlICE9PSBzdG9yZS5nZXRTdGF0ZSgpKSB7XG4gICAgICBzdWJzY3JpcHRpb24ubm90aWZ5TmVzdGVkU3VicygpO1xuICAgIH1cblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBzdWJzY3JpcHRpb24udHJ5VW5zdWJzY3JpYmUoKTtcbiAgICAgIHN1YnNjcmlwdGlvbi5vblN0YXRlQ2hhbmdlID0gdW5kZWZpbmVkO1xuICAgIH07XG4gIH0sIFtjb250ZXh0VmFsdWUsIHByZXZpb3VzU3RhdGVdKTtcbiAgY29uc3QgQ29udGV4dCA9IGNvbnRleHQgfHwgUmVhY3RSZWR1eENvbnRleHQ7IC8vIEB0cy1pZ25vcmUgJ0FueUFjdGlvbicgaXMgYXNzaWduYWJsZSB0byB0aGUgY29uc3RyYWludCBvZiB0eXBlICdBJywgYnV0ICdBJyBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhIGRpZmZlcmVudCBzdWJ0eXBlXG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogY29udGV4dFZhbHVlXG4gIH0sIGNoaWxkcmVuKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgUHJvdmlkZXI7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2VcIjtcbmNvbnN0IF9leGNsdWRlZCA9IFtcInJlYWN0UmVkdXhGb3J3YXJkZWRSZWZcIl07XG5cbi8qIGVzbGludC1kaXNhYmxlIHZhbGlkLWpzZG9jLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgKi9cbmltcG9ydCBob2lzdFN0YXRpY3MgZnJvbSAnaG9pc3Qtbm9uLXJlYWN0LXN0YXRpY3MnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgaXNWYWxpZEVsZW1lbnRUeXBlLCBpc0NvbnRleHRDb25zdW1lciB9IGZyb20gJ3JlYWN0LWlzJztcbmltcG9ydCBkZWZhdWx0U2VsZWN0b3JGYWN0b3J5IGZyb20gJy4uL2Nvbm5lY3Qvc2VsZWN0b3JGYWN0b3J5JztcbmltcG9ydCB7IG1hcERpc3BhdGNoVG9Qcm9wc0ZhY3RvcnkgfSBmcm9tICcuLi9jb25uZWN0L21hcERpc3BhdGNoVG9Qcm9wcyc7XG5pbXBvcnQgeyBtYXBTdGF0ZVRvUHJvcHNGYWN0b3J5IH0gZnJvbSAnLi4vY29ubmVjdC9tYXBTdGF0ZVRvUHJvcHMnO1xuaW1wb3J0IHsgbWVyZ2VQcm9wc0ZhY3RvcnkgfSBmcm9tICcuLi9jb25uZWN0L21lcmdlUHJvcHMnO1xuaW1wb3J0IHsgY3JlYXRlU3Vic2NyaXB0aW9uIH0gZnJvbSAnLi4vdXRpbHMvU3Vic2NyaXB0aW9uJztcbmltcG9ydCB7IHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QgfSBmcm9tICcuLi91dGlscy91c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0JztcbmltcG9ydCBzaGFsbG93RXF1YWwgZnJvbSAnLi4vdXRpbHMvc2hhbGxvd0VxdWFsJztcbmltcG9ydCB3YXJuaW5nIGZyb20gJy4uL3V0aWxzL3dhcm5pbmcnO1xuaW1wb3J0IHsgUmVhY3RSZWR1eENvbnRleHQgfSBmcm9tICcuL0NvbnRleHQnO1xuaW1wb3J0IHsgbm90SW5pdGlhbGl6ZWQgfSBmcm9tICcuLi91dGlscy91c2VTeW5jRXh0ZXJuYWxTdG9yZSc7XG5sZXQgdXNlU3luY0V4dGVybmFsU3RvcmUgPSBub3RJbml0aWFsaXplZDtcbmV4cG9ydCBjb25zdCBpbml0aWFsaXplQ29ubmVjdCA9IGZuID0+IHtcbiAgdXNlU3luY0V4dGVybmFsU3RvcmUgPSBmbjtcbn07IC8vIERlZmluZSBzb21lIGNvbnN0YW50IGFycmF5cyBqdXN0IHRvIGF2b2lkIHJlLWNyZWF0aW5nIHRoZXNlXG5cbmNvbnN0IEVNUFRZX0FSUkFZID0gW251bGwsIDBdO1xuY29uc3QgTk9fU1VCU0NSSVBUSU9OX0FSUkFZID0gW251bGwsIG51bGxdOyAvLyBBdHRlbXB0cyB0byBzdHJpbmdpZnkgd2hhdGV2ZXIgbm90LXJlYWxseS1hLWNvbXBvbmVudCB2YWx1ZSB3ZSB3ZXJlIGdpdmVuXG4vLyBmb3IgbG9nZ2luZyBpbiBhbiBlcnJvciBtZXNzYWdlXG5cbmNvbnN0IHN0cmluZ2lmeUNvbXBvbmVudCA9IENvbXAgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShDb21wKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIFN0cmluZyhDb21wKTtcbiAgfVxufTtcblxuLy8gVGhpcyBpcyBcImp1c3RcIiBhIGB1c2VMYXlvdXRFZmZlY3RgLCBidXQgd2l0aCB0d28gbW9kaWZpY2F0aW9uczpcbi8vIC0gd2UgbmVlZCB0byBmYWxsIGJhY2sgdG8gYHVzZUVmZmVjdGAgaW4gU1NSIHRvIGF2b2lkIGFubm95aW5nIHdhcm5pbmdzXG4vLyAtIHdlIGV4dHJhY3QgdGhpcyB0byBhIHNlcGFyYXRlIGZ1bmN0aW9uIHRvIGF2b2lkIGNsb3Npbmcgb3ZlciB2YWx1ZXNcbi8vICAgYW5kIGNhdXNpbmcgbWVtb3J5IGxlYWtzXG5mdW5jdGlvbiB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0V2l0aEFyZ3MoZWZmZWN0RnVuYywgZWZmZWN0QXJncywgZGVwZW5kZW5jaWVzKSB7XG4gIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QoKCkgPT4gZWZmZWN0RnVuYyguLi5lZmZlY3RBcmdzKSwgZGVwZW5kZW5jaWVzKTtcbn0gLy8gRWZmZWN0IGNhbGxiYWNrLCBleHRyYWN0ZWQ6IGFzc2lnbiB0aGUgbGF0ZXN0IHByb3BzIHZhbHVlcyB0byByZWZzIGZvciBsYXRlciB1c2FnZVxuXG5cbmZ1bmN0aW9uIGNhcHR1cmVXcmFwcGVyUHJvcHMobGFzdFdyYXBwZXJQcm9wcywgbGFzdENoaWxkUHJvcHMsIHJlbmRlcklzU2NoZWR1bGVkLCB3cmFwcGVyUHJvcHMsIC8vIGFjdHVhbENoaWxkUHJvcHM6IHVua25vd24sXG5jaGlsZFByb3BzRnJvbVN0b3JlVXBkYXRlLCBub3RpZnlOZXN0ZWRTdWJzKSB7XG4gIC8vIFdlIHdhbnQgdG8gY2FwdHVyZSB0aGUgd3JhcHBlciBwcm9wcyBhbmQgY2hpbGQgcHJvcHMgd2UgdXNlZCBmb3IgbGF0ZXIgY29tcGFyaXNvbnNcbiAgbGFzdFdyYXBwZXJQcm9wcy5jdXJyZW50ID0gd3JhcHBlclByb3BzO1xuICByZW5kZXJJc1NjaGVkdWxlZC5jdXJyZW50ID0gZmFsc2U7IC8vIElmIHRoZSByZW5kZXIgd2FzIGZyb20gYSBzdG9yZSB1cGRhdGUsIGNsZWFyIG91dCB0aGF0IHJlZmVyZW5jZSBhbmQgY2FzY2FkZSB0aGUgc3Vic2NyaWJlciB1cGRhdGVcblxuICBpZiAoY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZS5jdXJyZW50KSB7XG4gICAgY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZS5jdXJyZW50ID0gbnVsbDtcbiAgICBub3RpZnlOZXN0ZWRTdWJzKCk7XG4gIH1cbn0gLy8gRWZmZWN0IGNhbGxiYWNrLCBleHRyYWN0ZWQ6IHN1YnNjcmliZSB0byB0aGUgUmVkdXggc3RvcmUgb3IgbmVhcmVzdCBjb25uZWN0ZWQgYW5jZXN0b3IsXG4vLyBjaGVjayBmb3IgdXBkYXRlcyBhZnRlciBkaXNwYXRjaGVkIGFjdGlvbnMsIGFuZCB0cmlnZ2VyIHJlLXJlbmRlcnMuXG5cblxuZnVuY3Rpb24gc3Vic2NyaWJlVXBkYXRlcyhzaG91bGRIYW5kbGVTdGF0ZUNoYW5nZXMsIHN0b3JlLCBzdWJzY3JpcHRpb24sIGNoaWxkUHJvcHNTZWxlY3RvciwgbGFzdFdyYXBwZXJQcm9wcywgbGFzdENoaWxkUHJvcHMsIHJlbmRlcklzU2NoZWR1bGVkLCBpc01vdW50ZWQsIGNoaWxkUHJvcHNGcm9tU3RvcmVVcGRhdGUsIG5vdGlmeU5lc3RlZFN1YnMsIC8vIGZvcmNlQ29tcG9uZW50VXBkYXRlRGlzcGF0Y2g6IFJlYWN0LkRpc3BhdGNoPGFueT4sXG5hZGRpdGlvbmFsU3Vic2NyaWJlTGlzdGVuZXIpIHtcbiAgLy8gSWYgd2UncmUgbm90IHN1YnNjcmliZWQgdG8gdGhlIHN0b3JlLCBub3RoaW5nIHRvIGRvIGhlcmVcbiAgaWYgKCFzaG91bGRIYW5kbGVTdGF0ZUNoYW5nZXMpIHJldHVybiAoKSA9PiB7fTsgLy8gQ2FwdHVyZSB2YWx1ZXMgZm9yIGNoZWNraW5nIGlmIGFuZCB3aGVuIHRoaXMgY29tcG9uZW50IHVubW91bnRzXG5cbiAgbGV0IGRpZFVuc3Vic2NyaWJlID0gZmFsc2U7XG4gIGxldCBsYXN0VGhyb3duRXJyb3IgPSBudWxsOyAvLyBXZSdsbCBydW4gdGhpcyBjYWxsYmFjayBldmVyeSB0aW1lIGEgc3RvcmUgc3Vic2NyaXB0aW9uIHVwZGF0ZSBwcm9wYWdhdGVzIHRvIHRoaXMgY29tcG9uZW50XG5cbiAgY29uc3QgY2hlY2tGb3JVcGRhdGVzID0gKCkgPT4ge1xuICAgIGlmIChkaWRVbnN1YnNjcmliZSB8fCAhaXNNb3VudGVkLmN1cnJlbnQpIHtcbiAgICAgIC8vIERvbid0IHJ1biBzdGFsZSBsaXN0ZW5lcnMuXG4gICAgICAvLyBSZWR1eCBkb2Vzbid0IGd1YXJhbnRlZSB1bnN1YnNjcmlwdGlvbnMgaGFwcGVuIHVudGlsIG5leHQgZGlzcGF0Y2guXG4gICAgICByZXR1cm47XG4gICAgfSAvLyBUT0RPIFdlJ3JlIGN1cnJlbnRseSBjYWxsaW5nIGdldFN0YXRlIG91cnNlbHZlcyBoZXJlLCByYXRoZXIgdGhhbiBsZXR0aW5nIGB1U0VTYCBkbyBpdFxuXG5cbiAgICBjb25zdCBsYXRlc3RTdG9yZVN0YXRlID0gc3RvcmUuZ2V0U3RhdGUoKTtcbiAgICBsZXQgbmV3Q2hpbGRQcm9wcywgZXJyb3I7XG5cbiAgICB0cnkge1xuICAgICAgLy8gQWN0dWFsbHkgcnVuIHRoZSBzZWxlY3RvciB3aXRoIHRoZSBtb3N0IHJlY2VudCBzdG9yZSBzdGF0ZSBhbmQgd3JhcHBlciBwcm9wc1xuICAgICAgLy8gdG8gZGV0ZXJtaW5lIHdoYXQgdGhlIGNoaWxkIHByb3BzIHNob3VsZCBiZVxuICAgICAgbmV3Q2hpbGRQcm9wcyA9IGNoaWxkUHJvcHNTZWxlY3RvcihsYXRlc3RTdG9yZVN0YXRlLCBsYXN0V3JhcHBlclByb3BzLmN1cnJlbnQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9yID0gZTtcbiAgICAgIGxhc3RUaHJvd25FcnJvciA9IGU7XG4gICAgfVxuXG4gICAgaWYgKCFlcnJvcikge1xuICAgICAgbGFzdFRocm93bkVycm9yID0gbnVsbDtcbiAgICB9IC8vIElmIHRoZSBjaGlsZCBwcm9wcyBoYXZlbid0IGNoYW5nZWQsIG5vdGhpbmcgdG8gZG8gaGVyZSAtIGNhc2NhZGUgdGhlIHN1YnNjcmlwdGlvbiB1cGRhdGVcblxuXG4gICAgaWYgKG5ld0NoaWxkUHJvcHMgPT09IGxhc3RDaGlsZFByb3BzLmN1cnJlbnQpIHtcbiAgICAgIGlmICghcmVuZGVySXNTY2hlZHVsZWQuY3VycmVudCkge1xuICAgICAgICBub3RpZnlOZXN0ZWRTdWJzKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNhdmUgcmVmZXJlbmNlcyB0byB0aGUgbmV3IGNoaWxkIHByb3BzLiAgTm90ZSB0aGF0IHdlIHRyYWNrIHRoZSBcImNoaWxkIHByb3BzIGZyb20gc3RvcmUgdXBkYXRlXCJcbiAgICAgIC8vIGFzIGEgcmVmIGluc3RlYWQgb2YgYSB1c2VTdGF0ZS91c2VSZWR1Y2VyIGJlY2F1c2Ugd2UgbmVlZCBhIHdheSB0byBkZXRlcm1pbmUgaWYgdGhhdCB2YWx1ZSBoYXNcbiAgICAgIC8vIGJlZW4gcHJvY2Vzc2VkLiAgSWYgdGhpcyB3ZW50IGludG8gdXNlU3RhdGUvdXNlUmVkdWNlciwgd2UgY291bGRuJ3QgY2xlYXIgb3V0IHRoZSB2YWx1ZSB3aXRob3V0XG4gICAgICAvLyBmb3JjaW5nIGFub3RoZXIgcmUtcmVuZGVyLCB3aGljaCB3ZSBkb24ndCB3YW50LlxuICAgICAgbGFzdENoaWxkUHJvcHMuY3VycmVudCA9IG5ld0NoaWxkUHJvcHM7XG4gICAgICBjaGlsZFByb3BzRnJvbVN0b3JlVXBkYXRlLmN1cnJlbnQgPSBuZXdDaGlsZFByb3BzO1xuICAgICAgcmVuZGVySXNTY2hlZHVsZWQuY3VycmVudCA9IHRydWU7IC8vIFRPRE8gVGhpcyBpcyBoYWNreSBhbmQgbm90IGhvdyBgdVNFU2AgaXMgbWVhbnQgdG8gYmUgdXNlZFxuICAgICAgLy8gVHJpZ2dlciB0aGUgUmVhY3QgYHVzZVN5bmNFeHRlcm5hbFN0b3JlYCBzdWJzY3JpYmVyXG5cbiAgICAgIGFkZGl0aW9uYWxTdWJzY3JpYmVMaXN0ZW5lcigpO1xuICAgIH1cbiAgfTsgLy8gQWN0dWFsbHkgc3Vic2NyaWJlIHRvIHRoZSBuZWFyZXN0IGNvbm5lY3RlZCBhbmNlc3RvciAob3Igc3RvcmUpXG5cblxuICBzdWJzY3JpcHRpb24ub25TdGF0ZUNoYW5nZSA9IGNoZWNrRm9yVXBkYXRlcztcbiAgc3Vic2NyaXB0aW9uLnRyeVN1YnNjcmliZSgpOyAvLyBQdWxsIGRhdGEgZnJvbSB0aGUgc3RvcmUgYWZ0ZXIgZmlyc3QgcmVuZGVyIGluIGNhc2UgdGhlIHN0b3JlIGhhc1xuICAvLyBjaGFuZ2VkIHNpbmNlIHdlIGJlZ2FuLlxuXG4gIGNoZWNrRm9yVXBkYXRlcygpO1xuXG4gIGNvbnN0IHVuc3Vic2NyaWJlV3JhcHBlciA9ICgpID0+IHtcbiAgICBkaWRVbnN1YnNjcmliZSA9IHRydWU7XG4gICAgc3Vic2NyaXB0aW9uLnRyeVVuc3Vic2NyaWJlKCk7XG4gICAgc3Vic2NyaXB0aW9uLm9uU3RhdGVDaGFuZ2UgPSBudWxsO1xuXG4gICAgaWYgKGxhc3RUaHJvd25FcnJvcikge1xuICAgICAgLy8gSXQncyBwb3NzaWJsZSB0aGF0IHdlIGNhdWdodCBhbiBlcnJvciBkdWUgdG8gYSBiYWQgbWFwU3RhdGUgZnVuY3Rpb24sIGJ1dCB0aGVcbiAgICAgIC8vIHBhcmVudCByZS1yZW5kZXJlZCB3aXRob3V0IHRoaXMgY29tcG9uZW50IGFuZCB3ZSdyZSBhYm91dCB0byB1bm1vdW50LlxuICAgICAgLy8gVGhpcyBzaG91bGRuJ3QgaGFwcGVuIGFzIGxvbmcgYXMgd2UgZG8gdG9wLWRvd24gc3Vic2NyaXB0aW9ucyBjb3JyZWN0bHksIGJ1dFxuICAgICAgLy8gaWYgd2UgZXZlciBkbyB0aG9zZSB3cm9uZywgdGhpcyB0aHJvdyB3aWxsIHN1cmZhY2UgdGhlIGVycm9yIGluIG91ciB0ZXN0cy5cbiAgICAgIC8vIEluIHRoYXQgY2FzZSwgdGhyb3cgdGhlIGVycm9yIGZyb20gaGVyZSBzbyBpdCBkb2Vzbid0IGdldCBsb3N0LlxuICAgICAgdGhyb3cgbGFzdFRocm93bkVycm9yO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gdW5zdWJzY3JpYmVXcmFwcGVyO1xufSAvLyBSZWR1Y2VyIGluaXRpYWwgc3RhdGUgY3JlYXRpb24gZm9yIG91ciB1cGRhdGUgcmVkdWNlclxuXG5cbmNvbnN0IGluaXRTdGF0ZVVwZGF0ZXMgPSAoKSA9PiBFTVBUWV9BUlJBWTtcblxuZnVuY3Rpb24gc3RyaWN0RXF1YWwoYSwgYikge1xuICByZXR1cm4gYSA9PT0gYjtcbn1cbi8qKlxyXG4gKiBJbmZlcnMgdGhlIHR5cGUgb2YgcHJvcHMgdGhhdCBhIGNvbm5lY3RvciB3aWxsIGluamVjdCBpbnRvIGEgY29tcG9uZW50LlxyXG4gKi9cblxuXG5sZXQgaGFzV2FybmVkQWJvdXREZXByZWNhdGVkUHVyZU9wdGlvbiA9IGZhbHNlO1xuLyoqXHJcbiAqIENvbm5lY3RzIGEgUmVhY3QgY29tcG9uZW50IHRvIGEgUmVkdXggc3RvcmUuXHJcbiAqXHJcbiAqIC0gV2l0aG91dCBhcmd1bWVudHMsIGp1c3Qgd3JhcHMgdGhlIGNvbXBvbmVudCwgd2l0aG91dCBjaGFuZ2luZyB0aGUgYmVoYXZpb3IgLyBwcm9wc1xyXG4gKlxyXG4gKiAtIElmIDIgcGFyYW1zIGFyZSBwYXNzZWQgKDNyZCBwYXJhbSwgbWVyZ2VQcm9wcywgaXMgc2tpcHBlZCksIGRlZmF1bHQgYmVoYXZpb3JcclxuICogaXMgdG8gb3ZlcnJpZGUgb3duUHJvcHMgKGFzIHN0YXRlZCBpbiB0aGUgZG9jcyksIHNvIHdoYXQgcmVtYWlucyBpcyBldmVyeXRoaW5nIHRoYXQnc1xyXG4gKiBub3QgYSBzdGF0ZSBvciBkaXNwYXRjaCBwcm9wXHJcbiAqXHJcbiAqIC0gV2hlbiAzcmQgcGFyYW0gaXMgcGFzc2VkLCB3ZSBkb24ndCBrbm93IGlmIG93blByb3BzIHByb3BhZ2F0ZSBhbmQgd2hldGhlciB0aGV5XHJcbiAqIHNob3VsZCBiZSB2YWxpZCBjb21wb25lbnQgcHJvcHMsIGJlY2F1c2UgaXQgZGVwZW5kcyBvbiBtZXJnZVByb3BzIGltcGxlbWVudGF0aW9uLlxyXG4gKiBBcyBzdWNoLCBpdCBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGV4dGVuZCBvd25Qcm9wcyBpbnRlcmZhY2UgZnJvbSBzdGF0ZSBvclxyXG4gKiBkaXNwYXRjaCBwcm9wcyBvciBib3RoIHdoZW4gYXBwbGljYWJsZVxyXG4gKlxyXG4gKiBAcGFyYW0gbWFwU3RhdGVUb1Byb3BzIEEgZnVuY3Rpb24gdGhhdCBleHRyYWN0cyB2YWx1ZXMgZnJvbSBzdGF0ZVxyXG4gKiBAcGFyYW0gbWFwRGlzcGF0Y2hUb1Byb3BzIFNldHVwIGZvciBkaXNwYXRjaGluZyBhY3Rpb25zXHJcbiAqIEBwYXJhbSBtZXJnZVByb3BzIE9wdGlvbmFsIGNhbGxiYWNrIHRvIG1lcmdlIHN0YXRlIGFuZCBkaXNwYXRjaCBwcm9wcyB0b2dldGhlclxyXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciBjb25maWd1cmluZyB0aGUgY29ubmVjdGlvblxyXG4gKlxyXG4gKi9cblxuZnVuY3Rpb24gY29ubmVjdChtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcywgbWVyZ2VQcm9wcywge1xuICAvLyBUaGUgYHB1cmVgIG9wdGlvbiBoYXMgYmVlbiByZW1vdmVkLCBzbyBUUyBkb2Vzbid0IGxpa2UgdXMgZGVzdHJ1Y3R1cmluZyB0aGlzIHRvIGNoZWNrIGl0cyBleGlzdGVuY2UuXG4gIC8vIEB0cy1pZ25vcmVcbiAgcHVyZSxcbiAgYXJlU3RhdGVzRXF1YWwgPSBzdHJpY3RFcXVhbCxcbiAgYXJlT3duUHJvcHNFcXVhbCA9IHNoYWxsb3dFcXVhbCxcbiAgYXJlU3RhdGVQcm9wc0VxdWFsID0gc2hhbGxvd0VxdWFsLFxuICBhcmVNZXJnZWRQcm9wc0VxdWFsID0gc2hhbGxvd0VxdWFsLFxuICAvLyB1c2UgUmVhY3QncyBmb3J3YXJkUmVmIHRvIGV4cG9zZSBhIHJlZiBvZiB0aGUgd3JhcHBlZCBjb21wb25lbnRcbiAgZm9yd2FyZFJlZiA9IGZhbHNlLFxuICAvLyB0aGUgY29udGV4dCBjb25zdW1lciB0byB1c2VcbiAgY29udGV4dCA9IFJlYWN0UmVkdXhDb250ZXh0XG59ID0ge30pIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBpZiAocHVyZSAhPT0gdW5kZWZpbmVkICYmICFoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRQdXJlT3B0aW9uKSB7XG4gICAgICBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRQdXJlT3B0aW9uID0gdHJ1ZTtcbiAgICAgIHdhcm5pbmcoJ1RoZSBgcHVyZWAgb3B0aW9uIGhhcyBiZWVuIHJlbW92ZWQuIGBjb25uZWN0YCBpcyBub3cgYWx3YXlzIGEgXCJwdXJlL21lbW9pemVkXCIgY29tcG9uZW50Jyk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgQ29udGV4dCA9IGNvbnRleHQ7XG4gIGNvbnN0IGluaXRNYXBTdGF0ZVRvUHJvcHMgPSBtYXBTdGF0ZVRvUHJvcHNGYWN0b3J5KG1hcFN0YXRlVG9Qcm9wcyk7XG4gIGNvbnN0IGluaXRNYXBEaXNwYXRjaFRvUHJvcHMgPSBtYXBEaXNwYXRjaFRvUHJvcHNGYWN0b3J5KG1hcERpc3BhdGNoVG9Qcm9wcyk7XG4gIGNvbnN0IGluaXRNZXJnZVByb3BzID0gbWVyZ2VQcm9wc0ZhY3RvcnkobWVyZ2VQcm9wcyk7XG4gIGNvbnN0IHNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlcyA9IEJvb2xlYW4obWFwU3RhdGVUb1Byb3BzKTtcblxuICBjb25zdCB3cmFwV2l0aENvbm5lY3QgPSBXcmFwcGVkQ29tcG9uZW50ID0+IHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiAhaXNWYWxpZEVsZW1lbnRUeXBlKFdyYXBwZWRDb21wb25lbnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFlvdSBtdXN0IHBhc3MgYSBjb21wb25lbnQgdG8gdGhlIGZ1bmN0aW9uIHJldHVybmVkIGJ5IGNvbm5lY3QuIEluc3RlYWQgcmVjZWl2ZWQgJHtzdHJpbmdpZnlDb21wb25lbnQoV3JhcHBlZENvbXBvbmVudCl9YCk7XG4gICAgfVxuXG4gICAgY29uc3Qgd3JhcHBlZENvbXBvbmVudE5hbWUgPSBXcmFwcGVkQ29tcG9uZW50LmRpc3BsYXlOYW1lIHx8IFdyYXBwZWRDb21wb25lbnQubmFtZSB8fCAnQ29tcG9uZW50JztcbiAgICBjb25zdCBkaXNwbGF5TmFtZSA9IGBDb25uZWN0KCR7d3JhcHBlZENvbXBvbmVudE5hbWV9KWA7XG4gICAgY29uc3Qgc2VsZWN0b3JGYWN0b3J5T3B0aW9ucyA9IHtcbiAgICAgIHNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlcyxcbiAgICAgIGRpc3BsYXlOYW1lLFxuICAgICAgd3JhcHBlZENvbXBvbmVudE5hbWUsXG4gICAgICBXcmFwcGVkQ29tcG9uZW50LFxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgaW5pdE1hcFN0YXRlVG9Qcm9wcyxcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGluaXRNYXBEaXNwYXRjaFRvUHJvcHMsXG4gICAgICBpbml0TWVyZ2VQcm9wcyxcbiAgICAgIGFyZVN0YXRlc0VxdWFsLFxuICAgICAgYXJlU3RhdGVQcm9wc0VxdWFsLFxuICAgICAgYXJlT3duUHJvcHNFcXVhbCxcbiAgICAgIGFyZU1lcmdlZFByb3BzRXF1YWxcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gQ29ubmVjdEZ1bmN0aW9uKHByb3BzKSB7XG4gICAgICBjb25zdCBbcHJvcHNDb250ZXh0LCByZWFjdFJlZHV4Rm9yd2FyZGVkUmVmLCB3cmFwcGVyUHJvcHNdID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgICAgIC8vIERpc3Rpbmd1aXNoIGJldHdlZW4gYWN0dWFsIFwiZGF0YVwiIHByb3BzIHRoYXQgd2VyZSBwYXNzZWQgdG8gdGhlIHdyYXBwZXIgY29tcG9uZW50LFxuICAgICAgICAvLyBhbmQgdmFsdWVzIG5lZWRlZCB0byBjb250cm9sIGJlaGF2aW9yIChmb3J3YXJkZWQgcmVmcywgYWx0ZXJuYXRlIGNvbnRleHQgaW5zdGFuY2VzKS5cbiAgICAgICAgLy8gVG8gbWFpbnRhaW4gdGhlIHdyYXBwZXJQcm9wcyBvYmplY3QgcmVmZXJlbmNlLCBtZW1vaXplIHRoaXMgZGVzdHJ1Y3R1cmluZy5cbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHJlYWN0UmVkdXhGb3J3YXJkZWRSZWZcbiAgICAgICAgfSA9IHByb3BzLFxuICAgICAgICAgICAgICB3cmFwcGVyUHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShwcm9wcywgX2V4Y2x1ZGVkKTtcblxuICAgICAgICByZXR1cm4gW3Byb3BzLmNvbnRleHQsIHJlYWN0UmVkdXhGb3J3YXJkZWRSZWYsIHdyYXBwZXJQcm9wc107XG4gICAgICB9LCBbcHJvcHNdKTtcbiAgICAgIGNvbnN0IENvbnRleHRUb1VzZSA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgICAgICAvLyBVc2VycyBtYXkgb3B0aW9uYWxseSBwYXNzIGluIGEgY3VzdG9tIGNvbnRleHQgaW5zdGFuY2UgdG8gdXNlIGluc3RlYWQgb2Ygb3VyIFJlYWN0UmVkdXhDb250ZXh0LlxuICAgICAgICAvLyBNZW1vaXplIHRoZSBjaGVjayB0aGF0IGRldGVybWluZXMgd2hpY2ggY29udGV4dCBpbnN0YW5jZSB3ZSBzaG91bGQgdXNlLlxuICAgICAgICByZXR1cm4gcHJvcHNDb250ZXh0ICYmIHByb3BzQ29udGV4dC5Db25zdW1lciAmJiAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlzQ29udGV4dENvbnN1bWVyKCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChwcm9wc0NvbnRleHQuQ29uc3VtZXIsIG51bGwpKSA/IHByb3BzQ29udGV4dCA6IENvbnRleHQ7XG4gICAgICB9LCBbcHJvcHNDb250ZXh0LCBDb250ZXh0XSk7IC8vIFJldHJpZXZlIHRoZSBzdG9yZSBhbmQgYW5jZXN0b3Igc3Vic2NyaXB0aW9uIHZpYSBjb250ZXh0LCBpZiBhdmFpbGFibGVcblxuICAgICAgY29uc3QgY29udGV4dFZhbHVlID0gUmVhY3QudXNlQ29udGV4dChDb250ZXh0VG9Vc2UpOyAvLyBUaGUgc3RvcmUgX211c3RfIGV4aXN0IGFzIGVpdGhlciBhIHByb3Agb3IgaW4gY29udGV4dC5cbiAgICAgIC8vIFdlJ2xsIGNoZWNrIHRvIHNlZSBpZiBpdCBfbG9va3NfIGxpa2UgYSBSZWR1eCBzdG9yZSBmaXJzdC5cbiAgICAgIC8vIFRoaXMgYWxsb3dzIHVzIHRvIHBhc3MgdGhyb3VnaCBhIGBzdG9yZWAgcHJvcCB0aGF0IGlzIGp1c3QgYSBwbGFpbiB2YWx1ZS5cblxuICAgICAgY29uc3QgZGlkU3RvcmVDb21lRnJvbVByb3BzID0gQm9vbGVhbihwcm9wcy5zdG9yZSkgJiYgQm9vbGVhbihwcm9wcy5zdG9yZS5nZXRTdGF0ZSkgJiYgQm9vbGVhbihwcm9wcy5zdG9yZS5kaXNwYXRjaCk7XG4gICAgICBjb25zdCBkaWRTdG9yZUNvbWVGcm9tQ29udGV4dCA9IEJvb2xlYW4oY29udGV4dFZhbHVlKSAmJiBCb29sZWFuKGNvbnRleHRWYWx1ZS5zdG9yZSk7XG5cbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmICFkaWRTdG9yZUNvbWVGcm9tUHJvcHMgJiYgIWRpZFN0b3JlQ29tZUZyb21Db250ZXh0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgXCJzdG9yZVwiIGluIHRoZSBjb250ZXh0IG9mIGAgKyBgXCIke2Rpc3BsYXlOYW1lfVwiLiBFaXRoZXIgd3JhcCB0aGUgcm9vdCBjb21wb25lbnQgaW4gYSA8UHJvdmlkZXI+LCBgICsgYG9yIHBhc3MgYSBjdXN0b20gUmVhY3QgY29udGV4dCBwcm92aWRlciB0byA8UHJvdmlkZXI+IGFuZCB0aGUgY29ycmVzcG9uZGluZyBgICsgYFJlYWN0IGNvbnRleHQgY29uc3VtZXIgdG8gJHtkaXNwbGF5TmFtZX0gaW4gY29ubmVjdCBvcHRpb25zLmApO1xuICAgICAgfSAvLyBCYXNlZCBvbiB0aGUgcHJldmlvdXMgY2hlY2ssIG9uZSBvZiB0aGVzZSBtdXN0IGJlIHRydWVcblxuXG4gICAgICBjb25zdCBzdG9yZSA9IGRpZFN0b3JlQ29tZUZyb21Qcm9wcyA/IHByb3BzLnN0b3JlIDogY29udGV4dFZhbHVlLnN0b3JlO1xuICAgICAgY29uc3QgZ2V0U2VydmVyU3RhdGUgPSBkaWRTdG9yZUNvbWVGcm9tQ29udGV4dCA/IGNvbnRleHRWYWx1ZS5nZXRTZXJ2ZXJTdGF0ZSA6IHN0b3JlLmdldFN0YXRlO1xuICAgICAgY29uc3QgY2hpbGRQcm9wc1NlbGVjdG9yID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgICAgIC8vIFRoZSBjaGlsZCBwcm9wcyBzZWxlY3RvciBuZWVkcyB0aGUgc3RvcmUgcmVmZXJlbmNlIGFzIGFuIGlucHV0LlxuICAgICAgICAvLyBSZS1jcmVhdGUgdGhpcyBzZWxlY3RvciB3aGVuZXZlciB0aGUgc3RvcmUgY2hhbmdlcy5cbiAgICAgICAgcmV0dXJuIGRlZmF1bHRTZWxlY3RvckZhY3Rvcnkoc3RvcmUuZGlzcGF0Y2gsIHNlbGVjdG9yRmFjdG9yeU9wdGlvbnMpO1xuICAgICAgfSwgW3N0b3JlXSk7XG4gICAgICBjb25zdCBbc3Vic2NyaXB0aW9uLCBub3RpZnlOZXN0ZWRTdWJzXSA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgICAgICBpZiAoIXNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlcykgcmV0dXJuIE5PX1NVQlNDUklQVElPTl9BUlJBWTsgLy8gVGhpcyBTdWJzY3JpcHRpb24ncyBzb3VyY2Ugc2hvdWxkIG1hdGNoIHdoZXJlIHN0b3JlIGNhbWUgZnJvbTogcHJvcHMgdnMuIGNvbnRleHQuIEEgY29tcG9uZW50XG4gICAgICAgIC8vIGNvbm5lY3RlZCB0byB0aGUgc3RvcmUgdmlhIHByb3BzIHNob3VsZG4ndCB1c2Ugc3Vic2NyaXB0aW9uIGZyb20gY29udGV4dCwgb3IgdmljZSB2ZXJzYS5cblxuICAgICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSBjcmVhdGVTdWJzY3JpcHRpb24oc3RvcmUsIGRpZFN0b3JlQ29tZUZyb21Qcm9wcyA/IHVuZGVmaW5lZCA6IGNvbnRleHRWYWx1ZS5zdWJzY3JpcHRpb24pOyAvLyBgbm90aWZ5TmVzdGVkU3Vic2AgaXMgZHVwbGljYXRlZCB0byBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIGNvbXBvbmVudCBpcyB1bm1vdW50ZWQgaW5cbiAgICAgICAgLy8gdGhlIG1pZGRsZSBvZiB0aGUgbm90aWZpY2F0aW9uIGxvb3AsIHdoZXJlIGBzdWJzY3JpcHRpb25gIHdpbGwgdGhlbiBiZSBudWxsLiBUaGlzIGNhblxuICAgICAgICAvLyBwcm9iYWJseSBiZSBhdm9pZGVkIGlmIFN1YnNjcmlwdGlvbidzIGxpc3RlbmVycyBsb2dpYyBpcyBjaGFuZ2VkIHRvIG5vdCBjYWxsIGxpc3RlbmVyc1xuICAgICAgICAvLyB0aGF0IGhhdmUgYmVlbiB1bnN1YnNjcmliZWQgaW4gdGhlICBtaWRkbGUgb2YgdGhlIG5vdGlmaWNhdGlvbiBsb29wLlxuXG4gICAgICAgIGNvbnN0IG5vdGlmeU5lc3RlZFN1YnMgPSBzdWJzY3JpcHRpb24ubm90aWZ5TmVzdGVkU3Vicy5iaW5kKHN1YnNjcmlwdGlvbik7XG4gICAgICAgIHJldHVybiBbc3Vic2NyaXB0aW9uLCBub3RpZnlOZXN0ZWRTdWJzXTtcbiAgICAgIH0sIFtzdG9yZSwgZGlkU3RvcmVDb21lRnJvbVByb3BzLCBjb250ZXh0VmFsdWVdKTsgLy8gRGV0ZXJtaW5lIHdoYXQge3N0b3JlLCBzdWJzY3JpcHRpb259IHZhbHVlIHNob3VsZCBiZSBwdXQgaW50byBuZXN0ZWQgY29udGV4dCwgaWYgbmVjZXNzYXJ5LFxuICAgICAgLy8gYW5kIG1lbW9pemUgdGhhdCB2YWx1ZSB0byBhdm9pZCB1bm5lY2Vzc2FyeSBjb250ZXh0IHVwZGF0ZXMuXG5cbiAgICAgIGNvbnN0IG92ZXJyaWRkZW5Db250ZXh0VmFsdWUgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICAgICAgaWYgKGRpZFN0b3JlQ29tZUZyb21Qcm9wcykge1xuICAgICAgICAgIC8vIFRoaXMgY29tcG9uZW50IGlzIGRpcmVjdGx5IHN1YnNjcmliZWQgdG8gYSBzdG9yZSBmcm9tIHByb3BzLlxuICAgICAgICAgIC8vIFdlIGRvbid0IHdhbnQgZGVzY2VuZGFudHMgcmVhZGluZyBmcm9tIHRoaXMgc3RvcmUgLSBwYXNzIGRvd24gd2hhdGV2ZXJcbiAgICAgICAgICAvLyB0aGUgZXhpc3RpbmcgY29udGV4dCB2YWx1ZSBpcyBmcm9tIHRoZSBuZWFyZXN0IGNvbm5lY3RlZCBhbmNlc3Rvci5cbiAgICAgICAgICByZXR1cm4gY29udGV4dFZhbHVlO1xuICAgICAgICB9IC8vIE90aGVyd2lzZSwgcHV0IHRoaXMgY29tcG9uZW50J3Mgc3Vic2NyaXB0aW9uIGluc3RhbmNlIGludG8gY29udGV4dCwgc28gdGhhdFxuICAgICAgICAvLyBjb25uZWN0ZWQgZGVzY2VuZGFudHMgd29uJ3QgdXBkYXRlIHVudGlsIGFmdGVyIHRoaXMgY29tcG9uZW50IGlzIGRvbmVcblxuXG4gICAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgY29udGV4dFZhbHVlLCB7XG4gICAgICAgICAgc3Vic2NyaXB0aW9uXG4gICAgICAgIH0pO1xuICAgICAgfSwgW2RpZFN0b3JlQ29tZUZyb21Qcm9wcywgY29udGV4dFZhbHVlLCBzdWJzY3JpcHRpb25dKTsgLy8gU2V0IHVwIHJlZnMgdG8gY29vcmRpbmF0ZSB2YWx1ZXMgYmV0d2VlbiB0aGUgc3Vic2NyaXB0aW9uIGVmZmVjdCBhbmQgdGhlIHJlbmRlciBsb2dpY1xuXG4gICAgICBjb25zdCBsYXN0Q2hpbGRQcm9wcyA9IFJlYWN0LnVzZVJlZigpO1xuICAgICAgY29uc3QgbGFzdFdyYXBwZXJQcm9wcyA9IFJlYWN0LnVzZVJlZih3cmFwcGVyUHJvcHMpO1xuICAgICAgY29uc3QgY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZSA9IFJlYWN0LnVzZVJlZigpO1xuICAgICAgY29uc3QgcmVuZGVySXNTY2hlZHVsZWQgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICAgICAgY29uc3QgaXNQcm9jZXNzaW5nRGlzcGF0Y2ggPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICAgICAgY29uc3QgaXNNb3VudGVkID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcbiAgICAgIGNvbnN0IGxhdGVzdFN1YnNjcmlwdGlvbkNhbGxiYWNrRXJyb3IgPSBSZWFjdC51c2VSZWYoKTtcbiAgICAgIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpc01vdW50ZWQuY3VycmVudCA9IHRydWU7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgaXNNb3VudGVkLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgICAgfTtcbiAgICAgIH0sIFtdKTtcbiAgICAgIGNvbnN0IGFjdHVhbENoaWxkUHJvcHNTZWxlY3RvciA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgICAgICBjb25zdCBzZWxlY3RvciA9ICgpID0+IHtcbiAgICAgICAgICAvLyBUcmlja3kgbG9naWMgaGVyZTpcbiAgICAgICAgICAvLyAtIFRoaXMgcmVuZGVyIG1heSBoYXZlIGJlZW4gdHJpZ2dlcmVkIGJ5IGEgUmVkdXggc3RvcmUgdXBkYXRlIHRoYXQgcHJvZHVjZWQgbmV3IGNoaWxkIHByb3BzXG4gICAgICAgICAgLy8gLSBIb3dldmVyLCB3ZSBtYXkgaGF2ZSBnb3R0ZW4gbmV3IHdyYXBwZXIgcHJvcHMgYWZ0ZXIgdGhhdFxuICAgICAgICAgIC8vIElmIHdlIGhhdmUgbmV3IGNoaWxkIHByb3BzLCBhbmQgdGhlIHNhbWUgd3JhcHBlciBwcm9wcywgd2Uga25vdyB3ZSBzaG91bGQgdXNlIHRoZSBuZXcgY2hpbGQgcHJvcHMgYXMtaXMuXG4gICAgICAgICAgLy8gQnV0LCBpZiB3ZSBoYXZlIG5ldyB3cmFwcGVyIHByb3BzLCB0aG9zZSBtaWdodCBjaGFuZ2UgdGhlIGNoaWxkIHByb3BzLCBzbyB3ZSBoYXZlIHRvIHJlY2FsY3VsYXRlIHRoaW5ncy5cbiAgICAgICAgICAvLyBTbywgd2UnbGwgdXNlIHRoZSBjaGlsZCBwcm9wcyBmcm9tIHN0b3JlIHVwZGF0ZSBvbmx5IGlmIHRoZSB3cmFwcGVyIHByb3BzIGFyZSB0aGUgc2FtZSBhcyBsYXN0IHRpbWUuXG4gICAgICAgICAgaWYgKGNoaWxkUHJvcHNGcm9tU3RvcmVVcGRhdGUuY3VycmVudCAmJiB3cmFwcGVyUHJvcHMgPT09IGxhc3RXcmFwcGVyUHJvcHMuY3VycmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGNoaWxkUHJvcHNGcm9tU3RvcmVVcGRhdGUuY3VycmVudDtcbiAgICAgICAgICB9IC8vIFRPRE8gV2UncmUgcmVhZGluZyB0aGUgc3RvcmUgZGlyZWN0bHkgaW4gcmVuZGVyKCkgaGVyZS4gQmFkIGlkZWE/XG4gICAgICAgICAgLy8gVGhpcyB3aWxsIGxpa2VseSBjYXVzZSBCYWQgVGhpbmdzIChUTSkgdG8gaGFwcGVuIGluIENvbmN1cnJlbnQgTW9kZS5cbiAgICAgICAgICAvLyBOb3RlIHRoYXQgd2UgZG8gdGhpcyBiZWNhdXNlIG9uIHJlbmRlcnMgX25vdF8gY2F1c2VkIGJ5IHN0b3JlIHVwZGF0ZXMsIHdlIG5lZWQgdGhlIGxhdGVzdCBzdG9yZSBzdGF0ZVxuICAgICAgICAgIC8vIHRvIGRldGVybWluZSB3aGF0IHRoZSBjaGlsZCBwcm9wcyBzaG91bGQgYmUuXG5cblxuICAgICAgICAgIHJldHVybiBjaGlsZFByb3BzU2VsZWN0b3Ioc3RvcmUuZ2V0U3RhdGUoKSwgd3JhcHBlclByb3BzKTtcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gc2VsZWN0b3I7XG4gICAgICB9LCBbc3RvcmUsIHdyYXBwZXJQcm9wc10pOyAvLyBXZSBuZWVkIHRoaXMgdG8gZXhlY3V0ZSBzeW5jaHJvbm91c2x5IGV2ZXJ5IHRpbWUgd2UgcmUtcmVuZGVyLiBIb3dldmVyLCBSZWFjdCB3YXJuc1xuICAgICAgLy8gYWJvdXQgdXNlTGF5b3V0RWZmZWN0IGluIFNTUiwgc28gd2UgdHJ5IHRvIGRldGVjdCBlbnZpcm9ubWVudCBhbmQgZmFsbCBiYWNrIHRvXG4gICAgICAvLyBqdXN0IHVzZUVmZmVjdCBpbnN0ZWFkIHRvIGF2b2lkIHRoZSB3YXJuaW5nLCBzaW5jZSBuZWl0aGVyIHdpbGwgcnVuIGFueXdheS5cblxuICAgICAgY29uc3Qgc3Vic2NyaWJlRm9yUmVhY3QgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICAgICAgY29uc3Qgc3Vic2NyaWJlID0gcmVhY3RMaXN0ZW5lciA9PiB7XG4gICAgICAgICAgaWYgKCFzdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7fTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gc3Vic2NyaWJlVXBkYXRlcyhzaG91bGRIYW5kbGVTdGF0ZUNoYW5nZXMsIHN0b3JlLCBzdWJzY3JpcHRpb24sIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICBjaGlsZFByb3BzU2VsZWN0b3IsIGxhc3RXcmFwcGVyUHJvcHMsIGxhc3RDaGlsZFByb3BzLCByZW5kZXJJc1NjaGVkdWxlZCwgaXNNb3VudGVkLCBjaGlsZFByb3BzRnJvbVN0b3JlVXBkYXRlLCBub3RpZnlOZXN0ZWRTdWJzLCByZWFjdExpc3RlbmVyKTtcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gc3Vic2NyaWJlO1xuICAgICAgfSwgW3N1YnNjcmlwdGlvbl0pO1xuICAgICAgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdFdpdGhBcmdzKGNhcHR1cmVXcmFwcGVyUHJvcHMsIFtsYXN0V3JhcHBlclByb3BzLCBsYXN0Q2hpbGRQcm9wcywgcmVuZGVySXNTY2hlZHVsZWQsIHdyYXBwZXJQcm9wcywgY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZSwgbm90aWZ5TmVzdGVkU3Vic10pO1xuICAgICAgbGV0IGFjdHVhbENoaWxkUHJvcHM7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGFjdHVhbENoaWxkUHJvcHMgPSB1c2VTeW5jRXh0ZXJuYWxTdG9yZSggLy8gVE9ETyBXZSdyZSBwYXNzaW5nIHRocm91Z2ggYSBiaWcgd3JhcHBlciB0aGF0IGRvZXMgYSBidW5jaCBvZiBleHRyYSBzaWRlIGVmZmVjdHMgYmVzaWRlcyBzdWJzY3JpYmluZ1xuICAgICAgICBzdWJzY3JpYmVGb3JSZWFjdCwgLy8gVE9ETyBUaGlzIGlzIGluY3JlZGlibHkgaGFja3kuIFdlJ3ZlIGFscmVhZHkgcHJvY2Vzc2VkIHRoZSBzdG9yZSB1cGRhdGUgYW5kIGNhbGN1bGF0ZWQgbmV3IGNoaWxkIHByb3BzLFxuICAgICAgICAvLyBUT0RPIGFuZCB3ZSdyZSBqdXN0IHBhc3NpbmcgdGhhdCB0aHJvdWdoIHNvIGl0IHRyaWdnZXJzIGEgcmUtcmVuZGVyIGZvciB1cyByYXRoZXIgdGhhbiByZWx5aW5nIG9uIGB1U0VTYC5cbiAgICAgICAgYWN0dWFsQ2hpbGRQcm9wc1NlbGVjdG9yLCBnZXRTZXJ2ZXJTdGF0ZSA/ICgpID0+IGNoaWxkUHJvcHNTZWxlY3RvcihnZXRTZXJ2ZXJTdGF0ZSgpLCB3cmFwcGVyUHJvcHMpIDogYWN0dWFsQ2hpbGRQcm9wc1NlbGVjdG9yKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAobGF0ZXN0U3Vic2NyaXB0aW9uQ2FsbGJhY2tFcnJvci5jdXJyZW50KSB7XG4gICAgICAgICAgO1xuICAgICAgICAgIGVyci5tZXNzYWdlICs9IGBcXG5UaGUgZXJyb3IgbWF5IGJlIGNvcnJlbGF0ZWQgd2l0aCB0aGlzIHByZXZpb3VzIGVycm9yOlxcbiR7bGF0ZXN0U3Vic2NyaXB0aW9uQ2FsbGJhY2tFcnJvci5jdXJyZW50LnN0YWNrfVxcblxcbmA7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG5cbiAgICAgIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgICAgICBsYXRlc3RTdWJzY3JpcHRpb25DYWxsYmFja0Vycm9yLmN1cnJlbnQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGNoaWxkUHJvcHNGcm9tU3RvcmVVcGRhdGUuY3VycmVudCA9IHVuZGVmaW5lZDtcbiAgICAgICAgbGFzdENoaWxkUHJvcHMuY3VycmVudCA9IGFjdHVhbENoaWxkUHJvcHM7XG4gICAgICB9KTsgLy8gTm93IHRoYXQgYWxsIHRoYXQncyBkb25lLCB3ZSBjYW4gZmluYWxseSB0cnkgdG8gYWN0dWFsbHkgcmVuZGVyIHRoZSBjaGlsZCBjb21wb25lbnQuXG4gICAgICAvLyBXZSBtZW1vaXplIHRoZSBlbGVtZW50cyBmb3IgdGhlIHJlbmRlcmVkIGNoaWxkIGNvbXBvbmVudCBhcyBhbiBvcHRpbWl6YXRpb24uXG5cbiAgICAgIGNvbnN0IHJlbmRlcmVkV3JhcHBlZENvbXBvbmVudCA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIC8qI19fUFVSRV9fKi9cbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChXcmFwcGVkQ29tcG9uZW50LCBfZXh0ZW5kcyh7fSwgYWN0dWFsQ2hpbGRQcm9wcywge1xuICAgICAgICAgICAgcmVmOiByZWFjdFJlZHV4Rm9yd2FyZGVkUmVmXG4gICAgICAgICAgfSkpXG4gICAgICAgICk7XG4gICAgICB9LCBbcmVhY3RSZWR1eEZvcndhcmRlZFJlZiwgV3JhcHBlZENvbXBvbmVudCwgYWN0dWFsQ2hpbGRQcm9wc10pOyAvLyBJZiBSZWFjdCBzZWVzIHRoZSBleGFjdCBzYW1lIGVsZW1lbnQgcmVmZXJlbmNlIGFzIGxhc3QgdGltZSwgaXQgYmFpbHMgb3V0IG9mIHJlLXJlbmRlcmluZ1xuICAgICAgLy8gdGhhdCBjaGlsZCwgc2FtZSBhcyBpZiBpdCB3YXMgd3JhcHBlZCBpbiBSZWFjdC5tZW1vKCkgb3IgcmV0dXJuZWQgZmFsc2UgZnJvbSBzaG91bGRDb21wb25lbnRVcGRhdGUuXG5cbiAgICAgIGNvbnN0IHJlbmRlcmVkQ2hpbGQgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICAgICAgaWYgKHNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlcykge1xuICAgICAgICAgIC8vIElmIHRoaXMgY29tcG9uZW50IGlzIHN1YnNjcmliZWQgdG8gc3RvcmUgdXBkYXRlcywgd2UgbmVlZCB0byBwYXNzIGl0cyBvd25cbiAgICAgICAgICAvLyBzdWJzY3JpcHRpb24gaW5zdGFuY2UgZG93biB0byBvdXIgZGVzY2VuZGFudHMuIFRoYXQgbWVhbnMgcmVuZGVyaW5nIHRoZSBzYW1lXG4gICAgICAgICAgLy8gQ29udGV4dCBpbnN0YW5jZSwgYW5kIHB1dHRpbmcgYSBkaWZmZXJlbnQgdmFsdWUgaW50byB0aGUgY29udGV4dC5cbiAgICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29udGV4dFRvVXNlLlByb3ZpZGVyLCB7XG4gICAgICAgICAgICB2YWx1ZTogb3ZlcnJpZGRlbkNvbnRleHRWYWx1ZVxuICAgICAgICAgIH0sIHJlbmRlcmVkV3JhcHBlZENvbXBvbmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVuZGVyZWRXcmFwcGVkQ29tcG9uZW50O1xuICAgICAgfSwgW0NvbnRleHRUb1VzZSwgcmVuZGVyZWRXcmFwcGVkQ29tcG9uZW50LCBvdmVycmlkZGVuQ29udGV4dFZhbHVlXSk7XG4gICAgICByZXR1cm4gcmVuZGVyZWRDaGlsZDtcbiAgICB9XG5cbiAgICBjb25zdCBfQ29ubmVjdCA9IFJlYWN0Lm1lbW8oQ29ubmVjdEZ1bmN0aW9uKTtcblxuICAgIC8vIEFkZCBhIGhhY2t5IGNhc3QgdG8gZ2V0IHRoZSByaWdodCBvdXRwdXQgdHlwZVxuICAgIGNvbnN0IENvbm5lY3QgPSBfQ29ubmVjdDtcbiAgICBDb25uZWN0LldyYXBwZWRDb21wb25lbnQgPSBXcmFwcGVkQ29tcG9uZW50O1xuICAgIENvbm5lY3QuZGlzcGxheU5hbWUgPSBDb25uZWN0RnVuY3Rpb24uZGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTtcblxuICAgIGlmIChmb3J3YXJkUmVmKSB7XG4gICAgICBjb25zdCBfZm9yd2FyZGVkID0gUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiBmb3J3YXJkQ29ubmVjdFJlZihwcm9wcywgcmVmKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbm5lY3QsIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgICAgICAgIHJlYWN0UmVkdXhGb3J3YXJkZWRSZWY6IHJlZlxuICAgICAgICB9KSk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZm9yd2FyZGVkID0gX2ZvcndhcmRlZDtcbiAgICAgIGZvcndhcmRlZC5kaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lO1xuICAgICAgZm9yd2FyZGVkLldyYXBwZWRDb21wb25lbnQgPSBXcmFwcGVkQ29tcG9uZW50O1xuICAgICAgcmV0dXJuIGhvaXN0U3RhdGljcyhmb3J3YXJkZWQsIFdyYXBwZWRDb21wb25lbnQpO1xuICAgIH1cblxuICAgIHJldHVybiBob2lzdFN0YXRpY3MoQ29ubmVjdCwgV3JhcHBlZENvbXBvbmVudCk7XG4gIH07XG5cbiAgcmV0dXJuIHdyYXBXaXRoQ29ubmVjdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdDsiLCJleHBvcnQgZnVuY3Rpb24gY3JlYXRlSW52YWxpZEFyZ0ZhY3RvcnkoYXJnLCBuYW1lKSB7XG4gIHJldHVybiAoZGlzcGF0Y2gsIG9wdGlvbnMpID0+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdmFsdWUgb2YgdHlwZSAke3R5cGVvZiBhcmd9IGZvciAke25hbWV9IGFyZ3VtZW50IHdoZW4gY29ubmVjdGluZyBjb21wb25lbnQgJHtvcHRpb25zLndyYXBwZWRDb21wb25lbnROYW1lfS5gKTtcbiAgfTtcbn0iLCJpbXBvcnQgYmluZEFjdGlvbkNyZWF0b3JzIGZyb20gJy4uL3V0aWxzL2JpbmRBY3Rpb25DcmVhdG9ycyc7XG5pbXBvcnQgeyB3cmFwTWFwVG9Qcm9wc0NvbnN0YW50LCB3cmFwTWFwVG9Qcm9wc0Z1bmMgfSBmcm9tICcuL3dyYXBNYXBUb1Byb3BzJztcbmltcG9ydCB7IGNyZWF0ZUludmFsaWRBcmdGYWN0b3J5IH0gZnJvbSAnLi9pbnZhbGlkQXJnRmFjdG9yeSc7XG5leHBvcnQgZnVuY3Rpb24gbWFwRGlzcGF0Y2hUb1Byb3BzRmFjdG9yeShtYXBEaXNwYXRjaFRvUHJvcHMpIHtcbiAgcmV0dXJuIG1hcERpc3BhdGNoVG9Qcm9wcyAmJiB0eXBlb2YgbWFwRGlzcGF0Y2hUb1Byb3BzID09PSAnb2JqZWN0JyA/IHdyYXBNYXBUb1Byb3BzQ29uc3RhbnQoZGlzcGF0Y2ggPT4gLy8gQHRzLWlnbm9yZVxuICBiaW5kQWN0aW9uQ3JlYXRvcnMobWFwRGlzcGF0Y2hUb1Byb3BzLCBkaXNwYXRjaCkpIDogIW1hcERpc3BhdGNoVG9Qcm9wcyA/IHdyYXBNYXBUb1Byb3BzQ29uc3RhbnQoZGlzcGF0Y2ggPT4gKHtcbiAgICBkaXNwYXRjaFxuICB9KSkgOiB0eXBlb2YgbWFwRGlzcGF0Y2hUb1Byb3BzID09PSAnZnVuY3Rpb24nID8gLy8gQHRzLWlnbm9yZVxuICB3cmFwTWFwVG9Qcm9wc0Z1bmMobWFwRGlzcGF0Y2hUb1Byb3BzLCAnbWFwRGlzcGF0Y2hUb1Byb3BzJykgOiBjcmVhdGVJbnZhbGlkQXJnRmFjdG9yeShtYXBEaXNwYXRjaFRvUHJvcHMsICdtYXBEaXNwYXRjaFRvUHJvcHMnKTtcbn0iLCJpbXBvcnQgeyB3cmFwTWFwVG9Qcm9wc0NvbnN0YW50LCB3cmFwTWFwVG9Qcm9wc0Z1bmMgfSBmcm9tICcuL3dyYXBNYXBUb1Byb3BzJztcbmltcG9ydCB7IGNyZWF0ZUludmFsaWRBcmdGYWN0b3J5IH0gZnJvbSAnLi9pbnZhbGlkQXJnRmFjdG9yeSc7XG5leHBvcnQgZnVuY3Rpb24gbWFwU3RhdGVUb1Byb3BzRmFjdG9yeShtYXBTdGF0ZVRvUHJvcHMpIHtcbiAgcmV0dXJuICFtYXBTdGF0ZVRvUHJvcHMgPyB3cmFwTWFwVG9Qcm9wc0NvbnN0YW50KCgpID0+ICh7fSkpIDogdHlwZW9mIG1hcFN0YXRlVG9Qcm9wcyA9PT0gJ2Z1bmN0aW9uJyA/IC8vIEB0cy1pZ25vcmVcbiAgd3JhcE1hcFRvUHJvcHNGdW5jKG1hcFN0YXRlVG9Qcm9wcywgJ21hcFN0YXRlVG9Qcm9wcycpIDogY3JlYXRlSW52YWxpZEFyZ0ZhY3RvcnkobWFwU3RhdGVUb1Byb3BzLCAnbWFwU3RhdGVUb1Byb3BzJyk7XG59IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgdmVyaWZ5UGxhaW5PYmplY3QgZnJvbSAnLi4vdXRpbHMvdmVyaWZ5UGxhaW5PYmplY3QnO1xuaW1wb3J0IHsgY3JlYXRlSW52YWxpZEFyZ0ZhY3RvcnkgfSBmcm9tICcuL2ludmFsaWRBcmdGYWN0b3J5JztcbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0TWVyZ2VQcm9wcyhzdGF0ZVByb3BzLCBkaXNwYXRjaFByb3BzLCBvd25Qcm9wcykge1xuICAvLyBAdHMtaWdub3JlXG4gIHJldHVybiBfZXh0ZW5kcyh7fSwgb3duUHJvcHMsIHN0YXRlUHJvcHMsIGRpc3BhdGNoUHJvcHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHdyYXBNZXJnZVByb3BzRnVuYyhtZXJnZVByb3BzKSB7XG4gIHJldHVybiBmdW5jdGlvbiBpbml0TWVyZ2VQcm9wc1Byb3h5KGRpc3BhdGNoLCB7XG4gICAgZGlzcGxheU5hbWUsXG4gICAgYXJlTWVyZ2VkUHJvcHNFcXVhbFxuICB9KSB7XG4gICAgbGV0IGhhc1J1bk9uY2UgPSBmYWxzZTtcbiAgICBsZXQgbWVyZ2VkUHJvcHM7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIG1lcmdlUHJvcHNQcm94eShzdGF0ZVByb3BzLCBkaXNwYXRjaFByb3BzLCBvd25Qcm9wcykge1xuICAgICAgY29uc3QgbmV4dE1lcmdlZFByb3BzID0gbWVyZ2VQcm9wcyhzdGF0ZVByb3BzLCBkaXNwYXRjaFByb3BzLCBvd25Qcm9wcyk7XG5cbiAgICAgIGlmIChoYXNSdW5PbmNlKSB7XG4gICAgICAgIGlmICghYXJlTWVyZ2VkUHJvcHNFcXVhbChuZXh0TWVyZ2VkUHJvcHMsIG1lcmdlZFByb3BzKSkgbWVyZ2VkUHJvcHMgPSBuZXh0TWVyZ2VkUHJvcHM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoYXNSdW5PbmNlID0gdHJ1ZTtcbiAgICAgICAgbWVyZ2VkUHJvcHMgPSBuZXh0TWVyZ2VkUHJvcHM7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB2ZXJpZnlQbGFpbk9iamVjdChtZXJnZWRQcm9wcywgZGlzcGxheU5hbWUsICdtZXJnZVByb3BzJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBtZXJnZWRQcm9wcztcbiAgICB9O1xuICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlUHJvcHNGYWN0b3J5KG1lcmdlUHJvcHMpIHtcbiAgcmV0dXJuICFtZXJnZVByb3BzID8gKCkgPT4gZGVmYXVsdE1lcmdlUHJvcHMgOiB0eXBlb2YgbWVyZ2VQcm9wcyA9PT0gJ2Z1bmN0aW9uJyA/IHdyYXBNZXJnZVByb3BzRnVuYyhtZXJnZVByb3BzKSA6IGNyZWF0ZUludmFsaWRBcmdGYWN0b3J5KG1lcmdlUHJvcHMsICdtZXJnZVByb3BzJyk7XG59IiwiaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlXCI7XG5jb25zdCBfZXhjbHVkZWQgPSBbXCJpbml0TWFwU3RhdGVUb1Byb3BzXCIsIFwiaW5pdE1hcERpc3BhdGNoVG9Qcm9wc1wiLCBcImluaXRNZXJnZVByb3BzXCJdO1xuaW1wb3J0IHZlcmlmeVN1YnNlbGVjdG9ycyBmcm9tICcuL3ZlcmlmeVN1YnNlbGVjdG9ycyc7XG5leHBvcnQgZnVuY3Rpb24gcHVyZUZpbmFsUHJvcHNTZWxlY3RvckZhY3RvcnkobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMsIG1lcmdlUHJvcHMsIGRpc3BhdGNoLCB7XG4gIGFyZVN0YXRlc0VxdWFsLFxuICBhcmVPd25Qcm9wc0VxdWFsLFxuICBhcmVTdGF0ZVByb3BzRXF1YWxcbn0pIHtcbiAgbGV0IGhhc1J1bkF0TGVhc3RPbmNlID0gZmFsc2U7XG4gIGxldCBzdGF0ZTtcbiAgbGV0IG93blByb3BzO1xuICBsZXQgc3RhdGVQcm9wcztcbiAgbGV0IGRpc3BhdGNoUHJvcHM7XG4gIGxldCBtZXJnZWRQcm9wcztcblxuICBmdW5jdGlvbiBoYW5kbGVGaXJzdENhbGwoZmlyc3RTdGF0ZSwgZmlyc3RPd25Qcm9wcykge1xuICAgIHN0YXRlID0gZmlyc3RTdGF0ZTtcbiAgICBvd25Qcm9wcyA9IGZpcnN0T3duUHJvcHM7XG4gICAgc3RhdGVQcm9wcyA9IG1hcFN0YXRlVG9Qcm9wcyhzdGF0ZSwgb3duUHJvcHMpO1xuICAgIGRpc3BhdGNoUHJvcHMgPSBtYXBEaXNwYXRjaFRvUHJvcHMoZGlzcGF0Y2gsIG93blByb3BzKTtcbiAgICBtZXJnZWRQcm9wcyA9IG1lcmdlUHJvcHMoc3RhdGVQcm9wcywgZGlzcGF0Y2hQcm9wcywgb3duUHJvcHMpO1xuICAgIGhhc1J1bkF0TGVhc3RPbmNlID0gdHJ1ZTtcbiAgICByZXR1cm4gbWVyZ2VkUHJvcHM7XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVOZXdQcm9wc0FuZE5ld1N0YXRlKCkge1xuICAgIHN0YXRlUHJvcHMgPSBtYXBTdGF0ZVRvUHJvcHMoc3RhdGUsIG93blByb3BzKTtcbiAgICBpZiAobWFwRGlzcGF0Y2hUb1Byb3BzLmRlcGVuZHNPbk93blByb3BzKSBkaXNwYXRjaFByb3BzID0gbWFwRGlzcGF0Y2hUb1Byb3BzKGRpc3BhdGNoLCBvd25Qcm9wcyk7XG4gICAgbWVyZ2VkUHJvcHMgPSBtZXJnZVByb3BzKHN0YXRlUHJvcHMsIGRpc3BhdGNoUHJvcHMsIG93blByb3BzKTtcbiAgICByZXR1cm4gbWVyZ2VkUHJvcHM7XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVOZXdQcm9wcygpIHtcbiAgICBpZiAobWFwU3RhdGVUb1Byb3BzLmRlcGVuZHNPbk93blByb3BzKSBzdGF0ZVByb3BzID0gbWFwU3RhdGVUb1Byb3BzKHN0YXRlLCBvd25Qcm9wcyk7XG4gICAgaWYgKG1hcERpc3BhdGNoVG9Qcm9wcy5kZXBlbmRzT25Pd25Qcm9wcykgZGlzcGF0Y2hQcm9wcyA9IG1hcERpc3BhdGNoVG9Qcm9wcyhkaXNwYXRjaCwgb3duUHJvcHMpO1xuICAgIG1lcmdlZFByb3BzID0gbWVyZ2VQcm9wcyhzdGF0ZVByb3BzLCBkaXNwYXRjaFByb3BzLCBvd25Qcm9wcyk7XG4gICAgcmV0dXJuIG1lcmdlZFByb3BzO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlTmV3U3RhdGUoKSB7XG4gICAgY29uc3QgbmV4dFN0YXRlUHJvcHMgPSBtYXBTdGF0ZVRvUHJvcHMoc3RhdGUsIG93blByb3BzKTtcbiAgICBjb25zdCBzdGF0ZVByb3BzQ2hhbmdlZCA9ICFhcmVTdGF0ZVByb3BzRXF1YWwobmV4dFN0YXRlUHJvcHMsIHN0YXRlUHJvcHMpO1xuICAgIHN0YXRlUHJvcHMgPSBuZXh0U3RhdGVQcm9wcztcbiAgICBpZiAoc3RhdGVQcm9wc0NoYW5nZWQpIG1lcmdlZFByb3BzID0gbWVyZ2VQcm9wcyhzdGF0ZVByb3BzLCBkaXNwYXRjaFByb3BzLCBvd25Qcm9wcyk7XG4gICAgcmV0dXJuIG1lcmdlZFByb3BzO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlU3Vic2VxdWVudENhbGxzKG5leHRTdGF0ZSwgbmV4dE93blByb3BzKSB7XG4gICAgY29uc3QgcHJvcHNDaGFuZ2VkID0gIWFyZU93blByb3BzRXF1YWwobmV4dE93blByb3BzLCBvd25Qcm9wcyk7XG4gICAgY29uc3Qgc3RhdGVDaGFuZ2VkID0gIWFyZVN0YXRlc0VxdWFsKG5leHRTdGF0ZSwgc3RhdGUsIG5leHRPd25Qcm9wcywgb3duUHJvcHMpO1xuICAgIHN0YXRlID0gbmV4dFN0YXRlO1xuICAgIG93blByb3BzID0gbmV4dE93blByb3BzO1xuICAgIGlmIChwcm9wc0NoYW5nZWQgJiYgc3RhdGVDaGFuZ2VkKSByZXR1cm4gaGFuZGxlTmV3UHJvcHNBbmROZXdTdGF0ZSgpO1xuICAgIGlmIChwcm9wc0NoYW5nZWQpIHJldHVybiBoYW5kbGVOZXdQcm9wcygpO1xuICAgIGlmIChzdGF0ZUNoYW5nZWQpIHJldHVybiBoYW5kbGVOZXdTdGF0ZSgpO1xuICAgIHJldHVybiBtZXJnZWRQcm9wcztcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiBwdXJlRmluYWxQcm9wc1NlbGVjdG9yKG5leHRTdGF0ZSwgbmV4dE93blByb3BzKSB7XG4gICAgcmV0dXJuIGhhc1J1bkF0TGVhc3RPbmNlID8gaGFuZGxlU3Vic2VxdWVudENhbGxzKG5leHRTdGF0ZSwgbmV4dE93blByb3BzKSA6IGhhbmRsZUZpcnN0Q2FsbChuZXh0U3RhdGUsIG5leHRPd25Qcm9wcyk7XG4gIH07XG59XG4vLyBUT0RPOiBBZGQgbW9yZSBjb21tZW50c1xuLy8gVGhlIHNlbGVjdG9yIHJldHVybmVkIGJ5IHNlbGVjdG9yRmFjdG9yeSB3aWxsIG1lbW9pemUgaXRzIHJlc3VsdHMsXG4vLyBhbGxvd2luZyBjb25uZWN0J3Mgc2hvdWxkQ29tcG9uZW50VXBkYXRlIHRvIHJldHVybiBmYWxzZSBpZiBmaW5hbFxuLy8gcHJvcHMgaGF2ZSBub3QgY2hhbmdlZC5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGZpbmFsUHJvcHNTZWxlY3RvckZhY3RvcnkoZGlzcGF0Y2gsIF9yZWYpIHtcbiAgbGV0IHtcbiAgICBpbml0TWFwU3RhdGVUb1Byb3BzLFxuICAgIGluaXRNYXBEaXNwYXRjaFRvUHJvcHMsXG4gICAgaW5pdE1lcmdlUHJvcHNcbiAgfSA9IF9yZWYsXG4gICAgICBvcHRpb25zID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UoX3JlZiwgX2V4Y2x1ZGVkKTtcblxuICBjb25zdCBtYXBTdGF0ZVRvUHJvcHMgPSBpbml0TWFwU3RhdGVUb1Byb3BzKGRpc3BhdGNoLCBvcHRpb25zKTtcbiAgY29uc3QgbWFwRGlzcGF0Y2hUb1Byb3BzID0gaW5pdE1hcERpc3BhdGNoVG9Qcm9wcyhkaXNwYXRjaCwgb3B0aW9ucyk7XG4gIGNvbnN0IG1lcmdlUHJvcHMgPSBpbml0TWVyZ2VQcm9wcyhkaXNwYXRjaCwgb3B0aW9ucyk7XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB2ZXJpZnlTdWJzZWxlY3RvcnMobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMsIG1lcmdlUHJvcHMpO1xuICB9XG5cbiAgcmV0dXJuIHB1cmVGaW5hbFByb3BzU2VsZWN0b3JGYWN0b3J5KG1hcFN0YXRlVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzLCBtZXJnZVByb3BzLCBkaXNwYXRjaCwgb3B0aW9ucyk7XG59IiwiaW1wb3J0IHdhcm5pbmcgZnJvbSAnLi4vdXRpbHMvd2FybmluZyc7XG5cbmZ1bmN0aW9uIHZlcmlmeShzZWxlY3RvciwgbWV0aG9kTmFtZSkge1xuICBpZiAoIXNlbGVjdG9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIHZhbHVlIGZvciAke21ldGhvZE5hbWV9IGluIGNvbm5lY3QuYCk7XG4gIH0gZWxzZSBpZiAobWV0aG9kTmFtZSA9PT0gJ21hcFN0YXRlVG9Qcm9wcycgfHwgbWV0aG9kTmFtZSA9PT0gJ21hcERpc3BhdGNoVG9Qcm9wcycpIHtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZWxlY3RvciwgJ2RlcGVuZHNPbk93blByb3BzJykpIHtcbiAgICAgIHdhcm5pbmcoYFRoZSBzZWxlY3RvciBmb3IgJHttZXRob2ROYW1lfSBvZiBjb25uZWN0IGRpZCBub3Qgc3BlY2lmeSBhIHZhbHVlIGZvciBkZXBlbmRzT25Pd25Qcm9wcy5gKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmVyaWZ5U3Vic2VsZWN0b3JzKG1hcFN0YXRlVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzLCBtZXJnZVByb3BzKSB7XG4gIHZlcmlmeShtYXBTdGF0ZVRvUHJvcHMsICdtYXBTdGF0ZVRvUHJvcHMnKTtcbiAgdmVyaWZ5KG1hcERpc3BhdGNoVG9Qcm9wcywgJ21hcERpc3BhdGNoVG9Qcm9wcycpO1xuICB2ZXJpZnkobWVyZ2VQcm9wcywgJ21lcmdlUHJvcHMnKTtcbn0iLCJpbXBvcnQgdmVyaWZ5UGxhaW5PYmplY3QgZnJvbSAnLi4vdXRpbHMvdmVyaWZ5UGxhaW5PYmplY3QnO1xuZXhwb3J0IGZ1bmN0aW9uIHdyYXBNYXBUb1Byb3BzQ29uc3RhbnQoIC8vICogTm90ZTpcbi8vICBJdCBzZWVtcyB0aGF0IHRoZSBkaXNwYXRjaCBhcmd1bWVudFxuLy8gIGNvdWxkIGJlIGEgZGlzcGF0Y2ggZnVuY3Rpb24gaW4gc29tZSBjYXNlcyAoZXg6IHdoZW5NYXBEaXNwYXRjaFRvUHJvcHNJc01pc3NpbmcpXG4vLyAgYW5kIGEgc3RhdGUgb2JqZWN0IGluIHNvbWUgb3RoZXJzIChleDogd2hlbk1hcFN0YXRlVG9Qcm9wc0lzTWlzc2luZylcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuZ2V0Q29uc3RhbnQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGluaXRDb25zdGFudFNlbGVjdG9yKGRpc3BhdGNoKSB7XG4gICAgY29uc3QgY29uc3RhbnQgPSBnZXRDb25zdGFudChkaXNwYXRjaCk7XG5cbiAgICBmdW5jdGlvbiBjb25zdGFudFNlbGVjdG9yKCkge1xuICAgICAgcmV0dXJuIGNvbnN0YW50O1xuICAgIH1cblxuICAgIGNvbnN0YW50U2VsZWN0b3IuZGVwZW5kc09uT3duUHJvcHMgPSBmYWxzZTtcbiAgICByZXR1cm4gY29uc3RhbnRTZWxlY3RvcjtcbiAgfTtcbn0gLy8gZGVwZW5kc09uT3duUHJvcHMgaXMgdXNlZCBieSBjcmVhdGVNYXBUb1Byb3BzUHJveHkgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gcGFzcyBwcm9wcyBhcyBhcmdzXG4vLyB0byB0aGUgbWFwVG9Qcm9wcyBmdW5jdGlvbiBiZWluZyB3cmFwcGVkLiBJdCBpcyBhbHNvIHVzZWQgYnkgbWFrZVB1cmVQcm9wc1NlbGVjdG9yIHRvIGRldGVybWluZVxuLy8gd2hldGhlciBtYXBUb1Byb3BzIG5lZWRzIHRvIGJlIGludm9rZWQgd2hlbiBwcm9wcyBoYXZlIGNoYW5nZWQuXG4vL1xuLy8gQSBsZW5ndGggb2Ygb25lIHNpZ25hbHMgdGhhdCBtYXBUb1Byb3BzIGRvZXMgbm90IGRlcGVuZCBvbiBwcm9wcyBmcm9tIHRoZSBwYXJlbnQgY29tcG9uZW50LlxuLy8gQSBsZW5ndGggb2YgemVybyBpcyBhc3N1bWVkIHRvIG1lYW4gbWFwVG9Qcm9wcyBpcyBnZXR0aW5nIGFyZ3MgdmlhIGFyZ3VtZW50cyBvciAuLi5hcmdzIGFuZFxuLy8gdGhlcmVmb3JlIG5vdCByZXBvcnRpbmcgaXRzIGxlbmd0aCBhY2N1cmF0ZWx5Li5cbi8vIFRPRE8gQ2FuIHRoaXMgZ2V0IHB1bGxlZCBvdXQgc28gdGhhdCB3ZSBjYW4gc3Vic2NyaWJlIGRpcmVjdGx5IHRvIHRoZSBzdG9yZSBpZiB3ZSBkb24ndCBuZWVkIG93blByb3BzP1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVwZW5kc09uT3duUHJvcHMobWFwVG9Qcm9wcykge1xuICByZXR1cm4gbWFwVG9Qcm9wcy5kZXBlbmRzT25Pd25Qcm9wcyA/IEJvb2xlYW4obWFwVG9Qcm9wcy5kZXBlbmRzT25Pd25Qcm9wcykgOiBtYXBUb1Byb3BzLmxlbmd0aCAhPT0gMTtcbn0gLy8gVXNlZCBieSB3aGVuTWFwU3RhdGVUb1Byb3BzSXNGdW5jdGlvbiBhbmQgd2hlbk1hcERpc3BhdGNoVG9Qcm9wc0lzRnVuY3Rpb24sXG4vLyB0aGlzIGZ1bmN0aW9uIHdyYXBzIG1hcFRvUHJvcHMgaW4gYSBwcm94eSBmdW5jdGlvbiB3aGljaCBkb2VzIHNldmVyYWwgdGhpbmdzOlxuLy9cbi8vICAqIERldGVjdHMgd2hldGhlciB0aGUgbWFwVG9Qcm9wcyBmdW5jdGlvbiBiZWluZyBjYWxsZWQgZGVwZW5kcyBvbiBwcm9wcywgd2hpY2hcbi8vICAgIGlzIHVzZWQgYnkgc2VsZWN0b3JGYWN0b3J5IHRvIGRlY2lkZSBpZiBpdCBzaG91bGQgcmVpbnZva2Ugb24gcHJvcHMgY2hhbmdlcy5cbi8vXG4vLyAgKiBPbiBmaXJzdCBjYWxsLCBoYW5kbGVzIG1hcFRvUHJvcHMgaWYgcmV0dXJucyBhbm90aGVyIGZ1bmN0aW9uLCBhbmQgdHJlYXRzIHRoYXRcbi8vICAgIG5ldyBmdW5jdGlvbiBhcyB0aGUgdHJ1ZSBtYXBUb1Byb3BzIGZvciBzdWJzZXF1ZW50IGNhbGxzLlxuLy9cbi8vICAqIE9uIGZpcnN0IGNhbGwsIHZlcmlmaWVzIHRoZSBmaXJzdCByZXN1bHQgaXMgYSBwbGFpbiBvYmplY3QsIGluIG9yZGVyIHRvIHdhcm5cbi8vICAgIHRoZSBkZXZlbG9wZXIgdGhhdCB0aGVpciBtYXBUb1Byb3BzIGZ1bmN0aW9uIGlzIG5vdCByZXR1cm5pbmcgYSB2YWxpZCByZXN1bHQuXG4vL1xuXG5leHBvcnQgZnVuY3Rpb24gd3JhcE1hcFRvUHJvcHNGdW5jKG1hcFRvUHJvcHMsIG1ldGhvZE5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGluaXRQcm94eVNlbGVjdG9yKGRpc3BhdGNoLCB7XG4gICAgZGlzcGxheU5hbWVcbiAgfSkge1xuICAgIGNvbnN0IHByb3h5ID0gZnVuY3Rpb24gbWFwVG9Qcm9wc1Byb3h5KHN0YXRlT3JEaXNwYXRjaCwgb3duUHJvcHMpIHtcbiAgICAgIHJldHVybiBwcm94eS5kZXBlbmRzT25Pd25Qcm9wcyA/IHByb3h5Lm1hcFRvUHJvcHMoc3RhdGVPckRpc3BhdGNoLCBvd25Qcm9wcykgOiBwcm94eS5tYXBUb1Byb3BzKHN0YXRlT3JEaXNwYXRjaCwgdW5kZWZpbmVkKTtcbiAgICB9OyAvLyBhbGxvdyBkZXRlY3RGYWN0b3J5QW5kVmVyaWZ5IHRvIGdldCBvd25Qcm9wc1xuXG5cbiAgICBwcm94eS5kZXBlbmRzT25Pd25Qcm9wcyA9IHRydWU7XG5cbiAgICBwcm94eS5tYXBUb1Byb3BzID0gZnVuY3Rpb24gZGV0ZWN0RmFjdG9yeUFuZFZlcmlmeShzdGF0ZU9yRGlzcGF0Y2gsIG93blByb3BzKSB7XG4gICAgICBwcm94eS5tYXBUb1Byb3BzID0gbWFwVG9Qcm9wcztcbiAgICAgIHByb3h5LmRlcGVuZHNPbk93blByb3BzID0gZ2V0RGVwZW5kc09uT3duUHJvcHMobWFwVG9Qcm9wcyk7XG4gICAgICBsZXQgcHJvcHMgPSBwcm94eShzdGF0ZU9yRGlzcGF0Y2gsIG93blByb3BzKTtcblxuICAgICAgaWYgKHR5cGVvZiBwcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBwcm94eS5tYXBUb1Byb3BzID0gcHJvcHM7XG4gICAgICAgIHByb3h5LmRlcGVuZHNPbk93blByb3BzID0gZ2V0RGVwZW5kc09uT3duUHJvcHMocHJvcHMpO1xuICAgICAgICBwcm9wcyA9IHByb3h5KHN0YXRlT3JEaXNwYXRjaCwgb3duUHJvcHMpO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgdmVyaWZ5UGxhaW5PYmplY3QocHJvcHMsIGRpc3BsYXlOYW1lLCBtZXRob2ROYW1lKTtcbiAgICAgIHJldHVybiBwcm9wcztcbiAgICB9O1xuXG4gICAgcmV0dXJuIHByb3h5O1xuICB9O1xufSIsImltcG9ydCBQcm92aWRlciBmcm9tICcuL2NvbXBvbmVudHMvUHJvdmlkZXInO1xuaW1wb3J0IGNvbm5lY3QgZnJvbSAnLi9jb21wb25lbnRzL2Nvbm5lY3QnO1xuaW1wb3J0IHsgUmVhY3RSZWR1eENvbnRleHQgfSBmcm9tICcuL2NvbXBvbmVudHMvQ29udGV4dCc7XG5pbXBvcnQgeyB1c2VEaXNwYXRjaCwgY3JlYXRlRGlzcGF0Y2hIb29rIH0gZnJvbSAnLi9ob29rcy91c2VEaXNwYXRjaCc7XG5pbXBvcnQgeyB1c2VTZWxlY3RvciwgY3JlYXRlU2VsZWN0b3JIb29rIH0gZnJvbSAnLi9ob29rcy91c2VTZWxlY3Rvcic7XG5pbXBvcnQgeyB1c2VTdG9yZSwgY3JlYXRlU3RvcmVIb29rIH0gZnJvbSAnLi9ob29rcy91c2VTdG9yZSc7XG5pbXBvcnQgc2hhbGxvd0VxdWFsIGZyb20gJy4vdXRpbHMvc2hhbGxvd0VxdWFsJztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMnO1xuZXhwb3J0IHsgUHJvdmlkZXIsIFJlYWN0UmVkdXhDb250ZXh0LCBjb25uZWN0LCB1c2VEaXNwYXRjaCwgY3JlYXRlRGlzcGF0Y2hIb29rLCB1c2VTZWxlY3RvciwgY3JlYXRlU2VsZWN0b3JIb29rLCB1c2VTdG9yZSwgY3JlYXRlU3RvcmVIb29rLCBzaGFsbG93RXF1YWwgfTsiLCJpbXBvcnQgeyBSZWFjdFJlZHV4Q29udGV4dCB9IGZyb20gJy4uL2NvbXBvbmVudHMvQ29udGV4dCc7XG5pbXBvcnQgeyB1c2VTdG9yZSBhcyB1c2VEZWZhdWx0U3RvcmUsIGNyZWF0ZVN0b3JlSG9vayB9IGZyb20gJy4vdXNlU3RvcmUnO1xuLyoqXHJcbiAqIEhvb2sgZmFjdG9yeSwgd2hpY2ggY3JlYXRlcyBhIGB1c2VEaXNwYXRjaGAgaG9vayBib3VuZCB0byBhIGdpdmVuIGNvbnRleHQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhY3QuQ29udGV4dH0gW2NvbnRleHQ9UmVhY3RSZWR1eENvbnRleHRdIENvbnRleHQgcGFzc2VkIHRvIHlvdXIgYDxQcm92aWRlcj5gLlxyXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IEEgYHVzZURpc3BhdGNoYCBob29rIGJvdW5kIHRvIHRoZSBzcGVjaWZpZWQgY29udGV4dC5cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEaXNwYXRjaEhvb2soY29udGV4dCA9IFJlYWN0UmVkdXhDb250ZXh0KSB7XG4gIGNvbnN0IHVzZVN0b3JlID0gLy8gQHRzLWlnbm9yZVxuICBjb250ZXh0ID09PSBSZWFjdFJlZHV4Q29udGV4dCA/IHVzZURlZmF1bHRTdG9yZSA6IGNyZWF0ZVN0b3JlSG9vayhjb250ZXh0KTtcbiAgcmV0dXJuIGZ1bmN0aW9uIHVzZURpc3BhdGNoKCkge1xuICAgIGNvbnN0IHN0b3JlID0gdXNlU3RvcmUoKTsgLy8gQHRzLWlnbm9yZVxuXG4gICAgcmV0dXJuIHN0b3JlLmRpc3BhdGNoO1xuICB9O1xufVxuLyoqXHJcbiAqIEEgaG9vayB0byBhY2Nlc3MgdGhlIHJlZHV4IGBkaXNwYXRjaGAgZnVuY3Rpb24uXHJcbiAqXHJcbiAqIEByZXR1cm5zIHthbnl8ZnVuY3Rpb259IHJlZHV4IHN0b3JlJ3MgYGRpc3BhdGNoYCBmdW5jdGlvblxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKlxyXG4gKiBpbXBvcnQgUmVhY3QsIHsgdXNlQ2FsbGJhY2sgfSBmcm9tICdyZWFjdCdcclxuICogaW1wb3J0IHsgdXNlRGlzcGF0Y2ggfSBmcm9tICdyZWFjdC1yZWR1eCdcclxuICpcclxuICogZXhwb3J0IGNvbnN0IENvdW50ZXJDb21wb25lbnQgPSAoeyB2YWx1ZSB9KSA9PiB7XHJcbiAqICAgY29uc3QgZGlzcGF0Y2ggPSB1c2VEaXNwYXRjaCgpXHJcbiAqICAgY29uc3QgaW5jcmVhc2VDb3VudGVyID0gdXNlQ2FsbGJhY2soKCkgPT4gZGlzcGF0Y2goeyB0eXBlOiAnaW5jcmVhc2UtY291bnRlcicgfSksIFtdKVxyXG4gKiAgIHJldHVybiAoXHJcbiAqICAgICA8ZGl2PlxyXG4gKiAgICAgICA8c3Bhbj57dmFsdWV9PC9zcGFuPlxyXG4gKiAgICAgICA8YnV0dG9uIG9uQ2xpY2s9e2luY3JlYXNlQ291bnRlcn0+SW5jcmVhc2UgY291bnRlcjwvYnV0dG9uPlxyXG4gKiAgICAgPC9kaXY+XHJcbiAqICAgKVxyXG4gKiB9XHJcbiAqL1xuXG5leHBvcnQgY29uc3QgdXNlRGlzcGF0Y2ggPSAvKiNfX1BVUkVfXyovY3JlYXRlRGlzcGF0Y2hIb29rKCk7IiwiaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFJlYWN0UmVkdXhDb250ZXh0IH0gZnJvbSAnLi4vY29tcG9uZW50cy9Db250ZXh0JztcblxuLyoqXHJcbiAqIEhvb2sgZmFjdG9yeSwgd2hpY2ggY3JlYXRlcyBhIGB1c2VSZWR1eENvbnRleHRgIGhvb2sgYm91bmQgdG8gYSBnaXZlbiBjb250ZXh0LiBUaGlzIGlzIGEgbG93LWxldmVsXHJcbiAqIGhvb2sgdGhhdCB5b3Ugc2hvdWxkIHVzdWFsbHkgbm90IG5lZWQgdG8gY2FsbCBkaXJlY3RseS5cclxuICpcclxuICogQHBhcmFtIHtSZWFjdC5Db250ZXh0fSBbY29udGV4dD1SZWFjdFJlZHV4Q29udGV4dF0gQ29udGV4dCBwYXNzZWQgdG8geW91ciBgPFByb3ZpZGVyPmAuXHJcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSBgdXNlUmVkdXhDb250ZXh0YCBob29rIGJvdW5kIHRvIHRoZSBzcGVjaWZpZWQgY29udGV4dC5cclxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVkdXhDb250ZXh0SG9vayhjb250ZXh0ID0gUmVhY3RSZWR1eENvbnRleHQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHVzZVJlZHV4Q29udGV4dCgpIHtcbiAgICBjb25zdCBjb250ZXh0VmFsdWUgPSB1c2VDb250ZXh0KGNvbnRleHQpO1xuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgIWNvbnRleHRWYWx1ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgZmluZCByZWFjdC1yZWR1eCBjb250ZXh0IHZhbHVlOyBwbGVhc2UgZW5zdXJlIHRoZSBjb21wb25lbnQgaXMgd3JhcHBlZCBpbiBhIDxQcm92aWRlcj4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29udGV4dFZhbHVlO1xuICB9O1xufVxuLyoqXHJcbiAqIEEgaG9vayB0byBhY2Nlc3MgdGhlIHZhbHVlIG9mIHRoZSBgUmVhY3RSZWR1eENvbnRleHRgLiBUaGlzIGlzIGEgbG93LWxldmVsXHJcbiAqIGhvb2sgdGhhdCB5b3Ugc2hvdWxkIHVzdWFsbHkgbm90IG5lZWQgdG8gY2FsbCBkaXJlY3RseS5cclxuICpcclxuICogQHJldHVybnMge2FueX0gdGhlIHZhbHVlIG9mIHRoZSBgUmVhY3RSZWR1eENvbnRleHRgXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqXHJcbiAqIGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcclxuICogaW1wb3J0IHsgdXNlUmVkdXhDb250ZXh0IH0gZnJvbSAncmVhY3QtcmVkdXgnXHJcbiAqXHJcbiAqIGV4cG9ydCBjb25zdCBDb3VudGVyQ29tcG9uZW50ID0gKCkgPT4ge1xyXG4gKiAgIGNvbnN0IHsgc3RvcmUgfSA9IHVzZVJlZHV4Q29udGV4dCgpXHJcbiAqICAgcmV0dXJuIDxkaXY+e3N0b3JlLmdldFN0YXRlKCl9PC9kaXY+XHJcbiAqIH1cclxuICovXG5cbmV4cG9ydCBjb25zdCB1c2VSZWR1eENvbnRleHQgPSAvKiNfX1BVUkVfXyovY3JlYXRlUmVkdXhDb250ZXh0SG9vaygpOyIsImltcG9ydCB7IHVzZUNhbGxiYWNrLCB1c2VEZWJ1Z1ZhbHVlLCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjcmVhdGVSZWR1eENvbnRleHRIb29rLCB1c2VSZWR1eENvbnRleHQgYXMgdXNlRGVmYXVsdFJlZHV4Q29udGV4dCB9IGZyb20gJy4vdXNlUmVkdXhDb250ZXh0JztcbmltcG9ydCB7IFJlYWN0UmVkdXhDb250ZXh0IH0gZnJvbSAnLi4vY29tcG9uZW50cy9Db250ZXh0JztcbmltcG9ydCB7IG5vdEluaXRpYWxpemVkIH0gZnJvbSAnLi4vdXRpbHMvdXNlU3luY0V4dGVybmFsU3RvcmUnO1xubGV0IHVzZVN5bmNFeHRlcm5hbFN0b3JlV2l0aFNlbGVjdG9yID0gbm90SW5pdGlhbGl6ZWQ7XG5leHBvcnQgY29uc3QgaW5pdGlhbGl6ZVVzZVNlbGVjdG9yID0gZm4gPT4ge1xuICB1c2VTeW5jRXh0ZXJuYWxTdG9yZVdpdGhTZWxlY3RvciA9IGZuO1xufTtcblxuY29uc3QgcmVmRXF1YWxpdHkgPSAoYSwgYikgPT4gYSA9PT0gYjtcbi8qKlxyXG4gKiBIb29rIGZhY3RvcnksIHdoaWNoIGNyZWF0ZXMgYSBgdXNlU2VsZWN0b3JgIGhvb2sgYm91bmQgdG8gYSBnaXZlbiBjb250ZXh0LlxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWN0LkNvbnRleHR9IFtjb250ZXh0PVJlYWN0UmVkdXhDb250ZXh0XSBDb250ZXh0IHBhc3NlZCB0byB5b3VyIGA8UHJvdmlkZXI+YC5cclxuICogQHJldHVybnMge0Z1bmN0aW9ufSBBIGB1c2VTZWxlY3RvcmAgaG9vayBib3VuZCB0byB0aGUgc3BlY2lmaWVkIGNvbnRleHQuXHJcbiAqL1xuXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTZWxlY3Rvckhvb2soY29udGV4dCA9IFJlYWN0UmVkdXhDb250ZXh0KSB7XG4gIGNvbnN0IHVzZVJlZHV4Q29udGV4dCA9IGNvbnRleHQgPT09IFJlYWN0UmVkdXhDb250ZXh0ID8gdXNlRGVmYXVsdFJlZHV4Q29udGV4dCA6IGNyZWF0ZVJlZHV4Q29udGV4dEhvb2soY29udGV4dCk7XG4gIHJldHVybiBmdW5jdGlvbiB1c2VTZWxlY3RvcihzZWxlY3RvciwgZXF1YWxpdHlGbk9yT3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3Qge1xuICAgICAgZXF1YWxpdHlGbiA9IHJlZkVxdWFsaXR5LFxuICAgICAgc3RhYmlsaXR5Q2hlY2sgPSB1bmRlZmluZWQsXG4gICAgICBub29wQ2hlY2sgPSB1bmRlZmluZWRcbiAgICB9ID0gdHlwZW9mIGVxdWFsaXR5Rm5Pck9wdGlvbnMgPT09ICdmdW5jdGlvbicgPyB7XG4gICAgICBlcXVhbGl0eUZuOiBlcXVhbGl0eUZuT3JPcHRpb25zXG4gICAgfSA6IGVxdWFsaXR5Rm5Pck9wdGlvbnM7XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaWYgKCFzZWxlY3Rvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFlvdSBtdXN0IHBhc3MgYSBzZWxlY3RvciB0byB1c2VTZWxlY3RvcmApO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHNlbGVjdG9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWW91IG11c3QgcGFzcyBhIGZ1bmN0aW9uIGFzIGEgc2VsZWN0b3IgdG8gdXNlU2VsZWN0b3JgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBlcXVhbGl0eUZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWW91IG11c3QgcGFzcyBhIGZ1bmN0aW9uIGFzIGFuIGVxdWFsaXR5IGZ1bmN0aW9uIHRvIHVzZVNlbGVjdG9yYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qge1xuICAgICAgc3RvcmUsXG4gICAgICBzdWJzY3JpcHRpb24sXG4gICAgICBnZXRTZXJ2ZXJTdGF0ZSxcbiAgICAgIHN0YWJpbGl0eUNoZWNrOiBnbG9iYWxTdGFiaWxpdHlDaGVjayxcbiAgICAgIG5vb3BDaGVjazogZ2xvYmFsTm9vcENoZWNrXG4gICAgfSA9IHVzZVJlZHV4Q29udGV4dCgpO1xuICAgIGNvbnN0IGZpcnN0UnVuID0gdXNlUmVmKHRydWUpO1xuICAgIGNvbnN0IHdyYXBwZWRTZWxlY3RvciA9IHVzZUNhbGxiYWNrKHtcbiAgICAgIFtzZWxlY3Rvci5uYW1lXShzdGF0ZSkge1xuICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHNlbGVjdG9yKHN0YXRlKTtcblxuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgIGNvbnN0IGZpbmFsU3RhYmlsaXR5Q2hlY2sgPSB0eXBlb2Ygc3RhYmlsaXR5Q2hlY2sgPT09ICd1bmRlZmluZWQnID8gZ2xvYmFsU3RhYmlsaXR5Q2hlY2sgOiBzdGFiaWxpdHlDaGVjaztcblxuICAgICAgICAgIGlmIChmaW5hbFN0YWJpbGl0eUNoZWNrID09PSAnYWx3YXlzJyB8fCBmaW5hbFN0YWJpbGl0eUNoZWNrID09PSAnb25jZScgJiYgZmlyc3RSdW4uY3VycmVudCkge1xuICAgICAgICAgICAgY29uc3QgdG9Db21wYXJlID0gc2VsZWN0b3Ioc3RhdGUpO1xuXG4gICAgICAgICAgICBpZiAoIWVxdWFsaXR5Rm4oc2VsZWN0ZWQsIHRvQ29tcGFyZSkpIHtcbiAgICAgICAgICAgICAgbGV0IHN0YWNrID0gdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICA7XG4gICAgICAgICAgICAgICAgKHtcbiAgICAgICAgICAgICAgICAgIHN0YWNrXG4gICAgICAgICAgICAgICAgfSA9IGUpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdTZWxlY3RvciAnICsgKHNlbGVjdG9yLm5hbWUgfHwgJ3Vua25vd24nKSArICcgcmV0dXJuZWQgYSBkaWZmZXJlbnQgcmVzdWx0IHdoZW4gY2FsbGVkIHdpdGggdGhlIHNhbWUgcGFyYW1ldGVycy4gVGhpcyBjYW4gbGVhZCB0byB1bm5lY2Vzc2FyeSByZXJlbmRlcnMuJyArICdcXG5TZWxlY3RvcnMgdGhhdCByZXR1cm4gYSBuZXcgcmVmZXJlbmNlIChzdWNoIGFzIGFuIG9iamVjdCBvciBhbiBhcnJheSkgc2hvdWxkIGJlIG1lbW9pemVkOiBodHRwczovL3JlZHV4LmpzLm9yZy91c2FnZS9kZXJpdmluZy1kYXRhLXNlbGVjdG9ycyNvcHRpbWl6aW5nLXNlbGVjdG9ycy13aXRoLW1lbW9pemF0aW9uJywge1xuICAgICAgICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkLFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkMjogdG9Db21wYXJlLFxuICAgICAgICAgICAgICAgIHN0YWNrXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGZpbmFsTm9vcENoZWNrID0gdHlwZW9mIG5vb3BDaGVjayA9PT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWxOb29wQ2hlY2sgOiBub29wQ2hlY2s7XG5cbiAgICAgICAgICBpZiAoZmluYWxOb29wQ2hlY2sgPT09ICdhbHdheXMnIHx8IGZpbmFsTm9vcENoZWNrID09PSAnb25jZScgJiYgZmlyc3RSdW4uY3VycmVudCkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgaWYgKHNlbGVjdGVkID09PSBzdGF0ZSkge1xuICAgICAgICAgICAgICBsZXQgc3RhY2sgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIDtcbiAgICAgICAgICAgICAgICAoe1xuICAgICAgICAgICAgICAgICAgc3RhY2tcbiAgICAgICAgICAgICAgICB9ID0gZSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1NlbGVjdG9yICcgKyAoc2VsZWN0b3IubmFtZSB8fCAndW5rbm93bicpICsgJyByZXR1cm5lZCB0aGUgcm9vdCBzdGF0ZSB3aGVuIGNhbGxlZC4gVGhpcyBjYW4gbGVhZCB0byB1bm5lY2Vzc2FyeSByZXJlbmRlcnMuJyArICdcXG5TZWxlY3RvcnMgdGhhdCByZXR1cm4gdGhlIGVudGlyZSBzdGF0ZSBhcmUgYWxtb3N0IGNlcnRhaW5seSBhIG1pc3Rha2UsIGFzIHRoZXkgd2lsbCBjYXVzZSBhIHJlcmVuZGVyIHdoZW5ldmVyICphbnl0aGluZyogaW4gc3RhdGUgY2hhbmdlcy4nLCB7XG4gICAgICAgICAgICAgICAgc3RhY2tcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGZpcnN0UnVuLmN1cnJlbnQpIGZpcnN0UnVuLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzZWxlY3RlZDtcbiAgICAgIH1cblxuICAgIH1bc2VsZWN0b3IubmFtZV0sIFtzZWxlY3RvciwgZ2xvYmFsU3RhYmlsaXR5Q2hlY2ssIHN0YWJpbGl0eUNoZWNrXSk7XG4gICAgY29uc3Qgc2VsZWN0ZWRTdGF0ZSA9IHVzZVN5bmNFeHRlcm5hbFN0b3JlV2l0aFNlbGVjdG9yKHN1YnNjcmlwdGlvbi5hZGROZXN0ZWRTdWIsIHN0b3JlLmdldFN0YXRlLCBnZXRTZXJ2ZXJTdGF0ZSB8fCBzdG9yZS5nZXRTdGF0ZSwgd3JhcHBlZFNlbGVjdG9yLCBlcXVhbGl0eUZuKTtcbiAgICB1c2VEZWJ1Z1ZhbHVlKHNlbGVjdGVkU3RhdGUpO1xuICAgIHJldHVybiBzZWxlY3RlZFN0YXRlO1xuICB9O1xufVxuLyoqXHJcbiAqIEEgaG9vayB0byBhY2Nlc3MgdGhlIHJlZHV4IHN0b3JlJ3Mgc3RhdGUuIFRoaXMgaG9vayB0YWtlcyBhIHNlbGVjdG9yIGZ1bmN0aW9uXHJcbiAqIGFzIGFuIGFyZ3VtZW50LiBUaGUgc2VsZWN0b3IgaXMgY2FsbGVkIHdpdGggdGhlIHN0b3JlIHN0YXRlLlxyXG4gKlxyXG4gKiBUaGlzIGhvb2sgdGFrZXMgYW4gb3B0aW9uYWwgZXF1YWxpdHkgY29tcGFyaXNvbiBmdW5jdGlvbiBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlclxyXG4gKiB0aGF0IGFsbG93cyB5b3UgdG8gY3VzdG9taXplIHRoZSB3YXkgdGhlIHNlbGVjdGVkIHN0YXRlIGlzIGNvbXBhcmVkIHRvIGRldGVybWluZVxyXG4gKiB3aGV0aGVyIHRoZSBjb21wb25lbnQgbmVlZHMgdG8gYmUgcmUtcmVuZGVyZWQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNlbGVjdG9yIHRoZSBzZWxlY3RvciBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9uPX0gZXF1YWxpdHlGbiB0aGUgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGVxdWFsaXR5XHJcbiAqXHJcbiAqIEByZXR1cm5zIHthbnl9IHRoZSBzZWxlY3RlZCBzdGF0ZVxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKlxyXG4gKiBpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXHJcbiAqIGltcG9ydCB7IHVzZVNlbGVjdG9yIH0gZnJvbSAncmVhY3QtcmVkdXgnXHJcbiAqXHJcbiAqIGV4cG9ydCBjb25zdCBDb3VudGVyQ29tcG9uZW50ID0gKCkgPT4ge1xyXG4gKiAgIGNvbnN0IGNvdW50ZXIgPSB1c2VTZWxlY3RvcihzdGF0ZSA9PiBzdGF0ZS5jb3VudGVyKVxyXG4gKiAgIHJldHVybiA8ZGl2Pntjb3VudGVyfTwvZGl2PlxyXG4gKiB9XHJcbiAqL1xuXG5leHBvcnQgY29uc3QgdXNlU2VsZWN0b3IgPSAvKiNfX1BVUkVfXyovY3JlYXRlU2VsZWN0b3JIb29rKCk7IiwiaW1wb3J0IHsgUmVhY3RSZWR1eENvbnRleHQgfSBmcm9tICcuLi9jb21wb25lbnRzL0NvbnRleHQnO1xuaW1wb3J0IHsgdXNlUmVkdXhDb250ZXh0IGFzIHVzZURlZmF1bHRSZWR1eENvbnRleHQsIGNyZWF0ZVJlZHV4Q29udGV4dEhvb2sgfSBmcm9tICcuL3VzZVJlZHV4Q29udGV4dCc7XG4vKipcclxuICogSG9vayBmYWN0b3J5LCB3aGljaCBjcmVhdGVzIGEgYHVzZVN0b3JlYCBob29rIGJvdW5kIHRvIGEgZ2l2ZW4gY29udGV4dC5cclxuICpcclxuICogQHBhcmFtIHtSZWFjdC5Db250ZXh0fSBbY29udGV4dD1SZWFjdFJlZHV4Q29udGV4dF0gQ29udGV4dCBwYXNzZWQgdG8geW91ciBgPFByb3ZpZGVyPmAuXHJcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSBgdXNlU3RvcmVgIGhvb2sgYm91bmQgdG8gdGhlIHNwZWNpZmllZCBjb250ZXh0LlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN0b3JlSG9vayhjb250ZXh0ID0gUmVhY3RSZWR1eENvbnRleHQpIHtcbiAgY29uc3QgdXNlUmVkdXhDb250ZXh0ID0gLy8gQHRzLWlnbm9yZVxuICBjb250ZXh0ID09PSBSZWFjdFJlZHV4Q29udGV4dCA/IHVzZURlZmF1bHRSZWR1eENvbnRleHQgOiAvLyBAdHMtaWdub3JlXG4gIGNyZWF0ZVJlZHV4Q29udGV4dEhvb2soY29udGV4dCk7XG4gIHJldHVybiBmdW5jdGlvbiB1c2VTdG9yZSgpIHtcbiAgICBjb25zdCB7XG4gICAgICBzdG9yZVxuICAgIH0gPSB1c2VSZWR1eENvbnRleHQoKTsgLy8gQHRzLWlnbm9yZVxuXG4gICAgcmV0dXJuIHN0b3JlO1xuICB9O1xufVxuLyoqXHJcbiAqIEEgaG9vayB0byBhY2Nlc3MgdGhlIHJlZHV4IHN0b3JlLlxyXG4gKlxyXG4gKiBAcmV0dXJucyB7YW55fSB0aGUgcmVkdXggc3RvcmVcclxuICpcclxuICogQGV4YW1wbGVcclxuICpcclxuICogaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xyXG4gKiBpbXBvcnQgeyB1c2VTdG9yZSB9IGZyb20gJ3JlYWN0LXJlZHV4J1xyXG4gKlxyXG4gKiBleHBvcnQgY29uc3QgRXhhbXBsZUNvbXBvbmVudCA9ICgpID0+IHtcclxuICogICBjb25zdCBzdG9yZSA9IHVzZVN0b3JlKClcclxuICogICByZXR1cm4gPGRpdj57c3RvcmUuZ2V0U3RhdGUoKX08L2Rpdj5cclxuICogfVxyXG4gKi9cblxuZXhwb3J0IGNvbnN0IHVzZVN0b3JlID0gLyojX19QVVJFX18qL2NyZWF0ZVN0b3JlSG9vaygpOyIsIi8vIFRoZSBwcmltYXJ5IGVudHJ5IHBvaW50IGFzc3VtZXMgd2UncmUgd29ya2luZyB3aXRoIHN0YW5kYXJkIFJlYWN0RE9NL1JOLCBidXRcbi8vIG9sZGVyIHZlcnNpb25zIHRoYXQgZG8gbm90IGluY2x1ZGUgYHVzZVN5bmNFeHRlcm5hbFN0b3JlYCAoUmVhY3QgMTYuOSAtIDE3LngpLlxuLy8gQmVjYXVzZSBvZiB0aGF0LCB0aGUgdXNlU3luY0V4dGVybmFsU3RvcmUgY29tcGF0IHNoaW0gaXMgbmVlZGVkLlxuaW1wb3J0IHsgdXNlU3luY0V4dGVybmFsU3RvcmUgfSBmcm9tICd1c2Utc3luYy1leHRlcm5hbC1zdG9yZS9zaGltJztcbmltcG9ydCB7IHVzZVN5bmNFeHRlcm5hbFN0b3JlV2l0aFNlbGVjdG9yIH0gZnJvbSAndXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUvc2hpbS93aXRoLXNlbGVjdG9yJztcbmltcG9ydCB7IHVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzIGFzIGJhdGNoIH0gZnJvbSAnLi91dGlscy9yZWFjdEJhdGNoZWRVcGRhdGVzJztcbmltcG9ydCB7IHNldEJhdGNoIH0gZnJvbSAnLi91dGlscy9iYXRjaCc7XG5pbXBvcnQgeyBpbml0aWFsaXplVXNlU2VsZWN0b3IgfSBmcm9tICcuL2hvb2tzL3VzZVNlbGVjdG9yJztcbmltcG9ydCB7IGluaXRpYWxpemVDb25uZWN0IH0gZnJvbSAnLi9jb21wb25lbnRzL2Nvbm5lY3QnO1xuaW5pdGlhbGl6ZVVzZVNlbGVjdG9yKHVzZVN5bmNFeHRlcm5hbFN0b3JlV2l0aFNlbGVjdG9yKTtcbmluaXRpYWxpemVDb25uZWN0KHVzZVN5bmNFeHRlcm5hbFN0b3JlKTsgLy8gRW5hYmxlIGJhdGNoZWQgdXBkYXRlcyBpbiBvdXIgc3Vic2NyaXB0aW9ucyBmb3IgdXNlXG4vLyB3aXRoIHN0YW5kYXJkIFJlYWN0IHJlbmRlcmVycyAoUmVhY3RET00sIFJlYWN0IE5hdGl2ZSlcblxuc2V0QmF0Y2goYmF0Y2gpO1xuZXhwb3J0IHsgYmF0Y2ggfTtcbmV4cG9ydCAqIGZyb20gJy4vZXhwb3J0cyc7IiwiZXhwb3J0IHt9OyIsImltcG9ydCB7IGdldEJhdGNoIH0gZnJvbSAnLi9iYXRjaCc7IC8vIGVuY2Fwc3VsYXRlcyB0aGUgc3Vic2NyaXB0aW9uIGxvZ2ljIGZvciBjb25uZWN0aW5nIGEgY29tcG9uZW50IHRvIHRoZSByZWR1eCBzdG9yZSwgYXNcbi8vIHdlbGwgYXMgbmVzdGluZyBzdWJzY3JpcHRpb25zIG9mIGRlc2NlbmRhbnQgY29tcG9uZW50cywgc28gdGhhdCB3ZSBjYW4gZW5zdXJlIHRoZVxuLy8gYW5jZXN0b3IgY29tcG9uZW50cyByZS1yZW5kZXIgYmVmb3JlIGRlc2NlbmRhbnRzXG5cbmZ1bmN0aW9uIGNyZWF0ZUxpc3RlbmVyQ29sbGVjdGlvbigpIHtcbiAgY29uc3QgYmF0Y2ggPSBnZXRCYXRjaCgpO1xuICBsZXQgZmlyc3QgPSBudWxsO1xuICBsZXQgbGFzdCA9IG51bGw7XG4gIHJldHVybiB7XG4gICAgY2xlYXIoKSB7XG4gICAgICBmaXJzdCA9IG51bGw7XG4gICAgICBsYXN0ID0gbnVsbDtcbiAgICB9LFxuXG4gICAgbm90aWZ5KCkge1xuICAgICAgYmF0Y2goKCkgPT4ge1xuICAgICAgICBsZXQgbGlzdGVuZXIgPSBmaXJzdDtcblxuICAgICAgICB3aGlsZSAobGlzdGVuZXIpIHtcbiAgICAgICAgICBsaXN0ZW5lci5jYWxsYmFjaygpO1xuICAgICAgICAgIGxpc3RlbmVyID0gbGlzdGVuZXIubmV4dDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGdldCgpIHtcbiAgICAgIGxldCBsaXN0ZW5lcnMgPSBbXTtcbiAgICAgIGxldCBsaXN0ZW5lciA9IGZpcnN0O1xuXG4gICAgICB3aGlsZSAobGlzdGVuZXIpIHtcbiAgICAgICAgbGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgICAgICBsaXN0ZW5lciA9IGxpc3RlbmVyLm5leHQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBsaXN0ZW5lcnM7XG4gICAgfSxcblxuICAgIHN1YnNjcmliZShjYWxsYmFjaykge1xuICAgICAgbGV0IGlzU3Vic2NyaWJlZCA9IHRydWU7XG4gICAgICBsZXQgbGlzdGVuZXIgPSBsYXN0ID0ge1xuICAgICAgICBjYWxsYmFjayxcbiAgICAgICAgbmV4dDogbnVsbCxcbiAgICAgICAgcHJldjogbGFzdFxuICAgICAgfTtcblxuICAgICAgaWYgKGxpc3RlbmVyLnByZXYpIHtcbiAgICAgICAgbGlzdGVuZXIucHJldi5uZXh0ID0gbGlzdGVuZXI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaXJzdCA9IGxpc3RlbmVyO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZnVuY3Rpb24gdW5zdWJzY3JpYmUoKSB7XG4gICAgICAgIGlmICghaXNTdWJzY3JpYmVkIHx8IGZpcnN0ID09PSBudWxsKSByZXR1cm47XG4gICAgICAgIGlzU3Vic2NyaWJlZCA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChsaXN0ZW5lci5uZXh0KSB7XG4gICAgICAgICAgbGlzdGVuZXIubmV4dC5wcmV2ID0gbGlzdGVuZXIucHJldjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsYXN0ID0gbGlzdGVuZXIucHJldjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsaXN0ZW5lci5wcmV2KSB7XG4gICAgICAgICAgbGlzdGVuZXIucHJldi5uZXh0ID0gbGlzdGVuZXIubmV4dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaXJzdCA9IGxpc3RlbmVyLm5leHQ7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gIH07XG59XG5cbmNvbnN0IG51bGxMaXN0ZW5lcnMgPSB7XG4gIG5vdGlmeSgpIHt9LFxuXG4gIGdldDogKCkgPT4gW11cbn07XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU3Vic2NyaXB0aW9uKHN0b3JlLCBwYXJlbnRTdWIpIHtcbiAgbGV0IHVuc3Vic2NyaWJlO1xuICBsZXQgbGlzdGVuZXJzID0gbnVsbExpc3RlbmVyczsgLy8gUmVhc29ucyB0byBrZWVwIHRoZSBzdWJzY3JpcHRpb24gYWN0aXZlXG5cbiAgbGV0IHN1YnNjcmlwdGlvbnNBbW91bnQgPSAwOyAvLyBJcyB0aGlzIHNwZWNpZmljIHN1YnNjcmlwdGlvbiBzdWJzY3JpYmVkIChvciBvbmx5IG5lc3RlZCBvbmVzPylcblxuICBsZXQgc2VsZlN1YnNjcmliZWQgPSBmYWxzZTtcblxuICBmdW5jdGlvbiBhZGROZXN0ZWRTdWIobGlzdGVuZXIpIHtcbiAgICB0cnlTdWJzY3JpYmUoKTtcbiAgICBjb25zdCBjbGVhbnVwTGlzdGVuZXIgPSBsaXN0ZW5lcnMuc3Vic2NyaWJlKGxpc3RlbmVyKTsgLy8gY2xlYW51cCBuZXN0ZWQgc3ViXG5cbiAgICBsZXQgcmVtb3ZlZCA9IGZhbHNlO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBpZiAoIXJlbW92ZWQpIHtcbiAgICAgICAgcmVtb3ZlZCA9IHRydWU7XG4gICAgICAgIGNsZWFudXBMaXN0ZW5lcigpO1xuICAgICAgICB0cnlVbnN1YnNjcmliZSgpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBub3RpZnlOZXN0ZWRTdWJzKCkge1xuICAgIGxpc3RlbmVycy5ub3RpZnkoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZUNoYW5nZVdyYXBwZXIoKSB7XG4gICAgaWYgKHN1YnNjcmlwdGlvbi5vblN0YXRlQ2hhbmdlKSB7XG4gICAgICBzdWJzY3JpcHRpb24ub25TdGF0ZUNoYW5nZSgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGlzU3Vic2NyaWJlZCgpIHtcbiAgICByZXR1cm4gc2VsZlN1YnNjcmliZWQ7XG4gIH1cblxuICBmdW5jdGlvbiB0cnlTdWJzY3JpYmUoKSB7XG4gICAgc3Vic2NyaXB0aW9uc0Ftb3VudCsrO1xuXG4gICAgaWYgKCF1bnN1YnNjcmliZSkge1xuICAgICAgdW5zdWJzY3JpYmUgPSBwYXJlbnRTdWIgPyBwYXJlbnRTdWIuYWRkTmVzdGVkU3ViKGhhbmRsZUNoYW5nZVdyYXBwZXIpIDogc3RvcmUuc3Vic2NyaWJlKGhhbmRsZUNoYW5nZVdyYXBwZXIpO1xuICAgICAgbGlzdGVuZXJzID0gY3JlYXRlTGlzdGVuZXJDb2xsZWN0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdHJ5VW5zdWJzY3JpYmUoKSB7XG4gICAgc3Vic2NyaXB0aW9uc0Ftb3VudC0tO1xuXG4gICAgaWYgKHVuc3Vic2NyaWJlICYmIHN1YnNjcmlwdGlvbnNBbW91bnQgPT09IDApIHtcbiAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICB1bnN1YnNjcmliZSA9IHVuZGVmaW5lZDtcbiAgICAgIGxpc3RlbmVycy5jbGVhcigpO1xuICAgICAgbGlzdGVuZXJzID0gbnVsbExpc3RlbmVycztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB0cnlTdWJzY3JpYmVTZWxmKCkge1xuICAgIGlmICghc2VsZlN1YnNjcmliZWQpIHtcbiAgICAgIHNlbGZTdWJzY3JpYmVkID0gdHJ1ZTtcbiAgICAgIHRyeVN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHRyeVVuc3Vic2NyaWJlU2VsZigpIHtcbiAgICBpZiAoc2VsZlN1YnNjcmliZWQpIHtcbiAgICAgIHNlbGZTdWJzY3JpYmVkID0gZmFsc2U7XG4gICAgICB0cnlVbnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHN1YnNjcmlwdGlvbiA9IHtcbiAgICBhZGROZXN0ZWRTdWIsXG4gICAgbm90aWZ5TmVzdGVkU3VicyxcbiAgICBoYW5kbGVDaGFuZ2VXcmFwcGVyLFxuICAgIGlzU3Vic2NyaWJlZCxcbiAgICB0cnlTdWJzY3JpYmU6IHRyeVN1YnNjcmliZVNlbGYsXG4gICAgdHJ5VW5zdWJzY3JpYmU6IHRyeVVuc3Vic2NyaWJlU2VsZixcbiAgICBnZXRMaXN0ZW5lcnM6ICgpID0+IGxpc3RlbmVyc1xuICB9O1xuICByZXR1cm4gc3Vic2NyaXB0aW9uO1xufSIsIi8vIERlZmF1bHQgdG8gYSBkdW1teSBcImJhdGNoXCIgaW1wbGVtZW50YXRpb24gdGhhdCBqdXN0IHJ1bnMgdGhlIGNhbGxiYWNrXG5mdW5jdGlvbiBkZWZhdWx0Tm9vcEJhdGNoKGNhbGxiYWNrKSB7XG4gIGNhbGxiYWNrKCk7XG59XG5cbmxldCBiYXRjaCA9IGRlZmF1bHROb29wQmF0Y2g7IC8vIEFsbG93IGluamVjdGluZyBhbm90aGVyIGJhdGNoaW5nIGZ1bmN0aW9uIGxhdGVyXG5cbmV4cG9ydCBjb25zdCBzZXRCYXRjaCA9IG5ld0JhdGNoID0+IGJhdGNoID0gbmV3QmF0Y2g7IC8vIFN1cHBseSBhIGdldHRlciBqdXN0IHRvIHNraXAgZGVhbGluZyB3aXRoIEVTTSBiaW5kaW5nc1xuXG5leHBvcnQgY29uc3QgZ2V0QmF0Y2ggPSAoKSA9PiBiYXRjaDsiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBiaW5kQWN0aW9uQ3JlYXRvcnMoYWN0aW9uQ3JlYXRvcnMsIGRpc3BhdGNoKSB7XG4gIGNvbnN0IGJvdW5kQWN0aW9uQ3JlYXRvcnMgPSB7fTtcblxuICBmb3IgKGNvbnN0IGtleSBpbiBhY3Rpb25DcmVhdG9ycykge1xuICAgIGNvbnN0IGFjdGlvbkNyZWF0b3IgPSBhY3Rpb25DcmVhdG9yc1trZXldO1xuXG4gICAgaWYgKHR5cGVvZiBhY3Rpb25DcmVhdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBib3VuZEFjdGlvbkNyZWF0b3JzW2tleV0gPSAoLi4uYXJncykgPT4gZGlzcGF0Y2goYWN0aW9uQ3JlYXRvciguLi5hcmdzKSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJvdW5kQWN0aW9uQ3JlYXRvcnM7XG59IiwiLyoqXHJcbiAqIEBwYXJhbSB7YW55fSBvYmogVGhlIG9iamVjdCB0byBpbnNwZWN0LlxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgYXJndW1lbnQgYXBwZWFycyB0byBiZSBhIHBsYWluIG9iamVjdC5cclxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc1BsYWluT2JqZWN0KG9iaikge1xuICBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcgfHwgb2JqID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gIGxldCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopO1xuICBpZiAocHJvdG8gPT09IG51bGwpIHJldHVybiB0cnVlO1xuICBsZXQgYmFzZVByb3RvID0gcHJvdG87XG5cbiAgd2hpbGUgKE9iamVjdC5nZXRQcm90b3R5cGVPZihiYXNlUHJvdG8pICE9PSBudWxsKSB7XG4gICAgYmFzZVByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGJhc2VQcm90byk7XG4gIH1cblxuICByZXR1cm4gcHJvdG8gPT09IGJhc2VQcm90bztcbn0iLCJleHBvcnQgeyB1bnN0YWJsZV9iYXRjaGVkVXBkYXRlcyB9IGZyb20gJ3JlYWN0LWRvbSc7IiwiZnVuY3Rpb24gaXMoeCwgeSkge1xuICBpZiAoeCA9PT0geSkge1xuICAgIHJldHVybiB4ICE9PSAwIHx8IHkgIT09IDAgfHwgMSAvIHggPT09IDEgLyB5O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB4ICE9PSB4ICYmIHkgIT09IHk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc2hhbGxvd0VxdWFsKG9iakEsIG9iakIpIHtcbiAgaWYgKGlzKG9iakEsIG9iakIpKSByZXR1cm4gdHJ1ZTtcblxuICBpZiAodHlwZW9mIG9iakEgIT09ICdvYmplY3QnIHx8IG9iakEgPT09IG51bGwgfHwgdHlwZW9mIG9iakIgIT09ICdvYmplY3QnIHx8IG9iakIgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBrZXlzQSA9IE9iamVjdC5rZXlzKG9iakEpO1xuICBjb25zdCBrZXlzQiA9IE9iamVjdC5rZXlzKG9iakIpO1xuICBpZiAoa2V5c0EubGVuZ3RoICE9PSBrZXlzQi5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXNBLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqQiwga2V5c0FbaV0pIHx8ICFpcyhvYmpBW2tleXNBW2ldXSwgb2JqQltrZXlzQVtpXV0pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnOyAvLyBSZWFjdCBjdXJyZW50bHkgdGhyb3dzIGEgd2FybmluZyB3aGVuIHVzaW5nIHVzZUxheW91dEVmZmVjdCBvbiB0aGUgc2VydmVyLlxuLy8gVG8gZ2V0IGFyb3VuZCBpdCwgd2UgY2FuIGNvbmRpdGlvbmFsbHkgdXNlRWZmZWN0IG9uIHRoZSBzZXJ2ZXIgKG5vLW9wKSBhbmRcbi8vIHVzZUxheW91dEVmZmVjdCBpbiB0aGUgYnJvd3Nlci4gV2UgbmVlZCB1c2VMYXlvdXRFZmZlY3QgdG8gZW5zdXJlIHRoZSBzdG9yZVxuLy8gc3Vic2NyaXB0aW9uIGNhbGxiYWNrIGFsd2F5cyBoYXMgdGhlIHNlbGVjdG9yIGZyb20gdGhlIGxhdGVzdCByZW5kZXIgY29tbWl0XG4vLyBhdmFpbGFibGUsIG90aGVyd2lzZSBhIHN0b3JlIHVwZGF0ZSBtYXkgaGFwcGVuIGJldHdlZW4gcmVuZGVyIGFuZCB0aGUgZWZmZWN0LFxuLy8gd2hpY2ggbWF5IGNhdXNlIG1pc3NlZCB1cGRhdGVzOyB3ZSBhbHNvIG11c3QgZW5zdXJlIHRoZSBzdG9yZSBzdWJzY3JpcHRpb25cbi8vIGlzIGNyZWF0ZWQgc3luY2hyb25vdXNseSwgb3RoZXJ3aXNlIGEgc3RvcmUgdXBkYXRlIG1heSBvY2N1ciBiZWZvcmUgdGhlXG4vLyBzdWJzY3JpcHRpb24gaXMgY3JlYXRlZCBhbmQgYW4gaW5jb25zaXN0ZW50IHN0YXRlIG1heSBiZSBvYnNlcnZlZFxuLy8gTWF0Y2hlcyBsb2dpYyBpbiBSZWFjdCdzIGBzaGFyZWQvRXhlY3V0aW9uRW52aXJvbm1lbnRgIGZpbGVcblxuZXhwb3J0IGNvbnN0IGNhblVzZURPTSA9ICEhKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcpO1xuZXhwb3J0IGNvbnN0IHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QgPSBjYW5Vc2VET00gPyBSZWFjdC51c2VMYXlvdXRFZmZlY3QgOiBSZWFjdC51c2VFZmZlY3Q7IiwiZXhwb3J0IGNvbnN0IG5vdEluaXRpYWxpemVkID0gKCkgPT4ge1xuICB0aHJvdyBuZXcgRXJyb3IoJ3VTRVMgbm90IGluaXRpYWxpemVkIScpO1xufTsiLCJpbXBvcnQgaXNQbGFpbk9iamVjdCBmcm9tICcuL2lzUGxhaW5PYmplY3QnO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSAnLi93YXJuaW5nJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZlcmlmeVBsYWluT2JqZWN0KHZhbHVlLCBkaXNwbGF5TmFtZSwgbWV0aG9kTmFtZSkge1xuICBpZiAoIWlzUGxhaW5PYmplY3QodmFsdWUpKSB7XG4gICAgd2FybmluZyhgJHttZXRob2ROYW1lfSgpIGluICR7ZGlzcGxheU5hbWV9IG11c3QgcmV0dXJuIGEgcGxhaW4gb2JqZWN0LiBJbnN0ZWFkIHJlY2VpdmVkICR7dmFsdWV9LmApO1xuICB9XG59IiwiLyoqXHJcbiAqIFByaW50cyBhIHdhcm5pbmcgaW4gdGhlIGNvbnNvbGUgaWYgaXQgZXhpc3RzLlxyXG4gKlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBUaGUgd2FybmluZyBtZXNzYWdlLlxyXG4gKiBAcmV0dXJucyB7dm9pZH1cclxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB3YXJuaW5nKG1lc3NhZ2UpIHtcbiAgLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBjb25zb2xlLmVycm9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgfVxuICAvKiBlc2xpbnQtZW5hYmxlIG5vLWNvbnNvbGUgKi9cblxuXG4gIHRyeSB7XG4gICAgLy8gVGhpcyBlcnJvciB3YXMgdGhyb3duIGFzIGEgY29udmVuaWVuY2Ugc28gdGhhdCBpZiB5b3UgZW5hYmxlXG4gICAgLy8gXCJicmVhayBvbiBhbGwgZXhjZXB0aW9uc1wiIGluIHlvdXIgY29uc29sZSxcbiAgICAvLyBpdCB3b3VsZCBwYXVzZSB0aGUgZXhlY3V0aW9uIGF0IHRoaXMgbGluZS5cbiAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgLyogZXNsaW50LWRpc2FibGUgbm8tZW1wdHkgKi9cbiAgfSBjYXRjaCAoZSkge31cbiAgLyogZXNsaW50LWVuYWJsZSBuby1lbXB0eSAqL1xuXG59IiwiLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogcmVhY3QtaXMuZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgKGZ1bmN0aW9uKCkge1xuJ3VzZSBzdHJpY3QnO1xuXG4vLyBBVFRFTlRJT05cbi8vIFdoZW4gYWRkaW5nIG5ldyBzeW1ib2xzIHRvIHRoaXMgZmlsZSxcbi8vIFBsZWFzZSBjb25zaWRlciBhbHNvIGFkZGluZyB0byAncmVhY3QtZGV2dG9vbHMtc2hhcmVkL3NyYy9iYWNrZW5kL1JlYWN0U3ltYm9scydcbi8vIFRoZSBTeW1ib2wgdXNlZCB0byB0YWcgdGhlIFJlYWN0RWxlbWVudC1saWtlIHR5cGVzLlxudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKTtcbnZhciBSRUFDVF9QT1JUQUxfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnBvcnRhbCcpO1xudmFyIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5mcmFnbWVudCcpO1xudmFyIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdHJpY3RfbW9kZScpO1xudmFyIFJFQUNUX1BST0ZJTEVSX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wcm9maWxlcicpO1xudmFyIFJFQUNUX1BST1ZJREVSX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wcm92aWRlcicpO1xudmFyIFJFQUNUX0NPTlRFWFRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmNvbnRleHQnKTtcbnZhciBSRUFDVF9TRVJWRVJfQ09OVEVYVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc2VydmVyX2NvbnRleHQnKTtcbnZhciBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZm9yd2FyZF9yZWYnKTtcbnZhciBSRUFDVF9TVVNQRU5TRV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2UnKTtcbnZhciBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZV9saXN0Jyk7XG52YXIgUkVBQ1RfTUVNT19UWVBFID0gU3ltYm9sLmZvcigncmVhY3QubWVtbycpO1xudmFyIFJFQUNUX0xBWllfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmxhenknKTtcbnZhciBSRUFDVF9PRkZTQ1JFRU5fVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0Lm9mZnNjcmVlbicpO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG52YXIgZW5hYmxlU2NvcGVBUEkgPSBmYWxzZTsgLy8gRXhwZXJpbWVudGFsIENyZWF0ZSBFdmVudCBIYW5kbGUgQVBJLlxudmFyIGVuYWJsZUNhY2hlRWxlbWVudCA9IGZhbHNlO1xudmFyIGVuYWJsZVRyYW5zaXRpb25UcmFjaW5nID0gZmFsc2U7IC8vIE5vIGtub3duIGJ1Z3MsIGJ1dCBuZWVkcyBwZXJmb3JtYW5jZSB0ZXN0aW5nXG5cbnZhciBlbmFibGVMZWdhY3lIaWRkZW4gPSBmYWxzZTsgLy8gRW5hYmxlcyB1bnN0YWJsZV9hdm9pZFRoaXNGYWxsYmFjayBmZWF0dXJlIGluIEZpYmVyXG4vLyBzdHVmZi4gSW50ZW5kZWQgdG8gZW5hYmxlIFJlYWN0IGNvcmUgbWVtYmVycyB0byBtb3JlIGVhc2lseSBkZWJ1ZyBzY2hlZHVsaW5nXG4vLyBpc3N1ZXMgaW4gREVWIGJ1aWxkcy5cblxudmFyIGVuYWJsZURlYnVnVHJhY2luZyA9IGZhbHNlOyAvLyBUcmFjayB3aGljaCBGaWJlcihzKSBzY2hlZHVsZSByZW5kZXIgd29yay5cblxudmFyIFJFQUNUX01PRFVMRV9SRUZFUkVOQ0U7XG5cbntcbiAgUkVBQ1RfTU9EVUxFX1JFRkVSRU5DRSA9IFN5bWJvbC5mb3IoJ3JlYWN0Lm1vZHVsZS5yZWZlcmVuY2UnKTtcbn1cblxuZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpIHtcbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIE5vdGU6IHR5cGVvZiBtaWdodCBiZSBvdGhlciB0aGFuICdzeW1ib2wnIG9yICdudW1iZXInIChlLmcuIGlmIGl0J3MgYSBwb2x5ZmlsbCkuXG5cblxuICBpZiAodHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9QUk9GSUxFUl9UWVBFIHx8IGVuYWJsZURlYnVnVHJhY2luZyAgfHwgdHlwZSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSB8fCBlbmFibGVMZWdhY3lIaWRkZW4gIHx8IHR5cGUgPT09IFJFQUNUX09GRlNDUkVFTl9UWVBFIHx8IGVuYWJsZVNjb3BlQVBJICB8fCBlbmFibGVDYWNoZUVsZW1lbnQgIHx8IGVuYWJsZVRyYW5zaXRpb25UcmFjaW5nICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsKSB7XG4gICAgaWYgKHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9DT05URVhUX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSB8fCAvLyBUaGlzIG5lZWRzIHRvIGluY2x1ZGUgYWxsIHBvc3NpYmxlIG1vZHVsZSByZWZlcmVuY2Ugb2JqZWN0XG4gICAgLy8gdHlwZXMgc3VwcG9ydGVkIGJ5IGFueSBGbGlnaHQgY29uZmlndXJhdGlvbiBhbnl3aGVyZSBzaW5jZVxuICAgIC8vIHdlIGRvbid0IGtub3cgd2hpY2ggRmxpZ2h0IGJ1aWxkIHRoaXMgd2lsbCBlbmQgdXAgYmVpbmcgdXNlZFxuICAgIC8vIHdpdGguXG4gICAgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTU9EVUxFX1JFRkVSRU5DRSB8fCB0eXBlLmdldE1vZHVsZUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gdHlwZU9mKG9iamVjdCkge1xuICBpZiAodHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyICQkdHlwZW9mID0gb2JqZWN0LiQkdHlwZW9mO1xuXG4gICAgc3dpdGNoICgkJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgIHZhciB0eXBlID0gb2JqZWN0LnR5cGU7XG5cbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgY2FzZSBSRUFDVF9GUkFHTUVOVF9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfUFJPRklMRVJfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1NUUklDVF9NT0RFX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFOlxuICAgICAgICAgICAgcmV0dXJuIHR5cGU7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdmFyICQkdHlwZW9mVHlwZSA9IHR5cGUgJiYgdHlwZS4kJHR5cGVvZjtcblxuICAgICAgICAgICAgc3dpdGNoICgkJHR5cGVvZlR5cGUpIHtcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9TRVJWRVJfQ09OVEVYVF9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfUFJPVklERVJfVFlQRTpcbiAgICAgICAgICAgICAgICByZXR1cm4gJCR0eXBlb2ZUeXBlO1xuXG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuICQkdHlwZW9mO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgcmV0dXJuICQkdHlwZW9mO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG52YXIgQ29udGV4dENvbnN1bWVyID0gUkVBQ1RfQ09OVEVYVF9UWVBFO1xudmFyIENvbnRleHRQcm92aWRlciA9IFJFQUNUX1BST1ZJREVSX1RZUEU7XG52YXIgRWxlbWVudCA9IFJFQUNUX0VMRU1FTlRfVFlQRTtcbnZhciBGb3J3YXJkUmVmID0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTtcbnZhciBGcmFnbWVudCA9IFJFQUNUX0ZSQUdNRU5UX1RZUEU7XG52YXIgTGF6eSA9IFJFQUNUX0xBWllfVFlQRTtcbnZhciBNZW1vID0gUkVBQ1RfTUVNT19UWVBFO1xudmFyIFBvcnRhbCA9IFJFQUNUX1BPUlRBTF9UWVBFO1xudmFyIFByb2ZpbGVyID0gUkVBQ1RfUFJPRklMRVJfVFlQRTtcbnZhciBTdHJpY3RNb2RlID0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRTtcbnZhciBTdXNwZW5zZSA9IFJFQUNUX1NVU1BFTlNFX1RZUEU7XG52YXIgU3VzcGVuc2VMaXN0ID0gUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFO1xudmFyIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlID0gZmFsc2U7XG52YXIgaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNDb25jdXJyZW50TW9kZSA9IGZhbHNlOyAvLyBBc3luY01vZGUgc2hvdWxkIGJlIGRlcHJlY2F0ZWRcblxuZnVuY3Rpb24gaXNBc3luY01vZGUob2JqZWN0KSB7XG4gIHtcbiAgICBpZiAoIWhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlKSB7XG4gICAgICBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0FzeW5jTW9kZSA9IHRydWU7IC8vIFVzaW5nIGNvbnNvbGVbJ3dhcm4nXSB0byBldmFkZSBCYWJlbCBhbmQgRVNMaW50XG5cbiAgICAgIGNvbnNvbGVbJ3dhcm4nXSgnVGhlIFJlYWN0SXMuaXNBc3luY01vZGUoKSBhbGlhcyBoYXMgYmVlbiBkZXByZWNhdGVkLCAnICsgJ2FuZCB3aWxsIGJlIHJlbW92ZWQgaW4gUmVhY3QgMTgrLicpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGlzQ29uY3VycmVudE1vZGUob2JqZWN0KSB7XG4gIHtcbiAgICBpZiAoIWhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQ29uY3VycmVudE1vZGUpIHtcbiAgICAgIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQ29uY3VycmVudE1vZGUgPSB0cnVlOyAvLyBVc2luZyBjb25zb2xlWyd3YXJuJ10gdG8gZXZhZGUgQmFiZWwgYW5kIEVTTGludFxuXG4gICAgICBjb25zb2xlWyd3YXJuJ10oJ1RoZSBSZWFjdElzLmlzQ29uY3VycmVudE1vZGUoKSBhbGlhcyBoYXMgYmVlbiBkZXByZWNhdGVkLCAnICsgJ2FuZCB3aWxsIGJlIHJlbW92ZWQgaW4gUmVhY3QgMTgrLicpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGlzQ29udGV4dENvbnN1bWVyKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0NPTlRFWFRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzQ29udGV4dFByb3ZpZGVyKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1BST1ZJREVSX1RZUEU7XG59XG5mdW5jdGlvbiBpc0VsZW1lbnQob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QgIT09IG51bGwgJiYgb2JqZWN0LiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEU7XG59XG5mdW5jdGlvbiBpc0ZvcndhcmRSZWYob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRnJhZ21lbnQob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzTGF6eShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9MQVpZX1RZUEU7XG59XG5mdW5jdGlvbiBpc01lbW8ob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfTUVNT19UWVBFO1xufVxuZnVuY3Rpb24gaXNQb3J0YWwob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUE9SVEFMX1RZUEU7XG59XG5mdW5jdGlvbiBpc1Byb2ZpbGVyKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1BST0ZJTEVSX1RZUEU7XG59XG5mdW5jdGlvbiBpc1N0cmljdE1vZGUob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzU3VzcGVuc2Uob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfU1VTUEVOU0VfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzU3VzcGVuc2VMaXN0KG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTtcbn1cblxuZXhwb3J0cy5Db250ZXh0Q29uc3VtZXIgPSBDb250ZXh0Q29uc3VtZXI7XG5leHBvcnRzLkNvbnRleHRQcm92aWRlciA9IENvbnRleHRQcm92aWRlcjtcbmV4cG9ydHMuRWxlbWVudCA9IEVsZW1lbnQ7XG5leHBvcnRzLkZvcndhcmRSZWYgPSBGb3J3YXJkUmVmO1xuZXhwb3J0cy5GcmFnbWVudCA9IEZyYWdtZW50O1xuZXhwb3J0cy5MYXp5ID0gTGF6eTtcbmV4cG9ydHMuTWVtbyA9IE1lbW87XG5leHBvcnRzLlBvcnRhbCA9IFBvcnRhbDtcbmV4cG9ydHMuUHJvZmlsZXIgPSBQcm9maWxlcjtcbmV4cG9ydHMuU3RyaWN0TW9kZSA9IFN0cmljdE1vZGU7XG5leHBvcnRzLlN1c3BlbnNlID0gU3VzcGVuc2U7XG5leHBvcnRzLlN1c3BlbnNlTGlzdCA9IFN1c3BlbnNlTGlzdDtcbmV4cG9ydHMuaXNBc3luY01vZGUgPSBpc0FzeW5jTW9kZTtcbmV4cG9ydHMuaXNDb25jdXJyZW50TW9kZSA9IGlzQ29uY3VycmVudE1vZGU7XG5leHBvcnRzLmlzQ29udGV4dENvbnN1bWVyID0gaXNDb250ZXh0Q29uc3VtZXI7XG5leHBvcnRzLmlzQ29udGV4dFByb3ZpZGVyID0gaXNDb250ZXh0UHJvdmlkZXI7XG5leHBvcnRzLmlzRWxlbWVudCA9IGlzRWxlbWVudDtcbmV4cG9ydHMuaXNGb3J3YXJkUmVmID0gaXNGb3J3YXJkUmVmO1xuZXhwb3J0cy5pc0ZyYWdtZW50ID0gaXNGcmFnbWVudDtcbmV4cG9ydHMuaXNMYXp5ID0gaXNMYXp5O1xuZXhwb3J0cy5pc01lbW8gPSBpc01lbW87XG5leHBvcnRzLmlzUG9ydGFsID0gaXNQb3J0YWw7XG5leHBvcnRzLmlzUHJvZmlsZXIgPSBpc1Byb2ZpbGVyO1xuZXhwb3J0cy5pc1N0cmljdE1vZGUgPSBpc1N0cmljdE1vZGU7XG5leHBvcnRzLmlzU3VzcGVuc2UgPSBpc1N1c3BlbnNlO1xuZXhwb3J0cy5pc1N1c3BlbnNlTGlzdCA9IGlzU3VzcGVuc2VMaXN0O1xuZXhwb3J0cy5pc1ZhbGlkRWxlbWVudFR5cGUgPSBpc1ZhbGlkRWxlbWVudFR5cGU7XG5leHBvcnRzLnR5cGVPZiA9IHR5cGVPZjtcbiAgfSkoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1pcy5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1pcy5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdhcGF0aHknLFxuICBhdXRob3I6ICdqYW5uaWsgc2llYmVydCAoaHR0cHM6Ly9naXRodWIuY29tL2phbm5pa3MpJyxcbiAgYmFzZTAwOiAnIzAzMUExNicsXG4gIGJhc2UwMTogJyMwQjM0MkQnLFxuICBiYXNlMDI6ICcjMTg0RTQ1JyxcbiAgYmFzZTAzOiAnIzJCNjg1RScsXG4gIGJhc2UwNDogJyM1RjlDOTInLFxuICBiYXNlMDU6ICcjODFCNUFDJyxcbiAgYmFzZTA2OiAnI0E3Q0VDOCcsXG4gIGJhc2UwNzogJyNEMkU3RTQnLFxuICBiYXNlMDg6ICcjM0U5Njg4JyxcbiAgYmFzZTA5OiAnIzNFNzk5NicsXG4gIGJhc2UwQTogJyMzRTRDOTYnLFxuICBiYXNlMEI6ICcjODgzRTk2JyxcbiAgYmFzZTBDOiAnIzk2M0U0QycsXG4gIGJhc2UwRDogJyM5Njg4M0UnLFxuICBiYXNlMEU6ICcjNEM5NjNFJyxcbiAgYmFzZTBGOiAnIzNFOTY1Qidcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ2FzaGVzJyxcbiAgYXV0aG9yOiAnamFubmlrIHNpZWJlcnQgKGh0dHBzOi8vZ2l0aHViLmNvbS9qYW5uaWtzKScsXG4gIGJhc2UwMDogJyMxQzIwMjMnLFxuICBiYXNlMDE6ICcjMzkzRjQ1JyxcbiAgYmFzZTAyOiAnIzU2NUU2NScsXG4gIGJhc2UwMzogJyM3NDdDODQnLFxuICBiYXNlMDQ6ICcjQURCM0JBJyxcbiAgYmFzZTA1OiAnI0M3Q0NEMScsXG4gIGJhc2UwNjogJyNERkUyRTUnLFxuICBiYXNlMDc6ICcjRjNGNEY1JyxcbiAgYmFzZTA4OiAnI0M3QUU5NScsXG4gIGJhc2UwOTogJyNDN0M3OTUnLFxuICBiYXNlMEE6ICcjQUVDNzk1JyxcbiAgYmFzZTBCOiAnIzk1QzdBRScsXG4gIGJhc2UwQzogJyM5NUFFQzcnLFxuICBiYXNlMEQ6ICcjQUU5NUM3JyxcbiAgYmFzZTBFOiAnI0M3OTVBRScsXG4gIGJhc2UwRjogJyNDNzk1OTUnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdhdGVsaWVyIGR1bmUnLFxuICBhdXRob3I6ICdicmFtIGRlIGhhYW4gKGh0dHA6Ly9hdGVsaWVyYnJhbS5naXRodWIuaW8vc3ludGF4LWhpZ2hsaWdodGluZy9hdGVsaWVyLXNjaGVtZXMvZHVuZSknLFxuICBiYXNlMDA6ICcjMjAyMDFkJyxcbiAgYmFzZTAxOiAnIzI5MjgyNCcsXG4gIGJhc2UwMjogJyM2ZTZiNWUnLFxuICBiYXNlMDM6ICcjN2Q3YTY4JyxcbiAgYmFzZTA0OiAnIzk5OTU4MCcsXG4gIGJhc2UwNTogJyNhNmEyOGMnLFxuICBiYXNlMDY6ICcjZThlNGNmJyxcbiAgYmFzZTA3OiAnI2ZlZmJlYycsXG4gIGJhc2UwODogJyNkNzM3MzcnLFxuICBiYXNlMDk6ICcjYjY1NjExJyxcbiAgYmFzZTBBOiAnI2NmYjAxNycsXG4gIGJhc2UwQjogJyM2MGFjMzknLFxuICBiYXNlMEM6ICcjMWZhZDgzJyxcbiAgYmFzZTBEOiAnIzY2ODRlMScsXG4gIGJhc2UwRTogJyNiODU0ZDQnLFxuICBiYXNlMEY6ICcjZDQzNTUyJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnYXRlbGllciBmb3Jlc3QnLFxuICBhdXRob3I6ICdicmFtIGRlIGhhYW4gKGh0dHA6Ly9hdGVsaWVyYnJhbS5naXRodWIuaW8vc3ludGF4LWhpZ2hsaWdodGluZy9hdGVsaWVyLXNjaGVtZXMvZm9yZXN0KScsXG4gIGJhc2UwMDogJyMxYjE5MTgnLFxuICBiYXNlMDE6ICcjMmMyNDIxJyxcbiAgYmFzZTAyOiAnIzY4NjE1ZScsXG4gIGJhc2UwMzogJyM3NjZlNmInLFxuICBiYXNlMDQ6ICcjOWM5NDkxJyxcbiAgYmFzZTA1OiAnI2E4YTE5ZicsXG4gIGJhc2UwNjogJyNlNmUyZTAnLFxuICBiYXNlMDc6ICcjZjFlZmVlJyxcbiAgYmFzZTA4OiAnI2YyMmM0MCcsXG4gIGJhc2UwOTogJyNkZjUzMjAnLFxuICBiYXNlMEE6ICcjZDU5MTFhJyxcbiAgYmFzZTBCOiAnIzVhYjczOCcsXG4gIGJhc2UwQzogJyMwMGFkOWMnLFxuICBiYXNlMEQ6ICcjNDA3ZWU3JyxcbiAgYmFzZTBFOiAnIzY2NjZlYScsXG4gIGJhc2UwRjogJyNjMzNmZjMnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdhdGVsaWVyIGhlYXRoJyxcbiAgYXV0aG9yOiAnYnJhbSBkZSBoYWFuIChodHRwOi8vYXRlbGllcmJyYW0uZ2l0aHViLmlvL3N5bnRheC1oaWdobGlnaHRpbmcvYXRlbGllci1zY2hlbWVzL2hlYXRoKScsXG4gIGJhc2UwMDogJyMxYjE4MWInLFxuICBiYXNlMDE6ICcjMjkyMzI5JyxcbiAgYmFzZTAyOiAnIzY5NWQ2OScsXG4gIGJhc2UwMzogJyM3NzY5NzcnLFxuICBiYXNlMDQ6ICcjOWU4ZjllJyxcbiAgYmFzZTA1OiAnI2FiOWJhYicsXG4gIGJhc2UwNjogJyNkOGNhZDgnLFxuICBiYXNlMDc6ICcjZjdmM2Y3JyxcbiAgYmFzZTA4OiAnI2NhNDAyYicsXG4gIGJhc2UwOTogJyNhNjU5MjYnLFxuICBiYXNlMEE6ICcjYmI4YTM1JyxcbiAgYmFzZTBCOiAnIzM3OWEzNycsXG4gIGJhc2UwQzogJyMxNTkzOTMnLFxuICBiYXNlMEQ6ICcjNTE2YWVjJyxcbiAgYmFzZTBFOiAnIzdiNTljMCcsXG4gIGJhc2UwRjogJyNjYzMzY2MnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdhdGVsaWVyIGxha2VzaWRlJyxcbiAgYXV0aG9yOiAnYnJhbSBkZSBoYWFuIChodHRwOi8vYXRlbGllcmJyYW0uZ2l0aHViLmlvL3N5bnRheC1oaWdobGlnaHRpbmcvYXRlbGllci1zY2hlbWVzL2xha2VzaWRlLyknLFxuICBiYXNlMDA6ICcjMTYxYjFkJyxcbiAgYmFzZTAxOiAnIzFmMjkyZScsXG4gIGJhc2UwMjogJyM1MTZkN2InLFxuICBiYXNlMDM6ICcjNWE3YjhjJyxcbiAgYmFzZTA0OiAnIzcxOTVhOCcsXG4gIGJhc2UwNTogJyM3ZWEyYjQnLFxuICBiYXNlMDY6ICcjYzFlNGY2JyxcbiAgYmFzZTA3OiAnI2ViZjhmZicsXG4gIGJhc2UwODogJyNkMjJkNzInLFxuICBiYXNlMDk6ICcjOTM1YzI1JyxcbiAgYmFzZTBBOiAnIzhhOGEwZicsXG4gIGJhc2UwQjogJyM1NjhjM2InLFxuICBiYXNlMEM6ICcjMmQ4ZjZmJyxcbiAgYmFzZTBEOiAnIzI1N2ZhZCcsXG4gIGJhc2UwRTogJyM1ZDVkYjEnLFxuICBiYXNlMEY6ICcjYjcyZGQyJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnYXRlbGllciBzZWFzaWRlJyxcbiAgYXV0aG9yOiAnYnJhbSBkZSBoYWFuIChodHRwOi8vYXRlbGllcmJyYW0uZ2l0aHViLmlvL3N5bnRheC1oaWdobGlnaHRpbmcvYXRlbGllci1zY2hlbWVzL3NlYXNpZGUvKScsXG4gIGJhc2UwMDogJyMxMzE1MTMnLFxuICBiYXNlMDE6ICcjMjQyOTI0JyxcbiAgYmFzZTAyOiAnIzVlNmU1ZScsXG4gIGJhc2UwMzogJyM2ODdkNjgnLFxuICBiYXNlMDQ6ICcjODA5OTgwJyxcbiAgYmFzZTA1OiAnIzhjYTY4YycsXG4gIGJhc2UwNjogJyNjZmU4Y2YnLFxuICBiYXNlMDc6ICcjZjBmZmYwJyxcbiAgYmFzZTA4OiAnI2U2MTkzYycsXG4gIGJhc2UwOTogJyM4NzcxMWQnLFxuICBiYXNlMEE6ICcjYzNjMzIyJyxcbiAgYmFzZTBCOiAnIzI5YTMyOScsXG4gIGJhc2UwQzogJyMxOTk5YjMnLFxuICBiYXNlMEQ6ICcjM2Q2MmY1JyxcbiAgYmFzZTBFOiAnI2FkMmJlZScsXG4gIGJhc2UwRjogJyNlNjE5YzMnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdiZXNwaW4nLFxuICBhdXRob3I6ICdqYW4gdC4gc290dCcsXG4gIGJhc2UwMDogJyMyODIxMWMnLFxuICBiYXNlMDE6ICcjMzYzMTJlJyxcbiAgYmFzZTAyOiAnIzVlNWQ1YycsXG4gIGJhc2UwMzogJyM2NjY2NjYnLFxuICBiYXNlMDQ6ICcjNzk3OTc3JyxcbiAgYmFzZTA1OiAnIzhhODk4NicsXG4gIGJhc2UwNjogJyM5ZDliOTcnLFxuICBiYXNlMDc6ICcjYmFhZTllJyxcbiAgYmFzZTA4OiAnI2NmNmE0YycsXG4gIGJhc2UwOTogJyNjZjdkMzQnLFxuICBiYXNlMEE6ICcjZjllZTk4JyxcbiAgYmFzZTBCOiAnIzU0YmUwZCcsXG4gIGJhc2UwQzogJyNhZmM0ZGInLFxuICBiYXNlMEQ6ICcjNWVhNmVhJyxcbiAgYmFzZTBFOiAnIzliODU5ZCcsXG4gIGJhc2UwRjogJyM5MzcxMjEnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdicmV3ZXInLFxuICBhdXRob3I6ICd0aW1vdGjDqWUgcG9pc290IChodHRwOi8vZ2l0aHViLmNvbS90cG9pc290KScsXG4gIGJhc2UwMDogJyMwYzBkMGUnLFxuICBiYXNlMDE6ICcjMmUyZjMwJyxcbiAgYmFzZTAyOiAnIzUxNTI1MycsXG4gIGJhc2UwMzogJyM3Mzc0NzUnLFxuICBiYXNlMDQ6ICcjOTU5Njk3JyxcbiAgYmFzZTA1OiAnI2I3YjhiOScsXG4gIGJhc2UwNjogJyNkYWRiZGMnLFxuICBiYXNlMDc6ICcjZmNmZGZlJyxcbiAgYmFzZTA4OiAnI2UzMWExYycsXG4gIGJhc2UwOTogJyNlNjU1MGQnLFxuICBiYXNlMEE6ICcjZGNhMDYwJyxcbiAgYmFzZTBCOiAnIzMxYTM1NCcsXG4gIGJhc2UwQzogJyM4MGIxZDMnLFxuICBiYXNlMEQ6ICcjMzE4MmJkJyxcbiAgYmFzZTBFOiAnIzc1NmJiMScsXG4gIGJhc2UwRjogJyNiMTU5MjgnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdicmlnaHQnLFxuICBhdXRob3I6ICdjaHJpcyBrZW1wc29uIChodHRwOi8vY2hyaXNrZW1wc29uLmNvbSknLFxuICBiYXNlMDA6ICcjMDAwMDAwJyxcbiAgYmFzZTAxOiAnIzMwMzAzMCcsXG4gIGJhc2UwMjogJyM1MDUwNTAnLFxuICBiYXNlMDM6ICcjYjBiMGIwJyxcbiAgYmFzZTA0OiAnI2QwZDBkMCcsXG4gIGJhc2UwNTogJyNlMGUwZTAnLFxuICBiYXNlMDY6ICcjZjVmNWY1JyxcbiAgYmFzZTA3OiAnI2ZmZmZmZicsXG4gIGJhc2UwODogJyNmYjAxMjAnLFxuICBiYXNlMDk6ICcjZmM2ZDI0JyxcbiAgYmFzZTBBOiAnI2ZkYTMzMScsXG4gIGJhc2UwQjogJyNhMWM2NTknLFxuICBiYXNlMEM6ICcjNzZjN2I3JyxcbiAgYmFzZTBEOiAnIzZmYjNkMicsXG4gIGJhc2UwRTogJyNkMzgxYzMnLFxuICBiYXNlMEY6ICcjYmU2NDNjJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnY2hhbGsnLFxuICBhdXRob3I6ICdjaHJpcyBrZW1wc29uIChodHRwOi8vY2hyaXNrZW1wc29uLmNvbSknLFxuICBiYXNlMDA6ICcjMTUxNTE1JyxcbiAgYmFzZTAxOiAnIzIwMjAyMCcsXG4gIGJhc2UwMjogJyMzMDMwMzAnLFxuICBiYXNlMDM6ICcjNTA1MDUwJyxcbiAgYmFzZTA0OiAnI2IwYjBiMCcsXG4gIGJhc2UwNTogJyNkMGQwZDAnLFxuICBiYXNlMDY6ICcjZTBlMGUwJyxcbiAgYmFzZTA3OiAnI2Y1ZjVmNScsXG4gIGJhc2UwODogJyNmYjlmYjEnLFxuICBiYXNlMDk6ICcjZWRhOTg3JyxcbiAgYmFzZTBBOiAnI2RkYjI2ZicsXG4gIGJhc2UwQjogJyNhY2MyNjcnLFxuICBiYXNlMEM6ICcjMTJjZmMwJyxcbiAgYmFzZTBEOiAnIzZmYzJlZicsXG4gIGJhc2UwRTogJyNlMWEzZWUnLFxuICBiYXNlMEY6ICcjZGVhZjhmJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnY29kZXNjaG9vbCcsXG4gIGF1dGhvcjogJ2JyZXR0b2Y4NicsXG4gIGJhc2UwMDogJyMyMzJjMzEnLFxuICBiYXNlMDE6ICcjMWMzNjU3JyxcbiAgYmFzZTAyOiAnIzJhMzQzYScsXG4gIGJhc2UwMzogJyMzZjQ5NDQnLFxuICBiYXNlMDQ6ICcjODQ4OThjJyxcbiAgYmFzZTA1OiAnIzllYTdhNicsXG4gIGJhc2UwNjogJyNhN2NmYTMnLFxuICBiYXNlMDc6ICcjYjVkOGY2JyxcbiAgYmFzZTA4OiAnIzJhNTQ5MScsXG4gIGJhc2UwOTogJyM0MzgyMGQnLFxuICBiYXNlMEE6ICcjYTAzYjFlJyxcbiAgYmFzZTBCOiAnIzIzNzk4NicsXG4gIGJhc2UwQzogJyNiMDJmMzAnLFxuICBiYXNlMEQ6ICcjNDg0ZDc5JyxcbiAgYmFzZTBFOiAnI2M1OTgyMCcsXG4gIGJhc2UwRjogJyNjOTgzNDQnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdjb2xvcnMnLFxuICBhdXRob3I6ICdtcm1ycyAoaHR0cDovL2NscnMuY2MpJyxcbiAgYmFzZTAwOiAnIzExMTExMScsXG4gIGJhc2UwMTogJyMzMzMzMzMnLFxuICBiYXNlMDI6ICcjNTU1NTU1JyxcbiAgYmFzZTAzOiAnIzc3Nzc3NycsXG4gIGJhc2UwNDogJyM5OTk5OTknLFxuICBiYXNlMDU6ICcjYmJiYmJiJyxcbiAgYmFzZTA2OiAnI2RkZGRkZCcsXG4gIGJhc2UwNzogJyNmZmZmZmYnLFxuICBiYXNlMDg6ICcjZmY0MTM2JyxcbiAgYmFzZTA5OiAnI2ZmODUxYicsXG4gIGJhc2UwQTogJyNmZmRjMDAnLFxuICBiYXNlMEI6ICcjMmVjYzQwJyxcbiAgYmFzZTBDOiAnIzdmZGJmZicsXG4gIGJhc2UwRDogJyMwMDc0ZDknLFxuICBiYXNlMEU6ICcjYjEwZGM5JyxcbiAgYmFzZTBGOiAnIzg1MTQ0Yidcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ2RlZmF1bHQnLFxuICBhdXRob3I6ICdjaHJpcyBrZW1wc29uIChodHRwOi8vY2hyaXNrZW1wc29uLmNvbSknLFxuICBiYXNlMDA6ICcjMTgxODE4JyxcbiAgYmFzZTAxOiAnIzI4MjgyOCcsXG4gIGJhc2UwMjogJyMzODM4MzgnLFxuICBiYXNlMDM6ICcjNTg1ODU4JyxcbiAgYmFzZTA0OiAnI2I4YjhiOCcsXG4gIGJhc2UwNTogJyNkOGQ4ZDgnLFxuICBiYXNlMDY6ICcjZThlOGU4JyxcbiAgYmFzZTA3OiAnI2Y4ZjhmOCcsXG4gIGJhc2UwODogJyNhYjQ2NDInLFxuICBiYXNlMDk6ICcjZGM5NjU2JyxcbiAgYmFzZTBBOiAnI2Y3Y2E4OCcsXG4gIGJhc2UwQjogJyNhMWI1NmMnLFxuICBiYXNlMEM6ICcjODZjMWI5JyxcbiAgYmFzZTBEOiAnIzdjYWZjMicsXG4gIGJhc2UwRTogJyNiYThiYWYnLFxuICBiYXNlMEY6ICcjYTE2OTQ2J1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnZWlnaHRpZXMnLFxuICBhdXRob3I6ICdjaHJpcyBrZW1wc29uIChodHRwOi8vY2hyaXNrZW1wc29uLmNvbSknLFxuICBiYXNlMDA6ICcjMmQyZDJkJyxcbiAgYmFzZTAxOiAnIzM5MzkzOScsXG4gIGJhc2UwMjogJyM1MTUxNTEnLFxuICBiYXNlMDM6ICcjNzQ3MzY5JyxcbiAgYmFzZTA0OiAnI2EwOWY5MycsXG4gIGJhc2UwNTogJyNkM2QwYzgnLFxuICBiYXNlMDY6ICcjZThlNmRmJyxcbiAgYmFzZTA3OiAnI2YyZjBlYycsXG4gIGJhc2UwODogJyNmMjc3N2EnLFxuICBiYXNlMDk6ICcjZjk5MTU3JyxcbiAgYmFzZTBBOiAnI2ZmY2M2NicsXG4gIGJhc2UwQjogJyM5OWNjOTknLFxuICBiYXNlMEM6ICcjNjZjY2NjJyxcbiAgYmFzZTBEOiAnIzY2OTljYycsXG4gIGJhc2UwRTogJyNjYzk5Y2MnLFxuICBiYXNlMEY6ICcjZDI3YjUzJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnZW1iZXJzJyxcbiAgYXV0aG9yOiAnamFubmlrIHNpZWJlcnQgKGh0dHBzOi8vZ2l0aHViLmNvbS9qYW5uaWtzKScsXG4gIGJhc2UwMDogJyMxNjEzMEYnLFxuICBiYXNlMDE6ICcjMkMyNjIwJyxcbiAgYmFzZTAyOiAnIzQzM0IzMicsXG4gIGJhc2UwMzogJyM1QTUwNDcnLFxuICBiYXNlMDQ6ICcjOEE4MDc1JyxcbiAgYmFzZTA1OiAnI0EzOUE5MCcsXG4gIGJhc2UwNjogJyNCRUI2QUUnLFxuICBiYXNlMDc6ICcjREJENkQxJyxcbiAgYmFzZTA4OiAnIzgyNkQ1NycsXG4gIGJhc2UwOTogJyM4MjgyNTcnLFxuICBiYXNlMEE6ICcjNkQ4MjU3JyxcbiAgYmFzZTBCOiAnIzU3ODI2RCcsXG4gIGJhc2UwQzogJyM1NzZEODInLFxuICBiYXNlMEQ6ICcjNkQ1NzgyJyxcbiAgYmFzZTBFOiAnIzgyNTc2RCcsXG4gIGJhc2UwRjogJyM4MjU3NTcnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdmbGF0JyxcbiAgYXV0aG9yOiAnY2hyaXMga2VtcHNvbiAoaHR0cDovL2Nocmlza2VtcHNvbi5jb20pJyxcbiAgYmFzZTAwOiAnIzJDM0U1MCcsXG4gIGJhc2UwMTogJyMzNDQ5NUUnLFxuICBiYXNlMDI6ICcjN0Y4QzhEJyxcbiAgYmFzZTAzOiAnIzk1QTVBNicsXG4gIGJhc2UwNDogJyNCREMzQzcnLFxuICBiYXNlMDU6ICcjZTBlMGUwJyxcbiAgYmFzZTA2OiAnI2Y1ZjVmNScsXG4gIGJhc2UwNzogJyNFQ0YwRjEnLFxuICBiYXNlMDg6ICcjRTc0QzNDJyxcbiAgYmFzZTA5OiAnI0U2N0UyMicsXG4gIGJhc2UwQTogJyNGMUM0MEYnLFxuICBiYXNlMEI6ICcjMkVDQzcxJyxcbiAgYmFzZTBDOiAnIzFBQkM5QycsXG4gIGJhc2UwRDogJyMzNDk4REInLFxuICBiYXNlMEU6ICcjOUI1OUI2JyxcbiAgYmFzZTBGOiAnI2JlNjQzYydcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ2dvb2dsZScsXG4gIGF1dGhvcjogJ3NldGggd3JpZ2h0IChodHRwOi8vc2V0aGF3cmlnaHQuY29tKScsXG4gIGJhc2UwMDogJyMxZDFmMjEnLFxuICBiYXNlMDE6ICcjMjgyYTJlJyxcbiAgYmFzZTAyOiAnIzM3M2I0MScsXG4gIGJhc2UwMzogJyM5Njk4OTYnLFxuICBiYXNlMDQ6ICcjYjRiN2I0JyxcbiAgYmFzZTA1OiAnI2M1YzhjNicsXG4gIGJhc2UwNjogJyNlMGUwZTAnLFxuICBiYXNlMDc6ICcjZmZmZmZmJyxcbiAgYmFzZTA4OiAnI0NDMzQyQicsXG4gIGJhc2UwOTogJyNGOTZBMzgnLFxuICBiYXNlMEE6ICcjRkJBOTIyJyxcbiAgYmFzZTBCOiAnIzE5ODg0NCcsXG4gIGJhc2UwQzogJyMzOTcxRUQnLFxuICBiYXNlMEQ6ICcjMzk3MUVEJyxcbiAgYmFzZTBFOiAnI0EzNkFDNycsXG4gIGJhc2UwRjogJyMzOTcxRUQnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdncmF5c2NhbGUnLFxuICBhdXRob3I6ICdhbGV4YW5kcmUgZ2F2aW9saSAoaHR0cHM6Ly9naXRodWIuY29tL2FsZXh4Mi8pJyxcbiAgYmFzZTAwOiAnIzEwMTAxMCcsXG4gIGJhc2UwMTogJyMyNTI1MjUnLFxuICBiYXNlMDI6ICcjNDY0NjQ2JyxcbiAgYmFzZTAzOiAnIzUyNTI1MicsXG4gIGJhc2UwNDogJyNhYmFiYWInLFxuICBiYXNlMDU6ICcjYjliOWI5JyxcbiAgYmFzZTA2OiAnI2UzZTNlMycsXG4gIGJhc2UwNzogJyNmN2Y3ZjcnLFxuICBiYXNlMDg6ICcjN2M3YzdjJyxcbiAgYmFzZTA5OiAnIzk5OTk5OScsXG4gIGJhc2UwQTogJyNhMGEwYTAnLFxuICBiYXNlMEI6ICcjOGU4ZThlJyxcbiAgYmFzZTBDOiAnIzg2ODY4NicsXG4gIGJhc2UwRDogJyM2ODY4NjgnLFxuICBiYXNlMEU6ICcjNzQ3NDc0JyxcbiAgYmFzZTBGOiAnIzVlNWU1ZSdcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ2dyZWVuIHNjcmVlbicsXG4gIGF1dGhvcjogJ2NocmlzIGtlbXBzb24gKGh0dHA6Ly9jaHJpc2tlbXBzb24uY29tKScsXG4gIGJhc2UwMDogJyMwMDExMDAnLFxuICBiYXNlMDE6ICcjMDAzMzAwJyxcbiAgYmFzZTAyOiAnIzAwNTUwMCcsXG4gIGJhc2UwMzogJyMwMDc3MDAnLFxuICBiYXNlMDQ6ICcjMDA5OTAwJyxcbiAgYmFzZTA1OiAnIzAwYmIwMCcsXG4gIGJhc2UwNjogJyMwMGRkMDAnLFxuICBiYXNlMDc6ICcjMDBmZjAwJyxcbiAgYmFzZTA4OiAnIzAwNzcwMCcsXG4gIGJhc2UwOTogJyMwMDk5MDAnLFxuICBiYXNlMEE6ICcjMDA3NzAwJyxcbiAgYmFzZTBCOiAnIzAwYmIwMCcsXG4gIGJhc2UwQzogJyMwMDU1MDAnLFxuICBiYXNlMEQ6ICcjMDA5OTAwJyxcbiAgYmFzZTBFOiAnIzAwYmIwMCcsXG4gIGJhc2UwRjogJyMwMDU1MDAnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdoYXJtb25pYzE2JyxcbiAgYXV0aG9yOiAnamFubmlrIHNpZWJlcnQgKGh0dHBzOi8vZ2l0aHViLmNvbS9qYW5uaWtzKScsXG4gIGJhc2UwMDogJyMwYjFjMmMnLFxuICBiYXNlMDE6ICcjMjIzYjU0JyxcbiAgYmFzZTAyOiAnIzQwNWM3OScsXG4gIGJhc2UwMzogJyM2MjdlOTknLFxuICBiYXNlMDQ6ICcjYWFiY2NlJyxcbiAgYmFzZTA1OiAnI2NiZDZlMicsXG4gIGJhc2UwNjogJyNlNWViZjEnLFxuICBiYXNlMDc6ICcjZjdmOWZiJyxcbiAgYmFzZTA4OiAnI2JmOGI1NicsXG4gIGJhc2UwOTogJyNiZmJmNTYnLFxuICBiYXNlMEE6ICcjOGJiZjU2JyxcbiAgYmFzZTBCOiAnIzU2YmY4YicsXG4gIGJhc2UwQzogJyM1NjhiYmYnLFxuICBiYXNlMEQ6ICcjOGI1NmJmJyxcbiAgYmFzZTBFOiAnI2JmNTY4YicsXG4gIGJhc2UwRjogJyNiZjU2NTYnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdob3BzY290Y2gnLFxuICBhdXRob3I6ICdqYW4gdC4gc290dCcsXG4gIGJhc2UwMDogJyMzMjI5MzEnLFxuICBiYXNlMDE6ICcjNDMzYjQyJyxcbiAgYmFzZTAyOiAnIzVjNTQ1YicsXG4gIGJhc2UwMzogJyM3OTczNzknLFxuICBiYXNlMDQ6ICcjOTg5NDk4JyxcbiAgYmFzZTA1OiAnI2I5YjViOCcsXG4gIGJhc2UwNjogJyNkNWQzZDUnLFxuICBiYXNlMDc6ICcjZmZmZmZmJyxcbiAgYmFzZTA4OiAnI2RkNDY0YycsXG4gIGJhc2UwOTogJyNmZDhiMTknLFxuICBiYXNlMEE6ICcjZmRjYzU5JyxcbiAgYmFzZTBCOiAnIzhmYzEzZScsXG4gIGJhc2UwQzogJyMxNDliOTMnLFxuICBiYXNlMEQ6ICcjMTI5MGJmJyxcbiAgYmFzZTBFOiAnI2M4NWU3YycsXG4gIGJhc2UwRjogJyNiMzM1MDgnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmUob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmpbJ2RlZmF1bHQnXSA6IG9iajsgfVxuXG52YXIgX3RocmVlemVyb3R3b2ZvdXIgPSByZXF1aXJlKCcuL3RocmVlemVyb3R3b2ZvdXInKTtcblxuZXhwb3J0cy50aHJlZXplcm90d29mb3VyID0gX2ludGVyb3BSZXF1aXJlKF90aHJlZXplcm90d29mb3VyKTtcblxudmFyIF9hcGF0aHkgPSByZXF1aXJlKCcuL2FwYXRoeScpO1xuXG5leHBvcnRzLmFwYXRoeSA9IF9pbnRlcm9wUmVxdWlyZShfYXBhdGh5KTtcblxudmFyIF9hc2hlcyA9IHJlcXVpcmUoJy4vYXNoZXMnKTtcblxuZXhwb3J0cy5hc2hlcyA9IF9pbnRlcm9wUmVxdWlyZShfYXNoZXMpO1xuXG52YXIgX2F0ZWxpZXJEdW5lID0gcmVxdWlyZSgnLi9hdGVsaWVyLWR1bmUnKTtcblxuZXhwb3J0cy5hdGVsaWVyRHVuZSA9IF9pbnRlcm9wUmVxdWlyZShfYXRlbGllckR1bmUpO1xuXG52YXIgX2F0ZWxpZXJGb3Jlc3QgPSByZXF1aXJlKCcuL2F0ZWxpZXItZm9yZXN0Jyk7XG5cbmV4cG9ydHMuYXRlbGllckZvcmVzdCA9IF9pbnRlcm9wUmVxdWlyZShfYXRlbGllckZvcmVzdCk7XG5cbnZhciBfYXRlbGllckhlYXRoID0gcmVxdWlyZSgnLi9hdGVsaWVyLWhlYXRoJyk7XG5cbmV4cG9ydHMuYXRlbGllckhlYXRoID0gX2ludGVyb3BSZXF1aXJlKF9hdGVsaWVySGVhdGgpO1xuXG52YXIgX2F0ZWxpZXJMYWtlc2lkZSA9IHJlcXVpcmUoJy4vYXRlbGllci1sYWtlc2lkZScpO1xuXG5leHBvcnRzLmF0ZWxpZXJMYWtlc2lkZSA9IF9pbnRlcm9wUmVxdWlyZShfYXRlbGllckxha2VzaWRlKTtcblxudmFyIF9hdGVsaWVyU2Vhc2lkZSA9IHJlcXVpcmUoJy4vYXRlbGllci1zZWFzaWRlJyk7XG5cbmV4cG9ydHMuYXRlbGllclNlYXNpZGUgPSBfaW50ZXJvcFJlcXVpcmUoX2F0ZWxpZXJTZWFzaWRlKTtcblxudmFyIF9iZXNwaW4gPSByZXF1aXJlKCcuL2Jlc3BpbicpO1xuXG5leHBvcnRzLmJlc3BpbiA9IF9pbnRlcm9wUmVxdWlyZShfYmVzcGluKTtcblxudmFyIF9icmV3ZXIgPSByZXF1aXJlKCcuL2JyZXdlcicpO1xuXG5leHBvcnRzLmJyZXdlciA9IF9pbnRlcm9wUmVxdWlyZShfYnJld2VyKTtcblxudmFyIF9icmlnaHQgPSByZXF1aXJlKCcuL2JyaWdodCcpO1xuXG5leHBvcnRzLmJyaWdodCA9IF9pbnRlcm9wUmVxdWlyZShfYnJpZ2h0KTtcblxudmFyIF9jaGFsayA9IHJlcXVpcmUoJy4vY2hhbGsnKTtcblxuZXhwb3J0cy5jaGFsayA9IF9pbnRlcm9wUmVxdWlyZShfY2hhbGspO1xuXG52YXIgX2NvZGVzY2hvb2wgPSByZXF1aXJlKCcuL2NvZGVzY2hvb2wnKTtcblxuZXhwb3J0cy5jb2Rlc2Nob29sID0gX2ludGVyb3BSZXF1aXJlKF9jb2Rlc2Nob29sKTtcblxudmFyIF9jb2xvcnMgPSByZXF1aXJlKCcuL2NvbG9ycycpO1xuXG5leHBvcnRzLmNvbG9ycyA9IF9pbnRlcm9wUmVxdWlyZShfY29sb3JzKTtcblxudmFyIF9kZWZhdWx0ID0gcmVxdWlyZSgnLi9kZWZhdWx0Jyk7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IF9pbnRlcm9wUmVxdWlyZShfZGVmYXVsdCk7XG5cbnZhciBfZWlnaHRpZXMgPSByZXF1aXJlKCcuL2VpZ2h0aWVzJyk7XG5cbmV4cG9ydHMuZWlnaHRpZXMgPSBfaW50ZXJvcFJlcXVpcmUoX2VpZ2h0aWVzKTtcblxudmFyIF9lbWJlcnMgPSByZXF1aXJlKCcuL2VtYmVycycpO1xuXG5leHBvcnRzLmVtYmVycyA9IF9pbnRlcm9wUmVxdWlyZShfZW1iZXJzKTtcblxudmFyIF9mbGF0ID0gcmVxdWlyZSgnLi9mbGF0Jyk7XG5cbmV4cG9ydHMuZmxhdCA9IF9pbnRlcm9wUmVxdWlyZShfZmxhdCk7XG5cbnZhciBfZ29vZ2xlID0gcmVxdWlyZSgnLi9nb29nbGUnKTtcblxuZXhwb3J0cy5nb29nbGUgPSBfaW50ZXJvcFJlcXVpcmUoX2dvb2dsZSk7XG5cbnZhciBfZ3JheXNjYWxlID0gcmVxdWlyZSgnLi9ncmF5c2NhbGUnKTtcblxuZXhwb3J0cy5ncmF5c2NhbGUgPSBfaW50ZXJvcFJlcXVpcmUoX2dyYXlzY2FsZSk7XG5cbnZhciBfZ3JlZW5zY3JlZW4gPSByZXF1aXJlKCcuL2dyZWVuc2NyZWVuJyk7XG5cbmV4cG9ydHMuZ3JlZW5zY3JlZW4gPSBfaW50ZXJvcFJlcXVpcmUoX2dyZWVuc2NyZWVuKTtcblxudmFyIF9oYXJtb25pYyA9IHJlcXVpcmUoJy4vaGFybW9uaWMnKTtcblxuZXhwb3J0cy5oYXJtb25pYyA9IF9pbnRlcm9wUmVxdWlyZShfaGFybW9uaWMpO1xuXG52YXIgX2hvcHNjb3RjaCA9IHJlcXVpcmUoJy4vaG9wc2NvdGNoJyk7XG5cbmV4cG9ydHMuaG9wc2NvdGNoID0gX2ludGVyb3BSZXF1aXJlKF9ob3BzY290Y2gpO1xuXG52YXIgX2lzb3RvcGUgPSByZXF1aXJlKCcuL2lzb3RvcGUnKTtcblxuZXhwb3J0cy5pc290b3BlID0gX2ludGVyb3BSZXF1aXJlKF9pc290b3BlKTtcblxudmFyIF9tYXJyYWtlc2ggPSByZXF1aXJlKCcuL21hcnJha2VzaCcpO1xuXG5leHBvcnRzLm1hcnJha2VzaCA9IF9pbnRlcm9wUmVxdWlyZShfbWFycmFrZXNoKTtcblxudmFyIF9tb2NoYSA9IHJlcXVpcmUoJy4vbW9jaGEnKTtcblxuZXhwb3J0cy5tb2NoYSA9IF9pbnRlcm9wUmVxdWlyZShfbW9jaGEpO1xuXG52YXIgX21vbm9rYWkgPSByZXF1aXJlKCcuL21vbm9rYWknKTtcblxuZXhwb3J0cy5tb25va2FpID0gX2ludGVyb3BSZXF1aXJlKF9tb25va2FpKTtcblxudmFyIF9vY2VhbiA9IHJlcXVpcmUoJy4vb2NlYW4nKTtcblxuZXhwb3J0cy5vY2VhbiA9IF9pbnRlcm9wUmVxdWlyZShfb2NlYW4pO1xuXG52YXIgX3BhcmFpc28gPSByZXF1aXJlKCcuL3BhcmFpc28nKTtcblxuZXhwb3J0cy5wYXJhaXNvID0gX2ludGVyb3BSZXF1aXJlKF9wYXJhaXNvKTtcblxudmFyIF9wb3AgPSByZXF1aXJlKCcuL3BvcCcpO1xuXG5leHBvcnRzLnBvcCA9IF9pbnRlcm9wUmVxdWlyZShfcG9wKTtcblxudmFyIF9yYWlsc2Nhc3RzID0gcmVxdWlyZSgnLi9yYWlsc2Nhc3RzJyk7XG5cbmV4cG9ydHMucmFpbHNjYXN0cyA9IF9pbnRlcm9wUmVxdWlyZShfcmFpbHNjYXN0cyk7XG5cbnZhciBfc2hhcGVzaGlmdGVyID0gcmVxdWlyZSgnLi9zaGFwZXNoaWZ0ZXInKTtcblxuZXhwb3J0cy5zaGFwZXNoaWZ0ZXIgPSBfaW50ZXJvcFJlcXVpcmUoX3NoYXBlc2hpZnRlcik7XG5cbnZhciBfc29sYXJpemVkID0gcmVxdWlyZSgnLi9zb2xhcml6ZWQnKTtcblxuZXhwb3J0cy5zb2xhcml6ZWQgPSBfaW50ZXJvcFJlcXVpcmUoX3NvbGFyaXplZCk7XG5cbnZhciBfc3VtbWVyZnJ1aXQgPSByZXF1aXJlKCcuL3N1bW1lcmZydWl0Jyk7XG5cbmV4cG9ydHMuc3VtbWVyZnJ1aXQgPSBfaW50ZXJvcFJlcXVpcmUoX3N1bW1lcmZydWl0KTtcblxudmFyIF90b21vcnJvdyA9IHJlcXVpcmUoJy4vdG9tb3Jyb3cnKTtcblxuZXhwb3J0cy50b21vcnJvdyA9IF9pbnRlcm9wUmVxdWlyZShfdG9tb3Jyb3cpO1xuXG52YXIgX3R1YmUgPSByZXF1aXJlKCcuL3R1YmUnKTtcblxuZXhwb3J0cy50dWJlID0gX2ludGVyb3BSZXF1aXJlKF90dWJlKTtcblxudmFyIF90d2lsaWdodCA9IHJlcXVpcmUoJy4vdHdpbGlnaHQnKTtcblxuZXhwb3J0cy50d2lsaWdodCA9IF9pbnRlcm9wUmVxdWlyZShfdHdpbGlnaHQpOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnaXNvdG9wZScsXG4gIGF1dGhvcjogJ2phbiB0LiBzb3R0JyxcbiAgYmFzZTAwOiAnIzAwMDAwMCcsXG4gIGJhc2UwMTogJyM0MDQwNDAnLFxuICBiYXNlMDI6ICcjNjA2MDYwJyxcbiAgYmFzZTAzOiAnIzgwODA4MCcsXG4gIGJhc2UwNDogJyNjMGMwYzAnLFxuICBiYXNlMDU6ICcjZDBkMGQwJyxcbiAgYmFzZTA2OiAnI2UwZTBlMCcsXG4gIGJhc2UwNzogJyNmZmZmZmYnLFxuICBiYXNlMDg6ICcjZmYwMDAwJyxcbiAgYmFzZTA5OiAnI2ZmOTkwMCcsXG4gIGJhc2UwQTogJyNmZjAwOTknLFxuICBiYXNlMEI6ICcjMzNmZjAwJyxcbiAgYmFzZTBDOiAnIzAwZmZmZicsXG4gIGJhc2UwRDogJyMwMDY2ZmYnLFxuICBiYXNlMEU6ICcjY2MwMGZmJyxcbiAgYmFzZTBGOiAnIzMzMDBmZidcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ21hcnJha2VzaCcsXG4gIGF1dGhvcjogJ2FsZXhhbmRyZSBnYXZpb2xpIChodHRwOi8vZ2l0aHViLmNvbS9hbGV4eDIvKScsXG4gIGJhc2UwMDogJyMyMDE2MDInLFxuICBiYXNlMDE6ICcjMzAyZTAwJyxcbiAgYmFzZTAyOiAnIzVmNWIxNycsXG4gIGJhc2UwMzogJyM2YzY4MjMnLFxuICBiYXNlMDQ6ICcjODY4MTNiJyxcbiAgYmFzZTA1OiAnIzk0OGU0OCcsXG4gIGJhc2UwNjogJyNjY2MzN2EnLFxuICBiYXNlMDc6ICcjZmFmMGE1JyxcbiAgYmFzZTA4OiAnI2MzNTM1OScsXG4gIGJhc2UwOTogJyNiMzYxNDQnLFxuICBiYXNlMEE6ICcjYTg4MzM5JyxcbiAgYmFzZTBCOiAnIzE4OTc0ZScsXG4gIGJhc2UwQzogJyM3NWE3MzgnLFxuICBiYXNlMEQ6ICcjNDc3Y2ExJyxcbiAgYmFzZTBFOiAnIzg4NjhiMycsXG4gIGJhc2UwRjogJyNiMzU4OGUnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdtb2NoYScsXG4gIGF1dGhvcjogJ2NocmlzIGtlbXBzb24gKGh0dHA6Ly9jaHJpc2tlbXBzb24uY29tKScsXG4gIGJhc2UwMDogJyMzQjMyMjgnLFxuICBiYXNlMDE6ICcjNTM0NjM2JyxcbiAgYmFzZTAyOiAnIzY0NTI0MCcsXG4gIGJhc2UwMzogJyM3ZTcwNWEnLFxuICBiYXNlMDQ6ICcjYjhhZmFkJyxcbiAgYmFzZTA1OiAnI2QwYzhjNicsXG4gIGJhc2UwNjogJyNlOWUxZGQnLFxuICBiYXNlMDc6ICcjZjVlZWViJyxcbiAgYmFzZTA4OiAnI2NiNjA3NycsXG4gIGJhc2UwOTogJyNkMjhiNzEnLFxuICBiYXNlMEE6ICcjZjRiYzg3JyxcbiAgYmFzZTBCOiAnI2JlYjU1YicsXG4gIGJhc2UwQzogJyM3YmJkYTQnLFxuICBiYXNlMEQ6ICcjOGFiM2I1JyxcbiAgYmFzZTBFOiAnI2E4OWJiOScsXG4gIGJhc2UwRjogJyNiYjk1ODQnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdtb25va2FpJyxcbiAgYXV0aG9yOiAnd2ltZXIgaGF6ZW5iZXJnIChodHRwOi8vd3d3Lm1vbm9rYWkubmwpJyxcbiAgYmFzZTAwOiAnIzI3MjgyMicsXG4gIGJhc2UwMTogJyMzODM4MzAnLFxuICBiYXNlMDI6ICcjNDk0ODNlJyxcbiAgYmFzZTAzOiAnIzc1NzE1ZScsXG4gIGJhc2UwNDogJyNhNTlmODUnLFxuICBiYXNlMDU6ICcjZjhmOGYyJyxcbiAgYmFzZTA2OiAnI2Y1ZjRmMScsXG4gIGJhc2UwNzogJyNmOWY4ZjUnLFxuICBiYXNlMDg6ICcjZjkyNjcyJyxcbiAgYmFzZTA5OiAnI2ZkOTcxZicsXG4gIGJhc2UwQTogJyNmNGJmNzUnLFxuICBiYXNlMEI6ICcjYTZlMjJlJyxcbiAgYmFzZTBDOiAnI2ExZWZlNCcsXG4gIGJhc2UwRDogJyM2NmQ5ZWYnLFxuICBiYXNlMEU6ICcjYWU4MWZmJyxcbiAgYmFzZTBGOiAnI2NjNjYzMydcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ29jZWFuJyxcbiAgYXV0aG9yOiAnY2hyaXMga2VtcHNvbiAoaHR0cDovL2Nocmlza2VtcHNvbi5jb20pJyxcbiAgYmFzZTAwOiAnIzJiMzAzYicsXG4gIGJhc2UwMTogJyMzNDNkNDYnLFxuICBiYXNlMDI6ICcjNGY1YjY2JyxcbiAgYmFzZTAzOiAnIzY1NzM3ZScsXG4gIGJhc2UwNDogJyNhN2FkYmEnLFxuICBiYXNlMDU6ICcjYzBjNWNlJyxcbiAgYmFzZTA2OiAnI2RmZTFlOCcsXG4gIGJhc2UwNzogJyNlZmYxZjUnLFxuICBiYXNlMDg6ICcjYmY2MTZhJyxcbiAgYmFzZTA5OiAnI2QwODc3MCcsXG4gIGJhc2UwQTogJyNlYmNiOGInLFxuICBiYXNlMEI6ICcjYTNiZThjJyxcbiAgYmFzZTBDOiAnIzk2YjViNCcsXG4gIGJhc2UwRDogJyM4ZmExYjMnLFxuICBiYXNlMEU6ICcjYjQ4ZWFkJyxcbiAgYmFzZTBGOiAnI2FiNzk2Nydcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ3BhcmFpc28nLFxuICBhdXRob3I6ICdqYW4gdC4gc290dCcsXG4gIGJhc2UwMDogJyMyZjFlMmUnLFxuICBiYXNlMDE6ICcjNDEzMjNmJyxcbiAgYmFzZTAyOiAnIzRmNDI0YycsXG4gIGJhc2UwMzogJyM3NzZlNzEnLFxuICBiYXNlMDQ6ICcjOGQ4Njg3JyxcbiAgYmFzZTA1OiAnI2EzOWU5YicsXG4gIGJhc2UwNjogJyNiOWI2YjAnLFxuICBiYXNlMDc6ICcjZTdlOWRiJyxcbiAgYmFzZTA4OiAnI2VmNjE1NScsXG4gIGJhc2UwOTogJyNmOTliMTUnLFxuICBiYXNlMEE6ICcjZmVjNDE4JyxcbiAgYmFzZTBCOiAnIzQ4YjY4NScsXG4gIGJhc2UwQzogJyM1YmM0YmYnLFxuICBiYXNlMEQ6ICcjMDZiNmVmJyxcbiAgYmFzZTBFOiAnIzgxNWJhNCcsXG4gIGJhc2UwRjogJyNlOTZiYTgnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdwb3AnLFxuICBhdXRob3I6ICdjaHJpcyBrZW1wc29uIChodHRwOi8vY2hyaXNrZW1wc29uLmNvbSknLFxuICBiYXNlMDA6ICcjMDAwMDAwJyxcbiAgYmFzZTAxOiAnIzIwMjAyMCcsXG4gIGJhc2UwMjogJyMzMDMwMzAnLFxuICBiYXNlMDM6ICcjNTA1MDUwJyxcbiAgYmFzZTA0OiAnI2IwYjBiMCcsXG4gIGJhc2UwNTogJyNkMGQwZDAnLFxuICBiYXNlMDY6ICcjZTBlMGUwJyxcbiAgYmFzZTA3OiAnI2ZmZmZmZicsXG4gIGJhc2UwODogJyNlYjAwOGEnLFxuICBiYXNlMDk6ICcjZjI5MzMzJyxcbiAgYmFzZTBBOiAnI2Y4Y2ExMicsXG4gIGJhc2UwQjogJyMzN2IzNDknLFxuICBiYXNlMEM6ICcjMDBhYWJiJyxcbiAgYmFzZTBEOiAnIzBlNWE5NCcsXG4gIGJhc2UwRTogJyNiMzFlOGQnLFxuICBiYXNlMEY6ICcjN2EyZDAwJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAncmFpbHNjYXN0cycsXG4gIGF1dGhvcjogJ3J5YW4gYmF0ZXMgKGh0dHA6Ly9yYWlsc2Nhc3RzLmNvbSknLFxuICBiYXNlMDA6ICcjMmIyYjJiJyxcbiAgYmFzZTAxOiAnIzI3MjkzNScsXG4gIGJhc2UwMjogJyMzYTQwNTUnLFxuICBiYXNlMDM6ICcjNWE2NDdlJyxcbiAgYmFzZTA0OiAnI2Q0Y2ZjOScsXG4gIGJhc2UwNTogJyNlNmUxZGMnLFxuICBiYXNlMDY6ICcjZjRmMWVkJyxcbiAgYmFzZTA3OiAnI2Y5ZjdmMycsXG4gIGJhc2UwODogJyNkYTQ5MzknLFxuICBiYXNlMDk6ICcjY2M3ODMzJyxcbiAgYmFzZTBBOiAnI2ZmYzY2ZCcsXG4gIGJhc2UwQjogJyNhNWMyNjEnLFxuICBiYXNlMEM6ICcjNTE5ZjUwJyxcbiAgYmFzZTBEOiAnIzZkOWNiZScsXG4gIGJhc2UwRTogJyNiNmIzZWInLFxuICBiYXNlMEY6ICcjYmM5NDU4J1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnc2hhcGVzaGlmdGVyJyxcbiAgYXV0aG9yOiAndHlsZXIgYmVuemlnZXIgKGh0dHA6Ly90eWJlbnouY29tKScsXG4gIGJhc2UwMDogJyMwMDAwMDAnLFxuICBiYXNlMDE6ICcjMDQwNDA0JyxcbiAgYmFzZTAyOiAnIzEwMjAxNScsXG4gIGJhc2UwMzogJyMzNDM0MzQnLFxuICBiYXNlMDQ6ICcjNTU1NTU1JyxcbiAgYmFzZTA1OiAnI2FiYWJhYicsXG4gIGJhc2UwNjogJyNlMGUwZTAnLFxuICBiYXNlMDc6ICcjZjlmOWY5JyxcbiAgYmFzZTA4OiAnI2U5MmYyZicsXG4gIGJhc2UwOTogJyNlMDk0NDgnLFxuICBiYXNlMEE6ICcjZGRkZDEzJyxcbiAgYmFzZTBCOiAnIzBlZDgzOScsXG4gIGJhc2UwQzogJyMyM2VkZGEnLFxuICBiYXNlMEQ6ICcjM2I0OGUzJyxcbiAgYmFzZTBFOiAnI2Y5OTZlMicsXG4gIGJhc2UwRjogJyM2OTU0MmQnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdzb2xhcml6ZWQnLFxuICBhdXRob3I6ICdldGhhbiBzY2hvb25vdmVyIChodHRwOi8vZXRoYW5zY2hvb25vdmVyLmNvbS9zb2xhcml6ZWQpJyxcbiAgYmFzZTAwOiAnIzAwMmIzNicsXG4gIGJhc2UwMTogJyMwNzM2NDInLFxuICBiYXNlMDI6ICcjNTg2ZTc1JyxcbiAgYmFzZTAzOiAnIzY1N2I4MycsXG4gIGJhc2UwNDogJyM4Mzk0OTYnLFxuICBiYXNlMDU6ICcjOTNhMWExJyxcbiAgYmFzZTA2OiAnI2VlZThkNScsXG4gIGJhc2UwNzogJyNmZGY2ZTMnLFxuICBiYXNlMDg6ICcjZGMzMjJmJyxcbiAgYmFzZTA5OiAnI2NiNGIxNicsXG4gIGJhc2UwQTogJyNiNTg5MDAnLFxuICBiYXNlMEI6ICcjODU5OTAwJyxcbiAgYmFzZTBDOiAnIzJhYTE5OCcsXG4gIGJhc2UwRDogJyMyNjhiZDInLFxuICBiYXNlMEU6ICcjNmM3MWM0JyxcbiAgYmFzZTBGOiAnI2QzMzY4Midcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ3N1bW1lcmZydWl0JyxcbiAgYXV0aG9yOiAnY2hyaXN0b3BoZXIgY29ybGV5IChodHRwOi8vY3Njb3JsZXkuZ2l0aHViLmlvLyknLFxuICBiYXNlMDA6ICcjMTUxNTE1JyxcbiAgYmFzZTAxOiAnIzIwMjAyMCcsXG4gIGJhc2UwMjogJyMzMDMwMzAnLFxuICBiYXNlMDM6ICcjNTA1MDUwJyxcbiAgYmFzZTA0OiAnI0IwQjBCMCcsXG4gIGJhc2UwNTogJyNEMEQwRDAnLFxuICBiYXNlMDY6ICcjRTBFMEUwJyxcbiAgYmFzZTA3OiAnI0ZGRkZGRicsXG4gIGJhc2UwODogJyNGRjAwODYnLFxuICBiYXNlMDk6ICcjRkQ4OTAwJyxcbiAgYmFzZTBBOiAnI0FCQTgwMCcsXG4gIGJhc2UwQjogJyMwMEM5MTgnLFxuICBiYXNlMEM6ICcjMWZhYWFhJyxcbiAgYmFzZTBEOiAnIzM3NzdFNicsXG4gIGJhc2UwRTogJyNBRDAwQTEnLFxuICBiYXNlMEY6ICcjY2M2NjMzJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAndGhyZWV6ZXJvdHdvZm91cicsXG4gIGF1dGhvcjogJ2phbiB0LiBzb3R0IChodHRwOi8vZ2l0aHViLmNvbS9pZGxlYmVyZyknLFxuICBiYXNlMDA6ICcjMDkwMzAwJyxcbiAgYmFzZTAxOiAnIzNhMzQzMicsXG4gIGJhc2UwMjogJyM0YTQ1NDMnLFxuICBiYXNlMDM6ICcjNWM1ODU1JyxcbiAgYmFzZTA0OiAnIzgwN2Q3YycsXG4gIGJhc2UwNTogJyNhNWEyYTInLFxuICBiYXNlMDY6ICcjZDZkNWQ0JyxcbiAgYmFzZTA3OiAnI2Y3ZjdmNycsXG4gIGJhc2UwODogJyNkYjJkMjAnLFxuICBiYXNlMDk6ICcjZThiYmQwJyxcbiAgYmFzZTBBOiAnI2ZkZWQwMicsXG4gIGJhc2UwQjogJyMwMWEyNTInLFxuICBiYXNlMEM6ICcjYjVlNGY0JyxcbiAgYmFzZTBEOiAnIzAxYTBlNCcsXG4gIGJhc2UwRTogJyNhMTZhOTQnLFxuICBiYXNlMEY6ICcjY2RhYjUzJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAndG9tb3Jyb3cnLFxuICBhdXRob3I6ICdjaHJpcyBrZW1wc29uIChodHRwOi8vY2hyaXNrZW1wc29uLmNvbSknLFxuICBiYXNlMDA6ICcjMWQxZjIxJyxcbiAgYmFzZTAxOiAnIzI4MmEyZScsXG4gIGJhc2UwMjogJyMzNzNiNDEnLFxuICBiYXNlMDM6ICcjOTY5ODk2JyxcbiAgYmFzZTA0OiAnI2I0YjdiNCcsXG4gIGJhc2UwNTogJyNjNWM4YzYnLFxuICBiYXNlMDY6ICcjZTBlMGUwJyxcbiAgYmFzZTA3OiAnI2ZmZmZmZicsXG4gIGJhc2UwODogJyNjYzY2NjYnLFxuICBiYXNlMDk6ICcjZGU5MzVmJyxcbiAgYmFzZTBBOiAnI2YwYzY3NCcsXG4gIGJhc2UwQjogJyNiNWJkNjgnLFxuICBiYXNlMEM6ICcjOGFiZWI3JyxcbiAgYmFzZTBEOiAnIzgxYTJiZScsXG4gIGJhc2UwRTogJyNiMjk0YmInLFxuICBiYXNlMEY6ICcjYTM2ODVhJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnbG9uZG9uIHR1YmUnLFxuICBhdXRob3I6ICdqYW4gdC4gc290dCcsXG4gIGJhc2UwMDogJyMyMzFmMjAnLFxuICBiYXNlMDE6ICcjMWMzZjk1JyxcbiAgYmFzZTAyOiAnIzVhNTc1OCcsXG4gIGJhc2UwMzogJyM3MzcxNzEnLFxuICBiYXNlMDQ6ICcjOTU5Y2ExJyxcbiAgYmFzZTA1OiAnI2Q5ZDhkOCcsXG4gIGJhc2UwNjogJyNlN2U3ZTgnLFxuICBiYXNlMDc6ICcjZmZmZmZmJyxcbiAgYmFzZTA4OiAnI2VlMmUyNCcsXG4gIGJhc2UwOTogJyNmMzg2YTEnLFxuICBiYXNlMEE6ICcjZmZkMjA0JyxcbiAgYmFzZTBCOiAnIzAwODUzZScsXG4gIGJhc2UwQzogJyM4NWNlYmMnLFxuICBiYXNlMEQ6ICcjMDA5ZGRjJyxcbiAgYmFzZTBFOiAnIzk4MDA1ZCcsXG4gIGJhc2UwRjogJyNiMDYxMTAnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICd0d2lsaWdodCcsXG4gIGF1dGhvcjogJ2RhdmlkIGhhcnQgKGh0dHA6Ly9oYXJ0LWRldi5jb20pJyxcbiAgYmFzZTAwOiAnIzFlMWUxZScsXG4gIGJhc2UwMTogJyMzMjM1MzcnLFxuICBiYXNlMDI6ICcjNDY0YjUwJyxcbiAgYmFzZTAzOiAnIzVmNWE2MCcsXG4gIGJhc2UwNDogJyM4MzgxODQnLFxuICBiYXNlMDU6ICcjYTdhN2E3JyxcbiAgYmFzZTA2OiAnI2MzYzNjMycsXG4gIGJhc2UwNzogJyNmZmZmZmYnLFxuICBiYXNlMDg6ICcjY2Y2YTRjJyxcbiAgYmFzZTA5OiAnI2NkYTg2OScsXG4gIGJhc2UwQTogJyNmOWVlOTgnLFxuICBiYXNlMEI6ICcjOGY5ZDZhJyxcbiAgYmFzZTBDOiAnI2FmYzRkYicsXG4gIGJhc2UwRDogJyM3NTg3YTYnLFxuICBiYXNlMEU6ICcjOWI4NTlkJyxcbiAgYmFzZTBGOiAnIzliNzAzZidcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCdcclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG5cdFwiYWxpY2VibHVlXCI6IFsyNDAsIDI0OCwgMjU1XSxcclxuXHRcImFudGlxdWV3aGl0ZVwiOiBbMjUwLCAyMzUsIDIxNV0sXHJcblx0XCJhcXVhXCI6IFswLCAyNTUsIDI1NV0sXHJcblx0XCJhcXVhbWFyaW5lXCI6IFsxMjcsIDI1NSwgMjEyXSxcclxuXHRcImF6dXJlXCI6IFsyNDAsIDI1NSwgMjU1XSxcclxuXHRcImJlaWdlXCI6IFsyNDUsIDI0NSwgMjIwXSxcclxuXHRcImJpc3F1ZVwiOiBbMjU1LCAyMjgsIDE5Nl0sXHJcblx0XCJibGFja1wiOiBbMCwgMCwgMF0sXHJcblx0XCJibGFuY2hlZGFsbW9uZFwiOiBbMjU1LCAyMzUsIDIwNV0sXHJcblx0XCJibHVlXCI6IFswLCAwLCAyNTVdLFxyXG5cdFwiYmx1ZXZpb2xldFwiOiBbMTM4LCA0MywgMjI2XSxcclxuXHRcImJyb3duXCI6IFsxNjUsIDQyLCA0Ml0sXHJcblx0XCJidXJseXdvb2RcIjogWzIyMiwgMTg0LCAxMzVdLFxyXG5cdFwiY2FkZXRibHVlXCI6IFs5NSwgMTU4LCAxNjBdLFxyXG5cdFwiY2hhcnRyZXVzZVwiOiBbMTI3LCAyNTUsIDBdLFxyXG5cdFwiY2hvY29sYXRlXCI6IFsyMTAsIDEwNSwgMzBdLFxyXG5cdFwiY29yYWxcIjogWzI1NSwgMTI3LCA4MF0sXHJcblx0XCJjb3JuZmxvd2VyYmx1ZVwiOiBbMTAwLCAxNDksIDIzN10sXHJcblx0XCJjb3Juc2lsa1wiOiBbMjU1LCAyNDgsIDIyMF0sXHJcblx0XCJjcmltc29uXCI6IFsyMjAsIDIwLCA2MF0sXHJcblx0XCJjeWFuXCI6IFswLCAyNTUsIDI1NV0sXHJcblx0XCJkYXJrYmx1ZVwiOiBbMCwgMCwgMTM5XSxcclxuXHRcImRhcmtjeWFuXCI6IFswLCAxMzksIDEzOV0sXHJcblx0XCJkYXJrZ29sZGVucm9kXCI6IFsxODQsIDEzNCwgMTFdLFxyXG5cdFwiZGFya2dyYXlcIjogWzE2OSwgMTY5LCAxNjldLFxyXG5cdFwiZGFya2dyZWVuXCI6IFswLCAxMDAsIDBdLFxyXG5cdFwiZGFya2dyZXlcIjogWzE2OSwgMTY5LCAxNjldLFxyXG5cdFwiZGFya2toYWtpXCI6IFsxODksIDE4MywgMTA3XSxcclxuXHRcImRhcmttYWdlbnRhXCI6IFsxMzksIDAsIDEzOV0sXHJcblx0XCJkYXJrb2xpdmVncmVlblwiOiBbODUsIDEwNywgNDddLFxyXG5cdFwiZGFya29yYW5nZVwiOiBbMjU1LCAxNDAsIDBdLFxyXG5cdFwiZGFya29yY2hpZFwiOiBbMTUzLCA1MCwgMjA0XSxcclxuXHRcImRhcmtyZWRcIjogWzEzOSwgMCwgMF0sXHJcblx0XCJkYXJrc2FsbW9uXCI6IFsyMzMsIDE1MCwgMTIyXSxcclxuXHRcImRhcmtzZWFncmVlblwiOiBbMTQzLCAxODgsIDE0M10sXHJcblx0XCJkYXJrc2xhdGVibHVlXCI6IFs3MiwgNjEsIDEzOV0sXHJcblx0XCJkYXJrc2xhdGVncmF5XCI6IFs0NywgNzksIDc5XSxcclxuXHRcImRhcmtzbGF0ZWdyZXlcIjogWzQ3LCA3OSwgNzldLFxyXG5cdFwiZGFya3R1cnF1b2lzZVwiOiBbMCwgMjA2LCAyMDldLFxyXG5cdFwiZGFya3Zpb2xldFwiOiBbMTQ4LCAwLCAyMTFdLFxyXG5cdFwiZGVlcHBpbmtcIjogWzI1NSwgMjAsIDE0N10sXHJcblx0XCJkZWVwc2t5Ymx1ZVwiOiBbMCwgMTkxLCAyNTVdLFxyXG5cdFwiZGltZ3JheVwiOiBbMTA1LCAxMDUsIDEwNV0sXHJcblx0XCJkaW1ncmV5XCI6IFsxMDUsIDEwNSwgMTA1XSxcclxuXHRcImRvZGdlcmJsdWVcIjogWzMwLCAxNDQsIDI1NV0sXHJcblx0XCJmaXJlYnJpY2tcIjogWzE3OCwgMzQsIDM0XSxcclxuXHRcImZsb3JhbHdoaXRlXCI6IFsyNTUsIDI1MCwgMjQwXSxcclxuXHRcImZvcmVzdGdyZWVuXCI6IFszNCwgMTM5LCAzNF0sXHJcblx0XCJmdWNoc2lhXCI6IFsyNTUsIDAsIDI1NV0sXHJcblx0XCJnYWluc2Jvcm9cIjogWzIyMCwgMjIwLCAyMjBdLFxyXG5cdFwiZ2hvc3R3aGl0ZVwiOiBbMjQ4LCAyNDgsIDI1NV0sXHJcblx0XCJnb2xkXCI6IFsyNTUsIDIxNSwgMF0sXHJcblx0XCJnb2xkZW5yb2RcIjogWzIxOCwgMTY1LCAzMl0sXHJcblx0XCJncmF5XCI6IFsxMjgsIDEyOCwgMTI4XSxcclxuXHRcImdyZWVuXCI6IFswLCAxMjgsIDBdLFxyXG5cdFwiZ3JlZW55ZWxsb3dcIjogWzE3MywgMjU1LCA0N10sXHJcblx0XCJncmV5XCI6IFsxMjgsIDEyOCwgMTI4XSxcclxuXHRcImhvbmV5ZGV3XCI6IFsyNDAsIDI1NSwgMjQwXSxcclxuXHRcImhvdHBpbmtcIjogWzI1NSwgMTA1LCAxODBdLFxyXG5cdFwiaW5kaWFucmVkXCI6IFsyMDUsIDkyLCA5Ml0sXHJcblx0XCJpbmRpZ29cIjogWzc1LCAwLCAxMzBdLFxyXG5cdFwiaXZvcnlcIjogWzI1NSwgMjU1LCAyNDBdLFxyXG5cdFwia2hha2lcIjogWzI0MCwgMjMwLCAxNDBdLFxyXG5cdFwibGF2ZW5kZXJcIjogWzIzMCwgMjMwLCAyNTBdLFxyXG5cdFwibGF2ZW5kZXJibHVzaFwiOiBbMjU1LCAyNDAsIDI0NV0sXHJcblx0XCJsYXduZ3JlZW5cIjogWzEyNCwgMjUyLCAwXSxcclxuXHRcImxlbW9uY2hpZmZvblwiOiBbMjU1LCAyNTAsIDIwNV0sXHJcblx0XCJsaWdodGJsdWVcIjogWzE3MywgMjE2LCAyMzBdLFxyXG5cdFwibGlnaHRjb3JhbFwiOiBbMjQwLCAxMjgsIDEyOF0sXHJcblx0XCJsaWdodGN5YW5cIjogWzIyNCwgMjU1LCAyNTVdLFxyXG5cdFwibGlnaHRnb2xkZW5yb2R5ZWxsb3dcIjogWzI1MCwgMjUwLCAyMTBdLFxyXG5cdFwibGlnaHRncmF5XCI6IFsyMTEsIDIxMSwgMjExXSxcclxuXHRcImxpZ2h0Z3JlZW5cIjogWzE0NCwgMjM4LCAxNDRdLFxyXG5cdFwibGlnaHRncmV5XCI6IFsyMTEsIDIxMSwgMjExXSxcclxuXHRcImxpZ2h0cGlua1wiOiBbMjU1LCAxODIsIDE5M10sXHJcblx0XCJsaWdodHNhbG1vblwiOiBbMjU1LCAxNjAsIDEyMl0sXHJcblx0XCJsaWdodHNlYWdyZWVuXCI6IFszMiwgMTc4LCAxNzBdLFxyXG5cdFwibGlnaHRza3libHVlXCI6IFsxMzUsIDIwNiwgMjUwXSxcclxuXHRcImxpZ2h0c2xhdGVncmF5XCI6IFsxMTksIDEzNiwgMTUzXSxcclxuXHRcImxpZ2h0c2xhdGVncmV5XCI6IFsxMTksIDEzNiwgMTUzXSxcclxuXHRcImxpZ2h0c3RlZWxibHVlXCI6IFsxNzYsIDE5NiwgMjIyXSxcclxuXHRcImxpZ2h0eWVsbG93XCI6IFsyNTUsIDI1NSwgMjI0XSxcclxuXHRcImxpbWVcIjogWzAsIDI1NSwgMF0sXHJcblx0XCJsaW1lZ3JlZW5cIjogWzUwLCAyMDUsIDUwXSxcclxuXHRcImxpbmVuXCI6IFsyNTAsIDI0MCwgMjMwXSxcclxuXHRcIm1hZ2VudGFcIjogWzI1NSwgMCwgMjU1XSxcclxuXHRcIm1hcm9vblwiOiBbMTI4LCAwLCAwXSxcclxuXHRcIm1lZGl1bWFxdWFtYXJpbmVcIjogWzEwMiwgMjA1LCAxNzBdLFxyXG5cdFwibWVkaXVtYmx1ZVwiOiBbMCwgMCwgMjA1XSxcclxuXHRcIm1lZGl1bW9yY2hpZFwiOiBbMTg2LCA4NSwgMjExXSxcclxuXHRcIm1lZGl1bXB1cnBsZVwiOiBbMTQ3LCAxMTIsIDIxOV0sXHJcblx0XCJtZWRpdW1zZWFncmVlblwiOiBbNjAsIDE3OSwgMTEzXSxcclxuXHRcIm1lZGl1bXNsYXRlYmx1ZVwiOiBbMTIzLCAxMDQsIDIzOF0sXHJcblx0XCJtZWRpdW1zcHJpbmdncmVlblwiOiBbMCwgMjUwLCAxNTRdLFxyXG5cdFwibWVkaXVtdHVycXVvaXNlXCI6IFs3MiwgMjA5LCAyMDRdLFxyXG5cdFwibWVkaXVtdmlvbGV0cmVkXCI6IFsxOTksIDIxLCAxMzNdLFxyXG5cdFwibWlkbmlnaHRibHVlXCI6IFsyNSwgMjUsIDExMl0sXHJcblx0XCJtaW50Y3JlYW1cIjogWzI0NSwgMjU1LCAyNTBdLFxyXG5cdFwibWlzdHlyb3NlXCI6IFsyNTUsIDIyOCwgMjI1XSxcclxuXHRcIm1vY2Nhc2luXCI6IFsyNTUsIDIyOCwgMTgxXSxcclxuXHRcIm5hdmFqb3doaXRlXCI6IFsyNTUsIDIyMiwgMTczXSxcclxuXHRcIm5hdnlcIjogWzAsIDAsIDEyOF0sXHJcblx0XCJvbGRsYWNlXCI6IFsyNTMsIDI0NSwgMjMwXSxcclxuXHRcIm9saXZlXCI6IFsxMjgsIDEyOCwgMF0sXHJcblx0XCJvbGl2ZWRyYWJcIjogWzEwNywgMTQyLCAzNV0sXHJcblx0XCJvcmFuZ2VcIjogWzI1NSwgMTY1LCAwXSxcclxuXHRcIm9yYW5nZXJlZFwiOiBbMjU1LCA2OSwgMF0sXHJcblx0XCJvcmNoaWRcIjogWzIxOCwgMTEyLCAyMTRdLFxyXG5cdFwicGFsZWdvbGRlbnJvZFwiOiBbMjM4LCAyMzIsIDE3MF0sXHJcblx0XCJwYWxlZ3JlZW5cIjogWzE1MiwgMjUxLCAxNTJdLFxyXG5cdFwicGFsZXR1cnF1b2lzZVwiOiBbMTc1LCAyMzgsIDIzOF0sXHJcblx0XCJwYWxldmlvbGV0cmVkXCI6IFsyMTksIDExMiwgMTQ3XSxcclxuXHRcInBhcGF5YXdoaXBcIjogWzI1NSwgMjM5LCAyMTNdLFxyXG5cdFwicGVhY2hwdWZmXCI6IFsyNTUsIDIxOCwgMTg1XSxcclxuXHRcInBlcnVcIjogWzIwNSwgMTMzLCA2M10sXHJcblx0XCJwaW5rXCI6IFsyNTUsIDE5MiwgMjAzXSxcclxuXHRcInBsdW1cIjogWzIyMSwgMTYwLCAyMjFdLFxyXG5cdFwicG93ZGVyYmx1ZVwiOiBbMTc2LCAyMjQsIDIzMF0sXHJcblx0XCJwdXJwbGVcIjogWzEyOCwgMCwgMTI4XSxcclxuXHRcInJlYmVjY2FwdXJwbGVcIjogWzEwMiwgNTEsIDE1M10sXHJcblx0XCJyZWRcIjogWzI1NSwgMCwgMF0sXHJcblx0XCJyb3N5YnJvd25cIjogWzE4OCwgMTQzLCAxNDNdLFxyXG5cdFwicm95YWxibHVlXCI6IFs2NSwgMTA1LCAyMjVdLFxyXG5cdFwic2FkZGxlYnJvd25cIjogWzEzOSwgNjksIDE5XSxcclxuXHRcInNhbG1vblwiOiBbMjUwLCAxMjgsIDExNF0sXHJcblx0XCJzYW5keWJyb3duXCI6IFsyNDQsIDE2NCwgOTZdLFxyXG5cdFwic2VhZ3JlZW5cIjogWzQ2LCAxMzksIDg3XSxcclxuXHRcInNlYXNoZWxsXCI6IFsyNTUsIDI0NSwgMjM4XSxcclxuXHRcInNpZW5uYVwiOiBbMTYwLCA4MiwgNDVdLFxyXG5cdFwic2lsdmVyXCI6IFsxOTIsIDE5MiwgMTkyXSxcclxuXHRcInNreWJsdWVcIjogWzEzNSwgMjA2LCAyMzVdLFxyXG5cdFwic2xhdGVibHVlXCI6IFsxMDYsIDkwLCAyMDVdLFxyXG5cdFwic2xhdGVncmF5XCI6IFsxMTIsIDEyOCwgMTQ0XSxcclxuXHRcInNsYXRlZ3JleVwiOiBbMTEyLCAxMjgsIDE0NF0sXHJcblx0XCJzbm93XCI6IFsyNTUsIDI1MCwgMjUwXSxcclxuXHRcInNwcmluZ2dyZWVuXCI6IFswLCAyNTUsIDEyN10sXHJcblx0XCJzdGVlbGJsdWVcIjogWzcwLCAxMzAsIDE4MF0sXHJcblx0XCJ0YW5cIjogWzIxMCwgMTgwLCAxNDBdLFxyXG5cdFwidGVhbFwiOiBbMCwgMTI4LCAxMjhdLFxyXG5cdFwidGhpc3RsZVwiOiBbMjE2LCAxOTEsIDIxNl0sXHJcblx0XCJ0b21hdG9cIjogWzI1NSwgOTksIDcxXSxcclxuXHRcInR1cnF1b2lzZVwiOiBbNjQsIDIyNCwgMjA4XSxcclxuXHRcInZpb2xldFwiOiBbMjM4LCAxMzAsIDIzOF0sXHJcblx0XCJ3aGVhdFwiOiBbMjQ1LCAyMjIsIDE3OV0sXHJcblx0XCJ3aGl0ZVwiOiBbMjU1LCAyNTUsIDI1NV0sXHJcblx0XCJ3aGl0ZXNtb2tlXCI6IFsyNDUsIDI0NSwgMjQ1XSxcclxuXHRcInllbGxvd1wiOiBbMjU1LCAyNTUsIDBdLFxyXG5cdFwieWVsbG93Z3JlZW5cIjogWzE1NCwgMjA1LCA1MF1cclxufTtcclxuIiwiLyogTUlUIGxpY2Vuc2UgKi9cbnZhciBjb2xvck5hbWVzID0gcmVxdWlyZSgnY29sb3ItbmFtZScpO1xudmFyIHN3aXp6bGUgPSByZXF1aXJlKCdzaW1wbGUtc3dpenpsZScpO1xudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0Lmhhc093blByb3BlcnR5O1xuXG52YXIgcmV2ZXJzZU5hbWVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuLy8gY3JlYXRlIGEgbGlzdCBvZiByZXZlcnNlIGNvbG9yIG5hbWVzXG5mb3IgKHZhciBuYW1lIGluIGNvbG9yTmFtZXMpIHtcblx0aWYgKGhhc093blByb3BlcnR5LmNhbGwoY29sb3JOYW1lcywgbmFtZSkpIHtcblx0XHRyZXZlcnNlTmFtZXNbY29sb3JOYW1lc1tuYW1lXV0gPSBuYW1lO1xuXHR9XG59XG5cbnZhciBjcyA9IG1vZHVsZS5leHBvcnRzID0ge1xuXHR0bzoge30sXG5cdGdldDoge31cbn07XG5cbmNzLmdldCA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcblx0dmFyIHByZWZpeCA9IHN0cmluZy5zdWJzdHJpbmcoMCwgMykudG9Mb3dlckNhc2UoKTtcblx0dmFyIHZhbDtcblx0dmFyIG1vZGVsO1xuXHRzd2l0Y2ggKHByZWZpeCkge1xuXHRcdGNhc2UgJ2hzbCc6XG5cdFx0XHR2YWwgPSBjcy5nZXQuaHNsKHN0cmluZyk7XG5cdFx0XHRtb2RlbCA9ICdoc2wnO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAnaHdiJzpcblx0XHRcdHZhbCA9IGNzLmdldC5od2Ioc3RyaW5nKTtcblx0XHRcdG1vZGVsID0gJ2h3Yic7XG5cdFx0XHRicmVhaztcblx0XHRkZWZhdWx0OlxuXHRcdFx0dmFsID0gY3MuZ2V0LnJnYihzdHJpbmcpO1xuXHRcdFx0bW9kZWwgPSAncmdiJztcblx0XHRcdGJyZWFrO1xuXHR9XG5cblx0aWYgKCF2YWwpIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdHJldHVybiB7bW9kZWw6IG1vZGVsLCB2YWx1ZTogdmFsfTtcbn07XG5cbmNzLmdldC5yZ2IgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG5cdGlmICghc3RyaW5nKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHR2YXIgYWJiciA9IC9eIyhbYS1mMC05XXszLDR9KSQvaTtcblx0dmFyIGhleCA9IC9eIyhbYS1mMC05XXs2fSkoW2EtZjAtOV17Mn0pPyQvaTtcblx0dmFyIHJnYmEgPSAvXnJnYmE/XFwoXFxzKihbKy1dP1xcZCspKD89W1xccyxdKVxccyooPzosXFxzKik/KFsrLV0/XFxkKykoPz1bXFxzLF0pXFxzKig/OixcXHMqKT8oWystXT9cXGQrKVxccyooPzpbLHxcXC9dXFxzKihbKy1dP1tcXGRcXC5dKykoJT8pXFxzKik/XFwpJC87XG5cdHZhciBwZXIgPSAvXnJnYmE/XFwoXFxzKihbKy1dP1tcXGRcXC5dKylcXCVcXHMqLD9cXHMqKFsrLV0/W1xcZFxcLl0rKVxcJVxccyosP1xccyooWystXT9bXFxkXFwuXSspXFwlXFxzKig/OlssfFxcL11cXHMqKFsrLV0/W1xcZFxcLl0rKSglPylcXHMqKT9cXCkkLztcblx0dmFyIGtleXdvcmQgPSAvXihcXHcrKSQvO1xuXG5cdHZhciByZ2IgPSBbMCwgMCwgMCwgMV07XG5cdHZhciBtYXRjaDtcblx0dmFyIGk7XG5cdHZhciBoZXhBbHBoYTtcblxuXHRpZiAobWF0Y2ggPSBzdHJpbmcubWF0Y2goaGV4KSkge1xuXHRcdGhleEFscGhhID0gbWF0Y2hbMl07XG5cdFx0bWF0Y2ggPSBtYXRjaFsxXTtcblxuXHRcdGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHtcblx0XHRcdC8vIGh0dHBzOi8vanNwZXJmLmNvbS9zbGljZS12cy1zdWJzdHItdnMtc3Vic3RyaW5nLW1ldGhvZHMtbG9uZy1zdHJpbmcvMTlcblx0XHRcdHZhciBpMiA9IGkgKiAyO1xuXHRcdFx0cmdiW2ldID0gcGFyc2VJbnQobWF0Y2guc2xpY2UoaTIsIGkyICsgMiksIDE2KTtcblx0XHR9XG5cblx0XHRpZiAoaGV4QWxwaGEpIHtcblx0XHRcdHJnYlszXSA9IHBhcnNlSW50KGhleEFscGhhLCAxNikgLyAyNTU7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKG1hdGNoID0gc3RyaW5nLm1hdGNoKGFiYnIpKSB7XG5cdFx0bWF0Y2ggPSBtYXRjaFsxXTtcblx0XHRoZXhBbHBoYSA9IG1hdGNoWzNdO1xuXG5cdFx0Zm9yIChpID0gMDsgaSA8IDM7IGkrKykge1xuXHRcdFx0cmdiW2ldID0gcGFyc2VJbnQobWF0Y2hbaV0gKyBtYXRjaFtpXSwgMTYpO1xuXHRcdH1cblxuXHRcdGlmIChoZXhBbHBoYSkge1xuXHRcdFx0cmdiWzNdID0gcGFyc2VJbnQoaGV4QWxwaGEgKyBoZXhBbHBoYSwgMTYpIC8gMjU1O1xuXHRcdH1cblx0fSBlbHNlIGlmIChtYXRjaCA9IHN0cmluZy5tYXRjaChyZ2JhKSkge1xuXHRcdGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHtcblx0XHRcdHJnYltpXSA9IHBhcnNlSW50KG1hdGNoW2kgKyAxXSwgMCk7XG5cdFx0fVxuXG5cdFx0aWYgKG1hdGNoWzRdKSB7XG5cdFx0XHRpZiAobWF0Y2hbNV0pIHtcblx0XHRcdFx0cmdiWzNdID0gcGFyc2VGbG9hdChtYXRjaFs0XSkgKiAwLjAxO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmdiWzNdID0gcGFyc2VGbG9hdChtYXRjaFs0XSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9IGVsc2UgaWYgKG1hdGNoID0gc3RyaW5nLm1hdGNoKHBlcikpIHtcblx0XHRmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7XG5cdFx0XHRyZ2JbaV0gPSBNYXRoLnJvdW5kKHBhcnNlRmxvYXQobWF0Y2hbaSArIDFdKSAqIDIuNTUpO1xuXHRcdH1cblxuXHRcdGlmIChtYXRjaFs0XSkge1xuXHRcdFx0aWYgKG1hdGNoWzVdKSB7XG5cdFx0XHRcdHJnYlszXSA9IHBhcnNlRmxvYXQobWF0Y2hbNF0pICogMC4wMTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJnYlszXSA9IHBhcnNlRmxvYXQobWF0Y2hbNF0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fSBlbHNlIGlmIChtYXRjaCA9IHN0cmluZy5tYXRjaChrZXl3b3JkKSkge1xuXHRcdGlmIChtYXRjaFsxXSA9PT0gJ3RyYW5zcGFyZW50Jykge1xuXHRcdFx0cmV0dXJuIFswLCAwLCAwLCAwXTtcblx0XHR9XG5cblx0XHRpZiAoIWhhc093blByb3BlcnR5LmNhbGwoY29sb3JOYW1lcywgbWF0Y2hbMV0pKSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHRyZ2IgPSBjb2xvck5hbWVzW21hdGNoWzFdXTtcblx0XHRyZ2JbM10gPSAxO1xuXG5cdFx0cmV0dXJuIHJnYjtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHtcblx0XHRyZ2JbaV0gPSBjbGFtcChyZ2JbaV0sIDAsIDI1NSk7XG5cdH1cblx0cmdiWzNdID0gY2xhbXAocmdiWzNdLCAwLCAxKTtcblxuXHRyZXR1cm4gcmdiO1xufTtcblxuY3MuZ2V0LmhzbCA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcblx0aWYgKCFzdHJpbmcpIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdHZhciBoc2wgPSAvXmhzbGE/XFwoXFxzKihbKy1dPyg/OlxcZHswLDN9XFwuKT9cXGQrKSg/OmRlZyk/XFxzKiw/XFxzKihbKy1dP1tcXGRcXC5dKyklXFxzKiw/XFxzKihbKy1dP1tcXGRcXC5dKyklXFxzKig/OlssfFxcL11cXHMqKFsrLV0/KD89XFwuXFxkfFxcZCkoPzowfFsxLTldXFxkKik/KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KVxccyopP1xcKSQvO1xuXHR2YXIgbWF0Y2ggPSBzdHJpbmcubWF0Y2goaHNsKTtcblxuXHRpZiAobWF0Y2gpIHtcblx0XHR2YXIgYWxwaGEgPSBwYXJzZUZsb2F0KG1hdGNoWzRdKTtcblx0XHR2YXIgaCA9ICgocGFyc2VGbG9hdChtYXRjaFsxXSkgJSAzNjApICsgMzYwKSAlIDM2MDtcblx0XHR2YXIgcyA9IGNsYW1wKHBhcnNlRmxvYXQobWF0Y2hbMl0pLCAwLCAxMDApO1xuXHRcdHZhciBsID0gY2xhbXAocGFyc2VGbG9hdChtYXRjaFszXSksIDAsIDEwMCk7XG5cdFx0dmFyIGEgPSBjbGFtcChpc05hTihhbHBoYSkgPyAxIDogYWxwaGEsIDAsIDEpO1xuXG5cdFx0cmV0dXJuIFtoLCBzLCBsLCBhXTtcblx0fVxuXG5cdHJldHVybiBudWxsO1xufTtcblxuY3MuZ2V0Lmh3YiA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcblx0aWYgKCFzdHJpbmcpIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdHZhciBod2IgPSAvXmh3YlxcKFxccyooWystXT9cXGR7MCwzfSg/OlxcLlxcZCspPykoPzpkZWcpP1xccyosXFxzKihbKy1dP1tcXGRcXC5dKyklXFxzKixcXHMqKFsrLV0/W1xcZFxcLl0rKSVcXHMqKD86LFxccyooWystXT8oPz1cXC5cXGR8XFxkKSg/OjB8WzEtOV1cXGQqKT8oPzpcXC5cXGQqKT8oPzpbZUVdWystXT9cXGQrKT8pXFxzKik/XFwpJC87XG5cdHZhciBtYXRjaCA9IHN0cmluZy5tYXRjaChod2IpO1xuXG5cdGlmIChtYXRjaCkge1xuXHRcdHZhciBhbHBoYSA9IHBhcnNlRmxvYXQobWF0Y2hbNF0pO1xuXHRcdHZhciBoID0gKChwYXJzZUZsb2F0KG1hdGNoWzFdKSAlIDM2MCkgKyAzNjApICUgMzYwO1xuXHRcdHZhciB3ID0gY2xhbXAocGFyc2VGbG9hdChtYXRjaFsyXSksIDAsIDEwMCk7XG5cdFx0dmFyIGIgPSBjbGFtcChwYXJzZUZsb2F0KG1hdGNoWzNdKSwgMCwgMTAwKTtcblx0XHR2YXIgYSA9IGNsYW1wKGlzTmFOKGFscGhhKSA/IDEgOiBhbHBoYSwgMCwgMSk7XG5cdFx0cmV0dXJuIFtoLCB3LCBiLCBhXTtcblx0fVxuXG5cdHJldHVybiBudWxsO1xufTtcblxuY3MudG8uaGV4ID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgcmdiYSA9IHN3aXp6bGUoYXJndW1lbnRzKTtcblxuXHRyZXR1cm4gKFxuXHRcdCcjJyArXG5cdFx0aGV4RG91YmxlKHJnYmFbMF0pICtcblx0XHRoZXhEb3VibGUocmdiYVsxXSkgK1xuXHRcdGhleERvdWJsZShyZ2JhWzJdKSArXG5cdFx0KHJnYmFbM10gPCAxXG5cdFx0XHQ/IChoZXhEb3VibGUoTWF0aC5yb3VuZChyZ2JhWzNdICogMjU1KSkpXG5cdFx0XHQ6ICcnKVxuXHQpO1xufTtcblxuY3MudG8ucmdiID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgcmdiYSA9IHN3aXp6bGUoYXJndW1lbnRzKTtcblxuXHRyZXR1cm4gcmdiYS5sZW5ndGggPCA0IHx8IHJnYmFbM10gPT09IDFcblx0XHQ/ICdyZ2IoJyArIE1hdGgucm91bmQocmdiYVswXSkgKyAnLCAnICsgTWF0aC5yb3VuZChyZ2JhWzFdKSArICcsICcgKyBNYXRoLnJvdW5kKHJnYmFbMl0pICsgJyknXG5cdFx0OiAncmdiYSgnICsgTWF0aC5yb3VuZChyZ2JhWzBdKSArICcsICcgKyBNYXRoLnJvdW5kKHJnYmFbMV0pICsgJywgJyArIE1hdGgucm91bmQocmdiYVsyXSkgKyAnLCAnICsgcmdiYVszXSArICcpJztcbn07XG5cbmNzLnRvLnJnYi5wZXJjZW50ID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgcmdiYSA9IHN3aXp6bGUoYXJndW1lbnRzKTtcblxuXHR2YXIgciA9IE1hdGgucm91bmQocmdiYVswXSAvIDI1NSAqIDEwMCk7XG5cdHZhciBnID0gTWF0aC5yb3VuZChyZ2JhWzFdIC8gMjU1ICogMTAwKTtcblx0dmFyIGIgPSBNYXRoLnJvdW5kKHJnYmFbMl0gLyAyNTUgKiAxMDApO1xuXG5cdHJldHVybiByZ2JhLmxlbmd0aCA8IDQgfHwgcmdiYVszXSA9PT0gMVxuXHRcdD8gJ3JnYignICsgciArICclLCAnICsgZyArICclLCAnICsgYiArICclKSdcblx0XHQ6ICdyZ2JhKCcgKyByICsgJyUsICcgKyBnICsgJyUsICcgKyBiICsgJyUsICcgKyByZ2JhWzNdICsgJyknO1xufTtcblxuY3MudG8uaHNsID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgaHNsYSA9IHN3aXp6bGUoYXJndW1lbnRzKTtcblx0cmV0dXJuIGhzbGEubGVuZ3RoIDwgNCB8fCBoc2xhWzNdID09PSAxXG5cdFx0PyAnaHNsKCcgKyBoc2xhWzBdICsgJywgJyArIGhzbGFbMV0gKyAnJSwgJyArIGhzbGFbMl0gKyAnJSknXG5cdFx0OiAnaHNsYSgnICsgaHNsYVswXSArICcsICcgKyBoc2xhWzFdICsgJyUsICcgKyBoc2xhWzJdICsgJyUsICcgKyBoc2xhWzNdICsgJyknO1xufTtcblxuLy8gaHdiIGlzIGEgYml0IGRpZmZlcmVudCB0aGFuIHJnYihhKSAmIGhzbChhKSBzaW5jZSB0aGVyZSBpcyBubyBhbHBoYSBzcGVjaWZpYyBzeW50YXhcbi8vIChod2IgaGF2ZSBhbHBoYSBvcHRpb25hbCAmIDEgaXMgZGVmYXVsdCB2YWx1ZSlcbmNzLnRvLmh3YiA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIGh3YmEgPSBzd2l6emxlKGFyZ3VtZW50cyk7XG5cblx0dmFyIGEgPSAnJztcblx0aWYgKGh3YmEubGVuZ3RoID49IDQgJiYgaHdiYVszXSAhPT0gMSkge1xuXHRcdGEgPSAnLCAnICsgaHdiYVszXTtcblx0fVxuXG5cdHJldHVybiAnaHdiKCcgKyBod2JhWzBdICsgJywgJyArIGh3YmFbMV0gKyAnJSwgJyArIGh3YmFbMl0gKyAnJScgKyBhICsgJyknO1xufTtcblxuY3MudG8ua2V5d29yZCA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0cmV0dXJuIHJldmVyc2VOYW1lc1tyZ2Iuc2xpY2UoMCwgMyldO1xufTtcblxuLy8gaGVscGVyc1xuZnVuY3Rpb24gY2xhbXAobnVtLCBtaW4sIG1heCkge1xuXHRyZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgobWluLCBudW0pLCBtYXgpO1xufVxuXG5mdW5jdGlvbiBoZXhEb3VibGUobnVtKSB7XG5cdHZhciBzdHIgPSBNYXRoLnJvdW5kKG51bSkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7XG5cdHJldHVybiAoc3RyLmxlbmd0aCA8IDIpID8gJzAnICsgc3RyIDogc3RyO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY29sb3JTdHJpbmcgPSByZXF1aXJlKCdjb2xvci1zdHJpbmcnKTtcbnZhciBjb252ZXJ0ID0gcmVxdWlyZSgnY29sb3ItY29udmVydCcpO1xuXG52YXIgX3NsaWNlID0gW10uc2xpY2U7XG5cbnZhciBza2lwcGVkTW9kZWxzID0gW1xuXHQvLyB0byBiZSBob25lc3QsIEkgZG9uJ3QgcmVhbGx5IGZlZWwgbGlrZSBrZXl3b3JkIGJlbG9uZ3MgaW4gY29sb3IgY29udmVydCwgYnV0IGVoLlxuXHQna2V5d29yZCcsXG5cblx0Ly8gZ3JheSBjb25mbGljdHMgd2l0aCBzb21lIG1ldGhvZCBuYW1lcywgYW5kIGhhcyBpdHMgb3duIG1ldGhvZCBkZWZpbmVkLlxuXHQnZ3JheScsXG5cblx0Ly8gc2hvdWxkbid0IHJlYWxseSBiZSBpbiBjb2xvci1jb252ZXJ0IGVpdGhlci4uLlxuXHQnaGV4J1xuXTtcblxudmFyIGhhc2hlZE1vZGVsS2V5cyA9IHt9O1xuT2JqZWN0LmtleXMoY29udmVydCkuZm9yRWFjaChmdW5jdGlvbiAobW9kZWwpIHtcblx0aGFzaGVkTW9kZWxLZXlzW19zbGljZS5jYWxsKGNvbnZlcnRbbW9kZWxdLmxhYmVscykuc29ydCgpLmpvaW4oJycpXSA9IG1vZGVsO1xufSk7XG5cbnZhciBsaW1pdGVycyA9IHt9O1xuXG5mdW5jdGlvbiBDb2xvcihvYmosIG1vZGVsKSB7XG5cdGlmICghKHRoaXMgaW5zdGFuY2VvZiBDb2xvcikpIHtcblx0XHRyZXR1cm4gbmV3IENvbG9yKG9iaiwgbW9kZWwpO1xuXHR9XG5cblx0aWYgKG1vZGVsICYmIG1vZGVsIGluIHNraXBwZWRNb2RlbHMpIHtcblx0XHRtb2RlbCA9IG51bGw7XG5cdH1cblxuXHRpZiAobW9kZWwgJiYgIShtb2RlbCBpbiBjb252ZXJ0KSkge1xuXHRcdHRocm93IG5ldyBFcnJvcignVW5rbm93biBtb2RlbDogJyArIG1vZGVsKTtcblx0fVxuXG5cdHZhciBpO1xuXHR2YXIgY2hhbm5lbHM7XG5cblx0aWYgKG9iaiA9PSBudWxsKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZXEtbnVsbCxlcWVxZXFcblx0XHR0aGlzLm1vZGVsID0gJ3JnYic7XG5cdFx0dGhpcy5jb2xvciA9IFswLCAwLCAwXTtcblx0XHR0aGlzLnZhbHBoYSA9IDE7XG5cdH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgQ29sb3IpIHtcblx0XHR0aGlzLm1vZGVsID0gb2JqLm1vZGVsO1xuXHRcdHRoaXMuY29sb3IgPSBvYmouY29sb3Iuc2xpY2UoKTtcblx0XHR0aGlzLnZhbHBoYSA9IG9iai52YWxwaGE7XG5cdH0gZWxzZSBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHtcblx0XHR2YXIgcmVzdWx0ID0gY29sb3JTdHJpbmcuZ2V0KG9iaik7XG5cdFx0aWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gcGFyc2UgY29sb3IgZnJvbSBzdHJpbmc6ICcgKyBvYmopO1xuXHRcdH1cblxuXHRcdHRoaXMubW9kZWwgPSByZXN1bHQubW9kZWw7XG5cdFx0Y2hhbm5lbHMgPSBjb252ZXJ0W3RoaXMubW9kZWxdLmNoYW5uZWxzO1xuXHRcdHRoaXMuY29sb3IgPSByZXN1bHQudmFsdWUuc2xpY2UoMCwgY2hhbm5lbHMpO1xuXHRcdHRoaXMudmFscGhhID0gdHlwZW9mIHJlc3VsdC52YWx1ZVtjaGFubmVsc10gPT09ICdudW1iZXInID8gcmVzdWx0LnZhbHVlW2NoYW5uZWxzXSA6IDE7XG5cdH0gZWxzZSBpZiAob2JqLmxlbmd0aCkge1xuXHRcdHRoaXMubW9kZWwgPSBtb2RlbCB8fCAncmdiJztcblx0XHRjaGFubmVscyA9IGNvbnZlcnRbdGhpcy5tb2RlbF0uY2hhbm5lbHM7XG5cdFx0dmFyIG5ld0FyciA9IF9zbGljZS5jYWxsKG9iaiwgMCwgY2hhbm5lbHMpO1xuXHRcdHRoaXMuY29sb3IgPSB6ZXJvQXJyYXkobmV3QXJyLCBjaGFubmVscyk7XG5cdFx0dGhpcy52YWxwaGEgPSB0eXBlb2Ygb2JqW2NoYW5uZWxzXSA9PT0gJ251bWJlcicgPyBvYmpbY2hhbm5lbHNdIDogMTtcblx0fSBlbHNlIGlmICh0eXBlb2Ygb2JqID09PSAnbnVtYmVyJykge1xuXHRcdC8vIHRoaXMgaXMgYWx3YXlzIFJHQiAtIGNhbiBiZSBjb252ZXJ0ZWQgbGF0ZXIgb24uXG5cdFx0b2JqICY9IDB4RkZGRkZGO1xuXHRcdHRoaXMubW9kZWwgPSAncmdiJztcblx0XHR0aGlzLmNvbG9yID0gW1xuXHRcdFx0KG9iaiA+PiAxNikgJiAweEZGLFxuXHRcdFx0KG9iaiA+PiA4KSAmIDB4RkYsXG5cdFx0XHRvYmogJiAweEZGXG5cdFx0XTtcblx0XHR0aGlzLnZhbHBoYSA9IDE7XG5cdH0gZWxzZSB7XG5cdFx0dGhpcy52YWxwaGEgPSAxO1xuXG5cdFx0dmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuXHRcdGlmICgnYWxwaGEnIGluIG9iaikge1xuXHRcdFx0a2V5cy5zcGxpY2Uoa2V5cy5pbmRleE9mKCdhbHBoYScpLCAxKTtcblx0XHRcdHRoaXMudmFscGhhID0gdHlwZW9mIG9iai5hbHBoYSA9PT0gJ251bWJlcicgPyBvYmouYWxwaGEgOiAwO1xuXHRcdH1cblxuXHRcdHZhciBoYXNoZWRLZXlzID0ga2V5cy5zb3J0KCkuam9pbignJyk7XG5cdFx0aWYgKCEoaGFzaGVkS2V5cyBpbiBoYXNoZWRNb2RlbEtleXMpKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBwYXJzZSBjb2xvciBmcm9tIG9iamVjdDogJyArIEpTT04uc3RyaW5naWZ5KG9iaikpO1xuXHRcdH1cblxuXHRcdHRoaXMubW9kZWwgPSBoYXNoZWRNb2RlbEtleXNbaGFzaGVkS2V5c107XG5cblx0XHR2YXIgbGFiZWxzID0gY29udmVydFt0aGlzLm1vZGVsXS5sYWJlbHM7XG5cdFx0dmFyIGNvbG9yID0gW107XG5cdFx0Zm9yIChpID0gMDsgaSA8IGxhYmVscy5sZW5ndGg7IGkrKykge1xuXHRcdFx0Y29sb3IucHVzaChvYmpbbGFiZWxzW2ldXSk7XG5cdFx0fVxuXG5cdFx0dGhpcy5jb2xvciA9IHplcm9BcnJheShjb2xvcik7XG5cdH1cblxuXHQvLyBwZXJmb3JtIGxpbWl0YXRpb25zIChjbGFtcGluZywgZXRjLilcblx0aWYgKGxpbWl0ZXJzW3RoaXMubW9kZWxdKSB7XG5cdFx0Y2hhbm5lbHMgPSBjb252ZXJ0W3RoaXMubW9kZWxdLmNoYW5uZWxzO1xuXHRcdGZvciAoaSA9IDA7IGkgPCBjaGFubmVsczsgaSsrKSB7XG5cdFx0XHR2YXIgbGltaXQgPSBsaW1pdGVyc1t0aGlzLm1vZGVsXVtpXTtcblx0XHRcdGlmIChsaW1pdCkge1xuXHRcdFx0XHR0aGlzLmNvbG9yW2ldID0gbGltaXQodGhpcy5jb2xvcltpXSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0dGhpcy52YWxwaGEgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCB0aGlzLnZhbHBoYSkpO1xuXG5cdGlmIChPYmplY3QuZnJlZXplKSB7XG5cdFx0T2JqZWN0LmZyZWV6ZSh0aGlzKTtcblx0fVxufVxuXG5Db2xvci5wcm90b3R5cGUgPSB7XG5cdHRvU3RyaW5nOiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIHRoaXMuc3RyaW5nKCk7XG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIHRoaXNbdGhpcy5tb2RlbF0oKTtcblx0fSxcblxuXHRzdHJpbmc6IGZ1bmN0aW9uIChwbGFjZXMpIHtcblx0XHR2YXIgc2VsZiA9IHRoaXMubW9kZWwgaW4gY29sb3JTdHJpbmcudG8gPyB0aGlzIDogdGhpcy5yZ2IoKTtcblx0XHRzZWxmID0gc2VsZi5yb3VuZCh0eXBlb2YgcGxhY2VzID09PSAnbnVtYmVyJyA/IHBsYWNlcyA6IDEpO1xuXHRcdHZhciBhcmdzID0gc2VsZi52YWxwaGEgPT09IDEgPyBzZWxmLmNvbG9yIDogc2VsZi5jb2xvci5jb25jYXQodGhpcy52YWxwaGEpO1xuXHRcdHJldHVybiBjb2xvclN0cmluZy50b1tzZWxmLm1vZGVsXShhcmdzKTtcblx0fSxcblxuXHRwZXJjZW50U3RyaW5nOiBmdW5jdGlvbiAocGxhY2VzKSB7XG5cdFx0dmFyIHNlbGYgPSB0aGlzLnJnYigpLnJvdW5kKHR5cGVvZiBwbGFjZXMgPT09ICdudW1iZXInID8gcGxhY2VzIDogMSk7XG5cdFx0dmFyIGFyZ3MgPSBzZWxmLnZhbHBoYSA9PT0gMSA/IHNlbGYuY29sb3IgOiBzZWxmLmNvbG9yLmNvbmNhdCh0aGlzLnZhbHBoYSk7XG5cdFx0cmV0dXJuIGNvbG9yU3RyaW5nLnRvLnJnYi5wZXJjZW50KGFyZ3MpO1xuXHR9LFxuXG5cdGFycmF5OiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIHRoaXMudmFscGhhID09PSAxID8gdGhpcy5jb2xvci5zbGljZSgpIDogdGhpcy5jb2xvci5jb25jYXQodGhpcy52YWxwaGEpO1xuXHR9LFxuXG5cdG9iamVjdDogZnVuY3Rpb24gKCkge1xuXHRcdHZhciByZXN1bHQgPSB7fTtcblx0XHR2YXIgY2hhbm5lbHMgPSBjb252ZXJ0W3RoaXMubW9kZWxdLmNoYW5uZWxzO1xuXHRcdHZhciBsYWJlbHMgPSBjb252ZXJ0W3RoaXMubW9kZWxdLmxhYmVscztcblxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgY2hhbm5lbHM7IGkrKykge1xuXHRcdFx0cmVzdWx0W2xhYmVsc1tpXV0gPSB0aGlzLmNvbG9yW2ldO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLnZhbHBoYSAhPT0gMSkge1xuXHRcdFx0cmVzdWx0LmFscGhhID0gdGhpcy52YWxwaGE7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fSxcblxuXHR1bml0QXJyYXk6IGZ1bmN0aW9uICgpIHtcblx0XHR2YXIgcmdiID0gdGhpcy5yZ2IoKS5jb2xvcjtcblx0XHRyZ2JbMF0gLz0gMjU1O1xuXHRcdHJnYlsxXSAvPSAyNTU7XG5cdFx0cmdiWzJdIC89IDI1NTtcblxuXHRcdGlmICh0aGlzLnZhbHBoYSAhPT0gMSkge1xuXHRcdFx0cmdiLnB1c2godGhpcy52YWxwaGEpO1xuXHRcdH1cblxuXHRcdHJldHVybiByZ2I7XG5cdH0sXG5cblx0dW5pdE9iamVjdDogZnVuY3Rpb24gKCkge1xuXHRcdHZhciByZ2IgPSB0aGlzLnJnYigpLm9iamVjdCgpO1xuXHRcdHJnYi5yIC89IDI1NTtcblx0XHRyZ2IuZyAvPSAyNTU7XG5cdFx0cmdiLmIgLz0gMjU1O1xuXG5cdFx0aWYgKHRoaXMudmFscGhhICE9PSAxKSB7XG5cdFx0XHRyZ2IuYWxwaGEgPSB0aGlzLnZhbHBoYTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmdiO1xuXHR9LFxuXG5cdHJvdW5kOiBmdW5jdGlvbiAocGxhY2VzKSB7XG5cdFx0cGxhY2VzID0gTWF0aC5tYXgocGxhY2VzIHx8IDAsIDApO1xuXHRcdHJldHVybiBuZXcgQ29sb3IodGhpcy5jb2xvci5tYXAocm91bmRUb1BsYWNlKHBsYWNlcykpLmNvbmNhdCh0aGlzLnZhbHBoYSksIHRoaXMubW9kZWwpO1xuXHR9LFxuXG5cdGFscGhhOiBmdW5jdGlvbiAodmFsKSB7XG5cdFx0aWYgKGFyZ3VtZW50cy5sZW5ndGgpIHtcblx0XHRcdHJldHVybiBuZXcgQ29sb3IodGhpcy5jb2xvci5jb25jYXQoTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgdmFsKSkpLCB0aGlzLm1vZGVsKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy52YWxwaGE7XG5cdH0sXG5cblx0Ly8gcmdiXG5cdHJlZDogZ2V0c2V0KCdyZ2InLCAwLCBtYXhmbigyNTUpKSxcblx0Z3JlZW46IGdldHNldCgncmdiJywgMSwgbWF4Zm4oMjU1KSksXG5cdGJsdWU6IGdldHNldCgncmdiJywgMiwgbWF4Zm4oMjU1KSksXG5cblx0aHVlOiBnZXRzZXQoWydoc2wnLCAnaHN2JywgJ2hzbCcsICdod2InLCAnaGNnJ10sIDAsIGZ1bmN0aW9uICh2YWwpIHsgcmV0dXJuICgodmFsICUgMzYwKSArIDM2MCkgJSAzNjA7IH0pLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGJyYWNlLXN0eWxlXG5cblx0c2F0dXJhdGlvbmw6IGdldHNldCgnaHNsJywgMSwgbWF4Zm4oMTAwKSksXG5cdGxpZ2h0bmVzczogZ2V0c2V0KCdoc2wnLCAyLCBtYXhmbigxMDApKSxcblxuXHRzYXR1cmF0aW9udjogZ2V0c2V0KCdoc3YnLCAxLCBtYXhmbigxMDApKSxcblx0dmFsdWU6IGdldHNldCgnaHN2JywgMiwgbWF4Zm4oMTAwKSksXG5cblx0Y2hyb21hOiBnZXRzZXQoJ2hjZycsIDEsIG1heGZuKDEwMCkpLFxuXHRncmF5OiBnZXRzZXQoJ2hjZycsIDIsIG1heGZuKDEwMCkpLFxuXG5cdHdoaXRlOiBnZXRzZXQoJ2h3YicsIDEsIG1heGZuKDEwMCkpLFxuXHR3YmxhY2s6IGdldHNldCgnaHdiJywgMiwgbWF4Zm4oMTAwKSksXG5cblx0Y3lhbjogZ2V0c2V0KCdjbXlrJywgMCwgbWF4Zm4oMTAwKSksXG5cdG1hZ2VudGE6IGdldHNldCgnY215aycsIDEsIG1heGZuKDEwMCkpLFxuXHR5ZWxsb3c6IGdldHNldCgnY215aycsIDIsIG1heGZuKDEwMCkpLFxuXHRibGFjazogZ2V0c2V0KCdjbXlrJywgMywgbWF4Zm4oMTAwKSksXG5cblx0eDogZ2V0c2V0KCd4eXonLCAwLCBtYXhmbigxMDApKSxcblx0eTogZ2V0c2V0KCd4eXonLCAxLCBtYXhmbigxMDApKSxcblx0ejogZ2V0c2V0KCd4eXonLCAyLCBtYXhmbigxMDApKSxcblxuXHRsOiBnZXRzZXQoJ2xhYicsIDAsIG1heGZuKDEwMCkpLFxuXHRhOiBnZXRzZXQoJ2xhYicsIDEpLFxuXHRiOiBnZXRzZXQoJ2xhYicsIDIpLFxuXG5cdGtleXdvcmQ6IGZ1bmN0aW9uICh2YWwpIHtcblx0XHRpZiAoYXJndW1lbnRzLmxlbmd0aCkge1xuXHRcdFx0cmV0dXJuIG5ldyBDb2xvcih2YWwpO1xuXHRcdH1cblxuXHRcdHJldHVybiBjb252ZXJ0W3RoaXMubW9kZWxdLmtleXdvcmQodGhpcy5jb2xvcik7XG5cdH0sXG5cblx0aGV4OiBmdW5jdGlvbiAodmFsKSB7XG5cdFx0aWYgKGFyZ3VtZW50cy5sZW5ndGgpIHtcblx0XHRcdHJldHVybiBuZXcgQ29sb3IodmFsKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gY29sb3JTdHJpbmcudG8uaGV4KHRoaXMucmdiKCkucm91bmQoKS5jb2xvcik7XG5cdH0sXG5cblx0cmdiTnVtYmVyOiBmdW5jdGlvbiAoKSB7XG5cdFx0dmFyIHJnYiA9IHRoaXMucmdiKCkuY29sb3I7XG5cdFx0cmV0dXJuICgocmdiWzBdICYgMHhGRikgPDwgMTYpIHwgKChyZ2JbMV0gJiAweEZGKSA8PCA4KSB8IChyZ2JbMl0gJiAweEZGKTtcblx0fSxcblxuXHRsdW1pbm9zaXR5OiBmdW5jdGlvbiAoKSB7XG5cdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvV0NBRzIwLyNyZWxhdGl2ZWx1bWluYW5jZWRlZlxuXHRcdHZhciByZ2IgPSB0aGlzLnJnYigpLmNvbG9yO1xuXG5cdFx0dmFyIGx1bSA9IFtdO1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgcmdiLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgY2hhbiA9IHJnYltpXSAvIDI1NTtcblx0XHRcdGx1bVtpXSA9IChjaGFuIDw9IDAuMDM5MjgpID8gY2hhbiAvIDEyLjkyIDogTWF0aC5wb3coKChjaGFuICsgMC4wNTUpIC8gMS4wNTUpLCAyLjQpO1xuXHRcdH1cblxuXHRcdHJldHVybiAwLjIxMjYgKiBsdW1bMF0gKyAwLjcxNTIgKiBsdW1bMV0gKyAwLjA3MjIgKiBsdW1bMl07XG5cdH0sXG5cblx0Y29udHJhc3Q6IGZ1bmN0aW9uIChjb2xvcjIpIHtcblx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9XQ0FHMjAvI2NvbnRyYXN0LXJhdGlvZGVmXG5cdFx0dmFyIGx1bTEgPSB0aGlzLmx1bWlub3NpdHkoKTtcblx0XHR2YXIgbHVtMiA9IGNvbG9yMi5sdW1pbm9zaXR5KCk7XG5cblx0XHRpZiAobHVtMSA+IGx1bTIpIHtcblx0XHRcdHJldHVybiAobHVtMSArIDAuMDUpIC8gKGx1bTIgKyAwLjA1KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gKGx1bTIgKyAwLjA1KSAvIChsdW0xICsgMC4wNSk7XG5cdH0sXG5cblx0bGV2ZWw6IGZ1bmN0aW9uIChjb2xvcjIpIHtcblx0XHR2YXIgY29udHJhc3RSYXRpbyA9IHRoaXMuY29udHJhc3QoY29sb3IyKTtcblx0XHRpZiAoY29udHJhc3RSYXRpbyA+PSA3LjEpIHtcblx0XHRcdHJldHVybiAnQUFBJztcblx0XHR9XG5cblx0XHRyZXR1cm4gKGNvbnRyYXN0UmF0aW8gPj0gNC41KSA/ICdBQScgOiAnJztcblx0fSxcblxuXHRpc0Rhcms6IGZ1bmN0aW9uICgpIHtcblx0XHQvLyBZSVEgZXF1YXRpb24gZnJvbSBodHRwOi8vMjR3YXlzLm9yZy8yMDEwL2NhbGN1bGF0aW5nLWNvbG9yLWNvbnRyYXN0XG5cdFx0dmFyIHJnYiA9IHRoaXMucmdiKCkuY29sb3I7XG5cdFx0dmFyIHlpcSA9IChyZ2JbMF0gKiAyOTkgKyByZ2JbMV0gKiA1ODcgKyByZ2JbMl0gKiAxMTQpIC8gMTAwMDtcblx0XHRyZXR1cm4geWlxIDwgMTI4O1xuXHR9LFxuXG5cdGlzTGlnaHQ6IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gIXRoaXMuaXNEYXJrKCk7XG5cdH0sXG5cblx0bmVnYXRlOiBmdW5jdGlvbiAoKSB7XG5cdFx0dmFyIHJnYiA9IHRoaXMucmdiKCk7XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCAzOyBpKyspIHtcblx0XHRcdHJnYi5jb2xvcltpXSA9IDI1NSAtIHJnYi5jb2xvcltpXTtcblx0XHR9XG5cdFx0cmV0dXJuIHJnYjtcblx0fSxcblxuXHRsaWdodGVuOiBmdW5jdGlvbiAocmF0aW8pIHtcblx0XHR2YXIgaHNsID0gdGhpcy5oc2woKTtcblx0XHRoc2wuY29sb3JbMl0gKz0gaHNsLmNvbG9yWzJdICogcmF0aW87XG5cdFx0cmV0dXJuIGhzbDtcblx0fSxcblxuXHRkYXJrZW46IGZ1bmN0aW9uIChyYXRpbykge1xuXHRcdHZhciBoc2wgPSB0aGlzLmhzbCgpO1xuXHRcdGhzbC5jb2xvclsyXSAtPSBoc2wuY29sb3JbMl0gKiByYXRpbztcblx0XHRyZXR1cm4gaHNsO1xuXHR9LFxuXG5cdHNhdHVyYXRlOiBmdW5jdGlvbiAocmF0aW8pIHtcblx0XHR2YXIgaHNsID0gdGhpcy5oc2woKTtcblx0XHRoc2wuY29sb3JbMV0gKz0gaHNsLmNvbG9yWzFdICogcmF0aW87XG5cdFx0cmV0dXJuIGhzbDtcblx0fSxcblxuXHRkZXNhdHVyYXRlOiBmdW5jdGlvbiAocmF0aW8pIHtcblx0XHR2YXIgaHNsID0gdGhpcy5oc2woKTtcblx0XHRoc2wuY29sb3JbMV0gLT0gaHNsLmNvbG9yWzFdICogcmF0aW87XG5cdFx0cmV0dXJuIGhzbDtcblx0fSxcblxuXHR3aGl0ZW46IGZ1bmN0aW9uIChyYXRpbykge1xuXHRcdHZhciBod2IgPSB0aGlzLmh3YigpO1xuXHRcdGh3Yi5jb2xvclsxXSArPSBod2IuY29sb3JbMV0gKiByYXRpbztcblx0XHRyZXR1cm4gaHdiO1xuXHR9LFxuXG5cdGJsYWNrZW46IGZ1bmN0aW9uIChyYXRpbykge1xuXHRcdHZhciBod2IgPSB0aGlzLmh3YigpO1xuXHRcdGh3Yi5jb2xvclsyXSArPSBod2IuY29sb3JbMl0gKiByYXRpbztcblx0XHRyZXR1cm4gaHdiO1xuXHR9LFxuXG5cdGdyYXlzY2FsZTogZnVuY3Rpb24gKCkge1xuXHRcdC8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvR3JheXNjYWxlI0NvbnZlcnRpbmdfY29sb3JfdG9fZ3JheXNjYWxlXG5cdFx0dmFyIHJnYiA9IHRoaXMucmdiKCkuY29sb3I7XG5cdFx0dmFyIHZhbCA9IHJnYlswXSAqIDAuMyArIHJnYlsxXSAqIDAuNTkgKyByZ2JbMl0gKiAwLjExO1xuXHRcdHJldHVybiBDb2xvci5yZ2IodmFsLCB2YWwsIHZhbCk7XG5cdH0sXG5cblx0ZmFkZTogZnVuY3Rpb24gKHJhdGlvKSB7XG5cdFx0cmV0dXJuIHRoaXMuYWxwaGEodGhpcy52YWxwaGEgLSAodGhpcy52YWxwaGEgKiByYXRpbykpO1xuXHR9LFxuXG5cdG9wYXF1ZXI6IGZ1bmN0aW9uIChyYXRpbykge1xuXHRcdHJldHVybiB0aGlzLmFscGhhKHRoaXMudmFscGhhICsgKHRoaXMudmFscGhhICogcmF0aW8pKTtcblx0fSxcblxuXHRyb3RhdGU6IGZ1bmN0aW9uIChkZWdyZWVzKSB7XG5cdFx0dmFyIGhzbCA9IHRoaXMuaHNsKCk7XG5cdFx0dmFyIGh1ZSA9IGhzbC5jb2xvclswXTtcblx0XHRodWUgPSAoaHVlICsgZGVncmVlcykgJSAzNjA7XG5cdFx0aHVlID0gaHVlIDwgMCA/IDM2MCArIGh1ZSA6IGh1ZTtcblx0XHRoc2wuY29sb3JbMF0gPSBodWU7XG5cdFx0cmV0dXJuIGhzbDtcblx0fSxcblxuXHRtaXg6IGZ1bmN0aW9uIChtaXhpbkNvbG9yLCB3ZWlnaHQpIHtcblx0XHQvLyBwb3J0ZWQgZnJvbSBzYXNzIGltcGxlbWVudGF0aW9uIGluIENcblx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vc2Fzcy9saWJzYXNzL2Jsb2IvMGU2YjRhMjg1MDA5MjM1NmFhM2VjZTA3YzZiMjQ5ZjAyMjFjYWNlZC9mdW5jdGlvbnMuY3BwI0wyMDlcblx0XHRpZiAoIW1peGluQ29sb3IgfHwgIW1peGluQ29sb3IucmdiKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0FyZ3VtZW50IHRvIFwibWl4XCIgd2FzIG5vdCBhIENvbG9yIGluc3RhbmNlLCBidXQgcmF0aGVyIGFuIGluc3RhbmNlIG9mICcgKyB0eXBlb2YgbWl4aW5Db2xvcik7XG5cdFx0fVxuXHRcdHZhciBjb2xvcjEgPSBtaXhpbkNvbG9yLnJnYigpO1xuXHRcdHZhciBjb2xvcjIgPSB0aGlzLnJnYigpO1xuXHRcdHZhciBwID0gd2VpZ2h0ID09PSB1bmRlZmluZWQgPyAwLjUgOiB3ZWlnaHQ7XG5cblx0XHR2YXIgdyA9IDIgKiBwIC0gMTtcblx0XHR2YXIgYSA9IGNvbG9yMS5hbHBoYSgpIC0gY29sb3IyLmFscGhhKCk7XG5cblx0XHR2YXIgdzEgPSAoKCh3ICogYSA9PT0gLTEpID8gdyA6ICh3ICsgYSkgLyAoMSArIHcgKiBhKSkgKyAxKSAvIDIuMDtcblx0XHR2YXIgdzIgPSAxIC0gdzE7XG5cblx0XHRyZXR1cm4gQ29sb3IucmdiKFxuXHRcdFx0XHR3MSAqIGNvbG9yMS5yZWQoKSArIHcyICogY29sb3IyLnJlZCgpLFxuXHRcdFx0XHR3MSAqIGNvbG9yMS5ncmVlbigpICsgdzIgKiBjb2xvcjIuZ3JlZW4oKSxcblx0XHRcdFx0dzEgKiBjb2xvcjEuYmx1ZSgpICsgdzIgKiBjb2xvcjIuYmx1ZSgpLFxuXHRcdFx0XHRjb2xvcjEuYWxwaGEoKSAqIHAgKyBjb2xvcjIuYWxwaGEoKSAqICgxIC0gcCkpO1xuXHR9XG59O1xuXG4vLyBtb2RlbCBjb252ZXJzaW9uIG1ldGhvZHMgYW5kIHN0YXRpYyBjb25zdHJ1Y3RvcnNcbk9iamVjdC5rZXlzKGNvbnZlcnQpLmZvckVhY2goZnVuY3Rpb24gKG1vZGVsKSB7XG5cdGlmIChza2lwcGVkTW9kZWxzLmluZGV4T2YobW9kZWwpICE9PSAtMSkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdHZhciBjaGFubmVscyA9IGNvbnZlcnRbbW9kZWxdLmNoYW5uZWxzO1xuXG5cdC8vIGNvbnZlcnNpb24gbWV0aG9kc1xuXHRDb2xvci5wcm90b3R5cGVbbW9kZWxdID0gZnVuY3Rpb24gKCkge1xuXHRcdGlmICh0aGlzLm1vZGVsID09PSBtb2RlbCkge1xuXHRcdFx0cmV0dXJuIG5ldyBDb2xvcih0aGlzKTtcblx0XHR9XG5cblx0XHRpZiAoYXJndW1lbnRzLmxlbmd0aCkge1xuXHRcdFx0cmV0dXJuIG5ldyBDb2xvcihhcmd1bWVudHMsIG1vZGVsKTtcblx0XHR9XG5cblx0XHR2YXIgbmV3QWxwaGEgPSB0eXBlb2YgYXJndW1lbnRzW2NoYW5uZWxzXSA9PT0gJ251bWJlcicgPyBjaGFubmVscyA6IHRoaXMudmFscGhhO1xuXHRcdHJldHVybiBuZXcgQ29sb3IoYXNzZXJ0QXJyYXkoY29udmVydFt0aGlzLm1vZGVsXVttb2RlbF0ucmF3KHRoaXMuY29sb3IpKS5jb25jYXQobmV3QWxwaGEpLCBtb2RlbCk7XG5cdH07XG5cblx0Ly8gJ3N0YXRpYycgY29uc3RydWN0aW9uIG1ldGhvZHNcblx0Q29sb3JbbW9kZWxdID0gZnVuY3Rpb24gKGNvbG9yKSB7XG5cdFx0aWYgKHR5cGVvZiBjb2xvciA9PT0gJ251bWJlcicpIHtcblx0XHRcdGNvbG9yID0gemVyb0FycmF5KF9zbGljZS5jYWxsKGFyZ3VtZW50cyksIGNoYW5uZWxzKTtcblx0XHR9XG5cdFx0cmV0dXJuIG5ldyBDb2xvcihjb2xvciwgbW9kZWwpO1xuXHR9O1xufSk7XG5cbmZ1bmN0aW9uIHJvdW5kVG8obnVtLCBwbGFjZXMpIHtcblx0cmV0dXJuIE51bWJlcihudW0udG9GaXhlZChwbGFjZXMpKTtcbn1cblxuZnVuY3Rpb24gcm91bmRUb1BsYWNlKHBsYWNlcykge1xuXHRyZXR1cm4gZnVuY3Rpb24gKG51bSkge1xuXHRcdHJldHVybiByb3VuZFRvKG51bSwgcGxhY2VzKTtcblx0fTtcbn1cblxuZnVuY3Rpb24gZ2V0c2V0KG1vZGVsLCBjaGFubmVsLCBtb2RpZmllcikge1xuXHRtb2RlbCA9IEFycmF5LmlzQXJyYXkobW9kZWwpID8gbW9kZWwgOiBbbW9kZWxdO1xuXG5cdG1vZGVsLmZvckVhY2goZnVuY3Rpb24gKG0pIHtcblx0XHQobGltaXRlcnNbbV0gfHwgKGxpbWl0ZXJzW21dID0gW10pKVtjaGFubmVsXSA9IG1vZGlmaWVyO1xuXHR9KTtcblxuXHRtb2RlbCA9IG1vZGVsWzBdO1xuXG5cdHJldHVybiBmdW5jdGlvbiAodmFsKSB7XG5cdFx0dmFyIHJlc3VsdDtcblxuXHRcdGlmIChhcmd1bWVudHMubGVuZ3RoKSB7XG5cdFx0XHRpZiAobW9kaWZpZXIpIHtcblx0XHRcdFx0dmFsID0gbW9kaWZpZXIodmFsKTtcblx0XHRcdH1cblxuXHRcdFx0cmVzdWx0ID0gdGhpc1ttb2RlbF0oKTtcblx0XHRcdHJlc3VsdC5jb2xvcltjaGFubmVsXSA9IHZhbDtcblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fVxuXG5cdFx0cmVzdWx0ID0gdGhpc1ttb2RlbF0oKS5jb2xvcltjaGFubmVsXTtcblx0XHRpZiAobW9kaWZpZXIpIHtcblx0XHRcdHJlc3VsdCA9IG1vZGlmaWVyKHJlc3VsdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fTtcbn1cblxuZnVuY3Rpb24gbWF4Zm4obWF4KSB7XG5cdHJldHVybiBmdW5jdGlvbiAodikge1xuXHRcdHJldHVybiBNYXRoLm1heCgwLCBNYXRoLm1pbihtYXgsIHYpKTtcblx0fTtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0QXJyYXkodmFsKSB7XG5cdHJldHVybiBBcnJheS5pc0FycmF5KHZhbCkgPyB2YWwgOiBbdmFsXTtcbn1cblxuZnVuY3Rpb24gemVyb0FycmF5KGFyciwgbGVuZ3RoKSB7XG5cdGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcblx0XHRpZiAodHlwZW9mIGFycltpXSAhPT0gJ251bWJlcicpIHtcblx0XHRcdGFycltpXSA9IDA7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGFycjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBDb2xvcjtcbiIsIi8qIE1JVCBsaWNlbnNlICovXG52YXIgY3NzS2V5d29yZHMgPSByZXF1aXJlKCdjb2xvci1uYW1lJyk7XG5cbi8vIE5PVEU6IGNvbnZlcnNpb25zIHNob3VsZCBvbmx5IHJldHVybiBwcmltaXRpdmUgdmFsdWVzIChpLmUuIGFycmF5cywgb3Jcbi8vICAgICAgIHZhbHVlcyB0aGF0IGdpdmUgY29ycmVjdCBgdHlwZW9mYCByZXN1bHRzKS5cbi8vICAgICAgIGRvIG5vdCB1c2UgYm94IHZhbHVlcyB0eXBlcyAoaS5lLiBOdW1iZXIoKSwgU3RyaW5nKCksIGV0Yy4pXG5cbnZhciByZXZlcnNlS2V5d29yZHMgPSB7fTtcbmZvciAodmFyIGtleSBpbiBjc3NLZXl3b3Jkcykge1xuXHRpZiAoY3NzS2V5d29yZHMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuXHRcdHJldmVyc2VLZXl3b3Jkc1tjc3NLZXl3b3Jkc1trZXldXSA9IGtleTtcblx0fVxufVxuXG52YXIgY29udmVydCA9IG1vZHVsZS5leHBvcnRzID0ge1xuXHRyZ2I6IHtjaGFubmVsczogMywgbGFiZWxzOiAncmdiJ30sXG5cdGhzbDoge2NoYW5uZWxzOiAzLCBsYWJlbHM6ICdoc2wnfSxcblx0aHN2OiB7Y2hhbm5lbHM6IDMsIGxhYmVsczogJ2hzdid9LFxuXHRod2I6IHtjaGFubmVsczogMywgbGFiZWxzOiAnaHdiJ30sXG5cdGNteWs6IHtjaGFubmVsczogNCwgbGFiZWxzOiAnY215ayd9LFxuXHR4eXo6IHtjaGFubmVsczogMywgbGFiZWxzOiAneHl6J30sXG5cdGxhYjoge2NoYW5uZWxzOiAzLCBsYWJlbHM6ICdsYWInfSxcblx0bGNoOiB7Y2hhbm5lbHM6IDMsIGxhYmVsczogJ2xjaCd9LFxuXHRoZXg6IHtjaGFubmVsczogMSwgbGFiZWxzOiBbJ2hleCddfSxcblx0a2V5d29yZDoge2NoYW5uZWxzOiAxLCBsYWJlbHM6IFsna2V5d29yZCddfSxcblx0YW5zaTE2OiB7Y2hhbm5lbHM6IDEsIGxhYmVsczogWydhbnNpMTYnXX0sXG5cdGFuc2kyNTY6IHtjaGFubmVsczogMSwgbGFiZWxzOiBbJ2Fuc2kyNTYnXX0sXG5cdGhjZzoge2NoYW5uZWxzOiAzLCBsYWJlbHM6IFsnaCcsICdjJywgJ2cnXX0sXG5cdGFwcGxlOiB7Y2hhbm5lbHM6IDMsIGxhYmVsczogWydyMTYnLCAnZzE2JywgJ2IxNiddfSxcblx0Z3JheToge2NoYW5uZWxzOiAxLCBsYWJlbHM6IFsnZ3JheSddfVxufTtcblxuLy8gaGlkZSAuY2hhbm5lbHMgYW5kIC5sYWJlbHMgcHJvcGVydGllc1xuZm9yICh2YXIgbW9kZWwgaW4gY29udmVydCkge1xuXHRpZiAoY29udmVydC5oYXNPd25Qcm9wZXJ0eShtb2RlbCkpIHtcblx0XHRpZiAoISgnY2hhbm5lbHMnIGluIGNvbnZlcnRbbW9kZWxdKSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIGNoYW5uZWxzIHByb3BlcnR5OiAnICsgbW9kZWwpO1xuXHRcdH1cblxuXHRcdGlmICghKCdsYWJlbHMnIGluIGNvbnZlcnRbbW9kZWxdKSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIGNoYW5uZWwgbGFiZWxzIHByb3BlcnR5OiAnICsgbW9kZWwpO1xuXHRcdH1cblxuXHRcdGlmIChjb252ZXJ0W21vZGVsXS5sYWJlbHMubGVuZ3RoICE9PSBjb252ZXJ0W21vZGVsXS5jaGFubmVscykge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdjaGFubmVsIGFuZCBsYWJlbCBjb3VudHMgbWlzbWF0Y2g6ICcgKyBtb2RlbCk7XG5cdFx0fVxuXG5cdFx0dmFyIGNoYW5uZWxzID0gY29udmVydFttb2RlbF0uY2hhbm5lbHM7XG5cdFx0dmFyIGxhYmVscyA9IGNvbnZlcnRbbW9kZWxdLmxhYmVscztcblx0XHRkZWxldGUgY29udmVydFttb2RlbF0uY2hhbm5lbHM7XG5cdFx0ZGVsZXRlIGNvbnZlcnRbbW9kZWxdLmxhYmVscztcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udmVydFttb2RlbF0sICdjaGFubmVscycsIHt2YWx1ZTogY2hhbm5lbHN9KTtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udmVydFttb2RlbF0sICdsYWJlbHMnLCB7dmFsdWU6IGxhYmVsc30pO1xuXHR9XG59XG5cbmNvbnZlcnQucmdiLmhzbCA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0dmFyIHIgPSByZ2JbMF0gLyAyNTU7XG5cdHZhciBnID0gcmdiWzFdIC8gMjU1O1xuXHR2YXIgYiA9IHJnYlsyXSAvIDI1NTtcblx0dmFyIG1pbiA9IE1hdGgubWluKHIsIGcsIGIpO1xuXHR2YXIgbWF4ID0gTWF0aC5tYXgociwgZywgYik7XG5cdHZhciBkZWx0YSA9IG1heCAtIG1pbjtcblx0dmFyIGg7XG5cdHZhciBzO1xuXHR2YXIgbDtcblxuXHRpZiAobWF4ID09PSBtaW4pIHtcblx0XHRoID0gMDtcblx0fSBlbHNlIGlmIChyID09PSBtYXgpIHtcblx0XHRoID0gKGcgLSBiKSAvIGRlbHRhO1xuXHR9IGVsc2UgaWYgKGcgPT09IG1heCkge1xuXHRcdGggPSAyICsgKGIgLSByKSAvIGRlbHRhO1xuXHR9IGVsc2UgaWYgKGIgPT09IG1heCkge1xuXHRcdGggPSA0ICsgKHIgLSBnKSAvIGRlbHRhO1xuXHR9XG5cblx0aCA9IE1hdGgubWluKGggKiA2MCwgMzYwKTtcblxuXHRpZiAoaCA8IDApIHtcblx0XHRoICs9IDM2MDtcblx0fVxuXG5cdGwgPSAobWluICsgbWF4KSAvIDI7XG5cblx0aWYgKG1heCA9PT0gbWluKSB7XG5cdFx0cyA9IDA7XG5cdH0gZWxzZSBpZiAobCA8PSAwLjUpIHtcblx0XHRzID0gZGVsdGEgLyAobWF4ICsgbWluKTtcblx0fSBlbHNlIHtcblx0XHRzID0gZGVsdGEgLyAoMiAtIG1heCAtIG1pbik7XG5cdH1cblxuXHRyZXR1cm4gW2gsIHMgKiAxMDAsIGwgKiAxMDBdO1xufTtcblxuY29udmVydC5yZ2IuaHN2ID0gZnVuY3Rpb24gKHJnYikge1xuXHR2YXIgcmRpZjtcblx0dmFyIGdkaWY7XG5cdHZhciBiZGlmO1xuXHR2YXIgaDtcblx0dmFyIHM7XG5cblx0dmFyIHIgPSByZ2JbMF0gLyAyNTU7XG5cdHZhciBnID0gcmdiWzFdIC8gMjU1O1xuXHR2YXIgYiA9IHJnYlsyXSAvIDI1NTtcblx0dmFyIHYgPSBNYXRoLm1heChyLCBnLCBiKTtcblx0dmFyIGRpZmYgPSB2IC0gTWF0aC5taW4ociwgZywgYik7XG5cdHZhciBkaWZmYyA9IGZ1bmN0aW9uIChjKSB7XG5cdFx0cmV0dXJuICh2IC0gYykgLyA2IC8gZGlmZiArIDEgLyAyO1xuXHR9O1xuXG5cdGlmIChkaWZmID09PSAwKSB7XG5cdFx0aCA9IHMgPSAwO1xuXHR9IGVsc2Uge1xuXHRcdHMgPSBkaWZmIC8gdjtcblx0XHRyZGlmID0gZGlmZmMocik7XG5cdFx0Z2RpZiA9IGRpZmZjKGcpO1xuXHRcdGJkaWYgPSBkaWZmYyhiKTtcblxuXHRcdGlmIChyID09PSB2KSB7XG5cdFx0XHRoID0gYmRpZiAtIGdkaWY7XG5cdFx0fSBlbHNlIGlmIChnID09PSB2KSB7XG5cdFx0XHRoID0gKDEgLyAzKSArIHJkaWYgLSBiZGlmO1xuXHRcdH0gZWxzZSBpZiAoYiA9PT0gdikge1xuXHRcdFx0aCA9ICgyIC8gMykgKyBnZGlmIC0gcmRpZjtcblx0XHR9XG5cdFx0aWYgKGggPCAwKSB7XG5cdFx0XHRoICs9IDE7XG5cdFx0fSBlbHNlIGlmIChoID4gMSkge1xuXHRcdFx0aCAtPSAxO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBbXG5cdFx0aCAqIDM2MCxcblx0XHRzICogMTAwLFxuXHRcdHYgKiAxMDBcblx0XTtcbn07XG5cbmNvbnZlcnQucmdiLmh3YiA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0dmFyIHIgPSByZ2JbMF07XG5cdHZhciBnID0gcmdiWzFdO1xuXHR2YXIgYiA9IHJnYlsyXTtcblx0dmFyIGggPSBjb252ZXJ0LnJnYi5oc2wocmdiKVswXTtcblx0dmFyIHcgPSAxIC8gMjU1ICogTWF0aC5taW4ociwgTWF0aC5taW4oZywgYikpO1xuXG5cdGIgPSAxIC0gMSAvIDI1NSAqIE1hdGgubWF4KHIsIE1hdGgubWF4KGcsIGIpKTtcblxuXHRyZXR1cm4gW2gsIHcgKiAxMDAsIGIgKiAxMDBdO1xufTtcblxuY29udmVydC5yZ2IuY215ayA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0dmFyIHIgPSByZ2JbMF0gLyAyNTU7XG5cdHZhciBnID0gcmdiWzFdIC8gMjU1O1xuXHR2YXIgYiA9IHJnYlsyXSAvIDI1NTtcblx0dmFyIGM7XG5cdHZhciBtO1xuXHR2YXIgeTtcblx0dmFyIGs7XG5cblx0ayA9IE1hdGgubWluKDEgLSByLCAxIC0gZywgMSAtIGIpO1xuXHRjID0gKDEgLSByIC0gaykgLyAoMSAtIGspIHx8IDA7XG5cdG0gPSAoMSAtIGcgLSBrKSAvICgxIC0gaykgfHwgMDtcblx0eSA9ICgxIC0gYiAtIGspIC8gKDEgLSBrKSB8fCAwO1xuXG5cdHJldHVybiBbYyAqIDEwMCwgbSAqIDEwMCwgeSAqIDEwMCwgayAqIDEwMF07XG59O1xuXG4vKipcbiAqIFNlZSBodHRwczovL2VuLm0ud2lraXBlZGlhLm9yZy93aWtpL0V1Y2xpZGVhbl9kaXN0YW5jZSNTcXVhcmVkX0V1Y2xpZGVhbl9kaXN0YW5jZVxuICogKi9cbmZ1bmN0aW9uIGNvbXBhcmF0aXZlRGlzdGFuY2UoeCwgeSkge1xuXHRyZXR1cm4gKFxuXHRcdE1hdGgucG93KHhbMF0gLSB5WzBdLCAyKSArXG5cdFx0TWF0aC5wb3coeFsxXSAtIHlbMV0sIDIpICtcblx0XHRNYXRoLnBvdyh4WzJdIC0geVsyXSwgMilcblx0KTtcbn1cblxuY29udmVydC5yZ2Iua2V5d29yZCA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0dmFyIHJldmVyc2VkID0gcmV2ZXJzZUtleXdvcmRzW3JnYl07XG5cdGlmIChyZXZlcnNlZCkge1xuXHRcdHJldHVybiByZXZlcnNlZDtcblx0fVxuXG5cdHZhciBjdXJyZW50Q2xvc2VzdERpc3RhbmNlID0gSW5maW5pdHk7XG5cdHZhciBjdXJyZW50Q2xvc2VzdEtleXdvcmQ7XG5cblx0Zm9yICh2YXIga2V5d29yZCBpbiBjc3NLZXl3b3Jkcykge1xuXHRcdGlmIChjc3NLZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eShrZXl3b3JkKSkge1xuXHRcdFx0dmFyIHZhbHVlID0gY3NzS2V5d29yZHNba2V5d29yZF07XG5cblx0XHRcdC8vIENvbXB1dGUgY29tcGFyYXRpdmUgZGlzdGFuY2Vcblx0XHRcdHZhciBkaXN0YW5jZSA9IGNvbXBhcmF0aXZlRGlzdGFuY2UocmdiLCB2YWx1ZSk7XG5cblx0XHRcdC8vIENoZWNrIGlmIGl0cyBsZXNzLCBpZiBzbyBzZXQgYXMgY2xvc2VzdFxuXHRcdFx0aWYgKGRpc3RhbmNlIDwgY3VycmVudENsb3Nlc3REaXN0YW5jZSkge1xuXHRcdFx0XHRjdXJyZW50Q2xvc2VzdERpc3RhbmNlID0gZGlzdGFuY2U7XG5cdFx0XHRcdGN1cnJlbnRDbG9zZXN0S2V5d29yZCA9IGtleXdvcmQ7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGN1cnJlbnRDbG9zZXN0S2V5d29yZDtcbn07XG5cbmNvbnZlcnQua2V5d29yZC5yZ2IgPSBmdW5jdGlvbiAoa2V5d29yZCkge1xuXHRyZXR1cm4gY3NzS2V5d29yZHNba2V5d29yZF07XG59O1xuXG5jb252ZXJ0LnJnYi54eXogPSBmdW5jdGlvbiAocmdiKSB7XG5cdHZhciByID0gcmdiWzBdIC8gMjU1O1xuXHR2YXIgZyA9IHJnYlsxXSAvIDI1NTtcblx0dmFyIGIgPSByZ2JbMl0gLyAyNTU7XG5cblx0Ly8gYXNzdW1lIHNSR0Jcblx0ciA9IHIgPiAwLjA0MDQ1ID8gTWF0aC5wb3coKChyICsgMC4wNTUpIC8gMS4wNTUpLCAyLjQpIDogKHIgLyAxMi45Mik7XG5cdGcgPSBnID4gMC4wNDA0NSA/IE1hdGgucG93KCgoZyArIDAuMDU1KSAvIDEuMDU1KSwgMi40KSA6IChnIC8gMTIuOTIpO1xuXHRiID0gYiA+IDAuMDQwNDUgPyBNYXRoLnBvdygoKGIgKyAwLjA1NSkgLyAxLjA1NSksIDIuNCkgOiAoYiAvIDEyLjkyKTtcblxuXHR2YXIgeCA9IChyICogMC40MTI0KSArIChnICogMC4zNTc2KSArIChiICogMC4xODA1KTtcblx0dmFyIHkgPSAociAqIDAuMjEyNikgKyAoZyAqIDAuNzE1MikgKyAoYiAqIDAuMDcyMik7XG5cdHZhciB6ID0gKHIgKiAwLjAxOTMpICsgKGcgKiAwLjExOTIpICsgKGIgKiAwLjk1MDUpO1xuXG5cdHJldHVybiBbeCAqIDEwMCwgeSAqIDEwMCwgeiAqIDEwMF07XG59O1xuXG5jb252ZXJ0LnJnYi5sYWIgPSBmdW5jdGlvbiAocmdiKSB7XG5cdHZhciB4eXogPSBjb252ZXJ0LnJnYi54eXoocmdiKTtcblx0dmFyIHggPSB4eXpbMF07XG5cdHZhciB5ID0geHl6WzFdO1xuXHR2YXIgeiA9IHh5elsyXTtcblx0dmFyIGw7XG5cdHZhciBhO1xuXHR2YXIgYjtcblxuXHR4IC89IDk1LjA0Nztcblx0eSAvPSAxMDA7XG5cdHogLz0gMTA4Ljg4MztcblxuXHR4ID0geCA+IDAuMDA4ODU2ID8gTWF0aC5wb3coeCwgMSAvIDMpIDogKDcuNzg3ICogeCkgKyAoMTYgLyAxMTYpO1xuXHR5ID0geSA+IDAuMDA4ODU2ID8gTWF0aC5wb3coeSwgMSAvIDMpIDogKDcuNzg3ICogeSkgKyAoMTYgLyAxMTYpO1xuXHR6ID0geiA+IDAuMDA4ODU2ID8gTWF0aC5wb3coeiwgMSAvIDMpIDogKDcuNzg3ICogeikgKyAoMTYgLyAxMTYpO1xuXG5cdGwgPSAoMTE2ICogeSkgLSAxNjtcblx0YSA9IDUwMCAqICh4IC0geSk7XG5cdGIgPSAyMDAgKiAoeSAtIHopO1xuXG5cdHJldHVybiBbbCwgYSwgYl07XG59O1xuXG5jb252ZXJ0LmhzbC5yZ2IgPSBmdW5jdGlvbiAoaHNsKSB7XG5cdHZhciBoID0gaHNsWzBdIC8gMzYwO1xuXHR2YXIgcyA9IGhzbFsxXSAvIDEwMDtcblx0dmFyIGwgPSBoc2xbMl0gLyAxMDA7XG5cdHZhciB0MTtcblx0dmFyIHQyO1xuXHR2YXIgdDM7XG5cdHZhciByZ2I7XG5cdHZhciB2YWw7XG5cblx0aWYgKHMgPT09IDApIHtcblx0XHR2YWwgPSBsICogMjU1O1xuXHRcdHJldHVybiBbdmFsLCB2YWwsIHZhbF07XG5cdH1cblxuXHRpZiAobCA8IDAuNSkge1xuXHRcdHQyID0gbCAqICgxICsgcyk7XG5cdH0gZWxzZSB7XG5cdFx0dDIgPSBsICsgcyAtIGwgKiBzO1xuXHR9XG5cblx0dDEgPSAyICogbCAtIHQyO1xuXG5cdHJnYiA9IFswLCAwLCAwXTtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCAzOyBpKyspIHtcblx0XHR0MyA9IGggKyAxIC8gMyAqIC0oaSAtIDEpO1xuXHRcdGlmICh0MyA8IDApIHtcblx0XHRcdHQzKys7XG5cdFx0fVxuXHRcdGlmICh0MyA+IDEpIHtcblx0XHRcdHQzLS07XG5cdFx0fVxuXG5cdFx0aWYgKDYgKiB0MyA8IDEpIHtcblx0XHRcdHZhbCA9IHQxICsgKHQyIC0gdDEpICogNiAqIHQzO1xuXHRcdH0gZWxzZSBpZiAoMiAqIHQzIDwgMSkge1xuXHRcdFx0dmFsID0gdDI7XG5cdFx0fSBlbHNlIGlmICgzICogdDMgPCAyKSB7XG5cdFx0XHR2YWwgPSB0MSArICh0MiAtIHQxKSAqICgyIC8gMyAtIHQzKSAqIDY7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHZhbCA9IHQxO1xuXHRcdH1cblxuXHRcdHJnYltpXSA9IHZhbCAqIDI1NTtcblx0fVxuXG5cdHJldHVybiByZ2I7XG59O1xuXG5jb252ZXJ0LmhzbC5oc3YgPSBmdW5jdGlvbiAoaHNsKSB7XG5cdHZhciBoID0gaHNsWzBdO1xuXHR2YXIgcyA9IGhzbFsxXSAvIDEwMDtcblx0dmFyIGwgPSBoc2xbMl0gLyAxMDA7XG5cdHZhciBzbWluID0gcztcblx0dmFyIGxtaW4gPSBNYXRoLm1heChsLCAwLjAxKTtcblx0dmFyIHN2O1xuXHR2YXIgdjtcblxuXHRsICo9IDI7XG5cdHMgKj0gKGwgPD0gMSkgPyBsIDogMiAtIGw7XG5cdHNtaW4gKj0gbG1pbiA8PSAxID8gbG1pbiA6IDIgLSBsbWluO1xuXHR2ID0gKGwgKyBzKSAvIDI7XG5cdHN2ID0gbCA9PT0gMCA/ICgyICogc21pbikgLyAobG1pbiArIHNtaW4pIDogKDIgKiBzKSAvIChsICsgcyk7XG5cblx0cmV0dXJuIFtoLCBzdiAqIDEwMCwgdiAqIDEwMF07XG59O1xuXG5jb252ZXJ0Lmhzdi5yZ2IgPSBmdW5jdGlvbiAoaHN2KSB7XG5cdHZhciBoID0gaHN2WzBdIC8gNjA7XG5cdHZhciBzID0gaHN2WzFdIC8gMTAwO1xuXHR2YXIgdiA9IGhzdlsyXSAvIDEwMDtcblx0dmFyIGhpID0gTWF0aC5mbG9vcihoKSAlIDY7XG5cblx0dmFyIGYgPSBoIC0gTWF0aC5mbG9vcihoKTtcblx0dmFyIHAgPSAyNTUgKiB2ICogKDEgLSBzKTtcblx0dmFyIHEgPSAyNTUgKiB2ICogKDEgLSAocyAqIGYpKTtcblx0dmFyIHQgPSAyNTUgKiB2ICogKDEgLSAocyAqICgxIC0gZikpKTtcblx0diAqPSAyNTU7XG5cblx0c3dpdGNoIChoaSkge1xuXHRcdGNhc2UgMDpcblx0XHRcdHJldHVybiBbdiwgdCwgcF07XG5cdFx0Y2FzZSAxOlxuXHRcdFx0cmV0dXJuIFtxLCB2LCBwXTtcblx0XHRjYXNlIDI6XG5cdFx0XHRyZXR1cm4gW3AsIHYsIHRdO1xuXHRcdGNhc2UgMzpcblx0XHRcdHJldHVybiBbcCwgcSwgdl07XG5cdFx0Y2FzZSA0OlxuXHRcdFx0cmV0dXJuIFt0LCBwLCB2XTtcblx0XHRjYXNlIDU6XG5cdFx0XHRyZXR1cm4gW3YsIHAsIHFdO1xuXHR9XG59O1xuXG5jb252ZXJ0Lmhzdi5oc2wgPSBmdW5jdGlvbiAoaHN2KSB7XG5cdHZhciBoID0gaHN2WzBdO1xuXHR2YXIgcyA9IGhzdlsxXSAvIDEwMDtcblx0dmFyIHYgPSBoc3ZbMl0gLyAxMDA7XG5cdHZhciB2bWluID0gTWF0aC5tYXgodiwgMC4wMSk7XG5cdHZhciBsbWluO1xuXHR2YXIgc2w7XG5cdHZhciBsO1xuXG5cdGwgPSAoMiAtIHMpICogdjtcblx0bG1pbiA9ICgyIC0gcykgKiB2bWluO1xuXHRzbCA9IHMgKiB2bWluO1xuXHRzbCAvPSAobG1pbiA8PSAxKSA/IGxtaW4gOiAyIC0gbG1pbjtcblx0c2wgPSBzbCB8fCAwO1xuXHRsIC89IDI7XG5cblx0cmV0dXJuIFtoLCBzbCAqIDEwMCwgbCAqIDEwMF07XG59O1xuXG4vLyBodHRwOi8vZGV2LnczLm9yZy9jc3N3Zy9jc3MtY29sb3IvI2h3Yi10by1yZ2JcbmNvbnZlcnQuaHdiLnJnYiA9IGZ1bmN0aW9uIChod2IpIHtcblx0dmFyIGggPSBod2JbMF0gLyAzNjA7XG5cdHZhciB3aCA9IGh3YlsxXSAvIDEwMDtcblx0dmFyIGJsID0gaHdiWzJdIC8gMTAwO1xuXHR2YXIgcmF0aW8gPSB3aCArIGJsO1xuXHR2YXIgaTtcblx0dmFyIHY7XG5cdHZhciBmO1xuXHR2YXIgbjtcblxuXHQvLyB3aCArIGJsIGNhbnQgYmUgPiAxXG5cdGlmIChyYXRpbyA+IDEpIHtcblx0XHR3aCAvPSByYXRpbztcblx0XHRibCAvPSByYXRpbztcblx0fVxuXG5cdGkgPSBNYXRoLmZsb29yKDYgKiBoKTtcblx0diA9IDEgLSBibDtcblx0ZiA9IDYgKiBoIC0gaTtcblxuXHRpZiAoKGkgJiAweDAxKSAhPT0gMCkge1xuXHRcdGYgPSAxIC0gZjtcblx0fVxuXG5cdG4gPSB3aCArIGYgKiAodiAtIHdoKTsgLy8gbGluZWFyIGludGVycG9sYXRpb25cblxuXHR2YXIgcjtcblx0dmFyIGc7XG5cdHZhciBiO1xuXHRzd2l0Y2ggKGkpIHtcblx0XHRkZWZhdWx0OlxuXHRcdGNhc2UgNjpcblx0XHRjYXNlIDA6IHIgPSB2OyBnID0gbjsgYiA9IHdoOyBicmVhaztcblx0XHRjYXNlIDE6IHIgPSBuOyBnID0gdjsgYiA9IHdoOyBicmVhaztcblx0XHRjYXNlIDI6IHIgPSB3aDsgZyA9IHY7IGIgPSBuOyBicmVhaztcblx0XHRjYXNlIDM6IHIgPSB3aDsgZyA9IG47IGIgPSB2OyBicmVhaztcblx0XHRjYXNlIDQ6IHIgPSBuOyBnID0gd2g7IGIgPSB2OyBicmVhaztcblx0XHRjYXNlIDU6IHIgPSB2OyBnID0gd2g7IGIgPSBuOyBicmVhaztcblx0fVxuXG5cdHJldHVybiBbciAqIDI1NSwgZyAqIDI1NSwgYiAqIDI1NV07XG59O1xuXG5jb252ZXJ0LmNteWsucmdiID0gZnVuY3Rpb24gKGNteWspIHtcblx0dmFyIGMgPSBjbXlrWzBdIC8gMTAwO1xuXHR2YXIgbSA9IGNteWtbMV0gLyAxMDA7XG5cdHZhciB5ID0gY215a1syXSAvIDEwMDtcblx0dmFyIGsgPSBjbXlrWzNdIC8gMTAwO1xuXHR2YXIgcjtcblx0dmFyIGc7XG5cdHZhciBiO1xuXG5cdHIgPSAxIC0gTWF0aC5taW4oMSwgYyAqICgxIC0gaykgKyBrKTtcblx0ZyA9IDEgLSBNYXRoLm1pbigxLCBtICogKDEgLSBrKSArIGspO1xuXHRiID0gMSAtIE1hdGgubWluKDEsIHkgKiAoMSAtIGspICsgayk7XG5cblx0cmV0dXJuIFtyICogMjU1LCBnICogMjU1LCBiICogMjU1XTtcbn07XG5cbmNvbnZlcnQueHl6LnJnYiA9IGZ1bmN0aW9uICh4eXopIHtcblx0dmFyIHggPSB4eXpbMF0gLyAxMDA7XG5cdHZhciB5ID0geHl6WzFdIC8gMTAwO1xuXHR2YXIgeiA9IHh5elsyXSAvIDEwMDtcblx0dmFyIHI7XG5cdHZhciBnO1xuXHR2YXIgYjtcblxuXHRyID0gKHggKiAzLjI0MDYpICsgKHkgKiAtMS41MzcyKSArICh6ICogLTAuNDk4Nik7XG5cdGcgPSAoeCAqIC0wLjk2ODkpICsgKHkgKiAxLjg3NTgpICsgKHogKiAwLjA0MTUpO1xuXHRiID0gKHggKiAwLjA1NTcpICsgKHkgKiAtMC4yMDQwKSArICh6ICogMS4wNTcwKTtcblxuXHQvLyBhc3N1bWUgc1JHQlxuXHRyID0gciA+IDAuMDAzMTMwOFxuXHRcdD8gKCgxLjA1NSAqIE1hdGgucG93KHIsIDEuMCAvIDIuNCkpIC0gMC4wNTUpXG5cdFx0OiByICogMTIuOTI7XG5cblx0ZyA9IGcgPiAwLjAwMzEzMDhcblx0XHQ/ICgoMS4wNTUgKiBNYXRoLnBvdyhnLCAxLjAgLyAyLjQpKSAtIDAuMDU1KVxuXHRcdDogZyAqIDEyLjkyO1xuXG5cdGIgPSBiID4gMC4wMDMxMzA4XG5cdFx0PyAoKDEuMDU1ICogTWF0aC5wb3coYiwgMS4wIC8gMi40KSkgLSAwLjA1NSlcblx0XHQ6IGIgKiAxMi45MjtcblxuXHRyID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgciksIDEpO1xuXHRnID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgZyksIDEpO1xuXHRiID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgYiksIDEpO1xuXG5cdHJldHVybiBbciAqIDI1NSwgZyAqIDI1NSwgYiAqIDI1NV07XG59O1xuXG5jb252ZXJ0Lnh5ei5sYWIgPSBmdW5jdGlvbiAoeHl6KSB7XG5cdHZhciB4ID0geHl6WzBdO1xuXHR2YXIgeSA9IHh5elsxXTtcblx0dmFyIHogPSB4eXpbMl07XG5cdHZhciBsO1xuXHR2YXIgYTtcblx0dmFyIGI7XG5cblx0eCAvPSA5NS4wNDc7XG5cdHkgLz0gMTAwO1xuXHR6IC89IDEwOC44ODM7XG5cblx0eCA9IHggPiAwLjAwODg1NiA/IE1hdGgucG93KHgsIDEgLyAzKSA6ICg3Ljc4NyAqIHgpICsgKDE2IC8gMTE2KTtcblx0eSA9IHkgPiAwLjAwODg1NiA/IE1hdGgucG93KHksIDEgLyAzKSA6ICg3Ljc4NyAqIHkpICsgKDE2IC8gMTE2KTtcblx0eiA9IHogPiAwLjAwODg1NiA/IE1hdGgucG93KHosIDEgLyAzKSA6ICg3Ljc4NyAqIHopICsgKDE2IC8gMTE2KTtcblxuXHRsID0gKDExNiAqIHkpIC0gMTY7XG5cdGEgPSA1MDAgKiAoeCAtIHkpO1xuXHRiID0gMjAwICogKHkgLSB6KTtcblxuXHRyZXR1cm4gW2wsIGEsIGJdO1xufTtcblxuY29udmVydC5sYWIueHl6ID0gZnVuY3Rpb24gKGxhYikge1xuXHR2YXIgbCA9IGxhYlswXTtcblx0dmFyIGEgPSBsYWJbMV07XG5cdHZhciBiID0gbGFiWzJdO1xuXHR2YXIgeDtcblx0dmFyIHk7XG5cdHZhciB6O1xuXG5cdHkgPSAobCArIDE2KSAvIDExNjtcblx0eCA9IGEgLyA1MDAgKyB5O1xuXHR6ID0geSAtIGIgLyAyMDA7XG5cblx0dmFyIHkyID0gTWF0aC5wb3coeSwgMyk7XG5cdHZhciB4MiA9IE1hdGgucG93KHgsIDMpO1xuXHR2YXIgejIgPSBNYXRoLnBvdyh6LCAzKTtcblx0eSA9IHkyID4gMC4wMDg4NTYgPyB5MiA6ICh5IC0gMTYgLyAxMTYpIC8gNy43ODc7XG5cdHggPSB4MiA+IDAuMDA4ODU2ID8geDIgOiAoeCAtIDE2IC8gMTE2KSAvIDcuNzg3O1xuXHR6ID0gejIgPiAwLjAwODg1NiA/IHoyIDogKHogLSAxNiAvIDExNikgLyA3Ljc4NztcblxuXHR4ICo9IDk1LjA0Nztcblx0eSAqPSAxMDA7XG5cdHogKj0gMTA4Ljg4MztcblxuXHRyZXR1cm4gW3gsIHksIHpdO1xufTtcblxuY29udmVydC5sYWIubGNoID0gZnVuY3Rpb24gKGxhYikge1xuXHR2YXIgbCA9IGxhYlswXTtcblx0dmFyIGEgPSBsYWJbMV07XG5cdHZhciBiID0gbGFiWzJdO1xuXHR2YXIgaHI7XG5cdHZhciBoO1xuXHR2YXIgYztcblxuXHRociA9IE1hdGguYXRhbjIoYiwgYSk7XG5cdGggPSBociAqIDM2MCAvIDIgLyBNYXRoLlBJO1xuXG5cdGlmIChoIDwgMCkge1xuXHRcdGggKz0gMzYwO1xuXHR9XG5cblx0YyA9IE1hdGguc3FydChhICogYSArIGIgKiBiKTtcblxuXHRyZXR1cm4gW2wsIGMsIGhdO1xufTtcblxuY29udmVydC5sY2gubGFiID0gZnVuY3Rpb24gKGxjaCkge1xuXHR2YXIgbCA9IGxjaFswXTtcblx0dmFyIGMgPSBsY2hbMV07XG5cdHZhciBoID0gbGNoWzJdO1xuXHR2YXIgYTtcblx0dmFyIGI7XG5cdHZhciBocjtcblxuXHRociA9IGggLyAzNjAgKiAyICogTWF0aC5QSTtcblx0YSA9IGMgKiBNYXRoLmNvcyhocik7XG5cdGIgPSBjICogTWF0aC5zaW4oaHIpO1xuXG5cdHJldHVybiBbbCwgYSwgYl07XG59O1xuXG5jb252ZXJ0LnJnYi5hbnNpMTYgPSBmdW5jdGlvbiAoYXJncykge1xuXHR2YXIgciA9IGFyZ3NbMF07XG5cdHZhciBnID0gYXJnc1sxXTtcblx0dmFyIGIgPSBhcmdzWzJdO1xuXHR2YXIgdmFsdWUgPSAxIGluIGFyZ3VtZW50cyA/IGFyZ3VtZW50c1sxXSA6IGNvbnZlcnQucmdiLmhzdihhcmdzKVsyXTsgLy8gaHN2IC0+IGFuc2kxNiBvcHRpbWl6YXRpb25cblxuXHR2YWx1ZSA9IE1hdGgucm91bmQodmFsdWUgLyA1MCk7XG5cblx0aWYgKHZhbHVlID09PSAwKSB7XG5cdFx0cmV0dXJuIDMwO1xuXHR9XG5cblx0dmFyIGFuc2kgPSAzMFxuXHRcdCsgKChNYXRoLnJvdW5kKGIgLyAyNTUpIDw8IDIpXG5cdFx0fCAoTWF0aC5yb3VuZChnIC8gMjU1KSA8PCAxKVxuXHRcdHwgTWF0aC5yb3VuZChyIC8gMjU1KSk7XG5cblx0aWYgKHZhbHVlID09PSAyKSB7XG5cdFx0YW5zaSArPSA2MDtcblx0fVxuXG5cdHJldHVybiBhbnNpO1xufTtcblxuY29udmVydC5oc3YuYW5zaTE2ID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0Ly8gb3B0aW1pemF0aW9uIGhlcmU7IHdlIGFscmVhZHkga25vdyB0aGUgdmFsdWUgYW5kIGRvbid0IG5lZWQgdG8gZ2V0XG5cdC8vIGl0IGNvbnZlcnRlZCBmb3IgdXMuXG5cdHJldHVybiBjb252ZXJ0LnJnYi5hbnNpMTYoY29udmVydC5oc3YucmdiKGFyZ3MpLCBhcmdzWzJdKTtcbn07XG5cbmNvbnZlcnQucmdiLmFuc2kyNTYgPSBmdW5jdGlvbiAoYXJncykge1xuXHR2YXIgciA9IGFyZ3NbMF07XG5cdHZhciBnID0gYXJnc1sxXTtcblx0dmFyIGIgPSBhcmdzWzJdO1xuXG5cdC8vIHdlIHVzZSB0aGUgZXh0ZW5kZWQgZ3JleXNjYWxlIHBhbGV0dGUgaGVyZSwgd2l0aCB0aGUgZXhjZXB0aW9uIG9mXG5cdC8vIGJsYWNrIGFuZCB3aGl0ZS4gbm9ybWFsIHBhbGV0dGUgb25seSBoYXMgNCBncmV5c2NhbGUgc2hhZGVzLlxuXHRpZiAociA9PT0gZyAmJiBnID09PSBiKSB7XG5cdFx0aWYgKHIgPCA4KSB7XG5cdFx0XHRyZXR1cm4gMTY7XG5cdFx0fVxuXG5cdFx0aWYgKHIgPiAyNDgpIHtcblx0XHRcdHJldHVybiAyMzE7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIE1hdGgucm91bmQoKChyIC0gOCkgLyAyNDcpICogMjQpICsgMjMyO1xuXHR9XG5cblx0dmFyIGFuc2kgPSAxNlxuXHRcdCsgKDM2ICogTWF0aC5yb3VuZChyIC8gMjU1ICogNSkpXG5cdFx0KyAoNiAqIE1hdGgucm91bmQoZyAvIDI1NSAqIDUpKVxuXHRcdCsgTWF0aC5yb3VuZChiIC8gMjU1ICogNSk7XG5cblx0cmV0dXJuIGFuc2k7XG59O1xuXG5jb252ZXJ0LmFuc2kxNi5yZ2IgPSBmdW5jdGlvbiAoYXJncykge1xuXHR2YXIgY29sb3IgPSBhcmdzICUgMTA7XG5cblx0Ly8gaGFuZGxlIGdyZXlzY2FsZVxuXHRpZiAoY29sb3IgPT09IDAgfHwgY29sb3IgPT09IDcpIHtcblx0XHRpZiAoYXJncyA+IDUwKSB7XG5cdFx0XHRjb2xvciArPSAzLjU7XG5cdFx0fVxuXG5cdFx0Y29sb3IgPSBjb2xvciAvIDEwLjUgKiAyNTU7XG5cblx0XHRyZXR1cm4gW2NvbG9yLCBjb2xvciwgY29sb3JdO1xuXHR9XG5cblx0dmFyIG11bHQgPSAofn4oYXJncyA+IDUwKSArIDEpICogMC41O1xuXHR2YXIgciA9ICgoY29sb3IgJiAxKSAqIG11bHQpICogMjU1O1xuXHR2YXIgZyA9ICgoKGNvbG9yID4+IDEpICYgMSkgKiBtdWx0KSAqIDI1NTtcblx0dmFyIGIgPSAoKChjb2xvciA+PiAyKSAmIDEpICogbXVsdCkgKiAyNTU7XG5cblx0cmV0dXJuIFtyLCBnLCBiXTtcbn07XG5cbmNvbnZlcnQuYW5zaTI1Ni5yZ2IgPSBmdW5jdGlvbiAoYXJncykge1xuXHQvLyBoYW5kbGUgZ3JleXNjYWxlXG5cdGlmIChhcmdzID49IDIzMikge1xuXHRcdHZhciBjID0gKGFyZ3MgLSAyMzIpICogMTAgKyA4O1xuXHRcdHJldHVybiBbYywgYywgY107XG5cdH1cblxuXHRhcmdzIC09IDE2O1xuXG5cdHZhciByZW07XG5cdHZhciByID0gTWF0aC5mbG9vcihhcmdzIC8gMzYpIC8gNSAqIDI1NTtcblx0dmFyIGcgPSBNYXRoLmZsb29yKChyZW0gPSBhcmdzICUgMzYpIC8gNikgLyA1ICogMjU1O1xuXHR2YXIgYiA9IChyZW0gJSA2KSAvIDUgKiAyNTU7XG5cblx0cmV0dXJuIFtyLCBnLCBiXTtcbn07XG5cbmNvbnZlcnQucmdiLmhleCA9IGZ1bmN0aW9uIChhcmdzKSB7XG5cdHZhciBpbnRlZ2VyID0gKChNYXRoLnJvdW5kKGFyZ3NbMF0pICYgMHhGRikgPDwgMTYpXG5cdFx0KyAoKE1hdGgucm91bmQoYXJnc1sxXSkgJiAweEZGKSA8PCA4KVxuXHRcdCsgKE1hdGgucm91bmQoYXJnc1syXSkgJiAweEZGKTtcblxuXHR2YXIgc3RyaW5nID0gaW50ZWdlci50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcblx0cmV0dXJuICcwMDAwMDAnLnN1YnN0cmluZyhzdHJpbmcubGVuZ3RoKSArIHN0cmluZztcbn07XG5cbmNvbnZlcnQuaGV4LnJnYiA9IGZ1bmN0aW9uIChhcmdzKSB7XG5cdHZhciBtYXRjaCA9IGFyZ3MudG9TdHJpbmcoMTYpLm1hdGNoKC9bYS1mMC05XXs2fXxbYS1mMC05XXszfS9pKTtcblx0aWYgKCFtYXRjaCkge1xuXHRcdHJldHVybiBbMCwgMCwgMF07XG5cdH1cblxuXHR2YXIgY29sb3JTdHJpbmcgPSBtYXRjaFswXTtcblxuXHRpZiAobWF0Y2hbMF0ubGVuZ3RoID09PSAzKSB7XG5cdFx0Y29sb3JTdHJpbmcgPSBjb2xvclN0cmluZy5zcGxpdCgnJykubWFwKGZ1bmN0aW9uIChjaGFyKSB7XG5cdFx0XHRyZXR1cm4gY2hhciArIGNoYXI7XG5cdFx0fSkuam9pbignJyk7XG5cdH1cblxuXHR2YXIgaW50ZWdlciA9IHBhcnNlSW50KGNvbG9yU3RyaW5nLCAxNik7XG5cdHZhciByID0gKGludGVnZXIgPj4gMTYpICYgMHhGRjtcblx0dmFyIGcgPSAoaW50ZWdlciA+PiA4KSAmIDB4RkY7XG5cdHZhciBiID0gaW50ZWdlciAmIDB4RkY7XG5cblx0cmV0dXJuIFtyLCBnLCBiXTtcbn07XG5cbmNvbnZlcnQucmdiLmhjZyA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0dmFyIHIgPSByZ2JbMF0gLyAyNTU7XG5cdHZhciBnID0gcmdiWzFdIC8gMjU1O1xuXHR2YXIgYiA9IHJnYlsyXSAvIDI1NTtcblx0dmFyIG1heCA9IE1hdGgubWF4KE1hdGgubWF4KHIsIGcpLCBiKTtcblx0dmFyIG1pbiA9IE1hdGgubWluKE1hdGgubWluKHIsIGcpLCBiKTtcblx0dmFyIGNocm9tYSA9IChtYXggLSBtaW4pO1xuXHR2YXIgZ3JheXNjYWxlO1xuXHR2YXIgaHVlO1xuXG5cdGlmIChjaHJvbWEgPCAxKSB7XG5cdFx0Z3JheXNjYWxlID0gbWluIC8gKDEgLSBjaHJvbWEpO1xuXHR9IGVsc2Uge1xuXHRcdGdyYXlzY2FsZSA9IDA7XG5cdH1cblxuXHRpZiAoY2hyb21hIDw9IDApIHtcblx0XHRodWUgPSAwO1xuXHR9IGVsc2Vcblx0aWYgKG1heCA9PT0gcikge1xuXHRcdGh1ZSA9ICgoZyAtIGIpIC8gY2hyb21hKSAlIDY7XG5cdH0gZWxzZVxuXHRpZiAobWF4ID09PSBnKSB7XG5cdFx0aHVlID0gMiArIChiIC0gcikgLyBjaHJvbWE7XG5cdH0gZWxzZSB7XG5cdFx0aHVlID0gNCArIChyIC0gZykgLyBjaHJvbWEgKyA0O1xuXHR9XG5cblx0aHVlIC89IDY7XG5cdGh1ZSAlPSAxO1xuXG5cdHJldHVybiBbaHVlICogMzYwLCBjaHJvbWEgKiAxMDAsIGdyYXlzY2FsZSAqIDEwMF07XG59O1xuXG5jb252ZXJ0LmhzbC5oY2cgPSBmdW5jdGlvbiAoaHNsKSB7XG5cdHZhciBzID0gaHNsWzFdIC8gMTAwO1xuXHR2YXIgbCA9IGhzbFsyXSAvIDEwMDtcblx0dmFyIGMgPSAxO1xuXHR2YXIgZiA9IDA7XG5cblx0aWYgKGwgPCAwLjUpIHtcblx0XHRjID0gMi4wICogcyAqIGw7XG5cdH0gZWxzZSB7XG5cdFx0YyA9IDIuMCAqIHMgKiAoMS4wIC0gbCk7XG5cdH1cblxuXHRpZiAoYyA8IDEuMCkge1xuXHRcdGYgPSAobCAtIDAuNSAqIGMpIC8gKDEuMCAtIGMpO1xuXHR9XG5cblx0cmV0dXJuIFtoc2xbMF0sIGMgKiAxMDAsIGYgKiAxMDBdO1xufTtcblxuY29udmVydC5oc3YuaGNnID0gZnVuY3Rpb24gKGhzdikge1xuXHR2YXIgcyA9IGhzdlsxXSAvIDEwMDtcblx0dmFyIHYgPSBoc3ZbMl0gLyAxMDA7XG5cblx0dmFyIGMgPSBzICogdjtcblx0dmFyIGYgPSAwO1xuXG5cdGlmIChjIDwgMS4wKSB7XG5cdFx0ZiA9ICh2IC0gYykgLyAoMSAtIGMpO1xuXHR9XG5cblx0cmV0dXJuIFtoc3ZbMF0sIGMgKiAxMDAsIGYgKiAxMDBdO1xufTtcblxuY29udmVydC5oY2cucmdiID0gZnVuY3Rpb24gKGhjZykge1xuXHR2YXIgaCA9IGhjZ1swXSAvIDM2MDtcblx0dmFyIGMgPSBoY2dbMV0gLyAxMDA7XG5cdHZhciBnID0gaGNnWzJdIC8gMTAwO1xuXG5cdGlmIChjID09PSAwLjApIHtcblx0XHRyZXR1cm4gW2cgKiAyNTUsIGcgKiAyNTUsIGcgKiAyNTVdO1xuXHR9XG5cblx0dmFyIHB1cmUgPSBbMCwgMCwgMF07XG5cdHZhciBoaSA9IChoICUgMSkgKiA2O1xuXHR2YXIgdiA9IGhpICUgMTtcblx0dmFyIHcgPSAxIC0gdjtcblx0dmFyIG1nID0gMDtcblxuXHRzd2l0Y2ggKE1hdGguZmxvb3IoaGkpKSB7XG5cdFx0Y2FzZSAwOlxuXHRcdFx0cHVyZVswXSA9IDE7IHB1cmVbMV0gPSB2OyBwdXJlWzJdID0gMDsgYnJlYWs7XG5cdFx0Y2FzZSAxOlxuXHRcdFx0cHVyZVswXSA9IHc7IHB1cmVbMV0gPSAxOyBwdXJlWzJdID0gMDsgYnJlYWs7XG5cdFx0Y2FzZSAyOlxuXHRcdFx0cHVyZVswXSA9IDA7IHB1cmVbMV0gPSAxOyBwdXJlWzJdID0gdjsgYnJlYWs7XG5cdFx0Y2FzZSAzOlxuXHRcdFx0cHVyZVswXSA9IDA7IHB1cmVbMV0gPSB3OyBwdXJlWzJdID0gMTsgYnJlYWs7XG5cdFx0Y2FzZSA0OlxuXHRcdFx0cHVyZVswXSA9IHY7IHB1cmVbMV0gPSAwOyBwdXJlWzJdID0gMTsgYnJlYWs7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdHB1cmVbMF0gPSAxOyBwdXJlWzFdID0gMDsgcHVyZVsyXSA9IHc7XG5cdH1cblxuXHRtZyA9ICgxLjAgLSBjKSAqIGc7XG5cblx0cmV0dXJuIFtcblx0XHQoYyAqIHB1cmVbMF0gKyBtZykgKiAyNTUsXG5cdFx0KGMgKiBwdXJlWzFdICsgbWcpICogMjU1LFxuXHRcdChjICogcHVyZVsyXSArIG1nKSAqIDI1NVxuXHRdO1xufTtcblxuY29udmVydC5oY2cuaHN2ID0gZnVuY3Rpb24gKGhjZykge1xuXHR2YXIgYyA9IGhjZ1sxXSAvIDEwMDtcblx0dmFyIGcgPSBoY2dbMl0gLyAxMDA7XG5cblx0dmFyIHYgPSBjICsgZyAqICgxLjAgLSBjKTtcblx0dmFyIGYgPSAwO1xuXG5cdGlmICh2ID4gMC4wKSB7XG5cdFx0ZiA9IGMgLyB2O1xuXHR9XG5cblx0cmV0dXJuIFtoY2dbMF0sIGYgKiAxMDAsIHYgKiAxMDBdO1xufTtcblxuY29udmVydC5oY2cuaHNsID0gZnVuY3Rpb24gKGhjZykge1xuXHR2YXIgYyA9IGhjZ1sxXSAvIDEwMDtcblx0dmFyIGcgPSBoY2dbMl0gLyAxMDA7XG5cblx0dmFyIGwgPSBnICogKDEuMCAtIGMpICsgMC41ICogYztcblx0dmFyIHMgPSAwO1xuXG5cdGlmIChsID4gMC4wICYmIGwgPCAwLjUpIHtcblx0XHRzID0gYyAvICgyICogbCk7XG5cdH0gZWxzZVxuXHRpZiAobCA+PSAwLjUgJiYgbCA8IDEuMCkge1xuXHRcdHMgPSBjIC8gKDIgKiAoMSAtIGwpKTtcblx0fVxuXG5cdHJldHVybiBbaGNnWzBdLCBzICogMTAwLCBsICogMTAwXTtcbn07XG5cbmNvbnZlcnQuaGNnLmh3YiA9IGZ1bmN0aW9uIChoY2cpIHtcblx0dmFyIGMgPSBoY2dbMV0gLyAxMDA7XG5cdHZhciBnID0gaGNnWzJdIC8gMTAwO1xuXHR2YXIgdiA9IGMgKyBnICogKDEuMCAtIGMpO1xuXHRyZXR1cm4gW2hjZ1swXSwgKHYgLSBjKSAqIDEwMCwgKDEgLSB2KSAqIDEwMF07XG59O1xuXG5jb252ZXJ0Lmh3Yi5oY2cgPSBmdW5jdGlvbiAoaHdiKSB7XG5cdHZhciB3ID0gaHdiWzFdIC8gMTAwO1xuXHR2YXIgYiA9IGh3YlsyXSAvIDEwMDtcblx0dmFyIHYgPSAxIC0gYjtcblx0dmFyIGMgPSB2IC0gdztcblx0dmFyIGcgPSAwO1xuXG5cdGlmIChjIDwgMSkge1xuXHRcdGcgPSAodiAtIGMpIC8gKDEgLSBjKTtcblx0fVxuXG5cdHJldHVybiBbaHdiWzBdLCBjICogMTAwLCBnICogMTAwXTtcbn07XG5cbmNvbnZlcnQuYXBwbGUucmdiID0gZnVuY3Rpb24gKGFwcGxlKSB7XG5cdHJldHVybiBbKGFwcGxlWzBdIC8gNjU1MzUpICogMjU1LCAoYXBwbGVbMV0gLyA2NTUzNSkgKiAyNTUsIChhcHBsZVsyXSAvIDY1NTM1KSAqIDI1NV07XG59O1xuXG5jb252ZXJ0LnJnYi5hcHBsZSA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0cmV0dXJuIFsocmdiWzBdIC8gMjU1KSAqIDY1NTM1LCAocmdiWzFdIC8gMjU1KSAqIDY1NTM1LCAocmdiWzJdIC8gMjU1KSAqIDY1NTM1XTtcbn07XG5cbmNvbnZlcnQuZ3JheS5yZ2IgPSBmdW5jdGlvbiAoYXJncykge1xuXHRyZXR1cm4gW2FyZ3NbMF0gLyAxMDAgKiAyNTUsIGFyZ3NbMF0gLyAxMDAgKiAyNTUsIGFyZ3NbMF0gLyAxMDAgKiAyNTVdO1xufTtcblxuY29udmVydC5ncmF5LmhzbCA9IGNvbnZlcnQuZ3JheS5oc3YgPSBmdW5jdGlvbiAoYXJncykge1xuXHRyZXR1cm4gWzAsIDAsIGFyZ3NbMF1dO1xufTtcblxuY29udmVydC5ncmF5Lmh3YiA9IGZ1bmN0aW9uIChncmF5KSB7XG5cdHJldHVybiBbMCwgMTAwLCBncmF5WzBdXTtcbn07XG5cbmNvbnZlcnQuZ3JheS5jbXlrID0gZnVuY3Rpb24gKGdyYXkpIHtcblx0cmV0dXJuIFswLCAwLCAwLCBncmF5WzBdXTtcbn07XG5cbmNvbnZlcnQuZ3JheS5sYWIgPSBmdW5jdGlvbiAoZ3JheSkge1xuXHRyZXR1cm4gW2dyYXlbMF0sIDAsIDBdO1xufTtcblxuY29udmVydC5ncmF5LmhleCA9IGZ1bmN0aW9uIChncmF5KSB7XG5cdHZhciB2YWwgPSBNYXRoLnJvdW5kKGdyYXlbMF0gLyAxMDAgKiAyNTUpICYgMHhGRjtcblx0dmFyIGludGVnZXIgPSAodmFsIDw8IDE2KSArICh2YWwgPDwgOCkgKyB2YWw7XG5cblx0dmFyIHN0cmluZyA9IGludGVnZXIudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7XG5cdHJldHVybiAnMDAwMDAwJy5zdWJzdHJpbmcoc3RyaW5nLmxlbmd0aCkgKyBzdHJpbmc7XG59O1xuXG5jb252ZXJ0LnJnYi5ncmF5ID0gZnVuY3Rpb24gKHJnYikge1xuXHR2YXIgdmFsID0gKHJnYlswXSArIHJnYlsxXSArIHJnYlsyXSkgLyAzO1xuXHRyZXR1cm4gW3ZhbCAvIDI1NSAqIDEwMF07XG59O1xuIiwidmFyIGNvbnZlcnNpb25zID0gcmVxdWlyZSgnLi9jb252ZXJzaW9ucycpO1xudmFyIHJvdXRlID0gcmVxdWlyZSgnLi9yb3V0ZScpO1xuXG52YXIgY29udmVydCA9IHt9O1xuXG52YXIgbW9kZWxzID0gT2JqZWN0LmtleXMoY29udmVyc2lvbnMpO1xuXG5mdW5jdGlvbiB3cmFwUmF3KGZuKSB7XG5cdHZhciB3cmFwcGVkRm4gPSBmdW5jdGlvbiAoYXJncykge1xuXHRcdGlmIChhcmdzID09PSB1bmRlZmluZWQgfHwgYXJncyA9PT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIGFyZ3M7XG5cdFx0fVxuXG5cdFx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG5cdFx0XHRhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZm4oYXJncyk7XG5cdH07XG5cblx0Ly8gcHJlc2VydmUgLmNvbnZlcnNpb24gcHJvcGVydHkgaWYgdGhlcmUgaXMgb25lXG5cdGlmICgnY29udmVyc2lvbicgaW4gZm4pIHtcblx0XHR3cmFwcGVkRm4uY29udmVyc2lvbiA9IGZuLmNvbnZlcnNpb247XG5cdH1cblxuXHRyZXR1cm4gd3JhcHBlZEZuO1xufVxuXG5mdW5jdGlvbiB3cmFwUm91bmRlZChmbikge1xuXHR2YXIgd3JhcHBlZEZuID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0XHRpZiAoYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3MgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiBhcmdzO1xuXHRcdH1cblxuXHRcdGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuXHRcdFx0YXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG5cdFx0fVxuXG5cdFx0dmFyIHJlc3VsdCA9IGZuKGFyZ3MpO1xuXG5cdFx0Ly8gd2UncmUgYXNzdW1pbmcgdGhlIHJlc3VsdCBpcyBhbiBhcnJheSBoZXJlLlxuXHRcdC8vIHNlZSBub3RpY2UgaW4gY29udmVyc2lvbnMuanM7IGRvbid0IHVzZSBib3ggdHlwZXNcblx0XHQvLyBpbiBjb252ZXJzaW9uIGZ1bmN0aW9ucy5cblx0XHRpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcpIHtcblx0XHRcdGZvciAodmFyIGxlbiA9IHJlc3VsdC5sZW5ndGgsIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdFx0cmVzdWx0W2ldID0gTWF0aC5yb3VuZChyZXN1bHRbaV0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH07XG5cblx0Ly8gcHJlc2VydmUgLmNvbnZlcnNpb24gcHJvcGVydHkgaWYgdGhlcmUgaXMgb25lXG5cdGlmICgnY29udmVyc2lvbicgaW4gZm4pIHtcblx0XHR3cmFwcGVkRm4uY29udmVyc2lvbiA9IGZuLmNvbnZlcnNpb247XG5cdH1cblxuXHRyZXR1cm4gd3JhcHBlZEZuO1xufVxuXG5tb2RlbHMuZm9yRWFjaChmdW5jdGlvbiAoZnJvbU1vZGVsKSB7XG5cdGNvbnZlcnRbZnJvbU1vZGVsXSA9IHt9O1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb252ZXJ0W2Zyb21Nb2RlbF0sICdjaGFubmVscycsIHt2YWx1ZTogY29udmVyc2lvbnNbZnJvbU1vZGVsXS5jaGFubmVsc30pO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udmVydFtmcm9tTW9kZWxdLCAnbGFiZWxzJywge3ZhbHVlOiBjb252ZXJzaW9uc1tmcm9tTW9kZWxdLmxhYmVsc30pO1xuXG5cdHZhciByb3V0ZXMgPSByb3V0ZShmcm9tTW9kZWwpO1xuXHR2YXIgcm91dGVNb2RlbHMgPSBPYmplY3Qua2V5cyhyb3V0ZXMpO1xuXG5cdHJvdXRlTW9kZWxzLmZvckVhY2goZnVuY3Rpb24gKHRvTW9kZWwpIHtcblx0XHR2YXIgZm4gPSByb3V0ZXNbdG9Nb2RlbF07XG5cblx0XHRjb252ZXJ0W2Zyb21Nb2RlbF1bdG9Nb2RlbF0gPSB3cmFwUm91bmRlZChmbik7XG5cdFx0Y29udmVydFtmcm9tTW9kZWxdW3RvTW9kZWxdLnJhdyA9IHdyYXBSYXcoZm4pO1xuXHR9KTtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbnZlcnQ7XG4iLCJ2YXIgY29udmVyc2lvbnMgPSByZXF1aXJlKCcuL2NvbnZlcnNpb25zJyk7XG5cbi8qXG5cdHRoaXMgZnVuY3Rpb24gcm91dGVzIGEgbW9kZWwgdG8gYWxsIG90aGVyIG1vZGVscy5cblxuXHRhbGwgZnVuY3Rpb25zIHRoYXQgYXJlIHJvdXRlZCBoYXZlIGEgcHJvcGVydHkgYC5jb252ZXJzaW9uYCBhdHRhY2hlZFxuXHR0byB0aGUgcmV0dXJuZWQgc3ludGhldGljIGZ1bmN0aW9uLiBUaGlzIHByb3BlcnR5IGlzIGFuIGFycmF5XG5cdG9mIHN0cmluZ3MsIGVhY2ggd2l0aCB0aGUgc3RlcHMgaW4gYmV0d2VlbiB0aGUgJ2Zyb20nIGFuZCAndG8nXG5cdGNvbG9yIG1vZGVscyAoaW5jbHVzaXZlKS5cblxuXHRjb252ZXJzaW9ucyB0aGF0IGFyZSBub3QgcG9zc2libGUgc2ltcGx5IGFyZSBub3QgaW5jbHVkZWQuXG4qL1xuXG5mdW5jdGlvbiBidWlsZEdyYXBoKCkge1xuXHR2YXIgZ3JhcGggPSB7fTtcblx0Ly8gaHR0cHM6Ly9qc3BlcmYuY29tL29iamVjdC1rZXlzLXZzLWZvci1pbi13aXRoLWNsb3N1cmUvM1xuXHR2YXIgbW9kZWxzID0gT2JqZWN0LmtleXMoY29udmVyc2lvbnMpO1xuXG5cdGZvciAodmFyIGxlbiA9IG1vZGVscy5sZW5ndGgsIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0XHRncmFwaFttb2RlbHNbaV1dID0ge1xuXHRcdFx0Ly8gaHR0cDovL2pzcGVyZi5jb20vMS12cy1pbmZpbml0eVxuXHRcdFx0Ly8gbWljcm8tb3B0LCBidXQgdGhpcyBpcyBzaW1wbGUuXG5cdFx0XHRkaXN0YW5jZTogLTEsXG5cdFx0XHRwYXJlbnQ6IG51bGxcblx0XHR9O1xuXHR9XG5cblx0cmV0dXJuIGdyYXBoO1xufVxuXG4vLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CcmVhZHRoLWZpcnN0X3NlYXJjaFxuZnVuY3Rpb24gZGVyaXZlQkZTKGZyb21Nb2RlbCkge1xuXHR2YXIgZ3JhcGggPSBidWlsZEdyYXBoKCk7XG5cdHZhciBxdWV1ZSA9IFtmcm9tTW9kZWxdOyAvLyB1bnNoaWZ0IC0+IHF1ZXVlIC0+IHBvcFxuXG5cdGdyYXBoW2Zyb21Nb2RlbF0uZGlzdGFuY2UgPSAwO1xuXG5cdHdoaWxlIChxdWV1ZS5sZW5ndGgpIHtcblx0XHR2YXIgY3VycmVudCA9IHF1ZXVlLnBvcCgpO1xuXHRcdHZhciBhZGphY2VudHMgPSBPYmplY3Qua2V5cyhjb252ZXJzaW9uc1tjdXJyZW50XSk7XG5cblx0XHRmb3IgKHZhciBsZW4gPSBhZGphY2VudHMubGVuZ3RoLCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHR2YXIgYWRqYWNlbnQgPSBhZGphY2VudHNbaV07XG5cdFx0XHR2YXIgbm9kZSA9IGdyYXBoW2FkamFjZW50XTtcblxuXHRcdFx0aWYgKG5vZGUuZGlzdGFuY2UgPT09IC0xKSB7XG5cdFx0XHRcdG5vZGUuZGlzdGFuY2UgPSBncmFwaFtjdXJyZW50XS5kaXN0YW5jZSArIDE7XG5cdFx0XHRcdG5vZGUucGFyZW50ID0gY3VycmVudDtcblx0XHRcdFx0cXVldWUudW5zaGlmdChhZGphY2VudCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGdyYXBoO1xufVxuXG5mdW5jdGlvbiBsaW5rKGZyb20sIHRvKSB7XG5cdHJldHVybiBmdW5jdGlvbiAoYXJncykge1xuXHRcdHJldHVybiB0byhmcm9tKGFyZ3MpKTtcblx0fTtcbn1cblxuZnVuY3Rpb24gd3JhcENvbnZlcnNpb24odG9Nb2RlbCwgZ3JhcGgpIHtcblx0dmFyIHBhdGggPSBbZ3JhcGhbdG9Nb2RlbF0ucGFyZW50LCB0b01vZGVsXTtcblx0dmFyIGZuID0gY29udmVyc2lvbnNbZ3JhcGhbdG9Nb2RlbF0ucGFyZW50XVt0b01vZGVsXTtcblxuXHR2YXIgY3VyID0gZ3JhcGhbdG9Nb2RlbF0ucGFyZW50O1xuXHR3aGlsZSAoZ3JhcGhbY3VyXS5wYXJlbnQpIHtcblx0XHRwYXRoLnVuc2hpZnQoZ3JhcGhbY3VyXS5wYXJlbnQpO1xuXHRcdGZuID0gbGluayhjb252ZXJzaW9uc1tncmFwaFtjdXJdLnBhcmVudF1bY3VyXSwgZm4pO1xuXHRcdGN1ciA9IGdyYXBoW2N1cl0ucGFyZW50O1xuXHR9XG5cblx0Zm4uY29udmVyc2lvbiA9IHBhdGg7XG5cdHJldHVybiBmbjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZnJvbU1vZGVsKSB7XG5cdHZhciBncmFwaCA9IGRlcml2ZUJGUyhmcm9tTW9kZWwpO1xuXHR2YXIgY29udmVyc2lvbiA9IHt9O1xuXG5cdHZhciBtb2RlbHMgPSBPYmplY3Qua2V5cyhncmFwaCk7XG5cdGZvciAodmFyIGxlbiA9IG1vZGVscy5sZW5ndGgsIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0XHR2YXIgdG9Nb2RlbCA9IG1vZGVsc1tpXTtcblx0XHR2YXIgbm9kZSA9IGdyYXBoW3RvTW9kZWxdO1xuXG5cdFx0aWYgKG5vZGUucGFyZW50ID09PSBudWxsKSB7XG5cdFx0XHQvLyBubyBwb3NzaWJsZSBjb252ZXJzaW9uLCBvciB0aGlzIG5vZGUgaXMgdGhlIHNvdXJjZSBtb2RlbC5cblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGNvbnZlcnNpb25bdG9Nb2RlbF0gPSB3cmFwQ29udmVyc2lvbih0b01vZGVsLCBncmFwaCk7XG5cdH1cblxuXHRyZXR1cm4gY29udmVyc2lvbjtcbn07XG5cbiIsIid1c2Ugc3RyaWN0J1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblx0XCJhbGljZWJsdWVcIjogWzI0MCwgMjQ4LCAyNTVdLFxyXG5cdFwiYW50aXF1ZXdoaXRlXCI6IFsyNTAsIDIzNSwgMjE1XSxcclxuXHRcImFxdWFcIjogWzAsIDI1NSwgMjU1XSxcclxuXHRcImFxdWFtYXJpbmVcIjogWzEyNywgMjU1LCAyMTJdLFxyXG5cdFwiYXp1cmVcIjogWzI0MCwgMjU1LCAyNTVdLFxyXG5cdFwiYmVpZ2VcIjogWzI0NSwgMjQ1LCAyMjBdLFxyXG5cdFwiYmlzcXVlXCI6IFsyNTUsIDIyOCwgMTk2XSxcclxuXHRcImJsYWNrXCI6IFswLCAwLCAwXSxcclxuXHRcImJsYW5jaGVkYWxtb25kXCI6IFsyNTUsIDIzNSwgMjA1XSxcclxuXHRcImJsdWVcIjogWzAsIDAsIDI1NV0sXHJcblx0XCJibHVldmlvbGV0XCI6IFsxMzgsIDQzLCAyMjZdLFxyXG5cdFwiYnJvd25cIjogWzE2NSwgNDIsIDQyXSxcclxuXHRcImJ1cmx5d29vZFwiOiBbMjIyLCAxODQsIDEzNV0sXHJcblx0XCJjYWRldGJsdWVcIjogWzk1LCAxNTgsIDE2MF0sXHJcblx0XCJjaGFydHJldXNlXCI6IFsxMjcsIDI1NSwgMF0sXHJcblx0XCJjaG9jb2xhdGVcIjogWzIxMCwgMTA1LCAzMF0sXHJcblx0XCJjb3JhbFwiOiBbMjU1LCAxMjcsIDgwXSxcclxuXHRcImNvcm5mbG93ZXJibHVlXCI6IFsxMDAsIDE0OSwgMjM3XSxcclxuXHRcImNvcm5zaWxrXCI6IFsyNTUsIDI0OCwgMjIwXSxcclxuXHRcImNyaW1zb25cIjogWzIyMCwgMjAsIDYwXSxcclxuXHRcImN5YW5cIjogWzAsIDI1NSwgMjU1XSxcclxuXHRcImRhcmtibHVlXCI6IFswLCAwLCAxMzldLFxyXG5cdFwiZGFya2N5YW5cIjogWzAsIDEzOSwgMTM5XSxcclxuXHRcImRhcmtnb2xkZW5yb2RcIjogWzE4NCwgMTM0LCAxMV0sXHJcblx0XCJkYXJrZ3JheVwiOiBbMTY5LCAxNjksIDE2OV0sXHJcblx0XCJkYXJrZ3JlZW5cIjogWzAsIDEwMCwgMF0sXHJcblx0XCJkYXJrZ3JleVwiOiBbMTY5LCAxNjksIDE2OV0sXHJcblx0XCJkYXJra2hha2lcIjogWzE4OSwgMTgzLCAxMDddLFxyXG5cdFwiZGFya21hZ2VudGFcIjogWzEzOSwgMCwgMTM5XSxcclxuXHRcImRhcmtvbGl2ZWdyZWVuXCI6IFs4NSwgMTA3LCA0N10sXHJcblx0XCJkYXJrb3JhbmdlXCI6IFsyNTUsIDE0MCwgMF0sXHJcblx0XCJkYXJrb3JjaGlkXCI6IFsxNTMsIDUwLCAyMDRdLFxyXG5cdFwiZGFya3JlZFwiOiBbMTM5LCAwLCAwXSxcclxuXHRcImRhcmtzYWxtb25cIjogWzIzMywgMTUwLCAxMjJdLFxyXG5cdFwiZGFya3NlYWdyZWVuXCI6IFsxNDMsIDE4OCwgMTQzXSxcclxuXHRcImRhcmtzbGF0ZWJsdWVcIjogWzcyLCA2MSwgMTM5XSxcclxuXHRcImRhcmtzbGF0ZWdyYXlcIjogWzQ3LCA3OSwgNzldLFxyXG5cdFwiZGFya3NsYXRlZ3JleVwiOiBbNDcsIDc5LCA3OV0sXHJcblx0XCJkYXJrdHVycXVvaXNlXCI6IFswLCAyMDYsIDIwOV0sXHJcblx0XCJkYXJrdmlvbGV0XCI6IFsxNDgsIDAsIDIxMV0sXHJcblx0XCJkZWVwcGlua1wiOiBbMjU1LCAyMCwgMTQ3XSxcclxuXHRcImRlZXBza3libHVlXCI6IFswLCAxOTEsIDI1NV0sXHJcblx0XCJkaW1ncmF5XCI6IFsxMDUsIDEwNSwgMTA1XSxcclxuXHRcImRpbWdyZXlcIjogWzEwNSwgMTA1LCAxMDVdLFxyXG5cdFwiZG9kZ2VyYmx1ZVwiOiBbMzAsIDE0NCwgMjU1XSxcclxuXHRcImZpcmVicmlja1wiOiBbMTc4LCAzNCwgMzRdLFxyXG5cdFwiZmxvcmFsd2hpdGVcIjogWzI1NSwgMjUwLCAyNDBdLFxyXG5cdFwiZm9yZXN0Z3JlZW5cIjogWzM0LCAxMzksIDM0XSxcclxuXHRcImZ1Y2hzaWFcIjogWzI1NSwgMCwgMjU1XSxcclxuXHRcImdhaW5zYm9yb1wiOiBbMjIwLCAyMjAsIDIyMF0sXHJcblx0XCJnaG9zdHdoaXRlXCI6IFsyNDgsIDI0OCwgMjU1XSxcclxuXHRcImdvbGRcIjogWzI1NSwgMjE1LCAwXSxcclxuXHRcImdvbGRlbnJvZFwiOiBbMjE4LCAxNjUsIDMyXSxcclxuXHRcImdyYXlcIjogWzEyOCwgMTI4LCAxMjhdLFxyXG5cdFwiZ3JlZW5cIjogWzAsIDEyOCwgMF0sXHJcblx0XCJncmVlbnllbGxvd1wiOiBbMTczLCAyNTUsIDQ3XSxcclxuXHRcImdyZXlcIjogWzEyOCwgMTI4LCAxMjhdLFxyXG5cdFwiaG9uZXlkZXdcIjogWzI0MCwgMjU1LCAyNDBdLFxyXG5cdFwiaG90cGlua1wiOiBbMjU1LCAxMDUsIDE4MF0sXHJcblx0XCJpbmRpYW5yZWRcIjogWzIwNSwgOTIsIDkyXSxcclxuXHRcImluZGlnb1wiOiBbNzUsIDAsIDEzMF0sXHJcblx0XCJpdm9yeVwiOiBbMjU1LCAyNTUsIDI0MF0sXHJcblx0XCJraGFraVwiOiBbMjQwLCAyMzAsIDE0MF0sXHJcblx0XCJsYXZlbmRlclwiOiBbMjMwLCAyMzAsIDI1MF0sXHJcblx0XCJsYXZlbmRlcmJsdXNoXCI6IFsyNTUsIDI0MCwgMjQ1XSxcclxuXHRcImxhd25ncmVlblwiOiBbMTI0LCAyNTIsIDBdLFxyXG5cdFwibGVtb25jaGlmZm9uXCI6IFsyNTUsIDI1MCwgMjA1XSxcclxuXHRcImxpZ2h0Ymx1ZVwiOiBbMTczLCAyMTYsIDIzMF0sXHJcblx0XCJsaWdodGNvcmFsXCI6IFsyNDAsIDEyOCwgMTI4XSxcclxuXHRcImxpZ2h0Y3lhblwiOiBbMjI0LCAyNTUsIDI1NV0sXHJcblx0XCJsaWdodGdvbGRlbnJvZHllbGxvd1wiOiBbMjUwLCAyNTAsIDIxMF0sXHJcblx0XCJsaWdodGdyYXlcIjogWzIxMSwgMjExLCAyMTFdLFxyXG5cdFwibGlnaHRncmVlblwiOiBbMTQ0LCAyMzgsIDE0NF0sXHJcblx0XCJsaWdodGdyZXlcIjogWzIxMSwgMjExLCAyMTFdLFxyXG5cdFwibGlnaHRwaW5rXCI6IFsyNTUsIDE4MiwgMTkzXSxcclxuXHRcImxpZ2h0c2FsbW9uXCI6IFsyNTUsIDE2MCwgMTIyXSxcclxuXHRcImxpZ2h0c2VhZ3JlZW5cIjogWzMyLCAxNzgsIDE3MF0sXHJcblx0XCJsaWdodHNreWJsdWVcIjogWzEzNSwgMjA2LCAyNTBdLFxyXG5cdFwibGlnaHRzbGF0ZWdyYXlcIjogWzExOSwgMTM2LCAxNTNdLFxyXG5cdFwibGlnaHRzbGF0ZWdyZXlcIjogWzExOSwgMTM2LCAxNTNdLFxyXG5cdFwibGlnaHRzdGVlbGJsdWVcIjogWzE3NiwgMTk2LCAyMjJdLFxyXG5cdFwibGlnaHR5ZWxsb3dcIjogWzI1NSwgMjU1LCAyMjRdLFxyXG5cdFwibGltZVwiOiBbMCwgMjU1LCAwXSxcclxuXHRcImxpbWVncmVlblwiOiBbNTAsIDIwNSwgNTBdLFxyXG5cdFwibGluZW5cIjogWzI1MCwgMjQwLCAyMzBdLFxyXG5cdFwibWFnZW50YVwiOiBbMjU1LCAwLCAyNTVdLFxyXG5cdFwibWFyb29uXCI6IFsxMjgsIDAsIDBdLFxyXG5cdFwibWVkaXVtYXF1YW1hcmluZVwiOiBbMTAyLCAyMDUsIDE3MF0sXHJcblx0XCJtZWRpdW1ibHVlXCI6IFswLCAwLCAyMDVdLFxyXG5cdFwibWVkaXVtb3JjaGlkXCI6IFsxODYsIDg1LCAyMTFdLFxyXG5cdFwibWVkaXVtcHVycGxlXCI6IFsxNDcsIDExMiwgMjE5XSxcclxuXHRcIm1lZGl1bXNlYWdyZWVuXCI6IFs2MCwgMTc5LCAxMTNdLFxyXG5cdFwibWVkaXVtc2xhdGVibHVlXCI6IFsxMjMsIDEwNCwgMjM4XSxcclxuXHRcIm1lZGl1bXNwcmluZ2dyZWVuXCI6IFswLCAyNTAsIDE1NF0sXHJcblx0XCJtZWRpdW10dXJxdW9pc2VcIjogWzcyLCAyMDksIDIwNF0sXHJcblx0XCJtZWRpdW12aW9sZXRyZWRcIjogWzE5OSwgMjEsIDEzM10sXHJcblx0XCJtaWRuaWdodGJsdWVcIjogWzI1LCAyNSwgMTEyXSxcclxuXHRcIm1pbnRjcmVhbVwiOiBbMjQ1LCAyNTUsIDI1MF0sXHJcblx0XCJtaXN0eXJvc2VcIjogWzI1NSwgMjI4LCAyMjVdLFxyXG5cdFwibW9jY2FzaW5cIjogWzI1NSwgMjI4LCAxODFdLFxyXG5cdFwibmF2YWpvd2hpdGVcIjogWzI1NSwgMjIyLCAxNzNdLFxyXG5cdFwibmF2eVwiOiBbMCwgMCwgMTI4XSxcclxuXHRcIm9sZGxhY2VcIjogWzI1MywgMjQ1LCAyMzBdLFxyXG5cdFwib2xpdmVcIjogWzEyOCwgMTI4LCAwXSxcclxuXHRcIm9saXZlZHJhYlwiOiBbMTA3LCAxNDIsIDM1XSxcclxuXHRcIm9yYW5nZVwiOiBbMjU1LCAxNjUsIDBdLFxyXG5cdFwib3JhbmdlcmVkXCI6IFsyNTUsIDY5LCAwXSxcclxuXHRcIm9yY2hpZFwiOiBbMjE4LCAxMTIsIDIxNF0sXHJcblx0XCJwYWxlZ29sZGVucm9kXCI6IFsyMzgsIDIzMiwgMTcwXSxcclxuXHRcInBhbGVncmVlblwiOiBbMTUyLCAyNTEsIDE1Ml0sXHJcblx0XCJwYWxldHVycXVvaXNlXCI6IFsxNzUsIDIzOCwgMjM4XSxcclxuXHRcInBhbGV2aW9sZXRyZWRcIjogWzIxOSwgMTEyLCAxNDddLFxyXG5cdFwicGFwYXlhd2hpcFwiOiBbMjU1LCAyMzksIDIxM10sXHJcblx0XCJwZWFjaHB1ZmZcIjogWzI1NSwgMjE4LCAxODVdLFxyXG5cdFwicGVydVwiOiBbMjA1LCAxMzMsIDYzXSxcclxuXHRcInBpbmtcIjogWzI1NSwgMTkyLCAyMDNdLFxyXG5cdFwicGx1bVwiOiBbMjIxLCAxNjAsIDIyMV0sXHJcblx0XCJwb3dkZXJibHVlXCI6IFsxNzYsIDIyNCwgMjMwXSxcclxuXHRcInB1cnBsZVwiOiBbMTI4LCAwLCAxMjhdLFxyXG5cdFwicmViZWNjYXB1cnBsZVwiOiBbMTAyLCA1MSwgMTUzXSxcclxuXHRcInJlZFwiOiBbMjU1LCAwLCAwXSxcclxuXHRcInJvc3licm93blwiOiBbMTg4LCAxNDMsIDE0M10sXHJcblx0XCJyb3lhbGJsdWVcIjogWzY1LCAxMDUsIDIyNV0sXHJcblx0XCJzYWRkbGVicm93blwiOiBbMTM5LCA2OSwgMTldLFxyXG5cdFwic2FsbW9uXCI6IFsyNTAsIDEyOCwgMTE0XSxcclxuXHRcInNhbmR5YnJvd25cIjogWzI0NCwgMTY0LCA5Nl0sXHJcblx0XCJzZWFncmVlblwiOiBbNDYsIDEzOSwgODddLFxyXG5cdFwic2Vhc2hlbGxcIjogWzI1NSwgMjQ1LCAyMzhdLFxyXG5cdFwic2llbm5hXCI6IFsxNjAsIDgyLCA0NV0sXHJcblx0XCJzaWx2ZXJcIjogWzE5MiwgMTkyLCAxOTJdLFxyXG5cdFwic2t5Ymx1ZVwiOiBbMTM1LCAyMDYsIDIzNV0sXHJcblx0XCJzbGF0ZWJsdWVcIjogWzEwNiwgOTAsIDIwNV0sXHJcblx0XCJzbGF0ZWdyYXlcIjogWzExMiwgMTI4LCAxNDRdLFxyXG5cdFwic2xhdGVncmV5XCI6IFsxMTIsIDEyOCwgMTQ0XSxcclxuXHRcInNub3dcIjogWzI1NSwgMjUwLCAyNTBdLFxyXG5cdFwic3ByaW5nZ3JlZW5cIjogWzAsIDI1NSwgMTI3XSxcclxuXHRcInN0ZWVsYmx1ZVwiOiBbNzAsIDEzMCwgMTgwXSxcclxuXHRcInRhblwiOiBbMjEwLCAxODAsIDE0MF0sXHJcblx0XCJ0ZWFsXCI6IFswLCAxMjgsIDEyOF0sXHJcblx0XCJ0aGlzdGxlXCI6IFsyMTYsIDE5MSwgMjE2XSxcclxuXHRcInRvbWF0b1wiOiBbMjU1LCA5OSwgNzFdLFxyXG5cdFwidHVycXVvaXNlXCI6IFs2NCwgMjI0LCAyMDhdLFxyXG5cdFwidmlvbGV0XCI6IFsyMzgsIDEzMCwgMjM4XSxcclxuXHRcIndoZWF0XCI6IFsyNDUsIDIyMiwgMTc5XSxcclxuXHRcIndoaXRlXCI6IFsyNTUsIDI1NSwgMjU1XSxcclxuXHRcIndoaXRlc21va2VcIjogWzI0NSwgMjQ1LCAyNDVdLFxyXG5cdFwieWVsbG93XCI6IFsyNTUsIDI1NSwgMF0sXHJcblx0XCJ5ZWxsb3dncmVlblwiOiBbMTU0LCAyMDUsIDUwXVxyXG59O1xyXG4iLCIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCJsYXlvdXQtYmFzZVwiKSk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXCJsYXlvdXQtYmFzZVwiXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJjb3NlQmFzZVwiXSA9IGZhY3RvcnkocmVxdWlyZShcImxheW91dC1iYXNlXCIpKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJjb3NlQmFzZVwiXSA9IGZhY3Rvcnkocm9vdFtcImxheW91dEJhc2VcIl0pO1xufSkodGhpcywgZnVuY3Rpb24oX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fNTUxX18pIHtcbnJldHVybiAvKioqKioqLyAoKCkgPT4geyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdFwidXNlIHN0cmljdFwiO1xuLyoqKioqKi8gXHR2YXIgX193ZWJwYWNrX21vZHVsZXNfXyA9ICh7XG5cbi8qKiovIDQ1OlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cblxudmFyIGNvc2VCYXNlID0ge307XG5cbmNvc2VCYXNlLmxheW91dEJhc2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MSk7XG5jb3NlQmFzZS5Db1NFQ29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MDYpO1xuY29zZUJhc2UuQ29TRUVkZ2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc2Nyk7XG5jb3NlQmFzZS5Db1NFR3JhcGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg4MCk7XG5jb3NlQmFzZS5Db1NFR3JhcGhNYW5hZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NzgpO1xuY29zZUJhc2UuQ29TRUxheW91dCA9IF9fd2VicGFja19yZXF1aXJlX18oNzY1KTtcbmNvc2VCYXNlLkNvU0VOb2RlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5OTEpO1xuY29zZUJhc2UuQ29uc3RyYWludEhhbmRsZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkwMik7XG5cbm1vZHVsZS5leHBvcnRzID0gY29zZUJhc2U7XG5cbi8qKiovIH0pLFxuXG4vKioqLyA4MDY6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxuXG52YXIgRkRMYXlvdXRDb25zdGFudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MSkuRkRMYXlvdXRDb25zdGFudHM7XG5cbmZ1bmN0aW9uIENvU0VDb25zdGFudHMoKSB7fVxuXG4vL0NvU0VDb25zdGFudHMgaW5oZXJpdHMgc3RhdGljIHByb3BzIGluIEZETGF5b3V0Q29uc3RhbnRzXG5mb3IgKHZhciBwcm9wIGluIEZETGF5b3V0Q29uc3RhbnRzKSB7XG4gIENvU0VDb25zdGFudHNbcHJvcF0gPSBGRExheW91dENvbnN0YW50c1twcm9wXTtcbn1cblxuQ29TRUNvbnN0YW50cy5ERUZBVUxUX1VTRV9NVUxUSV9MRVZFTF9TQ0FMSU5HID0gZmFsc2U7XG5Db1NFQ29uc3RhbnRzLkRFRkFVTFRfUkFESUFMX1NFUEFSQVRJT04gPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIO1xuQ29TRUNvbnN0YW50cy5ERUZBVUxUX0NPTVBPTkVOVF9TRVBFUkFUSU9OID0gNjA7XG5Db1NFQ29uc3RhbnRzLlRJTEUgPSB0cnVlO1xuQ29TRUNvbnN0YW50cy5USUxJTkdfUEFERElOR19WRVJUSUNBTCA9IDEwO1xuQ29TRUNvbnN0YW50cy5USUxJTkdfUEFERElOR19IT1JJWk9OVEFMID0gMTA7XG5Db1NFQ29uc3RhbnRzLlRSQU5TRk9STV9PTl9DT05TVFJBSU5UX0hBTkRMSU5HID0gdHJ1ZTtcbkNvU0VDb25zdGFudHMuRU5GT1JDRV9DT05TVFJBSU5UUyA9IHRydWU7XG5Db1NFQ29uc3RhbnRzLkFQUExZX0xBWU9VVCA9IHRydWU7XG5Db1NFQ29uc3RhbnRzLlJFTEFYX01PVkVNRU5UX09OX0NPTlNUUkFJTlRTID0gdHJ1ZTtcbkNvU0VDb25zdGFudHMuVFJFRV9SRURVQ1RJT05fT05fSU5DUkVNRU5UQUwgPSB0cnVlOyAvLyB0aGlzIHNob3VsZCBiZSBzZXQgdG8gZmFsc2UgaWYgdGhlcmUgd2lsbCBiZSBhIGNvbnN0cmFpbnRcbi8vIFRoaXMgY29uc3RhbnQgaXMgZm9yIGRpZmZlcmVudGlhdGluZyB3aGV0aGVyIGFjdHVhbCBsYXlvdXQgYWxnb3JpdGhtIHRoYXQgdXNlcyBjb3NlLWJhc2Ugd2FudHMgdG8gYXBwbHkgb25seSBpbmNyZW1lbnRhbCBsYXlvdXQgb3IgXG4vLyBhbiBpbmNyZW1lbnRhbCBsYXlvdXQgb24gdG9wIG9mIGEgcmFuZG9taXplZCBsYXlvdXQuIElmIGl0IGlzIG9ubHkgaW5jcmVtZW50YWwgbGF5b3V0LCB0aGVuIHRoaXMgY29uc3RhbnQgc2hvdWxkIGJlIHRydWUuXG5Db1NFQ29uc3RhbnRzLlBVUkVfSU5DUkVNRU5UQUwgPSBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfSU5DUkVNRU5UQUw7XG5cbm1vZHVsZS5leHBvcnRzID0gQ29TRUNvbnN0YW50cztcblxuLyoqKi8gfSksXG5cbi8qKiovIDc2Nzpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG5cbnZhciBGRExheW91dEVkZ2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MSkuRkRMYXlvdXRFZGdlO1xuXG5mdW5jdGlvbiBDb1NFRWRnZShzb3VyY2UsIHRhcmdldCwgdkVkZ2UpIHtcbiAgRkRMYXlvdXRFZGdlLmNhbGwodGhpcywgc291cmNlLCB0YXJnZXQsIHZFZGdlKTtcbn1cblxuQ29TRUVkZ2UucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShGRExheW91dEVkZ2UucHJvdG90eXBlKTtcbmZvciAodmFyIHByb3AgaW4gRkRMYXlvdXRFZGdlKSB7XG4gIENvU0VFZGdlW3Byb3BdID0gRkRMYXlvdXRFZGdlW3Byb3BdO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IENvU0VFZGdlO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gODgwOlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cblxudmFyIExHcmFwaCA9IF9fd2VicGFja19yZXF1aXJlX18oNTUxKS5MR3JhcGg7XG5cbmZ1bmN0aW9uIENvU0VHcmFwaChwYXJlbnQsIGdyYXBoTWdyLCB2R3JhcGgpIHtcbiAgTEdyYXBoLmNhbGwodGhpcywgcGFyZW50LCBncmFwaE1nciwgdkdyYXBoKTtcbn1cblxuQ29TRUdyYXBoLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoTEdyYXBoLnByb3RvdHlwZSk7XG5mb3IgKHZhciBwcm9wIGluIExHcmFwaCkge1xuICBDb1NFR3JhcGhbcHJvcF0gPSBMR3JhcGhbcHJvcF07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQ29TRUdyYXBoO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gNTc4OlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cblxudmFyIExHcmFwaE1hbmFnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MSkuTEdyYXBoTWFuYWdlcjtcblxuZnVuY3Rpb24gQ29TRUdyYXBoTWFuYWdlcihsYXlvdXQpIHtcbiAgTEdyYXBoTWFuYWdlci5jYWxsKHRoaXMsIGxheW91dCk7XG59XG5cbkNvU0VHcmFwaE1hbmFnZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShMR3JhcGhNYW5hZ2VyLnByb3RvdHlwZSk7XG5mb3IgKHZhciBwcm9wIGluIExHcmFwaE1hbmFnZXIpIHtcbiAgQ29TRUdyYXBoTWFuYWdlcltwcm9wXSA9IExHcmFwaE1hbmFnZXJbcHJvcF07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQ29TRUdyYXBoTWFuYWdlcjtcblxuLyoqKi8gfSksXG5cbi8qKiovIDc2NTpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG5cbnZhciBGRExheW91dCA9IF9fd2VicGFja19yZXF1aXJlX18oNTUxKS5GRExheW91dDtcbnZhciBDb1NFR3JhcGhNYW5hZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NzgpO1xudmFyIENvU0VHcmFwaCA9IF9fd2VicGFja19yZXF1aXJlX18oODgwKTtcbnZhciBDb1NFTm9kZSA9IF9fd2VicGFja19yZXF1aXJlX18oOTkxKTtcbnZhciBDb1NFRWRnZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzY3KTtcbnZhciBDb1NFQ29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MDYpO1xudmFyIENvbnN0cmFpbnRIYW5kbGVyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5MDIpO1xudmFyIEZETGF5b3V0Q29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTEpLkZETGF5b3V0Q29uc3RhbnRzO1xudmFyIExheW91dENvbnN0YW50cyA9IF9fd2VicGFja19yZXF1aXJlX18oNTUxKS5MYXlvdXRDb25zdGFudHM7XG52YXIgUG9pbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MSkuUG9pbnQ7XG52YXIgUG9pbnREID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTEpLlBvaW50RDtcbnZhciBEaW1lbnNpb25EID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTEpLkRpbWVuc2lvbkQ7XG52YXIgTGF5b3V0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTEpLkxheW91dDtcbnZhciBJbnRlZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTEpLkludGVnZXI7XG52YXIgSUdlb21ldHJ5ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTEpLklHZW9tZXRyeTtcbnZhciBMR3JhcGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MSkuTEdyYXBoO1xudmFyIFRyYW5zZm9ybSA9IF9fd2VicGFja19yZXF1aXJlX18oNTUxKS5UcmFuc2Zvcm07XG52YXIgTGlua2VkTGlzdCA9IF9fd2VicGFja19yZXF1aXJlX18oNTUxKS5MaW5rZWRMaXN0O1xuXG5mdW5jdGlvbiBDb1NFTGF5b3V0KCkge1xuICBGRExheW91dC5jYWxsKHRoaXMpO1xuXG4gIHRoaXMudG9CZVRpbGVkID0ge307IC8vIE1lbW9yaXplIGlmIGEgbm9kZSBpcyB0byBiZSB0aWxlZCBvciBpcyB0aWxlZFxuICB0aGlzLmNvbnN0cmFpbnRzID0ge307IC8vIGtlZXAgbGF5b3V0IGNvbnN0cmFpbnRzXG59XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShGRExheW91dC5wcm90b3R5cGUpO1xuXG5mb3IgKHZhciBwcm9wIGluIEZETGF5b3V0KSB7XG4gIENvU0VMYXlvdXRbcHJvcF0gPSBGRExheW91dFtwcm9wXTtcbn1cblxuQ29TRUxheW91dC5wcm90b3R5cGUubmV3R3JhcGhNYW5hZ2VyID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZ20gPSBuZXcgQ29TRUdyYXBoTWFuYWdlcih0aGlzKTtcbiAgdGhpcy5ncmFwaE1hbmFnZXIgPSBnbTtcbiAgcmV0dXJuIGdtO1xufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUubmV3R3JhcGggPSBmdW5jdGlvbiAodkdyYXBoKSB7XG4gIHJldHVybiBuZXcgQ29TRUdyYXBoKG51bGwsIHRoaXMuZ3JhcGhNYW5hZ2VyLCB2R3JhcGgpO1xufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUubmV3Tm9kZSA9IGZ1bmN0aW9uICh2Tm9kZSkge1xuICByZXR1cm4gbmV3IENvU0VOb2RlKHRoaXMuZ3JhcGhNYW5hZ2VyLCB2Tm9kZSk7XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5uZXdFZGdlID0gZnVuY3Rpb24gKHZFZGdlKSB7XG4gIHJldHVybiBuZXcgQ29TRUVkZ2UobnVsbCwgbnVsbCwgdkVkZ2UpO1xufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUuaW5pdFBhcmFtZXRlcnMgPSBmdW5jdGlvbiAoKSB7XG4gIEZETGF5b3V0LnByb3RvdHlwZS5pbml0UGFyYW1ldGVycy5jYWxsKHRoaXMsIGFyZ3VtZW50cyk7XG4gIGlmICghdGhpcy5pc1N1YkxheW91dCkge1xuICAgIGlmIChDb1NFQ29uc3RhbnRzLkRFRkFVTFRfRURHRV9MRU5HVEggPCAxMCkge1xuICAgICAgdGhpcy5pZGVhbEVkZ2VMZW5ndGggPSAxMDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pZGVhbEVkZ2VMZW5ndGggPSBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfRURHRV9MRU5HVEg7XG4gICAgfVxuXG4gICAgdGhpcy51c2VTbWFydElkZWFsRWRnZUxlbmd0aENhbGN1bGF0aW9uID0gQ29TRUNvbnN0YW50cy5ERUZBVUxUX1VTRV9TTUFSVF9JREVBTF9FREdFX0xFTkdUSF9DQUxDVUxBVElPTjtcbiAgICB0aGlzLmdyYXZpdHlDb25zdGFudCA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfR1JBVklUWV9TVFJFTkdUSDtcbiAgICB0aGlzLmNvbXBvdW5kR3Jhdml0eUNvbnN0YW50ID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9DT01QT1VORF9HUkFWSVRZX1NUUkVOR1RIO1xuICAgIHRoaXMuZ3Jhdml0eVJhbmdlRmFjdG9yID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9HUkFWSVRZX1JBTkdFX0ZBQ1RPUjtcbiAgICB0aGlzLmNvbXBvdW5kR3Jhdml0eVJhbmdlRmFjdG9yID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9DT01QT1VORF9HUkFWSVRZX1JBTkdFX0ZBQ1RPUjtcblxuICAgIC8vIHZhcmlhYmxlcyBmb3IgdHJlZSByZWR1Y3Rpb24gc3VwcG9ydFxuICAgIHRoaXMucHJ1bmVkTm9kZXNBbGwgPSBbXTtcbiAgICB0aGlzLmdyb3dUcmVlSXRlcmF0aW9ucyA9IDA7XG4gICAgdGhpcy5hZnRlckdyb3d0aEl0ZXJhdGlvbnMgPSAwO1xuICAgIHRoaXMuaXNUcmVlR3Jvd2luZyA9IGZhbHNlO1xuICAgIHRoaXMuaXNHcm93dGhGaW5pc2hlZCA9IGZhbHNlO1xuICB9XG59O1xuXG4vLyBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIHNldCBDb1NFIHJlbGF0ZWQgcGFyYW1ldGVycyB1c2VkIGJ5IHNwcmluZyBlbWJlZGRlci5cbkNvU0VMYXlvdXQucHJvdG90eXBlLmluaXRTcHJpbmdFbWJlZGRlciA9IGZ1bmN0aW9uICgpIHtcbiAgRkRMYXlvdXQucHJvdG90eXBlLmluaXRTcHJpbmdFbWJlZGRlci5jYWxsKHRoaXMpO1xuXG4gIC8vIHZhcmlhYmxlcyBmb3IgY29vbGluZ1xuICB0aGlzLmNvb2xpbmdDeWNsZSA9IDA7XG4gIHRoaXMubWF4Q29vbGluZ0N5Y2xlID0gdGhpcy5tYXhJdGVyYXRpb25zIC8gRkRMYXlvdXRDb25zdGFudHMuQ09OVkVSR0VOQ0VfQ0hFQ0tfUEVSSU9EO1xuICB0aGlzLmZpbmFsVGVtcGVyYXR1cmUgPSAwLjA0O1xuICB0aGlzLmNvb2xpbmdBZGp1c3RlciA9IDE7XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5sYXlvdXQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBjcmVhdGVCZW5kc0FzTmVlZGVkID0gTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQ1JFQVRFX0JFTkRTX0FTX05FRURFRDtcbiAgaWYgKGNyZWF0ZUJlbmRzQXNOZWVkZWQpIHtcbiAgICB0aGlzLmNyZWF0ZUJlbmRwb2ludHMoKTtcbiAgICB0aGlzLmdyYXBoTWFuYWdlci5yZXNldEFsbEVkZ2VzKCk7XG4gIH1cblxuICB0aGlzLmxldmVsID0gMDtcbiAgcmV0dXJuIHRoaXMuY2xhc3NpY0xheW91dCgpO1xufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUuY2xhc3NpY0xheW91dCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5ub2Rlc1dpdGhHcmF2aXR5ID0gdGhpcy5jYWxjdWxhdGVOb2Rlc1RvQXBwbHlHcmF2aXRhdGlvblRvKCk7XG4gIHRoaXMuZ3JhcGhNYW5hZ2VyLnNldEFsbE5vZGVzVG9BcHBseUdyYXZpdGF0aW9uKHRoaXMubm9kZXNXaXRoR3Jhdml0eSk7XG4gIHRoaXMuY2FsY05vT2ZDaGlsZHJlbkZvckFsbE5vZGVzKCk7XG4gIHRoaXMuZ3JhcGhNYW5hZ2VyLmNhbGNMb3dlc3RDb21tb25BbmNlc3RvcnMoKTtcbiAgdGhpcy5ncmFwaE1hbmFnZXIuY2FsY0luY2x1c2lvblRyZWVEZXB0aHMoKTtcbiAgdGhpcy5ncmFwaE1hbmFnZXIuZ2V0Um9vdCgpLmNhbGNFc3RpbWF0ZWRTaXplKCk7XG4gIHRoaXMuY2FsY0lkZWFsRWRnZUxlbmd0aHMoKTtcblxuICBpZiAoIXRoaXMuaW5jcmVtZW50YWwpIHtcbiAgICB2YXIgZm9yZXN0ID0gdGhpcy5nZXRGbGF0Rm9yZXN0KCk7XG5cbiAgICAvLyBUaGUgZ3JhcGggYXNzb2NpYXRlZCB3aXRoIHRoaXMgbGF5b3V0IGlzIGZsYXQgYW5kIGEgZm9yZXN0XG4gICAgaWYgKGZvcmVzdC5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnBvc2l0aW9uTm9kZXNSYWRpYWxseShmb3Jlc3QpO1xuICAgIH1cbiAgICAvLyBUaGUgZ3JhcGggYXNzb2NpYXRlZCB3aXRoIHRoaXMgbGF5b3V0IGlzIG5vdCBmbGF0IG9yIGEgZm9yZXN0XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIFJlZHVjZSB0aGUgdHJlZXMgd2hlbiBpbmNyZW1lbnRhbCBtb2RlIGlzIG5vdCBlbmFibGVkIGFuZCBncmFwaCBpcyBub3QgYSBmb3Jlc3QgXG4gICAgICAgIHRoaXMucmVkdWNlVHJlZXMoKTtcbiAgICAgICAgLy8gVXBkYXRlIG5vZGVzIHRoYXQgZ3Jhdml0eSB3aWxsIGJlIGFwcGxpZWRcbiAgICAgICAgdGhpcy5ncmFwaE1hbmFnZXIucmVzZXRBbGxOb2Rlc1RvQXBwbHlHcmF2aXRhdGlvbigpO1xuICAgICAgICB2YXIgYWxsTm9kZXMgPSBuZXcgU2V0KHRoaXMuZ2V0QWxsTm9kZXMoKSk7XG4gICAgICAgIHZhciBpbnRlcnNlY3Rpb24gPSB0aGlzLm5vZGVzV2l0aEdyYXZpdHkuZmlsdGVyKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgcmV0dXJuIGFsbE5vZGVzLmhhcyh4KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZ3JhcGhNYW5hZ2VyLnNldEFsbE5vZGVzVG9BcHBseUdyYXZpdGF0aW9uKGludGVyc2VjdGlvbik7XG5cbiAgICAgICAgdGhpcy5wb3NpdGlvbk5vZGVzUmFuZG9tbHkoKTtcbiAgICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoQ29TRUNvbnN0YW50cy5UUkVFX1JFRFVDVElPTl9PTl9JTkNSRU1FTlRBTCkge1xuICAgICAgLy8gUmVkdWNlIHRoZSB0cmVlcyBpbiBpbmNyZW1lbnRhbCBtb2RlIGlmIG9ubHkgdGhpcyBjb25zdGFudCBpcyBzZXQgdG8gdHJ1ZSBcbiAgICAgIHRoaXMucmVkdWNlVHJlZXMoKTtcbiAgICAgIC8vIFVwZGF0ZSBub2RlcyB0aGF0IGdyYXZpdHkgd2lsbCBiZSBhcHBsaWVkXG4gICAgICB0aGlzLmdyYXBoTWFuYWdlci5yZXNldEFsbE5vZGVzVG9BcHBseUdyYXZpdGF0aW9uKCk7XG4gICAgICB2YXIgYWxsTm9kZXMgPSBuZXcgU2V0KHRoaXMuZ2V0QWxsTm9kZXMoKSk7XG4gICAgICB2YXIgaW50ZXJzZWN0aW9uID0gdGhpcy5ub2Rlc1dpdGhHcmF2aXR5LmZpbHRlcihmdW5jdGlvbiAoeCkge1xuICAgICAgICByZXR1cm4gYWxsTm9kZXMuaGFzKHgpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmdyYXBoTWFuYWdlci5zZXRBbGxOb2Rlc1RvQXBwbHlHcmF2aXRhdGlvbihpbnRlcnNlY3Rpb24pO1xuICAgIH1cbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyh0aGlzLmNvbnN0cmFpbnRzKS5sZW5ndGggPiAwKSB7XG4gICAgQ29uc3RyYWludEhhbmRsZXIuaGFuZGxlQ29uc3RyYWludHModGhpcyk7XG4gICAgdGhpcy5pbml0Q29uc3RyYWludFZhcmlhYmxlcygpO1xuICB9XG5cbiAgdGhpcy5pbml0U3ByaW5nRW1iZWRkZXIoKTtcbiAgaWYgKENvU0VDb25zdGFudHMuQVBQTFlfTEFZT1VUKSB7XG4gICAgdGhpcy5ydW5TcHJpbmdFbWJlZGRlcigpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS50aWNrID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLnRvdGFsSXRlcmF0aW9ucysrO1xuXG4gIGlmICh0aGlzLnRvdGFsSXRlcmF0aW9ucyA9PT0gdGhpcy5tYXhJdGVyYXRpb25zICYmICF0aGlzLmlzVHJlZUdyb3dpbmcgJiYgIXRoaXMuaXNHcm93dGhGaW5pc2hlZCkge1xuICAgIGlmICh0aGlzLnBydW5lZE5vZGVzQWxsLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuaXNUcmVlR3Jvd2luZyA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0aGlzLnRvdGFsSXRlcmF0aW9ucyAlIEZETGF5b3V0Q29uc3RhbnRzLkNPTlZFUkdFTkNFX0NIRUNLX1BFUklPRCA9PSAwICYmICF0aGlzLmlzVHJlZUdyb3dpbmcgJiYgIXRoaXMuaXNHcm93dGhGaW5pc2hlZCkge1xuICAgIGlmICh0aGlzLmlzQ29udmVyZ2VkKCkpIHtcbiAgICAgIGlmICh0aGlzLnBydW5lZE5vZGVzQWxsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5pc1RyZWVHcm93aW5nID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuY29vbGluZ0N5Y2xlKys7XG5cbiAgICBpZiAodGhpcy5sYXlvdXRRdWFsaXR5ID09IDApIHtcbiAgICAgIC8vIHF1YWxpdHkgLSBcImRyYWZ0XCJcbiAgICAgIHRoaXMuY29vbGluZ0FkanVzdGVyID0gdGhpcy5jb29saW5nQ3ljbGU7XG4gICAgfSBlbHNlIGlmICh0aGlzLmxheW91dFF1YWxpdHkgPT0gMSkge1xuICAgICAgLy8gcXVhbGl0eSAtIFwiZGVmYXVsdFwiXG4gICAgICB0aGlzLmNvb2xpbmdBZGp1c3RlciA9IHRoaXMuY29vbGluZ0N5Y2xlIC8gMztcbiAgICB9XG5cbiAgICAvLyBjb29saW5nIHNjaGVkdWxlIGlzIGJhc2VkIG9uIGh0dHA6Ly93d3cuYnRsdWtlLmNvbS9zaW1hbmYxLmh0bWwgLT4gY29vbGluZyBzY2hlZHVsZSAzXG4gICAgdGhpcy5jb29saW5nRmFjdG9yID0gTWF0aC5tYXgodGhpcy5pbml0aWFsQ29vbGluZ0ZhY3RvciAtIE1hdGgucG93KHRoaXMuY29vbGluZ0N5Y2xlLCBNYXRoLmxvZygxMDAgKiAodGhpcy5pbml0aWFsQ29vbGluZ0ZhY3RvciAtIHRoaXMuZmluYWxUZW1wZXJhdHVyZSkpIC8gTWF0aC5sb2codGhpcy5tYXhDb29saW5nQ3ljbGUpKSAvIDEwMCAqIHRoaXMuY29vbGluZ0FkanVzdGVyLCB0aGlzLmZpbmFsVGVtcGVyYXR1cmUpO1xuICAgIHRoaXMuYW5pbWF0aW9uUGVyaW9kID0gTWF0aC5jZWlsKHRoaXMuaW5pdGlhbEFuaW1hdGlvblBlcmlvZCAqIE1hdGguc3FydCh0aGlzLmNvb2xpbmdGYWN0b3IpKTtcbiAgfVxuICAvLyBPcGVyYXRpb25zIHdoaWxlIHRyZWUgaXMgZ3Jvd2luZyBhZ2FpbiBcbiAgaWYgKHRoaXMuaXNUcmVlR3Jvd2luZykge1xuICAgIGlmICh0aGlzLmdyb3dUcmVlSXRlcmF0aW9ucyAlIDEwID09IDApIHtcbiAgICAgIGlmICh0aGlzLnBydW5lZE5vZGVzQWxsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5ncmFwaE1hbmFnZXIudXBkYXRlQm91bmRzKCk7XG4gICAgICAgIHRoaXMudXBkYXRlR3JpZCgpO1xuICAgICAgICB0aGlzLmdyb3dUcmVlKHRoaXMucHJ1bmVkTm9kZXNBbGwpO1xuICAgICAgICAvLyBVcGRhdGUgbm9kZXMgdGhhdCBncmF2aXR5IHdpbGwgYmUgYXBwbGllZFxuICAgICAgICB0aGlzLmdyYXBoTWFuYWdlci5yZXNldEFsbE5vZGVzVG9BcHBseUdyYXZpdGF0aW9uKCk7XG4gICAgICAgIHZhciBhbGxOb2RlcyA9IG5ldyBTZXQodGhpcy5nZXRBbGxOb2RlcygpKTtcbiAgICAgICAgdmFyIGludGVyc2VjdGlvbiA9IHRoaXMubm9kZXNXaXRoR3Jhdml0eS5maWx0ZXIoZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICByZXR1cm4gYWxsTm9kZXMuaGFzKHgpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5ncmFwaE1hbmFnZXIuc2V0QWxsTm9kZXNUb0FwcGx5R3Jhdml0YXRpb24oaW50ZXJzZWN0aW9uKTtcblxuICAgICAgICB0aGlzLmdyYXBoTWFuYWdlci51cGRhdGVCb3VuZHMoKTtcbiAgICAgICAgdGhpcy51cGRhdGVHcmlkKCk7XG4gICAgICAgIGlmIChDb1NFQ29uc3RhbnRzLlBVUkVfSU5DUkVNRU5UQUwpIHRoaXMuY29vbGluZ0ZhY3RvciA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQ09PTElOR19GQUNUT1JfSU5DUkVNRU5UQUwgLyAyO2Vsc2UgdGhpcy5jb29saW5nRmFjdG9yID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9DT09MSU5HX0ZBQ1RPUl9JTkNSRU1FTlRBTDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaXNUcmVlR3Jvd2luZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzR3Jvd3RoRmluaXNoZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmdyb3dUcmVlSXRlcmF0aW9ucysrO1xuICB9XG4gIC8vIE9wZXJhdGlvbnMgYWZ0ZXIgZ3Jvd3RoIGlzIGZpbmlzaGVkXG4gIGlmICh0aGlzLmlzR3Jvd3RoRmluaXNoZWQpIHtcbiAgICBpZiAodGhpcy5pc0NvbnZlcmdlZCgpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYWZ0ZXJHcm93dGhJdGVyYXRpb25zICUgMTAgPT0gMCkge1xuICAgICAgdGhpcy5ncmFwaE1hbmFnZXIudXBkYXRlQm91bmRzKCk7XG4gICAgICB0aGlzLnVwZGF0ZUdyaWQoKTtcbiAgICB9XG4gICAgaWYgKENvU0VDb25zdGFudHMuUFVSRV9JTkNSRU1FTlRBTCkgdGhpcy5jb29saW5nRmFjdG9yID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9DT09MSU5HX0ZBQ1RPUl9JTkNSRU1FTlRBTCAvIDIgKiAoKDEwMCAtIHRoaXMuYWZ0ZXJHcm93dGhJdGVyYXRpb25zKSAvIDEwMCk7ZWxzZSB0aGlzLmNvb2xpbmdGYWN0b3IgPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0NPT0xJTkdfRkFDVE9SX0lOQ1JFTUVOVEFMICogKCgxMDAgLSB0aGlzLmFmdGVyR3Jvd3RoSXRlcmF0aW9ucykgLyAxMDApO1xuICAgIHRoaXMuYWZ0ZXJHcm93dGhJdGVyYXRpb25zKys7XG4gIH1cblxuICB2YXIgZ3JpZFVwZGF0ZUFsbG93ZWQgPSAhdGhpcy5pc1RyZWVHcm93aW5nICYmICF0aGlzLmlzR3Jvd3RoRmluaXNoZWQ7XG4gIHZhciBmb3JjZVRvTm9kZVN1cnJvdW5kaW5nVXBkYXRlID0gdGhpcy5ncm93VHJlZUl0ZXJhdGlvbnMgJSAxMCA9PSAxICYmIHRoaXMuaXNUcmVlR3Jvd2luZyB8fCB0aGlzLmFmdGVyR3Jvd3RoSXRlcmF0aW9ucyAlIDEwID09IDEgJiYgdGhpcy5pc0dyb3d0aEZpbmlzaGVkO1xuXG4gIHRoaXMudG90YWxEaXNwbGFjZW1lbnQgPSAwO1xuICB0aGlzLmdyYXBoTWFuYWdlci51cGRhdGVCb3VuZHMoKTtcbiAgdGhpcy5jYWxjU3ByaW5nRm9yY2VzKCk7XG4gIHRoaXMuY2FsY1JlcHVsc2lvbkZvcmNlcyhncmlkVXBkYXRlQWxsb3dlZCwgZm9yY2VUb05vZGVTdXJyb3VuZGluZ1VwZGF0ZSk7XG4gIHRoaXMuY2FsY0dyYXZpdGF0aW9uYWxGb3JjZXMoKTtcbiAgdGhpcy5tb3ZlTm9kZXMoKTtcbiAgdGhpcy5hbmltYXRlKCk7XG5cbiAgcmV0dXJuIGZhbHNlOyAvLyBMYXlvdXQgaXMgbm90IGVuZGVkIHlldCByZXR1cm4gZmFsc2Vcbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLmdldFBvc2l0aW9uc0RhdGEgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBhbGxOb2RlcyA9IHRoaXMuZ3JhcGhNYW5hZ2VyLmdldEFsbE5vZGVzKCk7XG4gIHZhciBwRGF0YSA9IHt9O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHJlY3QgPSBhbGxOb2Rlc1tpXS5yZWN0O1xuICAgIHZhciBpZCA9IGFsbE5vZGVzW2ldLmlkO1xuICAgIHBEYXRhW2lkXSA9IHtcbiAgICAgIGlkOiBpZCxcbiAgICAgIHg6IHJlY3QuZ2V0Q2VudGVyWCgpLFxuICAgICAgeTogcmVjdC5nZXRDZW50ZXJZKCksXG4gICAgICB3OiByZWN0LndpZHRoLFxuICAgICAgaDogcmVjdC5oZWlnaHRcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHBEYXRhO1xufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUucnVuU3ByaW5nRW1iZWRkZXIgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuaW5pdGlhbEFuaW1hdGlvblBlcmlvZCA9IDI1O1xuICB0aGlzLmFuaW1hdGlvblBlcmlvZCA9IHRoaXMuaW5pdGlhbEFuaW1hdGlvblBlcmlvZDtcbiAgdmFyIGxheW91dEVuZGVkID0gZmFsc2U7XG5cbiAgLy8gSWYgYW1pbmF0ZSBvcHRpb24gaXMgJ2R1cmluZycgc2lnbmFsIHRoYXQgbGF5b3V0IGlzIHN1cHBvc2VkIHRvIHN0YXJ0IGl0ZXJhdGluZ1xuICBpZiAoRkRMYXlvdXRDb25zdGFudHMuQU5JTUFURSA9PT0gJ2R1cmluZycpIHtcbiAgICB0aGlzLmVtaXQoJ2xheW91dHN0YXJ0ZWQnKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBJZiBhbWluYXRlIG9wdGlvbiBpcyAnZHVyaW5nJyB0aWNrKCkgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgb24gaW5kZXguanNcbiAgICB3aGlsZSAoIWxheW91dEVuZGVkKSB7XG4gICAgICBsYXlvdXRFbmRlZCA9IHRoaXMudGljaygpO1xuICAgIH1cblxuICAgIHRoaXMuZ3JhcGhNYW5hZ2VyLnVwZGF0ZUJvdW5kcygpO1xuICB9XG59O1xuXG4vLyBvdmVycmlkZXMgbW92ZU5vZGVzIG1ldGhvZCBpbiBGRExheW91dFxuQ29TRUxheW91dC5wcm90b3R5cGUubW92ZU5vZGVzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbE5vZGVzID0gdGhpcy5nZXRBbGxOb2RlcygpO1xuICB2YXIgbm9kZTtcblxuICAvLyBjYWxjdWxhdGUgZGlzcGxhY2VtZW50IGZvciBlYWNoIG5vZGUgXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgbm9kZSA9IGxOb2Rlc1tpXTtcbiAgICBub2RlLmNhbGN1bGF0ZURpc3BsYWNlbWVudCgpO1xuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKHRoaXMuY29uc3RyYWludHMpLmxlbmd0aCA+IDApIHtcbiAgICB0aGlzLnVwZGF0ZURpc3BsYWNlbWVudHMoKTtcbiAgfVxuXG4gIC8vIG1vdmUgZWFjaCBub2RlXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgbm9kZSA9IGxOb2Rlc1tpXTtcbiAgICBub2RlLm1vdmUoKTtcbiAgfVxufTtcblxuLy8gY29uc3RyYWludCByZWxhdGVkIG1ldGhvZHM6IGluaXRDb25zdHJhaW50VmFyaWFibGVzIGFuZCB1cGRhdGVEaXNwbGFjZW1lbnRzXG5cbi8vIGluaXRpYWxpemUgY29uc3RyYWludCByZWxhdGVkIHZhcmlhYmxlc1xuQ29TRUxheW91dC5wcm90b3R5cGUuaW5pdENvbnN0cmFpbnRWYXJpYWJsZXMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdGhpcy5pZFRvTm9kZU1hcCA9IG5ldyBNYXAoKTtcbiAgdGhpcy5maXhlZE5vZGVTZXQgPSBuZXcgU2V0KCk7XG5cbiAgdmFyIGFsbE5vZGVzID0gdGhpcy5ncmFwaE1hbmFnZXIuZ2V0QWxsTm9kZXMoKTtcblxuICAvLyBmaWxsIGlkVG9Ob2RlTWFwXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYWxsTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbm9kZSA9IGFsbE5vZGVzW2ldO1xuICAgIHRoaXMuaWRUb05vZGVNYXAuc2V0KG5vZGUuaWQsIG5vZGUpO1xuICB9XG5cbiAgLy8gY2FsY3VsYXRlIGZpeGVkIG5vZGUgd2VpZ2h0IGZvciBnaXZlbiBjb21wb3VuZCBub2RlXG4gIHZhciBjYWxjdWxhdGVDb21wb3VuZFdlaWdodCA9IGZ1bmN0aW9uIGNhbGN1bGF0ZUNvbXBvdW5kV2VpZ2h0KGNvbXBvdW5kTm9kZSkge1xuICAgIHZhciBub2RlcyA9IGNvbXBvdW5kTm9kZS5nZXRDaGlsZCgpLmdldE5vZGVzKCk7XG4gICAgdmFyIG5vZGU7XG4gICAgdmFyIGZpeGVkTm9kZVdlaWdodCA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgaWYgKG5vZGUuZ2V0Q2hpbGQoKSA9PSBudWxsKSB7XG4gICAgICAgIGlmIChzZWxmLmZpeGVkTm9kZVNldC5oYXMobm9kZS5pZCkpIHtcbiAgICAgICAgICBmaXhlZE5vZGVXZWlnaHQgKz0gMTAwO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaXhlZE5vZGVXZWlnaHQgKz0gY2FsY3VsYXRlQ29tcG91bmRXZWlnaHQobm9kZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmaXhlZE5vZGVXZWlnaHQ7XG4gIH07XG5cbiAgaWYgKHRoaXMuY29uc3RyYWludHMuZml4ZWROb2RlQ29uc3RyYWludCkge1xuICAgIC8vIGZpbGwgZml4ZWROb2RlU2V0XG4gICAgdGhpcy5jb25zdHJhaW50cy5maXhlZE5vZGVDb25zdHJhaW50LmZvckVhY2goZnVuY3Rpb24gKG5vZGVEYXRhKSB7XG4gICAgICBzZWxmLmZpeGVkTm9kZVNldC5hZGQobm9kZURhdGEubm9kZUlkKTtcbiAgICB9KTtcblxuICAgIC8vIGFzc2lnbiBmaXhlZCBub2RlIHdlaWdodHMgdG8gY29tcG91bmRzIGlmIHRoZXkgY29udGFpbiBmaXhlZCBub2Rlc1xuICAgIHZhciBhbGxOb2RlcyA9IHRoaXMuZ3JhcGhNYW5hZ2VyLmdldEFsbE5vZGVzKCk7XG4gICAgdmFyIG5vZGU7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBub2RlID0gYWxsTm9kZXNbaV07XG4gICAgICBpZiAobm9kZS5nZXRDaGlsZCgpICE9IG51bGwpIHtcbiAgICAgICAgdmFyIGZpeGVkTm9kZVdlaWdodCA9IGNhbGN1bGF0ZUNvbXBvdW5kV2VpZ2h0KG5vZGUpO1xuICAgICAgICBpZiAoZml4ZWROb2RlV2VpZ2h0ID4gMCkge1xuICAgICAgICAgIG5vZGUuZml4ZWROb2RlV2VpZ2h0ID0gZml4ZWROb2RlV2VpZ2h0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHRoaXMuY29uc3RyYWludHMucmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50KSB7XG4gICAgdmFyIG5vZGVUb0R1bW15Rm9yVmVydGljYWxBbGlnbm1lbnQgPSBuZXcgTWFwKCk7XG4gICAgdmFyIG5vZGVUb0R1bW15Rm9ySG9yaXpvbnRhbEFsaWdubWVudCA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLmR1bW15VG9Ob2RlRm9yVmVydGljYWxBbGlnbm1lbnQgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5kdW1teVRvTm9kZUZvckhvcml6b250YWxBbGlnbm1lbnQgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5maXhlZE5vZGVzT25Ib3Jpem9udGFsID0gbmV3IFNldCgpO1xuICAgIHRoaXMuZml4ZWROb2Rlc09uVmVydGljYWwgPSBuZXcgU2V0KCk7XG5cbiAgICAvLyBmaWxsIG1hcHMgYW5kIHNldHNcbiAgICB0aGlzLmZpeGVkTm9kZVNldC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgIHNlbGYuZml4ZWROb2Rlc09uSG9yaXpvbnRhbC5hZGQobm9kZUlkKTtcbiAgICAgIHNlbGYuZml4ZWROb2Rlc09uVmVydGljYWwuYWRkKG5vZGVJZCk7XG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5jb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50KSB7XG4gICAgICBpZiAodGhpcy5jb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50LnZlcnRpY2FsKSB7XG4gICAgICAgIHZhciB2ZXJ0aWNhbEFsaWdubWVudCA9IHRoaXMuY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludC52ZXJ0aWNhbDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2ZXJ0aWNhbEFsaWdubWVudC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHRoaXMuZHVtbXlUb05vZGVGb3JWZXJ0aWNhbEFsaWdubWVudC5zZXQoXCJkdW1teVwiICsgaSwgW10pO1xuICAgICAgICAgIHZlcnRpY2FsQWxpZ25tZW50W2ldLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgbm9kZVRvRHVtbXlGb3JWZXJ0aWNhbEFsaWdubWVudC5zZXQobm9kZUlkLCBcImR1bW15XCIgKyBpKTtcbiAgICAgICAgICAgIHNlbGYuZHVtbXlUb05vZGVGb3JWZXJ0aWNhbEFsaWdubWVudC5nZXQoXCJkdW1teVwiICsgaSkucHVzaChub2RlSWQpO1xuICAgICAgICAgICAgaWYgKHNlbGYuZml4ZWROb2RlU2V0Lmhhcyhub2RlSWQpKSB7XG4gICAgICAgICAgICAgIHNlbGYuZml4ZWROb2Rlc09uSG9yaXpvbnRhbC5hZGQoXCJkdW1teVwiICsgaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQuaG9yaXpvbnRhbCkge1xuICAgICAgICB2YXIgaG9yaXpvbnRhbEFsaWdubWVudCA9IHRoaXMuY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludC5ob3Jpem9udGFsO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhvcml6b250YWxBbGlnbm1lbnQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB0aGlzLmR1bW15VG9Ob2RlRm9ySG9yaXpvbnRhbEFsaWdubWVudC5zZXQoXCJkdW1teVwiICsgaSwgW10pO1xuICAgICAgICAgIGhvcml6b250YWxBbGlnbm1lbnRbaV0uZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICBub2RlVG9EdW1teUZvckhvcml6b250YWxBbGlnbm1lbnQuc2V0KG5vZGVJZCwgXCJkdW1teVwiICsgaSk7XG4gICAgICAgICAgICBzZWxmLmR1bW15VG9Ob2RlRm9ySG9yaXpvbnRhbEFsaWdubWVudC5nZXQoXCJkdW1teVwiICsgaSkucHVzaChub2RlSWQpO1xuICAgICAgICAgICAgaWYgKHNlbGYuZml4ZWROb2RlU2V0Lmhhcyhub2RlSWQpKSB7XG4gICAgICAgICAgICAgIHNlbGYuZml4ZWROb2Rlc09uVmVydGljYWwuYWRkKFwiZHVtbXlcIiArIGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKENvU0VDb25zdGFudHMuUkVMQVhfTU9WRU1FTlRfT05fQ09OU1RSQUlOVFMpIHtcblxuICAgICAgdGhpcy5zaHVmZmxlID0gZnVuY3Rpb24gKGFycmF5KSB7XG4gICAgICAgIHZhciBqLCB4LCBpO1xuICAgICAgICBmb3IgKGkgPSBhcnJheS5sZW5ndGggLSAxOyBpID49IDIgKiBhcnJheS5sZW5ndGggLyAzOyBpLS0pIHtcbiAgICAgICAgICBqID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKGkgKyAxKSk7XG4gICAgICAgICAgeCA9IGFycmF5W2ldO1xuICAgICAgICAgIGFycmF5W2ldID0gYXJyYXlbal07XG4gICAgICAgICAgYXJyYXlbal0gPSB4O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcnJheTtcbiAgICAgIH07XG5cbiAgICAgIHRoaXMubm9kZXNJblJlbGF0aXZlSG9yaXpvbnRhbCA9IFtdO1xuICAgICAgdGhpcy5ub2Rlc0luUmVsYXRpdmVWZXJ0aWNhbCA9IFtdO1xuICAgICAgdGhpcy5ub2RlVG9SZWxhdGl2ZUNvbnN0cmFpbnRNYXBIb3Jpem9udGFsID0gbmV3IE1hcCgpO1xuICAgICAgdGhpcy5ub2RlVG9SZWxhdGl2ZUNvbnN0cmFpbnRNYXBWZXJ0aWNhbCA9IG5ldyBNYXAoKTtcbiAgICAgIHRoaXMubm9kZVRvVGVtcFBvc2l0aW9uTWFwSG9yaXpvbnRhbCA9IG5ldyBNYXAoKTtcbiAgICAgIHRoaXMubm9kZVRvVGVtcFBvc2l0aW9uTWFwVmVydGljYWwgPSBuZXcgTWFwKCk7XG5cbiAgICAgIC8vIGZpbGwgYXJyYXlzIGFuZCBtYXBzXG4gICAgICB0aGlzLmNvbnN0cmFpbnRzLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludC5mb3JFYWNoKGZ1bmN0aW9uIChjb25zdHJhaW50KSB7XG4gICAgICAgIGlmIChjb25zdHJhaW50LmxlZnQpIHtcbiAgICAgICAgICB2YXIgbm9kZUlkTGVmdCA9IG5vZGVUb0R1bW15Rm9yVmVydGljYWxBbGlnbm1lbnQuaGFzKGNvbnN0cmFpbnQubGVmdCkgPyBub2RlVG9EdW1teUZvclZlcnRpY2FsQWxpZ25tZW50LmdldChjb25zdHJhaW50LmxlZnQpIDogY29uc3RyYWludC5sZWZ0O1xuICAgICAgICAgIHZhciBub2RlSWRSaWdodCA9IG5vZGVUb0R1bW15Rm9yVmVydGljYWxBbGlnbm1lbnQuaGFzKGNvbnN0cmFpbnQucmlnaHQpID8gbm9kZVRvRHVtbXlGb3JWZXJ0aWNhbEFsaWdubWVudC5nZXQoY29uc3RyYWludC5yaWdodCkgOiBjb25zdHJhaW50LnJpZ2h0O1xuXG4gICAgICAgICAgaWYgKCFzZWxmLm5vZGVzSW5SZWxhdGl2ZUhvcml6b250YWwuaW5jbHVkZXMobm9kZUlkTGVmdCkpIHtcbiAgICAgICAgICAgIHNlbGYubm9kZXNJblJlbGF0aXZlSG9yaXpvbnRhbC5wdXNoKG5vZGVJZExlZnQpO1xuICAgICAgICAgICAgc2VsZi5ub2RlVG9SZWxhdGl2ZUNvbnN0cmFpbnRNYXBIb3Jpem9udGFsLnNldChub2RlSWRMZWZ0LCBbXSk7XG4gICAgICAgICAgICBpZiAoc2VsZi5kdW1teVRvTm9kZUZvclZlcnRpY2FsQWxpZ25tZW50Lmhhcyhub2RlSWRMZWZ0KSkge1xuICAgICAgICAgICAgICBzZWxmLm5vZGVUb1RlbXBQb3NpdGlvbk1hcEhvcml6b250YWwuc2V0KG5vZGVJZExlZnQsIHNlbGYuaWRUb05vZGVNYXAuZ2V0KHNlbGYuZHVtbXlUb05vZGVGb3JWZXJ0aWNhbEFsaWdubWVudC5nZXQobm9kZUlkTGVmdClbMF0pLmdldENlbnRlclgoKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzZWxmLm5vZGVUb1RlbXBQb3NpdGlvbk1hcEhvcml6b250YWwuc2V0KG5vZGVJZExlZnQsIHNlbGYuaWRUb05vZGVNYXAuZ2V0KG5vZGVJZExlZnQpLmdldENlbnRlclgoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghc2VsZi5ub2Rlc0luUmVsYXRpdmVIb3Jpem9udGFsLmluY2x1ZGVzKG5vZGVJZFJpZ2h0KSkge1xuICAgICAgICAgICAgc2VsZi5ub2Rlc0luUmVsYXRpdmVIb3Jpem9udGFsLnB1c2gobm9kZUlkUmlnaHQpO1xuICAgICAgICAgICAgc2VsZi5ub2RlVG9SZWxhdGl2ZUNvbnN0cmFpbnRNYXBIb3Jpem9udGFsLnNldChub2RlSWRSaWdodCwgW10pO1xuICAgICAgICAgICAgaWYgKHNlbGYuZHVtbXlUb05vZGVGb3JWZXJ0aWNhbEFsaWdubWVudC5oYXMobm9kZUlkUmlnaHQpKSB7XG4gICAgICAgICAgICAgIHNlbGYubm9kZVRvVGVtcFBvc2l0aW9uTWFwSG9yaXpvbnRhbC5zZXQobm9kZUlkUmlnaHQsIHNlbGYuaWRUb05vZGVNYXAuZ2V0KHNlbGYuZHVtbXlUb05vZGVGb3JWZXJ0aWNhbEFsaWdubWVudC5nZXQobm9kZUlkUmlnaHQpWzBdKS5nZXRDZW50ZXJYKCkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc2VsZi5ub2RlVG9UZW1wUG9zaXRpb25NYXBIb3Jpem9udGFsLnNldChub2RlSWRSaWdodCwgc2VsZi5pZFRvTm9kZU1hcC5nZXQobm9kZUlkUmlnaHQpLmdldENlbnRlclgoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2VsZi5ub2RlVG9SZWxhdGl2ZUNvbnN0cmFpbnRNYXBIb3Jpem9udGFsLmdldChub2RlSWRMZWZ0KS5wdXNoKHsgcmlnaHQ6IG5vZGVJZFJpZ2h0LCBnYXA6IGNvbnN0cmFpbnQuZ2FwIH0pO1xuICAgICAgICAgIHNlbGYubm9kZVRvUmVsYXRpdmVDb25zdHJhaW50TWFwSG9yaXpvbnRhbC5nZXQobm9kZUlkUmlnaHQpLnB1c2goeyBsZWZ0OiBub2RlSWRMZWZ0LCBnYXA6IGNvbnN0cmFpbnQuZ2FwIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBub2RlSWRUb3AgPSBub2RlVG9EdW1teUZvckhvcml6b250YWxBbGlnbm1lbnQuaGFzKGNvbnN0cmFpbnQudG9wKSA/IG5vZGVUb0R1bW15Rm9ySG9yaXpvbnRhbEFsaWdubWVudC5nZXQoY29uc3RyYWludC50b3ApIDogY29uc3RyYWludC50b3A7XG4gICAgICAgICAgdmFyIG5vZGVJZEJvdHRvbSA9IG5vZGVUb0R1bW15Rm9ySG9yaXpvbnRhbEFsaWdubWVudC5oYXMoY29uc3RyYWludC5ib3R0b20pID8gbm9kZVRvRHVtbXlGb3JIb3Jpem9udGFsQWxpZ25tZW50LmdldChjb25zdHJhaW50LmJvdHRvbSkgOiBjb25zdHJhaW50LmJvdHRvbTtcblxuICAgICAgICAgIGlmICghc2VsZi5ub2Rlc0luUmVsYXRpdmVWZXJ0aWNhbC5pbmNsdWRlcyhub2RlSWRUb3ApKSB7XG4gICAgICAgICAgICBzZWxmLm5vZGVzSW5SZWxhdGl2ZVZlcnRpY2FsLnB1c2gobm9kZUlkVG9wKTtcbiAgICAgICAgICAgIHNlbGYubm9kZVRvUmVsYXRpdmVDb25zdHJhaW50TWFwVmVydGljYWwuc2V0KG5vZGVJZFRvcCwgW10pO1xuICAgICAgICAgICAgaWYgKHNlbGYuZHVtbXlUb05vZGVGb3JIb3Jpem9udGFsQWxpZ25tZW50Lmhhcyhub2RlSWRUb3ApKSB7XG4gICAgICAgICAgICAgIHNlbGYubm9kZVRvVGVtcFBvc2l0aW9uTWFwVmVydGljYWwuc2V0KG5vZGVJZFRvcCwgc2VsZi5pZFRvTm9kZU1hcC5nZXQoc2VsZi5kdW1teVRvTm9kZUZvckhvcml6b250YWxBbGlnbm1lbnQuZ2V0KG5vZGVJZFRvcClbMF0pLmdldENlbnRlclkoKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzZWxmLm5vZGVUb1RlbXBQb3NpdGlvbk1hcFZlcnRpY2FsLnNldChub2RlSWRUb3AsIHNlbGYuaWRUb05vZGVNYXAuZ2V0KG5vZGVJZFRvcCkuZ2V0Q2VudGVyWSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFzZWxmLm5vZGVzSW5SZWxhdGl2ZVZlcnRpY2FsLmluY2x1ZGVzKG5vZGVJZEJvdHRvbSkpIHtcbiAgICAgICAgICAgIHNlbGYubm9kZXNJblJlbGF0aXZlVmVydGljYWwucHVzaChub2RlSWRCb3R0b20pO1xuICAgICAgICAgICAgc2VsZi5ub2RlVG9SZWxhdGl2ZUNvbnN0cmFpbnRNYXBWZXJ0aWNhbC5zZXQobm9kZUlkQm90dG9tLCBbXSk7XG4gICAgICAgICAgICBpZiAoc2VsZi5kdW1teVRvTm9kZUZvckhvcml6b250YWxBbGlnbm1lbnQuaGFzKG5vZGVJZEJvdHRvbSkpIHtcbiAgICAgICAgICAgICAgc2VsZi5ub2RlVG9UZW1wUG9zaXRpb25NYXBWZXJ0aWNhbC5zZXQobm9kZUlkQm90dG9tLCBzZWxmLmlkVG9Ob2RlTWFwLmdldChzZWxmLmR1bW15VG9Ob2RlRm9ySG9yaXpvbnRhbEFsaWdubWVudC5nZXQobm9kZUlkQm90dG9tKVswXSkuZ2V0Q2VudGVyWSgpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNlbGYubm9kZVRvVGVtcFBvc2l0aW9uTWFwVmVydGljYWwuc2V0KG5vZGVJZEJvdHRvbSwgc2VsZi5pZFRvTm9kZU1hcC5nZXQobm9kZUlkQm90dG9tKS5nZXRDZW50ZXJZKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBzZWxmLm5vZGVUb1JlbGF0aXZlQ29uc3RyYWludE1hcFZlcnRpY2FsLmdldChub2RlSWRUb3ApLnB1c2goeyBib3R0b206IG5vZGVJZEJvdHRvbSwgZ2FwOiBjb25zdHJhaW50LmdhcCB9KTtcbiAgICAgICAgICBzZWxmLm5vZGVUb1JlbGF0aXZlQ29uc3RyYWludE1hcFZlcnRpY2FsLmdldChub2RlSWRCb3R0b20pLnB1c2goeyB0b3A6IG5vZGVJZFRvcCwgZ2FwOiBjb25zdHJhaW50LmdhcCB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBzdWJHcmFwaE9uSG9yaXpvbnRhbCA9IG5ldyBNYXAoKTsgLy8gc3ViZ3JhcGggZnJvbSB2ZXJ0aWNhbCBSUCBjb25zdHJhaW50c1xuICAgICAgdmFyIHN1YkdyYXBoT25WZXJ0aWNhbCA9IG5ldyBNYXAoKTsgLy8gc3ViZ3JhcGggZnJvbSB2ZXJ0aWNhbCBSUCBjb25zdHJhaW50c1xuXG4gICAgICAvLyBjb25zdHJ1Y3Qgc3ViZ3JhcGhzIGZyb20gcmVsYXRpdmUgcGxhY2VtZW50IGNvbnN0cmFpbnRzIFxuICAgICAgdGhpcy5jb25zdHJhaW50cy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQuZm9yRWFjaChmdW5jdGlvbiAoY29uc3RyYWludCkge1xuICAgICAgICBpZiAoY29uc3RyYWludC5sZWZ0KSB7XG4gICAgICAgICAgdmFyIGxlZnQgPSBub2RlVG9EdW1teUZvclZlcnRpY2FsQWxpZ25tZW50Lmhhcyhjb25zdHJhaW50LmxlZnQpID8gbm9kZVRvRHVtbXlGb3JWZXJ0aWNhbEFsaWdubWVudC5nZXQoY29uc3RyYWludC5sZWZ0KSA6IGNvbnN0cmFpbnQubGVmdDtcbiAgICAgICAgICB2YXIgcmlnaHQgPSBub2RlVG9EdW1teUZvclZlcnRpY2FsQWxpZ25tZW50Lmhhcyhjb25zdHJhaW50LnJpZ2h0KSA/IG5vZGVUb0R1bW15Rm9yVmVydGljYWxBbGlnbm1lbnQuZ2V0KGNvbnN0cmFpbnQucmlnaHQpIDogY29uc3RyYWludC5yaWdodDtcbiAgICAgICAgICBpZiAoc3ViR3JhcGhPbkhvcml6b250YWwuaGFzKGxlZnQpKSB7XG4gICAgICAgICAgICBzdWJHcmFwaE9uSG9yaXpvbnRhbC5nZXQobGVmdCkucHVzaChyaWdodCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN1YkdyYXBoT25Ib3Jpem9udGFsLnNldChsZWZ0LCBbcmlnaHRdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHN1YkdyYXBoT25Ib3Jpem9udGFsLmhhcyhyaWdodCkpIHtcbiAgICAgICAgICAgIHN1YkdyYXBoT25Ib3Jpem9udGFsLmdldChyaWdodCkucHVzaChsZWZ0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3ViR3JhcGhPbkhvcml6b250YWwuc2V0KHJpZ2h0LCBbbGVmdF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgdG9wID0gbm9kZVRvRHVtbXlGb3JIb3Jpem9udGFsQWxpZ25tZW50Lmhhcyhjb25zdHJhaW50LnRvcCkgPyBub2RlVG9EdW1teUZvckhvcml6b250YWxBbGlnbm1lbnQuZ2V0KGNvbnN0cmFpbnQudG9wKSA6IGNvbnN0cmFpbnQudG9wO1xuICAgICAgICAgIHZhciBib3R0b20gPSBub2RlVG9EdW1teUZvckhvcml6b250YWxBbGlnbm1lbnQuaGFzKGNvbnN0cmFpbnQuYm90dG9tKSA/IG5vZGVUb0R1bW15Rm9ySG9yaXpvbnRhbEFsaWdubWVudC5nZXQoY29uc3RyYWludC5ib3R0b20pIDogY29uc3RyYWludC5ib3R0b207XG4gICAgICAgICAgaWYgKHN1YkdyYXBoT25WZXJ0aWNhbC5oYXModG9wKSkge1xuICAgICAgICAgICAgc3ViR3JhcGhPblZlcnRpY2FsLmdldCh0b3ApLnB1c2goYm90dG9tKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3ViR3JhcGhPblZlcnRpY2FsLnNldCh0b3AsIFtib3R0b21dKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHN1YkdyYXBoT25WZXJ0aWNhbC5oYXMoYm90dG9tKSkge1xuICAgICAgICAgICAgc3ViR3JhcGhPblZlcnRpY2FsLmdldChib3R0b20pLnB1c2godG9wKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3ViR3JhcGhPblZlcnRpY2FsLnNldChib3R0b20sIFt0b3BdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBmdW5jdGlvbiB0byBjb25zdHJ1Y3QgY29tcG9uZW50cyBmcm9tIGEgZ2l2ZW4gZ3JhcGggXG4gICAgICAvLyBhbHNvIHJldHVybnMgYW4gYXJyYXkgdGhhdCBrZWVwcyB3aGV0aGVyIGVhY2ggY29tcG9uZW50IGNvbnRhaW5zIGZpeGVkIG5vZGVcbiAgICAgIHZhciBjb25zdHJ1Y3RDb21wb25lbnRzID0gZnVuY3Rpb24gY29uc3RydWN0Q29tcG9uZW50cyhncmFwaCwgZml4ZWROb2Rlcykge1xuICAgICAgICB2YXIgY29tcG9uZW50cyA9IFtdO1xuICAgICAgICB2YXIgaXNGaXhlZCA9IFtdO1xuICAgICAgICB2YXIgcXVldWUgPSBuZXcgTGlua2VkTGlzdCgpO1xuICAgICAgICB2YXIgdmlzaXRlZCA9IG5ldyBTZXQoKTtcbiAgICAgICAgdmFyIGNvdW50ID0gMDtcblxuICAgICAgICBncmFwaC5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICAgICAgaWYgKCF2aXNpdGVkLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICBjb21wb25lbnRzW2NvdW50XSA9IFtdO1xuICAgICAgICAgICAgaXNGaXhlZFtjb3VudF0gPSBmYWxzZTtcbiAgICAgICAgICAgIHZhciBjdXJyZW50Tm9kZSA9IGtleTtcbiAgICAgICAgICAgIHF1ZXVlLnB1c2goY3VycmVudE5vZGUpO1xuICAgICAgICAgICAgdmlzaXRlZC5hZGQoY3VycmVudE5vZGUpO1xuICAgICAgICAgICAgY29tcG9uZW50c1tjb3VudF0ucHVzaChjdXJyZW50Tm9kZSk7XG5cbiAgICAgICAgICAgIHdoaWxlIChxdWV1ZS5sZW5ndGggIT0gMCkge1xuICAgICAgICAgICAgICBjdXJyZW50Tm9kZSA9IHF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICAgIGlmIChmaXhlZE5vZGVzLmhhcyhjdXJyZW50Tm9kZSkpIHtcbiAgICAgICAgICAgICAgICBpc0ZpeGVkW2NvdW50XSA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdmFyIG5laWdoYm9ycyA9IGdyYXBoLmdldChjdXJyZW50Tm9kZSk7XG4gICAgICAgICAgICAgIG5laWdoYm9ycy5mb3JFYWNoKGZ1bmN0aW9uIChuZWlnaGJvcikge1xuICAgICAgICAgICAgICAgIGlmICghdmlzaXRlZC5oYXMobmVpZ2hib3IpKSB7XG4gICAgICAgICAgICAgICAgICBxdWV1ZS5wdXNoKG5laWdoYm9yKTtcbiAgICAgICAgICAgICAgICAgIHZpc2l0ZWQuYWRkKG5laWdoYm9yKTtcbiAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHNbY291bnRdLnB1c2gobmVpZ2hib3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb3VudCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHsgY29tcG9uZW50czogY29tcG9uZW50cywgaXNGaXhlZDogaXNGaXhlZCB9O1xuICAgICAgfTtcblxuICAgICAgdmFyIHJlc3VsdE9uSG9yaXpvbnRhbCA9IGNvbnN0cnVjdENvbXBvbmVudHMoc3ViR3JhcGhPbkhvcml6b250YWwsIHNlbGYuZml4ZWROb2Rlc09uSG9yaXpvbnRhbCk7XG4gICAgICB0aGlzLmNvbXBvbmVudHNPbkhvcml6b250YWwgPSByZXN1bHRPbkhvcml6b250YWwuY29tcG9uZW50cztcbiAgICAgIHRoaXMuZml4ZWRDb21wb25lbnRzT25Ib3Jpem9udGFsID0gcmVzdWx0T25Ib3Jpem9udGFsLmlzRml4ZWQ7XG4gICAgICB2YXIgcmVzdWx0T25WZXJ0aWNhbCA9IGNvbnN0cnVjdENvbXBvbmVudHMoc3ViR3JhcGhPblZlcnRpY2FsLCBzZWxmLmZpeGVkTm9kZXNPblZlcnRpY2FsKTtcbiAgICAgIHRoaXMuY29tcG9uZW50c09uVmVydGljYWwgPSByZXN1bHRPblZlcnRpY2FsLmNvbXBvbmVudHM7XG4gICAgICB0aGlzLmZpeGVkQ29tcG9uZW50c09uVmVydGljYWwgPSByZXN1bHRPblZlcnRpY2FsLmlzRml4ZWQ7XG4gICAgfVxuICB9XG59O1xuXG4vLyB1cGRhdGVzIG5vZGUgZGlzcGxhY2VtZW50cyBiYXNlZCBvbiBjb25zdHJhaW50c1xuQ29TRUxheW91dC5wcm90b3R5cGUudXBkYXRlRGlzcGxhY2VtZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBpZiAodGhpcy5jb25zdHJhaW50cy5maXhlZE5vZGVDb25zdHJhaW50KSB7XG4gICAgdGhpcy5jb25zdHJhaW50cy5maXhlZE5vZGVDb25zdHJhaW50LmZvckVhY2goZnVuY3Rpb24gKG5vZGVEYXRhKSB7XG4gICAgICB2YXIgZml4ZWROb2RlID0gc2VsZi5pZFRvTm9kZU1hcC5nZXQobm9kZURhdGEubm9kZUlkKTtcbiAgICAgIGZpeGVkTm9kZS5kaXNwbGFjZW1lbnRYID0gMDtcbiAgICAgIGZpeGVkTm9kZS5kaXNwbGFjZW1lbnRZID0gMDtcbiAgICB9KTtcbiAgfVxuXG4gIGlmICh0aGlzLmNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQpIHtcbiAgICBpZiAodGhpcy5jb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50LnZlcnRpY2FsKSB7XG4gICAgICB2YXIgYWxsVmVydGljYWxBbGlnbm1lbnRzID0gdGhpcy5jb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50LnZlcnRpY2FsO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbGxWZXJ0aWNhbEFsaWdubWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHRvdGFsRGlzcGxhY2VtZW50WCA9IDA7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgYWxsVmVydGljYWxBbGlnbm1lbnRzW2ldLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgaWYgKHRoaXMuZml4ZWROb2RlU2V0LmhhcyhhbGxWZXJ0aWNhbEFsaWdubWVudHNbaV1bal0pKSB7XG4gICAgICAgICAgICB0b3RhbERpc3BsYWNlbWVudFggPSAwO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRvdGFsRGlzcGxhY2VtZW50WCArPSB0aGlzLmlkVG9Ob2RlTWFwLmdldChhbGxWZXJ0aWNhbEFsaWdubWVudHNbaV1bal0pLmRpc3BsYWNlbWVudFg7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGF2ZXJhZ2VEaXNwbGFjZW1lbnRYID0gdG90YWxEaXNwbGFjZW1lbnRYIC8gYWxsVmVydGljYWxBbGlnbm1lbnRzW2ldLmxlbmd0aDtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBhbGxWZXJ0aWNhbEFsaWdubWVudHNbaV0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICB0aGlzLmlkVG9Ob2RlTWFwLmdldChhbGxWZXJ0aWNhbEFsaWdubWVudHNbaV1bal0pLmRpc3BsYWNlbWVudFggPSBhdmVyYWdlRGlzcGxhY2VtZW50WDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5jb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50Lmhvcml6b250YWwpIHtcbiAgICAgIHZhciBhbGxIb3Jpem9udGFsQWxpZ25tZW50cyA9IHRoaXMuY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludC5ob3Jpem9udGFsO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbGxIb3Jpem9udGFsQWxpZ25tZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgdG90YWxEaXNwbGFjZW1lbnRZID0gMDtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBhbGxIb3Jpem9udGFsQWxpZ25tZW50c1tpXS5sZW5ndGg7IGorKykge1xuICAgICAgICAgIGlmICh0aGlzLmZpeGVkTm9kZVNldC5oYXMoYWxsSG9yaXpvbnRhbEFsaWdubWVudHNbaV1bal0pKSB7XG4gICAgICAgICAgICB0b3RhbERpc3BsYWNlbWVudFkgPSAwO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRvdGFsRGlzcGxhY2VtZW50WSArPSB0aGlzLmlkVG9Ob2RlTWFwLmdldChhbGxIb3Jpem9udGFsQWxpZ25tZW50c1tpXVtqXSkuZGlzcGxhY2VtZW50WTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYXZlcmFnZURpc3BsYWNlbWVudFkgPSB0b3RhbERpc3BsYWNlbWVudFkgLyBhbGxIb3Jpem9udGFsQWxpZ25tZW50c1tpXS5sZW5ndGg7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgYWxsSG9yaXpvbnRhbEFsaWdubWVudHNbaV0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICB0aGlzLmlkVG9Ob2RlTWFwLmdldChhbGxIb3Jpem9udGFsQWxpZ25tZW50c1tpXVtqXSkuZGlzcGxhY2VtZW50WSA9IGF2ZXJhZ2VEaXNwbGFjZW1lbnRZO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHRoaXMuY29uc3RyYWludHMucmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50KSB7XG5cbiAgICBpZiAoQ29TRUNvbnN0YW50cy5SRUxBWF9NT1ZFTUVOVF9PTl9DT05TVFJBSU5UUykge1xuICAgICAgLy8gc2h1ZmZsZSBhcnJheSB0byByYW5kb21pemUgbm9kZSBwcm9jZXNzaW5nIG9yZGVyXG4gICAgICBpZiAodGhpcy50b3RhbEl0ZXJhdGlvbnMgJSAxMCA9PSAwKSB7XG4gICAgICAgIHRoaXMuc2h1ZmZsZSh0aGlzLm5vZGVzSW5SZWxhdGl2ZUhvcml6b250YWwpO1xuICAgICAgICB0aGlzLnNodWZmbGUodGhpcy5ub2Rlc0luUmVsYXRpdmVWZXJ0aWNhbCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubm9kZXNJblJlbGF0aXZlSG9yaXpvbnRhbC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgaWYgKCFzZWxmLmZpeGVkTm9kZXNPbkhvcml6b250YWwuaGFzKG5vZGVJZCkpIHtcbiAgICAgICAgICB2YXIgZGlzcGxhY2VtZW50ID0gMDtcbiAgICAgICAgICBpZiAoc2VsZi5kdW1teVRvTm9kZUZvclZlcnRpY2FsQWxpZ25tZW50Lmhhcyhub2RlSWQpKSB7XG4gICAgICAgICAgICBkaXNwbGFjZW1lbnQgPSBzZWxmLmlkVG9Ob2RlTWFwLmdldChzZWxmLmR1bW15VG9Ob2RlRm9yVmVydGljYWxBbGlnbm1lbnQuZ2V0KG5vZGVJZClbMF0pLmRpc3BsYWNlbWVudFg7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRpc3BsYWNlbWVudCA9IHNlbGYuaWRUb05vZGVNYXAuZ2V0KG5vZGVJZCkuZGlzcGxhY2VtZW50WDtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2VsZi5ub2RlVG9SZWxhdGl2ZUNvbnN0cmFpbnRNYXBIb3Jpem9udGFsLmdldChub2RlSWQpLmZvckVhY2goZnVuY3Rpb24gKGNvbnN0cmFpbnQpIHtcbiAgICAgICAgICAgIGlmIChjb25zdHJhaW50LnJpZ2h0KSB7XG4gICAgICAgICAgICAgIHZhciBkaWZmID0gc2VsZi5ub2RlVG9UZW1wUG9zaXRpb25NYXBIb3Jpem9udGFsLmdldChjb25zdHJhaW50LnJpZ2h0KSAtIHNlbGYubm9kZVRvVGVtcFBvc2l0aW9uTWFwSG9yaXpvbnRhbC5nZXQobm9kZUlkKSAtIGRpc3BsYWNlbWVudDtcbiAgICAgICAgICAgICAgaWYgKGRpZmYgPCBjb25zdHJhaW50LmdhcCkge1xuICAgICAgICAgICAgICAgIGRpc3BsYWNlbWVudCAtPSBjb25zdHJhaW50LmdhcCAtIGRpZmY7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZhciBkaWZmID0gc2VsZi5ub2RlVG9UZW1wUG9zaXRpb25NYXBIb3Jpem9udGFsLmdldChub2RlSWQpIC0gc2VsZi5ub2RlVG9UZW1wUG9zaXRpb25NYXBIb3Jpem9udGFsLmdldChjb25zdHJhaW50LmxlZnQpICsgZGlzcGxhY2VtZW50O1xuICAgICAgICAgICAgICBpZiAoZGlmZiA8IGNvbnN0cmFpbnQuZ2FwKSB7XG4gICAgICAgICAgICAgICAgZGlzcGxhY2VtZW50ICs9IGNvbnN0cmFpbnQuZ2FwIC0gZGlmZjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHNlbGYubm9kZVRvVGVtcFBvc2l0aW9uTWFwSG9yaXpvbnRhbC5zZXQobm9kZUlkLCBzZWxmLm5vZGVUb1RlbXBQb3NpdGlvbk1hcEhvcml6b250YWwuZ2V0KG5vZGVJZCkgKyBkaXNwbGFjZW1lbnQpO1xuICAgICAgICAgIGlmIChzZWxmLmR1bW15VG9Ob2RlRm9yVmVydGljYWxBbGlnbm1lbnQuaGFzKG5vZGVJZCkpIHtcbiAgICAgICAgICAgIHNlbGYuZHVtbXlUb05vZGVGb3JWZXJ0aWNhbEFsaWdubWVudC5nZXQobm9kZUlkKS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgICAgc2VsZi5pZFRvTm9kZU1hcC5nZXQobm9kZUlkKS5kaXNwbGFjZW1lbnRYID0gZGlzcGxhY2VtZW50O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlbGYuaWRUb05vZGVNYXAuZ2V0KG5vZGVJZCkuZGlzcGxhY2VtZW50WCA9IGRpc3BsYWNlbWVudDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLm5vZGVzSW5SZWxhdGl2ZVZlcnRpY2FsLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICBpZiAoIXNlbGYuZml4ZWROb2Rlc09uSG9yaXpvbnRhbC5oYXMobm9kZUlkKSkge1xuICAgICAgICAgIHZhciBkaXNwbGFjZW1lbnQgPSAwO1xuICAgICAgICAgIGlmIChzZWxmLmR1bW15VG9Ob2RlRm9ySG9yaXpvbnRhbEFsaWdubWVudC5oYXMobm9kZUlkKSkge1xuICAgICAgICAgICAgZGlzcGxhY2VtZW50ID0gc2VsZi5pZFRvTm9kZU1hcC5nZXQoc2VsZi5kdW1teVRvTm9kZUZvckhvcml6b250YWxBbGlnbm1lbnQuZ2V0KG5vZGVJZClbMF0pLmRpc3BsYWNlbWVudFk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRpc3BsYWNlbWVudCA9IHNlbGYuaWRUb05vZGVNYXAuZ2V0KG5vZGVJZCkuZGlzcGxhY2VtZW50WTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2VsZi5ub2RlVG9SZWxhdGl2ZUNvbnN0cmFpbnRNYXBWZXJ0aWNhbC5nZXQobm9kZUlkKS5mb3JFYWNoKGZ1bmN0aW9uIChjb25zdHJhaW50KSB7XG4gICAgICAgICAgICBpZiAoY29uc3RyYWludC5ib3R0b20pIHtcbiAgICAgICAgICAgICAgdmFyIGRpZmYgPSBzZWxmLm5vZGVUb1RlbXBQb3NpdGlvbk1hcFZlcnRpY2FsLmdldChjb25zdHJhaW50LmJvdHRvbSkgLSBzZWxmLm5vZGVUb1RlbXBQb3NpdGlvbk1hcFZlcnRpY2FsLmdldChub2RlSWQpIC0gZGlzcGxhY2VtZW50O1xuICAgICAgICAgICAgICBpZiAoZGlmZiA8IGNvbnN0cmFpbnQuZ2FwKSB7XG4gICAgICAgICAgICAgICAgZGlzcGxhY2VtZW50IC09IGNvbnN0cmFpbnQuZ2FwIC0gZGlmZjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdmFyIGRpZmYgPSBzZWxmLm5vZGVUb1RlbXBQb3NpdGlvbk1hcFZlcnRpY2FsLmdldChub2RlSWQpIC0gc2VsZi5ub2RlVG9UZW1wUG9zaXRpb25NYXBWZXJ0aWNhbC5nZXQoY29uc3RyYWludC50b3ApICsgZGlzcGxhY2VtZW50O1xuICAgICAgICAgICAgICBpZiAoZGlmZiA8IGNvbnN0cmFpbnQuZ2FwKSB7XG4gICAgICAgICAgICAgICAgZGlzcGxhY2VtZW50ICs9IGNvbnN0cmFpbnQuZ2FwIC0gZGlmZjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHNlbGYubm9kZVRvVGVtcFBvc2l0aW9uTWFwVmVydGljYWwuc2V0KG5vZGVJZCwgc2VsZi5ub2RlVG9UZW1wUG9zaXRpb25NYXBWZXJ0aWNhbC5nZXQobm9kZUlkKSArIGRpc3BsYWNlbWVudCk7XG4gICAgICAgICAgaWYgKHNlbGYuZHVtbXlUb05vZGVGb3JIb3Jpem9udGFsQWxpZ25tZW50Lmhhcyhub2RlSWQpKSB7XG4gICAgICAgICAgICBzZWxmLmR1bW15VG9Ob2RlRm9ySG9yaXpvbnRhbEFsaWdubWVudC5nZXQobm9kZUlkKS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgICAgc2VsZi5pZFRvTm9kZU1hcC5nZXQobm9kZUlkKS5kaXNwbGFjZW1lbnRZID0gZGlzcGxhY2VtZW50O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlbGYuaWRUb05vZGVNYXAuZ2V0KG5vZGVJZCkuZGlzcGxhY2VtZW50WSA9IGRpc3BsYWNlbWVudDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29tcG9uZW50c09uSG9yaXpvbnRhbC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRzT25Ib3Jpem9udGFsW2ldO1xuICAgICAgICBpZiAodGhpcy5maXhlZENvbXBvbmVudHNPbkhvcml6b250YWxbaV0pIHtcbiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNvbXBvbmVudC5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuZHVtbXlUb05vZGVGb3JWZXJ0aWNhbEFsaWdubWVudC5oYXMoY29tcG9uZW50W2pdKSkge1xuICAgICAgICAgICAgICB0aGlzLmR1bW15VG9Ob2RlRm9yVmVydGljYWxBbGlnbm1lbnQuZ2V0KGNvbXBvbmVudFtqXSkuZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5pZFRvTm9kZU1hcC5nZXQobm9kZUlkKS5kaXNwbGFjZW1lbnRYID0gMDtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmlkVG9Ob2RlTWFwLmdldChjb21wb25lbnRbal0pLmRpc3BsYWNlbWVudFggPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgc3VtID0gMDtcbiAgICAgICAgICB2YXIgY291bnQgPSAwO1xuICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY29tcG9uZW50Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kdW1teVRvTm9kZUZvclZlcnRpY2FsQWxpZ25tZW50Lmhhcyhjb21wb25lbnRbal0pKSB7XG4gICAgICAgICAgICAgIHZhciBhY3R1YWxOb2RlcyA9IHRoaXMuZHVtbXlUb05vZGVGb3JWZXJ0aWNhbEFsaWdubWVudC5nZXQoY29tcG9uZW50W2pdKTtcbiAgICAgICAgICAgICAgc3VtICs9IGFjdHVhbE5vZGVzLmxlbmd0aCAqIHRoaXMuaWRUb05vZGVNYXAuZ2V0KGFjdHVhbE5vZGVzWzBdKS5kaXNwbGFjZW1lbnRYO1xuICAgICAgICAgICAgICBjb3VudCArPSBhY3R1YWxOb2Rlcy5sZW5ndGg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzdW0gKz0gdGhpcy5pZFRvTm9kZU1hcC5nZXQoY29tcG9uZW50W2pdKS5kaXNwbGFjZW1lbnRYO1xuICAgICAgICAgICAgICBjb3VudCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgYXZlcmFnZURpc3BsYWNlbWVudCA9IHN1bSAvIGNvdW50O1xuICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY29tcG9uZW50Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kdW1teVRvTm9kZUZvclZlcnRpY2FsQWxpZ25tZW50Lmhhcyhjb21wb25lbnRbal0pKSB7XG4gICAgICAgICAgICAgIHRoaXMuZHVtbXlUb05vZGVGb3JWZXJ0aWNhbEFsaWdubWVudC5nZXQoY29tcG9uZW50W2pdKS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgICAgICBzZWxmLmlkVG9Ob2RlTWFwLmdldChub2RlSWQpLmRpc3BsYWNlbWVudFggPSBhdmVyYWdlRGlzcGxhY2VtZW50O1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuaWRUb05vZGVNYXAuZ2V0KGNvbXBvbmVudFtqXSkuZGlzcGxhY2VtZW50WCA9IGF2ZXJhZ2VEaXNwbGFjZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb21wb25lbnRzT25WZXJ0aWNhbC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRzT25WZXJ0aWNhbFtpXTtcbiAgICAgICAgaWYgKHRoaXMuZml4ZWRDb21wb25lbnRzT25WZXJ0aWNhbFtpXSkge1xuICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY29tcG9uZW50Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kdW1teVRvTm9kZUZvckhvcml6b250YWxBbGlnbm1lbnQuaGFzKGNvbXBvbmVudFtqXSkpIHtcbiAgICAgICAgICAgICAgdGhpcy5kdW1teVRvTm9kZUZvckhvcml6b250YWxBbGlnbm1lbnQuZ2V0KGNvbXBvbmVudFtqXSkuZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5pZFRvTm9kZU1hcC5nZXQobm9kZUlkKS5kaXNwbGFjZW1lbnRZID0gMDtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmlkVG9Ob2RlTWFwLmdldChjb21wb25lbnRbal0pLmRpc3BsYWNlbWVudFkgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgc3VtID0gMDtcbiAgICAgICAgICB2YXIgY291bnQgPSAwO1xuICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY29tcG9uZW50Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kdW1teVRvTm9kZUZvckhvcml6b250YWxBbGlnbm1lbnQuaGFzKGNvbXBvbmVudFtqXSkpIHtcbiAgICAgICAgICAgICAgdmFyIGFjdHVhbE5vZGVzID0gdGhpcy5kdW1teVRvTm9kZUZvckhvcml6b250YWxBbGlnbm1lbnQuZ2V0KGNvbXBvbmVudFtqXSk7XG4gICAgICAgICAgICAgIHN1bSArPSBhY3R1YWxOb2Rlcy5sZW5ndGggKiB0aGlzLmlkVG9Ob2RlTWFwLmdldChhY3R1YWxOb2Rlc1swXSkuZGlzcGxhY2VtZW50WTtcbiAgICAgICAgICAgICAgY291bnQgKz0gYWN0dWFsTm9kZXMubGVuZ3RoO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc3VtICs9IHRoaXMuaWRUb05vZGVNYXAuZ2V0KGNvbXBvbmVudFtqXSkuZGlzcGxhY2VtZW50WTtcbiAgICAgICAgICAgICAgY291bnQrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIGF2ZXJhZ2VEaXNwbGFjZW1lbnQgPSBzdW0gLyBjb3VudDtcbiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNvbXBvbmVudC5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuZHVtbXlUb05vZGVGb3JIb3Jpem9udGFsQWxpZ25tZW50Lmhhcyhjb21wb25lbnRbal0pKSB7XG4gICAgICAgICAgICAgIHRoaXMuZHVtbXlUb05vZGVGb3JIb3Jpem9udGFsQWxpZ25tZW50LmdldChjb21wb25lbnRbal0pLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgICAgIHNlbGYuaWRUb05vZGVNYXAuZ2V0KG5vZGVJZCkuZGlzcGxhY2VtZW50WSA9IGF2ZXJhZ2VEaXNwbGFjZW1lbnQ7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5pZFRvTm9kZU1hcC5nZXQoY29tcG9uZW50W2pdKS5kaXNwbGFjZW1lbnRZID0gYXZlcmFnZURpc3BsYWNlbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLmNhbGN1bGF0ZU5vZGVzVG9BcHBseUdyYXZpdGF0aW9uVG8gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBub2RlTGlzdCA9IFtdO1xuICB2YXIgZ3JhcGg7XG5cbiAgdmFyIGdyYXBocyA9IHRoaXMuZ3JhcGhNYW5hZ2VyLmdldEdyYXBocygpO1xuICB2YXIgc2l6ZSA9IGdyYXBocy5sZW5ndGg7XG4gIHZhciBpO1xuICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgZ3JhcGggPSBncmFwaHNbaV07XG5cbiAgICBncmFwaC51cGRhdGVDb25uZWN0ZWQoKTtcblxuICAgIGlmICghZ3JhcGguaXNDb25uZWN0ZWQpIHtcbiAgICAgIG5vZGVMaXN0ID0gbm9kZUxpc3QuY29uY2F0KGdyYXBoLmdldE5vZGVzKCkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBub2RlTGlzdDtcbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLmNyZWF0ZUJlbmRwb2ludHMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBlZGdlcyA9IFtdO1xuICBlZGdlcyA9IGVkZ2VzLmNvbmNhdCh0aGlzLmdyYXBoTWFuYWdlci5nZXRBbGxFZGdlcygpKTtcbiAgdmFyIHZpc2l0ZWQgPSBuZXcgU2V0KCk7XG4gIHZhciBpO1xuICBmb3IgKGkgPSAwOyBpIDwgZWRnZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZWRnZSA9IGVkZ2VzW2ldO1xuXG4gICAgaWYgKCF2aXNpdGVkLmhhcyhlZGdlKSkge1xuICAgICAgdmFyIHNvdXJjZSA9IGVkZ2UuZ2V0U291cmNlKCk7XG4gICAgICB2YXIgdGFyZ2V0ID0gZWRnZS5nZXRUYXJnZXQoKTtcblxuICAgICAgaWYgKHNvdXJjZSA9PSB0YXJnZXQpIHtcbiAgICAgICAgZWRnZS5nZXRCZW5kcG9pbnRzKCkucHVzaChuZXcgUG9pbnREKCkpO1xuICAgICAgICBlZGdlLmdldEJlbmRwb2ludHMoKS5wdXNoKG5ldyBQb2ludEQoKSk7XG4gICAgICAgIHRoaXMuY3JlYXRlRHVtbXlOb2Rlc0ZvckJlbmRwb2ludHMoZWRnZSk7XG4gICAgICAgIHZpc2l0ZWQuYWRkKGVkZ2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGVkZ2VMaXN0ID0gW107XG5cbiAgICAgICAgZWRnZUxpc3QgPSBlZGdlTGlzdC5jb25jYXQoc291cmNlLmdldEVkZ2VMaXN0VG9Ob2RlKHRhcmdldCkpO1xuICAgICAgICBlZGdlTGlzdCA9IGVkZ2VMaXN0LmNvbmNhdCh0YXJnZXQuZ2V0RWRnZUxpc3RUb05vZGUoc291cmNlKSk7XG5cbiAgICAgICAgaWYgKCF2aXNpdGVkLmhhcyhlZGdlTGlzdFswXSkpIHtcbiAgICAgICAgICBpZiAoZWRnZUxpc3QubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgdmFyIGs7XG4gICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgZWRnZUxpc3QubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgdmFyIG11bHRpRWRnZSA9IGVkZ2VMaXN0W2tdO1xuICAgICAgICAgICAgICBtdWx0aUVkZ2UuZ2V0QmVuZHBvaW50cygpLnB1c2gobmV3IFBvaW50RCgpKTtcbiAgICAgICAgICAgICAgdGhpcy5jcmVhdGVEdW1teU5vZGVzRm9yQmVuZHBvaW50cyhtdWx0aUVkZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBlZGdlTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICAgICAgICB2aXNpdGVkLmFkZChlZGdlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh2aXNpdGVkLnNpemUgPT0gZWRnZXMubGVuZ3RoKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLnBvc2l0aW9uTm9kZXNSYWRpYWxseSA9IGZ1bmN0aW9uIChmb3Jlc3QpIHtcbiAgLy8gV2UgdGlsZSB0aGUgdHJlZXMgdG8gYSBncmlkIHJvdyBieSByb3c7IGZpcnN0IHRyZWUgc3RhcnRzIGF0ICgwLDApXG4gIHZhciBjdXJyZW50U3RhcnRpbmdQb2ludCA9IG5ldyBQb2ludCgwLCAwKTtcbiAgdmFyIG51bWJlck9mQ29sdW1ucyA9IE1hdGguY2VpbChNYXRoLnNxcnQoZm9yZXN0Lmxlbmd0aCkpO1xuICB2YXIgaGVpZ2h0ID0gMDtcbiAgdmFyIGN1cnJlbnRZID0gMDtcbiAgdmFyIGN1cnJlbnRYID0gMDtcbiAgdmFyIHBvaW50ID0gbmV3IFBvaW50RCgwLCAwKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGZvcmVzdC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChpICUgbnVtYmVyT2ZDb2x1bW5zID09IDApIHtcbiAgICAgIC8vIFN0YXJ0IG9mIGEgbmV3IHJvdywgbWFrZSB0aGUgeCBjb29yZGluYXRlIDAsIGluY3JlbWVudCB0aGVcbiAgICAgIC8vIHkgY29vcmRpbmF0ZSB3aXRoIHRoZSBtYXggaGVpZ2h0IG9mIHRoZSBwcmV2aW91cyByb3dcbiAgICAgIGN1cnJlbnRYID0gMDtcbiAgICAgIGN1cnJlbnRZID0gaGVpZ2h0O1xuXG4gICAgICBpZiAoaSAhPSAwKSB7XG4gICAgICAgIGN1cnJlbnRZICs9IENvU0VDb25zdGFudHMuREVGQVVMVF9DT01QT05FTlRfU0VQRVJBVElPTjtcbiAgICAgIH1cblxuICAgICAgaGVpZ2h0ID0gMDtcbiAgICB9XG5cbiAgICB2YXIgdHJlZSA9IGZvcmVzdFtpXTtcblxuICAgIC8vIEZpbmQgdGhlIGNlbnRlciBvZiB0aGUgdHJlZVxuICAgIHZhciBjZW50ZXJOb2RlID0gTGF5b3V0LmZpbmRDZW50ZXJPZlRyZWUodHJlZSk7XG5cbiAgICAvLyBTZXQgdGhlIHN0YXJpbmcgcG9pbnQgb2YgdGhlIG5leHQgdHJlZVxuICAgIGN1cnJlbnRTdGFydGluZ1BvaW50LnggPSBjdXJyZW50WDtcbiAgICBjdXJyZW50U3RhcnRpbmdQb2ludC55ID0gY3VycmVudFk7XG5cbiAgICAvLyBEbyBhIHJhZGlhbCBsYXlvdXQgc3RhcnRpbmcgd2l0aCB0aGUgY2VudGVyXG4gICAgcG9pbnQgPSBDb1NFTGF5b3V0LnJhZGlhbExheW91dCh0cmVlLCBjZW50ZXJOb2RlLCBjdXJyZW50U3RhcnRpbmdQb2ludCk7XG5cbiAgICBpZiAocG9pbnQueSA+IGhlaWdodCkge1xuICAgICAgaGVpZ2h0ID0gTWF0aC5mbG9vcihwb2ludC55KTtcbiAgICB9XG5cbiAgICBjdXJyZW50WCA9IE1hdGguZmxvb3IocG9pbnQueCArIENvU0VDb25zdGFudHMuREVGQVVMVF9DT01QT05FTlRfU0VQRVJBVElPTik7XG4gIH1cblxuICB0aGlzLnRyYW5zZm9ybShuZXcgUG9pbnREKExheW91dENvbnN0YW50cy5XT1JMRF9DRU5URVJfWCAtIHBvaW50LnggLyAyLCBMYXlvdXRDb25zdGFudHMuV09STERfQ0VOVEVSX1kgLSBwb2ludC55IC8gMikpO1xufTtcblxuQ29TRUxheW91dC5yYWRpYWxMYXlvdXQgPSBmdW5jdGlvbiAodHJlZSwgY2VudGVyTm9kZSwgc3RhcnRpbmdQb2ludCkge1xuICB2YXIgcmFkaWFsU2VwID0gTWF0aC5tYXgodGhpcy5tYXhEaWFnb25hbEluVHJlZSh0cmVlKSwgQ29TRUNvbnN0YW50cy5ERUZBVUxUX1JBRElBTF9TRVBBUkFUSU9OKTtcbiAgQ29TRUxheW91dC5icmFuY2hSYWRpYWxMYXlvdXQoY2VudGVyTm9kZSwgbnVsbCwgMCwgMzU5LCAwLCByYWRpYWxTZXApO1xuICB2YXIgYm91bmRzID0gTEdyYXBoLmNhbGN1bGF0ZUJvdW5kcyh0cmVlKTtcblxuICB2YXIgdHJhbnNmb3JtID0gbmV3IFRyYW5zZm9ybSgpO1xuICB0cmFuc2Zvcm0uc2V0RGV2aWNlT3JnWChib3VuZHMuZ2V0TWluWCgpKTtcbiAgdHJhbnNmb3JtLnNldERldmljZU9yZ1koYm91bmRzLmdldE1pblkoKSk7XG4gIHRyYW5zZm9ybS5zZXRXb3JsZE9yZ1goc3RhcnRpbmdQb2ludC54KTtcbiAgdHJhbnNmb3JtLnNldFdvcmxkT3JnWShzdGFydGluZ1BvaW50LnkpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdHJlZS5sZW5ndGg7IGkrKykge1xuICAgIHZhciBub2RlID0gdHJlZVtpXTtcbiAgICBub2RlLnRyYW5zZm9ybSh0cmFuc2Zvcm0pO1xuICB9XG5cbiAgdmFyIGJvdHRvbVJpZ2h0ID0gbmV3IFBvaW50RChib3VuZHMuZ2V0TWF4WCgpLCBib3VuZHMuZ2V0TWF4WSgpKTtcblxuICByZXR1cm4gdHJhbnNmb3JtLmludmVyc2VUcmFuc2Zvcm1Qb2ludChib3R0b21SaWdodCk7XG59O1xuXG5Db1NFTGF5b3V0LmJyYW5jaFJhZGlhbExheW91dCA9IGZ1bmN0aW9uIChub2RlLCBwYXJlbnRPZk5vZGUsIHN0YXJ0QW5nbGUsIGVuZEFuZ2xlLCBkaXN0YW5jZSwgcmFkaWFsU2VwYXJhdGlvbikge1xuICAvLyBGaXJzdCwgcG9zaXRpb24gdGhpcyBub2RlIGJ5IGZpbmRpbmcgaXRzIGFuZ2xlLlxuICB2YXIgaGFsZkludGVydmFsID0gKGVuZEFuZ2xlIC0gc3RhcnRBbmdsZSArIDEpIC8gMjtcblxuICBpZiAoaGFsZkludGVydmFsIDwgMCkge1xuICAgIGhhbGZJbnRlcnZhbCArPSAxODA7XG4gIH1cblxuICB2YXIgbm9kZUFuZ2xlID0gKGhhbGZJbnRlcnZhbCArIHN0YXJ0QW5nbGUpICUgMzYwO1xuICB2YXIgdGV0YSA9IG5vZGVBbmdsZSAqIElHZW9tZXRyeS5UV09fUEkgLyAzNjA7XG5cbiAgLy8gTWFrZSBwb2xhciB0byBqYXZhIGNvcmRpbmF0ZSBjb252ZXJzaW9uLlxuICB2YXIgY29zX3RldGEgPSBNYXRoLmNvcyh0ZXRhKTtcbiAgdmFyIHhfID0gZGlzdGFuY2UgKiBNYXRoLmNvcyh0ZXRhKTtcbiAgdmFyIHlfID0gZGlzdGFuY2UgKiBNYXRoLnNpbih0ZXRhKTtcblxuICBub2RlLnNldENlbnRlcih4XywgeV8pO1xuXG4gIC8vIFRyYXZlcnNlIGFsbCBuZWlnaGJvcnMgb2YgdGhpcyBub2RlIGFuZCByZWN1cnNpdmVseSBjYWxsIHRoaXNcbiAgLy8gZnVuY3Rpb24uXG4gIHZhciBuZWlnaGJvckVkZ2VzID0gW107XG4gIG5laWdoYm9yRWRnZXMgPSBuZWlnaGJvckVkZ2VzLmNvbmNhdChub2RlLmdldEVkZ2VzKCkpO1xuICB2YXIgY2hpbGRDb3VudCA9IG5laWdoYm9yRWRnZXMubGVuZ3RoO1xuXG4gIGlmIChwYXJlbnRPZk5vZGUgIT0gbnVsbCkge1xuICAgIGNoaWxkQ291bnQtLTtcbiAgfVxuXG4gIHZhciBicmFuY2hDb3VudCA9IDA7XG5cbiAgdmFyIGluY0VkZ2VzQ291bnQgPSBuZWlnaGJvckVkZ2VzLmxlbmd0aDtcbiAgdmFyIHN0YXJ0SW5kZXg7XG5cbiAgdmFyIGVkZ2VzID0gbm9kZS5nZXRFZGdlc0JldHdlZW4ocGFyZW50T2ZOb2RlKTtcblxuICAvLyBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgZWRnZXMsIHBydW5lIHRoZW0gdW50aWwgdGhlcmUgcmVtYWlucyBvbmx5IG9uZVxuICAvLyBlZGdlLlxuICB3aGlsZSAoZWRnZXMubGVuZ3RoID4gMSkge1xuICAgIC8vbmVpZ2hib3JFZGdlcy5yZW1vdmUoZWRnZXMucmVtb3ZlKDApKTtcbiAgICB2YXIgdGVtcCA9IGVkZ2VzWzBdO1xuICAgIGVkZ2VzLnNwbGljZSgwLCAxKTtcbiAgICB2YXIgaW5kZXggPSBuZWlnaGJvckVkZ2VzLmluZGV4T2YodGVtcCk7XG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgIG5laWdoYm9yRWRnZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gICAgaW5jRWRnZXNDb3VudC0tO1xuICAgIGNoaWxkQ291bnQtLTtcbiAgfVxuXG4gIGlmIChwYXJlbnRPZk5vZGUgIT0gbnVsbCkge1xuICAgIC8vYXNzZXJ0IGVkZ2VzLmxlbmd0aCA9PSAxO1xuICAgIHN0YXJ0SW5kZXggPSAobmVpZ2hib3JFZGdlcy5pbmRleE9mKGVkZ2VzWzBdKSArIDEpICUgaW5jRWRnZXNDb3VudDtcbiAgfSBlbHNlIHtcbiAgICBzdGFydEluZGV4ID0gMDtcbiAgfVxuXG4gIHZhciBzdGVwQW5nbGUgPSBNYXRoLmFicyhlbmRBbmdsZSAtIHN0YXJ0QW5nbGUpIC8gY2hpbGRDb3VudDtcblxuICBmb3IgKHZhciBpID0gc3RhcnRJbmRleDsgYnJhbmNoQ291bnQgIT0gY2hpbGRDb3VudDsgaSA9ICsraSAlIGluY0VkZ2VzQ291bnQpIHtcbiAgICB2YXIgY3VycmVudE5laWdoYm9yID0gbmVpZ2hib3JFZGdlc1tpXS5nZXRPdGhlckVuZChub2RlKTtcblxuICAgIC8vIERvbid0IGJhY2sgdHJhdmVyc2UgdG8gcm9vdCBub2RlIGluIGN1cnJlbnQgdHJlZS5cbiAgICBpZiAoY3VycmVudE5laWdoYm9yID09IHBhcmVudE9mTm9kZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIGNoaWxkU3RhcnRBbmdsZSA9IChzdGFydEFuZ2xlICsgYnJhbmNoQ291bnQgKiBzdGVwQW5nbGUpICUgMzYwO1xuICAgIHZhciBjaGlsZEVuZEFuZ2xlID0gKGNoaWxkU3RhcnRBbmdsZSArIHN0ZXBBbmdsZSkgJSAzNjA7XG5cbiAgICBDb1NFTGF5b3V0LmJyYW5jaFJhZGlhbExheW91dChjdXJyZW50TmVpZ2hib3IsIG5vZGUsIGNoaWxkU3RhcnRBbmdsZSwgY2hpbGRFbmRBbmdsZSwgZGlzdGFuY2UgKyByYWRpYWxTZXBhcmF0aW9uLCByYWRpYWxTZXBhcmF0aW9uKTtcblxuICAgIGJyYW5jaENvdW50Kys7XG4gIH1cbn07XG5cbkNvU0VMYXlvdXQubWF4RGlhZ29uYWxJblRyZWUgPSBmdW5jdGlvbiAodHJlZSkge1xuICB2YXIgbWF4RGlhZ29uYWwgPSBJbnRlZ2VyLk1JTl9WQUxVRTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHRyZWUubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbm9kZSA9IHRyZWVbaV07XG4gICAgdmFyIGRpYWdvbmFsID0gbm9kZS5nZXREaWFnb25hbCgpO1xuXG4gICAgaWYgKGRpYWdvbmFsID4gbWF4RGlhZ29uYWwpIHtcbiAgICAgIG1heERpYWdvbmFsID0gZGlhZ29uYWw7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1heERpYWdvbmFsO1xufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUuY2FsY1JlcHVsc2lvblJhbmdlID0gZnVuY3Rpb24gKCkge1xuICAvLyBmb3JtdWxhIGlzIDIgeCAobGV2ZWwgKyAxKSB4IGlkZWFsRWRnZUxlbmd0aFxuICByZXR1cm4gMiAqICh0aGlzLmxldmVsICsgMSkgKiB0aGlzLmlkZWFsRWRnZUxlbmd0aDtcbn07XG5cbi8vIFRpbGluZyBtZXRob2RzXG5cbi8vIEdyb3VwIHplcm8gZGVncmVlIG1lbWJlcnMgd2hvc2UgcGFyZW50cyBhcmUgbm90IHRvIGJlIHRpbGVkLCBjcmVhdGUgZHVtbXkgcGFyZW50cyB3aGVyZSBuZWVkZWQgYW5kIGZpbGwgbWVtYmVyR3JvdXBzIGJ5IHRoZWlyIGR1bW1wIHBhcmVudCBpZCdzXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5ncm91cFplcm9EZWdyZWVNZW1iZXJzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIC8vIGFycmF5IG9mIFtwYXJlbnRfaWQgeCBvbmVEZWdyZWVOb2RlX2lkXVxuICB2YXIgdGVtcE1lbWJlckdyb3VwcyA9IHt9OyAvLyBBIHRlbXBvcmFyeSBtYXAgb2YgcGFyZW50IG5vZGUgYW5kIGl0cyB6ZXJvIGRlZ3JlZSBtZW1iZXJzXG4gIHRoaXMubWVtYmVyR3JvdXBzID0ge307IC8vIEEgbWFwIG9mIGR1bW15IHBhcmVudCBub2RlIGFuZCBpdHMgemVybyBkZWdyZWUgbWVtYmVycyB3aG9zZSBwYXJlbnRzIGFyZSBub3QgdG8gYmUgdGlsZWRcbiAgdGhpcy5pZFRvRHVtbXlOb2RlID0ge307IC8vIEEgbWFwIG9mIGlkIHRvIGR1bW15IG5vZGUgXG5cbiAgdmFyIHplcm9EZWdyZWUgPSBbXTsgLy8gTGlzdCBvZiB6ZXJvIGRlZ3JlZSBub2RlcyB3aG9zZSBwYXJlbnRzIGFyZSBub3QgdG8gYmUgdGlsZWRcbiAgdmFyIGFsbE5vZGVzID0gdGhpcy5ncmFwaE1hbmFnZXIuZ2V0QWxsTm9kZXMoKTtcblxuICAvLyBGaWxsIHplcm8gZGVncmVlIGxpc3RcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbGxOb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBub2RlID0gYWxsTm9kZXNbaV07XG4gICAgdmFyIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50KCk7XG4gICAgLy8gSWYgYSBub2RlIGhhcyB6ZXJvIGRlZ3JlZSBhbmQgaXRzIHBhcmVudCBpcyBub3QgdG8gYmUgdGlsZWQgaWYgZXhpc3RzIGFkZCB0aGF0IG5vZGUgdG8gemVyb0RlZ3JlcyBsaXN0XG4gICAgaWYgKHRoaXMuZ2V0Tm9kZURlZ3JlZVdpdGhDaGlsZHJlbihub2RlKSA9PT0gMCAmJiAocGFyZW50LmlkID09IHVuZGVmaW5lZCB8fCAhdGhpcy5nZXRUb0JlVGlsZWQocGFyZW50KSkpIHtcbiAgICAgIHplcm9EZWdyZWUucHVzaChub2RlKTtcbiAgICB9XG4gIH1cblxuICAvLyBDcmVhdGUgYSBtYXAgb2YgcGFyZW50IG5vZGUgYW5kIGl0cyB6ZXJvIGRlZ3JlZSBtZW1iZXJzXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgemVyb0RlZ3JlZS5sZW5ndGg7IGkrKykge1xuICAgIHZhciBub2RlID0gemVyb0RlZ3JlZVtpXTsgLy8gWmVybyBkZWdyZWUgbm9kZSBpdHNlbGZcbiAgICB2YXIgcF9pZCA9IG5vZGUuZ2V0UGFyZW50KCkuaWQ7IC8vIFBhcmVudCBpZFxuXG4gICAgaWYgKHR5cGVvZiB0ZW1wTWVtYmVyR3JvdXBzW3BfaWRdID09PSBcInVuZGVmaW5lZFwiKSB0ZW1wTWVtYmVyR3JvdXBzW3BfaWRdID0gW107XG5cbiAgICB0ZW1wTWVtYmVyR3JvdXBzW3BfaWRdID0gdGVtcE1lbWJlckdyb3Vwc1twX2lkXS5jb25jYXQobm9kZSk7IC8vIFB1c2ggbm9kZSB0byB0aGUgbGlzdCBiZWxvbmdzIHRvIGl0cyBwYXJlbnQgaW4gdGVtcE1lbWJlckdyb3Vwc1xuICB9XG5cbiAgLy8gSWYgdGhlcmUgYXJlIGF0IGxlYXN0IHR3byBub2RlcyBhdCBhIGxldmVsLCBjcmVhdGUgYSBkdW1teSBjb21wb3VuZCBmb3IgdGhlbVxuICBPYmplY3Qua2V5cyh0ZW1wTWVtYmVyR3JvdXBzKS5mb3JFYWNoKGZ1bmN0aW9uIChwX2lkKSB7XG4gICAgaWYgKHRlbXBNZW1iZXJHcm91cHNbcF9pZF0ubGVuZ3RoID4gMSkge1xuICAgICAgdmFyIGR1bW15Q29tcG91bmRJZCA9IFwiRHVtbXlDb21wb3VuZF9cIiArIHBfaWQ7IC8vIFRoZSBpZCBvZiBkdW1teSBjb21wb3VuZCB3aGljaCB3aWxsIGJlIGNyZWF0ZWQgc29vblxuICAgICAgc2VsZi5tZW1iZXJHcm91cHNbZHVtbXlDb21wb3VuZElkXSA9IHRlbXBNZW1iZXJHcm91cHNbcF9pZF07IC8vIEFkZCBkdW1teSBjb21wb3VuZCB0byBtZW1iZXJHcm91cHNcblxuICAgICAgdmFyIHBhcmVudCA9IHRlbXBNZW1iZXJHcm91cHNbcF9pZF1bMF0uZ2V0UGFyZW50KCk7IC8vIFRoZSBwYXJlbnQgb2YgemVybyBkZWdyZWUgbm9kZXMgd2lsbCBiZSB0aGUgcGFyZW50IG9mIG5ldyBkdW1teSBjb21wb3VuZFxuXG4gICAgICAvLyBDcmVhdGUgYSBkdW1teSBjb21wb3VuZCB3aXRoIGNhbGN1bGF0ZWQgaWRcbiAgICAgIHZhciBkdW1teUNvbXBvdW5kID0gbmV3IENvU0VOb2RlKHNlbGYuZ3JhcGhNYW5hZ2VyKTtcbiAgICAgIGR1bW15Q29tcG91bmQuaWQgPSBkdW1teUNvbXBvdW5kSWQ7XG4gICAgICBkdW1teUNvbXBvdW5kLnBhZGRpbmdMZWZ0ID0gcGFyZW50LnBhZGRpbmdMZWZ0IHx8IDA7XG4gICAgICBkdW1teUNvbXBvdW5kLnBhZGRpbmdSaWdodCA9IHBhcmVudC5wYWRkaW5nUmlnaHQgfHwgMDtcbiAgICAgIGR1bW15Q29tcG91bmQucGFkZGluZ0JvdHRvbSA9IHBhcmVudC5wYWRkaW5nQm90dG9tIHx8IDA7XG4gICAgICBkdW1teUNvbXBvdW5kLnBhZGRpbmdUb3AgPSBwYXJlbnQucGFkZGluZ1RvcCB8fCAwO1xuXG4gICAgICBzZWxmLmlkVG9EdW1teU5vZGVbZHVtbXlDb21wb3VuZElkXSA9IGR1bW15Q29tcG91bmQ7XG5cbiAgICAgIHZhciBkdW1teVBhcmVudEdyYXBoID0gc2VsZi5nZXRHcmFwaE1hbmFnZXIoKS5hZGQoc2VsZi5uZXdHcmFwaCgpLCBkdW1teUNvbXBvdW5kKTtcbiAgICAgIHZhciBwYXJlbnRHcmFwaCA9IHBhcmVudC5nZXRDaGlsZCgpO1xuXG4gICAgICAvLyBBZGQgZHVtbXkgY29tcG91bmQgdG8gcGFyZW50IHRoZSBncmFwaFxuICAgICAgcGFyZW50R3JhcGguYWRkKGR1bW15Q29tcG91bmQpO1xuXG4gICAgICAvLyBGb3IgZWFjaCB6ZXJvIGRlZ3JlZSBub2RlIGluIHRoaXMgbGV2ZWwgcmVtb3ZlIGl0IGZyb20gaXRzIHBhcmVudCBncmFwaCBhbmQgYWRkIGl0IHRvIHRoZSBncmFwaCBvZiBkdW1teSBwYXJlbnRcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGVtcE1lbWJlckdyb3Vwc1twX2lkXS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgbm9kZSA9IHRlbXBNZW1iZXJHcm91cHNbcF9pZF1baV07XG5cbiAgICAgICAgcGFyZW50R3JhcGgucmVtb3ZlKG5vZGUpO1xuICAgICAgICBkdW1teVBhcmVudEdyYXBoLmFkZChub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUuY2xlYXJDb21wb3VuZHMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBjaGlsZEdyYXBoTWFwID0ge307XG4gIHZhciBpZFRvTm9kZSA9IHt9O1xuXG4gIC8vIEdldCBjb21wb3VuZCBvcmRlcmluZyBieSBmaW5kaW5nIHRoZSBpbm5lciBvbmUgZmlyc3RcbiAgdGhpcy5wZXJmb3JtREZTT25Db21wb3VuZHMoKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29tcG91bmRPcmRlci5sZW5ndGg7IGkrKykge1xuXG4gICAgaWRUb05vZGVbdGhpcy5jb21wb3VuZE9yZGVyW2ldLmlkXSA9IHRoaXMuY29tcG91bmRPcmRlcltpXTtcbiAgICBjaGlsZEdyYXBoTWFwW3RoaXMuY29tcG91bmRPcmRlcltpXS5pZF0gPSBbXS5jb25jYXQodGhpcy5jb21wb3VuZE9yZGVyW2ldLmdldENoaWxkKCkuZ2V0Tm9kZXMoKSk7XG5cbiAgICAvLyBSZW1vdmUgY2hpbGRyZW4gb2YgY29tcG91bmRzXG4gICAgdGhpcy5ncmFwaE1hbmFnZXIucmVtb3ZlKHRoaXMuY29tcG91bmRPcmRlcltpXS5nZXRDaGlsZCgpKTtcbiAgICB0aGlzLmNvbXBvdW5kT3JkZXJbaV0uY2hpbGQgPSBudWxsO1xuICB9XG5cbiAgdGhpcy5ncmFwaE1hbmFnZXIucmVzZXRBbGxOb2RlcygpO1xuXG4gIC8vIFRpbGUgdGhlIHJlbW92ZWQgY2hpbGRyZW5cbiAgdGhpcy50aWxlQ29tcG91bmRNZW1iZXJzKGNoaWxkR3JhcGhNYXAsIGlkVG9Ob2RlKTtcbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLmNsZWFyWmVyb0RlZ3JlZU1lbWJlcnMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHRpbGVkWmVyb0RlZ3JlZVBhY2sgPSB0aGlzLnRpbGVkWmVyb0RlZ3JlZVBhY2sgPSBbXTtcblxuICBPYmplY3Qua2V5cyh0aGlzLm1lbWJlckdyb3VwcykuZm9yRWFjaChmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgY29tcG91bmROb2RlID0gc2VsZi5pZFRvRHVtbXlOb2RlW2lkXTsgLy8gR2V0IHRoZSBkdW1teSBjb21wb3VuZFxuXG4gICAgdGlsZWRaZXJvRGVncmVlUGFja1tpZF0gPSBzZWxmLnRpbGVOb2RlcyhzZWxmLm1lbWJlckdyb3Vwc1tpZF0sIGNvbXBvdW5kTm9kZS5wYWRkaW5nTGVmdCArIGNvbXBvdW5kTm9kZS5wYWRkaW5nUmlnaHQpO1xuXG4gICAgLy8gU2V0IHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBkdW1teSBjb21wb3VuZCBhcyBjYWxjdWxhdGVkXG4gICAgY29tcG91bmROb2RlLnJlY3Qud2lkdGggPSB0aWxlZFplcm9EZWdyZWVQYWNrW2lkXS53aWR0aDtcbiAgICBjb21wb3VuZE5vZGUucmVjdC5oZWlnaHQgPSB0aWxlZFplcm9EZWdyZWVQYWNrW2lkXS5oZWlnaHQ7XG4gICAgY29tcG91bmROb2RlLnNldENlbnRlcih0aWxlZFplcm9EZWdyZWVQYWNrW2lkXS5jZW50ZXJYLCB0aWxlZFplcm9EZWdyZWVQYWNrW2lkXS5jZW50ZXJZKTtcblxuICAgIC8vIGNvbXBvdW5kIGxlZnQgYW5kIHRvcCBtYXJnaW5ncyBmb3IgbGFiZWxzXG4gICAgLy8gd2hlbiBub2RlIGxhYmVscyBhcmUgaW5jbHVkZWQsIHRoZXNlIHZhbHVlcyBtYXkgYmUgc2V0IHRvIGRpZmZlcmVudCB2YWx1ZXMgYmVsb3cgYW5kIGFyZSB1c2VkIGluIHRpbGluZ1Bvc3RMYXlvdXQsXG4gICAgLy8gb3RoZXJ3aXNlIHRoZXkgc3RheSBhcyB6ZXJvXG4gICAgY29tcG91bmROb2RlLmxhYmVsTWFyZ2luTGVmdCA9IDA7XG4gICAgY29tcG91bmROb2RlLmxhYmVsTWFyZ2luVG9wID0gMDtcblxuICAgIC8vIFVwZGF0ZSBjb21wb3VuZCBib3VuZHMgY29uc2lkZXJpbmcgaXRzIGxhYmVsIHByb3BlcnRpZXMgYW5kIHNldCBsYWJlbCBtYXJnaW5zIGZvciBsZWZ0IGFuZCB0b3BcbiAgICBpZiAoQ29TRUNvbnN0YW50cy5OT0RFX0RJTUVOU0lPTlNfSU5DTFVERV9MQUJFTFMpIHtcblxuICAgICAgdmFyIHdpZHRoID0gY29tcG91bmROb2RlLnJlY3Qud2lkdGg7XG4gICAgICB2YXIgaGVpZ2h0ID0gY29tcG91bmROb2RlLnJlY3QuaGVpZ2h0O1xuXG4gICAgICBpZiAoY29tcG91bmROb2RlLmxhYmVsV2lkdGgpIHtcbiAgICAgICAgaWYgKGNvbXBvdW5kTm9kZS5sYWJlbFBvc0hvcml6b250YWwgPT0gXCJsZWZ0XCIpIHtcbiAgICAgICAgICBjb21wb3VuZE5vZGUucmVjdC54IC09IGNvbXBvdW5kTm9kZS5sYWJlbFdpZHRoO1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5zZXRXaWR0aCh3aWR0aCArIGNvbXBvdW5kTm9kZS5sYWJlbFdpZHRoKTtcbiAgICAgICAgICBjb21wb3VuZE5vZGUubGFiZWxNYXJnaW5MZWZ0ID0gY29tcG91bmROb2RlLmxhYmVsV2lkdGg7XG4gICAgICAgIH0gZWxzZSBpZiAoY29tcG91bmROb2RlLmxhYmVsUG9zSG9yaXpvbnRhbCA9PSBcImNlbnRlclwiICYmIGNvbXBvdW5kTm9kZS5sYWJlbFdpZHRoID4gd2lkdGgpIHtcbiAgICAgICAgICBjb21wb3VuZE5vZGUucmVjdC54IC09IChjb21wb3VuZE5vZGUubGFiZWxXaWR0aCAtIHdpZHRoKSAvIDI7XG4gICAgICAgICAgY29tcG91bmROb2RlLnNldFdpZHRoKGNvbXBvdW5kTm9kZS5sYWJlbFdpZHRoKTtcbiAgICAgICAgICBjb21wb3VuZE5vZGUubGFiZWxNYXJnaW5MZWZ0ID0gKGNvbXBvdW5kTm9kZS5sYWJlbFdpZHRoIC0gd2lkdGgpIC8gMjtcbiAgICAgICAgfSBlbHNlIGlmIChjb21wb3VuZE5vZGUubGFiZWxQb3NIb3Jpem9udGFsID09IFwicmlnaHRcIikge1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5zZXRXaWR0aCh3aWR0aCArIGNvbXBvdW5kTm9kZS5sYWJlbFdpZHRoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY29tcG91bmROb2RlLmxhYmVsSGVpZ2h0KSB7XG4gICAgICAgIGlmIChjb21wb3VuZE5vZGUubGFiZWxQb3NWZXJ0aWNhbCA9PSBcInRvcFwiKSB7XG4gICAgICAgICAgY29tcG91bmROb2RlLnJlY3QueSAtPSBjb21wb3VuZE5vZGUubGFiZWxIZWlnaHQ7XG4gICAgICAgICAgY29tcG91bmROb2RlLnNldEhlaWdodChoZWlnaHQgKyBjb21wb3VuZE5vZGUubGFiZWxIZWlnaHQpO1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5sYWJlbE1hcmdpblRvcCA9IGNvbXBvdW5kTm9kZS5sYWJlbEhlaWdodDtcbiAgICAgICAgfSBlbHNlIGlmIChjb21wb3VuZE5vZGUubGFiZWxQb3NWZXJ0aWNhbCA9PSBcImNlbnRlclwiICYmIGNvbXBvdW5kTm9kZS5sYWJlbEhlaWdodCA+IGhlaWdodCkge1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5yZWN0LnkgLT0gKGNvbXBvdW5kTm9kZS5sYWJlbEhlaWdodCAtIGhlaWdodCkgLyAyO1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5zZXRIZWlnaHQoY29tcG91bmROb2RlLmxhYmVsSGVpZ2h0KTtcbiAgICAgICAgICBjb21wb3VuZE5vZGUubGFiZWxNYXJnaW5Ub3AgPSAoY29tcG91bmROb2RlLmxhYmVsSGVpZ2h0IC0gaGVpZ2h0KSAvIDI7XG4gICAgICAgIH0gZWxzZSBpZiAoY29tcG91bmROb2RlLmxhYmVsUG9zVmVydGljYWwgPT0gXCJib3R0b21cIikge1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5zZXRIZWlnaHQoaGVpZ2h0ICsgY29tcG91bmROb2RlLmxhYmVsSGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSk7XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5yZXBvcHVsYXRlQ29tcG91bmRzID0gZnVuY3Rpb24gKCkge1xuICBmb3IgKHZhciBpID0gdGhpcy5jb21wb3VuZE9yZGVyLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgdmFyIGxDb21wb3VuZE5vZGUgPSB0aGlzLmNvbXBvdW5kT3JkZXJbaV07XG4gICAgdmFyIGlkID0gbENvbXBvdW5kTm9kZS5pZDtcbiAgICB2YXIgaG9yaXpvbnRhbE1hcmdpbiA9IGxDb21wb3VuZE5vZGUucGFkZGluZ0xlZnQ7XG4gICAgdmFyIHZlcnRpY2FsTWFyZ2luID0gbENvbXBvdW5kTm9kZS5wYWRkaW5nVG9wO1xuICAgIHZhciBsYWJlbE1hcmdpbkxlZnQgPSBsQ29tcG91bmROb2RlLmxhYmVsTWFyZ2luTGVmdDtcbiAgICB2YXIgbGFiZWxNYXJnaW5Ub3AgPSBsQ29tcG91bmROb2RlLmxhYmVsTWFyZ2luVG9wO1xuXG4gICAgdGhpcy5hZGp1c3RMb2NhdGlvbnModGhpcy50aWxlZE1lbWJlclBhY2tbaWRdLCBsQ29tcG91bmROb2RlLnJlY3QueCwgbENvbXBvdW5kTm9kZS5yZWN0LnksIGhvcml6b250YWxNYXJnaW4sIHZlcnRpY2FsTWFyZ2luLCBsYWJlbE1hcmdpbkxlZnQsIGxhYmVsTWFyZ2luVG9wKTtcbiAgfVxufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUucmVwb3B1bGF0ZVplcm9EZWdyZWVNZW1iZXJzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciB0aWxlZFBhY2sgPSB0aGlzLnRpbGVkWmVyb0RlZ3JlZVBhY2s7XG5cbiAgT2JqZWN0LmtleXModGlsZWRQYWNrKS5mb3JFYWNoKGZ1bmN0aW9uIChpZCkge1xuICAgIHZhciBjb21wb3VuZE5vZGUgPSBzZWxmLmlkVG9EdW1teU5vZGVbaWRdOyAvLyBHZXQgdGhlIGR1bW15IGNvbXBvdW5kIGJ5IGl0cyBpZFxuICAgIHZhciBob3Jpem9udGFsTWFyZ2luID0gY29tcG91bmROb2RlLnBhZGRpbmdMZWZ0O1xuICAgIHZhciB2ZXJ0aWNhbE1hcmdpbiA9IGNvbXBvdW5kTm9kZS5wYWRkaW5nVG9wO1xuICAgIHZhciBsYWJlbE1hcmdpbkxlZnQgPSBjb21wb3VuZE5vZGUubGFiZWxNYXJnaW5MZWZ0O1xuICAgIHZhciBsYWJlbE1hcmdpblRvcCA9IGNvbXBvdW5kTm9kZS5sYWJlbE1hcmdpblRvcDtcblxuICAgIC8vIEFkanVzdCB0aGUgcG9zaXRpb25zIG9mIG5vZGVzIHdydCBpdHMgY29tcG91bmRcbiAgICBzZWxmLmFkanVzdExvY2F0aW9ucyh0aWxlZFBhY2tbaWRdLCBjb21wb3VuZE5vZGUucmVjdC54LCBjb21wb3VuZE5vZGUucmVjdC55LCBob3Jpem9udGFsTWFyZ2luLCB2ZXJ0aWNhbE1hcmdpbiwgbGFiZWxNYXJnaW5MZWZ0LCBsYWJlbE1hcmdpblRvcCk7XG4gIH0pO1xufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUuZ2V0VG9CZVRpbGVkID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgdmFyIGlkID0gbm9kZS5pZDtcbiAgLy9maXJzdGx5IGNoZWNrIHRoZSBwcmV2aW91cyByZXN1bHRzXG4gIGlmICh0aGlzLnRvQmVUaWxlZFtpZF0gIT0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzLnRvQmVUaWxlZFtpZF07XG4gIH1cblxuICAvL29ubHkgY29tcG91bmQgbm9kZXMgYXJlIHRvIGJlIHRpbGVkXG4gIHZhciBjaGlsZEdyYXBoID0gbm9kZS5nZXRDaGlsZCgpO1xuICBpZiAoY2hpbGRHcmFwaCA9PSBudWxsKSB7XG4gICAgdGhpcy50b0JlVGlsZWRbaWRdID0gZmFsc2U7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGNoaWxkcmVuID0gY2hpbGRHcmFwaC5nZXROb2RlcygpOyAvLyBHZXQgdGhlIGNoaWxkcmVuIG5vZGVzXG5cbiAgLy9hIGNvbXBvdW5kIG5vZGUgaXMgbm90IHRvIGJlIHRpbGVkIGlmIGFsbCBvZiBpdHMgY29tcG91bmQgY2hpbGRyZW4gYXJlIG5vdCB0byBiZSB0aWxlZFxuICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHRoZUNoaWxkID0gY2hpbGRyZW5baV07XG5cbiAgICBpZiAodGhpcy5nZXROb2RlRGVncmVlKHRoZUNoaWxkKSA+IDApIHtcbiAgICAgIHRoaXMudG9CZVRpbGVkW2lkXSA9IGZhbHNlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vcGFzcyB0aGUgY2hpbGRyZW4gbm90IGhhdmluZyB0aGUgY29tcG91bmQgc3RydWN0dXJlXG4gICAgaWYgKHRoZUNoaWxkLmdldENoaWxkKCkgPT0gbnVsbCkge1xuICAgICAgdGhpcy50b0JlVGlsZWRbdGhlQ2hpbGQuaWRdID0gZmFsc2U7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuZ2V0VG9CZVRpbGVkKHRoZUNoaWxkKSkge1xuICAgICAgdGhpcy50b0JlVGlsZWRbaWRdID0gZmFsc2U7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHRoaXMudG9CZVRpbGVkW2lkXSA9IHRydWU7XG4gIHJldHVybiB0cnVlO1xufTtcblxuLy8gR2V0IGRlZ3JlZSBvZiBhIG5vZGUgZGVwZW5kaW5nIG9mIGl0cyBlZGdlcyBhbmQgaW5kZXBlbmRlbnQgb2YgaXRzIGNoaWxkcmVuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5nZXROb2RlRGVncmVlID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgdmFyIGlkID0gbm9kZS5pZDtcbiAgdmFyIGVkZ2VzID0gbm9kZS5nZXRFZGdlcygpO1xuICB2YXIgZGVncmVlID0gMDtcblxuICAvLyBGb3IgdGhlIGVkZ2VzIGNvbm5lY3RlZFxuICBmb3IgKHZhciBpID0gMDsgaSA8IGVkZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVkZ2UgPSBlZGdlc1tpXTtcbiAgICBpZiAoZWRnZS5nZXRTb3VyY2UoKS5pZCAhPT0gZWRnZS5nZXRUYXJnZXQoKS5pZCkge1xuICAgICAgZGVncmVlID0gZGVncmVlICsgMTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlZ3JlZTtcbn07XG5cbi8vIEdldCBkZWdyZWUgb2YgYSBub2RlIHdpdGggaXRzIGNoaWxkcmVuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5nZXROb2RlRGVncmVlV2l0aENoaWxkcmVuID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgdmFyIGRlZ3JlZSA9IHRoaXMuZ2V0Tm9kZURlZ3JlZShub2RlKTtcbiAgaWYgKG5vZGUuZ2V0Q2hpbGQoKSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGRlZ3JlZTtcbiAgfVxuICB2YXIgY2hpbGRyZW4gPSBub2RlLmdldENoaWxkKCkuZ2V0Tm9kZXMoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgIGRlZ3JlZSArPSB0aGlzLmdldE5vZGVEZWdyZWVXaXRoQ2hpbGRyZW4oY2hpbGQpO1xuICB9XG4gIHJldHVybiBkZWdyZWU7XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5wZXJmb3JtREZTT25Db21wb3VuZHMgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuY29tcG91bmRPcmRlciA9IFtdO1xuICB0aGlzLmZpbGxDb21wZXhPcmRlckJ5REZTKHRoaXMuZ3JhcGhNYW5hZ2VyLmdldFJvb3QoKS5nZXROb2RlcygpKTtcbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLmZpbGxDb21wZXhPcmRlckJ5REZTID0gZnVuY3Rpb24gKGNoaWxkcmVuKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICBpZiAoY2hpbGQuZ2V0Q2hpbGQoKSAhPSBudWxsKSB7XG4gICAgICB0aGlzLmZpbGxDb21wZXhPcmRlckJ5REZTKGNoaWxkLmdldENoaWxkKCkuZ2V0Tm9kZXMoKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmdldFRvQmVUaWxlZChjaGlsZCkpIHtcbiAgICAgIHRoaXMuY29tcG91bmRPcmRlci5wdXNoKGNoaWxkKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuKiBUaGlzIG1ldGhvZCBwbGFjZXMgZWFjaCB6ZXJvIGRlZ3JlZSBtZW1iZXIgd3J0IGdpdmVuICh4LHkpIGNvb3JkaW5hdGVzICh0b3AgbGVmdCkuXG4qL1xuQ29TRUxheW91dC5wcm90b3R5cGUuYWRqdXN0TG9jYXRpb25zID0gZnVuY3Rpb24gKG9yZ2FuaXphdGlvbiwgeCwgeSwgY29tcG91bmRIb3Jpem9udGFsTWFyZ2luLCBjb21wb3VuZFZlcnRpY2FsTWFyZ2luLCBjb21wb3VuZExhYmVsTWFyZ2luTGVmdCwgY29tcG91bmRMYWJlbE1hcmdpblRvcCkge1xuICB4ICs9IGNvbXBvdW5kSG9yaXpvbnRhbE1hcmdpbiArIGNvbXBvdW5kTGFiZWxNYXJnaW5MZWZ0O1xuICB5ICs9IGNvbXBvdW5kVmVydGljYWxNYXJnaW4gKyBjb21wb3VuZExhYmVsTWFyZ2luVG9wO1xuXG4gIHZhciBsZWZ0ID0geDtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IG9yZ2FuaXphdGlvbi5yb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHJvdyA9IG9yZ2FuaXphdGlvbi5yb3dzW2ldO1xuICAgIHggPSBsZWZ0O1xuICAgIHZhciBtYXhIZWlnaHQgPSAwO1xuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCByb3cubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBsbm9kZSA9IHJvd1tqXTtcblxuICAgICAgbG5vZGUucmVjdC54ID0geDsgLy8gKyBsbm9kZS5yZWN0LndpZHRoIC8gMjtcbiAgICAgIGxub2RlLnJlY3QueSA9IHk7IC8vICsgbG5vZGUucmVjdC5oZWlnaHQgLyAyO1xuXG4gICAgICB4ICs9IGxub2RlLnJlY3Qud2lkdGggKyBvcmdhbml6YXRpb24uaG9yaXpvbnRhbFBhZGRpbmc7XG5cbiAgICAgIGlmIChsbm9kZS5yZWN0LmhlaWdodCA+IG1heEhlaWdodCkgbWF4SGVpZ2h0ID0gbG5vZGUucmVjdC5oZWlnaHQ7XG4gICAgfVxuXG4gICAgeSArPSBtYXhIZWlnaHQgKyBvcmdhbml6YXRpb24udmVydGljYWxQYWRkaW5nO1xuICB9XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS50aWxlQ29tcG91bmRNZW1iZXJzID0gZnVuY3Rpb24gKGNoaWxkR3JhcGhNYXAsIGlkVG9Ob2RlKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdGhpcy50aWxlZE1lbWJlclBhY2sgPSBbXTtcblxuICBPYmplY3Qua2V5cyhjaGlsZEdyYXBoTWFwKS5mb3JFYWNoKGZ1bmN0aW9uIChpZCkge1xuICAgIC8vIEdldCB0aGUgY29tcG91bmQgbm9kZVxuICAgIHZhciBjb21wb3VuZE5vZGUgPSBpZFRvTm9kZVtpZF07XG5cbiAgICBzZWxmLnRpbGVkTWVtYmVyUGFja1tpZF0gPSBzZWxmLnRpbGVOb2RlcyhjaGlsZEdyYXBoTWFwW2lkXSwgY29tcG91bmROb2RlLnBhZGRpbmdMZWZ0ICsgY29tcG91bmROb2RlLnBhZGRpbmdSaWdodCk7XG5cbiAgICBjb21wb3VuZE5vZGUucmVjdC53aWR0aCA9IHNlbGYudGlsZWRNZW1iZXJQYWNrW2lkXS53aWR0aDtcbiAgICBjb21wb3VuZE5vZGUucmVjdC5oZWlnaHQgPSBzZWxmLnRpbGVkTWVtYmVyUGFja1tpZF0uaGVpZ2h0O1xuICAgIGNvbXBvdW5kTm9kZS5zZXRDZW50ZXIoc2VsZi50aWxlZE1lbWJlclBhY2tbaWRdLmNlbnRlclgsIHNlbGYudGlsZWRNZW1iZXJQYWNrW2lkXS5jZW50ZXJZKTtcblxuICAgIC8vIGNvbXBvdW5kIGxlZnQgYW5kIHRvcCBtYXJnaW5ncyBmb3IgbGFiZWxzXG4gICAgLy8gd2hlbiBub2RlIGxhYmVscyBhcmUgaW5jbHVkZWQsIHRoZXNlIHZhbHVlcyBtYXkgYmUgc2V0IHRvIGRpZmZlcmVudCB2YWx1ZXMgYmVsb3cgYW5kIGFyZSB1c2VkIGluIHRpbGluZ1Bvc3RMYXlvdXQsXG4gICAgLy8gb3RoZXJ3aXNlIHRoZXkgc3RheSBhcyB6ZXJvXG4gICAgY29tcG91bmROb2RlLmxhYmVsTWFyZ2luTGVmdCA9IDA7XG4gICAgY29tcG91bmROb2RlLmxhYmVsTWFyZ2luVG9wID0gMDtcblxuICAgIC8vIFVwZGF0ZSBjb21wb3VuZCBib3VuZHMgY29uc2lkZXJpbmcgaXRzIGxhYmVsIHByb3BlcnRpZXMgYW5kIHNldCBsYWJlbCBtYXJnaW5zIGZvciBsZWZ0IGFuZCB0b3BcbiAgICBpZiAoQ29TRUNvbnN0YW50cy5OT0RFX0RJTUVOU0lPTlNfSU5DTFVERV9MQUJFTFMpIHtcblxuICAgICAgdmFyIHdpZHRoID0gY29tcG91bmROb2RlLnJlY3Qud2lkdGg7XG4gICAgICB2YXIgaGVpZ2h0ID0gY29tcG91bmROb2RlLnJlY3QuaGVpZ2h0O1xuXG4gICAgICBpZiAoY29tcG91bmROb2RlLmxhYmVsV2lkdGgpIHtcbiAgICAgICAgaWYgKGNvbXBvdW5kTm9kZS5sYWJlbFBvc0hvcml6b250YWwgPT0gXCJsZWZ0XCIpIHtcbiAgICAgICAgICBjb21wb3VuZE5vZGUucmVjdC54IC09IGNvbXBvdW5kTm9kZS5sYWJlbFdpZHRoO1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5zZXRXaWR0aCh3aWR0aCArIGNvbXBvdW5kTm9kZS5sYWJlbFdpZHRoKTtcbiAgICAgICAgICBjb21wb3VuZE5vZGUubGFiZWxNYXJnaW5MZWZ0ID0gY29tcG91bmROb2RlLmxhYmVsV2lkdGg7XG4gICAgICAgIH0gZWxzZSBpZiAoY29tcG91bmROb2RlLmxhYmVsUG9zSG9yaXpvbnRhbCA9PSBcImNlbnRlclwiICYmIGNvbXBvdW5kTm9kZS5sYWJlbFdpZHRoID4gd2lkdGgpIHtcbiAgICAgICAgICBjb21wb3VuZE5vZGUucmVjdC54IC09IChjb21wb3VuZE5vZGUubGFiZWxXaWR0aCAtIHdpZHRoKSAvIDI7XG4gICAgICAgICAgY29tcG91bmROb2RlLnNldFdpZHRoKGNvbXBvdW5kTm9kZS5sYWJlbFdpZHRoKTtcbiAgICAgICAgICBjb21wb3VuZE5vZGUubGFiZWxNYXJnaW5MZWZ0ID0gKGNvbXBvdW5kTm9kZS5sYWJlbFdpZHRoIC0gd2lkdGgpIC8gMjtcbiAgICAgICAgfSBlbHNlIGlmIChjb21wb3VuZE5vZGUubGFiZWxQb3NIb3Jpem9udGFsID09IFwicmlnaHRcIikge1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5zZXRXaWR0aCh3aWR0aCArIGNvbXBvdW5kTm9kZS5sYWJlbFdpZHRoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY29tcG91bmROb2RlLmxhYmVsSGVpZ2h0KSB7XG4gICAgICAgIGlmIChjb21wb3VuZE5vZGUubGFiZWxQb3NWZXJ0aWNhbCA9PSBcInRvcFwiKSB7XG4gICAgICAgICAgY29tcG91bmROb2RlLnJlY3QueSAtPSBjb21wb3VuZE5vZGUubGFiZWxIZWlnaHQ7XG4gICAgICAgICAgY29tcG91bmROb2RlLnNldEhlaWdodChoZWlnaHQgKyBjb21wb3VuZE5vZGUubGFiZWxIZWlnaHQpO1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5sYWJlbE1hcmdpblRvcCA9IGNvbXBvdW5kTm9kZS5sYWJlbEhlaWdodDtcbiAgICAgICAgfSBlbHNlIGlmIChjb21wb3VuZE5vZGUubGFiZWxQb3NWZXJ0aWNhbCA9PSBcImNlbnRlclwiICYmIGNvbXBvdW5kTm9kZS5sYWJlbEhlaWdodCA+IGhlaWdodCkge1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5yZWN0LnkgLT0gKGNvbXBvdW5kTm9kZS5sYWJlbEhlaWdodCAtIGhlaWdodCkgLyAyO1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5zZXRIZWlnaHQoY29tcG91bmROb2RlLmxhYmVsSGVpZ2h0KTtcbiAgICAgICAgICBjb21wb3VuZE5vZGUubGFiZWxNYXJnaW5Ub3AgPSAoY29tcG91bmROb2RlLmxhYmVsSGVpZ2h0IC0gaGVpZ2h0KSAvIDI7XG4gICAgICAgIH0gZWxzZSBpZiAoY29tcG91bmROb2RlLmxhYmVsUG9zVmVydGljYWwgPT0gXCJib3R0b21cIikge1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5zZXRIZWlnaHQoaGVpZ2h0ICsgY29tcG91bmROb2RlLmxhYmVsSGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSk7XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS50aWxlTm9kZXMgPSBmdW5jdGlvbiAobm9kZXMsIG1pbldpZHRoKSB7XG4gIHZhciBob3Jpem9udGFsT3JnID0gdGhpcy50aWxlTm9kZXNCeUZhdm9yaW5nRGltKG5vZGVzLCBtaW5XaWR0aCwgdHJ1ZSk7XG4gIHZhciB2ZXJ0aWNhbE9yZyA9IHRoaXMudGlsZU5vZGVzQnlGYXZvcmluZ0RpbShub2RlcywgbWluV2lkdGgsIGZhbHNlKTtcblxuICB2YXIgaG9yaXpvbnRhbFJhdGlvID0gdGhpcy5nZXRPcmdSYXRpbyhob3Jpem9udGFsT3JnKTtcbiAgdmFyIHZlcnRpY2FsUmF0aW8gPSB0aGlzLmdldE9yZ1JhdGlvKHZlcnRpY2FsT3JnKTtcbiAgdmFyIGJlc3RPcmc7XG5cbiAgLy8gdGhlIGJlc3QgcmF0aW8gaXMgdGhlIG9uZSB0aGF0IGlzIGNsb3NlciB0byAxIHNpbmNlIHRoZSByYXRpb3MgYXJlIGFscmVhZHkgbm9ybWFsaXplZFxuICAvLyBhbmQgdGhlIGJlc3Qgb3JnYW5pemF0aW9uIGlzIHRoZSBvbmUgdGhhdCBoYXMgdGhlIGJlc3QgcmF0aW9cbiAgaWYgKHZlcnRpY2FsUmF0aW8gPCBob3Jpem9udGFsUmF0aW8pIHtcbiAgICBiZXN0T3JnID0gdmVydGljYWxPcmc7XG4gIH0gZWxzZSB7XG4gICAgYmVzdE9yZyA9IGhvcml6b250YWxPcmc7XG4gIH1cblxuICByZXR1cm4gYmVzdE9yZztcbn07XG5cbi8vIGdldCB0aGUgd2lkdGgvaGVpZ2h0IHJhdGlvIG9mIHRoZSBvcmdhbml6YXRpb24gdGhhdCBpcyBub3JtYWxpemVkIHNvIHRoYXQgaXQgd2lsbCBub3QgYmUgbGVzcyB0aGFuIDFcbkNvU0VMYXlvdXQucHJvdG90eXBlLmdldE9yZ1JhdGlvID0gZnVuY3Rpb24gKG9yZ2FuaXphdGlvbikge1xuICAvLyBnZXQgZGltZW5zaW9ucyBhbmQgY2FsY3VsYXRlIHRoZSBpbml0aWFsIHJhdGlvXG4gIHZhciB3aWR0aCA9IG9yZ2FuaXphdGlvbi53aWR0aDtcbiAgdmFyIGhlaWdodCA9IG9yZ2FuaXphdGlvbi5oZWlnaHQ7XG4gIHZhciByYXRpbyA9IHdpZHRoIC8gaGVpZ2h0O1xuXG4gIC8vIGlmIHRoZSBpbml0aWFsIHJhdGlvIGlzIGxlc3MgdGhlbiAxIHRoZW4gaW52ZXJzZSBpdFxuICBpZiAocmF0aW8gPCAxKSB7XG4gICAgcmF0aW8gPSAxIC8gcmF0aW87XG4gIH1cblxuICAvLyByZXR1cm4gdGhlIG5vcm1hbGl6ZWQgcmF0aW9cbiAgcmV0dXJuIHJhdGlvO1xufTtcblxuLypcbiAqIENhbGN1bGF0ZXMgdGhlIGlkZWFsIHdpZHRoIGZvciB0aGUgcm93cy4gVGhpcyBtZXRob2QgYXNzdW1lcyB0aGF0XG4gKiBlYWNoIG5vZGUgaGFzIHRoZSBzYW1lIHNpemVzIGFuZCBjYWxjdWxhdGVzIHRoZSBpZGVhbCByb3cgd2lkdGggdGhhdFxuICogYXBwcm94aW1hdGVzIGEgc3F1YXJlIHNoYXBlZCBjb21wbGV4IGFjY29yZGluZ2x5LiBIb3dldmVyLCBzaW5jZSBub2RlcyB3b3VsZFxuICogaGF2ZSBkaWZmZXJlbnQgc2l6ZXMgc29tZSByb3dzIHdvdWxkIGhhdmUgZGlmZmVyZW50IHNpemVzIGFuZCB0aGUgcmVzdWx0aW5nXG4gKiBzaGFwZSB3b3VsZCBub3QgYmUgYW4gZXhhY3Qgc3F1YXJlLlxuICovXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5jYWxjSWRlYWxSb3dXaWR0aCA9IGZ1bmN0aW9uIChtZW1iZXJzLCBmYXZvckhvcml6b250YWxEaW0pIHtcbiAgLy8gVG8gYXBwcm94aW1hdGUgYSBzcXVhcmUgc2hhcGVkIGNvbXBsZXggd2UgbmVlZCB0byBtYWtlIGNvbXBsZXggd2lkdGggZXF1YWwgdG8gY29tcGxleCBoZWlnaHQuXG4gIC8vIFRvIGFjaGlldmUgdGhpcyB3ZSBuZWVkIHRvIHNvbHZlIHRoZSBmb2xsb3dpbmcgZXF1YXRpb24gc3lzdGVtIGZvciBoYzpcbiAgLy8gKHggKyBieCkgKiBoYyAtIGJ4ID0gKHkgKyBieSkgKiB2YyAtIGJ5LCBoYyAqIHZjID0gblxuICAvLyB3aGVyZSB4IGlzIHRoZSBhdmFyYWdlIHdpZHRoIG9mIHRoZSBub2RlcywgeSBpcyB0aGUgYXZhcmFnZSBoZWlnaHQgb2Ygbm9kZXNcbiAgLy8gYnggYW5kIGJ5IGFyZSB0aGUgYnVmZmVyIHNpemVzIGluIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGRpbWVuc2lvbnMgYWNjb3JkaW5nbHksXG4gIC8vIGhjIGFuZCB2YyBhcmUgdGhlIG51bWJlciBvZiByb3dzIGluIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGRpbWVuc2lvbnNcbiAgLy8gbiBpcyBudW1iZXIgb2YgbWVtYmVycy5cblxuICB2YXIgdmVydGljYWxQYWRkaW5nID0gQ29TRUNvbnN0YW50cy5USUxJTkdfUEFERElOR19WRVJUSUNBTDtcbiAgdmFyIGhvcml6b250YWxQYWRkaW5nID0gQ29TRUNvbnN0YW50cy5USUxJTkdfUEFERElOR19IT1JJWk9OVEFMO1xuXG4gIC8vIG51bWJlciBvZiBtZW1iZXJzXG4gIHZhciBtZW1iZXJzU2l6ZSA9IG1lbWJlcnMubGVuZ3RoO1xuXG4gIC8vIHN1bSBvZiB0aGUgd2lkdGggb2YgYWxsIG1lbWJlcnNcbiAgdmFyIHRvdGFsV2lkdGggPSAwO1xuXG4gIC8vIHN1bSBvZiB0aGUgaGVpZ2h0IG9mIGFsbCBtZW1iZXJzXG4gIHZhciB0b3RhbEhlaWdodCA9IDA7XG5cbiAgdmFyIG1heFdpZHRoID0gMDtcblxuICAvLyB0cmF2ZXJzZSBhbGwgbWVtYmVycyB0byBjYWxjdWxhdGUgdG90YWwgd2lkdGggYW5kIHRvdGFsIGhlaWdodCBhbmQgZ2V0IHRoZSBtYXhpbXVtIG1lbWJlcnMgd2lkdGhcbiAgbWVtYmVycy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgdG90YWxXaWR0aCArPSBub2RlLmdldFdpZHRoKCk7XG4gICAgdG90YWxIZWlnaHQgKz0gbm9kZS5nZXRIZWlnaHQoKTtcblxuICAgIGlmIChub2RlLmdldFdpZHRoKCkgPiBtYXhXaWR0aCkge1xuICAgICAgbWF4V2lkdGggPSBub2RlLmdldFdpZHRoKCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBhdmVyYWdlIHdpZHRoIG9mIHRoZSBtZW1iZXJzXG4gIHZhciBhdmVyYWdlV2lkdGggPSB0b3RhbFdpZHRoIC8gbWVtYmVyc1NpemU7XG5cbiAgLy8gYXZlcmFnZSBoZWlnaHQgb2YgdGhlIG1lbWJlcnNcbiAgdmFyIGF2ZXJhZ2VIZWlnaHQgPSB0b3RhbEhlaWdodCAvIG1lbWJlcnNTaXplO1xuXG4gIC8vIHNvbHZpbmcgdGhlIGluaXRpYWwgZXF1YXRpb24gc3lzdGVtIGZvciB0aGUgaGMgeWllbGRzIHRoZSBmb2xsb3dpbmcgc2Vjb25kIGRlZ3JlZSBlcXVhdGlvbjpcbiAgLy8gaGNeMiAqICh4K2J4KSArIGhjICogKGJ5IC0gYngpIC0gbiAqICh5ICsgYnkpID0gMFxuXG4gIC8vIHRoZSBkZWx0YSB2YWx1ZSB0byBzb2x2ZSB0aGUgZXF1YXRpb24gYWJvdmUgZm9yIGhjXG4gIHZhciBkZWx0YSA9IE1hdGgucG93KHZlcnRpY2FsUGFkZGluZyAtIGhvcml6b250YWxQYWRkaW5nLCAyKSArIDQgKiAoYXZlcmFnZVdpZHRoICsgaG9yaXpvbnRhbFBhZGRpbmcpICogKGF2ZXJhZ2VIZWlnaHQgKyB2ZXJ0aWNhbFBhZGRpbmcpICogbWVtYmVyc1NpemU7XG5cbiAgLy8gc29sdmUgdGhlIGVxdWF0aW9uIHVzaW5nIGRlbHRhIHZhbHVlIHRvIGNhbGN1bGF0ZSB0aGUgaG9yaXpvbnRhbCBjb3VudFxuICAvLyB0aGF0IHJlcHJlc2VudHMgdGhlIG51bWJlciBvZiBub2RlcyBpbiBhbiBpZGVhbCByb3dcbiAgdmFyIGhvcml6b250YWxDb3VudERvdWJsZSA9IChob3Jpem9udGFsUGFkZGluZyAtIHZlcnRpY2FsUGFkZGluZyArIE1hdGguc3FydChkZWx0YSkpIC8gKDIgKiAoYXZlcmFnZVdpZHRoICsgaG9yaXpvbnRhbFBhZGRpbmcpKTtcbiAgLy8gcm91bmQgdGhlIGNhbGN1bGF0ZWQgaG9yaXpvbnRhbCBjb3VudCB1cCBvciBkb3duIGFjY29yZGluZyB0byB0aGUgZmF2b3JlZCBkaW1lbnNpb25cbiAgdmFyIGhvcml6b250YWxDb3VudDtcblxuICBpZiAoZmF2b3JIb3Jpem9udGFsRGltKSB7XG4gICAgaG9yaXpvbnRhbENvdW50ID0gTWF0aC5jZWlsKGhvcml6b250YWxDb3VudERvdWJsZSk7XG4gICAgLy8gaWYgaG9yaXpvbnRhbENvdW50IGNvdW50IGlzIG5vdCBhIGZsb2F0IHZhbHVlIHRoZW4gYm90aCBvZiByb3VuZGluZyB0byBmbG9vciBhbmQgY2VpbFxuICAgIC8vIHdpbGwgeWllbGQgdGhlIHNhbWUgdmFsdWVzLiBJbnN0ZWFkIG9mIHJlcGVhdGluZyB0aGUgc2FtZSBjYWxjdWxhdGlvbiB0cnkgZ29pbmcgdXBcbiAgICAvLyB3aGlsZSBmYXZvcmluZyBob3Jpem9udGFsIGRpbWVuc2lvbiBpbiBzdWNoIGNhc2VzXG4gICAgaWYgKGhvcml6b250YWxDb3VudCA9PSBob3Jpem9udGFsQ291bnREb3VibGUpIHtcbiAgICAgIGhvcml6b250YWxDb3VudCsrO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBob3Jpem9udGFsQ291bnQgPSBNYXRoLmZsb29yKGhvcml6b250YWxDb3VudERvdWJsZSk7XG4gIH1cblxuICAvLyBpZGVhbCB3aWR0aCB0byBiZSBjYWxjdWxhdGVkXG4gIHZhciBpZGVhbFdpZHRoID0gaG9yaXpvbnRhbENvdW50ICogKGF2ZXJhZ2VXaWR0aCArIGhvcml6b250YWxQYWRkaW5nKSAtIGhvcml6b250YWxQYWRkaW5nO1xuXG4gIC8vIGlmIG1heCB3aWR0aCBpcyBiaWdnZXIgdGhhbiBjYWxjdWxhdGVkIGlkZWFsIHdpZHRoIHJlc2V0IGlkZWFsIHdpZHRoIHRvIGl0XG4gIGlmIChtYXhXaWR0aCA+IGlkZWFsV2lkdGgpIHtcbiAgICBpZGVhbFdpZHRoID0gbWF4V2lkdGg7XG4gIH1cblxuICAvLyBhZGQgdGhlIGxlZnQtcmlnaHQgbWFyZ2lucyB0byB0aGUgaWRlYWwgcm93IHdpZHRoXG4gIGlkZWFsV2lkdGggKz0gaG9yaXpvbnRhbFBhZGRpbmcgKiAyO1xuXG4gIC8vIHJldHVybiB0aGUgaWRlYWwgcm93IHdpZHRoMVxuICByZXR1cm4gaWRlYWxXaWR0aDtcbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLnRpbGVOb2Rlc0J5RmF2b3JpbmdEaW0gPSBmdW5jdGlvbiAobm9kZXMsIG1pbldpZHRoLCBmYXZvckhvcml6b250YWxEaW0pIHtcbiAgdmFyIHZlcnRpY2FsUGFkZGluZyA9IENvU0VDb25zdGFudHMuVElMSU5HX1BBRERJTkdfVkVSVElDQUw7XG4gIHZhciBob3Jpem9udGFsUGFkZGluZyA9IENvU0VDb25zdGFudHMuVElMSU5HX1BBRERJTkdfSE9SSVpPTlRBTDtcbiAgdmFyIHRpbGluZ0NvbXBhcmVCeSA9IENvU0VDb25zdGFudHMuVElMSU5HX0NPTVBBUkVfQlk7XG4gIHZhciBvcmdhbml6YXRpb24gPSB7XG4gICAgcm93czogW10sXG4gICAgcm93V2lkdGg6IFtdLFxuICAgIHJvd0hlaWdodDogW10sXG4gICAgd2lkdGg6IDAsXG4gICAgaGVpZ2h0OiBtaW5XaWR0aCwgLy8gYXNzdW1lIG1pbkhlaWdodCBlcXVhbHMgdG8gbWluV2lkdGhcbiAgICB2ZXJ0aWNhbFBhZGRpbmc6IHZlcnRpY2FsUGFkZGluZyxcbiAgICBob3Jpem9udGFsUGFkZGluZzogaG9yaXpvbnRhbFBhZGRpbmcsXG4gICAgY2VudGVyWDogMCxcbiAgICBjZW50ZXJZOiAwXG4gIH07XG5cbiAgaWYgKHRpbGluZ0NvbXBhcmVCeSkge1xuICAgIG9yZ2FuaXphdGlvbi5pZGVhbFJvd1dpZHRoID0gdGhpcy5jYWxjSWRlYWxSb3dXaWR0aChub2RlcywgZmF2b3JIb3Jpem9udGFsRGltKTtcbiAgfVxuXG4gIHZhciBnZXROb2RlQXJlYSA9IGZ1bmN0aW9uIGdldE5vZGVBcmVhKG4pIHtcbiAgICByZXR1cm4gbi5yZWN0LndpZHRoICogbi5yZWN0LmhlaWdodDtcbiAgfTtcblxuICB2YXIgYXJlYUNvbXBhcmVGY24gPSBmdW5jdGlvbiBhcmVhQ29tcGFyZUZjbihuMSwgbjIpIHtcbiAgICByZXR1cm4gZ2V0Tm9kZUFyZWEobjIpIC0gZ2V0Tm9kZUFyZWEobjEpO1xuICB9O1xuXG4gIC8vIFNvcnQgdGhlIG5vZGVzIGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgdGhlaXIgYXJlYXNcbiAgbm9kZXMuc29ydChmdW5jdGlvbiAobjEsIG4yKSB7XG4gICAgdmFyIGNtcEJ5ID0gYXJlYUNvbXBhcmVGY247XG4gICAgaWYgKG9yZ2FuaXphdGlvbi5pZGVhbFJvd1dpZHRoKSB7XG4gICAgICBjbXBCeSA9IHRpbGluZ0NvbXBhcmVCeTtcbiAgICAgIHJldHVybiBjbXBCeShuMS5pZCwgbjIuaWQpO1xuICAgIH1cbiAgICByZXR1cm4gY21wQnkobjEsIG4yKTtcbiAgfSk7XG5cbiAgLy8gQ3JlYXRlIHRoZSBvcmdhbml6YXRpb24gLT4gY2FsY3VsYXRlIGNvbXBvdW5kIGNlbnRlclxuICB2YXIgc3VtQ2VudGVyWCA9IDA7XG4gIHZhciBzdW1DZW50ZXJZID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBsTm9kZSA9IG5vZGVzW2ldO1xuXG4gICAgc3VtQ2VudGVyWCArPSBsTm9kZS5nZXRDZW50ZXJYKCk7XG4gICAgc3VtQ2VudGVyWSArPSBsTm9kZS5nZXRDZW50ZXJZKCk7XG4gIH1cblxuICBvcmdhbml6YXRpb24uY2VudGVyWCA9IHN1bUNlbnRlclggLyBub2Rlcy5sZW5ndGg7XG4gIG9yZ2FuaXphdGlvbi5jZW50ZXJZID0gc3VtQ2VudGVyWSAvIG5vZGVzLmxlbmd0aDtcblxuICAvLyBDcmVhdGUgdGhlIG9yZ2FuaXphdGlvbiAtPiB0aWxlIG1lbWJlcnNcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBsTm9kZSA9IG5vZGVzW2ldO1xuXG4gICAgaWYgKG9yZ2FuaXphdGlvbi5yb3dzLmxlbmd0aCA9PSAwKSB7XG4gICAgICB0aGlzLmluc2VydE5vZGVUb1Jvdyhvcmdhbml6YXRpb24sIGxOb2RlLCAwLCBtaW5XaWR0aCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNhbkFkZEhvcml6b250YWwob3JnYW5pemF0aW9uLCBsTm9kZS5yZWN0LndpZHRoLCBsTm9kZS5yZWN0LmhlaWdodCkpIHtcbiAgICAgIHZhciByb3dJbmRleCA9IG9yZ2FuaXphdGlvbi5yb3dzLmxlbmd0aCAtIDE7XG4gICAgICBpZiAoIW9yZ2FuaXphdGlvbi5pZGVhbFJvd1dpZHRoKSB7XG4gICAgICAgIHJvd0luZGV4ID0gdGhpcy5nZXRTaG9ydGVzdFJvd0luZGV4KG9yZ2FuaXphdGlvbik7XG4gICAgICB9XG4gICAgICB0aGlzLmluc2VydE5vZGVUb1Jvdyhvcmdhbml6YXRpb24sIGxOb2RlLCByb3dJbmRleCwgbWluV2lkdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmluc2VydE5vZGVUb1Jvdyhvcmdhbml6YXRpb24sIGxOb2RlLCBvcmdhbml6YXRpb24ucm93cy5sZW5ndGgsIG1pbldpZHRoKTtcbiAgICB9XG5cbiAgICB0aGlzLnNoaWZ0VG9MYXN0Um93KG9yZ2FuaXphdGlvbik7XG4gIH1cblxuICByZXR1cm4gb3JnYW5pemF0aW9uO1xufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUuaW5zZXJ0Tm9kZVRvUm93ID0gZnVuY3Rpb24gKG9yZ2FuaXphdGlvbiwgbm9kZSwgcm93SW5kZXgsIG1pbldpZHRoKSB7XG4gIHZhciBtaW5Db21wb3VuZFNpemUgPSBtaW5XaWR0aDtcblxuICAvLyBBZGQgbmV3IHJvdyBpZiBuZWVkZWRcbiAgaWYgKHJvd0luZGV4ID09IG9yZ2FuaXphdGlvbi5yb3dzLmxlbmd0aCkge1xuICAgIHZhciBzZWNvbmREaW1lbnNpb24gPSBbXTtcblxuICAgIG9yZ2FuaXphdGlvbi5yb3dzLnB1c2goc2Vjb25kRGltZW5zaW9uKTtcbiAgICBvcmdhbml6YXRpb24ucm93V2lkdGgucHVzaChtaW5Db21wb3VuZFNpemUpO1xuICAgIG9yZ2FuaXphdGlvbi5yb3dIZWlnaHQucHVzaCgwKTtcbiAgfVxuXG4gIC8vIFVwZGF0ZSByb3cgd2lkdGhcbiAgdmFyIHcgPSBvcmdhbml6YXRpb24ucm93V2lkdGhbcm93SW5kZXhdICsgbm9kZS5yZWN0LndpZHRoO1xuXG4gIGlmIChvcmdhbml6YXRpb24ucm93c1tyb3dJbmRleF0ubGVuZ3RoID4gMCkge1xuICAgIHcgKz0gb3JnYW5pemF0aW9uLmhvcml6b250YWxQYWRkaW5nO1xuICB9XG5cbiAgb3JnYW5pemF0aW9uLnJvd1dpZHRoW3Jvd0luZGV4XSA9IHc7XG4gIC8vIFVwZGF0ZSBjb21wb3VuZCB3aWR0aFxuICBpZiAob3JnYW5pemF0aW9uLndpZHRoIDwgdykge1xuICAgIG9yZ2FuaXphdGlvbi53aWR0aCA9IHc7XG4gIH1cblxuICAvLyBVcGRhdGUgaGVpZ2h0XG4gIHZhciBoID0gbm9kZS5yZWN0LmhlaWdodDtcbiAgaWYgKHJvd0luZGV4ID4gMCkgaCArPSBvcmdhbml6YXRpb24udmVydGljYWxQYWRkaW5nO1xuXG4gIHZhciBleHRyYUhlaWdodCA9IDA7XG4gIGlmIChoID4gb3JnYW5pemF0aW9uLnJvd0hlaWdodFtyb3dJbmRleF0pIHtcbiAgICBleHRyYUhlaWdodCA9IG9yZ2FuaXphdGlvbi5yb3dIZWlnaHRbcm93SW5kZXhdO1xuICAgIG9yZ2FuaXphdGlvbi5yb3dIZWlnaHRbcm93SW5kZXhdID0gaDtcbiAgICBleHRyYUhlaWdodCA9IG9yZ2FuaXphdGlvbi5yb3dIZWlnaHRbcm93SW5kZXhdIC0gZXh0cmFIZWlnaHQ7XG4gIH1cblxuICBvcmdhbml6YXRpb24uaGVpZ2h0ICs9IGV4dHJhSGVpZ2h0O1xuXG4gIC8vIEluc2VydCBub2RlXG4gIG9yZ2FuaXphdGlvbi5yb3dzW3Jvd0luZGV4XS5wdXNoKG5vZGUpO1xufTtcblxuLy9TY2FucyB0aGUgcm93cyBvZiBhbiBvcmdhbml6YXRpb24gYW5kIHJldHVybnMgdGhlIG9uZSB3aXRoIHRoZSBtaW4gd2lkdGhcbkNvU0VMYXlvdXQucHJvdG90eXBlLmdldFNob3J0ZXN0Um93SW5kZXggPSBmdW5jdGlvbiAob3JnYW5pemF0aW9uKSB7XG4gIHZhciByID0gLTE7XG4gIHZhciBtaW4gPSBOdW1iZXIuTUFYX1ZBTFVFO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgb3JnYW5pemF0aW9uLnJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAob3JnYW5pemF0aW9uLnJvd1dpZHRoW2ldIDwgbWluKSB7XG4gICAgICByID0gaTtcbiAgICAgIG1pbiA9IG9yZ2FuaXphdGlvbi5yb3dXaWR0aFtpXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHI7XG59O1xuXG4vL1NjYW5zIHRoZSByb3dzIG9mIGFuIG9yZ2FuaXphdGlvbiBhbmQgcmV0dXJucyB0aGUgb25lIHdpdGggdGhlIG1heCB3aWR0aFxuQ29TRUxheW91dC5wcm90b3R5cGUuZ2V0TG9uZ2VzdFJvd0luZGV4ID0gZnVuY3Rpb24gKG9yZ2FuaXphdGlvbikge1xuICB2YXIgciA9IC0xO1xuICB2YXIgbWF4ID0gTnVtYmVyLk1JTl9WQUxVRTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IG9yZ2FuaXphdGlvbi5yb3dzLmxlbmd0aDsgaSsrKSB7XG5cbiAgICBpZiAob3JnYW5pemF0aW9uLnJvd1dpZHRoW2ldID4gbWF4KSB7XG4gICAgICByID0gaTtcbiAgICAgIG1heCA9IG9yZ2FuaXphdGlvbi5yb3dXaWR0aFtpXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcjtcbn07XG5cbi8qKlxuKiBUaGlzIG1ldGhvZCBjaGVja3Mgd2hldGhlciBhZGRpbmcgZXh0cmEgd2lkdGggdG8gdGhlIG9yZ2FuaXphdGlvbiB2aW9sYXRlc1xuKiB0aGUgYXNwZWN0IHJhdGlvKDEpIG9yIG5vdC5cbiovXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5jYW5BZGRIb3Jpem9udGFsID0gZnVuY3Rpb24gKG9yZ2FuaXphdGlvbiwgZXh0cmFXaWR0aCwgZXh0cmFIZWlnaHQpIHtcblxuICAvLyBpZiB0aGVyZSBpcyBhbiBpZGVhbCByb3cgd2lkdGggc3BlY2lmaWVkIHVzZSBpdCBpbnN0ZWFkIG9mIGNoZWNraW5nIHRoZSBhc3BlY3QgcmF0aW9cbiAgaWYgKG9yZ2FuaXphdGlvbi5pZGVhbFJvd1dpZHRoKSB7XG4gICAgdmFyIGxhc3RSb3dJbmRleCA9IG9yZ2FuaXphdGlvbi5yb3dzLmxlbmd0aCAtIDE7XG4gICAgdmFyIGxhc3RSb3dXaWR0aCA9IG9yZ2FuaXphdGlvbi5yb3dXaWR0aFtsYXN0Um93SW5kZXhdO1xuXG4gICAgLy8gY2hlY2sgYW5kIHJldHVybiBpZiBpZGVhbCByb3cgd2lkdGggd2lsbCBiZSBleGNlZWQgaWYgdGhlIG5vZGUgaXMgYWRkZWQgdG8gdGhlIHJvd1xuICAgIHJldHVybiBsYXN0Um93V2lkdGggKyBleHRyYVdpZHRoICsgb3JnYW5pemF0aW9uLmhvcml6b250YWxQYWRkaW5nIDw9IG9yZ2FuaXphdGlvbi5pZGVhbFJvd1dpZHRoO1xuICB9XG5cbiAgdmFyIHNyaSA9IHRoaXMuZ2V0U2hvcnRlc3RSb3dJbmRleChvcmdhbml6YXRpb24pO1xuXG4gIGlmIChzcmkgPCAwKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB2YXIgbWluID0gb3JnYW5pemF0aW9uLnJvd1dpZHRoW3NyaV07XG5cbiAgaWYgKG1pbiArIG9yZ2FuaXphdGlvbi5ob3Jpem9udGFsUGFkZGluZyArIGV4dHJhV2lkdGggPD0gb3JnYW5pemF0aW9uLndpZHRoKSByZXR1cm4gdHJ1ZTtcblxuICB2YXIgaERpZmYgPSAwO1xuXG4gIC8vIEFkZGluZyB0byBhbiBleGlzdGluZyByb3dcbiAgaWYgKG9yZ2FuaXphdGlvbi5yb3dIZWlnaHRbc3JpXSA8IGV4dHJhSGVpZ2h0KSB7XG4gICAgaWYgKHNyaSA+IDApIGhEaWZmID0gZXh0cmFIZWlnaHQgKyBvcmdhbml6YXRpb24udmVydGljYWxQYWRkaW5nIC0gb3JnYW5pemF0aW9uLnJvd0hlaWdodFtzcmldO1xuICB9XG5cbiAgdmFyIGFkZF90b19yb3dfcmF0aW87XG4gIGlmIChvcmdhbml6YXRpb24ud2lkdGggLSBtaW4gPj0gZXh0cmFXaWR0aCArIG9yZ2FuaXphdGlvbi5ob3Jpem9udGFsUGFkZGluZykge1xuICAgIGFkZF90b19yb3dfcmF0aW8gPSAob3JnYW5pemF0aW9uLmhlaWdodCArIGhEaWZmKSAvIChtaW4gKyBleHRyYVdpZHRoICsgb3JnYW5pemF0aW9uLmhvcml6b250YWxQYWRkaW5nKTtcbiAgfSBlbHNlIHtcbiAgICBhZGRfdG9fcm93X3JhdGlvID0gKG9yZ2FuaXphdGlvbi5oZWlnaHQgKyBoRGlmZikgLyBvcmdhbml6YXRpb24ud2lkdGg7XG4gIH1cblxuICAvLyBBZGRpbmcgYSBuZXcgcm93IGZvciB0aGlzIG5vZGVcbiAgaERpZmYgPSBleHRyYUhlaWdodCArIG9yZ2FuaXphdGlvbi52ZXJ0aWNhbFBhZGRpbmc7XG4gIHZhciBhZGRfbmV3X3Jvd19yYXRpbztcbiAgaWYgKG9yZ2FuaXphdGlvbi53aWR0aCA8IGV4dHJhV2lkdGgpIHtcbiAgICBhZGRfbmV3X3Jvd19yYXRpbyA9IChvcmdhbml6YXRpb24uaGVpZ2h0ICsgaERpZmYpIC8gZXh0cmFXaWR0aDtcbiAgfSBlbHNlIHtcbiAgICBhZGRfbmV3X3Jvd19yYXRpbyA9IChvcmdhbml6YXRpb24uaGVpZ2h0ICsgaERpZmYpIC8gb3JnYW5pemF0aW9uLndpZHRoO1xuICB9XG5cbiAgaWYgKGFkZF9uZXdfcm93X3JhdGlvIDwgMSkgYWRkX25ld19yb3dfcmF0aW8gPSAxIC8gYWRkX25ld19yb3dfcmF0aW87XG5cbiAgaWYgKGFkZF90b19yb3dfcmF0aW8gPCAxKSBhZGRfdG9fcm93X3JhdGlvID0gMSAvIGFkZF90b19yb3dfcmF0aW87XG5cbiAgcmV0dXJuIGFkZF90b19yb3dfcmF0aW8gPCBhZGRfbmV3X3Jvd19yYXRpbztcbn07XG5cbi8vSWYgbW92aW5nIHRoZSBsYXN0IG5vZGUgZnJvbSB0aGUgbG9uZ2VzdCByb3cgYW5kIGFkZGluZyBpdCB0byB0aGUgbGFzdFxuLy9yb3cgbWFrZXMgdGhlIGJvdW5kaW5nIGJveCBzbWFsbGVyLCBkbyBpdC5cbkNvU0VMYXlvdXQucHJvdG90eXBlLnNoaWZ0VG9MYXN0Um93ID0gZnVuY3Rpb24gKG9yZ2FuaXphdGlvbikge1xuICB2YXIgbG9uZ2VzdCA9IHRoaXMuZ2V0TG9uZ2VzdFJvd0luZGV4KG9yZ2FuaXphdGlvbik7XG4gIHZhciBsYXN0ID0gb3JnYW5pemF0aW9uLnJvd1dpZHRoLmxlbmd0aCAtIDE7XG4gIHZhciByb3cgPSBvcmdhbml6YXRpb24ucm93c1tsb25nZXN0XTtcbiAgdmFyIG5vZGUgPSByb3dbcm93Lmxlbmd0aCAtIDFdO1xuXG4gIHZhciBkaWZmID0gbm9kZS53aWR0aCArIG9yZ2FuaXphdGlvbi5ob3Jpem9udGFsUGFkZGluZztcblxuICAvLyBDaGVjayBpZiB0aGVyZSBpcyBlbm91Z2ggc3BhY2Ugb24gdGhlIGxhc3Qgcm93XG4gIGlmIChvcmdhbml6YXRpb24ud2lkdGggLSBvcmdhbml6YXRpb24ucm93V2lkdGhbbGFzdF0gPiBkaWZmICYmIGxvbmdlc3QgIT0gbGFzdCkge1xuICAgIC8vIFJlbW92ZSB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBsb25nZXN0IHJvd1xuICAgIHJvdy5zcGxpY2UoLTEsIDEpO1xuXG4gICAgLy8gUHVzaCBpdCB0byB0aGUgbGFzdCByb3dcbiAgICBvcmdhbml6YXRpb24ucm93c1tsYXN0XS5wdXNoKG5vZGUpO1xuXG4gICAgb3JnYW5pemF0aW9uLnJvd1dpZHRoW2xvbmdlc3RdID0gb3JnYW5pemF0aW9uLnJvd1dpZHRoW2xvbmdlc3RdIC0gZGlmZjtcbiAgICBvcmdhbml6YXRpb24ucm93V2lkdGhbbGFzdF0gPSBvcmdhbml6YXRpb24ucm93V2lkdGhbbGFzdF0gKyBkaWZmO1xuICAgIG9yZ2FuaXphdGlvbi53aWR0aCA9IG9yZ2FuaXphdGlvbi5yb3dXaWR0aFtpbnN0YW5jZS5nZXRMb25nZXN0Um93SW5kZXgob3JnYW5pemF0aW9uKV07XG5cbiAgICAvLyBVcGRhdGUgaGVpZ2h0cyBvZiB0aGUgb3JnYW5pemF0aW9uXG4gICAgdmFyIG1heEhlaWdodCA9IE51bWJlci5NSU5fVkFMVUU7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3cubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChyb3dbaV0uaGVpZ2h0ID4gbWF4SGVpZ2h0KSBtYXhIZWlnaHQgPSByb3dbaV0uaGVpZ2h0O1xuICAgIH1cbiAgICBpZiAobG9uZ2VzdCA+IDApIG1heEhlaWdodCArPSBvcmdhbml6YXRpb24udmVydGljYWxQYWRkaW5nO1xuXG4gICAgdmFyIHByZXZUb3RhbCA9IG9yZ2FuaXphdGlvbi5yb3dIZWlnaHRbbG9uZ2VzdF0gKyBvcmdhbml6YXRpb24ucm93SGVpZ2h0W2xhc3RdO1xuXG4gICAgb3JnYW5pemF0aW9uLnJvd0hlaWdodFtsb25nZXN0XSA9IG1heEhlaWdodDtcbiAgICBpZiAob3JnYW5pemF0aW9uLnJvd0hlaWdodFtsYXN0XSA8IG5vZGUuaGVpZ2h0ICsgb3JnYW5pemF0aW9uLnZlcnRpY2FsUGFkZGluZykgb3JnYW5pemF0aW9uLnJvd0hlaWdodFtsYXN0XSA9IG5vZGUuaGVpZ2h0ICsgb3JnYW5pemF0aW9uLnZlcnRpY2FsUGFkZGluZztcblxuICAgIHZhciBmaW5hbFRvdGFsID0gb3JnYW5pemF0aW9uLnJvd0hlaWdodFtsb25nZXN0XSArIG9yZ2FuaXphdGlvbi5yb3dIZWlnaHRbbGFzdF07XG4gICAgb3JnYW5pemF0aW9uLmhlaWdodCArPSBmaW5hbFRvdGFsIC0gcHJldlRvdGFsO1xuXG4gICAgdGhpcy5zaGlmdFRvTGFzdFJvdyhvcmdhbml6YXRpb24pO1xuICB9XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS50aWxpbmdQcmVMYXlvdXQgPSBmdW5jdGlvbiAoKSB7XG4gIGlmIChDb1NFQ29uc3RhbnRzLlRJTEUpIHtcbiAgICAvLyBGaW5kIHplcm8gZGVncmVlIG5vZGVzIGFuZCBjcmVhdGUgYSBjb21wb3VuZCBmb3IgZWFjaCBsZXZlbFxuICAgIHRoaXMuZ3JvdXBaZXJvRGVncmVlTWVtYmVycygpO1xuICAgIC8vIFRpbGUgYW5kIGNsZWFyIGNoaWxkcmVuIG9mIGVhY2ggY29tcG91bmRcbiAgICB0aGlzLmNsZWFyQ29tcG91bmRzKCk7XG4gICAgLy8gU2VwYXJhdGVseSB0aWxlIGFuZCBjbGVhciB6ZXJvIGRlZ3JlZSBub2RlcyBmb3IgZWFjaCBsZXZlbFxuICAgIHRoaXMuY2xlYXJaZXJvRGVncmVlTWVtYmVycygpO1xuICB9XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS50aWxpbmdQb3N0TGF5b3V0ID0gZnVuY3Rpb24gKCkge1xuICBpZiAoQ29TRUNvbnN0YW50cy5USUxFKSB7XG4gICAgdGhpcy5yZXBvcHVsYXRlWmVyb0RlZ3JlZU1lbWJlcnMoKTtcbiAgICB0aGlzLnJlcG9wdWxhdGVDb21wb3VuZHMoKTtcbiAgfVxufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNlY3Rpb246IFRyZWUgUmVkdWN0aW9uIG1ldGhvZHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBSZWR1Y2UgdHJlZXMgXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5yZWR1Y2VUcmVlcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHBydW5lZE5vZGVzQWxsID0gW107XG4gIHZhciBjb250YWluc0xlYWYgPSB0cnVlO1xuICB2YXIgbm9kZTtcblxuICB3aGlsZSAoY29udGFpbnNMZWFmKSB7XG4gICAgdmFyIGFsbE5vZGVzID0gdGhpcy5ncmFwaE1hbmFnZXIuZ2V0QWxsTm9kZXMoKTtcbiAgICB2YXIgcHJ1bmVkTm9kZXNJblN0ZXBUZW1wID0gW107XG4gICAgY29udGFpbnNMZWFmID0gZmFsc2U7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBub2RlID0gYWxsTm9kZXNbaV07XG4gICAgICBpZiAobm9kZS5nZXRFZGdlcygpLmxlbmd0aCA9PSAxICYmICFub2RlLmdldEVkZ2VzKClbMF0uaXNJbnRlckdyYXBoICYmIG5vZGUuZ2V0Q2hpbGQoKSA9PSBudWxsKSB7XG4gICAgICAgIGlmIChDb1NFQ29uc3RhbnRzLlBVUkVfSU5DUkVNRU5UQUwpIHtcbiAgICAgICAgICB2YXIgb3RoZXJFbmQgPSBub2RlLmdldEVkZ2VzKClbMF0uZ2V0T3RoZXJFbmQobm9kZSk7XG4gICAgICAgICAgdmFyIHJlbGF0aXZlUG9zaXRpb24gPSBuZXcgRGltZW5zaW9uRChub2RlLmdldENlbnRlclgoKSAtIG90aGVyRW5kLmdldENlbnRlclgoKSwgbm9kZS5nZXRDZW50ZXJZKCkgLSBvdGhlckVuZC5nZXRDZW50ZXJZKCkpO1xuICAgICAgICAgIHBydW5lZE5vZGVzSW5TdGVwVGVtcC5wdXNoKFtub2RlLCBub2RlLmdldEVkZ2VzKClbMF0sIG5vZGUuZ2V0T3duZXIoKSwgcmVsYXRpdmVQb3NpdGlvbl0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBydW5lZE5vZGVzSW5TdGVwVGVtcC5wdXNoKFtub2RlLCBub2RlLmdldEVkZ2VzKClbMF0sIG5vZGUuZ2V0T3duZXIoKV0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRhaW5zTGVhZiA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjb250YWluc0xlYWYgPT0gdHJ1ZSkge1xuICAgICAgdmFyIHBydW5lZE5vZGVzSW5TdGVwID0gW107XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHBydW5lZE5vZGVzSW5TdGVwVGVtcC5sZW5ndGg7IGorKykge1xuICAgICAgICBpZiAocHJ1bmVkTm9kZXNJblN0ZXBUZW1wW2pdWzBdLmdldEVkZ2VzKCkubGVuZ3RoID09IDEpIHtcbiAgICAgICAgICBwcnVuZWROb2Rlc0luU3RlcC5wdXNoKHBydW5lZE5vZGVzSW5TdGVwVGVtcFtqXSk7XG4gICAgICAgICAgcHJ1bmVkTm9kZXNJblN0ZXBUZW1wW2pdWzBdLmdldE93bmVyKCkucmVtb3ZlKHBydW5lZE5vZGVzSW5TdGVwVGVtcFtqXVswXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHBydW5lZE5vZGVzQWxsLnB1c2gocHJ1bmVkTm9kZXNJblN0ZXApO1xuICAgICAgdGhpcy5ncmFwaE1hbmFnZXIucmVzZXRBbGxOb2RlcygpO1xuICAgICAgdGhpcy5ncmFwaE1hbmFnZXIucmVzZXRBbGxFZGdlcygpO1xuICAgIH1cbiAgfVxuICB0aGlzLnBydW5lZE5vZGVzQWxsID0gcHJ1bmVkTm9kZXNBbGw7XG59O1xuXG4vLyBHcm93IHRyZWUgb25lIHN0ZXAgXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5ncm93VHJlZSA9IGZ1bmN0aW9uIChwcnVuZWROb2Rlc0FsbCkge1xuICB2YXIgbGVuZ3RoT2ZQcnVuZWROb2Rlc0luU3RlcCA9IHBydW5lZE5vZGVzQWxsLmxlbmd0aDtcbiAgdmFyIHBydW5lZE5vZGVzSW5TdGVwID0gcHJ1bmVkTm9kZXNBbGxbbGVuZ3RoT2ZQcnVuZWROb2Rlc0luU3RlcCAtIDFdO1xuXG4gIHZhciBub2RlRGF0YTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcnVuZWROb2Rlc0luU3RlcC5sZW5ndGg7IGkrKykge1xuICAgIG5vZGVEYXRhID0gcHJ1bmVkTm9kZXNJblN0ZXBbaV07XG5cbiAgICB0aGlzLmZpbmRQbGFjZWZvclBydW5lZE5vZGUobm9kZURhdGEpO1xuXG4gICAgbm9kZURhdGFbMl0uYWRkKG5vZGVEYXRhWzBdKTtcbiAgICBub2RlRGF0YVsyXS5hZGQobm9kZURhdGFbMV0sIG5vZGVEYXRhWzFdLnNvdXJjZSwgbm9kZURhdGFbMV0udGFyZ2V0KTtcbiAgfVxuXG4gIHBydW5lZE5vZGVzQWxsLnNwbGljZShwcnVuZWROb2Rlc0FsbC5sZW5ndGggLSAxLCAxKTtcbiAgdGhpcy5ncmFwaE1hbmFnZXIucmVzZXRBbGxOb2RlcygpO1xuICB0aGlzLmdyYXBoTWFuYWdlci5yZXNldEFsbEVkZ2VzKCk7XG59O1xuXG4vLyBGaW5kIGFuIGFwcHJvcHJpYXRlIHBvc2l0aW9uIHRvIHJlcGxhY2UgcHJ1bmVkIG5vZGUsIHRoaXMgbWV0aG9kIGNhbiBiZSBpbXByb3ZlZFxuQ29TRUxheW91dC5wcm90b3R5cGUuZmluZFBsYWNlZm9yUHJ1bmVkTm9kZSA9IGZ1bmN0aW9uIChub2RlRGF0YSkge1xuXG4gIHZhciBncmlkRm9yUHJ1bmVkTm9kZTtcbiAgdmFyIG5vZGVUb0Nvbm5lY3Q7XG4gIHZhciBwcnVuZWROb2RlID0gbm9kZURhdGFbMF07XG4gIGlmIChwcnVuZWROb2RlID09IG5vZGVEYXRhWzFdLnNvdXJjZSkge1xuICAgIG5vZGVUb0Nvbm5lY3QgPSBub2RlRGF0YVsxXS50YXJnZXQ7XG4gIH0gZWxzZSB7XG4gICAgbm9kZVRvQ29ubmVjdCA9IG5vZGVEYXRhWzFdLnNvdXJjZTtcbiAgfVxuXG4gIGlmIChDb1NFQ29uc3RhbnRzLlBVUkVfSU5DUkVNRU5UQUwpIHtcbiAgICBwcnVuZWROb2RlLnNldENlbnRlcihub2RlVG9Db25uZWN0LmdldENlbnRlclgoKSArIG5vZGVEYXRhWzNdLmdldFdpZHRoKCksIG5vZGVUb0Nvbm5lY3QuZ2V0Q2VudGVyWSgpICsgbm9kZURhdGFbM10uZ2V0SGVpZ2h0KCkpO1xuICB9IGVsc2Uge1xuICAgIHZhciBzdGFydEdyaWRYID0gbm9kZVRvQ29ubmVjdC5zdGFydFg7XG4gICAgdmFyIGZpbmlzaEdyaWRYID0gbm9kZVRvQ29ubmVjdC5maW5pc2hYO1xuICAgIHZhciBzdGFydEdyaWRZID0gbm9kZVRvQ29ubmVjdC5zdGFydFk7XG4gICAgdmFyIGZpbmlzaEdyaWRZID0gbm9kZVRvQ29ubmVjdC5maW5pc2hZO1xuXG4gICAgdmFyIHVwTm9kZUNvdW50ID0gMDtcbiAgICB2YXIgZG93bk5vZGVDb3VudCA9IDA7XG4gICAgdmFyIHJpZ2h0Tm9kZUNvdW50ID0gMDtcbiAgICB2YXIgbGVmdE5vZGVDb3VudCA9IDA7XG4gICAgdmFyIGNvbnRyb2xSZWdpb25zID0gW3VwTm9kZUNvdW50LCByaWdodE5vZGVDb3VudCwgZG93bk5vZGVDb3VudCwgbGVmdE5vZGVDb3VudF07XG5cbiAgICBpZiAoc3RhcnRHcmlkWSA+IDApIHtcbiAgICAgIGZvciAodmFyIGkgPSBzdGFydEdyaWRYOyBpIDw9IGZpbmlzaEdyaWRYOyBpKyspIHtcbiAgICAgICAgY29udHJvbFJlZ2lvbnNbMF0gKz0gdGhpcy5ncmlkW2ldW3N0YXJ0R3JpZFkgLSAxXS5sZW5ndGggKyB0aGlzLmdyaWRbaV1bc3RhcnRHcmlkWV0ubGVuZ3RoIC0gMTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZpbmlzaEdyaWRYIDwgdGhpcy5ncmlkLmxlbmd0aCAtIDEpIHtcbiAgICAgIGZvciAodmFyIGkgPSBzdGFydEdyaWRZOyBpIDw9IGZpbmlzaEdyaWRZOyBpKyspIHtcbiAgICAgICAgY29udHJvbFJlZ2lvbnNbMV0gKz0gdGhpcy5ncmlkW2ZpbmlzaEdyaWRYICsgMV1baV0ubGVuZ3RoICsgdGhpcy5ncmlkW2ZpbmlzaEdyaWRYXVtpXS5sZW5ndGggLSAxO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZmluaXNoR3JpZFkgPCB0aGlzLmdyaWRbMF0ubGVuZ3RoIC0gMSkge1xuICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0R3JpZFg7IGkgPD0gZmluaXNoR3JpZFg7IGkrKykge1xuICAgICAgICBjb250cm9sUmVnaW9uc1syXSArPSB0aGlzLmdyaWRbaV1bZmluaXNoR3JpZFkgKyAxXS5sZW5ndGggKyB0aGlzLmdyaWRbaV1bZmluaXNoR3JpZFldLmxlbmd0aCAtIDE7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzdGFydEdyaWRYID4gMCkge1xuICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0R3JpZFk7IGkgPD0gZmluaXNoR3JpZFk7IGkrKykge1xuICAgICAgICBjb250cm9sUmVnaW9uc1szXSArPSB0aGlzLmdyaWRbc3RhcnRHcmlkWCAtIDFdW2ldLmxlbmd0aCArIHRoaXMuZ3JpZFtzdGFydEdyaWRYXVtpXS5sZW5ndGggLSAxO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgbWluID0gSW50ZWdlci5NQVhfVkFMVUU7XG4gICAgdmFyIG1pbkNvdW50O1xuICAgIHZhciBtaW5JbmRleDtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNvbnRyb2xSZWdpb25zLmxlbmd0aDsgaisrKSB7XG4gICAgICBpZiAoY29udHJvbFJlZ2lvbnNbal0gPCBtaW4pIHtcbiAgICAgICAgbWluID0gY29udHJvbFJlZ2lvbnNbal07XG4gICAgICAgIG1pbkNvdW50ID0gMTtcbiAgICAgICAgbWluSW5kZXggPSBqO1xuICAgICAgfSBlbHNlIGlmIChjb250cm9sUmVnaW9uc1tqXSA9PSBtaW4pIHtcbiAgICAgICAgbWluQ291bnQrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobWluQ291bnQgPT0gMyAmJiBtaW4gPT0gMCkge1xuICAgICAgaWYgKGNvbnRyb2xSZWdpb25zWzBdID09IDAgJiYgY29udHJvbFJlZ2lvbnNbMV0gPT0gMCAmJiBjb250cm9sUmVnaW9uc1syXSA9PSAwKSB7XG4gICAgICAgIGdyaWRGb3JQcnVuZWROb2RlID0gMTtcbiAgICAgIH0gZWxzZSBpZiAoY29udHJvbFJlZ2lvbnNbMF0gPT0gMCAmJiBjb250cm9sUmVnaW9uc1sxXSA9PSAwICYmIGNvbnRyb2xSZWdpb25zWzNdID09IDApIHtcbiAgICAgICAgZ3JpZEZvclBydW5lZE5vZGUgPSAwO1xuICAgICAgfSBlbHNlIGlmIChjb250cm9sUmVnaW9uc1swXSA9PSAwICYmIGNvbnRyb2xSZWdpb25zWzJdID09IDAgJiYgY29udHJvbFJlZ2lvbnNbM10gPT0gMCkge1xuICAgICAgICBncmlkRm9yUHJ1bmVkTm9kZSA9IDM7XG4gICAgICB9IGVsc2UgaWYgKGNvbnRyb2xSZWdpb25zWzFdID09IDAgJiYgY29udHJvbFJlZ2lvbnNbMl0gPT0gMCAmJiBjb250cm9sUmVnaW9uc1szXSA9PSAwKSB7XG4gICAgICAgIGdyaWRGb3JQcnVuZWROb2RlID0gMjtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG1pbkNvdW50ID09IDIgJiYgbWluID09IDApIHtcbiAgICAgIHZhciByYW5kb20gPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAyKTtcbiAgICAgIGlmIChjb250cm9sUmVnaW9uc1swXSA9PSAwICYmIGNvbnRyb2xSZWdpb25zWzFdID09IDApIHtcbiAgICAgICAgO1xuICAgICAgICBpZiAocmFuZG9tID09IDApIHtcbiAgICAgICAgICBncmlkRm9yUHJ1bmVkTm9kZSA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZ3JpZEZvclBydW5lZE5vZGUgPSAxO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNvbnRyb2xSZWdpb25zWzBdID09IDAgJiYgY29udHJvbFJlZ2lvbnNbMl0gPT0gMCkge1xuICAgICAgICBpZiAocmFuZG9tID09IDApIHtcbiAgICAgICAgICBncmlkRm9yUHJ1bmVkTm9kZSA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZ3JpZEZvclBydW5lZE5vZGUgPSAyO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNvbnRyb2xSZWdpb25zWzBdID09IDAgJiYgY29udHJvbFJlZ2lvbnNbM10gPT0gMCkge1xuICAgICAgICBpZiAocmFuZG9tID09IDApIHtcbiAgICAgICAgICBncmlkRm9yUHJ1bmVkTm9kZSA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZ3JpZEZvclBydW5lZE5vZGUgPSAzO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNvbnRyb2xSZWdpb25zWzFdID09IDAgJiYgY29udHJvbFJlZ2lvbnNbMl0gPT0gMCkge1xuICAgICAgICBpZiAocmFuZG9tID09IDApIHtcbiAgICAgICAgICBncmlkRm9yUHJ1bmVkTm9kZSA9IDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZ3JpZEZvclBydW5lZE5vZGUgPSAyO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNvbnRyb2xSZWdpb25zWzFdID09IDAgJiYgY29udHJvbFJlZ2lvbnNbM10gPT0gMCkge1xuICAgICAgICBpZiAocmFuZG9tID09IDApIHtcbiAgICAgICAgICBncmlkRm9yUHJ1bmVkTm9kZSA9IDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZ3JpZEZvclBydW5lZE5vZGUgPSAzO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocmFuZG9tID09IDApIHtcbiAgICAgICAgICBncmlkRm9yUHJ1bmVkTm9kZSA9IDI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZ3JpZEZvclBydW5lZE5vZGUgPSAzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChtaW5Db3VudCA9PSA0ICYmIG1pbiA9PSAwKSB7XG4gICAgICB2YXIgcmFuZG9tID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogNCk7XG4gICAgICBncmlkRm9yUHJ1bmVkTm9kZSA9IHJhbmRvbTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ3JpZEZvclBydW5lZE5vZGUgPSBtaW5JbmRleDtcbiAgICB9XG5cbiAgICBpZiAoZ3JpZEZvclBydW5lZE5vZGUgPT0gMCkge1xuICAgICAgcHJ1bmVkTm9kZS5zZXRDZW50ZXIobm9kZVRvQ29ubmVjdC5nZXRDZW50ZXJYKCksIG5vZGVUb0Nvbm5lY3QuZ2V0Q2VudGVyWSgpIC0gbm9kZVRvQ29ubmVjdC5nZXRIZWlnaHQoKSAvIDIgLSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIIC0gcHJ1bmVkTm9kZS5nZXRIZWlnaHQoKSAvIDIpO1xuICAgIH0gZWxzZSBpZiAoZ3JpZEZvclBydW5lZE5vZGUgPT0gMSkge1xuICAgICAgcHJ1bmVkTm9kZS5zZXRDZW50ZXIobm9kZVRvQ29ubmVjdC5nZXRDZW50ZXJYKCkgKyBub2RlVG9Db25uZWN0LmdldFdpZHRoKCkgLyAyICsgRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9FREdFX0xFTkdUSCArIHBydW5lZE5vZGUuZ2V0V2lkdGgoKSAvIDIsIG5vZGVUb0Nvbm5lY3QuZ2V0Q2VudGVyWSgpKTtcbiAgICB9IGVsc2UgaWYgKGdyaWRGb3JQcnVuZWROb2RlID09IDIpIHtcbiAgICAgIHBydW5lZE5vZGUuc2V0Q2VudGVyKG5vZGVUb0Nvbm5lY3QuZ2V0Q2VudGVyWCgpLCBub2RlVG9Db25uZWN0LmdldENlbnRlclkoKSArIG5vZGVUb0Nvbm5lY3QuZ2V0SGVpZ2h0KCkgLyAyICsgRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9FREdFX0xFTkdUSCArIHBydW5lZE5vZGUuZ2V0SGVpZ2h0KCkgLyAyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJ1bmVkTm9kZS5zZXRDZW50ZXIobm9kZVRvQ29ubmVjdC5nZXRDZW50ZXJYKCkgLSBub2RlVG9Db25uZWN0LmdldFdpZHRoKCkgLyAyIC0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9FREdFX0xFTkdUSCAtIHBydW5lZE5vZGUuZ2V0V2lkdGgoKSAvIDIsIG5vZGVUb0Nvbm5lY3QuZ2V0Q2VudGVyWSgpKTtcbiAgICB9XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gQ29TRUxheW91dDtcblxuLyoqKi8gfSksXG5cbi8qKiovIDk5MTpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG5cbnZhciBGRExheW91dE5vZGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MSkuRkRMYXlvdXROb2RlO1xudmFyIElNYXRoID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTEpLklNYXRoO1xuXG5mdW5jdGlvbiBDb1NFTm9kZShnbSwgbG9jLCBzaXplLCB2Tm9kZSkge1xuICBGRExheW91dE5vZGUuY2FsbCh0aGlzLCBnbSwgbG9jLCBzaXplLCB2Tm9kZSk7XG59XG5cbkNvU0VOb2RlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRkRMYXlvdXROb2RlLnByb3RvdHlwZSk7XG5mb3IgKHZhciBwcm9wIGluIEZETGF5b3V0Tm9kZSkge1xuICBDb1NFTm9kZVtwcm9wXSA9IEZETGF5b3V0Tm9kZVtwcm9wXTtcbn1cblxuQ29TRU5vZGUucHJvdG90eXBlLmNhbGN1bGF0ZURpc3BsYWNlbWVudCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGxheW91dCA9IHRoaXMuZ3JhcGhNYW5hZ2VyLmdldExheW91dCgpO1xuICAvLyB0aGlzIGNoZWNrIGlzIGZvciBjb21wb3VuZCBub2RlcyB0aGF0IGNvbnRhaW4gZml4ZWQgbm9kZXNcbiAgaWYgKHRoaXMuZ2V0Q2hpbGQoKSAhPSBudWxsICYmIHRoaXMuZml4ZWROb2RlV2VpZ2h0KSB7XG4gICAgdGhpcy5kaXNwbGFjZW1lbnRYICs9IGxheW91dC5jb29saW5nRmFjdG9yICogKHRoaXMuc3ByaW5nRm9yY2VYICsgdGhpcy5yZXB1bHNpb25Gb3JjZVggKyB0aGlzLmdyYXZpdGF0aW9uRm9yY2VYKSAvIHRoaXMuZml4ZWROb2RlV2VpZ2h0O1xuICAgIHRoaXMuZGlzcGxhY2VtZW50WSArPSBsYXlvdXQuY29vbGluZ0ZhY3RvciAqICh0aGlzLnNwcmluZ0ZvcmNlWSArIHRoaXMucmVwdWxzaW9uRm9yY2VZICsgdGhpcy5ncmF2aXRhdGlvbkZvcmNlWSkgLyB0aGlzLmZpeGVkTm9kZVdlaWdodDtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmRpc3BsYWNlbWVudFggKz0gbGF5b3V0LmNvb2xpbmdGYWN0b3IgKiAodGhpcy5zcHJpbmdGb3JjZVggKyB0aGlzLnJlcHVsc2lvbkZvcmNlWCArIHRoaXMuZ3Jhdml0YXRpb25Gb3JjZVgpIC8gdGhpcy5ub09mQ2hpbGRyZW47XG4gICAgdGhpcy5kaXNwbGFjZW1lbnRZICs9IGxheW91dC5jb29saW5nRmFjdG9yICogKHRoaXMuc3ByaW5nRm9yY2VZICsgdGhpcy5yZXB1bHNpb25Gb3JjZVkgKyB0aGlzLmdyYXZpdGF0aW9uRm9yY2VZKSAvIHRoaXMubm9PZkNoaWxkcmVuO1xuICB9XG5cbiAgaWYgKE1hdGguYWJzKHRoaXMuZGlzcGxhY2VtZW50WCkgPiBsYXlvdXQuY29vbGluZ0ZhY3RvciAqIGxheW91dC5tYXhOb2RlRGlzcGxhY2VtZW50KSB7XG4gICAgdGhpcy5kaXNwbGFjZW1lbnRYID0gbGF5b3V0LmNvb2xpbmdGYWN0b3IgKiBsYXlvdXQubWF4Tm9kZURpc3BsYWNlbWVudCAqIElNYXRoLnNpZ24odGhpcy5kaXNwbGFjZW1lbnRYKTtcbiAgfVxuXG4gIGlmIChNYXRoLmFicyh0aGlzLmRpc3BsYWNlbWVudFkpID4gbGF5b3V0LmNvb2xpbmdGYWN0b3IgKiBsYXlvdXQubWF4Tm9kZURpc3BsYWNlbWVudCkge1xuICAgIHRoaXMuZGlzcGxhY2VtZW50WSA9IGxheW91dC5jb29saW5nRmFjdG9yICogbGF5b3V0Lm1heE5vZGVEaXNwbGFjZW1lbnQgKiBJTWF0aC5zaWduKHRoaXMuZGlzcGxhY2VtZW50WSk7XG4gIH1cblxuICAvLyBub24tZW1wdHkgY29tcG91bmQgbm9kZSwgcHJvcG9nYXRlIG1vdmVtZW50IHRvIGNoaWxkcmVuIGFzIHdlbGxcbiAgaWYgKHRoaXMuY2hpbGQgJiYgdGhpcy5jaGlsZC5nZXROb2RlcygpLmxlbmd0aCA+IDApIHtcbiAgICB0aGlzLnByb3BvZ2F0ZURpc3BsYWNlbWVudFRvQ2hpbGRyZW4odGhpcy5kaXNwbGFjZW1lbnRYLCB0aGlzLmRpc3BsYWNlbWVudFkpO1xuICB9XG59O1xuXG5Db1NFTm9kZS5wcm90b3R5cGUucHJvcG9nYXRlRGlzcGxhY2VtZW50VG9DaGlsZHJlbiA9IGZ1bmN0aW9uIChkWCwgZFkpIHtcbiAgdmFyIG5vZGVzID0gdGhpcy5nZXRDaGlsZCgpLmdldE5vZGVzKCk7XG4gIHZhciBub2RlO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgbm9kZSA9IG5vZGVzW2ldO1xuICAgIGlmIChub2RlLmdldENoaWxkKCkgPT0gbnVsbCkge1xuICAgICAgbm9kZS5kaXNwbGFjZW1lbnRYICs9IGRYO1xuICAgICAgbm9kZS5kaXNwbGFjZW1lbnRZICs9IGRZO1xuICAgIH0gZWxzZSB7XG4gICAgICBub2RlLnByb3BvZ2F0ZURpc3BsYWNlbWVudFRvQ2hpbGRyZW4oZFgsIGRZKTtcbiAgICB9XG4gIH1cbn07XG5cbkNvU0VOb2RlLnByb3RvdHlwZS5tb3ZlID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbGF5b3V0ID0gdGhpcy5ncmFwaE1hbmFnZXIuZ2V0TGF5b3V0KCk7XG5cbiAgLy8gYSBzaW1wbGUgbm9kZSBvciBhbiBlbXB0eSBjb21wb3VuZCBub2RlLCBtb3ZlIGl0XG4gIGlmICh0aGlzLmNoaWxkID09IG51bGwgfHwgdGhpcy5jaGlsZC5nZXROb2RlcygpLmxlbmd0aCA9PSAwKSB7XG4gICAgdGhpcy5tb3ZlQnkodGhpcy5kaXNwbGFjZW1lbnRYLCB0aGlzLmRpc3BsYWNlbWVudFkpO1xuXG4gICAgbGF5b3V0LnRvdGFsRGlzcGxhY2VtZW50ICs9IE1hdGguYWJzKHRoaXMuZGlzcGxhY2VtZW50WCkgKyBNYXRoLmFicyh0aGlzLmRpc3BsYWNlbWVudFkpO1xuICB9XG5cbiAgdGhpcy5zcHJpbmdGb3JjZVggPSAwO1xuICB0aGlzLnNwcmluZ0ZvcmNlWSA9IDA7XG4gIHRoaXMucmVwdWxzaW9uRm9yY2VYID0gMDtcbiAgdGhpcy5yZXB1bHNpb25Gb3JjZVkgPSAwO1xuICB0aGlzLmdyYXZpdGF0aW9uRm9yY2VYID0gMDtcbiAgdGhpcy5ncmF2aXRhdGlvbkZvcmNlWSA9IDA7XG4gIHRoaXMuZGlzcGxhY2VtZW50WCA9IDA7XG4gIHRoaXMuZGlzcGxhY2VtZW50WSA9IDA7XG59O1xuXG5Db1NFTm9kZS5wcm90b3R5cGUuc2V0UHJlZDEgPSBmdW5jdGlvbiAocHJlZDEpIHtcbiAgdGhpcy5wcmVkMSA9IHByZWQxO1xufTtcblxuQ29TRU5vZGUucHJvdG90eXBlLmdldFByZWQxID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gcHJlZDE7XG59O1xuXG5Db1NFTm9kZS5wcm90b3R5cGUuZ2V0UHJlZDIgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBwcmVkMjtcbn07XG5cbkNvU0VOb2RlLnByb3RvdHlwZS5zZXROZXh0ID0gZnVuY3Rpb24gKG5leHQpIHtcbiAgdGhpcy5uZXh0ID0gbmV4dDtcbn07XG5cbkNvU0VOb2RlLnByb3RvdHlwZS5nZXROZXh0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbmV4dDtcbn07XG5cbkNvU0VOb2RlLnByb3RvdHlwZS5zZXRQcm9jZXNzZWQgPSBmdW5jdGlvbiAocHJvY2Vzc2VkKSB7XG4gIHRoaXMucHJvY2Vzc2VkID0gcHJvY2Vzc2VkO1xufTtcblxuQ29TRU5vZGUucHJvdG90eXBlLmlzUHJvY2Vzc2VkID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gcHJvY2Vzc2VkO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBDb1NFTm9kZTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDkwMjpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG5cbmZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgeyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IEFycmF5KGFyci5sZW5ndGgpOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH0gZWxzZSB7IHJldHVybiBBcnJheS5mcm9tKGFycik7IH0gfVxuXG52YXIgQ29TRUNvbnN0YW50cyA9IF9fd2VicGFja19yZXF1aXJlX18oODA2KTtcbnZhciBMaW5rZWRMaXN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTEpLkxpbmtlZExpc3Q7XG52YXIgTWF0cml4ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTEpLk1hdHJpeDtcbnZhciBTVkQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MSkuU1ZEO1xuXG5mdW5jdGlvbiBDb25zdHJhaW50SGFuZGxlcigpIHt9XG5cbkNvbnN0cmFpbnRIYW5kbGVyLmhhbmRsZUNvbnN0cmFpbnRzID0gZnVuY3Rpb24gKGxheW91dCkge1xuICAvLyAgbGV0IGxheW91dCA9IHRoaXMuZ3JhcGhNYW5hZ2VyLmdldExheW91dCgpO1xuXG4gIC8vIGdldCBjb25zdHJhaW50cyBmcm9tIGxheW91dFxuICB2YXIgY29uc3RyYWludHMgPSB7fTtcbiAgY29uc3RyYWludHMuZml4ZWROb2RlQ29uc3RyYWludCA9IGxheW91dC5jb25zdHJhaW50cy5maXhlZE5vZGVDb25zdHJhaW50O1xuICBjb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50ID0gbGF5b3V0LmNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQ7XG4gIGNvbnN0cmFpbnRzLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludCA9IGxheW91dC5jb25zdHJhaW50cy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQ7XG5cbiAgdmFyIGlkVG9Ob2RlTWFwID0gbmV3IE1hcCgpO1xuICB2YXIgbm9kZUluZGV4ZXMgPSBuZXcgTWFwKCk7XG4gIHZhciB4Q29vcmRzID0gW107XG4gIHZhciB5Q29vcmRzID0gW107XG5cbiAgdmFyIGFsbE5vZGVzID0gbGF5b3V0LmdldEFsbE5vZGVzKCk7XG4gIHZhciBpbmRleCA9IDA7XG4gIC8vIGZpbGwgaW5kZXggbWFwIGFuZCBjb29yZGluYXRlc1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG5vZGUgPSBhbGxOb2Rlc1tpXTtcbiAgICBpZiAobm9kZS5nZXRDaGlsZCgpID09IG51bGwpIHtcbiAgICAgIG5vZGVJbmRleGVzLnNldChub2RlLmlkLCBpbmRleCsrKTtcbiAgICAgIHhDb29yZHMucHVzaChub2RlLmdldENlbnRlclgoKSk7XG4gICAgICB5Q29vcmRzLnB1c2gobm9kZS5nZXRDZW50ZXJZKCkpO1xuICAgICAgaWRUb05vZGVNYXAuc2V0KG5vZGUuaWQsIG5vZGUpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGlmIHRoZXJlIGV4aXN0cyByZWxhdGl2ZSBwbGFjZW1lbnQgY29uc3RyYWludCB3aXRob3V0IGdhcCB2YWx1ZSwgc2V0IGl0IHRvIGRlZmF1bHQgXG4gIGlmIChjb25zdHJhaW50cy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQpIHtcbiAgICBjb25zdHJhaW50cy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQuZm9yRWFjaChmdW5jdGlvbiAoY29uc3RyYWludCkge1xuICAgICAgaWYgKCFjb25zdHJhaW50LmdhcCAmJiBjb25zdHJhaW50LmdhcCAhPSAwKSB7XG4gICAgICAgIGlmIChjb25zdHJhaW50LmxlZnQpIHtcbiAgICAgICAgICBjb25zdHJhaW50LmdhcCA9IENvU0VDb25zdGFudHMuREVGQVVMVF9FREdFX0xFTkdUSCArIGlkVG9Ob2RlTWFwLmdldChjb25zdHJhaW50LmxlZnQpLmdldFdpZHRoKCkgLyAyICsgaWRUb05vZGVNYXAuZ2V0KGNvbnN0cmFpbnQucmlnaHQpLmdldFdpZHRoKCkgLyAyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0cmFpbnQuZ2FwID0gQ29TRUNvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIICsgaWRUb05vZGVNYXAuZ2V0KGNvbnN0cmFpbnQudG9wKS5nZXRIZWlnaHQoKSAvIDIgKyBpZFRvTm9kZU1hcC5nZXQoY29uc3RyYWludC5ib3R0b20pLmdldEhlaWdodCgpIC8gMjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyogYXV4aWxpYXJ5IGZ1bmN0aW9ucyAqL1xuXG4gIC8vIGNhbGN1bGF0ZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIHBvc2l0aW9uIG9iamVjdHNcbiAgdmFyIGNhbGN1bGF0ZVBvc2l0aW9uRGlmZiA9IGZ1bmN0aW9uIGNhbGN1bGF0ZVBvc2l0aW9uRGlmZihwb3MxLCBwb3MyKSB7XG4gICAgcmV0dXJuIHsgeDogcG9zMS54IC0gcG9zMi54LCB5OiBwb3MxLnkgLSBwb3MyLnkgfTtcbiAgfTtcblxuICAvLyBjYWxjdWxhdGUgYXZlcmFnZSBwb3NpdGlvbiBvZiB0aGUgbm9kZXNcbiAgdmFyIGNhbGN1bGF0ZUF2Z1Bvc2l0aW9uID0gZnVuY3Rpb24gY2FsY3VsYXRlQXZnUG9zaXRpb24obm9kZUlkU2V0KSB7XG4gICAgdmFyIHhQb3NTdW0gPSAwO1xuICAgIHZhciB5UG9zU3VtID0gMDtcbiAgICBub2RlSWRTZXQuZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICB4UG9zU3VtICs9IHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVJZCldO1xuICAgICAgeVBvc1N1bSArPSB5Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlSWQpXTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7IHg6IHhQb3NTdW0gLyBub2RlSWRTZXQuc2l6ZSwgeTogeVBvc1N1bSAvIG5vZGVJZFNldC5zaXplIH07XG4gIH07XG5cbiAgLy8gZmluZCBhbiBhcHByb3ByaWF0ZSBwb3NpdGlvbmluZyBmb3IgdGhlIG5vZGVzIGluIGEgZ2l2ZW4gZ3JhcGggYWNjb3JkaW5nIHRvIHJlbGF0aXZlIHBsYWNlbWVudCBjb25zdHJhaW50c1xuICAvLyB0aGlzIGZ1bmN0aW9uIGFsc28gdGFrZXMgdGhlIGZpeGVkIG5vZGVzIGFuZCBhbGlnbm1lbnQgY29uc3RyYWludHMgaW50byBhY2NvdW50XG4gIC8vIGdyYXBoOiBkYWcgdG8gYmUgZXZhbHVhdGVkLCBkaXJlY3Rpb246IFwiaG9yaXpvbnRhbFwiIG9yIFwidmVydGljYWxcIiwgXG4gIC8vIGZpeGVkTm9kZXM6IHNldCBvZiBmaXhlZCBub2RlcyB0byBjb25zaWRlciBkdXJpbmcgZXZhbHVhdGlvbiwgZHVtbXlQb3NpdGlvbnM6IGFwcHJvcHJpYXRlIGNvb3JkaW5hdGVzIG9mIHRoZSBkdW1teSBub2RlcyAgXG4gIHZhciBmaW5kQXBwcm9wcmlhdGVQb3NpdGlvbkZvclJlbGF0aXZlUGxhY2VtZW50ID0gZnVuY3Rpb24gZmluZEFwcHJvcHJpYXRlUG9zaXRpb25Gb3JSZWxhdGl2ZVBsYWNlbWVudChncmFwaCwgZGlyZWN0aW9uLCBmaXhlZE5vZGVzLCBkdW1teVBvc2l0aW9ucywgY29tcG9uZW50U291cmNlcykge1xuXG4gICAgLy8gZmluZCB1bmlvbiBvZiB0d28gc2V0c1xuICAgIGZ1bmN0aW9uIHNldFVuaW9uKHNldEEsIHNldEIpIHtcbiAgICAgIHZhciB1bmlvbiA9IG5ldyBTZXQoc2V0QSk7XG4gICAgICB2YXIgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IHRydWU7XG4gICAgICB2YXIgX2RpZEl0ZXJhdG9yRXJyb3IgPSBmYWxzZTtcbiAgICAgIHZhciBfaXRlcmF0b3JFcnJvciA9IHVuZGVmaW5lZDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yID0gc2V0QltTeW1ib2wuaXRlcmF0b3JdKCksIF9zdGVwOyAhKF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSAoX3N0ZXAgPSBfaXRlcmF0b3IubmV4dCgpKS5kb25lKTsgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IHRydWUpIHtcbiAgICAgICAgICB2YXIgZWxlbSA9IF9zdGVwLnZhbHVlO1xuXG4gICAgICAgICAgdW5pb24uYWRkKGVsZW0pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3IgPSB0cnVlO1xuICAgICAgICBfaXRlcmF0b3JFcnJvciA9IGVycjtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKCFfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uICYmIF9pdGVyYXRvci5yZXR1cm4pIHtcbiAgICAgICAgICAgIF9pdGVyYXRvci5yZXR1cm4oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgaWYgKF9kaWRJdGVyYXRvckVycm9yKSB7XG4gICAgICAgICAgICB0aHJvdyBfaXRlcmF0b3JFcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVuaW9uO1xuICAgIH1cblxuICAgIC8vIGZpbmQgaW5kZWdyZWUgY291bnQgZm9yIGVhY2ggbm9kZVxuICAgIHZhciBpbkRlZ3JlZXMgPSBuZXcgTWFwKCk7XG5cbiAgICBncmFwaC5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICBpbkRlZ3JlZXMuc2V0KGtleSwgMCk7XG4gICAgfSk7XG4gICAgZ3JhcGguZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbiAoYWRqYWNlbnQpIHtcbiAgICAgICAgaW5EZWdyZWVzLnNldChhZGphY2VudC5pZCwgaW5EZWdyZWVzLmdldChhZGphY2VudC5pZCkgKyAxKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdmFyIHBvc2l0aW9uTWFwID0gbmV3IE1hcCgpOyAvLyBrZWVwcyB0aGUgcG9zaXRpb24gZm9yIGVhY2ggbm9kZVxuICAgIHZhciBwYXN0TWFwID0gbmV3IE1hcCgpOyAvLyBrZWVwcyB0aGUgcHJlZGVjZXNzb3JzKHBhc3QpIG9mIGEgbm9kZVxuICAgIHZhciBxdWV1ZSA9IG5ldyBMaW5rZWRMaXN0KCk7XG4gICAgaW5EZWdyZWVzLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgIGlmICh2YWx1ZSA9PSAwKSB7XG4gICAgICAgIHF1ZXVlLnB1c2goa2V5KTtcbiAgICAgICAgaWYgKCFmaXhlZE5vZGVzKSB7XG4gICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBcImhvcml6b250YWxcIikge1xuICAgICAgICAgICAgcG9zaXRpb25NYXAuc2V0KGtleSwgbm9kZUluZGV4ZXMuaGFzKGtleSkgPyB4Q29vcmRzW25vZGVJbmRleGVzLmdldChrZXkpXSA6IGR1bW15UG9zaXRpb25zLmdldChrZXkpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcG9zaXRpb25NYXAuc2V0KGtleSwgbm9kZUluZGV4ZXMuaGFzKGtleSkgPyB5Q29vcmRzW25vZGVJbmRleGVzLmdldChrZXkpXSA6IGR1bW15UG9zaXRpb25zLmdldChrZXkpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBvc2l0aW9uTWFwLnNldChrZXksIE51bWJlci5ORUdBVElWRV9JTkZJTklUWSk7XG4gICAgICB9XG4gICAgICBpZiAoZml4ZWROb2Rlcykge1xuICAgICAgICBwYXN0TWFwLnNldChrZXksIG5ldyBTZXQoW2tleV0pKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIGFsaWduIHNvdXJjZXMgb2YgZWFjaCBjb21wb25lbnQgaW4gZW5mb3JjZW1lbnQgcGhhc2VcbiAgICBpZiAoZml4ZWROb2Rlcykge1xuICAgICAgY29tcG9uZW50U291cmNlcy5mb3JFYWNoKGZ1bmN0aW9uIChjb21wb25lbnQpIHtcbiAgICAgICAgdmFyIGZpeGVkSWRzID0gW107XG4gICAgICAgIGNvbXBvbmVudC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICBpZiAoZml4ZWROb2Rlcy5oYXMobm9kZUlkKSkge1xuICAgICAgICAgICAgZml4ZWRJZHMucHVzaChub2RlSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChmaXhlZElkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdmFyIHBvc2l0aW9uID0gMDtcbiAgICAgICAgICBmaXhlZElkcy5mb3JFYWNoKGZ1bmN0aW9uIChmaXhlZElkKSB7XG4gICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09IFwiaG9yaXpvbnRhbFwiKSB7XG4gICAgICAgICAgICAgIHBvc2l0aW9uTWFwLnNldChmaXhlZElkLCBub2RlSW5kZXhlcy5oYXMoZml4ZWRJZCkgPyB4Q29vcmRzW25vZGVJbmRleGVzLmdldChmaXhlZElkKV0gOiBkdW1teVBvc2l0aW9ucy5nZXQoZml4ZWRJZCkpO1xuICAgICAgICAgICAgICBwb3NpdGlvbiArPSBwb3NpdGlvbk1hcC5nZXQoZml4ZWRJZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwb3NpdGlvbk1hcC5zZXQoZml4ZWRJZCwgbm9kZUluZGV4ZXMuaGFzKGZpeGVkSWQpID8geUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQoZml4ZWRJZCldIDogZHVtbXlQb3NpdGlvbnMuZ2V0KGZpeGVkSWQpKTtcbiAgICAgICAgICAgICAgcG9zaXRpb24gKz0gcG9zaXRpb25NYXAuZ2V0KGZpeGVkSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb24gLyBmaXhlZElkcy5sZW5ndGg7XG4gICAgICAgICAgY29tcG9uZW50LmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgaWYgKCFmaXhlZE5vZGVzLmhhcyhub2RlSWQpKSB7XG4gICAgICAgICAgICAgIHBvc2l0aW9uTWFwLnNldChub2RlSWQsIHBvc2l0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgX3Bvc2l0aW9uID0gMDtcbiAgICAgICAgICBjb21wb25lbnQuZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09IFwiaG9yaXpvbnRhbFwiKSB7XG4gICAgICAgICAgICAgIF9wb3NpdGlvbiArPSBub2RlSW5kZXhlcy5oYXMobm9kZUlkKSA/IHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVJZCldIDogZHVtbXlQb3NpdGlvbnMuZ2V0KG5vZGVJZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBfcG9zaXRpb24gKz0gbm9kZUluZGV4ZXMuaGFzKG5vZGVJZCkgPyB5Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlSWQpXSA6IGR1bW15UG9zaXRpb25zLmdldChub2RlSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9wb3NpdGlvbiA9IF9wb3NpdGlvbiAvIGNvbXBvbmVudC5sZW5ndGg7XG4gICAgICAgICAgY29tcG9uZW50LmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgcG9zaXRpb25NYXAuc2V0KG5vZGVJZCwgX3Bvc2l0aW9uKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gY2FsY3VsYXRlIHBvc2l0aW9ucyBvZiB0aGUgbm9kZXNcblxuICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKCkge1xuICAgICAgdmFyIGN1cnJlbnROb2RlID0gcXVldWUuc2hpZnQoKTtcbiAgICAgIHZhciBuZWlnaGJvcnMgPSBncmFwaC5nZXQoY3VycmVudE5vZGUpO1xuICAgICAgbmVpZ2hib3JzLmZvckVhY2goZnVuY3Rpb24gKG5laWdoYm9yKSB7XG4gICAgICAgIGlmIChwb3NpdGlvbk1hcC5nZXQobmVpZ2hib3IuaWQpIDwgcG9zaXRpb25NYXAuZ2V0KGN1cnJlbnROb2RlKSArIG5laWdoYm9yLmdhcCkge1xuICAgICAgICAgIGlmIChmaXhlZE5vZGVzICYmIGZpeGVkTm9kZXMuaGFzKG5laWdoYm9yLmlkKSkge1xuICAgICAgICAgICAgdmFyIGZpeGVkUG9zaXRpb24gPSB2b2lkIDA7XG4gICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09IFwiaG9yaXpvbnRhbFwiKSB7XG4gICAgICAgICAgICAgIGZpeGVkUG9zaXRpb24gPSBub2RlSW5kZXhlcy5oYXMobmVpZ2hib3IuaWQpID8geENvb3Jkc1tub2RlSW5kZXhlcy5nZXQobmVpZ2hib3IuaWQpXSA6IGR1bW15UG9zaXRpb25zLmdldChuZWlnaGJvci5pZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBmaXhlZFBvc2l0aW9uID0gbm9kZUluZGV4ZXMuaGFzKG5laWdoYm9yLmlkKSA/IHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5laWdoYm9yLmlkKV0gOiBkdW1teVBvc2l0aW9ucy5nZXQobmVpZ2hib3IuaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG9zaXRpb25NYXAuc2V0KG5laWdoYm9yLmlkLCBmaXhlZFBvc2l0aW9uKTsgLy8gVE9ETzogbWF5IGRvIHVubmVjZXNzYXJ5IHdvcmtcbiAgICAgICAgICAgIGlmIChmaXhlZFBvc2l0aW9uIDwgcG9zaXRpb25NYXAuZ2V0KGN1cnJlbnROb2RlKSArIG5laWdoYm9yLmdhcCkge1xuICAgICAgICAgICAgICB2YXIgZGlmZiA9IHBvc2l0aW9uTWFwLmdldChjdXJyZW50Tm9kZSkgKyBuZWlnaGJvci5nYXAgLSBmaXhlZFBvc2l0aW9uO1xuICAgICAgICAgICAgICBwYXN0TWFwLmdldChjdXJyZW50Tm9kZSkuZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICAgICAgcG9zaXRpb25NYXAuc2V0KG5vZGVJZCwgcG9zaXRpb25NYXAuZ2V0KG5vZGVJZCkgLSBkaWZmKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBvc2l0aW9uTWFwLnNldChuZWlnaGJvci5pZCwgcG9zaXRpb25NYXAuZ2V0KGN1cnJlbnROb2RlKSArIG5laWdoYm9yLmdhcCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGluRGVncmVlcy5zZXQobmVpZ2hib3IuaWQsIGluRGVncmVlcy5nZXQobmVpZ2hib3IuaWQpIC0gMSk7XG4gICAgICAgIGlmIChpbkRlZ3JlZXMuZ2V0KG5laWdoYm9yLmlkKSA9PSAwKSB7XG4gICAgICAgICAgcXVldWUucHVzaChuZWlnaGJvci5pZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpeGVkTm9kZXMpIHtcbiAgICAgICAgICBwYXN0TWFwLnNldChuZWlnaGJvci5pZCwgc2V0VW5pb24ocGFzdE1hcC5nZXQoY3VycmVudE5vZGUpLCBwYXN0TWFwLmdldChuZWlnaGJvci5pZCkpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHdoaWxlIChxdWV1ZS5sZW5ndGggIT0gMCkge1xuICAgICAgX2xvb3AoKTtcbiAgICB9XG5cbiAgICAvLyByZWFkanVzdCBwb3NpdGlvbiBvZiB0aGUgbm9kZXMgYWZ0ZXIgZW5mb3JjZW1lbnRcbiAgICBpZiAoZml4ZWROb2Rlcykge1xuICAgICAgLy8gZmluZCBpbmRlZ3JlZSBjb3VudCBmb3IgZWFjaCBub2RlXG4gICAgICB2YXIgc2lua05vZGVzID0gbmV3IFNldCgpO1xuXG4gICAgICBncmFwaC5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPT0gMCkge1xuICAgICAgICAgIHNpbmtOb2Rlcy5hZGQoa2V5KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHZhciBfY29tcG9uZW50cyA9IFtdO1xuICAgICAgcGFzdE1hcC5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICAgIGlmIChzaW5rTm9kZXMuaGFzKGtleSkpIHtcbiAgICAgICAgICB2YXIgaXNGaXhlZENvbXBvbmVudCA9IGZhbHNlO1xuICAgICAgICAgIHZhciBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMiA9IHRydWU7XG4gICAgICAgICAgdmFyIF9kaWRJdGVyYXRvckVycm9yMiA9IGZhbHNlO1xuICAgICAgICAgIHZhciBfaXRlcmF0b3JFcnJvcjIgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yMiA9IHZhbHVlW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3N0ZXAyOyAhKF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24yID0gKF9zdGVwMiA9IF9pdGVyYXRvcjIubmV4dCgpKS5kb25lKTsgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjIgPSB0cnVlKSB7XG4gICAgICAgICAgICAgIHZhciBub2RlSWQgPSBfc3RlcDIudmFsdWU7XG5cbiAgICAgICAgICAgICAgaWYgKGZpeGVkTm9kZXMuaGFzKG5vZGVJZCkpIHtcbiAgICAgICAgICAgICAgICBpc0ZpeGVkQ29tcG9uZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3IyID0gdHJ1ZTtcbiAgICAgICAgICAgIF9pdGVyYXRvckVycm9yMiA9IGVycjtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgaWYgKCFfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMiAmJiBfaXRlcmF0b3IyLnJldHVybikge1xuICAgICAgICAgICAgICAgIF9pdGVyYXRvcjIucmV0dXJuKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgIGlmIChfZGlkSXRlcmF0b3JFcnJvcjIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBfaXRlcmF0b3JFcnJvcjI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIWlzRml4ZWRDb21wb25lbnQpIHtcbiAgICAgICAgICAgIHZhciBpc0V4aXN0ID0gZmFsc2U7XG4gICAgICAgICAgICB2YXIgZXhpc3RBdCA9IHZvaWQgMDtcbiAgICAgICAgICAgIF9jb21wb25lbnRzLmZvckVhY2goZnVuY3Rpb24gKGNvbXBvbmVudCwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5oYXMoW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheSh2YWx1ZSkpWzBdKSkge1xuICAgICAgICAgICAgICAgIGlzRXhpc3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGV4aXN0QXQgPSBpbmRleDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIWlzRXhpc3QpIHtcbiAgICAgICAgICAgICAgX2NvbXBvbmVudHMucHVzaChuZXcgU2V0KHZhbHVlKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgICAgICAgICBfY29tcG9uZW50c1tleGlzdEF0XS5hZGQoZWxlKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgX2NvbXBvbmVudHMuZm9yRWFjaChmdW5jdGlvbiAoY29tcG9uZW50LCBpbmRleCkge1xuICAgICAgICB2YXIgbWluQmVmb3JlID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICAgICAgICB2YXIgbWluQWZ0ZXIgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgICAgIHZhciBtYXhCZWZvcmUgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG4gICAgICAgIHZhciBtYXhBZnRlciA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTtcblxuICAgICAgICB2YXIgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjMgPSB0cnVlO1xuICAgICAgICB2YXIgX2RpZEl0ZXJhdG9yRXJyb3IzID0gZmFsc2U7XG4gICAgICAgIHZhciBfaXRlcmF0b3JFcnJvcjMgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3IzID0gY29tcG9uZW50W1N5bWJvbC5pdGVyYXRvcl0oKSwgX3N0ZXAzOyAhKF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24zID0gKF9zdGVwMyA9IF9pdGVyYXRvcjMubmV4dCgpKS5kb25lKTsgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjMgPSB0cnVlKSB7XG4gICAgICAgICAgICB2YXIgbm9kZUlkID0gX3N0ZXAzLnZhbHVlO1xuXG4gICAgICAgICAgICB2YXIgcG9zQmVmb3JlID0gdm9pZCAwO1xuICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBcImhvcml6b250YWxcIikge1xuICAgICAgICAgICAgICBwb3NCZWZvcmUgPSBub2RlSW5kZXhlcy5oYXMobm9kZUlkKSA/IHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVJZCldIDogZHVtbXlQb3NpdGlvbnMuZ2V0KG5vZGVJZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwb3NCZWZvcmUgPSBub2RlSW5kZXhlcy5oYXMobm9kZUlkKSA/IHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVJZCldIDogZHVtbXlQb3NpdGlvbnMuZ2V0KG5vZGVJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgcG9zQWZ0ZXIgPSBwb3NpdGlvbk1hcC5nZXQobm9kZUlkKTtcbiAgICAgICAgICAgIGlmIChwb3NCZWZvcmUgPCBtaW5CZWZvcmUpIHtcbiAgICAgICAgICAgICAgbWluQmVmb3JlID0gcG9zQmVmb3JlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBvc0JlZm9yZSA+IG1heEJlZm9yZSkge1xuICAgICAgICAgICAgICBtYXhCZWZvcmUgPSBwb3NCZWZvcmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocG9zQWZ0ZXIgPCBtaW5BZnRlcikge1xuICAgICAgICAgICAgICBtaW5BZnRlciA9IHBvc0FmdGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBvc0FmdGVyID4gbWF4QWZ0ZXIpIHtcbiAgICAgICAgICAgICAgbWF4QWZ0ZXIgPSBwb3NBZnRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yMyA9IHRydWU7XG4gICAgICAgICAgX2l0ZXJhdG9yRXJyb3IzID0gZXJyO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIV9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24zICYmIF9pdGVyYXRvcjMucmV0dXJuKSB7XG4gICAgICAgICAgICAgIF9pdGVyYXRvcjMucmV0dXJuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmIChfZGlkSXRlcmF0b3JFcnJvcjMpIHtcbiAgICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3IzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBkaWZmID0gKG1pbkJlZm9yZSArIG1heEJlZm9yZSkgLyAyIC0gKG1pbkFmdGVyICsgbWF4QWZ0ZXIpIC8gMjtcblxuICAgICAgICB2YXIgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjQgPSB0cnVlO1xuICAgICAgICB2YXIgX2RpZEl0ZXJhdG9yRXJyb3I0ID0gZmFsc2U7XG4gICAgICAgIHZhciBfaXRlcmF0b3JFcnJvcjQgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3I0ID0gY29tcG9uZW50W1N5bWJvbC5pdGVyYXRvcl0oKSwgX3N0ZXA0OyAhKF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb240ID0gKF9zdGVwNCA9IF9pdGVyYXRvcjQubmV4dCgpKS5kb25lKTsgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjQgPSB0cnVlKSB7XG4gICAgICAgICAgICB2YXIgX25vZGVJZCA9IF9zdGVwNC52YWx1ZTtcblxuICAgICAgICAgICAgcG9zaXRpb25NYXAuc2V0KF9ub2RlSWQsIHBvc2l0aW9uTWFwLmdldChfbm9kZUlkKSArIGRpZmYpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3I0ID0gdHJ1ZTtcbiAgICAgICAgICBfaXRlcmF0b3JFcnJvcjQgPSBlcnI7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjQgJiYgX2l0ZXJhdG9yNC5yZXR1cm4pIHtcbiAgICAgICAgICAgICAgX2l0ZXJhdG9yNC5yZXR1cm4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgaWYgKF9kaWRJdGVyYXRvckVycm9yNCkge1xuICAgICAgICAgICAgICB0aHJvdyBfaXRlcmF0b3JFcnJvcjQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcG9zaXRpb25NYXA7XG4gIH07XG5cbiAgLy8gZmluZCB0cmFuc2Zvcm1hdGlvbiBiYXNlZCBvbiByZWwuIHBsYWNlbWVudCBjb25zdHJhaW50cyBpZiB0aGVyZSBhcmUgYm90aCBhbGlnbm1lbnQgYW5kIHJlbC4gcGxhY2VtZW50IGNvbnN0cmFpbnRzXG4gIC8vIG9yIGlmIHRoZXJlIGFyZSBvbmx5IHJlbC4gcGxhY2VtZW50IGNvbnRyYWludHMgd2hlcmUgdGhlIGxhcmdlc3QgY29tcG9uZW50IGlzbid0IHN1ZmZpY2llbnRseSBsYXJnZVxuICB2YXIgYXBwbHlSZWZsZWN0aW9uRm9yUmVsYXRpdmVQbGFjZW1lbnQgPSBmdW5jdGlvbiBhcHBseVJlZmxlY3Rpb25Gb3JSZWxhdGl2ZVBsYWNlbWVudChyZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnRzKSB7XG4gICAgLy8gdmFyaWFibGVzIHRvIGNvdW50IHZvdGVzXG4gICAgdmFyIHJlZmxlY3RPblkgPSAwLFxuICAgICAgICBub3RSZWZsZWN0T25ZID0gMDtcbiAgICB2YXIgcmVmbGVjdE9uWCA9IDAsXG4gICAgICAgIG5vdFJlZmxlY3RPblggPSAwO1xuXG4gICAgcmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50cy5mb3JFYWNoKGZ1bmN0aW9uIChjb25zdHJhaW50KSB7XG4gICAgICBpZiAoY29uc3RyYWludC5sZWZ0KSB7XG4gICAgICAgIHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KGNvbnN0cmFpbnQubGVmdCldIC0geENvb3Jkc1tub2RlSW5kZXhlcy5nZXQoY29uc3RyYWludC5yaWdodCldID49IDAgPyByZWZsZWN0T25ZKysgOiBub3RSZWZsZWN0T25ZKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB5Q29vcmRzW25vZGVJbmRleGVzLmdldChjb25zdHJhaW50LnRvcCldIC0geUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQoY29uc3RyYWludC5ib3R0b20pXSA+PSAwID8gcmVmbGVjdE9uWCsrIDogbm90UmVmbGVjdE9uWCsrO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHJlZmxlY3RPblkgPiBub3RSZWZsZWN0T25ZICYmIHJlZmxlY3RPblggPiBub3RSZWZsZWN0T25YKSB7XG4gICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbm9kZUluZGV4ZXMuc2l6ZTsgX2krKykge1xuICAgICAgICB4Q29vcmRzW19pXSA9IC0xICogeENvb3Jkc1tfaV07XG4gICAgICAgIHlDb29yZHNbX2ldID0gLTEgKiB5Q29vcmRzW19pXTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHJlZmxlY3RPblkgPiBub3RSZWZsZWN0T25ZKSB7XG4gICAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBub2RlSW5kZXhlcy5zaXplOyBfaTIrKykge1xuICAgICAgICB4Q29vcmRzW19pMl0gPSAtMSAqIHhDb29yZHNbX2kyXTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHJlZmxlY3RPblggPiBub3RSZWZsZWN0T25YKSB7XG4gICAgICBmb3IgKHZhciBfaTMgPSAwOyBfaTMgPCBub2RlSW5kZXhlcy5zaXplOyBfaTMrKykge1xuICAgICAgICB5Q29vcmRzW19pM10gPSAtMSAqIHlDb29yZHNbX2kzXTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLy8gZmluZCB3ZWFrbHkgY29ubmVjdGVkIGNvbXBvbmVudHMgaW4gdW5kaXJlY3RlZCBncmFwaFxuICB2YXIgZmluZENvbXBvbmVudHMgPSBmdW5jdGlvbiBmaW5kQ29tcG9uZW50cyhncmFwaCkge1xuICAgIC8vIGZpbmQgd2Vha2x5IGNvbm5lY3RlZCBjb21wb25lbnRzIGluIGRhZ1xuICAgIHZhciBjb21wb25lbnRzID0gW107XG4gICAgdmFyIHF1ZXVlID0gbmV3IExpbmtlZExpc3QoKTtcbiAgICB2YXIgdmlzaXRlZCA9IG5ldyBTZXQoKTtcbiAgICB2YXIgY291bnQgPSAwO1xuXG4gICAgZ3JhcGguZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgaWYgKCF2aXNpdGVkLmhhcyhrZXkpKSB7XG4gICAgICAgIGNvbXBvbmVudHNbY291bnRdID0gW107XG4gICAgICAgIHZhciBfY3VycmVudE5vZGUgPSBrZXk7XG4gICAgICAgIHF1ZXVlLnB1c2goX2N1cnJlbnROb2RlKTtcbiAgICAgICAgdmlzaXRlZC5hZGQoX2N1cnJlbnROb2RlKTtcbiAgICAgICAgY29tcG9uZW50c1tjb3VudF0ucHVzaChfY3VycmVudE5vZGUpO1xuXG4gICAgICAgIHdoaWxlIChxdWV1ZS5sZW5ndGggIT0gMCkge1xuICAgICAgICAgIF9jdXJyZW50Tm9kZSA9IHF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgdmFyIG5laWdoYm9ycyA9IGdyYXBoLmdldChfY3VycmVudE5vZGUpO1xuICAgICAgICAgIG5laWdoYm9ycy5mb3JFYWNoKGZ1bmN0aW9uIChuZWlnaGJvcikge1xuICAgICAgICAgICAgaWYgKCF2aXNpdGVkLmhhcyhuZWlnaGJvci5pZCkpIHtcbiAgICAgICAgICAgICAgcXVldWUucHVzaChuZWlnaGJvci5pZCk7XG4gICAgICAgICAgICAgIHZpc2l0ZWQuYWRkKG5laWdoYm9yLmlkKTtcbiAgICAgICAgICAgICAgY29tcG9uZW50c1tjb3VudF0ucHVzaChuZWlnaGJvci5pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY291bnQrKztcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY29tcG9uZW50cztcbiAgfTtcblxuICAvLyByZXR1cm4gdW5kaXJlY3RlZCB2ZXJzaW9uIG9mIGdpdmVuIGRhZ1xuICB2YXIgZGFnVG9VbmRpcmVjdGVkID0gZnVuY3Rpb24gZGFnVG9VbmRpcmVjdGVkKGRhZykge1xuICAgIHZhciB1bmRpcmVjdGVkID0gbmV3IE1hcCgpO1xuXG4gICAgZGFnLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgIHVuZGlyZWN0ZWQuc2V0KGtleSwgW10pO1xuICAgIH0pO1xuXG4gICAgZGFnLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24gKGFkamFjZW50KSB7XG4gICAgICAgIHVuZGlyZWN0ZWQuZ2V0KGtleSkucHVzaChhZGphY2VudCk7XG4gICAgICAgIHVuZGlyZWN0ZWQuZ2V0KGFkamFjZW50LmlkKS5wdXNoKHsgaWQ6IGtleSwgZ2FwOiBhZGphY2VudC5nYXAsIGRpcmVjdGlvbjogYWRqYWNlbnQuZGlyZWN0aW9uIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdW5kaXJlY3RlZDtcbiAgfTtcblxuICAvLyByZXR1cm4gcmV2ZXJzZWQgKGRpcmVjdGlvbnMgaW52ZXJ0ZWQpIHZlcnNpb24gb2YgZ2l2ZW4gZGFnXG4gIHZhciBkYWdUb1JldmVyc2VkID0gZnVuY3Rpb24gZGFnVG9SZXZlcnNlZChkYWcpIHtcbiAgICB2YXIgcmV2ZXJzZWQgPSBuZXcgTWFwKCk7XG5cbiAgICBkYWcuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgcmV2ZXJzZWQuc2V0KGtleSwgW10pO1xuICAgIH0pO1xuXG4gICAgZGFnLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24gKGFkamFjZW50KSB7XG4gICAgICAgIHJldmVyc2VkLmdldChhZGphY2VudC5pZCkucHVzaCh7IGlkOiBrZXksIGdhcDogYWRqYWNlbnQuZ2FwLCBkaXJlY3Rpb246IGFkamFjZW50LmRpcmVjdGlvbiB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJldmVyc2VkO1xuICB9O1xuXG4gIC8qKioqICBhcHBseSB0cmFuc2Zvcm1hdGlvbiB0byB0aGUgaW5pdGlhbCBkcmFmdCBsYXlvdXQgdG8gYmV0dGVyIGFsaWduIHdpdGggY29uc3RyYWluZWQgbm9kZXMgKioqKi9cbiAgLy8gc29sdmUgdGhlIE9ydGhvZ29uYWwgUHJvY3J1c3RlYW4gUHJvYmxlbSB0byByb3RhdGUgYW5kL29yIHJlZmxlY3QgaW5pdGlhbCBkcmFmdCBsYXlvdXRcbiAgLy8gaGVyZSB3ZSBmb2xsb3cgdGhlIHNvbHV0aW9uIGluIENoYXB0ZXIgMjAuMiBvZiBCb3JnLCBJLiAmIEdyb2VuZW4sIFAuICgyMDA1KSBNb2Rlcm4gTXVsdGlkaW1lbnNpb25hbCBTY2FsaW5nOiBUaGVvcnkgYW5kIEFwcGxpY2F0aW9ucyBcblxuICAvKiBjb25zdHJ1Y3Qgc291cmNlIGFuZCB0YXJnZXQgY29uZmlndXJhdGlvbnMgKi9cblxuICB2YXIgdGFyZ2V0TWF0cml4ID0gW107IC8vIEEgLSB0YXJnZXQgY29uZmlndXJhdGlvblxuICB2YXIgc291cmNlTWF0cml4ID0gW107IC8vIEIgLSBzb3VyY2UgY29uZmlndXJhdGlvbiBcbiAgdmFyIHN0YW5kYXJkVHJhbnNmb3JtYXRpb24gPSBmYWxzZTsgLy8gZmFsc2UgZm9yIG5vIHRyYW5zZm9ybWF0aW9uLCB0cnVlIGZvciBzdGFuZGFydCAoUHJvY3J1c3RlcykgdHJhbnNmb3JtYXRpb24gKHJvdGF0aW9uIGFuZC9vciByZWZsZWN0aW9uKVxuICB2YXIgcmVmbGVjdGlvblR5cGUgPSBmYWxzZTsgLy8gZmFsc2UvdHJ1ZSBmb3IgcmVmbGVjdGlvbiBjaGVjaywgJ3JlZmxlY3RPblgnLCAncmVmbGVjdE9uWScgb3IgJ3JlZmxlY3RPbkJvdGgnIGZvciByZWZsZWN0aW9uIHR5cGUgaWYgbmVjZXNzYXJ5XG4gIHZhciBmaXhlZE5vZGVzID0gbmV3IFNldCgpO1xuICB2YXIgZGFnID0gbmV3IE1hcCgpOyAvLyBhZGphY2VuY3kgbGlzdCB0byBrZWVwIGRpcmVjdGVkIGFjeWNsaWMgZ3JhcGggKGRhZykgdGhhdCBjb25zaXN0cyBvZiByZWxhdGl2ZSBwbGFjZW1lbnQgY29uc3RyYWludHNcbiAgdmFyIGRhZ1VuZGlyZWN0ZWQgPSBuZXcgTWFwKCk7IC8vIHVuZGlyZWN0ZWQgdmVyc2lvbiBvZiB0aGUgZGFnXG4gIHZhciBjb21wb25lbnRzID0gW107IC8vIHdlYWtseSBjb25uZWN0ZWQgY29tcG9uZW50c1xuXG4gIC8vIGZpbGwgZml4ZWROb2RlcyBjb2xsZWN0aW9uIHRvIHVzZSBsYXRlclxuICBpZiAoY29uc3RyYWludHMuZml4ZWROb2RlQ29uc3RyYWludCkge1xuICAgIGNvbnN0cmFpbnRzLmZpeGVkTm9kZUNvbnN0cmFpbnQuZm9yRWFjaChmdW5jdGlvbiAobm9kZURhdGEpIHtcbiAgICAgIGZpeGVkTm9kZXMuYWRkKG5vZGVEYXRhLm5vZGVJZCk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBjb25zdHJ1Y3QgZGFnIGZyb20gcmVsYXRpdmUgcGxhY2VtZW50IGNvbnN0cmFpbnRzIFxuICBpZiAoY29uc3RyYWludHMucmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50KSB7XG4gICAgLy8gY29uc3RydWN0IGJvdGggZGlyZWN0ZWQgYW5kIHVuZGlyZWN0ZWQgdmVyc2lvbiBvZiB0aGUgZGFnXG4gICAgY29uc3RyYWludHMucmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50LmZvckVhY2goZnVuY3Rpb24gKGNvbnN0cmFpbnQpIHtcbiAgICAgIGlmIChjb25zdHJhaW50LmxlZnQpIHtcbiAgICAgICAgaWYgKGRhZy5oYXMoY29uc3RyYWludC5sZWZ0KSkge1xuICAgICAgICAgIGRhZy5nZXQoY29uc3RyYWludC5sZWZ0KS5wdXNoKHsgaWQ6IGNvbnN0cmFpbnQucmlnaHQsIGdhcDogY29uc3RyYWludC5nYXAsIGRpcmVjdGlvbjogXCJob3Jpem9udGFsXCIgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGFnLnNldChjb25zdHJhaW50LmxlZnQsIFt7IGlkOiBjb25zdHJhaW50LnJpZ2h0LCBnYXA6IGNvbnN0cmFpbnQuZ2FwLCBkaXJlY3Rpb246IFwiaG9yaXpvbnRhbFwiIH1dKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWRhZy5oYXMoY29uc3RyYWludC5yaWdodCkpIHtcbiAgICAgICAgICBkYWcuc2V0KGNvbnN0cmFpbnQucmlnaHQsIFtdKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGRhZy5oYXMoY29uc3RyYWludC50b3ApKSB7XG4gICAgICAgICAgZGFnLmdldChjb25zdHJhaW50LnRvcCkucHVzaCh7IGlkOiBjb25zdHJhaW50LmJvdHRvbSwgZ2FwOiBjb25zdHJhaW50LmdhcCwgZGlyZWN0aW9uOiBcInZlcnRpY2FsXCIgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGFnLnNldChjb25zdHJhaW50LnRvcCwgW3sgaWQ6IGNvbnN0cmFpbnQuYm90dG9tLCBnYXA6IGNvbnN0cmFpbnQuZ2FwLCBkaXJlY3Rpb246IFwidmVydGljYWxcIiB9XSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFkYWcuaGFzKGNvbnN0cmFpbnQuYm90dG9tKSkge1xuICAgICAgICAgIGRhZy5zZXQoY29uc3RyYWludC5ib3R0b20sIFtdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZGFnVW5kaXJlY3RlZCA9IGRhZ1RvVW5kaXJlY3RlZChkYWcpO1xuICAgIGNvbXBvbmVudHMgPSBmaW5kQ29tcG9uZW50cyhkYWdVbmRpcmVjdGVkKTtcbiAgfVxuXG4gIGlmIChDb1NFQ29uc3RhbnRzLlRSQU5TRk9STV9PTl9DT05TVFJBSU5UX0hBTkRMSU5HKSB7XG4gICAgLy8gZmlyc3QgY2hlY2sgZml4ZWQgbm9kZSBjb25zdHJhaW50XG4gICAgaWYgKGNvbnN0cmFpbnRzLmZpeGVkTm9kZUNvbnN0cmFpbnQgJiYgY29uc3RyYWludHMuZml4ZWROb2RlQ29uc3RyYWludC5sZW5ndGggPiAxKSB7XG4gICAgICBjb25zdHJhaW50cy5maXhlZE5vZGVDb25zdHJhaW50LmZvckVhY2goZnVuY3Rpb24gKG5vZGVEYXRhLCBpKSB7XG4gICAgICAgIHRhcmdldE1hdHJpeFtpXSA9IFtub2RlRGF0YS5wb3NpdGlvbi54LCBub2RlRGF0YS5wb3NpdGlvbi55XTtcbiAgICAgICAgc291cmNlTWF0cml4W2ldID0gW3hDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVEYXRhLm5vZGVJZCldLCB5Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlRGF0YS5ub2RlSWQpXV07XG4gICAgICB9KTtcbiAgICAgIHN0YW5kYXJkVHJhbnNmb3JtYXRpb24gPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludCkge1xuICAgICAgKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gdGhlbiBjaGVjayBhbGlnbm1lbnQgY29uc3RyYWludFxuICAgICAgICB2YXIgY291bnQgPSAwO1xuICAgICAgICBpZiAoY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludC52ZXJ0aWNhbCkge1xuICAgICAgICAgIHZhciB2ZXJ0aWNhbEFsaWduID0gY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludC52ZXJ0aWNhbDtcblxuICAgICAgICAgIHZhciBfbG9vcDIgPSBmdW5jdGlvbiBfbG9vcDIoX2k0KSB7XG4gICAgICAgICAgICB2YXIgYWxpZ25tZW50U2V0ID0gbmV3IFNldCgpO1xuICAgICAgICAgICAgdmVydGljYWxBbGlnbltfaTRdLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgICBhbGlnbm1lbnRTZXQuYWRkKG5vZGVJZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHZhciBpbnRlcnNlY3Rpb24gPSBuZXcgU2V0KFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoYWxpZ25tZW50U2V0KSkuZmlsdGVyKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICAgIHJldHVybiBmaXhlZE5vZGVzLmhhcyh4KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIHZhciB4UG9zID0gdm9pZCAwO1xuICAgICAgICAgICAgaWYgKGludGVyc2VjdGlvbi5zaXplID4gMCkgeFBvcyA9IHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KGludGVyc2VjdGlvbi52YWx1ZXMoKS5uZXh0KCkudmFsdWUpXTtlbHNlIHhQb3MgPSBjYWxjdWxhdGVBdmdQb3NpdGlvbihhbGlnbm1lbnRTZXQpLng7XG5cbiAgICAgICAgICAgIHZlcnRpY2FsQWxpZ25bX2k0XS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgICAgdGFyZ2V0TWF0cml4W2NvdW50XSA9IFt4UG9zLCB5Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlSWQpXV07XG4gICAgICAgICAgICAgIHNvdXJjZU1hdHJpeFtjb3VudF0gPSBbeENvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZUlkKV0sIHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVJZCldXTtcbiAgICAgICAgICAgICAgY291bnQrKztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBmb3IgKHZhciBfaTQgPSAwOyBfaTQgPCB2ZXJ0aWNhbEFsaWduLmxlbmd0aDsgX2k0KyspIHtcbiAgICAgICAgICAgIF9sb29wMihfaTQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdGFuZGFyZFRyYW5zZm9ybWF0aW9uID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludC5ob3Jpem9udGFsKSB7XG4gICAgICAgICAgdmFyIGhvcml6b250YWxBbGlnbiA9IGNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQuaG9yaXpvbnRhbDtcblxuICAgICAgICAgIHZhciBfbG9vcDMgPSBmdW5jdGlvbiBfbG9vcDMoX2k1KSB7XG4gICAgICAgICAgICB2YXIgYWxpZ25tZW50U2V0ID0gbmV3IFNldCgpO1xuICAgICAgICAgICAgaG9yaXpvbnRhbEFsaWduW19pNV0uZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICAgIGFsaWdubWVudFNldC5hZGQobm9kZUlkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdmFyIGludGVyc2VjdGlvbiA9IG5ldyBTZXQoW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShhbGlnbm1lbnRTZXQpKS5maWx0ZXIoZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZpeGVkTm9kZXMuaGFzKHgpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgdmFyIHlQb3MgPSB2b2lkIDA7XG4gICAgICAgICAgICBpZiAoaW50ZXJzZWN0aW9uLnNpemUgPiAwKSB5UG9zID0geENvb3Jkc1tub2RlSW5kZXhlcy5nZXQoaW50ZXJzZWN0aW9uLnZhbHVlcygpLm5leHQoKS52YWx1ZSldO2Vsc2UgeVBvcyA9IGNhbGN1bGF0ZUF2Z1Bvc2l0aW9uKGFsaWdubWVudFNldCkueTtcblxuICAgICAgICAgICAgaG9yaXpvbnRhbEFsaWduW19pNV0uZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICAgIHRhcmdldE1hdHJpeFtjb3VudF0gPSBbeENvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZUlkKV0sIHlQb3NdO1xuICAgICAgICAgICAgICBzb3VyY2VNYXRyaXhbY291bnRdID0gW3hDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVJZCldLCB5Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlSWQpXV07XG4gICAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgZm9yICh2YXIgX2k1ID0gMDsgX2k1IDwgaG9yaXpvbnRhbEFsaWduLmxlbmd0aDsgX2k1KyspIHtcbiAgICAgICAgICAgIF9sb29wMyhfaTUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdGFuZGFyZFRyYW5zZm9ybWF0aW9uID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uc3RyYWludHMucmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50KSB7XG4gICAgICAgICAgcmVmbGVjdGlvblR5cGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KSgpO1xuICAgIH0gZWxzZSBpZiAoY29uc3RyYWludHMucmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50KSB7XG4gICAgICAvLyBmaW5hbGx5IGNoZWNrIHJlbGF0aXZlIHBsYWNlbWVudCBjb25zdHJhaW50XG4gICAgICAvLyBmaW5kIGxhcmdlc3QgY29tcG9uZW50IGluIGRhZ1xuICAgICAgdmFyIGxhcmdlc3RDb21wb25lbnRTaXplID0gMDtcbiAgICAgIHZhciBsYXJnZXN0Q29tcG9uZW50SW5kZXggPSAwO1xuICAgICAgZm9yICh2YXIgX2k2ID0gMDsgX2k2IDwgY29tcG9uZW50cy5sZW5ndGg7IF9pNisrKSB7XG4gICAgICAgIGlmIChjb21wb25lbnRzW19pNl0ubGVuZ3RoID4gbGFyZ2VzdENvbXBvbmVudFNpemUpIHtcbiAgICAgICAgICBsYXJnZXN0Q29tcG9uZW50U2l6ZSA9IGNvbXBvbmVudHNbX2k2XS5sZW5ndGg7XG4gICAgICAgICAgbGFyZ2VzdENvbXBvbmVudEluZGV4ID0gX2k2O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBpZiBsYXJnZXN0IGNvbXBvbmVudCBpc24ndCBkb21pbmFudCwgdGhlbiB0YWtlIHRoZSB2b3RlcyBmb3IgcmVmbGVjdGlvblxuICAgICAgaWYgKGxhcmdlc3RDb21wb25lbnRTaXplIDwgZGFnVW5kaXJlY3RlZC5zaXplIC8gMikge1xuICAgICAgICBhcHBseVJlZmxlY3Rpb25Gb3JSZWxhdGl2ZVBsYWNlbWVudChjb25zdHJhaW50cy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQpO1xuICAgICAgICBzdGFuZGFyZFRyYW5zZm9ybWF0aW9uID0gZmFsc2U7XG4gICAgICAgIHJlZmxlY3Rpb25UeXBlID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB1c2UgbGFyZ2VzdCBjb21wb25lbnQgZm9yIHRyYW5zZm9ybWF0aW9uXG4gICAgICAgIC8vIGNvbnN0cnVjdCBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBzdWJncmFwaHMgaW4gdGhlIGxhcmdlc3QgY29tcG9uZW50XG4gICAgICAgIHZhciBzdWJHcmFwaE9uSG9yaXpvbnRhbCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdmFyIHN1YkdyYXBoT25WZXJ0aWNhbCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdmFyIGNvbnN0cmFpbnRzSW5sYXJnZXN0Q29tcG9uZW50ID0gW107XG5cbiAgICAgICAgY29tcG9uZW50c1tsYXJnZXN0Q29tcG9uZW50SW5kZXhdLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgIGRhZy5nZXQobm9kZUlkKS5mb3JFYWNoKGZ1bmN0aW9uIChhZGphY2VudCkge1xuICAgICAgICAgICAgaWYgKGFkamFjZW50LmRpcmVjdGlvbiA9PSBcImhvcml6b250YWxcIikge1xuICAgICAgICAgICAgICBpZiAoc3ViR3JhcGhPbkhvcml6b250YWwuaGFzKG5vZGVJZCkpIHtcbiAgICAgICAgICAgICAgICBzdWJHcmFwaE9uSG9yaXpvbnRhbC5nZXQobm9kZUlkKS5wdXNoKGFkamFjZW50KTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdWJHcmFwaE9uSG9yaXpvbnRhbC5zZXQobm9kZUlkLCBbYWRqYWNlbnRdKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoIXN1YkdyYXBoT25Ib3Jpem9udGFsLmhhcyhhZGphY2VudC5pZCkpIHtcbiAgICAgICAgICAgICAgICBzdWJHcmFwaE9uSG9yaXpvbnRhbC5zZXQoYWRqYWNlbnQuaWQsIFtdKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdHJhaW50c0lubGFyZ2VzdENvbXBvbmVudC5wdXNoKHsgbGVmdDogbm9kZUlkLCByaWdodDogYWRqYWNlbnQuaWQgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAoc3ViR3JhcGhPblZlcnRpY2FsLmhhcyhub2RlSWQpKSB7XG4gICAgICAgICAgICAgICAgc3ViR3JhcGhPblZlcnRpY2FsLmdldChub2RlSWQpLnB1c2goYWRqYWNlbnQpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHN1YkdyYXBoT25WZXJ0aWNhbC5zZXQobm9kZUlkLCBbYWRqYWNlbnRdKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoIXN1YkdyYXBoT25WZXJ0aWNhbC5oYXMoYWRqYWNlbnQuaWQpKSB7XG4gICAgICAgICAgICAgICAgc3ViR3JhcGhPblZlcnRpY2FsLnNldChhZGphY2VudC5pZCwgW10pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0cmFpbnRzSW5sYXJnZXN0Q29tcG9uZW50LnB1c2goeyB0b3A6IG5vZGVJZCwgYm90dG9tOiBhZGphY2VudC5pZCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXBwbHlSZWZsZWN0aW9uRm9yUmVsYXRpdmVQbGFjZW1lbnQoY29uc3RyYWludHNJbmxhcmdlc3RDb21wb25lbnQpO1xuICAgICAgICByZWZsZWN0aW9uVHlwZSA9IGZhbHNlO1xuXG4gICAgICAgIC8vIGNhbGN1bGF0ZSBhcHByb3ByaWF0ZSBwb3NpdGlvbmluZyBmb3Igc3ViZ3JhcGhzXG4gICAgICAgIHZhciBwb3NpdGlvbk1hcEhvcml6b250YWwgPSBmaW5kQXBwcm9wcmlhdGVQb3NpdGlvbkZvclJlbGF0aXZlUGxhY2VtZW50KHN1YkdyYXBoT25Ib3Jpem9udGFsLCBcImhvcml6b250YWxcIik7XG4gICAgICAgIHZhciBwb3NpdGlvbk1hcFZlcnRpY2FsID0gZmluZEFwcHJvcHJpYXRlUG9zaXRpb25Gb3JSZWxhdGl2ZVBsYWNlbWVudChzdWJHcmFwaE9uVmVydGljYWwsIFwidmVydGljYWxcIik7XG5cbiAgICAgICAgLy8gY29uc3RydWN0IHNvdXJjZSBhbmQgdGFyZ2V0IGNvbmZpZ3VyYXRpb25cbiAgICAgICAgY29tcG9uZW50c1tsYXJnZXN0Q29tcG9uZW50SW5kZXhdLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCwgaSkge1xuICAgICAgICAgIHNvdXJjZU1hdHJpeFtpXSA9IFt4Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlSWQpXSwgeUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZUlkKV1dO1xuICAgICAgICAgIHRhcmdldE1hdHJpeFtpXSA9IFtdO1xuICAgICAgICAgIGlmIChwb3NpdGlvbk1hcEhvcml6b250YWwuaGFzKG5vZGVJZCkpIHtcbiAgICAgICAgICAgIHRhcmdldE1hdHJpeFtpXVswXSA9IHBvc2l0aW9uTWFwSG9yaXpvbnRhbC5nZXQobm9kZUlkKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGFyZ2V0TWF0cml4W2ldWzBdID0geENvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZUlkKV07XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwb3NpdGlvbk1hcFZlcnRpY2FsLmhhcyhub2RlSWQpKSB7XG4gICAgICAgICAgICB0YXJnZXRNYXRyaXhbaV1bMV0gPSBwb3NpdGlvbk1hcFZlcnRpY2FsLmdldChub2RlSWQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXRNYXRyaXhbaV1bMV0gPSB5Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlSWQpXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHN0YW5kYXJkVHJhbnNmb3JtYXRpb24gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGlmIHRyYW5zZm9ybWF0aW9uIGlzIHJlcXVpcmVkLCB0aGVuIGNhbGN1bGF0ZSBhbmQgYXBwbHkgdHJhbnNmb3JtYXRpb24gbWF0cml4XG4gICAgaWYgKHN0YW5kYXJkVHJhbnNmb3JtYXRpb24pIHtcbiAgICAgIC8qIGNhbGN1bGF0ZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggKi9cbiAgICAgIHZhciB0cmFuc2Zvcm1hdGlvbk1hdHJpeCA9IHZvaWQgMDtcbiAgICAgIHZhciB0YXJnZXRNYXRyaXhUcmFuc3Bvc2UgPSBNYXRyaXgudHJhbnNwb3NlKHRhcmdldE1hdHJpeCk7IC8vIEEnXG4gICAgICB2YXIgc291cmNlTWF0cml4VHJhbnNwb3NlID0gTWF0cml4LnRyYW5zcG9zZShzb3VyY2VNYXRyaXgpOyAvLyBCJ1xuXG4gICAgICAvLyBjZW50cmFsaXplIHRyYW5zcG9zZSBtYXRyaWNlc1xuICAgICAgZm9yICh2YXIgX2k3ID0gMDsgX2k3IDwgdGFyZ2V0TWF0cml4VHJhbnNwb3NlLmxlbmd0aDsgX2k3KyspIHtcbiAgICAgICAgdGFyZ2V0TWF0cml4VHJhbnNwb3NlW19pN10gPSBNYXRyaXgubXVsdEdhbW1hKHRhcmdldE1hdHJpeFRyYW5zcG9zZVtfaTddKTtcbiAgICAgICAgc291cmNlTWF0cml4VHJhbnNwb3NlW19pN10gPSBNYXRyaXgubXVsdEdhbW1hKHNvdXJjZU1hdHJpeFRyYW5zcG9zZVtfaTddKTtcbiAgICAgIH1cblxuICAgICAgLy8gZG8gYWN0dWFsIGNhbGN1bGF0aW9uIGZvciB0cmFuc2Zvcm1hdGlvbiBtYXRyaXhcbiAgICAgIHZhciB0ZW1wTWF0cml4ID0gTWF0cml4Lm11bHRNYXQodGFyZ2V0TWF0cml4VHJhbnNwb3NlLCBNYXRyaXgudHJhbnNwb3NlKHNvdXJjZU1hdHJpeFRyYW5zcG9zZSkpOyAvLyB0ZW1wTWF0cml4ID0gQSdCXG4gICAgICB2YXIgU1ZEUmVzdWx0ID0gU1ZELnN2ZCh0ZW1wTWF0cml4KTsgLy8gU1ZEKEEnQikgPSBVU1YnLCBzdmQgZnVuY3Rpb24gcmV0dXJucyBVLCBTIGFuZCBWIFxuICAgICAgdHJhbnNmb3JtYXRpb25NYXRyaXggPSBNYXRyaXgubXVsdE1hdChTVkRSZXN1bHQuViwgTWF0cml4LnRyYW5zcG9zZShTVkRSZXN1bHQuVSkpOyAvLyB0cmFuc2Zvcm1hdGlvbk1hdHJpeCA9IFQgPSBWVSdcblxuICAgICAgLyogYXBwbHkgZm91bmQgdHJhbnNmb3JtYXRpb24gbWF0cml4IHRvIG9idGFpbiBmaW5hbCBkcmFmdCBsYXlvdXQgKi9cbiAgICAgIGZvciAodmFyIF9pOCA9IDA7IF9pOCA8IG5vZGVJbmRleGVzLnNpemU7IF9pOCsrKSB7XG4gICAgICAgIHZhciB0ZW1wMSA9IFt4Q29vcmRzW19pOF0sIHlDb29yZHNbX2k4XV07XG4gICAgICAgIHZhciB0ZW1wMiA9IFt0cmFuc2Zvcm1hdGlvbk1hdHJpeFswXVswXSwgdHJhbnNmb3JtYXRpb25NYXRyaXhbMV1bMF1dO1xuICAgICAgICB2YXIgdGVtcDMgPSBbdHJhbnNmb3JtYXRpb25NYXRyaXhbMF1bMV0sIHRyYW5zZm9ybWF0aW9uTWF0cml4WzFdWzFdXTtcbiAgICAgICAgeENvb3Jkc1tfaThdID0gTWF0cml4LmRvdFByb2R1Y3QodGVtcDEsIHRlbXAyKTtcbiAgICAgICAgeUNvb3Jkc1tfaThdID0gTWF0cml4LmRvdFByb2R1Y3QodGVtcDEsIHRlbXAzKTtcbiAgICAgIH1cblxuICAgICAgLy8gYXBwbGllZCBvbmx5IGJvdGggYWxpZ25tZW50IGFuZCByZWwuIHBsYWNlbWVudCBjb25zdHJhaW50cyBleGlzdFxuICAgICAgaWYgKHJlZmxlY3Rpb25UeXBlKSB7XG4gICAgICAgIGFwcGx5UmVmbGVjdGlvbkZvclJlbGF0aXZlUGxhY2VtZW50KGNvbnN0cmFpbnRzLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKENvU0VDb25zdGFudHMuRU5GT1JDRV9DT05TVFJBSU5UUykge1xuICAgIC8qKioqICBlbmZvcmNlIGNvbnN0cmFpbnRzIG9uIHRoZSB0cmFuc2Zvcm1lZCBkcmFmdCBsYXlvdXQgKioqKi9cblxuICAgIC8qIGZpcnN0IGVuZm9yY2UgZml4ZWQgbm9kZSBjb25zdHJhaW50ICovXG5cbiAgICBpZiAoY29uc3RyYWludHMuZml4ZWROb2RlQ29uc3RyYWludCAmJiBjb25zdHJhaW50cy5maXhlZE5vZGVDb25zdHJhaW50Lmxlbmd0aCA+IDApIHtcbiAgICAgIHZhciB0cmFuc2xhdGlvbkFtb3VudCA9IHsgeDogMCwgeTogMCB9O1xuICAgICAgY29uc3RyYWludHMuZml4ZWROb2RlQ29uc3RyYWludC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlRGF0YSwgaSkge1xuICAgICAgICB2YXIgcG9zSW5UaGVvcnkgPSB7IHg6IHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVEYXRhLm5vZGVJZCldLCB5OiB5Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlRGF0YS5ub2RlSWQpXSB9O1xuICAgICAgICB2YXIgcG9zRGVzaXJlZCA9IG5vZGVEYXRhLnBvc2l0aW9uO1xuICAgICAgICB2YXIgcG9zRGlmZiA9IGNhbGN1bGF0ZVBvc2l0aW9uRGlmZihwb3NEZXNpcmVkLCBwb3NJblRoZW9yeSk7XG4gICAgICAgIHRyYW5zbGF0aW9uQW1vdW50LnggKz0gcG9zRGlmZi54O1xuICAgICAgICB0cmFuc2xhdGlvbkFtb3VudC55ICs9IHBvc0RpZmYueTtcbiAgICAgIH0pO1xuICAgICAgdHJhbnNsYXRpb25BbW91bnQueCAvPSBjb25zdHJhaW50cy5maXhlZE5vZGVDb25zdHJhaW50Lmxlbmd0aDtcbiAgICAgIHRyYW5zbGF0aW9uQW1vdW50LnkgLz0gY29uc3RyYWludHMuZml4ZWROb2RlQ29uc3RyYWludC5sZW5ndGg7XG5cbiAgICAgIHhDb29yZHMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGkpIHtcbiAgICAgICAgeENvb3Jkc1tpXSArPSB0cmFuc2xhdGlvbkFtb3VudC54O1xuICAgICAgfSk7XG5cbiAgICAgIHlDb29yZHMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGkpIHtcbiAgICAgICAgeUNvb3Jkc1tpXSArPSB0cmFuc2xhdGlvbkFtb3VudC55O1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0cmFpbnRzLmZpeGVkTm9kZUNvbnN0cmFpbnQuZm9yRWFjaChmdW5jdGlvbiAobm9kZURhdGEpIHtcbiAgICAgICAgeENvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZURhdGEubm9kZUlkKV0gPSBub2RlRGF0YS5wb3NpdGlvbi54O1xuICAgICAgICB5Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlRGF0YS5ub2RlSWQpXSA9IG5vZGVEYXRhLnBvc2l0aW9uLnk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiB0aGVuIGVuZm9yY2UgYWxpZ25tZW50IGNvbnN0cmFpbnQgKi9cblxuICAgIGlmIChjb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50KSB7XG4gICAgICBpZiAoY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludC52ZXJ0aWNhbCkge1xuICAgICAgICB2YXIgeEFsaWduID0gY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludC52ZXJ0aWNhbDtcblxuICAgICAgICB2YXIgX2xvb3A0ID0gZnVuY3Rpb24gX2xvb3A0KF9pOSkge1xuICAgICAgICAgIHZhciBhbGlnbm1lbnRTZXQgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgeEFsaWduW19pOV0uZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICBhbGlnbm1lbnRTZXQuYWRkKG5vZGVJZCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdmFyIGludGVyc2VjdGlvbiA9IG5ldyBTZXQoW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShhbGlnbm1lbnRTZXQpKS5maWx0ZXIoZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgIHJldHVybiBmaXhlZE5vZGVzLmhhcyh4KTtcbiAgICAgICAgICB9KSk7XG4gICAgICAgICAgdmFyIHhQb3MgPSB2b2lkIDA7XG4gICAgICAgICAgaWYgKGludGVyc2VjdGlvbi5zaXplID4gMCkgeFBvcyA9IHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KGludGVyc2VjdGlvbi52YWx1ZXMoKS5uZXh0KCkudmFsdWUpXTtlbHNlIHhQb3MgPSBjYWxjdWxhdGVBdmdQb3NpdGlvbihhbGlnbm1lbnRTZXQpLng7XG5cbiAgICAgICAgICBhbGlnbm1lbnRTZXQuZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICBpZiAoIWZpeGVkTm9kZXMuaGFzKG5vZGVJZCkpIHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVJZCldID0geFBvcztcbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBmb3IgKHZhciBfaTkgPSAwOyBfaTkgPCB4QWxpZ24ubGVuZ3RoOyBfaTkrKykge1xuICAgICAgICAgIF9sb29wNChfaTkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludC5ob3Jpem9udGFsKSB7XG4gICAgICAgIHZhciB5QWxpZ24gPSBjb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50Lmhvcml6b250YWw7XG5cbiAgICAgICAgdmFyIF9sb29wNSA9IGZ1bmN0aW9uIF9sb29wNShfaTEwKSB7XG4gICAgICAgICAgdmFyIGFsaWdubWVudFNldCA9IG5ldyBTZXQoKTtcbiAgICAgICAgICB5QWxpZ25bX2kxMF0uZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICBhbGlnbm1lbnRTZXQuYWRkKG5vZGVJZCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdmFyIGludGVyc2VjdGlvbiA9IG5ldyBTZXQoW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShhbGlnbm1lbnRTZXQpKS5maWx0ZXIoZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgIHJldHVybiBmaXhlZE5vZGVzLmhhcyh4KTtcbiAgICAgICAgICB9KSk7XG4gICAgICAgICAgdmFyIHlQb3MgPSB2b2lkIDA7XG4gICAgICAgICAgaWYgKGludGVyc2VjdGlvbi5zaXplID4gMCkgeVBvcyA9IHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KGludGVyc2VjdGlvbi52YWx1ZXMoKS5uZXh0KCkudmFsdWUpXTtlbHNlIHlQb3MgPSBjYWxjdWxhdGVBdmdQb3NpdGlvbihhbGlnbm1lbnRTZXQpLnk7XG5cbiAgICAgICAgICBhbGlnbm1lbnRTZXQuZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICBpZiAoIWZpeGVkTm9kZXMuaGFzKG5vZGVJZCkpIHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVJZCldID0geVBvcztcbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBmb3IgKHZhciBfaTEwID0gMDsgX2kxMCA8IHlBbGlnbi5sZW5ndGg7IF9pMTArKykge1xuICAgICAgICAgIF9sb29wNShfaTEwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qIGZpbmFsbHkgZW5mb3JjZSByZWxhdGl2ZSBwbGFjZW1lbnQgY29uc3RyYWludCAqL1xuXG4gICAgaWYgKGNvbnN0cmFpbnRzLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludCkge1xuICAgICAgKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG5vZGVUb0R1bW15Rm9yVmVydGljYWxBbGlnbm1lbnQgPSBuZXcgTWFwKCk7XG4gICAgICAgIHZhciBub2RlVG9EdW1teUZvckhvcml6b250YWxBbGlnbm1lbnQgPSBuZXcgTWFwKCk7XG4gICAgICAgIHZhciBkdW1teVRvTm9kZUZvclZlcnRpY2FsQWxpZ25tZW50ID0gbmV3IE1hcCgpO1xuICAgICAgICB2YXIgZHVtbXlUb05vZGVGb3JIb3Jpem9udGFsQWxpZ25tZW50ID0gbmV3IE1hcCgpO1xuICAgICAgICB2YXIgZHVtbXlQb3NpdGlvbnNGb3JWZXJ0aWNhbEFsaWdubWVudCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdmFyIGR1bW15UG9zaXRpb25zRm9ySG9yaXpvbnRhbEFsaWdubWVudCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdmFyIGZpeGVkTm9kZXNPbkhvcml6b250YWwgPSBuZXcgU2V0KCk7XG4gICAgICAgIHZhciBmaXhlZE5vZGVzT25WZXJ0aWNhbCA9IG5ldyBTZXQoKTtcblxuICAgICAgICAvLyBmaWxsIG1hcHMgYW5kIHNldHMgICAgICBcbiAgICAgICAgZml4ZWROb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICBmaXhlZE5vZGVzT25Ib3Jpem9udGFsLmFkZChub2RlSWQpO1xuICAgICAgICAgIGZpeGVkTm9kZXNPblZlcnRpY2FsLmFkZChub2RlSWQpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludCkge1xuICAgICAgICAgIGlmIChjb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50LnZlcnRpY2FsKSB7XG4gICAgICAgICAgICB2YXIgdmVydGljYWxBbGlnbm1lbnQgPSBjb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50LnZlcnRpY2FsO1xuXG4gICAgICAgICAgICB2YXIgX2xvb3A2ID0gZnVuY3Rpb24gX2xvb3A2KF9pMTEpIHtcbiAgICAgICAgICAgICAgZHVtbXlUb05vZGVGb3JWZXJ0aWNhbEFsaWdubWVudC5zZXQoXCJkdW1teVwiICsgX2kxMSwgW10pO1xuICAgICAgICAgICAgICB2ZXJ0aWNhbEFsaWdubWVudFtfaTExXS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgICAgICBub2RlVG9EdW1teUZvclZlcnRpY2FsQWxpZ25tZW50LnNldChub2RlSWQsIFwiZHVtbXlcIiArIF9pMTEpO1xuICAgICAgICAgICAgICAgIGR1bW15VG9Ob2RlRm9yVmVydGljYWxBbGlnbm1lbnQuZ2V0KFwiZHVtbXlcIiArIF9pMTEpLnB1c2gobm9kZUlkKTtcbiAgICAgICAgICAgICAgICBpZiAoZml4ZWROb2Rlcy5oYXMobm9kZUlkKSkge1xuICAgICAgICAgICAgICAgICAgZml4ZWROb2Rlc09uSG9yaXpvbnRhbC5hZGQoXCJkdW1teVwiICsgX2kxMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgZHVtbXlQb3NpdGlvbnNGb3JWZXJ0aWNhbEFsaWdubWVudC5zZXQoXCJkdW1teVwiICsgX2kxMSwgeENvb3Jkc1tub2RlSW5kZXhlcy5nZXQodmVydGljYWxBbGlnbm1lbnRbX2kxMV1bMF0pXSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBmb3IgKHZhciBfaTExID0gMDsgX2kxMSA8IHZlcnRpY2FsQWxpZ25tZW50Lmxlbmd0aDsgX2kxMSsrKSB7XG4gICAgICAgICAgICAgIF9sb29wNihfaTExKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQuaG9yaXpvbnRhbCkge1xuICAgICAgICAgICAgdmFyIGhvcml6b250YWxBbGlnbm1lbnQgPSBjb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50Lmhvcml6b250YWw7XG5cbiAgICAgICAgICAgIHZhciBfbG9vcDcgPSBmdW5jdGlvbiBfbG9vcDcoX2kxMikge1xuICAgICAgICAgICAgICBkdW1teVRvTm9kZUZvckhvcml6b250YWxBbGlnbm1lbnQuc2V0KFwiZHVtbXlcIiArIF9pMTIsIFtdKTtcbiAgICAgICAgICAgICAgaG9yaXpvbnRhbEFsaWdubWVudFtfaTEyXS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgICAgICBub2RlVG9EdW1teUZvckhvcml6b250YWxBbGlnbm1lbnQuc2V0KG5vZGVJZCwgXCJkdW1teVwiICsgX2kxMik7XG4gICAgICAgICAgICAgICAgZHVtbXlUb05vZGVGb3JIb3Jpem9udGFsQWxpZ25tZW50LmdldChcImR1bW15XCIgKyBfaTEyKS5wdXNoKG5vZGVJZCk7XG4gICAgICAgICAgICAgICAgaWYgKGZpeGVkTm9kZXMuaGFzKG5vZGVJZCkpIHtcbiAgICAgICAgICAgICAgICAgIGZpeGVkTm9kZXNPblZlcnRpY2FsLmFkZChcImR1bW15XCIgKyBfaTEyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBkdW1teVBvc2l0aW9uc0Zvckhvcml6b250YWxBbGlnbm1lbnQuc2V0KFwiZHVtbXlcIiArIF9pMTIsIHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KGhvcml6b250YWxBbGlnbm1lbnRbX2kxMl1bMF0pXSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBmb3IgKHZhciBfaTEyID0gMDsgX2kxMiA8IGhvcml6b250YWxBbGlnbm1lbnQubGVuZ3RoOyBfaTEyKyspIHtcbiAgICAgICAgICAgICAgX2xvb3A3KF9pMTIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNvbnN0cnVjdCBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBkYWdzIChzdWJncmFwaHMpIGZyb20gb3ZlcmFsbCBkYWdcbiAgICAgICAgdmFyIGRhZ09uSG9yaXpvbnRhbCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdmFyIGRhZ09uVmVydGljYWwgPSBuZXcgTWFwKCk7XG5cbiAgICAgICAgdmFyIF9sb29wOCA9IGZ1bmN0aW9uIF9sb29wOChub2RlSWQpIHtcbiAgICAgICAgICBkYWcuZ2V0KG5vZGVJZCkuZm9yRWFjaChmdW5jdGlvbiAoYWRqYWNlbnQpIHtcbiAgICAgICAgICAgIHZhciBzb3VyY2VJZCA9IHZvaWQgMDtcbiAgICAgICAgICAgIHZhciB0YXJnZXROb2RlID0gdm9pZCAwO1xuICAgICAgICAgICAgaWYgKGFkamFjZW50W1wiZGlyZWN0aW9uXCJdID09IFwiaG9yaXpvbnRhbFwiKSB7XG4gICAgICAgICAgICAgIHNvdXJjZUlkID0gbm9kZVRvRHVtbXlGb3JWZXJ0aWNhbEFsaWdubWVudC5nZXQobm9kZUlkKSA/IG5vZGVUb0R1bW15Rm9yVmVydGljYWxBbGlnbm1lbnQuZ2V0KG5vZGVJZCkgOiBub2RlSWQ7XG4gICAgICAgICAgICAgIGlmIChub2RlVG9EdW1teUZvclZlcnRpY2FsQWxpZ25tZW50LmdldChhZGphY2VudC5pZCkpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXROb2RlID0geyBpZDogbm9kZVRvRHVtbXlGb3JWZXJ0aWNhbEFsaWdubWVudC5nZXQoYWRqYWNlbnQuaWQpLCBnYXA6IGFkamFjZW50LmdhcCwgZGlyZWN0aW9uOiBhZGphY2VudC5kaXJlY3Rpb24gfTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YXJnZXROb2RlID0gYWRqYWNlbnQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGRhZ09uSG9yaXpvbnRhbC5oYXMoc291cmNlSWQpKSB7XG4gICAgICAgICAgICAgICAgZGFnT25Ib3Jpem9udGFsLmdldChzb3VyY2VJZCkucHVzaCh0YXJnZXROb2RlKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkYWdPbkhvcml6b250YWwuc2V0KHNvdXJjZUlkLCBbdGFyZ2V0Tm9kZV0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICghZGFnT25Ib3Jpem9udGFsLmhhcyh0YXJnZXROb2RlLmlkKSkge1xuICAgICAgICAgICAgICAgIGRhZ09uSG9yaXpvbnRhbC5zZXQodGFyZ2V0Tm9kZS5pZCwgW10pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzb3VyY2VJZCA9IG5vZGVUb0R1bW15Rm9ySG9yaXpvbnRhbEFsaWdubWVudC5nZXQobm9kZUlkKSA/IG5vZGVUb0R1bW15Rm9ySG9yaXpvbnRhbEFsaWdubWVudC5nZXQobm9kZUlkKSA6IG5vZGVJZDtcbiAgICAgICAgICAgICAgaWYgKG5vZGVUb0R1bW15Rm9ySG9yaXpvbnRhbEFsaWdubWVudC5nZXQoYWRqYWNlbnQuaWQpKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0Tm9kZSA9IHsgaWQ6IG5vZGVUb0R1bW15Rm9ySG9yaXpvbnRhbEFsaWdubWVudC5nZXQoYWRqYWNlbnQuaWQpLCBnYXA6IGFkamFjZW50LmdhcCwgZGlyZWN0aW9uOiBhZGphY2VudC5kaXJlY3Rpb24gfTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YXJnZXROb2RlID0gYWRqYWNlbnQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGRhZ09uVmVydGljYWwuaGFzKHNvdXJjZUlkKSkge1xuICAgICAgICAgICAgICAgIGRhZ09uVmVydGljYWwuZ2V0KHNvdXJjZUlkKS5wdXNoKHRhcmdldE5vZGUpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRhZ09uVmVydGljYWwuc2V0KHNvdXJjZUlkLCBbdGFyZ2V0Tm9kZV0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICghZGFnT25WZXJ0aWNhbC5oYXModGFyZ2V0Tm9kZS5pZCkpIHtcbiAgICAgICAgICAgICAgICBkYWdPblZlcnRpY2FsLnNldCh0YXJnZXROb2RlLmlkLCBbXSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICB2YXIgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjUgPSB0cnVlO1xuICAgICAgICB2YXIgX2RpZEl0ZXJhdG9yRXJyb3I1ID0gZmFsc2U7XG4gICAgICAgIHZhciBfaXRlcmF0b3JFcnJvcjUgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3I1ID0gZGFnLmtleXMoKVtTeW1ib2wuaXRlcmF0b3JdKCksIF9zdGVwNTsgIShfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uNSA9IChfc3RlcDUgPSBfaXRlcmF0b3I1Lm5leHQoKSkuZG9uZSk7IF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb241ID0gdHJ1ZSkge1xuICAgICAgICAgICAgdmFyIG5vZGVJZCA9IF9zdGVwNS52YWx1ZTtcblxuICAgICAgICAgICAgX2xvb3A4KG5vZGVJZCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gZmluZCBzb3VyY2Ugbm9kZXMgb2YgZWFjaCBjb21wb25lbnQgaW4gaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgZGFnc1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBfZGlkSXRlcmF0b3JFcnJvcjUgPSB0cnVlO1xuICAgICAgICAgIF9pdGVyYXRvckVycm9yNSA9IGVycjtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCFfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uNSAmJiBfaXRlcmF0b3I1LnJldHVybikge1xuICAgICAgICAgICAgICBfaXRlcmF0b3I1LnJldHVybigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBpZiAoX2RpZEl0ZXJhdG9yRXJyb3I1KSB7XG4gICAgICAgICAgICAgIHRocm93IF9pdGVyYXRvckVycm9yNTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdW5kaXJlY3RlZE9uSG9yaXpvbnRhbCA9IGRhZ1RvVW5kaXJlY3RlZChkYWdPbkhvcml6b250YWwpO1xuICAgICAgICB2YXIgdW5kaXJlY3RlZE9uVmVydGljYWwgPSBkYWdUb1VuZGlyZWN0ZWQoZGFnT25WZXJ0aWNhbCk7XG4gICAgICAgIHZhciBjb21wb25lbnRzT25Ib3Jpem9udGFsID0gZmluZENvbXBvbmVudHModW5kaXJlY3RlZE9uSG9yaXpvbnRhbCk7XG4gICAgICAgIHZhciBjb21wb25lbnRzT25WZXJ0aWNhbCA9IGZpbmRDb21wb25lbnRzKHVuZGlyZWN0ZWRPblZlcnRpY2FsKTtcbiAgICAgICAgdmFyIHJldmVyc2VkRGFnT25Ib3Jpem9udGFsID0gZGFnVG9SZXZlcnNlZChkYWdPbkhvcml6b250YWwpO1xuICAgICAgICB2YXIgcmV2ZXJzZWREYWdPblZlcnRpY2FsID0gZGFnVG9SZXZlcnNlZChkYWdPblZlcnRpY2FsKTtcbiAgICAgICAgdmFyIGNvbXBvbmVudFNvdXJjZXNPbkhvcml6b250YWwgPSBbXTtcbiAgICAgICAgdmFyIGNvbXBvbmVudFNvdXJjZXNPblZlcnRpY2FsID0gW107XG5cbiAgICAgICAgY29tcG9uZW50c09uSG9yaXpvbnRhbC5mb3JFYWNoKGZ1bmN0aW9uIChjb21wb25lbnQsIGluZGV4KSB7XG4gICAgICAgICAgY29tcG9uZW50U291cmNlc09uSG9yaXpvbnRhbFtpbmRleF0gPSBbXTtcbiAgICAgICAgICBjb21wb25lbnQuZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICBpZiAocmV2ZXJzZWREYWdPbkhvcml6b250YWwuZ2V0KG5vZGVJZCkubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgY29tcG9uZW50U291cmNlc09uSG9yaXpvbnRhbFtpbmRleF0ucHVzaChub2RlSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb21wb25lbnRzT25WZXJ0aWNhbC5mb3JFYWNoKGZ1bmN0aW9uIChjb21wb25lbnQsIGluZGV4KSB7XG4gICAgICAgICAgY29tcG9uZW50U291cmNlc09uVmVydGljYWxbaW5kZXhdID0gW107XG4gICAgICAgICAgY29tcG9uZW50LmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgaWYgKHJldmVyc2VkRGFnT25WZXJ0aWNhbC5nZXQobm9kZUlkKS5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgICBjb21wb25lbnRTb3VyY2VzT25WZXJ0aWNhbFtpbmRleF0ucHVzaChub2RlSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBjYWxjdWxhdGUgYXBwcm9wcmlhdGUgcG9zaXRpb25pbmcgZm9yIHN1YmdyYXBoc1xuICAgICAgICB2YXIgcG9zaXRpb25NYXBIb3Jpem9udGFsID0gZmluZEFwcHJvcHJpYXRlUG9zaXRpb25Gb3JSZWxhdGl2ZVBsYWNlbWVudChkYWdPbkhvcml6b250YWwsIFwiaG9yaXpvbnRhbFwiLCBmaXhlZE5vZGVzT25Ib3Jpem9udGFsLCBkdW1teVBvc2l0aW9uc0ZvclZlcnRpY2FsQWxpZ25tZW50LCBjb21wb25lbnRTb3VyY2VzT25Ib3Jpem9udGFsKTtcbiAgICAgICAgdmFyIHBvc2l0aW9uTWFwVmVydGljYWwgPSBmaW5kQXBwcm9wcmlhdGVQb3NpdGlvbkZvclJlbGF0aXZlUGxhY2VtZW50KGRhZ09uVmVydGljYWwsIFwidmVydGljYWxcIiwgZml4ZWROb2Rlc09uVmVydGljYWwsIGR1bW15UG9zaXRpb25zRm9ySG9yaXpvbnRhbEFsaWdubWVudCwgY29tcG9uZW50U291cmNlc09uVmVydGljYWwpO1xuXG4gICAgICAgIC8vIHVwZGF0ZSBwb3NpdGlvbnMgb2YgdGhlIG5vZGVzIGJhc2VkIG9uIHJlbGF0aXZlIHBsYWNlbWVudCBjb25zdHJhaW50c1xuXG4gICAgICAgIHZhciBfbG9vcDkgPSBmdW5jdGlvbiBfbG9vcDkoa2V5KSB7XG4gICAgICAgICAgaWYgKGR1bW15VG9Ob2RlRm9yVmVydGljYWxBbGlnbm1lbnQuZ2V0KGtleSkpIHtcbiAgICAgICAgICAgIGR1bW15VG9Ob2RlRm9yVmVydGljYWxBbGlnbm1lbnQuZ2V0KGtleSkuZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICAgIHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVJZCldID0gcG9zaXRpb25NYXBIb3Jpem9udGFsLmdldChrZXkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KGtleSldID0gcG9zaXRpb25NYXBIb3Jpem9udGFsLmdldChrZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICB2YXIgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjYgPSB0cnVlO1xuICAgICAgICB2YXIgX2RpZEl0ZXJhdG9yRXJyb3I2ID0gZmFsc2U7XG4gICAgICAgIHZhciBfaXRlcmF0b3JFcnJvcjYgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3I2ID0gcG9zaXRpb25NYXBIb3Jpem9udGFsLmtleXMoKVtTeW1ib2wuaXRlcmF0b3JdKCksIF9zdGVwNjsgIShfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uNiA9IChfc3RlcDYgPSBfaXRlcmF0b3I2Lm5leHQoKSkuZG9uZSk7IF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb242ID0gdHJ1ZSkge1xuICAgICAgICAgICAgdmFyIGtleSA9IF9zdGVwNi52YWx1ZTtcblxuICAgICAgICAgICAgX2xvb3A5KGtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBfZGlkSXRlcmF0b3JFcnJvcjYgPSB0cnVlO1xuICAgICAgICAgIF9pdGVyYXRvckVycm9yNiA9IGVycjtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCFfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uNiAmJiBfaXRlcmF0b3I2LnJldHVybikge1xuICAgICAgICAgICAgICBfaXRlcmF0b3I2LnJldHVybigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBpZiAoX2RpZEl0ZXJhdG9yRXJyb3I2KSB7XG4gICAgICAgICAgICAgIHRocm93IF9pdGVyYXRvckVycm9yNjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgX2xvb3AxMCA9IGZ1bmN0aW9uIF9sb29wMTAoa2V5KSB7XG4gICAgICAgICAgaWYgKGR1bW15VG9Ob2RlRm9ySG9yaXpvbnRhbEFsaWdubWVudC5nZXQoa2V5KSkge1xuICAgICAgICAgICAgZHVtbXlUb05vZGVGb3JIb3Jpem9udGFsQWxpZ25tZW50LmdldChrZXkpLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgICB5Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlSWQpXSA9IHBvc2l0aW9uTWFwVmVydGljYWwuZ2V0KGtleSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgeUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQoa2V5KV0gPSBwb3NpdGlvbk1hcFZlcnRpY2FsLmdldChrZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICB2YXIgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjcgPSB0cnVlO1xuICAgICAgICB2YXIgX2RpZEl0ZXJhdG9yRXJyb3I3ID0gZmFsc2U7XG4gICAgICAgIHZhciBfaXRlcmF0b3JFcnJvcjcgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3I3ID0gcG9zaXRpb25NYXBWZXJ0aWNhbC5rZXlzKClbU3ltYm9sLml0ZXJhdG9yXSgpLCBfc3RlcDc7ICEoX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjcgPSAoX3N0ZXA3ID0gX2l0ZXJhdG9yNy5uZXh0KCkpLmRvbmUpOyBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uNyA9IHRydWUpIHtcbiAgICAgICAgICAgIHZhciBrZXkgPSBfc3RlcDcudmFsdWU7XG5cbiAgICAgICAgICAgIF9sb29wMTAoa2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yNyA9IHRydWU7XG4gICAgICAgICAgX2l0ZXJhdG9yRXJyb3I3ID0gZXJyO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIV9pdGVyYXRvck5vcm1hbENvbXBsZXRpb243ICYmIF9pdGVyYXRvcjcucmV0dXJuKSB7XG4gICAgICAgICAgICAgIF9pdGVyYXRvcjcucmV0dXJuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmIChfZGlkSXRlcmF0b3JFcnJvcjcpIHtcbiAgICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3I3O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSkoKTtcbiAgICB9XG4gIH1cblxuICAvLyBhc3NpZ24gbmV3IGNvb3JkaW5hdGVzIHRvIG5vZGVzIGFmdGVyIGNvbnN0cmFpbnQgaGFuZGxpbmdcbiAgZm9yICh2YXIgX2kxMyA9IDA7IF9pMTMgPCBhbGxOb2Rlcy5sZW5ndGg7IF9pMTMrKykge1xuICAgIHZhciBfbm9kZSA9IGFsbE5vZGVzW19pMTNdO1xuICAgIGlmIChfbm9kZS5nZXRDaGlsZCgpID09IG51bGwpIHtcbiAgICAgIF9ub2RlLnNldENlbnRlcih4Q29vcmRzW25vZGVJbmRleGVzLmdldChfbm9kZS5pZCldLCB5Q29vcmRzW25vZGVJbmRleGVzLmdldChfbm9kZS5pZCldKTtcbiAgICB9XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gQ29uc3RyYWludEhhbmRsZXI7XG5cbi8qKiovIH0pLFxuXG4vKioqLyA1NTE6XG4vKioqLyAoKG1vZHVsZSkgPT4ge1xuXG5tb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzU1MV9fO1xuXG4vKioqLyB9KVxuXG4vKioqKioqLyBcdH0pO1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG4vKioqKioqLyBcdFx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG4vKioqKioqLyBcdFx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG4vKioqKioqLyBcdFx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG4vKioqKioqLyBcdFx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuLyoqKioqKi8gXHRcdFx0ZXhwb3J0czoge31cbi8qKioqKiovIFx0XHR9O1xuLyoqKioqKi8gXHRcbi8qKioqKiovIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbi8qKioqKiovIFx0XHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcbi8qKioqKiovIFx0XG4vKioqKioqLyBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbi8qKioqKiovIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4vKioqKioqLyBcdH1cbi8qKioqKiovIFx0XG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gXHRcbi8qKioqKiovIFx0Ly8gc3RhcnR1cFxuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0Ly8gVGhpcyBlbnRyeSBtb2R1bGUgaXMgcmVmZXJlbmNlZCBieSBvdGhlciBtb2R1bGVzIHNvIGl0IGNhbid0IGJlIGlubGluZWRcbi8qKioqKiovIFx0dmFyIF9fd2VicGFja19leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ1KTtcbi8qKioqKiovIFx0XG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfZXhwb3J0c19fO1xuLyoqKioqKi8gfSkoKVxuO1xufSk7IiwiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYC5fZGFzaC11bmRvLXJlZG8ge1xuICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICBib3R0b206IDMwcHg7XG4gICAgbGVmdDogMzBweDtcbiAgICBmb250LXNpemU6IDIwcHg7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIHotaW5kZXg6IDk5OTk7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpO1xufVxuLl9kYXNoLXVuZG8tcmVkbyA+IGRpdiB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuLl9kYXNoLXVuZG8tcmVkby1saW5rIHtcbiAgICBjb2xvcjogIzAwNzRkOTtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgbWFyZ2luLWxlZnQ6IDEwcHg7XG4gICAgbWFyZ2luLXJpZ2h0OiAxMHB4O1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICBvcGFjaXR5OiAwLjI7XG59XG4uX2Rhc2gtdW5kby1yZWRvLWxpbms6aG92ZXIge1xuICAgIG9wYWNpdHk6IDE7XG59XG4uX2Rhc2gtdW5kby1yZWRvLWxpbmsgLl9kYXNoLWljb24tdW5kbyB7XG4gICAgZm9udC1zaXplOiAyMHB4O1xuICAgIHRyYW5zZm9ybTogcm90YXRlKDI3MGRlZyk7XG59XG4uX2Rhc2gtdW5kby1yZWRvLWxpbmsgLl9kYXNoLWljb24tcmVkbyB7XG4gICAgZm9udC1zaXplOiAyMHB4O1xuICAgIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTtcbn1cbi5fZGFzaC11bmRvLXJlZG8tbGluayAuX2Rhc2gtdW5kby1yZWRvLWxhYmVsIHtcbiAgICBmb250LXNpemU6IDE1cHg7XG59XG5gLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3NyYy9jb21wb25lbnRzL2NvcmUvVG9vbGJhci5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7SUFDSSxlQUFlO0lBQ2YsWUFBWTtJQUNaLFVBQVU7SUFDVixlQUFlO0lBQ2Ysa0JBQWtCO0lBQ2xCLGFBQWE7SUFDYiwwQ0FBMEM7QUFDOUM7QUFDQTtJQUNJLGtCQUFrQjtBQUN0QjtBQUNBO0lBQ0ksY0FBYztJQUNkLGVBQWU7SUFDZixpQkFBaUI7SUFDakIsa0JBQWtCO0lBQ2xCLHFCQUFxQjtJQUNyQixZQUFZO0FBQ2hCO0FBQ0E7SUFDSSxVQUFVO0FBQ2Q7QUFDQTtJQUNJLGVBQWU7SUFDZix5QkFBeUI7QUFDN0I7QUFDQTtJQUNJLGVBQWU7SUFDZix3QkFBd0I7QUFDNUI7QUFDQTtJQUNJLGVBQWU7QUFDbkJcIixcInNvdXJjZXNDb250ZW50XCI6W1wiLl9kYXNoLXVuZG8tcmVkbyB7XFxuICAgIHBvc2l0aW9uOiBmaXhlZDtcXG4gICAgYm90dG9tOiAzMHB4O1xcbiAgICBsZWZ0OiAzMHB4O1xcbiAgICBmb250LXNpemU6IDIwcHg7XFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gICAgei1pbmRleDogOTk5OTtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpO1xcbn1cXG4uX2Rhc2gtdW5kby1yZWRvID4gZGl2IHtcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcbn1cXG4uX2Rhc2gtdW5kby1yZWRvLWxpbmsge1xcbiAgICBjb2xvcjogIzAwNzRkOTtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbiAgICBtYXJnaW4tbGVmdDogMTBweDtcXG4gICAgbWFyZ2luLXJpZ2h0OiAxMHB4O1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAgIG9wYWNpdHk6IDAuMjtcXG59XFxuLl9kYXNoLXVuZG8tcmVkby1saW5rOmhvdmVyIHtcXG4gICAgb3BhY2l0eTogMTtcXG59XFxuLl9kYXNoLXVuZG8tcmVkby1saW5rIC5fZGFzaC1pY29uLXVuZG8ge1xcbiAgICBmb250LXNpemU6IDIwcHg7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDI3MGRlZyk7XFxufVxcbi5fZGFzaC11bmRvLXJlZG8tbGluayAuX2Rhc2gtaWNvbi1yZWRvIHtcXG4gICAgZm9udC1zaXplOiAyMHB4O1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZyk7XFxufVxcbi5fZGFzaC11bmRvLXJlZG8tbGluayAuX2Rhc2gtdW5kby1yZWRvLWxhYmVsIHtcXG4gICAgZm9udC1zaXplOiAxNXB4O1xcbn1cXG5cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIiwiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYC5kYXNoLWNhbGxiYWNrLWRhZy0tY29udGFpbmVyIHtcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgd2lkdGg6IDgwdnc7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGhlaWdodDogY2FsYygxMDB2aCAtIDc1cHgpO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAvKiBzaGFkb3ctMSAqL1xuICAgIGJveC1zaGFkb3c6IDBweCA2cHggMTZweCByZ2JhKDgwLCAxMDMsIDEzMiwgMC4xNjUpLFxuICAgICAgICAwcHggMnB4IDZweCByZ2JhKDgwLCAxMDMsIDEzMiwgMC4xMiksXG4gICAgICAgIDBweCAwcHggMXB4IHJnYmEoODAsIDEwMywgMTMyLCAwLjMyKTtcbn1cblxuLmRhc2gtY2FsbGJhY2stZGFnLS1pbmZvIHtcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHBhZGRpbmc6IDhweDtcbiAgICBib3R0b206IDE2cHg7XG4gICAgbGVmdDogMTZweDtcbiAgICBtYXgtd2lkdGg6IGNhbGMoMTAwJSAtIDMycHgpO1xuICAgIG1heC1oZWlnaHQ6IDUwJTtcbiAgICBvdmVyZmxvdzogYXV0bztcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTtcbiAgICBib3JkZXI6IDJweCBzb2xpZCAjY2NjO1xuICAgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBzYW5zLXNlcmlmO1xufVxuXG4uZGFzaC1jYWxsYmFjay1kYWctLW1lc3NhZ2Uge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBsaW5lLWhlaWdodDogMmVtO1xuICAgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBzYW5zLXNlcmlmO1xufVxuXG4uZGFzaC1jYWxsYmFjay1kYWctLWxheW91dFNlbGVjdG9yIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAzcHg7XG4gICAgcmlnaHQ6IDNweDtcbn1cbmAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvQ2FsbGJhY2tHcmFwaC9DYWxsYmFja0dyYXBoQ29udGFpbmVyLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtJQUNJLGtCQUFrQjtJQUNsQixXQUFXO0lBQ1gsa0JBQWtCO0lBQ2xCLDBCQUEwQjtJQUMxQixnQkFBZ0I7SUFDaEIsc0JBQXNCO0lBQ3RCLG1CQUFtQjtJQUNuQixxQkFBcUI7SUFDckIsYUFBYTtJQUNiOzs0Q0FFd0M7QUFDNUM7O0FBRUE7SUFDSSxrQkFBa0I7SUFDbEIsa0JBQWtCO0lBQ2xCLFlBQVk7SUFDWixZQUFZO0lBQ1osVUFBVTtJQUNWLDRCQUE0QjtJQUM1QixlQUFlO0lBQ2YsY0FBYztJQUNkLHNCQUFzQjtJQUN0QixvQ0FBb0M7SUFDcEMsc0JBQXNCO0lBQ3RCLGdDQUFnQztBQUNwQzs7QUFFQTtJQUNJLGFBQWE7SUFDYixzQkFBc0I7SUFDdEIsdUJBQXVCO0lBQ3ZCLG1CQUFtQjtJQUNuQixZQUFZO0lBQ1osZ0JBQWdCO0lBQ2hCLGdDQUFnQztBQUNwQzs7QUFFQTtJQUNJLGtCQUFrQjtJQUNsQixRQUFRO0lBQ1IsVUFBVTtBQUNkXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi5kYXNoLWNhbGxiYWNrLWRhZy0tY29udGFpbmVyIHtcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xcbiAgICB3aWR0aDogODB2dztcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgICBoZWlnaHQ6IGNhbGMoMTAwdmggLSA3NXB4KTtcXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgICAvKiBzaGFkb3ctMSAqL1xcbiAgICBib3gtc2hhZG93OiAwcHggNnB4IDE2cHggcmdiYSg4MCwgMTAzLCAxMzIsIDAuMTY1KSxcXG4gICAgICAgIDBweCAycHggNnB4IHJnYmEoODAsIDEwMywgMTMyLCAwLjEyKSxcXG4gICAgICAgIDBweCAwcHggMXB4IHJnYmEoODAsIDEwMywgMTMyLCAwLjMyKTtcXG59XFxuXFxuLmRhc2gtY2FsbGJhY2stZGFnLS1pbmZvIHtcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIHBhZGRpbmc6IDhweDtcXG4gICAgYm90dG9tOiAxNnB4O1xcbiAgICBsZWZ0OiAxNnB4O1xcbiAgICBtYXgtd2lkdGg6IGNhbGMoMTAwJSAtIDMycHgpO1xcbiAgICBtYXgtaGVpZ2h0OiA1MCU7XFxuICAgIG92ZXJmbG93OiBhdXRvO1xcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7XFxuICAgIGJvcmRlcjogMnB4IHNvbGlkICNjY2M7XFxuICAgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBzYW5zLXNlcmlmO1xcbn1cXG5cXG4uZGFzaC1jYWxsYmFjay1kYWctLW1lc3NhZ2Uge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgaGVpZ2h0OiAxMDAlO1xcbiAgICBsaW5lLWhlaWdodDogMmVtO1xcbiAgICBmb250LWZhbWlseTogVmVyZGFuYSwgc2Fucy1zZXJpZjtcXG59XFxuXFxuLmRhc2gtY2FsbGJhY2stZGFnLS1sYXlvdXRTZWxlY3RvciB7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgdG9wOiAzcHg7XFxuICAgIHJpZ2h0OiAzcHg7XFxufVxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgLmVycm9yLWNvbnRhaW5lciB7XG4gICAgcGFkZGluZzogMCAxMHB4O1xuICAgIGZvbnQtZmFtaWx5OiBDb3VyaWVyO1xufVxuXG4uZGFzaC1mZS1lcnJvcl9faWNvbi14IHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgcmlnaHQ6IDA7XG4gICAgdG9wOiAwO1xuICAgIGNvbG9yOiAjYjljMmNlO1xuICAgIGZvbnQtc2l6ZTogMjBweDtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi5kYXNoLWZlLWVycm9yX19pY29uLXg6aG92ZXIge1xuICAgIGNvbG9yOiAjYTFhOWI1O1xufVxuXG4uZGFzaC1mZS1lcnJvcnMge1xuICAgIG1pbi13aWR0aDogMzg2cHg7XG4gICAgbWF4LXdpZHRoOiA2NTBweDtcbiAgICBtYXgtaGVpZ2h0OiA0NTBweDtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG59XG5cbi5kYXNoLWZlLWVycm9yX19pY29uLWVycm9yIHtcbiAgICB3aWR0aDogMjBweDtcbiAgICBoZWlnaHQ6IDIwcHg7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIG1hcmdpbi1yaWdodDogMTZweDtcbn1cbi5kYXNoLWZlLWVycm9yX19pY29uLWNsb3NlIHtcbiAgICB3aWR0aDogMTBweDtcbiAgICBoZWlnaHQ6IDEwcHg7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHJpZ2h0OiAxMnB4O1xuICAgIHRvcDogMTJweDtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG59XG4uZGFzaC1mZS1lcnJvcl9faWNvbi1hcnJvdyB7XG4gICAgd2lkdGg6IDhweDtcbiAgICBoZWlnaHQ6IDI4cHg7XG4gICAgbWFyZ2luOiAwcHggOHB4O1xufVxuLmRhc2gtZmUtZXJyb3ItdG9wX19ncm91cDpmaXJzdC1jaGlsZCB7XG4gICAgLypcbiAgICAgKiA3NyUgaXMgdGhlIG1heGltdW0gc3BhY2UgYWxsb3dlZCBiYXNlZCBvZmYgb2YgdGhlIG90aGVyIGVsZW1lbnRzXG4gICAgICogaW4gdGhlIHRvcCBwYXJ0IG9mIHRoZSBlcnJvciBjb250YWluZXIgKHRpbWVzdGFtcCAmIGNvbGxhcHNlIGFycm93KS5cbiAgICAgKiB0aGlzIHdhcyBtYW51YWxseSBkZXRlcm1pbmVkICovXG4gICAgd2lkdGg6IDc3JTtcbn1cbi5kYXNoLWZlLWVycm9yLXRvcF9fZ3JvdXAge1xuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XG4uZGFzaC1mZS1lcnJvcl9fdGl0bGUge1xuICAgIHRleHQtYWxpZ246IGxlZnQ7XG4gICAgbWFyZ2luOiAwcHg7XG4gICAgbWFyZ2luLWxlZnQ6IDVweDtcbiAgICBwYWRkaW5nOiAwcHg7XG4gICAgZm9udC1zaXplOiAxMi42cHg7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBsaW5lLWhlaWdodDogMjBweDtcbn1cbi5kYXNoLWZlLWVycm9yX190aW1lc3RhbXAge1xuICAgIG1hcmdpbi1yaWdodDogMjBweDtcbn1cbi5kYXNoLWZlLWVycm9yX19jb2xsYXBzZS0tZmxpcHBlZCB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xuICAgIC1tcy10cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xuICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XG59XG5cbi5kYXNoLWZlLWVycm9yX19pbmZvX3RpdGxlIHtcbiAgICBtYXJnaW46IDA7XG4gICAgY29sb3I6ICM1MDY3ODQ7XG4gICAgZm9udC1zaXplOiAxNnB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmM2Y2ZmE7XG4gICAgYm9yZGVyOiAycHggc29saWQgI2RmZThmMztcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDRweDtcbiAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogNHB4O1xuICAgIHBhZGRpbmc6IDEwcHg7XG59XG5cbi5kYXNoLWZlLWVycm9yX19pbmZvIHtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZGZlOGYzO1xuICAgIG1hcmdpbjogMCAwIDFlbSAwO1xuICAgIHBhZGRpbmc6IDEwcHg7XG5cbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgICBib3JkZXI6IDJweCBzb2xpZCAjZGZlOGYzO1xuICAgIGNvbG9yOiAjNTA2Nzg0O1xuICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDtcbn1cblxuLmRhc2gtZmUtZXJyb3JfX2N1cnZlZCB7XG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xufVxuXG4uZGFzaC1mZS1lcnJvcl9fY3VydmVkLXRvcCB7XG4gICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogNHB4O1xuICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiA0cHg7XG4gICAgYm9yZGVyLWJvdHRvbS13aWR0aDogMHB4O1xufVxuXG4uZGFzaC1mZS1lcnJvcl9fY3VydmVkLWJvdHRvbSB7XG4gICAgYm9yZGVyLXJhZGl1cy1ib3R0b20tbGVmdDogNHB4O1xuICAgIGJvcmRlci1yYWRpdXMtYm90dG9tLXJpZ2h0OiA0cHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZWZlZjtcbn1cblxuLmRhc2gtYmUtZXJyb3JfX3N0IHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmRmM2Y0O1xuICAgIG1pbi13aWR0aDogMzg2cHg7XG4gICAgbWF4LXdpZHRoOiA2NTBweDtcbiAgICAvKiBpZnJhbWUgY29udGFpbmVyIGhhbmRsZXMgdGhlIHNjcm9sbGluZyAqL1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuXG4uZGFzaC1iZS1lcnJvcl9fc3RyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNmZhO1xuICAgIG1pbi13aWR0aDogMzg2cHg7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgb3ZlcmZsb3c6IGF1dG87XG4gICAgbGluZS1oZWlnaHQ6IDE3cHg7XG4gICAgbWFyZ2luLWJvdHRvbTogOHB4O1xufVxuXG4uZGFzaC1iYWNrZW5kLWVycm9yIHtcbiAgICBwYWRkaW5nOiA4cHg7XG59XG5cbi5kYXNoLWVycm9yLW1lbnUge1xuICAgIG1heC13aWR0aDogNTAlO1xuICAgIG1heC1oZWlnaHQ6IDYwJTtcbiAgICBkaXNwbGF5OiBjb250ZW50cztcbiAgICBmb250LWZhbWlseTogbW9ub3NwYWNlO1xuICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICBmb250LXZhcmlhbnQtbGlnYXR1cmVzOiBjb21tb24tbGlnYXR1cmVzO1xuICAgIGNvbG9yOiByZ2IoNTAsIDUwLCA1MCk7XG59XG5cbi5kYXNoLWVycm9yLWNhcmQge1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIC8qIHNoYWRvdy0xICovXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgIGFuaW1hdGlvbjogZGFzaC1lcnJvci1jYXJkLWFuaW1hdGlvbiAwLjVzO1xuICAgIHBhZGRpbmc6IDI0cHg7XG4gICAgdGV4dC1hbGlnbjogbGVmdDtcbiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICB3aWR0aDogMTAwJTtcbn1cbi5kYXNoLWVycm9yLWNhcmQtLWFsZXJ0cy10cmF5IHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAtMzAwcHg7XG4gICAgbGVmdDogLTFweDtcbiAgICBhbmltYXRpb246IG5vbmU7XG4gICAgYm94LXNoYWRvdzogbm9uZTtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZWNlY2VjO1xuICAgIGJvcmRlci1ib3R0b206IDA7XG4gICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMHB4O1xuICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwcHg7XG4gICAgd2lkdGg6IDQyMnB4O1xufVxuLmRhc2gtZXJyb3ItY2FyZC0tY29udGFpbmVyIHtcbiAgICBwYWRkaW5nOiAxNnB4O1xuICAgIHdpZHRoOiA2MDBweDtcbiAgICBtYXgtd2lkdGg6IDgwMHB4O1xuICAgIG1hcmdpbi1ib3R0b206IDRweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgICBvdmVyZmxvdzogYXV0bztcbiAgICBib3JkZXItcmFkaXVzOiA2cHg7XG4gICAgYm94LXNoYWRvdzogMHB4IDAuN3B4IDEuNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMDcpLFxuICAgICAgICAwcHggMS45cHggNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMDUpLFxuICAgICAgICAwcHggNC41cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjA1KTtcbn1cblxuLmRhc2gtZXJyb3ItY2FyZF9fdG9wYmFyIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDMycHg7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XG4gICAgZm9udC1zaXplOiAxNHB4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHBhZGRpbmctYm90dG9tOiAxNHB4O1xuICAgIGZvbnQtd2VpZ2h0OiA3MDA7XG59XG4uZGFzaC1lcnJvci1jYXJkX19tZXNzYWdlIHtcbiAgICBmb250LXNpemU6IDE0cHg7XG59XG5cbi5kYXNoLWVycm9yLWNhcmRfX21lc3NhZ2UgPiBzdHJvbmcge1xuICAgIGNvbG9yOiAjZmY0NTAwO1xufVxuXG4uZGFzaC1lcnJvci1jYXJkX19jb250ZW50IHtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xuICAgIGJvcmRlci1yYWRpdXM6IDJweDtcbiAgICBtYXJnaW4tYm90dG9tOiAxNXB4O1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICMwMDE4NjYxYTtcbiAgICBmb250LXNpemU6IDEyLjZweDtcbn1cblxuLmRhc2gtZmUtZXJyb3ItaXRlbSB7XG4gICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgICBib3JkZXItcmFkaXVzOiAycHg7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBwYWRkaW5nOiA4cHg7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG5Aa2V5ZnJhbWVzIGRhc2gtZXJyb3ItY2FyZC1hbmltYXRpb24ge1xuICAgIGZyb20ge1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMS4xKTtcbiAgICAgICAgLW1vei10cmFuc2Zvcm06IHNjYWxlKDEuMSk7XG4gICAgICAgIC1tcy10cmFuc2Zvcm06IHNjYWxlKDEuMSk7XG4gICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS4xKTtcbiAgICB9XG4gICAgdG8ge1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMSk7XG4gICAgICAgIC1tb3otdHJhbnNmb3JtOiBzY2FsZSgxKTtcbiAgICAgICAgLW1zLXRyYW5zZm9ybTogc2NhbGUoMSk7XG4gICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7XG4gICAgfVxufVxuYCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvY29tcG9uZW50cy9lcnJvci9Gcm9udEVuZC9Gcm9udEVuZEVycm9yLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtJQUNJLGVBQWU7SUFDZixvQkFBb0I7QUFDeEI7O0FBRUE7SUFDSSxrQkFBa0I7SUFDbEIsUUFBUTtJQUNSLE1BQU07SUFDTixjQUFjO0lBQ2QsZUFBZTtJQUNmLGVBQWU7QUFDbkI7O0FBRUE7SUFDSSxjQUFjO0FBQ2xCOztBQUVBO0lBQ0ksZ0JBQWdCO0lBQ2hCLGdCQUFnQjtJQUNoQixpQkFBaUI7SUFDakIscUJBQXFCO0FBQ3pCOztBQUVBO0lBQ0ksV0FBVztJQUNYLFlBQVk7SUFDWixxQkFBcUI7SUFDckIsa0JBQWtCO0FBQ3RCO0FBQ0E7SUFDSSxXQUFXO0lBQ1gsWUFBWTtJQUNaLGtCQUFrQjtJQUNsQixXQUFXO0lBQ1gsU0FBUztJQUNULHFCQUFxQjtBQUN6QjtBQUNBO0lBQ0ksVUFBVTtJQUNWLFlBQVk7SUFDWixlQUFlO0FBQ25CO0FBQ0E7SUFDSTs7O3FDQUdpQztJQUNqQyxVQUFVO0FBQ2Q7QUFDQTtJQUNJLG9CQUFvQjtJQUNwQixtQkFBbUI7QUFDdkI7QUFDQTtJQUNJLGdCQUFnQjtJQUNoQixXQUFXO0lBQ1gsZ0JBQWdCO0lBQ2hCLFlBQVk7SUFDWixpQkFBaUI7SUFDakIscUJBQXFCO0lBQ3JCLHVCQUF1QjtJQUN2QixtQkFBbUI7SUFDbkIsZ0JBQWdCO0lBQ2hCLGlCQUFpQjtBQUNyQjtBQUNBO0lBQ0ksa0JBQWtCO0FBQ3RCO0FBQ0E7SUFDSSxpQ0FBaUM7SUFDakMsNkJBQTZCO0lBQzdCLHlCQUF5QjtBQUM3Qjs7QUFFQTtJQUNJLFNBQVM7SUFDVCxjQUFjO0lBQ2QsZUFBZTtJQUNmLHlCQUF5QjtJQUN6Qix5QkFBeUI7SUFDekIsc0JBQXNCO0lBQ3RCLDJCQUEyQjtJQUMzQiw0QkFBNEI7SUFDNUIsYUFBYTtBQUNqQjs7QUFFQTtJQUNJLHlCQUF5QjtJQUN6QixpQkFBaUI7SUFDakIsYUFBYTs7SUFFYix1QkFBdUI7SUFDdkIseUJBQXlCO0lBQ3pCLGNBQWM7SUFDZCxjQUFjO0lBQ2QscUJBQXFCO0FBQ3pCOztBQUVBO0lBQ0ksa0JBQWtCO0FBQ3RCOztBQUVBO0lBQ0ksMkJBQTJCO0lBQzNCLDRCQUE0QjtJQUM1Qix3QkFBd0I7QUFDNUI7O0FBRUE7SUFDSSw4QkFBOEI7SUFDOUIsK0JBQStCO0lBQy9CLHlCQUF5QjtBQUM3Qjs7QUFFQTtJQUNJLHlCQUF5QjtJQUN6QixnQkFBZ0I7SUFDaEIsZ0JBQWdCO0lBQ2hCLDJDQUEyQztJQUMzQyxnQkFBZ0I7SUFDaEIscUJBQXFCO0FBQ3pCOztBQUVBO0lBQ0kseUJBQXlCO0lBQ3pCLGdCQUFnQjtJQUNoQixXQUFXO0lBQ1gsY0FBYztJQUNkLGlCQUFpQjtJQUNqQixrQkFBa0I7QUFDdEI7O0FBRUE7SUFDSSxZQUFZO0FBQ2hCOztBQUVBO0lBQ0ksY0FBYztJQUNkLGVBQWU7SUFDZixpQkFBaUI7SUFDakIsc0JBQXNCO0lBQ3RCLGVBQWU7SUFDZix3Q0FBd0M7SUFDeEMsc0JBQXNCO0FBQzFCOztBQUVBO0lBQ0ksc0JBQXNCO0lBQ3RCLHFCQUFxQjtJQUNyQixhQUFhO0lBQ2Isa0JBQWtCO0lBQ2xCLHlDQUF5QztJQUN6QyxhQUFhO0lBQ2IsZ0JBQWdCO0lBQ2hCLHVCQUF1QjtJQUN2QixXQUFXO0FBQ2Y7QUFDQTtJQUNJLGtCQUFrQjtJQUNsQixXQUFXO0lBQ1gsVUFBVTtJQUNWLGVBQWU7SUFDZixnQkFBZ0I7SUFDaEIseUJBQXlCO0lBQ3pCLGdCQUFnQjtJQUNoQiw4QkFBOEI7SUFDOUIsK0JBQStCO0lBQy9CLFlBQVk7QUFDaEI7QUFDQTtJQUNJLGFBQWE7SUFDYixZQUFZO0lBQ1osZ0JBQWdCO0lBQ2hCLGtCQUFrQjtJQUNsQix1QkFBdUI7SUFDdkIsY0FBYztJQUNkLGtCQUFrQjtJQUNsQjs7OENBRTBDO0FBQzlDOztBQUVBO0lBQ0ksV0FBVztJQUNYLFlBQVk7SUFDWixhQUFhO0lBQ2IsMkJBQTJCO0lBQzNCLGVBQWU7SUFDZixtQkFBbUI7SUFDbkIsa0JBQWtCO0lBQ2xCLG9CQUFvQjtJQUNwQixnQkFBZ0I7QUFDcEI7QUFDQTtJQUNJLGVBQWU7QUFDbkI7O0FBRUE7SUFDSSxjQUFjO0FBQ2xCOztBQUVBO0lBQ0ksc0JBQXNCO0lBQ3RCLHVCQUF1QjtJQUN2QixrQkFBa0I7SUFDbEIsbUJBQW1CO0lBQ25CLDJCQUEyQjtJQUMzQixpQkFBaUI7QUFDckI7O0FBRUE7SUFDSSxtQkFBbUI7SUFDbkIsa0JBQWtCO0lBQ2xCLGFBQWE7SUFDYiw4QkFBOEI7SUFDOUIsbUJBQW1CO0lBQ25CLFlBQVk7SUFDWixlQUFlO0FBQ25COztBQUVBO0lBQ0k7UUFDSSxVQUFVO1FBQ1YsNkJBQTZCO1FBQzdCLDBCQUEwQjtRQUMxQix5QkFBeUI7UUFDekIscUJBQXFCO0lBQ3pCO0lBQ0E7UUFDSSxVQUFVO1FBQ1YsMkJBQTJCO1FBQzNCLHdCQUF3QjtRQUN4Qix1QkFBdUI7UUFDdkIsbUJBQW1CO0lBQ3ZCO0FBQ0pcIixcInNvdXJjZXNDb250ZW50XCI6W1wiLmVycm9yLWNvbnRhaW5lciB7XFxuICAgIHBhZGRpbmc6IDAgMTBweDtcXG4gICAgZm9udC1mYW1pbHk6IENvdXJpZXI7XFxufVxcblxcbi5kYXNoLWZlLWVycm9yX19pY29uLXgge1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIHJpZ2h0OiAwO1xcbiAgICB0b3A6IDA7XFxuICAgIGNvbG9yOiAjYjljMmNlO1xcbiAgICBmb250LXNpemU6IDIwcHg7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuXFxuLmRhc2gtZmUtZXJyb3JfX2ljb24teDpob3ZlciB7XFxuICAgIGNvbG9yOiAjYTFhOWI1O1xcbn1cXG5cXG4uZGFzaC1mZS1lcnJvcnMge1xcbiAgICBtaW4td2lkdGg6IDM4NnB4O1xcbiAgICBtYXgtd2lkdGg6IDY1MHB4O1xcbiAgICBtYXgtaGVpZ2h0OiA0NTBweDtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbn1cXG5cXG4uZGFzaC1mZS1lcnJvcl9faWNvbi1lcnJvciB7XFxuICAgIHdpZHRoOiAyMHB4O1xcbiAgICBoZWlnaHQ6IDIwcHg7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gICAgbWFyZ2luLXJpZ2h0OiAxNnB4O1xcbn1cXG4uZGFzaC1mZS1lcnJvcl9faWNvbi1jbG9zZSB7XFxuICAgIHdpZHRoOiAxMHB4O1xcbiAgICBoZWlnaHQ6IDEwcHg7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgcmlnaHQ6IDEycHg7XFxuICAgIHRvcDogMTJweDtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbn1cXG4uZGFzaC1mZS1lcnJvcl9faWNvbi1hcnJvdyB7XFxuICAgIHdpZHRoOiA4cHg7XFxuICAgIGhlaWdodDogMjhweDtcXG4gICAgbWFyZ2luOiAwcHggOHB4O1xcbn1cXG4uZGFzaC1mZS1lcnJvci10b3BfX2dyb3VwOmZpcnN0LWNoaWxkIHtcXG4gICAgLypcXG4gICAgICogNzclIGlzIHRoZSBtYXhpbXVtIHNwYWNlIGFsbG93ZWQgYmFzZWQgb2ZmIG9mIHRoZSBvdGhlciBlbGVtZW50c1xcbiAgICAgKiBpbiB0aGUgdG9wIHBhcnQgb2YgdGhlIGVycm9yIGNvbnRhaW5lciAodGltZXN0YW1wICYgY29sbGFwc2UgYXJyb3cpLlxcbiAgICAgKiB0aGlzIHdhcyBtYW51YWxseSBkZXRlcm1pbmVkICovXFxuICAgIHdpZHRoOiA3NyU7XFxufVxcbi5kYXNoLWZlLWVycm9yLXRvcF9fZ3JvdXAge1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG59XFxuLmRhc2gtZmUtZXJyb3JfX3RpdGxlIHtcXG4gICAgdGV4dC1hbGlnbjogbGVmdDtcXG4gICAgbWFyZ2luOiAwcHg7XFxuICAgIG1hcmdpbi1sZWZ0OiA1cHg7XFxuICAgIHBhZGRpbmc6IDBweDtcXG4gICAgZm9udC1zaXplOiAxMi42cHg7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XFxuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxuICAgIG92ZXJmbG93OiBoaWRkZW47XFxuICAgIGxpbmUtaGVpZ2h0OiAyMHB4O1xcbn1cXG4uZGFzaC1mZS1lcnJvcl9fdGltZXN0YW1wIHtcXG4gICAgbWFyZ2luLXJpZ2h0OiAyMHB4O1xcbn1cXG4uZGFzaC1mZS1lcnJvcl9fY29sbGFwc2UtLWZsaXBwZWQge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxuICAgIC1tcy10cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbn1cXG5cXG4uZGFzaC1mZS1lcnJvcl9faW5mb190aXRsZSB7XFxuICAgIG1hcmdpbjogMDtcXG4gICAgY29sb3I6ICM1MDY3ODQ7XFxuICAgIGZvbnQtc2l6ZTogMTZweDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2YzZjZmYTtcXG4gICAgYm9yZGVyOiAycHggc29saWQgI2RmZThmMztcXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogNHB4O1xcbiAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogNHB4O1xcbiAgICBwYWRkaW5nOiAxMHB4O1xcbn1cXG5cXG4uZGFzaC1mZS1lcnJvcl9faW5mbyB7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNkZmU4ZjM7XFxuICAgIG1hcmdpbjogMCAwIDFlbSAwO1xcbiAgICBwYWRkaW5nOiAxMHB4O1xcblxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXG4gICAgYm9yZGVyOiAycHggc29saWQgI2RmZThmMztcXG4gICAgY29sb3I6ICM1MDY3ODQ7XFxuICAgIG92ZXJmbG93OiBhdXRvO1xcbiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7XFxufVxcblxcbi5kYXNoLWZlLWVycm9yX19jdXJ2ZWQge1xcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XFxufVxcblxcbi5kYXNoLWZlLWVycm9yX19jdXJ2ZWQtdG9wIHtcXG4gICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogNHB4O1xcbiAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogNHB4O1xcbiAgICBib3JkZXItYm90dG9tLXdpZHRoOiAwcHg7XFxufVxcblxcbi5kYXNoLWZlLWVycm9yX19jdXJ2ZWQtYm90dG9tIHtcXG4gICAgYm9yZGVyLXJhZGl1cy1ib3R0b20tbGVmdDogNHB4O1xcbiAgICBib3JkZXItcmFkaXVzLWJvdHRvbS1yaWdodDogNHB4O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZlZmVmO1xcbn1cXG5cXG4uZGFzaC1iZS1lcnJvcl9fc3Qge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmRmM2Y0O1xcbiAgICBtaW4td2lkdGg6IDM4NnB4O1xcbiAgICBtYXgtd2lkdGg6IDY1MHB4O1xcbiAgICAvKiBpZnJhbWUgY29udGFpbmVyIGhhbmRsZXMgdGhlIHNjcm9sbGluZyAqL1xcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxufVxcblxcbi5kYXNoLWJlLWVycm9yX19zdHIge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNmZhO1xcbiAgICBtaW4td2lkdGg6IDM4NnB4O1xcbiAgICB3aWR0aDogMTAwJTtcXG4gICAgb3ZlcmZsb3c6IGF1dG87XFxuICAgIGxpbmUtaGVpZ2h0OiAxN3B4O1xcbiAgICBtYXJnaW4tYm90dG9tOiA4cHg7XFxufVxcblxcbi5kYXNoLWJhY2tlbmQtZXJyb3Ige1xcbiAgICBwYWRkaW5nOiA4cHg7XFxufVxcblxcbi5kYXNoLWVycm9yLW1lbnUge1xcbiAgICBtYXgtd2lkdGg6IDUwJTtcXG4gICAgbWF4LWhlaWdodDogNjAlO1xcbiAgICBkaXNwbGF5OiBjb250ZW50cztcXG4gICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTtcXG4gICAgZm9udC1zaXplOiAxNHB4O1xcbiAgICBmb250LXZhcmlhbnQtbGlnYXR1cmVzOiBjb21tb24tbGlnYXR1cmVzO1xcbiAgICBjb2xvcjogcmdiKDUwLCA1MCwgNTApO1xcbn1cXG5cXG4uZGFzaC1lcnJvci1jYXJkIHtcXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgICAvKiBzaGFkb3ctMSAqL1xcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XFxuICAgIGFuaW1hdGlvbjogZGFzaC1lcnJvci1jYXJkLWFuaW1hdGlvbiAwLjVzO1xcbiAgICBwYWRkaW5nOiAyNHB4O1xcbiAgICB0ZXh0LWFsaWduOiBsZWZ0O1xcbiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcXG4gICAgd2lkdGg6IDEwMCU7XFxufVxcbi5kYXNoLWVycm9yLWNhcmQtLWFsZXJ0cy10cmF5IHtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICB0b3A6IC0zMDBweDtcXG4gICAgbGVmdDogLTFweDtcXG4gICAgYW5pbWF0aW9uOiBub25lO1xcbiAgICBib3gtc2hhZG93OiBub25lO1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZWNlY2VjO1xcbiAgICBib3JkZXItYm90dG9tOiAwO1xcbiAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAwcHg7XFxuICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwcHg7XFxuICAgIHdpZHRoOiA0MjJweDtcXG59XFxuLmRhc2gtZXJyb3ItY2FyZC0tY29udGFpbmVyIHtcXG4gICAgcGFkZGluZzogMTZweDtcXG4gICAgd2lkdGg6IDYwMHB4O1xcbiAgICBtYXgtd2lkdGg6IDgwMHB4O1xcbiAgICBtYXJnaW4tYm90dG9tOiA0cHg7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xcbiAgICBvdmVyZmxvdzogYXV0bztcXG4gICAgYm9yZGVyLXJhZGl1czogNnB4O1xcbiAgICBib3gtc2hhZG93OiAwcHggMC43cHggMS40cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4wNyksXFxuICAgICAgICAwcHggMS45cHggNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMDUpLFxcbiAgICAgICAgMHB4IDQuNXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4wNSk7XFxufVxcblxcbi5kYXNoLWVycm9yLWNhcmRfX3RvcGJhciB7XFxuICAgIHdpZHRoOiAxMDAlO1xcbiAgICBoZWlnaHQ6IDMycHg7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDtcXG4gICAgZm9udC1zaXplOiAxNHB4O1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIHBhZGRpbmctYm90dG9tOiAxNHB4O1xcbiAgICBmb250LXdlaWdodDogNzAwO1xcbn1cXG4uZGFzaC1lcnJvci1jYXJkX19tZXNzYWdlIHtcXG4gICAgZm9udC1zaXplOiAxNHB4O1xcbn1cXG5cXG4uZGFzaC1lcnJvci1jYXJkX19tZXNzYWdlID4gc3Ryb25nIHtcXG4gICAgY29sb3I6ICNmZjQ1MDA7XFxufVxcblxcbi5kYXNoLWVycm9yLWNhcmRfX2NvbnRlbnQge1xcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXG4gICAgYm9yZGVyLXJhZGl1czogMnB4O1xcbiAgICBtYXJnaW4tYm90dG9tOiAxNXB4O1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjMDAxODY2MWE7XFxuICAgIGZvbnQtc2l6ZTogMTIuNnB4O1xcbn1cXG5cXG4uZGFzaC1mZS1lcnJvci1pdGVtIHtcXG4gICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcXG4gICAgYm9yZGVyLXJhZGl1czogMnB4O1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIHBhZGRpbmc6IDhweDtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbn1cXG5cXG5Aa2V5ZnJhbWVzIGRhc2gtZXJyb3ItY2FyZC1hbmltYXRpb24ge1xcbiAgICBmcm9tIHtcXG4gICAgICAgIG9wYWNpdHk6IDA7XFxuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMS4xKTtcXG4gICAgICAgIC1tb3otdHJhbnNmb3JtOiBzY2FsZSgxLjEpO1xcbiAgICAgICAgLW1zLXRyYW5zZm9ybTogc2NhbGUoMS4xKTtcXG4gICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS4xKTtcXG4gICAgfVxcbiAgICB0byB7XFxuICAgICAgICBvcGFjaXR5OiAxO1xcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEpO1xcbiAgICAgICAgLW1vei10cmFuc2Zvcm06IHNjYWxlKDEpO1xcbiAgICAgICAgLW1zLXRyYW5zZm9ybTogc2NhbGUoMSk7XFxuICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xcbiAgICB9XFxufVxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgLnBlcmN5LXNob3cge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbkBtZWRpYSBvbmx5IHBlcmN5IHtcbiAgICAucGVyY3ktaGlkZSB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuICAgIC5wZXJjeS1zaG93IHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxufVxuYCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvY29tcG9uZW50cy9lcnJvci9QZXJjeS5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7SUFDSSxhQUFhO0FBQ2pCOztBQUVBO0lBQ0k7UUFDSSxhQUFhO0lBQ2pCO0lBQ0E7UUFDSSxjQUFjO0lBQ2xCO0FBQ0pcIixcInNvdXJjZXNDb250ZW50XCI6W1wiLnBlcmN5LXNob3cge1xcbiAgICBkaXNwbGF5OiBub25lO1xcbn1cXG5cXG5AbWVkaWEgb25seSBwZXJjeSB7XFxuICAgIC5wZXJjeS1oaWRlIHtcXG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XFxuICAgIH1cXG4gICAgLnBlcmN5LXNob3cge1xcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XFxuICAgIH1cXG59XFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGAuZGFzaC1kZWJ1Zy1tZW51IHtcbiAgICB0cmFuc2l0aW9uOiAwLjNzO1xuICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICBib3R0b206IDM1cHg7XG4gICAgcmlnaHQ6IDM1cHg7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIHotaW5kZXg6IDEwMDAxO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICMxMTlkZmY7XG4gICAgYm9yZGVyLXJhZGl1czogMTAwJTtcbiAgICB3aWR0aDogNjRweDtcbiAgICBoZWlnaHQ6IDY0cHg7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xufVxuLmRhc2gtZGVidWctbWVudS0tb3BlbiB7XG4gICAgdHJhbnNmb3JtOiByb3RhdGUoLTE4MGRlZyk7XG59XG5cbi5kYXNoLWRlYnVnLW1lbnVfX291dGVyIGJ1dHRvbiB7XG4gICAgaGVpZ2h0OiBhdXRvO1xuICAgIHBhZGRpbmc6IDAgOHB4O1xuICAgIGxpbmUtaGVpZ2h0OiBub3JtYWw7XG4gICAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XG4gICAgZm9udC1zaXplOiAxNHB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDBweDtcbiAgICBsZXR0ZXItc3BhY2luZzogbm9ybWFsO1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgZ2FwOiA2cHg7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgIG91dGxpbmU6IG5vbmU7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuXG4uZGFzaC1kZWJ1Zy1tZW51X19wb3B1cCB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBib3R0b206IDEwMCU7XG4gICAgcmlnaHQ6IDA7XG4gICAgZ2FwOiA4cHg7XG4gICAgbWF4LWhlaWdodDogY2FsYygxMDB2aCAtIDc1cHgpO1xuICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XG59XG5cbi5kYXNoLWRlYnVnLW1lbnVfX3ZlcnNpb24tb3B0LW91dCB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICB3aWR0aDogNDI2cHg7XG4gICAgcGFkZGluZzogMTZweDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuICAgIGdhcDogOHB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDI0LCAxMDIsIDAuMSk7XG4gICAgYmFja2dyb3VuZDogI2ZmZjtcbiAgICBhbGlnbi1zZWxmOiBmbGV4LWVuZDtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgLyogU2hhZG93L1NtYWxsICovXG4gICAgYm94LXNoYWRvdzogMHB4IDAuN3B4IDEuNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMDcpLFxuICAgICAgICAwcHggMS45cHggNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMDUpLFxuICAgICAgICAwcHggNC41cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjA1KTtcbn1cblxuLmRhc2gtZGVidWctbWVudV9fdmVyc2lvbi1vcHQtb3V0X190ZXh0IHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG59XG5cbi5kYXNoLWRlYnVnLW1lbnVfX3ZlcnNpb24tb3B0LW91dF9fdGV4dCBhIHtcbiAgICBjb2xvcjogIzdmNGJjNDtcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG59XG5cbi5kYXNoLWRlYnVnLW1lbnVfX3ZlcnNpb24tb3B0LW91dF9fdGV4dCBzcGFuIHtcbiAgICBtYXJnaW4tcmlnaHQ6IDVweDtcbn1cblxuLmRhc2gtZGVidWctbWVudV9fdmVyc2lvbi1vcHQtb3V0IGJ1dHRvbiB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBoZWlnaHQ6IDI0cHg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgbGluZS1oZWlnaHQ6IDE4cHg7XG4gICAgcGFkZGluZzogMTZweCAxMnB4O1xufVxuXG4uZGFzaC1kZWJ1Zy1tZW51X192ZXJzaW9uLW9wdC1vdXRfX2J1dHRvbnMtY29udGFpbmVyIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGdhcDogOHB4O1xuICAgIGFsaWduLXNlbGY6IHN0cmV0Y2g7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgcGFkZGluZy10b3A6IDE2cHg7XG4gICAgbWFyZ2luLXRvcDogMTZweDtcbiAgICBib3JkZXItdG9wOiAxcHggc29saWQgcmdiYSgwLCAyNCwgMTAyLCAwLjEpO1xufVxuXG4uZGFzaC1kZWJ1Zy1tZW51X192ZXJzaW9uLW9wdC1vdXRfX2J1dHRvbi1wcmltYXJ5IHtcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgY29sb3I6ICNmZmY7XG4gICAgYmFja2dyb3VuZDogIzdmNGJjNDtcbn1cblxuLmRhc2gtZGVidWctbWVudV9fdmVyc2lvbi1vcHQtb3V0X19idXR0b24tc2Vjb25kYXJ5IHtcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDE2MSwgODksIDI1NSwgMC4wNSk7XG4gICAgY29sb3I6ICM3ZjRiYzQ7XG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxMzQsIDc0LCAyMTIsIDAuOCk7XG59XG5cbi5kYXNoLWRlYnVnLW1lbnU6aG92ZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICM3ZjRiYzQ7XG59XG5cbi5kYXNoLWRlYnVnLW1lbnVfX291dGVyIHtcbiAgICB0cmFuc2l0aW9uOiAwLjNzO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgcG9zaXRpb246IGZpeGVkO1xuICAgIGJvdHRvbTogLTFweDtcbiAgICByaWdodDogLTFweDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGNvbG9yOiBibGFjaztcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBzYW5zLXNlcmlmICFpbXBvcnRhbnQ7XG4gICAgZm9udC1zaXplOiAxNHB4O1xuICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICB6LWluZGV4OiAxMDAwMDtcbiAgICBib3JkZXItcmFkaXVzOiA1cHggMCAwIDA7XG4gICAgcGFkZGluZzogMTVweCAwO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmNWY2ZmE7XG4gICAgYm94LXNoYWRvdzogMHB4IDAuOHB4IDAuOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMDQpLFxuICAgICAgICAwcHggMi4zcHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMDMpO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMCwgMjQsIDEwMiwgMC4xKTtcbn1cbi5kYXNoLWRlYnVnLW1lbnVfX291dGVyLmRhc2gtZGVidWctbWVudV9fb3V0ZXItLWNvbGxhcHNlZCB7XG4gICAgbWF4LXdpZHRoOiA1MHB4O1xufVxuLmRhc2gtZGVidWctbWVudV9fb3V0ZXIuZGFzaC1kZWJ1Zy1tZW51X19vdXRlci0tZXhwYW5kZWQge1xuICAgIG1heC13aWR0aDogY2FsYygxMDB2dyAtIDUwcHgpO1xufVxuXG4uZGFzaC1kZWJ1Zy1tZW51X191cGdyYWRlLXRvb2x0aXAge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBib3R0b206IGNhbGMoMTAwJSArIDEycHgpO1xuICAgIHJpZ2h0OiAwO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgICBib3JkZXItcmFkaXVzOiA2cHg7XG4gICAgYm9yZGVyOiAxcHggc29saWQgIzAwMTg2NjFhO1xuICAgIHBhZGRpbmc6IDExcHg7XG4gICAgYm94LXNoYWRvdzogMHB4IDBweCAxNHB4IDVweCAjMDAwMDAwMTI7XG4gICAgei1pbmRleDogMTIwMDtcbn1cblxuLmRhc2gtZGVidWctbWVudV9fdG9nZ2xlIHtcbiAgICBjb2xvcjogIzdmNGJjNDtcbiAgICB0cmFuc2l0aW9uOiAwLjNzO1xufVxuLmRhc2gtZGVidWctbWVudV9fdG9nZ2xlLS1leHBhbmRlZCB7XG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcbn1cbi5kYXNoLWRlYnVnLW1lbnVfX2Vycm9yLWluZGljYXRvciB7XG4gICAgd2lkdGg6IDhweDtcbiAgICBoZWlnaHQ6IDhweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjREMzRTQyO1xuICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHJpZ2h0OiAzcHg7XG4gICAgdG9wOiAxM3B4O1xufVxuLmRhc2gtZGVidWctbWVudV9fc3RhdHVzIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgZ2FwOiA2cHg7XG59XG5cbi5kYXNoLWRlYnVnLW1lbnVfX2NvbnRlbnQge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7XG4gICAgbWFyZ2luLWxlZnQ6IDE1cHg7XG4gICAgdHJhbnNpdGlvbjogYWxsIDAuNXMgZWFzZTtcbiAgICBmbGV4LXNocmluazogMDtcbn1cblxuLmRhc2gtZGVidWctbWVudV9fdmVyc2lvbiB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbn1cblxuLmRhc2gtZGVidWctbWVudV9fZGl2aWRlciB7XG4gICAgd2lkdGg6IDEuNXB4O1xuICAgIGhlaWdodDogMjZweDtcbiAgICBtYXJnaW46IDBweCAxM3B4O1xuICAgIGJhY2tncm91bmQtY29sb3I6ICMwMDE1NTk0ZDtcbn1cblxuLmRhc2gtZGVidWctbWVudV9fYnV0dG9uIHtcbiAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICBib3gtc2hhZG93OiAwIDFweCAjZDNkYWU2O1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMnM7XG4gICAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIHNhbnMtc2VyaWYgIWltcG9ydGFudDtcbiAgICBjb2xvcjogIzdmNGJjNDtcbn1cblxuLmRhc2gtZGVidWctbWVudV9fYnV0dG9uLmRhc2gtZGVidWctbWVudV9fYnV0dG9uLS1zZWxlY3RlZCB7XG4gICAgY29sb3I6ICM3ZjRiYzQ7XG4gICAgYm94LXNoYWRvdzogMCAycHggIzdmNGJjNDtcbn1cbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbi0tc2VsZWN0ZWQ6aG92ZXIge1xuICAgIGNvbG9yOiAjNTgwNmM0O1xufVxuXG4uZGFzaC1kZWJ1Zy1hbGVydCB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGZvbnQtc2l6ZTogMTBweDtcbn1cblxuLmRhc2gtZGVidWctYWxlcnQtbGFiZWwge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgcG9zaXRpb246IGZpeGVkO1xuICAgIGJvdHRvbTogODFweDtcbiAgICByaWdodDogMjlweDtcbiAgICB6LWluZGV4OiAxMDAwMjtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgYm94LXNoYWRvdzogMHB4IDBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjI1KSxcbiAgICAgICAgMHB4IDFweCAzcHggcmdiYSgxNjIsIDE3NywgMTk4LCAwLjMyKTtcbiAgICBib3JkZXItcmFkaXVzOiAzMnB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xuICAgIHBhZGRpbmc6IDRweDtcbiAgICBjb2xvcjogcmdiKDUwLCA1MCwgNTApO1xufVxuXG4uZGFzaC1kZWJ1Zy1tZW51X19lcnJvci1jb3VudCB7XG4gICAgZm9udC1zaXplOiAxMnB4O1xuICAgIGNvbG9yOiAjZmZmO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNjNzNhM2E7XG4gICAgcGFkZGluZzogM3B4IDVweDtcbiAgICBib3JkZXItcmFkaXVzOiAzcHg7XG59XG5cbi5kYXNoLWRlYnVnLWRpc2Nvbm5lY3RlZCB7XG4gICAgZm9udC1zaXplOiAxNHB4O1xuICAgIG1hcmdpbi1sZWZ0OiAzcHg7XG59XG4uZGFzaC1kZWJ1Zy1tZW51X19pY29uIHtcbiAgICBjb2xvcjogIzljYTNhZjtcbn1cbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbjpob3ZlciAuZGFzaC1kZWJ1Zy1tZW51X19pY29uIHtcbiAgICBjb2xvcjogIzU4MDZjNDtcbn1cbmAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvbWVudS9EZWJ1Z01lbnUuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO0lBQ0ksZ0JBQWdCO0lBQ2hCLGVBQWU7SUFDZixZQUFZO0lBQ1osV0FBVztJQUNYLGFBQWE7SUFDYix1QkFBdUI7SUFDdkIsbUJBQW1CO0lBQ25CLGNBQWM7SUFDZCx5QkFBeUI7SUFDekIsbUJBQW1CO0lBQ25CLFdBQVc7SUFDWCxZQUFZO0lBQ1osZUFBZTtBQUNuQjtBQUNBO0lBQ0ksMEJBQTBCO0FBQzlCOztBQUVBO0lBQ0ksWUFBWTtJQUNaLGNBQWM7SUFDZCxtQkFBbUI7SUFDbkIsb0JBQW9CO0lBQ3BCLGVBQWU7SUFDZixrQkFBa0I7SUFDbEIsc0JBQXNCO0lBQ3RCLG1CQUFtQjtJQUNuQixRQUFRO0lBQ1IsZUFBZTtJQUNmLFlBQVk7SUFDWixnQkFBZ0I7SUFDaEIsYUFBYTtJQUNiLGFBQWE7SUFDYixtQkFBbUI7QUFDdkI7O0FBRUE7SUFDSSxhQUFhO0lBQ2Isc0JBQXNCO0lBQ3RCLGtCQUFrQjtJQUNsQixZQUFZO0lBQ1osUUFBUTtJQUNSLFFBQVE7SUFDUiw4QkFBOEI7SUFDOUIseUJBQXlCO0FBQzdCOztBQUVBO0lBQ0ksYUFBYTtJQUNiLFlBQVk7SUFDWixhQUFhO0lBQ2Isc0JBQXNCO0lBQ3RCLHVCQUF1QjtJQUN2QixRQUFRO0lBQ1Isa0JBQWtCO0lBQ2xCLHVDQUF1QztJQUN2QyxnQkFBZ0I7SUFDaEIsb0JB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XG4gICAgcG9zaXRpb246IGZpeGVkO1xcbiAgICBib3R0b206IDM1cHg7XFxuICAgIHJpZ2h0OiAzNXB4O1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgei1pbmRleDogMTAwMDE7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICMxMTlkZmY7XFxuICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7XFxuICAgIHdpZHRoOiA2NHB4O1xcbiAgICBoZWlnaHQ6IDY0cHg7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuLmRhc2gtZGVidWctbWVudS0tb3BlbiB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKC0xODBkZWcpO1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1tZW51X19vdXRlciBidXR0b24ge1xcbiAgICBoZWlnaHQ6IGF1dG87XFxuICAgIHBhZGRpbmc6IDAgOHB4O1xcbiAgICBsaW5lLWhlaWdodDogbm9ybWFsO1xcbiAgICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG4gICAgZm9udC1zaXplOiAxNHB4O1xcbiAgICBib3JkZXItcmFkaXVzOiAwcHg7XFxuICAgIGxldHRlci1zcGFjaW5nOiBub3JtYWw7XFxuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxuICAgIGdhcDogNnB4O1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxuICAgIGJvcmRlcjogbm9uZTtcXG4gICAgYmFja2dyb3VuZDogbm9uZTtcXG4gICAgb3V0bGluZTogbm9uZTtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fcG9wdXAge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIGJvdHRvbTogMTAwJTtcXG4gICAgcmlnaHQ6IDA7XFxuICAgIGdhcDogOHB4O1xcbiAgICBtYXgtaGVpZ2h0OiBjYWxjKDEwMHZoIC0gNzVweCk7XFxuICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX3ZlcnNpb24tb3B0LW91dCB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIHdpZHRoOiA0MjZweDtcXG4gICAgcGFkZGluZzogMTZweDtcXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXG4gICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XFxuICAgIGdhcDogOHB4O1xcbiAgICBib3JkZXItcmFkaXVzOiA4cHg7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMCwgMjQsIDEwMiwgMC4xKTtcXG4gICAgYmFja2dyb3VuZDogI2ZmZjtcXG4gICAgYWxpZ24tc2VsZjogZmxleC1lbmQ7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gICAgLyogU2hhZG93L1NtYWxsICovXFxuICAgIGJveC1zaGFkb3c6IDBweCAwLjdweCAxLjRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjA3KSxcXG4gICAgICAgIDBweCAxLjlweCA0cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4wNSksXFxuICAgICAgICAwcHggNC41cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjA1KTtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fdmVyc2lvbi1vcHQtb3V0X190ZXh0IHtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1tZW51X192ZXJzaW9uLW9wdC1vdXRfX3RleHQgYSB7XFxuICAgIGNvbG9yOiAjN2Y0YmM0O1xcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX3ZlcnNpb24tb3B0LW91dF9fdGV4dCBzcGFuIHtcXG4gICAgbWFyZ2luLXJpZ2h0OiA1cHg7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX3ZlcnNpb24tb3B0LW91dCBidXR0b24ge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBoZWlnaHQ6IDI0cHg7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgbGluZS1oZWlnaHQ6IDE4cHg7XFxuICAgIHBhZGRpbmc6IDE2cHggMTJweDtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fdmVyc2lvbi1vcHQtb3V0X19idXR0b25zLWNvbnRhaW5lciB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGdhcDogOHB4O1xcbiAgICBhbGlnbi1zZWxmOiBzdHJldGNoO1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gICAgcGFkZGluZy10b3A6IDE2cHg7XFxuICAgIG1hcmdpbi10b3A6IDE2cHg7XFxuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCByZ2JhKDAsIDI0LCAxMDIsIDAuMSk7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX3ZlcnNpb24tb3B0LW91dF9fYnV0dG9uLXByaW1hcnkge1xcbiAgICBib3JkZXI6IG5vbmU7XFxuICAgIGNvbG9yOiAjZmZmO1xcbiAgICBiYWNrZ3JvdW5kOiAjN2Y0YmM0O1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1tZW51X192ZXJzaW9uLW9wdC1vdXRfX2J1dHRvbi1zZWNvbmRhcnkge1xcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDE2MSwgODksIDI1NSwgMC4wNSk7XFxuICAgIGNvbG9yOiAjN2Y0YmM0O1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDEzNCwgNzQsIDIxMiwgMC44KTtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudTpob3ZlciB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICM3ZjRiYzQ7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX291dGVyIHtcXG4gICAgdHJhbnNpdGlvbjogMC4zcztcXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gICAgcG9zaXRpb246IGZpeGVkO1xcbiAgICBib3R0b206IC0xcHg7XFxuICAgIHJpZ2h0OiAtMXB4O1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBjb2xvcjogYmxhY2s7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XFxuICAgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBzYW5zLXNlcmlmICFpbXBvcnRhbnQ7XFxuICAgIGZvbnQtc2l6ZTogMTRweDtcXG4gICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgei1pbmRleDogMTAwMDA7XFxuICAgIGJvcmRlci1yYWRpdXM6IDVweCAwIDAgMDtcXG4gICAgcGFkZGluZzogMTVweCAwO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNmZhO1xcbiAgICBib3gtc2hhZG93OiAwcHggMC44cHggMC44cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4wNCksXFxuICAgICAgICAwcHggMi4zcHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMDMpO1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDI0LCAxMDIsIDAuMSk7XFxufVxcbi5kYXNoLWRlYnVnLW1lbnVfX291dGVyLmRhc2gtZGVidWctbWVudV9fb3V0ZXItLWNvbGxhcHNlZCB7XFxuICAgIG1heC13aWR0aDogNTBweDtcXG59XFxuLmRhc2gtZGVidWctbWVudV9fb3V0ZXIuZGFzaC1kZWJ1Zy1tZW51X19vdXRlci0tZXhwYW5kZWQge1xcbiAgICBtYXgtd2lkdGg6IGNhbGMoMTAwdncgLSA1MHB4KTtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fdXBncmFkZS10b29sdGlwIHtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICBib3R0b206IGNhbGMoMTAwJSArIDEycHgpO1xcbiAgICByaWdodDogMDtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxuICAgIGJvcmRlci1yYWRpdXM6IDZweDtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgIzAwMTg2NjFhO1xcbiAgICBwYWRkaW5nOiAxMXB4O1xcbiAgICBib3gtc2hhZG93OiAwcHggMHB4IDE0cHggNXB4ICMwMDAwMDAxMjtcXG4gICAgei1pbmRleDogMTIwMDtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fdG9nZ2xlIHtcXG4gICAgY29sb3I6ICM3ZjRiYzQ7XFxuICAgIHRyYW5zaXRpb246IDAuM3M7XFxufVxcbi5kYXNoLWRlYnVnLW1lbnVfX3RvZ2dsZS0tZXhwYW5kZWQge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbn1cXG4uZGFzaC1kZWJ1Zy1tZW51X19lcnJvci1pbmRpY2F0b3Ige1xcbiAgICB3aWR0aDogOHB4O1xcbiAgICBoZWlnaHQ6IDhweDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0RDM0U0MjtcXG4gICAgYm9yZGVyLXJhZGl1czogMTAwJTtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICByaWdodDogM3B4O1xcbiAgICB0b3A6IDEzcHg7XFxufVxcbi5kYXNoLWRlYnVnLW1lbnVfX3N0YXR1cyB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIGdhcDogNnB4O1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1tZW51X19jb250ZW50IHtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7XFxuICAgIG1hcmdpbi1sZWZ0OiAxNXB4O1xcbiAgICB0cmFuc2l0aW9uOiBhbGwgMC41cyBlYXNlO1xcbiAgICBmbGV4LXNocmluazogMDtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fdmVyc2lvbiB7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fZGl2aWRlciB7XFxuICAgIHdpZHRoOiAxLjVweDtcXG4gICAgaGVpZ2h0OiAyNnB4O1xcbiAgICBtYXJnaW46IDBweCAxM3B4O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAxNTU5NGQ7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbiB7XFxuICAgIGJhY2tncm91bmQ6IG5vbmU7XFxuICAgIGJvcmRlcjogbm9uZTtcXG4gICAgYm94LXNoYWRvdzogMCAxcHggI2QzZGFlNjtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4ycztcXG4gICAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIHNhbnMtc2VyaWYgIWltcG9ydGFudDtcXG4gICAgY29sb3I6ICM3ZjRiYzQ7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbi0tc2VsZWN0ZWQge1xcbiAgICBjb2xvcjogIzdmNGJjNDtcXG4gICAgYm94LXNoYWRvdzogMCAycHggIzdmNGJjNDtcXG59XFxuLmRhc2gtZGVidWctbWVudV9fYnV0dG9uLmRhc2gtZGVidWctbWVudV9fYnV0dG9uLS1zZWxlY3RlZDpob3ZlciB7XFxuICAgIGNvbG9yOiAjNTgwNmM0O1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1hbGVydCB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIGZvbnQtc2l6ZTogMTBweDtcXG59XFxuXFxuLmRhc2gtZGVidWctYWxlcnQtbGFiZWwge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBwb3NpdGlvbjogZml4ZWQ7XFxuICAgIGJvdHRvbTogODFweDtcXG4gICAgcmlnaHQ6IDI5cHg7XFxuICAgIHotaW5kZXg6IDEwMDAyO1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxuICAgIGJveC1zaGFkb3c6IDBweCAwcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4yNSksXFxuICAgICAgICAwcHggMXB4IDNweCByZ2JhKDE2MiwgMTc3LCAxOTgsIDAuMzIpO1xcbiAgICBib3JkZXItcmFkaXVzOiAzMnB4O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXG4gICAgcGFkZGluZzogNHB4O1xcbiAgICBjb2xvcjogcmdiKDUwLCA1MCwgNTApO1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1tZW51X19lcnJvci1jb3VudCB7XFxuICAgIGZvbnQtc2l6ZTogMTJweDtcXG4gICAgY29sb3I6ICNmZmY7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNjNzNhM2E7XFxuICAgIHBhZGRpbmc6IDNweCA1cHg7XFxuICAgIGJvcmRlci1yYWRpdXM6IDNweDtcXG59XFxuXFxuLmRhc2gtZGVidWctZGlzY29ubmVjdGVkIHtcXG4gICAgZm9udC1zaXplOiAxNHB4O1xcbiAgICBtYXJnaW4tbGVmdDogM3B4O1xcbn1cXG4uZGFzaC1kZWJ1Zy1tZW51X19pY29uIHtcXG4gICAgY29sb3I6ICM5Y2EzYWY7XFxufVxcbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbjpob3ZlciAuZGFzaC1kZWJ1Zy1tZW51X19pY29uIHtcXG4gICAgY29sb3I6ICM1ODA2YzQ7XFxufVxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgLypcbiAgICBTYW1lIGFzIGluIHBsb3RseS1jbG91ZCBidXQgd2l0aG91dCB0aGUgcHVibGlzaFxuICAgIGluIHRoZSBuYW1lIHRvIGF2b2lkIGZ1dHVyZSBjb25mbGljdHMgaWYgY2hhbmdlZFxuICAgIHVwc3RyZWFtLlxuKi9cbi5wbG90bHktY2xvdWQtbW9kYWwtb3ZlcmxheSB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGJvdHRvbTogMTAwJTtcbiAgICBsZWZ0OiAtMXB4O1xuICAgIHotaW5kZXg6IDEwMDAwO1xufVxuXG4ucGxvdGx5LWNsb3VkLW1vZGFsLWNvbnRlbnQge1xuICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICB3aWR0aDogNTIycHg7XG4gICAgYmFja2dyb3VuZDogd2hpdGU7XG4gICAgYm9yZGVyOiAxcHggc29saWQgI2QxZDVkYjtcbiAgICBib3JkZXItcmFkaXVzOiA0cHggNHB4IDAgMDtcbiAgICBib3gtc2hhZG93OiAwIC00cHggNnB4IHJnYmEoMCwgMCwgMCwgMC4wOCk7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLnBsb3RseS1jbG91ZC1tb2RhbC1oZWFkZXIge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgcGFkZGluZzogMTZweCAyMHB4O1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZTVlNWU1O1xuICAgIGJhY2tncm91bmQ6ICNmOWZhZmI7XG59XG5cbi5wbG90bHktY2xvdWQtbW9kYWwtaGVhZGVyIGgzIHtcbiAgICBtYXJnaW46IDA7XG4gICAgY29sb3I6ICMzMzM7XG59XG5cbi5wbG90bHktY2xvdWQtbW9kYWwtY2xvc2Uge1xuICAgIGJhY2tncm91bmQ6IG5vbmU7XG4gICAgYm9yZGVyOiBub25lO1xuICAgIGZvbnQtc2l6ZTogMjRweDtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgY29sb3I6ICM2NjY7XG4gICAgcGFkZGluZzogMDtcbiAgICB3aWR0aDogMzBweDtcbiAgICBoZWlnaHQ6IDMwcHg7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xufVxuXG4ucGxvdGx5LWNsb3VkLW1vZGFsLWNsb3NlOmhvdmVyIHtcbiAgICBjb2xvcjogIzMzMztcbn1cblxuLnBsb3RseS1jbG91ZC1tb2RhbC1ib2R5IHtcbiAgICBwYWRkaW5nOiAyMHB4O1xuICAgIGNvbG9yOiBibGFjayAhaW1wb3J0YW50O1xuICAgIGZvbnQtd2VpZ2h0OiAxMDA7XG59XG5idXR0b24ucGxvdGx5LWNsb3VkLW1vZGFsLWJ1dHRvbiB7XG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBnYXA6IDZweDtcbiAgICBwYWRkaW5nOiA2cHggMTBweCAhaW1wb3J0YW50O1xuICAgIGJvcmRlci1yYWRpdXM6IDRweCAhaW1wb3J0YW50O1xuICAgIGZvbnQtc2l6ZTogMTJweCAhaW1wb3J0YW50O1xuICAgIGZvbnQtd2VpZ2h0OiA2MDAgIWltcG9ydGFudDtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gICAgYmFja2dyb3VuZDogIzhiNWNmNjtcbiAgICBjb2xvcjogd2hpdGU7XG4gICAgYm9yZGVyLWNvbG9yOiAjN2MzYWVkO1xufVxuXG4ucGxvdGx5LWNsb3VkLW1vZGFsLWJ1dHRvbjpkaXNhYmxlZCB7XG4gICAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbn1cbi5wbG90bHktY2xvdWQtY29weS1pbnN0YWxsIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgIGdhcDogMTBweDtcbiAgICBwYWRkaW5nOiA4cHggMTBweDtcbiAgICBiYWNrZ3JvdW5kOiAjZjlmYWZiO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICNlNWU3ZWI7XG4gICAgYm9yZGVyLXJhZGl1czogNnB4O1xuICAgIG1hcmdpbi10b3A6IDhweDtcbn1cbmAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvbWVudS9QbG90bHlDbG91ZC5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7Ozs7Q0FJQztBQUNEO0lBQ0ksa0JBQWtCO0lBQ2xCLFlBQVk7SUFDWixVQUFVO0lBQ1YsY0FBYztBQUNsQjs7QUFFQTtJQUNJLGtCQUFrQjtJQUNsQixZQUFZO0lBQ1osaUJBQWlCO0lBQ2pCLHlCQUF5QjtJQUN6QiwwQkFBMEI7SUFDMUIsMENBQTBDO0lBQzFDLGdCQUFnQjtBQUNwQjs7QUFFQTtJQUNJLGFBQWE7SUFDYiw4QkFBOEI7SUFDOUIsbUJBQW1CO0lBQ25CLGtCQUFrQjtJQUNsQixnQ0FBZ0M7SUFDaEMsbUJBQW1CO0FBQ3ZCOztBQUVBO0lBQ0ksU0FBUztJQUNULFdBQVc7QUFDZjs7QUFFQTtJQUNJLGdCQUFnQjtJQUNoQixZQUFZO0lBQ1osZUFBZTtJQUNmLGVBQWU7SUFDZixXQUFXO0lBQ1gsVUFBVTtJQUNWLFdBQVc7SUFDWCxZQUFZO0lBQ1osYUFBYTtJQUNiLG1CQUFtQjtJQUNuQix1QkFBdUI7QUFDM0I7O0FBRUE7SUFDSSxXQUFXO0FBQ2Y7O0FBRUE7SUFDSSxhQUFhO0lBQ2IsdUJBQXVCO0lBQ3ZCLGdCQUFnQjtBQUNwQjtBQUNBO0lBQ0ksb0JBQW9CO0lBQ3BCLG1CQUFtQjtJQUNuQixRQUFRO0lBQ1IsNEJBQTRCO0lBQzVCLDZCQUE2QjtJQUM3QiwwQkFBMEI7SUFDMUIsMkJBQTJCO0lBQzNCLGVBQWU7SUFDZiw2QkFBNkI7SUFDN0IsbUJBQW1CO0lBQ25CLFlBQVk7SUFDWixxQkFBcUI7QUFDekI7O0FBRUE7SUFDSSxtQkFBbUI7QUFDdkI7QUFDQTtJQUNJLGFBQWE7SUFDYixtQkFBbUI7SUFDbkIsOEJBQThCO0lBQzlCLFNBQVM7SUFDVCxpQkFBaUI7SUFDakIsbUJBQW1CO0lBQ25CLHlCQUF5QjtJQUN6QixrQkFBa0I7SUFDbEIsZUFBZTtBQUNuQlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCIvKlxcbiAgICBTYW1lIGFzIGluIHBsb3RseS1jbG91ZCBidXQgd2l0aG91dCB0aGUgcHVibGlzaFxcbiAgICBpbiB0aGUgbmFtZSB0byBhdm9pZCBmdXR1cmUgY29uZmxpY3RzIGlmIGNoYW5nZWRcXG4gICAgdXBzdHJlYW0uXFxuKi9cXG4ucGxvdGx5LWNsb3VkLW1vZGFsLW92ZXJsYXkge1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIGJvdHRvbTogMTAwJTtcXG4gICAgbGVmdDogLTFweDtcXG4gICAgei1pbmRleDogMTAwMDA7XFxufVxcblxcbi5wbG90bHktY2xvdWQtbW9kYWwtY29udGVudCB7XFxuICAgIGJvcmRlci1yYWRpdXM6IDhweDtcXG4gICAgd2lkdGg6IDUyMnB4O1xcbiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2QxZDVkYjtcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4IDRweCAwIDA7XFxuICAgIGJveC1zaGFkb3c6IDAgLTRweCA2cHggcmdiYSgwLCAwLCAwLCAwLjA4KTtcXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcXG59XFxuXFxuLnBsb3RseS1jbG91ZC1tb2RhbC1oZWFkZXIge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIHBhZGRpbmc6IDE2cHggMjBweDtcXG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlNWU1ZTU7XFxuICAgIGJhY2tncm91bmQ6ICNmOWZhZmI7XFxufVxcblxcbi5wbG90bHktY2xvdWQtbW9kYWwtaGVhZGVyIGgzIHtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBjb2xvcjogIzMzMztcXG59XFxuXFxuLnBsb3RseS1jbG91ZC1tb2RhbC1jbG9zZSB7XFxuICAgIGJhY2tncm91bmQ6IG5vbmU7XFxuICAgIGJvcmRlcjogbm9uZTtcXG4gICAgZm9udC1zaXplOiAyNHB4O1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxuICAgIGNvbG9yOiAjNjY2O1xcbiAgICBwYWRkaW5nOiAwO1xcbiAgICB3aWR0aDogMzBweDtcXG4gICAgaGVpZ2h0OiAzMHB4O1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG59XFxuXFxuLnBsb3RseS1jbG91ZC1tb2RhbC1jbG9zZTpob3ZlciB7XFxuICAgIGNvbG9yOiAjMzMzO1xcbn1cXG5cXG4ucGxvdGx5LWNsb3VkLW1vZGFsLWJvZHkge1xcbiAgICBwYWRkaW5nOiAyMHB4O1xcbiAgICBjb2xvcjogYmxhY2sgIWltcG9ydGFudDtcXG4gICAgZm9udC13ZWlnaHQ6IDEwMDtcXG59XFxuYnV0dG9uLnBsb3RseS1jbG91ZC1tb2RhbC1idXR0b24ge1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgZ2FwOiA2cHg7XFxuICAgIHBhZGRpbmc6IDZweCAxMHB4ICFpbXBvcnRhbnQ7XFxuICAgIGJvcmRlci1yYWRpdXM6IDRweCAhaW1wb3J0YW50O1xcbiAgICBmb250LXNpemU6IDEycHggIWltcG9ydGFudDtcXG4gICAgZm9udC13ZWlnaHQ6IDYwMCAhaW1wb3J0YW50O1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xcbiAgICBiYWNrZ3JvdW5kOiAjOGI1Y2Y2O1xcbiAgICBjb2xvcjogd2hpdGU7XFxuICAgIGJvcmRlci1jb2xvcjogIzdjM2FlZDtcXG59XFxuXFxuLnBsb3RseS1jbG91ZC1tb2RhbC1idXR0b246ZGlzYWJsZWQge1xcbiAgICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xcbn1cXG4ucGxvdGx5LWNsb3VkLWNvcHktaW5zdGFsbCB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcXG4gICAgZ2FwOiAxMHB4O1xcbiAgICBwYWRkaW5nOiA4cHggMTBweDtcXG4gICAgYmFja2dyb3VuZDogI2Y5ZmFmYjtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2U1ZTdlYjtcXG4gICAgYm9yZGVyLXJhZGl1czogNnB4O1xcbiAgICBtYXJnaW4tdG9wOiA4cHg7XFxufVxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgLmRhc2gtZGVidWctbWVudV9fdXBncmFkZS10b29sdGlwIGJ1dHRvbixcbi5kYXNoLWRlYnVnLW1lbnVfX3VwZ3JhZGUtdG9vbHRpcCBhIHtcbiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgcGFkZGluZzogMnB4IDVweDtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIGNvbG9yOiAjN2Y0YmM0O1xuICAgIGZvbnQtc2l6ZTogMTBwdDtcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIHNhbnMtc2VyaWYgIWltcG9ydGFudDtcbiAgICBmb250LXdlaWdodDogNTAwO1xuICAgIGxpbmUtaGVpZ2h0OiBub3JtYWw7XG59XG5cbi5kYXNoLWRlYnVnLW1lbnVfX3VwZ3JhZGUtdG9vbHRpcDphZnRlciB7XG4gICAgY29udGVudDogJyAnO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDEwMCU7XG4gICAgbGVmdDogNTAlO1xuICAgIG1hcmdpbi1sZWZ0OiAtNXB4O1xuICAgIGJvcmRlci13aWR0aDogMTBweDtcbiAgICBib3JkZXItc3R5bGU6IHNvbGlkO1xuICAgIGJvcmRlci1jb2xvcjogd2hpdGUgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7XG59XG5cbi5kYXNoLWRlYnVnLW1lbnVfX291dGVyIGJ1dHRvbi5kYXNoLWRlYnVnLW1lbnVfX3VwZ3JhZGUtYnV0dG9uIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjYTE1OWZmMGQ7XG4gICAgYm9yZGVyOiAxcHggc29saWQgIzg2NGFkNDMzO1xuICAgIGNvbG9yOiAjN2Y0YmM0O1xuICAgIG1hcmdpbi1sZWZ0OiAxMHB4O1xuICAgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBzYW5zLXNlcmlmICFpbXBvcnRhbnQ7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGhlaWdodDogMjBweDtcbiAgICBwYWRkaW5nOiAwcHggOHB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgICBmb250LXdlaWdodDogNTAwO1xufVxuXG4uZGFzaC1kZWJ1Zy1tZW51X191cGdyYWRlLWJ1dHRvbjpob3ZlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzg2NGFkNDMzO1xuICAgIGJvcmRlci1jb2xvcjogIzg2NGFkNDMzO1xuICAgIGNvbG9yOiAjN2Y0YmM0O1xufVxuYCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvY29tcG9uZW50cy9lcnJvci9tZW51L1ZlcnNpb25JbmZvLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTs7SUFFSSxpQkFBaUI7SUFDakIsWUFBWTtJQUNaLGdCQUFnQjtJQUNoQixtQkFBbUI7SUFDbkIsY0FBYztJQUNkLGVBQWU7SUFDZixxQkFBcUI7SUFDckIsZUFBZTtJQUNmLGFBQWE7SUFDYiwyQ0FBMkM7SUFDM0MsZ0JBQWdCO0lBQ2hCLG1CQUFtQjtBQUN2Qjs7QUFFQTtJQUNJLFlBQVk7SUFDWixrQkFBa0I7SUFDbEIsU0FBUztJQUNULFNBQVM7SUFDVCxpQkFBaUI7SUFDakIsa0JBQWtCO0lBQ2xCLG1CQUFtQjtJQUNuQix1REFBdUQ7QUFDM0Q7O0FBRUE7SUFDSSwyQkFBMkI7SUFDM0IsMkJBQTJCO0lBQzNCLGNBQWM7SUFDZCxpQkFBaUI7SUFDakIsMkNBQTJDO0lBQzNDLGVBQWU7SUFDZixZQUFZO0lBQ1osZ0JBQWdCO0lBQ2hCLGtCQUFrQjtJQUNsQixnQkFBZ0I7QUFDcEI7O0FBRUE7SUFDSSwyQkFBMkI7SUFDM0IsdUJBQXVCO0lBQ3ZCLGNBQWM7QUFDbEJcIixcInNvdXJjZXNDb250ZW50XCI6W1wiLmRhc2gtZGVidWctbWVudV9fdXBncmFkZS10b29sdGlwIGJ1dHRvbixcXG4uZGFzaC1kZWJ1Zy1tZW51X191cGdyYWRlLXRvb2x0aXAgYSB7XFxuICAgIGJhY2tncm91bmQ6IHdoaXRlO1xcbiAgICBib3JkZXI6IG5vbmU7XFxuICAgIHBhZGRpbmc6IDJweCA1cHg7XFxuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxuICAgIGNvbG9yOiAjN2Y0YmM0O1xcbiAgICBmb250LXNpemU6IDEwcHQ7XFxuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmb250LWZhbWlseTogVmVyZGFuYSwgc2Fucy1zZXJpZiAhaW1wb3J0YW50O1xcbiAgICBmb250LXdlaWdodDogNTAwO1xcbiAgICBsaW5lLWhlaWdodDogbm9ybWFsO1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1tZW51X191cGdyYWRlLXRvb2x0aXA6YWZ0ZXIge1xcbiAgICBjb250ZW50OiAnICc7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgdG9wOiAxMDAlO1xcbiAgICBsZWZ0OiA1MCU7XFxuICAgIG1hcmdpbi1sZWZ0OiAtNXB4O1xcbiAgICBib3JkZXItd2lkdGg6IDEwcHg7XFxuICAgIGJvcmRlci1zdHlsZTogc29saWQ7XFxuICAgIGJvcmRlci1jb2xvcjogd2hpdGUgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX291dGVyIGJ1dHRvbi5kYXNoLWRlYnVnLW1lbnVfX3VwZ3JhZGUtYnV0dG9uIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ExNTlmZjBkO1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjODY0YWQ0MzM7XFxuICAgIGNvbG9yOiAjN2Y0YmM0O1xcbiAgICBtYXJnaW4tbGVmdDogMTBweDtcXG4gICAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIHNhbnMtc2VyaWYgIWltcG9ydGFudDtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbiAgICBoZWlnaHQ6IDIwcHg7XFxuICAgIHBhZGRpbmc6IDBweCA4cHg7XFxuICAgIGJvcmRlci1yYWRpdXM6IDNweDtcXG4gICAgZm9udC13ZWlnaHQ6IDUwMDtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fdXBncmFkZS1idXR0b246aG92ZXIge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjODY0YWQ0MzM7XFxuICAgIGJvcmRlci1jb2xvcjogIzg2NGFkNDMzO1xcbiAgICBjb2xvcjogIzdmNGJjNDtcXG59XFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIlwidXNlIHN0cmljdFwiO1xuXG4vKlxuICBNSVQgTGljZW5zZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxuICBBdXRob3IgVG9iaWFzIEtvcHBlcnMgQHNva3JhXG4qL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoY3NzV2l0aE1hcHBpbmdUb1N0cmluZykge1xuICB2YXIgbGlzdCA9IFtdO1xuXG4gIC8vIHJldHVybiB0aGUgbGlzdCBvZiBtb2R1bGVzIGFzIGNzcyBzdHJpbmdcbiAgbGlzdC50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgdmFyIGNvbnRlbnQgPSBcIlwiO1xuICAgICAgdmFyIG5lZWRMYXllciA9IHR5cGVvZiBpdGVtWzVdICE9PSBcInVuZGVmaW5lZFwiO1xuICAgICAgaWYgKGl0ZW1bNF0pIHtcbiAgICAgICAgY29udGVudCArPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KGl0ZW1bNF0sIFwiKSB7XCIpO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW1bMl0pIHtcbiAgICAgICAgY29udGVudCArPSBcIkBtZWRpYSBcIi5jb25jYXQoaXRlbVsyXSwgXCIge1wiKTtcbiAgICAgIH1cbiAgICAgIGlmIChuZWVkTGF5ZXIpIHtcbiAgICAgICAgY29udGVudCArPSBcIkBsYXllclwiLmNvbmNhdChpdGVtWzVdLmxlbmd0aCA+IDAgPyBcIiBcIi5jb25jYXQoaXRlbVs1XSkgOiBcIlwiLCBcIiB7XCIpO1xuICAgICAgfVxuICAgICAgY29udGVudCArPSBjc3NXaXRoTWFwcGluZ1RvU3RyaW5nKGl0ZW0pO1xuICAgICAgaWYgKG5lZWRMYXllcikge1xuICAgICAgICBjb250ZW50ICs9IFwifVwiO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW1bMl0pIHtcbiAgICAgICAgY29udGVudCArPSBcIn1cIjtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtWzRdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29udGVudDtcbiAgICB9KS5qb2luKFwiXCIpO1xuICB9O1xuXG4gIC8vIGltcG9ydCBhIGxpc3Qgb2YgbW9kdWxlcyBpbnRvIHRoZSBsaXN0XG4gIGxpc3QuaSA9IGZ1bmN0aW9uIGkobW9kdWxlcywgbWVkaWEsIGRlZHVwZSwgc3VwcG9ydHMsIGxheWVyKSB7XG4gICAgaWYgKHR5cGVvZiBtb2R1bGVzID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBtb2R1bGVzID0gW1tudWxsLCBtb2R1bGVzLCB1bmRlZmluZWRdXTtcbiAgICB9XG4gICAgdmFyIGFscmVhZHlJbXBvcnRlZE1vZHVsZXMgPSB7fTtcbiAgICBpZiAoZGVkdXBlKSB7XG4gICAgICBmb3IgKHZhciBrID0gMDsgayA8IHRoaXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgdmFyIGlkID0gdGhpc1trXVswXTtcbiAgICAgICAgaWYgKGlkICE9IG51bGwpIHtcbiAgICAgICAgICBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2lkXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZm9yICh2YXIgX2sgPSAwOyBfayA8IG1vZHVsZXMubGVuZ3RoOyBfaysrKSB7XG4gICAgICB2YXIgaXRlbSA9IFtdLmNvbmNhdChtb2R1bGVzW19rXSk7XG4gICAgICBpZiAoZGVkdXBlICYmIGFscmVhZHlJbXBvcnRlZE1vZHVsZXNbaXRlbVswXV0pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGxheWVyICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaXRlbVs1XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIGl0ZW1bNV0gPSBsYXllcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAbGF5ZXJcIi5jb25jYXQoaXRlbVs1XS5sZW5ndGggPiAwID8gXCIgXCIuY29uY2F0KGl0ZW1bNV0pIDogXCJcIiwgXCIge1wiKS5jb25jYXQoaXRlbVsxXSwgXCJ9XCIpO1xuICAgICAgICAgIGl0ZW1bNV0gPSBsYXllcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG1lZGlhKSB7XG4gICAgICAgIGlmICghaXRlbVsyXSkge1xuICAgICAgICAgIGl0ZW1bMl0gPSBtZWRpYTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAbWVkaWEgXCIuY29uY2F0KGl0ZW1bMl0sIFwiIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzJdID0gbWVkaWE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzdXBwb3J0cykge1xuICAgICAgICBpZiAoIWl0ZW1bNF0pIHtcbiAgICAgICAgICBpdGVtWzRdID0gXCJcIi5jb25jYXQoc3VwcG9ydHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW1bMV0gPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KGl0ZW1bNF0sIFwiKSB7XCIpLmNvbmNhdChpdGVtWzFdLCBcIn1cIik7XG4gICAgICAgICAgaXRlbVs0XSA9IHN1cHBvcnRzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsaXN0LnB1c2goaXRlbSk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gbGlzdDtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgdmFyIGNvbnRlbnQgPSBpdGVtWzFdO1xuICB2YXIgY3NzTWFwcGluZyA9IGl0ZW1bM107XG4gIGlmICghY3NzTWFwcGluZykge1xuICAgIHJldHVybiBjb250ZW50O1xuICB9XG4gIGlmICh0eXBlb2YgYnRvYSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdmFyIGJhc2U2NCA9IGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KGNzc01hcHBpbmcpKSkpO1xuICAgIHZhciBkYXRhID0gXCJzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxcIi5jb25jYXQoYmFzZTY0KTtcbiAgICB2YXIgc291cmNlTWFwcGluZyA9IFwiLyojIFwiLmNvbmNhdChkYXRhLCBcIiAqL1wiKTtcbiAgICByZXR1cm4gW2NvbnRlbnRdLmNvbmNhdChbc291cmNlTWFwcGluZ10pLmpvaW4oXCJcXG5cIik7XG4gIH1cbiAgcmV0dXJuIFtjb250ZW50XS5qb2luKFwiXFxuXCIpO1xufTsiLCIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCJkYWdyZVwiKSk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXCJkYWdyZVwiXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJjeXRvc2NhcGVEYWdyZVwiXSA9IGZhY3RvcnkocmVxdWlyZShcImRhZ3JlXCIpKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJjeXRvc2NhcGVEYWdyZVwiXSA9IGZhY3Rvcnkocm9vdFtcImRhZ3JlXCJdKTtcbn0pKHRoaXMsIGZ1bmN0aW9uKF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzRfXykge1xucmV0dXJuIC8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0aTogbW9kdWxlSWQsXG4vKioqKioqLyBcdFx0XHRsOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubCA9IHRydWU7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4vKioqKioqLyBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4vKioqKioqLyBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4vKioqKioqLyBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuLyoqKioqKi8gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4vKioqKioqLyBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuLyoqKioqKi8gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4vKioqKioqLyBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4vKioqKioqLyBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbi8qKioqKiovIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuLyoqKioqKi8gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbi8qKioqKiovIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4vKioqKioqLyBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuLyoqKioqKi8gXHRcdHJldHVybiBucztcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuLyoqKioqKi8gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuLyoqKioqKi8gXHRcdHJldHVybiBnZXR0ZXI7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcbi8qKioqKiovXG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMCk7XG4vKioqKioqLyB9KVxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIChbXG4vKiAwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciBpbXBsID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTsgLy8gcmVnaXN0ZXJzIHRoZSBleHRlbnNpb24gb24gYSBjeXRvc2NhcGUgbGliIHJlZlxuXG5cbnZhciByZWdpc3RlciA9IGZ1bmN0aW9uIHJlZ2lzdGVyKGN5dG9zY2FwZSkge1xuICBpZiAoIWN5dG9zY2FwZSkge1xuICAgIHJldHVybjtcbiAgfSAvLyBjYW4ndCByZWdpc3RlciBpZiBjeXRvc2NhcGUgdW5zcGVjaWZpZWRcblxuXG4gIGN5dG9zY2FwZSgnbGF5b3V0JywgJ2RhZ3JlJywgaW1wbCk7IC8vIHJlZ2lzdGVyIHdpdGggY3l0b3NjYXBlLmpzXG59O1xuXG5pZiAodHlwZW9mIGN5dG9zY2FwZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgLy8gZXhwb3NlIHRvIGdsb2JhbCBjeXRvc2NhcGUgKGkuZS4gd2luZG93LmN5dG9zY2FwZSlcbiAgcmVnaXN0ZXIoY3l0b3NjYXBlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZWdpc3RlcjtcblxuLyoqKi8gfSksXG4vKiAxICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbmZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiKSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfTsgfSBlbHNlIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9OyB9IHJldHVybiBfdHlwZW9mKG9iaik7IH1cblxudmFyIGlzRnVuY3Rpb24gPSBmdW5jdGlvbiBpc0Z1bmN0aW9uKG8pIHtcbiAgcmV0dXJuIHR5cGVvZiBvID09PSAnZnVuY3Rpb24nO1xufTtcblxudmFyIGRlZmF1bHRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcblxudmFyIGFzc2lnbiA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7XG5cbnZhciBkYWdyZSA9IF9fd2VicGFja19yZXF1aXJlX18oNCk7IC8vIGNvbnN0cnVjdG9yXG4vLyBvcHRpb25zIDogb2JqZWN0IGNvbnRhaW5pbmcgbGF5b3V0IG9wdGlvbnNcblxuXG5mdW5jdGlvbiBEYWdyZUxheW91dChvcHRpb25zKSB7XG4gIHRoaXMub3B0aW9ucyA9IGFzc2lnbih7fSwgZGVmYXVsdHMsIG9wdGlvbnMpO1xufSAvLyBydW5zIHRoZSBsYXlvdXRcblxuXG5EYWdyZUxheW91dC5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgdmFyIGxheW91dCA9IHRoaXM7XG4gIHZhciBjeSA9IG9wdGlvbnMuY3k7IC8vIGN5IGlzIGF1dG9tYXRpY2FsbHkgcG9wdWxhdGVkIGZvciB1cyBpbiB0aGUgY29uc3RydWN0b3JcblxuICB2YXIgZWxlcyA9IG9wdGlvbnMuZWxlcztcblxuICB2YXIgZ2V0VmFsID0gZnVuY3Rpb24gZ2V0VmFsKGVsZSwgdmFsKSB7XG4gICAgcmV0dXJuIGlzRnVuY3Rpb24odmFsKSA/IHZhbC5hcHBseShlbGUsIFtlbGVdKSA6IHZhbDtcbiAgfTtcblxuICB2YXIgYmIgPSBvcHRpb25zLmJvdW5kaW5nQm94IHx8IHtcbiAgICB4MTogMCxcbiAgICB5MTogMCxcbiAgICB3OiBjeS53aWR0aCgpLFxuICAgIGg6IGN5LmhlaWdodCgpXG4gIH07XG5cbiAgaWYgKGJiLngyID09PSB1bmRlZmluZWQpIHtcbiAgICBiYi54MiA9IGJiLngxICsgYmIudztcbiAgfVxuXG4gIGlmIChiYi53ID09PSB1bmRlZmluZWQpIHtcbiAgICBiYi53ID0gYmIueDIgLSBiYi54MTtcbiAgfVxuXG4gIGlmIChiYi55MiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYmIueTIgPSBiYi55MSArIGJiLmg7XG4gIH1cblxuICBpZiAoYmIuaCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYmIuaCA9IGJiLnkyIC0gYmIueTE7XG4gIH1cblxuICB2YXIgZyA9IG5ldyBkYWdyZS5ncmFwaGxpYi5HcmFwaCh7XG4gICAgbXVsdGlncmFwaDogdHJ1ZSxcbiAgICBjb21wb3VuZDogdHJ1ZVxuICB9KTtcbiAgdmFyIGdPYmogPSB7fTtcblxuICB2YXIgc2V0R09iaiA9IGZ1bmN0aW9uIHNldEdPYmoobmFtZSwgdmFsKSB7XG4gICAgaWYgKHZhbCAhPSBudWxsKSB7XG4gICAgICBnT2JqW25hbWVdID0gdmFsO1xuICAgIH1cbiAgfTtcblxuICBzZXRHT2JqKCdub2Rlc2VwJywgb3B0aW9ucy5ub2RlU2VwKTtcbiAgc2V0R09iaignZWRnZXNlcCcsIG9wdGlvbnMuZWRnZVNlcCk7XG4gIHNldEdPYmooJ3JhbmtzZXAnLCBvcHRpb25zLnJhbmtTZXApO1xuICBzZXRHT2JqKCdyYW5rZGlyJywgb3B0aW9ucy5yYW5rRGlyKTtcbiAgc2V0R09iaignYWxpZ24nLCBvcHRpb25zLmFsaWduKTtcbiAgc2V0R09iaigncmFua2VyJywgb3B0aW9ucy5yYW5rZXIpO1xuICBzZXRHT2JqKCdhY3ljbGljZXInLCBvcHRpb25zLmFjeWNsaWNlcik7XG4gIGcuc2V0R3JhcGgoZ09iaik7XG4gIGcuc2V0RGVmYXVsdEVkZ2VMYWJlbChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9KTtcbiAgZy5zZXREZWZhdWx0Tm9kZUxhYmVsKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge307XG4gIH0pOyAvLyBhZGQgbm9kZXMgdG8gZGFncmVcblxuICB2YXIgbm9kZXMgPSBlbGVzLm5vZGVzKCk7XG5cbiAgaWYgKGlzRnVuY3Rpb24ob3B0aW9ucy5zb3J0KSkge1xuICAgIG5vZGVzID0gbm9kZXMuc29ydChvcHRpb25zLnNvcnQpO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBub2RlID0gbm9kZXNbaV07XG4gICAgdmFyIG5iYiA9IG5vZGUubGF5b3V0RGltZW5zaW9ucyhvcHRpb25zKTtcbiAgICBnLnNldE5vZGUobm9kZS5pZCgpLCB7XG4gICAgICB3aWR0aDogbmJiLncsXG4gICAgICBoZWlnaHQ6IG5iYi5oLFxuICAgICAgbmFtZTogbm9kZS5pZCgpXG4gICAgfSk7IC8vIGNvbnNvbGUubG9nKCBnLm5vZGUobm9kZS5pZCgpKSApO1xuICB9IC8vIHNldCBjb21wb3VuZCBwYXJlbnRzXG5cblxuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbm9kZXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgdmFyIF9ub2RlID0gbm9kZXNbX2ldO1xuXG4gICAgaWYgKF9ub2RlLmlzQ2hpbGQoKSkge1xuICAgICAgZy5zZXRQYXJlbnQoX25vZGUuaWQoKSwgX25vZGUucGFyZW50KCkuaWQoKSk7XG4gICAgfVxuICB9IC8vIGFkZCBlZGdlcyB0byBkYWdyZVxuXG5cbiAgdmFyIGVkZ2VzID0gZWxlcy5lZGdlcygpLnN0ZEZpbHRlcihmdW5jdGlvbiAoZWRnZSkge1xuICAgIHJldHVybiAhZWRnZS5zb3VyY2UoKS5pc1BhcmVudCgpICYmICFlZGdlLnRhcmdldCgpLmlzUGFyZW50KCk7IC8vIGRhZ3JlIGNhbid0IGhhbmRsZSBlZGdlcyBvbiBjb21wb3VuZCBub2Rlc1xuICB9KTtcblxuICBpZiAoaXNGdW5jdGlvbihvcHRpb25zLnNvcnQpKSB7XG4gICAgZWRnZXMgPSBlZGdlcy5zb3J0KG9wdGlvbnMuc29ydCk7XG4gIH1cblxuICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBlZGdlcy5sZW5ndGg7IF9pMisrKSB7XG4gICAgdmFyIGVkZ2UgPSBlZGdlc1tfaTJdO1xuICAgIGcuc2V0RWRnZShlZGdlLnNvdXJjZSgpLmlkKCksIGVkZ2UudGFyZ2V0KCkuaWQoKSwge1xuICAgICAgbWlubGVuOiBnZXRWYWwoZWRnZSwgb3B0aW9ucy5taW5MZW4pLFxuICAgICAgd2VpZ2h0OiBnZXRWYWwoZWRnZSwgb3B0aW9ucy5lZGdlV2VpZ2h0KSxcbiAgICAgIG5hbWU6IGVkZ2UuaWQoKVxuICAgIH0sIGVkZ2UuaWQoKSk7IC8vIGNvbnNvbGUubG9nKCBnLmVkZ2UoZWRnZS5zb3VyY2UoKS5pZCgpLCBlZGdlLnRhcmdldCgpLmlkKCksIGVkZ2UuaWQoKSkgKTtcbiAgfVxuXG4gIGRhZ3JlLmxheW91dChnKTtcbiAgdmFyIGdOb2RlSWRzID0gZy5ub2RlcygpO1xuXG4gIGZvciAodmFyIF9pMyA9IDA7IF9pMyA8IGdOb2RlSWRzLmxlbmd0aDsgX2kzKyspIHtcbiAgICB2YXIgaWQgPSBnTm9kZUlkc1tfaTNdO1xuICAgIHZhciBuID0gZy5ub2RlKGlkKTtcbiAgICBjeS5nZXRFbGVtZW50QnlJZChpZCkuc2NyYXRjaCgpLmRhZ3JlID0gbjtcbiAgfVxuXG4gIHZhciBkYWdyZUJCO1xuXG4gIGlmIChvcHRpb25zLmJvdW5kaW5nQm94KSB7XG4gICAgZGFncmVCQiA9IHtcbiAgICAgIHgxOiBJbmZpbml0eSxcbiAgICAgIHgyOiAtSW5maW5pdHksXG4gICAgICB5MTogSW5maW5pdHksXG4gICAgICB5MjogLUluZmluaXR5XG4gICAgfTtcbiAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICB2YXIgZE1vZGVsID0gbm9kZS5zY3JhdGNoKCkuZGFncmU7XG4gICAgICBkYWdyZUJCLngxID0gTWF0aC5taW4oZGFncmVCQi54MSwgZE1vZGVsLngpO1xuICAgICAgZGFncmVCQi54MiA9IE1hdGgubWF4KGRhZ3JlQkIueDIsIGRNb2RlbC54KTtcbiAgICAgIGRhZ3JlQkIueTEgPSBNYXRoLm1pbihkYWdyZUJCLnkxLCBkTW9kZWwueSk7XG4gICAgICBkYWdyZUJCLnkyID0gTWF0aC5tYXgoZGFncmVCQi55MiwgZE1vZGVsLnkpO1xuICAgIH0pO1xuICAgIGRhZ3JlQkIudyA9IGRhZ3JlQkIueDIgLSBkYWdyZUJCLngxO1xuICAgIGRhZ3JlQkIuaCA9IGRhZ3JlQkIueTIgLSBkYWdyZUJCLnkxO1xuICB9IGVsc2Uge1xuICAgIGRhZ3JlQkIgPSBiYjtcbiAgfVxuXG4gIHZhciBjb25zdHJhaW5Qb3MgPSBmdW5jdGlvbiBjb25zdHJhaW5Qb3MocCkge1xuICAgIGlmIChvcHRpb25zLmJvdW5kaW5nQm94KSB7XG4gICAgICB2YXIgeFBjdCA9IGRhZ3JlQkIudyA9PT0gMCA/IDAgOiAocC54IC0gZGFncmVCQi54MSkgLyBkYWdyZUJCLnc7XG4gICAgICB2YXIgeVBjdCA9IGRhZ3JlQkIuaCA9PT0gMCA/IDAgOiAocC55IC0gZGFncmVCQi55MSkgLyBkYWdyZUJCLmg7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4OiBiYi54MSArIHhQY3QgKiBiYi53LFxuICAgICAgICB5OiBiYi55MSArIHlQY3QgKiBiYi5oXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcDtcbiAgICB9XG4gIH07XG5cbiAgbm9kZXMubGF5b3V0UG9zaXRpb25zKGxheW91dCwgb3B0aW9ucywgZnVuY3Rpb24gKGVsZSkge1xuICAgIGVsZSA9IF90eXBlb2YoZWxlKSA9PT0gXCJvYmplY3RcIiA/IGVsZSA6IHRoaXM7XG4gICAgdmFyIGRNb2RlbCA9IGVsZS5zY3JhdGNoKCkuZGFncmU7XG4gICAgcmV0dXJuIGNvbnN0cmFpblBvcyh7XG4gICAgICB4OiBkTW9kZWwueCxcbiAgICAgIHk6IGRNb2RlbC55XG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gRGFncmVMYXlvdXQ7XG5cbi8qKiovIH0pLFxuLyogMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG52YXIgZGVmYXVsdHMgPSB7XG4gIC8vIGRhZ3JlIGFsZ28gb3B0aW9ucywgdXNlcyBkZWZhdWx0IHZhbHVlIG9uIHVuZGVmaW5lZFxuICBub2RlU2VwOiB1bmRlZmluZWQsXG4gIC8vIHRoZSBzZXBhcmF0aW9uIGJldHdlZW4gYWRqYWNlbnQgbm9kZXMgaW4gdGhlIHNhbWUgcmFua1xuICBlZGdlU2VwOiB1bmRlZmluZWQsXG4gIC8vIHRoZSBzZXBhcmF0aW9uIGJldHdlZW4gYWRqYWNlbnQgZWRnZXMgaW4gdGhlIHNhbWUgcmFua1xuICByYW5rU2VwOiB1bmRlZmluZWQsXG4gIC8vIHRoZSBzZXBhcmF0aW9uIGJldHdlZW4gYWRqYWNlbnQgbm9kZXMgaW4gdGhlIHNhbWUgcmFua1xuICByYW5rRGlyOiB1bmRlZmluZWQsXG4gIC8vICdUQicgZm9yIHRvcCB0byBib3R0b20gZmxvdywgJ0xSJyBmb3IgbGVmdCB0byByaWdodCxcbiAgYWxpZ246IHVuZGVmaW5lZCxcbiAgLy8gYWxpZ25tZW50IGZvciByYW5rIG5vZGVzLiBDYW4gYmUgJ1VMJywgJ1VSJywgJ0RMJywgb3IgJ0RSJywgd2hlcmUgVSA9IHVwLCBEID0gZG93biwgTCA9IGxlZnQsIGFuZCBSID0gcmlnaHRcbiAgYWN5Y2xpY2VyOiB1bmRlZmluZWQsXG4gIC8vIElmIHNldCB0byAnZ3JlZWR5JywgdXNlcyBhIGdyZWVkeSBoZXVyaXN0aWMgZm9yIGZpbmRpbmcgYSBmZWVkYmFjayBhcmMgc2V0IGZvciBhIGdyYXBoLlxuICAvLyBBIGZlZWRiYWNrIGFyYyBzZXQgaXMgYSBzZXQgb2YgZWRnZXMgdGhhdCBjYW4gYmUgcmVtb3ZlZCB0byBtYWtlIGEgZ3JhcGggYWN5Y2xpYy5cbiAgcmFua2VyOiB1bmRlZmluZWQsXG4gIC8vIFR5cGUgb2YgYWxnb3JpdGhtIHRvIGFzc2lnbnMgYSByYW5rIHRvIGVhY2ggbm9kZSBpbiB0aGUgaW5wdXQgZ3JhcGguXG4gIC8vIFBvc3NpYmxlIHZhbHVlczogbmV0d29yay1zaW1wbGV4LCB0aWdodC10cmVlIG9yIGxvbmdlc3QtcGF0aFxuICBtaW5MZW46IGZ1bmN0aW9uIG1pbkxlbihlZGdlKSB7XG4gICAgcmV0dXJuIDE7XG4gIH0sXG4gIC8vIG51bWJlciBvZiByYW5rcyB0byBrZWVwIGJldHdlZW4gdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IG9mIHRoZSBlZGdlXG4gIGVkZ2VXZWlnaHQ6IGZ1bmN0aW9uIGVkZ2VXZWlnaHQoZWRnZSkge1xuICAgIHJldHVybiAxO1xuICB9LFxuICAvLyBoaWdoZXIgd2VpZ2h0IGVkZ2VzIGFyZSBnZW5lcmFsbHkgbWFkZSBzaG9ydGVyIGFuZCBzdHJhaWdodGVyIHRoYW4gbG93ZXIgd2VpZ2h0IGVkZ2VzXG4gIC8vIGdlbmVyYWwgbGF5b3V0IG9wdGlvbnNcbiAgZml0OiB0cnVlLFxuICAvLyB3aGV0aGVyIHRvIGZpdCB0byB2aWV3cG9ydFxuICBwYWRkaW5nOiAzMCxcbiAgLy8gZml0IHBhZGRpbmdcbiAgc3BhY2luZ0ZhY3RvcjogdW5kZWZpbmVkLFxuICAvLyBBcHBsaWVzIGEgbXVsdGlwbGljYXRpdmUgZmFjdG9yICg+MCkgdG8gZXhwYW5kIG9yIGNvbXByZXNzIHRoZSBvdmVyYWxsIGFyZWEgdGhhdCB0aGUgbm9kZXMgdGFrZSB1cFxuICBub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHM6IGZhbHNlLFxuICAvLyB3aGV0aGVyIGxhYmVscyBzaG91bGQgYmUgaW5jbHVkZWQgaW4gZGV0ZXJtaW5pbmcgdGhlIHNwYWNlIHVzZWQgYnkgYSBub2RlXG4gIGFuaW1hdGU6IGZhbHNlLFxuICAvLyB3aGV0aGVyIHRvIHRyYW5zaXRpb24gdGhlIG5vZGUgcG9zaXRpb25zXG4gIGFuaW1hdGVGaWx0ZXI6IGZ1bmN0aW9uIGFuaW1hdGVGaWx0ZXIobm9kZSwgaSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICAvLyB3aGV0aGVyIHRvIGFuaW1hdGUgc3BlY2lmaWMgbm9kZXMgd2hlbiBhbmltYXRpb24gaXMgb247IG5vbi1hbmltYXRlZCBub2RlcyBpbW1lZGlhdGVseSBnbyB0byB0aGVpciBmaW5hbCBwb3NpdGlvbnNcbiAgYW5pbWF0aW9uRHVyYXRpb246IDUwMCxcbiAgLy8gZHVyYXRpb24gb2YgYW5pbWF0aW9uIGluIG1zIGlmIGVuYWJsZWRcbiAgYW5pbWF0aW9uRWFzaW5nOiB1bmRlZmluZWQsXG4gIC8vIGVhc2luZyBvZiBhbmltYXRpb24gaWYgZW5hYmxlZFxuICBib3VuZGluZ0JveDogdW5kZWZpbmVkLFxuICAvLyBjb25zdHJhaW4gbGF5b3V0IGJvdW5kczsgeyB4MSwgeTEsIHgyLCB5MiB9IG9yIHsgeDEsIHkxLCB3LCBoIH1cbiAgdHJhbnNmb3JtOiBmdW5jdGlvbiB0cmFuc2Zvcm0obm9kZSwgcG9zKSB7XG4gICAgcmV0dXJuIHBvcztcbiAgfSxcbiAgLy8gYSBmdW5jdGlvbiB0aGF0IGFwcGxpZXMgYSB0cmFuc2Zvcm0gdG8gdGhlIGZpbmFsIG5vZGUgcG9zaXRpb25cbiAgcmVhZHk6IGZ1bmN0aW9uIHJlYWR5KCkge30sXG4gIC8vIG9uIGxheW91dHJlYWR5XG4gIHNvcnQ6IHVuZGVmaW5lZCxcbiAgLy8gYSBzb3J0aW5nIGZ1bmN0aW9uIHRvIG9yZGVyIHRoZSBub2RlcyBhbmQgZWRnZXM7IGUuZy4gZnVuY3Rpb24oYSwgYil7IHJldHVybiBhLmRhdGEoJ3dlaWdodCcpIC0gYi5kYXRhKCd3ZWlnaHQnKSB9XG4gIC8vIGJlY2F1c2UgY3l0b3NjYXBlIGRhZ3JlIGNyZWF0ZXMgYSBkaXJlY3RlZCBncmFwaCwgYW5kIGRpcmVjdGVkIGdyYXBocyB1c2UgdGhlIG5vZGUgb3JkZXIgYXMgYSB0aWUgYnJlYWtlciB3aGVuXG4gIC8vIGRlZmluaW5nIHRoZSB0b3BvbG9neSBvZiBhIGdyYXBoLCB0aGlzIHNvcnQgZnVuY3Rpb24gY2FuIGhlbHAgZW5zdXJlIHRoZSBjb3JyZWN0IG9yZGVyIG9mIHRoZSBub2Rlcy9lZGdlcy5cbiAgLy8gdGhpcyBmZWF0dXJlIGlzIG1vc3QgdXNlZnVsIHdoZW4gYWRkaW5nIGFuZCByZW1vdmluZyB0aGUgc2FtZSBub2RlcyBhbmQgZWRnZXMgbXVsdGlwbGUgdGltZXMgaW4gYSBncmFwaC5cbiAgc3RvcDogZnVuY3Rpb24gc3RvcCgpIHt9IC8vIG9uIGxheW91dHN0b3BcblxufTtcbm1vZHVsZS5leHBvcnRzID0gZGVmYXVsdHM7XG5cbi8qKiovIH0pLFxuLyogMyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG4vLyBTaW1wbGUsIGludGVybmFsIE9iamVjdC5hc3NpZ24oKSBwb2x5ZmlsbCBmb3Igb3B0aW9ucyBvYmplY3RzIGV0Yy5cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmFzc2lnbiAhPSBudWxsID8gT2JqZWN0LmFzc2lnbi5iaW5kKE9iamVjdCkgOiBmdW5jdGlvbiAodGd0KSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBzcmNzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBzcmNzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHNyY3MuZm9yRWFjaChmdW5jdGlvbiAoc3JjKSB7XG4gICAgT2JqZWN0LmtleXMoc3JjKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgICByZXR1cm4gdGd0W2tdID0gc3JjW2tdO1xuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIHRndDtcbn07XG5cbi8qKiovIH0pLFxuLyogNCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzRfXztcblxuLyoqKi8gfSlcbi8qKioqKiovIF0pO1xufSk7IiwiLypcbkNvcHlyaWdodCAoYykgMjAxMi0yMDE0IENocmlzIFBldHRpdHRcblxuUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxub2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xudG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG5mdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuXG5UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG5BVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG5MSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuVEhFIFNPRlRXQVJFLlxuKi9cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdyYXBobGliOiByZXF1aXJlKFwiLi9saWIvZ3JhcGhsaWJcIiksXG5cbiAgbGF5b3V0OiByZXF1aXJlKFwiLi9saWIvbGF5b3V0XCIpLFxuICBkZWJ1ZzogcmVxdWlyZShcIi4vbGliL2RlYnVnXCIpLFxuICB1dGlsOiB7XG4gICAgdGltZTogcmVxdWlyZShcIi4vbGliL3V0aWxcIikudGltZSxcbiAgICBub3RpbWU6IHJlcXVpcmUoXCIuL2xpYi91dGlsXCIpLm5vdGltZVxuICB9LFxuICB2ZXJzaW9uOiByZXF1aXJlKFwiLi9saWIvdmVyc2lvblwiKVxufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuL2xvZGFzaFwiKTtcbnZhciBncmVlZHlGQVMgPSByZXF1aXJlKFwiLi9ncmVlZHktZmFzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgcnVuOiBydW4sXG4gIHVuZG86IHVuZG9cbn07XG5cbmZ1bmN0aW9uIHJ1bihnKSB7XG4gIHZhciBmYXMgPSAoZy5ncmFwaCgpLmFjeWNsaWNlciA9PT0gXCJncmVlZHlcIlxuICAgID8gZ3JlZWR5RkFTKGcsIHdlaWdodEZuKGcpKVxuICAgIDogZGZzRkFTKGcpKTtcbiAgXy5mb3JFYWNoKGZhcywgZnVuY3Rpb24oZSkge1xuICAgIHZhciBsYWJlbCA9IGcuZWRnZShlKTtcbiAgICBnLnJlbW92ZUVkZ2UoZSk7XG4gICAgbGFiZWwuZm9yd2FyZE5hbWUgPSBlLm5hbWU7XG4gICAgbGFiZWwucmV2ZXJzZWQgPSB0cnVlO1xuICAgIGcuc2V0RWRnZShlLncsIGUudiwgbGFiZWwsIF8udW5pcXVlSWQoXCJyZXZcIikpO1xuICB9KTtcblxuICBmdW5jdGlvbiB3ZWlnaHRGbihnKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGUpIHtcbiAgICAgIHJldHVybiBnLmVkZ2UoZSkud2VpZ2h0O1xuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gZGZzRkFTKGcpIHtcbiAgdmFyIGZhcyA9IFtdO1xuICB2YXIgc3RhY2sgPSB7fTtcbiAgdmFyIHZpc2l0ZWQgPSB7fTtcblxuICBmdW5jdGlvbiBkZnModikge1xuICAgIGlmIChfLmhhcyh2aXNpdGVkLCB2KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2aXNpdGVkW3ZdID0gdHJ1ZTtcbiAgICBzdGFja1t2XSA9IHRydWU7XG4gICAgXy5mb3JFYWNoKGcub3V0RWRnZXModiksIGZ1bmN0aW9uKGUpIHtcbiAgICAgIGlmIChfLmhhcyhzdGFjaywgZS53KSkge1xuICAgICAgICBmYXMucHVzaChlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRmcyhlLncpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGRlbGV0ZSBzdGFja1t2XTtcbiAgfVxuXG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGRmcyk7XG4gIHJldHVybiBmYXM7XG59XG5cbmZ1bmN0aW9uIHVuZG8oZykge1xuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIGxhYmVsID0gZy5lZGdlKGUpO1xuICAgIGlmIChsYWJlbC5yZXZlcnNlZCkge1xuICAgICAgZy5yZW1vdmVFZGdlKGUpO1xuXG4gICAgICB2YXIgZm9yd2FyZE5hbWUgPSBsYWJlbC5mb3J3YXJkTmFtZTtcbiAgICAgIGRlbGV0ZSBsYWJlbC5yZXZlcnNlZDtcbiAgICAgIGRlbGV0ZSBsYWJlbC5mb3J3YXJkTmFtZTtcbiAgICAgIGcuc2V0RWRnZShlLncsIGUudiwgbGFiZWwsIGZvcndhcmROYW1lKTtcbiAgICB9XG4gIH0pO1xufVxuIiwidmFyIF8gPSByZXF1aXJlKFwiLi9sb2Rhc2hcIik7XG52YXIgdXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gYWRkQm9yZGVyU2VnbWVudHM7XG5cbmZ1bmN0aW9uIGFkZEJvcmRlclNlZ21lbnRzKGcpIHtcbiAgZnVuY3Rpb24gZGZzKHYpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBnLmNoaWxkcmVuKHYpO1xuICAgIHZhciBub2RlID0gZy5ub2RlKHYpO1xuICAgIGlmIChjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgIF8uZm9yRWFjaChjaGlsZHJlbiwgZGZzKTtcbiAgICB9XG5cbiAgICBpZiAoXy5oYXMobm9kZSwgXCJtaW5SYW5rXCIpKSB7XG4gICAgICBub2RlLmJvcmRlckxlZnQgPSBbXTtcbiAgICAgIG5vZGUuYm9yZGVyUmlnaHQgPSBbXTtcbiAgICAgIGZvciAodmFyIHJhbmsgPSBub2RlLm1pblJhbmssIG1heFJhbmsgPSBub2RlLm1heFJhbmsgKyAxO1xuICAgICAgICByYW5rIDwgbWF4UmFuaztcbiAgICAgICAgKytyYW5rKSB7XG4gICAgICAgIGFkZEJvcmRlck5vZGUoZywgXCJib3JkZXJMZWZ0XCIsIFwiX2JsXCIsIHYsIG5vZGUsIHJhbmspO1xuICAgICAgICBhZGRCb3JkZXJOb2RlKGcsIFwiYm9yZGVyUmlnaHRcIiwgXCJfYnJcIiwgdiwgbm9kZSwgcmFuayk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgXy5mb3JFYWNoKGcuY2hpbGRyZW4oKSwgZGZzKTtcbn1cblxuZnVuY3Rpb24gYWRkQm9yZGVyTm9kZShnLCBwcm9wLCBwcmVmaXgsIHNnLCBzZ05vZGUsIHJhbmspIHtcbiAgdmFyIGxhYmVsID0geyB3aWR0aDogMCwgaGVpZ2h0OiAwLCByYW5rOiByYW5rLCBib3JkZXJUeXBlOiBwcm9wIH07XG4gIHZhciBwcmV2ID0gc2dOb2RlW3Byb3BdW3JhbmsgLSAxXTtcbiAgdmFyIGN1cnIgPSB1dGlsLmFkZER1bW15Tm9kZShnLCBcImJvcmRlclwiLCBsYWJlbCwgcHJlZml4KTtcbiAgc2dOb2RlW3Byb3BdW3JhbmtdID0gY3VycjtcbiAgZy5zZXRQYXJlbnQoY3Vyciwgc2cpO1xuICBpZiAocHJldikge1xuICAgIGcuc2V0RWRnZShwcmV2LCBjdXJyLCB7IHdlaWdodDogMSB9KTtcbiAgfVxufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfID0gcmVxdWlyZShcIi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgYWRqdXN0OiBhZGp1c3QsXG4gIHVuZG86IHVuZG9cbn07XG5cbmZ1bmN0aW9uIGFkanVzdChnKSB7XG4gIHZhciByYW5rRGlyID0gZy5ncmFwaCgpLnJhbmtkaXIudG9Mb3dlckNhc2UoKTtcbiAgaWYgKHJhbmtEaXIgPT09IFwibHJcIiB8fCByYW5rRGlyID09PSBcInJsXCIpIHtcbiAgICBzd2FwV2lkdGhIZWlnaHQoZyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdW5kbyhnKSB7XG4gIHZhciByYW5rRGlyID0gZy5ncmFwaCgpLnJhbmtkaXIudG9Mb3dlckNhc2UoKTtcbiAgaWYgKHJhbmtEaXIgPT09IFwiYnRcIiB8fCByYW5rRGlyID09PSBcInJsXCIpIHtcbiAgICByZXZlcnNlWShnKTtcbiAgfVxuXG4gIGlmIChyYW5rRGlyID09PSBcImxyXCIgfHwgcmFua0RpciA9PT0gXCJybFwiKSB7XG4gICAgc3dhcFhZKGcpO1xuICAgIHN3YXBXaWR0aEhlaWdodChnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzd2FwV2lkdGhIZWlnaHQoZykge1xuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7IHN3YXBXaWR0aEhlaWdodE9uZShnLm5vZGUodikpOyB9KTtcbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkgeyBzd2FwV2lkdGhIZWlnaHRPbmUoZy5lZGdlKGUpKTsgfSk7XG59XG5cbmZ1bmN0aW9uIHN3YXBXaWR0aEhlaWdodE9uZShhdHRycykge1xuICB2YXIgdyA9IGF0dHJzLndpZHRoO1xuICBhdHRycy53aWR0aCA9IGF0dHJzLmhlaWdodDtcbiAgYXR0cnMuaGVpZ2h0ID0gdztcbn1cblxuZnVuY3Rpb24gcmV2ZXJzZVkoZykge1xuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7IHJldmVyc2VZT25lKGcubm9kZSh2KSk7IH0pO1xuXG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZWRnZSA9IGcuZWRnZShlKTtcbiAgICBfLmZvckVhY2goZWRnZS5wb2ludHMsIHJldmVyc2VZT25lKTtcbiAgICBpZiAoXy5oYXMoZWRnZSwgXCJ5XCIpKSB7XG4gICAgICByZXZlcnNlWU9uZShlZGdlKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZXZlcnNlWU9uZShhdHRycykge1xuICBhdHRycy55ID0gLWF0dHJzLnk7XG59XG5cbmZ1bmN0aW9uIHN3YXBYWShnKSB7XG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHsgc3dhcFhZT25lKGcubm9kZSh2KSk7IH0pO1xuXG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZWRnZSA9IGcuZWRnZShlKTtcbiAgICBfLmZvckVhY2goZWRnZS5wb2ludHMsIHN3YXBYWU9uZSk7XG4gICAgaWYgKF8uaGFzKGVkZ2UsIFwieFwiKSkge1xuICAgICAgc3dhcFhZT25lKGVkZ2UpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHN3YXBYWU9uZShhdHRycykge1xuICB2YXIgeCA9IGF0dHJzLng7XG4gIGF0dHJzLnggPSBhdHRycy55O1xuICBhdHRycy55ID0geDtcbn1cbiIsIi8qXG4gKiBTaW1wbGUgZG91Ymx5IGxpbmtlZCBsaXN0IGltcGxlbWVudGF0aW9uIGRlcml2ZWQgZnJvbSBDb3JtZW4sIGV0IGFsLixcbiAqIFwiSW50cm9kdWN0aW9uIHRvIEFsZ29yaXRobXNcIi5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IExpc3Q7XG5cbmZ1bmN0aW9uIExpc3QoKSB7XG4gIHZhciBzZW50aW5lbCA9IHt9O1xuICBzZW50aW5lbC5fbmV4dCA9IHNlbnRpbmVsLl9wcmV2ID0gc2VudGluZWw7XG4gIHRoaXMuX3NlbnRpbmVsID0gc2VudGluZWw7XG59XG5cbkxpc3QucHJvdG90eXBlLmRlcXVldWUgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHNlbnRpbmVsID0gdGhpcy5fc2VudGluZWw7XG4gIHZhciBlbnRyeSA9IHNlbnRpbmVsLl9wcmV2O1xuICBpZiAoZW50cnkgIT09IHNlbnRpbmVsKSB7XG4gICAgdW5saW5rKGVudHJ5KTtcbiAgICByZXR1cm4gZW50cnk7XG4gIH1cbn07XG5cbkxpc3QucHJvdG90eXBlLmVucXVldWUgPSBmdW5jdGlvbihlbnRyeSkge1xuICB2YXIgc2VudGluZWwgPSB0aGlzLl9zZW50aW5lbDtcbiAgaWYgKGVudHJ5Ll9wcmV2ICYmIGVudHJ5Ll9uZXh0KSB7XG4gICAgdW5saW5rKGVudHJ5KTtcbiAgfVxuICBlbnRyeS5fbmV4dCA9IHNlbnRpbmVsLl9uZXh0O1xuICBzZW50aW5lbC5fbmV4dC5fcHJldiA9IGVudHJ5O1xuICBzZW50aW5lbC5fbmV4dCA9IGVudHJ5O1xuICBlbnRyeS5fcHJldiA9IHNlbnRpbmVsO1xufTtcblxuTGlzdC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHN0cnMgPSBbXTtcbiAgdmFyIHNlbnRpbmVsID0gdGhpcy5fc2VudGluZWw7XG4gIHZhciBjdXJyID0gc2VudGluZWwuX3ByZXY7XG4gIHdoaWxlIChjdXJyICE9PSBzZW50aW5lbCkge1xuICAgIHN0cnMucHVzaChKU09OLnN0cmluZ2lmeShjdXJyLCBmaWx0ZXJPdXRMaW5rcykpO1xuICAgIGN1cnIgPSBjdXJyLl9wcmV2O1xuICB9XG4gIHJldHVybiBcIltcIiArIHN0cnMuam9pbihcIiwgXCIpICsgXCJdXCI7XG59O1xuXG5mdW5jdGlvbiB1bmxpbmsoZW50cnkpIHtcbiAgZW50cnkuX3ByZXYuX25leHQgPSBlbnRyeS5fbmV4dDtcbiAgZW50cnkuX25leHQuX3ByZXYgPSBlbnRyeS5fcHJldjtcbiAgZGVsZXRlIGVudHJ5Ll9uZXh0O1xuICBkZWxldGUgZW50cnkuX3ByZXY7XG59XG5cbmZ1bmN0aW9uIGZpbHRlck91dExpbmtzKGssIHYpIHtcbiAgaWYgKGsgIT09IFwiX25leHRcIiAmJiBrICE9PSBcIl9wcmV2XCIpIHtcbiAgICByZXR1cm4gdjtcbiAgfVxufVxuIiwidmFyIF8gPSByZXF1aXJlKFwiLi9sb2Rhc2hcIik7XG52YXIgdXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG52YXIgR3JhcGggPSByZXF1aXJlKFwiLi9ncmFwaGxpYlwiKS5HcmFwaDtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGRlYnVnT3JkZXJpbmc6IGRlYnVnT3JkZXJpbmdcbn07XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5mdW5jdGlvbiBkZWJ1Z09yZGVyaW5nKGcpIHtcbiAgdmFyIGxheWVyTWF0cml4ID0gdXRpbC5idWlsZExheWVyTWF0cml4KGcpO1xuXG4gIHZhciBoID0gbmV3IEdyYXBoKHsgY29tcG91bmQ6IHRydWUsIG11bHRpZ3JhcGg6IHRydWUgfSkuc2V0R3JhcGgoe30pO1xuXG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICBoLnNldE5vZGUodiwgeyBsYWJlbDogdiB9KTtcbiAgICBoLnNldFBhcmVudCh2LCBcImxheWVyXCIgKyBnLm5vZGUodikucmFuayk7XG4gIH0pO1xuXG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICBoLnNldEVkZ2UoZS52LCBlLncsIHt9LCBlLm5hbWUpO1xuICB9KTtcblxuICBfLmZvckVhY2gobGF5ZXJNYXRyaXgsIGZ1bmN0aW9uKGxheWVyLCBpKSB7XG4gICAgdmFyIGxheWVyViA9IFwibGF5ZXJcIiArIGk7XG4gICAgaC5zZXROb2RlKGxheWVyViwgeyByYW5rOiBcInNhbWVcIiB9KTtcbiAgICBfLnJlZHVjZShsYXllciwgZnVuY3Rpb24odSwgdikge1xuICAgICAgaC5zZXRFZGdlKHUsIHYsIHsgc3R5bGU6IFwiaW52aXNcIiB9KTtcbiAgICAgIHJldHVybiB2O1xuICAgIH0pO1xuICB9KTtcblxuICByZXR1cm4gaDtcbn1cbiIsIi8qIGdsb2JhbCB3aW5kb3cgKi9cblxudmFyIGdyYXBobGliO1xuXG5pZiAodHlwZW9mIHJlcXVpcmUgPT09IFwiZnVuY3Rpb25cIikge1xuICB0cnkge1xuICAgIGdyYXBobGliID0gcmVxdWlyZShcImdyYXBobGliXCIpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gY29udGludWUgcmVnYXJkbGVzcyBvZiBlcnJvclxuICB9XG59XG5cbmlmICghZ3JhcGhsaWIpIHtcbiAgZ3JhcGhsaWIgPSB3aW5kb3cuZ3JhcGhsaWI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ3JhcGhsaWI7XG4iLCJ2YXIgXyA9IHJlcXVpcmUoXCIuL2xvZGFzaFwiKTtcbnZhciBHcmFwaCA9IHJlcXVpcmUoXCIuL2dyYXBobGliXCIpLkdyYXBoO1xudmFyIExpc3QgPSByZXF1aXJlKFwiLi9kYXRhL2xpc3RcIik7XG5cbi8qXG4gKiBBIGdyZWVkeSBoZXVyaXN0aWMgZm9yIGZpbmRpbmcgYSBmZWVkYmFjayBhcmMgc2V0IGZvciBhIGdyYXBoLiBBIGZlZWRiYWNrXG4gKiBhcmMgc2V0IGlzIGEgc2V0IG9mIGVkZ2VzIHRoYXQgY2FuIGJlIHJlbW92ZWQgdG8gbWFrZSBhIGdyYXBoIGFjeWNsaWMuXG4gKiBUaGUgYWxnb3JpdGhtIGNvbWVzIGZyb206IFAuIEVhZGVzLCBYLiBMaW4sIGFuZCBXLiBGLiBTbXl0aCwgXCJBIGZhc3QgYW5kXG4gKiBlZmZlY3RpdmUgaGV1cmlzdGljIGZvciB0aGUgZmVlZGJhY2sgYXJjIHNldCBwcm9ibGVtLlwiIFRoaXMgaW1wbGVtZW50YXRpb25cbiAqIGFkanVzdHMgdGhhdCBmcm9tIHRoZSBwYXBlciB0byBhbGxvdyBmb3Igd2VpZ2h0ZWQgZWRnZXMuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZ3JlZWR5RkFTO1xuXG52YXIgREVGQVVMVF9XRUlHSFRfRk4gPSBfLmNvbnN0YW50KDEpO1xuXG5mdW5jdGlvbiBncmVlZHlGQVMoZywgd2VpZ2h0Rm4pIHtcbiAgaWYgKGcubm9kZUNvdW50KCkgPD0gMSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICB2YXIgc3RhdGUgPSBidWlsZFN0YXRlKGcsIHdlaWdodEZuIHx8IERFRkFVTFRfV0VJR0hUX0ZOKTtcbiAgdmFyIHJlc3VsdHMgPSBkb0dyZWVkeUZBUyhzdGF0ZS5ncmFwaCwgc3RhdGUuYnVja2V0cywgc3RhdGUuemVyb0lkeCk7XG5cbiAgLy8gRXhwYW5kIG11bHRpLWVkZ2VzXG4gIHJldHVybiBfLmZsYXR0ZW4oXy5tYXAocmVzdWx0cywgZnVuY3Rpb24oZSkge1xuICAgIHJldHVybiBnLm91dEVkZ2VzKGUudiwgZS53KTtcbiAgfSksIHRydWUpO1xufVxuXG5mdW5jdGlvbiBkb0dyZWVkeUZBUyhnLCBidWNrZXRzLCB6ZXJvSWR4KSB7XG4gIHZhciByZXN1bHRzID0gW107XG4gIHZhciBzb3VyY2VzID0gYnVja2V0c1tidWNrZXRzLmxlbmd0aCAtIDFdO1xuICB2YXIgc2lua3MgPSBidWNrZXRzWzBdO1xuXG4gIHZhciBlbnRyeTtcbiAgd2hpbGUgKGcubm9kZUNvdW50KCkpIHtcbiAgICB3aGlsZSAoKGVudHJ5ID0gc2lua3MuZGVxdWV1ZSgpKSkgICB7IHJlbW92ZU5vZGUoZywgYnVja2V0cywgemVyb0lkeCwgZW50cnkpOyB9XG4gICAgd2hpbGUgKChlbnRyeSA9IHNvdXJjZXMuZGVxdWV1ZSgpKSkgeyByZW1vdmVOb2RlKGcsIGJ1Y2tldHMsIHplcm9JZHgsIGVudHJ5KTsgfVxuICAgIGlmIChnLm5vZGVDb3VudCgpKSB7XG4gICAgICBmb3IgKHZhciBpID0gYnVja2V0cy5sZW5ndGggLSAyOyBpID4gMDsgLS1pKSB7XG4gICAgICAgIGVudHJ5ID0gYnVja2V0c1tpXS5kZXF1ZXVlKCk7XG4gICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgIHJlc3VsdHMgPSByZXN1bHRzLmNvbmNhdChyZW1vdmVOb2RlKGcsIGJ1Y2tldHMsIHplcm9JZHgsIGVudHJ5LCB0cnVlKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0cztcbn1cblxuZnVuY3Rpb24gcmVtb3ZlTm9kZShnLCBidWNrZXRzLCB6ZXJvSWR4LCBlbnRyeSwgY29sbGVjdFByZWRlY2Vzc29ycykge1xuICB2YXIgcmVzdWx0cyA9IGNvbGxlY3RQcmVkZWNlc3NvcnMgPyBbXSA6IHVuZGVmaW5lZDtcblxuICBfLmZvckVhY2goZy5pbkVkZ2VzKGVudHJ5LnYpLCBmdW5jdGlvbihlZGdlKSB7XG4gICAgdmFyIHdlaWdodCA9IGcuZWRnZShlZGdlKTtcbiAgICB2YXIgdUVudHJ5ID0gZy5ub2RlKGVkZ2Uudik7XG5cbiAgICBpZiAoY29sbGVjdFByZWRlY2Vzc29ycykge1xuICAgICAgcmVzdWx0cy5wdXNoKHsgdjogZWRnZS52LCB3OiBlZGdlLncgfSk7XG4gICAgfVxuXG4gICAgdUVudHJ5Lm91dCAtPSB3ZWlnaHQ7XG4gICAgYXNzaWduQnVja2V0KGJ1Y2tldHMsIHplcm9JZHgsIHVFbnRyeSk7XG4gIH0pO1xuXG4gIF8uZm9yRWFjaChnLm91dEVkZ2VzKGVudHJ5LnYpLCBmdW5jdGlvbihlZGdlKSB7XG4gICAgdmFyIHdlaWdodCA9IGcuZWRnZShlZGdlKTtcbiAgICB2YXIgdyA9IGVkZ2UudztcbiAgICB2YXIgd0VudHJ5ID0gZy5ub2RlKHcpO1xuICAgIHdFbnRyeVtcImluXCJdIC09IHdlaWdodDtcbiAgICBhc3NpZ25CdWNrZXQoYnVja2V0cywgemVyb0lkeCwgd0VudHJ5KTtcbiAgfSk7XG5cbiAgZy5yZW1vdmVOb2RlKGVudHJ5LnYpO1xuXG4gIHJldHVybiByZXN1bHRzO1xufVxuXG5mdW5jdGlvbiBidWlsZFN0YXRlKGcsIHdlaWdodEZuKSB7XG4gIHZhciBmYXNHcmFwaCA9IG5ldyBHcmFwaCgpO1xuICB2YXIgbWF4SW4gPSAwO1xuICB2YXIgbWF4T3V0ID0gMDtcblxuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgZmFzR3JhcGguc2V0Tm9kZSh2LCB7IHY6IHYsIFwiaW5cIjogMCwgb3V0OiAwIH0pO1xuICB9KTtcblxuICAvLyBBZ2dyZWdhdGUgd2VpZ2h0cyBvbiBub2RlcywgYnV0IGFsc28gc3VtIHRoZSB3ZWlnaHRzIGFjcm9zcyBtdWx0aS1lZGdlc1xuICAvLyBpbnRvIGEgc2luZ2xlIGVkZ2UgZm9yIHRoZSBmYXNHcmFwaC5cbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBwcmV2V2VpZ2h0ID0gZmFzR3JhcGguZWRnZShlLnYsIGUudykgfHwgMDtcbiAgICB2YXIgd2VpZ2h0ID0gd2VpZ2h0Rm4oZSk7XG4gICAgdmFyIGVkZ2VXZWlnaHQgPSBwcmV2V2VpZ2h0ICsgd2VpZ2h0O1xuICAgIGZhc0dyYXBoLnNldEVkZ2UoZS52LCBlLncsIGVkZ2VXZWlnaHQpO1xuICAgIG1heE91dCA9IE1hdGgubWF4KG1heE91dCwgZmFzR3JhcGgubm9kZShlLnYpLm91dCArPSB3ZWlnaHQpO1xuICAgIG1heEluICA9IE1hdGgubWF4KG1heEluLCAgZmFzR3JhcGgubm9kZShlLncpW1wiaW5cIl0gICs9IHdlaWdodCk7XG4gIH0pO1xuXG4gIHZhciBidWNrZXRzID0gXy5yYW5nZShtYXhPdXQgKyBtYXhJbiArIDMpLm1hcChmdW5jdGlvbigpIHsgcmV0dXJuIG5ldyBMaXN0KCk7IH0pO1xuICB2YXIgemVyb0lkeCA9IG1heEluICsgMTtcblxuICBfLmZvckVhY2goZmFzR3JhcGgubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIGFzc2lnbkJ1Y2tldChidWNrZXRzLCB6ZXJvSWR4LCBmYXNHcmFwaC5ub2RlKHYpKTtcbiAgfSk7XG5cbiAgcmV0dXJuIHsgZ3JhcGg6IGZhc0dyYXBoLCBidWNrZXRzOiBidWNrZXRzLCB6ZXJvSWR4OiB6ZXJvSWR4IH07XG59XG5cbmZ1bmN0aW9uIGFzc2lnbkJ1Y2tldChidWNrZXRzLCB6ZXJvSWR4LCBlbnRyeSkge1xuICBpZiAoIWVudHJ5Lm91dCkge1xuICAgIGJ1Y2tldHNbMF0uZW5xdWV1ZShlbnRyeSk7XG4gIH0gZWxzZSBpZiAoIWVudHJ5W1wiaW5cIl0pIHtcbiAgICBidWNrZXRzW2J1Y2tldHMubGVuZ3RoIC0gMV0uZW5xdWV1ZShlbnRyeSk7XG4gIH0gZWxzZSB7XG4gICAgYnVja2V0c1tlbnRyeS5vdXQgLSBlbnRyeVtcImluXCJdICsgemVyb0lkeF0uZW5xdWV1ZShlbnRyeSk7XG4gIH1cbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuL2xvZGFzaFwiKTtcbnZhciBhY3ljbGljID0gcmVxdWlyZShcIi4vYWN5Y2xpY1wiKTtcbnZhciBub3JtYWxpemUgPSByZXF1aXJlKFwiLi9ub3JtYWxpemVcIik7XG52YXIgcmFuayA9IHJlcXVpcmUoXCIuL3JhbmtcIik7XG52YXIgbm9ybWFsaXplUmFua3MgPSByZXF1aXJlKFwiLi91dGlsXCIpLm5vcm1hbGl6ZVJhbmtzO1xudmFyIHBhcmVudER1bW15Q2hhaW5zID0gcmVxdWlyZShcIi4vcGFyZW50LWR1bW15LWNoYWluc1wiKTtcbnZhciByZW1vdmVFbXB0eVJhbmtzID0gcmVxdWlyZShcIi4vdXRpbFwiKS5yZW1vdmVFbXB0eVJhbmtzO1xudmFyIG5lc3RpbmdHcmFwaCA9IHJlcXVpcmUoXCIuL25lc3RpbmctZ3JhcGhcIik7XG52YXIgYWRkQm9yZGVyU2VnbWVudHMgPSByZXF1aXJlKFwiLi9hZGQtYm9yZGVyLXNlZ21lbnRzXCIpO1xudmFyIGNvb3JkaW5hdGVTeXN0ZW0gPSByZXF1aXJlKFwiLi9jb29yZGluYXRlLXN5c3RlbVwiKTtcbnZhciBvcmRlciA9IHJlcXVpcmUoXCIuL29yZGVyXCIpO1xudmFyIHBvc2l0aW9uID0gcmVxdWlyZShcIi4vcG9zaXRpb25cIik7XG52YXIgdXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG52YXIgR3JhcGggPSByZXF1aXJlKFwiLi9ncmFwaGxpYlwiKS5HcmFwaDtcblxubW9kdWxlLmV4cG9ydHMgPSBsYXlvdXQ7XG5cbmZ1bmN0aW9uIGxheW91dChnLCBvcHRzKSB7XG4gIHZhciB0aW1lID0gb3B0cyAmJiBvcHRzLmRlYnVnVGltaW5nID8gdXRpbC50aW1lIDogdXRpbC5ub3RpbWU7XG4gIHRpbWUoXCJsYXlvdXRcIiwgZnVuY3Rpb24oKSB7XG4gICAgdmFyIGxheW91dEdyYXBoID0gXG4gICAgICB0aW1lKFwiICBidWlsZExheW91dEdyYXBoXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gYnVpbGRMYXlvdXRHcmFwaChnKTsgfSk7XG4gICAgdGltZShcIiAgcnVuTGF5b3V0XCIsICAgICAgICBmdW5jdGlvbigpIHsgcnVuTGF5b3V0KGxheW91dEdyYXBoLCB0aW1lKTsgfSk7XG4gICAgdGltZShcIiAgdXBkYXRlSW5wdXRHcmFwaFwiLCBmdW5jdGlvbigpIHsgdXBkYXRlSW5wdXRHcmFwaChnLCBsYXlvdXRHcmFwaCk7IH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcnVuTGF5b3V0KGcsIHRpbWUpIHtcbiAgdGltZShcIiAgICBtYWtlU3BhY2VGb3JFZGdlTGFiZWxzXCIsIGZ1bmN0aW9uKCkgeyBtYWtlU3BhY2VGb3JFZGdlTGFiZWxzKGcpOyB9KTtcbiAgdGltZShcIiAgICByZW1vdmVTZWxmRWRnZXNcIiwgICAgICAgIGZ1bmN0aW9uKCkgeyByZW1vdmVTZWxmRWRnZXMoZyk7IH0pO1xuICB0aW1lKFwiICAgIGFjeWNsaWNcIiwgICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7IGFjeWNsaWMucnVuKGcpOyB9KTtcbiAgdGltZShcIiAgICBuZXN0aW5nR3JhcGgucnVuXCIsICAgICAgIGZ1bmN0aW9uKCkgeyBuZXN0aW5nR3JhcGgucnVuKGcpOyB9KTtcbiAgdGltZShcIiAgICByYW5rXCIsICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCkgeyByYW5rKHV0aWwuYXNOb25Db21wb3VuZEdyYXBoKGcpKTsgfSk7XG4gIHRpbWUoXCIgICAgaW5qZWN0RWRnZUxhYmVsUHJveGllc1wiLCBmdW5jdGlvbigpIHsgaW5qZWN0RWRnZUxhYmVsUHJveGllcyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgcmVtb3ZlRW1wdHlSYW5rc1wiLCAgICAgICBmdW5jdGlvbigpIHsgcmVtb3ZlRW1wdHlSYW5rcyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgbmVzdGluZ0dyYXBoLmNsZWFudXBcIiwgICBmdW5jdGlvbigpIHsgbmVzdGluZ0dyYXBoLmNsZWFudXAoZyk7IH0pO1xuICB0aW1lKFwiICAgIG5vcm1hbGl6ZVJhbmtzXCIsICAgICAgICAgZnVuY3Rpb24oKSB7IG5vcm1hbGl6ZVJhbmtzKGcpOyB9KTtcbiAgdGltZShcIiAgICBhc3NpZ25SYW5rTWluTWF4XCIsICAgICAgIGZ1bmN0aW9uKCkgeyBhc3NpZ25SYW5rTWluTWF4KGcpOyB9KTtcbiAgdGltZShcIiAgICByZW1vdmVFZGdlTGFiZWxQcm94aWVzXCIsIGZ1bmN0aW9uKCkgeyByZW1vdmVFZGdlTGFiZWxQcm94aWVzKGcpOyB9KTtcbiAgdGltZShcIiAgICBub3JtYWxpemUucnVuXCIsICAgICAgICAgIGZ1bmN0aW9uKCkgeyBub3JtYWxpemUucnVuKGcpOyB9KTtcbiAgdGltZShcIiAgICBwYXJlbnREdW1teUNoYWluc1wiLCAgICAgIGZ1bmN0aW9uKCkgeyBwYXJlbnREdW1teUNoYWlucyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgYWRkQm9yZGVyU2VnbWVudHNcIiwgICAgICBmdW5jdGlvbigpIHsgYWRkQm9yZGVyU2VnbWVudHMoZyk7IH0pO1xuICB0aW1lKFwiICAgIG9yZGVyXCIsICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7IG9yZGVyKGcpOyB9KTtcbiAgdGltZShcIiAgICBpbnNlcnRTZWxmRWRnZXNcIiwgICAgICAgIGZ1bmN0aW9uKCkgeyBpbnNlcnRTZWxmRWRnZXMoZyk7IH0pO1xuICB0aW1lKFwiICAgIGFkanVzdENvb3JkaW5hdGVTeXN0ZW1cIiwgZnVuY3Rpb24oKSB7IGNvb3JkaW5hdGVTeXN0ZW0uYWRqdXN0KGcpOyB9KTtcbiAgdGltZShcIiAgICBwb3NpdGlvblwiLCAgICAgICAgICAgICAgIGZ1bmN0aW9uKCkgeyBwb3NpdGlvbihnKTsgfSk7XG4gIHRpbWUoXCIgICAgcG9zaXRpb25TZWxmRWRnZXNcIiwgICAgICBmdW5jdGlvbigpIHsgcG9zaXRpb25TZWxmRWRnZXMoZyk7IH0pO1xuICB0aW1lKFwiICAgIHJlbW92ZUJvcmRlck5vZGVzXCIsICAgICAgZnVuY3Rpb24oKSB7IHJlbW92ZUJvcmRlck5vZGVzKGcpOyB9KTtcbiAgdGltZShcIiAgICBub3JtYWxpemUudW5kb1wiLCAgICAgICAgIGZ1bmN0aW9uKCkgeyBub3JtYWxpemUudW5kbyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgZml4dXBFZGdlTGFiZWxDb29yZHNcIiwgICBmdW5jdGlvbigpIHsgZml4dXBFZGdlTGFiZWxDb29yZHMoZyk7IH0pO1xuICB0aW1lKFwiICAgIHVuZG9Db29yZGluYXRlU3lzdGVtXCIsICAgZnVuY3Rpb24oKSB7IGNvb3JkaW5hdGVTeXN0ZW0udW5kbyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgdHJhbnNsYXRlR3JhcGhcIiwgICAgICAgICBmdW5jdGlvbigpIHsgdHJhbnNsYXRlR3JhcGgoZyk7IH0pO1xuICB0aW1lKFwiICAgIGFzc2lnbk5vZGVJbnRlcnNlY3RzXCIsICAgZnVuY3Rpb24oKSB7IGFzc2lnbk5vZGVJbnRlcnNlY3RzKGcpOyB9KTtcbiAgdGltZShcIiAgICByZXZlcnNlUG9pbnRzXCIsICAgICAgICAgIGZ1bmN0aW9uKCkgeyByZXZlcnNlUG9pbnRzRm9yUmV2ZXJzZWRFZGdlcyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgYWN5Y2xpYy51bmRvXCIsICAgICAgICAgICBmdW5jdGlvbigpIHsgYWN5Y2xpYy51bmRvKGcpOyB9KTtcbn1cblxuLypcbiAqIENvcGllcyBmaW5hbCBsYXlvdXQgaW5mb3JtYXRpb24gZnJvbSB0aGUgbGF5b3V0IGdyYXBoIGJhY2sgdG8gdGhlIGlucHV0XG4gKiBncmFwaC4gVGhpcyBwcm9jZXNzIG9ubHkgY29waWVzIHdoaXRlbGlzdGVkIGF0dHJpYnV0ZXMgZnJvbSB0aGUgbGF5b3V0IGdyYXBoXG4gKiB0byB0aGUgaW5wdXQgZ3JhcGgsIHNvIGl0IHNlcnZlcyBhcyBhIGdvb2QgcGxhY2UgdG8gZGV0ZXJtaW5lIHdoYXRcbiAqIGF0dHJpYnV0ZXMgY2FuIGluZmx1ZW5jZSBsYXlvdXQuXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZUlucHV0R3JhcGgoaW5wdXRHcmFwaCwgbGF5b3V0R3JhcGgpIHtcbiAgXy5mb3JFYWNoKGlucHV0R3JhcGgubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHZhciBpbnB1dExhYmVsID0gaW5wdXRHcmFwaC5ub2RlKHYpO1xuICAgIHZhciBsYXlvdXRMYWJlbCA9IGxheW91dEdyYXBoLm5vZGUodik7XG5cbiAgICBpZiAoaW5wdXRMYWJlbCkge1xuICAgICAgaW5wdXRMYWJlbC54ID0gbGF5b3V0TGFiZWwueDtcbiAgICAgIGlucHV0TGFiZWwueSA9IGxheW91dExhYmVsLnk7XG5cbiAgICAgIGlmIChsYXlvdXRHcmFwaC5jaGlsZHJlbih2KS5sZW5ndGgpIHtcbiAgICAgICAgaW5wdXRMYWJlbC53aWR0aCA9IGxheW91dExhYmVsLndpZHRoO1xuICAgICAgICBpbnB1dExhYmVsLmhlaWdodCA9IGxheW91dExhYmVsLmhlaWdodDtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIF8uZm9yRWFjaChpbnB1dEdyYXBoLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgaW5wdXRMYWJlbCA9IGlucHV0R3JhcGguZWRnZShlKTtcbiAgICB2YXIgbGF5b3V0TGFiZWwgPSBsYXlvdXRHcmFwaC5lZGdlKGUpO1xuXG4gICAgaW5wdXRMYWJlbC5wb2ludHMgPSBsYXlvdXRMYWJlbC5wb2ludHM7XG4gICAgaWYgKF8uaGFzKGxheW91dExhYmVsLCBcInhcIikpIHtcbiAgICAgIGlucHV0TGFiZWwueCA9IGxheW91dExhYmVsLng7XG4gICAgICBpbnB1dExhYmVsLnkgPSBsYXlvdXRMYWJlbC55O1xuICAgIH1cbiAgfSk7XG5cbiAgaW5wdXRHcmFwaC5ncmFwaCgpLndpZHRoID0gbGF5b3V0R3JhcGguZ3JhcGgoKS53aWR0aDtcbiAgaW5wdXRHcmFwaC5ncmFwaCgpLmhlaWdodCA9IGxheW91dEdyYXBoLmdyYXBoKCkuaGVpZ2h0O1xufVxuXG52YXIgZ3JhcGhOdW1BdHRycyA9IFtcIm5vZGVzZXBcIiwgXCJlZGdlc2VwXCIsIFwicmFua3NlcFwiLCBcIm1hcmdpbnhcIiwgXCJtYXJnaW55XCJdO1xudmFyIGdyYXBoRGVmYXVsdHMgPSB7IHJhbmtzZXA6IDUwLCBlZGdlc2VwOiAyMCwgbm9kZXNlcDogNTAsIHJhbmtkaXI6IFwidGJcIiB9O1xudmFyIGdyYXBoQXR0cnMgPSBbXCJhY3ljbGljZXJcIiwgXCJyYW5rZXJcIiwgXCJyYW5rZGlyXCIsIFwiYWxpZ25cIl07XG52YXIgbm9kZU51bUF0dHJzID0gW1wid2lkdGhcIiwgXCJoZWlnaHRcIl07XG52YXIgbm9kZURlZmF1bHRzID0geyB3aWR0aDogMCwgaGVpZ2h0OiAwIH07XG52YXIgZWRnZU51bUF0dHJzID0gW1wibWlubGVuXCIsIFwid2VpZ2h0XCIsIFwid2lkdGhcIiwgXCJoZWlnaHRcIiwgXCJsYWJlbG9mZnNldFwiXTtcbnZhciBlZGdlRGVmYXVsdHMgPSB7XG4gIG1pbmxlbjogMSwgd2VpZ2h0OiAxLCB3aWR0aDogMCwgaGVpZ2h0OiAwLFxuICBsYWJlbG9mZnNldDogMTAsIGxhYmVscG9zOiBcInJcIlxufTtcbnZhciBlZGdlQXR0cnMgPSBbXCJsYWJlbHBvc1wiXTtcblxuLypcbiAqIENvbnN0cnVjdHMgYSBuZXcgZ3JhcGggZnJvbSB0aGUgaW5wdXQgZ3JhcGgsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciBsYXlvdXQuXG4gKiBUaGlzIHByb2Nlc3MgY29waWVzIG9ubHkgd2hpdGVsaXN0ZWQgYXR0cmlidXRlcyBmcm9tIHRoZSBpbnB1dCBncmFwaCB0byB0aGVcbiAqIGxheW91dCBncmFwaC4gVGh1cyB0aGlzIGZ1bmN0aW9uIHNlcnZlcyBhcyBhIGdvb2QgcGxhY2UgdG8gZGV0ZXJtaW5lIHdoYXRcbiAqIGF0dHJpYnV0ZXMgY2FuIGluZmx1ZW5jZSBsYXlvdXQuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkTGF5b3V0R3JhcGgoaW5wdXRHcmFwaCkge1xuICB2YXIgZyA9IG5ldyBHcmFwaCh7IG11bHRpZ3JhcGg6IHRydWUsIGNvbXBvdW5kOiB0cnVlIH0pO1xuICB2YXIgZ3JhcGggPSBjYW5vbmljYWxpemUoaW5wdXRHcmFwaC5ncmFwaCgpKTtcblxuICBnLnNldEdyYXBoKF8ubWVyZ2Uoe30sXG4gICAgZ3JhcGhEZWZhdWx0cyxcbiAgICBzZWxlY3ROdW1iZXJBdHRycyhncmFwaCwgZ3JhcGhOdW1BdHRycyksXG4gICAgXy5waWNrKGdyYXBoLCBncmFwaEF0dHJzKSkpO1xuXG4gIF8uZm9yRWFjaChpbnB1dEdyYXBoLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgbm9kZSA9IGNhbm9uaWNhbGl6ZShpbnB1dEdyYXBoLm5vZGUodikpO1xuICAgIGcuc2V0Tm9kZSh2LCBfLmRlZmF1bHRzKHNlbGVjdE51bWJlckF0dHJzKG5vZGUsIG5vZGVOdW1BdHRycyksIG5vZGVEZWZhdWx0cykpO1xuICAgIGcuc2V0UGFyZW50KHYsIGlucHV0R3JhcGgucGFyZW50KHYpKTtcbiAgfSk7XG5cbiAgXy5mb3JFYWNoKGlucHV0R3JhcGguZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBlZGdlID0gY2Fub25pY2FsaXplKGlucHV0R3JhcGguZWRnZShlKSk7XG4gICAgZy5zZXRFZGdlKGUsIF8ubWVyZ2Uoe30sXG4gICAgICBlZGdlRGVmYXVsdHMsXG4gICAgICBzZWxlY3ROdW1iZXJBdHRycyhlZGdlLCBlZGdlTnVtQXR0cnMpLFxuICAgICAgXy5waWNrKGVkZ2UsIGVkZ2VBdHRycykpKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGc7XG59XG5cbi8qXG4gKiBUaGlzIGlkZWEgY29tZXMgZnJvbSB0aGUgR2Fuc25lciBwYXBlcjogdG8gYWNjb3VudCBmb3IgZWRnZSBsYWJlbHMgaW4gb3VyXG4gKiBsYXlvdXQgd2Ugc3BsaXQgZWFjaCByYW5rIGluIGhhbGYgYnkgZG91YmxpbmcgbWlubGVuIGFuZCBoYWx2aW5nIHJhbmtzZXAuXG4gKiBUaGVuIHdlIGNhbiBwbGFjZSBsYWJlbHMgYXQgdGhlc2UgbWlkLXBvaW50cyBiZXR3ZWVuIG5vZGVzLlxuICpcbiAqIFdlIGFsc28gYWRkIHNvbWUgbWluaW1hbCBwYWRkaW5nIHRvIHRoZSB3aWR0aCB0byBwdXNoIHRoZSBsYWJlbCBmb3IgdGhlIGVkZ2VcbiAqIGF3YXkgZnJvbSB0aGUgZWRnZSBpdHNlbGYgYSBiaXQuXG4gKi9cbmZ1bmN0aW9uIG1ha2VTcGFjZUZvckVkZ2VMYWJlbHMoZykge1xuICB2YXIgZ3JhcGggPSBnLmdyYXBoKCk7XG4gIGdyYXBoLnJhbmtzZXAgLz0gMjtcbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBlZGdlID0gZy5lZGdlKGUpO1xuICAgIGVkZ2UubWlubGVuICo9IDI7XG4gICAgaWYgKGVkZ2UubGFiZWxwb3MudG9Mb3dlckNhc2UoKSAhPT0gXCJjXCIpIHtcbiAgICAgIGlmIChncmFwaC5yYW5rZGlyID09PSBcIlRCXCIgfHwgZ3JhcGgucmFua2RpciA9PT0gXCJCVFwiKSB7XG4gICAgICAgIGVkZ2Uud2lkdGggKz0gZWRnZS5sYWJlbG9mZnNldDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVkZ2UuaGVpZ2h0ICs9IGVkZ2UubGFiZWxvZmZzZXQ7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cblxuLypcbiAqIENyZWF0ZXMgdGVtcG9yYXJ5IGR1bW15IG5vZGVzIHRoYXQgY2FwdHVyZSB0aGUgcmFuayBpbiB3aGljaCBlYWNoIGVkZ2Unc1xuICogbGFiZWwgaXMgZ29pbmcgdG8sIGlmIGl0IGhhcyBvbmUgb2Ygbm9uLXplcm8gd2lkdGggYW5kIGhlaWdodC4gV2UgZG8gdGhpc1xuICogc28gdGhhdCB3ZSBjYW4gc2FmZWx5IHJlbW92ZSBlbXB0eSByYW5rcyB3aGlsZSBwcmVzZXJ2aW5nIGJhbGFuY2UgZm9yIHRoZVxuICogbGFiZWwncyBwb3NpdGlvbi5cbiAqL1xuZnVuY3Rpb24gaW5qZWN0RWRnZUxhYmVsUHJveGllcyhnKSB7XG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZWRnZSA9IGcuZWRnZShlKTtcbiAgICBpZiAoZWRnZS53aWR0aCAmJiBlZGdlLmhlaWdodCkge1xuICAgICAgdmFyIHYgPSBnLm5vZGUoZS52KTtcbiAgICAgIHZhciB3ID0gZy5ub2RlKGUudyk7XG4gICAgICB2YXIgbGFiZWwgPSB7IHJhbms6ICh3LnJhbmsgLSB2LnJhbmspIC8gMiArIHYucmFuaywgZTogZSB9O1xuICAgICAgdXRpbC5hZGREdW1teU5vZGUoZywgXCJlZGdlLXByb3h5XCIsIGxhYmVsLCBcIl9lcFwiKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhc3NpZ25SYW5rTWluTWF4KGcpIHtcbiAgdmFyIG1heFJhbmsgPSAwO1xuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgdmFyIG5vZGUgPSBnLm5vZGUodik7XG4gICAgaWYgKG5vZGUuYm9yZGVyVG9wKSB7XG4gICAgICBub2RlLm1pblJhbmsgPSBnLm5vZGUobm9kZS5ib3JkZXJUb3ApLnJhbms7XG4gICAgICBub2RlLm1heFJhbmsgPSBnLm5vZGUobm9kZS5ib3JkZXJCb3R0b20pLnJhbms7XG4gICAgICBtYXhSYW5rID0gXy5tYXgobWF4UmFuaywgbm9kZS5tYXhSYW5rKTtcbiAgICB9XG4gIH0pO1xuICBnLmdyYXBoKCkubWF4UmFuayA9IG1heFJhbms7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUVkZ2VMYWJlbFByb3hpZXMoZykge1xuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgdmFyIG5vZGUgPSBnLm5vZGUodik7XG4gICAgaWYgKG5vZGUuZHVtbXkgPT09IFwiZWRnZS1wcm94eVwiKSB7XG4gICAgICBnLmVkZ2Uobm9kZS5lKS5sYWJlbFJhbmsgPSBub2RlLnJhbms7XG4gICAgICBnLnJlbW92ZU5vZGUodik7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gdHJhbnNsYXRlR3JhcGgoZykge1xuICB2YXIgbWluWCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgdmFyIG1heFggPSAwO1xuICB2YXIgbWluWSA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgdmFyIG1heFkgPSAwO1xuICB2YXIgZ3JhcGhMYWJlbCA9IGcuZ3JhcGgoKTtcbiAgdmFyIG1hcmdpblggPSBncmFwaExhYmVsLm1hcmdpbnggfHwgMDtcbiAgdmFyIG1hcmdpblkgPSBncmFwaExhYmVsLm1hcmdpbnkgfHwgMDtcblxuICBmdW5jdGlvbiBnZXRFeHRyZW1lcyhhdHRycykge1xuICAgIHZhciB4ID0gYXR0cnMueDtcbiAgICB2YXIgeSA9IGF0dHJzLnk7XG4gICAgdmFyIHcgPSBhdHRycy53aWR0aDtcbiAgICB2YXIgaCA9IGF0dHJzLmhlaWdodDtcbiAgICBtaW5YID0gTWF0aC5taW4obWluWCwgeCAtIHcgLyAyKTtcbiAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgeCArIHcgLyAyKTtcbiAgICBtaW5ZID0gTWF0aC5taW4obWluWSwgeSAtIGggLyAyKTtcbiAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgeSArIGggLyAyKTtcbiAgfVxuXG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHsgZ2V0RXh0cmVtZXMoZy5ub2RlKHYpKTsgfSk7XG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZWRnZSA9IGcuZWRnZShlKTtcbiAgICBpZiAoXy5oYXMoZWRnZSwgXCJ4XCIpKSB7XG4gICAgICBnZXRFeHRyZW1lcyhlZGdlKTtcbiAgICB9XG4gIH0pO1xuXG4gIG1pblggLT0gbWFyZ2luWDtcbiAgbWluWSAtPSBtYXJnaW5ZO1xuXG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgbm9kZSA9IGcubm9kZSh2KTtcbiAgICBub2RlLnggLT0gbWluWDtcbiAgICBub2RlLnkgLT0gbWluWTtcbiAgfSk7XG5cbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBlZGdlID0gZy5lZGdlKGUpO1xuICAgIF8uZm9yRWFjaChlZGdlLnBvaW50cywgZnVuY3Rpb24ocCkge1xuICAgICAgcC54IC09IG1pblg7XG4gICAgICBwLnkgLT0gbWluWTtcbiAgICB9KTtcbiAgICBpZiAoXy5oYXMoZWRnZSwgXCJ4XCIpKSB7IGVkZ2UueCAtPSBtaW5YOyB9XG4gICAgaWYgKF8uaGFzKGVkZ2UsIFwieVwiKSkgeyBlZGdlLnkgLT0gbWluWTsgfVxuICB9KTtcblxuICBncmFwaExhYmVsLndpZHRoID0gbWF4WCAtIG1pblggKyBtYXJnaW5YO1xuICBncmFwaExhYmVsLmhlaWdodCA9IG1heFkgLSBtaW5ZICsgbWFyZ2luWTtcbn1cblxuZnVuY3Rpb24gYXNzaWduTm9kZUludGVyc2VjdHMoZykge1xuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIGVkZ2UgPSBnLmVkZ2UoZSk7XG4gICAgdmFyIG5vZGVWID0gZy5ub2RlKGUudik7XG4gICAgdmFyIG5vZGVXID0gZy5ub2RlKGUudyk7XG4gICAgdmFyIHAxLCBwMjtcbiAgICBpZiAoIWVkZ2UucG9pbnRzKSB7XG4gICAgICBlZGdlLnBvaW50cyA9IFtdO1xuICAgICAgcDEgPSBub2RlVztcbiAgICAgIHAyID0gbm9kZVY7XG4gICAgfSBlbHNlIHtcbiAgICAgIHAxID0gZWRnZS5wb2ludHNbMF07XG4gICAgICBwMiA9IGVkZ2UucG9pbnRzW2VkZ2UucG9pbnRzLmxlbmd0aCAtIDFdO1xuICAgIH1cbiAgICBlZGdlLnBvaW50cy51bnNoaWZ0KHV0aWwuaW50ZXJzZWN0UmVjdChub2RlViwgcDEpKTtcbiAgICBlZGdlLnBvaW50cy5wdXNoKHV0aWwuaW50ZXJzZWN0UmVjdChub2RlVywgcDIpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGZpeHVwRWRnZUxhYmVsQ29vcmRzKGcpIHtcbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBlZGdlID0gZy5lZGdlKGUpO1xuICAgIGlmIChfLmhhcyhlZGdlLCBcInhcIikpIHtcbiAgICAgIGlmIChlZGdlLmxhYmVscG9zID09PSBcImxcIiB8fCBlZGdlLmxhYmVscG9zID09PSBcInJcIikge1xuICAgICAgICBlZGdlLndpZHRoIC09IGVkZ2UubGFiZWxvZmZzZXQ7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKGVkZ2UubGFiZWxwb3MpIHtcbiAgICAgIGNhc2UgXCJsXCI6IGVkZ2UueCAtPSBlZGdlLndpZHRoIC8gMiArIGVkZ2UubGFiZWxvZmZzZXQ7IGJyZWFrO1xuICAgICAgY2FzZSBcInJcIjogZWRnZS54ICs9IGVkZ2Uud2lkdGggLyAyICsgZWRnZS5sYWJlbG9mZnNldDsgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gcmV2ZXJzZVBvaW50c0ZvclJldmVyc2VkRWRnZXMoZykge1xuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIGVkZ2UgPSBnLmVkZ2UoZSk7XG4gICAgaWYgKGVkZ2UucmV2ZXJzZWQpIHtcbiAgICAgIGVkZ2UucG9pbnRzLnJldmVyc2UoKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZW1vdmVCb3JkZXJOb2RlcyhnKSB7XG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICBpZiAoZy5jaGlsZHJlbih2KS5sZW5ndGgpIHtcbiAgICAgIHZhciBub2RlID0gZy5ub2RlKHYpO1xuICAgICAgdmFyIHQgPSBnLm5vZGUobm9kZS5ib3JkZXJUb3ApO1xuICAgICAgdmFyIGIgPSBnLm5vZGUobm9kZS5ib3JkZXJCb3R0b20pO1xuICAgICAgdmFyIGwgPSBnLm5vZGUoXy5sYXN0KG5vZGUuYm9yZGVyTGVmdCkpO1xuICAgICAgdmFyIHIgPSBnLm5vZGUoXy5sYXN0KG5vZGUuYm9yZGVyUmlnaHQpKTtcblxuICAgICAgbm9kZS53aWR0aCA9IE1hdGguYWJzKHIueCAtIGwueCk7XG4gICAgICBub2RlLmhlaWdodCA9IE1hdGguYWJzKGIueSAtIHQueSk7XG4gICAgICBub2RlLnggPSBsLnggKyBub2RlLndpZHRoIC8gMjtcbiAgICAgIG5vZGUueSA9IHQueSArIG5vZGUuaGVpZ2h0IC8gMjtcbiAgICB9XG4gIH0pO1xuXG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICBpZiAoZy5ub2RlKHYpLmR1bW15ID09PSBcImJvcmRlclwiKSB7XG4gICAgICBnLnJlbW92ZU5vZGUodik7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlU2VsZkVkZ2VzKGcpIHtcbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIGlmIChlLnYgPT09IGUudykge1xuICAgICAgdmFyIG5vZGUgPSBnLm5vZGUoZS52KTtcbiAgICAgIGlmICghbm9kZS5zZWxmRWRnZXMpIHtcbiAgICAgICAgbm9kZS5zZWxmRWRnZXMgPSBbXTtcbiAgICAgIH1cbiAgICAgIG5vZGUuc2VsZkVkZ2VzLnB1c2goeyBlOiBlLCBsYWJlbDogZy5lZGdlKGUpIH0pO1xuICAgICAgZy5yZW1vdmVFZGdlKGUpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGluc2VydFNlbGZFZGdlcyhnKSB7XG4gIHZhciBsYXllcnMgPSB1dGlsLmJ1aWxkTGF5ZXJNYXRyaXgoZyk7XG4gIF8uZm9yRWFjaChsYXllcnMsIGZ1bmN0aW9uKGxheWVyKSB7XG4gICAgdmFyIG9yZGVyU2hpZnQgPSAwO1xuICAgIF8uZm9yRWFjaChsYXllciwgZnVuY3Rpb24odiwgaSkge1xuICAgICAgdmFyIG5vZGUgPSBnLm5vZGUodik7XG4gICAgICBub2RlLm9yZGVyID0gaSArIG9yZGVyU2hpZnQ7XG4gICAgICBfLmZvckVhY2gobm9kZS5zZWxmRWRnZXMsIGZ1bmN0aW9uKHNlbGZFZGdlKSB7XG4gICAgICAgIHV0aWwuYWRkRHVtbXlOb2RlKGcsIFwic2VsZmVkZ2VcIiwge1xuICAgICAgICAgIHdpZHRoOiBzZWxmRWRnZS5sYWJlbC53aWR0aCxcbiAgICAgICAgICBoZWlnaHQ6IHNlbGZFZGdlLmxhYmVsLmhlaWdodCxcbiAgICAgICAgICByYW5rOiBub2RlLnJhbmssXG4gICAgICAgICAgb3JkZXI6IGkgKyAoKytvcmRlclNoaWZ0KSxcbiAgICAgICAgICBlOiBzZWxmRWRnZS5lLFxuICAgICAgICAgIGxhYmVsOiBzZWxmRWRnZS5sYWJlbFxuICAgICAgICB9LCBcIl9zZVwiKTtcbiAgICAgIH0pO1xuICAgICAgZGVsZXRlIG5vZGUuc2VsZkVkZ2VzO1xuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcG9zaXRpb25TZWxmRWRnZXMoZykge1xuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgdmFyIG5vZGUgPSBnLm5vZGUodik7XG4gICAgaWYgKG5vZGUuZHVtbXkgPT09IFwic2VsZmVkZ2VcIikge1xuICAgICAgdmFyIHNlbGZOb2RlID0gZy5ub2RlKG5vZGUuZS52KTtcbiAgICAgIHZhciB4ID0gc2VsZk5vZGUueCArIHNlbGZOb2RlLndpZHRoIC8gMjtcbiAgICAgIHZhciB5ID0gc2VsZk5vZGUueTtcbiAgICAgIHZhciBkeCA9IG5vZGUueCAtIHg7XG4gICAgICB2YXIgZHkgPSBzZWxmTm9kZS5oZWlnaHQgLyAyO1xuICAgICAgZy5zZXRFZGdlKG5vZGUuZSwgbm9kZS5sYWJlbCk7XG4gICAgICBnLnJlbW92ZU5vZGUodik7XG4gICAgICBub2RlLmxhYmVsLnBvaW50cyA9IFtcbiAgICAgICAgeyB4OiB4ICsgMiAqIGR4IC8gMywgeTogeSAtIGR5IH0sXG4gICAgICAgIHsgeDogeCArIDUgKiBkeCAvIDYsIHk6IHkgLSBkeSB9LFxuICAgICAgICB7IHg6IHggKyAgICAgZHggICAgLCB5OiB5IH0sXG4gICAgICAgIHsgeDogeCArIDUgKiBkeCAvIDYsIHk6IHkgKyBkeSB9LFxuICAgICAgICB7IHg6IHggKyAyICogZHggLyAzLCB5OiB5ICsgZHkgfVxuICAgICAgXTtcbiAgICAgIG5vZGUubGFiZWwueCA9IG5vZGUueDtcbiAgICAgIG5vZGUubGFiZWwueSA9IG5vZGUueTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzZWxlY3ROdW1iZXJBdHRycyhvYmosIGF0dHJzKSB7XG4gIHJldHVybiBfLm1hcFZhbHVlcyhfLnBpY2sob2JqLCBhdHRycyksIE51bWJlcik7XG59XG5cbmZ1bmN0aW9uIGNhbm9uaWNhbGl6ZShhdHRycykge1xuICB2YXIgbmV3QXR0cnMgPSB7fTtcbiAgXy5mb3JFYWNoKGF0dHJzLCBmdW5jdGlvbih2LCBrKSB7XG4gICAgbmV3QXR0cnNbay50b0xvd2VyQ2FzZSgpXSA9IHY7XG4gIH0pO1xuICByZXR1cm4gbmV3QXR0cnM7XG59XG4iLCIvKiBnbG9iYWwgd2luZG93ICovXG5cbnZhciBsb2Rhc2g7XG5cbmlmICh0eXBlb2YgcmVxdWlyZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gIHRyeSB7XG4gICAgbG9kYXNoID0ge1xuICAgICAgY2xvbmVEZWVwOiByZXF1aXJlKFwibG9kYXNoL2Nsb25lRGVlcFwiKSxcbiAgICAgIGNvbnN0YW50OiByZXF1aXJlKFwibG9kYXNoL2NvbnN0YW50XCIpLFxuICAgICAgZGVmYXVsdHM6IHJlcXVpcmUoXCJsb2Rhc2gvZGVmYXVsdHNcIiksXG4gICAgICBlYWNoOiByZXF1aXJlKFwibG9kYXNoL2VhY2hcIiksXG4gICAgICBmaWx0ZXI6IHJlcXVpcmUoXCJsb2Rhc2gvZmlsdGVyXCIpLFxuICAgICAgZmluZDogcmVxdWlyZShcImxvZGFzaC9maW5kXCIpLFxuICAgICAgZmxhdHRlbjogcmVxdWlyZShcImxvZGFzaC9mbGF0dGVuXCIpLFxuICAgICAgZm9yRWFjaDogcmVxdWlyZShcImxvZGFzaC9mb3JFYWNoXCIpLFxuICAgICAgZm9ySW46IHJlcXVpcmUoXCJsb2Rhc2gvZm9ySW5cIiksXG4gICAgICBoYXM6ICByZXF1aXJlKFwibG9kYXNoL2hhc1wiKSxcbiAgICAgIGlzVW5kZWZpbmVkOiByZXF1aXJlKFwibG9kYXNoL2lzVW5kZWZpbmVkXCIpLFxuICAgICAgbGFzdDogcmVxdWlyZShcImxvZGFzaC9sYXN0XCIpLFxuICAgICAgbWFwOiByZXF1aXJlKFwibG9kYXNoL21hcFwiKSxcbiAgICAgIG1hcFZhbHVlczogcmVxdWlyZShcImxvZGFzaC9tYXBWYWx1ZXNcIiksXG4gICAgICBtYXg6IHJlcXVpcmUoXCJsb2Rhc2gvbWF4XCIpLFxuICAgICAgbWVyZ2U6IHJlcXVpcmUoXCJsb2Rhc2gvbWVyZ2VcIiksXG4gICAgICBtaW46IHJlcXVpcmUoXCJsb2Rhc2gvbWluXCIpLFxuICAgICAgbWluQnk6IHJlcXVpcmUoXCJsb2Rhc2gvbWluQnlcIiksXG4gICAgICBub3c6IHJlcXVpcmUoXCJsb2Rhc2gvbm93XCIpLFxuICAgICAgcGljazogcmVxdWlyZShcImxvZGFzaC9waWNrXCIpLFxuICAgICAgcmFuZ2U6IHJlcXVpcmUoXCJsb2Rhc2gvcmFuZ2VcIiksXG4gICAgICByZWR1Y2U6IHJlcXVpcmUoXCJsb2Rhc2gvcmVkdWNlXCIpLFxuICAgICAgc29ydEJ5OiByZXF1aXJlKFwibG9kYXNoL3NvcnRCeVwiKSxcbiAgICAgIHVuaXF1ZUlkOiByZXF1aXJlKFwibG9kYXNoL3VuaXF1ZUlkXCIpLFxuICAgICAgdmFsdWVzOiByZXF1aXJlKFwibG9kYXNoL3ZhbHVlc1wiKSxcbiAgICAgIHppcE9iamVjdDogcmVxdWlyZShcImxvZGFzaC96aXBPYmplY3RcIiksXG4gICAgfTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIGNvbnRpbnVlIHJlZ2FyZGxlc3Mgb2YgZXJyb3JcbiAgfVxufVxuXG5pZiAoIWxvZGFzaCkge1xuICBsb2Rhc2ggPSB3aW5kb3cuXztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsb2Rhc2g7XG4iLCJ2YXIgXyA9IHJlcXVpcmUoXCIuL2xvZGFzaFwiKTtcbnZhciB1dGlsID0gcmVxdWlyZShcIi4vdXRpbFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHJ1bjogcnVuLFxuICBjbGVhbnVwOiBjbGVhbnVwXG59O1xuXG4vKlxuICogQSBuZXN0aW5nIGdyYXBoIGNyZWF0ZXMgZHVtbXkgbm9kZXMgZm9yIHRoZSB0b3BzIGFuZCBib3R0b21zIG9mIHN1YmdyYXBocyxcbiAqIGFkZHMgYXBwcm9wcmlhdGUgZWRnZXMgdG8gZW5zdXJlIHRoYXQgYWxsIGNsdXN0ZXIgbm9kZXMgYXJlIHBsYWNlZCBiZXR3ZWVuXG4gKiB0aGVzZSBib3VuZHJpZXMsIGFuZCBlbnN1cmVzIHRoYXQgdGhlIGdyYXBoIGlzIGNvbm5lY3RlZC5cbiAqXG4gKiBJbiBhZGRpdGlvbiB3ZSBlbnN1cmUsIHRocm91Z2ggdGhlIHVzZSBvZiB0aGUgbWlubGVuIHByb3BlcnR5LCB0aGF0IG5vZGVzXG4gKiBhbmQgc3ViZ3JhcGggYm9yZGVyIG5vZGVzIHRvIG5vdCBlbmQgdXAgb24gdGhlIHNhbWUgcmFuay5cbiAqXG4gKiBQcmVjb25kaXRpb25zOlxuICpcbiAqICAgIDEuIElucHV0IGdyYXBoIGlzIGEgREFHXG4gKiAgICAyLiBOb2RlcyBpbiB0aGUgaW5wdXQgZ3JhcGggaGFzIGEgbWlubGVuIGF0dHJpYnV0ZVxuICpcbiAqIFBvc3Rjb25kaXRpb25zOlxuICpcbiAqICAgIDEuIElucHV0IGdyYXBoIGlzIGNvbm5lY3RlZC5cbiAqICAgIDIuIER1bW15IG5vZGVzIGFyZSBhZGRlZCBmb3IgdGhlIHRvcHMgYW5kIGJvdHRvbXMgb2Ygc3ViZ3JhcGhzLlxuICogICAgMy4gVGhlIG1pbmxlbiBhdHRyaWJ1dGUgZm9yIG5vZGVzIGlzIGFkanVzdGVkIHRvIGVuc3VyZSBub2RlcyBkbyBub3RcbiAqICAgICAgIGdldCBwbGFjZWQgb24gdGhlIHNhbWUgcmFuayBhcyBzdWJncmFwaCBib3JkZXIgbm9kZXMuXG4gKlxuICogVGhlIG5lc3RpbmcgZ3JhcGggaWRlYSBjb21lcyBmcm9tIFNhbmRlciwgXCJMYXlvdXQgb2YgQ29tcG91bmQgRGlyZWN0ZWRcbiAqIEdyYXBocy5cIlxuICovXG5mdW5jdGlvbiBydW4oZykge1xuICB2YXIgcm9vdCA9IHV0aWwuYWRkRHVtbXlOb2RlKGcsIFwicm9vdFwiLCB7fSwgXCJfcm9vdFwiKTtcbiAgdmFyIGRlcHRocyA9IHRyZWVEZXB0aHMoZyk7XG4gIHZhciBoZWlnaHQgPSBfLm1heChfLnZhbHVlcyhkZXB0aHMpKSAtIDE7IC8vIE5vdGU6IGRlcHRocyBpcyBhbiBPYmplY3Qgbm90IGFuIGFycmF5XG4gIHZhciBub2RlU2VwID0gMiAqIGhlaWdodCArIDE7XG5cbiAgZy5ncmFwaCgpLm5lc3RpbmdSb290ID0gcm9vdDtcblxuICAvLyBNdWx0aXBseSBtaW5sZW4gYnkgbm9kZVNlcCB0byBhbGlnbiBub2RlcyBvbiBub24tYm9yZGVyIHJhbmtzLlxuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7IGcuZWRnZShlKS5taW5sZW4gKj0gbm9kZVNlcDsgfSk7XG5cbiAgLy8gQ2FsY3VsYXRlIGEgd2VpZ2h0IHRoYXQgaXMgc3VmZmljaWVudCB0byBrZWVwIHN1YmdyYXBocyB2ZXJ0aWNhbGx5IGNvbXBhY3RcbiAgdmFyIHdlaWdodCA9IHN1bVdlaWdodHMoZykgKyAxO1xuXG4gIC8vIENyZWF0ZSBib3JkZXIgbm9kZXMgYW5kIGxpbmsgdGhlbSB1cFxuICBfLmZvckVhY2goZy5jaGlsZHJlbigpLCBmdW5jdGlvbihjaGlsZCkge1xuICAgIGRmcyhnLCByb290LCBub2RlU2VwLCB3ZWlnaHQsIGhlaWdodCwgZGVwdGhzLCBjaGlsZCk7XG4gIH0pO1xuXG4gIC8vIFNhdmUgdGhlIG11bHRpcGxpZXIgZm9yIG5vZGUgbGF5ZXJzIGZvciBsYXRlciByZW1vdmFsIG9mIGVtcHR5IGJvcmRlclxuICAvLyBsYXllcnMuXG4gIGcuZ3JhcGgoKS5ub2RlUmFua0ZhY3RvciA9IG5vZGVTZXA7XG59XG5cbmZ1bmN0aW9uIGRmcyhnLCByb290LCBub2RlU2VwLCB3ZWlnaHQsIGhlaWdodCwgZGVwdGhzLCB2KSB7XG4gIHZhciBjaGlsZHJlbiA9IGcuY2hpbGRyZW4odik7XG4gIGlmICghY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgaWYgKHYgIT09IHJvb3QpIHtcbiAgICAgIGcuc2V0RWRnZShyb290LCB2LCB7IHdlaWdodDogMCwgbWlubGVuOiBub2RlU2VwIH0pO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgdG9wID0gdXRpbC5hZGRCb3JkZXJOb2RlKGcsIFwiX2J0XCIpO1xuICB2YXIgYm90dG9tID0gdXRpbC5hZGRCb3JkZXJOb2RlKGcsIFwiX2JiXCIpO1xuICB2YXIgbGFiZWwgPSBnLm5vZGUodik7XG5cbiAgZy5zZXRQYXJlbnQodG9wLCB2KTtcbiAgbGFiZWwuYm9yZGVyVG9wID0gdG9wO1xuICBnLnNldFBhcmVudChib3R0b20sIHYpO1xuICBsYWJlbC5ib3JkZXJCb3R0b20gPSBib3R0b207XG5cbiAgXy5mb3JFYWNoKGNoaWxkcmVuLCBmdW5jdGlvbihjaGlsZCkge1xuICAgIGRmcyhnLCByb290LCBub2RlU2VwLCB3ZWlnaHQsIGhlaWdodCwgZGVwdGhzLCBjaGlsZCk7XG5cbiAgICB2YXIgY2hpbGROb2RlID0gZy5ub2RlKGNoaWxkKTtcbiAgICB2YXIgY2hpbGRUb3AgPSBjaGlsZE5vZGUuYm9yZGVyVG9wID8gY2hpbGROb2RlLmJvcmRlclRvcCA6IGNoaWxkO1xuICAgIHZhciBjaGlsZEJvdHRvbSA9IGNoaWxkTm9kZS5ib3JkZXJCb3R0b20gPyBjaGlsZE5vZGUuYm9yZGVyQm90dG9tIDogY2hpbGQ7XG4gICAgdmFyIHRoaXNXZWlnaHQgPSBjaGlsZE5vZGUuYm9yZGVyVG9wID8gd2VpZ2h0IDogMiAqIHdlaWdodDtcbiAgICB2YXIgbWlubGVuID0gY2hpbGRUb3AgIT09IGNoaWxkQm90dG9tID8gMSA6IGhlaWdodCAtIGRlcHRoc1t2XSArIDE7XG5cbiAgICBnLnNldEVkZ2UodG9wLCBjaGlsZFRvcCwge1xuICAgICAgd2VpZ2h0OiB0aGlzV2VpZ2h0LFxuICAgICAgbWlubGVuOiBtaW5sZW4sXG4gICAgICBuZXN0aW5nRWRnZTogdHJ1ZVxuICAgIH0pO1xuXG4gICAgZy5zZXRFZGdlKGNoaWxkQm90dG9tLCBib3R0b20sIHtcbiAgICAgIHdlaWdodDogdGhpc1dlaWdodCxcbiAgICAgIG1pbmxlbjogbWlubGVuLFxuICAgICAgbmVzdGluZ0VkZ2U6IHRydWVcbiAgICB9KTtcbiAgfSk7XG5cbiAgaWYgKCFnLnBhcmVudCh2KSkge1xuICAgIGcuc2V0RWRnZShyb290LCB0b3AsIHsgd2VpZ2h0OiAwLCBtaW5sZW46IGhlaWdodCArIGRlcHRoc1t2XSB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0cmVlRGVwdGhzKGcpIHtcbiAgdmFyIGRlcHRocyA9IHt9O1xuICBmdW5jdGlvbiBkZnModiwgZGVwdGgpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBnLmNoaWxkcmVuKHYpO1xuICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgIF8uZm9yRWFjaChjaGlsZHJlbiwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgICAgZGZzKGNoaWxkLCBkZXB0aCArIDEpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGRlcHRoc1t2XSA9IGRlcHRoO1xuICB9XG4gIF8uZm9yRWFjaChnLmNoaWxkcmVuKCksIGZ1bmN0aW9uKHYpIHsgZGZzKHYsIDEpOyB9KTtcbiAgcmV0dXJuIGRlcHRocztcbn1cblxuZnVuY3Rpb24gc3VtV2VpZ2h0cyhnKSB7XG4gIHJldHVybiBfLnJlZHVjZShnLmVkZ2VzKCksIGZ1bmN0aW9uKGFjYywgZSkge1xuICAgIHJldHVybiBhY2MgKyBnLmVkZ2UoZSkud2VpZ2h0O1xuICB9LCAwKTtcbn1cblxuZnVuY3Rpb24gY2xlYW51cChnKSB7XG4gIHZhciBncmFwaExhYmVsID0gZy5ncmFwaCgpO1xuICBnLnJlbW92ZU5vZGUoZ3JhcGhMYWJlbC5uZXN0aW5nUm9vdCk7XG4gIGRlbGV0ZSBncmFwaExhYmVsLm5lc3RpbmdSb290O1xuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIGVkZ2UgPSBnLmVkZ2UoZSk7XG4gICAgaWYgKGVkZ2UubmVzdGluZ0VkZ2UpIHtcbiAgICAgIGcucmVtb3ZlRWRnZShlKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfID0gcmVxdWlyZShcIi4vbG9kYXNoXCIpO1xudmFyIHV0aWwgPSByZXF1aXJlKFwiLi91dGlsXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgcnVuOiBydW4sXG4gIHVuZG86IHVuZG9cbn07XG5cbi8qXG4gKiBCcmVha3MgYW55IGxvbmcgZWRnZXMgaW4gdGhlIGdyYXBoIGludG8gc2hvcnQgc2VnbWVudHMgdGhhdCBzcGFuIDEgbGF5ZXJcbiAqIGVhY2guIFRoaXMgb3BlcmF0aW9uIGlzIHVuZG9hYmxlIHdpdGggdGhlIGRlbm9ybWFsaXplIGZ1bmN0aW9uLlxuICpcbiAqIFByZS1jb25kaXRpb25zOlxuICpcbiAqICAgIDEuIFRoZSBpbnB1dCBncmFwaCBpcyBhIERBRy5cbiAqICAgIDIuIEVhY2ggbm9kZSBpbiB0aGUgZ3JhcGggaGFzIGEgXCJyYW5rXCIgcHJvcGVydHkuXG4gKlxuICogUG9zdC1jb25kaXRpb246XG4gKlxuICogICAgMS4gQWxsIGVkZ2VzIGluIHRoZSBncmFwaCBoYXZlIGEgbGVuZ3RoIG9mIDEuXG4gKiAgICAyLiBEdW1teSBub2RlcyBhcmUgYWRkZWQgd2hlcmUgZWRnZXMgaGF2ZSBiZWVuIHNwbGl0IGludG8gc2VnbWVudHMuXG4gKiAgICAzLiBUaGUgZ3JhcGggaXMgYXVnbWVudGVkIHdpdGggYSBcImR1bW15Q2hhaW5zXCIgYXR0cmlidXRlIHdoaWNoIGNvbnRhaW5zXG4gKiAgICAgICB0aGUgZmlyc3QgZHVtbXkgaW4gZWFjaCBjaGFpbiBvZiBkdW1teSBub2RlcyBwcm9kdWNlZC5cbiAqL1xuZnVuY3Rpb24gcnVuKGcpIHtcbiAgZy5ncmFwaCgpLmR1bW15Q2hhaW5zID0gW107XG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGVkZ2UpIHsgbm9ybWFsaXplRWRnZShnLCBlZGdlKTsgfSk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUVkZ2UoZywgZSkge1xuICB2YXIgdiA9IGUudjtcbiAgdmFyIHZSYW5rID0gZy5ub2RlKHYpLnJhbms7XG4gIHZhciB3ID0gZS53O1xuICB2YXIgd1JhbmsgPSBnLm5vZGUodykucmFuaztcbiAgdmFyIG5hbWUgPSBlLm5hbWU7XG4gIHZhciBlZGdlTGFiZWwgPSBnLmVkZ2UoZSk7XG4gIHZhciBsYWJlbFJhbmsgPSBlZGdlTGFiZWwubGFiZWxSYW5rO1xuXG4gIGlmICh3UmFuayA9PT0gdlJhbmsgKyAxKSByZXR1cm47XG5cbiAgZy5yZW1vdmVFZGdlKGUpO1xuXG4gIHZhciBkdW1teSwgYXR0cnMsIGk7XG4gIGZvciAoaSA9IDAsICsrdlJhbms7IHZSYW5rIDwgd1Jhbms7ICsraSwgKyt2UmFuaykge1xuICAgIGVkZ2VMYWJlbC5wb2ludHMgPSBbXTtcbiAgICBhdHRycyA9IHtcbiAgICAgIHdpZHRoOiAwLCBoZWlnaHQ6IDAsXG4gICAgICBlZGdlTGFiZWw6IGVkZ2VMYWJlbCwgZWRnZU9iajogZSxcbiAgICAgIHJhbms6IHZSYW5rXG4gICAgfTtcbiAgICBkdW1teSA9IHV0aWwuYWRkRHVtbXlOb2RlKGcsIFwiZWRnZVwiLCBhdHRycywgXCJfZFwiKTtcbiAgICBpZiAodlJhbmsgPT09IGxhYmVsUmFuaykge1xuICAgICAgYXR0cnMud2lkdGggPSBlZGdlTGFiZWwud2lkdGg7XG4gICAgICBhdHRycy5oZWlnaHQgPSBlZGdlTGFiZWwuaGVpZ2h0O1xuICAgICAgYXR0cnMuZHVtbXkgPSBcImVkZ2UtbGFiZWxcIjtcbiAgICAgIGF0dHJzLmxhYmVscG9zID0gZWRnZUxhYmVsLmxhYmVscG9zO1xuICAgIH1cbiAgICBnLnNldEVkZ2UodiwgZHVtbXksIHsgd2VpZ2h0OiBlZGdlTGFiZWwud2VpZ2h0IH0sIG5hbWUpO1xuICAgIGlmIChpID09PSAwKSB7XG4gICAgICBnLmdyYXBoKCkuZHVtbXlDaGFpbnMucHVzaChkdW1teSk7XG4gICAgfVxuICAgIHYgPSBkdW1teTtcbiAgfVxuXG4gIGcuc2V0RWRnZSh2LCB3LCB7IHdlaWdodDogZWRnZUxhYmVsLndlaWdodCB9LCBuYW1lKTtcbn1cblxuZnVuY3Rpb24gdW5kbyhnKSB7XG4gIF8uZm9yRWFjaChnLmdyYXBoKCkuZHVtbXlDaGFpbnMsIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgbm9kZSA9IGcubm9kZSh2KTtcbiAgICB2YXIgb3JpZ0xhYmVsID0gbm9kZS5lZGdlTGFiZWw7XG4gICAgdmFyIHc7XG4gICAgZy5zZXRFZGdlKG5vZGUuZWRnZU9iaiwgb3JpZ0xhYmVsKTtcbiAgICB3aGlsZSAobm9kZS5kdW1teSkge1xuICAgICAgdyA9IGcuc3VjY2Vzc29ycyh2KVswXTtcbiAgICAgIGcucmVtb3ZlTm9kZSh2KTtcbiAgICAgIG9yaWdMYWJlbC5wb2ludHMucHVzaCh7IHg6IG5vZGUueCwgeTogbm9kZS55IH0pO1xuICAgICAgaWYgKG5vZGUuZHVtbXkgPT09IFwiZWRnZS1sYWJlbFwiKSB7XG4gICAgICAgIG9yaWdMYWJlbC54ID0gbm9kZS54O1xuICAgICAgICBvcmlnTGFiZWwueSA9IG5vZGUueTtcbiAgICAgICAgb3JpZ0xhYmVsLndpZHRoID0gbm9kZS53aWR0aDtcbiAgICAgICAgb3JpZ0xhYmVsLmhlaWdodCA9IG5vZGUuaGVpZ2h0O1xuICAgICAgfVxuICAgICAgdiA9IHc7XG4gICAgICBub2RlID0gZy5ub2RlKHYpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJ2YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gYWRkU3ViZ3JhcGhDb25zdHJhaW50cztcblxuZnVuY3Rpb24gYWRkU3ViZ3JhcGhDb25zdHJhaW50cyhnLCBjZywgdnMpIHtcbiAgdmFyIHByZXYgPSB7fSxcbiAgICByb290UHJldjtcblxuICBfLmZvckVhY2godnMsIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgY2hpbGQgPSBnLnBhcmVudCh2KSxcbiAgICAgIHBhcmVudCxcbiAgICAgIHByZXZDaGlsZDtcbiAgICB3aGlsZSAoY2hpbGQpIHtcbiAgICAgIHBhcmVudCA9IGcucGFyZW50KGNoaWxkKTtcbiAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgcHJldkNoaWxkID0gcHJldltwYXJlbnRdO1xuICAgICAgICBwcmV2W3BhcmVudF0gPSBjaGlsZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByZXZDaGlsZCA9IHJvb3RQcmV2O1xuICAgICAgICByb290UHJldiA9IGNoaWxkO1xuICAgICAgfVxuICAgICAgaWYgKHByZXZDaGlsZCAmJiBwcmV2Q2hpbGQgIT09IGNoaWxkKSB7XG4gICAgICAgIGNnLnNldEVkZ2UocHJldkNoaWxkLCBjaGlsZCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNoaWxkID0gcGFyZW50O1xuICAgIH1cbiAgfSk7XG5cbiAgLypcbiAgZnVuY3Rpb24gZGZzKHYpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSB2ID8gZy5jaGlsZHJlbih2KSA6IGcuY2hpbGRyZW4oKTtcbiAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICB2YXIgbWluID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxuICAgICAgICAgIHN1YmdyYXBocyA9IFtdO1xuICAgICAgXy5lYWNoKGNoaWxkcmVuLCBmdW5jdGlvbihjaGlsZCkge1xuICAgICAgICB2YXIgY2hpbGRNaW4gPSBkZnMoY2hpbGQpO1xuICAgICAgICBpZiAoZy5jaGlsZHJlbihjaGlsZCkubGVuZ3RoKSB7XG4gICAgICAgICAgc3ViZ3JhcGhzLnB1c2goeyB2OiBjaGlsZCwgb3JkZXI6IGNoaWxkTWluIH0pO1xuICAgICAgICB9XG4gICAgICAgIG1pbiA9IE1hdGgubWluKG1pbiwgY2hpbGRNaW4pO1xuICAgICAgfSk7XG4gICAgICBfLnJlZHVjZShfLnNvcnRCeShzdWJncmFwaHMsIFwib3JkZXJcIiksIGZ1bmN0aW9uKHByZXYsIGN1cnIpIHtcbiAgICAgICAgY2cuc2V0RWRnZShwcmV2LnYsIGN1cnIudik7XG4gICAgICAgIHJldHVybiBjdXJyO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gbWluO1xuICAgIH1cbiAgICByZXR1cm4gZy5ub2RlKHYpLm9yZGVyO1xuICB9XG4gIGRmcyh1bmRlZmluZWQpO1xuICAqL1xufVxuIiwidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJhcnljZW50ZXI7XG5cbmZ1bmN0aW9uIGJhcnljZW50ZXIoZywgbW92YWJsZSkge1xuICByZXR1cm4gXy5tYXAobW92YWJsZSwgZnVuY3Rpb24odikge1xuICAgIHZhciBpblYgPSBnLmluRWRnZXModik7XG4gICAgaWYgKCFpblYubGVuZ3RoKSB7XG4gICAgICByZXR1cm4geyB2OiB2IH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciByZXN1bHQgPSBfLnJlZHVjZShpblYsIGZ1bmN0aW9uKGFjYywgZSkge1xuICAgICAgICB2YXIgZWRnZSA9IGcuZWRnZShlKSxcbiAgICAgICAgICBub2RlVSA9IGcubm9kZShlLnYpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1bTogYWNjLnN1bSArIChlZGdlLndlaWdodCAqIG5vZGVVLm9yZGVyKSxcbiAgICAgICAgICB3ZWlnaHQ6IGFjYy53ZWlnaHQgKyBlZGdlLndlaWdodFxuICAgICAgICB9O1xuICAgICAgfSwgeyBzdW06IDAsIHdlaWdodDogMCB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdjogdixcbiAgICAgICAgYmFyeWNlbnRlcjogcmVzdWx0LnN1bSAvIHJlc3VsdC53ZWlnaHQsXG4gICAgICAgIHdlaWdodDogcmVzdWx0LndlaWdodFxuICAgICAgfTtcbiAgICB9XG4gIH0pO1xufVxuXG4iLCJ2YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG52YXIgR3JhcGggPSByZXF1aXJlKFwiLi4vZ3JhcGhsaWJcIikuR3JhcGg7XG5cbm1vZHVsZS5leHBvcnRzID0gYnVpbGRMYXllckdyYXBoO1xuXG4vKlxuICogQ29uc3RydWN0cyBhIGdyYXBoIHRoYXQgY2FuIGJlIHVzZWQgdG8gc29ydCBhIGxheWVyIG9mIG5vZGVzLiBUaGUgZ3JhcGggd2lsbFxuICogY29udGFpbiBhbGwgYmFzZSBhbmQgc3ViZ3JhcGggbm9kZXMgZnJvbSB0aGUgcmVxdWVzdCBsYXllciBpbiB0aGVpciBvcmlnaW5hbFxuICogaGllcmFyY2h5IGFuZCBhbnkgZWRnZXMgdGhhdCBhcmUgaW5jaWRlbnQgb24gdGhlc2Ugbm9kZXMgYW5kIGFyZSBvZiB0aGUgdHlwZVxuICogcmVxdWVzdGVkIGJ5IHRoZSBcInJlbGF0aW9uc2hpcFwiIHBhcmFtZXRlci5cbiAqXG4gKiBOb2RlcyBmcm9tIHRoZSByZXF1ZXN0ZWQgcmFuayB0aGF0IGRvIG5vdCBoYXZlIHBhcmVudHMgYXJlIGFzc2lnbmVkIGEgcm9vdFxuICogbm9kZSBpbiB0aGUgb3V0cHV0IGdyYXBoLCB3aGljaCBpcyBzZXQgaW4gdGhlIHJvb3QgZ3JhcGggYXR0cmlidXRlLiBUaGlzXG4gKiBtYWtlcyBpdCBlYXN5IHRvIHdhbGsgdGhlIGhpZXJhcmNoeSBvZiBtb3ZhYmxlIG5vZGVzIGR1cmluZyBvcmRlcmluZy5cbiAqXG4gKiBQcmUtY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBJbnB1dCBncmFwaCBpcyBhIERBR1xuICogICAgMi4gQmFzZSBub2RlcyBpbiB0aGUgaW5wdXQgZ3JhcGggaGF2ZSBhIHJhbmsgYXR0cmlidXRlXG4gKiAgICAzLiBTdWJncmFwaCBub2RlcyBpbiB0aGUgaW5wdXQgZ3JhcGggaGFzIG1pblJhbmsgYW5kIG1heFJhbmsgYXR0cmlidXRlc1xuICogICAgNC4gRWRnZXMgaGF2ZSBhbiBhc3NpZ25lZCB3ZWlnaHRcbiAqXG4gKiBQb3N0LWNvbmRpdGlvbnM6XG4gKlxuICogICAgMS4gT3V0cHV0IGdyYXBoIGhhcyBhbGwgbm9kZXMgaW4gdGhlIG1vdmFibGUgcmFuayB3aXRoIHByZXNlcnZlZFxuICogICAgICAgaGllcmFyY2h5LlxuICogICAgMi4gUm9vdCBub2RlcyBpbiB0aGUgbW92YWJsZSBsYXllciBhcmUgbWFkZSBjaGlsZHJlbiBvZiB0aGUgbm9kZVxuICogICAgICAgaW5kaWNhdGVkIGJ5IHRoZSByb290IGF0dHJpYnV0ZSBvZiB0aGUgZ3JhcGguXG4gKiAgICAzLiBOb24tbW92YWJsZSBub2RlcyBpbmNpZGVudCBvbiBtb3ZhYmxlIG5vZGVzLCBzZWxlY3RlZCBieSB0aGVcbiAqICAgICAgIHJlbGF0aW9uc2hpcCBwYXJhbWV0ZXIsIGFyZSBpbmNsdWRlZCBpbiB0aGUgZ3JhcGggKHdpdGhvdXQgaGllcmFyY2h5KS5cbiAqICAgIDQuIEVkZ2VzIGluY2lkZW50IG9uIG1vdmFibGUgbm9kZXMsIHNlbGVjdGVkIGJ5IHRoZSByZWxhdGlvbnNoaXBcbiAqICAgICAgIHBhcmFtZXRlciwgYXJlIGFkZGVkIHRvIHRoZSBvdXRwdXQgZ3JhcGguXG4gKiAgICA1LiBUaGUgd2VpZ2h0cyBmb3IgY29waWVkIGVkZ2VzIGFyZSBhZ2dyZWdhdGVkIGFzIG5lZWQsIHNpbmNlIHRoZSBvdXRwdXRcbiAqICAgICAgIGdyYXBoIGlzIG5vdCBhIG11bHRpLWdyYXBoLlxuICovXG5mdW5jdGlvbiBidWlsZExheWVyR3JhcGgoZywgcmFuaywgcmVsYXRpb25zaGlwKSB7XG4gIHZhciByb290ID0gY3JlYXRlUm9vdE5vZGUoZyksXG4gICAgcmVzdWx0ID0gbmV3IEdyYXBoKHsgY29tcG91bmQ6IHRydWUgfSkuc2V0R3JhcGgoeyByb290OiByb290IH0pXG4gICAgICAuc2V0RGVmYXVsdE5vZGVMYWJlbChmdW5jdGlvbih2KSB7IHJldHVybiBnLm5vZGUodik7IH0pO1xuXG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgbm9kZSA9IGcubm9kZSh2KSxcbiAgICAgIHBhcmVudCA9IGcucGFyZW50KHYpO1xuXG4gICAgaWYgKG5vZGUucmFuayA9PT0gcmFuayB8fCBub2RlLm1pblJhbmsgPD0gcmFuayAmJiByYW5rIDw9IG5vZGUubWF4UmFuaykge1xuICAgICAgcmVzdWx0LnNldE5vZGUodik7XG4gICAgICByZXN1bHQuc2V0UGFyZW50KHYsIHBhcmVudCB8fCByb290KTtcblxuICAgICAgLy8gVGhpcyBhc3N1bWVzIHdlIGhhdmUgb25seSBzaG9ydCBlZGdlcyFcbiAgICAgIF8uZm9yRWFjaChnW3JlbGF0aW9uc2hpcF0odiksIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgdmFyIHUgPSBlLnYgPT09IHYgPyBlLncgOiBlLnYsXG4gICAgICAgICAgZWRnZSA9IHJlc3VsdC5lZGdlKHUsIHYpLFxuICAgICAgICAgIHdlaWdodCA9ICFfLmlzVW5kZWZpbmVkKGVkZ2UpID8gZWRnZS53ZWlnaHQgOiAwO1xuICAgICAgICByZXN1bHQuc2V0RWRnZSh1LCB2LCB7IHdlaWdodDogZy5lZGdlKGUpLndlaWdodCArIHdlaWdodCB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoXy5oYXMobm9kZSwgXCJtaW5SYW5rXCIpKSB7XG4gICAgICAgIHJlc3VsdC5zZXROb2RlKHYsIHtcbiAgICAgICAgICBib3JkZXJMZWZ0OiBub2RlLmJvcmRlckxlZnRbcmFua10sXG4gICAgICAgICAgYm9yZGVyUmlnaHQ6IG5vZGUuYm9yZGVyUmlnaHRbcmFua11cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVSb290Tm9kZShnKSB7XG4gIHZhciB2O1xuICB3aGlsZSAoZy5oYXNOb2RlKCh2ID0gXy51bmlxdWVJZChcIl9yb290XCIpKSkpO1xuICByZXR1cm4gdjtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gY3Jvc3NDb3VudDtcblxuLypcbiAqIEEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIGxheWVyaW5nIChhbiBhcnJheSBvZiBsYXllcnMsIGVhY2ggd2l0aCBhbiBhcnJheSBvZlxuICogb3JkZXJlcmQgbm9kZXMpIGFuZCBhIGdyYXBoIGFuZCByZXR1cm5zIGEgd2VpZ2h0ZWQgY3Jvc3NpbmcgY291bnQuXG4gKlxuICogUHJlLWNvbmRpdGlvbnM6XG4gKlxuICogICAgMS4gSW5wdXQgZ3JhcGggbXVzdCBiZSBzaW1wbGUgKG5vdCBhIG11bHRpZ3JhcGgpLCBkaXJlY3RlZCwgYW5kIGluY2x1ZGVcbiAqICAgICAgIG9ubHkgc2ltcGxlIGVkZ2VzLlxuICogICAgMi4gRWRnZXMgaW4gdGhlIGlucHV0IGdyYXBoIG11c3QgaGF2ZSBhc3NpZ25lZCB3ZWlnaHRzLlxuICpcbiAqIFBvc3QtY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBUaGUgZ3JhcGggYW5kIGxheWVyaW5nIG1hdHJpeCBhcmUgbGVmdCB1bmNoYW5nZWQuXG4gKlxuICogVGhpcyBhbGdvcml0aG0gaXMgZGVyaXZlZCBmcm9tIEJhcnRoLCBldCBhbC4sIFwiQmlsYXllciBDcm9zcyBDb3VudGluZy5cIlxuICovXG5mdW5jdGlvbiBjcm9zc0NvdW50KGcsIGxheWVyaW5nKSB7XG4gIHZhciBjYyA9IDA7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgbGF5ZXJpbmcubGVuZ3RoOyArK2kpIHtcbiAgICBjYyArPSB0d29MYXllckNyb3NzQ291bnQoZywgbGF5ZXJpbmdbaS0xXSwgbGF5ZXJpbmdbaV0pO1xuICB9XG4gIHJldHVybiBjYztcbn1cblxuZnVuY3Rpb24gdHdvTGF5ZXJDcm9zc0NvdW50KGcsIG5vcnRoTGF5ZXIsIHNvdXRoTGF5ZXIpIHtcbiAgLy8gU29ydCBhbGwgb2YgdGhlIGVkZ2VzIGJldHdlZW4gdGhlIG5vcnRoIGFuZCBzb3V0aCBsYXllcnMgYnkgdGhlaXIgcG9zaXRpb25cbiAgLy8gaW4gdGhlIG5vcnRoIGxheWVyIGFuZCB0aGVuIHRoZSBzb3V0aC4gTWFwIHRoZXNlIGVkZ2VzIHRvIHRoZSBwb3NpdGlvbiBvZlxuICAvLyB0aGVpciBoZWFkIGluIHRoZSBzb3V0aCBsYXllci5cbiAgdmFyIHNvdXRoUG9zID0gXy56aXBPYmplY3Qoc291dGhMYXllcixcbiAgICBfLm1hcChzb3V0aExheWVyLCBmdW5jdGlvbiAodiwgaSkgeyByZXR1cm4gaTsgfSkpO1xuICB2YXIgc291dGhFbnRyaWVzID0gXy5mbGF0dGVuKF8ubWFwKG5vcnRoTGF5ZXIsIGZ1bmN0aW9uKHYpIHtcbiAgICByZXR1cm4gXy5zb3J0QnkoXy5tYXAoZy5vdXRFZGdlcyh2KSwgZnVuY3Rpb24oZSkge1xuICAgICAgcmV0dXJuIHsgcG9zOiBzb3V0aFBvc1tlLnddLCB3ZWlnaHQ6IGcuZWRnZShlKS53ZWlnaHQgfTtcbiAgICB9KSwgXCJwb3NcIik7XG4gIH0pLCB0cnVlKTtcblxuICAvLyBCdWlsZCB0aGUgYWNjdW11bGF0b3IgdHJlZVxuICB2YXIgZmlyc3RJbmRleCA9IDE7XG4gIHdoaWxlIChmaXJzdEluZGV4IDwgc291dGhMYXllci5sZW5ndGgpIGZpcnN0SW5kZXggPDw9IDE7XG4gIHZhciB0cmVlU2l6ZSA9IDIgKiBmaXJzdEluZGV4IC0gMTtcbiAgZmlyc3RJbmRleCAtPSAxO1xuICB2YXIgdHJlZSA9IF8ubWFwKG5ldyBBcnJheSh0cmVlU2l6ZSksIGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfSk7XG5cbiAgLy8gQ2FsY3VsYXRlIHRoZSB3ZWlnaHRlZCBjcm9zc2luZ3NcbiAgdmFyIGNjID0gMDtcbiAgXy5mb3JFYWNoKHNvdXRoRW50cmllcy5mb3JFYWNoKGZ1bmN0aW9uKGVudHJ5KSB7XG4gICAgdmFyIGluZGV4ID0gZW50cnkucG9zICsgZmlyc3RJbmRleDtcbiAgICB0cmVlW2luZGV4XSArPSBlbnRyeS53ZWlnaHQ7XG4gICAgdmFyIHdlaWdodFN1bSA9IDA7XG4gICAgd2hpbGUgKGluZGV4ID4gMCkge1xuICAgICAgaWYgKGluZGV4ICUgMikge1xuICAgICAgICB3ZWlnaHRTdW0gKz0gdHJlZVtpbmRleCArIDFdO1xuICAgICAgfVxuICAgICAgaW5kZXggPSAoaW5kZXggLSAxKSA+PiAxO1xuICAgICAgdHJlZVtpbmRleF0gKz0gZW50cnkud2VpZ2h0O1xuICAgIH1cbiAgICBjYyArPSBlbnRyeS53ZWlnaHQgKiB3ZWlnaHRTdW07XG4gIH0pKTtcblxuICByZXR1cm4gY2M7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xudmFyIGluaXRPcmRlciA9IHJlcXVpcmUoXCIuL2luaXQtb3JkZXJcIik7XG52YXIgY3Jvc3NDb3VudCA9IHJlcXVpcmUoXCIuL2Nyb3NzLWNvdW50XCIpO1xudmFyIHNvcnRTdWJncmFwaCA9IHJlcXVpcmUoXCIuL3NvcnQtc3ViZ3JhcGhcIik7XG52YXIgYnVpbGRMYXllckdyYXBoID0gcmVxdWlyZShcIi4vYnVpbGQtbGF5ZXItZ3JhcGhcIik7XG52YXIgYWRkU3ViZ3JhcGhDb25zdHJhaW50cyA9IHJlcXVpcmUoXCIuL2FkZC1zdWJncmFwaC1jb25zdHJhaW50c1wiKTtcbnZhciBHcmFwaCA9IHJlcXVpcmUoXCIuLi9ncmFwaGxpYlwiKS5HcmFwaDtcbnZhciB1dGlsID0gcmVxdWlyZShcIi4uL3V0aWxcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gb3JkZXI7XG5cbi8qXG4gKiBBcHBsaWVzIGhldXJpc3RpY3MgdG8gbWluaW1pemUgZWRnZSBjcm9zc2luZ3MgaW4gdGhlIGdyYXBoIGFuZCBzZXRzIHRoZSBiZXN0XG4gKiBvcmRlciBzb2x1dGlvbiBhcyBhbiBvcmRlciBhdHRyaWJ1dGUgb24gZWFjaCBub2RlLlxuICpcbiAqIFByZS1jb25kaXRpb25zOlxuICpcbiAqICAgIDEuIEdyYXBoIG11c3QgYmUgREFHXG4gKiAgICAyLiBHcmFwaCBub2RlcyBtdXN0IGJlIG9iamVjdHMgd2l0aCBhIFwicmFua1wiIGF0dHJpYnV0ZVxuICogICAgMy4gR3JhcGggZWRnZXMgbXVzdCBoYXZlIHRoZSBcIndlaWdodFwiIGF0dHJpYnV0ZVxuICpcbiAqIFBvc3QtY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBHcmFwaCBub2RlcyB3aWxsIGhhdmUgYW4gXCJvcmRlclwiIGF0dHJpYnV0ZSBiYXNlZCBvbiB0aGUgcmVzdWx0cyBvZiB0aGVcbiAqICAgICAgIGFsZ29yaXRobS5cbiAqL1xuZnVuY3Rpb24gb3JkZXIoZykge1xuICB2YXIgbWF4UmFuayA9IHV0aWwubWF4UmFuayhnKSxcbiAgICBkb3duTGF5ZXJHcmFwaHMgPSBidWlsZExheWVyR3JhcGhzKGcsIF8ucmFuZ2UoMSwgbWF4UmFuayArIDEpLCBcImluRWRnZXNcIiksXG4gICAgdXBMYXllckdyYXBocyA9IGJ1aWxkTGF5ZXJHcmFwaHMoZywgXy5yYW5nZShtYXhSYW5rIC0gMSwgLTEsIC0xKSwgXCJvdXRFZGdlc1wiKTtcblxuICB2YXIgbGF5ZXJpbmcgPSBpbml0T3JkZXIoZyk7XG4gIGFzc2lnbk9yZGVyKGcsIGxheWVyaW5nKTtcblxuICB2YXIgYmVzdENDID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxuICAgIGJlc3Q7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGxhc3RCZXN0ID0gMDsgbGFzdEJlc3QgPCA0OyArK2ksICsrbGFzdEJlc3QpIHtcbiAgICBzd2VlcExheWVyR3JhcGhzKGkgJSAyID8gZG93bkxheWVyR3JhcGhzIDogdXBMYXllckdyYXBocywgaSAlIDQgPj0gMik7XG5cbiAgICBsYXllcmluZyA9IHV0aWwuYnVpbGRMYXllck1hdHJpeChnKTtcbiAgICB2YXIgY2MgPSBjcm9zc0NvdW50KGcsIGxheWVyaW5nKTtcbiAgICBpZiAoY2MgPCBiZXN0Q0MpIHtcbiAgICAgIGxhc3RCZXN0ID0gMDtcbiAgICAgIGJlc3QgPSBfLmNsb25lRGVlcChsYXllcmluZyk7XG4gICAgICBiZXN0Q0MgPSBjYztcbiAgICB9XG4gIH1cblxuICBhc3NpZ25PcmRlcihnLCBiZXN0KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRMYXllckdyYXBocyhnLCByYW5rcywgcmVsYXRpb25zaGlwKSB7XG4gIHJldHVybiBfLm1hcChyYW5rcywgZnVuY3Rpb24ocmFuaykge1xuICAgIHJldHVybiBidWlsZExheWVyR3JhcGgoZywgcmFuaywgcmVsYXRpb25zaGlwKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHN3ZWVwTGF5ZXJHcmFwaHMobGF5ZXJHcmFwaHMsIGJpYXNSaWdodCkge1xuICB2YXIgY2cgPSBuZXcgR3JhcGgoKTtcbiAgXy5mb3JFYWNoKGxheWVyR3JhcGhzLCBmdW5jdGlvbihsZykge1xuICAgIHZhciByb290ID0gbGcuZ3JhcGgoKS5yb290O1xuICAgIHZhciBzb3J0ZWQgPSBzb3J0U3ViZ3JhcGgobGcsIHJvb3QsIGNnLCBiaWFzUmlnaHQpO1xuICAgIF8uZm9yRWFjaChzb3J0ZWQudnMsIGZ1bmN0aW9uKHYsIGkpIHtcbiAgICAgIGxnLm5vZGUodikub3JkZXIgPSBpO1xuICAgIH0pO1xuICAgIGFkZFN1YmdyYXBoQ29uc3RyYWludHMobGcsIGNnLCBzb3J0ZWQudnMpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gYXNzaWduT3JkZXIoZywgbGF5ZXJpbmcpIHtcbiAgXy5mb3JFYWNoKGxheWVyaW5nLCBmdW5jdGlvbihsYXllcikge1xuICAgIF8uZm9yRWFjaChsYXllciwgZnVuY3Rpb24odiwgaSkge1xuICAgICAgZy5ub2RlKHYpLm9yZGVyID0gaTtcbiAgICB9KTtcbiAgfSk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGluaXRPcmRlcjtcblxuLypcbiAqIEFzc2lnbnMgYW4gaW5pdGlhbCBvcmRlciB2YWx1ZSBmb3IgZWFjaCBub2RlIGJ5IHBlcmZvcm1pbmcgYSBERlMgc2VhcmNoXG4gKiBzdGFydGluZyBmcm9tIG5vZGVzIGluIHRoZSBmaXJzdCByYW5rLiBOb2RlcyBhcmUgYXNzaWduZWQgYW4gb3JkZXIgaW4gdGhlaXJcbiAqIHJhbmsgYXMgdGhleSBhcmUgZmlyc3QgdmlzaXRlZC5cbiAqXG4gKiBUaGlzIGFwcHJvYWNoIGNvbWVzIGZyb20gR2Fuc25lciwgZXQgYWwuLCBcIkEgVGVjaG5pcXVlIGZvciBEcmF3aW5nIERpcmVjdGVkXG4gKiBHcmFwaHMuXCJcbiAqXG4gKiBSZXR1cm5zIGEgbGF5ZXJpbmcgbWF0cml4IHdpdGggYW4gYXJyYXkgcGVyIGxheWVyIGFuZCBlYWNoIGxheWVyIHNvcnRlZCBieVxuICogdGhlIG9yZGVyIG9mIGl0cyBub2Rlcy5cbiAqL1xuZnVuY3Rpb24gaW5pdE9yZGVyKGcpIHtcbiAgdmFyIHZpc2l0ZWQgPSB7fTtcbiAgdmFyIHNpbXBsZU5vZGVzID0gXy5maWx0ZXIoZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgcmV0dXJuICFnLmNoaWxkcmVuKHYpLmxlbmd0aDtcbiAgfSk7XG4gIHZhciBtYXhSYW5rID0gXy5tYXgoXy5tYXAoc2ltcGxlTm9kZXMsIGZ1bmN0aW9uKHYpIHsgcmV0dXJuIGcubm9kZSh2KS5yYW5rOyB9KSk7XG4gIHZhciBsYXllcnMgPSBfLm1hcChfLnJhbmdlKG1heFJhbmsgKyAxKSwgZnVuY3Rpb24oKSB7IHJldHVybiBbXTsgfSk7XG5cbiAgZnVuY3Rpb24gZGZzKHYpIHtcbiAgICBpZiAoXy5oYXModmlzaXRlZCwgdikpIHJldHVybjtcbiAgICB2aXNpdGVkW3ZdID0gdHJ1ZTtcbiAgICB2YXIgbm9kZSA9IGcubm9kZSh2KTtcbiAgICBsYXllcnNbbm9kZS5yYW5rXS5wdXNoKHYpO1xuICAgIF8uZm9yRWFjaChnLnN1Y2Nlc3NvcnModiksIGRmcyk7XG4gIH1cblxuICB2YXIgb3JkZXJlZFZzID0gXy5zb3J0Qnkoc2ltcGxlTm9kZXMsIGZ1bmN0aW9uKHYpIHsgcmV0dXJuIGcubm9kZSh2KS5yYW5rOyB9KTtcbiAgXy5mb3JFYWNoKG9yZGVyZWRWcywgZGZzKTtcblxuICByZXR1cm4gbGF5ZXJzO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSByZXNvbHZlQ29uZmxpY3RzO1xuXG4vKlxuICogR2l2ZW4gYSBsaXN0IG9mIGVudHJpZXMgb2YgdGhlIGZvcm0ge3YsIGJhcnljZW50ZXIsIHdlaWdodH0gYW5kIGFcbiAqIGNvbnN0cmFpbnQgZ3JhcGggdGhpcyBmdW5jdGlvbiB3aWxsIHJlc29sdmUgYW55IGNvbmZsaWN0cyBiZXR3ZWVuIHRoZVxuICogY29uc3RyYWludCBncmFwaCBhbmQgdGhlIGJhcnljZW50ZXJzIGZvciB0aGUgZW50cmllcy4gSWYgdGhlIGJhcnljZW50ZXJzIGZvclxuICogYW4gZW50cnkgd291bGQgdmlvbGF0ZSBhIGNvbnN0cmFpbnQgaW4gdGhlIGNvbnN0cmFpbnQgZ3JhcGggdGhlbiB3ZSBjb2FsZXNjZVxuICogdGhlIG5vZGVzIGluIHRoZSBjb25mbGljdCBpbnRvIGEgbmV3IG5vZGUgdGhhdCByZXNwZWN0cyB0aGUgY29udHJhaW50IGFuZFxuICogYWdncmVnYXRlcyBiYXJ5Y2VudGVyIGFuZCB3ZWlnaHQgaW5mb3JtYXRpb24uXG4gKlxuICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiB0aGUgZGVzY3JpcHRpb24gaW4gRm9yc3RlciwgXCJBIEZhc3QgYW5kXG4gKiBTaW1wbGUgSHVlcmlzdGljIGZvciBDb25zdHJhaW5lZCBUd28tTGV2ZWwgQ3Jvc3NpbmcgUmVkdWN0aW9uLFwiIHRob3VnaHQgaXRcbiAqIGRpZmZlcnMgaW4gc29tZSBzcGVjaWZpYyBkZXRhaWxzLlxuICpcbiAqIFByZS1jb25kaXRpb25zOlxuICpcbiAqICAgIDEuIEVhY2ggZW50cnkgaGFzIHRoZSBmb3JtIHt2LCBiYXJ5Y2VudGVyLCB3ZWlnaHR9LCBvciBpZiB0aGUgbm9kZSBoYXNcbiAqICAgICAgIG5vIGJhcnljZW50ZXIsIHRoZW4ge3Z9LlxuICpcbiAqIFJldHVybnM6XG4gKlxuICogICAgQSBuZXcgbGlzdCBvZiBlbnRyaWVzIG9mIHRoZSBmb3JtIHt2cywgaSwgYmFyeWNlbnRlciwgd2VpZ2h0fS4gVGhlIGxpc3RcbiAqICAgIGB2c2AgbWF5IGVpdGhlciBiZSBhIHNpbmdsZXRvbiBvciBpdCBtYXkgYmUgYW4gYWdncmVnYXRpb24gb2Ygbm9kZXNcbiAqICAgIG9yZGVyZWQgc3VjaCB0aGF0IHRoZXkgZG8gbm90IHZpb2xhdGUgY29uc3RyYWludHMgZnJvbSB0aGUgY29uc3RyYWludFxuICogICAgZ3JhcGguIFRoZSBwcm9wZXJ0eSBgaWAgaXMgdGhlIGxvd2VzdCBvcmlnaW5hbCBpbmRleCBvZiBhbnkgb2YgdGhlXG4gKiAgICBlbGVtZW50cyBpbiBgdnNgLlxuICovXG5mdW5jdGlvbiByZXNvbHZlQ29uZmxpY3RzKGVudHJpZXMsIGNnKSB7XG4gIHZhciBtYXBwZWRFbnRyaWVzID0ge307XG4gIF8uZm9yRWFjaChlbnRyaWVzLCBmdW5jdGlvbihlbnRyeSwgaSkge1xuICAgIHZhciB0bXAgPSBtYXBwZWRFbnRyaWVzW2VudHJ5LnZdID0ge1xuICAgICAgaW5kZWdyZWU6IDAsXG4gICAgICBcImluXCI6IFtdLFxuICAgICAgb3V0OiBbXSxcbiAgICAgIHZzOiBbZW50cnkudl0sXG4gICAgICBpOiBpXG4gICAgfTtcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoZW50cnkuYmFyeWNlbnRlcikpIHtcbiAgICAgIHRtcC5iYXJ5Y2VudGVyID0gZW50cnkuYmFyeWNlbnRlcjtcbiAgICAgIHRtcC53ZWlnaHQgPSBlbnRyeS53ZWlnaHQ7XG4gICAgfVxuICB9KTtcblxuICBfLmZvckVhY2goY2cuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBlbnRyeVYgPSBtYXBwZWRFbnRyaWVzW2Uudl07XG4gICAgdmFyIGVudHJ5VyA9IG1hcHBlZEVudHJpZXNbZS53XTtcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoZW50cnlWKSAmJiAhXy5pc1VuZGVmaW5lZChlbnRyeVcpKSB7XG4gICAgICBlbnRyeVcuaW5kZWdyZWUrKztcbiAgICAgIGVudHJ5Vi5vdXQucHVzaChtYXBwZWRFbnRyaWVzW2Uud10pO1xuICAgIH1cbiAgfSk7XG5cbiAgdmFyIHNvdXJjZVNldCA9IF8uZmlsdGVyKG1hcHBlZEVudHJpZXMsIGZ1bmN0aW9uKGVudHJ5KSB7XG4gICAgcmV0dXJuICFlbnRyeS5pbmRlZ3JlZTtcbiAgfSk7XG5cbiAgcmV0dXJuIGRvUmVzb2x2ZUNvbmZsaWN0cyhzb3VyY2VTZXQpO1xufVxuXG5mdW5jdGlvbiBkb1Jlc29sdmVDb25mbGljdHMoc291cmNlU2V0KSB7XG4gIHZhciBlbnRyaWVzID0gW107XG5cbiAgZnVuY3Rpb24gaGFuZGxlSW4odkVudHJ5KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHVFbnRyeSkge1xuICAgICAgaWYgKHVFbnRyeS5tZXJnZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKF8uaXNVbmRlZmluZWQodUVudHJ5LmJhcnljZW50ZXIpIHx8XG4gICAgICAgICAgXy5pc1VuZGVmaW5lZCh2RW50cnkuYmFyeWNlbnRlcikgfHxcbiAgICAgICAgICB1RW50cnkuYmFyeWNlbnRlciA+PSB2RW50cnkuYmFyeWNlbnRlcikge1xuICAgICAgICBtZXJnZUVudHJpZXModkVudHJ5LCB1RW50cnkpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVPdXQodkVudHJ5KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHdFbnRyeSkge1xuICAgICAgd0VudHJ5W1wiaW5cIl0ucHVzaCh2RW50cnkpO1xuICAgICAgaWYgKC0td0VudHJ5LmluZGVncmVlID09PSAwKSB7XG4gICAgICAgIHNvdXJjZVNldC5wdXNoKHdFbnRyeSk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHdoaWxlIChzb3VyY2VTZXQubGVuZ3RoKSB7XG4gICAgdmFyIGVudHJ5ID0gc291cmNlU2V0LnBvcCgpO1xuICAgIGVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgXy5mb3JFYWNoKGVudHJ5W1wiaW5cIl0ucmV2ZXJzZSgpLCBoYW5kbGVJbihlbnRyeSkpO1xuICAgIF8uZm9yRWFjaChlbnRyeS5vdXQsIGhhbmRsZU91dChlbnRyeSkpO1xuICB9XG5cbiAgcmV0dXJuIF8ubWFwKF8uZmlsdGVyKGVudHJpZXMsIGZ1bmN0aW9uKGVudHJ5KSB7IHJldHVybiAhZW50cnkubWVyZ2VkOyB9KSxcbiAgICBmdW5jdGlvbihlbnRyeSkge1xuICAgICAgcmV0dXJuIF8ucGljayhlbnRyeSwgW1widnNcIiwgXCJpXCIsIFwiYmFyeWNlbnRlclwiLCBcIndlaWdodFwiXSk7XG4gICAgfSk7XG5cbn1cblxuZnVuY3Rpb24gbWVyZ2VFbnRyaWVzKHRhcmdldCwgc291cmNlKSB7XG4gIHZhciBzdW0gPSAwO1xuICB2YXIgd2VpZ2h0ID0gMDtcblxuICBpZiAodGFyZ2V0LndlaWdodCkge1xuICAgIHN1bSArPSB0YXJnZXQuYmFyeWNlbnRlciAqIHRhcmdldC53ZWlnaHQ7XG4gICAgd2VpZ2h0ICs9IHRhcmdldC53ZWlnaHQ7XG4gIH1cblxuICBpZiAoc291cmNlLndlaWdodCkge1xuICAgIHN1bSArPSBzb3VyY2UuYmFyeWNlbnRlciAqIHNvdXJjZS53ZWlnaHQ7XG4gICAgd2VpZ2h0ICs9IHNvdXJjZS53ZWlnaHQ7XG4gIH1cblxuICB0YXJnZXQudnMgPSBzb3VyY2UudnMuY29uY2F0KHRhcmdldC52cyk7XG4gIHRhcmdldC5iYXJ5Y2VudGVyID0gc3VtIC8gd2VpZ2h0O1xuICB0YXJnZXQud2VpZ2h0ID0gd2VpZ2h0O1xuICB0YXJnZXQuaSA9IE1hdGgubWluKHNvdXJjZS5pLCB0YXJnZXQuaSk7XG4gIHNvdXJjZS5tZXJnZWQgPSB0cnVlO1xufVxuIiwidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xudmFyIGJhcnljZW50ZXIgPSByZXF1aXJlKFwiLi9iYXJ5Y2VudGVyXCIpO1xudmFyIHJlc29sdmVDb25mbGljdHMgPSByZXF1aXJlKFwiLi9yZXNvbHZlLWNvbmZsaWN0c1wiKTtcbnZhciBzb3J0ID0gcmVxdWlyZShcIi4vc29ydFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBzb3J0U3ViZ3JhcGg7XG5cbmZ1bmN0aW9uIHNvcnRTdWJncmFwaChnLCB2LCBjZywgYmlhc1JpZ2h0KSB7XG4gIHZhciBtb3ZhYmxlID0gZy5jaGlsZHJlbih2KTtcbiAgdmFyIG5vZGUgPSBnLm5vZGUodik7XG4gIHZhciBibCA9IG5vZGUgPyBub2RlLmJvcmRlckxlZnQgOiB1bmRlZmluZWQ7XG4gIHZhciBiciA9IG5vZGUgPyBub2RlLmJvcmRlclJpZ2h0OiB1bmRlZmluZWQ7XG4gIHZhciBzdWJncmFwaHMgPSB7fTtcblxuICBpZiAoYmwpIHtcbiAgICBtb3ZhYmxlID0gXy5maWx0ZXIobW92YWJsZSwgZnVuY3Rpb24odykge1xuICAgICAgcmV0dXJuIHcgIT09IGJsICYmIHcgIT09IGJyO1xuICAgIH0pO1xuICB9XG5cbiAgdmFyIGJhcnljZW50ZXJzID0gYmFyeWNlbnRlcihnLCBtb3ZhYmxlKTtcbiAgXy5mb3JFYWNoKGJhcnljZW50ZXJzLCBmdW5jdGlvbihlbnRyeSkge1xuICAgIGlmIChnLmNoaWxkcmVuKGVudHJ5LnYpLmxlbmd0aCkge1xuICAgICAgdmFyIHN1YmdyYXBoUmVzdWx0ID0gc29ydFN1YmdyYXBoKGcsIGVudHJ5LnYsIGNnLCBiaWFzUmlnaHQpO1xuICAgICAgc3ViZ3JhcGhzW2VudHJ5LnZdID0gc3ViZ3JhcGhSZXN1bHQ7XG4gICAgICBpZiAoXy5oYXMoc3ViZ3JhcGhSZXN1bHQsIFwiYmFyeWNlbnRlclwiKSkge1xuICAgICAgICBtZXJnZUJhcnljZW50ZXJzKGVudHJ5LCBzdWJncmFwaFJlc3VsdCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICB2YXIgZW50cmllcyA9IHJlc29sdmVDb25mbGljdHMoYmFyeWNlbnRlcnMsIGNnKTtcbiAgZXhwYW5kU3ViZ3JhcGhzKGVudHJpZXMsIHN1YmdyYXBocyk7XG5cbiAgdmFyIHJlc3VsdCA9IHNvcnQoZW50cmllcywgYmlhc1JpZ2h0KTtcblxuICBpZiAoYmwpIHtcbiAgICByZXN1bHQudnMgPSBfLmZsYXR0ZW4oW2JsLCByZXN1bHQudnMsIGJyXSwgdHJ1ZSk7XG4gICAgaWYgKGcucHJlZGVjZXNzb3JzKGJsKS5sZW5ndGgpIHtcbiAgICAgIHZhciBibFByZWQgPSBnLm5vZGUoZy5wcmVkZWNlc3NvcnMoYmwpWzBdKSxcbiAgICAgICAgYnJQcmVkID0gZy5ub2RlKGcucHJlZGVjZXNzb3JzKGJyKVswXSk7XG4gICAgICBpZiAoIV8uaGFzKHJlc3VsdCwgXCJiYXJ5Y2VudGVyXCIpKSB7XG4gICAgICAgIHJlc3VsdC5iYXJ5Y2VudGVyID0gMDtcbiAgICAgICAgcmVzdWx0LndlaWdodCA9IDA7XG4gICAgICB9XG4gICAgICByZXN1bHQuYmFyeWNlbnRlciA9IChyZXN1bHQuYmFyeWNlbnRlciAqIHJlc3VsdC53ZWlnaHQgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxQcmVkLm9yZGVyICsgYnJQcmVkLm9yZGVyKSAvIChyZXN1bHQud2VpZ2h0ICsgMik7XG4gICAgICByZXN1bHQud2VpZ2h0ICs9IDI7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gZXhwYW5kU3ViZ3JhcGhzKGVudHJpZXMsIHN1YmdyYXBocykge1xuICBfLmZvckVhY2goZW50cmllcywgZnVuY3Rpb24oZW50cnkpIHtcbiAgICBlbnRyeS52cyA9IF8uZmxhdHRlbihlbnRyeS52cy5tYXAoZnVuY3Rpb24odikge1xuICAgICAgaWYgKHN1YmdyYXBoc1t2XSkge1xuICAgICAgICByZXR1cm4gc3ViZ3JhcGhzW3ZdLnZzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHY7XG4gICAgfSksIHRydWUpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VCYXJ5Y2VudGVycyh0YXJnZXQsIG90aGVyKSB7XG4gIGlmICghXy5pc1VuZGVmaW5lZCh0YXJnZXQuYmFyeWNlbnRlcikpIHtcbiAgICB0YXJnZXQuYmFyeWNlbnRlciA9ICh0YXJnZXQuYmFyeWNlbnRlciAqIHRhcmdldC53ZWlnaHQgK1xuICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyLmJhcnljZW50ZXIgKiBvdGhlci53ZWlnaHQpIC9cbiAgICAgICAgICAgICAgICAgICAgICAgICh0YXJnZXQud2VpZ2h0ICsgb3RoZXIud2VpZ2h0KTtcbiAgICB0YXJnZXQud2VpZ2h0ICs9IG90aGVyLndlaWdodDtcbiAgfSBlbHNlIHtcbiAgICB0YXJnZXQuYmFyeWNlbnRlciA9IG90aGVyLmJhcnljZW50ZXI7XG4gICAgdGFyZ2V0LndlaWdodCA9IG90aGVyLndlaWdodDtcbiAgfVxufVxuIiwidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xudmFyIHV0aWwgPSByZXF1aXJlKFwiLi4vdXRpbFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBzb3J0O1xuXG5mdW5jdGlvbiBzb3J0KGVudHJpZXMsIGJpYXNSaWdodCkge1xuICB2YXIgcGFydHMgPSB1dGlsLnBhcnRpdGlvbihlbnRyaWVzLCBmdW5jdGlvbihlbnRyeSkge1xuICAgIHJldHVybiBfLmhhcyhlbnRyeSwgXCJiYXJ5Y2VudGVyXCIpO1xuICB9KTtcbiAgdmFyIHNvcnRhYmxlID0gcGFydHMubGhzLFxuICAgIHVuc29ydGFibGUgPSBfLnNvcnRCeShwYXJ0cy5yaHMsIGZ1bmN0aW9uKGVudHJ5KSB7IHJldHVybiAtZW50cnkuaTsgfSksXG4gICAgdnMgPSBbXSxcbiAgICBzdW0gPSAwLFxuICAgIHdlaWdodCA9IDAsXG4gICAgdnNJbmRleCA9IDA7XG5cbiAgc29ydGFibGUuc29ydChjb21wYXJlV2l0aEJpYXMoISFiaWFzUmlnaHQpKTtcblxuICB2c0luZGV4ID0gY29uc3VtZVVuc29ydGFibGUodnMsIHVuc29ydGFibGUsIHZzSW5kZXgpO1xuXG4gIF8uZm9yRWFjaChzb3J0YWJsZSwgZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgdnNJbmRleCArPSBlbnRyeS52cy5sZW5ndGg7XG4gICAgdnMucHVzaChlbnRyeS52cyk7XG4gICAgc3VtICs9IGVudHJ5LmJhcnljZW50ZXIgKiBlbnRyeS53ZWlnaHQ7XG4gICAgd2VpZ2h0ICs9IGVudHJ5LndlaWdodDtcbiAgICB2c0luZGV4ID0gY29uc3VtZVVuc29ydGFibGUodnMsIHVuc29ydGFibGUsIHZzSW5kZXgpO1xuICB9KTtcblxuICB2YXIgcmVzdWx0ID0geyB2czogXy5mbGF0dGVuKHZzLCB0cnVlKSB9O1xuICBpZiAod2VpZ2h0KSB7XG4gICAgcmVzdWx0LmJhcnljZW50ZXIgPSBzdW0gLyB3ZWlnaHQ7XG4gICAgcmVzdWx0LndlaWdodCA9IHdlaWdodDtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBjb25zdW1lVW5zb3J0YWJsZSh2cywgdW5zb3J0YWJsZSwgaW5kZXgpIHtcbiAgdmFyIGxhc3Q7XG4gIHdoaWxlICh1bnNvcnRhYmxlLmxlbmd0aCAmJiAobGFzdCA9IF8ubGFzdCh1bnNvcnRhYmxlKSkuaSA8PSBpbmRleCkge1xuICAgIHVuc29ydGFibGUucG9wKCk7XG4gICAgdnMucHVzaChsYXN0LnZzKTtcbiAgICBpbmRleCsrO1xuICB9XG4gIHJldHVybiBpbmRleDtcbn1cblxuZnVuY3Rpb24gY29tcGFyZVdpdGhCaWFzKGJpYXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGVudHJ5ViwgZW50cnlXKSB7XG4gICAgaWYgKGVudHJ5Vi5iYXJ5Y2VudGVyIDwgZW50cnlXLmJhcnljZW50ZXIpIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9IGVsc2UgaWYgKGVudHJ5Vi5iYXJ5Y2VudGVyID4gZW50cnlXLmJhcnljZW50ZXIpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cblxuICAgIHJldHVybiAhYmlhcyA/IGVudHJ5Vi5pIC0gZW50cnlXLmkgOiBlbnRyeVcuaSAtIGVudHJ5Vi5pO1xuICB9O1xufVxuIiwidmFyIF8gPSByZXF1aXJlKFwiLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50RHVtbXlDaGFpbnM7XG5cbmZ1bmN0aW9uIHBhcmVudER1bW15Q2hhaW5zKGcpIHtcbiAgdmFyIHBvc3RvcmRlck51bXMgPSBwb3N0b3JkZXIoZyk7XG5cbiAgXy5mb3JFYWNoKGcuZ3JhcGgoKS5kdW1teUNoYWlucywgZnVuY3Rpb24odikge1xuICAgIHZhciBub2RlID0gZy5ub2RlKHYpO1xuICAgIHZhciBlZGdlT2JqID0gbm9kZS5lZGdlT2JqO1xuICAgIHZhciBwYXRoRGF0YSA9IGZpbmRQYXRoKGcsIHBvc3RvcmRlck51bXMsIGVkZ2VPYmoudiwgZWRnZU9iai53KTtcbiAgICB2YXIgcGF0aCA9IHBhdGhEYXRhLnBhdGg7XG4gICAgdmFyIGxjYSA9IHBhdGhEYXRhLmxjYTtcbiAgICB2YXIgcGF0aElkeCA9IDA7XG4gICAgdmFyIHBhdGhWID0gcGF0aFtwYXRoSWR4XTtcbiAgICB2YXIgYXNjZW5kaW5nID0gdHJ1ZTtcblxuICAgIHdoaWxlICh2ICE9PSBlZGdlT2JqLncpIHtcbiAgICAgIG5vZGUgPSBnLm5vZGUodik7XG5cbiAgICAgIGlmIChhc2NlbmRpbmcpIHtcbiAgICAgICAgd2hpbGUgKChwYXRoViA9IHBhdGhbcGF0aElkeF0pICE9PSBsY2EgJiZcbiAgICAgICAgICAgICAgIGcubm9kZShwYXRoVikubWF4UmFuayA8IG5vZGUucmFuaykge1xuICAgICAgICAgIHBhdGhJZHgrKztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXRoViA9PT0gbGNhKSB7XG4gICAgICAgICAgYXNjZW5kaW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFhc2NlbmRpbmcpIHtcbiAgICAgICAgd2hpbGUgKHBhdGhJZHggPCBwYXRoLmxlbmd0aCAtIDEgJiZcbiAgICAgICAgICAgICAgIGcubm9kZShwYXRoViA9IHBhdGhbcGF0aElkeCArIDFdKS5taW5SYW5rIDw9IG5vZGUucmFuaykge1xuICAgICAgICAgIHBhdGhJZHgrKztcbiAgICAgICAgfVxuICAgICAgICBwYXRoViA9IHBhdGhbcGF0aElkeF07XG4gICAgICB9XG5cbiAgICAgIGcuc2V0UGFyZW50KHYsIHBhdGhWKTtcbiAgICAgIHYgPSBnLnN1Y2Nlc3NvcnModilbMF07XG4gICAgfVxuICB9KTtcbn1cblxuLy8gRmluZCBhIHBhdGggZnJvbSB2IHRvIHcgdGhyb3VnaCB0aGUgbG93ZXN0IGNvbW1vbiBhbmNlc3RvciAoTENBKS4gUmV0dXJuIHRoZVxuLy8gZnVsbCBwYXRoIGFuZCB0aGUgTENBLlxuZnVuY3Rpb24gZmluZFBhdGgoZywgcG9zdG9yZGVyTnVtcywgdiwgdykge1xuICB2YXIgdlBhdGggPSBbXTtcbiAgdmFyIHdQYXRoID0gW107XG4gIHZhciBsb3cgPSBNYXRoLm1pbihwb3N0b3JkZXJOdW1zW3ZdLmxvdywgcG9zdG9yZGVyTnVtc1t3XS5sb3cpO1xuICB2YXIgbGltID0gTWF0aC5tYXgocG9zdG9yZGVyTnVtc1t2XS5saW0sIHBvc3RvcmRlck51bXNbd10ubGltKTtcbiAgdmFyIHBhcmVudDtcbiAgdmFyIGxjYTtcblxuICAvLyBUcmF2ZXJzZSB1cCBmcm9tIHYgdG8gZmluZCB0aGUgTENBXG4gIHBhcmVudCA9IHY7XG4gIGRvIHtcbiAgICBwYXJlbnQgPSBnLnBhcmVudChwYXJlbnQpO1xuICAgIHZQYXRoLnB1c2gocGFyZW50KTtcbiAgfSB3aGlsZSAocGFyZW50ICYmXG4gICAgICAgICAgIChwb3N0b3JkZXJOdW1zW3BhcmVudF0ubG93ID4gbG93IHx8IGxpbSA+IHBvc3RvcmRlck51bXNbcGFyZW50XS5saW0pKTtcbiAgbGNhID0gcGFyZW50O1xuXG4gIC8vIFRyYXZlcnNlIGZyb20gdyB0byBMQ0FcbiAgcGFyZW50ID0gdztcbiAgd2hpbGUgKChwYXJlbnQgPSBnLnBhcmVudChwYXJlbnQpKSAhPT0gbGNhKSB7XG4gICAgd1BhdGgucHVzaChwYXJlbnQpO1xuICB9XG5cbiAgcmV0dXJuIHsgcGF0aDogdlBhdGguY29uY2F0KHdQYXRoLnJldmVyc2UoKSksIGxjYTogbGNhIH07XG59XG5cbmZ1bmN0aW9uIHBvc3RvcmRlcihnKSB7XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgdmFyIGxpbSA9IDA7XG5cbiAgZnVuY3Rpb24gZGZzKHYpIHtcbiAgICB2YXIgbG93ID0gbGltO1xuICAgIF8uZm9yRWFjaChnLmNoaWxkcmVuKHYpLCBkZnMpO1xuICAgIHJlc3VsdFt2XSA9IHsgbG93OiBsb3csIGxpbTogbGltKysgfTtcbiAgfVxuICBfLmZvckVhY2goZy5jaGlsZHJlbigpLCBkZnMpO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xudmFyIEdyYXBoID0gcmVxdWlyZShcIi4uL2dyYXBobGliXCIpLkdyYXBoO1xudmFyIHV0aWwgPSByZXF1aXJlKFwiLi4vdXRpbFwiKTtcblxuLypcbiAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGNvb3JkaW5hdGUgYXNzaWdubWVudCBiYXNlZCBvbiBCcmFuZGVzIGFuZCBLw7ZwZiwgXCJGYXN0XG4gKiBhbmQgU2ltcGxlIEhvcml6b250YWwgQ29vcmRpbmF0ZSBBc3NpZ25tZW50LlwiXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHBvc2l0aW9uWDogcG9zaXRpb25YLFxuICBmaW5kVHlwZTFDb25mbGljdHM6IGZpbmRUeXBlMUNvbmZsaWN0cyxcbiAgZmluZFR5cGUyQ29uZmxpY3RzOiBmaW5kVHlwZTJDb25mbGljdHMsXG4gIGFkZENvbmZsaWN0OiBhZGRDb25mbGljdCxcbiAgaGFzQ29uZmxpY3Q6IGhhc0NvbmZsaWN0LFxuICB2ZXJ0aWNhbEFsaWdubWVudDogdmVydGljYWxBbGlnbm1lbnQsXG4gIGhvcml6b250YWxDb21wYWN0aW9uOiBob3Jpem9udGFsQ29tcGFjdGlvbixcbiAgYWxpZ25Db29yZGluYXRlczogYWxpZ25Db29yZGluYXRlcyxcbiAgZmluZFNtYWxsZXN0V2lkdGhBbGlnbm1lbnQ6IGZpbmRTbWFsbGVzdFdpZHRoQWxpZ25tZW50LFxuICBiYWxhbmNlOiBiYWxhbmNlXG59O1xuXG4vKlxuICogTWFya3MgYWxsIGVkZ2VzIGluIHRoZSBncmFwaCB3aXRoIGEgdHlwZS0xIGNvbmZsaWN0IHdpdGggdGhlIFwidHlwZTFDb25mbGljdFwiXG4gKiBwcm9wZXJ0eS4gQSB0eXBlLTEgY29uZmxpY3QgaXMgb25lIHdoZXJlIGEgbm9uLWlubmVyIHNlZ21lbnQgY3Jvc3NlcyBhblxuICogaW5uZXIgc2VnbWVudC4gQW4gaW5uZXIgc2VnbWVudCBpcyBhbiBlZGdlIHdpdGggYm90aCBpbmNpZGVudCBub2RlcyBtYXJrZWRcbiAqIHdpdGggdGhlIFwiZHVtbXlcIiBwcm9wZXJ0eS5cbiAqXG4gKiBUaGlzIGFsZ29yaXRobSBzY2FucyBsYXllciBieSBsYXllciwgc3RhcnRpbmcgd2l0aCB0aGUgc2Vjb25kLCBmb3IgdHlwZS0xXG4gKiBjb25mbGljdHMgYmV0d2VlbiB0aGUgY3VycmVudCBsYXllciBhbmQgdGhlIHByZXZpb3VzIGxheWVyLiBGb3IgZWFjaCBsYXllclxuICogaXQgc2NhbnMgdGhlIG5vZGVzIGZyb20gbGVmdCB0byByaWdodCB1bnRpbCBpdCByZWFjaGVzIG9uZSB0aGF0IGlzIGluY2lkZW50XG4gKiBvbiBhbiBpbm5lciBzZWdtZW50LiBJdCB0aGVuIHNjYW5zIHByZWRlY2Vzc29ycyB0byBkZXRlcm1pbmUgaWYgdGhleSBoYXZlXG4gKiBlZGdlcyB0aGF0IGNyb3NzIHRoYXQgaW5uZXIgc2VnbWVudC4gQXQgdGhlIGVuZCBhIGZpbmFsIHNjYW4gaXMgZG9uZSBmb3IgYWxsXG4gKiBub2RlcyBvbiB0aGUgY3VycmVudCByYW5rIHRvIHNlZSBpZiB0aGV5IGNyb3NzIHRoZSBsYXN0IHZpc2l0ZWQgaW5uZXJcbiAqIHNlZ21lbnQuXG4gKlxuICogVGhpcyBhbGdvcml0aG0gKHNhZmVseSkgYXNzdW1lcyB0aGF0IGEgZHVtbXkgbm9kZSB3aWxsIG9ubHkgYmUgaW5jaWRlbnQgb24gYVxuICogc2luZ2xlIG5vZGUgaW4gdGhlIGxheWVycyBiZWluZyBzY2FubmVkLlxuICovXG5mdW5jdGlvbiBmaW5kVHlwZTFDb25mbGljdHMoZywgbGF5ZXJpbmcpIHtcbiAgdmFyIGNvbmZsaWN0cyA9IHt9O1xuXG4gIGZ1bmN0aW9uIHZpc2l0TGF5ZXIocHJldkxheWVyLCBsYXllcikge1xuICAgIHZhclxuICAgICAgLy8gbGFzdCB2aXNpdGVkIG5vZGUgaW4gdGhlIHByZXZpb3VzIGxheWVyIHRoYXQgaXMgaW5jaWRlbnQgb24gYW4gaW5uZXJcbiAgICAgIC8vIHNlZ21lbnQuXG4gICAgICBrMCA9IDAsXG4gICAgICAvLyBUcmFja3MgdGhlIGxhc3Qgbm9kZSBpbiB0aGlzIGxheWVyIHNjYW5uZWQgZm9yIGNyb3NzaW5ncyB3aXRoIGEgdHlwZS0xXG4gICAgICAvLyBzZWdtZW50LlxuICAgICAgc2NhblBvcyA9IDAsXG4gICAgICBwcmV2TGF5ZXJMZW5ndGggPSBwcmV2TGF5ZXIubGVuZ3RoLFxuICAgICAgbGFzdE5vZGUgPSBfLmxhc3QobGF5ZXIpO1xuXG4gICAgXy5mb3JFYWNoKGxheWVyLCBmdW5jdGlvbih2LCBpKSB7XG4gICAgICB2YXIgdyA9IGZpbmRPdGhlcklubmVyU2VnbWVudE5vZGUoZywgdiksXG4gICAgICAgIGsxID0gdyA/IGcubm9kZSh3KS5vcmRlciA6IHByZXZMYXllckxlbmd0aDtcblxuICAgICAgaWYgKHcgfHwgdiA9PT0gbGFzdE5vZGUpIHtcbiAgICAgICAgXy5mb3JFYWNoKGxheWVyLnNsaWNlKHNjYW5Qb3MsIGkgKzEpLCBmdW5jdGlvbihzY2FuTm9kZSkge1xuICAgICAgICAgIF8uZm9yRWFjaChnLnByZWRlY2Vzc29ycyhzY2FuTm9kZSksIGZ1bmN0aW9uKHUpIHtcbiAgICAgICAgICAgIHZhciB1TGFiZWwgPSBnLm5vZGUodSksXG4gICAgICAgICAgICAgIHVQb3MgPSB1TGFiZWwub3JkZXI7XG4gICAgICAgICAgICBpZiAoKHVQb3MgPCBrMCB8fCBrMSA8IHVQb3MpICYmXG4gICAgICAgICAgICAgICAgISh1TGFiZWwuZHVtbXkgJiYgZy5ub2RlKHNjYW5Ob2RlKS5kdW1teSkpIHtcbiAgICAgICAgICAgICAgYWRkQ29uZmxpY3QoY29uZmxpY3RzLCB1LCBzY2FuTm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBzY2FuUG9zID0gaSArIDE7XG4gICAgICAgIGswID0gazE7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbGF5ZXI7XG4gIH1cblxuICBfLnJlZHVjZShsYXllcmluZywgdmlzaXRMYXllcik7XG4gIHJldHVybiBjb25mbGljdHM7XG59XG5cbmZ1bmN0aW9uIGZpbmRUeXBlMkNvbmZsaWN0cyhnLCBsYXllcmluZykge1xuICB2YXIgY29uZmxpY3RzID0ge307XG5cbiAgZnVuY3Rpb24gc2Nhbihzb3V0aCwgc291dGhQb3MsIHNvdXRoRW5kLCBwcmV2Tm9ydGhCb3JkZXIsIG5leHROb3J0aEJvcmRlcikge1xuICAgIHZhciB2O1xuICAgIF8uZm9yRWFjaChfLnJhbmdlKHNvdXRoUG9zLCBzb3V0aEVuZCksIGZ1bmN0aW9uKGkpIHtcbiAgICAgIHYgPSBzb3V0aFtpXTtcbiAgICAgIGlmIChnLm5vZGUodikuZHVtbXkpIHtcbiAgICAgICAgXy5mb3JFYWNoKGcucHJlZGVjZXNzb3JzKHYpLCBmdW5jdGlvbih1KSB7XG4gICAgICAgICAgdmFyIHVOb2RlID0gZy5ub2RlKHUpO1xuICAgICAgICAgIGlmICh1Tm9kZS5kdW1teSAmJlxuICAgICAgICAgICAgICAodU5vZGUub3JkZXIgPCBwcmV2Tm9ydGhCb3JkZXIgfHwgdU5vZGUub3JkZXIgPiBuZXh0Tm9ydGhCb3JkZXIpKSB7XG4gICAgICAgICAgICBhZGRDb25mbGljdChjb25mbGljdHMsIHUsIHYpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuXG4gIGZ1bmN0aW9uIHZpc2l0TGF5ZXIobm9ydGgsIHNvdXRoKSB7XG4gICAgdmFyIHByZXZOb3J0aFBvcyA9IC0xLFxuICAgICAgbmV4dE5vcnRoUG9zLFxuICAgICAgc291dGhQb3MgPSAwO1xuXG4gICAgXy5mb3JFYWNoKHNvdXRoLCBmdW5jdGlvbih2LCBzb3V0aExvb2thaGVhZCkge1xuICAgICAgaWYgKGcubm9kZSh2KS5kdW1teSA9PT0gXCJib3JkZXJcIikge1xuICAgICAgICB2YXIgcHJlZGVjZXNzb3JzID0gZy5wcmVkZWNlc3NvcnModik7XG4gICAgICAgIGlmIChwcmVkZWNlc3NvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgbmV4dE5vcnRoUG9zID0gZy5ub2RlKHByZWRlY2Vzc29yc1swXSkub3JkZXI7XG4gICAgICAgICAgc2Nhbihzb3V0aCwgc291dGhQb3MsIHNvdXRoTG9va2FoZWFkLCBwcmV2Tm9ydGhQb3MsIG5leHROb3J0aFBvcyk7XG4gICAgICAgICAgc291dGhQb3MgPSBzb3V0aExvb2thaGVhZDtcbiAgICAgICAgICBwcmV2Tm9ydGhQb3MgPSBuZXh0Tm9ydGhQb3M7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHNjYW4oc291dGgsIHNvdXRoUG9zLCBzb3V0aC5sZW5ndGgsIG5leHROb3J0aFBvcywgbm9ydGgubGVuZ3RoKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBzb3V0aDtcbiAgfVxuXG4gIF8ucmVkdWNlKGxheWVyaW5nLCB2aXNpdExheWVyKTtcbiAgcmV0dXJuIGNvbmZsaWN0cztcbn1cblxuZnVuY3Rpb24gZmluZE90aGVySW5uZXJTZWdtZW50Tm9kZShnLCB2KSB7XG4gIGlmIChnLm5vZGUodikuZHVtbXkpIHtcbiAgICByZXR1cm4gXy5maW5kKGcucHJlZGVjZXNzb3JzKHYpLCBmdW5jdGlvbih1KSB7XG4gICAgICByZXR1cm4gZy5ub2RlKHUpLmR1bW15O1xuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFkZENvbmZsaWN0KGNvbmZsaWN0cywgdiwgdykge1xuICBpZiAodiA+IHcpIHtcbiAgICB2YXIgdG1wID0gdjtcbiAgICB2ID0gdztcbiAgICB3ID0gdG1wO1xuICB9XG5cbiAgdmFyIGNvbmZsaWN0c1YgPSBjb25mbGljdHNbdl07XG4gIGlmICghY29uZmxpY3RzVikge1xuICAgIGNvbmZsaWN0c1t2XSA9IGNvbmZsaWN0c1YgPSB7fTtcbiAgfVxuICBjb25mbGljdHNWW3ddID0gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaGFzQ29uZmxpY3QoY29uZmxpY3RzLCB2LCB3KSB7XG4gIGlmICh2ID4gdykge1xuICAgIHZhciB0bXAgPSB2O1xuICAgIHYgPSB3O1xuICAgIHcgPSB0bXA7XG4gIH1cbiAgcmV0dXJuIF8uaGFzKGNvbmZsaWN0c1t2XSwgdyk7XG59XG5cbi8qXG4gKiBUcnkgdG8gYWxpZ24gbm9kZXMgaW50byB2ZXJ0aWNhbCBcImJsb2Nrc1wiIHdoZXJlIHBvc3NpYmxlLiBUaGlzIGFsZ29yaXRobVxuICogYXR0ZW1wdHMgdG8gYWxpZ24gYSBub2RlIHdpdGggb25lIG9mIGl0cyBtZWRpYW4gbmVpZ2hib3JzLiBJZiB0aGUgZWRnZVxuICogY29ubmVjdGluZyBhIG5laWdoYm9yIGlzIGEgdHlwZS0xIGNvbmZsaWN0IHRoZW4gd2UgaWdub3JlIHRoYXQgcG9zc2liaWxpdHkuXG4gKiBJZiBhIHByZXZpb3VzIG5vZGUgaGFzIGFscmVhZHkgZm9ybWVkIGEgYmxvY2sgd2l0aCBhIG5vZGUgYWZ0ZXIgdGhlIG5vZGVcbiAqIHdlJ3JlIHRyeWluZyB0byBmb3JtIGEgYmxvY2sgd2l0aCwgd2UgYWxzbyBpZ25vcmUgdGhhdCBwb3NzaWJpbGl0eSAtIG91clxuICogYmxvY2tzIHdvdWxkIGJlIHNwbGl0IGluIHRoYXQgc2NlbmFyaW8uXG4gKi9cbmZ1bmN0aW9uIHZlcnRpY2FsQWxpZ25tZW50KGcsIGxheWVyaW5nLCBjb25mbGljdHMsIG5laWdoYm9yRm4pIHtcbiAgdmFyIHJvb3QgPSB7fSxcbiAgICBhbGlnbiA9IHt9LFxuICAgIHBvcyA9IHt9O1xuXG4gIC8vIFdlIGNhY2hlIHRoZSBwb3NpdGlvbiBoZXJlIGJhc2VkIG9uIHRoZSBsYXllcmluZyBiZWNhdXNlIHRoZSBncmFwaCBhbmRcbiAgLy8gbGF5ZXJpbmcgbWF5IGJlIG91dCBvZiBzeW5jLiBUaGUgbGF5ZXJpbmcgbWF0cml4IGlzIG1hbmlwdWxhdGVkIHRvXG4gIC8vIGdlbmVyYXRlIGRpZmZlcmVudCBleHRyZW1lIGFsaWdubWVudHMuXG4gIF8uZm9yRWFjaChsYXllcmluZywgZnVuY3Rpb24obGF5ZXIpIHtcbiAgICBfLmZvckVhY2gobGF5ZXIsIGZ1bmN0aW9uKHYsIG9yZGVyKSB7XG4gICAgICByb290W3ZdID0gdjtcbiAgICAgIGFsaWduW3ZdID0gdjtcbiAgICAgIHBvc1t2XSA9IG9yZGVyO1xuICAgIH0pO1xuICB9KTtcblxuICBfLmZvckVhY2gobGF5ZXJpbmcsIGZ1bmN0aW9uKGxheWVyKSB7XG4gICAgdmFyIHByZXZJZHggPSAtMTtcbiAgICBfLmZvckVhY2gobGF5ZXIsIGZ1bmN0aW9uKHYpIHtcbiAgICAgIHZhciB3cyA9IG5laWdoYm9yRm4odik7XG4gICAgICBpZiAod3MubGVuZ3RoKSB7XG4gICAgICAgIHdzID0gXy5zb3J0Qnkod3MsIGZ1bmN0aW9uKHcpIHsgcmV0dXJuIHBvc1t3XTsgfSk7XG4gICAgICAgIHZhciBtcCA9ICh3cy5sZW5ndGggLSAxKSAvIDI7XG4gICAgICAgIGZvciAodmFyIGkgPSBNYXRoLmZsb29yKG1wKSwgaWwgPSBNYXRoLmNlaWwobXApOyBpIDw9IGlsOyArK2kpIHtcbiAgICAgICAgICB2YXIgdyA9IHdzW2ldO1xuICAgICAgICAgIGlmIChhbGlnblt2XSA9PT0gdiAmJlxuICAgICAgICAgICAgICBwcmV2SWR4IDwgcG9zW3ddICYmXG4gICAgICAgICAgICAgICFoYXNDb25mbGljdChjb25mbGljdHMsIHYsIHcpKSB7XG4gICAgICAgICAgICBhbGlnblt3XSA9IHY7XG4gICAgICAgICAgICBhbGlnblt2XSA9IHJvb3Rbdl0gPSByb290W3ddO1xuICAgICAgICAgICAgcHJldklkeCA9IHBvc1t3XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHsgcm9vdDogcm9vdCwgYWxpZ246IGFsaWduIH07XG59XG5cbmZ1bmN0aW9uIGhvcml6b250YWxDb21wYWN0aW9uKGcsIGxheWVyaW5nLCByb290LCBhbGlnbiwgcmV2ZXJzZVNlcCkge1xuICAvLyBUaGlzIHBvcnRpb24gb2YgdGhlIGFsZ29yaXRobSBkaWZmZXJzIGZyb20gQksgZHVlIHRvIGEgbnVtYmVyIG9mIHByb2JsZW1zLlxuICAvLyBJbnN0ZWFkIG9mIHRoZWlyIGFsZ29yaXRobSB3ZSBjb25zdHJ1Y3QgYSBuZXcgYmxvY2sgZ3JhcGggYW5kIGRvIHR3b1xuICAvLyBzd2VlcHMuIFRoZSBmaXJzdCBzd2VlcCBwbGFjZXMgYmxvY2tzIHdpdGggdGhlIHNtYWxsZXN0IHBvc3NpYmxlXG4gIC8vIGNvb3JkaW5hdGVzLiBUaGUgc2Vjb25kIHN3ZWVwIHJlbW92ZXMgdW51c2VkIHNwYWNlIGJ5IG1vdmluZyBibG9ja3MgdG8gdGhlXG4gIC8vIGdyZWF0ZXN0IGNvb3JkaW5hdGVzIHdpdGhvdXQgdmlvbGF0aW5nIHNlcGFyYXRpb24uXG4gIHZhciB4cyA9IHt9LFxuICAgIGJsb2NrRyA9IGJ1aWxkQmxvY2tHcmFwaChnLCBsYXllcmluZywgcm9vdCwgcmV2ZXJzZVNlcCksXG4gICAgYm9yZGVyVHlwZSA9IHJldmVyc2VTZXAgPyBcImJvcmRlckxlZnRcIiA6IFwiYm9yZGVyUmlnaHRcIjtcblxuICBmdW5jdGlvbiBpdGVyYXRlKHNldFhzRnVuYywgbmV4dE5vZGVzRnVuYykge1xuICAgIHZhciBzdGFjayA9IGJsb2NrRy5ub2RlcygpO1xuICAgIHZhciBlbGVtID0gc3RhY2sucG9wKCk7XG4gICAgdmFyIHZpc2l0ZWQgPSB7fTtcbiAgICB3aGlsZSAoZWxlbSkge1xuICAgICAgaWYgKHZpc2l0ZWRbZWxlbV0pIHtcbiAgICAgICAgc2V0WHNGdW5jKGVsZW0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmlzaXRlZFtlbGVtXSA9IHRydWU7XG4gICAgICAgIHN0YWNrLnB1c2goZWxlbSk7XG4gICAgICAgIHN0YWNrID0gc3RhY2suY29uY2F0KG5leHROb2Rlc0Z1bmMoZWxlbSkpO1xuICAgICAgfVxuXG4gICAgICBlbGVtID0gc3RhY2sucG9wKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gRmlyc3QgcGFzcywgYXNzaWduIHNtYWxsZXN0IGNvb3JkaW5hdGVzXG4gIGZ1bmN0aW9uIHBhc3MxKGVsZW0pIHtcbiAgICB4c1tlbGVtXSA9IGJsb2NrRy5pbkVkZ2VzKGVsZW0pLnJlZHVjZShmdW5jdGlvbihhY2MsIGUpIHtcbiAgICAgIHJldHVybiBNYXRoLm1heChhY2MsIHhzW2Uudl0gKyBibG9ja0cuZWRnZShlKSk7XG4gICAgfSwgMCk7XG4gIH1cblxuICAvLyBTZWNvbmQgcGFzcywgYXNzaWduIGdyZWF0ZXN0IGNvb3JkaW5hdGVzXG4gIGZ1bmN0aW9uIHBhc3MyKGVsZW0pIHtcbiAgICB2YXIgbWluID0gYmxvY2tHLm91dEVkZ2VzKGVsZW0pLnJlZHVjZShmdW5jdGlvbihhY2MsIGUpIHtcbiAgICAgIHJldHVybiBNYXRoLm1pbihhY2MsIHhzW2Uud10gLSBibG9ja0cuZWRnZShlKSk7XG4gICAgfSwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTtcblxuICAgIHZhciBub2RlID0gZy5ub2RlKGVsZW0pO1xuICAgIGlmIChtaW4gIT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSAmJiBub2RlLmJvcmRlclR5cGUgIT09IGJvcmRlclR5cGUpIHtcbiAgICAgIHhzW2VsZW1dID0gTWF0aC5tYXgoeHNbZWxlbV0sIG1pbik7XG4gICAgfVxuICB9XG5cbiAgaXRlcmF0ZShwYXNzMSwgYmxvY2tHLnByZWRlY2Vzc29ycy5iaW5kKGJsb2NrRykpO1xuICBpdGVyYXRlKHBhc3MyLCBibG9ja0cuc3VjY2Vzc29ycy5iaW5kKGJsb2NrRykpO1xuXG4gIC8vIEFzc2lnbiB4IGNvb3JkaW5hdGVzIHRvIGFsbCBub2Rlc1xuICBfLmZvckVhY2goYWxpZ24sIGZ1bmN0aW9uKHYpIHtcbiAgICB4c1t2XSA9IHhzW3Jvb3Rbdl1dO1xuICB9KTtcblxuICByZXR1cm4geHM7XG59XG5cblxuZnVuY3Rpb24gYnVpbGRCbG9ja0dyYXBoKGcsIGxheWVyaW5nLCByb290LCByZXZlcnNlU2VwKSB7XG4gIHZhciBibG9ja0dyYXBoID0gbmV3IEdyYXBoKCksXG4gICAgZ3JhcGhMYWJlbCA9IGcuZ3JhcGgoKSxcbiAgICBzZXBGbiA9IHNlcChncmFwaExhYmVsLm5vZGVzZXAsIGdyYXBoTGFiZWwuZWRnZXNlcCwgcmV2ZXJzZVNlcCk7XG5cbiAgXy5mb3JFYWNoKGxheWVyaW5nLCBmdW5jdGlvbihsYXllcikge1xuICAgIHZhciB1O1xuICAgIF8uZm9yRWFjaChsYXllciwgZnVuY3Rpb24odikge1xuICAgICAgdmFyIHZSb290ID0gcm9vdFt2XTtcbiAgICAgIGJsb2NrR3JhcGguc2V0Tm9kZSh2Um9vdCk7XG4gICAgICBpZiAodSkge1xuICAgICAgICB2YXIgdVJvb3QgPSByb290W3VdLFxuICAgICAgICAgIHByZXZNYXggPSBibG9ja0dyYXBoLmVkZ2UodVJvb3QsIHZSb290KTtcbiAgICAgICAgYmxvY2tHcmFwaC5zZXRFZGdlKHVSb290LCB2Um9vdCwgTWF0aC5tYXgoc2VwRm4oZywgdiwgdSksIHByZXZNYXggfHwgMCkpO1xuICAgICAgfVxuICAgICAgdSA9IHY7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiBibG9ja0dyYXBoO1xufVxuXG4vKlxuICogUmV0dXJucyB0aGUgYWxpZ25tZW50IHRoYXQgaGFzIHRoZSBzbWFsbGVzdCB3aWR0aCBvZiB0aGUgZ2l2ZW4gYWxpZ25tZW50cy5cbiAqL1xuZnVuY3Rpb24gZmluZFNtYWxsZXN0V2lkdGhBbGlnbm1lbnQoZywgeHNzKSB7XG4gIHJldHVybiBfLm1pbkJ5KF8udmFsdWVzKHhzcyksIGZ1bmN0aW9uICh4cykge1xuICAgIHZhciBtYXggPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG4gICAgdmFyIG1pbiA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcblxuICAgIF8uZm9ySW4oeHMsIGZ1bmN0aW9uICh4LCB2KSB7XG4gICAgICB2YXIgaGFsZldpZHRoID0gd2lkdGgoZywgdikgLyAyO1xuXG4gICAgICBtYXggPSBNYXRoLm1heCh4ICsgaGFsZldpZHRoLCBtYXgpO1xuICAgICAgbWluID0gTWF0aC5taW4oeCAtIGhhbGZXaWR0aCwgbWluKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBtYXggLSBtaW47XG4gIH0pO1xufVxuXG4vKlxuICogQWxpZ24gdGhlIGNvb3JkaW5hdGVzIG9mIGVhY2ggb2YgdGhlIGxheW91dCBhbGlnbm1lbnRzIHN1Y2ggdGhhdFxuICogbGVmdC1iaWFzZWQgYWxpZ25tZW50cyBoYXZlIHRoZWlyIG1pbmltdW0gY29vcmRpbmF0ZSBhdCB0aGUgc2FtZSBwb2ludCBhc1xuICogdGhlIG1pbmltdW0gY29vcmRpbmF0ZSBvZiB0aGUgc21hbGxlc3Qgd2lkdGggYWxpZ25tZW50IGFuZCByaWdodC1iaWFzZWRcbiAqIGFsaWdubWVudHMgaGF2ZSB0aGVpciBtYXhpbXVtIGNvb3JkaW5hdGUgYXQgdGhlIHNhbWUgcG9pbnQgYXMgdGhlIG1heGltdW1cbiAqIGNvb3JkaW5hdGUgb2YgdGhlIHNtYWxsZXN0IHdpZHRoIGFsaWdubWVudC5cbiAqL1xuZnVuY3Rpb24gYWxpZ25Db29yZGluYXRlcyh4c3MsIGFsaWduVG8pIHtcbiAgdmFyIGFsaWduVG9WYWxzID0gXy52YWx1ZXMoYWxpZ25UbyksXG4gICAgYWxpZ25Ub01pbiA9IF8ubWluKGFsaWduVG9WYWxzKSxcbiAgICBhbGlnblRvTWF4ID0gXy5tYXgoYWxpZ25Ub1ZhbHMpO1xuXG4gIF8uZm9yRWFjaChbXCJ1XCIsIFwiZFwiXSwgZnVuY3Rpb24odmVydCkge1xuICAgIF8uZm9yRWFjaChbXCJsXCIsIFwiclwiXSwgZnVuY3Rpb24oaG9yaXopIHtcbiAgICAgIHZhciBhbGlnbm1lbnQgPSB2ZXJ0ICsgaG9yaXosXG4gICAgICAgIHhzID0geHNzW2FsaWdubWVudF0sXG4gICAgICAgIGRlbHRhO1xuICAgICAgaWYgKHhzID09PSBhbGlnblRvKSByZXR1cm47XG5cbiAgICAgIHZhciB4c1ZhbHMgPSBfLnZhbHVlcyh4cyk7XG4gICAgICBkZWx0YSA9IGhvcml6ID09PSBcImxcIiA/IGFsaWduVG9NaW4gLSBfLm1pbih4c1ZhbHMpIDogYWxpZ25Ub01heCAtIF8ubWF4KHhzVmFscyk7XG5cbiAgICAgIGlmIChkZWx0YSkge1xuICAgICAgICB4c3NbYWxpZ25tZW50XSA9IF8ubWFwVmFsdWVzKHhzLCBmdW5jdGlvbih4KSB7IHJldHVybiB4ICsgZGVsdGE7IH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gYmFsYW5jZSh4c3MsIGFsaWduKSB7XG4gIHJldHVybiBfLm1hcFZhbHVlcyh4c3MudWwsIGZ1bmN0aW9uKGlnbm9yZSwgdikge1xuICAgIGlmIChhbGlnbikge1xuICAgICAgcmV0dXJuIHhzc1thbGlnbi50b0xvd2VyQ2FzZSgpXVt2XTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHhzID0gXy5zb3J0QnkoXy5tYXAoeHNzLCB2KSk7XG4gICAgICByZXR1cm4gKHhzWzFdICsgeHNbMl0pIC8gMjtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBwb3NpdGlvblgoZykge1xuICB2YXIgbGF5ZXJpbmcgPSB1dGlsLmJ1aWxkTGF5ZXJNYXRyaXgoZyk7XG4gIHZhciBjb25mbGljdHMgPSBfLm1lcmdlKFxuICAgIGZpbmRUeXBlMUNvbmZsaWN0cyhnLCBsYXllcmluZyksXG4gICAgZmluZFR5cGUyQ29uZmxpY3RzKGcsIGxheWVyaW5nKSk7XG5cbiAgdmFyIHhzcyA9IHt9O1xuICB2YXIgYWRqdXN0ZWRMYXllcmluZztcbiAgXy5mb3JFYWNoKFtcInVcIiwgXCJkXCJdLCBmdW5jdGlvbih2ZXJ0KSB7XG4gICAgYWRqdXN0ZWRMYXllcmluZyA9IHZlcnQgPT09IFwidVwiID8gbGF5ZXJpbmcgOiBfLnZhbHVlcyhsYXllcmluZykucmV2ZXJzZSgpO1xuICAgIF8uZm9yRWFjaChbXCJsXCIsIFwiclwiXSwgZnVuY3Rpb24oaG9yaXopIHtcbiAgICAgIGlmIChob3JpeiA9PT0gXCJyXCIpIHtcbiAgICAgICAgYWRqdXN0ZWRMYXllcmluZyA9IF8ubWFwKGFkanVzdGVkTGF5ZXJpbmcsIGZ1bmN0aW9uKGlubmVyKSB7XG4gICAgICAgICAgcmV0dXJuIF8udmFsdWVzKGlubmVyKS5yZXZlcnNlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB2YXIgbmVpZ2hib3JGbiA9ICh2ZXJ0ID09PSBcInVcIiA/IGcucHJlZGVjZXNzb3JzIDogZy5zdWNjZXNzb3JzKS5iaW5kKGcpO1xuICAgICAgdmFyIGFsaWduID0gdmVydGljYWxBbGlnbm1lbnQoZywgYWRqdXN0ZWRMYXllcmluZywgY29uZmxpY3RzLCBuZWlnaGJvckZuKTtcbiAgICAgIHZhciB4cyA9IGhvcml6b250YWxDb21wYWN0aW9uKGcsIGFkanVzdGVkTGF5ZXJpbmcsXG4gICAgICAgIGFsaWduLnJvb3QsIGFsaWduLmFsaWduLCBob3JpeiA9PT0gXCJyXCIpO1xuICAgICAgaWYgKGhvcml6ID09PSBcInJcIikge1xuICAgICAgICB4cyA9IF8ubWFwVmFsdWVzKHhzLCBmdW5jdGlvbih4KSB7IHJldHVybiAteDsgfSk7XG4gICAgICB9XG4gICAgICB4c3NbdmVydCArIGhvcml6XSA9IHhzO1xuICAgIH0pO1xuICB9KTtcblxuICB2YXIgc21hbGxlc3RXaWR0aCA9IGZpbmRTbWFsbGVzdFdpZHRoQWxpZ25tZW50KGcsIHhzcyk7XG4gIGFsaWduQ29vcmRpbmF0ZXMoeHNzLCBzbWFsbGVzdFdpZHRoKTtcbiAgcmV0dXJuIGJhbGFuY2UoeHNzLCBnLmdyYXBoKCkuYWxpZ24pO1xufVxuXG5mdW5jdGlvbiBzZXAobm9kZVNlcCwgZWRnZVNlcCwgcmV2ZXJzZVNlcCkge1xuICByZXR1cm4gZnVuY3Rpb24oZywgdiwgdykge1xuICAgIHZhciB2TGFiZWwgPSBnLm5vZGUodik7XG4gICAgdmFyIHdMYWJlbCA9IGcubm9kZSh3KTtcbiAgICB2YXIgc3VtID0gMDtcbiAgICB2YXIgZGVsdGE7XG5cbiAgICBzdW0gKz0gdkxhYmVsLndpZHRoIC8gMjtcbiAgICBpZiAoXy5oYXModkxhYmVsLCBcImxhYmVscG9zXCIpKSB7XG4gICAgICBzd2l0Y2ggKHZMYWJlbC5sYWJlbHBvcy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICBjYXNlIFwibFwiOiBkZWx0YSA9IC12TGFiZWwud2lkdGggLyAyOyBicmVhaztcbiAgICAgIGNhc2UgXCJyXCI6IGRlbHRhID0gdkxhYmVsLndpZHRoIC8gMjsgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkZWx0YSkge1xuICAgICAgc3VtICs9IHJldmVyc2VTZXAgPyBkZWx0YSA6IC1kZWx0YTtcbiAgICB9XG4gICAgZGVsdGEgPSAwO1xuXG4gICAgc3VtICs9ICh2TGFiZWwuZHVtbXkgPyBlZGdlU2VwIDogbm9kZVNlcCkgLyAyO1xuICAgIHN1bSArPSAod0xhYmVsLmR1bW15ID8gZWRnZVNlcCA6IG5vZGVTZXApIC8gMjtcblxuICAgIHN1bSArPSB3TGFiZWwud2lkdGggLyAyO1xuICAgIGlmIChfLmhhcyh3TGFiZWwsIFwibGFiZWxwb3NcIikpIHtcbiAgICAgIHN3aXRjaCAod0xhYmVsLmxhYmVscG9zLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIGNhc2UgXCJsXCI6IGRlbHRhID0gd0xhYmVsLndpZHRoIC8gMjsgYnJlYWs7XG4gICAgICBjYXNlIFwiclwiOiBkZWx0YSA9IC13TGFiZWwud2lkdGggLyAyOyBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRlbHRhKSB7XG4gICAgICBzdW0gKz0gcmV2ZXJzZVNlcCA/IGRlbHRhIDogLWRlbHRhO1xuICAgIH1cbiAgICBkZWx0YSA9IDA7XG5cbiAgICByZXR1cm4gc3VtO1xuICB9O1xufVxuXG5mdW5jdGlvbiB3aWR0aChnLCB2KSB7XG4gIHJldHVybiBnLm5vZGUodikud2lkdGg7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xudmFyIHV0aWwgPSByZXF1aXJlKFwiLi4vdXRpbFwiKTtcbnZhciBwb3NpdGlvblggPSByZXF1aXJlKFwiLi9ia1wiKS5wb3NpdGlvblg7XG5cbm1vZHVsZS5leHBvcnRzID0gcG9zaXRpb247XG5cbmZ1bmN0aW9uIHBvc2l0aW9uKGcpIHtcbiAgZyA9IHV0aWwuYXNOb25Db21wb3VuZEdyYXBoKGcpO1xuXG4gIHBvc2l0aW9uWShnKTtcbiAgXy5mb3JFYWNoKHBvc2l0aW9uWChnKSwgZnVuY3Rpb24oeCwgdikge1xuICAgIGcubm9kZSh2KS54ID0geDtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHBvc2l0aW9uWShnKSB7XG4gIHZhciBsYXllcmluZyA9IHV0aWwuYnVpbGRMYXllck1hdHJpeChnKTtcbiAgdmFyIHJhbmtTZXAgPSBnLmdyYXBoKCkucmFua3NlcDtcbiAgdmFyIHByZXZZID0gMDtcbiAgXy5mb3JFYWNoKGxheWVyaW5nLCBmdW5jdGlvbihsYXllcikge1xuICAgIHZhciBtYXhIZWlnaHQgPSBfLm1heChfLm1hcChsYXllciwgZnVuY3Rpb24odikgeyByZXR1cm4gZy5ub2RlKHYpLmhlaWdodDsgfSkpO1xuICAgIF8uZm9yRWFjaChsYXllciwgZnVuY3Rpb24odikge1xuICAgICAgZy5ub2RlKHYpLnkgPSBwcmV2WSArIG1heEhlaWdodCAvIDI7XG4gICAgfSk7XG4gICAgcHJldlkgKz0gbWF4SGVpZ2h0ICsgcmFua1NlcDtcbiAgfSk7XG59XG5cbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG52YXIgR3JhcGggPSByZXF1aXJlKFwiLi4vZ3JhcGhsaWJcIikuR3JhcGg7XG52YXIgc2xhY2sgPSByZXF1aXJlKFwiLi91dGlsXCIpLnNsYWNrO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZlYXNpYmxlVHJlZTtcblxuLypcbiAqIENvbnN0cnVjdHMgYSBzcGFubmluZyB0cmVlIHdpdGggdGlnaHQgZWRnZXMgYW5kIGFkanVzdGVkIHRoZSBpbnB1dCBub2RlJ3NcbiAqIHJhbmtzIHRvIGFjaGlldmUgdGhpcy4gQSB0aWdodCBlZGdlIGlzIG9uZSB0aGF0IGlzIGhhcyBhIGxlbmd0aCB0aGF0IG1hdGNoZXNcbiAqIGl0cyBcIm1pbmxlblwiIGF0dHJpYnV0ZS5cbiAqXG4gKiBUaGUgYmFzaWMgc3RydWN0dXJlIGZvciB0aGlzIGZ1bmN0aW9uIGlzIGRlcml2ZWQgZnJvbSBHYW5zbmVyLCBldCBhbC4sIFwiQVxuICogVGVjaG5pcXVlIGZvciBEcmF3aW5nIERpcmVjdGVkIEdyYXBocy5cIlxuICpcbiAqIFByZS1jb25kaXRpb25zOlxuICpcbiAqICAgIDEuIEdyYXBoIG11c3QgYmUgYSBEQUcuXG4gKiAgICAyLiBHcmFwaCBtdXN0IGJlIGNvbm5lY3RlZC5cbiAqICAgIDMuIEdyYXBoIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgbm9kZS5cbiAqICAgIDUuIEdyYXBoIG5vZGVzIG11c3QgaGF2ZSBiZWVuIHByZXZpb3VzbHkgYXNzaWduZWQgYSBcInJhbmtcIiBwcm9wZXJ0eSB0aGF0XG4gKiAgICAgICByZXNwZWN0cyB0aGUgXCJtaW5sZW5cIiBwcm9wZXJ0eSBvZiBpbmNpZGVudCBlZGdlcy5cbiAqICAgIDYuIEdyYXBoIGVkZ2VzIG11c3QgaGF2ZSBhIFwibWlubGVuXCIgcHJvcGVydHkuXG4gKlxuICogUG9zdC1jb25kaXRpb25zOlxuICpcbiAqICAgIC0gR3JhcGggbm9kZXMgd2lsbCBoYXZlIHRoZWlyIHJhbmsgYWRqdXN0ZWQgdG8gZW5zdXJlIHRoYXQgYWxsIGVkZ2VzIGFyZVxuICogICAgICB0aWdodC5cbiAqXG4gKiBSZXR1cm5zIGEgdHJlZSAodW5kaXJlY3RlZCBncmFwaCkgdGhhdCBpcyBjb25zdHJ1Y3RlZCB1c2luZyBvbmx5IFwidGlnaHRcIlxuICogZWRnZXMuXG4gKi9cbmZ1bmN0aW9uIGZlYXNpYmxlVHJlZShnKSB7XG4gIHZhciB0ID0gbmV3IEdyYXBoKHsgZGlyZWN0ZWQ6IGZhbHNlIH0pO1xuXG4gIC8vIENob29zZSBhcmJpdHJhcnkgbm9kZSBmcm9tIHdoaWNoIHRvIHN0YXJ0IG91ciB0cmVlXG4gIHZhciBzdGFydCA9IGcubm9kZXMoKVswXTtcbiAgdmFyIHNpemUgPSBnLm5vZGVDb3VudCgpO1xuICB0LnNldE5vZGUoc3RhcnQsIHt9KTtcblxuICB2YXIgZWRnZSwgZGVsdGE7XG4gIHdoaWxlICh0aWdodFRyZWUodCwgZykgPCBzaXplKSB7XG4gICAgZWRnZSA9IGZpbmRNaW5TbGFja0VkZ2UodCwgZyk7XG4gICAgZGVsdGEgPSB0Lmhhc05vZGUoZWRnZS52KSA/IHNsYWNrKGcsIGVkZ2UpIDogLXNsYWNrKGcsIGVkZ2UpO1xuICAgIHNoaWZ0UmFua3ModCwgZywgZGVsdGEpO1xuICB9XG5cbiAgcmV0dXJuIHQ7XG59XG5cbi8qXG4gKiBGaW5kcyBhIG1heGltYWwgdHJlZSBvZiB0aWdodCBlZGdlcyBhbmQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIG5vZGVzIGluIHRoZVxuICogdHJlZS5cbiAqL1xuZnVuY3Rpb24gdGlnaHRUcmVlKHQsIGcpIHtcbiAgZnVuY3Rpb24gZGZzKHYpIHtcbiAgICBfLmZvckVhY2goZy5ub2RlRWRnZXModiksIGZ1bmN0aW9uKGUpIHtcbiAgICAgIHZhciBlZGdlViA9IGUudixcbiAgICAgICAgdyA9ICh2ID09PSBlZGdlVikgPyBlLncgOiBlZGdlVjtcbiAgICAgIGlmICghdC5oYXNOb2RlKHcpICYmICFzbGFjayhnLCBlKSkge1xuICAgICAgICB0LnNldE5vZGUodywge30pO1xuICAgICAgICB0LnNldEVkZ2Uodiwgdywge30pO1xuICAgICAgICBkZnModyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBfLmZvckVhY2godC5ub2RlcygpLCBkZnMpO1xuICByZXR1cm4gdC5ub2RlQ291bnQoKTtcbn1cblxuLypcbiAqIEZpbmRzIHRoZSBlZGdlIHdpdGggdGhlIHNtYWxsZXN0IHNsYWNrIHRoYXQgaXMgaW5jaWRlbnQgb24gdHJlZSBhbmQgcmV0dXJuc1xuICogaXQuXG4gKi9cbmZ1bmN0aW9uIGZpbmRNaW5TbGFja0VkZ2UodCwgZykge1xuICByZXR1cm4gXy5taW5CeShnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICBpZiAodC5oYXNOb2RlKGUudikgIT09IHQuaGFzTm9kZShlLncpKSB7XG4gICAgICByZXR1cm4gc2xhY2soZywgZSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gc2hpZnRSYW5rcyh0LCBnLCBkZWx0YSkge1xuICBfLmZvckVhY2godC5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgZy5ub2RlKHYpLnJhbmsgKz0gZGVsdGE7XG4gIH0pO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciByYW5rVXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG52YXIgbG9uZ2VzdFBhdGggPSByYW5rVXRpbC5sb25nZXN0UGF0aDtcbnZhciBmZWFzaWJsZVRyZWUgPSByZXF1aXJlKFwiLi9mZWFzaWJsZS10cmVlXCIpO1xudmFyIG5ldHdvcmtTaW1wbGV4ID0gcmVxdWlyZShcIi4vbmV0d29yay1zaW1wbGV4XCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJhbms7XG5cbi8qXG4gKiBBc3NpZ25zIGEgcmFuayB0byBlYWNoIG5vZGUgaW4gdGhlIGlucHV0IGdyYXBoIHRoYXQgcmVzcGVjdHMgdGhlIFwibWlubGVuXCJcbiAqIGNvbnN0cmFpbnQgc3BlY2lmaWVkIG9uIGVkZ2VzIGJldHdlZW4gbm9kZXMuXG4gKlxuICogVGhpcyBiYXNpYyBzdHJ1Y3R1cmUgaXMgZGVyaXZlZCBmcm9tIEdhbnNuZXIsIGV0IGFsLiwgXCJBIFRlY2huaXF1ZSBmb3JcbiAqIERyYXdpbmcgRGlyZWN0ZWQgR3JhcGhzLlwiXG4gKlxuICogUHJlLWNvbmRpdGlvbnM6XG4gKlxuICogICAgMS4gR3JhcGggbXVzdCBiZSBhIGNvbm5lY3RlZCBEQUdcbiAqICAgIDIuIEdyYXBoIG5vZGVzIG11c3QgYmUgb2JqZWN0c1xuICogICAgMy4gR3JhcGggZWRnZXMgbXVzdCBoYXZlIFwid2VpZ2h0XCIgYW5kIFwibWlubGVuXCIgYXR0cmlidXRlc1xuICpcbiAqIFBvc3QtY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBHcmFwaCBub2RlcyB3aWxsIGhhdmUgYSBcInJhbmtcIiBhdHRyaWJ1dGUgYmFzZWQgb24gdGhlIHJlc3VsdHMgb2YgdGhlXG4gKiAgICAgICBhbGdvcml0aG0uIFJhbmtzIGNhbiBzdGFydCBhdCBhbnkgaW5kZXggKGluY2x1ZGluZyBuZWdhdGl2ZSksIHdlJ2xsXG4gKiAgICAgICBmaXggdGhlbSB1cCBsYXRlci5cbiAqL1xuZnVuY3Rpb24gcmFuayhnKSB7XG4gIHN3aXRjaChnLmdyYXBoKCkucmFua2VyKSB7XG4gIGNhc2UgXCJuZXR3b3JrLXNpbXBsZXhcIjogbmV0d29ya1NpbXBsZXhSYW5rZXIoZyk7IGJyZWFrO1xuICBjYXNlIFwidGlnaHQtdHJlZVwiOiB0aWdodFRyZWVSYW5rZXIoZyk7IGJyZWFrO1xuICBjYXNlIFwibG9uZ2VzdC1wYXRoXCI6IGxvbmdlc3RQYXRoUmFua2VyKGcpOyBicmVhaztcbiAgZGVmYXVsdDogbmV0d29ya1NpbXBsZXhSYW5rZXIoZyk7XG4gIH1cbn1cblxuLy8gQSBmYXN0IGFuZCBzaW1wbGUgcmFua2VyLCBidXQgcmVzdWx0cyBhcmUgZmFyIGZyb20gb3B0aW1hbC5cbnZhciBsb25nZXN0UGF0aFJhbmtlciA9IGxvbmdlc3RQYXRoO1xuXG5mdW5jdGlvbiB0aWdodFRyZWVSYW5rZXIoZykge1xuICBsb25nZXN0UGF0aChnKTtcbiAgZmVhc2libGVUcmVlKGcpO1xufVxuXG5mdW5jdGlvbiBuZXR3b3JrU2ltcGxleFJhbmtlcihnKSB7XG4gIG5ldHdvcmtTaW1wbGV4KGcpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcbnZhciBmZWFzaWJsZVRyZWUgPSByZXF1aXJlKFwiLi9mZWFzaWJsZS10cmVlXCIpO1xudmFyIHNsYWNrID0gcmVxdWlyZShcIi4vdXRpbFwiKS5zbGFjaztcbnZhciBpbml0UmFuayA9IHJlcXVpcmUoXCIuL3V0aWxcIikubG9uZ2VzdFBhdGg7XG52YXIgcHJlb3JkZXIgPSByZXF1aXJlKFwiLi4vZ3JhcGhsaWJcIikuYWxnLnByZW9yZGVyO1xudmFyIHBvc3RvcmRlciA9IHJlcXVpcmUoXCIuLi9ncmFwaGxpYlwiKS5hbGcucG9zdG9yZGVyO1xudmFyIHNpbXBsaWZ5ID0gcmVxdWlyZShcIi4uL3V0aWxcIikuc2ltcGxpZnk7XG5cbm1vZHVsZS5leHBvcnRzID0gbmV0d29ya1NpbXBsZXg7XG5cbi8vIEV4cG9zZSBzb21lIGludGVybmFscyBmb3IgdGVzdGluZyBwdXJwb3Nlc1xubmV0d29ya1NpbXBsZXguaW5pdExvd0xpbVZhbHVlcyA9IGluaXRMb3dMaW1WYWx1ZXM7XG5uZXR3b3JrU2ltcGxleC5pbml0Q3V0VmFsdWVzID0gaW5pdEN1dFZhbHVlcztcbm5ldHdvcmtTaW1wbGV4LmNhbGNDdXRWYWx1ZSA9IGNhbGNDdXRWYWx1ZTtcbm5ldHdvcmtTaW1wbGV4LmxlYXZlRWRnZSA9IGxlYXZlRWRnZTtcbm5ldHdvcmtTaW1wbGV4LmVudGVyRWRnZSA9IGVudGVyRWRnZTtcbm5ldHdvcmtTaW1wbGV4LmV4Y2hhbmdlRWRnZXMgPSBleGNoYW5nZUVkZ2VzO1xuXG4vKlxuICogVGhlIG5ldHdvcmsgc2ltcGxleCBhbGdvcml0aG0gYXNzaWducyByYW5rcyB0byBlYWNoIG5vZGUgaW4gdGhlIGlucHV0IGdyYXBoXG4gKiBhbmQgaXRlcmF0aXZlbHkgaW1wcm92ZXMgdGhlIHJhbmtpbmcgdG8gcmVkdWNlIHRoZSBsZW5ndGggb2YgZWRnZXMuXG4gKlxuICogUHJlY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBUaGUgaW5wdXQgZ3JhcGggbXVzdCBiZSBhIERBRy5cbiAqICAgIDIuIEFsbCBub2RlcyBpbiB0aGUgZ3JhcGggbXVzdCBoYXZlIGFuIG9iamVjdCB2YWx1ZS5cbiAqICAgIDMuIEFsbCBlZGdlcyBpbiB0aGUgZ3JhcGggbXVzdCBoYXZlIFwibWlubGVuXCIgYW5kIFwid2VpZ2h0XCIgYXR0cmlidXRlcy5cbiAqXG4gKiBQb3N0Y29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBBbGwgbm9kZXMgaW4gdGhlIGdyYXBoIHdpbGwgaGF2ZSBhbiBhc3NpZ25lZCBcInJhbmtcIiBhdHRyaWJ1dGUgdGhhdCBoYXNcbiAqICAgICAgIGJlZW4gb3B0aW1pemVkIGJ5IHRoZSBuZXR3b3JrIHNpbXBsZXggYWxnb3JpdGhtLiBSYW5rcyBzdGFydCBhdCAwLlxuICpcbiAqXG4gKiBBIHJvdWdoIHNrZXRjaCBvZiB0aGUgYWxnb3JpdGhtIGlzIGFzIGZvbGxvd3M6XG4gKlxuICogICAgMS4gQXNzaWduIGluaXRpYWwgcmFua3MgdG8gZWFjaCBub2RlLiBXZSB1c2UgdGhlIGxvbmdlc3QgcGF0aCBhbGdvcml0aG0sXG4gKiAgICAgICB3aGljaCBhc3NpZ25zIHJhbmtzIHRvIHRoZSBsb3dlc3QgcG9zaXRpb24gcG9zc2libGUuIEluIGdlbmVyYWwgdGhpc1xuICogICAgICAgbGVhZHMgdG8gdmVyeSB3aWRlIGJvdHRvbSByYW5rcyBhbmQgdW5uZWNlc3NhcmlseSBsb25nIGVkZ2VzLlxuICogICAgMi4gQ29uc3RydWN0IGEgZmVhc2libGUgdGlnaHQgdHJlZS4gQSB0aWdodCB0cmVlIGlzIG9uZSBzdWNoIHRoYXQgYWxsXG4gKiAgICAgICBlZGdlcyBpbiB0aGUgdHJlZSBoYXZlIG5vIHNsYWNrIChkaWZmZXJlbmNlIGJldHdlZW4gbGVuZ3RoIG9mIGVkZ2VcbiAqICAgICAgIGFuZCBtaW5sZW4gZm9yIHRoZSBlZGdlKS4gVGhpcyBieSBpdHNlbGYgZ3JlYXRseSBpbXByb3ZlcyB0aGUgYXNzaWduZWRcbiAqICAgICAgIHJhbmtpbmdzIGJ5IHNob3J0aW5nIGVkZ2VzLlxuICogICAgMy4gSXRlcmF0aXZlbHkgZmluZCBlZGdlcyB0aGF0IGhhdmUgbmVnYXRpdmUgY3V0IHZhbHVlcy4gR2VuZXJhbGx5IGFcbiAqICAgICAgIG5lZ2F0aXZlIGN1dCB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgZWRnZSBjb3VsZCBiZSByZW1vdmVkIGFuZCBhIG5ld1xuICogICAgICAgdHJlZSBlZGdlIGNvdWxkIGJlIGFkZGVkIHRvIHByb2R1Y2UgYSBtb3JlIGNvbXBhY3QgZ3JhcGguXG4gKlxuICogTXVjaCBvZiB0aGUgYWxnb3JpdGhtcyBoZXJlIGFyZSBkZXJpdmVkIGZyb20gR2Fuc25lciwgZXQgYWwuLCBcIkEgVGVjaG5pcXVlXG4gKiBmb3IgRHJhd2luZyBEaXJlY3RlZCBHcmFwaHMuXCIgVGhlIHN0cnVjdHVyZSBvZiB0aGUgZmlsZSByb3VnaGx5IGZvbGxvd3MgdGhlXG4gKiBzdHJ1Y3R1cmUgb2YgdGhlIG92ZXJhbGwgYWxnb3JpdGhtLlxuICovXG5mdW5jdGlvbiBuZXR3b3JrU2ltcGxleChnKSB7XG4gIGcgPSBzaW1wbGlmeShnKTtcbiAgaW5pdFJhbmsoZyk7XG4gIHZhciB0ID0gZmVhc2libGVUcmVlKGcpO1xuICBpbml0TG93TGltVmFsdWVzKHQpO1xuICBpbml0Q3V0VmFsdWVzKHQsIGcpO1xuXG4gIHZhciBlLCBmO1xuICB3aGlsZSAoKGUgPSBsZWF2ZUVkZ2UodCkpKSB7XG4gICAgZiA9IGVudGVyRWRnZSh0LCBnLCBlKTtcbiAgICBleGNoYW5nZUVkZ2VzKHQsIGcsIGUsIGYpO1xuICB9XG59XG5cbi8qXG4gKiBJbml0aWFsaXplcyBjdXQgdmFsdWVzIGZvciBhbGwgZWRnZXMgaW4gdGhlIHRyZWUuXG4gKi9cbmZ1bmN0aW9uIGluaXRDdXRWYWx1ZXModCwgZykge1xuICB2YXIgdnMgPSBwb3N0b3JkZXIodCwgdC5ub2RlcygpKTtcbiAgdnMgPSB2cy5zbGljZSgwLCB2cy5sZW5ndGggLSAxKTtcbiAgXy5mb3JFYWNoKHZzLCBmdW5jdGlvbih2KSB7XG4gICAgYXNzaWduQ3V0VmFsdWUodCwgZywgdik7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhc3NpZ25DdXRWYWx1ZSh0LCBnLCBjaGlsZCkge1xuICB2YXIgY2hpbGRMYWIgPSB0Lm5vZGUoY2hpbGQpO1xuICB2YXIgcGFyZW50ID0gY2hpbGRMYWIucGFyZW50O1xuICB0LmVkZ2UoY2hpbGQsIHBhcmVudCkuY3V0dmFsdWUgPSBjYWxjQ3V0VmFsdWUodCwgZywgY2hpbGQpO1xufVxuXG4vKlxuICogR2l2ZW4gdGhlIHRpZ2h0IHRyZWUsIGl0cyBncmFwaCwgYW5kIGEgY2hpbGQgaW4gdGhlIGdyYXBoIGNhbGN1bGF0ZSBhbmRcbiAqIHJldHVybiB0aGUgY3V0IHZhbHVlIGZvciB0aGUgZWRnZSBiZXR3ZWVuIHRoZSBjaGlsZCBhbmQgaXRzIHBhcmVudC5cbiAqL1xuZnVuY3Rpb24gY2FsY0N1dFZhbHVlKHQsIGcsIGNoaWxkKSB7XG4gIHZhciBjaGlsZExhYiA9IHQubm9kZShjaGlsZCk7XG4gIHZhciBwYXJlbnQgPSBjaGlsZExhYi5wYXJlbnQ7XG4gIC8vIFRydWUgaWYgdGhlIGNoaWxkIGlzIG9uIHRoZSB0YWlsIGVuZCBvZiB0aGUgZWRnZSBpbiB0aGUgZGlyZWN0ZWQgZ3JhcGhcbiAgdmFyIGNoaWxkSXNUYWlsID0gdHJ1ZTtcbiAgLy8gVGhlIGdyYXBoJ3MgdmlldyBvZiB0aGUgdHJlZSBlZGdlIHdlJ3JlIGluc3BlY3RpbmdcbiAgdmFyIGdyYXBoRWRnZSA9IGcuZWRnZShjaGlsZCwgcGFyZW50KTtcbiAgLy8gVGhlIGFjY3VtdWxhdGVkIGN1dCB2YWx1ZSBmb3IgdGhlIGVkZ2UgYmV0d2VlbiB0aGlzIG5vZGUgYW5kIGl0cyBwYXJlbnRcbiAgdmFyIGN1dFZhbHVlID0gMDtcblxuICBpZiAoIWdyYXBoRWRnZSkge1xuICAgIGNoaWxkSXNUYWlsID0gZmFsc2U7XG4gICAgZ3JhcGhFZGdlID0gZy5lZGdlKHBhcmVudCwgY2hpbGQpO1xuICB9XG5cbiAgY3V0VmFsdWUgPSBncmFwaEVkZ2Uud2VpZ2h0O1xuXG4gIF8uZm9yRWFjaChnLm5vZGVFZGdlcyhjaGlsZCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgaXNPdXRFZGdlID0gZS52ID09PSBjaGlsZCxcbiAgICAgIG90aGVyID0gaXNPdXRFZGdlID8gZS53IDogZS52O1xuXG4gICAgaWYgKG90aGVyICE9PSBwYXJlbnQpIHtcbiAgICAgIHZhciBwb2ludHNUb0hlYWQgPSBpc091dEVkZ2UgPT09IGNoaWxkSXNUYWlsLFxuICAgICAgICBvdGhlcldlaWdodCA9IGcuZWRnZShlKS53ZWlnaHQ7XG5cbiAgICAgIGN1dFZhbHVlICs9IHBvaW50c1RvSGVhZCA/IG90aGVyV2VpZ2h0IDogLW90aGVyV2VpZ2h0O1xuICAgICAgaWYgKGlzVHJlZUVkZ2UodCwgY2hpbGQsIG90aGVyKSkge1xuICAgICAgICB2YXIgb3RoZXJDdXRWYWx1ZSA9IHQuZWRnZShjaGlsZCwgb3RoZXIpLmN1dHZhbHVlO1xuICAgICAgICBjdXRWYWx1ZSArPSBwb2ludHNUb0hlYWQgPyAtb3RoZXJDdXRWYWx1ZSA6IG90aGVyQ3V0VmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gY3V0VmFsdWU7XG59XG5cbmZ1bmN0aW9uIGluaXRMb3dMaW1WYWx1ZXModHJlZSwgcm9vdCkge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICByb290ID0gdHJlZS5ub2RlcygpWzBdO1xuICB9XG4gIGRmc0Fzc2lnbkxvd0xpbSh0cmVlLCB7fSwgMSwgcm9vdCk7XG59XG5cbmZ1bmN0aW9uIGRmc0Fzc2lnbkxvd0xpbSh0cmVlLCB2aXNpdGVkLCBuZXh0TGltLCB2LCBwYXJlbnQpIHtcbiAgdmFyIGxvdyA9IG5leHRMaW07XG4gIHZhciBsYWJlbCA9IHRyZWUubm9kZSh2KTtcblxuICB2aXNpdGVkW3ZdID0gdHJ1ZTtcbiAgXy5mb3JFYWNoKHRyZWUubmVpZ2hib3JzKHYpLCBmdW5jdGlvbih3KSB7XG4gICAgaWYgKCFfLmhhcyh2aXNpdGVkLCB3KSkge1xuICAgICAgbmV4dExpbSA9IGRmc0Fzc2lnbkxvd0xpbSh0cmVlLCB2aXNpdGVkLCBuZXh0TGltLCB3LCB2KTtcbiAgICB9XG4gIH0pO1xuXG4gIGxhYmVsLmxvdyA9IGxvdztcbiAgbGFiZWwubGltID0gbmV4dExpbSsrO1xuICBpZiAocGFyZW50KSB7XG4gICAgbGFiZWwucGFyZW50ID0gcGFyZW50O1xuICB9IGVsc2Uge1xuICAgIC8vIFRPRE8gc2hvdWxkIGJlIGFibGUgdG8gcmVtb3ZlIHRoaXMgd2hlbiB3ZSBpbmNyZW1lbnRhbGx5IHVwZGF0ZSBsb3cgbGltXG4gICAgZGVsZXRlIGxhYmVsLnBhcmVudDtcbiAgfVxuXG4gIHJldHVybiBuZXh0TGltO1xufVxuXG5mdW5jdGlvbiBsZWF2ZUVkZ2UodHJlZSkge1xuICByZXR1cm4gXy5maW5kKHRyZWUuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHJldHVybiB0cmVlLmVkZ2UoZSkuY3V0dmFsdWUgPCAwO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZW50ZXJFZGdlKHQsIGcsIGVkZ2UpIHtcbiAgdmFyIHYgPSBlZGdlLnY7XG4gIHZhciB3ID0gZWRnZS53O1xuXG4gIC8vIEZvciB0aGUgcmVzdCBvZiB0aGlzIGZ1bmN0aW9uIHdlIGFzc3VtZSB0aGF0IHYgaXMgdGhlIHRhaWwgYW5kIHcgaXMgdGhlXG4gIC8vIGhlYWQsIHNvIGlmIHdlIGRvbid0IGhhdmUgdGhpcyBlZGdlIGluIHRoZSBncmFwaCB3ZSBzaG91bGQgZmxpcCBpdCB0b1xuICAvLyBtYXRjaCB0aGUgY29ycmVjdCBvcmllbnRhdGlvbi5cbiAgaWYgKCFnLmhhc0VkZ2UodiwgdykpIHtcbiAgICB2ID0gZWRnZS53O1xuICAgIHcgPSBlZGdlLnY7XG4gIH1cblxuICB2YXIgdkxhYmVsID0gdC5ub2RlKHYpO1xuICB2YXIgd0xhYmVsID0gdC5ub2RlKHcpO1xuICB2YXIgdGFpbExhYmVsID0gdkxhYmVsO1xuICB2YXIgZmxpcCA9IGZhbHNlO1xuXG4gIC8vIElmIHRoZSByb290IGlzIGluIHRoZSB0YWlsIG9mIHRoZSBlZGdlIHRoZW4gd2UgbmVlZCB0byBmbGlwIHRoZSBsb2dpYyB0aGF0XG4gIC8vIGNoZWNrcyBmb3IgdGhlIGhlYWQgYW5kIHRhaWwgbm9kZXMgaW4gdGhlIGNhbmRpZGF0ZXMgZnVuY3Rpb24gYmVsb3cuXG4gIGlmICh2TGFiZWwubGltID4gd0xhYmVsLmxpbSkge1xuICAgIHRhaWxMYWJlbCA9IHdMYWJlbDtcbiAgICBmbGlwID0gdHJ1ZTtcbiAgfVxuXG4gIHZhciBjYW5kaWRhdGVzID0gXy5maWx0ZXIoZy5lZGdlcygpLCBmdW5jdGlvbihlZGdlKSB7XG4gICAgcmV0dXJuIGZsaXAgPT09IGlzRGVzY2VuZGFudCh0LCB0Lm5vZGUoZWRnZS52KSwgdGFpbExhYmVsKSAmJlxuICAgICAgICAgICBmbGlwICE9PSBpc0Rlc2NlbmRhbnQodCwgdC5ub2RlKGVkZ2UudyksIHRhaWxMYWJlbCk7XG4gIH0pO1xuXG4gIHJldHVybiBfLm1pbkJ5KGNhbmRpZGF0ZXMsIGZ1bmN0aW9uKGVkZ2UpIHsgcmV0dXJuIHNsYWNrKGcsIGVkZ2UpOyB9KTtcbn1cblxuZnVuY3Rpb24gZXhjaGFuZ2VFZGdlcyh0LCBnLCBlLCBmKSB7XG4gIHZhciB2ID0gZS52O1xuICB2YXIgdyA9IGUudztcbiAgdC5yZW1vdmVFZGdlKHYsIHcpO1xuICB0LnNldEVkZ2UoZi52LCBmLncsIHt9KTtcbiAgaW5pdExvd0xpbVZhbHVlcyh0KTtcbiAgaW5pdEN1dFZhbHVlcyh0LCBnKTtcbiAgdXBkYXRlUmFua3ModCwgZyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVJhbmtzKHQsIGcpIHtcbiAgdmFyIHJvb3QgPSBfLmZpbmQodC5ub2RlcygpLCBmdW5jdGlvbih2KSB7IHJldHVybiAhZy5ub2RlKHYpLnBhcmVudDsgfSk7XG4gIHZhciB2cyA9IHByZW9yZGVyKHQsIHJvb3QpO1xuICB2cyA9IHZzLnNsaWNlKDEpO1xuICBfLmZvckVhY2godnMsIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgcGFyZW50ID0gdC5ub2RlKHYpLnBhcmVudCxcbiAgICAgIGVkZ2UgPSBnLmVkZ2UodiwgcGFyZW50KSxcbiAgICAgIGZsaXBwZWQgPSBmYWxzZTtcblxuICAgIGlmICghZWRnZSkge1xuICAgICAgZWRnZSA9IGcuZWRnZShwYXJlbnQsIHYpO1xuICAgICAgZmxpcHBlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgZy5ub2RlKHYpLnJhbmsgPSBnLm5vZGUocGFyZW50KS5yYW5rICsgKGZsaXBwZWQgPyBlZGdlLm1pbmxlbiA6IC1lZGdlLm1pbmxlbik7XG4gIH0pO1xufVxuXG4vKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBlZGdlIGlzIGluIHRoZSB0cmVlLlxuICovXG5mdW5jdGlvbiBpc1RyZWVFZGdlKHRyZWUsIHUsIHYpIHtcbiAgcmV0dXJuIHRyZWUuaGFzRWRnZSh1LCB2KTtcbn1cblxuLypcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIG5vZGUgaXMgZGVzY2VuZGFudCBvZiB0aGUgcm9vdCBub2RlIHBlciB0aGVcbiAqIGFzc2lnbmVkIGxvdyBhbmQgbGltIGF0dHJpYnV0ZXMgaW4gdGhlIHRyZWUuXG4gKi9cbmZ1bmN0aW9uIGlzRGVzY2VuZGFudCh0cmVlLCB2TGFiZWwsIHJvb3RMYWJlbCkge1xuICByZXR1cm4gcm9vdExhYmVsLmxvdyA8PSB2TGFiZWwubGltICYmIHZMYWJlbC5saW0gPD0gcm9vdExhYmVsLmxpbTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBsb25nZXN0UGF0aDogbG9uZ2VzdFBhdGgsXG4gIHNsYWNrOiBzbGFja1xufTtcblxuLypcbiAqIEluaXRpYWxpemVzIHJhbmtzIGZvciB0aGUgaW5wdXQgZ3JhcGggdXNpbmcgdGhlIGxvbmdlc3QgcGF0aCBhbGdvcml0aG0uIFRoaXNcbiAqIGFsZ29yaXRobSBzY2FsZXMgd2VsbCBhbmQgaXMgZmFzdCBpbiBwcmFjdGljZSwgaXQgeWllbGRzIHJhdGhlciBwb29yXG4gKiBzb2x1dGlvbnMuIE5vZGVzIGFyZSBwdXNoZWQgdG8gdGhlIGxvd2VzdCBsYXllciBwb3NzaWJsZSwgbGVhdmluZyB0aGUgYm90dG9tXG4gKiByYW5rcyB3aWRlIGFuZCBsZWF2aW5nIGVkZ2VzIGxvbmdlciB0aGFuIG5lY2Vzc2FyeS4gSG93ZXZlciwgZHVlIHRvIGl0c1xuICogc3BlZWQsIHRoaXMgYWxnb3JpdGhtIGlzIGdvb2QgZm9yIGdldHRpbmcgYW4gaW5pdGlhbCByYW5raW5nIHRoYXQgY2FuIGJlIGZlZFxuICogaW50byBvdGhlciBhbGdvcml0aG1zLlxuICpcbiAqIFRoaXMgYWxnb3JpdGhtIGRvZXMgbm90IG5vcm1hbGl6ZSBsYXllcnMgYmVjYXVzZSBpdCB3aWxsIGJlIHVzZWQgYnkgb3RoZXJcbiAqIGFsZ29yaXRobXMgaW4gbW9zdCBjYXNlcy4gSWYgdXNpbmcgdGhpcyBhbGdvcml0aG0gZGlyZWN0bHksIGJlIHN1cmUgdG9cbiAqIHJ1biBub3JtYWxpemUgYXQgdGhlIGVuZC5cbiAqXG4gKiBQcmUtY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBJbnB1dCBncmFwaCBpcyBhIERBRy5cbiAqICAgIDIuIElucHV0IGdyYXBoIG5vZGUgbGFiZWxzIGNhbiBiZSBhc3NpZ25lZCBwcm9wZXJ0aWVzLlxuICpcbiAqIFBvc3QtY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBFYWNoIG5vZGUgd2lsbCBiZSBhc3NpZ24gYW4gKHVubm9ybWFsaXplZCkgXCJyYW5rXCIgcHJvcGVydHkuXG4gKi9cbmZ1bmN0aW9uIGxvbmdlc3RQYXRoKGcpIHtcbiAgdmFyIHZpc2l0ZWQgPSB7fTtcblxuICBmdW5jdGlvbiBkZnModikge1xuICAgIHZhciBsYWJlbCA9IGcubm9kZSh2KTtcbiAgICBpZiAoXy5oYXModmlzaXRlZCwgdikpIHtcbiAgICAgIHJldHVybiBsYWJlbC5yYW5rO1xuICAgIH1cbiAgICB2aXNpdGVkW3ZdID0gdHJ1ZTtcblxuICAgIHZhciByYW5rID0gXy5taW4oXy5tYXAoZy5vdXRFZGdlcyh2KSwgZnVuY3Rpb24oZSkge1xuICAgICAgcmV0dXJuIGRmcyhlLncpIC0gZy5lZGdlKGUpLm1pbmxlbjtcbiAgICB9KSk7XG5cbiAgICBpZiAocmFuayA9PT0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIHx8IC8vIHJldHVybiB2YWx1ZSBvZiBfLm1hcChbXSkgZm9yIExvZGFzaCAzXG4gICAgICAgIHJhbmsgPT09IHVuZGVmaW5lZCB8fCAvLyByZXR1cm4gdmFsdWUgb2YgXy5tYXAoW10pIGZvciBMb2Rhc2ggNFxuICAgICAgICByYW5rID09PSBudWxsKSB7IC8vIHJldHVybiB2YWx1ZSBvZiBfLm1hcChbbnVsbF0pXG4gICAgICByYW5rID0gMDtcbiAgICB9XG5cbiAgICByZXR1cm4gKGxhYmVsLnJhbmsgPSByYW5rKTtcbiAgfVxuXG4gIF8uZm9yRWFjaChnLnNvdXJjZXMoKSwgZGZzKTtcbn1cblxuLypcbiAqIFJldHVybnMgdGhlIGFtb3VudCBvZiBzbGFjayBmb3IgdGhlIGdpdmVuIGVkZ2UuIFRoZSBzbGFjayBpcyBkZWZpbmVkIGFzIHRoZVxuICogZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBsZW5ndGggb2YgdGhlIGVkZ2UgYW5kIGl0cyBtaW5pbXVtIGxlbmd0aC5cbiAqL1xuZnVuY3Rpb24gc2xhY2soZywgZSkge1xuICByZXR1cm4gZy5ub2RlKGUudykucmFuayAtIGcubm9kZShlLnYpLnJhbmsgLSBnLmVkZ2UoZSkubWlubGVuO1xufVxuIiwiLyogZXNsaW50IFwibm8tY29uc29sZVwiOiBvZmYgKi9cblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfID0gcmVxdWlyZShcIi4vbG9kYXNoXCIpO1xudmFyIEdyYXBoID0gcmVxdWlyZShcIi4vZ3JhcGhsaWJcIikuR3JhcGg7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBhZGREdW1teU5vZGU6IGFkZER1bW15Tm9kZSxcbiAgc2ltcGxpZnk6IHNpbXBsaWZ5LFxuICBhc05vbkNvbXBvdW5kR3JhcGg6IGFzTm9uQ29tcG91bmRHcmFwaCxcbiAgc3VjY2Vzc29yV2VpZ2h0czogc3VjY2Vzc29yV2VpZ2h0cyxcbiAgcHJlZGVjZXNzb3JXZWlnaHRzOiBwcmVkZWNlc3NvcldlaWdodHMsXG4gIGludGVyc2VjdFJlY3Q6IGludGVyc2VjdFJlY3QsXG4gIGJ1aWxkTGF5ZXJNYXRyaXg6IGJ1aWxkTGF5ZXJNYXRyaXgsXG4gIG5vcm1hbGl6ZVJhbmtzOiBub3JtYWxpemVSYW5rcyxcbiAgcmVtb3ZlRW1wdHlSYW5rczogcmVtb3ZlRW1wdHlSYW5rcyxcbiAgYWRkQm9yZGVyTm9kZTogYWRkQm9yZGVyTm9kZSxcbiAgbWF4UmFuazogbWF4UmFuayxcbiAgcGFydGl0aW9uOiBwYXJ0aXRpb24sXG4gIHRpbWU6IHRpbWUsXG4gIG5vdGltZTogbm90aW1lXG59O1xuXG4vKlxuICogQWRkcyBhIGR1bW15IG5vZGUgdG8gdGhlIGdyYXBoIGFuZCByZXR1cm4gdi5cbiAqL1xuZnVuY3Rpb24gYWRkRHVtbXlOb2RlKGcsIHR5cGUsIGF0dHJzLCBuYW1lKSB7XG4gIHZhciB2O1xuICBkbyB7XG4gICAgdiA9IF8udW5pcXVlSWQobmFtZSk7XG4gIH0gd2hpbGUgKGcuaGFzTm9kZSh2KSk7XG5cbiAgYXR0cnMuZHVtbXkgPSB0eXBlO1xuICBnLnNldE5vZGUodiwgYXR0cnMpO1xuICByZXR1cm4gdjtcbn1cblxuLypcbiAqIFJldHVybnMgYSBuZXcgZ3JhcGggd2l0aCBvbmx5IHNpbXBsZSBlZGdlcy4gSGFuZGxlcyBhZ2dyZWdhdGlvbiBvZiBkYXRhXG4gKiBhc3NvY2lhdGVkIHdpdGggbXVsdGktZWRnZXMuXG4gKi9cbmZ1bmN0aW9uIHNpbXBsaWZ5KGcpIHtcbiAgdmFyIHNpbXBsaWZpZWQgPSBuZXcgR3JhcGgoKS5zZXRHcmFwaChnLmdyYXBoKCkpO1xuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7IHNpbXBsaWZpZWQuc2V0Tm9kZSh2LCBnLm5vZGUodikpOyB9KTtcbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBzaW1wbGVMYWJlbCA9IHNpbXBsaWZpZWQuZWRnZShlLnYsIGUudykgfHwgeyB3ZWlnaHQ6IDAsIG1pbmxlbjogMSB9O1xuICAgIHZhciBsYWJlbCA9IGcuZWRnZShlKTtcbiAgICBzaW1wbGlmaWVkLnNldEVkZ2UoZS52LCBlLncsIHtcbiAgICAgIHdlaWdodDogc2ltcGxlTGFiZWwud2VpZ2h0ICsgbGFiZWwud2VpZ2h0LFxuICAgICAgbWlubGVuOiBNYXRoLm1heChzaW1wbGVMYWJlbC5taW5sZW4sIGxhYmVsLm1pbmxlbilcbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiBzaW1wbGlmaWVkO1xufVxuXG5mdW5jdGlvbiBhc05vbkNvbXBvdW5kR3JhcGgoZykge1xuICB2YXIgc2ltcGxpZmllZCA9IG5ldyBHcmFwaCh7IG11bHRpZ3JhcGg6IGcuaXNNdWx0aWdyYXBoKCkgfSkuc2V0R3JhcGgoZy5ncmFwaCgpKTtcbiAgXy5mb3JFYWNoKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIGlmICghZy5jaGlsZHJlbih2KS5sZW5ndGgpIHtcbiAgICAgIHNpbXBsaWZpZWQuc2V0Tm9kZSh2LCBnLm5vZGUodikpO1xuICAgIH1cbiAgfSk7XG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICBzaW1wbGlmaWVkLnNldEVkZ2UoZSwgZy5lZGdlKGUpKTtcbiAgfSk7XG4gIHJldHVybiBzaW1wbGlmaWVkO1xufVxuXG5mdW5jdGlvbiBzdWNjZXNzb3JXZWlnaHRzKGcpIHtcbiAgdmFyIHdlaWdodE1hcCA9IF8ubWFwKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHZhciBzdWNzID0ge307XG4gICAgXy5mb3JFYWNoKGcub3V0RWRnZXModiksIGZ1bmN0aW9uKGUpIHtcbiAgICAgIHN1Y3NbZS53XSA9IChzdWNzW2Uud10gfHwgMCkgKyBnLmVkZ2UoZSkud2VpZ2h0O1xuICAgIH0pO1xuICAgIHJldHVybiBzdWNzO1xuICB9KTtcbiAgcmV0dXJuIF8uemlwT2JqZWN0KGcubm9kZXMoKSwgd2VpZ2h0TWFwKTtcbn1cblxuZnVuY3Rpb24gcHJlZGVjZXNzb3JXZWlnaHRzKGcpIHtcbiAgdmFyIHdlaWdodE1hcCA9IF8ubWFwKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHZhciBwcmVkcyA9IHt9O1xuICAgIF8uZm9yRWFjaChnLmluRWRnZXModiksIGZ1bmN0aW9uKGUpIHtcbiAgICAgIHByZWRzW2Uudl0gPSAocHJlZHNbZS52XSB8fCAwKSArIGcuZWRnZShlKS53ZWlnaHQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIHByZWRzO1xuICB9KTtcbiAgcmV0dXJuIF8uemlwT2JqZWN0KGcubm9kZXMoKSwgd2VpZ2h0TWFwKTtcbn1cblxuLypcbiAqIEZpbmRzIHdoZXJlIGEgbGluZSBzdGFydGluZyBhdCBwb2ludCAoe3gsIHl9KSB3b3VsZCBpbnRlcnNlY3QgYSByZWN0YW5nbGVcbiAqICh7eCwgeSwgd2lkdGgsIGhlaWdodH0pIGlmIGl0IHdlcmUgcG9pbnRpbmcgYXQgdGhlIHJlY3RhbmdsZSdzIGNlbnRlci5cbiAqL1xuZnVuY3Rpb24gaW50ZXJzZWN0UmVjdChyZWN0LCBwb2ludCkge1xuICB2YXIgeCA9IHJlY3QueDtcbiAgdmFyIHkgPSByZWN0Lnk7XG5cbiAgLy8gUmVjdGFuZ2xlIGludGVyc2VjdGlvbiBhbGdvcml0aG0gZnJvbTpcbiAgLy8gaHR0cDovL21hdGguc3RhY2tleGNoYW5nZS5jb20vcXVlc3Rpb25zLzEwODExMy9maW5kLWVkZ2UtYmV0d2Vlbi10d28tYm94ZXNcbiAgdmFyIGR4ID0gcG9pbnQueCAtIHg7XG4gIHZhciBkeSA9IHBvaW50LnkgLSB5O1xuICB2YXIgdyA9IHJlY3Qud2lkdGggLyAyO1xuICB2YXIgaCA9IHJlY3QuaGVpZ2h0IC8gMjtcblxuICBpZiAoIWR4ICYmICFkeSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCBwb3NzaWJsZSB0byBmaW5kIGludGVyc2VjdGlvbiBpbnNpZGUgb2YgdGhlIHJlY3RhbmdsZVwiKTtcbiAgfVxuXG4gIHZhciBzeCwgc3k7XG4gIGlmIChNYXRoLmFicyhkeSkgKiB3ID4gTWF0aC5hYnMoZHgpICogaCkge1xuICAgIC8vIEludGVyc2VjdGlvbiBpcyB0b3Agb3IgYm90dG9tIG9mIHJlY3QuXG4gICAgaWYgKGR5IDwgMCkge1xuICAgICAgaCA9IC1oO1xuICAgIH1cbiAgICBzeCA9IGggKiBkeCAvIGR5O1xuICAgIHN5ID0gaDtcbiAgfSBlbHNlIHtcbiAgICAvLyBJbnRlcnNlY3Rpb24gaXMgbGVmdCBvciByaWdodCBvZiByZWN0LlxuICAgIGlmIChkeCA8IDApIHtcbiAgICAgIHcgPSAtdztcbiAgICB9XG4gICAgc3ggPSB3O1xuICAgIHN5ID0gdyAqIGR5IC8gZHg7XG4gIH1cblxuICByZXR1cm4geyB4OiB4ICsgc3gsIHk6IHkgKyBzeSB9O1xufVxuXG4vKlxuICogR2l2ZW4gYSBEQUcgd2l0aCBlYWNoIG5vZGUgYXNzaWduZWQgXCJyYW5rXCIgYW5kIFwib3JkZXJcIiBwcm9wZXJ0aWVzLCB0aGlzXG4gKiBmdW5jdGlvbiB3aWxsIHByb2R1Y2UgYSBtYXRyaXggd2l0aCB0aGUgaWRzIG9mIGVhY2ggbm9kZS5cbiAqL1xuZnVuY3Rpb24gYnVpbGRMYXllck1hdHJpeChnKSB7XG4gIHZhciBsYXllcmluZyA9IF8ubWFwKF8ucmFuZ2UobWF4UmFuayhnKSArIDEpLCBmdW5jdGlvbigpIHsgcmV0dXJuIFtdOyB9KTtcbiAgXy5mb3JFYWNoKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHZhciBub2RlID0gZy5ub2RlKHYpO1xuICAgIHZhciByYW5rID0gbm9kZS5yYW5rO1xuICAgIGlmICghXy5pc1VuZGVmaW5lZChyYW5rKSkge1xuICAgICAgbGF5ZXJpbmdbcmFua11bbm9kZS5vcmRlcl0gPSB2O1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBsYXllcmluZztcbn1cblxuLypcbiAqIEFkanVzdHMgdGhlIHJhbmtzIGZvciBhbGwgbm9kZXMgaW4gdGhlIGdyYXBoIHN1Y2ggdGhhdCBhbGwgbm9kZXMgdiBoYXZlXG4gKiByYW5rKHYpID49IDAgYW5kIGF0IGxlYXN0IG9uZSBub2RlIHcgaGFzIHJhbmsodykgPSAwLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVSYW5rcyhnKSB7XG4gIHZhciBtaW4gPSBfLm1pbihfLm1hcChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHsgcmV0dXJuIGcubm9kZSh2KS5yYW5rOyB9KSk7XG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgbm9kZSA9IGcubm9kZSh2KTtcbiAgICBpZiAoXy5oYXMobm9kZSwgXCJyYW5rXCIpKSB7XG4gICAgICBub2RlLnJhbmsgLT0gbWluO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUVtcHR5UmFua3MoZykge1xuICAvLyBSYW5rcyBtYXkgbm90IHN0YXJ0IGF0IDAsIHNvIHdlIG5lZWQgdG8gb2Zmc2V0IHRoZW1cbiAgdmFyIG9mZnNldCA9IF8ubWluKF8ubWFwKGcubm9kZXMoKSwgZnVuY3Rpb24odikgeyByZXR1cm4gZy5ub2RlKHYpLnJhbms7IH0pKTtcblxuICB2YXIgbGF5ZXJzID0gW107XG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgcmFuayA9IGcubm9kZSh2KS5yYW5rIC0gb2Zmc2V0O1xuICAgIGlmICghbGF5ZXJzW3JhbmtdKSB7XG4gICAgICBsYXllcnNbcmFua10gPSBbXTtcbiAgICB9XG4gICAgbGF5ZXJzW3JhbmtdLnB1c2godik7XG4gIH0pO1xuXG4gIHZhciBkZWx0YSA9IDA7XG4gIHZhciBub2RlUmFua0ZhY3RvciA9IGcuZ3JhcGgoKS5ub2RlUmFua0ZhY3RvcjtcbiAgXy5mb3JFYWNoKGxheWVycywgZnVuY3Rpb24odnMsIGkpIHtcbiAgICBpZiAoXy5pc1VuZGVmaW5lZCh2cykgJiYgaSAlIG5vZGVSYW5rRmFjdG9yICE9PSAwKSB7XG4gICAgICAtLWRlbHRhO1xuICAgIH0gZWxzZSBpZiAoZGVsdGEpIHtcbiAgICAgIF8uZm9yRWFjaCh2cywgZnVuY3Rpb24odikgeyBnLm5vZGUodikucmFuayArPSBkZWx0YTsgfSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gYWRkQm9yZGVyTm9kZShnLCBwcmVmaXgsIHJhbmssIG9yZGVyKSB7XG4gIHZhciBub2RlID0ge1xuICAgIHdpZHRoOiAwLFxuICAgIGhlaWdodDogMFxuICB9O1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSA0KSB7XG4gICAgbm9kZS5yYW5rID0gcmFuaztcbiAgICBub2RlLm9yZGVyID0gb3JkZXI7XG4gIH1cbiAgcmV0dXJuIGFkZER1bW15Tm9kZShnLCBcImJvcmRlclwiLCBub2RlLCBwcmVmaXgpO1xufVxuXG5mdW5jdGlvbiBtYXhSYW5rKGcpIHtcbiAgcmV0dXJuIF8ubWF4KF8ubWFwKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHZhciByYW5rID0gZy5ub2RlKHYpLnJhbms7XG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHJhbmspKSB7XG4gICAgICByZXR1cm4gcmFuaztcbiAgICB9XG4gIH0pKTtcbn1cblxuLypcbiAqIFBhcnRpdGlvbiBhIGNvbGxlY3Rpb24gaW50byB0d28gZ3JvdXBzOiBgbGhzYCBhbmQgYHJoc2AuIElmIHRoZSBzdXBwbGllZFxuICogZnVuY3Rpb24gcmV0dXJucyB0cnVlIGZvciBhbiBlbnRyeSBpdCBnb2VzIGludG8gYGxoc2AuIE90aGVyd2lzZSBpdCBnb2VzXG4gKiBpbnRvIGByaHMuXG4gKi9cbmZ1bmN0aW9uIHBhcnRpdGlvbihjb2xsZWN0aW9uLCBmbikge1xuICB2YXIgcmVzdWx0ID0geyBsaHM6IFtdLCByaHM6IFtdIH07XG4gIF8uZm9yRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgIGlmIChmbih2YWx1ZSkpIHtcbiAgICAgIHJlc3VsdC5saHMucHVzaCh2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5yaHMucHVzaCh2YWx1ZSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLypcbiAqIFJldHVybnMgYSBuZXcgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZm5gIHdpdGggYSB0aW1lci4gVGhlIHdyYXBwZXIgbG9ncyB0aGVcbiAqIHRpbWUgaXQgdGFrZXMgdG8gZXhlY3V0ZSB0aGUgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIHRpbWUobmFtZSwgZm4pIHtcbiAgdmFyIHN0YXJ0ID0gXy5ub3coKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBjb25zb2xlLmxvZyhuYW1lICsgXCIgdGltZTogXCIgKyAoXy5ub3coKSAtIHN0YXJ0KSArIFwibXNcIik7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm90aW1lKG5hbWUsIGZuKSB7XG4gIHJldHVybiBmbigpO1xufVxuIiwibW9kdWxlLmV4cG9ydHMgPSBcIjAuOC41XCI7XG4iLCIvKipcbiAqIEEgc2ltcGxlIGRlcGVuZGVuY3kgZ3JhcGhcbiAqL1xuXG4vKipcbiAqIEhlbHBlciBmb3IgY3JlYXRpbmcgYSBUb3BvbG9naWNhbCBTb3J0IHVzaW5nIERlcHRoLUZpcnN0LVNlYXJjaCBvbiBhIHNldCBvZiBlZGdlcy5cbiAqXG4gKiBEZXRlY3RzIGN5Y2xlcyBhbmQgdGhyb3dzIGFuIEVycm9yIGlmIG9uZSBpcyBkZXRlY3RlZCAodW5sZXNzIHRoZSBcImNpcmN1bGFyXCJcbiAqIHBhcmFtZXRlciBpcyBcInRydWVcIiBpbiB3aGljaCBjYXNlIGl0IGlnbm9yZXMgdGhlbSkuXG4gKlxuICogQHBhcmFtIGVkZ2VzIFRoZSBzZXQgb2YgZWRnZXMgdG8gREZTIHRocm91Z2hcbiAqIEBwYXJhbSBsZWF2ZXNPbmx5IFdoZXRoZXIgdG8gb25seSByZXR1cm4gXCJsZWFmXCIgbm9kZXMgKG9uZXMgd2hvIGhhdmUgbm8gZWRnZXMpXG4gKiBAcGFyYW0gcmVzdWx0IEFuIGFycmF5IGluIHdoaWNoIHRoZSByZXN1bHRzIHdpbGwgYmUgcG9wdWxhdGVkXG4gKiBAcGFyYW0gY2lyY3VsYXIgQSBib29sZWFuIHRvIGFsbG93IGNpcmN1bGFyIGRlcGVuZGVuY2llc1xuICovXG5mdW5jdGlvbiBjcmVhdGVERlMoZWRnZXMsIGxlYXZlc09ubHksIHJlc3VsdCwgY2lyY3VsYXIpIHtcbiAgdmFyIHZpc2l0ZWQgPSB7fTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChzdGFydCkge1xuICAgIGlmICh2aXNpdGVkW3N0YXJ0XSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgaW5DdXJyZW50UGF0aCA9IHt9O1xuICAgIHZhciBjdXJyZW50UGF0aCA9IFtdO1xuICAgIHZhciB0b2RvID0gW107IC8vIHVzZWQgYXMgYSBzdGFja1xuICAgIHRvZG8ucHVzaCh7IG5vZGU6IHN0YXJ0LCBwcm9jZXNzZWQ6IGZhbHNlIH0pO1xuICAgIHdoaWxlICh0b2RvLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhciBjdXJyZW50ID0gdG9kb1t0b2RvLmxlbmd0aCAtIDFdOyAvLyBwZWVrIGF0IHRoZSB0b2RvIHN0YWNrXG4gICAgICB2YXIgcHJvY2Vzc2VkID0gY3VycmVudC5wcm9jZXNzZWQ7XG4gICAgICB2YXIgbm9kZSA9IGN1cnJlbnQubm9kZTtcbiAgICAgIGlmICghcHJvY2Vzc2VkKSB7XG4gICAgICAgIC8vIEhhdmVuJ3QgdmlzaXRlZCBlZGdlcyB5ZXQgKHZpc2l0aW5nIHBoYXNlKVxuICAgICAgICBpZiAodmlzaXRlZFtub2RlXSkge1xuICAgICAgICAgIHRvZG8ucG9wKCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSBpZiAoaW5DdXJyZW50UGF0aFtub2RlXSkge1xuICAgICAgICAgIC8vIEl0J3Mgbm90IGEgREFHXG4gICAgICAgICAgaWYgKGNpcmN1bGFyKSB7XG4gICAgICAgICAgICB0b2RvLnBvcCgpO1xuICAgICAgICAgICAgLy8gSWYgd2UncmUgdG9sZXJhdGluZyBjeWNsZXMsIGRvbid0IHJldmlzaXQgdGhlIG5vZGVcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjdXJyZW50UGF0aC5wdXNoKG5vZGUpO1xuICAgICAgICAgIHRocm93IG5ldyBEZXBHcmFwaEN5Y2xlRXJyb3IoY3VycmVudFBhdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5DdXJyZW50UGF0aFtub2RlXSA9IHRydWU7XG4gICAgICAgIGN1cnJlbnRQYXRoLnB1c2gobm9kZSk7XG4gICAgICAgIHZhciBub2RlRWRnZXMgPSBlZGdlc1tub2RlXTtcbiAgICAgICAgLy8gKHB1c2ggZWRnZXMgb250byB0aGUgdG9kbyBzdGFjayBpbiByZXZlcnNlIG9yZGVyIHRvIGJlIG9yZGVyLWNvbXBhdGlibGUgd2l0aCB0aGUgb2xkIERGUyBpbXBsZW1lbnRhdGlvbilcbiAgICAgICAgZm9yICh2YXIgaSA9IG5vZGVFZGdlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIHRvZG8ucHVzaCh7IG5vZGU6IG5vZGVFZGdlc1tpXSwgcHJvY2Vzc2VkOiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50LnByb2Nlc3NlZCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBIYXZlIHZpc2l0ZWQgZWRnZXMgKHN0YWNrIHVucm9sbGluZyBwaGFzZSlcbiAgICAgICAgdG9kby5wb3AoKTtcbiAgICAgICAgY3VycmVudFBhdGgucG9wKCk7XG4gICAgICAgIGluQ3VycmVudFBhdGhbbm9kZV0gPSBmYWxzZTtcbiAgICAgICAgdmlzaXRlZFtub2RlXSA9IHRydWU7XG4gICAgICAgIGlmICghbGVhdmVzT25seSB8fCBlZGdlc1tub2RlXS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXN1bHQucHVzaChub2RlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBTaW1wbGUgRGVwZW5kZW5jeSBHcmFwaFxuICovXG52YXIgRGVwR3JhcGggPSAoZXhwb3J0cy5EZXBHcmFwaCA9IGZ1bmN0aW9uIERlcEdyYXBoKG9wdHMpIHtcbiAgdGhpcy5ub2RlcyA9IHt9OyAvLyBOb2RlIC0+IE5vZGUvRGF0YSAodHJlYXRlZCBsaWtlIGEgU2V0KVxuICB0aGlzLm91dGdvaW5nRWRnZXMgPSB7fTsgLy8gTm9kZSAtPiBbRGVwZW5kZW5jeSBOb2RlXVxuICB0aGlzLmluY29taW5nRWRnZXMgPSB7fTsgLy8gTm9kZSAtPiBbRGVwZW5kYW50IE5vZGVdXG4gIHRoaXMuY2lyY3VsYXIgPSBvcHRzICYmICEhb3B0cy5jaXJjdWxhcjsgLy8gQWxsb3dzIGNpcmN1bGFyIGRlcHNcbn0pO1xuRGVwR3JhcGgucHJvdG90eXBlID0ge1xuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBub2RlcyBpbiB0aGUgZ3JhcGguXG4gICAqL1xuICBzaXplOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMubm9kZXMpLmxlbmd0aDtcbiAgfSxcbiAgLyoqXG4gICAqIEFkZCBhIG5vZGUgdG8gdGhlIGRlcGVuZGVuY3kgZ3JhcGguIElmIGEgbm9kZSBhbHJlYWR5IGV4aXN0cywgdGhpcyBtZXRob2Qgd2lsbCBkbyBub3RoaW5nLlxuICAgKi9cbiAgYWRkTm9kZTogZnVuY3Rpb24gKG5vZGUsIGRhdGEpIHtcbiAgICBpZiAoIXRoaXMuaGFzTm9kZShub2RlKSkge1xuICAgICAgLy8gQ2hlY2tpbmcgdGhlIGFyZ3VtZW50cyBsZW5ndGggYWxsb3dzIHRoZSB1c2VyIHRvIGFkZCBhIG5vZGUgd2l0aCB1bmRlZmluZWQgZGF0YVxuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgdGhpcy5ub2Rlc1tub2RlXSA9IGRhdGE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm5vZGVzW25vZGVdID0gbm9kZTtcbiAgICAgIH1cbiAgICAgIHRoaXMub3V0Z29pbmdFZGdlc1tub2RlXSA9IFtdO1xuICAgICAgdGhpcy5pbmNvbWluZ0VkZ2VzW25vZGVdID0gW107XG4gICAgfVxuICB9LFxuICAvKipcbiAgICogUmVtb3ZlIGEgbm9kZSBmcm9tIHRoZSBkZXBlbmRlbmN5IGdyYXBoLiBJZiBhIG5vZGUgZG9lcyBub3QgZXhpc3QsIHRoaXMgbWV0aG9kIHdpbGwgZG8gbm90aGluZy5cbiAgICovXG4gIHJlbW92ZU5vZGU6IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgaWYgKHRoaXMuaGFzTm9kZShub2RlKSkge1xuICAgICAgZGVsZXRlIHRoaXMubm9kZXNbbm9kZV07XG4gICAgICBkZWxldGUgdGhpcy5vdXRnb2luZ0VkZ2VzW25vZGVdO1xuICAgICAgZGVsZXRlIHRoaXMuaW5jb21pbmdFZGdlc1tub2RlXTtcbiAgICAgIFt0aGlzLmluY29taW5nRWRnZXMsIHRoaXMub3V0Z29pbmdFZGdlc10uZm9yRWFjaChmdW5jdGlvbiAoZWRnZUxpc3QpIHtcbiAgICAgICAgT2JqZWN0LmtleXMoZWRnZUxpc3QpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgIHZhciBpZHggPSBlZGdlTGlzdFtrZXldLmluZGV4T2Yobm9kZSk7XG4gICAgICAgICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgICAgICBlZGdlTGlzdFtrZXldLnNwbGljZShpZHgsIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgdGhpcyk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIG5vZGUgZXhpc3RzIGluIHRoZSBncmFwaFxuICAgKi9cbiAgaGFzTm9kZTogZnVuY3Rpb24gKG5vZGUpIHtcbiAgICByZXR1cm4gdGhpcy5ub2Rlcy5oYXNPd25Qcm9wZXJ0eShub2RlKTtcbiAgfSxcbiAgLyoqXG4gICAqIEdldCB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggYSBub2RlIG5hbWVcbiAgICovXG4gIGdldE5vZGVEYXRhOiBmdW5jdGlvbiAobm9kZSkge1xuICAgIGlmICh0aGlzLmhhc05vZGUobm9kZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLm5vZGVzW25vZGVdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlIGRvZXMgbm90IGV4aXN0OiBcIiArIG5vZGUpO1xuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIFNldCB0aGUgYXNzb2NpYXRlZCBkYXRhIGZvciBhIGdpdmVuIG5vZGUgbmFtZS4gSWYgdGhlIG5vZGUgZG9lcyBub3QgZXhpc3QsIHRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgYW4gZXJyb3JcbiAgICovXG4gIHNldE5vZGVEYXRhOiBmdW5jdGlvbiAobm9kZSwgZGF0YSkge1xuICAgIGlmICh0aGlzLmhhc05vZGUobm9kZSkpIHtcbiAgICAgIHRoaXMubm9kZXNbbm9kZV0gPSBkYXRhO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlIGRvZXMgbm90IGV4aXN0OiBcIiArIG5vZGUpO1xuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIEFkZCBhIGRlcGVuZGVuY3kgYmV0d2VlbiB0d28gbm9kZXMuIElmIGVpdGhlciBvZiB0aGUgbm9kZXMgZG9lcyBub3QgZXhpc3QsXG4gICAqIGFuIEVycm9yIHdpbGwgYmUgdGhyb3duLlxuICAgKi9cbiAgYWRkRGVwZW5kZW5jeTogZnVuY3Rpb24gKGZyb20sIHRvKSB7XG4gICAgaWYgKCF0aGlzLmhhc05vZGUoZnJvbSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vZGUgZG9lcyBub3QgZXhpc3Q6IFwiICsgZnJvbSk7XG4gICAgfVxuICAgIGlmICghdGhpcy5oYXNOb2RlKHRvKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm9kZSBkb2VzIG5vdCBleGlzdDogXCIgKyB0byk7XG4gICAgfVxuICAgIGlmICh0aGlzLm91dGdvaW5nRWRnZXNbZnJvbV0uaW5kZXhPZih0bykgPT09IC0xKSB7XG4gICAgICB0aGlzLm91dGdvaW5nRWRnZXNbZnJvbV0ucHVzaCh0byk7XG4gICAgfVxuICAgIGlmICh0aGlzLmluY29taW5nRWRnZXNbdG9dLmluZGV4T2YoZnJvbSkgPT09IC0xKSB7XG4gICAgICB0aGlzLmluY29taW5nRWRnZXNbdG9dLnB1c2goZnJvbSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICAvKipcbiAgICogUmVtb3ZlIGEgZGVwZW5kZW5jeSBiZXR3ZWVuIHR3byBub2Rlcy5cbiAgICovXG4gIHJlbW92ZURlcGVuZGVuY3k6IGZ1bmN0aW9uIChmcm9tLCB0bykge1xuICAgIHZhciBpZHg7XG4gICAgaWYgKHRoaXMuaGFzTm9kZShmcm9tKSkge1xuICAgICAgaWR4ID0gdGhpcy5vdXRnb2luZ0VkZ2VzW2Zyb21dLmluZGV4T2YodG8pO1xuICAgICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgIHRoaXMub3V0Z29pbmdFZGdlc1tmcm9tXS5zcGxpY2UoaWR4LCAxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5oYXNOb2RlKHRvKSkge1xuICAgICAgaWR4ID0gdGhpcy5pbmNvbWluZ0VkZ2VzW3RvXS5pbmRleE9mKGZyb20pO1xuICAgICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgIHRoaXMuaW5jb21pbmdFZGdlc1t0b10uc3BsaWNlKGlkeCwgMSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICAvKipcbiAgICogUmV0dXJuIGEgY2xvbmUgb2YgdGhlIGRlcGVuZGVuY3kgZ3JhcGguIElmIGFueSBjdXN0b20gZGF0YSBpcyBhdHRhY2hlZFxuICAgKiB0byB0aGUgbm9kZXMsIGl0IHdpbGwgb25seSBiZSBzaGFsbG93IGNvcGllZC5cbiAgICovXG4gIGNsb25lOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNvdXJjZSA9IHRoaXM7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBEZXBHcmFwaCgpO1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoc291cmNlLm5vZGVzKTtcbiAgICBrZXlzLmZvckVhY2goZnVuY3Rpb24gKG4pIHtcbiAgICAgIHJlc3VsdC5ub2Rlc1tuXSA9IHNvdXJjZS5ub2Rlc1tuXTtcbiAgICAgIHJlc3VsdC5vdXRnb2luZ0VkZ2VzW25dID0gc291cmNlLm91dGdvaW5nRWRnZXNbbl0uc2xpY2UoMCk7XG4gICAgICByZXN1bHQuaW5jb21pbmdFZGdlc1tuXSA9IHNvdXJjZS5pbmNvbWluZ0VkZ2VzW25dLnNsaWNlKDApO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0sXG4gIC8qKlxuICAgKiBHZXQgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZGlyZWN0IGRlcGVuZGVuY2llcyBvZiB0aGUgc3BlY2lmaWVkIG5vZGUuXG4gICAqXG4gICAqIFRocm93cyBhbiBFcnJvciBpZiB0aGUgc3BlY2lmaWVkIG5vZGUgZG9lcyBub3QgZXhpc3QuXG4gICAqL1xuICBkaXJlY3REZXBlbmRlbmNpZXNPZjogZnVuY3Rpb24gKG5vZGUpIHtcbiAgICBpZiAodGhpcy5oYXNOb2RlKG5vZGUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5vdXRnb2luZ0VkZ2VzW25vZGVdLnNsaWNlKDApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlIGRvZXMgbm90IGV4aXN0OiBcIiArIG5vZGUpO1xuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIEdldCBhbiBhcnJheSBjb250YWluaW5nIHRoZSBub2RlcyB0aGF0IGRpcmVjdGx5IGRlcGVuZCBvbiB0aGUgc3BlY2lmaWVkIG5vZGUuXG4gICAqXG4gICAqIFRocm93cyBhbiBFcnJvciBpZiB0aGUgc3BlY2lmaWVkIG5vZGUgZG9lcyBub3QgZXhpc3QuXG4gICAqL1xuICBkaXJlY3REZXBlbmRhbnRzT2Y6IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgaWYgKHRoaXMuaGFzTm9kZShub2RlKSkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5jb21pbmdFZGdlc1tub2RlXS5zbGljZSgwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm9kZSBkb2VzIG5vdCBleGlzdDogXCIgKyBub2RlKTtcbiAgICB9XG4gIH0sXG4gIC8qKlxuICAgKiBHZXQgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgbm9kZXMgdGhhdCB0aGUgc3BlY2lmaWVkIG5vZGUgZGVwZW5kcyBvbiAodHJhbnNpdGl2ZWx5KS5cbiAgICpcbiAgICogVGhyb3dzIGFuIEVycm9yIGlmIHRoZSBncmFwaCBoYXMgYSBjeWNsZSwgb3IgdGhlIHNwZWNpZmllZCBub2RlIGRvZXMgbm90IGV4aXN0LlxuICAgKlxuICAgKiBJZiBgbGVhdmVzT25seWAgaXMgdHJ1ZSwgb25seSBub2RlcyB0aGF0IGRvIG5vdCBkZXBlbmQgb24gYW55IG90aGVyIG5vZGVzIHdpbGwgYmUgcmV0dXJuZWRcbiAgICogaW4gdGhlIGFycmF5LlxuICAgKi9cbiAgZGVwZW5kZW5jaWVzT2Y6IGZ1bmN0aW9uIChub2RlLCBsZWF2ZXNPbmx5KSB7XG4gICAgaWYgKHRoaXMuaGFzTm9kZShub2RlKSkge1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgdmFyIERGUyA9IGNyZWF0ZURGUyhcbiAgICAgICAgdGhpcy5vdXRnb2luZ0VkZ2VzLFxuICAgICAgICBsZWF2ZXNPbmx5LFxuICAgICAgICByZXN1bHQsXG4gICAgICAgIHRoaXMuY2lyY3VsYXJcbiAgICAgICk7XG4gICAgICBERlMobm9kZSk7XG4gICAgICB2YXIgaWR4ID0gcmVzdWx0LmluZGV4T2Yobm9kZSk7XG4gICAgICBpZiAoaWR4ID49IDApIHtcbiAgICAgICAgcmVzdWx0LnNwbGljZShpZHgsIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm9kZSBkb2VzIG5vdCBleGlzdDogXCIgKyBub2RlKTtcbiAgICB9XG4gIH0sXG4gIC8qKlxuICAgKiBnZXQgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgbm9kZXMgdGhhdCBkZXBlbmQgb24gdGhlIHNwZWNpZmllZCBub2RlICh0cmFuc2l0aXZlbHkpLlxuICAgKlxuICAgKiBUaHJvd3MgYW4gRXJyb3IgaWYgdGhlIGdyYXBoIGhhcyBhIGN5Y2xlLCBvciB0aGUgc3BlY2lmaWVkIG5vZGUgZG9lcyBub3QgZXhpc3QuXG4gICAqXG4gICAqIElmIGBsZWF2ZXNPbmx5YCBpcyB0cnVlLCBvbmx5IG5vZGVzIHRoYXQgZG8gbm90IGhhdmUgYW55IGRlcGVuZGFudHMgd2lsbCBiZSByZXR1cm5lZCBpbiB0aGUgYXJyYXkuXG4gICAqL1xuICBkZXBlbmRhbnRzT2Y6IGZ1bmN0aW9uIChub2RlLCBsZWF2ZXNPbmx5KSB7XG4gICAgaWYgKHRoaXMuaGFzTm9kZShub2RlKSkge1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgdmFyIERGUyA9IGNyZWF0ZURGUyhcbiAgICAgICAgdGhpcy5pbmNvbWluZ0VkZ2VzLFxuICAgICAgICBsZWF2ZXNPbmx5LFxuICAgICAgICByZXN1bHQsXG4gICAgICAgIHRoaXMuY2lyY3VsYXJcbiAgICAgICk7XG4gICAgICBERlMobm9kZSk7XG4gICAgICB2YXIgaWR4ID0gcmVzdWx0LmluZGV4T2Yobm9kZSk7XG4gICAgICBpZiAoaWR4ID49IDApIHtcbiAgICAgICAgcmVzdWx0LnNwbGljZShpZHgsIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm9kZSBkb2VzIG5vdCBleGlzdDogXCIgKyBub2RlKTtcbiAgICB9XG4gIH0sXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3QgdGhlIG92ZXJhbGwgcHJvY2Vzc2luZyBvcmRlciBmb3IgdGhlIGRlcGVuZGVuY3kgZ3JhcGguXG4gICAqXG4gICAqIFRocm93cyBhbiBFcnJvciBpZiB0aGUgZ3JhcGggaGFzIGEgY3ljbGUuXG4gICAqXG4gICAqIElmIGBsZWF2ZXNPbmx5YCBpcyB0cnVlLCBvbmx5IG5vZGVzIHRoYXQgZG8gbm90IGRlcGVuZCBvbiBhbnkgb3RoZXIgbm9kZXMgd2lsbCBiZSByZXR1cm5lZC5cbiAgICovXG4gIG92ZXJhbGxPcmRlcjogZnVuY3Rpb24gKGxlYXZlc09ubHkpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXModGhpcy5ub2Rlcyk7XG4gICAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gcmVzdWx0OyAvLyBFbXB0eSBncmFwaFxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIXRoaXMuY2lyY3VsYXIpIHtcbiAgICAgICAgLy8gTG9vayBmb3IgY3ljbGVzIC0gd2UgcnVuIHRoZSBERlMgc3RhcnRpbmcgYXQgYWxsIHRoZSBub2RlcyBpbiBjYXNlIHRoZXJlXG4gICAgICAgIC8vIGFyZSBzZXZlcmFsIGRpc2Nvbm5lY3RlZCBzdWJncmFwaHMgaW5zaWRlIHRoaXMgZGVwZW5kZW5jeSBncmFwaC5cbiAgICAgICAgdmFyIEN5Y2xlREZTID0gY3JlYXRlREZTKHRoaXMub3V0Z29pbmdFZGdlcywgZmFsc2UsIFtdLCB0aGlzLmNpcmN1bGFyKTtcbiAgICAgICAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7XG4gICAgICAgICAgQ3ljbGVERlMobik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB2YXIgREZTID0gY3JlYXRlREZTKFxuICAgICAgICB0aGlzLm91dGdvaW5nRWRnZXMsXG4gICAgICAgIGxlYXZlc09ubHksXG4gICAgICAgIHJlc3VsdCxcbiAgICAgICAgdGhpcy5jaXJjdWxhclxuICAgICAgKTtcbiAgICAgIC8vIEZpbmQgYWxsIHBvdGVudGlhbCBzdGFydGluZyBwb2ludHMgKG5vZGVzIHdpdGggbm90aGluZyBkZXBlbmRpbmcgb24gdGhlbSkgYW5cbiAgICAgIC8vIHJ1biBhIERGUyBzdGFydGluZyBhdCB0aGVzZSBwb2ludHMgdG8gZ2V0IHRoZSBvcmRlclxuICAgICAga2V5c1xuICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgcmV0dXJuIHNlbGYuaW5jb21pbmdFZGdlc1tub2RlXS5sZW5ndGggPT09IDA7XG4gICAgICAgIH0pXG4gICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7XG4gICAgICAgICAgREZTKG4pO1xuICAgICAgICB9KTtcblxuICAgICAgLy8gSWYgd2UncmUgYWxsb3dpbmcgY3ljbGVzIC0gd2UgbmVlZCB0byBydW4gdGhlIERGUyBhZ2FpbnN0IGFueSByZW1haW5pbmdcbiAgICAgIC8vIG5vZGVzIHRoYXQgZGlkIG5vdCBlbmQgdXAgaW4gdGhlIGluaXRpYWwgcmVzdWx0IChhcyB0aGV5IGFyZSBwYXJ0IG9mIGFcbiAgICAgIC8vIHN1YmdyYXBoIHRoYXQgZG9lcyBub3QgaGF2ZSBhIGNsZWFyIHN0YXJ0aW5nIHBvaW50KVxuICAgICAgaWYgKHRoaXMuY2lyY3VsYXIpIHtcbiAgICAgICAga2V5c1xuICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQuaW5kZXhPZihub2RlKSA9PT0gLTE7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZm9yRWFjaChmdW5jdGlvbiAobikge1xuICAgICAgICAgICAgREZTKG4pO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIEdldCBhbiBhcnJheSBvZiBub2RlcyB0aGF0IGhhdmUgbm8gZGVwZW5kYW50cyAoaS5lLiBub3RoaW5nIGRlcGVuZHMgb24gdGhlbSkuXG4gICAqL1xuICBlbnRyeU5vZGVzOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLm5vZGVzKS5maWx0ZXIoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIHJldHVybiBzZWxmLmluY29taW5nRWRnZXNbbm9kZV0ubGVuZ3RoID09PSAwO1xuICAgIH0pO1xuICB9XG59O1xuXG4vLyBDcmVhdGUgc29tZSBhbGlhc2VzXG5EZXBHcmFwaC5wcm90b3R5cGUuZGlyZWN0RGVwZW5kZW50c09mID0gRGVwR3JhcGgucHJvdG90eXBlLmRpcmVjdERlcGVuZGFudHNPZjtcbkRlcEdyYXBoLnByb3RvdHlwZS5kZXBlbmRlbnRzT2YgPSBEZXBHcmFwaC5wcm90b3R5cGUuZGVwZW5kYW50c09mO1xuXG4vKipcbiAqIEN5Y2xlIGVycm9yLCBpbmNsdWRpbmcgdGhlIHBhdGggb2YgdGhlIGN5Y2xlLlxuICovXG52YXIgRGVwR3JhcGhDeWNsZUVycm9yID0gKGV4cG9ydHMuRGVwR3JhcGhDeWNsZUVycm9yID0gZnVuY3Rpb24gKGN5Y2xlUGF0aCkge1xuICB2YXIgbWVzc2FnZSA9IFwiRGVwZW5kZW5jeSBDeWNsZSBGb3VuZDogXCIgKyBjeWNsZVBhdGguam9pbihcIiAtPiBcIik7XG4gIHZhciBpbnN0YW5jZSA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgaW5zdGFuY2UuY3ljbGVQYXRoID0gY3ljbGVQYXRoO1xuICBPYmplY3Quc2V0UHJvdG90eXBlT2YoaW5zdGFuY2UsIE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKSk7XG4gIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKGluc3RhbmNlLCBEZXBHcmFwaEN5Y2xlRXJyb3IpO1xuICB9XG4gIHJldHVybiBpbnN0YW5jZTtcbn0pO1xuRGVwR3JhcGhDeWNsZUVycm9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlLCB7XG4gIGNvbnN0cnVjdG9yOiB7XG4gICAgdmFsdWU6IEVycm9yLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9XG59KTtcbk9iamVjdC5zZXRQcm90b3R5cGVPZihEZXBHcmFwaEN5Y2xlRXJyb3IsIEVycm9yKTtcbiIsIi8qKlxuICogaW5zcGlyZWQgYnkgaXMtbnVtYmVyIDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9pcy1udW1iZXI+XG4gKiBidXQgc2lnbmlmaWNhbnRseSBzaW1wbGlmaWVkIGFuZCBzcGVkIHVwIGJ5IGlnbm9yaW5nIG51bWJlciBhbmQgc3RyaW5nIGNvbnN0cnVjdG9yc1xuICogaWUgdGhlc2UgcmV0dXJuIGZhbHNlOlxuICogICBuZXcgTnVtYmVyKDEpXG4gKiAgIG5ldyBTdHJpbmcoJzEnKVxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGFsbEJsYW5rQ2hhckNvZGVzID0gcmVxdWlyZSgnaXMtc3RyaW5nLWJsYW5rJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obikge1xuICAgIHZhciB0eXBlID0gdHlwZW9mIG47XG4gICAgaWYodHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdmFyIG9yaWdpbmFsID0gbjtcbiAgICAgICAgbiA9ICtuO1xuICAgICAgICAvLyB3aGl0ZXNwYWNlIHN0cmluZ3MgY2FzdCB0byB6ZXJvIC0gZmlsdGVyIHRoZW0gb3V0XG4gICAgICAgIGlmKG49PT0wICYmIGFsbEJsYW5rQ2hhckNvZGVzKG9yaWdpbmFsKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBlbHNlIGlmKHR5cGUgIT09ICdudW1iZXInKSByZXR1cm4gZmFsc2U7XG5cbiAgICByZXR1cm4gbiAtIG4gPCAxO1xufTtcbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LCBDaHJpcyBQZXR0aXR0XG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4gKlxuICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4gKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqXG4gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uXG4gKiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVyIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuICogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXRcbiAqIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIiBBTkRcbiAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEXG4gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXG4gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFXG4gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTFxuICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1JcbiAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSXG4gKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLFxuICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0VcbiAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKi9cblxudmFyIGxpYiA9IHJlcXVpcmUoXCIuL2xpYlwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEdyYXBoOiBsaWIuR3JhcGgsXG4gIGpzb246IHJlcXVpcmUoXCIuL2xpYi9qc29uXCIpLFxuICBhbGc6IHJlcXVpcmUoXCIuL2xpYi9hbGdcIiksXG4gIHZlcnNpb246IGxpYi52ZXJzaW9uXG59O1xuIiwidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbXBvbmVudHM7XG5cbmZ1bmN0aW9uIGNvbXBvbmVudHMoZykge1xuICB2YXIgdmlzaXRlZCA9IHt9O1xuICB2YXIgY21wdHMgPSBbXTtcbiAgdmFyIGNtcHQ7XG5cbiAgZnVuY3Rpb24gZGZzKHYpIHtcbiAgICBpZiAoXy5oYXModmlzaXRlZCwgdikpIHJldHVybjtcbiAgICB2aXNpdGVkW3ZdID0gdHJ1ZTtcbiAgICBjbXB0LnB1c2godik7XG4gICAgXy5lYWNoKGcuc3VjY2Vzc29ycyh2KSwgZGZzKTtcbiAgICBfLmVhY2goZy5wcmVkZWNlc3NvcnModiksIGRmcyk7XG4gIH1cblxuICBfLmVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgY21wdCA9IFtdO1xuICAgIGRmcyh2KTtcbiAgICBpZiAoY21wdC5sZW5ndGgpIHtcbiAgICAgIGNtcHRzLnB1c2goY21wdCk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gY21wdHM7XG59XG4iLCJ2YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gZGZzO1xuXG4vKlxuICogQSBoZWxwZXIgdGhhdCBwcmVmb3JtcyBhIHByZS0gb3IgcG9zdC1vcmRlciB0cmF2ZXJzYWwgb24gdGhlIGlucHV0IGdyYXBoXG4gKiBhbmQgcmV0dXJucyB0aGUgbm9kZXMgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSB2aXNpdGVkLiBJZiB0aGUgZ3JhcGggaXNcbiAqIHVuZGlyZWN0ZWQgdGhlbiB0aGlzIGFsZ29yaXRobSB3aWxsIG5hdmlnYXRlIHVzaW5nIG5laWdoYm9ycy4gSWYgdGhlIGdyYXBoXG4gKiBpcyBkaXJlY3RlZCB0aGVuIHRoaXMgYWxnb3JpdGhtIHdpbGwgbmF2aWdhdGUgdXNpbmcgc3VjY2Vzc29ycy5cbiAqXG4gKiBPcmRlciBtdXN0IGJlIG9uZSBvZiBcInByZVwiIG9yIFwicG9zdFwiLlxuICovXG5mdW5jdGlvbiBkZnMoZywgdnMsIG9yZGVyKSB7XG4gIGlmICghXy5pc0FycmF5KHZzKSkge1xuICAgIHZzID0gW3ZzXTtcbiAgfVxuXG4gIHZhciBuYXZpZ2F0aW9uID0gKGcuaXNEaXJlY3RlZCgpID8gZy5zdWNjZXNzb3JzIDogZy5uZWlnaGJvcnMpLmJpbmQoZyk7XG5cbiAgdmFyIGFjYyA9IFtdO1xuICB2YXIgdmlzaXRlZCA9IHt9O1xuICBfLmVhY2godnMsIGZ1bmN0aW9uKHYpIHtcbiAgICBpZiAoIWcuaGFzTm9kZSh2KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiR3JhcGggZG9lcyBub3QgaGF2ZSBub2RlOiBcIiArIHYpO1xuICAgIH1cblxuICAgIGRvRGZzKGcsIHYsIG9yZGVyID09PSBcInBvc3RcIiwgdmlzaXRlZCwgbmF2aWdhdGlvbiwgYWNjKTtcbiAgfSk7XG4gIHJldHVybiBhY2M7XG59XG5cbmZ1bmN0aW9uIGRvRGZzKGcsIHYsIHBvc3RvcmRlciwgdmlzaXRlZCwgbmF2aWdhdGlvbiwgYWNjKSB7XG4gIGlmICghXy5oYXModmlzaXRlZCwgdikpIHtcbiAgICB2aXNpdGVkW3ZdID0gdHJ1ZTtcblxuICAgIGlmICghcG9zdG9yZGVyKSB7IGFjYy5wdXNoKHYpOyB9XG4gICAgXy5lYWNoKG5hdmlnYXRpb24odiksIGZ1bmN0aW9uKHcpIHtcbiAgICAgIGRvRGZzKGcsIHcsIHBvc3RvcmRlciwgdmlzaXRlZCwgbmF2aWdhdGlvbiwgYWNjKTtcbiAgICB9KTtcbiAgICBpZiAocG9zdG9yZGVyKSB7IGFjYy5wdXNoKHYpOyB9XG4gIH1cbn1cbiIsInZhciBkaWprc3RyYSA9IHJlcXVpcmUoXCIuL2RpamtzdHJhXCIpO1xudmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRpamtzdHJhQWxsO1xuXG5mdW5jdGlvbiBkaWprc3RyYUFsbChnLCB3ZWlnaHRGdW5jLCBlZGdlRnVuYykge1xuICByZXR1cm4gXy50cmFuc2Zvcm0oZy5ub2RlcygpLCBmdW5jdGlvbihhY2MsIHYpIHtcbiAgICBhY2Nbdl0gPSBkaWprc3RyYShnLCB2LCB3ZWlnaHRGdW5jLCBlZGdlRnVuYyk7XG4gIH0sIHt9KTtcbn1cbiIsInZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcbnZhciBQcmlvcml0eVF1ZXVlID0gcmVxdWlyZShcIi4uL2RhdGEvcHJpb3JpdHktcXVldWVcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gZGlqa3N0cmE7XG5cbnZhciBERUZBVUxUX1dFSUdIVF9GVU5DID0gXy5jb25zdGFudCgxKTtcblxuZnVuY3Rpb24gZGlqa3N0cmEoZywgc291cmNlLCB3ZWlnaHRGbiwgZWRnZUZuKSB7XG4gIHJldHVybiBydW5EaWprc3RyYShnLCBTdHJpbmcoc291cmNlKSxcbiAgICB3ZWlnaHRGbiB8fCBERUZBVUxUX1dFSUdIVF9GVU5DLFxuICAgIGVkZ2VGbiB8fCBmdW5jdGlvbih2KSB7IHJldHVybiBnLm91dEVkZ2VzKHYpOyB9KTtcbn1cblxuZnVuY3Rpb24gcnVuRGlqa3N0cmEoZywgc291cmNlLCB3ZWlnaHRGbiwgZWRnZUZuKSB7XG4gIHZhciByZXN1bHRzID0ge307XG4gIHZhciBwcSA9IG5ldyBQcmlvcml0eVF1ZXVlKCk7XG4gIHZhciB2LCB2RW50cnk7XG5cbiAgdmFyIHVwZGF0ZU5laWdoYm9ycyA9IGZ1bmN0aW9uKGVkZ2UpIHtcbiAgICB2YXIgdyA9IGVkZ2UudiAhPT0gdiA/IGVkZ2UudiA6IGVkZ2UudztcbiAgICB2YXIgd0VudHJ5ID0gcmVzdWx0c1t3XTtcbiAgICB2YXIgd2VpZ2h0ID0gd2VpZ2h0Rm4oZWRnZSk7XG4gICAgdmFyIGRpc3RhbmNlID0gdkVudHJ5LmRpc3RhbmNlICsgd2VpZ2h0O1xuXG4gICAgaWYgKHdlaWdodCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImRpamtzdHJhIGRvZXMgbm90IGFsbG93IG5lZ2F0aXZlIGVkZ2Ugd2VpZ2h0cy4gXCIgK1xuICAgICAgICAgICAgICAgICAgICAgIFwiQmFkIGVkZ2U6IFwiICsgZWRnZSArIFwiIFdlaWdodDogXCIgKyB3ZWlnaHQpO1xuICAgIH1cblxuICAgIGlmIChkaXN0YW5jZSA8IHdFbnRyeS5kaXN0YW5jZSkge1xuICAgICAgd0VudHJ5LmRpc3RhbmNlID0gZGlzdGFuY2U7XG4gICAgICB3RW50cnkucHJlZGVjZXNzb3IgPSB2O1xuICAgICAgcHEuZGVjcmVhc2UodywgZGlzdGFuY2UpO1xuICAgIH1cbiAgfTtcblxuICBnLm5vZGVzKCkuZm9yRWFjaChmdW5jdGlvbih2KSB7XG4gICAgdmFyIGRpc3RhbmNlID0gdiA9PT0gc291cmNlID8gMCA6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgICByZXN1bHRzW3ZdID0geyBkaXN0YW5jZTogZGlzdGFuY2UgfTtcbiAgICBwcS5hZGQodiwgZGlzdGFuY2UpO1xuICB9KTtcblxuICB3aGlsZSAocHEuc2l6ZSgpID4gMCkge1xuICAgIHYgPSBwcS5yZW1vdmVNaW4oKTtcbiAgICB2RW50cnkgPSByZXN1bHRzW3ZdO1xuICAgIGlmICh2RW50cnkuZGlzdGFuY2UgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgZWRnZUZuKHYpLmZvckVhY2godXBkYXRlTmVpZ2hib3JzKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHRzO1xufVxuIiwidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xudmFyIHRhcmphbiA9IHJlcXVpcmUoXCIuL3RhcmphblwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmaW5kQ3ljbGVzO1xuXG5mdW5jdGlvbiBmaW5kQ3ljbGVzKGcpIHtcbiAgcmV0dXJuIF8uZmlsdGVyKHRhcmphbihnKSwgZnVuY3Rpb24oY21wdCkge1xuICAgIHJldHVybiBjbXB0Lmxlbmd0aCA+IDEgfHwgKGNtcHQubGVuZ3RoID09PSAxICYmIGcuaGFzRWRnZShjbXB0WzBdLCBjbXB0WzBdKSk7XG4gIH0pO1xufVxuIiwidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZsb3lkV2Fyc2hhbGw7XG5cbnZhciBERUZBVUxUX1dFSUdIVF9GVU5DID0gXy5jb25zdGFudCgxKTtcblxuZnVuY3Rpb24gZmxveWRXYXJzaGFsbChnLCB3ZWlnaHRGbiwgZWRnZUZuKSB7XG4gIHJldHVybiBydW5GbG95ZFdhcnNoYWxsKGcsXG4gICAgd2VpZ2h0Rm4gfHwgREVGQVVMVF9XRUlHSFRfRlVOQyxcbiAgICBlZGdlRm4gfHwgZnVuY3Rpb24odikgeyByZXR1cm4gZy5vdXRFZGdlcyh2KTsgfSk7XG59XG5cbmZ1bmN0aW9uIHJ1bkZsb3lkV2Fyc2hhbGwoZywgd2VpZ2h0Rm4sIGVkZ2VGbikge1xuICB2YXIgcmVzdWx0cyA9IHt9O1xuICB2YXIgbm9kZXMgPSBnLm5vZGVzKCk7XG5cbiAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbih2KSB7XG4gICAgcmVzdWx0c1t2XSA9IHt9O1xuICAgIHJlc3VsdHNbdl1bdl0gPSB7IGRpc3RhbmNlOiAwIH07XG4gICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbih3KSB7XG4gICAgICBpZiAodiAhPT0gdykge1xuICAgICAgICByZXN1bHRzW3ZdW3ddID0geyBkaXN0YW5jZTogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIH07XG4gICAgICB9XG4gICAgfSk7XG4gICAgZWRnZUZuKHYpLmZvckVhY2goZnVuY3Rpb24oZWRnZSkge1xuICAgICAgdmFyIHcgPSBlZGdlLnYgPT09IHYgPyBlZGdlLncgOiBlZGdlLnY7XG4gICAgICB2YXIgZCA9IHdlaWdodEZuKGVkZ2UpO1xuICAgICAgcmVzdWx0c1t2XVt3XSA9IHsgZGlzdGFuY2U6IGQsIHByZWRlY2Vzc29yOiB2IH07XG4gICAgfSk7XG4gIH0pO1xuXG4gIG5vZGVzLmZvckVhY2goZnVuY3Rpb24oaykge1xuICAgIHZhciByb3dLID0gcmVzdWx0c1trXTtcbiAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKGkpIHtcbiAgICAgIHZhciByb3dJID0gcmVzdWx0c1tpXTtcbiAgICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24oaikge1xuICAgICAgICB2YXIgaWsgPSByb3dJW2tdO1xuICAgICAgICB2YXIga2ogPSByb3dLW2pdO1xuICAgICAgICB2YXIgaWogPSByb3dJW2pdO1xuICAgICAgICB2YXIgYWx0RGlzdGFuY2UgPSBpay5kaXN0YW5jZSArIGtqLmRpc3RhbmNlO1xuICAgICAgICBpZiAoYWx0RGlzdGFuY2UgPCBpai5kaXN0YW5jZSkge1xuICAgICAgICAgIGlqLmRpc3RhbmNlID0gYWx0RGlzdGFuY2U7XG4gICAgICAgICAgaWoucHJlZGVjZXNzb3IgPSBrai5wcmVkZWNlc3NvcjtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHRzO1xufVxuIiwibW9kdWxlLmV4cG9ydHMgPSB7XG4gIGNvbXBvbmVudHM6IHJlcXVpcmUoXCIuL2NvbXBvbmVudHNcIiksXG4gIGRpamtzdHJhOiByZXF1aXJlKFwiLi9kaWprc3RyYVwiKSxcbiAgZGlqa3N0cmFBbGw6IHJlcXVpcmUoXCIuL2RpamtzdHJhLWFsbFwiKSxcbiAgZmluZEN5Y2xlczogcmVxdWlyZShcIi4vZmluZC1jeWNsZXNcIiksXG4gIGZsb3lkV2Fyc2hhbGw6IHJlcXVpcmUoXCIuL2Zsb3lkLXdhcnNoYWxsXCIpLFxuICBpc0FjeWNsaWM6IHJlcXVpcmUoXCIuL2lzLWFjeWNsaWNcIiksXG4gIHBvc3RvcmRlcjogcmVxdWlyZShcIi4vcG9zdG9yZGVyXCIpLFxuICBwcmVvcmRlcjogcmVxdWlyZShcIi4vcHJlb3JkZXJcIiksXG4gIHByaW06IHJlcXVpcmUoXCIuL3ByaW1cIiksXG4gIHRhcmphbjogcmVxdWlyZShcIi4vdGFyamFuXCIpLFxuICB0b3Bzb3J0OiByZXF1aXJlKFwiLi90b3Bzb3J0XCIpXG59O1xuIiwidmFyIHRvcHNvcnQgPSByZXF1aXJlKFwiLi90b3Bzb3J0XCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQWN5Y2xpYztcblxuZnVuY3Rpb24gaXNBY3ljbGljKGcpIHtcbiAgdHJ5IHtcbiAgICB0b3Bzb3J0KGcpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKGUgaW5zdGFuY2VvZiB0b3Bzb3J0LkN5Y2xlRXhjZXB0aW9uKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRocm93IGU7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG4iLCJ2YXIgZGZzID0gcmVxdWlyZShcIi4vZGZzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBvc3RvcmRlcjtcblxuZnVuY3Rpb24gcG9zdG9yZGVyKGcsIHZzKSB7XG4gIHJldHVybiBkZnMoZywgdnMsIFwicG9zdFwiKTtcbn1cbiIsInZhciBkZnMgPSByZXF1aXJlKFwiLi9kZnNcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gcHJlb3JkZXI7XG5cbmZ1bmN0aW9uIHByZW9yZGVyKGcsIHZzKSB7XG4gIHJldHVybiBkZnMoZywgdnMsIFwicHJlXCIpO1xufVxuIiwidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xudmFyIEdyYXBoID0gcmVxdWlyZShcIi4uL2dyYXBoXCIpO1xudmFyIFByaW9yaXR5UXVldWUgPSByZXF1aXJlKFwiLi4vZGF0YS9wcmlvcml0eS1xdWV1ZVwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwcmltO1xuXG5mdW5jdGlvbiBwcmltKGcsIHdlaWdodEZ1bmMpIHtcbiAgdmFyIHJlc3VsdCA9IG5ldyBHcmFwaCgpO1xuICB2YXIgcGFyZW50cyA9IHt9O1xuICB2YXIgcHEgPSBuZXcgUHJpb3JpdHlRdWV1ZSgpO1xuICB2YXIgdjtcblxuICBmdW5jdGlvbiB1cGRhdGVOZWlnaGJvcnMoZWRnZSkge1xuICAgIHZhciB3ID0gZWRnZS52ID09PSB2ID8gZWRnZS53IDogZWRnZS52O1xuICAgIHZhciBwcmkgPSBwcS5wcmlvcml0eSh3KTtcbiAgICBpZiAocHJpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciBlZGdlV2VpZ2h0ID0gd2VpZ2h0RnVuYyhlZGdlKTtcbiAgICAgIGlmIChlZGdlV2VpZ2h0IDwgcHJpKSB7XG4gICAgICAgIHBhcmVudHNbd10gPSB2O1xuICAgICAgICBwcS5kZWNyZWFzZSh3LCBlZGdlV2VpZ2h0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoZy5ub2RlQ291bnQoKSA9PT0gMCkge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBfLmVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgcHEuYWRkKHYsIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7XG4gICAgcmVzdWx0LnNldE5vZGUodik7XG4gIH0pO1xuXG4gIC8vIFN0YXJ0IGZyb20gYW4gYXJiaXRyYXJ5IG5vZGVcbiAgcHEuZGVjcmVhc2UoZy5ub2RlcygpWzBdLCAwKTtcblxuICB2YXIgaW5pdCA9IGZhbHNlO1xuICB3aGlsZSAocHEuc2l6ZSgpID4gMCkge1xuICAgIHYgPSBwcS5yZW1vdmVNaW4oKTtcbiAgICBpZiAoXy5oYXMocGFyZW50cywgdikpIHtcbiAgICAgIHJlc3VsdC5zZXRFZGdlKHYsIHBhcmVudHNbdl0pO1xuICAgIH0gZWxzZSBpZiAoaW5pdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW5wdXQgZ3JhcGggaXMgbm90IGNvbm5lY3RlZDogXCIgKyBnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5pdCA9IHRydWU7XG4gICAgfVxuXG4gICAgZy5ub2RlRWRnZXModikuZm9yRWFjaCh1cGRhdGVOZWlnaGJvcnMpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiIsInZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSB0YXJqYW47XG5cbmZ1bmN0aW9uIHRhcmphbihnKSB7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBzdGFjayA9IFtdO1xuICB2YXIgdmlzaXRlZCA9IHt9OyAvLyBub2RlIGlkIC0+IHsgb25TdGFjaywgbG93bGluaywgaW5kZXggfVxuICB2YXIgcmVzdWx0cyA9IFtdO1xuXG4gIGZ1bmN0aW9uIGRmcyh2KSB7XG4gICAgdmFyIGVudHJ5ID0gdmlzaXRlZFt2XSA9IHtcbiAgICAgIG9uU3RhY2s6IHRydWUsXG4gICAgICBsb3dsaW5rOiBpbmRleCxcbiAgICAgIGluZGV4OiBpbmRleCsrXG4gICAgfTtcbiAgICBzdGFjay5wdXNoKHYpO1xuXG4gICAgZy5zdWNjZXNzb3JzKHYpLmZvckVhY2goZnVuY3Rpb24odykge1xuICAgICAgaWYgKCFfLmhhcyh2aXNpdGVkLCB3KSkge1xuICAgICAgICBkZnModyk7XG4gICAgICAgIGVudHJ5Lmxvd2xpbmsgPSBNYXRoLm1pbihlbnRyeS5sb3dsaW5rLCB2aXNpdGVkW3ddLmxvd2xpbmspO1xuICAgICAgfSBlbHNlIGlmICh2aXNpdGVkW3ddLm9uU3RhY2spIHtcbiAgICAgICAgZW50cnkubG93bGluayA9IE1hdGgubWluKGVudHJ5Lmxvd2xpbmssIHZpc2l0ZWRbd10uaW5kZXgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKGVudHJ5Lmxvd2xpbmsgPT09IGVudHJ5LmluZGV4KSB7XG4gICAgICB2YXIgY21wdCA9IFtdO1xuICAgICAgdmFyIHc7XG4gICAgICBkbyB7XG4gICAgICAgIHcgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgdmlzaXRlZFt3XS5vblN0YWNrID0gZmFsc2U7XG4gICAgICAgIGNtcHQucHVzaCh3KTtcbiAgICAgIH0gd2hpbGUgKHYgIT09IHcpO1xuICAgICAgcmVzdWx0cy5wdXNoKGNtcHQpO1xuICAgIH1cbiAgfVxuXG4gIGcubm9kZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHtcbiAgICBpZiAoIV8uaGFzKHZpc2l0ZWQsIHYpKSB7XG4gICAgICBkZnModik7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcmVzdWx0cztcbn1cbiIsInZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSB0b3Bzb3J0O1xudG9wc29ydC5DeWNsZUV4Y2VwdGlvbiA9IEN5Y2xlRXhjZXB0aW9uO1xuXG5mdW5jdGlvbiB0b3Bzb3J0KGcpIHtcbiAgdmFyIHZpc2l0ZWQgPSB7fTtcbiAgdmFyIHN0YWNrID0ge307XG4gIHZhciByZXN1bHRzID0gW107XG5cbiAgZnVuY3Rpb24gdmlzaXQobm9kZSkge1xuICAgIGlmIChfLmhhcyhzdGFjaywgbm9kZSkpIHtcbiAgICAgIHRocm93IG5ldyBDeWNsZUV4Y2VwdGlvbigpO1xuICAgIH1cblxuICAgIGlmICghXy5oYXModmlzaXRlZCwgbm9kZSkpIHtcbiAgICAgIHN0YWNrW25vZGVdID0gdHJ1ZTtcbiAgICAgIHZpc2l0ZWRbbm9kZV0gPSB0cnVlO1xuICAgICAgXy5lYWNoKGcucHJlZGVjZXNzb3JzKG5vZGUpLCB2aXNpdCk7XG4gICAgICBkZWxldGUgc3RhY2tbbm9kZV07XG4gICAgICByZXN1bHRzLnB1c2gobm9kZSk7XG4gICAgfVxuICB9XG5cbiAgXy5lYWNoKGcuc2lua3MoKSwgdmlzaXQpO1xuXG4gIGlmIChfLnNpemUodmlzaXRlZCkgIT09IGcubm9kZUNvdW50KCkpIHtcbiAgICB0aHJvdyBuZXcgQ3ljbGVFeGNlcHRpb24oKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHRzO1xufVxuXG5mdW5jdGlvbiBDeWNsZUV4Y2VwdGlvbigpIHt9XG5DeWNsZUV4Y2VwdGlvbi5wcm90b3R5cGUgPSBuZXcgRXJyb3IoKTsgLy8gbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBFcnJvciB0byBwYXNzIHRlc3RpbmciLCJ2YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gUHJpb3JpdHlRdWV1ZTtcblxuLyoqXG4gKiBBIG1pbi1wcmlvcml0eSBxdWV1ZSBkYXRhIHN0cnVjdHVyZS4gVGhpcyBhbGdvcml0aG0gaXMgZGVyaXZlZCBmcm9tIENvcm1lbixcbiAqIGV0IGFsLiwgXCJJbnRyb2R1Y3Rpb24gdG8gQWxnb3JpdGhtc1wiLiBUaGUgYmFzaWMgaWRlYSBvZiBhIG1pbi1wcmlvcml0eVxuICogcXVldWUgaXMgdGhhdCB5b3UgY2FuIGVmZmljaWVudGx5IChpbiBPKDEpIHRpbWUpIGdldCB0aGUgc21hbGxlc3Qga2V5IGluXG4gKiB0aGUgcXVldWUuIEFkZGluZyBhbmQgcmVtb3ZpbmcgZWxlbWVudHMgdGFrZXMgTyhsb2cgbikgdGltZS4gQSBrZXkgY2FuXG4gKiBoYXZlIGl0cyBwcmlvcml0eSBkZWNyZWFzZWQgaW4gTyhsb2cgbikgdGltZS5cbiAqL1xuZnVuY3Rpb24gUHJpb3JpdHlRdWV1ZSgpIHtcbiAgdGhpcy5fYXJyID0gW107XG4gIHRoaXMuX2tleUluZGljZXMgPSB7fTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHF1ZXVlLiBUYWtlcyBgTygxKWAgdGltZS5cbiAqL1xuUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5fYXJyLmxlbmd0aDtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUga2V5cyB0aGF0IGFyZSBpbiB0aGUgcXVldWUuIFRha2VzIGBPKG4pYCB0aW1lLlxuICovXG5Qcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLl9hcnIubWFwKGZ1bmN0aW9uKHgpIHsgcmV0dXJuIHgua2V5OyB9KTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBgdHJ1ZWAgaWYgKiprZXkqKiBpcyBpbiB0aGUgcXVldWUgYW5kIGBmYWxzZWAgaWYgbm90LlxuICovXG5Qcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbihrZXkpIHtcbiAgcmV0dXJuIF8uaGFzKHRoaXMuX2tleUluZGljZXMsIGtleSk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHByaW9yaXR5IGZvciAqKmtleSoqLiBJZiAqKmtleSoqIGlzIG5vdCBwcmVzZW50IGluIHRoZSBxdWV1ZVxuICogdGhlbiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYHVuZGVmaW5lZGAuIFRha2VzIGBPKDEpYCB0aW1lLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBrZXlcbiAqL1xuUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUucHJpb3JpdHkgPSBmdW5jdGlvbihrZXkpIHtcbiAgdmFyIGluZGV4ID0gdGhpcy5fa2V5SW5kaWNlc1trZXldO1xuICBpZiAoaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB0aGlzLl9hcnJbaW5kZXhdLnByaW9yaXR5O1xuICB9XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGtleSBmb3IgdGhlIG1pbmltdW0gZWxlbWVudCBpbiB0aGlzIHF1ZXVlLiBJZiB0aGUgcXVldWUgaXNcbiAqIGVtcHR5IHRoaXMgZnVuY3Rpb24gdGhyb3dzIGFuIEVycm9yLiBUYWtlcyBgTygxKWAgdGltZS5cbiAqL1xuUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUubWluID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLnNpemUoKSA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlF1ZXVlIHVuZGVyZmxvd1wiKTtcbiAgfVxuICByZXR1cm4gdGhpcy5fYXJyWzBdLmtleTtcbn07XG5cbi8qKlxuICogSW5zZXJ0cyBhIG5ldyBrZXkgaW50byB0aGUgcHJpb3JpdHkgcXVldWUuIElmIHRoZSBrZXkgYWxyZWFkeSBleGlzdHMgaW5cbiAqIHRoZSBxdWV1ZSB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYGZhbHNlYDsgb3RoZXJ3aXNlIGl0IHdpbGwgcmV0dXJuIGB0cnVlYC5cbiAqIFRha2VzIGBPKG4pYCB0aW1lLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBrZXkgdGhlIGtleSB0byBhZGRcbiAqIEBwYXJhbSB7TnVtYmVyfSBwcmlvcml0eSB0aGUgaW5pdGlhbCBwcmlvcml0eSBmb3IgdGhlIGtleVxuICovXG5Qcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbihrZXksIHByaW9yaXR5KSB7XG4gIHZhciBrZXlJbmRpY2VzID0gdGhpcy5fa2V5SW5kaWNlcztcbiAga2V5ID0gU3RyaW5nKGtleSk7XG4gIGlmICghXy5oYXMoa2V5SW5kaWNlcywga2V5KSkge1xuICAgIHZhciBhcnIgPSB0aGlzLl9hcnI7XG4gICAgdmFyIGluZGV4ID0gYXJyLmxlbmd0aDtcbiAgICBrZXlJbmRpY2VzW2tleV0gPSBpbmRleDtcbiAgICBhcnIucHVzaCh7a2V5OiBrZXksIHByaW9yaXR5OiBwcmlvcml0eX0pO1xuICAgIHRoaXMuX2RlY3JlYXNlKGluZGV4KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAqIFJlbW92ZXMgYW5kIHJldHVybnMgdGhlIHNtYWxsZXN0IGtleSBpbiB0aGUgcXVldWUuIFRha2VzIGBPKGxvZyBuKWAgdGltZS5cbiAqL1xuUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUucmVtb3ZlTWluID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuX3N3YXAoMCwgdGhpcy5fYXJyLmxlbmd0aCAtIDEpO1xuICB2YXIgbWluID0gdGhpcy5fYXJyLnBvcCgpO1xuICBkZWxldGUgdGhpcy5fa2V5SW5kaWNlc1ttaW4ua2V5XTtcbiAgdGhpcy5faGVhcGlmeSgwKTtcbiAgcmV0dXJuIG1pbi5rZXk7XG59O1xuXG4vKipcbiAqIERlY3JlYXNlcyB0aGUgcHJpb3JpdHkgZm9yICoqa2V5KiogdG8gKipwcmlvcml0eSoqLiBJZiB0aGUgbmV3IHByaW9yaXR5IGlzXG4gKiBncmVhdGVyIHRoYW4gdGhlIHByZXZpb3VzIHByaW9yaXR5LCB0aGlzIGZ1bmN0aW9uIHdpbGwgdGhyb3cgYW4gRXJyb3IuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGtleSB0aGUga2V5IGZvciB3aGljaCB0byByYWlzZSBwcmlvcml0eVxuICogQHBhcmFtIHtOdW1iZXJ9IHByaW9yaXR5IHRoZSBuZXcgcHJpb3JpdHkgZm9yIHRoZSBrZXlcbiAqL1xuUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUuZGVjcmVhc2UgPSBmdW5jdGlvbihrZXksIHByaW9yaXR5KSB7XG4gIHZhciBpbmRleCA9IHRoaXMuX2tleUluZGljZXNba2V5XTtcbiAgaWYgKHByaW9yaXR5ID4gdGhpcy5fYXJyW2luZGV4XS5wcmlvcml0eSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5ldyBwcmlvcml0eSBpcyBncmVhdGVyIHRoYW4gY3VycmVudCBwcmlvcml0eS4gXCIgK1xuICAgICAgICBcIktleTogXCIgKyBrZXkgKyBcIiBPbGQ6IFwiICsgdGhpcy5fYXJyW2luZGV4XS5wcmlvcml0eSArIFwiIE5ldzogXCIgKyBwcmlvcml0eSk7XG4gIH1cbiAgdGhpcy5fYXJyW2luZGV4XS5wcmlvcml0eSA9IHByaW9yaXR5O1xuICB0aGlzLl9kZWNyZWFzZShpbmRleCk7XG59O1xuXG5Qcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5faGVhcGlmeSA9IGZ1bmN0aW9uKGkpIHtcbiAgdmFyIGFyciA9IHRoaXMuX2FycjtcbiAgdmFyIGwgPSAyICogaTtcbiAgdmFyIHIgPSBsICsgMTtcbiAgdmFyIGxhcmdlc3QgPSBpO1xuICBpZiAobCA8IGFyci5sZW5ndGgpIHtcbiAgICBsYXJnZXN0ID0gYXJyW2xdLnByaW9yaXR5IDwgYXJyW2xhcmdlc3RdLnByaW9yaXR5ID8gbCA6IGxhcmdlc3Q7XG4gICAgaWYgKHIgPCBhcnIubGVuZ3RoKSB7XG4gICAgICBsYXJnZXN0ID0gYXJyW3JdLnByaW9yaXR5IDwgYXJyW2xhcmdlc3RdLnByaW9yaXR5ID8gciA6IGxhcmdlc3Q7XG4gICAgfVxuICAgIGlmIChsYXJnZXN0ICE9PSBpKSB7XG4gICAgICB0aGlzLl9zd2FwKGksIGxhcmdlc3QpO1xuICAgICAgdGhpcy5faGVhcGlmeShsYXJnZXN0KTtcbiAgICB9XG4gIH1cbn07XG5cblByaW9yaXR5UXVldWUucHJvdG90eXBlLl9kZWNyZWFzZSA9IGZ1bmN0aW9uKGluZGV4KSB7XG4gIHZhciBhcnIgPSB0aGlzLl9hcnI7XG4gIHZhciBwcmlvcml0eSA9IGFycltpbmRleF0ucHJpb3JpdHk7XG4gIHZhciBwYXJlbnQ7XG4gIHdoaWxlIChpbmRleCAhPT0gMCkge1xuICAgIHBhcmVudCA9IGluZGV4ID4+IDE7XG4gICAgaWYgKGFycltwYXJlbnRdLnByaW9yaXR5IDwgcHJpb3JpdHkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB0aGlzLl9zd2FwKGluZGV4LCBwYXJlbnQpO1xuICAgIGluZGV4ID0gcGFyZW50O1xuICB9XG59O1xuXG5Qcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5fc3dhcCA9IGZ1bmN0aW9uKGksIGopIHtcbiAgdmFyIGFyciA9IHRoaXMuX2FycjtcbiAgdmFyIGtleUluZGljZXMgPSB0aGlzLl9rZXlJbmRpY2VzO1xuICB2YXIgb3JpZ0FyckkgPSBhcnJbaV07XG4gIHZhciBvcmlnQXJySiA9IGFycltqXTtcbiAgYXJyW2ldID0gb3JpZ0Fycko7XG4gIGFycltqXSA9IG9yaWdBcnJJO1xuICBrZXlJbmRpY2VzW29yaWdBcnJKLmtleV0gPSBpO1xuICBrZXlJbmRpY2VzW29yaWdBcnJJLmtleV0gPSBqO1xufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuL2xvZGFzaFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBHcmFwaDtcblxudmFyIERFRkFVTFRfRURHRV9OQU1FID0gXCJcXHgwMFwiO1xudmFyIEdSQVBIX05PREUgPSBcIlxceDAwXCI7XG52YXIgRURHRV9LRVlfREVMSU0gPSBcIlxceDAxXCI7XG5cbi8vIEltcGxlbWVudGF0aW9uIG5vdGVzOlxuLy9cbi8vICAqIE5vZGUgaWQgcXVlcnkgZnVuY3Rpb25zIHNob3VsZCByZXR1cm4gc3RyaW5nIGlkcyBmb3IgdGhlIG5vZGVzXG4vLyAgKiBFZGdlIGlkIHF1ZXJ5IGZ1bmN0aW9ucyBzaG91bGQgcmV0dXJuIGFuIFwiZWRnZU9ialwiLCBlZGdlIG9iamVjdCwgdGhhdCBpc1xuLy8gICAgY29tcG9zZWQgb2YgZW5vdWdoIGluZm9ybWF0aW9uIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGFuIGVkZ2U6IHt2LCB3LCBuYW1lfS5cbi8vICAqIEludGVybmFsbHkgd2UgdXNlIGFuIFwiZWRnZUlkXCIsIGEgc3RyaW5naWZpZWQgZm9ybSBvZiB0aGUgZWRnZU9iaiwgdG9cbi8vICAgIHJlZmVyZW5jZSBlZGdlcy4gVGhpcyBpcyBiZWNhdXNlIHdlIG5lZWQgYSBwZXJmb3JtYW50IHdheSB0byBsb29rIHRoZXNlXG4vLyAgICBlZGdlcyB1cCBhbmQsIG9iamVjdCBwcm9wZXJ0aWVzLCB3aGljaCBoYXZlIHN0cmluZyBrZXlzLCBhcmUgdGhlIGNsb3Nlc3Rcbi8vICAgIHdlJ3JlIGdvaW5nIHRvIGdldCB0byBhIHBlcmZvcm1hbnQgaGFzaHRhYmxlIGluIEphdmFTY3JpcHQuXG5cbmZ1bmN0aW9uIEdyYXBoKG9wdHMpIHtcbiAgdGhpcy5faXNEaXJlY3RlZCA9IF8uaGFzKG9wdHMsIFwiZGlyZWN0ZWRcIikgPyBvcHRzLmRpcmVjdGVkIDogdHJ1ZTtcbiAgdGhpcy5faXNNdWx0aWdyYXBoID0gXy5oYXMob3B0cywgXCJtdWx0aWdyYXBoXCIpID8gb3B0cy5tdWx0aWdyYXBoIDogZmFsc2U7XG4gIHRoaXMuX2lzQ29tcG91bmQgPSBfLmhhcyhvcHRzLCBcImNvbXBvdW5kXCIpID8gb3B0cy5jb21wb3VuZCA6IGZhbHNlO1xuXG4gIC8vIExhYmVsIGZvciB0aGUgZ3JhcGggaXRzZWxmXG4gIHRoaXMuX2xhYmVsID0gdW5kZWZpbmVkO1xuXG4gIC8vIERlZmF1bHRzIHRvIGJlIHNldCB3aGVuIGNyZWF0aW5nIGEgbmV3IG5vZGVcbiAgdGhpcy5fZGVmYXVsdE5vZGVMYWJlbEZuID0gXy5jb25zdGFudCh1bmRlZmluZWQpO1xuXG4gIC8vIERlZmF1bHRzIHRvIGJlIHNldCB3aGVuIGNyZWF0aW5nIGEgbmV3IGVkZ2VcbiAgdGhpcy5fZGVmYXVsdEVkZ2VMYWJlbEZuID0gXy5jb25zdGFudCh1bmRlZmluZWQpO1xuXG4gIC8vIHYgLT4gbGFiZWxcbiAgdGhpcy5fbm9kZXMgPSB7fTtcblxuICBpZiAodGhpcy5faXNDb21wb3VuZCkge1xuICAgIC8vIHYgLT4gcGFyZW50XG4gICAgdGhpcy5fcGFyZW50ID0ge307XG5cbiAgICAvLyB2IC0+IGNoaWxkcmVuXG4gICAgdGhpcy5fY2hpbGRyZW4gPSB7fTtcbiAgICB0aGlzLl9jaGlsZHJlbltHUkFQSF9OT0RFXSA9IHt9O1xuICB9XG5cbiAgLy8gdiAtPiBlZGdlT2JqXG4gIHRoaXMuX2luID0ge307XG5cbiAgLy8gdSAtPiB2IC0+IE51bWJlclxuICB0aGlzLl9wcmVkcyA9IHt9O1xuXG4gIC8vIHYgLT4gZWRnZU9ialxuICB0aGlzLl9vdXQgPSB7fTtcblxuICAvLyB2IC0+IHcgLT4gTnVtYmVyXG4gIHRoaXMuX3N1Y3MgPSB7fTtcblxuICAvLyBlIC0+IGVkZ2VPYmpcbiAgdGhpcy5fZWRnZU9ianMgPSB7fTtcblxuICAvLyBlIC0+IGxhYmVsXG4gIHRoaXMuX2VkZ2VMYWJlbHMgPSB7fTtcbn1cblxuLyogTnVtYmVyIG9mIG5vZGVzIGluIHRoZSBncmFwaC4gU2hvdWxkIG9ubHkgYmUgY2hhbmdlZCBieSB0aGUgaW1wbGVtZW50YXRpb24uICovXG5HcmFwaC5wcm90b3R5cGUuX25vZGVDb3VudCA9IDA7XG5cbi8qIE51bWJlciBvZiBlZGdlcyBpbiB0aGUgZ3JhcGguIFNob3VsZCBvbmx5IGJlIGNoYW5nZWQgYnkgdGhlIGltcGxlbWVudGF0aW9uLiAqL1xuR3JhcGgucHJvdG90eXBlLl9lZGdlQ291bnQgPSAwO1xuXG5cbi8qID09PSBHcmFwaCBmdW5jdGlvbnMgPT09PT09PT09ICovXG5cbkdyYXBoLnByb3RvdHlwZS5pc0RpcmVjdGVkID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLl9pc0RpcmVjdGVkO1xufTtcblxuR3JhcGgucHJvdG90eXBlLmlzTXVsdGlncmFwaCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5faXNNdWx0aWdyYXBoO1xufTtcblxuR3JhcGgucHJvdG90eXBlLmlzQ29tcG91bmQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuX2lzQ29tcG91bmQ7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuc2V0R3JhcGggPSBmdW5jdGlvbihsYWJlbCkge1xuICB0aGlzLl9sYWJlbCA9IGxhYmVsO1xuICByZXR1cm4gdGhpcztcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5ncmFwaCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5fbGFiZWw7XG59O1xuXG5cbi8qID09PSBOb2RlIGZ1bmN0aW9ucyA9PT09PT09PT09ICovXG5cbkdyYXBoLnByb3RvdHlwZS5zZXREZWZhdWx0Tm9kZUxhYmVsID0gZnVuY3Rpb24obmV3RGVmYXVsdCkge1xuICBpZiAoIV8uaXNGdW5jdGlvbihuZXdEZWZhdWx0KSkge1xuICAgIG5ld0RlZmF1bHQgPSBfLmNvbnN0YW50KG5ld0RlZmF1bHQpO1xuICB9XG4gIHRoaXMuX2RlZmF1bHROb2RlTGFiZWxGbiA9IG5ld0RlZmF1bHQ7XG4gIHJldHVybiB0aGlzO1xufTtcblxuR3JhcGgucHJvdG90eXBlLm5vZGVDb3VudCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5fbm9kZUNvdW50O1xufTtcblxuR3JhcGgucHJvdG90eXBlLm5vZGVzID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBfLmtleXModGhpcy5fbm9kZXMpO1xufTtcblxuR3JhcGgucHJvdG90eXBlLnNvdXJjZXMgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICByZXR1cm4gXy5maWx0ZXIodGhpcy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgcmV0dXJuIF8uaXNFbXB0eShzZWxmLl9pblt2XSk7XG4gIH0pO1xufTtcblxuR3JhcGgucHJvdG90eXBlLnNpbmtzID0gZnVuY3Rpb24oKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgcmV0dXJuIF8uZmlsdGVyKHRoaXMubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHJldHVybiBfLmlzRW1wdHkoc2VsZi5fb3V0W3ZdKTtcbiAgfSk7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuc2V0Tm9kZXMgPSBmdW5jdGlvbih2cywgdmFsdWUpIHtcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgXy5lYWNoKHZzLCBmdW5jdGlvbih2KSB7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID4gMSkge1xuICAgICAgc2VsZi5zZXROb2RlKHYsIHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZi5zZXROb2RlKHYpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuR3JhcGgucHJvdG90eXBlLnNldE5vZGUgPSBmdW5jdGlvbih2LCB2YWx1ZSkge1xuICBpZiAoXy5oYXModGhpcy5fbm9kZXMsIHYpKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICB0aGlzLl9ub2Rlc1t2XSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHRoaXMuX25vZGVzW3ZdID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyB2YWx1ZSA6IHRoaXMuX2RlZmF1bHROb2RlTGFiZWxGbih2KTtcbiAgaWYgKHRoaXMuX2lzQ29tcG91bmQpIHtcbiAgICB0aGlzLl9wYXJlbnRbdl0gPSBHUkFQSF9OT0RFO1xuICAgIHRoaXMuX2NoaWxkcmVuW3ZdID0ge307XG4gICAgdGhpcy5fY2hpbGRyZW5bR1JBUEhfTk9ERV1bdl0gPSB0cnVlO1xuICB9XG4gIHRoaXMuX2luW3ZdID0ge307XG4gIHRoaXMuX3ByZWRzW3ZdID0ge307XG4gIHRoaXMuX291dFt2XSA9IHt9O1xuICB0aGlzLl9zdWNzW3ZdID0ge307XG4gICsrdGhpcy5fbm9kZUNvdW50O1xuICByZXR1cm4gdGhpcztcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5ub2RlID0gZnVuY3Rpb24odikge1xuICByZXR1cm4gdGhpcy5fbm9kZXNbdl07XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuaGFzTm9kZSA9IGZ1bmN0aW9uKHYpIHtcbiAgcmV0dXJuIF8uaGFzKHRoaXMuX25vZGVzLCB2KTtcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5yZW1vdmVOb2RlID0gIGZ1bmN0aW9uKHYpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBpZiAoXy5oYXModGhpcy5fbm9kZXMsIHYpKSB7XG4gICAgdmFyIHJlbW92ZUVkZ2UgPSBmdW5jdGlvbihlKSB7IHNlbGYucmVtb3ZlRWRnZShzZWxmLl9lZGdlT2Jqc1tlXSk7IH07XG4gICAgZGVsZXRlIHRoaXMuX25vZGVzW3ZdO1xuICAgIGlmICh0aGlzLl9pc0NvbXBvdW5kKSB7XG4gICAgICB0aGlzLl9yZW1vdmVGcm9tUGFyZW50c0NoaWxkTGlzdCh2KTtcbiAgICAgIGRlbGV0ZSB0aGlzLl9wYXJlbnRbdl07XG4gICAgICBfLmVhY2godGhpcy5jaGlsZHJlbih2KSwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgICAgc2VsZi5zZXRQYXJlbnQoY2hpbGQpO1xuICAgICAgfSk7XG4gICAgICBkZWxldGUgdGhpcy5fY2hpbGRyZW5bdl07XG4gICAgfVxuICAgIF8uZWFjaChfLmtleXModGhpcy5faW5bdl0pLCByZW1vdmVFZGdlKTtcbiAgICBkZWxldGUgdGhpcy5faW5bdl07XG4gICAgZGVsZXRlIHRoaXMuX3ByZWRzW3ZdO1xuICAgIF8uZWFjaChfLmtleXModGhpcy5fb3V0W3ZdKSwgcmVtb3ZlRWRnZSk7XG4gICAgZGVsZXRlIHRoaXMuX291dFt2XTtcbiAgICBkZWxldGUgdGhpcy5fc3Vjc1t2XTtcbiAgICAtLXRoaXMuX25vZGVDb3VudDtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5zZXRQYXJlbnQgPSBmdW5jdGlvbih2LCBwYXJlbnQpIHtcbiAgaWYgKCF0aGlzLl9pc0NvbXBvdW5kKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHNldCBwYXJlbnQgaW4gYSBub24tY29tcG91bmQgZ3JhcGhcIik7XG4gIH1cblxuICBpZiAoXy5pc1VuZGVmaW5lZChwYXJlbnQpKSB7XG4gICAgcGFyZW50ID0gR1JBUEhfTk9ERTtcbiAgfSBlbHNlIHtcbiAgICAvLyBDb2VyY2UgcGFyZW50IHRvIHN0cmluZ1xuICAgIHBhcmVudCArPSBcIlwiO1xuICAgIGZvciAodmFyIGFuY2VzdG9yID0gcGFyZW50O1xuICAgICAgIV8uaXNVbmRlZmluZWQoYW5jZXN0b3IpO1xuICAgICAgYW5jZXN0b3IgPSB0aGlzLnBhcmVudChhbmNlc3RvcikpIHtcbiAgICAgIGlmIChhbmNlc3RvciA9PT0gdikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTZXR0aW5nIFwiICsgcGFyZW50KyBcIiBhcyBwYXJlbnQgb2YgXCIgKyB2ICtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiIHdvdWxkIGNyZWF0ZSBhIGN5Y2xlXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc2V0Tm9kZShwYXJlbnQpO1xuICB9XG5cbiAgdGhpcy5zZXROb2RlKHYpO1xuICB0aGlzLl9yZW1vdmVGcm9tUGFyZW50c0NoaWxkTGlzdCh2KTtcbiAgdGhpcy5fcGFyZW50W3ZdID0gcGFyZW50O1xuICB0aGlzLl9jaGlsZHJlbltwYXJlbnRdW3ZdID0gdHJ1ZTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuX3JlbW92ZUZyb21QYXJlbnRzQ2hpbGRMaXN0ID0gZnVuY3Rpb24odikge1xuICBkZWxldGUgdGhpcy5fY2hpbGRyZW5bdGhpcy5fcGFyZW50W3ZdXVt2XTtcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5wYXJlbnQgPSBmdW5jdGlvbih2KSB7XG4gIGlmICh0aGlzLl9pc0NvbXBvdW5kKSB7XG4gICAgdmFyIHBhcmVudCA9IHRoaXMuX3BhcmVudFt2XTtcbiAgICBpZiAocGFyZW50ICE9PSBHUkFQSF9OT0RFKSB7XG4gICAgICByZXR1cm4gcGFyZW50O1xuICAgIH1cbiAgfVxufTtcblxuR3JhcGgucHJvdG90eXBlLmNoaWxkcmVuID0gZnVuY3Rpb24odikge1xuICBpZiAoXy5pc1VuZGVmaW5lZCh2KSkge1xuICAgIHYgPSBHUkFQSF9OT0RFO1xuICB9XG5cbiAgaWYgKHRoaXMuX2lzQ29tcG91bmQpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLl9jaGlsZHJlblt2XTtcbiAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgIHJldHVybiBfLmtleXMoY2hpbGRyZW4pO1xuICAgIH1cbiAgfSBlbHNlIGlmICh2ID09PSBHUkFQSF9OT0RFKSB7XG4gICAgcmV0dXJuIHRoaXMubm9kZXMoKTtcbiAgfSBlbHNlIGlmICh0aGlzLmhhc05vZGUodikpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbn07XG5cbkdyYXBoLnByb3RvdHlwZS5wcmVkZWNlc3NvcnMgPSBmdW5jdGlvbih2KSB7XG4gIHZhciBwcmVkc1YgPSB0aGlzLl9wcmVkc1t2XTtcbiAgaWYgKHByZWRzVikge1xuICAgIHJldHVybiBfLmtleXMocHJlZHNWKTtcbiAgfVxufTtcblxuR3JhcGgucHJvdG90eXBlLnN1Y2Nlc3NvcnMgPSBmdW5jdGlvbih2KSB7XG4gIHZhciBzdWNzViA9IHRoaXMuX3N1Y3Nbdl07XG4gIGlmIChzdWNzVikge1xuICAgIHJldHVybiBfLmtleXMoc3Vjc1YpO1xuICB9XG59O1xuXG5HcmFwaC5wcm90b3R5cGUubmVpZ2hib3JzID0gZnVuY3Rpb24odikge1xuICB2YXIgcHJlZHMgPSB0aGlzLnByZWRlY2Vzc29ycyh2KTtcbiAgaWYgKHByZWRzKSB7XG4gICAgcmV0dXJuIF8udW5pb24ocHJlZHMsIHRoaXMuc3VjY2Vzc29ycyh2KSk7XG4gIH1cbn07XG5cbkdyYXBoLnByb3RvdHlwZS5pc0xlYWYgPSBmdW5jdGlvbiAodikge1xuICB2YXIgbmVpZ2hib3JzO1xuICBpZiAodGhpcy5pc0RpcmVjdGVkKCkpIHtcbiAgICBuZWlnaGJvcnMgPSB0aGlzLnN1Y2Nlc3NvcnModik7XG4gIH0gZWxzZSB7XG4gICAgbmVpZ2hib3JzID0gdGhpcy5uZWlnaGJvcnModik7XG4gIH1cbiAgcmV0dXJuIG5laWdoYm9ycy5sZW5ndGggPT09IDA7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuZmlsdGVyTm9kZXMgPSBmdW5jdGlvbihmaWx0ZXIpIHtcbiAgdmFyIGNvcHkgPSBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih7XG4gICAgZGlyZWN0ZWQ6IHRoaXMuX2lzRGlyZWN0ZWQsXG4gICAgbXVsdGlncmFwaDogdGhpcy5faXNNdWx0aWdyYXBoLFxuICAgIGNvbXBvdW5kOiB0aGlzLl9pc0NvbXBvdW5kXG4gIH0pO1xuXG4gIGNvcHkuc2V0R3JhcGgodGhpcy5ncmFwaCgpKTtcblxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIF8uZWFjaCh0aGlzLl9ub2RlcywgZnVuY3Rpb24odmFsdWUsIHYpIHtcbiAgICBpZiAoZmlsdGVyKHYpKSB7XG4gICAgICBjb3B5LnNldE5vZGUodiwgdmFsdWUpO1xuICAgIH1cbiAgfSk7XG5cbiAgXy5lYWNoKHRoaXMuX2VkZ2VPYmpzLCBmdW5jdGlvbihlKSB7XG4gICAgaWYgKGNvcHkuaGFzTm9kZShlLnYpICYmIGNvcHkuaGFzTm9kZShlLncpKSB7XG4gICAgICBjb3B5LnNldEVkZ2UoZSwgc2VsZi5lZGdlKGUpKTtcbiAgICB9XG4gIH0pO1xuXG4gIHZhciBwYXJlbnRzID0ge307XG4gIGZ1bmN0aW9uIGZpbmRQYXJlbnQodikge1xuICAgIHZhciBwYXJlbnQgPSBzZWxmLnBhcmVudCh2KTtcbiAgICBpZiAocGFyZW50ID09PSB1bmRlZmluZWQgfHwgY29weS5oYXNOb2RlKHBhcmVudCkpIHtcbiAgICAgIHBhcmVudHNbdl0gPSBwYXJlbnQ7XG4gICAgICByZXR1cm4gcGFyZW50O1xuICAgIH0gZWxzZSBpZiAocGFyZW50IGluIHBhcmVudHMpIHtcbiAgICAgIHJldHVybiBwYXJlbnRzW3BhcmVudF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmaW5kUGFyZW50KHBhcmVudCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHRoaXMuX2lzQ29tcG91bmQpIHtcbiAgICBfLmVhY2goY29weS5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgICBjb3B5LnNldFBhcmVudCh2LCBmaW5kUGFyZW50KHYpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBjb3B5O1xufTtcblxuLyogPT09IEVkZ2UgZnVuY3Rpb25zID09PT09PT09PT0gKi9cblxuR3JhcGgucHJvdG90eXBlLnNldERlZmF1bHRFZGdlTGFiZWwgPSBmdW5jdGlvbihuZXdEZWZhdWx0KSB7XG4gIGlmICghXy5pc0Z1bmN0aW9uKG5ld0RlZmF1bHQpKSB7XG4gICAgbmV3RGVmYXVsdCA9IF8uY29uc3RhbnQobmV3RGVmYXVsdCk7XG4gIH1cbiAgdGhpcy5fZGVmYXVsdEVkZ2VMYWJlbEZuID0gbmV3RGVmYXVsdDtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuZWRnZUNvdW50ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLl9lZGdlQ291bnQ7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuZWRnZXMgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIF8udmFsdWVzKHRoaXMuX2VkZ2VPYmpzKTtcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5zZXRQYXRoID0gZnVuY3Rpb24odnMsIHZhbHVlKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gIF8ucmVkdWNlKHZzLCBmdW5jdGlvbih2LCB3KSB7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID4gMSkge1xuICAgICAgc2VsZi5zZXRFZGdlKHYsIHcsIHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZi5zZXRFZGdlKHYsIHcpO1xuICAgIH1cbiAgICByZXR1cm4gdztcbiAgfSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLypcbiAqIHNldEVkZ2UodiwgdywgW3ZhbHVlLCBbbmFtZV1dKVxuICogc2V0RWRnZSh7IHYsIHcsIFtuYW1lXSB9LCBbdmFsdWVdKVxuICovXG5HcmFwaC5wcm90b3R5cGUuc2V0RWRnZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgdiwgdywgbmFtZSwgdmFsdWU7XG4gIHZhciB2YWx1ZVNwZWNpZmllZCA9IGZhbHNlO1xuICB2YXIgYXJnMCA9IGFyZ3VtZW50c1swXTtcblxuICBpZiAodHlwZW9mIGFyZzAgPT09IFwib2JqZWN0XCIgJiYgYXJnMCAhPT0gbnVsbCAmJiBcInZcIiBpbiBhcmcwKSB7XG4gICAgdiA9IGFyZzAudjtcbiAgICB3ID0gYXJnMC53O1xuICAgIG5hbWUgPSBhcmcwLm5hbWU7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgIHZhbHVlID0gYXJndW1lbnRzWzFdO1xuICAgICAgdmFsdWVTcGVjaWZpZWQgPSB0cnVlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2ID0gYXJnMDtcbiAgICB3ID0gYXJndW1lbnRzWzFdO1xuICAgIG5hbWUgPSBhcmd1bWVudHNbM107XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7XG4gICAgICB2YWx1ZSA9IGFyZ3VtZW50c1syXTtcbiAgICAgIHZhbHVlU3BlY2lmaWVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICB2ID0gXCJcIiArIHY7XG4gIHcgPSBcIlwiICsgdztcbiAgaWYgKCFfLmlzVW5kZWZpbmVkKG5hbWUpKSB7XG4gICAgbmFtZSA9IFwiXCIgKyBuYW1lO1xuICB9XG5cbiAgdmFyIGUgPSBlZGdlQXJnc1RvSWQodGhpcy5faXNEaXJlY3RlZCwgdiwgdywgbmFtZSk7XG4gIGlmIChfLmhhcyh0aGlzLl9lZGdlTGFiZWxzLCBlKSkge1xuICAgIGlmICh2YWx1ZVNwZWNpZmllZCkge1xuICAgICAgdGhpcy5fZWRnZUxhYmVsc1tlXSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGlmICghXy5pc1VuZGVmaW5lZChuYW1lKSAmJiAhdGhpcy5faXNNdWx0aWdyYXBoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHNldCBhIG5hbWVkIGVkZ2Ugd2hlbiBpc011bHRpZ3JhcGggPSBmYWxzZVwiKTtcbiAgfVxuXG4gIC8vIEl0IGRpZG4ndCBleGlzdCwgc28gd2UgbmVlZCB0byBjcmVhdGUgaXQuXG4gIC8vIEZpcnN0IGVuc3VyZSB0aGUgbm9kZXMgZXhpc3QuXG4gIHRoaXMuc2V0Tm9kZSh2KTtcbiAgdGhpcy5zZXROb2RlKHcpO1xuXG4gIHRoaXMuX2VkZ2VMYWJlbHNbZV0gPSB2YWx1ZVNwZWNpZmllZCA/IHZhbHVlIDogdGhpcy5fZGVmYXVsdEVkZ2VMYWJlbEZuKHYsIHcsIG5hbWUpO1xuXG4gIHZhciBlZGdlT2JqID0gZWRnZUFyZ3NUb09iaih0aGlzLl9pc0RpcmVjdGVkLCB2LCB3LCBuYW1lKTtcbiAgLy8gRW5zdXJlIHdlIGFkZCB1bmRpcmVjdGVkIGVkZ2VzIGluIGEgY29uc2lzdGVudCB3YXkuXG4gIHYgPSBlZGdlT2JqLnY7XG4gIHcgPSBlZGdlT2JqLnc7XG5cbiAgT2JqZWN0LmZyZWV6ZShlZGdlT2JqKTtcbiAgdGhpcy5fZWRnZU9ianNbZV0gPSBlZGdlT2JqO1xuICBpbmNyZW1lbnRPckluaXRFbnRyeSh0aGlzLl9wcmVkc1t3XSwgdik7XG4gIGluY3JlbWVudE9ySW5pdEVudHJ5KHRoaXMuX3N1Y3Nbdl0sIHcpO1xuICB0aGlzLl9pblt3XVtlXSA9IGVkZ2VPYmo7XG4gIHRoaXMuX291dFt2XVtlXSA9IGVkZ2VPYmo7XG4gIHRoaXMuX2VkZ2VDb3VudCsrO1xuICByZXR1cm4gdGhpcztcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5lZGdlID0gZnVuY3Rpb24odiwgdywgbmFtZSkge1xuICB2YXIgZSA9IChhcmd1bWVudHMubGVuZ3RoID09PSAxXG4gICAgPyBlZGdlT2JqVG9JZCh0aGlzLl9pc0RpcmVjdGVkLCBhcmd1bWVudHNbMF0pXG4gICAgOiBlZGdlQXJnc1RvSWQodGhpcy5faXNEaXJlY3RlZCwgdiwgdywgbmFtZSkpO1xuICByZXR1cm4gdGhpcy5fZWRnZUxhYmVsc1tlXTtcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5oYXNFZGdlID0gZnVuY3Rpb24odiwgdywgbmFtZSkge1xuICB2YXIgZSA9IChhcmd1bWVudHMubGVuZ3RoID09PSAxXG4gICAgPyBlZGdlT2JqVG9JZCh0aGlzLl9pc0RpcmVjdGVkLCBhcmd1bWVudHNbMF0pXG4gICAgOiBlZGdlQXJnc1RvSWQodGhpcy5faXNEaXJlY3RlZCwgdiwgdywgbmFtZSkpO1xuICByZXR1cm4gXy5oYXModGhpcy5fZWRnZUxhYmVscywgZSk7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUucmVtb3ZlRWRnZSA9IGZ1bmN0aW9uKHYsIHcsIG5hbWUpIHtcbiAgdmFyIGUgPSAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMVxuICAgID8gZWRnZU9ialRvSWQodGhpcy5faXNEaXJlY3RlZCwgYXJndW1lbnRzWzBdKVxuICAgIDogZWRnZUFyZ3NUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsIHYsIHcsIG5hbWUpKTtcbiAgdmFyIGVkZ2UgPSB0aGlzLl9lZGdlT2Jqc1tlXTtcbiAgaWYgKGVkZ2UpIHtcbiAgICB2ID0gZWRnZS52O1xuICAgIHcgPSBlZGdlLnc7XG4gICAgZGVsZXRlIHRoaXMuX2VkZ2VMYWJlbHNbZV07XG4gICAgZGVsZXRlIHRoaXMuX2VkZ2VPYmpzW2VdO1xuICAgIGRlY3JlbWVudE9yUmVtb3ZlRW50cnkodGhpcy5fcHJlZHNbd10sIHYpO1xuICAgIGRlY3JlbWVudE9yUmVtb3ZlRW50cnkodGhpcy5fc3Vjc1t2XSwgdyk7XG4gICAgZGVsZXRlIHRoaXMuX2luW3ddW2VdO1xuICAgIGRlbGV0ZSB0aGlzLl9vdXRbdl1bZV07XG4gICAgdGhpcy5fZWRnZUNvdW50LS07XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuaW5FZGdlcyA9IGZ1bmN0aW9uKHYsIHUpIHtcbiAgdmFyIGluViA9IHRoaXMuX2luW3ZdO1xuICBpZiAoaW5WKSB7XG4gICAgdmFyIGVkZ2VzID0gXy52YWx1ZXMoaW5WKTtcbiAgICBpZiAoIXUpIHtcbiAgICAgIHJldHVybiBlZGdlcztcbiAgICB9XG4gICAgcmV0dXJuIF8uZmlsdGVyKGVkZ2VzLCBmdW5jdGlvbihlZGdlKSB7IHJldHVybiBlZGdlLnYgPT09IHU7IH0pO1xuICB9XG59O1xuXG5HcmFwaC5wcm90b3R5cGUub3V0RWRnZXMgPSBmdW5jdGlvbih2LCB3KSB7XG4gIHZhciBvdXRWID0gdGhpcy5fb3V0W3ZdO1xuICBpZiAob3V0Vikge1xuICAgIHZhciBlZGdlcyA9IF8udmFsdWVzKG91dFYpO1xuICAgIGlmICghdykge1xuICAgICAgcmV0dXJuIGVkZ2VzO1xuICAgIH1cbiAgICByZXR1cm4gXy5maWx0ZXIoZWRnZXMsIGZ1bmN0aW9uKGVkZ2UpIHsgcmV0dXJuIGVkZ2UudyA9PT0gdzsgfSk7XG4gIH1cbn07XG5cbkdyYXBoLnByb3RvdHlwZS5ub2RlRWRnZXMgPSBmdW5jdGlvbih2LCB3KSB7XG4gIHZhciBpbkVkZ2VzID0gdGhpcy5pbkVkZ2VzKHYsIHcpO1xuICBpZiAoaW5FZGdlcykge1xuICAgIHJldHVybiBpbkVkZ2VzLmNvbmNhdCh0aGlzLm91dEVkZ2VzKHYsIHcpKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gaW5jcmVtZW50T3JJbml0RW50cnkobWFwLCBrKSB7XG4gIGlmIChtYXBba10pIHtcbiAgICBtYXBba10rKztcbiAgfSBlbHNlIHtcbiAgICBtYXBba10gPSAxO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRlY3JlbWVudE9yUmVtb3ZlRW50cnkobWFwLCBrKSB7XG4gIGlmICghLS1tYXBba10pIHsgZGVsZXRlIG1hcFtrXTsgfVxufVxuXG5mdW5jdGlvbiBlZGdlQXJnc1RvSWQoaXNEaXJlY3RlZCwgdl8sIHdfLCBuYW1lKSB7XG4gIHZhciB2ID0gXCJcIiArIHZfO1xuICB2YXIgdyA9IFwiXCIgKyB3XztcbiAgaWYgKCFpc0RpcmVjdGVkICYmIHYgPiB3KSB7XG4gICAgdmFyIHRtcCA9IHY7XG4gICAgdiA9IHc7XG4gICAgdyA9IHRtcDtcbiAgfVxuICByZXR1cm4gdiArIEVER0VfS0VZX0RFTElNICsgdyArIEVER0VfS0VZX0RFTElNICtcbiAgICAgICAgICAgICAoXy5pc1VuZGVmaW5lZChuYW1lKSA/IERFRkFVTFRfRURHRV9OQU1FIDogbmFtZSk7XG59XG5cbmZ1bmN0aW9uIGVkZ2VBcmdzVG9PYmooaXNEaXJlY3RlZCwgdl8sIHdfLCBuYW1lKSB7XG4gIHZhciB2ID0gXCJcIiArIHZfO1xuICB2YXIgdyA9IFwiXCIgKyB3XztcbiAgaWYgKCFpc0RpcmVjdGVkICYmIHYgPiB3KSB7XG4gICAgdmFyIHRtcCA9IHY7XG4gICAgdiA9IHc7XG4gICAgdyA9IHRtcDtcbiAgfVxuICB2YXIgZWRnZU9iaiA9ICB7IHY6IHYsIHc6IHcgfTtcbiAgaWYgKG5hbWUpIHtcbiAgICBlZGdlT2JqLm5hbWUgPSBuYW1lO1xuICB9XG4gIHJldHVybiBlZGdlT2JqO1xufVxuXG5mdW5jdGlvbiBlZGdlT2JqVG9JZChpc0RpcmVjdGVkLCBlZGdlT2JqKSB7XG4gIHJldHVybiBlZGdlQXJnc1RvSWQoaXNEaXJlY3RlZCwgZWRnZU9iai52LCBlZGdlT2JqLncsIGVkZ2VPYmoubmFtZSk7XG59XG4iLCIvLyBJbmNsdWRlcyBvbmx5IHRoZSBcImNvcmVcIiBvZiBncmFwaGxpYlxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEdyYXBoOiByZXF1aXJlKFwiLi9ncmFwaFwiKSxcbiAgdmVyc2lvbjogcmVxdWlyZShcIi4vdmVyc2lvblwiKVxufTtcbiIsInZhciBfID0gcmVxdWlyZShcIi4vbG9kYXNoXCIpO1xudmFyIEdyYXBoID0gcmVxdWlyZShcIi4vZ3JhcGhcIik7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICB3cml0ZTogd3JpdGUsXG4gIHJlYWQ6IHJlYWRcbn07XG5cbmZ1bmN0aW9uIHdyaXRlKGcpIHtcbiAgdmFyIGpzb24gPSB7XG4gICAgb3B0aW9uczoge1xuICAgICAgZGlyZWN0ZWQ6IGcuaXNEaXJlY3RlZCgpLFxuICAgICAgbXVsdGlncmFwaDogZy5pc011bHRpZ3JhcGgoKSxcbiAgICAgIGNvbXBvdW5kOiBnLmlzQ29tcG91bmQoKVxuICAgIH0sXG4gICAgbm9kZXM6IHdyaXRlTm9kZXMoZyksXG4gICAgZWRnZXM6IHdyaXRlRWRnZXMoZylcbiAgfTtcbiAgaWYgKCFfLmlzVW5kZWZpbmVkKGcuZ3JhcGgoKSkpIHtcbiAgICBqc29uLnZhbHVlID0gXy5jbG9uZShnLmdyYXBoKCkpO1xuICB9XG4gIHJldHVybiBqc29uO1xufVxuXG5mdW5jdGlvbiB3cml0ZU5vZGVzKGcpIHtcbiAgcmV0dXJuIF8ubWFwKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHZhciBub2RlVmFsdWUgPSBnLm5vZGUodik7XG4gICAgdmFyIHBhcmVudCA9IGcucGFyZW50KHYpO1xuICAgIHZhciBub2RlID0geyB2OiB2IH07XG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKG5vZGVWYWx1ZSkpIHtcbiAgICAgIG5vZGUudmFsdWUgPSBub2RlVmFsdWU7XG4gICAgfVxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJlbnQpKSB7XG4gICAgICBub2RlLnBhcmVudCA9IHBhcmVudDtcbiAgICB9XG4gICAgcmV0dXJuIG5vZGU7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiB3cml0ZUVkZ2VzKGcpIHtcbiAgcmV0dXJuIF8ubWFwKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBlZGdlVmFsdWUgPSBnLmVkZ2UoZSk7XG4gICAgdmFyIGVkZ2UgPSB7IHY6IGUudiwgdzogZS53IH07XG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGUubmFtZSkpIHtcbiAgICAgIGVkZ2UubmFtZSA9IGUubmFtZTtcbiAgICB9XG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGVkZ2VWYWx1ZSkpIHtcbiAgICAgIGVkZ2UudmFsdWUgPSBlZGdlVmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBlZGdlO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVhZChqc29uKSB7XG4gIHZhciBnID0gbmV3IEdyYXBoKGpzb24ub3B0aW9ucykuc2V0R3JhcGgoanNvbi52YWx1ZSk7XG4gIF8uZWFjaChqc29uLm5vZGVzLCBmdW5jdGlvbihlbnRyeSkge1xuICAgIGcuc2V0Tm9kZShlbnRyeS52LCBlbnRyeS52YWx1ZSk7XG4gICAgaWYgKGVudHJ5LnBhcmVudCkge1xuICAgICAgZy5zZXRQYXJlbnQoZW50cnkudiwgZW50cnkucGFyZW50KTtcbiAgICB9XG4gIH0pO1xuICBfLmVhY2goanNvbi5lZGdlcywgZnVuY3Rpb24oZW50cnkpIHtcbiAgICBnLnNldEVkZ2UoeyB2OiBlbnRyeS52LCB3OiBlbnRyeS53LCBuYW1lOiBlbnRyeS5uYW1lIH0sIGVudHJ5LnZhbHVlKTtcbiAgfSk7XG4gIHJldHVybiBnO1xufVxuIiwiLyogZ2xvYmFsIHdpbmRvdyAqL1xuXG52YXIgbG9kYXNoO1xuXG5pZiAodHlwZW9mIHJlcXVpcmUgPT09IFwiZnVuY3Rpb25cIikge1xuICB0cnkge1xuICAgIGxvZGFzaCA9IHtcbiAgICAgIGNsb25lOiByZXF1aXJlKFwibG9kYXNoL2Nsb25lXCIpLFxuICAgICAgY29uc3RhbnQ6IHJlcXVpcmUoXCJsb2Rhc2gvY29uc3RhbnRcIiksXG4gICAgICBlYWNoOiByZXF1aXJlKFwibG9kYXNoL2VhY2hcIiksXG4gICAgICBmaWx0ZXI6IHJlcXVpcmUoXCJsb2Rhc2gvZmlsdGVyXCIpLFxuICAgICAgaGFzOiAgcmVxdWlyZShcImxvZGFzaC9oYXNcIiksXG4gICAgICBpc0FycmF5OiByZXF1aXJlKFwibG9kYXNoL2lzQXJyYXlcIiksXG4gICAgICBpc0VtcHR5OiByZXF1aXJlKFwibG9kYXNoL2lzRW1wdHlcIiksXG4gICAgICBpc0Z1bmN0aW9uOiByZXF1aXJlKFwibG9kYXNoL2lzRnVuY3Rpb25cIiksXG4gICAgICBpc1VuZGVmaW5lZDogcmVxdWlyZShcImxvZGFzaC9pc1VuZGVmaW5lZFwiKSxcbiAgICAgIGtleXM6IHJlcXVpcmUoXCJsb2Rhc2gva2V5c1wiKSxcbiAgICAgIG1hcDogcmVxdWlyZShcImxvZGFzaC9tYXBcIiksXG4gICAgICByZWR1Y2U6IHJlcXVpcmUoXCJsb2Rhc2gvcmVkdWNlXCIpLFxuICAgICAgc2l6ZTogcmVxdWlyZShcImxvZGFzaC9zaXplXCIpLFxuICAgICAgdHJhbnNmb3JtOiByZXF1aXJlKFwibG9kYXNoL3RyYW5zZm9ybVwiKSxcbiAgICAgIHVuaW9uOiByZXF1aXJlKFwibG9kYXNoL3VuaW9uXCIpLFxuICAgICAgdmFsdWVzOiByZXF1aXJlKFwibG9kYXNoL3ZhbHVlc1wiKVxuICAgIH07XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBjb250aW51ZSByZWdhcmRsZXNzIG9mIGVycm9yXG4gIH1cbn1cblxuaWYgKCFsb2Rhc2gpIHtcbiAgbG9kYXNoID0gd2luZG93Ll87XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbG9kYXNoO1xuIiwibW9kdWxlLmV4cG9ydHMgPSAnMi4xLjgnO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcmVhY3RJcyA9IHJlcXVpcmUoJ3JlYWN0LWlzJyk7XG5cbi8qKlxuICogQ29weXJpZ2h0IDIwMTUsIFlhaG9vISBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbnZhciBSRUFDVF9TVEFUSUNTID0ge1xuICBjaGlsZENvbnRleHRUeXBlczogdHJ1ZSxcbiAgY29udGV4dFR5cGU6IHRydWUsXG4gIGNvbnRleHRUeXBlczogdHJ1ZSxcbiAgZGVmYXVsdFByb3BzOiB0cnVlLFxuICBkaXNwbGF5TmFtZTogdHJ1ZSxcbiAgZ2V0RGVmYXVsdFByb3BzOiB0cnVlLFxuICBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3I6IHRydWUsXG4gIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wczogdHJ1ZSxcbiAgbWl4aW5zOiB0cnVlLFxuICBwcm9wVHlwZXM6IHRydWUsXG4gIHR5cGU6IHRydWVcbn07XG52YXIgS05PV05fU1RBVElDUyA9IHtcbiAgbmFtZTogdHJ1ZSxcbiAgbGVuZ3RoOiB0cnVlLFxuICBwcm90b3R5cGU6IHRydWUsXG4gIGNhbGxlcjogdHJ1ZSxcbiAgY2FsbGVlOiB0cnVlLFxuICBhcmd1bWVudHM6IHRydWUsXG4gIGFyaXR5OiB0cnVlXG59O1xudmFyIEZPUldBUkRfUkVGX1NUQVRJQ1MgPSB7XG4gICckJHR5cGVvZic6IHRydWUsXG4gIHJlbmRlcjogdHJ1ZSxcbiAgZGVmYXVsdFByb3BzOiB0cnVlLFxuICBkaXNwbGF5TmFtZTogdHJ1ZSxcbiAgcHJvcFR5cGVzOiB0cnVlXG59O1xudmFyIE1FTU9fU1RBVElDUyA9IHtcbiAgJyQkdHlwZW9mJzogdHJ1ZSxcbiAgY29tcGFyZTogdHJ1ZSxcbiAgZGVmYXVsdFByb3BzOiB0cnVlLFxuICBkaXNwbGF5TmFtZTogdHJ1ZSxcbiAgcHJvcFR5cGVzOiB0cnVlLFxuICB0eXBlOiB0cnVlXG59O1xudmFyIFRZUEVfU1RBVElDUyA9IHt9O1xuVFlQRV9TVEFUSUNTW3JlYWN0SXMuRm9yd2FyZFJlZl0gPSBGT1JXQVJEX1JFRl9TVEFUSUNTO1xuVFlQRV9TVEFUSUNTW3JlYWN0SXMuTWVtb10gPSBNRU1PX1NUQVRJQ1M7XG5cbmZ1bmN0aW9uIGdldFN0YXRpY3MoY29tcG9uZW50KSB7XG4gIC8vIFJlYWN0IHYxNi4xMSBhbmQgYmVsb3dcbiAgaWYgKHJlYWN0SXMuaXNNZW1vKGNvbXBvbmVudCkpIHtcbiAgICByZXR1cm4gTUVNT19TVEFUSUNTO1xuICB9IC8vIFJlYWN0IHYxNi4xMiBhbmQgYWJvdmVcblxuXG4gIHJldHVybiBUWVBFX1NUQVRJQ1NbY29tcG9uZW50WyckJHR5cGVvZiddXSB8fCBSRUFDVF9TVEFUSUNTO1xufVxuXG52YXIgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgZ2V0T3duUHJvcGVydHlOYW1lcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzO1xudmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbnZhciBnZXRQcm90b3R5cGVPZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcbnZhciBvYmplY3RQcm90b3R5cGUgPSBPYmplY3QucHJvdG90eXBlO1xuZnVuY3Rpb24gaG9pc3ROb25SZWFjdFN0YXRpY3ModGFyZ2V0Q29tcG9uZW50LCBzb3VyY2VDb21wb25lbnQsIGJsYWNrbGlzdCkge1xuICBpZiAodHlwZW9mIHNvdXJjZUNvbXBvbmVudCAhPT0gJ3N0cmluZycpIHtcbiAgICAvLyBkb24ndCBob2lzdCBvdmVyIHN0cmluZyAoaHRtbCkgY29tcG9uZW50c1xuICAgIGlmIChvYmplY3RQcm90b3R5cGUpIHtcbiAgICAgIHZhciBpbmhlcml0ZWRDb21wb25lbnQgPSBnZXRQcm90b3R5cGVPZihzb3VyY2VDb21wb25lbnQpO1xuXG4gICAgICBpZiAoaW5oZXJpdGVkQ29tcG9uZW50ICYmIGluaGVyaXRlZENvbXBvbmVudCAhPT0gb2JqZWN0UHJvdG90eXBlKSB7XG4gICAgICAgIGhvaXN0Tm9uUmVhY3RTdGF0aWNzKHRhcmdldENvbXBvbmVudCwgaW5oZXJpdGVkQ29tcG9uZW50LCBibGFja2xpc3QpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBrZXlzID0gZ2V0T3duUHJvcGVydHlOYW1lcyhzb3VyY2VDb21wb25lbnQpO1xuXG4gICAgaWYgKGdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAga2V5cyA9IGtleXMuY29uY2F0KGdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2VDb21wb25lbnQpKTtcbiAgICB9XG5cbiAgICB2YXIgdGFyZ2V0U3RhdGljcyA9IGdldFN0YXRpY3ModGFyZ2V0Q29tcG9uZW50KTtcbiAgICB2YXIgc291cmNlU3RhdGljcyA9IGdldFN0YXRpY3Moc291cmNlQ29tcG9uZW50KTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIGtleSA9IGtleXNbaV07XG5cbiAgICAgIGlmICghS05PV05fU1RBVElDU1trZXldICYmICEoYmxhY2tsaXN0ICYmIGJsYWNrbGlzdFtrZXldKSAmJiAhKHNvdXJjZVN0YXRpY3MgJiYgc291cmNlU3RhdGljc1trZXldKSAmJiAhKHRhcmdldFN0YXRpY3MgJiYgdGFyZ2V0U3RhdGljc1trZXldKSkge1xuICAgICAgICB2YXIgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2VDb21wb25lbnQsIGtleSk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBBdm9pZCBmYWlsdXJlcyBmcm9tIHJlYWQtb25seSBwcm9wZXJ0aWVzXG4gICAgICAgICAgZGVmaW5lUHJvcGVydHkodGFyZ2V0Q29tcG9uZW50LCBrZXksIGRlc2NyaXB0b3IpO1xuICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXRDb21wb25lbnQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaG9pc3ROb25SZWFjdFN0YXRpY3M7XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBVc2UgaW52YXJpYW50KCkgdG8gYXNzZXJ0IHN0YXRlIHdoaWNoIHlvdXIgcHJvZ3JhbSBhc3N1bWVzIHRvIGJlIHRydWUuXG4gKlxuICogUHJvdmlkZSBzcHJpbnRmLXN0eWxlIGZvcm1hdCAob25seSAlcyBpcyBzdXBwb3J0ZWQpIGFuZCBhcmd1bWVudHNcbiAqIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCBicm9rZSBhbmQgd2hhdCB5b3Ugd2VyZVxuICogZXhwZWN0aW5nLlxuICpcbiAqIFRoZSBpbnZhcmlhbnQgbWVzc2FnZSB3aWxsIGJlIHN0cmlwcGVkIGluIHByb2R1Y3Rpb24sIGJ1dCB0aGUgaW52YXJpYW50XG4gKiB3aWxsIHJlbWFpbiB0byBlbnN1cmUgbG9naWMgZG9lcyBub3QgZGlmZmVyIGluIHByb2R1Y3Rpb24uXG4gKi9cblxudmFyIGludmFyaWFudCA9IGZ1bmN0aW9uKGNvbmRpdGlvbiwgZm9ybWF0LCBhLCBiLCBjLCBkLCBlLCBmKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFyaWFudCByZXF1aXJlcyBhbiBlcnJvciBtZXNzYWdlIGFyZ3VtZW50Jyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFjb25kaXRpb24pIHtcbiAgICB2YXIgZXJyb3I7XG4gICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBlcnJvciA9IG5ldyBFcnJvcihcbiAgICAgICAgJ01pbmlmaWVkIGV4Y2VwdGlvbiBvY2N1cnJlZDsgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50ICcgK1xuICAgICAgICAnZm9yIHRoZSBmdWxsIGVycm9yIG1lc3NhZ2UgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy4nXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgYXJncyA9IFthLCBiLCBjLCBkLCBlLCBmXTtcbiAgICAgIHZhciBhcmdJbmRleCA9IDA7XG4gICAgICBlcnJvciA9IG5ldyBFcnJvcihcbiAgICAgICAgZm9ybWF0LnJlcGxhY2UoLyVzL2csIGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJnc1thcmdJbmRleCsrXTsgfSlcbiAgICAgICk7XG4gICAgICBlcnJvci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgIH1cblxuICAgIGVycm9yLmZyYW1lc1RvUG9wID0gMTsgLy8gd2UgZG9uJ3QgY2FyZSBhYm91dCBpbnZhcmlhbnQncyBvd24gZnJhbWVcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBpbnZhcmlhbnQ7XG4iLCIndXNlIHN0cmljdCc7XHJcblxyXG4vKipcclxuICogSXMgdGhpcyBzdHJpbmcgYWxsIHdoaXRlc3BhY2U/XHJcbiAqIFRoaXMgc29sdXRpb24ga2luZCBvZiBtYWtlcyBteSBicmFpbiBodXJ0LCBidXQgaXQncyBzaWduaWZpY2FudGx5IGZhc3RlclxyXG4gKiB0aGFuICFzdHIudHJpbSgpIG9yIGFueSBvdGhlciBzb2x1dGlvbiBJIGNvdWxkIGZpbmQuXHJcbiAqXHJcbiAqIHdoaXRlc3BhY2UgY29kZXMgZnJvbTogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9XaGl0ZXNwYWNlX2NoYXJhY3RlclxyXG4gKiBhbmQgdmVyaWZpZWQgd2l0aDpcclxuICpcclxuICogIGZvcih2YXIgaSA9IDA7IGkgPCA2NTUzNjsgaSsrKSB7XHJcbiAqICAgICAgdmFyIHMgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpO1xyXG4gKiAgICAgIGlmKCtzPT09MCAmJiAhcy50cmltKCkpIGNvbnNvbGUubG9nKGksIHMpO1xyXG4gKiAgfVxyXG4gKlxyXG4gKiB3aGljaCBjb3VudHMgYSBjb3VwbGUgb2YgdGhlc2UgYXMgKm5vdCogd2hpdGVzcGFjZSwgYnV0IGZpbmRzIG5vdGhpbmcgZWxzZVxyXG4gKiB0aGF0ICppcyogd2hpdGVzcGFjZS4gTm90ZSB0aGF0IGNoYXJDb2RlQXQgc3RvcHMgYXQgMTYgYml0cywgYnV0IGl0IGFwcGVhcnNcclxuICogdGhhdCB0aGVyZSBhcmUgbm8gd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGFib3ZlIHRoaXMsIGFuZCBjb2RlIHBvaW50cyBhYm92ZVxyXG4gKiB0aGlzIGRvIG5vdCBtYXAgb250byB3aGl0ZSBzcGFjZSBjaGFyYWN0ZXJzLlxyXG4gKi9cclxuXHJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oc3RyKXtcclxuICAgIHZhciBsID0gc3RyLmxlbmd0aCxcclxuICAgICAgICBhO1xyXG4gICAgZm9yKHZhciBpID0gMDsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgIGEgPSBzdHIuY2hhckNvZGVBdChpKTtcclxuICAgICAgICBpZigoYSA8IDkgfHwgYSA+IDEzKSAmJiAoYSAhPT0gMzIpICYmIChhICE9PSAxMzMpICYmIChhICE9PSAxNjApICYmXHJcbiAgICAgICAgICAgIChhICE9PSA1NzYwKSAmJiAoYSAhPT0gNjE1OCkgJiYgKGEgPCA4MTkyIHx8IGEgPiA4MjA1KSAmJlxyXG4gICAgICAgICAgICAoYSAhPT0gODIzMikgJiYgKGEgIT09IDgyMzMpICYmIChhICE9PSA4MjM5KSAmJiAoYSAhPT0gODI4NykgJiZcclxuICAgICAgICAgICAgKGEgIT09IDgyODgpICYmIChhICE9PSAxMjI4OCkgJiYgKGEgIT09IDY1Mjc5KSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG59XHJcbiIsIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcImxheW91dEJhc2VcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wibGF5b3V0QmFzZVwiXSA9IGZhY3RvcnkoKTtcbn0pKHRoaXMsIGZ1bmN0aW9uKCkge1xucmV0dXJuIC8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0aTogbW9kdWxlSWQsXG4vKioqKioqLyBcdFx0XHRsOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubCA9IHRydWU7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBpZGVudGl0eSBmdW5jdGlvbiBmb3IgY2FsbGluZyBoYXJtb255IGltcG9ydHMgd2l0aCB0aGUgY29ycmVjdCBjb250ZXh0XG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uaSA9IGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbi8qKioqKiovIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4vKioqKioqLyBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuLyoqKioqKi8gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuLyoqKioqKi8gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuLyoqKioqKi8gXHRcdFx0XHRnZXQ6IGdldHRlclxuLyoqKioqKi8gXHRcdFx0fSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4vKioqKioqLyBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbi8qKioqKiovIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4vKioqKioqLyBcdFx0cmV0dXJuIGdldHRlcjtcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDI4KTtcbi8qKioqKiovIH0pXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gKFtcbi8qIDAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuZnVuY3Rpb24gTGF5b3V0Q29uc3RhbnRzKCkge31cblxuLyoqXHJcbiAqIExheW91dCBRdWFsaXR5OiAwOmRyYWZ0LCAxOmRlZmF1bHQsIDI6cHJvb2ZcclxuICovXG5MYXlvdXRDb25zdGFudHMuUVVBTElUWSA9IDE7XG5cbi8qKlxyXG4gKiBEZWZhdWx0IHBhcmFtZXRlcnNcclxuICovXG5MYXlvdXRDb25zdGFudHMuREVGQVVMVF9DUkVBVEVfQkVORFNfQVNfTkVFREVEID0gZmFsc2U7XG5MYXlvdXRDb25zdGFudHMuREVGQVVMVF9JTkNSRU1FTlRBTCA9IGZhbHNlO1xuTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQU5JTUFUSU9OX09OX0xBWU9VVCA9IHRydWU7XG5MYXlvdXRDb25zdGFudHMuREVGQVVMVF9BTklNQVRJT05fRFVSSU5HX0xBWU9VVCA9IGZhbHNlO1xuTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQU5JTUFUSU9OX1BFUklPRCA9IDUwO1xuTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfVU5JRk9STV9MRUFGX05PREVfU0laRVMgPSBmYWxzZTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNlY3Rpb246IEdlbmVyYWwgb3RoZXIgY29uc3RhbnRzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLypcclxuICogTWFyZ2lucyBvZiBhIGdyYXBoIHRvIGJlIGFwcGxpZWQgb24gYm91ZGluZyByZWN0YW5nbGUgb2YgaXRzIGNvbnRlbnRzLiBXZVxyXG4gKiBhc3N1bWUgbWFyZ2lucyBvbiBhbGwgZm91ciBzaWRlcyB0byBiZSB1bmlmb3JtLlxyXG4gKi9cbkxheW91dENvbnN0YW50cy5ERUZBVUxUX0dSQVBIX01BUkdJTiA9IDE1O1xuXG4vKlxyXG4gKiBXaGV0aGVyIHRvIGNvbnNpZGVyIGxhYmVscyBpbiBub2RlIGRpbWVuc2lvbnMgb3Igbm90XHJcbiAqL1xuTGF5b3V0Q29uc3RhbnRzLk5PREVfRElNRU5TSU9OU19JTkNMVURFX0xBQkVMUyA9IGZhbHNlO1xuXG4vKlxyXG4gKiBEZWZhdWx0IGRpbWVuc2lvbiBvZiBhIG5vbi1jb21wb3VuZCBub2RlLlxyXG4gKi9cbkxheW91dENvbnN0YW50cy5TSU1QTEVfTk9ERV9TSVpFID0gNDA7XG5cbi8qXHJcbiAqIERlZmF1bHQgZGltZW5zaW9uIG9mIGEgbm9uLWNvbXBvdW5kIG5vZGUuXHJcbiAqL1xuTGF5b3V0Q29uc3RhbnRzLlNJTVBMRV9OT0RFX0hBTEZfU0laRSA9IExheW91dENvbnN0YW50cy5TSU1QTEVfTk9ERV9TSVpFIC8gMjtcblxuLypcclxuICogRW1wdHkgY29tcG91bmQgbm9kZSBzaXplLiBXaGVuIGEgY29tcG91bmQgbm9kZSBpcyBlbXB0eSwgaXRzIGJvdGhcclxuICogZGltZW5zaW9ucyBzaG91bGQgYmUgb2YgdGhpcyB2YWx1ZS5cclxuICovXG5MYXlvdXRDb25zdGFudHMuRU1QVFlfQ09NUE9VTkRfTk9ERV9TSVpFID0gNDA7XG5cbi8qXHJcbiAqIE1pbmltdW0gbGVuZ3RoIHRoYXQgYW4gZWRnZSBzaG91bGQgdGFrZSBkdXJpbmcgbGF5b3V0XHJcbiAqL1xuTGF5b3V0Q29uc3RhbnRzLk1JTl9FREdFX0xFTkdUSCA9IDE7XG5cbi8qXHJcbiAqIFdvcmxkIGJvdW5kYXJpZXMgdGhhdCBsYXlvdXQgb3BlcmF0ZXMgb25cclxuICovXG5MYXlvdXRDb25zdGFudHMuV09STERfQk9VTkRBUlkgPSAxMDAwMDAwO1xuXG4vKlxyXG4gKiBXb3JsZCBib3VuZGFyaWVzIHRoYXQgcmFuZG9tIHBvc2l0aW9uaW5nIGNhbiBiZSBwZXJmb3JtZWQgd2l0aFxyXG4gKi9cbkxheW91dENvbnN0YW50cy5JTklUSUFMX1dPUkxEX0JPVU5EQVJZID0gTGF5b3V0Q29uc3RhbnRzLldPUkxEX0JPVU5EQVJZIC8gMTAwMDtcblxuLypcclxuICogQ29vcmRpbmF0ZXMgb2YgdGhlIHdvcmxkIGNlbnRlclxyXG4gKi9cbkxheW91dENvbnN0YW50cy5XT1JMRF9DRU5URVJfWCA9IDEyMDA7XG5MYXlvdXRDb25zdGFudHMuV09STERfQ0VOVEVSX1kgPSA5MDA7XG5cbm1vZHVsZS5leHBvcnRzID0gTGF5b3V0Q29uc3RhbnRzO1xuXG4vKioqLyB9KSxcbi8qIDEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIExHcmFwaE9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMik7XG52YXIgSUdlb21ldHJ5ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4KTtcbnZhciBJTWF0aCA9IF9fd2VicGFja19yZXF1aXJlX18oOSk7XG5cbmZ1bmN0aW9uIExFZGdlKHNvdXJjZSwgdGFyZ2V0LCB2RWRnZSkge1xuICBMR3JhcGhPYmplY3QuY2FsbCh0aGlzLCB2RWRnZSk7XG5cbiAgdGhpcy5pc092ZXJsYXBpbmdTb3VyY2VBbmRUYXJnZXQgPSBmYWxzZTtcbiAgdGhpcy52R3JhcGhPYmplY3QgPSB2RWRnZTtcbiAgdGhpcy5iZW5kcG9pbnRzID0gW107XG4gIHRoaXMuc291cmNlID0gc291cmNlO1xuICB0aGlzLnRhcmdldCA9IHRhcmdldDtcbn1cblxuTEVkZ2UucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShMR3JhcGhPYmplY3QucHJvdG90eXBlKTtcblxuZm9yICh2YXIgcHJvcCBpbiBMR3JhcGhPYmplY3QpIHtcbiAgTEVkZ2VbcHJvcF0gPSBMR3JhcGhPYmplY3RbcHJvcF07XG59XG5cbkxFZGdlLnByb3RvdHlwZS5nZXRTb3VyY2UgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnNvdXJjZTtcbn07XG5cbkxFZGdlLnByb3RvdHlwZS5nZXRUYXJnZXQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnRhcmdldDtcbn07XG5cbkxFZGdlLnByb3RvdHlwZS5pc0ludGVyR3JhcGggPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmlzSW50ZXJHcmFwaDtcbn07XG5cbkxFZGdlLnByb3RvdHlwZS5nZXRMZW5ndGggPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmxlbmd0aDtcbn07XG5cbkxFZGdlLnByb3RvdHlwZS5pc092ZXJsYXBpbmdTb3VyY2VBbmRUYXJnZXQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmlzT3ZlcmxhcGluZ1NvdXJjZUFuZFRhcmdldDtcbn07XG5cbkxFZGdlLnByb3RvdHlwZS5nZXRCZW5kcG9pbnRzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5iZW5kcG9pbnRzO1xufTtcblxuTEVkZ2UucHJvdG90eXBlLmdldExjYSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubGNhO1xufTtcblxuTEVkZ2UucHJvdG90eXBlLmdldFNvdXJjZUluTGNhID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5zb3VyY2VJbkxjYTtcbn07XG5cbkxFZGdlLnByb3RvdHlwZS5nZXRUYXJnZXRJbkxjYSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMudGFyZ2V0SW5MY2E7XG59O1xuXG5MRWRnZS5wcm90b3R5cGUuZ2V0T3RoZXJFbmQgPSBmdW5jdGlvbiAobm9kZSkge1xuICBpZiAodGhpcy5zb3VyY2UgPT09IG5vZGUpIHtcbiAgICByZXR1cm4gdGhpcy50YXJnZXQ7XG4gIH0gZWxzZSBpZiAodGhpcy50YXJnZXQgPT09IG5vZGUpIHtcbiAgICByZXR1cm4gdGhpcy5zb3VyY2U7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgXCJOb2RlIGlzIG5vdCBpbmNpZGVudCB3aXRoIHRoaXMgZWRnZVwiO1xuICB9XG59O1xuXG5MRWRnZS5wcm90b3R5cGUuZ2V0T3RoZXJFbmRJbkdyYXBoID0gZnVuY3Rpb24gKG5vZGUsIGdyYXBoKSB7XG4gIHZhciBvdGhlckVuZCA9IHRoaXMuZ2V0T3RoZXJFbmQobm9kZSk7XG4gIHZhciByb290ID0gZ3JhcGguZ2V0R3JhcGhNYW5hZ2VyKCkuZ2V0Um9vdCgpO1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgaWYgKG90aGVyRW5kLmdldE93bmVyKCkgPT0gZ3JhcGgpIHtcbiAgICAgIHJldHVybiBvdGhlckVuZDtcbiAgICB9XG5cbiAgICBpZiAob3RoZXJFbmQuZ2V0T3duZXIoKSA9PSByb290KSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBvdGhlckVuZCA9IG90aGVyRW5kLmdldE93bmVyKCkuZ2V0UGFyZW50KCk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn07XG5cbkxFZGdlLnByb3RvdHlwZS51cGRhdGVMZW5ndGggPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBjbGlwUG9pbnRDb29yZGluYXRlcyA9IG5ldyBBcnJheSg0KTtcblxuICB0aGlzLmlzT3ZlcmxhcGluZ1NvdXJjZUFuZFRhcmdldCA9IElHZW9tZXRyeS5nZXRJbnRlcnNlY3Rpb24odGhpcy50YXJnZXQuZ2V0UmVjdCgpLCB0aGlzLnNvdXJjZS5nZXRSZWN0KCksIGNsaXBQb2ludENvb3JkaW5hdGVzKTtcblxuICBpZiAoIXRoaXMuaXNPdmVybGFwaW5nU291cmNlQW5kVGFyZ2V0KSB7XG4gICAgdGhpcy5sZW5ndGhYID0gY2xpcFBvaW50Q29vcmRpbmF0ZXNbMF0gLSBjbGlwUG9pbnRDb29yZGluYXRlc1syXTtcbiAgICB0aGlzLmxlbmd0aFkgPSBjbGlwUG9pbnRDb29yZGluYXRlc1sxXSAtIGNsaXBQb2ludENvb3JkaW5hdGVzWzNdO1xuXG4gICAgaWYgKE1hdGguYWJzKHRoaXMubGVuZ3RoWCkgPCAxLjApIHtcbiAgICAgIHRoaXMubGVuZ3RoWCA9IElNYXRoLnNpZ24odGhpcy5sZW5ndGhYKTtcbiAgICB9XG5cbiAgICBpZiAoTWF0aC5hYnModGhpcy5sZW5ndGhZKSA8IDEuMCkge1xuICAgICAgdGhpcy5sZW5ndGhZID0gSU1hdGguc2lnbih0aGlzLmxlbmd0aFkpO1xuICAgIH1cblxuICAgIHRoaXMubGVuZ3RoID0gTWF0aC5zcXJ0KHRoaXMubGVuZ3RoWCAqIHRoaXMubGVuZ3RoWCArIHRoaXMubGVuZ3RoWSAqIHRoaXMubGVuZ3RoWSk7XG4gIH1cbn07XG5cbkxFZGdlLnByb3RvdHlwZS51cGRhdGVMZW5ndGhTaW1wbGUgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMubGVuZ3RoWCA9IHRoaXMudGFyZ2V0LmdldENlbnRlclgoKSAtIHRoaXMuc291cmNlLmdldENlbnRlclgoKTtcbiAgdGhpcy5sZW5ndGhZID0gdGhpcy50YXJnZXQuZ2V0Q2VudGVyWSgpIC0gdGhpcy5zb3VyY2UuZ2V0Q2VudGVyWSgpO1xuXG4gIGlmIChNYXRoLmFicyh0aGlzLmxlbmd0aFgpIDwgMS4wKSB7XG4gICAgdGhpcy5sZW5ndGhYID0gSU1hdGguc2lnbih0aGlzLmxlbmd0aFgpO1xuICB9XG5cbiAgaWYgKE1hdGguYWJzKHRoaXMubGVuZ3RoWSkgPCAxLjApIHtcbiAgICB0aGlzLmxlbmd0aFkgPSBJTWF0aC5zaWduKHRoaXMubGVuZ3RoWSk7XG4gIH1cblxuICB0aGlzLmxlbmd0aCA9IE1hdGguc3FydCh0aGlzLmxlbmd0aFggKiB0aGlzLmxlbmd0aFggKyB0aGlzLmxlbmd0aFkgKiB0aGlzLmxlbmd0aFkpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBMRWRnZTtcblxuLyoqKi8gfSksXG4vKiAyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbmZ1bmN0aW9uIExHcmFwaE9iamVjdCh2R3JhcGhPYmplY3QpIHtcbiAgdGhpcy52R3JhcGhPYmplY3QgPSB2R3JhcGhPYmplY3Q7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gTEdyYXBoT2JqZWN0O1xuXG4vKioqLyB9KSxcbi8qIDMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIExHcmFwaE9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMik7XG52YXIgSW50ZWdlciA9IF9fd2VicGFja19yZXF1aXJlX18oMTApO1xudmFyIFJlY3RhbmdsZUQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzKTtcbnZhciBMYXlvdXRDb25zdGFudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xudmFyIFJhbmRvbVNlZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2KTtcbnZhciBQb2ludEQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpO1xuXG5mdW5jdGlvbiBMTm9kZShnbSwgbG9jLCBzaXplLCB2Tm9kZSkge1xuICAvL0FsdGVybmF0aXZlIGNvbnN0cnVjdG9yIDEgOiBMTm9kZShMR3JhcGhNYW5hZ2VyIGdtLCBQb2ludCBsb2MsIERpbWVuc2lvbiBzaXplLCBPYmplY3Qgdk5vZGUpXG4gIGlmIChzaXplID09IG51bGwgJiYgdk5vZGUgPT0gbnVsbCkge1xuICAgIHZOb2RlID0gbG9jO1xuICB9XG5cbiAgTEdyYXBoT2JqZWN0LmNhbGwodGhpcywgdk5vZGUpO1xuXG4gIC8vQWx0ZXJuYXRpdmUgY29uc3RydWN0b3IgMiA6IExOb2RlKExheW91dCBsYXlvdXQsIE9iamVjdCB2Tm9kZSlcbiAgaWYgKGdtLmdyYXBoTWFuYWdlciAhPSBudWxsKSBnbSA9IGdtLmdyYXBoTWFuYWdlcjtcblxuICB0aGlzLmVzdGltYXRlZFNpemUgPSBJbnRlZ2VyLk1JTl9WQUxVRTtcbiAgdGhpcy5pbmNsdXNpb25UcmVlRGVwdGggPSBJbnRlZ2VyLk1BWF9WQUxVRTtcbiAgdGhpcy52R3JhcGhPYmplY3QgPSB2Tm9kZTtcbiAgdGhpcy5lZGdlcyA9IFtdO1xuICB0aGlzLmdyYXBoTWFuYWdlciA9IGdtO1xuXG4gIGlmIChzaXplICE9IG51bGwgJiYgbG9jICE9IG51bGwpIHRoaXMucmVjdCA9IG5ldyBSZWN0YW5nbGVEKGxvYy54LCBsb2MueSwgc2l6ZS53aWR0aCwgc2l6ZS5oZWlnaHQpO2Vsc2UgdGhpcy5yZWN0ID0gbmV3IFJlY3RhbmdsZUQoKTtcbn1cblxuTE5vZGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShMR3JhcGhPYmplY3QucHJvdG90eXBlKTtcbmZvciAodmFyIHByb3AgaW4gTEdyYXBoT2JqZWN0KSB7XG4gIExOb2RlW3Byb3BdID0gTEdyYXBoT2JqZWN0W3Byb3BdO1xufVxuXG5MTm9kZS5wcm90b3R5cGUuZ2V0RWRnZXMgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmVkZ2VzO1xufTtcblxuTE5vZGUucHJvdG90eXBlLmdldENoaWxkID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5jaGlsZDtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5nZXRPd25lciA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gIGlmICh0aGlzLm93bmVyICE9IG51bGwpIHtcbiAgLy8gICAgaWYgKCEodGhpcy5vd25lciA9PSBudWxsIHx8IHRoaXMub3duZXIuZ2V0Tm9kZXMoKS5pbmRleE9mKHRoaXMpID4gLTEpKSB7XG4gIC8vICAgICAgdGhyb3cgXCJhc3NlcnQgZmFpbGVkXCI7XG4gIC8vICAgIH1cbiAgLy8gIH1cblxuICByZXR1cm4gdGhpcy5vd25lcjtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5nZXRXaWR0aCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMucmVjdC53aWR0aDtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5zZXRXaWR0aCA9IGZ1bmN0aW9uICh3aWR0aCkge1xuICB0aGlzLnJlY3Qud2lkdGggPSB3aWR0aDtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5nZXRIZWlnaHQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnJlY3QuaGVpZ2h0O1xufTtcblxuTE5vZGUucHJvdG90eXBlLnNldEhlaWdodCA9IGZ1bmN0aW9uIChoZWlnaHQpIHtcbiAgdGhpcy5yZWN0LmhlaWdodCA9IGhlaWdodDtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5nZXRDZW50ZXJYID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5yZWN0LnggKyB0aGlzLnJlY3Qud2lkdGggLyAyO1xufTtcblxuTE5vZGUucHJvdG90eXBlLmdldENlbnRlclkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnJlY3QueSArIHRoaXMucmVjdC5oZWlnaHQgLyAyO1xufTtcblxuTE5vZGUucHJvdG90eXBlLmdldENlbnRlciA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIG5ldyBQb2ludEQodGhpcy5yZWN0LnggKyB0aGlzLnJlY3Qud2lkdGggLyAyLCB0aGlzLnJlY3QueSArIHRoaXMucmVjdC5oZWlnaHQgLyAyKTtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5nZXRMb2NhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIG5ldyBQb2ludEQodGhpcy5yZWN0LngsIHRoaXMucmVjdC55KTtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5nZXRSZWN0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5yZWN0O1xufTtcblxuTE5vZGUucHJvdG90eXBlLmdldERpYWdvbmFsID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gTWF0aC5zcXJ0KHRoaXMucmVjdC53aWR0aCAqIHRoaXMucmVjdC53aWR0aCArIHRoaXMucmVjdC5oZWlnaHQgKiB0aGlzLnJlY3QuaGVpZ2h0KTtcbn07XG5cbi8qKlxuICogVGhpcyBtZXRob2QgcmV0dXJucyBoYWxmIHRoZSBkaWFnb25hbCBsZW5ndGggb2YgdGhpcyBub2RlLlxuICovXG5MTm9kZS5wcm90b3R5cGUuZ2V0SGFsZlRoZURpYWdvbmFsID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gTWF0aC5zcXJ0KHRoaXMucmVjdC5oZWlnaHQgKiB0aGlzLnJlY3QuaGVpZ2h0ICsgdGhpcy5yZWN0LndpZHRoICogdGhpcy5yZWN0LndpZHRoKSAvIDI7XG59O1xuXG5MTm9kZS5wcm90b3R5cGUuc2V0UmVjdCA9IGZ1bmN0aW9uICh1cHBlckxlZnQsIGRpbWVuc2lvbikge1xuICB0aGlzLnJlY3QueCA9IHVwcGVyTGVmdC54O1xuICB0aGlzLnJlY3QueSA9IHVwcGVyTGVmdC55O1xuICB0aGlzLnJlY3Qud2lkdGggPSBkaW1lbnNpb24ud2lkdGg7XG4gIHRoaXMucmVjdC5oZWlnaHQgPSBkaW1lbnNpb24uaGVpZ2h0O1xufTtcblxuTE5vZGUucHJvdG90eXBlLnNldENlbnRlciA9IGZ1bmN0aW9uIChjeCwgY3kpIHtcbiAgdGhpcy5yZWN0LnggPSBjeCAtIHRoaXMucmVjdC53aWR0aCAvIDI7XG4gIHRoaXMucmVjdC55ID0gY3kgLSB0aGlzLnJlY3QuaGVpZ2h0IC8gMjtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5zZXRMb2NhdGlvbiA9IGZ1bmN0aW9uICh4LCB5KSB7XG4gIHRoaXMucmVjdC54ID0geDtcbiAgdGhpcy5yZWN0LnkgPSB5O1xufTtcblxuTE5vZGUucHJvdG90eXBlLm1vdmVCeSA9IGZ1bmN0aW9uIChkeCwgZHkpIHtcbiAgdGhpcy5yZWN0LnggKz0gZHg7XG4gIHRoaXMucmVjdC55ICs9IGR5O1xufTtcblxuTE5vZGUucHJvdG90eXBlLmdldEVkZ2VMaXN0VG9Ob2RlID0gZnVuY3Rpb24gKHRvKSB7XG4gIHZhciBlZGdlTGlzdCA9IFtdO1xuICB2YXIgZWRnZTtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gIHNlbGYuZWRnZXMuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuXG4gICAgaWYgKGVkZ2UudGFyZ2V0ID09IHRvKSB7XG4gICAgICBpZiAoZWRnZS5zb3VyY2UgIT0gc2VsZikgdGhyb3cgXCJJbmNvcnJlY3QgZWRnZSBzb3VyY2UhXCI7XG5cbiAgICAgIGVkZ2VMaXN0LnB1c2goZWRnZSk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gZWRnZUxpc3Q7XG59O1xuXG5MTm9kZS5wcm90b3R5cGUuZ2V0RWRnZXNCZXR3ZWVuID0gZnVuY3Rpb24gKG90aGVyKSB7XG4gIHZhciBlZGdlTGlzdCA9IFtdO1xuICB2YXIgZWRnZTtcblxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHNlbGYuZWRnZXMuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuXG4gICAgaWYgKCEoZWRnZS5zb3VyY2UgPT0gc2VsZiB8fCBlZGdlLnRhcmdldCA9PSBzZWxmKSkgdGhyb3cgXCJJbmNvcnJlY3QgZWRnZSBzb3VyY2UgYW5kL29yIHRhcmdldFwiO1xuXG4gICAgaWYgKGVkZ2UudGFyZ2V0ID09IG90aGVyIHx8IGVkZ2Uuc291cmNlID09IG90aGVyKSB7XG4gICAgICBlZGdlTGlzdC5wdXNoKGVkZ2UpO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGVkZ2VMaXN0O1xufTtcblxuTE5vZGUucHJvdG90eXBlLmdldE5laWdoYm9yc0xpc3QgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBuZWlnaGJvcnMgPSBuZXcgU2V0KCk7XG5cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBzZWxmLmVkZ2VzLmZvckVhY2goZnVuY3Rpb24gKGVkZ2UpIHtcblxuICAgIGlmIChlZGdlLnNvdXJjZSA9PSBzZWxmKSB7XG4gICAgICBuZWlnaGJvcnMuYWRkKGVkZ2UudGFyZ2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGVkZ2UudGFyZ2V0ICE9IHNlbGYpIHtcbiAgICAgICAgdGhyb3cgXCJJbmNvcnJlY3QgaW5jaWRlbmN5IVwiO1xuICAgICAgfVxuXG4gICAgICBuZWlnaGJvcnMuYWRkKGVkZ2Uuc291cmNlKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBuZWlnaGJvcnM7XG59O1xuXG5MTm9kZS5wcm90b3R5cGUud2l0aENoaWxkcmVuID0gZnVuY3Rpb24gKCkge1xuICB2YXIgd2l0aE5laWdoYm9yc0xpc3QgPSBuZXcgU2V0KCk7XG4gIHZhciBjaGlsZE5vZGU7XG4gIHZhciBjaGlsZHJlbjtcblxuICB3aXRoTmVpZ2hib3JzTGlzdC5hZGQodGhpcyk7XG5cbiAgaWYgKHRoaXMuY2hpbGQgIT0gbnVsbCkge1xuICAgIHZhciBub2RlcyA9IHRoaXMuY2hpbGQuZ2V0Tm9kZXMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjaGlsZE5vZGUgPSBub2Rlc1tpXTtcbiAgICAgIGNoaWxkcmVuID0gY2hpbGROb2RlLndpdGhDaGlsZHJlbigpO1xuICAgICAgY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICB3aXRoTmVpZ2hib3JzTGlzdC5hZGQobm9kZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gd2l0aE5laWdoYm9yc0xpc3Q7XG59O1xuXG5MTm9kZS5wcm90b3R5cGUuZ2V0Tm9PZkNoaWxkcmVuID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbm9PZkNoaWxkcmVuID0gMDtcbiAgdmFyIGNoaWxkTm9kZTtcblxuICBpZiAodGhpcy5jaGlsZCA9PSBudWxsKSB7XG4gICAgbm9PZkNoaWxkcmVuID0gMTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbm9kZXMgPSB0aGlzLmNoaWxkLmdldE5vZGVzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY2hpbGROb2RlID0gbm9kZXNbaV07XG5cbiAgICAgIG5vT2ZDaGlsZHJlbiArPSBjaGlsZE5vZGUuZ2V0Tm9PZkNoaWxkcmVuKCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKG5vT2ZDaGlsZHJlbiA9PSAwKSB7XG4gICAgbm9PZkNoaWxkcmVuID0gMTtcbiAgfVxuICByZXR1cm4gbm9PZkNoaWxkcmVuO1xufTtcblxuTE5vZGUucHJvdG90eXBlLmdldEVzdGltYXRlZFNpemUgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLmVzdGltYXRlZFNpemUgPT0gSW50ZWdlci5NSU5fVkFMVUUpIHtcbiAgICB0aHJvdyBcImFzc2VydCBmYWlsZWRcIjtcbiAgfVxuICByZXR1cm4gdGhpcy5lc3RpbWF0ZWRTaXplO1xufTtcblxuTE5vZGUucHJvdG90eXBlLmNhbGNFc3RpbWF0ZWRTaXplID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5jaGlsZCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHRoaXMuZXN0aW1hdGVkU2l6ZSA9ICh0aGlzLnJlY3Qud2lkdGggKyB0aGlzLnJlY3QuaGVpZ2h0KSAvIDI7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5lc3RpbWF0ZWRTaXplID0gdGhpcy5jaGlsZC5jYWxjRXN0aW1hdGVkU2l6ZSgpO1xuICAgIHRoaXMucmVjdC53aWR0aCA9IHRoaXMuZXN0aW1hdGVkU2l6ZTtcbiAgICB0aGlzLnJlY3QuaGVpZ2h0ID0gdGhpcy5lc3RpbWF0ZWRTaXplO1xuXG4gICAgcmV0dXJuIHRoaXMuZXN0aW1hdGVkU2l6ZTtcbiAgfVxufTtcblxuTE5vZGUucHJvdG90eXBlLnNjYXR0ZXIgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciByYW5kb21DZW50ZXJYO1xuICB2YXIgcmFuZG9tQ2VudGVyWTtcblxuICB2YXIgbWluWCA9IC1MYXlvdXRDb25zdGFudHMuSU5JVElBTF9XT1JMRF9CT1VOREFSWTtcbiAgdmFyIG1heFggPSBMYXlvdXRDb25zdGFudHMuSU5JVElBTF9XT1JMRF9CT1VOREFSWTtcbiAgcmFuZG9tQ2VudGVyWCA9IExheW91dENvbnN0YW50cy5XT1JMRF9DRU5URVJfWCArIFJhbmRvbVNlZWQubmV4dERvdWJsZSgpICogKG1heFggLSBtaW5YKSArIG1pblg7XG5cbiAgdmFyIG1pblkgPSAtTGF5b3V0Q29uc3RhbnRzLklOSVRJQUxfV09STERfQk9VTkRBUlk7XG4gIHZhciBtYXhZID0gTGF5b3V0Q29uc3RhbnRzLklOSVRJQUxfV09STERfQk9VTkRBUlk7XG4gIHJhbmRvbUNlbnRlclkgPSBMYXlvdXRDb25zdGFudHMuV09STERfQ0VOVEVSX1kgKyBSYW5kb21TZWVkLm5leHREb3VibGUoKSAqIChtYXhZIC0gbWluWSkgKyBtaW5ZO1xuXG4gIHRoaXMucmVjdC54ID0gcmFuZG9tQ2VudGVyWDtcbiAgdGhpcy5yZWN0LnkgPSByYW5kb21DZW50ZXJZO1xufTtcblxuTE5vZGUucHJvdG90eXBlLnVwZGF0ZUJvdW5kcyA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuZ2V0Q2hpbGQoKSA9PSBudWxsKSB7XG4gICAgdGhyb3cgXCJhc3NlcnQgZmFpbGVkXCI7XG4gIH1cbiAgaWYgKHRoaXMuZ2V0Q2hpbGQoKS5nZXROb2RlcygpLmxlbmd0aCAhPSAwKSB7XG4gICAgLy8gd3JhcCB0aGUgY2hpbGRyZW4gbm9kZXMgYnkgcmUtYXJyYW5naW5nIHRoZSBib3VuZGFyaWVzXG4gICAgdmFyIGNoaWxkR3JhcGggPSB0aGlzLmdldENoaWxkKCk7XG4gICAgY2hpbGRHcmFwaC51cGRhdGVCb3VuZHModHJ1ZSk7XG5cbiAgICB0aGlzLnJlY3QueCA9IGNoaWxkR3JhcGguZ2V0TGVmdCgpO1xuICAgIHRoaXMucmVjdC55ID0gY2hpbGRHcmFwaC5nZXRUb3AoKTtcblxuICAgIHRoaXMuc2V0V2lkdGgoY2hpbGRHcmFwaC5nZXRSaWdodCgpIC0gY2hpbGRHcmFwaC5nZXRMZWZ0KCkpO1xuICAgIHRoaXMuc2V0SGVpZ2h0KGNoaWxkR3JhcGguZ2V0Qm90dG9tKCkgLSBjaGlsZEdyYXBoLmdldFRvcCgpKTtcblxuICAgIC8vIFVwZGF0ZSBjb21wb3VuZCBib3VuZHMgY29uc2lkZXJpbmcgaXRzIGxhYmVsIHByb3BlcnRpZXMgICAgXG4gICAgaWYgKExheW91dENvbnN0YW50cy5OT0RFX0RJTUVOU0lPTlNfSU5DTFVERV9MQUJFTFMpIHtcblxuICAgICAgdmFyIHdpZHRoID0gY2hpbGRHcmFwaC5nZXRSaWdodCgpIC0gY2hpbGRHcmFwaC5nZXRMZWZ0KCk7XG4gICAgICB2YXIgaGVpZ2h0ID0gY2hpbGRHcmFwaC5nZXRCb3R0b20oKSAtIGNoaWxkR3JhcGguZ2V0VG9wKCk7XG5cbiAgICAgIGlmICh0aGlzLmxhYmVsV2lkdGgpIHtcbiAgICAgICAgaWYgKHRoaXMubGFiZWxQb3NIb3Jpem9udGFsID09IFwibGVmdFwiKSB7XG4gICAgICAgICAgdGhpcy5yZWN0LnggLT0gdGhpcy5sYWJlbFdpZHRoO1xuICAgICAgICAgIHRoaXMuc2V0V2lkdGgod2lkdGggKyB0aGlzLmxhYmVsV2lkdGgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubGFiZWxQb3NIb3Jpem9udGFsID09IFwiY2VudGVyXCIgJiYgdGhpcy5sYWJlbFdpZHRoID4gd2lkdGgpIHtcbiAgICAgICAgICB0aGlzLnJlY3QueCAtPSAodGhpcy5sYWJlbFdpZHRoIC0gd2lkdGgpIC8gMjtcbiAgICAgICAgICB0aGlzLnNldFdpZHRoKHRoaXMubGFiZWxXaWR0aCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5sYWJlbFBvc0hvcml6b250YWwgPT0gXCJyaWdodFwiKSB7XG4gICAgICAgICAgdGhpcy5zZXRXaWR0aCh3aWR0aCArIHRoaXMubGFiZWxXaWR0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMubGFiZWxIZWlnaHQpIHtcbiAgICAgICAgaWYgKHRoaXMubGFiZWxQb3NWZXJ0aWNhbCA9PSBcInRvcFwiKSB7XG4gICAgICAgICAgdGhpcy5yZWN0LnkgLT0gdGhpcy5sYWJlbEhlaWdodDtcbiAgICAgICAgICB0aGlzLnNldEhlaWdodChoZWlnaHQgKyB0aGlzLmxhYmVsSGVpZ2h0KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxhYmVsUG9zVmVydGljYWwgPT0gXCJjZW50ZXJcIiAmJiB0aGlzLmxhYmVsSGVpZ2h0ID4gaGVpZ2h0KSB7XG4gICAgICAgICAgdGhpcy5yZWN0LnkgLT0gKHRoaXMubGFiZWxIZWlnaHQgLSBoZWlnaHQpIC8gMjtcbiAgICAgICAgICB0aGlzLnNldEhlaWdodCh0aGlzLmxhYmVsSGVpZ2h0KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxhYmVsUG9zVmVydGljYWwgPT0gXCJib3R0b21cIikge1xuICAgICAgICAgIHRoaXMuc2V0SGVpZ2h0KGhlaWdodCArIHRoaXMubGFiZWxIZWlnaHQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG5MTm9kZS5wcm90b3R5cGUuZ2V0SW5jbHVzaW9uVHJlZURlcHRoID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5pbmNsdXNpb25UcmVlRGVwdGggPT0gSW50ZWdlci5NQVhfVkFMVUUpIHtcbiAgICB0aHJvdyBcImFzc2VydCBmYWlsZWRcIjtcbiAgfVxuICByZXR1cm4gdGhpcy5pbmNsdXNpb25UcmVlRGVwdGg7XG59O1xuXG5MTm9kZS5wcm90b3R5cGUudHJhbnNmb3JtID0gZnVuY3Rpb24gKHRyYW5zKSB7XG4gIHZhciBsZWZ0ID0gdGhpcy5yZWN0Lng7XG5cbiAgaWYgKGxlZnQgPiBMYXlvdXRDb25zdGFudHMuV09STERfQk9VTkRBUlkpIHtcbiAgICBsZWZ0ID0gTGF5b3V0Q29uc3RhbnRzLldPUkxEX0JPVU5EQVJZO1xuICB9IGVsc2UgaWYgKGxlZnQgPCAtTGF5b3V0Q29uc3RhbnRzLldPUkxEX0JPVU5EQVJZKSB7XG4gICAgbGVmdCA9IC1MYXlvdXRDb25zdGFudHMuV09STERfQk9VTkRBUlk7XG4gIH1cblxuICB2YXIgdG9wID0gdGhpcy5yZWN0Lnk7XG5cbiAgaWYgKHRvcCA+IExheW91dENvbnN0YW50cy5XT1JMRF9CT1VOREFSWSkge1xuICAgIHRvcCA9IExheW91dENvbnN0YW50cy5XT1JMRF9CT1VOREFSWTtcbiAgfSBlbHNlIGlmICh0b3AgPCAtTGF5b3V0Q29uc3RhbnRzLldPUkxEX0JPVU5EQVJZKSB7XG4gICAgdG9wID0gLUxheW91dENvbnN0YW50cy5XT1JMRF9CT1VOREFSWTtcbiAgfVxuXG4gIHZhciBsZWZ0VG9wID0gbmV3IFBvaW50RChsZWZ0LCB0b3ApO1xuICB2YXIgdkxlZnRUb3AgPSB0cmFucy5pbnZlcnNlVHJhbnNmb3JtUG9pbnQobGVmdFRvcCk7XG5cbiAgdGhpcy5zZXRMb2NhdGlvbih2TGVmdFRvcC54LCB2TGVmdFRvcC55KTtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5nZXRMZWZ0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5yZWN0Lng7XG59O1xuXG5MTm9kZS5wcm90b3R5cGUuZ2V0UmlnaHQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnJlY3QueCArIHRoaXMucmVjdC53aWR0aDtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5nZXRUb3AgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnJlY3QueTtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5nZXRCb3R0b20gPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnJlY3QueSArIHRoaXMucmVjdC5oZWlnaHQ7XG59O1xuXG5MTm9kZS5wcm90b3R5cGUuZ2V0UGFyZW50ID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5vd25lciA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gdGhpcy5vd25lci5nZXRQYXJlbnQoKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gTE5vZGU7XG5cbi8qKiovIH0pLFxuLyogNCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgTGF5b3V0Q29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxuZnVuY3Rpb24gRkRMYXlvdXRDb25zdGFudHMoKSB7fVxuXG4vL0ZETGF5b3V0Q29uc3RhbnRzIGluaGVyaXRzIHN0YXRpYyBwcm9wcyBpbiBMYXlvdXRDb25zdGFudHNcbmZvciAodmFyIHByb3AgaW4gTGF5b3V0Q29uc3RhbnRzKSB7XG4gIEZETGF5b3V0Q29uc3RhbnRzW3Byb3BdID0gTGF5b3V0Q29uc3RhbnRzW3Byb3BdO1xufVxuXG5GRExheW91dENvbnN0YW50cy5NQVhfSVRFUkFUSU9OUyA9IDI1MDA7XG5cbkZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfRURHRV9MRU5HVEggPSA1MDtcbkZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfU1BSSU5HX1NUUkVOR1RIID0gMC40NTtcbkZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfUkVQVUxTSU9OX1NUUkVOR1RIID0gNDUwMC4wO1xuRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9HUkFWSVRZX1NUUkVOR1RIID0gMC40O1xuRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9DT01QT1VORF9HUkFWSVRZX1NUUkVOR1RIID0gMS4wO1xuRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9HUkFWSVRZX1JBTkdFX0ZBQ1RPUiA9IDMuODtcbkZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQ09NUE9VTkRfR1JBVklUWV9SQU5HRV9GQUNUT1IgPSAxLjU7XG5GRExheW91dENvbnN0YW50cy5ERUZBVUxUX1VTRV9TTUFSVF9JREVBTF9FREdFX0xFTkdUSF9DQUxDVUxBVElPTiA9IHRydWU7XG5GRExheW91dENvbnN0YW50cy5ERUZBVUxUX1VTRV9TTUFSVF9SRVBVTFNJT05fUkFOR0VfQ0FMQ1VMQVRJT04gPSB0cnVlO1xuRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9DT09MSU5HX0ZBQ1RPUl9JTkNSRU1FTlRBTCA9IDAuMztcbkZETGF5b3V0Q29uc3RhbnRzLkNPT0xJTkdfQURBUFRBVElPTl9GQUNUT1IgPSAwLjMzO1xuRkRMYXlvdXRDb25zdGFudHMuQURBUFRBVElPTl9MT1dFUl9OT0RFX0xJTUlUID0gMTAwMDtcbkZETGF5b3V0Q29uc3RhbnRzLkFEQVBUQVRJT05fVVBQRVJfTk9ERV9MSU1JVCA9IDUwMDA7XG5GRExheW91dENvbnN0YW50cy5NQVhfTk9ERV9ESVNQTEFDRU1FTlRfSU5DUkVNRU5UQUwgPSAxMDAuMDtcbkZETGF5b3V0Q29uc3RhbnRzLk1BWF9OT0RFX0RJU1BMQUNFTUVOVCA9IEZETGF5b3V0Q29uc3RhbnRzLk1BWF9OT0RFX0RJU1BMQUNFTUVOVF9JTkNSRU1FTlRBTCAqIDM7XG5GRExheW91dENvbnN0YW50cy5NSU5fUkVQVUxTSU9OX0RJU1QgPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIIC8gMTAuMDtcbkZETGF5b3V0Q29uc3RhbnRzLkNPTlZFUkdFTkNFX0NIRUNLX1BFUklPRCA9IDEwMDtcbkZETGF5b3V0Q29uc3RhbnRzLlBFUl9MRVZFTF9JREVBTF9FREdFX0xFTkdUSF9GQUNUT1IgPSAwLjE7XG5GRExheW91dENvbnN0YW50cy5NSU5fRURHRV9MRU5HVEggPSAxO1xuRkRMYXlvdXRDb25zdGFudHMuR1JJRF9DQUxDVUxBVElPTl9DSEVDS19QRVJJT0QgPSAxMDtcblxubW9kdWxlLmV4cG9ydHMgPSBGRExheW91dENvbnN0YW50cztcblxuLyoqKi8gfSksXG4vKiA1ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbmZ1bmN0aW9uIFBvaW50RCh4LCB5KSB7XG4gIGlmICh4ID09IG51bGwgJiYgeSA9PSBudWxsKSB7XG4gICAgdGhpcy54ID0gMDtcbiAgICB0aGlzLnkgPSAwO1xuICB9IGVsc2Uge1xuICAgIHRoaXMueCA9IHg7XG4gICAgdGhpcy55ID0geTtcbiAgfVxufVxuXG5Qb2ludEQucHJvdG90eXBlLmdldFggPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLng7XG59O1xuXG5Qb2ludEQucHJvdG90eXBlLmdldFkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnk7XG59O1xuXG5Qb2ludEQucHJvdG90eXBlLnNldFggPSBmdW5jdGlvbiAoeCkge1xuICB0aGlzLnggPSB4O1xufTtcblxuUG9pbnRELnByb3RvdHlwZS5zZXRZID0gZnVuY3Rpb24gKHkpIHtcbiAgdGhpcy55ID0geTtcbn07XG5cblBvaW50RC5wcm90b3R5cGUuZ2V0RGlmZmVyZW5jZSA9IGZ1bmN0aW9uIChwdCkge1xuICByZXR1cm4gbmV3IERpbWVuc2lvbkQodGhpcy54IC0gcHQueCwgdGhpcy55IC0gcHQueSk7XG59O1xuXG5Qb2ludEQucHJvdG90eXBlLmdldENvcHkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBuZXcgUG9pbnREKHRoaXMueCwgdGhpcy55KTtcbn07XG5cblBvaW50RC5wcm90b3R5cGUudHJhbnNsYXRlID0gZnVuY3Rpb24gKGRpbSkge1xuICB0aGlzLnggKz0gZGltLndpZHRoO1xuICB0aGlzLnkgKz0gZGltLmhlaWdodDtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFBvaW50RDtcblxuLyoqKi8gfSksXG4vKiA2ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBMR3JhcGhPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xudmFyIEludGVnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKTtcbnZhciBMYXlvdXRDb25zdGFudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xudmFyIExHcmFwaE1hbmFnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpO1xudmFyIExOb2RlID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTtcbnZhciBMRWRnZSA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG52YXIgUmVjdGFuZ2xlRCA9IF9fd2VicGFja19yZXF1aXJlX18oMTMpO1xudmFyIFBvaW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMik7XG52YXIgTGlua2VkTGlzdCA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpO1xuXG5mdW5jdGlvbiBMR3JhcGgocGFyZW50LCBvYmoyLCB2R3JhcGgpIHtcbiAgTEdyYXBoT2JqZWN0LmNhbGwodGhpcywgdkdyYXBoKTtcbiAgdGhpcy5lc3RpbWF0ZWRTaXplID0gSW50ZWdlci5NSU5fVkFMVUU7XG4gIHRoaXMubWFyZ2luID0gTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfR1JBUEhfTUFSR0lOO1xuICB0aGlzLmVkZ2VzID0gW107XG4gIHRoaXMubm9kZXMgPSBbXTtcbiAgdGhpcy5pc0Nvbm5lY3RlZCA9IGZhbHNlO1xuICB0aGlzLnBhcmVudCA9IHBhcmVudDtcblxuICBpZiAob2JqMiAhPSBudWxsICYmIG9iajIgaW5zdGFuY2VvZiBMR3JhcGhNYW5hZ2VyKSB7XG4gICAgdGhpcy5ncmFwaE1hbmFnZXIgPSBvYmoyO1xuICB9IGVsc2UgaWYgKG9iajIgIT0gbnVsbCAmJiBvYmoyIGluc3RhbmNlb2YgTGF5b3V0KSB7XG4gICAgdGhpcy5ncmFwaE1hbmFnZXIgPSBvYmoyLmdyYXBoTWFuYWdlcjtcbiAgfVxufVxuXG5MR3JhcGgucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShMR3JhcGhPYmplY3QucHJvdG90eXBlKTtcbmZvciAodmFyIHByb3AgaW4gTEdyYXBoT2JqZWN0KSB7XG4gIExHcmFwaFtwcm9wXSA9IExHcmFwaE9iamVjdFtwcm9wXTtcbn1cblxuTEdyYXBoLnByb3RvdHlwZS5nZXROb2RlcyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubm9kZXM7XG59O1xuXG5MR3JhcGgucHJvdG90eXBlLmdldEVkZ2VzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5lZGdlcztcbn07XG5cbkxHcmFwaC5wcm90b3R5cGUuZ2V0R3JhcGhNYW5hZ2VyID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5ncmFwaE1hbmFnZXI7XG59O1xuXG5MR3JhcGgucHJvdG90eXBlLmdldFBhcmVudCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMucGFyZW50O1xufTtcblxuTEdyYXBoLnByb3RvdHlwZS5nZXRMZWZ0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5sZWZ0O1xufTtcblxuTEdyYXBoLnByb3RvdHlwZS5nZXRSaWdodCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMucmlnaHQ7XG59O1xuXG5MR3JhcGgucHJvdG90eXBlLmdldFRvcCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMudG9wO1xufTtcblxuTEdyYXBoLnByb3RvdHlwZS5nZXRCb3R0b20gPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmJvdHRvbTtcbn07XG5cbkxHcmFwaC5wcm90b3R5cGUuaXNDb25uZWN0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmlzQ29ubmVjdGVkO1xufTtcblxuTEdyYXBoLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAob2JqMSwgc291cmNlTm9kZSwgdGFyZ2V0Tm9kZSkge1xuICBpZiAoc291cmNlTm9kZSA9PSBudWxsICYmIHRhcmdldE5vZGUgPT0gbnVsbCkge1xuICAgIHZhciBuZXdOb2RlID0gb2JqMTtcbiAgICBpZiAodGhpcy5ncmFwaE1hbmFnZXIgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgXCJHcmFwaCBoYXMgbm8gZ3JhcGggbWdyIVwiO1xuICAgIH1cbiAgICBpZiAodGhpcy5nZXROb2RlcygpLmluZGV4T2YobmV3Tm9kZSkgPiAtMSkge1xuICAgICAgdGhyb3cgXCJOb2RlIGFscmVhZHkgaW4gZ3JhcGghXCI7XG4gICAgfVxuICAgIG5ld05vZGUub3duZXIgPSB0aGlzO1xuICAgIHRoaXMuZ2V0Tm9kZXMoKS5wdXNoKG5ld05vZGUpO1xuXG4gICAgcmV0dXJuIG5ld05vZGU7XG4gIH0gZWxzZSB7XG4gICAgdmFyIG5ld0VkZ2UgPSBvYmoxO1xuICAgIGlmICghKHRoaXMuZ2V0Tm9kZXMoKS5pbmRleE9mKHNvdXJjZU5vZGUpID4gLTEgJiYgdGhpcy5nZXROb2RlcygpLmluZGV4T2YodGFyZ2V0Tm9kZSkgPiAtMSkpIHtcbiAgICAgIHRocm93IFwiU291cmNlIG9yIHRhcmdldCBub3QgaW4gZ3JhcGghXCI7XG4gICAgfVxuXG4gICAgaWYgKCEoc291cmNlTm9kZS5vd25lciA9PSB0YXJnZXROb2RlLm93bmVyICYmIHNvdXJjZU5vZGUub3duZXIgPT0gdGhpcykpIHtcbiAgICAgIHRocm93IFwiQm90aCBvd25lcnMgbXVzdCBiZSB0aGlzIGdyYXBoIVwiO1xuICAgIH1cblxuICAgIGlmIChzb3VyY2VOb2RlLm93bmVyICE9IHRhcmdldE5vZGUub3duZXIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIHNldCBzb3VyY2UgYW5kIHRhcmdldFxuICAgIG5ld0VkZ2Uuc291cmNlID0gc291cmNlTm9kZTtcbiAgICBuZXdFZGdlLnRhcmdldCA9IHRhcmdldE5vZGU7XG5cbiAgICAvLyBzZXQgYXMgaW50cmEtZ3JhcGggZWRnZVxuICAgIG5ld0VkZ2UuaXNJbnRlckdyYXBoID0gZmFsc2U7XG5cbiAgICAvLyBhZGQgdG8gZ3JhcGggZWRnZSBsaXN0XG4gICAgdGhpcy5nZXRFZGdlcygpLnB1c2gobmV3RWRnZSk7XG5cbiAgICAvLyBhZGQgdG8gaW5jaWRlbmN5IGxpc3RzXG4gICAgc291cmNlTm9kZS5lZGdlcy5wdXNoKG5ld0VkZ2UpO1xuXG4gICAgaWYgKHRhcmdldE5vZGUgIT0gc291cmNlTm9kZSkge1xuICAgICAgdGFyZ2V0Tm9kZS5lZGdlcy5wdXNoKG5ld0VkZ2UpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXdFZGdlO1xuICB9XG59O1xuXG5MR3JhcGgucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChvYmopIHtcbiAgdmFyIG5vZGUgPSBvYmo7XG4gIGlmIChvYmogaW5zdGFuY2VvZiBMTm9kZSkge1xuICAgIGlmIChub2RlID09IG51bGwpIHtcbiAgICAgIHRocm93IFwiTm9kZSBpcyBudWxsIVwiO1xuICAgIH1cbiAgICBpZiAoIShub2RlLm93bmVyICE9IG51bGwgJiYgbm9kZS5vd25lciA9PSB0aGlzKSkge1xuICAgICAgdGhyb3cgXCJPd25lciBncmFwaCBpcyBpbnZhbGlkIVwiO1xuICAgIH1cbiAgICBpZiAodGhpcy5ncmFwaE1hbmFnZXIgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgXCJPd25lciBncmFwaCBtYW5hZ2VyIGlzIGludmFsaWQhXCI7XG4gICAgfVxuICAgIC8vIHJlbW92ZSBpbmNpZGVudCBlZGdlcyBmaXJzdCAobWFrZSBhIGNvcHkgdG8gZG8gaXQgc2FmZWx5KVxuICAgIHZhciBlZGdlc1RvQmVSZW1vdmVkID0gbm9kZS5lZGdlcy5zbGljZSgpO1xuICAgIHZhciBlZGdlO1xuICAgIHZhciBzID0gZWRnZXNUb0JlUmVtb3ZlZC5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzOyBpKyspIHtcbiAgICAgIGVkZ2UgPSBlZGdlc1RvQmVSZW1vdmVkW2ldO1xuXG4gICAgICBpZiAoZWRnZS5pc0ludGVyR3JhcGgpIHtcbiAgICAgICAgdGhpcy5ncmFwaE1hbmFnZXIucmVtb3ZlKGVkZ2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWRnZS5zb3VyY2Uub3duZXIucmVtb3ZlKGVkZ2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIG5vdyB0aGUgbm9kZSBpdHNlbGZcbiAgICB2YXIgaW5kZXggPSB0aGlzLm5vZGVzLmluZGV4T2Yobm9kZSk7XG4gICAgaWYgKGluZGV4ID09IC0xKSB7XG4gICAgICB0aHJvdyBcIk5vZGUgbm90IGluIG93bmVyIG5vZGUgbGlzdCFcIjtcbiAgICB9XG5cbiAgICB0aGlzLm5vZGVzLnNwbGljZShpbmRleCwgMSk7XG4gIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgTEVkZ2UpIHtcbiAgICB2YXIgZWRnZSA9IG9iajtcbiAgICBpZiAoZWRnZSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBcIkVkZ2UgaXMgbnVsbCFcIjtcbiAgICB9XG4gICAgaWYgKCEoZWRnZS5zb3VyY2UgIT0gbnVsbCAmJiBlZGdlLnRhcmdldCAhPSBudWxsKSkge1xuICAgICAgdGhyb3cgXCJTb3VyY2UgYW5kL29yIHRhcmdldCBpcyBudWxsIVwiO1xuICAgIH1cbiAgICBpZiAoIShlZGdlLnNvdXJjZS5vd25lciAhPSBudWxsICYmIGVkZ2UudGFyZ2V0Lm93bmVyICE9IG51bGwgJiYgZWRnZS5zb3VyY2Uub3duZXIgPT0gdGhpcyAmJiBlZGdlLnRhcmdldC5vd25lciA9PSB0aGlzKSkge1xuICAgICAgdGhyb3cgXCJTb3VyY2UgYW5kL29yIHRhcmdldCBvd25lciBpcyBpbnZhbGlkIVwiO1xuICAgIH1cblxuICAgIHZhciBzb3VyY2VJbmRleCA9IGVkZ2Uuc291cmNlLmVkZ2VzLmluZGV4T2YoZWRnZSk7XG4gICAgdmFyIHRhcmdldEluZGV4ID0gZWRnZS50YXJnZXQuZWRnZXMuaW5kZXhPZihlZGdlKTtcbiAgICBpZiAoIShzb3VyY2VJbmRleCA+IC0xICYmIHRhcmdldEluZGV4ID4gLTEpKSB7XG4gICAgICB0aHJvdyBcIlNvdXJjZSBhbmQvb3IgdGFyZ2V0IGRvZXNuJ3Qga25vdyB0aGlzIGVkZ2UhXCI7XG4gICAgfVxuXG4gICAgZWRnZS5zb3VyY2UuZWRnZXMuc3BsaWNlKHNvdXJjZUluZGV4LCAxKTtcblxuICAgIGlmIChlZGdlLnRhcmdldCAhPSBlZGdlLnNvdXJjZSkge1xuICAgICAgZWRnZS50YXJnZXQuZWRnZXMuc3BsaWNlKHRhcmdldEluZGV4LCAxKTtcbiAgICB9XG5cbiAgICB2YXIgaW5kZXggPSBlZGdlLnNvdXJjZS5vd25lci5nZXRFZGdlcygpLmluZGV4T2YoZWRnZSk7XG4gICAgaWYgKGluZGV4ID09IC0xKSB7XG4gICAgICB0aHJvdyBcIk5vdCBpbiBvd25lcidzIGVkZ2UgbGlzdCFcIjtcbiAgICB9XG5cbiAgICBlZGdlLnNvdXJjZS5vd25lci5nZXRFZGdlcygpLnNwbGljZShpbmRleCwgMSk7XG4gIH1cbn07XG5cbkxHcmFwaC5wcm90b3R5cGUudXBkYXRlTGVmdFRvcCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHRvcCA9IEludGVnZXIuTUFYX1ZBTFVFO1xuICB2YXIgbGVmdCA9IEludGVnZXIuTUFYX1ZBTFVFO1xuICB2YXIgbm9kZVRvcDtcbiAgdmFyIG5vZGVMZWZ0O1xuICB2YXIgbWFyZ2luO1xuXG4gIHZhciBub2RlcyA9IHRoaXMuZ2V0Tm9kZXMoKTtcbiAgdmFyIHMgPSBub2Rlcy5sZW5ndGg7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzOyBpKyspIHtcbiAgICB2YXIgbE5vZGUgPSBub2Rlc1tpXTtcbiAgICBub2RlVG9wID0gbE5vZGUuZ2V0VG9wKCk7XG4gICAgbm9kZUxlZnQgPSBsTm9kZS5nZXRMZWZ0KCk7XG5cbiAgICBpZiAodG9wID4gbm9kZVRvcCkge1xuICAgICAgdG9wID0gbm9kZVRvcDtcbiAgICB9XG5cbiAgICBpZiAobGVmdCA+IG5vZGVMZWZ0KSB7XG4gICAgICBsZWZ0ID0gbm9kZUxlZnQ7XG4gICAgfVxuICB9XG5cbiAgLy8gRG8gd2UgaGF2ZSBhbnkgbm9kZXMgaW4gdGhpcyBncmFwaD9cbiAgaWYgKHRvcCA9PSBJbnRlZ2VyLk1BWF9WQUxVRSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKG5vZGVzWzBdLmdldFBhcmVudCgpLnBhZGRpbmdMZWZ0ICE9IHVuZGVmaW5lZCkge1xuICAgIG1hcmdpbiA9IG5vZGVzWzBdLmdldFBhcmVudCgpLnBhZGRpbmdMZWZ0O1xuICB9IGVsc2Uge1xuICAgIG1hcmdpbiA9IHRoaXMubWFyZ2luO1xuICB9XG5cbiAgdGhpcy5sZWZ0ID0gbGVmdCAtIG1hcmdpbjtcbiAgdGhpcy50b3AgPSB0b3AgLSBtYXJnaW47XG5cbiAgLy8gQXBwbHkgdGhlIG1hcmdpbnMgYW5kIHJldHVybiB0aGUgcmVzdWx0XG4gIHJldHVybiBuZXcgUG9pbnQodGhpcy5sZWZ0LCB0aGlzLnRvcCk7XG59O1xuXG5MR3JhcGgucHJvdG90eXBlLnVwZGF0ZUJvdW5kcyA9IGZ1bmN0aW9uIChyZWN1cnNpdmUpIHtcbiAgLy8gY2FsY3VsYXRlIGJvdW5kc1xuICB2YXIgbGVmdCA9IEludGVnZXIuTUFYX1ZBTFVFO1xuICB2YXIgcmlnaHQgPSAtSW50ZWdlci5NQVhfVkFMVUU7XG4gIHZhciB0b3AgPSBJbnRlZ2VyLk1BWF9WQUxVRTtcbiAgdmFyIGJvdHRvbSA9IC1JbnRlZ2VyLk1BWF9WQUxVRTtcbiAgdmFyIG5vZGVMZWZ0O1xuICB2YXIgbm9kZVJpZ2h0O1xuICB2YXIgbm9kZVRvcDtcbiAgdmFyIG5vZGVCb3R0b207XG4gIHZhciBtYXJnaW47XG5cbiAgdmFyIG5vZGVzID0gdGhpcy5ub2RlcztcbiAgdmFyIHMgPSBub2Rlcy5sZW5ndGg7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgczsgaSsrKSB7XG4gICAgdmFyIGxOb2RlID0gbm9kZXNbaV07XG5cbiAgICBpZiAocmVjdXJzaXZlICYmIGxOb2RlLmNoaWxkICE9IG51bGwpIHtcbiAgICAgIGxOb2RlLnVwZGF0ZUJvdW5kcygpO1xuICAgIH1cbiAgICBub2RlTGVmdCA9IGxOb2RlLmdldExlZnQoKTtcbiAgICBub2RlUmlnaHQgPSBsTm9kZS5nZXRSaWdodCgpO1xuICAgIG5vZGVUb3AgPSBsTm9kZS5nZXRUb3AoKTtcbiAgICBub2RlQm90dG9tID0gbE5vZGUuZ2V0Qm90dG9tKCk7XG5cbiAgICBpZiAobGVmdCA+IG5vZGVMZWZ0KSB7XG4gICAgICBsZWZ0ID0gbm9kZUxlZnQ7XG4gICAgfVxuXG4gICAgaWYgKHJpZ2h0IDwgbm9kZVJpZ2h0KSB7XG4gICAgICByaWdodCA9IG5vZGVSaWdodDtcbiAgICB9XG5cbiAgICBpZiAodG9wID4gbm9kZVRvcCkge1xuICAgICAgdG9wID0gbm9kZVRvcDtcbiAgICB9XG5cbiAgICBpZiAoYm90dG9tIDwgbm9kZUJvdHRvbSkge1xuICAgICAgYm90dG9tID0gbm9kZUJvdHRvbTtcbiAgICB9XG4gIH1cblxuICB2YXIgYm91bmRpbmdSZWN0ID0gbmV3IFJlY3RhbmdsZUQobGVmdCwgdG9wLCByaWdodCAtIGxlZnQsIGJvdHRvbSAtIHRvcCk7XG4gIGlmIChsZWZ0ID09IEludGVnZXIuTUFYX1ZBTFVFKSB7XG4gICAgdGhpcy5sZWZ0ID0gdGhpcy5wYXJlbnQuZ2V0TGVmdCgpO1xuICAgIHRoaXMucmlnaHQgPSB0aGlzLnBhcmVudC5nZXRSaWdodCgpO1xuICAgIHRoaXMudG9wID0gdGhpcy5wYXJlbnQuZ2V0VG9wKCk7XG4gICAgdGhpcy5ib3R0b20gPSB0aGlzLnBhcmVudC5nZXRCb3R0b20oKTtcbiAgfVxuXG4gIGlmIChub2Rlc1swXS5nZXRQYXJlbnQoKS5wYWRkaW5nTGVmdCAhPSB1bmRlZmluZWQpIHtcbiAgICBtYXJnaW4gPSBub2Rlc1swXS5nZXRQYXJlbnQoKS5wYWRkaW5nTGVmdDtcbiAgfSBlbHNlIHtcbiAgICBtYXJnaW4gPSB0aGlzLm1hcmdpbjtcbiAgfVxuXG4gIHRoaXMubGVmdCA9IGJvdW5kaW5nUmVjdC54IC0gbWFyZ2luO1xuICB0aGlzLnJpZ2h0ID0gYm91bmRpbmdSZWN0LnggKyBib3VuZGluZ1JlY3Qud2lkdGggKyBtYXJnaW47XG4gIHRoaXMudG9wID0gYm91bmRpbmdSZWN0LnkgLSBtYXJnaW47XG4gIHRoaXMuYm90dG9tID0gYm91bmRpbmdSZWN0LnkgKyBib3VuZGluZ1JlY3QuaGVpZ2h0ICsgbWFyZ2luO1xufTtcblxuTEdyYXBoLmNhbGN1bGF0ZUJvdW5kcyA9IGZ1bmN0aW9uIChub2Rlcykge1xuICB2YXIgbGVmdCA9IEludGVnZXIuTUFYX1ZBTFVFO1xuICB2YXIgcmlnaHQgPSAtSW50ZWdlci5NQVhfVkFMVUU7XG4gIHZhciB0b3AgPSBJbnRlZ2VyLk1BWF9WQUxVRTtcbiAgdmFyIGJvdHRvbSA9IC1JbnRlZ2VyLk1BWF9WQUxVRTtcbiAgdmFyIG5vZGVMZWZ0O1xuICB2YXIgbm9kZVJpZ2h0O1xuICB2YXIgbm9kZVRvcDtcbiAgdmFyIG5vZGVCb3R0b207XG5cbiAgdmFyIHMgPSBub2Rlcy5sZW5ndGg7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzOyBpKyspIHtcbiAgICB2YXIgbE5vZGUgPSBub2Rlc1tpXTtcbiAgICBub2RlTGVmdCA9IGxOb2RlLmdldExlZnQoKTtcbiAgICBub2RlUmlnaHQgPSBsTm9kZS5nZXRSaWdodCgpO1xuICAgIG5vZGVUb3AgPSBsTm9kZS5nZXRUb3AoKTtcbiAgICBub2RlQm90dG9tID0gbE5vZGUuZ2V0Qm90dG9tKCk7XG5cbiAgICBpZiAobGVmdCA+IG5vZGVMZWZ0KSB7XG4gICAgICBsZWZ0ID0gbm9kZUxlZnQ7XG4gICAgfVxuXG4gICAgaWYgKHJpZ2h0IDwgbm9kZVJpZ2h0KSB7XG4gICAgICByaWdodCA9IG5vZGVSaWdodDtcbiAgICB9XG5cbiAgICBpZiAodG9wID4gbm9kZVRvcCkge1xuICAgICAgdG9wID0gbm9kZVRvcDtcbiAgICB9XG5cbiAgICBpZiAoYm90dG9tIDwgbm9kZUJvdHRvbSkge1xuICAgICAgYm90dG9tID0gbm9kZUJvdHRvbTtcbiAgICB9XG4gIH1cblxuICB2YXIgYm91bmRpbmdSZWN0ID0gbmV3IFJlY3RhbmdsZUQobGVmdCwgdG9wLCByaWdodCAtIGxlZnQsIGJvdHRvbSAtIHRvcCk7XG5cbiAgcmV0dXJuIGJvdW5kaW5nUmVjdDtcbn07XG5cbkxHcmFwaC5wcm90b3R5cGUuZ2V0SW5jbHVzaW9uVHJlZURlcHRoID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcyA9PSB0aGlzLmdyYXBoTWFuYWdlci5nZXRSb290KCkpIHtcbiAgICByZXR1cm4gMTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnQuZ2V0SW5jbHVzaW9uVHJlZURlcHRoKCk7XG4gIH1cbn07XG5cbkxHcmFwaC5wcm90b3R5cGUuZ2V0RXN0aW1hdGVkU2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuZXN0aW1hdGVkU2l6ZSA9PSBJbnRlZ2VyLk1JTl9WQUxVRSkge1xuICAgIHRocm93IFwiYXNzZXJ0IGZhaWxlZFwiO1xuICB9XG4gIHJldHVybiB0aGlzLmVzdGltYXRlZFNpemU7XG59O1xuXG5MR3JhcGgucHJvdG90eXBlLmNhbGNFc3RpbWF0ZWRTaXplID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2l6ZSA9IDA7XG4gIHZhciBub2RlcyA9IHRoaXMubm9kZXM7XG4gIHZhciBzID0gbm9kZXMubGVuZ3RoO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgczsgaSsrKSB7XG4gICAgdmFyIGxOb2RlID0gbm9kZXNbaV07XG4gICAgc2l6ZSArPSBsTm9kZS5jYWxjRXN0aW1hdGVkU2l6ZSgpO1xuICB9XG5cbiAgaWYgKHNpemUgPT0gMCkge1xuICAgIHRoaXMuZXN0aW1hdGVkU2l6ZSA9IExheW91dENvbnN0YW50cy5FTVBUWV9DT01QT1VORF9OT0RFX1NJWkU7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5lc3RpbWF0ZWRTaXplID0gc2l6ZSAvIE1hdGguc3FydCh0aGlzLm5vZGVzLmxlbmd0aCk7XG4gIH1cblxuICByZXR1cm4gdGhpcy5lc3RpbWF0ZWRTaXplO1xufTtcblxuTEdyYXBoLnByb3RvdHlwZS51cGRhdGVDb25uZWN0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgaWYgKHRoaXMubm9kZXMubGVuZ3RoID09IDApIHtcbiAgICB0aGlzLmlzQ29ubmVjdGVkID0gdHJ1ZTtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgcXVldWUgPSBuZXcgTGlua2VkTGlzdCgpO1xuICB2YXIgdmlzaXRlZCA9IG5ldyBTZXQoKTtcbiAgdmFyIGN1cnJlbnROb2RlID0gdGhpcy5ub2Rlc1swXTtcbiAgdmFyIG5laWdoYm9yRWRnZXM7XG4gIHZhciBjdXJyZW50TmVpZ2hib3I7XG4gIHZhciBjaGlsZHJlbk9mTm9kZSA9IGN1cnJlbnROb2RlLndpdGhDaGlsZHJlbigpO1xuICBjaGlsZHJlbk9mTm9kZS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgcXVldWUucHVzaChub2RlKTtcbiAgICB2aXNpdGVkLmFkZChub2RlKTtcbiAgfSk7XG5cbiAgd2hpbGUgKHF1ZXVlLmxlbmd0aCAhPT0gMCkge1xuICAgIGN1cnJlbnROb2RlID0gcXVldWUuc2hpZnQoKTtcblxuICAgIC8vIFRyYXZlcnNlIGFsbCBuZWlnaGJvcnMgb2YgdGhpcyBub2RlXG4gICAgbmVpZ2hib3JFZGdlcyA9IGN1cnJlbnROb2RlLmdldEVkZ2VzKCk7XG4gICAgdmFyIHNpemUgPSBuZWlnaGJvckVkZ2VzLmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7IGkrKykge1xuICAgICAgdmFyIG5laWdoYm9yRWRnZSA9IG5laWdoYm9yRWRnZXNbaV07XG4gICAgICBjdXJyZW50TmVpZ2hib3IgPSBuZWlnaGJvckVkZ2UuZ2V0T3RoZXJFbmRJbkdyYXBoKGN1cnJlbnROb2RlLCB0aGlzKTtcblxuICAgICAgLy8gQWRkIHVudmlzaXRlZCBuZWlnaGJvcnMgdG8gdGhlIGxpc3QgdG8gdmlzaXRcbiAgICAgIGlmIChjdXJyZW50TmVpZ2hib3IgIT0gbnVsbCAmJiAhdmlzaXRlZC5oYXMoY3VycmVudE5laWdoYm9yKSkge1xuICAgICAgICB2YXIgY2hpbGRyZW5PZk5laWdoYm9yID0gY3VycmVudE5laWdoYm9yLndpdGhDaGlsZHJlbigpO1xuXG4gICAgICAgIGNoaWxkcmVuT2ZOZWlnaGJvci5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgcXVldWUucHVzaChub2RlKTtcbiAgICAgICAgICB2aXNpdGVkLmFkZChub2RlKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdGhpcy5pc0Nvbm5lY3RlZCA9IGZhbHNlO1xuXG4gIGlmICh2aXNpdGVkLnNpemUgPj0gdGhpcy5ub2Rlcy5sZW5ndGgpIHtcbiAgICB2YXIgbm9PZlZpc2l0ZWRJblRoaXNHcmFwaCA9IDA7XG5cbiAgICB2aXNpdGVkLmZvckVhY2goZnVuY3Rpb24gKHZpc2l0ZWROb2RlKSB7XG4gICAgICBpZiAodmlzaXRlZE5vZGUub3duZXIgPT0gc2VsZikge1xuICAgICAgICBub09mVmlzaXRlZEluVGhpc0dyYXBoKys7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAobm9PZlZpc2l0ZWRJblRoaXNHcmFwaCA9PSB0aGlzLm5vZGVzLmxlbmd0aCkge1xuICAgICAgdGhpcy5pc0Nvbm5lY3RlZCA9IHRydWU7XG4gICAgfVxuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IExHcmFwaDtcblxuLyoqKi8gfSksXG4vKiA3ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBMR3JhcGg7XG52YXIgTEVkZ2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuXG5mdW5jdGlvbiBMR3JhcGhNYW5hZ2VyKGxheW91dCkge1xuICBMR3JhcGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpOyAvLyBJdCBtYXkgYmUgYmV0dGVyIHRvIGluaXRpbGl6ZSB0aGlzIG91dCBvZiB0aGlzIGZ1bmN0aW9uIGJ1dCBpdCBnaXZlcyBhbiBlcnJvciAoUmlnaHQtaGFuZCBzaWRlIG9mICdpbnN0YW5jZW9mJyBpcyBub3QgY2FsbGFibGUpIG5vdy5cbiAgdGhpcy5sYXlvdXQgPSBsYXlvdXQ7XG5cbiAgdGhpcy5ncmFwaHMgPSBbXTtcbiAgdGhpcy5lZGdlcyA9IFtdO1xufVxuXG5MR3JhcGhNYW5hZ2VyLnByb3RvdHlwZS5hZGRSb290ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbmdyYXBoID0gdGhpcy5sYXlvdXQubmV3R3JhcGgoKTtcbiAgdmFyIG5ub2RlID0gdGhpcy5sYXlvdXQubmV3Tm9kZShudWxsKTtcbiAgdmFyIHJvb3QgPSB0aGlzLmFkZChuZ3JhcGgsIG5ub2RlKTtcbiAgdGhpcy5zZXRSb290R3JhcGgocm9vdCk7XG4gIHJldHVybiB0aGlzLnJvb3RHcmFwaDtcbn07XG5cbkxHcmFwaE1hbmFnZXIucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChuZXdHcmFwaCwgcGFyZW50Tm9kZSwgbmV3RWRnZSwgc291cmNlTm9kZSwgdGFyZ2V0Tm9kZSkge1xuICAvL3RoZXJlIGFyZSBqdXN0IDIgcGFyYW1ldGVycyBhcmUgcGFzc2VkIHRoZW4gaXQgYWRkcyBhbiBMR3JhcGggZWxzZSBpdCBhZGRzIGFuIExFZGdlXG4gIGlmIChuZXdFZGdlID09IG51bGwgJiYgc291cmNlTm9kZSA9PSBudWxsICYmIHRhcmdldE5vZGUgPT0gbnVsbCkge1xuICAgIGlmIChuZXdHcmFwaCA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBcIkdyYXBoIGlzIG51bGwhXCI7XG4gICAgfVxuICAgIGlmIChwYXJlbnROb2RlID09IG51bGwpIHtcbiAgICAgIHRocm93IFwiUGFyZW50IG5vZGUgaXMgbnVsbCFcIjtcbiAgICB9XG4gICAgaWYgKHRoaXMuZ3JhcGhzLmluZGV4T2YobmV3R3JhcGgpID4gLTEpIHtcbiAgICAgIHRocm93IFwiR3JhcGggYWxyZWFkeSBpbiB0aGlzIGdyYXBoIG1nciFcIjtcbiAgICB9XG5cbiAgICB0aGlzLmdyYXBocy5wdXNoKG5ld0dyYXBoKTtcblxuICAgIGlmIChuZXdHcmFwaC5wYXJlbnQgIT0gbnVsbCkge1xuICAgICAgdGhyb3cgXCJBbHJlYWR5IGhhcyBhIHBhcmVudCFcIjtcbiAgICB9XG4gICAgaWYgKHBhcmVudE5vZGUuY2hpbGQgIT0gbnVsbCkge1xuICAgICAgdGhyb3cgXCJBbHJlYWR5IGhhcyBhIGNoaWxkIVwiO1xuICAgIH1cblxuICAgIG5ld0dyYXBoLnBhcmVudCA9IHBhcmVudE5vZGU7XG4gICAgcGFyZW50Tm9kZS5jaGlsZCA9IG5ld0dyYXBoO1xuXG4gICAgcmV0dXJuIG5ld0dyYXBoO1xuICB9IGVsc2Uge1xuICAgIC8vY2hhbmdlIHRoZSBvcmRlciBvZiB0aGUgcGFyYW1ldGVyc1xuICAgIHRhcmdldE5vZGUgPSBuZXdFZGdlO1xuICAgIHNvdXJjZU5vZGUgPSBwYXJlbnROb2RlO1xuICAgIG5ld0VkZ2UgPSBuZXdHcmFwaDtcbiAgICB2YXIgc291cmNlR3JhcGggPSBzb3VyY2VOb2RlLmdldE93bmVyKCk7XG4gICAgdmFyIHRhcmdldEdyYXBoID0gdGFyZ2V0Tm9kZS5nZXRPd25lcigpO1xuXG4gICAgaWYgKCEoc291cmNlR3JhcGggIT0gbnVsbCAmJiBzb3VyY2VHcmFwaC5nZXRHcmFwaE1hbmFnZXIoKSA9PSB0aGlzKSkge1xuICAgICAgdGhyb3cgXCJTb3VyY2Ugbm90IGluIHRoaXMgZ3JhcGggbWdyIVwiO1xuICAgIH1cbiAgICBpZiAoISh0YXJnZXRHcmFwaCAhPSBudWxsICYmIHRhcmdldEdyYXBoLmdldEdyYXBoTWFuYWdlcigpID09IHRoaXMpKSB7XG4gICAgICB0aHJvdyBcIlRhcmdldCBub3QgaW4gdGhpcyBncmFwaCBtZ3IhXCI7XG4gICAgfVxuXG4gICAgaWYgKHNvdXJjZUdyYXBoID09IHRhcmdldEdyYXBoKSB7XG4gICAgICBuZXdFZGdlLmlzSW50ZXJHcmFwaCA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHNvdXJjZUdyYXBoLmFkZChuZXdFZGdlLCBzb3VyY2VOb2RlLCB0YXJnZXROb2RlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3RWRnZS5pc0ludGVyR3JhcGggPSB0cnVlO1xuXG4gICAgICAvLyBzZXQgc291cmNlIGFuZCB0YXJnZXRcbiAgICAgIG5ld0VkZ2Uuc291cmNlID0gc291cmNlTm9kZTtcbiAgICAgIG5ld0VkZ2UudGFyZ2V0ID0gdGFyZ2V0Tm9kZTtcblxuICAgICAgLy8gYWRkIGVkZ2UgdG8gaW50ZXItZ3JhcGggZWRnZSBsaXN0XG4gICAgICBpZiAodGhpcy5lZGdlcy5pbmRleE9mKG5ld0VkZ2UpID4gLTEpIHtcbiAgICAgICAgdGhyb3cgXCJFZGdlIGFscmVhZHkgaW4gaW50ZXItZ3JhcGggZWRnZSBsaXN0IVwiO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmVkZ2VzLnB1c2gobmV3RWRnZSk7XG5cbiAgICAgIC8vIGFkZCBlZGdlIHRvIHNvdXJjZSBhbmQgdGFyZ2V0IGluY2lkZW5jeSBsaXN0c1xuICAgICAgaWYgKCEobmV3RWRnZS5zb3VyY2UgIT0gbnVsbCAmJiBuZXdFZGdlLnRhcmdldCAhPSBudWxsKSkge1xuICAgICAgICB0aHJvdyBcIkVkZ2Ugc291cmNlIGFuZC9vciB0YXJnZXQgaXMgbnVsbCFcIjtcbiAgICAgIH1cblxuICAgICAgaWYgKCEobmV3RWRnZS5zb3VyY2UuZWRnZXMuaW5kZXhPZihuZXdFZGdlKSA9PSAtMSAmJiBuZXdFZGdlLnRhcmdldC5lZGdlcy5pbmRleE9mKG5ld0VkZ2UpID09IC0xKSkge1xuICAgICAgICB0aHJvdyBcIkVkZ2UgYWxyZWFkeSBpbiBzb3VyY2UgYW5kL29yIHRhcmdldCBpbmNpZGVuY3kgbGlzdCFcIjtcbiAgICAgIH1cblxuICAgICAgbmV3RWRnZS5zb3VyY2UuZWRnZXMucHVzaChuZXdFZGdlKTtcbiAgICAgIG5ld0VkZ2UudGFyZ2V0LmVkZ2VzLnB1c2gobmV3RWRnZSk7XG5cbiAgICAgIHJldHVybiBuZXdFZGdlO1xuICAgIH1cbiAgfVxufTtcblxuTEdyYXBoTWFuYWdlci5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKGxPYmopIHtcbiAgaWYgKGxPYmogaW5zdGFuY2VvZiBMR3JhcGgpIHtcbiAgICB2YXIgZ3JhcGggPSBsT2JqO1xuICAgIGlmIChncmFwaC5nZXRHcmFwaE1hbmFnZXIoKSAhPSB0aGlzKSB7XG4gICAgICB0aHJvdyBcIkdyYXBoIG5vdCBpbiB0aGlzIGdyYXBoIG1nclwiO1xuICAgIH1cbiAgICBpZiAoIShncmFwaCA9PSB0aGlzLnJvb3RHcmFwaCB8fCBncmFwaC5wYXJlbnQgIT0gbnVsbCAmJiBncmFwaC5wYXJlbnQuZ3JhcGhNYW5hZ2VyID09IHRoaXMpKSB7XG4gICAgICB0aHJvdyBcIkludmFsaWQgcGFyZW50IG5vZGUhXCI7XG4gICAgfVxuXG4gICAgLy8gZmlyc3QgdGhlIGVkZ2VzIChtYWtlIGEgY29weSB0byBkbyBpdCBzYWZlbHkpXG4gICAgdmFyIGVkZ2VzVG9CZVJlbW92ZWQgPSBbXTtcblxuICAgIGVkZ2VzVG9CZVJlbW92ZWQgPSBlZGdlc1RvQmVSZW1vdmVkLmNvbmNhdChncmFwaC5nZXRFZGdlcygpKTtcblxuICAgIHZhciBlZGdlO1xuICAgIHZhciBzID0gZWRnZXNUb0JlUmVtb3ZlZC5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzOyBpKyspIHtcbiAgICAgIGVkZ2UgPSBlZGdlc1RvQmVSZW1vdmVkW2ldO1xuICAgICAgZ3JhcGgucmVtb3ZlKGVkZ2UpO1xuICAgIH1cblxuICAgIC8vIHRoZW4gdGhlIG5vZGVzIChtYWtlIGEgY29weSB0byBkbyBpdCBzYWZlbHkpXG4gICAgdmFyIG5vZGVzVG9CZVJlbW92ZWQgPSBbXTtcblxuICAgIG5vZGVzVG9CZVJlbW92ZWQgPSBub2Rlc1RvQmVSZW1vdmVkLmNvbmNhdChncmFwaC5nZXROb2RlcygpKTtcblxuICAgIHZhciBub2RlO1xuICAgIHMgPSBub2Rlc1RvQmVSZW1vdmVkLmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHM7IGkrKykge1xuICAgICAgbm9kZSA9IG5vZGVzVG9CZVJlbW92ZWRbaV07XG4gICAgICBncmFwaC5yZW1vdmUobm9kZSk7XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgaWYgZ3JhcGggaXMgdGhlIHJvb3RcbiAgICBpZiAoZ3JhcGggPT0gdGhpcy5yb290R3JhcGgpIHtcbiAgICAgIHRoaXMuc2V0Um9vdEdyYXBoKG51bGwpO1xuICAgIH1cblxuICAgIC8vIG5vdyByZW1vdmUgdGhlIGdyYXBoIGl0c2VsZlxuICAgIHZhciBpbmRleCA9IHRoaXMuZ3JhcGhzLmluZGV4T2YoZ3JhcGgpO1xuICAgIHRoaXMuZ3JhcGhzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAvLyBhbHNvIHJlc2V0IHRoZSBwYXJlbnQgb2YgdGhlIGdyYXBoXG4gICAgZ3JhcGgucGFyZW50ID0gbnVsbDtcbiAgfSBlbHNlIGlmIChsT2JqIGluc3RhbmNlb2YgTEVkZ2UpIHtcbiAgICBlZGdlID0gbE9iajtcbiAgICBpZiAoZWRnZSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBcIkVkZ2UgaXMgbnVsbCFcIjtcbiAgICB9XG4gICAgaWYgKCFlZGdlLmlzSW50ZXJHcmFwaCkge1xuICAgICAgdGhyb3cgXCJOb3QgYW4gaW50ZXItZ3JhcGggZWRnZSFcIjtcbiAgICB9XG4gICAgaWYgKCEoZWRnZS5zb3VyY2UgIT0gbnVsbCAmJiBlZGdlLnRhcmdldCAhPSBudWxsKSkge1xuICAgICAgdGhyb3cgXCJTb3VyY2UgYW5kL29yIHRhcmdldCBpcyBudWxsIVwiO1xuICAgIH1cblxuICAgIC8vIHJlbW92ZSBlZGdlIGZyb20gc291cmNlIGFuZCB0YXJnZXQgbm9kZXMnIGluY2lkZW5jeSBsaXN0c1xuXG4gICAgaWYgKCEoZWRnZS5zb3VyY2UuZWRnZXMuaW5kZXhPZihlZGdlKSAhPSAtMSAmJiBlZGdlLnRhcmdldC5lZGdlcy5pbmRleE9mKGVkZ2UpICE9IC0xKSkge1xuICAgICAgdGhyb3cgXCJTb3VyY2UgYW5kL29yIHRhcmdldCBkb2Vzbid0IGtub3cgdGhpcyBlZGdlIVwiO1xuICAgIH1cblxuICAgIHZhciBpbmRleCA9IGVkZ2Uuc291cmNlLmVkZ2VzLmluZGV4T2YoZWRnZSk7XG4gICAgZWRnZS5zb3VyY2UuZWRnZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICBpbmRleCA9IGVkZ2UudGFyZ2V0LmVkZ2VzLmluZGV4T2YoZWRnZSk7XG4gICAgZWRnZS50YXJnZXQuZWRnZXMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgIC8vIHJlbW92ZSBlZGdlIGZyb20gb3duZXIgZ3JhcGggbWFuYWdlcidzIGludGVyLWdyYXBoIGVkZ2UgbGlzdFxuXG4gICAgaWYgKCEoZWRnZS5zb3VyY2Uub3duZXIgIT0gbnVsbCAmJiBlZGdlLnNvdXJjZS5vd25lci5nZXRHcmFwaE1hbmFnZXIoKSAhPSBudWxsKSkge1xuICAgICAgdGhyb3cgXCJFZGdlIG93bmVyIGdyYXBoIG9yIG93bmVyIGdyYXBoIG1hbmFnZXIgaXMgbnVsbCFcIjtcbiAgICB9XG4gICAgaWYgKGVkZ2Uuc291cmNlLm93bmVyLmdldEdyYXBoTWFuYWdlcigpLmVkZ2VzLmluZGV4T2YoZWRnZSkgPT0gLTEpIHtcbiAgICAgIHRocm93IFwiTm90IGluIG93bmVyIGdyYXBoIG1hbmFnZXIncyBlZGdlIGxpc3QhXCI7XG4gICAgfVxuXG4gICAgdmFyIGluZGV4ID0gZWRnZS5zb3VyY2Uub3duZXIuZ2V0R3JhcGhNYW5hZ2VyKCkuZWRnZXMuaW5kZXhPZihlZGdlKTtcbiAgICBlZGdlLnNvdXJjZS5vd25lci5nZXRHcmFwaE1hbmFnZXIoKS5lZGdlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICB9XG59O1xuXG5MR3JhcGhNYW5hZ2VyLnByb3RvdHlwZS51cGRhdGVCb3VuZHMgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMucm9vdEdyYXBoLnVwZGF0ZUJvdW5kcyh0cnVlKTtcbn07XG5cbkxHcmFwaE1hbmFnZXIucHJvdG90eXBlLmdldEdyYXBocyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuZ3JhcGhzO1xufTtcblxuTEdyYXBoTWFuYWdlci5wcm90b3R5cGUuZ2V0QWxsTm9kZXMgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLmFsbE5vZGVzID09IG51bGwpIHtcbiAgICB2YXIgbm9kZUxpc3QgPSBbXTtcbiAgICB2YXIgZ3JhcGhzID0gdGhpcy5nZXRHcmFwaHMoKTtcbiAgICB2YXIgcyA9IGdyYXBocy5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzOyBpKyspIHtcbiAgICAgIG5vZGVMaXN0ID0gbm9kZUxpc3QuY29uY2F0KGdyYXBoc1tpXS5nZXROb2RlcygpKTtcbiAgICB9XG4gICAgdGhpcy5hbGxOb2RlcyA9IG5vZGVMaXN0O1xuICB9XG4gIHJldHVybiB0aGlzLmFsbE5vZGVzO1xufTtcblxuTEdyYXBoTWFuYWdlci5wcm90b3R5cGUucmVzZXRBbGxOb2RlcyA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5hbGxOb2RlcyA9IG51bGw7XG59O1xuXG5MR3JhcGhNYW5hZ2VyLnByb3RvdHlwZS5yZXNldEFsbEVkZ2VzID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmFsbEVkZ2VzID0gbnVsbDtcbn07XG5cbkxHcmFwaE1hbmFnZXIucHJvdG90eXBlLnJlc2V0QWxsTm9kZXNUb0FwcGx5R3Jhdml0YXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuYWxsTm9kZXNUb0FwcGx5R3Jhdml0YXRpb24gPSBudWxsO1xufTtcblxuTEdyYXBoTWFuYWdlci5wcm90b3R5cGUuZ2V0QWxsRWRnZXMgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLmFsbEVkZ2VzID09IG51bGwpIHtcbiAgICB2YXIgZWRnZUxpc3QgPSBbXTtcbiAgICB2YXIgZ3JhcGhzID0gdGhpcy5nZXRHcmFwaHMoKTtcbiAgICB2YXIgcyA9IGdyYXBocy5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBncmFwaHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGVkZ2VMaXN0ID0gZWRnZUxpc3QuY29uY2F0KGdyYXBoc1tpXS5nZXRFZGdlcygpKTtcbiAgICB9XG5cbiAgICBlZGdlTGlzdCA9IGVkZ2VMaXN0LmNvbmNhdCh0aGlzLmVkZ2VzKTtcblxuICAgIHRoaXMuYWxsRWRnZXMgPSBlZGdlTGlzdDtcbiAgfVxuICByZXR1cm4gdGhpcy5hbGxFZGdlcztcbn07XG5cbkxHcmFwaE1hbmFnZXIucHJvdG90eXBlLmdldEFsbE5vZGVzVG9BcHBseUdyYXZpdGF0aW9uID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5hbGxOb2Rlc1RvQXBwbHlHcmF2aXRhdGlvbjtcbn07XG5cbkxHcmFwaE1hbmFnZXIucHJvdG90eXBlLnNldEFsbE5vZGVzVG9BcHBseUdyYXZpdGF0aW9uID0gZnVuY3Rpb24gKG5vZGVMaXN0KSB7XG4gIGlmICh0aGlzLmFsbE5vZGVzVG9BcHBseUdyYXZpdGF0aW9uICE9IG51bGwpIHtcbiAgICB0aHJvdyBcImFzc2VydCBmYWlsZWRcIjtcbiAgfVxuXG4gIHRoaXMuYWxsTm9kZXNUb0FwcGx5R3Jhdml0YXRpb24gPSBub2RlTGlzdDtcbn07XG5cbkxHcmFwaE1hbmFnZXIucHJvdG90eXBlLmdldFJvb3QgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnJvb3RHcmFwaDtcbn07XG5cbkxHcmFwaE1hbmFnZXIucHJvdG90eXBlLnNldFJvb3RHcmFwaCA9IGZ1bmN0aW9uIChncmFwaCkge1xuICBpZiAoZ3JhcGguZ2V0R3JhcGhNYW5hZ2VyKCkgIT0gdGhpcykge1xuICAgIHRocm93IFwiUm9vdCBub3QgaW4gdGhpcyBncmFwaCBtZ3IhXCI7XG4gIH1cblxuICB0aGlzLnJvb3RHcmFwaCA9IGdyYXBoO1xuICAvLyByb290IGdyYXBoIG11c3QgaGF2ZSBhIHJvb3Qgbm9kZSBhc3NvY2lhdGVkIHdpdGggaXQgZm9yIGNvbnZlbmllbmNlXG4gIGlmIChncmFwaC5wYXJlbnQgPT0gbnVsbCkge1xuICAgIGdyYXBoLnBhcmVudCA9IHRoaXMubGF5b3V0Lm5ld05vZGUoXCJSb290IG5vZGVcIik7XG4gIH1cbn07XG5cbkxHcmFwaE1hbmFnZXIucHJvdG90eXBlLmdldExheW91dCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubGF5b3V0O1xufTtcblxuTEdyYXBoTWFuYWdlci5wcm90b3R5cGUuaXNPbmVBbmNlc3Rvck9mT3RoZXIgPSBmdW5jdGlvbiAoZmlyc3ROb2RlLCBzZWNvbmROb2RlKSB7XG4gIGlmICghKGZpcnN0Tm9kZSAhPSBudWxsICYmIHNlY29uZE5vZGUgIT0gbnVsbCkpIHtcbiAgICB0aHJvdyBcImFzc2VydCBmYWlsZWRcIjtcbiAgfVxuXG4gIGlmIChmaXJzdE5vZGUgPT0gc2Vjb25kTm9kZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8vIElzIHNlY29uZCBub2RlIGFuIGFuY2VzdG9yIG9mIHRoZSBmaXJzdCBvbmU/XG4gIHZhciBvd25lckdyYXBoID0gZmlyc3ROb2RlLmdldE93bmVyKCk7XG4gIHZhciBwYXJlbnROb2RlO1xuXG4gIGRvIHtcbiAgICBwYXJlbnROb2RlID0gb3duZXJHcmFwaC5nZXRQYXJlbnQoKTtcblxuICAgIGlmIChwYXJlbnROb2RlID09IG51bGwpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChwYXJlbnROb2RlID09IHNlY29uZE5vZGUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIG93bmVyR3JhcGggPSBwYXJlbnROb2RlLmdldE93bmVyKCk7XG4gICAgaWYgKG93bmVyR3JhcGggPT0gbnVsbCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9IHdoaWxlICh0cnVlKTtcbiAgLy8gSXMgZmlyc3Qgbm9kZSBhbiBhbmNlc3RvciBvZiB0aGUgc2Vjb25kIG9uZT9cbiAgb3duZXJHcmFwaCA9IHNlY29uZE5vZGUuZ2V0T3duZXIoKTtcblxuICBkbyB7XG4gICAgcGFyZW50Tm9kZSA9IG93bmVyR3JhcGguZ2V0UGFyZW50KCk7XG5cbiAgICBpZiAocGFyZW50Tm9kZSA9PSBudWxsKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAocGFyZW50Tm9kZSA9PSBmaXJzdE5vZGUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIG93bmVyR3JhcGggPSBwYXJlbnROb2RlLmdldE93bmVyKCk7XG4gICAgaWYgKG93bmVyR3JhcGggPT0gbnVsbCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9IHdoaWxlICh0cnVlKTtcblxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5MR3JhcGhNYW5hZ2VyLnByb3RvdHlwZS5jYWxjTG93ZXN0Q29tbW9uQW5jZXN0b3JzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZWRnZTtcbiAgdmFyIHNvdXJjZU5vZGU7XG4gIHZhciB0YXJnZXROb2RlO1xuICB2YXIgc291cmNlQW5jZXN0b3JHcmFwaDtcbiAgdmFyIHRhcmdldEFuY2VzdG9yR3JhcGg7XG5cbiAgdmFyIGVkZ2VzID0gdGhpcy5nZXRBbGxFZGdlcygpO1xuICB2YXIgcyA9IGVkZ2VzLmxlbmd0aDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzOyBpKyspIHtcbiAgICBlZGdlID0gZWRnZXNbaV07XG5cbiAgICBzb3VyY2VOb2RlID0gZWRnZS5zb3VyY2U7XG4gICAgdGFyZ2V0Tm9kZSA9IGVkZ2UudGFyZ2V0O1xuICAgIGVkZ2UubGNhID0gbnVsbDtcbiAgICBlZGdlLnNvdXJjZUluTGNhID0gc291cmNlTm9kZTtcbiAgICBlZGdlLnRhcmdldEluTGNhID0gdGFyZ2V0Tm9kZTtcblxuICAgIGlmIChzb3VyY2VOb2RlID09IHRhcmdldE5vZGUpIHtcbiAgICAgIGVkZ2UubGNhID0gc291cmNlTm9kZS5nZXRPd25lcigpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgc291cmNlQW5jZXN0b3JHcmFwaCA9IHNvdXJjZU5vZGUuZ2V0T3duZXIoKTtcblxuICAgIHdoaWxlIChlZGdlLmxjYSA9PSBudWxsKSB7XG4gICAgICBlZGdlLnRhcmdldEluTGNhID0gdGFyZ2V0Tm9kZTtcbiAgICAgIHRhcmdldEFuY2VzdG9yR3JhcGggPSB0YXJnZXROb2RlLmdldE93bmVyKCk7XG5cbiAgICAgIHdoaWxlIChlZGdlLmxjYSA9PSBudWxsKSB7XG4gICAgICAgIGlmICh0YXJnZXRBbmNlc3RvckdyYXBoID09IHNvdXJjZUFuY2VzdG9yR3JhcGgpIHtcbiAgICAgICAgICBlZGdlLmxjYSA9IHRhcmdldEFuY2VzdG9yR3JhcGg7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFyZ2V0QW5jZXN0b3JHcmFwaCA9PSB0aGlzLnJvb3RHcmFwaCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVkZ2UubGNhICE9IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBcImFzc2VydCBmYWlsZWRcIjtcbiAgICAgICAgfVxuICAgICAgICBlZGdlLnRhcmdldEluTGNhID0gdGFyZ2V0QW5jZXN0b3JHcmFwaC5nZXRQYXJlbnQoKTtcbiAgICAgICAgdGFyZ2V0QW5jZXN0b3JHcmFwaCA9IGVkZ2UudGFyZ2V0SW5MY2EuZ2V0T3duZXIoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNvdXJjZUFuY2VzdG9yR3JhcGggPT0gdGhpcy5yb290R3JhcGgpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmIChlZGdlLmxjYSA9PSBudWxsKSB7XG4gICAgICAgIGVkZ2Uuc291cmNlSW5MY2EgPSBzb3VyY2VBbmNlc3RvckdyYXBoLmdldFBhcmVudCgpO1xuICAgICAgICBzb3VyY2VBbmNlc3RvckdyYXBoID0gZWRnZS5zb3VyY2VJbkxjYS5nZXRPd25lcigpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlZGdlLmxjYSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBcImFzc2VydCBmYWlsZWRcIjtcbiAgICB9XG4gIH1cbn07XG5cbkxHcmFwaE1hbmFnZXIucHJvdG90eXBlLmNhbGNMb3dlc3RDb21tb25BbmNlc3RvciA9IGZ1bmN0aW9uIChmaXJzdE5vZGUsIHNlY29uZE5vZGUpIHtcbiAgaWYgKGZpcnN0Tm9kZSA9PSBzZWNvbmROb2RlKSB7XG4gICAgcmV0dXJuIGZpcnN0Tm9kZS5nZXRPd25lcigpO1xuICB9XG4gIHZhciBmaXJzdE93bmVyR3JhcGggPSBmaXJzdE5vZGUuZ2V0T3duZXIoKTtcblxuICBkbyB7XG4gICAgaWYgKGZpcnN0T3duZXJHcmFwaCA9PSBudWxsKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgdmFyIHNlY29uZE93bmVyR3JhcGggPSBzZWNvbmROb2RlLmdldE93bmVyKCk7XG5cbiAgICBkbyB7XG4gICAgICBpZiAoc2Vjb25kT3duZXJHcmFwaCA9PSBudWxsKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2Vjb25kT3duZXJHcmFwaCA9PSBmaXJzdE93bmVyR3JhcGgpIHtcbiAgICAgICAgcmV0dXJuIHNlY29uZE93bmVyR3JhcGg7XG4gICAgICB9XG4gICAgICBzZWNvbmRPd25lckdyYXBoID0gc2Vjb25kT3duZXJHcmFwaC5nZXRQYXJlbnQoKS5nZXRPd25lcigpO1xuICAgIH0gd2hpbGUgKHRydWUpO1xuXG4gICAgZmlyc3RPd25lckdyYXBoID0gZmlyc3RPd25lckdyYXBoLmdldFBhcmVudCgpLmdldE93bmVyKCk7XG4gIH0gd2hpbGUgKHRydWUpO1xuXG4gIHJldHVybiBmaXJzdE93bmVyR3JhcGg7XG59O1xuXG5MR3JhcGhNYW5hZ2VyLnByb3RvdHlwZS5jYWxjSW5jbHVzaW9uVHJlZURlcHRocyA9IGZ1bmN0aW9uIChncmFwaCwgZGVwdGgpIHtcbiAgaWYgKGdyYXBoID09IG51bGwgJiYgZGVwdGggPT0gbnVsbCkge1xuICAgIGdyYXBoID0gdGhpcy5yb290R3JhcGg7XG4gICAgZGVwdGggPSAxO1xuICB9XG4gIHZhciBub2RlO1xuXG4gIHZhciBub2RlcyA9IGdyYXBoLmdldE5vZGVzKCk7XG4gIHZhciBzID0gbm9kZXMubGVuZ3RoO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHM7IGkrKykge1xuICAgIG5vZGUgPSBub2Rlc1tpXTtcbiAgICBub2RlLmluY2x1c2lvblRyZWVEZXB0aCA9IGRlcHRoO1xuXG4gICAgaWYgKG5vZGUuY2hpbGQgIT0gbnVsbCkge1xuICAgICAgdGhpcy5jYWxjSW5jbHVzaW9uVHJlZURlcHRocyhub2RlLmNoaWxkLCBkZXB0aCArIDEpO1xuICAgIH1cbiAgfVxufTtcblxuTEdyYXBoTWFuYWdlci5wcm90b3R5cGUuaW5jbHVkZXNJbnZhbGlkRWRnZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGVkZ2U7XG4gIHZhciBlZGdlc1RvUmVtb3ZlID0gW107XG5cbiAgdmFyIHMgPSB0aGlzLmVkZ2VzLmxlbmd0aDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzOyBpKyspIHtcbiAgICBlZGdlID0gdGhpcy5lZGdlc1tpXTtcblxuICAgIGlmICh0aGlzLmlzT25lQW5jZXN0b3JPZk90aGVyKGVkZ2Uuc291cmNlLCBlZGdlLnRhcmdldCkpIHtcbiAgICAgIGVkZ2VzVG9SZW1vdmUucHVzaChlZGdlKTtcbiAgICB9XG4gIH1cblxuICAvLyBSZW1vdmUgaW52YWxpZCBlZGdlcyBmcm9tIGdyYXBoIG1hbmFnZXJcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlZGdlc1RvUmVtb3ZlLmxlbmd0aDsgaSsrKSB7XG4gICAgdGhpcy5yZW1vdmUoZWRnZXNUb1JlbW92ZVtpXSk7XG4gIH1cblxuICAvLyBJbnZhbGlkIGVkZ2VzIGFyZSBjbGVhcmVkLCBzbyByZXR1cm4gZmFsc2VcbiAgcmV0dXJuIGZhbHNlO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBMR3JhcGhNYW5hZ2VyO1xuXG4vKioqLyB9KSxcbi8qIDggKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuLyoqXG4gKiBUaGlzIGNsYXNzIG1haW50YWlucyBhIGxpc3Qgb2Ygc3RhdGljIGdlb21ldHJ5IHJlbGF0ZWQgdXRpbGl0eSBtZXRob2RzLlxuICpcbiAqXG4gKiBDb3B5cmlnaHQ6IGktVmlzIFJlc2VhcmNoIEdyb3VwLCBCaWxrZW50IFVuaXZlcnNpdHksIDIwMDcgLSBwcmVzZW50XG4gKi9cblxudmFyIFBvaW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMik7XG5cbmZ1bmN0aW9uIElHZW9tZXRyeSgpIHt9XG5cbi8qKlxuICogVGhpcyBtZXRob2QgY2FsY3VsYXRlcyAqaGFsZiogdGhlIGFtb3VudCBpbiB4IGFuZCB5IGRpcmVjdGlvbnMgb2YgdGhlIHR3b1xuICogaW5wdXQgcmVjdGFuZ2xlcyBuZWVkZWQgdG8gc2VwYXJhdGUgdGhlbSBrZWVwaW5nIHRoZWlyIHJlc3BlY3RpdmVcbiAqIHBvc2l0aW9uaW5nLCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGluIHRoZSBpbnB1dCBhcnJheS4gQW4gaW5wdXRcbiAqIHNlcGFyYXRpb24gYnVmZmVyIGFkZGVkIHRvIHRoZSBhbW91bnQgaW4gYm90aCBkaXJlY3Rpb25zLiBXZSBhc3N1bWUgdGhhdFxuICogdGhlIHR3byByZWN0YW5nbGVzIGRvIGludGVyc2VjdC5cbiAqL1xuSUdlb21ldHJ5LmNhbGNTZXBhcmF0aW9uQW1vdW50ID0gZnVuY3Rpb24gKHJlY3RBLCByZWN0Qiwgb3ZlcmxhcEFtb3VudCwgc2VwYXJhdGlvbkJ1ZmZlcikge1xuICBpZiAoIXJlY3RBLmludGVyc2VjdHMocmVjdEIpKSB7XG4gICAgdGhyb3cgXCJhc3NlcnQgZmFpbGVkXCI7XG4gIH1cblxuICB2YXIgZGlyZWN0aW9ucyA9IG5ldyBBcnJheSgyKTtcblxuICB0aGlzLmRlY2lkZURpcmVjdGlvbnNGb3JPdmVybGFwcGluZ05vZGVzKHJlY3RBLCByZWN0QiwgZGlyZWN0aW9ucyk7XG5cbiAgb3ZlcmxhcEFtb3VudFswXSA9IE1hdGgubWluKHJlY3RBLmdldFJpZ2h0KCksIHJlY3RCLmdldFJpZ2h0KCkpIC0gTWF0aC5tYXgocmVjdEEueCwgcmVjdEIueCk7XG4gIG92ZXJsYXBBbW91bnRbMV0gPSBNYXRoLm1pbihyZWN0QS5nZXRCb3R0b20oKSwgcmVjdEIuZ2V0Qm90dG9tKCkpIC0gTWF0aC5tYXgocmVjdEEueSwgcmVjdEIueSk7XG5cbiAgLy8gdXBkYXRlIHRoZSBvdmVybGFwcGluZyBhbW91bnRzIGZvciB0aGUgZm9sbG93aW5nIGNhc2VzOlxuICBpZiAocmVjdEEuZ2V0WCgpIDw9IHJlY3RCLmdldFgoKSAmJiByZWN0QS5nZXRSaWdodCgpID49IHJlY3RCLmdldFJpZ2h0KCkpIHtcbiAgICAvKiBDYXNlIHguMTpcbiAgICAqXG4gICAgKiByZWN0QVxuICAgICogXHR8ICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgKiBcdHwgICAgICAgIF9fX19fX19fXyAgICAgIHxcbiAgICAqIFx0fCAgICAgICAgfCAgICAgICB8ICAgICAgfFxuICAgICogXHR8X19fX19fX198X19fX19fX3xfX19fX198XG4gICAgKiBcdFx0XHQgfCAgICAgICB8XG4gICAgKiAgICAgICAgICAgfCAgICAgICB8XG4gICAgKiAgICAgICAgcmVjdEJcbiAgICAqL1xuICAgIG92ZXJsYXBBbW91bnRbMF0gKz0gTWF0aC5taW4ocmVjdEIuZ2V0WCgpIC0gcmVjdEEuZ2V0WCgpLCByZWN0QS5nZXRSaWdodCgpIC0gcmVjdEIuZ2V0UmlnaHQoKSk7XG4gIH0gZWxzZSBpZiAocmVjdEIuZ2V0WCgpIDw9IHJlY3RBLmdldFgoKSAmJiByZWN0Qi5nZXRSaWdodCgpID49IHJlY3RBLmdldFJpZ2h0KCkpIHtcbiAgICAvKiBDYXNlIHguMjpcbiAgICAqXG4gICAgKiByZWN0QlxuICAgICogXHR8ICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgKiBcdHwgICAgICAgIF9fX19fX19fXyAgICAgIHxcbiAgICAqIFx0fCAgICAgICAgfCAgICAgICB8ICAgICAgfFxuICAgICogXHR8X19fX19fX198X19fX19fX3xfX19fX198XG4gICAgKiBcdFx0XHQgfCAgICAgICB8XG4gICAgKiAgICAgICAgICAgfCAgICAgICB8XG4gICAgKiAgICAgICAgcmVjdEFcbiAgICAqL1xuICAgIG92ZXJsYXBBbW91bnRbMF0gKz0gTWF0aC5taW4ocmVjdEEuZ2V0WCgpIC0gcmVjdEIuZ2V0WCgpLCByZWN0Qi5nZXRSaWdodCgpIC0gcmVjdEEuZ2V0UmlnaHQoKSk7XG4gIH1cbiAgaWYgKHJlY3RBLmdldFkoKSA8PSByZWN0Qi5nZXRZKCkgJiYgcmVjdEEuZ2V0Qm90dG9tKCkgPj0gcmVjdEIuZ2V0Qm90dG9tKCkpIHtcbiAgICAvKiBDYXNlIHkuMTpcbiAgICAgKiAgICAgICAgICBfX19fX19fXyByZWN0QVxuICAgICAqICAgICAgICAgfFxuICAgICAqICAgICAgICAgfFxuICAgICAqICAgX19fX19ffF9fX18gIHJlY3RCXG4gICAgICogICAgICAgICB8ICAgIHxcbiAgICAgKiAgICAgICAgIHwgICAgfFxuICAgICAqICAgX19fX19ffF9fX198XG4gICAgICogICAgICAgICB8XG4gICAgICogICAgICAgICB8XG4gICAgICogICAgICAgICB8X19fX19fX19cbiAgICAgKlxuICAgICAqL1xuICAgIG92ZXJsYXBBbW91bnRbMV0gKz0gTWF0aC5taW4ocmVjdEIuZ2V0WSgpIC0gcmVjdEEuZ2V0WSgpLCByZWN0QS5nZXRCb3R0b20oKSAtIHJlY3RCLmdldEJvdHRvbSgpKTtcbiAgfSBlbHNlIGlmIChyZWN0Qi5nZXRZKCkgPD0gcmVjdEEuZ2V0WSgpICYmIHJlY3RCLmdldEJvdHRvbSgpID49IHJlY3RBLmdldEJvdHRvbSgpKSB7XG4gICAgLyogQ2FzZSB5LjI6XG4gICAgKiAgICAgICAgICBfX19fX19fXyByZWN0QlxuICAgICogICAgICAgICB8XG4gICAgKiAgICAgICAgIHxcbiAgICAqICAgX19fX19ffF9fX18gIHJlY3RBXG4gICAgKiAgICAgICAgIHwgICAgfFxuICAgICogICAgICAgICB8ICAgIHxcbiAgICAqICAgX19fX19ffF9fX198XG4gICAgKiAgICAgICAgIHxcbiAgICAqICAgICAgICAgfFxuICAgICogICAgICAgICB8X19fX19fX19cbiAgICAqXG4gICAgKi9cbiAgICBvdmVybGFwQW1vdW50WzFdICs9IE1hdGgubWluKHJlY3RBLmdldFkoKSAtIHJlY3RCLmdldFkoKSwgcmVjdEIuZ2V0Qm90dG9tKCkgLSByZWN0QS5nZXRCb3R0b20oKSk7XG4gIH1cblxuICAvLyBmaW5kIHNsb3BlIG9mIHRoZSBsaW5lIHBhc3NlcyB0d28gY2VudGVyc1xuICB2YXIgc2xvcGUgPSBNYXRoLmFicygocmVjdEIuZ2V0Q2VudGVyWSgpIC0gcmVjdEEuZ2V0Q2VudGVyWSgpKSAvIChyZWN0Qi5nZXRDZW50ZXJYKCkgLSByZWN0QS5nZXRDZW50ZXJYKCkpKTtcbiAgLy8gaWYgY2VudGVycyBhcmUgb3ZlcmxhcHBlZFxuICBpZiAocmVjdEIuZ2V0Q2VudGVyWSgpID09PSByZWN0QS5nZXRDZW50ZXJZKCkgJiYgcmVjdEIuZ2V0Q2VudGVyWCgpID09PSByZWN0QS5nZXRDZW50ZXJYKCkpIHtcbiAgICAvLyBhc3N1bWUgdGhlIHNsb3BlIGlzIDEgKDQ1IGRlZ3JlZSlcbiAgICBzbG9wZSA9IDEuMDtcbiAgfVxuXG4gIHZhciBtb3ZlQnlZID0gc2xvcGUgKiBvdmVybGFwQW1vdW50WzBdO1xuICB2YXIgbW92ZUJ5WCA9IG92ZXJsYXBBbW91bnRbMV0gLyBzbG9wZTtcbiAgaWYgKG92ZXJsYXBBbW91bnRbMF0gPCBtb3ZlQnlYKSB7XG4gICAgbW92ZUJ5WCA9IG92ZXJsYXBBbW91bnRbMF07XG4gIH0gZWxzZSB7XG4gICAgbW92ZUJ5WSA9IG92ZXJsYXBBbW91bnRbMV07XG4gIH1cbiAgLy8gcmV0dXJuIGhhbGYgdGhlIGFtb3VudCBzbyB0aGF0IGlmIGVhY2ggcmVjdGFuZ2xlIGlzIG1vdmVkIGJ5IHRoZXNlXG4gIC8vIGFtb3VudHMgaW4gb3Bwb3NpdGUgZGlyZWN0aW9ucywgb3ZlcmxhcCB3aWxsIGJlIHJlc29sdmVkXG4gIG92ZXJsYXBBbW91bnRbMF0gPSAtMSAqIGRpcmVjdGlvbnNbMF0gKiAobW92ZUJ5WCAvIDIgKyBzZXBhcmF0aW9uQnVmZmVyKTtcbiAgb3ZlcmxhcEFtb3VudFsxXSA9IC0xICogZGlyZWN0aW9uc1sxXSAqIChtb3ZlQnlZIC8gMiArIHNlcGFyYXRpb25CdWZmZXIpO1xufTtcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBkZWNpZGVzIHRoZSBzZXBhcmF0aW9uIGRpcmVjdGlvbiBvZiBvdmVybGFwcGluZyBub2Rlc1xuICpcbiAqIGlmIGRpcmVjdGlvbnNbMF0gPSAtMSwgdGhlbiByZWN0QSBnb2VzIGxlZnRcbiAqIGlmIGRpcmVjdGlvbnNbMF0gPSAxLCAgdGhlbiByZWN0QSBnb2VzIHJpZ2h0XG4gKiBpZiBkaXJlY3Rpb25zWzFdID0gLTEsIHRoZW4gcmVjdEEgZ29lcyB1cFxuICogaWYgZGlyZWN0aW9uc1sxXSA9IDEsICB0aGVuIHJlY3RBIGdvZXMgZG93blxuICovXG5JR2VvbWV0cnkuZGVjaWRlRGlyZWN0aW9uc0Zvck92ZXJsYXBwaW5nTm9kZXMgPSBmdW5jdGlvbiAocmVjdEEsIHJlY3RCLCBkaXJlY3Rpb25zKSB7XG4gIGlmIChyZWN0QS5nZXRDZW50ZXJYKCkgPCByZWN0Qi5nZXRDZW50ZXJYKCkpIHtcbiAgICBkaXJlY3Rpb25zWzBdID0gLTE7XG4gIH0gZWxzZSB7XG4gICAgZGlyZWN0aW9uc1swXSA9IDE7XG4gIH1cblxuICBpZiAocmVjdEEuZ2V0Q2VudGVyWSgpIDwgcmVjdEIuZ2V0Q2VudGVyWSgpKSB7XG4gICAgZGlyZWN0aW9uc1sxXSA9IC0xO1xuICB9IGVsc2Uge1xuICAgIGRpcmVjdGlvbnNbMV0gPSAxO1xuICB9XG59O1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGNhbGN1bGF0ZXMgdGhlIGludGVyc2VjdGlvbiAoY2xpcHBpbmcpIHBvaW50cyBvZiB0aGUgdHdvXG4gKiBpbnB1dCByZWN0YW5nbGVzIHdpdGggbGluZSBzZWdtZW50IGRlZmluZWQgYnkgdGhlIGNlbnRlcnMgb2YgdGhlc2UgdHdvXG4gKiByZWN0YW5nbGVzLiBUaGUgY2xpcHBpbmcgcG9pbnRzIGFyZSBzYXZlZCBpbiB0aGUgaW5wdXQgZG91YmxlIGFycmF5IGFuZFxuICogd2hldGhlciBvciBub3QgdGhlIHR3byByZWN0YW5nbGVzIG92ZXJsYXAgaXMgcmV0dXJuZWQuXG4gKi9cbklHZW9tZXRyeS5nZXRJbnRlcnNlY3Rpb24yID0gZnVuY3Rpb24gKHJlY3RBLCByZWN0QiwgcmVzdWx0KSB7XG4gIC8vcmVzdWx0WzAtMV0gd2lsbCBjb250YWluIGNsaXBQb2ludCBvZiByZWN0QSwgcmVzdWx0WzItM10gd2lsbCBjb250YWluIGNsaXBQb2ludCBvZiByZWN0QlxuICB2YXIgcDF4ID0gcmVjdEEuZ2V0Q2VudGVyWCgpO1xuICB2YXIgcDF5ID0gcmVjdEEuZ2V0Q2VudGVyWSgpO1xuICB2YXIgcDJ4ID0gcmVjdEIuZ2V0Q2VudGVyWCgpO1xuICB2YXIgcDJ5ID0gcmVjdEIuZ2V0Q2VudGVyWSgpO1xuXG4gIC8vaWYgdHdvIHJlY3RhbmdsZXMgaW50ZXJzZWN0LCB0aGVuIGNsaXBwaW5nIHBvaW50cyBhcmUgY2VudGVyc1xuICBpZiAocmVjdEEuaW50ZXJzZWN0cyhyZWN0QikpIHtcbiAgICByZXN1bHRbMF0gPSBwMXg7XG4gICAgcmVzdWx0WzFdID0gcDF5O1xuICAgIHJlc3VsdFsyXSA9IHAyeDtcbiAgICByZXN1bHRbM10gPSBwMnk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLy92YXJpYWJsZXMgZm9yIHJlY3RBXG4gIHZhciB0b3BMZWZ0QXggPSByZWN0QS5nZXRYKCk7XG4gIHZhciB0b3BMZWZ0QXkgPSByZWN0QS5nZXRZKCk7XG4gIHZhciB0b3BSaWdodEF4ID0gcmVjdEEuZ2V0UmlnaHQoKTtcbiAgdmFyIGJvdHRvbUxlZnRBeCA9IHJlY3RBLmdldFgoKTtcbiAgdmFyIGJvdHRvbUxlZnRBeSA9IHJlY3RBLmdldEJvdHRvbSgpO1xuICB2YXIgYm90dG9tUmlnaHRBeCA9IHJlY3RBLmdldFJpZ2h0KCk7XG4gIHZhciBoYWxmV2lkdGhBID0gcmVjdEEuZ2V0V2lkdGhIYWxmKCk7XG4gIHZhciBoYWxmSGVpZ2h0QSA9IHJlY3RBLmdldEhlaWdodEhhbGYoKTtcbiAgLy92YXJpYWJsZXMgZm9yIHJlY3RCXG4gIHZhciB0b3BMZWZ0QnggPSByZWN0Qi5nZXRYKCk7XG4gIHZhciB0b3BMZWZ0QnkgPSByZWN0Qi5nZXRZKCk7XG4gIHZhciB0b3BSaWdodEJ4ID0gcmVjdEIuZ2V0UmlnaHQoKTtcbiAgdmFyIGJvdHRvbUxlZnRCeCA9IHJlY3RCLmdldFgoKTtcbiAgdmFyIGJvdHRvbUxlZnRCeSA9IHJlY3RCLmdldEJvdHRvbSgpO1xuICB2YXIgYm90dG9tUmlnaHRCeCA9IHJlY3RCLmdldFJpZ2h0KCk7XG4gIHZhciBoYWxmV2lkdGhCID0gcmVjdEIuZ2V0V2lkdGhIYWxmKCk7XG4gIHZhciBoYWxmSGVpZ2h0QiA9IHJlY3RCLmdldEhlaWdodEhhbGYoKTtcblxuICAvL2ZsYWcgd2hldGhlciBjbGlwcGluZyBwb2ludHMgYXJlIGZvdW5kXG4gIHZhciBjbGlwUG9pbnRBRm91bmQgPSBmYWxzZTtcbiAgdmFyIGNsaXBQb2ludEJGb3VuZCA9IGZhbHNlO1xuXG4gIC8vIGxpbmUgaXMgdmVydGljYWxcbiAgaWYgKHAxeCA9PT0gcDJ4KSB7XG4gICAgaWYgKHAxeSA+IHAyeSkge1xuICAgICAgcmVzdWx0WzBdID0gcDF4O1xuICAgICAgcmVzdWx0WzFdID0gdG9wTGVmdEF5O1xuICAgICAgcmVzdWx0WzJdID0gcDJ4O1xuICAgICAgcmVzdWx0WzNdID0gYm90dG9tTGVmdEJ5O1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSBpZiAocDF5IDwgcDJ5KSB7XG4gICAgICByZXN1bHRbMF0gPSBwMXg7XG4gICAgICByZXN1bHRbMV0gPSBib3R0b21MZWZ0QXk7XG4gICAgICByZXN1bHRbMl0gPSBwMng7XG4gICAgICByZXN1bHRbM10gPSB0b3BMZWZ0Qnk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vbm90IGxpbmUsIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuICAvLyBsaW5lIGlzIGhvcml6b250YWxcbiAgZWxzZSBpZiAocDF5ID09PSBwMnkpIHtcbiAgICAgIGlmIChwMXggPiBwMngpIHtcbiAgICAgICAgcmVzdWx0WzBdID0gdG9wTGVmdEF4O1xuICAgICAgICByZXN1bHRbMV0gPSBwMXk7XG4gICAgICAgIHJlc3VsdFsyXSA9IHRvcFJpZ2h0Qng7XG4gICAgICAgIHJlc3VsdFszXSA9IHAyeTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSBlbHNlIGlmIChwMXggPCBwMngpIHtcbiAgICAgICAgcmVzdWx0WzBdID0gdG9wUmlnaHRBeDtcbiAgICAgICAgcmVzdWx0WzFdID0gcDF5O1xuICAgICAgICByZXN1bHRbMl0gPSB0b3BMZWZ0Qng7XG4gICAgICAgIHJlc3VsdFszXSA9IHAyeTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy9ub3QgdmFsaWQgbGluZSwgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vc2xvcGVzIG9mIHJlY3RBJ3MgYW5kIHJlY3RCJ3MgZGlhZ29uYWxzXG4gICAgICB2YXIgc2xvcGVBID0gcmVjdEEuaGVpZ2h0IC8gcmVjdEEud2lkdGg7XG4gICAgICB2YXIgc2xvcGVCID0gcmVjdEIuaGVpZ2h0IC8gcmVjdEIud2lkdGg7XG5cbiAgICAgIC8vc2xvcGUgb2YgbGluZSBiZXR3ZWVuIGNlbnRlciBvZiByZWN0QSBhbmQgY2VudGVyIG9mIHJlY3RCXG4gICAgICB2YXIgc2xvcGVQcmltZSA9IChwMnkgLSBwMXkpIC8gKHAyeCAtIHAxeCk7XG4gICAgICB2YXIgY2FyZGluYWxEaXJlY3Rpb25BID0gdm9pZCAwO1xuICAgICAgdmFyIGNhcmRpbmFsRGlyZWN0aW9uQiA9IHZvaWQgMDtcbiAgICAgIHZhciB0ZW1wUG9pbnRBeCA9IHZvaWQgMDtcbiAgICAgIHZhciB0ZW1wUG9pbnRBeSA9IHZvaWQgMDtcbiAgICAgIHZhciB0ZW1wUG9pbnRCeCA9IHZvaWQgMDtcbiAgICAgIHZhciB0ZW1wUG9pbnRCeSA9IHZvaWQgMDtcblxuICAgICAgLy9kZXRlcm1pbmUgd2hldGhlciBjbGlwcGluZyBwb2ludCBpcyB0aGUgY29ybmVyIG9mIG5vZGVBXG4gICAgICBpZiAoLXNsb3BlQSA9PT0gc2xvcGVQcmltZSkge1xuICAgICAgICBpZiAocDF4ID4gcDJ4KSB7XG4gICAgICAgICAgcmVzdWx0WzBdID0gYm90dG9tTGVmdEF4O1xuICAgICAgICAgIHJlc3VsdFsxXSA9IGJvdHRvbUxlZnRBeTtcbiAgICAgICAgICBjbGlwUG9pbnRBRm91bmQgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdFswXSA9IHRvcFJpZ2h0QXg7XG4gICAgICAgICAgcmVzdWx0WzFdID0gdG9wTGVmdEF5O1xuICAgICAgICAgIGNsaXBQb2ludEFGb3VuZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc2xvcGVBID09PSBzbG9wZVByaW1lKSB7XG4gICAgICAgIGlmIChwMXggPiBwMngpIHtcbiAgICAgICAgICByZXN1bHRbMF0gPSB0b3BMZWZ0QXg7XG4gICAgICAgICAgcmVzdWx0WzFdID0gdG9wTGVmdEF5O1xuICAgICAgICAgIGNsaXBQb2ludEFGb3VuZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0WzBdID0gYm90dG9tUmlnaHRBeDtcbiAgICAgICAgICByZXN1bHRbMV0gPSBib3R0b21MZWZ0QXk7XG4gICAgICAgICAgY2xpcFBvaW50QUZvdW5kID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvL2RldGVybWluZSB3aGV0aGVyIGNsaXBwaW5nIHBvaW50IGlzIHRoZSBjb3JuZXIgb2Ygbm9kZUJcbiAgICAgIGlmICgtc2xvcGVCID09PSBzbG9wZVByaW1lKSB7XG4gICAgICAgIGlmIChwMnggPiBwMXgpIHtcbiAgICAgICAgICByZXN1bHRbMl0gPSBib3R0b21MZWZ0Qng7XG4gICAgICAgICAgcmVzdWx0WzNdID0gYm90dG9tTGVmdEJ5O1xuICAgICAgICAgIGNsaXBQb2ludEJGb3VuZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0WzJdID0gdG9wUmlnaHRCeDtcbiAgICAgICAgICByZXN1bHRbM10gPSB0b3BMZWZ0Qnk7XG4gICAgICAgICAgY2xpcFBvaW50QkZvdW5kID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzbG9wZUIgPT09IHNsb3BlUHJpbWUpIHtcbiAgICAgICAgaWYgKHAyeCA+IHAxeCkge1xuICAgICAgICAgIHJlc3VsdFsyXSA9IHRvcExlZnRCeDtcbiAgICAgICAgICByZXN1bHRbM10gPSB0b3BMZWZ0Qnk7XG4gICAgICAgICAgY2xpcFBvaW50QkZvdW5kID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHRbMl0gPSBib3R0b21SaWdodEJ4O1xuICAgICAgICAgIHJlc3VsdFszXSA9IGJvdHRvbUxlZnRCeTtcbiAgICAgICAgICBjbGlwUG9pbnRCRm91bmQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vaWYgYm90aCBjbGlwcGluZyBwb2ludHMgYXJlIGNvcm5lcnNcbiAgICAgIGlmIChjbGlwUG9pbnRBRm91bmQgJiYgY2xpcFBvaW50QkZvdW5kKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy9kZXRlcm1pbmUgQ2FyZGluYWwgRGlyZWN0aW9uIG9mIHJlY3RhbmdsZXNcbiAgICAgIGlmIChwMXggPiBwMngpIHtcbiAgICAgICAgaWYgKHAxeSA+IHAyeSkge1xuICAgICAgICAgIGNhcmRpbmFsRGlyZWN0aW9uQSA9IHRoaXMuZ2V0Q2FyZGluYWxEaXJlY3Rpb24oc2xvcGVBLCBzbG9wZVByaW1lLCA0KTtcbiAgICAgICAgICBjYXJkaW5hbERpcmVjdGlvbkIgPSB0aGlzLmdldENhcmRpbmFsRGlyZWN0aW9uKHNsb3BlQiwgc2xvcGVQcmltZSwgMik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2FyZGluYWxEaXJlY3Rpb25BID0gdGhpcy5nZXRDYXJkaW5hbERpcmVjdGlvbigtc2xvcGVBLCBzbG9wZVByaW1lLCAzKTtcbiAgICAgICAgICBjYXJkaW5hbERpcmVjdGlvbkIgPSB0aGlzLmdldENhcmRpbmFsRGlyZWN0aW9uKC1zbG9wZUIsIHNsb3BlUHJpbWUsIDEpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocDF5ID4gcDJ5KSB7XG4gICAgICAgICAgY2FyZGluYWxEaXJlY3Rpb25BID0gdGhpcy5nZXRDYXJkaW5hbERpcmVjdGlvbigtc2xvcGVBLCBzbG9wZVByaW1lLCAxKTtcbiAgICAgICAgICBjYXJkaW5hbERpcmVjdGlvbkIgPSB0aGlzLmdldENhcmRpbmFsRGlyZWN0aW9uKC1zbG9wZUIsIHNsb3BlUHJpbWUsIDMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhcmRpbmFsRGlyZWN0aW9uQSA9IHRoaXMuZ2V0Q2FyZGluYWxEaXJlY3Rpb24oc2xvcGVBLCBzbG9wZVByaW1lLCAyKTtcbiAgICAgICAgICBjYXJkaW5hbERpcmVjdGlvbkIgPSB0aGlzLmdldENhcmRpbmFsRGlyZWN0aW9uKHNsb3BlQiwgc2xvcGVQcmltZSwgNCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vY2FsY3VsYXRlIGNsaXBwaW5nIFBvaW50IGlmIGl0IGlzIG5vdCBmb3VuZCBiZWZvcmVcbiAgICAgIGlmICghY2xpcFBvaW50QUZvdW5kKSB7XG4gICAgICAgIHN3aXRjaCAoY2FyZGluYWxEaXJlY3Rpb25BKSB7XG4gICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgdGVtcFBvaW50QXkgPSB0b3BMZWZ0QXk7XG4gICAgICAgICAgICB0ZW1wUG9pbnRBeCA9IHAxeCArIC1oYWxmSGVpZ2h0QSAvIHNsb3BlUHJpbWU7XG4gICAgICAgICAgICByZXN1bHRbMF0gPSB0ZW1wUG9pbnRBeDtcbiAgICAgICAgICAgIHJlc3VsdFsxXSA9IHRlbXBQb2ludEF5O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgdGVtcFBvaW50QXggPSBib3R0b21SaWdodEF4O1xuICAgICAgICAgICAgdGVtcFBvaW50QXkgPSBwMXkgKyBoYWxmV2lkdGhBICogc2xvcGVQcmltZTtcbiAgICAgICAgICAgIHJlc3VsdFswXSA9IHRlbXBQb2ludEF4O1xuICAgICAgICAgICAgcmVzdWx0WzFdID0gdGVtcFBvaW50QXk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICB0ZW1wUG9pbnRBeSA9IGJvdHRvbUxlZnRBeTtcbiAgICAgICAgICAgIHRlbXBQb2ludEF4ID0gcDF4ICsgaGFsZkhlaWdodEEgLyBzbG9wZVByaW1lO1xuICAgICAgICAgICAgcmVzdWx0WzBdID0gdGVtcFBvaW50QXg7XG4gICAgICAgICAgICByZXN1bHRbMV0gPSB0ZW1wUG9pbnRBeTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIHRlbXBQb2ludEF4ID0gYm90dG9tTGVmdEF4O1xuICAgICAgICAgICAgdGVtcFBvaW50QXkgPSBwMXkgKyAtaGFsZldpZHRoQSAqIHNsb3BlUHJpbWU7XG4gICAgICAgICAgICByZXN1bHRbMF0gPSB0ZW1wUG9pbnRBeDtcbiAgICAgICAgICAgIHJlc3VsdFsxXSA9IHRlbXBQb2ludEF5O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghY2xpcFBvaW50QkZvdW5kKSB7XG4gICAgICAgIHN3aXRjaCAoY2FyZGluYWxEaXJlY3Rpb25CKSB7XG4gICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgdGVtcFBvaW50QnkgPSB0b3BMZWZ0Qnk7XG4gICAgICAgICAgICB0ZW1wUG9pbnRCeCA9IHAyeCArIC1oYWxmSGVpZ2h0QiAvIHNsb3BlUHJpbWU7XG4gICAgICAgICAgICByZXN1bHRbMl0gPSB0ZW1wUG9pbnRCeDtcbiAgICAgICAgICAgIHJlc3VsdFszXSA9IHRlbXBQb2ludEJ5O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgdGVtcFBvaW50QnggPSBib3R0b21SaWdodEJ4O1xuICAgICAgICAgICAgdGVtcFBvaW50QnkgPSBwMnkgKyBoYWxmV2lkdGhCICogc2xvcGVQcmltZTtcbiAgICAgICAgICAgIHJlc3VsdFsyXSA9IHRlbXBQb2ludEJ4O1xuICAgICAgICAgICAgcmVzdWx0WzNdID0gdGVtcFBvaW50Qnk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICB0ZW1wUG9pbnRCeSA9IGJvdHRvbUxlZnRCeTtcbiAgICAgICAgICAgIHRlbXBQb2ludEJ4ID0gcDJ4ICsgaGFsZkhlaWdodEIgLyBzbG9wZVByaW1lO1xuICAgICAgICAgICAgcmVzdWx0WzJdID0gdGVtcFBvaW50Qng7XG4gICAgICAgICAgICByZXN1bHRbM10gPSB0ZW1wUG9pbnRCeTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIHRlbXBQb2ludEJ4ID0gYm90dG9tTGVmdEJ4O1xuICAgICAgICAgICAgdGVtcFBvaW50QnkgPSBwMnkgKyAtaGFsZldpZHRoQiAqIHNsb3BlUHJpbWU7XG4gICAgICAgICAgICByZXN1bHRbMl0gPSB0ZW1wUG9pbnRCeDtcbiAgICAgICAgICAgIHJlc3VsdFszXSA9IHRlbXBQb2ludEJ5O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogVGhpcyBtZXRob2QgcmV0dXJucyBpbiB3aGljaCBjYXJkaW5hbCBkaXJlY3Rpb24gZG9lcyBpbnB1dCBwb2ludCBzdGF5c1xuICogMTogTm9ydGhcbiAqIDI6IEVhc3RcbiAqIDM6IFNvdXRoXG4gKiA0OiBXZXN0XG4gKi9cbklHZW9tZXRyeS5nZXRDYXJkaW5hbERpcmVjdGlvbiA9IGZ1bmN0aW9uIChzbG9wZSwgc2xvcGVQcmltZSwgbGluZSkge1xuICBpZiAoc2xvcGUgPiBzbG9wZVByaW1lKSB7XG4gICAgcmV0dXJuIGxpbmU7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIDEgKyBsaW5lICUgNDtcbiAgfVxufTtcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBjYWxjdWxhdGVzIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIHR3byBsaW5lcyBkZWZpbmVkIGJ5XG4gKiBwb2ludCBwYWlycyAoczEsczIpIGFuZCAoZjEsZjIpLlxuICovXG5JR2VvbWV0cnkuZ2V0SW50ZXJzZWN0aW9uID0gZnVuY3Rpb24gKHMxLCBzMiwgZjEsIGYyKSB7XG4gIGlmIChmMiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SW50ZXJzZWN0aW9uMihzMSwgczIsIGYxKTtcbiAgfVxuXG4gIHZhciB4MSA9IHMxLng7XG4gIHZhciB5MSA9IHMxLnk7XG4gIHZhciB4MiA9IHMyLng7XG4gIHZhciB5MiA9IHMyLnk7XG4gIHZhciB4MyA9IGYxLng7XG4gIHZhciB5MyA9IGYxLnk7XG4gIHZhciB4NCA9IGYyLng7XG4gIHZhciB5NCA9IGYyLnk7XG4gIHZhciB4ID0gdm9pZCAwLFxuICAgICAgeSA9IHZvaWQgMDsgLy8gaW50ZXJzZWN0aW9uIHBvaW50XG4gIHZhciBhMSA9IHZvaWQgMCxcbiAgICAgIGEyID0gdm9pZCAwLFxuICAgICAgYjEgPSB2b2lkIDAsXG4gICAgICBiMiA9IHZvaWQgMCxcbiAgICAgIGMxID0gdm9pZCAwLFxuICAgICAgYzIgPSB2b2lkIDA7IC8vIGNvZWZmaWNpZW50cyBvZiBsaW5lIGVxbnMuXG4gIHZhciBkZW5vbSA9IHZvaWQgMDtcblxuICBhMSA9IHkyIC0geTE7XG4gIGIxID0geDEgLSB4MjtcbiAgYzEgPSB4MiAqIHkxIC0geDEgKiB5MjsgLy8geyBhMSp4ICsgYjEqeSArIGMxID0gMCBpcyBsaW5lIDEgfVxuXG4gIGEyID0geTQgLSB5MztcbiAgYjIgPSB4MyAtIHg0O1xuICBjMiA9IHg0ICogeTMgLSB4MyAqIHk0OyAvLyB7IGEyKnggKyBiMip5ICsgYzIgPSAwIGlzIGxpbmUgMiB9XG5cbiAgZGVub20gPSBhMSAqIGIyIC0gYTIgKiBiMTtcblxuICBpZiAoZGVub20gPT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHggPSAoYjEgKiBjMiAtIGIyICogYzEpIC8gZGVub207XG4gIHkgPSAoYTIgKiBjMSAtIGExICogYzIpIC8gZGVub207XG5cbiAgcmV0dXJuIG5ldyBQb2ludCh4LCB5KTtcbn07XG5cbi8qKlxuICogVGhpcyBtZXRob2QgZmluZHMgYW5kIHJldHVybnMgdGhlIGFuZ2xlIG9mIHRoZSB2ZWN0b3IgZnJvbSB0aGUgKyB4LWF4aXNcbiAqIGluIGNsb2Nrd2lzZSBkaXJlY3Rpb24gKGNvbXBhdGlibGUgdy8gSmF2YSBjb29yZGluYXRlIHN5c3RlbSEpLlxuICovXG5JR2VvbWV0cnkuYW5nbGVPZlZlY3RvciA9IGZ1bmN0aW9uIChDeCwgQ3ksIE54LCBOeSkge1xuICB2YXIgQ19hbmdsZSA9IHZvaWQgMDtcblxuICBpZiAoQ3ggIT09IE54KSB7XG4gICAgQ19hbmdsZSA9IE1hdGguYXRhbigoTnkgLSBDeSkgLyAoTnggLSBDeCkpO1xuXG4gICAgaWYgKE54IDwgQ3gpIHtcbiAgICAgIENfYW5nbGUgKz0gTWF0aC5QSTtcbiAgICB9IGVsc2UgaWYgKE55IDwgQ3kpIHtcbiAgICAgIENfYW5nbGUgKz0gdGhpcy5UV09fUEk7XG4gICAgfVxuICB9IGVsc2UgaWYgKE55IDwgQ3kpIHtcbiAgICBDX2FuZ2xlID0gdGhpcy5PTkVfQU5EX0hBTEZfUEk7IC8vIDI3MCBkZWdyZWVzXG4gIH0gZWxzZSB7XG4gICAgQ19hbmdsZSA9IHRoaXMuSEFMRl9QSTsgLy8gOTAgZGVncmVlc1xuICB9XG5cbiAgcmV0dXJuIENfYW5nbGU7XG59O1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGNoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiB0d28gbGluZSBzZWdtZW50cyAob25lIHdpdGggcG9pbnRcbiAqIHAxIGFuZCBwMiwgdGhlIG90aGVyIHdpdGggcG9pbnQgcDMgYW5kIHA0KSBpbnRlcnNlY3QgYXQgYSBwb2ludCBvdGhlclxuICogdGhhbiB0aGVzZSBwb2ludHMuXG4gKi9cbklHZW9tZXRyeS5kb0ludGVyc2VjdCA9IGZ1bmN0aW9uIChwMSwgcDIsIHAzLCBwNCkge1xuICB2YXIgYSA9IHAxLng7XG4gIHZhciBiID0gcDEueTtcbiAgdmFyIGMgPSBwMi54O1xuICB2YXIgZCA9IHAyLnk7XG4gIHZhciBwID0gcDMueDtcbiAgdmFyIHEgPSBwMy55O1xuICB2YXIgciA9IHA0Lng7XG4gIHZhciBzID0gcDQueTtcbiAgdmFyIGRldCA9IChjIC0gYSkgKiAocyAtIHEpIC0gKHIgLSBwKSAqIChkIC0gYik7XG5cbiAgaWYgKGRldCA9PT0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbGFtYmRhID0gKChzIC0gcSkgKiAociAtIGEpICsgKHAgLSByKSAqIChzIC0gYikpIC8gZGV0O1xuICAgIHZhciBnYW1tYSA9ICgoYiAtIGQpICogKHIgLSBhKSArIChjIC0gYSkgKiAocyAtIGIpKSAvIGRldDtcbiAgICByZXR1cm4gMCA8IGxhbWJkYSAmJiBsYW1iZGEgPCAxICYmIDAgPCBnYW1tYSAmJiBnYW1tYSA8IDE7XG4gIH1cbn07XG5cbi8qKlxuICogVGhpcyBtZXRob2QgY2hlY2tzIGFuZCBjYWxjdWxhdGVzIHRoZSBpbnRlcnNlY3Rpb24gb2YgXG4gKiBhIGxpbmUgc2VnbWVudCBhbmQgYSBjaXJjbGUuXG4gKi9cbklHZW9tZXRyeS5maW5kQ2lyY2xlTGluZUludGVyc2VjdGlvbnMgPSBmdW5jdGlvbiAoRXgsIEV5LCBMeCwgTHksIEN4LCBDeSwgcikge1xuXG4gIC8vIEUgaXMgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSByYXksXG4gIC8vIEwgaXMgdGhlIGVuZCBwb2ludCBvZiB0aGUgcmF5LFxuICAvLyBDIGlzIHRoZSBjZW50ZXIgb2Ygc3BoZXJlIHlvdSdyZSB0ZXN0aW5nIGFnYWluc3RcbiAgLy8gciBpcyB0aGUgcmFkaXVzIG9mIHRoYXQgc3BoZXJlXG5cbiAgLy8gQ29tcHV0ZTpcbiAgLy8gZCA9IEwgLSBFICggRGlyZWN0aW9uIHZlY3RvciBvZiByYXksIGZyb20gc3RhcnQgdG8gZW5kIClcbiAgLy8gZiA9IEUgLSBDICggVmVjdG9yIGZyb20gY2VudGVyIHNwaGVyZSB0byByYXkgc3RhcnQgKVxuXG4gIC8vIFRoZW4gdGhlIGludGVyc2VjdGlvbiBpcyBmb3VuZCBieS4uXG4gIC8vIFAgPSBFICsgdCAqIGRcbiAgLy8gVGhpcyBpcyBhIHBhcmFtZXRyaWMgZXF1YXRpb246XG4gIC8vIFB4ID0gRXggKyB0ZHhcbiAgLy8gUHkgPSBFeSArIHRkeVxuXG4gIC8vIGdldCBhLCBiLCBjIHZhbHVlc1xuICB2YXIgYSA9IChMeCAtIEV4KSAqIChMeCAtIEV4KSArIChMeSAtIEV5KSAqIChMeSAtIEV5KTtcbiAgdmFyIGIgPSAyICogKChFeCAtIEN4KSAqIChMeCAtIEV4KSArIChFeSAtIEN5KSAqIChMeSAtIEV5KSk7XG4gIHZhciBjID0gKEV4IC0gQ3gpICogKEV4IC0gQ3gpICsgKEV5IC0gQ3kpICogKEV5IC0gQ3kpIC0gciAqIHI7XG5cbiAgLy8gZ2V0IGRpc2NyaW1pbmFudFxuICB2YXIgZGlzYyA9IGIgKiBiIC0gNCAqIGEgKiBjO1xuICBpZiAoZGlzYyA+PSAwKSB7XG4gICAgLy8gaW5zZXJ0IGludG8gcXVhZHJhdGljIGZvcm11bGFcbiAgICB2YXIgdDEgPSAoLWIgKyBNYXRoLnNxcnQoYiAqIGIgLSA0ICogYSAqIGMpKSAvICgyICogYSk7XG4gICAgdmFyIHQyID0gKC1iIC0gTWF0aC5zcXJ0KGIgKiBiIC0gNCAqIGEgKiBjKSkgLyAoMiAqIGEpO1xuICAgIHZhciBpbnRlcnNlY3Rpb25zID0gbnVsbDtcbiAgICBpZiAodDEgPj0gMCAmJiB0MSA8PSAxKSB7XG4gICAgICAvLyB0MSBpcyB0aGUgaW50ZXJzZWN0aW9uLCBhbmQgaXQncyBjbG9zZXIgdGhhbiB0MlxuICAgICAgLy8gKHNpbmNlIHQxIHVzZXMgLWIgLSBkaXNjcmltaW5hbnQpXG4gICAgICAvLyBJbXBhbGUsIFBva2VcbiAgICAgIHJldHVybiBbdDFdO1xuICAgIH1cblxuICAgIC8vIGhlcmUgdDEgZGlkbid0IGludGVyc2VjdCBzbyB3ZSBhcmUgZWl0aGVyIHN0YXJ0ZWRcbiAgICAvLyBpbnNpZGUgdGhlIHNwaGVyZSBvciBjb21wbGV0ZWx5IHBhc3QgaXRcbiAgICBpZiAodDIgPj0gMCAmJiB0MiA8PSAxKSB7XG4gICAgICAvLyBFeGl0V291bmRcbiAgICAgIHJldHVybiBbdDJdO1xuICAgIH1cblxuICAgIHJldHVybiBpbnRlcnNlY3Rpb25zO1xuICB9IGVsc2UgcmV0dXJuIG51bGw7XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU2VjdGlvbjogQ2xhc3MgQ29uc3RhbnRzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLyoqXG4gKiBTb21lIHVzZWZ1bCBwcmUtY2FsY3VsYXRlZCBjb25zdGFudHNcbiAqL1xuSUdlb21ldHJ5LkhBTEZfUEkgPSAwLjUgKiBNYXRoLlBJO1xuSUdlb21ldHJ5Lk9ORV9BTkRfSEFMRl9QSSA9IDEuNSAqIE1hdGguUEk7XG5JR2VvbWV0cnkuVFdPX1BJID0gMi4wICogTWF0aC5QSTtcbklHZW9tZXRyeS5USFJFRV9QSSA9IDMuMCAqIE1hdGguUEk7XG5cbm1vZHVsZS5leHBvcnRzID0gSUdlb21ldHJ5O1xuXG4vKioqLyB9KSxcbi8qIDkgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuZnVuY3Rpb24gSU1hdGgoKSB7fVxuXG4vKipcbiAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHNpZ24gb2YgdGhlIGlucHV0IHZhbHVlLlxuICovXG5JTWF0aC5zaWduID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA+IDApIHtcbiAgICByZXR1cm4gMTtcbiAgfSBlbHNlIGlmICh2YWx1ZSA8IDApIHtcbiAgICByZXR1cm4gLTE7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbn07XG5cbklNYXRoLmZsb29yID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA8IDAgPyBNYXRoLmNlaWwodmFsdWUpIDogTWF0aC5mbG9vcih2YWx1ZSk7XG59O1xuXG5JTWF0aC5jZWlsID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA8IDAgPyBNYXRoLmZsb29yKHZhbHVlKSA6IE1hdGguY2VpbCh2YWx1ZSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IElNYXRoO1xuXG4vKioqLyB9KSxcbi8qIDEwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbmZ1bmN0aW9uIEludGVnZXIoKSB7fVxuXG5JbnRlZ2VyLk1BWF9WQUxVRSA9IDIxNDc0ODM2NDc7XG5JbnRlZ2VyLk1JTl9WQUxVRSA9IC0yMTQ3NDgzNjQ4O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEludGVnZXI7XG5cbi8qKiovIH0pLFxuLyogMTEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIG5vZGVGcm9tID0gZnVuY3Rpb24gbm9kZUZyb20odmFsdWUpIHtcbiAgcmV0dXJuIHsgdmFsdWU6IHZhbHVlLCBuZXh0OiBudWxsLCBwcmV2OiBudWxsIH07XG59O1xuXG52YXIgYWRkID0gZnVuY3Rpb24gYWRkKHByZXYsIG5vZGUsIG5leHQsIGxpc3QpIHtcbiAgaWYgKHByZXYgIT09IG51bGwpIHtcbiAgICBwcmV2Lm5leHQgPSBub2RlO1xuICB9IGVsc2Uge1xuICAgIGxpc3QuaGVhZCA9IG5vZGU7XG4gIH1cblxuICBpZiAobmV4dCAhPT0gbnVsbCkge1xuICAgIG5leHQucHJldiA9IG5vZGU7XG4gIH0gZWxzZSB7XG4gICAgbGlzdC50YWlsID0gbm9kZTtcbiAgfVxuXG4gIG5vZGUucHJldiA9IHByZXY7XG4gIG5vZGUubmV4dCA9IG5leHQ7XG5cbiAgbGlzdC5sZW5ndGgrKztcblxuICByZXR1cm4gbm9kZTtcbn07XG5cbnZhciBfcmVtb3ZlID0gZnVuY3Rpb24gX3JlbW92ZShub2RlLCBsaXN0KSB7XG4gIHZhciBwcmV2ID0gbm9kZS5wcmV2LFxuICAgICAgbmV4dCA9IG5vZGUubmV4dDtcblxuXG4gIGlmIChwcmV2ICE9PSBudWxsKSB7XG4gICAgcHJldi5uZXh0ID0gbmV4dDtcbiAgfSBlbHNlIHtcbiAgICBsaXN0LmhlYWQgPSBuZXh0O1xuICB9XG5cbiAgaWYgKG5leHQgIT09IG51bGwpIHtcbiAgICBuZXh0LnByZXYgPSBwcmV2O1xuICB9IGVsc2Uge1xuICAgIGxpc3QudGFpbCA9IHByZXY7XG4gIH1cblxuICBub2RlLnByZXYgPSBub2RlLm5leHQgPSBudWxsO1xuXG4gIGxpc3QubGVuZ3RoLS07XG5cbiAgcmV0dXJuIG5vZGU7XG59O1xuXG52YXIgTGlua2VkTGlzdCA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gTGlua2VkTGlzdCh2YWxzKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBMaW5rZWRMaXN0KTtcblxuICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgICB0aGlzLmhlYWQgPSBudWxsO1xuICAgIHRoaXMudGFpbCA9IG51bGw7XG5cbiAgICBpZiAodmFscyAhPSBudWxsKSB7XG4gICAgICB2YWxzLmZvckVhY2goZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzLnB1c2godik7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoTGlua2VkTGlzdCwgW3tcbiAgICBrZXk6IFwic2l6ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzaXplKCkge1xuICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpbnNlcnRCZWZvcmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW5zZXJ0QmVmb3JlKHZhbCwgb3RoZXJOb2RlKSB7XG4gICAgICByZXR1cm4gYWRkKG90aGVyTm9kZS5wcmV2LCBub2RlRnJvbSh2YWwpLCBvdGhlck5vZGUsIHRoaXMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpbnNlcnRBZnRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbnNlcnRBZnRlcih2YWwsIG90aGVyTm9kZSkge1xuICAgICAgcmV0dXJuIGFkZChvdGhlck5vZGUsIG5vZGVGcm9tKHZhbCksIG90aGVyTm9kZS5uZXh0LCB0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaW5zZXJ0Tm9kZUJlZm9yZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbnNlcnROb2RlQmVmb3JlKG5ld05vZGUsIG90aGVyTm9kZSkge1xuICAgICAgcmV0dXJuIGFkZChvdGhlck5vZGUucHJldiwgbmV3Tm9kZSwgb3RoZXJOb2RlLCB0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaW5zZXJ0Tm9kZUFmdGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGluc2VydE5vZGVBZnRlcihuZXdOb2RlLCBvdGhlck5vZGUpIHtcbiAgICAgIHJldHVybiBhZGQob3RoZXJOb2RlLCBuZXdOb2RlLCBvdGhlck5vZGUubmV4dCwgdGhpcyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInB1c2hcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcHVzaCh2YWwpIHtcbiAgICAgIHJldHVybiBhZGQodGhpcy50YWlsLCBub2RlRnJvbSh2YWwpLCBudWxsLCB0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidW5zaGlmdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1bnNoaWZ0KHZhbCkge1xuICAgICAgcmV0dXJuIGFkZChudWxsLCBub2RlRnJvbSh2YWwpLCB0aGlzLmhlYWQsIHRoaXMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW1vdmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlKG5vZGUpIHtcbiAgICAgIHJldHVybiBfcmVtb3ZlKG5vZGUsIHRoaXMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwb3BcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcG9wKCkge1xuICAgICAgcmV0dXJuIF9yZW1vdmUodGhpcy50YWlsLCB0aGlzKS52YWx1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicG9wTm9kZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwb3BOb2RlKCkge1xuICAgICAgcmV0dXJuIF9yZW1vdmUodGhpcy50YWlsLCB0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2hpZnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2hpZnQoKSB7XG4gICAgICByZXR1cm4gX3JlbW92ZSh0aGlzLmhlYWQsIHRoaXMpLnZhbHVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzaGlmdE5vZGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2hpZnROb2RlKCkge1xuICAgICAgcmV0dXJuIF9yZW1vdmUodGhpcy5oZWFkLCB0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0X29iamVjdF9hdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRfb2JqZWN0X2F0KGluZGV4KSB7XG4gICAgICBpZiAoaW5kZXggPD0gdGhpcy5sZW5ndGgoKSkge1xuICAgICAgICB2YXIgaSA9IDE7XG4gICAgICAgIHZhciBjdXJyZW50ID0gdGhpcy5oZWFkO1xuICAgICAgICB3aGlsZSAoaSA8IGluZGV4KSB7XG4gICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQudmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldF9vYmplY3RfYXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0X29iamVjdF9hdChpbmRleCwgdmFsdWUpIHtcbiAgICAgIGlmIChpbmRleCA8PSB0aGlzLmxlbmd0aCgpKSB7XG4gICAgICAgIHZhciBpID0gMTtcbiAgICAgICAgdmFyIGN1cnJlbnQgPSB0aGlzLmhlYWQ7XG4gICAgICAgIHdoaWxlIChpIDwgaW5kZXgpIHtcbiAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0O1xuICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50LnZhbHVlID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIExpbmtlZExpc3Q7XG59KCk7XG5cbm1vZHVsZS5leHBvcnRzID0gTGlua2VkTGlzdDtcblxuLyoqKi8gfSksXG4vKiAxMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG4vKlxyXG4gKlRoaXMgY2xhc3MgaXMgdGhlIGphdmFzY3JpcHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFBvaW50LmphdmEgY2xhc3MgaW4gamRrXHJcbiAqL1xuZnVuY3Rpb24gUG9pbnQoeCwgeSwgcCkge1xuICB0aGlzLnggPSBudWxsO1xuICB0aGlzLnkgPSBudWxsO1xuICBpZiAoeCA9PSBudWxsICYmIHkgPT0gbnVsbCAmJiBwID09IG51bGwpIHtcbiAgICB0aGlzLnggPSAwO1xuICAgIHRoaXMueSA9IDA7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHggPT0gJ251bWJlcicgJiYgdHlwZW9mIHkgPT0gJ251bWJlcicgJiYgcCA9PSBudWxsKSB7XG4gICAgdGhpcy54ID0geDtcbiAgICB0aGlzLnkgPSB5O1xuICB9IGVsc2UgaWYgKHguY29uc3RydWN0b3IubmFtZSA9PSAnUG9pbnQnICYmIHkgPT0gbnVsbCAmJiBwID09IG51bGwpIHtcbiAgICBwID0geDtcbiAgICB0aGlzLnggPSBwLng7XG4gICAgdGhpcy55ID0gcC55O1xuICB9XG59XG5cblBvaW50LnByb3RvdHlwZS5nZXRYID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy54O1xufTtcblxuUG9pbnQucHJvdG90eXBlLmdldFkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZ2V0TG9jYXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBuZXcgUG9pbnQodGhpcy54LCB0aGlzLnkpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLnNldExvY2F0aW9uID0gZnVuY3Rpb24gKHgsIHksIHApIHtcbiAgaWYgKHguY29uc3RydWN0b3IubmFtZSA9PSAnUG9pbnQnICYmIHkgPT0gbnVsbCAmJiBwID09IG51bGwpIHtcbiAgICBwID0geDtcbiAgICB0aGlzLnNldExvY2F0aW9uKHAueCwgcC55KTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgeCA9PSAnbnVtYmVyJyAmJiB0eXBlb2YgeSA9PSAnbnVtYmVyJyAmJiBwID09IG51bGwpIHtcbiAgICAvL2lmIGJvdGggcGFyYW1ldGVycyBhcmUgaW50ZWdlciBqdXN0IG1vdmUgKHgseSkgbG9jYXRpb25cbiAgICBpZiAocGFyc2VJbnQoeCkgPT0geCAmJiBwYXJzZUludCh5KSA9PSB5KSB7XG4gICAgICB0aGlzLm1vdmUoeCwgeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMueCA9IE1hdGguZmxvb3IoeCArIDAuNSk7XG4gICAgICB0aGlzLnkgPSBNYXRoLmZsb29yKHkgKyAwLjUpO1xuICAgIH1cbiAgfVxufTtcblxuUG9pbnQucHJvdG90eXBlLm1vdmUgPSBmdW5jdGlvbiAoeCwgeSkge1xuICB0aGlzLnggPSB4O1xuICB0aGlzLnkgPSB5O1xufTtcblxuUG9pbnQucHJvdG90eXBlLnRyYW5zbGF0ZSA9IGZ1bmN0aW9uIChkeCwgZHkpIHtcbiAgdGhpcy54ICs9IGR4O1xuICB0aGlzLnkgKz0gZHk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gKG9iaikge1xuICBpZiAob2JqLmNvbnN0cnVjdG9yLm5hbWUgPT0gXCJQb2ludFwiKSB7XG4gICAgdmFyIHB0ID0gb2JqO1xuICAgIHJldHVybiB0aGlzLnggPT0gcHQueCAmJiB0aGlzLnkgPT0gcHQueTtcbiAgfVxuICByZXR1cm4gdGhpcyA9PSBvYmo7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBuZXcgUG9pbnQoKS5jb25zdHJ1Y3Rvci5uYW1lICsgXCJbeD1cIiArIHRoaXMueCArIFwiLHk9XCIgKyB0aGlzLnkgKyBcIl1cIjtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUG9pbnQ7XG5cbi8qKiovIH0pLFxuLyogMTMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuZnVuY3Rpb24gUmVjdGFuZ2xlRCh4LCB5LCB3aWR0aCwgaGVpZ2h0KSB7XG4gIHRoaXMueCA9IDA7XG4gIHRoaXMueSA9IDA7XG4gIHRoaXMud2lkdGggPSAwO1xuICB0aGlzLmhlaWdodCA9IDA7XG5cbiAgaWYgKHggIT0gbnVsbCAmJiB5ICE9IG51bGwgJiYgd2lkdGggIT0gbnVsbCAmJiBoZWlnaHQgIT0gbnVsbCkge1xuICAgIHRoaXMueCA9IHg7XG4gICAgdGhpcy55ID0geTtcbiAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gIH1cbn1cblxuUmVjdGFuZ2xlRC5wcm90b3R5cGUuZ2V0WCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMueDtcbn07XG5cblJlY3RhbmdsZUQucHJvdG90eXBlLnNldFggPSBmdW5jdGlvbiAoeCkge1xuICB0aGlzLnggPSB4O1xufTtcblxuUmVjdGFuZ2xlRC5wcm90b3R5cGUuZ2V0WSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMueTtcbn07XG5cblJlY3RhbmdsZUQucHJvdG90eXBlLnNldFkgPSBmdW5jdGlvbiAoeSkge1xuICB0aGlzLnkgPSB5O1xufTtcblxuUmVjdGFuZ2xlRC5wcm90b3R5cGUuZ2V0V2lkdGggPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLndpZHRoO1xufTtcblxuUmVjdGFuZ2xlRC5wcm90b3R5cGUuc2V0V2lkdGggPSBmdW5jdGlvbiAod2lkdGgpIHtcbiAgdGhpcy53aWR0aCA9IHdpZHRoO1xufTtcblxuUmVjdGFuZ2xlRC5wcm90b3R5cGUuZ2V0SGVpZ2h0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5oZWlnaHQ7XG59O1xuXG5SZWN0YW5nbGVELnByb3RvdHlwZS5zZXRIZWlnaHQgPSBmdW5jdGlvbiAoaGVpZ2h0KSB7XG4gIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xufTtcblxuUmVjdGFuZ2xlRC5wcm90b3R5cGUuZ2V0UmlnaHQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnggKyB0aGlzLndpZHRoO1xufTtcblxuUmVjdGFuZ2xlRC5wcm90b3R5cGUuZ2V0Qm90dG9tID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy55ICsgdGhpcy5oZWlnaHQ7XG59O1xuXG5SZWN0YW5nbGVELnByb3RvdHlwZS5pbnRlcnNlY3RzID0gZnVuY3Rpb24gKGEpIHtcbiAgaWYgKHRoaXMuZ2V0UmlnaHQoKSA8IGEueCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0aGlzLmdldEJvdHRvbSgpIDwgYS55KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGEuZ2V0UmlnaHQoKSA8IHRoaXMueCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChhLmdldEJvdHRvbSgpIDwgdGhpcy55KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5SZWN0YW5nbGVELnByb3RvdHlwZS5nZXRDZW50ZXJYID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy54ICsgdGhpcy53aWR0aCAvIDI7XG59O1xuXG5SZWN0YW5nbGVELnByb3RvdHlwZS5nZXRNaW5YID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5nZXRYKCk7XG59O1xuXG5SZWN0YW5nbGVELnByb3RvdHlwZS5nZXRNYXhYID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5nZXRYKCkgKyB0aGlzLndpZHRoO1xufTtcblxuUmVjdGFuZ2xlRC5wcm90b3R5cGUuZ2V0Q2VudGVyWSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMueSArIHRoaXMuaGVpZ2h0IC8gMjtcbn07XG5cblJlY3RhbmdsZUQucHJvdG90eXBlLmdldE1pblkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmdldFkoKTtcbn07XG5cblJlY3RhbmdsZUQucHJvdG90eXBlLmdldE1heFkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmdldFkoKSArIHRoaXMuaGVpZ2h0O1xufTtcblxuUmVjdGFuZ2xlRC5wcm90b3R5cGUuZ2V0V2lkdGhIYWxmID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy53aWR0aCAvIDI7XG59O1xuXG5SZWN0YW5nbGVELnByb3RvdHlwZS5nZXRIZWlnaHRIYWxmID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5oZWlnaHQgLyAyO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWN0YW5nbGVEO1xuXG4vKioqLyB9KSxcbi8qIDE0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBfdHlwZW9mID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTtcblxuZnVuY3Rpb24gVW5pcXVlSURHZW5lcmV0b3IoKSB7fVxuXG5VbmlxdWVJREdlbmVyZXRvci5sYXN0SUQgPSAwO1xuXG5VbmlxdWVJREdlbmVyZXRvci5jcmVhdGVJRCA9IGZ1bmN0aW9uIChvYmopIHtcbiAgaWYgKFVuaXF1ZUlER2VuZXJldG9yLmlzUHJpbWl0aXZlKG9iaikpIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG4gIGlmIChvYmoudW5pcXVlSUQgIT0gbnVsbCkge1xuICAgIHJldHVybiBvYmoudW5pcXVlSUQ7XG4gIH1cbiAgb2JqLnVuaXF1ZUlEID0gVW5pcXVlSURHZW5lcmV0b3IuZ2V0U3RyaW5nKCk7XG4gIFVuaXF1ZUlER2VuZXJldG9yLmxhc3RJRCsrO1xuICByZXR1cm4gb2JqLnVuaXF1ZUlEO1xufTtcblxuVW5pcXVlSURHZW5lcmV0b3IuZ2V0U3RyaW5nID0gZnVuY3Rpb24gKGlkKSB7XG4gIGlmIChpZCA9PSBudWxsKSBpZCA9IFVuaXF1ZUlER2VuZXJldG9yLmxhc3RJRDtcbiAgcmV0dXJuIFwiT2JqZWN0I1wiICsgaWQgKyBcIlwiO1xufTtcblxuVW5pcXVlSURHZW5lcmV0b3IuaXNQcmltaXRpdmUgPSBmdW5jdGlvbiAoYXJnKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIGFyZyA9PT0gXCJ1bmRlZmluZWRcIiA/IFwidW5kZWZpbmVkXCIgOiBfdHlwZW9mKGFyZyk7XG4gIHJldHVybiBhcmcgPT0gbnVsbCB8fCB0eXBlICE9IFwib2JqZWN0XCIgJiYgdHlwZSAhPSBcImZ1bmN0aW9uXCI7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFVuaXF1ZUlER2VuZXJldG9yO1xuXG4vKioqLyB9KSxcbi8qIDE1ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbmZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgeyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IEFycmF5KGFyci5sZW5ndGgpOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH0gZWxzZSB7IHJldHVybiBBcnJheS5mcm9tKGFycik7IH0gfVxuXG52YXIgTGF5b3V0Q29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcbnZhciBMR3JhcGhNYW5hZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KTtcbnZhciBMTm9kZSA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7XG52YXIgTEVkZ2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xudmFyIExHcmFwaCA9IF9fd2VicGFja19yZXF1aXJlX18oNik7XG52YXIgUG9pbnREID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTtcbnZhciBUcmFuc2Zvcm0gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3KTtcbnZhciBFbWl0dGVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygyOSk7XG5cbmZ1bmN0aW9uIExheW91dChpc1JlbW90ZVVzZSkge1xuICBFbWl0dGVyLmNhbGwodGhpcyk7XG5cbiAgLy9MYXlvdXQgUXVhbGl0eTogMDpkcmFmdCwgMTpkZWZhdWx0LCAyOnByb29mXG4gIHRoaXMubGF5b3V0UXVhbGl0eSA9IExheW91dENvbnN0YW50cy5RVUFMSVRZO1xuICAvL1doZXRoZXIgbGF5b3V0IHNob3VsZCBjcmVhdGUgYmVuZHBvaW50cyBhcyBuZWVkZWQgb3Igbm90XG4gIHRoaXMuY3JlYXRlQmVuZHNBc05lZWRlZCA9IExheW91dENvbnN0YW50cy5ERUZBVUxUX0NSRUFURV9CRU5EU19BU19ORUVERUQ7XG4gIC8vV2hldGhlciBsYXlvdXQgc2hvdWxkIGJlIGluY3JlbWVudGFsIG9yIG5vdFxuICB0aGlzLmluY3JlbWVudGFsID0gTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfSU5DUkVNRU5UQUw7XG4gIC8vV2hldGhlciB3ZSBhbmltYXRlIGZyb20gYmVmb3JlIHRvIGFmdGVyIGxheW91dCBub2RlIHBvc2l0aW9uc1xuICB0aGlzLmFuaW1hdGlvbk9uTGF5b3V0ID0gTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQU5JTUFUSU9OX09OX0xBWU9VVDtcbiAgLy9XaGV0aGVyIHdlIGFuaW1hdGUgdGhlIGxheW91dCBwcm9jZXNzIG9yIG5vdFxuICB0aGlzLmFuaW1hdGlvbkR1cmluZ0xheW91dCA9IExheW91dENvbnN0YW50cy5ERUZBVUxUX0FOSU1BVElPTl9EVVJJTkdfTEFZT1VUO1xuICAvL051bWJlciBpdGVyYXRpb25zIHRoYXQgc2hvdWxkIGJlIGRvbmUgYmV0d2VlbiB0d28gc3VjY2Vzc2l2ZSBhbmltYXRpb25zXG4gIHRoaXMuYW5pbWF0aW9uUGVyaW9kID0gTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQU5JTUFUSU9OX1BFUklPRDtcbiAgLyoqXHJcbiAgICogV2hldGhlciBvciBub3QgbGVhZiBub2RlcyAobm9uLWNvbXBvdW5kIG5vZGVzKSBhcmUgb2YgdW5pZm9ybSBzaXplcy4gV2hlblxyXG4gICAqIHRoZXkgYXJlLCBib3RoIHNwcmluZyBhbmQgcmVwdWxzaW9uIGZvcmNlcyBiZXR3ZWVuIHR3byBsZWFmIG5vZGVzIGNhbiBiZVxyXG4gICAqIGNhbGN1bGF0ZWQgd2l0aG91dCB0aGUgZXhwZW5zaXZlIGNsaXBwaW5nIHBvaW50IGNhbGN1bGF0aW9ucywgcmVzdWx0aW5nXHJcbiAgICogaW4gbWFqb3Igc3BlZWQtdXAuXHJcbiAgICovXG4gIHRoaXMudW5pZm9ybUxlYWZOb2RlU2l6ZXMgPSBMYXlvdXRDb25zdGFudHMuREVGQVVMVF9VTklGT1JNX0xFQUZfTk9ERV9TSVpFUztcbiAgLyoqXHJcbiAgICogVGhpcyBpcyB1c2VkIGZvciBjcmVhdGlvbiBvZiBiZW5kcG9pbnRzIGJ5IHVzaW5nIGR1bW15IG5vZGVzIGFuZCBlZGdlcy5cclxuICAgKiBNYXBzIGFuIExFZGdlIHRvIGl0cyBkdW1teSBiZW5kcG9pbnQgcGF0aC5cclxuICAgKi9cbiAgdGhpcy5lZGdlVG9EdW1teU5vZGVzID0gbmV3IE1hcCgpO1xuICB0aGlzLmdyYXBoTWFuYWdlciA9IG5ldyBMR3JhcGhNYW5hZ2VyKHRoaXMpO1xuICB0aGlzLmlzTGF5b3V0RmluaXNoZWQgPSBmYWxzZTtcbiAgdGhpcy5pc1N1YkxheW91dCA9IGZhbHNlO1xuICB0aGlzLmlzUmVtb3RlVXNlID0gZmFsc2U7XG5cbiAgaWYgKGlzUmVtb3RlVXNlICE9IG51bGwpIHtcbiAgICB0aGlzLmlzUmVtb3RlVXNlID0gaXNSZW1vdGVVc2U7XG4gIH1cbn1cblxuTGF5b3V0LlJBTkRPTV9TRUVEID0gMTtcblxuTGF5b3V0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRW1pdHRlci5wcm90b3R5cGUpO1xuXG5MYXlvdXQucHJvdG90eXBlLmdldEdyYXBoTWFuYWdlciA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuZ3JhcGhNYW5hZ2VyO1xufTtcblxuTGF5b3V0LnByb3RvdHlwZS5nZXRBbGxOb2RlcyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuZ3JhcGhNYW5hZ2VyLmdldEFsbE5vZGVzKCk7XG59O1xuXG5MYXlvdXQucHJvdG90eXBlLmdldEFsbEVkZ2VzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5ncmFwaE1hbmFnZXIuZ2V0QWxsRWRnZXMoKTtcbn07XG5cbkxheW91dC5wcm90b3R5cGUuZ2V0QWxsTm9kZXNUb0FwcGx5R3Jhdml0YXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmdyYXBoTWFuYWdlci5nZXRBbGxOb2Rlc1RvQXBwbHlHcmF2aXRhdGlvbigpO1xufTtcblxuTGF5b3V0LnByb3RvdHlwZS5uZXdHcmFwaE1hbmFnZXIgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBnbSA9IG5ldyBMR3JhcGhNYW5hZ2VyKHRoaXMpO1xuICB0aGlzLmdyYXBoTWFuYWdlciA9IGdtO1xuICByZXR1cm4gZ207XG59O1xuXG5MYXlvdXQucHJvdG90eXBlLm5ld0dyYXBoID0gZnVuY3Rpb24gKHZHcmFwaCkge1xuICByZXR1cm4gbmV3IExHcmFwaChudWxsLCB0aGlzLmdyYXBoTWFuYWdlciwgdkdyYXBoKTtcbn07XG5cbkxheW91dC5wcm90b3R5cGUubmV3Tm9kZSA9IGZ1bmN0aW9uICh2Tm9kZSkge1xuICByZXR1cm4gbmV3IExOb2RlKHRoaXMuZ3JhcGhNYW5hZ2VyLCB2Tm9kZSk7XG59O1xuXG5MYXlvdXQucHJvdG90eXBlLm5ld0VkZ2UgPSBmdW5jdGlvbiAodkVkZ2UpIHtcbiAgcmV0dXJuIG5ldyBMRWRnZShudWxsLCBudWxsLCB2RWRnZSk7XG59O1xuXG5MYXlvdXQucHJvdG90eXBlLmNoZWNrTGF5b3V0U3VjY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuZ3JhcGhNYW5hZ2VyLmdldFJvb3QoKSA9PSBudWxsIHx8IHRoaXMuZ3JhcGhNYW5hZ2VyLmdldFJvb3QoKS5nZXROb2RlcygpLmxlbmd0aCA9PSAwIHx8IHRoaXMuZ3JhcGhNYW5hZ2VyLmluY2x1ZGVzSW52YWxpZEVkZ2UoKTtcbn07XG5cbkxheW91dC5wcm90b3R5cGUucnVuTGF5b3V0ID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmlzTGF5b3V0RmluaXNoZWQgPSBmYWxzZTtcblxuICBpZiAodGhpcy50aWxpbmdQcmVMYXlvdXQpIHtcbiAgICB0aGlzLnRpbGluZ1ByZUxheW91dCgpO1xuICB9XG5cbiAgdGhpcy5pbml0UGFyYW1ldGVycygpO1xuICB2YXIgaXNMYXlvdXRTdWNjZXNzZnVsbDtcblxuICBpZiAodGhpcy5jaGVja0xheW91dFN1Y2Nlc3MoKSkge1xuICAgIGlzTGF5b3V0U3VjY2Vzc2Z1bGwgPSBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICBpc0xheW91dFN1Y2Nlc3NmdWxsID0gdGhpcy5sYXlvdXQoKTtcbiAgfVxuXG4gIGlmIChMYXlvdXRDb25zdGFudHMuQU5JTUFURSA9PT0gJ2R1cmluZycpIHtcbiAgICAvLyBJZiB0aGlzIGlzIGEgJ2R1cmluZycgbGF5b3V0IGFuaW1hdGlvbi4gTGF5b3V0IGlzIG5vdCBmaW5pc2hlZCB5ZXQuIFxuICAgIC8vIFdlIG5lZWQgdG8gcGVyZm9ybSB0aGVzZSBpbiBpbmRleC5qcyB3aGVuIGxheW91dCBpcyByZWFsbHkgZmluaXNoZWQuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGlzTGF5b3V0U3VjY2Vzc2Z1bGwpIHtcbiAgICBpZiAoIXRoaXMuaXNTdWJMYXlvdXQpIHtcbiAgICAgIHRoaXMuZG9Qb3N0TGF5b3V0KCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHRoaXMudGlsaW5nUG9zdExheW91dCkge1xuICAgIHRoaXMudGlsaW5nUG9zdExheW91dCgpO1xuICB9XG5cbiAgdGhpcy5pc0xheW91dEZpbmlzaGVkID0gdHJ1ZTtcblxuICByZXR1cm4gaXNMYXlvdXRTdWNjZXNzZnVsbDtcbn07XG5cbi8qKlxyXG4gKiBUaGlzIG1ldGhvZCBwZXJmb3JtcyB0aGUgb3BlcmF0aW9ucyByZXF1aXJlZCBhZnRlciBsYXlvdXQuXHJcbiAqL1xuTGF5b3V0LnByb3RvdHlwZS5kb1Bvc3RMYXlvdXQgPSBmdW5jdGlvbiAoKSB7XG4gIC8vYXNzZXJ0ICFpc1N1YkxheW91dCA6IFwiU2hvdWxkIG5vdCBiZSBjYWxsZWQgb24gc3ViLWxheW91dCFcIjtcbiAgLy8gUHJvcGFnYXRlIGdlb21ldHJpYyBjaGFuZ2VzIHRvIHYtbGV2ZWwgb2JqZWN0c1xuICBpZiAoIXRoaXMuaW5jcmVtZW50YWwpIHtcbiAgICB0aGlzLnRyYW5zZm9ybSgpO1xuICB9XG4gIHRoaXMudXBkYXRlKCk7XG59O1xuXG4vKipcclxuICogVGhpcyBtZXRob2QgdXBkYXRlcyB0aGUgZ2VvbWV0cnkgb2YgdGhlIHRhcmdldCBncmFwaCBhY2NvcmRpbmcgdG9cclxuICogY2FsY3VsYXRlZCBsYXlvdXQuXHJcbiAqL1xuTGF5b3V0LnByb3RvdHlwZS51cGRhdGUyID0gZnVuY3Rpb24gKCkge1xuICAvLyB1cGRhdGUgYmVuZCBwb2ludHNcbiAgaWYgKHRoaXMuY3JlYXRlQmVuZHNBc05lZWRlZCkge1xuICAgIHRoaXMuY3JlYXRlQmVuZHBvaW50c0Zyb21EdW1teU5vZGVzKCk7XG5cbiAgICAvLyByZXNldCBhbGwgZWRnZXMsIHNpbmNlIHRoZSB0b3BvbG9neSBoYXMgY2hhbmdlZFxuICAgIHRoaXMuZ3JhcGhNYW5hZ2VyLnJlc2V0QWxsRWRnZXMoKTtcbiAgfVxuXG4gIC8vIHBlcmZvcm0gZWRnZSwgbm9kZSBhbmQgcm9vdCB1cGRhdGVzIGlmIGxheW91dCBpcyBub3QgY2FsbGVkXG4gIC8vIHJlbW90ZWx5XG4gIGlmICghdGhpcy5pc1JlbW90ZVVzZSkge1xuICAgIC8vIHVwZGF0ZSBhbGwgZWRnZXNcbiAgICB2YXIgZWRnZTtcbiAgICB2YXIgYWxsRWRnZXMgPSB0aGlzLmdyYXBoTWFuYWdlci5nZXRBbGxFZGdlcygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYWxsRWRnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGVkZ2UgPSBhbGxFZGdlc1tpXTtcbiAgICAgIC8vICAgICAgdGhpcy51cGRhdGUoZWRnZSk7XG4gICAgfVxuXG4gICAgLy8gcmVjdXJzaXZlbHkgdXBkYXRlIG5vZGVzXG4gICAgdmFyIG5vZGU7XG4gICAgdmFyIG5vZGVzID0gdGhpcy5ncmFwaE1hbmFnZXIuZ2V0Um9vdCgpLmdldE5vZGVzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgLy8gICAgICB0aGlzLnVwZGF0ZShub2RlKTtcbiAgICB9XG5cbiAgICAvLyB1cGRhdGUgcm9vdCBncmFwaFxuICAgIHRoaXMudXBkYXRlKHRoaXMuZ3JhcGhNYW5hZ2VyLmdldFJvb3QoKSk7XG4gIH1cbn07XG5cbkxheW91dC5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKG9iaikge1xuICBpZiAob2JqID09IG51bGwpIHtcbiAgICB0aGlzLnVwZGF0ZTIoKTtcbiAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBMTm9kZSkge1xuICAgIHZhciBub2RlID0gb2JqO1xuICAgIGlmIChub2RlLmdldENoaWxkKCkgIT0gbnVsbCkge1xuICAgICAgLy8gc2luY2Ugbm9kZSBpcyBjb21wb3VuZCwgcmVjdXJzaXZlbHkgdXBkYXRlIGNoaWxkIG5vZGVzXG4gICAgICB2YXIgbm9kZXMgPSBub2RlLmdldENoaWxkKCkuZ2V0Tm9kZXMoKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdXBkYXRlKG5vZGVzW2ldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBpZiB0aGUgbC1sZXZlbCBub2RlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHYtbGV2ZWwgZ3JhcGggb2JqZWN0LFxuICAgIC8vIHRoZW4gaXQgaXMgYXNzdW1lZCB0aGF0IHRoZSB2LWxldmVsIG5vZGUgaW1wbGVtZW50cyB0aGVcbiAgICAvLyBpbnRlcmZhY2UgVXBkYXRhYmxlLlxuICAgIGlmIChub2RlLnZHcmFwaE9iamVjdCAhPSBudWxsKSB7XG4gICAgICAvLyBjYXN0IHRvIFVwZGF0YWJsZSB3aXRob3V0IGFueSB0eXBlIGNoZWNrXG4gICAgICB2YXIgdk5vZGUgPSBub2RlLnZHcmFwaE9iamVjdDtcblxuICAgICAgLy8gY2FsbCB0aGUgdXBkYXRlIG1ldGhvZCBvZiB0aGUgaW50ZXJmYWNlXG4gICAgICB2Tm9kZS51cGRhdGUobm9kZSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIExFZGdlKSB7XG4gICAgdmFyIGVkZ2UgPSBvYmo7XG4gICAgLy8gaWYgdGhlIGwtbGV2ZWwgZWRnZSBpcyBhc3NvY2lhdGVkIHdpdGggYSB2LWxldmVsIGdyYXBoIG9iamVjdCxcbiAgICAvLyB0aGVuIGl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgdi1sZXZlbCBlZGdlIGltcGxlbWVudHMgdGhlXG4gICAgLy8gaW50ZXJmYWNlIFVwZGF0YWJsZS5cblxuICAgIGlmIChlZGdlLnZHcmFwaE9iamVjdCAhPSBudWxsKSB7XG4gICAgICAvLyBjYXN0IHRvIFVwZGF0YWJsZSB3aXRob3V0IGFueSB0eXBlIGNoZWNrXG4gICAgICB2YXIgdkVkZ2UgPSBlZGdlLnZHcmFwaE9iamVjdDtcblxuICAgICAgLy8gY2FsbCB0aGUgdXBkYXRlIG1ldGhvZCBvZiB0aGUgaW50ZXJmYWNlXG4gICAgICB2RWRnZS51cGRhdGUoZWRnZSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIExHcmFwaCkge1xuICAgIHZhciBncmFwaCA9IG9iajtcbiAgICAvLyBpZiB0aGUgbC1sZXZlbCBncmFwaCBpcyBhc3NvY2lhdGVkIHdpdGggYSB2LWxldmVsIGdyYXBoIG9iamVjdCxcbiAgICAvLyB0aGVuIGl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgdi1sZXZlbCBvYmplY3QgaW1wbGVtZW50cyB0aGVcbiAgICAvLyBpbnRlcmZhY2UgVXBkYXRhYmxlLlxuXG4gICAgaWYgKGdyYXBoLnZHcmFwaE9iamVjdCAhPSBudWxsKSB7XG4gICAgICAvLyBjYXN0IHRvIFVwZGF0YWJsZSB3aXRob3V0IGFueSB0eXBlIGNoZWNrXG4gICAgICB2YXIgdkdyYXBoID0gZ3JhcGgudkdyYXBoT2JqZWN0O1xuXG4gICAgICAvLyBjYWxsIHRoZSB1cGRhdGUgbWV0aG9kIG9mIHRoZSBpbnRlcmZhY2VcbiAgICAgIHZHcmFwaC51cGRhdGUoZ3JhcGgpO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXHJcbiAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gc2V0IGFsbCBsYXlvdXQgcGFyYW1ldGVycyB0byBkZWZhdWx0IHZhbHVlc1xyXG4gKiBkZXRlcm1pbmVkIGF0IGNvbXBpbGUgdGltZS5cclxuICovXG5MYXlvdXQucHJvdG90eXBlLmluaXRQYXJhbWV0ZXJzID0gZnVuY3Rpb24gKCkge1xuICBpZiAoIXRoaXMuaXNTdWJMYXlvdXQpIHtcbiAgICB0aGlzLmxheW91dFF1YWxpdHkgPSBMYXlvdXRDb25zdGFudHMuUVVBTElUWTtcbiAgICB0aGlzLmFuaW1hdGlvbkR1cmluZ0xheW91dCA9IExheW91dENvbnN0YW50cy5ERUZBVUxUX0FOSU1BVElPTl9EVVJJTkdfTEFZT1VUO1xuICAgIHRoaXMuYW5pbWF0aW9uUGVyaW9kID0gTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQU5JTUFUSU9OX1BFUklPRDtcbiAgICB0aGlzLmFuaW1hdGlvbk9uTGF5b3V0ID0gTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQU5JTUFUSU9OX09OX0xBWU9VVDtcbiAgICB0aGlzLmluY3JlbWVudGFsID0gTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfSU5DUkVNRU5UQUw7XG4gICAgdGhpcy5jcmVhdGVCZW5kc0FzTmVlZGVkID0gTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQ1JFQVRFX0JFTkRTX0FTX05FRURFRDtcbiAgICB0aGlzLnVuaWZvcm1MZWFmTm9kZVNpemVzID0gTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfVU5JRk9STV9MRUFGX05PREVfU0laRVM7XG4gIH1cblxuICBpZiAodGhpcy5hbmltYXRpb25EdXJpbmdMYXlvdXQpIHtcbiAgICB0aGlzLmFuaW1hdGlvbk9uTGF5b3V0ID0gZmFsc2U7XG4gIH1cbn07XG5cbkxheW91dC5wcm90b3R5cGUudHJhbnNmb3JtID0gZnVuY3Rpb24gKG5ld0xlZnRUb3ApIHtcbiAgaWYgKG5ld0xlZnRUb3AgPT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpcy50cmFuc2Zvcm0obmV3IFBvaW50RCgwLCAwKSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gY3JlYXRlIGEgdHJhbnNmb3JtYXRpb24gb2JqZWN0IChmcm9tIEVjbGlwc2UgdG8gbGF5b3V0KS4gV2hlbiBhblxuICAgIC8vIGludmVyc2UgdHJhbnNmb3JtIGlzIGFwcGxpZWQsIHdlIGdldCB1cHBlci1sZWZ0IGNvb3JkaW5hdGUgb2YgdGhlXG4gICAgLy8gZHJhd2luZyBvciB0aGUgcm9vdCBncmFwaCBhdCBnaXZlbiBpbnB1dCBjb29yZGluYXRlIChzb21lIG1hcmdpbnNcbiAgICAvLyBhbHJlYWR5IGluY2x1ZGVkIGluIGNhbGN1bGF0aW9uIG9mIGxlZnQtdG9wKS5cblxuICAgIHZhciB0cmFucyA9IG5ldyBUcmFuc2Zvcm0oKTtcbiAgICB2YXIgbGVmdFRvcCA9IHRoaXMuZ3JhcGhNYW5hZ2VyLmdldFJvb3QoKS51cGRhdGVMZWZ0VG9wKCk7XG5cbiAgICBpZiAobGVmdFRvcCAhPSBudWxsKSB7XG4gICAgICB0cmFucy5zZXRXb3JsZE9yZ1gobmV3TGVmdFRvcC54KTtcbiAgICAgIHRyYW5zLnNldFdvcmxkT3JnWShuZXdMZWZ0VG9wLnkpO1xuXG4gICAgICB0cmFucy5zZXREZXZpY2VPcmdYKGxlZnRUb3AueCk7XG4gICAgICB0cmFucy5zZXREZXZpY2VPcmdZKGxlZnRUb3AueSk7XG5cbiAgICAgIHZhciBub2RlcyA9IHRoaXMuZ2V0QWxsTm9kZXMoKTtcbiAgICAgIHZhciBub2RlO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgICAgbm9kZS50cmFuc2Zvcm0odHJhbnMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuTGF5b3V0LnByb3RvdHlwZS5wb3NpdGlvbk5vZGVzUmFuZG9tbHkgPSBmdW5jdGlvbiAoZ3JhcGgpIHtcblxuICBpZiAoZ3JhcGggPT0gdW5kZWZpbmVkKSB7XG4gICAgLy9hc3NlcnQgIXRoaXMuaW5jcmVtZW50YWw7XG4gICAgdGhpcy5wb3NpdGlvbk5vZGVzUmFuZG9tbHkodGhpcy5nZXRHcmFwaE1hbmFnZXIoKS5nZXRSb290KCkpO1xuICAgIHRoaXMuZ2V0R3JhcGhNYW5hZ2VyKCkuZ2V0Um9vdCgpLnVwZGF0ZUJvdW5kcyh0cnVlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbE5vZGU7XG4gICAgdmFyIGNoaWxkR3JhcGg7XG5cbiAgICB2YXIgbm9kZXMgPSBncmFwaC5nZXROb2RlcygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxOb2RlID0gbm9kZXNbaV07XG4gICAgICBjaGlsZEdyYXBoID0gbE5vZGUuZ2V0Q2hpbGQoKTtcblxuICAgICAgaWYgKGNoaWxkR3JhcGggPT0gbnVsbCkge1xuICAgICAgICBsTm9kZS5zY2F0dGVyKCk7XG4gICAgICB9IGVsc2UgaWYgKGNoaWxkR3JhcGguZ2V0Tm9kZXMoKS5sZW5ndGggPT0gMCkge1xuICAgICAgICBsTm9kZS5zY2F0dGVyKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBvc2l0aW9uTm9kZXNSYW5kb21seShjaGlsZEdyYXBoKTtcbiAgICAgICAgbE5vZGUudXBkYXRlQm91bmRzKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG4vKipcclxuICogVGhpcyBtZXRob2QgcmV0dXJucyBhIGxpc3Qgb2YgdHJlZXMgd2hlcmUgZWFjaCB0cmVlIGlzIHJlcHJlc2VudGVkIGFzIGFcclxuICogbGlzdCBvZiBsLW5vZGVzLiBUaGUgbWV0aG9kIHJldHVybnMgYSBsaXN0IG9mIHNpemUgMCB3aGVuOlxyXG4gKiAtIFRoZSBncmFwaCBpcyBub3QgZmxhdCBvclxyXG4gKiAtIE9uZSBvZiB0aGUgY29tcG9uZW50KHMpIG9mIHRoZSBncmFwaCBpcyBub3QgYSB0cmVlLlxyXG4gKi9cbkxheW91dC5wcm90b3R5cGUuZ2V0RmxhdEZvcmVzdCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGZsYXRGb3Jlc3QgPSBbXTtcbiAgdmFyIGlzRm9yZXN0ID0gdHJ1ZTtcblxuICAvLyBRdWljayByZWZlcmVuY2UgZm9yIGFsbCBub2RlcyBpbiB0aGUgZ3JhcGggbWFuYWdlciBhc3NvY2lhdGVkIHdpdGhcbiAgLy8gdGhpcyBsYXlvdXQuIFRoZSBsaXN0IHNob3VsZCBub3QgYmUgY2hhbmdlZC5cbiAgdmFyIGFsbE5vZGVzID0gdGhpcy5ncmFwaE1hbmFnZXIuZ2V0Um9vdCgpLmdldE5vZGVzKCk7XG5cbiAgLy8gRmlyc3QgYmUgc3VyZSB0aGF0IHRoZSBncmFwaCBpcyBmbGF0XG4gIHZhciBpc0ZsYXQgPSB0cnVlO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYWxsTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoYWxsTm9kZXNbaV0uZ2V0Q2hpbGQoKSAhPSBudWxsKSB7XG4gICAgICBpc0ZsYXQgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvLyBSZXR1cm4gZW1wdHkgZm9yZXN0IGlmIHRoZSBncmFwaCBpcyBub3QgZmxhdC5cbiAgaWYgKCFpc0ZsYXQpIHtcbiAgICByZXR1cm4gZmxhdEZvcmVzdDtcbiAgfVxuXG4gIC8vIFJ1biBCRlMgZm9yIGVhY2ggY29tcG9uZW50IG9mIHRoZSBncmFwaC5cblxuICB2YXIgdmlzaXRlZCA9IG5ldyBTZXQoKTtcbiAgdmFyIHRvQmVWaXNpdGVkID0gW107XG4gIHZhciBwYXJlbnRzID0gbmV3IE1hcCgpO1xuICB2YXIgdW5Qcm9jZXNzZWROb2RlcyA9IFtdO1xuXG4gIHVuUHJvY2Vzc2VkTm9kZXMgPSB1blByb2Nlc3NlZE5vZGVzLmNvbmNhdChhbGxOb2Rlcyk7XG5cbiAgLy8gRWFjaCBpdGVyYXRpb24gb2YgdGhpcyBsb29wIGZpbmRzIGEgY29tcG9uZW50IG9mIHRoZSBncmFwaCBhbmRcbiAgLy8gZGVjaWRlcyB3aGV0aGVyIGl0IGlzIGEgdHJlZSBvciBub3QuIElmIGl0IGlzIGEgdHJlZSwgYWRkcyBpdCB0byB0aGVcbiAgLy8gZm9yZXN0IGFuZCBjb250aW51ZWQgd2l0aCB0aGUgbmV4dCBjb21wb25lbnQuXG5cbiAgd2hpbGUgKHVuUHJvY2Vzc2VkTm9kZXMubGVuZ3RoID4gMCAmJiBpc0ZvcmVzdCkge1xuICAgIHRvQmVWaXNpdGVkLnB1c2godW5Qcm9jZXNzZWROb2Rlc1swXSk7XG5cbiAgICAvLyBTdGFydCB0aGUgQkZTLiBFYWNoIGl0ZXJhdGlvbiBvZiB0aGlzIGxvb3AgdmlzaXRzIGEgbm9kZSBpbiBhXG4gICAgLy8gQkZTIG1hbm5lci5cbiAgICB3aGlsZSAodG9CZVZpc2l0ZWQubGVuZ3RoID4gMCAmJiBpc0ZvcmVzdCkge1xuICAgICAgLy9wb29sIG9wZXJhdGlvblxuICAgICAgdmFyIGN1cnJlbnROb2RlID0gdG9CZVZpc2l0ZWRbMF07XG4gICAgICB0b0JlVmlzaXRlZC5zcGxpY2UoMCwgMSk7XG4gICAgICB2aXNpdGVkLmFkZChjdXJyZW50Tm9kZSk7XG5cbiAgICAgIC8vIFRyYXZlcnNlIGFsbCBuZWlnaGJvcnMgb2YgdGhpcyBub2RlXG4gICAgICB2YXIgbmVpZ2hib3JFZGdlcyA9IGN1cnJlbnROb2RlLmdldEVkZ2VzKCk7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmVpZ2hib3JFZGdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY3VycmVudE5laWdoYm9yID0gbmVpZ2hib3JFZGdlc1tpXS5nZXRPdGhlckVuZChjdXJyZW50Tm9kZSk7XG5cbiAgICAgICAgLy8gSWYgQkZTIGlzIG5vdCBncm93aW5nIGZyb20gdGhpcyBuZWlnaGJvci5cbiAgICAgICAgaWYgKHBhcmVudHMuZ2V0KGN1cnJlbnROb2RlKSAhPSBjdXJyZW50TmVpZ2hib3IpIHtcbiAgICAgICAgICAvLyBXZSBoYXZlbid0IHByZXZpb3VzbHkgdmlzaXRlZCB0aGlzIG5laWdoYm9yLlxuICAgICAgICAgIGlmICghdmlzaXRlZC5oYXMoY3VycmVudE5laWdoYm9yKSkge1xuICAgICAgICAgICAgdG9CZVZpc2l0ZWQucHVzaChjdXJyZW50TmVpZ2hib3IpO1xuICAgICAgICAgICAgcGFyZW50cy5zZXQoY3VycmVudE5laWdoYm9yLCBjdXJyZW50Tm9kZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFNpbmNlIHdlIGhhdmUgcHJldmlvdXNseSB2aXNpdGVkIHRoaXMgbmVpZ2hib3IgYW5kXG4gICAgICAgICAgLy8gdGhpcyBuZWlnaGJvciBpcyBub3QgcGFyZW50IG9mIGN1cnJlbnROb2RlLCBnaXZlblxuICAgICAgICAgIC8vIGdyYXBoIGNvbnRhaW5zIGEgY29tcG9uZW50IHRoYXQgaXMgbm90IHRyZWUsIGhlbmNlXG4gICAgICAgICAgLy8gaXQgaXMgbm90IGEgZm9yZXN0LlxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICBpc0ZvcmVzdCA9IGZhbHNlO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoZSBncmFwaCBjb250YWlucyBhIGNvbXBvbmVudCB0aGF0IGlzIG5vdCBhIHRyZWUuIEVtcHR5XG4gICAgLy8gcHJldmlvdXNseSBmb3VuZCB0cmVlcy4gVGhlIG1ldGhvZCB3aWxsIGVuZC5cbiAgICBpZiAoIWlzRm9yZXN0KSB7XG4gICAgICBmbGF0Rm9yZXN0ID0gW107XG4gICAgfVxuICAgIC8vIFNhdmUgY3VycmVudGx5IHZpc2l0ZWQgbm9kZXMgYXMgYSB0cmVlIGluIG91ciBmb3Jlc3QuIFJlc2V0XG4gICAgLy8gdmlzaXRlZCBhbmQgcGFyZW50cyBsaXN0cy4gQ29udGludWUgd2l0aCB0aGUgbmV4dCBjb21wb25lbnQgb2ZcbiAgICAvLyB0aGUgZ3JhcGgsIGlmIGFueS5cbiAgICBlbHNlIHtcbiAgICAgICAgdmFyIHRlbXAgPSBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHZpc2l0ZWQpKTtcbiAgICAgICAgZmxhdEZvcmVzdC5wdXNoKHRlbXApO1xuICAgICAgICAvL2ZsYXRGb3Jlc3QgPSBmbGF0Rm9yZXN0LmNvbmNhdCh0ZW1wKTtcbiAgICAgICAgLy91blByb2Nlc3NlZE5vZGVzLnJlbW92ZUFsbCh2aXNpdGVkKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZW1wLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIHZhbHVlID0gdGVtcFtpXTtcbiAgICAgICAgICB2YXIgaW5kZXggPSB1blByb2Nlc3NlZE5vZGVzLmluZGV4T2YodmFsdWUpO1xuICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICB1blByb2Nlc3NlZE5vZGVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZpc2l0ZWQgPSBuZXcgU2V0KCk7XG4gICAgICAgIHBhcmVudHMgPSBuZXcgTWFwKCk7XG4gICAgICB9XG4gIH1cblxuICByZXR1cm4gZmxhdEZvcmVzdDtcbn07XG5cbi8qKlxyXG4gKiBUaGlzIG1ldGhvZCBjcmVhdGVzIGR1bW15IG5vZGVzIChhbiBsLWxldmVsIG5vZGUgd2l0aCBtaW5pbWFsIGRpbWVuc2lvbnMpXHJcbiAqIGZvciB0aGUgZ2l2ZW4gZWRnZSAob25lIHBlciBiZW5kcG9pbnQpLiBUaGUgZXhpc3RpbmcgbC1sZXZlbCBzdHJ1Y3R1cmVcclxuICogaXMgdXBkYXRlZCBhY2NvcmRpbmdseS5cclxuICovXG5MYXlvdXQucHJvdG90eXBlLmNyZWF0ZUR1bW15Tm9kZXNGb3JCZW5kcG9pbnRzID0gZnVuY3Rpb24gKGVkZ2UpIHtcbiAgdmFyIGR1bW15Tm9kZXMgPSBbXTtcbiAgdmFyIHByZXYgPSBlZGdlLnNvdXJjZTtcblxuICB2YXIgZ3JhcGggPSB0aGlzLmdyYXBoTWFuYWdlci5jYWxjTG93ZXN0Q29tbW9uQW5jZXN0b3IoZWRnZS5zb3VyY2UsIGVkZ2UudGFyZ2V0KTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGVkZ2UuYmVuZHBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgIC8vIGNyZWF0ZSBuZXcgZHVtbXkgbm9kZVxuICAgIHZhciBkdW1teU5vZGUgPSB0aGlzLm5ld05vZGUobnVsbCk7XG4gICAgZHVtbXlOb2RlLnNldFJlY3QobmV3IFBvaW50KDAsIDApLCBuZXcgRGltZW5zaW9uKDEsIDEpKTtcblxuICAgIGdyYXBoLmFkZChkdW1teU5vZGUpO1xuXG4gICAgLy8gY3JlYXRlIG5ldyBkdW1teSBlZGdlIGJldHdlZW4gcHJldiBhbmQgZHVtbXkgbm9kZVxuICAgIHZhciBkdW1teUVkZ2UgPSB0aGlzLm5ld0VkZ2UobnVsbCk7XG4gICAgdGhpcy5ncmFwaE1hbmFnZXIuYWRkKGR1bW15RWRnZSwgcHJldiwgZHVtbXlOb2RlKTtcblxuICAgIGR1bW15Tm9kZXMuYWRkKGR1bW15Tm9kZSk7XG4gICAgcHJldiA9IGR1bW15Tm9kZTtcbiAgfVxuXG4gIHZhciBkdW1teUVkZ2UgPSB0aGlzLm5ld0VkZ2UobnVsbCk7XG4gIHRoaXMuZ3JhcGhNYW5hZ2VyLmFkZChkdW1teUVkZ2UsIHByZXYsIGVkZ2UudGFyZ2V0KTtcblxuICB0aGlzLmVkZ2VUb0R1bW15Tm9kZXMuc2V0KGVkZ2UsIGR1bW15Tm9kZXMpO1xuXG4gIC8vIHJlbW92ZSByZWFsIGVkZ2UgZnJvbSBncmFwaCBtYW5hZ2VyIGlmIGl0IGlzIGludGVyLWdyYXBoXG4gIGlmIChlZGdlLmlzSW50ZXJHcmFwaCgpKSB7XG4gICAgdGhpcy5ncmFwaE1hbmFnZXIucmVtb3ZlKGVkZ2UpO1xuICB9XG4gIC8vIGVsc2UsIHJlbW92ZSB0aGUgZWRnZSBmcm9tIHRoZSBjdXJyZW50IGdyYXBoXG4gIGVsc2Uge1xuICAgICAgZ3JhcGgucmVtb3ZlKGVkZ2UpO1xuICAgIH1cblxuICByZXR1cm4gZHVtbXlOb2Rlcztcbn07XG5cbi8qKlxyXG4gKiBUaGlzIG1ldGhvZCBjcmVhdGVzIGJlbmRwb2ludHMgZm9yIGVkZ2VzIGZyb20gdGhlIGR1bW15IG5vZGVzXHJcbiAqIGF0IGwtbGV2ZWwuXHJcbiAqL1xuTGF5b3V0LnByb3RvdHlwZS5jcmVhdGVCZW5kcG9pbnRzRnJvbUR1bW15Tm9kZXMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBlZGdlcyA9IFtdO1xuICBlZGdlcyA9IGVkZ2VzLmNvbmNhdCh0aGlzLmdyYXBoTWFuYWdlci5nZXRBbGxFZGdlcygpKTtcbiAgZWRnZXMgPSBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHRoaXMuZWRnZVRvRHVtbXlOb2Rlcy5rZXlzKCkpKS5jb25jYXQoZWRnZXMpO1xuXG4gIGZvciAodmFyIGsgPSAwOyBrIDwgZWRnZXMubGVuZ3RoOyBrKyspIHtcbiAgICB2YXIgbEVkZ2UgPSBlZGdlc1trXTtcblxuICAgIGlmIChsRWRnZS5iZW5kcG9pbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhciBwYXRoID0gdGhpcy5lZGdlVG9EdW1teU5vZGVzLmdldChsRWRnZSk7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZHVtbXlOb2RlID0gcGF0aFtpXTtcbiAgICAgICAgdmFyIHAgPSBuZXcgUG9pbnREKGR1bW15Tm9kZS5nZXRDZW50ZXJYKCksIGR1bW15Tm9kZS5nZXRDZW50ZXJZKCkpO1xuXG4gICAgICAgIC8vIHVwZGF0ZSBiZW5kcG9pbnQncyBsb2NhdGlvbiBhY2NvcmRpbmcgdG8gZHVtbXkgbm9kZVxuICAgICAgICB2YXIgZWJwID0gbEVkZ2UuYmVuZHBvaW50cy5nZXQoaSk7XG4gICAgICAgIGVicC54ID0gcC54O1xuICAgICAgICBlYnAueSA9IHAueTtcblxuICAgICAgICAvLyByZW1vdmUgdGhlIGR1bW15IG5vZGUsIGR1bW15IGVkZ2VzIGluY2lkZW50IHdpdGggdGhpc1xuICAgICAgICAvLyBkdW1teSBub2RlIGlzIGFsc28gcmVtb3ZlZCAod2l0aGluIHRoZSByZW1vdmUgbWV0aG9kKVxuICAgICAgICBkdW1teU5vZGUuZ2V0T3duZXIoKS5yZW1vdmUoZHVtbXlOb2RlKTtcbiAgICAgIH1cblxuICAgICAgLy8gYWRkIHRoZSByZWFsIGVkZ2UgdG8gZ3JhcGhcbiAgICAgIHRoaXMuZ3JhcGhNYW5hZ2VyLmFkZChsRWRnZSwgbEVkZ2Uuc291cmNlLCBsRWRnZS50YXJnZXQpO1xuICAgIH1cbiAgfVxufTtcblxuTGF5b3V0LnRyYW5zZm9ybSA9IGZ1bmN0aW9uIChzbGlkZXJWYWx1ZSwgZGVmYXVsdFZhbHVlLCBtaW5EaXYsIG1heE11bCkge1xuICBpZiAobWluRGl2ICE9IHVuZGVmaW5lZCAmJiBtYXhNdWwgIT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIHZhbHVlID0gZGVmYXVsdFZhbHVlO1xuXG4gICAgaWYgKHNsaWRlclZhbHVlIDw9IDUwKSB7XG4gICAgICB2YXIgbWluVmFsdWUgPSBkZWZhdWx0VmFsdWUgLyBtaW5EaXY7XG4gICAgICB2YWx1ZSAtPSAoZGVmYXVsdFZhbHVlIC0gbWluVmFsdWUpIC8gNTAgKiAoNTAgLSBzbGlkZXJWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBtYXhWYWx1ZSA9IGRlZmF1bHRWYWx1ZSAqIG1heE11bDtcbiAgICAgIHZhbHVlICs9IChtYXhWYWx1ZSAtIGRlZmF1bHRWYWx1ZSkgLyA1MCAqIChzbGlkZXJWYWx1ZSAtIDUwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGEsIGI7XG5cbiAgICBpZiAoc2xpZGVyVmFsdWUgPD0gNTApIHtcbiAgICAgIGEgPSA5LjAgKiBkZWZhdWx0VmFsdWUgLyA1MDAuMDtcbiAgICAgIGIgPSBkZWZhdWx0VmFsdWUgLyAxMC4wO1xuICAgIH0gZWxzZSB7XG4gICAgICBhID0gOS4wICogZGVmYXVsdFZhbHVlIC8gNTAuMDtcbiAgICAgIGIgPSAtOCAqIGRlZmF1bHRWYWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gYSAqIHNsaWRlclZhbHVlICsgYjtcbiAgfVxufTtcblxuLyoqXHJcbiAqIFRoaXMgbWV0aG9kIGZpbmRzIGFuZCByZXR1cm5zIHRoZSBjZW50ZXIgb2YgdGhlIGdpdmVuIG5vZGVzLCBhc3N1bWluZ1xyXG4gKiB0aGF0IHRoZSBnaXZlbiBub2RlcyBmb3JtIGEgdHJlZSBpbiB0aGVtc2VsdmVzLlxyXG4gKi9cbkxheW91dC5maW5kQ2VudGVyT2ZUcmVlID0gZnVuY3Rpb24gKG5vZGVzKSB7XG4gIHZhciBsaXN0ID0gW107XG4gIGxpc3QgPSBsaXN0LmNvbmNhdChub2Rlcyk7XG5cbiAgdmFyIHJlbW92ZWROb2RlcyA9IFtdO1xuICB2YXIgcmVtYWluaW5nRGVncmVlcyA9IG5ldyBNYXAoKTtcbiAgdmFyIGZvdW5kQ2VudGVyID0gZmFsc2U7XG4gIHZhciBjZW50ZXJOb2RlID0gbnVsbDtcblxuICBpZiAobGlzdC5sZW5ndGggPT0gMSB8fCBsaXN0Lmxlbmd0aCA9PSAyKSB7XG4gICAgZm91bmRDZW50ZXIgPSB0cnVlO1xuICAgIGNlbnRlck5vZGUgPSBsaXN0WzBdO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG5vZGUgPSBsaXN0W2ldO1xuICAgIHZhciBkZWdyZWUgPSBub2RlLmdldE5laWdoYm9yc0xpc3QoKS5zaXplO1xuICAgIHJlbWFpbmluZ0RlZ3JlZXMuc2V0KG5vZGUsIG5vZGUuZ2V0TmVpZ2hib3JzTGlzdCgpLnNpemUpO1xuXG4gICAgaWYgKGRlZ3JlZSA9PSAxKSB7XG4gICAgICByZW1vdmVkTm9kZXMucHVzaChub2RlKTtcbiAgICB9XG4gIH1cblxuICB2YXIgdGVtcExpc3QgPSBbXTtcbiAgdGVtcExpc3QgPSB0ZW1wTGlzdC5jb25jYXQocmVtb3ZlZE5vZGVzKTtcblxuICB3aGlsZSAoIWZvdW5kQ2VudGVyKSB7XG4gICAgdmFyIHRlbXBMaXN0MiA9IFtdO1xuICAgIHRlbXBMaXN0MiA9IHRlbXBMaXN0Mi5jb25jYXQodGVtcExpc3QpO1xuICAgIHRlbXBMaXN0ID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBub2RlID0gbGlzdFtpXTtcblxuICAgICAgdmFyIGluZGV4ID0gbGlzdC5pbmRleE9mKG5vZGUpO1xuICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgbGlzdC5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfVxuXG4gICAgICB2YXIgbmVpZ2hib3VycyA9IG5vZGUuZ2V0TmVpZ2hib3JzTGlzdCgpO1xuXG4gICAgICBuZWlnaGJvdXJzLmZvckVhY2goZnVuY3Rpb24gKG5laWdoYm91cikge1xuICAgICAgICBpZiAocmVtb3ZlZE5vZGVzLmluZGV4T2YobmVpZ2hib3VyKSA8IDApIHtcbiAgICAgICAgICB2YXIgb3RoZXJEZWdyZWUgPSByZW1haW5pbmdEZWdyZWVzLmdldChuZWlnaGJvdXIpO1xuICAgICAgICAgIHZhciBuZXdEZWdyZWUgPSBvdGhlckRlZ3JlZSAtIDE7XG5cbiAgICAgICAgICBpZiAobmV3RGVncmVlID09IDEpIHtcbiAgICAgICAgICAgIHRlbXBMaXN0LnB1c2gobmVpZ2hib3VyKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZW1haW5pbmdEZWdyZWVzLnNldChuZWlnaGJvdXIsIG5ld0RlZ3JlZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlbW92ZWROb2RlcyA9IHJlbW92ZWROb2Rlcy5jb25jYXQodGVtcExpc3QpO1xuXG4gICAgaWYgKGxpc3QubGVuZ3RoID09IDEgfHwgbGlzdC5sZW5ndGggPT0gMikge1xuICAgICAgZm91bmRDZW50ZXIgPSB0cnVlO1xuICAgICAgY2VudGVyTm9kZSA9IGxpc3RbMF07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNlbnRlck5vZGU7XG59O1xuXG4vKipcclxuICogRHVyaW5nIHRoZSBjb2Fyc2VuaW5nIHByb2Nlc3MsIHRoaXMgbGF5b3V0IG1heSBiZSByZWZlcmVuY2VkIGJ5IHR3byBncmFwaCBtYW5hZ2Vyc1xyXG4gKiB0aGlzIHNldHRlciBmdW5jdGlvbiBncmFudHMgYWNjZXNzIHRvIGNoYW5nZSB0aGUgY3VycmVudGx5IGJlaW5nIHVzZWQgZ3JhcGggbWFuYWdlclxyXG4gKi9cbkxheW91dC5wcm90b3R5cGUuc2V0R3JhcGhNYW5hZ2VyID0gZnVuY3Rpb24gKGdtKSB7XG4gIHRoaXMuZ3JhcGhNYW5hZ2VyID0gZ207XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IExheW91dDtcblxuLyoqKi8gfSksXG4vKiAxNiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5mdW5jdGlvbiBSYW5kb21TZWVkKCkge31cbi8vIGFkYXB0ZWQgZnJvbTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE5MzAzNzI1XG5SYW5kb21TZWVkLnNlZWQgPSAxO1xuUmFuZG9tU2VlZC54ID0gMDtcblxuUmFuZG9tU2VlZC5uZXh0RG91YmxlID0gZnVuY3Rpb24gKCkge1xuICBSYW5kb21TZWVkLnggPSBNYXRoLnNpbihSYW5kb21TZWVkLnNlZWQrKykgKiAxMDAwMDtcbiAgcmV0dXJuIFJhbmRvbVNlZWQueCAtIE1hdGguZmxvb3IoUmFuZG9tU2VlZC54KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmFuZG9tU2VlZDtcblxuLyoqKi8gfSksXG4vKiAxNyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgUG9pbnREID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTtcblxuZnVuY3Rpb24gVHJhbnNmb3JtKHgsIHkpIHtcbiAgdGhpcy5sd29ybGRPcmdYID0gMC4wO1xuICB0aGlzLmx3b3JsZE9yZ1kgPSAwLjA7XG4gIHRoaXMubGRldmljZU9yZ1ggPSAwLjA7XG4gIHRoaXMubGRldmljZU9yZ1kgPSAwLjA7XG4gIHRoaXMubHdvcmxkRXh0WCA9IDEuMDtcbiAgdGhpcy5sd29ybGRFeHRZID0gMS4wO1xuICB0aGlzLmxkZXZpY2VFeHRYID0gMS4wO1xuICB0aGlzLmxkZXZpY2VFeHRZID0gMS4wO1xufVxuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLmdldFdvcmxkT3JnWCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubHdvcmxkT3JnWDtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuc2V0V29ybGRPcmdYID0gZnVuY3Rpb24gKHdveCkge1xuICB0aGlzLmx3b3JsZE9yZ1ggPSB3b3g7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLmdldFdvcmxkT3JnWSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubHdvcmxkT3JnWTtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuc2V0V29ybGRPcmdZID0gZnVuY3Rpb24gKHdveSkge1xuICB0aGlzLmx3b3JsZE9yZ1kgPSB3b3k7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLmdldFdvcmxkRXh0WCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubHdvcmxkRXh0WDtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuc2V0V29ybGRFeHRYID0gZnVuY3Rpb24gKHdleCkge1xuICB0aGlzLmx3b3JsZEV4dFggPSB3ZXg7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLmdldFdvcmxkRXh0WSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubHdvcmxkRXh0WTtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuc2V0V29ybGRFeHRZID0gZnVuY3Rpb24gKHdleSkge1xuICB0aGlzLmx3b3JsZEV4dFkgPSB3ZXk7XG59O1xuXG4vKiBEZXZpY2UgcmVsYXRlZCAqL1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLmdldERldmljZU9yZ1ggPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmxkZXZpY2VPcmdYO1xufTtcblxuVHJhbnNmb3JtLnByb3RvdHlwZS5zZXREZXZpY2VPcmdYID0gZnVuY3Rpb24gKGRveCkge1xuICB0aGlzLmxkZXZpY2VPcmdYID0gZG94O1xufTtcblxuVHJhbnNmb3JtLnByb3RvdHlwZS5nZXREZXZpY2VPcmdZID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5sZGV2aWNlT3JnWTtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuc2V0RGV2aWNlT3JnWSA9IGZ1bmN0aW9uIChkb3kpIHtcbiAgdGhpcy5sZGV2aWNlT3JnWSA9IGRveTtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuZ2V0RGV2aWNlRXh0WCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubGRldmljZUV4dFg7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLnNldERldmljZUV4dFggPSBmdW5jdGlvbiAoZGV4KSB7XG4gIHRoaXMubGRldmljZUV4dFggPSBkZXg7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLmdldERldmljZUV4dFkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmxkZXZpY2VFeHRZO1xufTtcblxuVHJhbnNmb3JtLnByb3RvdHlwZS5zZXREZXZpY2VFeHRZID0gZnVuY3Rpb24gKGRleSkge1xuICB0aGlzLmxkZXZpY2VFeHRZID0gZGV5O1xufTtcblxuVHJhbnNmb3JtLnByb3RvdHlwZS50cmFuc2Zvcm1YID0gZnVuY3Rpb24gKHgpIHtcbiAgdmFyIHhEZXZpY2UgPSAwLjA7XG4gIHZhciB3b3JsZEV4dFggPSB0aGlzLmx3b3JsZEV4dFg7XG4gIGlmICh3b3JsZEV4dFggIT0gMC4wKSB7XG4gICAgeERldmljZSA9IHRoaXMubGRldmljZU9yZ1ggKyAoeCAtIHRoaXMubHdvcmxkT3JnWCkgKiB0aGlzLmxkZXZpY2VFeHRYIC8gd29ybGRFeHRYO1xuICB9XG5cbiAgcmV0dXJuIHhEZXZpY2U7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLnRyYW5zZm9ybVkgPSBmdW5jdGlvbiAoeSkge1xuICB2YXIgeURldmljZSA9IDAuMDtcbiAgdmFyIHdvcmxkRXh0WSA9IHRoaXMubHdvcmxkRXh0WTtcbiAgaWYgKHdvcmxkRXh0WSAhPSAwLjApIHtcbiAgICB5RGV2aWNlID0gdGhpcy5sZGV2aWNlT3JnWSArICh5IC0gdGhpcy5sd29ybGRPcmdZKSAqIHRoaXMubGRldmljZUV4dFkgLyB3b3JsZEV4dFk7XG4gIH1cblxuICByZXR1cm4geURldmljZTtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuaW52ZXJzZVRyYW5zZm9ybVggPSBmdW5jdGlvbiAoeCkge1xuICB2YXIgeFdvcmxkID0gMC4wO1xuICB2YXIgZGV2aWNlRXh0WCA9IHRoaXMubGRldmljZUV4dFg7XG4gIGlmIChkZXZpY2VFeHRYICE9IDAuMCkge1xuICAgIHhXb3JsZCA9IHRoaXMubHdvcmxkT3JnWCArICh4IC0gdGhpcy5sZGV2aWNlT3JnWCkgKiB0aGlzLmx3b3JsZEV4dFggLyBkZXZpY2VFeHRYO1xuICB9XG5cbiAgcmV0dXJuIHhXb3JsZDtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuaW52ZXJzZVRyYW5zZm9ybVkgPSBmdW5jdGlvbiAoeSkge1xuICB2YXIgeVdvcmxkID0gMC4wO1xuICB2YXIgZGV2aWNlRXh0WSA9IHRoaXMubGRldmljZUV4dFk7XG4gIGlmIChkZXZpY2VFeHRZICE9IDAuMCkge1xuICAgIHlXb3JsZCA9IHRoaXMubHdvcmxkT3JnWSArICh5IC0gdGhpcy5sZGV2aWNlT3JnWSkgKiB0aGlzLmx3b3JsZEV4dFkgLyBkZXZpY2VFeHRZO1xuICB9XG4gIHJldHVybiB5V29ybGQ7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLmludmVyc2VUcmFuc2Zvcm1Qb2ludCA9IGZ1bmN0aW9uIChpblBvaW50KSB7XG4gIHZhciBvdXRQb2ludCA9IG5ldyBQb2ludEQodGhpcy5pbnZlcnNlVHJhbnNmb3JtWChpblBvaW50LngpLCB0aGlzLmludmVyc2VUcmFuc2Zvcm1ZKGluUG9pbnQueSkpO1xuICByZXR1cm4gb3V0UG9pbnQ7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFRyYW5zZm9ybTtcblxuLyoqKi8gfSksXG4vKiAxOCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5mdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBBcnJheShhcnIubGVuZ3RoKTsgaSA8IGFyci5sZW5ndGg7IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9IGVsc2UgeyByZXR1cm4gQXJyYXkuZnJvbShhcnIpOyB9IH1cblxudmFyIExheW91dCA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpO1xudmFyIEZETGF5b3V0Q29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcbnZhciBMYXlvdXRDb25zdGFudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xudmFyIElHZW9tZXRyeSA9IF9fd2VicGFja19yZXF1aXJlX18oOCk7XG52YXIgSU1hdGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpO1xuXG5mdW5jdGlvbiBGRExheW91dCgpIHtcbiAgTGF5b3V0LmNhbGwodGhpcyk7XG5cbiAgdGhpcy51c2VTbWFydElkZWFsRWRnZUxlbmd0aENhbGN1bGF0aW9uID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9VU0VfU01BUlRfSURFQUxfRURHRV9MRU5HVEhfQ0FMQ1VMQVRJT047XG4gIHRoaXMuZ3Jhdml0eUNvbnN0YW50ID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9HUkFWSVRZX1NUUkVOR1RIO1xuICB0aGlzLmNvbXBvdW5kR3Jhdml0eUNvbnN0YW50ID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9DT01QT1VORF9HUkFWSVRZX1NUUkVOR1RIO1xuICB0aGlzLmdyYXZpdHlSYW5nZUZhY3RvciA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfR1JBVklUWV9SQU5HRV9GQUNUT1I7XG4gIHRoaXMuY29tcG91bmRHcmF2aXR5UmFuZ2VGYWN0b3IgPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0NPTVBPVU5EX0dSQVZJVFlfUkFOR0VfRkFDVE9SO1xuICB0aGlzLmRpc3BsYWNlbWVudFRocmVzaG9sZFBlck5vZGUgPSAzLjAgKiBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIIC8gMTAwO1xuICB0aGlzLmNvb2xpbmdGYWN0b3IgPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0NPT0xJTkdfRkFDVE9SX0lOQ1JFTUVOVEFMO1xuICB0aGlzLmluaXRpYWxDb29saW5nRmFjdG9yID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9DT09MSU5HX0ZBQ1RPUl9JTkNSRU1FTlRBTDtcbiAgdGhpcy50b3RhbERpc3BsYWNlbWVudCA9IDAuMDtcbiAgdGhpcy5vbGRUb3RhbERpc3BsYWNlbWVudCA9IDAuMDtcbiAgdGhpcy5tYXhJdGVyYXRpb25zID0gRkRMYXlvdXRDb25zdGFudHMuTUFYX0lURVJBVElPTlM7XG59XG5cbkZETGF5b3V0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoTGF5b3V0LnByb3RvdHlwZSk7XG5cbmZvciAodmFyIHByb3AgaW4gTGF5b3V0KSB7XG4gIEZETGF5b3V0W3Byb3BdID0gTGF5b3V0W3Byb3BdO1xufVxuXG5GRExheW91dC5wcm90b3R5cGUuaW5pdFBhcmFtZXRlcnMgPSBmdW5jdGlvbiAoKSB7XG4gIExheW91dC5wcm90b3R5cGUuaW5pdFBhcmFtZXRlcnMuY2FsbCh0aGlzLCBhcmd1bWVudHMpO1xuXG4gIHRoaXMudG90YWxJdGVyYXRpb25zID0gMDtcbiAgdGhpcy5ub3RBbmltYXRlZEl0ZXJhdGlvbnMgPSAwO1xuXG4gIHRoaXMudXNlRlJHcmlkVmFyaWFudCA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfVVNFX1NNQVJUX1JFUFVMU0lPTl9SQU5HRV9DQUxDVUxBVElPTjtcblxuICB0aGlzLmdyaWQgPSBbXTtcbn07XG5cbkZETGF5b3V0LnByb3RvdHlwZS5jYWxjSWRlYWxFZGdlTGVuZ3RocyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGVkZ2U7XG4gIHZhciBvcmlnaW5hbElkZWFsTGVuZ3RoO1xuICB2YXIgbGNhRGVwdGg7XG4gIHZhciBzb3VyY2U7XG4gIHZhciB0YXJnZXQ7XG4gIHZhciBzaXplT2ZTb3VyY2VJbkxjYTtcbiAgdmFyIHNpemVPZlRhcmdldEluTGNhO1xuXG4gIHZhciBhbGxFZGdlcyA9IHRoaXMuZ2V0R3JhcGhNYW5hZ2VyKCkuZ2V0QWxsRWRnZXMoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbGxFZGdlcy5sZW5ndGg7IGkrKykge1xuICAgIGVkZ2UgPSBhbGxFZGdlc1tpXTtcblxuICAgIG9yaWdpbmFsSWRlYWxMZW5ndGggPSBlZGdlLmlkZWFsTGVuZ3RoO1xuXG4gICAgaWYgKGVkZ2UuaXNJbnRlckdyYXBoKSB7XG4gICAgICBzb3VyY2UgPSBlZGdlLmdldFNvdXJjZSgpO1xuICAgICAgdGFyZ2V0ID0gZWRnZS5nZXRUYXJnZXQoKTtcblxuICAgICAgc2l6ZU9mU291cmNlSW5MY2EgPSBlZGdlLmdldFNvdXJjZUluTGNhKCkuZ2V0RXN0aW1hdGVkU2l6ZSgpO1xuICAgICAgc2l6ZU9mVGFyZ2V0SW5MY2EgPSBlZGdlLmdldFRhcmdldEluTGNhKCkuZ2V0RXN0aW1hdGVkU2l6ZSgpO1xuXG4gICAgICBpZiAodGhpcy51c2VTbWFydElkZWFsRWRnZUxlbmd0aENhbGN1bGF0aW9uKSB7XG4gICAgICAgIGVkZ2UuaWRlYWxMZW5ndGggKz0gc2l6ZU9mU291cmNlSW5MY2EgKyBzaXplT2ZUYXJnZXRJbkxjYSAtIDIgKiBMYXlvdXRDb25zdGFudHMuU0lNUExFX05PREVfU0laRTtcbiAgICAgIH1cblxuICAgICAgbGNhRGVwdGggPSBlZGdlLmdldExjYSgpLmdldEluY2x1c2lvblRyZWVEZXB0aCgpO1xuXG4gICAgICBlZGdlLmlkZWFsTGVuZ3RoICs9IG9yaWdpbmFsSWRlYWxMZW5ndGggKiBGRExheW91dENvbnN0YW50cy5QRVJfTEVWRUxfSURFQUxfRURHRV9MRU5HVEhfRkFDVE9SICogKHNvdXJjZS5nZXRJbmNsdXNpb25UcmVlRGVwdGgoKSArIHRhcmdldC5nZXRJbmNsdXNpb25UcmVlRGVwdGgoKSAtIDIgKiBsY2FEZXB0aCk7XG4gICAgfVxuICB9XG59O1xuXG5GRExheW91dC5wcm90b3R5cGUuaW5pdFNwcmluZ0VtYmVkZGVyID0gZnVuY3Rpb24gKCkge1xuXG4gIHZhciBzID0gdGhpcy5nZXRBbGxOb2RlcygpLmxlbmd0aDtcbiAgaWYgKHRoaXMuaW5jcmVtZW50YWwpIHtcbiAgICBpZiAocyA+IEZETGF5b3V0Q29uc3RhbnRzLkFEQVBUQVRJT05fTE9XRVJfTk9ERV9MSU1JVCkge1xuICAgICAgdGhpcy5jb29saW5nRmFjdG9yID0gTWF0aC5tYXgodGhpcy5jb29saW5nRmFjdG9yICogRkRMYXlvdXRDb25zdGFudHMuQ09PTElOR19BREFQVEFUSU9OX0ZBQ1RPUiwgdGhpcy5jb29saW5nRmFjdG9yIC0gKHMgLSBGRExheW91dENvbnN0YW50cy5BREFQVEFUSU9OX0xPV0VSX05PREVfTElNSVQpIC8gKEZETGF5b3V0Q29uc3RhbnRzLkFEQVBUQVRJT05fVVBQRVJfTk9ERV9MSU1JVCAtIEZETGF5b3V0Q29uc3RhbnRzLkFEQVBUQVRJT05fTE9XRVJfTk9ERV9MSU1JVCkgKiB0aGlzLmNvb2xpbmdGYWN0b3IgKiAoMSAtIEZETGF5b3V0Q29uc3RhbnRzLkNPT0xJTkdfQURBUFRBVElPTl9GQUNUT1IpKTtcbiAgICB9XG4gICAgdGhpcy5tYXhOb2RlRGlzcGxhY2VtZW50ID0gRkRMYXlvdXRDb25zdGFudHMuTUFYX05PREVfRElTUExBQ0VNRU5UX0lOQ1JFTUVOVEFMO1xuICB9IGVsc2Uge1xuICAgIGlmIChzID4gRkRMYXlvdXRDb25zdGFudHMuQURBUFRBVElPTl9MT1dFUl9OT0RFX0xJTUlUKSB7XG4gICAgICB0aGlzLmNvb2xpbmdGYWN0b3IgPSBNYXRoLm1heChGRExheW91dENvbnN0YW50cy5DT09MSU5HX0FEQVBUQVRJT05fRkFDVE9SLCAxLjAgLSAocyAtIEZETGF5b3V0Q29uc3RhbnRzLkFEQVBUQVRJT05fTE9XRVJfTk9ERV9MSU1JVCkgLyAoRkRMYXlvdXRDb25zdGFudHMuQURBUFRBVElPTl9VUFBFUl9OT0RFX0xJTUlUIC0gRkRMYXlvdXRDb25zdGFudHMuQURBUFRBVElPTl9MT1dFUl9OT0RFX0xJTUlUKSAqICgxIC0gRkRMYXlvdXRDb25zdGFudHMuQ09PTElOR19BREFQVEFUSU9OX0ZBQ1RPUikpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvb2xpbmdGYWN0b3IgPSAxLjA7XG4gICAgfVxuICAgIHRoaXMuaW5pdGlhbENvb2xpbmdGYWN0b3IgPSB0aGlzLmNvb2xpbmdGYWN0b3I7XG4gICAgdGhpcy5tYXhOb2RlRGlzcGxhY2VtZW50ID0gRkRMYXlvdXRDb25zdGFudHMuTUFYX05PREVfRElTUExBQ0VNRU5UO1xuICB9XG5cbiAgdGhpcy5tYXhJdGVyYXRpb25zID0gTWF0aC5tYXgodGhpcy5nZXRBbGxOb2RlcygpLmxlbmd0aCAqIDUsIHRoaXMubWF4SXRlcmF0aW9ucyk7XG5cbiAgLy8gUmVhc3NpZ24gdGhpcyBhdHRyaWJ1dGUgYnkgdXNpbmcgbmV3IGNvbnN0YW50IHZhbHVlXG4gIHRoaXMuZGlzcGxhY2VtZW50VGhyZXNob2xkUGVyTm9kZSA9IDMuMCAqIEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfRURHRV9MRU5HVEggLyAxMDA7XG4gIHRoaXMudG90YWxEaXNwbGFjZW1lbnRUaHJlc2hvbGQgPSB0aGlzLmRpc3BsYWNlbWVudFRocmVzaG9sZFBlck5vZGUgKiB0aGlzLmdldEFsbE5vZGVzKCkubGVuZ3RoO1xuXG4gIHRoaXMucmVwdWxzaW9uUmFuZ2UgPSB0aGlzLmNhbGNSZXB1bHNpb25SYW5nZSgpO1xufTtcblxuRkRMYXlvdXQucHJvdG90eXBlLmNhbGNTcHJpbmdGb3JjZXMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBsRWRnZXMgPSB0aGlzLmdldEFsbEVkZ2VzKCk7XG4gIHZhciBlZGdlO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbEVkZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgZWRnZSA9IGxFZGdlc1tpXTtcblxuICAgIHRoaXMuY2FsY1NwcmluZ0ZvcmNlKGVkZ2UsIGVkZ2UuaWRlYWxMZW5ndGgpO1xuICB9XG59O1xuXG5GRExheW91dC5wcm90b3R5cGUuY2FsY1JlcHVsc2lvbkZvcmNlcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGdyaWRVcGRhdGVBbGxvd2VkID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB0cnVlO1xuICB2YXIgZm9yY2VUb05vZGVTdXJyb3VuZGluZ1VwZGF0ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG5cbiAgdmFyIGksIGo7XG4gIHZhciBub2RlQSwgbm9kZUI7XG4gIHZhciBsTm9kZXMgPSB0aGlzLmdldEFsbE5vZGVzKCk7XG4gIHZhciBwcm9jZXNzZWROb2RlU2V0O1xuXG4gIGlmICh0aGlzLnVzZUZSR3JpZFZhcmlhbnQpIHtcbiAgICBpZiAodGhpcy50b3RhbEl0ZXJhdGlvbnMgJSBGRExheW91dENvbnN0YW50cy5HUklEX0NBTENVTEFUSU9OX0NIRUNLX1BFUklPRCA9PSAxICYmIGdyaWRVcGRhdGVBbGxvd2VkKSB7XG4gICAgICB0aGlzLnVwZGF0ZUdyaWQoKTtcbiAgICB9XG5cbiAgICBwcm9jZXNzZWROb2RlU2V0ID0gbmV3IFNldCgpO1xuXG4gICAgLy8gY2FsY3VsYXRlIHJlcHVsc2lvbiBmb3JjZXMgYmV0d2VlbiBlYWNoIG5vZGVzIGFuZCBpdHMgc3Vycm91bmRpbmdcbiAgICBmb3IgKGkgPSAwOyBpIDwgbE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBub2RlQSA9IGxOb2Rlc1tpXTtcbiAgICAgIHRoaXMuY2FsY3VsYXRlUmVwdWxzaW9uRm9yY2VPZkFOb2RlKG5vZGVBLCBwcm9jZXNzZWROb2RlU2V0LCBncmlkVXBkYXRlQWxsb3dlZCwgZm9yY2VUb05vZGVTdXJyb3VuZGluZ1VwZGF0ZSk7XG4gICAgICBwcm9jZXNzZWROb2RlU2V0LmFkZChub2RlQSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAoaSA9IDA7IGkgPCBsTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG5vZGVBID0gbE5vZGVzW2ldO1xuXG4gICAgICBmb3IgKGogPSBpICsgMTsgaiA8IGxOb2Rlcy5sZW5ndGg7IGorKykge1xuICAgICAgICBub2RlQiA9IGxOb2Rlc1tqXTtcblxuICAgICAgICAvLyBJZiBib3RoIG5vZGVzIGFyZSBub3QgbWVtYmVycyBvZiB0aGUgc2FtZSBncmFwaCwgc2tpcC5cbiAgICAgICAgaWYgKG5vZGVBLmdldE93bmVyKCkgIT0gbm9kZUIuZ2V0T3duZXIoKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jYWxjUmVwdWxzaW9uRm9yY2Uobm9kZUEsIG5vZGVCKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbkZETGF5b3V0LnByb3RvdHlwZS5jYWxjR3Jhdml0YXRpb25hbEZvcmNlcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIG5vZGU7XG4gIHZhciBsTm9kZXMgPSB0aGlzLmdldEFsbE5vZGVzVG9BcHBseUdyYXZpdGF0aW9uKCk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICBub2RlID0gbE5vZGVzW2ldO1xuICAgIHRoaXMuY2FsY0dyYXZpdGF0aW9uYWxGb3JjZShub2RlKTtcbiAgfVxufTtcblxuRkRMYXlvdXQucHJvdG90eXBlLm1vdmVOb2RlcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGxOb2RlcyA9IHRoaXMuZ2V0QWxsTm9kZXMoKTtcbiAgdmFyIG5vZGU7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICBub2RlID0gbE5vZGVzW2ldO1xuICAgIG5vZGUubW92ZSgpO1xuICB9XG59O1xuXG5GRExheW91dC5wcm90b3R5cGUuY2FsY1NwcmluZ0ZvcmNlID0gZnVuY3Rpb24gKGVkZ2UsIGlkZWFsTGVuZ3RoKSB7XG4gIHZhciBzb3VyY2VOb2RlID0gZWRnZS5nZXRTb3VyY2UoKTtcbiAgdmFyIHRhcmdldE5vZGUgPSBlZGdlLmdldFRhcmdldCgpO1xuXG4gIHZhciBsZW5ndGg7XG4gIHZhciBzcHJpbmdGb3JjZTtcbiAgdmFyIHNwcmluZ0ZvcmNlWDtcbiAgdmFyIHNwcmluZ0ZvcmNlWTtcblxuICAvLyBVcGRhdGUgZWRnZSBsZW5ndGhcbiAgaWYgKHRoaXMudW5pZm9ybUxlYWZOb2RlU2l6ZXMgJiYgc291cmNlTm9kZS5nZXRDaGlsZCgpID09IG51bGwgJiYgdGFyZ2V0Tm9kZS5nZXRDaGlsZCgpID09IG51bGwpIHtcbiAgICBlZGdlLnVwZGF0ZUxlbmd0aFNpbXBsZSgpO1xuICB9IGVsc2Uge1xuICAgIGVkZ2UudXBkYXRlTGVuZ3RoKCk7XG5cbiAgICBpZiAoZWRnZS5pc092ZXJsYXBpbmdTb3VyY2VBbmRUYXJnZXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBsZW5ndGggPSBlZGdlLmdldExlbmd0aCgpO1xuXG4gIGlmIChsZW5ndGggPT0gMCkgcmV0dXJuO1xuXG4gIC8vIENhbGN1bGF0ZSBzcHJpbmcgZm9yY2VzXG4gIHNwcmluZ0ZvcmNlID0gZWRnZS5lZGdlRWxhc3RpY2l0eSAqIChsZW5ndGggLSBpZGVhbExlbmd0aCk7XG5cbiAgLy8gUHJvamVjdCBmb3JjZSBvbnRvIHggYW5kIHkgYXhlc1xuICBzcHJpbmdGb3JjZVggPSBzcHJpbmdGb3JjZSAqIChlZGdlLmxlbmd0aFggLyBsZW5ndGgpO1xuICBzcHJpbmdGb3JjZVkgPSBzcHJpbmdGb3JjZSAqIChlZGdlLmxlbmd0aFkgLyBsZW5ndGgpO1xuXG4gIC8vIEFwcGx5IGZvcmNlcyBvbiB0aGUgZW5kIG5vZGVzXG4gIHNvdXJjZU5vZGUuc3ByaW5nRm9yY2VYICs9IHNwcmluZ0ZvcmNlWDtcbiAgc291cmNlTm9kZS5zcHJpbmdGb3JjZVkgKz0gc3ByaW5nRm9yY2VZO1xuICB0YXJnZXROb2RlLnNwcmluZ0ZvcmNlWCAtPSBzcHJpbmdGb3JjZVg7XG4gIHRhcmdldE5vZGUuc3ByaW5nRm9yY2VZIC09IHNwcmluZ0ZvcmNlWTtcbn07XG5cbkZETGF5b3V0LnByb3RvdHlwZS5jYWxjUmVwdWxzaW9uRm9yY2UgPSBmdW5jdGlvbiAobm9kZUEsIG5vZGVCKSB7XG4gIHZhciByZWN0QSA9IG5vZGVBLmdldFJlY3QoKTtcbiAgdmFyIHJlY3RCID0gbm9kZUIuZ2V0UmVjdCgpO1xuICB2YXIgb3ZlcmxhcEFtb3VudCA9IG5ldyBBcnJheSgyKTtcbiAgdmFyIGNsaXBQb2ludHMgPSBuZXcgQXJyYXkoNCk7XG4gIHZhciBkaXN0YW5jZVg7XG4gIHZhciBkaXN0YW5jZVk7XG4gIHZhciBkaXN0YW5jZVNxdWFyZWQ7XG4gIHZhciBkaXN0YW5jZTtcbiAgdmFyIHJlcHVsc2lvbkZvcmNlO1xuICB2YXIgcmVwdWxzaW9uRm9yY2VYO1xuICB2YXIgcmVwdWxzaW9uRm9yY2VZO1xuXG4gIGlmIChyZWN0QS5pbnRlcnNlY3RzKHJlY3RCKSkgLy8gdHdvIG5vZGVzIG92ZXJsYXBcbiAgICB7XG4gICAgICAvLyBjYWxjdWxhdGUgc2VwYXJhdGlvbiBhbW91bnQgaW4geCBhbmQgeSBkaXJlY3Rpb25zXG4gICAgICBJR2VvbWV0cnkuY2FsY1NlcGFyYXRpb25BbW91bnQocmVjdEEsIHJlY3RCLCBvdmVybGFwQW1vdW50LCBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIIC8gMi4wKTtcblxuICAgICAgcmVwdWxzaW9uRm9yY2VYID0gMiAqIG92ZXJsYXBBbW91bnRbMF07XG4gICAgICByZXB1bHNpb25Gb3JjZVkgPSAyICogb3ZlcmxhcEFtb3VudFsxXTtcblxuICAgICAgdmFyIGNoaWxkcmVuQ29uc3RhbnQgPSBub2RlQS5ub09mQ2hpbGRyZW4gKiBub2RlQi5ub09mQ2hpbGRyZW4gLyAobm9kZUEubm9PZkNoaWxkcmVuICsgbm9kZUIubm9PZkNoaWxkcmVuKTtcblxuICAgICAgLy8gQXBwbHkgZm9yY2VzIG9uIHRoZSB0d28gbm9kZXNcbiAgICAgIG5vZGVBLnJlcHVsc2lvbkZvcmNlWCAtPSBjaGlsZHJlbkNvbnN0YW50ICogcmVwdWxzaW9uRm9yY2VYO1xuICAgICAgbm9kZUEucmVwdWxzaW9uRm9yY2VZIC09IGNoaWxkcmVuQ29uc3RhbnQgKiByZXB1bHNpb25Gb3JjZVk7XG4gICAgICBub2RlQi5yZXB1bHNpb25Gb3JjZVggKz0gY2hpbGRyZW5Db25zdGFudCAqIHJlcHVsc2lvbkZvcmNlWDtcbiAgICAgIG5vZGVCLnJlcHVsc2lvbkZvcmNlWSArPSBjaGlsZHJlbkNvbnN0YW50ICogcmVwdWxzaW9uRm9yY2VZO1xuICAgIH0gZWxzZSAvLyBubyBvdmVybGFwXG4gICAge1xuICAgICAgLy8gY2FsY3VsYXRlIGRpc3RhbmNlXG5cbiAgICAgIGlmICh0aGlzLnVuaWZvcm1MZWFmTm9kZVNpemVzICYmIG5vZGVBLmdldENoaWxkKCkgPT0gbnVsbCAmJiBub2RlQi5nZXRDaGlsZCgpID09IG51bGwpIC8vIHNpbXBseSBiYXNlIHJlcHVsc2lvbiBvbiBkaXN0YW5jZSBvZiBub2RlIGNlbnRlcnNcbiAgICAgICAge1xuICAgICAgICAgIGRpc3RhbmNlWCA9IHJlY3RCLmdldENlbnRlclgoKSAtIHJlY3RBLmdldENlbnRlclgoKTtcbiAgICAgICAgICBkaXN0YW5jZVkgPSByZWN0Qi5nZXRDZW50ZXJZKCkgLSByZWN0QS5nZXRDZW50ZXJZKCk7XG4gICAgICAgIH0gZWxzZSAvLyB1c2UgY2xpcHBpbmcgcG9pbnRzXG4gICAgICAgIHtcbiAgICAgICAgICBJR2VvbWV0cnkuZ2V0SW50ZXJzZWN0aW9uKHJlY3RBLCByZWN0QiwgY2xpcFBvaW50cyk7XG5cbiAgICAgICAgICBkaXN0YW5jZVggPSBjbGlwUG9pbnRzWzJdIC0gY2xpcFBvaW50c1swXTtcbiAgICAgICAgICBkaXN0YW5jZVkgPSBjbGlwUG9pbnRzWzNdIC0gY2xpcFBvaW50c1sxXTtcbiAgICAgICAgfVxuXG4gICAgICAvLyBObyByZXB1bHNpb24gcmFuZ2UuIEZSIGdyaWQgdmFyaWFudCBzaG91bGQgdGFrZSBjYXJlIG9mIHRoaXMuXG4gICAgICBpZiAoTWF0aC5hYnMoZGlzdGFuY2VYKSA8IEZETGF5b3V0Q29uc3RhbnRzLk1JTl9SRVBVTFNJT05fRElTVCkge1xuICAgICAgICBkaXN0YW5jZVggPSBJTWF0aC5zaWduKGRpc3RhbmNlWCkgKiBGRExheW91dENvbnN0YW50cy5NSU5fUkVQVUxTSU9OX0RJU1Q7XG4gICAgICB9XG5cbiAgICAgIGlmIChNYXRoLmFicyhkaXN0YW5jZVkpIDwgRkRMYXlvdXRDb25zdGFudHMuTUlOX1JFUFVMU0lPTl9ESVNUKSB7XG4gICAgICAgIGRpc3RhbmNlWSA9IElNYXRoLnNpZ24oZGlzdGFuY2VZKSAqIEZETGF5b3V0Q29uc3RhbnRzLk1JTl9SRVBVTFNJT05fRElTVDtcbiAgICAgIH1cblxuICAgICAgZGlzdGFuY2VTcXVhcmVkID0gZGlzdGFuY2VYICogZGlzdGFuY2VYICsgZGlzdGFuY2VZICogZGlzdGFuY2VZO1xuICAgICAgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZGlzdGFuY2VTcXVhcmVkKTtcblxuICAgICAgLy8gSGVyZSB3ZSB1c2UgaGFsZiBvZiB0aGUgbm9kZXMnIHJlcHVsc2lvbiB2YWx1ZXMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICAgIHJlcHVsc2lvbkZvcmNlID0gKG5vZGVBLm5vZGVSZXB1bHNpb24gLyAyICsgbm9kZUIubm9kZVJlcHVsc2lvbiAvIDIpICogbm9kZUEubm9PZkNoaWxkcmVuICogbm9kZUIubm9PZkNoaWxkcmVuIC8gZGlzdGFuY2VTcXVhcmVkO1xuXG4gICAgICAvLyBQcm9qZWN0IGZvcmNlIG9udG8geCBhbmQgeSBheGVzXG4gICAgICByZXB1bHNpb25Gb3JjZVggPSByZXB1bHNpb25Gb3JjZSAqIGRpc3RhbmNlWCAvIGRpc3RhbmNlO1xuICAgICAgcmVwdWxzaW9uRm9yY2VZID0gcmVwdWxzaW9uRm9yY2UgKiBkaXN0YW5jZVkgLyBkaXN0YW5jZTtcblxuICAgICAgLy8gQXBwbHkgZm9yY2VzIG9uIHRoZSB0d28gbm9kZXMgICAgXG4gICAgICBub2RlQS5yZXB1bHNpb25Gb3JjZVggLT0gcmVwdWxzaW9uRm9yY2VYO1xuICAgICAgbm9kZUEucmVwdWxzaW9uRm9yY2VZIC09IHJlcHVsc2lvbkZvcmNlWTtcbiAgICAgIG5vZGVCLnJlcHVsc2lvbkZvcmNlWCArPSByZXB1bHNpb25Gb3JjZVg7XG4gICAgICBub2RlQi5yZXB1bHNpb25Gb3JjZVkgKz0gcmVwdWxzaW9uRm9yY2VZO1xuICAgIH1cbn07XG5cbkZETGF5b3V0LnByb3RvdHlwZS5jYWxjR3Jhdml0YXRpb25hbEZvcmNlID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgdmFyIG93bmVyR3JhcGg7XG4gIHZhciBvd25lckNlbnRlclg7XG4gIHZhciBvd25lckNlbnRlclk7XG4gIHZhciBkaXN0YW5jZVg7XG4gIHZhciBkaXN0YW5jZVk7XG4gIHZhciBhYnNEaXN0YW5jZVg7XG4gIHZhciBhYnNEaXN0YW5jZVk7XG4gIHZhciBlc3RpbWF0ZWRTaXplO1xuICBvd25lckdyYXBoID0gbm9kZS5nZXRPd25lcigpO1xuXG4gIG93bmVyQ2VudGVyWCA9IChvd25lckdyYXBoLmdldFJpZ2h0KCkgKyBvd25lckdyYXBoLmdldExlZnQoKSkgLyAyO1xuICBvd25lckNlbnRlclkgPSAob3duZXJHcmFwaC5nZXRUb3AoKSArIG93bmVyR3JhcGguZ2V0Qm90dG9tKCkpIC8gMjtcbiAgZGlzdGFuY2VYID0gbm9kZS5nZXRDZW50ZXJYKCkgLSBvd25lckNlbnRlclg7XG4gIGRpc3RhbmNlWSA9IG5vZGUuZ2V0Q2VudGVyWSgpIC0gb3duZXJDZW50ZXJZO1xuICBhYnNEaXN0YW5jZVggPSBNYXRoLmFicyhkaXN0YW5jZVgpICsgbm9kZS5nZXRXaWR0aCgpIC8gMjtcbiAgYWJzRGlzdGFuY2VZID0gTWF0aC5hYnMoZGlzdGFuY2VZKSArIG5vZGUuZ2V0SGVpZ2h0KCkgLyAyO1xuXG4gIGlmIChub2RlLmdldE93bmVyKCkgPT0gdGhpcy5ncmFwaE1hbmFnZXIuZ2V0Um9vdCgpKSAvLyBpbiB0aGUgcm9vdCBncmFwaFxuICAgIHtcbiAgICAgIGVzdGltYXRlZFNpemUgPSBvd25lckdyYXBoLmdldEVzdGltYXRlZFNpemUoKSAqIHRoaXMuZ3Jhdml0eVJhbmdlRmFjdG9yO1xuXG4gICAgICBpZiAoYWJzRGlzdGFuY2VYID4gZXN0aW1hdGVkU2l6ZSB8fCBhYnNEaXN0YW5jZVkgPiBlc3RpbWF0ZWRTaXplKSB7XG4gICAgICAgIG5vZGUuZ3Jhdml0YXRpb25Gb3JjZVggPSAtdGhpcy5ncmF2aXR5Q29uc3RhbnQgKiBkaXN0YW5jZVg7XG4gICAgICAgIG5vZGUuZ3Jhdml0YXRpb25Gb3JjZVkgPSAtdGhpcy5ncmF2aXR5Q29uc3RhbnQgKiBkaXN0YW5jZVk7XG4gICAgICB9XG4gICAgfSBlbHNlIC8vIGluc2lkZSBhIGNvbXBvdW5kXG4gICAge1xuICAgICAgZXN0aW1hdGVkU2l6ZSA9IG93bmVyR3JhcGguZ2V0RXN0aW1hdGVkU2l6ZSgpICogdGhpcy5jb21wb3VuZEdyYXZpdHlSYW5nZUZhY3RvcjtcblxuICAgICAgaWYgKGFic0Rpc3RhbmNlWCA+IGVzdGltYXRlZFNpemUgfHwgYWJzRGlzdGFuY2VZID4gZXN0aW1hdGVkU2l6ZSkge1xuICAgICAgICBub2RlLmdyYXZpdGF0aW9uRm9yY2VYID0gLXRoaXMuZ3Jhdml0eUNvbnN0YW50ICogZGlzdGFuY2VYICogdGhpcy5jb21wb3VuZEdyYXZpdHlDb25zdGFudDtcbiAgICAgICAgbm9kZS5ncmF2aXRhdGlvbkZvcmNlWSA9IC10aGlzLmdyYXZpdHlDb25zdGFudCAqIGRpc3RhbmNlWSAqIHRoaXMuY29tcG91bmRHcmF2aXR5Q29uc3RhbnQ7XG4gICAgICB9XG4gICAgfVxufTtcblxuRkRMYXlvdXQucHJvdG90eXBlLmlzQ29udmVyZ2VkID0gZnVuY3Rpb24gKCkge1xuICB2YXIgY29udmVyZ2VkO1xuICB2YXIgb3NjaWxhdGluZyA9IGZhbHNlO1xuXG4gIGlmICh0aGlzLnRvdGFsSXRlcmF0aW9ucyA+IHRoaXMubWF4SXRlcmF0aW9ucyAvIDMpIHtcbiAgICBvc2NpbGF0aW5nID0gTWF0aC5hYnModGhpcy50b3RhbERpc3BsYWNlbWVudCAtIHRoaXMub2xkVG90YWxEaXNwbGFjZW1lbnQpIDwgMjtcbiAgfVxuXG4gIGNvbnZlcmdlZCA9IHRoaXMudG90YWxEaXNwbGFjZW1lbnQgPCB0aGlzLnRvdGFsRGlzcGxhY2VtZW50VGhyZXNob2xkO1xuXG4gIHRoaXMub2xkVG90YWxEaXNwbGFjZW1lbnQgPSB0aGlzLnRvdGFsRGlzcGxhY2VtZW50O1xuXG4gIHJldHVybiBjb252ZXJnZWQgfHwgb3NjaWxhdGluZztcbn07XG5cbkZETGF5b3V0LnByb3RvdHlwZS5hbmltYXRlID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5hbmltYXRpb25EdXJpbmdMYXlvdXQgJiYgIXRoaXMuaXNTdWJMYXlvdXQpIHtcbiAgICBpZiAodGhpcy5ub3RBbmltYXRlZEl0ZXJhdGlvbnMgPT0gdGhpcy5hbmltYXRpb25QZXJpb2QpIHtcbiAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgICB0aGlzLm5vdEFuaW1hdGVkSXRlcmF0aW9ucyA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubm90QW5pbWF0ZWRJdGVyYXRpb25zKys7XG4gICAgfVxuICB9XG59O1xuXG4vL1RoaXMgbWV0aG9kIGNhbGN1bGF0ZXMgdGhlIG51bWJlciBvZiBjaGlsZHJlbiAod2VpZ2h0KSBmb3IgYWxsIG5vZGVzXG5GRExheW91dC5wcm90b3R5cGUuY2FsY05vT2ZDaGlsZHJlbkZvckFsbE5vZGVzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbm9kZTtcbiAgdmFyIGFsbE5vZGVzID0gdGhpcy5ncmFwaE1hbmFnZXIuZ2V0QWxsTm9kZXMoKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgbm9kZSA9IGFsbE5vZGVzW2ldO1xuICAgIG5vZGUubm9PZkNoaWxkcmVuID0gbm9kZS5nZXROb09mQ2hpbGRyZW4oKTtcbiAgfVxufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNlY3Rpb246IEZSLUdyaWQgVmFyaWFudCBSZXB1bHNpb24gRm9yY2UgQ2FsY3VsYXRpb25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbkZETGF5b3V0LnByb3RvdHlwZS5jYWxjR3JpZCA9IGZ1bmN0aW9uIChncmFwaCkge1xuXG4gIHZhciBzaXplWCA9IDA7XG4gIHZhciBzaXplWSA9IDA7XG5cbiAgc2l6ZVggPSBwYXJzZUludChNYXRoLmNlaWwoKGdyYXBoLmdldFJpZ2h0KCkgLSBncmFwaC5nZXRMZWZ0KCkpIC8gdGhpcy5yZXB1bHNpb25SYW5nZSkpO1xuICBzaXplWSA9IHBhcnNlSW50KE1hdGguY2VpbCgoZ3JhcGguZ2V0Qm90dG9tKCkgLSBncmFwaC5nZXRUb3AoKSkgLyB0aGlzLnJlcHVsc2lvblJhbmdlKSk7XG5cbiAgdmFyIGdyaWQgPSBuZXcgQXJyYXkoc2l6ZVgpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZVg7IGkrKykge1xuICAgIGdyaWRbaV0gPSBuZXcgQXJyYXkoc2l6ZVkpO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplWDsgaSsrKSB7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBzaXplWTsgaisrKSB7XG4gICAgICBncmlkW2ldW2pdID0gbmV3IEFycmF5KCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGdyaWQ7XG59O1xuXG5GRExheW91dC5wcm90b3R5cGUuYWRkTm9kZVRvR3JpZCA9IGZ1bmN0aW9uICh2LCBsZWZ0LCB0b3ApIHtcblxuICB2YXIgc3RhcnRYID0gMDtcbiAgdmFyIGZpbmlzaFggPSAwO1xuICB2YXIgc3RhcnRZID0gMDtcbiAgdmFyIGZpbmlzaFkgPSAwO1xuXG4gIHN0YXJ0WCA9IHBhcnNlSW50KE1hdGguZmxvb3IoKHYuZ2V0UmVjdCgpLnggLSBsZWZ0KSAvIHRoaXMucmVwdWxzaW9uUmFuZ2UpKTtcbiAgZmluaXNoWCA9IHBhcnNlSW50KE1hdGguZmxvb3IoKHYuZ2V0UmVjdCgpLndpZHRoICsgdi5nZXRSZWN0KCkueCAtIGxlZnQpIC8gdGhpcy5yZXB1bHNpb25SYW5nZSkpO1xuICBzdGFydFkgPSBwYXJzZUludChNYXRoLmZsb29yKCh2LmdldFJlY3QoKS55IC0gdG9wKSAvIHRoaXMucmVwdWxzaW9uUmFuZ2UpKTtcbiAgZmluaXNoWSA9IHBhcnNlSW50KE1hdGguZmxvb3IoKHYuZ2V0UmVjdCgpLmhlaWdodCArIHYuZ2V0UmVjdCgpLnkgLSB0b3ApIC8gdGhpcy5yZXB1bHNpb25SYW5nZSkpO1xuXG4gIGZvciAodmFyIGkgPSBzdGFydFg7IGkgPD0gZmluaXNoWDsgaSsrKSB7XG4gICAgZm9yICh2YXIgaiA9IHN0YXJ0WTsgaiA8PSBmaW5pc2hZOyBqKyspIHtcbiAgICAgIHRoaXMuZ3JpZFtpXVtqXS5wdXNoKHYpO1xuICAgICAgdi5zZXRHcmlkQ29vcmRpbmF0ZXMoc3RhcnRYLCBmaW5pc2hYLCBzdGFydFksIGZpbmlzaFkpO1xuICAgIH1cbiAgfVxufTtcblxuRkRMYXlvdXQucHJvdG90eXBlLnVwZGF0ZUdyaWQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBpO1xuICB2YXIgbm9kZUE7XG4gIHZhciBsTm9kZXMgPSB0aGlzLmdldEFsbE5vZGVzKCk7XG5cbiAgdGhpcy5ncmlkID0gdGhpcy5jYWxjR3JpZCh0aGlzLmdyYXBoTWFuYWdlci5nZXRSb290KCkpO1xuXG4gIC8vIHB1dCBhbGwgbm9kZXMgdG8gcHJvcGVyIGdyaWQgY2VsbHNcbiAgZm9yIChpID0gMDsgaSA8IGxOb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIG5vZGVBID0gbE5vZGVzW2ldO1xuICAgIHRoaXMuYWRkTm9kZVRvR3JpZChub2RlQSwgdGhpcy5ncmFwaE1hbmFnZXIuZ2V0Um9vdCgpLmdldExlZnQoKSwgdGhpcy5ncmFwaE1hbmFnZXIuZ2V0Um9vdCgpLmdldFRvcCgpKTtcbiAgfVxufTtcblxuRkRMYXlvdXQucHJvdG90eXBlLmNhbGN1bGF0ZVJlcHVsc2lvbkZvcmNlT2ZBTm9kZSA9IGZ1bmN0aW9uIChub2RlQSwgcHJvY2Vzc2VkTm9kZVNldCwgZ3JpZFVwZGF0ZUFsbG93ZWQsIGZvcmNlVG9Ob2RlU3Vycm91bmRpbmdVcGRhdGUpIHtcblxuICBpZiAodGhpcy50b3RhbEl0ZXJhdGlvbnMgJSBGRExheW91dENvbnN0YW50cy5HUklEX0NBTENVTEFUSU9OX0NIRUNLX1BFUklPRCA9PSAxICYmIGdyaWRVcGRhdGVBbGxvd2VkIHx8IGZvcmNlVG9Ob2RlU3Vycm91bmRpbmdVcGRhdGUpIHtcbiAgICB2YXIgc3Vycm91bmRpbmcgPSBuZXcgU2V0KCk7XG4gICAgbm9kZUEuc3Vycm91bmRpbmcgPSBuZXcgQXJyYXkoKTtcbiAgICB2YXIgbm9kZUI7XG4gICAgdmFyIGdyaWQgPSB0aGlzLmdyaWQ7XG5cbiAgICBmb3IgKHZhciBpID0gbm9kZUEuc3RhcnRYIC0gMTsgaSA8IG5vZGVBLmZpbmlzaFggKyAyOyBpKyspIHtcbiAgICAgIGZvciAodmFyIGogPSBub2RlQS5zdGFydFkgLSAxOyBqIDwgbm9kZUEuZmluaXNoWSArIDI7IGorKykge1xuICAgICAgICBpZiAoIShpIDwgMCB8fCBqIDwgMCB8fCBpID49IGdyaWQubGVuZ3RoIHx8IGogPj0gZ3JpZFswXS5sZW5ndGgpKSB7XG4gICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBncmlkW2ldW2pdLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICBub2RlQiA9IGdyaWRbaV1bal1ba107XG5cbiAgICAgICAgICAgIC8vIElmIGJvdGggbm9kZXMgYXJlIG5vdCBtZW1iZXJzIG9mIHRoZSBzYW1lIGdyYXBoLCBcbiAgICAgICAgICAgIC8vIG9yIGJvdGggbm9kZXMgYXJlIHRoZSBzYW1lLCBza2lwLlxuICAgICAgICAgICAgaWYgKG5vZGVBLmdldE93bmVyKCkgIT0gbm9kZUIuZ2V0T3duZXIoKSB8fCBub2RlQSA9PSBub2RlQikge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIHJlcHVsc2lvbiBmb3JjZSBiZXR3ZWVuXG4gICAgICAgICAgICAvLyBub2RlQSBhbmQgbm9kZUIgaGFzIGFscmVhZHkgYmVlbiBjYWxjdWxhdGVkXG4gICAgICAgICAgICBpZiAoIXByb2Nlc3NlZE5vZGVTZXQuaGFzKG5vZGVCKSAmJiAhc3Vycm91bmRpbmcuaGFzKG5vZGVCKSkge1xuICAgICAgICAgICAgICB2YXIgZGlzdGFuY2VYID0gTWF0aC5hYnMobm9kZUEuZ2V0Q2VudGVyWCgpIC0gbm9kZUIuZ2V0Q2VudGVyWCgpKSAtIChub2RlQS5nZXRXaWR0aCgpIC8gMiArIG5vZGVCLmdldFdpZHRoKCkgLyAyKTtcbiAgICAgICAgICAgICAgdmFyIGRpc3RhbmNlWSA9IE1hdGguYWJzKG5vZGVBLmdldENlbnRlclkoKSAtIG5vZGVCLmdldENlbnRlclkoKSkgLSAobm9kZUEuZ2V0SGVpZ2h0KCkgLyAyICsgbm9kZUIuZ2V0SGVpZ2h0KCkgLyAyKTtcblxuICAgICAgICAgICAgICAvLyBpZiB0aGUgZGlzdGFuY2UgYmV0d2VlbiBub2RlQSBhbmQgbm9kZUIgXG4gICAgICAgICAgICAgIC8vIGlzIGxlc3MgdGhlbiBjYWxjdWxhdGlvbiByYW5nZVxuICAgICAgICAgICAgICBpZiAoZGlzdGFuY2VYIDw9IHRoaXMucmVwdWxzaW9uUmFuZ2UgJiYgZGlzdGFuY2VZIDw9IHRoaXMucmVwdWxzaW9uUmFuZ2UpIHtcbiAgICAgICAgICAgICAgICAvL3RoZW4gYWRkIG5vZGVCIHRvIHN1cnJvdW5kaW5nIG9mIG5vZGVBXG4gICAgICAgICAgICAgICAgc3Vycm91bmRpbmcuYWRkKG5vZGVCKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIG5vZGVBLnN1cnJvdW5kaW5nID0gW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShzdXJyb3VuZGluZykpO1xuICB9XG4gIGZvciAoaSA9IDA7IGkgPCBub2RlQS5zdXJyb3VuZGluZy5sZW5ndGg7IGkrKykge1xuICAgIHRoaXMuY2FsY1JlcHVsc2lvbkZvcmNlKG5vZGVBLCBub2RlQS5zdXJyb3VuZGluZ1tpXSk7XG4gIH1cbn07XG5cbkZETGF5b3V0LnByb3RvdHlwZS5jYWxjUmVwdWxzaW9uUmFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAwLjA7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEZETGF5b3V0O1xuXG4vKioqLyB9KSxcbi8qIDE5ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBMRWRnZSA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG52YXIgRkRMYXlvdXRDb25zdGFudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpO1xuXG5mdW5jdGlvbiBGRExheW91dEVkZ2Uoc291cmNlLCB0YXJnZXQsIHZFZGdlKSB7XG4gIExFZGdlLmNhbGwodGhpcywgc291cmNlLCB0YXJnZXQsIHZFZGdlKTtcblxuICAvLyBJZGVhbCBsZW5ndGggYW5kIGVsYXN0aWNpdHkgdmFsdWUgZm9yIHRoaXMgZWRnZVxuICB0aGlzLmlkZWFsTGVuZ3RoID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9FREdFX0xFTkdUSDtcbiAgdGhpcy5lZGdlRWxhc3RpY2l0eSA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfU1BSSU5HX1NUUkVOR1RIO1xufVxuXG5GRExheW91dEVkZ2UucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShMRWRnZS5wcm90b3R5cGUpO1xuXG5mb3IgKHZhciBwcm9wIGluIExFZGdlKSB7XG4gIEZETGF5b3V0RWRnZVtwcm9wXSA9IExFZGdlW3Byb3BdO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEZETGF5b3V0RWRnZTtcblxuLyoqKi8gfSksXG4vKiAyMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgTE5vZGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpO1xudmFyIEZETGF5b3V0Q29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcblxuZnVuY3Rpb24gRkRMYXlvdXROb2RlKGdtLCBsb2MsIHNpemUsIHZOb2RlKSB7XG4gIC8vIGFsdGVybmF0aXZlIGNvbnN0cnVjdG9yIGlzIGhhbmRsZWQgaW5zaWRlIExOb2RlXG4gIExOb2RlLmNhbGwodGhpcywgZ20sIGxvYywgc2l6ZSwgdk5vZGUpO1xuXG4gIC8vIFJlcHVsc2lvbiB2YWx1ZSBvZiB0aGlzIG5vZGVcbiAgdGhpcy5ub2RlUmVwdWxzaW9uID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9SRVBVTFNJT05fU1RSRU5HVEg7XG5cbiAgLy9TcHJpbmcsIHJlcHVsc2lvbiBhbmQgZ3Jhdml0YXRpb25hbCBmb3JjZXMgYWN0aW5nIG9uIHRoaXMgbm9kZVxuICB0aGlzLnNwcmluZ0ZvcmNlWCA9IDA7XG4gIHRoaXMuc3ByaW5nRm9yY2VZID0gMDtcbiAgdGhpcy5yZXB1bHNpb25Gb3JjZVggPSAwO1xuICB0aGlzLnJlcHVsc2lvbkZvcmNlWSA9IDA7XG4gIHRoaXMuZ3Jhdml0YXRpb25Gb3JjZVggPSAwO1xuICB0aGlzLmdyYXZpdGF0aW9uRm9yY2VZID0gMDtcbiAgLy9BbW91bnQgYnkgd2hpY2ggdGhpcyBub2RlIGlzIHRvIGJlIG1vdmVkIGluIHRoaXMgaXRlcmF0aW9uXG4gIHRoaXMuZGlzcGxhY2VtZW50WCA9IDA7XG4gIHRoaXMuZGlzcGxhY2VtZW50WSA9IDA7XG5cbiAgLy9TdGFydCBhbmQgZmluaXNoIGdyaWQgY29vcmRpbmF0ZXMgdGhhdCB0aGlzIG5vZGUgaXMgZmFsbGVuIGludG9cbiAgdGhpcy5zdGFydFggPSAwO1xuICB0aGlzLmZpbmlzaFggPSAwO1xuICB0aGlzLnN0YXJ0WSA9IDA7XG4gIHRoaXMuZmluaXNoWSA9IDA7XG5cbiAgLy9HZW9tZXRyaWMgbmVpZ2hib3JzIG9mIHRoaXMgbm9kZVxuICB0aGlzLnN1cnJvdW5kaW5nID0gW107XG59XG5cbkZETGF5b3V0Tm9kZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKExOb2RlLnByb3RvdHlwZSk7XG5cbmZvciAodmFyIHByb3AgaW4gTE5vZGUpIHtcbiAgRkRMYXlvdXROb2RlW3Byb3BdID0gTE5vZGVbcHJvcF07XG59XG5cbkZETGF5b3V0Tm9kZS5wcm90b3R5cGUuc2V0R3JpZENvb3JkaW5hdGVzID0gZnVuY3Rpb24gKF9zdGFydFgsIF9maW5pc2hYLCBfc3RhcnRZLCBfZmluaXNoWSkge1xuICB0aGlzLnN0YXJ0WCA9IF9zdGFydFg7XG4gIHRoaXMuZmluaXNoWCA9IF9maW5pc2hYO1xuICB0aGlzLnN0YXJ0WSA9IF9zdGFydFk7XG4gIHRoaXMuZmluaXNoWSA9IF9maW5pc2hZO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBGRExheW91dE5vZGU7XG5cbi8qKiovIH0pLFxuLyogMjEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuZnVuY3Rpb24gRGltZW5zaW9uRCh3aWR0aCwgaGVpZ2h0KSB7XG4gIHRoaXMud2lkdGggPSAwO1xuICB0aGlzLmhlaWdodCA9IDA7XG4gIGlmICh3aWR0aCAhPT0gbnVsbCAmJiBoZWlnaHQgIT09IG51bGwpIHtcbiAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gIH1cbn1cblxuRGltZW5zaW9uRC5wcm90b3R5cGUuZ2V0V2lkdGggPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLndpZHRoO1xufTtcblxuRGltZW5zaW9uRC5wcm90b3R5cGUuc2V0V2lkdGggPSBmdW5jdGlvbiAod2lkdGgpIHtcbiAgdGhpcy53aWR0aCA9IHdpZHRoO1xufTtcblxuRGltZW5zaW9uRC5wcm90b3R5cGUuZ2V0SGVpZ2h0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5oZWlnaHQ7XG59O1xuXG5EaW1lbnNpb25ELnByb3RvdHlwZS5zZXRIZWlnaHQgPSBmdW5jdGlvbiAoaGVpZ2h0KSB7XG4gIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBEaW1lbnNpb25EO1xuXG4vKioqLyB9KSxcbi8qIDIyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBVbmlxdWVJREdlbmVyZXRvciA9IF9fd2VicGFja19yZXF1aXJlX18oMTQpO1xuXG5mdW5jdGlvbiBIYXNoTWFwKCkge1xuICB0aGlzLm1hcCA9IHt9O1xuICB0aGlzLmtleXMgPSBbXTtcbn1cblxuSGFzaE1hcC5wcm90b3R5cGUucHV0ID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgdmFyIHRoZUlkID0gVW5pcXVlSURHZW5lcmV0b3IuY3JlYXRlSUQoa2V5KTtcbiAgaWYgKCF0aGlzLmNvbnRhaW5zKHRoZUlkKSkge1xuICAgIHRoaXMubWFwW3RoZUlkXSA9IHZhbHVlO1xuICAgIHRoaXMua2V5cy5wdXNoKGtleSk7XG4gIH1cbn07XG5cbkhhc2hNYXAucHJvdG90eXBlLmNvbnRhaW5zID0gZnVuY3Rpb24gKGtleSkge1xuICB2YXIgdGhlSWQgPSBVbmlxdWVJREdlbmVyZXRvci5jcmVhdGVJRChrZXkpO1xuICByZXR1cm4gdGhpcy5tYXBba2V5XSAhPSBudWxsO1xufTtcblxuSGFzaE1hcC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKGtleSkge1xuICB2YXIgdGhlSWQgPSBVbmlxdWVJREdlbmVyZXRvci5jcmVhdGVJRChrZXkpO1xuICByZXR1cm4gdGhpcy5tYXBbdGhlSWRdO1xufTtcblxuSGFzaE1hcC5wcm90b3R5cGUua2V5U2V0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5rZXlzO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBIYXNoTWFwO1xuXG4vKioqLyB9KSxcbi8qIDIzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBVbmlxdWVJREdlbmVyZXRvciA9IF9fd2VicGFja19yZXF1aXJlX18oMTQpO1xuXG5mdW5jdGlvbiBIYXNoU2V0KCkge1xuICB0aGlzLnNldCA9IHt9O1xufVxuO1xuXG5IYXNoU2V0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAob2JqKSB7XG4gIHZhciB0aGVJZCA9IFVuaXF1ZUlER2VuZXJldG9yLmNyZWF0ZUlEKG9iaik7XG4gIGlmICghdGhpcy5jb250YWlucyh0aGVJZCkpIHRoaXMuc2V0W3RoZUlkXSA9IG9iajtcbn07XG5cbkhhc2hTZXQucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChvYmopIHtcbiAgZGVsZXRlIHRoaXMuc2V0W1VuaXF1ZUlER2VuZXJldG9yLmNyZWF0ZUlEKG9iaildO1xufTtcblxuSGFzaFNldC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuc2V0ID0ge307XG59O1xuXG5IYXNoU2V0LnByb3RvdHlwZS5jb250YWlucyA9IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIHRoaXMuc2V0W1VuaXF1ZUlER2VuZXJldG9yLmNyZWF0ZUlEKG9iaildID09IG9iajtcbn07XG5cbkhhc2hTZXQucHJvdG90eXBlLmlzRW1wdHkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnNpemUoKSA9PT0gMDtcbn07XG5cbkhhc2hTZXQucHJvdG90eXBlLnNpemUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLnNldCkubGVuZ3RoO1xufTtcblxuLy9jb25jYXRzIHRoaXMuc2V0IHRvIHRoZSBnaXZlbiBsaXN0XG5IYXNoU2V0LnByb3RvdHlwZS5hZGRBbGxUbyA9IGZ1bmN0aW9uIChsaXN0KSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXModGhpcy5zZXQpO1xuICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICBsaXN0LnB1c2godGhpcy5zZXRba2V5c1tpXV0pO1xuICB9XG59O1xuXG5IYXNoU2V0LnByb3RvdHlwZS5zaXplID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5zZXQpLmxlbmd0aDtcbn07XG5cbkhhc2hTZXQucHJvdG90eXBlLmFkZEFsbCA9IGZ1bmN0aW9uIChsaXN0KSB7XG4gIHZhciBzID0gbGlzdC5sZW5ndGg7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgczsgaSsrKSB7XG4gICAgdmFyIHYgPSBsaXN0W2ldO1xuICAgIHRoaXMuYWRkKHYpO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEhhc2hTZXQ7XG5cbi8qKiovIH0pLFxuLyogMjQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuLy8gU29tZSBtYXRyaXggKDFkIGFuZCAyZCBhcnJheSkgb3BlcmF0aW9uc1xuZnVuY3Rpb24gTWF0cml4KCkge31cblxuLyoqXG4gKiBtYXRyaXggbXVsdGlwbGljYXRpb25cbiAqIGFycmF5MSwgYXJyYXkyIGFuZCByZXN1bHQgYXJlIDJkIGFycmF5c1xuICovXG5NYXRyaXgubXVsdE1hdCA9IGZ1bmN0aW9uIChhcnJheTEsIGFycmF5Mikge1xuICB2YXIgcmVzdWx0ID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheTEubGVuZ3RoOyBpKyspIHtcbiAgICByZXN1bHRbaV0gPSBbXTtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGFycmF5MlswXS5sZW5ndGg7IGorKykge1xuICAgICAgcmVzdWx0W2ldW2pdID0gMDtcbiAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgYXJyYXkxWzBdLmxlbmd0aDsgaysrKSB7XG4gICAgICAgIHJlc3VsdFtpXVtqXSArPSBhcnJheTFbaV1ba10gKiBhcnJheTJba11bal07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIG1hdHJpeCB0cmFuc3Bvc2VcbiAqIGFycmF5IGFuZCByZXN1bHQgYXJlIDJkIGFycmF5c1xuICovXG5NYXRyaXgudHJhbnNwb3NlID0gZnVuY3Rpb24gKGFycmF5KSB7XG4gIHZhciByZXN1bHQgPSBbXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5WzBdLmxlbmd0aDsgaSsrKSB7XG4gICAgcmVzdWx0W2ldID0gW107XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBhcnJheS5sZW5ndGg7IGorKykge1xuICAgICAgcmVzdWx0W2ldW2pdID0gYXJyYXlbal1baV07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogbXVsdGlwbHkgYXJyYXkgd2l0aCBjb25zdGFudFxuICogYXJyYXkgYW5kIHJlc3VsdCBhcmUgMWQgYXJyYXlzXG4gKi9cbk1hdHJpeC5tdWx0Q29ucyA9IGZ1bmN0aW9uIChhcnJheSwgY29uc3RhbnQpIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICByZXN1bHRbaV0gPSBhcnJheVtpXSAqIGNvbnN0YW50O1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogc3Vic3RyYWN0IHR3byBhcnJheXNcbiAqIGFycmF5MSwgYXJyYXkyIGFuZCByZXN1bHQgYXJlIDFkIGFycmF5c1xuICovXG5NYXRyaXgubWludXNPcCA9IGZ1bmN0aW9uIChhcnJheTEsIGFycmF5Mikge1xuICB2YXIgcmVzdWx0ID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheTEubGVuZ3RoOyBpKyspIHtcbiAgICByZXN1bHRbaV0gPSBhcnJheTFbaV0gLSBhcnJheTJbaV07XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBkb3QgcHJvZHVjdCBvZiB0d28gYXJyYXlzIHdpdGggc2FtZSBzaXplXG4gKiBhcnJheTEgYW5kIGFycmF5MiBhcmUgMWQgYXJyYXlzXG4gKi9cbk1hdHJpeC5kb3RQcm9kdWN0ID0gZnVuY3Rpb24gKGFycmF5MSwgYXJyYXkyKSB7XG4gIHZhciBwcm9kdWN0ID0gMDtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5MS5sZW5ndGg7IGkrKykge1xuICAgIHByb2R1Y3QgKz0gYXJyYXkxW2ldICogYXJyYXkyW2ldO1xuICB9XG5cbiAgcmV0dXJuIHByb2R1Y3Q7XG59O1xuXG4vKipcbiAqIG1hZ25pdHVkZSBvZiBhbiBhcnJheVxuICogYXJyYXkgaXMgMWQgYXJyYXlcbiAqL1xuTWF0cml4Lm1hZyA9IGZ1bmN0aW9uIChhcnJheSkge1xuICByZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZG90UHJvZHVjdChhcnJheSwgYXJyYXkpKTtcbn07XG5cbi8qKlxuICogbm9ybWFsaXphdGlvbiBvZiBhbiBhcnJheVxuICogYXJyYXkgYW5kIHJlc3VsdCBhcmUgMWQgYXJyYXlcbiAqL1xuTWF0cml4Lm5vcm1hbGl6ZSA9IGZ1bmN0aW9uIChhcnJheSkge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBtYWduaXR1ZGUgPSB0aGlzLm1hZyhhcnJheSk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgIHJlc3VsdFtpXSA9IGFycmF5W2ldIC8gbWFnbml0dWRlO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogbXVsdGlwbHkgYW4gYXJyYXkgd2l0aCBjZW50ZXJpbmcgbWF0cml4XG4gKiBhcnJheSBhbmQgcmVzdWx0IGFyZSAxZCBhcnJheVxuICovXG5NYXRyaXgubXVsdEdhbW1hID0gZnVuY3Rpb24gKGFycmF5KSB7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIHN1bSA9IDA7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgIHN1bSArPSBhcnJheVtpXTtcbiAgfVxuXG4gIHN1bSAqPSAtMSAvIGFycmF5Lmxlbmd0aDtcblxuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJyYXkubGVuZ3RoOyBfaSsrKSB7XG4gICAgcmVzdWx0W19pXSA9IHN1bSArIGFycmF5W19pXTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBhIHNwZWNpYWwgbWF0cml4IG11bHRpcGxpY2F0aW9uXG4gKiByZXN1bHQgPSAwLjUgKiBDICogSU5WICogQ15UICogYXJyYXlcbiAqIGFycmF5IGFuZCByZXN1bHQgYXJlIDFkLCBDIGFuZCBJTlYgYXJlIDJkIGFycmF5c1xuICovXG5NYXRyaXgubXVsdEwgPSBmdW5jdGlvbiAoYXJyYXksIEMsIElOVikge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciB0ZW1wMSA9IFtdO1xuICB2YXIgdGVtcDIgPSBbXTtcblxuICAvLyBtdWx0aXBseSBieSBDXlRcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBDWzBdLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHN1bSA9IDA7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBDLmxlbmd0aDsgaisrKSB7XG4gICAgICBzdW0gKz0gLTAuNSAqIENbal1baV0gKiBhcnJheVtqXTtcbiAgICB9XG4gICAgdGVtcDFbaV0gPSBzdW07XG4gIH1cbiAgLy8gbXVsdGlwbHkgdGhlIHJlc3VsdCBieSBJTlZcbiAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgSU5WLmxlbmd0aDsgX2kyKyspIHtcbiAgICB2YXIgX3N1bSA9IDA7XG4gICAgZm9yICh2YXIgX2ogPSAwOyBfaiA8IElOVi5sZW5ndGg7IF9qKyspIHtcbiAgICAgIF9zdW0gKz0gSU5WW19pMl1bX2pdICogdGVtcDFbX2pdO1xuICAgIH1cbiAgICB0ZW1wMltfaTJdID0gX3N1bTtcbiAgfVxuICAvLyBtdWx0aXBseSB0aGUgcmVzdWx0IGJ5IENcbiAgZm9yICh2YXIgX2kzID0gMDsgX2kzIDwgQy5sZW5ndGg7IF9pMysrKSB7XG4gICAgdmFyIF9zdW0yID0gMDtcbiAgICBmb3IgKHZhciBfajIgPSAwOyBfajIgPCBDWzBdLmxlbmd0aDsgX2oyKyspIHtcbiAgICAgIF9zdW0yICs9IENbX2kzXVtfajJdICogdGVtcDJbX2oyXTtcbiAgICB9XG4gICAgcmVzdWx0W19pM10gPSBfc3VtMjtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1hdHJpeDtcblxuLyoqKi8gfSksXG4vKiAyNSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgX2NyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSgpO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG4vKipcbiAqIEEgY2xhc3NpYyBRdWlja3NvcnQgYWxnb3JpdGhtIHdpdGggSG9hcmUncyBwYXJ0aXRpb25cbiAqIC0gV29ya3MgYWxzbyBvbiBMaW5rZWRMaXN0IG9iamVjdHNcbiAqXG4gKiBDb3B5cmlnaHQ6IGktVmlzIFJlc2VhcmNoIEdyb3VwLCBCaWxrZW50IFVuaXZlcnNpdHksIDIwMDcgLSBwcmVzZW50XG4gKi9cblxudmFyIExpbmtlZExpc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExKTtcblxudmFyIFF1aWNrc29ydCA9IGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBRdWlja3NvcnQoQSwgY29tcGFyZUZ1bmN0aW9uKSB7XG4gICAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBRdWlja3NvcnQpO1xuXG4gICAgICAgIGlmIChjb21wYXJlRnVuY3Rpb24gIT09IG51bGwgfHwgY29tcGFyZUZ1bmN0aW9uICE9PSB1bmRlZmluZWQpIHRoaXMuY29tcGFyZUZ1bmN0aW9uID0gdGhpcy5fZGVmYXVsdENvbXBhcmVGdW5jdGlvbjtcblxuICAgICAgICB2YXIgbGVuZ3RoID0gdm9pZCAwO1xuICAgICAgICBpZiAoQSBpbnN0YW5jZW9mIExpbmtlZExpc3QpIGxlbmd0aCA9IEEuc2l6ZSgpO2Vsc2UgbGVuZ3RoID0gQS5sZW5ndGg7XG5cbiAgICAgICAgdGhpcy5fcXVpY2tzb3J0KEEsIDAsIGxlbmd0aCAtIDEpO1xuICAgIH1cblxuICAgIF9jcmVhdGVDbGFzcyhRdWlja3NvcnQsIFt7XG4gICAgICAgIGtleTogJ19xdWlja3NvcnQnLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gX3F1aWNrc29ydChBLCBwLCByKSB7XG4gICAgICAgICAgICBpZiAocCA8IHIpIHtcbiAgICAgICAgICAgICAgICB2YXIgcSA9IHRoaXMuX3BhcnRpdGlvbihBLCBwLCByKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9xdWlja3NvcnQoQSwgcCwgcSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fcXVpY2tzb3J0KEEsIHEgKyAxLCByKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sIHtcbiAgICAgICAga2V5OiAnX3BhcnRpdGlvbicsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBfcGFydGl0aW9uKEEsIHAsIHIpIHtcbiAgICAgICAgICAgIHZhciB4ID0gdGhpcy5fZ2V0KEEsIHApO1xuICAgICAgICAgICAgdmFyIGkgPSBwO1xuICAgICAgICAgICAgdmFyIGogPSByO1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICB3aGlsZSAodGhpcy5jb21wYXJlRnVuY3Rpb24oeCwgdGhpcy5fZ2V0KEEsIGopKSkge1xuICAgICAgICAgICAgICAgICAgICBqLS07XG4gICAgICAgICAgICAgICAgfXdoaWxlICh0aGlzLmNvbXBhcmVGdW5jdGlvbih0aGlzLl9nZXQoQSwgaSksIHgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICB9aWYgKGkgPCBqKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3N3YXAoQSwgaSwgaik7XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgai0tO1xuICAgICAgICAgICAgICAgIH0gZWxzZSByZXR1cm4gajtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sIHtcbiAgICAgICAga2V5OiAnX2dldCcsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBfZ2V0KG9iamVjdCwgaW5kZXgpIHtcbiAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBMaW5rZWRMaXN0KSByZXR1cm4gb2JqZWN0LmdldF9vYmplY3RfYXQoaW5kZXgpO2Vsc2UgcmV0dXJuIG9iamVjdFtpbmRleF07XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGtleTogJ19zZXQnLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gX3NldChvYmplY3QsIGluZGV4LCB2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIExpbmtlZExpc3QpIG9iamVjdC5zZXRfb2JqZWN0X2F0KGluZGV4LCB2YWx1ZSk7ZWxzZSBvYmplY3RbaW5kZXhdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGtleTogJ19zd2FwJyxcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9zd2FwKEEsIGksIGopIHtcbiAgICAgICAgICAgIHZhciB0ZW1wID0gdGhpcy5fZ2V0KEEsIGkpO1xuICAgICAgICAgICAgdGhpcy5fc2V0KEEsIGksIHRoaXMuX2dldChBLCBqKSk7XG4gICAgICAgICAgICB0aGlzLl9zZXQoQSwgaiwgdGVtcCk7XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGtleTogJ19kZWZhdWx0Q29tcGFyZUZ1bmN0aW9uJyxcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9kZWZhdWx0Q29tcGFyZUZ1bmN0aW9uKGEsIGIpIHtcbiAgICAgICAgICAgIHJldHVybiBiID4gYTtcbiAgICAgICAgfVxuICAgIH1dKTtcblxuICAgIHJldHVybiBRdWlja3NvcnQ7XG59KCk7XG5cbm1vZHVsZS5leHBvcnRzID0gUXVpY2tzb3J0O1xuXG4vKioqLyB9KSxcbi8qIDI2ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbi8vIFNpbmd1bGFyIFZhbHVlIERlY29tcG9zaXRpb24gaW1wbGVtZW50YXRpb25cbmZ1bmN0aW9uIFNWRCgpIHt9O1xuXG4vKiBCZWxvdyBzaW5ndWxhciB2YWx1ZSBkZWNvbXBvc2l0aW9uIChzdmQpIGNvZGUgaW5jbHVkaW5nIGh5cG90IGZ1bmN0aW9uIGlzIGFkb3B0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vZHJhZ29uZmx5LWFpL0phbWFKU1xuICAgU29tZSBjaGFuZ2VzIGFyZSBhcHBsaWVkIHRvIG1ha2UgdGhlIGNvZGUgY29tcGF0aWJsZSB3aXRoIHRoZSBmY29zZSBjb2RlIGFuZCB0byBtYWtlIGl0IGluZGVwZW5kZW50IGZyb20gSmFtYS5cbiAgIElucHV0IG1hdHJpeCBpcyBjaGFuZ2VkIHRvIGEgMkQgYXJyYXkgaW5zdGVhZCBvZiBKYW1hIG1hdHJpeC4gTWF0cml4IGRpbWVuc2lvbnMgYXJlIHRha2VuIGFjY29yZGluZyB0byAyRCBhcnJheSBpbnN0ZWFkIG9mIHVzaW5nIEphbWEgZnVuY3Rpb25zLlxuICAgQW4gb2JqZWN0IHRoYXQgaW5jbHVkZXMgc2luZ3VsYXIgdmFsdWUgY29tcG9uZW50cyBpcyBjcmVhdGVkIGZvciByZXR1cm4uIFxuICAgVGhlIHR5cGVzIG9mIGlucHV0IHBhcmFtZXRlcnMgb2YgdGhlIGh5cG90IGZ1bmN0aW9uIGFyZSByZW1vdmVkLiBcbiAgIGxldCBpcyB1c2VkIGluc3RlYWQgb2YgdmFyIGZvciB0aGUgdmFyaWFibGUgaW5pdGlhbGl6YXRpb24uXG4qL1xuLypcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNFxuICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL1xuXG4gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT05cblxuICAgMS4gRGVmaW5pdGlvbnMuXG5cbiAgICAgIFwiTGljZW5zZVwiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbixcbiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LlxuXG4gICAgICBcIkxpY2Vuc29yXCIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5XG4gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuXG5cbiAgICAgIFwiTGVnYWwgRW50aXR5XCIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbFxuICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vblxuICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbixcbiAgICAgIFwiY29udHJvbFwiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlXG4gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvclxuICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlXG4gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LlxuXG4gICAgICBcIllvdVwiIChvciBcIllvdXJcIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eVxuICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS5cblxuICAgICAgXCJTb3VyY2VcIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucyxcbiAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb25cbiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuXG5cbiAgICAgIFwiT2JqZWN0XCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWxcbiAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXRcbiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbixcbiAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy5cblxuICAgICAgXCJXb3JrXCIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvclxuICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYVxuICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrXG4gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLlxuXG4gICAgICBcIkRlcml2YXRpdmUgV29ya3NcIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3RcbiAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGVcbiAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnNcbiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzXG4gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW5cbiAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZixcbiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuXG5cbiAgICAgIFwiQ29udHJpYnV0aW9uXCIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmdcbiAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnNcbiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseVxuICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lclxuICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mXG4gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgXCJzdWJtaXR0ZWRcIlxuICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudFxuICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG9cbiAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsXG4gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZVxuICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0XG4gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZVxuICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgXCJOb3QgYSBDb250cmlidXRpb24uXCJcblxuICAgICAgXCJDb250cmlidXRvclwiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eVxuICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kXG4gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay5cblxuICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mXG4gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsXG4gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZVxuICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsXG4gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGVcbiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uXG5cbiAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZlxuICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLFxuICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGVcbiAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLFxuICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssXG4gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZVxuICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXJcbiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocylcbiAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91XG4gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYVxuICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29ya1xuICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3RcbiAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXNcbiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZVxuICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLlxuXG4gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZVxuICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0XG4gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdVxuICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG5cbiAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yXG4gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmRcblxuICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlc1xuICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZFxuXG4gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3NcbiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kXG4gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yayxcbiAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mXG4gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZFxuXG4gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSBcIk5PVElDRVwiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0c1xuICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3RcbiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWRcbiAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3RcbiAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmVcbiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZFxuICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3JcbiAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvcixcbiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kXG4gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzXG4gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZFxuICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uXG4gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGVcbiAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWRcbiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWRcbiAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuXG5cbiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZFxuICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvclxuICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsXG4gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGhcbiAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuXG5cbiAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSxcbiAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29ya1xuICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2ZcbiAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLlxuICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeVxuICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWRcbiAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy5cblxuICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZVxuICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLFxuICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlXG4gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS5cblxuICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yXG4gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoXG4gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yXG4gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9uc1xuICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQVxuICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlXG4gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnlcbiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS5cblxuICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksXG4gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSxcbiAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5XG4gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZVxuICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLFxuICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhXG4gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlXG4gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsXG4gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbFxuICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvclxuICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLlxuXG4gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nXG4gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLFxuICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSxcbiAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzXG4gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seVxuICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGZcbiAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSxcbiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eVxuICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvblxuICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuXG5cbiAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OU1xuXG4gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuXG5cbiAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nXG4gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyBcInt9XCJcbiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlXG4gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZVxuICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhXG4gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlXG4gICAgICBzYW1lIFwicHJpbnRlZCBwYWdlXCIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llclxuICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLlxuXG4gICBDb3B5cmlnaHQge3l5eXl9IHtuYW1lIG9mIGNvcHlyaWdodCBvd25lcn1cblxuICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuXG5TVkQuc3ZkID0gZnVuY3Rpb24gKEEpIHtcbiAgdGhpcy5VID0gbnVsbDtcbiAgdGhpcy5WID0gbnVsbDtcbiAgdGhpcy5zID0gbnVsbDtcbiAgdGhpcy5tID0gMDtcbiAgdGhpcy5uID0gMDtcbiAgdGhpcy5tID0gQS5sZW5ndGg7XG4gIHRoaXMubiA9IEFbMF0ubGVuZ3RoO1xuICB2YXIgbnUgPSBNYXRoLm1pbih0aGlzLm0sIHRoaXMubik7XG4gIHRoaXMucyA9IGZ1bmN0aW9uIChzKSB7XG4gICAgdmFyIGEgPSBbXTtcbiAgICB3aGlsZSAocy0tID4gMCkge1xuICAgICAgYS5wdXNoKDApO1xuICAgIH1yZXR1cm4gYTtcbiAgfShNYXRoLm1pbih0aGlzLm0gKyAxLCB0aGlzLm4pKTtcbiAgdGhpcy5VID0gZnVuY3Rpb24gKGRpbXMpIHtcbiAgICB2YXIgYWxsb2NhdGUgPSBmdW5jdGlvbiBhbGxvY2F0ZShkaW1zKSB7XG4gICAgICBpZiAoZGltcy5sZW5ndGggPT0gMCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBhcnJheSA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpbXNbMF07IGkrKykge1xuICAgICAgICAgIGFycmF5LnB1c2goYWxsb2NhdGUoZGltcy5zbGljZSgxKSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcnJheTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBhbGxvY2F0ZShkaW1zKTtcbiAgfShbdGhpcy5tLCBudV0pO1xuICB0aGlzLlYgPSBmdW5jdGlvbiAoZGltcykge1xuICAgIHZhciBhbGxvY2F0ZSA9IGZ1bmN0aW9uIGFsbG9jYXRlKGRpbXMpIHtcbiAgICAgIGlmIChkaW1zLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGFycmF5ID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGltc1swXTsgaSsrKSB7XG4gICAgICAgICAgYXJyYXkucHVzaChhbGxvY2F0ZShkaW1zLnNsaWNlKDEpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFycmF5O1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIGFsbG9jYXRlKGRpbXMpO1xuICB9KFt0aGlzLm4sIHRoaXMubl0pO1xuICB2YXIgZSA9IGZ1bmN0aW9uIChzKSB7XG4gICAgdmFyIGEgPSBbXTtcbiAgICB3aGlsZSAocy0tID4gMCkge1xuICAgICAgYS5wdXNoKDApO1xuICAgIH1yZXR1cm4gYTtcbiAgfSh0aGlzLm4pO1xuICB2YXIgd29yayA9IGZ1bmN0aW9uIChzKSB7XG4gICAgdmFyIGEgPSBbXTtcbiAgICB3aGlsZSAocy0tID4gMCkge1xuICAgICAgYS5wdXNoKDApO1xuICAgIH1yZXR1cm4gYTtcbiAgfSh0aGlzLm0pO1xuICB2YXIgd2FudHUgPSB0cnVlO1xuICB2YXIgd2FudHYgPSB0cnVlO1xuICB2YXIgbmN0ID0gTWF0aC5taW4odGhpcy5tIC0gMSwgdGhpcy5uKTtcbiAgdmFyIG5ydCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHRoaXMubiAtIDIsIHRoaXMubSkpO1xuICBmb3IgKHZhciBrID0gMDsgayA8IE1hdGgubWF4KG5jdCwgbnJ0KTsgaysrKSB7XG4gICAgaWYgKGsgPCBuY3QpIHtcbiAgICAgIHRoaXMuc1trXSA9IDA7XG4gICAgICBmb3IgKHZhciBpID0gazsgaSA8IHRoaXMubTsgaSsrKSB7XG4gICAgICAgIHRoaXMuc1trXSA9IFNWRC5oeXBvdCh0aGlzLnNba10sIEFbaV1ba10pO1xuICAgICAgfVxuICAgICAgO1xuICAgICAgaWYgKHRoaXMuc1trXSAhPT0gMC4wKSB7XG4gICAgICAgIGlmIChBW2tdW2tdIDwgMC4wKSB7XG4gICAgICAgICAgdGhpcy5zW2tdID0gLXRoaXMuc1trXTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKHZhciBfaSA9IGs7IF9pIDwgdGhpcy5tOyBfaSsrKSB7XG4gICAgICAgICAgQVtfaV1ba10gLz0gdGhpcy5zW2tdO1xuICAgICAgICB9XG4gICAgICAgIDtcbiAgICAgICAgQVtrXVtrXSArPSAxLjA7XG4gICAgICB9XG4gICAgICB0aGlzLnNba10gPSAtdGhpcy5zW2tdO1xuICAgIH1cbiAgICBmb3IgKHZhciBqID0gayArIDE7IGogPCB0aGlzLm47IGorKykge1xuICAgICAgaWYgKGZ1bmN0aW9uIChsaHMsIHJocykge1xuICAgICAgICByZXR1cm4gbGhzICYmIHJocztcbiAgICAgIH0oayA8IG5jdCwgdGhpcy5zW2tdICE9PSAwLjApKSB7XG4gICAgICAgIHZhciB0ID0gMDtcbiAgICAgICAgZm9yICh2YXIgX2kyID0gazsgX2kyIDwgdGhpcy5tOyBfaTIrKykge1xuICAgICAgICAgIHQgKz0gQVtfaTJdW2tdICogQVtfaTJdW2pdO1xuICAgICAgICB9XG4gICAgICAgIDtcbiAgICAgICAgdCA9IC10IC8gQVtrXVtrXTtcbiAgICAgICAgZm9yICh2YXIgX2kzID0gazsgX2kzIDwgdGhpcy5tOyBfaTMrKykge1xuICAgICAgICAgIEFbX2kzXVtqXSArPSB0ICogQVtfaTNdW2tdO1xuICAgICAgICB9XG4gICAgICAgIDtcbiAgICAgIH1cbiAgICAgIGVbal0gPSBBW2tdW2pdO1xuICAgIH1cbiAgICA7XG4gICAgaWYgKGZ1bmN0aW9uIChsaHMsIHJocykge1xuICAgICAgcmV0dXJuIGxocyAmJiByaHM7XG4gICAgfSh3YW50dSwgayA8IG5jdCkpIHtcbiAgICAgIGZvciAodmFyIF9pNCA9IGs7IF9pNCA8IHRoaXMubTsgX2k0KyspIHtcbiAgICAgICAgdGhpcy5VW19pNF1ba10gPSBBW19pNF1ba107XG4gICAgICB9XG4gICAgICA7XG4gICAgfVxuICAgIGlmIChrIDwgbnJ0KSB7XG4gICAgICBlW2tdID0gMDtcbiAgICAgIGZvciAodmFyIF9pNSA9IGsgKyAxOyBfaTUgPCB0aGlzLm47IF9pNSsrKSB7XG4gICAgICAgIGVba10gPSBTVkQuaHlwb3QoZVtrXSwgZVtfaTVdKTtcbiAgICAgIH1cbiAgICAgIDtcbiAgICAgIGlmIChlW2tdICE9PSAwLjApIHtcbiAgICAgICAgaWYgKGVbayArIDFdIDwgMC4wKSB7XG4gICAgICAgICAgZVtrXSA9IC1lW2tdO1xuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIF9pNiA9IGsgKyAxOyBfaTYgPCB0aGlzLm47IF9pNisrKSB7XG4gICAgICAgICAgZVtfaTZdIC89IGVba107XG4gICAgICAgIH1cbiAgICAgICAgO1xuICAgICAgICBlW2sgKyAxXSArPSAxLjA7XG4gICAgICB9XG4gICAgICBlW2tdID0gLWVba107XG4gICAgICBpZiAoZnVuY3Rpb24gKGxocywgcmhzKSB7XG4gICAgICAgIHJldHVybiBsaHMgJiYgcmhzO1xuICAgICAgfShrICsgMSA8IHRoaXMubSwgZVtrXSAhPT0gMC4wKSkge1xuICAgICAgICBmb3IgKHZhciBfaTcgPSBrICsgMTsgX2k3IDwgdGhpcy5tOyBfaTcrKykge1xuICAgICAgICAgIHdvcmtbX2k3XSA9IDAuMDtcbiAgICAgICAgfVxuICAgICAgICA7XG4gICAgICAgIGZvciAodmFyIF9qID0gayArIDE7IF9qIDwgdGhpcy5uOyBfaisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgX2k4ID0gayArIDE7IF9pOCA8IHRoaXMubTsgX2k4KyspIHtcbiAgICAgICAgICAgIHdvcmtbX2k4XSArPSBlW19qXSAqIEFbX2k4XVtfal07XG4gICAgICAgICAgfVxuICAgICAgICAgIDtcbiAgICAgICAgfVxuICAgICAgICA7XG4gICAgICAgIGZvciAodmFyIF9qMiA9IGsgKyAxOyBfajIgPCB0aGlzLm47IF9qMisrKSB7XG4gICAgICAgICAgdmFyIF90ID0gLWVbX2oyXSAvIGVbayArIDFdO1xuICAgICAgICAgIGZvciAodmFyIF9pOSA9IGsgKyAxOyBfaTkgPCB0aGlzLm07IF9pOSsrKSB7XG4gICAgICAgICAgICBBW19pOV1bX2oyXSArPSBfdCAqIHdvcmtbX2k5XTtcbiAgICAgICAgICB9XG4gICAgICAgICAgO1xuICAgICAgICB9XG4gICAgICAgIDtcbiAgICAgIH1cbiAgICAgIGlmICh3YW50dikge1xuICAgICAgICBmb3IgKHZhciBfaTEwID0gayArIDE7IF9pMTAgPCB0aGlzLm47IF9pMTArKykge1xuICAgICAgICAgIHRoaXMuVltfaTEwXVtrXSA9IGVbX2kxMF07XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9O1xuICB2YXIgcCA9IE1hdGgubWluKHRoaXMubiwgdGhpcy5tICsgMSk7XG4gIGlmIChuY3QgPCB0aGlzLm4pIHtcbiAgICB0aGlzLnNbbmN0XSA9IEFbbmN0XVtuY3RdO1xuICB9XG4gIGlmICh0aGlzLm0gPCBwKSB7XG4gICAgdGhpcy5zW3AgLSAxXSA9IDAuMDtcbiAgfVxuICBpZiAobnJ0ICsgMSA8IHApIHtcbiAgICBlW25ydF0gPSBBW25ydF1bcCAtIDFdO1xuICB9XG4gIGVbcCAtIDFdID0gMC4wO1xuICBpZiAod2FudHUpIHtcbiAgICBmb3IgKHZhciBfajMgPSBuY3Q7IF9qMyA8IG51OyBfajMrKykge1xuICAgICAgZm9yICh2YXIgX2kxMSA9IDA7IF9pMTEgPCB0aGlzLm07IF9pMTErKykge1xuICAgICAgICB0aGlzLlVbX2kxMV1bX2ozXSA9IDAuMDtcbiAgICAgIH1cbiAgICAgIDtcbiAgICAgIHRoaXMuVVtfajNdW19qM10gPSAxLjA7XG4gICAgfTtcbiAgICBmb3IgKHZhciBfayA9IG5jdCAtIDE7IF9rID49IDA7IF9rLS0pIHtcbiAgICAgIGlmICh0aGlzLnNbX2tdICE9PSAwLjApIHtcbiAgICAgICAgZm9yICh2YXIgX2o0ID0gX2sgKyAxOyBfajQgPCBudTsgX2o0KyspIHtcbiAgICAgICAgICB2YXIgX3QyID0gMDtcbiAgICAgICAgICBmb3IgKHZhciBfaTEyID0gX2s7IF9pMTIgPCB0aGlzLm07IF9pMTIrKykge1xuICAgICAgICAgICAgX3QyICs9IHRoaXMuVVtfaTEyXVtfa10gKiB0aGlzLlVbX2kxMl1bX2o0XTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIF90MiA9IC1fdDIgLyB0aGlzLlVbX2tdW19rXTtcbiAgICAgICAgICBmb3IgKHZhciBfaTEzID0gX2s7IF9pMTMgPCB0aGlzLm07IF9pMTMrKykge1xuICAgICAgICAgICAgdGhpcy5VW19pMTNdW19qNF0gKz0gX3QyICogdGhpcy5VW19pMTNdW19rXTtcbiAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgICAgICBmb3IgKHZhciBfaTE0ID0gX2s7IF9pMTQgPCB0aGlzLm07IF9pMTQrKykge1xuICAgICAgICAgIHRoaXMuVVtfaTE0XVtfa10gPSAtdGhpcy5VW19pMTRdW19rXTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5VW19rXVtfa10gPSAxLjAgKyB0aGlzLlVbX2tdW19rXTtcbiAgICAgICAgZm9yICh2YXIgX2kxNSA9IDA7IF9pMTUgPCBfayAtIDE7IF9pMTUrKykge1xuICAgICAgICAgIHRoaXMuVVtfaTE1XVtfa10gPSAwLjA7XG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKHZhciBfaTE2ID0gMDsgX2kxNiA8IHRoaXMubTsgX2kxNisrKSB7XG4gICAgICAgICAgdGhpcy5VW19pMTZdW19rXSA9IDAuMDtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5VW19rXVtfa10gPSAxLjA7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuICBpZiAod2FudHYpIHtcbiAgICBmb3IgKHZhciBfazIgPSB0aGlzLm4gLSAxOyBfazIgPj0gMDsgX2syLS0pIHtcbiAgICAgIGlmIChmdW5jdGlvbiAobGhzLCByaHMpIHtcbiAgICAgICAgcmV0dXJuIGxocyAmJiByaHM7XG4gICAgICB9KF9rMiA8IG5ydCwgZVtfazJdICE9PSAwLjApKSB7XG4gICAgICAgIGZvciAodmFyIF9qNSA9IF9rMiArIDE7IF9qNSA8IG51OyBfajUrKykge1xuICAgICAgICAgIHZhciBfdDMgPSAwO1xuICAgICAgICAgIGZvciAodmFyIF9pMTcgPSBfazIgKyAxOyBfaTE3IDwgdGhpcy5uOyBfaTE3KyspIHtcbiAgICAgICAgICAgIF90MyArPSB0aGlzLlZbX2kxN11bX2syXSAqIHRoaXMuVltfaTE3XVtfajVdO1xuICAgICAgICAgIH07XG4gICAgICAgICAgX3QzID0gLV90MyAvIHRoaXMuVltfazIgKyAxXVtfazJdO1xuICAgICAgICAgIGZvciAodmFyIF9pMTggPSBfazIgKyAxOyBfaTE4IDwgdGhpcy5uOyBfaTE4KyspIHtcbiAgICAgICAgICAgIHRoaXMuVltfaTE4XVtfajVdICs9IF90MyAqIHRoaXMuVltfaTE4XVtfazJdO1xuICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBfaTE5ID0gMDsgX2kxOSA8IHRoaXMubjsgX2kxOSsrKSB7XG4gICAgICAgIHRoaXMuVltfaTE5XVtfazJdID0gMC4wO1xuICAgICAgfTtcbiAgICAgIHRoaXMuVltfazJdW19rMl0gPSAxLjA7XG4gICAgfTtcbiAgfVxuICB2YXIgcHAgPSBwIC0gMTtcbiAgdmFyIGl0ZXIgPSAwO1xuICB2YXIgZXBzID0gTWF0aC5wb3coMi4wLCAtNTIuMCk7XG4gIHZhciB0aW55ID0gTWF0aC5wb3coMi4wLCAtOTY2LjApO1xuICB3aGlsZSAocCA+IDApIHtcbiAgICB2YXIgX2szID0gdm9pZCAwO1xuICAgIHZhciBrYXNlID0gdm9pZCAwO1xuICAgIGZvciAoX2szID0gcCAtIDI7IF9rMyA+PSAtMTsgX2szLS0pIHtcbiAgICAgIGlmIChfazMgPT09IC0xKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKE1hdGguYWJzKGVbX2szXSkgPD0gdGlueSArIGVwcyAqIChNYXRoLmFicyh0aGlzLnNbX2szXSkgKyBNYXRoLmFicyh0aGlzLnNbX2szICsgMV0pKSkge1xuICAgICAgICBlW19rM10gPSAwLjA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH07XG4gICAgaWYgKF9rMyA9PT0gcCAtIDIpIHtcbiAgICAgIGthc2UgPSA0O1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIga3MgPSB2b2lkIDA7XG4gICAgICBmb3IgKGtzID0gcCAtIDE7IGtzID49IF9rMzsga3MtLSkge1xuICAgICAgICBpZiAoa3MgPT09IF9rMykge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHZhciBfdDQgPSAoa3MgIT09IHAgPyBNYXRoLmFicyhlW2tzXSkgOiAwLjApICsgKGtzICE9PSBfazMgKyAxID8gTWF0aC5hYnMoZVtrcyAtIDFdKSA6IDAuMCk7XG4gICAgICAgIGlmIChNYXRoLmFicyh0aGlzLnNba3NdKSA8PSB0aW55ICsgZXBzICogX3Q0KSB7XG4gICAgICAgICAgdGhpcy5zW2tzXSA9IDAuMDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGlmIChrcyA9PT0gX2szKSB7XG4gICAgICAgIGthc2UgPSAzO1xuICAgICAgfSBlbHNlIGlmIChrcyA9PT0gcCAtIDEpIHtcbiAgICAgICAga2FzZSA9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBrYXNlID0gMjtcbiAgICAgICAgX2szID0ga3M7XG4gICAgICB9XG4gICAgfVxuICAgIF9rMysrO1xuICAgIHN3aXRjaCAoa2FzZSkge1xuICAgICAgY2FzZSAxOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGYgPSBlW3AgLSAyXTtcbiAgICAgICAgICBlW3AgLSAyXSA9IDAuMDtcbiAgICAgICAgICBmb3IgKHZhciBfajYgPSBwIC0gMjsgX2o2ID49IF9rMzsgX2o2LS0pIHtcbiAgICAgICAgICAgIHZhciBfdDUgPSBTVkQuaHlwb3QodGhpcy5zW19qNl0sIGYpO1xuICAgICAgICAgICAgdmFyIGNzID0gdGhpcy5zW19qNl0gLyBfdDU7XG4gICAgICAgICAgICB2YXIgc24gPSBmIC8gX3Q1O1xuICAgICAgICAgICAgdGhpcy5zW19qNl0gPSBfdDU7XG4gICAgICAgICAgICBpZiAoX2o2ICE9PSBfazMpIHtcbiAgICAgICAgICAgICAgZiA9IC1zbiAqIGVbX2o2IC0gMV07XG4gICAgICAgICAgICAgIGVbX2o2IC0gMV0gPSBjcyAqIGVbX2o2IC0gMV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAod2FudHYpIHtcbiAgICAgICAgICAgICAgZm9yICh2YXIgX2kyMCA9IDA7IF9pMjAgPCB0aGlzLm47IF9pMjArKykge1xuICAgICAgICAgICAgICAgIF90NSA9IGNzICogdGhpcy5WW19pMjBdW19qNl0gKyBzbiAqIHRoaXMuVltfaTIwXVtwIC0gMV07XG4gICAgICAgICAgICAgICAgdGhpcy5WW19pMjBdW3AgLSAxXSA9IC1zbiAqIHRoaXMuVltfaTIwXVtfajZdICsgY3MgKiB0aGlzLlZbX2kyMF1bcCAtIDFdO1xuICAgICAgICAgICAgICAgIHRoaXMuVltfaTIwXVtfajZdID0gX3Q1O1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIF9mID0gZVtfazMgLSAxXTtcbiAgICAgICAgICBlW19rMyAtIDFdID0gMC4wO1xuICAgICAgICAgIGZvciAodmFyIF9qNyA9IF9rMzsgX2o3IDwgcDsgX2o3KyspIHtcbiAgICAgICAgICAgIHZhciBfdDYgPSBTVkQuaHlwb3QodGhpcy5zW19qN10sIF9mKTtcbiAgICAgICAgICAgIHZhciBfY3MgPSB0aGlzLnNbX2o3XSAvIF90NjtcbiAgICAgICAgICAgIHZhciBfc24gPSBfZiAvIF90NjtcbiAgICAgICAgICAgIHRoaXMuc1tfajddID0gX3Q2O1xuICAgICAgICAgICAgX2YgPSAtX3NuICogZVtfajddO1xuICAgICAgICAgICAgZVtfajddID0gX2NzICogZVtfajddO1xuICAgICAgICAgICAgaWYgKHdhbnR1KSB7XG4gICAgICAgICAgICAgIGZvciAodmFyIF9pMjEgPSAwOyBfaTIxIDwgdGhpcy5tOyBfaTIxKyspIHtcbiAgICAgICAgICAgICAgICBfdDYgPSBfY3MgKiB0aGlzLlVbX2kyMV1bX2o3XSArIF9zbiAqIHRoaXMuVVtfaTIxXVtfazMgLSAxXTtcbiAgICAgICAgICAgICAgICB0aGlzLlVbX2kyMV1bX2szIC0gMV0gPSAtX3NuICogdGhpcy5VW19pMjFdW19qN10gKyBfY3MgKiB0aGlzLlVbX2kyMV1bX2szIC0gMV07XG4gICAgICAgICAgICAgICAgdGhpcy5VW19pMjFdW19qN10gPSBfdDY7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgc2NhbGUgPSBNYXRoLm1heChNYXRoLm1heChNYXRoLm1heChNYXRoLm1heChNYXRoLmFicyh0aGlzLnNbcCAtIDFdKSwgTWF0aC5hYnModGhpcy5zW3AgLSAyXSkpLCBNYXRoLmFicyhlW3AgLSAyXSkpLCBNYXRoLmFicyh0aGlzLnNbX2szXSkpLCBNYXRoLmFicyhlW19rM10pKTtcbiAgICAgICAgICB2YXIgc3AgPSB0aGlzLnNbcCAtIDFdIC8gc2NhbGU7XG4gICAgICAgICAgdmFyIHNwbTEgPSB0aGlzLnNbcCAtIDJdIC8gc2NhbGU7XG4gICAgICAgICAgdmFyIGVwbTEgPSBlW3AgLSAyXSAvIHNjYWxlO1xuICAgICAgICAgIHZhciBzayA9IHRoaXMuc1tfazNdIC8gc2NhbGU7XG4gICAgICAgICAgdmFyIGVrID0gZVtfazNdIC8gc2NhbGU7XG4gICAgICAgICAgdmFyIGIgPSAoKHNwbTEgKyBzcCkgKiAoc3BtMSAtIHNwKSArIGVwbTEgKiBlcG0xKSAvIDIuMDtcbiAgICAgICAgICB2YXIgYyA9IHNwICogZXBtMSAqIChzcCAqIGVwbTEpO1xuICAgICAgICAgIHZhciBzaGlmdCA9IDAuMDtcbiAgICAgICAgICBpZiAoZnVuY3Rpb24gKGxocywgcmhzKSB7XG4gICAgICAgICAgICByZXR1cm4gbGhzIHx8IHJocztcbiAgICAgICAgICB9KGIgIT09IDAuMCwgYyAhPT0gMC4wKSkge1xuICAgICAgICAgICAgc2hpZnQgPSBNYXRoLnNxcnQoYiAqIGIgKyBjKTtcbiAgICAgICAgICAgIGlmIChiIDwgMC4wKSB7XG4gICAgICAgICAgICAgIHNoaWZ0ID0gLXNoaWZ0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2hpZnQgPSBjIC8gKGIgKyBzaGlmdCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBfZjIgPSAoc2sgKyBzcCkgKiAoc2sgLSBzcCkgKyBzaGlmdDtcbiAgICAgICAgICB2YXIgZyA9IHNrICogZWs7XG4gICAgICAgICAgZm9yICh2YXIgX2o4ID0gX2szOyBfajggPCBwIC0gMTsgX2o4KyspIHtcbiAgICAgICAgICAgIHZhciBfdDcgPSBTVkQuaHlwb3QoX2YyLCBnKTtcbiAgICAgICAgICAgIHZhciBfY3MyID0gX2YyIC8gX3Q3O1xuICAgICAgICAgICAgdmFyIF9zbjIgPSBnIC8gX3Q3O1xuICAgICAgICAgICAgaWYgKF9qOCAhPT0gX2szKSB7XG4gICAgICAgICAgICAgIGVbX2o4IC0gMV0gPSBfdDc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfZjIgPSBfY3MyICogdGhpcy5zW19qOF0gKyBfc24yICogZVtfajhdO1xuICAgICAgICAgICAgZVtfajhdID0gX2NzMiAqIGVbX2o4XSAtIF9zbjIgKiB0aGlzLnNbX2o4XTtcbiAgICAgICAgICAgIGcgPSBfc24yICogdGhpcy5zW19qOCArIDFdO1xuICAgICAgICAgICAgdGhpcy5zW19qOCArIDFdID0gX2NzMiAqIHRoaXMuc1tfajggKyAxXTtcbiAgICAgICAgICAgIGlmICh3YW50dikge1xuICAgICAgICAgICAgICBmb3IgKHZhciBfaTIyID0gMDsgX2kyMiA8IHRoaXMubjsgX2kyMisrKSB7XG4gICAgICAgICAgICAgICAgX3Q3ID0gX2NzMiAqIHRoaXMuVltfaTIyXVtfajhdICsgX3NuMiAqIHRoaXMuVltfaTIyXVtfajggKyAxXTtcbiAgICAgICAgICAgICAgICB0aGlzLlZbX2kyMl1bX2o4ICsgMV0gPSAtX3NuMiAqIHRoaXMuVltfaTIyXVtfajhdICsgX2NzMiAqIHRoaXMuVltfaTIyXVtfajggKyAxXTtcbiAgICAgICAgICAgICAgICB0aGlzLlZbX2kyMl1bX2o4XSA9IF90NztcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF90NyA9IFNWRC5oeXBvdChfZjIsIGcpO1xuICAgICAgICAgICAgX2NzMiA9IF9mMiAvIF90NztcbiAgICAgICAgICAgIF9zbjIgPSBnIC8gX3Q3O1xuICAgICAgICAgICAgdGhpcy5zW19qOF0gPSBfdDc7XG4gICAgICAgICAgICBfZjIgPSBfY3MyICogZVtfajhdICsgX3NuMiAqIHRoaXMuc1tfajggKyAxXTtcbiAgICAgICAgICAgIHRoaXMuc1tfajggKyAxXSA9IC1fc24yICogZVtfajhdICsgX2NzMiAqIHRoaXMuc1tfajggKyAxXTtcbiAgICAgICAgICAgIGcgPSBfc24yICogZVtfajggKyAxXTtcbiAgICAgICAgICAgIGVbX2o4ICsgMV0gPSBfY3MyICogZVtfajggKyAxXTtcbiAgICAgICAgICAgIGlmICh3YW50dSAmJiBfajggPCB0aGlzLm0gLSAxKSB7XG4gICAgICAgICAgICAgIGZvciAodmFyIF9pMjMgPSAwOyBfaTIzIDwgdGhpcy5tOyBfaTIzKyspIHtcbiAgICAgICAgICAgICAgICBfdDcgPSBfY3MyICogdGhpcy5VW19pMjNdW19qOF0gKyBfc24yICogdGhpcy5VW19pMjNdW19qOCArIDFdO1xuICAgICAgICAgICAgICAgIHRoaXMuVVtfaTIzXVtfajggKyAxXSA9IC1fc24yICogdGhpcy5VW19pMjNdW19qOF0gKyBfY3MyICogdGhpcy5VW19pMjNdW19qOCArIDFdO1xuICAgICAgICAgICAgICAgIHRoaXMuVVtfaTIzXVtfajhdID0gX3Q3O1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgZVtwIC0gMl0gPSBfZjI7XG4gICAgICAgICAgaXRlciA9IGl0ZXIgKyAxO1xuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNDpcbiAgICAgICAge1xuICAgICAgICAgIGlmICh0aGlzLnNbX2szXSA8PSAwLjApIHtcbiAgICAgICAgICAgIHRoaXMuc1tfazNdID0gdGhpcy5zW19rM10gPCAwLjAgPyAtdGhpcy5zW19rM10gOiAwLjA7XG4gICAgICAgICAgICBpZiAod2FudHYpIHtcbiAgICAgICAgICAgICAgZm9yICh2YXIgX2kyNCA9IDA7IF9pMjQgPD0gcHA7IF9pMjQrKykge1xuICAgICAgICAgICAgICAgIHRoaXMuVltfaTI0XVtfazNdID0gLXRoaXMuVltfaTI0XVtfazNdO1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB3aGlsZSAoX2szIDwgcHApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNbX2szXSA+PSB0aGlzLnNbX2szICsgMV0pIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgX3Q4ID0gdGhpcy5zW19rM107XG4gICAgICAgICAgICB0aGlzLnNbX2szXSA9IHRoaXMuc1tfazMgKyAxXTtcbiAgICAgICAgICAgIHRoaXMuc1tfazMgKyAxXSA9IF90ODtcbiAgICAgICAgICAgIGlmICh3YW50diAmJiBfazMgPCB0aGlzLm4gLSAxKSB7XG4gICAgICAgICAgICAgIGZvciAodmFyIF9pMjUgPSAwOyBfaTI1IDwgdGhpcy5uOyBfaTI1KyspIHtcbiAgICAgICAgICAgICAgICBfdDggPSB0aGlzLlZbX2kyNV1bX2szICsgMV07XG4gICAgICAgICAgICAgICAgdGhpcy5WW19pMjVdW19rMyArIDFdID0gdGhpcy5WW19pMjVdW19rM107XG4gICAgICAgICAgICAgICAgdGhpcy5WW19pMjVdW19rM10gPSBfdDg7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAod2FudHUgJiYgX2szIDwgdGhpcy5tIC0gMSkge1xuICAgICAgICAgICAgICBmb3IgKHZhciBfaTI2ID0gMDsgX2kyNiA8IHRoaXMubTsgX2kyNisrKSB7XG4gICAgICAgICAgICAgICAgX3Q4ID0gdGhpcy5VW19pMjZdW19rMyArIDFdO1xuICAgICAgICAgICAgICAgIHRoaXMuVVtfaTI2XVtfazMgKyAxXSA9IHRoaXMuVVtfaTI2XVtfazNdO1xuICAgICAgICAgICAgICAgIHRoaXMuVVtfaTI2XVtfazNdID0gX3Q4O1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX2szKys7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBpdGVyID0gMDtcbiAgICAgICAgICBwLS07XG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfTtcbiAgdmFyIHJlc3VsdCA9IHsgVTogdGhpcy5VLCBWOiB0aGlzLlYsIFM6IHRoaXMucyB9O1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLy8gc3FydChhXjIgKyBiXjIpIHdpdGhvdXQgdW5kZXIvb3ZlcmZsb3cuXG5TVkQuaHlwb3QgPSBmdW5jdGlvbiAoYSwgYikge1xuICB2YXIgciA9IHZvaWQgMDtcbiAgaWYgKE1hdGguYWJzKGEpID4gTWF0aC5hYnMoYikpIHtcbiAgICByID0gYiAvIGE7XG4gICAgciA9IE1hdGguYWJzKGEpICogTWF0aC5zcXJ0KDEgKyByICogcik7XG4gIH0gZWxzZSBpZiAoYiAhPSAwKSB7XG4gICAgciA9IGEgLyBiO1xuICAgIHIgPSBNYXRoLmFicyhiKSAqIE1hdGguc3FydCgxICsgciAqIHIpO1xuICB9IGVsc2Uge1xuICAgIHIgPSAwLjA7XG4gIH1cbiAgcmV0dXJuIHI7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNWRDtcblxuLyoqKi8gfSksXG4vKiAyNyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgX2NyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSgpO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG4vKipcbiAqICAgTmVlZGxlbWFuLVd1bnNjaCBhbGdvcml0aG0gaXMgYW4gcHJvY2VkdXJlIHRvIGNvbXB1dGUgdGhlIG9wdGltYWwgZ2xvYmFsIGFsaWdubWVudCBvZiB0d28gc3RyaW5nXG4gKiAgIHNlcXVlbmNlcyBieSBTLkIuTmVlZGxlbWFuIGFuZCBDLkQuV3Vuc2NoICgxOTcwKS5cbiAqXG4gKiAgIEFzaWRlIGZyb20gdGhlIGlucHV0cywgeW91IGNhbiBhc3NpZ24gdGhlIHNjb3JlcyBmb3IsXG4gKiAgIC0gTWF0Y2g6IFRoZSB0d28gY2hhcmFjdGVycyBhdCB0aGUgY3VycmVudCBpbmRleCBhcmUgc2FtZS5cbiAqICAgLSBNaXNtYXRjaDogVGhlIHR3byBjaGFyYWN0ZXJzIGF0IHRoZSBjdXJyZW50IGluZGV4IGFyZSBkaWZmZXJlbnQuXG4gKiAgIC0gSW5zZXJ0aW9uL0RlbGV0aW9uKGdhcHMpOiBUaGUgYmVzdCBhbGlnbm1lbnQgaW52b2x2ZXMgb25lIGxldHRlciBhbGlnbmluZyB0byBhIGdhcCBpbiB0aGUgb3RoZXIgc3RyaW5nLlxuICovXG5cbnZhciBOZWVkbGVtYW5XdW5zY2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTmVlZGxlbWFuV3Vuc2NoKHNlcXVlbmNlMSwgc2VxdWVuY2UyKSB7XG4gICAgICAgIHZhciBtYXRjaF9zY29yZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogMTtcbiAgICAgICAgdmFyIG1pc21hdGNoX3BlbmFsdHkgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IC0xO1xuICAgICAgICB2YXIgZ2FwX3BlbmFsdHkgPSBhcmd1bWVudHMubGVuZ3RoID4gNCAmJiBhcmd1bWVudHNbNF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s0XSA6IC0xO1xuXG4gICAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBOZWVkbGVtYW5XdW5zY2gpO1xuXG4gICAgICAgIHRoaXMuc2VxdWVuY2UxID0gc2VxdWVuY2UxO1xuICAgICAgICB0aGlzLnNlcXVlbmNlMiA9IHNlcXVlbmNlMjtcbiAgICAgICAgdGhpcy5tYXRjaF9zY29yZSA9IG1hdGNoX3Njb3JlO1xuICAgICAgICB0aGlzLm1pc21hdGNoX3BlbmFsdHkgPSBtaXNtYXRjaF9wZW5hbHR5O1xuICAgICAgICB0aGlzLmdhcF9wZW5hbHR5ID0gZ2FwX3BlbmFsdHk7XG5cbiAgICAgICAgLy8gSnVzdCB0aGUgcmVtb3ZlIHJlZHVuZGFuY3lcbiAgICAgICAgdGhpcy5pTWF4ID0gc2VxdWVuY2UxLmxlbmd0aCArIDE7XG4gICAgICAgIHRoaXMuak1heCA9IHNlcXVlbmNlMi5sZW5ndGggKyAxO1xuXG4gICAgICAgIC8vIEdyaWQgbWF0cml4IG9mIHNjb3Jlc1xuICAgICAgICB0aGlzLmdyaWQgPSBuZXcgQXJyYXkodGhpcy5pTWF4KTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmlNYXg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5ncmlkW2ldID0gbmV3IEFycmF5KHRoaXMuak1heCk7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdGhpcy5qTWF4OyBqKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdyaWRbaV1bal0gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJhY2ViYWNrIG1hdHJpeCAoMkQgYXJyYXksIGVhY2ggY2VsbCBpcyBhbiBhcnJheSBvZiBib29sZWFuIHZhbHVlcyBmb3IgW2BEaWFnYCwgYFVwYCwgYExlZnRgXSBwb3NpdGlvbnMpXG4gICAgICAgIHRoaXMudHJhY2ViYWNrR3JpZCA9IG5ldyBBcnJheSh0aGlzLmlNYXgpO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgdGhpcy5pTWF4OyBfaSsrKSB7XG4gICAgICAgICAgICB0aGlzLnRyYWNlYmFja0dyaWRbX2ldID0gbmV3IEFycmF5KHRoaXMuak1heCk7XG5cbiAgICAgICAgICAgIGZvciAodmFyIF9qID0gMDsgX2ogPCB0aGlzLmpNYXg7IF9qKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyYWNlYmFja0dyaWRbX2ldW19qXSA9IFtudWxsLCBudWxsLCBudWxsXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSBhbGlnbmVkIHNlcXVlbmNlcyAocmV0dXJuIG11bHRpcGxlIHBvc3NpYmlsaXRpZXMpXG4gICAgICAgIHRoaXMuYWxpZ25tZW50cyA9IFtdO1xuXG4gICAgICAgIC8vIEZpbmFsIGFsaWdubWVudCBzY29yZVxuICAgICAgICB0aGlzLnNjb3JlID0gLTE7XG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIHNjb3JlcyBhbmQgdHJhY2ViYWNrc1xuICAgICAgICB0aGlzLmNvbXB1dGVHcmlkcygpO1xuICAgIH1cblxuICAgIF9jcmVhdGVDbGFzcyhOZWVkbGVtYW5XdW5zY2gsIFt7XG4gICAgICAgIGtleTogXCJnZXRTY29yZVwiLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0U2NvcmUoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zY29yZTtcbiAgICAgICAgfVxuICAgIH0sIHtcbiAgICAgICAga2V5OiBcImdldEFsaWdubWVudHNcIixcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldEFsaWdubWVudHMoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hbGlnbm1lbnRzO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWFpbiBkeW5hbWljIHByb2dyYW1taW5nIHByb2NlZHVyZVxuXG4gICAgfSwge1xuICAgICAgICBrZXk6IFwiY29tcHV0ZUdyaWRzXCIsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wdXRlR3JpZHMoKSB7XG4gICAgICAgICAgICAvLyBGaWxsIGluIHRoZSBmaXJzdCByb3dcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAxOyBqIDwgdGhpcy5qTWF4OyBqKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdyaWRbMF1bal0gPSB0aGlzLmdyaWRbMF1baiAtIDFdICsgdGhpcy5nYXBfcGVuYWx0eTtcbiAgICAgICAgICAgICAgICB0aGlzLnRyYWNlYmFja0dyaWRbMF1bal0gPSBbZmFsc2UsIGZhbHNlLCB0cnVlXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRmlsbCBpbiB0aGUgZmlyc3QgY29sdW1uXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IHRoaXMuaU1heDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkW2ldWzBdID0gdGhpcy5ncmlkW2kgLSAxXVswXSArIHRoaXMuZ2FwX3BlbmFsdHk7XG4gICAgICAgICAgICAgICAgdGhpcy50cmFjZWJhY2tHcmlkW2ldWzBdID0gW2ZhbHNlLCB0cnVlLCBmYWxzZV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEZpbGwgdGhlIHJlc3Qgb2YgdGhlIGdyaWRcbiAgICAgICAgICAgIGZvciAodmFyIF9pMiA9IDE7IF9pMiA8IHRoaXMuaU1heDsgX2kyKyspIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBfajIgPSAxOyBfajIgPCB0aGlzLmpNYXg7IF9qMisrKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEZpbmQgdGhlIG1heCBzY29yZShzKSBhbW9uZyBbYERpYWdgLCBgVXBgLCBgTGVmdGBdXG4gICAgICAgICAgICAgICAgICAgIHZhciBkaWFnID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZXF1ZW5jZTFbX2kyIC0gMV0gPT09IHRoaXMuc2VxdWVuY2UyW19qMiAtIDFdKSBkaWFnID0gdGhpcy5ncmlkW19pMiAtIDFdW19qMiAtIDFdICsgdGhpcy5tYXRjaF9zY29yZTtlbHNlIGRpYWcgPSB0aGlzLmdyaWRbX2kyIC0gMV1bX2oyIC0gMV0gKyB0aGlzLm1pc21hdGNoX3BlbmFsdHk7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIHVwID0gdGhpcy5ncmlkW19pMiAtIDFdW19qMl0gKyB0aGlzLmdhcF9wZW5hbHR5O1xuICAgICAgICAgICAgICAgICAgICB2YXIgbGVmdCA9IHRoaXMuZ3JpZFtfaTJdW19qMiAtIDFdICsgdGhpcy5nYXBfcGVuYWx0eTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBleGlzdHMgbXVsdGlwbGUgbWF4IHZhbHVlcywgY2FwdHVyZSB0aGVtIGZvciBtdWx0aXBsZSBwYXRoc1xuICAgICAgICAgICAgICAgICAgICB2YXIgbWF4T2YgPSBbZGlhZywgdXAsIGxlZnRdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5kaWNlcyA9IHRoaXMuYXJyYXlBbGxNYXhJbmRleGVzKG1heE9mKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgR3JpZHNcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ncmlkW19pMl1bX2oyXSA9IG1heE9mW2luZGljZXNbMF1dO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYWNlYmFja0dyaWRbX2kyXVtfajJdID0gW2luZGljZXMuaW5jbHVkZXMoMCksIGluZGljZXMuaW5jbHVkZXMoMSksIGluZGljZXMuaW5jbHVkZXMoMildO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVXBkYXRlIGFsaWdubWVudCBzY29yZVxuICAgICAgICAgICAgdGhpcy5zY29yZSA9IHRoaXMuZ3JpZFt0aGlzLmlNYXggLSAxXVt0aGlzLmpNYXggLSAxXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldHMgYWxsIHBvc3NpYmxlIHZhbGlkIHNlcXVlbmNlIGNvbWJpbmF0aW9uc1xuXG4gICAgfSwge1xuICAgICAgICBrZXk6IFwiYWxpZ25tZW50VHJhY2ViYWNrXCIsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBhbGlnbm1lbnRUcmFjZWJhY2soKSB7XG4gICAgICAgICAgICB2YXIgaW5Qcm9jZXNzQWxpZ25tZW50cyA9IFtdO1xuXG4gICAgICAgICAgICBpblByb2Nlc3NBbGlnbm1lbnRzLnB1c2goeyBwb3M6IFt0aGlzLnNlcXVlbmNlMS5sZW5ndGgsIHRoaXMuc2VxdWVuY2UyLmxlbmd0aF0sXG4gICAgICAgICAgICAgICAgc2VxMTogXCJcIixcbiAgICAgICAgICAgICAgICBzZXEyOiBcIlwiXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgd2hpbGUgKGluUHJvY2Vzc0FsaWdubWVudHNbMF0pIHtcbiAgICAgICAgICAgICAgICB2YXIgY3VycmVudCA9IGluUHJvY2Vzc0FsaWdubWVudHNbMF07XG4gICAgICAgICAgICAgICAgdmFyIGRpcmVjdGlvbnMgPSB0aGlzLnRyYWNlYmFja0dyaWRbY3VycmVudC5wb3NbMF1dW2N1cnJlbnQucG9zWzFdXTtcblxuICAgICAgICAgICAgICAgIGlmIChkaXJlY3Rpb25zWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgIGluUHJvY2Vzc0FsaWdubWVudHMucHVzaCh7IHBvczogW2N1cnJlbnQucG9zWzBdIC0gMSwgY3VycmVudC5wb3NbMV0gLSAxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcTE6IHRoaXMuc2VxdWVuY2UxW2N1cnJlbnQucG9zWzBdIC0gMV0gKyBjdXJyZW50LnNlcTEsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXEyOiB0aGlzLnNlcXVlbmNlMltjdXJyZW50LnBvc1sxXSAtIDFdICsgY3VycmVudC5zZXEyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZGlyZWN0aW9uc1sxXSkge1xuICAgICAgICAgICAgICAgICAgICBpblByb2Nlc3NBbGlnbm1lbnRzLnB1c2goeyBwb3M6IFtjdXJyZW50LnBvc1swXSAtIDEsIGN1cnJlbnQucG9zWzFdXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcTE6IHRoaXMuc2VxdWVuY2UxW2N1cnJlbnQucG9zWzBdIC0gMV0gKyBjdXJyZW50LnNlcTEsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXEyOiAnLScgKyBjdXJyZW50LnNlcTJcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChkaXJlY3Rpb25zWzJdKSB7XG4gICAgICAgICAgICAgICAgICAgIGluUHJvY2Vzc0FsaWdubWVudHMucHVzaCh7IHBvczogW2N1cnJlbnQucG9zWzBdLCBjdXJyZW50LnBvc1sxXSAtIDFdLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VxMTogJy0nICsgY3VycmVudC5zZXExLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VxMjogdGhpcy5zZXF1ZW5jZTJbY3VycmVudC5wb3NbMV0gLSAxXSArIGN1cnJlbnQuc2VxMlxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudC5wb3NbMF0gPT09IDAgJiYgY3VycmVudC5wb3NbMV0gPT09IDApIHRoaXMuYWxpZ25tZW50cy5wdXNoKHsgc2VxdWVuY2UxOiBjdXJyZW50LnNlcTEsXG4gICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlMjogY3VycmVudC5zZXEyXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpblByb2Nlc3NBbGlnbm1lbnRzLnNoaWZ0KCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFsaWdubWVudHM7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIZWxwZXIgRnVuY3Rpb25zXG5cbiAgICB9LCB7XG4gICAgICAgIGtleTogXCJnZXRBbGxJbmRleGVzXCIsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRBbGxJbmRleGVzKGFyciwgdmFsKSB7XG4gICAgICAgICAgICB2YXIgaW5kZXhlcyA9IFtdLFxuICAgICAgICAgICAgICAgIGkgPSAtMTtcbiAgICAgICAgICAgIHdoaWxlICgoaSA9IGFyci5pbmRleE9mKHZhbCwgaSArIDEpKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBpbmRleGVzLnB1c2goaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaW5kZXhlcztcbiAgICAgICAgfVxuICAgIH0sIHtcbiAgICAgICAga2V5OiBcImFycmF5QWxsTWF4SW5kZXhlc1wiLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gYXJyYXlBbGxNYXhJbmRleGVzKGFycmF5KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRBbGxJbmRleGVzKGFycmF5LCBNYXRoLm1heC5hcHBseShudWxsLCBhcnJheSkpO1xuICAgICAgICB9XG4gICAgfV0pO1xuXG4gICAgcmV0dXJuIE5lZWRsZW1hbld1bnNjaDtcbn0oKTtcblxubW9kdWxlLmV4cG9ydHMgPSBOZWVkbGVtYW5XdW5zY2g7XG5cbi8qKiovIH0pLFxuLyogMjggKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIGxheW91dEJhc2UgPSBmdW5jdGlvbiBsYXlvdXRCYXNlKCkge1xuICByZXR1cm47XG59O1xuXG5sYXlvdXRCYXNlLkZETGF5b3V0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOCk7XG5sYXlvdXRCYXNlLkZETGF5b3V0Q29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcbmxheW91dEJhc2UuRkRMYXlvdXRFZGdlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOSk7XG5sYXlvdXRCYXNlLkZETGF5b3V0Tm9kZSA9IF9fd2VicGFja19yZXF1aXJlX18oMjApO1xubGF5b3V0QmFzZS5EaW1lbnNpb25EID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMSk7XG5sYXlvdXRCYXNlLkhhc2hNYXAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIyKTtcbmxheW91dEJhc2UuSGFzaFNldCA9IF9fd2VicGFja19yZXF1aXJlX18oMjMpO1xubGF5b3V0QmFzZS5JR2VvbWV0cnkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgpO1xubGF5b3V0QmFzZS5JTWF0aCA9IF9fd2VicGFja19yZXF1aXJlX18oOSk7XG5sYXlvdXRCYXNlLkludGVnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKTtcbmxheW91dEJhc2UuUG9pbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyKTtcbmxheW91dEJhc2UuUG9pbnREID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTtcbmxheW91dEJhc2UuUmFuZG9tU2VlZCA9IF9fd2VicGFja19yZXF1aXJlX18oMTYpO1xubGF5b3V0QmFzZS5SZWN0YW5nbGVEID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMyk7XG5sYXlvdXRCYXNlLlRyYW5zZm9ybSA9IF9fd2VicGFja19yZXF1aXJlX18oMTcpO1xubGF5b3V0QmFzZS5VbmlxdWVJREdlbmVyZXRvciA9IF9fd2VicGFja19yZXF1aXJlX18oMTQpO1xubGF5b3V0QmFzZS5RdWlja3NvcnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI1KTtcbmxheW91dEJhc2UuTGlua2VkTGlzdCA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpO1xubGF5b3V0QmFzZS5MR3JhcGhPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xubGF5b3V0QmFzZS5MR3JhcGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpO1xubGF5b3V0QmFzZS5MRWRnZSA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5sYXlvdXRCYXNlLkxHcmFwaE1hbmFnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpO1xubGF5b3V0QmFzZS5MTm9kZSA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7XG5sYXlvdXRCYXNlLkxheW91dCA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpO1xubGF5b3V0QmFzZS5MYXlvdXRDb25zdGFudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xubGF5b3V0QmFzZS5OZWVkbGVtYW5XdW5zY2ggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI3KTtcbmxheW91dEJhc2UuTWF0cml4ID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNCk7XG5sYXlvdXRCYXNlLlNWRCA9IF9fd2VicGFja19yZXF1aXJlX18oMjYpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGxheW91dEJhc2U7XG5cbi8qKiovIH0pLFxuLyogMjkgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuZnVuY3Rpb24gRW1pdHRlcigpIHtcbiAgdGhpcy5saXN0ZW5lcnMgPSBbXTtcbn1cblxudmFyIHAgPSBFbWl0dGVyLnByb3RvdHlwZTtcblxucC5hZGRMaXN0ZW5lciA9IGZ1bmN0aW9uIChldmVudCwgY2FsbGJhY2spIHtcbiAgdGhpcy5saXN0ZW5lcnMucHVzaCh7XG4gICAgZXZlbnQ6IGV2ZW50LFxuICAgIGNhbGxiYWNrOiBjYWxsYmFja1xuICB9KTtcbn07XG5cbnAucmVtb3ZlTGlzdGVuZXIgPSBmdW5jdGlvbiAoZXZlbnQsIGNhbGxiYWNrKSB7XG4gIGZvciAodmFyIGkgPSB0aGlzLmxpc3RlbmVycy5sZW5ndGg7IGkgPj0gMDsgaS0tKSB7XG4gICAgdmFyIGwgPSB0aGlzLmxpc3RlbmVyc1tpXTtcblxuICAgIGlmIChsLmV2ZW50ID09PSBldmVudCAmJiBsLmNhbGxiYWNrID09PSBjYWxsYmFjaykge1xuICAgICAgdGhpcy5saXN0ZW5lcnMuc3BsaWNlKGksIDEpO1xuICAgIH1cbiAgfVxufTtcblxucC5lbWl0ID0gZnVuY3Rpb24gKGV2ZW50LCBkYXRhKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5saXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbCA9IHRoaXMubGlzdGVuZXJzW2ldO1xuXG4gICAgaWYgKGV2ZW50ID09PSBsLmV2ZW50KSB7XG4gICAgICBsLmNhbGxiYWNrKGRhdGEpO1xuICAgIH1cbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBFbWl0dGVyO1xuXG4vKioqLyB9KVxuLyoqKioqKi8gXSk7XG59KTsiLCIvKipcbiAqIGxvZGFzaCAoQ3VzdG9tIEJ1aWxkKSA8aHR0cHM6Ly9sb2Rhc2guY29tLz5cbiAqIEJ1aWxkOiBgbG9kYXNoIG1vZHVsYXJpemUgZXhwb3J0cz1cIm5wbVwiIC1vIC4vYFxuICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMgPGh0dHBzOi8vanF1ZXJ5Lm9yZy8+XG4gKiBSZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+XG4gKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPlxuICogQ29weXJpZ2h0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4gKi9cblxuLyoqIFVzZWQgYXMgdGhlIGBUeXBlRXJyb3JgIG1lc3NhZ2UgZm9yIFwiRnVuY3Rpb25zXCIgbWV0aG9kcy4gKi9cbnZhciBGVU5DX0VSUk9SX1RFWFQgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbic7XG5cbi8qKiBVc2VkIGFzIHRoZSBpbnRlcm5hbCBhcmd1bWVudCBwbGFjZWhvbGRlci4gKi9cbnZhciBQTEFDRUhPTERFUiA9ICdfX2xvZGFzaF9wbGFjZWhvbGRlcl9fJztcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgZnVuY3Rpb24gbWV0YWRhdGEuICovXG52YXIgQklORF9GTEFHID0gMSxcbiAgICBCSU5EX0tFWV9GTEFHID0gMixcbiAgICBDVVJSWV9CT1VORF9GTEFHID0gNCxcbiAgICBDVVJSWV9GTEFHID0gOCxcbiAgICBDVVJSWV9SSUdIVF9GTEFHID0gMTYsXG4gICAgUEFSVElBTF9GTEFHID0gMzIsXG4gICAgUEFSVElBTF9SSUdIVF9GTEFHID0gNjQsXG4gICAgQVJZX0ZMQUcgPSAxMjgsXG4gICAgUkVBUkdfRkxBRyA9IDI1NixcbiAgICBGTElQX0ZMQUcgPSA1MTI7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIElORklOSVRZID0gMSAvIDAsXG4gICAgTUFYX1NBRkVfSU5URUdFUiA9IDkwMDcxOTkyNTQ3NDA5OTEsXG4gICAgTUFYX0lOVEVHRVIgPSAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOCxcbiAgICBOQU4gPSAwIC8gMDtcblxuLyoqIFVzZWQgdG8gYXNzb2NpYXRlIHdyYXAgbWV0aG9kcyB3aXRoIHRoZWlyIGJpdCBmbGFncy4gKi9cbnZhciB3cmFwRmxhZ3MgPSBbXG4gIFsnYXJ5JywgQVJZX0ZMQUddLFxuICBbJ2JpbmQnLCBCSU5EX0ZMQUddLFxuICBbJ2JpbmRLZXknLCBCSU5EX0tFWV9GTEFHXSxcbiAgWydjdXJyeScsIENVUlJZX0ZMQUddLFxuICBbJ2N1cnJ5UmlnaHQnLCBDVVJSWV9SSUdIVF9GTEFHXSxcbiAgWydmbGlwJywgRkxJUF9GTEFHXSxcbiAgWydwYXJ0aWFsJywgUEFSVElBTF9GTEFHXSxcbiAgWydwYXJ0aWFsUmlnaHQnLCBQQVJUSUFMX1JJR0hUX0ZMQUddLFxuICBbJ3JlYXJnJywgUkVBUkdfRkxBR11cbl07XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBmdW5jVGFnID0gJ1tvYmplY3QgRnVuY3Rpb25dJyxcbiAgICBnZW5UYWcgPSAnW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0nLFxuICAgIHN5bWJvbFRhZyA9ICdbb2JqZWN0IFN5bWJvbF0nO1xuXG4vKipcbiAqIFVzZWQgdG8gbWF0Y2ggYFJlZ0V4cGBcbiAqIFtzeW50YXggY2hhcmFjdGVyc10oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcGF0dGVybnMpLlxuICovXG52YXIgcmVSZWdFeHBDaGFyID0gL1tcXFxcXiQuKis/KClbXFxde318XS9nO1xuXG4vKiogVXNlZCB0byBtYXRjaCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLiAqL1xudmFyIHJlVHJpbSA9IC9eXFxzK3xcXHMrJC9nO1xuXG4vKiogVXNlZCB0byBtYXRjaCB3cmFwIGRldGFpbCBjb21tZW50cy4gKi9cbnZhciByZVdyYXBDb21tZW50ID0gL1xceyg/OlxcblxcL1xcKiBcXFt3cmFwcGVkIHdpdGggLitcXF0gXFwqXFwvKT9cXG4/LyxcbiAgICByZVdyYXBEZXRhaWxzID0gL1xce1xcblxcL1xcKiBcXFt3cmFwcGVkIHdpdGggKC4rKVxcXSBcXCovLFxuICAgIHJlU3BsaXREZXRhaWxzID0gLyw/ICYgLztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJhZCBzaWduZWQgaGV4YWRlY2ltYWwgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzQmFkSGV4ID0gL15bLStdMHhbMC05YS1mXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBiaW5hcnkgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzQmluYXJ5ID0gL14wYlswMV0rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgaG9zdCBjb25zdHJ1Y3RvcnMgKFNhZmFyaSkuICovXG52YXIgcmVJc0hvc3RDdG9yID0gL15cXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXF0kLztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG9jdGFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc09jdGFsID0gL14wb1swLTddKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IHVuc2lnbmVkIGludGVnZXIgdmFsdWVzLiAqL1xudmFyIHJlSXNVaW50ID0gL14oPzowfFsxLTldXFxkKikkLztcblxuLyoqIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHdpdGhvdXQgYSBkZXBlbmRlbmN5IG9uIGByb290YC4gKi9cbnZhciBmcmVlUGFyc2VJbnQgPSBwYXJzZUludDtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBnbG9iYWxgIGZyb20gTm9kZS5qcy4gKi9cbnZhciBmcmVlR2xvYmFsID0gdHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWwgJiYgZ2xvYmFsLk9iamVjdCA9PT0gT2JqZWN0ICYmIGdsb2JhbDtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBzZWxmYC4gKi9cbnZhciBmcmVlU2VsZiA9IHR5cGVvZiBzZWxmID09ICdvYmplY3QnICYmIHNlbGYgJiYgc2VsZi5PYmplY3QgPT09IE9iamVjdCAmJiBzZWxmO1xuXG4vKiogVXNlZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4gKi9cbnZhciByb290ID0gZnJlZUdsb2JhbCB8fCBmcmVlU2VsZiB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG4vKipcbiAqIEEgZmFzdGVyIGFsdGVybmF0aXZlIHRvIGBGdW5jdGlvbiNhcHBseWAsIHRoaXMgZnVuY3Rpb24gaW52b2tlcyBgZnVuY2BcbiAqIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIGB0aGlzQXJnYCBhbmQgdGhlIGFyZ3VtZW50cyBvZiBgYXJnc2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGludm9rZS5cbiAqIEBwYXJhbSB7Kn0gdGhpc0FyZyBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBgZnVuY2Agd2l0aC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYGZ1bmNgLlxuICovXG5mdW5jdGlvbiBhcHBseShmdW5jLCB0aGlzQXJnLCBhcmdzKSB7XG4gIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICBjYXNlIDA6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZyk7XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0pO1xuICAgIGNhc2UgMjogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICBjYXNlIDM6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gIH1cbiAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyk7XG59XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmZvckVhY2hgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICovXG5mdW5jdGlvbiBhcnJheUVhY2goYXJyYXksIGl0ZXJhdGVlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgaWYgKGl0ZXJhdGVlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSA9PT0gZmFsc2UpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmluY2x1ZGVzYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAqIHNwZWNpZnlpbmcgYW4gaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0geyp9IHRhcmdldCBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdGFyZ2V0YCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBhcnJheUluY2x1ZGVzKGFycmF5LCB2YWx1ZSkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwO1xuICByZXR1cm4gISFsZW5ndGggJiYgYmFzZUluZGV4T2YoYXJyYXksIHZhbHVlLCAwKSA+IC0xO1xufVxuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZpbmRJbmRleGAgYW5kIGBfLmZpbmRMYXN0SW5kZXhgIHdpdGhvdXRcbiAqIHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUZpbmRJbmRleChhcnJheSwgcHJlZGljYXRlLCBmcm9tSW5kZXgsIGZyb21SaWdodCkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgaW5kZXggPSBmcm9tSW5kZXggKyAoZnJvbVJpZ2h0ID8gMSA6IC0xKTtcblxuICB3aGlsZSAoKGZyb21SaWdodCA/IGluZGV4LS0gOiArK2luZGV4IDwgbGVuZ3RoKSkge1xuICAgIGlmIChwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pbmRleE9mYCB3aXRob3V0IGBmcm9tSW5kZXhgIGJvdW5kcyBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgaWYgKHZhbHVlICE9PSB2YWx1ZSkge1xuICAgIHJldHVybiBiYXNlRmluZEluZGV4KGFycmF5LCBiYXNlSXNOYU4sIGZyb21JbmRleCk7XG4gIH1cbiAgdmFyIGluZGV4ID0gZnJvbUluZGV4IC0gMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGlmIChhcnJheVtpbmRleF0gPT09IHZhbHVlKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc05hTmAgd2l0aG91dCBzdXBwb3J0IGZvciBudW1iZXIgb2JqZWN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgTmFOYCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNOYU4odmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBudW1iZXIgb2YgYHBsYWNlaG9sZGVyYCBvY2N1cnJlbmNlcyBpbiBgYXJyYXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0gcGxhY2Vob2xkZXIgVGhlIHBsYWNlaG9sZGVyIHRvIHNlYXJjaCBmb3IuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBwbGFjZWhvbGRlciBjb3VudC5cbiAqL1xuZnVuY3Rpb24gY291bnRIb2xkZXJzKGFycmF5LCBwbGFjZWhvbGRlcikge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgcmVzdWx0ID0gMDtcblxuICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICBpZiAoYXJyYXlbbGVuZ3RoXSA9PT0gcGxhY2Vob2xkZXIpIHtcbiAgICAgIHJlc3VsdCsrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHZhbHVlIGF0IGBrZXlgIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBnZXRWYWx1ZShvYmplY3QsIGtleSkge1xuICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3Rba2V5XTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIGhvc3Qgb2JqZWN0IGluIElFIDwgOS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGhvc3Qgb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzSG9zdE9iamVjdCh2YWx1ZSkge1xuICAvLyBNYW55IGhvc3Qgb2JqZWN0cyBhcmUgYE9iamVjdGAgb2JqZWN0cyB0aGF0IGNhbiBjb2VyY2UgdG8gc3RyaW5nc1xuICAvLyBkZXNwaXRlIGhhdmluZyBpbXByb3Blcmx5IGRlZmluZWQgYHRvU3RyaW5nYCBtZXRob2RzLlxuICB2YXIgcmVzdWx0ID0gZmFsc2U7XG4gIGlmICh2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZS50b1N0cmluZyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9ICEhKHZhbHVlICsgJycpO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBSZXBsYWNlcyBhbGwgYHBsYWNlaG9sZGVyYCBlbGVtZW50cyBpbiBgYXJyYXlgIHdpdGggYW4gaW50ZXJuYWwgcGxhY2Vob2xkZXJcbiAqIGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIHRoZWlyIGluZGV4ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gKiBAcGFyYW0geyp9IHBsYWNlaG9sZGVyIFRoZSBwbGFjZWhvbGRlciB0byByZXBsYWNlLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAqL1xuZnVuY3Rpb24gcmVwbGFjZUhvbGRlcnMoYXJyYXksIHBsYWNlaG9sZGVyKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgcmVzSW5kZXggPSAwLFxuICAgICAgcmVzdWx0ID0gW107XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgaWYgKHZhbHVlID09PSBwbGFjZWhvbGRlciB8fCB2YWx1ZSA9PT0gUExBQ0VIT0xERVIpIHtcbiAgICAgIGFycmF5W2luZGV4XSA9IFBMQUNFSE9MREVSO1xuICAgICAgcmVzdWx0W3Jlc0luZGV4KytdID0gaW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBmdW5jUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGUsXG4gICAgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBkZXRlY3Qgb3ZlcnJlYWNoaW5nIGNvcmUtanMgc2hpbXMuICovXG52YXIgY29yZUpzRGF0YSA9IHJvb3RbJ19fY29yZS1qc19zaGFyZWRfXyddO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgbWV0aG9kcyBtYXNxdWVyYWRpbmcgYXMgbmF0aXZlLiAqL1xudmFyIG1hc2tTcmNLZXkgPSAoZnVuY3Rpb24oKSB7XG4gIHZhciB1aWQgPSAvW14uXSskLy5leGVjKGNvcmVKc0RhdGEgJiYgY29yZUpzRGF0YS5rZXlzICYmIGNvcmVKc0RhdGEua2V5cy5JRV9QUk9UTyB8fCAnJyk7XG4gIHJldHVybiB1aWQgPyAoJ1N5bWJvbChzcmMpXzEuJyArIHVpZCkgOiAnJztcbn0oKSk7XG5cbi8qKiBVc2VkIHRvIHJlc29sdmUgdGhlIGRlY29tcGlsZWQgc291cmNlIG9mIGZ1bmN0aW9ucy4gKi9cbnZhciBmdW5jVG9TdHJpbmcgPSBmdW5jUHJvdG8udG9TdHJpbmc7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBvYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgaWYgYSBtZXRob2QgaXMgbmF0aXZlLiAqL1xudmFyIHJlSXNOYXRpdmUgPSBSZWdFeHAoJ14nICtcbiAgZnVuY1RvU3RyaW5nLmNhbGwoaGFzT3duUHJvcGVydHkpLnJlcGxhY2UocmVSZWdFeHBDaGFyLCAnXFxcXCQmJylcbiAgLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFxcXFwoKXwgZm9yIC4rPyg/PVxcXFxcXF0pL2csICckMS4qPycpICsgJyQnXG4pO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RDcmVhdGUgPSBPYmplY3QuY3JlYXRlO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlTWF4ID0gTWF0aC5tYXgsXG4gICAgbmF0aXZlTWluID0gTWF0aC5taW47XG5cbi8qIFVzZWQgdG8gc2V0IGB0b1N0cmluZ2AgbWV0aG9kcy4gKi9cbnZhciBkZWZpbmVQcm9wZXJ0eSA9IChmdW5jdGlvbigpIHtcbiAgdmFyIGZ1bmMgPSBnZXROYXRpdmUoT2JqZWN0LCAnZGVmaW5lUHJvcGVydHknKSxcbiAgICAgIG5hbWUgPSBnZXROYXRpdmUubmFtZTtcblxuICByZXR1cm4gKG5hbWUgJiYgbmFtZS5sZW5ndGggPiAyKSA/IGZ1bmMgOiB1bmRlZmluZWQ7XG59KCkpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmNyZWF0ZWAgd2l0aG91dCBzdXBwb3J0IGZvciBhc3NpZ25pbmdcbiAqIHByb3BlcnRpZXMgdG8gdGhlIGNyZWF0ZWQgb2JqZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvdG90eXBlIFRoZSBvYmplY3QgdG8gaW5oZXJpdCBmcm9tLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gYmFzZUNyZWF0ZShwcm90bykge1xuICByZXR1cm4gaXNPYmplY3QocHJvdG8pID8gb2JqZWN0Q3JlYXRlKHByb3RvKSA6IHt9O1xufVxuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTmF0aXZlYCB3aXRob3V0IGJhZCBzaGltIGNoZWNrcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG5hdGl2ZSBmdW5jdGlvbixcbiAqICBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc05hdGl2ZSh2YWx1ZSkge1xuICBpZiAoIWlzT2JqZWN0KHZhbHVlKSB8fCBpc01hc2tlZCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHBhdHRlcm4gPSAoaXNGdW5jdGlvbih2YWx1ZSkgfHwgaXNIb3N0T2JqZWN0KHZhbHVlKSkgPyByZUlzTmF0aXZlIDogcmVJc0hvc3RDdG9yO1xuICByZXR1cm4gcGF0dGVybi50ZXN0KHRvU291cmNlKHZhbHVlKSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSB0aGF0IGlzIHRoZSBjb21wb3NpdGlvbiBvZiBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMsXG4gKiBwbGFjZWhvbGRlcnMsIGFuZCBwcm92aWRlZCBhcmd1bWVudHMgaW50byBhIHNpbmdsZSBhcnJheSBvZiBhcmd1bWVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgVGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7QXJyYXl9IHBhcnRpYWxzIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZC5cbiAqIEBwYXJhbSB7QXJyYXl9IGhvbGRlcnMgVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAqIEBwYXJhbXMge2Jvb2xlYW59IFtpc0N1cnJpZWRdIFNwZWNpZnkgY29tcG9zaW5nIGZvciBhIGN1cnJpZWQgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21wb3NlZCBhcmd1bWVudHMuXG4gKi9cbmZ1bmN0aW9uIGNvbXBvc2VBcmdzKGFyZ3MsIHBhcnRpYWxzLCBob2xkZXJzLCBpc0N1cnJpZWQpIHtcbiAgdmFyIGFyZ3NJbmRleCA9IC0xLFxuICAgICAgYXJnc0xlbmd0aCA9IGFyZ3MubGVuZ3RoLFxuICAgICAgaG9sZGVyc0xlbmd0aCA9IGhvbGRlcnMubGVuZ3RoLFxuICAgICAgbGVmdEluZGV4ID0gLTEsXG4gICAgICBsZWZ0TGVuZ3RoID0gcGFydGlhbHMubGVuZ3RoLFxuICAgICAgcmFuZ2VMZW5ndGggPSBuYXRpdmVNYXgoYXJnc0xlbmd0aCAtIGhvbGRlcnNMZW5ndGgsIDApLFxuICAgICAgcmVzdWx0ID0gQXJyYXkobGVmdExlbmd0aCArIHJhbmdlTGVuZ3RoKSxcbiAgICAgIGlzVW5jdXJyaWVkID0gIWlzQ3VycmllZDtcblxuICB3aGlsZSAoKytsZWZ0SW5kZXggPCBsZWZ0TGVuZ3RoKSB7XG4gICAgcmVzdWx0W2xlZnRJbmRleF0gPSBwYXJ0aWFsc1tsZWZ0SW5kZXhdO1xuICB9XG4gIHdoaWxlICgrK2FyZ3NJbmRleCA8IGhvbGRlcnNMZW5ndGgpIHtcbiAgICBpZiAoaXNVbmN1cnJpZWQgfHwgYXJnc0luZGV4IDwgYXJnc0xlbmd0aCkge1xuICAgICAgcmVzdWx0W2hvbGRlcnNbYXJnc0luZGV4XV0gPSBhcmdzW2FyZ3NJbmRleF07XG4gICAgfVxuICB9XG4gIHdoaWxlIChyYW5nZUxlbmd0aC0tKSB7XG4gICAgcmVzdWx0W2xlZnRJbmRleCsrXSA9IGFyZ3NbYXJnc0luZGV4KytdO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlIGBjb21wb3NlQXJnc2AgZXhjZXB0IHRoYXQgdGhlIGFyZ3VtZW50cyBjb21wb3NpdGlvblxuICogaXMgdGFpbG9yZWQgZm9yIGBfLnBhcnRpYWxSaWdodGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgVGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7QXJyYXl9IHBhcnRpYWxzIFRoZSBhcmd1bWVudHMgdG8gYXBwZW5kIHRvIHRob3NlIHByb3ZpZGVkLlxuICogQHBhcmFtIHtBcnJheX0gaG9sZGVycyBUaGUgYHBhcnRpYWxzYCBwbGFjZWhvbGRlciBpbmRleGVzLlxuICogQHBhcmFtcyB7Ym9vbGVhbn0gW2lzQ3VycmllZF0gU3BlY2lmeSBjb21wb3NpbmcgZm9yIGEgY3VycmllZCBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGNvbXBvc2VkIGFyZ3VtZW50cy5cbiAqL1xuZnVuY3Rpb24gY29tcG9zZUFyZ3NSaWdodChhcmdzLCBwYXJ0aWFscywgaG9sZGVycywgaXNDdXJyaWVkKSB7XG4gIHZhciBhcmdzSW5kZXggPSAtMSxcbiAgICAgIGFyZ3NMZW5ndGggPSBhcmdzLmxlbmd0aCxcbiAgICAgIGhvbGRlcnNJbmRleCA9IC0xLFxuICAgICAgaG9sZGVyc0xlbmd0aCA9IGhvbGRlcnMubGVuZ3RoLFxuICAgICAgcmlnaHRJbmRleCA9IC0xLFxuICAgICAgcmlnaHRMZW5ndGggPSBwYXJ0aWFscy5sZW5ndGgsXG4gICAgICByYW5nZUxlbmd0aCA9IG5hdGl2ZU1heChhcmdzTGVuZ3RoIC0gaG9sZGVyc0xlbmd0aCwgMCksXG4gICAgICByZXN1bHQgPSBBcnJheShyYW5nZUxlbmd0aCArIHJpZ2h0TGVuZ3RoKSxcbiAgICAgIGlzVW5jdXJyaWVkID0gIWlzQ3VycmllZDtcblxuICB3aGlsZSAoKythcmdzSW5kZXggPCByYW5nZUxlbmd0aCkge1xuICAgIHJlc3VsdFthcmdzSW5kZXhdID0gYXJnc1thcmdzSW5kZXhdO1xuICB9XG4gIHZhciBvZmZzZXQgPSBhcmdzSW5kZXg7XG4gIHdoaWxlICgrK3JpZ2h0SW5kZXggPCByaWdodExlbmd0aCkge1xuICAgIHJlc3VsdFtvZmZzZXQgKyByaWdodEluZGV4XSA9IHBhcnRpYWxzW3JpZ2h0SW5kZXhdO1xuICB9XG4gIHdoaWxlICgrK2hvbGRlcnNJbmRleCA8IGhvbGRlcnNMZW5ndGgpIHtcbiAgICBpZiAoaXNVbmN1cnJpZWQgfHwgYXJnc0luZGV4IDwgYXJnc0xlbmd0aCkge1xuICAgICAgcmVzdWx0W29mZnNldCArIGhvbGRlcnNbaG9sZGVyc0luZGV4XV0gPSBhcmdzW2FyZ3NJbmRleCsrXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiBgc291cmNlYCB0byBgYXJyYXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBzb3VyY2UgVGhlIGFycmF5IHRvIGNvcHkgdmFsdWVzIGZyb20uXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXk9W11dIFRoZSBhcnJheSB0byBjb3B5IHZhbHVlcyB0by5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICovXG5mdW5jdGlvbiBjb3B5QXJyYXkoc291cmNlLCBhcnJheSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IHNvdXJjZS5sZW5ndGg7XG5cbiAgYXJyYXkgfHwgKGFycmF5ID0gQXJyYXkobGVuZ3RoKSk7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgYXJyYXlbaW5kZXhdID0gc291cmNlW2luZGV4XTtcbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIHRvIGludm9rZSBpdCB3aXRoIHRoZSBvcHRpb25hbCBgdGhpc2BcbiAqIGJpbmRpbmcgb2YgYHRoaXNBcmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVCaW5kKGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcpIHtcbiAgdmFyIGlzQmluZCA9IGJpdG1hc2sgJiBCSU5EX0ZMQUcsXG4gICAgICBDdG9yID0gY3JlYXRlQ3RvcihmdW5jKTtcblxuICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgIHZhciBmbiA9ICh0aGlzICYmIHRoaXMgIT09IHJvb3QgJiYgdGhpcyBpbnN0YW5jZW9mIHdyYXBwZXIpID8gQ3RvciA6IGZ1bmM7XG4gICAgcmV0dXJuIGZuLmFwcGx5KGlzQmluZCA/IHRoaXNBcmcgOiB0aGlzLCBhcmd1bWVudHMpO1xuICB9XG4gIHJldHVybiB3cmFwcGVyO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHByb2R1Y2VzIGFuIGluc3RhbmNlIG9mIGBDdG9yYCByZWdhcmRsZXNzIG9mXG4gKiB3aGV0aGVyIGl0IHdhcyBpbnZva2VkIGFzIHBhcnQgb2YgYSBgbmV3YCBleHByZXNzaW9uIG9yIGJ5IGBjYWxsYCBvciBgYXBwbHlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBDdG9yIFRoZSBjb25zdHJ1Y3RvciB0byB3cmFwLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ3RvcihDdG9yKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAvLyBVc2UgYSBgc3dpdGNoYCBzdGF0ZW1lbnQgdG8gd29yayB3aXRoIGNsYXNzIGNvbnN0cnVjdG9ycy4gU2VlXG4gICAgLy8gaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1mdW5jdGlvbi1vYmplY3RzLWNhbGwtdGhpc2FyZ3VtZW50LWFyZ3VtZW50c2xpc3RcbiAgICAvLyBmb3IgbW9yZSBkZXRhaWxzLlxuICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICAgIGNhc2UgMDogcmV0dXJuIG5ldyBDdG9yO1xuICAgICAgY2FzZSAxOiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSk7XG4gICAgICBjYXNlIDI6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICAgIGNhc2UgMzogcmV0dXJuIG5ldyBDdG9yKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgICAgY2FzZSA0OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7XG4gICAgICBjYXNlIDU6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdLCBhcmdzWzRdKTtcbiAgICAgIGNhc2UgNjogcmV0dXJuIG5ldyBDdG9yKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10sIGFyZ3NbNF0sIGFyZ3NbNV0pO1xuICAgICAgY2FzZSA3OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSwgYXJnc1s1XSwgYXJnc1s2XSk7XG4gICAgfVxuICAgIHZhciB0aGlzQmluZGluZyA9IGJhc2VDcmVhdGUoQ3Rvci5wcm90b3R5cGUpLFxuICAgICAgICByZXN1bHQgPSBDdG9yLmFwcGx5KHRoaXNCaW5kaW5nLCBhcmdzKTtcblxuICAgIC8vIE1pbWljIHRoZSBjb25zdHJ1Y3RvcidzIGByZXR1cm5gIGJlaGF2aW9yLlxuICAgIC8vIFNlZSBodHRwczovL2VzNS5naXRodWIuaW8vI3gxMy4yLjIgZm9yIG1vcmUgZGV0YWlscy5cbiAgICByZXR1cm4gaXNPYmplY3QocmVzdWx0KSA/IHJlc3VsdCA6IHRoaXNCaW5kaW5nO1xuICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCB0byBlbmFibGUgY3VycnlpbmcuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICogQHBhcmFtIHtudW1iZXJ9IGFyaXR5IFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVDdXJyeShmdW5jLCBiaXRtYXNrLCBhcml0eSkge1xuICB2YXIgQ3RvciA9IGNyZWF0ZUN0b3IoZnVuYyk7XG5cbiAgZnVuY3Rpb24gd3JhcHBlcigpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICAgICAgYXJncyA9IEFycmF5KGxlbmd0aCksXG4gICAgICAgIGluZGV4ID0gbGVuZ3RoLFxuICAgICAgICBwbGFjZWhvbGRlciA9IGdldEhvbGRlcih3cmFwcGVyKTtcblxuICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICBhcmdzW2luZGV4XSA9IGFyZ3VtZW50c1tpbmRleF07XG4gICAgfVxuICAgIHZhciBob2xkZXJzID0gKGxlbmd0aCA8IDMgJiYgYXJnc1swXSAhPT0gcGxhY2Vob2xkZXIgJiYgYXJnc1tsZW5ndGggLSAxXSAhPT0gcGxhY2Vob2xkZXIpXG4gICAgICA/IFtdXG4gICAgICA6IHJlcGxhY2VIb2xkZXJzKGFyZ3MsIHBsYWNlaG9sZGVyKTtcblxuICAgIGxlbmd0aCAtPSBob2xkZXJzLmxlbmd0aDtcbiAgICBpZiAobGVuZ3RoIDwgYXJpdHkpIHtcbiAgICAgIHJldHVybiBjcmVhdGVSZWN1cnJ5KFxuICAgICAgICBmdW5jLCBiaXRtYXNrLCBjcmVhdGVIeWJyaWQsIHdyYXBwZXIucGxhY2Vob2xkZXIsIHVuZGVmaW5lZCxcbiAgICAgICAgYXJncywgaG9sZGVycywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFyaXR5IC0gbGVuZ3RoKTtcbiAgICB9XG4gICAgdmFyIGZuID0gKHRoaXMgJiYgdGhpcyAhPT0gcm9vdCAmJiB0aGlzIGluc3RhbmNlb2Ygd3JhcHBlcikgPyBDdG9yIDogZnVuYztcbiAgICByZXR1cm4gYXBwbHkoZm4sIHRoaXMsIGFyZ3MpO1xuICB9XG4gIHJldHVybiB3cmFwcGVyO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCB0byBpbnZva2UgaXQgd2l0aCBvcHRpb25hbCBgdGhpc2BcbiAqIGJpbmRpbmcgb2YgYHRoaXNBcmdgLCBwYXJ0aWFsIGFwcGxpY2F0aW9uLCBhbmQgY3VycnlpbmcuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb258c3RyaW5nfSBmdW5jIFRoZSBmdW5jdGlvbiBvciBtZXRob2QgbmFtZSB0byB3cmFwLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gKiBAcGFyYW0ge0FycmF5fSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZCB0b1xuICogIHRoZSBuZXcgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge0FycmF5fSBbaG9sZGVyc10gVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAqIEBwYXJhbSB7QXJyYXl9IFtwYXJ0aWFsc1JpZ2h0XSBUaGUgYXJndW1lbnRzIHRvIGFwcGVuZCB0byB0aG9zZSBwcm92aWRlZFxuICogIHRvIHRoZSBuZXcgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge0FycmF5fSBbaG9sZGVyc1JpZ2h0XSBUaGUgYHBhcnRpYWxzUmlnaHRgIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJnUG9zXSBUaGUgYXJndW1lbnQgcG9zaXRpb25zIG9mIHRoZSBuZXcgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge251bWJlcn0gW2FyeV0gVGhlIGFyaXR5IGNhcCBvZiBgZnVuY2AuXG4gKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5XSBUaGUgYXJpdHkgb2YgYGZ1bmNgLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlSHlicmlkKGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIHBhcnRpYWxzLCBob2xkZXJzLCBwYXJ0aWFsc1JpZ2h0LCBob2xkZXJzUmlnaHQsIGFyZ1BvcywgYXJ5LCBhcml0eSkge1xuICB2YXIgaXNBcnkgPSBiaXRtYXNrICYgQVJZX0ZMQUcsXG4gICAgICBpc0JpbmQgPSBiaXRtYXNrICYgQklORF9GTEFHLFxuICAgICAgaXNCaW5kS2V5ID0gYml0bWFzayAmIEJJTkRfS0VZX0ZMQUcsXG4gICAgICBpc0N1cnJpZWQgPSBiaXRtYXNrICYgKENVUlJZX0ZMQUcgfCBDVVJSWV9SSUdIVF9GTEFHKSxcbiAgICAgIGlzRmxpcCA9IGJpdG1hc2sgJiBGTElQX0ZMQUcsXG4gICAgICBDdG9yID0gaXNCaW5kS2V5ID8gdW5kZWZpbmVkIDogY3JlYXRlQ3RvcihmdW5jKTtcblxuICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLFxuICAgICAgICBhcmdzID0gQXJyYXkobGVuZ3RoKSxcbiAgICAgICAgaW5kZXggPSBsZW5ndGg7XG5cbiAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgYXJnc1tpbmRleF0gPSBhcmd1bWVudHNbaW5kZXhdO1xuICAgIH1cbiAgICBpZiAoaXNDdXJyaWVkKSB7XG4gICAgICB2YXIgcGxhY2Vob2xkZXIgPSBnZXRIb2xkZXIod3JhcHBlciksXG4gICAgICAgICAgaG9sZGVyc0NvdW50ID0gY291bnRIb2xkZXJzKGFyZ3MsIHBsYWNlaG9sZGVyKTtcbiAgICB9XG4gICAgaWYgKHBhcnRpYWxzKSB7XG4gICAgICBhcmdzID0gY29tcG9zZUFyZ3MoYXJncywgcGFydGlhbHMsIGhvbGRlcnMsIGlzQ3VycmllZCk7XG4gICAgfVxuICAgIGlmIChwYXJ0aWFsc1JpZ2h0KSB7XG4gICAgICBhcmdzID0gY29tcG9zZUFyZ3NSaWdodChhcmdzLCBwYXJ0aWFsc1JpZ2h0LCBob2xkZXJzUmlnaHQsIGlzQ3VycmllZCk7XG4gICAgfVxuICAgIGxlbmd0aCAtPSBob2xkZXJzQ291bnQ7XG4gICAgaWYgKGlzQ3VycmllZCAmJiBsZW5ndGggPCBhcml0eSkge1xuICAgICAgdmFyIG5ld0hvbGRlcnMgPSByZXBsYWNlSG9sZGVycyhhcmdzLCBwbGFjZWhvbGRlcik7XG4gICAgICByZXR1cm4gY3JlYXRlUmVjdXJyeShcbiAgICAgICAgZnVuYywgYml0bWFzaywgY3JlYXRlSHlicmlkLCB3cmFwcGVyLnBsYWNlaG9sZGVyLCB0aGlzQXJnLFxuICAgICAgICBhcmdzLCBuZXdIb2xkZXJzLCBhcmdQb3MsIGFyeSwgYXJpdHkgLSBsZW5ndGhcbiAgICAgICk7XG4gICAgfVxuICAgIHZhciB0aGlzQmluZGluZyA9IGlzQmluZCA/IHRoaXNBcmcgOiB0aGlzLFxuICAgICAgICBmbiA9IGlzQmluZEtleSA/IHRoaXNCaW5kaW5nW2Z1bmNdIDogZnVuYztcblxuICAgIGxlbmd0aCA9IGFyZ3MubGVuZ3RoO1xuICAgIGlmIChhcmdQb3MpIHtcbiAgICAgIGFyZ3MgPSByZW9yZGVyKGFyZ3MsIGFyZ1Bvcyk7XG4gICAgfSBlbHNlIGlmIChpc0ZsaXAgJiYgbGVuZ3RoID4gMSkge1xuICAgICAgYXJncy5yZXZlcnNlKCk7XG4gICAgfVxuICAgIGlmIChpc0FyeSAmJiBhcnkgPCBsZW5ndGgpIHtcbiAgICAgIGFyZ3MubGVuZ3RoID0gYXJ5O1xuICAgIH1cbiAgICBpZiAodGhpcyAmJiB0aGlzICE9PSByb290ICYmIHRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyKSB7XG4gICAgICBmbiA9IEN0b3IgfHwgY3JlYXRlQ3Rvcihmbik7XG4gICAgfVxuICAgIHJldHVybiBmbi5hcHBseSh0aGlzQmluZGluZywgYXJncyk7XG4gIH1cbiAgcmV0dXJuIHdyYXBwZXI7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIHRvIGludm9rZSBpdCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZ1xuICogb2YgYHRoaXNBcmdgIGFuZCBgcGFydGlhbHNgIHByZXBlbmRlZCB0byB0aGUgYXJndW1lbnRzIGl0IHJlY2VpdmVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAqIEBwYXJhbSB7Kn0gdGhpc0FyZyBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICogQHBhcmFtIHtBcnJheX0gcGFydGlhbHMgVGhlIGFyZ3VtZW50cyB0byBwcmVwZW5kIHRvIHRob3NlIHByb3ZpZGVkIHRvXG4gKiAgdGhlIG5ldyBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVBhcnRpYWwoZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMpIHtcbiAgdmFyIGlzQmluZCA9IGJpdG1hc2sgJiBCSU5EX0ZMQUcsXG4gICAgICBDdG9yID0gY3JlYXRlQ3RvcihmdW5jKTtcblxuICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgIHZhciBhcmdzSW5kZXggPSAtMSxcbiAgICAgICAgYXJnc0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsXG4gICAgICAgIGxlZnRJbmRleCA9IC0xLFxuICAgICAgICBsZWZ0TGVuZ3RoID0gcGFydGlhbHMubGVuZ3RoLFxuICAgICAgICBhcmdzID0gQXJyYXkobGVmdExlbmd0aCArIGFyZ3NMZW5ndGgpLFxuICAgICAgICBmbiA9ICh0aGlzICYmIHRoaXMgIT09IHJvb3QgJiYgdGhpcyBpbnN0YW5jZW9mIHdyYXBwZXIpID8gQ3RvciA6IGZ1bmM7XG5cbiAgICB3aGlsZSAoKytsZWZ0SW5kZXggPCBsZWZ0TGVuZ3RoKSB7XG4gICAgICBhcmdzW2xlZnRJbmRleF0gPSBwYXJ0aWFsc1tsZWZ0SW5kZXhdO1xuICAgIH1cbiAgICB3aGlsZSAoYXJnc0xlbmd0aC0tKSB7XG4gICAgICBhcmdzW2xlZnRJbmRleCsrXSA9IGFyZ3VtZW50c1srK2FyZ3NJbmRleF07XG4gICAgfVxuICAgIHJldHVybiBhcHBseShmbiwgaXNCaW5kID8gdGhpc0FyZyA6IHRoaXMsIGFyZ3MpO1xuICB9XG4gIHJldHVybiB3cmFwcGVyO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCB0byBjb250aW51ZSBjdXJyeWluZy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB3cmFwRnVuYyBUaGUgZnVuY3Rpb24gdG8gY3JlYXRlIHRoZSBgZnVuY2Agd3JhcHBlci5cbiAqIEBwYXJhbSB7Kn0gcGxhY2Vob2xkZXIgVGhlIHBsYWNlaG9sZGVyIHZhbHVlLlxuICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAqIEBwYXJhbSB7QXJyYXl9IFtwYXJ0aWFsc10gVGhlIGFyZ3VtZW50cyB0byBwcmVwZW5kIHRvIHRob3NlIHByb3ZpZGVkIHRvXG4gKiAgdGhlIG5ldyBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7QXJyYXl9IFtob2xkZXJzXSBUaGUgYHBhcnRpYWxzYCBwbGFjZWhvbGRlciBpbmRleGVzLlxuICogQHBhcmFtIHtBcnJheX0gW2FyZ1Bvc10gVGhlIGFyZ3VtZW50IHBvc2l0aW9ucyBvZiB0aGUgbmV3IGZ1bmN0aW9uLlxuICogQHBhcmFtIHtudW1iZXJ9IFthcnldIFRoZSBhcml0eSBjYXAgb2YgYGZ1bmNgLlxuICogQHBhcmFtIHtudW1iZXJ9IFthcml0eV0gVGhlIGFyaXR5IG9mIGBmdW5jYC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVJlY3VycnkoZnVuYywgYml0bWFzaywgd3JhcEZ1bmMsIHBsYWNlaG9sZGVyLCB0aGlzQXJnLCBwYXJ0aWFscywgaG9sZGVycywgYXJnUG9zLCBhcnksIGFyaXR5KSB7XG4gIHZhciBpc0N1cnJ5ID0gYml0bWFzayAmIENVUlJZX0ZMQUcsXG4gICAgICBuZXdIb2xkZXJzID0gaXNDdXJyeSA/IGhvbGRlcnMgOiB1bmRlZmluZWQsXG4gICAgICBuZXdIb2xkZXJzUmlnaHQgPSBpc0N1cnJ5ID8gdW5kZWZpbmVkIDogaG9sZGVycyxcbiAgICAgIG5ld1BhcnRpYWxzID0gaXNDdXJyeSA/IHBhcnRpYWxzIDogdW5kZWZpbmVkLFxuICAgICAgbmV3UGFydGlhbHNSaWdodCA9IGlzQ3VycnkgPyB1bmRlZmluZWQgOiBwYXJ0aWFscztcblxuICBiaXRtYXNrIHw9IChpc0N1cnJ5ID8gUEFSVElBTF9GTEFHIDogUEFSVElBTF9SSUdIVF9GTEFHKTtcbiAgYml0bWFzayAmPSB+KGlzQ3VycnkgPyBQQVJUSUFMX1JJR0hUX0ZMQUcgOiBQQVJUSUFMX0ZMQUcpO1xuXG4gIGlmICghKGJpdG1hc2sgJiBDVVJSWV9CT1VORF9GTEFHKSkge1xuICAgIGJpdG1hc2sgJj0gfihCSU5EX0ZMQUcgfCBCSU5EX0tFWV9GTEFHKTtcbiAgfVxuXG4gIHZhciByZXN1bHQgPSB3cmFwRnVuYyhmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBuZXdQYXJ0aWFscywgbmV3SG9sZGVycywgbmV3UGFydGlhbHNSaWdodCwgbmV3SG9sZGVyc1JpZ2h0LCBhcmdQb3MsIGFyeSwgYXJpdHkpO1xuICByZXN1bHQucGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlcjtcbiAgcmV0dXJuIHNldFdyYXBUb1N0cmluZyhyZXN1bHQsIGZ1bmMsIGJpdG1hc2spO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGVpdGhlciBjdXJyaWVzIG9yIGludm9rZXMgYGZ1bmNgIHdpdGggb3B0aW9uYWxcbiAqIGB0aGlzYCBiaW5kaW5nIGFuZCBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb258c3RyaW5nfSBmdW5jIFRoZSBmdW5jdGlvbiBvciBtZXRob2QgbmFtZSB0byB3cmFwLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuXG4gKiAgVGhlIGJpdG1hc2sgbWF5IGJlIGNvbXBvc2VkIG9mIHRoZSBmb2xsb3dpbmcgZmxhZ3M6XG4gKiAgICAgMSAtIGBfLmJpbmRgXG4gKiAgICAgMiAtIGBfLmJpbmRLZXlgXG4gKiAgICAgNCAtIGBfLmN1cnJ5YCBvciBgXy5jdXJyeVJpZ2h0YCBvZiBhIGJvdW5kIGZ1bmN0aW9uXG4gKiAgICAgOCAtIGBfLmN1cnJ5YFxuICogICAgMTYgLSBgXy5jdXJyeVJpZ2h0YFxuICogICAgMzIgLSBgXy5wYXJ0aWFsYFxuICogICAgNjQgLSBgXy5wYXJ0aWFsUmlnaHRgXG4gKiAgIDEyOCAtIGBfLnJlYXJnYFxuICogICAyNTYgLSBgXy5hcnlgXG4gKiAgIDUxMiAtIGBfLmZsaXBgXG4gKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICogQHBhcmFtIHtBcnJheX0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIGJlIHBhcnRpYWxseSBhcHBsaWVkLlxuICogQHBhcmFtIHtBcnJheX0gW2hvbGRlcnNdIFRoZSBgcGFydGlhbHNgIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJnUG9zXSBUaGUgYXJndW1lbnQgcG9zaXRpb25zIG9mIHRoZSBuZXcgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge251bWJlcn0gW2FyeV0gVGhlIGFyaXR5IGNhcCBvZiBgZnVuY2AuXG4gKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5XSBUaGUgYXJpdHkgb2YgYGZ1bmNgLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlV3JhcChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscywgaG9sZGVycywgYXJnUG9zLCBhcnksIGFyaXR5KSB7XG4gIHZhciBpc0JpbmRLZXkgPSBiaXRtYXNrICYgQklORF9LRVlfRkxBRztcbiAgaWYgKCFpc0JpbmRLZXkgJiYgdHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgfVxuICB2YXIgbGVuZ3RoID0gcGFydGlhbHMgPyBwYXJ0aWFscy5sZW5ndGggOiAwO1xuICBpZiAoIWxlbmd0aCkge1xuICAgIGJpdG1hc2sgJj0gfihQQVJUSUFMX0ZMQUcgfCBQQVJUSUFMX1JJR0hUX0ZMQUcpO1xuICAgIHBhcnRpYWxzID0gaG9sZGVycyA9IHVuZGVmaW5lZDtcbiAgfVxuICBhcnkgPSBhcnkgPT09IHVuZGVmaW5lZCA/IGFyeSA6IG5hdGl2ZU1heCh0b0ludGVnZXIoYXJ5KSwgMCk7XG4gIGFyaXR5ID0gYXJpdHkgPT09IHVuZGVmaW5lZCA/IGFyaXR5IDogdG9JbnRlZ2VyKGFyaXR5KTtcbiAgbGVuZ3RoIC09IGhvbGRlcnMgPyBob2xkZXJzLmxlbmd0aCA6IDA7XG5cbiAgaWYgKGJpdG1hc2sgJiBQQVJUSUFMX1JJR0hUX0ZMQUcpIHtcbiAgICB2YXIgcGFydGlhbHNSaWdodCA9IHBhcnRpYWxzLFxuICAgICAgICBob2xkZXJzUmlnaHQgPSBob2xkZXJzO1xuXG4gICAgcGFydGlhbHMgPSBob2xkZXJzID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgdmFyIG5ld0RhdGEgPSBbXG4gICAgZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMsIGhvbGRlcnMsIHBhcnRpYWxzUmlnaHQsIGhvbGRlcnNSaWdodCxcbiAgICBhcmdQb3MsIGFyeSwgYXJpdHlcbiAgXTtcblxuICBmdW5jID0gbmV3RGF0YVswXTtcbiAgYml0bWFzayA9IG5ld0RhdGFbMV07XG4gIHRoaXNBcmcgPSBuZXdEYXRhWzJdO1xuICBwYXJ0aWFscyA9IG5ld0RhdGFbM107XG4gIGhvbGRlcnMgPSBuZXdEYXRhWzRdO1xuICBhcml0eSA9IG5ld0RhdGFbOV0gPSBuZXdEYXRhWzldID09IG51bGxcbiAgICA/IChpc0JpbmRLZXkgPyAwIDogZnVuYy5sZW5ndGgpXG4gICAgOiBuYXRpdmVNYXgobmV3RGF0YVs5XSAtIGxlbmd0aCwgMCk7XG5cbiAgaWYgKCFhcml0eSAmJiBiaXRtYXNrICYgKENVUlJZX0ZMQUcgfCBDVVJSWV9SSUdIVF9GTEFHKSkge1xuICAgIGJpdG1hc2sgJj0gfihDVVJSWV9GTEFHIHwgQ1VSUllfUklHSFRfRkxBRyk7XG4gIH1cbiAgaWYgKCFiaXRtYXNrIHx8IGJpdG1hc2sgPT0gQklORF9GTEFHKSB7XG4gICAgdmFyIHJlc3VsdCA9IGNyZWF0ZUJpbmQoZnVuYywgYml0bWFzaywgdGhpc0FyZyk7XG4gIH0gZWxzZSBpZiAoYml0bWFzayA9PSBDVVJSWV9GTEFHIHx8IGJpdG1hc2sgPT0gQ1VSUllfUklHSFRfRkxBRykge1xuICAgIHJlc3VsdCA9IGNyZWF0ZUN1cnJ5KGZ1bmMsIGJpdG1hc2ssIGFyaXR5KTtcbiAgfSBlbHNlIGlmICgoYml0bWFzayA9PSBQQVJUSUFMX0ZMQUcgfHwgYml0bWFzayA9PSAoQklORF9GTEFHIHwgUEFSVElBTF9GTEFHKSkgJiYgIWhvbGRlcnMubGVuZ3RoKSB7XG4gICAgcmVzdWx0ID0gY3JlYXRlUGFydGlhbChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscyk7XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0ID0gY3JlYXRlSHlicmlkLmFwcGx5KHVuZGVmaW5lZCwgbmV3RGF0YSk7XG4gIH1cbiAgcmV0dXJuIHNldFdyYXBUb1N0cmluZyhyZXN1bHQsIGZ1bmMsIGJpdG1hc2spO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGFyZ3VtZW50IHBsYWNlaG9sZGVyIHZhbHVlIGZvciBgZnVuY2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcGxhY2Vob2xkZXIgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGdldEhvbGRlcihmdW5jKSB7XG4gIHZhciBvYmplY3QgPSBmdW5jO1xuICByZXR1cm4gb2JqZWN0LnBsYWNlaG9sZGVyO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIG5hdGl2ZSBmdW5jdGlvbiBhdCBga2V5YCBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBtZXRob2QgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGZ1bmN0aW9uIGlmIGl0J3MgbmF0aXZlLCBlbHNlIGB1bmRlZmluZWRgLlxuICovXG5mdW5jdGlvbiBnZXROYXRpdmUob2JqZWN0LCBrZXkpIHtcbiAgdmFyIHZhbHVlID0gZ2V0VmFsdWUob2JqZWN0LCBrZXkpO1xuICByZXR1cm4gYmFzZUlzTmF0aXZlKHZhbHVlKSA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEV4dHJhY3RzIHdyYXBwZXIgZGV0YWlscyBmcm9tIHRoZSBgc291cmNlYCBib2R5IGNvbW1lbnQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgVGhlIHNvdXJjZSB0byBpbnNwZWN0LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB3cmFwcGVyIGRldGFpbHMuXG4gKi9cbmZ1bmN0aW9uIGdldFdyYXBEZXRhaWxzKHNvdXJjZSkge1xuICB2YXIgbWF0Y2ggPSBzb3VyY2UubWF0Y2gocmVXcmFwRGV0YWlscyk7XG4gIHJldHVybiBtYXRjaCA/IG1hdGNoWzFdLnNwbGl0KHJlU3BsaXREZXRhaWxzKSA6IFtdO1xufVxuXG4vKipcbiAqIEluc2VydHMgd3JhcHBlciBgZGV0YWlsc2AgaW4gYSBjb21tZW50IGF0IHRoZSB0b3Agb2YgdGhlIGBzb3VyY2VgIGJvZHkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgVGhlIHNvdXJjZSB0byBtb2RpZnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IGRldGFpbHMgVGhlIGRldGFpbHMgdG8gaW5zZXJ0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgbW9kaWZpZWQgc291cmNlLlxuICovXG5mdW5jdGlvbiBpbnNlcnRXcmFwRGV0YWlscyhzb3VyY2UsIGRldGFpbHMpIHtcbiAgdmFyIGxlbmd0aCA9IGRldGFpbHMubGVuZ3RoLFxuICAgICAgbGFzdEluZGV4ID0gbGVuZ3RoIC0gMTtcblxuICBkZXRhaWxzW2xhc3RJbmRleF0gPSAobGVuZ3RoID4gMSA/ICcmICcgOiAnJykgKyBkZXRhaWxzW2xhc3RJbmRleF07XG4gIGRldGFpbHMgPSBkZXRhaWxzLmpvaW4obGVuZ3RoID4gMiA/ICcsICcgOiAnICcpO1xuICByZXR1cm4gc291cmNlLnJlcGxhY2UocmVXcmFwQ29tbWVudCwgJ3tcXG4vKiBbd3JhcHBlZCB3aXRoICcgKyBkZXRhaWxzICsgJ10gKi9cXG4nKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGFycmF5LWxpa2UgaW5kZXguXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGg9TUFYX1NBRkVfSU5URUdFUl0gVGhlIHVwcGVyIGJvdW5kcyBvZiBhIHZhbGlkIGluZGV4LlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBpbmRleCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0luZGV4KHZhbHVlLCBsZW5ndGgpIHtcbiAgbGVuZ3RoID0gbGVuZ3RoID09IG51bGwgPyBNQVhfU0FGRV9JTlRFR0VSIDogbGVuZ3RoO1xuICByZXR1cm4gISFsZW5ndGggJiZcbiAgICAodHlwZW9mIHZhbHVlID09ICdudW1iZXInIHx8IHJlSXNVaW50LnRlc3QodmFsdWUpKSAmJlxuICAgICh2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDwgbGVuZ3RoKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYGZ1bmNgIGhhcyBpdHMgc291cmNlIG1hc2tlZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGZ1bmNgIGlzIG1hc2tlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc01hc2tlZChmdW5jKSB7XG4gIHJldHVybiAhIW1hc2tTcmNLZXkgJiYgKG1hc2tTcmNLZXkgaW4gZnVuYyk7XG59XG5cbi8qKlxuICogUmVvcmRlciBgYXJyYXlgIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIGluZGV4ZXMgd2hlcmUgdGhlIGVsZW1lbnQgYXRcbiAqIHRoZSBmaXJzdCBpbmRleCBpcyBhc3NpZ25lZCBhcyB0aGUgZmlyc3QgZWxlbWVudCwgdGhlIGVsZW1lbnQgYXRcbiAqIHRoZSBzZWNvbmQgaW5kZXggaXMgYXNzaWduZWQgYXMgdGhlIHNlY29uZCBlbGVtZW50LCBhbmQgc28gb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byByZW9yZGVyLlxuICogQHBhcmFtIHtBcnJheX0gaW5kZXhlcyBUaGUgYXJyYW5nZWQgYXJyYXkgaW5kZXhlcy5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICovXG5mdW5jdGlvbiByZW9yZGVyKGFycmF5LCBpbmRleGVzKSB7XG4gIHZhciBhcnJMZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICBsZW5ndGggPSBuYXRpdmVNaW4oaW5kZXhlcy5sZW5ndGgsIGFyckxlbmd0aCksXG4gICAgICBvbGRBcnJheSA9IGNvcHlBcnJheShhcnJheSk7XG5cbiAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgdmFyIGluZGV4ID0gaW5kZXhlc1tsZW5ndGhdO1xuICAgIGFycmF5W2xlbmd0aF0gPSBpc0luZGV4KGluZGV4LCBhcnJMZW5ndGgpID8gb2xkQXJyYXlbaW5kZXhdIDogdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBhcnJheTtcbn1cblxuLyoqXG4gKiBTZXRzIHRoZSBgdG9TdHJpbmdgIG1ldGhvZCBvZiBgd3JhcHBlcmAgdG8gbWltaWMgdGhlIHNvdXJjZSBvZiBgcmVmZXJlbmNlYFxuICogd2l0aCB3cmFwcGVyIGRldGFpbHMgaW4gYSBjb21tZW50IGF0IHRoZSB0b3Agb2YgdGhlIHNvdXJjZSBib2R5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB3cmFwcGVyIFRoZSBmdW5jdGlvbiB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSByZWZlcmVuY2UgVGhlIHJlZmVyZW5jZSBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYHdyYXBwZXJgLlxuICovXG52YXIgc2V0V3JhcFRvU3RyaW5nID0gIWRlZmluZVByb3BlcnR5ID8gaWRlbnRpdHkgOiBmdW5jdGlvbih3cmFwcGVyLCByZWZlcmVuY2UsIGJpdG1hc2spIHtcbiAgdmFyIHNvdXJjZSA9IChyZWZlcmVuY2UgKyAnJyk7XG4gIHJldHVybiBkZWZpbmVQcm9wZXJ0eSh3cmFwcGVyLCAndG9TdHJpbmcnLCB7XG4gICAgJ2NvbmZpZ3VyYWJsZSc6IHRydWUsXG4gICAgJ2VudW1lcmFibGUnOiBmYWxzZSxcbiAgICAndmFsdWUnOiBjb25zdGFudChpbnNlcnRXcmFwRGV0YWlscyhzb3VyY2UsIHVwZGF0ZVdyYXBEZXRhaWxzKGdldFdyYXBEZXRhaWxzKHNvdXJjZSksIGJpdG1hc2spKSlcbiAgfSk7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGBmdW5jYCB0byBpdHMgc291cmNlIGNvZGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHByb2Nlc3MuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzb3VyY2UgY29kZS5cbiAqL1xuZnVuY3Rpb24gdG9Tb3VyY2UoZnVuYykge1xuICBpZiAoZnVuYyAhPSBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBmdW5jVG9TdHJpbmcuY2FsbChmdW5jKTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gKGZ1bmMgKyAnJyk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbi8qKlxuICogVXBkYXRlcyB3cmFwcGVyIGBkZXRhaWxzYCBiYXNlZCBvbiBgYml0bWFza2AgZmxhZ3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm5zIHtBcnJheX0gZGV0YWlscyBUaGUgZGV0YWlscyB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBkZXRhaWxzYC5cbiAqL1xuZnVuY3Rpb24gdXBkYXRlV3JhcERldGFpbHMoZGV0YWlscywgYml0bWFzaykge1xuICBhcnJheUVhY2god3JhcEZsYWdzLCBmdW5jdGlvbihwYWlyKSB7XG4gICAgdmFyIHZhbHVlID0gJ18uJyArIHBhaXJbMF07XG4gICAgaWYgKChiaXRtYXNrICYgcGFpclsxXSkgJiYgIWFycmF5SW5jbHVkZXMoZGV0YWlscywgdmFsdWUpKSB7XG4gICAgICBkZXRhaWxzLnB1c2godmFsdWUpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBkZXRhaWxzLnNvcnQoKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIGFyZ3VtZW50cyBvZiBgZnVuY2AgYW5kIGVpdGhlciBpbnZva2VzXG4gKiBgZnVuY2AgcmV0dXJuaW5nIGl0cyByZXN1bHQsIGlmIGF0IGxlYXN0IGBhcml0eWAgbnVtYmVyIG9mIGFyZ3VtZW50cyBoYXZlXG4gKiBiZWVuIHByb3ZpZGVkLCBvciByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIHRoZSByZW1haW5pbmcgYGZ1bmNgXG4gKiBhcmd1bWVudHMsIGFuZCBzbyBvbi4gVGhlIGFyaXR5IG9mIGBmdW5jYCBtYXkgYmUgc3BlY2lmaWVkIGlmIGBmdW5jLmxlbmd0aGBcbiAqIGlzIG5vdCBzdWZmaWNpZW50LlxuICpcbiAqIFRoZSBgXy5jdXJyeS5wbGFjZWhvbGRlcmAgdmFsdWUsIHdoaWNoIGRlZmF1bHRzIHRvIGBfYCBpbiBtb25vbGl0aGljIGJ1aWxkcyxcbiAqIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgZG9lc24ndCBzZXQgdGhlIFwibGVuZ3RoXCIgcHJvcGVydHkgb2YgY3VycmllZCBmdW5jdGlvbnMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjAuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjdXJyeS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHk9ZnVuYy5sZW5ndGhdIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY3VycmllZCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIGFiYyA9IGZ1bmN0aW9uKGEsIGIsIGMpIHtcbiAqICAgcmV0dXJuIFthLCBiLCBjXTtcbiAqIH07XG4gKlxuICogdmFyIGN1cnJpZWQgPSBfLmN1cnJ5KGFiYyk7XG4gKlxuICogY3VycmllZCgxKSgyKSgzKTtcbiAqIC8vID0+IFsxLCAyLCAzXVxuICpcbiAqIGN1cnJpZWQoMSwgMikoMyk7XG4gKiAvLyA9PiBbMSwgMiwgM11cbiAqXG4gKiBjdXJyaWVkKDEsIDIsIDMpO1xuICogLy8gPT4gWzEsIDIsIDNdXG4gKlxuICogLy8gQ3VycmllZCB3aXRoIHBsYWNlaG9sZGVycy5cbiAqIGN1cnJpZWQoMSkoXywgMykoMik7XG4gKiAvLyA9PiBbMSwgMiwgM11cbiAqL1xuZnVuY3Rpb24gY3VycnkoZnVuYywgYXJpdHksIGd1YXJkKSB7XG4gIGFyaXR5ID0gZ3VhcmQgPyB1bmRlZmluZWQgOiBhcml0eTtcbiAgdmFyIHJlc3VsdCA9IGNyZWF0ZVdyYXAoZnVuYywgQ1VSUllfRkxBRywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFyaXR5KTtcbiAgcmVzdWx0LnBsYWNlaG9sZGVyID0gY3VycnkucGxhY2Vob2xkZXI7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBGdW5jdGlvbmAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgZnVuY3Rpb24sIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0Z1bmN0aW9uKF8pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNGdW5jdGlvbigvYWJjLyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKSB7XG4gIC8vIFRoZSB1c2Ugb2YgYE9iamVjdCN0b1N0cmluZ2AgYXZvaWRzIGlzc3VlcyB3aXRoIHRoZSBgdHlwZW9mYCBvcGVyYXRvclxuICAvLyBpbiBTYWZhcmkgOC05IHdoaWNoIHJldHVybnMgJ29iamVjdCcgZm9yIHR5cGVkIGFycmF5IGFuZCBvdGhlciBjb25zdHJ1Y3RvcnMuXG4gIHZhciB0YWcgPSBpc09iamVjdCh2YWx1ZSkgPyBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA6ICcnO1xuICByZXR1cm4gdGFnID09IGZ1bmNUYWcgfHwgdGFnID09IGdlblRhZztcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyB0aGVcbiAqIFtsYW5ndWFnZSB0eXBlXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcylcbiAqIG9mIGBPYmplY3RgLiAoZS5nLiBhcnJheXMsIGZ1bmN0aW9ucywgb2JqZWN0cywgcmVnZXhlcywgYG5ldyBOdW1iZXIoMClgLCBhbmQgYG5ldyBTdHJpbmcoJycpYClcbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdCh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoXy5ub29wKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiAhIXZhbHVlICYmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJyk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3ltYm9sYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3ltYm9sLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNTeW1ib2woU3ltYm9sLml0ZXJhdG9yKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzU3ltYm9sKCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N5bWJvbCcgfHxcbiAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA9PSBzeW1ib2xUYWcpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBmaW5pdGUgbnVtYmVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4xMi4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBudW1iZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9GaW5pdGUoMy4yKTtcbiAqIC8vID0+IDMuMlxuICpcbiAqIF8udG9GaW5pdGUoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiA1ZS0zMjRcbiAqXG4gKiBfLnRvRmluaXRlKEluZmluaXR5KTtcbiAqIC8vID0+IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4XG4gKlxuICogXy50b0Zpbml0ZSgnMy4yJyk7XG4gKiAvLyA9PiAzLjJcbiAqL1xuZnVuY3Rpb24gdG9GaW5pdGUodmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogMDtcbiAgfVxuICB2YWx1ZSA9IHRvTnVtYmVyKHZhbHVlKTtcbiAgaWYgKHZhbHVlID09PSBJTkZJTklUWSB8fCB2YWx1ZSA9PT0gLUlORklOSVRZKSB7XG4gICAgdmFyIHNpZ24gPSAodmFsdWUgPCAwID8gLTEgOiAxKTtcbiAgICByZXR1cm4gc2lnbiAqIE1BWF9JTlRFR0VSO1xuICB9XG4gIHJldHVybiB2YWx1ZSA9PT0gdmFsdWUgPyB2YWx1ZSA6IDA7XG59XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhbiBpbnRlZ2VyLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gKiBbYFRvSW50ZWdlcmBdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy10b2ludGVnZXIpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIGludGVnZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9JbnRlZ2VyKDMuMik7XG4gKiAvLyA9PiAzXG4gKlxuICogXy50b0ludGVnZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiAwXG4gKlxuICogXy50b0ludGVnZXIoSW5maW5pdHkpO1xuICogLy8gPT4gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDhcbiAqXG4gKiBfLnRvSW50ZWdlcignMy4yJyk7XG4gKiAvLyA9PiAzXG4gKi9cbmZ1bmN0aW9uIHRvSW50ZWdlcih2YWx1ZSkge1xuICB2YXIgcmVzdWx0ID0gdG9GaW5pdGUodmFsdWUpLFxuICAgICAgcmVtYWluZGVyID0gcmVzdWx0ICUgMTtcblxuICByZXR1cm4gcmVzdWx0ID09PSByZXN1bHQgPyAocmVtYWluZGVyID8gcmVzdWx0IC0gcmVtYWluZGVyIDogcmVzdWx0KSA6IDA7XG59XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIG51bWJlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG51bWJlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b051bWJlcigzLjIpO1xuICogLy8gPT4gMy4yXG4gKlxuICogXy50b051bWJlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDVlLTMyNFxuICpcbiAqIF8udG9OdW1iZXIoSW5maW5pdHkpO1xuICogLy8gPT4gSW5maW5pdHlcbiAqXG4gKiBfLnRvTnVtYmVyKCczLjInKTtcbiAqIC8vID0+IDMuMlxuICovXG5mdW5jdGlvbiB0b051bWJlcih2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gTkFOO1xuICB9XG4gIGlmIChpc09iamVjdCh2YWx1ZSkpIHtcbiAgICB2YXIgb3RoZXIgPSB0eXBlb2YgdmFsdWUudmFsdWVPZiA9PSAnZnVuY3Rpb24nID8gdmFsdWUudmFsdWVPZigpIDogdmFsdWU7XG4gICAgdmFsdWUgPSBpc09iamVjdChvdGhlcikgPyAob3RoZXIgKyAnJykgOiBvdGhlcjtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiArdmFsdWU7XG4gIH1cbiAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKHJlVHJpbSwgJycpO1xuICB2YXIgaXNCaW5hcnkgPSByZUlzQmluYXJ5LnRlc3QodmFsdWUpO1xuICByZXR1cm4gKGlzQmluYXJ5IHx8IHJlSXNPY3RhbC50ZXN0KHZhbHVlKSlcbiAgICA/IGZyZWVQYXJzZUludCh2YWx1ZS5zbGljZSgyKSwgaXNCaW5hcnkgPyAyIDogOClcbiAgICA6IChyZUlzQmFkSGV4LnRlc3QodmFsdWUpID8gTkFOIDogK3ZhbHVlKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGB2YWx1ZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjQuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHJldHVybiBmcm9tIHRoZSBuZXcgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb25zdGFudCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdHMgPSBfLnRpbWVzKDIsIF8uY29uc3RhbnQoeyAnYSc6IDEgfSkpO1xuICpcbiAqIGNvbnNvbGUubG9nKG9iamVjdHMpO1xuICogLy8gPT4gW3sgJ2EnOiAxIH0sIHsgJ2EnOiAxIH1dXG4gKlxuICogY29uc29sZS5sb2cob2JqZWN0c1swXSA9PT0gb2JqZWN0c1sxXSk7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGNvbnN0YW50KHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG59XG5cbi8qKlxuICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgZmlyc3QgYXJndW1lbnQgaXQgcmVjZWl2ZXMuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgQW55IHZhbHVlLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgYHZhbHVlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxIH07XG4gKlxuICogY29uc29sZS5sb2coXy5pZGVudGl0eShvYmplY3QpID09PSBvYmplY3QpO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBpZGVudGl0eSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWU7XG59XG5cbi8vIEFzc2lnbiBkZWZhdWx0IHBsYWNlaG9sZGVycy5cbmN1cnJ5LnBsYWNlaG9sZGVyID0ge307XG5cbm1vZHVsZS5leHBvcnRzID0gY3Vycnk7XG4iLCJ2YXIgZ2V0TmF0aXZlID0gcmVxdWlyZSgnLi9fZ2V0TmF0aXZlJyksXG4gICAgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIERhdGFWaWV3ID0gZ2V0TmF0aXZlKHJvb3QsICdEYXRhVmlldycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERhdGFWaWV3O1xuIiwidmFyIGhhc2hDbGVhciA9IHJlcXVpcmUoJy4vX2hhc2hDbGVhcicpLFxuICAgIGhhc2hEZWxldGUgPSByZXF1aXJlKCcuL19oYXNoRGVsZXRlJyksXG4gICAgaGFzaEdldCA9IHJlcXVpcmUoJy4vX2hhc2hHZXQnKSxcbiAgICBoYXNoSGFzID0gcmVxdWlyZSgnLi9faGFzaEhhcycpLFxuICAgIGhhc2hTZXQgPSByZXF1aXJlKCcuL19oYXNoU2V0Jyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGhhc2ggb2JqZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBIYXNoKGVudHJpZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgdGhpcy5jbGVhcigpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gIH1cbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYEhhc2hgLlxuSGFzaC5wcm90b3R5cGUuY2xlYXIgPSBoYXNoQ2xlYXI7XG5IYXNoLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBoYXNoRGVsZXRlO1xuSGFzaC5wcm90b3R5cGUuZ2V0ID0gaGFzaEdldDtcbkhhc2gucHJvdG90eXBlLmhhcyA9IGhhc2hIYXM7XG5IYXNoLnByb3RvdHlwZS5zZXQgPSBoYXNoU2V0O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEhhc2g7XG4iLCJ2YXIgbGlzdENhY2hlQ2xlYXIgPSByZXF1aXJlKCcuL19saXN0Q2FjaGVDbGVhcicpLFxuICAgIGxpc3RDYWNoZURlbGV0ZSA9IHJlcXVpcmUoJy4vX2xpc3RDYWNoZURlbGV0ZScpLFxuICAgIGxpc3RDYWNoZUdldCA9IHJlcXVpcmUoJy4vX2xpc3RDYWNoZUdldCcpLFxuICAgIGxpc3RDYWNoZUhhcyA9IHJlcXVpcmUoJy4vX2xpc3RDYWNoZUhhcycpLFxuICAgIGxpc3RDYWNoZVNldCA9IHJlcXVpcmUoJy4vX2xpc3RDYWNoZVNldCcpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gbGlzdCBjYWNoZSBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gKi9cbmZ1bmN0aW9uIExpc3RDYWNoZShlbnRyaWVzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gZW50cmllcyA9PSBudWxsID8gMCA6IGVudHJpZXMubGVuZ3RoO1xuXG4gIHRoaXMuY2xlYXIoKTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xuICB9XG59XG5cbi8vIEFkZCBtZXRob2RzIHRvIGBMaXN0Q2FjaGVgLlxuTGlzdENhY2hlLnByb3RvdHlwZS5jbGVhciA9IGxpc3RDYWNoZUNsZWFyO1xuTGlzdENhY2hlLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBsaXN0Q2FjaGVEZWxldGU7XG5MaXN0Q2FjaGUucHJvdG90eXBlLmdldCA9IGxpc3RDYWNoZUdldDtcbkxpc3RDYWNoZS5wcm90b3R5cGUuaGFzID0gbGlzdENhY2hlSGFzO1xuTGlzdENhY2hlLnByb3RvdHlwZS5zZXQgPSBsaXN0Q2FjaGVTZXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gTGlzdENhY2hlO1xuIiwidmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJy4vX2dldE5hdGl2ZScpLFxuICAgIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbnZhciBNYXAgPSBnZXROYXRpdmUocm9vdCwgJ01hcCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1hcDtcbiIsInZhciBtYXBDYWNoZUNsZWFyID0gcmVxdWlyZSgnLi9fbWFwQ2FjaGVDbGVhcicpLFxuICAgIG1hcENhY2hlRGVsZXRlID0gcmVxdWlyZSgnLi9fbWFwQ2FjaGVEZWxldGUnKSxcbiAgICBtYXBDYWNoZUdldCA9IHJlcXVpcmUoJy4vX21hcENhY2hlR2V0JyksXG4gICAgbWFwQ2FjaGVIYXMgPSByZXF1aXJlKCcuL19tYXBDYWNoZUhhcycpLFxuICAgIG1hcENhY2hlU2V0ID0gcmVxdWlyZSgnLi9fbWFwQ2FjaGVTZXQnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbWFwIGNhY2hlIG9iamVjdCB0byBzdG9yZSBrZXktdmFsdWUgcGFpcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gKi9cbmZ1bmN0aW9uIE1hcENhY2hlKGVudHJpZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgdGhpcy5jbGVhcigpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gIH1cbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYE1hcENhY2hlYC5cbk1hcENhY2hlLnByb3RvdHlwZS5jbGVhciA9IG1hcENhY2hlQ2xlYXI7XG5NYXBDYWNoZS5wcm90b3R5cGVbJ2RlbGV0ZSddID0gbWFwQ2FjaGVEZWxldGU7XG5NYXBDYWNoZS5wcm90b3R5cGUuZ2V0ID0gbWFwQ2FjaGVHZXQ7XG5NYXBDYWNoZS5wcm90b3R5cGUuaGFzID0gbWFwQ2FjaGVIYXM7XG5NYXBDYWNoZS5wcm90b3R5cGUuc2V0ID0gbWFwQ2FjaGVTZXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gTWFwQ2FjaGU7XG4iLCJ2YXIgZ2V0TmF0aXZlID0gcmVxdWlyZSgnLi9fZ2V0TmF0aXZlJyksXG4gICAgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIFByb21pc2UgPSBnZXROYXRpdmUocm9vdCwgJ1Byb21pc2UnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBQcm9taXNlO1xuIiwidmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJy4vX2dldE5hdGl2ZScpLFxuICAgIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbnZhciBTZXQgPSBnZXROYXRpdmUocm9vdCwgJ1NldCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNldDtcbiIsInZhciBNYXBDYWNoZSA9IHJlcXVpcmUoJy4vX01hcENhY2hlJyksXG4gICAgc2V0Q2FjaGVBZGQgPSByZXF1aXJlKCcuL19zZXRDYWNoZUFkZCcpLFxuICAgIHNldENhY2hlSGFzID0gcmVxdWlyZSgnLi9fc2V0Q2FjaGVIYXMnKTtcblxuLyoqXG4gKlxuICogQ3JlYXRlcyBhbiBhcnJheSBjYWNoZSBvYmplY3QgdG8gc3RvcmUgdW5pcXVlIHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBTZXRDYWNoZSh2YWx1ZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSB2YWx1ZXMgPT0gbnVsbCA/IDAgOiB2YWx1ZXMubGVuZ3RoO1xuXG4gIHRoaXMuX19kYXRhX18gPSBuZXcgTWFwQ2FjaGU7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdGhpcy5hZGQodmFsdWVzW2luZGV4XSk7XG4gIH1cbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYFNldENhY2hlYC5cblNldENhY2hlLnByb3RvdHlwZS5hZGQgPSBTZXRDYWNoZS5wcm90b3R5cGUucHVzaCA9IHNldENhY2hlQWRkO1xuU2V0Q2FjaGUucHJvdG90eXBlLmhhcyA9IHNldENhY2hlSGFzO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNldENhY2hlO1xuIiwidmFyIExpc3RDYWNoZSA9IHJlcXVpcmUoJy4vX0xpc3RDYWNoZScpLFxuICAgIHN0YWNrQ2xlYXIgPSByZXF1aXJlKCcuL19zdGFja0NsZWFyJyksXG4gICAgc3RhY2tEZWxldGUgPSByZXF1aXJlKCcuL19zdGFja0RlbGV0ZScpLFxuICAgIHN0YWNrR2V0ID0gcmVxdWlyZSgnLi9fc3RhY2tHZXQnKSxcbiAgICBzdGFja0hhcyA9IHJlcXVpcmUoJy4vX3N0YWNrSGFzJyksXG4gICAgc3RhY2tTZXQgPSByZXF1aXJlKCcuL19zdGFja1NldCcpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBzdGFjayBjYWNoZSBvYmplY3QgdG8gc3RvcmUga2V5LXZhbHVlIHBhaXJzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBTdGFjayhlbnRyaWVzKSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyA9IG5ldyBMaXN0Q2FjaGUoZW50cmllcyk7XG4gIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTtcbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYFN0YWNrYC5cblN0YWNrLnByb3RvdHlwZS5jbGVhciA9IHN0YWNrQ2xlYXI7XG5TdGFjay5wcm90b3R5cGVbJ2RlbGV0ZSddID0gc3RhY2tEZWxldGU7XG5TdGFjay5wcm90b3R5cGUuZ2V0ID0gc3RhY2tHZXQ7XG5TdGFjay5wcm90b3R5cGUuaGFzID0gc3RhY2tIYXM7XG5TdGFjay5wcm90b3R5cGUuc2V0ID0gc3RhY2tTZXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gU3RhY2s7XG4iLCJ2YXIgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgU3ltYm9sID0gcm9vdC5TeW1ib2w7XG5cbm1vZHVsZS5leHBvcnRzID0gU3ltYm9sO1xuIiwidmFyIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIFVpbnQ4QXJyYXkgPSByb290LlVpbnQ4QXJyYXk7XG5cbm1vZHVsZS5leHBvcnRzID0gVWludDhBcnJheTtcbiIsInZhciBnZXROYXRpdmUgPSByZXF1aXJlKCcuL19nZXROYXRpdmUnKSxcbiAgICByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG52YXIgV2Vha01hcCA9IGdldE5hdGl2ZShyb290LCAnV2Vha01hcCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFdlYWtNYXA7XG4iLCIvKipcbiAqIEEgZmFzdGVyIGFsdGVybmF0aXZlIHRvIGBGdW5jdGlvbiNhcHBseWAsIHRoaXMgZnVuY3Rpb24gaW52b2tlcyBgZnVuY2BcbiAqIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIGB0aGlzQXJnYCBhbmQgdGhlIGFyZ3VtZW50cyBvZiBgYXJnc2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGludm9rZS5cbiAqIEBwYXJhbSB7Kn0gdGhpc0FyZyBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBgZnVuY2Agd2l0aC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYGZ1bmNgLlxuICovXG5mdW5jdGlvbiBhcHBseShmdW5jLCB0aGlzQXJnLCBhcmdzKSB7XG4gIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICBjYXNlIDA6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZyk7XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0pO1xuICAgIGNhc2UgMjogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICBjYXNlIDM6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gIH1cbiAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXBwbHk7XG4iLCIvKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5mb3JFYWNoYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAqL1xuZnVuY3Rpb24gYXJyYXlFYWNoKGFycmF5LCBpdGVyYXRlZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgaWYgKGl0ZXJhdGVlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSA9PT0gZmFsc2UpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlFYWNoO1xuIiwiLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uZmlsdGVyYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmlsdGVyZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGFycmF5RmlsdGVyKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCxcbiAgICAgIHJlc0luZGV4ID0gMCxcbiAgICAgIHJlc3VsdCA9IFtdO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4LCBhcnJheSkpIHtcbiAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFycmF5RmlsdGVyO1xuIiwidmFyIGJhc2VJbmRleE9mID0gcmVxdWlyZSgnLi9fYmFzZUluZGV4T2YnKTtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uaW5jbHVkZXNgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICogc3BlY2lmeWluZyBhbiBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0gdGFyZ2V0IFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB0YXJnZXRgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGFycmF5SW5jbHVkZXMoYXJyYXksIHZhbHVlKSB7XG4gIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgcmV0dXJuICEhbGVuZ3RoICYmIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgMCkgPiAtMTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcnJheUluY2x1ZGVzO1xuIiwiLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2UgYGFycmF5SW5jbHVkZXNgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYSBjb21wYXJhdG9yLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSB0YXJnZXQgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb21wYXJhdG9yIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHRhcmdldGAgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYXJyYXlJbmNsdWRlc1dpdGgoYXJyYXksIHZhbHVlLCBjb21wYXJhdG9yKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBpZiAoY29tcGFyYXRvcih2YWx1ZSwgYXJyYXlbaW5kZXhdKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcnJheUluY2x1ZGVzV2l0aDtcbiIsInZhciBiYXNlVGltZXMgPSByZXF1aXJlKCcuL19iYXNlVGltZXMnKSxcbiAgICBpc0FyZ3VtZW50cyA9IHJlcXVpcmUoJy4vaXNBcmd1bWVudHMnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNCdWZmZXIgPSByZXF1aXJlKCcuL2lzQnVmZmVyJyksXG4gICAgaXNJbmRleCA9IHJlcXVpcmUoJy4vX2lzSW5kZXgnKSxcbiAgICBpc1R5cGVkQXJyYXkgPSByZXF1aXJlKCcuL2lzVHlwZWRBcnJheScpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgdGhlIGFycmF5LWxpa2UgYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGluaGVyaXRlZCBTcGVjaWZ5IHJldHVybmluZyBpbmhlcml0ZWQgcHJvcGVydHkgbmFtZXMuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICovXG5mdW5jdGlvbiBhcnJheUxpa2VLZXlzKHZhbHVlLCBpbmhlcml0ZWQpIHtcbiAgdmFyIGlzQXJyID0gaXNBcnJheSh2YWx1ZSksXG4gICAgICBpc0FyZyA9ICFpc0FyciAmJiBpc0FyZ3VtZW50cyh2YWx1ZSksXG4gICAgICBpc0J1ZmYgPSAhaXNBcnIgJiYgIWlzQXJnICYmIGlzQnVmZmVyKHZhbHVlKSxcbiAgICAgIGlzVHlwZSA9ICFpc0FyciAmJiAhaXNBcmcgJiYgIWlzQnVmZiAmJiBpc1R5cGVkQXJyYXkodmFsdWUpLFxuICAgICAgc2tpcEluZGV4ZXMgPSBpc0FyciB8fCBpc0FyZyB8fCBpc0J1ZmYgfHwgaXNUeXBlLFxuICAgICAgcmVzdWx0ID0gc2tpcEluZGV4ZXMgPyBiYXNlVGltZXModmFsdWUubGVuZ3RoLCBTdHJpbmcpIDogW10sXG4gICAgICBsZW5ndGggPSByZXN1bHQubGVuZ3RoO1xuXG4gIGZvciAodmFyIGtleSBpbiB2YWx1ZSkge1xuICAgIGlmICgoaW5oZXJpdGVkIHx8IGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGtleSkpICYmXG4gICAgICAgICEoc2tpcEluZGV4ZXMgJiYgKFxuICAgICAgICAgICAvLyBTYWZhcmkgOSBoYXMgZW51bWVyYWJsZSBgYXJndW1lbnRzLmxlbmd0aGAgaW4gc3RyaWN0IG1vZGUuXG4gICAgICAgICAgIGtleSA9PSAnbGVuZ3RoJyB8fFxuICAgICAgICAgICAvLyBOb2RlLmpzIDAuMTAgaGFzIGVudW1lcmFibGUgbm9uLWluZGV4IHByb3BlcnRpZXMgb24gYnVmZmVycy5cbiAgICAgICAgICAgKGlzQnVmZiAmJiAoa2V5ID09ICdvZmZzZXQnIHx8IGtleSA9PSAncGFyZW50JykpIHx8XG4gICAgICAgICAgIC8vIFBoYW50b21KUyAyIGhhcyBlbnVtZXJhYmxlIG5vbi1pbmRleCBwcm9wZXJ0aWVzIG9uIHR5cGVkIGFycmF5cy5cbiAgICAgICAgICAgKGlzVHlwZSAmJiAoa2V5ID09ICdidWZmZXInIHx8IGtleSA9PSAnYnl0ZUxlbmd0aCcgfHwga2V5ID09ICdieXRlT2Zmc2V0JykpIHx8XG4gICAgICAgICAgIC8vIFNraXAgaW5kZXggcHJvcGVydGllcy5cbiAgICAgICAgICAgaXNJbmRleChrZXksIGxlbmd0aClcbiAgICAgICAgKSkpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlMaWtlS2V5cztcbiIsIi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLm1hcGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlXG4gKiBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBhcnJheU1hcChhcnJheSwgaXRlcmF0ZWUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCxcbiAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICByZXN1bHRbaW5kZXhdID0gaXRlcmF0ZWUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlNYXA7XG4iLCIvKipcbiAqIEFwcGVuZHMgdGhlIGVsZW1lbnRzIG9mIGB2YWx1ZXNgIHRvIGBhcnJheWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byBhcHBlbmQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAqL1xuZnVuY3Rpb24gYXJyYXlQdXNoKGFycmF5LCB2YWx1ZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSB2YWx1ZXMubGVuZ3RoLFxuICAgICAgb2Zmc2V0ID0gYXJyYXkubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgYXJyYXlbb2Zmc2V0ICsgaW5kZXhdID0gdmFsdWVzW2luZGV4XTtcbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlQdXNoO1xuIiwiLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ucmVkdWNlYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGluaXRpYWwgdmFsdWUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpbml0QWNjdW1dIFNwZWNpZnkgdXNpbmcgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYGFycmF5YCBhc1xuICogIHRoZSBpbml0aWFsIHZhbHVlLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICovXG5mdW5jdGlvbiBhcnJheVJlZHVjZShhcnJheSwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0pIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICBpZiAoaW5pdEFjY3VtICYmIGxlbmd0aCkge1xuICAgIGFjY3VtdWxhdG9yID0gYXJyYXlbKytpbmRleF07XG4gIH1cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBhY2N1bXVsYXRvciA9IGl0ZXJhdGVlKGFjY3VtdWxhdG9yLCBhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSk7XG4gIH1cbiAgcmV0dXJuIGFjY3VtdWxhdG9yO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFycmF5UmVkdWNlO1xuIiwiLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uc29tZWAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlXG4gKiBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbnkgZWxlbWVudCBwYXNzZXMgdGhlIHByZWRpY2F0ZSBjaGVjayxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGFycmF5U29tZShhcnJheSwgcHJlZGljYXRlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBpZiAocHJlZGljYXRlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcnJheVNvbWU7XG4iLCJ2YXIgYmFzZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fYmFzZVByb3BlcnR5Jyk7XG5cbi8qKlxuICogR2V0cyB0aGUgc2l6ZSBvZiBhbiBBU0NJSSBgc3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdHJpbmcgc2l6ZS5cbiAqL1xudmFyIGFzY2lpU2l6ZSA9IGJhc2VQcm9wZXJ0eSgnbGVuZ3RoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gYXNjaWlTaXplO1xuIiwidmFyIGJhc2VBc3NpZ25WYWx1ZSA9IHJlcXVpcmUoJy4vX2Jhc2VBc3NpZ25WYWx1ZScpLFxuICAgIGVxID0gcmVxdWlyZSgnLi9lcScpO1xuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgYXNzaWduVmFsdWVgIGV4Y2VwdCB0aGF0IGl0IGRvZXNuJ3QgYXNzaWduXG4gKiBgdW5kZWZpbmVkYCB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAqL1xuZnVuY3Rpb24gYXNzaWduTWVyZ2VWYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgaWYgKCh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmICFlcShvYmplY3Rba2V5XSwgdmFsdWUpKSB8fFxuICAgICAgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkpIHtcbiAgICBiYXNlQXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFzc2lnbk1lcmdlVmFsdWU7XG4iLCJ2YXIgYmFzZUFzc2lnblZhbHVlID0gcmVxdWlyZSgnLi9fYmFzZUFzc2lnblZhbHVlJyksXG4gICAgZXEgPSByZXF1aXJlKCcuL2VxJyk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQXNzaWducyBgdmFsdWVgIHRvIGBrZXlgIG9mIGBvYmplY3RgIGlmIHRoZSBleGlzdGluZyB2YWx1ZSBpcyBub3QgZXF1aXZhbGVudFxuICogdXNpbmcgW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gYXNzaWduLlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYXNzaWduLlxuICovXG5mdW5jdGlvbiBhc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgdmFyIG9ialZhbHVlID0gb2JqZWN0W2tleV07XG4gIGlmICghKGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpICYmIGVxKG9ialZhbHVlLCB2YWx1ZSkpIHx8XG4gICAgICAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhKGtleSBpbiBvYmplY3QpKSkge1xuICAgIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXNzaWduVmFsdWU7XG4iLCJ2YXIgZXEgPSByZXF1aXJlKCcuL2VxJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGBrZXlgIGlzIGZvdW5kIGluIGBhcnJheWAgb2Yga2V5LXZhbHVlIHBhaXJzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0ga2V5IFRoZSBrZXkgdG8gc2VhcmNoIGZvci5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gKi9cbmZ1bmN0aW9uIGFzc29jSW5kZXhPZihhcnJheSwga2V5KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG4gIHdoaWxlIChsZW5ndGgtLSkge1xuICAgIGlmIChlcShhcnJheVtsZW5ndGhdWzBdLCBrZXkpKSB7XG4gICAgICByZXR1cm4gbGVuZ3RoO1xuICAgIH1cbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXNzb2NJbmRleE9mO1xuIiwidmFyIGNvcHlPYmplY3QgPSByZXF1aXJlKCcuL19jb3B5T2JqZWN0JyksXG4gICAga2V5cyA9IHJlcXVpcmUoJy4va2V5cycpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmFzc2lnbmAgd2l0aG91dCBzdXBwb3J0IGZvciBtdWx0aXBsZSBzb3VyY2VzXG4gKiBvciBgY3VzdG9taXplcmAgZnVuY3Rpb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gYmFzZUFzc2lnbihvYmplY3QsIHNvdXJjZSkge1xuICByZXR1cm4gb2JqZWN0ICYmIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzKHNvdXJjZSksIG9iamVjdCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUFzc2lnbjtcbiIsInZhciBjb3B5T2JqZWN0ID0gcmVxdWlyZSgnLi9fY29weU9iamVjdCcpLFxuICAgIGtleXNJbiA9IHJlcXVpcmUoJy4va2V5c0luJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uYXNzaWduSW5gIHdpdGhvdXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc291cmNlc1xuICogb3IgYGN1c3RvbWl6ZXJgIGZ1bmN0aW9ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VBc3NpZ25JbihvYmplY3QsIHNvdXJjZSkge1xuICByZXR1cm4gb2JqZWN0ICYmIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzSW4oc291cmNlKSwgb2JqZWN0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlQXNzaWduSW47XG4iLCJ2YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuL19kZWZpbmVQcm9wZXJ0eScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBhc3NpZ25WYWx1ZWAgYW5kIGBhc3NpZ25NZXJnZVZhbHVlYCB3aXRob3V0XG4gKiB2YWx1ZSBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAqL1xuZnVuY3Rpb24gYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICBpZiAoa2V5ID09ICdfX3Byb3RvX18nICYmIGRlZmluZVByb3BlcnR5KSB7XG4gICAgZGVmaW5lUHJvcGVydHkob2JqZWN0LCBrZXksIHtcbiAgICAgICdjb25maWd1cmFibGUnOiB0cnVlLFxuICAgICAgJ2VudW1lcmFibGUnOiB0cnVlLFxuICAgICAgJ3ZhbHVlJzogdmFsdWUsXG4gICAgICAnd3JpdGFibGUnOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VBc3NpZ25WYWx1ZTtcbiIsInZhciBTdGFjayA9IHJlcXVpcmUoJy4vX1N0YWNrJyksXG4gICAgYXJyYXlFYWNoID0gcmVxdWlyZSgnLi9fYXJyYXlFYWNoJyksXG4gICAgYXNzaWduVmFsdWUgPSByZXF1aXJlKCcuL19hc3NpZ25WYWx1ZScpLFxuICAgIGJhc2VBc3NpZ24gPSByZXF1aXJlKCcuL19iYXNlQXNzaWduJyksXG4gICAgYmFzZUFzc2lnbkluID0gcmVxdWlyZSgnLi9fYmFzZUFzc2lnbkluJyksXG4gICAgY2xvbmVCdWZmZXIgPSByZXF1aXJlKCcuL19jbG9uZUJ1ZmZlcicpLFxuICAgIGNvcHlBcnJheSA9IHJlcXVpcmUoJy4vX2NvcHlBcnJheScpLFxuICAgIGNvcHlTeW1ib2xzID0gcmVxdWlyZSgnLi9fY29weVN5bWJvbHMnKSxcbiAgICBjb3B5U3ltYm9sc0luID0gcmVxdWlyZSgnLi9fY29weVN5bWJvbHNJbicpLFxuICAgIGdldEFsbEtleXMgPSByZXF1aXJlKCcuL19nZXRBbGxLZXlzJyksXG4gICAgZ2V0QWxsS2V5c0luID0gcmVxdWlyZSgnLi9fZ2V0QWxsS2V5c0luJyksXG4gICAgZ2V0VGFnID0gcmVxdWlyZSgnLi9fZ2V0VGFnJyksXG4gICAgaW5pdENsb25lQXJyYXkgPSByZXF1aXJlKCcuL19pbml0Q2xvbmVBcnJheScpLFxuICAgIGluaXRDbG9uZUJ5VGFnID0gcmVxdWlyZSgnLi9faW5pdENsb25lQnlUYWcnKSxcbiAgICBpbml0Q2xvbmVPYmplY3QgPSByZXF1aXJlKCcuL19pbml0Q2xvbmVPYmplY3QnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNCdWZmZXIgPSByZXF1aXJlKCcuL2lzQnVmZmVyJyksXG4gICAgaXNNYXAgPSByZXF1aXJlKCcuL2lzTWFwJyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0JyksXG4gICAgaXNTZXQgPSByZXF1aXJlKCcuL2lzU2V0JyksXG4gICAga2V5cyA9IHJlcXVpcmUoJy4va2V5cycpLFxuICAgIGtleXNJbiA9IHJlcXVpcmUoJy4va2V5c0luJyk7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIGNsb25pbmcuICovXG52YXIgQ0xPTkVfREVFUF9GTEFHID0gMSxcbiAgICBDTE9ORV9GTEFUX0ZMQUcgPSAyLFxuICAgIENMT05FX1NZTUJPTFNfRkxBRyA9IDQ7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBhcmdzVGFnID0gJ1tvYmplY3QgQXJndW1lbnRzXScsXG4gICAgYXJyYXlUYWcgPSAnW29iamVjdCBBcnJheV0nLFxuICAgIGJvb2xUYWcgPSAnW29iamVjdCBCb29sZWFuXScsXG4gICAgZGF0ZVRhZyA9ICdbb2JqZWN0IERhdGVdJyxcbiAgICBlcnJvclRhZyA9ICdbb2JqZWN0IEVycm9yXScsXG4gICAgZnVuY1RhZyA9ICdbb2JqZWN0IEZ1bmN0aW9uXScsXG4gICAgZ2VuVGFnID0gJ1tvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dJyxcbiAgICBtYXBUYWcgPSAnW29iamVjdCBNYXBdJyxcbiAgICBudW1iZXJUYWcgPSAnW29iamVjdCBOdW1iZXJdJyxcbiAgICBvYmplY3RUYWcgPSAnW29iamVjdCBPYmplY3RdJyxcbiAgICByZWdleHBUYWcgPSAnW29iamVjdCBSZWdFeHBdJyxcbiAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJyxcbiAgICBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJyxcbiAgICBzeW1ib2xUYWcgPSAnW29iamVjdCBTeW1ib2xdJyxcbiAgICB3ZWFrTWFwVGFnID0gJ1tvYmplY3QgV2Vha01hcF0nO1xuXG52YXIgYXJyYXlCdWZmZXJUYWcgPSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nLFxuICAgIGRhdGFWaWV3VGFnID0gJ1tvYmplY3QgRGF0YVZpZXddJyxcbiAgICBmbG9hdDMyVGFnID0gJ1tvYmplY3QgRmxvYXQzMkFycmF5XScsXG4gICAgZmxvYXQ2NFRhZyA9ICdbb2JqZWN0IEZsb2F0NjRBcnJheV0nLFxuICAgIGludDhUYWcgPSAnW29iamVjdCBJbnQ4QXJyYXldJyxcbiAgICBpbnQxNlRhZyA9ICdbb2JqZWN0IEludDE2QXJyYXldJyxcbiAgICBpbnQzMlRhZyA9ICdbb2JqZWN0IEludDMyQXJyYXldJyxcbiAgICB1aW50OFRhZyA9ICdbb2JqZWN0IFVpbnQ4QXJyYXldJyxcbiAgICB1aW50OENsYW1wZWRUYWcgPSAnW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0nLFxuICAgIHVpbnQxNlRhZyA9ICdbb2JqZWN0IFVpbnQxNkFycmF5XScsXG4gICAgdWludDMyVGFnID0gJ1tvYmplY3QgVWludDMyQXJyYXldJztcblxuLyoqIFVzZWQgdG8gaWRlbnRpZnkgYHRvU3RyaW5nVGFnYCB2YWx1ZXMgc3VwcG9ydGVkIGJ5IGBfLmNsb25lYC4gKi9cbnZhciBjbG9uZWFibGVUYWdzID0ge307XG5jbG9uZWFibGVUYWdzW2FyZ3NUYWddID0gY2xvbmVhYmxlVGFnc1thcnJheVRhZ10gPVxuY2xvbmVhYmxlVGFnc1thcnJheUJ1ZmZlclRhZ10gPSBjbG9uZWFibGVUYWdzW2RhdGFWaWV3VGFnXSA9XG5jbG9uZWFibGVUYWdzW2Jvb2xUYWddID0gY2xvbmVhYmxlVGFnc1tkYXRlVGFnXSA9XG5jbG9uZWFibGVUYWdzW2Zsb2F0MzJUYWddID0gY2xvbmVhYmxlVGFnc1tmbG9hdDY0VGFnXSA9XG5jbG9uZWFibGVUYWdzW2ludDhUYWddID0gY2xvbmVhYmxlVGFnc1tpbnQxNlRhZ10gPVxuY2xvbmVhYmxlVGFnc1tpbnQzMlRhZ10gPSBjbG9uZWFibGVUYWdzW21hcFRhZ10gPVxuY2xvbmVhYmxlVGFnc1tudW1iZXJUYWddID0gY2xvbmVhYmxlVGFnc1tvYmplY3RUYWddID1cbmNsb25lYWJsZVRhZ3NbcmVnZXhwVGFnXSA9IGNsb25lYWJsZVRhZ3Nbc2V0VGFnXSA9XG5jbG9uZWFibGVUYWdzW3N0cmluZ1RhZ10gPSBjbG9uZWFibGVUYWdzW3N5bWJvbFRhZ10gPVxuY2xvbmVhYmxlVGFnc1t1aW50OFRhZ10gPSBjbG9uZWFibGVUYWdzW3VpbnQ4Q2xhbXBlZFRhZ10gPVxuY2xvbmVhYmxlVGFnc1t1aW50MTZUYWddID0gY2xvbmVhYmxlVGFnc1t1aW50MzJUYWddID0gdHJ1ZTtcbmNsb25lYWJsZVRhZ3NbZXJyb3JUYWddID0gY2xvbmVhYmxlVGFnc1tmdW5jVGFnXSA9XG5jbG9uZWFibGVUYWdzW3dlYWtNYXBUYWddID0gZmFsc2U7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY2xvbmVgIGFuZCBgXy5jbG9uZURlZXBgIHdoaWNoIHRyYWNrc1xuICogdHJhdmVyc2VkIG9iamVjdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNsb25lLlxuICogQHBhcmFtIHtib29sZWFufSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLlxuICogIDEgLSBEZWVwIGNsb25lXG4gKiAgMiAtIEZsYXR0ZW4gaW5oZXJpdGVkIHByb3BlcnRpZXNcbiAqICA0IC0gQ2xvbmUgc3ltYm9sc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY2xvbmluZy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBba2V5XSBUaGUga2V5IG9mIGB2YWx1ZWAuXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIHBhcmVudCBvYmplY3Qgb2YgYHZhbHVlYC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cyBhbmQgdGhlaXIgY2xvbmUgY291bnRlcnBhcnRzLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGNsb25lZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYmFzZUNsb25lKHZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBrZXksIG9iamVjdCwgc3RhY2spIHtcbiAgdmFyIHJlc3VsdCxcbiAgICAgIGlzRGVlcCA9IGJpdG1hc2sgJiBDTE9ORV9ERUVQX0ZMQUcsXG4gICAgICBpc0ZsYXQgPSBiaXRtYXNrICYgQ0xPTkVfRkxBVF9GTEFHLFxuICAgICAgaXNGdWxsID0gYml0bWFzayAmIENMT05FX1NZTUJPTFNfRkxBRztcblxuICBpZiAoY3VzdG9taXplcikge1xuICAgIHJlc3VsdCA9IG9iamVjdCA/IGN1c3RvbWl6ZXIodmFsdWUsIGtleSwgb2JqZWN0LCBzdGFjaykgOiBjdXN0b21pemVyKHZhbHVlKTtcbiAgfVxuICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHZhciBpc0FyciA9IGlzQXJyYXkodmFsdWUpO1xuICBpZiAoaXNBcnIpIHtcbiAgICByZXN1bHQgPSBpbml0Q2xvbmVBcnJheSh2YWx1ZSk7XG4gICAgaWYgKCFpc0RlZXApIHtcbiAgICAgIHJldHVybiBjb3B5QXJyYXkodmFsdWUsIHJlc3VsdCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciB0YWcgPSBnZXRUYWcodmFsdWUpLFxuICAgICAgICBpc0Z1bmMgPSB0YWcgPT0gZnVuY1RhZyB8fCB0YWcgPT0gZ2VuVGFnO1xuXG4gICAgaWYgKGlzQnVmZmVyKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGNsb25lQnVmZmVyKHZhbHVlLCBpc0RlZXApO1xuICAgIH1cbiAgICBpZiAodGFnID09IG9iamVjdFRhZyB8fCB0YWcgPT0gYXJnc1RhZyB8fCAoaXNGdW5jICYmICFvYmplY3QpKSB7XG4gICAgICByZXN1bHQgPSAoaXNGbGF0IHx8IGlzRnVuYykgPyB7fSA6IGluaXRDbG9uZU9iamVjdCh2YWx1ZSk7XG4gICAgICBpZiAoIWlzRGVlcCkge1xuICAgICAgICByZXR1cm4gaXNGbGF0XG4gICAgICAgICAgPyBjb3B5U3ltYm9sc0luKHZhbHVlLCBiYXNlQXNzaWduSW4ocmVzdWx0LCB2YWx1ZSkpXG4gICAgICAgICAgOiBjb3B5U3ltYm9scyh2YWx1ZSwgYmFzZUFzc2lnbihyZXN1bHQsIHZhbHVlKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghY2xvbmVhYmxlVGFnc1t0YWddKSB7XG4gICAgICAgIHJldHVybiBvYmplY3QgPyB2YWx1ZSA6IHt9O1xuICAgICAgfVxuICAgICAgcmVzdWx0ID0gaW5pdENsb25lQnlUYWcodmFsdWUsIHRhZywgaXNEZWVwKTtcbiAgICB9XG4gIH1cbiAgLy8gQ2hlY2sgZm9yIGNpcmN1bGFyIHJlZmVyZW5jZXMgYW5kIHJldHVybiBpdHMgY29ycmVzcG9uZGluZyBjbG9uZS5cbiAgc3RhY2sgfHwgKHN0YWNrID0gbmV3IFN0YWNrKTtcbiAgdmFyIHN0YWNrZWQgPSBzdGFjay5nZXQodmFsdWUpO1xuICBpZiAoc3RhY2tlZCkge1xuICAgIHJldHVybiBzdGFja2VkO1xuICB9XG4gIHN0YWNrLnNldCh2YWx1ZSwgcmVzdWx0KTtcblxuICBpZiAoaXNTZXQodmFsdWUpKSB7XG4gICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbihzdWJWYWx1ZSkge1xuICAgICAgcmVzdWx0LmFkZChiYXNlQ2xvbmUoc3ViVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN1YlZhbHVlLCB2YWx1ZSwgc3RhY2spKTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChpc01hcCh2YWx1ZSkpIHtcbiAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHN1YlZhbHVlLCBrZXkpIHtcbiAgICAgIHJlc3VsdC5zZXQoa2V5LCBiYXNlQ2xvbmUoc3ViVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGtleSwgdmFsdWUsIHN0YWNrKSk7XG4gICAgfSk7XG4gIH1cblxuICB2YXIga2V5c0Z1bmMgPSBpc0Z1bGxcbiAgICA/IChpc0ZsYXQgPyBnZXRBbGxLZXlzSW4gOiBnZXRBbGxLZXlzKVxuICAgIDogKGlzRmxhdCA/IGtleXNJbiA6IGtleXMpO1xuXG4gIHZhciBwcm9wcyA9IGlzQXJyID8gdW5kZWZpbmVkIDoga2V5c0Z1bmModmFsdWUpO1xuICBhcnJheUVhY2gocHJvcHMgfHwgdmFsdWUsIGZ1bmN0aW9uKHN1YlZhbHVlLCBrZXkpIHtcbiAgICBpZiAocHJvcHMpIHtcbiAgICAgIGtleSA9IHN1YlZhbHVlO1xuICAgICAgc3ViVmFsdWUgPSB2YWx1ZVtrZXldO1xuICAgIH1cbiAgICAvLyBSZWN1cnNpdmVseSBwb3B1bGF0ZSBjbG9uZSAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgIGFzc2lnblZhbHVlKHJlc3VsdCwga2V5LCBiYXNlQ2xvbmUoc3ViVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGtleSwgdmFsdWUsIHN0YWNrKSk7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VDbG9uZTtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0Q3JlYXRlID0gT2JqZWN0LmNyZWF0ZTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jcmVhdGVgIHdpdGhvdXQgc3VwcG9ydCBmb3IgYXNzaWduaW5nXG4gKiBwcm9wZXJ0aWVzIHRvIHRoZSBjcmVhdGVkIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHByb3RvIFRoZSBvYmplY3QgdG8gaW5oZXJpdCBmcm9tLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAqL1xudmFyIGJhc2VDcmVhdGUgPSAoZnVuY3Rpb24oKSB7XG4gIGZ1bmN0aW9uIG9iamVjdCgpIHt9XG4gIHJldHVybiBmdW5jdGlvbihwcm90bykge1xuICAgIGlmICghaXNPYmplY3QocHJvdG8pKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGlmIChvYmplY3RDcmVhdGUpIHtcbiAgICAgIHJldHVybiBvYmplY3RDcmVhdGUocHJvdG8pO1xuICAgIH1cbiAgICBvYmplY3QucHJvdG90eXBlID0gcHJvdG87XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBvYmplY3Q7XG4gICAgb2JqZWN0LnByb3RvdHlwZSA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufSgpKTtcblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlQ3JlYXRlO1xuIiwidmFyIGJhc2VGb3JPd24gPSByZXF1aXJlKCcuL19iYXNlRm9yT3duJyksXG4gICAgY3JlYXRlQmFzZUVhY2ggPSByZXF1aXJlKCcuL19jcmVhdGVCYXNlRWFjaCcpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZvckVhY2hgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheXxPYmplY3R9IFJldHVybnMgYGNvbGxlY3Rpb25gLlxuICovXG52YXIgYmFzZUVhY2ggPSBjcmVhdGVCYXNlRWFjaChiYXNlRm9yT3duKTtcblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlRWFjaDtcbiIsInZhciBpc1N5bWJvbCA9IHJlcXVpcmUoJy4vaXNTeW1ib2wnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2RzIGxpa2UgYF8ubWF4YCBhbmQgYF8ubWluYCB3aGljaCBhY2NlcHRzIGFcbiAqIGBjb21wYXJhdG9yYCB0byBkZXRlcm1pbmUgdGhlIGV4dHJlbXVtIHZhbHVlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBhcmF0b3IgVGhlIGNvbXBhcmF0b3IgdXNlZCB0byBjb21wYXJlIHZhbHVlcy5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBleHRyZW11bSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYmFzZUV4dHJlbXVtKGFycmF5LCBpdGVyYXRlZSwgY29tcGFyYXRvcikge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgY3VycmVudCA9IGl0ZXJhdGVlKHZhbHVlKTtcblxuICAgIGlmIChjdXJyZW50ICE9IG51bGwgJiYgKGNvbXB1dGVkID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IChjdXJyZW50ID09PSBjdXJyZW50ICYmICFpc1N5bWJvbChjdXJyZW50KSlcbiAgICAgICAgICA6IGNvbXBhcmF0b3IoY3VycmVudCwgY29tcHV0ZWQpXG4gICAgICAgICkpIHtcbiAgICAgIHZhciBjb21wdXRlZCA9IGN1cnJlbnQsXG4gICAgICAgICAgcmVzdWx0ID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUV4dHJlbXVtO1xuIiwidmFyIGJhc2VFYWNoID0gcmVxdWlyZSgnLi9fYmFzZUVhY2gnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5maWx0ZXJgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmaWx0ZXJlZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYmFzZUZpbHRlcihjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBiYXNlRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VGaWx0ZXI7XG4iLCIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZpbmRJbmRleGAgYW5kIGBfLmZpbmRMYXN0SW5kZXhgIHdpdGhvdXRcbiAqIHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUZpbmRJbmRleChhcnJheSwgcHJlZGljYXRlLCBmcm9tSW5kZXgsIGZyb21SaWdodCkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgaW5kZXggPSBmcm9tSW5kZXggKyAoZnJvbVJpZ2h0ID8gMSA6IC0xKTtcblxuICB3aGlsZSAoKGZyb21SaWdodCA/IGluZGV4LS0gOiArK2luZGV4IDwgbGVuZ3RoKSkge1xuICAgIGlmIChwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlRmluZEluZGV4O1xuIiwidmFyIGFycmF5UHVzaCA9IHJlcXVpcmUoJy4vX2FycmF5UHVzaCcpLFxuICAgIGlzRmxhdHRlbmFibGUgPSByZXF1aXJlKCcuL19pc0ZsYXR0ZW5hYmxlJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZmxhdHRlbmAgd2l0aCBzdXBwb3J0IGZvciByZXN0cmljdGluZyBmbGF0dGVuaW5nLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmxhdHRlbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBkZXB0aCBUaGUgbWF4aW11bSByZWN1cnNpb24gZGVwdGguXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwcmVkaWNhdGU9aXNGbGF0dGVuYWJsZV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzU3RyaWN0XSBSZXN0cmljdCB0byB2YWx1ZXMgdGhhdCBwYXNzIGBwcmVkaWNhdGVgIGNoZWNrcy5cbiAqIEBwYXJhbSB7QXJyYXl9IFtyZXN1bHQ9W11dIFRoZSBpbml0aWFsIHJlc3VsdCB2YWx1ZS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYmFzZUZsYXR0ZW4oYXJyYXksIGRlcHRoLCBwcmVkaWNhdGUsIGlzU3RyaWN0LCByZXN1bHQpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgcHJlZGljYXRlIHx8IChwcmVkaWNhdGUgPSBpc0ZsYXR0ZW5hYmxlKTtcbiAgcmVzdWx0IHx8IChyZXN1bHQgPSBbXSk7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgaWYgKGRlcHRoID4gMCAmJiBwcmVkaWNhdGUodmFsdWUpKSB7XG4gICAgICBpZiAoZGVwdGggPiAxKSB7XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGZsYXR0ZW4gYXJyYXlzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAgIGJhc2VGbGF0dGVuKHZhbHVlLCBkZXB0aCAtIDEsIHByZWRpY2F0ZSwgaXNTdHJpY3QsIHJlc3VsdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhcnJheVB1c2gocmVzdWx0LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghaXNTdHJpY3QpIHtcbiAgICAgIHJlc3VsdFtyZXN1bHQubGVuZ3RoXSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VGbGF0dGVuO1xuIiwidmFyIGNyZWF0ZUJhc2VGb3IgPSByZXF1aXJlKCcuL19jcmVhdGVCYXNlRm9yJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGJhc2VGb3JPd25gIHdoaWNoIGl0ZXJhdGVzIG92ZXIgYG9iamVjdGBcbiAqIHByb3BlcnRpZXMgcmV0dXJuZWQgYnkgYGtleXNGdW5jYCBhbmQgaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBlYWNoIHByb3BlcnR5LlxuICogSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0IGl0ZXJhdGlvbiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGtleXNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIGtleXMgb2YgYG9iamVjdGAuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICovXG52YXIgYmFzZUZvciA9IGNyZWF0ZUJhc2VGb3IoKTtcblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlRm9yO1xuIiwidmFyIGJhc2VGb3IgPSByZXF1aXJlKCcuL19iYXNlRm9yJyksXG4gICAga2V5cyA9IHJlcXVpcmUoJy4va2V5cycpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZvck93bmAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VGb3JPd24ob2JqZWN0LCBpdGVyYXRlZSkge1xuICByZXR1cm4gb2JqZWN0ICYmIGJhc2VGb3Iob2JqZWN0LCBpdGVyYXRlZSwga2V5cyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUZvck93bjtcbiIsInZhciBjYXN0UGF0aCA9IHJlcXVpcmUoJy4vX2Nhc3RQYXRoJyksXG4gICAgdG9LZXkgPSByZXF1aXJlKCcuL190b0tleScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmdldGAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWZhdWx0IHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYmFzZUdldChvYmplY3QsIHBhdGgpIHtcbiAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG5cbiAgdmFyIGluZGV4ID0gMCxcbiAgICAgIGxlbmd0aCA9IHBhdGgubGVuZ3RoO1xuXG4gIHdoaWxlIChvYmplY3QgIT0gbnVsbCAmJiBpbmRleCA8IGxlbmd0aCkge1xuICAgIG9iamVjdCA9IG9iamVjdFt0b0tleShwYXRoW2luZGV4KytdKV07XG4gIH1cbiAgcmV0dXJuIChpbmRleCAmJiBpbmRleCA9PSBsZW5ndGgpID8gb2JqZWN0IDogdW5kZWZpbmVkO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VHZXQ7XG4iLCJ2YXIgYXJyYXlQdXNoID0gcmVxdWlyZSgnLi9fYXJyYXlQdXNoJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBnZXRBbGxLZXlzYCBhbmQgYGdldEFsbEtleXNJbmAgd2hpY2ggdXNlc1xuICogYGtleXNGdW5jYCBhbmQgYHN5bWJvbHNGdW5jYCB0byBnZXQgdGhlIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgYW5kXG4gKiBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBrZXlzIG9mIGBvYmplY3RgLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gc3ltYm9sc0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUgc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VHZXRBbGxLZXlzKG9iamVjdCwga2V5c0Z1bmMsIHN5bWJvbHNGdW5jKSB7XG4gIHZhciByZXN1bHQgPSBrZXlzRnVuYyhvYmplY3QpO1xuICByZXR1cm4gaXNBcnJheShvYmplY3QpID8gcmVzdWx0IDogYXJyYXlQdXNoKHJlc3VsdCwgc3ltYm9sc0Z1bmMob2JqZWN0KSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUdldEFsbEtleXM7XG4iLCJ2YXIgU3ltYm9sID0gcmVxdWlyZSgnLi9fU3ltYm9sJyksXG4gICAgZ2V0UmF3VGFnID0gcmVxdWlyZSgnLi9fZ2V0UmF3VGFnJyksXG4gICAgb2JqZWN0VG9TdHJpbmcgPSByZXF1aXJlKCcuL19vYmplY3RUb1N0cmluZycpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgbnVsbFRhZyA9ICdbb2JqZWN0IE51bGxdJyxcbiAgICB1bmRlZmluZWRUYWcgPSAnW29iamVjdCBVbmRlZmluZWRdJztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgc3ltVG9TdHJpbmdUYWcgPSBTeW1ib2wgPyBTeW1ib2wudG9TdHJpbmdUYWcgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGdldFRhZ2Agd2l0aG91dCBmYWxsYmFja3MgZm9yIGJ1Z2d5IGVudmlyb25tZW50cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBgdG9TdHJpbmdUYWdgLlxuICovXG5mdW5jdGlvbiBiYXNlR2V0VGFnKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWRUYWcgOiBudWxsVGFnO1xuICB9XG4gIHJldHVybiAoc3ltVG9TdHJpbmdUYWcgJiYgc3ltVG9TdHJpbmdUYWcgaW4gT2JqZWN0KHZhbHVlKSlcbiAgICA/IGdldFJhd1RhZyh2YWx1ZSlcbiAgICA6IG9iamVjdFRvU3RyaW5nKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlR2V0VGFnO1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5ndGAgd2hpY2ggZG9lc24ndCBjb2VyY2UgYXJndW1lbnRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGdyZWF0ZXIgdGhhbiBgb3RoZXJgLFxuICogIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUd0KHZhbHVlLCBvdGhlcikge1xuICByZXR1cm4gdmFsdWUgPiBvdGhlcjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlR3Q7XG4iLCIvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmhhc2Agd2l0aG91dCBzdXBwb3J0IGZvciBkZWVwIHBhdGhzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBrZXkgVGhlIGtleSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUhhcyhvYmplY3QsIGtleSkge1xuICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYgaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUhhcztcbiIsIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaGFzSW5gIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30ga2V5IFRoZSBrZXkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VIYXNJbihvYmplY3QsIGtleSkge1xuICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYga2V5IGluIE9iamVjdChvYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VIYXNJbjtcbiIsInZhciBiYXNlRmluZEluZGV4ID0gcmVxdWlyZSgnLi9fYmFzZUZpbmRJbmRleCcpLFxuICAgIGJhc2VJc05hTiA9IHJlcXVpcmUoJy4vX2Jhc2VJc05hTicpLFxuICAgIHN0cmljdEluZGV4T2YgPSByZXF1aXJlKCcuL19zdHJpY3RJbmRleE9mJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaW5kZXhPZmAgd2l0aG91dCBgZnJvbUluZGV4YCBib3VuZHMgY2hlY2tzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gdmFsdWVcbiAgICA/IHN0cmljdEluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpXG4gICAgOiBiYXNlRmluZEluZGV4KGFycmF5LCBiYXNlSXNOYU4sIGZyb21JbmRleCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUluZGV4T2Y7XG4iLCJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYXJnc1RhZyA9ICdbb2JqZWN0IEFyZ3VtZW50c10nO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzQXJndW1lbnRzYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBgYXJndW1lbnRzYCBvYmplY3QsXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc0FyZ3VtZW50cyh2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBhcmdzVGFnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJc0FyZ3VtZW50cztcbiIsInZhciBiYXNlSXNFcXVhbERlZXAgPSByZXF1aXJlKCcuL19iYXNlSXNFcXVhbERlZXAnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzRXF1YWxgIHdoaWNoIHN1cHBvcnRzIHBhcnRpYWwgY29tcGFyaXNvbnNcbiAqIGFuZCB0cmFja3MgdHJhdmVyc2VkIG9iamVjdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHtib29sZWFufSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLlxuICogIDEgLSBVbm9yZGVyZWQgY29tcGFyaXNvblxuICogIDIgLSBQYXJ0aWFsIGNvbXBhcmlzb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBgdmFsdWVgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNFcXVhbCh2YWx1ZSwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKSB7XG4gIGlmICh2YWx1ZSA9PT0gb3RoZXIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAodmFsdWUgPT0gbnVsbCB8fCBvdGhlciA9PSBudWxsIHx8ICghaXNPYmplY3RMaWtlKHZhbHVlKSAmJiAhaXNPYmplY3RMaWtlKG90aGVyKSkpIHtcbiAgICByZXR1cm4gdmFsdWUgIT09IHZhbHVlICYmIG90aGVyICE9PSBvdGhlcjtcbiAgfVxuICByZXR1cm4gYmFzZUlzRXF1YWxEZWVwKHZhbHVlLCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgYmFzZUlzRXF1YWwsIHN0YWNrKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNFcXVhbDtcbiIsInZhciBTdGFjayA9IHJlcXVpcmUoJy4vX1N0YWNrJyksXG4gICAgZXF1YWxBcnJheXMgPSByZXF1aXJlKCcuL19lcXVhbEFycmF5cycpLFxuICAgIGVxdWFsQnlUYWcgPSByZXF1aXJlKCcuL19lcXVhbEJ5VGFnJyksXG4gICAgZXF1YWxPYmplY3RzID0gcmVxdWlyZSgnLi9fZXF1YWxPYmplY3RzJyksXG4gICAgZ2V0VGFnID0gcmVxdWlyZSgnLi9fZ2V0VGFnJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIGlzQnVmZmVyID0gcmVxdWlyZSgnLi9pc0J1ZmZlcicpLFxuICAgIGlzVHlwZWRBcnJheSA9IHJlcXVpcmUoJy4vaXNUeXBlZEFycmF5Jyk7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIHZhbHVlIGNvbXBhcmlzb25zLiAqL1xudmFyIENPTVBBUkVfUEFSVElBTF9GTEFHID0gMTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJyxcbiAgICBhcnJheVRhZyA9ICdbb2JqZWN0IEFycmF5XScsXG4gICAgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XSc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbGAgZm9yIGFycmF5cyBhbmQgb2JqZWN0cyB3aGljaCBwZXJmb3Jtc1xuICogZGVlcCBjb21wYXJpc29ucyBhbmQgdHJhY2tzIHRyYXZlcnNlZCBvYmplY3RzIGVuYWJsaW5nIG9iamVjdHMgd2l0aCBjaXJjdWxhclxuICogcmVmZXJlbmNlcyB0byBiZSBjb21wYXJlZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIGBvYmplY3RgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9iamVjdHMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzRXF1YWxEZWVwKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgdmFyIG9iaklzQXJyID0gaXNBcnJheShvYmplY3QpLFxuICAgICAgb3RoSXNBcnIgPSBpc0FycmF5KG90aGVyKSxcbiAgICAgIG9ialRhZyA9IG9iaklzQXJyID8gYXJyYXlUYWcgOiBnZXRUYWcob2JqZWN0KSxcbiAgICAgIG90aFRhZyA9IG90aElzQXJyID8gYXJyYXlUYWcgOiBnZXRUYWcob3RoZXIpO1xuXG4gIG9ialRhZyA9IG9ialRhZyA9PSBhcmdzVGFnID8gb2JqZWN0VGFnIDogb2JqVGFnO1xuICBvdGhUYWcgPSBvdGhUYWcgPT0gYXJnc1RhZyA/IG9iamVjdFRhZyA6IG90aFRhZztcblxuICB2YXIgb2JqSXNPYmogPSBvYmpUYWcgPT0gb2JqZWN0VGFnLFxuICAgICAgb3RoSXNPYmogPSBvdGhUYWcgPT0gb2JqZWN0VGFnLFxuICAgICAgaXNTYW1lVGFnID0gb2JqVGFnID09IG90aFRhZztcblxuICBpZiAoaXNTYW1lVGFnICYmIGlzQnVmZmVyKG9iamVjdCkpIHtcbiAgICBpZiAoIWlzQnVmZmVyKG90aGVyKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBvYmpJc0FyciA9IHRydWU7XG4gICAgb2JqSXNPYmogPSBmYWxzZTtcbiAgfVxuICBpZiAoaXNTYW1lVGFnICYmICFvYmpJc09iaikge1xuICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgcmV0dXJuIChvYmpJc0FyciB8fCBpc1R5cGVkQXJyYXkob2JqZWN0KSlcbiAgICAgID8gZXF1YWxBcnJheXMob2JqZWN0LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaylcbiAgICAgIDogZXF1YWxCeVRhZyhvYmplY3QsIG90aGVyLCBvYmpUYWcsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spO1xuICB9XG4gIGlmICghKGJpdG1hc2sgJiBDT01QQVJFX1BBUlRJQUxfRkxBRykpIHtcbiAgICB2YXIgb2JqSXNXcmFwcGVkID0gb2JqSXNPYmogJiYgaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsICdfX3dyYXBwZWRfXycpLFxuICAgICAgICBvdGhJc1dyYXBwZWQgPSBvdGhJc09iaiAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG90aGVyLCAnX193cmFwcGVkX18nKTtcblxuICAgIGlmIChvYmpJc1dyYXBwZWQgfHwgb3RoSXNXcmFwcGVkKSB7XG4gICAgICB2YXIgb2JqVW53cmFwcGVkID0gb2JqSXNXcmFwcGVkID8gb2JqZWN0LnZhbHVlKCkgOiBvYmplY3QsXG4gICAgICAgICAgb3RoVW53cmFwcGVkID0gb3RoSXNXcmFwcGVkID8gb3RoZXIudmFsdWUoKSA6IG90aGVyO1xuXG4gICAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICAgICAgcmV0dXJuIGVxdWFsRnVuYyhvYmpVbndyYXBwZWQsIG90aFVud3JhcHBlZCwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spO1xuICAgIH1cbiAgfVxuICBpZiAoIWlzU2FtZVRhZykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICByZXR1cm4gZXF1YWxPYmplY3RzKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJc0VxdWFsRGVlcDtcbiIsInZhciBnZXRUYWcgPSByZXF1aXJlKCcuL19nZXRUYWcnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgbWFwVGFnID0gJ1tvYmplY3QgTWFwXSc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNNYXBgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbWFwLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc01hcCh2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBnZXRUYWcodmFsdWUpID09IG1hcFRhZztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNNYXA7XG4iLCJ2YXIgU3RhY2sgPSByZXF1aXJlKCcuL19TdGFjaycpLFxuICAgIGJhc2VJc0VxdWFsID0gcmVxdWlyZSgnLi9fYmFzZUlzRXF1YWwnKTtcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgdmFsdWUgY29tcGFyaXNvbnMuICovXG52YXIgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgPSAxLFxuICAgIENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcgPSAyO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTWF0Y2hgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICogQHBhcmFtIHtBcnJheX0gbWF0Y2hEYXRhIFRoZSBwcm9wZXJ0eSBuYW1lcywgdmFsdWVzLCBhbmQgY29tcGFyZSBmbGFncyB0byBtYXRjaC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBvYmplY3RgIGlzIGEgbWF0Y2gsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzTWF0Y2gob2JqZWN0LCBzb3VyY2UsIG1hdGNoRGF0YSwgY3VzdG9taXplcikge1xuICB2YXIgaW5kZXggPSBtYXRjaERhdGEubGVuZ3RoLFxuICAgICAgbGVuZ3RoID0gaW5kZXgsXG4gICAgICBub0N1c3RvbWl6ZXIgPSAhY3VzdG9taXplcjtcblxuICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICByZXR1cm4gIWxlbmd0aDtcbiAgfVxuICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcbiAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICB2YXIgZGF0YSA9IG1hdGNoRGF0YVtpbmRleF07XG4gICAgaWYgKChub0N1c3RvbWl6ZXIgJiYgZGF0YVsyXSlcbiAgICAgICAgICA/IGRhdGFbMV0gIT09IG9iamVjdFtkYXRhWzBdXVxuICAgICAgICAgIDogIShkYXRhWzBdIGluIG9iamVjdClcbiAgICAgICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgZGF0YSA9IG1hdGNoRGF0YVtpbmRleF07XG4gICAgdmFyIGtleSA9IGRhdGFbMF0sXG4gICAgICAgIG9ialZhbHVlID0gb2JqZWN0W2tleV0sXG4gICAgICAgIHNyY1ZhbHVlID0gZGF0YVsxXTtcblxuICAgIGlmIChub0N1c3RvbWl6ZXIgJiYgZGF0YVsyXSkge1xuICAgICAgaWYgKG9ialZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBzdGFjayA9IG5ldyBTdGFjaztcbiAgICAgIGlmIChjdXN0b21pemVyKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QsIHNvdXJjZSwgc3RhY2spO1xuICAgICAgfVxuICAgICAgaWYgKCEocmVzdWx0ID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gYmFzZUlzRXF1YWwoc3JjVmFsdWUsIG9ialZhbHVlLCBDT01QQVJFX1BBUlRJQUxfRkxBRyB8IENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcsIGN1c3RvbWl6ZXIsIHN0YWNrKVxuICAgICAgICAgICAgOiByZXN1bHRcbiAgICAgICAgICApKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUlzTWF0Y2g7XG4iLCIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTmFOYCB3aXRob3V0IHN1cHBvcnQgZm9yIG51bWJlciBvYmplY3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGBOYU5gLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc05hTih2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT09IHZhbHVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJc05hTjtcbiIsInZhciBpc0Z1bmN0aW9uID0gcmVxdWlyZSgnLi9pc0Z1bmN0aW9uJyksXG4gICAgaXNNYXNrZWQgPSByZXF1aXJlKCcuL19pc01hc2tlZCcpLFxuICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpLFxuICAgIHRvU291cmNlID0gcmVxdWlyZSgnLi9fdG9Tb3VyY2UnKTtcblxuLyoqXG4gKiBVc2VkIHRvIG1hdGNoIGBSZWdFeHBgXG4gKiBbc3ludGF4IGNoYXJhY3RlcnNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXBhdHRlcm5zKS5cbiAqL1xudmFyIHJlUmVnRXhwQ2hhciA9IC9bXFxcXF4kLiorPygpW1xcXXt9fF0vZztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGhvc3QgY29uc3RydWN0b3JzIChTYWZhcmkpLiAqL1xudmFyIHJlSXNIb3N0Q3RvciA9IC9eXFxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXFxdJC87XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBmdW5jUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGUsXG4gICAgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG52YXIgZnVuY1RvU3RyaW5nID0gZnVuY1Byb3RvLnRvU3RyaW5nO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKiogVXNlZCB0byBkZXRlY3QgaWYgYSBtZXRob2QgaXMgbmF0aXZlLiAqL1xudmFyIHJlSXNOYXRpdmUgPSBSZWdFeHAoJ14nICtcbiAgZnVuY1RvU3RyaW5nLmNhbGwoaGFzT3duUHJvcGVydHkpLnJlcGxhY2UocmVSZWdFeHBDaGFyLCAnXFxcXCQmJylcbiAgLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFxcXFwoKXwgZm9yIC4rPyg/PVxcXFxcXF0pL2csICckMS4qPycpICsgJyQnXG4pO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTmF0aXZlYCB3aXRob3V0IGJhZCBzaGltIGNoZWNrcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG5hdGl2ZSBmdW5jdGlvbixcbiAqICBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc05hdGl2ZSh2YWx1ZSkge1xuICBpZiAoIWlzT2JqZWN0KHZhbHVlKSB8fCBpc01hc2tlZCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHBhdHRlcm4gPSBpc0Z1bmN0aW9uKHZhbHVlKSA/IHJlSXNOYXRpdmUgOiByZUlzSG9zdEN0b3I7XG4gIHJldHVybiBwYXR0ZXJuLnRlc3QodG9Tb3VyY2UodmFsdWUpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNOYXRpdmU7XG4iLCJ2YXIgZ2V0VGFnID0gcmVxdWlyZSgnLi9fZ2V0VGFnJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIHNldFRhZyA9ICdbb2JqZWN0IFNldF0nO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzU2V0YCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHNldCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNTZXQodmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgZ2V0VGFnKHZhbHVlKSA9PSBzZXRUYWc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUlzU2V0O1xuIiwidmFyIGJhc2VHZXRUYWcgPSByZXF1aXJlKCcuL19iYXNlR2V0VGFnJyksXG4gICAgaXNMZW5ndGggPSByZXF1aXJlKCcuL2lzTGVuZ3RoJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJyxcbiAgICBhcnJheVRhZyA9ICdbb2JqZWN0IEFycmF5XScsXG4gICAgYm9vbFRhZyA9ICdbb2JqZWN0IEJvb2xlYW5dJyxcbiAgICBkYXRlVGFnID0gJ1tvYmplY3QgRGF0ZV0nLFxuICAgIGVycm9yVGFnID0gJ1tvYmplY3QgRXJyb3JdJyxcbiAgICBmdW5jVGFnID0gJ1tvYmplY3QgRnVuY3Rpb25dJyxcbiAgICBtYXBUYWcgPSAnW29iamVjdCBNYXBdJyxcbiAgICBudW1iZXJUYWcgPSAnW29iamVjdCBOdW1iZXJdJyxcbiAgICBvYmplY3RUYWcgPSAnW29iamVjdCBPYmplY3RdJyxcbiAgICByZWdleHBUYWcgPSAnW29iamVjdCBSZWdFeHBdJyxcbiAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJyxcbiAgICBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJyxcbiAgICB3ZWFrTWFwVGFnID0gJ1tvYmplY3QgV2Vha01hcF0nO1xuXG52YXIgYXJyYXlCdWZmZXJUYWcgPSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nLFxuICAgIGRhdGFWaWV3VGFnID0gJ1tvYmplY3QgRGF0YVZpZXddJyxcbiAgICBmbG9hdDMyVGFnID0gJ1tvYmplY3QgRmxvYXQzMkFycmF5XScsXG4gICAgZmxvYXQ2NFRhZyA9ICdbb2JqZWN0IEZsb2F0NjRBcnJheV0nLFxuICAgIGludDhUYWcgPSAnW29iamVjdCBJbnQ4QXJyYXldJyxcbiAgICBpbnQxNlRhZyA9ICdbb2JqZWN0IEludDE2QXJyYXldJyxcbiAgICBpbnQzMlRhZyA9ICdbb2JqZWN0IEludDMyQXJyYXldJyxcbiAgICB1aW50OFRhZyA9ICdbb2JqZWN0IFVpbnQ4QXJyYXldJyxcbiAgICB1aW50OENsYW1wZWRUYWcgPSAnW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0nLFxuICAgIHVpbnQxNlRhZyA9ICdbb2JqZWN0IFVpbnQxNkFycmF5XScsXG4gICAgdWludDMyVGFnID0gJ1tvYmplY3QgVWludDMyQXJyYXldJztcblxuLyoqIFVzZWQgdG8gaWRlbnRpZnkgYHRvU3RyaW5nVGFnYCB2YWx1ZXMgb2YgdHlwZWQgYXJyYXlzLiAqL1xudmFyIHR5cGVkQXJyYXlUYWdzID0ge307XG50eXBlZEFycmF5VGFnc1tmbG9hdDMyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Zsb2F0NjRUYWddID1cbnR5cGVkQXJyYXlUYWdzW2ludDhUYWddID0gdHlwZWRBcnJheVRhZ3NbaW50MTZUYWddID1cbnR5cGVkQXJyYXlUYWdzW2ludDMyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW3VpbnQ4VGFnXSA9XG50eXBlZEFycmF5VGFnc1t1aW50OENsYW1wZWRUYWddID0gdHlwZWRBcnJheVRhZ3NbdWludDE2VGFnXSA9XG50eXBlZEFycmF5VGFnc1t1aW50MzJUYWddID0gdHJ1ZTtcbnR5cGVkQXJyYXlUYWdzW2FyZ3NUYWddID0gdHlwZWRBcnJheVRhZ3NbYXJyYXlUYWddID1cbnR5cGVkQXJyYXlUYWdzW2FycmF5QnVmZmVyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Jvb2xUYWddID1cbnR5cGVkQXJyYXlUYWdzW2RhdGFWaWV3VGFnXSA9IHR5cGVkQXJyYXlUYWdzW2RhdGVUYWddID1cbnR5cGVkQXJyYXlUYWdzW2Vycm9yVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Z1bmNUYWddID1cbnR5cGVkQXJyYXlUYWdzW21hcFRhZ10gPSB0eXBlZEFycmF5VGFnc1tudW1iZXJUYWddID1cbnR5cGVkQXJyYXlUYWdzW29iamVjdFRhZ10gPSB0eXBlZEFycmF5VGFnc1tyZWdleHBUYWddID1cbnR5cGVkQXJyYXlUYWdzW3NldFRhZ10gPSB0eXBlZEFycmF5VGFnc1tzdHJpbmdUYWddID1cbnR5cGVkQXJyYXlUYWdzW3dlYWtNYXBUYWddID0gZmFsc2U7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNUeXBlZEFycmF5YCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHR5cGVkIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc1R5cGVkQXJyYXkodmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiZcbiAgICBpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpICYmICEhdHlwZWRBcnJheVRhZ3NbYmFzZUdldFRhZyh2YWx1ZSldO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJc1R5cGVkQXJyYXk7XG4iLCJ2YXIgYmFzZU1hdGNoZXMgPSByZXF1aXJlKCcuL19iYXNlTWF0Y2hlcycpLFxuICAgIGJhc2VNYXRjaGVzUHJvcGVydHkgPSByZXF1aXJlKCcuL19iYXNlTWF0Y2hlc1Byb3BlcnR5JyksXG4gICAgaWRlbnRpdHkgPSByZXF1aXJlKCcuL2lkZW50aXR5JyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIHByb3BlcnR5ID0gcmVxdWlyZSgnLi9wcm9wZXJ0eScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLml0ZXJhdGVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSBbdmFsdWU9Xy5pZGVudGl0eV0gVGhlIHZhbHVlIHRvIGNvbnZlcnQgdG8gYW4gaXRlcmF0ZWUuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGl0ZXJhdGVlLlxuICovXG5mdW5jdGlvbiBiYXNlSXRlcmF0ZWUodmFsdWUpIHtcbiAgLy8gRG9uJ3Qgc3RvcmUgdGhlIGB0eXBlb2ZgIHJlc3VsdCBpbiBhIHZhcmlhYmxlIHRvIGF2b2lkIGEgSklUIGJ1ZyBpbiBTYWZhcmkgOS5cbiAgLy8gU2VlIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTYwMzQgZm9yIG1vcmUgZGV0YWlscy5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGlkZW50aXR5O1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gaXNBcnJheSh2YWx1ZSlcbiAgICAgID8gYmFzZU1hdGNoZXNQcm9wZXJ0eSh2YWx1ZVswXSwgdmFsdWVbMV0pXG4gICAgICA6IGJhc2VNYXRjaGVzKHZhbHVlKTtcbiAgfVxuICByZXR1cm4gcHJvcGVydHkodmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJdGVyYXRlZTtcbiIsInZhciBpc1Byb3RvdHlwZSA9IHJlcXVpcmUoJy4vX2lzUHJvdG90eXBlJyksXG4gICAgbmF0aXZlS2V5cyA9IHJlcXVpcmUoJy4vX25hdGl2ZUtleXMnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5rZXlzYCB3aGljaCBkb2Vzbid0IHRyZWF0IHNwYXJzZSBhcnJheXMgYXMgZGVuc2UuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VLZXlzKG9iamVjdCkge1xuICBpZiAoIWlzUHJvdG90eXBlKG9iamVjdCkpIHtcbiAgICByZXR1cm4gbmF0aXZlS2V5cyhvYmplY3QpO1xuICB9XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgZm9yICh2YXIga2V5IGluIE9iamVjdChvYmplY3QpKSB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpICYmIGtleSAhPSAnY29uc3RydWN0b3InKSB7XG4gICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VLZXlzO1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpLFxuICAgIGlzUHJvdG90eXBlID0gcmVxdWlyZSgnLi9faXNQcm90b3R5cGUnKSxcbiAgICBuYXRpdmVLZXlzSW4gPSByZXF1aXJlKCcuL19uYXRpdmVLZXlzSW4nKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5rZXlzSW5gIHdoaWNoIGRvZXNuJ3QgdHJlYXQgc3BhcnNlIGFycmF5cyBhcyBkZW5zZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gYmFzZUtleXNJbihvYmplY3QpIHtcbiAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7XG4gICAgcmV0dXJuIG5hdGl2ZUtleXNJbihvYmplY3QpO1xuICB9XG4gIHZhciBpc1Byb3RvID0gaXNQcm90b3R5cGUob2JqZWN0KSxcbiAgICAgIHJlc3VsdCA9IFtdO1xuXG4gIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcbiAgICBpZiAoIShrZXkgPT0gJ2NvbnN0cnVjdG9yJyAmJiAoaXNQcm90byB8fCAhaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpKSkge1xuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlS2V5c0luO1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5sdGAgd2hpY2ggZG9lc24ndCBjb2VyY2UgYXJndW1lbnRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGxlc3MgdGhhbiBgb3RoZXJgLFxuICogIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUx0KHZhbHVlLCBvdGhlcikge1xuICByZXR1cm4gdmFsdWUgPCBvdGhlcjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlTHQ7XG4iLCJ2YXIgYmFzZUVhY2ggPSByZXF1aXJlKCcuL19iYXNlRWFjaCcpLFxuICAgIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm1hcGAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBiYXNlTWFwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgcmVzdWx0ID0gaXNBcnJheUxpa2UoY29sbGVjdGlvbikgPyBBcnJheShjb2xsZWN0aW9uLmxlbmd0aCkgOiBbXTtcblxuICBiYXNlRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSB7XG4gICAgcmVzdWx0WysraW5kZXhdID0gaXRlcmF0ZWUodmFsdWUsIGtleSwgY29sbGVjdGlvbik7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VNYXA7XG4iLCJ2YXIgYmFzZUlzTWF0Y2ggPSByZXF1aXJlKCcuL19iYXNlSXNNYXRjaCcpLFxuICAgIGdldE1hdGNoRGF0YSA9IHJlcXVpcmUoJy4vX2dldE1hdGNoRGF0YScpLFxuICAgIG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlID0gcmVxdWlyZSgnLi9fbWF0Y2hlc1N0cmljdENvbXBhcmFibGUnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tYXRjaGVzYCB3aGljaCBkb2Vzbid0IGNsb25lIGBzb3VyY2VgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gYmFzZU1hdGNoZXMoc291cmNlKSB7XG4gIHZhciBtYXRjaERhdGEgPSBnZXRNYXRjaERhdGEoc291cmNlKTtcbiAgaWYgKG1hdGNoRGF0YS5sZW5ndGggPT0gMSAmJiBtYXRjaERhdGFbMF1bMl0pIHtcbiAgICByZXR1cm4gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUobWF0Y2hEYXRhWzBdWzBdLCBtYXRjaERhdGFbMF1bMV0pO1xuICB9XG4gIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICByZXR1cm4gb2JqZWN0ID09PSBzb3VyY2UgfHwgYmFzZUlzTWF0Y2gob2JqZWN0LCBzb3VyY2UsIG1hdGNoRGF0YSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZU1hdGNoZXM7XG4iLCJ2YXIgYmFzZUlzRXF1YWwgPSByZXF1aXJlKCcuL19iYXNlSXNFcXVhbCcpLFxuICAgIGdldCA9IHJlcXVpcmUoJy4vZ2V0JyksXG4gICAgaGFzSW4gPSByZXF1aXJlKCcuL2hhc0luJyksXG4gICAgaXNLZXkgPSByZXF1aXJlKCcuL19pc0tleScpLFxuICAgIGlzU3RyaWN0Q29tcGFyYWJsZSA9IHJlcXVpcmUoJy4vX2lzU3RyaWN0Q29tcGFyYWJsZScpLFxuICAgIG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlID0gcmVxdWlyZSgnLi9fbWF0Y2hlc1N0cmljdENvbXBhcmFibGUnKSxcbiAgICB0b0tleSA9IHJlcXVpcmUoJy4vX3RvS2V5Jyk7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIHZhbHVlIGNvbXBhcmlzb25zLiAqL1xudmFyIENPTVBBUkVfUEFSVElBTF9GTEFHID0gMSxcbiAgICBDT01QQVJFX1VOT1JERVJFRF9GTEFHID0gMjtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tYXRjaGVzUHJvcGVydHlgIHdoaWNoIGRvZXNuJ3QgY2xvbmUgYHNyY1ZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEBwYXJhbSB7Kn0gc3JjVmFsdWUgVGhlIHZhbHVlIHRvIG1hdGNoLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gYmFzZU1hdGNoZXNQcm9wZXJ0eShwYXRoLCBzcmNWYWx1ZSkge1xuICBpZiAoaXNLZXkocGF0aCkgJiYgaXNTdHJpY3RDb21wYXJhYmxlKHNyY1ZhbHVlKSkge1xuICAgIHJldHVybiBtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZSh0b0tleShwYXRoKSwgc3JjVmFsdWUpO1xuICB9XG4gIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICB2YXIgb2JqVmFsdWUgPSBnZXQob2JqZWN0LCBwYXRoKTtcbiAgICByZXR1cm4gKG9ialZhbHVlID09PSB1bmRlZmluZWQgJiYgb2JqVmFsdWUgPT09IHNyY1ZhbHVlKVxuICAgICAgPyBoYXNJbihvYmplY3QsIHBhdGgpXG4gICAgICA6IGJhc2VJc0VxdWFsKHNyY1ZhbHVlLCBvYmpWYWx1ZSwgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgfCBDT01QQVJFX1VOT1JERVJFRF9GTEFHKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlTWF0Y2hlc1Byb3BlcnR5O1xuIiwidmFyIFN0YWNrID0gcmVxdWlyZSgnLi9fU3RhY2snKSxcbiAgICBhc3NpZ25NZXJnZVZhbHVlID0gcmVxdWlyZSgnLi9fYXNzaWduTWVyZ2VWYWx1ZScpLFxuICAgIGJhc2VGb3IgPSByZXF1aXJlKCcuL19iYXNlRm9yJyksXG4gICAgYmFzZU1lcmdlRGVlcCA9IHJlcXVpcmUoJy4vX2Jhc2VNZXJnZURlZXAnKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKSxcbiAgICBrZXlzSW4gPSByZXF1aXJlKCcuL2tleXNJbicpLFxuICAgIHNhZmVHZXQgPSByZXF1aXJlKCcuL19zYWZlR2V0Jyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWVyZ2VgIHdpdGhvdXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc291cmNlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBzcmNJbmRleCBUaGUgaW5kZXggb2YgYHNvdXJjZWAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBtZXJnZWQgdmFsdWVzLlxuICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBzb3VyY2UgdmFsdWVzIGFuZCB0aGVpciBtZXJnZWRcbiAqICBjb3VudGVycGFydHMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VNZXJnZShvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIsIHN0YWNrKSB7XG4gIGlmIChvYmplY3QgPT09IHNvdXJjZSkge1xuICAgIHJldHVybjtcbiAgfVxuICBiYXNlRm9yKHNvdXJjZSwgZnVuY3Rpb24oc3JjVmFsdWUsIGtleSkge1xuICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgaWYgKGlzT2JqZWN0KHNyY1ZhbHVlKSkge1xuICAgICAgYmFzZU1lcmdlRGVlcChvYmplY3QsIHNvdXJjZSwga2V5LCBzcmNJbmRleCwgYmFzZU1lcmdlLCBjdXN0b21pemVyLCBzdGFjayk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdmFyIG5ld1ZhbHVlID0gY3VzdG9taXplclxuICAgICAgICA/IGN1c3RvbWl6ZXIoc2FmZUdldChvYmplY3QsIGtleSksIHNyY1ZhbHVlLCAoa2V5ICsgJycpLCBvYmplY3QsIHNvdXJjZSwgc3RhY2spXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICBpZiAobmV3VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBuZXdWYWx1ZSA9IHNyY1ZhbHVlO1xuICAgICAgfVxuICAgICAgYXNzaWduTWVyZ2VWYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgIH1cbiAgfSwga2V5c0luKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlTWVyZ2U7XG4iLCJ2YXIgYXNzaWduTWVyZ2VWYWx1ZSA9IHJlcXVpcmUoJy4vX2Fzc2lnbk1lcmdlVmFsdWUnKSxcbiAgICBjbG9uZUJ1ZmZlciA9IHJlcXVpcmUoJy4vX2Nsb25lQnVmZmVyJyksXG4gICAgY2xvbmVUeXBlZEFycmF5ID0gcmVxdWlyZSgnLi9fY2xvbmVUeXBlZEFycmF5JyksXG4gICAgY29weUFycmF5ID0gcmVxdWlyZSgnLi9fY29weUFycmF5JyksXG4gICAgaW5pdENsb25lT2JqZWN0ID0gcmVxdWlyZSgnLi9faW5pdENsb25lT2JqZWN0JyksXG4gICAgaXNBcmd1bWVudHMgPSByZXF1aXJlKCcuL2lzQXJndW1lbnRzJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIGlzQXJyYXlMaWtlT2JqZWN0ID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZU9iamVjdCcpLFxuICAgIGlzQnVmZmVyID0gcmVxdWlyZSgnLi9pc0J1ZmZlcicpLFxuICAgIGlzRnVuY3Rpb24gPSByZXF1aXJlKCcuL2lzRnVuY3Rpb24nKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKSxcbiAgICBpc1BsYWluT2JqZWN0ID0gcmVxdWlyZSgnLi9pc1BsYWluT2JqZWN0JyksXG4gICAgaXNUeXBlZEFycmF5ID0gcmVxdWlyZSgnLi9pc1R5cGVkQXJyYXknKSxcbiAgICBzYWZlR2V0ID0gcmVxdWlyZSgnLi9fc2FmZUdldCcpLFxuICAgIHRvUGxhaW5PYmplY3QgPSByZXF1aXJlKCcuL3RvUGxhaW5PYmplY3QnKTtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VNZXJnZWAgZm9yIGFycmF5cyBhbmQgb2JqZWN0cyB3aGljaCBwZXJmb3Jtc1xuICogZGVlcCBtZXJnZXMgYW5kIHRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cyBlbmFibGluZyBvYmplY3RzIHdpdGggY2lyY3VsYXJcbiAqIHJlZmVyZW5jZXMgdG8gYmUgbWVyZ2VkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBtZXJnZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBzcmNJbmRleCBUaGUgaW5kZXggb2YgYHNvdXJjZWAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBtZXJnZUZ1bmMgVGhlIGZ1bmN0aW9uIHRvIG1lcmdlIHZhbHVlcy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGFzc2lnbmVkIHZhbHVlcy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgc291cmNlIHZhbHVlcyBhbmQgdGhlaXIgbWVyZ2VkXG4gKiAgY291bnRlcnBhcnRzLlxuICovXG5mdW5jdGlvbiBiYXNlTWVyZ2VEZWVwKG9iamVjdCwgc291cmNlLCBrZXksIHNyY0luZGV4LCBtZXJnZUZ1bmMsIGN1c3RvbWl6ZXIsIHN0YWNrKSB7XG4gIHZhciBvYmpWYWx1ZSA9IHNhZmVHZXQob2JqZWN0LCBrZXkpLFxuICAgICAgc3JjVmFsdWUgPSBzYWZlR2V0KHNvdXJjZSwga2V5KSxcbiAgICAgIHN0YWNrZWQgPSBzdGFjay5nZXQoc3JjVmFsdWUpO1xuXG4gIGlmIChzdGFja2VkKSB7XG4gICAgYXNzaWduTWVyZ2VWYWx1ZShvYmplY3QsIGtleSwgc3RhY2tlZCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXJcbiAgICA/IGN1c3RvbWl6ZXIob2JqVmFsdWUsIHNyY1ZhbHVlLCAoa2V5ICsgJycpLCBvYmplY3QsIHNvdXJjZSwgc3RhY2spXG4gICAgOiB1bmRlZmluZWQ7XG5cbiAgdmFyIGlzQ29tbW9uID0gbmV3VmFsdWUgPT09IHVuZGVmaW5lZDtcblxuICBpZiAoaXNDb21tb24pIHtcbiAgICB2YXIgaXNBcnIgPSBpc0FycmF5KHNyY1ZhbHVlKSxcbiAgICAgICAgaXNCdWZmID0gIWlzQXJyICYmIGlzQnVmZmVyKHNyY1ZhbHVlKSxcbiAgICAgICAgaXNUeXBlZCA9ICFpc0FyciAmJiAhaXNCdWZmICYmIGlzVHlwZWRBcnJheShzcmNWYWx1ZSk7XG5cbiAgICBuZXdWYWx1ZSA9IHNyY1ZhbHVlO1xuICAgIGlmIChpc0FyciB8fCBpc0J1ZmYgfHwgaXNUeXBlZCkge1xuICAgICAgaWYgKGlzQXJyYXkob2JqVmFsdWUpKSB7XG4gICAgICAgIG5ld1ZhbHVlID0gb2JqVmFsdWU7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChpc0FycmF5TGlrZU9iamVjdChvYmpWYWx1ZSkpIHtcbiAgICAgICAgbmV3VmFsdWUgPSBjb3B5QXJyYXkob2JqVmFsdWUpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoaXNCdWZmKSB7XG4gICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICAgIG5ld1ZhbHVlID0gY2xvbmVCdWZmZXIoc3JjVmFsdWUsIHRydWUpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoaXNUeXBlZCkge1xuICAgICAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgICAgICBuZXdWYWx1ZSA9IGNsb25lVHlwZWRBcnJheShzcmNWYWx1ZSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgbmV3VmFsdWUgPSBbXTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoaXNQbGFpbk9iamVjdChzcmNWYWx1ZSkgfHwgaXNBcmd1bWVudHMoc3JjVmFsdWUpKSB7XG4gICAgICBuZXdWYWx1ZSA9IG9ialZhbHVlO1xuICAgICAgaWYgKGlzQXJndW1lbnRzKG9ialZhbHVlKSkge1xuICAgICAgICBuZXdWYWx1ZSA9IHRvUGxhaW5PYmplY3Qob2JqVmFsdWUpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoIWlzT2JqZWN0KG9ialZhbHVlKSB8fCBpc0Z1bmN0aW9uKG9ialZhbHVlKSkge1xuICAgICAgICBuZXdWYWx1ZSA9IGluaXRDbG9uZU9iamVjdChzcmNWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgaWYgKGlzQ29tbW9uKSB7XG4gICAgLy8gUmVjdXJzaXZlbHkgbWVyZ2Ugb2JqZWN0cyBhbmQgYXJyYXlzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgc3RhY2suc2V0KHNyY1ZhbHVlLCBuZXdWYWx1ZSk7XG4gICAgbWVyZ2VGdW5jKG5ld1ZhbHVlLCBzcmNWYWx1ZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIsIHN0YWNrKTtcbiAgICBzdGFja1snZGVsZXRlJ10oc3JjVmFsdWUpO1xuICB9XG4gIGFzc2lnbk1lcmdlVmFsdWUob2JqZWN0LCBrZXksIG5ld1ZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlTWVyZ2VEZWVwO1xuIiwidmFyIGFycmF5TWFwID0gcmVxdWlyZSgnLi9fYXJyYXlNYXAnKSxcbiAgICBiYXNlR2V0ID0gcmVxdWlyZSgnLi9fYmFzZUdldCcpLFxuICAgIGJhc2VJdGVyYXRlZSA9IHJlcXVpcmUoJy4vX2Jhc2VJdGVyYXRlZScpLFxuICAgIGJhc2VNYXAgPSByZXF1aXJlKCcuL19iYXNlTWFwJyksXG4gICAgYmFzZVNvcnRCeSA9IHJlcXVpcmUoJy4vX2Jhc2VTb3J0QnknKSxcbiAgICBiYXNlVW5hcnkgPSByZXF1aXJlKCcuL19iYXNlVW5hcnknKSxcbiAgICBjb21wYXJlTXVsdGlwbGUgPSByZXF1aXJlKCcuL19jb21wYXJlTXVsdGlwbGUnKSxcbiAgICBpZGVudGl0eSA9IHJlcXVpcmUoJy4vaWRlbnRpdHknKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5Jyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ub3JkZXJCeWAgd2l0aG91dCBwYXJhbSBndWFyZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb25bXXxPYmplY3RbXXxzdHJpbmdbXX0gaXRlcmF0ZWVzIFRoZSBpdGVyYXRlZXMgdG8gc29ydCBieS5cbiAqIEBwYXJhbSB7c3RyaW5nW119IG9yZGVycyBUaGUgc29ydCBvcmRlcnMgb2YgYGl0ZXJhdGVlc2AuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBzb3J0ZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGJhc2VPcmRlckJ5KGNvbGxlY3Rpb24sIGl0ZXJhdGVlcywgb3JkZXJzKSB7XG4gIGlmIChpdGVyYXRlZXMubGVuZ3RoKSB7XG4gICAgaXRlcmF0ZWVzID0gYXJyYXlNYXAoaXRlcmF0ZWVzLCBmdW5jdGlvbihpdGVyYXRlZSkge1xuICAgICAgaWYgKGlzQXJyYXkoaXRlcmF0ZWUpKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgIHJldHVybiBiYXNlR2V0KHZhbHVlLCBpdGVyYXRlZS5sZW5ndGggPT09IDEgPyBpdGVyYXRlZVswXSA6IGl0ZXJhdGVlKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpdGVyYXRlZTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBpdGVyYXRlZXMgPSBbaWRlbnRpdHldO1xuICB9XG5cbiAgdmFyIGluZGV4ID0gLTE7XG4gIGl0ZXJhdGVlcyA9IGFycmF5TWFwKGl0ZXJhdGVlcywgYmFzZVVuYXJ5KGJhc2VJdGVyYXRlZSkpO1xuXG4gIHZhciByZXN1bHQgPSBiYXNlTWFwKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHtcbiAgICB2YXIgY3JpdGVyaWEgPSBhcnJheU1hcChpdGVyYXRlZXMsIGZ1bmN0aW9uKGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gaXRlcmF0ZWUodmFsdWUpO1xuICAgIH0pO1xuICAgIHJldHVybiB7ICdjcml0ZXJpYSc6IGNyaXRlcmlhLCAnaW5kZXgnOiArK2luZGV4LCAndmFsdWUnOiB2YWx1ZSB9O1xuICB9KTtcblxuICByZXR1cm4gYmFzZVNvcnRCeShyZXN1bHQsIGZ1bmN0aW9uKG9iamVjdCwgb3RoZXIpIHtcbiAgICByZXR1cm4gY29tcGFyZU11bHRpcGxlKG9iamVjdCwgb3RoZXIsIG9yZGVycyk7XG4gIH0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VPcmRlckJ5O1xuIiwidmFyIGJhc2VQaWNrQnkgPSByZXF1aXJlKCcuL19iYXNlUGlja0J5JyksXG4gICAgaGFzSW4gPSByZXF1aXJlKCcuL2hhc0luJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucGlja2Agd2l0aG91dCBzdXBwb3J0IGZvciBpbmRpdmlkdWFsXG4gKiBwcm9wZXJ0eSBpZGVudGlmaWVycy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAqIEBwYXJhbSB7c3RyaW5nW119IHBhdGhzIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gYmFzZVBpY2sob2JqZWN0LCBwYXRocykge1xuICByZXR1cm4gYmFzZVBpY2tCeShvYmplY3QsIHBhdGhzLCBmdW5jdGlvbih2YWx1ZSwgcGF0aCkge1xuICAgIHJldHVybiBoYXNJbihvYmplY3QsIHBhdGgpO1xuICB9KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlUGljaztcbiIsInZhciBiYXNlR2V0ID0gcmVxdWlyZSgnLi9fYmFzZUdldCcpLFxuICAgIGJhc2VTZXQgPSByZXF1aXJlKCcuL19iYXNlU2V0JyksXG4gICAgY2FzdFBhdGggPSByZXF1aXJlKCcuL19jYXN0UGF0aCcpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mICBgXy5waWNrQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAqIEBwYXJhbSB7c3RyaW5nW119IHBhdGhzIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBwcm9wZXJ0eS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGJhc2VQaWNrQnkob2JqZWN0LCBwYXRocywgcHJlZGljYXRlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gcGF0aHMubGVuZ3RoLFxuICAgICAgcmVzdWx0ID0ge307XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgcGF0aCA9IHBhdGhzW2luZGV4XSxcbiAgICAgICAgdmFsdWUgPSBiYXNlR2V0KG9iamVjdCwgcGF0aCk7XG5cbiAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBwYXRoKSkge1xuICAgICAgYmFzZVNldChyZXN1bHQsIGNhc3RQYXRoKHBhdGgsIG9iamVjdCksIHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlUGlja0J5O1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5wcm9wZXJ0eWAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWVwIHBhdGhzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlUHJvcGVydHkoa2V5KSB7XG4gIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3Rba2V5XTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlUHJvcGVydHk7XG4iLCJ2YXIgYmFzZUdldCA9IHJlcXVpcmUoJy4vX2Jhc2VHZXQnKTtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VQcm9wZXJ0eWAgd2hpY2ggc3VwcG9ydHMgZGVlcCBwYXRocy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlUHJvcGVydHlEZWVwKHBhdGgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIHJldHVybiBiYXNlR2V0KG9iamVjdCwgcGF0aCk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVByb3BlcnR5RGVlcDtcbiIsIi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVDZWlsID0gTWF0aC5jZWlsLFxuICAgIG5hdGl2ZU1heCA9IE1hdGgubWF4O1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJhbmdlYCBhbmQgYF8ucmFuZ2VSaWdodGAgd2hpY2ggZG9lc24ndFxuICogY29lcmNlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuXG4gKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhlIHJhbmdlLlxuICogQHBhcmFtIHtudW1iZXJ9IHN0ZXAgVGhlIHZhbHVlIHRvIGluY3JlbWVudCBvciBkZWNyZW1lbnQgYnkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZ2Ugb2YgbnVtYmVycy5cbiAqL1xuZnVuY3Rpb24gYmFzZVJhbmdlKHN0YXJ0LCBlbmQsIHN0ZXAsIGZyb21SaWdodCkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IG5hdGl2ZU1heChuYXRpdmVDZWlsKChlbmQgLSBzdGFydCkgLyAoc3RlcCB8fCAxKSksIDApLFxuICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcblxuICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICByZXN1bHRbZnJvbVJpZ2h0ID8gbGVuZ3RoIDogKytpbmRleF0gPSBzdGFydDtcbiAgICBzdGFydCArPSBzdGVwO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVJhbmdlO1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yZWR1Y2VgIGFuZCBgXy5yZWR1Y2VSaWdodGAsIHdpdGhvdXQgc3VwcG9ydFxuICogZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMsIHdoaWNoIGl0ZXJhdGVzIG92ZXIgYGNvbGxlY3Rpb25gIHVzaW5nIGBlYWNoRnVuY2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0geyp9IGFjY3VtdWxhdG9yIFRoZSBpbml0aWFsIHZhbHVlLlxuICogQHBhcmFtIHtib29sZWFufSBpbml0QWNjdW0gU3BlY2lmeSB1c2luZyB0aGUgZmlyc3Qgb3IgbGFzdCBlbGVtZW50IG9mXG4gKiAgYGNvbGxlY3Rpb25gIGFzIHRoZSBpbml0aWFsIHZhbHVlLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZWFjaEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGl0ZXJhdGUgb3ZlciBgY29sbGVjdGlvbmAuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGJhc2VSZWR1Y2UoY29sbGVjdGlvbiwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0sIGVhY2hGdW5jKSB7XG4gIGVhY2hGdW5jKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikge1xuICAgIGFjY3VtdWxhdG9yID0gaW5pdEFjY3VtXG4gICAgICA/IChpbml0QWNjdW0gPSBmYWxzZSwgdmFsdWUpXG4gICAgICA6IGl0ZXJhdGVlKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pO1xuICB9KTtcbiAgcmV0dXJuIGFjY3VtdWxhdG9yO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VSZWR1Y2U7XG4iLCJ2YXIgaWRlbnRpdHkgPSByZXF1aXJlKCcuL2lkZW50aXR5JyksXG4gICAgb3ZlclJlc3QgPSByZXF1aXJlKCcuL19vdmVyUmVzdCcpLFxuICAgIHNldFRvU3RyaW5nID0gcmVxdWlyZSgnLi9fc2V0VG9TdHJpbmcnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yZXN0YCB3aGljaCBkb2Vzbid0IHZhbGlkYXRlIG9yIGNvZXJjZSBhcmd1bWVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFwcGx5IGEgcmVzdCBwYXJhbWV0ZXIgdG8uXG4gKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PWZ1bmMubGVuZ3RoLTFdIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcmVzdCBwYXJhbWV0ZXIuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gYmFzZVJlc3QoZnVuYywgc3RhcnQpIHtcbiAgcmV0dXJuIHNldFRvU3RyaW5nKG92ZXJSZXN0KGZ1bmMsIHN0YXJ0LCBpZGVudGl0eSksIGZ1bmMgKyAnJyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVJlc3Q7XG4iLCJ2YXIgYXNzaWduVmFsdWUgPSByZXF1aXJlKCcuL19hc3NpZ25WYWx1ZScpLFxuICAgIGNhc3RQYXRoID0gcmVxdWlyZSgnLi9fY2FzdFBhdGgnKSxcbiAgICBpc0luZGV4ID0gcmVxdWlyZSgnLi9faXNJbmRleCcpLFxuICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpLFxuICAgIHRvS2V5ID0gcmVxdWlyZSgnLi9fdG9LZXknKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zZXRgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIHBhdGggY3JlYXRpb24uXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICovXG5mdW5jdGlvbiBiYXNlU2V0KG9iamVjdCwgcGF0aCwgdmFsdWUsIGN1c3RvbWl6ZXIpIHtcbiAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfVxuICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcblxuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IHBhdGgubGVuZ3RoLFxuICAgICAgbGFzdEluZGV4ID0gbGVuZ3RoIC0gMSxcbiAgICAgIG5lc3RlZCA9IG9iamVjdDtcblxuICB3aGlsZSAobmVzdGVkICE9IG51bGwgJiYgKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBrZXkgPSB0b0tleShwYXRoW2luZGV4XSksXG4gICAgICAgIG5ld1ZhbHVlID0gdmFsdWU7XG5cbiAgICBpZiAoa2V5ID09PSAnX19wcm90b19fJyB8fCBrZXkgPT09ICdjb25zdHJ1Y3RvcicgfHwga2V5ID09PSAncHJvdG90eXBlJykge1xuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9XG5cbiAgICBpZiAoaW5kZXggIT0gbGFzdEluZGV4KSB7XG4gICAgICB2YXIgb2JqVmFsdWUgPSBuZXN0ZWRba2V5XTtcbiAgICAgIG5ld1ZhbHVlID0gY3VzdG9taXplciA/IGN1c3RvbWl6ZXIob2JqVmFsdWUsIGtleSwgbmVzdGVkKSA6IHVuZGVmaW5lZDtcbiAgICAgIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5ld1ZhbHVlID0gaXNPYmplY3Qob2JqVmFsdWUpXG4gICAgICAgICAgPyBvYmpWYWx1ZVxuICAgICAgICAgIDogKGlzSW5kZXgocGF0aFtpbmRleCArIDFdKSA/IFtdIDoge30pO1xuICAgICAgfVxuICAgIH1cbiAgICBhc3NpZ25WYWx1ZShuZXN0ZWQsIGtleSwgbmV3VmFsdWUpO1xuICAgIG5lc3RlZCA9IG5lc3RlZFtrZXldO1xuICB9XG4gIHJldHVybiBvYmplY3Q7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVNldDtcbiIsInZhciBjb25zdGFudCA9IHJlcXVpcmUoJy4vY29uc3RhbnQnKSxcbiAgICBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX2RlZmluZVByb3BlcnR5JyksXG4gICAgaWRlbnRpdHkgPSByZXF1aXJlKCcuL2lkZW50aXR5Jyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYHNldFRvU3RyaW5nYCB3aXRob3V0IHN1cHBvcnQgZm9yIGhvdCBsb29wIHNob3J0aW5nLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdHJpbmcgVGhlIGB0b1N0cmluZ2AgcmVzdWx0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBmdW5jYC5cbiAqL1xudmFyIGJhc2VTZXRUb1N0cmluZyA9ICFkZWZpbmVQcm9wZXJ0eSA/IGlkZW50aXR5IDogZnVuY3Rpb24oZnVuYywgc3RyaW5nKSB7XG4gIHJldHVybiBkZWZpbmVQcm9wZXJ0eShmdW5jLCAndG9TdHJpbmcnLCB7XG4gICAgJ2NvbmZpZ3VyYWJsZSc6IHRydWUsXG4gICAgJ2VudW1lcmFibGUnOiBmYWxzZSxcbiAgICAndmFsdWUnOiBjb25zdGFudChzdHJpbmcpLFxuICAgICd3cml0YWJsZSc6IHRydWVcbiAgfSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VTZXRUb1N0cmluZztcbiIsIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc29ydEJ5YCB3aGljaCB1c2VzIGBjb21wYXJlcmAgdG8gZGVmaW5lIHRoZVxuICogc29ydCBvcmRlciBvZiBgYXJyYXlgIGFuZCByZXBsYWNlcyBjcml0ZXJpYSBvYmplY3RzIHdpdGggdGhlaXIgY29ycmVzcG9uZGluZ1xuICogdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc29ydC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBhcmVyIFRoZSBmdW5jdGlvbiB0byBkZWZpbmUgc29ydCBvcmRlci5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICovXG5mdW5jdGlvbiBiYXNlU29ydEJ5KGFycmF5LCBjb21wYXJlcikge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gIGFycmF5LnNvcnQoY29tcGFyZXIpO1xuICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICBhcnJheVtsZW5ndGhdID0gYXJyYXlbbGVuZ3RoXS52YWx1ZTtcbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVNvcnRCeTtcbiIsIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udGltZXNgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kc1xuICogb3IgbWF4IGFycmF5IGxlbmd0aCBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gaW52b2tlIGBpdGVyYXRlZWAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiByZXN1bHRzLlxuICovXG5mdW5jdGlvbiBiYXNlVGltZXMobiwgaXRlcmF0ZWUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICByZXN1bHQgPSBBcnJheShuKTtcblxuICB3aGlsZSAoKytpbmRleCA8IG4pIHtcbiAgICByZXN1bHRbaW5kZXhdID0gaXRlcmF0ZWUoaW5kZXgpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVRpbWVzO1xuIiwidmFyIFN5bWJvbCA9IHJlcXVpcmUoJy4vX1N5bWJvbCcpLFxuICAgIGFycmF5TWFwID0gcmVxdWlyZSgnLi9fYXJyYXlNYXAnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNTeW1ib2wgPSByZXF1aXJlKCcuL2lzU3ltYm9sJyk7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIElORklOSVRZID0gMSAvIDA7XG5cbi8qKiBVc2VkIHRvIGNvbnZlcnQgc3ltYm9scyB0byBwcmltaXRpdmVzIGFuZCBzdHJpbmdzLiAqL1xudmFyIHN5bWJvbFByb3RvID0gU3ltYm9sID8gU3ltYm9sLnByb3RvdHlwZSA6IHVuZGVmaW5lZCxcbiAgICBzeW1ib2xUb1N0cmluZyA9IHN5bWJvbFByb3RvID8gc3ltYm9sUHJvdG8udG9TdHJpbmcgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udG9TdHJpbmdgIHdoaWNoIGRvZXNuJ3QgY29udmVydCBudWxsaXNoXG4gKiB2YWx1ZXMgdG8gZW1wdHkgc3RyaW5ncy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gYmFzZVRvU3RyaW5nKHZhbHVlKSB7XG4gIC8vIEV4aXQgZWFybHkgZm9yIHN0cmluZ3MgdG8gYXZvaWQgYSBwZXJmb3JtYW5jZSBoaXQgaW4gc29tZSBlbnZpcm9ubWVudHMuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgLy8gUmVjdXJzaXZlbHkgY29udmVydCB2YWx1ZXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICByZXR1cm4gYXJyYXlNYXAodmFsdWUsIGJhc2VUb1N0cmluZykgKyAnJztcbiAgfVxuICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgcmV0dXJuIHN5bWJvbFRvU3RyaW5nID8gc3ltYm9sVG9TdHJpbmcuY2FsbCh2YWx1ZSkgOiAnJztcbiAgfVxuICB2YXIgcmVzdWx0ID0gKHZhbHVlICsgJycpO1xuICByZXR1cm4gKHJlc3VsdCA9PSAnMCcgJiYgKDEgLyB2YWx1ZSkgPT0gLUlORklOSVRZKSA/ICctMCcgOiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVRvU3RyaW5nO1xuIiwidmFyIHRyaW1tZWRFbmRJbmRleCA9IHJlcXVpcmUoJy4vX3RyaW1tZWRFbmRJbmRleCcpO1xuXG4vKiogVXNlZCB0byBtYXRjaCBsZWFkaW5nIHdoaXRlc3BhY2UuICovXG52YXIgcmVUcmltU3RhcnQgPSAvXlxccysvO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnRyaW1gLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gdHJpbS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHRyaW1tZWQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBiYXNlVHJpbShzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZ1xuICAgID8gc3RyaW5nLnNsaWNlKDAsIHRyaW1tZWRFbmRJbmRleChzdHJpbmcpICsgMSkucmVwbGFjZShyZVRyaW1TdGFydCwgJycpXG4gICAgOiBzdHJpbmc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVRyaW07XG4iLCIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnVuYXJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yIHN0b3JpbmcgbWV0YWRhdGEuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNhcCBhcmd1bWVudHMgZm9yLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY2FwcGVkIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlVW5hcnkoZnVuYykge1xuICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gZnVuYyh2YWx1ZSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVVuYXJ5O1xuIiwidmFyIFNldENhY2hlID0gcmVxdWlyZSgnLi9fU2V0Q2FjaGUnKSxcbiAgICBhcnJheUluY2x1ZGVzID0gcmVxdWlyZSgnLi9fYXJyYXlJbmNsdWRlcycpLFxuICAgIGFycmF5SW5jbHVkZXNXaXRoID0gcmVxdWlyZSgnLi9fYXJyYXlJbmNsdWRlc1dpdGgnKSxcbiAgICBjYWNoZUhhcyA9IHJlcXVpcmUoJy4vX2NhY2hlSGFzJyksXG4gICAgY3JlYXRlU2V0ID0gcmVxdWlyZSgnLi9fY3JlYXRlU2V0JyksXG4gICAgc2V0VG9BcnJheSA9IHJlcXVpcmUoJy4vX3NldFRvQXJyYXknKTtcblxuLyoqIFVzZWQgYXMgdGhlIHNpemUgdG8gZW5hYmxlIGxhcmdlIGFycmF5IG9wdGltaXphdGlvbnMuICovXG52YXIgTEFSR0VfQVJSQVlfU0laRSA9IDIwMDtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy51bmlxQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYmFzZVVuaXEoYXJyYXksIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgaW5jbHVkZXMgPSBhcnJheUluY2x1ZGVzLFxuICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgaXNDb21tb24gPSB0cnVlLFxuICAgICAgcmVzdWx0ID0gW10sXG4gICAgICBzZWVuID0gcmVzdWx0O1xuXG4gIGlmIChjb21wYXJhdG9yKSB7XG4gICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICBpbmNsdWRlcyA9IGFycmF5SW5jbHVkZXNXaXRoO1xuICB9XG4gIGVsc2UgaWYgKGxlbmd0aCA+PSBMQVJHRV9BUlJBWV9TSVpFKSB7XG4gICAgdmFyIHNldCA9IGl0ZXJhdGVlID8gbnVsbCA6IGNyZWF0ZVNldChhcnJheSk7XG4gICAgaWYgKHNldCkge1xuICAgICAgcmV0dXJuIHNldFRvQXJyYXkoc2V0KTtcbiAgICB9XG4gICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICBpbmNsdWRlcyA9IGNhY2hlSGFzO1xuICAgIHNlZW4gPSBuZXcgU2V0Q2FjaGU7XG4gIH1cbiAgZWxzZSB7XG4gICAgc2VlbiA9IGl0ZXJhdGVlID8gW10gOiByZXN1bHQ7XG4gIH1cbiAgb3V0ZXI6XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlID8gaXRlcmF0ZWUodmFsdWUpIDogdmFsdWU7XG5cbiAgICB2YWx1ZSA9IChjb21wYXJhdG9yIHx8IHZhbHVlICE9PSAwKSA/IHZhbHVlIDogMDtcbiAgICBpZiAoaXNDb21tb24gJiYgY29tcHV0ZWQgPT09IGNvbXB1dGVkKSB7XG4gICAgICB2YXIgc2VlbkluZGV4ID0gc2Vlbi5sZW5ndGg7XG4gICAgICB3aGlsZSAoc2VlbkluZGV4LS0pIHtcbiAgICAgICAgaWYgKHNlZW5bc2VlbkluZGV4XSA9PT0gY29tcHV0ZWQpIHtcbiAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGl0ZXJhdGVlKSB7XG4gICAgICAgIHNlZW4ucHVzaChjb21wdXRlZCk7XG4gICAgICB9XG4gICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKCFpbmNsdWRlcyhzZWVuLCBjb21wdXRlZCwgY29tcGFyYXRvcikpIHtcbiAgICAgIGlmIChzZWVuICE9PSByZXN1bHQpIHtcbiAgICAgICAgc2Vlbi5wdXNoKGNvbXB1dGVkKTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlVW5pcTtcbiIsInZhciBhcnJheU1hcCA9IHJlcXVpcmUoJy4vX2FycmF5TWFwJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udmFsdWVzYCBhbmQgYF8udmFsdWVzSW5gIHdoaWNoIGNyZWF0ZXMgYW5cbiAqIGFycmF5IG9mIGBvYmplY3RgIHByb3BlcnR5IHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm9wZXJ0eSBuYW1lc1xuICogb2YgYHByb3BzYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IG5hbWVzIHRvIGdldCB2YWx1ZXMgZm9yLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBiYXNlVmFsdWVzKG9iamVjdCwgcHJvcHMpIHtcbiAgcmV0dXJuIGFycmF5TWFwKHByb3BzLCBmdW5jdGlvbihrZXkpIHtcbiAgICByZXR1cm4gb2JqZWN0W2tleV07XG4gIH0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VWYWx1ZXM7XG4iLCIvKipcbiAqIFRoaXMgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy56aXBPYmplY3RgIHdoaWNoIGFzc2lnbnMgdmFsdWVzIHVzaW5nIGBhc3NpZ25GdW5jYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IGlkZW50aWZpZXJzLlxuICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSBwcm9wZXJ0eSB2YWx1ZXMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBhc3NpZ25GdW5jIFRoZSBmdW5jdGlvbiB0byBhc3NpZ24gdmFsdWVzLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gYmFzZVppcE9iamVjdChwcm9wcywgdmFsdWVzLCBhc3NpZ25GdW5jKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoLFxuICAgICAgdmFsc0xlbmd0aCA9IHZhbHVlcy5sZW5ndGgsXG4gICAgICByZXN1bHQgPSB7fTtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciB2YWx1ZSA9IGluZGV4IDwgdmFsc0xlbmd0aCA/IHZhbHVlc1tpbmRleF0gOiB1bmRlZmluZWQ7XG4gICAgYXNzaWduRnVuYyhyZXN1bHQsIHByb3BzW2luZGV4XSwgdmFsdWUpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVppcE9iamVjdDtcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGEgYGNhY2hlYCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gY2FjaGUgVGhlIGNhY2hlIHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGNhY2hlSGFzKGNhY2hlLCBrZXkpIHtcbiAgcmV0dXJuIGNhY2hlLmhhcyhrZXkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNhY2hlSGFzO1xuIiwidmFyIGlkZW50aXR5ID0gcmVxdWlyZSgnLi9pZGVudGl0eScpO1xuXG4vKipcbiAqIENhc3RzIGB2YWx1ZWAgdG8gYGlkZW50aXR5YCBpZiBpdCdzIG5vdCBhIGZ1bmN0aW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGNhc3QgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNhc3RGdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdmdW5jdGlvbicgPyB2YWx1ZSA6IGlkZW50aXR5O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNhc3RGdW5jdGlvbjtcbiIsInZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNLZXkgPSByZXF1aXJlKCcuL19pc0tleScpLFxuICAgIHN0cmluZ1RvUGF0aCA9IHJlcXVpcmUoJy4vX3N0cmluZ1RvUGF0aCcpLFxuICAgIHRvU3RyaW5nID0gcmVxdWlyZSgnLi90b1N0cmluZycpO1xuXG4vKipcbiAqIENhc3RzIGB2YWx1ZWAgdG8gYSBwYXRoIGFycmF5IGlmIGl0J3Mgbm90IG9uZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5IGtleXMgb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNhc3QgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gY2FzdFBhdGgodmFsdWUsIG9iamVjdCkge1xuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIGlzS2V5KHZhbHVlLCBvYmplY3QpID8gW3ZhbHVlXSA6IHN0cmluZ1RvUGF0aCh0b1N0cmluZyh2YWx1ZSkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNhc3RQYXRoO1xuIiwidmFyIFVpbnQ4QXJyYXkgPSByZXF1aXJlKCcuL19VaW50OEFycmF5Jyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNsb25lIG9mIGBhcnJheUJ1ZmZlcmAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXlCdWZmZXJ9IGFycmF5QnVmZmVyIFRoZSBhcnJheSBidWZmZXIgdG8gY2xvbmUuXG4gKiBAcmV0dXJucyB7QXJyYXlCdWZmZXJ9IFJldHVybnMgdGhlIGNsb25lZCBhcnJheSBidWZmZXIuXG4gKi9cbmZ1bmN0aW9uIGNsb25lQXJyYXlCdWZmZXIoYXJyYXlCdWZmZXIpIHtcbiAgdmFyIHJlc3VsdCA9IG5ldyBhcnJheUJ1ZmZlci5jb25zdHJ1Y3RvcihhcnJheUJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgbmV3IFVpbnQ4QXJyYXkocmVzdWx0KS5zZXQobmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjbG9uZUFycmF5QnVmZmVyO1xuIiwidmFyIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZXhwb3J0c2AuICovXG52YXIgZnJlZUV4cG9ydHMgPSB0eXBlb2YgZXhwb3J0cyA9PSAnb2JqZWN0JyAmJiBleHBvcnRzICYmICFleHBvcnRzLm5vZGVUeXBlICYmIGV4cG9ydHM7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgbW9kdWxlYC4gKi9cbnZhciBmcmVlTW9kdWxlID0gZnJlZUV4cG9ydHMgJiYgdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUgJiYgIW1vZHVsZS5ub2RlVHlwZSAmJiBtb2R1bGU7XG5cbi8qKiBEZXRlY3QgdGhlIHBvcHVsYXIgQ29tbW9uSlMgZXh0ZW5zaW9uIGBtb2R1bGUuZXhwb3J0c2AuICovXG52YXIgbW9kdWxlRXhwb3J0cyA9IGZyZWVNb2R1bGUgJiYgZnJlZU1vZHVsZS5leHBvcnRzID09PSBmcmVlRXhwb3J0cztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgQnVmZmVyID0gbW9kdWxlRXhwb3J0cyA/IHJvb3QuQnVmZmVyIDogdW5kZWZpbmVkLFxuICAgIGFsbG9jVW5zYWZlID0gQnVmZmVyID8gQnVmZmVyLmFsbG9jVW5zYWZlIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjbG9uZSBvZiAgYGJ1ZmZlcmAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QnVmZmVyfSBidWZmZXIgVGhlIGJ1ZmZlciB0byBjbG9uZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRGVlcF0gU3BlY2lmeSBhIGRlZXAgY2xvbmUuXG4gKiBAcmV0dXJucyB7QnVmZmVyfSBSZXR1cm5zIHRoZSBjbG9uZWQgYnVmZmVyLlxuICovXG5mdW5jdGlvbiBjbG9uZUJ1ZmZlcihidWZmZXIsIGlzRGVlcCkge1xuICBpZiAoaXNEZWVwKSB7XG4gICAgcmV0dXJuIGJ1ZmZlci5zbGljZSgpO1xuICB9XG4gIHZhciBsZW5ndGggPSBidWZmZXIubGVuZ3RoLFxuICAgICAgcmVzdWx0ID0gYWxsb2NVbnNhZmUgPyBhbGxvY1Vuc2FmZShsZW5ndGgpIDogbmV3IGJ1ZmZlci5jb25zdHJ1Y3RvcihsZW5ndGgpO1xuXG4gIGJ1ZmZlci5jb3B5KHJlc3VsdCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2xvbmVCdWZmZXI7XG4iLCJ2YXIgY2xvbmVBcnJheUJ1ZmZlciA9IHJlcXVpcmUoJy4vX2Nsb25lQXJyYXlCdWZmZXInKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgY2xvbmUgb2YgYGRhdGFWaWV3YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGRhdGFWaWV3IFRoZSBkYXRhIHZpZXcgdG8gY2xvbmUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIGRhdGEgdmlldy5cbiAqL1xuZnVuY3Rpb24gY2xvbmVEYXRhVmlldyhkYXRhVmlldywgaXNEZWVwKSB7XG4gIHZhciBidWZmZXIgPSBpc0RlZXAgPyBjbG9uZUFycmF5QnVmZmVyKGRhdGFWaWV3LmJ1ZmZlcikgOiBkYXRhVmlldy5idWZmZXI7XG4gIHJldHVybiBuZXcgZGF0YVZpZXcuY29uc3RydWN0b3IoYnVmZmVyLCBkYXRhVmlldy5ieXRlT2Zmc2V0LCBkYXRhVmlldy5ieXRlTGVuZ3RoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjbG9uZURhdGFWaWV3O1xuIiwiLyoqIFVzZWQgdG8gbWF0Y2ggYFJlZ0V4cGAgZmxhZ3MgZnJvbSB0aGVpciBjb2VyY2VkIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVGbGFncyA9IC9cXHcqJC87XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNsb25lIG9mIGByZWdleHBgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gcmVnZXhwIFRoZSByZWdleHAgdG8gY2xvbmUuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgcmVnZXhwLlxuICovXG5mdW5jdGlvbiBjbG9uZVJlZ0V4cChyZWdleHApIHtcbiAgdmFyIHJlc3VsdCA9IG5ldyByZWdleHAuY29uc3RydWN0b3IocmVnZXhwLnNvdXJjZSwgcmVGbGFncy5leGVjKHJlZ2V4cCkpO1xuICByZXN1bHQubGFzdEluZGV4ID0gcmVnZXhwLmxhc3RJbmRleDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjbG9uZVJlZ0V4cDtcbiIsInZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19TeW1ib2wnKTtcblxuLyoqIFVzZWQgdG8gY29udmVydCBzeW1ib2xzIHRvIHByaW1pdGl2ZXMgYW5kIHN0cmluZ3MuICovXG52YXIgc3ltYm9sUHJvdG8gPSBTeW1ib2wgPyBTeW1ib2wucHJvdG90eXBlIDogdW5kZWZpbmVkLFxuICAgIHN5bWJvbFZhbHVlT2YgPSBzeW1ib2xQcm90byA/IHN5bWJvbFByb3RvLnZhbHVlT2YgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNsb25lIG9mIHRoZSBgc3ltYm9sYCBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzeW1ib2wgVGhlIHN5bWJvbCBvYmplY3QgdG8gY2xvbmUuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgc3ltYm9sIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gY2xvbmVTeW1ib2woc3ltYm9sKSB7XG4gIHJldHVybiBzeW1ib2xWYWx1ZU9mID8gT2JqZWN0KHN5bWJvbFZhbHVlT2YuY2FsbChzeW1ib2wpKSA6IHt9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNsb25lU3ltYm9sO1xuIiwidmFyIGNsb25lQXJyYXlCdWZmZXIgPSByZXF1aXJlKCcuL19jbG9uZUFycmF5QnVmZmVyJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNsb25lIG9mIGB0eXBlZEFycmF5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHR5cGVkQXJyYXkgVGhlIHR5cGVkIGFycmF5IHRvIGNsb25lLlxuICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCB0eXBlZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gY2xvbmVUeXBlZEFycmF5KHR5cGVkQXJyYXksIGlzRGVlcCkge1xuICB2YXIgYnVmZmVyID0gaXNEZWVwID8gY2xvbmVBcnJheUJ1ZmZlcih0eXBlZEFycmF5LmJ1ZmZlcikgOiB0eXBlZEFycmF5LmJ1ZmZlcjtcbiAgcmV0dXJuIG5ldyB0eXBlZEFycmF5LmNvbnN0cnVjdG9yKGJ1ZmZlciwgdHlwZWRBcnJheS5ieXRlT2Zmc2V0LCB0eXBlZEFycmF5Lmxlbmd0aCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2xvbmVUeXBlZEFycmF5O1xuIiwidmFyIGlzU3ltYm9sID0gcmVxdWlyZSgnLi9pc1N5bWJvbCcpO1xuXG4vKipcbiAqIENvbXBhcmVzIHZhbHVlcyB0byBzb3J0IHRoZW0gaW4gYXNjZW5kaW5nIG9yZGVyLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHNvcnQgb3JkZXIgaW5kaWNhdG9yIGZvciBgdmFsdWVgLlxuICovXG5mdW5jdGlvbiBjb21wYXJlQXNjZW5kaW5nKHZhbHVlLCBvdGhlcikge1xuICBpZiAodmFsdWUgIT09IG90aGVyKSB7XG4gICAgdmFyIHZhbElzRGVmaW5lZCA9IHZhbHVlICE9PSB1bmRlZmluZWQsXG4gICAgICAgIHZhbElzTnVsbCA9IHZhbHVlID09PSBudWxsLFxuICAgICAgICB2YWxJc1JlZmxleGl2ZSA9IHZhbHVlID09PSB2YWx1ZSxcbiAgICAgICAgdmFsSXNTeW1ib2wgPSBpc1N5bWJvbCh2YWx1ZSk7XG5cbiAgICB2YXIgb3RoSXNEZWZpbmVkID0gb3RoZXIgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgb3RoSXNOdWxsID0gb3RoZXIgPT09IG51bGwsXG4gICAgICAgIG90aElzUmVmbGV4aXZlID0gb3RoZXIgPT09IG90aGVyLFxuICAgICAgICBvdGhJc1N5bWJvbCA9IGlzU3ltYm9sKG90aGVyKTtcblxuICAgIGlmICgoIW90aElzTnVsbCAmJiAhb3RoSXNTeW1ib2wgJiYgIXZhbElzU3ltYm9sICYmIHZhbHVlID4gb3RoZXIpIHx8XG4gICAgICAgICh2YWxJc1N5bWJvbCAmJiBvdGhJc0RlZmluZWQgJiYgb3RoSXNSZWZsZXhpdmUgJiYgIW90aElzTnVsbCAmJiAhb3RoSXNTeW1ib2wpIHx8XG4gICAgICAgICh2YWxJc051bGwgJiYgb3RoSXNEZWZpbmVkICYmIG90aElzUmVmbGV4aXZlKSB8fFxuICAgICAgICAoIXZhbElzRGVmaW5lZCAmJiBvdGhJc1JlZmxleGl2ZSkgfHxcbiAgICAgICAgIXZhbElzUmVmbGV4aXZlKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgaWYgKCghdmFsSXNOdWxsICYmICF2YWxJc1N5bWJvbCAmJiAhb3RoSXNTeW1ib2wgJiYgdmFsdWUgPCBvdGhlcikgfHxcbiAgICAgICAgKG90aElzU3ltYm9sICYmIHZhbElzRGVmaW5lZCAmJiB2YWxJc1JlZmxleGl2ZSAmJiAhdmFsSXNOdWxsICYmICF2YWxJc1N5bWJvbCkgfHxcbiAgICAgICAgKG90aElzTnVsbCAmJiB2YWxJc0RlZmluZWQgJiYgdmFsSXNSZWZsZXhpdmUpIHx8XG4gICAgICAgICghb3RoSXNEZWZpbmVkICYmIHZhbElzUmVmbGV4aXZlKSB8fFxuICAgICAgICAhb3RoSXNSZWZsZXhpdmUpIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29tcGFyZUFzY2VuZGluZztcbiIsInZhciBjb21wYXJlQXNjZW5kaW5nID0gcmVxdWlyZSgnLi9fY29tcGFyZUFzY2VuZGluZycpO1xuXG4vKipcbiAqIFVzZWQgYnkgYF8ub3JkZXJCeWAgdG8gY29tcGFyZSBtdWx0aXBsZSBwcm9wZXJ0aWVzIG9mIGEgdmFsdWUgdG8gYW5vdGhlclxuICogYW5kIHN0YWJsZSBzb3J0IHRoZW0uXG4gKlxuICogSWYgYG9yZGVyc2AgaXMgdW5zcGVjaWZpZWQsIGFsbCB2YWx1ZXMgYXJlIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIuIE90aGVyd2lzZSxcbiAqIHNwZWNpZnkgYW4gb3JkZXIgb2YgXCJkZXNjXCIgZm9yIGRlc2NlbmRpbmcgb3IgXCJhc2NcIiBmb3IgYXNjZW5kaW5nIHNvcnQgb3JkZXJcbiAqIG9mIGNvcnJlc3BvbmRpbmcgdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge2Jvb2xlYW5bXXxzdHJpbmdbXX0gb3JkZXJzIFRoZSBvcmRlciB0byBzb3J0IGJ5IGZvciBlYWNoIHByb3BlcnR5LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc29ydCBvcmRlciBpbmRpY2F0b3IgZm9yIGBvYmplY3RgLlxuICovXG5mdW5jdGlvbiBjb21wYXJlTXVsdGlwbGUob2JqZWN0LCBvdGhlciwgb3JkZXJzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgb2JqQ3JpdGVyaWEgPSBvYmplY3QuY3JpdGVyaWEsXG4gICAgICBvdGhDcml0ZXJpYSA9IG90aGVyLmNyaXRlcmlhLFxuICAgICAgbGVuZ3RoID0gb2JqQ3JpdGVyaWEubGVuZ3RoLFxuICAgICAgb3JkZXJzTGVuZ3RoID0gb3JkZXJzLmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciByZXN1bHQgPSBjb21wYXJlQXNjZW5kaW5nKG9iakNyaXRlcmlhW2luZGV4XSwgb3RoQ3JpdGVyaWFbaW5kZXhdKTtcbiAgICBpZiAocmVzdWx0KSB7XG4gICAgICBpZiAoaW5kZXggPj0gb3JkZXJzTGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICB2YXIgb3JkZXIgPSBvcmRlcnNbaW5kZXhdO1xuICAgICAgcmV0dXJuIHJlc3VsdCAqIChvcmRlciA9PSAnZGVzYycgPyAtMSA6IDEpO1xuICAgIH1cbiAgfVxuICAvLyBGaXhlcyBhbiBgQXJyYXkjc29ydGAgYnVnIGluIHRoZSBKUyBlbmdpbmUgZW1iZWRkZWQgaW4gQWRvYmUgYXBwbGljYXRpb25zXG4gIC8vIHRoYXQgY2F1c2VzIGl0LCB1bmRlciBjZXJ0YWluIGNpcmN1bXN0YW5jZXMsIHRvIHByb3ZpZGUgdGhlIHNhbWUgdmFsdWUgZm9yXG4gIC8vIGBvYmplY3RgIGFuZCBgb3RoZXJgLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2phc2hrZW5hcy91bmRlcnNjb3JlL3B1bGwvMTI0N1xuICAvLyBmb3IgbW9yZSBkZXRhaWxzLlxuICAvL1xuICAvLyBUaGlzIGFsc28gZW5zdXJlcyBhIHN0YWJsZSBzb3J0IGluIFY4IGFuZCBvdGhlciBlbmdpbmVzLlxuICAvLyBTZWUgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9OTAgZm9yIG1vcmUgZGV0YWlscy5cbiAgcmV0dXJuIG9iamVjdC5pbmRleCAtIG90aGVyLmluZGV4O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbXBhcmVNdWx0aXBsZTtcbiIsIi8qKlxuICogQ29waWVzIHRoZSB2YWx1ZXMgb2YgYHNvdXJjZWAgdG8gYGFycmF5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gc291cmNlIFRoZSBhcnJheSB0byBjb3B5IHZhbHVlcyBmcm9tLlxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5PVtdXSBUaGUgYXJyYXkgdG8gY29weSB2YWx1ZXMgdG8uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAqL1xuZnVuY3Rpb24gY29weUFycmF5KHNvdXJjZSwgYXJyYXkpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBzb3VyY2UubGVuZ3RoO1xuXG4gIGFycmF5IHx8IChhcnJheSA9IEFycmF5KGxlbmd0aCkpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGFycmF5W2luZGV4XSA9IHNvdXJjZVtpbmRleF07XG4gIH1cbiAgcmV0dXJuIGFycmF5O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvcHlBcnJheTtcbiIsInZhciBhc3NpZ25WYWx1ZSA9IHJlcXVpcmUoJy4vX2Fzc2lnblZhbHVlJyksXG4gICAgYmFzZUFzc2lnblZhbHVlID0gcmVxdWlyZSgnLi9fYmFzZUFzc2lnblZhbHVlJyk7XG5cbi8qKlxuICogQ29waWVzIHByb3BlcnRpZXMgb2YgYHNvdXJjZWAgdG8gYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgZnJvbS5cbiAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBpZGVudGlmaWVycyB0byBjb3B5LlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3Q9e31dIFRoZSBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIHRvLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29waWVkIHZhbHVlcy5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGNvcHlPYmplY3Qoc291cmNlLCBwcm9wcywgb2JqZWN0LCBjdXN0b21pemVyKSB7XG4gIHZhciBpc05ldyA9ICFvYmplY3Q7XG4gIG9iamVjdCB8fCAob2JqZWN0ID0ge30pO1xuXG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGtleSA9IHByb3BzW2luZGV4XTtcblxuICAgIHZhciBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXJcbiAgICAgID8gY3VzdG9taXplcihvYmplY3Rba2V5XSwgc291cmNlW2tleV0sIGtleSwgb2JqZWN0LCBzb3VyY2UpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBuZXdWYWx1ZSA9IHNvdXJjZVtrZXldO1xuICAgIH1cbiAgICBpZiAoaXNOZXcpIHtcbiAgICAgIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb2JqZWN0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvcHlPYmplY3Q7XG4iLCJ2YXIgY29weU9iamVjdCA9IHJlcXVpcmUoJy4vX2NvcHlPYmplY3QnKSxcbiAgICBnZXRTeW1ib2xzID0gcmVxdWlyZSgnLi9fZ2V0U3ltYm9scycpO1xuXG4vKipcbiAqIENvcGllcyBvd24gc3ltYm9scyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyBmcm9tLlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3Q9e31dIFRoZSBvYmplY3QgdG8gY29weSBzeW1ib2xzIHRvLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gY29weVN5bWJvbHMoc291cmNlLCBvYmplY3QpIHtcbiAgcmV0dXJuIGNvcHlPYmplY3Qoc291cmNlLCBnZXRTeW1ib2xzKHNvdXJjZSksIG9iamVjdCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29weVN5bWJvbHM7XG4iLCJ2YXIgY29weU9iamVjdCA9IHJlcXVpcmUoJy4vX2NvcHlPYmplY3QnKSxcbiAgICBnZXRTeW1ib2xzSW4gPSByZXF1aXJlKCcuL19nZXRTeW1ib2xzSW4nKTtcblxuLyoqXG4gKiBDb3BpZXMgb3duIGFuZCBpbmhlcml0ZWQgc3ltYm9scyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyBmcm9tLlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3Q9e31dIFRoZSBvYmplY3QgdG8gY29weSBzeW1ib2xzIHRvLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gY29weVN5bWJvbHNJbihzb3VyY2UsIG9iamVjdCkge1xuICByZXR1cm4gY29weU9iamVjdChzb3VyY2UsIGdldFN5bWJvbHNJbihzb3VyY2UpLCBvYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvcHlTeW1ib2xzSW47XG4iLCJ2YXIgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG92ZXJyZWFjaGluZyBjb3JlLWpzIHNoaW1zLiAqL1xudmFyIGNvcmVKc0RhdGEgPSByb290WydfX2NvcmUtanNfc2hhcmVkX18nXTtcblxubW9kdWxlLmV4cG9ydHMgPSBjb3JlSnNEYXRhO1xuIiwidmFyIGJhc2VSZXN0ID0gcmVxdWlyZSgnLi9fYmFzZVJlc3QnKSxcbiAgICBpc0l0ZXJhdGVlQ2FsbCA9IHJlcXVpcmUoJy4vX2lzSXRlcmF0ZWVDYWxsJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uYXNzaWduYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gYXNzaWduZXIgVGhlIGZ1bmN0aW9uIHRvIGFzc2lnbiB2YWx1ZXMuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhc3NpZ25lciBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQXNzaWduZXIoYXNzaWduZXIpIHtcbiAgcmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCwgc291cmNlcykge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBzb3VyY2VzLmxlbmd0aCxcbiAgICAgICAgY3VzdG9taXplciA9IGxlbmd0aCA+IDEgPyBzb3VyY2VzW2xlbmd0aCAtIDFdIDogdW5kZWZpbmVkLFxuICAgICAgICBndWFyZCA9IGxlbmd0aCA+IDIgPyBzb3VyY2VzWzJdIDogdW5kZWZpbmVkO1xuXG4gICAgY3VzdG9taXplciA9IChhc3NpZ25lci5sZW5ndGggPiAzICYmIHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicpXG4gICAgICA/IChsZW5ndGgtLSwgY3VzdG9taXplcilcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKGd1YXJkICYmIGlzSXRlcmF0ZWVDYWxsKHNvdXJjZXNbMF0sIHNvdXJjZXNbMV0sIGd1YXJkKSkge1xuICAgICAgY3VzdG9taXplciA9IGxlbmd0aCA8IDMgPyB1bmRlZmluZWQgOiBjdXN0b21pemVyO1xuICAgICAgbGVuZ3RoID0gMTtcbiAgICB9XG4gICAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7XG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIHZhciBzb3VyY2UgPSBzb3VyY2VzW2luZGV4XTtcbiAgICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgYXNzaWduZXIob2JqZWN0LCBzb3VyY2UsIGluZGV4LCBjdXN0b21pemVyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlQXNzaWduZXI7XG4iLCJ2YXIgaXNBcnJheUxpa2UgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGBiYXNlRWFjaGAgb3IgYGJhc2VFYWNoUmlnaHRgIGZ1bmN0aW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlYWNoRnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGEgY29sbGVjdGlvbi5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYmFzZSBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQmFzZUVhY2goZWFjaEZ1bmMsIGZyb21SaWdodCkge1xuICByZXR1cm4gZnVuY3Rpb24oY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gY29sbGVjdGlvbjtcbiAgICB9XG4gICAgaWYgKCFpc0FycmF5TGlrZShjb2xsZWN0aW9uKSkge1xuICAgICAgcmV0dXJuIGVhY2hGdW5jKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKTtcbiAgICB9XG4gICAgdmFyIGxlbmd0aCA9IGNvbGxlY3Rpb24ubGVuZ3RoLFxuICAgICAgICBpbmRleCA9IGZyb21SaWdodCA/IGxlbmd0aCA6IC0xLFxuICAgICAgICBpdGVyYWJsZSA9IE9iamVjdChjb2xsZWN0aW9uKTtcblxuICAgIHdoaWxlICgoZnJvbVJpZ2h0ID8gaW5kZXgtLSA6ICsraW5kZXggPCBsZW5ndGgpKSB7XG4gICAgICBpZiAoaXRlcmF0ZWUoaXRlcmFibGVbaW5kZXhdLCBpbmRleCwgaXRlcmFibGUpID09PSBmYWxzZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvbGxlY3Rpb247XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlQmFzZUVhY2g7XG4iLCIvKipcbiAqIENyZWF0ZXMgYSBiYXNlIGZ1bmN0aW9uIGZvciBtZXRob2RzIGxpa2UgYF8uZm9ySW5gIGFuZCBgXy5mb3JPd25gLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJhc2UgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUJhc2VGb3IoZnJvbVJpZ2h0KSB7XG4gIHJldHVybiBmdW5jdGlvbihvYmplY3QsIGl0ZXJhdGVlLCBrZXlzRnVuYykge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBpdGVyYWJsZSA9IE9iamVjdChvYmplY3QpLFxuICAgICAgICBwcm9wcyA9IGtleXNGdW5jKG9iamVjdCksXG4gICAgICAgIGxlbmd0aCA9IHByb3BzLmxlbmd0aDtcblxuICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgdmFyIGtleSA9IHByb3BzW2Zyb21SaWdodCA/IGxlbmd0aCA6ICsraW5kZXhdO1xuICAgICAgaWYgKGl0ZXJhdGVlKGl0ZXJhYmxlW2tleV0sIGtleSwgaXRlcmFibGUpID09PSBmYWxzZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVCYXNlRm9yO1xuIiwidmFyIGJhc2VJdGVyYXRlZSA9IHJlcXVpcmUoJy4vX2Jhc2VJdGVyYXRlZScpLFxuICAgIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZScpLFxuICAgIGtleXMgPSByZXF1aXJlKCcuL2tleXMnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgYF8uZmluZGAgb3IgYF8uZmluZExhc3RgIGZ1bmN0aW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmaW5kSW5kZXhGdW5jIFRoZSBmdW5jdGlvbiB0byBmaW5kIHRoZSBjb2xsZWN0aW9uIGluZGV4LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZmluZCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlRmluZChmaW5kSW5kZXhGdW5jKSB7XG4gIHJldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGZyb21JbmRleCkge1xuICAgIHZhciBpdGVyYWJsZSA9IE9iamVjdChjb2xsZWN0aW9uKTtcbiAgICBpZiAoIWlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKSB7XG4gICAgICB2YXIgaXRlcmF0ZWUgPSBiYXNlSXRlcmF0ZWUocHJlZGljYXRlLCAzKTtcbiAgICAgIGNvbGxlY3Rpb24gPSBrZXlzKGNvbGxlY3Rpb24pO1xuICAgICAgcHJlZGljYXRlID0gZnVuY3Rpb24oa2V5KSB7IHJldHVybiBpdGVyYXRlZShpdGVyYWJsZVtrZXldLCBrZXksIGl0ZXJhYmxlKTsgfTtcbiAgICB9XG4gICAgdmFyIGluZGV4ID0gZmluZEluZGV4RnVuYyhjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGZyb21JbmRleCk7XG4gICAgcmV0dXJuIGluZGV4ID4gLTEgPyBpdGVyYWJsZVtpdGVyYXRlZSA/IGNvbGxlY3Rpb25baW5kZXhdIDogaW5kZXhdIDogdW5kZWZpbmVkO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZUZpbmQ7XG4iLCJ2YXIgYmFzZVJhbmdlID0gcmVxdWlyZSgnLi9fYmFzZVJhbmdlJyksXG4gICAgaXNJdGVyYXRlZUNhbGwgPSByZXF1aXJlKCcuL19pc0l0ZXJhdGVlQ2FsbCcpLFxuICAgIHRvRmluaXRlID0gcmVxdWlyZSgnLi90b0Zpbml0ZScpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBgXy5yYW5nZWAgb3IgYF8ucmFuZ2VSaWdodGAgZnVuY3Rpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcmFuZ2UgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVJhbmdlKGZyb21SaWdodCkge1xuICByZXR1cm4gZnVuY3Rpb24oc3RhcnQsIGVuZCwgc3RlcCkge1xuICAgIGlmIChzdGVwICYmIHR5cGVvZiBzdGVwICE9ICdudW1iZXInICYmIGlzSXRlcmF0ZWVDYWxsKHN0YXJ0LCBlbmQsIHN0ZXApKSB7XG4gICAgICBlbmQgPSBzdGVwID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvLyBFbnN1cmUgdGhlIHNpZ24gb2YgYC0wYCBpcyBwcmVzZXJ2ZWQuXG4gICAgc3RhcnQgPSB0b0Zpbml0ZShzdGFydCk7XG4gICAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbmQgPSBzdGFydDtcbiAgICAgIHN0YXJ0ID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgZW5kID0gdG9GaW5pdGUoZW5kKTtcbiAgICB9XG4gICAgc3RlcCA9IHN0ZXAgPT09IHVuZGVmaW5lZCA/IChzdGFydCA8IGVuZCA/IDEgOiAtMSkgOiB0b0Zpbml0ZShzdGVwKTtcbiAgICByZXR1cm4gYmFzZVJhbmdlKHN0YXJ0LCBlbmQsIHN0ZXAsIGZyb21SaWdodCk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlUmFuZ2U7XG4iLCJ2YXIgU2V0ID0gcmVxdWlyZSgnLi9fU2V0JyksXG4gICAgbm9vcCA9IHJlcXVpcmUoJy4vbm9vcCcpLFxuICAgIHNldFRvQXJyYXkgPSByZXF1aXJlKCcuL19zZXRUb0FycmF5Jyk7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIElORklOSVRZID0gMSAvIDA7XG5cbi8qKlxuICogQ3JlYXRlcyBhIHNldCBvYmplY3Qgb2YgYHZhbHVlc2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIGFkZCB0byB0aGUgc2V0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IHNldC5cbiAqL1xudmFyIGNyZWF0ZVNldCA9ICEoU2V0ICYmICgxIC8gc2V0VG9BcnJheShuZXcgU2V0KFssLTBdKSlbMV0pID09IElORklOSVRZKSA/IG5vb3AgOiBmdW5jdGlvbih2YWx1ZXMpIHtcbiAgcmV0dXJuIG5ldyBTZXQodmFsdWVzKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlU2V0O1xuIiwidmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJy4vX2dldE5hdGl2ZScpO1xuXG52YXIgZGVmaW5lUHJvcGVydHkgPSAoZnVuY3Rpb24oKSB7XG4gIHRyeSB7XG4gICAgdmFyIGZ1bmMgPSBnZXROYXRpdmUoT2JqZWN0LCAnZGVmaW5lUHJvcGVydHknKTtcbiAgICBmdW5jKHt9LCAnJywge30pO1xuICAgIHJldHVybiBmdW5jO1xuICB9IGNhdGNoIChlKSB7fVxufSgpKTtcblxubW9kdWxlLmV4cG9ydHMgPSBkZWZpbmVQcm9wZXJ0eTtcbiIsInZhciBTZXRDYWNoZSA9IHJlcXVpcmUoJy4vX1NldENhY2hlJyksXG4gICAgYXJyYXlTb21lID0gcmVxdWlyZSgnLi9fYXJyYXlTb21lJyksXG4gICAgY2FjaGVIYXMgPSByZXF1aXJlKCcuL19jYWNoZUhhcycpO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciB2YWx1ZSBjb21wYXJpc29ucy4gKi9cbnZhciBDT01QQVJFX1BBUlRJQUxfRkxBRyA9IDEsXG4gICAgQ09NUEFSRV9VTk9SREVSRURfRkxBRyA9IDI7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbERlZXBgIGZvciBhcnJheXMgd2l0aCBzdXBwb3J0IGZvclxuICogcGFydGlhbCBkZWVwIGNvbXBhcmlzb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7QXJyYXl9IG90aGVyIFRoZSBvdGhlciBhcnJheSB0byBjb21wYXJlLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhY2sgVHJhY2tzIHRyYXZlcnNlZCBgYXJyYXlgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGFycmF5cyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBlcXVhbEFycmF5cyhhcnJheSwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgdmFyIGlzUGFydGlhbCA9IGJpdG1hc2sgJiBDT01QQVJFX1BBUlRJQUxfRkxBRyxcbiAgICAgIGFyckxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgIG90aExlbmd0aCA9IG90aGVyLmxlbmd0aDtcblxuICBpZiAoYXJyTGVuZ3RoICE9IG90aExlbmd0aCAmJiAhKGlzUGFydGlhbCAmJiBvdGhMZW5ndGggPiBhcnJMZW5ndGgpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIENoZWNrIHRoYXQgY3ljbGljIHZhbHVlcyBhcmUgZXF1YWwuXG4gIHZhciBhcnJTdGFja2VkID0gc3RhY2suZ2V0KGFycmF5KTtcbiAgdmFyIG90aFN0YWNrZWQgPSBzdGFjay5nZXQob3RoZXIpO1xuICBpZiAoYXJyU3RhY2tlZCAmJiBvdGhTdGFja2VkKSB7XG4gICAgcmV0dXJuIGFyclN0YWNrZWQgPT0gb3RoZXIgJiYgb3RoU3RhY2tlZCA9PSBhcnJheTtcbiAgfVxuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIHJlc3VsdCA9IHRydWUsXG4gICAgICBzZWVuID0gKGJpdG1hc2sgJiBDT01QQVJFX1VOT1JERVJFRF9GTEFHKSA/IG5ldyBTZXRDYWNoZSA6IHVuZGVmaW5lZDtcblxuICBzdGFjay5zZXQoYXJyYXksIG90aGVyKTtcbiAgc3RhY2suc2V0KG90aGVyLCBhcnJheSk7XG5cbiAgLy8gSWdub3JlIG5vbi1pbmRleCBwcm9wZXJ0aWVzLlxuICB3aGlsZSAoKytpbmRleCA8IGFyckxlbmd0aCkge1xuICAgIHZhciBhcnJWYWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgb3RoVmFsdWUgPSBvdGhlcltpbmRleF07XG5cbiAgICBpZiAoY3VzdG9taXplcikge1xuICAgICAgdmFyIGNvbXBhcmVkID0gaXNQYXJ0aWFsXG4gICAgICAgID8gY3VzdG9taXplcihvdGhWYWx1ZSwgYXJyVmFsdWUsIGluZGV4LCBvdGhlciwgYXJyYXksIHN0YWNrKVxuICAgICAgICA6IGN1c3RvbWl6ZXIoYXJyVmFsdWUsIG90aFZhbHVlLCBpbmRleCwgYXJyYXksIG90aGVyLCBzdGFjayk7XG4gICAgfVxuICAgIGlmIChjb21wYXJlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoY29tcGFyZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICAvLyBSZWN1cnNpdmVseSBjb21wYXJlIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgIGlmIChzZWVuKSB7XG4gICAgICBpZiAoIWFycmF5U29tZShvdGhlciwgZnVuY3Rpb24ob3RoVmFsdWUsIG90aEluZGV4KSB7XG4gICAgICAgICAgICBpZiAoIWNhY2hlSGFzKHNlZW4sIG90aEluZGV4KSAmJlxuICAgICAgICAgICAgICAgIChhcnJWYWx1ZSA9PT0gb3RoVmFsdWUgfHwgZXF1YWxGdW5jKGFyclZhbHVlLCBvdGhWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spKSkge1xuICAgICAgICAgICAgICByZXR1cm4gc2Vlbi5wdXNoKG90aEluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSkge1xuICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghKFxuICAgICAgICAgIGFyclZhbHVlID09PSBvdGhWYWx1ZSB8fFxuICAgICAgICAgICAgZXF1YWxGdW5jKGFyclZhbHVlLCBvdGhWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spXG4gICAgICAgICkpIHtcbiAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHN0YWNrWydkZWxldGUnXShhcnJheSk7XG4gIHN0YWNrWydkZWxldGUnXShvdGhlcik7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXF1YWxBcnJheXM7XG4iLCJ2YXIgU3ltYm9sID0gcmVxdWlyZSgnLi9fU3ltYm9sJyksXG4gICAgVWludDhBcnJheSA9IHJlcXVpcmUoJy4vX1VpbnQ4QXJyYXknKSxcbiAgICBlcSA9IHJlcXVpcmUoJy4vZXEnKSxcbiAgICBlcXVhbEFycmF5cyA9IHJlcXVpcmUoJy4vX2VxdWFsQXJyYXlzJyksXG4gICAgbWFwVG9BcnJheSA9IHJlcXVpcmUoJy4vX21hcFRvQXJyYXknKSxcbiAgICBzZXRUb0FycmF5ID0gcmVxdWlyZSgnLi9fc2V0VG9BcnJheScpO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciB2YWx1ZSBjb21wYXJpc29ucy4gKi9cbnZhciBDT01QQVJFX1BBUlRJQUxfRkxBRyA9IDEsXG4gICAgQ09NUEFSRV9VTk9SREVSRURfRkxBRyA9IDI7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBib29sVGFnID0gJ1tvYmplY3QgQm9vbGVhbl0nLFxuICAgIGRhdGVUYWcgPSAnW29iamVjdCBEYXRlXScsXG4gICAgZXJyb3JUYWcgPSAnW29iamVjdCBFcnJvcl0nLFxuICAgIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nLFxuICAgIG51bWJlclRhZyA9ICdbb2JqZWN0IE51bWJlcl0nLFxuICAgIHJlZ2V4cFRhZyA9ICdbb2JqZWN0IFJlZ0V4cF0nLFxuICAgIHNldFRhZyA9ICdbb2JqZWN0IFNldF0nLFxuICAgIHN0cmluZ1RhZyA9ICdbb2JqZWN0IFN0cmluZ10nLFxuICAgIHN5bWJvbFRhZyA9ICdbb2JqZWN0IFN5bWJvbF0nO1xuXG52YXIgYXJyYXlCdWZmZXJUYWcgPSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nLFxuICAgIGRhdGFWaWV3VGFnID0gJ1tvYmplY3QgRGF0YVZpZXddJztcblxuLyoqIFVzZWQgdG8gY29udmVydCBzeW1ib2xzIHRvIHByaW1pdGl2ZXMgYW5kIHN0cmluZ3MuICovXG52YXIgc3ltYm9sUHJvdG8gPSBTeW1ib2wgPyBTeW1ib2wucHJvdG90eXBlIDogdW5kZWZpbmVkLFxuICAgIHN5bWJvbFZhbHVlT2YgPSBzeW1ib2xQcm90byA/IHN5bWJvbFByb3RvLnZhbHVlT2YgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbERlZXBgIGZvciBjb21wYXJpbmcgb2JqZWN0cyBvZlxuICogdGhlIHNhbWUgYHRvU3RyaW5nVGFnYC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBmdW5jdGlvbiBvbmx5IHN1cHBvcnRzIGNvbXBhcmluZyB2YWx1ZXMgd2l0aCB0YWdzIG9mXG4gKiBgQm9vbGVhbmAsIGBEYXRlYCwgYEVycm9yYCwgYE51bWJlcmAsIGBSZWdFeHBgLCBvciBgU3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZyBUaGUgYHRvU3RyaW5nVGFnYCBvZiB0aGUgb2JqZWN0cyB0byBjb21wYXJlLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhY2sgVHJhY2tzIHRyYXZlcnNlZCBgb2JqZWN0YCBhbmQgYG90aGVyYCBvYmplY3RzLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGVxdWFsQnlUYWcob2JqZWN0LCBvdGhlciwgdGFnLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKSB7XG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSBkYXRhVmlld1RhZzpcbiAgICAgIGlmICgob2JqZWN0LmJ5dGVMZW5ndGggIT0gb3RoZXIuYnl0ZUxlbmd0aCkgfHxcbiAgICAgICAgICAob2JqZWN0LmJ5dGVPZmZzZXQgIT0gb3RoZXIuYnl0ZU9mZnNldCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgb2JqZWN0ID0gb2JqZWN0LmJ1ZmZlcjtcbiAgICAgIG90aGVyID0gb3RoZXIuYnVmZmVyO1xuXG4gICAgY2FzZSBhcnJheUJ1ZmZlclRhZzpcbiAgICAgIGlmICgob2JqZWN0LmJ5dGVMZW5ndGggIT0gb3RoZXIuYnl0ZUxlbmd0aCkgfHxcbiAgICAgICAgICAhZXF1YWxGdW5jKG5ldyBVaW50OEFycmF5KG9iamVjdCksIG5ldyBVaW50OEFycmF5KG90aGVyKSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICBjYXNlIGJvb2xUYWc6XG4gICAgY2FzZSBkYXRlVGFnOlxuICAgIGNhc2UgbnVtYmVyVGFnOlxuICAgICAgLy8gQ29lcmNlIGJvb2xlYW5zIHRvIGAxYCBvciBgMGAgYW5kIGRhdGVzIHRvIG1pbGxpc2Vjb25kcy5cbiAgICAgIC8vIEludmFsaWQgZGF0ZXMgYXJlIGNvZXJjZWQgdG8gYE5hTmAuXG4gICAgICByZXR1cm4gZXEoK29iamVjdCwgK290aGVyKTtcblxuICAgIGNhc2UgZXJyb3JUYWc6XG4gICAgICByZXR1cm4gb2JqZWN0Lm5hbWUgPT0gb3RoZXIubmFtZSAmJiBvYmplY3QubWVzc2FnZSA9PSBvdGhlci5tZXNzYWdlO1xuXG4gICAgY2FzZSByZWdleHBUYWc6XG4gICAgY2FzZSBzdHJpbmdUYWc6XG4gICAgICAvLyBDb2VyY2UgcmVnZXhlcyB0byBzdHJpbmdzIGFuZCB0cmVhdCBzdHJpbmdzLCBwcmltaXRpdmVzIGFuZCBvYmplY3RzLFxuICAgICAgLy8gYXMgZXF1YWwuIFNlZSBodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcmVnZXhwLnByb3RvdHlwZS50b3N0cmluZ1xuICAgICAgLy8gZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgIHJldHVybiBvYmplY3QgPT0gKG90aGVyICsgJycpO1xuXG4gICAgY2FzZSBtYXBUYWc6XG4gICAgICB2YXIgY29udmVydCA9IG1hcFRvQXJyYXk7XG5cbiAgICBjYXNlIHNldFRhZzpcbiAgICAgIHZhciBpc1BhcnRpYWwgPSBiaXRtYXNrICYgQ09NUEFSRV9QQVJUSUFMX0ZMQUc7XG4gICAgICBjb252ZXJ0IHx8IChjb252ZXJ0ID0gc2V0VG9BcnJheSk7XG5cbiAgICAgIGlmIChvYmplY3Quc2l6ZSAhPSBvdGhlci5zaXplICYmICFpc1BhcnRpYWwpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgLy8gQXNzdW1lIGN5Y2xpYyB2YWx1ZXMgYXJlIGVxdWFsLlxuICAgICAgdmFyIHN0YWNrZWQgPSBzdGFjay5nZXQob2JqZWN0KTtcbiAgICAgIGlmIChzdGFja2VkKSB7XG4gICAgICAgIHJldHVybiBzdGFja2VkID09IG90aGVyO1xuICAgICAgfVxuICAgICAgYml0bWFzayB8PSBDT01QQVJFX1VOT1JERVJFRF9GTEFHO1xuXG4gICAgICAvLyBSZWN1cnNpdmVseSBjb21wYXJlIG9iamVjdHMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgIHN0YWNrLnNldChvYmplY3QsIG90aGVyKTtcbiAgICAgIHZhciByZXN1bHQgPSBlcXVhbEFycmF5cyhjb252ZXJ0KG9iamVjdCksIGNvbnZlcnQob3RoZXIpLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKTtcbiAgICAgIHN0YWNrWydkZWxldGUnXShvYmplY3QpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcblxuICAgIGNhc2Ugc3ltYm9sVGFnOlxuICAgICAgaWYgKHN5bWJvbFZhbHVlT2YpIHtcbiAgICAgICAgcmV0dXJuIHN5bWJvbFZhbHVlT2YuY2FsbChvYmplY3QpID09IHN5bWJvbFZhbHVlT2YuY2FsbChvdGhlcik7XG4gICAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGVxdWFsQnlUYWc7XG4iLCJ2YXIgZ2V0QWxsS2V5cyA9IHJlcXVpcmUoJy4vX2dldEFsbEtleXMnKTtcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgdmFsdWUgY29tcGFyaXNvbnMuICovXG52YXIgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgPSAxO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUlzRXF1YWxEZWVwYCBmb3Igb2JqZWN0cyB3aXRoIHN1cHBvcnQgZm9yXG4gKiBwYXJ0aWFsIGRlZXAgY29tcGFyaXNvbnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHtPYmplY3R9IG90aGVyIFRoZSBvdGhlciBvYmplY3QgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGJhc2VJc0VxdWFsYCBmb3IgbW9yZSBkZXRhaWxzLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY3VzdG9taXplciBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLlxuICogQHBhcmFtIHtPYmplY3R9IHN0YWNrIFRyYWNrcyB0cmF2ZXJzZWQgYG9iamVjdGAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgb2JqZWN0cyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBlcXVhbE9iamVjdHMob2JqZWN0LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaykge1xuICB2YXIgaXNQYXJ0aWFsID0gYml0bWFzayAmIENPTVBBUkVfUEFSVElBTF9GTEFHLFxuICAgICAgb2JqUHJvcHMgPSBnZXRBbGxLZXlzKG9iamVjdCksXG4gICAgICBvYmpMZW5ndGggPSBvYmpQcm9wcy5sZW5ndGgsXG4gICAgICBvdGhQcm9wcyA9IGdldEFsbEtleXMob3RoZXIpLFxuICAgICAgb3RoTGVuZ3RoID0gb3RoUHJvcHMubGVuZ3RoO1xuXG4gIGlmIChvYmpMZW5ndGggIT0gb3RoTGVuZ3RoICYmICFpc1BhcnRpYWwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIGluZGV4ID0gb2JqTGVuZ3RoO1xuICB3aGlsZSAoaW5kZXgtLSkge1xuICAgIHZhciBrZXkgPSBvYmpQcm9wc1tpbmRleF07XG4gICAgaWYgKCEoaXNQYXJ0aWFsID8ga2V5IGluIG90aGVyIDogaGFzT3duUHJvcGVydHkuY2FsbChvdGhlciwga2V5KSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgLy8gQ2hlY2sgdGhhdCBjeWNsaWMgdmFsdWVzIGFyZSBlcXVhbC5cbiAgdmFyIG9ialN0YWNrZWQgPSBzdGFjay5nZXQob2JqZWN0KTtcbiAgdmFyIG90aFN0YWNrZWQgPSBzdGFjay5nZXQob3RoZXIpO1xuICBpZiAob2JqU3RhY2tlZCAmJiBvdGhTdGFja2VkKSB7XG4gICAgcmV0dXJuIG9ialN0YWNrZWQgPT0gb3RoZXIgJiYgb3RoU3RhY2tlZCA9PSBvYmplY3Q7XG4gIH1cbiAgdmFyIHJlc3VsdCA9IHRydWU7XG4gIHN0YWNrLnNldChvYmplY3QsIG90aGVyKTtcbiAgc3RhY2suc2V0KG90aGVyLCBvYmplY3QpO1xuXG4gIHZhciBza2lwQ3RvciA9IGlzUGFydGlhbDtcbiAgd2hpbGUgKCsraW5kZXggPCBvYmpMZW5ndGgpIHtcbiAgICBrZXkgPSBvYmpQcm9wc1tpbmRleF07XG4gICAgdmFyIG9ialZhbHVlID0gb2JqZWN0W2tleV0sXG4gICAgICAgIG90aFZhbHVlID0gb3RoZXJba2V5XTtcblxuICAgIGlmIChjdXN0b21pemVyKSB7XG4gICAgICB2YXIgY29tcGFyZWQgPSBpc1BhcnRpYWxcbiAgICAgICAgPyBjdXN0b21pemVyKG90aFZhbHVlLCBvYmpWYWx1ZSwga2V5LCBvdGhlciwgb2JqZWN0LCBzdGFjaylcbiAgICAgICAgOiBjdXN0b21pemVyKG9ialZhbHVlLCBvdGhWYWx1ZSwga2V5LCBvYmplY3QsIG90aGVyLCBzdGFjayk7XG4gICAgfVxuICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbXBhcmUgb2JqZWN0cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgIGlmICghKGNvbXBhcmVkID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IChvYmpWYWx1ZSA9PT0gb3RoVmFsdWUgfHwgZXF1YWxGdW5jKG9ialZhbHVlLCBvdGhWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spKVxuICAgICAgICAgIDogY29tcGFyZWRcbiAgICAgICAgKSkge1xuICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgc2tpcEN0b3IgfHwgKHNraXBDdG9yID0ga2V5ID09ICdjb25zdHJ1Y3RvcicpO1xuICB9XG4gIGlmIChyZXN1bHQgJiYgIXNraXBDdG9yKSB7XG4gICAgdmFyIG9iakN0b3IgPSBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICAgIG90aEN0b3IgPSBvdGhlci5jb25zdHJ1Y3RvcjtcblxuICAgIC8vIE5vbiBgT2JqZWN0YCBvYmplY3QgaW5zdGFuY2VzIHdpdGggZGlmZmVyZW50IGNvbnN0cnVjdG9ycyBhcmUgbm90IGVxdWFsLlxuICAgIGlmIChvYmpDdG9yICE9IG90aEN0b3IgJiZcbiAgICAgICAgKCdjb25zdHJ1Y3RvcicgaW4gb2JqZWN0ICYmICdjb25zdHJ1Y3RvcicgaW4gb3RoZXIpICYmXG4gICAgICAgICEodHlwZW9mIG9iakN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBvYmpDdG9yIGluc3RhbmNlb2Ygb2JqQ3RvciAmJlxuICAgICAgICAgIHR5cGVvZiBvdGhDdG9yID09ICdmdW5jdGlvbicgJiYgb3RoQ3RvciBpbnN0YW5jZW9mIG90aEN0b3IpKSB7XG4gICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgc3RhY2tbJ2RlbGV0ZSddKG9iamVjdCk7XG4gIHN0YWNrWydkZWxldGUnXShvdGhlcik7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXF1YWxPYmplY3RzO1xuIiwidmFyIGZsYXR0ZW4gPSByZXF1aXJlKCcuL2ZsYXR0ZW4nKSxcbiAgICBvdmVyUmVzdCA9IHJlcXVpcmUoJy4vX292ZXJSZXN0JyksXG4gICAgc2V0VG9TdHJpbmcgPSByZXF1aXJlKCcuL19zZXRUb1N0cmluZycpO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZVJlc3RgIHdoaWNoIGZsYXR0ZW5zIHRoZSByZXN0IGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGZsYXRSZXN0KGZ1bmMpIHtcbiAgcmV0dXJuIHNldFRvU3RyaW5nKG92ZXJSZXN0KGZ1bmMsIHVuZGVmaW5lZCwgZmxhdHRlbiksIGZ1bmMgKyAnJyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZmxhdFJlc3Q7XG4iLCIvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGdsb2JhbGAgZnJvbSBOb2RlLmpzLiAqL1xudmFyIGZyZWVHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbCAmJiBnbG9iYWwuT2JqZWN0ID09PSBPYmplY3QgJiYgZ2xvYmFsO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZyZWVHbG9iYWw7XG4iLCJ2YXIgYmFzZUdldEFsbEtleXMgPSByZXF1aXJlKCcuL19iYXNlR2V0QWxsS2V5cycpLFxuICAgIGdldFN5bWJvbHMgPSByZXF1aXJlKCcuL19nZXRTeW1ib2xzJyksXG4gICAga2V5cyA9IHJlcXVpcmUoJy4va2V5cycpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2Ygb3duIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMuXG4gKi9cbmZ1bmN0aW9uIGdldEFsbEtleXMob2JqZWN0KSB7XG4gIHJldHVybiBiYXNlR2V0QWxsS2V5cyhvYmplY3QsIGtleXMsIGdldFN5bWJvbHMpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEFsbEtleXM7XG4iLCJ2YXIgYmFzZUdldEFsbEtleXMgPSByZXF1aXJlKCcuL19iYXNlR2V0QWxsS2V5cycpLFxuICAgIGdldFN5bWJvbHNJbiA9IHJlcXVpcmUoJy4vX2dldFN5bWJvbHNJbicpLFxuICAgIGtleXNJbiA9IHJlcXVpcmUoJy4va2V5c0luJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIGFuZFxuICogc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scy5cbiAqL1xuZnVuY3Rpb24gZ2V0QWxsS2V5c0luKG9iamVjdCkge1xuICByZXR1cm4gYmFzZUdldEFsbEtleXMob2JqZWN0LCBrZXlzSW4sIGdldFN5bWJvbHNJbik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QWxsS2V5c0luO1xuIiwidmFyIGlzS2V5YWJsZSA9IHJlcXVpcmUoJy4vX2lzS2V5YWJsZScpO1xuXG4vKipcbiAqIEdldHMgdGhlIGRhdGEgZm9yIGBtYXBgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gbWFwIFRoZSBtYXAgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSByZWZlcmVuY2Uga2V5LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1hcCBkYXRhLlxuICovXG5mdW5jdGlvbiBnZXRNYXBEYXRhKG1hcCwga2V5KSB7XG4gIHZhciBkYXRhID0gbWFwLl9fZGF0YV9fO1xuICByZXR1cm4gaXNLZXlhYmxlKGtleSlcbiAgICA/IGRhdGFbdHlwZW9mIGtleSA9PSAnc3RyaW5nJyA/ICdzdHJpbmcnIDogJ2hhc2gnXVxuICAgIDogZGF0YS5tYXA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0TWFwRGF0YTtcbiIsInZhciBpc1N0cmljdENvbXBhcmFibGUgPSByZXF1aXJlKCcuL19pc1N0cmljdENvbXBhcmFibGUnKSxcbiAgICBrZXlzID0gcmVxdWlyZSgnLi9rZXlzJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgcHJvcGVydHkgbmFtZXMsIHZhbHVlcywgYW5kIGNvbXBhcmUgZmxhZ3Mgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbWF0Y2ggZGF0YSBvZiBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gZ2V0TWF0Y2hEYXRhKG9iamVjdCkge1xuICB2YXIgcmVzdWx0ID0ga2V5cyhvYmplY3QpLFxuICAgICAgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDtcblxuICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICB2YXIga2V5ID0gcmVzdWx0W2xlbmd0aF0sXG4gICAgICAgIHZhbHVlID0gb2JqZWN0W2tleV07XG5cbiAgICByZXN1bHRbbGVuZ3RoXSA9IFtrZXksIHZhbHVlLCBpc1N0cmljdENvbXBhcmFibGUodmFsdWUpXTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldE1hdGNoRGF0YTtcbiIsInZhciBiYXNlSXNOYXRpdmUgPSByZXF1aXJlKCcuL19iYXNlSXNOYXRpdmUnKSxcbiAgICBnZXRWYWx1ZSA9IHJlcXVpcmUoJy4vX2dldFZhbHVlJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgbmF0aXZlIGZ1bmN0aW9uIGF0IGBrZXlgIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIG1ldGhvZCB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZnVuY3Rpb24gaWYgaXQncyBuYXRpdmUsIGVsc2UgYHVuZGVmaW5lZGAuXG4gKi9cbmZ1bmN0aW9uIGdldE5hdGl2ZShvYmplY3QsIGtleSkge1xuICB2YXIgdmFsdWUgPSBnZXRWYWx1ZShvYmplY3QsIGtleSk7XG4gIHJldHVybiBiYXNlSXNOYXRpdmUodmFsdWUpID8gdmFsdWUgOiB1bmRlZmluZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0TmF0aXZlO1xuIiwidmFyIG92ZXJBcmcgPSByZXF1aXJlKCcuL19vdmVyQXJnJyk7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIGdldFByb3RvdHlwZSA9IG92ZXJBcmcoT2JqZWN0LmdldFByb3RvdHlwZU9mLCBPYmplY3QpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFByb3RvdHlwZTtcbiIsInZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19TeW1ib2wnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG5hdGl2ZU9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHN5bVRvU3RyaW5nVGFnID0gU3ltYm9sID8gU3ltYm9sLnRvU3RyaW5nVGFnIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUdldFRhZ2Agd2hpY2ggaWdub3JlcyBgU3ltYm9sLnRvU3RyaW5nVGFnYCB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcmF3IGB0b1N0cmluZ1RhZ2AuXG4gKi9cbmZ1bmN0aW9uIGdldFJhd1RhZyh2YWx1ZSkge1xuICB2YXIgaXNPd24gPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBzeW1Ub1N0cmluZ1RhZyksXG4gICAgICB0YWcgPSB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ107XG5cbiAgdHJ5IHtcbiAgICB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ10gPSB1bmRlZmluZWQ7XG4gICAgdmFyIHVubWFza2VkID0gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge31cblxuICB2YXIgcmVzdWx0ID0gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIGlmICh1bm1hc2tlZCkge1xuICAgIGlmIChpc093bikge1xuICAgICAgdmFsdWVbc3ltVG9TdHJpbmdUYWddID0gdGFnO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgdmFsdWVbc3ltVG9TdHJpbmdUYWddO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFJhd1RhZztcbiIsInZhciBhcnJheUZpbHRlciA9IHJlcXVpcmUoJy4vX2FycmF5RmlsdGVyJyksXG4gICAgc3R1YkFycmF5ID0gcmVxdWlyZSgnLi9zdHViQXJyYXknKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgcHJvcGVydHlJc0VudW1lcmFibGUgPSBvYmplY3RQcm90by5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZUdldFN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBlbnVtZXJhYmxlIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2Ygc3ltYm9scy5cbiAqL1xudmFyIGdldFN5bWJvbHMgPSAhbmF0aXZlR2V0U3ltYm9scyA/IHN0dWJBcnJheSA6IGZ1bmN0aW9uKG9iamVjdCkge1xuICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7XG4gIHJldHVybiBhcnJheUZpbHRlcihuYXRpdmVHZXRTeW1ib2xzKG9iamVjdCksIGZ1bmN0aW9uKHN5bWJvbCkge1xuICAgIHJldHVybiBwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKG9iamVjdCwgc3ltYm9sKTtcbiAgfSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFN5bWJvbHM7XG4iLCJ2YXIgYXJyYXlQdXNoID0gcmVxdWlyZSgnLi9fYXJyYXlQdXNoJyksXG4gICAgZ2V0UHJvdG90eXBlID0gcmVxdWlyZSgnLi9fZ2V0UHJvdG90eXBlJyksXG4gICAgZ2V0U3ltYm9scyA9IHJlcXVpcmUoJy4vX2dldFN5bWJvbHMnKSxcbiAgICBzdHViQXJyYXkgPSByZXF1aXJlKCcuL3N0dWJBcnJheScpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlR2V0U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHN5bWJvbHMuXG4gKi9cbnZhciBnZXRTeW1ib2xzSW4gPSAhbmF0aXZlR2V0U3ltYm9scyA/IHN0dWJBcnJheSA6IGZ1bmN0aW9uKG9iamVjdCkge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHdoaWxlIChvYmplY3QpIHtcbiAgICBhcnJheVB1c2gocmVzdWx0LCBnZXRTeW1ib2xzKG9iamVjdCkpO1xuICAgIG9iamVjdCA9IGdldFByb3RvdHlwZShvYmplY3QpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFN5bWJvbHNJbjtcbiIsInZhciBEYXRhVmlldyA9IHJlcXVpcmUoJy4vX0RhdGFWaWV3JyksXG4gICAgTWFwID0gcmVxdWlyZSgnLi9fTWFwJyksXG4gICAgUHJvbWlzZSA9IHJlcXVpcmUoJy4vX1Byb21pc2UnKSxcbiAgICBTZXQgPSByZXF1aXJlKCcuL19TZXQnKSxcbiAgICBXZWFrTWFwID0gcmVxdWlyZSgnLi9fV2Vha01hcCcpLFxuICAgIGJhc2VHZXRUYWcgPSByZXF1aXJlKCcuL19iYXNlR2V0VGFnJyksXG4gICAgdG9Tb3VyY2UgPSByZXF1aXJlKCcuL190b1NvdXJjZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXG4gICAgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XScsXG4gICAgcHJvbWlzZVRhZyA9ICdbb2JqZWN0IFByb21pc2VdJyxcbiAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJyxcbiAgICB3ZWFrTWFwVGFnID0gJ1tvYmplY3QgV2Vha01hcF0nO1xuXG52YXIgZGF0YVZpZXdUYWcgPSAnW29iamVjdCBEYXRhVmlld10nO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgbWFwcywgc2V0cywgYW5kIHdlYWttYXBzLiAqL1xudmFyIGRhdGFWaWV3Q3RvclN0cmluZyA9IHRvU291cmNlKERhdGFWaWV3KSxcbiAgICBtYXBDdG9yU3RyaW5nID0gdG9Tb3VyY2UoTWFwKSxcbiAgICBwcm9taXNlQ3RvclN0cmluZyA9IHRvU291cmNlKFByb21pc2UpLFxuICAgIHNldEN0b3JTdHJpbmcgPSB0b1NvdXJjZShTZXQpLFxuICAgIHdlYWtNYXBDdG9yU3RyaW5nID0gdG9Tb3VyY2UoV2Vha01hcCk7XG5cbi8qKlxuICogR2V0cyB0aGUgYHRvU3RyaW5nVGFnYCBvZiBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGB0b1N0cmluZ1RhZ2AuXG4gKi9cbnZhciBnZXRUYWcgPSBiYXNlR2V0VGFnO1xuXG4vLyBGYWxsYmFjayBmb3IgZGF0YSB2aWV3cywgbWFwcywgc2V0cywgYW5kIHdlYWsgbWFwcyBpbiBJRSAxMSBhbmQgcHJvbWlzZXMgaW4gTm9kZS5qcyA8IDYuXG5pZiAoKERhdGFWaWV3ICYmIGdldFRhZyhuZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDEpKSkgIT0gZGF0YVZpZXdUYWcpIHx8XG4gICAgKE1hcCAmJiBnZXRUYWcobmV3IE1hcCkgIT0gbWFwVGFnKSB8fFxuICAgIChQcm9taXNlICYmIGdldFRhZyhQcm9taXNlLnJlc29sdmUoKSkgIT0gcHJvbWlzZVRhZykgfHxcbiAgICAoU2V0ICYmIGdldFRhZyhuZXcgU2V0KSAhPSBzZXRUYWcpIHx8XG4gICAgKFdlYWtNYXAgJiYgZ2V0VGFnKG5ldyBXZWFrTWFwKSAhPSB3ZWFrTWFwVGFnKSkge1xuICBnZXRUYWcgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHZhciByZXN1bHQgPSBiYXNlR2V0VGFnKHZhbHVlKSxcbiAgICAgICAgQ3RvciA9IHJlc3VsdCA9PSBvYmplY3RUYWcgPyB2YWx1ZS5jb25zdHJ1Y3RvciA6IHVuZGVmaW5lZCxcbiAgICAgICAgY3RvclN0cmluZyA9IEN0b3IgPyB0b1NvdXJjZShDdG9yKSA6ICcnO1xuXG4gICAgaWYgKGN0b3JTdHJpbmcpIHtcbiAgICAgIHN3aXRjaCAoY3RvclN0cmluZykge1xuICAgICAgICBjYXNlIGRhdGFWaWV3Q3RvclN0cmluZzogcmV0dXJuIGRhdGFWaWV3VGFnO1xuICAgICAgICBjYXNlIG1hcEN0b3JTdHJpbmc6IHJldHVybiBtYXBUYWc7XG4gICAgICAgIGNhc2UgcHJvbWlzZUN0b3JTdHJpbmc6IHJldHVybiBwcm9taXNlVGFnO1xuICAgICAgICBjYXNlIHNldEN0b3JTdHJpbmc6IHJldHVybiBzZXRUYWc7XG4gICAgICAgIGNhc2Ugd2Vha01hcEN0b3JTdHJpbmc6IHJldHVybiB3ZWFrTWFwVGFnO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFRhZztcbiIsIi8qKlxuICogR2V0cyB0aGUgdmFsdWUgYXQgYGtleWAgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGdldFZhbHVlKG9iamVjdCwga2V5KSB7XG4gIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFtrZXldO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFZhbHVlO1xuIiwidmFyIGNhc3RQYXRoID0gcmVxdWlyZSgnLi9fY2FzdFBhdGgnKSxcbiAgICBpc0FyZ3VtZW50cyA9IHJlcXVpcmUoJy4vaXNBcmd1bWVudHMnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNJbmRleCA9IHJlcXVpcmUoJy4vX2lzSW5kZXgnKSxcbiAgICBpc0xlbmd0aCA9IHJlcXVpcmUoJy4vaXNMZW5ndGgnKSxcbiAgICB0b0tleSA9IHJlcXVpcmUoJy4vX3RvS2V5Jyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGBwYXRoYCBleGlzdHMgb24gYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHRvIGNoZWNrLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaGFzRnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2sgcHJvcGVydGllcy5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgcGF0aGAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGhhc1BhdGgob2JqZWN0LCBwYXRoLCBoYXNGdW5jKSB7XG4gIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuXG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGgsXG4gICAgICByZXN1bHQgPSBmYWxzZTtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBrZXkgPSB0b0tleShwYXRoW2luZGV4XSk7XG4gICAgaWYgKCEocmVzdWx0ID0gb2JqZWN0ICE9IG51bGwgJiYgaGFzRnVuYyhvYmplY3QsIGtleSkpKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgb2JqZWN0ID0gb2JqZWN0W2tleV07XG4gIH1cbiAgaWYgKHJlc3VsdCB8fCArK2luZGV4ICE9IGxlbmd0aCkge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgbGVuZ3RoID0gb2JqZWN0ID09IG51bGwgPyAwIDogb2JqZWN0Lmxlbmd0aDtcbiAgcmV0dXJuICEhbGVuZ3RoICYmIGlzTGVuZ3RoKGxlbmd0aCkgJiYgaXNJbmRleChrZXksIGxlbmd0aCkgJiZcbiAgICAoaXNBcnJheShvYmplY3QpIHx8IGlzQXJndW1lbnRzKG9iamVjdCkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc1BhdGg7XG4iLCIvKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgY2hhcmFjdGVyIGNsYXNzZXMuICovXG52YXIgcnNBc3RyYWxSYW5nZSA9ICdcXFxcdWQ4MDAtXFxcXHVkZmZmJyxcbiAgICByc0NvbWJvTWFya3NSYW5nZSA9ICdcXFxcdTAzMDAtXFxcXHUwMzZmJyxcbiAgICByZUNvbWJvSGFsZk1hcmtzUmFuZ2UgPSAnXFxcXHVmZTIwLVxcXFx1ZmUyZicsXG4gICAgcnNDb21ib1N5bWJvbHNSYW5nZSA9ICdcXFxcdTIwZDAtXFxcXHUyMGZmJyxcbiAgICByc0NvbWJvUmFuZ2UgPSByc0NvbWJvTWFya3NSYW5nZSArIHJlQ29tYm9IYWxmTWFya3NSYW5nZSArIHJzQ29tYm9TeW1ib2xzUmFuZ2UsXG4gICAgcnNWYXJSYW5nZSA9ICdcXFxcdWZlMGVcXFxcdWZlMGYnO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgY2FwdHVyZSBncm91cHMuICovXG52YXIgcnNaV0ogPSAnXFxcXHUyMDBkJztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IHN0cmluZ3Mgd2l0aCBbemVyby13aWR0aCBqb2luZXJzIG9yIGNvZGUgcG9pbnRzIGZyb20gdGhlIGFzdHJhbCBwbGFuZXNdKGh0dHA6Ly9lZXYuZWUvYmxvZy8yMDE1LzA5LzEyL2RhcmstY29ybmVycy1vZi11bmljb2RlLykuICovXG52YXIgcmVIYXNVbmljb2RlID0gUmVnRXhwKCdbJyArIHJzWldKICsgcnNBc3RyYWxSYW5nZSAgKyByc0NvbWJvUmFuZ2UgKyByc1ZhclJhbmdlICsgJ10nKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHN0cmluZ2AgY29udGFpbnMgVW5pY29kZSBzeW1ib2xzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhIHN5bWJvbCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBoYXNVbmljb2RlKHN0cmluZykge1xuICByZXR1cm4gcmVIYXNVbmljb2RlLnRlc3Qoc3RyaW5nKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNVbmljb2RlO1xuIiwidmFyIG5hdGl2ZUNyZWF0ZSA9IHJlcXVpcmUoJy4vX25hdGl2ZUNyZWF0ZScpO1xuXG4vKipcbiAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIGhhc2guXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGNsZWFyXG4gKiBAbWVtYmVyT2YgSGFzaFxuICovXG5mdW5jdGlvbiBoYXNoQ2xlYXIoKSB7XG4gIHRoaXMuX19kYXRhX18gPSBuYXRpdmVDcmVhdGUgPyBuYXRpdmVDcmVhdGUobnVsbCkgOiB7fTtcbiAgdGhpcy5zaXplID0gMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNoQ2xlYXI7XG4iLCIvKipcbiAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBoYXNoLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBkZWxldGVcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKiBAcGFyYW0ge09iamVjdH0gaGFzaCBUaGUgaGFzaCB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaGFzaERlbGV0ZShrZXkpIHtcbiAgdmFyIHJlc3VsdCA9IHRoaXMuaGFzKGtleSkgJiYgZGVsZXRlIHRoaXMuX19kYXRhX19ba2V5XTtcbiAgdGhpcy5zaXplIC09IHJlc3VsdCA/IDEgOiAwO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc2hEZWxldGU7XG4iLCJ2YXIgbmF0aXZlQ3JlYXRlID0gcmVxdWlyZSgnLi9fbmF0aXZlQ3JlYXRlJyk7XG5cbi8qKiBVc2VkIHRvIHN0YW5kLWluIGZvciBgdW5kZWZpbmVkYCBoYXNoIHZhbHVlcy4gKi9cbnZhciBIQVNIX1VOREVGSU5FRCA9ICdfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBHZXRzIHRoZSBoYXNoIHZhbHVlIGZvciBga2V5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZ2V0XG4gKiBAbWVtYmVyT2YgSGFzaFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGhhc2hHZXQoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgaWYgKG5hdGl2ZUNyZWF0ZSkge1xuICAgIHZhciByZXN1bHQgPSBkYXRhW2tleV07XG4gICAgcmV0dXJuIHJlc3VsdCA9PT0gSEFTSF9VTkRFRklORUQgPyB1bmRlZmluZWQgOiByZXN1bHQ7XG4gIH1cbiAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KSA/IGRhdGFba2V5XSA6IHVuZGVmaW5lZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNoR2V0O1xuIiwidmFyIG5hdGl2ZUNyZWF0ZSA9IHJlcXVpcmUoJy4vX25hdGl2ZUNyZWF0ZScpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIGhhc2ggdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgSGFzaFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGhhc2hIYXMoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgcmV0dXJuIG5hdGl2ZUNyZWF0ZSA/IChkYXRhW2tleV0gIT09IHVuZGVmaW5lZCkgOiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzaEhhcztcbiIsInZhciBuYXRpdmVDcmVhdGUgPSByZXF1aXJlKCcuL19uYXRpdmVDcmVhdGUnKTtcblxuLyoqIFVzZWQgdG8gc3RhbmQtaW4gZm9yIGB1bmRlZmluZWRgIGhhc2ggdmFsdWVzLiAqL1xudmFyIEhBU0hfVU5ERUZJTkVEID0gJ19fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18nO1xuXG4vKipcbiAqIFNldHMgdGhlIGhhc2ggYGtleWAgdG8gYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgc2V0XG4gKiBAbWVtYmVyT2YgSGFzaFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBoYXNoIGluc3RhbmNlLlxuICovXG5mdW5jdGlvbiBoYXNoU2V0KGtleSwgdmFsdWUpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICB0aGlzLnNpemUgKz0gdGhpcy5oYXMoa2V5KSA/IDAgOiAxO1xuICBkYXRhW2tleV0gPSAobmF0aXZlQ3JlYXRlICYmIHZhbHVlID09PSB1bmRlZmluZWQpID8gSEFTSF9VTkRFRklORUQgOiB2YWx1ZTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzaFNldDtcbiIsIi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgYW4gYXJyYXkgY2xvbmUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjbG9uZS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgaW5pdGlhbGl6ZWQgY2xvbmUuXG4gKi9cbmZ1bmN0aW9uIGluaXRDbG9uZUFycmF5KGFycmF5KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICByZXN1bHQgPSBuZXcgYXJyYXkuY29uc3RydWN0b3IobGVuZ3RoKTtcblxuICAvLyBBZGQgcHJvcGVydGllcyBhc3NpZ25lZCBieSBgUmVnRXhwI2V4ZWNgLlxuICBpZiAobGVuZ3RoICYmIHR5cGVvZiBhcnJheVswXSA9PSAnc3RyaW5nJyAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGFycmF5LCAnaW5kZXgnKSkge1xuICAgIHJlc3VsdC5pbmRleCA9IGFycmF5LmluZGV4O1xuICAgIHJlc3VsdC5pbnB1dCA9IGFycmF5LmlucHV0O1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaW5pdENsb25lQXJyYXk7XG4iLCJ2YXIgY2xvbmVBcnJheUJ1ZmZlciA9IHJlcXVpcmUoJy4vX2Nsb25lQXJyYXlCdWZmZXInKSxcbiAgICBjbG9uZURhdGFWaWV3ID0gcmVxdWlyZSgnLi9fY2xvbmVEYXRhVmlldycpLFxuICAgIGNsb25lUmVnRXhwID0gcmVxdWlyZSgnLi9fY2xvbmVSZWdFeHAnKSxcbiAgICBjbG9uZVN5bWJvbCA9IHJlcXVpcmUoJy4vX2Nsb25lU3ltYm9sJyksXG4gICAgY2xvbmVUeXBlZEFycmF5ID0gcmVxdWlyZSgnLi9fY2xvbmVUeXBlZEFycmF5Jyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBib29sVGFnID0gJ1tvYmplY3QgQm9vbGVhbl0nLFxuICAgIGRhdGVUYWcgPSAnW29iamVjdCBEYXRlXScsXG4gICAgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXG4gICAgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXScsXG4gICAgcmVnZXhwVGFnID0gJ1tvYmplY3QgUmVnRXhwXScsXG4gICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XScsXG4gICAgc3RyaW5nVGFnID0gJ1tvYmplY3QgU3RyaW5nXScsXG4gICAgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXSc7XG5cbnZhciBhcnJheUJ1ZmZlclRhZyA9ICdbb2JqZWN0IEFycmF5QnVmZmVyXScsXG4gICAgZGF0YVZpZXdUYWcgPSAnW29iamVjdCBEYXRhVmlld10nLFxuICAgIGZsb2F0MzJUYWcgPSAnW29iamVjdCBGbG9hdDMyQXJyYXldJyxcbiAgICBmbG9hdDY0VGFnID0gJ1tvYmplY3QgRmxvYXQ2NEFycmF5XScsXG4gICAgaW50OFRhZyA9ICdbb2JqZWN0IEludDhBcnJheV0nLFxuICAgIGludDE2VGFnID0gJ1tvYmplY3QgSW50MTZBcnJheV0nLFxuICAgIGludDMyVGFnID0gJ1tvYmplY3QgSW50MzJBcnJheV0nLFxuICAgIHVpbnQ4VGFnID0gJ1tvYmplY3QgVWludDhBcnJheV0nLFxuICAgIHVpbnQ4Q2xhbXBlZFRhZyA9ICdbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XScsXG4gICAgdWludDE2VGFnID0gJ1tvYmplY3QgVWludDE2QXJyYXldJyxcbiAgICB1aW50MzJUYWcgPSAnW29iamVjdCBVaW50MzJBcnJheV0nO1xuXG4vKipcbiAqIEluaXRpYWxpemVzIGFuIG9iamVjdCBjbG9uZSBiYXNlZCBvbiBpdHMgYHRvU3RyaW5nVGFnYC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBmdW5jdGlvbiBvbmx5IHN1cHBvcnRzIGNsb25pbmcgdmFsdWVzIHdpdGggdGFncyBvZlxuICogYEJvb2xlYW5gLCBgRGF0ZWAsIGBFcnJvcmAsIGBNYXBgLCBgTnVtYmVyYCwgYFJlZ0V4cGAsIGBTZXRgLCBvciBgU3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNsb25lLlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZyBUaGUgYHRvU3RyaW5nVGFnYCBvZiB0aGUgb2JqZWN0IHRvIGNsb25lLlxuICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGluaXRpYWxpemVkIGNsb25lLlxuICovXG5mdW5jdGlvbiBpbml0Q2xvbmVCeVRhZyhvYmplY3QsIHRhZywgaXNEZWVwKSB7XG4gIHZhciBDdG9yID0gb2JqZWN0LmNvbnN0cnVjdG9yO1xuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgYXJyYXlCdWZmZXJUYWc6XG4gICAgICByZXR1cm4gY2xvbmVBcnJheUJ1ZmZlcihvYmplY3QpO1xuXG4gICAgY2FzZSBib29sVGFnOlxuICAgIGNhc2UgZGF0ZVRhZzpcbiAgICAgIHJldHVybiBuZXcgQ3Rvcigrb2JqZWN0KTtcblxuICAgIGNhc2UgZGF0YVZpZXdUYWc6XG4gICAgICByZXR1cm4gY2xvbmVEYXRhVmlldyhvYmplY3QsIGlzRGVlcCk7XG5cbiAgICBjYXNlIGZsb2F0MzJUYWc6IGNhc2UgZmxvYXQ2NFRhZzpcbiAgICBjYXNlIGludDhUYWc6IGNhc2UgaW50MTZUYWc6IGNhc2UgaW50MzJUYWc6XG4gICAgY2FzZSB1aW50OFRhZzogY2FzZSB1aW50OENsYW1wZWRUYWc6IGNhc2UgdWludDE2VGFnOiBjYXNlIHVpbnQzMlRhZzpcbiAgICAgIHJldHVybiBjbG9uZVR5cGVkQXJyYXkob2JqZWN0LCBpc0RlZXApO1xuXG4gICAgY2FzZSBtYXBUYWc6XG4gICAgICByZXR1cm4gbmV3IEN0b3I7XG5cbiAgICBjYXNlIG51bWJlclRhZzpcbiAgICBjYXNlIHN0cmluZ1RhZzpcbiAgICAgIHJldHVybiBuZXcgQ3RvcihvYmplY3QpO1xuXG4gICAgY2FzZSByZWdleHBUYWc6XG4gICAgICByZXR1cm4gY2xvbmVSZWdFeHAob2JqZWN0KTtcblxuICAgIGNhc2Ugc2V0VGFnOlxuICAgICAgcmV0dXJuIG5ldyBDdG9yO1xuXG4gICAgY2FzZSBzeW1ib2xUYWc6XG4gICAgICByZXR1cm4gY2xvbmVTeW1ib2wob2JqZWN0KTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGluaXRDbG9uZUJ5VGFnO1xuIiwidmFyIGJhc2VDcmVhdGUgPSByZXF1aXJlKCcuL19iYXNlQ3JlYXRlJyksXG4gICAgZ2V0UHJvdG90eXBlID0gcmVxdWlyZSgnLi9fZ2V0UHJvdG90eXBlJyksXG4gICAgaXNQcm90b3R5cGUgPSByZXF1aXJlKCcuL19pc1Byb3RvdHlwZScpO1xuXG4vKipcbiAqIEluaXRpYWxpemVzIGFuIG9iamVjdCBjbG9uZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNsb25lLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgaW5pdGlhbGl6ZWQgY2xvbmUuXG4gKi9cbmZ1bmN0aW9uIGluaXRDbG9uZU9iamVjdChvYmplY3QpIHtcbiAgcmV0dXJuICh0eXBlb2Ygb2JqZWN0LmNvbnN0cnVjdG9yID09ICdmdW5jdGlvbicgJiYgIWlzUHJvdG90eXBlKG9iamVjdCkpXG4gICAgPyBiYXNlQ3JlYXRlKGdldFByb3RvdHlwZShvYmplY3QpKVxuICAgIDoge307XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaW5pdENsb25lT2JqZWN0O1xuIiwidmFyIFN5bWJvbCA9IHJlcXVpcmUoJy4vX1N5bWJvbCcpLFxuICAgIGlzQXJndW1lbnRzID0gcmVxdWlyZSgnLi9pc0FyZ3VtZW50cycpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgc3ByZWFkYWJsZVN5bWJvbCA9IFN5bWJvbCA/IFN5bWJvbC5pc0NvbmNhdFNwcmVhZGFibGUgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBmbGF0dGVuYWJsZSBgYXJndW1lbnRzYCBvYmplY3Qgb3IgYXJyYXkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZmxhdHRlbmFibGUsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNGbGF0dGVuYWJsZSh2YWx1ZSkge1xuICByZXR1cm4gaXNBcnJheSh2YWx1ZSkgfHwgaXNBcmd1bWVudHModmFsdWUpIHx8XG4gICAgISEoc3ByZWFkYWJsZVN5bWJvbCAmJiB2YWx1ZSAmJiB2YWx1ZVtzcHJlYWRhYmxlU3ltYm9sXSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNGbGF0dGVuYWJsZTtcbiIsIi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIE1BWF9TQUZFX0lOVEVHRVIgPSA5MDA3MTk5MjU0NzQwOTkxO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgdW5zaWduZWQgaW50ZWdlciB2YWx1ZXMuICovXG52YXIgcmVJc1VpbnQgPSAvXig/OjB8WzEtOV1cXGQqKSQvO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgYXJyYXktbGlrZSBpbmRleC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcGFyYW0ge251bWJlcn0gW2xlbmd0aD1NQVhfU0FGRV9JTlRFR0VSXSBUaGUgdXBwZXIgYm91bmRzIG9mIGEgdmFsaWQgaW5kZXguXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGluZGV4LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzSW5kZXgodmFsdWUsIGxlbmd0aCkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgbGVuZ3RoID0gbGVuZ3RoID09IG51bGwgPyBNQVhfU0FGRV9JTlRFR0VSIDogbGVuZ3RoO1xuXG4gIHJldHVybiAhIWxlbmd0aCAmJlxuICAgICh0eXBlID09ICdudW1iZXInIHx8XG4gICAgICAodHlwZSAhPSAnc3ltYm9sJyAmJiByZUlzVWludC50ZXN0KHZhbHVlKSkpICYmXG4gICAgICAgICh2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDwgbGVuZ3RoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0luZGV4O1xuIiwidmFyIGVxID0gcmVxdWlyZSgnLi9lcScpLFxuICAgIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZScpLFxuICAgIGlzSW5kZXggPSByZXF1aXJlKCcuL19pc0luZGV4JyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0Jyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBhcmd1bWVudHMgYXJlIGZyb20gYW4gaXRlcmF0ZWUgY2FsbC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIHZhbHVlIGFyZ3VtZW50LlxuICogQHBhcmFtIHsqfSBpbmRleCBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIGluZGV4IG9yIGtleSBhcmd1bWVudC5cbiAqIEBwYXJhbSB7Kn0gb2JqZWN0IFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgb2JqZWN0IGFyZ3VtZW50LlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBhcmd1bWVudHMgYXJlIGZyb20gYW4gaXRlcmF0ZWUgY2FsbCxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzSXRlcmF0ZWVDYWxsKHZhbHVlLCBpbmRleCwgb2JqZWN0KSB7XG4gIGlmICghaXNPYmplY3Qob2JqZWN0KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgdHlwZSA9IHR5cGVvZiBpbmRleDtcbiAgaWYgKHR5cGUgPT0gJ251bWJlcidcbiAgICAgICAgPyAoaXNBcnJheUxpa2Uob2JqZWN0KSAmJiBpc0luZGV4KGluZGV4LCBvYmplY3QubGVuZ3RoKSlcbiAgICAgICAgOiAodHlwZSA9PSAnc3RyaW5nJyAmJiBpbmRleCBpbiBvYmplY3QpXG4gICAgICApIHtcbiAgICByZXR1cm4gZXEob2JqZWN0W2luZGV4XSwgdmFsdWUpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0l0ZXJhdGVlQ2FsbDtcbiIsInZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNTeW1ib2wgPSByZXF1aXJlKCcuL2lzU3ltYm9sJyk7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIHByb3BlcnR5IG5hbWVzIHdpdGhpbiBwcm9wZXJ0eSBwYXRocy4gKi9cbnZhciByZUlzRGVlcFByb3AgPSAvXFwufFxcWyg/OlteW1xcXV0qfChbXCInXSkoPzooPyFcXDEpW15cXFxcXXxcXFxcLikqP1xcMSlcXF0vLFxuICAgIHJlSXNQbGFpblByb3AgPSAvXlxcdyokLztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHByb3BlcnR5IG5hbWUgYW5kIG5vdCBhIHByb3BlcnR5IHBhdGguXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkga2V5cyBvbi5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcHJvcGVydHkgbmFtZSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0tleSh2YWx1ZSwgb2JqZWN0KSB7XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgaWYgKHR5cGUgPT0gJ251bWJlcicgfHwgdHlwZSA9PSAnc3ltYm9sJyB8fCB0eXBlID09ICdib29sZWFuJyB8fFxuICAgICAgdmFsdWUgPT0gbnVsbCB8fCBpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gcmVJc1BsYWluUHJvcC50ZXN0KHZhbHVlKSB8fCAhcmVJc0RlZXBQcm9wLnRlc3QodmFsdWUpIHx8XG4gICAgKG9iamVjdCAhPSBudWxsICYmIHZhbHVlIGluIE9iamVjdChvYmplY3QpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0tleTtcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgc3VpdGFibGUgZm9yIHVzZSBhcyB1bmlxdWUgb2JqZWN0IGtleS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0tleWFibGUodmFsdWUpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiAodHlwZSA9PSAnc3RyaW5nJyB8fCB0eXBlID09ICdudW1iZXInIHx8IHR5cGUgPT0gJ3N5bWJvbCcgfHwgdHlwZSA9PSAnYm9vbGVhbicpXG4gICAgPyAodmFsdWUgIT09ICdfX3Byb3RvX18nKVxuICAgIDogKHZhbHVlID09PSBudWxsKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0tleWFibGU7XG4iLCJ2YXIgY29yZUpzRGF0YSA9IHJlcXVpcmUoJy4vX2NvcmVKc0RhdGEnKTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG1ldGhvZHMgbWFzcXVlcmFkaW5nIGFzIG5hdGl2ZS4gKi9cbnZhciBtYXNrU3JjS2V5ID0gKGZ1bmN0aW9uKCkge1xuICB2YXIgdWlkID0gL1teLl0rJC8uZXhlYyhjb3JlSnNEYXRhICYmIGNvcmVKc0RhdGEua2V5cyAmJiBjb3JlSnNEYXRhLmtleXMuSUVfUFJPVE8gfHwgJycpO1xuICByZXR1cm4gdWlkID8gKCdTeW1ib2woc3JjKV8xLicgKyB1aWQpIDogJyc7XG59KCkpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgZnVuY2AgaGFzIGl0cyBzb3VyY2UgbWFza2VkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgZnVuY2AgaXMgbWFza2VkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzTWFza2VkKGZ1bmMpIHtcbiAgcmV0dXJuICEhbWFza1NyY0tleSAmJiAobWFza1NyY0tleSBpbiBmdW5jKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc01hc2tlZDtcbiIsIi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGEgcHJvdG90eXBlIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHByb3RvdHlwZSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc1Byb3RvdHlwZSh2YWx1ZSkge1xuICB2YXIgQ3RvciA9IHZhbHVlICYmIHZhbHVlLmNvbnN0cnVjdG9yLFxuICAgICAgcHJvdG8gPSAodHlwZW9mIEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBDdG9yLnByb3RvdHlwZSkgfHwgb2JqZWN0UHJvdG87XG5cbiAgcmV0dXJuIHZhbHVlID09PSBwcm90bztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1Byb3RvdHlwZTtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSBmb3Igc3RyaWN0IGVxdWFsaXR5IGNvbXBhcmlzb25zLCBpLmUuIGA9PT1gLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlmIHN1aXRhYmxlIGZvciBzdHJpY3RcbiAqICBlcXVhbGl0eSBjb21wYXJpc29ucywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc1N0cmljdENvbXBhcmFibGUodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZSAmJiAhaXNPYmplY3QodmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzU3RyaWN0Q29tcGFyYWJsZTtcbiIsIi8qKlxuICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgbGlzdCBjYWNoZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgY2xlYXJcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlQ2xlYXIoKSB7XG4gIHRoaXMuX19kYXRhX18gPSBbXTtcbiAgdGhpcy5zaXplID0gMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsaXN0Q2FjaGVDbGVhcjtcbiIsInZhciBhc3NvY0luZGV4T2YgPSByZXF1aXJlKCcuL19hc3NvY0luZGV4T2YnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIGFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGU7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHNwbGljZSA9IGFycmF5UHJvdG8uc3BsaWNlO1xuXG4vKipcbiAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBsaXN0IGNhY2hlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBkZWxldGVcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVEZWxldGUoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgaWYgKGluZGV4IDwgMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgbGFzdEluZGV4ID0gZGF0YS5sZW5ndGggLSAxO1xuICBpZiAoaW5kZXggPT0gbGFzdEluZGV4KSB7XG4gICAgZGF0YS5wb3AoKTtcbiAgfSBlbHNlIHtcbiAgICBzcGxpY2UuY2FsbChkYXRhLCBpbmRleCwgMSk7XG4gIH1cbiAgLS10aGlzLnNpemU7XG4gIHJldHVybiB0cnVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxpc3RDYWNoZURlbGV0ZTtcbiIsInZhciBhc3NvY0luZGV4T2YgPSByZXF1aXJlKCcuL19hc3NvY0luZGV4T2YnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBsaXN0IGNhY2hlIHZhbHVlIGZvciBga2V5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZ2V0XG4gKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlR2V0KGtleSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG4gIHJldHVybiBpbmRleCA8IDAgPyB1bmRlZmluZWQgOiBkYXRhW2luZGV4XVsxXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsaXN0Q2FjaGVHZXQ7XG4iLCJ2YXIgYXNzb2NJbmRleE9mID0gcmVxdWlyZSgnLi9fYXNzb2NJbmRleE9mJyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgbGlzdCBjYWNoZSB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBoYXNcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVIYXMoa2V5KSB7XG4gIHJldHVybiBhc3NvY0luZGV4T2YodGhpcy5fX2RhdGFfXywga2V5KSA+IC0xO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxpc3RDYWNoZUhhcztcbiIsInZhciBhc3NvY0luZGV4T2YgPSByZXF1aXJlKCcuL19hc3NvY0luZGV4T2YnKTtcblxuLyoqXG4gKiBTZXRzIHRoZSBsaXN0IGNhY2hlIGBrZXlgIHRvIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIHNldFxuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBsaXN0IGNhY2hlIGluc3RhbmNlLlxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVTZXQoa2V5LCB2YWx1ZSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG4gIGlmIChpbmRleCA8IDApIHtcbiAgICArK3RoaXMuc2l6ZTtcbiAgICBkYXRhLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgfSBlbHNlIHtcbiAgICBkYXRhW2luZGV4XVsxXSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiB0aGlzO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxpc3RDYWNoZVNldDtcbiIsInZhciBIYXNoID0gcmVxdWlyZSgnLi9fSGFzaCcpLFxuICAgIExpc3RDYWNoZSA9IHJlcXVpcmUoJy4vX0xpc3RDYWNoZScpLFxuICAgIE1hcCA9IHJlcXVpcmUoJy4vX01hcCcpO1xuXG4vKipcbiAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIG1hcC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgY2xlYXJcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICovXG5mdW5jdGlvbiBtYXBDYWNoZUNsZWFyKCkge1xuICB0aGlzLnNpemUgPSAwO1xuICB0aGlzLl9fZGF0YV9fID0ge1xuICAgICdoYXNoJzogbmV3IEhhc2gsXG4gICAgJ21hcCc6IG5ldyAoTWFwIHx8IExpc3RDYWNoZSksXG4gICAgJ3N0cmluZyc6IG5ldyBIYXNoXG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwQ2FjaGVDbGVhcjtcbiIsInZhciBnZXRNYXBEYXRhID0gcmVxdWlyZSgnLi9fZ2V0TWFwRGF0YScpO1xuXG4vKipcbiAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBtYXAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGRlbGV0ZVxuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVEZWxldGUoa2V5KSB7XG4gIHZhciByZXN1bHQgPSBnZXRNYXBEYXRhKHRoaXMsIGtleSlbJ2RlbGV0ZSddKGtleSk7XG4gIHRoaXMuc2l6ZSAtPSByZXN1bHQgPyAxIDogMDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXBDYWNoZURlbGV0ZTtcbiIsInZhciBnZXRNYXBEYXRhID0gcmVxdWlyZSgnLi9fZ2V0TWFwRGF0YScpO1xuXG4vKipcbiAqIEdldHMgdGhlIG1hcCB2YWx1ZSBmb3IgYGtleWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGdldFxuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVHZXQoa2V5KSB7XG4gIHJldHVybiBnZXRNYXBEYXRhKHRoaXMsIGtleSkuZ2V0KGtleSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwQ2FjaGVHZXQ7XG4iLCJ2YXIgZ2V0TWFwRGF0YSA9IHJlcXVpcmUoJy4vX2dldE1hcERhdGEnKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBtYXAgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBtYXBDYWNoZUhhcyhrZXkpIHtcbiAgcmV0dXJuIGdldE1hcERhdGEodGhpcywga2V5KS5oYXMoa2V5KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXBDYWNoZUhhcztcbiIsInZhciBnZXRNYXBEYXRhID0gcmVxdWlyZSgnLi9fZ2V0TWFwRGF0YScpO1xuXG4vKipcbiAqIFNldHMgdGhlIG1hcCBga2V5YCB0byBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBzZXRcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBtYXAgY2FjaGUgaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlU2V0KGtleSwgdmFsdWUpIHtcbiAgdmFyIGRhdGEgPSBnZXRNYXBEYXRhKHRoaXMsIGtleSksXG4gICAgICBzaXplID0gZGF0YS5zaXplO1xuXG4gIGRhdGEuc2V0KGtleSwgdmFsdWUpO1xuICB0aGlzLnNpemUgKz0gZGF0YS5zaXplID09IHNpemUgPyAwIDogMTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwQ2FjaGVTZXQ7XG4iLCIvKipcbiAqIENvbnZlcnRzIGBtYXBgIHRvIGl0cyBrZXktdmFsdWUgcGFpcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBtYXAgVGhlIG1hcCB0byBjb252ZXJ0LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBrZXktdmFsdWUgcGFpcnMuXG4gKi9cbmZ1bmN0aW9uIG1hcFRvQXJyYXkobWFwKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgcmVzdWx0ID0gQXJyYXkobWFwLnNpemUpO1xuXG4gIG1hcC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICByZXN1bHRbKytpbmRleF0gPSBba2V5LCB2YWx1ZV07XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1hcFRvQXJyYXk7XG4iLCIvKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgbWF0Y2hlc1Byb3BlcnR5YCBmb3Igc291cmNlIHZhbHVlcyBzdWl0YWJsZVxuICogZm9yIHN0cmljdCBlcXVhbGl0eSBjb21wYXJpc29ucywgaS5lLiBgPT09YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcGFyYW0geyp9IHNyY1ZhbHVlIFRoZSB2YWx1ZSB0byBtYXRjaC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlKGtleSwgc3JjVmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0W2tleV0gPT09IHNyY1ZhbHVlICYmXG4gICAgICAoc3JjVmFsdWUgIT09IHVuZGVmaW5lZCB8fCAoa2V5IGluIE9iamVjdChvYmplY3QpKSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWF0Y2hlc1N0cmljdENvbXBhcmFibGU7XG4iLCJ2YXIgbWVtb2l6ZSA9IHJlcXVpcmUoJy4vbWVtb2l6ZScpO1xuXG4vKiogVXNlZCBhcyB0aGUgbWF4aW11bSBtZW1vaXplIGNhY2hlIHNpemUuICovXG52YXIgTUFYX01FTU9JWkVfU0laRSA9IDUwMDtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ubWVtb2l6ZWAgd2hpY2ggY2xlYXJzIHRoZSBtZW1vaXplZCBmdW5jdGlvbidzXG4gKiBjYWNoZSB3aGVuIGl0IGV4Y2VlZHMgYE1BWF9NRU1PSVpFX1NJWkVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBoYXZlIGl0cyBvdXRwdXQgbWVtb2l6ZWQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBtZW1vaXplZCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gbWVtb2l6ZUNhcHBlZChmdW5jKSB7XG4gIHZhciByZXN1bHQgPSBtZW1vaXplKGZ1bmMsIGZ1bmN0aW9uKGtleSkge1xuICAgIGlmIChjYWNoZS5zaXplID09PSBNQVhfTUVNT0laRV9TSVpFKSB7XG4gICAgICBjYWNoZS5jbGVhcigpO1xuICAgIH1cbiAgICByZXR1cm4ga2V5O1xuICB9KTtcblxuICB2YXIgY2FjaGUgPSByZXN1bHQuY2FjaGU7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWVtb2l6ZUNhcHBlZDtcbiIsInZhciBnZXROYXRpdmUgPSByZXF1aXJlKCcuL19nZXROYXRpdmUnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIG5hdGl2ZUNyZWF0ZSA9IGdldE5hdGl2ZShPYmplY3QsICdjcmVhdGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBuYXRpdmVDcmVhdGU7XG4iLCJ2YXIgb3ZlckFyZyA9IHJlcXVpcmUoJy4vX292ZXJBcmcnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZUtleXMgPSBvdmVyQXJnKE9iamVjdC5rZXlzLCBPYmplY3QpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5hdGl2ZUtleXM7XG4iLCIvKipcbiAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZVxuICogW2BPYmplY3Qua2V5c2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5rZXlzKVxuICogZXhjZXB0IHRoYXQgaXQgaW5jbHVkZXMgaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydGllcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gbmF0aXZlS2V5c0luKG9iamVjdCkge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIGlmIChvYmplY3QgIT0gbnVsbCkge1xuICAgIGZvciAodmFyIGtleSBpbiBPYmplY3Qob2JqZWN0KSkge1xuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuYXRpdmVLZXlzSW47XG4iLCJ2YXIgZnJlZUdsb2JhbCA9IHJlcXVpcmUoJy4vX2ZyZWVHbG9iYWwnKTtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBleHBvcnRzYC4gKi9cbnZhciBmcmVlRXhwb3J0cyA9IHR5cGVvZiBleHBvcnRzID09ICdvYmplY3QnICYmIGV4cG9ydHMgJiYgIWV4cG9ydHMubm9kZVR5cGUgJiYgZXhwb3J0cztcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBtb2R1bGVgLiAqL1xudmFyIGZyZWVNb2R1bGUgPSBmcmVlRXhwb3J0cyAmJiB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZSAmJiAhbW9kdWxlLm5vZGVUeXBlICYmIG1vZHVsZTtcblxuLyoqIERldGVjdCB0aGUgcG9wdWxhciBDb21tb25KUyBleHRlbnNpb24gYG1vZHVsZS5leHBvcnRzYC4gKi9cbnZhciBtb2R1bGVFeHBvcnRzID0gZnJlZU1vZHVsZSAmJiBmcmVlTW9kdWxlLmV4cG9ydHMgPT09IGZyZWVFeHBvcnRzO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYHByb2Nlc3NgIGZyb20gTm9kZS5qcy4gKi9cbnZhciBmcmVlUHJvY2VzcyA9IG1vZHVsZUV4cG9ydHMgJiYgZnJlZUdsb2JhbC5wcm9jZXNzO1xuXG4vKiogVXNlZCB0byBhY2Nlc3MgZmFzdGVyIE5vZGUuanMgaGVscGVycy4gKi9cbnZhciBub2RlVXRpbCA9IChmdW5jdGlvbigpIHtcbiAgdHJ5IHtcbiAgICAvLyBVc2UgYHV0aWwudHlwZXNgIGZvciBOb2RlLmpzIDEwKy5cbiAgICB2YXIgdHlwZXMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUucmVxdWlyZSAmJiBmcmVlTW9kdWxlLnJlcXVpcmUoJ3V0aWwnKS50eXBlcztcblxuICAgIGlmICh0eXBlcykge1xuICAgICAgcmV0dXJuIHR5cGVzO1xuICAgIH1cblxuICAgIC8vIExlZ2FjeSBgcHJvY2Vzcy5iaW5kaW5nKCd1dGlsJylgIGZvciBOb2RlLmpzIDwgMTAuXG4gICAgcmV0dXJuIGZyZWVQcm9jZXNzICYmIGZyZWVQcm9jZXNzLmJpbmRpbmcgJiYgZnJlZVByb2Nlc3MuYmluZGluZygndXRpbCcpO1xuICB9IGNhdGNoIChlKSB7fVxufSgpKTtcblxubW9kdWxlLmV4cG9ydHMgPSBub2RlVXRpbDtcbiIsIi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBuYXRpdmVPYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcgdXNpbmcgYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG9iamVjdFRvU3RyaW5nO1xuIiwiLyoqXG4gKiBDcmVhdGVzIGEgdW5hcnkgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGl0cyBhcmd1bWVudCB0cmFuc2Zvcm1lZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHRyYW5zZm9ybSBUaGUgYXJndW1lbnQgdHJhbnNmb3JtLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIG92ZXJBcmcoZnVuYywgdHJhbnNmb3JtKSB7XG4gIHJldHVybiBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gZnVuYyh0cmFuc2Zvcm0oYXJnKSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gb3ZlckFyZztcbiIsInZhciBhcHBseSA9IHJlcXVpcmUoJy4vX2FwcGx5Jyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVNYXggPSBNYXRoLm1heDtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VSZXN0YCB3aGljaCB0cmFuc2Zvcm1zIHRoZSByZXN0IGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD1mdW5jLmxlbmd0aC0xXSBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHJlc3QgcGFyYW1ldGVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gdHJhbnNmb3JtIFRoZSByZXN0IGFycmF5IHRyYW5zZm9ybS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBvdmVyUmVzdChmdW5jLCBzdGFydCwgdHJhbnNmb3JtKSB7XG4gIHN0YXJ0ID0gbmF0aXZlTWF4KHN0YXJ0ID09PSB1bmRlZmluZWQgPyAoZnVuYy5sZW5ndGggLSAxKSA6IHN0YXJ0LCAwKTtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBhcmdzID0gYXJndW1lbnRzLFxuICAgICAgICBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBuYXRpdmVNYXgoYXJncy5sZW5ndGggLSBzdGFydCwgMCksXG4gICAgICAgIGFycmF5ID0gQXJyYXkobGVuZ3RoKTtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBhcnJheVtpbmRleF0gPSBhcmdzW3N0YXJ0ICsgaW5kZXhdO1xuICAgIH1cbiAgICBpbmRleCA9IC0xO1xuICAgIHZhciBvdGhlckFyZ3MgPSBBcnJheShzdGFydCArIDEpO1xuICAgIHdoaWxlICgrK2luZGV4IDwgc3RhcnQpIHtcbiAgICAgIG90aGVyQXJnc1tpbmRleF0gPSBhcmdzW2luZGV4XTtcbiAgICB9XG4gICAgb3RoZXJBcmdzW3N0YXJ0XSA9IHRyYW5zZm9ybShhcnJheSk7XG4gICAgcmV0dXJuIGFwcGx5KGZ1bmMsIHRoaXMsIG90aGVyQXJncyk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gb3ZlclJlc3Q7XG4iLCJ2YXIgZnJlZUdsb2JhbCA9IHJlcXVpcmUoJy4vX2ZyZWVHbG9iYWwnKTtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBzZWxmYC4gKi9cbnZhciBmcmVlU2VsZiA9IHR5cGVvZiBzZWxmID09ICdvYmplY3QnICYmIHNlbGYgJiYgc2VsZi5PYmplY3QgPT09IE9iamVjdCAmJiBzZWxmO1xuXG4vKiogVXNlZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4gKi9cbnZhciByb290ID0gZnJlZUdsb2JhbCB8fCBmcmVlU2VsZiB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJvb3Q7XG4iLCIvKipcbiAqIEdldHMgdGhlIHZhbHVlIGF0IGBrZXlgLCB1bmxlc3MgYGtleWAgaXMgXCJfX3Byb3RvX19cIiBvciBcImNvbnN0cnVjdG9yXCIuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBzYWZlR2V0KG9iamVjdCwga2V5KSB7XG4gIGlmIChrZXkgPT09ICdjb25zdHJ1Y3RvcicgJiYgdHlwZW9mIG9iamVjdFtrZXldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGtleSA9PSAnX19wcm90b19fJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHJldHVybiBvYmplY3Rba2V5XTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzYWZlR2V0O1xuIiwiLyoqIFVzZWQgdG8gc3RhbmQtaW4gZm9yIGB1bmRlZmluZWRgIGhhc2ggdmFsdWVzLiAqL1xudmFyIEhBU0hfVU5ERUZJTkVEID0gJ19fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18nO1xuXG4vKipcbiAqIEFkZHMgYHZhbHVlYCB0byB0aGUgYXJyYXkgY2FjaGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGFkZFxuICogQG1lbWJlck9mIFNldENhY2hlXG4gKiBAYWxpYXMgcHVzaFxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2FjaGUuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjYWNoZSBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gc2V0Q2FjaGVBZGQodmFsdWUpIHtcbiAgdGhpcy5fX2RhdGFfXy5zZXQodmFsdWUsIEhBU0hfVU5ERUZJTkVEKTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2V0Q2FjaGVBZGQ7XG4iLCIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGluIHRoZSBhcnJheSBjYWNoZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgU2V0Q2FjaGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBzZXRDYWNoZUhhcyh2YWx1ZSkge1xuICByZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNldENhY2hlSGFzO1xuIiwiLyoqXG4gKiBDb252ZXJ0cyBgc2V0YCB0byBhbiBhcnJheSBvZiBpdHMgdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gc2V0IFRoZSBzZXQgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBzZXRUb0FycmF5KHNldCkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIHJlc3VsdCA9IEFycmF5KHNldC5zaXplKTtcblxuICBzZXQuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJlc3VsdFsrK2luZGV4XSA9IHZhbHVlO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzZXRUb0FycmF5O1xuIiwidmFyIGJhc2VTZXRUb1N0cmluZyA9IHJlcXVpcmUoJy4vX2Jhc2VTZXRUb1N0cmluZycpLFxuICAgIHNob3J0T3V0ID0gcmVxdWlyZSgnLi9fc2hvcnRPdXQnKTtcblxuLyoqXG4gKiBTZXRzIHRoZSBgdG9TdHJpbmdgIG1ldGhvZCBvZiBgZnVuY2AgdG8gcmV0dXJuIGBzdHJpbmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdHJpbmcgVGhlIGB0b1N0cmluZ2AgcmVzdWx0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBmdW5jYC5cbiAqL1xudmFyIHNldFRvU3RyaW5nID0gc2hvcnRPdXQoYmFzZVNldFRvU3RyaW5nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBzZXRUb1N0cmluZztcbiIsIi8qKiBVc2VkIHRvIGRldGVjdCBob3QgZnVuY3Rpb25zIGJ5IG51bWJlciBvZiBjYWxscyB3aXRoaW4gYSBzcGFuIG9mIG1pbGxpc2Vjb25kcy4gKi9cbnZhciBIT1RfQ09VTlQgPSA4MDAsXG4gICAgSE9UX1NQQU4gPSAxNjtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZU5vdyA9IERhdGUubm93O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0J2xsIHNob3J0IG91dCBhbmQgaW52b2tlIGBpZGVudGl0eWAgaW5zdGVhZFxuICogb2YgYGZ1bmNgIHdoZW4gaXQncyBjYWxsZWQgYEhPVF9DT1VOVGAgb3IgbW9yZSB0aW1lcyBpbiBgSE9UX1NQQU5gXG4gKiBtaWxsaXNlY29uZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc2hvcnRhYmxlIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBzaG9ydE91dChmdW5jKSB7XG4gIHZhciBjb3VudCA9IDAsXG4gICAgICBsYXN0Q2FsbGVkID0gMDtcblxuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0YW1wID0gbmF0aXZlTm93KCksXG4gICAgICAgIHJlbWFpbmluZyA9IEhPVF9TUEFOIC0gKHN0YW1wIC0gbGFzdENhbGxlZCk7XG5cbiAgICBsYXN0Q2FsbGVkID0gc3RhbXA7XG4gICAgaWYgKHJlbWFpbmluZyA+IDApIHtcbiAgICAgIGlmICgrK2NvdW50ID49IEhPVF9DT1VOVCkge1xuICAgICAgICByZXR1cm4gYXJndW1lbnRzWzBdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb3VudCA9IDA7XG4gICAgfVxuICAgIHJldHVybiBmdW5jLmFwcGx5KHVuZGVmaW5lZCwgYXJndW1lbnRzKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzaG9ydE91dDtcbiIsInZhciBMaXN0Q2FjaGUgPSByZXF1aXJlKCcuL19MaXN0Q2FjaGUnKTtcblxuLyoqXG4gKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBzdGFjay5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgY2xlYXJcbiAqIEBtZW1iZXJPZiBTdGFja1xuICovXG5mdW5jdGlvbiBzdGFja0NsZWFyKCkge1xuICB0aGlzLl9fZGF0YV9fID0gbmV3IExpc3RDYWNoZTtcbiAgdGhpcy5zaXplID0gMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdGFja0NsZWFyO1xuIiwiLyoqXG4gKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgc3RhY2suXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGRlbGV0ZVxuICogQG1lbWJlck9mIFN0YWNrXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gc3RhY2tEZWxldGUoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgIHJlc3VsdCA9IGRhdGFbJ2RlbGV0ZSddKGtleSk7XG5cbiAgdGhpcy5zaXplID0gZGF0YS5zaXplO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0YWNrRGVsZXRlO1xuIiwiLyoqXG4gKiBHZXRzIHRoZSBzdGFjayB2YWx1ZSBmb3IgYGtleWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGdldFxuICogQG1lbWJlck9mIFN0YWNrXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gc3RhY2tHZXQoa2V5KSB7XG4gIHJldHVybiB0aGlzLl9fZGF0YV9fLmdldChrZXkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0YWNrR2V0O1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYSBzdGFjayB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBoYXNcbiAqIEBtZW1iZXJPZiBTdGFja1xuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIHN0YWNrSGFzKGtleSkge1xuICByZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXMoa2V5KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdGFja0hhcztcbiIsInZhciBMaXN0Q2FjaGUgPSByZXF1aXJlKCcuL19MaXN0Q2FjaGUnKSxcbiAgICBNYXAgPSByZXF1aXJlKCcuL19NYXAnKSxcbiAgICBNYXBDYWNoZSA9IHJlcXVpcmUoJy4vX01hcENhY2hlJyk7XG5cbi8qKiBVc2VkIGFzIHRoZSBzaXplIHRvIGVuYWJsZSBsYXJnZSBhcnJheSBvcHRpbWl6YXRpb25zLiAqL1xudmFyIExBUkdFX0FSUkFZX1NJWkUgPSAyMDA7XG5cbi8qKlxuICogU2V0cyB0aGUgc3RhY2sgYGtleWAgdG8gYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgc2V0XG4gKiBAbWVtYmVyT2YgU3RhY2tcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgc3RhY2sgY2FjaGUgaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIHN0YWNrU2V0KGtleSwgdmFsdWUpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICBpZiAoZGF0YSBpbnN0YW5jZW9mIExpc3RDYWNoZSkge1xuICAgIHZhciBwYWlycyA9IGRhdGEuX19kYXRhX187XG4gICAgaWYgKCFNYXAgfHwgKHBhaXJzLmxlbmd0aCA8IExBUkdFX0FSUkFZX1NJWkUgLSAxKSkge1xuICAgICAgcGFpcnMucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgICAgdGhpcy5zaXplID0gKytkYXRhLnNpemU7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGF0YSA9IHRoaXMuX19kYXRhX18gPSBuZXcgTWFwQ2FjaGUocGFpcnMpO1xuICB9XG4gIGRhdGEuc2V0KGtleSwgdmFsdWUpO1xuICB0aGlzLnNpemUgPSBkYXRhLnNpemU7XG4gIHJldHVybiB0aGlzO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0YWNrU2V0O1xuIiwiLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uaW5kZXhPZmAgd2hpY2ggcGVyZm9ybXMgc3RyaWN0IGVxdWFsaXR5XG4gKiBjb21wYXJpc29ucyBvZiB2YWx1ZXMsIGkuZS4gYD09PWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAqL1xuZnVuY3Rpb24gc3RyaWN0SW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleCkge1xuICB2YXIgaW5kZXggPSBmcm9tSW5kZXggLSAxLFxuICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgaWYgKGFycmF5W2luZGV4XSA9PT0gdmFsdWUpIHtcbiAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0cmljdEluZGV4T2Y7XG4iLCJ2YXIgYXNjaWlTaXplID0gcmVxdWlyZSgnLi9fYXNjaWlTaXplJyksXG4gICAgaGFzVW5pY29kZSA9IHJlcXVpcmUoJy4vX2hhc1VuaWNvZGUnKSxcbiAgICB1bmljb2RlU2l6ZSA9IHJlcXVpcmUoJy4vX3VuaWNvZGVTaXplJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgaW4gYHN0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3RyaW5nIHNpemUuXG4gKi9cbmZ1bmN0aW9uIHN0cmluZ1NpemUoc3RyaW5nKSB7XG4gIHJldHVybiBoYXNVbmljb2RlKHN0cmluZylcbiAgICA/IHVuaWNvZGVTaXplKHN0cmluZylcbiAgICA6IGFzY2lpU2l6ZShzdHJpbmcpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0cmluZ1NpemU7XG4iLCJ2YXIgbWVtb2l6ZUNhcHBlZCA9IHJlcXVpcmUoJy4vX21lbW9pemVDYXBwZWQnKTtcblxuLyoqIFVzZWQgdG8gbWF0Y2ggcHJvcGVydHkgbmFtZXMgd2l0aGluIHByb3BlcnR5IHBhdGhzLiAqL1xudmFyIHJlUHJvcE5hbWUgPSAvW14uW1xcXV0rfFxcWyg/OigtP1xcZCsoPzpcXC5cXGQrKT8pfChbXCInXSkoKD86KD8hXFwyKVteXFxcXF18XFxcXC4pKj8pXFwyKVxcXXwoPz0oPzpcXC58XFxbXFxdKSg/OlxcLnxcXFtcXF18JCkpL2c7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIGJhY2tzbGFzaGVzIGluIHByb3BlcnR5IHBhdGhzLiAqL1xudmFyIHJlRXNjYXBlQ2hhciA9IC9cXFxcKFxcXFwpPy9nO1xuXG4vKipcbiAqIENvbnZlcnRzIGBzdHJpbmdgIHRvIGEgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHByb3BlcnR5IHBhdGggYXJyYXkuXG4gKi9cbnZhciBzdHJpbmdUb1BhdGggPSBtZW1vaXplQ2FwcGVkKGZ1bmN0aW9uKHN0cmluZykge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIGlmIChzdHJpbmcuY2hhckNvZGVBdCgwKSA9PT0gNDYgLyogLiAqLykge1xuICAgIHJlc3VsdC5wdXNoKCcnKTtcbiAgfVxuICBzdHJpbmcucmVwbGFjZShyZVByb3BOYW1lLCBmdW5jdGlvbihtYXRjaCwgbnVtYmVyLCBxdW90ZSwgc3ViU3RyaW5nKSB7XG4gICAgcmVzdWx0LnB1c2gocXVvdGUgPyBzdWJTdHJpbmcucmVwbGFjZShyZUVzY2FwZUNoYXIsICckMScpIDogKG51bWJlciB8fCBtYXRjaCkpO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHN0cmluZ1RvUGF0aDtcbiIsInZhciBpc1N5bWJvbCA9IHJlcXVpcmUoJy4vaXNTeW1ib2wnKTtcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgSU5GSU5JVFkgPSAxIC8gMDtcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc3RyaW5nIGtleSBpZiBpdCdzIG5vdCBhIHN0cmluZyBvciBzeW1ib2wuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7c3RyaW5nfHN5bWJvbH0gUmV0dXJucyB0aGUga2V5LlxuICovXG5mdW5jdGlvbiB0b0tleSh2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8IGlzU3ltYm9sKHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICB2YXIgcmVzdWx0ID0gKHZhbHVlICsgJycpO1xuICByZXR1cm4gKHJlc3VsdCA9PSAnMCcgJiYgKDEgLyB2YWx1ZSkgPT0gLUlORklOSVRZKSA/ICctMCcgOiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdG9LZXk7XG4iLCIvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgZnVuY1Byb3RvID0gRnVuY3Rpb24ucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG52YXIgZnVuY1RvU3RyaW5nID0gZnVuY1Byb3RvLnRvU3RyaW5nO1xuXG4vKipcbiAqIENvbnZlcnRzIGBmdW5jYCB0byBpdHMgc291cmNlIGNvZGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzb3VyY2UgY29kZS5cbiAqL1xuZnVuY3Rpb24gdG9Tb3VyY2UoZnVuYykge1xuICBpZiAoZnVuYyAhPSBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBmdW5jVG9TdHJpbmcuY2FsbChmdW5jKTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gKGZ1bmMgKyAnJyk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdG9Tb3VyY2U7XG4iLCIvKiogVXNlZCB0byBtYXRjaCBhIHNpbmdsZSB3aGl0ZXNwYWNlIGNoYXJhY3Rlci4gKi9cbnZhciByZVdoaXRlc3BhY2UgPSAvXFxzLztcblxuLyoqXG4gKiBVc2VkIGJ5IGBfLnRyaW1gIGFuZCBgXy50cmltRW5kYCB0byBnZXQgdGhlIGluZGV4IG9mIHRoZSBsYXN0IG5vbi13aGl0ZXNwYWNlXG4gKiBjaGFyYWN0ZXIgb2YgYHN0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLlxuICovXG5mdW5jdGlvbiB0cmltbWVkRW5kSW5kZXgoc3RyaW5nKSB7XG4gIHZhciBpbmRleCA9IHN0cmluZy5sZW5ndGg7XG5cbiAgd2hpbGUgKGluZGV4LS0gJiYgcmVXaGl0ZXNwYWNlLnRlc3Qoc3RyaW5nLmNoYXJBdChpbmRleCkpKSB7fVxuICByZXR1cm4gaW5kZXg7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdHJpbW1lZEVuZEluZGV4O1xuIiwiLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIGNoYXJhY3RlciBjbGFzc2VzLiAqL1xudmFyIHJzQXN0cmFsUmFuZ2UgPSAnXFxcXHVkODAwLVxcXFx1ZGZmZicsXG4gICAgcnNDb21ib01hcmtzUmFuZ2UgPSAnXFxcXHUwMzAwLVxcXFx1MDM2ZicsXG4gICAgcmVDb21ib0hhbGZNYXJrc1JhbmdlID0gJ1xcXFx1ZmUyMC1cXFxcdWZlMmYnLFxuICAgIHJzQ29tYm9TeW1ib2xzUmFuZ2UgPSAnXFxcXHUyMGQwLVxcXFx1MjBmZicsXG4gICAgcnNDb21ib1JhbmdlID0gcnNDb21ib01hcmtzUmFuZ2UgKyByZUNvbWJvSGFsZk1hcmtzUmFuZ2UgKyByc0NvbWJvU3ltYm9sc1JhbmdlLFxuICAgIHJzVmFyUmFuZ2UgPSAnXFxcXHVmZTBlXFxcXHVmZTBmJztcblxuLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIGNhcHR1cmUgZ3JvdXBzLiAqL1xudmFyIHJzQXN0cmFsID0gJ1snICsgcnNBc3RyYWxSYW5nZSArICddJyxcbiAgICByc0NvbWJvID0gJ1snICsgcnNDb21ib1JhbmdlICsgJ10nLFxuICAgIHJzRml0eiA9ICdcXFxcdWQ4M2NbXFxcXHVkZmZiLVxcXFx1ZGZmZl0nLFxuICAgIHJzTW9kaWZpZXIgPSAnKD86JyArIHJzQ29tYm8gKyAnfCcgKyByc0ZpdHogKyAnKScsXG4gICAgcnNOb25Bc3RyYWwgPSAnW14nICsgcnNBc3RyYWxSYW5nZSArICddJyxcbiAgICByc1JlZ2lvbmFsID0gJyg/OlxcXFx1ZDgzY1tcXFxcdWRkZTYtXFxcXHVkZGZmXSl7Mn0nLFxuICAgIHJzU3VyclBhaXIgPSAnW1xcXFx1ZDgwMC1cXFxcdWRiZmZdW1xcXFx1ZGMwMC1cXFxcdWRmZmZdJyxcbiAgICByc1pXSiA9ICdcXFxcdTIwMGQnO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgcmVnZXhlcy4gKi9cbnZhciByZU9wdE1vZCA9IHJzTW9kaWZpZXIgKyAnPycsXG4gICAgcnNPcHRWYXIgPSAnWycgKyByc1ZhclJhbmdlICsgJ10/JyxcbiAgICByc09wdEpvaW4gPSAnKD86JyArIHJzWldKICsgJyg/OicgKyBbcnNOb25Bc3RyYWwsIHJzUmVnaW9uYWwsIHJzU3VyclBhaXJdLmpvaW4oJ3wnKSArICcpJyArIHJzT3B0VmFyICsgcmVPcHRNb2QgKyAnKSonLFxuICAgIHJzU2VxID0gcnNPcHRWYXIgKyByZU9wdE1vZCArIHJzT3B0Sm9pbixcbiAgICByc1N5bWJvbCA9ICcoPzonICsgW3JzTm9uQXN0cmFsICsgcnNDb21ibyArICc/JywgcnNDb21ibywgcnNSZWdpb25hbCwgcnNTdXJyUGFpciwgcnNBc3RyYWxdLmpvaW4oJ3wnKSArICcpJztcblxuLyoqIFVzZWQgdG8gbWF0Y2ggW3N0cmluZyBzeW1ib2xzXShodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvamF2YXNjcmlwdC11bmljb2RlKS4gKi9cbnZhciByZVVuaWNvZGUgPSBSZWdFeHAocnNGaXR6ICsgJyg/PScgKyByc0ZpdHogKyAnKXwnICsgcnNTeW1ib2wgKyByc1NlcSwgJ2cnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBzaXplIG9mIGEgVW5pY29kZSBgc3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdHJpbmcgc2l6ZS5cbiAqL1xuZnVuY3Rpb24gdW5pY29kZVNpemUoc3RyaW5nKSB7XG4gIHZhciByZXN1bHQgPSByZVVuaWNvZGUubGFzdEluZGV4ID0gMDtcbiAgd2hpbGUgKHJlVW5pY29kZS50ZXN0KHN0cmluZykpIHtcbiAgICArK3Jlc3VsdDtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHVuaWNvZGVTaXplO1xuIiwidmFyIGJhc2VDbG9uZSA9IHJlcXVpcmUoJy4vX2Jhc2VDbG9uZScpO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciBjbG9uaW5nLiAqL1xudmFyIENMT05FX1NZTUJPTFNfRkxBRyA9IDQ7XG5cbi8qKlxuICogQ3JlYXRlcyBhIHNoYWxsb3cgY2xvbmUgb2YgYHZhbHVlYC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvbiB0aGVcbiAqIFtzdHJ1Y3R1cmVkIGNsb25lIGFsZ29yaXRobV0oaHR0cHM6Ly9tZG4uaW8vU3RydWN0dXJlZF9jbG9uZV9hbGdvcml0aG0pXG4gKiBhbmQgc3VwcG9ydHMgY2xvbmluZyBhcnJheXMsIGFycmF5IGJ1ZmZlcnMsIGJvb2xlYW5zLCBkYXRlIG9iamVjdHMsIG1hcHMsXG4gKiBudW1iZXJzLCBgT2JqZWN0YCBvYmplY3RzLCByZWdleGVzLCBzZXRzLCBzdHJpbmdzLCBzeW1ib2xzLCBhbmQgdHlwZWRcbiAqIGFycmF5cy4gVGhlIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb2YgYGFyZ3VtZW50c2Agb2JqZWN0cyBhcmUgY2xvbmVkXG4gKiBhcyBwbGFpbiBvYmplY3RzLiBBbiBlbXB0eSBvYmplY3QgaXMgcmV0dXJuZWQgZm9yIHVuY2xvbmVhYmxlIHZhbHVlcyBzdWNoXG4gKiBhcyBlcnJvciBvYmplY3RzLCBmdW5jdGlvbnMsIERPTSBub2RlcywgYW5kIFdlYWtNYXBzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjbG9uZS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBjbG9uZWQgdmFsdWUuXG4gKiBAc2VlIF8uY2xvbmVEZWVwXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3RzID0gW3sgJ2EnOiAxIH0sIHsgJ2InOiAyIH1dO1xuICpcbiAqIHZhciBzaGFsbG93ID0gXy5jbG9uZShvYmplY3RzKTtcbiAqIGNvbnNvbGUubG9nKHNoYWxsb3dbMF0gPT09IG9iamVjdHNbMF0pO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBjbG9uZSh2YWx1ZSkge1xuICByZXR1cm4gYmFzZUNsb25lKHZhbHVlLCBDTE9ORV9TWU1CT0xTX0ZMQUcpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNsb25lO1xuIiwidmFyIGJhc2VDbG9uZSA9IHJlcXVpcmUoJy4vX2Jhc2VDbG9uZScpO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciBjbG9uaW5nLiAqL1xudmFyIENMT05FX0RFRVBfRkxBRyA9IDEsXG4gICAgQ0xPTkVfU1lNQk9MU19GTEFHID0gNDtcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmNsb25lYCBleGNlcHQgdGhhdCBpdCByZWN1cnNpdmVseSBjbG9uZXMgYHZhbHVlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDEuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcmVjdXJzaXZlbHkgY2xvbmUuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZGVlcCBjbG9uZWQgdmFsdWUuXG4gKiBAc2VlIF8uY2xvbmVcbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdHMgPSBbeyAnYSc6IDEgfSwgeyAnYic6IDIgfV07XG4gKlxuICogdmFyIGRlZXAgPSBfLmNsb25lRGVlcChvYmplY3RzKTtcbiAqIGNvbnNvbGUubG9nKGRlZXBbMF0gPT09IG9iamVjdHNbMF0pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gY2xvbmVEZWVwKHZhbHVlKSB7XG4gIHJldHVybiBiYXNlQ2xvbmUodmFsdWUsIENMT05FX0RFRVBfRkxBRyB8IENMT05FX1NZTUJPTFNfRkxBRyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2xvbmVEZWVwO1xuIiwiLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGB2YWx1ZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjQuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHJldHVybiBmcm9tIHRoZSBuZXcgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb25zdGFudCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdHMgPSBfLnRpbWVzKDIsIF8uY29uc3RhbnQoeyAnYSc6IDEgfSkpO1xuICpcbiAqIGNvbnNvbGUubG9nKG9iamVjdHMpO1xuICogLy8gPT4gW3sgJ2EnOiAxIH0sIHsgJ2EnOiAxIH1dXG4gKlxuICogY29uc29sZS5sb2cob2JqZWN0c1swXSA9PT0gb2JqZWN0c1sxXSk7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGNvbnN0YW50KHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29uc3RhbnQ7XG4iLCJ2YXIgYmFzZVJlc3QgPSByZXF1aXJlKCcuL19iYXNlUmVzdCcpLFxuICAgIGVxID0gcmVxdWlyZSgnLi9lcScpLFxuICAgIGlzSXRlcmF0ZWVDYWxsID0gcmVxdWlyZSgnLi9faXNJdGVyYXRlZUNhbGwnKSxcbiAgICBrZXlzSW4gPSByZXF1aXJlKCcuL2tleXNJbicpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIEFzc2lnbnMgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBvZiBzb3VyY2VcbiAqIG9iamVjdHMgdG8gdGhlIGRlc3RpbmF0aW9uIG9iamVjdCBmb3IgYWxsIGRlc3RpbmF0aW9uIHByb3BlcnRpZXMgdGhhdFxuICogcmVzb2x2ZSB0byBgdW5kZWZpbmVkYC4gU291cmNlIG9iamVjdHMgYXJlIGFwcGxpZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0LlxuICogT25jZSBhIHByb3BlcnR5IGlzIHNldCwgYWRkaXRpb25hbCB2YWx1ZXMgb2YgdGhlIHNhbWUgcHJvcGVydHkgYXJlIGlnbm9yZWQuXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICogQHBhcmFtIHsuLi5PYmplY3R9IFtzb3VyY2VzXSBUaGUgc291cmNlIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICogQHNlZSBfLmRlZmF1bHRzRGVlcFxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmRlZmF1bHRzKHsgJ2EnOiAxIH0sIHsgJ2InOiAyIH0sIHsgJ2EnOiAzIH0pO1xuICogLy8gPT4geyAnYSc6IDEsICdiJzogMiB9XG4gKi9cbnZhciBkZWZhdWx0cyA9IGJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCwgc291cmNlcykge1xuICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcblxuICB2YXIgaW5kZXggPSAtMTtcbiAgdmFyIGxlbmd0aCA9IHNvdXJjZXMubGVuZ3RoO1xuICB2YXIgZ3VhcmQgPSBsZW5ndGggPiAyID8gc291cmNlc1syXSA6IHVuZGVmaW5lZDtcblxuICBpZiAoZ3VhcmQgJiYgaXNJdGVyYXRlZUNhbGwoc291cmNlc1swXSwgc291cmNlc1sxXSwgZ3VhcmQpKSB7XG4gICAgbGVuZ3RoID0gMTtcbiAgfVxuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHNvdXJjZSA9IHNvdXJjZXNbaW5kZXhdO1xuICAgIHZhciBwcm9wcyA9IGtleXNJbihzb3VyY2UpO1xuICAgIHZhciBwcm9wc0luZGV4ID0gLTE7XG4gICAgdmFyIHByb3BzTGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsrcHJvcHNJbmRleCA8IHByb3BzTGVuZ3RoKSB7XG4gICAgICB2YXIga2V5ID0gcHJvcHNbcHJvcHNJbmRleF07XG4gICAgICB2YXIgdmFsdWUgPSBvYmplY3Rba2V5XTtcblxuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAoZXEodmFsdWUsIG9iamVjdFByb3RvW2tleV0pICYmICFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkpIHtcbiAgICAgICAgb2JqZWN0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2JqZWN0O1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZGVmYXVsdHM7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZm9yRWFjaCcpO1xuIiwiLyoqXG4gKiBQZXJmb3JtcyBhXG4gKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICogY29tcGFyaXNvbiBiZXR3ZWVuIHR3byB2YWx1ZXMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgYXJlIGVxdWl2YWxlbnQuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxIH07XG4gKiB2YXIgb3RoZXIgPSB7ICdhJzogMSB9O1xuICpcbiAqIF8uZXEob2JqZWN0LCBvYmplY3QpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uZXEob2JqZWN0LCBvdGhlcik7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uZXEoJ2EnLCAnYScpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uZXEoJ2EnLCBPYmplY3QoJ2EnKSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uZXEoTmFOLCBOYU4pO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBlcSh2YWx1ZSwgb3RoZXIpIHtcbiAgcmV0dXJuIHZhbHVlID09PSBvdGhlciB8fCAodmFsdWUgIT09IHZhbHVlICYmIG90aGVyICE9PSBvdGhlcik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXE7XG4iLCJ2YXIgYXJyYXlGaWx0ZXIgPSByZXF1aXJlKCcuL19hcnJheUZpbHRlcicpLFxuICAgIGJhc2VGaWx0ZXIgPSByZXF1aXJlKCcuL19iYXNlRmlsdGVyJyksXG4gICAgYmFzZUl0ZXJhdGVlID0gcmVxdWlyZSgnLi9fYmFzZUl0ZXJhdGVlJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpO1xuXG4vKipcbiAqIEl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gLCByZXR1cm5pbmcgYW4gYXJyYXkgb2YgYWxsIGVsZW1lbnRzXG4gKiBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoIHRocmVlXG4gKiBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAqXG4gKiAqKk5vdGU6KiogVW5saWtlIGBfLnJlbW92ZWAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZpbHRlcmVkIGFycmF5LlxuICogQHNlZSBfLnJlamVjdFxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgdXNlcnMgPSBbXG4gKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9LFxuICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAqIF07XG4gKlxuICogXy5maWx0ZXIodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuICFvLmFjdGl2ZTsgfSk7XG4gKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnXVxuICpcbiAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLmZpbHRlcih1c2VycywgeyAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0pO1xuICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICpcbiAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8uZmlsdGVyKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnXVxuICpcbiAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5maWx0ZXIodXNlcnMsICdhY3RpdmUnKTtcbiAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5J11cbiAqXG4gKiAvLyBDb21iaW5pbmcgc2V2ZXJhbCBwcmVkaWNhdGVzIHVzaW5nIGBfLm92ZXJFdmVyeWAgb3IgYF8ub3ZlclNvbWVgLlxuICogXy5maWx0ZXIodXNlcnMsIF8ub3ZlclNvbWUoW3sgJ2FnZSc6IDM2IH0sIFsnYWdlJywgNDBdXSkpO1xuICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJywgJ2Jhcm5leSddXG4gKi9cbmZ1bmN0aW9uIGZpbHRlcihjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlGaWx0ZXIgOiBiYXNlRmlsdGVyO1xuICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBiYXNlSXRlcmF0ZWUocHJlZGljYXRlLCAzKSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZmlsdGVyO1xuIiwidmFyIGNyZWF0ZUZpbmQgPSByZXF1aXJlKCcuL19jcmVhdGVGaW5kJyksXG4gICAgZmluZEluZGV4ID0gcmVxdWlyZSgnLi9maW5kSW5kZXgnKTtcblxuLyoqXG4gKiBJdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYCwgcmV0dXJuaW5nIHRoZSBmaXJzdCBlbGVtZW50XG4gKiBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoIHRocmVlXG4gKiBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXRjaGVkIGVsZW1lbnQsIGVsc2UgYHVuZGVmaW5lZGAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciB1c2VycyA9IFtcbiAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9LFxuICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWdlJzogNDAsICdhY3RpdmUnOiBmYWxzZSB9LFxuICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWdlJzogMSwgICdhY3RpdmUnOiB0cnVlIH1cbiAqIF07XG4gKlxuICogXy5maW5kKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLmFnZSA8IDQwOyB9KTtcbiAqIC8vID0+IG9iamVjdCBmb3IgJ2Jhcm5leSdcbiAqXG4gKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5maW5kKHVzZXJzLCB7ICdhZ2UnOiAxLCAnYWN0aXZlJzogdHJ1ZSB9KTtcbiAqIC8vID0+IG9iamVjdCBmb3IgJ3BlYmJsZXMnXG4gKlxuICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5maW5kKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gKiAvLyA9PiBvYmplY3QgZm9yICdmcmVkJ1xuICpcbiAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5maW5kKHVzZXJzLCAnYWN0aXZlJyk7XG4gKiAvLyA9PiBvYmplY3QgZm9yICdiYXJuZXknXG4gKi9cbnZhciBmaW5kID0gY3JlYXRlRmluZChmaW5kSW5kZXgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZpbmQ7XG4iLCJ2YXIgYmFzZUZpbmRJbmRleCA9IHJlcXVpcmUoJy4vX2Jhc2VGaW5kSW5kZXgnKSxcbiAgICBiYXNlSXRlcmF0ZWUgPSByZXF1aXJlKCcuL19iYXNlSXRlcmF0ZWUnKSxcbiAgICB0b0ludGVnZXIgPSByZXF1aXJlKCcuL3RvSW50ZWdlcicpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlTWF4ID0gTWF0aC5tYXg7XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5maW5kYCBleGNlcHQgdGhhdCBpdCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3RcbiAqIGVsZW1lbnQgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yIGluc3RlYWQgb2YgdGhlIGVsZW1lbnQgaXRzZWxmLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMS4xLjBcbiAqIEBjYXRlZ29yeSBBcnJheVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD0wXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZm91bmQgZWxlbWVudCwgZWxzZSBgLTFgLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgdXNlcnMgPSBbXG4gKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhY3RpdmUnOiBmYWxzZSB9LFxuICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IHRydWUgfVxuICogXTtcbiAqXG4gKiBfLmZpbmRJbmRleCh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby51c2VyID09ICdiYXJuZXknOyB9KTtcbiAqIC8vID0+IDBcbiAqXG4gKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5maW5kSW5kZXgodXNlcnMsIHsgJ3VzZXInOiAnZnJlZCcsICdhY3RpdmUnOiBmYWxzZSB9KTtcbiAqIC8vID0+IDFcbiAqXG4gKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLmZpbmRJbmRleCh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICogLy8gPT4gMFxuICpcbiAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5maW5kSW5kZXgodXNlcnMsICdhY3RpdmUnKTtcbiAqIC8vID0+IDJcbiAqL1xuZnVuY3Rpb24gZmluZEluZGV4KGFycmF5LCBwcmVkaWNhdGUsIGZyb21JbmRleCkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gIGlmICghbGVuZ3RoKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIHZhciBpbmRleCA9IGZyb21JbmRleCA9PSBudWxsID8gMCA6IHRvSW50ZWdlcihmcm9tSW5kZXgpO1xuICBpZiAoaW5kZXggPCAwKSB7XG4gICAgaW5kZXggPSBuYXRpdmVNYXgobGVuZ3RoICsgaW5kZXgsIDApO1xuICB9XG4gIHJldHVybiBiYXNlRmluZEluZGV4KGFycmF5LCBiYXNlSXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgaW5kZXgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZpbmRJbmRleDtcbiIsInZhciBiYXNlRmxhdHRlbiA9IHJlcXVpcmUoJy4vX2Jhc2VGbGF0dGVuJyk7XG5cbi8qKlxuICogRmxhdHRlbnMgYGFycmF5YCBhIHNpbmdsZSBsZXZlbCBkZWVwLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBBcnJheVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZsYXR0ZW4uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uZmxhdHRlbihbMSwgWzIsIFszLCBbNF1dLCA1XV0pO1xuICogLy8gPT4gWzEsIDIsIFszLCBbNF1dLCA1XVxuICovXG5mdW5jdGlvbiBmbGF0dGVuKGFycmF5KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgcmV0dXJuIGxlbmd0aCA/IGJhc2VGbGF0dGVuKGFycmF5LCAxKSA6IFtdO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZsYXR0ZW47XG4iLCJ2YXIgYXJyYXlFYWNoID0gcmVxdWlyZSgnLi9fYXJyYXlFYWNoJyksXG4gICAgYmFzZUVhY2ggPSByZXF1aXJlKCcuL19iYXNlRWFjaCcpLFxuICAgIGNhc3RGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2Nhc3RGdW5jdGlvbicpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKTtcblxuLyoqXG4gKiBJdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYCBhbmQgaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBlYWNoIGVsZW1lbnQuXG4gKiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICogSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0IGl0ZXJhdGlvbiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLlxuICpcbiAqICoqTm90ZToqKiBBcyB3aXRoIG90aGVyIFwiQ29sbGVjdGlvbnNcIiBtZXRob2RzLCBvYmplY3RzIHdpdGggYSBcImxlbmd0aFwiXG4gKiBwcm9wZXJ0eSBhcmUgaXRlcmF0ZWQgbGlrZSBhcnJheXMuIFRvIGF2b2lkIHRoaXMgYmVoYXZpb3IgdXNlIGBfLmZvckluYFxuICogb3IgYF8uZm9yT3duYCBmb3Igb2JqZWN0IGl0ZXJhdGlvbi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAYWxpYXMgZWFjaFxuICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fE9iamVjdH0gUmV0dXJucyBgY29sbGVjdGlvbmAuXG4gKiBAc2VlIF8uZm9yRWFjaFJpZ2h0XG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uZm9yRWFjaChbMSwgMl0sIGZ1bmN0aW9uKHZhbHVlKSB7XG4gKiAgIGNvbnNvbGUubG9nKHZhbHVlKTtcbiAqIH0pO1xuICogLy8gPT4gTG9ncyBgMWAgdGhlbiBgMmAuXG4gKlxuICogXy5mb3JFYWNoKHsgJ2EnOiAxLCAnYic6IDIgfSwgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICogICBjb25zb2xlLmxvZyhrZXkpO1xuICogfSk7XG4gKiAvLyA9PiBMb2dzICdhJyB0aGVuICdiJyAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKS5cbiAqL1xuZnVuY3Rpb24gZm9yRWFjaChjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheUVhY2ggOiBiYXNlRWFjaDtcbiAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgY2FzdEZ1bmN0aW9uKGl0ZXJhdGVlKSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZm9yRWFjaDtcbiIsInZhciBiYXNlRm9yID0gcmVxdWlyZSgnLi9fYmFzZUZvcicpLFxuICAgIGNhc3RGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2Nhc3RGdW5jdGlvbicpLFxuICAgIGtleXNJbiA9IHJlcXVpcmUoJy4va2V5c0luJyk7XG5cbi8qKlxuICogSXRlcmF0ZXMgb3ZlciBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIGFuXG4gKiBvYmplY3QgYW5kIGludm9rZXMgYGl0ZXJhdGVlYCBmb3IgZWFjaCBwcm9wZXJ0eS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWRcbiAqIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGtleSwgb2JqZWN0KS4gSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0XG4gKiBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMy4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICogQHNlZSBfLmZvckluUmlnaHRcbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogICB0aGlzLmIgPSAyO1xuICogfVxuICpcbiAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gKlxuICogXy5mb3JJbihuZXcgRm9vLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gKiAgIGNvbnNvbGUubG9nKGtleSk7XG4gKiB9KTtcbiAqIC8vID0+IExvZ3MgJ2EnLCAnYicsIHRoZW4gJ2MnIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpLlxuICovXG5mdW5jdGlvbiBmb3JJbihvYmplY3QsIGl0ZXJhdGVlKSB7XG4gIHJldHVybiBvYmplY3QgPT0gbnVsbFxuICAgID8gb2JqZWN0XG4gICAgOiBiYXNlRm9yKG9iamVjdCwgY2FzdEZ1bmN0aW9uKGl0ZXJhdGVlKSwga2V5c0luKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmb3JJbjtcbiIsInZhciBiYXNlR2V0ID0gcmVxdWlyZSgnLi9fYmFzZUdldCcpO1xuXG4vKipcbiAqIEdldHMgdGhlIHZhbHVlIGF0IGBwYXRoYCBvZiBgb2JqZWN0YC4gSWYgdGhlIHJlc29sdmVkIHZhbHVlIGlzXG4gKiBgdW5kZWZpbmVkYCwgdGhlIGBkZWZhdWx0VmFsdWVgIGlzIHJldHVybmVkIGluIGl0cyBwbGFjZS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuNy4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHBhcmFtIHsqfSBbZGVmYXVsdFZhbHVlXSBUaGUgdmFsdWUgcmV0dXJuZWQgZm9yIGB1bmRlZmluZWRgIHJlc29sdmVkIHZhbHVlcy5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiAzIH0gfV0gfTtcbiAqXG4gKiBfLmdldChvYmplY3QsICdhWzBdLmIuYycpO1xuICogLy8gPT4gM1xuICpcbiAqIF8uZ2V0KG9iamVjdCwgWydhJywgJzAnLCAnYicsICdjJ10pO1xuICogLy8gPT4gM1xuICpcbiAqIF8uZ2V0KG9iamVjdCwgJ2EuYi5jJywgJ2RlZmF1bHQnKTtcbiAqIC8vID0+ICdkZWZhdWx0J1xuICovXG5mdW5jdGlvbiBnZXQob2JqZWN0LCBwYXRoLCBkZWZhdWx0VmFsdWUpIHtcbiAgdmFyIHJlc3VsdCA9IG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogYmFzZUdldChvYmplY3QsIHBhdGgpO1xuICByZXR1cm4gcmVzdWx0ID09PSB1bmRlZmluZWQgPyBkZWZhdWx0VmFsdWUgOiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0O1xuIiwidmFyIGJhc2VIYXMgPSByZXF1aXJlKCcuL19iYXNlSGFzJyksXG4gICAgaGFzUGF0aCA9IHJlcXVpcmUoJy4vX2hhc1BhdGgnKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHBhdGhgIGlzIGEgZGlyZWN0IHByb3BlcnR5IG9mIGBvYmplY3RgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBwYXRoYCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiB7ICdiJzogMiB9IH07XG4gKiB2YXIgb3RoZXIgPSBfLmNyZWF0ZSh7ICdhJzogXy5jcmVhdGUoeyAnYic6IDIgfSkgfSk7XG4gKlxuICogXy5oYXMob2JqZWN0LCAnYScpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaGFzKG9iamVjdCwgJ2EuYicpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaGFzKG9iamVjdCwgWydhJywgJ2InXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5oYXMob3RoZXIsICdhJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBoYXMob2JqZWN0LCBwYXRoKSB7XG4gIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBoYXNQYXRoKG9iamVjdCwgcGF0aCwgYmFzZUhhcyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzO1xuIiwidmFyIGJhc2VIYXNJbiA9IHJlcXVpcmUoJy4vX2Jhc2VIYXNJbicpLFxuICAgIGhhc1BhdGggPSByZXF1aXJlKCcuL19oYXNQYXRoJyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGBwYXRoYCBpcyBhIGRpcmVjdCBvciBpbmhlcml0ZWQgcHJvcGVydHkgb2YgYG9iamVjdGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHBhdGhgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0gXy5jcmVhdGUoeyAnYSc6IF8uY3JlYXRlKHsgJ2InOiAyIH0pIH0pO1xuICpcbiAqIF8uaGFzSW4ob2JqZWN0LCAnYScpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaGFzSW4ob2JqZWN0LCAnYS5iJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5oYXNJbihvYmplY3QsIFsnYScsICdiJ10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaGFzSW4ob2JqZWN0LCAnYicpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaGFzSW4ob2JqZWN0LCBwYXRoKSB7XG4gIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBoYXNQYXRoKG9iamVjdCwgcGF0aCwgYmFzZUhhc0luKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNJbjtcbiIsIi8qKlxuICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgZmlyc3QgYXJndW1lbnQgaXQgcmVjZWl2ZXMuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgQW55IHZhbHVlLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgYHZhbHVlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxIH07XG4gKlxuICogY29uc29sZS5sb2coXy5pZGVudGl0eShvYmplY3QpID09PSBvYmplY3QpO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBpZGVudGl0eSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaWRlbnRpdHk7XG4iLCJ2YXIgYmFzZUlzQXJndW1lbnRzID0gcmVxdWlyZSgnLi9fYmFzZUlzQXJndW1lbnRzJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgcHJvcGVydHlJc0VudW1lcmFibGUgPSBvYmplY3RQcm90by5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBsaWtlbHkgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGBhcmd1bWVudHNgIG9iamVjdCxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcmd1bWVudHMoZnVuY3Rpb24oKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FyZ3VtZW50cyhbMSwgMiwgM10pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzQXJndW1lbnRzID0gYmFzZUlzQXJndW1lbnRzKGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID8gYmFzZUlzQXJndW1lbnRzIDogZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgJ2NhbGxlZScpICYmXG4gICAgIXByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodmFsdWUsICdjYWxsZWUnKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gaXNBcmd1bWVudHM7XG4iLCIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYW4gYEFycmF5YCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FycmF5KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5KGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXkoJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXkoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcblxubW9kdWxlLmV4cG9ydHMgPSBpc0FycmF5O1xuIiwidmFyIGlzRnVuY3Rpb24gPSByZXF1aXJlKCcuL2lzRnVuY3Rpb24nKSxcbiAgICBpc0xlbmd0aCA9IHJlcXVpcmUoJy4vaXNMZW5ndGgnKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhcnJheS1saWtlLiBBIHZhbHVlIGlzIGNvbnNpZGVyZWQgYXJyYXktbGlrZSBpZiBpdCdzXG4gKiBub3QgYSBmdW5jdGlvbiBhbmQgaGFzIGEgYHZhbHVlLmxlbmd0aGAgdGhhdCdzIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIG9yXG4gKiBlcXVhbCB0byBgMGAgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byBgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFycmF5LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FycmF5TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZSgnYWJjJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheUxpa2UodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgaXNMZW5ndGgodmFsdWUubGVuZ3RoKSAmJiAhaXNGdW5jdGlvbih2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNBcnJheUxpa2U7XG4iLCJ2YXIgaXNBcnJheUxpa2UgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmlzQXJyYXlMaWtlYCBleGNlcHQgdGhhdCBpdCBhbHNvIGNoZWNrcyBpZiBgdmFsdWVgXG4gKiBpcyBhbiBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXktbGlrZSBvYmplY3QsXG4gKiAgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZU9iamVjdChkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5TGlrZU9iamVjdChfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheUxpa2VPYmplY3QodmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgaXNBcnJheUxpa2UodmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQXJyYXlMaWtlT2JqZWN0O1xuIiwidmFyIHJvb3QgPSByZXF1aXJlKCcuL19yb290JyksXG4gICAgc3R1YkZhbHNlID0gcmVxdWlyZSgnLi9zdHViRmFsc2UnKTtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBleHBvcnRzYC4gKi9cbnZhciBmcmVlRXhwb3J0cyA9IHR5cGVvZiBleHBvcnRzID09ICdvYmplY3QnICYmIGV4cG9ydHMgJiYgIWV4cG9ydHMubm9kZVR5cGUgJiYgZXhwb3J0cztcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBtb2R1bGVgLiAqL1xudmFyIGZyZWVNb2R1bGUgPSBmcmVlRXhwb3J0cyAmJiB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZSAmJiAhbW9kdWxlLm5vZGVUeXBlICYmIG1vZHVsZTtcblxuLyoqIERldGVjdCB0aGUgcG9wdWxhciBDb21tb25KUyBleHRlbnNpb24gYG1vZHVsZS5leHBvcnRzYC4gKi9cbnZhciBtb2R1bGVFeHBvcnRzID0gZnJlZU1vZHVsZSAmJiBmcmVlTW9kdWxlLmV4cG9ydHMgPT09IGZyZWVFeHBvcnRzO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBCdWZmZXIgPSBtb2R1bGVFeHBvcnRzID8gcm9vdC5CdWZmZXIgOiB1bmRlZmluZWQ7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVJc0J1ZmZlciA9IEJ1ZmZlciA/IEJ1ZmZlci5pc0J1ZmZlciA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIGJ1ZmZlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMy4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGJ1ZmZlciwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQnVmZmVyKG5ldyBCdWZmZXIoMikpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNCdWZmZXIobmV3IFVpbnQ4QXJyYXkoMikpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzQnVmZmVyID0gbmF0aXZlSXNCdWZmZXIgfHwgc3R1YkZhbHNlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQnVmZmVyO1xuIiwidmFyIGJhc2VLZXlzID0gcmVxdWlyZSgnLi9fYmFzZUtleXMnKSxcbiAgICBnZXRUYWcgPSByZXF1aXJlKCcuL19nZXRUYWcnKSxcbiAgICBpc0FyZ3VtZW50cyA9IHJlcXVpcmUoJy4vaXNBcmd1bWVudHMnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNBcnJheUxpa2UgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlJyksXG4gICAgaXNCdWZmZXIgPSByZXF1aXJlKCcuL2lzQnVmZmVyJyksXG4gICAgaXNQcm90b3R5cGUgPSByZXF1aXJlKCcuL19pc1Byb3RvdHlwZScpLFxuICAgIGlzVHlwZWRBcnJheSA9IHJlcXVpcmUoJy4vaXNUeXBlZEFycmF5Jyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBtYXBUYWcgPSAnW29iamVjdCBNYXBdJyxcbiAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhbiBlbXB0eSBvYmplY3QsIGNvbGxlY3Rpb24sIG1hcCwgb3Igc2V0LlxuICpcbiAqIE9iamVjdHMgYXJlIGNvbnNpZGVyZWQgZW1wdHkgaWYgdGhleSBoYXZlIG5vIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZFxuICogcHJvcGVydGllcy5cbiAqXG4gKiBBcnJheS1saWtlIHZhbHVlcyBzdWNoIGFzIGBhcmd1bWVudHNgIG9iamVjdHMsIGFycmF5cywgYnVmZmVycywgc3RyaW5ncywgb3JcbiAqIGpRdWVyeS1saWtlIGNvbGxlY3Rpb25zIGFyZSBjb25zaWRlcmVkIGVtcHR5IGlmIHRoZXkgaGF2ZSBhIGBsZW5ndGhgIG9mIGAwYC5cbiAqIFNpbWlsYXJseSwgbWFwcyBhbmQgc2V0cyBhcmUgY29uc2lkZXJlZCBlbXB0eSBpZiB0aGV5IGhhdmUgYSBgc2l6ZWAgb2YgYDBgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGVtcHR5LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNFbXB0eShudWxsKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzRW1wdHkodHJ1ZSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0VtcHR5KDEpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNFbXB0eShbMSwgMiwgM10pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzRW1wdHkoeyAnYSc6IDEgfSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0VtcHR5KHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKGlzQXJyYXlMaWtlKHZhbHVlKSAmJlxuICAgICAgKGlzQXJyYXkodmFsdWUpIHx8IHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUuc3BsaWNlID09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgaXNCdWZmZXIodmFsdWUpIHx8IGlzVHlwZWRBcnJheSh2YWx1ZSkgfHwgaXNBcmd1bWVudHModmFsdWUpKSkge1xuICAgIHJldHVybiAhdmFsdWUubGVuZ3RoO1xuICB9XG4gIHZhciB0YWcgPSBnZXRUYWcodmFsdWUpO1xuICBpZiAodGFnID09IG1hcFRhZyB8fCB0YWcgPT0gc2V0VGFnKSB7XG4gICAgcmV0dXJuICF2YWx1ZS5zaXplO1xuICB9XG4gIGlmIChpc1Byb3RvdHlwZSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gIWJhc2VLZXlzKHZhbHVlKS5sZW5ndGg7XG4gIH1cbiAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGtleSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNFbXB0eTtcbiIsInZhciBiYXNlR2V0VGFnID0gcmVxdWlyZSgnLi9fYmFzZUdldFRhZycpLFxuICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYXN5bmNUYWcgPSAnW29iamVjdCBBc3luY0Z1bmN0aW9uXScsXG4gICAgZnVuY1RhZyA9ICdbb2JqZWN0IEZ1bmN0aW9uXScsXG4gICAgZ2VuVGFnID0gJ1tvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dJyxcbiAgICBwcm94eVRhZyA9ICdbb2JqZWN0IFByb3h5XSc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBGdW5jdGlvbmAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgZnVuY3Rpb24sIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0Z1bmN0aW9uKF8pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNGdW5jdGlvbigvYWJjLyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKSB7XG4gIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIFRoZSB1c2Ugb2YgYE9iamVjdCN0b1N0cmluZ2AgYXZvaWRzIGlzc3VlcyB3aXRoIHRoZSBgdHlwZW9mYCBvcGVyYXRvclxuICAvLyBpbiBTYWZhcmkgOSB3aGljaCByZXR1cm5zICdvYmplY3QnIGZvciB0eXBlZCBhcnJheXMgYW5kIG90aGVyIGNvbnN0cnVjdG9ycy5cbiAgdmFyIHRhZyA9IGJhc2VHZXRUYWcodmFsdWUpO1xuICByZXR1cm4gdGFnID09IGZ1bmNUYWcgfHwgdGFnID09IGdlblRhZyB8fCB0YWcgPT0gYXN5bmNUYWcgfHwgdGFnID09IHByb3h5VGFnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzRnVuY3Rpb247XG4iLCIvKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBNQVhfU0FGRV9JTlRFR0VSID0gOTAwNzE5OTI1NDc0MDk5MTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGFycmF5LWxpa2UgbGVuZ3RoLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gKiBbYFRvTGVuZ3RoYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9sZW5ndGgpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgbGVuZ3RoLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNMZW5ndGgoMyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0xlbmd0aChOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0xlbmd0aChJbmZpbml0eSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNMZW5ndGgoJzMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzTGVuZ3RoKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiZcbiAgICB2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDw9IE1BWF9TQUZFX0lOVEVHRVI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNMZW5ndGg7XG4iLCJ2YXIgYmFzZUlzTWFwID0gcmVxdWlyZSgnLi9fYmFzZUlzTWFwJyksXG4gICAgYmFzZVVuYXJ5ID0gcmVxdWlyZSgnLi9fYmFzZVVuYXJ5JyksXG4gICAgbm9kZVV0aWwgPSByZXF1aXJlKCcuL19ub2RlVXRpbCcpO1xuXG4vKiBOb2RlLmpzIGhlbHBlciByZWZlcmVuY2VzLiAqL1xudmFyIG5vZGVJc01hcCA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzTWFwO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgTWFwYCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjMuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBtYXAsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc01hcChuZXcgTWFwKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzTWFwKG5ldyBXZWFrTWFwKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc01hcCA9IG5vZGVJc01hcCA/IGJhc2VVbmFyeShub2RlSXNNYXApIDogYmFzZUlzTWFwO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzTWFwO1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyB0aGVcbiAqIFtsYW5ndWFnZSB0eXBlXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcylcbiAqIG9mIGBPYmplY3RgLiAoZS5nLiBhcnJheXMsIGZ1bmN0aW9ucywgb2JqZWN0cywgcmVnZXhlcywgYG5ldyBOdW1iZXIoMClgLCBhbmQgYG5ldyBTdHJpbmcoJycpYClcbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdCh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoXy5ub29wKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNPYmplY3Q7XG4iLCIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc09iamVjdExpa2U7XG4iLCJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBnZXRQcm90b3R5cGUgPSByZXF1aXJlKCcuL19nZXRQcm90b3R5cGUnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XSc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBmdW5jUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGUsXG4gICAgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG52YXIgZnVuY1RvU3RyaW5nID0gZnVuY1Byb3RvLnRvU3RyaW5nO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKiogVXNlZCB0byBpbmZlciB0aGUgYE9iamVjdGAgY29uc3RydWN0b3IuICovXG52YXIgb2JqZWN0Q3RvclN0cmluZyA9IGZ1bmNUb1N0cmluZy5jYWxsKE9iamVjdCk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmplY3QsIHRoYXQgaXMsIGFuIG9iamVjdCBjcmVhdGVkIGJ5IHRoZVxuICogYE9iamVjdGAgY29uc3RydWN0b3Igb3Igb25lIHdpdGggYSBgW1tQcm90b3R5cGVdXWAgb2YgYG51bGxgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC44LjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcGxhaW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIEZvbygpIHtcbiAqICAgdGhpcy5hID0gMTtcbiAqIH1cbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QobmV3IEZvbyk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QoeyAneCc6IDAsICd5JzogMCB9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QoT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgaWYgKCFpc09iamVjdExpa2UodmFsdWUpIHx8IGJhc2VHZXRUYWcodmFsdWUpICE9IG9iamVjdFRhZykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgcHJvdG8gPSBnZXRQcm90b3R5cGUodmFsdWUpO1xuICBpZiAocHJvdG8gPT09IG51bGwpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB2YXIgQ3RvciA9IGhhc093blByb3BlcnR5LmNhbGwocHJvdG8sICdjb25zdHJ1Y3RvcicpICYmIHByb3RvLmNvbnN0cnVjdG9yO1xuICByZXR1cm4gdHlwZW9mIEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBDdG9yIGluc3RhbmNlb2YgQ3RvciAmJlxuICAgIGZ1bmNUb1N0cmluZy5jYWxsKEN0b3IpID09IG9iamVjdEN0b3JTdHJpbmc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNQbGFpbk9iamVjdDtcbiIsInZhciBiYXNlSXNTZXQgPSByZXF1aXJlKCcuL19iYXNlSXNTZXQnKSxcbiAgICBiYXNlVW5hcnkgPSByZXF1aXJlKCcuL19iYXNlVW5hcnknKSxcbiAgICBub2RlVXRpbCA9IHJlcXVpcmUoJy4vX25vZGVVdGlsJyk7XG5cbi8qIE5vZGUuanMgaGVscGVyIHJlZmVyZW5jZXMuICovXG52YXIgbm9kZUlzU2V0ID0gbm9kZVV0aWwgJiYgbm9kZVV0aWwuaXNTZXQ7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTZXRgIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMy4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHNldCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzU2V0KG5ldyBTZXQpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNTZXQobmV3IFdlYWtTZXQpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzU2V0ID0gbm9kZUlzU2V0ID8gYmFzZVVuYXJ5KG5vZGVJc1NldCkgOiBiYXNlSXNTZXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNTZXQ7XG4iLCJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIHN0cmluZ1RhZyA9ICdbb2JqZWN0IFN0cmluZ10nO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3RyaW5nYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3RyaW5nLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNTdHJpbmcoJ2FiYycpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNTdHJpbmcoMSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1N0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8XG4gICAgKCFpc0FycmF5KHZhbHVlKSAmJiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IHN0cmluZ1RhZyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNTdHJpbmc7XG4iLCJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXSc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTeW1ib2xgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzeW1ib2wsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1N5bWJvbChTeW1ib2wuaXRlcmF0b3IpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNTeW1ib2woJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTeW1ib2wodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3ltYm9sJyB8fFxuICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IHN5bWJvbFRhZyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNTeW1ib2w7XG4iLCJ2YXIgYmFzZUlzVHlwZWRBcnJheSA9IHJlcXVpcmUoJy4vX2Jhc2VJc1R5cGVkQXJyYXknKSxcbiAgICBiYXNlVW5hcnkgPSByZXF1aXJlKCcuL19iYXNlVW5hcnknKSxcbiAgICBub2RlVXRpbCA9IHJlcXVpcmUoJy4vX25vZGVVdGlsJyk7XG5cbi8qIE5vZGUuanMgaGVscGVyIHJlZmVyZW5jZXMuICovXG52YXIgbm9kZUlzVHlwZWRBcnJheSA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzVHlwZWRBcnJheTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgdHlwZWQgYXJyYXkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB0eXBlZCBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzVHlwZWRBcnJheShuZXcgVWludDhBcnJheSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1R5cGVkQXJyYXkoW10pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzVHlwZWRBcnJheSA9IG5vZGVJc1R5cGVkQXJyYXkgPyBiYXNlVW5hcnkobm9kZUlzVHlwZWRBcnJheSkgOiBiYXNlSXNUeXBlZEFycmF5O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzVHlwZWRBcnJheTtcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYHVuZGVmaW5lZGAuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYHVuZGVmaW5lZGAsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1VuZGVmaW5lZCh2b2lkIDApO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNVbmRlZmluZWQobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1VuZGVmaW5lZCh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1VuZGVmaW5lZDtcbiIsInZhciBhcnJheUxpa2VLZXlzID0gcmVxdWlyZSgnLi9fYXJyYXlMaWtlS2V5cycpLFxuICAgIGJhc2VLZXlzID0gcmVxdWlyZSgnLi9fYmFzZUtleXMnKSxcbiAgICBpc0FycmF5TGlrZSA9IHJlcXVpcmUoJy4vaXNBcnJheUxpa2UnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiBgb2JqZWN0YC5cbiAqXG4gKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy4gU2VlIHRoZVxuICogW0VTIHNwZWNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5rZXlzKVxuICogZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYSA9IDE7XG4gKiAgIHRoaXMuYiA9IDI7XG4gKiB9XG4gKlxuICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAqXG4gKiBfLmtleXMobmV3IEZvbyk7XG4gKiAvLyA9PiBbJ2EnLCAnYiddIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gKlxuICogXy5rZXlzKCdoaScpO1xuICogLy8gPT4gWycwJywgJzEnXVxuICovXG5mdW5jdGlvbiBrZXlzKG9iamVjdCkge1xuICByZXR1cm4gaXNBcnJheUxpa2Uob2JqZWN0KSA/IGFycmF5TGlrZUtleXMob2JqZWN0KSA6IGJhc2VLZXlzKG9iamVjdCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ga2V5cztcbiIsInZhciBhcnJheUxpa2VLZXlzID0gcmVxdWlyZSgnLi9fYXJyYXlMaWtlS2V5cycpLFxuICAgIGJhc2VLZXlzSW4gPSByZXF1aXJlKCcuL19iYXNlS2V5c0luJyksXG4gICAgaXNBcnJheUxpa2UgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiBgb2JqZWN0YC5cbiAqXG4gKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuMC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYSA9IDE7XG4gKiAgIHRoaXMuYiA9IDI7XG4gKiB9XG4gKlxuICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAqXG4gKiBfLmtleXNJbihuZXcgRm9vKTtcbiAqIC8vID0+IFsnYScsICdiJywgJ2MnXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICovXG5mdW5jdGlvbiBrZXlzSW4ob2JqZWN0KSB7XG4gIHJldHVybiBpc0FycmF5TGlrZShvYmplY3QpID8gYXJyYXlMaWtlS2V5cyhvYmplY3QsIHRydWUpIDogYmFzZUtleXNJbihvYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGtleXNJbjtcbiIsIi8qKlxuICogR2V0cyB0aGUgbGFzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbGFzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8ubGFzdChbMSwgMiwgM10pO1xuICogLy8gPT4gM1xuICovXG5mdW5jdGlvbiBsYXN0KGFycmF5KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgcmV0dXJuIGxlbmd0aCA/IGFycmF5W2xlbmd0aCAtIDFdIDogdW5kZWZpbmVkO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxhc3Q7XG4iLCJ2YXIgYXJyYXlNYXAgPSByZXF1aXJlKCcuL19hcnJheU1hcCcpLFxuICAgIGJhc2VJdGVyYXRlZSA9IHJlcXVpcmUoJy4vX2Jhc2VJdGVyYXRlZScpLFxuICAgIGJhc2VNYXAgPSByZXF1aXJlKCcuL19iYXNlTWFwJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdmFsdWVzIGJ5IHJ1bm5pbmcgZWFjaCBlbGVtZW50IGluIGBjb2xsZWN0aW9uYCB0aHJ1XG4gKiBgaXRlcmF0ZWVgLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czpcbiAqICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAqXG4gKiBNYW55IGxvZGFzaCBtZXRob2RzIGFyZSBndWFyZGVkIHRvIHdvcmsgYXMgaXRlcmF0ZWVzIGZvciBtZXRob2RzIGxpa2VcbiAqIGBfLmV2ZXJ5YCwgYF8uZmlsdGVyYCwgYF8ubWFwYCwgYF8ubWFwVmFsdWVzYCwgYF8ucmVqZWN0YCwgYW5kIGBfLnNvbWVgLlxuICpcbiAqIFRoZSBndWFyZGVkIG1ldGhvZHMgYXJlOlxuICogYGFyeWAsIGBjaHVua2AsIGBjdXJyeWAsIGBjdXJyeVJpZ2h0YCwgYGRyb3BgLCBgZHJvcFJpZ2h0YCwgYGV2ZXJ5YCxcbiAqIGBmaWxsYCwgYGludmVydGAsIGBwYXJzZUludGAsIGByYW5kb21gLCBgcmFuZ2VgLCBgcmFuZ2VSaWdodGAsIGByZXBlYXRgLFxuICogYHNhbXBsZVNpemVgLCBgc2xpY2VgLCBgc29tZWAsIGBzb3J0QnlgLCBgc3BsaXRgLCBgdGFrZWAsIGB0YWtlUmlnaHRgLFxuICogYHRlbXBsYXRlYCwgYHRyaW1gLCBgdHJpbUVuZGAsIGB0cmltU3RhcnRgLCBhbmQgYHdvcmRzYFxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IG1hcHBlZCBhcnJheS5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gc3F1YXJlKG4pIHtcbiAqICAgcmV0dXJuIG4gKiBuO1xuICogfVxuICpcbiAqIF8ubWFwKFs0LCA4XSwgc3F1YXJlKTtcbiAqIC8vID0+IFsxNiwgNjRdXG4gKlxuICogXy5tYXAoeyAnYSc6IDQsICdiJzogOCB9LCBzcXVhcmUpO1xuICogLy8gPT4gWzE2LCA2NF0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAqXG4gKiB2YXIgdXNlcnMgPSBbXG4gKiAgIHsgJ3VzZXInOiAnYmFybmV5JyB9LFxuICogICB7ICd1c2VyJzogJ2ZyZWQnIH1cbiAqIF07XG4gKlxuICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLm1hcCh1c2VycywgJ3VzZXInKTtcbiAqIC8vID0+IFsnYmFybmV5JywgJ2ZyZWQnXVxuICovXG5mdW5jdGlvbiBtYXAoY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlNYXAgOiBiYXNlTWFwO1xuICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBiYXNlSXRlcmF0ZWUoaXRlcmF0ZWUsIDMpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXA7XG4iLCJ2YXIgYmFzZUFzc2lnblZhbHVlID0gcmVxdWlyZSgnLi9fYmFzZUFzc2lnblZhbHVlJyksXG4gICAgYmFzZUZvck93biA9IHJlcXVpcmUoJy4vX2Jhc2VGb3JPd24nKSxcbiAgICBiYXNlSXRlcmF0ZWUgPSByZXF1aXJlKCcuL19iYXNlSXRlcmF0ZWUnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIG9iamVjdCB3aXRoIHRoZSBzYW1lIGtleXMgYXMgYG9iamVjdGAgYW5kIHZhbHVlcyBnZW5lcmF0ZWRcbiAqIGJ5IHJ1bm5pbmcgZWFjaCBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydHkgb2YgYG9iamVjdGAgdGhydVxuICogYGl0ZXJhdGVlYC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6XG4gKiAodmFsdWUsIGtleSwgb2JqZWN0KS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDIuNC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIG9iamVjdC5cbiAqIEBzZWUgXy5tYXBLZXlzXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciB1c2VycyA9IHtcbiAqICAgJ2ZyZWQnOiAgICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWdlJzogNDAgfSxcbiAqICAgJ3BlYmJsZXMnOiB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWdlJzogMSB9XG4gKiB9O1xuICpcbiAqIF8ubWFwVmFsdWVzKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLmFnZTsgfSk7XG4gKiAvLyA9PiB7ICdmcmVkJzogNDAsICdwZWJibGVzJzogMSB9IChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gKlxuICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLm1hcFZhbHVlcyh1c2VycywgJ2FnZScpO1xuICogLy8gPT4geyAnZnJlZCc6IDQwLCAncGViYmxlcyc6IDEgfSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICovXG5mdW5jdGlvbiBtYXBWYWx1ZXMob2JqZWN0LCBpdGVyYXRlZSkge1xuICB2YXIgcmVzdWx0ID0ge307XG4gIGl0ZXJhdGVlID0gYmFzZUl0ZXJhdGVlKGl0ZXJhdGVlLCAzKTtcblxuICBiYXNlRm9yT3duKG9iamVjdCwgZnVuY3Rpb24odmFsdWUsIGtleSwgb2JqZWN0KSB7XG4gICAgYmFzZUFzc2lnblZhbHVlKHJlc3VsdCwga2V5LCBpdGVyYXRlZSh2YWx1ZSwga2V5LCBvYmplY3QpKTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwVmFsdWVzO1xuIiwidmFyIGJhc2VFeHRyZW11bSA9IHJlcXVpcmUoJy4vX2Jhc2VFeHRyZW11bScpLFxuICAgIGJhc2VHdCA9IHJlcXVpcmUoJy4vX2Jhc2VHdCcpLFxuICAgIGlkZW50aXR5ID0gcmVxdWlyZSgnLi9pZGVudGl0eScpO1xuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBtYXhpbXVtIHZhbHVlIG9mIGBhcnJheWAuIElmIGBhcnJheWAgaXMgZW1wdHkgb3IgZmFsc2V5LFxuICogYHVuZGVmaW5lZGAgaXMgcmV0dXJuZWQuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IE1hdGhcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWF4aW11bSB2YWx1ZS5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5tYXgoWzQsIDIsIDgsIDZdKTtcbiAqIC8vID0+IDhcbiAqXG4gKiBfLm1heChbXSk7XG4gKiAvLyA9PiB1bmRlZmluZWRcbiAqL1xuZnVuY3Rpb24gbWF4KGFycmF5KSB7XG4gIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgID8gYmFzZUV4dHJlbXVtKGFycmF5LCBpZGVudGl0eSwgYmFzZUd0KVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1heDtcbiIsInZhciBNYXBDYWNoZSA9IHJlcXVpcmUoJy4vX01hcENhY2hlJyk7XG5cbi8qKiBFcnJvciBtZXNzYWdlIGNvbnN0YW50cy4gKi9cbnZhciBGVU5DX0VSUk9SX1RFWFQgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbic7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgbWVtb2l6ZXMgdGhlIHJlc3VsdCBvZiBgZnVuY2AuIElmIGByZXNvbHZlcmAgaXNcbiAqIHByb3ZpZGVkLCBpdCBkZXRlcm1pbmVzIHRoZSBjYWNoZSBrZXkgZm9yIHN0b3JpbmcgdGhlIHJlc3VsdCBiYXNlZCBvbiB0aGVcbiAqIGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24uIEJ5IGRlZmF1bHQsIHRoZSBmaXJzdCBhcmd1bWVudFxuICogcHJvdmlkZWQgdG8gdGhlIG1lbW9pemVkIGZ1bmN0aW9uIGlzIHVzZWQgYXMgdGhlIG1hcCBjYWNoZSBrZXkuIFRoZSBgZnVuY2BcbiAqIGlzIGludm9rZWQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgdGhlIG1lbW9pemVkIGZ1bmN0aW9uLlxuICpcbiAqICoqTm90ZToqKiBUaGUgY2FjaGUgaXMgZXhwb3NlZCBhcyB0aGUgYGNhY2hlYCBwcm9wZXJ0eSBvbiB0aGUgbWVtb2l6ZWRcbiAqIGZ1bmN0aW9uLiBJdHMgY3JlYXRpb24gbWF5IGJlIGN1c3RvbWl6ZWQgYnkgcmVwbGFjaW5nIHRoZSBgXy5tZW1vaXplLkNhY2hlYFxuICogY29uc3RydWN0b3Igd2l0aCBvbmUgd2hvc2UgaW5zdGFuY2VzIGltcGxlbWVudCB0aGVcbiAqIFtgTWFwYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcHJvcGVydGllcy1vZi10aGUtbWFwLXByb3RvdHlwZS1vYmplY3QpXG4gKiBtZXRob2QgaW50ZXJmYWNlIG9mIGBjbGVhcmAsIGBkZWxldGVgLCBgZ2V0YCwgYGhhc2AsIGFuZCBgc2V0YC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGhhdmUgaXRzIG91dHB1dCBtZW1vaXplZC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtyZXNvbHZlcl0gVGhlIGZ1bmN0aW9uIHRvIHJlc29sdmUgdGhlIGNhY2hlIGtleS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG1lbW9pemVkIGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogMiB9O1xuICogdmFyIG90aGVyID0geyAnYyc6IDMsICdkJzogNCB9O1xuICpcbiAqIHZhciB2YWx1ZXMgPSBfLm1lbW9pemUoXy52YWx1ZXMpO1xuICogdmFsdWVzKG9iamVjdCk7XG4gKiAvLyA9PiBbMSwgMl1cbiAqXG4gKiB2YWx1ZXMob3RoZXIpO1xuICogLy8gPT4gWzMsIDRdXG4gKlxuICogb2JqZWN0LmEgPSAyO1xuICogdmFsdWVzKG9iamVjdCk7XG4gKiAvLyA9PiBbMSwgMl1cbiAqXG4gKiAvLyBNb2RpZnkgdGhlIHJlc3VsdCBjYWNoZS5cbiAqIHZhbHVlcy5jYWNoZS5zZXQob2JqZWN0LCBbJ2EnLCAnYiddKTtcbiAqIHZhbHVlcyhvYmplY3QpO1xuICogLy8gPT4gWydhJywgJ2InXVxuICpcbiAqIC8vIFJlcGxhY2UgYF8ubWVtb2l6ZS5DYWNoZWAuXG4gKiBfLm1lbW9pemUuQ2FjaGUgPSBXZWFrTWFwO1xuICovXG5mdW5jdGlvbiBtZW1vaXplKGZ1bmMsIHJlc29sdmVyKSB7XG4gIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nIHx8IChyZXNvbHZlciAhPSBudWxsICYmIHR5cGVvZiByZXNvbHZlciAhPSAnZnVuY3Rpb24nKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgfVxuICB2YXIgbWVtb2l6ZWQgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAga2V5ID0gcmVzb2x2ZXIgPyByZXNvbHZlci5hcHBseSh0aGlzLCBhcmdzKSA6IGFyZ3NbMF0sXG4gICAgICAgIGNhY2hlID0gbWVtb2l6ZWQuY2FjaGU7XG5cbiAgICBpZiAoY2FjaGUuaGFzKGtleSkpIHtcbiAgICAgIHJldHVybiBjYWNoZS5nZXQoa2V5KTtcbiAgICB9XG4gICAgdmFyIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpcywgYXJncyk7XG4gICAgbWVtb2l6ZWQuY2FjaGUgPSBjYWNoZS5zZXQoa2V5LCByZXN1bHQpIHx8IGNhY2hlO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIG1lbW9pemVkLmNhY2hlID0gbmV3IChtZW1vaXplLkNhY2hlIHx8IE1hcENhY2hlKTtcbiAgcmV0dXJuIG1lbW9pemVkO1xufVxuXG4vLyBFeHBvc2UgYE1hcENhY2hlYC5cbm1lbW9pemUuQ2FjaGUgPSBNYXBDYWNoZTtcblxubW9kdWxlLmV4cG9ydHMgPSBtZW1vaXplO1xuIiwidmFyIGJhc2VNZXJnZSA9IHJlcXVpcmUoJy4vX2Jhc2VNZXJnZScpLFxuICAgIGNyZWF0ZUFzc2lnbmVyID0gcmVxdWlyZSgnLi9fY3JlYXRlQXNzaWduZXInKTtcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmFzc2lnbmAgZXhjZXB0IHRoYXQgaXQgcmVjdXJzaXZlbHkgbWVyZ2VzIG93biBhbmRcbiAqIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIHNvdXJjZSBvYmplY3RzIGludG8gdGhlXG4gKiBkZXN0aW5hdGlvbiBvYmplY3QuIFNvdXJjZSBwcm9wZXJ0aWVzIHRoYXQgcmVzb2x2ZSB0byBgdW5kZWZpbmVkYCBhcmVcbiAqIHNraXBwZWQgaWYgYSBkZXN0aW5hdGlvbiB2YWx1ZSBleGlzdHMuIEFycmF5IGFuZCBwbGFpbiBvYmplY3QgcHJvcGVydGllc1xuICogYXJlIG1lcmdlZCByZWN1cnNpdmVseS4gT3RoZXIgb2JqZWN0cyBhbmQgdmFsdWUgdHlwZXMgYXJlIG92ZXJyaWRkZW4gYnlcbiAqIGFzc2lnbm1lbnQuIFNvdXJjZSBvYmplY3RzIGFyZSBhcHBsaWVkIGZyb20gbGVmdCB0byByaWdodC4gU3Vic2VxdWVudFxuICogc291cmNlcyBvdmVyd3JpdGUgcHJvcGVydHkgYXNzaWdubWVudHMgb2YgcHJldmlvdXMgc291cmNlcy5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuNS4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gKiBAcGFyYW0gey4uLk9iamVjdH0gW3NvdXJjZXNdIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7XG4gKiAgICdhJzogW3sgJ2InOiAyIH0sIHsgJ2QnOiA0IH1dXG4gKiB9O1xuICpcbiAqIHZhciBvdGhlciA9IHtcbiAqICAgJ2EnOiBbeyAnYyc6IDMgfSwgeyAnZSc6IDUgfV1cbiAqIH07XG4gKlxuICogXy5tZXJnZShvYmplY3QsIG90aGVyKTtcbiAqIC8vID0+IHsgJ2EnOiBbeyAnYic6IDIsICdjJzogMyB9LCB7ICdkJzogNCwgJ2UnOiA1IH1dIH1cbiAqL1xudmFyIG1lcmdlID0gY3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4KSB7XG4gIGJhc2VNZXJnZShvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgpO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gbWVyZ2U7XG4iLCJ2YXIgYmFzZUV4dHJlbXVtID0gcmVxdWlyZSgnLi9fYmFzZUV4dHJlbXVtJyksXG4gICAgYmFzZUx0ID0gcmVxdWlyZSgnLi9fYmFzZUx0JyksXG4gICAgaWRlbnRpdHkgPSByZXF1aXJlKCcuL2lkZW50aXR5Jyk7XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIG1pbmltdW0gdmFsdWUgb2YgYGFycmF5YC4gSWYgYGFycmF5YCBpcyBlbXB0eSBvciBmYWxzZXksXG4gKiBgdW5kZWZpbmVkYCBpcyByZXR1cm5lZC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgTWF0aFxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtaW5pbXVtIHZhbHVlLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLm1pbihbNCwgMiwgOCwgNl0pO1xuICogLy8gPT4gMlxuICpcbiAqIF8ubWluKFtdKTtcbiAqIC8vID0+IHVuZGVmaW5lZFxuICovXG5mdW5jdGlvbiBtaW4oYXJyYXkpIHtcbiAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgPyBiYXNlRXh0cmVtdW0oYXJyYXksIGlkZW50aXR5LCBiYXNlTHQpXG4gICAgOiB1bmRlZmluZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWluO1xuIiwidmFyIGJhc2VFeHRyZW11bSA9IHJlcXVpcmUoJy4vX2Jhc2VFeHRyZW11bScpLFxuICAgIGJhc2VJdGVyYXRlZSA9IHJlcXVpcmUoJy4vX2Jhc2VJdGVyYXRlZScpLFxuICAgIGJhc2VMdCA9IHJlcXVpcmUoJy4vX2Jhc2VMdCcpO1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ubWluYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2ggaXNcbiAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBpbiBgYXJyYXlgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb24gYnkgd2hpY2hcbiAqIHRoZSB2YWx1ZSBpcyByYW5rZWQuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBNYXRoXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1pbmltdW0gdmFsdWUuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3RzID0gW3sgJ24nOiAxIH0sIHsgJ24nOiAyIH1dO1xuICpcbiAqIF8ubWluQnkob2JqZWN0cywgZnVuY3Rpb24obykgeyByZXR1cm4gby5uOyB9KTtcbiAqIC8vID0+IHsgJ24nOiAxIH1cbiAqXG4gKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8ubWluQnkob2JqZWN0cywgJ24nKTtcbiAqIC8vID0+IHsgJ24nOiAxIH1cbiAqL1xuZnVuY3Rpb24gbWluQnkoYXJyYXksIGl0ZXJhdGVlKSB7XG4gIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgID8gYmFzZUV4dHJlbXVtKGFycmF5LCBiYXNlSXRlcmF0ZWUoaXRlcmF0ZWUsIDIpLCBiYXNlTHQpXG4gICAgOiB1bmRlZmluZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWluQnk7XG4iLCIvKipcbiAqIFRoaXMgbWV0aG9kIHJldHVybnMgYHVuZGVmaW5lZGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjMuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBleGFtcGxlXG4gKlxuICogXy50aW1lcygyLCBfLm5vb3ApO1xuICogLy8gPT4gW3VuZGVmaW5lZCwgdW5kZWZpbmVkXVxuICovXG5mdW5jdGlvbiBub29wKCkge1xuICAvLyBObyBvcGVyYXRpb24gcGVyZm9ybWVkLlxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5vb3A7XG4iLCJ2YXIgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSB0aW1lc3RhbXAgb2YgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhhdCBoYXZlIGVsYXBzZWQgc2luY2VcbiAqIHRoZSBVbml4IGVwb2NoICgxIEphbnVhcnkgMTk3MCAwMDowMDowMCBVVEMpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMi40LjBcbiAqIEBjYXRlZ29yeSBEYXRlXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSB0aW1lc3RhbXAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uZGVmZXIoZnVuY3Rpb24oc3RhbXApIHtcbiAqICAgY29uc29sZS5sb2coXy5ub3coKSAtIHN0YW1wKTtcbiAqIH0sIF8ubm93KCkpO1xuICogLy8gPT4gTG9ncyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpdCB0b29rIGZvciB0aGUgZGVmZXJyZWQgaW52b2NhdGlvbi5cbiAqL1xudmFyIG5vdyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gcm9vdC5EYXRlLm5vdygpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBub3c7XG4iLCJ2YXIgYmFzZVBpY2sgPSByZXF1aXJlKCcuL19iYXNlUGljaycpLFxuICAgIGZsYXRSZXN0ID0gcmVxdWlyZSgnLi9fZmxhdFJlc3QnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiB0aGUgcGlja2VkIGBvYmplY3RgIHByb3BlcnRpZXMuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAqIEBwYXJhbSB7Li4uKHN0cmluZ3xzdHJpbmdbXSl9IFtwYXRoc10gVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogJzInLCAnYyc6IDMgfTtcbiAqXG4gKiBfLnBpY2sob2JqZWN0LCBbJ2EnLCAnYyddKTtcbiAqIC8vID0+IHsgJ2EnOiAxLCAnYyc6IDMgfVxuICovXG52YXIgcGljayA9IGZsYXRSZXN0KGZ1bmN0aW9uKG9iamVjdCwgcGF0aHMpIHtcbiAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8ge30gOiBiYXNlUGljayhvYmplY3QsIHBhdGhzKTtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBpY2s7XG4iLCJ2YXIgYmFzZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fYmFzZVByb3BlcnR5JyksXG4gICAgYmFzZVByb3BlcnR5RGVlcCA9IHJlcXVpcmUoJy4vX2Jhc2VQcm9wZXJ0eURlZXAnKSxcbiAgICBpc0tleSA9IHJlcXVpcmUoJy4vX2lzS2V5JyksXG4gICAgdG9LZXkgPSByZXF1aXJlKCcuL190b0tleScpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIHZhbHVlIGF0IGBwYXRoYCBvZiBhIGdpdmVuIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDIuNC4wXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0cyA9IFtcbiAqICAgeyAnYSc6IHsgJ2InOiAyIH0gfSxcbiAqICAgeyAnYSc6IHsgJ2InOiAxIH0gfVxuICogXTtcbiAqXG4gKiBfLm1hcChvYmplY3RzLCBfLnByb3BlcnR5KCdhLmInKSk7XG4gKiAvLyA9PiBbMiwgMV1cbiAqXG4gKiBfLm1hcChfLnNvcnRCeShvYmplY3RzLCBfLnByb3BlcnR5KFsnYScsICdiJ10pKSwgJ2EuYicpO1xuICogLy8gPT4gWzEsIDJdXG4gKi9cbmZ1bmN0aW9uIHByb3BlcnR5KHBhdGgpIHtcbiAgcmV0dXJuIGlzS2V5KHBhdGgpID8gYmFzZVByb3BlcnR5KHRvS2V5KHBhdGgpKSA6IGJhc2VQcm9wZXJ0eURlZXAocGF0aCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcHJvcGVydHk7XG4iLCJ2YXIgY3JlYXRlUmFuZ2UgPSByZXF1aXJlKCcuL19jcmVhdGVSYW5nZScpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgbnVtYmVycyAocG9zaXRpdmUgYW5kL29yIG5lZ2F0aXZlKSBwcm9ncmVzc2luZyBmcm9tXG4gKiBgc3RhcnRgIHVwIHRvLCBidXQgbm90IGluY2x1ZGluZywgYGVuZGAuIEEgc3RlcCBvZiBgLTFgIGlzIHVzZWQgaWYgYSBuZWdhdGl2ZVxuICogYHN0YXJ0YCBpcyBzcGVjaWZpZWQgd2l0aG91dCBhbiBgZW5kYCBvciBgc3RlcGAuIElmIGBlbmRgIGlzIG5vdCBzcGVjaWZpZWQsXG4gKiBpdCdzIHNldCB0byBgc3RhcnRgIHdpdGggYHN0YXJ0YCB0aGVuIHNldCB0byBgMGAuXG4gKlxuICogKipOb3RlOioqIEphdmFTY3JpcHQgZm9sbG93cyB0aGUgSUVFRS03NTQgc3RhbmRhcmQgZm9yIHJlc29sdmluZ1xuICogZmxvYXRpbmctcG9pbnQgdmFsdWVzIHdoaWNoIGNhbiBwcm9kdWNlIHVuZXhwZWN0ZWQgcmVzdWx0cy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlLlxuICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSByYW5nZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3RlcD0xXSBUaGUgdmFsdWUgdG8gaW5jcmVtZW50IG9yIGRlY3JlbWVudCBieS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZ2Ugb2YgbnVtYmVycy5cbiAqIEBzZWUgXy5pblJhbmdlLCBfLnJhbmdlUmlnaHRcbiAqIEBleGFtcGxlXG4gKlxuICogXy5yYW5nZSg0KTtcbiAqIC8vID0+IFswLCAxLCAyLCAzXVxuICpcbiAqIF8ucmFuZ2UoLTQpO1xuICogLy8gPT4gWzAsIC0xLCAtMiwgLTNdXG4gKlxuICogXy5yYW5nZSgxLCA1KTtcbiAqIC8vID0+IFsxLCAyLCAzLCA0XVxuICpcbiAqIF8ucmFuZ2UoMCwgMjAsIDUpO1xuICogLy8gPT4gWzAsIDUsIDEwLCAxNV1cbiAqXG4gKiBfLnJhbmdlKDAsIC00LCAtMSk7XG4gKiAvLyA9PiBbMCwgLTEsIC0yLCAtM11cbiAqXG4gKiBfLnJhbmdlKDEsIDQsIDApO1xuICogLy8gPT4gWzEsIDEsIDFdXG4gKlxuICogXy5yYW5nZSgwKTtcbiAqIC8vID0+IFtdXG4gKi9cbnZhciByYW5nZSA9IGNyZWF0ZVJhbmdlKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gcmFuZ2U7XG4iLCJ2YXIgYXJyYXlSZWR1Y2UgPSByZXF1aXJlKCcuL19hcnJheVJlZHVjZScpLFxuICAgIGJhc2VFYWNoID0gcmVxdWlyZSgnLi9fYmFzZUVhY2gnKSxcbiAgICBiYXNlSXRlcmF0ZWUgPSByZXF1aXJlKCcuL19iYXNlSXRlcmF0ZWUnKSxcbiAgICBiYXNlUmVkdWNlID0gcmVxdWlyZSgnLi9fYmFzZVJlZHVjZScpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKTtcblxuLyoqXG4gKiBSZWR1Y2VzIGBjb2xsZWN0aW9uYCB0byBhIHZhbHVlIHdoaWNoIGlzIHRoZSBhY2N1bXVsYXRlZCByZXN1bHQgb2YgcnVubmluZ1xuICogZWFjaCBlbGVtZW50IGluIGBjb2xsZWN0aW9uYCB0aHJ1IGBpdGVyYXRlZWAsIHdoZXJlIGVhY2ggc3VjY2Vzc2l2ZVxuICogaW52b2NhdGlvbiBpcyBzdXBwbGllZCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBwcmV2aW91cy4gSWYgYGFjY3VtdWxhdG9yYFxuICogaXMgbm90IGdpdmVuLCB0aGUgZmlyc3QgZWxlbWVudCBvZiBgY29sbGVjdGlvbmAgaXMgdXNlZCBhcyB0aGUgaW5pdGlhbFxuICogdmFsdWUuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggZm91ciBhcmd1bWVudHM6XG4gKiAoYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICpcbiAqIE1hbnkgbG9kYXNoIG1ldGhvZHMgYXJlIGd1YXJkZWQgdG8gd29yayBhcyBpdGVyYXRlZXMgZm9yIG1ldGhvZHMgbGlrZVxuICogYF8ucmVkdWNlYCwgYF8ucmVkdWNlUmlnaHRgLCBhbmQgYF8udHJhbnNmb3JtYC5cbiAqXG4gKiBUaGUgZ3VhcmRlZCBtZXRob2RzIGFyZTpcbiAqIGBhc3NpZ25gLCBgZGVmYXVsdHNgLCBgZGVmYXVsdHNEZWVwYCwgYGluY2x1ZGVzYCwgYG1lcmdlYCwgYG9yZGVyQnlgLFxuICogYW5kIGBzb3J0QnlgXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIFRoZSBpbml0aWFsIHZhbHVlLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICogQHNlZSBfLnJlZHVjZVJpZ2h0XG4gKiBAZXhhbXBsZVxuICpcbiAqIF8ucmVkdWNlKFsxLCAyXSwgZnVuY3Rpb24oc3VtLCBuKSB7XG4gKiAgIHJldHVybiBzdW0gKyBuO1xuICogfSwgMCk7XG4gKiAvLyA9PiAzXG4gKlxuICogXy5yZWR1Y2UoeyAnYSc6IDEsICdiJzogMiwgJ2MnOiAxIH0sIGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICogICAocmVzdWx0W3ZhbHVlXSB8fCAocmVzdWx0W3ZhbHVlXSA9IFtdKSkucHVzaChrZXkpO1xuICogICByZXR1cm4gcmVzdWx0O1xuICogfSwge30pO1xuICogLy8gPT4geyAnMSc6IFsnYScsICdjJ10sICcyJzogWydiJ10gfSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICovXG5mdW5jdGlvbiByZWR1Y2UoY29sbGVjdGlvbiwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5UmVkdWNlIDogYmFzZVJlZHVjZSxcbiAgICAgIGluaXRBY2N1bSA9IGFyZ3VtZW50cy5sZW5ndGggPCAzO1xuXG4gIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGJhc2VJdGVyYXRlZShpdGVyYXRlZSwgNCksIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0sIGJhc2VFYWNoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZWR1Y2U7XG4iLCJ2YXIgYmFzZUtleXMgPSByZXF1aXJlKCcuL19iYXNlS2V5cycpLFxuICAgIGdldFRhZyA9IHJlcXVpcmUoJy4vX2dldFRhZycpLFxuICAgIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZScpLFxuICAgIGlzU3RyaW5nID0gcmVxdWlyZSgnLi9pc1N0cmluZycpLFxuICAgIHN0cmluZ1NpemUgPSByZXF1aXJlKCcuL19zdHJpbmdTaXplJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBtYXBUYWcgPSAnW29iamVjdCBNYXBdJyxcbiAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJztcblxuLyoqXG4gKiBHZXRzIHRoZSBzaXplIG9mIGBjb2xsZWN0aW9uYCBieSByZXR1cm5pbmcgaXRzIGxlbmd0aCBmb3IgYXJyYXktbGlrZVxuICogdmFsdWVzIG9yIHRoZSBudW1iZXIgb2Ygb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgZm9yIG9iamVjdHMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpbnNwZWN0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29sbGVjdGlvbiBzaXplLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnNpemUoWzEsIDIsIDNdKTtcbiAqIC8vID0+IDNcbiAqXG4gKiBfLnNpemUoeyAnYSc6IDEsICdiJzogMiB9KTtcbiAqIC8vID0+IDJcbiAqXG4gKiBfLnNpemUoJ3BlYmJsZXMnKTtcbiAqIC8vID0+IDdcbiAqL1xuZnVuY3Rpb24gc2l6ZShjb2xsZWN0aW9uKSB7XG4gIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBpZiAoaXNBcnJheUxpa2UoY29sbGVjdGlvbikpIHtcbiAgICByZXR1cm4gaXNTdHJpbmcoY29sbGVjdGlvbikgPyBzdHJpbmdTaXplKGNvbGxlY3Rpb24pIDogY29sbGVjdGlvbi5sZW5ndGg7XG4gIH1cbiAgdmFyIHRhZyA9IGdldFRhZyhjb2xsZWN0aW9uKTtcbiAgaWYgKHRhZyA9PSBtYXBUYWcgfHwgdGFnID09IHNldFRhZykge1xuICAgIHJldHVybiBjb2xsZWN0aW9uLnNpemU7XG4gIH1cbiAgcmV0dXJuIGJhc2VLZXlzKGNvbGxlY3Rpb24pLmxlbmd0aDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzaXplO1xuIiwidmFyIGJhc2VGbGF0dGVuID0gcmVxdWlyZSgnLi9fYmFzZUZsYXR0ZW4nKSxcbiAgICBiYXNlT3JkZXJCeSA9IHJlcXVpcmUoJy4vX2Jhc2VPcmRlckJ5JyksXG4gICAgYmFzZVJlc3QgPSByZXF1aXJlKCcuL19iYXNlUmVzdCcpLFxuICAgIGlzSXRlcmF0ZWVDYWxsID0gcmVxdWlyZSgnLi9faXNJdGVyYXRlZUNhbGwnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIGVsZW1lbnRzLCBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyIGJ5IHRoZSByZXN1bHRzIG9mXG4gKiBydW5uaW5nIGVhY2ggZWxlbWVudCBpbiBhIGNvbGxlY3Rpb24gdGhydSBlYWNoIGl0ZXJhdGVlLiBUaGlzIG1ldGhvZFxuICogcGVyZm9ybXMgYSBzdGFibGUgc29ydCwgdGhhdCBpcywgaXQgcHJlc2VydmVzIHRoZSBvcmlnaW5hbCBzb3J0IG9yZGVyIG9mXG4gKiBlcXVhbCBlbGVtZW50cy4gVGhlIGl0ZXJhdGVlcyBhcmUgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHsuLi4oRnVuY3Rpb258RnVuY3Rpb25bXSl9IFtpdGVyYXRlZXM9W18uaWRlbnRpdHldXVxuICogIFRoZSBpdGVyYXRlZXMgdG8gc29ydCBieS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNvcnRlZCBhcnJheS5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIHVzZXJzID0gW1xuICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0OCB9LFxuICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiB9LFxuICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiAzMCB9LFxuICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNCB9XG4gKiBdO1xuICpcbiAqIF8uc29ydEJ5KHVzZXJzLCBbZnVuY3Rpb24obykgeyByZXR1cm4gby51c2VyOyB9XSk7XG4gKiAvLyA9PiBvYmplY3RzIGZvciBbWydiYXJuZXknLCAzNl0sIFsnYmFybmV5JywgMzRdLCBbJ2ZyZWQnLCA0OF0sIFsnZnJlZCcsIDMwXV1cbiAqXG4gKiBfLnNvcnRCeSh1c2VycywgWyd1c2VyJywgJ2FnZSddKTtcbiAqIC8vID0+IG9iamVjdHMgZm9yIFtbJ2Jhcm5leScsIDM0XSwgWydiYXJuZXknLCAzNl0sIFsnZnJlZCcsIDMwXSwgWydmcmVkJywgNDhdXVxuICovXG52YXIgc29ydEJ5ID0gYmFzZVJlc3QoZnVuY3Rpb24oY29sbGVjdGlvbiwgaXRlcmF0ZWVzKSB7XG4gIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgdmFyIGxlbmd0aCA9IGl0ZXJhdGVlcy5sZW5ndGg7XG4gIGlmIChsZW5ndGggPiAxICYmIGlzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24sIGl0ZXJhdGVlc1swXSwgaXRlcmF0ZWVzWzFdKSkge1xuICAgIGl0ZXJhdGVlcyA9IFtdO1xuICB9IGVsc2UgaWYgKGxlbmd0aCA+IDIgJiYgaXNJdGVyYXRlZUNhbGwoaXRlcmF0ZWVzWzBdLCBpdGVyYXRlZXNbMV0sIGl0ZXJhdGVlc1syXSkpIHtcbiAgICBpdGVyYXRlZXMgPSBbaXRlcmF0ZWVzWzBdXTtcbiAgfVxuICByZXR1cm4gYmFzZU9yZGVyQnkoY29sbGVjdGlvbiwgYmFzZUZsYXR0ZW4oaXRlcmF0ZWVzLCAxKSwgW10pO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gc29ydEJ5O1xuIiwiLyoqXG4gKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGVtcHR5IGFycmF5LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4xMy4wXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZW1wdHkgYXJyYXkuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBhcnJheXMgPSBfLnRpbWVzKDIsIF8uc3R1YkFycmF5KTtcbiAqXG4gKiBjb25zb2xlLmxvZyhhcnJheXMpO1xuICogLy8gPT4gW1tdLCBbXV1cbiAqXG4gKiBjb25zb2xlLmxvZyhhcnJheXNbMF0gPT09IGFycmF5c1sxXSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBzdHViQXJyYXkoKSB7XG4gIHJldHVybiBbXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdHViQXJyYXk7XG4iLCIvKipcbiAqIFRoaXMgbWV0aG9kIHJldHVybnMgYGZhbHNlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMTMuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udGltZXMoMiwgXy5zdHViRmFsc2UpO1xuICogLy8gPT4gW2ZhbHNlLCBmYWxzZV1cbiAqL1xuZnVuY3Rpb24gc3R1YkZhbHNlKCkge1xuICByZXR1cm4gZmFsc2U7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3R1YkZhbHNlO1xuIiwidmFyIHRvTnVtYmVyID0gcmVxdWlyZSgnLi90b051bWJlcicpO1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBJTkZJTklUWSA9IDEgLyAwLFxuICAgIE1BWF9JTlRFR0VSID0gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDg7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIGZpbml0ZSBudW1iZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjEyLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIG51bWJlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b0Zpbml0ZSgzLjIpO1xuICogLy8gPT4gMy4yXG4gKlxuICogXy50b0Zpbml0ZShOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDVlLTMyNFxuICpcbiAqIF8udG9GaW5pdGUoSW5maW5pdHkpO1xuICogLy8gPT4gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDhcbiAqXG4gKiBfLnRvRmluaXRlKCczLjInKTtcbiAqIC8vID0+IDMuMlxuICovXG5mdW5jdGlvbiB0b0Zpbml0ZSh2YWx1ZSkge1xuICBpZiAoIXZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiAwO1xuICB9XG4gIHZhbHVlID0gdG9OdW1iZXIodmFsdWUpO1xuICBpZiAodmFsdWUgPT09IElORklOSVRZIHx8IHZhbHVlID09PSAtSU5GSU5JVFkpIHtcbiAgICB2YXIgc2lnbiA9ICh2YWx1ZSA8IDAgPyAtMSA6IDEpO1xuICAgIHJldHVybiBzaWduICogTUFYX0lOVEVHRVI7XG4gIH1cbiAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZSA/IHZhbHVlIDogMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b0Zpbml0ZTtcbiIsInZhciB0b0Zpbml0ZSA9IHJlcXVpcmUoJy4vdG9GaW5pdGUnKTtcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGFuIGludGVnZXIuXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGxvb3NlbHkgYmFzZWQgb25cbiAqIFtgVG9JbnRlZ2VyYF0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRvaW50ZWdlcikuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgaW50ZWdlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b0ludGVnZXIoMy4yKTtcbiAqIC8vID0+IDNcbiAqXG4gKiBfLnRvSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDBcbiAqXG4gKiBfLnRvSW50ZWdlcihJbmZpbml0eSk7XG4gKiAvLyA9PiAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOFxuICpcbiAqIF8udG9JbnRlZ2VyKCczLjInKTtcbiAqIC8vID0+IDNcbiAqL1xuZnVuY3Rpb24gdG9JbnRlZ2VyKHZhbHVlKSB7XG4gIHZhciByZXN1bHQgPSB0b0Zpbml0ZSh2YWx1ZSksXG4gICAgICByZW1haW5kZXIgPSByZXN1bHQgJSAxO1xuXG4gIHJldHVybiByZXN1bHQgPT09IHJlc3VsdCA/IChyZW1haW5kZXIgPyByZXN1bHQgLSByZW1haW5kZXIgOiByZXN1bHQpIDogMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b0ludGVnZXI7XG4iLCJ2YXIgYmFzZVRyaW0gPSByZXF1aXJlKCcuL19iYXNlVHJpbScpLFxuICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpLFxuICAgIGlzU3ltYm9sID0gcmVxdWlyZSgnLi9pc1N5bWJvbCcpO1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBOQU4gPSAwIC8gMDtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJhZCBzaWduZWQgaGV4YWRlY2ltYWwgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzQmFkSGV4ID0gL15bLStdMHhbMC05YS1mXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBiaW5hcnkgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzQmluYXJ5ID0gL14wYlswMV0rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3Qgb2N0YWwgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzT2N0YWwgPSAvXjBvWzAtN10rJC9pO1xuXG4vKiogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgd2l0aG91dCBhIGRlcGVuZGVuY3kgb24gYHJvb3RgLiAqL1xudmFyIGZyZWVQYXJzZUludCA9IHBhcnNlSW50O1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBudW1iZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBudW1iZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9OdW1iZXIoMy4yKTtcbiAqIC8vID0+IDMuMlxuICpcbiAqIF8udG9OdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiA1ZS0zMjRcbiAqXG4gKiBfLnRvTnVtYmVyKEluZmluaXR5KTtcbiAqIC8vID0+IEluZmluaXR5XG4gKlxuICogXy50b051bWJlcignMy4yJyk7XG4gKiAvLyA9PiAzLjJcbiAqL1xuZnVuY3Rpb24gdG9OdW1iZXIodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgcmV0dXJuIE5BTjtcbiAgfVxuICBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgdmFyIG90aGVyID0gdHlwZW9mIHZhbHVlLnZhbHVlT2YgPT0gJ2Z1bmN0aW9uJyA/IHZhbHVlLnZhbHVlT2YoKSA6IHZhbHVlO1xuICAgIHZhbHVlID0gaXNPYmplY3Qob3RoZXIpID8gKG90aGVyICsgJycpIDogb3RoZXI7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogK3ZhbHVlO1xuICB9XG4gIHZhbHVlID0gYmFzZVRyaW0odmFsdWUpO1xuICB2YXIgaXNCaW5hcnkgPSByZUlzQmluYXJ5LnRlc3QodmFsdWUpO1xuICByZXR1cm4gKGlzQmluYXJ5IHx8IHJlSXNPY3RhbC50ZXN0KHZhbHVlKSlcbiAgICA/IGZyZWVQYXJzZUludCh2YWx1ZS5zbGljZSgyKSwgaXNCaW5hcnkgPyAyIDogOClcbiAgICA6IChyZUlzQmFkSGV4LnRlc3QodmFsdWUpID8gTkFOIDogK3ZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b051bWJlcjtcbiIsInZhciBjb3B5T2JqZWN0ID0gcmVxdWlyZSgnLi9fY29weU9iamVjdCcpLFxuICAgIGtleXNJbiA9IHJlcXVpcmUoJy4va2V5c0luJyk7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIHBsYWluIG9iamVjdCBmbGF0dGVuaW5nIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZ1xuICoga2V5ZWQgcHJvcGVydGllcyBvZiBgdmFsdWVgIHRvIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBwbGFpbiBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgcGxhaW4gb2JqZWN0LlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYiA9IDI7XG4gKiB9XG4gKlxuICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAqXG4gKiBfLmFzc2lnbih7ICdhJzogMSB9LCBuZXcgRm9vKTtcbiAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICpcbiAqIF8uYXNzaWduKHsgJ2EnOiAxIH0sIF8udG9QbGFpbk9iamVjdChuZXcgRm9vKSk7XG4gKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDMgfVxuICovXG5mdW5jdGlvbiB0b1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiBjb3B5T2JqZWN0KHZhbHVlLCBrZXlzSW4odmFsdWUpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b1BsYWluT2JqZWN0O1xuIiwidmFyIGJhc2VUb1N0cmluZyA9IHJlcXVpcmUoJy4vX2Jhc2VUb1N0cmluZycpO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcuIEFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCBmb3IgYG51bGxgXG4gKiBhbmQgYHVuZGVmaW5lZGAgdmFsdWVzLiBUaGUgc2lnbiBvZiBgLTBgIGlzIHByZXNlcnZlZC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9TdHJpbmcobnVsbCk7XG4gKiAvLyA9PiAnJ1xuICpcbiAqIF8udG9TdHJpbmcoLTApO1xuICogLy8gPT4gJy0wJ1xuICpcbiAqIF8udG9TdHJpbmcoWzEsIDIsIDNdKTtcbiAqIC8vID0+ICcxLDIsMydcbiAqL1xuZnVuY3Rpb24gdG9TdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09IG51bGwgPyAnJyA6IGJhc2VUb1N0cmluZyh2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdG9TdHJpbmc7XG4iLCJ2YXIgYXJyYXlFYWNoID0gcmVxdWlyZSgnLi9fYXJyYXlFYWNoJyksXG4gICAgYmFzZUNyZWF0ZSA9IHJlcXVpcmUoJy4vX2Jhc2VDcmVhdGUnKSxcbiAgICBiYXNlRm9yT3duID0gcmVxdWlyZSgnLi9fYmFzZUZvck93bicpLFxuICAgIGJhc2VJdGVyYXRlZSA9IHJlcXVpcmUoJy4vX2Jhc2VJdGVyYXRlZScpLFxuICAgIGdldFByb3RvdHlwZSA9IHJlcXVpcmUoJy4vX2dldFByb3RvdHlwZScpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBpc0J1ZmZlciA9IHJlcXVpcmUoJy4vaXNCdWZmZXInKSxcbiAgICBpc0Z1bmN0aW9uID0gcmVxdWlyZSgnLi9pc0Z1bmN0aW9uJyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0JyksXG4gICAgaXNUeXBlZEFycmF5ID0gcmVxdWlyZSgnLi9pc1R5cGVkQXJyYXknKTtcblxuLyoqXG4gKiBBbiBhbHRlcm5hdGl2ZSB0byBgXy5yZWR1Y2VgOyB0aGlzIG1ldGhvZCB0cmFuc2Zvcm1zIGBvYmplY3RgIHRvIGEgbmV3XG4gKiBgYWNjdW11bGF0b3JgIG9iamVjdCB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgZWFjaCBvZiBpdHMgb3duXG4gKiBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIHRocnUgYGl0ZXJhdGVlYCwgd2l0aCBlYWNoIGludm9jYXRpb25cbiAqIHBvdGVudGlhbGx5IG11dGF0aW5nIHRoZSBgYWNjdW11bGF0b3JgIG9iamVjdC4gSWYgYGFjY3VtdWxhdG9yYCBpcyBub3RcbiAqIHByb3ZpZGVkLCBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgc2FtZSBgW1tQcm90b3R5cGVdXWAgd2lsbCBiZSB1c2VkLiBUaGVcbiAqIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBmb3VyIGFyZ3VtZW50czogKGFjY3VtdWxhdG9yLCB2YWx1ZSwga2V5LCBvYmplY3QpLlxuICogSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0IGl0ZXJhdGlvbiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMS4zLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7Kn0gW2FjY3VtdWxhdG9yXSBUaGUgY3VzdG9tIGFjY3VtdWxhdG9yIHZhbHVlLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRyYW5zZm9ybShbMiwgMywgNF0sIGZ1bmN0aW9uKHJlc3VsdCwgbikge1xuICogICByZXN1bHQucHVzaChuICo9IG4pO1xuICogICByZXR1cm4gbiAlIDIgPT0gMDtcbiAqIH0sIFtdKTtcbiAqIC8vID0+IFs0LCA5XVxuICpcbiAqIF8udHJhbnNmb3JtKHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMSB9LCBmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAqICAgKHJlc3VsdFt2YWx1ZV0gfHwgKHJlc3VsdFt2YWx1ZV0gPSBbXSkpLnB1c2goa2V5KTtcbiAqIH0sIHt9KTtcbiAqIC8vID0+IHsgJzEnOiBbJ2EnLCAnYyddLCAnMic6IFsnYiddIH1cbiAqL1xuZnVuY3Rpb24gdHJhbnNmb3JtKG9iamVjdCwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gIHZhciBpc0FyciA9IGlzQXJyYXkob2JqZWN0KSxcbiAgICAgIGlzQXJyTGlrZSA9IGlzQXJyIHx8IGlzQnVmZmVyKG9iamVjdCkgfHwgaXNUeXBlZEFycmF5KG9iamVjdCk7XG5cbiAgaXRlcmF0ZWUgPSBiYXNlSXRlcmF0ZWUoaXRlcmF0ZWUsIDQpO1xuICBpZiAoYWNjdW11bGF0b3IgPT0gbnVsbCkge1xuICAgIHZhciBDdG9yID0gb2JqZWN0ICYmIG9iamVjdC5jb25zdHJ1Y3RvcjtcbiAgICBpZiAoaXNBcnJMaWtlKSB7XG4gICAgICBhY2N1bXVsYXRvciA9IGlzQXJyID8gbmV3IEN0b3IgOiBbXTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNPYmplY3Qob2JqZWN0KSkge1xuICAgICAgYWNjdW11bGF0b3IgPSBpc0Z1bmN0aW9uKEN0b3IpID8gYmFzZUNyZWF0ZShnZXRQcm90b3R5cGUob2JqZWN0KSkgOiB7fTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBhY2N1bXVsYXRvciA9IHt9O1xuICAgIH1cbiAgfVxuICAoaXNBcnJMaWtlID8gYXJyYXlFYWNoIDogYmFzZUZvck93bikob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIG9iamVjdCkge1xuICAgIHJldHVybiBpdGVyYXRlZShhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4LCBvYmplY3QpO1xuICB9KTtcbiAgcmV0dXJuIGFjY3VtdWxhdG9yO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRyYW5zZm9ybTtcbiIsInZhciBiYXNlRmxhdHRlbiA9IHJlcXVpcmUoJy4vX2Jhc2VGbGF0dGVuJyksXG4gICAgYmFzZVJlc3QgPSByZXF1aXJlKCcuL19iYXNlUmVzdCcpLFxuICAgIGJhc2VVbmlxID0gcmVxdWlyZSgnLi9fYmFzZVVuaXEnKSxcbiAgICBpc0FycmF5TGlrZU9iamVjdCA9IHJlcXVpcmUoJy4vaXNBcnJheUxpa2VPYmplY3QnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHVuaXF1ZSB2YWx1ZXMsIGluIG9yZGVyLCBmcm9tIGFsbCBnaXZlbiBhcnJheXMgdXNpbmdcbiAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21iaW5lZCB2YWx1ZXMuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udW5pb24oWzJdLCBbMSwgMl0pO1xuICogLy8gPT4gWzIsIDFdXG4gKi9cbnZhciB1bmlvbiA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICByZXR1cm4gYmFzZVVuaXEoYmFzZUZsYXR0ZW4oYXJyYXlzLCAxLCBpc0FycmF5TGlrZU9iamVjdCwgdHJ1ZSkpO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gdW5pb247XG4iLCJ2YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuL3RvU3RyaW5nJyk7XG5cbi8qKiBVc2VkIHRvIGdlbmVyYXRlIHVuaXF1ZSBJRHMuICovXG52YXIgaWRDb3VudGVyID0gMDtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSB1bmlxdWUgSUQuIElmIGBwcmVmaXhgIGlzIGdpdmVuLCB0aGUgSUQgaXMgYXBwZW5kZWQgdG8gaXQuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7c3RyaW5nfSBbcHJlZml4PScnXSBUaGUgdmFsdWUgdG8gcHJlZml4IHRoZSBJRCB3aXRoLlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdW5pcXVlIElELlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnVuaXF1ZUlkKCdjb250YWN0XycpO1xuICogLy8gPT4gJ2NvbnRhY3RfMTA0J1xuICpcbiAqIF8udW5pcXVlSWQoKTtcbiAqIC8vID0+ICcxMDUnXG4gKi9cbmZ1bmN0aW9uIHVuaXF1ZUlkKHByZWZpeCkge1xuICB2YXIgaWQgPSArK2lkQ291bnRlcjtcbiAgcmV0dXJuIHRvU3RyaW5nKHByZWZpeCkgKyBpZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB1bmlxdWVJZDtcbiIsInZhciBiYXNlVmFsdWVzID0gcmVxdWlyZSgnLi9fYmFzZVZhbHVlcycpLFxuICAgIGtleXMgPSByZXF1aXJlKCcuL2tleXMnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydHkgdmFsdWVzIG9mIGBvYmplY3RgLlxuICpcbiAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYSA9IDE7XG4gKiAgIHRoaXMuYiA9IDI7XG4gKiB9XG4gKlxuICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAqXG4gKiBfLnZhbHVlcyhuZXcgRm9vKTtcbiAqIC8vID0+IFsxLCAyXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICpcbiAqIF8udmFsdWVzKCdoaScpO1xuICogLy8gPT4gWydoJywgJ2knXVxuICovXG5mdW5jdGlvbiB2YWx1ZXMob2JqZWN0KSB7XG4gIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IFtdIDogYmFzZVZhbHVlcyhvYmplY3QsIGtleXMob2JqZWN0KSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdmFsdWVzO1xuIiwidmFyIGFzc2lnblZhbHVlID0gcmVxdWlyZSgnLi9fYXNzaWduVmFsdWUnKSxcbiAgICBiYXNlWmlwT2JqZWN0ID0gcmVxdWlyZSgnLi9fYmFzZVppcE9iamVjdCcpO1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZnJvbVBhaXJzYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIHR3byBhcnJheXMsXG4gKiBvbmUgb2YgcHJvcGVydHkgaWRlbnRpZmllcnMgYW5kIG9uZSBvZiBjb3JyZXNwb25kaW5nIHZhbHVlcy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuNC4wXG4gKiBAY2F0ZWdvcnkgQXJyYXlcbiAqIEBwYXJhbSB7QXJyYXl9IFtwcm9wcz1bXV0gVGhlIHByb3BlcnR5IGlkZW50aWZpZXJzLlxuICogQHBhcmFtIHtBcnJheX0gW3ZhbHVlcz1bXV0gVGhlIHByb3BlcnR5IHZhbHVlcy5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uemlwT2JqZWN0KFsnYScsICdiJ10sIFsxLCAyXSk7XG4gKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH1cbiAqL1xuZnVuY3Rpb24gemlwT2JqZWN0KHByb3BzLCB2YWx1ZXMpIHtcbiAgcmV0dXJuIGJhc2VaaXBPYmplY3QocHJvcHMgfHwgW10sIHZhbHVlcyB8fCBbXSwgYXNzaWduVmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHppcE9iamVjdDtcbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSAnU0VDUkVUX0RPX05PVF9QQVNTX1RISVNfT1JfWU9VX1dJTExfQkVfRklSRUQnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0UHJvcFR5cGVzU2VjcmV0O1xuIiwiZXhwb3J0IGZ1bmN0aW9uIHl1djJyZ2IoeXV2KSB7XG4gIHZhciB5ID0geXV2WzBdLFxuICAgICAgdSA9IHl1dlsxXSxcbiAgICAgIHYgPSB5dXZbMl07XG4gIHZhciByLCBnLCBiO1xuICByID0geSAqIDEgKyB1ICogMCArIHYgKiAxLjEzOTgzO1xuICBnID0geSAqIDEgKyB1ICogLTAuMzk0NjUgKyB2ICogLTAuNTgwNjtcbiAgYiA9IHkgKiAxICsgdSAqIDIuMDIzMTEgKyB2ICogMDtcbiAgciA9IE1hdGgubWluKE1hdGgubWF4KDAsIHIpLCAxKTtcbiAgZyA9IE1hdGgubWluKE1hdGgubWF4KDAsIGcpLCAxKTtcbiAgYiA9IE1hdGgubWluKE1hdGgubWF4KDAsIGIpLCAxKTtcbiAgcmV0dXJuIFtyICogMjU1LCBnICogMjU1LCBiICogMjU1XTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZ2IyeXV2KHJnYikge1xuICB2YXIgciA9IHJnYlswXSAvIDI1NSxcbiAgICAgIGcgPSByZ2JbMV0gLyAyNTUsXG4gICAgICBiID0gcmdiWzJdIC8gMjU1O1xuICB2YXIgeSA9IHIgKiAwLjI5OSArIGcgKiAwLjU4NyArIGIgKiAwLjExNDtcbiAgdmFyIHUgPSByICogLTAuMTQ3MTMgKyBnICogLTAuMjg4ODYgKyBiICogMC40MzY7XG4gIHZhciB2ID0gciAqIDAuNjE1ICsgZyAqIC0wLjUxNDk5ICsgYiAqIC0wLjEwMDAxO1xuICByZXR1cm4gW3ksIHUsIHZdO1xufSIsImltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZlwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXlcIjtcblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuaW1wb3J0ICogYXMgYmFzZTE2IGZyb20gJ2Jhc2UxNic7XG5pbXBvcnQgQ29sb3IgZnJvbSAnY29sb3InO1xuaW1wb3J0IGN1cnJ5IGZyb20gJ2xvZGFzaC5jdXJyeSc7XG5pbXBvcnQgeyB5dXYycmdiLCByZ2IyeXV2IH0gZnJvbSAnLi9jb2xvckNvbnZlcnRlcnMnO1xudmFyIERFRkFVTFRfQkFTRTE2ID0gYmFzZTE2LmRlZmF1bHQ7XG52YXIgQkFTRTE2X0tFWVMgPSBPYmplY3Qua2V5cyhERUZBVUxUX0JBU0UxNik7IC8vIHdlIG5lZWQgYSBjb3JyZWN0aW5nIGZhY3Rvciwgc28gdGhhdCBhIGRhcmssIGJ1dCBub3QgYmxhY2sgYmFja2dyb3VuZCBjb2xvclxuLy8gY29udmVydHMgdG8gYnJpZ2h0IGVub3VnaCBpbnZlcnNlZCBjb2xvclxuXG52YXIgZmxpcCA9IGZ1bmN0aW9uIGZsaXAoeCkge1xuICByZXR1cm4geCA8IDAuMjUgPyAxIDogeCA8IDAuNSA/IDAuOSAtIHggOiAxLjEgLSB4O1xufTtcblxudmFyIGludmVydENvbG9yID0gZnVuY3Rpb24gaW52ZXJ0Q29sb3IoaGV4U3RyaW5nKSB7XG4gIHZhciBjb2xvciA9IENvbG9yKGhleFN0cmluZyk7XG5cbiAgdmFyIF9yZ2IyeXV2ID0gcmdiMnl1dihjb2xvci5hcnJheSgpKSxcbiAgICAgIF9yZ2IyeXV2MiA9IF9zbGljZWRUb0FycmF5KF9yZ2IyeXV2LCAzKSxcbiAgICAgIHkgPSBfcmdiMnl1djJbMF0sXG4gICAgICB1ID0gX3JnYjJ5dXYyWzFdLFxuICAgICAgdiA9IF9yZ2IyeXV2MlsyXTtcblxuICB2YXIgZmxpcHBlZFl1diA9IFtmbGlwKHkpLCB1LCB2XTtcbiAgdmFyIHJnYiA9IHl1djJyZ2IoZmxpcHBlZFl1dik7XG4gIHJldHVybiBDb2xvci5yZ2IocmdiKS5oZXgoKTtcbn07XG5cbnZhciBtZXJnZXIgPSBmdW5jdGlvbiBtZXJnZXIoc3R5bGluZykge1xuICByZXR1cm4gZnVuY3Rpb24gKHByZXZTdHlsaW5nKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNsYXNzTmFtZTogW3ByZXZTdHlsaW5nLmNsYXNzTmFtZSwgc3R5bGluZy5jbGFzc05hbWVdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJyksXG4gICAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcmV2U3R5bGluZy5zdHlsZSB8fCB7fSksIHN0eWxpbmcuc3R5bGUgfHwge30pXG4gICAgfTtcbiAgfTtcbn07XG5cbnZhciBtZXJnZVN0eWxpbmcgPSBmdW5jdGlvbiBtZXJnZVN0eWxpbmcoY3VzdG9tU3R5bGluZywgZGVmYXVsdFN0eWxpbmcpIHtcbiAgaWYgKGN1c3RvbVN0eWxpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBkZWZhdWx0U3R5bGluZztcbiAgfVxuXG4gIGlmIChkZWZhdWx0U3R5bGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGN1c3RvbVN0eWxpbmc7XG4gIH1cblxuICB2YXIgY3VzdG9tVHlwZSA9IF90eXBlb2YoY3VzdG9tU3R5bGluZyk7XG5cbiAgdmFyIGRlZmF1bHRUeXBlID0gX3R5cGVvZihkZWZhdWx0U3R5bGluZyk7XG5cbiAgc3dpdGNoIChjdXN0b21UeXBlKSB7XG4gICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIHN3aXRjaCAoZGVmYXVsdFR5cGUpIHtcbiAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICByZXR1cm4gW2RlZmF1bHRTdHlsaW5nLCBjdXN0b21TdHlsaW5nXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuXG4gICAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgICAgcmV0dXJuIG1lcmdlcih7XG4gICAgICAgICAgICBjbGFzc05hbWU6IGN1c3RvbVN0eWxpbmcsXG4gICAgICAgICAgICBzdHlsZTogZGVmYXVsdFN0eWxpbmdcbiAgICAgICAgICB9KTtcblxuICAgICAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChzdHlsaW5nKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgICAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbWVyZ2VyKHtcbiAgICAgICAgICAgICAgY2xhc3NOYW1lOiBjdXN0b21TdHlsaW5nXG4gICAgICAgICAgICB9KShkZWZhdWx0U3R5bGluZy5hcHBseSh2b2lkIDAsIFtzdHlsaW5nXS5jb25jYXQoYXJncykpKTtcbiAgICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICBzd2l0Y2ggKGRlZmF1bHRUeXBlKSB7XG4gICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgcmV0dXJuIG1lcmdlcih7XG4gICAgICAgICAgICBjbGFzc05hbWU6IGRlZmF1bHRTdHlsaW5nLFxuICAgICAgICAgICAgc3R5bGU6IGN1c3RvbVN0eWxpbmdcbiAgICAgICAgICB9KTtcblxuICAgICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGRlZmF1bHRTdHlsaW5nKSwgY3VzdG9tU3R5bGluZyk7XG5cbiAgICAgICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoc3R5bGluZykge1xuICAgICAgICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4yID4gMSA/IF9sZW4yIC0gMSA6IDApLCBfa2V5MiA9IDE7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgICAgICAgICAgYXJnc1tfa2V5MiAtIDFdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG1lcmdlcih7XG4gICAgICAgICAgICAgIHN0eWxlOiBjdXN0b21TdHlsaW5nXG4gICAgICAgICAgICB9KShkZWZhdWx0U3R5bGluZy5hcHBseSh2b2lkIDAsIFtzdHlsaW5nXS5jb25jYXQoYXJncykpKTtcbiAgICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgIHN3aXRjaCAoZGVmYXVsdFR5cGUpIHtcbiAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHN0eWxpbmcpIHtcbiAgICAgICAgICAgIGZvciAodmFyIF9sZW4zID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMyA+IDEgPyBfbGVuMyAtIDEgOiAwKSwgX2tleTMgPSAxOyBfa2V5MyA8IF9sZW4zOyBfa2V5MysrKSB7XG4gICAgICAgICAgICAgIGFyZ3NbX2tleTMgLSAxXSA9IGFyZ3VtZW50c1tfa2V5M107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBjdXN0b21TdHlsaW5nLmFwcGx5KHZvaWQgMCwgW21lcmdlcihzdHlsaW5nKSh7XG4gICAgICAgICAgICAgIGNsYXNzTmFtZTogZGVmYXVsdFN0eWxpbmdcbiAgICAgICAgICAgIH0pXS5jb25jYXQoYXJncykpO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHN0eWxpbmcpIHtcbiAgICAgICAgICAgIGZvciAodmFyIF9sZW40ID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuNCA+IDEgPyBfbGVuNCAtIDEgOiAwKSwgX2tleTQgPSAxOyBfa2V5NCA8IF9sZW40OyBfa2V5NCsrKSB7XG4gICAgICAgICAgICAgIGFyZ3NbX2tleTQgLSAxXSA9IGFyZ3VtZW50c1tfa2V5NF07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBjdXN0b21TdHlsaW5nLmFwcGx5KHZvaWQgMCwgW21lcmdlcihzdHlsaW5nKSh7XG4gICAgICAgICAgICAgIHN0eWxlOiBkZWZhdWx0U3R5bGluZ1xuICAgICAgICAgICAgfSldLmNvbmNhdChhcmdzKSk7XG4gICAgICAgICAgfTtcblxuICAgICAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChzdHlsaW5nKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBfbGVuNSA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjUgPiAxID8gX2xlbjUgLSAxIDogMCksIF9rZXk1ID0gMTsgX2tleTUgPCBfbGVuNTsgX2tleTUrKykge1xuICAgICAgICAgICAgICBhcmdzW19rZXk1IC0gMV0gPSBhcmd1bWVudHNbX2tleTVdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gY3VzdG9tU3R5bGluZy5hcHBseSh2b2lkIDAsIFtkZWZhdWx0U3R5bGluZy5hcHBseSh2b2lkIDAsIFtzdHlsaW5nXS5jb25jYXQoYXJncykpXS5jb25jYXQoYXJncykpO1xuICAgICAgICAgIH07XG4gICAgICB9XG5cbiAgfVxufTtcblxudmFyIG1lcmdlU3R5bGluZ3MgPSBmdW5jdGlvbiBtZXJnZVN0eWxpbmdzKGN1c3RvbVN0eWxpbmdzLCBkZWZhdWx0U3R5bGluZ3MpIHtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhkZWZhdWx0U3R5bGluZ3MpO1xuXG4gIGZvciAodmFyIGtleSBpbiBjdXN0b21TdHlsaW5ncykge1xuICAgIGlmIChrZXlzLmluZGV4T2Yoa2V5KSA9PT0gLTEpIGtleXMucHVzaChrZXkpO1xuICB9XG5cbiAgcmV0dXJuIGtleXMucmVkdWNlKGZ1bmN0aW9uIChtZXJnZWRTdHlsaW5nLCBrZXkpIHtcbiAgICByZXR1cm4gbWVyZ2VkU3R5bGluZ1trZXldID0gbWVyZ2VTdHlsaW5nKGN1c3RvbVN0eWxpbmdzW2tleV0sIGRlZmF1bHRTdHlsaW5nc1trZXldKSwgbWVyZ2VkU3R5bGluZztcbiAgfSwge30pO1xufTtcblxudmFyIGdldFN0eWxpbmdCeUtleXMgPSBmdW5jdGlvbiBnZXRTdHlsaW5nQnlLZXlzKG1lcmdlZFN0eWxpbmcsIGtleXMpIHtcbiAgZm9yICh2YXIgX2xlbjYgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW42ID4gMiA/IF9sZW42IC0gMiA6IDApLCBfa2V5NiA9IDI7IF9rZXk2IDwgX2xlbjY7IF9rZXk2KyspIHtcbiAgICBhcmdzW19rZXk2IC0gMl0gPSBhcmd1bWVudHNbX2tleTZdO1xuICB9XG5cbiAgaWYgKGtleXMgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbWVyZ2VkU3R5bGluZztcbiAgfVxuXG4gIGlmICghQXJyYXkuaXNBcnJheShrZXlzKSkge1xuICAgIGtleXMgPSBba2V5c107XG4gIH1cblxuICB2YXIgc3R5bGVzID0ga2V5cy5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBtZXJnZWRTdHlsaW5nW2tleV07XG4gIH0pLmZpbHRlcihCb29sZWFuKTtcbiAgdmFyIHByb3BzID0gc3R5bGVzLnJlZHVjZShmdW5jdGlvbiAob2JqLCBzKSB7XG4gICAgaWYgKHR5cGVvZiBzID09PSAnc3RyaW5nJykge1xuICAgICAgb2JqLmNsYXNzTmFtZSA9IFtvYmouY2xhc3NOYW1lLCBzXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuICAgIH0gZWxzZSBpZiAoX3R5cGVvZihzKSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIG9iai5zdHlsZSA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgb2JqLnN0eWxlKSwgcyk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgb2JqID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBvYmopLCBzLmFwcGx5KHZvaWQgMCwgW29ial0uY29uY2F0KGFyZ3MpKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iajtcbiAgfSwge1xuICAgIGNsYXNzTmFtZTogJycsXG4gICAgc3R5bGU6IHt9XG4gIH0pO1xuXG4gIGlmICghcHJvcHMuY2xhc3NOYW1lKSB7XG4gICAgZGVsZXRlIHByb3BzLmNsYXNzTmFtZTtcbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyhwcm9wcy5zdHlsZSkubGVuZ3RoID09PSAwKSB7XG4gICAgZGVsZXRlIHByb3BzLnN0eWxlO1xuICB9XG5cbiAgcmV0dXJuIHByb3BzO1xufTtcblxuZXhwb3J0IHZhciBpbnZlcnRCYXNlMTZUaGVtZSA9IGZ1bmN0aW9uIGludmVydEJhc2UxNlRoZW1lKGJhc2UxNlRoZW1lKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhiYXNlMTZUaGVtZSkucmVkdWNlKGZ1bmN0aW9uICh0LCBrZXkpIHtcbiAgICByZXR1cm4gdFtrZXldID0gL15iYXNlLy50ZXN0KGtleSkgPyBpbnZlcnRDb2xvcihiYXNlMTZUaGVtZVtrZXldKSA6IGtleSA9PT0gJ3NjaGVtZScgPyBiYXNlMTZUaGVtZVtrZXldICsgJzppbnZlcnRlZCcgOiBiYXNlMTZUaGVtZVtrZXldLCB0O1xuICB9LCB7fSk7XG59O1xuZXhwb3J0IHZhciBjcmVhdGVTdHlsaW5nID0gY3VycnkoZnVuY3Rpb24gKGdldFN0eWxpbmdGcm9tQmFzZTE2KSB7XG4gIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgdmFyIHRoZW1lT3JTdHlsaW5nID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcbiAgdmFyIF9vcHRpb25zJGRlZmF1bHRCYXNlID0gb3B0aW9ucy5kZWZhdWx0QmFzZTE2LFxuICAgICAgZGVmYXVsdEJhc2UxNiA9IF9vcHRpb25zJGRlZmF1bHRCYXNlID09PSB2b2lkIDAgPyBERUZBVUxUX0JBU0UxNiA6IF9vcHRpb25zJGRlZmF1bHRCYXNlLFxuICAgICAgX29wdGlvbnMkYmFzZTE2VGhlbWVzID0gb3B0aW9ucy5iYXNlMTZUaGVtZXMsXG4gICAgICBiYXNlMTZUaGVtZXMgPSBfb3B0aW9ucyRiYXNlMTZUaGVtZXMgPT09IHZvaWQgMCA/IG51bGwgOiBfb3B0aW9ucyRiYXNlMTZUaGVtZXM7XG4gIHZhciBiYXNlMTZUaGVtZSA9IGdldEJhc2UxNlRoZW1lKHRoZW1lT3JTdHlsaW5nLCBiYXNlMTZUaGVtZXMpO1xuXG4gIGlmIChiYXNlMTZUaGVtZSkge1xuICAgIHRoZW1lT3JTdHlsaW5nID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBiYXNlMTZUaGVtZSksIHRoZW1lT3JTdHlsaW5nKTtcbiAgfVxuXG4gIHZhciB0aGVtZSA9IEJBU0UxNl9LRVlTLnJlZHVjZShmdW5jdGlvbiAodCwga2V5KSB7XG4gICAgcmV0dXJuIHRba2V5XSA9IHRoZW1lT3JTdHlsaW5nW2tleV0gfHwgZGVmYXVsdEJhc2UxNltrZXldLCB0O1xuICB9LCB7fSk7XG4gIHZhciBjdXN0b21TdHlsaW5nID0gT2JqZWN0LmtleXModGhlbWVPclN0eWxpbmcpLnJlZHVjZShmdW5jdGlvbiAocywga2V5KSB7XG4gICAgcmV0dXJuIEJBU0UxNl9LRVlTLmluZGV4T2Yoa2V5KSA9PT0gLTEgPyAoc1trZXldID0gdGhlbWVPclN0eWxpbmdba2V5XSwgcykgOiBzO1xuICB9LCB7fSk7XG4gIHZhciBkZWZhdWx0U3R5bGluZyA9IGdldFN0eWxpbmdGcm9tQmFzZTE2KHRoZW1lKTtcbiAgdmFyIG1lcmdlZFN0eWxpbmcgPSBtZXJnZVN0eWxpbmdzKGN1c3RvbVN0eWxpbmcsIGRlZmF1bHRTdHlsaW5nKTtcblxuICBmb3IgKHZhciBfbGVuNyA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjcgPiAzID8gX2xlbjcgLSAzIDogMCksIF9rZXk3ID0gMzsgX2tleTcgPCBfbGVuNzsgX2tleTcrKykge1xuICAgIGFyZ3NbX2tleTcgLSAzXSA9IGFyZ3VtZW50c1tfa2V5N107XG4gIH1cblxuICByZXR1cm4gY3VycnkoZ2V0U3R5bGluZ0J5S2V5cywgMikuYXBwbHkodm9pZCAwLCBbbWVyZ2VkU3R5bGluZ10uY29uY2F0KGFyZ3MpKTtcbn0sIDMpO1xuXG52YXIgaXNTdHlsaW5nQ29uZmlnID0gZnVuY3Rpb24gaXNTdHlsaW5nQ29uZmlnKHRoZW1lKSB7XG4gIHJldHVybiAhIXRoZW1lLmV4dGVuZDtcbn07XG5cbmV4cG9ydCB2YXIgZ2V0QmFzZTE2VGhlbWUgPSBmdW5jdGlvbiBnZXRCYXNlMTZUaGVtZSh0aGVtZSwgYmFzZTE2VGhlbWVzKSB7XG4gIGlmICh0aGVtZSAmJiBpc1N0eWxpbmdDb25maWcodGhlbWUpICYmIHRoZW1lLmV4dGVuZCkge1xuICAgIHRoZW1lID0gdGhlbWUuZXh0ZW5kO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0aGVtZSA9PT0gJ3N0cmluZycpIHtcbiAgICB2YXIgX3RoZW1lJHNwbGl0ID0gdGhlbWUuc3BsaXQoJzonKSxcbiAgICAgICAgX3RoZW1lJHNwbGl0MiA9IF9zbGljZWRUb0FycmF5KF90aGVtZSRzcGxpdCwgMiksXG4gICAgICAgIF90aGVtZU5hbWUgPSBfdGhlbWUkc3BsaXQyWzBdLFxuICAgICAgICBtb2RpZmllciA9IF90aGVtZSRzcGxpdDJbMV07XG5cbiAgICBpZiAoYmFzZTE2VGhlbWVzKSB7XG4gICAgICB0aGVtZSA9IGJhc2UxNlRoZW1lc1tfdGhlbWVOYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhlbWUgPSBiYXNlMTZbX3RoZW1lTmFtZV07XG4gICAgfVxuXG4gICAgaWYgKG1vZGlmaWVyID09PSAnaW52ZXJ0ZWQnKSB7XG4gICAgICB0aGVtZSA9IGludmVydEJhc2UxNlRoZW1lKHRoZW1lKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhlbWUgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoZW1lLCAnYmFzZTAwJykgPyB0aGVtZSA6IHVuZGVmaW5lZDtcbn07XG5leHBvcnQgdmFyIGludmVydFRoZW1lID0gZnVuY3Rpb24gaW52ZXJ0VGhlbWUodGhlbWUpIHtcbiAgaWYgKHR5cGVvZiB0aGVtZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gXCJcIi5jb25jYXQodGhlbWUsIFwiOmludmVydGVkXCIpO1xuICB9XG5cbiAgaWYgKHRoZW1lICYmIGlzU3R5bGluZ0NvbmZpZyh0aGVtZSkgJiYgdGhlbWUuZXh0ZW5kKSB7XG4gICAgaWYgKHR5cGVvZiB0aGVtZS5leHRlbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCB0aGVtZSksIHt9LCB7XG4gICAgICAgIGV4dGVuZDogXCJcIi5jb25jYXQodGhlbWUuZXh0ZW5kLCBcIjppbnZlcnRlZFwiKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgdGhlbWUpLCB7fSwge1xuICAgICAgZXh0ZW5kOiBpbnZlcnRCYXNlMTZUaGVtZSh0aGVtZS5leHRlbmQpXG4gICAgfSk7XG4gIH1cblxuICBpZiAodGhlbWUpIHtcbiAgICByZXR1cm4gaW52ZXJ0QmFzZTE2VGhlbWUodGhlbWUpO1xuICB9XG5cbiAgcmV0dXJuIHRoZW1lO1xufTtcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMnOyIsIi8qKiBAbGljZW5zZSBSZWFjdCB2MTYuMTMuMVxuICogcmVhY3QtaXMuZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cblxuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIChmdW5jdGlvbigpIHtcbid1c2Ugc3RyaWN0JztcblxuLy8gVGhlIFN5bWJvbCB1c2VkIHRvIHRhZyB0aGUgUmVhY3RFbGVtZW50LWxpa2UgdHlwZXMuIElmIHRoZXJlIGlzIG5vIG5hdGl2ZSBTeW1ib2xcbi8vIG5vciBwb2x5ZmlsbCwgdGhlbiBhIHBsYWluIG51bWJlciBpcyB1c2VkIGZvciBwZXJmb3JtYW5jZS5cbnZhciBoYXNTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5mb3I7XG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpIDogMHhlYWM3O1xudmFyIFJFQUNUX1BPUlRBTF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QucG9ydGFsJykgOiAweGVhY2E7XG52YXIgUkVBQ1RfRlJBR01FTlRfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmZyYWdtZW50JykgOiAweGVhY2I7XG52YXIgUkVBQ1RfU1RSSUNUX01PREVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnN0cmljdF9tb2RlJykgOiAweGVhY2M7XG52YXIgUkVBQ1RfUFJPRklMRVJfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnByb2ZpbGVyJykgOiAweGVhZDI7XG52YXIgUkVBQ1RfUFJPVklERVJfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnByb3ZpZGVyJykgOiAweGVhY2Q7XG52YXIgUkVBQ1RfQ09OVEVYVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuY29udGV4dCcpIDogMHhlYWNlOyAvLyBUT0RPOiBXZSBkb24ndCB1c2UgQXN5bmNNb2RlIG9yIENvbmN1cnJlbnRNb2RlIGFueW1vcmUuIFRoZXkgd2VyZSB0ZW1wb3Jhcnlcbi8vICh1bnN0YWJsZSkgQVBJcyB0aGF0IGhhdmUgYmVlbiByZW1vdmVkLiBDYW4gd2UgcmVtb3ZlIHRoZSBzeW1ib2xzP1xuXG52YXIgUkVBQ1RfQVNZTkNfTU9ERV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuYXN5bmNfbW9kZScpIDogMHhlYWNmO1xudmFyIFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuY29uY3VycmVudF9tb2RlJykgOiAweGVhY2Y7XG52YXIgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmZvcndhcmRfcmVmJykgOiAweGVhZDA7XG52YXIgUkVBQ1RfU1VTUEVOU0VfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlJykgOiAweGVhZDE7XG52YXIgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2VfbGlzdCcpIDogMHhlYWQ4O1xudmFyIFJFQUNUX01FTU9fVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0Lm1lbW8nKSA6IDB4ZWFkMztcbnZhciBSRUFDVF9MQVpZX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5sYXp5JykgOiAweGVhZDQ7XG52YXIgUkVBQ1RfQkxPQ0tfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmJsb2NrJykgOiAweGVhZDk7XG52YXIgUkVBQ1RfRlVOREFNRU5UQUxfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmZ1bmRhbWVudGFsJykgOiAweGVhZDU7XG52YXIgUkVBQ1RfUkVTUE9OREVSX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5yZXNwb25kZXInKSA6IDB4ZWFkNjtcbnZhciBSRUFDVF9TQ09QRV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3Quc2NvcGUnKSA6IDB4ZWFkNztcblxuZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJyB8fCAvLyBOb3RlOiBpdHMgdHlwZW9mIG1pZ2h0IGJlIG90aGVyIHRoYW4gJ3N5bWJvbCcgb3IgJ251bWJlcicgaWYgaXQncyBhIHBvbHlmaWxsLlxuICB0eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1BST0ZJTEVSX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCAmJiAodHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9QUk9WSURFUl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NPTlRFWFRfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZVTkRBTUVOVEFMX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfUkVTUE9OREVSX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfU0NPUEVfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9CTE9DS19UWVBFKTtcbn1cblxuZnVuY3Rpb24gdHlwZU9mKG9iamVjdCkge1xuICBpZiAodHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyICQkdHlwZW9mID0gb2JqZWN0LiQkdHlwZW9mO1xuXG4gICAgc3dpdGNoICgkJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgIHZhciB0eXBlID0gb2JqZWN0LnR5cGU7XG5cbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgY2FzZSBSRUFDVF9BU1lOQ19NT0RFX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX0ZSQUdNRU5UX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9QUk9GSUxFUl9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICAgICAgICByZXR1cm4gdHlwZTtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB2YXIgJCR0eXBlb2ZUeXBlID0gdHlwZSAmJiB0eXBlLiQkdHlwZW9mO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKCQkdHlwZW9mVHlwZSkge1xuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfUFJPVklERVJfVFlQRTpcbiAgICAgICAgICAgICAgICByZXR1cm4gJCR0eXBlb2ZUeXBlO1xuXG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuICQkdHlwZW9mO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgcmV0dXJuICQkdHlwZW9mO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59IC8vIEFzeW5jTW9kZSBpcyBkZXByZWNhdGVkIGFsb25nIHdpdGggaXNBc3luY01vZGVcblxudmFyIEFzeW5jTW9kZSA9IFJFQUNUX0FTWU5DX01PREVfVFlQRTtcbnZhciBDb25jdXJyZW50TW9kZSA9IFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFO1xudmFyIENvbnRleHRDb25zdW1lciA9IFJFQUNUX0NPTlRFWFRfVFlQRTtcbnZhciBDb250ZXh0UHJvdmlkZXIgPSBSRUFDVF9QUk9WSURFUl9UWVBFO1xudmFyIEVsZW1lbnQgPSBSRUFDVF9FTEVNRU5UX1RZUEU7XG52YXIgRm9yd2FyZFJlZiA9IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU7XG52YXIgRnJhZ21lbnQgPSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xudmFyIExhenkgPSBSRUFDVF9MQVpZX1RZUEU7XG52YXIgTWVtbyA9IFJFQUNUX01FTU9fVFlQRTtcbnZhciBQb3J0YWwgPSBSRUFDVF9QT1JUQUxfVFlQRTtcbnZhciBQcm9maWxlciA9IFJFQUNUX1BST0ZJTEVSX1RZUEU7XG52YXIgU3RyaWN0TW9kZSA9IFJFQUNUX1NUUklDVF9NT0RFX1RZUEU7XG52YXIgU3VzcGVuc2UgPSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xudmFyIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlID0gZmFsc2U7IC8vIEFzeW5jTW9kZSBzaG91bGQgYmUgZGVwcmVjYXRlZFxuXG5mdW5jdGlvbiBpc0FzeW5jTW9kZShvYmplY3QpIHtcbiAge1xuICAgIGlmICghaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNBc3luY01vZGUpIHtcbiAgICAgIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlID0gdHJ1ZTsgLy8gVXNpbmcgY29uc29sZVsnd2FybiddIHRvIGV2YWRlIEJhYmVsIGFuZCBFU0xpbnRcblxuICAgICAgY29uc29sZVsnd2FybiddKCdUaGUgUmVhY3RJcy5pc0FzeW5jTW9kZSgpIGFsaWFzIGhhcyBiZWVuIGRlcHJlY2F0ZWQsICcgKyAnYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBSZWFjdCAxNysuIFVwZGF0ZSB5b3VyIGNvZGUgdG8gdXNlICcgKyAnUmVhY3RJcy5pc0NvbmN1cnJlbnRNb2RlKCkgaW5zdGVhZC4gSXQgaGFzIHRoZSBleGFjdCBzYW1lIEFQSS4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaXNDb25jdXJyZW50TW9kZShvYmplY3QpIHx8IHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9BU1lOQ19NT0RFX1RZUEU7XG59XG5mdW5jdGlvbiBpc0NvbmN1cnJlbnRNb2RlKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFO1xufVxuZnVuY3Rpb24gaXNDb250ZXh0Q29uc3VtZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNDb250ZXh0UHJvdmlkZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRWxlbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCAmJiBvYmplY3QuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRm9yd2FyZFJlZihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFO1xufVxuZnVuY3Rpb24gaXNGcmFnbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNMYXp5KG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0xBWllfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzTWVtbyhvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9NRU1PX1RZUEU7XG59XG5mdW5jdGlvbiBpc1BvcnRhbChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9QT1JUQUxfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzUHJvZmlsZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUFJPRklMRVJfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzU3RyaWN0TW9kZShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFO1xufVxuZnVuY3Rpb24gaXNTdXNwZW5zZShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xufVxuXG5leHBvcnRzLkFzeW5jTW9kZSA9IEFzeW5jTW9kZTtcbmV4cG9ydHMuQ29uY3VycmVudE1vZGUgPSBDb25jdXJyZW50TW9kZTtcbmV4cG9ydHMuQ29udGV4dENvbnN1bWVyID0gQ29udGV4dENvbnN1bWVyO1xuZXhwb3J0cy5Db250ZXh0UHJvdmlkZXIgPSBDb250ZXh0UHJvdmlkZXI7XG5leHBvcnRzLkVsZW1lbnQgPSBFbGVtZW50O1xuZXhwb3J0cy5Gb3J3YXJkUmVmID0gRm9yd2FyZFJlZjtcbmV4cG9ydHMuRnJhZ21lbnQgPSBGcmFnbWVudDtcbmV4cG9ydHMuTGF6eSA9IExhenk7XG5leHBvcnRzLk1lbW8gPSBNZW1vO1xuZXhwb3J0cy5Qb3J0YWwgPSBQb3J0YWw7XG5leHBvcnRzLlByb2ZpbGVyID0gUHJvZmlsZXI7XG5leHBvcnRzLlN0cmljdE1vZGUgPSBTdHJpY3RNb2RlO1xuZXhwb3J0cy5TdXNwZW5zZSA9IFN1c3BlbnNlO1xuZXhwb3J0cy5pc0FzeW5jTW9kZSA9IGlzQXN5bmNNb2RlO1xuZXhwb3J0cy5pc0NvbmN1cnJlbnRNb2RlID0gaXNDb25jdXJyZW50TW9kZTtcbmV4cG9ydHMuaXNDb250ZXh0Q29uc3VtZXIgPSBpc0NvbnRleHRDb25zdW1lcjtcbmV4cG9ydHMuaXNDb250ZXh0UHJvdmlkZXIgPSBpc0NvbnRleHRQcm92aWRlcjtcbmV4cG9ydHMuaXNFbGVtZW50ID0gaXNFbGVtZW50O1xuZXhwb3J0cy5pc0ZvcndhcmRSZWYgPSBpc0ZvcndhcmRSZWY7XG5leHBvcnRzLmlzRnJhZ21lbnQgPSBpc0ZyYWdtZW50O1xuZXhwb3J0cy5pc0xhenkgPSBpc0xhenk7XG5leHBvcnRzLmlzTWVtbyA9IGlzTWVtbztcbmV4cG9ydHMuaXNQb3J0YWwgPSBpc1BvcnRhbDtcbmV4cG9ydHMuaXNQcm9maWxlciA9IGlzUHJvZmlsZXI7XG5leHBvcnRzLmlzU3RyaWN0TW9kZSA9IGlzU3RyaWN0TW9kZTtcbmV4cG9ydHMuaXNTdXNwZW5zZSA9IGlzU3VzcGVuc2U7XG5leHBvcnRzLmlzVmFsaWRFbGVtZW50VHlwZSA9IGlzVmFsaWRFbGVtZW50VHlwZTtcbmV4cG9ydHMudHlwZU9mID0gdHlwZU9mO1xuICB9KSgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWlzLnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWlzLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiO1xuaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXNzZXJ0VGhpc0luaXRpYWxpemVkXCI7XG5pbXBvcnQgX2luaGVyaXRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzXCI7XG5pbXBvcnQgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4gZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVyblwiO1xuaW1wb3J0IF9nZXRQcm90b3R5cGVPZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9nZXRQcm90b3R5cGVPZlwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiO1xuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTsgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7IHRyeSB7IEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgSlNPTkFycm93IGZyb20gJy4vSlNPTkFycm93JztcblxudmFyIEl0ZW1SYW5nZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoSXRlbVJhbmdlLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKEl0ZW1SYW5nZSk7XG5cbiAgZnVuY3Rpb24gSXRlbVJhbmdlKHByb3BzKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEl0ZW1SYW5nZSk7XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHByb3BzKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJoYW5kbGVDbGlja1wiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGV4cGFuZGVkOiAhX3RoaXMuc3RhdGUuZXhwYW5kZWRcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICBleHBhbmRlZDogZmFsc2VcbiAgICB9O1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhJdGVtUmFuZ2UsIFt7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIHN0eWxpbmcgPSBfdGhpcyRwcm9wcy5zdHlsaW5nLFxuICAgICAgICAgIGZyb20gPSBfdGhpcyRwcm9wcy5mcm9tLFxuICAgICAgICAgIHRvID0gX3RoaXMkcHJvcHMudG8sXG4gICAgICAgICAgcmVuZGVyQ2hpbGROb2RlcyA9IF90aGlzJHByb3BzLnJlbmRlckNoaWxkTm9kZXMsXG4gICAgICAgICAgbm9kZVR5cGUgPSBfdGhpcyRwcm9wcy5ub2RlVHlwZTtcbiAgICAgIHJldHVybiB0aGlzLnN0YXRlLmV4cGFuZGVkID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgc3R5bGluZygnaXRlbVJhbmdlJywgdGhpcy5zdGF0ZS5leHBhbmRlZCksIHJlbmRlckNoaWxkTm9kZXModGhpcy5wcm9wcywgZnJvbSwgdG8pKSA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHt9LCBzdHlsaW5nKCdpdGVtUmFuZ2UnLCB0aGlzLnN0YXRlLmV4cGFuZGVkKSwge1xuICAgICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZUNsaWNrXG4gICAgICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSlNPTkFycm93LCB7XG4gICAgICAgIG5vZGVUeXBlOiBub2RlVHlwZSxcbiAgICAgICAgc3R5bGluZzogc3R5bGluZyxcbiAgICAgICAgZXhwYW5kZWQ6IGZhbHNlLFxuICAgICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZUNsaWNrLFxuICAgICAgICBhcnJvd1N0eWxlOiBcImRvdWJsZVwiXG4gICAgICB9KSwgXCJcIi5jb25jYXQoZnJvbSwgXCIgLi4uIFwiKS5jb25jYXQodG8pKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gSXRlbVJhbmdlO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5fZGVmaW5lUHJvcGVydHkoSXRlbVJhbmdlLCBcInByb3BUeXBlc1wiLCB7XG4gIHN0eWxpbmc6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIGZyb206IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgdG86IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgcmVuZGVyQ2hpbGROb2RlczogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgbm9kZVR5cGU6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZFxufSk7XG5cbmV4cG9ydCB7IEl0ZW1SYW5nZSBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJkYXRhXCJdO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgSlNPTk5lc3RlZE5vZGUgZnJvbSAnLi9KU09OTmVzdGVkTm9kZSc7XG5cbi8vIFJldHVybnMgdGhlIFwibiBJdGVtc1wiIHN0cmluZyBmb3IgdGhpcyBub2RlLFxuLy8gZ2VuZXJhdGluZyBhbmQgY2FjaGluZyBpdCBpZiBpdCBoYXNuJ3QgYmVlbiBjcmVhdGVkIHlldC5cbmZ1bmN0aW9uIGNyZWF0ZUl0ZW1TdHJpbmcoZGF0YSkge1xuICByZXR1cm4gXCJcIi5jb25jYXQoZGF0YS5sZW5ndGgsIFwiIFwiKS5jb25jYXQoZGF0YS5sZW5ndGggIT09IDEgPyAnaXRlbXMnIDogJ2l0ZW0nKTtcbn1cblxuLy8gQ29uZmlndXJlcyA8SlNPTk5lc3RlZE5vZGU+IHRvIHJlbmRlciBhbiBBcnJheVxudmFyIEpTT05BcnJheU5vZGUgPSBmdW5jdGlvbiBKU09OQXJyYXlOb2RlKF9yZWYpIHtcbiAgdmFyIGRhdGEgPSBfcmVmLmRhdGEsXG4gICAgICBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmLCBfZXhjbHVkZWQpO1xuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChKU09OTmVzdGVkTm9kZSwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgZGF0YTogZGF0YSxcbiAgICBub2RlVHlwZTogXCJBcnJheVwiLFxuICAgIG5vZGVUeXBlSW5kaWNhdG9yOiBcIltdXCIsXG4gICAgY3JlYXRlSXRlbVN0cmluZzogY3JlYXRlSXRlbVN0cmluZyxcbiAgICBleHBhbmRhYmxlOiBkYXRhLmxlbmd0aCA+IDBcbiAgfSkpO1xufTtcblxuSlNPTkFycmF5Tm9kZS5wcm9wVHlwZXMgPSB7XG4gIGRhdGE6IFByb3BUeXBlcy5hcnJheVxufTtcbmV4cG9ydCBkZWZhdWx0IEpTT05BcnJheU5vZGU7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIjtcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuXG52YXIgSlNPTkFycm93ID0gZnVuY3Rpb24gSlNPTkFycm93KF9yZWYpIHtcbiAgdmFyIHN0eWxpbmcgPSBfcmVmLnN0eWxpbmcsXG4gICAgICBhcnJvd1N0eWxlID0gX3JlZi5hcnJvd1N0eWxlLFxuICAgICAgZXhwYW5kZWQgPSBfcmVmLmV4cGFuZGVkLFxuICAgICAgbm9kZVR5cGUgPSBfcmVmLm5vZGVUeXBlLFxuICAgICAgb25DbGljayA9IF9yZWYub25DbGljaztcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHt9LCBzdHlsaW5nKCdhcnJvd0NvbnRhaW5lcicsIGFycm93U3R5bGUpLCB7XG4gICAgb25DbGljazogb25DbGlja1xuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgc3R5bGluZyhbJ2Fycm93JywgJ2Fycm93U2lnbiddLCBub2RlVHlwZSwgZXhwYW5kZWQsIGFycm93U3R5bGUpLCBcIlxcdTI1QjZcIiwgYXJyb3dTdHlsZSA9PT0gJ2RvdWJsZScgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgc3R5bGluZyhbJ2Fycm93U2lnbicsICdhcnJvd1NpZ25Jbm5lciddKSwgXCJcXHUyNUI2XCIpKSk7XG59O1xuXG5KU09OQXJyb3cucHJvcFR5cGVzID0ge1xuICBzdHlsaW5nOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBhcnJvd1N0eWxlOiBQcm9wVHlwZXMub25lT2YoWydzaW5nbGUnLCAnZG91YmxlJ10pLFxuICBleHBhbmRlZDogUHJvcFR5cGVzLmJvb2wuaXNSZXF1aXJlZCxcbiAgbm9kZVR5cGU6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgb25DbGljazogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZFxufTtcbkpTT05BcnJvdy5kZWZhdWx0UHJvcHMgPSB7XG4gIGFycm93U3R5bGU6ICdzaW5nbGUnXG59O1xuZXhwb3J0IGRlZmF1bHQgSlNPTkFycm93OyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCI7XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKG8sIGFsbG93QXJyYXlMaWtlKSB7IHZhciBpdCA9IHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdIHx8IG9bXCJAQGl0ZXJhdG9yXCJdOyBpZiAoIWl0KSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChpdCA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvKSkgfHwgYWxsb3dBcnJheUxpa2UgJiYgbyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHsgaWYgKGl0KSBvID0gaXQ7IHZhciBpID0gMDsgdmFyIEYgPSBmdW5jdGlvbiBGKCkge307IHJldHVybiB7IHM6IEYsIG46IGZ1bmN0aW9uIG4oKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH0sIGU6IGZ1bmN0aW9uIGUoX2UpIHsgdGhyb3cgX2U7IH0sIGY6IEYgfTsgfSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gdmFyIG5vcm1hbENvbXBsZXRpb24gPSB0cnVlLCBkaWRFcnIgPSBmYWxzZSwgZXJyOyByZXR1cm4geyBzOiBmdW5jdGlvbiBzKCkgeyBpdCA9IGl0LmNhbGwobyk7IH0sIG46IGZ1bmN0aW9uIG4oKSB7IHZhciBzdGVwID0gaXQubmV4dCgpOyBub3JtYWxDb21wbGV0aW9uID0gc3RlcC5kb25lOyByZXR1cm4gc3RlcDsgfSwgZTogZnVuY3Rpb24gZShfZTIpIHsgZGlkRXJyID0gdHJ1ZTsgZXJyID0gX2UyOyB9LCBmOiBmdW5jdGlvbiBmKCkgeyB0cnkgeyBpZiAoIW5vcm1hbENvbXBsZXRpb24gJiYgaXQucmV0dXJuICE9IG51bGwpIGl0LnJldHVybigpOyB9IGZpbmFsbHkgeyBpZiAoZGlkRXJyKSB0aHJvdyBlcnI7IH0gfSB9OyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBKU09OTmVzdGVkTm9kZSBmcm9tICcuL0pTT05OZXN0ZWROb2RlJztcblxuLy8gUmV0dXJucyB0aGUgXCJuIEl0ZW1zXCIgc3RyaW5nIGZvciB0aGlzIG5vZGUsXG4vLyBnZW5lcmF0aW5nIGFuZCBjYWNoaW5nIGl0IGlmIGl0IGhhc24ndCBiZWVuIGNyZWF0ZWQgeWV0LlxuZnVuY3Rpb24gY3JlYXRlSXRlbVN0cmluZyhkYXRhLCBsaW1pdCkge1xuICB2YXIgY291bnQgPSAwO1xuICB2YXIgaGFzTW9yZSA9IGZhbHNlO1xuXG4gIGlmIChOdW1iZXIuaXNTYWZlSW50ZWdlcihkYXRhLnNpemUpKSB7XG4gICAgY291bnQgPSBkYXRhLnNpemU7XG4gIH0gZWxzZSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgdmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGRhdGEpLFxuICAgICAgICBfc3RlcDtcblxuICAgIHRyeSB7XG4gICAgICBmb3IgKF9pdGVyYXRvci5zKCk7ICEoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lOykge1xuICAgICAgICB2YXIgZW50cnkgPSBfc3RlcC52YWx1ZTtcblxuICAgICAgICBpZiAobGltaXQgJiYgY291bnQgKyAxID4gbGltaXQpIHtcbiAgICAgICAgICBoYXNNb3JlID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvdW50ICs9IDE7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBfaXRlcmF0b3IuZShlcnIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBfaXRlcmF0b3IuZigpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBcIlwiLmNvbmNhdChoYXNNb3JlID8gJz4nIDogJycpLmNvbmNhdChjb3VudCwgXCIgXCIpLmNvbmNhdChjb3VudCAhPT0gMSA/ICdlbnRyaWVzJyA6ICdlbnRyeScpO1xufVxuXG4vLyBDb25maWd1cmVzIDxKU09OTmVzdGVkTm9kZT4gdG8gcmVuZGVyIGFuIGl0ZXJhYmxlXG52YXIgSlNPTkl0ZXJhYmxlTm9kZSA9IGZ1bmN0aW9uIEpTT05JdGVyYWJsZU5vZGUoX3JlZikge1xuICB2YXIgcHJvcHMgPSBfZXh0ZW5kcyh7fSwgX3JlZik7XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05OZXN0ZWROb2RlLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICBub2RlVHlwZTogXCJJdGVyYWJsZVwiLFxuICAgIG5vZGVUeXBlSW5kaWNhdG9yOiBcIigpXCIsXG4gICAgY3JlYXRlSXRlbVN0cmluZzogY3JlYXRlSXRlbVN0cmluZ1xuICB9KSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBKU09OSXRlcmFibGVOb2RlOyIsImltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2Fzc2VydFRoaXNJbml0aWFsaXplZFwiO1xuaW1wb3J0IF9pbmhlcml0cyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiO1xuaW1wb3J0IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm5cIjtcbmltcG9ydCBfZ2V0UHJvdG90eXBlT2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZ2V0UHJvdG90eXBlT2ZcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9Db25zdW1hYmxlQXJyYXlcIjtcbmltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCI7XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBKU09OQXJyb3cgZnJvbSAnLi9KU09OQXJyb3cnO1xuaW1wb3J0IGdldENvbGxlY3Rpb25FbnRyaWVzIGZyb20gJy4vZ2V0Q29sbGVjdGlvbkVudHJpZXMnO1xuaW1wb3J0IEpTT05Ob2RlIGZyb20gJy4vSlNPTk5vZGUnO1xuaW1wb3J0IEl0ZW1SYW5nZSBmcm9tICcuL0l0ZW1SYW5nZSc7XG5cbmZ1bmN0aW9uIGlzUmFuZ2UocmFuZ2VPckVudHJ5KSB7XG4gIHJldHVybiByYW5nZU9yRW50cnkudG8gIT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gcmVuZGVyQ2hpbGROb2Rlcyhwcm9wcywgZnJvbSwgdG8pIHtcbiAgdmFyIG5vZGVUeXBlID0gcHJvcHMubm9kZVR5cGUsXG4gICAgICBkYXRhID0gcHJvcHMuZGF0YSxcbiAgICAgIGNvbGxlY3Rpb25MaW1pdCA9IHByb3BzLmNvbGxlY3Rpb25MaW1pdCxcbiAgICAgIGNpcmN1bGFyQ2FjaGUgPSBwcm9wcy5jaXJjdWxhckNhY2hlLFxuICAgICAga2V5UGF0aCA9IHByb3BzLmtleVBhdGgsXG4gICAgICBwb3N0cHJvY2Vzc1ZhbHVlID0gcHJvcHMucG9zdHByb2Nlc3NWYWx1ZSxcbiAgICAgIHNvcnRPYmplY3RLZXlzID0gcHJvcHMuc29ydE9iamVjdEtleXM7XG4gIHZhciBjaGlsZE5vZGVzID0gW107XG4gIGdldENvbGxlY3Rpb25FbnRyaWVzKG5vZGVUeXBlLCBkYXRhLCBzb3J0T2JqZWN0S2V5cywgY29sbGVjdGlvbkxpbWl0LCBmcm9tLCB0bykuZm9yRWFjaChmdW5jdGlvbiAoZW50cnkpIHtcbiAgICBpZiAoaXNSYW5nZShlbnRyeSkpIHtcbiAgICAgIGNoaWxkTm9kZXMucHVzaCggLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSXRlbVJhbmdlLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICAgICAga2V5OiBcIkl0ZW1SYW5nZS0tXCIuY29uY2F0KGVudHJ5LmZyb20sIFwiLVwiKS5jb25jYXQoZW50cnkudG8pLFxuICAgICAgICBmcm9tOiBlbnRyeS5mcm9tLFxuICAgICAgICB0bzogZW50cnkudG8sXG4gICAgICAgIHJlbmRlckNoaWxkTm9kZXM6IHJlbmRlckNoaWxkTm9kZXNcbiAgICAgIH0pKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBrZXkgPSBlbnRyeS5rZXksXG4gICAgICAgICAgdmFsdWUgPSBlbnRyeS52YWx1ZTtcbiAgICAgIHZhciBpc0NpcmN1bGFyID0gY2lyY3VsYXJDYWNoZS5pbmRleE9mKHZhbHVlKSAhPT0gLTE7XG4gICAgICBjaGlsZE5vZGVzLnB1c2goIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05Ob2RlLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICAgICAgcG9zdHByb2Nlc3NWYWx1ZTogcG9zdHByb2Nlc3NWYWx1ZSxcbiAgICAgICAgY29sbGVjdGlvbkxpbWl0OiBjb2xsZWN0aW9uTGltaXQsXG4gICAgICAgIGtleTogXCJOb2RlLS1cIi5jb25jYXQoa2V5KSxcbiAgICAgICAga2V5UGF0aDogW2tleV0uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShrZXlQYXRoKSksXG4gICAgICAgIHZhbHVlOiBwb3N0cHJvY2Vzc1ZhbHVlKHZhbHVlKSxcbiAgICAgICAgY2lyY3VsYXJDYWNoZTogW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShjaXJjdWxhckNhY2hlKSwgW3ZhbHVlXSksXG4gICAgICAgIGlzQ2lyY3VsYXI6IGlzQ2lyY3VsYXIsXG4gICAgICAgIGhpZGVSb290OiBmYWxzZVxuICAgICAgfSkpKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gY2hpbGROb2Rlcztcbn1cblxuZnVuY3Rpb24gZ2V0U3RhdGVGcm9tUHJvcHMocHJvcHMpIHtcbiAgLy8gY2FsY3VsYXRlIGluZGl2aWR1YWwgbm9kZSBleHBhbnNpb24gaWYgbmVjZXNzYXJ5XG4gIHZhciBleHBhbmRlZCA9ICFwcm9wcy5pc0NpcmN1bGFyID8gcHJvcHMuc2hvdWxkRXhwYW5kTm9kZShwcm9wcy5rZXlQYXRoLCBwcm9wcy5kYXRhLCBwcm9wcy5sZXZlbCkgOiBmYWxzZTtcbiAgcmV0dXJuIHtcbiAgICBleHBhbmRlZDogZXhwYW5kZWRcbiAgfTtcbn1cblxudmFyIEpTT05OZXN0ZWROb2RlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhKU09OTmVzdGVkTm9kZSwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihKU09OTmVzdGVkTm9kZSk7XG5cbiAgZnVuY3Rpb24gSlNPTk5lc3RlZE5vZGUocHJvcHMpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgSlNPTk5lc3RlZE5vZGUpO1xuXG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBwcm9wcyk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiaGFuZGxlQ2xpY2tcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKF90aGlzLnByb3BzLmV4cGFuZGFibGUpIHtcbiAgICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGV4cGFuZGVkOiAhX3RoaXMuc3RhdGUuZXhwYW5kZWRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBfdGhpcy5zdGF0ZSA9IGdldFN0YXRlRnJvbVByb3BzKHByb3BzKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoSlNPTk5lc3RlZE5vZGUsIFt7XG4gICAga2V5OiBcIlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcykge1xuICAgICAgdmFyIG5leHRTdGF0ZSA9IGdldFN0YXRlRnJvbVByb3BzKG5leHRQcm9wcyk7XG5cbiAgICAgIGlmIChnZXRTdGF0ZUZyb21Qcm9wcyh0aGlzLnByb3BzKS5leHBhbmRlZCAhPT0gbmV4dFN0YXRlLmV4cGFuZGVkKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUobmV4dFN0YXRlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2hvdWxkQ29tcG9uZW50VXBkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNob3VsZENvbXBvbmVudFVwZGF0ZShuZXh0UHJvcHMsIG5leHRTdGF0ZSkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHJldHVybiAhIU9iamVjdC5rZXlzKG5leHRQcm9wcykuZmluZChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHJldHVybiBrZXkgIT09ICdjaXJjdWxhckNhY2hlJyAmJiAoa2V5ID09PSAna2V5UGF0aCcgPyBuZXh0UHJvcHNba2V5XS5qb2luKCcvJykgIT09IF90aGlzMi5wcm9wc1trZXldLmpvaW4oJy8nKSA6IG5leHRQcm9wc1trZXldICE9PSBfdGhpczIucHJvcHNba2V5XSk7XG4gICAgICB9KSB8fCBuZXh0U3RhdGUuZXhwYW5kZWQgIT09IHRoaXMuc3RhdGUuZXhwYW5kZWQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIGdldEl0ZW1TdHJpbmcgPSBfdGhpcyRwcm9wcy5nZXRJdGVtU3RyaW5nLFxuICAgICAgICAgIG5vZGVUeXBlSW5kaWNhdG9yID0gX3RoaXMkcHJvcHMubm9kZVR5cGVJbmRpY2F0b3IsXG4gICAgICAgICAgbm9kZVR5cGUgPSBfdGhpcyRwcm9wcy5ub2RlVHlwZSxcbiAgICAgICAgICBkYXRhID0gX3RoaXMkcHJvcHMuZGF0YSxcbiAgICAgICAgICBoaWRlUm9vdCA9IF90aGlzJHByb3BzLmhpZGVSb290LFxuICAgICAgICAgIGNyZWF0ZUl0ZW1TdHJpbmcgPSBfdGhpcyRwcm9wcy5jcmVhdGVJdGVtU3RyaW5nLFxuICAgICAgICAgIHN0eWxpbmcgPSBfdGhpcyRwcm9wcy5zdHlsaW5nLFxuICAgICAgICAgIGNvbGxlY3Rpb25MaW1pdCA9IF90aGlzJHByb3BzLmNvbGxlY3Rpb25MaW1pdCxcbiAgICAgICAgICBrZXlQYXRoID0gX3RoaXMkcHJvcHMua2V5UGF0aCxcbiAgICAgICAgICBsYWJlbFJlbmRlcmVyID0gX3RoaXMkcHJvcHMubGFiZWxSZW5kZXJlcixcbiAgICAgICAgICBleHBhbmRhYmxlID0gX3RoaXMkcHJvcHMuZXhwYW5kYWJsZTtcbiAgICAgIHZhciBleHBhbmRlZCA9IHRoaXMuc3RhdGUuZXhwYW5kZWQ7XG4gICAgICB2YXIgcmVuZGVyZWRDaGlsZHJlbiA9IGV4cGFuZGVkIHx8IGhpZGVSb290ICYmIHRoaXMucHJvcHMubGV2ZWwgPT09IDAgPyByZW5kZXJDaGlsZE5vZGVzKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgdGhpcy5wcm9wcyksIHt9LCB7XG4gICAgICAgIGxldmVsOiB0aGlzLnByb3BzLmxldmVsICsgMVxuICAgICAgfSkpIDogbnVsbDtcbiAgICAgIHZhciBpdGVtVHlwZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBzdHlsaW5nKCduZXN0ZWROb2RlSXRlbVR5cGUnLCBleHBhbmRlZCksIG5vZGVUeXBlSW5kaWNhdG9yKTtcbiAgICAgIHZhciByZW5kZXJlZEl0ZW1TdHJpbmcgPSBnZXRJdGVtU3RyaW5nKG5vZGVUeXBlLCBkYXRhLCBpdGVtVHlwZSwgY3JlYXRlSXRlbVN0cmluZyhkYXRhLCBjb2xsZWN0aW9uTGltaXQpLCBrZXlQYXRoKTtcbiAgICAgIHZhciBzdHlsaW5nQXJncyA9IFtrZXlQYXRoLCBub2RlVHlwZSwgZXhwYW5kZWQsIGV4cGFuZGFibGVdO1xuICAgICAgcmV0dXJuIGhpZGVSb290ID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCBzdHlsaW5nLmFwcGx5KHZvaWQgMCwgWydyb290Tm9kZSddLmNvbmNhdChzdHlsaW5nQXJncykpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInVsXCIsIHN0eWxpbmcuYXBwbHkodm9pZCAwLCBbJ3Jvb3ROb2RlQ2hpbGRyZW4nXS5jb25jYXQoc3R5bGluZ0FyZ3MpKSwgcmVuZGVyZWRDaGlsZHJlbikpIDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCBzdHlsaW5nLmFwcGx5KHZvaWQgMCwgWyduZXN0ZWROb2RlJ10uY29uY2F0KHN0eWxpbmdBcmdzKSksIGV4cGFuZGFibGUgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSlNPTkFycm93LCB7XG4gICAgICAgIHN0eWxpbmc6IHN0eWxpbmcsXG4gICAgICAgIG5vZGVUeXBlOiBub2RlVHlwZSxcbiAgICAgICAgZXhwYW5kZWQ6IGV4cGFuZGVkLFxuICAgICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZUNsaWNrXG4gICAgICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiLCBfZXh0ZW5kcyh7fSwgc3R5bGluZy5hcHBseSh2b2lkIDAsIFtbJ2xhYmVsJywgJ25lc3RlZE5vZGVMYWJlbCddXS5jb25jYXQoc3R5bGluZ0FyZ3MpKSwge1xuICAgICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZUNsaWNrXG4gICAgICB9KSwgbGFiZWxSZW5kZXJlci5hcHBseSh2b2lkIDAsIHN0eWxpbmdBcmdzKSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBfZXh0ZW5kcyh7fSwgc3R5bGluZy5hcHBseSh2b2lkIDAsIFsnbmVzdGVkTm9kZUl0ZW1TdHJpbmcnXS5jb25jYXQoc3R5bGluZ0FyZ3MpKSwge1xuICAgICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZUNsaWNrXG4gICAgICB9KSwgcmVuZGVyZWRJdGVtU3RyaW5nKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCBzdHlsaW5nLmFwcGx5KHZvaWQgMCwgWyduZXN0ZWROb2RlQ2hpbGRyZW4nXS5jb25jYXQoc3R5bGluZ0FyZ3MpKSwgcmVuZGVyZWRDaGlsZHJlbikpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBKU09OTmVzdGVkTm9kZTtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxuX2RlZmluZVByb3BlcnR5KEpTT05OZXN0ZWROb2RlLCBcInByb3BUeXBlc1wiLCB7XG4gIGdldEl0ZW1TdHJpbmc6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIG5vZGVUeXBlSW5kaWNhdG9yOiBQcm9wVHlwZXMuYW55LFxuICBub2RlVHlwZTogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICBkYXRhOiBQcm9wVHlwZXMuYW55LFxuICBoaWRlUm9vdDogUHJvcFR5cGVzLmJvb2wuaXNSZXF1aXJlZCxcbiAgY3JlYXRlSXRlbVN0cmluZzogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgc3R5bGluZzogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgY29sbGVjdGlvbkxpbWl0OiBQcm9wVHlwZXMubnVtYmVyLFxuICBrZXlQYXRoOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMubnVtYmVyXSkpLmlzUmVxdWlyZWQsXG4gIGxhYmVsUmVuZGVyZXI6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIHNob3VsZEV4cGFuZE5vZGU6IFByb3BUeXBlcy5mdW5jLFxuICBsZXZlbDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICBzb3J0T2JqZWN0S2V5czogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmZ1bmMsIFByb3BUeXBlcy5ib29sXSksXG4gIGlzQ2lyY3VsYXI6IFByb3BUeXBlcy5ib29sLFxuICBleHBhbmRhYmxlOiBQcm9wVHlwZXMuYm9vbFxufSk7XG5cbl9kZWZpbmVQcm9wZXJ0eShKU09OTmVzdGVkTm9kZSwgXCJkZWZhdWx0UHJvcHNcIiwge1xuICBkYXRhOiBbXSxcbiAgY2lyY3VsYXJDYWNoZTogW10sXG4gIGxldmVsOiAwLFxuICBleHBhbmRhYmxlOiB0cnVlXG59KTtcblxuZXhwb3J0IHsgSlNPTk5lc3RlZE5vZGUgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wiZ2V0SXRlbVN0cmluZ1wiLCBcImtleVBhdGhcIiwgXCJsYWJlbFJlbmRlcmVyXCIsIFwic3R5bGluZ1wiLCBcInZhbHVlXCIsIFwidmFsdWVSZW5kZXJlclwiLCBcImlzQ3VzdG9tTm9kZVwiXTtcblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgb2JqVHlwZSBmcm9tICcuL29ialR5cGUnO1xuaW1wb3J0IEpTT05PYmplY3ROb2RlIGZyb20gJy4vSlNPTk9iamVjdE5vZGUnO1xuaW1wb3J0IEpTT05BcnJheU5vZGUgZnJvbSAnLi9KU09OQXJyYXlOb2RlJztcbmltcG9ydCBKU09OSXRlcmFibGVOb2RlIGZyb20gJy4vSlNPTkl0ZXJhYmxlTm9kZSc7XG5pbXBvcnQgSlNPTlZhbHVlTm9kZSBmcm9tICcuL0pTT05WYWx1ZU5vZGUnO1xuXG52YXIgSlNPTk5vZGUgPSBmdW5jdGlvbiBKU09OTm9kZShfcmVmKSB7XG4gIHZhciBnZXRJdGVtU3RyaW5nID0gX3JlZi5nZXRJdGVtU3RyaW5nLFxuICAgICAga2V5UGF0aCA9IF9yZWYua2V5UGF0aCxcbiAgICAgIGxhYmVsUmVuZGVyZXIgPSBfcmVmLmxhYmVsUmVuZGVyZXIsXG4gICAgICBzdHlsaW5nID0gX3JlZi5zdHlsaW5nLFxuICAgICAgdmFsdWUgPSBfcmVmLnZhbHVlLFxuICAgICAgdmFsdWVSZW5kZXJlciA9IF9yZWYudmFsdWVSZW5kZXJlcixcbiAgICAgIGlzQ3VzdG9tTm9kZSA9IF9yZWYuaXNDdXN0b21Ob2RlLFxuICAgICAgcmVzdCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmLCBfZXhjbHVkZWQpO1xuXG4gIHZhciBub2RlVHlwZSA9IGlzQ3VzdG9tTm9kZSh2YWx1ZSkgPyAnQ3VzdG9tJyA6IG9ialR5cGUodmFsdWUpO1xuICB2YXIgc2ltcGxlTm9kZVByb3BzID0ge1xuICAgIGdldEl0ZW1TdHJpbmc6IGdldEl0ZW1TdHJpbmcsXG4gICAga2V5OiBrZXlQYXRoWzBdLFxuICAgIGtleVBhdGg6IGtleVBhdGgsXG4gICAgbGFiZWxSZW5kZXJlcjogbGFiZWxSZW5kZXJlcixcbiAgICBub2RlVHlwZTogbm9kZVR5cGUsXG4gICAgc3R5bGluZzogc3R5bGluZyxcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgdmFsdWVSZW5kZXJlcjogdmFsdWVSZW5kZXJlclxuICB9O1xuXG4gIHZhciBuZXN0ZWROb2RlUHJvcHMgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcmVzdCksIHNpbXBsZU5vZGVQcm9wcyksIHt9LCB7XG4gICAgZGF0YTogdmFsdWUsXG4gICAgaXNDdXN0b21Ob2RlOiBpc0N1c3RvbU5vZGVcbiAgfSk7XG5cbiAgc3dpdGNoIChub2RlVHlwZSkge1xuICAgIGNhc2UgJ09iamVjdCc6XG4gICAgY2FzZSAnRXJyb3InOlxuICAgIGNhc2UgJ1dlYWtNYXAnOlxuICAgIGNhc2UgJ1dlYWtTZXQnOlxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05PYmplY3ROb2RlLCBuZXN0ZWROb2RlUHJvcHMpO1xuXG4gICAgY2FzZSAnQXJyYXknOlxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05BcnJheU5vZGUsIG5lc3RlZE5vZGVQcm9wcyk7XG5cbiAgICBjYXNlICdJdGVyYWJsZSc6XG4gICAgY2FzZSAnTWFwJzpcbiAgICBjYXNlICdTZXQnOlxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05JdGVyYWJsZU5vZGUsIG5lc3RlZE5vZGVQcm9wcyk7XG5cbiAgICBjYXNlICdTdHJpbmcnOlxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05WYWx1ZU5vZGUsIF9leHRlbmRzKHt9LCBzaW1wbGVOb2RlUHJvcHMsIHtcbiAgICAgICAgdmFsdWVHZXR0ZXI6IGZ1bmN0aW9uIHZhbHVlR2V0dGVyKHJhdykge1xuICAgICAgICAgIHJldHVybiBcIlxcXCJcIi5jb25jYXQocmF3LCBcIlxcXCJcIik7XG4gICAgICAgIH1cbiAgICAgIH0pKTtcblxuICAgIGNhc2UgJ051bWJlcic6XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSlNPTlZhbHVlTm9kZSwgc2ltcGxlTm9kZVByb3BzKTtcblxuICAgIGNhc2UgJ0Jvb2xlYW4nOlxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05WYWx1ZU5vZGUsIF9leHRlbmRzKHt9LCBzaW1wbGVOb2RlUHJvcHMsIHtcbiAgICAgICAgdmFsdWVHZXR0ZXI6IGZ1bmN0aW9uIHZhbHVlR2V0dGVyKHJhdykge1xuICAgICAgICAgIHJldHVybiByYXcgPyAndHJ1ZScgOiAnZmFsc2UnO1xuICAgICAgICB9XG4gICAgICB9KSk7XG5cbiAgICBjYXNlICdEYXRlJzpcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChKU09OVmFsdWVOb2RlLCBfZXh0ZW5kcyh7fSwgc2ltcGxlTm9kZVByb3BzLCB7XG4gICAgICAgIHZhbHVlR2V0dGVyOiBmdW5jdGlvbiB2YWx1ZUdldHRlcihyYXcpIHtcbiAgICAgICAgICByZXR1cm4gcmF3LnRvSVNPU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgIH0pKTtcblxuICAgIGNhc2UgJ051bGwnOlxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05WYWx1ZU5vZGUsIF9leHRlbmRzKHt9LCBzaW1wbGVOb2RlUHJvcHMsIHtcbiAgICAgICAgdmFsdWVHZXR0ZXI6IGZ1bmN0aW9uIHZhbHVlR2V0dGVyKCkge1xuICAgICAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgICAgIH1cbiAgICAgIH0pKTtcblxuICAgIGNhc2UgJ1VuZGVmaW5lZCc6XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSlNPTlZhbHVlTm9kZSwgX2V4dGVuZHMoe30sIHNpbXBsZU5vZGVQcm9wcywge1xuICAgICAgICB2YWx1ZUdldHRlcjogZnVuY3Rpb24gdmFsdWVHZXR0ZXIoKSB7XG4gICAgICAgICAgcmV0dXJuICd1bmRlZmluZWQnO1xuICAgICAgICB9XG4gICAgICB9KSk7XG5cbiAgICBjYXNlICdGdW5jdGlvbic6XG4gICAgY2FzZSAnU3ltYm9sJzpcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChKU09OVmFsdWVOb2RlLCBfZXh0ZW5kcyh7fSwgc2ltcGxlTm9kZVByb3BzLCB7XG4gICAgICAgIHZhbHVlR2V0dGVyOiBmdW5jdGlvbiB2YWx1ZUdldHRlcihyYXcpIHtcbiAgICAgICAgICByZXR1cm4gcmF3LnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgIH0pKTtcblxuICAgIGNhc2UgJ0N1c3RvbSc6XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSlNPTlZhbHVlTm9kZSwgc2ltcGxlTm9kZVByb3BzKTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSlNPTlZhbHVlTm9kZSwgX2V4dGVuZHMoe30sIHNpbXBsZU5vZGVQcm9wcywge1xuICAgICAgICB2YWx1ZUdldHRlcjogZnVuY3Rpb24gdmFsdWVHZXR0ZXIoKSB7XG4gICAgICAgICAgcmV0dXJuIFwiPFwiLmNvbmNhdChub2RlVHlwZSwgXCI+XCIpO1xuICAgICAgICB9XG4gICAgICB9KSk7XG4gIH1cbn07XG5cbkpTT05Ob2RlLnByb3BUeXBlcyA9IHtcbiAgZ2V0SXRlbVN0cmluZzogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAga2V5UGF0aDogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLm51bWJlcl0pLmlzUmVxdWlyZWQpLmlzUmVxdWlyZWQsXG4gIGxhYmVsUmVuZGVyZXI6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIHN0eWxpbmc6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIHZhbHVlOiBQcm9wVHlwZXMuYW55LFxuICB2YWx1ZVJlbmRlcmVyOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBpc0N1c3RvbU5vZGU6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWRcbn07XG5leHBvcnQgZGVmYXVsdCBKU09OTm9kZTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xudmFyIF9leGNsdWRlZCA9IFtcImRhdGFcIl07XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBKU09OTmVzdGVkTm9kZSBmcm9tICcuL0pTT05OZXN0ZWROb2RlJztcblxuLy8gUmV0dXJucyB0aGUgXCJuIEl0ZW1zXCIgc3RyaW5nIGZvciB0aGlzIG5vZGUsXG4vLyBnZW5lcmF0aW5nIGFuZCBjYWNoaW5nIGl0IGlmIGl0IGhhc24ndCBiZWVuIGNyZWF0ZWQgeWV0LlxuZnVuY3Rpb24gY3JlYXRlSXRlbVN0cmluZyhkYXRhKSB7XG4gIHZhciBsZW4gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhkYXRhKS5sZW5ndGg7XG4gIHJldHVybiBcIlwiLmNvbmNhdChsZW4sIFwiIFwiKS5jb25jYXQobGVuICE9PSAxID8gJ2tleXMnIDogJ2tleScpO1xufVxuXG4vLyBDb25maWd1cmVzIDxKU09OTmVzdGVkTm9kZT4gdG8gcmVuZGVyIGFuIE9iamVjdFxudmFyIEpTT05PYmplY3ROb2RlID0gZnVuY3Rpb24gSlNPTk9iamVjdE5vZGUoX3JlZikge1xuICB2YXIgZGF0YSA9IF9yZWYuZGF0YSxcbiAgICAgIHByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWYsIF9leGNsdWRlZCk7XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05OZXN0ZWROb2RlLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICBkYXRhOiBkYXRhLFxuICAgIG5vZGVUeXBlOiBcIk9iamVjdFwiLFxuICAgIG5vZGVUeXBlSW5kaWNhdG9yOiBwcm9wcy5ub2RlVHlwZSA9PT0gJ0Vycm9yJyA/ICdFcnJvcigpJyA6ICd7fScsXG4gICAgY3JlYXRlSXRlbVN0cmluZzogY3JlYXRlSXRlbVN0cmluZyxcbiAgICBleHBhbmRhYmxlOiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhkYXRhKS5sZW5ndGggPiAwXG4gIH0pKTtcbn07XG5cbkpTT05PYmplY3ROb2RlLnByb3BUeXBlcyA9IHtcbiAgZGF0YTogUHJvcFR5cGVzLm9iamVjdCxcbiAgbm9kZVR5cGU6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZFxufTtcbmV4cG9ydCBkZWZhdWx0IEpTT05PYmplY3ROb2RlOyIsImltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9Db25zdW1hYmxlQXJyYXlcIjtcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuXG52YXIgSlNPTlZhbHVlTm9kZSA9IGZ1bmN0aW9uIEpTT05WYWx1ZU5vZGUoX3JlZikge1xuICB2YXIgbm9kZVR5cGUgPSBfcmVmLm5vZGVUeXBlLFxuICAgICAgc3R5bGluZyA9IF9yZWYuc3R5bGluZyxcbiAgICAgIGxhYmVsUmVuZGVyZXIgPSBfcmVmLmxhYmVsUmVuZGVyZXIsXG4gICAgICBrZXlQYXRoID0gX3JlZi5rZXlQYXRoLFxuICAgICAgdmFsdWVSZW5kZXJlciA9IF9yZWYudmFsdWVSZW5kZXJlcixcbiAgICAgIHZhbHVlID0gX3JlZi52YWx1ZSxcbiAgICAgIF9yZWYkdmFsdWVHZXR0ZXIgPSBfcmVmLnZhbHVlR2V0dGVyLFxuICAgICAgdmFsdWVHZXR0ZXIgPSBfcmVmJHZhbHVlR2V0dGVyID09PSB2b2lkIDAgPyBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH0gOiBfcmVmJHZhbHVlR2V0dGVyO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCBzdHlsaW5nKCd2YWx1ZScsIG5vZGVUeXBlLCBrZXlQYXRoKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiLCBzdHlsaW5nKFsnbGFiZWwnLCAndmFsdWVMYWJlbCddLCBub2RlVHlwZSwga2V5UGF0aCksIGxhYmVsUmVuZGVyZXIoa2V5UGF0aCwgbm9kZVR5cGUsIGZhbHNlLCBmYWxzZSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgc3R5bGluZygndmFsdWVUZXh0Jywgbm9kZVR5cGUsIGtleVBhdGgpLCB2YWx1ZVJlbmRlcmVyLmFwcGx5KHZvaWQgMCwgW3ZhbHVlR2V0dGVyKHZhbHVlKSwgdmFsdWVdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoa2V5UGF0aCkpKSkpO1xufTtcblxuSlNPTlZhbHVlTm9kZS5wcm9wVHlwZXMgPSB7XG4gIG5vZGVUeXBlOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gIHN0eWxpbmc6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIGxhYmVsUmVuZGVyZXI6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIGtleVBhdGg6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5udW1iZXJdKS5pc1JlcXVpcmVkKS5pc1JlcXVpcmVkLFxuICB2YWx1ZVJlbmRlcmVyOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICB2YWx1ZTogUHJvcFR5cGVzLmFueSxcbiAgdmFsdWVHZXR0ZXI6IFByb3BUeXBlcy5mdW5jXG59O1xuZXhwb3J0IGRlZmF1bHQgSlNPTlZhbHVlTm9kZTsiLCJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCI7XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmltcG9ydCB7IGNyZWF0ZVN0eWxpbmcgfSBmcm9tICdyZWFjdC1iYXNlMTYtc3R5bGluZyc7XG5pbXBvcnQgc29sYXJpemVkIGZyb20gJy4vdGhlbWVzL3NvbGFyaXplZCc7XG5cbnZhciBjb2xvck1hcCA9IGZ1bmN0aW9uIGNvbG9yTWFwKHRoZW1lKSB7XG4gIHJldHVybiB7XG4gICAgQkFDS0dST1VORF9DT0xPUjogdGhlbWUuYmFzZTAwLFxuICAgIFRFWFRfQ09MT1I6IHRoZW1lLmJhc2UwNyxcbiAgICBTVFJJTkdfQ09MT1I6IHRoZW1lLmJhc2UwQixcbiAgICBEQVRFX0NPTE9SOiB0aGVtZS5iYXNlMEIsXG4gICAgTlVNQkVSX0NPTE9SOiB0aGVtZS5iYXNlMDksXG4gICAgQk9PTEVBTl9DT0xPUjogdGhlbWUuYmFzZTA5LFxuICAgIE5VTExfQ09MT1I6IHRoZW1lLmJhc2UwOCxcbiAgICBVTkRFRklORURfQ09MT1I6IHRoZW1lLmJhc2UwOCxcbiAgICBGVU5DVElPTl9DT0xPUjogdGhlbWUuYmFzZTA4LFxuICAgIFNZTUJPTF9DT0xPUjogdGhlbWUuYmFzZTA4LFxuICAgIExBQkVMX0NPTE9SOiB0aGVtZS5iYXNlMEQsXG4gICAgQVJST1dfQ09MT1I6IHRoZW1lLmJhc2UwRCxcbiAgICBJVEVNX1NUUklOR19DT0xPUjogdGhlbWUuYmFzZTBCLFxuICAgIElURU1fU1RSSU5HX0VYUEFOREVEX0NPTE9SOiB0aGVtZS5iYXNlMDNcbiAgfTtcbn07XG5cbnZhciB2YWx1ZUNvbG9yTWFwID0gZnVuY3Rpb24gdmFsdWVDb2xvck1hcChjb2xvcnMpIHtcbiAgcmV0dXJuIHtcbiAgICBTdHJpbmc6IGNvbG9ycy5TVFJJTkdfQ09MT1IsXG4gICAgRGF0ZTogY29sb3JzLkRBVEVfQ09MT1IsXG4gICAgTnVtYmVyOiBjb2xvcnMuTlVNQkVSX0NPTE9SLFxuICAgIEJvb2xlYW46IGNvbG9ycy5CT09MRUFOX0NPTE9SLFxuICAgIE51bGw6IGNvbG9ycy5OVUxMX0NPTE9SLFxuICAgIFVuZGVmaW5lZDogY29sb3JzLlVOREVGSU5FRF9DT0xPUixcbiAgICBGdW5jdGlvbjogY29sb3JzLkZVTkNUSU9OX0NPTE9SLFxuICAgIFN5bWJvbDogY29sb3JzLlNZTUJPTF9DT0xPUlxuICB9O1xufTtcblxudmFyIGdldERlZmF1bHRUaGVtZVN0eWxpbmcgPSBmdW5jdGlvbiBnZXREZWZhdWx0VGhlbWVTdHlsaW5nKHRoZW1lKSB7XG4gIHZhciBjb2xvcnMgPSBjb2xvck1hcCh0aGVtZSk7XG4gIHJldHVybiB7XG4gICAgdHJlZToge1xuICAgICAgYm9yZGVyOiAwLFxuICAgICAgcGFkZGluZzogMCxcbiAgICAgIG1hcmdpblRvcDogJzAuNWVtJyxcbiAgICAgIG1hcmdpbkJvdHRvbTogJzAuNWVtJyxcbiAgICAgIG1hcmdpbkxlZnQ6ICcwLjEyNWVtJyxcbiAgICAgIG1hcmdpblJpZ2h0OiAwLFxuICAgICAgbGlzdFN0eWxlOiAnbm9uZScsXG4gICAgICBNb3pVc2VyU2VsZWN0OiAnbm9uZScsXG4gICAgICBXZWJraXRVc2VyU2VsZWN0OiAnbm9uZScsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IGNvbG9ycy5CQUNLR1JPVU5EX0NPTE9SXG4gICAgfSxcbiAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUoX3JlZiwgbm9kZVR5cGUsIGtleVBhdGgpIHtcbiAgICAgIHZhciBzdHlsZSA9IF9yZWYuc3R5bGU7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdHlsZSksIHt9LCB7XG4gICAgICAgICAgcGFkZGluZ1RvcDogJzAuMjVlbScsXG4gICAgICAgICAgcGFkZGluZ1JpZ2h0OiAwLFxuICAgICAgICAgIG1hcmdpbkxlZnQ6ICcwLjg3NWVtJyxcbiAgICAgICAgICBXZWJraXRVc2VyU2VsZWN0OiAndGV4dCcsXG4gICAgICAgICAgTW96VXNlclNlbGVjdDogJ3RleHQnLFxuICAgICAgICAgIHdvcmRXcmFwOiAnYnJlYWstd29yZCcsXG4gICAgICAgICAgcGFkZGluZ0xlZnQ6IGtleVBhdGgubGVuZ3RoID4gMSA/ICcyLjEyNWVtJyA6ICcxLjI1ZW0nLFxuICAgICAgICAgIHRleHRJbmRlbnQ6ICctMC41ZW0nLFxuICAgICAgICAgIHdvcmRCcmVhazogJ2JyZWFrLWFsbCdcbiAgICAgICAgfSlcbiAgICAgIH07XG4gICAgfSxcbiAgICBsYWJlbDoge1xuICAgICAgZGlzcGxheTogJ2lubGluZS1ibG9jaycsXG4gICAgICBjb2xvcjogY29sb3JzLkxBQkVMX0NPTE9SXG4gICAgfSxcbiAgICB2YWx1ZUxhYmVsOiB7XG4gICAgICBtYXJnaW46ICcwIDAuNWVtIDAgMCdcbiAgICB9LFxuICAgIHZhbHVlVGV4dDogZnVuY3Rpb24gdmFsdWVUZXh0KF9yZWYyLCBub2RlVHlwZSkge1xuICAgICAgdmFyIHN0eWxlID0gX3JlZjIuc3R5bGU7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdHlsZSksIHt9LCB7XG4gICAgICAgICAgY29sb3I6IHZhbHVlQ29sb3JNYXAoY29sb3JzKVtub2RlVHlwZV1cbiAgICAgICAgfSlcbiAgICAgIH07XG4gICAgfSxcbiAgICBpdGVtUmFuZ2U6IGZ1bmN0aW9uIGl0ZW1SYW5nZShzdHlsaW5nLCBleHBhbmRlZCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICBwYWRkaW5nVG9wOiBleHBhbmRlZCA/IDAgOiAnMC4yNWVtJyxcbiAgICAgICAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICAgICAgICBjb2xvcjogY29sb3JzLkxBQkVMX0NPTE9SXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSxcbiAgICBhcnJvdzogZnVuY3Rpb24gYXJyb3coX3JlZjMsIG5vZGVUeXBlLCBleHBhbmRlZCkge1xuICAgICAgdmFyIHN0eWxlID0gX3JlZjMuc3R5bGU7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdHlsZSksIHt9LCB7XG4gICAgICAgICAgbWFyZ2luTGVmdDogMCxcbiAgICAgICAgICB0cmFuc2l0aW9uOiAnMTUwbXMnLFxuICAgICAgICAgIFdlYmtpdFRyYW5zaXRpb246ICcxNTBtcycsXG4gICAgICAgICAgTW96VHJhbnNpdGlvbjogJzE1MG1zJyxcbiAgICAgICAgICBXZWJraXRUcmFuc2Zvcm06IGV4cGFuZGVkID8gJ3JvdGF0ZVooOTBkZWcpJyA6ICdyb3RhdGVaKDBkZWcpJyxcbiAgICAgICAgICBNb3pUcmFuc2Zvcm06IGV4cGFuZGVkID8gJ3JvdGF0ZVooOTBkZWcpJyA6ICdyb3RhdGVaKDBkZWcpJyxcbiAgICAgICAgICB0cmFuc2Zvcm06IGV4cGFuZGVkID8gJ3JvdGF0ZVooOTBkZWcpJyA6ICdyb3RhdGVaKDBkZWcpJyxcbiAgICAgICAgICB0cmFuc2Zvcm1PcmlnaW46ICc0NSUgNTAlJyxcbiAgICAgICAgICBXZWJraXRUcmFuc2Zvcm1PcmlnaW46ICc0NSUgNTAlJyxcbiAgICAgICAgICBNb3pUcmFuc2Zvcm1PcmlnaW46ICc0NSUgNTAlJyxcbiAgICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgICAgICBsaW5lSGVpZ2h0OiAnMS4xZW0nLFxuICAgICAgICAgIGZvbnRTaXplOiAnMC43NWVtJ1xuICAgICAgICB9KVxuICAgICAgfTtcbiAgICB9LFxuICAgIGFycm93Q29udGFpbmVyOiBmdW5jdGlvbiBhcnJvd0NvbnRhaW5lcihfcmVmNCwgYXJyb3dTdHlsZSkge1xuICAgICAgdmFyIHN0eWxlID0gX3JlZjQuc3R5bGU7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdHlsZSksIHt9LCB7XG4gICAgICAgICAgZGlzcGxheTogJ2lubGluZS1ibG9jaycsXG4gICAgICAgICAgcGFkZGluZ1JpZ2h0OiAnMC41ZW0nLFxuICAgICAgICAgIHBhZGRpbmdMZWZ0OiBhcnJvd1N0eWxlID09PSAnZG91YmxlJyA/ICcxZW0nIDogMCxcbiAgICAgICAgICBjdXJzb3I6ICdwb2ludGVyJ1xuICAgICAgICB9KVxuICAgICAgfTtcbiAgICB9LFxuICAgIGFycm93U2lnbjoge1xuICAgICAgY29sb3I6IGNvbG9ycy5BUlJPV19DT0xPUlxuICAgIH0sXG4gICAgYXJyb3dTaWduSW5uZXI6IHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgdG9wOiAwLFxuICAgICAgbGVmdDogJy0wLjRlbSdcbiAgICB9LFxuICAgIG5lc3RlZE5vZGU6IGZ1bmN0aW9uIG5lc3RlZE5vZGUoX3JlZjUsIGtleVBhdGgsIG5vZGVUeXBlLCBleHBhbmRlZCwgZXhwYW5kYWJsZSkge1xuICAgICAgdmFyIHN0eWxlID0gX3JlZjUuc3R5bGU7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdHlsZSksIHt9LCB7XG4gICAgICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICAgICAgcGFkZGluZ1RvcDogJzAuMjVlbScsXG4gICAgICAgICAgbWFyZ2luTGVmdDoga2V5UGF0aC5sZW5ndGggPiAxID8gJzAuODc1ZW0nIDogMCxcbiAgICAgICAgICBwYWRkaW5nTGVmdDogIWV4cGFuZGFibGUgPyAnMS4xMjVlbScgOiAwXG4gICAgICAgIH0pXG4gICAgICB9O1xuICAgIH0sXG4gICAgcm9vdE5vZGU6IHtcbiAgICAgIHBhZGRpbmc6IDAsXG4gICAgICBtYXJnaW46IDBcbiAgICB9LFxuICAgIG5lc3RlZE5vZGVMYWJlbDogZnVuY3Rpb24gbmVzdGVkTm9kZUxhYmVsKF9yZWY2LCBrZXlQYXRoLCBub2RlVHlwZSwgZXhwYW5kZWQsIGV4cGFuZGFibGUpIHtcbiAgICAgIHZhciBzdHlsZSA9IF9yZWY2LnN0eWxlO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3R5bGUpLCB7fSwge1xuICAgICAgICAgIG1hcmdpbjogMCxcbiAgICAgICAgICBwYWRkaW5nOiAwLFxuICAgICAgICAgIFdlYmtpdFVzZXJTZWxlY3Q6IGV4cGFuZGFibGUgPyAnaW5oZXJpdCcgOiAndGV4dCcsXG4gICAgICAgICAgTW96VXNlclNlbGVjdDogZXhwYW5kYWJsZSA/ICdpbmhlcml0JyA6ICd0ZXh0JyxcbiAgICAgICAgICBjdXJzb3I6IGV4cGFuZGFibGUgPyAncG9pbnRlcicgOiAnZGVmYXVsdCdcbiAgICAgICAgfSlcbiAgICAgIH07XG4gICAgfSxcbiAgICBuZXN0ZWROb2RlSXRlbVN0cmluZzogZnVuY3Rpb24gbmVzdGVkTm9kZUl0ZW1TdHJpbmcoX3JlZjcsIGtleVBhdGgsIG5vZGVUeXBlLCBleHBhbmRlZCkge1xuICAgICAgdmFyIHN0eWxlID0gX3JlZjcuc3R5bGU7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdHlsZSksIHt9LCB7XG4gICAgICAgICAgcGFkZGluZ0xlZnQ6ICcwLjVlbScsXG4gICAgICAgICAgY3Vyc29yOiAnZGVmYXVsdCcsXG4gICAgICAgICAgY29sb3I6IGV4cGFuZGVkID8gY29sb3JzLklURU1fU1RSSU5HX0VYUEFOREVEX0NPTE9SIDogY29sb3JzLklURU1fU1RSSU5HX0NPTE9SXG4gICAgICAgIH0pXG4gICAgICB9O1xuICAgIH0sXG4gICAgbmVzdGVkTm9kZUl0ZW1UeXBlOiB7XG4gICAgICBtYXJnaW5MZWZ0OiAnMC4zZW0nLFxuICAgICAgbWFyZ2luUmlnaHQ6ICcwLjNlbSdcbiAgICB9LFxuICAgIG5lc3RlZE5vZGVDaGlsZHJlbjogZnVuY3Rpb24gbmVzdGVkTm9kZUNoaWxkcmVuKF9yZWY4LCBub2RlVHlwZSwgZXhwYW5kZWQpIHtcbiAgICAgIHZhciBzdHlsZSA9IF9yZWY4LnN0eWxlO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3R5bGUpLCB7fSwge1xuICAgICAgICAgIHBhZGRpbmc6IDAsXG4gICAgICAgICAgbWFyZ2luOiAwLFxuICAgICAgICAgIGxpc3RTdHlsZTogJ25vbmUnLFxuICAgICAgICAgIGRpc3BsYXk6IGV4cGFuZGVkID8gJ2Jsb2NrJyA6ICdub25lJ1xuICAgICAgICB9KVxuICAgICAgfTtcbiAgICB9LFxuICAgIHJvb3ROb2RlQ2hpbGRyZW46IHtcbiAgICAgIHBhZGRpbmc6IDAsXG4gICAgICBtYXJnaW46IDAsXG4gICAgICBsaXN0U3R5bGU6ICdub25lJ1xuICAgIH1cbiAgfTtcbn07XG5cbnZhciBjcmVhdGVTdHlsaW5nRnJvbVRoZW1lID0gY3JlYXRlU3R5bGluZyhnZXREZWZhdWx0VGhlbWVTdHlsaW5nLCB7XG4gIGRlZmF1bHRCYXNlMTY6IHNvbGFyaXplZFxufSk7XG5leHBvcnQgZGVmYXVsdCBjcmVhdGVTdHlsaW5nRnJvbVRoZW1lOyIsImltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9Db25zdW1hYmxlQXJyYXlcIjtcblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobywgYWxsb3dBcnJheUxpa2UpIHsgdmFyIGl0ID0gdHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl0gfHwgb1tcIkBAaXRlcmF0b3JcIl07IGlmICghaXQpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKGl0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgeyBpZiAoaXQpIG8gPSBpdDsgdmFyIGkgPSAwOyB2YXIgRiA9IGZ1bmN0aW9uIEYoKSB7fTsgcmV0dXJuIHsgczogRiwgbjogZnVuY3Rpb24gbigpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfSwgZTogZnVuY3Rpb24gZShfZSkgeyB0aHJvdyBfZTsgfSwgZjogRiB9OyB9IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSB2YXIgbm9ybWFsQ29tcGxldGlvbiA9IHRydWUsIGRpZEVyciA9IGZhbHNlLCBlcnI7IHJldHVybiB7IHM6IGZ1bmN0aW9uIHMoKSB7IGl0ID0gaXQuY2FsbChvKTsgfSwgbjogZnVuY3Rpb24gbigpIHsgdmFyIHN0ZXAgPSBpdC5uZXh0KCk7IG5vcm1hbENvbXBsZXRpb24gPSBzdGVwLmRvbmU7IHJldHVybiBzdGVwOyB9LCBlOiBmdW5jdGlvbiBlKF9lMikgeyBkaWRFcnIgPSB0cnVlOyBlcnIgPSBfZTI7IH0sIGY6IGZ1bmN0aW9uIGYoKSB7IHRyeSB7IGlmICghbm9ybWFsQ29tcGxldGlvbiAmJiBpdC5yZXR1cm4gIT0gbnVsbCkgaXQucmV0dXJuKCk7IH0gZmluYWxseSB7IGlmIChkaWRFcnIpIHRocm93IGVycjsgfSB9IH07IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG5mdW5jdGlvbiBnZXRMZW5ndGgodHlwZSwgY29sbGVjdGlvbikge1xuICBpZiAodHlwZSA9PT0gJ09iamVjdCcpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhjb2xsZWN0aW9uKS5sZW5ndGg7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ0FycmF5Jykge1xuICAgIHJldHVybiBjb2xsZWN0aW9uLmxlbmd0aDtcbiAgfVxuXG4gIHJldHVybiBJbmZpbml0eTtcbn1cblxuZnVuY3Rpb24gaXNJdGVyYWJsZU1hcChjb2xsZWN0aW9uKSB7XG4gIHJldHVybiB0eXBlb2YgY29sbGVjdGlvbi5zZXQgPT09ICdmdW5jdGlvbic7XG59XG5cbmZ1bmN0aW9uIGdldEVudHJpZXModHlwZSwgY29sbGVjdGlvbiwgc29ydE9iamVjdEtleXMpIHtcbiAgdmFyIGZyb20gPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IDA7XG4gIHZhciB0byA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ICYmIGFyZ3VtZW50c1s0XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzRdIDogSW5maW5pdHk7XG4gIHZhciByZXM7XG5cbiAgaWYgKHR5cGUgPT09ICdPYmplY3QnKSB7XG4gICAgdmFyIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhjb2xsZWN0aW9uKTtcblxuICAgIGlmIChzb3J0T2JqZWN0S2V5cykge1xuICAgICAga2V5cy5zb3J0KHNvcnRPYmplY3RLZXlzID09PSB0cnVlID8gdW5kZWZpbmVkIDogc29ydE9iamVjdEtleXMpO1xuICAgIH1cblxuICAgIGtleXMgPSBrZXlzLnNsaWNlKGZyb20sIHRvICsgMSk7XG4gICAgcmVzID0ge1xuICAgICAgZW50cmllczoga2V5cy5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgIHZhbHVlOiBjb2xsZWN0aW9uW2tleV1cbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgfTtcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnQXJyYXknKSB7XG4gICAgcmVzID0ge1xuICAgICAgZW50cmllczogY29sbGVjdGlvbi5zbGljZShmcm9tLCB0byArIDEpLm1hcChmdW5jdGlvbiAodmFsLCBpZHgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBrZXk6IGlkeCArIGZyb20sXG4gICAgICAgICAgdmFsdWU6IHZhbFxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHZhciBpZHggPSAwO1xuICAgIHZhciBlbnRyaWVzID0gW107XG4gICAgdmFyIGRvbmUgPSB0cnVlO1xuICAgIHZhciBpc01hcCA9IGlzSXRlcmFibGVNYXAoY29sbGVjdGlvbik7XG5cbiAgICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoY29sbGVjdGlvbiksXG4gICAgICAgIF9zdGVwO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7XG4gICAgICAgIHZhciBpdGVtID0gX3N0ZXAudmFsdWU7XG5cbiAgICAgICAgaWYgKGlkeCA+IHRvKSB7XG4gICAgICAgICAgZG9uZSA9IGZhbHNlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZyb20gPD0gaWR4KSB7XG4gICAgICAgICAgaWYgKGlzTWFwICYmIEFycmF5LmlzQXJyYXkoaXRlbSkpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaXRlbVswXSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGl0ZW1bMF0gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgIGVudHJpZXMucHVzaCh7XG4gICAgICAgICAgICAgICAga2V5OiBpdGVtWzBdLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBpdGVtWzFdXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZW50cmllcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBrZXk6IFwiW2VudHJ5IFwiLmNvbmNhdChpZHgsIFwiXVwiKSxcbiAgICAgICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICAgICAgJ1trZXldJzogaXRlbVswXSxcbiAgICAgICAgICAgICAgICAgICdbdmFsdWVdJzogaXRlbVsxXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVudHJpZXMucHVzaCh7XG4gICAgICAgICAgICAgIGtleTogaWR4LFxuICAgICAgICAgICAgICB2YWx1ZTogaXRlbVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWR4Kys7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBfaXRlcmF0b3IuZShlcnIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBfaXRlcmF0b3IuZigpO1xuICAgIH1cblxuICAgIHJlcyA9IHtcbiAgICAgIGhhc01vcmU6ICFkb25lLFxuICAgICAgZW50cmllczogZW50cmllc1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gcmVzO1xufVxuXG5mdW5jdGlvbiBnZXRSYW5nZXMoZnJvbSwgdG8sIGxpbWl0KSB7XG4gIHZhciByYW5nZXMgPSBbXTtcblxuICB3aGlsZSAodG8gLSBmcm9tID4gbGltaXQgKiBsaW1pdCkge1xuICAgIGxpbWl0ID0gbGltaXQgKiBsaW1pdDtcbiAgfVxuXG4gIGZvciAodmFyIGkgPSBmcm9tOyBpIDw9IHRvOyBpICs9IGxpbWl0KSB7XG4gICAgcmFuZ2VzLnB1c2goe1xuICAgICAgZnJvbTogaSxcbiAgICAgIHRvOiBNYXRoLm1pbih0bywgaSArIGxpbWl0IC0gMSlcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiByYW5nZXM7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldENvbGxlY3Rpb25FbnRyaWVzKHR5cGUsIGNvbGxlY3Rpb24sIHNvcnRPYmplY3RLZXlzLCBsaW1pdCkge1xuICB2YXIgZnJvbSA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ICYmIGFyZ3VtZW50c1s0XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzRdIDogMDtcbiAgdmFyIHRvID0gYXJndW1lbnRzLmxlbmd0aCA+IDUgJiYgYXJndW1lbnRzWzVdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNV0gOiBJbmZpbml0eTtcbiAgdmFyIGdldEVudHJpZXNCb3VuZCA9IGdldEVudHJpZXMuYmluZChudWxsLCB0eXBlLCBjb2xsZWN0aW9uLCBzb3J0T2JqZWN0S2V5cyk7XG5cbiAgaWYgKCFsaW1pdCkge1xuICAgIHJldHVybiBnZXRFbnRyaWVzQm91bmQoKS5lbnRyaWVzO1xuICB9XG5cbiAgdmFyIGlzU3Vic2V0ID0gdG8gPCBJbmZpbml0eTtcbiAgdmFyIGxlbmd0aCA9IE1hdGgubWluKHRvIC0gZnJvbSwgZ2V0TGVuZ3RoKHR5cGUsIGNvbGxlY3Rpb24pKTtcblxuICBpZiAodHlwZSAhPT0gJ0l0ZXJhYmxlJykge1xuICAgIGlmIChsZW5ndGggPD0gbGltaXQgfHwgbGltaXQgPCA3KSB7XG4gICAgICByZXR1cm4gZ2V0RW50cmllc0JvdW5kKGZyb20sIHRvKS5lbnRyaWVzO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAobGVuZ3RoIDw9IGxpbWl0ICYmICFpc1N1YnNldCkge1xuICAgICAgcmV0dXJuIGdldEVudHJpZXNCb3VuZChmcm9tLCB0bykuZW50cmllcztcbiAgICB9XG4gIH1cblxuICB2YXIgbGltaXRlZEVudHJpZXM7XG5cbiAgaWYgKHR5cGUgPT09ICdJdGVyYWJsZScpIHtcbiAgICB2YXIgX2dldEVudHJpZXNCb3VuZCA9IGdldEVudHJpZXNCb3VuZChmcm9tLCBmcm9tICsgbGltaXQgLSAxKSxcbiAgICAgICAgaGFzTW9yZSA9IF9nZXRFbnRyaWVzQm91bmQuaGFzTW9yZSxcbiAgICAgICAgZW50cmllcyA9IF9nZXRFbnRyaWVzQm91bmQuZW50cmllcztcblxuICAgIGxpbWl0ZWRFbnRyaWVzID0gaGFzTW9yZSA/IFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoZW50cmllcyksIF90b0NvbnN1bWFibGVBcnJheShnZXRSYW5nZXMoZnJvbSArIGxpbWl0LCBmcm9tICsgMiAqIGxpbWl0IC0gMSwgbGltaXQpKSkgOiBlbnRyaWVzO1xuICB9IGVsc2Uge1xuICAgIGxpbWl0ZWRFbnRyaWVzID0gaXNTdWJzZXQgPyBnZXRSYW5nZXMoZnJvbSwgdG8sIGxpbWl0KSA6IFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoZ2V0RW50cmllc0JvdW5kKDAsIGxpbWl0IC0gNSkuZW50cmllcyksIF90b0NvbnN1bWFibGVBcnJheShnZXRSYW5nZXMobGltaXQgLSA0LCBsZW5ndGggLSA1LCBsaW1pdCkpLCBfdG9Db25zdW1hYmxlQXJyYXkoZ2V0RW50cmllc0JvdW5kKGxlbmd0aCAtIDQsIGxlbmd0aCAtIDEpLmVudHJpZXMpKTtcbiAgfVxuXG4gIHJldHVybiBsaW1pdGVkRW50cmllcztcbn0iLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xuaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9pbmhlcml0cyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiO1xuaW1wb3J0IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm5cIjtcbmltcG9ydCBfZ2V0UHJvdG90eXBlT2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZ2V0UHJvdG90eXBlT2ZcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5XCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wiZGF0YVwiLCBcImtleVBhdGhcIiwgXCJwb3N0cHJvY2Vzc1ZhbHVlXCIsIFwiaGlkZVJvb3RcIiwgXCJ0aGVtZVwiLCBcImludmVydFRoZW1lXCJdO1xuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTsgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7IHRyeSB7IEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuLy8gRVM2ICsgaW5saW5lIHN0eWxlIHBvcnQgb2YgSlNPTlZpZXdlciBodHRwczovL2JpdGJ1Y2tldC5vcmcvZGF2ZXZlZGRlci9yZWFjdC1qc29uLXZpZXdlci9cbi8vIGFsbCBjcmVkaXRzIGFuZCBvcmlnaW5hbCBjb2RlIHRvIHRoZSBhdXRob3Jcbi8vIERhdmUgVmVkZGVyIDx2ZWRkZXJtYXRpY0BnbWFpbC5jb20+IGh0dHA6Ly93d3cuZXNraW1vc3B5LmNvbS9cbi8vIHBvcnQgYnkgRGFuaWVsZSBaYW5ub3R0aSBodHRwOi8vd3d3LmdpdGh1Yi5jb20vZHphbm5vdHRpIDxkemFubm90dGlAbWUuY29tPlxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgSlNPTk5vZGUgZnJvbSAnLi9KU09OTm9kZSc7XG5pbXBvcnQgY3JlYXRlU3R5bGluZ0Zyb21UaGVtZSBmcm9tICcuL2NyZWF0ZVN0eWxpbmdGcm9tVGhlbWUnO1xuaW1wb3J0IHsgaW52ZXJ0VGhlbWUgfSBmcm9tICdyZWFjdC1iYXNlMTYtc3R5bGluZyc7XG5cbnZhciBpZGVudGl0eSA9IGZ1bmN0aW9uIGlkZW50aXR5KHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZTtcbn07XG5cbnZhciBleHBhbmRSb290Tm9kZSA9IGZ1bmN0aW9uIGV4cGFuZFJvb3ROb2RlKGtleVBhdGgsIGRhdGEsIGxldmVsKSB7XG4gIHJldHVybiBsZXZlbCA9PT0gMDtcbn07XG5cbnZhciBkZWZhdWx0SXRlbVN0cmluZyA9IGZ1bmN0aW9uIGRlZmF1bHRJdGVtU3RyaW5nKHR5cGUsIGRhdGEsIGl0ZW1UeXBlLCBpdGVtU3RyaW5nKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgaXRlbVR5cGUsIFwiIFwiLCBpdGVtU3RyaW5nKTtcbn07XG5cbnZhciBkZWZhdWx0TGFiZWxSZW5kZXJlciA9IGZ1bmN0aW9uIGRlZmF1bHRMYWJlbFJlbmRlcmVyKF9yZWYpIHtcbiAgdmFyIF9yZWYyID0gX3NsaWNlZFRvQXJyYXkoX3JlZiwgMSksXG4gICAgICBsYWJlbCA9IF9yZWYyWzBdO1xuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgbGFiZWwsIFwiOlwiKTtcbn07XG5cbnZhciBub0N1c3RvbU5vZGUgPSBmdW5jdGlvbiBub0N1c3RvbU5vZGUoKSB7XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbmZ1bmN0aW9uIGNoZWNrTGVnYWN5VGhlbWluZyh0aGVtZSwgcHJvcHMpIHtcbiAgdmFyIGRlcHJlY2F0ZWRTdHlsaW5nTWV0aG9kc01hcCA9IHtcbiAgICBnZXRBcnJvd1N0eWxlOiAnYXJyb3cnLFxuICAgIGdldExpc3RTdHlsZTogJ25lc3RlZE5vZGVDaGlsZHJlbicsXG4gICAgZ2V0SXRlbVN0cmluZ1N0eWxlOiAnbmVzdGVkTm9kZUl0ZW1TdHJpbmcnLFxuICAgIGdldExhYmVsU3R5bGU6ICdsYWJlbCcsXG4gICAgZ2V0VmFsdWVTdHlsZTogJ3ZhbHVlVGV4dCdcbiAgfTtcbiAgdmFyIGRlcHJlY2F0ZWRTdHlsaW5nTWV0aG9kcyA9IE9iamVjdC5rZXlzKGRlcHJlY2F0ZWRTdHlsaW5nTWV0aG9kc01hcCkuZmlsdGVyKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgcmV0dXJuIHByb3BzW25hbWVdO1xuICB9KTtcblxuICBpZiAoZGVwcmVjYXRlZFN0eWxpbmdNZXRob2RzLmxlbmd0aCA+IDApIHtcbiAgICBpZiAodHlwZW9mIHRoZW1lID09PSAnc3RyaW5nJykge1xuICAgICAgdGhlbWUgPSB7XG4gICAgICAgIGV4dGVuZDogdGhlbWVcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoZW1lID0gX29iamVjdFNwcmVhZCh7fSwgdGhlbWUpO1xuICAgIH1cblxuICAgIGRlcHJlY2F0ZWRTdHlsaW5nTWV0aG9kcy5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS5lcnJvcihcIlN0eWxpbmcgbWV0aG9kIFxcXCJcIi5jb25jYXQobmFtZSwgXCJcXFwiIGlzIGRlcHJlY2F0ZWQsIHVzZSBcXFwidGhlbWVcXFwiIHByb3BlcnR5IGluc3RlYWRcIikpO1xuXG4gICAgICB0aGVtZVtkZXByZWNhdGVkU3R5bGluZ01ldGhvZHNNYXBbbmFtZV1dID0gZnVuY3Rpb24gKF9yZWYzKSB7XG4gICAgICAgIHZhciBzdHlsZSA9IF9yZWYzLnN0eWxlO1xuXG4gICAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3R5bGUpLCBwcm9wc1tuYW1lXS5hcHBseShwcm9wcywgYXJncykpXG4gICAgICAgIH07XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHRoZW1lO1xufVxuXG5mdW5jdGlvbiBnZXRTdGF0ZUZyb21Qcm9wcyhwcm9wcykge1xuICB2YXIgdGhlbWUgPSBjaGVja0xlZ2FjeVRoZW1pbmcocHJvcHMudGhlbWUsIHByb3BzKTtcblxuICBpZiAocHJvcHMuaW52ZXJ0VGhlbWUpIHtcbiAgICB0aGVtZSA9IGludmVydFRoZW1lKHRoZW1lKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc3R5bGluZzogY3JlYXRlU3R5bGluZ0Zyb21UaGVtZSh0aGVtZSlcbiAgfTtcbn1cblxuZXhwb3J0IHZhciBKU09OVHJlZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoSlNPTlRyZWUsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoSlNPTlRyZWUpO1xuXG4gIGZ1bmN0aW9uIEpTT05UcmVlKHByb3BzKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEpTT05UcmVlKTtcblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgcHJvcHMpO1xuICAgIF90aGlzLnN0YXRlID0gZ2V0U3RhdGVGcm9tUHJvcHMocHJvcHMpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhKU09OVHJlZSwgW3tcbiAgICBrZXk6IFwiVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgaWYgKFsndGhlbWUnLCAnaW52ZXJ0VGhlbWUnXS5maW5kKGZ1bmN0aW9uIChrKSB7XG4gICAgICAgIHJldHVybiBuZXh0UHJvcHNba10gIT09IF90aGlzMi5wcm9wc1trXTtcbiAgICAgIH0pKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoZ2V0U3RhdGVGcm9tUHJvcHMobmV4dFByb3BzKSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNob3VsZENvbXBvbmVudFVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzaG91bGRDb21wb25lbnRVcGRhdGUobmV4dFByb3BzKSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgcmV0dXJuICEhT2JqZWN0LmtleXMobmV4dFByb3BzKS5maW5kKGZ1bmN0aW9uIChrKSB7XG4gICAgICAgIHJldHVybiBrID09PSAna2V5UGF0aCcgPyBuZXh0UHJvcHNba10uam9pbignLycpICE9PSBfdGhpczMucHJvcHNba10uam9pbignLycpIDogbmV4dFByb3BzW2tdICE9PSBfdGhpczMucHJvcHNba107XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgdmFsdWUgPSBfdGhpcyRwcm9wcy5kYXRhLFxuICAgICAgICAgIGtleVBhdGggPSBfdGhpcyRwcm9wcy5rZXlQYXRoLFxuICAgICAgICAgIHBvc3Rwcm9jZXNzVmFsdWUgPSBfdGhpcyRwcm9wcy5wb3N0cHJvY2Vzc1ZhbHVlLFxuICAgICAgICAgIGhpZGVSb290ID0gX3RoaXMkcHJvcHMuaGlkZVJvb3QsXG4gICAgICAgICAgdGhlbWUgPSBfdGhpcyRwcm9wcy50aGVtZSxcbiAgICAgICAgICBfID0gX3RoaXMkcHJvcHMuaW52ZXJ0VGhlbWUsXG4gICAgICAgICAgcmVzdCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfdGhpcyRwcm9wcywgX2V4Y2x1ZGVkKTtcblxuICAgICAgdmFyIHN0eWxpbmcgPSB0aGlzLnN0YXRlLnN0eWxpbmc7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCBzdHlsaW5nKCd0cmVlJyksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05Ob2RlLCBfZXh0ZW5kcyh7fSwgX29iamVjdFNwcmVhZCh7XG4gICAgICAgIHBvc3Rwcm9jZXNzVmFsdWU6IHBvc3Rwcm9jZXNzVmFsdWUsXG4gICAgICAgIGhpZGVSb290OiBoaWRlUm9vdCxcbiAgICAgICAgc3R5bGluZzogc3R5bGluZ1xuICAgICAgfSwgcmVzdCksIHtcbiAgICAgICAga2V5UGF0aDogaGlkZVJvb3QgPyBbXSA6IGtleVBhdGgsXG4gICAgICAgIHZhbHVlOiBwb3N0cHJvY2Vzc1ZhbHVlKHZhbHVlKVxuICAgICAgfSkpKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gSlNPTlRyZWU7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbl9kZWZpbmVQcm9wZXJ0eShKU09OVHJlZSwgXCJwcm9wVHlwZXNcIiwge1xuICBkYXRhOiBQcm9wVHlwZXMuYW55LFxuICBoaWRlUm9vdDogUHJvcFR5cGVzLmJvb2wsXG4gIHRoZW1lOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMub2JqZWN0LCBQcm9wVHlwZXMuc3RyaW5nXSksXG4gIGludmVydFRoZW1lOiBQcm9wVHlwZXMuYm9vbCxcbiAga2V5UGF0aDogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLm51bWJlcl0pKSxcbiAgcG9zdHByb2Nlc3NWYWx1ZTogUHJvcFR5cGVzLmZ1bmMsXG4gIHNvcnRPYmplY3RLZXlzOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuZnVuYywgUHJvcFR5cGVzLmJvb2xdKVxufSk7XG5cbl9kZWZpbmVQcm9wZXJ0eShKU09OVHJlZSwgXCJkZWZhdWx0UHJvcHNcIiwge1xuICBzaG91bGRFeHBhbmROb2RlOiBleHBhbmRSb290Tm9kZSxcbiAgaGlkZVJvb3Q6IGZhbHNlLFxuICBrZXlQYXRoOiBbJ3Jvb3QnXSxcbiAgZ2V0SXRlbVN0cmluZzogZGVmYXVsdEl0ZW1TdHJpbmcsXG4gIGxhYmVsUmVuZGVyZXI6IGRlZmF1bHRMYWJlbFJlbmRlcmVyLFxuICB2YWx1ZVJlbmRlcmVyOiBpZGVudGl0eSxcbiAgcG9zdHByb2Nlc3NWYWx1ZTogaWRlbnRpdHksXG4gIGlzQ3VzdG9tTm9kZTogbm9DdXN0b21Ob2RlLFxuICBjb2xsZWN0aW9uTGltaXQ6IDUwLFxuICBpbnZlcnRUaGVtZTogdHJ1ZVxufSk7IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gb2JqVHlwZShvYmopIHtcbiAgdmFyIHR5cGUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKS5zbGljZSg4LCAtMSk7XG5cbiAgaWYgKHR5cGUgPT09ICdPYmplY3QnICYmIHR5cGVvZiBvYmpbU3ltYm9sLml0ZXJhdG9yXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiAnSXRlcmFibGUnO1xuICB9XG5cbiAgaWYgKHR5cGUgPT09ICdDdXN0b20nICYmIG9iai5jb25zdHJ1Y3RvciAhPT0gT2JqZWN0ICYmIG9iaiBpbnN0YW5jZW9mIE9iamVjdCkge1xuICAgIC8vIEZvciBwcm9qZWN0cyBpbXBsZW1lbnRpbmcgb2JqZWN0cyBvdmVycmlkaW5nIGAucHJvdG90eXBlW1N5bWJvbC50b1N0cmluZ1RhZ11gXG4gICAgcmV0dXJuICdPYmplY3QnO1xuICB9XG5cbiAgcmV0dXJuIHR5cGU7XG59IiwiZXhwb3J0IGRlZmF1bHQge1xuICBzY2hlbWU6ICdzb2xhcml6ZWQnLFxuICBhdXRob3I6ICdldGhhbiBzY2hvb25vdmVyIChodHRwOi8vZXRoYW5zY2hvb25vdmVyLmNvbS9zb2xhcml6ZWQpJyxcbiAgYmFzZTAwOiAnIzAwMmIzNicsXG4gIGJhc2UwMTogJyMwNzM2NDInLFxuICBiYXNlMDI6ICcjNTg2ZTc1JyxcbiAgYmFzZTAzOiAnIzY1N2I4MycsXG4gIGJhc2UwNDogJyM4Mzk0OTYnLFxuICBiYXNlMDU6ICcjOTNhMWExJyxcbiAgYmFzZTA2OiAnI2VlZThkNScsXG4gIGJhc2UwNzogJyNmZGY2ZTMnLFxuICBiYXNlMDg6ICcjZGMzMjJmJyxcbiAgYmFzZTA5OiAnI2NiNGIxNicsXG4gIGJhc2UwQTogJyNiNTg5MDAnLFxuICBiYXNlMEI6ICcjODU5OTAwJyxcbiAgYmFzZTBDOiAnIzJhYTE5OCcsXG4gIGJhc2UwRDogJyMyNjhiZDInLFxuICBiYXNlMEU6ICcjNmM3MWM0JyxcbiAgYmFzZTBGOiAnI2QzMzY4Midcbn07IiwiaW1wb3J0IGludmFyaWFudCBmcm9tICdpbnZhcmlhbnQnO1xuaW1wb3J0IGlzRnVuY3Rpb24gZnJvbSAnLi91dGlscy9pc0Z1bmN0aW9uJztcbmltcG9ydCBpZGVudGl0eSBmcm9tICcuL3V0aWxzL2lkZW50aXR5JztcbmltcG9ydCBpc051bGwgZnJvbSAnLi91dGlscy9pc051bGwnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY3JlYXRlQWN0aW9uKHR5cGUsIHBheWxvYWRDcmVhdG9yLCBtZXRhQ3JlYXRvcikge1xuICBpZiAocGF5bG9hZENyZWF0b3IgPT09IHZvaWQgMCkge1xuICAgIHBheWxvYWRDcmVhdG9yID0gaWRlbnRpdHk7XG4gIH1cblxuICBpbnZhcmlhbnQoaXNGdW5jdGlvbihwYXlsb2FkQ3JlYXRvcikgfHwgaXNOdWxsKHBheWxvYWRDcmVhdG9yKSwgJ0V4cGVjdGVkIHBheWxvYWRDcmVhdG9yIHRvIGJlIGEgZnVuY3Rpb24sIHVuZGVmaW5lZCBvciBudWxsJyk7XG4gIHZhciBmaW5hbFBheWxvYWRDcmVhdG9yID0gaXNOdWxsKHBheWxvYWRDcmVhdG9yKSB8fCBwYXlsb2FkQ3JlYXRvciA9PT0gaWRlbnRpdHkgPyBpZGVudGl0eSA6IGZ1bmN0aW9uIChoZWFkKSB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGhlYWQgaW5zdGFuY2VvZiBFcnJvciA/IGhlYWQgOiBwYXlsb2FkQ3JlYXRvci5hcHBseSh2b2lkIDAsIFtoZWFkXS5jb25jYXQoYXJncykpO1xuICB9O1xuICB2YXIgaGFzTWV0YSA9IGlzRnVuY3Rpb24obWV0YUNyZWF0b3IpO1xuICB2YXIgdHlwZVN0cmluZyA9IHR5cGUudG9TdHJpbmcoKTtcblxuICB2YXIgYWN0aW9uQ3JlYXRvciA9IGZ1bmN0aW9uIGFjdGlvbkNyZWF0b3IoKSB7XG4gICAgdmFyIHBheWxvYWQgPSBmaW5hbFBheWxvYWRDcmVhdG9yLmFwcGx5KHZvaWQgMCwgYXJndW1lbnRzKTtcbiAgICB2YXIgYWN0aW9uID0ge1xuICAgICAgdHlwZTogdHlwZVxuICAgIH07XG5cbiAgICBpZiAocGF5bG9hZCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBhY3Rpb24uZXJyb3IgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChwYXlsb2FkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFjdGlvbi5wYXlsb2FkID0gcGF5bG9hZDtcbiAgICB9XG5cbiAgICBpZiAoaGFzTWV0YSkge1xuICAgICAgYWN0aW9uLm1ldGEgPSBtZXRhQ3JlYXRvci5hcHBseSh2b2lkIDAsIGFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjdGlvbjtcbiAgfTtcblxuICBhY3Rpb25DcmVhdG9yLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0eXBlU3RyaW5nO1xuICB9O1xuXG4gIHJldHVybiBhY3Rpb25DcmVhdG9yO1xufSIsImV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiAodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlO1xufSk7IiwiZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uICh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO1xufSk7IiwiZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uICh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT09IG51bGw7XG59KTsiLCIvKiogQSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgYSBwb3RlbnRpYWwgXCJleHRyYSBhcmd1bWVudFwiIHZhbHVlIHRvIGJlIGluamVjdGVkIGxhdGVyLFxyXG4gKiBhbmQgcmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGUgdGh1bmsgbWlkZGxld2FyZSB0aGF0IHVzZXMgdGhhdCB2YWx1ZVxyXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVRodW5rTWlkZGxld2FyZShleHRyYUFyZ3VtZW50KSB7XG4gIC8vIFN0YW5kYXJkIFJlZHV4IG1pZGRsZXdhcmUgZGVmaW5pdGlvbiBwYXR0ZXJuOlxuICAvLyBTZWU6IGh0dHBzOi8vcmVkdXguanMub3JnL3R1dG9yaWFscy9mdW5kYW1lbnRhbHMvcGFydC00LXN0b3JlI3dyaXRpbmctY3VzdG9tLW1pZGRsZXdhcmVcbiAgdmFyIG1pZGRsZXdhcmUgPSBmdW5jdGlvbiBtaWRkbGV3YXJlKF9yZWYpIHtcbiAgICB2YXIgZGlzcGF0Y2ggPSBfcmVmLmRpc3BhdGNoLFxuICAgICAgICBnZXRTdGF0ZSA9IF9yZWYuZ2V0U3RhdGU7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChuZXh0KSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGFjdGlvbikge1xuICAgICAgICAvLyBUaGUgdGh1bmsgbWlkZGxld2FyZSBsb29rcyBmb3IgYW55IGZ1bmN0aW9ucyB0aGF0IHdlcmUgcGFzc2VkIHRvIGBzdG9yZS5kaXNwYXRjaGAuXG4gICAgICAgIC8vIElmIHRoaXMgXCJhY3Rpb25cIiBpcyByZWFsbHkgYSBmdW5jdGlvbiwgY2FsbCBpdCBhbmQgcmV0dXJuIHRoZSByZXN1bHQuXG4gICAgICAgIGlmICh0eXBlb2YgYWN0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgLy8gSW5qZWN0IHRoZSBzdG9yZSdzIGBkaXNwYXRjaGAgYW5kIGBnZXRTdGF0ZWAgbWV0aG9kcywgYXMgd2VsbCBhcyBhbnkgXCJleHRyYSBhcmdcIlxuICAgICAgICAgIHJldHVybiBhY3Rpb24oZGlzcGF0Y2gsIGdldFN0YXRlLCBleHRyYUFyZ3VtZW50KTtcbiAgICAgICAgfSAvLyBPdGhlcndpc2UsIHBhc3MgdGhlIGFjdGlvbiBkb3duIHRoZSBtaWRkbGV3YXJlIGNoYWluIGFzIHVzdWFsXG5cblxuICAgICAgICByZXR1cm4gbmV4dChhY3Rpb24pO1xuICAgICAgfTtcbiAgICB9O1xuICB9O1xuXG4gIHJldHVybiBtaWRkbGV3YXJlO1xufVxuXG52YXIgdGh1bmsgPSBjcmVhdGVUaHVua01pZGRsZXdhcmUoKTsgLy8gQXR0YWNoIHRoZSBmYWN0b3J5IGZ1bmN0aW9uIHNvIHVzZXJzIGNhbiBjcmVhdGUgYSBjdXN0b21pemVkIHZlcnNpb25cbi8vIHdpdGggd2hhdGV2ZXIgXCJleHRyYSBhcmdcIiB0aGV5IHdhbnQgdG8gaW5qZWN0IGludG8gdGhlaXIgdGh1bmtzXG5cbnRodW5rLndpdGhFeHRyYUFyZ3VtZW50ID0gY3JlYXRlVGh1bmtNaWRkbGV3YXJlO1xuZXhwb3J0IGRlZmF1bHQgdGh1bms7IiwiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSAnQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMic7XG5cbi8qKlxuICogQWRhcHRlZCBmcm9tIFJlYWN0OiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvYmxvYi9tYXN0ZXIvcGFja2FnZXMvc2hhcmVkL2Zvcm1hdFByb2RFcnJvck1lc3NhZ2UuanNcbiAqXG4gKiBEbyBub3QgcmVxdWlyZSB0aGlzIG1vZHVsZSBkaXJlY3RseSEgVXNlIG5vcm1hbCB0aHJvdyBlcnJvciBjYWxscy4gVGhlc2UgbWVzc2FnZXMgd2lsbCBiZSByZXBsYWNlZCB3aXRoIGVycm9yIGNvZGVzXG4gKiBkdXJpbmcgYnVpbGQuXG4gKiBAcGFyYW0ge251bWJlcn0gY29kZVxuICovXG5mdW5jdGlvbiBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKGNvZGUpIHtcbiAgcmV0dXJuIFwiTWluaWZpZWQgUmVkdXggZXJyb3IgI1wiICsgY29kZSArIFwiOyB2aXNpdCBodHRwczovL3JlZHV4LmpzLm9yZy9FcnJvcnM/Y29kZT1cIiArIGNvZGUgKyBcIiBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciBcIiArICd1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzLiAnO1xufVxuXG4vLyBJbmxpbmVkIHZlcnNpb24gb2YgdGhlIGBzeW1ib2wtb2JzZXJ2YWJsZWAgcG9seWZpbGxcbnZhciAkJG9ic2VydmFibGUgPSAoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wub2JzZXJ2YWJsZSB8fCAnQEBvYnNlcnZhYmxlJztcbn0pKCk7XG5cbi8qKlxuICogVGhlc2UgYXJlIHByaXZhdGUgYWN0aW9uIHR5cGVzIHJlc2VydmVkIGJ5IFJlZHV4LlxuICogRm9yIGFueSB1bmtub3duIGFjdGlvbnMsIHlvdSBtdXN0IHJldHVybiB0aGUgY3VycmVudCBzdGF0ZS5cbiAqIElmIHRoZSBjdXJyZW50IHN0YXRlIGlzIHVuZGVmaW5lZCwgeW91IG11c3QgcmV0dXJuIHRoZSBpbml0aWFsIHN0YXRlLlxuICogRG8gbm90IHJlZmVyZW5jZSB0aGVzZSBhY3Rpb24gdHlwZXMgZGlyZWN0bHkgaW4geW91ciBjb2RlLlxuICovXG52YXIgcmFuZG9tU3RyaW5nID0gZnVuY3Rpb24gcmFuZG9tU3RyaW5nKCkge1xuICByZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDcpLnNwbGl0KCcnKS5qb2luKCcuJyk7XG59O1xuXG52YXIgQWN0aW9uVHlwZXMgPSB7XG4gIElOSVQ6IFwiQEByZWR1eC9JTklUXCIgKyByYW5kb21TdHJpbmcoKSxcbiAgUkVQTEFDRTogXCJAQHJlZHV4L1JFUExBQ0VcIiArIHJhbmRvbVN0cmluZygpLFxuICBQUk9CRV9VTktOT1dOX0FDVElPTjogZnVuY3Rpb24gUFJPQkVfVU5LTk9XTl9BQ1RJT04oKSB7XG4gICAgcmV0dXJuIFwiQEByZWR1eC9QUk9CRV9VTktOT1dOX0FDVElPTlwiICsgcmFuZG9tU3RyaW5nKCk7XG4gIH1cbn07XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IG9iaiBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgYXJndW1lbnQgYXBwZWFycyB0byBiZSBhIHBsYWluIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdChvYmopIHtcbiAgaWYgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnIHx8IG9iaiA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICB2YXIgcHJvdG8gPSBvYmo7XG5cbiAgd2hpbGUgKE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90bykgIT09IG51bGwpIHtcbiAgICBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90byk7XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaikgPT09IHByb3RvO1xufVxuXG4vLyBJbmxpbmVkIC8gc2hvcnRlbmVkIHZlcnNpb24gb2YgYGtpbmRPZmAgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9raW5kLW9mXG5mdW5jdGlvbiBtaW5pS2luZE9mKHZhbCkge1xuICBpZiAodmFsID09PSB2b2lkIDApIHJldHVybiAndW5kZWZpbmVkJztcbiAgaWYgKHZhbCA9PT0gbnVsbCkgcmV0dXJuICdudWxsJztcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsO1xuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICBjYXNlICdzeW1ib2wnOlxuICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgICB9XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSByZXR1cm4gJ2FycmF5JztcbiAgaWYgKGlzRGF0ZSh2YWwpKSByZXR1cm4gJ2RhdGUnO1xuICBpZiAoaXNFcnJvcih2YWwpKSByZXR1cm4gJ2Vycm9yJztcbiAgdmFyIGNvbnN0cnVjdG9yTmFtZSA9IGN0b3JOYW1lKHZhbCk7XG5cbiAgc3dpdGNoIChjb25zdHJ1Y3Rvck5hbWUpIHtcbiAgICBjYXNlICdTeW1ib2wnOlxuICAgIGNhc2UgJ1Byb21pc2UnOlxuICAgIGNhc2UgJ1dlYWtNYXAnOlxuICAgIGNhc2UgJ1dlYWtTZXQnOlxuICAgIGNhc2UgJ01hcCc6XG4gICAgY2FzZSAnU2V0JzpcbiAgICAgIHJldHVybiBjb25zdHJ1Y3Rvck5hbWU7XG4gIH0gLy8gb3RoZXJcblxuXG4gIHJldHVybiB0eXBlLnNsaWNlKDgsIC0xKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xccy9nLCAnJyk7XG59XG5cbmZ1bmN0aW9uIGN0b3JOYW1lKHZhbCkge1xuICByZXR1cm4gdHlwZW9mIHZhbC5jb25zdHJ1Y3RvciA9PT0gJ2Z1bmN0aW9uJyA/IHZhbC5jb25zdHJ1Y3Rvci5uYW1lIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gaXNFcnJvcih2YWwpIHtcbiAgcmV0dXJuIHZhbCBpbnN0YW5jZW9mIEVycm9yIHx8IHR5cGVvZiB2YWwubWVzc2FnZSA9PT0gJ3N0cmluZycgJiYgdmFsLmNvbnN0cnVjdG9yICYmIHR5cGVvZiB2YWwuY29uc3RydWN0b3Iuc3RhY2tUcmFjZUxpbWl0ID09PSAnbnVtYmVyJztcbn1cblxuZnVuY3Rpb24gaXNEYXRlKHZhbCkge1xuICBpZiAodmFsIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIHRydWU7XG4gIHJldHVybiB0eXBlb2YgdmFsLnRvRGF0ZVN0cmluZyA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdmFsLmdldERhdGUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHZhbC5zZXREYXRlID09PSAnZnVuY3Rpb24nO1xufVxuXG5mdW5jdGlvbiBraW5kT2YodmFsKSB7XG4gIHZhciB0eXBlT2ZWYWwgPSB0eXBlb2YgdmFsO1xuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgdHlwZU9mVmFsID0gbWluaUtpbmRPZih2YWwpO1xuICB9XG5cbiAgcmV0dXJuIHR5cGVPZlZhbDtcbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZFxuICpcbiAqICoqV2UgcmVjb21tZW5kIHVzaW5nIHRoZSBgY29uZmlndXJlU3RvcmVgIG1ldGhvZFxuICogb2YgdGhlIGBAcmVkdXhqcy90b29sa2l0YCBwYWNrYWdlKiosIHdoaWNoIHJlcGxhY2VzIGBjcmVhdGVTdG9yZWAuXG4gKlxuICogUmVkdXggVG9vbGtpdCBpcyBvdXIgcmVjb21tZW5kZWQgYXBwcm9hY2ggZm9yIHdyaXRpbmcgUmVkdXggbG9naWMgdG9kYXksXG4gKiBpbmNsdWRpbmcgc3RvcmUgc2V0dXAsIHJlZHVjZXJzLCBkYXRhIGZldGNoaW5nLCBhbmQgbW9yZS5cbiAqXG4gKiAqKkZvciBtb3JlIGRldGFpbHMsIHBsZWFzZSByZWFkIHRoaXMgUmVkdXggZG9jcyBwYWdlOioqXG4gKiAqKmh0dHBzOi8vcmVkdXguanMub3JnL2ludHJvZHVjdGlvbi93aHktcnRrLWlzLXJlZHV4LXRvZGF5KipcbiAqXG4gKiBgY29uZmlndXJlU3RvcmVgIGZyb20gUmVkdXggVG9vbGtpdCBpcyBhbiBpbXByb3ZlZCB2ZXJzaW9uIG9mIGBjcmVhdGVTdG9yZWAgdGhhdFxuICogc2ltcGxpZmllcyBzZXR1cCBhbmQgaGVscHMgYXZvaWQgY29tbW9uIGJ1Z3MuXG4gKlxuICogWW91IHNob3VsZCBub3QgYmUgdXNpbmcgdGhlIGByZWR1eGAgY29yZSBwYWNrYWdlIGJ5IGl0c2VsZiB0b2RheSwgZXhjZXB0IGZvciBsZWFybmluZyBwdXJwb3Nlcy5cbiAqIFRoZSBgY3JlYXRlU3RvcmVgIG1ldGhvZCBmcm9tIHRoZSBjb3JlIGByZWR1eGAgcGFja2FnZSB3aWxsIG5vdCBiZSByZW1vdmVkLCBidXQgd2UgZW5jb3VyYWdlXG4gKiBhbGwgdXNlcnMgdG8gbWlncmF0ZSB0byB1c2luZyBSZWR1eCBUb29sa2l0IGZvciBhbGwgUmVkdXggY29kZS5cbiAqXG4gKiBJZiB5b3Ugd2FudCB0byB1c2UgYGNyZWF0ZVN0b3JlYCB3aXRob3V0IHRoaXMgdmlzdWFsIGRlcHJlY2F0aW9uIHdhcm5pbmcsIHVzZVxuICogdGhlIGBsZWdhY3lfY3JlYXRlU3RvcmVgIGltcG9ydCBpbnN0ZWFkOlxuICpcbiAqIGBpbXBvcnQgeyBsZWdhY3lfY3JlYXRlU3RvcmUgYXMgY3JlYXRlU3RvcmV9IGZyb20gJ3JlZHV4J2BcbiAqXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlU3RvcmUocmVkdWNlciwgcHJlbG9hZGVkU3RhdGUsIGVuaGFuY2VyKSB7XG4gIHZhciBfcmVmMjtcblxuICBpZiAodHlwZW9mIHByZWxvYWRlZFN0YXRlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBlbmhhbmNlciA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgZW5oYW5jZXIgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGFyZ3VtZW50c1szXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDApIDogJ0l0IGxvb2tzIGxpa2UgeW91IGFyZSBwYXNzaW5nIHNldmVyYWwgc3RvcmUgZW5oYW5jZXJzIHRvICcgKyAnY3JlYXRlU3RvcmUoKS4gVGhpcyBpcyBub3Qgc3VwcG9ydGVkLiBJbnN0ZWFkLCBjb21wb3NlIHRoZW0gJyArICd0b2dldGhlciB0byBhIHNpbmdsZSBmdW5jdGlvbi4gU2VlIGh0dHBzOi8vcmVkdXguanMub3JnL3R1dG9yaWFscy9mdW5kYW1lbnRhbHMvcGFydC00LXN0b3JlI2NyZWF0aW5nLWEtc3RvcmUtd2l0aC1lbmhhbmNlcnMgZm9yIGFuIGV4YW1wbGUuJyk7XG4gIH1cblxuICBpZiAodHlwZW9mIHByZWxvYWRlZFN0YXRlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBlbmhhbmNlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBlbmhhbmNlciA9IHByZWxvYWRlZFN0YXRlO1xuICAgIHByZWxvYWRlZFN0YXRlID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBlbmhhbmNlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAodHlwZW9mIGVuaGFuY2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxKSA6IFwiRXhwZWN0ZWQgdGhlIGVuaGFuY2VyIHRvIGJlIGEgZnVuY3Rpb24uIEluc3RlYWQsIHJlY2VpdmVkOiAnXCIgKyBraW5kT2YoZW5oYW5jZXIpICsgXCInXCIpO1xuICAgIH1cblxuICAgIHJldHVybiBlbmhhbmNlcihjcmVhdGVTdG9yZSkocmVkdWNlciwgcHJlbG9hZGVkU3RhdGUpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiByZWR1Y2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMikgOiBcIkV4cGVjdGVkIHRoZSByb290IHJlZHVjZXIgdG8gYmUgYSBmdW5jdGlvbi4gSW5zdGVhZCwgcmVjZWl2ZWQ6ICdcIiArIGtpbmRPZihyZWR1Y2VyKSArIFwiJ1wiKTtcbiAgfVxuXG4gIHZhciBjdXJyZW50UmVkdWNlciA9IHJlZHVjZXI7XG4gIHZhciBjdXJyZW50U3RhdGUgPSBwcmVsb2FkZWRTdGF0ZTtcbiAgdmFyIGN1cnJlbnRMaXN0ZW5lcnMgPSBbXTtcbiAgdmFyIG5leHRMaXN0ZW5lcnMgPSBjdXJyZW50TGlzdGVuZXJzO1xuICB2YXIgaXNEaXNwYXRjaGluZyA9IGZhbHNlO1xuICAvKipcbiAgICogVGhpcyBtYWtlcyBhIHNoYWxsb3cgY29weSBvZiBjdXJyZW50TGlzdGVuZXJzIHNvIHdlIGNhbiB1c2VcbiAgICogbmV4dExpc3RlbmVycyBhcyBhIHRlbXBvcmFyeSBsaXN0IHdoaWxlIGRpc3BhdGNoaW5nLlxuICAgKlxuICAgKiBUaGlzIHByZXZlbnRzIGFueSBidWdzIGFyb3VuZCBjb25zdW1lcnMgY2FsbGluZ1xuICAgKiBzdWJzY3JpYmUvdW5zdWJzY3JpYmUgaW4gdGhlIG1pZGRsZSBvZiBhIGRpc3BhdGNoLlxuICAgKi9cblxuICBmdW5jdGlvbiBlbnN1cmVDYW5NdXRhdGVOZXh0TGlzdGVuZXJzKCkge1xuICAgIGlmIChuZXh0TGlzdGVuZXJzID09PSBjdXJyZW50TGlzdGVuZXJzKSB7XG4gICAgICBuZXh0TGlzdGVuZXJzID0gY3VycmVudExpc3RlbmVycy5zbGljZSgpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogUmVhZHMgdGhlIHN0YXRlIHRyZWUgbWFuYWdlZCBieSB0aGUgc3RvcmUuXG4gICAqXG4gICAqIEByZXR1cm5zIHthbnl9IFRoZSBjdXJyZW50IHN0YXRlIHRyZWUgb2YgeW91ciBhcHBsaWNhdGlvbi5cbiAgICovXG5cblxuICBmdW5jdGlvbiBnZXRTdGF0ZSgpIHtcbiAgICBpZiAoaXNEaXNwYXRjaGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMykgOiAnWW91IG1heSBub3QgY2FsbCBzdG9yZS5nZXRTdGF0ZSgpIHdoaWxlIHRoZSByZWR1Y2VyIGlzIGV4ZWN1dGluZy4gJyArICdUaGUgcmVkdWNlciBoYXMgYWxyZWFkeSByZWNlaXZlZCB0aGUgc3RhdGUgYXMgYW4gYXJndW1lbnQuICcgKyAnUGFzcyBpdCBkb3duIGZyb20gdGhlIHRvcCByZWR1Y2VyIGluc3RlYWQgb2YgcmVhZGluZyBpdCBmcm9tIHRoZSBzdG9yZS4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY3VycmVudFN0YXRlO1xuICB9XG4gIC8qKlxuICAgKiBBZGRzIGEgY2hhbmdlIGxpc3RlbmVyLiBJdCB3aWxsIGJlIGNhbGxlZCBhbnkgdGltZSBhbiBhY3Rpb24gaXMgZGlzcGF0Y2hlZCxcbiAgICogYW5kIHNvbWUgcGFydCBvZiB0aGUgc3RhdGUgdHJlZSBtYXkgcG90ZW50aWFsbHkgaGF2ZSBjaGFuZ2VkLiBZb3UgbWF5IHRoZW5cbiAgICogY2FsbCBgZ2V0U3RhdGUoKWAgdG8gcmVhZCB0aGUgY3VycmVudCBzdGF0ZSB0cmVlIGluc2lkZSB0aGUgY2FsbGJhY2suXG4gICAqXG4gICAqIFlvdSBtYXkgY2FsbCBgZGlzcGF0Y2goKWAgZnJvbSBhIGNoYW5nZSBsaXN0ZW5lciwgd2l0aCB0aGUgZm9sbG93aW5nXG4gICAqIGNhdmVhdHM6XG4gICAqXG4gICAqIDEuIFRoZSBzdWJzY3JpcHRpb25zIGFyZSBzbmFwc2hvdHRlZCBqdXN0IGJlZm9yZSBldmVyeSBgZGlzcGF0Y2goKWAgY2FsbC5cbiAgICogSWYgeW91IHN1YnNjcmliZSBvciB1bnN1YnNjcmliZSB3aGlsZSB0aGUgbGlzdGVuZXJzIGFyZSBiZWluZyBpbnZva2VkLCB0aGlzXG4gICAqIHdpbGwgbm90IGhhdmUgYW55IGVmZmVjdCBvbiB0aGUgYGRpc3BhdGNoKClgIHRoYXQgaXMgY3VycmVudGx5IGluIHByb2dyZXNzLlxuICAgKiBIb3dldmVyLCB0aGUgbmV4dCBgZGlzcGF0Y2goKWAgY2FsbCwgd2hldGhlciBuZXN0ZWQgb3Igbm90LCB3aWxsIHVzZSBhIG1vcmVcbiAgICogcmVjZW50IHNuYXBzaG90IG9mIHRoZSBzdWJzY3JpcHRpb24gbGlzdC5cbiAgICpcbiAgICogMi4gVGhlIGxpc3RlbmVyIHNob3VsZCBub3QgZXhwZWN0IHRvIHNlZSBhbGwgc3RhdGUgY2hhbmdlcywgYXMgdGhlIHN0YXRlXG4gICAqIG1pZ2h0IGhhdmUgYmVlbiB1cGRhdGVkIG11bHRpcGxlIHRpbWVzIGR1cmluZyBhIG5lc3RlZCBgZGlzcGF0Y2goKWAgYmVmb3JlXG4gICAqIHRoZSBsaXN0ZW5lciBpcyBjYWxsZWQuIEl0IGlzLCBob3dldmVyLCBndWFyYW50ZWVkIHRoYXQgYWxsIHN1YnNjcmliZXJzXG4gICAqIHJlZ2lzdGVyZWQgYmVmb3JlIHRoZSBgZGlzcGF0Y2goKWAgc3RhcnRlZCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBsYXRlc3RcbiAgICogc3RhdGUgYnkgdGhlIHRpbWUgaXQgZXhpdHMuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIEEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCBvbiBldmVyeSBkaXNwYXRjaC5cbiAgICogQHJldHVybnMge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIHRvIHJlbW92ZSB0aGlzIGNoYW5nZSBsaXN0ZW5lci5cbiAgICovXG5cblxuICBmdW5jdGlvbiBzdWJzY3JpYmUobGlzdGVuZXIpIHtcbiAgICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg0KSA6IFwiRXhwZWN0ZWQgdGhlIGxpc3RlbmVyIHRvIGJlIGEgZnVuY3Rpb24uIEluc3RlYWQsIHJlY2VpdmVkOiAnXCIgKyBraW5kT2YobGlzdGVuZXIpICsgXCInXCIpO1xuICAgIH1cblxuICAgIGlmIChpc0Rpc3BhdGNoaW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg1KSA6ICdZb3UgbWF5IG5vdCBjYWxsIHN0b3JlLnN1YnNjcmliZSgpIHdoaWxlIHRoZSByZWR1Y2VyIGlzIGV4ZWN1dGluZy4gJyArICdJZiB5b3Ugd291bGQgbGlrZSB0byBiZSBub3RpZmllZCBhZnRlciB0aGUgc3RvcmUgaGFzIGJlZW4gdXBkYXRlZCwgc3Vic2NyaWJlIGZyb20gYSAnICsgJ2NvbXBvbmVudCBhbmQgaW52b2tlIHN0b3JlLmdldFN0YXRlKCkgaW4gdGhlIGNhbGxiYWNrIHRvIGFjY2VzcyB0aGUgbGF0ZXN0IHN0YXRlLiAnICsgJ1NlZSBodHRwczovL3JlZHV4LmpzLm9yZy9hcGkvc3RvcmUjc3Vic2NyaWJlbGlzdGVuZXIgZm9yIG1vcmUgZGV0YWlscy4nKTtcbiAgICB9XG5cbiAgICB2YXIgaXNTdWJzY3JpYmVkID0gdHJ1ZTtcbiAgICBlbnN1cmVDYW5NdXRhdGVOZXh0TGlzdGVuZXJzKCk7XG4gICAgbmV4dExpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gdW5zdWJzY3JpYmUoKSB7XG4gICAgICBpZiAoIWlzU3Vic2NyaWJlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0Rpc3BhdGNoaW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDYpIDogJ1lvdSBtYXkgbm90IHVuc3Vic2NyaWJlIGZyb20gYSBzdG9yZSBsaXN0ZW5lciB3aGlsZSB0aGUgcmVkdWNlciBpcyBleGVjdXRpbmcuICcgKyAnU2VlIGh0dHBzOi8vcmVkdXguanMub3JnL2FwaS9zdG9yZSNzdWJzY3JpYmVsaXN0ZW5lciBmb3IgbW9yZSBkZXRhaWxzLicpO1xuICAgICAgfVxuXG4gICAgICBpc1N1YnNjcmliZWQgPSBmYWxzZTtcbiAgICAgIGVuc3VyZUNhbk11dGF0ZU5leHRMaXN0ZW5lcnMoKTtcbiAgICAgIHZhciBpbmRleCA9IG5leHRMaXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG4gICAgICBuZXh0TGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICBjdXJyZW50TGlzdGVuZXJzID0gbnVsbDtcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBEaXNwYXRjaGVzIGFuIGFjdGlvbi4gSXQgaXMgdGhlIG9ubHkgd2F5IHRvIHRyaWdnZXIgYSBzdGF0ZSBjaGFuZ2UuXG4gICAqXG4gICAqIFRoZSBgcmVkdWNlcmAgZnVuY3Rpb24sIHVzZWQgdG8gY3JlYXRlIHRoZSBzdG9yZSwgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGVcbiAgICogY3VycmVudCBzdGF0ZSB0cmVlIGFuZCB0aGUgZ2l2ZW4gYGFjdGlvbmAuIEl0cyByZXR1cm4gdmFsdWUgd2lsbFxuICAgKiBiZSBjb25zaWRlcmVkIHRoZSAqKm5leHQqKiBzdGF0ZSBvZiB0aGUgdHJlZSwgYW5kIHRoZSBjaGFuZ2UgbGlzdGVuZXJzXG4gICAqIHdpbGwgYmUgbm90aWZpZWQuXG4gICAqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9ubHkgc3VwcG9ydHMgcGxhaW4gb2JqZWN0IGFjdGlvbnMuIElmIHlvdSB3YW50IHRvXG4gICAqIGRpc3BhdGNoIGEgUHJvbWlzZSwgYW4gT2JzZXJ2YWJsZSwgYSB0aHVuaywgb3Igc29tZXRoaW5nIGVsc2UsIHlvdSBuZWVkIHRvXG4gICAqIHdyYXAgeW91ciBzdG9yZSBjcmVhdGluZyBmdW5jdGlvbiBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIG1pZGRsZXdhcmUuIEZvclxuICAgKiBleGFtcGxlLCBzZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBgcmVkdXgtdGh1bmtgIHBhY2thZ2UuIEV2ZW4gdGhlXG4gICAqIG1pZGRsZXdhcmUgd2lsbCBldmVudHVhbGx5IGRpc3BhdGNoIHBsYWluIG9iamVjdCBhY3Rpb25zIHVzaW5nIHRoaXMgbWV0aG9kLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gYWN0aW9uIEEgcGxhaW4gb2JqZWN0IHJlcHJlc2VudGluZyDigJx3aGF0IGNoYW5nZWTigJ0uIEl0IGlzXG4gICAqIGEgZ29vZCBpZGVhIHRvIGtlZXAgYWN0aW9ucyBzZXJpYWxpemFibGUgc28geW91IGNhbiByZWNvcmQgYW5kIHJlcGxheSB1c2VyXG4gICAqIHNlc3Npb25zLCBvciB1c2UgdGhlIHRpbWUgdHJhdmVsbGluZyBgcmVkdXgtZGV2dG9vbHNgLiBBbiBhY3Rpb24gbXVzdCBoYXZlXG4gICAqIGEgYHR5cGVgIHByb3BlcnR5IHdoaWNoIG1heSBub3QgYmUgYHVuZGVmaW5lZGAuIEl0IGlzIGEgZ29vZCBpZGVhIHRvIHVzZVxuICAgKiBzdHJpbmcgY29uc3RhbnRzIGZvciBhY3Rpb24gdHlwZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IEZvciBjb252ZW5pZW5jZSwgdGhlIHNhbWUgYWN0aW9uIG9iamVjdCB5b3UgZGlzcGF0Y2hlZC5cbiAgICpcbiAgICogTm90ZSB0aGF0LCBpZiB5b3UgdXNlIGEgY3VzdG9tIG1pZGRsZXdhcmUsIGl0IG1heSB3cmFwIGBkaXNwYXRjaCgpYCB0b1xuICAgKiByZXR1cm4gc29tZXRoaW5nIGVsc2UgKGZvciBleGFtcGxlLCBhIFByb21pc2UgeW91IGNhbiBhd2FpdCkuXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gZGlzcGF0Y2goYWN0aW9uKSB7XG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KGFjdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDcpIDogXCJBY3Rpb25zIG11c3QgYmUgcGxhaW4gb2JqZWN0cy4gSW5zdGVhZCwgdGhlIGFjdHVhbCB0eXBlIHdhczogJ1wiICsga2luZE9mKGFjdGlvbikgKyBcIicuIFlvdSBtYXkgbmVlZCB0byBhZGQgbWlkZGxld2FyZSB0byB5b3VyIHN0b3JlIHNldHVwIHRvIGhhbmRsZSBkaXNwYXRjaGluZyBvdGhlciB2YWx1ZXMsIHN1Y2ggYXMgJ3JlZHV4LXRodW5rJyB0byBoYW5kbGUgZGlzcGF0Y2hpbmcgZnVuY3Rpb25zLiBTZWUgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvdHV0b3JpYWxzL2Z1bmRhbWVudGFscy9wYXJ0LTQtc3RvcmUjbWlkZGxld2FyZSBhbmQgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvdHV0b3JpYWxzL2Z1bmRhbWVudGFscy9wYXJ0LTYtYXN5bmMtbG9naWMjdXNpbmctdGhlLXJlZHV4LXRodW5rLW1pZGRsZXdhcmUgZm9yIGV4YW1wbGVzLlwiKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGFjdGlvbi50eXBlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoOCkgOiAnQWN0aW9ucyBtYXkgbm90IGhhdmUgYW4gdW5kZWZpbmVkIFwidHlwZVwiIHByb3BlcnR5LiBZb3UgbWF5IGhhdmUgbWlzc3BlbGxlZCBhbiBhY3Rpb24gdHlwZSBzdHJpbmcgY29uc3RhbnQuJyk7XG4gICAgfVxuXG4gICAgaWYgKGlzRGlzcGF0Y2hpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDkpIDogJ1JlZHVjZXJzIG1heSBub3QgZGlzcGF0Y2ggYWN0aW9ucy4nKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgaXNEaXNwYXRjaGluZyA9IHRydWU7XG4gICAgICBjdXJyZW50U3RhdGUgPSBjdXJyZW50UmVkdWNlcihjdXJyZW50U3RhdGUsIGFjdGlvbik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlzRGlzcGF0Y2hpbmcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgbGlzdGVuZXJzID0gY3VycmVudExpc3RlbmVycyA9IG5leHRMaXN0ZW5lcnM7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGxpc3RlbmVyID0gbGlzdGVuZXJzW2ldO1xuICAgICAgbGlzdGVuZXIoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWN0aW9uO1xuICB9XG4gIC8qKlxuICAgKiBSZXBsYWNlcyB0aGUgcmVkdWNlciBjdXJyZW50bHkgdXNlZCBieSB0aGUgc3RvcmUgdG8gY2FsY3VsYXRlIHRoZSBzdGF0ZS5cbiAgICpcbiAgICogWW91IG1pZ2h0IG5lZWQgdGhpcyBpZiB5b3VyIGFwcCBpbXBsZW1lbnRzIGNvZGUgc3BsaXR0aW5nIGFuZCB5b3Ugd2FudCB0b1xuICAgKiBsb2FkIHNvbWUgb2YgdGhlIHJlZHVjZXJzIGR5bmFtaWNhbGx5LiBZb3UgbWlnaHQgYWxzbyBuZWVkIHRoaXMgaWYgeW91XG4gICAqIGltcGxlbWVudCBhIGhvdCByZWxvYWRpbmcgbWVjaGFuaXNtIGZvciBSZWR1eC5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbmV4dFJlZHVjZXIgVGhlIHJlZHVjZXIgZm9yIHRoZSBzdG9yZSB0byB1c2UgaW5zdGVhZC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gcmVwbGFjZVJlZHVjZXIobmV4dFJlZHVjZXIpIHtcbiAgICBpZiAodHlwZW9mIG5leHRSZWR1Y2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxMCkgOiBcIkV4cGVjdGVkIHRoZSBuZXh0UmVkdWNlciB0byBiZSBhIGZ1bmN0aW9uLiBJbnN0ZWFkLCByZWNlaXZlZDogJ1wiICsga2luZE9mKG5leHRSZWR1Y2VyKSk7XG4gICAgfVxuXG4gICAgY3VycmVudFJlZHVjZXIgPSBuZXh0UmVkdWNlcjsgLy8gVGhpcyBhY3Rpb24gaGFzIGEgc2ltaWxpYXIgZWZmZWN0IHRvIEFjdGlvblR5cGVzLklOSVQuXG4gICAgLy8gQW55IHJlZHVjZXJzIHRoYXQgZXhpc3RlZCBpbiBib3RoIHRoZSBuZXcgYW5kIG9sZCByb290UmVkdWNlclxuICAgIC8vIHdpbGwgcmVjZWl2ZSB0aGUgcHJldmlvdXMgc3RhdGUuIFRoaXMgZWZmZWN0aXZlbHkgcG9wdWxhdGVzXG4gICAgLy8gdGhlIG5ldyBzdGF0ZSB0cmVlIHdpdGggYW55IHJlbGV2YW50IGRhdGEgZnJvbSB0aGUgb2xkIG9uZS5cblxuICAgIGRpc3BhdGNoKHtcbiAgICAgIHR5cGU6IEFjdGlvblR5cGVzLlJFUExBQ0VcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogSW50ZXJvcGVyYWJpbGl0eSBwb2ludCBmb3Igb2JzZXJ2YWJsZS9yZWFjdGl2ZSBsaWJyYXJpZXMuXG4gICAqIEByZXR1cm5zIHtvYnNlcnZhYmxlfSBBIG1pbmltYWwgb2JzZXJ2YWJsZSBvZiBzdGF0ZSBjaGFuZ2VzLlxuICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBvYnNlcnZhYmxlIHByb3Bvc2FsOlxuICAgKiBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1vYnNlcnZhYmxlXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gb2JzZXJ2YWJsZSgpIHtcbiAgICB2YXIgX3JlZjtcblxuICAgIHZhciBvdXRlclN1YnNjcmliZSA9IHN1YnNjcmliZTtcbiAgICByZXR1cm4gX3JlZiA9IHtcbiAgICAgIC8qKlxuICAgICAgICogVGhlIG1pbmltYWwgb2JzZXJ2YWJsZSBzdWJzY3JpcHRpb24gbWV0aG9kLlxuICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9ic2VydmVyIEFueSBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCBhcyBhbiBvYnNlcnZlci5cbiAgICAgICAqIFRoZSBvYnNlcnZlciBvYmplY3Qgc2hvdWxkIGhhdmUgYSBgbmV4dGAgbWV0aG9kLlxuICAgICAgICogQHJldHVybnMge3N1YnNjcmlwdGlvbn0gQW4gb2JqZWN0IHdpdGggYW4gYHVuc3Vic2NyaWJlYCBtZXRob2QgdGhhdCBjYW5cbiAgICAgICAqIGJlIHVzZWQgdG8gdW5zdWJzY3JpYmUgdGhlIG9ic2VydmFibGUgZnJvbSB0aGUgc3RvcmUsIGFuZCBwcmV2ZW50IGZ1cnRoZXJcbiAgICAgICAqIGVtaXNzaW9uIG9mIHZhbHVlcyBmcm9tIHRoZSBvYnNlcnZhYmxlLlxuICAgICAgICovXG4gICAgICBzdWJzY3JpYmU6IGZ1bmN0aW9uIHN1YnNjcmliZShvYnNlcnZlcikge1xuICAgICAgICBpZiAodHlwZW9mIG9ic2VydmVyICE9PSAnb2JqZWN0JyB8fCBvYnNlcnZlciA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDExKSA6IFwiRXhwZWN0ZWQgdGhlIG9ic2VydmVyIHRvIGJlIGFuIG9iamVjdC4gSW5zdGVhZCwgcmVjZWl2ZWQ6ICdcIiArIGtpbmRPZihvYnNlcnZlcikgKyBcIidcIik7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBvYnNlcnZlU3RhdGUoKSB7XG4gICAgICAgICAgaWYgKG9ic2VydmVyLm5leHQpIHtcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQoZ2V0U3RhdGUoKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgb2JzZXJ2ZVN0YXRlKCk7XG4gICAgICAgIHZhciB1bnN1YnNjcmliZSA9IG91dGVyU3Vic2NyaWJlKG9ic2VydmVTdGF0ZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdW5zdWJzY3JpYmU6IHVuc3Vic2NyaWJlXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSwgX3JlZlskJG9ic2VydmFibGVdID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSwgX3JlZjtcbiAgfSAvLyBXaGVuIGEgc3RvcmUgaXMgY3JlYXRlZCwgYW4gXCJJTklUXCIgYWN0aW9uIGlzIGRpc3BhdGNoZWQgc28gdGhhdCBldmVyeVxuICAvLyByZWR1Y2VyIHJldHVybnMgdGhlaXIgaW5pdGlhbCBzdGF0ZS4gVGhpcyBlZmZlY3RpdmVseSBwb3B1bGF0ZXNcbiAgLy8gdGhlIGluaXRpYWwgc3RhdGUgdHJlZS5cblxuXG4gIGRpc3BhdGNoKHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5JTklUXG4gIH0pO1xuICByZXR1cm4gX3JlZjIgPSB7XG4gICAgZGlzcGF0Y2g6IGRpc3BhdGNoLFxuICAgIHN1YnNjcmliZTogc3Vic2NyaWJlLFxuICAgIGdldFN0YXRlOiBnZXRTdGF0ZSxcbiAgICByZXBsYWNlUmVkdWNlcjogcmVwbGFjZVJlZHVjZXJcbiAgfSwgX3JlZjJbJCRvYnNlcnZhYmxlXSA9IG9ic2VydmFibGUsIF9yZWYyO1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgUmVkdXggc3RvcmUgdGhhdCBob2xkcyB0aGUgc3RhdGUgdHJlZS5cbiAqXG4gKiAqKldlIHJlY29tbWVuZCB1c2luZyBgY29uZmlndXJlU3RvcmVgIGZyb20gdGhlXG4gKiBgQHJlZHV4anMvdG9vbGtpdGAgcGFja2FnZSoqLCB3aGljaCByZXBsYWNlcyBgY3JlYXRlU3RvcmVgOlxuICogKipodHRwczovL3JlZHV4LmpzLm9yZy9pbnRyb2R1Y3Rpb24vd2h5LXJ0ay1pcy1yZWR1eC10b2RheSoqXG4gKlxuICogVGhlIG9ubHkgd2F5IHRvIGNoYW5nZSB0aGUgZGF0YSBpbiB0aGUgc3RvcmUgaXMgdG8gY2FsbCBgZGlzcGF0Y2goKWAgb24gaXQuXG4gKlxuICogVGhlcmUgc2hvdWxkIG9ubHkgYmUgYSBzaW5nbGUgc3RvcmUgaW4geW91ciBhcHAuIFRvIHNwZWNpZnkgaG93IGRpZmZlcmVudFxuICogcGFydHMgb2YgdGhlIHN0YXRlIHRyZWUgcmVzcG9uZCB0byBhY3Rpb25zLCB5b3UgbWF5IGNvbWJpbmUgc2V2ZXJhbCByZWR1Y2Vyc1xuICogaW50byBhIHNpbmdsZSByZWR1Y2VyIGZ1bmN0aW9uIGJ5IHVzaW5nIGBjb21iaW5lUmVkdWNlcnNgLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHJlZHVjZXIgQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIG5leHQgc3RhdGUgdHJlZSwgZ2l2ZW5cbiAqIHRoZSBjdXJyZW50IHN0YXRlIHRyZWUgYW5kIHRoZSBhY3Rpb24gdG8gaGFuZGxlLlxuICpcbiAqIEBwYXJhbSB7YW55fSBbcHJlbG9hZGVkU3RhdGVdIFRoZSBpbml0aWFsIHN0YXRlLiBZb3UgbWF5IG9wdGlvbmFsbHkgc3BlY2lmeSBpdFxuICogdG8gaHlkcmF0ZSB0aGUgc3RhdGUgZnJvbSB0aGUgc2VydmVyIGluIHVuaXZlcnNhbCBhcHBzLCBvciB0byByZXN0b3JlIGFcbiAqIHByZXZpb3VzbHkgc2VyaWFsaXplZCB1c2VyIHNlc3Npb24uXG4gKiBJZiB5b3UgdXNlIGBjb21iaW5lUmVkdWNlcnNgIHRvIHByb2R1Y2UgdGhlIHJvb3QgcmVkdWNlciBmdW5jdGlvbiwgdGhpcyBtdXN0IGJlXG4gKiBhbiBvYmplY3Qgd2l0aCB0aGUgc2FtZSBzaGFwZSBhcyBgY29tYmluZVJlZHVjZXJzYCBrZXlzLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtlbmhhbmNlcl0gVGhlIHN0b3JlIGVuaGFuY2VyLiBZb3UgbWF5IG9wdGlvbmFsbHkgc3BlY2lmeSBpdFxuICogdG8gZW5oYW5jZSB0aGUgc3RvcmUgd2l0aCB0aGlyZC1wYXJ0eSBjYXBhYmlsaXRpZXMgc3VjaCBhcyBtaWRkbGV3YXJlLFxuICogdGltZSB0cmF2ZWwsIHBlcnNpc3RlbmNlLCBldGMuIFRoZSBvbmx5IHN0b3JlIGVuaGFuY2VyIHRoYXQgc2hpcHMgd2l0aCBSZWR1eFxuICogaXMgYGFwcGx5TWlkZGxld2FyZSgpYC5cbiAqXG4gKiBAcmV0dXJucyB7U3RvcmV9IEEgUmVkdXggc3RvcmUgdGhhdCBsZXRzIHlvdSByZWFkIHRoZSBzdGF0ZSwgZGlzcGF0Y2ggYWN0aW9uc1xuICogYW5kIHN1YnNjcmliZSB0byBjaGFuZ2VzLlxuICovXG5cbnZhciBsZWdhY3lfY3JlYXRlU3RvcmUgPSBjcmVhdGVTdG9yZTtcblxuLyoqXG4gKiBQcmludHMgYSB3YXJuaW5nIGluIHRoZSBjb25zb2xlIGlmIGl0IGV4aXN0cy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBUaGUgd2FybmluZyBtZXNzYWdlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHdhcm5pbmcobWVzc2FnZSkge1xuICAvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG4gIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNvbnNvbGUuZXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICB9XG4gIC8qIGVzbGludC1lbmFibGUgbm8tY29uc29sZSAqL1xuXG5cbiAgdHJ5IHtcbiAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IGlmIHlvdSBlbmFibGVcbiAgICAvLyBcImJyZWFrIG9uIGFsbCBleGNlcHRpb25zXCIgaW4geW91ciBjb25zb2xlLFxuICAgIC8vIGl0IHdvdWxkIHBhdXNlIHRoZSBleGVjdXRpb24gYXQgdGhpcyBsaW5lLlxuICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgfSBjYXRjaCAoZSkge30gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1lbXB0eVxuXG59XG5cbmZ1bmN0aW9uIGdldFVuZXhwZWN0ZWRTdGF0ZVNoYXBlV2FybmluZ01lc3NhZ2UoaW5wdXRTdGF0ZSwgcmVkdWNlcnMsIGFjdGlvbiwgdW5leHBlY3RlZEtleUNhY2hlKSB7XG4gIHZhciByZWR1Y2VyS2V5cyA9IE9iamVjdC5rZXlzKHJlZHVjZXJzKTtcbiAgdmFyIGFyZ3VtZW50TmFtZSA9IGFjdGlvbiAmJiBhY3Rpb24udHlwZSA9PT0gQWN0aW9uVHlwZXMuSU5JVCA/ICdwcmVsb2FkZWRTdGF0ZSBhcmd1bWVudCBwYXNzZWQgdG8gY3JlYXRlU3RvcmUnIDogJ3ByZXZpb3VzIHN0YXRlIHJlY2VpdmVkIGJ5IHRoZSByZWR1Y2VyJztcblxuICBpZiAocmVkdWNlcktleXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuICdTdG9yZSBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgcmVkdWNlci4gTWFrZSBzdXJlIHRoZSBhcmd1bWVudCBwYXNzZWQgJyArICd0byBjb21iaW5lUmVkdWNlcnMgaXMgYW4gb2JqZWN0IHdob3NlIHZhbHVlcyBhcmUgcmVkdWNlcnMuJztcbiAgfVxuXG4gIGlmICghaXNQbGFpbk9iamVjdChpbnB1dFN0YXRlKSkge1xuICAgIHJldHVybiBcIlRoZSBcIiArIGFyZ3VtZW50TmFtZSArIFwiIGhhcyB1bmV4cGVjdGVkIHR5cGUgb2YgXFxcIlwiICsga2luZE9mKGlucHV0U3RhdGUpICsgXCJcXFwiLiBFeHBlY3RlZCBhcmd1bWVudCB0byBiZSBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIFwiICsgKFwia2V5czogXFxcIlwiICsgcmVkdWNlcktleXMuam9pbignXCIsIFwiJykgKyBcIlxcXCJcIik7XG4gIH1cblxuICB2YXIgdW5leHBlY3RlZEtleXMgPSBPYmplY3Qua2V5cyhpbnB1dFN0YXRlKS5maWx0ZXIoZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiAhcmVkdWNlcnMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAhdW5leHBlY3RlZEtleUNhY2hlW2tleV07XG4gIH0pO1xuICB1bmV4cGVjdGVkS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICB1bmV4cGVjdGVkS2V5Q2FjaGVba2V5XSA9IHRydWU7XG4gIH0pO1xuICBpZiAoYWN0aW9uICYmIGFjdGlvbi50eXBlID09PSBBY3Rpb25UeXBlcy5SRVBMQUNFKSByZXR1cm47XG5cbiAgaWYgKHVuZXhwZWN0ZWRLZXlzLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gXCJVbmV4cGVjdGVkIFwiICsgKHVuZXhwZWN0ZWRLZXlzLmxlbmd0aCA+IDEgPyAna2V5cycgOiAna2V5JykgKyBcIiBcIiArIChcIlxcXCJcIiArIHVuZXhwZWN0ZWRLZXlzLmpvaW4oJ1wiLCBcIicpICsgXCJcXFwiIGZvdW5kIGluIFwiICsgYXJndW1lbnROYW1lICsgXCIuIFwiKSArIFwiRXhwZWN0ZWQgdG8gZmluZCBvbmUgb2YgdGhlIGtub3duIHJlZHVjZXIga2V5cyBpbnN0ZWFkOiBcIiArIChcIlxcXCJcIiArIHJlZHVjZXJLZXlzLmpvaW4oJ1wiLCBcIicpICsgXCJcXFwiLiBVbmV4cGVjdGVkIGtleXMgd2lsbCBiZSBpZ25vcmVkLlwiKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlcnRSZWR1Y2VyU2hhcGUocmVkdWNlcnMpIHtcbiAgT2JqZWN0LmtleXMocmVkdWNlcnMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciByZWR1Y2VyID0gcmVkdWNlcnNba2V5XTtcbiAgICB2YXIgaW5pdGlhbFN0YXRlID0gcmVkdWNlcih1bmRlZmluZWQsIHtcbiAgICAgIHR5cGU6IEFjdGlvblR5cGVzLklOSVRcbiAgICB9KTtcblxuICAgIGlmICh0eXBlb2YgaW5pdGlhbFN0YXRlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTIpIDogXCJUaGUgc2xpY2UgcmVkdWNlciBmb3Iga2V5IFxcXCJcIiArIGtleSArIFwiXFxcIiByZXR1cm5lZCB1bmRlZmluZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uLiBcIiArIFwiSWYgdGhlIHN0YXRlIHBhc3NlZCB0byB0aGUgcmVkdWNlciBpcyB1bmRlZmluZWQsIHlvdSBtdXN0IFwiICsgXCJleHBsaWNpdGx5IHJldHVybiB0aGUgaW5pdGlhbCBzdGF0ZS4gVGhlIGluaXRpYWwgc3RhdGUgbWF5IFwiICsgXCJub3QgYmUgdW5kZWZpbmVkLiBJZiB5b3UgZG9uJ3Qgd2FudCB0byBzZXQgYSB2YWx1ZSBmb3IgdGhpcyByZWR1Y2VyLCBcIiArIFwieW91IGNhbiB1c2UgbnVsbCBpbnN0ZWFkIG9mIHVuZGVmaW5lZC5cIik7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiByZWR1Y2VyKHVuZGVmaW5lZCwge1xuICAgICAgdHlwZTogQWN0aW9uVHlwZXMuUFJPQkVfVU5LTk9XTl9BQ1RJT04oKVxuICAgIH0pID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTMpIDogXCJUaGUgc2xpY2UgcmVkdWNlciBmb3Iga2V5IFxcXCJcIiArIGtleSArIFwiXFxcIiByZXR1cm5lZCB1bmRlZmluZWQgd2hlbiBwcm9iZWQgd2l0aCBhIHJhbmRvbSB0eXBlLiBcIiArIChcIkRvbid0IHRyeSB0byBoYW5kbGUgJ1wiICsgQWN0aW9uVHlwZXMuSU5JVCArIFwiJyBvciBvdGhlciBhY3Rpb25zIGluIFxcXCJyZWR1eC8qXFxcIiBcIikgKyBcIm5hbWVzcGFjZS4gVGhleSBhcmUgY29uc2lkZXJlZCBwcml2YXRlLiBJbnN0ZWFkLCB5b3UgbXVzdCByZXR1cm4gdGhlIFwiICsgXCJjdXJyZW50IHN0YXRlIGZvciBhbnkgdW5rbm93biBhY3Rpb25zLCB1bmxlc3MgaXQgaXMgdW5kZWZpbmVkLCBcIiArIFwiaW4gd2hpY2ggY2FzZSB5b3UgbXVzdCByZXR1cm4gdGhlIGluaXRpYWwgc3RhdGUsIHJlZ2FyZGxlc3Mgb2YgdGhlIFwiICsgXCJhY3Rpb24gdHlwZS4gVGhlIGluaXRpYWwgc3RhdGUgbWF5IG5vdCBiZSB1bmRlZmluZWQsIGJ1dCBjYW4gYmUgbnVsbC5cIik7XG4gICAgfVxuICB9KTtcbn1cbi8qKlxuICogVHVybnMgYW4gb2JqZWN0IHdob3NlIHZhbHVlcyBhcmUgZGlmZmVyZW50IHJlZHVjZXIgZnVuY3Rpb25zLCBpbnRvIGEgc2luZ2xlXG4gKiByZWR1Y2VyIGZ1bmN0aW9uLiBJdCB3aWxsIGNhbGwgZXZlcnkgY2hpbGQgcmVkdWNlciwgYW5kIGdhdGhlciB0aGVpciByZXN1bHRzXG4gKiBpbnRvIGEgc2luZ2xlIHN0YXRlIG9iamVjdCwgd2hvc2Uga2V5cyBjb3JyZXNwb25kIHRvIHRoZSBrZXlzIG9mIHRoZSBwYXNzZWRcbiAqIHJlZHVjZXIgZnVuY3Rpb25zLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSByZWR1Y2VycyBBbiBvYmplY3Qgd2hvc2UgdmFsdWVzIGNvcnJlc3BvbmQgdG8gZGlmZmVyZW50XG4gKiByZWR1Y2VyIGZ1bmN0aW9ucyB0aGF0IG5lZWQgdG8gYmUgY29tYmluZWQgaW50byBvbmUuIE9uZSBoYW5keSB3YXkgdG8gb2J0YWluXG4gKiBpdCBpcyB0byB1c2UgRVM2IGBpbXBvcnQgKiBhcyByZWR1Y2Vyc2Agc3ludGF4LiBUaGUgcmVkdWNlcnMgbWF5IG5ldmVyIHJldHVyblxuICogdW5kZWZpbmVkIGZvciBhbnkgYWN0aW9uLiBJbnN0ZWFkLCB0aGV5IHNob3VsZCByZXR1cm4gdGhlaXIgaW5pdGlhbCBzdGF0ZVxuICogaWYgdGhlIHN0YXRlIHBhc3NlZCB0byB0aGVtIHdhcyB1bmRlZmluZWQsIGFuZCB0aGUgY3VycmVudCBzdGF0ZSBmb3IgYW55XG4gKiB1bnJlY29nbml6ZWQgYWN0aW9uLlxuICpcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSByZWR1Y2VyIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBldmVyeSByZWR1Y2VyIGluc2lkZSB0aGVcbiAqIHBhc3NlZCBvYmplY3QsIGFuZCBidWlsZHMgYSBzdGF0ZSBvYmplY3Qgd2l0aCB0aGUgc2FtZSBzaGFwZS5cbiAqL1xuXG5cbmZ1bmN0aW9uIGNvbWJpbmVSZWR1Y2VycyhyZWR1Y2Vycykge1xuICB2YXIgcmVkdWNlcktleXMgPSBPYmplY3Qua2V5cyhyZWR1Y2Vycyk7XG4gIHZhciBmaW5hbFJlZHVjZXJzID0ge307XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByZWR1Y2VyS2V5cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBrZXkgPSByZWR1Y2VyS2V5c1tpXTtcblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAodHlwZW9mIHJlZHVjZXJzW2tleV0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHdhcm5pbmcoXCJObyByZWR1Y2VyIHByb3ZpZGVkIGZvciBrZXkgXFxcIlwiICsga2V5ICsgXCJcXFwiXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcmVkdWNlcnNba2V5XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZmluYWxSZWR1Y2Vyc1trZXldID0gcmVkdWNlcnNba2V5XTtcbiAgICB9XG4gIH1cblxuICB2YXIgZmluYWxSZWR1Y2VyS2V5cyA9IE9iamVjdC5rZXlzKGZpbmFsUmVkdWNlcnMpOyAvLyBUaGlzIGlzIHVzZWQgdG8gbWFrZSBzdXJlIHdlIGRvbid0IHdhcm4gYWJvdXQgdGhlIHNhbWVcbiAgLy8ga2V5cyBtdWx0aXBsZSB0aW1lcy5cblxuICB2YXIgdW5leHBlY3RlZEtleUNhY2hlO1xuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgdW5leHBlY3RlZEtleUNhY2hlID0ge307XG4gIH1cblxuICB2YXIgc2hhcGVBc3NlcnRpb25FcnJvcjtcblxuICB0cnkge1xuICAgIGFzc2VydFJlZHVjZXJTaGFwZShmaW5hbFJlZHVjZXJzKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHNoYXBlQXNzZXJ0aW9uRXJyb3IgPSBlO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIGNvbWJpbmF0aW9uKHN0YXRlLCBhY3Rpb24pIHtcbiAgICBpZiAoc3RhdGUgPT09IHZvaWQgMCkge1xuICAgICAgc3RhdGUgPSB7fTtcbiAgICB9XG5cbiAgICBpZiAoc2hhcGVBc3NlcnRpb25FcnJvcikge1xuICAgICAgdGhyb3cgc2hhcGVBc3NlcnRpb25FcnJvcjtcbiAgICB9XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIHdhcm5pbmdNZXNzYWdlID0gZ2V0VW5leHBlY3RlZFN0YXRlU2hhcGVXYXJuaW5nTWVzc2FnZShzdGF0ZSwgZmluYWxSZWR1Y2VycywgYWN0aW9uLCB1bmV4cGVjdGVkS2V5Q2FjaGUpO1xuXG4gICAgICBpZiAod2FybmluZ01lc3NhZ2UpIHtcbiAgICAgICAgd2FybmluZyh3YXJuaW5nTWVzc2FnZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGhhc0NoYW5nZWQgPSBmYWxzZTtcbiAgICB2YXIgbmV4dFN0YXRlID0ge307XG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgZmluYWxSZWR1Y2VyS2V5cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBfa2V5ID0gZmluYWxSZWR1Y2VyS2V5c1tfaV07XG4gICAgICB2YXIgcmVkdWNlciA9IGZpbmFsUmVkdWNlcnNbX2tleV07XG4gICAgICB2YXIgcHJldmlvdXNTdGF0ZUZvcktleSA9IHN0YXRlW19rZXldO1xuICAgICAgdmFyIG5leHRTdGF0ZUZvcktleSA9IHJlZHVjZXIocHJldmlvdXNTdGF0ZUZvcktleSwgYWN0aW9uKTtcblxuICAgICAgaWYgKHR5cGVvZiBuZXh0U3RhdGVGb3JLZXkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHZhciBhY3Rpb25UeXBlID0gYWN0aW9uICYmIGFjdGlvbi50eXBlO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxNCkgOiBcIldoZW4gY2FsbGVkIHdpdGggYW4gYWN0aW9uIG9mIHR5cGUgXCIgKyAoYWN0aW9uVHlwZSA/IFwiXFxcIlwiICsgU3RyaW5nKGFjdGlvblR5cGUpICsgXCJcXFwiXCIgOiAnKHVua25vd24gdHlwZSknKSArIFwiLCB0aGUgc2xpY2UgcmVkdWNlciBmb3Iga2V5IFxcXCJcIiArIF9rZXkgKyBcIlxcXCIgcmV0dXJuZWQgdW5kZWZpbmVkLiBcIiArIFwiVG8gaWdub3JlIGFuIGFjdGlvbiwgeW91IG11c3QgZXhwbGljaXRseSByZXR1cm4gdGhlIHByZXZpb3VzIHN0YXRlLiBcIiArIFwiSWYgeW91IHdhbnQgdGhpcyByZWR1Y2VyIHRvIGhvbGQgbm8gdmFsdWUsIHlvdSBjYW4gcmV0dXJuIG51bGwgaW5zdGVhZCBvZiB1bmRlZmluZWQuXCIpO1xuICAgICAgfVxuXG4gICAgICBuZXh0U3RhdGVbX2tleV0gPSBuZXh0U3RhdGVGb3JLZXk7XG4gICAgICBoYXNDaGFuZ2VkID0gaGFzQ2hhbmdlZCB8fCBuZXh0U3RhdGVGb3JLZXkgIT09IHByZXZpb3VzU3RhdGVGb3JLZXk7XG4gICAgfVxuXG4gICAgaGFzQ2hhbmdlZCA9IGhhc0NoYW5nZWQgfHwgZmluYWxSZWR1Y2VyS2V5cy5sZW5ndGggIT09IE9iamVjdC5rZXlzKHN0YXRlKS5sZW5ndGg7XG4gICAgcmV0dXJuIGhhc0NoYW5nZWQgPyBuZXh0U3RhdGUgOiBzdGF0ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYmluZEFjdGlvbkNyZWF0b3IoYWN0aW9uQ3JlYXRvciwgZGlzcGF0Y2gpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZGlzcGF0Y2goYWN0aW9uQ3JlYXRvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfTtcbn1cbi8qKlxuICogVHVybnMgYW4gb2JqZWN0IHdob3NlIHZhbHVlcyBhcmUgYWN0aW9uIGNyZWF0b3JzLCBpbnRvIGFuIG9iamVjdCB3aXRoIHRoZVxuICogc2FtZSBrZXlzLCBidXQgd2l0aCBldmVyeSBmdW5jdGlvbiB3cmFwcGVkIGludG8gYSBgZGlzcGF0Y2hgIGNhbGwgc28gdGhleVxuICogbWF5IGJlIGludm9rZWQgZGlyZWN0bHkuIFRoaXMgaXMganVzdCBhIGNvbnZlbmllbmNlIG1ldGhvZCwgYXMgeW91IGNhbiBjYWxsXG4gKiBgc3RvcmUuZGlzcGF0Y2goTXlBY3Rpb25DcmVhdG9ycy5kb1NvbWV0aGluZygpKWAgeW91cnNlbGYganVzdCBmaW5lLlxuICpcbiAqIEZvciBjb252ZW5pZW5jZSwgeW91IGNhbiBhbHNvIHBhc3MgYW4gYWN0aW9uIGNyZWF0b3IgYXMgdGhlIGZpcnN0IGFyZ3VtZW50LFxuICogYW5kIGdldCBhIGRpc3BhdGNoIHdyYXBwZWQgZnVuY3Rpb24gaW4gcmV0dXJuLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fSBhY3Rpb25DcmVhdG9ycyBBbiBvYmplY3Qgd2hvc2UgdmFsdWVzIGFyZSBhY3Rpb25cbiAqIGNyZWF0b3IgZnVuY3Rpb25zLiBPbmUgaGFuZHkgd2F5IHRvIG9idGFpbiBpdCBpcyB0byB1c2UgRVM2IGBpbXBvcnQgKiBhc2BcbiAqIHN5bnRheC4gWW91IG1heSBhbHNvIHBhc3MgYSBzaW5nbGUgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZGlzcGF0Y2ggVGhlIGBkaXNwYXRjaGAgZnVuY3Rpb24gYXZhaWxhYmxlIG9uIHlvdXIgUmVkdXhcbiAqIHN0b3JlLlxuICpcbiAqIEByZXR1cm5zIHtGdW5jdGlvbnxPYmplY3R9IFRoZSBvYmplY3QgbWltaWNraW5nIHRoZSBvcmlnaW5hbCBvYmplY3QsIGJ1dCB3aXRoXG4gKiBldmVyeSBhY3Rpb24gY3JlYXRvciB3cmFwcGVkIGludG8gdGhlIGBkaXNwYXRjaGAgY2FsbC4gSWYgeW91IHBhc3NlZCBhXG4gKiBmdW5jdGlvbiBhcyBgYWN0aW9uQ3JlYXRvcnNgLCB0aGUgcmV0dXJuIHZhbHVlIHdpbGwgYWxzbyBiZSBhIHNpbmdsZVxuICogZnVuY3Rpb24uXG4gKi9cblxuXG5mdW5jdGlvbiBiaW5kQWN0aW9uQ3JlYXRvcnMoYWN0aW9uQ3JlYXRvcnMsIGRpc3BhdGNoKSB7XG4gIGlmICh0eXBlb2YgYWN0aW9uQ3JlYXRvcnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gYmluZEFjdGlvbkNyZWF0b3IoYWN0aW9uQ3JlYXRvcnMsIGRpc3BhdGNoKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgYWN0aW9uQ3JlYXRvcnMgIT09ICdvYmplY3QnIHx8IGFjdGlvbkNyZWF0b3JzID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTYpIDogXCJiaW5kQWN0aW9uQ3JlYXRvcnMgZXhwZWN0ZWQgYW4gb2JqZWN0IG9yIGEgZnVuY3Rpb24sIGJ1dCBpbnN0ZWFkIHJlY2VpdmVkOiAnXCIgKyBraW5kT2YoYWN0aW9uQ3JlYXRvcnMpICsgXCInLiBcIiArIFwiRGlkIHlvdSB3cml0ZSBcXFwiaW1wb3J0IEFjdGlvbkNyZWF0b3JzIGZyb21cXFwiIGluc3RlYWQgb2YgXFxcImltcG9ydCAqIGFzIEFjdGlvbkNyZWF0b3JzIGZyb21cXFwiP1wiKTtcbiAgfVxuXG4gIHZhciBib3VuZEFjdGlvbkNyZWF0b3JzID0ge307XG5cbiAgZm9yICh2YXIga2V5IGluIGFjdGlvbkNyZWF0b3JzKSB7XG4gICAgdmFyIGFjdGlvbkNyZWF0b3IgPSBhY3Rpb25DcmVhdG9yc1trZXldO1xuXG4gICAgaWYgKHR5cGVvZiBhY3Rpb25DcmVhdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBib3VuZEFjdGlvbkNyZWF0b3JzW2tleV0gPSBiaW5kQWN0aW9uQ3JlYXRvcihhY3Rpb25DcmVhdG9yLCBkaXNwYXRjaCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJvdW5kQWN0aW9uQ3JlYXRvcnM7XG59XG5cbi8qKlxuICogQ29tcG9zZXMgc2luZ2xlLWFyZ3VtZW50IGZ1bmN0aW9ucyBmcm9tIHJpZ2h0IHRvIGxlZnQuIFRoZSByaWdodG1vc3RcbiAqIGZ1bmN0aW9uIGNhbiB0YWtlIG11bHRpcGxlIGFyZ3VtZW50cyBhcyBpdCBwcm92aWRlcyB0aGUgc2lnbmF0dXJlIGZvclxuICogdGhlIHJlc3VsdGluZyBjb21wb3NpdGUgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHsuLi5GdW5jdGlvbn0gZnVuY3MgVGhlIGZ1bmN0aW9ucyB0byBjb21wb3NlLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIG9idGFpbmVkIGJ5IGNvbXBvc2luZyB0aGUgYXJndW1lbnQgZnVuY3Rpb25zXG4gKiBmcm9tIHJpZ2h0IHRvIGxlZnQuIEZvciBleGFtcGxlLCBjb21wb3NlKGYsIGcsIGgpIGlzIGlkZW50aWNhbCB0byBkb2luZ1xuICogKC4uLmFyZ3MpID0+IGYoZyhoKC4uLmFyZ3MpKSkuXG4gKi9cbmZ1bmN0aW9uIGNvbXBvc2UoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBmdW5jcyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBmdW5jc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIGlmIChmdW5jcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGFyZykge1xuICAgICAgcmV0dXJuIGFyZztcbiAgICB9O1xuICB9XG5cbiAgaWYgKGZ1bmNzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBmdW5jc1swXTtcbiAgfVxuXG4gIHJldHVybiBmdW5jcy5yZWR1Y2UoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGEoYi5hcHBseSh2b2lkIDAsIGFyZ3VtZW50cykpO1xuICAgIH07XG4gIH0pO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBzdG9yZSBlbmhhbmNlciB0aGF0IGFwcGxpZXMgbWlkZGxld2FyZSB0byB0aGUgZGlzcGF0Y2ggbWV0aG9kXG4gKiBvZiB0aGUgUmVkdXggc3RvcmUuIFRoaXMgaXMgaGFuZHkgZm9yIGEgdmFyaWV0eSBvZiB0YXNrcywgc3VjaCBhcyBleHByZXNzaW5nXG4gKiBhc3luY2hyb25vdXMgYWN0aW9ucyBpbiBhIGNvbmNpc2UgbWFubmVyLCBvciBsb2dnaW5nIGV2ZXJ5IGFjdGlvbiBwYXlsb2FkLlxuICpcbiAqIFNlZSBgcmVkdXgtdGh1bmtgIHBhY2thZ2UgYXMgYW4gZXhhbXBsZSBvZiB0aGUgUmVkdXggbWlkZGxld2FyZS5cbiAqXG4gKiBCZWNhdXNlIG1pZGRsZXdhcmUgaXMgcG90ZW50aWFsbHkgYXN5bmNocm9ub3VzLCB0aGlzIHNob3VsZCBiZSB0aGUgZmlyc3RcbiAqIHN0b3JlIGVuaGFuY2VyIGluIHRoZSBjb21wb3NpdGlvbiBjaGFpbi5cbiAqXG4gKiBOb3RlIHRoYXQgZWFjaCBtaWRkbGV3YXJlIHdpbGwgYmUgZ2l2ZW4gdGhlIGBkaXNwYXRjaGAgYW5kIGBnZXRTdGF0ZWAgZnVuY3Rpb25zXG4gKiBhcyBuYW1lZCBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIHsuLi5GdW5jdGlvbn0gbWlkZGxld2FyZXMgVGhlIG1pZGRsZXdhcmUgY2hhaW4gdG8gYmUgYXBwbGllZC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSBzdG9yZSBlbmhhbmNlciBhcHBseWluZyB0aGUgbWlkZGxld2FyZS5cbiAqL1xuXG5mdW5jdGlvbiBhcHBseU1pZGRsZXdhcmUoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBtaWRkbGV3YXJlcyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBtaWRkbGV3YXJlc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoY3JlYXRlU3RvcmUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHN0b3JlID0gY3JlYXRlU3RvcmUuYXBwbHkodm9pZCAwLCBhcmd1bWVudHMpO1xuXG4gICAgICB2YXIgX2Rpc3BhdGNoID0gZnVuY3Rpb24gZGlzcGF0Y2goKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE1KSA6ICdEaXNwYXRjaGluZyB3aGlsZSBjb25zdHJ1Y3RpbmcgeW91ciBtaWRkbGV3YXJlIGlzIG5vdCBhbGxvd2VkLiAnICsgJ090aGVyIG1pZGRsZXdhcmUgd291bGQgbm90IGJlIGFwcGxpZWQgdG8gdGhpcyBkaXNwYXRjaC4nKTtcbiAgICAgIH07XG5cbiAgICAgIHZhciBtaWRkbGV3YXJlQVBJID0ge1xuICAgICAgICBnZXRTdGF0ZTogc3RvcmUuZ2V0U3RhdGUsXG4gICAgICAgIGRpc3BhdGNoOiBmdW5jdGlvbiBkaXNwYXRjaCgpIHtcbiAgICAgICAgICByZXR1cm4gX2Rpc3BhdGNoLmFwcGx5KHZvaWQgMCwgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHZhciBjaGFpbiA9IG1pZGRsZXdhcmVzLm1hcChmdW5jdGlvbiAobWlkZGxld2FyZSkge1xuICAgICAgICByZXR1cm4gbWlkZGxld2FyZShtaWRkbGV3YXJlQVBJKTtcbiAgICAgIH0pO1xuICAgICAgX2Rpc3BhdGNoID0gY29tcG9zZS5hcHBseSh2b2lkIDAsIGNoYWluKShzdG9yZS5kaXNwYXRjaCk7XG4gICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdG9yZSksIHt9LCB7XG4gICAgICAgIGRpc3BhdGNoOiBfZGlzcGF0Y2hcbiAgICAgIH0pO1xuICAgIH07XG4gIH07XG59XG5cbmV4cG9ydCB7IEFjdGlvblR5cGVzIGFzIF9fRE9fTk9UX1VTRV9fQWN0aW9uVHlwZXMsIGFwcGx5TWlkZGxld2FyZSwgYmluZEFjdGlvbkNyZWF0b3JzLCBjb21iaW5lUmVkdWNlcnMsIGNvbXBvc2UsIGNyZWF0ZVN0b3JlLCBsZWdhY3lfY3JlYXRlU3RvcmUgfTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGlzQXJyYXlpc2ggPSByZXF1aXJlKCdpcy1hcnJheWlzaCcpO1xuXG52YXIgY29uY2F0ID0gQXJyYXkucHJvdG90eXBlLmNvbmNhdDtcbnZhciBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcblxudmFyIHN3aXp6bGUgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHN3aXp6bGUoYXJncykge1xuXHR2YXIgcmVzdWx0cyA9IFtdO1xuXG5cdGZvciAodmFyIGkgPSAwLCBsZW4gPSBhcmdzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0dmFyIGFyZyA9IGFyZ3NbaV07XG5cblx0XHRpZiAoaXNBcnJheWlzaChhcmcpKSB7XG5cdFx0XHQvLyBodHRwOi8vanNwZXJmLmNvbS9qYXZhc2NyaXB0LWFycmF5LWNvbmNhdC12cy1wdXNoLzk4XG5cdFx0XHRyZXN1bHRzID0gY29uY2F0LmNhbGwocmVzdWx0cywgc2xpY2UuY2FsbChhcmcpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmVzdWx0cy5wdXNoKGFyZyk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHJlc3VsdHM7XG59O1xuXG5zd2l6emxlLndyYXAgPSBmdW5jdGlvbiAoZm4pIHtcblx0cmV0dXJuIGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gZm4oc3dpenpsZShhcmd1bWVudHMpKTtcblx0fTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzQXJyYXlpc2gob2JqKSB7XG5cdGlmICghb2JqIHx8IHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0cmV0dXJuIG9iaiBpbnN0YW5jZW9mIEFycmF5IHx8IEFycmF5LmlzQXJyYXkob2JqKSB8fFxuXHRcdChvYmoubGVuZ3RoID49IDAgJiYgKG9iai5zcGxpY2UgaW5zdGFuY2VvZiBGdW5jdGlvbiB8fFxuXHRcdFx0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCAob2JqLmxlbmd0aCAtIDEpKSAmJiBvYmouY29uc3RydWN0b3IubmFtZSAhPT0gJ1N0cmluZycpKSk7XG59O1xuIiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL1Rvb2xiYXIuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9Ub29sYmFyLmNzc1wiO1xuICAgICAgIGV4cG9ydCBkZWZhdWx0IGNvbnRlbnQgJiYgY29udGVudC5sb2NhbHMgPyBjb250ZW50LmxvY2FscyA6IHVuZGVmaW5lZDtcbiIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9DYWxsYmFja0dyYXBoQ29udGFpbmVyLmNzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xuXG4gICAgICBvcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xuICAgIFxub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vQ2FsbGJhY2tHcmFwaENvbnRhaW5lci5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vRnJvbnRFbmRFcnJvci5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcblxuICAgICAgb3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbiAgICBcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL0Zyb250RW5kRXJyb3IuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL1BlcmN5LmNzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xuXG4gICAgICBvcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xuICAgIFxub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vUGVyY3kuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL0RlYnVnTWVudS5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcblxuICAgICAgb3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbiAgICBcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL0RlYnVnTWVudS5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vUGxvdGx5Q2xvdWQuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9QbG90bHlDbG91ZC5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vVmVyc2lvbkluZm8uY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9WZXJzaW9uSW5mby5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIHN0eWxlc0luRE9NID0gW107XG5mdW5jdGlvbiBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKSB7XG4gIHZhciByZXN1bHQgPSAtMTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHlsZXNJbkRPTS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChzdHlsZXNJbkRPTVtpXS5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSB7XG4gICAgICByZXN1bHQgPSBpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBtb2R1bGVzVG9Eb20obGlzdCwgb3B0aW9ucykge1xuICB2YXIgaWRDb3VudE1hcCA9IHt9O1xuICB2YXIgaWRlbnRpZmllcnMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGl0ZW0gPSBsaXN0W2ldO1xuICAgIHZhciBpZCA9IG9wdGlvbnMuYmFzZSA/IGl0ZW1bMF0gKyBvcHRpb25zLmJhc2UgOiBpdGVtWzBdO1xuICAgIHZhciBjb3VudCA9IGlkQ291bnRNYXBbaWRdIHx8IDA7XG4gICAgdmFyIGlkZW50aWZpZXIgPSBcIlwiLmNvbmNhdChpZCwgXCIgXCIpLmNvbmNhdChjb3VudCk7XG4gICAgaWRDb3VudE1hcFtpZF0gPSBjb3VudCArIDE7XG4gICAgdmFyIGluZGV4QnlJZGVudGlmaWVyID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoaWRlbnRpZmllcik7XG4gICAgdmFyIG9iaiA9IHtcbiAgICAgIGNzczogaXRlbVsxXSxcbiAgICAgIG1lZGlhOiBpdGVtWzJdLFxuICAgICAgc291cmNlTWFwOiBpdGVtWzNdLFxuICAgICAgc3VwcG9ydHM6IGl0ZW1bNF0sXG4gICAgICBsYXllcjogaXRlbVs1XVxuICAgIH07XG4gICAgaWYgKGluZGV4QnlJZGVudGlmaWVyICE9PSAtMSkge1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhCeUlkZW50aWZpZXJdLnJlZmVyZW5jZXMrKztcbiAgICAgIHN0eWxlc0luRE9NW2luZGV4QnlJZGVudGlmaWVyXS51cGRhdGVyKG9iaik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB1cGRhdGVyID0gYWRkRWxlbWVudFN0eWxlKG9iaiwgb3B0aW9ucyk7XG4gICAgICBvcHRpb25zLmJ5SW5kZXggPSBpO1xuICAgICAgc3R5bGVzSW5ET00uc3BsaWNlKGksIDAsIHtcbiAgICAgICAgaWRlbnRpZmllcjogaWRlbnRpZmllcixcbiAgICAgICAgdXBkYXRlcjogdXBkYXRlcixcbiAgICAgICAgcmVmZXJlbmNlczogMVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlkZW50aWZpZXJzLnB1c2goaWRlbnRpZmllcik7XG4gIH1cbiAgcmV0dXJuIGlkZW50aWZpZXJzO1xufVxuZnVuY3Rpb24gYWRkRWxlbWVudFN0eWxlKG9iaiwgb3B0aW9ucykge1xuICB2YXIgYXBpID0gb3B0aW9ucy5kb21BUEkob3B0aW9ucyk7XG4gIGFwaS51cGRhdGUob2JqKTtcbiAgdmFyIHVwZGF0ZXIgPSBmdW5jdGlvbiB1cGRhdGVyKG5ld09iaikge1xuICAgIGlmIChuZXdPYmopIHtcbiAgICAgIGlmIChuZXdPYmouY3NzID09PSBvYmouY3NzICYmIG5ld09iai5tZWRpYSA9PT0gb2JqLm1lZGlhICYmIG5ld09iai5zb3VyY2VNYXAgPT09IG9iai5zb3VyY2VNYXAgJiYgbmV3T2JqLnN1cHBvcnRzID09PSBvYmouc3VwcG9ydHMgJiYgbmV3T2JqLmxheWVyID09PSBvYmoubGF5ZXIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYXBpLnVwZGF0ZShvYmogPSBuZXdPYmopO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcGkucmVtb3ZlKCk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gdXBkYXRlcjtcbn1cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGxpc3QsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIGxpc3QgPSBsaXN0IHx8IFtdO1xuICB2YXIgbGFzdElkZW50aWZpZXJzID0gbW9kdWxlc1RvRG9tKGxpc3QsIG9wdGlvbnMpO1xuICByZXR1cm4gZnVuY3Rpb24gdXBkYXRlKG5ld0xpc3QpIHtcbiAgICBuZXdMaXN0ID0gbmV3TGlzdCB8fCBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxhc3RJZGVudGlmaWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGlkZW50aWZpZXIgPSBsYXN0SWRlbnRpZmllcnNbaV07XG4gICAgICB2YXIgaW5kZXggPSBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKTtcbiAgICAgIHN0eWxlc0luRE9NW2luZGV4XS5yZWZlcmVuY2VzLS07XG4gICAgfVxuICAgIHZhciBuZXdMYXN0SWRlbnRpZmllcnMgPSBtb2R1bGVzVG9Eb20obmV3TGlzdCwgb3B0aW9ucyk7XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGxhc3RJZGVudGlmaWVycy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBfaWRlbnRpZmllciA9IGxhc3RJZGVudGlmaWVyc1tfaV07XG4gICAgICB2YXIgX2luZGV4ID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoX2lkZW50aWZpZXIpO1xuICAgICAgaWYgKHN0eWxlc0luRE9NW19pbmRleF0ucmVmZXJlbmNlcyA9PT0gMCkge1xuICAgICAgICBzdHlsZXNJbkRPTVtfaW5kZXhdLnVwZGF0ZXIoKTtcbiAgICAgICAgc3R5bGVzSW5ET00uc3BsaWNlKF9pbmRleCwgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIGxhc3RJZGVudGlmaWVycyA9IG5ld0xhc3RJZGVudGlmaWVycztcbiAgfTtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBtZW1vID0ge307XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gZ2V0VGFyZ2V0KHRhcmdldCkge1xuICBpZiAodHlwZW9mIG1lbW9bdGFyZ2V0XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHZhciBzdHlsZVRhcmdldCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGFyZ2V0KTtcblxuICAgIC8vIFNwZWNpYWwgY2FzZSB0byByZXR1cm4gaGVhZCBvZiBpZnJhbWUgaW5zdGVhZCBvZiBpZnJhbWUgaXRzZWxmXG4gICAgaWYgKHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCAmJiBzdHlsZVRhcmdldCBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gVGhpcyB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiBpZiBhY2Nlc3MgdG8gaWZyYW1lIGlzIGJsb2NrZWRcbiAgICAgICAgLy8gZHVlIHRvIGNyb3NzLW9yaWdpbiByZXN0cmljdGlvbnNcbiAgICAgICAgc3R5bGVUYXJnZXQgPSBzdHlsZVRhcmdldC5jb250ZW50RG9jdW1lbnQuaGVhZDtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHRcbiAgICAgICAgc3R5bGVUYXJnZXQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBtZW1vW3RhcmdldF0gPSBzdHlsZVRhcmdldDtcbiAgfVxuICByZXR1cm4gbWVtb1t0YXJnZXRdO1xufVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGluc2VydEJ5U2VsZWN0b3IoaW5zZXJ0LCBzdHlsZSkge1xuICB2YXIgdGFyZ2V0ID0gZ2V0VGFyZ2V0KGluc2VydCk7XG4gIGlmICghdGFyZ2V0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGRuJ3QgZmluZCBhIHN0eWxlIHRhcmdldC4gVGhpcyBwcm9iYWJseSBtZWFucyB0aGF0IHRoZSB2YWx1ZSBmb3IgdGhlICdpbnNlcnQnIHBhcmFtZXRlciBpcyBpbnZhbGlkLlwiKTtcbiAgfVxuICB0YXJnZXQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBpbnNlcnRCeVNlbGVjdG9yOyIsIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGluc2VydFN0eWxlRWxlbWVudChvcHRpb25zKSB7XG4gIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuICBvcHRpb25zLnNldEF0dHJpYnV0ZXMoZWxlbWVudCwgb3B0aW9ucy5hdHRyaWJ1dGVzKTtcbiAgb3B0aW9ucy5pbnNlcnQoZWxlbWVudCwgb3B0aW9ucy5vcHRpb25zKTtcbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGluc2VydFN0eWxlRWxlbWVudDsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBzZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMoc3R5bGVFbGVtZW50KSB7XG4gIHZhciBub25jZSA9IHR5cGVvZiBfX3dlYnBhY2tfbm9uY2VfXyAhPT0gXCJ1bmRlZmluZWRcIiA/IF9fd2VicGFja19ub25jZV9fIDogbnVsbDtcbiAgaWYgKG5vbmNlKSB7XG4gICAgc3R5bGVFbGVtZW50LnNldEF0dHJpYnV0ZShcIm5vbmNlXCIsIG5vbmNlKTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBzZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXM7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gYXBwbHkoc3R5bGVFbGVtZW50LCBvcHRpb25zLCBvYmopIHtcbiAgdmFyIGNzcyA9IFwiXCI7XG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChvYmouc3VwcG9ydHMsIFwiKSB7XCIpO1xuICB9XG4gIGlmIChvYmoubWVkaWEpIHtcbiAgICBjc3MgKz0gXCJAbWVkaWEgXCIuY29uY2F0KG9iai5tZWRpYSwgXCIge1wiKTtcbiAgfVxuICB2YXIgbmVlZExheWVyID0gdHlwZW9mIG9iai5sYXllciAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgaWYgKG5lZWRMYXllcikge1xuICAgIGNzcyArPSBcIkBsYXllclwiLmNvbmNhdChvYmoubGF5ZXIubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChvYmoubGF5ZXIpIDogXCJcIiwgXCIge1wiKTtcbiAgfVxuICBjc3MgKz0gb2JqLmNzcztcbiAgaWYgKG5lZWRMYXllcikge1xuICAgIGNzcyArPSBcIn1cIjtcbiAgfVxuICBpZiAob2JqLm1lZGlhKSB7XG4gICAgY3NzICs9IFwifVwiO1xuICB9XG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJ9XCI7XG4gIH1cbiAgdmFyIHNvdXJjZU1hcCA9IG9iai5zb3VyY2VNYXA7XG4gIGlmIChzb3VyY2VNYXAgJiYgdHlwZW9mIGJ0b2EgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBjc3MgKz0gXCJcXG4vKiMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LFwiLmNvbmNhdChidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShzb3VyY2VNYXApKSkpLCBcIiAqL1wiKTtcbiAgfVxuXG4gIC8vIEZvciBvbGQgSUVcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICAqL1xuICBvcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtKGNzcywgc3R5bGVFbGVtZW50LCBvcHRpb25zLm9wdGlvbnMpO1xufVxuZnVuY3Rpb24gcmVtb3ZlU3R5bGVFbGVtZW50KHN0eWxlRWxlbWVudCkge1xuICAvLyBpc3RhbmJ1bCBpZ25vcmUgaWZcbiAgaWYgKHN0eWxlRWxlbWVudC5wYXJlbnROb2RlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHN0eWxlRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudCk7XG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gZG9tQVBJKG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJldHVybiB7XG4gICAgICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZSgpIHt9LFxuICAgICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7fVxuICAgIH07XG4gIH1cbiAgdmFyIHN0eWxlRWxlbWVudCA9IG9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMpO1xuICByZXR1cm4ge1xuICAgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKG9iaikge1xuICAgICAgYXBwbHkoc3R5bGVFbGVtZW50LCBvcHRpb25zLCBvYmopO1xuICAgIH0sXG4gICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7XG4gICAgICByZW1vdmVTdHlsZUVsZW1lbnQoc3R5bGVFbGVtZW50KTtcbiAgICB9XG4gIH07XG59XG5tb2R1bGUuZXhwb3J0cyA9IGRvbUFQSTsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBzdHlsZVRhZ1RyYW5zZm9ybShjc3MsIHN0eWxlRWxlbWVudCkge1xuICBpZiAoc3R5bGVFbGVtZW50LnN0eWxlU2hlZXQpIHtcbiAgICBzdHlsZUVsZW1lbnQuc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzO1xuICB9IGVsc2Uge1xuICAgIHdoaWxlIChzdHlsZUVsZW1lbnQuZmlyc3RDaGlsZCkge1xuICAgICAgc3R5bGVFbGVtZW50LnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudC5maXJzdENoaWxkKTtcbiAgICB9XG4gICAgc3R5bGVFbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcykpO1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHN0eWxlVGFnVHJhbnNmb3JtOyIsIi8qKlxuICogQGxpY2Vuc2UgUmVhY3RcbiAqIHVzZS1zeW5jLWV4dGVybmFsLXN0b3JlLXNoaW0uZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIE1ldGEgUGxhdGZvcm1zLCBJbmMuIGFuZCBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cblwidXNlIHN0cmljdFwiO1xuXCJwcm9kdWN0aW9uXCIgIT09IHByb2Nlc3MuZW52Lk5PREVfRU5WICYmXG4gIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gaXMoeCwgeSkge1xuICAgICAgcmV0dXJuICh4ID09PSB5ICYmICgwICE9PSB4IHx8IDEgLyB4ID09PSAxIC8geSkpIHx8ICh4ICE9PSB4ICYmIHkgIT09IHkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiB1c2VTeW5jRXh0ZXJuYWxTdG9yZSQyKHN1YnNjcmliZSwgZ2V0U25hcHNob3QpIHtcbiAgICAgIGRpZFdhcm5PbGQxOEFscGhhIHx8XG4gICAgICAgIHZvaWQgMCA9PT0gUmVhY3Quc3RhcnRUcmFuc2l0aW9uIHx8XG4gICAgICAgICgoZGlkV2Fybk9sZDE4QWxwaGEgPSAhMCksXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJZb3UgYXJlIHVzaW5nIGFuIG91dGRhdGVkLCBwcmUtcmVsZWFzZSBhbHBoYSBvZiBSZWFjdCAxOCB0aGF0IGRvZXMgbm90IHN1cHBvcnQgdXNlU3luY0V4dGVybmFsU3RvcmUuIFRoZSB1c2Utc3luYy1leHRlcm5hbC1zdG9yZSBzaGltIHdpbGwgbm90IHdvcmsgY29ycmVjdGx5LiBVcGdyYWRlIHRvIGEgbmV3ZXIgcHJlLXJlbGVhc2UuXCJcbiAgICAgICAgKSk7XG4gICAgICB2YXIgdmFsdWUgPSBnZXRTbmFwc2hvdCgpO1xuICAgICAgaWYgKCFkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdCkge1xuICAgICAgICB2YXIgY2FjaGVkVmFsdWUgPSBnZXRTbmFwc2hvdCgpO1xuICAgICAgICBvYmplY3RJcyh2YWx1ZSwgY2FjaGVkVmFsdWUpIHx8XG4gICAgICAgICAgKGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBcIlRoZSByZXN1bHQgb2YgZ2V0U25hcHNob3Qgc2hvdWxkIGJlIGNhY2hlZCB0byBhdm9pZCBhbiBpbmZpbml0ZSBsb29wXCJcbiAgICAgICAgICApLFxuICAgICAgICAgIChkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdCA9ICEwKSk7XG4gICAgICB9XG4gICAgICBjYWNoZWRWYWx1ZSA9IHVzZVN0YXRlKHtcbiAgICAgICAgaW5zdDogeyB2YWx1ZTogdmFsdWUsIGdldFNuYXBzaG90OiBnZXRTbmFwc2hvdCB9XG4gICAgICB9KTtcbiAgICAgIHZhciBpbnN0ID0gY2FjaGVkVmFsdWVbMF0uaW5zdCxcbiAgICAgICAgZm9yY2VVcGRhdGUgPSBjYWNoZWRWYWx1ZVsxXTtcbiAgICAgIHVzZUxheW91dEVmZmVjdChcbiAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGluc3QudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICBpbnN0LmdldFNuYXBzaG90ID0gZ2V0U25hcHNob3Q7XG4gICAgICAgICAgY2hlY2tJZlNuYXBzaG90Q2hhbmdlZChpbnN0KSAmJiBmb3JjZVVwZGF0ZSh7IGluc3Q6IGluc3QgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIFtzdWJzY3JpYmUsIHZhbHVlLCBnZXRTbmFwc2hvdF1cbiAgICAgICk7XG4gICAgICB1c2VFZmZlY3QoXG4gICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjaGVja0lmU25hcHNob3RDaGFuZ2VkKGluc3QpICYmIGZvcmNlVXBkYXRlKHsgaW5zdDogaW5zdCB9KTtcbiAgICAgICAgICByZXR1cm4gc3Vic2NyaWJlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNoZWNrSWZTbmFwc2hvdENoYW5nZWQoaW5zdCkgJiYgZm9yY2VVcGRhdGUoeyBpbnN0OiBpbnN0IH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBbc3Vic2NyaWJlXVxuICAgICAgKTtcbiAgICAgIHVzZURlYnVnVmFsdWUodmFsdWUpO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjaGVja0lmU25hcHNob3RDaGFuZ2VkKGluc3QpIHtcbiAgICAgIHZhciBsYXRlc3RHZXRTbmFwc2hvdCA9IGluc3QuZ2V0U25hcHNob3Q7XG4gICAgICBpbnN0ID0gaW5zdC52YWx1ZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciBuZXh0VmFsdWUgPSBsYXRlc3RHZXRTbmFwc2hvdCgpO1xuICAgICAgICByZXR1cm4gIW9iamVjdElzKGluc3QsIG5leHRWYWx1ZSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm4gITA7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVzZVN5bmNFeHRlcm5hbFN0b3JlJDEoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCkge1xuICAgICAgcmV0dXJuIGdldFNuYXBzaG90KCk7XG4gICAgfVxuICAgIFwidW5kZWZpbmVkXCIgIT09IHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gJiZcbiAgICAgIFwiZnVuY3Rpb25cIiA9PT1cbiAgICAgICAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQgJiZcbiAgICAgIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQoRXJyb3IoKSk7XG4gICAgdmFyIFJlYWN0ID0gcmVxdWlyZShcInJlYWN0XCIpLFxuICAgICAgb2JqZWN0SXMgPSBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBPYmplY3QuaXMgPyBPYmplY3QuaXMgOiBpcyxcbiAgICAgIHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUsXG4gICAgICB1c2VFZmZlY3QgPSBSZWFjdC51c2VFZmZlY3QsXG4gICAgICB1c2VMYXlvdXRFZmZlY3QgPSBSZWFjdC51c2VMYXlvdXRFZmZlY3QsXG4gICAgICB1c2VEZWJ1Z1ZhbHVlID0gUmVhY3QudXNlRGVidWdWYWx1ZSxcbiAgICAgIGRpZFdhcm5PbGQxOEFscGhhID0gITEsXG4gICAgICBkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdCA9ICExLFxuICAgICAgc2hpbSA9XG4gICAgICAgIFwidW5kZWZpbmVkXCIgPT09IHR5cGVvZiB3aW5kb3cgfHxcbiAgICAgICAgXCJ1bmRlZmluZWRcIiA9PT0gdHlwZW9mIHdpbmRvdy5kb2N1bWVudCB8fFxuICAgICAgICBcInVuZGVmaW5lZFwiID09PSB0eXBlb2Ygd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnRcbiAgICAgICAgICA/IHVzZVN5bmNFeHRlcm5hbFN0b3JlJDFcbiAgICAgICAgICA6IHVzZVN5bmNFeHRlcm5hbFN0b3JlJDI7XG4gICAgZXhwb3J0cy51c2VTeW5jRXh0ZXJuYWxTdG9yZSA9XG4gICAgICB2b2lkIDAgIT09IFJlYWN0LnVzZVN5bmNFeHRlcm5hbFN0b3JlID8gUmVhY3QudXNlU3luY0V4dGVybmFsU3RvcmUgOiBzaGltO1xuICAgIFwidW5kZWZpbmVkXCIgIT09IHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gJiZcbiAgICAgIFwiZnVuY3Rpb25cIiA9PT1cbiAgICAgICAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RvcCAmJlxuICAgICAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdG9wKEVycm9yKCkpO1xuICB9KSgpO1xuIiwiLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUtc2hpbS93aXRoLXNlbGVjdG9yLmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5cInVzZSBzdHJpY3RcIjtcblwicHJvZHVjdGlvblwiICE9PSBwcm9jZXNzLmVudi5OT0RFX0VOViAmJlxuICAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIGlzKHgsIHkpIHtcbiAgICAgIHJldHVybiAoeCA9PT0geSAmJiAoMCAhPT0geCB8fCAxIC8geCA9PT0gMSAvIHkpKSB8fCAoeCAhPT0geCAmJiB5ICE9PSB5KTtcbiAgICB9XG4gICAgXCJ1bmRlZmluZWRcIiAhPT0gdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAmJlxuICAgICAgXCJmdW5jdGlvblwiID09PVxuICAgICAgICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdGFydCAmJlxuICAgICAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdGFydChFcnJvcigpKTtcbiAgICB2YXIgUmVhY3QgPSByZXF1aXJlKFwicmVhY3RcIiksXG4gICAgICBzaGltID0gcmVxdWlyZShcInVzZS1zeW5jLWV4dGVybmFsLXN0b3JlL3NoaW1cIiksXG4gICAgICBvYmplY3RJcyA9IFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIE9iamVjdC5pcyA/IE9iamVjdC5pcyA6IGlzLFxuICAgICAgdXNlU3luY0V4dGVybmFsU3RvcmUgPSBzaGltLnVzZVN5bmNFeHRlcm5hbFN0b3JlLFxuICAgICAgdXNlUmVmID0gUmVhY3QudXNlUmVmLFxuICAgICAgdXNlRWZmZWN0ID0gUmVhY3QudXNlRWZmZWN0LFxuICAgICAgdXNlTWVtbyA9IFJlYWN0LnVzZU1lbW8sXG4gICAgICB1c2VEZWJ1Z1ZhbHVlID0gUmVhY3QudXNlRGVidWdWYWx1ZTtcbiAgICBleHBvcnRzLnVzZVN5bmNFeHRlcm5hbFN0b3JlV2l0aFNlbGVjdG9yID0gZnVuY3Rpb24gKFxuICAgICAgc3Vic2NyaWJlLFxuICAgICAgZ2V0U25hcHNob3QsXG4gICAgICBnZXRTZXJ2ZXJTbmFwc2hvdCxcbiAgICAgIHNlbGVjdG9yLFxuICAgICAgaXNFcXVhbFxuICAgICkge1xuICAgICAgdmFyIGluc3RSZWYgPSB1c2VSZWYobnVsbCk7XG4gICAgICBpZiAobnVsbCA9PT0gaW5zdFJlZi5jdXJyZW50KSB7XG4gICAgICAgIHZhciBpbnN0ID0geyBoYXNWYWx1ZTogITEsIHZhbHVlOiBudWxsIH07XG4gICAgICAgIGluc3RSZWYuY3VycmVudCA9IGluc3Q7XG4gICAgICB9IGVsc2UgaW5zdCA9IGluc3RSZWYuY3VycmVudDtcbiAgICAgIGluc3RSZWYgPSB1c2VNZW1vKFxuICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgZnVuY3Rpb24gbWVtb2l6ZWRTZWxlY3RvcihuZXh0U25hcHNob3QpIHtcbiAgICAgICAgICAgIGlmICghaGFzTWVtbykge1xuICAgICAgICAgICAgICBoYXNNZW1vID0gITA7XG4gICAgICAgICAgICAgIG1lbW9pemVkU25hcHNob3QgPSBuZXh0U25hcHNob3Q7XG4gICAgICAgICAgICAgIG5leHRTbmFwc2hvdCA9IHNlbGVjdG9yKG5leHRTbmFwc2hvdCk7XG4gICAgICAgICAgICAgIGlmICh2b2lkIDAgIT09IGlzRXF1YWwgJiYgaW5zdC5oYXNWYWx1ZSkge1xuICAgICAgICAgICAgICAgIHZhciBjdXJyZW50U2VsZWN0aW9uID0gaW5zdC52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAoaXNFcXVhbChjdXJyZW50U2VsZWN0aW9uLCBuZXh0U25hcHNob3QpKVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIChtZW1vaXplZFNlbGVjdGlvbiA9IGN1cnJlbnRTZWxlY3Rpb24pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiAobWVtb2l6ZWRTZWxlY3Rpb24gPSBuZXh0U25hcHNob3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VycmVudFNlbGVjdGlvbiA9IG1lbW9pemVkU2VsZWN0aW9uO1xuICAgICAgICAgICAgaWYgKG9iamVjdElzKG1lbW9pemVkU25hcHNob3QsIG5leHRTbmFwc2hvdCkpXG4gICAgICAgICAgICAgIHJldHVybiBjdXJyZW50U2VsZWN0aW9uO1xuICAgICAgICAgICAgdmFyIG5leHRTZWxlY3Rpb24gPSBzZWxlY3RvcihuZXh0U25hcHNob3QpO1xuICAgICAgICAgICAgaWYgKHZvaWQgMCAhPT0gaXNFcXVhbCAmJiBpc0VxdWFsKGN1cnJlbnRTZWxlY3Rpb24sIG5leHRTZWxlY3Rpb24pKVxuICAgICAgICAgICAgICByZXR1cm4gKG1lbW9pemVkU25hcHNob3QgPSBuZXh0U25hcHNob3QpLCBjdXJyZW50U2VsZWN0aW9uO1xuICAgICAgICAgICAgbWVtb2l6ZWRTbmFwc2hvdCA9IG5leHRTbmFwc2hvdDtcbiAgICAgICAgICAgIHJldHVybiAobWVtb2l6ZWRTZWxlY3Rpb24gPSBuZXh0U2VsZWN0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIGhhc01lbW8gPSAhMSxcbiAgICAgICAgICAgIG1lbW9pemVkU25hcHNob3QsXG4gICAgICAgICAgICBtZW1vaXplZFNlbGVjdGlvbixcbiAgICAgICAgICAgIG1heWJlR2V0U2VydmVyU25hcHNob3QgPVxuICAgICAgICAgICAgICB2b2lkIDAgPT09IGdldFNlcnZlclNuYXBzaG90ID8gbnVsbCA6IGdldFNlcnZlclNuYXBzaG90O1xuICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBtZW1vaXplZFNlbGVjdG9yKGdldFNuYXBzaG90KCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG51bGwgPT09IG1heWJlR2V0U2VydmVyU25hcHNob3RcbiAgICAgICAgICAgICAgPyB2b2lkIDBcbiAgICAgICAgICAgICAgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gbWVtb2l6ZWRTZWxlY3RvcihtYXliZUdldFNlcnZlclNuYXBzaG90KCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICBdO1xuICAgICAgICB9LFxuICAgICAgICBbZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90LCBzZWxlY3RvciwgaXNFcXVhbF1cbiAgICAgICk7XG4gICAgICB2YXIgdmFsdWUgPSB1c2VTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGluc3RSZWZbMF0sIGluc3RSZWZbMV0pO1xuICAgICAgdXNlRWZmZWN0KFxuICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaW5zdC5oYXNWYWx1ZSA9ICEwO1xuICAgICAgICAgIGluc3QudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgW3ZhbHVlXVxuICAgICAgKTtcbiAgICAgIHVzZURlYnVnVmFsdWUodmFsdWUpO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG4gICAgXCJ1bmRlZmluZWRcIiAhPT0gdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAmJlxuICAgICAgXCJmdW5jdGlvblwiID09PVxuICAgICAgICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdG9wICYmXG4gICAgICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0b3AoRXJyb3IoKSk7XG4gIH0pKCk7XG4iLCIndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vY2pzL3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlLXNoaW0ucHJvZHVjdGlvbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9janMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUtc2hpbS5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2Nqcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS1zaGltL3dpdGgtc2VsZWN0b3IucHJvZHVjdGlvbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9janMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUtc2hpbS93aXRoLXNlbGVjdG9yLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHdpbmRvd1tcIlByb3BUeXBlc1wiXTsiLCJtb2R1bGUuZXhwb3J0cyA9IHdpbmRvd1tcIlJlYWN0XCJdOyIsIm1vZHVsZS5leHBvcnRzID0gd2luZG93W1wiUmVhY3RET01cIl07IiwiZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkociwgYSkge1xuICAobnVsbCA9PSBhIHx8IGEgPiByLmxlbmd0aCkgJiYgKGEgPSByLmxlbmd0aCk7XG4gIGZvciAodmFyIGUgPSAwLCBuID0gQXJyYXkoYSk7IGUgPCBhOyBlKyspIG5bZV0gPSByW2VdO1xuICByZXR1cm4gbjtcbn1cbmV4cG9ydCB7IF9hcnJheUxpa2VUb0FycmF5IGFzIGRlZmF1bHQgfTsiLCJmdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMocikge1xuICBpZiAoQXJyYXkuaXNBcnJheShyKSkgcmV0dXJuIHI7XG59XG5leHBvcnQgeyBfYXJyYXlXaXRoSG9sZXMgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBhcnJheUxpa2VUb0FycmF5IGZyb20gXCIuL2FycmF5TGlrZVRvQXJyYXkuanNcIjtcbmZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhyKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHIpKSByZXR1cm4gYXJyYXlMaWtlVG9BcnJheShyKTtcbn1cbmV4cG9ydCB7IF9hcnJheVdpdGhvdXRIb2xlcyBhcyBkZWZhdWx0IH07IiwiZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChlKSB7XG4gIGlmICh2b2lkIDAgPT09IGUpIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtcbiAgcmV0dXJuIGU7XG59XG5leHBvcnQgeyBfYXNzZXJ0VGhpc0luaXRpYWxpemVkIGFzIGRlZmF1bHQgfTsiLCJmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soYSwgbikge1xuICBpZiAoIShhIGluc3RhbmNlb2YgbikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG59XG5leHBvcnQgeyBfY2xhc3NDYWxsQ2hlY2sgYXMgZGVmYXVsdCB9OyIsImltcG9ydCB0b1Byb3BlcnR5S2V5IGZyb20gXCIuL3RvUHJvcGVydHlLZXkuanNcIjtcbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKGUsIHIpIHtcbiAgZm9yICh2YXIgdCA9IDA7IHQgPCByLmxlbmd0aDsgdCsrKSB7XG4gICAgdmFyIG8gPSByW3RdO1xuICAgIG8uZW51bWVyYWJsZSA9IG8uZW51bWVyYWJsZSB8fCAhMSwgby5jb25maWd1cmFibGUgPSAhMCwgXCJ2YWx1ZVwiIGluIG8gJiYgKG8ud3JpdGFibGUgPSAhMCksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCB0b1Byb3BlcnR5S2V5KG8ua2V5KSwgbyk7XG4gIH1cbn1cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhlLCByLCB0KSB7XG4gIHJldHVybiByICYmIF9kZWZpbmVQcm9wZXJ0aWVzKGUucHJvdG90eXBlLCByKSwgdCAmJiBfZGVmaW5lUHJvcGVydGllcyhlLCB0KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwicHJvdG90eXBlXCIsIHtcbiAgICB3cml0YWJsZTogITFcbiAgfSksIGU7XG59XG5leHBvcnQgeyBfY3JlYXRlQ2xhc3MgYXMgZGVmYXVsdCB9OyIsImltcG9ydCB0b1Byb3BlcnR5S2V5IGZyb20gXCIuL3RvUHJvcGVydHlLZXkuanNcIjtcbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShlLCByLCB0KSB7XG4gIHJldHVybiAociA9IHRvUHJvcGVydHlLZXkocikpIGluIGUgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgciwge1xuICAgIHZhbHVlOiB0LFxuICAgIGVudW1lcmFibGU6ICEwLFxuICAgIGNvbmZpZ3VyYWJsZTogITAsXG4gICAgd3JpdGFibGU6ICEwXG4gIH0pIDogZVtyXSA9IHQsIGU7XG59XG5leHBvcnQgeyBfZGVmaW5lUHJvcGVydHkgYXMgZGVmYXVsdCB9OyIsImZ1bmN0aW9uIF9leHRlbmRzKCkge1xuICByZXR1cm4gX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAobikge1xuICAgIGZvciAodmFyIGUgPSAxOyBlIDwgYXJndW1lbnRzLmxlbmd0aDsgZSsrKSB7XG4gICAgICB2YXIgdCA9IGFyZ3VtZW50c1tlXTtcbiAgICAgIGZvciAodmFyIHIgaW4gdCkgKHt9KS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIHIpICYmIChuW3JdID0gdFtyXSk7XG4gICAgfVxuICAgIHJldHVybiBuO1xuICB9LCBfZXh0ZW5kcy5hcHBseShudWxsLCBhcmd1bWVudHMpO1xufVxuZXhwb3J0IHsgX2V4dGVuZHMgYXMgZGVmYXVsdCB9OyIsImZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZih0KSB7XG4gIHJldHVybiBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4gdC5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKHQpO1xuICB9LCBfZ2V0UHJvdG90eXBlT2YodCk7XG59XG5leHBvcnQgeyBfZ2V0UHJvdG90eXBlT2YgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBzZXRQcm90b3R5cGVPZiBmcm9tIFwiLi9zZXRQcm90b3R5cGVPZi5qc1wiO1xuZnVuY3Rpb24gX2luaGVyaXRzKHQsIGUpIHtcbiAgaWYgKFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgZSAmJiBudWxsICE9PSBlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7XG4gIHQucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShlICYmIGUucHJvdG90eXBlLCB7XG4gICAgY29uc3RydWN0b3I6IHtcbiAgICAgIHZhbHVlOiB0LFxuICAgICAgd3JpdGFibGU6ICEwLFxuICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgIH1cbiAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcInByb3RvdHlwZVwiLCB7XG4gICAgd3JpdGFibGU6ICExXG4gIH0pLCBlICYmIHNldFByb3RvdHlwZU9mKHQsIGUpO1xufVxuZXhwb3J0IHsgX2luaGVyaXRzIGFzIGRlZmF1bHQgfTsiLCJmdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KHIpIHtcbiAgaWYgKFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIFN5bWJvbCAmJiBudWxsICE9IHJbU3ltYm9sLml0ZXJhdG9yXSB8fCBudWxsICE9IHJbXCJAQGl0ZXJhdG9yXCJdKSByZXR1cm4gQXJyYXkuZnJvbShyKTtcbn1cbmV4cG9ydCB7IF9pdGVyYWJsZVRvQXJyYXkgYXMgZGVmYXVsdCB9OyIsImZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdChyLCBsKSB7XG4gIHZhciB0ID0gbnVsbCA9PSByID8gbnVsbCA6IFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIFN5bWJvbCAmJiByW1N5bWJvbC5pdGVyYXRvcl0gfHwgcltcIkBAaXRlcmF0b3JcIl07XG4gIGlmIChudWxsICE9IHQpIHtcbiAgICB2YXIgZSxcbiAgICAgIG4sXG4gICAgICBpLFxuICAgICAgdSxcbiAgICAgIGEgPSBbXSxcbiAgICAgIGYgPSAhMCxcbiAgICAgIG8gPSAhMTtcbiAgICB0cnkge1xuICAgICAgaWYgKGkgPSAodCA9IHQuY2FsbChyKSkubmV4dCwgMCA9PT0gbCkge1xuICAgICAgICBpZiAoT2JqZWN0KHQpICE9PSB0KSByZXR1cm47XG4gICAgICAgIGYgPSAhMTtcbiAgICAgIH0gZWxzZSBmb3IgKDsgIShmID0gKGUgPSBpLmNhbGwodCkpLmRvbmUpICYmIChhLnB1c2goZS52YWx1ZSksIGEubGVuZ3RoICE9PSBsKTsgZiA9ICEwKTtcbiAgICB9IGNhdGNoIChyKSB7XG4gICAgICBvID0gITAsIG4gPSByO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIWYgJiYgbnVsbCAhPSB0W1wicmV0dXJuXCJdICYmICh1ID0gdFtcInJldHVyblwiXSgpLCBPYmplY3QodSkgIT09IHUpKSByZXR1cm47XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAobykgdGhyb3cgbjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGE7XG4gIH1cbn1cbmV4cG9ydCB7IF9pdGVyYWJsZVRvQXJyYXlMaW1pdCBhcyBkZWZhdWx0IH07IiwiZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTtcbn1cbmV4cG9ydCB7IF9ub25JdGVyYWJsZVJlc3QgYXMgZGVmYXVsdCB9OyIsImZ1bmN0aW9uIF9ub25JdGVyYWJsZVNwcmVhZCgpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG59XG5leHBvcnQgeyBfbm9uSXRlcmFibGVTcHJlYWQgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBkZWZpbmVQcm9wZXJ0eSBmcm9tIFwiLi9kZWZpbmVQcm9wZXJ0eS5qc1wiO1xuZnVuY3Rpb24gb3duS2V5cyhlLCByKSB7XG4gIHZhciB0ID0gT2JqZWN0LmtleXMoZSk7XG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgdmFyIG8gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpO1xuICAgIHIgJiYgKG8gPSBvLmZpbHRlcihmdW5jdGlvbiAocikge1xuICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgcikuZW51bWVyYWJsZTtcbiAgICB9KSksIHQucHVzaC5hcHBseSh0LCBvKTtcbiAgfVxuICByZXR1cm4gdDtcbn1cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQyKGUpIHtcbiAgZm9yICh2YXIgciA9IDE7IHIgPCBhcmd1bWVudHMubGVuZ3RoOyByKyspIHtcbiAgICB2YXIgdCA9IG51bGwgIT0gYXJndW1lbnRzW3JdID8gYXJndW1lbnRzW3JdIDoge307XG4gICAgciAlIDIgPyBvd25LZXlzKE9iamVjdCh0KSwgITApLmZvckVhY2goZnVuY3Rpb24gKHIpIHtcbiAgICAgIGRlZmluZVByb3BlcnR5KGUsIHIsIHRbcl0pO1xuICAgIH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh0KSkgOiBvd25LZXlzKE9iamVjdCh0KSkuZm9yRWFjaChmdW5jdGlvbiAocikge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHIsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCwgcikpO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBlO1xufVxuZXhwb3J0IHsgX29iamVjdFNwcmVhZDIgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBvYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlIGZyb20gXCIuL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UuanNcIjtcbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhlLCB0KSB7XG4gIGlmIChudWxsID09IGUpIHJldHVybiB7fTtcbiAgdmFyIG8sXG4gICAgcixcbiAgICBpID0gb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShlLCB0KTtcbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICB2YXIgbiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7XG4gICAgZm9yIChyID0gMDsgciA8IG4ubGVuZ3RoOyByKyspIG8gPSBuW3JdLCAtMSA9PT0gdC5pbmRleE9mKG8pICYmIHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgbykgJiYgKGlbb10gPSBlW29dKTtcbiAgfVxuICByZXR1cm4gaTtcbn1cbmV4cG9ydCB7IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBhcyBkZWZhdWx0IH07IiwiZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UociwgZSkge1xuICBpZiAobnVsbCA9PSByKSByZXR1cm4ge307XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIG4gaW4gcikgaWYgKHt9Lmhhc093blByb3BlcnR5LmNhbGwociwgbikpIHtcbiAgICBpZiAoLTEgIT09IGUuaW5kZXhPZihuKSkgY29udGludWU7XG4gICAgdFtuXSA9IHJbbl07XG4gIH1cbiAgcmV0dXJuIHQ7XG59XG5leHBvcnQgeyBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZSBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IF90eXBlb2YgZnJvbSBcIi4vdHlwZW9mLmpzXCI7XG5pbXBvcnQgYXNzZXJ0VGhpc0luaXRpYWxpemVkIGZyb20gXCIuL2Fzc2VydFRoaXNJbml0aWFsaXplZC5qc1wiO1xuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odCwgZSkge1xuICBpZiAoZSAmJiAoXCJvYmplY3RcIiA9PSBfdHlwZW9mKGUpIHx8IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgZSkpIHJldHVybiBlO1xuICBpZiAodm9pZCAwICE9PSBlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRGVyaXZlZCBjb25zdHJ1Y3RvcnMgbWF5IG9ubHkgcmV0dXJuIG9iamVjdCBvciB1bmRlZmluZWRcIik7XG4gIHJldHVybiBhc3NlcnRUaGlzSW5pdGlhbGl6ZWQodCk7XG59XG5leHBvcnQgeyBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiBhcyBkZWZhdWx0IH07IiwiZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKHQsIGUpIHtcbiAgcmV0dXJuIF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZi5iaW5kKCkgOiBmdW5jdGlvbiAodCwgZSkge1xuICAgIHJldHVybiB0Ll9fcHJvdG9fXyA9IGUsIHQ7XG4gIH0sIF9zZXRQcm90b3R5cGVPZih0LCBlKTtcbn1cbmV4cG9ydCB7IF9zZXRQcm90b3R5cGVPZiBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IGFycmF5V2l0aEhvbGVzIGZyb20gXCIuL2FycmF5V2l0aEhvbGVzLmpzXCI7XG5pbXBvcnQgaXRlcmFibGVUb0FycmF5TGltaXQgZnJvbSBcIi4vaXRlcmFibGVUb0FycmF5TGltaXQuanNcIjtcbmltcG9ydCB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSBmcm9tIFwiLi91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheS5qc1wiO1xuaW1wb3J0IG5vbkl0ZXJhYmxlUmVzdCBmcm9tIFwiLi9ub25JdGVyYWJsZVJlc3QuanNcIjtcbmZ1bmN0aW9uIF9zbGljZWRUb0FycmF5KHIsIGUpIHtcbiAgcmV0dXJuIGFycmF5V2l0aEhvbGVzKHIpIHx8IGl0ZXJhYmxlVG9BcnJheUxpbWl0KHIsIGUpIHx8IHVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KHIsIGUpIHx8IG5vbkl0ZXJhYmxlUmVzdCgpO1xufVxuZXhwb3J0IHsgX3NsaWNlZFRvQXJyYXkgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBhcnJheVdpdGhvdXRIb2xlcyBmcm9tIFwiLi9hcnJheVdpdGhvdXRIb2xlcy5qc1wiO1xuaW1wb3J0IGl0ZXJhYmxlVG9BcnJheSBmcm9tIFwiLi9pdGVyYWJsZVRvQXJyYXkuanNcIjtcbmltcG9ydCB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSBmcm9tIFwiLi91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheS5qc1wiO1xuaW1wb3J0IG5vbkl0ZXJhYmxlU3ByZWFkIGZyb20gXCIuL25vbkl0ZXJhYmxlU3ByZWFkLmpzXCI7XG5mdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkocikge1xuICByZXR1cm4gYXJyYXlXaXRob3V0SG9sZXMocikgfHwgaXRlcmFibGVUb0FycmF5KHIpIHx8IHVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KHIpIHx8IG5vbkl0ZXJhYmxlU3ByZWFkKCk7XG59XG5leHBvcnQgeyBfdG9Db25zdW1hYmxlQXJyYXkgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBfdHlwZW9mIGZyb20gXCIuL3R5cGVvZi5qc1wiO1xuZnVuY3Rpb24gdG9QcmltaXRpdmUodCwgcikge1xuICBpZiAoXCJvYmplY3RcIiAhPSBfdHlwZW9mKHQpIHx8ICF0KSByZXR1cm4gdDtcbiAgdmFyIGUgPSB0W1N5bWJvbC50b1ByaW1pdGl2ZV07XG4gIGlmICh2b2lkIDAgIT09IGUpIHtcbiAgICB2YXIgaSA9IGUuY2FsbCh0LCByIHx8IFwiZGVmYXVsdFwiKTtcbiAgICBpZiAoXCJvYmplY3RcIiAhPSBfdHlwZW9mKGkpKSByZXR1cm4gaTtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS5cIik7XG4gIH1cbiAgcmV0dXJuIChcInN0cmluZ1wiID09PSByID8gU3RyaW5nIDogTnVtYmVyKSh0KTtcbn1cbmV4cG9ydCB7IHRvUHJpbWl0aXZlIGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiLi90eXBlb2YuanNcIjtcbmltcG9ydCB0b1ByaW1pdGl2ZSBmcm9tIFwiLi90b1ByaW1pdGl2ZS5qc1wiO1xuZnVuY3Rpb24gdG9Qcm9wZXJ0eUtleSh0KSB7XG4gIHZhciBpID0gdG9QcmltaXRpdmUodCwgXCJzdHJpbmdcIik7XG4gIHJldHVybiBcInN5bWJvbFwiID09IF90eXBlb2YoaSkgPyBpIDogaSArIFwiXCI7XG59XG5leHBvcnQgeyB0b1Byb3BlcnR5S2V5IGFzIGRlZmF1bHQgfTsiLCJmdW5jdGlvbiBfdHlwZW9mKG8pIHtcbiAgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiO1xuXG4gIHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG8pIHtcbiAgICByZXR1cm4gdHlwZW9mIG87XG4gIH0gOiBmdW5jdGlvbiAobykge1xuICAgIHJldHVybiBvICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG8uY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvO1xuICB9LCBfdHlwZW9mKG8pO1xufVxuZXhwb3J0IHsgX3R5cGVvZiBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IGFycmF5TGlrZVRvQXJyYXkgZnJvbSBcIi4vYXJyYXlMaWtlVG9BcnJheS5qc1wiO1xuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KHIsIGEpIHtcbiAgaWYgKHIpIHtcbiAgICBpZiAoXCJzdHJpbmdcIiA9PSB0eXBlb2YgcikgcmV0dXJuIGFycmF5TGlrZVRvQXJyYXkociwgYSk7XG4gICAgdmFyIHQgPSB7fS50b1N0cmluZy5jYWxsKHIpLnNsaWNlKDgsIC0xKTtcbiAgICByZXR1cm4gXCJPYmplY3RcIiA9PT0gdCAmJiByLmNvbnN0cnVjdG9yICYmICh0ID0gci5jb25zdHJ1Y3Rvci5uYW1lKSwgXCJNYXBcIiA9PT0gdCB8fCBcIlNldFwiID09PSB0ID8gQXJyYXkuZnJvbShyKSA6IFwiQXJndW1lbnRzXCIgPT09IHQgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QodCkgPyBhcnJheUxpa2VUb0FycmF5KHIsIGEpIDogdm9pZCAwO1xuICB9XG59XG5leHBvcnQgeyBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkgYXMgZGVmYXVsdCB9OyIsIi8qKlxuICogUmVnRXhwIHRvIG1hdGNoIGNvb2tpZS1uYW1lIGluIFJGQyA2MjY1IHNlYyA0LjEuMVxuICogVGhpcyByZWZlcnMgb3V0IHRvIHRoZSBvYnNvbGV0ZWQgZGVmaW5pdGlvbiBvZiB0b2tlbiBpbiBSRkMgMjYxNiBzZWMgMi4yXG4gKiB3aGljaCBoYXMgYmVlbiByZXBsYWNlZCBieSB0aGUgdG9rZW4gZGVmaW5pdGlvbiBpbiBSRkMgNzIzMCBhcHBlbmRpeCBCLlxuICpcbiAqIGNvb2tpZS1uYW1lICAgICAgID0gdG9rZW5cbiAqIHRva2VuICAgICAgICAgICAgID0gMSp0Y2hhclxuICogdGNoYXIgICAgICAgICAgICAgPSBcIiFcIiAvIFwiI1wiIC8gXCIkXCIgLyBcIiVcIiAvIFwiJlwiIC8gXCInXCIgL1xuICogICAgICAgICAgICAgICAgICAgICBcIipcIiAvIFwiK1wiIC8gXCItXCIgLyBcIi5cIiAvIFwiXlwiIC8gXCJfXCIgL1xuICogICAgICAgICAgICAgICAgICAgICBcImBcIiAvIFwifFwiIC8gXCJ+XCIgLyBESUdJVCAvIEFMUEhBXG4gKlxuICogTm90ZTogQWxsb3dpbmcgbW9yZSBjaGFyYWN0ZXJzIC0gaHR0cHM6Ly9naXRodWIuY29tL2pzaHR0cC9jb29raWUvaXNzdWVzLzE5MVxuICogQWxsb3cgc2FtZSByYW5nZSBhcyBjb29raWUgdmFsdWUsIGV4Y2VwdCBgPWAsIHdoaWNoIGRlbGltaXRzIGVuZCBvZiBuYW1lLlxuICovXG5jb25zdCBjb29raWVOYW1lUmVnRXhwID0gL15bXFx1MDAyMS1cXHUwMDNBXFx1MDAzQ1xcdTAwM0UtXFx1MDA3RV0rJC87XG5cbi8qKlxuICogUmVnRXhwIHRvIG1hdGNoIGNvb2tpZS12YWx1ZSBpbiBSRkMgNjI2NSBzZWMgNC4xLjFcbiAqXG4gKiBjb29raWUtdmFsdWUgICAgICA9ICpjb29raWUtb2N0ZXQgLyAoIERRVU9URSAqY29va2llLW9jdGV0IERRVU9URSApXG4gKiBjb29raWUtb2N0ZXQgICAgICA9ICV4MjEgLyAleDIzLTJCIC8gJXgyRC0zQSAvICV4M0MtNUIgLyAleDVELTdFXG4gKiAgICAgICAgICAgICAgICAgICAgIDsgVVMtQVNDSUkgY2hhcmFjdGVycyBleGNsdWRpbmcgQ1RMcyxcbiAqICAgICAgICAgICAgICAgICAgICAgOyB3aGl0ZXNwYWNlIERRVU9URSwgY29tbWEsIHNlbWljb2xvbixcbiAqICAgICAgICAgICAgICAgICAgICAgOyBhbmQgYmFja3NsYXNoXG4gKlxuICogQWxsb3dpbmcgbW9yZSBjaGFyYWN0ZXJzOiBodHRwczovL2dpdGh1Yi5jb20vanNodHRwL2Nvb2tpZS9pc3N1ZXMvMTkxXG4gKiBDb21tYSwgYmFja3NsYXNoLCBhbmQgRFFVT1RFIGFyZSBub3QgcGFydCBvZiB0aGUgcGFyc2luZyBhbGdvcml0aG0uXG4gKi9cbmNvbnN0IGNvb2tpZVZhbHVlUmVnRXhwID0gL15bXFx1MDAyMS1cXHUwMDNBXFx1MDAzQy1cXHUwMDdFXSokLztcblxuLyoqXG4gKiBSZWdFeHAgdG8gbWF0Y2ggZG9tYWluLXZhbHVlIGluIFJGQyA2MjY1IHNlYyA0LjEuMVxuICpcbiAqIGRvbWFpbi12YWx1ZSAgICAgID0gPHN1YmRvbWFpbj5cbiAqICAgICAgICAgICAgICAgICAgICAgOyBkZWZpbmVkIGluIFtSRkMxMDM0XSwgU2VjdGlvbiAzLjUsIGFzXG4gKiAgICAgICAgICAgICAgICAgICAgIDsgZW5oYW5jZWQgYnkgW1JGQzExMjNdLCBTZWN0aW9uIDIuMVxuICogPHN1YmRvbWFpbj4gICAgICAgPSA8bGFiZWw+IHwgPHN1YmRvbWFpbj4gXCIuXCIgPGxhYmVsPlxuICogPGxhYmVsPiAgICAgICAgICAgPSA8bGV0LWRpZz4gWyBbIDxsZGgtc3RyPiBdIDxsZXQtZGlnPiBdXG4gKiAgICAgICAgICAgICAgICAgICAgIExhYmVscyBtdXN0IGJlIDYzIGNoYXJhY3RlcnMgb3IgbGVzcy5cbiAqICAgICAgICAgICAgICAgICAgICAgJ2xldC1kaWcnIG5vdCAnbGV0dGVyJyBpbiB0aGUgZmlyc3QgY2hhciwgcGVyIFJGQzExMjNcbiAqIDxsZGgtc3RyPiAgICAgICAgID0gPGxldC1kaWctaHlwPiB8IDxsZXQtZGlnLWh5cD4gPGxkaC1zdHI+XG4gKiA8bGV0LWRpZy1oeXA+ICAgICA9IDxsZXQtZGlnPiB8IFwiLVwiXG4gKiA8bGV0LWRpZz4gICAgICAgICA9IDxsZXR0ZXI+IHwgPGRpZ2l0PlxuICogPGxldHRlcj4gICAgICAgICAgPSBhbnkgb25lIG9mIHRoZSA1MiBhbHBoYWJldGljIGNoYXJhY3RlcnMgQSB0aHJvdWdoIFogaW5cbiAqICAgICAgICAgICAgICAgICAgICAgdXBwZXIgY2FzZSBhbmQgYSB0aHJvdWdoIHogaW4gbG93ZXIgY2FzZVxuICogPGRpZ2l0PiAgICAgICAgICAgPSBhbnkgb25lIG9mIHRoZSB0ZW4gZGlnaXRzIDAgdGhyb3VnaCA5XG4gKlxuICogS2VlcCBzdXBwb3J0IGZvciBsZWFkaW5nIGRvdDogaHR0cHM6Ly9naXRodWIuY29tL2pzaHR0cC9jb29raWUvaXNzdWVzLzE3M1xuICpcbiAqID4gKE5vdGUgdGhhdCBhIGxlYWRpbmcgJXgyRSAoXCIuXCIpLCBpZiBwcmVzZW50LCBpcyBpZ25vcmVkIGV2ZW4gdGhvdWdoIHRoYXRcbiAqIGNoYXJhY3RlciBpcyBub3QgcGVybWl0dGVkLCBidXQgYSB0cmFpbGluZyAleDJFIChcIi5cIiksIGlmIHByZXNlbnQsIHdpbGxcbiAqIGNhdXNlIHRoZSB1c2VyIGFnZW50IHRvIGlnbm9yZSB0aGUgYXR0cmlidXRlLilcbiAqL1xuY29uc3QgZG9tYWluVmFsdWVSZWdFeHAgPVxuICAvXihbLl0/W2EtejAtOV0oW2EtejAtOS1dezAsNjF9W2EtejAtOV0pPykoWy5dW2EtejAtOV0oW2EtejAtOS1dezAsNjF9W2EtejAtOV0pPykqJC9pO1xuXG4vKipcbiAqIFJlZ0V4cCB0byBtYXRjaCBwYXRoLXZhbHVlIGluIFJGQyA2MjY1IHNlYyA0LjEuMVxuICpcbiAqIHBhdGgtdmFsdWUgICAgICAgID0gPGFueSBDSEFSIGV4Y2VwdCBDVExzIG9yIFwiO1wiPlxuICogQ0hBUiAgICAgICAgICAgICAgPSAleDAxLTdGXG4gKiAgICAgICAgICAgICAgICAgICAgIDsgZGVmaW5lZCBpbiBSRkMgNTIzNCBhcHBlbmRpeCBCLjFcbiAqL1xuY29uc3QgcGF0aFZhbHVlUmVnRXhwID0gL15bXFx1MDAyMC1cXHUwMDNBXFx1MDAzRC1cXHUwMDdFXSokLztcblxuLyoqXG4gKiBSZWdFeHAgdG8gbWF0Y2ggbWF4LWFnZS12YWx1ZSBpbiBSRkMgNjI2NSBzZWMgNS42LjJcbiAqL1xuY29uc3QgbWF4QWdlUmVnRXhwID0gL14tP1xcZCskLztcblxuLyoqXG4gKiBSZWdFeHAgdG8gbWF0Y2ggUkZDIDYyNjUgY29va2llLW9jdGV0IHZhbHVlcyAod2l0aG91dCAlIHRvIHByZXNlcnZlIHJvdW5kdHJpcCkgdGhhdCBuZWVkIG5vIFVSTCBlbmNvZGluZy5cbiAqL1xuY29uc3QgY29va2llT2N0ZXRSZWdFeHAgPSAvXlshIyQmJygpKitcXC0uXFwvMC05Ojw9Pj9AQS1aW1xcXVxcXl9gYS16e3x9fl0qJC87XG5cbmNvbnN0IE51bGxPYmplY3QgPSAvKiBAX19QVVJFX18gKi8gKCgpID0+IHtcbiAgY29uc3QgQyA9IGZ1bmN0aW9uICgpIHt9O1xuICBDLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHJldHVybiBDO1xufSkoKSBhcyB1bmtub3duIGFzIHsgbmV3ICgpOiBhbnkgfTtcblxuLyoqXG4gKiBQYXJzZSBvcHRpb25zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgYSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCB0byBkZWNvZGUgYSBbY29va2llLXZhbHVlXShodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzYyNjUjc2VjdGlvbi00LjEuMSkuXG4gICAqIFNpbmNlIHRoZSB2YWx1ZSBvZiBhIGNvb2tpZSBoYXMgYSBsaW1pdGVkIGNoYXJhY3RlciBzZXQgKGFuZCBtdXN0IGJlIGEgc2ltcGxlIHN0cmluZyksIHRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZGVjb2RlXG4gICAqIGEgcHJldmlvdXNseS1lbmNvZGVkIGNvb2tpZSB2YWx1ZSBpbnRvIGEgSmF2YVNjcmlwdCBzdHJpbmcuXG4gICAqXG4gICAqIFRoZSBkZWZhdWx0IGZ1bmN0aW9uIGlzIHRoZSBnbG9iYWwgYGRlY29kZVVSSUNvbXBvbmVudGAsIHdyYXBwZWQgaW4gYSBgdHJ5Li5jYXRjaGAuIElmIGFuIGVycm9yXG4gICAqIGlzIHRocm93biBpdCB3aWxsIHJldHVybiB0aGUgY29va2llJ3Mgb3JpZ2luYWwgdmFsdWUuIElmIHlvdSBwcm92aWRlIHlvdXIgb3duIGVuY29kZS9kZWNvZGVcbiAgICogc2NoZW1lIHlvdSBtdXN0IGVuc3VyZSBlcnJvcnMgYXJlIGFwcHJvcHJpYXRlbHkgaGFuZGxlZC4gQ3VzdG9tIGRlY29kZSBmdW5jdGlvbnMgY2FuIHJldHVybiBgdW5kZWZpbmVkYCxcbiAgICogd2hpY2ggd2lsbCBza2lwIHRoZSBjb29raWUgZHVyaW5nIGBwYXJzZWAgYW5kIHRyeSBhZ2FpbiB3aXRoIGEgZnV0dXJlIGNvb2tpZSBvZiB0aGUgc2FtZSBuYW1lLlxuICAgKlxuICAgKiBAZGVmYXVsdCBkZWNvZGVcbiAgICovXG4gIGRlY29kZT86IChzdHI6IHN0cmluZykgPT4gc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIENvb2tpZXMgb2JqZWN0LlxuICovXG5leHBvcnQgdHlwZSBDb29raWVzID0gUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPjtcblxuLyoqXG4gKiBQYXJzZSBhIGBDb29raWVgIGhlYWRlci5cbiAqXG4gKiBQYXJzZSB0aGUgZ2l2ZW4gY29va2llIGhlYWRlciBzdHJpbmcgaW50byBhbiBvYmplY3RcbiAqIFRoZSBvYmplY3QgaGFzIHRoZSB2YXJpb3VzIGNvb2tpZXMgYXMga2V5cyhuYW1lcykgPT4gdmFsdWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNvb2tpZShzdHI6IHN0cmluZywgb3B0aW9ucz86IFBhcnNlT3B0aW9ucyk6IENvb2tpZXMge1xuICBjb25zdCBvYmo6IENvb2tpZXMgPSBuZXcgTnVsbE9iamVjdCgpO1xuICBjb25zdCBsZW4gPSBzdHIubGVuZ3RoO1xuICAvLyBSRkMgNjI2NSBzZWMgNC4xLjEsIFJGQyAyNjE2IDIuMiBkZWZpbmVzIGEgY29va2llIG5hbWUgY29uc2lzdHMgb2Ygb25lIGNoYXIgbWluaW11bSwgcGx1cyAnPScuXG4gIGlmIChsZW4gPCAyKSByZXR1cm4gb2JqO1xuXG4gIGNvbnN0IGRlYyA9IG9wdGlvbnM/LmRlY29kZSB8fCBkZWNvZGU7XG4gIGxldCBpbmRleCA9IDA7XG5cbiAgZG8ge1xuICAgIGNvbnN0IGVxSWR4ID0gZXFJbmRleChzdHIsIGluZGV4LCBsZW4pO1xuICAgIGlmIChlcUlkeCA9PT0gbGVuKSBicmVhazsgLy8gTm8gbW9yZSBjb29raWUgcGFpcnMuXG5cbiAgICBjb25zdCBlbmRJZHggPSBlbmRJbmRleChzdHIsIGluZGV4LCBsZW4pO1xuXG4gICAgaWYgKGVxSWR4ID4gZW5kSWR4KSB7XG4gICAgICAvLyBiYWNrdHJhY2sgb24gcHJpb3Igc2VtaWNvbG9uXG4gICAgICBpbmRleCA9IHN0ci5sYXN0SW5kZXhPZihcIjtcIiwgZXFJZHggLSAxKSArIDE7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBrZXkgPSB2YWx1ZVNsaWNlKHN0ciwgaW5kZXgsIGVxSWR4KTtcblxuICAgIC8vIG9ubHkgYXNzaWduIG9uY2VcbiAgICBpZiAob2JqW2tleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgb2JqW2tleV0gPSBkZWModmFsdWVTbGljZShzdHIsIGVxSWR4ICsgMSwgZW5kSWR4KSk7XG4gICAgfVxuXG4gICAgaW5kZXggPSBlbmRJZHggKyAxO1xuICB9IHdoaWxlIChpbmRleCA8IGxlbik7XG5cbiAgcmV0dXJuIG9iajtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdHJpbmdpZnlPcHRpb25zIHtcbiAgLyoqXG4gICAqIFNwZWNpZmllcyBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGVuY29kZSBhIFtjb29raWUtdmFsdWVdKGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjNjI2NSNzZWN0aW9uLTQuMS4xKS5cbiAgICogU2luY2UgdmFsdWUgb2YgYSBjb29raWUgaGFzIGEgbGltaXRlZCBjaGFyYWN0ZXIgc2V0IChhbmQgbXVzdCBiZSBhIHNpbXBsZSBzdHJpbmcpLCB0aGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGVuY29kZVxuICAgKiBhIHZhbHVlIGludG8gYSBzdHJpbmcgc3VpdGVkIGZvciBhIGNvb2tpZSdzIHZhbHVlLCBhbmQgc2hvdWxkIG1pcnJvciBgZGVjb2RlYCB3aGVuIHBhcnNpbmcuXG4gICAqIFRoZSBkZWZhdWx0IGZ1bmN0aW9uIHByZXNlcnZlcyByb3VuZHRyaXAtc2FmZSBjb29raWUtb2N0ZXQgdmFsdWVzIGFuZCB1c2VzIGBlbmNvZGVVUklDb21wb25lbnRgIG90aGVyd2lzZS5cbiAgICovXG4gIGVuY29kZT86IChzdHI6IHN0cmluZykgPT4gc3RyaW5nO1xufVxuXG4vKipcbiAqIFN0cmluZ2lmaWVzIGFuIG9iamVjdCBpbnRvIGFuIEhUVFAgYENvb2tpZWAgaGVhZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5naWZ5Q29va2llKFxuICBjb29raWU6IENvb2tpZXMsXG4gIG9wdGlvbnM/OiBTdHJpbmdpZnlPcHRpb25zLFxuKTogc3RyaW5nIHtcbiAgY29uc3QgZW5jID0gb3B0aW9ucz8uZW5jb2RlIHx8IGRlZmF1bHRFbmNvZGU7XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhjb29raWUpO1xuICBsZXQgc3RyID0gXCJcIjtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBuYW1lID0ga2V5c1tpXTtcbiAgICBjb25zdCB2YWwgPSBjb29raWVbbmFtZV07XG4gICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcblxuICAgIGlmICghY29va2llTmFtZVJlZ0V4cC50ZXN0KG5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBjb29raWUgbmFtZSBpcyBpbnZhbGlkOiAke25hbWV9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSBlbmModmFsKTtcblxuICAgIGlmICghY29va2llVmFsdWVSZWdFeHAudGVzdCh2YWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYGNvb2tpZSB2YWwgaXMgaW52YWxpZDogJHt2YWx9YCk7XG4gICAgfVxuXG4gICAgaWYgKHN0cikgc3RyICs9IFwiOyBcIjtcbiAgICBzdHIgKz0gbmFtZSArIFwiPVwiICsgdmFsdWU7XG4gIH1cblxuICByZXR1cm4gc3RyO1xufVxuXG4vKipcbiAqIFNldC1Db29raWUgb2JqZWN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNldENvb2tpZSB7XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIGNvb2tpZS5cbiAgICovXG4gIG5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgc3RyaW5nIHRvIGJlIHRoZSB2YWx1ZSBmb3IgdGhlIGNvb2tpZS5cbiAgICovXG4gIHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIGBudW1iZXJgIChpbiBzZWNvbmRzKSB0byBiZSB0aGUgdmFsdWUgZm9yIHRoZSBbYE1heC1BZ2VgIGBTZXQtQ29va2llYCBhdHRyaWJ1dGVdKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2MjY1I3NlY3Rpb24tNS4yLjIpLlxuICAgKlxuICAgKiBUaGUgW2Nvb2tpZSBzdG9yYWdlIG1vZGVsIHNwZWNpZmljYXRpb25dKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2MjY1I3NlY3Rpb24tNS4zKSBzdGF0ZXMgdGhhdCBpZiBib3RoIGBleHBpcmVzYCBhbmRcbiAgICogYG1heEFnZWAgYXJlIHNldCwgdGhlbiBgbWF4QWdlYCB0YWtlcyBwcmVjZWRlbmNlLCBidXQgaXQgaXMgcG9zc2libGUgbm90IGFsbCBjbGllbnRzIGJ5IG9iZXkgdGhpcyxcbiAgICogc28gaWYgYm90aCBhcmUgc2V0LCB0aGV5IHNob3VsZCBwb2ludCB0byB0aGUgc2FtZSBkYXRlIGFuZCB0aW1lLlxuICAgKi9cbiAgbWF4QWdlPzogbnVtYmVyO1xuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBgRGF0ZWAgb2JqZWN0IHRvIGJlIHRoZSB2YWx1ZSBmb3IgdGhlIFtgRXhwaXJlc2AgYFNldC1Db29raWVgIGF0dHJpYnV0ZV0oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzYyNjUjc2VjdGlvbi01LjIuMSkuXG4gICAqIFdoZW4gbm8gZXhwaXJhdGlvbiBpcyBzZXQsIGNsaWVudHMgY29uc2lkZXIgdGhpcyBhIFwibm9uLXBlcnNpc3RlbnQgY29va2llXCIgYW5kIGRlbGV0ZSBpdCB3aGVuIHRoZSBjdXJyZW50IHNlc3Npb24gaXMgb3Zlci5cbiAgICpcbiAgICogVGhlIFtjb29raWUgc3RvcmFnZSBtb2RlbCBzcGVjaWZpY2F0aW9uXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjI2NSNzZWN0aW9uLTUuMykgc3RhdGVzIHRoYXQgaWYgYm90aCBgZXhwaXJlc2AgYW5kXG4gICAqIGBtYXhBZ2VgIGFyZSBzZXQsIHRoZW4gYG1heEFnZWAgdGFrZXMgcHJlY2VkZW5jZSwgYnV0IGl0IGlzIHBvc3NpYmxlIG5vdCBhbGwgY2xpZW50cyBieSBvYmV5IHRoaXMsXG4gICAqIHNvIGlmIGJvdGggYXJlIHNldCwgdGhleSBzaG91bGQgcG9pbnQgdG8gdGhlIHNhbWUgZGF0ZSBhbmQgdGltZS5cbiAgICovXG4gIGV4cGlyZXM/OiBEYXRlO1xuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSB2YWx1ZSBmb3IgdGhlIFtgRG9tYWluYCBgU2V0LUNvb2tpZWAgYXR0cmlidXRlXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjI2NSNzZWN0aW9uLTUuMi4zKS5cbiAgICogV2hlbiBubyBkb21haW4gaXMgc2V0LCBjbGllbnRzIGNvbnNpZGVyIHRoZSBjb29raWUgdG8gYXBwbHkgdG8gdGhlIGN1cnJlbnQgZG9tYWluIG9ubHkuXG4gICAqL1xuICBkb21haW4/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIHZhbHVlIGZvciB0aGUgW2BQYXRoYCBgU2V0LUNvb2tpZWAgYXR0cmlidXRlXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjI2NSNzZWN0aW9uLTUuMi40KS5cbiAgICogV2hlbiBubyBwYXRoIGlzIHNldCwgdGhlIHBhdGggaXMgY29uc2lkZXJlZCB0aGUgW1wiZGVmYXVsdCBwYXRoXCJdKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2MjY1I3NlY3Rpb24tNS4xLjQpLlxuICAgKi9cbiAgcGF0aD86IHN0cmluZztcbiAgLyoqXG4gICAqIEVuYWJsZXMgdGhlIFtgSHR0cE9ubHlgIGBTZXQtQ29va2llYCBhdHRyaWJ1dGVdKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2MjY1I3NlY3Rpb24tNS4yLjYpLlxuICAgKiBXaGVuIGVuYWJsZWQsIGNsaWVudHMgd2lsbCBub3QgYWxsb3cgY2xpZW50LXNpZGUgSmF2YVNjcmlwdCB0byBzZWUgdGhlIGNvb2tpZSBpbiBgZG9jdW1lbnQuY29va2llYC5cbiAgICovXG4gIGh0dHBPbmx5PzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEVuYWJsZXMgdGhlIFtgU2VjdXJlYCBgU2V0LUNvb2tpZWAgYXR0cmlidXRlXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjI2NSNzZWN0aW9uLTUuMi41KS5cbiAgICogV2hlbiBlbmFibGVkLCBjbGllbnRzIHdpbGwgb25seSBzZW5kIHRoZSBjb29raWUgYmFjayBpZiB0aGUgYnJvd3NlciBoYXMgYW4gSFRUUFMgY29ubmVjdGlvbi5cbiAgICovXG4gIHNlY3VyZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBFbmFibGVzIHRoZSBbYFBhcnRpdGlvbmVkYCBgU2V0LUNvb2tpZWAgYXR0cmlidXRlXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtY3V0bGVyLWh0dHBiaXMtcGFydGl0aW9uZWQtY29va2llcy8pLlxuICAgKiBXaGVuIGVuYWJsZWQsIGNsaWVudHMgd2lsbCBvbmx5IHNlbmQgdGhlIGNvb2tpZSBiYWNrIHdoZW4gdGhlIGN1cnJlbnQgZG9tYWluIF9hbmRfIHRvcC1sZXZlbCBkb21haW4gbWF0Y2hlcy5cbiAgICpcbiAgICogVGhpcyBpcyBhbiBhdHRyaWJ1dGUgdGhhdCBoYXMgbm90IHlldCBiZWVuIGZ1bGx5IHN0YW5kYXJkaXplZCwgYW5kIG1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS5cbiAgICogVGhpcyBhbHNvIG1lYW5zIGNsaWVudHMgbWF5IGlnbm9yZSB0aGlzIGF0dHJpYnV0ZSB1bnRpbCB0aGV5IHVuZGVyc3RhbmQgaXQuIE1vcmUgaW5mb3JtYXRpb25cbiAgICogYWJvdXQgY2FuIGJlIGZvdW5kIGluIFt0aGUgcHJvcG9zYWxdKGh0dHBzOi8vZ2l0aHViLmNvbS9wcml2YWN5Y2cvQ0hJUFMpLlxuICAgKi9cbiAgcGFydGl0aW9uZWQ/OiBib29sZWFuO1xuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSB2YWx1ZSBmb3IgdGhlIFtgUHJpb3JpdHlgIGBTZXQtQ29va2llYCBhdHRyaWJ1dGVdKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9kcmFmdC13ZXN0LWNvb2tpZS1wcmlvcml0eS0wMCNzZWN0aW9uLTQuMSkuXG4gICAqXG4gICAqIC0gYCdsb3cnYCB3aWxsIHNldCB0aGUgYFByaW9yaXR5YCBhdHRyaWJ1dGUgdG8gYExvd2AuXG4gICAqIC0gYCdtZWRpdW0nYCB3aWxsIHNldCB0aGUgYFByaW9yaXR5YCBhdHRyaWJ1dGUgdG8gYE1lZGl1bWAsIHRoZSBkZWZhdWx0IHByaW9yaXR5IHdoZW4gbm90IHNldC5cbiAgICogLSBgJ2hpZ2gnYCB3aWxsIHNldCB0aGUgYFByaW9yaXR5YCBhdHRyaWJ1dGUgdG8gYEhpZ2hgLlxuICAgKlxuICAgKiBNb3JlIGluZm9ybWF0aW9uIGFib3V0IHByaW9yaXR5IGxldmVscyBjYW4gYmUgZm91bmQgaW4gW3RoZSBzcGVjaWZpY2F0aW9uXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtd2VzdC1jb29raWUtcHJpb3JpdHktMDAjc2VjdGlvbi00LjEpLlxuICAgKi9cbiAgcHJpb3JpdHk/OiBcImxvd1wiIHwgXCJtZWRpdW1cIiB8IFwiaGlnaFwiO1xuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSB2YWx1ZSBmb3IgdGhlIFtgU2FtZVNpdGVgIGBTZXQtQ29va2llYCBhdHRyaWJ1dGVdKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9kcmFmdC1pZXRmLWh0dHBiaXMtcmZjNjI2NWJpcy0wOSNzZWN0aW9uLTUuNC43KS5cbiAgICpcbiAgICogLSBgdHJ1ZWAgd2lsbCBzZXQgdGhlIGBTYW1lU2l0ZWAgYXR0cmlidXRlIHRvIGBTdHJpY3RgIGZvciBzdHJpY3Qgc2FtZSBzaXRlIGVuZm9yY2VtZW50LlxuICAgKiAtIGAnbGF4J2Agd2lsbCBzZXQgdGhlIGBTYW1lU2l0ZWAgYXR0cmlidXRlIHRvIGBMYXhgIGZvciBsYXggc2FtZSBzaXRlIGVuZm9yY2VtZW50LlxuICAgKiAtIGAnbm9uZSdgIHdpbGwgc2V0IHRoZSBgU2FtZVNpdGVgIGF0dHJpYnV0ZSB0byBgTm9uZWAgZm9yIGFuIGV4cGxpY2l0IGNyb3NzLXNpdGUgY29va2llLlxuICAgKiAtIGAnc3RyaWN0J2Agd2lsbCBzZXQgdGhlIGBTYW1lU2l0ZWAgYXR0cmlidXRlIHRvIGBTdHJpY3RgIGZvciBzdHJpY3Qgc2FtZSBzaXRlIGVuZm9yY2VtZW50LlxuICAgKlxuICAgKiBNb3JlIGluZm9ybWF0aW9uIGFib3V0IGVuZm9yY2VtZW50IGxldmVscyBjYW4gYmUgZm91bmQgaW4gW3RoZSBzcGVjaWZpY2F0aW9uXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtaWV0Zi1odHRwYmlzLXJmYzYyNjViaXMtMDkjc2VjdGlvbi01LjQuNykuXG4gICAqL1xuICBzYW1lU2l0ZT86IGJvb2xlYW4gfCBcImxheFwiIHwgXCJzdHJpY3RcIiB8IFwibm9uZVwiO1xufVxuXG4vKipcbiAqIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkgc2VyaWFsaXplIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCB0eXBlIFNlcmlhbGl6ZU9wdGlvbnMgPSBTdHJpbmdpZnlPcHRpb25zICZcbiAgT21pdDxTZXRDb29raWUsIFwibmFtZVwiIHwgXCJ2YWx1ZVwiPjtcblxuLyoqXG4gKiBTZXJpYWxpemUgZGF0YSBpbnRvIGEgY29va2llIGhlYWRlci5cbiAqXG4gKiBTZXJpYWxpemUgYSBuYW1lIHZhbHVlIHBhaXIgaW50byBhIGNvb2tpZSBzdHJpbmcgc3VpdGFibGUgZm9yXG4gKiBodHRwIGhlYWRlcnMuIEFuIG9wdGlvbmFsIG9wdGlvbnMgb2JqZWN0IHNwZWNpZmllcyBjb29raWUgcGFyYW1ldGVycy5cbiAqXG4gKiBzdHJpbmdpZnlTZXRDb29raWUoeyBuYW1lOiAnZm9vJywgdmFsdWU6ICdiYXInLCBodHRwT25seTogdHJ1ZSB9KVxuICogICA9PiBcImZvbz1iYXI7IEh0dHBPbmx5XCJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ2lmeVNldENvb2tpZShcbiAgY29va2llOiBTZXRDb29raWUsXG4gIG9wdGlvbnM/OiBTdHJpbmdpZnlPcHRpb25zLFxuKTogc3RyaW5nIHtcbiAgY29uc3QgZW5jID0gb3B0aW9ucz8uZW5jb2RlIHx8IGRlZmF1bHRFbmNvZGU7XG5cbiAgaWYgKCFjb29raWVOYW1lUmVnRXhwLnRlc3QoY29va2llLm5hbWUpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgYXJndW1lbnQgbmFtZSBpcyBpbnZhbGlkOiAke2Nvb2tpZS5uYW1lfWApO1xuICB9XG5cbiAgY29uc3QgdmFsdWUgPSBjb29raWUudmFsdWUgPT0gbnVsbCA/IFwiXCIgOiBlbmMoY29va2llLnZhbHVlKTtcblxuICBpZiAoIWNvb2tpZVZhbHVlUmVnRXhwLnRlc3QodmFsdWUpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgYXJndW1lbnQgdmFsIGlzIGludmFsaWQ6ICR7Y29va2llLnZhbHVlfWApO1xuICB9XG5cbiAgbGV0IHN0ciA9IGNvb2tpZS5uYW1lICsgXCI9XCIgKyB2YWx1ZTtcblxuICBpZiAoY29va2llLm1heEFnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGNvb2tpZS5tYXhBZ2UpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBvcHRpb24gbWF4QWdlIGlzIGludmFsaWQ6ICR7Y29va2llLm1heEFnZX1gKTtcbiAgICB9XG5cbiAgICBzdHIgKz0gXCI7IE1heC1BZ2U9XCIgKyBjb29raWUubWF4QWdlO1xuICB9XG5cbiAgaWYgKGNvb2tpZS5kb21haW4pIHtcbiAgICBpZiAoIWRvbWFpblZhbHVlUmVnRXhwLnRlc3QoY29va2llLmRvbWFpbikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYG9wdGlvbiBkb21haW4gaXMgaW52YWxpZDogJHtjb29raWUuZG9tYWlufWApO1xuICAgIH1cblxuICAgIHN0ciArPSBcIjsgRG9tYWluPVwiICsgY29va2llLmRvbWFpbjtcbiAgfVxuXG4gIGlmIChjb29raWUucGF0aCkge1xuICAgIGlmICghcGF0aFZhbHVlUmVnRXhwLnRlc3QoY29va2llLnBhdGgpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBvcHRpb24gcGF0aCBpcyBpbnZhbGlkOiAke2Nvb2tpZS5wYXRofWApO1xuICAgIH1cblxuICAgIHN0ciArPSBcIjsgUGF0aD1cIiArIGNvb2tpZS5wYXRoO1xuICB9XG5cbiAgaWYgKGNvb2tpZS5leHBpcmVzKSB7XG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoY29va2llLmV4cGlyZXMudmFsdWVPZigpKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgb3B0aW9uIGV4cGlyZXMgaXMgaW52YWxpZDogJHtjb29raWUuZXhwaXJlc31gKTtcbiAgICB9XG5cbiAgICBzdHIgKz0gXCI7IEV4cGlyZXM9XCIgKyBjb29raWUuZXhwaXJlcy50b1VUQ1N0cmluZygpO1xuICB9XG5cbiAgaWYgKGNvb2tpZS5odHRwT25seSkge1xuICAgIHN0ciArPSBcIjsgSHR0cE9ubHlcIjtcbiAgfVxuXG4gIGlmIChjb29raWUuc2VjdXJlKSB7XG4gICAgc3RyICs9IFwiOyBTZWN1cmVcIjtcbiAgfVxuXG4gIGlmIChjb29raWUucGFydGl0aW9uZWQpIHtcbiAgICBzdHIgKz0gXCI7IFBhcnRpdGlvbmVkXCI7XG4gIH1cblxuICBpZiAoY29va2llLnByaW9yaXR5KSB7XG4gICAgY29uc3QgcHJpb3JpdHkgPVxuICAgICAgdHlwZW9mIGNvb2tpZS5wcmlvcml0eSA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IGNvb2tpZS5wcmlvcml0eS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIHN3aXRjaCAocHJpb3JpdHkpIHtcbiAgICAgIGNhc2UgXCJsb3dcIjpcbiAgICAgICAgc3RyICs9IFwiOyBQcmlvcml0eT1Mb3dcIjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwibWVkaXVtXCI6XG4gICAgICAgIHN0ciArPSBcIjsgUHJpb3JpdHk9TWVkaXVtXCI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImhpZ2hcIjpcbiAgICAgICAgc3RyICs9IFwiOyBQcmlvcml0eT1IaWdoXCI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgb3B0aW9uIHByaW9yaXR5IGlzIGludmFsaWQ6ICR7Y29va2llLnByaW9yaXR5fWApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb29raWUuc2FtZVNpdGUpIHtcbiAgICBjb25zdCBzYW1lU2l0ZSA9XG4gICAgICB0eXBlb2YgY29va2llLnNhbWVTaXRlID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gY29va2llLnNhbWVTaXRlLnRvTG93ZXJDYXNlKClcbiAgICAgICAgOiBjb29raWUuc2FtZVNpdGU7XG4gICAgc3dpdGNoIChzYW1lU2l0ZSkge1xuICAgICAgY2FzZSB0cnVlOlxuICAgICAgY2FzZSBcInN0cmljdFwiOlxuICAgICAgICBzdHIgKz0gXCI7IFNhbWVTaXRlPVN0cmljdFwiO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJsYXhcIjpcbiAgICAgICAgc3RyICs9IFwiOyBTYW1lU2l0ZT1MYXhcIjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwibm9uZVwiOlxuICAgICAgICBzdHIgKz0gXCI7IFNhbWVTaXRlPU5vbmVcIjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBvcHRpb24gc2FtZVNpdGUgaXMgaW52YWxpZDogJHtjb29raWUuc2FtZVNpdGV9YCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN0cjtcbn1cblxuLyoqXG4gKiBEZXNlcmlhbGl6ZSBhIGBTZXQtQ29va2llYCBoZWFkZXIgaW50byBhbiBvYmplY3QuXG4gKlxuICogcGFyc2VTZXRDb29raWUoJ2Zvbz1iYXI7IEh0dHBPbmx5JylcbiAqICAgPT4geyBuYW1lOiAnZm9vJywgdmFsdWU6ICdiYXInLCBodHRwT25seTogdHJ1ZSB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNldENvb2tpZShzdHI6IHN0cmluZywgb3B0aW9ucz86IFBhcnNlT3B0aW9ucyk6IFNldENvb2tpZSB7XG4gIGNvbnN0IGRlYyA9IG9wdGlvbnM/LmRlY29kZSB8fCBkZWNvZGU7XG4gIGNvbnN0IGxlbiA9IHN0ci5sZW5ndGg7XG4gIGNvbnN0IGVuZElkeCA9IGVuZEluZGV4KHN0ciwgMCwgbGVuKTtcbiAgbGV0IGVxSWR4ID0gZXFJbmRleChzdHIsIDAsIGxlbik7XG4gIGNvbnN0IHNldENvb2tpZTogU2V0Q29va2llID1cbiAgICBlcUlkeCA8IGVuZElkeFxuICAgICAgPyB7XG4gICAgICAgICAgbmFtZTogdmFsdWVTbGljZShzdHIsIDAsIGVxSWR4KSxcbiAgICAgICAgICB2YWx1ZTogZGVjKHZhbHVlU2xpY2Uoc3RyLCBlcUlkeCArIDEsIGVuZElkeCkpLFxuICAgICAgICB9XG4gICAgICA6IHsgbmFtZTogXCJcIiwgdmFsdWU6IGRlYyh2YWx1ZVNsaWNlKHN0ciwgMCwgZW5kSWR4KSkgfTtcblxuICBsZXQgaW5kZXggPSBlbmRJZHggKyAxO1xuICB3aGlsZSAoaW5kZXggPCBsZW4pIHtcbiAgICBjb25zdCBlbmRJZHggPSBlbmRJbmRleChzdHIsIGluZGV4LCBsZW4pO1xuICAgIGlmIChlcUlkeCA8IGluZGV4KSBlcUlkeCA9IGVxSW5kZXgoc3RyLCBpbmRleCwgbGVuKTtcblxuICAgIGNvbnN0IGF0dHIgPVxuICAgICAgZXFJZHggPCBlbmRJZHhcbiAgICAgICAgPyB2YWx1ZVNsaWNlKHN0ciwgaW5kZXgsIGVxSWR4KVxuICAgICAgICA6IHZhbHVlU2xpY2Uoc3RyLCBpbmRleCwgZW5kSWR4KTtcbiAgICBjb25zdCB2YWwgPSBlcUlkeCA8IGVuZElkeCA/IHZhbHVlU2xpY2Uoc3RyLCBlcUlkeCArIDEsIGVuZElkeCkgOiB1bmRlZmluZWQ7XG5cbiAgICBzd2l0Y2ggKGF0dHIudG9Mb3dlckNhc2UoKSkge1xuICAgICAgY2FzZSBcImh0dHBvbmx5XCI6XG4gICAgICAgIHNldENvb2tpZS5odHRwT25seSA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInNlY3VyZVwiOlxuICAgICAgICBzZXRDb29raWUuc2VjdXJlID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwicGFydGl0aW9uZWRcIjpcbiAgICAgICAgc2V0Q29va2llLnBhcnRpdGlvbmVkID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiZG9tYWluXCI6XG4gICAgICAgIHNldENvb2tpZS5kb21haW4gPSB2YWw7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInBhdGhcIjpcbiAgICAgICAgc2V0Q29va2llLnBhdGggPSB2YWw7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIm1heC1hZ2VcIjpcbiAgICAgICAgaWYgKHZhbCAmJiBtYXhBZ2VSZWdFeHAudGVzdCh2YWwpKSBzZXRDb29raWUubWF4QWdlID0gTnVtYmVyKHZhbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImV4cGlyZXNcIjpcbiAgICAgICAgaWYgKCF2YWwpIGJyZWFrO1xuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUodmFsKTtcbiAgICAgICAgaWYgKE51bWJlci5pc0Zpbml0ZShkYXRlLnZhbHVlT2YoKSkpIHNldENvb2tpZS5leHBpcmVzID0gZGF0ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwicHJpb3JpdHlcIjpcbiAgICAgICAgaWYgKCF2YWwpIGJyZWFrO1xuICAgICAgICBjb25zdCBwcmlvcml0eSA9IHZhbC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgcHJpb3JpdHkgPT09IFwibG93XCIgfHxcbiAgICAgICAgICBwcmlvcml0eSA9PT0gXCJtZWRpdW1cIiB8fFxuICAgICAgICAgIHByaW9yaXR5ID09PSBcImhpZ2hcIlxuICAgICAgICApIHtcbiAgICAgICAgICBzZXRDb29raWUucHJpb3JpdHkgPSBwcmlvcml0eTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJzYW1lc2l0ZVwiOlxuICAgICAgICBpZiAoIXZhbCkgYnJlYWs7XG4gICAgICAgIGNvbnN0IHNhbWVTaXRlID0gdmFsLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBzYW1lU2l0ZSA9PT0gXCJsYXhcIiB8fFxuICAgICAgICAgIHNhbWVTaXRlID09PSBcInN0cmljdFwiIHx8XG4gICAgICAgICAgc2FtZVNpdGUgPT09IFwibm9uZVwiXG4gICAgICAgICkge1xuICAgICAgICAgIHNldENvb2tpZS5zYW1lU2l0ZSA9IHNhbWVTaXRlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGluZGV4ID0gZW5kSWR4ICsgMTtcbiAgfVxuXG4gIHJldHVybiBzZXRDb29raWU7XG59XG5cbi8qKlxuICogRmluZCB0aGUgbmV4dCBgO2AgY2hhcmFjdGVyLCBvciByZXR1cm4gYGxlbmAuXG4gKi9cbmZ1bmN0aW9uIGVuZEluZGV4KHN0cjogc3RyaW5nLCBtaW46IG51bWJlciwgbGVuOiBudW1iZXIpIHtcbiAgY29uc3QgaW5kZXggPSBzdHIuaW5kZXhPZihcIjtcIiwgbWluKTtcbiAgcmV0dXJuIGluZGV4ID09PSAtMSA/IGxlbiA6IGluZGV4O1xufVxuXG4vKipcbiAqIEZpbmQgdGhlIG5leHQgYD1gIGNoYXJhY3Rlciwgb3IgcmV0dXJuIGBsZW5gLlxuICovXG5mdW5jdGlvbiBlcUluZGV4KHN0cjogc3RyaW5nLCBtaW46IG51bWJlciwgbGVuOiBudW1iZXIpIHtcbiAgY29uc3QgaW5kZXggPSBzdHIuaW5kZXhPZihcIj1cIiwgbWluKTtcbiAgcmV0dXJuIGluZGV4ID09PSAtMSA/IGxlbiA6IGluZGV4O1xufVxuXG4vKipcbiAqIFNsaWNlIG91dCBhIHZhbHVlIGJldHdlZW4gc3RhcnRQb2QgdG8gbWF4LlxuICovXG5mdW5jdGlvbiB2YWx1ZVNsaWNlKHN0cjogc3RyaW5nLCBtaW46IG51bWJlciwgbWF4OiBudW1iZXIpIHtcbiAgaWYgKG1pbiA9PT0gbWF4KSByZXR1cm4gXCJcIjtcbiAgbGV0IHN0YXJ0ID0gbWluO1xuICBsZXQgZW5kID0gbWF4O1xuXG4gIGRvIHtcbiAgICBjb25zdCBjb2RlID0gc3RyLmNoYXJDb2RlQXQoc3RhcnQpO1xuICAgIGlmIChjb2RlICE9PSAzMiAvKiAgICovICYmIGNvZGUgIT09IDkgLyogXFx0ICovKSBicmVhaztcbiAgfSB3aGlsZSAoKytzdGFydCA8IGVuZCk7XG5cbiAgd2hpbGUgKGVuZCA+IHN0YXJ0KSB7XG4gICAgY29uc3QgY29kZSA9IHN0ci5jaGFyQ29kZUF0KGVuZCAtIDEpO1xuICAgIGlmIChjb2RlICE9PSAzMiAvKiAgICovICYmIGNvZGUgIT09IDkgLyogXFx0ICovKSBicmVhaztcbiAgICBlbmQtLTtcbiAgfVxuXG4gIHJldHVybiBzdHIuc2xpY2Uoc3RhcnQsIGVuZCk7XG59XG5cbi8qKlxuICogVVJMLWRlY29kZSBzdHJpbmcgdmFsdWUuIE9wdGltaXplZCB0byBza2lwIG5hdGl2ZSBjYWxsIHdoZW4gbm8gJS5cbiAqL1xuZnVuY3Rpb24gZGVjb2RlKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKHN0ci5pbmRleE9mKFwiJVwiKSA9PT0gLTEpIHJldHVybiBzdHI7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHN0cik7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG59XG5cbi8qKlxuICogVVJMLWVuY29kZSBzdHJpbmcgdmFsdWUuIE9wdGltaXplZCB0byBza2lwIG5hdGl2ZSBjYWxsIGZvciByb3VuZHRyaXAtc2FmZSBjb29raWUtb2N0ZXQgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBkZWZhdWx0RW5jb2RlKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvb2tpZU9jdGV0UmVnRXhwLnRlc3Qoc3RyKSA/IHN0ciA6IGVuY29kZVVSSUNvbXBvbmVudChzdHIpO1xufVxuIiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9kaXNwYXRjaGFibGUgZnJvbSBcIi4vaW50ZXJuYWwvX2Rpc3BhdGNoYWJsZS5qc1wiO1xuaW1wb3J0IF94YWxsIGZyb20gXCIuL2ludGVybmFsL194YWxsLmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyBgdHJ1ZWAgaWYgYWxsIGVsZW1lbnRzIG9mIHRoZSBsaXN0IG1hdGNoIHRoZSBwcmVkaWNhdGUsIGBmYWxzZWAgaWZcbiAqIHRoZXJlIGFyZSBhbnkgdGhhdCBkb24ndC5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgYWxsYCBtZXRob2Qgb2YgdGhlIHNlY29uZCBhcmd1bWVudCwgaWYgcHJlc2VudC5cbiAqXG4gKiBBY3RzIGFzIGEgdHJhbnNkdWNlciBpZiBhIHRyYW5zZm9ybWVyIGlzIGdpdmVuIGluIGxpc3QgcG9zaXRpb24uXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyAoYSAtPiBCb29sZWFuKSAtPiBbYV0gLT4gQm9vbGVhblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIHByZWRpY2F0ZSBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGFycmF5IHRvIGNvbnNpZGVyLlxuICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIHRoZSBwcmVkaWNhdGUgaXMgc2F0aXNmaWVkIGJ5IGV2ZXJ5IGVsZW1lbnQsIGBmYWxzZWBcbiAqICAgICAgICAgb3RoZXJ3aXNlLlxuICogQHNlZSBSLmFueSwgUi5ub25lLCBSLnRyYW5zZHVjZVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IGVxdWFsczMgPSBSLmVxdWFscygzKTtcbiAqICAgICAgUi5hbGwoZXF1YWxzMykoWzMsIDMsIDMsIDNdKTsgLy89PiB0cnVlXG4gKiAgICAgIFIuYWxsKGVxdWFsczMpKFszLCAzLCAxLCAzXSk7IC8vPT4gZmFsc2VcbiAqL1xudmFyIGFsbCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKCAvKiNfX1BVUkVfXyovX2Rpc3BhdGNoYWJsZShbJ2FsbCddLCBfeGFsbCwgZnVuY3Rpb24gYWxsKGZuLCBsaXN0KSB7XG4gIHZhciBpZHggPSAwO1xuICB3aGlsZSAoaWR4IDwgbGlzdC5sZW5ndGgpIHtcbiAgICBpZiAoIWZuKGxpc3RbaWR4XSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59KSk7XG5leHBvcnQgZGVmYXVsdCBhbGw7IiwiaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5MS5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGFsd2F5cyByZXR1cm5zIHRoZSBnaXZlbiB2YWx1ZS4gTm90ZSB0aGF0IGZvclxuICogbm9uLXByaW1pdGl2ZXMgdGhlIHZhbHVlIHJldHVybmVkIGlzIGEgcmVmZXJlbmNlIHRvIHRoZSBvcmlnaW5hbCB2YWx1ZS5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGtub3duIGFzIGBjb25zdGAsIGBjb25zdGFudGAsIG9yIGBLYCAoZm9yIEsgY29tYmluYXRvcikgaW5cbiAqIG90aGVyIGxhbmd1YWdlcyBhbmQgbGlicmFyaWVzLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnIGEgLT4gKCogLT4gYSlcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB3cmFwIGluIGEgZnVuY3Rpb25cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIEZ1bmN0aW9uIDo6ICogLT4gdmFsLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IHQgPSBSLmFsd2F5cygnVGVlJyk7XG4gKiAgICAgIHQoKTsgLy89PiAnVGVlJ1xuICovXG52YXIgYWx3YXlzID0gLyojX19QVVJFX18qL19jdXJyeTEoZnVuY3Rpb24gYWx3YXlzKHZhbCkge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB2YWw7XG4gIH07XG59KTtcbmV4cG9ydCBkZWZhdWx0IGFsd2F5czsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX2Rpc3BhdGNoYWJsZSBmcm9tIFwiLi9pbnRlcm5hbC9fZGlzcGF0Y2hhYmxlLmpzXCI7XG5pbXBvcnQgX3hhbnkgZnJvbSBcIi4vaW50ZXJuYWwvX3hhbnkuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlIGVsZW1lbnRzIG9mIHRoZSBsaXN0IG1hdGNoIHRoZSBwcmVkaWNhdGUsXG4gKiBgZmFsc2VgIG90aGVyd2lzZS5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgYW55YCBtZXRob2Qgb2YgdGhlIHNlY29uZCBhcmd1bWVudCwgaWYgcHJlc2VudC5cbiAqXG4gKiBBY3RzIGFzIGEgdHJhbnNkdWNlciBpZiBhIHRyYW5zZm9ybWVyIGlzIGdpdmVuIGluIGxpc3QgcG9zaXRpb24uXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyAoYSAtPiBCb29sZWFuKSAtPiBbYV0gLT4gQm9vbGVhblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIHByZWRpY2F0ZSBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGFycmF5IHRvIGNvbnNpZGVyLlxuICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIHRoZSBwcmVkaWNhdGUgaXMgc2F0aXNmaWVkIGJ5IGF0IGxlYXN0IG9uZSBlbGVtZW50LCBgZmFsc2VgXG4gKiAgICAgICAgIG90aGVyd2lzZS5cbiAqIEBzZWUgUi5hbGwsIFIubm9uZSwgUi50cmFuc2R1Y2VcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBsZXNzVGhhbjAgPSBSLmZsaXAoUi5sdCkoMCk7XG4gKiAgICAgIGNvbnN0IGxlc3NUaGFuMiA9IFIuZmxpcChSLmx0KSgyKTtcbiAqICAgICAgUi5hbnkobGVzc1RoYW4wKShbMSwgMl0pOyAvLz0+IGZhbHNlXG4gKiAgICAgIFIuYW55KGxlc3NUaGFuMikoWzEsIDJdKTsgLy89PiB0cnVlXG4gKi9cbnZhciBhbnkgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MiggLyojX19QVVJFX18qL19kaXNwYXRjaGFibGUoWydhbnknXSwgX3hhbnksIGZ1bmN0aW9uIGFueShmbiwgbGlzdCkge1xuICB2YXIgaWR4ID0gMDtcbiAgd2hpbGUgKGlkeCA8IGxpc3QubGVuZ3RoKSB7XG4gICAgaWYgKGZuKGxpc3RbaWR4XSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZHggKz0gMTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59KSk7XG5leHBvcnQgZGVmYXVsdCBhbnk7IiwiaW1wb3J0IF9jb25jYXQgZnJvbSBcIi4vaW50ZXJuYWwvX2NvbmNhdC5qc1wiO1xuaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9yZWR1Y2UgZnJvbSBcIi4vaW50ZXJuYWwvX3JlZHVjZS5qc1wiO1xuaW1wb3J0IG1hcCBmcm9tIFwiLi9tYXAuanNcIjtcblxuLyoqXG4gKiBhcCBhcHBsaWVzIGEgbGlzdCBvZiBmdW5jdGlvbnMgdG8gYSBsaXN0IG9mIHZhbHVlcy5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgYXBgIG1ldGhvZCBvZiB0aGUgZmlyc3QgYXJndW1lbnQsIGlmIHByZXNlbnQuIEFsc29cbiAqIHRyZWF0cyBjdXJyaWVkIGZ1bmN0aW9ucyBhcyBhcHBsaWNhdGl2ZXMuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMy4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBzaWcgW2EgLT4gYl0gLT4gW2FdIC0+IFtiXVxuICogQHNpZyBBcHBseSBmID0+IGYgKGEgLT4gYikgLT4gZiBhIC0+IGYgYlxuICogQHNpZyAociAtPiBhIC0+IGIpIC0+IChyIC0+IGEpIC0+IChyIC0+IGIpXG4gKiBAcGFyYW0geyp9IGFwcGx5RlxuICogQHBhcmFtIHsqfSBhcHBseVhcbiAqIEByZXR1cm4geyp9XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5hcChbUi5tdWx0aXBseSgyKSwgUi5hZGQoMyldLCBbMSwyLDNdKTsgLy89PiBbMiwgNCwgNiwgNCwgNSwgNl1cbiAqICAgICAgUi5hcChbUi5jb25jYXQoJ3Rhc3R5ICcpLCBSLnRvVXBwZXJdLCBbJ3BpenphJywgJ3NhbGFkJ10pOyAvLz0+IFtcInRhc3R5IHBpenphXCIsIFwidGFzdHkgc2FsYWRcIiwgXCJQSVpaQVwiLCBcIlNBTEFEXCJdXG4gKlxuICogICAgICAvLyBSLmFwIGNhbiBhbHNvIGJlIHVzZWQgYXMgUyBjb21iaW5hdG9yXG4gKiAgICAgIC8vIHdoZW4gb25seSB0d28gZnVuY3Rpb25zIGFyZSBwYXNzZWRcbiAqICAgICAgUi5hcChSLmNvbmNhdCwgUi50b1VwcGVyKSgnUmFtZGEnKSAvLz0+ICdSYW1kYVJBTURBJ1xuICogQHN5bWIgUi5hcChbZiwgZ10sIFthLCBiXSkgPSBbZihhKSwgZihiKSwgZyhhKSwgZyhiKV1cbiAqL1xudmFyIGFwID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gYXAoYXBwbHlGLCBhcHBseVgpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcHBseVhbJ2ZhbnRhc3ktbGFuZC9hcCddID09PSAnZnVuY3Rpb24nID8gYXBwbHlYWydmYW50YXN5LWxhbmQvYXAnXShhcHBseUYpIDogdHlwZW9mIGFwcGx5Ri5hcCA9PT0gJ2Z1bmN0aW9uJyA/IGFwcGx5Ri5hcChhcHBseVgpIDogdHlwZW9mIGFwcGx5RiA9PT0gJ2Z1bmN0aW9uJyA/IGZ1bmN0aW9uICh4KSB7XG4gICAgcmV0dXJuIGFwcGx5Rih4KShhcHBseVgoeCkpO1xuICB9IDogX3JlZHVjZShmdW5jdGlvbiAoYWNjLCBmKSB7XG4gICAgcmV0dXJuIF9jb25jYXQoYWNjLCBtYXAoZiwgYXBwbHlYKSk7XG4gIH0sIFtdLCBhcHBseUYpO1xufSk7XG5leHBvcnQgZGVmYXVsdCBhcDsiLCJpbXBvcnQgX2NvbmNhdCBmcm9tIFwiLi9pbnRlcm5hbC9fY29uY2F0LmpzXCI7XG5pbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyBhIG5ldyBsaXN0IGNvbnRhaW5pbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiBsaXN0LCBmb2xsb3dlZCBieVxuICogdGhlIGdpdmVuIGVsZW1lbnQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBhIC0+IFthXSAtPiBbYV1cbiAqIEBwYXJhbSB7Kn0gZWwgVGhlIGVsZW1lbnQgdG8gYWRkIHRvIHRoZSBlbmQgb2YgdGhlIG5ldyBsaXN0LlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgbGlzdCBvZiBlbGVtZW50cyB0byBhZGQgYSBuZXcgaXRlbSB0by5cbiAqICAgICAgICBsaXN0LlxuICogQHJldHVybiB7QXJyYXl9IEEgbmV3IGxpc3QgY29udGFpbmluZyB0aGUgZWxlbWVudHMgb2YgdGhlIG9sZCBsaXN0IGZvbGxvd2VkIGJ5IGBlbGAuXG4gKiBAc2VlIFIucHJlcGVuZFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuYXBwZW5kKCd0ZXN0cycsIFsnd3JpdGUnLCAnbW9yZSddKTsgLy89PiBbJ3dyaXRlJywgJ21vcmUnLCAndGVzdHMnXVxuICogICAgICBSLmFwcGVuZCgndGVzdHMnLCBbXSk7IC8vPT4gWyd0ZXN0cyddXG4gKiAgICAgIFIuYXBwZW5kKFsndGVzdHMnXSwgWyd3cml0ZScsICdtb3JlJ10pOyAvLz0+IFsnd3JpdGUnLCAnbW9yZScsIFsndGVzdHMnXV1cbiAqL1xudmFyIGFwcGVuZCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIGFwcGVuZChlbCwgbGlzdCkge1xuICByZXR1cm4gX2NvbmNhdChsaXN0LCBbZWxdKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgYXBwZW5kOyIsImltcG9ydCBfY3VycnkzIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTMuanNcIjtcbmltcG9ydCBhc3NvY1BhdGggZnJvbSBcIi4vYXNzb2NQYXRoLmpzXCI7XG5cbi8qKlxuICogTWFrZXMgYSBzaGFsbG93IGNsb25lIG9mIGFuIG9iamVjdCwgc2V0dGluZyBvciBvdmVycmlkaW5nIHRoZSBzcGVjaWZpZWRcbiAqIHByb3BlcnR5IHdpdGggdGhlIGdpdmVuIHZhbHVlLiBOb3RlIHRoYXQgdGhpcyBjb3BpZXMgYW5kIGZsYXR0ZW5zIHByb3RvdHlwZVxuICogcHJvcGVydGllcyBvbnRvIHRoZSBuZXcgb2JqZWN0IGFzIHdlbGwuIEFsbCBub24tcHJpbWl0aXZlIHByb3BlcnRpZXMgYXJlXG4gKiBjb3BpZWQgYnkgcmVmZXJlbmNlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjguMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHR5cGVkZWZuIElkeCA9IFN0cmluZyB8IEludFxuICogQHNpZyBJZHggLT4gYSAtPiB7azogdn0gLT4ge2s6IHZ9XG4gKiBAcGFyYW0ge1N0cmluZ3xOdW1iZXJ9IHByb3AgVGhlIHByb3BlcnR5IG5hbWUgdG8gc2V0XG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgbmV3IHZhbHVlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gY2xvbmVcbiAqIEByZXR1cm4ge09iamVjdH0gQSBuZXcgb2JqZWN0IGVxdWl2YWxlbnQgdG8gdGhlIG9yaWdpbmFsIGV4Y2VwdCBmb3IgdGhlIGNoYW5nZWQgcHJvcGVydHkuXG4gKiBAc2VlIFIuZGlzc29jLCBSLnBpY2tcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmFzc29jKCdjJywgMywge2E6IDEsIGI6IDJ9KTsgLy89PiB7YTogMSwgYjogMiwgYzogM31cbiAqL1xudmFyIGFzc29jID0gLyojX19QVVJFX18qL19jdXJyeTMoZnVuY3Rpb24gYXNzb2MocHJvcCwgdmFsLCBvYmopIHtcbiAgcmV0dXJuIGFzc29jUGF0aChbcHJvcF0sIHZhbCwgb2JqKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgYXNzb2M7IiwiaW1wb3J0IF9jdXJyeTMgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5My5qc1wiO1xuaW1wb3J0IF9oYXMgZnJvbSBcIi4vaW50ZXJuYWwvX2hhcy5qc1wiO1xuaW1wb3J0IF9pc0ludGVnZXIgZnJvbSBcIi4vaW50ZXJuYWwvX2lzSW50ZWdlci5qc1wiO1xuaW1wb3J0IF9hc3NvYyBmcm9tIFwiLi9pbnRlcm5hbC9fYXNzb2MuanNcIjtcbmltcG9ydCBpc05pbCBmcm9tIFwiLi9pc05pbC5qc1wiO1xuXG4vKipcbiAqIE1ha2VzIGEgc2hhbGxvdyBjbG9uZSBvZiBhbiBvYmplY3QsIHNldHRpbmcgb3Igb3ZlcnJpZGluZyB0aGUgbm9kZXMgcmVxdWlyZWRcbiAqIHRvIGNyZWF0ZSB0aGUgZ2l2ZW4gcGF0aCwgYW5kIHBsYWNpbmcgdGhlIHNwZWNpZmljIHZhbHVlIGF0IHRoZSB0YWlsIGVuZCBvZlxuICogdGhhdCBwYXRoLiBOb3RlIHRoYXQgdGhpcyBjb3BpZXMgYW5kIGZsYXR0ZW5zIHByb3RvdHlwZSBwcm9wZXJ0aWVzIG9udG8gdGhlXG4gKiBuZXcgb2JqZWN0IGFzIHdlbGwuIEFsbCBub24tcHJpbWl0aXZlIHByb3BlcnRpZXMgYXJlIGNvcGllZCBieSByZWZlcmVuY2UuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuOC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAdHlwZWRlZm4gSWR4ID0gU3RyaW5nIHwgSW50IHwgU3ltYm9sXG4gKiBAc2lnIFtJZHhdIC0+IGEgLT4ge2F9IC0+IHthfVxuICogQHBhcmFtIHtBcnJheX0gcGF0aCB0aGUgcGF0aCB0byBzZXRcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSBuZXcgdmFsdWVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBjbG9uZVxuICogQHJldHVybiB7T2JqZWN0fSBBIG5ldyBvYmplY3QgZXF1aXZhbGVudCB0byB0aGUgb3JpZ2luYWwgZXhjZXB0IGFsb25nIHRoZSBzcGVjaWZpZWQgcGF0aC5cbiAqIEBzZWUgUi5kaXNzb2NQYXRoXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5hc3NvY1BhdGgoWydhJywgJ2InLCAnYyddLCA0Miwge2E6IHtiOiB7YzogMH19fSk7IC8vPT4ge2E6IHtiOiB7YzogNDJ9fX1cbiAqXG4gKiAgICAgIC8vIEFueSBtaXNzaW5nIG9yIG5vbi1vYmplY3Qga2V5cyBpbiBwYXRoIHdpbGwgYmUgb3ZlcnJpZGRlblxuICogICAgICBSLmFzc29jUGF0aChbJ2EnLCAnYicsICdjJ10sIDQyLCB7YTogNX0pOyAvLz0+IHthOiB7Yjoge2M6IDQyfX19XG4gKi9cbnZhciBhc3NvY1BhdGggPSAvKiNfX1BVUkVfXyovX2N1cnJ5MyhmdW5jdGlvbiBhc3NvY1BhdGgocGF0aCwgdmFsLCBvYmopIHtcbiAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuICB2YXIgaWR4ID0gcGF0aFswXTtcbiAgaWYgKHBhdGgubGVuZ3RoID4gMSkge1xuICAgIHZhciBuZXh0T2JqID0gIWlzTmlsKG9iaikgJiYgX2hhcyhpZHgsIG9iaikgJiYgdHlwZW9mIG9ialtpZHhdID09PSAnb2JqZWN0JyA/IG9ialtpZHhdIDogX2lzSW50ZWdlcihwYXRoWzFdKSA/IFtdIDoge307XG4gICAgdmFsID0gYXNzb2NQYXRoKEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHBhdGgsIDEpLCB2YWwsIG5leHRPYmopO1xuICB9XG4gIHJldHVybiBfYXNzb2MoaWR4LCB2YWwsIG9iaik7XG59KTtcbmV4cG9ydCBkZWZhdWx0IGFzc29jUGF0aDsiLCJpbXBvcnQgX2FyaXR5IGZyb20gXCIuL2ludGVybmFsL19hcml0eS5qc1wiO1xuaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGlzIGJvdW5kIHRvIGEgY29udGV4dC5cbiAqIE5vdGU6IGBSLmJpbmRgIGRvZXMgbm90IHByb3ZpZGUgdGhlIGFkZGl0aW9uYWwgYXJndW1lbnQtYmluZGluZyBjYXBhYmlsaXRpZXMgb2ZcbiAqIFtGdW5jdGlvbi5wcm90b3R5cGUuYmluZF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRnVuY3Rpb24vYmluZCkuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuNi4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcgKCogLT4gKikgLT4geyp9IC0+ICgqIC0+ICopXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gYmluZCB0byBjb250ZXh0XG4gKiBAcGFyYW0ge09iamVjdH0gdGhpc09iaiBUaGUgY29udGV4dCB0byBiaW5kIGBmbmAgdG9cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIHRoYXQgd2lsbCBleGVjdXRlIGluIHRoZSBjb250ZXh0IG9mIGB0aGlzT2JqYC5cbiAqIEBzZWUgUi5wYXJ0aWFsXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgbG9nID0gUi5iaW5kKGNvbnNvbGUubG9nLCBjb25zb2xlKTtcbiAqICAgICAgUi5waXBlKFIuYXNzb2MoJ2EnLCAyKSwgUi50YXAobG9nKSwgUi5hc3NvYygnYScsIDMpKSh7YTogMX0pOyAvLz0+IHthOiAzfVxuICogICAgICAvLyBsb2dzIHthOiAyfVxuICogQHN5bWIgUi5iaW5kKGYsIG8pKGEsIGIpID0gZi5jYWxsKG8sIGEsIGIpXG4gKi9cbnZhciBiaW5kID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gYmluZChmbiwgdGhpc09iaikge1xuICByZXR1cm4gX2FyaXR5KGZuLmxlbmd0aCwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBmbi5hcHBseSh0aGlzT2JqLCBhcmd1bWVudHMpO1xuICB9KTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgYmluZDsiLCJpbXBvcnQgX2Nsb25lIGZyb20gXCIuL2ludGVybmFsL19jbG9uZS5qc1wiO1xuaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5MS5qc1wiO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBkZWVwIGNvcHkgb2YgdGhlIHNvdXJjZSB0aGF0IGNhbiBiZSB1c2VkIGluIHBsYWNlIG9mIHRoZSBzb3VyY2VcbiAqIG9iamVjdCB3aXRob3V0IHJldGFpbmluZyBhbnkgcmVmZXJlbmNlcyB0byBpdC5cbiAqIFRoZSBzb3VyY2Ugb2JqZWN0IG1heSBjb250YWluIChuZXN0ZWQpIGBBcnJheWBzIGFuZCBgT2JqZWN0YHMsXG4gKiBgTnVtYmVyYHMsIGBTdHJpbmdgcywgYEJvb2xlYW5gcyBhbmQgYERhdGVgcy5cbiAqIGBGdW5jdGlvbmBzIGFyZSBhc3NpZ25lZCBieSByZWZlcmVuY2UgcmF0aGVyIHRoYW4gY29waWVkLlxuICpcbiAqIERpc3BhdGNoZXMgdG8gYSBgY2xvbmVgIG1ldGhvZCBpZiBwcmVzZW50LlxuICpcbiAqIE5vdGUgdGhhdCBpZiB0aGUgc291cmNlIG9iamVjdCBoYXMgbXVsdGlwbGUgbm9kZXMgdGhhdCBzaGFyZSBhIHJlZmVyZW5jZSxcbiAqIHRoZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBoYXZlIHRoZSBzYW1lIHN0cnVjdHVyZSwgYnV0IHRoZSByZWZlcmVuY2VzIHdpbGxcbiAqIGJlIHBvaW50ZWQgdG8gdGhlIGxvY2F0aW9uIHdpdGhpbiB0aGUgY2xvbmVkIHZhbHVlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyB7Kn0gLT4geyp9XG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSBvYmplY3Qgb3IgYXJyYXkgdG8gY2xvbmVcbiAqIEByZXR1cm4geyp9IEEgZGVlcGx5IGNsb25lZCBjb3B5IG9mIGB2YWxgXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3Qgb2JqZWN0cyA9IFt7fSwge30sIHt9XTtcbiAqICAgICAgY29uc3Qgb2JqZWN0c0Nsb25lID0gUi5jbG9uZShvYmplY3RzKTtcbiAqICAgICAgb2JqZWN0cyA9PT0gb2JqZWN0c0Nsb25lOyAvLz0+IGZhbHNlXG4gKiAgICAgIG9iamVjdHNbMF0gPT09IG9iamVjdHNDbG9uZVswXTsgLy89PiBmYWxzZVxuICovXG52YXIgY2xvbmUgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MShmdW5jdGlvbiBjbG9uZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUuY2xvbmUgPT09ICdmdW5jdGlvbicgPyB2YWx1ZS5jbG9uZSgpIDogX2Nsb25lKHZhbHVlLCB0cnVlKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgY2xvbmU7IiwiaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5MS5qc1wiO1xuXG4vKipcbiAqIE1ha2VzIGEgY29tcGFyYXRvciBmdW5jdGlvbiBvdXQgb2YgYSBmdW5jdGlvbiB0aGF0IHJlcG9ydHMgd2hldGhlciB0aGUgZmlyc3RcbiAqIGVsZW1lbnQgaXMgbGVzcyB0aGFuIHRoZSBzZWNvbmQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBzaWcgKChhLCBiKSAtPiBCb29sZWFuKSAtPiAoKGEsIGIpIC0+IE51bWJlcilcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWQgQSBwcmVkaWNhdGUgZnVuY3Rpb24gb2YgYXJpdHkgdHdvIHdoaWNoIHdpbGwgcmV0dXJuIGB0cnVlYCBpZiB0aGUgZmlyc3QgYXJndW1lbnRcbiAqIGlzIGxlc3MgdGhhbiB0aGUgc2Vjb25kLCBgZmFsc2VgIG90aGVyd2lzZVxuICogQHJldHVybiB7RnVuY3Rpb259IEEgRnVuY3Rpb24gOjogYSAtPiBiIC0+IEludCB0aGF0IHJldHVybnMgYC0xYCBpZiBhIDwgYiwgYDFgIGlmIGIgPCBhLCBvdGhlcndpc2UgYDBgXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgYnlBZ2UgPSBSLmNvbXBhcmF0b3IoKGEsIGIpID0+IGEuYWdlIDwgYi5hZ2UpO1xuICogICAgICBjb25zdCBwZW9wbGUgPSBbXG4gKiAgICAgICAgeyBuYW1lOiAnRW1tYScsIGFnZTogNzAgfSxcbiAqICAgICAgICB7IG5hbWU6ICdQZXRlcicsIGFnZTogNzggfSxcbiAqICAgICAgICB7IG5hbWU6ICdNaWtoYWlsJywgYWdlOiA2MiB9LFxuICogICAgICBdO1xuICogICAgICBjb25zdCBwZW9wbGVCeUluY3JlYXNpbmdBZ2UgPSBSLnNvcnQoYnlBZ2UsIHBlb3BsZSk7XG4gKiAgICAgICAgLy89PiBbeyBuYW1lOiAnTWlraGFpbCcsIGFnZTogNjIgfSx7IG5hbWU6ICdFbW1hJywgYWdlOiA3MCB9LCB7IG5hbWU6ICdQZXRlcicsIGFnZTogNzggfV1cbiAqL1xudmFyIGNvbXBhcmF0b3IgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MShmdW5jdGlvbiBjb21wYXJhdG9yKHByZWQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIHByZWQoYSwgYikgPyAtMSA6IHByZWQoYiwgYSkgPyAxIDogMDtcbiAgfTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgY29tcGFyYXRvcjsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX2lzQXJyYXkgZnJvbSBcIi4vaW50ZXJuYWwvX2lzQXJyYXkuanNcIjtcbmltcG9ydCBfaXNGdW5jdGlvbiBmcm9tIFwiLi9pbnRlcm5hbC9faXNGdW5jdGlvbi5qc1wiO1xuaW1wb3J0IF9pc1N0cmluZyBmcm9tIFwiLi9pbnRlcm5hbC9faXNTdHJpbmcuanNcIjtcbmltcG9ydCB0b1N0cmluZyBmcm9tIFwiLi90b1N0cmluZy5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBjb25jYXRlbmF0aW5nIHRoZSBnaXZlbiBsaXN0cyBvciBzdHJpbmdzLlxuICpcbiAqIE5vdGU6IGBSLmNvbmNhdGAgZXhwZWN0cyBib3RoIGFyZ3VtZW50cyB0byBiZSBvZiB0aGUgc2FtZSB0eXBlLFxuICogdW5saWtlIHRoZSBuYXRpdmUgYEFycmF5LnByb3RvdHlwZS5jb25jYXRgIG1ldGhvZC4gSXQgd2lsbCB0aHJvd1xuICogYW4gZXJyb3IgaWYgeW91IGBjb25jYXRgIGFuIEFycmF5IHdpdGggYSBub24tQXJyYXkgdmFsdWUuXG4gKlxuICogRGlzcGF0Y2hlcyB0byB0aGUgYGNvbmNhdGAgbWV0aG9kIG9mIHRoZSBmaXJzdCBhcmd1bWVudCwgaWYgcHJlc2VudC5cbiAqIENhbiBhbHNvIGNvbmNhdGVuYXRlIHR3byBtZW1iZXJzIG9mIGEgW2ZhbnRhc3ktbGFuZFxuICogY29tcGF0aWJsZSBzZW1pZ3JvdXBdKGh0dHBzOi8vZ2l0aHViLmNvbS9mYW50YXN5bGFuZC9mYW50YXN5LWxhbmQjc2VtaWdyb3VwKS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIFthXSAtPiBbYV0gLT4gW2FdXG4gKiBAc2lnIFN0cmluZyAtPiBTdHJpbmcgLT4gU3RyaW5nXG4gKiBAcGFyYW0ge0FycmF5fFN0cmluZ30gZmlyc3RMaXN0IFRoZSBmaXJzdCBsaXN0XG4gKiBAcGFyYW0ge0FycmF5fFN0cmluZ30gc2Vjb25kTGlzdCBUaGUgc2Vjb25kIGxpc3RcbiAqIEByZXR1cm4ge0FycmF5fFN0cmluZ30gQSBsaXN0IGNvbnNpc3Rpbmcgb2YgdGhlIGVsZW1lbnRzIG9mIGBmaXJzdExpc3RgIGZvbGxvd2VkIGJ5IHRoZSBlbGVtZW50cyBvZlxuICogYHNlY29uZExpc3RgLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmNvbmNhdCgnQUJDJywgJ0RFRicpOyAvLyAnQUJDREVGJ1xuICogICAgICBSLmNvbmNhdChbNCwgNSwgNl0sIFsxLCAyLCAzXSk7IC8vPT4gWzQsIDUsIDYsIDEsIDIsIDNdXG4gKiAgICAgIFIuY29uY2F0KFtdLCBbXSk7IC8vPT4gW11cbiAqL1xudmFyIGNvbmNhdCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIGNvbmNhdChhLCBiKSB7XG4gIGlmIChfaXNBcnJheShhKSkge1xuICAgIGlmIChfaXNBcnJheShiKSkge1xuICAgICAgcmV0dXJuIGEuY29uY2F0KGIpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHRvU3RyaW5nKGIpICsgJyBpcyBub3QgYW4gYXJyYXknKTtcbiAgfVxuICBpZiAoX2lzU3RyaW5nKGEpKSB7XG4gICAgaWYgKF9pc1N0cmluZyhiKSkge1xuICAgICAgcmV0dXJuIGEgKyBiO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHRvU3RyaW5nKGIpICsgJyBpcyBub3QgYSBzdHJpbmcnKTtcbiAgfVxuICBpZiAoYSAhPSBudWxsICYmIF9pc0Z1bmN0aW9uKGFbJ2ZhbnRhc3ktbGFuZC9jb25jYXQnXSkpIHtcbiAgICByZXR1cm4gYVsnZmFudGFzeS1sYW5kL2NvbmNhdCddKGIpO1xuICB9XG4gIGlmIChhICE9IG51bGwgJiYgX2lzRnVuY3Rpb24oYS5jb25jYXQpKSB7XG4gICAgcmV0dXJuIGEuY29uY2F0KGIpO1xuICB9XG4gIHRocm93IG5ldyBUeXBlRXJyb3IodG9TdHJpbmcoYSkgKyAnIGRvZXMgbm90IGhhdmUgYSBtZXRob2QgbmFtZWQgXCJjb25jYXRcIiBvciBcImZhbnRhc3ktbGFuZC9jb25jYXRcIicpO1xufSk7XG5leHBvcnQgZGVmYXVsdCBjb25jYXQ7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9tYXAgZnJvbSBcIi4vaW50ZXJuYWwvX21hcC5qc1wiO1xuaW1wb3J0IGN1cnJ5TiBmcm9tIFwiLi9jdXJyeU4uanNcIjtcbmltcG9ydCBtYXggZnJvbSBcIi4vbWF4LmpzXCI7XG5pbXBvcnQgcGx1Y2sgZnJvbSBcIi4vcGx1Y2suanNcIjtcbmltcG9ydCByZWR1Y2UgZnJvbSBcIi4vcmVkdWNlLmpzXCI7XG5cbi8qKlxuICogQWNjZXB0cyBhIGNvbnZlcmdpbmcgZnVuY3Rpb24gYW5kIGEgbGlzdCBvZiBicmFuY2hpbmcgZnVuY3Rpb25zIGFuZCByZXR1cm5zXG4gKiBhIG5ldyBmdW5jdGlvbi4gVGhlIGFyaXR5IG9mIHRoZSBuZXcgZnVuY3Rpb24gaXMgdGhlIHNhbWUgYXMgdGhlIGFyaXR5IG9mXG4gKiB0aGUgbG9uZ2VzdCBicmFuY2hpbmcgZnVuY3Rpb24uIFdoZW4gaW52b2tlZCwgdGhpcyBuZXcgZnVuY3Rpb24gaXMgYXBwbGllZFxuICogdG8gc29tZSBhcmd1bWVudHMsIGFuZCBlYWNoIGJyYW5jaGluZyBmdW5jdGlvbiBpcyBhcHBsaWVkIHRvIHRob3NlIHNhbWVcbiAqIGFyZ3VtZW50cy4gVGhlIHJlc3VsdHMgb2YgZWFjaCBicmFuY2hpbmcgZnVuY3Rpb24gYXJlIHBhc3NlZCBhcyBhcmd1bWVudHNcbiAqIHRvIHRoZSBjb252ZXJnaW5nIGZ1bmN0aW9uIHRvIHByb2R1Y2UgdGhlIHJldHVybiB2YWx1ZS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC40LjJcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyAoKHgxLCB4MiwgLi4uKSAtPiB6KSAtPiBbKChhLCBiLCAuLi4pIC0+IHgxKSwgKChhLCBiLCAuLi4pIC0+IHgyKSwgLi4uXSAtPiAoYSAtPiBiIC0+IC4uLiAtPiB6KVxuICogQHBhcmFtIHtGdW5jdGlvbn0gYWZ0ZXIgQSBmdW5jdGlvbi4gYGFmdGVyYCB3aWxsIGJlIGludm9rZWQgd2l0aCB0aGUgcmV0dXJuIHZhbHVlcyBvZlxuICogICAgICAgIGBmbjFgIGFuZCBgZm4yYCBhcyBpdHMgYXJndW1lbnRzLlxuICogQHBhcmFtIHtBcnJheX0gZnVuY3Rpb25zIEEgbGlzdCBvZiBmdW5jdGlvbnMuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBuZXcgZnVuY3Rpb24uXG4gKiBAc2VlIFIudXNlV2l0aFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IGF2ZXJhZ2UgPSBSLmNvbnZlcmdlKFIuZGl2aWRlLCBbUi5zdW0sIFIubGVuZ3RoXSlcbiAqICAgICAgYXZlcmFnZShbMSwgMiwgMywgNCwgNSwgNiwgN10pIC8vPT4gNFxuICpcbiAqICAgICAgY29uc3Qgc3RyYW5nZUNvbmNhdCA9IFIuY29udmVyZ2UoUi5jb25jYXQsIFtSLnRvVXBwZXIsIFIudG9Mb3dlcl0pXG4gKiAgICAgIHN0cmFuZ2VDb25jYXQoXCJZb2RlbFwiKSAvLz0+IFwiWU9ERUx5b2RlbFwiXG4gKlxuICogQHN5bWIgUi5jb252ZXJnZShmLCBbZywgaF0pKGEsIGIpID0gZihnKGEsIGIpLCBoKGEsIGIpKVxuICovXG52YXIgY29udmVyZ2UgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiBjb252ZXJnZShhZnRlciwgZm5zKSB7XG4gIHJldHVybiBjdXJyeU4ocmVkdWNlKG1heCwgMCwgcGx1Y2soJ2xlbmd0aCcsIGZucykpLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgdmFyIGNvbnRleHQgPSB0aGlzO1xuICAgIHJldHVybiBhZnRlci5hcHBseShjb250ZXh0LCBfbWFwKGZ1bmN0aW9uIChmbikge1xuICAgICAgcmV0dXJuIGZuLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgIH0sIGZucykpO1xuICB9KTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgY29udmVyZ2U7IiwiaW1wb3J0IF9hcml0eSBmcm9tIFwiLi9pbnRlcm5hbC9fYXJpdHkuanNcIjtcbmltcG9ydCBfY3VycnkxIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTEuanNcIjtcbmltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfY3VycnlOIGZyb20gXCIuL2ludGVybmFsL19jdXJyeU4uanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgY3VycmllZCBlcXVpdmFsZW50IG9mIHRoZSBwcm92aWRlZCBmdW5jdGlvbiwgd2l0aCB0aGUgc3BlY2lmaWVkXG4gKiBhcml0eS4gVGhlIGN1cnJpZWQgZnVuY3Rpb24gaGFzIHR3byB1bnVzdWFsIGNhcGFiaWxpdGllcy4gRmlyc3QsIGl0c1xuICogYXJndW1lbnRzIG5lZWRuJ3QgYmUgcHJvdmlkZWQgb25lIGF0IGEgdGltZS4gSWYgYGdgIGlzIGBSLmN1cnJ5TigzLCBmKWAsIHRoZVxuICogZm9sbG93aW5nIGFyZSBlcXVpdmFsZW50OlxuICpcbiAqICAgLSBgZygxKSgyKSgzKWBcbiAqICAgLSBgZygxKSgyLCAzKWBcbiAqICAgLSBgZygxLCAyKSgzKWBcbiAqICAgLSBgZygxLCAyLCAzKWBcbiAqXG4gKiBTZWNvbmRseSwgdGhlIHNwZWNpYWwgcGxhY2Vob2xkZXIgdmFsdWUgW2BSLl9fYF0oI19fKSBtYXkgYmUgdXNlZCB0byBzcGVjaWZ5XG4gKiBcImdhcHNcIiwgYWxsb3dpbmcgcGFydGlhbCBhcHBsaWNhdGlvbiBvZiBhbnkgY29tYmluYXRpb24gb2YgYXJndW1lbnRzLFxuICogcmVnYXJkbGVzcyBvZiB0aGVpciBwb3NpdGlvbnMuIElmIGBnYCBpcyBhcyBhYm92ZSBhbmQgYF9gIGlzIFtgUi5fX2BdKCNfXyksXG4gKiB0aGUgZm9sbG93aW5nIGFyZSBlcXVpdmFsZW50OlxuICpcbiAqICAgLSBgZygxLCAyLCAzKWBcbiAqICAgLSBgZyhfLCAyLCAzKSgxKWBcbiAqICAgLSBgZyhfLCBfLCAzKSgxKSgyKWBcbiAqICAgLSBgZyhfLCBfLCAzKSgxLCAyKWBcbiAqICAgLSBgZyhfLCAyKSgxKSgzKWBcbiAqICAgLSBgZyhfLCAyKSgxLCAzKWBcbiAqICAgLSBgZyhfLCAyKShfLCAzKSgxKWBcbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC41LjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyBOdW1iZXIgLT4gKCogLT4gYSkgLT4gKCogLT4gYSlcbiAqIEBwYXJhbSB7TnVtYmVyfSBsZW5ndGggVGhlIGFyaXR5IGZvciB0aGUgcmV0dXJuZWQgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gY3VycnkuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBuZXcsIGN1cnJpZWQgZnVuY3Rpb24uXG4gKiBAc2VlIFIuY3VycnlcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBzdW1BcmdzID0gKC4uLmFyZ3MpID0+IFIuc3VtKGFyZ3MpO1xuICpcbiAqICAgICAgY29uc3QgY3VycmllZEFkZEZvdXJOdW1iZXJzID0gUi5jdXJyeU4oNCwgc3VtQXJncyk7XG4gKiAgICAgIGNvbnN0IGYgPSBjdXJyaWVkQWRkRm91ck51bWJlcnMoMSwgMik7XG4gKiAgICAgIGNvbnN0IGcgPSBmKDMpO1xuICogICAgICBnKDQpOyAvLz0+IDEwXG4gKi9cbnZhciBjdXJyeU4gPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiBjdXJyeU4obGVuZ3RoLCBmbikge1xuICBpZiAobGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIF9jdXJyeTEoZm4pO1xuICB9XG4gIHJldHVybiBfYXJpdHkobGVuZ3RoLCBfY3VycnlOKGxlbmd0aCwgW10sIGZuKSk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IGN1cnJ5TjsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgc2Vjb25kIGFyZ3VtZW50IGlmIGl0IGlzIG5vdCBgbnVsbGAsIGB1bmRlZmluZWRgIG9yIGBOYU5gO1xuICogb3RoZXJ3aXNlIHRoZSBmaXJzdCBhcmd1bWVudCBpcyByZXR1cm5lZC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xMC4wXG4gKiBAY2F0ZWdvcnkgTG9naWNcbiAqIEBzaWcgYSAtPiBiIC0+IGEgfCBiXG4gKiBAcGFyYW0ge2F9IGRlZmF1bHQgVGhlIGRlZmF1bHQgdmFsdWUuXG4gKiBAcGFyYW0ge2J9IHZhbCBgdmFsYCB3aWxsIGJlIHJldHVybmVkIGluc3RlYWQgb2YgYGRlZmF1bHRgIHVubGVzcyBgdmFsYCBpcyBgbnVsbGAsIGB1bmRlZmluZWRgIG9yIGBOYU5gLlxuICogQHJldHVybiB7Kn0gVGhlIHNlY29uZCB2YWx1ZSBpZiBpdCBpcyBub3QgYG51bGxgLCBgdW5kZWZpbmVkYCBvciBgTmFOYCwgb3RoZXJ3aXNlIHRoZSBkZWZhdWx0IHZhbHVlXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgZGVmYXVsdFRvNDIgPSBSLmRlZmF1bHRUbyg0Mik7XG4gKlxuICogICAgICBkZWZhdWx0VG80MihudWxsKTsgIC8vPT4gNDJcbiAqICAgICAgZGVmYXVsdFRvNDIodW5kZWZpbmVkKTsgIC8vPT4gNDJcbiAqICAgICAgZGVmYXVsdFRvNDIoZmFsc2UpOyAgLy89PiBmYWxzZVxuICogICAgICBkZWZhdWx0VG80MignUmFtZGEnKTsgIC8vPT4gJ1JhbWRhJ1xuICogICAgICAvLyBwYXJzZUludCgnc3RyaW5nJykgcmVzdWx0cyBpbiBOYU5cbiAqICAgICAgZGVmYXVsdFRvNDIocGFyc2VJbnQoJ3N0cmluZycpKTsgLy89PiA0MlxuICovXG52YXIgZGVmYXVsdFRvID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gZGVmYXVsdFRvKGQsIHYpIHtcbiAgcmV0dXJuIHYgPT0gbnVsbCB8fCB2ICE9PSB2ID8gZCA6IHY7XG59KTtcbmV4cG9ydCBkZWZhdWx0IGRlZmF1bHRUbzsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX1NldCBmcm9tIFwiLi9pbnRlcm5hbC9fU2V0LmpzXCI7XG5cbi8qKlxuICogRmluZHMgdGhlIHNldCAoaS5lLiBubyBkdXBsaWNhdGVzKSBvZiBhbGwgZWxlbWVudHMgaW4gdGhlIGZpcnN0IGxpc3Qgbm90XG4gKiBjb250YWluZWQgaW4gdGhlIHNlY29uZCBsaXN0LiBPYmplY3RzIGFuZCBBcnJheXMgYXJlIGNvbXBhcmVkIGluIHRlcm1zIG9mXG4gKiB2YWx1ZSBlcXVhbGl0eSwgbm90IHJlZmVyZW5jZSBlcXVhbGl0eS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBSZWxhdGlvblxuICogQHNpZyBbKl0gLT4gWypdIC0+IFsqXVxuICogQHBhcmFtIHtBcnJheX0gbGlzdDEgVGhlIGZpcnN0IGxpc3QuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0MiBUaGUgc2Vjb25kIGxpc3QuXG4gKiBAcmV0dXJuIHtBcnJheX0gVGhlIGVsZW1lbnRzIGluIGBsaXN0MWAgdGhhdCBhcmUgbm90IGluIGBsaXN0MmAuXG4gKiBAc2VlIFIuZGlmZmVyZW5jZVdpdGgsIFIuc3ltbWV0cmljRGlmZmVyZW5jZSwgUi5zeW1tZXRyaWNEaWZmZXJlbmNlV2l0aCwgUi53aXRob3V0XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5kaWZmZXJlbmNlKFsxLDIsMyw0XSwgWzcsNiw1LDQsM10pOyAvLz0+IFsxLDJdXG4gKiAgICAgIFIuZGlmZmVyZW5jZShbNyw2LDUsNCwzXSwgWzEsMiwzLDRdKTsgLy89PiBbNyw2LDVdXG4gKiAgICAgIFIuZGlmZmVyZW5jZShbe2E6IDF9LCB7YjogMn1dLCBbe2E6IDF9LCB7YzogM31dKSAvLz0+IFt7YjogMn1dXG4gKi9cbnZhciBkaWZmZXJlbmNlID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gZGlmZmVyZW5jZShmaXJzdCwgc2Vjb25kKSB7XG4gIHZhciBvdXQgPSBbXTtcbiAgdmFyIGlkeCA9IDA7XG4gIHZhciBmaXJzdExlbiA9IGZpcnN0Lmxlbmd0aDtcbiAgdmFyIHNlY29uZExlbiA9IHNlY29uZC5sZW5ndGg7XG4gIHZhciB0b0ZpbHRlck91dCA9IG5ldyBfU2V0KCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc2Vjb25kTGVuOyBpICs9IDEpIHtcbiAgICB0b0ZpbHRlck91dC5hZGQoc2Vjb25kW2ldKTtcbiAgfVxuICB3aGlsZSAoaWR4IDwgZmlyc3RMZW4pIHtcbiAgICBpZiAodG9GaWx0ZXJPdXQuYWRkKGZpcnN0W2lkeF0pKSB7XG4gICAgICBvdXRbb3V0Lmxlbmd0aF0gPSBmaXJzdFtpZHhdO1xuICAgIH1cbiAgICBpZHggKz0gMTtcbiAgfVxuICByZXR1cm4gb3V0O1xufSk7XG5leHBvcnQgZGVmYXVsdCBkaWZmZXJlbmNlOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBkaXNzb2NQYXRoIGZyb20gXCIuL2Rpc3NvY1BhdGguanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IG9iamVjdCB0aGF0IGRvZXMgbm90IGNvbnRhaW4gYSBgcHJvcGAgcHJvcGVydHkuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTAuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyBTdHJpbmcgLT4ge2s6IHZ9IC0+IHtrOiB2fVxuICogQHBhcmFtIHtTdHJpbmd9IHByb3AgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGRpc3NvY2lhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBjbG9uZVxuICogQHJldHVybiB7T2JqZWN0fSBBIG5ldyBvYmplY3QgZXF1aXZhbGVudCB0byB0aGUgb3JpZ2luYWwgYnV0IHdpdGhvdXQgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eVxuICogQHNlZSBSLmFzc29jLCBSLm9taXRcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmRpc3NvYygnYicsIHthOiAxLCBiOiAyLCBjOiAzfSk7IC8vPT4ge2E6IDEsIGM6IDN9XG4gKi9cbnZhciBkaXNzb2MgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiBkaXNzb2MocHJvcCwgb2JqKSB7XG4gIHJldHVybiBkaXNzb2NQYXRoKFtwcm9wXSwgb2JqKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgZGlzc29jOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfZGlzc29jIGZyb20gXCIuL2ludGVybmFsL19kaXNzb2MuanNcIjtcbmltcG9ydCBfaXNJbnRlZ2VyIGZyb20gXCIuL2ludGVybmFsL19pc0ludGVnZXIuanNcIjtcbmltcG9ydCBfaXNBcnJheSBmcm9tIFwiLi9pbnRlcm5hbC9faXNBcnJheS5qc1wiO1xuaW1wb3J0IGFzc29jIGZyb20gXCIuL2Fzc29jLmpzXCI7XG5cbi8qKlxuICogTWFrZXMgYSBzaGFsbG93IGNsb25lIG9mIGFuIG9iamVjdC4gTm90ZSB0aGF0IHRoaXMgY29waWVzIGFuZCBmbGF0dGVuc1xuICogcHJvdG90eXBlIHByb3BlcnRpZXMgb250byB0aGUgbmV3IG9iamVjdCBhcyB3ZWxsLiBBbGwgbm9uLXByaW1pdGl2ZVxuICogcHJvcGVydGllcyBhcmUgY29waWVkIGJ5IHJlZmVyZW5jZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtTdHJpbmd8SW50ZWdlcn0gcHJvcCBUaGUgcHJvcCBvcGVyYXRpbmdcbiAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fSBvYmogVGhlIG9iamVjdCB0byBjbG9uZVxuICogQHJldHVybiB7T2JqZWN0fEFycmF5fSBBIG5ldyBvYmplY3QgZXF1aXZhbGVudCB0byB0aGUgb3JpZ2luYWwuXG4gKi9cbmZ1bmN0aW9uIF9zaGFsbG93Q2xvbmVPYmplY3QocHJvcCwgb2JqKSB7XG4gIGlmIChfaXNJbnRlZ2VyKHByb3ApICYmIF9pc0FycmF5KG9iaikpIHtcbiAgICByZXR1cm4gW10uY29uY2F0KG9iaik7XG4gIH1cbiAgdmFyIHJlc3VsdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIG9iaikge1xuICAgIHJlc3VsdFtwXSA9IG9ialtwXTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIE1ha2VzIGEgc2hhbGxvdyBjbG9uZSBvZiBhbiBvYmplY3QsIG9taXR0aW5nIHRoZSBwcm9wZXJ0eSBhdCB0aGUgZ2l2ZW4gcGF0aC5cbiAqIE5vdGUgdGhhdCB0aGlzIGNvcGllcyBhbmQgZmxhdHRlbnMgcHJvdG90eXBlIHByb3BlcnRpZXMgb250byB0aGUgbmV3IG9iamVjdFxuICogYXMgd2VsbC4gQWxsIG5vbi1wcmltaXRpdmUgcHJvcGVydGllcyBhcmUgY29waWVkIGJ5IHJlZmVyZW5jZS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xMS4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAdHlwZWRlZm4gSWR4ID0gU3RyaW5nIHwgSW50IHwgU3ltYm9sXG4gKiBAc2lnIFtJZHhdIC0+IHtrOiB2fSAtPiB7azogdn1cbiAqIEBwYXJhbSB7QXJyYXl9IHBhdGggVGhlIHBhdGggdG8gdGhlIHZhbHVlIHRvIG9taXRcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBjbG9uZVxuICogQHJldHVybiB7T2JqZWN0fSBBIG5ldyBvYmplY3Qgd2l0aG91dCB0aGUgcHJvcGVydHkgYXQgcGF0aFxuICogQHNlZSBSLmFzc29jUGF0aFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuZGlzc29jUGF0aChbJ2EnLCAnYicsICdjJ10sIHthOiB7Yjoge2M6IDQyfX19KTsgLy89PiB7YToge2I6IHt9fX1cbiAqL1xudmFyIGRpc3NvY1BhdGggPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiBkaXNzb2NQYXRoKHBhdGgsIG9iaikge1xuICBpZiAob2JqID09IG51bGwpIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG4gIHN3aXRjaCAocGF0aC5sZW5ndGgpIHtcbiAgICBjYXNlIDA6XG4gICAgICByZXR1cm4gb2JqO1xuICAgIGNhc2UgMTpcbiAgICAgIHJldHVybiBfZGlzc29jKHBhdGhbMF0sIG9iaik7XG4gICAgZGVmYXVsdDpcbiAgICAgIHZhciBoZWFkID0gcGF0aFswXTtcbiAgICAgIHZhciB0YWlsID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwocGF0aCwgMSk7XG4gICAgICBpZiAob2JqW2hlYWRdID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIF9zaGFsbG93Q2xvbmVPYmplY3QoaGVhZCwgb2JqKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBhc3NvYyhoZWFkLCBkaXNzb2NQYXRoKHRhaWwsIG9ialtoZWFkXSksIG9iaik7XG4gICAgICB9XG4gIH1cbn0pO1xuZXhwb3J0IGRlZmF1bHQgZGlzc29jUGF0aDsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5pbXBvcnQgX2lzQXJndW1lbnRzIGZyb20gXCIuL2ludGVybmFsL19pc0FyZ3VtZW50cy5qc1wiO1xuaW1wb3J0IF9pc0FycmF5IGZyb20gXCIuL2ludGVybmFsL19pc0FycmF5LmpzXCI7XG5pbXBvcnQgX2lzT2JqZWN0IGZyb20gXCIuL2ludGVybmFsL19pc09iamVjdC5qc1wiO1xuaW1wb3J0IF9pc1N0cmluZyBmcm9tIFwiLi9pbnRlcm5hbC9faXNTdHJpbmcuanNcIjtcbmltcG9ydCBfaXNUeXBlZEFycmF5IGZyb20gXCIuL2ludGVybmFsL19pc1R5cGVkQXJyYXkuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBlbXB0eSB2YWx1ZSBvZiBpdHMgYXJndW1lbnQncyB0eXBlLiBSYW1kYSBkZWZpbmVzIHRoZSBlbXB0eVxuICogdmFsdWUgb2YgQXJyYXkgKGBbXWApLCBPYmplY3QgKGB7fWApLCBTdHJpbmcgKGAnJ2ApLFxuICogVHlwZWRBcnJheSAoYFVpbnQ4QXJyYXkgW11gLCBgRmxvYXQzMkFycmF5IFtdYCwgZXRjKSwgYW5kIEFyZ3VtZW50cy4gT3RoZXJcbiAqIHR5cGVzIGFyZSBzdXBwb3J0ZWQgaWYgdGhleSBkZWZpbmUgYDxUeXBlPi5lbXB0eWAsXG4gKiBgPFR5cGU+LnByb3RvdHlwZS5lbXB0eWAgb3IgaW1wbGVtZW50IHRoZVxuICogW0ZhbnRhc3lMYW5kIE1vbm9pZCBzcGVjXShodHRwczovL2dpdGh1Yi5jb20vZmFudGFzeWxhbmQvZmFudGFzeS1sYW5kI21vbm9pZCkuXG4gKlxuICogRGlzcGF0Y2hlcyB0byB0aGUgYGVtcHR5YCBtZXRob2Qgb2YgdGhlIGZpcnN0IGFyZ3VtZW50LCBpZiBwcmVzZW50LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjMuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnIGEgLT4gYVxuICogQHBhcmFtIHsqfSB4XG4gKiBAcmV0dXJuIHsqfVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuZW1wdHkoSnVzdCg0MikpOyAgICAgICAgICAgICAgIC8vPT4gTm90aGluZygpXG4gKiAgICAgIFIuZW1wdHkoWzEsIDIsIDNdKTsgICAgICAgICAgICAgIC8vPT4gW11cbiAqICAgICAgUi5lbXB0eSgndW5pY29ybnMnKTsgICAgICAgICAgICAgLy89PiAnJ1xuICogICAgICBSLmVtcHR5KHt4OiAxLCB5OiAyfSk7ICAgICAgICAgICAvLz0+IHt9XG4gKiAgICAgIFIuZW1wdHkoVWludDhBcnJheS5mcm9tKCcxMjMnKSk7IC8vPT4gVWludDhBcnJheSBbXVxuICovXG52YXIgZW1wdHkgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MShmdW5jdGlvbiBlbXB0eSh4KSB7XG4gIHJldHVybiB4ICE9IG51bGwgJiYgdHlwZW9mIHhbJ2ZhbnRhc3ktbGFuZC9lbXB0eSddID09PSAnZnVuY3Rpb24nID8geFsnZmFudGFzeS1sYW5kL2VtcHR5J10oKSA6IHggIT0gbnVsbCAmJiB4LmNvbnN0cnVjdG9yICE9IG51bGwgJiYgdHlwZW9mIHguY29uc3RydWN0b3JbJ2ZhbnRhc3ktbGFuZC9lbXB0eSddID09PSAnZnVuY3Rpb24nID8geC5jb25zdHJ1Y3RvclsnZmFudGFzeS1sYW5kL2VtcHR5J10oKSA6IHggIT0gbnVsbCAmJiB0eXBlb2YgeC5lbXB0eSA9PT0gJ2Z1bmN0aW9uJyA/IHguZW1wdHkoKSA6IHggIT0gbnVsbCAmJiB4LmNvbnN0cnVjdG9yICE9IG51bGwgJiYgdHlwZW9mIHguY29uc3RydWN0b3IuZW1wdHkgPT09ICdmdW5jdGlvbicgPyB4LmNvbnN0cnVjdG9yLmVtcHR5KCkgOiBfaXNBcnJheSh4KSA/IFtdIDogX2lzU3RyaW5nKHgpID8gJycgOiBfaXNPYmplY3QoeCkgPyB7fSA6IF9pc0FyZ3VtZW50cyh4KSA/IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzO1xuICB9KCkgOiBfaXNUeXBlZEFycmF5KHgpID8geC5jb25zdHJ1Y3Rvci5mcm9tKCcnKSA6IHZvaWQgMCAvLyBlbHNlXG4gIDtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBlbXB0eTsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX2VxdWFscyBmcm9tIFwiLi9pbnRlcm5hbC9fZXF1YWxzLmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyBgdHJ1ZWAgaWYgaXRzIGFyZ3VtZW50cyBhcmUgZXF1aXZhbGVudCwgYGZhbHNlYCBvdGhlcndpc2UuIEhhbmRsZXNcbiAqIGN5Y2xpY2FsIGRhdGEgc3RydWN0dXJlcy5cbiAqXG4gKiBEaXNwYXRjaGVzIHN5bW1ldHJpY2FsbHkgdG8gdGhlIGBlcXVhbHNgIG1ldGhvZHMgb2YgYm90aCBhcmd1bWVudHMsIGlmXG4gKiBwcmVzZW50LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE1LjBcbiAqIEBjYXRlZ29yeSBSZWxhdGlvblxuICogQHNpZyBhIC0+IGIgLT4gQm9vbGVhblxuICogQHBhcmFtIHsqfSBhXG4gKiBAcGFyYW0geyp9IGJcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5lcXVhbHMoMSwgMSk7IC8vPT4gdHJ1ZVxuICogICAgICBSLmVxdWFscygxLCAnMScpOyAvLz0+IGZhbHNlXG4gKiAgICAgIFIuZXF1YWxzKFsxLCAyLCAzXSwgWzEsIDIsIDNdKTsgLy89PiB0cnVlXG4gKlxuICogICAgICBjb25zdCBhID0ge307IGEudiA9IGE7XG4gKiAgICAgIGNvbnN0IGIgPSB7fTsgYi52ID0gYjtcbiAqICAgICAgUi5lcXVhbHMoYSwgYik7IC8vPT4gdHJ1ZVxuICovXG52YXIgZXF1YWxzID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gZXF1YWxzKGEsIGIpIHtcbiAgcmV0dXJuIF9lcXVhbHMoYSwgYiwgW10sIFtdKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgZXF1YWxzOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfaXNBcnJheSBmcm9tIFwiLi9pbnRlcm5hbC9faXNBcnJheS5qc1wiO1xuaW1wb3J0IF9pc09iamVjdCBmcm9tIFwiLi9pbnRlcm5hbC9faXNPYmplY3QuanNcIjtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IG9iamVjdCBieSByZWN1cnNpdmVseSBldm9sdmluZyBhIHNoYWxsb3cgY29weSBvZiBgb2JqZWN0YCxcbiAqIGFjY29yZGluZyB0byB0aGUgYHRyYW5zZm9ybWF0aW9uYCBmdW5jdGlvbnMuIEFsbCBub24tcHJpbWl0aXZlIHByb3BlcnRpZXNcbiAqIGFyZSBjb3BpZWQgYnkgcmVmZXJlbmNlLlxuICpcbiAqIEEgYHRyYW5zZm9ybWF0aW9uYCBmdW5jdGlvbiB3aWxsIG5vdCBiZSBpbnZva2VkIGlmIGl0cyBjb3JyZXNwb25kaW5nIGtleVxuICogZG9lcyBub3QgZXhpc3QgaW4gdGhlIGV2b2x2ZWQgb2JqZWN0LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjkuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyB7azogKHYgLT4gdil9IC0+IHtrOiB2fSAtPiB7azogdn1cbiAqIEBwYXJhbSB7T2JqZWN0fSB0cmFuc2Zvcm1hdGlvbnMgVGhlIG9iamVjdCBzcGVjaWZ5aW5nIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9ucyB0byBhcHBseVxuICogICAgICAgIHRvIHRoZSBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gYmUgdHJhbnNmb3JtZWQuXG4gKiBAcmV0dXJuIHtPYmplY3R9IFRoZSB0cmFuc2Zvcm1lZCBvYmplY3QuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgdG9tYXRvID0ge2ZpcnN0TmFtZTogJyAgVG9tYXRvICcsIGRhdGE6IHtlbGFwc2VkOiAxMDAsIHJlbWFpbmluZzogMTQwMH0sIGlkOjEyM307XG4gKiAgICAgIGNvbnN0IHRyYW5zZm9ybWF0aW9ucyA9IHtcbiAqICAgICAgICBmaXJzdE5hbWU6IFIudHJpbSxcbiAqICAgICAgICBsYXN0TmFtZTogUi50cmltLCAvLyBXaWxsIG5vdCBnZXQgaW52b2tlZC5cbiAqICAgICAgICBkYXRhOiB7ZWxhcHNlZDogUi5hZGQoMSksIHJlbWFpbmluZzogUi5hZGQoLTEpfVxuICogICAgICB9O1xuICogICAgICBSLmV2b2x2ZSh0cmFuc2Zvcm1hdGlvbnMsIHRvbWF0byk7IC8vPT4ge2ZpcnN0TmFtZTogJ1RvbWF0bycsIGRhdGE6IHtlbGFwc2VkOiAxMDEsIHJlbWFpbmluZzogMTM5OX0sIGlkOjEyM31cbiAqL1xudmFyIGV2b2x2ZSA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIGV2b2x2ZSh0cmFuc2Zvcm1hdGlvbnMsIG9iamVjdCkge1xuICBpZiAoIV9pc09iamVjdChvYmplY3QpICYmICFfaXNBcnJheShvYmplY3QpKSB7XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfVxuICB2YXIgcmVzdWx0ID0gb2JqZWN0IGluc3RhbmNlb2YgQXJyYXkgPyBbXSA6IHt9O1xuICB2YXIgdHJhbnNmb3JtYXRpb24sIGtleSwgdHlwZTtcbiAgZm9yIChrZXkgaW4gb2JqZWN0KSB7XG4gICAgdHJhbnNmb3JtYXRpb24gPSB0cmFuc2Zvcm1hdGlvbnNba2V5XTtcbiAgICB0eXBlID0gdHlwZW9mIHRyYW5zZm9ybWF0aW9uO1xuICAgIHJlc3VsdFtrZXldID0gdHlwZSA9PT0gJ2Z1bmN0aW9uJyA/IHRyYW5zZm9ybWF0aW9uKG9iamVjdFtrZXldKSA6IHRyYW5zZm9ybWF0aW9uICYmIHR5cGUgPT09ICdvYmplY3QnID8gZXZvbHZlKHRyYW5zZm9ybWF0aW9uLCBvYmplY3Rba2V5XSkgOiBvYmplY3Rba2V5XTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufSk7XG5leHBvcnQgZGVmYXVsdCBldm9sdmU7IiwiaW1wb3J0IF9hcnJheVJlZHVjZSBmcm9tIFwiLi9pbnRlcm5hbC9fYXJyYXlSZWR1Y2UuanNcIjtcbmltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfZGlzcGF0Y2hhYmxlIGZyb20gXCIuL2ludGVybmFsL19kaXNwYXRjaGFibGUuanNcIjtcbmltcG9ydCBfZmlsdGVyIGZyb20gXCIuL2ludGVybmFsL19maWx0ZXIuanNcIjtcbmltcG9ydCBfaXNPYmplY3QgZnJvbSBcIi4vaW50ZXJuYWwvX2lzT2JqZWN0LmpzXCI7XG5pbXBvcnQgX3hmaWx0ZXIgZnJvbSBcIi4vaW50ZXJuYWwvX3hmaWx0ZXIuanNcIjtcbmltcG9ydCBrZXlzIGZyb20gXCIuL2tleXMuanNcIjtcblxuLyoqXG4gKiBUYWtlcyBhIHByZWRpY2F0ZSBhbmQgYSBgRmlsdGVyYWJsZWAsIGFuZCByZXR1cm5zIGEgbmV3IGZpbHRlcmFibGUgb2YgdGhlXG4gKiBzYW1lIHR5cGUgY29udGFpbmluZyB0aGUgbWVtYmVycyBvZiB0aGUgZ2l2ZW4gZmlsdGVyYWJsZSB3aGljaCBzYXRpc2Z5IHRoZVxuICogZ2l2ZW4gcHJlZGljYXRlLiBGaWx0ZXJhYmxlIG9iamVjdHMgaW5jbHVkZSBwbGFpbiBvYmplY3RzIG9yIGFueSBvYmplY3RcbiAqIHRoYXQgaGFzIGEgZmlsdGVyIG1ldGhvZCBzdWNoIGFzIGBBcnJheWAuXG4gKlxuICogRGlzcGF0Y2hlcyB0byB0aGUgYGZpbHRlcmAgbWV0aG9kIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQsIGlmIHByZXNlbnQuXG4gKlxuICogQWN0cyBhcyBhIHRyYW5zZHVjZXIgaWYgYSB0cmFuc2Zvcm1lciBpcyBnaXZlbiBpbiBsaXN0IHBvc2l0aW9uLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcgRmlsdGVyYWJsZSBmID0+IChhIC0+IEJvb2xlYW4pIC0+IGYgYSAtPiBmIGFcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRcbiAqIEBwYXJhbSB7QXJyYXl9IGZpbHRlcmFibGVcbiAqIEByZXR1cm4ge0FycmF5fSBGaWx0ZXJhYmxlXG4gKiBAc2VlIFIucmVqZWN0LCBSLnRyYW5zZHVjZSwgUi5hZGRJbmRleFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IGlzRXZlbiA9IG4gPT4gbiAlIDIgPT09IDA7XG4gKlxuICogICAgICBSLmZpbHRlcihpc0V2ZW4sIFsxLCAyLCAzLCA0XSk7IC8vPT4gWzIsIDRdXG4gKlxuICogICAgICBSLmZpbHRlcihpc0V2ZW4sIHthOiAxLCBiOiAyLCBjOiAzLCBkOiA0fSk7IC8vPT4ge2I6IDIsIGQ6IDR9XG4gKi9cbnZhciBmaWx0ZXIgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MiggLyojX19QVVJFX18qL19kaXNwYXRjaGFibGUoWydmYW50YXN5LWxhbmQvZmlsdGVyJywgJ2ZpbHRlciddLCBfeGZpbHRlciwgZnVuY3Rpb24gKHByZWQsIGZpbHRlcmFibGUpIHtcbiAgcmV0dXJuIF9pc09iamVjdChmaWx0ZXJhYmxlKSA/IF9hcnJheVJlZHVjZShmdW5jdGlvbiAoYWNjLCBrZXkpIHtcbiAgICBpZiAocHJlZChmaWx0ZXJhYmxlW2tleV0pKSB7XG4gICAgICBhY2Nba2V5XSA9IGZpbHRlcmFibGVba2V5XTtcbiAgICB9XG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30sIGtleXMoZmlsdGVyYWJsZSkpIDpcbiAgLy8gZWxzZVxuICBfZmlsdGVyKHByZWQsIGZpbHRlcmFibGUpO1xufSkpO1xuZXhwb3J0IGRlZmF1bHQgZmlsdGVyOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfZGlzcGF0Y2hhYmxlIGZyb20gXCIuL2ludGVybmFsL19kaXNwYXRjaGFibGUuanNcIjtcbmltcG9ydCBfeGZpbmQgZnJvbSBcIi4vaW50ZXJuYWwvX3hmaW5kLmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgbGlzdCB3aGljaCBtYXRjaGVzIHRoZSBwcmVkaWNhdGUsIG9yXG4gKiBgdW5kZWZpbmVkYCBpZiBubyBlbGVtZW50IG1hdGNoZXMuXG4gKlxuICogRGlzcGF0Y2hlcyB0byB0aGUgYGZpbmRgIG1ldGhvZCBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50LCBpZiBwcmVzZW50LlxuICpcbiAqIEFjdHMgYXMgYSB0cmFuc2R1Y2VyIGlmIGEgdHJhbnNmb3JtZXIgaXMgZ2l2ZW4gaW4gbGlzdCBwb3NpdGlvbi5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIChhIC0+IEJvb2xlYW4pIC0+IFthXSAtPiBhIHwgdW5kZWZpbmVkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgcHJlZGljYXRlIGZ1bmN0aW9uIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBlbGVtZW50IGlzIHRoZVxuICogICAgICAgIGRlc2lyZWQgb25lLlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgYXJyYXkgdG8gY29uc2lkZXIuXG4gKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBlbGVtZW50IGZvdW5kLCBvciBgdW5kZWZpbmVkYC5cbiAqIEBzZWUgUi50cmFuc2R1Y2VcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCB4cyA9IFt7YTogMX0sIHthOiAyfSwge2E6IDN9XTtcbiAqICAgICAgUi5maW5kKFIucHJvcEVxKDIsICdhJykpKHhzKTsgLy89PiB7YTogMn1cbiAqICAgICAgUi5maW5kKFIucHJvcEVxKDQsICdhJykpKHhzKTsgLy89PiB1bmRlZmluZWRcbiAqL1xudmFyIGZpbmQgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MiggLyojX19QVVJFX18qL19kaXNwYXRjaGFibGUoWydmaW5kJ10sIF94ZmluZCwgZnVuY3Rpb24gZmluZChmbiwgbGlzdCkge1xuICB2YXIgaWR4ID0gMDtcbiAgdmFyIGxlbiA9IGxpc3QubGVuZ3RoO1xuICB3aGlsZSAoaWR4IDwgbGVuKSB7XG4gICAgaWYgKGZuKGxpc3RbaWR4XSkpIHtcbiAgICAgIHJldHVybiBsaXN0W2lkeF07XG4gICAgfVxuICAgIGlkeCArPSAxO1xuICB9XG59KSk7XG5leHBvcnQgZGVmYXVsdCBmaW5kOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfZGlzcGF0Y2hhYmxlIGZyb20gXCIuL2ludGVybmFsL19kaXNwYXRjaGFibGUuanNcIjtcbmltcG9ydCBfeGZpbmRJbmRleCBmcm9tIFwiLi9pbnRlcm5hbC9feGZpbmRJbmRleC5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBsaXN0IHdoaWNoIG1hdGNoZXMgdGhlXG4gKiBwcmVkaWNhdGUsIG9yIGAtMWAgaWYgbm8gZWxlbWVudCBtYXRjaGVzLlxuICpcbiAqIEFjdHMgYXMgYSB0cmFuc2R1Y2VyIGlmIGEgdHJhbnNmb3JtZXIgaXMgZ2l2ZW4gaW4gbGlzdCBwb3NpdGlvbi5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjFcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIChhIC0+IEJvb2xlYW4pIC0+IFthXSAtPiBOdW1iZXJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBwcmVkaWNhdGUgZnVuY3Rpb24gdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGVsZW1lbnQgaXMgdGhlXG4gKiBkZXNpcmVkIG9uZS5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGFycmF5IHRvIGNvbnNpZGVyLlxuICogQHJldHVybiB7TnVtYmVyfSBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgZm91bmQsIG9yIGAtMWAuXG4gKiBAc2VlIFIudHJhbnNkdWNlLCBSLmluZGV4T2ZcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCB4cyA9IFt7YTogMX0sIHthOiAyfSwge2E6IDN9XTtcbiAqICAgICAgUi5maW5kSW5kZXgoUi5wcm9wRXEoMiwgJ2EnKSkoeHMpOyAvLz0+IDFcbiAqICAgICAgUi5maW5kSW5kZXgoUi5wcm9wRXEoNCwgJ2EnKSkoeHMpOyAvLz0+IC0xXG4gKi9cbnZhciBmaW5kSW5kZXggPSAvKiNfX1BVUkVfXyovX2N1cnJ5MiggLyojX19QVVJFX18qL19kaXNwYXRjaGFibGUoW10sIF94ZmluZEluZGV4LCBmdW5jdGlvbiBmaW5kSW5kZXgoZm4sIGxpc3QpIHtcbiAgdmFyIGlkeCA9IDA7XG4gIHZhciBsZW4gPSBsaXN0Lmxlbmd0aDtcbiAgd2hpbGUgKGlkeCA8IGxlbikge1xuICAgIGlmIChmbihsaXN0W2lkeF0pKSB7XG4gICAgICByZXR1cm4gaWR4O1xuICAgIH1cbiAgICBpZHggKz0gMTtcbiAgfVxuICByZXR1cm4gLTE7XG59KSk7XG5leHBvcnQgZGVmYXVsdCBmaW5kSW5kZXg7IiwiaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5MS5qc1wiO1xuaW1wb3J0IF9tYWtlRmxhdCBmcm9tIFwiLi9pbnRlcm5hbC9fbWFrZUZsYXQuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IGxpc3QgYnkgcHVsbGluZyBldmVyeSBpdGVtIG91dCBvZiBpdCAoYW5kIGFsbCBpdHMgc3ViLWFycmF5cylcbiAqIGFuZCBwdXR0aW5nIHRoZW0gaW4gYSBuZXcgYXJyYXksIGRlcHRoLWZpcnN0LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgW2FdIC0+IFtiXVxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgYXJyYXkgdG8gY29uc2lkZXIuXG4gKiBAcmV0dXJuIHtBcnJheX0gVGhlIGZsYXR0ZW5lZCBsaXN0LlxuICogQHNlZSBSLnVubmVzdFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuZmxhdHRlbihbMSwgMiwgWzMsIDRdLCA1LCBbNiwgWzcsIDgsIFs5LCBbMTAsIDExXSwgMTJdXV1dKTtcbiAqICAgICAgLy89PiBbMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMl1cbiAqL1xudmFyIGZsYXR0ZW4gPSAvKiNfX1BVUkVfXyovX2N1cnJ5MSggLyojX19QVVJFX18qL19tYWtlRmxhdCh0cnVlKSk7XG5leHBvcnQgZGVmYXVsdCBmbGF0dGVuOyIsImltcG9ydCBfY2hlY2tGb3JNZXRob2QgZnJvbSBcIi4vaW50ZXJuYWwvX2NoZWNrRm9yTWV0aG9kLmpzXCI7XG5pbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5cbi8qKlxuICogSXRlcmF0ZSBvdmVyIGFuIGlucHV0IGBsaXN0YCwgY2FsbGluZyBhIHByb3ZpZGVkIGZ1bmN0aW9uIGBmbmAgZm9yIGVhY2hcbiAqIGVsZW1lbnQgaW4gdGhlIGxpc3QuXG4gKlxuICogYGZuYCByZWNlaXZlcyBvbmUgYXJndW1lbnQ6ICoodmFsdWUpKi5cbiAqXG4gKiBOb3RlOiBgUi5mb3JFYWNoYCBkb2VzIG5vdCBza2lwIGRlbGV0ZWQgb3IgdW5hc3NpZ25lZCBpbmRpY2VzIChzcGFyc2VcbiAqIGFycmF5cyksIHVubGlrZSB0aGUgbmF0aXZlIGBBcnJheS5wcm90b3R5cGUuZm9yRWFjaGAgbWV0aG9kLiBGb3IgbW9yZVxuICogZGV0YWlscyBvbiB0aGlzIGJlaGF2aW9yLCBzZWU6XG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9mb3JFYWNoI0Rlc2NyaXB0aW9uXG4gKlxuICogQWxzbyBub3RlIHRoYXQsIHVubGlrZSBgQXJyYXkucHJvdG90eXBlLmZvckVhY2hgLCBSYW1kYSdzIGBmb3JFYWNoYCByZXR1cm5zXG4gKiB0aGUgb3JpZ2luYWwgYXJyYXkuIEluIHNvbWUgbGlicmFyaWVzIHRoaXMgZnVuY3Rpb24gaXMgbmFtZWQgYGVhY2hgLlxuICpcbiAqIERpc3BhdGNoZXMgdG8gdGhlIGBmb3JFYWNoYCBtZXRob2Qgb2YgdGhlIHNlY29uZCBhcmd1bWVudCwgaWYgcHJlc2VudC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjFcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIChhIC0+ICopIC0+IFthXSAtPiBbYV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBpbnZva2UuIFJlY2VpdmVzIG9uZSBhcmd1bWVudCwgYHZhbHVlYC5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGxpc3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHJldHVybiB7QXJyYXl9IFRoZSBvcmlnaW5hbCBsaXN0LlxuICogQHNlZSBSLmFkZEluZGV4XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgcHJpbnRYUGx1c0ZpdmUgPSB4ID0+IGNvbnNvbGUubG9nKHggKyA1KTtcbiAqICAgICAgUi5mb3JFYWNoKHByaW50WFBsdXNGaXZlLCBbMSwgMiwgM10pOyAvLz0+IFsxLCAyLCAzXVxuICogICAgICAvLyBsb2dzIDZcbiAqICAgICAgLy8gbG9ncyA3XG4gKiAgICAgIC8vIGxvZ3MgOFxuICogQHN5bWIgUi5mb3JFYWNoKGYsIFthLCBiLCBjXSkgPSBbYSwgYiwgY11cbiAqL1xudmFyIGZvckVhY2ggPSAvKiNfX1BVUkVfXyovX2N1cnJ5MiggLyojX19QVVJFX18qL19jaGVja0Zvck1ldGhvZCgnZm9yRWFjaCcsIGZ1bmN0aW9uIGZvckVhY2goZm4sIGxpc3QpIHtcbiAgdmFyIGxlbiA9IGxpc3QubGVuZ3RoO1xuICB2YXIgaWR4ID0gMDtcbiAgd2hpbGUgKGlkeCA8IGxlbikge1xuICAgIGZuKGxpc3RbaWR4XSk7XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIGxpc3Q7XG59KSk7XG5leHBvcnQgZGVmYXVsdCBmb3JFYWNoOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBrZXlzIGZyb20gXCIuL2tleXMuanNcIjtcblxuLyoqXG4gKiBJdGVyYXRlIG92ZXIgYW4gaW5wdXQgYG9iamVjdGAsIGNhbGxpbmcgYSBwcm92aWRlZCBmdW5jdGlvbiBgZm5gIGZvciBlYWNoXG4gKiBrZXkgYW5kIHZhbHVlIGluIHRoZSBvYmplY3QuXG4gKlxuICogYGZuYCByZWNlaXZlcyB0aHJlZSBhcmd1bWVudDogKih2YWx1ZSwga2V5LCBvYmopKi5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4yMy4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnICgoYSwgU3RyaW5nLCBTdHJNYXAgYSkgLT4gQW55KSAtPiBTdHJNYXAgYSAtPiBTdHJNYXAgYVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIGludm9rZS4gUmVjZWl2ZXMgdGhyZWUgYXJndW1lbnQsIGB2YWx1ZWAsIGBrZXlgLCBgb2JqYC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBvcmlnaW5hbCBvYmplY3QuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgcHJpbnRLZXlDb25jYXRWYWx1ZSA9ICh2YWx1ZSwga2V5KSA9PiBjb25zb2xlLmxvZyhrZXkgKyAnOicgKyB2YWx1ZSk7XG4gKiAgICAgIFIuZm9yRWFjaE9iakluZGV4ZWQocHJpbnRLZXlDb25jYXRWYWx1ZSwge3g6IDEsIHk6IDJ9KTsgLy89PiB7eDogMSwgeTogMn1cbiAqICAgICAgLy8gbG9ncyB4OjFcbiAqICAgICAgLy8gbG9ncyB5OjJcbiAqIEBzeW1iIFIuZm9yRWFjaE9iakluZGV4ZWQoZiwge3g6IGEsIHk6IGJ9KSA9IHt4OiBhLCB5OiBifVxuICovXG52YXIgZm9yRWFjaE9iakluZGV4ZWQgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiBmb3JFYWNoT2JqSW5kZXhlZChmbiwgb2JqKSB7XG4gIHZhciBrZXlMaXN0ID0ga2V5cyhvYmopO1xuICB2YXIgaWR4ID0gMDtcbiAgd2hpbGUgKGlkeCA8IGtleUxpc3QubGVuZ3RoKSB7XG4gICAgdmFyIGtleSA9IGtleUxpc3RbaWR4XTtcbiAgICBmbihvYmpba2V5XSwga2V5LCBvYmopO1xuICAgIGlkeCArPSAxO1xuICB9XG4gIHJldHVybiBvYmo7XG59KTtcbmV4cG9ydCBkZWZhdWx0IGZvckVhY2hPYmpJbmRleGVkOyIsImltcG9ydCBfY2hlY2tGb3JNZXRob2QgZnJvbSBcIi4vaW50ZXJuYWwvX2NoZWNrRm9yTWV0aG9kLmpzXCI7XG5pbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgcmVkdWNlQnkgZnJvbSBcIi4vcmVkdWNlQnkuanNcIjtcblxuLyoqXG4gKiBTcGxpdHMgYSBsaXN0IGludG8gc3ViLWxpc3RzIHN0b3JlZCBpbiBhbiBvYmplY3QsIGJhc2VkIG9uIHRoZSByZXN1bHQgb2ZcbiAqIGNhbGxpbmcgYSBrZXktcmV0dXJuaW5nIGZ1bmN0aW9uIG9uIGVhY2ggZWxlbWVudCwgYW5kIGdyb3VwaW5nIHRoZVxuICogcmVzdWx0cyBhY2NvcmRpbmcgdG8gdmFsdWVzIHJldHVybmVkLlxuICpcbiAqIERpc3BhdGNoZXMgdG8gdGhlIGBncm91cEJ5YCBtZXRob2Qgb2YgdGhlIHNlY29uZCBhcmd1bWVudCwgaWYgcHJlc2VudC5cbiAqXG4gKiBBY3RzIGFzIGEgdHJhbnNkdWNlciBpZiBhIHRyYW5zZm9ybWVyIGlzIGdpdmVuIGluIGxpc3QgcG9zaXRpb24uXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHR5cGVkZWZuIElkeCA9IFN0cmluZyB8IEludCB8IFN5bWJvbFxuICogQHNpZyBJZHggYSA9PiAoYiAtPiBhKSAtPiBbYl0gLT4ge2E6IFtiXX1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIEZ1bmN0aW9uIDo6IGEgLT4gSWR4XG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBhcnJheSB0byBncm91cFxuICogQHJldHVybiB7T2JqZWN0fSBBbiBvYmplY3Qgd2l0aCB0aGUgb3V0cHV0IG9mIGBmbmAgZm9yIGtleXMsIG1hcHBlZCB0byBhcnJheXMgb2YgZWxlbWVudHNcbiAqICAgICAgICAgdGhhdCBwcm9kdWNlZCB0aGF0IGtleSB3aGVuIHBhc3NlZCB0byBgZm5gLlxuICogQHNlZSBSLnJlZHVjZUJ5LCBSLnRyYW5zZHVjZSwgUi5pbmRleEJ5LCBSLmNvbGxlY3RCeVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IGJ5R3JhZGUgPSBSLmdyb3VwQnkoZnVuY3Rpb24oc3R1ZGVudCkge1xuICogICAgICAgIGNvbnN0IHNjb3JlID0gc3R1ZGVudC5zY29yZTtcbiAqICAgICAgICByZXR1cm4gc2NvcmUgPCA2NSA/ICdGJyA6XG4gKiAgICAgICAgICAgICAgIHNjb3JlIDwgNzAgPyAnRCcgOlxuICogICAgICAgICAgICAgICBzY29yZSA8IDgwID8gJ0MnIDpcbiAqICAgICAgICAgICAgICAgc2NvcmUgPCA5MCA/ICdCJyA6ICdBJztcbiAqICAgICAgfSk7XG4gKiAgICAgIGNvbnN0IHN0dWRlbnRzID0gW3tuYW1lOiAnQWJieScsIHNjb3JlOiA4NH0sXG4gKiAgICAgICAgICAgICAgICAgICAgICB7bmFtZTogJ0VkZHknLCBzY29yZTogNTh9LFxuICogICAgICAgICAgICAgICAgICAgICAgLy8gLi4uXG4gKiAgICAgICAgICAgICAgICAgICAgICB7bmFtZTogJ0phY2snLCBzY29yZTogNjl9XTtcbiAqICAgICAgYnlHcmFkZShzdHVkZW50cyk7XG4gKiAgICAgIC8vIHtcbiAqICAgICAgLy8gICAnQSc6IFt7bmFtZTogJ0RpYW5uZScsIHNjb3JlOiA5OX1dLFxuICogICAgICAvLyAgICdCJzogW3tuYW1lOiAnQWJieScsIHNjb3JlOiA4NH1dXG4gKiAgICAgIC8vICAgLy8gLi4uLFxuICogICAgICAvLyAgICdGJzogW3tuYW1lOiAnRWRkeScsIHNjb3JlOiA1OH1dXG4gKiAgICAgIC8vIH1cbiAqL1xudmFyIGdyb3VwQnkgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MiggLyojX19QVVJFX18qL19jaGVja0Zvck1ldGhvZCgnZ3JvdXBCeScsIC8qI19fUFVSRV9fKi9yZWR1Y2VCeShmdW5jdGlvbiAoYWNjLCBpdGVtKSB7XG4gIGFjYy5wdXNoKGl0ZW0pO1xuICByZXR1cm4gYWNjO1xufSwgW10pKSk7XG5leHBvcnQgZGVmYXVsdCBncm91cEJ5OyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBoYXNQYXRoIGZyb20gXCIuL2hhc1BhdGguanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IGFuIG9iamVjdCBoYXMgYW4gb3duIHByb3BlcnR5IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuNy4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnIHMgLT4ge3M6IHh9IC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBjaGVjayBmb3IuXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJuIHtCb29sZWFufSBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBleGlzdHMuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgaGFzTmFtZSA9IFIuaGFzKCduYW1lJyk7XG4gKiAgICAgIGhhc05hbWUoe25hbWU6ICdhbGljZSd9KTsgICAvLz0+IHRydWVcbiAqICAgICAgaGFzTmFtZSh7bmFtZTogJ2JvYid9KTsgICAgIC8vPT4gdHJ1ZVxuICogICAgICBoYXNOYW1lKHt9KTsgICAgICAgICAgICAgICAgLy89PiBmYWxzZVxuICpcbiAqICAgICAgY29uc3QgcG9pbnQgPSB7eDogMCwgeTogMH07XG4gKiAgICAgIGNvbnN0IHBvaW50SGFzID0gUi5oYXMoUi5fXywgcG9pbnQpO1xuICogICAgICBwb2ludEhhcygneCcpOyAgLy89PiB0cnVlXG4gKiAgICAgIHBvaW50SGFzKCd5Jyk7ICAvLz0+IHRydWVcbiAqICAgICAgcG9pbnRIYXMoJ3onKTsgIC8vPT4gZmFsc2VcbiAqL1xudmFyIGhhcyA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIGhhcyhwcm9wLCBvYmopIHtcbiAgcmV0dXJuIGhhc1BhdGgoW3Byb3BdLCBvYmopO1xufSk7XG5leHBvcnQgZGVmYXVsdCBoYXM7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9oYXMgZnJvbSBcIi4vaW50ZXJuYWwvX2hhcy5qc1wiO1xuaW1wb3J0IGlzTmlsIGZyb20gXCIuL2lzTmlsLmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCBhIHBhdGggZXhpc3RzIGluIGFuIG9iamVjdC4gT25seSB0aGUgb2JqZWN0J3NcbiAqIG93biBwcm9wZXJ0aWVzIGFyZSBjaGVja2VkLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjI2LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEB0eXBlZGVmbiBJZHggPSBTdHJpbmcgfCBJbnQgfCBTeW1ib2xcbiAqIEBzaWcgW0lkeF0gLT4ge2F9IC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7QXJyYXl9IHBhdGggVGhlIHBhdGggdG8gdXNlLlxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIGNoZWNrIHRoZSBwYXRoIGluLlxuICogQHJldHVybiB7Qm9vbGVhbn0gV2hldGhlciB0aGUgcGF0aCBleGlzdHMuXG4gKiBAc2VlIFIuaGFzXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5oYXNQYXRoKFsnYScsICdiJ10sIHthOiB7YjogMn19KTsgICAgICAgICAvLyA9PiB0cnVlXG4gKiAgICAgIFIuaGFzUGF0aChbJ2EnLCAnYiddLCB7YToge2I6IHVuZGVmaW5lZH19KTsgLy8gPT4gdHJ1ZVxuICogICAgICBSLmhhc1BhdGgoWydhJywgJ2InXSwge2E6IHtjOiAyfX0pOyAgICAgICAgIC8vID0+IGZhbHNlXG4gKiAgICAgIFIuaGFzUGF0aChbJ2EnLCAnYiddLCB7fSk7ICAgICAgICAgICAgICAgICAgLy8gPT4gZmFsc2VcbiAqL1xudmFyIGhhc1BhdGggPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiBoYXNQYXRoKF9wYXRoLCBvYmopIHtcbiAgaWYgKF9wYXRoLmxlbmd0aCA9PT0gMCB8fCBpc05pbChvYmopKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciB2YWwgPSBvYmo7XG4gIHZhciBpZHggPSAwO1xuICB3aGlsZSAoaWR4IDwgX3BhdGgubGVuZ3RoKSB7XG4gICAgaWYgKCFpc05pbCh2YWwpICYmIF9oYXMoX3BhdGhbaWR4XSwgdmFsKSkge1xuICAgICAgdmFsID0gdmFsW19wYXRoW2lkeF1dO1xuICAgICAgaWR4ICs9IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59KTtcbmV4cG9ydCBkZWZhdWx0IGhhc1BhdGg7IiwiaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5MS5qc1wiO1xuaW1wb3J0IF9pZGVudGl0eSBmcm9tIFwiLi9pbnRlcm5hbC9faWRlbnRpdHkuanNcIjtcblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHRoYXQgZG9lcyBub3RoaW5nIGJ1dCByZXR1cm4gdGhlIHBhcmFtZXRlciBzdXBwbGllZCB0byBpdC4gR29vZFxuICogYXMgYSBkZWZhdWx0IG9yIHBsYWNlaG9sZGVyIGZ1bmN0aW9uLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnIGEgLT4gYVxuICogQHBhcmFtIHsqfSB4IFRoZSB2YWx1ZSB0byByZXR1cm4uXG4gKiBAcmV0dXJuIHsqfSBUaGUgaW5wdXQgdmFsdWUsIGB4YC5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmlkZW50aXR5KDEpOyAvLz0+IDFcbiAqXG4gKiAgICAgIGNvbnN0IG9iaiA9IHt9O1xuICogICAgICBSLmlkZW50aXR5KG9iaikgPT09IG9iajsgLy89PiB0cnVlXG4gKiBAc3ltYiBSLmlkZW50aXR5KGEpID0gYVxuICovXG52YXIgaWRlbnRpdHkgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MShfaWRlbnRpdHkpO1xuZXhwb3J0IGRlZmF1bHQgaWRlbnRpdHk7IiwiaW1wb3J0IF9pbmNsdWRlcyBmcm9tIFwiLi9pbnRlcm5hbC9faW5jbHVkZXMuanNcIjtcbmltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgc3BlY2lmaWVkIHZhbHVlIGlzIGVxdWFsLCBpbiBbYFIuZXF1YWxzYF0oI2VxdWFscylcbiAqIHRlcm1zLCB0byBhdCBsZWFzdCBvbmUgZWxlbWVudCBvZiB0aGUgZ2l2ZW4gbGlzdDsgYGZhbHNlYCBvdGhlcndpc2UuXG4gKiBBbHNvIHdvcmtzIHdpdGggc3RyaW5ncy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4yNi4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBhIC0+IFthXSAtPiBCb29sZWFuXG4gKiBAcGFyYW0ge09iamVjdH0gYSBUaGUgaXRlbSB0byBjb21wYXJlIGFnYWluc3QuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBhcnJheSB0byBjb25zaWRlci5cbiAqIEByZXR1cm4ge0Jvb2xlYW59IGB0cnVlYCBpZiBhbiBlcXVpdmFsZW50IGl0ZW0gaXMgaW4gdGhlIGxpc3QsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICogQHNlZSBSLmFueVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuaW5jbHVkZXMoMywgWzEsIDIsIDNdKTsgLy89PiB0cnVlXG4gKiAgICAgIFIuaW5jbHVkZXMoNCwgWzEsIDIsIDNdKTsgLy89PiBmYWxzZVxuICogICAgICBSLmluY2x1ZGVzKHsgbmFtZTogJ0ZyZWQnIH0sIFt7IG5hbWU6ICdGcmVkJyB9XSk7IC8vPT4gdHJ1ZVxuICogICAgICBSLmluY2x1ZGVzKFs0Ml0sIFtbNDJdXSk7IC8vPT4gdHJ1ZVxuICogICAgICBSLmluY2x1ZGVzKCdiYScsICdiYW5hbmEnKTsgLy89PnRydWVcbiAqL1xudmFyIGluY2x1ZGVzID0gLyojX19QVVJFX18qL19jdXJyeTIoX2luY2x1ZGVzKTtcbmV4cG9ydCBkZWZhdWx0IGluY2x1ZGVzOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfaW5kZXhPZiBmcm9tIFwiLi9pbnRlcm5hbC9faW5kZXhPZi5qc1wiO1xuaW1wb3J0IF9pc0FycmF5IGZyb20gXCIuL2ludGVybmFsL19pc0FycmF5LmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgYW4gaXRlbSBpbiBhbiBhcnJheSwgb3IgLTFcbiAqIGlmIHRoZSBpdGVtIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgYXJyYXkuIFtgUi5lcXVhbHNgXSgjZXF1YWxzKSBpcyB1c2VkIHRvXG4gKiBkZXRlcm1pbmUgZXF1YWxpdHkuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBhIC0+IFthXSAtPiBOdW1iZXJcbiAqIEBwYXJhbSB7Kn0gdGFyZ2V0IFRoZSBpdGVtIHRvIGZpbmQuXG4gKiBAcGFyYW0ge0FycmF5fSB4cyBUaGUgYXJyYXkgdG8gc2VhcmNoIGluLlxuICogQHJldHVybiB7TnVtYmVyfSB0aGUgaW5kZXggb2YgdGhlIHRhcmdldCwgb3IgLTEgaWYgdGhlIHRhcmdldCBpcyBub3QgZm91bmQuXG4gKiBAc2VlIFIubGFzdEluZGV4T2YsIFIuZmluZEluZGV4XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5pbmRleE9mKDMsIFsxLDIsMyw0XSk7IC8vPT4gMlxuICogICAgICBSLmluZGV4T2YoMTAsIFsxLDIsMyw0XSk7IC8vPT4gLTFcbiAqL1xudmFyIGluZGV4T2YgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiBpbmRleE9mKHRhcmdldCwgeHMpIHtcbiAgcmV0dXJuIHR5cGVvZiB4cy5pbmRleE9mID09PSAnZnVuY3Rpb24nICYmICFfaXNBcnJheSh4cykgPyB4cy5pbmRleE9mKHRhcmdldCkgOiBfaW5kZXhPZih4cywgdGFyZ2V0LCAwKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgaW5kZXhPZjsiLCJpbXBvcnQgX2N1cnJ5MyBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkzLmpzXCI7XG5cbi8qKlxuICogSW5zZXJ0cyB0aGUgc3VwcGxpZWQgZWxlbWVudCBpbnRvIHRoZSBsaXN0LCBhdCB0aGUgc3BlY2lmaWVkIGBpbmRleGAuIF9Ob3RlIHRoYXRcblxuICogdGhpcyBpcyBub3QgZGVzdHJ1Y3RpdmVfOiBpdCByZXR1cm5zIGEgY29weSBvZiB0aGUgbGlzdCB3aXRoIHRoZSBjaGFuZ2VzLlxuICogPHNtYWxsPk5vIGxpc3RzIGhhdmUgYmVlbiBoYXJtZWQgaW4gdGhlIGFwcGxpY2F0aW9uIG9mIHRoaXMgZnVuY3Rpb24uPC9zbWFsbD5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4yLjJcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIE51bWJlciAtPiBhIC0+IFthXSAtPiBbYV1cbiAqIEBwYXJhbSB7TnVtYmVyfSBpbmRleCBUaGUgcG9zaXRpb24gdG8gaW5zZXJ0IHRoZSBlbGVtZW50XG4gKiBAcGFyYW0geyp9IGVsdCBUaGUgZWxlbWVudCB0byBpbnNlcnQgaW50byB0aGUgQXJyYXlcbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGxpc3QgdG8gaW5zZXJ0IGludG9cbiAqIEByZXR1cm4ge0FycmF5fSBBIG5ldyBBcnJheSB3aXRoIGBlbHRgIGluc2VydGVkIGF0IGBpbmRleGAuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5pbnNlcnQoMiwgJ3gnLCBbMSwyLDMsNF0pOyAvLz0+IFsxLDIsJ3gnLDMsNF1cbiAqL1xudmFyIGluc2VydCA9IC8qI19fUFVSRV9fKi9fY3VycnkzKGZ1bmN0aW9uIGluc2VydChpZHgsIGVsdCwgbGlzdCkge1xuICBpZHggPSBpZHggPCBsaXN0Lmxlbmd0aCAmJiBpZHggPj0gMCA/IGlkeCA6IGxpc3QubGVuZ3RoO1xuICB2YXIgcmVzdWx0ID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobGlzdCwgMCk7XG4gIHJlc3VsdC5zcGxpY2UoaWR4LCAwLCBlbHQpO1xuICByZXR1cm4gcmVzdWx0O1xufSk7XG5leHBvcnQgZGVmYXVsdCBpbnNlcnQ7IiwiaW1wb3J0IF9pbmNsdWRlcyBmcm9tIFwiLi9faW5jbHVkZXMuanNcIjtcbnZhciBfU2V0ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gX1NldCgpIHtcbiAgICAvKiBnbG9iYWxzIFNldCAqL1xuICAgIHRoaXMuX25hdGl2ZVNldCA9IHR5cGVvZiBTZXQgPT09ICdmdW5jdGlvbicgPyBuZXcgU2V0KCkgOiBudWxsO1xuICAgIHRoaXMuX2l0ZW1zID0ge307XG4gIH1cbiAgLy8gdW50aWwgd2UgZmlndXJlIG91dCB3aHkganNkb2MgY2hva2VzIG9uIHRoaXNcbiAgLy8gQHBhcmFtIGl0ZW0gVGhlIGl0ZW0gdG8gYWRkIHRvIHRoZSBTZXRcbiAgLy8gQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgdGhlIGl0ZW0gZGlkIG5vdCBleGlzdCBwcmlvciwgb3RoZXJ3aXNlIGZhbHNlXG4gIC8vXG4gIF9TZXQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgcmV0dXJuICFoYXNPckFkZChpdGVtLCB0cnVlLCB0aGlzKTtcbiAgfTtcblxuICAvL1xuICAvLyBAcGFyYW0gaXRlbSBUaGUgaXRlbSB0byBjaGVjayBmb3IgZXhpc3RlbmNlIGluIHRoZSBTZXRcbiAgLy8gQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgdGhlIGl0ZW0gZXhpc3RzIGluIHRoZSBTZXQsIG90aGVyd2lzZSBmYWxzZVxuICAvL1xuICBfU2V0LnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAoaXRlbSkge1xuICAgIHJldHVybiBoYXNPckFkZChpdGVtLCBmYWxzZSwgdGhpcyk7XG4gIH07XG5cbiAgLy9cbiAgLy8gQ29tYmluZXMgdGhlIGxvZ2ljIGZvciBjaGVja2luZyB3aGV0aGVyIGFuIGl0ZW0gaXMgYSBtZW1iZXIgb2YgdGhlIHNldCBhbmRcbiAgLy8gZm9yIGFkZGluZyBhIG5ldyBpdGVtIHRvIHRoZSBzZXQuXG4gIC8vXG4gIC8vIEBwYXJhbSBpdGVtICAgICAgIFRoZSBpdGVtIHRvIGNoZWNrIG9yIGFkZCB0byB0aGUgU2V0IGluc3RhbmNlLlxuICAvLyBAcGFyYW0gc2hvdWxkQWRkICBJZiB0cnVlLCB0aGUgaXRlbSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBzZXQgaWYgaXQgZG9lc24ndFxuICAvLyAgICAgICAgICAgICAgICAgICBhbHJlYWR5IGV4aXN0LlxuICAvLyBAcGFyYW0gc2V0ICAgICAgICBUaGUgc2V0IGluc3RhbmNlIHRvIGNoZWNrIG9yIGFkZCB0by5cbiAgLy8gQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgaXRlbSBhbHJlYWR5IGV4aXN0ZWQsIG90aGVyd2lzZSBmYWxzZS5cbiAgLy9cbiAgcmV0dXJuIF9TZXQ7XG59KCk7XG5mdW5jdGlvbiBoYXNPckFkZChpdGVtLCBzaG91bGRBZGQsIHNldCkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiBpdGVtO1xuICB2YXIgcHJldlNpemUsIG5ld1NpemU7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIC8vIGRpc3Rpbmd1aXNoIGJldHdlZW4gKzAgYW5kIC0wXG4gICAgICBpZiAoaXRlbSA9PT0gMCAmJiAxIC8gaXRlbSA9PT0gLUluZmluaXR5KSB7XG4gICAgICAgIGlmIChzZXQuX2l0ZW1zWyctMCddKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHNob3VsZEFkZCkge1xuICAgICAgICAgICAgc2V0Ll9pdGVtc1snLTAnXSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gdGhlc2UgdHlwZXMgY2FuIGFsbCB1dGlsaXNlIHRoZSBuYXRpdmUgU2V0XG4gICAgICBpZiAoc2V0Ll9uYXRpdmVTZXQgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKHNob3VsZEFkZCkge1xuICAgICAgICAgIHByZXZTaXplID0gc2V0Ll9uYXRpdmVTZXQuc2l6ZTtcbiAgICAgICAgICBzZXQuX25hdGl2ZVNldC5hZGQoaXRlbSk7XG4gICAgICAgICAgbmV3U2l6ZSA9IHNldC5fbmF0aXZlU2V0LnNpemU7XG4gICAgICAgICAgcmV0dXJuIG5ld1NpemUgPT09IHByZXZTaXplO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBzZXQuX25hdGl2ZVNldC5oYXMoaXRlbSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghKHR5cGUgaW4gc2V0Ll9pdGVtcykpIHtcbiAgICAgICAgICBpZiAoc2hvdWxkQWRkKSB7XG4gICAgICAgICAgICBzZXQuX2l0ZW1zW3R5cGVdID0ge307XG4gICAgICAgICAgICBzZXQuX2l0ZW1zW3R5cGVdW2l0ZW1dID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKGl0ZW0gaW4gc2V0Ll9pdGVtc1t0eXBlXSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChzaG91bGRBZGQpIHtcbiAgICAgICAgICAgIHNldC5faXRlbXNbdHlwZV1baXRlbV0gPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIC8vIHNldC5faXRlbXNbJ2Jvb2xlYW4nXSBob2xkcyBhIHR3byBlbGVtZW50IGFycmF5XG4gICAgICAvLyByZXByZXNlbnRpbmcgWyBmYWxzZUV4aXN0cywgdHJ1ZUV4aXN0cyBdXG4gICAgICBpZiAodHlwZSBpbiBzZXQuX2l0ZW1zKSB7XG4gICAgICAgIHZhciBiSWR4ID0gaXRlbSA/IDEgOiAwO1xuICAgICAgICBpZiAoc2V0Ll9pdGVtc1t0eXBlXVtiSWR4XSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChzaG91bGRBZGQpIHtcbiAgICAgICAgICAgIHNldC5faXRlbXNbdHlwZV1bYklkeF0gPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChzaG91bGRBZGQpIHtcbiAgICAgICAgICBzZXQuX2l0ZW1zW3R5cGVdID0gaXRlbSA/IFtmYWxzZSwgdHJ1ZV0gOiBbdHJ1ZSwgZmFsc2VdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICAvLyBjb21wYXJlIGZ1bmN0aW9ucyBmb3IgcmVmZXJlbmNlIGVxdWFsaXR5XG4gICAgICBpZiAoc2V0Ll9uYXRpdmVTZXQgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKHNob3VsZEFkZCkge1xuICAgICAgICAgIHByZXZTaXplID0gc2V0Ll9uYXRpdmVTZXQuc2l6ZTtcbiAgICAgICAgICBzZXQuX25hdGl2ZVNldC5hZGQoaXRlbSk7XG4gICAgICAgICAgbmV3U2l6ZSA9IHNldC5fbmF0aXZlU2V0LnNpemU7XG4gICAgICAgICAgcmV0dXJuIG5ld1NpemUgPT09IHByZXZTaXplO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBzZXQuX25hdGl2ZVNldC5oYXMoaXRlbSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghKHR5cGUgaW4gc2V0Ll9pdGVtcykpIHtcbiAgICAgICAgICBpZiAoc2hvdWxkQWRkKSB7XG4gICAgICAgICAgICBzZXQuX2l0ZW1zW3R5cGVdID0gW2l0ZW1dO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFfaW5jbHVkZXMoaXRlbSwgc2V0Ll9pdGVtc1t0eXBlXSkpIHtcbiAgICAgICAgICBpZiAoc2hvdWxkQWRkKSB7XG4gICAgICAgICAgICBzZXQuX2l0ZW1zW3R5cGVdLnB1c2goaXRlbSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgaWYgKHNldC5faXRlbXNbdHlwZV0pIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoc2hvdWxkQWRkKSB7XG4gICAgICAgICAgc2V0Ll9pdGVtc1t0eXBlXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICBpZiAoaXRlbSA9PT0gbnVsbCkge1xuICAgICAgICBpZiAoIXNldC5faXRlbXNbJ251bGwnXSkge1xuICAgICAgICAgIGlmIChzaG91bGRBZGQpIHtcbiAgICAgICAgICAgIHNldC5faXRlbXNbJ251bGwnXSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIHJlZHVjZSB0aGUgc2VhcmNoIHNpemUgb2YgaGV0ZXJvZ2VuZW91cyBzZXRzIGJ5IGNyZWF0aW5nIGJ1Y2tldHNcbiAgICAgIC8vIGZvciBlYWNoIHR5cGUuXG4gICAgICB0eXBlID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGl0ZW0pO1xuICAgICAgaWYgKCEodHlwZSBpbiBzZXQuX2l0ZW1zKSkge1xuICAgICAgICBpZiAoc2hvdWxkQWRkKSB7XG4gICAgICAgICAgc2V0Ll9pdGVtc1t0eXBlXSA9IFtpdGVtXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICAvLyBzY2FuIHRocm91Z2ggYWxsIHByZXZpb3VzbHkgYXBwbGllZCBpdGVtc1xuICAgICAgaWYgKCFfaW5jbHVkZXMoaXRlbSwgc2V0Ll9pdGVtc1t0eXBlXSkpIHtcbiAgICAgICAgaWYgKHNob3VsZEFkZCkge1xuICAgICAgICAgIHNldC5faXRlbXNbdHlwZV0ucHVzaChpdGVtKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG4vLyBBIHNpbXBsZSBTZXQgdHlwZSB0aGF0IGhvbm91cnMgUi5lcXVhbHMgc2VtYW50aWNzXG5leHBvcnQgZGVmYXVsdCBfU2V0OyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9hcml0eShuLCBmbikge1xuICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xuICBzd2l0Y2ggKG4pIHtcbiAgICBjYXNlIDA6XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgY2FzZSAxOlxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhMCkge1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhMCwgYTEpIHtcbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9O1xuICAgIGNhc2UgMzpcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoYTAsIGExLCBhMikge1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgY2FzZSA0OlxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhMCwgYTEsIGEyLCBhMykge1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgY2FzZSA1OlxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhMCwgYTEsIGEyLCBhMywgYTQpIHtcbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9O1xuICAgIGNhc2UgNjpcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSkge1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgY2FzZSA3OlxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNikge1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgY2FzZSA4OlxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcpIHtcbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9O1xuICAgIGNhc2UgOTpcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCkge1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgY2FzZSAxMDpcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTkpIHtcbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9O1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZpcnN0IGFyZ3VtZW50IHRvIF9hcml0eSBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIgbm8gZ3JlYXRlciB0aGFuIHRlbicpO1xuICB9XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2FycmF5RnJvbUl0ZXJhdG9yKGl0ZXIpIHtcbiAgdmFyIGxpc3QgPSBbXTtcbiAgdmFyIG5leHQ7XG4gIHdoaWxlICghKG5leHQgPSBpdGVyLm5leHQoKSkuZG9uZSkge1xuICAgIGxpc3QucHVzaChuZXh0LnZhbHVlKTtcbiAgfVxuICByZXR1cm4gbGlzdDtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfYXJyYXlSZWR1Y2UocmVkdWNlciwgYWNjLCBsaXN0KSB7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBsZW5ndGggPSBsaXN0Lmxlbmd0aDtcbiAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgYWNjID0gcmVkdWNlcihhY2MsIGxpc3RbaW5kZXhdKTtcbiAgICBpbmRleCArPSAxO1xuICB9XG4gIHJldHVybiBhY2M7XG59IiwiaW1wb3J0IF9pc0FycmF5IGZyb20gXCIuL19pc0FycmF5LmpzXCI7XG5pbXBvcnQgX2lzSW50ZWdlciBmcm9tIFwiLi9faXNJbnRlZ2VyLmpzXCI7XG5cbi8qKlxuICogTWFrZXMgYSBzaGFsbG93IGNsb25lIG9mIGFuIG9iamVjdCwgc2V0dGluZyBvciBvdmVycmlkaW5nIHRoZSBzcGVjaWZpZWRcbiAqIHByb3BlcnR5IHdpdGggdGhlIGdpdmVuIHZhbHVlLiBOb3RlIHRoYXQgdGhpcyBjb3BpZXMgYW5kIGZsYXR0ZW5zIHByb3RvdHlwZVxuICogcHJvcGVydGllcyBvbnRvIHRoZSBuZXcgb2JqZWN0IGFzIHdlbGwuIEFsbCBub24tcHJpbWl0aXZlIHByb3BlcnRpZXMgYXJlXG4gKiBjb3BpZWQgYnkgcmVmZXJlbmNlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1N0cmluZ3xOdW1iZXJ9IHByb3AgVGhlIHByb3BlcnR5IG5hbWUgdG8gc2V0XG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgbmV3IHZhbHVlXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheX0gb2JqIFRoZSBvYmplY3QgdG8gY2xvbmVcbiAqIEByZXR1cm4ge09iamVjdHxBcnJheX0gQSBuZXcgb2JqZWN0IGVxdWl2YWxlbnQgdG8gdGhlIG9yaWdpbmFsIGV4Y2VwdCBmb3IgdGhlIGNoYW5nZWQgcHJvcGVydHkuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9hc3NvYyhwcm9wLCB2YWwsIG9iaikge1xuICBpZiAoX2lzSW50ZWdlcihwcm9wKSAmJiBfaXNBcnJheShvYmopKSB7XG4gICAgdmFyIGFyciA9IFtdLmNvbmNhdChvYmopO1xuICAgIGFycltwcm9wXSA9IHZhbDtcbiAgICByZXR1cm4gYXJyO1xuICB9XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBvYmopIHtcbiAgICByZXN1bHRbcF0gPSBvYmpbcF07XG4gIH1cbiAgcmVzdWx0W3Byb3BdID0gdmFsO1xuICByZXR1cm4gcmVzdWx0O1xufSIsImltcG9ydCBfaXNBcnJheSBmcm9tIFwiLi9faXNBcnJheS5qc1wiO1xuXG4vKipcbiAqIFRoaXMgY2hlY2tzIHdoZXRoZXIgYSBmdW5jdGlvbiBoYXMgYSBbbWV0aG9kbmFtZV0gZnVuY3Rpb24uIElmIGl0IGlzbid0IGFuXG4gKiBhcnJheSBpdCB3aWxsIGV4ZWN1dGUgdGhhdCBmdW5jdGlvbiBvdGhlcndpc2UgaXQgd2lsbCBkZWZhdWx0IHRvIHRoZSByYW1kYVxuICogaW1wbGVtZW50YXRpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIHJhbWRhIGltcGxlbWVudGF0aW9uXG4gKiBAcGFyYW0ge1N0cmluZ30gbWV0aG9kbmFtZSBwcm9wZXJ0eSB0byBjaGVjayBmb3IgYSBjdXN0b20gaW1wbGVtZW50YXRpb25cbiAqIEByZXR1cm4ge09iamVjdH0gV2hhdGV2ZXIgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgbWV0aG9kIGlzLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfY2hlY2tGb3JNZXRob2QobWV0aG9kbmFtZSwgZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gZm4oKTtcbiAgICB9XG4gICAgdmFyIG9iaiA9IGFyZ3VtZW50c1tsZW5ndGggLSAxXTtcbiAgICByZXR1cm4gX2lzQXJyYXkob2JqKSB8fCB0eXBlb2Ygb2JqW21ldGhvZG5hbWVdICE9PSAnZnVuY3Rpb24nID8gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IG9ialttZXRob2RuYW1lXS5hcHBseShvYmosIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCwgbGVuZ3RoIC0gMSkpO1xuICB9O1xufSIsImltcG9ydCBfY2xvbmVSZWdFeHAgZnJvbSBcIi4vX2Nsb25lUmVnRXhwLmpzXCI7XG5pbXBvcnQgdHlwZSBmcm9tIFwiLi4vdHlwZS5qc1wiO1xuXG4vKipcbiAqIENvcGllcyBhbiBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGJlIGNvcGllZFxuICogQHBhcmFtIHtCb29sZWFufSBkZWVwIFdoZXRoZXIgb3Igbm90IHRvIHBlcmZvcm0gZGVlcCBjbG9uaW5nLlxuICogQHJldHVybiB7Kn0gVGhlIGNvcGllZCB2YWx1ZS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2Nsb25lKHZhbHVlLCBkZWVwLCBtYXApIHtcbiAgbWFwIHx8IChtYXAgPSBuZXcgX09iamVjdE1hcCgpKTtcblxuICAvLyB0aGlzIGF2b2lkcyB0aGUgc2xvd2VyIHN3aXRjaCB3aXRoIGEgcXVpY2sgaWYgZGVjaXNpb24gcmVtb3Zpbmcgc29tZSBtaWxsaXNlY29uZHMgaW4gZWFjaCBydW4uXG4gIGlmIChfaXNQcmltaXRpdmUodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHZhciBjb3B5ID0gZnVuY3Rpb24gY29weShjb3BpZWRWYWx1ZSkge1xuICAgIC8vIENoZWNrIGZvciBjaXJjdWxhciBhbmQgc2FtZSByZWZlcmVuY2VzIG9uIHRoZSBvYmplY3QgZ3JhcGggYW5kIHJldHVybiBpdHMgY29ycmVzcG9uZGluZyBjbG9uZS5cbiAgICB2YXIgY2FjaGVkQ29weSA9IG1hcC5nZXQodmFsdWUpO1xuICAgIGlmIChjYWNoZWRDb3B5KSB7XG4gICAgICByZXR1cm4gY2FjaGVkQ29weTtcbiAgICB9XG4gICAgbWFwLnNldCh2YWx1ZSwgY29waWVkVmFsdWUpO1xuICAgIGZvciAodmFyIGtleSBpbiB2YWx1ZSkge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwga2V5KSkge1xuICAgICAgICBjb3BpZWRWYWx1ZVtrZXldID0gZGVlcCA/IF9jbG9uZSh2YWx1ZVtrZXldLCB0cnVlLCBtYXApIDogdmFsdWVba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvcGllZFZhbHVlO1xuICB9O1xuICBzd2l0Y2ggKHR5cGUodmFsdWUpKSB7XG4gICAgY2FzZSAnT2JqZWN0JzpcbiAgICAgIHJldHVybiBjb3B5KE9iamVjdC5jcmVhdGUoT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKSkpO1xuICAgIGNhc2UgJ0FycmF5JzpcbiAgICAgIHJldHVybiBjb3B5KEFycmF5KHZhbHVlLmxlbmd0aCkpO1xuICAgIGNhc2UgJ0RhdGUnOlxuICAgICAgcmV0dXJuIG5ldyBEYXRlKHZhbHVlLnZhbHVlT2YoKSk7XG4gICAgY2FzZSAnUmVnRXhwJzpcbiAgICAgIHJldHVybiBfY2xvbmVSZWdFeHAodmFsdWUpO1xuICAgIGNhc2UgJ0ludDhBcnJheSc6XG4gICAgY2FzZSAnVWludDhBcnJheSc6XG4gICAgY2FzZSAnVWludDhDbGFtcGVkQXJyYXknOlxuICAgIGNhc2UgJ0ludDE2QXJyYXknOlxuICAgIGNhc2UgJ1VpbnQxNkFycmF5JzpcbiAgICBjYXNlICdJbnQzMkFycmF5JzpcbiAgICBjYXNlICdVaW50MzJBcnJheSc6XG4gICAgY2FzZSAnRmxvYXQzMkFycmF5JzpcbiAgICBjYXNlICdGbG9hdDY0QXJyYXknOlxuICAgIGNhc2UgJ0JpZ0ludDY0QXJyYXknOlxuICAgIGNhc2UgJ0JpZ1VpbnQ2NEFycmF5JzpcbiAgICAgIHJldHVybiB2YWx1ZS5zbGljZSgpO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cbmZ1bmN0aW9uIF9pc1ByaW1pdGl2ZShwYXJhbSkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiBwYXJhbTtcbiAgcmV0dXJuIHBhcmFtID09IG51bGwgfHwgdHlwZSAhPSAnb2JqZWN0JyAmJiB0eXBlICE9ICdmdW5jdGlvbic7XG59XG52YXIgX09iamVjdE1hcCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIF9PYmplY3RNYXAoKSB7XG4gICAgdGhpcy5tYXAgPSB7fTtcbiAgICB0aGlzLmxlbmd0aCA9IDA7XG4gIH1cbiAgX09iamVjdE1hcC5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICB2YXIgaGFzaGVkS2V5ID0gdGhpcy5oYXNoKGtleSk7XG4gICAgdmFyIGJ1Y2tldCA9IHRoaXMubWFwW2hhc2hlZEtleV07XG4gICAgaWYgKCFidWNrZXQpIHtcbiAgICAgIHRoaXMubWFwW2hhc2hlZEtleV0gPSBidWNrZXQgPSBbXTtcbiAgICB9XG4gICAgYnVja2V0LnB1c2goW2tleSwgdmFsdWVdKTtcbiAgICB0aGlzLmxlbmd0aCArPSAxO1xuICB9O1xuICBfT2JqZWN0TWFwLnByb3RvdHlwZS5oYXNoID0gZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciBoYXNoZWRLZXkgPSBbXTtcbiAgICBmb3IgKHZhciB2YWx1ZSBpbiBrZXkpIHtcbiAgICAgIGhhc2hlZEtleS5wdXNoKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChrZXlbdmFsdWVdKSk7XG4gICAgfVxuICAgIHJldHVybiBoYXNoZWRLZXkuam9pbigpO1xuICB9O1xuICBfT2JqZWN0TWFwLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgLyoqXG4gICAgICogZGVwZW5kaW5nIG9uIHRoZSBudW1iZXIgb2Ygb2JqZWN0cyB0byBiZSBjbG9uZWQgaXMgZmFzdGVyIHRvIGp1c3QgaXRlcmF0ZSBvdmVyIHRoZSBpdGVtcyBpbiB0aGUgbWFwIGp1c3QgYmVjYXVzZSB0aGUgaGFzaCBmdW5jdGlvbiBpcyBzbyBjb3N0bHksXG4gICAgICogb24gbXkgdGVzdHMgdGhpcyBudW1iZXIgaXMgMTgwLCBhbnl0aGluZyBhYm92ZSB0aGF0IHVzaW5nIHRoZSBoYXNoIGZ1bmN0aW9uIGlzIGZhc3Rlci5cbiAgICAgKi9cbiAgICBpZiAodGhpcy5sZW5ndGggPD0gMTgwKSB7XG4gICAgICBmb3IgKHZhciBwIGluIHRoaXMubWFwKSB7XG4gICAgICAgIHZhciBidWNrZXQgPSB0aGlzLm1hcFtwXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBidWNrZXQubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICB2YXIgZWxlbWVudCA9IGJ1Y2tldFtpXTtcbiAgICAgICAgICBpZiAoZWxlbWVudFswXSA9PT0ga2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudFsxXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGhhc2hlZEtleSA9IHRoaXMuaGFzaChrZXkpO1xuICAgIHZhciBidWNrZXQgPSB0aGlzLm1hcFtoYXNoZWRLZXldO1xuICAgIGlmICghYnVja2V0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnVja2V0Lmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICB2YXIgZWxlbWVudCA9IGJ1Y2tldFtpXTtcbiAgICAgIGlmIChlbGVtZW50WzBdID09PSBrZXkpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnRbMV07XG4gICAgICB9XG4gICAgfVxuICB9O1xuICByZXR1cm4gX09iamVjdE1hcDtcbn0oKTsiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfY2xvbmVSZWdFeHAocGF0dGVybikge1xuICByZXR1cm4gbmV3IFJlZ0V4cChwYXR0ZXJuLnNvdXJjZSwgcGF0dGVybi5mbGFncyA/IHBhdHRlcm4uZmxhZ3MgOiAocGF0dGVybi5nbG9iYWwgPyAnZycgOiAnJykgKyAocGF0dGVybi5pZ25vcmVDYXNlID8gJ2knIDogJycpICsgKHBhdHRlcm4ubXVsdGlsaW5lID8gJ20nIDogJycpICsgKHBhdHRlcm4uc3RpY2t5ID8gJ3knIDogJycpICsgKHBhdHRlcm4udW5pY29kZSA/ICd1JyA6ICcnKSArIChwYXR0ZXJuLmRvdEFsbCA/ICdzJyA6ICcnKSk7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2NvbXBsZW1lbnQoZikge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAhZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufSIsIi8qKlxuICogUHJpdmF0ZSBgY29uY2F0YCBmdW5jdGlvbiB0byBtZXJnZSB0d28gYXJyYXktbGlrZSBvYmplY3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fEFyZ3VtZW50c30gW3NldDE9W11dIEFuIGFycmF5LWxpa2Ugb2JqZWN0LlxuICogQHBhcmFtIHtBcnJheXxBcmd1bWVudHN9IFtzZXQyPVtdXSBBbiBhcnJheS1saWtlIG9iamVjdC5cbiAqIEByZXR1cm4ge0FycmF5fSBBIG5ldywgbWVyZ2VkIGFycmF5LlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIF9jb25jYXQoWzQsIDUsIDZdLCBbMSwgMiwgM10pOyAvLz0+IFs0LCA1LCA2LCAxLCAyLCAzXVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfY29uY2F0KHNldDEsIHNldDIpIHtcbiAgc2V0MSA9IHNldDEgfHwgW107XG4gIHNldDIgPSBzZXQyIHx8IFtdO1xuICB2YXIgaWR4O1xuICB2YXIgbGVuMSA9IHNldDEubGVuZ3RoO1xuICB2YXIgbGVuMiA9IHNldDIubGVuZ3RoO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIGlkeCA9IDA7XG4gIHdoaWxlIChpZHggPCBsZW4xKSB7XG4gICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGhdID0gc2V0MVtpZHhdO1xuICAgIGlkeCArPSAxO1xuICB9XG4gIGlkeCA9IDA7XG4gIHdoaWxlIChpZHggPCBsZW4yKSB7XG4gICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGhdID0gc2V0MltpZHhdO1xuICAgIGlkeCArPSAxO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59IiwiaW1wb3J0IF9pc0FycmF5TGlrZSBmcm9tIFwiLi9faXNBcnJheUxpa2UuanNcIjtcbnZhciBzeW1JdGVyYXRvciA9IHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnID8gU3ltYm9sLml0ZXJhdG9yIDogJ0BAaXRlcmF0b3InO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2NyZWF0ZVJlZHVjZShhcnJheVJlZHVjZSwgbWV0aG9kUmVkdWNlLCBpdGVyYWJsZVJlZHVjZSkge1xuICByZXR1cm4gZnVuY3Rpb24gX3JlZHVjZSh4ZiwgYWNjLCBsaXN0KSB7XG4gICAgaWYgKF9pc0FycmF5TGlrZShsaXN0KSkge1xuICAgICAgcmV0dXJuIGFycmF5UmVkdWNlKHhmLCBhY2MsIGxpc3QpO1xuICAgIH1cbiAgICBpZiAobGlzdCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGxpc3RbJ2ZhbnRhc3ktbGFuZC9yZWR1Y2UnXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIG1ldGhvZFJlZHVjZSh4ZiwgYWNjLCBsaXN0LCAnZmFudGFzeS1sYW5kL3JlZHVjZScpO1xuICAgIH1cbiAgICBpZiAobGlzdFtzeW1JdGVyYXRvcl0gIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGl0ZXJhYmxlUmVkdWNlKHhmLCBhY2MsIGxpc3Rbc3ltSXRlcmF0b3JdKCkpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGxpc3QubmV4dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGl0ZXJhYmxlUmVkdWNlKHhmLCBhY2MsIGxpc3QpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGxpc3QucmVkdWNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gbWV0aG9kUmVkdWNlKHhmLCBhY2MsIGxpc3QsICdyZWR1Y2UnKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncmVkdWNlOiBsaXN0IG11c3QgYmUgYXJyYXkgb3IgaXRlcmFibGUnKTtcbiAgfTtcbn0iLCJpbXBvcnQgX2lzUGxhY2Vob2xkZXIgZnJvbSBcIi4vX2lzUGxhY2Vob2xkZXIuanNcIjtcblxuLyoqXG4gKiBPcHRpbWl6ZWQgaW50ZXJuYWwgb25lLWFyaXR5IGN1cnJ5IGZ1bmN0aW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBjdXJyeS5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBUaGUgY3VycmllZCBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2N1cnJ5MShmbikge1xuICByZXR1cm4gZnVuY3Rpb24gZjEoYSkge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwIHx8IF9pc1BsYWNlaG9sZGVyKGEpKSB7XG4gICAgICByZXR1cm4gZjE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cbiAgfTtcbn0iLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9fY3VycnkxLmpzXCI7XG5pbXBvcnQgX2lzUGxhY2Vob2xkZXIgZnJvbSBcIi4vX2lzUGxhY2Vob2xkZXIuanNcIjtcblxuLyoqXG4gKiBPcHRpbWl6ZWQgaW50ZXJuYWwgdHdvLWFyaXR5IGN1cnJ5IGZ1bmN0aW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBjdXJyeS5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBUaGUgY3VycmllZCBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2N1cnJ5Mihmbikge1xuICByZXR1cm4gZnVuY3Rpb24gZjIoYSwgYikge1xuICAgIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICByZXR1cm4gZjI7XG4gICAgICBjYXNlIDE6XG4gICAgICAgIHJldHVybiBfaXNQbGFjZWhvbGRlcihhKSA/IGYyIDogX2N1cnJ5MShmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICByZXR1cm4gZm4oYSwgX2IpO1xuICAgICAgICB9KTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBfaXNQbGFjZWhvbGRlcihhKSAmJiBfaXNQbGFjZWhvbGRlcihiKSA/IGYyIDogX2lzUGxhY2Vob2xkZXIoYSkgPyBfY3VycnkxKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgIHJldHVybiBmbihfYSwgYik7XG4gICAgICAgIH0pIDogX2lzUGxhY2Vob2xkZXIoYikgPyBfY3VycnkxKGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgIHJldHVybiBmbihhLCBfYik7XG4gICAgICAgIH0pIDogZm4oYSwgYik7XG4gICAgfVxuICB9O1xufSIsImltcG9ydCBfY3VycnkxIGZyb20gXCIuL19jdXJyeTEuanNcIjtcbmltcG9ydCBfY3VycnkyIGZyb20gXCIuL19jdXJyeTIuanNcIjtcbmltcG9ydCBfaXNQbGFjZWhvbGRlciBmcm9tIFwiLi9faXNQbGFjZWhvbGRlci5qc1wiO1xuXG4vKipcbiAqIE9wdGltaXplZCBpbnRlcm5hbCB0aHJlZS1hcml0eSBjdXJyeSBmdW5jdGlvbi5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gY3VycnkuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gVGhlIGN1cnJpZWQgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9jdXJyeTMoZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGYzKGEsIGIsIGMpIHtcbiAgICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgIGNhc2UgMDpcbiAgICAgICAgcmV0dXJuIGYzO1xuICAgICAgY2FzZSAxOlxuICAgICAgICByZXR1cm4gX2lzUGxhY2Vob2xkZXIoYSkgPyBmMyA6IF9jdXJyeTIoZnVuY3Rpb24gKF9iLCBfYykge1xuICAgICAgICAgIHJldHVybiBmbihhLCBfYiwgX2MpO1xuICAgICAgICB9KTtcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgcmV0dXJuIF9pc1BsYWNlaG9sZGVyKGEpICYmIF9pc1BsYWNlaG9sZGVyKGIpID8gZjMgOiBfaXNQbGFjZWhvbGRlcihhKSA/IF9jdXJyeTIoZnVuY3Rpb24gKF9hLCBfYykge1xuICAgICAgICAgIHJldHVybiBmbihfYSwgYiwgX2MpO1xuICAgICAgICB9KSA6IF9pc1BsYWNlaG9sZGVyKGIpID8gX2N1cnJ5MihmdW5jdGlvbiAoX2IsIF9jKSB7XG4gICAgICAgICAgcmV0dXJuIGZuKGEsIF9iLCBfYyk7XG4gICAgICAgIH0pIDogX2N1cnJ5MShmdW5jdGlvbiAoX2MpIHtcbiAgICAgICAgICByZXR1cm4gZm4oYSwgYiwgX2MpO1xuICAgICAgICB9KTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBfaXNQbGFjZWhvbGRlcihhKSAmJiBfaXNQbGFjZWhvbGRlcihiKSAmJiBfaXNQbGFjZWhvbGRlcihjKSA/IGYzIDogX2lzUGxhY2Vob2xkZXIoYSkgJiYgX2lzUGxhY2Vob2xkZXIoYikgPyBfY3VycnkyKGZ1bmN0aW9uIChfYSwgX2IpIHtcbiAgICAgICAgICByZXR1cm4gZm4oX2EsIF9iLCBjKTtcbiAgICAgICAgfSkgOiBfaXNQbGFjZWhvbGRlcihhKSAmJiBfaXNQbGFjZWhvbGRlcihjKSA/IF9jdXJyeTIoZnVuY3Rpb24gKF9hLCBfYykge1xuICAgICAgICAgIHJldHVybiBmbihfYSwgYiwgX2MpO1xuICAgICAgICB9KSA6IF9pc1BsYWNlaG9sZGVyKGIpICYmIF9pc1BsYWNlaG9sZGVyKGMpID8gX2N1cnJ5MihmdW5jdGlvbiAoX2IsIF9jKSB7XG4gICAgICAgICAgcmV0dXJuIGZuKGEsIF9iLCBfYyk7XG4gICAgICAgIH0pIDogX2lzUGxhY2Vob2xkZXIoYSkgPyBfY3VycnkxKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgIHJldHVybiBmbihfYSwgYiwgYyk7XG4gICAgICAgIH0pIDogX2lzUGxhY2Vob2xkZXIoYikgPyBfY3VycnkxKGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgIHJldHVybiBmbihhLCBfYiwgYyk7XG4gICAgICAgIH0pIDogX2lzUGxhY2Vob2xkZXIoYykgPyBfY3VycnkxKGZ1bmN0aW9uIChfYykge1xuICAgICAgICAgIHJldHVybiBmbihhLCBiLCBfYyk7XG4gICAgICAgIH0pIDogZm4oYSwgYiwgYyk7XG4gICAgfVxuICB9O1xufSIsImltcG9ydCBfYXJpdHkgZnJvbSBcIi4vX2FyaXR5LmpzXCI7XG5pbXBvcnQgX2lzUGxhY2Vob2xkZXIgZnJvbSBcIi4vX2lzUGxhY2Vob2xkZXIuanNcIjtcblxuLyoqXG4gKiBJbnRlcm5hbCBjdXJyeU4gZnVuY3Rpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtOdW1iZXJ9IGxlbmd0aCBUaGUgYXJpdHkgb2YgdGhlIGN1cnJpZWQgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge0FycmF5fSByZWNlaXZlZCBBbiBhcnJheSBvZiBhcmd1bWVudHMgcmVjZWl2ZWQgdGh1cyBmYXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gY3VycnkuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gVGhlIGN1cnJpZWQgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9jdXJyeU4obGVuZ3RoLCByZWNlaXZlZCwgZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY29tYmluZWQgPSBbXTtcbiAgICB2YXIgYXJnc0lkeCA9IDA7XG4gICAgdmFyIGxlZnQgPSBsZW5ndGg7XG4gICAgdmFyIGNvbWJpbmVkSWR4ID0gMDtcbiAgICB2YXIgaGFzUGxhY2Vob2xkZXIgPSBmYWxzZTtcbiAgICB3aGlsZSAoY29tYmluZWRJZHggPCByZWNlaXZlZC5sZW5ndGggfHwgYXJnc0lkeCA8IGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgIHZhciByZXN1bHQ7XG4gICAgICBpZiAoY29tYmluZWRJZHggPCByZWNlaXZlZC5sZW5ndGggJiYgKCFfaXNQbGFjZWhvbGRlcihyZWNlaXZlZFtjb21iaW5lZElkeF0pIHx8IGFyZ3NJZHggPj0gYXJndW1lbnRzLmxlbmd0aCkpIHtcbiAgICAgICAgcmVzdWx0ID0gcmVjZWl2ZWRbY29tYmluZWRJZHhdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gYXJndW1lbnRzW2FyZ3NJZHhdO1xuICAgICAgICBhcmdzSWR4ICs9IDE7XG4gICAgICB9XG4gICAgICBjb21iaW5lZFtjb21iaW5lZElkeF0gPSByZXN1bHQ7XG4gICAgICBpZiAoIV9pc1BsYWNlaG9sZGVyKHJlc3VsdCkpIHtcbiAgICAgICAgbGVmdCAtPSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaGFzUGxhY2Vob2xkZXIgPSB0cnVlO1xuICAgICAgfVxuICAgICAgY29tYmluZWRJZHggKz0gMTtcbiAgICB9XG4gICAgcmV0dXJuICFoYXNQbGFjZWhvbGRlciAmJiBsZWZ0IDw9IDAgPyBmbi5hcHBseSh0aGlzLCBjb21iaW5lZCkgOiBfYXJpdHkoTWF0aC5tYXgoMCwgbGVmdCksIF9jdXJyeU4obGVuZ3RoLCBjb21iaW5lZCwgZm4pKTtcbiAgfTtcbn0iLCJpbXBvcnQgX2lzQXJyYXkgZnJvbSBcIi4vX2lzQXJyYXkuanNcIjtcbmltcG9ydCBfaXNUcmFuc2Zvcm1lciBmcm9tIFwiLi9faXNUcmFuc2Zvcm1lci5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGRpc3BhdGNoZXMgd2l0aCBkaWZmZXJlbnQgc3RyYXRlZ2llcyBiYXNlZCBvbiB0aGVcbiAqIG9iamVjdCBpbiBsaXN0IHBvc2l0aW9uIChsYXN0IGFyZ3VtZW50KS4gSWYgaXQgaXMgYW4gYXJyYXksIGV4ZWN1dGVzIFtmbl0uXG4gKiBPdGhlcndpc2UsIGlmIGl0IGhhcyBhIGZ1bmN0aW9uIHdpdGggb25lIG9mIHRoZSBnaXZlbiBtZXRob2QgbmFtZXMsIGl0IHdpbGxcbiAqIGV4ZWN1dGUgdGhhdCBmdW5jdGlvbiAoZnVuY3RvciBjYXNlKS4gT3RoZXJ3aXNlLCBpZiBpdCBpcyBhIHRyYW5zZm9ybWVyLFxuICogdXNlcyB0cmFuc2R1Y2VyIGNyZWF0ZWQgYnkgW3RyYW5zZHVjZXJDcmVhdG9yXSB0byByZXR1cm4gYSBuZXcgdHJhbnNmb3JtZXJcbiAqICh0cmFuc2R1Y2VyIGNhc2UpLlxuICogT3RoZXJ3aXNlLCBpdCB3aWxsIGRlZmF1bHQgdG8gZXhlY3V0aW5nIFtmbl0uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IG1ldGhvZE5hbWVzIHByb3BlcnRpZXMgdG8gY2hlY2sgZm9yIGEgY3VzdG9tIGltcGxlbWVudGF0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0cmFuc2R1Y2VyQ3JlYXRvciB0cmFuc2R1Y2VyIGZhY3RvcnkgaWYgb2JqZWN0IGlzIHRyYW5zZm9ybWVyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBkZWZhdWx0IHJhbWRhIGltcGxlbWVudGF0aW9uXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBmdW5jdGlvbiB0aGF0IGRpc3BhdGNoZXMgb24gb2JqZWN0IGluIGxpc3QgcG9zaXRpb25cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2Rpc3BhdGNoYWJsZShtZXRob2ROYW1lcywgdHJhbnNkdWNlckNyZWF0b3IsIGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmbigpO1xuICAgIH1cbiAgICB2YXIgb2JqID0gYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXTtcbiAgICBpZiAoIV9pc0FycmF5KG9iaikpIHtcbiAgICAgIHZhciBpZHggPSAwO1xuICAgICAgd2hpbGUgKGlkeCA8IG1ldGhvZE5hbWVzLmxlbmd0aCkge1xuICAgICAgICBpZiAodHlwZW9mIG9ialttZXRob2ROYW1lc1tpZHhdXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiBvYmpbbWV0aG9kTmFtZXNbaWR4XV0uYXBwbHkob2JqLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDAsIC0xKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWR4ICs9IDE7XG4gICAgICB9XG4gICAgICBpZiAoX2lzVHJhbnNmb3JtZXIob2JqKSkge1xuICAgICAgICB2YXIgdHJhbnNkdWNlciA9IHRyYW5zZHVjZXJDcmVhdG9yLmFwcGx5KG51bGwsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCwgLTEpKTtcbiAgICAgICAgcmV0dXJuIHRyYW5zZHVjZXIob2JqKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59IiwiaW1wb3J0IF9pc0ludGVnZXIgZnJvbSBcIi4vX2lzSW50ZWdlci5qc1wiO1xuaW1wb3J0IF9pc0FycmF5IGZyb20gXCIuL19pc0FycmF5LmpzXCI7XG5pbXBvcnQgcmVtb3ZlIGZyb20gXCIuLi9yZW1vdmUuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IG9iamVjdCB0aGF0IGRvZXMgbm90IGNvbnRhaW4gYSBgcHJvcGAgcHJvcGVydHkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0gcHJvcCBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gZGlzc29jaWF0ZVxuICogQHBhcmFtIHtPYmplY3R8QXJyYXl9IG9iaiBUaGUgb2JqZWN0IHRvIGNsb25lXG4gKiBAcmV0dXJuIHtPYmplY3R9IEEgbmV3IG9iamVjdCBlcXVpdmFsZW50IHRvIHRoZSBvcmlnaW5hbCBidXQgd2l0aG91dCB0aGUgc3BlY2lmaWVkIHByb3BlcnR5XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9kaXNzb2MocHJvcCwgb2JqKSB7XG4gIGlmIChvYmogPT0gbnVsbCkge1xuICAgIHJldHVybiBvYmo7XG4gIH1cbiAgaWYgKF9pc0ludGVnZXIocHJvcCkgJiYgX2lzQXJyYXkob2JqKSkge1xuICAgIHJldHVybiByZW1vdmUocHJvcCwgMSwgb2JqKTtcbiAgfVxuICB2YXIgcmVzdWx0ID0ge307XG4gIGZvciAodmFyIHAgaW4gb2JqKSB7XG4gICAgcmVzdWx0W3BdID0gb2JqW3BdO1xuICB9XG4gIGRlbGV0ZSByZXN1bHRbcHJvcF07XG4gIHJldHVybiByZXN1bHQ7XG59IiwiaW1wb3J0IF9hcnJheUZyb21JdGVyYXRvciBmcm9tIFwiLi9fYXJyYXlGcm9tSXRlcmF0b3IuanNcIjtcbmltcG9ydCBfaW5jbHVkZXNXaXRoIGZyb20gXCIuL19pbmNsdWRlc1dpdGguanNcIjtcbmltcG9ydCBfZnVuY3Rpb25OYW1lIGZyb20gXCIuL19mdW5jdGlvbk5hbWUuanNcIjtcbmltcG9ydCBfaGFzIGZyb20gXCIuL19oYXMuanNcIjtcbmltcG9ydCBfb2JqZWN0SXMgZnJvbSBcIi4vX29iamVjdElzLmpzXCI7XG5pbXBvcnQga2V5cyBmcm9tIFwiLi4va2V5cy5qc1wiO1xuaW1wb3J0IHR5cGUgZnJvbSBcIi4uL3R5cGUuanNcIjtcblxuLyoqXG4gKiBwcml2YXRlIF91bmlxQ29udGVudEVxdWFscyBmdW5jdGlvbi5cbiAqIFRoYXQgZnVuY3Rpb24gaXMgY2hlY2tpbmcgZXF1YWxpdHkgb2YgMiBpdGVyYXRvciBjb250ZW50cyB3aXRoIDIgYXNzdW1wdGlvbnNcbiAqIC0gaXRlcmF0b3JzIGxlbmd0aHMgYXJlIHRoZSBzYW1lXG4gKiAtIGl0ZXJhdG9ycyB2YWx1ZXMgYXJlIHVuaXF1ZVxuICpcbiAqIGZhbHNlLXBvc2l0aXZlIHJlc3VsdCB3aWxsIGJlIHJldHVybmVkIGZvciBjb21wYXJpc29uIG9mLCBlLmcuXG4gKiAtIFsxLDIsM10gYW5kIFsxLDIsMyw0XVxuICogLSBbMSwxLDFdIGFuZCBbMSwyLDNdXG4gKiAqL1xuXG5mdW5jdGlvbiBfdW5pcUNvbnRlbnRFcXVhbHMoYUl0ZXJhdG9yLCBiSXRlcmF0b3IsIHN0YWNrQSwgc3RhY2tCKSB7XG4gIHZhciBhID0gX2FycmF5RnJvbUl0ZXJhdG9yKGFJdGVyYXRvcik7XG4gIHZhciBiID0gX2FycmF5RnJvbUl0ZXJhdG9yKGJJdGVyYXRvcik7XG4gIGZ1bmN0aW9uIGVxKF9hLCBfYikge1xuICAgIHJldHVybiBfZXF1YWxzKF9hLCBfYiwgc3RhY2tBLnNsaWNlKCksIHN0YWNrQi5zbGljZSgpKTtcbiAgfVxuXG4gIC8vIGlmICphKiBhcnJheSBjb250YWlucyBhbnkgZWxlbWVudCB0aGF0IGlzIG5vdCBpbmNsdWRlZCBpbiAqYipcbiAgcmV0dXJuICFfaW5jbHVkZXNXaXRoKGZ1bmN0aW9uIChiLCBhSXRlbSkge1xuICAgIHJldHVybiAhX2luY2x1ZGVzV2l0aChlcSwgYUl0ZW0sIGIpO1xuICB9LCBiLCBhKTtcbn1cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9lcXVhbHMoYSwgYiwgc3RhY2tBLCBzdGFja0IpIHtcbiAgaWYgKF9vYmplY3RJcyhhLCBiKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHZhciB0eXBlQSA9IHR5cGUoYSk7XG4gIGlmICh0eXBlQSAhPT0gdHlwZShiKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAodHlwZW9mIGFbJ2ZhbnRhc3ktbGFuZC9lcXVhbHMnXSA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgYlsnZmFudGFzeS1sYW5kL2VxdWFscyddID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBhWydmYW50YXN5LWxhbmQvZXF1YWxzJ10gPT09ICdmdW5jdGlvbicgJiYgYVsnZmFudGFzeS1sYW5kL2VxdWFscyddKGIpICYmIHR5cGVvZiBiWydmYW50YXN5LWxhbmQvZXF1YWxzJ10gPT09ICdmdW5jdGlvbicgJiYgYlsnZmFudGFzeS1sYW5kL2VxdWFscyddKGEpO1xuICB9XG4gIGlmICh0eXBlb2YgYS5lcXVhbHMgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGIuZXF1YWxzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBhLmVxdWFscyA9PT0gJ2Z1bmN0aW9uJyAmJiBhLmVxdWFscyhiKSAmJiB0eXBlb2YgYi5lcXVhbHMgPT09ICdmdW5jdGlvbicgJiYgYi5lcXVhbHMoYSk7XG4gIH1cbiAgc3dpdGNoICh0eXBlQSkge1xuICAgIGNhc2UgJ0FyZ3VtZW50cyc6XG4gICAgY2FzZSAnQXJyYXknOlxuICAgIGNhc2UgJ09iamVjdCc6XG4gICAgICBpZiAodHlwZW9mIGEuY29uc3RydWN0b3IgPT09ICdmdW5jdGlvbicgJiYgX2Z1bmN0aW9uTmFtZShhLmNvbnN0cnVjdG9yKSA9PT0gJ1Byb21pc2UnKSB7XG4gICAgICAgIHJldHVybiBhID09PSBiO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnQm9vbGVhbic6XG4gICAgY2FzZSAnTnVtYmVyJzpcbiAgICBjYXNlICdTdHJpbmcnOlxuICAgICAgaWYgKCEodHlwZW9mIGEgPT09IHR5cGVvZiBiICYmIF9vYmplY3RJcyhhLnZhbHVlT2YoKSwgYi52YWx1ZU9mKCkpKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdEYXRlJzpcbiAgICAgIGlmICghX29iamVjdElzKGEudmFsdWVPZigpLCBiLnZhbHVlT2YoKSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnRXJyb3InOlxuICAgICAgcmV0dXJuIGEubmFtZSA9PT0gYi5uYW1lICYmIGEubWVzc2FnZSA9PT0gYi5tZXNzYWdlO1xuICAgIGNhc2UgJ1JlZ0V4cCc6XG4gICAgICBpZiAoIShhLnNvdXJjZSA9PT0gYi5zb3VyY2UgJiYgYS5nbG9iYWwgPT09IGIuZ2xvYmFsICYmIGEuaWdub3JlQ2FzZSA9PT0gYi5pZ25vcmVDYXNlICYmIGEubXVsdGlsaW5lID09PSBiLm11bHRpbGluZSAmJiBhLnN0aWNreSA9PT0gYi5zdGlja3kgJiYgYS51bmljb2RlID09PSBiLnVuaWNvZGUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICB9XG4gIHZhciBpZHggPSBzdGFja0EubGVuZ3RoIC0gMTtcbiAgd2hpbGUgKGlkeCA+PSAwKSB7XG4gICAgaWYgKHN0YWNrQVtpZHhdID09PSBhKSB7XG4gICAgICByZXR1cm4gc3RhY2tCW2lkeF0gPT09IGI7XG4gICAgfVxuICAgIGlkeCAtPSAxO1xuICB9XG4gIHN3aXRjaCAodHlwZUEpIHtcbiAgICBjYXNlICdNYXAnOlxuICAgICAgaWYgKGEuc2l6ZSAhPT0gYi5zaXplKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBfdW5pcUNvbnRlbnRFcXVhbHMoYS5lbnRyaWVzKCksIGIuZW50cmllcygpLCBzdGFja0EuY29uY2F0KFthXSksIHN0YWNrQi5jb25jYXQoW2JdKSk7XG4gICAgY2FzZSAnU2V0JzpcbiAgICAgIGlmIChhLnNpemUgIT09IGIuc2l6ZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gX3VuaXFDb250ZW50RXF1YWxzKGEudmFsdWVzKCksIGIudmFsdWVzKCksIHN0YWNrQS5jb25jYXQoW2FdKSwgc3RhY2tCLmNvbmNhdChbYl0pKTtcbiAgICBjYXNlICdBcmd1bWVudHMnOlxuICAgIGNhc2UgJ0FycmF5JzpcbiAgICBjYXNlICdPYmplY3QnOlxuICAgIGNhc2UgJ0Jvb2xlYW4nOlxuICAgIGNhc2UgJ051bWJlcic6XG4gICAgY2FzZSAnU3RyaW5nJzpcbiAgICBjYXNlICdEYXRlJzpcbiAgICBjYXNlICdFcnJvcic6XG4gICAgY2FzZSAnUmVnRXhwJzpcbiAgICBjYXNlICdJbnQ4QXJyYXknOlxuICAgIGNhc2UgJ1VpbnQ4QXJyYXknOlxuICAgIGNhc2UgJ1VpbnQ4Q2xhbXBlZEFycmF5JzpcbiAgICBjYXNlICdJbnQxNkFycmF5JzpcbiAgICBjYXNlICdVaW50MTZBcnJheSc6XG4gICAgY2FzZSAnSW50MzJBcnJheSc6XG4gICAgY2FzZSAnVWludDMyQXJyYXknOlxuICAgIGNhc2UgJ0Zsb2F0MzJBcnJheSc6XG4gICAgY2FzZSAnRmxvYXQ2NEFycmF5JzpcbiAgICBjYXNlICdBcnJheUJ1ZmZlcic6XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgLy8gVmFsdWVzIG9mIG90aGVyIHR5cGVzIGFyZSBvbmx5IGVxdWFsIGlmIGlkZW50aWNhbC5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIga2V5c0EgPSBrZXlzKGEpO1xuICBpZiAoa2V5c0EubGVuZ3RoICE9PSBrZXlzKGIpLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgZXh0ZW5kZWRTdGFja0EgPSBzdGFja0EuY29uY2F0KFthXSk7XG4gIHZhciBleHRlbmRlZFN0YWNrQiA9IHN0YWNrQi5jb25jYXQoW2JdKTtcbiAgaWR4ID0ga2V5c0EubGVuZ3RoIC0gMTtcbiAgd2hpbGUgKGlkeCA+PSAwKSB7XG4gICAgdmFyIGtleSA9IGtleXNBW2lkeF07XG4gICAgaWYgKCEoX2hhcyhrZXksIGIpICYmIF9lcXVhbHMoYltrZXldLCBhW2tleV0sIGV4dGVuZGVkU3RhY2tBLCBleHRlbmRlZFN0YWNrQikpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlkeCAtPSAxO1xuICB9XG4gIHJldHVybiB0cnVlO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9maWx0ZXIoZm4sIGxpc3QpIHtcbiAgdmFyIGlkeCA9IDA7XG4gIHZhciBsZW4gPSBsaXN0Lmxlbmd0aDtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB3aGlsZSAoaWR4IDwgbGVuKSB7XG4gICAgaWYgKGZuKGxpc3RbaWR4XSkpIHtcbiAgICAgIHJlc3VsdFtyZXN1bHQubGVuZ3RoXSA9IGxpc3RbaWR4XTtcbiAgICB9XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfZnVuY3Rpb25OYW1lKGYpIHtcbiAgLy8gU3RyaW5nKHggPT4geCkgZXZhbHVhdGVzIHRvIFwieCA9PiB4XCIsIHNvIHRoZSBwYXR0ZXJuIG1heSBub3QgbWF0Y2guXG4gIHZhciBtYXRjaCA9IFN0cmluZyhmKS5tYXRjaCgvXmZ1bmN0aW9uIChcXHcqKS8pO1xuICByZXR1cm4gbWF0Y2ggPT0gbnVsbCA/ICcnIDogbWF0Y2hbMV07XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2hhcyhwcm9wLCBvYmopIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9pZGVudGl0eSh4KSB7XG4gIHJldHVybiB4O1xufSIsImltcG9ydCBfaW5kZXhPZiBmcm9tIFwiLi9faW5kZXhPZi5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2luY2x1ZGVzKGEsIGxpc3QpIHtcbiAgcmV0dXJuIF9pbmRleE9mKGxpc3QsIGEsIDApID49IDA7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2luY2x1ZGVzV2l0aChwcmVkLCB4LCBsaXN0KSB7XG4gIHZhciBpZHggPSAwO1xuICB2YXIgbGVuID0gbGlzdC5sZW5ndGg7XG4gIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICBpZiAocHJlZCh4LCBsaXN0W2lkeF0pKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufSIsImltcG9ydCBlcXVhbHMgZnJvbSBcIi4uL2VxdWFscy5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2luZGV4T2YobGlzdCwgYSwgaWR4KSB7XG4gIHZhciBpbmYsIGl0ZW07XG4gIC8vIEFycmF5LnByb3RvdHlwZS5pbmRleE9mIGRvZXNuJ3QgZXhpc3QgYmVsb3cgSUU5XG4gIGlmICh0eXBlb2YgbGlzdC5pbmRleE9mID09PSAnZnVuY3Rpb24nKSB7XG4gICAgc3dpdGNoICh0eXBlb2YgYSkge1xuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgaWYgKGEgPT09IDApIHtcbiAgICAgICAgICAvLyBtYW51YWxseSBjcmF3bCB0aGUgbGlzdCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuICswIGFuZCAtMFxuICAgICAgICAgIGluZiA9IDEgLyBhO1xuICAgICAgICAgIHdoaWxlIChpZHggPCBsaXN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgaXRlbSA9IGxpc3RbaWR4XTtcbiAgICAgICAgICAgIGlmIChpdGVtID09PSAwICYmIDEgLyBpdGVtID09PSBpbmYpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGlkeDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlkeCArPSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH0gZWxzZSBpZiAoYSAhPT0gYSkge1xuICAgICAgICAgIC8vIE5hTlxuICAgICAgICAgIHdoaWxlIChpZHggPCBsaXN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgaXRlbSA9IGxpc3RbaWR4XTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ251bWJlcicgJiYgaXRlbSAhPT0gaXRlbSkge1xuICAgICAgICAgICAgICByZXR1cm4gaWR4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWR4ICs9IDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICAvLyBub24temVybyBudW1iZXJzIGNhbiB1dGlsaXNlIFNldFxuICAgICAgICByZXR1cm4gbGlzdC5pbmRleE9mKGEsIGlkeCk7XG5cbiAgICAgIC8vIGFsbCB0aGVzZSB0eXBlcyBjYW4gdXRpbGlzZSBTZXRcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICAgIHJldHVybiBsaXN0LmluZGV4T2YoYSwgaWR4KTtcbiAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgIGlmIChhID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gbnVsbCBjYW4gdXRpbGlzZSBTZXRcbiAgICAgICAgICByZXR1cm4gbGlzdC5pbmRleE9mKGEsIGlkeCk7XG4gICAgICAgIH1cbiAgICB9XG4gIH1cbiAgLy8gYW55dGhpbmcgZWxzZSBub3QgY292ZXJlZCBhYm92ZSwgZGVmZXIgdG8gUi5lcXVhbHNcbiAgd2hpbGUgKGlkeCA8IGxpc3QubGVuZ3RoKSB7XG4gICAgaWYgKGVxdWFscyhsaXN0W2lkeF0sIGEpKSB7XG4gICAgICByZXR1cm4gaWR4O1xuICAgIH1cbiAgICBpZHggKz0gMTtcbiAgfVxuICByZXR1cm4gLTE7XG59IiwiaW1wb3J0IF9oYXMgZnJvbSBcIi4vX2hhcy5qc1wiO1xudmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciBfaXNBcmd1bWVudHMgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbChhcmd1bWVudHMpID09PSAnW29iamVjdCBBcmd1bWVudHNdJyA/IGZ1bmN0aW9uIF9pc0FyZ3VtZW50cyh4KSB7XG4gICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoeCkgPT09ICdbb2JqZWN0IEFyZ3VtZW50c10nO1xuICB9IDogZnVuY3Rpb24gX2lzQXJndW1lbnRzKHgpIHtcbiAgICByZXR1cm4gX2hhcygnY2FsbGVlJywgeCk7XG4gIH07XG59KCk7XG5leHBvcnQgZGVmYXVsdCBfaXNBcmd1bWVudHM7IiwiLyoqXG4gKiBUZXN0cyB3aGV0aGVyIG9yIG5vdCBhbiBvYmplY3QgaXMgYW4gYXJyYXkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSBvYmplY3QgdG8gdGVzdC5cbiAqIEByZXR1cm4ge0Jvb2xlYW59IGB0cnVlYCBpZiBgdmFsYCBpcyBhbiBhcnJheSwgYGZhbHNlYCBvdGhlcndpc2UuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgX2lzQXJyYXkoW10pOyAvLz0+IHRydWVcbiAqICAgICAgX2lzQXJyYXkobnVsbCk7IC8vPT4gZmFsc2VcbiAqICAgICAgX2lzQXJyYXkoe30pOyAvLz0+IGZhbHNlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gX2lzQXJyYXkodmFsKSB7XG4gIHJldHVybiB2YWwgIT0gbnVsbCAmJiB2YWwubGVuZ3RoID49IDAgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IEFycmF5XSc7XG59OyIsImltcG9ydCBfY3VycnkxIGZyb20gXCIuL19jdXJyeTEuanNcIjtcbmltcG9ydCBfaXNBcnJheSBmcm9tIFwiLi9faXNBcnJheS5qc1wiO1xuaW1wb3J0IF9pc1N0cmluZyBmcm9tIFwiLi9faXNTdHJpbmcuanNcIjtcblxuLyoqXG4gKiBUZXN0cyB3aGV0aGVyIG9yIG5vdCBhbiBvYmplY3QgaXMgc2ltaWxhciB0byBhbiBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNhdGVnb3J5IFR5cGVcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnICogLT4gQm9vbGVhblxuICogQHBhcmFtIHsqfSB4IFRoZSBvYmplY3QgdG8gdGVzdC5cbiAqIEByZXR1cm4ge0Jvb2xlYW59IGB0cnVlYCBpZiBgeGAgaGFzIGEgbnVtZXJpYyBsZW5ndGggcHJvcGVydHkgYW5kIGV4dHJlbWUgaW5kaWNlcyBkZWZpbmVkOyBgZmFsc2VgIG90aGVyd2lzZS5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBfaXNBcnJheUxpa2UoW10pOyAvLz0+IHRydWVcbiAqICAgICAgX2lzQXJyYXlMaWtlKHRydWUpOyAvLz0+IGZhbHNlXG4gKiAgICAgIF9pc0FycmF5TGlrZSh7fSk7IC8vPT4gZmFsc2VcbiAqICAgICAgX2lzQXJyYXlMaWtlKHtsZW5ndGg6IDEwfSk7IC8vPT4gZmFsc2VcbiAqICAgICAgX2lzQXJyYXlMaWtlKHswOiAnemVybycsIDk6ICduaW5lJywgbGVuZ3RoOiAxMH0pOyAvLz0+IHRydWVcbiAqICAgICAgX2lzQXJyYXlMaWtlKHtub2RlVHlwZTogMSwgbGVuZ3RoOiAxfSkgLy8gPT4gZmFsc2VcbiAqL1xudmFyIF9pc0FycmF5TGlrZSA9IC8qI19fUFVSRV9fKi9fY3VycnkxKGZ1bmN0aW9uIGlzQXJyYXlMaWtlKHgpIHtcbiAgaWYgKF9pc0FycmF5KHgpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKCF4KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh0eXBlb2YgeCAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKF9pc1N0cmluZyh4KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoeC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoeC5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHguaGFzT3duUHJvcGVydHkoMCkgJiYgeC5oYXNPd25Qcm9wZXJ0eSh4Lmxlbmd0aCAtIDEpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgX2lzQXJyYXlMaWtlOyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9pc0Z1bmN0aW9uKHgpIHtcbiAgdmFyIHR5cGUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoeCk7XG4gIHJldHVybiB0eXBlID09PSAnW29iamVjdCBGdW5jdGlvbl0nIHx8IHR5cGUgPT09ICdbb2JqZWN0IEFzeW5jRnVuY3Rpb25dJyB8fCB0eXBlID09PSAnW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0nIHx8IHR5cGUgPT09ICdbb2JqZWN0IEFzeW5jR2VuZXJhdG9yRnVuY3Rpb25dJztcbn0iLCIvKipcbiAqIERldGVybWluZSBpZiB0aGUgcGFzc2VkIGFyZ3VtZW50IGlzIGFuIGludGVnZXIuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gblxuICogQGNhdGVnb3J5IFR5cGVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmV4cG9ydCBkZWZhdWx0IE51bWJlci5pc0ludGVnZXIgfHwgZnVuY3Rpb24gX2lzSW50ZWdlcihuKSB7XG4gIHJldHVybiBuIDw8IDAgPT09IG47XG59OyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9pc09iamVjdCh4KSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoeCkgPT09ICdbb2JqZWN0IE9iamVjdF0nO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9pc1BsYWNlaG9sZGVyKGEpIHtcbiAgcmV0dXJuIGEgIT0gbnVsbCAmJiB0eXBlb2YgYSA9PT0gJ29iamVjdCcgJiYgYVsnQEBmdW5jdGlvbmFsL3BsYWNlaG9sZGVyJ10gPT09IHRydWU7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2lzU3RyaW5nKHgpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh4KSA9PT0gJ1tvYmplY3QgU3RyaW5nXSc7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2lzVHJhbnNmb3JtZXIob2JqKSB7XG4gIHJldHVybiBvYmogIT0gbnVsbCAmJiB0eXBlb2Ygb2JqWydAQHRyYW5zZHVjZXIvc3RlcCddID09PSAnZnVuY3Rpb24nO1xufSIsIi8qKlxuICogVGVzdHMgd2hldGhlciBvciBub3QgYW4gb2JqZWN0IGlzIGEgdHlwZWQgYXJyYXkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSBvYmplY3QgdG8gdGVzdC5cbiAqIEByZXR1cm4ge0Jvb2xlYW59IGB0cnVlYCBpZiBgdmFsYCBpcyBhIHR5cGVkIGFycmF5LCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBfaXNUeXBlZEFycmF5KG5ldyBVaW50OEFycmF5KFtdKSk7IC8vPT4gdHJ1ZVxuICogICAgICBfaXNUeXBlZEFycmF5KG5ldyBGbG9hdDMyQXJyYXkoW10pKTsgLy89PiB0cnVlXG4gKiAgICAgIF9pc1R5cGVkQXJyYXkoW10pOyAvLz0+IGZhbHNlXG4gKiAgICAgIF9pc1R5cGVkQXJyYXkobnVsbCk7IC8vPT4gZmFsc2VcbiAqICAgICAgX2lzVHlwZWRBcnJheSh7fSk7IC8vPT4gZmFsc2VcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2lzVHlwZWRBcnJheSh2YWwpIHtcbiAgdmFyIHR5cGUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsKTtcbiAgcmV0dXJuIHR5cGUgPT09ICdbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XScgfHwgdHlwZSA9PT0gJ1tvYmplY3QgSW50OEFycmF5XScgfHwgdHlwZSA9PT0gJ1tvYmplY3QgVWludDhBcnJheV0nIHx8IHR5cGUgPT09ICdbb2JqZWN0IEludDE2QXJyYXldJyB8fCB0eXBlID09PSAnW29iamVjdCBVaW50MTZBcnJheV0nIHx8IHR5cGUgPT09ICdbb2JqZWN0IEludDMyQXJyYXldJyB8fCB0eXBlID09PSAnW29iamVjdCBVaW50MzJBcnJheV0nIHx8IHR5cGUgPT09ICdbb2JqZWN0IEZsb2F0MzJBcnJheV0nIHx8IHR5cGUgPT09ICdbb2JqZWN0IEZsb2F0NjRBcnJheV0nIHx8IHR5cGUgPT09ICdbb2JqZWN0IEJpZ0ludDY0QXJyYXldJyB8fCB0eXBlID09PSAnW29iamVjdCBCaWdVaW50NjRBcnJheV0nO1xufSIsImltcG9ydCBfaXNBcnJheUxpa2UgZnJvbSBcIi4vX2lzQXJyYXlMaWtlLmpzXCI7XG5cbi8qKlxuICogYF9tYWtlRmxhdGAgaXMgYSBoZWxwZXIgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgb25lLWxldmVsIG9yIGZ1bGx5IHJlY3Vyc2l2ZVxuICogZnVuY3Rpb24gYmFzZWQgb24gdGhlIGZsYWcgcGFzc2VkIGluLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9tYWtlRmxhdChyZWN1cnNpdmUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGZsYXR0KGxpc3QpIHtcbiAgICB2YXIgdmFsdWUsIGpsZW4sIGo7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIHZhciBpZHggPSAwO1xuICAgIHZhciBpbGVuID0gbGlzdC5sZW5ndGg7XG4gICAgd2hpbGUgKGlkeCA8IGlsZW4pIHtcbiAgICAgIGlmIChfaXNBcnJheUxpa2UobGlzdFtpZHhdKSkge1xuICAgICAgICB2YWx1ZSA9IHJlY3Vyc2l2ZSA/IGZsYXR0KGxpc3RbaWR4XSkgOiBsaXN0W2lkeF07XG4gICAgICAgIGogPSAwO1xuICAgICAgICBqbGVuID0gdmFsdWUubGVuZ3RoO1xuICAgICAgICB3aGlsZSAoaiA8IGpsZW4pIHtcbiAgICAgICAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aF0gPSB2YWx1ZVtqXTtcbiAgICAgICAgICBqICs9IDE7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdFtyZXN1bHQubGVuZ3RoXSA9IGxpc3RbaWR4XTtcbiAgICAgIH1cbiAgICAgIGlkeCArPSAxO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9tYXAoZm4sIGZ1bmN0b3IpIHtcbiAgdmFyIGlkeCA9IDA7XG4gIHZhciBsZW4gPSBmdW5jdG9yLmxlbmd0aDtcbiAgdmFyIHJlc3VsdCA9IEFycmF5KGxlbik7XG4gIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICByZXN1bHRbaWR4XSA9IGZuKGZ1bmN0b3JbaWR4XSk7XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn0iLCJpbXBvcnQgX2lzU3RyaW5nIGZyb20gXCIuL19pc1N0cmluZy5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX250aChvZmZzZXQsIGxpc3QpIHtcbiAgdmFyIGlkeCA9IG9mZnNldCA8IDAgPyBsaXN0Lmxlbmd0aCArIG9mZnNldCA6IG9mZnNldDtcbiAgcmV0dXJuIF9pc1N0cmluZyhsaXN0KSA/IGxpc3QuY2hhckF0KGlkeCkgOiBsaXN0W2lkeF07XG59IiwiaW1wb3J0IF9oYXMgZnJvbSBcIi4vX2hhcy5qc1wiO1xuXG4vLyBCYXNlZCBvbiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvYXNzaWduXG5mdW5jdGlvbiBfb2JqZWN0QXNzaWduKHRhcmdldCkge1xuICBpZiAodGFyZ2V0ID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3QnKTtcbiAgfVxuICB2YXIgb3V0cHV0ID0gT2JqZWN0KHRhcmdldCk7XG4gIHZhciBpZHggPSAxO1xuICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgd2hpbGUgKGlkeCA8IGxlbmd0aCkge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaWR4XTtcbiAgICBpZiAoc291cmNlICE9IG51bGwpIHtcbiAgICAgIGZvciAodmFyIG5leHRLZXkgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChfaGFzKG5leHRLZXksIHNvdXJjZSkpIHtcbiAgICAgICAgICBvdXRwdXRbbmV4dEtleV0gPSBzb3VyY2VbbmV4dEtleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIG91dHB1dDtcbn1cbmV4cG9ydCBkZWZhdWx0IHR5cGVvZiBPYmplY3QuYXNzaWduID09PSAnZnVuY3Rpb24nID8gT2JqZWN0LmFzc2lnbiA6IF9vYmplY3RBc3NpZ247IiwiLy8gQmFzZWQgb24gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2lzXG5mdW5jdGlvbiBfb2JqZWN0SXMoYSwgYikge1xuICAvLyBTYW1lVmFsdWUgYWxnb3JpdGhtXG4gIGlmIChhID09PSBiKSB7XG4gICAgLy8gU3RlcHMgMS01LCA3LTEwXG4gICAgLy8gU3RlcHMgNi5iLTYuZTogKzAgIT0gLTBcbiAgICByZXR1cm4gYSAhPT0gMCB8fCAxIC8gYSA9PT0gMSAvIGI7XG4gIH0gZWxzZSB7XG4gICAgLy8gU3RlcCA2LmE6IE5hTiA9PSBOYU5cbiAgICByZXR1cm4gYSAhPT0gYSAmJiBiICE9PSBiO1xuICB9XG59XG5leHBvcnQgZGVmYXVsdCB0eXBlb2YgT2JqZWN0LmlzID09PSAnZnVuY3Rpb24nID8gT2JqZWN0LmlzIDogX29iamVjdElzOyIsImltcG9ydCBfaXNJbnRlZ2VyIGZyb20gXCIuL19pc0ludGVnZXIuanNcIjtcbmltcG9ydCBfbnRoIGZyb20gXCIuL19udGguanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9wYXRoKHBhdGhBciwgb2JqKSB7XG4gIHZhciB2YWwgPSBvYmo7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aEFyLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgaWYgKHZhbCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB2YXIgcCA9IHBhdGhBcltpXTtcbiAgICBpZiAoX2lzSW50ZWdlcihwKSkge1xuICAgICAgdmFsID0gX250aChwLCB2YWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWwgPSB2YWxbcF07XG4gICAgfVxuICB9XG4gIHJldHVybiB2YWw7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3F1b3RlKHMpIHtcbiAgdmFyIGVzY2FwZWQgPSBzLnJlcGxhY2UoL1xcXFwvZywgJ1xcXFxcXFxcJykucmVwbGFjZSgvW1xcYl0vZywgJ1xcXFxiJykgLy8gXFxiIG1hdGNoZXMgd29yZCBib3VuZGFyeTsgW1xcYl0gbWF0Y2hlcyBiYWNrc3BhY2VcbiAgLnJlcGxhY2UoL1xcZi9nLCAnXFxcXGYnKS5yZXBsYWNlKC9cXG4vZywgJ1xcXFxuJykucmVwbGFjZSgvXFxyL2csICdcXFxccicpLnJlcGxhY2UoL1xcdC9nLCAnXFxcXHQnKS5yZXBsYWNlKC9cXHYvZywgJ1xcXFx2JykucmVwbGFjZSgvXFwwL2csICdcXFxcMCcpO1xuICByZXR1cm4gJ1wiJyArIGVzY2FwZWQucmVwbGFjZSgvXCIvZywgJ1xcXFxcIicpICsgJ1wiJztcbn0iLCJpbXBvcnQgX2FycmF5UmVkdWNlIGZyb20gXCIuL19hcnJheVJlZHVjZS5qc1wiO1xuaW1wb3J0IF9jcmVhdGVSZWR1Y2UgZnJvbSBcIi4vX2NyZWF0ZVJlZHVjZS5qc1wiO1xuZnVuY3Rpb24gX2l0ZXJhYmxlUmVkdWNlKHJlZHVjZXIsIGFjYywgaXRlcikge1xuICB2YXIgc3RlcCA9IGl0ZXIubmV4dCgpO1xuICB3aGlsZSAoIXN0ZXAuZG9uZSkge1xuICAgIGFjYyA9IHJlZHVjZXIoYWNjLCBzdGVwLnZhbHVlKTtcbiAgICBzdGVwID0gaXRlci5uZXh0KCk7XG4gIH1cbiAgcmV0dXJuIGFjYztcbn1cbmZ1bmN0aW9uIF9tZXRob2RSZWR1Y2UocmVkdWNlciwgYWNjLCBvYmosIG1ldGhvZE5hbWUpIHtcbiAgcmV0dXJuIG9ialttZXRob2ROYW1lXShyZWR1Y2VyLCBhY2MpO1xufVxudmFyIF9yZWR1Y2UgPSAvKiNfX1BVUkVfXyovX2NyZWF0ZVJlZHVjZShfYXJyYXlSZWR1Y2UsIF9tZXRob2RSZWR1Y2UsIF9pdGVyYWJsZVJlZHVjZSk7XG5leHBvcnQgZGVmYXVsdCBfcmVkdWNlOyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9yZWR1Y2VkKHgpIHtcbiAgcmV0dXJuIHggJiYgeFsnQEB0cmFuc2R1Y2VyL3JlZHVjZWQnXSA/IHggOiB7XG4gICAgJ0BAdHJhbnNkdWNlci92YWx1ZSc6IHgsXG4gICAgJ0BAdHJhbnNkdWNlci9yZWR1Y2VkJzogdHJ1ZVxuICB9O1xufSIsIi8qKlxuICogUG9seWZpbGwgZnJvbSA8aHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRGF0ZS90b0lTT1N0cmluZz4uXG4gKi9cbnZhciBwYWQgPSBmdW5jdGlvbiBwYWQobikge1xuICByZXR1cm4gKG4gPCAxMCA/ICcwJyA6ICcnKSArIG47XG59O1xudmFyIF90b0lTT1N0cmluZyA9IHR5cGVvZiBEYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZyA9PT0gJ2Z1bmN0aW9uJyA/IGZ1bmN0aW9uIF90b0lTT1N0cmluZyhkKSB7XG4gIHJldHVybiBkLnRvSVNPU3RyaW5nKCk7XG59IDogZnVuY3Rpb24gX3RvSVNPU3RyaW5nKGQpIHtcbiAgcmV0dXJuIGQuZ2V0VVRDRnVsbFllYXIoKSArICctJyArIHBhZChkLmdldFVUQ01vbnRoKCkgKyAxKSArICctJyArIHBhZChkLmdldFVUQ0RhdGUoKSkgKyAnVCcgKyBwYWQoZC5nZXRVVENIb3VycygpKSArICc6JyArIHBhZChkLmdldFVUQ01pbnV0ZXMoKSkgKyAnOicgKyBwYWQoZC5nZXRVVENTZWNvbmRzKCkpICsgJy4nICsgKGQuZ2V0VVRDTWlsbGlzZWNvbmRzKCkgLyAxMDAwKS50b0ZpeGVkKDMpLnNsaWNlKDIsIDUpICsgJ1onO1xufTtcbmV4cG9ydCBkZWZhdWx0IF90b0lTT1N0cmluZzsiLCJpbXBvcnQgX2luY2x1ZGVzIGZyb20gXCIuL19pbmNsdWRlcy5qc1wiO1xuaW1wb3J0IF9tYXAgZnJvbSBcIi4vX21hcC5qc1wiO1xuaW1wb3J0IF9xdW90ZSBmcm9tIFwiLi9fcXVvdGUuanNcIjtcbmltcG9ydCBfdG9JU09TdHJpbmcgZnJvbSBcIi4vX3RvSVNPU3RyaW5nLmpzXCI7XG5pbXBvcnQga2V5cyBmcm9tIFwiLi4va2V5cy5qc1wiO1xuaW1wb3J0IHJlamVjdCBmcm9tIFwiLi4vcmVqZWN0LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfdG9TdHJpbmcoeCwgc2Vlbikge1xuICB2YXIgcmVjdXIgPSBmdW5jdGlvbiByZWN1cih5KSB7XG4gICAgdmFyIHhzID0gc2Vlbi5jb25jYXQoW3hdKTtcbiAgICByZXR1cm4gX2luY2x1ZGVzKHksIHhzKSA/ICc8Q2lyY3VsYXI+JyA6IF90b1N0cmluZyh5LCB4cyk7XG4gIH07XG5cbiAgLy8gIG1hcFBhaXJzIDo6IChPYmplY3QsIFtTdHJpbmddKSAtPiBbU3RyaW5nXVxuICB2YXIgbWFwUGFpcnMgPSBmdW5jdGlvbiAob2JqLCBrZXlzKSB7XG4gICAgcmV0dXJuIF9tYXAoZnVuY3Rpb24gKGspIHtcbiAgICAgIHJldHVybiBfcXVvdGUoaykgKyAnOiAnICsgcmVjdXIob2JqW2tdKTtcbiAgICB9LCBrZXlzLnNsaWNlKCkuc29ydCgpKTtcbiAgfTtcbiAgc3dpdGNoIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoeCkpIHtcbiAgICBjYXNlICdbb2JqZWN0IEFyZ3VtZW50c10nOlxuICAgICAgcmV0dXJuICcoZnVuY3Rpb24oKSB7IHJldHVybiBhcmd1bWVudHM7IH0oJyArIF9tYXAocmVjdXIsIHgpLmpvaW4oJywgJykgKyAnKSknO1xuICAgIGNhc2UgJ1tvYmplY3QgQXJyYXldJzpcbiAgICAgIHJldHVybiAnWycgKyBfbWFwKHJlY3VyLCB4KS5jb25jYXQobWFwUGFpcnMoeCwgcmVqZWN0KGZ1bmN0aW9uIChrKSB7XG4gICAgICAgIHJldHVybiAvXlxcZCskLy50ZXN0KGspO1xuICAgICAgfSwga2V5cyh4KSkpKS5qb2luKCcsICcpICsgJ10nO1xuICAgIGNhc2UgJ1tvYmplY3QgQm9vbGVhbl0nOlxuICAgICAgcmV0dXJuIHR5cGVvZiB4ID09PSAnb2JqZWN0JyA/ICduZXcgQm9vbGVhbignICsgcmVjdXIoeC52YWx1ZU9mKCkpICsgJyknIDogeC50b1N0cmluZygpO1xuICAgIGNhc2UgJ1tvYmplY3QgRGF0ZV0nOlxuICAgICAgcmV0dXJuICduZXcgRGF0ZSgnICsgKGlzTmFOKHgudmFsdWVPZigpKSA/IHJlY3VyKE5hTikgOiBfcXVvdGUoX3RvSVNPU3RyaW5nKHgpKSkgKyAnKSc7XG4gICAgY2FzZSAnW29iamVjdCBNYXBdJzpcbiAgICAgIHJldHVybiAnbmV3IE1hcCgnICsgcmVjdXIoQXJyYXkuZnJvbSh4KSkgKyAnKSc7XG4gICAgY2FzZSAnW29iamVjdCBOdWxsXSc6XG4gICAgICByZXR1cm4gJ251bGwnO1xuICAgIGNhc2UgJ1tvYmplY3QgTnVtYmVyXSc6XG4gICAgICByZXR1cm4gdHlwZW9mIHggPT09ICdvYmplY3QnID8gJ25ldyBOdW1iZXIoJyArIHJlY3VyKHgudmFsdWVPZigpKSArICcpJyA6IDEgLyB4ID09PSAtSW5maW5pdHkgPyAnLTAnIDogeC50b1N0cmluZygxMCk7XG4gICAgY2FzZSAnW29iamVjdCBTZXRdJzpcbiAgICAgIHJldHVybiAnbmV3IFNldCgnICsgcmVjdXIoQXJyYXkuZnJvbSh4KS5zb3J0KCkpICsgJyknO1xuICAgIGNhc2UgJ1tvYmplY3QgU3RyaW5nXSc6XG4gICAgICByZXR1cm4gdHlwZW9mIHggPT09ICdvYmplY3QnID8gJ25ldyBTdHJpbmcoJyArIHJlY3VyKHgudmFsdWVPZigpKSArICcpJyA6IF9xdW90ZSh4KTtcbiAgICBjYXNlICdbb2JqZWN0IFVuZGVmaW5lZF0nOlxuICAgICAgcmV0dXJuICd1bmRlZmluZWQnO1xuICAgIGRlZmF1bHQ6XG4gICAgICBpZiAodHlwZW9mIHgudG9TdHJpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdmFyIHJlcHIgPSB4LnRvU3RyaW5nKCk7XG4gICAgICAgIGlmIChyZXByICE9PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgICAgICAgIHJldHVybiByZXByO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gJ3snICsgbWFwUGFpcnMoeCwga2V5cyh4KSkuam9pbignLCAnKSArICd9JztcbiAgfVxufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF94QXJyYXlSZWR1Y2UoeGYsIGFjYywgbGlzdCkge1xuICB2YXIgaWR4ID0gMDtcbiAgdmFyIGxlbiA9IGxpc3QubGVuZ3RoO1xuICB3aGlsZSAoaWR4IDwgbGVuKSB7XG4gICAgYWNjID0geGZbJ0BAdHJhbnNkdWNlci9zdGVwJ10oYWNjLCBsaXN0W2lkeF0pO1xuICAgIGlmIChhY2MgJiYgYWNjWydAQHRyYW5zZHVjZXIvcmVkdWNlZCddKSB7XG4gICAgICBhY2MgPSBhY2NbJ0BAdHJhbnNkdWNlci92YWx1ZSddO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlkeCArPSAxO1xuICB9XG4gIHJldHVybiB4ZlsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddKGFjYyk7XG59IiwiaW1wb3J0IF9jcmVhdGVSZWR1Y2UgZnJvbSBcIi4vX2NyZWF0ZVJlZHVjZS5qc1wiO1xuaW1wb3J0IF94QXJyYXlSZWR1Y2UgZnJvbSBcIi4vX3hBcnJheVJlZHVjZS5qc1wiO1xuaW1wb3J0IGJpbmQgZnJvbSBcIi4uL2JpbmQuanNcIjtcbmZ1bmN0aW9uIF94SXRlcmFibGVSZWR1Y2UoeGYsIGFjYywgaXRlcikge1xuICB2YXIgc3RlcCA9IGl0ZXIubmV4dCgpO1xuICB3aGlsZSAoIXN0ZXAuZG9uZSkge1xuICAgIGFjYyA9IHhmWydAQHRyYW5zZHVjZXIvc3RlcCddKGFjYywgc3RlcC52YWx1ZSk7XG4gICAgaWYgKGFjYyAmJiBhY2NbJ0BAdHJhbnNkdWNlci9yZWR1Y2VkJ10pIHtcbiAgICAgIGFjYyA9IGFjY1snQEB0cmFuc2R1Y2VyL3ZhbHVlJ107XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgc3RlcCA9IGl0ZXIubmV4dCgpO1xuICB9XG4gIHJldHVybiB4ZlsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddKGFjYyk7XG59XG5mdW5jdGlvbiBfeE1ldGhvZFJlZHVjZSh4ZiwgYWNjLCBvYmosIG1ldGhvZE5hbWUpIHtcbiAgcmV0dXJuIHhmWydAQHRyYW5zZHVjZXIvcmVzdWx0J10ob2JqW21ldGhvZE5hbWVdKGJpbmQoeGZbJ0BAdHJhbnNkdWNlci9zdGVwJ10sIHhmKSwgYWNjKSk7XG59XG52YXIgX3hSZWR1Y2UgPSAvKiNfX1BVUkVfXyovX2NyZWF0ZVJlZHVjZShfeEFycmF5UmVkdWNlLCBfeE1ldGhvZFJlZHVjZSwgX3hJdGVyYWJsZVJlZHVjZSk7XG5leHBvcnQgZGVmYXVsdCBfeFJlZHVjZTsiLCJpbXBvcnQgX3JlZHVjZWQgZnJvbSBcIi4vX3JlZHVjZWQuanNcIjtcbmltcG9ydCBfeGZCYXNlIGZyb20gXCIuL194ZkJhc2UuanNcIjtcbnZhciBYQWxsID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gWEFsbChmLCB4Zikge1xuICAgIHRoaXMueGYgPSB4ZjtcbiAgICB0aGlzLmYgPSBmO1xuICAgIHRoaXMuYWxsID0gdHJ1ZTtcbiAgfVxuICBYQWxsLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL2luaXQnXSA9IF94ZkJhc2UuaW5pdDtcbiAgWEFsbC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXSA9IGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICBpZiAodGhpcy5hbGwpIHtcbiAgICAgIHJlc3VsdCA9IHRoaXMueGZbJ0BAdHJhbnNkdWNlci9zdGVwJ10ocmVzdWx0LCB0cnVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMueGZbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXShyZXN1bHQpO1xuICB9O1xuICBYQWxsLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3N0ZXAnXSA9IGZ1bmN0aW9uIChyZXN1bHQsIGlucHV0KSB7XG4gICAgaWYgKCF0aGlzLmYoaW5wdXQpKSB7XG4gICAgICB0aGlzLmFsbCA9IGZhbHNlO1xuICAgICAgcmVzdWx0ID0gX3JlZHVjZWQodGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIGZhbHNlKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIHJldHVybiBYQWxsO1xufSgpO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3hhbGwoZikge1xuICByZXR1cm4gZnVuY3Rpb24gKHhmKSB7XG4gICAgcmV0dXJuIG5ldyBYQWxsKGYsIHhmKTtcbiAgfTtcbn0iLCJpbXBvcnQgX3JlZHVjZWQgZnJvbSBcIi4vX3JlZHVjZWQuanNcIjtcbmltcG9ydCBfeGZCYXNlIGZyb20gXCIuL194ZkJhc2UuanNcIjtcbnZhciBYQW55ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gWEFueShmLCB4Zikge1xuICAgIHRoaXMueGYgPSB4ZjtcbiAgICB0aGlzLmYgPSBmO1xuICAgIHRoaXMuYW55ID0gZmFsc2U7XG4gIH1cbiAgWEFueS5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9pbml0J10gPSBfeGZCYXNlLmluaXQ7XG4gIFhBbnkucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvcmVzdWx0J10gPSBmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgaWYgKCF0aGlzLmFueSkge1xuICAgICAgcmVzdWx0ID0gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIGZhbHNlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMueGZbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXShyZXN1bHQpO1xuICB9O1xuICBYQW55LnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3N0ZXAnXSA9IGZ1bmN0aW9uIChyZXN1bHQsIGlucHV0KSB7XG4gICAgaWYgKHRoaXMuZihpbnB1dCkpIHtcbiAgICAgIHRoaXMuYW55ID0gdHJ1ZTtcbiAgICAgIHJlc3VsdCA9IF9yZWR1Y2VkKHRoaXMueGZbJ0BAdHJhbnNkdWNlci9zdGVwJ10ocmVzdWx0LCB0cnVlKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIHJldHVybiBYQW55O1xufSgpO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3hhbnkoZikge1xuICByZXR1cm4gZnVuY3Rpb24gKHhmKSB7XG4gICAgcmV0dXJuIG5ldyBYQW55KGYsIHhmKTtcbiAgfTtcbn0iLCJleHBvcnQgZGVmYXVsdCB7XG4gIGluaXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL2luaXQnXSgpO1xuICB9LFxuICByZXN1bHQ6IGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICByZXR1cm4gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddKHJlc3VsdCk7XG4gIH1cbn07IiwiaW1wb3J0IF94ZkJhc2UgZnJvbSBcIi4vX3hmQmFzZS5qc1wiO1xudmFyIFhGaWx0ZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBYRmlsdGVyKGYsIHhmKSB7XG4gICAgdGhpcy54ZiA9IHhmO1xuICAgIHRoaXMuZiA9IGY7XG4gIH1cbiAgWEZpbHRlci5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9pbml0J10gPSBfeGZCYXNlLmluaXQ7XG4gIFhGaWx0ZXIucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvcmVzdWx0J10gPSBfeGZCYXNlLnJlc3VsdDtcbiAgWEZpbHRlci5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9zdGVwJ10gPSBmdW5jdGlvbiAocmVzdWx0LCBpbnB1dCkge1xuICAgIHJldHVybiB0aGlzLmYoaW5wdXQpID8gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIGlucHV0KSA6IHJlc3VsdDtcbiAgfTtcbiAgcmV0dXJuIFhGaWx0ZXI7XG59KCk7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfeGZpbHRlcihmKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoeGYpIHtcbiAgICByZXR1cm4gbmV3IFhGaWx0ZXIoZiwgeGYpO1xuICB9O1xufSIsImltcG9ydCBfcmVkdWNlZCBmcm9tIFwiLi9fcmVkdWNlZC5qc1wiO1xuaW1wb3J0IF94ZkJhc2UgZnJvbSBcIi4vX3hmQmFzZS5qc1wiO1xudmFyIFhGaW5kID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gWEZpbmQoZiwgeGYpIHtcbiAgICB0aGlzLnhmID0geGY7XG4gICAgdGhpcy5mID0gZjtcbiAgICB0aGlzLmZvdW5kID0gZmFsc2U7XG4gIH1cbiAgWEZpbmQucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvaW5pdCddID0gX3hmQmFzZS5pbml0O1xuICBYRmluZC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXSA9IGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICBpZiAoIXRoaXMuZm91bmQpIHtcbiAgICAgIHJlc3VsdCA9IHRoaXMueGZbJ0BAdHJhbnNkdWNlci9zdGVwJ10ocmVzdWx0LCB2b2lkIDApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddKHJlc3VsdCk7XG4gIH07XG4gIFhGaW5kLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3N0ZXAnXSA9IGZ1bmN0aW9uIChyZXN1bHQsIGlucHV0KSB7XG4gICAgaWYgKHRoaXMuZihpbnB1dCkpIHtcbiAgICAgIHRoaXMuZm91bmQgPSB0cnVlO1xuICAgICAgcmVzdWx0ID0gX3JlZHVjZWQodGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIGlucHV0KSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIHJldHVybiBYRmluZDtcbn0oKTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF94ZmluZChmKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoeGYpIHtcbiAgICByZXR1cm4gbmV3IFhGaW5kKGYsIHhmKTtcbiAgfTtcbn0iLCJpbXBvcnQgX3JlZHVjZWQgZnJvbSBcIi4vX3JlZHVjZWQuanNcIjtcbmltcG9ydCBfeGZCYXNlIGZyb20gXCIuL194ZkJhc2UuanNcIjtcbnZhciBYRmluZEluZGV4ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gWEZpbmRJbmRleChmLCB4Zikge1xuICAgIHRoaXMueGYgPSB4ZjtcbiAgICB0aGlzLmYgPSBmO1xuICAgIHRoaXMuaWR4ID0gLTE7XG4gICAgdGhpcy5mb3VuZCA9IGZhbHNlO1xuICB9XG4gIFhGaW5kSW5kZXgucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvaW5pdCddID0gX3hmQmFzZS5pbml0O1xuICBYRmluZEluZGV4LnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddID0gZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgIGlmICghdGhpcy5mb3VuZCkge1xuICAgICAgcmVzdWx0ID0gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIC0xKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMueGZbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXShyZXN1bHQpO1xuICB9O1xuICBYRmluZEluZGV4LnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3N0ZXAnXSA9IGZ1bmN0aW9uIChyZXN1bHQsIGlucHV0KSB7XG4gICAgdGhpcy5pZHggKz0gMTtcbiAgICBpZiAodGhpcy5mKGlucHV0KSkge1xuICAgICAgdGhpcy5mb3VuZCA9IHRydWU7XG4gICAgICByZXN1bHQgPSBfcmVkdWNlZCh0aGlzLnhmWydAQHRyYW5zZHVjZXIvc3RlcCddKHJlc3VsdCwgdGhpcy5pZHgpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgcmV0dXJuIFhGaW5kSW5kZXg7XG59KCk7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfeGZpbmRJbmRleChmKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoeGYpIHtcbiAgICByZXR1cm4gbmV3IFhGaW5kSW5kZXgoZiwgeGYpO1xuICB9O1xufSIsImltcG9ydCBfeGZCYXNlIGZyb20gXCIuL194ZkJhc2UuanNcIjtcbnZhciBYTWFwID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gWE1hcChmLCB4Zikge1xuICAgIHRoaXMueGYgPSB4ZjtcbiAgICB0aGlzLmYgPSBmO1xuICB9XG4gIFhNYXAucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvaW5pdCddID0gX3hmQmFzZS5pbml0O1xuICBYTWFwLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddID0gX3hmQmFzZS5yZXN1bHQ7XG4gIFhNYXAucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvc3RlcCddID0gZnVuY3Rpb24gKHJlc3VsdCwgaW5wdXQpIHtcbiAgICByZXR1cm4gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIHRoaXMuZihpbnB1dCkpO1xuICB9O1xuICByZXR1cm4gWE1hcDtcbn0oKTtcbnZhciBfeG1hcCA9IGZ1bmN0aW9uIF94bWFwKGYpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh4Zikge1xuICAgIHJldHVybiBuZXcgWE1hcChmLCB4Zik7XG4gIH07XG59O1xuZXhwb3J0IGRlZmF1bHQgX3htYXA7IiwiaW1wb3J0IF9jbG9uZSBmcm9tIFwiLi9fY2xvbmUuanNcIjtcbmltcG9ydCBfaGFzIGZyb20gXCIuL19oYXMuanNcIjtcbmltcG9ydCBfeGZCYXNlIGZyb20gXCIuL194ZkJhc2UuanNcIjtcbnZhciBYUmVkdWNlQnkgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBYUmVkdWNlQnkodmFsdWVGbiwgdmFsdWVBY2MsIGtleUZuLCB4Zikge1xuICAgIHRoaXMudmFsdWVGbiA9IHZhbHVlRm47XG4gICAgdGhpcy52YWx1ZUFjYyA9IHZhbHVlQWNjO1xuICAgIHRoaXMua2V5Rm4gPSBrZXlGbjtcbiAgICB0aGlzLnhmID0geGY7XG4gICAgdGhpcy5pbnB1dHMgPSB7fTtcbiAgfVxuICBYUmVkdWNlQnkucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvaW5pdCddID0gX3hmQmFzZS5pbml0O1xuICBYUmVkdWNlQnkucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvcmVzdWx0J10gPSBmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgdmFyIGtleTtcbiAgICBmb3IgKGtleSBpbiB0aGlzLmlucHV0cykge1xuICAgICAgaWYgKF9oYXMoa2V5LCB0aGlzLmlucHV0cykpIHtcbiAgICAgICAgcmVzdWx0ID0gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIHRoaXMuaW5wdXRzW2tleV0pO1xuICAgICAgICBpZiAocmVzdWx0WydAQHRyYW5zZHVjZXIvcmVkdWNlZCddKSB7XG4gICAgICAgICAgcmVzdWx0ID0gcmVzdWx0WydAQHRyYW5zZHVjZXIvdmFsdWUnXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmlucHV0cyA9IG51bGw7XG4gICAgcmV0dXJuIHRoaXMueGZbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXShyZXN1bHQpO1xuICB9O1xuICBYUmVkdWNlQnkucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvc3RlcCddID0gZnVuY3Rpb24gKHJlc3VsdCwgaW5wdXQpIHtcbiAgICB2YXIga2V5ID0gdGhpcy5rZXlGbihpbnB1dCk7XG4gICAgdGhpcy5pbnB1dHNba2V5XSA9IHRoaXMuaW5wdXRzW2tleV0gfHwgW2tleSwgX2Nsb25lKHRoaXMudmFsdWVBY2MsIGZhbHNlKV07XG4gICAgdGhpcy5pbnB1dHNba2V5XVsxXSA9IHRoaXMudmFsdWVGbih0aGlzLmlucHV0c1trZXldWzFdLCBpbnB1dCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgcmV0dXJuIFhSZWR1Y2VCeTtcbn0oKTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF94cmVkdWNlQnkodmFsdWVGbiwgdmFsdWVBY2MsIGtleUZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoeGYpIHtcbiAgICByZXR1cm4gbmV3IFhSZWR1Y2VCeSh2YWx1ZUZuLCB2YWx1ZUFjYywga2V5Rm4sIHhmKTtcbiAgfTtcbn0iLCJpbXBvcnQgX3JlZHVjZWQgZnJvbSBcIi4vX3JlZHVjZWQuanNcIjtcbmltcG9ydCBfeGZCYXNlIGZyb20gXCIuL194ZkJhc2UuanNcIjtcbnZhciBYVGFrZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFhUYWtlKG4sIHhmKSB7XG4gICAgdGhpcy54ZiA9IHhmO1xuICAgIHRoaXMubiA9IG47XG4gICAgdGhpcy5pID0gMDtcbiAgfVxuICBYVGFrZS5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9pbml0J10gPSBfeGZCYXNlLmluaXQ7XG4gIFhUYWtlLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddID0gX3hmQmFzZS5yZXN1bHQ7XG4gIFhUYWtlLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3N0ZXAnXSA9IGZ1bmN0aW9uIChyZXN1bHQsIGlucHV0KSB7XG4gICAgdGhpcy5pICs9IDE7XG4gICAgdmFyIHJldCA9IHRoaXMubiA9PT0gMCA/IHJlc3VsdCA6IHRoaXMueGZbJ0BAdHJhbnNkdWNlci9zdGVwJ10ocmVzdWx0LCBpbnB1dCk7XG4gICAgcmV0dXJuIHRoaXMubiA+PSAwICYmIHRoaXMuaSA+PSB0aGlzLm4gPyBfcmVkdWNlZChyZXQpIDogcmV0O1xuICB9O1xuICByZXR1cm4gWFRha2U7XG59KCk7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfeHRha2Uobikge1xuICByZXR1cm4gZnVuY3Rpb24gKHhmKSB7XG4gICAgcmV0dXJuIG5ldyBYVGFrZShuLCB4Zik7XG4gIH07XG59IiwiaW1wb3J0IF9TZXQgZnJvbSBcIi4vX1NldC5qc1wiO1xuaW1wb3J0IF94ZkJhc2UgZnJvbSBcIi4vX3hmQmFzZS5qc1wiO1xudmFyIFhVbmlxQnkgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBYVW5pcUJ5KGYsIHhmKSB7XG4gICAgdGhpcy54ZiA9IHhmO1xuICAgIHRoaXMuZiA9IGY7XG4gICAgdGhpcy5zZXQgPSBuZXcgX1NldCgpO1xuICB9XG4gIFhVbmlxQnkucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvaW5pdCddID0gX3hmQmFzZS5pbml0O1xuICBYVW5pcUJ5LnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddID0gX3hmQmFzZS5yZXN1bHQ7XG4gIFhVbmlxQnkucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvc3RlcCddID0gZnVuY3Rpb24gKHJlc3VsdCwgaW5wdXQpIHtcbiAgICByZXR1cm4gdGhpcy5zZXQuYWRkKHRoaXMuZihpbnB1dCkpID8gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIGlucHV0KSA6IHJlc3VsdDtcbiAgfTtcbiAgcmV0dXJuIFhVbmlxQnk7XG59KCk7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfeHVuaXFCeShmKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoeGYpIHtcbiAgICByZXR1cm4gbmV3IFhVbmlxQnkoZiwgeGYpO1xuICB9O1xufSIsInZhciBYV3JhcCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFhXcmFwKGZuKSB7XG4gICAgdGhpcy5mID0gZm47XG4gIH1cbiAgWFdyYXAucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvaW5pdCddID0gZnVuY3Rpb24gKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW5pdCBub3QgaW1wbGVtZW50ZWQgb24gWFdyYXAnKTtcbiAgfTtcbiAgWFdyYXAucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvcmVzdWx0J10gPSBmdW5jdGlvbiAoYWNjKSB7XG4gICAgcmV0dXJuIGFjYztcbiAgfTtcbiAgWFdyYXAucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvc3RlcCddID0gZnVuY3Rpb24gKGFjYywgeCkge1xuICAgIHJldHVybiB0aGlzLmYoYWNjLCB4KTtcbiAgfTtcbiAgcmV0dXJuIFhXcmFwO1xufSgpO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3h3cmFwKGZuKSB7XG4gIHJldHVybiBuZXcgWFdyYXAoZm4pO1xufSIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfZmlsdGVyIGZyb20gXCIuL2ludGVybmFsL19maWx0ZXIuanNcIjtcbmltcG9ydCBfU2V0IGZyb20gXCIuL2ludGVybmFsL19TZXQuanNcIjtcbmltcG9ydCB1bmlxIGZyb20gXCIuL3VuaXEuanNcIjtcblxuLyoqXG4gKiBDb21iaW5lcyB0d28gbGlzdHMgaW50byBhIHNldCAoaS5lLiBubyBkdXBsaWNhdGVzKSBjb21wb3NlZCBvZiB0aG9zZVxuICogZWxlbWVudHMgY29tbW9uIHRvIGJvdGggbGlzdHMuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgUmVsYXRpb25cbiAqIEBzaWcgWypdIC0+IFsqXSAtPiBbKl1cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QxIFRoZSBmaXJzdCBsaXN0LlxuICogQHBhcmFtIHtBcnJheX0gbGlzdDIgVGhlIHNlY29uZCBsaXN0LlxuICogQHJldHVybiB7QXJyYXl9IFRoZSBsaXN0IG9mIGVsZW1lbnRzIGZvdW5kIGluIGJvdGggYGxpc3QxYCBhbmQgYGxpc3QyYC5cbiAqIEBzZWUgUi5pbm5lckpvaW5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmludGVyc2VjdGlvbihbMSwyLDMsNF0sIFs3LDYsNSw0LDNdKTsgLy89PiBbNCwgM11cbiAqL1xudmFyIGludGVyc2VjdGlvbiA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIGludGVyc2VjdGlvbihsaXN0MSwgbGlzdDIpIHtcbiAgdmFyIHRvS2VlcCA9IG5ldyBfU2V0KCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdDEubGVuZ3RoOyBpICs9IDEpIHtcbiAgICB0b0tlZXAuYWRkKGxpc3QxW2ldKTtcbiAgfVxuICByZXR1cm4gdW5pcShfZmlsdGVyKHRvS2VlcC5oYXMuYmluZCh0b0tlZXApLCBsaXN0MikpO1xufSk7XG5leHBvcnQgZGVmYXVsdCBpbnRlcnNlY3Rpb247IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9pc0Z1bmN0aW9uIGZyb20gXCIuL2ludGVybmFsL19pc0Z1bmN0aW9uLmpzXCI7XG5pbXBvcnQgY3VycnlOIGZyb20gXCIuL2N1cnJ5Ti5qc1wiO1xuaW1wb3J0IHRvU3RyaW5nIGZyb20gXCIuL3RvU3RyaW5nLmpzXCI7XG5cbi8qKlxuICogR2l2ZW4gYW4gYGFyaXR5YCAoTnVtYmVyKSBhbmQgYSBgbmFtZWAgKFN0cmluZykgdGhlIGBpbnZva2VyYCBmdW5jdGlvblxuICogcmV0dXJucyBhIGN1cnJpZWQgZnVuY3Rpb24gdGhhdCB0YWtlcyBgYXJpdHlgIGFyZ3VtZW50cyBhbmQgYSBgY29udGV4dGBcbiAqIG9iamVjdC4gSXQgd2lsbCBcImludm9rZVwiIHRoZSBgbmFtZWAnZCBmdW5jdGlvbiAoYSBtZXRob2QpIG9uIHRoZSBgY29udGV4dGBcbiAqIG9iamVjdC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyBOdW1iZXIgLT4gU3RyaW5nIC0+IChhIC0+IGIgLT4gLi4uIC0+IG4gLT4gT2JqZWN0IC0+ICopXG4gKiBAcGFyYW0ge051bWJlcn0gYXJpdHkgTnVtYmVyIG9mIGFyZ3VtZW50cyB0aGUgcmV0dXJuZWQgZnVuY3Rpb24gc2hvdWxkIHRha2VcbiAqICAgICAgICBiZWZvcmUgdGhlIHRhcmdldCBvYmplY3QuXG4gKiBAcGFyYW0ge1N0cmluZ30gbWV0aG9kIE5hbWUgb2YgYW55IG9mIHRoZSB0YXJnZXQgb2JqZWN0J3MgbWV0aG9kcyB0byBjYWxsLlxuICogQHJldHVybiB7RnVuY3Rpb259IEEgbmV3IGN1cnJpZWQgZnVuY3Rpb24uXG4gKiBAc2VlIFIuY29uc3RydWN0XG4gKiBAZXhhbXBsZVxuICogICAgICAvLyBBIGZ1bmN0aW9uIHdpdGggbm8gYXJndW1lbnRzXG4gKiAgICAgIGNvbnN0IGFzSnNvbiA9IGludm9rZXIoMCwgXCJqc29uXCIpXG4gKiAgICAgIC8vIEp1c3QgbGlrZSBjYWxsaW5nIC50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuanNvbigpKVxuICogICAgICBmZXRjaChcImh0dHA6Ly9leGFtcGxlLmNvbS9pbmRleC5qc29uXCIpLnRoZW4oYXNKc29uKVxuICpcbiAqICAgICAgLy8gQSBmdW5jdGlvbiB3aXRoIG9uZSBhcmd1bWVudFxuICogICAgICBjb25zdCBzbGljZUZyb20gPSBpbnZva2VyKDEsICdzbGljZScpO1xuICogICAgICBzbGljZUZyb20oNiwgJ2FiY2RlZmdoaWprbG0nKTsgLy89PiAnZ2hpamtsbSdcbiAqXG4gKiAgICAgIC8vIEEgZnVuY3Rpb24gd2l0aCB0d28gYXJndW1lbnRzXG4gKiAgICAgIGNvbnN0IHNsaWNlRnJvbTYgPSBpbnZva2VyKDIsICdzbGljZScpKDYpO1xuICogICAgICBzbGljZUZyb202KDgsICdhYmNkZWZnaGlqa2xtJyk7IC8vPT4gJ2doJ1xuICpcbiAqICAgICAgLy8gTk9URTogWW91IGNhbid0IHNpbXBseSBwYXNzIHNvbWUgb2YgdGhlIGFyZ3VtZW50cyB0byB0aGUgaW5pdGlhbCBpbnZva2VyIGZ1bmN0aW9uLlxuICogICAgICBjb25zdCBmaXJzdENyZWRpdENhcmRTZWN0aW9uID0gaW52b2tlcigyLCBcInNsaWNlXCIsIDAsIDQpXG4gKiAgICAgIGZpcnN0Q3JlZGl0Q2FyZFNlY3Rpb24oXCI0MjQyIDQyNDIgNDI0MiA0MjQyXCIpIC8vID0+IEZ1bmN0aW9uPC4uLj5cbiAqXG4gKiAgICAgIC8vIFNpbmNlIGludm9rZXIgcmV0dXJucyBhIGN1cnJpZWQgZnVuY3Rpb24sIHlvdSBtYXkgcGFydGlhbGx5IGFwcGx5IGl0IHRvIGNyZWF0ZSB0aGUgZnVuY3Rpb24geW91IG5lZWQuXG4gKiAgICAgIGNvbnN0IGZpcnN0Q3JlZGl0Q2FyZFNlY3Rpb24gPSBpbnZva2VyKDIsIFwic2xpY2VcIikoMCwgNClcbiAqICAgICAgZmlyc3RDcmVkaXRDYXJkU2VjdGlvbihcIjQyNDIgNDI0MiA0MjQyIDQyNDJcIikgLy8gPT4gXCI0MjQyXCJcbiAqXG4gKiBAc3ltYiBSLmludm9rZXIoMCwgJ21ldGhvZCcpKG8pID0gb1snbWV0aG9kJ10oKVxuICogQHN5bWIgUi5pbnZva2VyKDEsICdtZXRob2QnKShhLCBvKSA9IG9bJ21ldGhvZCddKGEpXG4gKiBAc3ltYiBSLmludm9rZXIoMiwgJ21ldGhvZCcpKGEsIGIsIG8pID0gb1snbWV0aG9kJ10oYSwgYilcbiAqL1xudmFyIGludm9rZXIgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiBpbnZva2VyKGFyaXR5LCBtZXRob2QpIHtcbiAgcmV0dXJuIGN1cnJ5Tihhcml0eSArIDEsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdGFyZ2V0ID0gYXJndW1lbnRzW2FyaXR5XTtcbiAgICBpZiAodGFyZ2V0ICE9IG51bGwgJiYgX2lzRnVuY3Rpb24odGFyZ2V0W21ldGhvZF0pKSB7XG4gICAgICByZXR1cm4gdGFyZ2V0W21ldGhvZF0uYXBwbHkodGFyZ2V0LCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDAsIGFyaXR5KSk7XG4gICAgfVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IodG9TdHJpbmcodGFyZ2V0KSArICcgZG9lcyBub3QgaGF2ZSBhIG1ldGhvZCBuYW1lZCBcIicgKyBtZXRob2QgKyAnXCInKTtcbiAgfSk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IGludm9rZXI7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuXG4vKipcbiAqIFNlZSBpZiBhbiBvYmplY3QgKGkuZS4gYHZhbGApIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBzdXBwbGllZCBjb25zdHJ1Y3Rvci4gVGhpc1xuICogZnVuY3Rpb24gd2lsbCBjaGVjayB1cCB0aGUgaW5oZXJpdGFuY2UgY2hhaW4sIGlmIGFueS5cbiAqIElmIGB2YWxgIHdhcyBjcmVhdGVkIHVzaW5nIGBPYmplY3QuY3JlYXRlYCwgYFIuaXMoT2JqZWN0LCB2YWwpID09PSB0cnVlYC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4zLjBcbiAqIEBjYXRlZ29yeSBUeXBlXG4gKiBAc2lnICgqIC0+IHsqfSkgLT4gYSAtPiBCb29sZWFuXG4gKiBAcGFyYW0ge09iamVjdH0gY3RvciBBIGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmlzKE9iamVjdCwge30pOyAvLz0+IHRydWVcbiAqICAgICAgUi5pcyhOdW1iZXIsIDEpOyAvLz0+IHRydWVcbiAqICAgICAgUi5pcyhPYmplY3QsIDEpOyAvLz0+IGZhbHNlXG4gKiAgICAgIFIuaXMoU3RyaW5nLCAncycpOyAvLz0+IHRydWVcbiAqICAgICAgUi5pcyhTdHJpbmcsIG5ldyBTdHJpbmcoJycpKTsgLy89PiB0cnVlXG4gKiAgICAgIFIuaXMoT2JqZWN0LCBuZXcgU3RyaW5nKCcnKSk7IC8vPT4gdHJ1ZVxuICogICAgICBSLmlzKE9iamVjdCwgJ3MnKTsgLy89PiBmYWxzZVxuICogICAgICBSLmlzKE51bWJlciwge30pOyAvLz0+IGZhbHNlXG4gKi9cbnZhciBpcyA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIGlzKEN0b3IsIHZhbCkge1xuICByZXR1cm4gdmFsIGluc3RhbmNlb2YgQ3RvciB8fCB2YWwgIT0gbnVsbCAmJiAodmFsLmNvbnN0cnVjdG9yID09PSBDdG9yIHx8IEN0b3IubmFtZSA9PT0gJ09iamVjdCcgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcpO1xufSk7XG5leHBvcnQgZGVmYXVsdCBpczsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5pbXBvcnQgZW1wdHkgZnJvbSBcIi4vZW1wdHkuanNcIjtcbmltcG9ydCBlcXVhbHMgZnJvbSBcIi4vZXF1YWxzLmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGdpdmVuIHZhbHVlIGlzIGl0cyB0eXBlJ3MgZW1wdHkgdmFsdWU7IGBmYWxzZWBcbiAqIG90aGVyd2lzZS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMb2dpY1xuICogQHNpZyBhIC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7Kn0geFxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBzZWUgUi5lbXB0eSwgUi5pc05vdEVtcHR5XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5pc0VtcHR5KFsxLCAyLCAzXSk7ICAgICAgICAgICAvLz0+IGZhbHNlXG4gKiAgICAgIFIuaXNFbXB0eShbXSk7ICAgICAgICAgICAgICAgICAgLy89PiB0cnVlXG4gKiAgICAgIFIuaXNFbXB0eSgnJyk7ICAgICAgICAgICAgICAgICAgLy89PiB0cnVlXG4gKiAgICAgIFIuaXNFbXB0eShudWxsKTsgICAgICAgICAgICAgICAgLy89PiBmYWxzZVxuICogICAgICBSLmlzRW1wdHkoe30pOyAgICAgICAgICAgICAgICAgIC8vPT4gdHJ1ZVxuICogICAgICBSLmlzRW1wdHkoe2xlbmd0aDogMH0pOyAgICAgICAgIC8vPT4gZmFsc2VcbiAqICAgICAgUi5pc0VtcHR5KFVpbnQ4QXJyYXkuZnJvbSgnJykpOyAvLz0+IHRydWVcbiAqL1xudmFyIGlzRW1wdHkgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MShmdW5jdGlvbiBpc0VtcHR5KHgpIHtcbiAgcmV0dXJuIHggIT0gbnVsbCAmJiBlcXVhbHMoeCwgZW1wdHkoeCkpO1xufSk7XG5leHBvcnQgZGVmYXVsdCBpc0VtcHR5OyIsImltcG9ydCBfY3VycnkxIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTEuanNcIjtcblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGlucHV0IHZhbHVlIGlzIGBudWxsYCBvciBgdW5kZWZpbmVkYC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC45LjBcbiAqIEBjYXRlZ29yeSBUeXBlXG4gKiBAc2lnICogLT4gQm9vbGVhblxuICogQHBhcmFtIHsqfSB4IFRoZSB2YWx1ZSB0byB0ZXN0LlxuICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIGB4YCBpcyBgdW5kZWZpbmVkYCBvciBgbnVsbGAsIG90aGVyd2lzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuaXNOaWwobnVsbCk7IC8vPT4gdHJ1ZVxuICogICAgICBSLmlzTmlsKHVuZGVmaW5lZCk7IC8vPT4gdHJ1ZVxuICogICAgICBSLmlzTmlsKDApOyAvLz0+IGZhbHNlXG4gKiAgICAgIFIuaXNOaWwoW10pOyAvLz0+IGZhbHNlXG4gKi9cbnZhciBpc05pbCA9IC8qI19fUFVSRV9fKi9fY3VycnkxKGZ1bmN0aW9uIGlzTmlsKHgpIHtcbiAgcmV0dXJuIHggPT0gbnVsbDtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgaXNOaWw7IiwiaW1wb3J0IGludm9rZXIgZnJvbSBcIi4vaW52b2tlci5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgYSBzdHJpbmcgbWFkZSBieSBpbnNlcnRpbmcgdGhlIGBzZXBhcmF0b3JgIGJldHdlZW4gZWFjaCBlbGVtZW50IGFuZFxuICogY29uY2F0ZW5hdGluZyBhbGwgdGhlIGVsZW1lbnRzIGludG8gYSBzaW5nbGUgc3RyaW5nLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgU3RyaW5nIC0+IFthXSAtPiBTdHJpbmdcbiAqIEBwYXJhbSB7TnVtYmVyfFN0cmluZ30gc2VwYXJhdG9yIFRoZSBzdHJpbmcgdXNlZCB0byBzZXBhcmF0ZSB0aGUgZWxlbWVudHMuXG4gKiBAcGFyYW0ge0FycmF5fSB4cyBUaGUgZWxlbWVudHMgdG8gam9pbiBpbnRvIGEgc3RyaW5nLlxuICogQHJldHVybiB7U3RyaW5nfSBzdHIgVGhlIHN0cmluZyBtYWRlIGJ5IGNvbmNhdGVuYXRpbmcgYHhzYCB3aXRoIGBzZXBhcmF0b3JgLlxuICogQHNlZSBSLnNwbGl0XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3Qgc3BhY2VyID0gUi5qb2luKCcgJyk7XG4gKiAgICAgIHNwYWNlcihbJ2EnLCAyLCAzLjRdKTsgICAvLz0+ICdhIDIgMy40J1xuICogICAgICBSLmpvaW4oJ3wnLCBbMSwgMiwgM10pOyAgICAvLz0+ICcxfDJ8MydcbiAqL1xudmFyIGpvaW4gPSAvKiNfX1BVUkVfXyovaW52b2tlcigxLCAnam9pbicpO1xuZXhwb3J0IGRlZmF1bHQgam9pbjsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5pbXBvcnQgY29udmVyZ2UgZnJvbSBcIi4vY29udmVyZ2UuanNcIjtcblxuLyoqXG4gKiBqdXh0IGFwcGxpZXMgYSBsaXN0IG9mIGZ1bmN0aW9ucyB0byBhIGxpc3Qgb2YgdmFsdWVzLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE5LjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyBbKGEsIGIsIC4uLiwgbSkgLT4gbl0gLT4gKChhLCBiLCAuLi4sIG0pIC0+IFtuXSlcbiAqIEBwYXJhbSB7QXJyYXl9IGZucyBBbiBhcnJheSBvZiBmdW5jdGlvbnNcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIGxpc3Qgb2YgdmFsdWVzIGFmdGVyIGFwcGx5aW5nIGVhY2ggb2YgdGhlIG9yaWdpbmFsIGBmbnNgIHRvIGl0cyBwYXJhbWV0ZXJzLlxuICogQHNlZSBSLmFwcGx5U3BlY1xuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IGdldFJhbmdlID0gUi5qdXh0KFtNYXRoLm1pbiwgTWF0aC5tYXhdKTtcbiAqICAgICAgZ2V0UmFuZ2UoMywgNCwgOSwgLTMpOyAvLz0+IFstMywgOV1cbiAqIEBzeW1iIFIuanV4dChbZiwgZywgaF0pKGEsIGIpID0gW2YoYSwgYiksIGcoYSwgYiksIGgoYSwgYildXG4gKi9cbnZhciBqdXh0ID0gLyojX19QVVJFX18qL19jdXJyeTEoZnVuY3Rpb24ganV4dChmbnMpIHtcbiAgcmV0dXJuIGNvbnZlcmdlKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTtcbiAgfSwgZm5zKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQganV4dDsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5pbXBvcnQgX2hhcyBmcm9tIFwiLi9pbnRlcm5hbC9faGFzLmpzXCI7XG5pbXBvcnQgX2lzQXJndW1lbnRzIGZyb20gXCIuL2ludGVybmFsL19pc0FyZ3VtZW50cy5qc1wiO1xuXG4vLyBjb3ZlciBJRSA8IDkga2V5cyBpc3N1ZXNcbnZhciBoYXNFbnVtQnVnID0gISAvKiNfX1BVUkVfXyove1xuICB0b1N0cmluZzogbnVsbFxufS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgndG9TdHJpbmcnKTtcbnZhciBub25FbnVtZXJhYmxlUHJvcHMgPSBbJ2NvbnN0cnVjdG9yJywgJ3ZhbHVlT2YnLCAnaXNQcm90b3R5cGVPZicsICd0b1N0cmluZycsICdwcm9wZXJ0eUlzRW51bWVyYWJsZScsICdoYXNPd25Qcm9wZXJ0eScsICd0b0xvY2FsZVN0cmluZyddO1xuLy8gU2FmYXJpIGJ1Z1xudmFyIGhhc0FyZ3NFbnVtQnVnID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIHJldHVybiBhcmd1bWVudHMucHJvcGVydHlJc0VudW1lcmFibGUoJ2xlbmd0aCcpO1xufSgpO1xudmFyIGNvbnRhaW5zID0gZnVuY3Rpb24gY29udGFpbnMobGlzdCwgaXRlbSkge1xuICB2YXIgaWR4ID0gMDtcbiAgd2hpbGUgKGlkeCA8IGxpc3QubGVuZ3RoKSB7XG4gICAgaWYgKGxpc3RbaWR4XSA9PT0gaXRlbSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlkeCArPSAxO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhIGxpc3QgY29udGFpbmluZyB0aGUgbmFtZXMgb2YgYWxsIHRoZSBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIG9mXG4gKiB0aGUgc3VwcGxpZWQgb2JqZWN0LlxuICogTm90ZSB0aGF0IHRoZSBvcmRlciBvZiB0aGUgb3V0cHV0IGFycmF5IGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIGNvbnNpc3RlbnRcbiAqIGFjcm9zcyBkaWZmZXJlbnQgSlMgcGxhdGZvcm1zLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyB7azogdn0gLT4gW2tdXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gZXh0cmFjdCBwcm9wZXJ0aWVzIGZyb21cbiAqIEByZXR1cm4ge0FycmF5fSBBbiBhcnJheSBvZiB0aGUgb2JqZWN0J3Mgb3duIHByb3BlcnRpZXMuXG4gKiBAc2VlIFIua2V5c0luLCBSLnZhbHVlcywgUi50b1BhaXJzXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5rZXlzKHthOiAxLCBiOiAyLCBjOiAzfSk7IC8vPT4gWydhJywgJ2InLCAnYyddXG4gKi9cbnZhciBrZXlzID0gdHlwZW9mIE9iamVjdC5rZXlzID09PSAnZnVuY3Rpb24nICYmICFoYXNBcmdzRW51bUJ1ZyA/IC8qI19fUFVSRV9fKi9fY3VycnkxKGZ1bmN0aW9uIGtleXMob2JqKSB7XG4gIHJldHVybiBPYmplY3Qob2JqKSAhPT0gb2JqID8gW10gOiBPYmplY3Qua2V5cyhvYmopO1xufSkgOiAvKiNfX1BVUkVfXyovX2N1cnJ5MShmdW5jdGlvbiBrZXlzKG9iaikge1xuICBpZiAoT2JqZWN0KG9iaikgIT09IG9iaikge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICB2YXIgcHJvcCwgbklkeDtcbiAgdmFyIGtzID0gW107XG4gIHZhciBjaGVja0FyZ3NMZW5ndGggPSBoYXNBcmdzRW51bUJ1ZyAmJiBfaXNBcmd1bWVudHMob2JqKTtcbiAgZm9yIChwcm9wIGluIG9iaikge1xuICAgIGlmIChfaGFzKHByb3AsIG9iaikgJiYgKCFjaGVja0FyZ3NMZW5ndGggfHwgcHJvcCAhPT0gJ2xlbmd0aCcpKSB7XG4gICAgICBrc1trcy5sZW5ndGhdID0gcHJvcDtcbiAgICB9XG4gIH1cbiAgaWYgKGhhc0VudW1CdWcpIHtcbiAgICBuSWR4ID0gbm9uRW51bWVyYWJsZVByb3BzLmxlbmd0aCAtIDE7XG4gICAgd2hpbGUgKG5JZHggPj0gMCkge1xuICAgICAgcHJvcCA9IG5vbkVudW1lcmFibGVQcm9wc1tuSWR4XTtcbiAgICAgIGlmIChfaGFzKHByb3AsIG9iaikgJiYgIWNvbnRhaW5zKGtzLCBwcm9wKSkge1xuICAgICAgICBrc1trcy5sZW5ndGhdID0gcHJvcDtcbiAgICAgIH1cbiAgICAgIG5JZHggLT0gMTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGtzO1xufSk7XG5leHBvcnQgZGVmYXVsdCBrZXlzOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBtYXAgZnJvbSBcIi4vbWFwLmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyBhIGxlbnMgZm9yIHRoZSBnaXZlbiBnZXR0ZXIgYW5kIHNldHRlciBmdW5jdGlvbnMuIFRoZSBnZXR0ZXIgXCJnZXRzXCJcbiAqIHRoZSB2YWx1ZSBvZiB0aGUgZm9jdXM7IHRoZSBzZXR0ZXIgXCJzZXRzXCIgdGhlIHZhbHVlIG9mIHRoZSBmb2N1cy4gVGhlIHNldHRlclxuICogc2hvdWxkIG5vdCBtdXRhdGUgdGhlIGRhdGEgc3RydWN0dXJlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjguMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHR5cGVkZWZuIExlbnMgcyBhID0gRnVuY3RvciBmID0+IChhIC0+IGYgYSkgLT4gcyAtPiBmIHNcbiAqIEBzaWcgKHMgLT4gYSkgLT4gKChhLCBzKSAtPiBzKSAtPiBMZW5zIHMgYVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZ2V0dGVyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZXR0ZXJcbiAqIEByZXR1cm4ge0xlbnN9XG4gKiBAc2VlIFIudmlldywgUi5zZXQsIFIub3ZlciwgUi5sZW5zSW5kZXgsIFIubGVuc1Byb3BcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCB4TGVucyA9IFIubGVucyhSLnByb3AoJ3gnKSwgUi5hc3NvYygneCcpKTtcbiAqXG4gKiAgICAgIFIudmlldyh4TGVucywge3g6IDEsIHk6IDJ9KTsgICAgICAgICAgICAvLz0+IDFcbiAqICAgICAgUi5zZXQoeExlbnMsIDQsIHt4OiAxLCB5OiAyfSk7ICAgICAgICAgIC8vPT4ge3g6IDQsIHk6IDJ9XG4gKiAgICAgIFIub3Zlcih4TGVucywgUi5uZWdhdGUsIHt4OiAxLCB5OiAyfSk7ICAvLz0+IHt4OiAtMSwgeTogMn1cbiAqL1xudmFyIGxlbnMgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiBsZW5zKGdldHRlciwgc2V0dGVyKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodG9GdW5jdG9yRm4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgcmV0dXJuIG1hcChmdW5jdGlvbiAoZm9jdXMpIHtcbiAgICAgICAgcmV0dXJuIHNldHRlcihmb2N1cywgdGFyZ2V0KTtcbiAgICAgIH0sIHRvRnVuY3RvckZuKGdldHRlcih0YXJnZXQpKSk7XG4gICAgfTtcbiAgfTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgbGVuczsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5pbXBvcnQgYXNzb2NQYXRoIGZyb20gXCIuL2Fzc29jUGF0aC5qc1wiO1xuaW1wb3J0IGxlbnMgZnJvbSBcIi4vbGVucy5qc1wiO1xuaW1wb3J0IF9wYXRoIGZyb20gXCIuL2ludGVybmFsL19wYXRoLmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyBhIGxlbnMgd2hvc2UgZm9jdXMgaXMgdGhlIHNwZWNpZmllZCBwYXRoLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE5LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEB0eXBlZGVmbiBJZHggPSBTdHJpbmcgfCBJbnQgfCBTeW1ib2xcbiAqIEB0eXBlZGVmbiBMZW5zIHMgYSA9IEZ1bmN0b3IgZiA9PiAoYSAtPiBmIGEpIC0+IHMgLT4gZiBzXG4gKiBAc2lnIFtJZHhdIC0+IExlbnMgcyBhXG4gKiBAcGFyYW0ge0FycmF5fSBwYXRoIFRoZSBwYXRoIHRvIHVzZS5cbiAqIEByZXR1cm4ge0xlbnN9XG4gKiBAc2VlIFIudmlldywgUi5zZXQsIFIub3ZlclxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IHhIZWFkWUxlbnMgPSBSLmxlbnNQYXRoKFsneCcsIDAsICd5J10pO1xuICpcbiAqICAgICAgUi52aWV3KHhIZWFkWUxlbnMsIHt4OiBbe3k6IDIsIHo6IDN9LCB7eTogNCwgejogNX1dfSk7XG4gKiAgICAgIC8vPT4gMlxuICogICAgICBSLnNldCh4SGVhZFlMZW5zLCAxLCB7eDogW3t5OiAyLCB6OiAzfSwge3k6IDQsIHo6IDV9XX0pO1xuICogICAgICAvLz0+IHt4OiBbe3k6IDEsIHo6IDN9LCB7eTogNCwgejogNX1dfVxuICogICAgICBSLm92ZXIoeEhlYWRZTGVucywgUi5uZWdhdGUsIHt4OiBbe3k6IDIsIHo6IDN9LCB7eTogNCwgejogNX1dfSk7XG4gKiAgICAgIC8vPT4ge3g6IFt7eTogLTIsIHo6IDN9LCB7eTogNCwgejogNX1dfVxuICovXG5cbnZhciBsZW5zUGF0aCA9IC8qI19fUFVSRV9fKi9fY3VycnkxKGZ1bmN0aW9uIGxlbnNQYXRoKHApIHtcbiAgcmV0dXJuIGxlbnMoZnVuY3Rpb24gKHZhbCkge1xuICAgIHJldHVybiBfcGF0aChwLCB2YWwpO1xuICB9LCBhc3NvY1BhdGgocCkpO1xufSk7XG5leHBvcnQgZGVmYXVsdCBsZW5zUGF0aDsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGxlc3MgdGhhbiB0aGUgc2Vjb25kOyBgZmFsc2VgXG4gKiBvdGhlcndpc2UuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgUmVsYXRpb25cbiAqIEBzaWcgT3JkIGEgPT4gYSAtPiBhIC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7Kn0gYVxuICogQHBhcmFtIHsqfSBiXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQHNlZSBSLmd0XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5sdCgyLCAxKTsgLy89PiBmYWxzZVxuICogICAgICBSLmx0KDIsIDIpOyAvLz0+IGZhbHNlXG4gKiAgICAgIFIubHQoMiwgMyk7IC8vPT4gdHJ1ZVxuICogICAgICBSLmx0KCdhJywgJ3onKTsgLy89PiB0cnVlXG4gKiAgICAgIFIubHQoJ3onLCAnYScpOyAvLz0+IGZhbHNlXG4gKi9cbnZhciBsdCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIGx0KGEsIGIpIHtcbiAgcmV0dXJuIGEgPCBiO1xufSk7XG5leHBvcnQgZGVmYXVsdCBsdDsiLCJpbXBvcnQgX2FycmF5UmVkdWNlIGZyb20gXCIuL2ludGVybmFsL19hcnJheVJlZHVjZS5qc1wiO1xuaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9kaXNwYXRjaGFibGUgZnJvbSBcIi4vaW50ZXJuYWwvX2Rpc3BhdGNoYWJsZS5qc1wiO1xuaW1wb3J0IF9tYXAgZnJvbSBcIi4vaW50ZXJuYWwvX21hcC5qc1wiO1xuaW1wb3J0IF94bWFwIGZyb20gXCIuL2ludGVybmFsL194bWFwLmpzXCI7XG5pbXBvcnQgY3VycnlOIGZyb20gXCIuL2N1cnJ5Ti5qc1wiO1xuaW1wb3J0IGtleXMgZnJvbSBcIi4va2V5cy5qc1wiO1xuXG4vKipcbiAqIFRha2VzIGEgZnVuY3Rpb24gYW5kXG4gKiBhIFtmdW5jdG9yXShodHRwczovL2dpdGh1Yi5jb20vZmFudGFzeWxhbmQvZmFudGFzeS1sYW5kI2Z1bmN0b3IpLFxuICogYXBwbGllcyB0aGUgZnVuY3Rpb24gdG8gZWFjaCBvZiB0aGUgZnVuY3RvcidzIHZhbHVlcywgYW5kIHJldHVybnNcbiAqIGEgZnVuY3RvciBvZiB0aGUgc2FtZSBzaGFwZS5cbiAqXG4gKiBSYW1kYSBwcm92aWRlcyBzdWl0YWJsZSBgbWFwYCBpbXBsZW1lbnRhdGlvbnMgZm9yIGBBcnJheWAgYW5kIGBPYmplY3RgLFxuICogc28gdGhpcyBmdW5jdGlvbiBtYXkgYmUgYXBwbGllZCB0byBgWzEsIDIsIDNdYCBvciBge3g6IDEsIHk6IDIsIHo6IDN9YC5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgbWFwYCBtZXRob2Qgb2YgdGhlIHNlY29uZCBhcmd1bWVudCwgaWYgcHJlc2VudC5cbiAqXG4gKiBBY3RzIGFzIGEgdHJhbnNkdWNlciBpZiBhIHRyYW5zZm9ybWVyIGlzIGdpdmVuIGluIGxpc3QgcG9zaXRpb24uXG4gKlxuICogQWxzbyB0cmVhdHMgZnVuY3Rpb25zIGFzIGZ1bmN0b3JzIGFuZCB3aWxsIGNvbXBvc2UgdGhlbSB0b2dldGhlci5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIEZ1bmN0b3IgZiA9PiAoYSAtPiBiKSAtPiBmIGEgLT4gZiBiXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uIGV2ZXJ5IGVsZW1lbnQgb2YgdGhlIGlucHV0IGBsaXN0YC5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGxpc3QgdG8gYmUgaXRlcmF0ZWQgb3Zlci5cbiAqIEByZXR1cm4ge0FycmF5fSBUaGUgbmV3IGxpc3QuXG4gKiBAc2VlIFIudHJhbnNkdWNlLCBSLmFkZEluZGV4LCBSLnBsdWNrLCBSLnByb2plY3RcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBkb3VibGUgPSB4ID0+IHggKiAyO1xuICpcbiAqICAgICAgUi5tYXAoZG91YmxlLCBbMSwgMiwgM10pOyAvLz0+IFsyLCA0LCA2XVxuICpcbiAqICAgICAgUi5tYXAoZG91YmxlLCB7eDogMSwgeTogMiwgejogM30pOyAvLz0+IHt4OiAyLCB5OiA0LCB6OiA2fVxuICogQHN5bWIgUi5tYXAoZiwgW2EsIGJdKSA9IFtmKGEpLCBmKGIpXVxuICogQHN5bWIgUi5tYXAoZiwgeyB4OiBhLCB5OiBiIH0pID0geyB4OiBmKGEpLCB5OiBmKGIpIH1cbiAqIEBzeW1iIFIubWFwKGYsIGZ1bmN0b3JfbykgPSBmdW5jdG9yX28ubWFwKGYpXG4gKi9cbnZhciBtYXAgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MiggLyojX19QVVJFX18qL19kaXNwYXRjaGFibGUoWydmYW50YXN5LWxhbmQvbWFwJywgJ21hcCddLCBfeG1hcCwgZnVuY3Rpb24gbWFwKGZuLCBmdW5jdG9yKSB7XG4gIHN3aXRjaCAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGZ1bmN0b3IpKSB7XG4gICAgY2FzZSAnW29iamVjdCBGdW5jdGlvbl0nOlxuICAgICAgcmV0dXJuIGN1cnJ5TihmdW5jdG9yLmxlbmd0aCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZm4uY2FsbCh0aGlzLCBmdW5jdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICAgICAgfSk7XG4gICAgY2FzZSAnW29iamVjdCBPYmplY3RdJzpcbiAgICAgIHJldHVybiBfYXJyYXlSZWR1Y2UoZnVuY3Rpb24gKGFjYywga2V5KSB7XG4gICAgICAgIGFjY1trZXldID0gZm4oZnVuY3RvcltrZXldKTtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sIHt9LCBrZXlzKGZ1bmN0b3IpKTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIF9tYXAoZm4sIGZ1bmN0b3IpO1xuICB9XG59KSk7XG5leHBvcnQgZGVmYXVsdCBtYXA7IiwiaW1wb3J0IF9hcnJheVJlZHVjZSBmcm9tIFwiLi9pbnRlcm5hbC9fYXJyYXlSZWR1Y2UuanNcIjtcbmltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBrZXlzIGZyb20gXCIuL2tleXMuanNcIjtcblxuLyoqXG4gKiBBbiBPYmplY3Qtc3BlY2lmaWMgdmVyc2lvbiBvZiBbYG1hcGBdKCNtYXApLiBUaGUgZnVuY3Rpb24gaXMgYXBwbGllZCB0byB0aHJlZVxuICogYXJndW1lbnRzOiAqKHZhbHVlLCBrZXksIG9iaikqLiBJZiBvbmx5IHRoZSB2YWx1ZSBpcyBzaWduaWZpY2FudCwgdXNlXG4gKiBbYG1hcGBdKCNtYXApIGluc3RlYWQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuOS4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnICgoKiwgU3RyaW5nLCBPYmplY3QpIC0+ICopIC0+IE9iamVjdCAtPiBPYmplY3RcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAc2VlIFIubWFwXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgeHl6ID0geyB4OiAxLCB5OiAyLCB6OiAzIH07XG4gKiAgICAgIGNvbnN0IHByZXBlbmRLZXlBbmREb3VibGUgPSAobnVtLCBrZXksIG9iaikgPT4ga2V5ICsgKG51bSAqIDIpO1xuICpcbiAqICAgICAgUi5tYXBPYmpJbmRleGVkKHByZXBlbmRLZXlBbmREb3VibGUsIHh5eik7IC8vPT4geyB4OiAneDInLCB5OiAneTQnLCB6OiAnejYnIH1cbiAqL1xudmFyIG1hcE9iakluZGV4ZWQgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiBtYXBPYmpJbmRleGVkKGZuLCBvYmopIHtcbiAgcmV0dXJuIF9hcnJheVJlZHVjZShmdW5jdGlvbiAoYWNjLCBrZXkpIHtcbiAgICBhY2Nba2V5XSA9IGZuKG9ialtrZXldLCBrZXksIG9iaik7XG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30sIGtleXMob2JqKSk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IG1hcE9iakluZGV4ZWQ7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IHRvU3RyaW5nIGZyb20gXCIuL3RvU3RyaW5nLmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbGFyZ2VyIG9mIGl0cyB0d28gYXJndW1lbnRzLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IFJlbGF0aW9uXG4gKiBAc2lnIE9yZCBhID0+IGEgLT4gYSAtPiBhXG4gKiBAcGFyYW0geyp9IGFcbiAqIEBwYXJhbSB7Kn0gYlxuICogQHJldHVybiB7Kn1cbiAqIEBzZWUgUi5tYXhCeSwgUi5taW5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLm1heCg3ODksIDEyMyk7IC8vPT4gNzg5XG4gKiAgICAgIFIubWF4KCdhJywgJ2InKTsgLy89PiAnYidcbiAqL1xudmFyIG1heCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIG1heChhLCBiKSB7XG4gIGlmIChhID09PSBiKSB7XG4gICAgcmV0dXJuIGI7XG4gIH1cbiAgZnVuY3Rpb24gc2FmZU1heCh4LCB5KSB7XG4gICAgaWYgKHggPiB5ICE9PSB5ID4geCkge1xuICAgICAgcmV0dXJuIHkgPiB4ID8geSA6IHg7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgdmFyIG1heEJ5VmFsdWUgPSBzYWZlTWF4KGEsIGIpO1xuICBpZiAobWF4QnlWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG1heEJ5VmFsdWU7XG4gIH1cbiAgdmFyIG1heEJ5VHlwZSA9IHNhZmVNYXgodHlwZW9mIGEsIHR5cGVvZiBiKTtcbiAgaWYgKG1heEJ5VHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG1heEJ5VHlwZSA9PT0gdHlwZW9mIGEgPyBhIDogYjtcbiAgfVxuICB2YXIgc3RyaW5nQSA9IHRvU3RyaW5nKGEpO1xuICB2YXIgbWF4QnlTdHJpbmdWYWx1ZSA9IHNhZmVNYXgoc3RyaW5nQSwgdG9TdHJpbmcoYikpO1xuICBpZiAobWF4QnlTdHJpbmdWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG1heEJ5U3RyaW5nVmFsdWUgPT09IHN0cmluZ0EgPyBhIDogYjtcbiAgfVxuICByZXR1cm4gYjtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgbWF4OyIsImltcG9ydCBfYXJpdHkgZnJvbSBcIi4vaW50ZXJuYWwvX2FyaXR5LmpzXCI7XG5pbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX2hhcyBmcm9tIFwiLi9pbnRlcm5hbC9faGFzLmpzXCI7XG5cbi8qKlxuICogVGFrZXMgYSBzdHJpbmctcmV0dXJuaW5nIGZ1bmN0aW9uIGBrZXlHZW5gIGFuZCBhIGZ1bmN0aW9uIGBmbmAgYW5kIHJldHVybnNcbiAqIGEgbmV3IGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBjYWNoZWQgcmVzdWx0cyBmb3Igc3Vic2VxdWVudFxuICogY2FsbHMgd2l0aCB0aGUgc2FtZSBhcmd1bWVudHMuXG4gKlxuICogV2hlbiB0aGUgZnVuY3Rpb24gaXMgaW52b2tlZCwgYGtleUdlbmAgaXMgYXBwbGllZCB0byB0aGUgc2FtZSBhcmd1bWVudHNcbiAqIGFuZCBpdHMgcmVzdWx0IGJlY29tZXMgdGhlIGNhY2hlIGtleS4gSWYgdGhlIGNhY2hlIGNvbnRhaW5zIHNvbWV0aGluZ1xuICogdW5kZXIgdGhhdCBrZXksIHRoZSBmdW5jdGlvbiBzaW1wbHkgcmV0dXJucyBpdCBhbmQgZG9lcyBub3QgaW52b2tlIGBmbmAgYXQgYWxsLlxuICpcbiAqIE90aGVyd2lzZSBgZm5gIGlzIGFwcGxpZWQgdG8gdGhlIHNhbWUgYXJndW1lbnRzIGFuZCBpdHMgcmV0dXJuIHZhbHVlXG4gKiBpcyBjYWNoZWQgdW5kZXIgdGhhdCBrZXkgYW5kIHJldHVybmVkIGJ5IHRoZSBmdW5jdGlvbi5cbiAqXG4gKiBDYXJlIG11c3QgYmUgdGFrZW4gd2hlbiBpbXBsZW1lbnRpbmcgYGtleUdlbmAgdG8gYXZvaWQga2V5IGNvbGxpc2lvbixcbiAqIG9yIGlmIHRyYWNraW5nIHJlZmVyZW5jZXMsIG1lbW9yeSBsZWFrcyBhbmQgbXV0YXRpbmcgYXJndW1lbnRzLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjI0LjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyAoKi4uLiAtPiBTdHJpbmcpIC0+ICgqLi4uIC0+IGEpIC0+ICgqLi4uIC0+IGEpXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlHZW4gVGhlIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIHRoZSBjYWNoZSBrZXkuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gbWVtb2l6ZS5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBNZW1vaXplZCB2ZXJzaW9uIG9mIGBmbmAuXG4gKiBAZXhhbXBsZVxuICogICAgICBjb25zdCB3aXRoQWdlID0gbWVtb2l6ZVdpdGgobyA9PiBgJHtvLmJpcnRofS8ke28uZGVhdGh9YCwgKHtiaXJ0aCwgZGVhdGh9KSA9PiB7XG4gKiAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eICBeXl5eXl5eXl5eXl5eXl5eXl5eXl5cbiAqICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgIGtleUdlbiAgICAgICAgICAgICAgICAgICAgICAgIGZuXG4gKiAgICAgICAgY29uc29sZS5sb2coYGNvbXB1dGluZyBhZ2UgZm9yICR7YmlydGh9LyR7ZGVhdGh9YCk7XG4gKiAgICAgICAgcmV0dXJuICh7YmlydGgsIGRlYXRoLCBhZ2U6IGRlYXRoIC0gYmlydGh9KTtcbiAqICAgICAgfSk7XG4gKlxuICogICAgICB3aXRoQWdlKHtiaXJ0aDogMTkyMSwgZGVhdGg6IDE5OTl9KTtcbiAqICAgICAgLy89PiBMT0c6IGNvbXB1dGluZyBhZ2UgZm9yIDE5MjEvMTk5OVxuICogICAgICAvLz0+IHtiaXJ0aDogMTkyMSwgZGVhdGg6IDE5OTksIGFnZTogNzh9IChyZXR1cm5lZCBmcm9tIGZuKVxuICpcbiAqICAgICAgd2l0aEFnZSh7YmlydGg6IDE5MjEsIGRlYXRoOiAxOTk5fSk7XG4gKiAgICAgIC8vPT4ge2JpcnRoOiAxOTIxLCBkZWF0aDogMTk5OSwgYWdlOiA3OH0gKHJldHVybmVkIGZyb20gY2FjaGUpXG4gKi9cbnZhciBtZW1vaXplV2l0aCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIG1lbW9pemVXaXRoKGtleUdlbiwgZm4pIHtcbiAgdmFyIGNhY2hlID0ge307XG4gIHJldHVybiBfYXJpdHkoZm4ubGVuZ3RoLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGtleSA9IGtleUdlbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmICghX2hhcyhrZXksIGNhY2hlKSkge1xuICAgICAgY2FjaGVba2V5XSA9IGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuICAgIHJldHVybiBjYWNoZVtrZXldO1xuICB9KTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgbWVtb2l6ZVdpdGg7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IG1lcmdlRGVlcFdpdGhLZXkgZnJvbSBcIi4vbWVyZ2VEZWVwV2l0aEtleS5qc1wiO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgb2JqZWN0IHdpdGggdGhlIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBmaXJzdCBvYmplY3QgbWVyZ2VkIHdpdGhcbiAqIHRoZSBvd24gcHJvcGVydGllcyBvZiB0aGUgc2Vjb25kIG9iamVjdC4gSWYgYSBrZXkgZXhpc3RzIGluIGJvdGggb2JqZWN0czpcbiAqIC0gYW5kIGJvdGggdmFsdWVzIGFyZSBvYmplY3RzLCB0aGUgdHdvIHZhbHVlcyB3aWxsIGJlIHJlY3Vyc2l2ZWx5IG1lcmdlZFxuICogLSBvdGhlcndpc2UgdGhlIHZhbHVlIGZyb20gdGhlIHNlY29uZCBvYmplY3Qgd2lsbCBiZSB1c2VkLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjI0LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcge2F9IC0+IHthfSAtPiB7YX1cbiAqIEBwYXJhbSB7T2JqZWN0fSBsT2JqXG4gKiBAcGFyYW0ge09iamVjdH0gck9ialxuICogQHJldHVybiB7T2JqZWN0fVxuICogQHNlZSBSLm1lcmdlLCBSLm1lcmdlRGVlcExlZnQsIFIubWVyZ2VEZWVwV2l0aCwgUi5tZXJnZURlZXBXaXRoS2V5XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5tZXJnZURlZXBSaWdodCh7IG5hbWU6ICdmcmVkJywgYWdlOiAxMCwgY29udGFjdDogeyBlbWFpbDogJ21vb0BleGFtcGxlLmNvbScgfX0sXG4gKiAgICAgICAgICAgICAgICAgICAgICAgeyBhZ2U6IDQwLCBjb250YWN0OiB7IGVtYWlsOiAnYmFhQGV4YW1wbGUuY29tJyB9fSk7XG4gKiAgICAgIC8vPT4geyBuYW1lOiAnZnJlZCcsIGFnZTogNDAsIGNvbnRhY3Q6IHsgZW1haWw6ICdiYWFAZXhhbXBsZS5jb20nIH19XG4gKi9cbnZhciBtZXJnZURlZXBSaWdodCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIG1lcmdlRGVlcFJpZ2h0KGxPYmosIHJPYmopIHtcbiAgcmV0dXJuIG1lcmdlRGVlcFdpdGhLZXkoZnVuY3Rpb24gKGssIGxWYWwsIHJWYWwpIHtcbiAgICByZXR1cm4gclZhbDtcbiAgfSwgbE9iaiwgck9iaik7XG59KTtcbmV4cG9ydCBkZWZhdWx0IG1lcmdlRGVlcFJpZ2h0OyIsImltcG9ydCBfY3VycnkzIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTMuanNcIjtcbmltcG9ydCBfaXNPYmplY3QgZnJvbSBcIi4vaW50ZXJuYWwvX2lzT2JqZWN0LmpzXCI7XG5pbXBvcnQgbWVyZ2VXaXRoS2V5IGZyb20gXCIuL21lcmdlV2l0aEtleS5qc1wiO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgb2JqZWN0IHdpdGggdGhlIG93biBwcm9wZXJ0aWVzIG9mIHRoZSB0d28gcHJvdmlkZWQgb2JqZWN0cy5cbiAqIElmIGEga2V5IGV4aXN0cyBpbiBib3RoIG9iamVjdHM6XG4gKiAtIGFuZCBib3RoIGFzc29jaWF0ZWQgdmFsdWVzIGFyZSBhbHNvIG9iamVjdHMgdGhlbiB0aGUgdmFsdWVzIHdpbGwgYmVcbiAqICAgcmVjdXJzaXZlbHkgbWVyZ2VkLlxuICogLSBvdGhlcndpc2UgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIGlzIGFwcGxpZWQgdG8gdGhlIGtleSBhbmQgYXNzb2NpYXRlZCB2YWx1ZXNcbiAqICAgdXNpbmcgdGhlIHJlc3VsdGluZyB2YWx1ZSBhcyB0aGUgbmV3IHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5LlxuICogSWYgYSBrZXkgb25seSBleGlzdHMgaW4gb25lIG9iamVjdCwgdGhlIHZhbHVlIHdpbGwgYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXlcbiAqIG9mIHRoZSByZXN1bHRpbmcgb2JqZWN0LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjI0LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcgKChTdHJpbmcsIGEsIGEpIC0+IGEpIC0+IHthfSAtPiB7YX0gLT4ge2F9XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHBhcmFtIHtPYmplY3R9IGxPYmpcbiAqIEBwYXJhbSB7T2JqZWN0fSByT2JqXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAc2VlIFIubWVyZ2VXaXRoS2V5LCBSLm1lcmdlRGVlcFdpdGhcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBsZXQgY29uY2F0VmFsdWVzID0gKGssIGwsIHIpID0+IGsgPT0gJ3ZhbHVlcycgPyBSLmNvbmNhdChsLCByKSA6IHJcbiAqICAgICAgUi5tZXJnZURlZXBXaXRoS2V5KGNvbmNhdFZhbHVlcyxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgIHsgYTogdHJ1ZSwgYzogeyB0aGluZzogJ2ZvbycsIHZhbHVlczogWzEwLCAyMF0gfX0sXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICB7IGI6IHRydWUsIGM6IHsgdGhpbmc6ICdiYXInLCB2YWx1ZXM6IFsxNSwgMzVdIH19KTtcbiAqICAgICAgLy89PiB7IGE6IHRydWUsIGI6IHRydWUsIGM6IHsgdGhpbmc6ICdiYXInLCB2YWx1ZXM6IFsxMCwgMjAsIDE1LCAzNV0gfX1cbiAqL1xudmFyIG1lcmdlRGVlcFdpdGhLZXkgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MyhmdW5jdGlvbiBtZXJnZURlZXBXaXRoS2V5KGZuLCBsT2JqLCByT2JqKSB7XG4gIHJldHVybiBtZXJnZVdpdGhLZXkoZnVuY3Rpb24gKGssIGxWYWwsIHJWYWwpIHtcbiAgICBpZiAoX2lzT2JqZWN0KGxWYWwpICYmIF9pc09iamVjdChyVmFsKSkge1xuICAgICAgcmV0dXJuIG1lcmdlRGVlcFdpdGhLZXkoZm4sIGxWYWwsIHJWYWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZm4oaywgbFZhbCwgclZhbCk7XG4gICAgfVxuICB9LCBsT2JqLCByT2JqKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgbWVyZ2VEZWVwV2l0aEtleTsiLCJpbXBvcnQgX29iamVjdEFzc2lnbiBmcm9tIFwiLi9pbnRlcm5hbC9fb2JqZWN0QXNzaWduLmpzXCI7XG5pbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5cbi8qKlxuICogQ3JlYXRlIGEgbmV3IG9iamVjdCB3aXRoIHRoZSBvd24gcHJvcGVydGllcyBvZiB0aGUgZmlyc3Qgb2JqZWN0IG1lcmdlZCB3aXRoXG4gKiB0aGUgb3duIHByb3BlcnRpZXMgb2YgdGhlIHNlY29uZCBvYmplY3QuIElmIGEga2V5IGV4aXN0cyBpbiBib3RoIG9iamVjdHMsXG4gKiB0aGUgdmFsdWUgZnJvbSB0aGUgZmlyc3Qgb2JqZWN0IHdpbGwgYmUgdXNlZC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4yNi4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnIHtrOiB2fSAtPiB7azogdn0gLT4ge2s6IHZ9XG4gKiBAcGFyYW0ge09iamVjdH0gbFxuICogQHBhcmFtIHtPYmplY3R9IHJcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBzZWUgUi5tZXJnZVJpZ2h0LCBSLm1lcmdlRGVlcExlZnQsIFIubWVyZ2VXaXRoLCBSLm1lcmdlV2l0aEtleVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIubWVyZ2VMZWZ0KHsgJ2FnZSc6IDQwIH0sIHsgJ25hbWUnOiAnZnJlZCcsICdhZ2UnOiAxMCB9KTtcbiAqICAgICAgLy89PiB7ICduYW1lJzogJ2ZyZWQnLCAnYWdlJzogNDAgfVxuICpcbiAqICAgICAgY29uc3QgcmVzZXRUb0RlZmF1bHQgPSBSLm1lcmdlTGVmdCh7eDogMH0pO1xuICogICAgICByZXNldFRvRGVmYXVsdCh7eDogNSwgeTogMn0pOyAvLz0+IHt4OiAwLCB5OiAyfVxuICogQHN5bWIgUi5tZXJnZUxlZnQoYSwgYikgPSB7Li4uYiwgLi4uYX1cbiAqL1xudmFyIG1lcmdlTGVmdCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIG1lcmdlTGVmdChsLCByKSB7XG4gIHJldHVybiBfb2JqZWN0QXNzaWduKHt9LCByLCBsKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgbWVyZ2VMZWZ0OyIsImltcG9ydCBfb2JqZWN0QXNzaWduIGZyb20gXCIuL2ludGVybmFsL19vYmplY3RBc3NpZ24uanNcIjtcbmltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcblxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgb2JqZWN0IHdpdGggdGhlIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBmaXJzdCBvYmplY3QgbWVyZ2VkIHdpdGhcbiAqIHRoZSBvd24gcHJvcGVydGllcyBvZiB0aGUgc2Vjb25kIG9iamVjdC4gSWYgYSBrZXkgZXhpc3RzIGluIGJvdGggb2JqZWN0cyxcbiAqIHRoZSB2YWx1ZSBmcm9tIHRoZSBzZWNvbmQgb2JqZWN0IHdpbGwgYmUgdXNlZC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4yNi4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnIHtrOiB2fSAtPiB7azogdn0gLT4ge2s6IHZ9XG4gKiBAcGFyYW0ge09iamVjdH0gbFxuICogQHBhcmFtIHtPYmplY3R9IHJcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBzZWUgUi5tZXJnZUxlZnQsIFIubWVyZ2VEZWVwUmlnaHQsIFIubWVyZ2VXaXRoLCBSLm1lcmdlV2l0aEtleVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIubWVyZ2VSaWdodCh7ICduYW1lJzogJ2ZyZWQnLCAnYWdlJzogMTAgfSwgeyAnYWdlJzogNDAgfSk7XG4gKiAgICAgIC8vPT4geyAnbmFtZSc6ICdmcmVkJywgJ2FnZSc6IDQwIH1cbiAqXG4gKiAgICAgIGNvbnN0IHdpdGhEZWZhdWx0cyA9IFIubWVyZ2VSaWdodCh7eDogMCwgeTogMH0pO1xuICogICAgICB3aXRoRGVmYXVsdHMoe3k6IDJ9KTsgLy89PiB7eDogMCwgeTogMn1cbiAqIEBzeW1iIFIubWVyZ2VSaWdodChhLCBiKSA9IHsuLi5hLCAuLi5ifVxuICovXG52YXIgbWVyZ2VSaWdodCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIG1lcmdlUmlnaHQobCwgcikge1xuICByZXR1cm4gX29iamVjdEFzc2lnbih7fSwgbCwgcik7XG59KTtcbmV4cG9ydCBkZWZhdWx0IG1lcmdlUmlnaHQ7IiwiaW1wb3J0IF9jdXJyeTMgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5My5qc1wiO1xuaW1wb3J0IG1lcmdlV2l0aEtleSBmcm9tIFwiLi9tZXJnZVdpdGhLZXkuanNcIjtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IG9iamVjdCB3aXRoIHRoZSBvd24gcHJvcGVydGllcyBvZiB0aGUgdHdvIHByb3ZpZGVkIG9iamVjdHMuIElmXG4gKiBhIGtleSBleGlzdHMgaW4gYm90aCBvYmplY3RzLCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gaXMgYXBwbGllZCB0byB0aGUgdmFsdWVzXG4gKiBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSBpbiBlYWNoIG9iamVjdCwgd2l0aCB0aGUgcmVzdWx0IGJlaW5nIHVzZWQgYXMgdGhlXG4gKiB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSBpbiB0aGUgcmV0dXJuZWQgb2JqZWN0LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE5LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcgKChhLCBhKSAtPiBhKSAtPiB7YX0gLT4ge2F9IC0+IHthfVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEBwYXJhbSB7T2JqZWN0fSBsXG4gKiBAcGFyYW0ge09iamVjdH0gclxuICogQHJldHVybiB7T2JqZWN0fVxuICogQHNlZSBSLm1lcmdlRGVlcFdpdGgsIFIubWVyZ2UsIFIubWVyZ2VXaXRoS2V5XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5tZXJnZVdpdGgoUi5jb25jYXQsXG4gKiAgICAgICAgICAgICAgICAgIHsgYTogdHJ1ZSwgdmFsdWVzOiBbMTAsIDIwXSB9LFxuICogICAgICAgICAgICAgICAgICB7IGI6IHRydWUsIHZhbHVlczogWzE1LCAzNV0gfSk7XG4gKiAgICAgIC8vPT4geyBhOiB0cnVlLCBiOiB0cnVlLCB2YWx1ZXM6IFsxMCwgMjAsIDE1LCAzNV0gfVxuICovXG52YXIgbWVyZ2VXaXRoID0gLyojX19QVVJFX18qL19jdXJyeTMoZnVuY3Rpb24gbWVyZ2VXaXRoKGZuLCBsLCByKSB7XG4gIHJldHVybiBtZXJnZVdpdGhLZXkoZnVuY3Rpb24gKF8sIF9sLCBfcikge1xuICAgIHJldHVybiBmbihfbCwgX3IpO1xuICB9LCBsLCByKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgbWVyZ2VXaXRoOyIsImltcG9ydCBfY3VycnkzIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTMuanNcIjtcbmltcG9ydCBfaGFzIGZyb20gXCIuL2ludGVybmFsL19oYXMuanNcIjtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IG9iamVjdCB3aXRoIHRoZSBvd24gcHJvcGVydGllcyBvZiB0aGUgdHdvIHByb3ZpZGVkIG9iamVjdHMuIElmXG4gKiBhIGtleSBleGlzdHMgaW4gYm90aCBvYmplY3RzLCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gaXMgYXBwbGllZCB0byB0aGUga2V5XG4gKiBhbmQgdGhlIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSBpbiBlYWNoIG9iamVjdCwgd2l0aCB0aGUgcmVzdWx0IGJlaW5nXG4gKiB1c2VkIGFzIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSBpbiB0aGUgcmV0dXJuZWQgb2JqZWN0LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE5LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcgKChTdHJpbmcsIGEsIGEpIC0+IGEpIC0+IHthfSAtPiB7YX0gLT4ge2F9XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHBhcmFtIHtPYmplY3R9IGxcbiAqIEBwYXJhbSB7T2JqZWN0fSByXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAc2VlIFIubWVyZ2VEZWVwV2l0aEtleSwgUi5tZXJnZSwgUi5tZXJnZVdpdGhcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBsZXQgY29uY2F0VmFsdWVzID0gKGssIGwsIHIpID0+IGsgPT0gJ3ZhbHVlcycgPyBSLmNvbmNhdChsLCByKSA6IHJcbiAqICAgICAgUi5tZXJnZVdpdGhLZXkoY29uY2F0VmFsdWVzLFxuICogICAgICAgICAgICAgICAgICAgICB7IGE6IHRydWUsIHRoaW5nOiAnZm9vJywgdmFsdWVzOiBbMTAsIDIwXSB9LFxuICogICAgICAgICAgICAgICAgICAgICB7IGI6IHRydWUsIHRoaW5nOiAnYmFyJywgdmFsdWVzOiBbMTUsIDM1XSB9KTtcbiAqICAgICAgLy89PiB7IGE6IHRydWUsIGI6IHRydWUsIHRoaW5nOiAnYmFyJywgdmFsdWVzOiBbMTAsIDIwLCAxNSwgMzVdIH1cbiAqIEBzeW1iIFIubWVyZ2VXaXRoS2V5KGYsIHsgeDogMSwgeTogMiB9LCB7IHk6IDUsIHo6IDMgfSkgPSB7IHg6IDEsIHk6IGYoJ3knLCAyLCA1KSwgejogMyB9XG4gKi9cbnZhciBtZXJnZVdpdGhLZXkgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MyhmdW5jdGlvbiBtZXJnZVdpdGhLZXkoZm4sIGwsIHIpIHtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICB2YXIgaztcbiAgbCA9IGwgfHwge307XG4gIHIgPSByIHx8IHt9O1xuICBmb3IgKGsgaW4gbCkge1xuICAgIGlmIChfaGFzKGssIGwpKSB7XG4gICAgICByZXN1bHRba10gPSBfaGFzKGssIHIpID8gZm4oaywgbFtrXSwgcltrXSkgOiBsW2tdO1xuICAgIH1cbiAgfVxuICBmb3IgKGsgaW4gcikge1xuICAgIGlmIChfaGFzKGssIHIpICYmICFfaGFzKGssIHJlc3VsdCkpIHtcbiAgICAgIHJlc3VsdFtrXSA9IHJba107XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59KTtcbmV4cG9ydCBkZWZhdWx0IG1lcmdlV2l0aEtleTsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyBhIHBhcnRpYWwgY29weSBvZiBhbiBvYmplY3Qgb21pdHRpbmcgdGhlIGtleXMgc3BlY2lmaWVkLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyBbU3RyaW5nXSAtPiB7U3RyaW5nOiAqfSAtPiB7U3RyaW5nOiAqfVxuICogQHBhcmFtIHtBcnJheX0gbmFtZXMgYW4gYXJyYXkgb2YgU3RyaW5nIHByb3BlcnR5IG5hbWVzIHRvIG9taXQgZnJvbSB0aGUgbmV3IG9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIGNvcHkgZnJvbVxuICogQHJldHVybiB7T2JqZWN0fSBBIG5ldyBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIGZyb20gYG5hbWVzYCBub3Qgb24gaXQuXG4gKiBAc2VlIFIucGlja1xuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIub21pdChbJ2EnLCAnZCddLCB7YTogMSwgYjogMiwgYzogMywgZDogNH0pOyAvLz0+IHtiOiAyLCBjOiAzfVxuICovXG52YXIgb21pdCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIG9taXQobmFtZXMsIG9iaikge1xuICB2YXIgcmVzdWx0ID0ge307XG4gIHZhciBpbmRleCA9IHt9O1xuICB2YXIgaWR4ID0gMDtcbiAgdmFyIGxlbiA9IG5hbWVzLmxlbmd0aDtcbiAgd2hpbGUgKGlkeCA8IGxlbikge1xuICAgIGluZGV4W25hbWVzW2lkeF1dID0gMTtcbiAgICBpZHggKz0gMTtcbiAgfVxuICBmb3IgKHZhciBwcm9wIGluIG9iaikge1xuICAgIGlmICghaW5kZXguaGFzT3duUHJvcGVydHkocHJvcCkpIHtcbiAgICAgIHJlc3VsdFtwcm9wXSA9IG9ialtwcm9wXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgb21pdDsiLCJpbXBvcnQgX2FyaXR5IGZyb20gXCIuL2ludGVybmFsL19hcml0eS5qc1wiO1xuaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5MS5qc1wiO1xuXG4vKipcbiAqIEFjY2VwdHMgYSBmdW5jdGlvbiBgZm5gIGFuZCByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBndWFyZHMgaW52b2NhdGlvbiBvZlxuICogYGZuYCBzdWNoIHRoYXQgYGZuYCBjYW4gb25seSBldmVyIGJlIGNhbGxlZCBvbmNlLCBubyBtYXR0ZXIgaG93IG1hbnkgdGltZXNcbiAqIHRoZSByZXR1cm5lZCBmdW5jdGlvbiBpcyBpbnZva2VkLiBUaGUgZmlyc3QgdmFsdWUgY2FsY3VsYXRlZCBpcyByZXR1cm5lZCBpblxuICogc3Vic2VxdWVudCBpbnZvY2F0aW9ucy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyAoYS4uLiAtPiBiKSAtPiAoYS4uLiAtPiBiKVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIHdyYXAgaW4gYSBjYWxsLW9ubHktb25jZSB3cmFwcGVyLlxuICogQHJldHVybiB7RnVuY3Rpb259IFRoZSB3cmFwcGVkIGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IGFkZE9uZU9uY2UgPSBSLm9uY2UoeCA9PiB4ICsgMSk7XG4gKiAgICAgIGFkZE9uZU9uY2UoMTApOyAvLz0+IDExXG4gKiAgICAgIGFkZE9uZU9uY2UoYWRkT25lT25jZSg1MCkpOyAvLz0+IDExXG4gKi9cbnZhciBvbmNlID0gLyojX19QVVJFX18qL19jdXJyeTEoZnVuY3Rpb24gb25jZShmbikge1xuICB2YXIgY2FsbGVkID0gZmFsc2U7XG4gIHZhciByZXN1bHQ7XG4gIHJldHVybiBfYXJpdHkoZm4ubGVuZ3RoLCBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGNhbGxlZCkge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgY2FsbGVkID0gdHJ1ZTtcbiAgICByZXN1bHQgPSBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0pO1xufSk7XG5leHBvcnQgZGVmYXVsdCBvbmNlOyIsImltcG9ydCBfY3VycnkzIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTMuanNcIjtcblxuLy8gYElkZW50aXR5YCBpcyBhIGZ1bmN0b3IgdGhhdCBob2xkcyBhIHNpbmdsZSB2YWx1ZSwgd2hlcmUgYG1hcGAgc2ltcGx5XG4vLyB0cmFuc2Zvcm1zIHRoZSBoZWxkIHZhbHVlIHdpdGggdGhlIHByb3ZpZGVkIGZ1bmN0aW9uLlxudmFyIElkZW50aXR5ID0gZnVuY3Rpb24gKHgpIHtcbiAgcmV0dXJuIHtcbiAgICB2YWx1ZTogeCxcbiAgICBtYXA6IGZ1bmN0aW9uIChmKSB7XG4gICAgICByZXR1cm4gSWRlbnRpdHkoZih4KSk7XG4gICAgfVxuICB9O1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgXCJzZXR0aW5nXCIgdGhlIHBvcnRpb24gb2YgdGhlIGdpdmVuIGRhdGEgc3RydWN0dXJlXG4gKiBmb2N1c2VkIGJ5IHRoZSBnaXZlbiBsZW5zIHRvIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgdGhlIGdpdmVuIGZ1bmN0aW9uIHRvXG4gKiB0aGUgZm9jdXNlZCB2YWx1ZS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xNi4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAdHlwZWRlZm4gTGVucyBzIGEgPSBGdW5jdG9yIGYgPT4gKGEgLT4gZiBhKSAtPiBzIC0+IGYgc1xuICogQHNpZyBMZW5zIHMgYSAtPiAoYSAtPiBhKSAtPiBzIC0+IHNcbiAqIEBwYXJhbSB7TGVuc30gbGVuc1xuICogQHBhcmFtIHsqfSB2XG4gKiBAcGFyYW0geyp9IHhcbiAqIEByZXR1cm4geyp9XG4gKiBAc2VlIFIudmlldywgUi5zZXQsIFIubGVucywgUi5sZW5zSW5kZXgsIFIubGVuc1Byb3AsIFIubGVuc1BhdGhcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBoZWFkTGVucyA9IFIubGVuc0luZGV4KDApO1xuICpcbiAqICAgICAgUi5vdmVyKGhlYWRMZW5zLCBSLnRvVXBwZXIsIFsnZm9vJywgJ2JhcicsICdiYXonXSk7IC8vPT4gWydGT08nLCAnYmFyJywgJ2JheiddXG4gKi9cbnZhciBvdmVyID0gLyojX19QVVJFX18qL19jdXJyeTMoZnVuY3Rpb24gb3ZlcihsZW5zLCBmLCB4KSB7XG4gIC8vIFRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgZ2V0dGVyIGZ1bmN0aW9uIGlzIGZpcnN0IHRyYW5zZm9ybWVkIHdpdGggYGZgLFxuICAvLyB0aGVuIHNldCBhcyB0aGUgdmFsdWUgb2YgYW4gYElkZW50aXR5YC4gVGhpcyBpcyB0aGVuIG1hcHBlZCBvdmVyIHdpdGggdGhlXG4gIC8vIHNldHRlciBmdW5jdGlvbiBvZiB0aGUgbGVucy5cbiAgcmV0dXJuIGxlbnMoZnVuY3Rpb24gKHkpIHtcbiAgICByZXR1cm4gSWRlbnRpdHkoZih5KSk7XG4gIH0pKHgpLnZhbHVlO1xufSk7XG5leHBvcnQgZGVmYXVsdCBvdmVyOyIsImltcG9ydCBmaWx0ZXIgZnJvbSBcIi4vZmlsdGVyLmpzXCI7XG5pbXBvcnQganV4dCBmcm9tIFwiLi9qdXh0LmpzXCI7XG5pbXBvcnQgcmVqZWN0IGZyb20gXCIuL3JlamVjdC5qc1wiO1xuXG4vKipcbiAqIFRha2VzIGEgcHJlZGljYXRlIGFuZCBhIGxpc3Qgb3Igb3RoZXIgYEZpbHRlcmFibGVgIG9iamVjdCBhbmQgcmV0dXJucyB0aGVcbiAqIHBhaXIgb2YgZmlsdGVyYWJsZSBvYmplY3RzIG9mIHRoZSBzYW1lIHR5cGUgb2YgZWxlbWVudHMgd2hpY2ggZG8gYW5kIGRvIG5vdFxuICogc2F0aXNmeSwgdGhlIHByZWRpY2F0ZSwgcmVzcGVjdGl2ZWx5LiBGaWx0ZXJhYmxlIG9iamVjdHMgaW5jbHVkZSBwbGFpbiBvYmplY3RzIG9yIGFueSBvYmplY3RcbiAqIHRoYXQgaGFzIGEgZmlsdGVyIG1ldGhvZCBzdWNoIGFzIGBBcnJheWAuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS40XG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBGaWx0ZXJhYmxlIGYgPT4gKGEgLT4gQm9vbGVhbikgLT4gZiBhIC0+IFtmIGEsIGYgYV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWQgQSBwcmVkaWNhdGUgdG8gZGV0ZXJtaW5lIHdoaWNoIHNpZGUgdGhlIGVsZW1lbnQgYmVsb25ncyB0by5cbiAqIEBwYXJhbSB7QXJyYXl9IGZpbHRlcmFibGUgdGhlIGxpc3QgKG9yIG90aGVyIGZpbHRlcmFibGUpIHRvIHBhcnRpdGlvbi5cbiAqIEByZXR1cm4ge0FycmF5fSBBbiBhcnJheSwgY29udGFpbmluZyBmaXJzdCB0aGUgc3Vic2V0IG9mIGVsZW1lbnRzIHRoYXQgc2F0aXNmeSB0aGVcbiAqICAgICAgICAgcHJlZGljYXRlLCBhbmQgc2Vjb25kIHRoZSBzdWJzZXQgb2YgZWxlbWVudHMgdGhhdCBkbyBub3Qgc2F0aXNmeS5cbiAqIEBzZWUgUi5maWx0ZXIsIFIucmVqZWN0XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5wYXJ0aXRpb24oUi5pbmNsdWRlcygncycpLCBbJ3NzcycsICd0dHQnLCAnZm9vJywgJ2JhcnMnXSk7XG4gKiAgICAgIC8vID0+IFsgWyAnc3NzJywgJ2JhcnMnIF0sICBbICd0dHQnLCAnZm9vJyBdIF1cbiAqXG4gKiAgICAgIFIucGFydGl0aW9uKFIuaW5jbHVkZXMoJ3MnKSwgeyBhOiAnc3NzJywgYjogJ3R0dCcsIGZvbzogJ2JhcnMnIH0pO1xuICogICAgICAvLyA9PiBbIHsgYTogJ3NzcycsIGZvbzogJ2JhcnMnIH0sIHsgYjogJ3R0dCcgfSAgXVxuICovXG52YXIgcGFydGl0aW9uID0gLyojX19QVVJFX18qL2p1eHQoW2ZpbHRlciwgcmVqZWN0XSk7XG5leHBvcnQgZGVmYXVsdCBwYXJ0aXRpb247IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9wYXRoIGZyb20gXCIuL2ludGVybmFsL19wYXRoLmpzXCI7XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSB2YWx1ZSBhdCBhIGdpdmVuIHBhdGguIFRoZSBub2RlcyBvZiB0aGUgcGF0aCBjYW4gYmUgYXJiaXRyYXJ5IHN0cmluZ3Mgb3Igbm9uLW5lZ2F0aXZlIGludGVnZXJzLlxuICogRm9yIGFueXRoaW5nIGVsc2UsIHRoZSB2YWx1ZSBpcyB1bnNwZWNpZmllZC4gSW50ZWdlciBwYXRocyBhcmUgbWVhbnQgdG8gaW5kZXggYXJyYXlzLCBzdHJpbmdzIGFyZSBtZWFudCBmb3Igb2JqZWN0cy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4yLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEB0eXBlZGVmbiBJZHggPSBTdHJpbmcgfCBJbnQgfCBTeW1ib2xcbiAqIEBzaWcgW0lkeF0gLT4ge2F9IC0+IGEgfCBVbmRlZmluZWRcbiAqIEBzaWcgSWR4ID0gU3RyaW5nIHwgTm9uTmVnYXRpdmVJbnRcbiAqIEBwYXJhbSB7QXJyYXl9IHBhdGggVGhlIHBhdGggdG8gdXNlLlxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IG9yIGFycmF5IHRvIHJldHJpZXZlIHRoZSBuZXN0ZWQgcHJvcGVydHkgZnJvbS5cbiAqIEByZXR1cm4geyp9IFRoZSBkYXRhIGF0IGBwYXRoYC5cbiAqIEBzZWUgUi5wcm9wLCBSLm50aCwgUi5hc3NvY1BhdGgsIFIuZGlzc29jUGF0aFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIucGF0aChbJ2EnLCAnYiddLCB7YToge2I6IDJ9fSk7IC8vPT4gMlxuICogICAgICBSLnBhdGgoWydhJywgJ2InXSwge2M6IHtiOiAyfX0pOyAvLz0+IHVuZGVmaW5lZFxuICogICAgICBSLnBhdGgoWydhJywgJ2InLCAwXSwge2E6IHtiOiBbMSwgMiwgM119fSk7IC8vPT4gMVxuICogICAgICBSLnBhdGgoWydhJywgJ2InLCAtMl0sIHthOiB7YjogWzEsIDIsIDNdfX0pOyAvLz0+IDJcbiAqICAgICAgUi5wYXRoKFsyXSwgeycyJzogMn0pOyAvLz0+IDJcbiAqICAgICAgUi5wYXRoKFstMl0sIHsnLTInOiAnYSd9KTsgLy89PiB1bmRlZmluZWRcbiAqL1xuXG52YXIgcGF0aCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKF9wYXRoKTtcbmV4cG9ydCBkZWZhdWx0IHBhdGg7IiwiaW1wb3J0IF9jdXJyeTMgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5My5qc1wiO1xuaW1wb3J0IF9wYXRoIGZyb20gXCIuL2ludGVybmFsL19wYXRoLmpzXCI7XG5pbXBvcnQgZGVmYXVsdFRvIGZyb20gXCIuL2RlZmF1bHRUby5qc1wiO1xuXG4vKipcbiAqIElmIHRoZSBnaXZlbiwgbm9uLW51bGwgb2JqZWN0IGhhcyBhIHZhbHVlIGF0IHRoZSBnaXZlbiBwYXRoLCByZXR1cm5zIHRoZVxuICogdmFsdWUgYXQgdGhhdCBwYXRoLiBPdGhlcndpc2UgcmV0dXJucyB0aGUgcHJvdmlkZWQgZGVmYXVsdCB2YWx1ZS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xOC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAdHlwZWRlZm4gSWR4ID0gU3RyaW5nIHwgSW50IHwgU3ltYm9sXG4gKiBAc2lnIGEgLT4gW0lkeF0gLT4ge2F9IC0+IGFcbiAqIEBwYXJhbSB7Kn0gZCBUaGUgZGVmYXVsdCB2YWx1ZS5cbiAqIEBwYXJhbSB7QXJyYXl9IHAgVGhlIHBhdGggdG8gdXNlLlxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIHJldHJpZXZlIHRoZSBuZXN0ZWQgcHJvcGVydHkgZnJvbS5cbiAqIEByZXR1cm4geyp9IFRoZSBkYXRhIGF0IGBwYXRoYCBvZiB0aGUgc3VwcGxpZWQgb2JqZWN0IG9yIHRoZSBkZWZhdWx0IHZhbHVlLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIucGF0aE9yKCdOL0EnLCBbJ2EnLCAnYiddLCB7YToge2I6IDJ9fSk7IC8vPT4gMlxuICogICAgICBSLnBhdGhPcignTi9BJywgWydhJywgJ2InXSwge2M6IHtiOiAyfX0pOyAvLz0+IFwiTi9BXCJcbiAqL1xudmFyIHBhdGhPciA9IC8qI19fUFVSRV9fKi9fY3VycnkzKGZ1bmN0aW9uIHBhdGhPcihkLCBwLCBvYmopIHtcbiAgcmV0dXJuIGRlZmF1bHRUbyhkLCBfcGF0aChwLCBvYmopKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgcGF0aE9yOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgcGFydGlhbCBjb3B5IG9mIGFuIG9iamVjdCBjb250YWluaW5nIG9ubHkgdGhlIGtleXMgc3BlY2lmaWVkLiBJZlxuICogdGhlIGtleSBkb2VzIG5vdCBleGlzdCwgdGhlIHByb3BlcnR5IGlzIGlnbm9yZWQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnIFtrXSAtPiB7azogdn0gLT4ge2s6IHZ9XG4gKiBAcGFyYW0ge0FycmF5fSBuYW1lcyBhbiBhcnJheSBvZiBTdHJpbmcgcHJvcGVydHkgbmFtZXMgdG8gY29weSBvbnRvIGEgbmV3IG9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIGNvcHkgZnJvbVxuICogQHJldHVybiB7T2JqZWN0fSBBIG5ldyBvYmplY3Qgd2l0aCBvbmx5IHByb3BlcnRpZXMgZnJvbSBgbmFtZXNgIG9uIGl0LlxuICogQHNlZSBSLm9taXQsIFIucHJvcHNcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnBpY2soWydhJywgJ2QnXSwge2E6IDEsIGI6IDIsIGM6IDMsIGQ6IDR9KTsgLy89PiB7YTogMSwgZDogNH1cbiAqICAgICAgUi5waWNrKFsnYScsICdlJywgJ2YnXSwge2E6IDEsIGI6IDIsIGM6IDMsIGQ6IDR9KTsgLy89PiB7YTogMX1cbiAqL1xudmFyIHBpY2sgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiBwaWNrKG5hbWVzLCBvYmopIHtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICB2YXIgaWR4ID0gMDtcbiAgd2hpbGUgKGlkeCA8IG5hbWVzLmxlbmd0aCkge1xuICAgIGlmIChuYW1lc1tpZHhdIGluIG9iaikge1xuICAgICAgcmVzdWx0W25hbWVzW2lkeF1dID0gb2JqW25hbWVzW2lkeF1dO1xuICAgIH1cbiAgICBpZHggKz0gMTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufSk7XG5leHBvcnQgZGVmYXVsdCBwaWNrOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgcGFydGlhbCBjb3B5IG9mIGFuIG9iamVjdCBjb250YWluaW5nIG9ubHkgdGhlIGtleXMgdGhhdCBzYXRpc2Z5XG4gKiB0aGUgc3VwcGxpZWQgcHJlZGljYXRlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjguMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyAoKHYsIGspIC0+IEJvb2xlYW4pIC0+IHtrOiB2fSAtPiB7azogdn1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWQgQSBwcmVkaWNhdGUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IGEga2V5XG4gKiAgICAgICAgc2hvdWxkIGJlIGluY2x1ZGVkIG9uIHRoZSBvdXRwdXQgb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIGNvcHkgZnJvbVxuICogQHJldHVybiB7T2JqZWN0fSBBIG5ldyBvYmplY3Qgd2l0aCBvbmx5IHByb3BlcnRpZXMgdGhhdCBzYXRpc2Z5IGBwcmVkYFxuICogICAgICAgICBvbiBpdC5cbiAqIEBzZWUgUi5waWNrLCBSLmZpbHRlclxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IGlzVXBwZXJDYXNlID0gKHZhbCwga2V5KSA9PiBrZXkudG9VcHBlckNhc2UoKSA9PT0ga2V5O1xuICogICAgICBSLnBpY2tCeShpc1VwcGVyQ2FzZSwge2E6IDEsIGI6IDIsIEE6IDMsIEI6IDR9KTsgLy89PiB7QTogMywgQjogNH1cbiAqL1xudmFyIHBpY2tCeSA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIHBpY2tCeSh0ZXN0LCBvYmopIHtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICBmb3IgKHZhciBwcm9wIGluIG9iaikge1xuICAgIGlmICh0ZXN0KG9ialtwcm9wXSwgcHJvcCwgb2JqKSkge1xuICAgICAgcmVzdWx0W3Byb3BdID0gb2JqW3Byb3BdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufSk7XG5leHBvcnQgZGVmYXVsdCBwaWNrQnk7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IG1hcCBmcm9tIFwiLi9tYXAuanNcIjtcbmltcG9ydCBwcm9wIGZyb20gXCIuL3Byb3AuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IGxpc3QgYnkgcGx1Y2tpbmcgdGhlIHNhbWUgbmFtZWQgcHJvcGVydHkgb2ZmIGFsbCBvYmplY3RzIGluXG4gKiB0aGUgbGlzdCBzdXBwbGllZC5cbiAqXG4gKiBgcGx1Y2tgIHdpbGwgd29yayBvblxuICogYW55IFtmdW5jdG9yXShodHRwczovL2dpdGh1Yi5jb20vZmFudGFzeWxhbmQvZmFudGFzeS1sYW5kI2Z1bmN0b3IpIGluXG4gKiBhZGRpdGlvbiB0byBhcnJheXMsIGFzIGl0IGlzIGVxdWl2YWxlbnQgdG8gYFIubWFwKFIucHJvcChrKSwgZilgLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgRnVuY3RvciBmID0+IGsgLT4gZiB7azogdn0gLT4gZiB2XG4gKiBAcGFyYW0ge051bWJlcnxTdHJpbmd9IGtleSBUaGUga2V5IG5hbWUgdG8gcGx1Y2sgb2ZmIG9mIGVhY2ggb2JqZWN0LlxuICogQHBhcmFtIHtBcnJheX0gZiBUaGUgYXJyYXkgb3IgZnVuY3RvciB0byBjb25zaWRlci5cbiAqIEByZXR1cm4ge0FycmF5fSBUaGUgbGlzdCBvZiB2YWx1ZXMgZm9yIHRoZSBnaXZlbiBrZXkuXG4gKiBAc2VlIFIucHJvamVjdCwgUi5wcm9wLCBSLnByb3BzXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgdmFyIGdldEFnZXMgPSBSLnBsdWNrKCdhZ2UnKTtcbiAqICAgICAgZ2V0QWdlcyhbe25hbWU6ICdmcmVkJywgYWdlOiAyOX0sIHtuYW1lOiAnd2lsbWEnLCBhZ2U6IDI3fV0pOyAvLz0+IFsyOSwgMjddXG4gKlxuICogICAgICBSLnBsdWNrKDAsIFtbMSwgMl0sIFszLCA0XV0pOyAgICAgICAgICAgICAgIC8vPT4gWzEsIDNdXG4gKiAgICAgIFIucGx1Y2soJ3ZhbCcsIHthOiB7dmFsOiAzfSwgYjoge3ZhbDogNX19KTsgLy89PiB7YTogMywgYjogNX1cbiAqIEBzeW1iIFIucGx1Y2soJ3gnLCBbe3g6IDEsIHk6IDJ9LCB7eDogMywgeTogNH0sIHt4OiA1LCB5OiA2fV0pID0gWzEsIDMsIDVdXG4gKiBAc3ltYiBSLnBsdWNrKDAsIFtbMSwgMl0sIFszLCA0XSwgWzUsIDZdXSkgPSBbMSwgMywgNV1cbiAqL1xudmFyIHBsdWNrID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gcGx1Y2socCwgbGlzdCkge1xuICByZXR1cm4gbWFwKHByb3AocCksIGxpc3QpO1xufSk7XG5leHBvcnQgZGVmYXVsdCBwbHVjazsiLCJpbXBvcnQgX2NvbmNhdCBmcm9tIFwiLi9pbnRlcm5hbC9fY29uY2F0LmpzXCI7XG5pbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyBhIG5ldyBsaXN0IHdpdGggdGhlIGdpdmVuIGVsZW1lbnQgYXQgdGhlIGZyb250LCBmb2xsb3dlZCBieSB0aGVcbiAqIGNvbnRlbnRzIG9mIHRoZSBsaXN0LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgYSAtPiBbYV0gLT4gW2FdXG4gKiBAcGFyYW0geyp9IGVsIFRoZSBpdGVtIHRvIGFkZCB0byB0aGUgaGVhZCBvZiB0aGUgb3V0cHV0IGxpc3QuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBhcnJheSB0byBhZGQgdG8gdGhlIHRhaWwgb2YgdGhlIG91dHB1dCBsaXN0LlxuICogQHJldHVybiB7QXJyYXl9IEEgbmV3IGFycmF5LlxuICogQHNlZSBSLmFwcGVuZFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIucHJlcGVuZCgnZmVlJywgWydmaScsICdmbycsICdmdW0nXSk7IC8vPT4gWydmZWUnLCAnZmknLCAnZm8nLCAnZnVtJ11cbiAqL1xudmFyIHByZXBlbmQgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiBwcmVwZW5kKGVsLCBsaXN0KSB7XG4gIHJldHVybiBfY29uY2F0KFtlbF0sIGxpc3QpO1xufSk7XG5leHBvcnQgZGVmYXVsdCBwcmVwZW5kOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfaXNJbnRlZ2VyIGZyb20gXCIuL2ludGVybmFsL19pc0ludGVnZXIuanNcIjtcbmltcG9ydCBfbnRoIGZyb20gXCIuL2ludGVybmFsL19udGguanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCB3aGVuIHN1cHBsaWVkIGFuIG9iamVjdCByZXR1cm5zIHRoZSBpbmRpY2F0ZWRcbiAqIHByb3BlcnR5IG9mIHRoYXQgb2JqZWN0LCBpZiBpdCBleGlzdHMuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAdHlwZWRlZm4gSWR4ID0gU3RyaW5nIHwgSW50IHwgU3ltYm9sXG4gKiBAc2lnIElkeCAtPiB7czogYX0gLT4gYSB8IFVuZGVmaW5lZFxuICogQHBhcmFtIHtTdHJpbmd8TnVtYmVyfSBwIFRoZSBwcm9wZXJ0eSBuYW1lIG9yIGFycmF5IGluZGV4XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gcXVlcnlcbiAqIEByZXR1cm4geyp9IFRoZSB2YWx1ZSBhdCBgb2JqLnBgLlxuICogQHNlZSBSLnBhdGgsIFIucHJvcHMsIFIucGx1Y2ssIFIucHJvamVjdCwgUi5udGhcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnByb3AoJ3gnLCB7eDogMTAwfSk7IC8vPT4gMTAwXG4gKiAgICAgIFIucHJvcCgneCcsIHt9KTsgLy89PiB1bmRlZmluZWRcbiAqICAgICAgUi5wcm9wKDAsIFsxMDBdKTsgLy89PiAxMDBcbiAqICAgICAgUi5jb21wb3NlKFIuaW5jLCBSLnByb3AoJ3gnKSkoeyB4OiAzIH0pIC8vPT4gNFxuICovXG5cbnZhciBwcm9wID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gcHJvcChwLCBvYmopIHtcbiAgaWYgKG9iaiA9PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHJldHVybiBfaXNJbnRlZ2VyKHApID8gX250aChwLCBvYmopIDogb2JqW3BdO1xufSk7XG5leHBvcnQgZGVmYXVsdCBwcm9wOyIsImltcG9ydCBfY3VycnkzIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTMuanNcIjtcbmltcG9ydCBwcm9wIGZyb20gXCIuL3Byb3AuanNcIjtcbmltcG9ydCBlcXVhbHMgZnJvbSBcIi4vZXF1YWxzLmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHNwZWNpZmllZCBvYmplY3QgcHJvcGVydHkgaXMgZXF1YWwsIGluXG4gKiBbYFIuZXF1YWxzYF0oI2VxdWFscykgdGVybXMsIHRvIHRoZSBnaXZlbiB2YWx1ZTsgYGZhbHNlYCBvdGhlcndpc2UuXG4gKiBZb3UgY2FuIHRlc3QgbXVsdGlwbGUgcHJvcGVydGllcyB3aXRoIFtgUi53aGVyZUVxYF0oI3doZXJlRXEpLFxuICogYW5kIHRlc3QgbmVzdGVkIHBhdGggcHJvcGVydHkgd2l0aCBbYFIucGF0aEVxYF0oI3BhdGhFcSkuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgUmVsYXRpb25cbiAqIEBzaWcgYSAtPiBTdHJpbmcgLT4gT2JqZWN0IC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byBjb21wYXJlIHRoZSBwcm9wZXJ0eSB3aXRoXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgc3BlY2lmaWVkIG9iamVjdCBwcm9wZXJ0eSdzIGtleVxuICogQHBhcmFtIHsqfSBvYmogVGhlIG9iamVjdCB0byBjaGVjayB0aGUgcHJvcGVydHkgaW5cbiAqIEByZXR1cm4ge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgdmFsdWUgZXF1YWxzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHByb3BlcnR5LFxuICogICAgICAgICBgZmFsc2VgIG90aGVyd2lzZS5cbiAqIEBzZWUgUi53aGVyZUVxLCBSLnBhdGhFcSwgUi5wcm9wU2F0aXNmaWVzLCBSLmVxdWFsc1xuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IGFiYnkgPSB7bmFtZTogJ0FiYnknLCBhZ2U6IDcsIGhhaXI6ICdibG9uZCd9O1xuICogICAgICBjb25zdCBmcmVkID0ge25hbWU6ICdGcmVkJywgYWdlOiAxMiwgaGFpcjogJ2Jyb3duJ307XG4gKiAgICAgIGNvbnN0IHJ1c3R5ID0ge25hbWU6ICdSdXN0eScsIGFnZTogMTAsIGhhaXI6ICdicm93bid9O1xuICogICAgICBjb25zdCBhbG9pcyA9IHtuYW1lOiAnQWxvaXMnLCBhZ2U6IDE1LCBkaXNwb3NpdGlvbjogJ3N1cmx5J307XG4gKiAgICAgIGNvbnN0IGtpZHMgPSBbYWJieSwgZnJlZCwgcnVzdHksIGFsb2lzXTtcbiAqICAgICAgY29uc3QgaGFzQnJvd25IYWlyID0gUi5wcm9wRXEoJ2Jyb3duJywgJ2hhaXInKTtcbiAqICAgICAgUi5maWx0ZXIoaGFzQnJvd25IYWlyLCBraWRzKTsgLy89PiBbZnJlZCwgcnVzdHldXG4gKi9cbnZhciBwcm9wRXEgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MyhmdW5jdGlvbiBwcm9wRXEodmFsLCBuYW1lLCBvYmopIHtcbiAgcmV0dXJuIGVxdWFscyh2YWwsIHByb3AobmFtZSwgb2JqKSk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IHByb3BFcTsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgcHJvcCBmcm9tIFwiLi9wcm9wLmpzXCI7XG5cbi8qKlxuICogQWN0cyBhcyBtdWx0aXBsZSBgcHJvcGA6IGFycmF5IG9mIGtleXMgaW4sIGFycmF5IG9mIHZhbHVlcyBvdXQuIFByZXNlcnZlc1xuICogb3JkZXIuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnIFtrXSAtPiB7azogdn0gLT4gW3ZdXG4gKiBAcGFyYW0ge0FycmF5fSBwcyBUaGUgcHJvcGVydHkgbmFtZXMgdG8gZmV0Y2hcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBxdWVyeVxuICogQHJldHVybiB7QXJyYXl9IFRoZSBjb3JyZXNwb25kaW5nIHZhbHVlcyBvciBwYXJ0aWFsbHkgYXBwbGllZCBmdW5jdGlvbi5cbiAqIEBzZWUgUi5wcm9wLCBSLnBsdWNrLCBSLnByb2plY3RcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnByb3BzKFsneCcsICd5J10sIHt4OiAxLCB5OiAyfSk7IC8vPT4gWzEsIDJdXG4gKiAgICAgIFIucHJvcHMoWydjJywgJ2EnLCAnYiddLCB7YjogMiwgYTogMX0pOyAvLz0+IFt1bmRlZmluZWQsIDEsIDJdXG4gKlxuICogICAgICBjb25zdCBmdWxsTmFtZSA9IFIuY29tcG9zZShSLmpvaW4oJyAnKSwgUi5wcm9wcyhbJ2ZpcnN0JywgJ2xhc3QnXSkpO1xuICogICAgICBmdWxsTmFtZSh7bGFzdDogJ0J1bGxldC1Ub290aCcsIGFnZTogMzMsIGZpcnN0OiAnVG9ueSd9KTsgLy89PiAnVG9ueSBCdWxsZXQtVG9vdGgnXG4gKi9cbnZhciBwcm9wcyA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIHByb3BzKHBzLCBvYmopIHtcbiAgcmV0dXJuIHBzLm1hcChmdW5jdGlvbiAocCkge1xuICAgIHJldHVybiBwcm9wKHAsIG9iaik7XG4gIH0pO1xufSk7XG5leHBvcnQgZGVmYXVsdCBwcm9wczsiLCJpbXBvcnQgX2N1cnJ5MyBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkzLmpzXCI7XG5pbXBvcnQgX3hSZWR1Y2UgZnJvbSBcIi4vaW50ZXJuYWwvX3hSZWR1Y2UuanNcIjtcbmltcG9ydCBfeHdyYXAgZnJvbSBcIi4vaW50ZXJuYWwvX3h3cmFwLmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyBhIHNpbmdsZSBpdGVtIGJ5IGl0ZXJhdGluZyB0aHJvdWdoIHRoZSBsaXN0LCBzdWNjZXNzaXZlbHkgY2FsbGluZ1xuICogdGhlIGl0ZXJhdG9yIGZ1bmN0aW9uIGFuZCBwYXNzaW5nIGl0IGFuIGFjY3VtdWxhdG9yIHZhbHVlIGFuZCB0aGUgY3VycmVudFxuICogdmFsdWUgZnJvbSB0aGUgYXJyYXksIGFuZCB0aGVuIHBhc3NpbmcgdGhlIHJlc3VsdCB0byB0aGUgbmV4dCBjYWxsLlxuICpcbiAqIFRoZSBpdGVyYXRvciBmdW5jdGlvbiByZWNlaXZlcyB0d28gdmFsdWVzOiAqKGFjYywgdmFsdWUpKi4gSXQgbWF5IHVzZVxuICogW2BSLnJlZHVjZWRgXSgjcmVkdWNlZCkgdG8gc2hvcnRjdXQgdGhlIGl0ZXJhdGlvbi5cbiAqXG4gKiBUaGUgYXJndW1lbnRzJyBvcmRlciBvZiBbYHJlZHVjZVJpZ2h0YF0oI3JlZHVjZVJpZ2h0KSdzIGl0ZXJhdG9yIGZ1bmN0aW9uXG4gKiBpcyAqKHZhbHVlLCBhY2MpKi5cbiAqXG4gKiBOb3RlOiBgUi5yZWR1Y2VgIGRvZXMgbm90IHNraXAgZGVsZXRlZCBvciB1bmFzc2lnbmVkIGluZGljZXMgKHNwYXJzZVxuICogYXJyYXlzKSwgdW5saWtlIHRoZSBuYXRpdmUgYEFycmF5LnByb3RvdHlwZS5yZWR1Y2VgIG1ldGhvZC4gRm9yIG1vcmUgZGV0YWlsc1xuICogb24gdGhpcyBiZWhhdmlvciwgc2VlOlxuICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvcmVkdWNlI0Rlc2NyaXB0aW9uXG4gKlxuICogQmUgY2F1dGlvdXMgb2YgbXV0YXRpbmcgYW5kIHJldHVybmluZyB0aGUgYWNjdW11bGF0b3IuIElmIHlvdSByZXVzZSBpdCBhY3Jvc3NcbiAqIGludm9jYXRpb25zLCBpdCB3aWxsIGNvbnRpbnVlIHRvIGFjY3VtdWxhdGUgb250byB0aGUgc2FtZSB2YWx1ZS4gVGhlIGdlbmVyYWxcbiAqIHJlY29tbWVuZGF0aW9uIGlzIHRvIGFsd2F5cyByZXR1cm4gYSBuZXcgdmFsdWUuIElmIHlvdSBjYW4ndCBkbyBzbyBmb3JcbiAqIHBlcmZvcm1hbmNlIHJlYXNvbnMsIHRoZW4gYmUgc3VyZSB0byByZWluaXRpYWxpemUgdGhlIGFjY3VtdWxhdG9yIG9uIGVhY2hcbiAqIGludm9jYXRpb24uXG4gKlxuICogRGlzcGF0Y2hlcyB0byB0aGUgYHJlZHVjZWAgbWV0aG9kIG9mIHRoZSB0aGlyZCBhcmd1bWVudCwgaWYgcHJlc2VudC4gV2hlblxuICogZG9pbmcgc28sIGl0IGlzIHVwIHRvIHRoZSB1c2VyIHRvIGhhbmRsZSB0aGUgW2BSLnJlZHVjZWRgXSgjcmVkdWNlZClcbiAqIHNob3J0Y3V0aW5nLCBhcyB0aGlzIGlzIG5vdCBpbXBsZW1lbnRlZCBieSBgcmVkdWNlYC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnICgoYSwgYikgLT4gYSkgLT4gYSAtPiBbYl0gLT4gYVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGl0ZXJhdG9yIGZ1bmN0aW9uLiBSZWNlaXZlcyB0d28gdmFsdWVzLCB0aGUgYWNjdW11bGF0b3IgYW5kIHRoZVxuICogICAgICAgIGN1cnJlbnQgZWxlbWVudCBmcm9tIHRoZSBhcnJheS5cbiAqIEBwYXJhbSB7Kn0gYWNjIFRoZSBhY2N1bXVsYXRvciB2YWx1ZS5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGxpc3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHJldHVybiB7Kn0gVGhlIGZpbmFsLCBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAqIEBzZWUgUi5yZWR1Y2VkLCBSLmFkZEluZGV4LCBSLnJlZHVjZVJpZ2h0XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5yZWR1Y2UoUi5zdWJ0cmFjdCwgMCwgWzEsIDIsIDMsIDRdKSAvLyA9PiAoKCgoMCAtIDEpIC0gMikgLSAzKSAtIDQpID0gLTEwXG4gKiAgICAgIC8vICAgICAgICAgIC0gICAgICAgICAgICAgICAtMTBcbiAqICAgICAgLy8gICAgICAgICAvIFxcICAgICAgICAgICAgICAvIFxcXG4gKiAgICAgIC8vICAgICAgICAtICAgNCAgICAgICAgICAgLTYgICA0XG4gKiAgICAgIC8vICAgICAgIC8gXFwgICAgICAgICAgICAgIC8gXFxcbiAqICAgICAgLy8gICAgICAtICAgMyAgID09PiAgICAgLTMgICAzXG4gKiAgICAgIC8vICAgICAvIFxcICAgICAgICAgICAgICAvIFxcXG4gKiAgICAgIC8vICAgIC0gICAyICAgICAgICAgICAtMSAgIDJcbiAqICAgICAgLy8gICAvIFxcICAgICAgICAgICAgICAvIFxcXG4gKiAgICAgIC8vICAwICAgMSAgICAgICAgICAgIDAgICAxXG4gKlxuICogQHN5bWIgUi5yZWR1Y2UoZiwgYSwgW2IsIGMsIGRdKSA9IGYoZihmKGEsIGIpLCBjKSwgZClcbiAqL1xudmFyIHJlZHVjZSA9IC8qI19fUFVSRV9fKi9fY3VycnkzKGZ1bmN0aW9uICh4ZiwgYWNjLCBsaXN0KSB7XG4gIHJldHVybiBfeFJlZHVjZSh0eXBlb2YgeGYgPT09ICdmdW5jdGlvbicgPyBfeHdyYXAoeGYpIDogeGYsIGFjYywgbGlzdCk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IHJlZHVjZTsiLCJpbXBvcnQgX2Nsb25lIGZyb20gXCIuL2ludGVybmFsL19jbG9uZS5qc1wiO1xuaW1wb3J0IF9jdXJyeU4gZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Ti5qc1wiO1xuaW1wb3J0IF9kaXNwYXRjaGFibGUgZnJvbSBcIi4vaW50ZXJuYWwvX2Rpc3BhdGNoYWJsZS5qc1wiO1xuaW1wb3J0IF9oYXMgZnJvbSBcIi4vaW50ZXJuYWwvX2hhcy5qc1wiO1xuaW1wb3J0IF9yZWR1Y2VkIGZyb20gXCIuL2ludGVybmFsL19yZWR1Y2VkLmpzXCI7XG5pbXBvcnQgX3hSZWR1Y2UgZnJvbSBcIi4vaW50ZXJuYWwvX3hSZWR1Y2UuanNcIjtcbmltcG9ydCBfeHJlZHVjZUJ5IGZyb20gXCIuL2ludGVybmFsL194cmVkdWNlQnkuanNcIjtcbmltcG9ydCBfeHdyYXAgZnJvbSBcIi4vaW50ZXJuYWwvX3h3cmFwLmpzXCI7XG5cbi8qKlxuICogR3JvdXBzIHRoZSBlbGVtZW50cyBvZiB0aGUgbGlzdCBhY2NvcmRpbmcgdG8gdGhlIHJlc3VsdCBvZiBjYWxsaW5nXG4gKiB0aGUgU3RyaW5nLXJldHVybmluZyBmdW5jdGlvbiBga2V5Rm5gIG9uIGVhY2ggZWxlbWVudCBhbmQgcmVkdWNlcyB0aGUgZWxlbWVudHNcbiAqIG9mIGVhY2ggZ3JvdXAgdG8gYSBzaW5nbGUgdmFsdWUgdmlhIHRoZSByZWR1Y2VyIGZ1bmN0aW9uIGB2YWx1ZUZuYC5cbiAqXG4gKiBUaGUgdmFsdWUgZnVuY3Rpb24gcmVjZWl2ZXMgdHdvIHZhbHVlczogKihhY2MsIHZhbHVlKSouIEl0IG1heSB1c2VcbiAqIFtgUi5yZWR1Y2VkYF0oI3JlZHVjZWQpIHRvIHNob3J0IGNpcmN1aXQgdGhlIGl0ZXJhdGlvbi5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGJhc2ljYWxseSBhIG1vcmUgZ2VuZXJhbCBbYGdyb3VwQnlgXSgjZ3JvdXBCeSkgZnVuY3Rpb24uXG4gKlxuICogQWN0cyBhcyBhIHRyYW5zZHVjZXIgaWYgYSB0cmFuc2Zvcm1lciBpcyBnaXZlbiBpbiBsaXN0IHBvc2l0aW9uLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjIwLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnICgoYSwgYikgLT4gYSkgLT4gYSAtPiAoYiAtPiBTdHJpbmcpIC0+IFtiXSAtPiB7U3RyaW5nOiBhfVxuICogQHBhcmFtIHtGdW5jdGlvbn0gdmFsdWVGbiBUaGUgZnVuY3Rpb24gdGhhdCByZWR1Y2VzIHRoZSBlbGVtZW50cyBvZiBlYWNoIGdyb3VwIHRvIGEgc2luZ2xlXG4gKiAgICAgICAgdmFsdWUuIFJlY2VpdmVzIHR3byB2YWx1ZXMsIGFjY3VtdWxhdG9yIGZvciBhIHBhcnRpY3VsYXIgZ3JvdXAgYW5kIHRoZSBjdXJyZW50IGVsZW1lbnQuXG4gKiBAcGFyYW0geyp9IGFjYyBUaGUgKGluaXRpYWwpIGFjY3VtdWxhdG9yIHZhbHVlIGZvciBlYWNoIGdyb3VwLlxuICogQHBhcmFtIHtGdW5jdGlvbn0ga2V5Rm4gVGhlIGZ1bmN0aW9uIHRoYXQgbWFwcyB0aGUgbGlzdCdzIGVsZW1lbnQgaW50byBhIGtleS5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGFycmF5IHRvIGdyb3VwLlxuICogQHJldHVybiB7T2JqZWN0fSBBbiBvYmplY3Qgd2l0aCB0aGUgb3V0cHV0IG9mIGBrZXlGbmAgZm9yIGtleXMsIG1hcHBlZCB0byB0aGUgb3V0cHV0IG9mXG4gKiAgICAgICAgIGB2YWx1ZUZuYCBmb3IgZWxlbWVudHMgd2hpY2ggcHJvZHVjZWQgdGhhdCBrZXkgd2hlbiBwYXNzZWQgdG8gYGtleUZuYC5cbiAqIEBzZWUgUi5ncm91cEJ5LCBSLnJlZHVjZSwgUi5yZWR1Y2VkXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgZ3JvdXBOYW1lcyA9IChhY2MsIHtuYW1lfSkgPT4gYWNjLmNvbmNhdChuYW1lKVxuICogICAgICBjb25zdCB0b0dyYWRlID0gKHtzY29yZX0pID0+XG4gKiAgICAgICAgc2NvcmUgPCA2NSA/ICdGJyA6XG4gKiAgICAgICAgc2NvcmUgPCA3MCA/ICdEJyA6XG4gKiAgICAgICAgc2NvcmUgPCA4MCA/ICdDJyA6XG4gKiAgICAgICAgc2NvcmUgPCA5MCA/ICdCJyA6ICdBJ1xuICpcbiAqICAgICAgdmFyIHN0dWRlbnRzID0gW1xuICogICAgICAgIHtuYW1lOiAnQWJieScsIHNjb3JlOiA4M30sXG4gKiAgICAgICAge25hbWU6ICdCYXJ0Jywgc2NvcmU6IDYyfSxcbiAqICAgICAgICB7bmFtZTogJ0N1cnQnLCBzY29yZTogODh9LFxuICogICAgICAgIHtuYW1lOiAnRG9yYScsIHNjb3JlOiA5Mn0sXG4gKiAgICAgIF1cbiAqXG4gKiAgICAgIHJlZHVjZUJ5KGdyb3VwTmFtZXMsIFtdLCB0b0dyYWRlLCBzdHVkZW50cylcbiAqICAgICAgLy89PiB7XCJBXCI6IFtcIkRvcmFcIl0sIFwiQlwiOiBbXCJBYmJ5XCIsIFwiQ3VydFwiXSwgXCJGXCI6IFtcIkJhcnRcIl19XG4gKi9cbnZhciByZWR1Y2VCeSA9IC8qI19fUFVSRV9fKi9fY3VycnlOKDQsIFtdLCAvKiNfX1BVUkVfXyovX2Rpc3BhdGNoYWJsZShbXSwgX3hyZWR1Y2VCeSwgZnVuY3Rpb24gcmVkdWNlQnkodmFsdWVGbiwgdmFsdWVBY2MsIGtleUZuLCBsaXN0KSB7XG4gIHZhciB4ZiA9IF94d3JhcChmdW5jdGlvbiAoYWNjLCBlbHQpIHtcbiAgICB2YXIga2V5ID0ga2V5Rm4oZWx0KTtcbiAgICB2YXIgdmFsdWUgPSB2YWx1ZUZuKF9oYXMoa2V5LCBhY2MpID8gYWNjW2tleV0gOiBfY2xvbmUodmFsdWVBY2MsIGZhbHNlKSwgZWx0KTtcbiAgICBpZiAodmFsdWUgJiYgdmFsdWVbJ0BAdHJhbnNkdWNlci9yZWR1Y2VkJ10pIHtcbiAgICAgIHJldHVybiBfcmVkdWNlZChhY2MpO1xuICAgIH1cbiAgICBhY2Nba2V5XSA9IHZhbHVlO1xuICAgIHJldHVybiBhY2M7XG4gIH0pO1xuICByZXR1cm4gX3hSZWR1Y2UoeGYsIHt9LCBsaXN0KTtcbn0pKTtcbmV4cG9ydCBkZWZhdWx0IHJlZHVjZUJ5OyIsImltcG9ydCBfY29tcGxlbWVudCBmcm9tIFwiLi9pbnRlcm5hbC9fY29tcGxlbWVudC5qc1wiO1xuaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IGZpbHRlciBmcm9tIFwiLi9maWx0ZXIuanNcIjtcblxuLyoqXG4gKiBUaGUgY29tcGxlbWVudCBvZiBbYGZpbHRlcmBdKCNmaWx0ZXIpLlxuICpcbiAqIEFjdHMgYXMgYSB0cmFuc2R1Y2VyIGlmIGEgdHJhbnNmb3JtZXIgaXMgZ2l2ZW4gaW4gbGlzdCBwb3NpdGlvbi4gRmlsdGVyYWJsZVxuICogb2JqZWN0cyBpbmNsdWRlIHBsYWluIG9iamVjdHMgb3IgYW55IG9iamVjdCB0aGF0IGhhcyBhIGZpbHRlciBtZXRob2Qgc3VjaFxuICogYXMgYEFycmF5YC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIEZpbHRlcmFibGUgZiA9PiAoYSAtPiBCb29sZWFuKSAtPiBmIGEgLT4gZiBhXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkXG4gKiBAcGFyYW0ge0FycmF5fSBmaWx0ZXJhYmxlXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqIEBzZWUgUi5maWx0ZXIsIFIudHJhbnNkdWNlLCBSLmFkZEluZGV4XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgaXNPZGQgPSAobikgPT4gbiAlIDIgIT09IDA7XG4gKlxuICogICAgICBSLnJlamVjdChpc09kZCwgWzEsIDIsIDMsIDRdKTsgLy89PiBbMiwgNF1cbiAqXG4gKiAgICAgIFIucmVqZWN0KGlzT2RkLCB7YTogMSwgYjogMiwgYzogMywgZDogNH0pOyAvLz0+IHtiOiAyLCBkOiA0fVxuICovXG52YXIgcmVqZWN0ID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gcmVqZWN0KHByZWQsIGZpbHRlcmFibGUpIHtcbiAgcmV0dXJuIGZpbHRlcihfY29tcGxlbWVudChwcmVkKSwgZmlsdGVyYWJsZSk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IHJlamVjdDsiLCJpbXBvcnQgX2N1cnJ5MyBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkzLmpzXCI7XG5cbi8qKlxuICogUmVtb3ZlcyB0aGUgc3ViLWxpc3Qgb2YgYGxpc3RgIHN0YXJ0aW5nIGF0IGluZGV4IGBzdGFydGAgYW5kIGNvbnRhaW5pbmdcbiAqIGBjb3VudGAgZWxlbWVudHMuIF9Ob3RlIHRoYXQgdGhpcyBpcyBub3QgZGVzdHJ1Y3RpdmVfOiBpdCByZXR1cm5zIGEgY29weSBvZlxuICogdGhlIGxpc3Qgd2l0aCB0aGUgY2hhbmdlcy5cbiAqIDxzbWFsbD5ObyBsaXN0cyBoYXZlIGJlZW4gaGFybWVkIGluIHRoZSBhcHBsaWNhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uLjwvc21hbGw+XG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMi4yXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBOdW1iZXIgLT4gTnVtYmVyIC0+IFthXSAtPiBbYV1cbiAqIEBwYXJhbSB7TnVtYmVyfSBzdGFydCBUaGUgcG9zaXRpb24gdG8gc3RhcnQgcmVtb3ZpbmcgZWxlbWVudHNcbiAqIEBwYXJhbSB7TnVtYmVyfSBjb3VudCBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHJlbW92ZVxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgbGlzdCB0byByZW1vdmUgZnJvbVxuICogQHJldHVybiB7QXJyYXl9IEEgbmV3IEFycmF5IHdpdGggYGNvdW50YCBlbGVtZW50cyBmcm9tIGBzdGFydGAgcmVtb3ZlZC5cbiAqIEBzZWUgUi53aXRob3V0XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5yZW1vdmUoMiwgMywgWzEsMiwzLDQsNSw2LDcsOF0pOyAvLz0+IFsxLDIsNiw3LDhdXG4gKi9cbnZhciByZW1vdmUgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MyhmdW5jdGlvbiByZW1vdmUoc3RhcnQsIGNvdW50LCBsaXN0KSB7XG4gIHZhciByZXN1bHQgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChsaXN0LCAwKTtcbiAgcmVzdWx0LnNwbGljZShzdGFydCwgY291bnQpO1xuICByZXR1cm4gcmVzdWx0O1xufSk7XG5leHBvcnQgZGVmYXVsdCByZW1vdmU7IiwiaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5MS5qc1wiO1xuaW1wb3J0IF9pc1N0cmluZyBmcm9tIFwiLi9pbnRlcm5hbC9faXNTdHJpbmcuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IGxpc3Qgb3Igc3RyaW5nIHdpdGggdGhlIGVsZW1lbnRzIG9yIGNoYXJhY3RlcnMgaW4gcmV2ZXJzZVxuICogb3JkZXIuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBbYV0gLT4gW2FdXG4gKiBAc2lnIFN0cmluZyAtPiBTdHJpbmdcbiAqIEBwYXJhbSB7QXJyYXl8U3RyaW5nfSBsaXN0XG4gKiBAcmV0dXJuIHtBcnJheXxTdHJpbmd9XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5yZXZlcnNlKFsxLCAyLCAzXSk7ICAvLz0+IFszLCAyLCAxXVxuICogICAgICBSLnJldmVyc2UoWzEsIDJdKTsgICAgIC8vPT4gWzIsIDFdXG4gKiAgICAgIFIucmV2ZXJzZShbMV0pOyAgICAgICAgLy89PiBbMV1cbiAqICAgICAgUi5yZXZlcnNlKFtdKTsgICAgICAgICAvLz0+IFtdXG4gKlxuICogICAgICBSLnJldmVyc2UoJ2FiYycpOyAgICAgIC8vPT4gJ2NiYSdcbiAqICAgICAgUi5yZXZlcnNlKCdhYicpOyAgICAgICAvLz0+ICdiYSdcbiAqICAgICAgUi5yZXZlcnNlKCdhJyk7ICAgICAgICAvLz0+ICdhJ1xuICogICAgICBSLnJldmVyc2UoJycpOyAgICAgICAgIC8vPT4gJydcbiAqL1xudmFyIHJldmVyc2UgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MShmdW5jdGlvbiByZXZlcnNlKGxpc3QpIHtcbiAgcmV0dXJuIF9pc1N0cmluZyhsaXN0KSA/IGxpc3Quc3BsaXQoJycpLnJldmVyc2UoKS5qb2luKCcnKSA6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGxpc3QsIDApLnJldmVyc2UoKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgcmV2ZXJzZTsiLCJpbXBvcnQgX2N1cnJ5MyBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkzLmpzXCI7XG5pbXBvcnQgYWx3YXlzIGZyb20gXCIuL2Fsd2F5cy5qc1wiO1xuaW1wb3J0IG92ZXIgZnJvbSBcIi4vb3Zlci5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBcInNldHRpbmdcIiB0aGUgcG9ydGlvbiBvZiB0aGUgZ2l2ZW4gZGF0YSBzdHJ1Y3R1cmVcbiAqIGZvY3VzZWQgYnkgdGhlIGdpdmVuIGxlbnMgdG8gdGhlIGdpdmVuIHZhbHVlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE2LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEB0eXBlZGVmbiBMZW5zIHMgYSA9IEZ1bmN0b3IgZiA9PiAoYSAtPiBmIGEpIC0+IHMgLT4gZiBzXG4gKiBAc2lnIExlbnMgcyBhIC0+IGEgLT4gcyAtPiBzXG4gKiBAcGFyYW0ge0xlbnN9IGxlbnNcbiAqIEBwYXJhbSB7Kn0gdlxuICogQHBhcmFtIHsqfSB4XG4gKiBAcmV0dXJuIHsqfVxuICogQHNlZSBSLnZpZXcsIFIub3ZlciwgUi5sZW5zLCBSLmxlbnNJbmRleCwgUi5sZW5zUHJvcCwgUi5sZW5zUGF0aFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IHhMZW5zID0gUi5sZW5zUHJvcCgneCcpO1xuICpcbiAqICAgICAgUi5zZXQoeExlbnMsIDQsIHt4OiAxLCB5OiAyfSk7ICAvLz0+IHt4OiA0LCB5OiAyfVxuICogICAgICBSLnNldCh4TGVucywgOCwge3g6IDEsIHk6IDJ9KTsgIC8vPT4ge3g6IDgsIHk6IDJ9XG4gKi9cbnZhciBzZXQgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MyhmdW5jdGlvbiBzZXQobGVucywgdiwgeCkge1xuICByZXR1cm4gb3ZlcihsZW5zLCBhbHdheXModiksIHgpO1xufSk7XG5leHBvcnQgZGVmYXVsdCBzZXQ7IiwiaW1wb3J0IF9jaGVja0Zvck1ldGhvZCBmcm9tIFwiLi9pbnRlcm5hbC9fY2hlY2tGb3JNZXRob2QuanNcIjtcbmltcG9ydCBfY3VycnkzIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTMuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBlbGVtZW50cyBvZiB0aGUgZ2l2ZW4gbGlzdCBvciBzdHJpbmcgKG9yIG9iamVjdCB3aXRoIGEgYHNsaWNlYFxuICogbWV0aG9kKSBmcm9tIGBmcm9tSW5kZXhgIChpbmNsdXNpdmUpIHRvIGB0b0luZGV4YCAoZXhjbHVzaXZlKS5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgc2xpY2VgIG1ldGhvZCBvZiB0aGUgdGhpcmQgYXJndW1lbnQsIGlmIHByZXNlbnQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS40XG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBOdW1iZXIgLT4gTnVtYmVyIC0+IFthXSAtPiBbYV1cbiAqIEBzaWcgTnVtYmVyIC0+IE51bWJlciAtPiBTdHJpbmcgLT4gU3RyaW5nXG4gKiBAcGFyYW0ge051bWJlcn0gZnJvbUluZGV4IFRoZSBzdGFydCBpbmRleCAoaW5jbHVzaXZlKS5cbiAqIEBwYXJhbSB7TnVtYmVyfSB0b0luZGV4IFRoZSBlbmQgaW5kZXggKGV4Y2x1c2l2ZSkuXG4gKiBAcGFyYW0geyp9IGxpc3RcbiAqIEByZXR1cm4geyp9XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5zbGljZSgxLCAzLCBbJ2EnLCAnYicsICdjJywgJ2QnXSk7ICAgICAgICAvLz0+IFsnYicsICdjJ11cbiAqICAgICAgUi5zbGljZSgxLCBJbmZpbml0eSwgWydhJywgJ2InLCAnYycsICdkJ10pOyAvLz0+IFsnYicsICdjJywgJ2QnXVxuICogICAgICBSLnNsaWNlKDAsIC0xLCBbJ2EnLCAnYicsICdjJywgJ2QnXSk7ICAgICAgIC8vPT4gWydhJywgJ2InLCAnYyddXG4gKiAgICAgIFIuc2xpY2UoLTMsIC0xLCBbJ2EnLCAnYicsICdjJywgJ2QnXSk7ICAgICAgLy89PiBbJ2InLCAnYyddXG4gKiAgICAgIFIuc2xpY2UoMCwgMywgJ3JhbWRhJyk7ICAgICAgICAgICAgICAgICAgICAgLy89PiAncmFtJ1xuICovXG52YXIgc2xpY2UgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MyggLyojX19QVVJFX18qL19jaGVja0Zvck1ldGhvZCgnc2xpY2UnLCBmdW5jdGlvbiBzbGljZShmcm9tSW5kZXgsIHRvSW5kZXgsIGxpc3QpIHtcbiAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGxpc3QsIGZyb21JbmRleCwgdG9JbmRleCk7XG59KSk7XG5leHBvcnQgZGVmYXVsdCBzbGljZTsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyBhIGNvcHkgb2YgdGhlIGxpc3QsIHNvcnRlZCBhY2NvcmRpbmcgdG8gdGhlIGNvbXBhcmF0b3IgZnVuY3Rpb24sXG4gKiB3aGljaCBzaG91bGQgYWNjZXB0IHR3byB2YWx1ZXMgYXQgYSB0aW1lIGFuZCByZXR1cm4gYSBuZWdhdGl2ZSBudW1iZXIgaWYgdGhlXG4gKiBmaXJzdCB2YWx1ZSBpcyBzbWFsbGVyLCBhIHBvc2l0aXZlIG51bWJlciBpZiBpdCdzIGxhcmdlciwgYW5kIHplcm8gaWYgdGhleVxuICogYXJlIGVxdWFsLiBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgaXMgYSAqKmNvcHkqKiBvZiB0aGUgbGlzdC4gSXQgZG9lcyBub3RcbiAqIG1vZGlmeSB0aGUgb3JpZ2luYWwuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyAoKGEsIGEpIC0+IE51bWJlcikgLT4gW2FdIC0+IFthXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY29tcGFyYXRvciBBIHNvcnRpbmcgZnVuY3Rpb24gOjogYSAtPiBiIC0+IEludFxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgbGlzdCB0byBzb3J0XG4gKiBAcmV0dXJuIHtBcnJheX0gYSBuZXcgYXJyYXkgd2l0aCBpdHMgZWxlbWVudHMgc29ydGVkIGJ5IHRoZSBjb21wYXJhdG9yIGZ1bmN0aW9uLlxuICogQHNlZSBSLmFzY2VuZCwgUi5kZXNjZW5kXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgZGlmZiA9IGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuIGEgLSBiOyB9O1xuICogICAgICBSLnNvcnQoZGlmZiwgWzQsMiw3LDVdKTsgLy89PiBbMiwgNCwgNSwgN11cbiAqL1xudmFyIHNvcnQgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiBzb3J0KGNvbXBhcmF0b3IsIGxpc3QpIHtcbiAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGxpc3QsIDApLnNvcnQoY29tcGFyYXRvcik7XG59KTtcbmV4cG9ydCBkZWZhdWx0IHNvcnQ7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IGVxdWFscyBmcm9tIFwiLi9lcXVhbHMuanNcIjtcbmltcG9ydCB0YWtlIGZyb20gXCIuL3Rha2UuanNcIjtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBsaXN0IHN0YXJ0cyB3aXRoIHRoZSBwcm92aWRlZCBzdWJsaXN0LlxuICpcbiAqIFNpbWlsYXJseSwgY2hlY2tzIGlmIGEgc3RyaW5nIHN0YXJ0cyB3aXRoIHRoZSBwcm92aWRlZCBzdWJzdHJpbmcuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMjQuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgW2FdIC0+IFthXSAtPiBCb29sZWFuXG4gKiBAc2lnIFN0cmluZyAtPiBTdHJpbmcgLT4gQm9vbGVhblxuICogQHBhcmFtIHsqfSBwcmVmaXhcbiAqIEBwYXJhbSB7Kn0gbGlzdFxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBzZWUgUi5lbmRzV2l0aFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuc3RhcnRzV2l0aCgnYScsICdhYmMnKSAgICAgICAgICAgICAgICAvLz0+IHRydWVcbiAqICAgICAgUi5zdGFydHNXaXRoKCdiJywgJ2FiYycpICAgICAgICAgICAgICAgIC8vPT4gZmFsc2VcbiAqICAgICAgUi5zdGFydHNXaXRoKFsnYSddLCBbJ2EnLCAnYicsICdjJ10pICAgIC8vPT4gdHJ1ZVxuICogICAgICBSLnN0YXJ0c1dpdGgoWydiJ10sIFsnYScsICdiJywgJ2MnXSkgICAgLy89PiBmYWxzZVxuICovXG52YXIgc3RhcnRzV2l0aCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIChwcmVmaXgsIGxpc3QpIHtcbiAgcmV0dXJuIGVxdWFscyh0YWtlKHByZWZpeC5sZW5ndGgsIGxpc3QpLCBwcmVmaXgpO1xufSk7XG5leHBvcnQgZGVmYXVsdCBzdGFydHNXaXRoOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfZGlzcGF0Y2hhYmxlIGZyb20gXCIuL2ludGVybmFsL19kaXNwYXRjaGFibGUuanNcIjtcbmltcG9ydCBfeHRha2UgZnJvbSBcIi4vaW50ZXJuYWwvX3h0YWtlLmpzXCI7XG5pbXBvcnQgc2xpY2UgZnJvbSBcIi4vc2xpY2UuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBmaXJzdCBgbmAgZWxlbWVudHMgb2YgdGhlIGdpdmVuIGxpc3QsIHN0cmluZywgb3JcbiAqIHRyYW5zZHVjZXIvdHJhbnNmb3JtZXIgKG9yIG9iamVjdCB3aXRoIGEgYHRha2VgIG1ldGhvZCkuXG4gKlxuICogRGlzcGF0Y2hlcyB0byB0aGUgYHRha2VgIG1ldGhvZCBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50LCBpZiBwcmVzZW50LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgTnVtYmVyIC0+IFthXSAtPiBbYV1cbiAqIEBzaWcgTnVtYmVyIC0+IFN0cmluZyAtPiBTdHJpbmdcbiAqIEBwYXJhbSB7TnVtYmVyfSBuXG4gKiBAcGFyYW0geyp9IGxpc3RcbiAqIEByZXR1cm4geyp9XG4gKiBAc2VlIFIuZHJvcFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIudGFrZSgxLCBbJ2ZvbycsICdiYXInLCAnYmF6J10pOyAvLz0+IFsnZm9vJ11cbiAqICAgICAgUi50YWtlKDIsIFsnZm9vJywgJ2JhcicsICdiYXonXSk7IC8vPT4gWydmb28nLCAnYmFyJ11cbiAqICAgICAgUi50YWtlKDMsIFsnZm9vJywgJ2JhcicsICdiYXonXSk7IC8vPT4gWydmb28nLCAnYmFyJywgJ2JheiddXG4gKiAgICAgIFIudGFrZSg0LCBbJ2ZvbycsICdiYXInLCAnYmF6J10pOyAvLz0+IFsnZm9vJywgJ2JhcicsICdiYXonXVxuICogICAgICBSLnRha2UoMywgJ3JhbWRhJyk7ICAgICAgICAgICAgICAgLy89PiAncmFtJ1xuICpcbiAqICAgICAgY29uc3QgcGVyc29ubmVsID0gW1xuICogICAgICAgICdEYXZlIEJydWJlY2snLFxuICogICAgICAgICdQYXVsIERlc21vbmQnLFxuICogICAgICAgICdFdWdlbmUgV3JpZ2h0JyxcbiAqICAgICAgICAnSm9lIE1vcmVsbG8nLFxuICogICAgICAgICdHZXJyeSBNdWxsaWdhbicsXG4gKiAgICAgICAgJ0JvYiBCYXRlcycsXG4gKiAgICAgICAgJ0pvZSBEb2RnZScsXG4gKiAgICAgICAgJ1JvbiBDcm90dHknXG4gKiAgICAgIF07XG4gKlxuICogICAgICBjb25zdCB0YWtlRml2ZSA9IFIudGFrZSg1KTtcbiAqICAgICAgdGFrZUZpdmUocGVyc29ubmVsKTtcbiAqICAgICAgLy89PiBbJ0RhdmUgQnJ1YmVjaycsICdQYXVsIERlc21vbmQnLCAnRXVnZW5lIFdyaWdodCcsICdKb2UgTW9yZWxsbycsICdHZXJyeSBNdWxsaWdhbiddXG4gKiBAc3ltYiBSLnRha2UoLTEsIFthLCBiXSkgPSBbYSwgYl1cbiAqIEBzeW1iIFIudGFrZSgwLCBbYSwgYl0pID0gW11cbiAqIEBzeW1iIFIudGFrZSgxLCBbYSwgYl0pID0gW2FdXG4gKiBAc3ltYiBSLnRha2UoMiwgW2EsIGJdKSA9IFthLCBiXVxuICovXG52YXIgdGFrZSA9IC8qI19fUFVSRV9fKi9fY3VycnkyKCAvKiNfX1BVUkVfXyovX2Rpc3BhdGNoYWJsZShbJ3Rha2UnXSwgX3h0YWtlLCBmdW5jdGlvbiB0YWtlKG4sIHhzKSB7XG4gIHJldHVybiBzbGljZSgwLCBuIDwgMCA/IEluZmluaXR5IDogbiwgeHMpO1xufSkpO1xuZXhwb3J0IGRlZmF1bHQgdGFrZTsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5pbXBvcnQgX2hhcyBmcm9tIFwiLi9pbnRlcm5hbC9faGFzLmpzXCI7XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IGludG8gYW4gYXJyYXkgb2Yga2V5LCB2YWx1ZSBhcnJheXMuIE9ubHkgdGhlIG9iamVjdCdzXG4gKiBvd24gcHJvcGVydGllcyBhcmUgdXNlZC5cbiAqIE5vdGUgdGhhdCB0aGUgb3JkZXIgb2YgdGhlIG91dHB1dCBhcnJheSBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBjb25zaXN0ZW50XG4gKiBhY3Jvc3MgZGlmZmVyZW50IEpTIHBsYXRmb3Jtcy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC40LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcge1N0cmluZzogKn0gLT4gW1tTdHJpbmcsKl1dXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gZXh0cmFjdCBmcm9tXG4gKiBAcmV0dXJuIHtBcnJheX0gQW4gYXJyYXkgb2Yga2V5LCB2YWx1ZSBhcnJheXMgZnJvbSB0aGUgb2JqZWN0J3Mgb3duIHByb3BlcnRpZXMuXG4gKiBAc2VlIFIuZnJvbVBhaXJzLCBSLmtleXMsIFIudmFsdWVzXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi50b1BhaXJzKHthOiAxLCBiOiAyLCBjOiAzfSk7IC8vPT4gW1snYScsIDFdLCBbJ2InLCAyXSwgWydjJywgM11dXG4gKi9cbnZhciB0b1BhaXJzID0gLyojX19QVVJFX18qL19jdXJyeTEoZnVuY3Rpb24gdG9QYWlycyhvYmopIHtcbiAgdmFyIHBhaXJzID0gW107XG4gIGZvciAodmFyIHByb3AgaW4gb2JqKSB7XG4gICAgaWYgKF9oYXMocHJvcCwgb2JqKSkge1xuICAgICAgcGFpcnNbcGFpcnMubGVuZ3RoXSA9IFtwcm9wLCBvYmpbcHJvcF1dO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcGFpcnM7XG59KTtcbmV4cG9ydCBkZWZhdWx0IHRvUGFpcnM7IiwiaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5MS5qc1wiO1xuaW1wb3J0IF90b1N0cmluZyBmcm9tIFwiLi9pbnRlcm5hbC9fdG9TdHJpbmcuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIHZhbHVlLiBgZXZhbGAnaW5nIHRoZSBvdXRwdXRcbiAqIHNob3VsZCByZXN1bHQgaW4gYSB2YWx1ZSBlcXVpdmFsZW50IHRvIHRoZSBpbnB1dCB2YWx1ZS4gTWFueSBvZiB0aGUgYnVpbHQtaW5cbiAqIGB0b1N0cmluZ2AgbWV0aG9kcyBkbyBub3Qgc2F0aXNmeSB0aGlzIHJlcXVpcmVtZW50LlxuICpcbiAqIElmIHRoZSBnaXZlbiB2YWx1ZSBpcyBhbiBgW29iamVjdCBPYmplY3RdYCB3aXRoIGEgYHRvU3RyaW5nYCBtZXRob2Qgb3RoZXJcbiAqIHRoYW4gYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgLCB0aGlzIG1ldGhvZCBpcyBpbnZva2VkIHdpdGggbm8gYXJndW1lbnRzXG4gKiB0byBwcm9kdWNlIHRoZSByZXR1cm4gdmFsdWUuIFRoaXMgbWVhbnMgdXNlci1kZWZpbmVkIGNvbnN0cnVjdG9yIGZ1bmN0aW9uc1xuICogY2FuIHByb3ZpZGUgYSBzdWl0YWJsZSBgdG9TdHJpbmdgIG1ldGhvZC4gRm9yIGV4YW1wbGU6XG4gKlxuICogICAgIGZ1bmN0aW9uIFBvaW50KHgsIHkpIHtcbiAqICAgICAgIHRoaXMueCA9IHg7XG4gKiAgICAgICB0aGlzLnkgPSB5O1xuICogICAgIH1cbiAqXG4gKiAgICAgUG9pbnQucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gKiAgICAgICByZXR1cm4gJ25ldyBQb2ludCgnICsgdGhpcy54ICsgJywgJyArIHRoaXMueSArICcpJztcbiAqICAgICB9O1xuICpcbiAqICAgICBSLnRvU3RyaW5nKG5ldyBQb2ludCgxLCAyKSk7IC8vPT4gJ25ldyBQb2ludCgxLCAyKSdcbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xNC4wXG4gKiBAY2F0ZWdvcnkgU3RyaW5nXG4gKiBAc2lnICogLT4gU3RyaW5nXG4gKiBAcGFyYW0geyp9IHZhbFxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIudG9TdHJpbmcoNDIpOyAvLz0+ICc0MidcbiAqICAgICAgUi50b1N0cmluZygnYWJjJyk7IC8vPT4gJ1wiYWJjXCInXG4gKiAgICAgIFIudG9TdHJpbmcoWzEsIDIsIDNdKTsgLy89PiAnWzEsIDIsIDNdJ1xuICogICAgICBSLnRvU3RyaW5nKHtmb286IDEsIGJhcjogMiwgYmF6OiAzfSk7IC8vPT4gJ3tcImJhclwiOiAyLCBcImJhelwiOiAzLCBcImZvb1wiOiAxfSdcbiAqICAgICAgUi50b1N0cmluZyhuZXcgRGF0ZSgnMjAwMS0wMi0wM1QwNDowNTowNlonKSk7IC8vPT4gJ25ldyBEYXRlKFwiMjAwMS0wMi0wM1QwNDowNTowNi4wMDBaXCIpJ1xuICovXG52YXIgdG9TdHJpbmcgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MShmdW5jdGlvbiB0b1N0cmluZyh2YWwpIHtcbiAgcmV0dXJuIF90b1N0cmluZyh2YWwsIFtdKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgdG9TdHJpbmc7IiwiaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5MS5qc1wiO1xuXG4vKipcbiAqIEdpdmVzIGEgc2luZ2xlLXdvcmQgc3RyaW5nIGRlc2NyaXB0aW9uIG9mIHRoZSAobmF0aXZlKSB0eXBlIG9mIGEgdmFsdWUsXG4gKiByZXR1cm5pbmcgc3VjaCBhbnN3ZXJzIGFzICdPYmplY3QnLCAnTnVtYmVyJywgJ0FycmF5Jywgb3IgJ051bGwnLiBEb2VzIG5vdFxuICogYXR0ZW1wdCB0byBkaXN0aW5ndWlzaCB1c2VyIE9iamVjdCB0eXBlcyBhbnkgZnVydGhlciwgcmVwb3J0aW5nIHRoZW0gYWxsIGFzXG4gKiAnT2JqZWN0Jy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC44LjBcbiAqIEBjYXRlZ29yeSBUeXBlXG4gKiBAc2lnICogLT4gU3RyaW5nXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIudHlwZSh7fSk7IC8vPT4gXCJPYmplY3RcIlxuICogICAgICBSLnR5cGUoMSk7IC8vPT4gXCJOdW1iZXJcIlxuICogICAgICBSLnR5cGUoZmFsc2UpOyAvLz0+IFwiQm9vbGVhblwiXG4gKiAgICAgIFIudHlwZSgncycpOyAvLz0+IFwiU3RyaW5nXCJcbiAqICAgICAgUi50eXBlKG51bGwpOyAvLz0+IFwiTnVsbFwiXG4gKiAgICAgIFIudHlwZShbXSk7IC8vPT4gXCJBcnJheVwiXG4gKiAgICAgIFIudHlwZSgvW0Etel0vKTsgLy89PiBcIlJlZ0V4cFwiXG4gKiAgICAgIFIudHlwZSgoKSA9PiB7fSk7IC8vPT4gXCJGdW5jdGlvblwiXG4gKiAgICAgIFIudHlwZShhc3luYyAoKSA9PiB7fSk7IC8vPT4gXCJBc3luY0Z1bmN0aW9uXCJcbiAqICAgICAgUi50eXBlKHVuZGVmaW5lZCk7IC8vPT4gXCJVbmRlZmluZWRcIlxuICogICAgICBSLnR5cGUoQmlnSW50KDEyMykpOyAvLz0+IFwiQmlnSW50XCJcbiAqL1xudmFyIHR5cGUgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MShmdW5jdGlvbiB0eXBlKHZhbCkge1xuICByZXR1cm4gdmFsID09PSBudWxsID8gJ051bGwnIDogdmFsID09PSB1bmRlZmluZWQgPyAnVW5kZWZpbmVkJyA6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWwpLnNsaWNlKDgsIC0xKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgdHlwZTsiLCJpbXBvcnQgaWRlbnRpdHkgZnJvbSBcIi4vaWRlbnRpdHkuanNcIjtcbmltcG9ydCB1bmlxQnkgZnJvbSBcIi4vdW5pcUJ5LmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyBhIG5ldyBsaXN0IGNvbnRhaW5pbmcgb25seSBvbmUgY29weSBvZiBlYWNoIGVsZW1lbnQgaW4gdGhlIG9yaWdpbmFsXG4gKiBsaXN0LiBbYFIuZXF1YWxzYF0oI2VxdWFscykgaXMgdXNlZCB0byBkZXRlcm1pbmUgZXF1YWxpdHkuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBbYV0gLT4gW2FdXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBhcnJheSB0byBjb25zaWRlci5cbiAqIEByZXR1cm4ge0FycmF5fSBUaGUgbGlzdCBvZiB1bmlxdWUgaXRlbXMuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi51bmlxKFsxLCAxLCAyLCAxXSk7IC8vPT4gWzEsIDJdXG4gKiAgICAgIFIudW5pcShbMSwgJzEnXSk7ICAgICAvLz0+IFsxLCAnMSddXG4gKiAgICAgIFIudW5pcShbWzQyXSwgWzQyXV0pOyAvLz0+IFtbNDJdXVxuICovXG52YXIgdW5pcSA9IC8qI19fUFVSRV9fKi91bmlxQnkoaWRlbnRpdHkpO1xuZXhwb3J0IGRlZmF1bHQgdW5pcTsiLCJpbXBvcnQgX1NldCBmcm9tIFwiLi9pbnRlcm5hbC9fU2V0LmpzXCI7XG5pbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX2Rpc3BhdGNoYWJsZSBmcm9tIFwiLi9pbnRlcm5hbC9fZGlzcGF0Y2hhYmxlLmpzXCI7XG5pbXBvcnQgX3h1bmlxQnkgZnJvbSBcIi4vaW50ZXJuYWwvX3h1bmlxQnkuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IGxpc3QgY29udGFpbmluZyBvbmx5IG9uZSBjb3B5IG9mIGVhY2ggZWxlbWVudCBpbiB0aGUgb3JpZ2luYWxcbiAqIGxpc3QsIGJhc2VkIHVwb24gdGhlIHZhbHVlIHJldHVybmVkIGJ5IGFwcGx5aW5nIHRoZSBzdXBwbGllZCBmdW5jdGlvbiB0b1xuICogZWFjaCBsaXN0IGVsZW1lbnQuIFByZWZlcnMgdGhlIGZpcnN0IGl0ZW0gaWYgdGhlIHN1cHBsaWVkIGZ1bmN0aW9uIHByb2R1Y2VzXG4gKiB0aGUgc2FtZSB2YWx1ZSBvbiB0d28gaXRlbXMuIFtgUi5lcXVhbHNgXSgjZXF1YWxzKSBpcyB1c2VkIGZvciBjb21wYXJpc29uLlxuICpcbiAqIEFjdHMgYXMgYSB0cmFuc2R1Y2VyIGlmIGEgdHJhbnNmb3JtZXIgaXMgZ2l2ZW4gaW4gbGlzdCBwb3NpdGlvbi5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xNi4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyAoYSAtPiBiKSAtPiBbYV0gLT4gW2FdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBBIGZ1bmN0aW9uIHVzZWQgdG8gcHJvZHVjZSBhIHZhbHVlIHRvIHVzZSBkdXJpbmcgY29tcGFyaXNvbnMuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBhcnJheSB0byBjb25zaWRlci5cbiAqIEByZXR1cm4ge0FycmF5fSBUaGUgbGlzdCBvZiB1bmlxdWUgaXRlbXMuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi51bmlxQnkoTWF0aC5hYnMsIFstMSwgLTUsIDIsIDEwLCAxLCAyXSk7IC8vPT4gWy0xLCAtNSwgMiwgMTBdXG4gKi9cbnZhciB1bmlxQnkgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MiggLyojX19QVVJFX18qL19kaXNwYXRjaGFibGUoW10sIF94dW5pcUJ5LCBmdW5jdGlvbiAoZm4sIGxpc3QpIHtcbiAgdmFyIHNldCA9IG5ldyBfU2V0KCk7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGlkeCA9IDA7XG4gIHZhciBhcHBsaWVkSXRlbSwgaXRlbTtcbiAgd2hpbGUgKGlkeCA8IGxpc3QubGVuZ3RoKSB7XG4gICAgaXRlbSA9IGxpc3RbaWR4XTtcbiAgICBhcHBsaWVkSXRlbSA9IGZuKGl0ZW0pO1xuICAgIGlmIChzZXQuYWRkKGFwcGxpZWRJdGVtKSkge1xuICAgICAgcmVzdWx0LnB1c2goaXRlbSk7XG4gICAgfVxuICAgIGlkeCArPSAxO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59KSk7XG5leHBvcnQgZGVmYXVsdCB1bmlxQnk7IiwiaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5MS5qc1wiO1xuaW1wb3J0IGtleXMgZnJvbSBcIi4va2V5cy5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCB0aGUgZW51bWVyYWJsZSBvd24gcHJvcGVydGllcyBvZiB0aGUgc3VwcGxpZWQgb2JqZWN0LlxuICogTm90ZSB0aGF0IHRoZSBvcmRlciBvZiB0aGUgb3V0cHV0IGFycmF5IGlzIG5vdCBndWFyYW50ZWVkIGFjcm9zcyBkaWZmZXJlbnRcbiAqIEpTIHBsYXRmb3Jtcy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcge2s6IHZ9IC0+IFt2XVxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIGV4dHJhY3QgdmFsdWVzIGZyb21cbiAqIEByZXR1cm4ge0FycmF5fSBBbiBhcnJheSBvZiB0aGUgdmFsdWVzIG9mIHRoZSBvYmplY3QncyBvd24gcHJvcGVydGllcy5cbiAqIEBzZWUgUi52YWx1ZXNJbiwgUi5rZXlzLCBSLnRvUGFpcnNcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnZhbHVlcyh7YTogMSwgYjogMiwgYzogM30pOyAvLz0+IFsxLCAyLCAzXVxuICovXG52YXIgdmFsdWVzID0gLyojX19QVVJFX18qL19jdXJyeTEoZnVuY3Rpb24gdmFsdWVzKG9iaikge1xuICB2YXIgcHJvcHMgPSBrZXlzKG9iaik7XG4gIHZhciBsZW4gPSBwcm9wcy5sZW5ndGg7XG4gIHZhciB2YWxzID0gW107XG4gIHZhciBpZHggPSAwO1xuICB3aGlsZSAoaWR4IDwgbGVuKSB7XG4gICAgdmFsc1tpZHhdID0gb2JqW3Byb3BzW2lkeF1dO1xuICAgIGlkeCArPSAxO1xuICB9XG4gIHJldHVybiB2YWxzO1xufSk7XG5leHBvcnQgZGVmYXVsdCB2YWx1ZXM7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuXG4vLyBgQ29uc3RgIGlzIGEgZnVuY3RvciB0aGF0IGVmZmVjdGl2ZWx5IGlnbm9yZXMgdGhlIGZ1bmN0aW9uIGdpdmVuIHRvIGBtYXBgLlxudmFyIENvbnN0ID0gZnVuY3Rpb24gKHgpIHtcbiAgcmV0dXJuIHtcbiAgICB2YWx1ZTogeCxcbiAgICAnZmFudGFzeS1sYW5kL21hcCc6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhIFwidmlld1wiIG9mIHRoZSBnaXZlbiBkYXRhIHN0cnVjdHVyZSwgZGV0ZXJtaW5lZCBieSB0aGUgZ2l2ZW4gbGVucy5cbiAqIFRoZSBsZW5zJ3MgZm9jdXMgZGV0ZXJtaW5lcyB3aGljaCBwb3J0aW9uIG9mIHRoZSBkYXRhIHN0cnVjdHVyZSBpcyB2aXNpYmxlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE2LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEB0eXBlZGVmbiBMZW5zIHMgYSA9IEZ1bmN0b3IgZiA9PiAoYSAtPiBmIGEpIC0+IHMgLT4gZiBzXG4gKiBAc2lnIExlbnMgcyBhIC0+IHMgLT4gYVxuICogQHBhcmFtIHtMZW5zfSBsZW5zXG4gKiBAcGFyYW0geyp9IHhcbiAqIEByZXR1cm4geyp9XG4gKiBAc2VlIFIuc2V0LCBSLm92ZXIsIFIubGVucywgUi5sZW5zSW5kZXgsIFIubGVuc1Byb3AsIFIubGVuc1BhdGhcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCB4TGVucyA9IFIubGVuc1Byb3AoJ3gnKTtcbiAqXG4gKiAgICAgIFIudmlldyh4TGVucywge3g6IDEsIHk6IDJ9KTsgIC8vPT4gMVxuICogICAgICBSLnZpZXcoeExlbnMsIHt4OiA0LCB5OiAyfSk7ICAvLz0+IDRcbiAqL1xudmFyIHZpZXcgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiB2aWV3KGxlbnMsIHgpIHtcbiAgLy8gVXNpbmcgYENvbnN0YCBlZmZlY3RpdmVseSBpZ25vcmVzIHRoZSBzZXR0ZXIgZnVuY3Rpb24gb2YgdGhlIGBsZW5zYCxcbiAgLy8gbGVhdmluZyB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIGdldHRlciBmdW5jdGlvbiB1bm1vZGlmaWVkLlxuICByZXR1cm4gbGVucyhDb25zdCkoeCkudmFsdWU7XG59KTtcbmV4cG9ydCBkZWZhdWx0IHZpZXc7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgbGlzdCBvdXQgb2YgdGhlIHR3byBzdXBwbGllZCBieSBwYWlyaW5nIHVwIGVxdWFsbHktcG9zaXRpb25lZFxuICogaXRlbXMgZnJvbSBib3RoIGxpc3RzLiBUaGUgcmV0dXJuZWQgbGlzdCBpcyB0cnVuY2F0ZWQgdG8gdGhlIGxlbmd0aCBvZiB0aGVcbiAqIHNob3J0ZXIgb2YgdGhlIHR3byBpbnB1dCBsaXN0cy5cbiAqIE5vdGU6IGB6aXBgIGlzIGVxdWl2YWxlbnQgdG8gYHppcFdpdGgoZnVuY3Rpb24oYSwgYikgeyByZXR1cm4gW2EsIGJdIH0pYC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIFthXSAtPiBbYl0gLT4gW1thLGJdXVxuICogQHBhcmFtIHtBcnJheX0gbGlzdDEgVGhlIGZpcnN0IGFycmF5IHRvIGNvbnNpZGVyLlxuICogQHBhcmFtIHtBcnJheX0gbGlzdDIgVGhlIHNlY29uZCBhcnJheSB0byBjb25zaWRlci5cbiAqIEByZXR1cm4ge0FycmF5fSBUaGUgbGlzdCBtYWRlIGJ5IHBhaXJpbmcgdXAgc2FtZS1pbmRleGVkIGVsZW1lbnRzIG9mIGBsaXN0MWAgYW5kIGBsaXN0MmAuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi56aXAoWzEsIDIsIDNdLCBbJ2EnLCAnYicsICdjJ10pOyAvLz0+IFtbMSwgJ2EnXSwgWzIsICdiJ10sIFszLCAnYyddXVxuICogQHN5bWIgUi56aXAoW2EsIGIsIGNdLCBbZCwgZSwgZl0pID0gW1thLCBkXSwgW2IsIGVdLCBbYywgZl1dXG4gKi9cbnZhciB6aXAgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiB6aXAoYSwgYikge1xuICB2YXIgbGVuID0gTWF0aC5taW4oYS5sZW5ndGgsIGIubGVuZ3RoKTtcbiAgdmFyIHJ2ID0gQXJyYXkobGVuKTtcbiAgdmFyIGlkeCA9IDA7XG4gIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICBydltpZHhdID0gW2FbaWR4XSwgYltpZHhdXTtcbiAgICBpZHggKz0gMTtcbiAgfVxuICByZXR1cm4gcnY7XG59KTtcbmV4cG9ydCBkZWZhdWx0IHppcDsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBvYmplY3Qgb3V0IG9mIGEgbGlzdCBvZiBrZXlzIGFuZCBhIGxpc3Qgb2YgdmFsdWVzLlxuICogS2V5L3ZhbHVlIHBhaXJpbmcgaXMgdHJ1bmNhdGVkIHRvIHRoZSBsZW5ndGggb2YgdGhlIHNob3J0ZXIgb2YgdGhlIHR3byBsaXN0cy5cbiAqIE5vdGU6IGB6aXBPYmpgIGlzIGVxdWl2YWxlbnQgdG8gYHBpcGUoemlwLCBmcm9tUGFpcnMpYC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4zLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIFtTdHJpbmddIC0+IFsqXSAtPiB7U3RyaW5nOiAqfVxuICogQHBhcmFtIHtBcnJheX0ga2V5cyBUaGUgYXJyYXkgdGhhdCB3aWxsIGJlIHByb3BlcnRpZXMgb24gdGhlIG91dHB1dCBvYmplY3QuXG4gKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIGxpc3Qgb2YgdmFsdWVzIG9uIHRoZSBvdXRwdXQgb2JqZWN0LlxuICogQHJldHVybiB7T2JqZWN0fSBUaGUgb2JqZWN0IG1hZGUgYnkgcGFpcmluZyB1cCBzYW1lLWluZGV4ZWQgZWxlbWVudHMgb2YgYGtleXNgIGFuZCBgdmFsdWVzYC5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnppcE9iaihbJ2EnLCAnYicsICdjJ10sIFsxLCAyLCAzXSk7IC8vPT4ge2E6IDEsIGI6IDIsIGM6IDN9XG4gKi9cbnZhciB6aXBPYmogPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiB6aXBPYmooa2V5cywgdmFsdWVzKSB7XG4gIHZhciBpZHggPSAwO1xuICB2YXIgbGVuID0gTWF0aC5taW4oa2V5cy5sZW5ndGgsIHZhbHVlcy5sZW5ndGgpO1xuICB2YXIgb3V0ID0ge307XG4gIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICBvdXRba2V5c1tpZHhdXSA9IHZhbHVlc1tpZHhdO1xuICAgIGlkeCArPSAxO1xuICB9XG4gIHJldHVybiBvdXQ7XG59KTtcbmV4cG9ydCBkZWZhdWx0IHppcE9iajsiLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDI2LCBUaGUgQ3l0b3NjYXBlIENvbnNvcnRpdW0uXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZlxuICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUg4oCcU29mdHdhcmXigJ0pLCB0byBkZWFsIGluXG4gKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvXG4gKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllc1xuICogb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvXG4gKiBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4gKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCDigJxBUyBJU+KAnSwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICogU09GVFdBUkUuXG4gKi9cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkociwgYSkge1xuICAobnVsbCA9PSBhIHx8IGEgPiByLmxlbmd0aCkgJiYgKGEgPSByLmxlbmd0aCk7XG4gIGZvciAodmFyIGUgPSAwLCBuID0gQXJyYXkoYSk7IGUgPCBhOyBlKyspIG5bZV0gPSByW2VdO1xuICByZXR1cm4gbjtcbn1cbmZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhyKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHIpKSByZXR1cm4gcjtcbn1cbmZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhyKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHIpKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkocik7XG59XG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soYSwgbikge1xuICBpZiAoIShhIGluc3RhbmNlb2YgbikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG59XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyhlLCByKSB7XG4gIGZvciAodmFyIHQgPSAwOyB0IDwgci5sZW5ndGg7IHQrKykge1xuICAgIHZhciBvID0gclt0XTtcbiAgICBvLmVudW1lcmFibGUgPSBvLmVudW1lcmFibGUgfHwgZmFsc2UsIG8uY29uZmlndXJhYmxlID0gdHJ1ZSwgXCJ2YWx1ZVwiIGluIG8gJiYgKG8ud3JpdGFibGUgPSB0cnVlKSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIF90b1Byb3BlcnR5S2V5KG8ua2V5KSwgbyk7XG4gIH1cbn1cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhlLCByLCB0KSB7XG4gIHJldHVybiByICYmIF9kZWZpbmVQcm9wZXJ0aWVzKGUucHJvdG90eXBlLCByKSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwicHJvdG90eXBlXCIsIHtcbiAgICB3cml0YWJsZTogZmFsc2VcbiAgfSksIGU7XG59XG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihyLCBlKSB7XG4gIHZhciB0ID0gXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2YgU3ltYm9sICYmIHJbU3ltYm9sLml0ZXJhdG9yXSB8fCByW1wiQEBpdGVyYXRvclwiXTtcbiAgaWYgKCF0KSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocikgfHwgKHQgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkocikpIHx8IGUpIHtcbiAgICAgIHQgJiYgKHIgPSB0KTtcbiAgICAgIHZhciBuID0gMCxcbiAgICAgICAgRiA9IGZ1bmN0aW9uICgpIHt9O1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgczogRixcbiAgICAgICAgbjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBuID49IHIubGVuZ3RoID8ge1xuICAgICAgICAgICAgZG9uZTogdHJ1ZVxuICAgICAgICAgIH0gOiB7XG4gICAgICAgICAgICBkb25lOiBmYWxzZSxcbiAgICAgICAgICAgIHZhbHVlOiByW24rK11cbiAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBlOiBmdW5jdGlvbiAocikge1xuICAgICAgICAgIHRocm93IHI7XG4gICAgICAgIH0sXG4gICAgICAgIGY6IEZcbiAgICAgIH07XG4gICAgfVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTtcbiAgfVxuICB2YXIgbyxcbiAgICBhID0gdHJ1ZSxcbiAgICB1ID0gZmFsc2U7XG4gIHJldHVybiB7XG4gICAgczogZnVuY3Rpb24gKCkge1xuICAgICAgdCA9IHQuY2FsbChyKTtcbiAgICB9LFxuICAgIG46IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciByID0gdC5uZXh0KCk7XG4gICAgICByZXR1cm4gYSA9IHIuZG9uZSwgcjtcbiAgICB9LFxuICAgIGU6IGZ1bmN0aW9uIChyKSB7XG4gICAgICB1ID0gdHJ1ZSwgbyA9IHI7XG4gICAgfSxcbiAgICBmOiBmdW5jdGlvbiAoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhIHx8IG51bGwgPT0gdC5yZXR1cm4gfHwgdC5yZXR1cm4oKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmICh1KSB0aHJvdyBvO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eSQxKGUsIHIsIHQpIHtcbiAgcmV0dXJuIChyID0gX3RvUHJvcGVydHlLZXkocikpIGluIGUgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgciwge1xuICAgIHZhbHVlOiB0LFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIHdyaXRhYmxlOiB0cnVlXG4gIH0pIDogZVtyXSA9IHQsIGU7XG59XG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KHIpIHtcbiAgaWYgKFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIFN5bWJvbCAmJiBudWxsICE9IHJbU3ltYm9sLml0ZXJhdG9yXSB8fCBudWxsICE9IHJbXCJAQGl0ZXJhdG9yXCJdKSByZXR1cm4gQXJyYXkuZnJvbShyKTtcbn1cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdChyLCBsKSB7XG4gIHZhciB0ID0gbnVsbCA9PSByID8gbnVsbCA6IFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIFN5bWJvbCAmJiByW1N5bWJvbC5pdGVyYXRvcl0gfHwgcltcIkBAaXRlcmF0b3JcIl07XG4gIGlmIChudWxsICE9IHQpIHtcbiAgICB2YXIgZSxcbiAgICAgIG4sXG4gICAgICBpLFxuICAgICAgdSxcbiAgICAgIGEgPSBbXSxcbiAgICAgIGYgPSB0cnVlLFxuICAgICAgbyA9IGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICBpZiAoaSA9ICh0ID0gdC5jYWxsKHIpKS5uZXh0LCAwID09PSBsKSB7XG4gICAgICAgIGlmIChPYmplY3QodCkgIT09IHQpIHJldHVybjtcbiAgICAgICAgZiA9ICExO1xuICAgICAgfSBlbHNlIGZvciAoOyAhKGYgPSAoZSA9IGkuY2FsbCh0KSkuZG9uZSkgJiYgKGEucHVzaChlLnZhbHVlKSwgYS5sZW5ndGggIT09IGwpOyBmID0gITApO1xuICAgIH0gY2F0Y2ggKHIpIHtcbiAgICAgIG8gPSB0cnVlLCBuID0gcjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFmICYmIG51bGwgIT0gdC5yZXR1cm4gJiYgKHUgPSB0LnJldHVybigpLCBPYmplY3QodSkgIT09IHUpKSByZXR1cm47XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAobykgdGhyb3cgbjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGE7XG4gIH1cbn1cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG59XG5mdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpO1xufVxuZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkociwgZSkge1xuICByZXR1cm4gX2FycmF5V2l0aEhvbGVzKHIpIHx8IF9pdGVyYWJsZVRvQXJyYXlMaW1pdChyLCBlKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkociwgZSkgfHwgX25vbkl0ZXJhYmxlUmVzdCgpO1xufVxuZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KHIpIHtcbiAgcmV0dXJuIF9hcnJheVdpdGhvdXRIb2xlcyhyKSB8fCBfaXRlcmFibGVUb0FycmF5KHIpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShyKSB8fCBfbm9uSXRlcmFibGVTcHJlYWQoKTtcbn1cbmZ1bmN0aW9uIF90b1ByaW1pdGl2ZSh0LCByKSB7XG4gIGlmIChcIm9iamVjdFwiICE9IHR5cGVvZiB0IHx8ICF0KSByZXR1cm4gdDtcbiAgdmFyIGUgPSB0W1N5bWJvbC50b1ByaW1pdGl2ZV07XG4gIGlmICh2b2lkIDAgIT09IGUpIHtcbiAgICB2YXIgaSA9IGUuY2FsbCh0LCByKTtcbiAgICBpZiAoXCJvYmplY3RcIiAhPSB0eXBlb2YgaSkgcmV0dXJuIGk7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuXCIpO1xuICB9XG4gIHJldHVybiAoU3RyaW5nICkodCk7XG59XG5mdW5jdGlvbiBfdG9Qcm9wZXJ0eUtleSh0KSB7XG4gIHZhciBpID0gX3RvUHJpbWl0aXZlKHQsIFwic3RyaW5nXCIpO1xuICByZXR1cm4gXCJzeW1ib2xcIiA9PSB0eXBlb2YgaSA/IGkgOiBpICsgXCJcIjtcbn1cbmZ1bmN0aW9uIF90eXBlb2Yobykge1xuICBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7XG5cbiAgcmV0dXJuIF90eXBlb2YgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBcInN5bWJvbFwiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAobykge1xuICAgIHJldHVybiB0eXBlb2YgbztcbiAgfSA6IGZ1bmN0aW9uIChvKSB7XG4gICAgcmV0dXJuIG8gJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgby5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG8gIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG87XG4gIH0sIF90eXBlb2Yobyk7XG59XG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkociwgYSkge1xuICBpZiAocikge1xuICAgIGlmIChcInN0cmluZ1wiID09IHR5cGVvZiByKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkociwgYSk7XG4gICAgdmFyIHQgPSB7fS50b1N0cmluZy5jYWxsKHIpLnNsaWNlKDgsIC0xKTtcbiAgICByZXR1cm4gXCJPYmplY3RcIiA9PT0gdCAmJiByLmNvbnN0cnVjdG9yICYmICh0ID0gci5jb25zdHJ1Y3Rvci5uYW1lKSwgXCJNYXBcIiA9PT0gdCB8fCBcIlNldFwiID09PSB0ID8gQXJyYXkuZnJvbShyKSA6IFwiQXJndW1lbnRzXCIgPT09IHQgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QodCkgPyBfYXJyYXlMaWtlVG9BcnJheShyLCBhKSA6IHZvaWQgMDtcbiAgfVxufVxuXG52YXIgX3dpbmRvdyA9IHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnID8gbnVsbCA6IHdpbmRvdzsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuXG52YXIgbmF2aWdhdG9yID0gX3dpbmRvdyA/IF93aW5kb3cubmF2aWdhdG9yIDogbnVsbDtcbl93aW5kb3cgPyBfd2luZG93LmRvY3VtZW50IDogbnVsbDtcbnZhciB0eXBlb2ZzdHIgPSBfdHlwZW9mKCcnKTtcbnZhciB0eXBlb2ZvYmogPSBfdHlwZW9mKHt9KTtcbnZhciB0eXBlb2ZmbiA9IF90eXBlb2YoZnVuY3Rpb24gKCkge30pO1xudmFyIHR5cGVvZmh0bWxlbGUgPSB0eXBlb2YgSFRNTEVsZW1lbnQgPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZihIVE1MRWxlbWVudCk7XG52YXIgaW5zdGFuY2VTdHIgPSBmdW5jdGlvbiBpbnN0YW5jZVN0cihvYmopIHtcbiAgcmV0dXJuIG9iaiAmJiBvYmouaW5zdGFuY2VTdHJpbmcgJiYgZm4kNihvYmouaW5zdGFuY2VTdHJpbmcpID8gb2JqLmluc3RhbmNlU3RyaW5nKCkgOiBudWxsO1xufTtcblxudmFyIHN0cmluZyA9IGZ1bmN0aW9uIHN0cmluZyhvYmopIHtcbiAgcmV0dXJuIG9iaiAhPSBudWxsICYmIF90eXBlb2Yob2JqKSA9PSB0eXBlb2ZzdHI7XG59O1xudmFyIGZuJDYgPSBmdW5jdGlvbiBmbihvYmopIHtcbiAgcmV0dXJuIG9iaiAhPSBudWxsICYmIF90eXBlb2Yob2JqKSA9PT0gdHlwZW9mZm47XG59O1xudmFyIGFycmF5ID0gZnVuY3Rpb24gYXJyYXkob2JqKSB7XG4gIHJldHVybiAhZWxlbWVudE9yQ29sbGVjdGlvbihvYmopICYmIChBcnJheS5pc0FycmF5ID8gQXJyYXkuaXNBcnJheShvYmopIDogb2JqICE9IG51bGwgJiYgb2JqIGluc3RhbmNlb2YgQXJyYXkpO1xufTtcbnZhciBwbGFpbk9iamVjdCA9IGZ1bmN0aW9uIHBsYWluT2JqZWN0KG9iaikge1xuICByZXR1cm4gb2JqICE9IG51bGwgJiYgX3R5cGVvZihvYmopID09PSB0eXBlb2ZvYmogJiYgIWFycmF5KG9iaikgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBPYmplY3Q7XG59O1xudmFyIG9iamVjdCA9IGZ1bmN0aW9uIG9iamVjdChvYmopIHtcbiAgcmV0dXJuIG9iaiAhPSBudWxsICYmIF90eXBlb2Yob2JqKSA9PT0gdHlwZW9mb2JqO1xufTtcbnZhciBudW1iZXIkMSA9IGZ1bmN0aW9uIG51bWJlcihvYmopIHtcbiAgcmV0dXJuIG9iaiAhPSBudWxsICYmIF90eXBlb2Yob2JqKSA9PT0gX3R5cGVvZigxKSAmJiAhaXNOYU4ob2JqKTtcbn07XG52YXIgaW50ZWdlciA9IGZ1bmN0aW9uIGludGVnZXIob2JqKSB7XG4gIHJldHVybiBudW1iZXIkMShvYmopICYmIE1hdGguZmxvb3Iob2JqKSA9PT0gb2JqO1xufTtcbnZhciBodG1sRWxlbWVudCA9IGZ1bmN0aW9uIGh0bWxFbGVtZW50KG9iaikge1xuICBpZiAoJ3VuZGVmaW5lZCcgPT09IHR5cGVvZmh0bWxlbGUpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBudWxsICE9IG9iaiAmJiBvYmogaW5zdGFuY2VvZiBIVE1MRWxlbWVudDtcbiAgfVxufTtcbnZhciBlbGVtZW50T3JDb2xsZWN0aW9uID0gZnVuY3Rpb24gZWxlbWVudE9yQ29sbGVjdGlvbihvYmopIHtcbiAgcmV0dXJuIGVsZW1lbnQob2JqKSB8fCBjb2xsZWN0aW9uKG9iaik7XG59O1xudmFyIGVsZW1lbnQgPSBmdW5jdGlvbiBlbGVtZW50KG9iaikge1xuICByZXR1cm4gaW5zdGFuY2VTdHIob2JqKSA9PT0gJ2NvbGxlY3Rpb24nICYmIG9iai5fcHJpdmF0ZS5zaW5nbGU7XG59O1xudmFyIGNvbGxlY3Rpb24gPSBmdW5jdGlvbiBjb2xsZWN0aW9uKG9iaikge1xuICByZXR1cm4gaW5zdGFuY2VTdHIob2JqKSA9PT0gJ2NvbGxlY3Rpb24nICYmICFvYmouX3ByaXZhdGUuc2luZ2xlO1xufTtcbnZhciBjb3JlID0gZnVuY3Rpb24gY29yZShvYmopIHtcbiAgcmV0dXJuIGluc3RhbmNlU3RyKG9iaikgPT09ICdjb3JlJztcbn07XG52YXIgc3R5bGVzaGVldCA9IGZ1bmN0aW9uIHN0eWxlc2hlZXQob2JqKSB7XG4gIHJldHVybiBpbnN0YW5jZVN0cihvYmopID09PSAnc3R5bGVzaGVldCc7XG59O1xudmFyIGV2ZW50ID0gZnVuY3Rpb24gZXZlbnQob2JqKSB7XG4gIHJldHVybiBpbnN0YW5jZVN0cihvYmopID09PSAnZXZlbnQnO1xufTtcbnZhciBlbXB0eVN0cmluZyA9IGZ1bmN0aW9uIGVtcHR5U3RyaW5nKG9iaikge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQgfHwgb2JqID09PSBudWxsKSB7XG4gICAgLy8gbnVsbCBpcyBlbXB0eVxuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2UgaWYgKG9iaiA9PT0gJycgfHwgb2JqLm1hdGNoKC9eXFxzKyQvKSkge1xuICAgIHJldHVybiB0cnVlOyAvLyBlbXB0eSBzdHJpbmcgaXMgZW1wdHlcbiAgfVxuICByZXR1cm4gZmFsc2U7IC8vIG90aGVyd2lzZSwgd2UgZG9uJ3Qga25vdyB3aGF0IHdlJ3ZlIGdvdFxufTtcbnZhciBkb21FbGVtZW50ID0gZnVuY3Rpb24gZG9tRWxlbWVudChvYmopIHtcbiAgaWYgKHR5cGVvZiBIVE1MRWxlbWVudCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZmFsc2U7IC8vIHdlJ3JlIG5vdCBpbiBhIGJyb3dzZXIgc28gaXQgZG9lc24ndCBtYXR0ZXJcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gb2JqIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQ7XG4gIH1cbn07XG52YXIgYm91bmRpbmdCb3ggPSBmdW5jdGlvbiBib3VuZGluZ0JveChvYmopIHtcbiAgcmV0dXJuIHBsYWluT2JqZWN0KG9iaikgJiYgbnVtYmVyJDEob2JqLngxKSAmJiBudW1iZXIkMShvYmoueDIpICYmIG51bWJlciQxKG9iai55MSkgJiYgbnVtYmVyJDEob2JqLnkyKTtcbn07XG52YXIgcHJvbWlzZSA9IGZ1bmN0aW9uIHByb21pc2Uob2JqKSB7XG4gIHJldHVybiBvYmplY3Qob2JqKSAmJiBmbiQ2KG9iai50aGVuKTtcbn07XG52YXIgbXMgPSBmdW5jdGlvbiBtcygpIHtcbiAgcmV0dXJuIG5hdmlnYXRvciAmJiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9tc2llfHRyaWRlbnR8ZWRnZS9pKTtcbn07IC8vIHByb2JhYmx5IGEgYmV0dGVyIHdheSB0byBkZXRlY3QgdGhpcy4uLlxuXG52YXIgbWVtb2l6ZSA9IGZ1bmN0aW9uIG1lbW9pemUoZm4sIGtleUZuKSB7XG4gIGlmICgha2V5Rm4pIHtcbiAgICBrZXlGbiA9IGZ1bmN0aW9uIGtleUZuKCkge1xuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGFyZ3VtZW50c1swXTtcbiAgICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gJ3VuZGVmaW5lZCc7XG4gICAgICB9XG4gICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJncy5qb2luKCckJyk7XG4gICAgfTtcbiAgfVxuICB2YXIgX21lbW9pemVkRm4gPSBmdW5jdGlvbiBtZW1vaXplZEZuKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICB2YXIgcmV0O1xuICAgIHZhciBrID0ga2V5Rm4uYXBwbHkoc2VsZiwgYXJncyk7XG4gICAgdmFyIGNhY2hlID0gX21lbW9pemVkRm4uY2FjaGU7XG4gICAgaWYgKCEocmV0ID0gY2FjaGVba10pKSB7XG4gICAgICByZXQgPSBjYWNoZVtrXSA9IGZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9O1xuICBfbWVtb2l6ZWRGbi5jYWNoZSA9IHt9O1xuICByZXR1cm4gX21lbW9pemVkRm47XG59O1xuXG52YXIgY2FtZWwyZGFzaCA9IG1lbW9pemUoZnVuY3Rpb24gKHN0cikge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbQS1aXSkvZywgZnVuY3Rpb24gKHYpIHtcbiAgICByZXR1cm4gJy0nICsgdi50b0xvd2VyQ2FzZSgpO1xuICB9KTtcbn0pO1xudmFyIGRhc2gyY2FtZWwgPSBtZW1vaXplKGZ1bmN0aW9uIChzdHIpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oLVxcdykvZywgZnVuY3Rpb24gKHYpIHtcbiAgICByZXR1cm4gdlsxXS50b1VwcGVyQ2FzZSgpO1xuICB9KTtcbn0pO1xudmFyIHByZXBlbmRDYW1lbCA9IG1lbW9pemUoZnVuY3Rpb24gKHByZWZpeCwgc3RyKSB7XG4gIHJldHVybiBwcmVmaXggKyBzdHJbMF0udG9VcHBlckNhc2UoKSArIHN0ci5zdWJzdHJpbmcoMSk7XG59LCBmdW5jdGlvbiAocHJlZml4LCBzdHIpIHtcbiAgcmV0dXJuIHByZWZpeCArICckJyArIHN0cjtcbn0pO1xudmFyIGNhcGl0YWxpemUgPSBmdW5jdGlvbiBjYXBpdGFsaXplKHN0cikge1xuICBpZiAoZW1wdHlTdHJpbmcoc3RyKSkge1xuICAgIHJldHVybiBzdHI7XG4gIH1cbiAgcmV0dXJuIHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zdWJzdHJpbmcoMSk7XG59O1xudmFyIGVuZHNXaXRoID0gZnVuY3Rpb24gZW5kc1dpdGgoc3RyaW5nLCBzdWZmaXgpIHtcbiAgcmV0dXJuIHN0cmluZy5zbGljZSgtMSAqIHN1ZmZpeC5sZW5ndGgpID09PSBzdWZmaXg7XG59O1xuXG52YXIgbnVtYmVyID0gJyg/OlstK10/KD86KD86XFxcXGQrfFxcXFxkKlxcXFwuXFxcXGQrKSg/OltFZV1bKy1dP1xcXFxkKyk/KSknO1xudmFyIHJnYmEgPSAncmdiW2FdP1xcXFwoKCcgKyBudW1iZXIgKyAnWyVdPylcXFxccyosXFxcXHMqKCcgKyBudW1iZXIgKyAnWyVdPylcXFxccyosXFxcXHMqKCcgKyBudW1iZXIgKyAnWyVdPykoPzpcXFxccyosXFxcXHMqKCcgKyBudW1iZXIgKyAnKSk/XFxcXCknO1xudmFyIHJnYmFOb0JhY2tSZWZzID0gJ3JnYlthXT9cXFxcKCg/OicgKyBudW1iZXIgKyAnWyVdPylcXFxccyosXFxcXHMqKD86JyArIG51bWJlciArICdbJV0/KVxcXFxzKixcXFxccyooPzonICsgbnVtYmVyICsgJ1slXT8pKD86XFxcXHMqLFxcXFxzKig/OicgKyBudW1iZXIgKyAnKSk/XFxcXCknO1xudmFyIGhzbGEgPSAnaHNsW2FdP1xcXFwoKCcgKyBudW1iZXIgKyAnKVxcXFxzKixcXFxccyooJyArIG51bWJlciArICdbJV0pXFxcXHMqLFxcXFxzKignICsgbnVtYmVyICsgJ1slXSkoPzpcXFxccyosXFxcXHMqKCcgKyBudW1iZXIgKyAnKSk/XFxcXCknO1xudmFyIGhzbGFOb0JhY2tSZWZzID0gJ2hzbFthXT9cXFxcKCg/OicgKyBudW1iZXIgKyAnKVxcXFxzKixcXFxccyooPzonICsgbnVtYmVyICsgJ1slXSlcXFxccyosXFxcXHMqKD86JyArIG51bWJlciArICdbJV0pKD86XFxcXHMqLFxcXFxzKig/OicgKyBudW1iZXIgKyAnKSk/XFxcXCknO1xudmFyIGhleDMgPSAnXFxcXCNbMC05YS1mQS1GXXszfSc7XG52YXIgaGV4NiA9ICdcXFxcI1swLTlhLWZBLUZdezZ9JztcblxudmFyIGFzY2VuZGluZyA9IGZ1bmN0aW9uIGFzY2VuZGluZyhhLCBiKSB7XG4gIGlmIChhIDwgYikge1xuICAgIHJldHVybiAtMTtcbiAgfSBlbHNlIGlmIChhID4gYikge1xuICAgIHJldHVybiAxO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAwO1xuICB9XG59O1xudmFyIGRlc2NlbmRpbmcgPSBmdW5jdGlvbiBkZXNjZW5kaW5nKGEsIGIpIHtcbiAgcmV0dXJuIC0xICogYXNjZW5kaW5nKGEsIGIpO1xufTtcblxudmFyIGV4dGVuZCA9IE9iamVjdC5hc3NpZ24gIT0gbnVsbCA/IE9iamVjdC5hc3NpZ24uYmluZChPYmplY3QpIDogZnVuY3Rpb24gKHRndCkge1xuICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG9iaiA9IGFyZ3NbaV07XG4gICAgaWYgKG9iaiA9PSBudWxsKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwga2V5cy5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIGsgPSBrZXlzW2pdO1xuICAgICAgdGd0W2tdID0gb2JqW2tdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGd0O1xufTtcblxuLy8gZ2V0IFtyLCBnLCBiXSBmcm9tICNhYmMgb3IgI2FhYmJjY1xudmFyIGhleDJ0dXBsZSA9IGZ1bmN0aW9uIGhleDJ0dXBsZShoZXgpIHtcbiAgaWYgKCEoaGV4Lmxlbmd0aCA9PT0gNCB8fCBoZXgubGVuZ3RoID09PSA3KSB8fCBoZXhbMF0gIT09ICcjJykge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgc2hvcnRIZXggPSBoZXgubGVuZ3RoID09PSA0O1xuICB2YXIgciwgZywgYjtcbiAgdmFyIGJhc2UgPSAxNjtcbiAgaWYgKHNob3J0SGV4KSB7XG4gICAgciA9IHBhcnNlSW50KGhleFsxXSArIGhleFsxXSwgYmFzZSk7XG4gICAgZyA9IHBhcnNlSW50KGhleFsyXSArIGhleFsyXSwgYmFzZSk7XG4gICAgYiA9IHBhcnNlSW50KGhleFszXSArIGhleFszXSwgYmFzZSk7XG4gIH0gZWxzZSB7XG4gICAgciA9IHBhcnNlSW50KGhleFsxXSArIGhleFsyXSwgYmFzZSk7XG4gICAgZyA9IHBhcnNlSW50KGhleFszXSArIGhleFs0XSwgYmFzZSk7XG4gICAgYiA9IHBhcnNlSW50KGhleFs1XSArIGhleFs2XSwgYmFzZSk7XG4gIH1cbiAgcmV0dXJuIFtyLCBnLCBiXTtcbn07XG5cbi8vIGdldCBbciwgZywgYiwgYV0gZnJvbSBoc2woMCwgMCwgMCkgb3IgaHNsYSgwLCAwLCAwLCAwKVxudmFyIGhzbDJ0dXBsZSA9IGZ1bmN0aW9uIGhzbDJ0dXBsZShoc2wpIHtcbiAgdmFyIHJldDtcbiAgdmFyIGgsIHMsIGwsIGEsIHIsIGcsIGI7XG4gIGZ1bmN0aW9uIGh1ZTJyZ2IocCwgcSwgdCkge1xuICAgIGlmICh0IDwgMCkgdCArPSAxO1xuICAgIGlmICh0ID4gMSkgdCAtPSAxO1xuICAgIGlmICh0IDwgMSAvIDYpIHJldHVybiBwICsgKHEgLSBwKSAqIDYgKiB0O1xuICAgIGlmICh0IDwgMSAvIDIpIHJldHVybiBxO1xuICAgIGlmICh0IDwgMiAvIDMpIHJldHVybiBwICsgKHEgLSBwKSAqICgyIC8gMyAtIHQpICogNjtcbiAgICByZXR1cm4gcDtcbiAgfVxuICB2YXIgbSA9IG5ldyBSZWdFeHAoJ14nICsgaHNsYSArICckJykuZXhlYyhoc2wpO1xuICBpZiAobSkge1xuICAgIC8vIGdldCBodWVcbiAgICBoID0gcGFyc2VJbnQobVsxXSk7XG4gICAgaWYgKGggPCAwKSB7XG4gICAgICBoID0gKDM2MCAtIC0xICogaCAlIDM2MCkgJSAzNjA7XG4gICAgfSBlbHNlIGlmIChoID4gMzYwKSB7XG4gICAgICBoID0gaCAlIDM2MDtcbiAgICB9XG4gICAgaCAvPSAzNjA7IC8vIG5vcm1hbGlzZSBvbiBbMCwgMV1cblxuICAgIHMgPSBwYXJzZUZsb2F0KG1bMl0pO1xuICAgIGlmIChzIDwgMCB8fCBzID4gMTAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBzYXR1cmF0aW9uIGlzIFswLCAxMDBdXG4gICAgcyA9IHMgLyAxMDA7IC8vIG5vcm1hbGlzZSBvbiBbMCwgMV1cblxuICAgIGwgPSBwYXJzZUZsb2F0KG1bM10pO1xuICAgIGlmIChsIDwgMCB8fCBsID4gMTAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBsaWdodG5lc3MgaXMgWzAsIDEwMF1cbiAgICBsID0gbCAvIDEwMDsgLy8gbm9ybWFsaXNlIG9uIFswLCAxXVxuXG4gICAgYSA9IG1bNF07XG4gICAgaWYgKGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYSA9IHBhcnNlRmxvYXQoYSk7XG4gICAgICBpZiAoYSA8IDAgfHwgYSA+IDEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyBhbHBoYSBpcyBbMCwgMV1cbiAgICB9XG5cbiAgICAvLyBub3csIGNvbnZlcnQgdG8gcmdiXG4gICAgLy8gY29kZSBmcm9tIGh0dHA6Ly9tamlqYWNrc29uLmNvbS8yMDA4LzAyL3JnYi10by1oc2wtYW5kLXJnYi10by1oc3YtY29sb3ItbW9kZWwtY29udmVyc2lvbi1hbGdvcml0aG1zLWluLWphdmFzY3JpcHRcbiAgICBpZiAocyA9PT0gMCkge1xuICAgICAgciA9IGcgPSBiID0gTWF0aC5yb3VuZChsICogMjU1KTsgLy8gYWNocm9tYXRpY1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgcSA9IGwgPCAwLjUgPyBsICogKDEgKyBzKSA6IGwgKyBzIC0gbCAqIHM7XG4gICAgICB2YXIgcCA9IDIgKiBsIC0gcTtcbiAgICAgIHIgPSBNYXRoLnJvdW5kKDI1NSAqIGh1ZTJyZ2IocCwgcSwgaCArIDEgLyAzKSk7XG4gICAgICBnID0gTWF0aC5yb3VuZCgyNTUgKiBodWUycmdiKHAsIHEsIGgpKTtcbiAgICAgIGIgPSBNYXRoLnJvdW5kKDI1NSAqIGh1ZTJyZ2IocCwgcSwgaCAtIDEgLyAzKSk7XG4gICAgfVxuICAgIHJldCA9IFtyLCBnLCBiLCBhXTtcbiAgfVxuICByZXR1cm4gcmV0O1xufTtcblxuLy8gZ2V0IFtyLCBnLCBiLCBhXSBmcm9tIHJnYigwLCAwLCAwKSBvciByZ2JhKDAsIDAsIDAsIDApXG52YXIgcmdiMnR1cGxlID0gZnVuY3Rpb24gcmdiMnR1cGxlKHJnYikge1xuICB2YXIgcmV0O1xuICB2YXIgbSA9IG5ldyBSZWdFeHAoJ14nICsgcmdiYSArICckJykuZXhlYyhyZ2IpO1xuICBpZiAobSkge1xuICAgIHJldCA9IFtdO1xuICAgIHZhciBpc1BjdCA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDw9IDM7IGkrKykge1xuICAgICAgdmFyIGNoYW5uZWwgPSBtW2ldO1xuICAgICAgaWYgKGNoYW5uZWxbY2hhbm5lbC5sZW5ndGggLSAxXSA9PT0gJyUnKSB7XG4gICAgICAgIGlzUGN0W2ldID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNoYW5uZWwgPSBwYXJzZUZsb2F0KGNoYW5uZWwpO1xuICAgICAgaWYgKGlzUGN0W2ldKSB7XG4gICAgICAgIGNoYW5uZWwgPSBjaGFubmVsIC8gMTAwICogMjU1OyAvLyBub3JtYWxpc2UgdG8gWzAsIDI1NV1cbiAgICAgIH1cbiAgICAgIGlmIChjaGFubmVsIDwgMCB8fCBjaGFubmVsID4gMjU1KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gaW52YWxpZCBjaGFubmVsIHZhbHVlXG5cbiAgICAgIHJldC5wdXNoKE1hdGguZmxvb3IoY2hhbm5lbCkpO1xuICAgIH1cbiAgICB2YXIgYXRMZWFzdE9uZUlzUGN0ID0gaXNQY3RbMV0gfHwgaXNQY3RbMl0gfHwgaXNQY3RbM107XG4gICAgdmFyIGFsbEFyZVBjdCA9IGlzUGN0WzFdICYmIGlzUGN0WzJdICYmIGlzUGN0WzNdO1xuICAgIGlmIChhdExlYXN0T25lSXNQY3QgJiYgIWFsbEFyZVBjdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gbXVzdCBhbGwgYmUgcGVyY2VudCB2YWx1ZXMgaWYgb25lIGlzXG5cbiAgICB2YXIgYWxwaGEgPSBtWzRdO1xuICAgIGlmIChhbHBoYSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhbHBoYSA9IHBhcnNlRmxvYXQoYWxwaGEpO1xuICAgICAgaWYgKGFscGhhIDwgMCB8fCBhbHBoYSA+IDEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyBpbnZhbGlkIGFscGhhIHZhbHVlXG5cbiAgICAgIHJldC5wdXNoKGFscGhhKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJldDtcbn07XG52YXIgY29sb3JuYW1lMnR1cGxlID0gZnVuY3Rpb24gY29sb3JuYW1lMnR1cGxlKGNvbG9yKSB7XG4gIHJldHVybiBjb2xvcnNbY29sb3IudG9Mb3dlckNhc2UoKV07XG59O1xudmFyIGNvbG9yMnR1cGxlID0gZnVuY3Rpb24gY29sb3IydHVwbGUoY29sb3IpIHtcbiAgcmV0dXJuIChhcnJheShjb2xvcikgPyBjb2xvciA6IG51bGwpIHx8IGNvbG9ybmFtZTJ0dXBsZShjb2xvcikgfHwgaGV4MnR1cGxlKGNvbG9yKSB8fCByZ2IydHVwbGUoY29sb3IpIHx8IGhzbDJ0dXBsZShjb2xvcik7XG59O1xudmFyIGNvbG9ycyA9IHtcbiAgLy8gc3BlY2lhbCBjb2xvdXIgbmFtZXNcbiAgdHJhbnNwYXJlbnQ6IFswLCAwLCAwLCAwXSxcbiAgLy8gTkIgYWxwaGEgPT09IDBcblxuICAvLyByZWd1bGFyIGNvbG91cnNcbiAgYWxpY2VibHVlOiBbMjQwLCAyNDgsIDI1NV0sXG4gIGFudGlxdWV3aGl0ZTogWzI1MCwgMjM1LCAyMTVdLFxuICBhcXVhOiBbMCwgMjU1LCAyNTVdLFxuICBhcXVhbWFyaW5lOiBbMTI3LCAyNTUsIDIxMl0sXG4gIGF6dXJlOiBbMjQwLCAyNTUsIDI1NV0sXG4gIGJlaWdlOiBbMjQ1LCAyNDUsIDIyMF0sXG4gIGJpc3F1ZTogWzI1NSwgMjI4LCAxOTZdLFxuICBibGFjazogWzAsIDAsIDBdLFxuICBibGFuY2hlZGFsbW9uZDogWzI1NSwgMjM1LCAyMDVdLFxuICBibHVlOiBbMCwgMCwgMjU1XSxcbiAgYmx1ZXZpb2xldDogWzEzOCwgNDMsIDIyNl0sXG4gIGJyb3duOiBbMTY1LCA0MiwgNDJdLFxuICBidXJseXdvb2Q6IFsyMjIsIDE4NCwgMTM1XSxcbiAgY2FkZXRibHVlOiBbOTUsIDE1OCwgMTYwXSxcbiAgY2hhcnRyZXVzZTogWzEyNywgMjU1LCAwXSxcbiAgY2hvY29sYXRlOiBbMjEwLCAxMDUsIDMwXSxcbiAgY29yYWw6IFsyNTUsIDEyNywgODBdLFxuICBjb3JuZmxvd2VyYmx1ZTogWzEwMCwgMTQ5LCAyMzddLFxuICBjb3Juc2lsazogWzI1NSwgMjQ4LCAyMjBdLFxuICBjcmltc29uOiBbMjIwLCAyMCwgNjBdLFxuICBjeWFuOiBbMCwgMjU1LCAyNTVdLFxuICBkYXJrYmx1ZTogWzAsIDAsIDEzOV0sXG4gIGRhcmtjeWFuOiBbMCwgMTM5LCAxMzldLFxuICBkYXJrZ29sZGVucm9kOiBbMTg0LCAxMzQsIDExXSxcbiAgZGFya2dyYXk6IFsxNjksIDE2OSwgMTY5XSxcbiAgZGFya2dyZWVuOiBbMCwgMTAwLCAwXSxcbiAgZGFya2dyZXk6IFsxNjksIDE2OSwgMTY5XSxcbiAgZGFya2toYWtpOiBbMTg5LCAxODMsIDEwN10sXG4gIGRhcmttYWdlbnRhOiBbMTM5LCAwLCAxMzldLFxuICBkYXJrb2xpdmVncmVlbjogWzg1LCAxMDcsIDQ3XSxcbiAgZGFya29yYW5nZTogWzI1NSwgMTQwLCAwXSxcbiAgZGFya29yY2hpZDogWzE1MywgNTAsIDIwNF0sXG4gIGRhcmtyZWQ6IFsxMzksIDAsIDBdLFxuICBkYXJrc2FsbW9uOiBbMjMzLCAxNTAsIDEyMl0sXG4gIGRhcmtzZWFncmVlbjogWzE0MywgMTg4LCAxNDNdLFxuICBkYXJrc2xhdGVibHVlOiBbNzIsIDYxLCAxMzldLFxuICBkYXJrc2xhdGVncmF5OiBbNDcsIDc5LCA3OV0sXG4gIGRhcmtzbGF0ZWdyZXk6IFs0NywgNzksIDc5XSxcbiAgZGFya3R1cnF1b2lzZTogWzAsIDIwNiwgMjA5XSxcbiAgZGFya3Zpb2xldDogWzE0OCwgMCwgMjExXSxcbiAgZGVlcHBpbms6IFsyNTUsIDIwLCAxNDddLFxuICBkZWVwc2t5Ymx1ZTogWzAsIDE5MSwgMjU1XSxcbiAgZGltZ3JheTogWzEwNSwgMTA1LCAxMDVdLFxuICBkaW1ncmV5OiBbMTA1LCAxMDUsIDEwNV0sXG4gIGRvZGdlcmJsdWU6IFszMCwgMTQ0LCAyNTVdLFxuICBmaXJlYnJpY2s6IFsxNzgsIDM0LCAzNF0sXG4gIGZsb3JhbHdoaXRlOiBbMjU1LCAyNTAsIDI0MF0sXG4gIGZvcmVzdGdyZWVuOiBbMzQsIDEzOSwgMzRdLFxuICBmdWNoc2lhOiBbMjU1LCAwLCAyNTVdLFxuICBnYWluc2Jvcm86IFsyMjAsIDIyMCwgMjIwXSxcbiAgZ2hvc3R3aGl0ZTogWzI0OCwgMjQ4LCAyNTVdLFxuICBnb2xkOiBbMjU1LCAyMTUsIDBdLFxuICBnb2xkZW5yb2Q6IFsyMTgsIDE2NSwgMzJdLFxuICBncmF5OiBbMTI4LCAxMjgsIDEyOF0sXG4gIGdyZXk6IFsxMjgsIDEyOCwgMTI4XSxcbiAgZ3JlZW46IFswLCAxMjgsIDBdLFxuICBncmVlbnllbGxvdzogWzE3MywgMjU1LCA0N10sXG4gIGhvbmV5ZGV3OiBbMjQwLCAyNTUsIDI0MF0sXG4gIGhvdHBpbms6IFsyNTUsIDEwNSwgMTgwXSxcbiAgaW5kaWFucmVkOiBbMjA1LCA5MiwgOTJdLFxuICBpbmRpZ286IFs3NSwgMCwgMTMwXSxcbiAgaXZvcnk6IFsyNTUsIDI1NSwgMjQwXSxcbiAga2hha2k6IFsyNDAsIDIzMCwgMTQwXSxcbiAgbGF2ZW5kZXI6IFsyMzAsIDIzMCwgMjUwXSxcbiAgbGF2ZW5kZXJibHVzaDogWzI1NSwgMjQwLCAyNDVdLFxuICBsYXduZ3JlZW46IFsxMjQsIDI1MiwgMF0sXG4gIGxlbW9uY2hpZmZvbjogWzI1NSwgMjUwLCAyMDVdLFxuICBsaWdodGJsdWU6IFsxNzMsIDIxNiwgMjMwXSxcbiAgbGlnaHRjb3JhbDogWzI0MCwgMTI4LCAxMjhdLFxuICBsaWdodGN5YW46IFsyMjQsIDI1NSwgMjU1XSxcbiAgbGlnaHRnb2xkZW5yb2R5ZWxsb3c6IFsyNTAsIDI1MCwgMjEwXSxcbiAgbGlnaHRncmF5OiBbMjExLCAyMTEsIDIxMV0sXG4gIGxpZ2h0Z3JlZW46IFsxNDQsIDIzOCwgMTQ0XSxcbiAgbGlnaHRncmV5OiBbMjExLCAyMTEsIDIxMV0sXG4gIGxpZ2h0cGluazogWzI1NSwgMTgyLCAxOTNdLFxuICBsaWdodHNhbG1vbjogWzI1NSwgMTYwLCAxMjJdLFxuICBsaWdodHNlYWdyZWVuOiBbMzIsIDE3OCwgMTcwXSxcbiAgbGlnaHRza3libHVlOiBbMTM1LCAyMDYsIDI1MF0sXG4gIGxpZ2h0c2xhdGVncmF5OiBbMTE5LCAxMzYsIDE1M10sXG4gIGxpZ2h0c2xhdGVncmV5OiBbMTE5LCAxMzYsIDE1M10sXG4gIGxpZ2h0c3RlZWxibHVlOiBbMTc2LCAxOTYsIDIyMl0sXG4gIGxpZ2h0eWVsbG93OiBbMjU1LCAyNTUsIDIyNF0sXG4gIGxpbWU6IFswLCAyNTUsIDBdLFxuICBsaW1lZ3JlZW46IFs1MCwgMjA1LCA1MF0sXG4gIGxpbmVuOiBbMjUwLCAyNDAsIDIzMF0sXG4gIG1hZ2VudGE6IFsyNTUsIDAsIDI1NV0sXG4gIG1hcm9vbjogWzEyOCwgMCwgMF0sXG4gIG1lZGl1bWFxdWFtYXJpbmU6IFsxMDIsIDIwNSwgMTcwXSxcbiAgbWVkaXVtYmx1ZTogWzAsIDAsIDIwNV0sXG4gIG1lZGl1bW9yY2hpZDogWzE4NiwgODUsIDIxMV0sXG4gIG1lZGl1bXB1cnBsZTogWzE0NywgMTEyLCAyMTldLFxuICBtZWRpdW1zZWFncmVlbjogWzYwLCAxNzksIDExM10sXG4gIG1lZGl1bXNsYXRlYmx1ZTogWzEyMywgMTA0LCAyMzhdLFxuICBtZWRpdW1zcHJpbmdncmVlbjogWzAsIDI1MCwgMTU0XSxcbiAgbWVkaXVtdHVycXVvaXNlOiBbNzIsIDIwOSwgMjA0XSxcbiAgbWVkaXVtdmlvbGV0cmVkOiBbMTk5LCAyMSwgMTMzXSxcbiAgbWlkbmlnaHRibHVlOiBbMjUsIDI1LCAxMTJdLFxuICBtaW50Y3JlYW06IFsyNDUsIDI1NSwgMjUwXSxcbiAgbWlzdHlyb3NlOiBbMjU1LCAyMjgsIDIyNV0sXG4gIG1vY2Nhc2luOiBbMjU1LCAyMjgsIDE4MV0sXG4gIG5hdmFqb3doaXRlOiBbMjU1LCAyMjIsIDE3M10sXG4gIG5hdnk6IFswLCAwLCAxMjhdLFxuICBvbGRsYWNlOiBbMjUzLCAyNDUsIDIzMF0sXG4gIG9saXZlOiBbMTI4LCAxMjgsIDBdLFxuICBvbGl2ZWRyYWI6IFsxMDcsIDE0MiwgMzVdLFxuICBvcmFuZ2U6IFsyNTUsIDE2NSwgMF0sXG4gIG9yYW5nZXJlZDogWzI1NSwgNjksIDBdLFxuICBvcmNoaWQ6IFsyMTgsIDExMiwgMjE0XSxcbiAgcGFsZWdvbGRlbnJvZDogWzIzOCwgMjMyLCAxNzBdLFxuICBwYWxlZ3JlZW46IFsxNTIsIDI1MSwgMTUyXSxcbiAgcGFsZXR1cnF1b2lzZTogWzE3NSwgMjM4LCAyMzhdLFxuICBwYWxldmlvbGV0cmVkOiBbMjE5LCAxMTIsIDE0N10sXG4gIHBhcGF5YXdoaXA6IFsyNTUsIDIzOSwgMjEzXSxcbiAgcGVhY2hwdWZmOiBbMjU1LCAyMTgsIDE4NV0sXG4gIHBlcnU6IFsyMDUsIDEzMywgNjNdLFxuICBwaW5rOiBbMjU1LCAxOTIsIDIwM10sXG4gIHBsdW06IFsyMjEsIDE2MCwgMjIxXSxcbiAgcG93ZGVyYmx1ZTogWzE3NiwgMjI0LCAyMzBdLFxuICBwdXJwbGU6IFsxMjgsIDAsIDEyOF0sXG4gIHJlZDogWzI1NSwgMCwgMF0sXG4gIHJvc3licm93bjogWzE4OCwgMTQzLCAxNDNdLFxuICByb3lhbGJsdWU6IFs2NSwgMTA1LCAyMjVdLFxuICBzYWRkbGVicm93bjogWzEzOSwgNjksIDE5XSxcbiAgc2FsbW9uOiBbMjUwLCAxMjgsIDExNF0sXG4gIHNhbmR5YnJvd246IFsyNDQsIDE2NCwgOTZdLFxuICBzZWFncmVlbjogWzQ2LCAxMzksIDg3XSxcbiAgc2Vhc2hlbGw6IFsyNTUsIDI0NSwgMjM4XSxcbiAgc2llbm5hOiBbMTYwLCA4MiwgNDVdLFxuICBzaWx2ZXI6IFsxOTIsIDE5MiwgMTkyXSxcbiAgc2t5Ymx1ZTogWzEzNSwgMjA2LCAyMzVdLFxuICBzbGF0ZWJsdWU6IFsxMDYsIDkwLCAyMDVdLFxuICBzbGF0ZWdyYXk6IFsxMTIsIDEyOCwgMTQ0XSxcbiAgc2xhdGVncmV5OiBbMTEyLCAxMjgsIDE0NF0sXG4gIHNub3c6IFsyNTUsIDI1MCwgMjUwXSxcbiAgc3ByaW5nZ3JlZW46IFswLCAyNTUsIDEyN10sXG4gIHN0ZWVsYmx1ZTogWzcwLCAxMzAsIDE4MF0sXG4gIHRhbjogWzIxMCwgMTgwLCAxNDBdLFxuICB0ZWFsOiBbMCwgMTI4LCAxMjhdLFxuICB0aGlzdGxlOiBbMjE2LCAxOTEsIDIxNl0sXG4gIHRvbWF0bzogWzI1NSwgOTksIDcxXSxcbiAgdHVycXVvaXNlOiBbNjQsIDIyNCwgMjA4XSxcbiAgdmlvbGV0OiBbMjM4LCAxMzAsIDIzOF0sXG4gIHdoZWF0OiBbMjQ1LCAyMjIsIDE3OV0sXG4gIHdoaXRlOiBbMjU1LCAyNTUsIDI1NV0sXG4gIHdoaXRlc21va2U6IFsyNDUsIDI0NSwgMjQ1XSxcbiAgeWVsbG93OiBbMjU1LCAyNTUsIDBdLFxuICB5ZWxsb3dncmVlbjogWzE1NCwgMjA1LCA1MF1cbn07XG5cbi8vIHNldHMgdGhlIHZhbHVlIGluIGEgbWFwIChtYXAgbWF5IG5vdCBiZSBidWlsdClcbnZhciBzZXRNYXAgPSBmdW5jdGlvbiBzZXRNYXAob3B0aW9ucykge1xuICB2YXIgb2JqID0gb3B0aW9ucy5tYXA7XG4gIHZhciBrZXlzID0gb3B0aW9ucy5rZXlzO1xuICB2YXIgbCA9IGtleXMubGVuZ3RoO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGw7IGkrKykge1xuICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgIGlmIChwbGFpbk9iamVjdChrZXkpKSB7XG4gICAgICB0aHJvdyBFcnJvcignVHJpZWQgdG8gc2V0IG1hcCB3aXRoIG9iamVjdCBrZXknKTtcbiAgICB9XG4gICAgaWYgKGkgPCBrZXlzLmxlbmd0aCAtIDEpIHtcbiAgICAgIC8vIGV4dGVuZCB0aGUgbWFwIGlmIG5lY2Vzc2FyeVxuICAgICAgaWYgKG9ialtrZXldID09IG51bGwpIHtcbiAgICAgICAgb2JqW2tleV0gPSB7fTtcbiAgICAgIH1cbiAgICAgIG9iaiA9IG9ialtrZXldO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBzZXQgdGhlIHZhbHVlXG4gICAgICBvYmpba2V5XSA9IG9wdGlvbnMudmFsdWU7XG4gICAgfVxuICB9XG59O1xuXG4vLyBnZXRzIHRoZSB2YWx1ZSBpbiBhIG1hcCBldmVuIGlmIGl0J3Mgbm90IGJ1aWx0IGluIHBsYWNlc1xudmFyIGdldE1hcCA9IGZ1bmN0aW9uIGdldE1hcChvcHRpb25zKSB7XG4gIHZhciBvYmogPSBvcHRpb25zLm1hcDtcbiAgdmFyIGtleXMgPSBvcHRpb25zLmtleXM7XG4gIHZhciBsID0ga2V5cy5sZW5ndGg7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7XG4gICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgaWYgKHBsYWluT2JqZWN0KGtleSkpIHtcbiAgICAgIHRocm93IEVycm9yKCdUcmllZCB0byBnZXQgbWFwIHdpdGggb2JqZWN0IGtleScpO1xuICAgIH1cbiAgICBvYmogPSBvYmpba2V5XTtcbiAgICBpZiAob2JqID09IG51bGwpIHtcbiAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuICB9XG4gIHJldHVybiBvYmo7XG59O1xuXG52YXIgY29tbW9uanNHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWxUaGlzIDogdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB7fTtcblxuZnVuY3Rpb24gZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMgKHgpIHtcblx0cmV0dXJuIHggJiYgeC5fX2VzTW9kdWxlICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCAnZGVmYXVsdCcpID8geFsnZGVmYXVsdCddIDogeDtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyB0aGVcbiAqIFtsYW5ndWFnZSB0eXBlXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcylcbiAqIG9mIGBPYmplY3RgLiAoZS5nLiBhcnJheXMsIGZ1bmN0aW9ucywgb2JqZWN0cywgcmVnZXhlcywgYG5ldyBOdW1iZXIoMClgLCBhbmQgYG5ldyBTdHJpbmcoJycpYClcbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdCh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoXy5ub29wKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuXG52YXIgaXNPYmplY3RfMTtcbnZhciBoYXNSZXF1aXJlZElzT2JqZWN0O1xuXG5mdW5jdGlvbiByZXF1aXJlSXNPYmplY3QgKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRJc09iamVjdCkgcmV0dXJuIGlzT2JqZWN0XzE7XG5cdGhhc1JlcXVpcmVkSXNPYmplY3QgPSAxO1xuXHRmdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuXHQgIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuXHQgIHJldHVybiB2YWx1ZSAhPSBudWxsICYmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJyk7XG5cdH1cblxuXHRpc09iamVjdF8xID0gaXNPYmplY3Q7XG5cdHJldHVybiBpc09iamVjdF8xO1xufVxuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGdsb2JhbGAgZnJvbSBOb2RlLmpzLiAqL1xuXG52YXIgX2ZyZWVHbG9iYWw7XG52YXIgaGFzUmVxdWlyZWRfZnJlZUdsb2JhbDtcblxuZnVuY3Rpb24gcmVxdWlyZV9mcmVlR2xvYmFsICgpIHtcblx0aWYgKGhhc1JlcXVpcmVkX2ZyZWVHbG9iYWwpIHJldHVybiBfZnJlZUdsb2JhbDtcblx0aGFzUmVxdWlyZWRfZnJlZUdsb2JhbCA9IDE7XG5cdHZhciBmcmVlR2xvYmFsID0gdHlwZW9mIGNvbW1vbmpzR2xvYmFsID09ICdvYmplY3QnICYmIGNvbW1vbmpzR2xvYmFsICYmIGNvbW1vbmpzR2xvYmFsLk9iamVjdCA9PT0gT2JqZWN0ICYmIGNvbW1vbmpzR2xvYmFsO1xuXG5cdF9mcmVlR2xvYmFsID0gZnJlZUdsb2JhbDtcblx0cmV0dXJuIF9mcmVlR2xvYmFsO1xufVxuXG52YXIgX3Jvb3Q7XG52YXIgaGFzUmVxdWlyZWRfcm9vdDtcblxuZnVuY3Rpb24gcmVxdWlyZV9yb290ICgpIHtcblx0aWYgKGhhc1JlcXVpcmVkX3Jvb3QpIHJldHVybiBfcm9vdDtcblx0aGFzUmVxdWlyZWRfcm9vdCA9IDE7XG5cdHZhciBmcmVlR2xvYmFsID0gcmVxdWlyZV9mcmVlR2xvYmFsKCk7XG5cblx0LyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBzZWxmYC4gKi9cblx0dmFyIGZyZWVTZWxmID0gdHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZiAmJiBzZWxmLk9iamVjdCA9PT0gT2JqZWN0ICYmIHNlbGY7XG5cblx0LyoqIFVzZWQgYXMgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBvYmplY3QuICovXG5cdHZhciByb290ID0gZnJlZUdsb2JhbCB8fCBmcmVlU2VsZiB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG5cdF9yb290ID0gcm9vdDtcblx0cmV0dXJuIF9yb290O1xufVxuXG52YXIgbm93XzE7XG52YXIgaGFzUmVxdWlyZWROb3c7XG5cbmZ1bmN0aW9uIHJlcXVpcmVOb3cgKCkge1xuXHRpZiAoaGFzUmVxdWlyZWROb3cpIHJldHVybiBub3dfMTtcblx0aGFzUmVxdWlyZWROb3cgPSAxO1xuXHR2YXIgcm9vdCA9IHJlcXVpcmVfcm9vdCgpO1xuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSB0aW1lc3RhbXAgb2YgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhhdCBoYXZlIGVsYXBzZWQgc2luY2Vcblx0ICogdGhlIFVuaXggZXBvY2ggKDEgSmFudWFyeSAxOTcwIDAwOjAwOjAwIFVUQykuXG5cdCAqXG5cdCAqIEBzdGF0aWNcblx0ICogQG1lbWJlck9mIF9cblx0ICogQHNpbmNlIDIuNC4wXG5cdCAqIEBjYXRlZ29yeSBEYXRlXG5cdCAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHRpbWVzdGFtcC5cblx0ICogQGV4YW1wbGVcblx0ICpcblx0ICogXy5kZWZlcihmdW5jdGlvbihzdGFtcCkge1xuXHQgKiAgIGNvbnNvbGUubG9nKF8ubm93KCkgLSBzdGFtcCk7XG5cdCAqIH0sIF8ubm93KCkpO1xuXHQgKiAvLyA9PiBMb2dzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGl0IHRvb2sgZm9yIHRoZSBkZWZlcnJlZCBpbnZvY2F0aW9uLlxuXHQgKi9cblx0dmFyIG5vdyA9IGZ1bmN0aW9uKCkge1xuXHQgIHJldHVybiByb290LkRhdGUubm93KCk7XG5cdH07XG5cblx0bm93XzEgPSBub3c7XG5cdHJldHVybiBub3dfMTtcbn1cblxuLyoqIFVzZWQgdG8gbWF0Y2ggYSBzaW5nbGUgd2hpdGVzcGFjZSBjaGFyYWN0ZXIuICovXG5cbnZhciBfdHJpbW1lZEVuZEluZGV4O1xudmFyIGhhc1JlcXVpcmVkX3RyaW1tZWRFbmRJbmRleDtcblxuZnVuY3Rpb24gcmVxdWlyZV90cmltbWVkRW5kSW5kZXggKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRfdHJpbW1lZEVuZEluZGV4KSByZXR1cm4gX3RyaW1tZWRFbmRJbmRleDtcblx0aGFzUmVxdWlyZWRfdHJpbW1lZEVuZEluZGV4ID0gMTtcblx0dmFyIHJlV2hpdGVzcGFjZSA9IC9cXHMvO1xuXG5cdC8qKlxuXHQgKiBVc2VkIGJ5IGBfLnRyaW1gIGFuZCBgXy50cmltRW5kYCB0byBnZXQgdGhlIGluZGV4IG9mIHRoZSBsYXN0IG5vbi13aGl0ZXNwYWNlXG5cdCAqIGNoYXJhY3RlciBvZiBgc3RyaW5nYC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG5cdCAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlci5cblx0ICovXG5cdGZ1bmN0aW9uIHRyaW1tZWRFbmRJbmRleChzdHJpbmcpIHtcblx0ICB2YXIgaW5kZXggPSBzdHJpbmcubGVuZ3RoO1xuXG5cdCAgd2hpbGUgKGluZGV4LS0gJiYgcmVXaGl0ZXNwYWNlLnRlc3Qoc3RyaW5nLmNoYXJBdChpbmRleCkpKSB7fVxuXHQgIHJldHVybiBpbmRleDtcblx0fVxuXG5cdF90cmltbWVkRW5kSW5kZXggPSB0cmltbWVkRW5kSW5kZXg7XG5cdHJldHVybiBfdHJpbW1lZEVuZEluZGV4O1xufVxuXG52YXIgX2Jhc2VUcmltO1xudmFyIGhhc1JlcXVpcmVkX2Jhc2VUcmltO1xuXG5mdW5jdGlvbiByZXF1aXJlX2Jhc2VUcmltICgpIHtcblx0aWYgKGhhc1JlcXVpcmVkX2Jhc2VUcmltKSByZXR1cm4gX2Jhc2VUcmltO1xuXHRoYXNSZXF1aXJlZF9iYXNlVHJpbSA9IDE7XG5cdHZhciB0cmltbWVkRW5kSW5kZXggPSByZXF1aXJlX3RyaW1tZWRFbmRJbmRleCgpO1xuXG5cdC8qKiBVc2VkIHRvIG1hdGNoIGxlYWRpbmcgd2hpdGVzcGFjZS4gKi9cblx0dmFyIHJlVHJpbVN0YXJ0ID0gL15cXHMrLztcblxuXHQvKipcblx0ICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udHJpbWAuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byB0cmltLlxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB0cmltbWVkIHN0cmluZy5cblx0ICovXG5cdGZ1bmN0aW9uIGJhc2VUcmltKHN0cmluZykge1xuXHQgIHJldHVybiBzdHJpbmdcblx0ICAgID8gc3RyaW5nLnNsaWNlKDAsIHRyaW1tZWRFbmRJbmRleChzdHJpbmcpICsgMSkucmVwbGFjZShyZVRyaW1TdGFydCwgJycpXG5cdCAgICA6IHN0cmluZztcblx0fVxuXG5cdF9iYXNlVHJpbSA9IGJhc2VUcmltO1xuXHRyZXR1cm4gX2Jhc2VUcmltO1xufVxuXG52YXIgX1N5bWJvbDtcbnZhciBoYXNSZXF1aXJlZF9TeW1ib2w7XG5cbmZ1bmN0aW9uIHJlcXVpcmVfU3ltYm9sICgpIHtcblx0aWYgKGhhc1JlcXVpcmVkX1N5bWJvbCkgcmV0dXJuIF9TeW1ib2w7XG5cdGhhc1JlcXVpcmVkX1N5bWJvbCA9IDE7XG5cdHZhciByb290ID0gcmVxdWlyZV9yb290KCk7XG5cblx0LyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG5cdHZhciBTeW1ib2wgPSByb290LlN5bWJvbDtcblxuXHRfU3ltYm9sID0gU3ltYm9sO1xuXHRyZXR1cm4gX1N5bWJvbDtcbn1cblxudmFyIF9nZXRSYXdUYWc7XG52YXIgaGFzUmVxdWlyZWRfZ2V0UmF3VGFnO1xuXG5mdW5jdGlvbiByZXF1aXJlX2dldFJhd1RhZyAoKSB7XG5cdGlmIChoYXNSZXF1aXJlZF9nZXRSYXdUYWcpIHJldHVybiBfZ2V0UmF3VGFnO1xuXHRoYXNSZXF1aXJlZF9nZXRSYXdUYWcgPSAxO1xuXHR2YXIgU3ltYm9sID0gcmVxdWlyZV9TeW1ib2woKTtcblxuXHQvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG5cdHZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cblx0LyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG5cdHZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG5cdC8qKlxuXHQgKiBVc2VkIHRvIHJlc29sdmUgdGhlXG5cdCAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuXHQgKiBvZiB2YWx1ZXMuXG5cdCAqL1xuXHR2YXIgbmF0aXZlT2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuXHQvKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cblx0dmFyIHN5bVRvU3RyaW5nVGFnID0gU3ltYm9sID8gU3ltYm9sLnRvU3RyaW5nVGFnIDogdW5kZWZpbmVkO1xuXG5cdC8qKlxuXHQgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VHZXRUYWdgIHdoaWNoIGlnbm9yZXMgYFN5bWJvbC50b1N0cmluZ1RhZ2AgdmFsdWVzLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cblx0ICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcmF3IGB0b1N0cmluZ1RhZ2AuXG5cdCAqL1xuXHRmdW5jdGlvbiBnZXRSYXdUYWcodmFsdWUpIHtcblx0ICB2YXIgaXNPd24gPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBzeW1Ub1N0cmluZ1RhZyksXG5cdCAgICAgIHRhZyA9IHZhbHVlW3N5bVRvU3RyaW5nVGFnXTtcblxuXHQgIHRyeSB7XG5cdCAgICB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ10gPSB1bmRlZmluZWQ7XG5cdCAgICB2YXIgdW5tYXNrZWQgPSB0cnVlO1xuXHQgIH0gY2F0Y2ggKGUpIHt9XG5cblx0ICB2YXIgcmVzdWx0ID0gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG5cdCAgaWYgKHVubWFza2VkKSB7XG5cdCAgICBpZiAoaXNPd24pIHtcblx0ICAgICAgdmFsdWVbc3ltVG9TdHJpbmdUYWddID0gdGFnO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgZGVsZXRlIHZhbHVlW3N5bVRvU3RyaW5nVGFnXTtcblx0ICAgIH1cblx0ICB9XG5cdCAgcmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdF9nZXRSYXdUYWcgPSBnZXRSYXdUYWc7XG5cdHJldHVybiBfZ2V0UmF3VGFnO1xufVxuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG5cbnZhciBfb2JqZWN0VG9TdHJpbmc7XG52YXIgaGFzUmVxdWlyZWRfb2JqZWN0VG9TdHJpbmc7XG5cbmZ1bmN0aW9uIHJlcXVpcmVfb2JqZWN0VG9TdHJpbmcgKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRfb2JqZWN0VG9TdHJpbmcpIHJldHVybiBfb2JqZWN0VG9TdHJpbmc7XG5cdGhhc1JlcXVpcmVkX29iamVjdFRvU3RyaW5nID0gMTtcblx0dmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuXHQvKipcblx0ICogVXNlZCB0byByZXNvbHZlIHRoZVxuXHQgKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcblx0ICogb2YgdmFsdWVzLlxuXHQgKi9cblx0dmFyIG5hdGl2ZU9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcgdXNpbmcgYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLlxuXHQgKi9cblx0ZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcodmFsdWUpIHtcblx0ICByZXR1cm4gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG5cdH1cblxuXHRfb2JqZWN0VG9TdHJpbmcgPSBvYmplY3RUb1N0cmluZztcblx0cmV0dXJuIF9vYmplY3RUb1N0cmluZztcbn1cblxudmFyIF9iYXNlR2V0VGFnO1xudmFyIGhhc1JlcXVpcmVkX2Jhc2VHZXRUYWc7XG5cbmZ1bmN0aW9uIHJlcXVpcmVfYmFzZUdldFRhZyAoKSB7XG5cdGlmIChoYXNSZXF1aXJlZF9iYXNlR2V0VGFnKSByZXR1cm4gX2Jhc2VHZXRUYWc7XG5cdGhhc1JlcXVpcmVkX2Jhc2VHZXRUYWcgPSAxO1xuXHR2YXIgU3ltYm9sID0gcmVxdWlyZV9TeW1ib2woKSxcblx0ICAgIGdldFJhd1RhZyA9IHJlcXVpcmVfZ2V0UmF3VGFnKCksXG5cdCAgICBvYmplY3RUb1N0cmluZyA9IHJlcXVpcmVfb2JqZWN0VG9TdHJpbmcoKTtcblxuXHQvKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG5cdHZhciBudWxsVGFnID0gJ1tvYmplY3QgTnVsbF0nLFxuXHQgICAgdW5kZWZpbmVkVGFnID0gJ1tvYmplY3QgVW5kZWZpbmVkXSc7XG5cblx0LyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG5cdHZhciBzeW1Ub1N0cmluZ1RhZyA9IFN5bWJvbCA/IFN5bWJvbC50b1N0cmluZ1RhZyA6IHVuZGVmaW5lZDtcblxuXHQvKipcblx0ICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGdldFRhZ2Agd2l0aG91dCBmYWxsYmFja3MgZm9yIGJ1Z2d5IGVudmlyb25tZW50cy5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGB0b1N0cmluZ1RhZ2AuXG5cdCAqL1xuXHRmdW5jdGlvbiBiYXNlR2V0VGFnKHZhbHVlKSB7XG5cdCAgaWYgKHZhbHVlID09IG51bGwpIHtcblx0ICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkVGFnIDogbnVsbFRhZztcblx0ICB9XG5cdCAgcmV0dXJuIChzeW1Ub1N0cmluZ1RhZyAmJiBzeW1Ub1N0cmluZ1RhZyBpbiBPYmplY3QodmFsdWUpKVxuXHQgICAgPyBnZXRSYXdUYWcodmFsdWUpXG5cdCAgICA6IG9iamVjdFRvU3RyaW5nKHZhbHVlKTtcblx0fVxuXG5cdF9iYXNlR2V0VGFnID0gYmFzZUdldFRhZztcblx0cmV0dXJuIF9iYXNlR2V0VGFnO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuXG52YXIgaXNPYmplY3RMaWtlXzE7XG52YXIgaGFzUmVxdWlyZWRJc09iamVjdExpa2U7XG5cbmZ1bmN0aW9uIHJlcXVpcmVJc09iamVjdExpa2UgKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRJc09iamVjdExpa2UpIHJldHVybiBpc09iamVjdExpa2VfMTtcblx0aGFzUmVxdWlyZWRJc09iamVjdExpa2UgPSAxO1xuXHRmdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcblx0ICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCc7XG5cdH1cblxuXHRpc09iamVjdExpa2VfMSA9IGlzT2JqZWN0TGlrZTtcblx0cmV0dXJuIGlzT2JqZWN0TGlrZV8xO1xufVxuXG52YXIgaXNTeW1ib2xfMTtcbnZhciBoYXNSZXF1aXJlZElzU3ltYm9sO1xuXG5mdW5jdGlvbiByZXF1aXJlSXNTeW1ib2wgKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRJc1N5bWJvbCkgcmV0dXJuIGlzU3ltYm9sXzE7XG5cdGhhc1JlcXVpcmVkSXNTeW1ib2wgPSAxO1xuXHR2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmVfYmFzZUdldFRhZygpLFxuXHQgICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZUlzT2JqZWN0TGlrZSgpO1xuXG5cdC8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cblx0dmFyIHN5bWJvbFRhZyA9ICdbb2JqZWN0IFN5bWJvbF0nO1xuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN5bWJvbGAgcHJpbWl0aXZlIG9yIG9iamVjdC5cblx0ICpcblx0ICogQHN0YXRpY1xuXHQgKiBAbWVtYmVyT2YgX1xuXHQgKiBAc2luY2UgNC4wLjBcblx0ICogQGNhdGVnb3J5IExhbmdcblx0ICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG5cdCAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3ltYm9sLCBlbHNlIGBmYWxzZWAuXG5cdCAqIEBleGFtcGxlXG5cdCAqXG5cdCAqIF8uaXNTeW1ib2woU3ltYm9sLml0ZXJhdG9yKTtcblx0ICogLy8gPT4gdHJ1ZVxuXHQgKlxuXHQgKiBfLmlzU3ltYm9sKCdhYmMnKTtcblx0ICogLy8gPT4gZmFsc2Vcblx0ICovXG5cdGZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7XG5cdCAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3ltYm9sJyB8fFxuXHQgICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gc3ltYm9sVGFnKTtcblx0fVxuXG5cdGlzU3ltYm9sXzEgPSBpc1N5bWJvbDtcblx0cmV0dXJuIGlzU3ltYm9sXzE7XG59XG5cbnZhciB0b051bWJlcl8xO1xudmFyIGhhc1JlcXVpcmVkVG9OdW1iZXI7XG5cbmZ1bmN0aW9uIHJlcXVpcmVUb051bWJlciAoKSB7XG5cdGlmIChoYXNSZXF1aXJlZFRvTnVtYmVyKSByZXR1cm4gdG9OdW1iZXJfMTtcblx0aGFzUmVxdWlyZWRUb051bWJlciA9IDE7XG5cdHZhciBiYXNlVHJpbSA9IHJlcXVpcmVfYmFzZVRyaW0oKSxcblx0ICAgIGlzT2JqZWN0ID0gcmVxdWlyZUlzT2JqZWN0KCksXG5cdCAgICBpc1N5bWJvbCA9IHJlcXVpcmVJc1N5bWJvbCgpO1xuXG5cdC8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xuXHR2YXIgTkFOID0gMCAvIDA7XG5cblx0LyoqIFVzZWQgdG8gZGV0ZWN0IGJhZCBzaWduZWQgaGV4YWRlY2ltYWwgc3RyaW5nIHZhbHVlcy4gKi9cblx0dmFyIHJlSXNCYWRIZXggPSAvXlstK10weFswLTlhLWZdKyQvaTtcblxuXHQvKiogVXNlZCB0byBkZXRlY3QgYmluYXJ5IHN0cmluZyB2YWx1ZXMuICovXG5cdHZhciByZUlzQmluYXJ5ID0gL14wYlswMV0rJC9pO1xuXG5cdC8qKiBVc2VkIHRvIGRldGVjdCBvY3RhbCBzdHJpbmcgdmFsdWVzLiAqL1xuXHR2YXIgcmVJc09jdGFsID0gL14wb1swLTddKyQvaTtcblxuXHQvKiogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgd2l0aG91dCBhIGRlcGVuZGVuY3kgb24gYHJvb3RgLiAqL1xuXHR2YXIgZnJlZVBhcnNlSW50ID0gcGFyc2VJbnQ7XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBudW1iZXIuXG5cdCAqXG5cdCAqIEBzdGF0aWNcblx0ICogQG1lbWJlck9mIF9cblx0ICogQHNpbmNlIDQuMC4wXG5cdCAqIEBjYXRlZ29yeSBMYW5nXG5cdCAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG5cdCAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG51bWJlci5cblx0ICogQGV4YW1wbGVcblx0ICpcblx0ICogXy50b051bWJlcigzLjIpO1xuXHQgKiAvLyA9PiAzLjJcblx0ICpcblx0ICogXy50b051bWJlcihOdW1iZXIuTUlOX1ZBTFVFKTtcblx0ICogLy8gPT4gNWUtMzI0XG5cdCAqXG5cdCAqIF8udG9OdW1iZXIoSW5maW5pdHkpO1xuXHQgKiAvLyA9PiBJbmZpbml0eVxuXHQgKlxuXHQgKiBfLnRvTnVtYmVyKCczLjInKTtcblx0ICogLy8gPT4gMy4yXG5cdCAqL1xuXHRmdW5jdGlvbiB0b051bWJlcih2YWx1ZSkge1xuXHQgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicpIHtcblx0ICAgIHJldHVybiB2YWx1ZTtcblx0ICB9XG5cdCAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuXHQgICAgcmV0dXJuIE5BTjtcblx0ICB9XG5cdCAgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuXHQgICAgdmFyIG90aGVyID0gdHlwZW9mIHZhbHVlLnZhbHVlT2YgPT0gJ2Z1bmN0aW9uJyA/IHZhbHVlLnZhbHVlT2YoKSA6IHZhbHVlO1xuXHQgICAgdmFsdWUgPSBpc09iamVjdChvdGhlcikgPyAob3RoZXIgKyAnJykgOiBvdGhlcjtcblx0ICB9XG5cdCAgaWYgKHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykge1xuXHQgICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiArdmFsdWU7XG5cdCAgfVxuXHQgIHZhbHVlID0gYmFzZVRyaW0odmFsdWUpO1xuXHQgIHZhciBpc0JpbmFyeSA9IHJlSXNCaW5hcnkudGVzdCh2YWx1ZSk7XG5cdCAgcmV0dXJuIChpc0JpbmFyeSB8fCByZUlzT2N0YWwudGVzdCh2YWx1ZSkpXG5cdCAgICA/IGZyZWVQYXJzZUludCh2YWx1ZS5zbGljZSgyKSwgaXNCaW5hcnkgPyAyIDogOClcblx0ICAgIDogKHJlSXNCYWRIZXgudGVzdCh2YWx1ZSkgPyBOQU4gOiArdmFsdWUpO1xuXHR9XG5cblx0dG9OdW1iZXJfMSA9IHRvTnVtYmVyO1xuXHRyZXR1cm4gdG9OdW1iZXJfMTtcbn1cblxudmFyIGRlYm91bmNlXzE7XG52YXIgaGFzUmVxdWlyZWREZWJvdW5jZTtcblxuZnVuY3Rpb24gcmVxdWlyZURlYm91bmNlICgpIHtcblx0aWYgKGhhc1JlcXVpcmVkRGVib3VuY2UpIHJldHVybiBkZWJvdW5jZV8xO1xuXHRoYXNSZXF1aXJlZERlYm91bmNlID0gMTtcblx0dmFyIGlzT2JqZWN0ID0gcmVxdWlyZUlzT2JqZWN0KCksXG5cdCAgICBub3cgPSByZXF1aXJlTm93KCksXG5cdCAgICB0b051bWJlciA9IHJlcXVpcmVUb051bWJlcigpO1xuXG5cdC8qKiBFcnJvciBtZXNzYWdlIGNvbnN0YW50cy4gKi9cblx0dmFyIEZVTkNfRVJST1JfVEVYVCA9ICdFeHBlY3RlZCBhIGZ1bmN0aW9uJztcblxuXHQvKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG5cdHZhciBuYXRpdmVNYXggPSBNYXRoLm1heCxcblx0ICAgIG5hdGl2ZU1pbiA9IE1hdGgubWluO1xuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgZGVib3VuY2VkIGZ1bmN0aW9uIHRoYXQgZGVsYXlzIGludm9raW5nIGBmdW5jYCB1bnRpbCBhZnRlciBgd2FpdGBcblx0ICogbWlsbGlzZWNvbmRzIGhhdmUgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gd2FzXG5cdCAqIGludm9rZWQuIFRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gY29tZXMgd2l0aCBhIGBjYW5jZWxgIG1ldGhvZCB0byBjYW5jZWxcblx0ICogZGVsYXllZCBgZnVuY2AgaW52b2NhdGlvbnMgYW5kIGEgYGZsdXNoYCBtZXRob2QgdG8gaW1tZWRpYXRlbHkgaW52b2tlIHRoZW0uXG5cdCAqIFByb3ZpZGUgYG9wdGlvbnNgIHRvIGluZGljYXRlIHdoZXRoZXIgYGZ1bmNgIHNob3VsZCBiZSBpbnZva2VkIG9uIHRoZVxuXHQgKiBsZWFkaW5nIGFuZC9vciB0cmFpbGluZyBlZGdlIG9mIHRoZSBgd2FpdGAgdGltZW91dC4gVGhlIGBmdW5jYCBpcyBpbnZva2VkXG5cdCAqIHdpdGggdGhlIGxhc3QgYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24uIFN1YnNlcXVlbnRcblx0ICogY2FsbHMgdG8gdGhlIGRlYm91bmNlZCBmdW5jdGlvbiByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBgZnVuY2Bcblx0ICogaW52b2NhdGlvbi5cblx0ICpcblx0ICogKipOb3RlOioqIElmIGBsZWFkaW5nYCBhbmQgYHRyYWlsaW5nYCBvcHRpb25zIGFyZSBgdHJ1ZWAsIGBmdW5jYCBpc1xuXHQgKiBpbnZva2VkIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0IG9ubHkgaWYgdGhlIGRlYm91bmNlZCBmdW5jdGlvblxuXHQgKiBpcyBpbnZva2VkIG1vcmUgdGhhbiBvbmNlIGR1cmluZyB0aGUgYHdhaXRgIHRpbWVvdXQuXG5cdCAqXG5cdCAqIElmIGB3YWl0YCBpcyBgMGAgYW5kIGBsZWFkaW5nYCBpcyBgZmFsc2VgLCBgZnVuY2AgaW52b2NhdGlvbiBpcyBkZWZlcnJlZFxuXHQgKiB1bnRpbCB0byB0aGUgbmV4dCB0aWNrLCBzaW1pbGFyIHRvIGBzZXRUaW1lb3V0YCB3aXRoIGEgdGltZW91dCBvZiBgMGAuXG5cdCAqXG5cdCAqIFNlZSBbRGF2aWQgQ29yYmFjaG8ncyBhcnRpY2xlXShodHRwczovL2Nzcy10cmlja3MuY29tL2RlYm91bmNpbmctdGhyb3R0bGluZy1leHBsYWluZWQtZXhhbXBsZXMvKVxuXHQgKiBmb3IgZGV0YWlscyBvdmVyIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGBfLmRlYm91bmNlYCBhbmQgYF8udGhyb3R0bGVgLlxuXHQgKlxuXHQgKiBAc3RhdGljXG5cdCAqIEBtZW1iZXJPZiBfXG5cdCAqIEBzaW5jZSAwLjEuMFxuXHQgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVib3VuY2UuXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbd2FpdD0wXSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheS5cblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBUaGUgb3B0aW9ucyBvYmplY3QuXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubGVhZGluZz1mYWxzZV1cblx0ICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cblx0ICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm1heFdhaXRdXG5cdCAqICBUaGUgbWF4aW11bSB0aW1lIGBmdW5jYCBpcyBhbGxvd2VkIHRvIGJlIGRlbGF5ZWQgYmVmb3JlIGl0J3MgaW52b2tlZC5cblx0ICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50cmFpbGluZz10cnVlXVxuXHQgKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cblx0ICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZGVib3VuY2VkIGZ1bmN0aW9uLlxuXHQgKiBAZXhhbXBsZVxuXHQgKlxuXHQgKiAvLyBBdm9pZCBjb3N0bHkgY2FsY3VsYXRpb25zIHdoaWxlIHRoZSB3aW5kb3cgc2l6ZSBpcyBpbiBmbHV4LlxuXHQgKiBqUXVlcnkod2luZG93KS5vbigncmVzaXplJywgXy5kZWJvdW5jZShjYWxjdWxhdGVMYXlvdXQsIDE1MCkpO1xuXHQgKlxuXHQgKiAvLyBJbnZva2UgYHNlbmRNYWlsYCB3aGVuIGNsaWNrZWQsIGRlYm91bmNpbmcgc3Vic2VxdWVudCBjYWxscy5cblx0ICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIF8uZGVib3VuY2Uoc2VuZE1haWwsIDMwMCwge1xuXHQgKiAgICdsZWFkaW5nJzogdHJ1ZSxcblx0ICogICAndHJhaWxpbmcnOiBmYWxzZVxuXHQgKiB9KSk7XG5cdCAqXG5cdCAqIC8vIEVuc3VyZSBgYmF0Y2hMb2dgIGlzIGludm9rZWQgb25jZSBhZnRlciAxIHNlY29uZCBvZiBkZWJvdW5jZWQgY2FsbHMuXG5cdCAqIHZhciBkZWJvdW5jZWQgPSBfLmRlYm91bmNlKGJhdGNoTG9nLCAyNTAsIHsgJ21heFdhaXQnOiAxMDAwIH0pO1xuXHQgKiB2YXIgc291cmNlID0gbmV3IEV2ZW50U291cmNlKCcvc3RyZWFtJyk7XG5cdCAqIGpRdWVyeShzb3VyY2UpLm9uKCdtZXNzYWdlJywgZGVib3VuY2VkKTtcblx0ICpcblx0ICogLy8gQ2FuY2VsIHRoZSB0cmFpbGluZyBkZWJvdW5jZWQgaW52b2NhdGlvbi5cblx0ICogalF1ZXJ5KHdpbmRvdykub24oJ3BvcHN0YXRlJywgZGVib3VuY2VkLmNhbmNlbCk7XG5cdCAqL1xuXHRmdW5jdGlvbiBkZWJvdW5jZShmdW5jLCB3YWl0LCBvcHRpb25zKSB7XG5cdCAgdmFyIGxhc3RBcmdzLFxuXHQgICAgICBsYXN0VGhpcyxcblx0ICAgICAgbWF4V2FpdCxcblx0ICAgICAgcmVzdWx0LFxuXHQgICAgICB0aW1lcklkLFxuXHQgICAgICBsYXN0Q2FsbFRpbWUsXG5cdCAgICAgIGxhc3RJbnZva2VUaW1lID0gMCxcblx0ICAgICAgbGVhZGluZyA9IGZhbHNlLFxuXHQgICAgICBtYXhpbmcgPSBmYWxzZSxcblx0ICAgICAgdHJhaWxpbmcgPSB0cnVlO1xuXG5cdCAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcblx0ICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcblx0ICB9XG5cdCAgd2FpdCA9IHRvTnVtYmVyKHdhaXQpIHx8IDA7XG5cdCAgaWYgKGlzT2JqZWN0KG9wdGlvbnMpKSB7XG5cdCAgICBsZWFkaW5nID0gISFvcHRpb25zLmxlYWRpbmc7XG5cdCAgICBtYXhpbmcgPSAnbWF4V2FpdCcgaW4gb3B0aW9ucztcblx0ICAgIG1heFdhaXQgPSBtYXhpbmcgPyBuYXRpdmVNYXgodG9OdW1iZXIob3B0aW9ucy5tYXhXYWl0KSB8fCAwLCB3YWl0KSA6IG1heFdhaXQ7XG5cdCAgICB0cmFpbGluZyA9ICd0cmFpbGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy50cmFpbGluZyA6IHRyYWlsaW5nO1xuXHQgIH1cblxuXHQgIGZ1bmN0aW9uIGludm9rZUZ1bmModGltZSkge1xuXHQgICAgdmFyIGFyZ3MgPSBsYXN0QXJncyxcblx0ICAgICAgICB0aGlzQXJnID0gbGFzdFRoaXM7XG5cblx0ICAgIGxhc3RBcmdzID0gbGFzdFRoaXMgPSB1bmRlZmluZWQ7XG5cdCAgICBsYXN0SW52b2tlVGltZSA9IHRpbWU7XG5cdCAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xuXHQgICAgcmV0dXJuIHJlc3VsdDtcblx0ICB9XG5cblx0ICBmdW5jdGlvbiBsZWFkaW5nRWRnZSh0aW1lKSB7XG5cdCAgICAvLyBSZXNldCBhbnkgYG1heFdhaXRgIHRpbWVyLlxuXHQgICAgbGFzdEludm9rZVRpbWUgPSB0aW1lO1xuXHQgICAgLy8gU3RhcnQgdGhlIHRpbWVyIGZvciB0aGUgdHJhaWxpbmcgZWRnZS5cblx0ICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG5cdCAgICAvLyBJbnZva2UgdGhlIGxlYWRpbmcgZWRnZS5cblx0ICAgIHJldHVybiBsZWFkaW5nID8gaW52b2tlRnVuYyh0aW1lKSA6IHJlc3VsdDtcblx0ICB9XG5cblx0ICBmdW5jdGlvbiByZW1haW5pbmdXYWl0KHRpbWUpIHtcblx0ICAgIHZhciB0aW1lU2luY2VMYXN0Q2FsbCA9IHRpbWUgLSBsYXN0Q2FsbFRpbWUsXG5cdCAgICAgICAgdGltZVNpbmNlTGFzdEludm9rZSA9IHRpbWUgLSBsYXN0SW52b2tlVGltZSxcblx0ICAgICAgICB0aW1lV2FpdGluZyA9IHdhaXQgLSB0aW1lU2luY2VMYXN0Q2FsbDtcblxuXHQgICAgcmV0dXJuIG1heGluZ1xuXHQgICAgICA/IG5hdGl2ZU1pbih0aW1lV2FpdGluZywgbWF4V2FpdCAtIHRpbWVTaW5jZUxhc3RJbnZva2UpXG5cdCAgICAgIDogdGltZVdhaXRpbmc7XG5cdCAgfVxuXG5cdCAgZnVuY3Rpb24gc2hvdWxkSW52b2tlKHRpbWUpIHtcblx0ICAgIHZhciB0aW1lU2luY2VMYXN0Q2FsbCA9IHRpbWUgLSBsYXN0Q2FsbFRpbWUsXG5cdCAgICAgICAgdGltZVNpbmNlTGFzdEludm9rZSA9IHRpbWUgLSBsYXN0SW52b2tlVGltZTtcblxuXHQgICAgLy8gRWl0aGVyIHRoaXMgaXMgdGhlIGZpcnN0IGNhbGwsIGFjdGl2aXR5IGhhcyBzdG9wcGVkIGFuZCB3ZSdyZSBhdCB0aGVcblx0ICAgIC8vIHRyYWlsaW5nIGVkZ2UsIHRoZSBzeXN0ZW0gdGltZSBoYXMgZ29uZSBiYWNrd2FyZHMgYW5kIHdlJ3JlIHRyZWF0aW5nXG5cdCAgICAvLyBpdCBhcyB0aGUgdHJhaWxpbmcgZWRnZSwgb3Igd2UndmUgaGl0IHRoZSBgbWF4V2FpdGAgbGltaXQuXG5cdCAgICByZXR1cm4gKGxhc3RDYWxsVGltZSA9PT0gdW5kZWZpbmVkIHx8ICh0aW1lU2luY2VMYXN0Q2FsbCA+PSB3YWl0KSB8fFxuXHQgICAgICAodGltZVNpbmNlTGFzdENhbGwgPCAwKSB8fCAobWF4aW5nICYmIHRpbWVTaW5jZUxhc3RJbnZva2UgPj0gbWF4V2FpdCkpO1xuXHQgIH1cblxuXHQgIGZ1bmN0aW9uIHRpbWVyRXhwaXJlZCgpIHtcblx0ICAgIHZhciB0aW1lID0gbm93KCk7XG5cdCAgICBpZiAoc2hvdWxkSW52b2tlKHRpbWUpKSB7XG5cdCAgICAgIHJldHVybiB0cmFpbGluZ0VkZ2UodGltZSk7XG5cdCAgICB9XG5cdCAgICAvLyBSZXN0YXJ0IHRoZSB0aW1lci5cblx0ICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgcmVtYWluaW5nV2FpdCh0aW1lKSk7XG5cdCAgfVxuXG5cdCAgZnVuY3Rpb24gdHJhaWxpbmdFZGdlKHRpbWUpIHtcblx0ICAgIHRpbWVySWQgPSB1bmRlZmluZWQ7XG5cblx0ICAgIC8vIE9ubHkgaW52b2tlIGlmIHdlIGhhdmUgYGxhc3RBcmdzYCB3aGljaCBtZWFucyBgZnVuY2AgaGFzIGJlZW5cblx0ICAgIC8vIGRlYm91bmNlZCBhdCBsZWFzdCBvbmNlLlxuXHQgICAgaWYgKHRyYWlsaW5nICYmIGxhc3RBcmdzKSB7XG5cdCAgICAgIHJldHVybiBpbnZva2VGdW5jKHRpbWUpO1xuXHQgICAgfVxuXHQgICAgbGFzdEFyZ3MgPSBsYXN0VGhpcyA9IHVuZGVmaW5lZDtcblx0ICAgIHJldHVybiByZXN1bHQ7XG5cdCAgfVxuXG5cdCAgZnVuY3Rpb24gY2FuY2VsKCkge1xuXHQgICAgaWYgKHRpbWVySWQgIT09IHVuZGVmaW5lZCkge1xuXHQgICAgICBjbGVhclRpbWVvdXQodGltZXJJZCk7XG5cdCAgICB9XG5cdCAgICBsYXN0SW52b2tlVGltZSA9IDA7XG5cdCAgICBsYXN0QXJncyA9IGxhc3RDYWxsVGltZSA9IGxhc3RUaGlzID0gdGltZXJJZCA9IHVuZGVmaW5lZDtcblx0ICB9XG5cblx0ICBmdW5jdGlvbiBmbHVzaCgpIHtcblx0ICAgIHJldHVybiB0aW1lcklkID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiB0cmFpbGluZ0VkZ2Uobm93KCkpO1xuXHQgIH1cblxuXHQgIGZ1bmN0aW9uIGRlYm91bmNlZCgpIHtcblx0ICAgIHZhciB0aW1lID0gbm93KCksXG5cdCAgICAgICAgaXNJbnZva2luZyA9IHNob3VsZEludm9rZSh0aW1lKTtcblxuXHQgICAgbGFzdEFyZ3MgPSBhcmd1bWVudHM7XG5cdCAgICBsYXN0VGhpcyA9IHRoaXM7XG5cdCAgICBsYXN0Q2FsbFRpbWUgPSB0aW1lO1xuXG5cdCAgICBpZiAoaXNJbnZva2luZykge1xuXHQgICAgICBpZiAodGltZXJJZCA9PT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgcmV0dXJuIGxlYWRpbmdFZGdlKGxhc3RDYWxsVGltZSk7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKG1heGluZykge1xuXHQgICAgICAgIC8vIEhhbmRsZSBpbnZvY2F0aW9ucyBpbiBhIHRpZ2h0IGxvb3AuXG5cdCAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVySWQpO1xuXHQgICAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG5cdCAgICAgICAgcmV0dXJuIGludm9rZUZ1bmMobGFzdENhbGxUaW1lKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgaWYgKHRpbWVySWQgPT09IHVuZGVmaW5lZCkge1xuXHQgICAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIHJlc3VsdDtcblx0ICB9XG5cdCAgZGVib3VuY2VkLmNhbmNlbCA9IGNhbmNlbDtcblx0ICBkZWJvdW5jZWQuZmx1c2ggPSBmbHVzaDtcblx0ICByZXR1cm4gZGVib3VuY2VkO1xuXHR9XG5cblx0ZGVib3VuY2VfMSA9IGRlYm91bmNlO1xuXHRyZXR1cm4gZGVib3VuY2VfMTtcbn1cblxudmFyIGRlYm91bmNlRXhwb3J0cyA9IHJlcXVpcmVEZWJvdW5jZSgpO1xudmFyIGRlYm91bmNlID0gLypAX19QVVJFX18qL2dldERlZmF1bHRFeHBvcnRGcm9tQ2pzKGRlYm91bmNlRXhwb3J0cyk7XG5cbnZhciBwZXJmb3JtYW5jZSQxID0gX3dpbmRvdyA/IF93aW5kb3cucGVyZm9ybWFuY2UgOiBudWxsO1xudmFyIHBub3cgPSBwZXJmb3JtYW5jZSQxICYmIHBlcmZvcm1hbmNlJDEubm93ID8gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gcGVyZm9ybWFuY2UkMS5ub3coKTtcbn0gOiBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBEYXRlLm5vdygpO1xufTtcbnZhciByYWYgPSBmdW5jdGlvbiAoKSB7XG4gIGlmIChfd2luZG93KSB7XG4gICAgaWYgKF93aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgIF93aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZuKTtcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChfd2luZG93Lm1velJlcXVlc3RBbmltYXRpb25GcmFtZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChmbikge1xuICAgICAgICBfd2luZG93Lm1velJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7XG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoX3dpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgX3dpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZm4pO1xuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKF93aW5kb3cubXNSZXF1ZXN0QW5pbWF0aW9uRnJhbWUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgX3dpbmRvdy5tc1JlcXVlc3RBbmltYXRpb25GcmFtZShmbik7XG4gICAgICB9O1xuICAgIH1cbiAgfVxuICByZXR1cm4gZnVuY3Rpb24gKGZuKSB7XG4gICAgaWYgKGZuKSB7XG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZm4ocG5vdygpKTtcbiAgICAgIH0sIDEwMDAgLyA2MCk7XG4gICAgfVxuICB9O1xufSgpO1xudmFyIHJlcXVlc3RBbmltYXRpb25GcmFtZSA9IGZ1bmN0aW9uIHJlcXVlc3RBbmltYXRpb25GcmFtZShmbikge1xuICByZXR1cm4gcmFmKGZuKTtcbn07XG52YXIgcGVyZm9ybWFuY2VOb3cgPSBwbm93O1xuXG52YXIgREVGQVVMVF9IQVNIX1NFRUQgPSA5MjYxO1xudmFyIEsgPSA2NTU5OTsgLy8gMzcgYWxzbyB3b3JrcyBwcmV0dHkgd2VsbFxudmFyIERFRkFVTFRfSEFTSF9TRUVEX0FMVCA9IDUzODE7XG52YXIgaGFzaEl0ZXJhYmxlSW50cyA9IGZ1bmN0aW9uIGhhc2hJdGVyYWJsZUludHMoaXRlcmF0b3IpIHtcbiAgdmFyIHNlZWQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IERFRkFVTFRfSEFTSF9TRUVEO1xuICAvLyBzZGJtL3N0cmluZy1oYXNoXG4gIHZhciBoYXNoID0gc2VlZDtcbiAgdmFyIGVudHJ5O1xuICBmb3IgKDs7KSB7XG4gICAgZW50cnkgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgaWYgKGVudHJ5LmRvbmUpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBoYXNoID0gaGFzaCAqIEsgKyBlbnRyeS52YWx1ZSB8IDA7XG4gIH1cbiAgcmV0dXJuIGhhc2g7XG59O1xudmFyIGhhc2hJbnQgPSBmdW5jdGlvbiBoYXNoSW50KG51bSkge1xuICB2YXIgc2VlZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogREVGQVVMVF9IQVNIX1NFRUQ7XG4gIC8vIHNkYm0vc3RyaW5nLWhhc2hcbiAgcmV0dXJuIHNlZWQgKiBLICsgbnVtIHwgMDtcbn07XG52YXIgaGFzaEludEFsdCA9IGZ1bmN0aW9uIGhhc2hJbnRBbHQobnVtKSB7XG4gIHZhciBzZWVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBERUZBVUxUX0hBU0hfU0VFRF9BTFQ7XG4gIC8vIGRqYjIvc3RyaW5nLWhhc2hcbiAgcmV0dXJuIChzZWVkIDw8IDUpICsgc2VlZCArIG51bSB8IDA7XG59O1xudmFyIGNvbWJpbmVIYXNoZXMgPSBmdW5jdGlvbiBjb21iaW5lSGFzaGVzKGhhc2gxLCBoYXNoMikge1xuICByZXR1cm4gaGFzaDEgKiAweDIwMDAwMCArIGhhc2gyO1xufTtcbnZhciBjb21iaW5lSGFzaGVzQXJyYXkgPSBmdW5jdGlvbiBjb21iaW5lSGFzaGVzQXJyYXkoaGFzaGVzKSB7XG4gIHJldHVybiBoYXNoZXNbMF0gKiAweDIwMDAwMCArIGhhc2hlc1sxXTtcbn07XG52YXIgaGFzaEFycmF5cyA9IGZ1bmN0aW9uIGhhc2hBcnJheXMoaGFzaGVzMSwgaGFzaGVzMikge1xuICByZXR1cm4gW2hhc2hJbnQoaGFzaGVzMVswXSwgaGFzaGVzMlswXSksIGhhc2hJbnRBbHQoaGFzaGVzMVsxXSwgaGFzaGVzMlsxXSldO1xufTtcbnZhciBoYXNoSW50c0FycmF5ID0gZnVuY3Rpb24gaGFzaEludHNBcnJheShpbnRzLCBzZWVkKSB7XG4gIHZhciBlbnRyeSA9IHtcbiAgICB2YWx1ZTogMCxcbiAgICBkb25lOiBmYWxzZVxuICB9O1xuICB2YXIgaSA9IDA7XG4gIHZhciBsZW5ndGggPSBpbnRzLmxlbmd0aDtcbiAgdmFyIGl0ZXJhdG9yID0ge1xuICAgIG5leHQ6IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICBpZiAoaSA8IGxlbmd0aCkge1xuICAgICAgICBlbnRyeS52YWx1ZSA9IGludHNbaSsrXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVudHJ5LmRvbmUgPSB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVudHJ5O1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGhhc2hJdGVyYWJsZUludHMoaXRlcmF0b3IsIHNlZWQpO1xufTtcbnZhciBoYXNoU3RyaW5nID0gZnVuY3Rpb24gaGFzaFN0cmluZyhzdHIsIHNlZWQpIHtcbiAgdmFyIGVudHJ5ID0ge1xuICAgIHZhbHVlOiAwLFxuICAgIGRvbmU6IGZhbHNlXG4gIH07XG4gIHZhciBpID0gMDtcbiAgdmFyIGxlbmd0aCA9IHN0ci5sZW5ndGg7XG4gIHZhciBpdGVyYXRvciA9IHtcbiAgICBuZXh0OiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgaWYgKGkgPCBsZW5ndGgpIHtcbiAgICAgICAgZW50cnkudmFsdWUgPSBzdHIuY2hhckNvZGVBdChpKyspO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW50cnkuZG9uZSA9IHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZW50cnk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gaGFzaEl0ZXJhYmxlSW50cyhpdGVyYXRvciwgc2VlZCk7XG59O1xudmFyIGhhc2hTdHJpbmdzID0gZnVuY3Rpb24gaGFzaFN0cmluZ3MoKSB7XG4gIHJldHVybiBoYXNoU3RyaW5nc0FycmF5KGFyZ3VtZW50cyk7XG59O1xudmFyIGhhc2hTdHJpbmdzQXJyYXkgPSBmdW5jdGlvbiBoYXNoU3RyaW5nc0FycmF5KHN0cnMpIHtcbiAgdmFyIGhhc2g7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3Rycy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzdHIgPSBzdHJzW2ldO1xuICAgIGlmIChpID09PSAwKSB7XG4gICAgICBoYXNoID0gaGFzaFN0cmluZyhzdHIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBoYXNoID0gaGFzaFN0cmluZyhzdHIsIGhhc2gpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaGFzaDtcbn07XG5cbmZ1bmN0aW9uIHJvdGF0ZVBvaW50KHgsIHksIGNlbnRlclgsIGNlbnRlclksIGFuZ2xlRGVncmVlcykge1xuICB2YXIgYW5nbGVSYWRpYW5zID0gYW5nbGVEZWdyZWVzICogTWF0aC5QSSAvIDE4MDtcbiAgdmFyIHJvdGF0ZWRYID0gTWF0aC5jb3MoYW5nbGVSYWRpYW5zKSAqICh4IC0gY2VudGVyWCkgLSBNYXRoLnNpbihhbmdsZVJhZGlhbnMpICogKHkgLSBjZW50ZXJZKSArIGNlbnRlclg7XG4gIHZhciByb3RhdGVkWSA9IE1hdGguc2luKGFuZ2xlUmFkaWFucykgKiAoeCAtIGNlbnRlclgpICsgTWF0aC5jb3MoYW5nbGVSYWRpYW5zKSAqICh5IC0gY2VudGVyWSkgKyBjZW50ZXJZO1xuICByZXR1cm4ge1xuICAgIHg6IHJvdGF0ZWRYLFxuICAgIHk6IHJvdGF0ZWRZXG4gIH07XG59XG52YXIgbW92ZVBvaW50QnlCb3hBc3BlY3QgPSBmdW5jdGlvbiBtb3ZlUG9pbnRCeUJveEFzcGVjdCh4LCB5LCBib3hYLCBib3hZLCBza2V3WCwgc2tld1kpIHtcbiAgcmV0dXJuIHtcbiAgICB4OiAoeCAtIGJveFgpICogc2tld1ggKyBib3hYLFxuICAgIHk6ICh5IC0gYm94WSkgKiBza2V3WSArIGJveFlcbiAgfTtcbn07XG5mdW5jdGlvbiByb3RhdGVQb3NBbmRTa2V3QnlCb3gocG9zLCBib3gsIGFuZ2xlRGVncmVlcykge1xuICBpZiAoYW5nbGVEZWdyZWVzID09PSAwKSByZXR1cm4gcG9zO1xuICB2YXIgY2VudGVyWCA9IChib3gueDEgKyBib3gueDIpIC8gMjtcbiAgdmFyIGNlbnRlclkgPSAoYm94LnkxICsgYm94LnkyKSAvIDI7XG4gIHZhciBza2V3WCA9IGJveC53IC8gYm94Lmg7XG4gIHZhciBza2V3WSA9IDEgLyBza2V3WDtcbiAgdmFyIHJvdGF0ZWQgPSByb3RhdGVQb2ludChwb3MueCwgcG9zLnksIGNlbnRlclgsIGNlbnRlclksIGFuZ2xlRGVncmVlcyk7XG4gIHZhciBza2V3ZWQgPSBtb3ZlUG9pbnRCeUJveEFzcGVjdChyb3RhdGVkLngsIHJvdGF0ZWQueSwgY2VudGVyWCwgY2VudGVyWSwgc2tld1gsIHNrZXdZKTtcbiAgcmV0dXJuIHtcbiAgICB4OiBza2V3ZWQueCxcbiAgICB5OiBza2V3ZWQueVxuICB9O1xufVxuXG52YXIgd2FybmluZ3NFbmFibGVkID0gdHJ1ZTtcbnZhciB3YXJuU3VwcG9ydGVkID0gY29uc29sZS53YXJuICE9IG51bGw7XG52YXIgdHJhY2VTdXBwb3J0ZWQgPSBjb25zb2xlLnRyYWNlICE9IG51bGw7XG52YXIgTUFYX0lOVCQxID0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIgfHwgOTAwNzE5OTI1NDc0MDk5MTtcbnZhciB0cnVlaWZ5ID0gZnVuY3Rpb24gdHJ1ZWlmeSgpIHtcbiAgcmV0dXJuIHRydWU7XG59O1xudmFyIGZhbHNpZnkgPSBmdW5jdGlvbiBmYWxzaWZ5KCkge1xuICByZXR1cm4gZmFsc2U7XG59O1xudmFyIHplcm9pZnkgPSBmdW5jdGlvbiB6ZXJvaWZ5KCkge1xuICByZXR1cm4gMDtcbn07XG52YXIgbm9vcCQxID0gZnVuY3Rpb24gbm9vcCgpIHt9O1xudmFyIGVycm9yID0gZnVuY3Rpb24gZXJyb3IobXNnKSB7XG4gIHRocm93IG5ldyBFcnJvcihtc2cpO1xufTtcbnZhciB3YXJuaW5ncyA9IGZ1bmN0aW9uIHdhcm5pbmdzKGVuYWJsZWQpIHtcbiAgaWYgKGVuYWJsZWQgIT09IHVuZGVmaW5lZCkge1xuICAgIHdhcm5pbmdzRW5hYmxlZCA9ICEhZW5hYmxlZDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gd2FybmluZ3NFbmFibGVkO1xuICB9XG59O1xudmFyIHdhcm4gPSBmdW5jdGlvbiB3YXJuKG1zZykge1xuICBpZiAoIXdhcm5pbmdzKCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHdhcm5TdXBwb3J0ZWQpIHtcbiAgICBjb25zb2xlLndhcm4obXNnKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmxvZyhtc2cpO1xuICAgIGlmICh0cmFjZVN1cHBvcnRlZCkge1xuICAgICAgY29uc29sZS50cmFjZSgpO1xuICAgIH1cbiAgfVxufTtcbnZhciBjbG9uZSA9IGZ1bmN0aW9uIGNsb25lKG9iaikge1xuICByZXR1cm4gZXh0ZW5kKHt9LCBvYmopO1xufTtcblxuLy8gZ2V0cyBhIHNoYWxsb3cgY29weSBvZiB0aGUgYXJndW1lbnRcbnZhciBjb3B5ID0gZnVuY3Rpb24gY29weShvYmopIHtcbiAgaWYgKG9iaiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuICBpZiAoYXJyYXkob2JqKSkge1xuICAgIHJldHVybiBvYmouc2xpY2UoKTtcbiAgfSBlbHNlIGlmIChwbGFpbk9iamVjdChvYmopKSB7XG4gICAgcmV0dXJuIGNsb25lKG9iaik7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxufTtcbnZhciBjb3B5QXJyYXkgPSBmdW5jdGlvbiBjb3B5QXJyYXkoYXJyKSB7XG4gIHJldHVybiBhcnIuc2xpY2UoKTtcbn07XG52YXIgdXVpZCA9IGZ1bmN0aW9uIHV1aWQoYSwgYiAvKiBwbGFjZWhvbGRlcnMgKi8pIHtcbiAgZm9yIChcbiAgLy8gbG9vcCA6KVxuICBiID0gYSA9ICcnO1xuICAvLyBiIC0gcmVzdWx0ICwgYSAtIG51bWVyaWMgbGV0aWFibGVcbiAgYSsrIDwgMzY7XG4gIC8vXG4gIGIgKz0gYSAqIDUxICYgNTIgLy8gaWYgXCJhXCIgaXMgbm90IDkgb3IgMTQgb3IgMTkgb3IgMjRcbiAgP1xuICAvLyAgcmV0dXJuIGEgcmFuZG9tIG51bWJlciBvciA0XG4gIChhIF4gMTUgLy8gaWYgXCJhXCIgaXMgbm90IDE1XG4gID9cbiAgLy8gZ2VuZXJhdGUgYSByYW5kb20gbnVtYmVyIGZyb20gMCB0byAxNVxuICA4IF4gTWF0aC5yYW5kb20oKSAqIChhIF4gMjAgPyAxNiA6IDQpIC8vIHVubGVzcyBcImFcIiBpcyAyMCwgaW4gd2hpY2ggY2FzZSBhIHJhbmRvbSBudW1iZXIgZnJvbSA4IHRvIDExXG4gIDogNCAvLyAgb3RoZXJ3aXNlIDRcbiAgKS50b1N0cmluZygxNikgOiAnLScgLy8gIGluIG90aGVyIGNhc2VzIChpZiBcImFcIiBpcyA5LDE0LDE5LDI0KSBpbnNlcnQgXCItXCJcbiAgKTtcbiAgcmV0dXJuIGI7XG59O1xudmFyIF9zdGF0aWNFbXB0eU9iamVjdCA9IHt9O1xudmFyIHN0YXRpY0VtcHR5T2JqZWN0ID0gZnVuY3Rpb24gc3RhdGljRW1wdHlPYmplY3QoKSB7XG4gIHJldHVybiBfc3RhdGljRW1wdHlPYmplY3Q7XG59O1xudmFyIGRlZmF1bHRzJGcgPSBmdW5jdGlvbiBkZWZhdWx0cyhfZGVmYXVsdHMpIHtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhfZGVmYXVsdHMpO1xuICByZXR1cm4gZnVuY3Rpb24gKG9wdHMpIHtcbiAgICB2YXIgZmlsbGVkT3B0cyA9IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgICB2YXIgb3B0VmFsID0gb3B0cyA9PSBudWxsID8gdW5kZWZpbmVkIDogb3B0c1trZXldO1xuICAgICAgZmlsbGVkT3B0c1trZXldID0gb3B0VmFsID09PSB1bmRlZmluZWQgPyBfZGVmYXVsdHNba2V5XSA6IG9wdFZhbDtcbiAgICB9XG4gICAgcmV0dXJuIGZpbGxlZE9wdHM7XG4gIH07XG59O1xudmFyIHJlbW92ZUZyb21BcnJheSA9IGZ1bmN0aW9uIHJlbW92ZUZyb21BcnJheShhcnIsIGVsZSwgb25lQ29weSkge1xuICBmb3IgKHZhciBpID0gYXJyLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgaWYgKGFycltpXSA9PT0gZWxlKSB7XG4gICAgICBhcnIuc3BsaWNlKGksIDEpO1xuICAgIH1cbiAgfVxufTtcbnZhciBjbGVhckFycmF5ID0gZnVuY3Rpb24gY2xlYXJBcnJheShhcnIpIHtcbiAgYXJyLnNwbGljZSgwLCBhcnIubGVuZ3RoKTtcbn07XG52YXIgcHVzaCA9IGZ1bmN0aW9uIHB1c2goYXJyLCBvdGhlckFycikge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG90aGVyQXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVsID0gb3RoZXJBcnJbaV07XG4gICAgYXJyLnB1c2goZWwpO1xuICB9XG59O1xudmFyIGdldFByZWZpeGVkUHJvcGVydHkgPSBmdW5jdGlvbiBnZXRQcmVmaXhlZFByb3BlcnR5KG9iaiwgcHJvcE5hbWUsIHByZWZpeCkge1xuICBpZiAocHJlZml4KSB7XG4gICAgcHJvcE5hbWUgPSBwcmVwZW5kQ2FtZWwocHJlZml4LCBwcm9wTmFtZSk7IC8vIGUuZy4gKGxhYmVsV2lkdGgsIHNvdXJjZSkgPT4gc291cmNlTGFiZWxXaWR0aFxuICB9XG4gIHJldHVybiBvYmpbcHJvcE5hbWVdO1xufTtcbnZhciBzZXRQcmVmaXhlZFByb3BlcnR5ID0gZnVuY3Rpb24gc2V0UHJlZml4ZWRQcm9wZXJ0eShvYmosIHByb3BOYW1lLCBwcmVmaXgsIHZhbHVlKSB7XG4gIGlmIChwcmVmaXgpIHtcbiAgICBwcm9wTmFtZSA9IHByZXBlbmRDYW1lbChwcmVmaXgsIHByb3BOYW1lKTsgLy8gZS5nLiAobGFiZWxXaWR0aCwgc291cmNlKSA9PiBzb3VyY2VMYWJlbFdpZHRoXG4gIH1cbiAgb2JqW3Byb3BOYW1lXSA9IHZhbHVlO1xufTtcblxuLyogZ2xvYmFsIE1hcCAqL1xudmFyIE9iamVjdE1hcCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIE9iamVjdE1hcCgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgT2JqZWN0TWFwKTtcbiAgICB0aGlzLl9vYmogPSB7fTtcbiAgfVxuICByZXR1cm4gX2NyZWF0ZUNsYXNzKE9iamVjdE1hcCwgW3tcbiAgICBrZXk6IFwic2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldChrZXksIHZhbCkge1xuICAgICAgdGhpcy5fb2JqW2tleV0gPSB2YWw7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZGVsZXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9kZWxldGUoa2V5KSB7XG4gICAgICB0aGlzLl9vYmpba2V5XSA9IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjbGVhclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjbGVhcigpIHtcbiAgICAgIHRoaXMuX29iaiA9IHt9O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJoYXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFzKGtleSkge1xuICAgICAgcmV0dXJuIHRoaXMuX29ialtrZXldICE9PSB1bmRlZmluZWQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5fb2JqW2tleV07XG4gICAgfVxuICB9XSk7XG59KCk7XG52YXIgTWFwJDEgPSB0eXBlb2YgTWFwICE9PSAndW5kZWZpbmVkJyA/IE1hcCA6IE9iamVjdE1hcDtcblxuLyogZ2xvYmFsIFNldCAqL1xuXG52YXIgdW5kZWYgPSBcInVuZGVmaW5lZFwiIDtcbnZhciBPYmplY3RTZXQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBPYmplY3RTZXQoYXJyYXlPck9iamVjdFNldCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBPYmplY3RTZXQpO1xuICAgIHRoaXMuX29iaiA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGhpcy5zaXplID0gMDtcbiAgICBpZiAoYXJyYXlPck9iamVjdFNldCAhPSBudWxsKSB7XG4gICAgICB2YXIgYXJyO1xuICAgICAgaWYgKGFycmF5T3JPYmplY3RTZXQuaW5zdGFuY2VTdHJpbmcgIT0gbnVsbCAmJiBhcnJheU9yT2JqZWN0U2V0Lmluc3RhbmNlU3RyaW5nKCkgPT09IHRoaXMuaW5zdGFuY2VTdHJpbmcoKSkge1xuICAgICAgICBhcnIgPSBhcnJheU9yT2JqZWN0U2V0LnRvQXJyYXkoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFyciA9IGFycmF5T3JPYmplY3RTZXQ7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLmFkZChhcnJbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gX2NyZWF0ZUNsYXNzKE9iamVjdFNldCwgW3tcbiAgICBrZXk6IFwiaW5zdGFuY2VTdHJpbmdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW5zdGFuY2VTdHJpbmcoKSB7XG4gICAgICByZXR1cm4gJ3NldCc7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImFkZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGQodmFsKSB7XG4gICAgICB2YXIgbyA9IHRoaXMuX29iajtcbiAgICAgIGlmIChvW3ZhbF0gIT09IDEpIHtcbiAgICAgICAgb1t2YWxdID0gMTtcbiAgICAgICAgdGhpcy5zaXplKys7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImRlbGV0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfZGVsZXRlKHZhbCkge1xuICAgICAgdmFyIG8gPSB0aGlzLl9vYmo7XG4gICAgICBpZiAob1t2YWxdID09PSAxKSB7XG4gICAgICAgIG9bdmFsXSA9IDA7XG4gICAgICAgIHRoaXMuc2l6ZS0tO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjbGVhclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjbGVhcigpIHtcbiAgICAgIHRoaXMuX29iaiA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImhhc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYXModmFsKSB7XG4gICAgICByZXR1cm4gdGhpcy5fb2JqW3ZhbF0gPT09IDE7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInRvQXJyYXlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9BcnJheSgpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5fb2JqKS5maWx0ZXIoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICByZXR1cm4gX3RoaXMuaGFzKGtleSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZm9yRWFjaFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmb3JFYWNoKGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgICByZXR1cm4gdGhpcy50b0FycmF5KCkuZm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZyk7XG4gICAgfVxuICB9XSk7XG59KCk7XG52YXIgU2V0JDEgPSAodHlwZW9mIFNldCA9PT0gXCJ1bmRlZmluZWRcIiA/IFwidW5kZWZpbmVkXCIgOiBfdHlwZW9mKFNldCkpICE9PSB1bmRlZiA/IFNldCA6IE9iamVjdFNldDtcblxuLy8gcmVwcmVzZW50cyBhIG5vZGUgb3IgYW4gZWRnZVxudmFyIEVsZW1lbnQgPSBmdW5jdGlvbiBFbGVtZW50KGN5LCBwYXJhbXMpIHtcbiAgdmFyIHJlc3RvcmUgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHRydWU7XG4gIGlmIChjeSA9PT0gdW5kZWZpbmVkIHx8IHBhcmFtcyA9PT0gdW5kZWZpbmVkIHx8ICFjb3JlKGN5KSkge1xuICAgIGVycm9yKCdBbiBlbGVtZW50IG11c3QgaGF2ZSBhIGNvcmUgcmVmZXJlbmNlIGFuZCBwYXJhbWV0ZXJzIHNldCcpO1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgZ3JvdXAgPSBwYXJhbXMuZ3JvdXA7XG5cbiAgLy8gdHJ5IHRvIGF1dG9tYXRpY2FsbHkgaW5mZXIgdGhlIGdyb3VwIGlmIHVuc3BlY2lmaWVkXG4gIGlmIChncm91cCA9PSBudWxsKSB7XG4gICAgaWYgKHBhcmFtcy5kYXRhICYmIHBhcmFtcy5kYXRhLnNvdXJjZSAhPSBudWxsICYmIHBhcmFtcy5kYXRhLnRhcmdldCAhPSBudWxsKSB7XG4gICAgICBncm91cCA9ICdlZGdlcyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdyb3VwID0gJ25vZGVzJztcbiAgICB9XG4gIH1cblxuICAvLyB2YWxpZGF0ZSBncm91cFxuICBpZiAoZ3JvdXAgIT09ICdub2RlcycgJiYgZ3JvdXAgIT09ICdlZGdlcycpIHtcbiAgICBlcnJvcignQW4gZWxlbWVudCBtdXN0IGJlIG9mIHR5cGUgYG5vZGVzYCBvciBgZWRnZXNgOyB5b3Ugc3BlY2lmaWVkIGAnICsgZ3JvdXAgKyAnYCcpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIG1ha2UgdGhlIGVsZW1lbnQgYXJyYXktbGlrZSwganVzdCBsaWtlIGEgY29sbGVjdGlvblxuICB0aGlzLmxlbmd0aCA9IDE7XG4gIHRoaXNbMF0gPSB0aGlzO1xuXG4gIC8vIE5PVEU6IHdoZW4gc29tZXRoaW5nIGlzIGFkZGVkIGhlcmUsIGFkZCBhbHNvIHRvIGVsZS5qc29uKClcbiAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZSA9IHtcbiAgICBjeTogY3ksXG4gICAgc2luZ2xlOiB0cnVlLFxuICAgIC8vIGluZGljYXRlcyB0aGlzIGlzIGFuIGVsZW1lbnRcbiAgICBkYXRhOiBwYXJhbXMuZGF0YSB8fCB7fSxcbiAgICAvLyBkYXRhIG9iamVjdFxuICAgIHBvc2l0aW9uOiBwYXJhbXMucG9zaXRpb24gfHwge1xuICAgICAgeDogMCxcbiAgICAgIHk6IDBcbiAgICB9LFxuICAgIC8vICh4LCB5KSBwb3NpdGlvbiBwYWlyXG4gICAgYXV0b1dpZHRoOiB1bmRlZmluZWQsXG4gICAgLy8gd2lkdGggYW5kIGhlaWdodCBvZiBub2RlcyBjYWxjdWxhdGVkIGJ5IHRoZSByZW5kZXJlciB3aGVuIHNldCB0byBzcGVjaWFsICdhdXRvJyB2YWx1ZVxuICAgIGF1dG9IZWlnaHQ6IHVuZGVmaW5lZCxcbiAgICBhdXRvUGFkZGluZzogdW5kZWZpbmVkLFxuICAgIGNvbXBvdW5kQm91bmRzQ2xlYW46IGZhbHNlLFxuICAgIC8vIHdoZXRoZXIgdGhlIGNvbXBvdW5kIGRpbWVuc2lvbnMgbmVlZCB0byBiZSByZWNhbGN1bGF0ZWQgdGhlIG5leHQgdGltZSBkaW1lbnNpb25zIGFyZSByZWFkXG4gICAgbGlzdGVuZXJzOiBbXSxcbiAgICAvLyBhcnJheSBvZiBib3VuZCBsaXN0ZW5lcnNcbiAgICBncm91cDogZ3JvdXAsXG4gICAgLy8gc3RyaW5nOyAnbm9kZXMnIG9yICdlZGdlcydcbiAgICBzdHlsZToge30sXG4gICAgLy8gcHJvcGVydGllcyBhcyBzZXQgYnkgdGhlIHN0eWxlXG4gICAgcnN0eWxlOiB7fSxcbiAgICAvLyBwcm9wZXJ0aWVzIGZvciBzdHlsZSBzZW50IGZyb20gdGhlIHJlbmRlcmVyIHRvIHRoZSBjb3JlXG4gICAgc3R5bGVDeHRzOiBbXSxcbiAgICAvLyBhcHBsaWVkIHN0eWxlIGNvbnRleHRzIGZyb20gdGhlIHN0eWxlclxuICAgIHN0eWxlS2V5czoge30sXG4gICAgLy8gcGVyLWdyb3VwIGtleXMgb2Ygc3R5bGUgcHJvcGVydHkgdmFsdWVzXG4gICAgcmVtb3ZlZDogdHJ1ZSxcbiAgICAvLyB3aGV0aGVyIGl0J3MgaW5zaWRlIHRoZSB2aXM7IHRydWUgaWYgcmVtb3ZlZCAoc2V0IHRydWUgaGVyZSBzaW5jZSB3ZSBjYWxsIHJlc3RvcmUpXG4gICAgc2VsZWN0ZWQ6IHBhcmFtcy5zZWxlY3RlZCA/IHRydWUgOiBmYWxzZSxcbiAgICAvLyB3aGV0aGVyIGl0J3Mgc2VsZWN0ZWRcbiAgICBzZWxlY3RhYmxlOiBwYXJhbXMuc2VsZWN0YWJsZSA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IHBhcmFtcy5zZWxlY3RhYmxlID8gdHJ1ZSA6IGZhbHNlLFxuICAgIC8vIHdoZXRoZXIgaXQncyBzZWxlY3RhYmxlXG4gICAgbG9ja2VkOiBwYXJhbXMubG9ja2VkID8gdHJ1ZSA6IGZhbHNlLFxuICAgIC8vIHdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgbG9ja2VkIChjYW5ub3QgYmUgbW92ZWQpXG4gICAgZ3JhYmJlZDogZmFsc2UsXG4gICAgLy8gd2hldGhlciB0aGUgZWxlbWVudCBpcyBncmFiYmVkIGJ5IHRoZSBtb3VzZTsgcmVuZGVyZXIgc2V0cyB0aGlzIHByaXZhdGVseVxuICAgIGdyYWJiYWJsZTogcGFyYW1zLmdyYWJiYWJsZSA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IHBhcmFtcy5ncmFiYmFibGUgPyB0cnVlIDogZmFsc2UsXG4gICAgLy8gd2hldGhlciB0aGUgZWxlbWVudCBjYW4gYmUgZ3JhYmJlZFxuICAgIHBhbm5hYmxlOiBwYXJhbXMucGFubmFibGUgPT09IHVuZGVmaW5lZCA/IGdyb3VwID09PSAnZWRnZXMnID8gdHJ1ZSA6IGZhbHNlIDogcGFyYW1zLnBhbm5hYmxlID8gdHJ1ZSA6IGZhbHNlLFxuICAgIC8vIHdoZXRoZXIgdGhlIGVsZW1lbnQgaGFzIHBhc3N0aHJvdWdoIHBhbm5pbmcgZW5hYmxlZFxuICAgIGFjdGl2ZTogZmFsc2UsXG4gICAgLy8gd2hldGhlciB0aGUgZWxlbWVudCBpcyBhY3RpdmUgZnJvbSB1c2VyIGludGVyYWN0aW9uXG4gICAgY2xhc3NlczogbmV3IFNldCQxKCksXG4gICAgLy8gbWFwICggY2xhc3NOYW1lID0+IHRydWUgKVxuICAgIGFuaW1hdGlvbjoge1xuICAgICAgLy8gb2JqZWN0IGZvciBjdXJyZW50bHktcnVubmluZyBhbmltYXRpb25zXG4gICAgICBjdXJyZW50OiBbXSxcbiAgICAgIHF1ZXVlOiBbXVxuICAgIH0sXG4gICAgcnNjcmF0Y2g6IHt9LFxuICAgIC8vIG9iamVjdCBpbiB3aGljaCB0aGUgcmVuZGVyZXIgY2FuIHN0b3JlIGluZm9ybWF0aW9uXG4gICAgc2NyYXRjaDogcGFyYW1zLnNjcmF0Y2ggfHwge30sXG4gICAgLy8gc2NyYXRjaCBvYmplY3RzXG4gICAgZWRnZXM6IFtdLFxuICAgIC8vIGFycmF5IG9mIGNvbm5lY3RlZCBlZGdlc1xuICAgIGNoaWxkcmVuOiBbXSxcbiAgICAvLyBhcnJheSBvZiBjaGlsZHJlblxuICAgIHBhcmVudDogcGFyYW1zLnBhcmVudCAmJiBwYXJhbXMucGFyZW50LmlzTm9kZSgpID8gcGFyYW1zLnBhcmVudCA6IG51bGwsXG4gICAgLy8gcGFyZW50IHJlZlxuICAgIHRyYXZlcnNhbENhY2hlOiB7fSxcbiAgICAvLyBjYWNoZSBvZiBvdXRwdXQgb2YgdHJhdmVyc2FsIGZ1bmN0aW9uc1xuICAgIGJhY2tncm91bmRpbmc6IGZhbHNlLFxuICAgIC8vIHdoZXRoZXIgYmFja2dyb3VuZCBpbWFnZXMgYXJlIGxvYWRpbmdcbiAgICBiYkNhY2hlOiBudWxsLFxuICAgIC8vIGNhY2hlIG9mIHRoZSBjdXJyZW50IGJvdW5kaW5nIGJveFxuICAgIGJiQ2FjaGVTaGlmdDoge1xuICAgICAgeDogMCxcbiAgICAgIHk6IDBcbiAgICB9LFxuICAgIC8vIHNoaWZ0IGFwcGxpZWQgdG8gY2FjaGVkIGJiIHRvIGJlIGFwcGxpZWQgb24gbmV4dCBnZXRcbiAgICBib2R5Qm91bmRzOiBudWxsLFxuICAgIC8vIGJvdW5kcyBjYWNoZSBvZiBlbGVtZW50IGJvZHksIHcvbyBvdmVybGF5XG4gICAgb3ZlcmxheUJvdW5kczogbnVsbCxcbiAgICAvLyBib3VuZHMgY2FjaGUgb2YgZWxlbWVudCBib2R5LCBpbmNsdWRpbmcgb3ZlcmxheVxuICAgIGxhYmVsQm91bmRzOiB7XG4gICAgICAvLyBib3VuZHMgY2FjaGUgb2YgbGFiZWxzXG4gICAgICBhbGw6IG51bGwsXG4gICAgICBzb3VyY2U6IG51bGwsXG4gICAgICB0YXJnZXQ6IG51bGwsXG4gICAgICBtYWluOiBudWxsXG4gICAgfSxcbiAgICBhcnJvd0JvdW5kczoge1xuICAgICAgLy8gYm91bmRzIGNhY2hlIG9mIGVkZ2UgYXJyb3dzXG4gICAgICBzb3VyY2U6IG51bGwsXG4gICAgICB0YXJnZXQ6IG51bGwsXG4gICAgICAnbWlkLXNvdXJjZSc6IG51bGwsXG4gICAgICAnbWlkLXRhcmdldCc6IG51bGxcbiAgICB9XG4gIH07XG4gIGlmIChfcC5wb3NpdGlvbi54ID09IG51bGwpIHtcbiAgICBfcC5wb3NpdGlvbi54ID0gMDtcbiAgfVxuICBpZiAoX3AucG9zaXRpb24ueSA9PSBudWxsKSB7XG4gICAgX3AucG9zaXRpb24ueSA9IDA7XG4gIH1cblxuICAvLyByZW5kZXJlZFBvc2l0aW9uIG92ZXJyaWRlcyBpZiBzcGVjaWZpZWRcbiAgaWYgKHBhcmFtcy5yZW5kZXJlZFBvc2l0aW9uKSB7XG4gICAgdmFyIHJwb3MgPSBwYXJhbXMucmVuZGVyZWRQb3NpdGlvbjtcbiAgICB2YXIgcGFuID0gY3kucGFuKCk7XG4gICAgdmFyIHpvb20gPSBjeS56b29tKCk7XG4gICAgX3AucG9zaXRpb24gPSB7XG4gICAgICB4OiAocnBvcy54IC0gcGFuLngpIC8gem9vbSxcbiAgICAgIHk6IChycG9zLnkgLSBwYW4ueSkgLyB6b29tXG4gICAgfTtcbiAgfVxuICB2YXIgY2xhc3NlcyA9IFtdO1xuICBpZiAoYXJyYXkocGFyYW1zLmNsYXNzZXMpKSB7XG4gICAgY2xhc3NlcyA9IHBhcmFtcy5jbGFzc2VzO1xuICB9IGVsc2UgaWYgKHN0cmluZyhwYXJhbXMuY2xhc3NlcykpIHtcbiAgICBjbGFzc2VzID0gcGFyYW1zLmNsYXNzZXMuc3BsaXQoL1xccysvKTtcbiAgfVxuICBmb3IgKHZhciBpID0gMCwgbCA9IGNsYXNzZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgdmFyIGNscyA9IGNsYXNzZXNbaV07XG4gICAgaWYgKCFjbHMgfHwgY2xzID09PSAnJykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIF9wLmNsYXNzZXMuYWRkKGNscyk7XG4gIH1cbiAgdGhpcy5jcmVhdGVFbWl0dGVyKCk7XG4gIGlmIChyZXN0b3JlID09PSB1bmRlZmluZWQgfHwgcmVzdG9yZSkge1xuICAgIHRoaXMucmVzdG9yZSgpO1xuICB9XG4gIHZhciBieXBhc3MgPSBwYXJhbXMuc3R5bGUgfHwgcGFyYW1zLmNzcztcbiAgaWYgKGJ5cGFzcykge1xuICAgIHdhcm4oJ1NldHRpbmcgYSBgc3R5bGVgIGJ5cGFzcyBhdCBlbGVtZW50IGNyZWF0aW9uIHNob3VsZCBiZSBkb25lIG9ubHkgd2hlbiBhYnNvbHV0ZWx5IG5lY2Vzc2FyeS4gIFRyeSB0byB1c2UgdGhlIHN0eWxlc2hlZXQgaW5zdGVhZC4nKTtcbiAgICB0aGlzLnN0eWxlKGJ5cGFzcyk7XG4gIH1cbn07XG5cbnZhciBkZWZpbmVTZWFyY2ggPSBmdW5jdGlvbiBkZWZpbmVTZWFyY2gocGFyYW1zKSB7XG4gIHBhcmFtcyA9IHtcbiAgICBiZnM6IHBhcmFtcy5iZnMgfHwgIXBhcmFtcy5kZnMsXG4gICAgZGZzOiBwYXJhbXMuZGZzIHx8ICFwYXJhbXMuYmZzXG4gIH07XG5cbiAgLy8gZnJvbSBwc2V1ZG9jb2RlIG9uIHdpa2lwZWRpYVxuICByZXR1cm4gZnVuY3Rpb24gc2VhcmNoRm4ocm9vdHMsIGZuLCBkaXJlY3RlZCkge1xuICAgIHZhciBvcHRpb25zO1xuICAgIGlmIChwbGFpbk9iamVjdChyb290cykgJiYgIWVsZW1lbnRPckNvbGxlY3Rpb24ocm9vdHMpKSB7XG4gICAgICBvcHRpb25zID0gcm9vdHM7XG4gICAgICByb290cyA9IG9wdGlvbnMucm9vdHMgfHwgb3B0aW9ucy5yb290O1xuICAgICAgZm4gPSBvcHRpb25zLnZpc2l0O1xuICAgICAgZGlyZWN0ZWQgPSBvcHRpb25zLmRpcmVjdGVkO1xuICAgIH1cbiAgICBkaXJlY3RlZCA9IGFyZ3VtZW50cy5sZW5ndGggPT09IDIgJiYgIWZuJDYoZm4pID8gZm4gOiBkaXJlY3RlZDtcbiAgICBmbiA9IGZuJDYoZm4pID8gZm4gOiBmdW5jdGlvbiAoKSB7fTtcbiAgICB2YXIgY3kgPSB0aGlzLl9wcml2YXRlLmN5O1xuICAgIHZhciB2ID0gcm9vdHMgPSBzdHJpbmcocm9vdHMpID8gdGhpcy5maWx0ZXIocm9vdHMpIDogcm9vdHM7XG4gICAgdmFyIFEgPSBbXTtcbiAgICB2YXIgY29ubmVjdGVkTm9kZXMgPSBbXTtcbiAgICB2YXIgY29ubmVjdGVkQnkgPSB7fTtcbiAgICB2YXIgaWQyZGVwdGggPSB7fTtcbiAgICB2YXIgViA9IHt9O1xuICAgIHZhciBqID0gMDtcbiAgICB2YXIgZm91bmQ7XG4gICAgdmFyIF90aGlzJGJ5R3JvdXAgPSB0aGlzLmJ5R3JvdXAoKSxcbiAgICAgIG5vZGVzID0gX3RoaXMkYnlHcm91cC5ub2RlcyxcbiAgICAgIGVkZ2VzID0gX3RoaXMkYnlHcm91cC5lZGdlcztcblxuICAgIC8vIGVucXVldWUgdlxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdi5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHZpID0gdltpXTtcbiAgICAgIHZhciB2aUlkID0gdmkuaWQoKTtcbiAgICAgIGlmICh2aS5pc05vZGUoKSkge1xuICAgICAgICBRLnVuc2hpZnQodmkpO1xuICAgICAgICBpZiAocGFyYW1zLmJmcykge1xuICAgICAgICAgIFZbdmlJZF0gPSB0cnVlO1xuICAgICAgICAgIGNvbm5lY3RlZE5vZGVzLnB1c2godmkpO1xuICAgICAgICB9XG4gICAgICAgIGlkMmRlcHRoW3ZpSWRdID0gMDtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoKSB7XG4gICAgICAgIHZhciB2ID0gcGFyYW1zLmJmcyA/IFEuc2hpZnQoKSA6IFEucG9wKCk7XG4gICAgICAgIHZhciB2SWQgPSB2LmlkKCk7XG4gICAgICAgIGlmIChwYXJhbXMuZGZzKSB7XG4gICAgICAgICAgaWYgKFZbdklkXSkge1xuICAgICAgICAgICAgcmV0dXJuIDA7IC8vIGNvbnRpbnVlXG4gICAgICAgICAgfVxuICAgICAgICAgIFZbdklkXSA9IHRydWU7XG4gICAgICAgICAgY29ubmVjdGVkTm9kZXMucHVzaCh2KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGVwdGggPSBpZDJkZXB0aFt2SWRdO1xuICAgICAgICB2YXIgcHJldkVkZ2UgPSBjb25uZWN0ZWRCeVt2SWRdO1xuICAgICAgICB2YXIgc3JjID0gcHJldkVkZ2UgIT0gbnVsbCA/IHByZXZFZGdlLnNvdXJjZSgpIDogbnVsbDtcbiAgICAgICAgdmFyIHRndCA9IHByZXZFZGdlICE9IG51bGwgPyBwcmV2RWRnZS50YXJnZXQoKSA6IG51bGw7XG4gICAgICAgIHZhciBwcmV2Tm9kZSA9IHByZXZFZGdlID09IG51bGwgPyB1bmRlZmluZWQgOiB2LnNhbWUoc3JjKSA/IHRndFswXSA6IHNyY1swXTtcbiAgICAgICAgdmFyIHJldDtcbiAgICAgICAgcmV0ID0gZm4odiwgcHJldkVkZ2UsIHByZXZOb2RlLCBqKyssIGRlcHRoKTtcbiAgICAgICAgaWYgKHJldCA9PT0gdHJ1ZSkge1xuICAgICAgICAgIGZvdW5kID0gdjtcbiAgICAgICAgICByZXR1cm4gMTsgLy8gYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmV0ID09PSBmYWxzZSkge1xuICAgICAgICAgIHJldHVybiAxOyAvLyBicmVha1xuICAgICAgICB9XG4gICAgICAgIHZhciB2d0VkZ2VzID0gdi5jb25uZWN0ZWRFZGdlcygpLmZpbHRlcihmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIHJldHVybiAoIWRpcmVjdGVkIHx8IGUuc291cmNlKCkuc2FtZSh2KSkgJiYgZWRnZXMuaGFzKGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgdndFZGdlcy5sZW5ndGg7IF9pMisrKSB7XG4gICAgICAgICAgdmFyIGUgPSB2d0VkZ2VzW19pMl07XG4gICAgICAgICAgdmFyIHcgPSBlLmNvbm5lY3RlZE5vZGVzKCkuZmlsdGVyKGZ1bmN0aW9uIChuKSB7XG4gICAgICAgICAgICByZXR1cm4gIW4uc2FtZSh2KSAmJiBub2Rlcy5oYXMobik7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdmFyIHdJZCA9IHcuaWQoKTtcbiAgICAgICAgICBpZiAody5sZW5ndGggIT09IDAgJiYgIVZbd0lkXSkge1xuICAgICAgICAgICAgdyA9IHdbMF07XG4gICAgICAgICAgICBRLnB1c2godyk7XG4gICAgICAgICAgICBpZiAocGFyYW1zLmJmcykge1xuICAgICAgICAgICAgICBWW3dJZF0gPSB0cnVlO1xuICAgICAgICAgICAgICBjb25uZWN0ZWROb2Rlcy5wdXNoKHcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29ubmVjdGVkQnlbd0lkXSA9IGU7XG4gICAgICAgICAgICBpZDJkZXB0aFt3SWRdID0gaWQyZGVwdGhbdklkXSArIDE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgX3JldDtcbiAgICB3aGlsZSAoUS5sZW5ndGggIT09IDApIHtcbiAgICAgIF9yZXQgPSBfbG9vcCgpO1xuICAgICAgaWYgKF9yZXQgPT09IDApIGNvbnRpbnVlO1xuICAgICAgaWYgKF9yZXQgPT09IDEpIGJyZWFrO1xuICAgIH1cbiAgICB2YXIgY29ubmVjdGVkRWxlcyA9IGN5LmNvbGxlY3Rpb24oKTtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgY29ubmVjdGVkTm9kZXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgbm9kZSA9IGNvbm5lY3RlZE5vZGVzW19pXTtcbiAgICAgIHZhciBlZGdlID0gY29ubmVjdGVkQnlbbm9kZS5pZCgpXTtcbiAgICAgIGlmIChlZGdlICE9IG51bGwpIHtcbiAgICAgICAgY29ubmVjdGVkRWxlcy5wdXNoKGVkZ2UpO1xuICAgICAgfVxuICAgICAgY29ubmVjdGVkRWxlcy5wdXNoKG5vZGUpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcGF0aDogY3kuY29sbGVjdGlvbihjb25uZWN0ZWRFbGVzKSxcbiAgICAgIGZvdW5kOiBjeS5jb2xsZWN0aW9uKGZvdW5kKVxuICAgIH07XG4gIH07XG59O1xuXG4vLyBzZWFyY2gsIHNwYW5uaW5nIHRyZWVzLCBldGNcbnZhciBlbGVzZm4kdiA9IHtcbiAgYnJlYWR0aEZpcnN0U2VhcmNoOiBkZWZpbmVTZWFyY2goe1xuICAgIGJmczogdHJ1ZVxuICB9KSxcbiAgZGVwdGhGaXJzdFNlYXJjaDogZGVmaW5lU2VhcmNoKHtcbiAgICBkZnM6IHRydWVcbiAgfSlcbn07XG5cbi8vIG5pY2UsIHNob3J0IG1hdGhlbWF0aWNhbCBhbGlhc1xuZWxlc2ZuJHYuYmZzID0gZWxlc2ZuJHYuYnJlYWR0aEZpcnN0U2VhcmNoO1xuZWxlc2ZuJHYuZGZzID0gZWxlc2ZuJHYuZGVwdGhGaXJzdFNlYXJjaDtcblxudmFyIGhlYXAkMiA9IHtleHBvcnRzOiB7fX07XG5cbnZhciBoZWFwJDEgPSBoZWFwJDIuZXhwb3J0cztcblxudmFyIGhhc1JlcXVpcmVkSGVhcCQxO1xuXG5mdW5jdGlvbiByZXF1aXJlSGVhcCQxICgpIHtcblx0aWYgKGhhc1JlcXVpcmVkSGVhcCQxKSByZXR1cm4gaGVhcCQyLmV4cG9ydHM7XG5cdGhhc1JlcXVpcmVkSGVhcCQxID0gMTtcblx0KGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMkMSkge1xuXHRcdC8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS44LjBcblx0XHQoZnVuY3Rpb24oKSB7XG5cdFx0ICB2YXIgSGVhcCwgZGVmYXVsdENtcCwgZmxvb3IsIGhlYXBpZnksIGhlYXBwb3AsIGhlYXBwdXNoLCBoZWFwcHVzaHBvcCwgaGVhcHJlcGxhY2UsIGluc29ydCwgbWluLCBubGFyZ2VzdCwgbnNtYWxsZXN0LCB1cGRhdGVJdGVtLCBfc2lmdGRvd24sIF9zaWZ0dXA7XG5cblx0XHQgIGZsb29yID0gTWF0aC5mbG9vciwgbWluID0gTWF0aC5taW47XG5cblxuXHRcdCAgLypcblx0XHQgIERlZmF1bHQgY29tcGFyaXNvbiBmdW5jdGlvbiB0byBiZSB1c2VkXG5cdFx0ICAgKi9cblxuXHRcdCAgZGVmYXVsdENtcCA9IGZ1bmN0aW9uKHgsIHkpIHtcblx0XHQgICAgaWYgKHggPCB5KSB7XG5cdFx0ICAgICAgcmV0dXJuIC0xO1xuXHRcdCAgICB9XG5cdFx0ICAgIGlmICh4ID4geSkge1xuXHRcdCAgICAgIHJldHVybiAxO1xuXHRcdCAgICB9XG5cdFx0ICAgIHJldHVybiAwO1xuXHRcdCAgfTtcblxuXG5cdFx0ICAvKlxuXHRcdCAgSW5zZXJ0IGl0ZW0geCBpbiBsaXN0IGEsIGFuZCBrZWVwIGl0IHNvcnRlZCBhc3N1bWluZyBhIGlzIHNvcnRlZC5cblx0XHQgIFxuXHRcdCAgSWYgeCBpcyBhbHJlYWR5IGluIGEsIGluc2VydCBpdCB0byB0aGUgcmlnaHQgb2YgdGhlIHJpZ2h0bW9zdCB4LlxuXHRcdCAgXG5cdFx0ICBPcHRpb25hbCBhcmdzIGxvIChkZWZhdWx0IDApIGFuZCBoaSAoZGVmYXVsdCBhLmxlbmd0aCkgYm91bmQgdGhlIHNsaWNlXG5cdFx0ICBvZiBhIHRvIGJlIHNlYXJjaGVkLlxuXHRcdCAgICovXG5cblx0XHQgIGluc29ydCA9IGZ1bmN0aW9uKGEsIHgsIGxvLCBoaSwgY21wKSB7XG5cdFx0ICAgIHZhciBtaWQ7XG5cdFx0ICAgIGlmIChsbyA9PSBudWxsKSB7XG5cdFx0ICAgICAgbG8gPSAwO1xuXHRcdCAgICB9XG5cdFx0ICAgIGlmIChjbXAgPT0gbnVsbCkge1xuXHRcdCAgICAgIGNtcCA9IGRlZmF1bHRDbXA7XG5cdFx0ICAgIH1cblx0XHQgICAgaWYgKGxvIDwgMCkge1xuXHRcdCAgICAgIHRocm93IG5ldyBFcnJvcignbG8gbXVzdCBiZSBub24tbmVnYXRpdmUnKTtcblx0XHQgICAgfVxuXHRcdCAgICBpZiAoaGkgPT0gbnVsbCkge1xuXHRcdCAgICAgIGhpID0gYS5sZW5ndGg7XG5cdFx0ICAgIH1cblx0XHQgICAgd2hpbGUgKGxvIDwgaGkpIHtcblx0XHQgICAgICBtaWQgPSBmbG9vcigobG8gKyBoaSkgLyAyKTtcblx0XHQgICAgICBpZiAoY21wKHgsIGFbbWlkXSkgPCAwKSB7XG5cdFx0ICAgICAgICBoaSA9IG1pZDtcblx0XHQgICAgICB9IGVsc2Uge1xuXHRcdCAgICAgICAgbG8gPSBtaWQgKyAxO1xuXHRcdCAgICAgIH1cblx0XHQgICAgfVxuXHRcdCAgICByZXR1cm4gKFtdLnNwbGljZS5hcHBseShhLCBbbG8sIGxvIC0gbG9dLmNvbmNhdCh4KSksIHgpO1xuXHRcdCAgfTtcblxuXG5cdFx0ICAvKlxuXHRcdCAgUHVzaCBpdGVtIG9udG8gaGVhcCwgbWFpbnRhaW5pbmcgdGhlIGhlYXAgaW52YXJpYW50LlxuXHRcdCAgICovXG5cblx0XHQgIGhlYXBwdXNoID0gZnVuY3Rpb24oYXJyYXksIGl0ZW0sIGNtcCkge1xuXHRcdCAgICBpZiAoY21wID09IG51bGwpIHtcblx0XHQgICAgICBjbXAgPSBkZWZhdWx0Q21wO1xuXHRcdCAgICB9XG5cdFx0ICAgIGFycmF5LnB1c2goaXRlbSk7XG5cdFx0ICAgIHJldHVybiBfc2lmdGRvd24oYXJyYXksIDAsIGFycmF5Lmxlbmd0aCAtIDEsIGNtcCk7XG5cdFx0ICB9O1xuXG5cblx0XHQgIC8qXG5cdFx0ICBQb3AgdGhlIHNtYWxsZXN0IGl0ZW0gb2ZmIHRoZSBoZWFwLCBtYWludGFpbmluZyB0aGUgaGVhcCBpbnZhcmlhbnQuXG5cdFx0ICAgKi9cblxuXHRcdCAgaGVhcHBvcCA9IGZ1bmN0aW9uKGFycmF5LCBjbXApIHtcblx0XHQgICAgdmFyIGxhc3RlbHQsIHJldHVybml0ZW07XG5cdFx0ICAgIGlmIChjbXAgPT0gbnVsbCkge1xuXHRcdCAgICAgIGNtcCA9IGRlZmF1bHRDbXA7XG5cdFx0ICAgIH1cblx0XHQgICAgbGFzdGVsdCA9IGFycmF5LnBvcCgpO1xuXHRcdCAgICBpZiAoYXJyYXkubGVuZ3RoKSB7XG5cdFx0ICAgICAgcmV0dXJuaXRlbSA9IGFycmF5WzBdO1xuXHRcdCAgICAgIGFycmF5WzBdID0gbGFzdGVsdDtcblx0XHQgICAgICBfc2lmdHVwKGFycmF5LCAwLCBjbXApO1xuXHRcdCAgICB9IGVsc2Uge1xuXHRcdCAgICAgIHJldHVybml0ZW0gPSBsYXN0ZWx0O1xuXHRcdCAgICB9XG5cdFx0ICAgIHJldHVybiByZXR1cm5pdGVtO1xuXHRcdCAgfTtcblxuXG5cdFx0ICAvKlxuXHRcdCAgUG9wIGFuZCByZXR1cm4gdGhlIGN1cnJlbnQgc21hbGxlc3QgdmFsdWUsIGFuZCBhZGQgdGhlIG5ldyBpdGVtLlxuXHRcdCAgXG5cdFx0ICBUaGlzIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gaGVhcHBvcCgpIGZvbGxvd2VkIGJ5IGhlYXBwdXNoKCksIGFuZCBjYW4gYmVcblx0XHQgIG1vcmUgYXBwcm9wcmlhdGUgd2hlbiB1c2luZyBhIGZpeGVkIHNpemUgaGVhcC4gTm90ZSB0aGF0IHRoZSB2YWx1ZVxuXHRcdCAgcmV0dXJuZWQgbWF5IGJlIGxhcmdlciB0aGFuIGl0ZW0hIFRoYXQgY29uc3RyYWlucyByZWFzb25hYmxlIHVzZSBvZlxuXHRcdCAgdGhpcyByb3V0aW5lIHVubGVzcyB3cml0dGVuIGFzIHBhcnQgb2YgYSBjb25kaXRpb25hbCByZXBsYWNlbWVudDpcblx0XHQgICAgICBpZiBpdGVtID4gYXJyYXlbMF1cblx0XHQgICAgICAgIGl0ZW0gPSBoZWFwcmVwbGFjZShhcnJheSwgaXRlbSlcblx0XHQgICAqL1xuXG5cdFx0ICBoZWFwcmVwbGFjZSA9IGZ1bmN0aW9uKGFycmF5LCBpdGVtLCBjbXApIHtcblx0XHQgICAgdmFyIHJldHVybml0ZW07XG5cdFx0ICAgIGlmIChjbXAgPT0gbnVsbCkge1xuXHRcdCAgICAgIGNtcCA9IGRlZmF1bHRDbXA7XG5cdFx0ICAgIH1cblx0XHQgICAgcmV0dXJuaXRlbSA9IGFycmF5WzBdO1xuXHRcdCAgICBhcnJheVswXSA9IGl0ZW07XG5cdFx0ICAgIF9zaWZ0dXAoYXJyYXksIDAsIGNtcCk7XG5cdFx0ICAgIHJldHVybiByZXR1cm5pdGVtO1xuXHRcdCAgfTtcblxuXG5cdFx0ICAvKlxuXHRcdCAgRmFzdCB2ZXJzaW9uIG9mIGEgaGVhcHB1c2ggZm9sbG93ZWQgYnkgYSBoZWFwcG9wLlxuXHRcdCAgICovXG5cblx0XHQgIGhlYXBwdXNocG9wID0gZnVuY3Rpb24oYXJyYXksIGl0ZW0sIGNtcCkge1xuXHRcdCAgICB2YXIgX3JlZjtcblx0XHQgICAgaWYgKGNtcCA9PSBudWxsKSB7XG5cdFx0ICAgICAgY21wID0gZGVmYXVsdENtcDtcblx0XHQgICAgfVxuXHRcdCAgICBpZiAoYXJyYXkubGVuZ3RoICYmIGNtcChhcnJheVswXSwgaXRlbSkgPCAwKSB7XG5cdFx0ICAgICAgX3JlZiA9IFthcnJheVswXSwgaXRlbV0sIGl0ZW0gPSBfcmVmWzBdLCBhcnJheVswXSA9IF9yZWZbMV07XG5cdFx0ICAgICAgX3NpZnR1cChhcnJheSwgMCwgY21wKTtcblx0XHQgICAgfVxuXHRcdCAgICByZXR1cm4gaXRlbTtcblx0XHQgIH07XG5cblxuXHRcdCAgLypcblx0XHQgIFRyYW5zZm9ybSBsaXN0IGludG8gYSBoZWFwLCBpbi1wbGFjZSwgaW4gTyhhcnJheS5sZW5ndGgpIHRpbWUuXG5cdFx0ICAgKi9cblxuXHRcdCAgaGVhcGlmeSA9IGZ1bmN0aW9uKGFycmF5LCBjbXApIHtcblx0XHQgICAgdmFyIGksIF9pLCBfbGVuLCBfcmVmMSwgX3Jlc3VsdHMsIF9yZXN1bHRzMTtcblx0XHQgICAgaWYgKGNtcCA9PSBudWxsKSB7XG5cdFx0ICAgICAgY21wID0gZGVmYXVsdENtcDtcblx0XHQgICAgfVxuXHRcdCAgICBfcmVmMSA9IChmdW5jdGlvbigpIHtcblx0XHQgICAgICBfcmVzdWx0czEgPSBbXTtcblx0XHQgICAgICBmb3IgKHZhciBfaiA9IDAsIF9yZWYgPSBmbG9vcihhcnJheS5sZW5ndGggLyAyKTsgMCA8PSBfcmVmID8gX2ogPCBfcmVmIDogX2ogPiBfcmVmOyAwIDw9IF9yZWYgPyBfaisrIDogX2otLSl7IF9yZXN1bHRzMS5wdXNoKF9qKTsgfVxuXHRcdCAgICAgIHJldHVybiBfcmVzdWx0czE7XG5cdFx0ICAgIH0pLmFwcGx5KHRoaXMpLnJldmVyc2UoKTtcblx0XHQgICAgX3Jlc3VsdHMgPSBbXTtcblx0XHQgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBfcmVmMS5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykge1xuXHRcdCAgICAgIGkgPSBfcmVmMVtfaV07XG5cdFx0ICAgICAgX3Jlc3VsdHMucHVzaChfc2lmdHVwKGFycmF5LCBpLCBjbXApKTtcblx0XHQgICAgfVxuXHRcdCAgICByZXR1cm4gX3Jlc3VsdHM7XG5cdFx0ICB9O1xuXG5cblx0XHQgIC8qXG5cdFx0ICBVcGRhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBnaXZlbiBpdGVtIGluIHRoZSBoZWFwLlxuXHRcdCAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGV2ZXJ5IHRpbWUgdGhlIGl0ZW0gaXMgYmVpbmcgbW9kaWZpZWQuXG5cdFx0ICAgKi9cblxuXHRcdCAgdXBkYXRlSXRlbSA9IGZ1bmN0aW9uKGFycmF5LCBpdGVtLCBjbXApIHtcblx0XHQgICAgdmFyIHBvcztcblx0XHQgICAgaWYgKGNtcCA9PSBudWxsKSB7XG5cdFx0ICAgICAgY21wID0gZGVmYXVsdENtcDtcblx0XHQgICAgfVxuXHRcdCAgICBwb3MgPSBhcnJheS5pbmRleE9mKGl0ZW0pO1xuXHRcdCAgICBpZiAocG9zID09PSAtMSkge1xuXHRcdCAgICAgIHJldHVybjtcblx0XHQgICAgfVxuXHRcdCAgICBfc2lmdGRvd24oYXJyYXksIDAsIHBvcywgY21wKTtcblx0XHQgICAgcmV0dXJuIF9zaWZ0dXAoYXJyYXksIHBvcywgY21wKTtcblx0XHQgIH07XG5cblxuXHRcdCAgLypcblx0XHQgIEZpbmQgdGhlIG4gbGFyZ2VzdCBlbGVtZW50cyBpbiBhIGRhdGFzZXQuXG5cdFx0ICAgKi9cblxuXHRcdCAgbmxhcmdlc3QgPSBmdW5jdGlvbihhcnJheSwgbiwgY21wKSB7XG5cdFx0ICAgIHZhciBlbGVtLCByZXN1bHQsIF9pLCBfbGVuLCBfcmVmO1xuXHRcdCAgICBpZiAoY21wID09IG51bGwpIHtcblx0XHQgICAgICBjbXAgPSBkZWZhdWx0Q21wO1xuXHRcdCAgICB9XG5cdFx0ICAgIHJlc3VsdCA9IGFycmF5LnNsaWNlKDAsIG4pO1xuXHRcdCAgICBpZiAoIXJlc3VsdC5sZW5ndGgpIHtcblx0XHQgICAgICByZXR1cm4gcmVzdWx0O1xuXHRcdCAgICB9XG5cdFx0ICAgIGhlYXBpZnkocmVzdWx0LCBjbXApO1xuXHRcdCAgICBfcmVmID0gYXJyYXkuc2xpY2Uobik7XG5cdFx0ICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZi5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykge1xuXHRcdCAgICAgIGVsZW0gPSBfcmVmW19pXTtcblx0XHQgICAgICBoZWFwcHVzaHBvcChyZXN1bHQsIGVsZW0sIGNtcCk7XG5cdFx0ICAgIH1cblx0XHQgICAgcmV0dXJuIHJlc3VsdC5zb3J0KGNtcCkucmV2ZXJzZSgpO1xuXHRcdCAgfTtcblxuXG5cdFx0ICAvKlxuXHRcdCAgRmluZCB0aGUgbiBzbWFsbGVzdCBlbGVtZW50cyBpbiBhIGRhdGFzZXQuXG5cdFx0ICAgKi9cblxuXHRcdCAgbnNtYWxsZXN0ID0gZnVuY3Rpb24oYXJyYXksIG4sIGNtcCkge1xuXHRcdCAgICB2YXIgZWxlbSwgbG9zLCByZXN1bHQsIF9pLCBfaiwgX2xlbiwgX3JlZiwgX3JlZjEsIF9yZXN1bHRzO1xuXHRcdCAgICBpZiAoY21wID09IG51bGwpIHtcblx0XHQgICAgICBjbXAgPSBkZWZhdWx0Q21wO1xuXHRcdCAgICB9XG5cdFx0ICAgIGlmIChuICogMTAgPD0gYXJyYXkubGVuZ3RoKSB7XG5cdFx0ICAgICAgcmVzdWx0ID0gYXJyYXkuc2xpY2UoMCwgbikuc29ydChjbXApO1xuXHRcdCAgICAgIGlmICghcmVzdWx0Lmxlbmd0aCkge1xuXHRcdCAgICAgICAgcmV0dXJuIHJlc3VsdDtcblx0XHQgICAgICB9XG5cdFx0ICAgICAgbG9zID0gcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXTtcblx0XHQgICAgICBfcmVmID0gYXJyYXkuc2xpY2Uobik7XG5cdFx0ICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBfcmVmLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7XG5cdFx0ICAgICAgICBlbGVtID0gX3JlZltfaV07XG5cdFx0ICAgICAgICBpZiAoY21wKGVsZW0sIGxvcykgPCAwKSB7XG5cdFx0ICAgICAgICAgIGluc29ydChyZXN1bHQsIGVsZW0sIDAsIG51bGwsIGNtcCk7XG5cdFx0ICAgICAgICAgIHJlc3VsdC5wb3AoKTtcblx0XHQgICAgICAgICAgbG9zID0gcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXTtcblx0XHQgICAgICAgIH1cblx0XHQgICAgICB9XG5cdFx0ICAgICAgcmV0dXJuIHJlc3VsdDtcblx0XHQgICAgfVxuXHRcdCAgICBoZWFwaWZ5KGFycmF5LCBjbXApO1xuXHRcdCAgICBfcmVzdWx0cyA9IFtdO1xuXHRcdCAgICBmb3IgKF9qID0gMCwgX3JlZjEgPSBtaW4obiwgYXJyYXkubGVuZ3RoKTsgMCA8PSBfcmVmMSA/IF9qIDwgX3JlZjEgOiBfaiA+IF9yZWYxOyAwIDw9IF9yZWYxID8gKytfaiA6IC0tX2opIHtcblx0XHQgICAgICBfcmVzdWx0cy5wdXNoKGhlYXBwb3AoYXJyYXksIGNtcCkpO1xuXHRcdCAgICB9XG5cdFx0ICAgIHJldHVybiBfcmVzdWx0cztcblx0XHQgIH07XG5cblx0XHQgIF9zaWZ0ZG93biA9IGZ1bmN0aW9uKGFycmF5LCBzdGFydHBvcywgcG9zLCBjbXApIHtcblx0XHQgICAgdmFyIG5ld2l0ZW0sIHBhcmVudCwgcGFyZW50cG9zO1xuXHRcdCAgICBpZiAoY21wID09IG51bGwpIHtcblx0XHQgICAgICBjbXAgPSBkZWZhdWx0Q21wO1xuXHRcdCAgICB9XG5cdFx0ICAgIG5ld2l0ZW0gPSBhcnJheVtwb3NdO1xuXHRcdCAgICB3aGlsZSAocG9zID4gc3RhcnRwb3MpIHtcblx0XHQgICAgICBwYXJlbnRwb3MgPSAocG9zIC0gMSkgPj4gMTtcblx0XHQgICAgICBwYXJlbnQgPSBhcnJheVtwYXJlbnRwb3NdO1xuXHRcdCAgICAgIGlmIChjbXAobmV3aXRlbSwgcGFyZW50KSA8IDApIHtcblx0XHQgICAgICAgIGFycmF5W3Bvc10gPSBwYXJlbnQ7XG5cdFx0ICAgICAgICBwb3MgPSBwYXJlbnRwb3M7XG5cdFx0ICAgICAgICBjb250aW51ZTtcblx0XHQgICAgICB9XG5cdFx0ICAgICAgYnJlYWs7XG5cdFx0ICAgIH1cblx0XHQgICAgcmV0dXJuIGFycmF5W3Bvc10gPSBuZXdpdGVtO1xuXHRcdCAgfTtcblxuXHRcdCAgX3NpZnR1cCA9IGZ1bmN0aW9uKGFycmF5LCBwb3MsIGNtcCkge1xuXHRcdCAgICB2YXIgY2hpbGRwb3MsIGVuZHBvcywgbmV3aXRlbSwgcmlnaHRwb3MsIHN0YXJ0cG9zO1xuXHRcdCAgICBpZiAoY21wID09IG51bGwpIHtcblx0XHQgICAgICBjbXAgPSBkZWZhdWx0Q21wO1xuXHRcdCAgICB9XG5cdFx0ICAgIGVuZHBvcyA9IGFycmF5Lmxlbmd0aDtcblx0XHQgICAgc3RhcnRwb3MgPSBwb3M7XG5cdFx0ICAgIG5ld2l0ZW0gPSBhcnJheVtwb3NdO1xuXHRcdCAgICBjaGlsZHBvcyA9IDIgKiBwb3MgKyAxO1xuXHRcdCAgICB3aGlsZSAoY2hpbGRwb3MgPCBlbmRwb3MpIHtcblx0XHQgICAgICByaWdodHBvcyA9IGNoaWxkcG9zICsgMTtcblx0XHQgICAgICBpZiAocmlnaHRwb3MgPCBlbmRwb3MgJiYgIShjbXAoYXJyYXlbY2hpbGRwb3NdLCBhcnJheVtyaWdodHBvc10pIDwgMCkpIHtcblx0XHQgICAgICAgIGNoaWxkcG9zID0gcmlnaHRwb3M7XG5cdFx0ICAgICAgfVxuXHRcdCAgICAgIGFycmF5W3Bvc10gPSBhcnJheVtjaGlsZHBvc107XG5cdFx0ICAgICAgcG9zID0gY2hpbGRwb3M7XG5cdFx0ICAgICAgY2hpbGRwb3MgPSAyICogcG9zICsgMTtcblx0XHQgICAgfVxuXHRcdCAgICBhcnJheVtwb3NdID0gbmV3aXRlbTtcblx0XHQgICAgcmV0dXJuIF9zaWZ0ZG93bihhcnJheSwgc3RhcnRwb3MsIHBvcywgY21wKTtcblx0XHQgIH07XG5cblx0XHQgIEhlYXAgPSAoZnVuY3Rpb24oKSB7XG5cdFx0ICAgIEhlYXAucHVzaCA9IGhlYXBwdXNoO1xuXG5cdFx0ICAgIEhlYXAucG9wID0gaGVhcHBvcDtcblxuXHRcdCAgICBIZWFwLnJlcGxhY2UgPSBoZWFwcmVwbGFjZTtcblxuXHRcdCAgICBIZWFwLnB1c2hwb3AgPSBoZWFwcHVzaHBvcDtcblxuXHRcdCAgICBIZWFwLmhlYXBpZnkgPSBoZWFwaWZ5O1xuXG5cdFx0ICAgIEhlYXAudXBkYXRlSXRlbSA9IHVwZGF0ZUl0ZW07XG5cblx0XHQgICAgSGVhcC5ubGFyZ2VzdCA9IG5sYXJnZXN0O1xuXG5cdFx0ICAgIEhlYXAubnNtYWxsZXN0ID0gbnNtYWxsZXN0O1xuXG5cdFx0ICAgIGZ1bmN0aW9uIEhlYXAoY21wKSB7XG5cdFx0ICAgICAgdGhpcy5jbXAgPSBjbXAgIT0gbnVsbCA/IGNtcCA6IGRlZmF1bHRDbXA7XG5cdFx0ICAgICAgdGhpcy5ub2RlcyA9IFtdO1xuXHRcdCAgICB9XG5cblx0XHQgICAgSGVhcC5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uKHgpIHtcblx0XHQgICAgICByZXR1cm4gaGVhcHB1c2godGhpcy5ub2RlcywgeCwgdGhpcy5jbXApO1xuXHRcdCAgICB9O1xuXG5cdFx0ICAgIEhlYXAucHJvdG90eXBlLnBvcCA9IGZ1bmN0aW9uKCkge1xuXHRcdCAgICAgIHJldHVybiBoZWFwcG9wKHRoaXMubm9kZXMsIHRoaXMuY21wKTtcblx0XHQgICAgfTtcblxuXHRcdCAgICBIZWFwLnByb3RvdHlwZS5wZWVrID0gZnVuY3Rpb24oKSB7XG5cdFx0ICAgICAgcmV0dXJuIHRoaXMubm9kZXNbMF07XG5cdFx0ICAgIH07XG5cblx0XHQgICAgSGVhcC5wcm90b3R5cGUuY29udGFpbnMgPSBmdW5jdGlvbih4KSB7XG5cdFx0ICAgICAgcmV0dXJuIHRoaXMubm9kZXMuaW5kZXhPZih4KSAhPT0gLTE7XG5cdFx0ICAgIH07XG5cblx0XHQgICAgSGVhcC5wcm90b3R5cGUucmVwbGFjZSA9IGZ1bmN0aW9uKHgpIHtcblx0XHQgICAgICByZXR1cm4gaGVhcHJlcGxhY2UodGhpcy5ub2RlcywgeCwgdGhpcy5jbXApO1xuXHRcdCAgICB9O1xuXG5cdFx0ICAgIEhlYXAucHJvdG90eXBlLnB1c2hwb3AgPSBmdW5jdGlvbih4KSB7XG5cdFx0ICAgICAgcmV0dXJuIGhlYXBwdXNocG9wKHRoaXMubm9kZXMsIHgsIHRoaXMuY21wKTtcblx0XHQgICAgfTtcblxuXHRcdCAgICBIZWFwLnByb3RvdHlwZS5oZWFwaWZ5ID0gZnVuY3Rpb24oKSB7XG5cdFx0ICAgICAgcmV0dXJuIGhlYXBpZnkodGhpcy5ub2RlcywgdGhpcy5jbXApO1xuXHRcdCAgICB9O1xuXG5cdFx0ICAgIEhlYXAucHJvdG90eXBlLnVwZGF0ZUl0ZW0gPSBmdW5jdGlvbih4KSB7XG5cdFx0ICAgICAgcmV0dXJuIHVwZGF0ZUl0ZW0odGhpcy5ub2RlcywgeCwgdGhpcy5jbXApO1xuXHRcdCAgICB9O1xuXG5cdFx0ICAgIEhlYXAucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24oKSB7XG5cdFx0ICAgICAgcmV0dXJuIHRoaXMubm9kZXMgPSBbXTtcblx0XHQgICAgfTtcblxuXHRcdCAgICBIZWFwLnByb3RvdHlwZS5lbXB0eSA9IGZ1bmN0aW9uKCkge1xuXHRcdCAgICAgIHJldHVybiB0aGlzLm5vZGVzLmxlbmd0aCA9PT0gMDtcblx0XHQgICAgfTtcblxuXHRcdCAgICBIZWFwLnByb3RvdHlwZS5zaXplID0gZnVuY3Rpb24oKSB7XG5cdFx0ICAgICAgcmV0dXJuIHRoaXMubm9kZXMubGVuZ3RoO1xuXHRcdCAgICB9O1xuXG5cdFx0ICAgIEhlYXAucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24oKSB7XG5cdFx0ICAgICAgdmFyIGhlYXA7XG5cdFx0ICAgICAgaGVhcCA9IG5ldyBIZWFwKCk7XG5cdFx0ICAgICAgaGVhcC5ub2RlcyA9IHRoaXMubm9kZXMuc2xpY2UoMCk7XG5cdFx0ICAgICAgcmV0dXJuIGhlYXA7XG5cdFx0ICAgIH07XG5cblx0XHQgICAgSGVhcC5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uKCkge1xuXHRcdCAgICAgIHJldHVybiB0aGlzLm5vZGVzLnNsaWNlKDApO1xuXHRcdCAgICB9O1xuXG5cdFx0ICAgIEhlYXAucHJvdG90eXBlLmluc2VydCA9IEhlYXAucHJvdG90eXBlLnB1c2g7XG5cblx0XHQgICAgSGVhcC5wcm90b3R5cGUudG9wID0gSGVhcC5wcm90b3R5cGUucGVlaztcblxuXHRcdCAgICBIZWFwLnByb3RvdHlwZS5mcm9udCA9IEhlYXAucHJvdG90eXBlLnBlZWs7XG5cblx0XHQgICAgSGVhcC5wcm90b3R5cGUuaGFzID0gSGVhcC5wcm90b3R5cGUuY29udGFpbnM7XG5cblx0XHQgICAgSGVhcC5wcm90b3R5cGUuY29weSA9IEhlYXAucHJvdG90eXBlLmNsb25lO1xuXG5cdFx0ICAgIHJldHVybiBIZWFwO1xuXG5cdFx0ICB9KSgpO1xuXG5cdFx0ICAoZnVuY3Rpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRcdCAgICB7XG5cdFx0ICAgICAgcmV0dXJuIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRcdCAgICB9XG5cdFx0ICB9KSh0aGlzLCBmdW5jdGlvbigpIHtcblx0XHQgICAgcmV0dXJuIEhlYXA7XG5cdFx0ICB9KTtcblxuXHRcdH0pLmNhbGwoaGVhcCQxKTsgXG5cdH0gKGhlYXAkMikpO1xuXHRyZXR1cm4gaGVhcCQyLmV4cG9ydHM7XG59XG5cbnZhciBoZWFwO1xudmFyIGhhc1JlcXVpcmVkSGVhcDtcblxuZnVuY3Rpb24gcmVxdWlyZUhlYXAgKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRIZWFwKSByZXR1cm4gaGVhcDtcblx0aGFzUmVxdWlyZWRIZWFwID0gMTtcblx0aGVhcCA9IHJlcXVpcmVIZWFwJDEoKTtcblx0cmV0dXJuIGhlYXA7XG59XG5cbnZhciBoZWFwRXhwb3J0cyA9IHJlcXVpcmVIZWFwKCk7XG52YXIgSGVhcCA9IC8qQF9fUFVSRV9fKi9nZXREZWZhdWx0RXhwb3J0RnJvbUNqcyhoZWFwRXhwb3J0cyk7XG5cbnZhciBkaWprc3RyYURlZmF1bHRzID0gZGVmYXVsdHMkZyh7XG4gIHJvb3Q6IG51bGwsXG4gIHdlaWdodDogZnVuY3Rpb24gd2VpZ2h0KGVkZ2UpIHtcbiAgICByZXR1cm4gMTtcbiAgfSxcbiAgZGlyZWN0ZWQ6IGZhbHNlXG59KTtcbnZhciBlbGVzZm4kdSA9IHtcbiAgZGlqa3N0cmE6IGZ1bmN0aW9uIGRpamtzdHJhKG9wdGlvbnMpIHtcbiAgICBpZiAoIXBsYWluT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgIG9wdGlvbnMgPSB7XG4gICAgICAgIHJvb3Q6IGFyZ3NbMF0sXG4gICAgICAgIHdlaWdodDogYXJnc1sxXSxcbiAgICAgICAgZGlyZWN0ZWQ6IGFyZ3NbMl1cbiAgICAgIH07XG4gICAgfVxuICAgIHZhciBfZGlqa3N0cmFEZWZhdWx0cyA9IGRpamtzdHJhRGVmYXVsdHMob3B0aW9ucyksXG4gICAgICByb290ID0gX2RpamtzdHJhRGVmYXVsdHMucm9vdCxcbiAgICAgIHdlaWdodCA9IF9kaWprc3RyYURlZmF1bHRzLndlaWdodCxcbiAgICAgIGRpcmVjdGVkID0gX2RpamtzdHJhRGVmYXVsdHMuZGlyZWN0ZWQ7XG4gICAgdmFyIGVsZXMgPSB0aGlzO1xuICAgIHZhciB3ZWlnaHRGbiA9IHdlaWdodDtcbiAgICB2YXIgc291cmNlID0gc3RyaW5nKHJvb3QpID8gdGhpcy5maWx0ZXIocm9vdClbMF0gOiByb290WzBdO1xuICAgIHZhciBkaXN0ID0ge307XG4gICAgdmFyIHByZXYgPSB7fTtcbiAgICB2YXIga25vd25EaXN0ID0ge307XG4gICAgdmFyIF90aGlzJGJ5R3JvdXAgPSB0aGlzLmJ5R3JvdXAoKSxcbiAgICAgIG5vZGVzID0gX3RoaXMkYnlHcm91cC5ub2RlcyxcbiAgICAgIGVkZ2VzID0gX3RoaXMkYnlHcm91cC5lZGdlcztcbiAgICBlZGdlcy51bm1lcmdlQnkoZnVuY3Rpb24gKGVsZSkge1xuICAgICAgcmV0dXJuIGVsZS5pc0xvb3AoKTtcbiAgICB9KTtcbiAgICB2YXIgZ2V0RGlzdCA9IGZ1bmN0aW9uIGdldERpc3Qobm9kZSkge1xuICAgICAgcmV0dXJuIGRpc3Rbbm9kZS5pZCgpXTtcbiAgICB9O1xuICAgIHZhciBzZXREaXN0ID0gZnVuY3Rpb24gc2V0RGlzdChub2RlLCBkKSB7XG4gICAgICBkaXN0W25vZGUuaWQoKV0gPSBkO1xuICAgICAgUS51cGRhdGVJdGVtKG5vZGUpO1xuICAgIH07XG4gICAgdmFyIFEgPSBuZXcgSGVhcChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGdldERpc3QoYSkgLSBnZXREaXN0KGIpO1xuICAgIH0pO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBub2RlID0gbm9kZXNbaV07XG4gICAgICBkaXN0W25vZGUuaWQoKV0gPSBub2RlLnNhbWUoc291cmNlKSA/IDAgOiBJbmZpbml0eTtcbiAgICAgIFEucHVzaChub2RlKTtcbiAgICB9XG4gICAgdmFyIGRpc3RCZXR3ZWVuID0gZnVuY3Rpb24gZGlzdEJldHdlZW4odSwgdikge1xuICAgICAgdmFyIHV2cyA9IChkaXJlY3RlZCA/IHUuZWRnZXNUbyh2KSA6IHUuZWRnZXNXaXRoKHYpKS5pbnRlcnNlY3QoZWRnZXMpO1xuICAgICAgdmFyIHNtYWxsZXN0RGlzdGFuY2UgPSBJbmZpbml0eTtcbiAgICAgIHZhciBzbWFsbGVzdEVkZ2U7XG4gICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgdXZzLmxlbmd0aDsgX2krKykge1xuICAgICAgICB2YXIgZWRnZSA9IHV2c1tfaV07XG4gICAgICAgIHZhciBfd2VpZ2h0ID0gd2VpZ2h0Rm4oZWRnZSk7XG4gICAgICAgIGlmIChfd2VpZ2h0IDwgc21hbGxlc3REaXN0YW5jZSB8fCAhc21hbGxlc3RFZGdlKSB7XG4gICAgICAgICAgc21hbGxlc3REaXN0YW5jZSA9IF93ZWlnaHQ7XG4gICAgICAgICAgc21hbGxlc3RFZGdlID0gZWRnZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZWRnZTogc21hbGxlc3RFZGdlLFxuICAgICAgICBkaXN0OiBzbWFsbGVzdERpc3RhbmNlXG4gICAgICB9O1xuICAgIH07XG4gICAgd2hpbGUgKFEuc2l6ZSgpID4gMCkge1xuICAgICAgdmFyIHUgPSBRLnBvcCgpO1xuICAgICAgdmFyIHNtYWxsZXRzRGlzdCA9IGdldERpc3QodSk7XG4gICAgICB2YXIgdWlkID0gdS5pZCgpO1xuICAgICAga25vd25EaXN0W3VpZF0gPSBzbWFsbGV0c0Rpc3Q7XG4gICAgICBpZiAoc21hbGxldHNEaXN0ID09PSBJbmZpbml0eSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBuZWlnaGJvcnMgPSB1Lm5laWdoYm9yaG9vZCgpLmludGVyc2VjdChub2Rlcyk7XG4gICAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBuZWlnaGJvcnMubGVuZ3RoOyBfaTIrKykge1xuICAgICAgICB2YXIgdiA9IG5laWdoYm9yc1tfaTJdO1xuICAgICAgICB2YXIgdmlkID0gdi5pZCgpO1xuICAgICAgICB2YXIgdkRpc3QgPSBkaXN0QmV0d2Vlbih1LCB2KTtcbiAgICAgICAgdmFyIGFsdCA9IHNtYWxsZXRzRGlzdCArIHZEaXN0LmRpc3Q7XG4gICAgICAgIGlmIChhbHQgPCBnZXREaXN0KHYpKSB7XG4gICAgICAgICAgc2V0RGlzdCh2LCBhbHQpO1xuICAgICAgICAgIHByZXZbdmlkXSA9IHtcbiAgICAgICAgICAgIG5vZGU6IHUsXG4gICAgICAgICAgICBlZGdlOiB2RGlzdC5lZGdlXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBmb3JcbiAgICB9IC8vIHdoaWxlXG5cbiAgICByZXR1cm4ge1xuICAgICAgZGlzdGFuY2VUbzogZnVuY3Rpb24gZGlzdGFuY2VUbyhub2RlKSB7XG4gICAgICAgIHZhciB0YXJnZXQgPSBzdHJpbmcobm9kZSkgPyBub2Rlcy5maWx0ZXIobm9kZSlbMF0gOiBub2RlWzBdO1xuICAgICAgICByZXR1cm4ga25vd25EaXN0W3RhcmdldC5pZCgpXTtcbiAgICAgIH0sXG4gICAgICBwYXRoVG86IGZ1bmN0aW9uIHBhdGhUbyhub2RlKSB7XG4gICAgICAgIHZhciB0YXJnZXQgPSBzdHJpbmcobm9kZSkgPyBub2Rlcy5maWx0ZXIobm9kZSlbMF0gOiBub2RlWzBdO1xuICAgICAgICB2YXIgUyA9IFtdO1xuICAgICAgICB2YXIgdSA9IHRhcmdldDtcbiAgICAgICAgdmFyIHVpZCA9IHUuaWQoKTtcbiAgICAgICAgaWYgKHRhcmdldC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgUy51bnNoaWZ0KHRhcmdldCk7XG4gICAgICAgICAgd2hpbGUgKHByZXZbdWlkXSkge1xuICAgICAgICAgICAgdmFyIHAgPSBwcmV2W3VpZF07XG4gICAgICAgICAgICBTLnVuc2hpZnQocC5lZGdlKTtcbiAgICAgICAgICAgIFMudW5zaGlmdChwLm5vZGUpO1xuICAgICAgICAgICAgdSA9IHAubm9kZTtcbiAgICAgICAgICAgIHVpZCA9IHUuaWQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVsZXMuc3Bhd24oUyk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufTtcblxudmFyIGVsZXNmbiR0ID0ge1xuICAvLyBrcnVza2FsJ3MgYWxnb3JpdGhtIChmaW5kcyBtaW4gc3Bhbm5pbmcgdHJlZSwgYXNzdW1pbmcgdW5kaXJlY3RlZCBncmFwaClcbiAgLy8gaW1wbGVtZW50ZWQgZnJvbSBwc2V1ZG9jb2RlIGZyb20gd2lraXBlZGlhXG4gIGtydXNrYWw6IGZ1bmN0aW9uIGtydXNrYWwod2VpZ2h0Rm4pIHtcbiAgICB3ZWlnaHRGbiA9IHdlaWdodEZuIHx8IGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9O1xuICAgIHZhciBfdGhpcyRieUdyb3VwID0gdGhpcy5ieUdyb3VwKCksXG4gICAgICBub2RlcyA9IF90aGlzJGJ5R3JvdXAubm9kZXMsXG4gICAgICBlZGdlcyA9IF90aGlzJGJ5R3JvdXAuZWRnZXM7XG4gICAgdmFyIG51bU5vZGVzID0gbm9kZXMubGVuZ3RoO1xuICAgIHZhciBmb3Jlc3QgPSBuZXcgQXJyYXkobnVtTm9kZXMpO1xuICAgIHZhciBBID0gbm9kZXM7IC8vIGFzc3VtZXMgYnlHcm91cCgpIGNyZWF0ZXMgbmV3IGNvbGxlY3Rpb25zIHRoYXQgY2FuIGJlIHNhZmVseSBtdXRhdGVkXG5cbiAgICB2YXIgZmluZFNldEluZGV4ID0gZnVuY3Rpb24gZmluZFNldEluZGV4KGVsZSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmb3Jlc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVsZXMgPSBmb3Jlc3RbaV07XG4gICAgICAgIGlmIChlbGVzLmhhcyhlbGUpKSB7XG4gICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gc3RhcnQgd2l0aCBvbmUgZm9yZXN0IHBlciBub2RlXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1Ob2RlczsgaSsrKSB7XG4gICAgICBmb3Jlc3RbaV0gPSB0aGlzLnNwYXduKG5vZGVzW2ldKTtcbiAgICB9XG4gICAgdmFyIFMgPSBlZGdlcy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gd2VpZ2h0Rm4oYSkgLSB3ZWlnaHRGbihiKTtcbiAgICB9KTtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgUy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBlZGdlID0gU1tfaV07XG4gICAgICB2YXIgdSA9IGVkZ2Uuc291cmNlKClbMF07XG4gICAgICB2YXIgdiA9IGVkZ2UudGFyZ2V0KClbMF07XG4gICAgICB2YXIgc2V0VUluZGV4ID0gZmluZFNldEluZGV4KHUpO1xuICAgICAgdmFyIHNldFZJbmRleCA9IGZpbmRTZXRJbmRleCh2KTtcbiAgICAgIHZhciBzZXRVID0gZm9yZXN0W3NldFVJbmRleF07XG4gICAgICB2YXIgc2V0ViA9IGZvcmVzdFtzZXRWSW5kZXhdO1xuICAgICAgaWYgKHNldFVJbmRleCAhPT0gc2V0VkluZGV4KSB7XG4gICAgICAgIEEubWVyZ2UoZWRnZSk7XG5cbiAgICAgICAgLy8gY29tYmluZSBmb3Jlc3RzIGZvciB1IGFuZCB2XG4gICAgICAgIHNldFUubWVyZ2Uoc2V0Vik7XG4gICAgICAgIGZvcmVzdC5zcGxpY2Uoc2V0VkluZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIEE7XG4gIH1cbn07XG5cbnZhciBhU3RhckRlZmF1bHRzID0gZGVmYXVsdHMkZyh7XG4gIHJvb3Q6IG51bGwsXG4gIGdvYWw6IG51bGwsXG4gIHdlaWdodDogZnVuY3Rpb24gd2VpZ2h0KGVkZ2UpIHtcbiAgICByZXR1cm4gMTtcbiAgfSxcbiAgaGV1cmlzdGljOiBmdW5jdGlvbiBoZXVyaXN0aWMoZWRnZSkge1xuICAgIHJldHVybiAwO1xuICB9LFxuICBkaXJlY3RlZDogZmFsc2Vcbn0pO1xudmFyIGVsZXNmbiRzID0ge1xuICAvLyBJbXBsZW1lbnRlZCBmcm9tIHBzZXVkb2NvZGUgZnJvbSB3aWtpcGVkaWFcbiAgYVN0YXI6IGZ1bmN0aW9uIGFTdGFyKG9wdGlvbnMpIHtcbiAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gICAgdmFyIF9hU3RhckRlZmF1bHRzID0gYVN0YXJEZWZhdWx0cyhvcHRpb25zKSxcbiAgICAgIHJvb3QgPSBfYVN0YXJEZWZhdWx0cy5yb290LFxuICAgICAgZ29hbCA9IF9hU3RhckRlZmF1bHRzLmdvYWwsXG4gICAgICBoZXVyaXN0aWMgPSBfYVN0YXJEZWZhdWx0cy5oZXVyaXN0aWMsXG4gICAgICBkaXJlY3RlZCA9IF9hU3RhckRlZmF1bHRzLmRpcmVjdGVkLFxuICAgICAgd2VpZ2h0ID0gX2FTdGFyRGVmYXVsdHMud2VpZ2h0O1xuICAgIHJvb3QgPSBjeS5jb2xsZWN0aW9uKHJvb3QpWzBdO1xuICAgIGdvYWwgPSBjeS5jb2xsZWN0aW9uKGdvYWwpWzBdO1xuICAgIHZhciBzaWQgPSByb290LmlkKCk7XG4gICAgdmFyIHRpZCA9IGdvYWwuaWQoKTtcbiAgICB2YXIgZ1Njb3JlID0ge307XG4gICAgdmFyIGZTY29yZSA9IHt9O1xuICAgIHZhciBjbG9zZWRTZXRJZHMgPSB7fTtcbiAgICB2YXIgb3BlblNldCA9IG5ldyBIZWFwKGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gZlNjb3JlW2EuaWQoKV0gLSBmU2NvcmVbYi5pZCgpXTtcbiAgICB9KTtcbiAgICB2YXIgb3BlblNldElkcyA9IG5ldyBTZXQkMSgpO1xuICAgIHZhciBjYW1lRnJvbSA9IHt9O1xuICAgIHZhciBjYW1lRnJvbUVkZ2UgPSB7fTtcbiAgICB2YXIgYWRkVG9PcGVuU2V0ID0gZnVuY3Rpb24gYWRkVG9PcGVuU2V0KGVsZSwgaWQpIHtcbiAgICAgIG9wZW5TZXQucHVzaChlbGUpO1xuICAgICAgb3BlblNldElkcy5hZGQoaWQpO1xuICAgIH07XG4gICAgdmFyIGNNaW4sIGNNaW5JZDtcbiAgICB2YXIgcG9wRnJvbU9wZW5TZXQgPSBmdW5jdGlvbiBwb3BGcm9tT3BlblNldCgpIHtcbiAgICAgIGNNaW4gPSBvcGVuU2V0LnBvcCgpO1xuICAgICAgY01pbklkID0gY01pbi5pZCgpO1xuICAgICAgb3BlblNldElkc1tcImRlbGV0ZVwiXShjTWluSWQpO1xuICAgIH07XG4gICAgdmFyIGlzSW5PcGVuU2V0ID0gZnVuY3Rpb24gaXNJbk9wZW5TZXQoaWQpIHtcbiAgICAgIHJldHVybiBvcGVuU2V0SWRzLmhhcyhpZCk7XG4gICAgfTtcbiAgICBhZGRUb09wZW5TZXQocm9vdCwgc2lkKTtcbiAgICBnU2NvcmVbc2lkXSA9IDA7XG4gICAgZlNjb3JlW3NpZF0gPSBoZXVyaXN0aWMocm9vdCk7XG5cbiAgICAvLyBDb3VudGVyXG4gICAgdmFyIHN0ZXBzID0gMDtcblxuICAgIC8vIE1haW4gbG9vcFxuICAgIHdoaWxlIChvcGVuU2V0LnNpemUoKSA+IDApIHtcbiAgICAgIHBvcEZyb21PcGVuU2V0KCk7XG4gICAgICBzdGVwcysrO1xuXG4gICAgICAvLyBJZiB3ZSd2ZSBmb3VuZCBvdXIgZ29hbCwgdGhlbiB3ZSBhcmUgZG9uZVxuICAgICAgaWYgKGNNaW5JZCA9PT0gdGlkKSB7XG4gICAgICAgIHZhciBwYXRoID0gW107XG4gICAgICAgIHZhciBwYXRoTm9kZSA9IGdvYWw7XG4gICAgICAgIHZhciBwYXRoTm9kZUlkID0gdGlkO1xuICAgICAgICB2YXIgcGF0aEVkZ2UgPSBjYW1lRnJvbUVkZ2VbcGF0aE5vZGVJZF07XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICBwYXRoLnVuc2hpZnQocGF0aE5vZGUpO1xuICAgICAgICAgIGlmIChwYXRoRWRnZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBwYXRoLnVuc2hpZnQocGF0aEVkZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwYXRoTm9kZSA9IGNhbWVGcm9tW3BhdGhOb2RlSWRdO1xuICAgICAgICAgIGlmIChwYXRoTm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgcGF0aE5vZGVJZCA9IHBhdGhOb2RlLmlkKCk7XG4gICAgICAgICAgcGF0aEVkZ2UgPSBjYW1lRnJvbUVkZ2VbcGF0aE5vZGVJZF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBmb3VuZDogdHJ1ZSxcbiAgICAgICAgICBkaXN0YW5jZTogZ1Njb3JlW2NNaW5JZF0sXG4gICAgICAgICAgcGF0aDogdGhpcy5zcGF3bihwYXRoKSxcbiAgICAgICAgICBzdGVwczogc3RlcHNcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIGNNaW4gdG8gcHJvY2Vzc2VkIG5vZGVzXG4gICAgICBjbG9zZWRTZXRJZHNbY01pbklkXSA9IHRydWU7XG5cbiAgICAgIC8vIFVwZGF0ZSBzY29yZXMgZm9yIG5laWdoYm9ycyBvZiBjTWluXG4gICAgICAvLyBUYWtlIGludG8gYWNjb3VudCBpZiBncmFwaCBpcyBkaXJlY3RlZCBvciBub3RcbiAgICAgIHZhciB2d0VkZ2VzID0gY01pbi5fcHJpdmF0ZS5lZGdlcztcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdndFZGdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZSA9IHZ3RWRnZXNbaV07XG5cbiAgICAgICAgLy8gZWRnZSBtdXN0IGJlIGluIHNldCBvZiBjYWxsaW5nIGVsZXNcbiAgICAgICAgaWYgKCF0aGlzLmhhc0VsZW1lbnRXaXRoSWQoZS5pZCgpKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY01pbiBtdXN0IGJlIHRoZSBzb3VyY2Ugb2YgZWRnZSBpZiBkaXJlY3RlZFxuICAgICAgICBpZiAoZGlyZWN0ZWQgJiYgZS5kYXRhKCdzb3VyY2UnKSAhPT0gY01pbklkKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHdTcmMgPSBlLnNvdXJjZSgpO1xuICAgICAgICB2YXIgd1RndCA9IGUudGFyZ2V0KCk7XG4gICAgICAgIHZhciB3ID0gd1NyYy5pZCgpICE9PSBjTWluSWQgPyB3U3JjIDogd1RndDtcbiAgICAgICAgdmFyIHdpZCA9IHcuaWQoKTtcblxuICAgICAgICAvLyBub2RlIG11c3QgYmUgaW4gc2V0IG9mIGNhbGxpbmcgZWxlc1xuICAgICAgICBpZiAoIXRoaXMuaGFzRWxlbWVudFdpdGhJZCh3aWQpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiBub2RlIGlzIGluIGNsb3NlZFNldCwgaWdub3JlIGl0XG4gICAgICAgIGlmIChjbG9zZWRTZXRJZHNbd2lkXSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTmV3IHRlbnRhdGl2ZSBzY29yZSBmb3Igbm9kZSB3XG4gICAgICAgIHZhciB0ZW1wU2NvcmUgPSBnU2NvcmVbY01pbklkXSArIHdlaWdodChlKTtcblxuICAgICAgICAvLyBVcGRhdGUgZ1Njb3JlIGZvciBub2RlIHcgaWY6XG4gICAgICAgIC8vICAgdyBub3QgcHJlc2VudCBpbiBvcGVuU2V0XG4gICAgICAgIC8vIE9SXG4gICAgICAgIC8vICAgdGVudGF0aXZlIGdTY29yZSBpcyBsZXNzIHRoYW4gcHJldmlvdXMgdmFsdWVcblxuICAgICAgICAvLyB3IG5vdCBpbiBvcGVuU2V0XG4gICAgICAgIGlmICghaXNJbk9wZW5TZXQod2lkKSkge1xuICAgICAgICAgIGdTY29yZVt3aWRdID0gdGVtcFNjb3JlO1xuICAgICAgICAgIGZTY29yZVt3aWRdID0gdGVtcFNjb3JlICsgaGV1cmlzdGljKHcpO1xuICAgICAgICAgIGFkZFRvT3BlblNldCh3LCB3aWQpO1xuICAgICAgICAgIGNhbWVGcm9tW3dpZF0gPSBjTWluO1xuICAgICAgICAgIGNhbWVGcm9tRWRnZVt3aWRdID0gZTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHcgYWxyZWFkeSBpbiBvcGVuU2V0LCBidXQgd2l0aCBncmVhdGVyIGdTY29yZVxuICAgICAgICBpZiAodGVtcFNjb3JlIDwgZ1Njb3JlW3dpZF0pIHtcbiAgICAgICAgICBnU2NvcmVbd2lkXSA9IHRlbXBTY29yZTtcbiAgICAgICAgICBmU2NvcmVbd2lkXSA9IHRlbXBTY29yZSArIGhldXJpc3RpYyh3KTtcblxuICAgICAgICAgIC8vIHRoZSBoZWFwIGlzIG9yZGVyZWQgYnkgZlNjb3JlLCBzbyBpdCBtdXN0IGJlIHJlc29ydGVkIGZvciB0aGUgbmV3IHZhbHVlXG4gICAgICAgICAgb3BlblNldC51cGRhdGVJdGVtKHcpO1xuICAgICAgICAgIGNhbWVGcm9tW3dpZF0gPSBjTWluO1xuICAgICAgICAgIGNhbWVGcm9tRWRnZVt3aWRdID0gZTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBFbmQgb2YgbmVpZ2hib3JzIHVwZGF0ZVxuICAgIH0gLy8gRW5kIG9mIG1haW4gbG9vcFxuXG4gICAgLy8gSWYgd2UndmUgcmVhY2hlZCBoZXJlLCB0aGVuIHdlJ3ZlIG5vdCByZWFjaGVkIG91ciBnb2FsXG4gICAgcmV0dXJuIHtcbiAgICAgIGZvdW5kOiBmYWxzZSxcbiAgICAgIGRpc3RhbmNlOiB1bmRlZmluZWQsXG4gICAgICBwYXRoOiB1bmRlZmluZWQsXG4gICAgICBzdGVwczogc3RlcHNcbiAgICB9O1xuICB9XG59OyAvLyBlbGVzZm5cblxudmFyIGZsb3lkV2Fyc2hhbGxEZWZhdWx0cyA9IGRlZmF1bHRzJGcoe1xuICB3ZWlnaHQ6IGZ1bmN0aW9uIHdlaWdodChlZGdlKSB7XG4gICAgcmV0dXJuIDE7XG4gIH0sXG4gIGRpcmVjdGVkOiBmYWxzZVxufSk7XG52YXIgZWxlc2ZuJHIgPSB7XG4gIC8vIEltcGxlbWVudGVkIGZyb20gcHNldWRvY29kZSBmcm9tIHdpa2lwZWRpYVxuICBmbG95ZFdhcnNoYWxsOiBmdW5jdGlvbiBmbG95ZFdhcnNoYWxsKG9wdGlvbnMpIHtcbiAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gICAgdmFyIF9mbG95ZFdhcnNoYWxsRGVmYXVsdCA9IGZsb3lkV2Fyc2hhbGxEZWZhdWx0cyhvcHRpb25zKSxcbiAgICAgIHdlaWdodCA9IF9mbG95ZFdhcnNoYWxsRGVmYXVsdC53ZWlnaHQsXG4gICAgICBkaXJlY3RlZCA9IF9mbG95ZFdhcnNoYWxsRGVmYXVsdC5kaXJlY3RlZDtcbiAgICB2YXIgd2VpZ2h0Rm4gPSB3ZWlnaHQ7XG4gICAgdmFyIF90aGlzJGJ5R3JvdXAgPSB0aGlzLmJ5R3JvdXAoKSxcbiAgICAgIG5vZGVzID0gX3RoaXMkYnlHcm91cC5ub2RlcyxcbiAgICAgIGVkZ2VzID0gX3RoaXMkYnlHcm91cC5lZGdlcztcbiAgICB2YXIgTiA9IG5vZGVzLmxlbmd0aDtcbiAgICB2YXIgTnNxID0gTiAqIE47XG4gICAgdmFyIGluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mKG5vZGUpIHtcbiAgICAgIHJldHVybiBub2Rlcy5pbmRleE9mKG5vZGUpO1xuICAgIH07XG4gICAgdmFyIGF0SW5kZXggPSBmdW5jdGlvbiBhdEluZGV4KGkpIHtcbiAgICAgIHJldHVybiBub2Rlc1tpXTtcbiAgICB9O1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBkaXN0YW5jZSBtYXRyaXhcbiAgICB2YXIgZGlzdCA9IG5ldyBBcnJheShOc3EpO1xuICAgIGZvciAodmFyIG4gPSAwOyBuIDwgTnNxOyBuKyspIHtcbiAgICAgIHZhciBqID0gbiAlIE47XG4gICAgICB2YXIgaSA9IChuIC0gaikgLyBOO1xuICAgICAgaWYgKGkgPT09IGopIHtcbiAgICAgICAgZGlzdFtuXSA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkaXN0W25dID0gSW5maW5pdHk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBtYXRyaXggdXNlZCBmb3IgcGF0aCByZWNvbnN0cnVjdGlvblxuICAgIC8vIEluaXRpYWxpemUgZGlzdGFuY2UgbWF0cml4XG4gICAgdmFyIG5leHQgPSBuZXcgQXJyYXkoTnNxKTtcbiAgICB2YXIgZWRnZU5leHQgPSBuZXcgQXJyYXkoTnNxKTtcblxuICAgIC8vIFByb2Nlc3MgZWRnZXNcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgZWRnZXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgZWRnZSA9IGVkZ2VzW19pXTtcbiAgICAgIHZhciBzcmMgPSBlZGdlLnNvdXJjZSgpWzBdO1xuICAgICAgdmFyIHRndCA9IGVkZ2UudGFyZ2V0KClbMF07XG4gICAgICBpZiAoc3JjID09PSB0Z3QpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9IC8vIGV4Y2x1ZGUgbG9vcHNcblxuICAgICAgdmFyIHMgPSBpbmRleE9mKHNyYyk7XG4gICAgICB2YXIgdCA9IGluZGV4T2YodGd0KTtcbiAgICAgIHZhciBzdCA9IHMgKiBOICsgdDsgLy8gc291cmNlIHRvIHRhcmdldCBpbmRleFxuICAgICAgdmFyIF93ZWlnaHQgPSB3ZWlnaHRGbihlZGdlKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgYWxyZWFkeSBwcm9jZXNzIGFub3RoZXIgZWRnZSBiZXR3ZWVuIHNhbWUgMiBub2Rlc1xuICAgICAgaWYgKGRpc3Rbc3RdID4gX3dlaWdodCkge1xuICAgICAgICBkaXN0W3N0XSA9IF93ZWlnaHQ7XG4gICAgICAgIG5leHRbc3RdID0gdDtcbiAgICAgICAgZWRnZU5leHRbc3RdID0gZWRnZTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgdW5kaXJlY3RlZCBncmFwaCwgcHJvY2VzcyAncmV2ZXJzZWQnIGVkZ2VcbiAgICAgIGlmICghZGlyZWN0ZWQpIHtcbiAgICAgICAgdmFyIHRzID0gdCAqIE4gKyBzOyAvLyB0YXJnZXQgdG8gc291cmNlIGluZGV4XG5cbiAgICAgICAgaWYgKCFkaXJlY3RlZCAmJiBkaXN0W3RzXSA+IF93ZWlnaHQpIHtcbiAgICAgICAgICBkaXN0W3RzXSA9IF93ZWlnaHQ7XG4gICAgICAgICAgbmV4dFt0c10gPSBzO1xuICAgICAgICAgIGVkZ2VOZXh0W3RzXSA9IGVkZ2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBNYWluIGxvb3BcbiAgICBmb3IgKHZhciBrID0gMDsgayA8IE47IGsrKykge1xuICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgTjsgX2kyKyspIHtcbiAgICAgICAgdmFyIGlrID0gX2kyICogTiArIGs7XG4gICAgICAgIGZvciAodmFyIF9qID0gMDsgX2ogPCBOOyBfaisrKSB7XG4gICAgICAgICAgdmFyIGlqID0gX2kyICogTiArIF9qO1xuICAgICAgICAgIHZhciBraiA9IGsgKiBOICsgX2o7XG4gICAgICAgICAgaWYgKGRpc3RbaWtdICsgZGlzdFtral0gPCBkaXN0W2lqXSkge1xuICAgICAgICAgICAgZGlzdFtpal0gPSBkaXN0W2lrXSArIGRpc3Rba2pdO1xuICAgICAgICAgICAgbmV4dFtpal0gPSBuZXh0W2lrXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIGdldEFyZ0VsZSA9IGZ1bmN0aW9uIGdldEFyZ0VsZShlbGUpIHtcbiAgICAgIHJldHVybiAoc3RyaW5nKGVsZSkgPyBjeS5maWx0ZXIoZWxlKSA6IGVsZSlbMF07XG4gICAgfTtcbiAgICB2YXIgaW5kZXhPZkFyZ0VsZSA9IGZ1bmN0aW9uIGluZGV4T2ZBcmdFbGUoZWxlKSB7XG4gICAgICByZXR1cm4gaW5kZXhPZihnZXRBcmdFbGUoZWxlKSk7XG4gICAgfTtcbiAgICB2YXIgcmVzID0ge1xuICAgICAgZGlzdGFuY2U6IGZ1bmN0aW9uIGRpc3RhbmNlKGZyb20sIHRvKSB7XG4gICAgICAgIHZhciBpID0gaW5kZXhPZkFyZ0VsZShmcm9tKTtcbiAgICAgICAgdmFyIGogPSBpbmRleE9mQXJnRWxlKHRvKTtcbiAgICAgICAgcmV0dXJuIGRpc3RbaSAqIE4gKyBqXTtcbiAgICAgIH0sXG4gICAgICBwYXRoOiBmdW5jdGlvbiBwYXRoKGZyb20sIHRvKSB7XG4gICAgICAgIHZhciBpID0gaW5kZXhPZkFyZ0VsZShmcm9tKTtcbiAgICAgICAgdmFyIGogPSBpbmRleE9mQXJnRWxlKHRvKTtcbiAgICAgICAgdmFyIGZyb21Ob2RlID0gYXRJbmRleChpKTtcbiAgICAgICAgaWYgKGkgPT09IGopIHtcbiAgICAgICAgICByZXR1cm4gZnJvbU5vZGUuY29sbGVjdGlvbigpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuZXh0W2kgKiBOICsgal0gPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBjeS5jb2xsZWN0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBhdGggPSBjeS5jb2xsZWN0aW9uKCk7XG4gICAgICAgIHZhciBwcmV2ID0gaTtcbiAgICAgICAgdmFyIGVkZ2U7XG4gICAgICAgIHBhdGgubWVyZ2UoZnJvbU5vZGUpO1xuICAgICAgICB3aGlsZSAoaSAhPT0gaikge1xuICAgICAgICAgIHByZXYgPSBpO1xuICAgICAgICAgIGkgPSBuZXh0W2kgKiBOICsgal07XG4gICAgICAgICAgZWRnZSA9IGVkZ2VOZXh0W3ByZXYgKiBOICsgaV07XG4gICAgICAgICAgcGF0aC5tZXJnZShlZGdlKTtcbiAgICAgICAgICBwYXRoLm1lcmdlKGF0SW5kZXgoaSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXRoO1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIHJlcztcbiAgfSAvLyBmbG95ZFdhcnNoYWxsXG59OyAvLyBlbGVzZm5cblxudmFyIGJlbGxtYW5Gb3JkRGVmYXVsdHMgPSBkZWZhdWx0cyRnKHtcbiAgd2VpZ2h0OiBmdW5jdGlvbiB3ZWlnaHQoZWRnZSkge1xuICAgIHJldHVybiAxO1xuICB9LFxuICBkaXJlY3RlZDogZmFsc2UsXG4gIHJvb3Q6IG51bGxcbn0pO1xudmFyIGVsZXNmbiRxID0ge1xuICAvLyBJbXBsZW1lbnRlZCBmcm9tIHBzZXVkb2NvZGUgZnJvbSB3aWtpcGVkaWFcbiAgYmVsbG1hbkZvcmQ6IGZ1bmN0aW9uIGJlbGxtYW5Gb3JkKG9wdGlvbnMpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIHZhciBfYmVsbG1hbkZvcmREZWZhdWx0cyA9IGJlbGxtYW5Gb3JkRGVmYXVsdHMob3B0aW9ucyksXG4gICAgICB3ZWlnaHQgPSBfYmVsbG1hbkZvcmREZWZhdWx0cy53ZWlnaHQsXG4gICAgICBkaXJlY3RlZCA9IF9iZWxsbWFuRm9yZERlZmF1bHRzLmRpcmVjdGVkLFxuICAgICAgcm9vdCA9IF9iZWxsbWFuRm9yZERlZmF1bHRzLnJvb3Q7XG4gICAgdmFyIHdlaWdodEZuID0gd2VpZ2h0O1xuICAgIHZhciBlbGVzID0gdGhpcztcbiAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gICAgdmFyIF90aGlzJGJ5R3JvdXAgPSB0aGlzLmJ5R3JvdXAoKSxcbiAgICAgIGVkZ2VzID0gX3RoaXMkYnlHcm91cC5lZGdlcyxcbiAgICAgIG5vZGVzID0gX3RoaXMkYnlHcm91cC5ub2RlcztcbiAgICB2YXIgbnVtTm9kZXMgPSBub2Rlcy5sZW5ndGg7XG4gICAgdmFyIGluZm9NYXAgPSBuZXcgTWFwJDEoKTtcbiAgICB2YXIgaGFzTmVnYXRpdmVXZWlnaHRDeWNsZSA9IGZhbHNlO1xuICAgIHZhciBuZWdhdGl2ZVdlaWdodEN5Y2xlcyA9IFtdO1xuICAgIHJvb3QgPSBjeS5jb2xsZWN0aW9uKHJvb3QpWzBdOyAvLyBpbiBjYXNlIHNlbGVjdG9yIHBhc3NlZFxuXG4gICAgZWRnZXMudW5tZXJnZUJ5KGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICByZXR1cm4gZWRnZS5pc0xvb3AoKTtcbiAgICB9KTtcbiAgICB2YXIgbnVtRWRnZXMgPSBlZGdlcy5sZW5ndGg7XG4gICAgdmFyIGdldEluZm8gPSBmdW5jdGlvbiBnZXRJbmZvKG5vZGUpIHtcbiAgICAgIHZhciBvYmogPSBpbmZvTWFwLmdldChub2RlLmlkKCkpO1xuICAgICAgaWYgKCFvYmopIHtcbiAgICAgICAgb2JqID0ge307XG4gICAgICAgIGluZm9NYXAuc2V0KG5vZGUuaWQoKSwgb2JqKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmo7XG4gICAgfTtcbiAgICB2YXIgZ2V0Tm9kZUZyb21UbyA9IGZ1bmN0aW9uIGdldE5vZGVGcm9tVG8odG8pIHtcbiAgICAgIHJldHVybiAoc3RyaW5nKHRvKSA/IGN5LiQodG8pIDogdG8pWzBdO1xuICAgIH07XG4gICAgdmFyIGRpc3RhbmNlVG8gPSBmdW5jdGlvbiBkaXN0YW5jZVRvKHRvKSB7XG4gICAgICByZXR1cm4gZ2V0SW5mbyhnZXROb2RlRnJvbVRvKHRvKSkuZGlzdDtcbiAgICB9O1xuICAgIHZhciBwYXRoVG8gPSBmdW5jdGlvbiBwYXRoVG8odG8pIHtcbiAgICAgIHZhciB0aGlzU3RhcnQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHJvb3Q7XG4gICAgICB2YXIgZW5kID0gZ2V0Tm9kZUZyb21Ubyh0byk7XG4gICAgICB2YXIgcGF0aCA9IFtdO1xuICAgICAgdmFyIG5vZGUgPSBlbmQ7XG4gICAgICBmb3IgKDs7KSB7XG4gICAgICAgIGlmIChub2RlID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMuc3Bhd24oKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgX2dldEluZm8gPSBnZXRJbmZvKG5vZGUpLFxuICAgICAgICAgIGVkZ2UgPSBfZ2V0SW5mby5lZGdlLFxuICAgICAgICAgIHByZWQgPSBfZ2V0SW5mby5wcmVkO1xuICAgICAgICBwYXRoLnVuc2hpZnQobm9kZVswXSk7XG4gICAgICAgIGlmIChub2RlLnNhbWUodGhpc1N0YXJ0KSAmJiBwYXRoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWRnZSAhPSBudWxsKSB7XG4gICAgICAgICAgcGF0aC51bnNoaWZ0KGVkZ2UpO1xuICAgICAgICB9XG4gICAgICAgIG5vZGUgPSBwcmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVsZXMuc3Bhd24ocGF0aCk7XG4gICAgfTtcblxuICAgIC8vIEluaXRpYWxpemF0aW9ucyB7IGRpc3QsIHByZWQsIGVkZ2UgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtTm9kZXM7IGkrKykge1xuICAgICAgdmFyIG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgIHZhciBpbmZvID0gZ2V0SW5mbyhub2RlKTtcbiAgICAgIGlmIChub2RlLnNhbWUocm9vdCkpIHtcbiAgICAgICAgaW5mby5kaXN0ID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluZm8uZGlzdCA9IEluZmluaXR5O1xuICAgICAgfVxuICAgICAgaW5mby5wcmVkID0gbnVsbDtcbiAgICAgIGluZm8uZWRnZSA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gRWRnZXMgcmVsYXhhdGlvblxuICAgIHZhciByZXBsYWNlZEVkZ2UgPSBmYWxzZTtcbiAgICB2YXIgY2hlY2tGb3JFZGdlUmVwbGFjZW1lbnQgPSBmdW5jdGlvbiBjaGVja0ZvckVkZ2VSZXBsYWNlbWVudChub2RlMSwgbm9kZTIsIGVkZ2UsIGluZm8xLCBpbmZvMiwgd2VpZ2h0KSB7XG4gICAgICB2YXIgZGlzdCA9IGluZm8xLmRpc3QgKyB3ZWlnaHQ7XG4gICAgICBpZiAoZGlzdCA8IGluZm8yLmRpc3QgJiYgIWVkZ2Uuc2FtZShpbmZvMS5lZGdlKSkge1xuICAgICAgICBpbmZvMi5kaXN0ID0gZGlzdDtcbiAgICAgICAgaW5mbzIucHJlZCA9IG5vZGUxO1xuICAgICAgICBpbmZvMi5lZGdlID0gZWRnZTtcbiAgICAgICAgcmVwbGFjZWRFZGdlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGZvciAodmFyIF9pID0gMTsgX2kgPCBudW1Ob2RlczsgX2krKykge1xuICAgICAgcmVwbGFjZWRFZGdlID0gZmFsc2U7XG4gICAgICBmb3IgKHZhciBlID0gMDsgZSA8IG51bUVkZ2VzOyBlKyspIHtcbiAgICAgICAgdmFyIGVkZ2UgPSBlZGdlc1tlXTtcbiAgICAgICAgdmFyIHNyYyA9IGVkZ2Uuc291cmNlKCk7XG4gICAgICAgIHZhciB0Z3QgPSBlZGdlLnRhcmdldCgpO1xuICAgICAgICB2YXIgX3dlaWdodCA9IHdlaWdodEZuKGVkZ2UpO1xuICAgICAgICB2YXIgc3JjSW5mbyA9IGdldEluZm8oc3JjKTtcbiAgICAgICAgdmFyIHRndEluZm8gPSBnZXRJbmZvKHRndCk7XG4gICAgICAgIGNoZWNrRm9yRWRnZVJlcGxhY2VtZW50KHNyYywgdGd0LCBlZGdlLCBzcmNJbmZvLCB0Z3RJbmZvLCBfd2VpZ2h0KTtcblxuICAgICAgICAvLyBJZiB1bmRpcmVjdGVkIGdyYXBoLCB3ZSBuZWVkIHRvIHRha2UgaW50byBhY2NvdW50IHRoZSAncmV2ZXJzZScgZWRnZVxuICAgICAgICBpZiAoIWRpcmVjdGVkKSB7XG4gICAgICAgICAgY2hlY2tGb3JFZGdlUmVwbGFjZW1lbnQodGd0LCBzcmMsIGVkZ2UsIHRndEluZm8sIHNyY0luZm8sIF93ZWlnaHQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIXJlcGxhY2VkRWRnZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJlcGxhY2VkRWRnZSkge1xuICAgICAgLy8gQ2hlY2sgZm9yIG5lZ2F0aXZlIHdlaWdodCBjeWNsZXNcbiAgICAgIHZhciBuZWdhdGl2ZVdlaWdodEN5Y2xlSWRzID0gW107XG4gICAgICBmb3IgKHZhciBfZSA9IDA7IF9lIDwgbnVtRWRnZXM7IF9lKyspIHtcbiAgICAgICAgdmFyIF9lZGdlID0gZWRnZXNbX2VdO1xuICAgICAgICB2YXIgX3NyYyA9IF9lZGdlLnNvdXJjZSgpO1xuICAgICAgICB2YXIgX3RndCA9IF9lZGdlLnRhcmdldCgpO1xuICAgICAgICB2YXIgX3dlaWdodDIgPSB3ZWlnaHRGbihfZWRnZSk7XG4gICAgICAgIHZhciBzcmNEaXN0ID0gZ2V0SW5mbyhfc3JjKS5kaXN0O1xuICAgICAgICB2YXIgdGd0RGlzdCA9IGdldEluZm8oX3RndCkuZGlzdDtcbiAgICAgICAgaWYgKHNyY0Rpc3QgKyBfd2VpZ2h0MiA8IHRndERpc3QgfHwgIWRpcmVjdGVkICYmIHRndERpc3QgKyBfd2VpZ2h0MiA8IHNyY0Rpc3QpIHtcbiAgICAgICAgICBpZiAoIWhhc05lZ2F0aXZlV2VpZ2h0Q3ljbGUpIHtcbiAgICAgICAgICAgIHdhcm4oJ0dyYXBoIGNvbnRhaW5zIGEgbmVnYXRpdmUgd2VpZ2h0IGN5Y2xlIGZvciBCZWxsbWFuLUZvcmQnKTtcbiAgICAgICAgICAgIGhhc05lZ2F0aXZlV2VpZ2h0Q3ljbGUgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAob3B0aW9ucy5maW5kTmVnYXRpdmVXZWlnaHRDeWNsZXMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICB2YXIgbmVnYXRpdmVOb2RlcyA9IFtdO1xuICAgICAgICAgICAgaWYgKHNyY0Rpc3QgKyBfd2VpZ2h0MiA8IHRndERpc3QpIHtcbiAgICAgICAgICAgICAgbmVnYXRpdmVOb2Rlcy5wdXNoKF9zcmMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFkaXJlY3RlZCAmJiB0Z3REaXN0ICsgX3dlaWdodDIgPCBzcmNEaXN0KSB7XG4gICAgICAgICAgICAgIG5lZ2F0aXZlTm9kZXMucHVzaChfdGd0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBudW1OZWdhdGl2ZU5vZGVzID0gbmVnYXRpdmVOb2Rlcy5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IG51bU5lZ2F0aXZlTm9kZXM7IG4rKykge1xuICAgICAgICAgICAgICB2YXIgc3RhcnQgPSBuZWdhdGl2ZU5vZGVzW25dO1xuICAgICAgICAgICAgICB2YXIgY3ljbGUgPSBbc3RhcnRdO1xuICAgICAgICAgICAgICBjeWNsZS5wdXNoKGdldEluZm8oc3RhcnQpLmVkZ2UpO1xuICAgICAgICAgICAgICB2YXIgX25vZGUgPSBnZXRJbmZvKHN0YXJ0KS5wcmVkO1xuICAgICAgICAgICAgICB3aGlsZSAoY3ljbGUuaW5kZXhPZihfbm9kZSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgY3ljbGUucHVzaChfbm9kZSk7XG4gICAgICAgICAgICAgICAgY3ljbGUucHVzaChnZXRJbmZvKF9ub2RlKS5lZGdlKTtcbiAgICAgICAgICAgICAgICBfbm9kZSA9IGdldEluZm8oX25vZGUpLnByZWQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY3ljbGUgPSBjeWNsZS5zbGljZShjeWNsZS5pbmRleE9mKF9ub2RlKSk7XG4gICAgICAgICAgICAgIHZhciBzbWFsbGVzdElkID0gY3ljbGVbMF0uaWQoKTtcbiAgICAgICAgICAgICAgdmFyIHNtYWxsZXN0SW5kZXggPSAwO1xuICAgICAgICAgICAgICBmb3IgKHZhciBjID0gMjsgYyA8IGN5Y2xlLmxlbmd0aDsgYyArPSAyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGN5Y2xlW2NdLmlkKCkgPCBzbWFsbGVzdElkKSB7XG4gICAgICAgICAgICAgICAgICBzbWFsbGVzdElkID0gY3ljbGVbY10uaWQoKTtcbiAgICAgICAgICAgICAgICAgIHNtYWxsZXN0SW5kZXggPSBjO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjeWNsZSA9IGN5Y2xlLnNsaWNlKHNtYWxsZXN0SW5kZXgpLmNvbmNhdChjeWNsZS5zbGljZSgwLCBzbWFsbGVzdEluZGV4KSk7XG4gICAgICAgICAgICAgIGN5Y2xlLnB1c2goY3ljbGVbMF0pO1xuICAgICAgICAgICAgICB2YXIgY3ljbGVJZCA9IGN5Y2xlLm1hcChmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZWwuaWQoKTtcbiAgICAgICAgICAgICAgfSkuam9pbihcIixcIik7XG4gICAgICAgICAgICAgIGlmIChuZWdhdGl2ZVdlaWdodEN5Y2xlSWRzLmluZGV4T2YoY3ljbGVJZCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgbmVnYXRpdmVXZWlnaHRDeWNsZXMucHVzaChlbGVzLnNwYXduKGN5Y2xlKSk7XG4gICAgICAgICAgICAgICAgbmVnYXRpdmVXZWlnaHRDeWNsZUlkcy5wdXNoKGN5Y2xlSWQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgZGlzdGFuY2VUbzogZGlzdGFuY2VUbyxcbiAgICAgIHBhdGhUbzogcGF0aFRvLFxuICAgICAgaGFzTmVnYXRpdmVXZWlnaHRDeWNsZTogaGFzTmVnYXRpdmVXZWlnaHRDeWNsZSxcbiAgICAgIG5lZ2F0aXZlV2VpZ2h0Q3ljbGVzOiBuZWdhdGl2ZVdlaWdodEN5Y2xlc1xuICAgIH07XG4gIH0gLy8gYmVsbG1hbkZvcmRcbn07IC8vIGVsZXNmblxuXG52YXIgc3FydDIgPSBNYXRoLnNxcnQoMik7XG5cbi8vIEZ1bmN0aW9uIHdoaWNoIGNvbGFwc2VzIDIgKG1ldGEpIG5vZGVzIGludG8gb25lXG4vLyBVcGRhdGVzIHRoZSByZW1haW5pbmcgZWRnZSBsaXN0c1xuLy8gUmVjZWl2ZXMgYXMgYSBwYXJhbWF0ZXIgdGhlIGVkZ2Ugd2hpY2ggY2F1c2VzIHRoZSBjb2xsYXBzZVxudmFyIGNvbGxhcHNlID0gZnVuY3Rpb24gY29sbGFwc2UoZWRnZUluZGV4LCBub2RlTWFwLCByZW1haW5pbmdFZGdlcykge1xuICBpZiAocmVtYWluaW5nRWRnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgZXJyb3IoXCJLYXJnZXItU3RlaW4gbXVzdCBiZSBydW4gb24gYSBjb25uZWN0ZWQgKHN1YilncmFwaFwiKTtcbiAgfVxuICB2YXIgZWRnZUluZm8gPSByZW1haW5pbmdFZGdlc1tlZGdlSW5kZXhdO1xuICB2YXIgc291cmNlSW4gPSBlZGdlSW5mb1sxXTtcbiAgdmFyIHRhcmdldEluID0gZWRnZUluZm9bMl07XG4gIHZhciBwYXJ0aXRpb24xID0gbm9kZU1hcFtzb3VyY2VJbl07XG4gIHZhciBwYXJ0aXRpb24yID0gbm9kZU1hcFt0YXJnZXRJbl07XG4gIHZhciBuZXdFZGdlcyA9IHJlbWFpbmluZ0VkZ2VzOyAvLyByZS11c2UgYXJyYXlcblxuICAvLyBEZWxldGUgYWxsIGVkZ2VzIGJldHdlZW4gcGFydGl0aW9uMSBhbmQgcGFydGl0aW9uMlxuICBmb3IgKHZhciBpID0gbmV3RWRnZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICB2YXIgZWRnZSA9IG5ld0VkZ2VzW2ldO1xuICAgIHZhciBzcmMgPSBlZGdlWzFdO1xuICAgIHZhciB0Z3QgPSBlZGdlWzJdO1xuICAgIGlmIChub2RlTWFwW3NyY10gPT09IHBhcnRpdGlvbjEgJiYgbm9kZU1hcFt0Z3RdID09PSBwYXJ0aXRpb24yIHx8IG5vZGVNYXBbc3JjXSA9PT0gcGFydGl0aW9uMiAmJiBub2RlTWFwW3RndF0gPT09IHBhcnRpdGlvbjEpIHtcbiAgICAgIG5ld0VkZ2VzLnNwbGljZShpLCAxKTtcbiAgICB9XG4gIH1cblxuICAvLyBBbGwgZWRnZXMgcG9pbnRpbmcgdG8gcGFydGl0aW9uMiBzaG91bGQgbm93IHBvaW50IHRvIHBhcnRpdGlvbjFcbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IG5ld0VkZ2VzLmxlbmd0aDsgX2krKykge1xuICAgIHZhciBfZWRnZSA9IG5ld0VkZ2VzW19pXTtcbiAgICBpZiAoX2VkZ2VbMV0gPT09IHBhcnRpdGlvbjIpIHtcbiAgICAgIC8vIENoZWNrIHNvdXJjZVxuICAgICAgbmV3RWRnZXNbX2ldID0gX2VkZ2Uuc2xpY2UoKTsgLy8gY29weVxuICAgICAgbmV3RWRnZXNbX2ldWzFdID0gcGFydGl0aW9uMTtcbiAgICB9IGVsc2UgaWYgKF9lZGdlWzJdID09PSBwYXJ0aXRpb24yKSB7XG4gICAgICAvLyBDaGVjayB0YXJnZXRcbiAgICAgIG5ld0VkZ2VzW19pXSA9IF9lZGdlLnNsaWNlKCk7IC8vIGNvcHlcbiAgICAgIG5ld0VkZ2VzW19pXVsyXSA9IHBhcnRpdGlvbjE7XG4gICAgfVxuICB9XG5cbiAgLy8gTW92ZSBhbGwgbm9kZXMgZnJvbSBwYXJ0aXRpb24yIHRvIHBhcnRpdGlvbjFcbiAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgbm9kZU1hcC5sZW5ndGg7IF9pMisrKSB7XG4gICAgaWYgKG5vZGVNYXBbX2kyXSA9PT0gcGFydGl0aW9uMikge1xuICAgICAgbm9kZU1hcFtfaTJdID0gcGFydGl0aW9uMTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5ld0VkZ2VzO1xufTtcblxuLy8gQ29udHJhY3RzIGEgZ3JhcGggdW50aWwgd2UgcmVhY2ggYSBjZXJ0YWluIG51bWJlciBvZiBtZXRhIG5vZGVzXG52YXIgY29udHJhY3RVbnRpbCA9IGZ1bmN0aW9uIGNvbnRyYWN0VW50aWwobWV0YU5vZGVNYXAsIHJlbWFpbmluZ0VkZ2VzLCBzaXplLCBzaXplTGltaXQpIHtcbiAgd2hpbGUgKHNpemUgPiBzaXplTGltaXQpIHtcbiAgICAvLyBDaG9vc2UgYW4gZWRnZSByYW5kb21seVxuICAgIHZhciBlZGdlSW5kZXggPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiByZW1haW5pbmdFZGdlcy5sZW5ndGgpO1xuXG4gICAgLy8gQ29sbGFwc2UgZ3JhcGggYmFzZWQgb24gZWRnZVxuICAgIHJlbWFpbmluZ0VkZ2VzID0gY29sbGFwc2UoZWRnZUluZGV4LCBtZXRhTm9kZU1hcCwgcmVtYWluaW5nRWRnZXMpO1xuICAgIHNpemUtLTtcbiAgfVxuICByZXR1cm4gcmVtYWluaW5nRWRnZXM7XG59O1xudmFyIGVsZXNmbiRwID0ge1xuICAvLyBDb21wdXRlcyB0aGUgbWluaW11bSBjdXQgb2YgYW4gdW5kaXJlY3RlZCBncmFwaFxuICAvLyBSZXR1cm5zIHRoZSBjb3JyZWN0IGFuc3dlciB3aXRoIGhpZ2ggcHJvYmFiaWxpdHlcbiAga2FyZ2VyU3RlaW46IGZ1bmN0aW9uIGthcmdlclN0ZWluKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgdmFyIF90aGlzJGJ5R3JvdXAgPSB0aGlzLmJ5R3JvdXAoKSxcbiAgICAgIG5vZGVzID0gX3RoaXMkYnlHcm91cC5ub2RlcyxcbiAgICAgIGVkZ2VzID0gX3RoaXMkYnlHcm91cC5lZGdlcztcbiAgICBlZGdlcy51bm1lcmdlQnkoZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICAgIHJldHVybiBlZGdlLmlzTG9vcCgpO1xuICAgIH0pO1xuICAgIHZhciBudW1Ob2RlcyA9IG5vZGVzLmxlbmd0aDtcbiAgICB2YXIgbnVtRWRnZXMgPSBlZGdlcy5sZW5ndGg7XG4gICAgdmFyIG51bUl0ZXIgPSBNYXRoLmNlaWwoTWF0aC5wb3coTWF0aC5sb2cobnVtTm9kZXMpIC8gTWF0aC5MTjIsIDIpKTtcbiAgICB2YXIgc3RvcFNpemUgPSBNYXRoLmZsb29yKG51bU5vZGVzIC8gc3FydDIpO1xuICAgIGlmIChudW1Ob2RlcyA8IDIpIHtcbiAgICAgIGVycm9yKCdBdCBsZWFzdCAyIG5vZGVzIGFyZSByZXF1aXJlZCBmb3IgS2FyZ2VyLVN0ZWluIGFsZ29yaXRobScpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBOb3cgc3RvcmUgZWRnZSBkZXN0aW5hdGlvbiBhcyBpbmRleGVzXG4gICAgLy8gRm9ybWF0IGZvciBlYWNoIGVkZ2UgKGVkZ2UgaW5kZXgsIHNvdXJjZSBub2RlIGluZGV4LCB0YXJnZXQgbm9kZSBpbmRleClcbiAgICB2YXIgZWRnZUluZGV4ZXMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bUVkZ2VzOyBpKyspIHtcbiAgICAgIHZhciBlID0gZWRnZXNbaV07XG4gICAgICBlZGdlSW5kZXhlcy5wdXNoKFtpLCBub2Rlcy5pbmRleE9mKGUuc291cmNlKCkpLCBub2Rlcy5pbmRleE9mKGUudGFyZ2V0KCkpXSk7XG4gICAgfVxuXG4gICAgLy8gV2Ugd2lsbCBzdG9yZSB0aGUgYmVzdCBjdXQgZm91bmQgaGVyZVxuICAgIHZhciBtaW5DdXRTaXplID0gSW5maW5pdHk7XG4gICAgdmFyIG1pbkN1dEVkZ2VJbmRleGVzID0gW107XG4gICAgdmFyIG1pbkN1dE5vZGVNYXAgPSBuZXcgQXJyYXkobnVtTm9kZXMpO1xuXG4gICAgLy8gSW5pdGlhbCBtZXRhIG5vZGUgcGFydGl0aW9uXG4gICAgdmFyIG1ldGFOb2RlTWFwID0gbmV3IEFycmF5KG51bU5vZGVzKTtcbiAgICB2YXIgbWV0YU5vZGVNYXAyID0gbmV3IEFycmF5KG51bU5vZGVzKTtcbiAgICB2YXIgY29weU5vZGVzTWFwID0gZnVuY3Rpb24gY29weU5vZGVzTWFwKGZyb20sIHRvKSB7XG4gICAgICBmb3IgKHZhciBfaTMgPSAwOyBfaTMgPCBudW1Ob2RlczsgX2kzKyspIHtcbiAgICAgICAgdG9bX2kzXSA9IGZyb21bX2kzXTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gTWFpbiBsb29wXG4gICAgZm9yICh2YXIgaXRlciA9IDA7IGl0ZXIgPD0gbnVtSXRlcjsgaXRlcisrKSB7XG4gICAgICAvLyBSZXNldCBtZXRhIG5vZGUgcGFydGl0aW9uXG4gICAgICBmb3IgKHZhciBfaTQgPSAwOyBfaTQgPCBudW1Ob2RlczsgX2k0KyspIHtcbiAgICAgICAgbWV0YU5vZGVNYXBbX2k0XSA9IF9pNDtcbiAgICAgIH1cblxuICAgICAgLy8gQ29udHJhY3QgdW50aWwgc3RvcCBwb2ludCAoc3RvcFNpemUgbm9kZXMpXG4gICAgICB2YXIgZWRnZXNTdGF0ZSA9IGNvbnRyYWN0VW50aWwobWV0YU5vZGVNYXAsIGVkZ2VJbmRleGVzLnNsaWNlKCksIG51bU5vZGVzLCBzdG9wU2l6ZSk7XG4gICAgICB2YXIgZWRnZXNTdGF0ZTIgPSBlZGdlc1N0YXRlLnNsaWNlKCk7IC8vIGNvcHlcblxuICAgICAgLy8gQ3JlYXRlIGEgY29weSBvZiB0aGUgY29sYXBzZWQgbm9kZXMgc3RhdGVcbiAgICAgIGNvcHlOb2Rlc01hcChtZXRhTm9kZU1hcCwgbWV0YU5vZGVNYXAyKTtcblxuICAgICAgLy8gUnVuIDIgaXRlcmF0aW9ucyBzdGFydGluZyBpbiB0aGUgc3RvcCBzdGF0ZVxuICAgICAgdmFyIHJlczEgPSBjb250cmFjdFVudGlsKG1ldGFOb2RlTWFwLCBlZGdlc1N0YXRlLCBzdG9wU2l6ZSwgMik7XG4gICAgICB2YXIgcmVzMiA9IGNvbnRyYWN0VW50aWwobWV0YU5vZGVNYXAyLCBlZGdlc1N0YXRlMiwgc3RvcFNpemUsIDIpO1xuXG4gICAgICAvLyBJcyBhbnkgb2YgdGhlIDIgcmVzdWx0cyB0aGUgYmVzdCBjdXQgc28gZmFyP1xuICAgICAgaWYgKHJlczEubGVuZ3RoIDw9IHJlczIubGVuZ3RoICYmIHJlczEubGVuZ3RoIDwgbWluQ3V0U2l6ZSkge1xuICAgICAgICBtaW5DdXRTaXplID0gcmVzMS5sZW5ndGg7XG4gICAgICAgIG1pbkN1dEVkZ2VJbmRleGVzID0gcmVzMTtcbiAgICAgICAgY29weU5vZGVzTWFwKG1ldGFOb2RlTWFwLCBtaW5DdXROb2RlTWFwKTtcbiAgICAgIH0gZWxzZSBpZiAocmVzMi5sZW5ndGggPD0gcmVzMS5sZW5ndGggJiYgcmVzMi5sZW5ndGggPCBtaW5DdXRTaXplKSB7XG4gICAgICAgIG1pbkN1dFNpemUgPSByZXMyLmxlbmd0aDtcbiAgICAgICAgbWluQ3V0RWRnZUluZGV4ZXMgPSByZXMyO1xuICAgICAgICBjb3B5Tm9kZXNNYXAobWV0YU5vZGVNYXAyLCBtaW5DdXROb2RlTWFwKTtcbiAgICAgIH1cbiAgICB9IC8vIGVuZCBvZiBtYWluIGxvb3BcblxuICAgIC8vIENvbnN0cnVjdCByZXN1bHRcbiAgICB2YXIgY3V0ID0gdGhpcy5zcGF3bihtaW5DdXRFZGdlSW5kZXhlcy5tYXAoZnVuY3Rpb24gKGUpIHtcbiAgICAgIHJldHVybiBlZGdlc1tlWzBdXTtcbiAgICB9KSk7XG4gICAgdmFyIHBhcnRpdGlvbjEgPSB0aGlzLnNwYXduKCk7XG4gICAgdmFyIHBhcnRpdGlvbjIgPSB0aGlzLnNwYXduKCk7XG5cbiAgICAvLyB0cmF2ZXJzZSBtZXRhTm9kZU1hcCBmb3IgYmVzdCBjdXRcbiAgICB2YXIgd2l0bmVzc05vZGVQYXJ0aXRpb24gPSBtaW5DdXROb2RlTWFwWzBdO1xuICAgIGZvciAodmFyIF9pNSA9IDA7IF9pNSA8IG1pbkN1dE5vZGVNYXAubGVuZ3RoOyBfaTUrKykge1xuICAgICAgdmFyIHBhcnRpdGlvbklkID0gbWluQ3V0Tm9kZU1hcFtfaTVdO1xuICAgICAgdmFyIG5vZGUgPSBub2Rlc1tfaTVdO1xuICAgICAgaWYgKHBhcnRpdGlvbklkID09PSB3aXRuZXNzTm9kZVBhcnRpdGlvbikge1xuICAgICAgICBwYXJ0aXRpb24xLm1lcmdlKG5vZGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFydGl0aW9uMi5tZXJnZShub2RlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjb25zdHJ1Y3QgY29tcG9uZW50cyBjb3JyZXNwb25kaW5nIHRvIGVhY2ggZGlzam9pbnQgc3Vic2V0IG9mIG5vZGVzXG4gICAgdmFyIGNvbnN0cnVjdENvbXBvbmVudCA9IGZ1bmN0aW9uIGNvbnN0cnVjdENvbXBvbmVudChzdWJzZXQpIHtcbiAgICAgIHZhciBjb21wb25lbnQgPSBfdGhpcy5zcGF3bigpO1xuICAgICAgc3Vic2V0LmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgY29tcG9uZW50Lm1lcmdlKG5vZGUpO1xuICAgICAgICBub2RlLmNvbm5lY3RlZEVkZ2VzKCkuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgICAgIC8vIGVuc3VyZSBlZGdlIGlzIHdpdGhpbiBjYWxsaW5nIGNvbGxlY3Rpb24gYW5kIGVkZ2UgaXMgbm90IGluIGN1dFxuICAgICAgICAgIGlmIChfdGhpcy5jb250YWlucyhlZGdlKSAmJiAhY3V0LmNvbnRhaW5zKGVkZ2UpKSB7XG4gICAgICAgICAgICBjb21wb25lbnQubWVyZ2UoZWRnZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgICB9O1xuICAgIHZhciBjb21wb25lbnRzID0gW2NvbnN0cnVjdENvbXBvbmVudChwYXJ0aXRpb24xKSwgY29uc3RydWN0Q29tcG9uZW50KHBhcnRpdGlvbjIpXTtcbiAgICB2YXIgcmV0ID0ge1xuICAgICAgY3V0OiBjdXQsXG4gICAgICBjb21wb25lbnRzOiBjb21wb25lbnRzLFxuICAgICAgLy8gbi5iLiBwYXJ0aXRpb25zIGFyZSBpbmNsdWRlZCB0byBiZSBjb21wYXRpYmxlIHdpdGggdGhlIG9sZCBhcGkgc3BlY1xuICAgICAgLy8gKGNvdWxkIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgbWFqb3IgdmVyc2lvbilcbiAgICAgIHBhcnRpdGlvbjE6IHBhcnRpdGlvbjEsXG4gICAgICBwYXJ0aXRpb24yOiBwYXJ0aXRpb24yXG4gICAgfTtcbiAgICByZXR1cm4gcmV0O1xuICB9XG59OyAvLyBlbGVzZm5cblxudmFyIF9NYXRoJGh5cG90O1xudmFyIGNvcHlQb3NpdGlvbiA9IGZ1bmN0aW9uIGNvcHlQb3NpdGlvbihwKSB7XG4gIHJldHVybiB7XG4gICAgeDogcC54LFxuICAgIHk6IHAueVxuICB9O1xufTtcbnZhciBtb2RlbFRvUmVuZGVyZWRQb3NpdGlvbiQxID0gZnVuY3Rpb24gbW9kZWxUb1JlbmRlcmVkUG9zaXRpb24ocCwgem9vbSwgcGFuKSB7XG4gIHJldHVybiB7XG4gICAgeDogcC54ICogem9vbSArIHBhbi54LFxuICAgIHk6IHAueSAqIHpvb20gKyBwYW4ueVxuICB9O1xufTtcbnZhciByZW5kZXJlZFRvTW9kZWxQb3NpdGlvbiA9IGZ1bmN0aW9uIHJlbmRlcmVkVG9Nb2RlbFBvc2l0aW9uKHAsIHpvb20sIHBhbikge1xuICByZXR1cm4ge1xuICAgIHg6IChwLnggLSBwYW4ueCkgLyB6b29tLFxuICAgIHk6IChwLnkgLSBwYW4ueSkgLyB6b29tXG4gIH07XG59O1xudmFyIGFycmF5MnBvaW50ID0gZnVuY3Rpb24gYXJyYXkycG9pbnQoYXJyKSB7XG4gIHJldHVybiB7XG4gICAgeDogYXJyWzBdLFxuICAgIHk6IGFyclsxXVxuICB9O1xufTtcbnZhciBtaW4gPSBmdW5jdGlvbiBtaW4oYXJyKSB7XG4gIHZhciBiZWdpbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMDtcbiAgdmFyIGVuZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogYXJyLmxlbmd0aDtcbiAgdmFyIG1pbiA9IEluZmluaXR5O1xuICBmb3IgKHZhciBpID0gYmVnaW47IGkgPCBlbmQ7IGkrKykge1xuICAgIHZhciB2YWwgPSBhcnJbaV07XG4gICAgaWYgKGlzRmluaXRlKHZhbCkpIHtcbiAgICAgIG1pbiA9IE1hdGgubWluKHZhbCwgbWluKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1pbjtcbn07XG52YXIgbWF4ID0gZnVuY3Rpb24gbWF4KGFycikge1xuICB2YXIgYmVnaW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IDA7XG4gIHZhciBlbmQgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGFyci5sZW5ndGg7XG4gIHZhciBtYXggPSAtSW5maW5pdHk7XG4gIGZvciAodmFyIGkgPSBiZWdpbjsgaSA8IGVuZDsgaSsrKSB7XG4gICAgdmFyIHZhbCA9IGFycltpXTtcbiAgICBpZiAoaXNGaW5pdGUodmFsKSkge1xuICAgICAgbWF4ID0gTWF0aC5tYXgodmFsLCBtYXgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbWF4O1xufTtcbnZhciBtZWFuID0gZnVuY3Rpb24gbWVhbihhcnIpIHtcbiAgdmFyIGJlZ2luID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAwO1xuICB2YXIgZW5kID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBhcnIubGVuZ3RoO1xuICB2YXIgdG90YWwgPSAwO1xuICB2YXIgbiA9IDA7XG4gIGZvciAodmFyIGkgPSBiZWdpbjsgaSA8IGVuZDsgaSsrKSB7XG4gICAgdmFyIHZhbCA9IGFycltpXTtcbiAgICBpZiAoaXNGaW5pdGUodmFsKSkge1xuICAgICAgdG90YWwgKz0gdmFsO1xuICAgICAgbisrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdG90YWwgLyBuO1xufTtcbnZhciBtZWRpYW4gPSBmdW5jdGlvbiBtZWRpYW4oYXJyKSB7XG4gIHZhciBiZWdpbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMDtcbiAgdmFyIGVuZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogYXJyLmxlbmd0aDtcbiAgdmFyIGNvcHkgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IHRydWU7XG4gIHZhciBzb3J0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgYXJndW1lbnRzWzRdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNF0gOiB0cnVlO1xuICB2YXIgaW5jbHVkZUhvbGVzID0gYXJndW1lbnRzLmxlbmd0aCA+IDUgJiYgYXJndW1lbnRzWzVdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNV0gOiB0cnVlO1xuICBpZiAoY29weSkge1xuICAgIGFyciA9IGFyci5zbGljZShiZWdpbiwgZW5kKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoZW5kIDwgYXJyLmxlbmd0aCkge1xuICAgICAgYXJyLnNwbGljZShlbmQsIGFyci5sZW5ndGggLSBlbmQpO1xuICAgIH1cbiAgICBpZiAoYmVnaW4gPiAwKSB7XG4gICAgICBhcnIuc3BsaWNlKDAsIGJlZ2luKTtcbiAgICB9XG4gIH1cblxuICAvLyBhbGwgbm9uIGZpbml0ZSAoZS5nLiBJbmZpbml0eSwgTmFOKSBlbGVtZW50cyBtdXN0IGJlIC1JbmZpbml0eSBzbyB0aGV5IGdvIHRvIHRoZSBzdGFydFxuICB2YXIgb2ZmID0gMDsgLy8gb2Zmc2V0IGZyb20gbm9uLWZpbml0ZSB2YWx1ZXNcbiAgZm9yICh2YXIgaSA9IGFyci5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIHZhciB2ID0gYXJyW2ldO1xuICAgIGlmIChpbmNsdWRlSG9sZXMpIHtcbiAgICAgIGlmICghaXNGaW5pdGUodikpIHtcbiAgICAgICAgYXJyW2ldID0gLUluZmluaXR5O1xuICAgICAgICBvZmYrKztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8ganVzdCByZW1vdmUgaXQgaWYgd2UgZG9uJ3Qgd2FudCB0byBjb25zaWRlciBob2xlc1xuICAgICAgYXJyLnNwbGljZShpLCAxKTtcbiAgICB9XG4gIH1cbiAgaWYgKHNvcnQpIHtcbiAgICBhcnIuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGEgLSBiO1xuICAgIH0pOyAvLyByZXF1aXJlcyBjb3B5ID0gdHJ1ZSBpZiB5b3UgZG9uJ3Qgd2FudCB0byBjaGFuZ2UgdGhlIG9yaWdcbiAgfVxuICB2YXIgbGVuID0gYXJyLmxlbmd0aDtcbiAgdmFyIG1pZCA9IE1hdGguZmxvb3IobGVuIC8gMik7XG4gIGlmIChsZW4gJSAyICE9PSAwKSB7XG4gICAgcmV0dXJuIGFyclttaWQgKyAxICsgb2ZmXTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gKGFyclttaWQgLSAxICsgb2ZmXSArIGFyclttaWQgKyBvZmZdKSAvIDI7XG4gIH1cbn07XG5cbi8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0dyZWF0ZXN0X2NvbW1vbl9kaXZpc29yI0V1Y2xpZGVhbl9hbGdvcml0aG1cbnZhciBfZ2NkID0gZnVuY3Rpb24gZ2NkKGEsIGIpIHtcbiAgaWYgKGIgPT09IDApIHtcbiAgICByZXR1cm4gYTtcbiAgfVxuICByZXR1cm4gX2djZChiLCBhICUgYik7XG59O1xudmFyIGdjZE11bHRpcGxlWmVyb0lmTm9uSW50ID0gZnVuY3Rpb24gZ2NkTXVsdGlwbGVaZXJvSWZOb25JbnQoYXJyKSB7XG4gIHZhciBvdXQgPSBhcnJbMF07XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKCFpbnRlZ2VyKGFycltpXSkpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH0gZWxzZSBpZiAoaSA+IDApIHtcbiAgICAgIG91dCA9IF9nY2Qob3V0LCBhcnJbaV0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0O1xufTtcbnZhciBkZWcycmFkID0gZnVuY3Rpb24gZGVnMnJhZChkZWcpIHtcbiAgcmV0dXJuIE1hdGguUEkgKiBkZWcgLyAxODA7XG59O1xudmFyIGdldEFuZ2xlRnJvbURpc3AgPSBmdW5jdGlvbiBnZXRBbmdsZUZyb21EaXNwKGRpc3BYLCBkaXNwWSkge1xuICByZXR1cm4gTWF0aC5hdGFuMihkaXNwWSwgZGlzcFgpIC0gTWF0aC5QSSAvIDI7XG59O1xudmFyIGxvZzIgPSBNYXRoLmxvZzIgfHwgZnVuY3Rpb24gKG4pIHtcbiAgcmV0dXJuIE1hdGgubG9nKG4pIC8gTWF0aC5sb2coMik7XG59O1xudmFyIHNpZ251bSA9IGZ1bmN0aW9uIHNpZ251bSh4KSB7XG4gIGlmICh4ID4gMCkge1xuICAgIHJldHVybiAxO1xuICB9IGVsc2UgaWYgKHggPCAwKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAwO1xuICB9XG59O1xudmFyIGRpc3QgPSBmdW5jdGlvbiBkaXN0KHAxLCBwMikge1xuICByZXR1cm4gTWF0aC5zcXJ0KHNxZGlzdChwMSwgcDIpKTtcbn07XG52YXIgc3FkaXN0ID0gZnVuY3Rpb24gc3FkaXN0KHAxLCBwMikge1xuICB2YXIgZHggPSBwMi54IC0gcDEueDtcbiAgdmFyIGR5ID0gcDIueSAtIHAxLnk7XG4gIHJldHVybiBkeCAqIGR4ICsgZHkgKiBkeTtcbn07XG52YXIgaW5QbGFjZVN1bU5vcm1hbGl6ZSA9IGZ1bmN0aW9uIGluUGxhY2VTdW1Ob3JtYWxpemUodikge1xuICB2YXIgbGVuZ3RoID0gdi5sZW5ndGg7XG5cbiAgLy8gRmlyc3QsIGdldCBzdW0gb2YgYWxsIGVsZW1lbnRzXG4gIHZhciB0b3RhbCA9IDA7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICB0b3RhbCArPSB2W2ldO1xuICB9XG5cbiAgLy8gTm93LCBkaXZpZGUgZWFjaCBieSB0aGUgc3VtIG9mIGFsbCBlbGVtZW50c1xuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbGVuZ3RoOyBfaSsrKSB7XG4gICAgdltfaV0gPSB2W19pXSAvIHRvdGFsO1xuICB9XG4gIHJldHVybiB2O1xufTtcblxuLy8gZnJvbSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0LDqXppZXJfY3VydmUjUXVhZHJhdGljX2N1cnZlc1xudmFyIHFiZXppZXJBdCA9IGZ1bmN0aW9uIHFiZXppZXJBdChwMCwgcDEsIHAyLCB0KSB7XG4gIHJldHVybiAoMSAtIHQpICogKDEgLSB0KSAqIHAwICsgMiAqICgxIC0gdCkgKiB0ICogcDEgKyB0ICogdCAqIHAyO1xufTtcbnZhciBxYmV6aWVyUHRBdCA9IGZ1bmN0aW9uIHFiZXppZXJQdEF0KHAwLCBwMSwgcDIsIHQpIHtcbiAgcmV0dXJuIHtcbiAgICB4OiBxYmV6aWVyQXQocDAueCwgcDEueCwgcDIueCwgdCksXG4gICAgeTogcWJlemllckF0KHAwLnksIHAxLnksIHAyLnksIHQpXG4gIH07XG59O1xudmFyIGxpbmVBdCA9IGZ1bmN0aW9uIGxpbmVBdChwMCwgcDEsIHQsIGQpIHtcbiAgdmFyIHZlYyA9IHtcbiAgICB4OiBwMS54IC0gcDAueCxcbiAgICB5OiBwMS55IC0gcDAueVxuICB9O1xuICB2YXIgdmVjRGlzdCA9IGRpc3QocDAsIHAxKTtcbiAgdmFyIG5vcm1WZWMgPSB7XG4gICAgeDogdmVjLnggLyB2ZWNEaXN0LFxuICAgIHk6IHZlYy55IC8gdmVjRGlzdFxuICB9O1xuICB0ID0gdCA9PSBudWxsID8gMCA6IHQ7XG4gIGQgPSBkICE9IG51bGwgPyBkIDogdCAqIHZlY0Rpc3Q7XG4gIHJldHVybiB7XG4gICAgeDogcDAueCArIG5vcm1WZWMueCAqIGQsXG4gICAgeTogcDAueSArIG5vcm1WZWMueSAqIGRcbiAgfTtcbn07XG52YXIgYm91bmQgPSBmdW5jdGlvbiBib3VuZChtaW4sIHZhbCwgbWF4KSB7XG4gIHJldHVybiBNYXRoLm1heChtaW4sIE1hdGgubWluKG1heCwgdmFsKSk7XG59O1xuXG4vLyBtYWtlcyBhIGZ1bGwgYmIgKHgxLCB5MSwgeDIsIHkyLCB3LCBoKSBmcm9tIGltcGxpY2l0IHBhcmFtc1xudmFyIG1ha2VCb3VuZGluZ0JveCA9IGZ1bmN0aW9uIG1ha2VCb3VuZGluZ0JveChiYikge1xuICBpZiAoYmIgPT0gbnVsbCkge1xuICAgIHJldHVybiB7XG4gICAgICB4MTogSW5maW5pdHksXG4gICAgICB5MTogSW5maW5pdHksXG4gICAgICB4MjogLUluZmluaXR5LFxuICAgICAgeTI6IC1JbmZpbml0eSxcbiAgICAgIHc6IDAsXG4gICAgICBoOiAwXG4gICAgfTtcbiAgfSBlbHNlIGlmIChiYi54MSAhPSBudWxsICYmIGJiLnkxICE9IG51bGwpIHtcbiAgICBpZiAoYmIueDIgIT0gbnVsbCAmJiBiYi55MiAhPSBudWxsICYmIGJiLngyID49IGJiLngxICYmIGJiLnkyID49IGJiLnkxKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4MTogYmIueDEsXG4gICAgICAgIHkxOiBiYi55MSxcbiAgICAgICAgeDI6IGJiLngyLFxuICAgICAgICB5MjogYmIueTIsXG4gICAgICAgIHc6IGJiLngyIC0gYmIueDEsXG4gICAgICAgIGg6IGJiLnkyIC0gYmIueTFcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChiYi53ICE9IG51bGwgJiYgYmIuaCAhPSBudWxsICYmIGJiLncgPj0gMCAmJiBiYi5oID49IDApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHgxOiBiYi54MSxcbiAgICAgICAgeTE6IGJiLnkxLFxuICAgICAgICB4MjogYmIueDEgKyBiYi53LFxuICAgICAgICB5MjogYmIueTEgKyBiYi5oLFxuICAgICAgICB3OiBiYi53LFxuICAgICAgICBoOiBiYi5oXG4gICAgICB9O1xuICAgIH1cbiAgfVxufTtcbnZhciBjb3B5Qm91bmRpbmdCb3ggPSBmdW5jdGlvbiBjb3B5Qm91bmRpbmdCb3goYmIpIHtcbiAgcmV0dXJuIHtcbiAgICB4MTogYmIueDEsXG4gICAgeDI6IGJiLngyLFxuICAgIHc6IGJiLncsXG4gICAgeTE6IGJiLnkxLFxuICAgIHkyOiBiYi55MixcbiAgICBoOiBiYi5oXG4gIH07XG59O1xudmFyIGNsZWFyQm91bmRpbmdCb3ggPSBmdW5jdGlvbiBjbGVhckJvdW5kaW5nQm94KGJiKSB7XG4gIGJiLngxID0gSW5maW5pdHk7XG4gIGJiLnkxID0gSW5maW5pdHk7XG4gIGJiLngyID0gLUluZmluaXR5O1xuICBiYi55MiA9IC1JbmZpbml0eTtcbiAgYmIudyA9IDA7XG4gIGJiLmggPSAwO1xufTtcbnZhciB1cGRhdGVCb3VuZGluZ0JveCA9IGZ1bmN0aW9uIHVwZGF0ZUJvdW5kaW5nQm94KGJiMSwgYmIyKSB7XG4gIC8vIHVwZGF0ZSBiYjEgd2l0aCBiYjIgYm91bmRzXG5cbiAgYmIxLngxID0gTWF0aC5taW4oYmIxLngxLCBiYjIueDEpO1xuICBiYjEueDIgPSBNYXRoLm1heChiYjEueDIsIGJiMi54Mik7XG4gIGJiMS53ID0gYmIxLngyIC0gYmIxLngxO1xuICBiYjEueTEgPSBNYXRoLm1pbihiYjEueTEsIGJiMi55MSk7XG4gIGJiMS55MiA9IE1hdGgubWF4KGJiMS55MiwgYmIyLnkyKTtcbiAgYmIxLmggPSBiYjEueTIgLSBiYjEueTE7XG59O1xudmFyIGV4cGFuZEJvdW5kaW5nQm94QnlQb2ludCA9IGZ1bmN0aW9uIGV4cGFuZEJvdW5kaW5nQm94QnlQb2ludChiYiwgeCwgeSkge1xuICBiYi54MSA9IE1hdGgubWluKGJiLngxLCB4KTtcbiAgYmIueDIgPSBNYXRoLm1heChiYi54MiwgeCk7XG4gIGJiLncgPSBiYi54MiAtIGJiLngxO1xuICBiYi55MSA9IE1hdGgubWluKGJiLnkxLCB5KTtcbiAgYmIueTIgPSBNYXRoLm1heChiYi55MiwgeSk7XG4gIGJiLmggPSBiYi55MiAtIGJiLnkxO1xufTtcbnZhciBleHBhbmRCb3VuZGluZ0JveCA9IGZ1bmN0aW9uIGV4cGFuZEJvdW5kaW5nQm94KGJiKSB7XG4gIHZhciBwYWRkaW5nID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAwO1xuICBiYi54MSAtPSBwYWRkaW5nO1xuICBiYi54MiArPSBwYWRkaW5nO1xuICBiYi55MSAtPSBwYWRkaW5nO1xuICBiYi55MiArPSBwYWRkaW5nO1xuICBiYi53ID0gYmIueDIgLSBiYi54MTtcbiAgYmIuaCA9IGJiLnkyIC0gYmIueTE7XG4gIHJldHVybiBiYjtcbn07XG52YXIgZXhwYW5kQm91bmRpbmdCb3hTaWRlcyA9IGZ1bmN0aW9uIGV4cGFuZEJvdW5kaW5nQm94U2lkZXMoYmIpIHtcbiAgdmFyIHBhZGRpbmcgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IFswXTtcbiAgdmFyIHRvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdDtcbiAgaWYgKHBhZGRpbmcubGVuZ3RoID09PSAxKSB7XG4gICAgdG9wID0gcmlnaHQgPSBib3R0b20gPSBsZWZ0ID0gcGFkZGluZ1swXTtcbiAgfSBlbHNlIGlmIChwYWRkaW5nLmxlbmd0aCA9PT0gMikge1xuICAgIHRvcCA9IGJvdHRvbSA9IHBhZGRpbmdbMF07XG4gICAgbGVmdCA9IHJpZ2h0ID0gcGFkZGluZ1sxXTtcbiAgfSBlbHNlIGlmIChwYWRkaW5nLmxlbmd0aCA9PT0gNCkge1xuICAgIHZhciBfcGFkZGluZyA9IF9zbGljZWRUb0FycmF5KHBhZGRpbmcsIDQpO1xuICAgIHRvcCA9IF9wYWRkaW5nWzBdO1xuICAgIHJpZ2h0ID0gX3BhZGRpbmdbMV07XG4gICAgYm90dG9tID0gX3BhZGRpbmdbMl07XG4gICAgbGVmdCA9IF9wYWRkaW5nWzNdO1xuICB9XG4gIGJiLngxIC09IGxlZnQ7XG4gIGJiLngyICs9IHJpZ2h0O1xuICBiYi55MSAtPSB0b3A7XG4gIGJiLnkyICs9IGJvdHRvbTtcbiAgYmIudyA9IGJiLngyIC0gYmIueDE7XG4gIGJiLmggPSBiYi55MiAtIGJiLnkxO1xuICByZXR1cm4gYmI7XG59O1xuXG4vLyBhc3NpZ24gdGhlIHZhbHVlcyBvZiBiYjIgaW50byBiYjFcbnZhciBhc3NpZ25Cb3VuZGluZ0JveCA9IGZ1bmN0aW9uIGFzc2lnbkJvdW5kaW5nQm94KGJiMSwgYmIyKSB7XG4gIGJiMS54MSA9IGJiMi54MTtcbiAgYmIxLnkxID0gYmIyLnkxO1xuICBiYjEueDIgPSBiYjIueDI7XG4gIGJiMS55MiA9IGJiMi55MjtcbiAgYmIxLncgPSBiYjEueDIgLSBiYjEueDE7XG4gIGJiMS5oID0gYmIxLnkyIC0gYmIxLnkxO1xufTtcbnZhciBib3VuZGluZ0JveGVzSW50ZXJzZWN0ID0gZnVuY3Rpb24gYm91bmRpbmdCb3hlc0ludGVyc2VjdChiYjEsIGJiMikge1xuICAvLyBjYXNlOiBvbmUgYmIgdG8gcmlnaHQgb2Ygb3RoZXJcbiAgaWYgKGJiMS54MSA+IGJiMi54Mikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoYmIyLngxID4gYmIxLngyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gY2FzZTogb25lIGJiIHRvIGxlZnQgb2Ygb3RoZXJcbiAgaWYgKGJiMS54MiA8IGJiMi54MSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoYmIyLngyIDwgYmIxLngxKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gY2FzZTogb25lIGJiIGFib3ZlIG90aGVyXG4gIGlmIChiYjEueTIgPCBiYjIueTEpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGJiMi55MiA8IGJiMS55MSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIGNhc2U6IG9uZSBiYiBiZWxvdyBvdGhlclxuICBpZiAoYmIxLnkxID4gYmIyLnkyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChiYjIueTEgPiBiYjEueTIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBvdGhlcndpc2UsIG11c3QgaGF2ZSBzb21lIG92ZXJsYXBcbiAgcmV0dXJuIHRydWU7XG59O1xudmFyIGluQm91bmRpbmdCb3ggPSBmdW5jdGlvbiBpbkJvdW5kaW5nQm94KGJiLCB4LCB5KSB7XG4gIHJldHVybiBiYi54MSA8PSB4ICYmIHggPD0gYmIueDIgJiYgYmIueTEgPD0geSAmJiB5IDw9IGJiLnkyO1xufTtcbnZhciBwb2ludEluQm91bmRpbmdCb3ggPSBmdW5jdGlvbiBwb2ludEluQm91bmRpbmdCb3goYmIsIHB0KSB7XG4gIHJldHVybiBpbkJvdW5kaW5nQm94KGJiLCBwdC54LCBwdC55KTtcbn07XG52YXIgYm91bmRpbmdCb3hJbkJvdW5kaW5nQm94ID0gZnVuY3Rpb24gYm91bmRpbmdCb3hJbkJvdW5kaW5nQm94KGJiMSwgYmIyKSB7XG4gIHJldHVybiBpbkJvdW5kaW5nQm94KGJiMSwgYmIyLngxLCBiYjIueTEpICYmIGluQm91bmRpbmdCb3goYmIxLCBiYjIueDIsIGJiMi55Mik7XG59O1xudmFyIGh5cG90ID0gKF9NYXRoJGh5cG90ID0gTWF0aC5oeXBvdCkgIT09IG51bGwgJiYgX01hdGgkaHlwb3QgIT09IHZvaWQgMCA/IF9NYXRoJGh5cG90IDogZnVuY3Rpb24gKHgsIHkpIHtcbiAgcmV0dXJuIE1hdGguc3FydCh4ICogeCArIHkgKiB5KTtcbn07XG5mdW5jdGlvbiBpbmZsYXRlUG9seWdvbihwb2x5Z29uLCBkKSB7XG4gIGlmIChwb2x5Z29uLmxlbmd0aCA8IDMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05lZWQgYXQgbGVhc3QgMyB2ZXJ0aWNlcycpO1xuICB9XG4gIC8vIEhlbHBlcnNcbiAgdmFyIGFkZCA9IGZ1bmN0aW9uIGFkZChhLCBiKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IGEueCArIGIueCxcbiAgICAgIHk6IGEueSArIGIueVxuICAgIH07XG4gIH07XG4gIHZhciBzdWIgPSBmdW5jdGlvbiBzdWIoYSwgYikge1xuICAgIHJldHVybiB7XG4gICAgICB4OiBhLnggLSBiLngsXG4gICAgICB5OiBhLnkgLSBiLnlcbiAgICB9O1xuICB9O1xuICB2YXIgc2NhbGUgPSBmdW5jdGlvbiBzY2FsZSh2LCBzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IHYueCAqIHMsXG4gICAgICB5OiB2LnkgKiBzXG4gICAgfTtcbiAgfTtcbiAgdmFyIGNyb3NzID0gZnVuY3Rpb24gY3Jvc3ModSwgdikge1xuICAgIHJldHVybiB1LnggKiB2LnkgLSB1LnkgKiB2Lng7XG4gIH07XG4gIHZhciBub3JtYWxpemUgPSBmdW5jdGlvbiBub3JtYWxpemUodikge1xuICAgIHZhciBsZW4gPSBoeXBvdCh2LngsIHYueSk7XG4gICAgcmV0dXJuIGxlbiA9PT0gMCA/IHtcbiAgICAgIHg6IDAsXG4gICAgICB5OiAwXG4gICAgfSA6IHtcbiAgICAgIHg6IHYueCAvIGxlbixcbiAgICAgIHk6IHYueSAvIGxlblxuICAgIH07XG4gIH07XG4gIC8vIFNpZ25lZCBhcmVhIChwb3NpdGl2ZSA9IENDVylcbiAgdmFyIHNpZ25lZEFyZWEgPSBmdW5jdGlvbiBzaWduZWRBcmVhKHB0cykge1xuICAgIHZhciBBID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHB0cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHAgPSBwdHNbaV0sXG4gICAgICAgIHEgPSBwdHNbKGkgKyAxKSAlIHB0cy5sZW5ndGhdO1xuICAgICAgQSArPSBwLnggKiBxLnkgLSBxLnggKiBwLnk7XG4gICAgfVxuICAgIHJldHVybiBBIC8gMjtcbiAgfTtcbiAgLy8gTGluZeKAk2xpbmUgaW50ZXJzZWN0aW9uIChpbmZpbml0ZSBsaW5lcylcbiAgdmFyIGludGVyc2VjdExpbmVzID0gZnVuY3Rpb24gaW50ZXJzZWN0TGluZXMocDEsIHAyLCBwMywgcDQpIHtcbiAgICB2YXIgciA9IHN1YihwMiwgcDEpO1xuICAgIHZhciBzID0gc3ViKHA0LCBwMyk7XG4gICAgdmFyIGRlbm9tID0gY3Jvc3Mociwgcyk7XG4gICAgaWYgKE1hdGguYWJzKGRlbm9tKSA8IDFlLTkpIHtcbiAgICAgIC8vIFBhcmFsbGVsIG9yIG5lYXJseSBzbyDigJQgZmFsbGJhY2sgdG8gbWlkcG9pbnRcbiAgICAgIHJldHVybiBhZGQocDEsIHNjYWxlKHIsIDAuNSkpO1xuICAgIH1cbiAgICB2YXIgdCA9IGNyb3NzKHN1YihwMywgcDEpLCBzKSAvIGRlbm9tO1xuICAgIHJldHVybiBhZGQocDEsIHNjYWxlKHIsIHQpKTtcbiAgfTtcblxuICAvLyBNYWtlIGEgc2hhbGxvdyBjb3B5IGFuZCBlbmZvcmNlIENDV1xuICB2YXIgcHRzID0gcG9seWdvbi5tYXAoZnVuY3Rpb24gKHApIHtcbiAgICByZXR1cm4ge1xuICAgICAgeDogcC54LFxuICAgICAgeTogcC55XG4gICAgfTtcbiAgfSk7XG4gIGlmIChzaWduZWRBcmVhKHB0cykgPCAwKSBwdHMucmV2ZXJzZSgpO1xuICB2YXIgbiA9IHB0cy5sZW5ndGg7XG4gIC8vIENvbXB1dGUgb3V0d2FyZCBub3JtYWxzIGZvciBlYWNoIGVkZ2VcbiAgdmFyIG5vcm1hbHMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICB2YXIgcCA9IHB0c1tpXSxcbiAgICAgIHEgPSBwdHNbKGkgKyAxKSAlIG5dO1xuICAgIHZhciBlZGdlID0gc3ViKHEsIHApO1xuICAgIC8vIEZvciBDQ1cgcG9seWdvbiwgaW53YXJkIG5vcm1hbCA9ICgtZWRnZS55LCBlZGdlLngpXG4gICAgLy8gc28gb3V0d2FyZCBub3JtYWwgPSAoZWRnZS55LCAtZWRnZS54KVxuICAgIHZhciBvdXQgPSBub3JtYWxpemUoe1xuICAgICAgeDogZWRnZS55LFxuICAgICAgeTogLWVkZ2UueFxuICAgIH0pO1xuICAgIG5vcm1hbHMucHVzaChvdXQpO1xuICB9XG5cbiAgLy8gQnVpbGQgb2Zmc2V0IGVkZ2VzXG4gIHZhciBvZmZzZXRFZGdlcyA9IG5vcm1hbHMubWFwKGZ1bmN0aW9uIChucm0sIGkpIHtcbiAgICB2YXIgcDEgPSBhZGQocHRzW2ldLCBzY2FsZShucm0sIGQpKTtcbiAgICB2YXIgcDIgPSBhZGQocHRzWyhpICsgMSkgJSBuXSwgc2NhbGUobnJtLCBkKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHAxOiBwMSxcbiAgICAgIHAyOiBwMlxuICAgIH07XG4gIH0pO1xuXG4gIC8vIEludGVyc2VjdCBjb25zZWN1dGl2ZSBvZmZzZXQgZWRnZXNcbiAgdmFyIGluZmxhdGVkID0gW107XG4gIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IG47IF9pMisrKSB7XG4gICAgdmFyIHByZXZFZGdlID0gb2Zmc2V0RWRnZXNbKF9pMiAtIDEgKyBuKSAlIG5dO1xuICAgIHZhciBjdXJyRWRnZSA9IG9mZnNldEVkZ2VzW19pMl07XG4gICAgdmFyIGlwID0gaW50ZXJzZWN0TGluZXMocHJldkVkZ2UucDEsIHByZXZFZGdlLnAyLCBjdXJyRWRnZS5wMSwgY3VyckVkZ2UucDIpO1xuICAgIGluZmxhdGVkLnB1c2goaXApO1xuICB9XG4gIHJldHVybiBpbmZsYXRlZDtcbn1cbmZ1bmN0aW9uIG1pdGVyQm94KHB0cywgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgc3Ryb2tlV2lkdGgpIHtcbiAgdmFyIHRwdHMgPSB0cmFuc2Zvcm1Qb2ludHMocHRzLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0KTtcbiAgdmFyIG9mZnNldFBvaW50cyA9IGluZmxhdGVQb2x5Z29uKHRwdHMsIHN0cm9rZVdpZHRoKTtcbiAgdmFyIGJiID0gbWFrZUJvdW5kaW5nQm94KCk7XG4gIG9mZnNldFBvaW50cy5mb3JFYWNoKGZ1bmN0aW9uIChwdCkge1xuICAgIHJldHVybiBleHBhbmRCb3VuZGluZ0JveEJ5UG9pbnQoYmIsIHB0LngsIHB0LnkpO1xuICB9KTtcbiAgcmV0dXJuIGJiO1xufVxudmFyIHJvdW5kUmVjdGFuZ2xlSW50ZXJzZWN0TGluZSA9IGZ1bmN0aW9uIHJvdW5kUmVjdGFuZ2xlSW50ZXJzZWN0TGluZSh4LCB5LCBub2RlWCwgbm9kZVksIHdpZHRoLCBoZWlnaHQsIHBhZGRpbmcpIHtcbiAgdmFyIHJhZGl1cyA9IGFyZ3VtZW50cy5sZW5ndGggPiA3ICYmIGFyZ3VtZW50c1s3XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzddIDogJ2F1dG8nO1xuICB2YXIgY29ybmVyUmFkaXVzID0gcmFkaXVzID09PSAnYXV0bycgPyBnZXRSb3VuZFJlY3RhbmdsZVJhZGl1cyh3aWR0aCwgaGVpZ2h0KSA6IHJhZGl1cztcbiAgdmFyIGhhbGZXaWR0aCA9IHdpZHRoIC8gMjtcbiAgdmFyIGhhbGZIZWlnaHQgPSBoZWlnaHQgLyAyO1xuICBjb3JuZXJSYWRpdXMgPSBNYXRoLm1pbihjb3JuZXJSYWRpdXMsIGhhbGZXaWR0aCwgaGFsZkhlaWdodCk7XG4gIHZhciBkb1dpZHRoID0gY29ybmVyUmFkaXVzICE9PSBoYWxmV2lkdGgsXG4gICAgZG9IZWlnaHQgPSBjb3JuZXJSYWRpdXMgIT09IGhhbGZIZWlnaHQ7XG5cbiAgLy8gQ2hlY2sgaW50ZXJzZWN0aW9ucyB3aXRoIHN0cmFpZ2h0IGxpbmUgc2VnbWVudHNcbiAgdmFyIHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnM7XG5cbiAgLy8gVG9wIHNlZ21lbnQsIGxlZnQgdG8gcmlnaHRcbiAgaWYgKGRvV2lkdGgpIHtcbiAgICB2YXIgdG9wU3RhcnRYID0gbm9kZVggLSBoYWxmV2lkdGggKyBjb3JuZXJSYWRpdXMgLSBwYWRkaW5nO1xuICAgIHZhciB0b3BTdGFydFkgPSBub2RlWSAtIGhhbGZIZWlnaHQgLSBwYWRkaW5nO1xuICAgIHZhciB0b3BFbmRYID0gbm9kZVggKyBoYWxmV2lkdGggLSBjb3JuZXJSYWRpdXMgKyBwYWRkaW5nO1xuICAgIHZhciB0b3BFbmRZID0gdG9wU3RhcnRZO1xuICAgIHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMgPSBmaW5pdGVMaW5lc0ludGVyc2VjdCh4LCB5LCBub2RlWCwgbm9kZVksIHRvcFN0YXJ0WCwgdG9wU3RhcnRZLCB0b3BFbmRYLCB0b3BFbmRZLCBmYWxzZSk7XG4gICAgaWYgKHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnM7XG4gICAgfVxuICB9XG5cbiAgLy8gUmlnaHQgc2VnbWVudCwgdG9wIHRvIGJvdHRvbVxuICBpZiAoZG9IZWlnaHQpIHtcbiAgICB2YXIgcmlnaHRTdGFydFggPSBub2RlWCArIGhhbGZXaWR0aCArIHBhZGRpbmc7XG4gICAgdmFyIHJpZ2h0U3RhcnRZID0gbm9kZVkgLSBoYWxmSGVpZ2h0ICsgY29ybmVyUmFkaXVzIC0gcGFkZGluZztcbiAgICB2YXIgcmlnaHRFbmRYID0gcmlnaHRTdGFydFg7XG4gICAgdmFyIHJpZ2h0RW5kWSA9IG5vZGVZICsgaGFsZkhlaWdodCAtIGNvcm5lclJhZGl1cyArIHBhZGRpbmc7XG4gICAgc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucyA9IGZpbml0ZUxpbmVzSW50ZXJzZWN0KHgsIHksIG5vZGVYLCBub2RlWSwgcmlnaHRTdGFydFgsIHJpZ2h0U3RhcnRZLCByaWdodEVuZFgsIHJpZ2h0RW5kWSwgZmFsc2UpO1xuICAgIGlmIChzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zO1xuICAgIH1cbiAgfVxuXG4gIC8vIEJvdHRvbSBzZWdtZW50LCBsZWZ0IHRvIHJpZ2h0XG4gIGlmIChkb1dpZHRoKSB7XG4gICAgdmFyIGJvdHRvbVN0YXJ0WCA9IG5vZGVYIC0gaGFsZldpZHRoICsgY29ybmVyUmFkaXVzIC0gcGFkZGluZztcbiAgICB2YXIgYm90dG9tU3RhcnRZID0gbm9kZVkgKyBoYWxmSGVpZ2h0ICsgcGFkZGluZztcbiAgICB2YXIgYm90dG9tRW5kWCA9IG5vZGVYICsgaGFsZldpZHRoIC0gY29ybmVyUmFkaXVzICsgcGFkZGluZztcbiAgICB2YXIgYm90dG9tRW5kWSA9IGJvdHRvbVN0YXJ0WTtcbiAgICBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zID0gZmluaXRlTGluZXNJbnRlcnNlY3QoeCwgeSwgbm9kZVgsIG5vZGVZLCBib3R0b21TdGFydFgsIGJvdHRvbVN0YXJ0WSwgYm90dG9tRW5kWCwgYm90dG9tRW5kWSwgZmFsc2UpO1xuICAgIGlmIChzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zO1xuICAgIH1cbiAgfVxuXG4gIC8vIExlZnQgc2VnbWVudCwgdG9wIHRvIGJvdHRvbVxuICBpZiAoZG9IZWlnaHQpIHtcbiAgICB2YXIgbGVmdFN0YXJ0WCA9IG5vZGVYIC0gaGFsZldpZHRoIC0gcGFkZGluZztcbiAgICB2YXIgbGVmdFN0YXJ0WSA9IG5vZGVZIC0gaGFsZkhlaWdodCArIGNvcm5lclJhZGl1cyAtIHBhZGRpbmc7XG4gICAgdmFyIGxlZnRFbmRYID0gbGVmdFN0YXJ0WDtcbiAgICB2YXIgbGVmdEVuZFkgPSBub2RlWSArIGhhbGZIZWlnaHQgLSBjb3JuZXJSYWRpdXMgKyBwYWRkaW5nO1xuICAgIHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMgPSBmaW5pdGVMaW5lc0ludGVyc2VjdCh4LCB5LCBub2RlWCwgbm9kZVksIGxlZnRTdGFydFgsIGxlZnRTdGFydFksIGxlZnRFbmRYLCBsZWZ0RW5kWSwgZmFsc2UpO1xuICAgIGlmIChzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zO1xuICAgIH1cbiAgfVxuXG4gIC8vIENoZWNrIGludGVyc2VjdGlvbnMgd2l0aCBhcmMgc2VnbWVudHNcbiAgdmFyIGFyY0ludGVyc2VjdGlvbnM7XG5cbiAgLy8gVG9wIExlZnRcbiAge1xuICAgIHZhciB0b3BMZWZ0Q2VudGVyWCA9IG5vZGVYIC0gaGFsZldpZHRoICsgY29ybmVyUmFkaXVzO1xuICAgIHZhciB0b3BMZWZ0Q2VudGVyWSA9IG5vZGVZIC0gaGFsZkhlaWdodCArIGNvcm5lclJhZGl1cztcbiAgICBhcmNJbnRlcnNlY3Rpb25zID0gaW50ZXJzZWN0TGluZUNpcmNsZSh4LCB5LCBub2RlWCwgbm9kZVksIHRvcExlZnRDZW50ZXJYLCB0b3BMZWZ0Q2VudGVyWSwgY29ybmVyUmFkaXVzICsgcGFkZGluZyk7XG5cbiAgICAvLyBFbnN1cmUgdGhlIGludGVyc2VjdGlvbiBpcyBvbiB0aGUgZGVzaXJlZCBxdWFydGVyIG9mIHRoZSBjaXJjbGVcbiAgICBpZiAoYXJjSW50ZXJzZWN0aW9ucy5sZW5ndGggPiAwICYmIGFyY0ludGVyc2VjdGlvbnNbMF0gPD0gdG9wTGVmdENlbnRlclggJiYgYXJjSW50ZXJzZWN0aW9uc1sxXSA8PSB0b3BMZWZ0Q2VudGVyWSkge1xuICAgICAgcmV0dXJuIFthcmNJbnRlcnNlY3Rpb25zWzBdLCBhcmNJbnRlcnNlY3Rpb25zWzFdXTtcbiAgICB9XG4gIH1cblxuICAvLyBUb3AgUmlnaHRcbiAge1xuICAgIHZhciB0b3BSaWdodENlbnRlclggPSBub2RlWCArIGhhbGZXaWR0aCAtIGNvcm5lclJhZGl1cztcbiAgICB2YXIgdG9wUmlnaHRDZW50ZXJZID0gbm9kZVkgLSBoYWxmSGVpZ2h0ICsgY29ybmVyUmFkaXVzO1xuICAgIGFyY0ludGVyc2VjdGlvbnMgPSBpbnRlcnNlY3RMaW5lQ2lyY2xlKHgsIHksIG5vZGVYLCBub2RlWSwgdG9wUmlnaHRDZW50ZXJYLCB0b3BSaWdodENlbnRlclksIGNvcm5lclJhZGl1cyArIHBhZGRpbmcpO1xuXG4gICAgLy8gRW5zdXJlIHRoZSBpbnRlcnNlY3Rpb24gaXMgb24gdGhlIGRlc2lyZWQgcXVhcnRlciBvZiB0aGUgY2lyY2xlXG4gICAgaWYgKGFyY0ludGVyc2VjdGlvbnMubGVuZ3RoID4gMCAmJiBhcmNJbnRlcnNlY3Rpb25zWzBdID49IHRvcFJpZ2h0Q2VudGVyWCAmJiBhcmNJbnRlcnNlY3Rpb25zWzFdIDw9IHRvcFJpZ2h0Q2VudGVyWSkge1xuICAgICAgcmV0dXJuIFthcmNJbnRlcnNlY3Rpb25zWzBdLCBhcmNJbnRlcnNlY3Rpb25zWzFdXTtcbiAgICB9XG4gIH1cblxuICAvLyBCb3R0b20gUmlnaHRcbiAge1xuICAgIHZhciBib3R0b21SaWdodENlbnRlclggPSBub2RlWCArIGhhbGZXaWR0aCAtIGNvcm5lclJhZGl1cztcbiAgICB2YXIgYm90dG9tUmlnaHRDZW50ZXJZID0gbm9kZVkgKyBoYWxmSGVpZ2h0IC0gY29ybmVyUmFkaXVzO1xuICAgIGFyY0ludGVyc2VjdGlvbnMgPSBpbnRlcnNlY3RMaW5lQ2lyY2xlKHgsIHksIG5vZGVYLCBub2RlWSwgYm90dG9tUmlnaHRDZW50ZXJYLCBib3R0b21SaWdodENlbnRlclksIGNvcm5lclJhZGl1cyArIHBhZGRpbmcpO1xuXG4gICAgLy8gRW5zdXJlIHRoZSBpbnRlcnNlY3Rpb24gaXMgb24gdGhlIGRlc2lyZWQgcXVhcnRlciBvZiB0aGUgY2lyY2xlXG4gICAgaWYgKGFyY0ludGVyc2VjdGlvbnMubGVuZ3RoID4gMCAmJiBhcmNJbnRlcnNlY3Rpb25zWzBdID49IGJvdHRvbVJpZ2h0Q2VudGVyWCAmJiBhcmNJbnRlcnNlY3Rpb25zWzFdID49IGJvdHRvbVJpZ2h0Q2VudGVyWSkge1xuICAgICAgcmV0dXJuIFthcmNJbnRlcnNlY3Rpb25zWzBdLCBhcmNJbnRlcnNlY3Rpb25zWzFdXTtcbiAgICB9XG4gIH1cblxuICAvLyBCb3R0b20gTGVmdFxuICB7XG4gICAgdmFyIGJvdHRvbUxlZnRDZW50ZXJYID0gbm9kZVggLSBoYWxmV2lkdGggKyBjb3JuZXJSYWRpdXM7XG4gICAgdmFyIGJvdHRvbUxlZnRDZW50ZXJZID0gbm9kZVkgKyBoYWxmSGVpZ2h0IC0gY29ybmVyUmFkaXVzO1xuICAgIGFyY0ludGVyc2VjdGlvbnMgPSBpbnRlcnNlY3RMaW5lQ2lyY2xlKHgsIHksIG5vZGVYLCBub2RlWSwgYm90dG9tTGVmdENlbnRlclgsIGJvdHRvbUxlZnRDZW50ZXJZLCBjb3JuZXJSYWRpdXMgKyBwYWRkaW5nKTtcblxuICAgIC8vIEVuc3VyZSB0aGUgaW50ZXJzZWN0aW9uIGlzIG9uIHRoZSBkZXNpcmVkIHF1YXJ0ZXIgb2YgdGhlIGNpcmNsZVxuICAgIGlmIChhcmNJbnRlcnNlY3Rpb25zLmxlbmd0aCA+IDAgJiYgYXJjSW50ZXJzZWN0aW9uc1swXSA8PSBib3R0b21MZWZ0Q2VudGVyWCAmJiBhcmNJbnRlcnNlY3Rpb25zWzFdID49IGJvdHRvbUxlZnRDZW50ZXJZKSB7XG4gICAgICByZXR1cm4gW2FyY0ludGVyc2VjdGlvbnNbMF0sIGFyY0ludGVyc2VjdGlvbnNbMV1dO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW107IC8vIGlmIG5vdGhpbmdcbn07XG52YXIgaW5MaW5lVmljaW5pdHkgPSBmdW5jdGlvbiBpbkxpbmVWaWNpbml0eSh4LCB5LCBseDEsIGx5MSwgbHgyLCBseTIsIHRvbGVyYW5jZSkge1xuICB2YXIgdCA9IHRvbGVyYW5jZTtcbiAgdmFyIHgxID0gTWF0aC5taW4obHgxLCBseDIpO1xuICB2YXIgeDIgPSBNYXRoLm1heChseDEsIGx4Mik7XG4gIHZhciB5MSA9IE1hdGgubWluKGx5MSwgbHkyKTtcbiAgdmFyIHkyID0gTWF0aC5tYXgobHkxLCBseTIpO1xuICByZXR1cm4geDEgLSB0IDw9IHggJiYgeCA8PSB4MiArIHQgJiYgeTEgLSB0IDw9IHkgJiYgeSA8PSB5MiArIHQ7XG59O1xudmFyIGluQmV6aWVyVmljaW5pdHkgPSBmdW5jdGlvbiBpbkJlemllclZpY2luaXR5KHgsIHksIHgxLCB5MSwgeDIsIHkyLCB4MywgeTMsIHRvbGVyYW5jZSkge1xuICB2YXIgYmIgPSB7XG4gICAgeDE6IE1hdGgubWluKHgxLCB4MywgeDIpIC0gdG9sZXJhbmNlLFxuICAgIHgyOiBNYXRoLm1heCh4MSwgeDMsIHgyKSArIHRvbGVyYW5jZSxcbiAgICB5MTogTWF0aC5taW4oeTEsIHkzLCB5MikgLSB0b2xlcmFuY2UsXG4gICAgeTI6IE1hdGgubWF4KHkxLCB5MywgeTIpICsgdG9sZXJhbmNlXG4gIH07XG5cbiAgLy8gaWYgb3V0c2lkZSB0aGUgcm91Z2ggYm91bmRpbmcgYm94IGZvciB0aGUgYmV6aWVyLCB0aGVuIGl0IGNhbid0IGJlIGEgaGl0XG4gIGlmICh4IDwgYmIueDEgfHwgeCA+IGJiLngyIHx8IHkgPCBiYi55MSB8fCB5ID4gYmIueTIpIHtcbiAgICAvLyBjb25zb2xlLmxvZygnYmV6aWVyIG91dCBvZiByb3VnaCBiYicpXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGVsc2Uge1xuICAgIC8vIGNvbnNvbGUubG9nKCdkbyBtb3JlIGV4cGVuc2l2ZSBjaGVjaycpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59O1xudmFyIHNvbHZlUXVhZHJhdGljID0gZnVuY3Rpb24gc29sdmVRdWFkcmF0aWMoYSwgYiwgYywgdmFsKSB7XG4gIGMgLT0gdmFsO1xuICB2YXIgciA9IGIgKiBiIC0gNCAqIGEgKiBjO1xuICBpZiAociA8IDApIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgdmFyIHNxcnRSID0gTWF0aC5zcXJ0KHIpO1xuICB2YXIgZGVub20gPSAyICogYTtcbiAgdmFyIHJvb3QxID0gKC1iICsgc3FydFIpIC8gZGVub207XG4gIHZhciByb290MiA9ICgtYiAtIHNxcnRSKSAvIGRlbm9tO1xuICByZXR1cm4gW3Jvb3QxLCByb290Ml07XG59O1xudmFyIHNvbHZlQ3ViaWMgPSBmdW5jdGlvbiBzb2x2ZUN1YmljKGEsIGIsIGMsIGQsIHJlc3VsdCkge1xuICAvLyBTb2x2ZXMgYSBjdWJpYyBmdW5jdGlvbiwgcmV0dXJucyByb290IGluIGZvcm0gW3IxLCBpMSwgcjIsIGkyLCByMywgaTNdLCB3aGVyZVxuICAvLyByIGlzIHRoZSByZWFsIGNvbXBvbmVudCwgaSBpcyB0aGUgaW1hZ2luYXJ5IGNvbXBvbmVudFxuXG4gIC8vIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBDYXJkYW5vIG1ldGhvZCBmcm9tIHRoZSB5ZWFyIDE1NDVcbiAgLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DdWJpY19mdW5jdGlvbiNUaGVfbmF0dXJlX29mX3RoZV9yb290c1xuXG4gIHZhciBlcHNpbG9uID0gMC4wMDAwMTtcblxuICAvLyBhdm9pZCBkaXZpc2lvbiBieSB6ZXJvIHdoaWxlIGtlZXBpbmcgdGhlIG92ZXJhbGwgZXhwcmVzc2lvbiBjbG9zZSBpbiB2YWx1ZVxuICBpZiAoYSA9PT0gMCkge1xuICAgIGEgPSBlcHNpbG9uO1xuICB9XG4gIGIgLz0gYTtcbiAgYyAvPSBhO1xuICBkIC89IGE7XG4gIHZhciBkaXNjcmltaW5hbnQsIHEsIHIsIGR1bTEsIHMsIHQsIHRlcm0xLCByMTM7XG4gIHEgPSAoMy4wICogYyAtIGIgKiBiKSAvIDkuMDtcbiAgciA9IC0oMjcuMCAqIGQpICsgYiAqICg5LjAgKiBjIC0gMi4wICogKGIgKiBiKSk7XG4gIHIgLz0gNTQuMDtcbiAgZGlzY3JpbWluYW50ID0gcSAqIHEgKiBxICsgciAqIHI7XG4gIHJlc3VsdFsxXSA9IDA7XG4gIHRlcm0xID0gYiAvIDMuMDtcbiAgaWYgKGRpc2NyaW1pbmFudCA+IDApIHtcbiAgICBzID0gciArIE1hdGguc3FydChkaXNjcmltaW5hbnQpO1xuICAgIHMgPSBzIDwgMCA/IC1NYXRoLnBvdygtcywgMS4wIC8gMy4wKSA6IE1hdGgucG93KHMsIDEuMCAvIDMuMCk7XG4gICAgdCA9IHIgLSBNYXRoLnNxcnQoZGlzY3JpbWluYW50KTtcbiAgICB0ID0gdCA8IDAgPyAtTWF0aC5wb3coLXQsIDEuMCAvIDMuMCkgOiBNYXRoLnBvdyh0LCAxLjAgLyAzLjApO1xuICAgIHJlc3VsdFswXSA9IC10ZXJtMSArIHMgKyB0O1xuICAgIHRlcm0xICs9IChzICsgdCkgLyAyLjA7XG4gICAgcmVzdWx0WzRdID0gcmVzdWx0WzJdID0gLXRlcm0xO1xuICAgIHRlcm0xID0gTWF0aC5zcXJ0KDMuMCkgKiAoLXQgKyBzKSAvIDI7XG4gICAgcmVzdWx0WzNdID0gdGVybTE7XG4gICAgcmVzdWx0WzVdID0gLXRlcm0xO1xuICAgIHJldHVybjtcbiAgfVxuICByZXN1bHRbNV0gPSByZXN1bHRbM10gPSAwO1xuICBpZiAoZGlzY3JpbWluYW50ID09PSAwKSB7XG4gICAgcjEzID0gciA8IDAgPyAtTWF0aC5wb3coLXIsIDEuMCAvIDMuMCkgOiBNYXRoLnBvdyhyLCAxLjAgLyAzLjApO1xuICAgIHJlc3VsdFswXSA9IC10ZXJtMSArIDIuMCAqIHIxMztcbiAgICByZXN1bHRbNF0gPSByZXN1bHRbMl0gPSAtKHIxMyArIHRlcm0xKTtcbiAgICByZXR1cm47XG4gIH1cbiAgcSA9IC1xO1xuICBkdW0xID0gcSAqIHEgKiBxO1xuICBkdW0xID0gTWF0aC5hY29zKHIgLyBNYXRoLnNxcnQoZHVtMSkpO1xuICByMTMgPSAyLjAgKiBNYXRoLnNxcnQocSk7XG4gIHJlc3VsdFswXSA9IC10ZXJtMSArIHIxMyAqIE1hdGguY29zKGR1bTEgLyAzLjApO1xuICByZXN1bHRbMl0gPSAtdGVybTEgKyByMTMgKiBNYXRoLmNvcygoZHVtMSArIDIuMCAqIE1hdGguUEkpIC8gMy4wKTtcbiAgcmVzdWx0WzRdID0gLXRlcm0xICsgcjEzICogTWF0aC5jb3MoKGR1bTEgKyA0LjAgKiBNYXRoLlBJKSAvIDMuMCk7XG4gIHJldHVybjtcbn07XG52YXIgc3FkaXN0VG9RdWFkcmF0aWNCZXppZXIgPSBmdW5jdGlvbiBzcWRpc3RUb1F1YWRyYXRpY0Jlemllcih4LCB5LCB4MSwgeTEsIHgyLCB5MiwgeDMsIHkzKSB7XG4gIC8vIEZpbmQgbWluaW11bSBkaXN0YW5jZSBieSB1c2luZyB0aGUgbWluaW11bSBvZiB0aGUgZGlzdGFuY2VcbiAgLy8gZnVuY3Rpb24gYmV0d2VlbiB0aGUgZ2l2ZW4gcG9pbnQgYW5kIHRoZSBjdXJ2ZVxuXG4gIC8vIFRoaXMgZ2l2ZXMgdGhlIGNvZWZmaWNpZW50cyBvZiB0aGUgcmVzdWx0aW5nIGN1YmljIGVxdWF0aW9uXG4gIC8vIHdob3NlIHJvb3RzIHRlbGwgdXMgd2hlcmUgYSBwb3NzaWJsZSBtaW5pbXVtIGlzXG4gIC8vIChDb2VmZmljaWVudHMgYXJlIGRpdmlkZWQgYnkgNClcblxuICB2YXIgYSA9IDEuMCAqIHgxICogeDEgLSA0ICogeDEgKiB4MiArIDIgKiB4MSAqIHgzICsgNCAqIHgyICogeDIgLSA0ICogeDIgKiB4MyArIHgzICogeDMgKyB5MSAqIHkxIC0gNCAqIHkxICogeTIgKyAyICogeTEgKiB5MyArIDQgKiB5MiAqIHkyIC0gNCAqIHkyICogeTMgKyB5MyAqIHkzO1xuICB2YXIgYiA9IDEuMCAqIDkgKiB4MSAqIHgyIC0gMyAqIHgxICogeDEgLSAzICogeDEgKiB4MyAtIDYgKiB4MiAqIHgyICsgMyAqIHgyICogeDMgKyA5ICogeTEgKiB5MiAtIDMgKiB5MSAqIHkxIC0gMyAqIHkxICogeTMgLSA2ICogeTIgKiB5MiArIDMgKiB5MiAqIHkzO1xuICB2YXIgYyA9IDEuMCAqIDMgKiB4MSAqIHgxIC0gNiAqIHgxICogeDIgKyB4MSAqIHgzIC0geDEgKiB4ICsgMiAqIHgyICogeDIgKyAyICogeDIgKiB4IC0geDMgKiB4ICsgMyAqIHkxICogeTEgLSA2ICogeTEgKiB5MiArIHkxICogeTMgLSB5MSAqIHkgKyAyICogeTIgKiB5MiArIDIgKiB5MiAqIHkgLSB5MyAqIHk7XG4gIHZhciBkID0gMS4wICogeDEgKiB4MiAtIHgxICogeDEgKyB4MSAqIHggLSB4MiAqIHggKyB5MSAqIHkyIC0geTEgKiB5MSArIHkxICogeSAtIHkyICogeTtcblxuICAvLyBkZWJ1ZyhcImNvZWZmaWNpZW50czogXCIgKyBhIC8gYSArIFwiLCBcIiArIGIgLyBhICsgXCIsIFwiICsgYyAvIGEgKyBcIiwgXCIgKyBkIC8gYSk7XG5cbiAgdmFyIHJvb3RzID0gW107XG5cbiAgLy8gVXNlIHRoZSBjdWJpYyBzb2x2aW5nIGFsZ29yaXRobVxuICBzb2x2ZUN1YmljKGEsIGIsIGMsIGQsIHJvb3RzKTtcbiAgdmFyIHplcm9UaHJlc2hvbGQgPSAwLjAwMDAwMDE7XG4gIHZhciBwYXJhbXMgPSBbXTtcbiAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IDY7IGluZGV4ICs9IDIpIHtcbiAgICBpZiAoTWF0aC5hYnMocm9vdHNbaW5kZXggKyAxXSkgPCB6ZXJvVGhyZXNob2xkICYmIHJvb3RzW2luZGV4XSA+PSAwICYmIHJvb3RzW2luZGV4XSA8PSAxLjApIHtcbiAgICAgIHBhcmFtcy5wdXNoKHJvb3RzW2luZGV4XSk7XG4gICAgfVxuICB9XG4gIHBhcmFtcy5wdXNoKDEuMCk7XG4gIHBhcmFtcy5wdXNoKDAuMCk7XG4gIHZhciBtaW5EaXN0YW5jZVNxdWFyZWQgPSAtMTtcbiAgdmFyIGN1clgsIGN1clksIGRpc3RTcXVhcmVkO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykge1xuICAgIGN1clggPSBNYXRoLnBvdygxLjAgLSBwYXJhbXNbaV0sIDIuMCkgKiB4MSArIDIuMCAqICgxIC0gcGFyYW1zW2ldKSAqIHBhcmFtc1tpXSAqIHgyICsgcGFyYW1zW2ldICogcGFyYW1zW2ldICogeDM7XG4gICAgY3VyWSA9IE1hdGgucG93KDEgLSBwYXJhbXNbaV0sIDIuMCkgKiB5MSArIDIgKiAoMS4wIC0gcGFyYW1zW2ldKSAqIHBhcmFtc1tpXSAqIHkyICsgcGFyYW1zW2ldICogcGFyYW1zW2ldICogeTM7XG4gICAgZGlzdFNxdWFyZWQgPSBNYXRoLnBvdyhjdXJYIC0geCwgMikgKyBNYXRoLnBvdyhjdXJZIC0geSwgMik7XG4gICAgLy8gZGVidWcoJ2Rpc3RhbmNlIGZvciBwYXJhbSAnICsgcGFyYW1zW2ldICsgXCI6IFwiICsgTWF0aC5zcXJ0KGRpc3RTcXVhcmVkKSk7XG4gICAgaWYgKG1pbkRpc3RhbmNlU3F1YXJlZCA+PSAwKSB7XG4gICAgICBpZiAoZGlzdFNxdWFyZWQgPCBtaW5EaXN0YW5jZVNxdWFyZWQpIHtcbiAgICAgICAgbWluRGlzdGFuY2VTcXVhcmVkID0gZGlzdFNxdWFyZWQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG1pbkRpc3RhbmNlU3F1YXJlZCA9IGRpc3RTcXVhcmVkO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbWluRGlzdGFuY2VTcXVhcmVkO1xufTtcbnZhciBzcWRpc3RUb0Zpbml0ZUxpbmUgPSBmdW5jdGlvbiBzcWRpc3RUb0Zpbml0ZUxpbmUoeCwgeSwgeDEsIHkxLCB4MiwgeTIpIHtcbiAgdmFyIG9mZnNldCA9IFt4IC0geDEsIHkgLSB5MV07XG4gIHZhciBsaW5lID0gW3gyIC0geDEsIHkyIC0geTFdO1xuICB2YXIgbGluZVNxID0gbGluZVswXSAqIGxpbmVbMF0gKyBsaW5lWzFdICogbGluZVsxXTtcbiAgdmFyIGh5cFNxID0gb2Zmc2V0WzBdICogb2Zmc2V0WzBdICsgb2Zmc2V0WzFdICogb2Zmc2V0WzFdO1xuICB2YXIgZG90UHJvZHVjdCA9IG9mZnNldFswXSAqIGxpbmVbMF0gKyBvZmZzZXRbMV0gKiBsaW5lWzFdO1xuICB2YXIgYWRqU3EgPSBkb3RQcm9kdWN0ICogZG90UHJvZHVjdCAvIGxpbmVTcTtcbiAgaWYgKGRvdFByb2R1Y3QgPCAwKSB7XG4gICAgcmV0dXJuIGh5cFNxO1xuICB9XG4gIGlmIChhZGpTcSA+IGxpbmVTcSkge1xuICAgIHJldHVybiAoeCAtIHgyKSAqICh4IC0geDIpICsgKHkgLSB5MikgKiAoeSAtIHkyKTtcbiAgfVxuICByZXR1cm4gaHlwU3EgLSBhZGpTcTtcbn07XG52YXIgcG9pbnRJbnNpZGVQb2x5Z29uUG9pbnRzID0gZnVuY3Rpb24gcG9pbnRJbnNpZGVQb2x5Z29uUG9pbnRzKHgsIHksIHBvaW50cykge1xuICB2YXIgeDEsIHkxLCB4MiwgeTI7XG4gIHZhciB5MztcblxuICAvLyBJbnRlcnNlY3Qgd2l0aCB2ZXJ0aWNhbCBsaW5lIHRocm91Z2ggKHgsIHkpXG4gIHZhciB1cCA9IDA7XG4gIC8vIGxldCBkb3duID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoIC8gMjsgaSsrKSB7XG4gICAgeDEgPSBwb2ludHNbaSAqIDJdO1xuICAgIHkxID0gcG9pbnRzW2kgKiAyICsgMV07XG4gICAgaWYgKGkgKyAxIDwgcG9pbnRzLmxlbmd0aCAvIDIpIHtcbiAgICAgIHgyID0gcG9pbnRzWyhpICsgMSkgKiAyXTtcbiAgICAgIHkyID0gcG9pbnRzWyhpICsgMSkgKiAyICsgMV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHgyID0gcG9pbnRzWyhpICsgMSAtIHBvaW50cy5sZW5ndGggLyAyKSAqIDJdO1xuICAgICAgeTIgPSBwb2ludHNbKGkgKyAxIC0gcG9pbnRzLmxlbmd0aCAvIDIpICogMiArIDFdO1xuICAgIH1cbiAgICBpZiAoeDEgPT0geCAmJiB4MiA9PSB4KSA7IGVsc2UgaWYgKHgxID49IHggJiYgeCA+PSB4MiB8fCB4MSA8PSB4ICYmIHggPD0geDIpIHtcbiAgICAgIHkzID0gKHggLSB4MSkgLyAoeDIgLSB4MSkgKiAoeTIgLSB5MSkgKyB5MTtcbiAgICAgIGlmICh5MyA+IHkpIHtcbiAgICAgICAgdXArKztcbiAgICAgIH1cblxuICAgICAgLy8gaWYoIHkzIDwgeSApe1xuICAgICAgLy8gZG93bisrO1xuICAgICAgLy8gfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gIH1cbiAgaWYgKHVwICUgMiA9PT0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcbnZhciBwb2ludEluc2lkZVBvbHlnb24gPSBmdW5jdGlvbiBwb2ludEluc2lkZVBvbHlnb24oeCwgeSwgYmFzZVBvaW50cywgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgZGlyZWN0aW9uLCBwYWRkaW5nKSB7XG4gIHZhciB0cmFuc2Zvcm1lZFBvaW50cyA9IG5ldyBBcnJheShiYXNlUG9pbnRzLmxlbmd0aCk7XG5cbiAgLy8gR2l2ZXMgbmVnYXRpdmUgYW5nbGVcbiAgdmFyIGFuZ2xlO1xuICBpZiAoZGlyZWN0aW9uWzBdICE9IG51bGwpIHtcbiAgICBhbmdsZSA9IE1hdGguYXRhbihkaXJlY3Rpb25bMV0gLyBkaXJlY3Rpb25bMF0pO1xuICAgIGlmIChkaXJlY3Rpb25bMF0gPCAwKSB7XG4gICAgICBhbmdsZSA9IGFuZ2xlICsgTWF0aC5QSSAvIDI7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFuZ2xlID0gLWFuZ2xlIC0gTWF0aC5QSSAvIDI7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGFuZ2xlID0gZGlyZWN0aW9uO1xuICB9XG4gIHZhciBjb3MgPSBNYXRoLmNvcygtYW5nbGUpO1xuICB2YXIgc2luID0gTWF0aC5zaW4oLWFuZ2xlKTtcblxuICAvLyAgICBjb25zb2xlLmxvZyhcImJhc2U6IFwiICsgYmFzZVBvaW50cyk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdHJhbnNmb3JtZWRQb2ludHMubGVuZ3RoIC8gMjsgaSsrKSB7XG4gICAgdHJhbnNmb3JtZWRQb2ludHNbaSAqIDJdID0gd2lkdGggLyAyICogKGJhc2VQb2ludHNbaSAqIDJdICogY29zIC0gYmFzZVBvaW50c1tpICogMiArIDFdICogc2luKTtcbiAgICB0cmFuc2Zvcm1lZFBvaW50c1tpICogMiArIDFdID0gaGVpZ2h0IC8gMiAqIChiYXNlUG9pbnRzW2kgKiAyICsgMV0gKiBjb3MgKyBiYXNlUG9pbnRzW2kgKiAyXSAqIHNpbik7XG4gICAgdHJhbnNmb3JtZWRQb2ludHNbaSAqIDJdICs9IGNlbnRlclg7XG4gICAgdHJhbnNmb3JtZWRQb2ludHNbaSAqIDIgKyAxXSArPSBjZW50ZXJZO1xuICB9XG4gIHZhciBwb2ludHM7XG4gIGlmIChwYWRkaW5nID4gMCkge1xuICAgIHZhciBleHBhbmRlZExpbmVTZXQgPSBleHBhbmRQb2x5Z29uKHRyYW5zZm9ybWVkUG9pbnRzLCAtcGFkZGluZyk7XG4gICAgcG9pbnRzID0gam9pbkxpbmVzKGV4cGFuZGVkTGluZVNldCk7XG4gIH0gZWxzZSB7XG4gICAgcG9pbnRzID0gdHJhbnNmb3JtZWRQb2ludHM7XG4gIH1cbiAgcmV0dXJuIHBvaW50SW5zaWRlUG9seWdvblBvaW50cyh4LCB5LCBwb2ludHMpO1xufTtcbnZhciBwb2ludEluc2lkZVJvdW5kUG9seWdvbiA9IGZ1bmN0aW9uIHBvaW50SW5zaWRlUm91bmRQb2x5Z29uKHgsIHksIGJhc2VQb2ludHMsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIGNvcm5lcnMpIHtcbiAgdmFyIGN1dFBvbHlnb25Qb2ludHMgPSBuZXcgQXJyYXkoYmFzZVBvaW50cy5sZW5ndGggKiAyKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3JuZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGNvcm5lciA9IGNvcm5lcnNbaV07XG4gICAgY3V0UG9seWdvblBvaW50c1tpICogNCArIDBdID0gY29ybmVyLnN0YXJ0WDtcbiAgICBjdXRQb2x5Z29uUG9pbnRzW2kgKiA0ICsgMV0gPSBjb3JuZXIuc3RhcnRZO1xuICAgIGN1dFBvbHlnb25Qb2ludHNbaSAqIDQgKyAyXSA9IGNvcm5lci5zdG9wWDtcbiAgICBjdXRQb2x5Z29uUG9pbnRzW2kgKiA0ICsgM10gPSBjb3JuZXIuc3RvcFk7XG4gICAgdmFyIHNxdWFyZWREaXN0YW5jZSA9IE1hdGgucG93KGNvcm5lci5jeCAtIHgsIDIpICsgTWF0aC5wb3coY29ybmVyLmN5IC0geSwgMik7XG4gICAgaWYgKHNxdWFyZWREaXN0YW5jZSA8PSBNYXRoLnBvdyhjb3JuZXIucmFkaXVzLCAyKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBwb2ludEluc2lkZVBvbHlnb25Qb2ludHMoeCwgeSwgY3V0UG9seWdvblBvaW50cyk7XG59O1xudmFyIGpvaW5MaW5lcyA9IGZ1bmN0aW9uIGpvaW5MaW5lcyhsaW5lU2V0KSB7XG4gIHZhciB2ZXJ0aWNlcyA9IG5ldyBBcnJheShsaW5lU2V0Lmxlbmd0aCAvIDIpO1xuICB2YXIgY3VycmVudExpbmVTdGFydFgsIGN1cnJlbnRMaW5lU3RhcnRZLCBjdXJyZW50TGluZUVuZFgsIGN1cnJlbnRMaW5lRW5kWTtcbiAgdmFyIG5leHRMaW5lU3RhcnRYLCBuZXh0TGluZVN0YXJ0WSwgbmV4dExpbmVFbmRYLCBuZXh0TGluZUVuZFk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZVNldC5sZW5ndGggLyA0OyBpKyspIHtcbiAgICBjdXJyZW50TGluZVN0YXJ0WCA9IGxpbmVTZXRbaSAqIDRdO1xuICAgIGN1cnJlbnRMaW5lU3RhcnRZID0gbGluZVNldFtpICogNCArIDFdO1xuICAgIGN1cnJlbnRMaW5lRW5kWCA9IGxpbmVTZXRbaSAqIDQgKyAyXTtcbiAgICBjdXJyZW50TGluZUVuZFkgPSBsaW5lU2V0W2kgKiA0ICsgM107XG4gICAgaWYgKGkgPCBsaW5lU2V0Lmxlbmd0aCAvIDQgLSAxKSB7XG4gICAgICBuZXh0TGluZVN0YXJ0WCA9IGxpbmVTZXRbKGkgKyAxKSAqIDRdO1xuICAgICAgbmV4dExpbmVTdGFydFkgPSBsaW5lU2V0WyhpICsgMSkgKiA0ICsgMV07XG4gICAgICBuZXh0TGluZUVuZFggPSBsaW5lU2V0WyhpICsgMSkgKiA0ICsgMl07XG4gICAgICBuZXh0TGluZUVuZFkgPSBsaW5lU2V0WyhpICsgMSkgKiA0ICsgM107XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHRMaW5lU3RhcnRYID0gbGluZVNldFswXTtcbiAgICAgIG5leHRMaW5lU3RhcnRZID0gbGluZVNldFsxXTtcbiAgICAgIG5leHRMaW5lRW5kWCA9IGxpbmVTZXRbMl07XG4gICAgICBuZXh0TGluZUVuZFkgPSBsaW5lU2V0WzNdO1xuICAgIH1cbiAgICB2YXIgaW50ZXJzZWN0aW9uID0gZmluaXRlTGluZXNJbnRlcnNlY3QoY3VycmVudExpbmVTdGFydFgsIGN1cnJlbnRMaW5lU3RhcnRZLCBjdXJyZW50TGluZUVuZFgsIGN1cnJlbnRMaW5lRW5kWSwgbmV4dExpbmVTdGFydFgsIG5leHRMaW5lU3RhcnRZLCBuZXh0TGluZUVuZFgsIG5leHRMaW5lRW5kWSwgdHJ1ZSk7XG4gICAgdmVydGljZXNbaSAqIDJdID0gaW50ZXJzZWN0aW9uWzBdO1xuICAgIHZlcnRpY2VzW2kgKiAyICsgMV0gPSBpbnRlcnNlY3Rpb25bMV07XG4gIH1cbiAgcmV0dXJuIHZlcnRpY2VzO1xufTtcbnZhciBleHBhbmRQb2x5Z29uID0gZnVuY3Rpb24gZXhwYW5kUG9seWdvbihwb2ludHMsIHBhZCkge1xuICB2YXIgZXhwYW5kZWRMaW5lU2V0ID0gbmV3IEFycmF5KHBvaW50cy5sZW5ndGggKiAyKTtcbiAgdmFyIGN1cnJlbnRQb2ludFgsIGN1cnJlbnRQb2ludFksIG5leHRQb2ludFgsIG5leHRQb2ludFk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aCAvIDI7IGkrKykge1xuICAgIGN1cnJlbnRQb2ludFggPSBwb2ludHNbaSAqIDJdO1xuICAgIGN1cnJlbnRQb2ludFkgPSBwb2ludHNbaSAqIDIgKyAxXTtcbiAgICBpZiAoaSA8IHBvaW50cy5sZW5ndGggLyAyIC0gMSkge1xuICAgICAgbmV4dFBvaW50WCA9IHBvaW50c1soaSArIDEpICogMl07XG4gICAgICBuZXh0UG9pbnRZID0gcG9pbnRzWyhpICsgMSkgKiAyICsgMV07XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHRQb2ludFggPSBwb2ludHNbMF07XG4gICAgICBuZXh0UG9pbnRZID0gcG9pbnRzWzFdO1xuICAgIH1cblxuICAgIC8vIEN1cnJlbnQgbGluZTogW2N1cnJlbnRQb2ludFgsIGN1cnJlbnRQb2ludFldIHRvIFtuZXh0UG9pbnRYLCBuZXh0UG9pbnRZXVxuXG4gICAgLy8gQXNzdW1lIENDVyBwb2x5Z29uIHdpbmRpbmdcblxuICAgIHZhciBvZmZzZXRYID0gbmV4dFBvaW50WSAtIGN1cnJlbnRQb2ludFk7XG4gICAgdmFyIG9mZnNldFkgPSAtKG5leHRQb2ludFggLSBjdXJyZW50UG9pbnRYKTtcblxuICAgIC8vIE5vcm1hbGl6ZVxuICAgIHZhciBvZmZzZXRMZW5ndGggPSBNYXRoLnNxcnQob2Zmc2V0WCAqIG9mZnNldFggKyBvZmZzZXRZICogb2Zmc2V0WSk7XG4gICAgdmFyIG5vcm1hbGl6ZWRPZmZzZXRYID0gb2Zmc2V0WCAvIG9mZnNldExlbmd0aDtcbiAgICB2YXIgbm9ybWFsaXplZE9mZnNldFkgPSBvZmZzZXRZIC8gb2Zmc2V0TGVuZ3RoO1xuICAgIGV4cGFuZGVkTGluZVNldFtpICogNF0gPSBjdXJyZW50UG9pbnRYICsgbm9ybWFsaXplZE9mZnNldFggKiBwYWQ7XG4gICAgZXhwYW5kZWRMaW5lU2V0W2kgKiA0ICsgMV0gPSBjdXJyZW50UG9pbnRZICsgbm9ybWFsaXplZE9mZnNldFkgKiBwYWQ7XG4gICAgZXhwYW5kZWRMaW5lU2V0W2kgKiA0ICsgMl0gPSBuZXh0UG9pbnRYICsgbm9ybWFsaXplZE9mZnNldFggKiBwYWQ7XG4gICAgZXhwYW5kZWRMaW5lU2V0W2kgKiA0ICsgM10gPSBuZXh0UG9pbnRZICsgbm9ybWFsaXplZE9mZnNldFkgKiBwYWQ7XG4gIH1cbiAgcmV0dXJuIGV4cGFuZGVkTGluZVNldDtcbn07XG52YXIgaW50ZXJzZWN0TGluZUVsbGlwc2UgPSBmdW5jdGlvbiBpbnRlcnNlY3RMaW5lRWxsaXBzZSh4LCB5LCBjZW50ZXJYLCBjZW50ZXJZLCBlbGxpcHNlV3JhZGl1cywgZWxsaXBzZUhyYWRpdXMpIHtcbiAgdmFyIGRpc3BYID0gY2VudGVyWCAtIHg7XG4gIHZhciBkaXNwWSA9IGNlbnRlclkgLSB5O1xuICBkaXNwWCAvPSBlbGxpcHNlV3JhZGl1cztcbiAgZGlzcFkgLz0gZWxsaXBzZUhyYWRpdXM7XG4gIHZhciBsZW4gPSBNYXRoLnNxcnQoZGlzcFggKiBkaXNwWCArIGRpc3BZICogZGlzcFkpO1xuICB2YXIgbmV3TGVuZ3RoID0gbGVuIC0gMTtcbiAgaWYgKG5ld0xlbmd0aCA8IDApIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgdmFyIGxlblByb3BvcnRpb24gPSBuZXdMZW5ndGggLyBsZW47XG4gIHJldHVybiBbKGNlbnRlclggLSB4KSAqIGxlblByb3BvcnRpb24gKyB4LCAoY2VudGVyWSAtIHkpICogbGVuUHJvcG9ydGlvbiArIHldO1xufTtcbnZhciBjaGVja0luRWxsaXBzZSA9IGZ1bmN0aW9uIGNoZWNrSW5FbGxpcHNlKHgsIHksIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclksIHBhZGRpbmcpIHtcbiAgeCAtPSBjZW50ZXJYO1xuICB5IC09IGNlbnRlclk7XG4gIHggLz0gd2lkdGggLyAyICsgcGFkZGluZztcbiAgeSAvPSBoZWlnaHQgLyAyICsgcGFkZGluZztcbiAgcmV0dXJuIHggKiB4ICsgeSAqIHkgPD0gMTtcbn07XG5cbi8vIFJldHVybnMgaW50ZXJzZWN0aW9ucyBvZiBpbmNyZWFzaW5nIGRpc3RhbmNlIGZyb20gbGluZSdzIHN0YXJ0IHBvaW50XG52YXIgaW50ZXJzZWN0TGluZUNpcmNsZSA9IGZ1bmN0aW9uIGludGVyc2VjdExpbmVDaXJjbGUoeDEsIHkxLCB4MiwgeTIsIGNlbnRlclgsIGNlbnRlclksIHJhZGl1cykge1xuICAvLyBDYWxjdWxhdGUgZCwgZGlyZWN0aW9uIHZlY3RvciBvZiBsaW5lXG4gIHZhciBkID0gW3gyIC0geDEsIHkyIC0geTFdOyAvLyBEaXJlY3Rpb24gdmVjdG9yIG9mIGxpbmVcbiAgdmFyIGYgPSBbeDEgLSBjZW50ZXJYLCB5MSAtIGNlbnRlclldO1xuICB2YXIgYSA9IGRbMF0gKiBkWzBdICsgZFsxXSAqIGRbMV07XG4gIHZhciBiID0gMiAqIChmWzBdICogZFswXSArIGZbMV0gKiBkWzFdKTtcbiAgdmFyIGMgPSBmWzBdICogZlswXSArIGZbMV0gKiBmWzFdIC0gcmFkaXVzICogcmFkaXVzO1xuICB2YXIgZGlzY3JpbWluYW50ID0gYiAqIGIgLSA0ICogYSAqIGM7XG4gIGlmIChkaXNjcmltaW5hbnQgPCAwKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHZhciB0MSA9ICgtYiArIE1hdGguc3FydChkaXNjcmltaW5hbnQpKSAvICgyICogYSk7XG4gIHZhciB0MiA9ICgtYiAtIE1hdGguc3FydChkaXNjcmltaW5hbnQpKSAvICgyICogYSk7XG4gIHZhciB0TWluID0gTWF0aC5taW4odDEsIHQyKTtcbiAgdmFyIHRNYXggPSBNYXRoLm1heCh0MSwgdDIpO1xuICB2YXIgaW5SYW5nZVBhcmFtcyA9IFtdO1xuICBpZiAodE1pbiA+PSAwICYmIHRNaW4gPD0gMSkge1xuICAgIGluUmFuZ2VQYXJhbXMucHVzaCh0TWluKTtcbiAgfVxuICBpZiAodE1heCA+PSAwICYmIHRNYXggPD0gMSkge1xuICAgIGluUmFuZ2VQYXJhbXMucHVzaCh0TWF4KTtcbiAgfVxuICBpZiAoaW5SYW5nZVBhcmFtcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgdmFyIG5lYXJJbnRlcnNlY3Rpb25YID0gaW5SYW5nZVBhcmFtc1swXSAqIGRbMF0gKyB4MTtcbiAgdmFyIG5lYXJJbnRlcnNlY3Rpb25ZID0gaW5SYW5nZVBhcmFtc1swXSAqIGRbMV0gKyB5MTtcbiAgaWYgKGluUmFuZ2VQYXJhbXMubGVuZ3RoID4gMSkge1xuICAgIGlmIChpblJhbmdlUGFyYW1zWzBdID09IGluUmFuZ2VQYXJhbXNbMV0pIHtcbiAgICAgIHJldHVybiBbbmVhckludGVyc2VjdGlvblgsIG5lYXJJbnRlcnNlY3Rpb25ZXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGZhckludGVyc2VjdGlvblggPSBpblJhbmdlUGFyYW1zWzFdICogZFswXSArIHgxO1xuICAgICAgdmFyIGZhckludGVyc2VjdGlvblkgPSBpblJhbmdlUGFyYW1zWzFdICogZFsxXSArIHkxO1xuICAgICAgcmV0dXJuIFtuZWFySW50ZXJzZWN0aW9uWCwgbmVhckludGVyc2VjdGlvblksIGZhckludGVyc2VjdGlvblgsIGZhckludGVyc2VjdGlvblldO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gW25lYXJJbnRlcnNlY3Rpb25YLCBuZWFySW50ZXJzZWN0aW9uWV07XG4gIH1cbn07XG52YXIgbWlkT2ZUaHJlZSA9IGZ1bmN0aW9uIG1pZE9mVGhyZWUoYSwgYiwgYykge1xuICBpZiAoYiA8PSBhICYmIGEgPD0gYyB8fCBjIDw9IGEgJiYgYSA8PSBiKSB7XG4gICAgcmV0dXJuIGE7XG4gIH0gZWxzZSBpZiAoYSA8PSBiICYmIGIgPD0gYyB8fCBjIDw9IGIgJiYgYiA8PSBhKSB7XG4gICAgcmV0dXJuIGI7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGM7XG4gIH1cbn07XG5cbi8vICh4MSx5MSk9Pih4Mix5MikgaW50ZXJzZWN0IHdpdGggKHgzLHkzKT0+KHg0LHk0KVxudmFyIGZpbml0ZUxpbmVzSW50ZXJzZWN0ID0gZnVuY3Rpb24gZmluaXRlTGluZXNJbnRlcnNlY3QoeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgeDQsIHk0LCBpbmZpbml0ZUxpbmVzKSB7XG4gIHZhciBkeDEzID0geDEgLSB4MztcbiAgdmFyIGR4MjEgPSB4MiAtIHgxO1xuICB2YXIgZHg0MyA9IHg0IC0geDM7XG4gIHZhciBkeTEzID0geTEgLSB5MztcbiAgdmFyIGR5MjEgPSB5MiAtIHkxO1xuICB2YXIgZHk0MyA9IHk0IC0geTM7XG4gIHZhciB1YV90ID0gZHg0MyAqIGR5MTMgLSBkeTQzICogZHgxMztcbiAgdmFyIHViX3QgPSBkeDIxICogZHkxMyAtIGR5MjEgKiBkeDEzO1xuICB2YXIgdV9iID0gZHk0MyAqIGR4MjEgLSBkeDQzICogZHkyMTtcbiAgaWYgKHVfYiAhPT0gMCkge1xuICAgIHZhciB1YSA9IHVhX3QgLyB1X2I7XG4gICAgdmFyIHViID0gdWJfdCAvIHVfYjtcbiAgICB2YXIgZmxwdFRocmVzaG9sZCA9IDAuMDAxO1xuICAgIHZhciBfbWluID0gMCAtIGZscHRUaHJlc2hvbGQ7XG4gICAgdmFyIF9tYXggPSAxICsgZmxwdFRocmVzaG9sZDtcbiAgICBpZiAoX21pbiA8PSB1YSAmJiB1YSA8PSBfbWF4ICYmIF9taW4gPD0gdWIgJiYgdWIgPD0gX21heCkge1xuICAgICAgcmV0dXJuIFt4MSArIHVhICogZHgyMSwgeTEgKyB1YSAqIGR5MjFdO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWluZmluaXRlTGluZXMpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFt4MSArIHVhICogZHgyMSwgeTEgKyB1YSAqIGR5MjFdO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAodWFfdCA9PT0gMCB8fCB1Yl90ID09PSAwKSB7XG4gICAgICAvLyBQYXJhbGxlbCwgY29pbmNpZGVudCBsaW5lcy4gQ2hlY2sgaWYgb3ZlcmxhcFxuXG4gICAgICAvLyBDaGVjayBlbmRwb2ludCBvZiBzZWNvbmQgbGluZVxuICAgICAgaWYgKG1pZE9mVGhyZWUoeDEsIHgyLCB4NCkgPT09IHg0KSB7XG4gICAgICAgIHJldHVybiBbeDQsIHk0XTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgc3RhcnQgcG9pbnQgb2Ygc2Vjb25kIGxpbmVcbiAgICAgIGlmIChtaWRPZlRocmVlKHgxLCB4MiwgeDMpID09PSB4Mykge1xuICAgICAgICByZXR1cm4gW3gzLCB5M107XG4gICAgICB9XG5cbiAgICAgIC8vIEVuZHBvaW50IG9mIGZpcnN0IGxpbmVcbiAgICAgIGlmIChtaWRPZlRocmVlKHgzLCB4NCwgeDIpID09PSB4Mikge1xuICAgICAgICByZXR1cm4gW3gyLCB5Ml07XG4gICAgICB9XG4gICAgICByZXR1cm4gW107XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFBhcmFsbGVsLCBub24tY29pbmNpZGVudFxuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxufTtcbnZhciB0cmFuc2Zvcm1Qb2ludHMgPSBmdW5jdGlvbiB0cmFuc2Zvcm1Qb2ludHMocG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0KSB7XG4gIHZhciByZXQgPSBbXTtcbiAgdmFyIGhhbGZXID0gd2lkdGggLyAyO1xuICB2YXIgaGFsZkggPSBoZWlnaHQgLyAyO1xuICB2YXIgeCA9IGNlbnRlclg7XG4gIHZhciB5ID0gY2VudGVyWTtcbiAgcmV0LnB1c2goe1xuICAgIHg6IHggKyBoYWxmVyAqIHBvaW50c1swXSxcbiAgICB5OiB5ICsgaGFsZkggKiBwb2ludHNbMV1cbiAgfSk7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgcG9pbnRzLmxlbmd0aCAvIDI7IGkrKykge1xuICAgIHJldC5wdXNoKHtcbiAgICAgIHg6IHggKyBoYWxmVyAqIHBvaW50c1tpICogMl0sXG4gICAgICB5OiB5ICsgaGFsZkggKiBwb2ludHNbaSAqIDIgKyAxXVxuICAgIH0pO1xuICB9XG4gIHJldHVybiByZXQ7XG59O1xuXG4vLyBtYXRoLnBvbHlnb25JbnRlcnNlY3RMaW5lKCB4LCB5LCBiYXNlUG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBwYWRkaW5nIClcbi8vIGludGVyc2VjdCBhIG5vZGUgcG9seWdvbiAocHRzIHRyYW5zZm9ybWVkKVxuLy9cbi8vIG1hdGgucG9seWdvbkludGVyc2VjdExpbmUoIHgsIHksIGJhc2VQb2ludHMsIGNlbnRlclgsIGNlbnRlclkgKVxuLy8gaW50ZXJzZWN0IHRoZSBwb2ludHMgKG5vIHRyYW5zZm9ybSlcbnZhciBwb2x5Z29uSW50ZXJzZWN0TGluZSA9IGZ1bmN0aW9uIHBvbHlnb25JbnRlcnNlY3RMaW5lKHgsIHksIGJhc2VQb2ludHMsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHBhZGRpbmcpIHtcbiAgdmFyIGludGVyc2VjdGlvbnMgPSBbXTtcbiAgdmFyIGludGVyc2VjdGlvbjtcbiAgdmFyIHRyYW5zZm9ybWVkUG9pbnRzID0gbmV3IEFycmF5KGJhc2VQb2ludHMubGVuZ3RoKTtcbiAgdmFyIGRvVHJhbnNmb3JtID0gdHJ1ZTtcbiAgaWYgKHdpZHRoID09IG51bGwpIHtcbiAgICBkb1RyYW5zZm9ybSA9IGZhbHNlO1xuICB9XG4gIHZhciBwb2ludHM7XG4gIGlmIChkb1RyYW5zZm9ybSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHJhbnNmb3JtZWRQb2ludHMubGVuZ3RoIC8gMjsgaSsrKSB7XG4gICAgICB0cmFuc2Zvcm1lZFBvaW50c1tpICogMl0gPSBiYXNlUG9pbnRzW2kgKiAyXSAqIHdpZHRoICsgY2VudGVyWDtcbiAgICAgIHRyYW5zZm9ybWVkUG9pbnRzW2kgKiAyICsgMV0gPSBiYXNlUG9pbnRzW2kgKiAyICsgMV0gKiBoZWlnaHQgKyBjZW50ZXJZO1xuICAgIH1cbiAgICBpZiAocGFkZGluZyA+IDApIHtcbiAgICAgIHZhciBleHBhbmRlZExpbmVTZXQgPSBleHBhbmRQb2x5Z29uKHRyYW5zZm9ybWVkUG9pbnRzLCAtcGFkZGluZyk7XG4gICAgICBwb2ludHMgPSBqb2luTGluZXMoZXhwYW5kZWRMaW5lU2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcG9pbnRzID0gdHJhbnNmb3JtZWRQb2ludHM7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHBvaW50cyA9IGJhc2VQb2ludHM7XG4gIH1cbiAgdmFyIGN1cnJlbnRYLCBjdXJyZW50WSwgbmV4dFgsIG5leHRZO1xuICBmb3IgKHZhciBfaTMgPSAwOyBfaTMgPCBwb2ludHMubGVuZ3RoIC8gMjsgX2kzKyspIHtcbiAgICBjdXJyZW50WCA9IHBvaW50c1tfaTMgKiAyXTtcbiAgICBjdXJyZW50WSA9IHBvaW50c1tfaTMgKiAyICsgMV07XG4gICAgaWYgKF9pMyA8IHBvaW50cy5sZW5ndGggLyAyIC0gMSkge1xuICAgICAgbmV4dFggPSBwb2ludHNbKF9pMyArIDEpICogMl07XG4gICAgICBuZXh0WSA9IHBvaW50c1soX2kzICsgMSkgKiAyICsgMV07XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHRYID0gcG9pbnRzWzBdO1xuICAgICAgbmV4dFkgPSBwb2ludHNbMV07XG4gICAgfVxuICAgIGludGVyc2VjdGlvbiA9IGZpbml0ZUxpbmVzSW50ZXJzZWN0KHgsIHksIGNlbnRlclgsIGNlbnRlclksIGN1cnJlbnRYLCBjdXJyZW50WSwgbmV4dFgsIG5leHRZKTtcbiAgICBpZiAoaW50ZXJzZWN0aW9uLmxlbmd0aCAhPT0gMCkge1xuICAgICAgaW50ZXJzZWN0aW9ucy5wdXNoKGludGVyc2VjdGlvblswXSwgaW50ZXJzZWN0aW9uWzFdKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGludGVyc2VjdGlvbnM7XG59O1xudmFyIHJvdW5kUG9seWdvbkludGVyc2VjdExpbmUgPSBmdW5jdGlvbiByb3VuZFBvbHlnb25JbnRlcnNlY3RMaW5lKHgsIHksIGJhc2VQb2ludHMsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHBhZGRpbmcsIGNvcm5lcnMpIHtcbiAgdmFyIGludGVyc2VjdGlvbnMgPSBbXTtcbiAgdmFyIGludGVyc2VjdGlvbjtcbiAgdmFyIGxpbmVzID0gbmV3IEFycmF5KGJhc2VQb2ludHMubGVuZ3RoICogMik7XG4gIGNvcm5lcnMuZm9yRWFjaChmdW5jdGlvbiAoY29ybmVyLCBpKSB7XG4gICAgaWYgKGkgPT09IDApIHtcbiAgICAgIGxpbmVzW2xpbmVzLmxlbmd0aCAtIDJdID0gY29ybmVyLnN0YXJ0WDtcbiAgICAgIGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdID0gY29ybmVyLnN0YXJ0WTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGluZXNbaSAqIDQgLSAyXSA9IGNvcm5lci5zdGFydFg7XG4gICAgICBsaW5lc1tpICogNCAtIDFdID0gY29ybmVyLnN0YXJ0WTtcbiAgICB9XG4gICAgbGluZXNbaSAqIDRdID0gY29ybmVyLnN0b3BYO1xuICAgIGxpbmVzW2kgKiA0ICsgMV0gPSBjb3JuZXIuc3RvcFk7XG4gICAgaW50ZXJzZWN0aW9uID0gaW50ZXJzZWN0TGluZUNpcmNsZSh4LCB5LCBjZW50ZXJYLCBjZW50ZXJZLCBjb3JuZXIuY3gsIGNvcm5lci5jeSwgY29ybmVyLnJhZGl1cyk7XG4gICAgaWYgKGludGVyc2VjdGlvbi5sZW5ndGggIT09IDApIHtcbiAgICAgIGludGVyc2VjdGlvbnMucHVzaChpbnRlcnNlY3Rpb25bMF0sIGludGVyc2VjdGlvblsxXSk7XG4gICAgfVxuICB9KTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGggLyA0OyBpKyspIHtcbiAgICBpbnRlcnNlY3Rpb24gPSBmaW5pdGVMaW5lc0ludGVyc2VjdCh4LCB5LCBjZW50ZXJYLCBjZW50ZXJZLCBsaW5lc1tpICogNF0sIGxpbmVzW2kgKiA0ICsgMV0sIGxpbmVzW2kgKiA0ICsgMl0sIGxpbmVzW2kgKiA0ICsgM10sIGZhbHNlKTtcbiAgICBpZiAoaW50ZXJzZWN0aW9uLmxlbmd0aCAhPT0gMCkge1xuICAgICAgaW50ZXJzZWN0aW9ucy5wdXNoKGludGVyc2VjdGlvblswXSwgaW50ZXJzZWN0aW9uWzFdKTtcbiAgICB9XG4gIH1cbiAgaWYgKGludGVyc2VjdGlvbnMubGVuZ3RoID4gMikge1xuICAgIHZhciBsb3dlc3RJbnRlcnNlY3Rpb24gPSBbaW50ZXJzZWN0aW9uc1swXSwgaW50ZXJzZWN0aW9uc1sxXV07XG4gICAgdmFyIGxvd2VzdFNxdWFyZWREaXN0YW5jZSA9IE1hdGgucG93KGxvd2VzdEludGVyc2VjdGlvblswXSAtIHgsIDIpICsgTWF0aC5wb3cobG93ZXN0SW50ZXJzZWN0aW9uWzFdIC0geSwgMik7XG4gICAgZm9yICh2YXIgX2k0ID0gMTsgX2k0IDwgaW50ZXJzZWN0aW9ucy5sZW5ndGggLyAyOyBfaTQrKykge1xuICAgICAgdmFyIHNxdWFyZWREaXN0YW5jZSA9IE1hdGgucG93KGludGVyc2VjdGlvbnNbX2k0ICogMl0gLSB4LCAyKSArIE1hdGgucG93KGludGVyc2VjdGlvbnNbX2k0ICogMiArIDFdIC0geSwgMik7XG4gICAgICBpZiAoc3F1YXJlZERpc3RhbmNlIDw9IGxvd2VzdFNxdWFyZWREaXN0YW5jZSkge1xuICAgICAgICBsb3dlc3RJbnRlcnNlY3Rpb25bMF0gPSBpbnRlcnNlY3Rpb25zW19pNCAqIDJdO1xuICAgICAgICBsb3dlc3RJbnRlcnNlY3Rpb25bMV0gPSBpbnRlcnNlY3Rpb25zW19pNCAqIDIgKyAxXTtcbiAgICAgICAgbG93ZXN0U3F1YXJlZERpc3RhbmNlID0gc3F1YXJlZERpc3RhbmNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbG93ZXN0SW50ZXJzZWN0aW9uO1xuICB9XG4gIHJldHVybiBpbnRlcnNlY3Rpb25zO1xufTtcbnZhciBzaG9ydGVuSW50ZXJzZWN0aW9uID0gZnVuY3Rpb24gc2hvcnRlbkludGVyc2VjdGlvbihpbnRlcnNlY3Rpb24sIG9mZnNldCwgYW1vdW50KSB7XG4gIHZhciBkaXNwID0gW2ludGVyc2VjdGlvblswXSAtIG9mZnNldFswXSwgaW50ZXJzZWN0aW9uWzFdIC0gb2Zmc2V0WzFdXTtcbiAgdmFyIGxlbmd0aCA9IE1hdGguc3FydChkaXNwWzBdICogZGlzcFswXSArIGRpc3BbMV0gKiBkaXNwWzFdKTtcbiAgdmFyIGxlblJhdGlvID0gKGxlbmd0aCAtIGFtb3VudCkgLyBsZW5ndGg7XG4gIGlmIChsZW5SYXRpbyA8IDApIHtcbiAgICBsZW5SYXRpbyA9IDAuMDAwMDE7XG4gIH1cbiAgcmV0dXJuIFtvZmZzZXRbMF0gKyBsZW5SYXRpbyAqIGRpc3BbMF0sIG9mZnNldFsxXSArIGxlblJhdGlvICogZGlzcFsxXV07XG59O1xudmFyIGdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSA9IGZ1bmN0aW9uIGdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZShzaWRlcywgcm90YXRpb25SYWRpYW5zKSB7XG4gIHZhciBwb2ludHMgPSBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzKHNpZGVzLCByb3RhdGlvblJhZGlhbnMpO1xuICBwb2ludHMgPSBmaXRQb2x5Z29uVG9TcXVhcmUocG9pbnRzKTtcbiAgcmV0dXJuIHBvaW50cztcbn07XG52YXIgZml0UG9seWdvblRvU3F1YXJlID0gZnVuY3Rpb24gZml0UG9seWdvblRvU3F1YXJlKHBvaW50cykge1xuICB2YXIgeCwgeTtcbiAgdmFyIHNpZGVzID0gcG9pbnRzLmxlbmd0aCAvIDI7XG4gIHZhciBtaW5YID0gSW5maW5pdHksXG4gICAgbWluWSA9IEluZmluaXR5LFxuICAgIG1heFggPSAtSW5maW5pdHksXG4gICAgbWF4WSA9IC1JbmZpbml0eTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaWRlczsgaSsrKSB7XG4gICAgeCA9IHBvaW50c1syICogaV07XG4gICAgeSA9IHBvaW50c1syICogaSArIDFdO1xuICAgIG1pblggPSBNYXRoLm1pbihtaW5YLCB4KTtcbiAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgeCk7XG4gICAgbWluWSA9IE1hdGgubWluKG1pblksIHkpO1xuICAgIG1heFkgPSBNYXRoLm1heChtYXhZLCB5KTtcbiAgfVxuXG4gIC8vIHN0cmV0Y2ggZmFjdG9yc1xuICB2YXIgc3ggPSAyIC8gKG1heFggLSBtaW5YKTtcbiAgdmFyIHN5ID0gMiAvIChtYXhZIC0gbWluWSk7XG4gIGZvciAodmFyIF9pNSA9IDA7IF9pNSA8IHNpZGVzOyBfaTUrKykge1xuICAgIHggPSBwb2ludHNbMiAqIF9pNV0gPSBwb2ludHNbMiAqIF9pNV0gKiBzeDtcbiAgICB5ID0gcG9pbnRzWzIgKiBfaTUgKyAxXSA9IHBvaW50c1syICogX2k1ICsgMV0gKiBzeTtcbiAgICBtaW5YID0gTWF0aC5taW4obWluWCwgeCk7XG4gICAgbWF4WCA9IE1hdGgubWF4KG1heFgsIHgpO1xuICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCB5KTtcbiAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgeSk7XG4gIH1cbiAgaWYgKG1pblkgPCAtMSkge1xuICAgIGZvciAodmFyIF9pNiA9IDA7IF9pNiA8IHNpZGVzOyBfaTYrKykge1xuICAgICAgeSA9IHBvaW50c1syICogX2k2ICsgMV0gPSBwb2ludHNbMiAqIF9pNiArIDFdICsgKC0xIC0gbWluWSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBwb2ludHM7XG59O1xudmFyIGdlbmVyYXRlVW5pdE5nb25Qb2ludHMgPSBmdW5jdGlvbiBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzKHNpZGVzLCByb3RhdGlvblJhZGlhbnMpIHtcbiAgdmFyIGluY3JlbWVudCA9IDEuMCAvIHNpZGVzICogMiAqIE1hdGguUEk7XG4gIHZhciBzdGFydEFuZ2xlID0gc2lkZXMgJSAyID09PSAwID8gTWF0aC5QSSAvIDIuMCArIGluY3JlbWVudCAvIDIuMCA6IE1hdGguUEkgLyAyLjA7XG4gIHN0YXJ0QW5nbGUgKz0gcm90YXRpb25SYWRpYW5zO1xuICB2YXIgcG9pbnRzID0gbmV3IEFycmF5KHNpZGVzICogMik7XG4gIHZhciBjdXJyZW50QW5nbGU7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc2lkZXM7IGkrKykge1xuICAgIGN1cnJlbnRBbmdsZSA9IGkgKiBpbmNyZW1lbnQgKyBzdGFydEFuZ2xlO1xuICAgIHBvaW50c1syICogaV0gPSBNYXRoLmNvcyhjdXJyZW50QW5nbGUpOyAvLyB4XG4gICAgcG9pbnRzWzIgKiBpICsgMV0gPSBNYXRoLnNpbigtY3VycmVudEFuZ2xlKTsgLy8geVxuICB9XG4gIHJldHVybiBwb2ludHM7XG59O1xuXG4vLyBTZXQgdGhlIGRlZmF1bHQgcmFkaXVzLCB1bmxlc3MgaGFsZiBvZiB3aWR0aCBvciBoZWlnaHQgaXMgc21hbGxlciB0aGFuIGRlZmF1bHRcbnZhciBnZXRSb3VuZFJlY3RhbmdsZVJhZGl1cyA9IGZ1bmN0aW9uIGdldFJvdW5kUmVjdGFuZ2xlUmFkaXVzKHdpZHRoLCBoZWlnaHQpIHtcbiAgcmV0dXJuIE1hdGgubWluKHdpZHRoIC8gNCwgaGVpZ2h0IC8gNCwgOCk7XG59O1xuXG4vLyBTZXQgdGhlIGRlZmF1bHQgcmFkaXVzXG52YXIgZ2V0Um91bmRQb2x5Z29uUmFkaXVzID0gZnVuY3Rpb24gZ2V0Um91bmRQb2x5Z29uUmFkaXVzKHdpZHRoLCBoZWlnaHQpIHtcbiAgcmV0dXJuIE1hdGgubWluKHdpZHRoIC8gMTAsIGhlaWdodCAvIDEwLCA4KTtcbn07XG52YXIgZ2V0Q3V0UmVjdGFuZ2xlQ29ybmVyTGVuZ3RoID0gZnVuY3Rpb24gZ2V0Q3V0UmVjdGFuZ2xlQ29ybmVyTGVuZ3RoKCkge1xuICByZXR1cm4gODtcbn07XG52YXIgYmV6aWVyUHRzVG9RdWFkQ29lZmYgPSBmdW5jdGlvbiBiZXppZXJQdHNUb1F1YWRDb2VmZihwMCwgcDEsIHAyKSB7XG4gIHJldHVybiBbcDAgLSAyICogcDEgKyBwMiwgMiAqIChwMSAtIHAwKSwgcDBdO1xufTtcblxuLy8gZ2V0IGN1cnZlIHdpZHRoLCBoZWlnaHQsIGFuZCBjb250cm9sIHBvaW50IHBvc2l0aW9uIG9mZnNldHMgYXMgYSBwZXJjZW50YWdlIG9mIG5vZGUgaGVpZ2h0IC8gd2lkdGhcbnZhciBnZXRCYXJyZWxDdXJ2ZUNvbnN0YW50cyA9IGZ1bmN0aW9uIGdldEJhcnJlbEN1cnZlQ29uc3RhbnRzKHdpZHRoLCBoZWlnaHQpIHtcbiAgcmV0dXJuIHtcbiAgICBoZWlnaHRPZmZzZXQ6IE1hdGgubWluKDE1LCAwLjA1ICogaGVpZ2h0KSxcbiAgICB3aWR0aE9mZnNldDogTWF0aC5taW4oMTAwLCAwLjI1ICogd2lkdGgpLFxuICAgIGN0cmxQdE9mZnNldFBjdDogMC4wNVxuICB9O1xufTtcblxuLy8gU2VwYXJhdGluZyBBeGlzIFRoZW9yZW0gKFNBVCkgdG8gZGV0ZXJtaW5lIGlmIHR3byBwb2x5Z29ucyBpbnRlcnNlY3QuIFxuLy8gVGhlIGZ1bmN0aW9uIHRha2VzIHR3byBwb2x5Z29ucyBhcyBpbnB1dCBhbmQgcmV0dXJucyBhIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyBcbi8vIHdoZXRoZXIgdGhlIHR3byBwb2x5Z29ucyBpbnRlcnNlY3QuXG5mdW5jdGlvbiBzYXRQb2x5Z29uSW50ZXJzZWN0aW9uKHBvbHkxLCBwb2x5Mikge1xuICBmdW5jdGlvbiBnZXRBeGVzKHBvbHlnb24pIHtcbiAgICB2YXIgYXhlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9seWdvbi5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHAxID0gcG9seWdvbltpXTtcbiAgICAgIHZhciBwMiA9IHBvbHlnb25bKGkgKyAxKSAlIHBvbHlnb24ubGVuZ3RoXTtcbiAgICAgIHZhciBlZGdlID0ge1xuICAgICAgICB4OiBwMi54IC0gcDEueCxcbiAgICAgICAgeTogcDIueSAtIHAxLnlcbiAgICAgIH07XG4gICAgICB2YXIgbm9ybWFsID0ge1xuICAgICAgICB4OiAtZWRnZS55LFxuICAgICAgICB5OiBlZGdlLnhcbiAgICAgIH07XG4gICAgICB2YXIgbGVuZ3RoID0gTWF0aC5zcXJ0KG5vcm1hbC54ICogbm9ybWFsLnggKyBub3JtYWwueSAqIG5vcm1hbC55KTtcbiAgICAgIGF4ZXMucHVzaCh7XG4gICAgICAgIHg6IG5vcm1hbC54IC8gbGVuZ3RoLFxuICAgICAgICB5OiBub3JtYWwueSAvIGxlbmd0aFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBheGVzO1xuICB9XG4gIGZ1bmN0aW9uIHByb2plY3QocG9seWdvbiwgYXhpcykge1xuICAgIHZhciBtaW4gPSBJbmZpbml0eTtcbiAgICB2YXIgbWF4ID0gLUluZmluaXR5O1xuICAgIHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihwb2x5Z29uKSxcbiAgICAgIF9zdGVwO1xuICAgIHRyeSB7XG4gICAgICBmb3IgKF9pdGVyYXRvci5zKCk7ICEoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lOykge1xuICAgICAgICB2YXIgcG9pbnQgPSBfc3RlcC52YWx1ZTtcbiAgICAgICAgdmFyIHByb2plY3Rpb24gPSBwb2ludC54ICogYXhpcy54ICsgcG9pbnQueSAqIGF4aXMueTtcbiAgICAgICAgbWluID0gTWF0aC5taW4obWluLCBwcm9qZWN0aW9uKTtcbiAgICAgICAgbWF4ID0gTWF0aC5tYXgobWF4LCBwcm9qZWN0aW9uKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIF9pdGVyYXRvci5lKGVycik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIF9pdGVyYXRvci5mKCk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBtaW46IG1pbixcbiAgICAgIG1heDogbWF4XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBvdmVybGFwcyhwcm9qMSwgcHJvajIpIHtcbiAgICByZXR1cm4gIShwcm9qMS5tYXggPCBwcm9qMi5taW4gfHwgcHJvajIubWF4IDwgcHJvajEubWluKTtcbiAgfVxuICB2YXIgYXhlcyA9IFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoZ2V0QXhlcyhwb2x5MSkpLCBfdG9Db25zdW1hYmxlQXJyYXkoZ2V0QXhlcyhwb2x5MikpKTtcbiAgdmFyIF9pdGVyYXRvcjIgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihheGVzKSxcbiAgICBfc3RlcDI7XG4gIHRyeSB7XG4gICAgZm9yIChfaXRlcmF0b3IyLnMoKTsgIShfc3RlcDIgPSBfaXRlcmF0b3IyLm4oKSkuZG9uZTspIHtcbiAgICAgIHZhciBheGlzID0gX3N0ZXAyLnZhbHVlO1xuICAgICAgdmFyIHByb2oxID0gcHJvamVjdChwb2x5MSwgYXhpcyk7XG4gICAgICB2YXIgcHJvajIgPSBwcm9qZWN0KHBvbHkyLCBheGlzKTtcbiAgICAgIGlmICghb3ZlcmxhcHMocHJvajEsIHByb2oyKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7IC8vIE5vIG92ZXJsYXAsIHNvIHRoZSBwb2x5Z29ucyBkbyBub3QgaW50ZXJzZWN0XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBfaXRlcmF0b3IyLmUoZXJyKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBfaXRlcmF0b3IyLmYoKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTsgLy8gcG9seWdvbnMgaW50ZXJzZWN0XG59XG5cbnZhciBwYWdlUmFua0RlZmF1bHRzID0gZGVmYXVsdHMkZyh7XG4gIGRhbXBpbmdGYWN0b3I6IDAuOCxcbiAgcHJlY2lzaW9uOiAwLjAwMDAwMSxcbiAgaXRlcmF0aW9uczogMjAwLFxuICB3ZWlnaHQ6IGZ1bmN0aW9uIHdlaWdodChlZGdlKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cbn0pO1xudmFyIGVsZXNmbiRvID0ge1xuICBwYWdlUmFuazogZnVuY3Rpb24gcGFnZVJhbmsob3B0aW9ucykge1xuICAgIHZhciBfcGFnZVJhbmtEZWZhdWx0cyA9IHBhZ2VSYW5rRGVmYXVsdHMob3B0aW9ucyksXG4gICAgICBkYW1waW5nRmFjdG9yID0gX3BhZ2VSYW5rRGVmYXVsdHMuZGFtcGluZ0ZhY3RvcixcbiAgICAgIHByZWNpc2lvbiA9IF9wYWdlUmFua0RlZmF1bHRzLnByZWNpc2lvbixcbiAgICAgIGl0ZXJhdGlvbnMgPSBfcGFnZVJhbmtEZWZhdWx0cy5pdGVyYXRpb25zLFxuICAgICAgd2VpZ2h0ID0gX3BhZ2VSYW5rRGVmYXVsdHMud2VpZ2h0O1xuICAgIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3k7XG4gICAgdmFyIF90aGlzJGJ5R3JvdXAgPSB0aGlzLmJ5R3JvdXAoKSxcbiAgICAgIG5vZGVzID0gX3RoaXMkYnlHcm91cC5ub2RlcyxcbiAgICAgIGVkZ2VzID0gX3RoaXMkYnlHcm91cC5lZGdlcztcbiAgICB2YXIgbnVtTm9kZXMgPSBub2Rlcy5sZW5ndGg7XG4gICAgdmFyIG51bU5vZGVzU3FkID0gbnVtTm9kZXMgKiBudW1Ob2RlcztcbiAgICB2YXIgbnVtRWRnZXMgPSBlZGdlcy5sZW5ndGg7XG5cbiAgICAvLyBDb25zdHJ1Y3QgdHJhbnNwb3NlZCBhZGphY2VuY3kgbWF0cml4XG4gICAgLy8gRmlyc3QgbGV0cyBoYXZlIGEgemVyb2VkIG1hdHJpeCBvZiB0aGUgcmlnaHQgc2l6ZVxuICAgIC8vIFdlJ2xsIGFsc28ga2VlcCB0cmFjayBvZiB0aGUgc3VtIG9mIGVhY2ggY29sdW1uXG4gICAgdmFyIG1hdHJpeCA9IG5ldyBBcnJheShudW1Ob2Rlc1NxZCk7XG4gICAgdmFyIGNvbHVtblN1bSA9IG5ldyBBcnJheShudW1Ob2Rlcyk7XG4gICAgdmFyIGFkZGl0aW9uYWxQcm9iID0gKDEgLSBkYW1waW5nRmFjdG9yKSAvIG51bU5vZGVzO1xuXG4gICAgLy8gQ3JlYXRlIG51bGwgbWF0cml4XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1Ob2RlczsgaSsrKSB7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG51bU5vZGVzOyBqKyspIHtcbiAgICAgICAgdmFyIG4gPSBpICogbnVtTm9kZXMgKyBqO1xuICAgICAgICBtYXRyaXhbbl0gPSAwO1xuICAgICAgfVxuICAgICAgY29sdW1uU3VtW2ldID0gMDtcbiAgICB9XG5cbiAgICAvLyBOb3csIHByb2Nlc3MgZWRnZXNcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbnVtRWRnZXM7IF9pKyspIHtcbiAgICAgIHZhciBlZGdlID0gZWRnZXNbX2ldO1xuICAgICAgdmFyIHNyY0lkID0gZWRnZS5kYXRhKCdzb3VyY2UnKTtcbiAgICAgIHZhciB0Z3RJZCA9IGVkZ2UuZGF0YSgndGFyZ2V0Jyk7XG5cbiAgICAgIC8vIERvbid0IGluY2x1ZGUgbG9vcHMgaW4gdGhlIG1hdHJpeFxuICAgICAgaWYgKHNyY0lkID09PSB0Z3RJZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBzID0gbm9kZXMuaW5kZXhPZklkKHNyY0lkKTtcbiAgICAgIHZhciB0ID0gbm9kZXMuaW5kZXhPZklkKHRndElkKTtcbiAgICAgIHZhciB3ID0gd2VpZ2h0KGVkZ2UpO1xuICAgICAgdmFyIF9uID0gdCAqIG51bU5vZGVzICsgcztcblxuICAgICAgLy8gVXBkYXRlIG1hdHJpeFxuICAgICAgbWF0cml4W19uXSArPSB3O1xuXG4gICAgICAvLyBVcGRhdGUgY29sdW1uIHN1bVxuICAgICAgY29sdW1uU3VtW3NdICs9IHc7XG4gICAgfVxuXG4gICAgLy8gQWRkIGFkZGl0aW9uYWwgcHJvYmFiaWxpdHkgYmFzZWQgb24gZGFtcGluZyBmYWN0b3JcbiAgICAvLyBBbHNvLCB0YWtlIGludG8gYWNjb3VudCBjb2x1bW5zIHRoYXQgaGF2ZSBzdW0gPSAwXG4gICAgdmFyIHAgPSAxLjAgLyBudW1Ob2RlcyArIGFkZGl0aW9uYWxQcm9iOyAvLyBTaG9ydGhhbmRcblxuICAgIC8vIFRyYXZlcnNlIG1hdHJpeCwgY29sdW1uIGJ5IGNvbHVtblxuICAgIGZvciAodmFyIF9qID0gMDsgX2ogPCBudW1Ob2RlczsgX2orKykge1xuICAgICAgaWYgKGNvbHVtblN1bVtfal0gPT09IDApIHtcbiAgICAgICAgLy8gTm8gJ2xpbmtzJyBvdXQgZnJvbSBub2RlIGp0aCwgYXNzdW1lIGVxdWFsIHByb2JhYmlsaXR5IGZvciBlYWNoIHBvc3NpYmxlIG5vZGVcbiAgICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgbnVtTm9kZXM7IF9pMisrKSB7XG4gICAgICAgICAgdmFyIF9uMiA9IF9pMiAqIG51bU5vZGVzICsgX2o7XG4gICAgICAgICAgbWF0cml4W19uMl0gPSBwO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBOb2RlIGp0aCBoYXMgb3V0Z29pbmcgbGluaywgY29tcHV0ZSBub3JtYWxpemVkIHByb2JhYmlsaXRpZXNcbiAgICAgICAgZm9yICh2YXIgX2kzID0gMDsgX2kzIDwgbnVtTm9kZXM7IF9pMysrKSB7XG4gICAgICAgICAgdmFyIF9uMyA9IF9pMyAqIG51bU5vZGVzICsgX2o7XG4gICAgICAgICAgbWF0cml4W19uM10gPSBtYXRyaXhbX24zXSAvIGNvbHVtblN1bVtfal0gKyBhZGRpdGlvbmFsUHJvYjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENvbXB1dGUgZG9taW5hbnQgZWlnZW52ZWN0b3IgdXNpbmcgcG93ZXIgbWV0aG9kXG4gICAgdmFyIGVpZ2VudmVjdG9yID0gbmV3IEFycmF5KG51bU5vZGVzKTtcbiAgICB2YXIgdGVtcCA9IG5ldyBBcnJheShudW1Ob2Rlcyk7XG4gICAgdmFyIHByZXZpb3VzO1xuXG4gICAgLy8gU3RhcnQgd2l0aCBhIHZlY3RvciBvZiBhbGwgMSdzXG4gICAgLy8gQWxzbywgaW5pdGlhbGl6ZSBhIG51bGwgdmVjdG9yIHdoaWNoIHdpbGwgYmUgdXNlZCBhcyBzaG9ydGhhbmRcbiAgICBmb3IgKHZhciBfaTQgPSAwOyBfaTQgPCBudW1Ob2RlczsgX2k0KyspIHtcbiAgICAgIGVpZ2VudmVjdG9yW19pNF0gPSAxO1xuICAgIH1cbiAgICBmb3IgKHZhciBpdGVyID0gMDsgaXRlciA8IGl0ZXJhdGlvbnM7IGl0ZXIrKykge1xuICAgICAgLy8gVGVtcCBhcnJheSB3aXRoIGFsbCAwJ3NcbiAgICAgIGZvciAodmFyIF9pNSA9IDA7IF9pNSA8IG51bU5vZGVzOyBfaTUrKykge1xuICAgICAgICB0ZW1wW19pNV0gPSAwO1xuICAgICAgfVxuXG4gICAgICAvLyBNdWx0aXBseSBtYXRyaXggd2l0aCBwcmV2aW91cyByZXN1bHRcbiAgICAgIGZvciAodmFyIF9pNiA9IDA7IF9pNiA8IG51bU5vZGVzOyBfaTYrKykge1xuICAgICAgICBmb3IgKHZhciBfajIgPSAwOyBfajIgPCBudW1Ob2RlczsgX2oyKyspIHtcbiAgICAgICAgICB2YXIgX240ID0gX2k2ICogbnVtTm9kZXMgKyBfajI7XG4gICAgICAgICAgdGVtcFtfaTZdICs9IG1hdHJpeFtfbjRdICogZWlnZW52ZWN0b3JbX2oyXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaW5QbGFjZVN1bU5vcm1hbGl6ZSh0ZW1wKTtcbiAgICAgIHByZXZpb3VzID0gZWlnZW52ZWN0b3I7XG4gICAgICBlaWdlbnZlY3RvciA9IHRlbXA7XG4gICAgICB0ZW1wID0gcHJldmlvdXM7XG4gICAgICB2YXIgZGlmZiA9IDA7XG4gICAgICAvLyBDb21wdXRlIGRpZmZlcmVuY2UgKHNxdWFyZWQgbW9kdWxlKSBvZiBib3RoIHZlY3RvcnNcbiAgICAgIGZvciAodmFyIF9pNyA9IDA7IF9pNyA8IG51bU5vZGVzOyBfaTcrKykge1xuICAgICAgICB2YXIgZGVsdGEgPSBwcmV2aW91c1tfaTddIC0gZWlnZW52ZWN0b3JbX2k3XTtcbiAgICAgICAgZGlmZiArPSBkZWx0YSAqIGRlbHRhO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiBkaWZmZXJlbmNlIGlzIGxlc3MgdGhhbiB0aGUgZGVzaXJlZCB0aHJlc2hvbGQsIHN0b3AgaXRlcmF0aW5nXG4gICAgICBpZiAoZGlmZiA8IHByZWNpc2lvbikge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDb25zdHJ1Y3QgcmVzdWx0XG4gICAgdmFyIHJlcyA9IHtcbiAgICAgIHJhbms6IGZ1bmN0aW9uIHJhbmsobm9kZSkge1xuICAgICAgICBub2RlID0gY3kuY29sbGVjdGlvbihub2RlKVswXTtcbiAgICAgICAgcmV0dXJuIGVpZ2VudmVjdG9yW25vZGVzLmluZGV4T2Yobm9kZSldO1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIHJlcztcbiAgfSAvLyBwYWdlUmFua1xufTsgLy8gZWxlc2ZuXG5cbnZhciBkZWZhdWx0cyRmID0gZGVmYXVsdHMkZyh7XG4gIHJvb3Q6IG51bGwsXG4gIHdlaWdodDogZnVuY3Rpb24gd2VpZ2h0KGVkZ2UpIHtcbiAgICByZXR1cm4gMTtcbiAgfSxcbiAgZGlyZWN0ZWQ6IGZhbHNlLFxuICBhbHBoYTogMFxufSk7XG52YXIgZWxlc2ZuJG4gPSB7XG4gIGRlZ3JlZUNlbnRyYWxpdHlOb3JtYWxpemVkOiBmdW5jdGlvbiBkZWdyZWVDZW50cmFsaXR5Tm9ybWFsaXplZChvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IGRlZmF1bHRzJGYob3B0aW9ucyk7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgIHZhciBub2RlcyA9IHRoaXMubm9kZXMoKTtcbiAgICB2YXIgbnVtTm9kZXMgPSBub2Rlcy5sZW5ndGg7XG4gICAgaWYgKCFvcHRpb25zLmRpcmVjdGVkKSB7XG4gICAgICB2YXIgZGVncmVlcyA9IHt9O1xuICAgICAgdmFyIG1heERlZ3JlZSA9IDA7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bU5vZGVzOyBpKyspIHtcbiAgICAgICAgdmFyIG5vZGUgPSBub2Rlc1tpXTtcblxuICAgICAgICAvLyBhZGQgY3VycmVudCBub2RlIHRvIHRoZSBjdXJyZW50IG9wdGlvbnMgb2JqZWN0IGFuZCBjYWxsIGRlZ3JlZUNlbnRyYWxpdHlcbiAgICAgICAgb3B0aW9ucy5yb290ID0gbm9kZTtcbiAgICAgICAgdmFyIGN1cnJEZWdyZWUgPSB0aGlzLmRlZ3JlZUNlbnRyYWxpdHkob3B0aW9ucyk7XG4gICAgICAgIGlmIChtYXhEZWdyZWUgPCBjdXJyRGVncmVlLmRlZ3JlZSkge1xuICAgICAgICAgIG1heERlZ3JlZSA9IGN1cnJEZWdyZWUuZGVncmVlO1xuICAgICAgICB9XG4gICAgICAgIGRlZ3JlZXNbbm9kZS5pZCgpXSA9IGN1cnJEZWdyZWUuZGVncmVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGVncmVlOiBmdW5jdGlvbiBkZWdyZWUobm9kZSkge1xuICAgICAgICAgIGlmIChtYXhEZWdyZWUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc3RyaW5nKG5vZGUpKSB7XG4gICAgICAgICAgICAvLyBmcm9tIGlzIGEgc2VsZWN0b3Igc3RyaW5nXG4gICAgICAgICAgICBub2RlID0gY3kuZmlsdGVyKG5vZGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZGVncmVlc1tub2RlLmlkKCldIC8gbWF4RGVncmVlO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgaW5kZWdyZWVzID0ge307XG4gICAgICB2YXIgb3V0ZGVncmVlcyA9IHt9O1xuICAgICAgdmFyIG1heEluZGVncmVlID0gMDtcbiAgICAgIHZhciBtYXhPdXRkZWdyZWUgPSAwO1xuICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IG51bU5vZGVzOyBfaSsrKSB7XG4gICAgICAgIHZhciBfbm9kZSA9IG5vZGVzW19pXTtcbiAgICAgICAgdmFyIGlkID0gX25vZGUuaWQoKTtcblxuICAgICAgICAvLyBhZGQgY3VycmVudCBub2RlIHRvIHRoZSBjdXJyZW50IG9wdGlvbnMgb2JqZWN0IGFuZCBjYWxsIGRlZ3JlZUNlbnRyYWxpdHlcbiAgICAgICAgb3B0aW9ucy5yb290ID0gX25vZGU7XG4gICAgICAgIHZhciBfY3VyckRlZ3JlZSA9IHRoaXMuZGVncmVlQ2VudHJhbGl0eShvcHRpb25zKTtcbiAgICAgICAgaWYgKG1heEluZGVncmVlIDwgX2N1cnJEZWdyZWUuaW5kZWdyZWUpIG1heEluZGVncmVlID0gX2N1cnJEZWdyZWUuaW5kZWdyZWU7XG4gICAgICAgIGlmIChtYXhPdXRkZWdyZWUgPCBfY3VyckRlZ3JlZS5vdXRkZWdyZWUpIG1heE91dGRlZ3JlZSA9IF9jdXJyRGVncmVlLm91dGRlZ3JlZTtcbiAgICAgICAgaW5kZWdyZWVzW2lkXSA9IF9jdXJyRGVncmVlLmluZGVncmVlO1xuICAgICAgICBvdXRkZWdyZWVzW2lkXSA9IF9jdXJyRGVncmVlLm91dGRlZ3JlZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGluZGVncmVlOiBmdW5jdGlvbiBpbmRlZ3JlZShub2RlKSB7XG4gICAgICAgICAgaWYgKG1heEluZGVncmVlID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc3RyaW5nKG5vZGUpKSB7XG4gICAgICAgICAgICAvLyBmcm9tIGlzIGEgc2VsZWN0b3Igc3RyaW5nXG4gICAgICAgICAgICBub2RlID0gY3kuZmlsdGVyKG5vZGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gaW5kZWdyZWVzW25vZGUuaWQoKV0gLyBtYXhJbmRlZ3JlZTtcbiAgICAgICAgfSxcbiAgICAgICAgb3V0ZGVncmVlOiBmdW5jdGlvbiBvdXRkZWdyZWUobm9kZSkge1xuICAgICAgICAgIGlmIChtYXhPdXRkZWdyZWUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc3RyaW5nKG5vZGUpKSB7XG4gICAgICAgICAgICAvLyBmcm9tIGlzIGEgc2VsZWN0b3Igc3RyaW5nXG4gICAgICAgICAgICBub2RlID0gY3kuZmlsdGVyKG5vZGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gb3V0ZGVncmVlc1tub2RlLmlkKCldIC8gbWF4T3V0ZGVncmVlO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgfSxcbiAgLy8gZGVncmVlQ2VudHJhbGl0eU5vcm1hbGl6ZWRcblxuICAvLyBJbXBsZW1lbnRlZCBmcm9tIHRoZSBhbGdvcml0aG0gaW4gT3BzYWhsJ3MgcGFwZXJcbiAgLy8gXCJOb2RlIGNlbnRyYWxpdHkgaW4gd2VpZ2h0ZWQgbmV0d29ya3M6IEdlbmVyYWxpemluZyBkZWdyZWUgYW5kIHNob3J0ZXN0IHBhdGhzXCJcbiAgLy8gY2hlY2sgdGhlIGhlYWRpbmcgMiBcIkRlZ3JlZVwiXG4gIGRlZ3JlZUNlbnRyYWxpdHk6IGZ1bmN0aW9uIGRlZ3JlZUNlbnRyYWxpdHkob3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBkZWZhdWx0cyRmKG9wdGlvbnMpO1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgICB2YXIgY2FsbGluZ0VsZXMgPSB0aGlzO1xuICAgIHZhciBfb3B0aW9ucyA9IG9wdGlvbnMsXG4gICAgICByb290ID0gX29wdGlvbnMucm9vdCxcbiAgICAgIHdlaWdodCA9IF9vcHRpb25zLndlaWdodCxcbiAgICAgIGRpcmVjdGVkID0gX29wdGlvbnMuZGlyZWN0ZWQsXG4gICAgICBhbHBoYSA9IF9vcHRpb25zLmFscGhhO1xuICAgIHJvb3QgPSBjeS5jb2xsZWN0aW9uKHJvb3QpWzBdO1xuICAgIGlmICghZGlyZWN0ZWQpIHtcbiAgICAgIHZhciBjb25uRWRnZXMgPSByb290LmNvbm5lY3RlZEVkZ2VzKCkuaW50ZXJzZWN0aW9uKGNhbGxpbmdFbGVzKTtcbiAgICAgIHZhciBrID0gY29ubkVkZ2VzLmxlbmd0aDtcbiAgICAgIHZhciBzID0gMDtcblxuICAgICAgLy8gTm93LCBzdW0gZWRnZSB3ZWlnaHRzXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbm5FZGdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBzICs9IHdlaWdodChjb25uRWRnZXNbaV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGVncmVlOiBNYXRoLnBvdyhrLCAxIC0gYWxwaGEpICogTWF0aC5wb3cocywgYWxwaGEpXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgZWRnZXMgPSByb290LmNvbm5lY3RlZEVkZ2VzKCk7XG4gICAgICB2YXIgaW5jb21pbmcgPSBlZGdlcy5maWx0ZXIoZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICAgICAgcmV0dXJuIGVkZ2UudGFyZ2V0KCkuc2FtZShyb290KSAmJiBjYWxsaW5nRWxlcy5oYXMoZWRnZSk7XG4gICAgICB9KTtcbiAgICAgIHZhciBvdXRnb2luZyA9IGVkZ2VzLmZpbHRlcihmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgICByZXR1cm4gZWRnZS5zb3VyY2UoKS5zYW1lKHJvb3QpICYmIGNhbGxpbmdFbGVzLmhhcyhlZGdlKTtcbiAgICAgIH0pO1xuICAgICAgdmFyIGtfaW4gPSBpbmNvbWluZy5sZW5ndGg7XG4gICAgICB2YXIga19vdXQgPSBvdXRnb2luZy5sZW5ndGg7XG4gICAgICB2YXIgc19pbiA9IDA7XG4gICAgICB2YXIgc19vdXQgPSAwO1xuXG4gICAgICAvLyBOb3csIHN1bSBpbmNvbWluZyBlZGdlIHdlaWdodHNcbiAgICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IGluY29taW5nLmxlbmd0aDsgX2kyKyspIHtcbiAgICAgICAgc19pbiArPSB3ZWlnaHQoaW5jb21pbmdbX2kyXSk7XG4gICAgICB9XG5cbiAgICAgIC8vIE5vdywgc3VtIG91dGdvaW5nIGVkZ2Ugd2VpZ2h0c1xuICAgICAgZm9yICh2YXIgX2kzID0gMDsgX2kzIDwgb3V0Z29pbmcubGVuZ3RoOyBfaTMrKykge1xuICAgICAgICBzX291dCArPSB3ZWlnaHQob3V0Z29pbmdbX2kzXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpbmRlZ3JlZTogTWF0aC5wb3coa19pbiwgMSAtIGFscGhhKSAqIE1hdGgucG93KHNfaW4sIGFscGhhKSxcbiAgICAgICAgb3V0ZGVncmVlOiBNYXRoLnBvdyhrX291dCwgMSAtIGFscGhhKSAqIE1hdGgucG93KHNfb3V0LCBhbHBoYSlcbiAgICAgIH07XG4gICAgfVxuICB9IC8vIGRlZ3JlZUNlbnRyYWxpdHlcbn07IC8vIGVsZXNmblxuXG4vLyBuaWNlLCBzaG9ydCBtYXRoZW1hdGljYWwgYWxpYXNcbmVsZXNmbiRuLmRjID0gZWxlc2ZuJG4uZGVncmVlQ2VudHJhbGl0eTtcbmVsZXNmbiRuLmRjbiA9IGVsZXNmbiRuLmRlZ3JlZUNlbnRyYWxpdHlOb3JtYWxpc2VkID0gZWxlc2ZuJG4uZGVncmVlQ2VudHJhbGl0eU5vcm1hbGl6ZWQ7XG5cbnZhciBkZWZhdWx0cyRlID0gZGVmYXVsdHMkZyh7XG4gIGhhcm1vbmljOiB0cnVlLFxuICB3ZWlnaHQ6IGZ1bmN0aW9uIHdlaWdodCgpIHtcbiAgICByZXR1cm4gMTtcbiAgfSxcbiAgZGlyZWN0ZWQ6IGZhbHNlLFxuICByb290OiBudWxsXG59KTtcbnZhciBlbGVzZm4kbSA9IHtcbiAgY2xvc2VuZXNzQ2VudHJhbGl0eU5vcm1hbGl6ZWQ6IGZ1bmN0aW9uIGNsb3NlbmVzc0NlbnRyYWxpdHlOb3JtYWxpemVkKG9wdGlvbnMpIHtcbiAgICB2YXIgX2RlZmF1bHRzID0gZGVmYXVsdHMkZShvcHRpb25zKSxcbiAgICAgIGhhcm1vbmljID0gX2RlZmF1bHRzLmhhcm1vbmljLFxuICAgICAgd2VpZ2h0ID0gX2RlZmF1bHRzLndlaWdodCxcbiAgICAgIGRpcmVjdGVkID0gX2RlZmF1bHRzLmRpcmVjdGVkO1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgICB2YXIgY2xvc2VuZXNzZXMgPSB7fTtcbiAgICB2YXIgbWF4Q2xvc2VuZXNzID0gMDtcbiAgICB2YXIgbm9kZXMgPSB0aGlzLm5vZGVzKCk7XG4gICAgdmFyIGZ3ID0gdGhpcy5mbG95ZFdhcnNoYWxsKHtcbiAgICAgIHdlaWdodDogd2VpZ2h0LFxuICAgICAgZGlyZWN0ZWQ6IGRpcmVjdGVkXG4gICAgfSk7XG5cbiAgICAvLyBDb21wdXRlIGNsb3NlbmVzcyBmb3IgZXZlcnkgbm9kZSBhbmQgZmluZCB0aGUgbWF4aW11bSBjbG9zZW5lc3NcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY3VyckNsb3NlbmVzcyA9IDA7XG4gICAgICB2YXIgbm9kZV9pID0gbm9kZXNbaV07XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG5vZGVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmIChpICE9PSBqKSB7XG4gICAgICAgICAgdmFyIGQgPSBmdy5kaXN0YW5jZShub2RlX2ksIG5vZGVzW2pdKTtcbiAgICAgICAgICBpZiAoaGFybW9uaWMpIHtcbiAgICAgICAgICAgIGN1cnJDbG9zZW5lc3MgKz0gMSAvIGQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGN1cnJDbG9zZW5lc3MgKz0gZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghaGFybW9uaWMpIHtcbiAgICAgICAgY3VyckNsb3NlbmVzcyA9IDEgLyBjdXJyQ2xvc2VuZXNzO1xuICAgICAgfVxuICAgICAgaWYgKG1heENsb3NlbmVzcyA8IGN1cnJDbG9zZW5lc3MpIHtcbiAgICAgICAgbWF4Q2xvc2VuZXNzID0gY3VyckNsb3NlbmVzcztcbiAgICAgIH1cbiAgICAgIGNsb3NlbmVzc2VzW25vZGVfaS5pZCgpXSA9IGN1cnJDbG9zZW5lc3M7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBjbG9zZW5lc3M6IGZ1bmN0aW9uIGNsb3NlbmVzcyhub2RlKSB7XG4gICAgICAgIGlmIChtYXhDbG9zZW5lc3MgPT0gMCkge1xuICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdHJpbmcobm9kZSkpIHtcbiAgICAgICAgICAvLyBmcm9tIGlzIGEgc2VsZWN0b3Igc3RyaW5nXG4gICAgICAgICAgbm9kZSA9IGN5LmZpbHRlcihub2RlKVswXS5pZCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGZyb20gaXMgYSBub2RlXG4gICAgICAgICAgbm9kZSA9IG5vZGUuaWQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2xvc2VuZXNzZXNbbm9kZV0gLyBtYXhDbG9zZW5lc3M7XG4gICAgICB9XG4gICAgfTtcbiAgfSxcbiAgLy8gSW1wbGVtZW50ZWQgZnJvbSBwc2V1ZG9jb2RlIGZyb20gd2lraXBlZGlhXG4gIGNsb3NlbmVzc0NlbnRyYWxpdHk6IGZ1bmN0aW9uIGNsb3NlbmVzc0NlbnRyYWxpdHkob3B0aW9ucykge1xuICAgIHZhciBfZGVmYXVsdHMyID0gZGVmYXVsdHMkZShvcHRpb25zKSxcbiAgICAgIHJvb3QgPSBfZGVmYXVsdHMyLnJvb3QsXG4gICAgICB3ZWlnaHQgPSBfZGVmYXVsdHMyLndlaWdodCxcbiAgICAgIGRpcmVjdGVkID0gX2RlZmF1bHRzMi5kaXJlY3RlZCxcbiAgICAgIGhhcm1vbmljID0gX2RlZmF1bHRzMi5oYXJtb25pYztcbiAgICByb290ID0gdGhpcy5maWx0ZXIocm9vdClbMF07XG5cbiAgICAvLyB3ZSBuZWVkIGRpc3RhbmNlIGZyb20gdGhpcyBub2RlIHRvIGV2ZXJ5IG90aGVyIG5vZGVcbiAgICB2YXIgZGlqa3N0cmEgPSB0aGlzLmRpamtzdHJhKHtcbiAgICAgIHJvb3Q6IHJvb3QsXG4gICAgICB3ZWlnaHQ6IHdlaWdodCxcbiAgICAgIGRpcmVjdGVkOiBkaXJlY3RlZFxuICAgIH0pO1xuICAgIHZhciB0b3RhbERpc3RhbmNlID0gMDtcbiAgICB2YXIgbm9kZXMgPSB0aGlzLm5vZGVzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG4gPSBub2Rlc1tpXTtcbiAgICAgIGlmICghbi5zYW1lKHJvb3QpKSB7XG4gICAgICAgIHZhciBkID0gZGlqa3N0cmEuZGlzdGFuY2VUbyhuKTtcbiAgICAgICAgaWYgKGhhcm1vbmljKSB7XG4gICAgICAgICAgdG90YWxEaXN0YW5jZSArPSAxIC8gZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0b3RhbERpc3RhbmNlICs9IGQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGhhcm1vbmljID8gdG90YWxEaXN0YW5jZSA6IDEgLyB0b3RhbERpc3RhbmNlO1xuICB9IC8vIGNsb3NlbmVzc0NlbnRyYWxpdHlcbn07IC8vIGVsZXNmblxuXG4vLyBuaWNlLCBzaG9ydCBtYXRoZW1hdGljYWwgYWxpYXNcbmVsZXNmbiRtLmNjID0gZWxlc2ZuJG0uY2xvc2VuZXNzQ2VudHJhbGl0eTtcbmVsZXNmbiRtLmNjbiA9IGVsZXNmbiRtLmNsb3NlbmVzc0NlbnRyYWxpdHlOb3JtYWxpc2VkID0gZWxlc2ZuJG0uY2xvc2VuZXNzQ2VudHJhbGl0eU5vcm1hbGl6ZWQ7XG5cbnZhciBkZWZhdWx0cyRkID0gZGVmYXVsdHMkZyh7XG4gIHdlaWdodDogbnVsbCxcbiAgZGlyZWN0ZWQ6IGZhbHNlXG59KTtcbnZhciBlbGVzZm4kbCA9IHtcbiAgLy8gSW1wbGVtZW50ZWQgZnJvbSB0aGUgYWxnb3JpdGhtIGluIHRoZSBwYXBlciBcIk9uIFZhcmlhbnRzIG9mIFNob3J0ZXN0LVBhdGggQmV0d2Vlbm5lc3MgQ2VudHJhbGl0eSBhbmQgdGhlaXIgR2VuZXJpYyBDb21wdXRhdGlvblwiIGJ5IFVscmlrIEJyYW5kZXNcbiAgYmV0d2Vlbm5lc3NDZW50cmFsaXR5OiBmdW5jdGlvbiBiZXR3ZWVubmVzc0NlbnRyYWxpdHkob3B0aW9ucykge1xuICAgIHZhciBfZGVmYXVsdHMgPSBkZWZhdWx0cyRkKG9wdGlvbnMpLFxuICAgICAgZGlyZWN0ZWQgPSBfZGVmYXVsdHMuZGlyZWN0ZWQsXG4gICAgICB3ZWlnaHQgPSBfZGVmYXVsdHMud2VpZ2h0O1xuICAgIHZhciB3ZWlnaHRlZCA9IHdlaWdodCAhPSBudWxsO1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcblxuICAgIC8vIHN0YXJ0aW5nXG4gICAgdmFyIFYgPSB0aGlzLm5vZGVzKCk7XG4gICAgdmFyIEEgPSB7fTtcbiAgICB2YXIgX0MgPSB7fTtcbiAgICB2YXIgbWF4ID0gMDtcbiAgICB2YXIgQyA9IHtcbiAgICAgIHNldDogZnVuY3Rpb24gc2V0KGtleSwgdmFsKSB7XG4gICAgICAgIF9DW2tleV0gPSB2YWw7XG4gICAgICAgIGlmICh2YWwgPiBtYXgpIHtcbiAgICAgICAgICBtYXggPSB2YWw7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICAgICAgcmV0dXJuIF9DW2tleV07XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIEEgY29udGFpbnMgdGhlIG5laWdoYm9yaG9vZHMgb2YgZXZlcnkgbm9kZVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgVi5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHYgPSBWW2ldO1xuICAgICAgdmFyIHZpZCA9IHYuaWQoKTtcbiAgICAgIGlmIChkaXJlY3RlZCkge1xuICAgICAgICBBW3ZpZF0gPSB2Lm91dGdvZXJzKCkubm9kZXMoKTsgLy8gZ2V0IG91dGdvZXJzIG9mIGV2ZXJ5IG5vZGVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIEFbdmlkXSA9IHYub3Blbk5laWdoYm9yaG9vZCgpLm5vZGVzKCk7IC8vIGdldCBuZWlnaGJvcnMgb2YgZXZlcnkgbm9kZVxuICAgICAgfVxuICAgICAgQy5zZXQodmlkLCAwKTtcbiAgICB9XG4gICAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoKSB7XG4gICAgICB2YXIgc2lkID0gVltzXS5pZCgpO1xuICAgICAgdmFyIFMgPSBbXTsgLy8gc3RhY2tcbiAgICAgIHZhciBQID0ge307XG4gICAgICB2YXIgZyA9IHt9O1xuICAgICAgdmFyIGQgPSB7fTtcbiAgICAgIHZhciBRID0gbmV3IEhlYXAoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIGRbYV0gLSBkW2JdO1xuICAgICAgfSk7IC8vIHF1ZXVlXG5cbiAgICAgIC8vIGluaXQgZGljdGlvbmFyaWVzXG4gICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgVi5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIF92aWQgPSBWW19pXS5pZCgpO1xuICAgICAgICBQW192aWRdID0gW107XG4gICAgICAgIGdbX3ZpZF0gPSAwO1xuICAgICAgICBkW192aWRdID0gSW5maW5pdHk7XG4gICAgICB9XG4gICAgICBnW3NpZF0gPSAxOyAvLyBzaWdtYVxuICAgICAgZFtzaWRdID0gMDsgLy8gZGlzdGFuY2UgdG8gc1xuXG4gICAgICBRLnB1c2goc2lkKTtcbiAgICAgIHdoaWxlICghUS5lbXB0eSgpKSB7XG4gICAgICAgIHZhciBfdiA9IFEucG9wKCk7XG4gICAgICAgIFMucHVzaChfdik7XG4gICAgICAgIGlmICh3ZWlnaHRlZCkge1xuICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgQVtfdl0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIHZhciB3ID0gQVtfdl1bal07XG4gICAgICAgICAgICB2YXIgdkVsZSA9IGN5LmdldEVsZW1lbnRCeUlkKF92KTtcbiAgICAgICAgICAgIHZhciBlZGdlID0gdm9pZCAwO1xuICAgICAgICAgICAgaWYgKHZFbGUuZWRnZXNUbyh3KS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGVkZ2UgPSB2RWxlLmVkZ2VzVG8odylbMF07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBlZGdlID0gdy5lZGdlc1RvKHZFbGUpWzBdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGVkZ2VXZWlnaHQgPSB3ZWlnaHQoZWRnZSk7XG4gICAgICAgICAgICB3ID0gdy5pZCgpO1xuICAgICAgICAgICAgaWYgKGRbd10gPiBkW192XSArIGVkZ2VXZWlnaHQpIHtcbiAgICAgICAgICAgICAgZFt3XSA9IGRbX3ZdICsgZWRnZVdlaWdodDtcbiAgICAgICAgICAgICAgaWYgKFEubm9kZXMuaW5kZXhPZih3KSA8IDApIHtcbiAgICAgICAgICAgICAgICAvL2lmIHcgaXMgbm90IGluIFFcbiAgICAgICAgICAgICAgICBRLnB1c2godyk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlIHBvc2l0aW9uIGlmIHcgaXMgaW4gUVxuICAgICAgICAgICAgICAgIFEudXBkYXRlSXRlbSh3KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBnW3ddID0gMDtcbiAgICAgICAgICAgICAgUFt3XSA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRbd10gPT0gZFtfdl0gKyBlZGdlV2VpZ2h0KSB7XG4gICAgICAgICAgICAgIGdbd10gPSBnW3ddICsgZ1tfdl07XG4gICAgICAgICAgICAgIFBbd10ucHVzaChfdik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvciAodmFyIF9qID0gMDsgX2ogPCBBW192XS5sZW5ndGg7IF9qKyspIHtcbiAgICAgICAgICAgIHZhciBfdyA9IEFbX3ZdW19qXS5pZCgpO1xuICAgICAgICAgICAgaWYgKGRbX3ddID09IEluZmluaXR5KSB7XG4gICAgICAgICAgICAgIFEucHVzaChfdyk7XG4gICAgICAgICAgICAgIGRbX3ddID0gZFtfdl0gKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRbX3ddID09IGRbX3ZdICsgMSkge1xuICAgICAgICAgICAgICBnW193XSA9IGdbX3ddICsgZ1tfdl07XG4gICAgICAgICAgICAgIFBbX3ddLnB1c2goX3YpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIGUgPSB7fTtcbiAgICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IFYubGVuZ3RoOyBfaTIrKykge1xuICAgICAgICBlW1ZbX2kyXS5pZCgpXSA9IDA7XG4gICAgICB9XG4gICAgICB3aGlsZSAoUy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZhciBfdzIgPSBTLnBvcCgpO1xuICAgICAgICBmb3IgKHZhciBfajIgPSAwOyBfajIgPCBQW193Ml0ubGVuZ3RoOyBfajIrKykge1xuICAgICAgICAgIHZhciBfdjIgPSBQW193Ml1bX2oyXTtcbiAgICAgICAgICBlW192Ml0gPSBlW192Ml0gKyBnW192Ml0gLyBnW193Ml0gKiAoMSArIGVbX3cyXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKF93MiAhPSBWW3NdLmlkKCkpIHtcbiAgICAgICAgICBDLnNldChfdzIsIEMuZ2V0KF93MikgKyBlW193Ml0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICBmb3IgKHZhciBzID0gMDsgcyA8IFYubGVuZ3RoOyBzKyspIHtcbiAgICAgIF9sb29wKCk7XG4gICAgfVxuICAgIHZhciByZXQgPSB7XG4gICAgICBiZXR3ZWVubmVzczogZnVuY3Rpb24gYmV0d2Vlbm5lc3Mobm9kZSkge1xuICAgICAgICB2YXIgaWQgPSBjeS5jb2xsZWN0aW9uKG5vZGUpLmlkKCk7XG4gICAgICAgIHJldHVybiBDLmdldChpZCk7XG4gICAgICB9LFxuICAgICAgYmV0d2Vlbm5lc3NOb3JtYWxpemVkOiBmdW5jdGlvbiBiZXR3ZWVubmVzc05vcm1hbGl6ZWQobm9kZSkge1xuICAgICAgICBpZiAobWF4ID09IDApIHtcbiAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaWQgPSBjeS5jb2xsZWN0aW9uKG5vZGUpLmlkKCk7XG4gICAgICAgIHJldHVybiBDLmdldChpZCkgLyBtYXg7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIGFsaWFzXG4gICAgcmV0LmJldHdlZW5uZXNzTm9ybWFsaXNlZCA9IHJldC5iZXR3ZWVubmVzc05vcm1hbGl6ZWQ7XG4gICAgcmV0dXJuIHJldDtcbiAgfSAvLyBiZXR3ZWVubmVzc0NlbnRyYWxpdHlcbn07IC8vIGVsZXNmblxuXG4vLyBuaWNlLCBzaG9ydCBtYXRoZW1hdGljYWwgYWxpYXNcbmVsZXNmbiRsLmJjID0gZWxlc2ZuJGwuYmV0d2Vlbm5lc3NDZW50cmFsaXR5O1xuXG4vLyBJbXBsZW1lbnRlZCBieSBab2UgWGkgQHpvZXhpIGZvciBHU09DIDIwMTZcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jeXRvc2NhcGUvY3l0b3NjYXBlLmpzLW1hcmtvdi1jbHVzdGVyXG5cblxuLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cbnZhciBkZWZhdWx0cyRjID0gZGVmYXVsdHMkZyh7XG4gIGV4cGFuZEZhY3RvcjogMixcbiAgLy8gYWZmZWN0cyB0aW1lIG9mIGNvbXB1dGF0aW9uIGFuZCBjbHVzdGVyIGdyYW51bGFyaXR5IHRvIHNvbWUgZXh0ZW50OiBNICogTVxuICBpbmZsYXRlRmFjdG9yOiAyLFxuICAvLyBhZmZlY3RzIGNsdXN0ZXIgZ3JhbnVsYXJpdHkgKHRoZSBncmVhdGVyIHRoZSB2YWx1ZSwgdGhlIG1vcmUgY2x1c3RlcnMpOiBNKGksaikgLyBFKGopXG4gIG11bHRGYWN0b3I6IDEsXG4gIC8vIG9wdGlvbmFsIHNlbGYgbG9vcHMgZm9yIGVhY2ggbm9kZS4gVXNlIGEgbmV1dHJhbCB2YWx1ZSB0byBpbXByb3ZlIGNsdXN0ZXIgY29tcHV0YXRpb25zLlxuICBtYXhJdGVyYXRpb25zOiAyMCxcbiAgLy8gbWF4aW11bSBudW1iZXIgb2YgaXRlcmF0aW9ucyBvZiB0aGUgTUNMIGFsZ29yaXRobSBpbiBhIHNpbmdsZSBydW5cbiAgYXR0cmlidXRlczogW1xuICAvLyBhdHRyaWJ1dGVzL2ZlYXR1cmVzIHVzZWQgdG8gZ3JvdXAgbm9kZXMsIGllLiBzaW1pbGFyaXR5IHZhbHVlcyBiZXR3ZWVuIG5vZGVzXG4gIGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1dXG59KTtcbi8qIGVzbGludC1lbmFibGUgKi9cblxudmFyIHNldE9wdGlvbnMkMyA9IGZ1bmN0aW9uIHNldE9wdGlvbnMob3B0aW9ucykge1xuICByZXR1cm4gZGVmYXVsdHMkYyhvcHRpb25zKTtcbn07XG4vKiBlc2xpbnQtZW5hYmxlICovXG5cbnZhciBnZXRTaW1pbGFyaXR5JDEgPSBmdW5jdGlvbiBnZXRTaW1pbGFyaXR5KGVkZ2UsIGF0dHJpYnV0ZXMpIHtcbiAgdmFyIHRvdGFsID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdG90YWwgKz0gYXR0cmlidXRlc1tpXShlZGdlKTtcbiAgfVxuICByZXR1cm4gdG90YWw7XG59O1xudmFyIGFkZExvb3BzID0gZnVuY3Rpb24gYWRkTG9vcHMoTSwgbiwgdmFsKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgTVtpICogbiArIGldID0gdmFsO1xuICB9XG59O1xudmFyIG5vcm1hbGl6ZSA9IGZ1bmN0aW9uIG5vcm1hbGl6ZShNLCBuKSB7XG4gIHZhciBzdW07XG4gIGZvciAodmFyIGNvbCA9IDA7IGNvbCA8IG47IGNvbCsrKSB7XG4gICAgc3VtID0gMDtcbiAgICBmb3IgKHZhciByb3cgPSAwOyByb3cgPCBuOyByb3crKykge1xuICAgICAgc3VtICs9IE1bcm93ICogbiArIGNvbF07XG4gICAgfVxuICAgIGZvciAodmFyIF9yb3cgPSAwOyBfcm93IDwgbjsgX3JvdysrKSB7XG4gICAgICBNW19yb3cgKiBuICsgY29sXSA9IE1bX3JvdyAqIG4gKyBjb2xdIC8gc3VtO1xuICAgIH1cbiAgfVxufTtcblxuLy8gVE9ETzogYmxvY2tlZCBtYXRyaXggbXVsdGlwbGljYXRpb24/XG52YXIgbW11bHQgPSBmdW5jdGlvbiBtbXVsdChBLCBCLCBuKSB7XG4gIHZhciBDID0gbmV3IEFycmF5KG4gKiBuKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG47IGorKykge1xuICAgICAgQ1tpICogbiArIGpdID0gMDtcbiAgICB9XG4gICAgZm9yICh2YXIgayA9IDA7IGsgPCBuOyBrKyspIHtcbiAgICAgIGZvciAodmFyIF9qID0gMDsgX2ogPCBuOyBfaisrKSB7XG4gICAgICAgIENbaSAqIG4gKyBfal0gKz0gQVtpICogbiArIGtdICogQltrICogbiArIF9qXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIEM7XG59O1xudmFyIGV4cGFuZCA9IGZ1bmN0aW9uIGV4cGFuZChNLCBuLCBleHBhbmRGYWN0b3IgLyoqIHBvd2VyICoqLykge1xuICB2YXIgX00gPSBNLnNsaWNlKDApO1xuICBmb3IgKHZhciBwID0gMTsgcCA8IGV4cGFuZEZhY3RvcjsgcCsrKSB7XG4gICAgTSA9IG1tdWx0KE0sIF9NLCBuKTtcbiAgfVxuICByZXR1cm4gTTtcbn07XG52YXIgaW5mbGF0ZSA9IGZ1bmN0aW9uIGluZmxhdGUoTSwgbiwgaW5mbGF0ZUZhY3RvciAvKiogciAqKi8pIHtcbiAgdmFyIF9NID0gbmV3IEFycmF5KG4gKiBuKTtcblxuICAvLyBNKGksaikgXiBpbmZsYXRlUG93ZXJcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuICogbjsgaSsrKSB7XG4gICAgX01baV0gPSBNYXRoLnBvdyhNW2ldLCBpbmZsYXRlRmFjdG9yKTtcbiAgfVxuICBub3JtYWxpemUoX00sIG4pO1xuICByZXR1cm4gX007XG59O1xudmFyIGhhc0NvbnZlcmdlZCA9IGZ1bmN0aW9uIGhhc0NvbnZlcmdlZChNLCBfTSwgbjIsIHJvdW5kRmFjdG9yKSB7XG4gIC8vIENoZWNrIHRoYXQgYm90aCBtYXRyaWNlcyBoYXZlIHRoZSBzYW1lIGVsZW1lbnRzIChpLGopXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbjI7IGkrKykge1xuICAgIHZhciB2MSA9IE1hdGgucm91bmQoTVtpXSAqIE1hdGgucG93KDEwLCByb3VuZEZhY3RvcikpIC8gTWF0aC5wb3coMTAsIHJvdW5kRmFjdG9yKTsgLy8gdHJ1bmNhdGUgdG8gJ3JvdW5kRmFjdG9yJyBkZWNpbWFsIHBsYWNlc1xuICAgIHZhciB2MiA9IE1hdGgucm91bmQoX01baV0gKiBNYXRoLnBvdygxMCwgcm91bmRGYWN0b3IpKSAvIE1hdGgucG93KDEwLCByb3VuZEZhY3Rvcik7XG4gICAgaWYgKHYxICE9PSB2Mikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG52YXIgYXNzaWduJDIgPSBmdW5jdGlvbiBhc3NpZ24oTSwgbiwgbm9kZXMsIGN5KSB7XG4gIHZhciBjbHVzdGVycyA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykge1xuICAgIHZhciBjbHVzdGVyID0gW107XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBuOyBqKyspIHtcbiAgICAgIC8vIFJvdy13aXNlIGF0dHJhY3RvcnMgYW5kIGVsZW1lbnRzIHRoYXQgdGhleSBhdHRyYWN0IGJlbG9uZyBpbiBzYW1lIGNsdXN0ZXJcbiAgICAgIGlmIChNYXRoLnJvdW5kKE1baSAqIG4gKyBqXSAqIDEwMDApIC8gMTAwMCA+IDApIHtcbiAgICAgICAgY2x1c3Rlci5wdXNoKG5vZGVzW2pdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNsdXN0ZXIubGVuZ3RoICE9PSAwKSB7XG4gICAgICBjbHVzdGVycy5wdXNoKGN5LmNvbGxlY3Rpb24oY2x1c3RlcikpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2x1c3RlcnM7XG59O1xudmFyIGlzRHVwbGljYXRlID0gZnVuY3Rpb24gaXNEdXBsaWNhdGUoYzEsIGMyKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYzEubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoIWMyW2ldIHx8IGMxW2ldLmlkKCkgIT09IGMyW2ldLmlkKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59O1xudmFyIHJlbW92ZUR1cGxpY2F0ZXMgPSBmdW5jdGlvbiByZW1vdmVEdXBsaWNhdGVzKGNsdXN0ZXJzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY2x1c3RlcnMubGVuZ3RoOyBpKyspIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNsdXN0ZXJzLmxlbmd0aDsgaisrKSB7XG4gICAgICBpZiAoaSAhPSBqICYmIGlzRHVwbGljYXRlKGNsdXN0ZXJzW2ldLCBjbHVzdGVyc1tqXSkpIHtcbiAgICAgICAgY2x1c3RlcnMuc3BsaWNlKGosIDEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gY2x1c3RlcnM7XG59O1xudmFyIG1hcmtvdkNsdXN0ZXJpbmcgPSBmdW5jdGlvbiBtYXJrb3ZDbHVzdGVyaW5nKG9wdGlvbnMpIHtcbiAgdmFyIG5vZGVzID0gdGhpcy5ub2RlcygpO1xuICB2YXIgZWRnZXMgPSB0aGlzLmVkZ2VzKCk7XG4gIHZhciBjeSA9IHRoaXMuY3koKTtcblxuICAvLyBTZXQgcGFyYW1ldGVycyBvZiBhbGdvcml0aG06XG4gIHZhciBvcHRzID0gc2V0T3B0aW9ucyQzKG9wdGlvbnMpO1xuXG4gIC8vIE1hcCBlYWNoIG5vZGUgdG8gaXRzIHBvc2l0aW9uIGluIG5vZGUgYXJyYXlcbiAgdmFyIGlkMnBvc2l0aW9uID0ge307XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICBpZDJwb3NpdGlvbltub2Rlc1tpXS5pZCgpXSA9IGk7XG4gIH1cblxuICAvLyBHZW5lcmF0ZSBzdG9jaGFzdGljIG1hdHJpeCBNIGZyb20gaW5wdXQgZ3JhcGggRyAoc2hvdWxkIGJlIHN5bW1ldHJpYy91bmRpcmVjdGVkKVxuICB2YXIgbiA9IG5vZGVzLmxlbmd0aCxcbiAgICBuMiA9IG4gKiBuO1xuICB2YXIgTSA9IG5ldyBBcnJheShuMiksXG4gICAgX007XG4gIGZvciAodmFyIF9pID0gMDsgX2kgPCBuMjsgX2krKykge1xuICAgIE1bX2ldID0gMDtcbiAgfVxuICBmb3IgKHZhciBlID0gMDsgZSA8IGVkZ2VzLmxlbmd0aDsgZSsrKSB7XG4gICAgdmFyIGVkZ2UgPSBlZGdlc1tlXTtcbiAgICB2YXIgX2kyID0gaWQycG9zaXRpb25bZWRnZS5zb3VyY2UoKS5pZCgpXTtcbiAgICB2YXIgaiA9IGlkMnBvc2l0aW9uW2VkZ2UudGFyZ2V0KCkuaWQoKV07XG4gICAgdmFyIHNpbSA9IGdldFNpbWlsYXJpdHkkMShlZGdlLCBvcHRzLmF0dHJpYnV0ZXMpO1xuICAgIE1bX2kyICogbiArIGpdICs9IHNpbTsgLy8gRyBzaG91bGQgYmUgc3ltbWV0cmljIGFuZCB1bmRpcmVjdGVkXG4gICAgTVtqICogbiArIF9pMl0gKz0gc2ltO1xuICB9XG5cbiAgLy8gQmVnaW4gTWFya292IGNsdXN0ZXIgYWxnb3JpdGhtXG5cbiAgLy8gU3RlcCAxOiBBZGQgc2VsZiBsb29wcyB0byBlYWNoIG5vZGUsIGllLiBhZGQgbXVsdEZhY3RvciB0byBtYXRyaXggZGlhZ29uYWxcbiAgYWRkTG9vcHMoTSwgbiwgb3B0cy5tdWx0RmFjdG9yKTtcblxuICAvLyBTdGVwIDI6IE0gPSBub3JtYWxpemUoIE0gKTtcbiAgbm9ybWFsaXplKE0sIG4pO1xuICB2YXIgaXNTdGlsbE1vdmluZyA9IHRydWU7XG4gIHZhciBpdGVyYXRpb25zID0gMDtcbiAgd2hpbGUgKGlzU3RpbGxNb3ZpbmcgJiYgaXRlcmF0aW9ucyA8IG9wdHMubWF4SXRlcmF0aW9ucykge1xuICAgIGlzU3RpbGxNb3ZpbmcgPSBmYWxzZTtcblxuICAgIC8vIFN0ZXAgMzpcbiAgICBfTSA9IGV4cGFuZChNLCBuLCBvcHRzLmV4cGFuZEZhY3Rvcik7XG5cbiAgICAvLyBTdGVwIDQ6XG4gICAgTSA9IGluZmxhdGUoX00sIG4sIG9wdHMuaW5mbGF0ZUZhY3Rvcik7XG5cbiAgICAvLyBTdGVwIDU6IGNoZWNrIHRvIHNlZSBpZiB+c3RlYWR5IHN0YXRlIGhhcyBiZWVuIHJlYWNoZWRcbiAgICBpZiAoIWhhc0NvbnZlcmdlZChNLCBfTSwgbjIsIDQpKSB7XG4gICAgICBpc1N0aWxsTW92aW5nID0gdHJ1ZTtcbiAgICB9XG4gICAgaXRlcmF0aW9ucysrO1xuICB9XG5cbiAgLy8gQnVpbGQgY2x1c3RlcnMgZnJvbSBtYXRyaXhcbiAgdmFyIGNsdXN0ZXJzID0gYXNzaWduJDIoTSwgbiwgbm9kZXMsIGN5KTtcblxuICAvLyBSZW1vdmUgZHVwbGljYXRlIGNsdXN0ZXJzIGR1ZSB0byBzeW1tZXRyeSBvZiBncmFwaCBhbmQgTSBtYXRyaXhcbiAgY2x1c3RlcnMgPSByZW1vdmVEdXBsaWNhdGVzKGNsdXN0ZXJzKTtcbiAgcmV0dXJuIGNsdXN0ZXJzO1xufTtcbnZhciBtYXJrb3ZDbHVzdGVyaW5nJDEgPSB7XG4gIG1hcmtvdkNsdXN0ZXJpbmc6IG1hcmtvdkNsdXN0ZXJpbmcsXG4gIG1jbDogbWFya292Q2x1c3RlcmluZ1xufTtcblxuLy8gQ29tbW9uIGRpc3RhbmNlIG1ldHJpY3MgZm9yIGNsdXN0ZXJpbmcgYWxnb3JpdGhtc1xuLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSGllcmFyY2hpY2FsX2NsdXN0ZXJpbmcjTWV0cmljXG5cbnZhciBpZGVudGl0eSQxID0gZnVuY3Rpb24gaWRlbnRpdHkoeCkge1xuICByZXR1cm4geDtcbn07XG52YXIgYWJzRGlmZiA9IGZ1bmN0aW9uIGFic0RpZmYocCwgcSkge1xuICByZXR1cm4gTWF0aC5hYnMocSAtIHApO1xufTtcbnZhciBhZGRBYnNEaWZmID0gZnVuY3Rpb24gYWRkQWJzRGlmZih0b3RhbCwgcCwgcSkge1xuICByZXR1cm4gdG90YWwgKyBhYnNEaWZmKHAsIHEpO1xufTtcbnZhciBhZGRTcXVhcmVkRGlmZiA9IGZ1bmN0aW9uIGFkZFNxdWFyZWREaWZmKHRvdGFsLCBwLCBxKSB7XG4gIHJldHVybiB0b3RhbCArIE1hdGgucG93KHEgLSBwLCAyKTtcbn07XG52YXIgc3FydCA9IGZ1bmN0aW9uIHNxcnQoeCkge1xuICByZXR1cm4gTWF0aC5zcXJ0KHgpO1xufTtcbnZhciBtYXhBYnNEaWZmID0gZnVuY3Rpb24gbWF4QWJzRGlmZihjdXJyZW50TWF4LCBwLCBxKSB7XG4gIHJldHVybiBNYXRoLm1heChjdXJyZW50TWF4LCBhYnNEaWZmKHAsIHEpKTtcbn07XG52YXIgZ2V0RGlzdGFuY2UgPSBmdW5jdGlvbiBnZXREaXN0YW5jZShsZW5ndGgsIGdldFAsIGdldFEsIGluaXQsIHZpc2l0KSB7XG4gIHZhciBwb3N0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDUgJiYgYXJndW1lbnRzWzVdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNV0gOiBpZGVudGl0eSQxO1xuICB2YXIgcmV0ID0gaW5pdDtcbiAgdmFyIHAsIHE7XG4gIGZvciAodmFyIGRpbSA9IDA7IGRpbSA8IGxlbmd0aDsgZGltKyspIHtcbiAgICBwID0gZ2V0UChkaW0pO1xuICAgIHEgPSBnZXRRKGRpbSk7XG4gICAgcmV0ID0gdmlzaXQocmV0LCBwLCBxKTtcbiAgfVxuICByZXR1cm4gcG9zdChyZXQpO1xufTtcbnZhciBkaXN0YW5jZXMgPSB7XG4gIGV1Y2xpZGVhbjogZnVuY3Rpb24gZXVjbGlkZWFuKGxlbmd0aCwgZ2V0UCwgZ2V0USkge1xuICAgIGlmIChsZW5ndGggPj0gMikge1xuICAgICAgcmV0dXJuIGdldERpc3RhbmNlKGxlbmd0aCwgZ2V0UCwgZ2V0USwgMCwgYWRkU3F1YXJlZERpZmYsIHNxcnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBmb3Igc2luZ2xlIGF0dHIgY2FzZSwgbW9yZSBlZmZpY2llbnQgdG8gYXZvaWQgc3FydFxuICAgICAgcmV0dXJuIGdldERpc3RhbmNlKGxlbmd0aCwgZ2V0UCwgZ2V0USwgMCwgYWRkQWJzRGlmZik7XG4gICAgfVxuICB9LFxuICBzcXVhcmVkRXVjbGlkZWFuOiBmdW5jdGlvbiBzcXVhcmVkRXVjbGlkZWFuKGxlbmd0aCwgZ2V0UCwgZ2V0USkge1xuICAgIHJldHVybiBnZXREaXN0YW5jZShsZW5ndGgsIGdldFAsIGdldFEsIDAsIGFkZFNxdWFyZWREaWZmKTtcbiAgfSxcbiAgbWFuaGF0dGFuOiBmdW5jdGlvbiBtYW5oYXR0YW4obGVuZ3RoLCBnZXRQLCBnZXRRKSB7XG4gICAgcmV0dXJuIGdldERpc3RhbmNlKGxlbmd0aCwgZ2V0UCwgZ2V0USwgMCwgYWRkQWJzRGlmZik7XG4gIH0sXG4gIG1heDogZnVuY3Rpb24gbWF4KGxlbmd0aCwgZ2V0UCwgZ2V0USkge1xuICAgIHJldHVybiBnZXREaXN0YW5jZShsZW5ndGgsIGdldFAsIGdldFEsIC1JbmZpbml0eSwgbWF4QWJzRGlmZik7XG4gIH1cbn07XG5cbi8vIGluIGNhc2UgdGhlIHVzZXIgYWNjaWRlbnRhbGx5IGRvZXNuJ3QgdXNlIGNhbWVsIGNhc2VcbmRpc3RhbmNlc1snc3F1YXJlZC1ldWNsaWRlYW4nXSA9IGRpc3RhbmNlc1snc3F1YXJlZEV1Y2xpZGVhbiddO1xuZGlzdGFuY2VzWydzcXVhcmVkZXVjbGlkZWFuJ10gPSBkaXN0YW5jZXNbJ3NxdWFyZWRFdWNsaWRlYW4nXTtcbmZ1bmN0aW9uIGNsdXN0ZXJpbmdEaXN0YW5jZSAobWV0aG9kLCBsZW5ndGgsIGdldFAsIGdldFEsIG5vZGVQLCBub2RlUSkge1xuICB2YXIgaW1wbDtcbiAgaWYgKGZuJDYobWV0aG9kKSkge1xuICAgIGltcGwgPSBtZXRob2Q7XG4gIH0gZWxzZSB7XG4gICAgaW1wbCA9IGRpc3RhbmNlc1ttZXRob2RdIHx8IGRpc3RhbmNlcy5ldWNsaWRlYW47XG4gIH1cbiAgaWYgKGxlbmd0aCA9PT0gMCAmJiBmbiQ2KG1ldGhvZCkpIHtcbiAgICByZXR1cm4gaW1wbChub2RlUCwgbm9kZVEpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBpbXBsKGxlbmd0aCwgZ2V0UCwgZ2V0USwgbm9kZVAsIG5vZGVRKTtcbiAgfVxufVxuXG52YXIgZGVmYXVsdHMkYiA9IGRlZmF1bHRzJGcoe1xuICBrOiAyLFxuICBtOiAyLFxuICBzZW5zaXRpdml0eVRocmVzaG9sZDogMC4wMDAxLFxuICBkaXN0YW5jZTogJ2V1Y2xpZGVhbicsXG4gIG1heEl0ZXJhdGlvbnM6IDEwLFxuICBhdHRyaWJ1dGVzOiBbXSxcbiAgdGVzdE1vZGU6IGZhbHNlLFxuICB0ZXN0Q2VudHJvaWRzOiBudWxsXG59KTtcbnZhciBzZXRPcHRpb25zJDIgPSBmdW5jdGlvbiBzZXRPcHRpb25zKG9wdGlvbnMpIHtcbiAgcmV0dXJuIGRlZmF1bHRzJGIob3B0aW9ucyk7XG59O1xuXG52YXIgZ2V0RGlzdCA9IGZ1bmN0aW9uIGdldERpc3QodHlwZSwgbm9kZSwgY2VudHJvaWQsIGF0dHJpYnV0ZXMsIG1vZGUpIHtcbiAgdmFyIG5vTm9kZVAgPSBtb2RlICE9PSAna01lZG9pZHMnO1xuICB2YXIgZ2V0UCA9IG5vTm9kZVAgPyBmdW5jdGlvbiAoaSkge1xuICAgIHJldHVybiBjZW50cm9pZFtpXTtcbiAgfSA6IGZ1bmN0aW9uIChpKSB7XG4gICAgcmV0dXJuIGF0dHJpYnV0ZXNbaV0oY2VudHJvaWQpO1xuICB9O1xuICB2YXIgZ2V0USA9IGZ1bmN0aW9uIGdldFEoaSkge1xuICAgIHJldHVybiBhdHRyaWJ1dGVzW2ldKG5vZGUpO1xuICB9O1xuICB2YXIgbm9kZVAgPSBjZW50cm9pZDtcbiAgdmFyIG5vZGVRID0gbm9kZTtcbiAgcmV0dXJuIGNsdXN0ZXJpbmdEaXN0YW5jZSh0eXBlLCBhdHRyaWJ1dGVzLmxlbmd0aCwgZ2V0UCwgZ2V0USwgbm9kZVAsIG5vZGVRKTtcbn07XG52YXIgcmFuZG9tQ2VudHJvaWRzID0gZnVuY3Rpb24gcmFuZG9tQ2VudHJvaWRzKG5vZGVzLCBrLCBhdHRyaWJ1dGVzKSB7XG4gIHZhciBuZGltID0gYXR0cmlidXRlcy5sZW5ndGg7XG4gIHZhciBtaW4gPSBuZXcgQXJyYXkobmRpbSk7XG4gIHZhciBtYXggPSBuZXcgQXJyYXkobmRpbSk7XG4gIHZhciBjZW50cm9pZHMgPSBuZXcgQXJyYXkoayk7XG4gIHZhciBjZW50cm9pZCA9IG51bGw7XG5cbiAgLy8gRmluZCBtaW4sIG1heCB2YWx1ZXMgZm9yIGVhY2ggYXR0cmlidXRlIGRpbWVuc2lvblxuICBmb3IgKHZhciBpID0gMDsgaSA8IG5kaW07IGkrKykge1xuICAgIG1pbltpXSA9IG5vZGVzLm1pbihhdHRyaWJ1dGVzW2ldKS52YWx1ZTtcbiAgICBtYXhbaV0gPSBub2Rlcy5tYXgoYXR0cmlidXRlc1tpXSkudmFsdWU7XG4gIH1cblxuICAvLyBCdWlsZCBrIGNlbnRyb2lkcywgZWFjaCByZXByZXNlbnRlZCBhcyBhbiBuLWRpbSBmZWF0dXJlIHZlY3RvclxuICBmb3IgKHZhciBjID0gMDsgYyA8IGs7IGMrKykge1xuICAgIGNlbnRyb2lkID0gW107XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IG5kaW07IF9pKyspIHtcbiAgICAgIGNlbnRyb2lkW19pXSA9IE1hdGgucmFuZG9tKCkgKiAobWF4W19pXSAtIG1pbltfaV0pICsgbWluW19pXTsgLy8gcmFuZG9tIGluaXRpYWwgdmFsdWVcbiAgICB9XG4gICAgY2VudHJvaWRzW2NdID0gY2VudHJvaWQ7XG4gIH1cbiAgcmV0dXJuIGNlbnRyb2lkcztcbn07XG52YXIgY2xhc3NpZnkgPSBmdW5jdGlvbiBjbGFzc2lmeShub2RlLCBjZW50cm9pZHMsIGRpc3RhbmNlLCBhdHRyaWJ1dGVzLCB0eXBlKSB7XG4gIHZhciBtaW4gPSBJbmZpbml0eTtcbiAgdmFyIGluZGV4ID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjZW50cm9pZHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZGlzdCA9IGdldERpc3QoZGlzdGFuY2UsIG5vZGUsIGNlbnRyb2lkc1tpXSwgYXR0cmlidXRlcywgdHlwZSk7XG4gICAgaWYgKGRpc3QgPCBtaW4pIHtcbiAgICAgIG1pbiA9IGRpc3Q7XG4gICAgICBpbmRleCA9IGk7XG4gICAgfVxuICB9XG4gIHJldHVybiBpbmRleDtcbn07XG52YXIgYnVpbGRDbHVzdGVyID0gZnVuY3Rpb24gYnVpbGRDbHVzdGVyKGNlbnRyb2lkLCBub2RlcywgYXNzaWdubWVudCkge1xuICB2YXIgY2x1c3RlciA9IFtdO1xuICB2YXIgbm9kZSA9IG51bGw7XG4gIGZvciAodmFyIG4gPSAwOyBuIDwgbm9kZXMubGVuZ3RoOyBuKyspIHtcbiAgICBub2RlID0gbm9kZXNbbl07XG4gICAgaWYgKGFzc2lnbm1lbnRbbm9kZS5pZCgpXSA9PT0gY2VudHJvaWQpIHtcbiAgICAgIC8vY29uc29sZS5sb2coXCJOb2RlIFwiICsgbm9kZS5pZCgpICsgXCIgaXMgYXNzb2NpYXRlZCB3aXRoIG1lZG9pZCAjOiBcIiArIG0pO1xuICAgICAgY2x1c3Rlci5wdXNoKG5vZGUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2x1c3Rlcjtcbn07XG52YXIgaGF2ZVZhbHVlc0NvbnZlcmdlZCA9IGZ1bmN0aW9uIGhhdmVWYWx1ZXNDb252ZXJnZWQodjEsIHYyLCBzZW5zaXRpdml0eVRocmVzaG9sZCkge1xuICByZXR1cm4gTWF0aC5hYnModjIgLSB2MSkgPD0gc2Vuc2l0aXZpdHlUaHJlc2hvbGQ7XG59O1xudmFyIGhhdmVNYXRyaWNlc0NvbnZlcmdlZCA9IGZ1bmN0aW9uIGhhdmVNYXRyaWNlc0NvbnZlcmdlZCh2MSwgdjIsIHNlbnNpdGl2aXR5VGhyZXNob2xkKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdjEubGVuZ3RoOyBpKyspIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHYxW2ldLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgZGlmZiA9IE1hdGguYWJzKHYxW2ldW2pdIC0gdjJbaV1bal0pO1xuICAgICAgaWYgKGRpZmYgPiBzZW5zaXRpdml0eVRocmVzaG9sZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufTtcbnZhciBzZWVuQmVmb3JlID0gZnVuY3Rpb24gc2VlbkJlZm9yZShub2RlLCBtZWRvaWRzLCBuKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgaWYgKG5vZGUgPT09IG1lZG9pZHNbaV0pIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG52YXIgcmFuZG9tTWVkb2lkcyA9IGZ1bmN0aW9uIHJhbmRvbU1lZG9pZHMobm9kZXMsIGspIHtcbiAgdmFyIG1lZG9pZHMgPSBuZXcgQXJyYXkoayk7XG5cbiAgLy8gRm9yIHNtYWxsIGRhdGEgc2V0cywgdGhlIHByb2JhYmlsaXR5IG9mIG1lZG9pZCBjb25mbGljdCBpcyBncmVhdGVyLFxuICAvLyBzbyB3ZSBuZWVkIHRvIGNoZWNrIHRvIHNlZSBpZiB3ZSd2ZSBhbHJlYWR5IHNlZW4gb3IgY2hvc2UgdGhpcyBub2RlIGJlZm9yZS5cbiAgaWYgKG5vZGVzLmxlbmd0aCA8IDUwKSB7XG4gICAgLy8gUmFuZG9tbHkgc2VsZWN0IGsgbWVkb2lkcyBmcm9tIHRoZSBuIG5vZGVzXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrOyBpKyspIHtcbiAgICAgIHZhciBub2RlID0gbm9kZXNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogbm9kZXMubGVuZ3RoKV07XG5cbiAgICAgIC8vIElmIHdlJ3ZlIGFscmVhZHkgY2hvc2VuIHRoaXMgbm9kZSB0byBiZSBhIG1lZG9pZCwgZG9uJ3QgY2hvb3NlIGl0IGFnYWluIChmb3Igc21hbGwgZGF0YSBzZXRzKS5cbiAgICAgIC8vIEluc3RlYWQgY2hvb3NlIGEgZGlmZmVyZW50IHJhbmRvbSBub2RlLlxuICAgICAgd2hpbGUgKHNlZW5CZWZvcmUobm9kZSwgbWVkb2lkcywgaSkpIHtcbiAgICAgICAgbm9kZSA9IG5vZGVzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIG5vZGVzLmxlbmd0aCldO1xuICAgICAgfVxuICAgICAgbWVkb2lkc1tpXSA9IG5vZGU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFJlbGF0aXZlbHkgbGFyZ2UgZGF0YSBzZXQsIHNvIHByZXR0eSBzYWZlIHRvIG5vdCBjaGVjayBhbmQganVzdCBzZWxlY3QgcmFuZG9tIG5vZGVzXG4gICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgazsgX2kyKyspIHtcbiAgICAgIG1lZG9pZHNbX2kyXSA9IG5vZGVzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIG5vZGVzLmxlbmd0aCldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbWVkb2lkcztcbn07XG52YXIgZmluZENvc3QgPSBmdW5jdGlvbiBmaW5kQ29zdChwb3RlbnRpYWxOZXdNZWRvaWQsIGNsdXN0ZXIsIGF0dHJpYnV0ZXMpIHtcbiAgdmFyIGNvc3QgPSAwO1xuICBmb3IgKHZhciBuID0gMDsgbiA8IGNsdXN0ZXIubGVuZ3RoOyBuKyspIHtcbiAgICBjb3N0ICs9IGdldERpc3QoJ21hbmhhdHRhbicsIGNsdXN0ZXJbbl0sIHBvdGVudGlhbE5ld01lZG9pZCwgYXR0cmlidXRlcywgJ2tNZWRvaWRzJyk7XG4gIH1cbiAgcmV0dXJuIGNvc3Q7XG59O1xudmFyIGtNZWFucyA9IGZ1bmN0aW9uIGtNZWFucyhvcHRpb25zKSB7XG4gIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgdmFyIG5vZGVzID0gdGhpcy5ub2RlcygpO1xuICB2YXIgbm9kZSA9IG51bGw7XG5cbiAgLy8gU2V0IHBhcmFtZXRlcnMgb2YgYWxnb3JpdGhtOiAjIG9mIGNsdXN0ZXJzLCBkaXN0YW5jZSBtZXRyaWMsIGV0Yy5cbiAgdmFyIG9wdHMgPSBzZXRPcHRpb25zJDIob3B0aW9ucyk7XG5cbiAgLy8gQmVnaW4gay1tZWFucyBhbGdvcml0aG1cbiAgdmFyIGNsdXN0ZXJzID0gbmV3IEFycmF5KG9wdHMuayk7XG4gIHZhciBhc3NpZ25tZW50ID0ge307XG4gIHZhciBjZW50cm9pZHM7XG5cbiAgLy8gU3RlcCAxOiBJbml0aWFsaXplIGNlbnRyb2lkIHBvc2l0aW9uc1xuICBpZiAob3B0cy50ZXN0TW9kZSkge1xuICAgIGlmICh0eXBlb2Ygb3B0cy50ZXN0Q2VudHJvaWRzID09PSAnbnVtYmVyJykge1xuICAgICAgLy8gVE9ETzogaW1wbGVtZW50IGEgc2VlZGVkIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLlxuICAgICAgb3B0cy50ZXN0Q2VudHJvaWRzO1xuICAgICAgY2VudHJvaWRzID0gcmFuZG9tQ2VudHJvaWRzKG5vZGVzLCBvcHRzLmssIG9wdHMuYXR0cmlidXRlcyk7XG4gICAgfSBlbHNlIGlmIChfdHlwZW9mKG9wdHMudGVzdENlbnRyb2lkcykgPT09ICdvYmplY3QnKSB7XG4gICAgICBjZW50cm9pZHMgPSBvcHRzLnRlc3RDZW50cm9pZHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNlbnRyb2lkcyA9IHJhbmRvbUNlbnRyb2lkcyhub2Rlcywgb3B0cy5rLCBvcHRzLmF0dHJpYnV0ZXMpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjZW50cm9pZHMgPSByYW5kb21DZW50cm9pZHMobm9kZXMsIG9wdHMuaywgb3B0cy5hdHRyaWJ1dGVzKTtcbiAgfVxuICB2YXIgaXNTdGlsbE1vdmluZyA9IHRydWU7XG4gIHZhciBpdGVyYXRpb25zID0gMDtcbiAgd2hpbGUgKGlzU3RpbGxNb3ZpbmcgJiYgaXRlcmF0aW9ucyA8IG9wdHMubWF4SXRlcmF0aW9ucykge1xuICAgIC8vIFN0ZXAgMjogQXNzaWduIG5vZGVzIHRvIHRoZSBuZWFyZXN0IGNlbnRyb2lkXG4gICAgZm9yICh2YXIgbiA9IDA7IG4gPCBub2Rlcy5sZW5ndGg7IG4rKykge1xuICAgICAgbm9kZSA9IG5vZGVzW25dO1xuICAgICAgLy8gRGV0ZXJtaW5lIHdoaWNoIGNsdXN0ZXIgdGhpcyBub2RlIGJlbG9uZ3MgdG86IG5vZGUgaWQgPT4gY2x1c3RlciAjXG4gICAgICBhc3NpZ25tZW50W25vZGUuaWQoKV0gPSBjbGFzc2lmeShub2RlLCBjZW50cm9pZHMsIG9wdHMuZGlzdGFuY2UsIG9wdHMuYXR0cmlidXRlcywgJ2tNZWFucycpO1xuICAgIH1cblxuICAgIC8vIFN0ZXAgMzogRm9yIGVhY2ggb2YgdGhlIGsgY2x1c3RlcnMsIHVwZGF0ZSBpdHMgY2VudHJvaWRcbiAgICBpc1N0aWxsTW92aW5nID0gZmFsc2U7XG4gICAgZm9yICh2YXIgYyA9IDA7IGMgPCBvcHRzLms7IGMrKykge1xuICAgICAgLy8gR2V0IGFsbCBub2RlcyB0aGF0IGJlbG9uZyB0byB0aGlzIGNsdXN0ZXJcbiAgICAgIHZhciBjbHVzdGVyID0gYnVpbGRDbHVzdGVyKGMsIG5vZGVzLCBhc3NpZ25tZW50KTtcbiAgICAgIGlmIChjbHVzdGVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBJZiBjbHVzdGVyIGlzIGVtcHR5LCBicmVhayBvdXQgZWFybHkgJiBtb3ZlIHRvIG5leHQgY2x1c3RlclxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIGNlbnRyb2lkcyBieSBjYWxjdWxhdGluZyBhdmcgb2YgYWxsIG5vZGVzIHdpdGhpbiB0aGUgY2x1c3Rlci5cbiAgICAgIHZhciBuZGltID0gb3B0cy5hdHRyaWJ1dGVzLmxlbmd0aDtcbiAgICAgIHZhciBjZW50cm9pZCA9IGNlbnRyb2lkc1tjXTsgLy8gWyBkaW1fMSwgZGltXzIsIGRpbV8zLCAuLi4gLCBkaW1fbiBdXG4gICAgICB2YXIgbmV3Q2VudHJvaWQgPSBuZXcgQXJyYXkobmRpbSk7XG4gICAgICB2YXIgc3VtID0gbmV3IEFycmF5KG5kaW0pO1xuICAgICAgZm9yICh2YXIgZCA9IDA7IGQgPCBuZGltOyBkKyspIHtcbiAgICAgICAgc3VtW2RdID0gMC4wO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNsdXN0ZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBub2RlID0gY2x1c3RlcltpXTtcbiAgICAgICAgICBzdW1bZF0gKz0gb3B0cy5hdHRyaWJ1dGVzW2RdKG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIG5ld0NlbnRyb2lkW2RdID0gc3VtW2RdIC8gY2x1c3Rlci5sZW5ndGg7XG5cbiAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIGFsZ29yaXRobSBoYXMgY29udmVyZ2VkLCBpLmUuIHdoZW4gY2VudHJvaWRzIG5vIGxvbmdlciBjaGFuZ2VcbiAgICAgICAgaWYgKCFoYXZlVmFsdWVzQ29udmVyZ2VkKG5ld0NlbnRyb2lkW2RdLCBjZW50cm9pZFtkXSwgb3B0cy5zZW5zaXRpdml0eVRocmVzaG9sZCkpIHtcbiAgICAgICAgICBpc1N0aWxsTW92aW5nID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2VudHJvaWRzW2NdID0gbmV3Q2VudHJvaWQ7XG4gICAgICBjbHVzdGVyc1tjXSA9IGN5LmNvbGxlY3Rpb24oY2x1c3Rlcik7XG4gICAgfVxuICAgIGl0ZXJhdGlvbnMrKztcbiAgfVxuICByZXR1cm4gY2x1c3RlcnM7XG59O1xudmFyIGtNZWRvaWRzID0gZnVuY3Rpb24ga01lZG9pZHMob3B0aW9ucykge1xuICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gIHZhciBub2RlcyA9IHRoaXMubm9kZXMoKTtcbiAgdmFyIG5vZGUgPSBudWxsO1xuICB2YXIgb3B0cyA9IHNldE9wdGlvbnMkMihvcHRpb25zKTtcblxuICAvLyBCZWdpbiBrLW1lZG9pZHMgYWxnb3JpdGhtXG4gIHZhciBjbHVzdGVycyA9IG5ldyBBcnJheShvcHRzLmspO1xuICB2YXIgbWVkb2lkcztcbiAgdmFyIGFzc2lnbm1lbnQgPSB7fTtcbiAgdmFyIGN1ckNvc3Q7XG4gIHZhciBtaW5Db3N0cyA9IG5ldyBBcnJheShvcHRzLmspOyAvLyBtaW5pbXVtIGNvc3QgY29uZmlndXJhdGlvbiBmb3IgZWFjaCBjbHVzdGVyXG5cbiAgLy8gU3RlcCAxOiBJbml0aWFsaXplIGsgbWVkb2lkc1xuICBpZiAob3B0cy50ZXN0TW9kZSkge1xuICAgIGlmICh0eXBlb2Ygb3B0cy50ZXN0Q2VudHJvaWRzID09PSAnbnVtYmVyJykgOyBlbHNlIGlmIChfdHlwZW9mKG9wdHMudGVzdENlbnRyb2lkcykgPT09ICdvYmplY3QnKSB7XG4gICAgICBtZWRvaWRzID0gb3B0cy50ZXN0Q2VudHJvaWRzO1xuICAgIH0gZWxzZSB7XG4gICAgICBtZWRvaWRzID0gcmFuZG9tTWVkb2lkcyhub2Rlcywgb3B0cy5rKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbWVkb2lkcyA9IHJhbmRvbU1lZG9pZHMobm9kZXMsIG9wdHMuayk7XG4gIH1cbiAgdmFyIGlzU3RpbGxNb3ZpbmcgPSB0cnVlO1xuICB2YXIgaXRlcmF0aW9ucyA9IDA7XG4gIHdoaWxlIChpc1N0aWxsTW92aW5nICYmIGl0ZXJhdGlvbnMgPCBvcHRzLm1heEl0ZXJhdGlvbnMpIHtcbiAgICAvLyBTdGVwIDI6IEFzc2lnbiBub2RlcyB0byB0aGUgbmVhcmVzdCBtZWRvaWRcbiAgICBmb3IgKHZhciBuID0gMDsgbiA8IG5vZGVzLmxlbmd0aDsgbisrKSB7XG4gICAgICBub2RlID0gbm9kZXNbbl07XG4gICAgICAvLyBEZXRlcm1pbmUgd2hpY2ggY2x1c3RlciB0aGlzIG5vZGUgYmVsb25ncyB0bzogbm9kZSBpZCA9PiBjbHVzdGVyICNcbiAgICAgIGFzc2lnbm1lbnRbbm9kZS5pZCgpXSA9IGNsYXNzaWZ5KG5vZGUsIG1lZG9pZHMsIG9wdHMuZGlzdGFuY2UsIG9wdHMuYXR0cmlidXRlcywgJ2tNZWRvaWRzJyk7XG4gICAgfVxuICAgIGlzU3RpbGxNb3ZpbmcgPSBmYWxzZTtcbiAgICAvLyBTdGVwIDM6IEZvciBlYWNoIG1lZG9pZCBtLCBhbmQgZm9yIGVhY2ggbm9kZSBhc3NvY2lhdGVkIHdpdGggbWVkaW9kIG0sXG4gICAgLy8gc2VsZWN0IHRoZSBub2RlIHdpdGggdGhlIGxvd2VzdCBjb25maWd1cmF0aW9uIGNvc3QgYXMgbmV3IG1lZG9pZC5cbiAgICBmb3IgKHZhciBtID0gMDsgbSA8IG1lZG9pZHMubGVuZ3RoOyBtKyspIHtcbiAgICAgIC8vIEdldCBhbGwgbm9kZXMgdGhhdCBiZWxvbmcgdG8gdGhpcyBtZWRvaWRcbiAgICAgIHZhciBjbHVzdGVyID0gYnVpbGRDbHVzdGVyKG0sIG5vZGVzLCBhc3NpZ25tZW50KTtcbiAgICAgIGlmIChjbHVzdGVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBJZiBjbHVzdGVyIGlzIGVtcHR5LCBicmVhayBvdXQgZWFybHkgJiBtb3ZlIHRvIG5leHQgY2x1c3RlclxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIG1pbkNvc3RzW21dID0gZmluZENvc3QobWVkb2lkc1ttXSwgY2x1c3Rlciwgb3B0cy5hdHRyaWJ1dGVzKTsgLy8gb3JpZ2luYWwgY29zdFxuXG4gICAgICAvLyBTZWxlY3QgZGlmZmVyZW50IG1lZG9pZCBpZiBpdHMgY29uZmlndXJhdGlvbiBoYXMgdGhlIGxvd2VzdCBjb3N0XG4gICAgICBmb3IgKHZhciBfbiA9IDA7IF9uIDwgY2x1c3Rlci5sZW5ndGg7IF9uKyspIHtcbiAgICAgICAgY3VyQ29zdCA9IGZpbmRDb3N0KGNsdXN0ZXJbX25dLCBjbHVzdGVyLCBvcHRzLmF0dHJpYnV0ZXMpO1xuICAgICAgICBpZiAoY3VyQ29zdCA8IG1pbkNvc3RzW21dKSB7XG4gICAgICAgICAgbWluQ29zdHNbbV0gPSBjdXJDb3N0O1xuICAgICAgICAgIG1lZG9pZHNbbV0gPSBjbHVzdGVyW19uXTtcbiAgICAgICAgICBpc1N0aWxsTW92aW5nID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2x1c3RlcnNbbV0gPSBjeS5jb2xsZWN0aW9uKGNsdXN0ZXIpO1xuICAgIH1cbiAgICBpdGVyYXRpb25zKys7XG4gIH1cbiAgcmV0dXJuIGNsdXN0ZXJzO1xufTtcbnZhciB1cGRhdGVDZW50cm9pZHMgPSBmdW5jdGlvbiB1cGRhdGVDZW50cm9pZHMoY2VudHJvaWRzLCBub2RlcywgVSwgd2VpZ2h0LCBvcHRzKSB7XG4gIHZhciBudW1lcmF0b3IsIGRlbm9taW5hdG9yO1xuICBmb3IgKHZhciBuID0gMDsgbiA8IG5vZGVzLmxlbmd0aDsgbisrKSB7XG4gICAgZm9yICh2YXIgYyA9IDA7IGMgPCBjZW50cm9pZHMubGVuZ3RoOyBjKyspIHtcbiAgICAgIHdlaWdodFtuXVtjXSA9IE1hdGgucG93KFVbbl1bY10sIG9wdHMubSk7XG4gICAgfVxuICB9XG4gIGZvciAodmFyIF9jID0gMDsgX2MgPCBjZW50cm9pZHMubGVuZ3RoOyBfYysrKSB7XG4gICAgZm9yICh2YXIgZGltID0gMDsgZGltIDwgb3B0cy5hdHRyaWJ1dGVzLmxlbmd0aDsgZGltKyspIHtcbiAgICAgIG51bWVyYXRvciA9IDA7XG4gICAgICBkZW5vbWluYXRvciA9IDA7XG4gICAgICBmb3IgKHZhciBfbjIgPSAwOyBfbjIgPCBub2Rlcy5sZW5ndGg7IF9uMisrKSB7XG4gICAgICAgIG51bWVyYXRvciArPSB3ZWlnaHRbX24yXVtfY10gKiBvcHRzLmF0dHJpYnV0ZXNbZGltXShub2Rlc1tfbjJdKTtcbiAgICAgICAgZGVub21pbmF0b3IgKz0gd2VpZ2h0W19uMl1bX2NdO1xuICAgICAgfVxuICAgICAgY2VudHJvaWRzW19jXVtkaW1dID0gbnVtZXJhdG9yIC8gZGVub21pbmF0b3I7XG4gICAgfVxuICB9XG59O1xudmFyIHVwZGF0ZU1lbWJlcnNoaXAgPSBmdW5jdGlvbiB1cGRhdGVNZW1iZXJzaGlwKFUsIF9VLCBjZW50cm9pZHMsIG5vZGVzLCBvcHRzKSB7XG4gIC8vIFNhdmUgcHJldmlvdXMgc3RlcFxuICBmb3IgKHZhciBpID0gMDsgaSA8IFUubGVuZ3RoOyBpKyspIHtcbiAgICBfVVtpXSA9IFVbaV0uc2xpY2UoKTtcbiAgfVxuICB2YXIgc3VtLCBudW1lcmF0b3IsIGRlbm9taW5hdG9yO1xuICB2YXIgcG93ID0gMiAvIChvcHRzLm0gLSAxKTtcbiAgZm9yICh2YXIgYyA9IDA7IGMgPCBjZW50cm9pZHMubGVuZ3RoOyBjKyspIHtcbiAgICBmb3IgKHZhciBuID0gMDsgbiA8IG5vZGVzLmxlbmd0aDsgbisrKSB7XG4gICAgICBzdW0gPSAwO1xuICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBjZW50cm9pZHMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgLy8gYWdhaW5zdCBhbGwgb3RoZXIgY2VudHJvaWRzXG4gICAgICAgIG51bWVyYXRvciA9IGdldERpc3Qob3B0cy5kaXN0YW5jZSwgbm9kZXNbbl0sIGNlbnRyb2lkc1tjXSwgb3B0cy5hdHRyaWJ1dGVzLCAnY21lYW5zJyk7XG4gICAgICAgIGRlbm9taW5hdG9yID0gZ2V0RGlzdChvcHRzLmRpc3RhbmNlLCBub2Rlc1tuXSwgY2VudHJvaWRzW2tdLCBvcHRzLmF0dHJpYnV0ZXMsICdjbWVhbnMnKTtcbiAgICAgICAgc3VtICs9IE1hdGgucG93KG51bWVyYXRvciAvIGRlbm9taW5hdG9yLCBwb3cpO1xuICAgICAgfVxuICAgICAgVVtuXVtjXSA9IDEgLyBzdW07XG4gICAgfVxuICB9XG59O1xudmFyIGFzc2lnbiQxID0gZnVuY3Rpb24gYXNzaWduKG5vZGVzLCBVLCBvcHRzLCBjeSkge1xuICB2YXIgY2x1c3RlcnMgPSBuZXcgQXJyYXkob3B0cy5rKTtcbiAgZm9yICh2YXIgYyA9IDA7IGMgPCBjbHVzdGVycy5sZW5ndGg7IGMrKykge1xuICAgIGNsdXN0ZXJzW2NdID0gW107XG4gIH1cbiAgdmFyIG1heDtcbiAgdmFyIGluZGV4O1xuICBmb3IgKHZhciBuID0gMDsgbiA8IFUubGVuZ3RoOyBuKyspIHtcbiAgICAvLyBmb3IgZWFjaCBub2RlIChVIGlzIE4geCBDIG1hdHJpeClcbiAgICBtYXggPSAtSW5maW5pdHk7XG4gICAgaW5kZXggPSAtMTtcbiAgICAvLyBEZXRlcm1pbmUgd2hpY2ggY2x1c3RlciB0aGUgbm9kZSBpcyBtb3N0IGxpa2VseSB0byBiZWxvbmcgaW5cbiAgICBmb3IgKHZhciBfYzIgPSAwOyBfYzIgPCBVWzBdLmxlbmd0aDsgX2MyKyspIHtcbiAgICAgIGlmIChVW25dW19jMl0gPiBtYXgpIHtcbiAgICAgICAgbWF4ID0gVVtuXVtfYzJdO1xuICAgICAgICBpbmRleCA9IF9jMjtcbiAgICAgIH1cbiAgICB9XG4gICAgY2x1c3RlcnNbaW5kZXhdLnB1c2gobm9kZXNbbl0pO1xuICB9XG5cbiAgLy8gVHVybiBldmVyeSBhcnJheSBpbnRvIGEgY29sbGVjdGlvbiBvZiBub2Rlc1xuICBmb3IgKHZhciBfYzMgPSAwOyBfYzMgPCBjbHVzdGVycy5sZW5ndGg7IF9jMysrKSB7XG4gICAgY2x1c3RlcnNbX2MzXSA9IGN5LmNvbGxlY3Rpb24oY2x1c3RlcnNbX2MzXSk7XG4gIH1cbiAgcmV0dXJuIGNsdXN0ZXJzO1xufTtcbnZhciBmdXp6eUNNZWFucyA9IGZ1bmN0aW9uIGZ1enp5Q01lYW5zKG9wdGlvbnMpIHtcbiAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICB2YXIgbm9kZXMgPSB0aGlzLm5vZGVzKCk7XG4gIHZhciBvcHRzID0gc2V0T3B0aW9ucyQyKG9wdGlvbnMpO1xuXG4gIC8vIEJlZ2luIGZ1enp5IGMtbWVhbnMgYWxnb3JpdGhtXG4gIHZhciBjbHVzdGVycztcbiAgdmFyIGNlbnRyb2lkcztcbiAgdmFyIFU7XG4gIHZhciBfVTtcbiAgdmFyIHdlaWdodDtcblxuICAvLyBTdGVwIDE6IEluaXRpYWxpemUgbGV0aWFibGVzLlxuICBfVSA9IG5ldyBBcnJheShub2Rlcy5sZW5ndGgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gTiB4IEMgbWF0cml4XG4gICAgX1VbaV0gPSBuZXcgQXJyYXkob3B0cy5rKTtcbiAgfVxuICBVID0gbmV3IEFycmF5KG5vZGVzLmxlbmd0aCk7XG4gIGZvciAodmFyIF9pMyA9IDA7IF9pMyA8IG5vZGVzLmxlbmd0aDsgX2kzKyspIHtcbiAgICAvLyBOIHggQyBtYXRyaXhcbiAgICBVW19pM10gPSBuZXcgQXJyYXkob3B0cy5rKTtcbiAgfVxuICBmb3IgKHZhciBfaTQgPSAwOyBfaTQgPCBub2Rlcy5sZW5ndGg7IF9pNCsrKSB7XG4gICAgdmFyIHRvdGFsID0gMDtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG9wdHMuazsgaisrKSB7XG4gICAgICBVW19pNF1bal0gPSBNYXRoLnJhbmRvbSgpO1xuICAgICAgdG90YWwgKz0gVVtfaTRdW2pdO1xuICAgIH1cbiAgICBmb3IgKHZhciBfaiA9IDA7IF9qIDwgb3B0cy5rOyBfaisrKSB7XG4gICAgICBVW19pNF1bX2pdID0gVVtfaTRdW19qXSAvIHRvdGFsO1xuICAgIH1cbiAgfVxuICBjZW50cm9pZHMgPSBuZXcgQXJyYXkob3B0cy5rKTtcbiAgZm9yICh2YXIgX2k1ID0gMDsgX2k1IDwgb3B0cy5rOyBfaTUrKykge1xuICAgIGNlbnRyb2lkc1tfaTVdID0gbmV3IEFycmF5KG9wdHMuYXR0cmlidXRlcy5sZW5ndGgpO1xuICB9XG4gIHdlaWdodCA9IG5ldyBBcnJheShub2Rlcy5sZW5ndGgpO1xuICBmb3IgKHZhciBfaTYgPSAwOyBfaTYgPCBub2Rlcy5sZW5ndGg7IF9pNisrKSB7XG4gICAgLy8gTiB4IEMgbWF0cml4XG4gICAgd2VpZ2h0W19pNl0gPSBuZXcgQXJyYXkob3B0cy5rKTtcbiAgfVxuICAvLyBlbmQgaW5pdCBGQ01cblxuICB2YXIgaXNTdGlsbE1vdmluZyA9IHRydWU7XG4gIHZhciBpdGVyYXRpb25zID0gMDtcbiAgd2hpbGUgKGlzU3RpbGxNb3ZpbmcgJiYgaXRlcmF0aW9ucyA8IG9wdHMubWF4SXRlcmF0aW9ucykge1xuICAgIGlzU3RpbGxNb3ZpbmcgPSBmYWxzZTtcblxuICAgIC8vIFN0ZXAgMjogQ2FsY3VsYXRlIHRoZSBjZW50cm9pZHMgZm9yIGVhY2ggc3RlcC5cbiAgICB1cGRhdGVDZW50cm9pZHMoY2VudHJvaWRzLCBub2RlcywgVSwgd2VpZ2h0LCBvcHRzKTtcblxuICAgIC8vIFN0ZXAgMzogVXBkYXRlIHRoZSBwYXJ0aXRpb24gbWF0cml4IFUuXG4gICAgdXBkYXRlTWVtYmVyc2hpcChVLCBfVSwgY2VudHJvaWRzLCBub2Rlcywgb3B0cyk7XG5cbiAgICAvLyBTdGVwIDQ6IENoZWNrIGZvciBjb252ZXJnZW5jZS5cbiAgICBpZiAoIWhhdmVNYXRyaWNlc0NvbnZlcmdlZChVLCBfVSwgb3B0cy5zZW5zaXRpdml0eVRocmVzaG9sZCkpIHtcbiAgICAgIGlzU3RpbGxNb3ZpbmcgPSB0cnVlO1xuICAgIH1cbiAgICBpdGVyYXRpb25zKys7XG4gIH1cblxuICAvLyBBc3NpZ24gbm9kZXMgdG8gY2x1c3RlcnMgd2l0aCBoaWdoZXN0IHByb2JhYmlsaXR5LlxuICBjbHVzdGVycyA9IGFzc2lnbiQxKG5vZGVzLCBVLCBvcHRzLCBjeSk7XG4gIHJldHVybiB7XG4gICAgY2x1c3RlcnM6IGNsdXN0ZXJzLFxuICAgIGRlZ3JlZU9mTWVtYmVyc2hpcDogVVxuICB9O1xufTtcbnZhciBrQ2x1c3RlcmluZyA9IHtcbiAga01lYW5zOiBrTWVhbnMsXG4gIGtNZWRvaWRzOiBrTWVkb2lkcyxcbiAgZnV6enlDTWVhbnM6IGZ1enp5Q01lYW5zLFxuICBmY206IGZ1enp5Q01lYW5zXG59O1xuXG4vLyBJbXBsZW1lbnRlZCBieSBab2UgWGkgQHpvZXhpIGZvciBHU09DIDIwMTZcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jeXRvc2NhcGUvY3l0b3NjYXBlLmpzLWhpZXJhcmNoaWNhbFxuXG52YXIgZGVmYXVsdHMkYSA9IGRlZmF1bHRzJGcoe1xuICBkaXN0YW5jZTogJ2V1Y2xpZGVhbicsXG4gIC8vIGRpc3RhbmNlIG1ldHJpYyB0byBjb21wYXJlIG5vZGVzXG4gIGxpbmthZ2U6ICdtaW4nLFxuICAvLyBsaW5rYWdlIGNyaXRlcmlvbiA6IGhvdyB0byBkZXRlcm1pbmUgdGhlIGRpc3RhbmNlIGJldHdlZW4gY2x1c3RlcnMgb2Ygbm9kZXNcbiAgbW9kZTogJ3RocmVzaG9sZCcsXG4gIC8vIG1vZGU6J3RocmVzaG9sZCcgPT4gY2x1c3RlcnMgbXVzdCBiZSB0aHJlc2hvbGQgZGlzdGFuY2UgYXBhcnRcbiAgdGhyZXNob2xkOiBJbmZpbml0eSxcbiAgLy8gdGhlIGRpc3RhbmNlIHRocmVzaG9sZFxuICAvLyBtb2RlOidkZW5kcm9ncmFtJyA9PiB0aGUgbm9kZXMgYXJlIG9yZ2FuaXNlZCBhcyBsZWF2ZXMgaW4gYSB0cmVlIChzaWJsaW5ncyBhcmUgY2xvc2UpLCBtZXJnaW5nIG1ha2VzIGNsdXN0ZXJzXG4gIGFkZERlbmRyb2dyYW06IGZhbHNlLFxuICAvLyB3aGV0aGVyIHRvIGFkZCB0aGUgZGVuZHJvZ3JhbSB0byB0aGUgZ3JhcGggZm9yIHZpelxuICBkZW5kcm9ncmFtRGVwdGg6IDAsXG4gIC8vIGRlcHRoIGF0IHdoaWNoIGRlbmRyb2dyYW0gYnJhbmNoZXMgYXJlIG1lcmdlZCBpbnRvIHRoZSByZXR1cm5lZCBjbHVzdGVyc1xuICBhdHRyaWJ1dGVzOiBbXSAvLyBhcnJheSBvZiBhdHRyIGZ1bmN0aW9uc1xufSk7XG52YXIgbGlua2FnZUFsaWFzZXMgPSB7XG4gICdzaW5nbGUnOiAnbWluJyxcbiAgJ2NvbXBsZXRlJzogJ21heCdcbn07XG52YXIgc2V0T3B0aW9ucyQxID0gZnVuY3Rpb24gc2V0T3B0aW9ucyhvcHRpb25zKSB7XG4gIHZhciBvcHRzID0gZGVmYXVsdHMkYShvcHRpb25zKTtcbiAgdmFyIHByZWZlcnJlZEFsaWFzID0gbGlua2FnZUFsaWFzZXNbb3B0cy5saW5rYWdlXTtcbiAgaWYgKHByZWZlcnJlZEFsaWFzICE9IG51bGwpIHtcbiAgICBvcHRzLmxpbmthZ2UgPSBwcmVmZXJyZWRBbGlhcztcbiAgfVxuICByZXR1cm4gb3B0cztcbn07XG52YXIgbWVyZ2VDbG9zZXN0ID0gZnVuY3Rpb24gbWVyZ2VDbG9zZXN0KGNsdXN0ZXJzLCBpbmRleCwgZGlzdHMsIG1pbnMsIG9wdHMpIHtcbiAgLy8gRmluZCB0d28gY2xvc2VzdCBjbHVzdGVycyBmcm9tIGNhY2hlZCBtaW5zXG4gIHZhciBtaW5LZXkgPSAwO1xuICB2YXIgbWluID0gSW5maW5pdHk7XG4gIHZhciBkaXN0O1xuICB2YXIgYXR0cnMgPSBvcHRzLmF0dHJpYnV0ZXM7XG4gIHZhciBnZXREaXN0ID0gZnVuY3Rpb24gZ2V0RGlzdChuMSwgbjIpIHtcbiAgICByZXR1cm4gY2x1c3RlcmluZ0Rpc3RhbmNlKG9wdHMuZGlzdGFuY2UsIGF0dHJzLmxlbmd0aCwgZnVuY3Rpb24gKGkpIHtcbiAgICAgIHJldHVybiBhdHRyc1tpXShuMSk7XG4gICAgfSwgZnVuY3Rpb24gKGkpIHtcbiAgICAgIHJldHVybiBhdHRyc1tpXShuMik7XG4gICAgfSwgbjEsIG4yKTtcbiAgfTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbHVzdGVycy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBrZXkgPSBjbHVzdGVyc1tpXS5rZXk7XG4gICAgdmFyIF9kaXN0ID0gZGlzdHNba2V5XVttaW5zW2tleV1dO1xuICAgIGlmIChfZGlzdCA8IG1pbikge1xuICAgICAgbWluS2V5ID0ga2V5O1xuICAgICAgbWluID0gX2Rpc3Q7XG4gICAgfVxuICB9XG4gIGlmIChvcHRzLm1vZGUgPT09ICd0aHJlc2hvbGQnICYmIG1pbiA+PSBvcHRzLnRocmVzaG9sZCB8fCBvcHRzLm1vZGUgPT09ICdkZW5kcm9ncmFtJyAmJiBjbHVzdGVycy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIGMxID0gaW5kZXhbbWluS2V5XTtcbiAgdmFyIGMyID0gaW5kZXhbbWluc1ttaW5LZXldXTtcbiAgdmFyIG1lcmdlZDtcblxuICAvLyBNZXJnZSB0d28gY2xvc2VzdCBjbHVzdGVyc1xuICBpZiAob3B0cy5tb2RlID09PSAnZGVuZHJvZ3JhbScpIHtcbiAgICBtZXJnZWQgPSB7XG4gICAgICBsZWZ0OiBjMSxcbiAgICAgIHJpZ2h0OiBjMixcbiAgICAgIGtleTogYzEua2V5XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBtZXJnZWQgPSB7XG4gICAgICB2YWx1ZTogYzEudmFsdWUuY29uY2F0KGMyLnZhbHVlKSxcbiAgICAgIGtleTogYzEua2V5XG4gICAgfTtcbiAgfVxuICBjbHVzdGVyc1tjMS5pbmRleF0gPSBtZXJnZWQ7XG4gIGNsdXN0ZXJzLnNwbGljZShjMi5pbmRleCwgMSk7XG4gIGluZGV4W2MxLmtleV0gPSBtZXJnZWQ7XG5cbiAgLy8gVXBkYXRlIGRpc3RhbmNlcyB3aXRoIG5ldyBtZXJnZWQgY2x1c3RlclxuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgY2x1c3RlcnMubGVuZ3RoOyBfaSsrKSB7XG4gICAgdmFyIGN1ciA9IGNsdXN0ZXJzW19pXTtcbiAgICBpZiAoYzEua2V5ID09PSBjdXIua2V5KSB7XG4gICAgICBkaXN0ID0gSW5maW5pdHk7XG4gICAgfSBlbHNlIGlmIChvcHRzLmxpbmthZ2UgPT09ICdtaW4nKSB7XG4gICAgICBkaXN0ID0gZGlzdHNbYzEua2V5XVtjdXIua2V5XTtcbiAgICAgIGlmIChkaXN0c1tjMS5rZXldW2N1ci5rZXldID4gZGlzdHNbYzIua2V5XVtjdXIua2V5XSkge1xuICAgICAgICBkaXN0ID0gZGlzdHNbYzIua2V5XVtjdXIua2V5XTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG9wdHMubGlua2FnZSA9PT0gJ21heCcpIHtcbiAgICAgIGRpc3QgPSBkaXN0c1tjMS5rZXldW2N1ci5rZXldO1xuICAgICAgaWYgKGRpc3RzW2MxLmtleV1bY3VyLmtleV0gPCBkaXN0c1tjMi5rZXldW2N1ci5rZXldKSB7XG4gICAgICAgIGRpc3QgPSBkaXN0c1tjMi5rZXldW2N1ci5rZXldO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAob3B0cy5saW5rYWdlID09PSAnbWVhbicpIHtcbiAgICAgIGRpc3QgPSAoZGlzdHNbYzEua2V5XVtjdXIua2V5XSAqIGMxLnNpemUgKyBkaXN0c1tjMi5rZXldW2N1ci5rZXldICogYzIuc2l6ZSkgLyAoYzEuc2l6ZSArIGMyLnNpemUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAob3B0cy5tb2RlID09PSAnZGVuZHJvZ3JhbScpIGRpc3QgPSBnZXREaXN0KGN1ci52YWx1ZSwgYzEudmFsdWUpO2Vsc2UgZGlzdCA9IGdldERpc3QoY3VyLnZhbHVlWzBdLCBjMS52YWx1ZVswXSk7XG4gICAgfVxuICAgIGRpc3RzW2MxLmtleV1bY3VyLmtleV0gPSBkaXN0c1tjdXIua2V5XVtjMS5rZXldID0gZGlzdDsgLy8gZGlzdGFuY2UgbWF0cml4IGlzIHN5bW1ldHJpY1xuICB9XG5cbiAgLy8gVXBkYXRlIGNhY2hlZCBtaW5zXG4gIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IGNsdXN0ZXJzLmxlbmd0aDsgX2kyKyspIHtcbiAgICB2YXIga2V5MSA9IGNsdXN0ZXJzW19pMl0ua2V5O1xuICAgIGlmIChtaW5zW2tleTFdID09PSBjMS5rZXkgfHwgbWluc1trZXkxXSA9PT0gYzIua2V5KSB7XG4gICAgICB2YXIgX21pbiA9IGtleTE7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNsdXN0ZXJzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBrZXkyID0gY2x1c3RlcnNbal0ua2V5O1xuICAgICAgICBpZiAoZGlzdHNba2V5MV1ba2V5Ml0gPCBkaXN0c1trZXkxXVtfbWluXSkge1xuICAgICAgICAgIF9taW4gPSBrZXkyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBtaW5zW2tleTFdID0gX21pbjtcbiAgICB9XG4gICAgY2x1c3RlcnNbX2kyXS5pbmRleCA9IF9pMjtcbiAgfVxuXG4gIC8vIENsZWFuIHVwIG1ldGEgZGF0YSB1c2VkIGZvciBjbHVzdGVyaW5nXG4gIGMxLmtleSA9IGMyLmtleSA9IGMxLmluZGV4ID0gYzIuaW5kZXggPSBudWxsO1xuICByZXR1cm4gdHJ1ZTtcbn07XG52YXIgX2dldEFsbENoaWxkcmVuID0gZnVuY3Rpb24gZ2V0QWxsQ2hpbGRyZW4ocm9vdCwgYXJyLCBjeSkge1xuICBpZiAoIXJvb3QpIHJldHVybjtcbiAgaWYgKHJvb3QudmFsdWUpIHtcbiAgICBhcnIucHVzaChyb290LnZhbHVlKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAocm9vdC5sZWZ0KSBfZ2V0QWxsQ2hpbGRyZW4ocm9vdC5sZWZ0LCBhcnIpO1xuICAgIGlmIChyb290LnJpZ2h0KSBfZ2V0QWxsQ2hpbGRyZW4ocm9vdC5yaWdodCwgYXJyKTtcbiAgfVxufTtcbnZhciBfYnVpbGREZW5kcm9ncmFtID0gZnVuY3Rpb24gYnVpbGREZW5kcm9ncmFtKHJvb3QsIGN5KSB7XG4gIGlmICghcm9vdCkgcmV0dXJuICcnO1xuICBpZiAocm9vdC5sZWZ0ICYmIHJvb3QucmlnaHQpIHtcbiAgICB2YXIgbGVmdFN0ciA9IF9idWlsZERlbmRyb2dyYW0ocm9vdC5sZWZ0LCBjeSk7XG4gICAgdmFyIHJpZ2h0U3RyID0gX2J1aWxkRGVuZHJvZ3JhbShyb290LnJpZ2h0LCBjeSk7XG4gICAgdmFyIG5vZGUgPSBjeS5hZGQoe1xuICAgICAgZ3JvdXA6ICdub2RlcycsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIGlkOiBsZWZ0U3RyICsgJywnICsgcmlnaHRTdHJcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjeS5hZGQoe1xuICAgICAgZ3JvdXA6ICdlZGdlcycsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIHNvdXJjZTogbGVmdFN0cixcbiAgICAgICAgdGFyZ2V0OiBub2RlLmlkKClcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjeS5hZGQoe1xuICAgICAgZ3JvdXA6ICdlZGdlcycsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIHNvdXJjZTogcmlnaHRTdHIsXG4gICAgICAgIHRhcmdldDogbm9kZS5pZCgpXG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG5vZGUuaWQoKTtcbiAgfSBlbHNlIGlmIChyb290LnZhbHVlKSB7XG4gICAgcmV0dXJuIHJvb3QudmFsdWUuaWQoKTtcbiAgfVxufTtcbnZhciBfYnVpbGRDbHVzdGVyc0Zyb21UcmVlID0gZnVuY3Rpb24gYnVpbGRDbHVzdGVyc0Zyb21UcmVlKHJvb3QsIGssIGN5KSB7XG4gIGlmICghcm9vdCkgcmV0dXJuIFtdO1xuICB2YXIgbGVmdCA9IFtdLFxuICAgIHJpZ2h0ID0gW10sXG4gICAgbGVhdmVzID0gW107XG4gIGlmIChrID09PSAwKSB7XG4gICAgLy8gZG9uJ3QgY3V0IHRyZWUsIHNpbXBseSByZXR1cm4gYWxsIG5vZGVzIGFzIDEgc2luZ2xlIGNsdXN0ZXJcbiAgICBpZiAocm9vdC5sZWZ0KSBfZ2V0QWxsQ2hpbGRyZW4ocm9vdC5sZWZ0LCBsZWZ0KTtcbiAgICBpZiAocm9vdC5yaWdodCkgX2dldEFsbENoaWxkcmVuKHJvb3QucmlnaHQsIHJpZ2h0KTtcbiAgICBsZWF2ZXMgPSBsZWZ0LmNvbmNhdChyaWdodCk7XG4gICAgcmV0dXJuIFtjeS5jb2xsZWN0aW9uKGxlYXZlcyldO1xuICB9IGVsc2UgaWYgKGsgPT09IDEpIHtcbiAgICAvLyBjdXQgYXQgcm9vdFxuXG4gICAgaWYgKHJvb3QudmFsdWUpIHtcbiAgICAgIC8vIGxlYWYgbm9kZVxuICAgICAgcmV0dXJuIFtjeS5jb2xsZWN0aW9uKHJvb3QudmFsdWUpXTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHJvb3QubGVmdCkgX2dldEFsbENoaWxkcmVuKHJvb3QubGVmdCwgbGVmdCk7XG4gICAgICBpZiAocm9vdC5yaWdodCkgX2dldEFsbENoaWxkcmVuKHJvb3QucmlnaHQsIHJpZ2h0KTtcbiAgICAgIHJldHVybiBbY3kuY29sbGVjdGlvbihsZWZ0KSwgY3kuY29sbGVjdGlvbihyaWdodCldO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAocm9vdC52YWx1ZSkge1xuICAgICAgcmV0dXJuIFtjeS5jb2xsZWN0aW9uKHJvb3QudmFsdWUpXTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHJvb3QubGVmdCkgbGVmdCA9IF9idWlsZENsdXN0ZXJzRnJvbVRyZWUocm9vdC5sZWZ0LCBrIC0gMSwgY3kpO1xuICAgICAgaWYgKHJvb3QucmlnaHQpIHJpZ2h0ID0gX2J1aWxkQ2x1c3RlcnNGcm9tVHJlZShyb290LnJpZ2h0LCBrIC0gMSwgY3kpO1xuICAgICAgcmV0dXJuIGxlZnQuY29uY2F0KHJpZ2h0KTtcbiAgICB9XG4gIH1cbn07XG5cbnZhciBoaWVyYXJjaGljYWxDbHVzdGVyaW5nID0gZnVuY3Rpb24gaGllcmFyY2hpY2FsQ2x1c3RlcmluZyhvcHRpb25zKSB7XG4gIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgdmFyIG5vZGVzID0gdGhpcy5ub2RlcygpO1xuXG4gIC8vIFNldCBwYXJhbWV0ZXJzIG9mIGFsZ29yaXRobTogbGlua2FnZSB0eXBlLCBkaXN0YW5jZSBtZXRyaWMsIGV0Yy5cbiAgdmFyIG9wdHMgPSBzZXRPcHRpb25zJDEob3B0aW9ucyk7XG4gIHZhciBhdHRycyA9IG9wdHMuYXR0cmlidXRlcztcbiAgdmFyIGdldERpc3QgPSBmdW5jdGlvbiBnZXREaXN0KG4xLCBuMikge1xuICAgIHJldHVybiBjbHVzdGVyaW5nRGlzdGFuY2Uob3B0cy5kaXN0YW5jZSwgYXR0cnMubGVuZ3RoLCBmdW5jdGlvbiAoaSkge1xuICAgICAgcmV0dXJuIGF0dHJzW2ldKG4xKTtcbiAgICB9LCBmdW5jdGlvbiAoaSkge1xuICAgICAgcmV0dXJuIGF0dHJzW2ldKG4yKTtcbiAgICB9LCBuMSwgbjIpO1xuICB9O1xuXG4gIC8vIEJlZ2luIGhpZXJhcmNoaWNhbCBhbGdvcml0aG1cbiAgdmFyIGNsdXN0ZXJzID0gW107XG4gIHZhciBkaXN0cyA9IFtdOyAvLyBkaXN0YW5jZXMgYmV0d2VlbiBlYWNoIHBhaXIgb2YgY2x1c3RlcnNcbiAgdmFyIG1pbnMgPSBbXTsgLy8gY2xvc2VzdCBjbHVzdGVyIGZvciBlYWNoIGNsdXN0ZXJcbiAgdmFyIGluZGV4ID0gW107IC8vIGhhc2ggb2YgYWxsIGNsdXN0ZXJzIGJ5IGtleVxuXG4gIC8vIEluIGFnZ2xvbWVyYXRpdmUgKGJvdHRvbS11cCkgY2x1c3RlcmluZywgZWFjaCBub2RlIHN0YXJ0cyBhcyBpdHMgb3duIGNsdXN0ZXJcbiAgZm9yICh2YXIgbiA9IDA7IG4gPCBub2Rlcy5sZW5ndGg7IG4rKykge1xuICAgIHZhciBjbHVzdGVyID0ge1xuICAgICAgdmFsdWU6IG9wdHMubW9kZSA9PT0gJ2RlbmRyb2dyYW0nID8gbm9kZXNbbl0gOiBbbm9kZXNbbl1dLFxuICAgICAga2V5OiBuLFxuICAgICAgaW5kZXg6IG5cbiAgICB9O1xuICAgIGNsdXN0ZXJzW25dID0gY2x1c3RlcjtcbiAgICBpbmRleFtuXSA9IGNsdXN0ZXI7XG4gICAgZGlzdHNbbl0gPSBbXTtcbiAgICBtaW5zW25dID0gMDtcbiAgfVxuXG4gIC8vIENhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgYmV0d2VlbiBlYWNoIHBhaXIgb2YgY2x1c3RlcnNcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbHVzdGVycy5sZW5ndGg7IGkrKykge1xuICAgIGZvciAodmFyIGogPSAwOyBqIDw9IGk7IGorKykge1xuICAgICAgdmFyIGRpc3QgPSB2b2lkIDA7XG4gICAgICBpZiAob3B0cy5tb2RlID09PSAnZGVuZHJvZ3JhbScpIHtcbiAgICAgICAgLy8gbW9kZXMgc3RvcmUgY2x1c3RlciB2YWx1ZXMgZGlmZmVyZW50bHlcbiAgICAgICAgZGlzdCA9IGkgPT09IGogPyBJbmZpbml0eSA6IGdldERpc3QoY2x1c3RlcnNbaV0udmFsdWUsIGNsdXN0ZXJzW2pdLnZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRpc3QgPSBpID09PSBqID8gSW5maW5pdHkgOiBnZXREaXN0KGNsdXN0ZXJzW2ldLnZhbHVlWzBdLCBjbHVzdGVyc1tqXS52YWx1ZVswXSk7XG4gICAgICB9XG4gICAgICBkaXN0c1tpXVtqXSA9IGRpc3Q7XG4gICAgICBkaXN0c1tqXVtpXSA9IGRpc3Q7XG4gICAgICBpZiAoZGlzdCA8IGRpc3RzW2ldW21pbnNbaV1dKSB7XG4gICAgICAgIG1pbnNbaV0gPSBqOyAvLyBDYWNoZSBtaW5zOiBjbG9zZXN0IGNsdXN0ZXIgdG8gY2x1c3RlciBpIGlzIGNsdXN0ZXIgalxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEZpbmQgdGhlIGNsb3Nlc3QgcGFpciBvZiBjbHVzdGVycyBhbmQgbWVyZ2UgdGhlbSBpbnRvIGEgc2luZ2xlIGNsdXN0ZXIuXG4gIC8vIFVwZGF0ZSBkaXN0YW5jZXMgYmV0d2VlbiBuZXcgY2x1c3RlciBhbmQgZWFjaCBvZiB0aGUgb2xkIGNsdXN0ZXJzLCBhbmQgbG9vcCB1bnRpbCB0aHJlc2hvbGQgcmVhY2hlZC5cbiAgdmFyIG1lcmdlZCA9IG1lcmdlQ2xvc2VzdChjbHVzdGVycywgaW5kZXgsIGRpc3RzLCBtaW5zLCBvcHRzKTtcbiAgd2hpbGUgKG1lcmdlZCkge1xuICAgIG1lcmdlZCA9IG1lcmdlQ2xvc2VzdChjbHVzdGVycywgaW5kZXgsIGRpc3RzLCBtaW5zLCBvcHRzKTtcbiAgfVxuICB2YXIgcmV0Q2x1c3RlcnM7XG5cbiAgLy8gRGVuZHJvZ3JhbSBtb2RlIGJ1aWxkcyB0aGUgaGllcmFyY2h5IGFuZCBhZGRzIGludGVybWVkaWFyeSBub2RlcyArIGVkZ2VzXG4gIC8vIGluIGFkZGl0aW9uIHRvIHJldHVybmluZyB0aGUgY2x1c3RlcnMuXG4gIGlmIChvcHRzLm1vZGUgPT09ICdkZW5kcm9ncmFtJykge1xuICAgIHJldENsdXN0ZXJzID0gX2J1aWxkQ2x1c3RlcnNGcm9tVHJlZShjbHVzdGVyc1swXSwgb3B0cy5kZW5kcm9ncmFtRGVwdGgsIGN5KTtcbiAgICBpZiAob3B0cy5hZGREZW5kcm9ncmFtKSBfYnVpbGREZW5kcm9ncmFtKGNsdXN0ZXJzWzBdLCBjeSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gUmVndWxhciBtb2RlIHNpbXBseSByZXR1cm5zIHRoZSBjbHVzdGVyc1xuXG4gICAgcmV0Q2x1c3RlcnMgPSBuZXcgQXJyYXkoY2x1c3RlcnMubGVuZ3RoKTtcbiAgICBjbHVzdGVycy5mb3JFYWNoKGZ1bmN0aW9uIChjbHVzdGVyLCBpKSB7XG4gICAgICAvLyBDbGVhbiB1cCBtZXRhIGRhdGEgdXNlZCBmb3IgY2x1c3RlcmluZ1xuICAgICAgY2x1c3Rlci5rZXkgPSBjbHVzdGVyLmluZGV4ID0gbnVsbDtcbiAgICAgIHJldENsdXN0ZXJzW2ldID0gY3kuY29sbGVjdGlvbihjbHVzdGVyLnZhbHVlKTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcmV0Q2x1c3RlcnM7XG59O1xudmFyIGhpZXJhcmNoaWNhbENsdXN0ZXJpbmckMSA9IHtcbiAgaGllcmFyY2hpY2FsQ2x1c3RlcmluZzogaGllcmFyY2hpY2FsQ2x1c3RlcmluZyxcbiAgaGNhOiBoaWVyYXJjaGljYWxDbHVzdGVyaW5nXG59O1xuXG4vLyBJbXBsZW1lbnRlZCBieSBab2UgWGkgQHpvZXhpIGZvciBHU09DIDIwMTZcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jeXRvc2NhcGUvY3l0b3NjYXBlLmpzLWFmZmluaXR5LXByb3BhZ2F0aW9uXG5cbnZhciBkZWZhdWx0cyQ5ID0gZGVmYXVsdHMkZyh7XG4gIGRpc3RhbmNlOiAnZXVjbGlkZWFuJyxcbiAgLy8gZGlzdGFuY2UgbWV0cmljIHRvIGNvbXBhcmUgYXR0cmlidXRlcyBiZXR3ZWVuIHR3byBub2Rlc1xuICBwcmVmZXJlbmNlOiAnbWVkaWFuJyxcbiAgLy8gc3VpdGFiaWxpdHkgb2YgYSBkYXRhIHBvaW50IHRvIHNlcnZlIGFzIGFuIGV4ZW1wbGFyXG4gIGRhbXBpbmc6IDAuOCxcbiAgLy8gZGFtcGluZyBmYWN0b3IgYmV0d2VlbiBbMC41LCAxKVxuICBtYXhJdGVyYXRpb25zOiAxMDAwLFxuICAvLyBtYXggbnVtYmVyIG9mIGl0ZXJhdGlvbnMgdG8gcnVuXG4gIG1pbkl0ZXJhdGlvbnM6IDEwMCxcbiAgLy8gbWluIG51bWJlciBvZiBpdGVyYXRpb25zIHRvIHJ1biBpbiBvcmRlciBmb3IgY2x1c3RlcmluZyB0byBzdG9wXG4gIGF0dHJpYnV0ZXM6IFsvLyBmdW5jdGlvbnMgdG8gcXVhbnRpZnkgdGhlIHNpbWlsYXJpdHkgYmV0d2VlbiBhbnkgdHdvIHBvaW50c1xuICAgIC8vIGUuZy4gbm9kZSA9PiBub2RlLmRhdGEoJ3dlaWdodCcpXG4gIF1cbn0pO1xudmFyIHNldE9wdGlvbnMgPSBmdW5jdGlvbiBzZXRPcHRpb25zKG9wdGlvbnMpIHtcbiAgdmFyIGRtcCA9IG9wdGlvbnMuZGFtcGluZztcbiAgdmFyIHByZWYgPSBvcHRpb25zLnByZWZlcmVuY2U7XG4gIGlmICghKDAuNSA8PSBkbXAgJiYgZG1wIDwgMSkpIHtcbiAgICBlcnJvcihcIkRhbXBpbmcgbXVzdCByYW5nZSBvbiBbMC41LCAxKS4gIEdvdDogXCIuY29uY2F0KGRtcCkpO1xuICB9XG4gIHZhciB2YWxpZFByZWZzID0gWydtZWRpYW4nLCAnbWVhbicsICdtaW4nLCAnbWF4J107XG4gIGlmICghKHZhbGlkUHJlZnMuc29tZShmdW5jdGlvbiAodikge1xuICAgIHJldHVybiB2ID09PSBwcmVmO1xuICB9KSB8fCBudW1iZXIkMShwcmVmKSkpIHtcbiAgICBlcnJvcihcIlByZWZlcmVuY2UgbXVzdCBiZSBvbmUgb2YgW1wiLmNvbmNhdCh2YWxpZFByZWZzLm1hcChmdW5jdGlvbiAocCkge1xuICAgICAgcmV0dXJuIFwiJ1wiLmNvbmNhdChwLCBcIidcIik7XG4gICAgfSkuam9pbignLCAnKSwgXCJdIG9yIGEgbnVtYmVyLiAgR290OiBcIikuY29uY2F0KHByZWYpKTtcbiAgfVxuICByZXR1cm4gZGVmYXVsdHMkOShvcHRpb25zKTtcbn07XG5cbnZhciBnZXRTaW1pbGFyaXR5ID0gZnVuY3Rpb24gZ2V0U2ltaWxhcml0eSh0eXBlLCBuMSwgbjIsIGF0dHJpYnV0ZXMpIHtcbiAgdmFyIGF0dHIgPSBmdW5jdGlvbiBhdHRyKG4sIGkpIHtcbiAgICByZXR1cm4gYXR0cmlidXRlc1tpXShuKTtcbiAgfTtcblxuICAvLyBuYiBuZWdhdGl2ZSBiZWNhdXNlIHNpbWlsYXJpdHkgc2hvdWxkIGhhdmUgYW4gaW52ZXJzZSByZWxhdGlvbnNoaXAgdG8gZGlzdGFuY2VcbiAgcmV0dXJuIC1jbHVzdGVyaW5nRGlzdGFuY2UodHlwZSwgYXR0cmlidXRlcy5sZW5ndGgsIGZ1bmN0aW9uIChpKSB7XG4gICAgcmV0dXJuIGF0dHIobjEsIGkpO1xuICB9LCBmdW5jdGlvbiAoaSkge1xuICAgIHJldHVybiBhdHRyKG4yLCBpKTtcbiAgfSwgbjEsIG4yKTtcbn07XG52YXIgZ2V0UHJlZmVyZW5jZSA9IGZ1bmN0aW9uIGdldFByZWZlcmVuY2UoUywgcHJlZmVyZW5jZSkge1xuICAvLyBsYXJnZXIgcHJlZmVyZW5jZSA9IGdyZWF0ZXIgIyBvZiBjbHVzdGVyc1xuICB2YXIgcCA9IG51bGw7XG4gIGlmIChwcmVmZXJlbmNlID09PSAnbWVkaWFuJykge1xuICAgIHAgPSBtZWRpYW4oUyk7XG4gIH0gZWxzZSBpZiAocHJlZmVyZW5jZSA9PT0gJ21lYW4nKSB7XG4gICAgcCA9IG1lYW4oUyk7XG4gIH0gZWxzZSBpZiAocHJlZmVyZW5jZSA9PT0gJ21pbicpIHtcbiAgICBwID0gbWluKFMpO1xuICB9IGVsc2UgaWYgKHByZWZlcmVuY2UgPT09ICdtYXgnKSB7XG4gICAgcCA9IG1heChTKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBDdXN0b20gcHJlZmVyZW5jZSBudW1iZXIsIGFzIHNldCBieSB1c2VyXG4gICAgcCA9IHByZWZlcmVuY2U7XG4gIH1cbiAgcmV0dXJuIHA7XG59O1xudmFyIGZpbmRFeGVtcGxhcnMgPSBmdW5jdGlvbiBmaW5kRXhlbXBsYXJzKG4sIFIsIEEpIHtcbiAgdmFyIGluZGljZXMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICBpZiAoUltpICogbiArIGldICsgQVtpICogbiArIGldID4gMCkge1xuICAgICAgaW5kaWNlcy5wdXNoKGkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaW5kaWNlcztcbn07XG52YXIgYXNzaWduQ2x1c3RlcnMgPSBmdW5jdGlvbiBhc3NpZ25DbHVzdGVycyhuLCBTLCBleGVtcGxhcnMpIHtcbiAgdmFyIGNsdXN0ZXJzID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgdmFyIGluZGV4ID0gLTE7XG4gICAgdmFyIG1heCA9IC1JbmZpbml0eTtcbiAgICBmb3IgKHZhciBlaSA9IDA7IGVpIDwgZXhlbXBsYXJzLmxlbmd0aDsgZWkrKykge1xuICAgICAgdmFyIGUgPSBleGVtcGxhcnNbZWldO1xuICAgICAgaWYgKFNbaSAqIG4gKyBlXSA+IG1heCkge1xuICAgICAgICBpbmRleCA9IGU7XG4gICAgICAgIG1heCA9IFNbaSAqIG4gKyBlXTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGluZGV4ID4gMCkge1xuICAgICAgY2x1c3RlcnMucHVzaChpbmRleCk7XG4gICAgfVxuICB9XG4gIGZvciAodmFyIF9laSA9IDA7IF9laSA8IGV4ZW1wbGFycy5sZW5ndGg7IF9laSsrKSB7XG4gICAgY2x1c3RlcnNbZXhlbXBsYXJzW19laV1dID0gZXhlbXBsYXJzW19laV07XG4gIH1cbiAgcmV0dXJuIGNsdXN0ZXJzO1xufTtcbnZhciBhc3NpZ24gPSBmdW5jdGlvbiBhc3NpZ24obiwgUywgZXhlbXBsYXJzKSB7XG4gIHZhciBjbHVzdGVycyA9IGFzc2lnbkNsdXN0ZXJzKG4sIFMsIGV4ZW1wbGFycyk7XG4gIGZvciAodmFyIGVpID0gMDsgZWkgPCBleGVtcGxhcnMubGVuZ3RoOyBlaSsrKSB7XG4gICAgdmFyIGlpID0gW107XG4gICAgZm9yICh2YXIgYyA9IDA7IGMgPCBjbHVzdGVycy5sZW5ndGg7IGMrKykge1xuICAgICAgaWYgKGNsdXN0ZXJzW2NdID09PSBleGVtcGxhcnNbZWldKSB7XG4gICAgICAgIGlpLnB1c2goYyk7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBtYXhJID0gLTE7XG4gICAgdmFyIG1heFN1bSA9IC1JbmZpbml0eTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlpLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc3VtID0gMDtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgaWkubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgc3VtICs9IFNbaWlbal0gKiBuICsgaWlbaV1dO1xuICAgICAgfVxuICAgICAgaWYgKHN1bSA+IG1heFN1bSkge1xuICAgICAgICBtYXhJID0gaTtcbiAgICAgICAgbWF4U3VtID0gc3VtO1xuICAgICAgfVxuICAgIH1cbiAgICBleGVtcGxhcnNbZWldID0gaWlbbWF4SV07XG4gIH1cbiAgY2x1c3RlcnMgPSBhc3NpZ25DbHVzdGVycyhuLCBTLCBleGVtcGxhcnMpO1xuICByZXR1cm4gY2x1c3RlcnM7XG59O1xudmFyIGFmZmluaXR5UHJvcGFnYXRpb24gPSBmdW5jdGlvbiBhZmZpbml0eVByb3BhZ2F0aW9uKG9wdGlvbnMpIHtcbiAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICB2YXIgbm9kZXMgPSB0aGlzLm5vZGVzKCk7XG4gIHZhciBvcHRzID0gc2V0T3B0aW9ucyhvcHRpb25zKTtcblxuICAvLyBNYXAgZWFjaCBub2RlIHRvIGl0cyBwb3NpdGlvbiBpbiBub2RlIGFycmF5XG4gIHZhciBpZDJwb3NpdGlvbiA9IHt9O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWQycG9zaXRpb25bbm9kZXNbaV0uaWQoKV0gPSBpO1xuICB9XG5cbiAgLy8gQmVnaW4gYWZmaW5pdHkgcHJvcGFnYXRpb24gYWxnb3JpdGhtXG5cbiAgdmFyIG47IC8vIG51bWJlciBvZiBkYXRhIHBvaW50c1xuICB2YXIgbjI7IC8vIHNpemUgb2YgbWF0cmljZXNcbiAgdmFyIFM7IC8vIHNpbWlsYXJpdHkgbWF0cml4ICgxRCBhcnJheSlcbiAgdmFyIHA7IC8vIHByZWZlcmVuY2Uvc3VpdGFiaWxpdHkgb2YgYSBkYXRhIHBvaW50IHRvIHNlcnZlIGFzIGFuIGV4ZW1wbGFyXG4gIHZhciBSOyAvLyByZXNwb25zaWJpbGl0eSBtYXRyaXggKDFEIGFycmF5KVxuICB2YXIgQTsgLy8gYXZhaWxhYmlsaXR5IG1hdHJpeCAoMUQgYXJyYXkpXG5cbiAgbiA9IG5vZGVzLmxlbmd0aDtcbiAgbjIgPSBuICogbjtcblxuICAvLyBJbml0aWFsaXplIGFuZCBidWlsZCBTIHNpbWlsYXJpdHkgbWF0cml4XG4gIFMgPSBuZXcgQXJyYXkobjIpO1xuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbjI7IF9pKyspIHtcbiAgICBTW19pXSA9IC1JbmZpbml0eTsgLy8gZm9yIGNhc2VzIHdoZXJlIHR3byBkYXRhIHBvaW50cyBzaG91bGRuJ3QgYmUgbGlua2VkIHRvZ2V0aGVyXG4gIH1cbiAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgbjsgX2kyKyspIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG47IGorKykge1xuICAgICAgaWYgKF9pMiAhPT0gaikge1xuICAgICAgICBTW19pMiAqIG4gKyBqXSA9IGdldFNpbWlsYXJpdHkob3B0cy5kaXN0YW5jZSwgbm9kZXNbX2kyXSwgbm9kZXNbal0sIG9wdHMuYXR0cmlidXRlcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gUGxhY2UgcHJlZmVyZW5jZXMgb24gdGhlIGRpYWdvbmFsIG9mIFNcbiAgcCA9IGdldFByZWZlcmVuY2UoUywgb3B0cy5wcmVmZXJlbmNlKTtcbiAgZm9yICh2YXIgX2kzID0gMDsgX2kzIDwgbjsgX2kzKyspIHtcbiAgICBTW19pMyAqIG4gKyBfaTNdID0gcDtcbiAgfVxuXG4gIC8vIEluaXRpYWxpemUgUiByZXNwb25zaWJpbGl0eSBtYXRyaXhcbiAgUiA9IG5ldyBBcnJheShuMik7XG4gIGZvciAodmFyIF9pNCA9IDA7IF9pNCA8IG4yOyBfaTQrKykge1xuICAgIFJbX2k0XSA9IDAuMDtcbiAgfVxuXG4gIC8vIEluaXRpYWxpemUgQSBhdmFpbGFiaWxpdHkgbWF0cml4XG4gIEEgPSBuZXcgQXJyYXkobjIpO1xuICBmb3IgKHZhciBfaTUgPSAwOyBfaTUgPCBuMjsgX2k1KyspIHtcbiAgICBBW19pNV0gPSAwLjA7XG4gIH1cbiAgdmFyIG9sZCA9IG5ldyBBcnJheShuKTtcbiAgdmFyIFJwID0gbmV3IEFycmF5KG4pO1xuICB2YXIgc2UgPSBuZXcgQXJyYXkobik7XG4gIGZvciAodmFyIF9pNiA9IDA7IF9pNiA8IG47IF9pNisrKSB7XG4gICAgb2xkW19pNl0gPSAwLjA7XG4gICAgUnBbX2k2XSA9IDAuMDtcbiAgICBzZVtfaTZdID0gMDtcbiAgfVxuICB2YXIgZSA9IG5ldyBBcnJheShuICogb3B0cy5taW5JdGVyYXRpb25zKTtcbiAgZm9yICh2YXIgX2k3ID0gMDsgX2k3IDwgZS5sZW5ndGg7IF9pNysrKSB7XG4gICAgZVtfaTddID0gMDtcbiAgfVxuICB2YXIgaXRlcjtcbiAgZm9yIChpdGVyID0gMDsgaXRlciA8IG9wdHMubWF4SXRlcmF0aW9uczsgaXRlcisrKSB7XG4gICAgLy8gbWFpbiBhbGdvcml0aG1pYyBsb29wXG5cbiAgICAvLyBVcGRhdGUgUiByZXNwb25zaWJpbGl0eSBtYXRyaXhcbiAgICBmb3IgKHZhciBfaTggPSAwOyBfaTggPCBuOyBfaTgrKykge1xuICAgICAgdmFyIG1heCA9IC1JbmZpbml0eSxcbiAgICAgICAgbWF4MiA9IC1JbmZpbml0eSxcbiAgICAgICAgbWF4SSA9IC0xLFxuICAgICAgICBBUyA9IDAuMDtcbiAgICAgIGZvciAodmFyIF9qID0gMDsgX2ogPCBuOyBfaisrKSB7XG4gICAgICAgIG9sZFtfal0gPSBSW19pOCAqIG4gKyBfal07XG4gICAgICAgIEFTID0gQVtfaTggKiBuICsgX2pdICsgU1tfaTggKiBuICsgX2pdO1xuICAgICAgICBpZiAoQVMgPj0gbWF4KSB7XG4gICAgICAgICAgbWF4MiA9IG1heDtcbiAgICAgICAgICBtYXggPSBBUztcbiAgICAgICAgICBtYXhJID0gX2o7XG4gICAgICAgIH0gZWxzZSBpZiAoQVMgPiBtYXgyKSB7XG4gICAgICAgICAgbWF4MiA9IEFTO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBfajIgPSAwOyBfajIgPCBuOyBfajIrKykge1xuICAgICAgICBSW19pOCAqIG4gKyBfajJdID0gKDEgLSBvcHRzLmRhbXBpbmcpICogKFNbX2k4ICogbiArIF9qMl0gLSBtYXgpICsgb3B0cy5kYW1waW5nICogb2xkW19qMl07XG4gICAgICB9XG4gICAgICBSW19pOCAqIG4gKyBtYXhJXSA9ICgxIC0gb3B0cy5kYW1waW5nKSAqIChTW19pOCAqIG4gKyBtYXhJXSAtIG1heDIpICsgb3B0cy5kYW1waW5nICogb2xkW21heEldO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBBIGF2YWlsYWJpbGl0eSBtYXRyaXhcbiAgICBmb3IgKHZhciBfaTkgPSAwOyBfaTkgPCBuOyBfaTkrKykge1xuICAgICAgdmFyIHN1bSA9IDA7XG4gICAgICBmb3IgKHZhciBfajMgPSAwOyBfajMgPCBuOyBfajMrKykge1xuICAgICAgICBvbGRbX2ozXSA9IEFbX2ozICogbiArIF9pOV07XG4gICAgICAgIFJwW19qM10gPSBNYXRoLm1heCgwLCBSW19qMyAqIG4gKyBfaTldKTtcbiAgICAgICAgc3VtICs9IFJwW19qM107XG4gICAgICB9XG4gICAgICBzdW0gLT0gUnBbX2k5XTtcbiAgICAgIFJwW19pOV0gPSBSW19pOSAqIG4gKyBfaTldO1xuICAgICAgc3VtICs9IFJwW19pOV07XG4gICAgICBmb3IgKHZhciBfajQgPSAwOyBfajQgPCBuOyBfajQrKykge1xuICAgICAgICBBW19qNCAqIG4gKyBfaTldID0gKDEgLSBvcHRzLmRhbXBpbmcpICogTWF0aC5taW4oMCwgc3VtIC0gUnBbX2o0XSkgKyBvcHRzLmRhbXBpbmcgKiBvbGRbX2o0XTtcbiAgICAgIH1cbiAgICAgIEFbX2k5ICogbiArIF9pOV0gPSAoMSAtIG9wdHMuZGFtcGluZykgKiAoc3VtIC0gUnBbX2k5XSkgKyBvcHRzLmRhbXBpbmcgKiBvbGRbX2k5XTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgY29udmVyZ2VuY2VcbiAgICB2YXIgSyA9IDA7XG4gICAgZm9yICh2YXIgX2kwID0gMDsgX2kwIDwgbjsgX2kwKyspIHtcbiAgICAgIHZhciBFID0gQVtfaTAgKiBuICsgX2kwXSArIFJbX2kwICogbiArIF9pMF0gPiAwID8gMSA6IDA7XG4gICAgICBlW2l0ZXIgJSBvcHRzLm1pbkl0ZXJhdGlvbnMgKiBuICsgX2kwXSA9IEU7XG4gICAgICBLICs9IEU7XG4gICAgfVxuICAgIGlmIChLID4gMCAmJiAoaXRlciA+PSBvcHRzLm1pbkl0ZXJhdGlvbnMgLSAxIHx8IGl0ZXIgPT0gb3B0cy5tYXhJdGVyYXRpb25zIC0gMSkpIHtcbiAgICAgIHZhciBfc3VtID0gMDtcbiAgICAgIGZvciAodmFyIF9pMSA9IDA7IF9pMSA8IG47IF9pMSsrKSB7XG4gICAgICAgIHNlW19pMV0gPSAwO1xuICAgICAgICBmb3IgKHZhciBfajUgPSAwOyBfajUgPCBvcHRzLm1pbkl0ZXJhdGlvbnM7IF9qNSsrKSB7XG4gICAgICAgICAgc2VbX2kxXSArPSBlW19qNSAqIG4gKyBfaTFdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZVtfaTFdID09PSAwIHx8IHNlW19pMV0gPT09IG9wdHMubWluSXRlcmF0aW9ucykge1xuICAgICAgICAgIF9zdW0rKztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKF9zdW0gPT09IG4pIHtcbiAgICAgICAgLy8gdGhlbiB3ZSBoYXZlIGNvbnZlcmdlbmNlXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIElkZW50aWZ5IGV4ZW1wbGFycyAoY2x1c3RlciBjZW50ZXJzKVxuICB2YXIgZXhlbXBsYXJzSW5kaWNlcyA9IGZpbmRFeGVtcGxhcnMobiwgUiwgQSk7XG5cbiAgLy8gQXNzaWduIG5vZGVzIHRvIGNsdXN0ZXJzXG4gIHZhciBjbHVzdGVySW5kaWNlcyA9IGFzc2lnbihuLCBTLCBleGVtcGxhcnNJbmRpY2VzKTtcbiAgdmFyIGNsdXN0ZXJzID0ge307XG4gIGZvciAodmFyIGMgPSAwOyBjIDwgZXhlbXBsYXJzSW5kaWNlcy5sZW5ndGg7IGMrKykge1xuICAgIGNsdXN0ZXJzW2V4ZW1wbGFyc0luZGljZXNbY11dID0gW107XG4gIH1cbiAgZm9yICh2YXIgX2kxMCA9IDA7IF9pMTAgPCBub2Rlcy5sZW5ndGg7IF9pMTArKykge1xuICAgIHZhciBwb3MgPSBpZDJwb3NpdGlvbltub2Rlc1tfaTEwXS5pZCgpXTtcbiAgICB2YXIgY2x1c3RlckluZGV4ID0gY2x1c3RlckluZGljZXNbcG9zXTtcbiAgICBpZiAoY2x1c3RlckluZGV4ICE9IG51bGwpIHtcbiAgICAgIC8vIHRoZSBub2RlIG1heSBoYXZlIG5vdCBiZWVuIGFzc2lnbmVkIGEgY2x1c3RlciBpZiBubyB2YWxpZCBhdHRyaWJ1dGVzIHdlcmUgc3BlY2lmaWVkXG4gICAgICBjbHVzdGVyc1tjbHVzdGVySW5kZXhdLnB1c2gobm9kZXNbX2kxMF0pO1xuICAgIH1cbiAgfVxuICB2YXIgcmV0Q2x1c3RlcnMgPSBuZXcgQXJyYXkoZXhlbXBsYXJzSW5kaWNlcy5sZW5ndGgpO1xuICBmb3IgKHZhciBfYyA9IDA7IF9jIDwgZXhlbXBsYXJzSW5kaWNlcy5sZW5ndGg7IF9jKyspIHtcbiAgICByZXRDbHVzdGVyc1tfY10gPSBjeS5jb2xsZWN0aW9uKGNsdXN0ZXJzW2V4ZW1wbGFyc0luZGljZXNbX2NdXSk7XG4gIH1cbiAgcmV0dXJuIHJldENsdXN0ZXJzO1xufTtcbnZhciBhZmZpbml0eVByb3BhZ2F0aW9uJDEgPSB7XG4gIGFmZmluaXR5UHJvcGFnYXRpb246IGFmZmluaXR5UHJvcGFnYXRpb24sXG4gIGFwOiBhZmZpbml0eVByb3BhZ2F0aW9uXG59O1xuXG52YXIgaGllcmhvbHplckRlZmF1bHRzID0gZGVmYXVsdHMkZyh7XG4gIHJvb3Q6IHVuZGVmaW5lZCxcbiAgZGlyZWN0ZWQ6IGZhbHNlXG59KTtcbnZhciBlbGVzZm4kayA9IHtcbiAgaGllcmhvbHplcjogZnVuY3Rpb24gaGllcmhvbHplcihvcHRpb25zKSB7XG4gICAgaWYgKCFwbGFpbk9iamVjdChvcHRpb25zKSkge1xuICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICBvcHRpb25zID0ge1xuICAgICAgICByb290OiBhcmdzWzBdLFxuICAgICAgICBkaXJlY3RlZDogYXJnc1sxXVxuICAgICAgfTtcbiAgICB9XG4gICAgdmFyIF9oaWVyaG9semVyRGVmYXVsdHMgPSBoaWVyaG9semVyRGVmYXVsdHMob3B0aW9ucyksXG4gICAgICByb290ID0gX2hpZXJob2x6ZXJEZWZhdWx0cy5yb290LFxuICAgICAgZGlyZWN0ZWQgPSBfaGllcmhvbHplckRlZmF1bHRzLmRpcmVjdGVkO1xuICAgIHZhciBlbGVzID0gdGhpcztcbiAgICB2YXIgZGZsYWcgPSBmYWxzZTtcbiAgICB2YXIgb2RkSW47XG4gICAgdmFyIG9kZE91dDtcbiAgICB2YXIgc3RhcnRWZXJ0ZXg7XG4gICAgaWYgKHJvb3QpIHN0YXJ0VmVydGV4ID0gc3RyaW5nKHJvb3QpID8gdGhpcy5maWx0ZXIocm9vdClbMF0uaWQoKSA6IHJvb3RbMF0uaWQoKTtcbiAgICB2YXIgbm9kZXMgPSB7fTtcbiAgICB2YXIgZWRnZXMgPSB7fTtcbiAgICBpZiAoZGlyZWN0ZWQpIHtcbiAgICAgIGVsZXMuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgIHZhciBpZCA9IGVsZS5pZCgpO1xuICAgICAgICBpZiAoZWxlLmlzTm9kZSgpKSB7XG4gICAgICAgICAgdmFyIGluZCA9IGVsZS5pbmRlZ3JlZSh0cnVlKTtcbiAgICAgICAgICB2YXIgb3V0ZCA9IGVsZS5vdXRkZWdyZWUodHJ1ZSk7XG4gICAgICAgICAgdmFyIGQxID0gaW5kIC0gb3V0ZDtcbiAgICAgICAgICB2YXIgZDIgPSBvdXRkIC0gaW5kO1xuICAgICAgICAgIGlmIChkMSA9PSAxKSB7XG4gICAgICAgICAgICBpZiAob2RkSW4pIGRmbGFnID0gdHJ1ZTtlbHNlIG9kZEluID0gaWQ7XG4gICAgICAgICAgfSBlbHNlIGlmIChkMiA9PSAxKSB7XG4gICAgICAgICAgICBpZiAob2RkT3V0KSBkZmxhZyA9IHRydWU7ZWxzZSBvZGRPdXQgPSBpZDtcbiAgICAgICAgICB9IGVsc2UgaWYgKGQyID4gMSB8fCBkMSA+IDEpIHtcbiAgICAgICAgICAgIGRmbGFnID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbm9kZXNbaWRdID0gW107XG4gICAgICAgICAgZWxlLm91dGdvZXJzKCkuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgaWYgKGUuaXNFZGdlKCkpIG5vZGVzW2lkXS5wdXNoKGUuaWQoKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZWRnZXNbaWRdID0gW3VuZGVmaW5lZCwgZWxlLnRhcmdldCgpLmlkKCldO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlcy5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgdmFyIGlkID0gZWxlLmlkKCk7XG4gICAgICAgIGlmIChlbGUuaXNOb2RlKCkpIHtcbiAgICAgICAgICB2YXIgZCA9IGVsZS5kZWdyZWUodHJ1ZSk7XG4gICAgICAgICAgaWYgKGQgJSAyKSB7XG4gICAgICAgICAgICBpZiAoIW9kZEluKSBvZGRJbiA9IGlkO2Vsc2UgaWYgKCFvZGRPdXQpIG9kZE91dCA9IGlkO2Vsc2UgZGZsYWcgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBub2Rlc1tpZF0gPSBbXTtcbiAgICAgICAgICBlbGUuY29ubmVjdGVkRWRnZXMoKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZXNbaWRdLnB1c2goZS5pZCgpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlZGdlc1tpZF0gPSBbZWxlLnNvdXJjZSgpLmlkKCksIGVsZS50YXJnZXQoKS5pZCgpXTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHZhciByZXN1bHQgPSB7XG4gICAgICBmb3VuZDogZmFsc2UsXG4gICAgICB0cmFpbDogdW5kZWZpbmVkXG4gICAgfTtcbiAgICBpZiAoZGZsYWcpIHJldHVybiByZXN1bHQ7ZWxzZSBpZiAob2RkT3V0ICYmIG9kZEluKSB7XG4gICAgICBpZiAoZGlyZWN0ZWQpIHtcbiAgICAgICAgaWYgKHN0YXJ0VmVydGV4ICYmIG9kZE91dCAhPSBzdGFydFZlcnRleCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgc3RhcnRWZXJ0ZXggPSBvZGRPdXQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoc3RhcnRWZXJ0ZXggJiYgb2RkT3V0ICE9IHN0YXJ0VmVydGV4ICYmIG9kZEluICE9IHN0YXJ0VmVydGV4KSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSBlbHNlIGlmICghc3RhcnRWZXJ0ZXgpIHtcbiAgICAgICAgICBzdGFydFZlcnRleCA9IG9kZE91dDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIXN0YXJ0VmVydGV4KSBzdGFydFZlcnRleCA9IGVsZXNbMF0uaWQoKTtcbiAgICB9XG4gICAgdmFyIHdhbGsgPSBmdW5jdGlvbiB3YWxrKHYpIHtcbiAgICAgIHZhciBjdXJyZW50Tm9kZSA9IHY7XG4gICAgICB2YXIgc3VidG91ciA9IFt2XTtcbiAgICAgIHZhciBhZGosIGFkalRhaWwsIGFkakhlYWQ7XG4gICAgICB3aGlsZSAobm9kZXNbY3VycmVudE5vZGVdLmxlbmd0aCkge1xuICAgICAgICBhZGogPSBub2Rlc1tjdXJyZW50Tm9kZV0uc2hpZnQoKTtcbiAgICAgICAgYWRqVGFpbCA9IGVkZ2VzW2Fkal1bMF07XG4gICAgICAgIGFkakhlYWQgPSBlZGdlc1thZGpdWzFdO1xuICAgICAgICBpZiAoY3VycmVudE5vZGUgIT0gYWRqSGVhZCkge1xuICAgICAgICAgIG5vZGVzW2FkakhlYWRdID0gbm9kZXNbYWRqSGVhZF0uZmlsdGVyKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gZSAhPSBhZGo7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY3VycmVudE5vZGUgPSBhZGpIZWFkO1xuICAgICAgICB9IGVsc2UgaWYgKCFkaXJlY3RlZCAmJiBjdXJyZW50Tm9kZSAhPSBhZGpUYWlsKSB7XG4gICAgICAgICAgbm9kZXNbYWRqVGFpbF0gPSBub2Rlc1thZGpUYWlsXS5maWx0ZXIoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBlICE9IGFkajtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjdXJyZW50Tm9kZSA9IGFkalRhaWw7XG4gICAgICAgIH1cbiAgICAgICAgc3VidG91ci51bnNoaWZ0KGFkaik7XG4gICAgICAgIHN1YnRvdXIudW5zaGlmdChjdXJyZW50Tm9kZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3VidG91cjtcbiAgICB9O1xuICAgIHZhciB0cmFpbCA9IFtdO1xuICAgIHZhciBzdWJ0b3VyID0gW107XG4gICAgc3VidG91ciA9IHdhbGsoc3RhcnRWZXJ0ZXgpO1xuICAgIHdoaWxlIChzdWJ0b3VyLmxlbmd0aCAhPSAxKSB7XG4gICAgICBpZiAobm9kZXNbc3VidG91clswXV0ubGVuZ3RoID09IDApIHtcbiAgICAgICAgdHJhaWwudW5zaGlmdChlbGVzLmdldEVsZW1lbnRCeUlkKHN1YnRvdXIuc2hpZnQoKSkpO1xuICAgICAgICB0cmFpbC51bnNoaWZ0KGVsZXMuZ2V0RWxlbWVudEJ5SWQoc3VidG91ci5zaGlmdCgpKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdWJ0b3VyID0gd2FsayhzdWJ0b3VyLnNoaWZ0KCkpLmNvbmNhdChzdWJ0b3VyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdHJhaWwudW5zaGlmdChlbGVzLmdldEVsZW1lbnRCeUlkKHN1YnRvdXIuc2hpZnQoKSkpOyAvLyBmaW5hbCBub2RlXG5cbiAgICBmb3IgKHZhciBkIGluIG5vZGVzKSB7XG4gICAgICBpZiAobm9kZXNbZF0ubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJlc3VsdC5mb3VuZCA9IHRydWU7XG4gICAgcmVzdWx0LnRyYWlsID0gdGhpcy5zcGF3bih0cmFpbCwgdHJ1ZSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufTtcblxudmFyIGhvcGNyb2Z0VGFyamFuQmljb25uZWN0ZWQgPSBmdW5jdGlvbiBob3Bjcm9mdFRhcmphbkJpY29ubmVjdGVkKCkge1xuICB2YXIgZWxlcyA9IHRoaXM7XG4gIHZhciBub2RlcyA9IHt9O1xuICB2YXIgaWQgPSAwO1xuICB2YXIgZWRnZUNvdW50ID0gMDtcbiAgdmFyIGNvbXBvbmVudHMgPSBbXTtcbiAgdmFyIHN0YWNrID0gW107XG4gIHZhciB2aXNpdGVkRWRnZXMgPSB7fTtcbiAgdmFyIGJ1aWxkQ29tcG9uZW50ID0gZnVuY3Rpb24gYnVpbGRDb21wb25lbnQoeCwgeSkge1xuICAgIHZhciBpID0gc3RhY2subGVuZ3RoIC0gMTtcbiAgICB2YXIgY3V0c2V0ID0gW107XG4gICAgdmFyIGNvbXBvbmVudCA9IGVsZXMuc3Bhd24oKTtcbiAgICB3aGlsZSAoc3RhY2tbaV0ueCAhPSB4IHx8IHN0YWNrW2ldLnkgIT0geSkge1xuICAgICAgY3V0c2V0LnB1c2goc3RhY2sucG9wKCkuZWRnZSk7XG4gICAgICBpLS07XG4gICAgfVxuICAgIGN1dHNldC5wdXNoKHN0YWNrLnBvcCgpLmVkZ2UpO1xuICAgIGN1dHNldC5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICB2YXIgY29ubmVjdGVkTm9kZXMgPSBlZGdlLmNvbm5lY3RlZE5vZGVzKCkuaW50ZXJzZWN0aW9uKGVsZXMpO1xuICAgICAgY29tcG9uZW50Lm1lcmdlKGVkZ2UpO1xuICAgICAgY29ubmVjdGVkTm9kZXMuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICB2YXIgbm9kZUlkID0gbm9kZS5pZCgpO1xuICAgICAgICB2YXIgY29ubmVjdGVkRWRnZXMgPSBub2RlLmNvbm5lY3RlZEVkZ2VzKCkuaW50ZXJzZWN0aW9uKGVsZXMpO1xuICAgICAgICBjb21wb25lbnQubWVyZ2Uobm9kZSk7XG4gICAgICAgIGlmICghbm9kZXNbbm9kZUlkXS5jdXRWZXJ0ZXgpIHtcbiAgICAgICAgICBjb21wb25lbnQubWVyZ2UoY29ubmVjdGVkRWRnZXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbXBvbmVudC5tZXJnZShjb25uZWN0ZWRFZGdlcy5maWx0ZXIoZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICAgICAgICAgIHJldHVybiBlZGdlLmlzTG9vcCgpO1xuICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgY29tcG9uZW50cy5wdXNoKGNvbXBvbmVudCk7XG4gIH07XG4gIHZhciBfYmljb25uZWN0ZWRTZWFyY2ggPSBmdW5jdGlvbiBiaWNvbm5lY3RlZFNlYXJjaChyb290LCBjdXJyZW50Tm9kZSwgcGFyZW50KSB7XG4gICAgaWYgKHJvb3QgPT09IHBhcmVudCkgZWRnZUNvdW50ICs9IDE7XG4gICAgbm9kZXNbY3VycmVudE5vZGVdID0ge1xuICAgICAgaWQ6IGlkLFxuICAgICAgbG93OiBpZCsrLFxuICAgICAgY3V0VmVydGV4OiBmYWxzZVxuICAgIH07XG4gICAgdmFyIGVkZ2VzID0gZWxlcy5nZXRFbGVtZW50QnlJZChjdXJyZW50Tm9kZSkuY29ubmVjdGVkRWRnZXMoKS5pbnRlcnNlY3Rpb24oZWxlcyk7XG4gICAgaWYgKGVkZ2VzLnNpemUoKSA9PT0gMCkge1xuICAgICAgY29tcG9uZW50cy5wdXNoKGVsZXMuc3Bhd24oZWxlcy5nZXRFbGVtZW50QnlJZChjdXJyZW50Tm9kZSkpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHNvdXJjZUlkLCB0YXJnZXRJZCwgb3RoZXJOb2RlSWQsIGVkZ2VJZDtcbiAgICAgIGVkZ2VzLmZvckVhY2goZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICAgICAgc291cmNlSWQgPSBlZGdlLnNvdXJjZSgpLmlkKCk7XG4gICAgICAgIHRhcmdldElkID0gZWRnZS50YXJnZXQoKS5pZCgpO1xuICAgICAgICBvdGhlck5vZGVJZCA9IHNvdXJjZUlkID09PSBjdXJyZW50Tm9kZSA/IHRhcmdldElkIDogc291cmNlSWQ7XG4gICAgICAgIGlmIChvdGhlck5vZGVJZCAhPT0gcGFyZW50KSB7XG4gICAgICAgICAgZWRnZUlkID0gZWRnZS5pZCgpO1xuICAgICAgICAgIGlmICghdmlzaXRlZEVkZ2VzW2VkZ2VJZF0pIHtcbiAgICAgICAgICAgIHZpc2l0ZWRFZGdlc1tlZGdlSWRdID0gdHJ1ZTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2goe1xuICAgICAgICAgICAgICB4OiBjdXJyZW50Tm9kZSxcbiAgICAgICAgICAgICAgeTogb3RoZXJOb2RlSWQsXG4gICAgICAgICAgICAgIGVkZ2U6IGVkZ2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIShvdGhlck5vZGVJZCBpbiBub2RlcykpIHtcbiAgICAgICAgICAgIF9iaWNvbm5lY3RlZFNlYXJjaChyb290LCBvdGhlck5vZGVJZCwgY3VycmVudE5vZGUpO1xuICAgICAgICAgICAgbm9kZXNbY3VycmVudE5vZGVdLmxvdyA9IE1hdGgubWluKG5vZGVzW2N1cnJlbnROb2RlXS5sb3csIG5vZGVzW290aGVyTm9kZUlkXS5sb3cpO1xuICAgICAgICAgICAgaWYgKG5vZGVzW2N1cnJlbnROb2RlXS5pZCA8PSBub2Rlc1tvdGhlck5vZGVJZF0ubG93KSB7XG4gICAgICAgICAgICAgIG5vZGVzW2N1cnJlbnROb2RlXS5jdXRWZXJ0ZXggPSB0cnVlO1xuICAgICAgICAgICAgICBidWlsZENvbXBvbmVudChjdXJyZW50Tm9kZSwgb3RoZXJOb2RlSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBub2Rlc1tjdXJyZW50Tm9kZV0ubG93ID0gTWF0aC5taW4obm9kZXNbY3VycmVudE5vZGVdLmxvdywgbm9kZXNbb3RoZXJOb2RlSWRdLmlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgZWxlcy5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHtcbiAgICBpZiAoZWxlLmlzTm9kZSgpKSB7XG4gICAgICB2YXIgbm9kZUlkID0gZWxlLmlkKCk7XG4gICAgICBpZiAoIShub2RlSWQgaW4gbm9kZXMpKSB7XG4gICAgICAgIGVkZ2VDb3VudCA9IDA7XG4gICAgICAgIF9iaWNvbm5lY3RlZFNlYXJjaChub2RlSWQsIG5vZGVJZCk7XG4gICAgICAgIG5vZGVzW25vZGVJZF0uY3V0VmVydGV4ID0gZWRnZUNvdW50ID4gMTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICB2YXIgY3V0VmVydGljZXMgPSBPYmplY3Qua2V5cyhub2RlcykuZmlsdGVyKGZ1bmN0aW9uIChpZCkge1xuICAgIHJldHVybiBub2Rlc1tpZF0uY3V0VmVydGV4O1xuICB9KS5tYXAoZnVuY3Rpb24gKGlkKSB7XG4gICAgcmV0dXJuIGVsZXMuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICB9KTtcbiAgcmV0dXJuIHtcbiAgICBjdXQ6IGVsZXMuc3Bhd24oY3V0VmVydGljZXMpLFxuICAgIGNvbXBvbmVudHM6IGNvbXBvbmVudHNcbiAgfTtcbn07XG52YXIgaG9wY3JvZnRUYXJqYW5CaWNvbm5lY3RlZCQxID0ge1xuICBob3Bjcm9mdFRhcmphbkJpY29ubmVjdGVkOiBob3Bjcm9mdFRhcmphbkJpY29ubmVjdGVkLFxuICBodGJjOiBob3Bjcm9mdFRhcmphbkJpY29ubmVjdGVkLFxuICBodGI6IGhvcGNyb2Z0VGFyamFuQmljb25uZWN0ZWQsXG4gIGhvcGNyb2Z0VGFyamFuQmljb25uZWN0ZWRDb21wb25lbnRzOiBob3Bjcm9mdFRhcmphbkJpY29ubmVjdGVkXG59O1xuXG52YXIgdGFyamFuU3Ryb25nbHlDb25uZWN0ZWQgPSBmdW5jdGlvbiB0YXJqYW5TdHJvbmdseUNvbm5lY3RlZCgpIHtcbiAgdmFyIGVsZXMgPSB0aGlzO1xuICB2YXIgbm9kZXMgPSB7fTtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGNvbXBvbmVudHMgPSBbXTtcbiAgdmFyIHN0YWNrID0gW107XG4gIHZhciBjdXQgPSBlbGVzLnNwYXduKGVsZXMpO1xuICB2YXIgX3N0cm9uZ2x5Q29ubmVjdGVkU2VhcmNoID0gZnVuY3Rpb24gc3Ryb25nbHlDb25uZWN0ZWRTZWFyY2goc291cmNlTm9kZUlkKSB7XG4gICAgc3RhY2sucHVzaChzb3VyY2VOb2RlSWQpO1xuICAgIG5vZGVzW3NvdXJjZU5vZGVJZF0gPSB7XG4gICAgICBpbmRleDogaW5kZXgsXG4gICAgICBsb3c6IGluZGV4KyssXG4gICAgICBleHBsb3JlZDogZmFsc2VcbiAgICB9O1xuICAgIHZhciBjb25uZWN0ZWRFZGdlcyA9IGVsZXMuZ2V0RWxlbWVudEJ5SWQoc291cmNlTm9kZUlkKS5jb25uZWN0ZWRFZGdlcygpLmludGVyc2VjdGlvbihlbGVzKTtcbiAgICBjb25uZWN0ZWRFZGdlcy5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICB2YXIgdGFyZ2V0Tm9kZUlkID0gZWRnZS50YXJnZXQoKS5pZCgpO1xuICAgICAgaWYgKHRhcmdldE5vZGVJZCAhPT0gc291cmNlTm9kZUlkKSB7XG4gICAgICAgIGlmICghKHRhcmdldE5vZGVJZCBpbiBub2RlcykpIHtcbiAgICAgICAgICBfc3Ryb25nbHlDb25uZWN0ZWRTZWFyY2godGFyZ2V0Tm9kZUlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW5vZGVzW3RhcmdldE5vZGVJZF0uZXhwbG9yZWQpIHtcbiAgICAgICAgICBub2Rlc1tzb3VyY2VOb2RlSWRdLmxvdyA9IE1hdGgubWluKG5vZGVzW3NvdXJjZU5vZGVJZF0ubG93LCBub2Rlc1t0YXJnZXROb2RlSWRdLmxvdyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAobm9kZXNbc291cmNlTm9kZUlkXS5pbmRleCA9PT0gbm9kZXNbc291cmNlTm9kZUlkXS5sb3cpIHtcbiAgICAgIHZhciBjb21wb25lbnROb2RlcyA9IGVsZXMuc3Bhd24oKTtcbiAgICAgIGZvciAoOzspIHtcbiAgICAgICAgdmFyIG5vZGVJZCA9IHN0YWNrLnBvcCgpO1xuICAgICAgICBjb21wb25lbnROb2Rlcy5tZXJnZShlbGVzLmdldEVsZW1lbnRCeUlkKG5vZGVJZCkpO1xuICAgICAgICBub2Rlc1tub2RlSWRdLmxvdyA9IG5vZGVzW3NvdXJjZU5vZGVJZF0uaW5kZXg7XG4gICAgICAgIG5vZGVzW25vZGVJZF0uZXhwbG9yZWQgPSB0cnVlO1xuICAgICAgICBpZiAobm9kZUlkID09PSBzb3VyY2VOb2RlSWQpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIGNvbXBvbmVudEVkZ2VzID0gY29tcG9uZW50Tm9kZXMuZWRnZXNXaXRoKGNvbXBvbmVudE5vZGVzKTtcbiAgICAgIHZhciBjb21wb25lbnQgPSBjb21wb25lbnROb2Rlcy5tZXJnZShjb21wb25lbnRFZGdlcyk7XG4gICAgICBjb21wb25lbnRzLnB1c2goY29tcG9uZW50KTtcbiAgICAgIGN1dCA9IGN1dC5kaWZmZXJlbmNlKGNvbXBvbmVudCk7XG4gICAgfVxuICB9O1xuICBlbGVzLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgIGlmIChlbGUuaXNOb2RlKCkpIHtcbiAgICAgIHZhciBub2RlSWQgPSBlbGUuaWQoKTtcbiAgICAgIGlmICghKG5vZGVJZCBpbiBub2RlcykpIHtcbiAgICAgICAgX3N0cm9uZ2x5Q29ubmVjdGVkU2VhcmNoKG5vZGVJZCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHtcbiAgICBjdXQ6IGN1dCxcbiAgICBjb21wb25lbnRzOiBjb21wb25lbnRzXG4gIH07XG59O1xudmFyIHRhcmphblN0cm9uZ2x5Q29ubmVjdGVkJDEgPSB7XG4gIHRhcmphblN0cm9uZ2x5Q29ubmVjdGVkOiB0YXJqYW5TdHJvbmdseUNvbm5lY3RlZCxcbiAgdHNjOiB0YXJqYW5TdHJvbmdseUNvbm5lY3RlZCxcbiAgdHNjYzogdGFyamFuU3Ryb25nbHlDb25uZWN0ZWQsXG4gIHRhcmphblN0cm9uZ2x5Q29ubmVjdGVkQ29tcG9uZW50czogdGFyamFuU3Ryb25nbHlDb25uZWN0ZWRcbn07XG5cbnZhciBlbGVzZm4kaiA9IHt9O1xuW2VsZXNmbiR2LCBlbGVzZm4kdSwgZWxlc2ZuJHQsIGVsZXNmbiRzLCBlbGVzZm4kciwgZWxlc2ZuJHEsIGVsZXNmbiRwLCBlbGVzZm4kbywgZWxlc2ZuJG4sIGVsZXNmbiRtLCBlbGVzZm4kbCwgbWFya292Q2x1c3RlcmluZyQxLCBrQ2x1c3RlcmluZywgaGllcmFyY2hpY2FsQ2x1c3RlcmluZyQxLCBhZmZpbml0eVByb3BhZ2F0aW9uJDEsIGVsZXNmbiRrLCBob3Bjcm9mdFRhcmphbkJpY29ubmVjdGVkJDEsIHRhcmphblN0cm9uZ2x5Q29ubmVjdGVkJDFdLmZvckVhY2goZnVuY3Rpb24gKHByb3BzKSB7XG4gIGV4dGVuZChlbGVzZm4kaiwgcHJvcHMpO1xufSk7XG5cbi8qIVxuRW1iZWRkYWJsZSBNaW5pbXVtIFN0cmljdGx5LUNvbXBsaWFudCBQcm9taXNlcy9BKyAxLjEuMSBUaGVuYWJsZVxuQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQgUmFsZiBTLiBFbmdlbHNjaGFsbCAoaHR0cDovL2VuZ2Vsc2NoYWxsLmNvbSlcbkxpY2Vuc2VkIHVuZGVyIFRoZSBNSVQgTGljZW5zZSAoaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVClcbiovXG5cbi8qICBwcm9taXNlIHN0YXRlcyBbUHJvbWlzZXMvQSsgMi4xXSAgKi9cbnZhciBTVEFURV9QRU5ESU5HID0gMDsgLyogIFtQcm9taXNlcy9BKyAyLjEuMV0gICovXG52YXIgU1RBVEVfRlVMRklMTEVEID0gMTsgLyogIFtQcm9taXNlcy9BKyAyLjEuMl0gICovXG52YXIgU1RBVEVfUkVKRUNURUQgPSAyOyAvKiAgW1Byb21pc2VzL0ErIDIuMS4zXSAgKi9cblxuLyogIHByb21pc2Ugb2JqZWN0IGNvbnN0cnVjdG9yICAqL1xudmFyIF9hcGkgPSBmdW5jdGlvbiBhcGkoZXhlY3V0b3IpIHtcbiAgLyogIG9wdGlvbmFsbHkgc3VwcG9ydCBub24tY29uc3RydWN0b3IvcGxhaW4tZnVuY3Rpb24gY2FsbCAgKi9cbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIF9hcGkpKSByZXR1cm4gbmV3IF9hcGkoZXhlY3V0b3IpO1xuXG4gIC8qICBpbml0aWFsaXplIG9iamVjdCAgKi9cbiAgdGhpcy5pZCA9ICdUaGVuYWJsZS8xLjAuNyc7XG4gIHRoaXMuc3RhdGUgPSBTVEFURV9QRU5ESU5HOyAvKiAgaW5pdGlhbCBzdGF0ZSAgKi9cbiAgdGhpcy5mdWxmaWxsVmFsdWUgPSB1bmRlZmluZWQ7IC8qICBpbml0aWFsIHZhbHVlICAqLyAvKiAgW1Byb21pc2VzL0ErIDEuMywgMi4xLjIuMl0gICovXG4gIHRoaXMucmVqZWN0UmVhc29uID0gdW5kZWZpbmVkOyAvKiAgaW5pdGlhbCByZWFzb24gKi8gLyogIFtQcm9taXNlcy9BKyAxLjUsIDIuMS4zLjJdICAqL1xuICB0aGlzLm9uRnVsZmlsbGVkID0gW107IC8qICBpbml0aWFsIGhhbmRsZXJzICAqL1xuICB0aGlzLm9uUmVqZWN0ZWQgPSBbXTsgLyogIGluaXRpYWwgaGFuZGxlcnMgICovXG5cbiAgLyogIHByb3ZpZGUgb3B0aW9uYWwgaW5mb3JtYXRpb24taGlkaW5nIHByb3h5ICAqL1xuICB0aGlzLnByb3h5ID0ge1xuICAgIHRoZW46IHRoaXMudGhlbi5iaW5kKHRoaXMpXG4gIH07XG5cbiAgLyogIHN1cHBvcnQgb3B0aW9uYWwgZXhlY3V0b3IgZnVuY3Rpb24gICovXG4gIGlmICh0eXBlb2YgZXhlY3V0b3IgPT09ICdmdW5jdGlvbicpIGV4ZWN1dG9yLmNhbGwodGhpcywgdGhpcy5mdWxmaWxsLmJpbmQodGhpcyksIHRoaXMucmVqZWN0LmJpbmQodGhpcykpO1xufTtcblxuLyogIHByb21pc2UgQVBJIG1ldGhvZHMgICovXG5fYXBpLnByb3RvdHlwZSA9IHtcbiAgLyogIHByb21pc2UgcmVzb2x2aW5nIG1ldGhvZHMgICovXG4gIGZ1bGZpbGw6IGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHtcbiAgICByZXR1cm4gZGVsaXZlcih0aGlzLCBTVEFURV9GVUxGSUxMRUQsICdmdWxmaWxsVmFsdWUnLCB2YWx1ZSk7XG4gIH0sXG4gIHJlamVjdDogZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7XG4gICAgcmV0dXJuIGRlbGl2ZXIodGhpcywgU1RBVEVfUkVKRUNURUQsICdyZWplY3RSZWFzb24nLCB2YWx1ZSk7XG4gIH0sXG4gIC8qICBcIlRoZSB0aGVuIE1ldGhvZFwiIFtQcm9taXNlcy9BKyAxLjEsIDEuMiwgMi4yXSAgKi9cbiAgdGhlbjogZnVuY3Rpb24gdGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuICAgIHZhciBjdXJyID0gdGhpcztcbiAgICB2YXIgbmV4dCA9IG5ldyBfYXBpKCk7IC8qICBbUHJvbWlzZXMvQSsgMi4yLjddICAqL1xuICAgIGN1cnIub25GdWxmaWxsZWQucHVzaChyZXNvbHZlcihvbkZ1bGZpbGxlZCwgbmV4dCwgJ2Z1bGZpbGwnKSk7IC8qICBbUHJvbWlzZXMvQSsgMi4yLjIvMi4yLjZdICAqL1xuICAgIGN1cnIub25SZWplY3RlZC5wdXNoKHJlc29sdmVyKG9uUmVqZWN0ZWQsIG5leHQsICdyZWplY3QnKSk7IC8qICBbUHJvbWlzZXMvQSsgMi4yLjMvMi4yLjZdICAqL1xuICAgIGV4ZWN1dGUoY3Vycik7XG4gICAgcmV0dXJuIG5leHQucHJveHk7IC8qICBbUHJvbWlzZXMvQSsgMi4yLjcsIDMuM10gICovXG4gIH1cbn07XG5cbi8qICBkZWxpdmVyIGFuIGFjdGlvbiAgKi9cbnZhciBkZWxpdmVyID0gZnVuY3Rpb24gZGVsaXZlcihjdXJyLCBzdGF0ZSwgbmFtZSwgdmFsdWUpIHtcbiAgaWYgKGN1cnIuc3RhdGUgPT09IFNUQVRFX1BFTkRJTkcpIHtcbiAgICBjdXJyLnN0YXRlID0gc3RhdGU7IC8qICBbUHJvbWlzZXMvQSsgMi4xLjIuMSwgMi4xLjMuMV0gICovXG4gICAgY3VycltuYW1lXSA9IHZhbHVlOyAvKiAgW1Byb21pc2VzL0ErIDIuMS4yLjIsIDIuMS4zLjJdICAqL1xuICAgIGV4ZWN1dGUoY3Vycik7XG4gIH1cbiAgcmV0dXJuIGN1cnI7XG59O1xuXG4vKiAgZXhlY3V0ZSBhbGwgaGFuZGxlcnMgICovXG52YXIgZXhlY3V0ZSA9IGZ1bmN0aW9uIGV4ZWN1dGUoY3Vycikge1xuICBpZiAoY3Vyci5zdGF0ZSA9PT0gU1RBVEVfRlVMRklMTEVEKSBleGVjdXRlX2hhbmRsZXJzKGN1cnIsICdvbkZ1bGZpbGxlZCcsIGN1cnIuZnVsZmlsbFZhbHVlKTtlbHNlIGlmIChjdXJyLnN0YXRlID09PSBTVEFURV9SRUpFQ1RFRCkgZXhlY3V0ZV9oYW5kbGVycyhjdXJyLCAnb25SZWplY3RlZCcsIGN1cnIucmVqZWN0UmVhc29uKTtcbn07XG5cbi8qICBleGVjdXRlIHBhcnRpY3VsYXIgc2V0IG9mIGhhbmRsZXJzICAqL1xudmFyIGV4ZWN1dGVfaGFuZGxlcnMgPSBmdW5jdGlvbiBleGVjdXRlX2hhbmRsZXJzKGN1cnIsIG5hbWUsIHZhbHVlKSB7XG4gIC8qIGdsb2JhbCBzZXRJbW1lZGlhdGU6IHRydWUgKi9cbiAgLyogZ2xvYmFsIHNldFRpbWVvdXQ6IHRydWUgKi9cblxuICAvKiAgc2hvcnQtY2lyY3VpdCBwcm9jZXNzaW5nICAqL1xuICBpZiAoY3VycltuYW1lXS5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAvKiAgaXRlcmF0ZSBvdmVyIGFsbCBoYW5kbGVycywgZXhhY3RseSBvbmNlICAqL1xuICB2YXIgaGFuZGxlcnMgPSBjdXJyW25hbWVdO1xuICBjdXJyW25hbWVdID0gW107IC8qICBbUHJvbWlzZXMvQSsgMi4yLjIuMywgMi4yLjMuM10gICovXG4gIHZhciBmdW5jID0gZnVuY3Rpb24gZnVuYygpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhhbmRsZXJzLmxlbmd0aDsgaSsrKSBoYW5kbGVyc1tpXSh2YWx1ZSk7IC8qICBbUHJvbWlzZXMvQSsgMi4yLjVdICAqL1xuICB9O1xuXG4gIC8qICBleGVjdXRlIHByb2NlZHVyZSBhc3luY2hyb25vdXNseSAgKi8gLyogIFtQcm9taXNlcy9BKyAyLjIuNCwgMy4xXSAgKi9cbiAgaWYgKHR5cGVvZiBzZXRJbW1lZGlhdGUgPT09ICdmdW5jdGlvbicpIHNldEltbWVkaWF0ZShmdW5jKTtlbHNlIHNldFRpbWVvdXQoZnVuYywgMCk7XG59O1xuXG4vKiAgZ2VuZXJhdGUgYSByZXNvbHZlciBmdW5jdGlvbiAgKi9cbnZhciByZXNvbHZlciA9IGZ1bmN0aW9uIHJlc29sdmVyKGNiLCBuZXh0LCBtZXRob2QpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgY2IgIT09ICdmdW5jdGlvbicpIC8qICBbUHJvbWlzZXMvQSsgMi4yLjEsIDIuMi43LjMsIDIuMi43LjRdICAqL1xuICAgICAgbmV4dFttZXRob2RdLmNhbGwobmV4dCwgdmFsdWUpOyAvKiAgW1Byb21pc2VzL0ErIDIuMi43LjMsIDIuMi43LjRdICAqL2Vsc2Uge1xuICAgICAgdmFyIHJlc3VsdDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc3VsdCA9IGNiKHZhbHVlKTtcbiAgICAgIH0gLyogIFtQcm9taXNlcy9BKyAyLjIuMi4xLCAyLjIuMy4xLCAyLjIuNSwgMy4yXSAgKi8gY2F0Y2ggKGUpIHtcbiAgICAgICAgbmV4dC5yZWplY3QoZSk7IC8qICBbUHJvbWlzZXMvQSsgMi4yLjcuMl0gICovXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIF9yZXNvbHZlKG5leHQsIHJlc3VsdCk7IC8qICBbUHJvbWlzZXMvQSsgMi4yLjcuMV0gICovXG4gICAgfVxuICB9O1xufTtcblxuLyogIFwiUHJvbWlzZSBSZXNvbHV0aW9uIFByb2NlZHVyZVwiICAqLyAvKiAgW1Byb21pc2VzL0ErIDIuM10gICovXG52YXIgX3Jlc29sdmUgPSBmdW5jdGlvbiByZXNvbHZlKHByb21pc2UsIHgpIHtcbiAgLyogIHNhbml0eSBjaGVjayBhcmd1bWVudHMgICovIC8qICBbUHJvbWlzZXMvQSsgMi4zLjFdICAqL1xuICBpZiAocHJvbWlzZSA9PT0geCB8fCBwcm9taXNlLnByb3h5ID09PSB4KSB7XG4gICAgcHJvbWlzZS5yZWplY3QobmV3IFR5cGVFcnJvcignY2Fubm90IHJlc29sdmUgcHJvbWlzZSB3aXRoIGl0c2VsZicpKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKiAgc3VyZ2ljYWxseSBjaGVjayBmb3IgYSBcInRoZW5cIiBtZXRob2RcbiAgICAobWFpbmx5IHRvIGp1c3QgY2FsbCB0aGUgXCJnZXR0ZXJcIiBvZiBcInRoZW5cIiBvbmx5IG9uY2UpICAqL1xuICB2YXIgdGhlbjtcbiAgaWYgKF90eXBlb2YoeCkgPT09ICdvYmplY3QnICYmIHggIT09IG51bGwgfHwgdHlwZW9mIHggPT09ICdmdW5jdGlvbicpIHtcbiAgICB0cnkge1xuICAgICAgdGhlbiA9IHgudGhlbjtcbiAgICB9IC8qICBbUHJvbWlzZXMvQSsgMi4zLjMuMSwgMy41XSAgKi8gY2F0Y2ggKGUpIHtcbiAgICAgIHByb21pc2UucmVqZWN0KGUpOyAvKiAgW1Byb21pc2VzL0ErIDIuMy4zLjJdICAqL1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIC8qICBoYW5kbGUgb3duIFRoZW5hYmxlcyAgICBbUHJvbWlzZXMvQSsgMi4zLjJdXG4gICAgYW5kIHNpbWlsYXIgXCJ0aGVuYWJsZXNcIiBbUHJvbWlzZXMvQSsgMi4zLjNdICAqL1xuICBpZiAodHlwZW9mIHRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgcmVzb2x2ZWQgPSBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgLyogIGNhbGwgcmV0cmlldmVkIFwidGhlblwiIG1ldGhvZCAqLyAvKiAgW1Byb21pc2VzL0ErIDIuMy4zLjNdICAqL1xuICAgICAgdGhlbi5jYWxsKHgsIC8qICByZXNvbHZlUHJvbWlzZSAgKi8gLyogIFtQcm9taXNlcy9BKyAyLjMuMy4zLjFdICAqL1xuICAgICAgZnVuY3Rpb24gKHkpIHtcbiAgICAgICAgaWYgKHJlc29sdmVkKSByZXR1cm47XG4gICAgICAgIHJlc29sdmVkID0gdHJ1ZTsgLyogIFtQcm9taXNlcy9BKyAyLjMuMy4zLjNdICAqL1xuICAgICAgICBpZiAoeSA9PT0geCkgLyogIFtQcm9taXNlcy9BKyAzLjZdICAqL1xuICAgICAgICAgIHByb21pc2UucmVqZWN0KG5ldyBUeXBlRXJyb3IoJ2NpcmN1bGFyIHRoZW5hYmxlIGNoYWluJykpO2Vsc2UgX3Jlc29sdmUocHJvbWlzZSwgeSk7XG4gICAgICB9LCAvKiAgcmVqZWN0UHJvbWlzZSAgKi8gLyogIFtQcm9taXNlcy9BKyAyLjMuMy4zLjJdICAqL1xuICAgICAgZnVuY3Rpb24gKHIpIHtcbiAgICAgICAgaWYgKHJlc29sdmVkKSByZXR1cm47XG4gICAgICAgIHJlc29sdmVkID0gdHJ1ZTsgLyogIFtQcm9taXNlcy9BKyAyLjMuMy4zLjNdICAqL1xuICAgICAgICBwcm9taXNlLnJlamVjdChyKTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmICghcmVzb2x2ZWQpIC8qICBbUHJvbWlzZXMvQSsgMi4zLjMuMy4zXSAgKi9cbiAgICAgICAgcHJvbWlzZS5yZWplY3QoZSk7IC8qICBbUHJvbWlzZXMvQSsgMi4zLjMuMy40XSAgKi9cbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyogIGhhbmRsZSBvdGhlciB2YWx1ZXMgICovXG4gIHByb21pc2UuZnVsZmlsbCh4KTsgLyogIFtQcm9taXNlcy9BKyAyLjMuNCwgMi4zLjMuNF0gICovXG59O1xuXG4vLyBzbyB3ZSBhbHdheXMgaGF2ZSBQcm9taXNlLmFsbCgpXG5fYXBpLmFsbCA9IGZ1bmN0aW9uIChwcykge1xuICByZXR1cm4gbmV3IF9hcGkoZnVuY3Rpb24gKHJlc29sdmVBbGwsIHJlamVjdEFsbCkge1xuICAgIHZhciB2YWxzID0gbmV3IEFycmF5KHBzLmxlbmd0aCk7XG4gICAgdmFyIGRvbmVDb3VudCA9IDA7XG4gICAgdmFyIGZ1bGZpbGwgPSBmdW5jdGlvbiBmdWxmaWxsKGksIHZhbCkge1xuICAgICAgdmFsc1tpXSA9IHZhbDtcbiAgICAgIGRvbmVDb3VudCsrO1xuICAgICAgaWYgKGRvbmVDb3VudCA9PT0gcHMubGVuZ3RoKSB7XG4gICAgICAgIHJlc29sdmVBbGwodmFscyk7XG4gICAgICB9XG4gICAgfTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAoZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgdmFyIHAgPSBwc1tpXTtcbiAgICAgICAgdmFyIGlzUHJvbWlzZSA9IHAgIT0gbnVsbCAmJiBwLnRoZW4gIT0gbnVsbDtcbiAgICAgICAgaWYgKGlzUHJvbWlzZSkge1xuICAgICAgICAgIHAudGhlbihmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgICAgICBmdWxmaWxsKGksIHZhbCk7XG4gICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgcmVqZWN0QWxsKGVycik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHZhbCA9IHA7XG4gICAgICAgICAgZnVsZmlsbChpLCB2YWwpO1xuICAgICAgICB9XG4gICAgICB9KShpKTtcbiAgICB9XG4gIH0pO1xufTtcbl9hcGkucmVzb2x2ZSA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgcmV0dXJuIG5ldyBfYXBpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICByZXNvbHZlKHZhbCk7XG4gIH0pO1xufTtcbl9hcGkucmVqZWN0ID0gZnVuY3Rpb24gKHZhbCkge1xuICByZXR1cm4gbmV3IF9hcGkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHJlamVjdCh2YWwpO1xuICB9KTtcbn07XG52YXIgUHJvbWlzZSQxID0gdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnID8gUHJvbWlzZSA6IF9hcGk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcblxudmFyIEFuaW1hdGlvbiA9IGZ1bmN0aW9uIEFuaW1hdGlvbih0YXJnZXQsIG9wdHMsIG9wdHMyKSB7XG4gIHZhciBpc0NvcmUgPSBjb3JlKHRhcmdldCk7XG4gIHZhciBpc0VsZSA9ICFpc0NvcmU7XG4gIHZhciBfcCA9IHRoaXMuX3ByaXZhdGUgPSBleHRlbmQoe1xuICAgIGR1cmF0aW9uOiAxMDAwXG4gIH0sIG9wdHMsIG9wdHMyKTtcbiAgX3AudGFyZ2V0ID0gdGFyZ2V0O1xuICBfcC5zdHlsZSA9IF9wLnN0eWxlIHx8IF9wLmNzcztcbiAgX3Auc3RhcnRlZCA9IGZhbHNlO1xuICBfcC5wbGF5aW5nID0gZmFsc2U7XG4gIF9wLmhvb2tlZCA9IGZhbHNlO1xuICBfcC5hcHBseWluZyA9IGZhbHNlO1xuICBfcC5wcm9ncmVzcyA9IDA7XG4gIF9wLmNvbXBsZXRlcyA9IFtdO1xuICBfcC5mcmFtZXMgPSBbXTtcbiAgaWYgKF9wLmNvbXBsZXRlICYmIGZuJDYoX3AuY29tcGxldGUpKSB7XG4gICAgX3AuY29tcGxldGVzLnB1c2goX3AuY29tcGxldGUpO1xuICB9XG4gIGlmIChpc0VsZSkge1xuICAgIHZhciBwb3MgPSB0YXJnZXQucG9zaXRpb24oKTtcbiAgICBfcC5zdGFydFBvc2l0aW9uID0gX3Auc3RhcnRQb3NpdGlvbiB8fCB7XG4gICAgICB4OiBwb3MueCxcbiAgICAgIHk6IHBvcy55XG4gICAgfTtcbiAgICBfcC5zdGFydFN0eWxlID0gX3Auc3RhcnRTdHlsZSB8fCB0YXJnZXQuY3koKS5zdHlsZSgpLmdldEFuaW1hdGlvblN0YXJ0U3R5bGUodGFyZ2V0LCBfcC5zdHlsZSk7XG4gIH1cbiAgaWYgKGlzQ29yZSkge1xuICAgIHZhciBwYW4gPSB0YXJnZXQucGFuKCk7XG4gICAgX3Auc3RhcnRQYW4gPSB7XG4gICAgICB4OiBwYW4ueCxcbiAgICAgIHk6IHBhbi55XG4gICAgfTtcbiAgICBfcC5zdGFydFpvb20gPSB0YXJnZXQuem9vbSgpO1xuICB9XG5cbiAgLy8gZm9yIGZ1dHVyZSB0aW1lbGluZS9hbmltYXRpb25zIGltcGxcbiAgdGhpcy5sZW5ndGggPSAxO1xuICB0aGlzWzBdID0gdGhpcztcbn07XG52YXIgYW5pZm4gPSBBbmltYXRpb24ucHJvdG90eXBlO1xuZXh0ZW5kKGFuaWZuLCB7XG4gIGluc3RhbmNlU3RyaW5nOiBmdW5jdGlvbiBpbnN0YW5jZVN0cmluZygpIHtcbiAgICByZXR1cm4gJ2FuaW1hdGlvbic7XG4gIH0sXG4gIGhvb2s6IGZ1bmN0aW9uIGhvb2soKSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICBpZiAoIV9wLmhvb2tlZCkge1xuICAgICAgLy8gYWRkIHRvIHRhcmdldCdzIGFuaW1hdGlvbiBxdWV1ZVxuICAgICAgdmFyIHE7XG4gICAgICB2YXIgdEFuaSA9IF9wLnRhcmdldC5fcHJpdmF0ZS5hbmltYXRpb247XG4gICAgICBpZiAoX3AucXVldWUpIHtcbiAgICAgICAgcSA9IHRBbmkucXVldWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBxID0gdEFuaS5jdXJyZW50O1xuICAgICAgfVxuICAgICAgcS5wdXNoKHRoaXMpO1xuXG4gICAgICAvLyBhZGQgdG8gdGhlIGFuaW1hdGlvbiBsb29wIHBvb2xcbiAgICAgIGlmIChlbGVtZW50T3JDb2xsZWN0aW9uKF9wLnRhcmdldCkpIHtcbiAgICAgICAgX3AudGFyZ2V0LmN5KCkuYWRkVG9BbmltYXRpb25Qb29sKF9wLnRhcmdldCk7XG4gICAgICB9XG4gICAgICBfcC5ob29rZWQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgcGxheTogZnVuY3Rpb24gcGxheSgpIHtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuXG4gICAgLy8gYXV0b3Jld2luZFxuICAgIGlmIChfcC5wcm9ncmVzcyA9PT0gMSkge1xuICAgICAgX3AucHJvZ3Jlc3MgPSAwO1xuICAgIH1cbiAgICBfcC5wbGF5aW5nID0gdHJ1ZTtcbiAgICBfcC5zdGFydGVkID0gZmFsc2U7IC8vIG5lZWRzIHRvIGJlIHN0YXJ0ZWQgYnkgYW5pbWF0aW9uIGxvb3BcbiAgICBfcC5zdG9wcGVkID0gZmFsc2U7XG4gICAgdGhpcy5ob29rKCk7XG5cbiAgICAvLyB0aGUgYW5pbWF0aW9uIGxvb3Agd2lsbCBzdGFydCB0aGUgYW5pbWF0aW9uLi4uXG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgcGxheWluZzogZnVuY3Rpb24gcGxheWluZygpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5wbGF5aW5nO1xuICB9LFxuICBhcHBseTogZnVuY3Rpb24gYXBwbHkoKSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICBfcC5hcHBseWluZyA9IHRydWU7XG4gICAgX3Auc3RhcnRlZCA9IGZhbHNlOyAvLyBuZWVkcyB0byBiZSBzdGFydGVkIGJ5IGFuaW1hdGlvbiBsb29wXG4gICAgX3Auc3RvcHBlZCA9IGZhbHNlO1xuICAgIHRoaXMuaG9vaygpO1xuXG4gICAgLy8gdGhlIGFuaW1hdGlvbiBsb29wIHdpbGwgYXBwbHkgdGhlIGFuaW1hdGlvbiBhdCB0aGlzIHByb2dyZXNzXG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgYXBwbHlpbmc6IGZ1bmN0aW9uIGFwcGx5aW5nKCkge1xuICAgIHJldHVybiB0aGlzLl9wcml2YXRlLmFwcGx5aW5nO1xuICB9LFxuICBwYXVzZTogZnVuY3Rpb24gcGF1c2UoKSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICBfcC5wbGF5aW5nID0gZmFsc2U7XG4gICAgX3Auc3RhcnRlZCA9IGZhbHNlO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBzdG9wOiBmdW5jdGlvbiBzdG9wKCkge1xuICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG4gICAgX3AucGxheWluZyA9IGZhbHNlO1xuICAgIF9wLnN0YXJ0ZWQgPSBmYWxzZTtcbiAgICBfcC5zdG9wcGVkID0gdHJ1ZTsgLy8gdG8gYmUgcmVtb3ZlZCBmcm9tIGFuaW1hdGlvbiBxdWV1ZXNcblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICByZXdpbmQ6IGZ1bmN0aW9uIHJld2luZCgpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9ncmVzcygwKTtcbiAgfSxcbiAgZmFzdGZvcndhcmQ6IGZ1bmN0aW9uIGZhc3Rmb3J3YXJkKCkge1xuICAgIHJldHVybiB0aGlzLnByb2dyZXNzKDEpO1xuICB9LFxuICB0aW1lOiBmdW5jdGlvbiB0aW1lKHQpIHtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuICAgIGlmICh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBfcC5wcm9ncmVzcyAqIF9wLmR1cmF0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9ncmVzcyh0IC8gX3AuZHVyYXRpb24pO1xuICAgIH1cbiAgfSxcbiAgcHJvZ3Jlc3M6IGZ1bmN0aW9uIHByb2dyZXNzKHApIHtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuICAgIHZhciB3YXNQbGF5aW5nID0gX3AucGxheWluZztcbiAgICBpZiAocCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gX3AucHJvZ3Jlc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh3YXNQbGF5aW5nKSB7XG4gICAgICAgIHRoaXMucGF1c2UoKTtcbiAgICAgIH1cbiAgICAgIF9wLnByb2dyZXNzID0gcDtcbiAgICAgIF9wLnN0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgIGlmICh3YXNQbGF5aW5nKSB7XG4gICAgICAgIHRoaXMucGxheSgpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgY29tcGxldGVkOiBmdW5jdGlvbiBjb21wbGV0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUucHJvZ3Jlc3MgPT09IDE7XG4gIH0sXG4gIHJldmVyc2U6IGZ1bmN0aW9uIHJldmVyc2UoKSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICB2YXIgd2FzUGxheWluZyA9IF9wLnBsYXlpbmc7XG4gICAgaWYgKHdhc1BsYXlpbmcpIHtcbiAgICAgIHRoaXMucGF1c2UoKTtcbiAgICB9XG4gICAgX3AucHJvZ3Jlc3MgPSAxIC0gX3AucHJvZ3Jlc3M7XG4gICAgX3Auc3RhcnRlZCA9IGZhbHNlO1xuICAgIHZhciBzd2FwID0gZnVuY3Rpb24gc3dhcChhLCBiKSB7XG4gICAgICB2YXIgX3BhID0gX3BbYV07XG4gICAgICBpZiAoX3BhID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgX3BbYV0gPSBfcFtiXTtcbiAgICAgIF9wW2JdID0gX3BhO1xuICAgIH07XG4gICAgc3dhcCgnem9vbScsICdzdGFydFpvb20nKTtcbiAgICBzd2FwKCdwYW4nLCAnc3RhcnRQYW4nKTtcbiAgICBzd2FwKCdwb3NpdGlvbicsICdzdGFydFBvc2l0aW9uJyk7XG5cbiAgICAvLyBzd2FwIHN0eWxlc1xuICAgIGlmIChfcC5zdHlsZSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBfcC5zdHlsZS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcHJvcCA9IF9wLnN0eWxlW2ldO1xuICAgICAgICB2YXIgbmFtZSA9IHByb3AubmFtZTtcbiAgICAgICAgdmFyIHN0YXJ0U3R5bGVQcm9wID0gX3Auc3RhcnRTdHlsZVtuYW1lXTtcbiAgICAgICAgX3Auc3RhcnRTdHlsZVtuYW1lXSA9IHByb3A7XG4gICAgICAgIF9wLnN0eWxlW2ldID0gc3RhcnRTdHlsZVByb3A7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh3YXNQbGF5aW5nKSB7XG4gICAgICB0aGlzLnBsYXkoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIHByb21pc2U6IGZ1bmN0aW9uIHByb21pc2UodHlwZSkge1xuICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG4gICAgdmFyIGFycjtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ2ZyYW1lJzpcbiAgICAgICAgYXJyID0gX3AuZnJhbWVzO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICBjYXNlICdjb21wbGV0ZSc6XG4gICAgICBjYXNlICdjb21wbGV0ZWQnOlxuICAgICAgICBhcnIgPSBfcC5jb21wbGV0ZXM7XG4gICAgfVxuICAgIHJldHVybiBuZXcgUHJvbWlzZSQxKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGFyci5wdXNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn0pO1xuYW5pZm4uY29tcGxldGUgPSBhbmlmbi5jb21wbGV0ZWQ7XG5hbmlmbi5ydW4gPSBhbmlmbi5wbGF5O1xuYW5pZm4ucnVubmluZyA9IGFuaWZuLnBsYXlpbmc7XG5cbnZhciBkZWZpbmUkMyA9IHtcbiAgYW5pbWF0ZWQ6IGZ1bmN0aW9uIGFuaW1hdGVkKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiBhbmltYXRlZEltcGwoKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgc2VsZklzQXJyYXlMaWtlID0gc2VsZi5sZW5ndGggIT09IHVuZGVmaW5lZDtcbiAgICAgIHZhciBhbGwgPSBzZWxmSXNBcnJheUxpa2UgPyBzZWxmIDogW3NlbGZdOyAvLyBwdXQgaW4gYXJyYXkgaWYgbm90IGFycmF5LWxpa2VcbiAgICAgIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3kgfHwgdGhpcztcbiAgICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFyIGVsZSA9IGFsbFswXTtcbiAgICAgIGlmIChlbGUpIHtcbiAgICAgICAgcmV0dXJuIGVsZS5fcHJpdmF0ZS5hbmltYXRpb24uY3VycmVudC5sZW5ndGggPiAwO1xuICAgICAgfVxuICAgIH07XG4gIH0sXG4gIC8vIGFuaW1hdGVkXG5cbiAgY2xlYXJRdWV1ZTogZnVuY3Rpb24gY2xlYXJRdWV1ZSgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gY2xlYXJRdWV1ZUltcGwoKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgc2VsZklzQXJyYXlMaWtlID0gc2VsZi5sZW5ndGggIT09IHVuZGVmaW5lZDtcbiAgICAgIHZhciBhbGwgPSBzZWxmSXNBcnJheUxpa2UgPyBzZWxmIDogW3NlbGZdOyAvLyBwdXQgaW4gYXJyYXkgaWYgbm90IGFycmF5LWxpa2VcbiAgICAgIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3kgfHwgdGhpcztcbiAgICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlID0gYWxsW2ldO1xuICAgICAgICBlbGUuX3ByaXZhdGUuYW5pbWF0aW9uLnF1ZXVlID0gW107XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICB9LFxuICAvLyBjbGVhclF1ZXVlXG5cbiAgZGVsYXk6IGZ1bmN0aW9uIGRlbGF5KCkge1xuICAgIHJldHVybiBmdW5jdGlvbiBkZWxheUltcGwodGltZSwgY29tcGxldGUpIHtcbiAgICAgIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3kgfHwgdGhpcztcbiAgICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5hbmltYXRlKHtcbiAgICAgICAgZGVsYXk6IHRpbWUsXG4gICAgICAgIGR1cmF0aW9uOiB0aW1lLFxuICAgICAgICBjb21wbGV0ZTogY29tcGxldGVcbiAgICAgIH0pO1xuICAgIH07XG4gIH0sXG4gIC8vIGRlbGF5XG5cbiAgZGVsYXlBbmltYXRpb246IGZ1bmN0aW9uIGRlbGF5QW5pbWF0aW9uKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiBkZWxheUFuaW1hdGlvbkltcGwodGltZSwgY29tcGxldGUpIHtcbiAgICAgIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3kgfHwgdGhpcztcbiAgICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5hbmltYXRpb24oe1xuICAgICAgICBkZWxheTogdGltZSxcbiAgICAgICAgZHVyYXRpb246IHRpbWUsXG4gICAgICAgIGNvbXBsZXRlOiBjb21wbGV0ZVxuICAgICAgfSk7XG4gICAgfTtcbiAgfSxcbiAgLy8gZGVsYXlcblxuICBhbmltYXRpb246IGZ1bmN0aW9uIGFuaW1hdGlvbigpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gYW5pbWF0aW9uSW1wbChwcm9wZXJ0aWVzLCBwYXJhbXMpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBzZWxmSXNBcnJheUxpa2UgPSBzZWxmLmxlbmd0aCAhPT0gdW5kZWZpbmVkO1xuICAgICAgdmFyIGFsbCA9IHNlbGZJc0FycmF5TGlrZSA/IHNlbGYgOiBbc2VsZl07IC8vIHB1dCBpbiBhcnJheSBpZiBub3QgYXJyYXktbGlrZVxuICAgICAgdmFyIGN5ID0gdGhpcy5fcHJpdmF0ZS5jeSB8fCB0aGlzO1xuICAgICAgdmFyIGlzQ29yZSA9ICFzZWxmSXNBcnJheUxpa2U7XG4gICAgICB2YXIgaXNFbGVzID0gIWlzQ29yZTtcbiAgICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICB2YXIgc3R5bGUgPSBjeS5zdHlsZSgpO1xuICAgICAgcHJvcGVydGllcyA9IGV4dGVuZCh7fSwgcHJvcGVydGllcywgcGFyYW1zKTtcbiAgICAgIHZhciBwcm9wZXJ0aWVzRW1wdHkgPSBPYmplY3Qua2V5cyhwcm9wZXJ0aWVzKS5sZW5ndGggPT09IDA7XG4gICAgICBpZiAocHJvcGVydGllc0VtcHR5KSB7XG4gICAgICAgIHJldHVybiBuZXcgQW5pbWF0aW9uKGFsbFswXSwgcHJvcGVydGllcyk7IC8vIG5vdGhpbmcgdG8gYW5pbWF0ZVxuICAgICAgfVxuICAgICAgaWYgKHByb3BlcnRpZXMuZHVyYXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwcm9wZXJ0aWVzLmR1cmF0aW9uID0gNDAwO1xuICAgICAgfVxuICAgICAgc3dpdGNoIChwcm9wZXJ0aWVzLmR1cmF0aW9uKSB7XG4gICAgICAgIGNhc2UgJ3Nsb3cnOlxuICAgICAgICAgIHByb3BlcnRpZXMuZHVyYXRpb24gPSA2MDA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2Zhc3QnOlxuICAgICAgICAgIHByb3BlcnRpZXMuZHVyYXRpb24gPSAyMDA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoaXNFbGVzKSB7XG4gICAgICAgIHByb3BlcnRpZXMuc3R5bGUgPSBzdHlsZS5nZXRQcm9wc0xpc3QocHJvcGVydGllcy5zdHlsZSB8fCBwcm9wZXJ0aWVzLmNzcyk7XG4gICAgICAgIHByb3BlcnRpZXMuY3NzID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaWYgKGlzRWxlcyAmJiBwcm9wZXJ0aWVzLnJlbmRlcmVkUG9zaXRpb24gIT0gbnVsbCkge1xuICAgICAgICB2YXIgcnBvcyA9IHByb3BlcnRpZXMucmVuZGVyZWRQb3NpdGlvbjtcbiAgICAgICAgdmFyIHBhbiA9IGN5LnBhbigpO1xuICAgICAgICB2YXIgem9vbSA9IGN5Lnpvb20oKTtcbiAgICAgICAgcHJvcGVydGllcy5wb3NpdGlvbiA9IHJlbmRlcmVkVG9Nb2RlbFBvc2l0aW9uKHJwb3MsIHpvb20sIHBhbik7XG4gICAgICB9XG5cbiAgICAgIC8vIG92ZXJyaWRlIHBhbiB3LyBwYW5CeSBpZiBzZXRcbiAgICAgIGlmIChpc0NvcmUgJiYgcHJvcGVydGllcy5wYW5CeSAhPSBudWxsKSB7XG4gICAgICAgIHZhciBwYW5CeSA9IHByb3BlcnRpZXMucGFuQnk7XG4gICAgICAgIHZhciBjeVBhbiA9IGN5LnBhbigpO1xuICAgICAgICBwcm9wZXJ0aWVzLnBhbiA9IHtcbiAgICAgICAgICB4OiBjeVBhbi54ICsgcGFuQnkueCxcbiAgICAgICAgICB5OiBjeVBhbi55ICsgcGFuQnkueVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBvdmVycmlkZSBwYW4gdy8gY2VudGVyIGlmIHNldFxuICAgICAgdmFyIGNlbnRlciA9IHByb3BlcnRpZXMuY2VudGVyIHx8IHByb3BlcnRpZXMuY2VudHJlO1xuICAgICAgaWYgKGlzQ29yZSAmJiBjZW50ZXIgIT0gbnVsbCkge1xuICAgICAgICB2YXIgY2VudGVyUGFuID0gY3kuZ2V0Q2VudGVyUGFuKGNlbnRlci5lbGVzLCBwcm9wZXJ0aWVzLnpvb20pO1xuICAgICAgICBpZiAoY2VudGVyUGFuICE9IG51bGwpIHtcbiAgICAgICAgICBwcm9wZXJ0aWVzLnBhbiA9IGNlbnRlclBhbjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBvdmVycmlkZSBwYW4gJiB6b29tIHcvIGZpdCBpZiBzZXRcbiAgICAgIGlmIChpc0NvcmUgJiYgcHJvcGVydGllcy5maXQgIT0gbnVsbCkge1xuICAgICAgICB2YXIgZml0ID0gcHJvcGVydGllcy5maXQ7XG4gICAgICAgIHZhciBmaXRWcCA9IGN5LmdldEZpdFZpZXdwb3J0KGZpdC5lbGVzIHx8IGZpdC5ib3VuZGluZ0JveCwgZml0LnBhZGRpbmcpO1xuICAgICAgICBpZiAoZml0VnAgIT0gbnVsbCkge1xuICAgICAgICAgIHByb3BlcnRpZXMucGFuID0gZml0VnAucGFuO1xuICAgICAgICAgIHByb3BlcnRpZXMuem9vbSA9IGZpdFZwLnpvb207XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gb3ZlcnJpZGUgem9vbSAoJiBwb3RlbnRpYWxseSBwYW4pIHcvIHpvb20gb2JqIGlmIHNldFxuICAgICAgaWYgKGlzQ29yZSAmJiBwbGFpbk9iamVjdChwcm9wZXJ0aWVzLnpvb20pKSB7XG4gICAgICAgIHZhciB2cCA9IGN5LmdldFpvb21lZFZpZXdwb3J0KHByb3BlcnRpZXMuem9vbSk7XG4gICAgICAgIGlmICh2cCAhPSBudWxsKSB7XG4gICAgICAgICAgaWYgKHZwLnpvb21lZCkge1xuICAgICAgICAgICAgcHJvcGVydGllcy56b29tID0gdnAuem9vbTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHZwLnBhbm5lZCkge1xuICAgICAgICAgICAgcHJvcGVydGllcy5wYW4gPSB2cC5wYW47XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb3BlcnRpZXMuem9vbSA9IG51bGw7IC8vIGFuIGluYXZhbGlkIHpvb20gKGUuZy4gbm8gZGVsdGEpIGdldHMgYXV0b21hdGljYWxseSBkZXN0cm95ZWRcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBBbmltYXRpb24oYWxsWzBdLCBwcm9wZXJ0aWVzKTtcbiAgICB9O1xuICB9LFxuICAvLyBhbmltYXRlXG5cbiAgYW5pbWF0ZTogZnVuY3Rpb24gYW5pbWF0ZSgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gYW5pbWF0ZUltcGwocHJvcGVydGllcywgcGFyYW1zKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgc2VsZklzQXJyYXlMaWtlID0gc2VsZi5sZW5ndGggIT09IHVuZGVmaW5lZDtcbiAgICAgIHZhciBhbGwgPSBzZWxmSXNBcnJheUxpa2UgPyBzZWxmIDogW3NlbGZdOyAvLyBwdXQgaW4gYXJyYXkgaWYgbm90IGFycmF5LWxpa2VcbiAgICAgIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3kgfHwgdGhpcztcbiAgICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1zKSB7XG4gICAgICAgIHByb3BlcnRpZXMgPSBleHRlbmQoe30sIHByb3BlcnRpZXMsIHBhcmFtcyk7XG4gICAgICB9XG5cbiAgICAgIC8vIG1hbnVhbGx5IGhvb2sgYW5kIHJ1biB0aGUgYW5pbWF0aW9uXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlID0gYWxsW2ldO1xuICAgICAgICB2YXIgcXVldWUgPSBlbGUuYW5pbWF0ZWQoKSAmJiAocHJvcGVydGllcy5xdWV1ZSA9PT0gdW5kZWZpbmVkIHx8IHByb3BlcnRpZXMucXVldWUpO1xuICAgICAgICB2YXIgYW5pID0gZWxlLmFuaW1hdGlvbihwcm9wZXJ0aWVzLCBxdWV1ZSA/IHtcbiAgICAgICAgICBxdWV1ZTogdHJ1ZVxuICAgICAgICB9IDogdW5kZWZpbmVkKTtcbiAgICAgICAgYW5pLnBsYXkoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICAgIH07XG4gIH0sXG4gIC8vIGFuaW1hdGVcblxuICBzdG9wOiBmdW5jdGlvbiBzdG9wKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiBzdG9wSW1wbChjbGVhclF1ZXVlLCBqdW1wVG9FbmQpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBzZWxmSXNBcnJheUxpa2UgPSBzZWxmLmxlbmd0aCAhPT0gdW5kZWZpbmVkO1xuICAgICAgdmFyIGFsbCA9IHNlbGZJc0FycmF5TGlrZSA/IHNlbGYgOiBbc2VsZl07IC8vIHB1dCBpbiBhcnJheSBpZiBub3QgYXJyYXktbGlrZVxuICAgICAgdmFyIGN5ID0gdGhpcy5fcHJpdmF0ZS5jeSB8fCB0aGlzO1xuICAgICAgaWYgKCFjeS5zdHlsZUVuYWJsZWQoKSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYWxsLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBlbGUgPSBhbGxbaV07XG4gICAgICAgIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgICAgICAgdmFyIGFuaXMgPSBfcC5hbmltYXRpb24uY3VycmVudDtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBhbmlzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgdmFyIGFuaSA9IGFuaXNbal07XG4gICAgICAgICAgdmFyIGFuaV9wID0gYW5pLl9wcml2YXRlO1xuICAgICAgICAgIGlmIChqdW1wVG9FbmQpIHtcbiAgICAgICAgICAgIC8vIG5leHQgaXRlcmF0aW9uIG9mIHRoZSBhbmltYXRpb24gbG9vcCwgdGhlIGFuaW1hdGlvblxuICAgICAgICAgICAgLy8gd2lsbCBnbyBzdHJhaWdodCB0byB0aGUgZW5kIGFuZCBiZSByZW1vdmVkXG4gICAgICAgICAgICBhbmlfcC5kdXJhdGlvbiA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2xlYXIgdGhlIHF1ZXVlIG9mIGZ1dHVyZSBhbmltYXRpb25zXG4gICAgICAgIGlmIChjbGVhclF1ZXVlKSB7XG4gICAgICAgICAgX3AuYW5pbWF0aW9uLnF1ZXVlID0gW107XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFqdW1wVG9FbmQpIHtcbiAgICAgICAgICBfcC5hbmltYXRpb24uY3VycmVudCA9IFtdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIHdlIGhhdmUgdG8gbm90aWZ5ICh0aGUgYW5pbWF0aW9uIGxvb3AgZG9lc24ndCBkbyBpdCBmb3IgdXMgb24gYHN0b3BgKVxuICAgICAgY3kubm90aWZ5KCdkcmF3Jyk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICB9IC8vIHN0b3Bcbn07IC8vIGRlZmluZVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYW4gYEFycmF5YCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FycmF5KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5KGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXkoJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXkoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cblxudmFyIGlzQXJyYXlfMTtcbnZhciBoYXNSZXF1aXJlZElzQXJyYXk7XG5cbmZ1bmN0aW9uIHJlcXVpcmVJc0FycmF5ICgpIHtcblx0aWYgKGhhc1JlcXVpcmVkSXNBcnJheSkgcmV0dXJuIGlzQXJyYXlfMTtcblx0aGFzUmVxdWlyZWRJc0FycmF5ID0gMTtcblx0dmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuXG5cdGlzQXJyYXlfMSA9IGlzQXJyYXk7XG5cdHJldHVybiBpc0FycmF5XzE7XG59XG5cbnZhciBfaXNLZXk7XG52YXIgaGFzUmVxdWlyZWRfaXNLZXk7XG5cbmZ1bmN0aW9uIHJlcXVpcmVfaXNLZXkgKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRfaXNLZXkpIHJldHVybiBfaXNLZXk7XG5cdGhhc1JlcXVpcmVkX2lzS2V5ID0gMTtcblx0dmFyIGlzQXJyYXkgPSByZXF1aXJlSXNBcnJheSgpLFxuXHQgICAgaXNTeW1ib2wgPSByZXF1aXJlSXNTeW1ib2woKTtcblxuXHQvKiogVXNlZCB0byBtYXRjaCBwcm9wZXJ0eSBuYW1lcyB3aXRoaW4gcHJvcGVydHkgcGF0aHMuICovXG5cdHZhciByZUlzRGVlcFByb3AgPSAvXFwufFxcWyg/OlteW1xcXV0qfChbXCInXSkoPzooPyFcXDEpW15cXFxcXXxcXFxcLikqP1xcMSlcXF0vLFxuXHQgICAgcmVJc1BsYWluUHJvcCA9IC9eXFx3KiQvO1xuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHByb3BlcnR5IG5hbWUgYW5kIG5vdCBhIHByb3BlcnR5IHBhdGguXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuXHQgKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeSBrZXlzIG9uLlxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHByb3BlcnR5IG5hbWUsIGVsc2UgYGZhbHNlYC5cblx0ICovXG5cdGZ1bmN0aW9uIGlzS2V5KHZhbHVlLCBvYmplY3QpIHtcblx0ICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcblx0ICAgIHJldHVybiBmYWxzZTtcblx0ICB9XG5cdCAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG5cdCAgaWYgKHR5cGUgPT0gJ251bWJlcicgfHwgdHlwZSA9PSAnc3ltYm9sJyB8fCB0eXBlID09ICdib29sZWFuJyB8fFxuXHQgICAgICB2YWx1ZSA9PSBudWxsIHx8IGlzU3ltYm9sKHZhbHVlKSkge1xuXHQgICAgcmV0dXJuIHRydWU7XG5cdCAgfVxuXHQgIHJldHVybiByZUlzUGxhaW5Qcm9wLnRlc3QodmFsdWUpIHx8ICFyZUlzRGVlcFByb3AudGVzdCh2YWx1ZSkgfHxcblx0ICAgIChvYmplY3QgIT0gbnVsbCAmJiB2YWx1ZSBpbiBPYmplY3Qob2JqZWN0KSk7XG5cdH1cblxuXHRfaXNLZXkgPSBpc0tleTtcblx0cmV0dXJuIF9pc0tleTtcbn1cblxudmFyIGlzRnVuY3Rpb25fMTtcbnZhciBoYXNSZXF1aXJlZElzRnVuY3Rpb247XG5cbmZ1bmN0aW9uIHJlcXVpcmVJc0Z1bmN0aW9uICgpIHtcblx0aWYgKGhhc1JlcXVpcmVkSXNGdW5jdGlvbikgcmV0dXJuIGlzRnVuY3Rpb25fMTtcblx0aGFzUmVxdWlyZWRJc0Z1bmN0aW9uID0gMTtcblx0dmFyIGJhc2VHZXRUYWcgPSByZXF1aXJlX2Jhc2VHZXRUYWcoKSxcblx0ICAgIGlzT2JqZWN0ID0gcmVxdWlyZUlzT2JqZWN0KCk7XG5cblx0LyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xuXHR2YXIgYXN5bmNUYWcgPSAnW29iamVjdCBBc3luY0Z1bmN0aW9uXScsXG5cdCAgICBmdW5jVGFnID0gJ1tvYmplY3QgRnVuY3Rpb25dJyxcblx0ICAgIGdlblRhZyA9ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXScsXG5cdCAgICBwcm94eVRhZyA9ICdbb2JqZWN0IFByb3h5XSc7XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgRnVuY3Rpb25gIG9iamVjdC5cblx0ICpcblx0ICogQHN0YXRpY1xuXHQgKiBAbWVtYmVyT2YgX1xuXHQgKiBAc2luY2UgMC4xLjBcblx0ICogQGNhdGVnb3J5IExhbmdcblx0ICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG5cdCAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgZnVuY3Rpb24sIGVsc2UgYGZhbHNlYC5cblx0ICogQGV4YW1wbGVcblx0ICpcblx0ICogXy5pc0Z1bmN0aW9uKF8pO1xuXHQgKiAvLyA9PiB0cnVlXG5cdCAqXG5cdCAqIF8uaXNGdW5jdGlvbigvYWJjLyk7XG5cdCAqIC8vID0+IGZhbHNlXG5cdCAqL1xuXHRmdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKSB7XG5cdCAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHtcblx0ICAgIHJldHVybiBmYWxzZTtcblx0ICB9XG5cdCAgLy8gVGhlIHVzZSBvZiBgT2JqZWN0I3RvU3RyaW5nYCBhdm9pZHMgaXNzdWVzIHdpdGggdGhlIGB0eXBlb2ZgIG9wZXJhdG9yXG5cdCAgLy8gaW4gU2FmYXJpIDkgd2hpY2ggcmV0dXJucyAnb2JqZWN0JyBmb3IgdHlwZWQgYXJyYXlzIGFuZCBvdGhlciBjb25zdHJ1Y3RvcnMuXG5cdCAgdmFyIHRhZyA9IGJhc2VHZXRUYWcodmFsdWUpO1xuXHQgIHJldHVybiB0YWcgPT0gZnVuY1RhZyB8fCB0YWcgPT0gZ2VuVGFnIHx8IHRhZyA9PSBhc3luY1RhZyB8fCB0YWcgPT0gcHJveHlUYWc7XG5cdH1cblxuXHRpc0Z1bmN0aW9uXzEgPSBpc0Z1bmN0aW9uO1xuXHRyZXR1cm4gaXNGdW5jdGlvbl8xO1xufVxuXG52YXIgX2NvcmVKc0RhdGE7XG52YXIgaGFzUmVxdWlyZWRfY29yZUpzRGF0YTtcblxuZnVuY3Rpb24gcmVxdWlyZV9jb3JlSnNEYXRhICgpIHtcblx0aWYgKGhhc1JlcXVpcmVkX2NvcmVKc0RhdGEpIHJldHVybiBfY29yZUpzRGF0YTtcblx0aGFzUmVxdWlyZWRfY29yZUpzRGF0YSA9IDE7XG5cdHZhciByb290ID0gcmVxdWlyZV9yb290KCk7XG5cblx0LyoqIFVzZWQgdG8gZGV0ZWN0IG92ZXJyZWFjaGluZyBjb3JlLWpzIHNoaW1zLiAqL1xuXHR2YXIgY29yZUpzRGF0YSA9IHJvb3RbJ19fY29yZS1qc19zaGFyZWRfXyddO1xuXG5cdF9jb3JlSnNEYXRhID0gY29yZUpzRGF0YTtcblx0cmV0dXJuIF9jb3JlSnNEYXRhO1xufVxuXG52YXIgX2lzTWFza2VkO1xudmFyIGhhc1JlcXVpcmVkX2lzTWFza2VkO1xuXG5mdW5jdGlvbiByZXF1aXJlX2lzTWFza2VkICgpIHtcblx0aWYgKGhhc1JlcXVpcmVkX2lzTWFza2VkKSByZXR1cm4gX2lzTWFza2VkO1xuXHRoYXNSZXF1aXJlZF9pc01hc2tlZCA9IDE7XG5cdHZhciBjb3JlSnNEYXRhID0gcmVxdWlyZV9jb3JlSnNEYXRhKCk7XG5cblx0LyoqIFVzZWQgdG8gZGV0ZWN0IG1ldGhvZHMgbWFzcXVlcmFkaW5nIGFzIG5hdGl2ZS4gKi9cblx0dmFyIG1hc2tTcmNLZXkgPSAoZnVuY3Rpb24oKSB7XG5cdCAgdmFyIHVpZCA9IC9bXi5dKyQvLmV4ZWMoY29yZUpzRGF0YSAmJiBjb3JlSnNEYXRhLmtleXMgJiYgY29yZUpzRGF0YS5rZXlzLklFX1BST1RPIHx8ICcnKTtcblx0ICByZXR1cm4gdWlkID8gKCdTeW1ib2woc3JjKV8xLicgKyB1aWQpIDogJyc7XG5cdH0oKSk7XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBgZnVuY2AgaGFzIGl0cyBzb3VyY2UgbWFza2VkLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjaGVjay5cblx0ICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBmdW5jYCBpcyBtYXNrZWQsIGVsc2UgYGZhbHNlYC5cblx0ICovXG5cdGZ1bmN0aW9uIGlzTWFza2VkKGZ1bmMpIHtcblx0ICByZXR1cm4gISFtYXNrU3JjS2V5ICYmIChtYXNrU3JjS2V5IGluIGZ1bmMpO1xuXHR9XG5cblx0X2lzTWFza2VkID0gaXNNYXNrZWQ7XG5cdHJldHVybiBfaXNNYXNrZWQ7XG59XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cblxudmFyIF90b1NvdXJjZTtcbnZhciBoYXNSZXF1aXJlZF90b1NvdXJjZTtcblxuZnVuY3Rpb24gcmVxdWlyZV90b1NvdXJjZSAoKSB7XG5cdGlmIChoYXNSZXF1aXJlZF90b1NvdXJjZSkgcmV0dXJuIF90b1NvdXJjZTtcblx0aGFzUmVxdWlyZWRfdG9Tb3VyY2UgPSAxO1xuXHR2YXIgZnVuY1Byb3RvID0gRnVuY3Rpb24ucHJvdG90eXBlO1xuXG5cdC8qKiBVc2VkIHRvIHJlc29sdmUgdGhlIGRlY29tcGlsZWQgc291cmNlIG9mIGZ1bmN0aW9ucy4gKi9cblx0dmFyIGZ1bmNUb1N0cmluZyA9IGZ1bmNQcm90by50b1N0cmluZztcblxuXHQvKipcblx0ICogQ29udmVydHMgYGZ1bmNgIHRvIGl0cyBzb3VyY2UgY29kZS5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY29udmVydC5cblx0ICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc291cmNlIGNvZGUuXG5cdCAqL1xuXHRmdW5jdGlvbiB0b1NvdXJjZShmdW5jKSB7XG5cdCAgaWYgKGZ1bmMgIT0gbnVsbCkge1xuXHQgICAgdHJ5IHtcblx0ICAgICAgcmV0dXJuIGZ1bmNUb1N0cmluZy5jYWxsKGZ1bmMpO1xuXHQgICAgfSBjYXRjaCAoZSkge31cblx0ICAgIHRyeSB7XG5cdCAgICAgIHJldHVybiAoZnVuYyArICcnKTtcblx0ICAgIH0gY2F0Y2ggKGUpIHt9XG5cdCAgfVxuXHQgIHJldHVybiAnJztcblx0fVxuXG5cdF90b1NvdXJjZSA9IHRvU291cmNlO1xuXHRyZXR1cm4gX3RvU291cmNlO1xufVxuXG52YXIgX2Jhc2VJc05hdGl2ZTtcbnZhciBoYXNSZXF1aXJlZF9iYXNlSXNOYXRpdmU7XG5cbmZ1bmN0aW9uIHJlcXVpcmVfYmFzZUlzTmF0aXZlICgpIHtcblx0aWYgKGhhc1JlcXVpcmVkX2Jhc2VJc05hdGl2ZSkgcmV0dXJuIF9iYXNlSXNOYXRpdmU7XG5cdGhhc1JlcXVpcmVkX2Jhc2VJc05hdGl2ZSA9IDE7XG5cdHZhciBpc0Z1bmN0aW9uID0gcmVxdWlyZUlzRnVuY3Rpb24oKSxcblx0ICAgIGlzTWFza2VkID0gcmVxdWlyZV9pc01hc2tlZCgpLFxuXHQgICAgaXNPYmplY3QgPSByZXF1aXJlSXNPYmplY3QoKSxcblx0ICAgIHRvU291cmNlID0gcmVxdWlyZV90b1NvdXJjZSgpO1xuXG5cdC8qKlxuXHQgKiBVc2VkIHRvIG1hdGNoIGBSZWdFeHBgXG5cdCAqIFtzeW50YXggY2hhcmFjdGVyc10oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcGF0dGVybnMpLlxuXHQgKi9cblx0dmFyIHJlUmVnRXhwQ2hhciA9IC9bXFxcXF4kLiorPygpW1xcXXt9fF0vZztcblxuXHQvKiogVXNlZCB0byBkZXRlY3QgaG9zdCBjb25zdHJ1Y3RvcnMgKFNhZmFyaSkuICovXG5cdHZhciByZUlzSG9zdEN0b3IgPSAvXlxcW29iamVjdCAuKz9Db25zdHJ1Y3RvclxcXSQvO1xuXG5cdC8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cblx0dmFyIGZ1bmNQcm90byA9IEZ1bmN0aW9uLnByb3RvdHlwZSxcblx0ICAgIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuXHQvKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG5cdHZhciBmdW5jVG9TdHJpbmcgPSBmdW5jUHJvdG8udG9TdHJpbmc7XG5cblx0LyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG5cdHZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG5cdC8qKiBVc2VkIHRvIGRldGVjdCBpZiBhIG1ldGhvZCBpcyBuYXRpdmUuICovXG5cdHZhciByZUlzTmF0aXZlID0gUmVnRXhwKCdeJyArXG5cdCAgZnVuY1RvU3RyaW5nLmNhbGwoaGFzT3duUHJvcGVydHkpLnJlcGxhY2UocmVSZWdFeHBDaGFyLCAnXFxcXCQmJylcblx0ICAucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXFxcXCgpfCBmb3IgLis/KD89XFxcXFxcXSkvZywgJyQxLio/JykgKyAnJCdcblx0KTtcblxuXHQvKipcblx0ICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNOYXRpdmVgIHdpdGhvdXQgYmFkIHNoaW0gY2hlY2tzLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cblx0ICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBuYXRpdmUgZnVuY3Rpb24sXG5cdCAqICBlbHNlIGBmYWxzZWAuXG5cdCAqL1xuXHRmdW5jdGlvbiBiYXNlSXNOYXRpdmUodmFsdWUpIHtcblx0ICBpZiAoIWlzT2JqZWN0KHZhbHVlKSB8fCBpc01hc2tlZCh2YWx1ZSkpIHtcblx0ICAgIHJldHVybiBmYWxzZTtcblx0ICB9XG5cdCAgdmFyIHBhdHRlcm4gPSBpc0Z1bmN0aW9uKHZhbHVlKSA/IHJlSXNOYXRpdmUgOiByZUlzSG9zdEN0b3I7XG5cdCAgcmV0dXJuIHBhdHRlcm4udGVzdCh0b1NvdXJjZSh2YWx1ZSkpO1xuXHR9XG5cblx0X2Jhc2VJc05hdGl2ZSA9IGJhc2VJc05hdGl2ZTtcblx0cmV0dXJuIF9iYXNlSXNOYXRpdmU7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgdmFsdWUgYXQgYGtleWAgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUuXG4gKi9cblxudmFyIF9nZXRWYWx1ZTtcbnZhciBoYXNSZXF1aXJlZF9nZXRWYWx1ZTtcblxuZnVuY3Rpb24gcmVxdWlyZV9nZXRWYWx1ZSAoKSB7XG5cdGlmIChoYXNSZXF1aXJlZF9nZXRWYWx1ZSkgcmV0dXJuIF9nZXRWYWx1ZTtcblx0aGFzUmVxdWlyZWRfZ2V0VmFsdWUgPSAxO1xuXHRmdW5jdGlvbiBnZXRWYWx1ZShvYmplY3QsIGtleSkge1xuXHQgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFtrZXldO1xuXHR9XG5cblx0X2dldFZhbHVlID0gZ2V0VmFsdWU7XG5cdHJldHVybiBfZ2V0VmFsdWU7XG59XG5cbnZhciBfZ2V0TmF0aXZlO1xudmFyIGhhc1JlcXVpcmVkX2dldE5hdGl2ZTtcblxuZnVuY3Rpb24gcmVxdWlyZV9nZXROYXRpdmUgKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRfZ2V0TmF0aXZlKSByZXR1cm4gX2dldE5hdGl2ZTtcblx0aGFzUmVxdWlyZWRfZ2V0TmF0aXZlID0gMTtcblx0dmFyIGJhc2VJc05hdGl2ZSA9IHJlcXVpcmVfYmFzZUlzTmF0aXZlKCksXG5cdCAgICBnZXRWYWx1ZSA9IHJlcXVpcmVfZ2V0VmFsdWUoKTtcblxuXHQvKipcblx0ICogR2V0cyB0aGUgbmF0aXZlIGZ1bmN0aW9uIGF0IGBrZXlgIG9mIGBvYmplY3RgLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgbWV0aG9kIHRvIGdldC5cblx0ICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGZ1bmN0aW9uIGlmIGl0J3MgbmF0aXZlLCBlbHNlIGB1bmRlZmluZWRgLlxuXHQgKi9cblx0ZnVuY3Rpb24gZ2V0TmF0aXZlKG9iamVjdCwga2V5KSB7XG5cdCAgdmFyIHZhbHVlID0gZ2V0VmFsdWUob2JqZWN0LCBrZXkpO1xuXHQgIHJldHVybiBiYXNlSXNOYXRpdmUodmFsdWUpID8gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHRfZ2V0TmF0aXZlID0gZ2V0TmF0aXZlO1xuXHRyZXR1cm4gX2dldE5hdGl2ZTtcbn1cblxudmFyIF9uYXRpdmVDcmVhdGU7XG52YXIgaGFzUmVxdWlyZWRfbmF0aXZlQ3JlYXRlO1xuXG5mdW5jdGlvbiByZXF1aXJlX25hdGl2ZUNyZWF0ZSAoKSB7XG5cdGlmIChoYXNSZXF1aXJlZF9uYXRpdmVDcmVhdGUpIHJldHVybiBfbmF0aXZlQ3JlYXRlO1xuXHRoYXNSZXF1aXJlZF9uYXRpdmVDcmVhdGUgPSAxO1xuXHR2YXIgZ2V0TmF0aXZlID0gcmVxdWlyZV9nZXROYXRpdmUoKTtcblxuXHQvKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG5cdHZhciBuYXRpdmVDcmVhdGUgPSBnZXROYXRpdmUoT2JqZWN0LCAnY3JlYXRlJyk7XG5cblx0X25hdGl2ZUNyZWF0ZSA9IG5hdGl2ZUNyZWF0ZTtcblx0cmV0dXJuIF9uYXRpdmVDcmVhdGU7XG59XG5cbnZhciBfaGFzaENsZWFyO1xudmFyIGhhc1JlcXVpcmVkX2hhc2hDbGVhcjtcblxuZnVuY3Rpb24gcmVxdWlyZV9oYXNoQ2xlYXIgKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRfaGFzaENsZWFyKSByZXR1cm4gX2hhc2hDbGVhcjtcblx0aGFzUmVxdWlyZWRfaGFzaENsZWFyID0gMTtcblx0dmFyIG5hdGl2ZUNyZWF0ZSA9IHJlcXVpcmVfbmF0aXZlQ3JlYXRlKCk7XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIGhhc2guXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBuYW1lIGNsZWFyXG5cdCAqIEBtZW1iZXJPZiBIYXNoXG5cdCAqL1xuXHRmdW5jdGlvbiBoYXNoQ2xlYXIoKSB7XG5cdCAgdGhpcy5fX2RhdGFfXyA9IG5hdGl2ZUNyZWF0ZSA/IG5hdGl2ZUNyZWF0ZShudWxsKSA6IHt9O1xuXHQgIHRoaXMuc2l6ZSA9IDA7XG5cdH1cblxuXHRfaGFzaENsZWFyID0gaGFzaENsZWFyO1xuXHRyZXR1cm4gX2hhc2hDbGVhcjtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgaGFzaC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZGVsZXRlXG4gKiBAbWVtYmVyT2YgSGFzaFxuICogQHBhcmFtIHtPYmplY3R9IGhhc2ggVGhlIGhhc2ggdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gKi9cblxudmFyIF9oYXNoRGVsZXRlO1xudmFyIGhhc1JlcXVpcmVkX2hhc2hEZWxldGU7XG5cbmZ1bmN0aW9uIHJlcXVpcmVfaGFzaERlbGV0ZSAoKSB7XG5cdGlmIChoYXNSZXF1aXJlZF9oYXNoRGVsZXRlKSByZXR1cm4gX2hhc2hEZWxldGU7XG5cdGhhc1JlcXVpcmVkX2hhc2hEZWxldGUgPSAxO1xuXHRmdW5jdGlvbiBoYXNoRGVsZXRlKGtleSkge1xuXHQgIHZhciByZXN1bHQgPSB0aGlzLmhhcyhrZXkpICYmIGRlbGV0ZSB0aGlzLl9fZGF0YV9fW2tleV07XG5cdCAgdGhpcy5zaXplIC09IHJlc3VsdCA/IDEgOiAwO1xuXHQgIHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRfaGFzaERlbGV0ZSA9IGhhc2hEZWxldGU7XG5cdHJldHVybiBfaGFzaERlbGV0ZTtcbn1cblxudmFyIF9oYXNoR2V0O1xudmFyIGhhc1JlcXVpcmVkX2hhc2hHZXQ7XG5cbmZ1bmN0aW9uIHJlcXVpcmVfaGFzaEdldCAoKSB7XG5cdGlmIChoYXNSZXF1aXJlZF9oYXNoR2V0KSByZXR1cm4gX2hhc2hHZXQ7XG5cdGhhc1JlcXVpcmVkX2hhc2hHZXQgPSAxO1xuXHR2YXIgbmF0aXZlQ3JlYXRlID0gcmVxdWlyZV9uYXRpdmVDcmVhdGUoKTtcblxuXHQvKiogVXNlZCB0byBzdGFuZC1pbiBmb3IgYHVuZGVmaW5lZGAgaGFzaCB2YWx1ZXMuICovXG5cdHZhciBIQVNIX1VOREVGSU5FRCA9ICdfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fJztcblxuXHQvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG5cdHZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cblx0LyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG5cdHZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBoYXNoIHZhbHVlIGZvciBga2V5YC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQG5hbWUgZ2V0XG5cdCAqIEBtZW1iZXJPZiBIYXNoXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuXHQgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG5cdCAqL1xuXHRmdW5jdGlvbiBoYXNoR2V0KGtleSkge1xuXHQgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcblx0ICBpZiAobmF0aXZlQ3JlYXRlKSB7XG5cdCAgICB2YXIgcmVzdWx0ID0gZGF0YVtrZXldO1xuXHQgICAgcmV0dXJuIHJlc3VsdCA9PT0gSEFTSF9VTkRFRklORUQgPyB1bmRlZmluZWQgOiByZXN1bHQ7XG5cdCAgfVxuXHQgIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSkgPyBkYXRhW2tleV0gOiB1bmRlZmluZWQ7XG5cdH1cblxuXHRfaGFzaEdldCA9IGhhc2hHZXQ7XG5cdHJldHVybiBfaGFzaEdldDtcbn1cblxudmFyIF9oYXNoSGFzO1xudmFyIGhhc1JlcXVpcmVkX2hhc2hIYXM7XG5cbmZ1bmN0aW9uIHJlcXVpcmVfaGFzaEhhcyAoKSB7XG5cdGlmIChoYXNSZXF1aXJlZF9oYXNoSGFzKSByZXR1cm4gX2hhc2hIYXM7XG5cdGhhc1JlcXVpcmVkX2hhc2hIYXMgPSAxO1xuXHR2YXIgbmF0aXZlQ3JlYXRlID0gcmVxdWlyZV9uYXRpdmVDcmVhdGUoKTtcblxuXHQvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG5cdHZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cblx0LyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG5cdHZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYSBoYXNoIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBuYW1lIGhhc1xuXHQgKiBAbWVtYmVyT2YgSGFzaFxuXHQgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuXHQgKi9cblx0ZnVuY3Rpb24gaGFzaEhhcyhrZXkpIHtcblx0ICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG5cdCAgcmV0dXJuIG5hdGl2ZUNyZWF0ZSA/IChkYXRhW2tleV0gIT09IHVuZGVmaW5lZCkgOiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSk7XG5cdH1cblxuXHRfaGFzaEhhcyA9IGhhc2hIYXM7XG5cdHJldHVybiBfaGFzaEhhcztcbn1cblxudmFyIF9oYXNoU2V0O1xudmFyIGhhc1JlcXVpcmVkX2hhc2hTZXQ7XG5cbmZ1bmN0aW9uIHJlcXVpcmVfaGFzaFNldCAoKSB7XG5cdGlmIChoYXNSZXF1aXJlZF9oYXNoU2V0KSByZXR1cm4gX2hhc2hTZXQ7XG5cdGhhc1JlcXVpcmVkX2hhc2hTZXQgPSAxO1xuXHR2YXIgbmF0aXZlQ3JlYXRlID0gcmVxdWlyZV9uYXRpdmVDcmVhdGUoKTtcblxuXHQvKiogVXNlZCB0byBzdGFuZC1pbiBmb3IgYHVuZGVmaW5lZGAgaGFzaCB2YWx1ZXMuICovXG5cdHZhciBIQVNIX1VOREVGSU5FRCA9ICdfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fJztcblxuXHQvKipcblx0ICogU2V0cyB0aGUgaGFzaCBga2V5YCB0byBgdmFsdWVgLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAbmFtZSBzZXRcblx0ICogQG1lbWJlck9mIEhhc2hcblx0ICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG5cdCAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cblx0ICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgaGFzaCBpbnN0YW5jZS5cblx0ICovXG5cdGZ1bmN0aW9uIGhhc2hTZXQoa2V5LCB2YWx1ZSkge1xuXHQgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcblx0ICB0aGlzLnNpemUgKz0gdGhpcy5oYXMoa2V5KSA/IDAgOiAxO1xuXHQgIGRhdGFba2V5XSA9IChuYXRpdmVDcmVhdGUgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCkgPyBIQVNIX1VOREVGSU5FRCA6IHZhbHVlO1xuXHQgIHJldHVybiB0aGlzO1xuXHR9XG5cblx0X2hhc2hTZXQgPSBoYXNoU2V0O1xuXHRyZXR1cm4gX2hhc2hTZXQ7XG59XG5cbnZhciBfSGFzaDtcbnZhciBoYXNSZXF1aXJlZF9IYXNoO1xuXG5mdW5jdGlvbiByZXF1aXJlX0hhc2ggKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRfSGFzaCkgcmV0dXJuIF9IYXNoO1xuXHRoYXNSZXF1aXJlZF9IYXNoID0gMTtcblx0dmFyIGhhc2hDbGVhciA9IHJlcXVpcmVfaGFzaENsZWFyKCksXG5cdCAgICBoYXNoRGVsZXRlID0gcmVxdWlyZV9oYXNoRGVsZXRlKCksXG5cdCAgICBoYXNoR2V0ID0gcmVxdWlyZV9oYXNoR2V0KCksXG5cdCAgICBoYXNoSGFzID0gcmVxdWlyZV9oYXNoSGFzKCksXG5cdCAgICBoYXNoU2V0ID0gcmVxdWlyZV9oYXNoU2V0KCk7XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBoYXNoIG9iamVjdC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuXHQgKi9cblx0ZnVuY3Rpb24gSGFzaChlbnRyaWVzKSB7XG5cdCAgdmFyIGluZGV4ID0gLTEsXG5cdCAgICAgIGxlbmd0aCA9IGVudHJpZXMgPT0gbnVsbCA/IDAgOiBlbnRyaWVzLmxlbmd0aDtcblxuXHQgIHRoaXMuY2xlYXIoKTtcblx0ICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuXHQgICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleF07XG5cdCAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xuXHQgIH1cblx0fVxuXG5cdC8vIEFkZCBtZXRob2RzIHRvIGBIYXNoYC5cblx0SGFzaC5wcm90b3R5cGUuY2xlYXIgPSBoYXNoQ2xlYXI7XG5cdEhhc2gucHJvdG90eXBlWydkZWxldGUnXSA9IGhhc2hEZWxldGU7XG5cdEhhc2gucHJvdG90eXBlLmdldCA9IGhhc2hHZXQ7XG5cdEhhc2gucHJvdG90eXBlLmhhcyA9IGhhc2hIYXM7XG5cdEhhc2gucHJvdG90eXBlLnNldCA9IGhhc2hTZXQ7XG5cblx0X0hhc2ggPSBIYXNoO1xuXHRyZXR1cm4gX0hhc2g7XG59XG5cbi8qKlxuICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgbGlzdCBjYWNoZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgY2xlYXJcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqL1xuXG52YXIgX2xpc3RDYWNoZUNsZWFyO1xudmFyIGhhc1JlcXVpcmVkX2xpc3RDYWNoZUNsZWFyO1xuXG5mdW5jdGlvbiByZXF1aXJlX2xpc3RDYWNoZUNsZWFyICgpIHtcblx0aWYgKGhhc1JlcXVpcmVkX2xpc3RDYWNoZUNsZWFyKSByZXR1cm4gX2xpc3RDYWNoZUNsZWFyO1xuXHRoYXNSZXF1aXJlZF9saXN0Q2FjaGVDbGVhciA9IDE7XG5cdGZ1bmN0aW9uIGxpc3RDYWNoZUNsZWFyKCkge1xuXHQgIHRoaXMuX19kYXRhX18gPSBbXTtcblx0ICB0aGlzLnNpemUgPSAwO1xuXHR9XG5cblx0X2xpc3RDYWNoZUNsZWFyID0gbGlzdENhY2hlQ2xlYXI7XG5cdHJldHVybiBfbGlzdENhY2hlQ2xlYXI7XG59XG5cbi8qKlxuICogUGVyZm9ybXMgYVxuICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAqIGNvbXBhcmlzb24gYmV0d2VlbiB0d28gdmFsdWVzIHRvIGRldGVybWluZSBpZiB0aGV5IGFyZSBlcXVpdmFsZW50LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICogdmFyIG90aGVyID0geyAnYSc6IDEgfTtcbiAqXG4gKiBfLmVxKG9iamVjdCwgb2JqZWN0KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmVxKG9iamVjdCwgb3RoZXIpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmVxKCdhJywgJ2EnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmVxKCdhJywgT2JqZWN0KCdhJykpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmVxKE5hTiwgTmFOKTtcbiAqIC8vID0+IHRydWVcbiAqL1xuXG52YXIgZXFfMTtcbnZhciBoYXNSZXF1aXJlZEVxO1xuXG5mdW5jdGlvbiByZXF1aXJlRXEgKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRFcSkgcmV0dXJuIGVxXzE7XG5cdGhhc1JlcXVpcmVkRXEgPSAxO1xuXHRmdW5jdGlvbiBlcSh2YWx1ZSwgb3RoZXIpIHtcblx0ICByZXR1cm4gdmFsdWUgPT09IG90aGVyIHx8ICh2YWx1ZSAhPT0gdmFsdWUgJiYgb3RoZXIgIT09IG90aGVyKTtcblx0fVxuXG5cdGVxXzEgPSBlcTtcblx0cmV0dXJuIGVxXzE7XG59XG5cbnZhciBfYXNzb2NJbmRleE9mO1xudmFyIGhhc1JlcXVpcmVkX2Fzc29jSW5kZXhPZjtcblxuZnVuY3Rpb24gcmVxdWlyZV9hc3NvY0luZGV4T2YgKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRfYXNzb2NJbmRleE9mKSByZXR1cm4gX2Fzc29jSW5kZXhPZjtcblx0aGFzUmVxdWlyZWRfYXNzb2NJbmRleE9mID0gMTtcblx0dmFyIGVxID0gcmVxdWlyZUVxKCk7XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGluZGV4IGF0IHdoaWNoIHRoZSBga2V5YCBpcyBmb3VuZCBpbiBgYXJyYXlgIG9mIGtleS12YWx1ZSBwYWlycy5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG5cdCAqIEBwYXJhbSB7Kn0ga2V5IFRoZSBrZXkgdG8gc2VhcmNoIGZvci5cblx0ICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cblx0ICovXG5cdGZ1bmN0aW9uIGFzc29jSW5kZXhPZihhcnJheSwga2V5KSB7XG5cdCAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblx0ICB3aGlsZSAobGVuZ3RoLS0pIHtcblx0ICAgIGlmIChlcShhcnJheVtsZW5ndGhdWzBdLCBrZXkpKSB7XG5cdCAgICAgIHJldHVybiBsZW5ndGg7XG5cdCAgICB9XG5cdCAgfVxuXHQgIHJldHVybiAtMTtcblx0fVxuXG5cdF9hc3NvY0luZGV4T2YgPSBhc3NvY0luZGV4T2Y7XG5cdHJldHVybiBfYXNzb2NJbmRleE9mO1xufVxuXG52YXIgX2xpc3RDYWNoZURlbGV0ZTtcbnZhciBoYXNSZXF1aXJlZF9saXN0Q2FjaGVEZWxldGU7XG5cbmZ1bmN0aW9uIHJlcXVpcmVfbGlzdENhY2hlRGVsZXRlICgpIHtcblx0aWYgKGhhc1JlcXVpcmVkX2xpc3RDYWNoZURlbGV0ZSkgcmV0dXJuIF9saXN0Q2FjaGVEZWxldGU7XG5cdGhhc1JlcXVpcmVkX2xpc3RDYWNoZURlbGV0ZSA9IDE7XG5cdHZhciBhc3NvY0luZGV4T2YgPSByZXF1aXJlX2Fzc29jSW5kZXhPZigpO1xuXG5cdC8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cblx0dmFyIGFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGU7XG5cblx0LyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG5cdHZhciBzcGxpY2UgPSBhcnJheVByb3RvLnNwbGljZTtcblxuXHQvKipcblx0ICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIGxpc3QgY2FjaGUuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBuYW1lIGRlbGV0ZVxuXHQgKiBAbWVtYmVyT2YgTGlzdENhY2hlXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG5cdCAqL1xuXHRmdW5jdGlvbiBsaXN0Q2FjaGVEZWxldGUoa2V5KSB7XG5cdCAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuXHQgICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG5cdCAgaWYgKGluZGV4IDwgMCkge1xuXHQgICAgcmV0dXJuIGZhbHNlO1xuXHQgIH1cblx0ICB2YXIgbGFzdEluZGV4ID0gZGF0YS5sZW5ndGggLSAxO1xuXHQgIGlmIChpbmRleCA9PSBsYXN0SW5kZXgpIHtcblx0ICAgIGRhdGEucG9wKCk7XG5cdCAgfSBlbHNlIHtcblx0ICAgIHNwbGljZS5jYWxsKGRhdGEsIGluZGV4LCAxKTtcblx0ICB9XG5cdCAgLS10aGlzLnNpemU7XG5cdCAgcmV0dXJuIHRydWU7XG5cdH1cblxuXHRfbGlzdENhY2hlRGVsZXRlID0gbGlzdENhY2hlRGVsZXRlO1xuXHRyZXR1cm4gX2xpc3RDYWNoZURlbGV0ZTtcbn1cblxudmFyIF9saXN0Q2FjaGVHZXQ7XG52YXIgaGFzUmVxdWlyZWRfbGlzdENhY2hlR2V0O1xuXG5mdW5jdGlvbiByZXF1aXJlX2xpc3RDYWNoZUdldCAoKSB7XG5cdGlmIChoYXNSZXF1aXJlZF9saXN0Q2FjaGVHZXQpIHJldHVybiBfbGlzdENhY2hlR2V0O1xuXHRoYXNSZXF1aXJlZF9saXN0Q2FjaGVHZXQgPSAxO1xuXHR2YXIgYXNzb2NJbmRleE9mID0gcmVxdWlyZV9hc3NvY0luZGV4T2YoKTtcblxuXHQvKipcblx0ICogR2V0cyB0aGUgbGlzdCBjYWNoZSB2YWx1ZSBmb3IgYGtleWAuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBuYW1lIGdldFxuXHQgKiBAbWVtYmVyT2YgTGlzdENhY2hlXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuXHQgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG5cdCAqL1xuXHRmdW5jdGlvbiBsaXN0Q2FjaGVHZXQoa2V5KSB7XG5cdCAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuXHQgICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG5cdCAgcmV0dXJuIGluZGV4IDwgMCA/IHVuZGVmaW5lZCA6IGRhdGFbaW5kZXhdWzFdO1xuXHR9XG5cblx0X2xpc3RDYWNoZUdldCA9IGxpc3RDYWNoZUdldDtcblx0cmV0dXJuIF9saXN0Q2FjaGVHZXQ7XG59XG5cbnZhciBfbGlzdENhY2hlSGFzO1xudmFyIGhhc1JlcXVpcmVkX2xpc3RDYWNoZUhhcztcblxuZnVuY3Rpb24gcmVxdWlyZV9saXN0Q2FjaGVIYXMgKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRfbGlzdENhY2hlSGFzKSByZXR1cm4gX2xpc3RDYWNoZUhhcztcblx0aGFzUmVxdWlyZWRfbGlzdENhY2hlSGFzID0gMTtcblx0dmFyIGFzc29jSW5kZXhPZiA9IHJlcXVpcmVfYXNzb2NJbmRleE9mKCk7XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBhIGxpc3QgY2FjaGUgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQG5hbWUgaGFzXG5cdCAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcblx0ICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cblx0ICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cblx0ICovXG5cdGZ1bmN0aW9uIGxpc3RDYWNoZUhhcyhrZXkpIHtcblx0ICByZXR1cm4gYXNzb2NJbmRleE9mKHRoaXMuX19kYXRhX18sIGtleSkgPiAtMTtcblx0fVxuXG5cdF9saXN0Q2FjaGVIYXMgPSBsaXN0Q2FjaGVIYXM7XG5cdHJldHVybiBfbGlzdENhY2hlSGFzO1xufVxuXG52YXIgX2xpc3RDYWNoZVNldDtcbnZhciBoYXNSZXF1aXJlZF9saXN0Q2FjaGVTZXQ7XG5cbmZ1bmN0aW9uIHJlcXVpcmVfbGlzdENhY2hlU2V0ICgpIHtcblx0aWYgKGhhc1JlcXVpcmVkX2xpc3RDYWNoZVNldCkgcmV0dXJuIF9saXN0Q2FjaGVTZXQ7XG5cdGhhc1JlcXVpcmVkX2xpc3RDYWNoZVNldCA9IDE7XG5cdHZhciBhc3NvY0luZGV4T2YgPSByZXF1aXJlX2Fzc29jSW5kZXhPZigpO1xuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBsaXN0IGNhY2hlIGBrZXlgIHRvIGB2YWx1ZWAuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBuYW1lIHNldFxuXHQgKiBAbWVtYmVyT2YgTGlzdENhY2hlXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuXHQgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG5cdCAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGxpc3QgY2FjaGUgaW5zdGFuY2UuXG5cdCAqL1xuXHRmdW5jdGlvbiBsaXN0Q2FjaGVTZXQoa2V5LCB2YWx1ZSkge1xuXHQgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcblx0ICAgICAgaW5kZXggPSBhc3NvY0luZGV4T2YoZGF0YSwga2V5KTtcblxuXHQgIGlmIChpbmRleCA8IDApIHtcblx0ICAgICsrdGhpcy5zaXplO1xuXHQgICAgZGF0YS5wdXNoKFtrZXksIHZhbHVlXSk7XG5cdCAgfSBlbHNlIHtcblx0ICAgIGRhdGFbaW5kZXhdWzFdID0gdmFsdWU7XG5cdCAgfVxuXHQgIHJldHVybiB0aGlzO1xuXHR9XG5cblx0X2xpc3RDYWNoZVNldCA9IGxpc3RDYWNoZVNldDtcblx0cmV0dXJuIF9saXN0Q2FjaGVTZXQ7XG59XG5cbnZhciBfTGlzdENhY2hlO1xudmFyIGhhc1JlcXVpcmVkX0xpc3RDYWNoZTtcblxuZnVuY3Rpb24gcmVxdWlyZV9MaXN0Q2FjaGUgKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRfTGlzdENhY2hlKSByZXR1cm4gX0xpc3RDYWNoZTtcblx0aGFzUmVxdWlyZWRfTGlzdENhY2hlID0gMTtcblx0dmFyIGxpc3RDYWNoZUNsZWFyID0gcmVxdWlyZV9saXN0Q2FjaGVDbGVhcigpLFxuXHQgICAgbGlzdENhY2hlRGVsZXRlID0gcmVxdWlyZV9saXN0Q2FjaGVEZWxldGUoKSxcblx0ICAgIGxpc3RDYWNoZUdldCA9IHJlcXVpcmVfbGlzdENhY2hlR2V0KCksXG5cdCAgICBsaXN0Q2FjaGVIYXMgPSByZXF1aXJlX2xpc3RDYWNoZUhhcygpLFxuXHQgICAgbGlzdENhY2hlU2V0ID0gcmVxdWlyZV9saXN0Q2FjaGVTZXQoKTtcblxuXHQvKipcblx0ICogQ3JlYXRlcyBhbiBsaXN0IGNhY2hlIG9iamVjdC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuXHQgKi9cblx0ZnVuY3Rpb24gTGlzdENhY2hlKGVudHJpZXMpIHtcblx0ICB2YXIgaW5kZXggPSAtMSxcblx0ICAgICAgbGVuZ3RoID0gZW50cmllcyA9PSBudWxsID8gMCA6IGVudHJpZXMubGVuZ3RoO1xuXG5cdCAgdGhpcy5jbGVhcigpO1xuXHQgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG5cdCAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcblx0ICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG5cdCAgfVxuXHR9XG5cblx0Ly8gQWRkIG1ldGhvZHMgdG8gYExpc3RDYWNoZWAuXG5cdExpc3RDYWNoZS5wcm90b3R5cGUuY2xlYXIgPSBsaXN0Q2FjaGVDbGVhcjtcblx0TGlzdENhY2hlLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBsaXN0Q2FjaGVEZWxldGU7XG5cdExpc3RDYWNoZS5wcm90b3R5cGUuZ2V0ID0gbGlzdENhY2hlR2V0O1xuXHRMaXN0Q2FjaGUucHJvdG90eXBlLmhhcyA9IGxpc3RDYWNoZUhhcztcblx0TGlzdENhY2hlLnByb3RvdHlwZS5zZXQgPSBsaXN0Q2FjaGVTZXQ7XG5cblx0X0xpc3RDYWNoZSA9IExpc3RDYWNoZTtcblx0cmV0dXJuIF9MaXN0Q2FjaGU7XG59XG5cbnZhciBfTWFwO1xudmFyIGhhc1JlcXVpcmVkX01hcDtcblxuZnVuY3Rpb24gcmVxdWlyZV9NYXAgKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRfTWFwKSByZXR1cm4gX01hcDtcblx0aGFzUmVxdWlyZWRfTWFwID0gMTtcblx0dmFyIGdldE5hdGl2ZSA9IHJlcXVpcmVfZ2V0TmF0aXZlKCksXG5cdCAgICByb290ID0gcmVxdWlyZV9yb290KCk7XG5cblx0LyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xuXHR2YXIgTWFwID0gZ2V0TmF0aXZlKHJvb3QsICdNYXAnKTtcblxuXHRfTWFwID0gTWFwO1xuXHRyZXR1cm4gX01hcDtcbn1cblxudmFyIF9tYXBDYWNoZUNsZWFyO1xudmFyIGhhc1JlcXVpcmVkX21hcENhY2hlQ2xlYXI7XG5cbmZ1bmN0aW9uIHJlcXVpcmVfbWFwQ2FjaGVDbGVhciAoKSB7XG5cdGlmIChoYXNSZXF1aXJlZF9tYXBDYWNoZUNsZWFyKSByZXR1cm4gX21hcENhY2hlQ2xlYXI7XG5cdGhhc1JlcXVpcmVkX21hcENhY2hlQ2xlYXIgPSAxO1xuXHR2YXIgSGFzaCA9IHJlcXVpcmVfSGFzaCgpLFxuXHQgICAgTGlzdENhY2hlID0gcmVxdWlyZV9MaXN0Q2FjaGUoKSxcblx0ICAgIE1hcCA9IHJlcXVpcmVfTWFwKCk7XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIG1hcC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQG5hbWUgY2xlYXJcblx0ICogQG1lbWJlck9mIE1hcENhY2hlXG5cdCAqL1xuXHRmdW5jdGlvbiBtYXBDYWNoZUNsZWFyKCkge1xuXHQgIHRoaXMuc2l6ZSA9IDA7XG5cdCAgdGhpcy5fX2RhdGFfXyA9IHtcblx0ICAgICdoYXNoJzogbmV3IEhhc2gsXG5cdCAgICAnbWFwJzogbmV3IChNYXAgfHwgTGlzdENhY2hlKSxcblx0ICAgICdzdHJpbmcnOiBuZXcgSGFzaFxuXHQgIH07XG5cdH1cblxuXHRfbWFwQ2FjaGVDbGVhciA9IG1hcENhY2hlQ2xlYXI7XG5cdHJldHVybiBfbWFwQ2FjaGVDbGVhcjtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSBmb3IgdXNlIGFzIHVuaXF1ZSBvYmplY3Qga2V5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIHN1aXRhYmxlLCBlbHNlIGBmYWxzZWAuXG4gKi9cblxudmFyIF9pc0tleWFibGU7XG52YXIgaGFzUmVxdWlyZWRfaXNLZXlhYmxlO1xuXG5mdW5jdGlvbiByZXF1aXJlX2lzS2V5YWJsZSAoKSB7XG5cdGlmIChoYXNSZXF1aXJlZF9pc0tleWFibGUpIHJldHVybiBfaXNLZXlhYmxlO1xuXHRoYXNSZXF1aXJlZF9pc0tleWFibGUgPSAxO1xuXHRmdW5jdGlvbiBpc0tleWFibGUodmFsdWUpIHtcblx0ICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcblx0ICByZXR1cm4gKHR5cGUgPT0gJ3N0cmluZycgfHwgdHlwZSA9PSAnbnVtYmVyJyB8fCB0eXBlID09ICdzeW1ib2wnIHx8IHR5cGUgPT0gJ2Jvb2xlYW4nKVxuXHQgICAgPyAodmFsdWUgIT09ICdfX3Byb3RvX18nKVxuXHQgICAgOiAodmFsdWUgPT09IG51bGwpO1xuXHR9XG5cblx0X2lzS2V5YWJsZSA9IGlzS2V5YWJsZTtcblx0cmV0dXJuIF9pc0tleWFibGU7XG59XG5cbnZhciBfZ2V0TWFwRGF0YTtcbnZhciBoYXNSZXF1aXJlZF9nZXRNYXBEYXRhO1xuXG5mdW5jdGlvbiByZXF1aXJlX2dldE1hcERhdGEgKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRfZ2V0TWFwRGF0YSkgcmV0dXJuIF9nZXRNYXBEYXRhO1xuXHRoYXNSZXF1aXJlZF9nZXRNYXBEYXRhID0gMTtcblx0dmFyIGlzS2V5YWJsZSA9IHJlcXVpcmVfaXNLZXlhYmxlKCk7XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGRhdGEgZm9yIGBtYXBgLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge09iamVjdH0gbWFwIFRoZSBtYXAgdG8gcXVlcnkuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIHJlZmVyZW5jZSBrZXkuXG5cdCAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXAgZGF0YS5cblx0ICovXG5cdGZ1bmN0aW9uIGdldE1hcERhdGEobWFwLCBrZXkpIHtcblx0ICB2YXIgZGF0YSA9IG1hcC5fX2RhdGFfXztcblx0ICByZXR1cm4gaXNLZXlhYmxlKGtleSlcblx0ICAgID8gZGF0YVt0eXBlb2Yga2V5ID09ICdzdHJpbmcnID8gJ3N0cmluZycgOiAnaGFzaCddXG5cdCAgICA6IGRhdGEubWFwO1xuXHR9XG5cblx0X2dldE1hcERhdGEgPSBnZXRNYXBEYXRhO1xuXHRyZXR1cm4gX2dldE1hcERhdGE7XG59XG5cbnZhciBfbWFwQ2FjaGVEZWxldGU7XG52YXIgaGFzUmVxdWlyZWRfbWFwQ2FjaGVEZWxldGU7XG5cbmZ1bmN0aW9uIHJlcXVpcmVfbWFwQ2FjaGVEZWxldGUgKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRfbWFwQ2FjaGVEZWxldGUpIHJldHVybiBfbWFwQ2FjaGVEZWxldGU7XG5cdGhhc1JlcXVpcmVkX21hcENhY2hlRGVsZXRlID0gMTtcblx0dmFyIGdldE1hcERhdGEgPSByZXF1aXJlX2dldE1hcERhdGEoKTtcblxuXHQvKipcblx0ICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIG1hcC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQG5hbWUgZGVsZXRlXG5cdCAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuXHQgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cblx0ICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuXHQgKi9cblx0ZnVuY3Rpb24gbWFwQ2FjaGVEZWxldGUoa2V5KSB7XG5cdCAgdmFyIHJlc3VsdCA9IGdldE1hcERhdGEodGhpcywga2V5KVsnZGVsZXRlJ10oa2V5KTtcblx0ICB0aGlzLnNpemUgLT0gcmVzdWx0ID8gMSA6IDA7XG5cdCAgcmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdF9tYXBDYWNoZURlbGV0ZSA9IG1hcENhY2hlRGVsZXRlO1xuXHRyZXR1cm4gX21hcENhY2hlRGVsZXRlO1xufVxuXG52YXIgX21hcENhY2hlR2V0O1xudmFyIGhhc1JlcXVpcmVkX21hcENhY2hlR2V0O1xuXG5mdW5jdGlvbiByZXF1aXJlX21hcENhY2hlR2V0ICgpIHtcblx0aWYgKGhhc1JlcXVpcmVkX21hcENhY2hlR2V0KSByZXR1cm4gX21hcENhY2hlR2V0O1xuXHRoYXNSZXF1aXJlZF9tYXBDYWNoZUdldCA9IDE7XG5cdHZhciBnZXRNYXBEYXRhID0gcmVxdWlyZV9nZXRNYXBEYXRhKCk7XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIG1hcCB2YWx1ZSBmb3IgYGtleWAuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBuYW1lIGdldFxuXHQgKiBAbWVtYmVyT2YgTWFwQ2FjaGVcblx0ICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG5cdCAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cblx0ICovXG5cdGZ1bmN0aW9uIG1hcENhY2hlR2V0KGtleSkge1xuXHQgIHJldHVybiBnZXRNYXBEYXRhKHRoaXMsIGtleSkuZ2V0KGtleSk7XG5cdH1cblxuXHRfbWFwQ2FjaGVHZXQgPSBtYXBDYWNoZUdldDtcblx0cmV0dXJuIF9tYXBDYWNoZUdldDtcbn1cblxudmFyIF9tYXBDYWNoZUhhcztcbnZhciBoYXNSZXF1aXJlZF9tYXBDYWNoZUhhcztcblxuZnVuY3Rpb24gcmVxdWlyZV9tYXBDYWNoZUhhcyAoKSB7XG5cdGlmIChoYXNSZXF1aXJlZF9tYXBDYWNoZUhhcykgcmV0dXJuIF9tYXBDYWNoZUhhcztcblx0aGFzUmVxdWlyZWRfbWFwQ2FjaGVIYXMgPSAxO1xuXHR2YXIgZ2V0TWFwRGF0YSA9IHJlcXVpcmVfZ2V0TWFwRGF0YSgpO1xuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYSBtYXAgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQG5hbWUgaGFzXG5cdCAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuXHQgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuXHQgKi9cblx0ZnVuY3Rpb24gbWFwQ2FjaGVIYXMoa2V5KSB7XG5cdCAgcmV0dXJuIGdldE1hcERhdGEodGhpcywga2V5KS5oYXMoa2V5KTtcblx0fVxuXG5cdF9tYXBDYWNoZUhhcyA9IG1hcENhY2hlSGFzO1xuXHRyZXR1cm4gX21hcENhY2hlSGFzO1xufVxuXG52YXIgX21hcENhY2hlU2V0O1xudmFyIGhhc1JlcXVpcmVkX21hcENhY2hlU2V0O1xuXG5mdW5jdGlvbiByZXF1aXJlX21hcENhY2hlU2V0ICgpIHtcblx0aWYgKGhhc1JlcXVpcmVkX21hcENhY2hlU2V0KSByZXR1cm4gX21hcENhY2hlU2V0O1xuXHRoYXNSZXF1aXJlZF9tYXBDYWNoZVNldCA9IDE7XG5cdHZhciBnZXRNYXBEYXRhID0gcmVxdWlyZV9nZXRNYXBEYXRhKCk7XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIG1hcCBga2V5YCB0byBgdmFsdWVgLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAbmFtZSBzZXRcblx0ICogQG1lbWJlck9mIE1hcENhY2hlXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuXHQgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG5cdCAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG1hcCBjYWNoZSBpbnN0YW5jZS5cblx0ICovXG5cdGZ1bmN0aW9uIG1hcENhY2hlU2V0KGtleSwgdmFsdWUpIHtcblx0ICB2YXIgZGF0YSA9IGdldE1hcERhdGEodGhpcywga2V5KSxcblx0ICAgICAgc2l6ZSA9IGRhdGEuc2l6ZTtcblxuXHQgIGRhdGEuc2V0KGtleSwgdmFsdWUpO1xuXHQgIHRoaXMuc2l6ZSArPSBkYXRhLnNpemUgPT0gc2l6ZSA/IDAgOiAxO1xuXHQgIHJldHVybiB0aGlzO1xuXHR9XG5cblx0X21hcENhY2hlU2V0ID0gbWFwQ2FjaGVTZXQ7XG5cdHJldHVybiBfbWFwQ2FjaGVTZXQ7XG59XG5cbnZhciBfTWFwQ2FjaGU7XG52YXIgaGFzUmVxdWlyZWRfTWFwQ2FjaGU7XG5cbmZ1bmN0aW9uIHJlcXVpcmVfTWFwQ2FjaGUgKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRfTWFwQ2FjaGUpIHJldHVybiBfTWFwQ2FjaGU7XG5cdGhhc1JlcXVpcmVkX01hcENhY2hlID0gMTtcblx0dmFyIG1hcENhY2hlQ2xlYXIgPSByZXF1aXJlX21hcENhY2hlQ2xlYXIoKSxcblx0ICAgIG1hcENhY2hlRGVsZXRlID0gcmVxdWlyZV9tYXBDYWNoZURlbGV0ZSgpLFxuXHQgICAgbWFwQ2FjaGVHZXQgPSByZXF1aXJlX21hcENhY2hlR2V0KCksXG5cdCAgICBtYXBDYWNoZUhhcyA9IHJlcXVpcmVfbWFwQ2FjaGVIYXMoKSxcblx0ICAgIG1hcENhY2hlU2V0ID0gcmVxdWlyZV9tYXBDYWNoZVNldCgpO1xuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbWFwIGNhY2hlIG9iamVjdCB0byBzdG9yZSBrZXktdmFsdWUgcGFpcnMuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cblx0ICovXG5cdGZ1bmN0aW9uIE1hcENhY2hlKGVudHJpZXMpIHtcblx0ICB2YXIgaW5kZXggPSAtMSxcblx0ICAgICAgbGVuZ3RoID0gZW50cmllcyA9PSBudWxsID8gMCA6IGVudHJpZXMubGVuZ3RoO1xuXG5cdCAgdGhpcy5jbGVhcigpO1xuXHQgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG5cdCAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcblx0ICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG5cdCAgfVxuXHR9XG5cblx0Ly8gQWRkIG1ldGhvZHMgdG8gYE1hcENhY2hlYC5cblx0TWFwQ2FjaGUucHJvdG90eXBlLmNsZWFyID0gbWFwQ2FjaGVDbGVhcjtcblx0TWFwQ2FjaGUucHJvdG90eXBlWydkZWxldGUnXSA9IG1hcENhY2hlRGVsZXRlO1xuXHRNYXBDYWNoZS5wcm90b3R5cGUuZ2V0ID0gbWFwQ2FjaGVHZXQ7XG5cdE1hcENhY2hlLnByb3RvdHlwZS5oYXMgPSBtYXBDYWNoZUhhcztcblx0TWFwQ2FjaGUucHJvdG90eXBlLnNldCA9IG1hcENhY2hlU2V0O1xuXG5cdF9NYXBDYWNoZSA9IE1hcENhY2hlO1xuXHRyZXR1cm4gX01hcENhY2hlO1xufVxuXG52YXIgbWVtb2l6ZV8xO1xudmFyIGhhc1JlcXVpcmVkTWVtb2l6ZTtcblxuZnVuY3Rpb24gcmVxdWlyZU1lbW9pemUgKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRNZW1vaXplKSByZXR1cm4gbWVtb2l6ZV8xO1xuXHRoYXNSZXF1aXJlZE1lbW9pemUgPSAxO1xuXHR2YXIgTWFwQ2FjaGUgPSByZXF1aXJlX01hcENhY2hlKCk7XG5cblx0LyoqIEVycm9yIG1lc3NhZ2UgY29uc3RhbnRzLiAqL1xuXHR2YXIgRlVOQ19FUlJPUl9URVhUID0gJ0V4cGVjdGVkIGEgZnVuY3Rpb24nO1xuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBtZW1vaXplcyB0aGUgcmVzdWx0IG9mIGBmdW5jYC4gSWYgYHJlc29sdmVyYCBpc1xuXHQgKiBwcm92aWRlZCwgaXQgZGV0ZXJtaW5lcyB0aGUgY2FjaGUga2V5IGZvciBzdG9yaW5nIHRoZSByZXN1bHQgYmFzZWQgb24gdGhlXG5cdCAqIGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24uIEJ5IGRlZmF1bHQsIHRoZSBmaXJzdCBhcmd1bWVudFxuXHQgKiBwcm92aWRlZCB0byB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24gaXMgdXNlZCBhcyB0aGUgbWFwIGNhY2hlIGtleS4gVGhlIGBmdW5jYFxuXHQgKiBpcyBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIHRoZSBtZW1vaXplZCBmdW5jdGlvbi5cblx0ICpcblx0ICogKipOb3RlOioqIFRoZSBjYWNoZSBpcyBleHBvc2VkIGFzIHRoZSBgY2FjaGVgIHByb3BlcnR5IG9uIHRoZSBtZW1vaXplZFxuXHQgKiBmdW5jdGlvbi4gSXRzIGNyZWF0aW9uIG1heSBiZSBjdXN0b21pemVkIGJ5IHJlcGxhY2luZyB0aGUgYF8ubWVtb2l6ZS5DYWNoZWBcblx0ICogY29uc3RydWN0b3Igd2l0aCBvbmUgd2hvc2UgaW5zdGFuY2VzIGltcGxlbWVudCB0aGVcblx0ICogW2BNYXBgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1wcm9wZXJ0aWVzLW9mLXRoZS1tYXAtcHJvdG90eXBlLW9iamVjdClcblx0ICogbWV0aG9kIGludGVyZmFjZSBvZiBgY2xlYXJgLCBgZGVsZXRlYCwgYGdldGAsIGBoYXNgLCBhbmQgYHNldGAuXG5cdCAqXG5cdCAqIEBzdGF0aWNcblx0ICogQG1lbWJlck9mIF9cblx0ICogQHNpbmNlIDAuMS4wXG5cdCAqIEBjYXRlZ29yeSBGdW5jdGlvblxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBoYXZlIGl0cyBvdXRwdXQgbWVtb2l6ZWQuXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IFtyZXNvbHZlcl0gVGhlIGZ1bmN0aW9uIHRvIHJlc29sdmUgdGhlIGNhY2hlIGtleS5cblx0ICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgbWVtb2l6ZWQgZnVuY3Rpb24uXG5cdCAqIEBleGFtcGxlXG5cdCAqXG5cdCAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAyIH07XG5cdCAqIHZhciBvdGhlciA9IHsgJ2MnOiAzLCAnZCc6IDQgfTtcblx0ICpcblx0ICogdmFyIHZhbHVlcyA9IF8ubWVtb2l6ZShfLnZhbHVlcyk7XG5cdCAqIHZhbHVlcyhvYmplY3QpO1xuXHQgKiAvLyA9PiBbMSwgMl1cblx0ICpcblx0ICogdmFsdWVzKG90aGVyKTtcblx0ICogLy8gPT4gWzMsIDRdXG5cdCAqXG5cdCAqIG9iamVjdC5hID0gMjtcblx0ICogdmFsdWVzKG9iamVjdCk7XG5cdCAqIC8vID0+IFsxLCAyXVxuXHQgKlxuXHQgKiAvLyBNb2RpZnkgdGhlIHJlc3VsdCBjYWNoZS5cblx0ICogdmFsdWVzLmNhY2hlLnNldChvYmplY3QsIFsnYScsICdiJ10pO1xuXHQgKiB2YWx1ZXMob2JqZWN0KTtcblx0ICogLy8gPT4gWydhJywgJ2InXVxuXHQgKlxuXHQgKiAvLyBSZXBsYWNlIGBfLm1lbW9pemUuQ2FjaGVgLlxuXHQgKiBfLm1lbW9pemUuQ2FjaGUgPSBXZWFrTWFwO1xuXHQgKi9cblx0ZnVuY3Rpb24gbWVtb2l6ZShmdW5jLCByZXNvbHZlcikge1xuXHQgIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nIHx8IChyZXNvbHZlciAhPSBudWxsICYmIHR5cGVvZiByZXNvbHZlciAhPSAnZnVuY3Rpb24nKSkge1xuXHQgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuXHQgIH1cblx0ICB2YXIgbWVtb2l6ZWQgPSBmdW5jdGlvbigpIHtcblx0ICAgIHZhciBhcmdzID0gYXJndW1lbnRzLFxuXHQgICAgICAgIGtleSA9IHJlc29sdmVyID8gcmVzb2x2ZXIuYXBwbHkodGhpcywgYXJncykgOiBhcmdzWzBdLFxuXHQgICAgICAgIGNhY2hlID0gbWVtb2l6ZWQuY2FjaGU7XG5cblx0ICAgIGlmIChjYWNoZS5oYXMoa2V5KSkge1xuXHQgICAgICByZXR1cm4gY2FjaGUuZ2V0KGtleSk7XG5cdCAgICB9XG5cdCAgICB2YXIgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzLCBhcmdzKTtcblx0ICAgIG1lbW9pemVkLmNhY2hlID0gY2FjaGUuc2V0KGtleSwgcmVzdWx0KSB8fCBjYWNoZTtcblx0ICAgIHJldHVybiByZXN1bHQ7XG5cdCAgfTtcblx0ICBtZW1vaXplZC5jYWNoZSA9IG5ldyAobWVtb2l6ZS5DYWNoZSB8fCBNYXBDYWNoZSk7XG5cdCAgcmV0dXJuIG1lbW9pemVkO1xuXHR9XG5cblx0Ly8gRXhwb3NlIGBNYXBDYWNoZWAuXG5cdG1lbW9pemUuQ2FjaGUgPSBNYXBDYWNoZTtcblxuXHRtZW1vaXplXzEgPSBtZW1vaXplO1xuXHRyZXR1cm4gbWVtb2l6ZV8xO1xufVxuXG52YXIgX21lbW9pemVDYXBwZWQ7XG52YXIgaGFzUmVxdWlyZWRfbWVtb2l6ZUNhcHBlZDtcblxuZnVuY3Rpb24gcmVxdWlyZV9tZW1vaXplQ2FwcGVkICgpIHtcblx0aWYgKGhhc1JlcXVpcmVkX21lbW9pemVDYXBwZWQpIHJldHVybiBfbWVtb2l6ZUNhcHBlZDtcblx0aGFzUmVxdWlyZWRfbWVtb2l6ZUNhcHBlZCA9IDE7XG5cdHZhciBtZW1vaXplID0gcmVxdWlyZU1lbW9pemUoKTtcblxuXHQvKiogVXNlZCBhcyB0aGUgbWF4aW11bSBtZW1vaXplIGNhY2hlIHNpemUuICovXG5cdHZhciBNQVhfTUVNT0laRV9TSVpFID0gNTAwO1xuXG5cdC8qKlxuXHQgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ubWVtb2l6ZWAgd2hpY2ggY2xlYXJzIHRoZSBtZW1vaXplZCBmdW5jdGlvbidzXG5cdCAqIGNhY2hlIHdoZW4gaXQgZXhjZWVkcyBgTUFYX01FTU9JWkVfU0laRWAuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGhhdmUgaXRzIG91dHB1dCBtZW1vaXplZC5cblx0ICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgbWVtb2l6ZWQgZnVuY3Rpb24uXG5cdCAqL1xuXHRmdW5jdGlvbiBtZW1vaXplQ2FwcGVkKGZ1bmMpIHtcblx0ICB2YXIgcmVzdWx0ID0gbWVtb2l6ZShmdW5jLCBmdW5jdGlvbihrZXkpIHtcblx0ICAgIGlmIChjYWNoZS5zaXplID09PSBNQVhfTUVNT0laRV9TSVpFKSB7XG5cdCAgICAgIGNhY2hlLmNsZWFyKCk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4ga2V5O1xuXHQgIH0pO1xuXG5cdCAgdmFyIGNhY2hlID0gcmVzdWx0LmNhY2hlO1xuXHQgIHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRfbWVtb2l6ZUNhcHBlZCA9IG1lbW9pemVDYXBwZWQ7XG5cdHJldHVybiBfbWVtb2l6ZUNhcHBlZDtcbn1cblxudmFyIF9zdHJpbmdUb1BhdGg7XG52YXIgaGFzUmVxdWlyZWRfc3RyaW5nVG9QYXRoO1xuXG5mdW5jdGlvbiByZXF1aXJlX3N0cmluZ1RvUGF0aCAoKSB7XG5cdGlmIChoYXNSZXF1aXJlZF9zdHJpbmdUb1BhdGgpIHJldHVybiBfc3RyaW5nVG9QYXRoO1xuXHRoYXNSZXF1aXJlZF9zdHJpbmdUb1BhdGggPSAxO1xuXHR2YXIgbWVtb2l6ZUNhcHBlZCA9IHJlcXVpcmVfbWVtb2l6ZUNhcHBlZCgpO1xuXG5cdC8qKiBVc2VkIHRvIG1hdGNoIHByb3BlcnR5IG5hbWVzIHdpdGhpbiBwcm9wZXJ0eSBwYXRocy4gKi9cblx0dmFyIHJlUHJvcE5hbWUgPSAvW14uW1xcXV0rfFxcWyg/OigtP1xcZCsoPzpcXC5cXGQrKT8pfChbXCInXSkoKD86KD8hXFwyKVteXFxcXF18XFxcXC4pKj8pXFwyKVxcXXwoPz0oPzpcXC58XFxbXFxdKSg/OlxcLnxcXFtcXF18JCkpL2c7XG5cblx0LyoqIFVzZWQgdG8gbWF0Y2ggYmFja3NsYXNoZXMgaW4gcHJvcGVydHkgcGF0aHMuICovXG5cdHZhciByZUVzY2FwZUNoYXIgPSAvXFxcXChcXFxcKT8vZztcblxuXHQvKipcblx0ICogQ29udmVydHMgYHN0cmluZ2AgdG8gYSBwcm9wZXJ0eSBwYXRoIGFycmF5LlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gY29udmVydC5cblx0ICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBwYXRoIGFycmF5LlxuXHQgKi9cblx0dmFyIHN0cmluZ1RvUGF0aCA9IG1lbW9pemVDYXBwZWQoZnVuY3Rpb24oc3RyaW5nKSB7XG5cdCAgdmFyIHJlc3VsdCA9IFtdO1xuXHQgIGlmIChzdHJpbmcuY2hhckNvZGVBdCgwKSA9PT0gNDYgLyogLiAqLykge1xuXHQgICAgcmVzdWx0LnB1c2goJycpO1xuXHQgIH1cblx0ICBzdHJpbmcucmVwbGFjZShyZVByb3BOYW1lLCBmdW5jdGlvbihtYXRjaCwgbnVtYmVyLCBxdW90ZSwgc3ViU3RyaW5nKSB7XG5cdCAgICByZXN1bHQucHVzaChxdW90ZSA/IHN1YlN0cmluZy5yZXBsYWNlKHJlRXNjYXBlQ2hhciwgJyQxJykgOiAobnVtYmVyIHx8IG1hdGNoKSk7XG5cdCAgfSk7XG5cdCAgcmV0dXJuIHJlc3VsdDtcblx0fSk7XG5cblx0X3N0cmluZ1RvUGF0aCA9IHN0cmluZ1RvUGF0aDtcblx0cmV0dXJuIF9zdHJpbmdUb1BhdGg7XG59XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLm1hcGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlXG4gKiBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICovXG5cbnZhciBfYXJyYXlNYXA7XG52YXIgaGFzUmVxdWlyZWRfYXJyYXlNYXA7XG5cbmZ1bmN0aW9uIHJlcXVpcmVfYXJyYXlNYXAgKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRfYXJyYXlNYXApIHJldHVybiBfYXJyYXlNYXA7XG5cdGhhc1JlcXVpcmVkX2FycmF5TWFwID0gMTtcblx0ZnVuY3Rpb24gYXJyYXlNYXAoYXJyYXksIGl0ZXJhdGVlKSB7XG5cdCAgdmFyIGluZGV4ID0gLTEsXG5cdCAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoLFxuXHQgICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpO1xuXG5cdCAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcblx0ICAgIHJlc3VsdFtpbmRleF0gPSBpdGVyYXRlZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSk7XG5cdCAgfVxuXHQgIHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRfYXJyYXlNYXAgPSBhcnJheU1hcDtcblx0cmV0dXJuIF9hcnJheU1hcDtcbn1cblxudmFyIF9iYXNlVG9TdHJpbmc7XG52YXIgaGFzUmVxdWlyZWRfYmFzZVRvU3RyaW5nO1xuXG5mdW5jdGlvbiByZXF1aXJlX2Jhc2VUb1N0cmluZyAoKSB7XG5cdGlmIChoYXNSZXF1aXJlZF9iYXNlVG9TdHJpbmcpIHJldHVybiBfYmFzZVRvU3RyaW5nO1xuXHRoYXNSZXF1aXJlZF9iYXNlVG9TdHJpbmcgPSAxO1xuXHR2YXIgU3ltYm9sID0gcmVxdWlyZV9TeW1ib2woKSxcblx0ICAgIGFycmF5TWFwID0gcmVxdWlyZV9hcnJheU1hcCgpLFxuXHQgICAgaXNBcnJheSA9IHJlcXVpcmVJc0FycmF5KCksXG5cdCAgICBpc1N5bWJvbCA9IHJlcXVpcmVJc1N5bWJvbCgpO1xuXG5cdC8qKiBVc2VkIHRvIGNvbnZlcnQgc3ltYm9scyB0byBwcmltaXRpdmVzIGFuZCBzdHJpbmdzLiAqL1xuXHR2YXIgc3ltYm9sUHJvdG8gPSBTeW1ib2wgPyBTeW1ib2wucHJvdG90eXBlIDogdW5kZWZpbmVkLFxuXHQgICAgc3ltYm9sVG9TdHJpbmcgPSBzeW1ib2xQcm90byA/IHN5bWJvbFByb3RvLnRvU3RyaW5nIDogdW5kZWZpbmVkO1xuXG5cdC8qKlxuXHQgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50b1N0cmluZ2Agd2hpY2ggZG9lc24ndCBjb252ZXJ0IG51bGxpc2hcblx0ICogdmFsdWVzIHRvIGVtcHR5IHN0cmluZ3MuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHN0cmluZy5cblx0ICovXG5cdGZ1bmN0aW9uIGJhc2VUb1N0cmluZyh2YWx1ZSkge1xuXHQgIC8vIEV4aXQgZWFybHkgZm9yIHN0cmluZ3MgdG8gYXZvaWQgYSBwZXJmb3JtYW5jZSBoaXQgaW4gc29tZSBlbnZpcm9ubWVudHMuXG5cdCAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJykge1xuXHQgICAgcmV0dXJuIHZhbHVlO1xuXHQgIH1cblx0ICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcblx0ICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbnZlcnQgdmFsdWVzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG5cdCAgICByZXR1cm4gYXJyYXlNYXAodmFsdWUsIGJhc2VUb1N0cmluZykgKyAnJztcblx0ICB9XG5cdCAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuXHQgICAgcmV0dXJuIHN5bWJvbFRvU3RyaW5nID8gc3ltYm9sVG9TdHJpbmcuY2FsbCh2YWx1ZSkgOiAnJztcblx0ICB9XG5cdCAgdmFyIHJlc3VsdCA9ICh2YWx1ZSArICcnKTtcblx0ICByZXR1cm4gKHJlc3VsdCA9PSAnMCcgJiYgKDEgLyB2YWx1ZSkgPT0gLUluZmluaXR5KSA/ICctMCcgOiByZXN1bHQ7XG5cdH1cblxuXHRfYmFzZVRvU3RyaW5nID0gYmFzZVRvU3RyaW5nO1xuXHRyZXR1cm4gX2Jhc2VUb1N0cmluZztcbn1cblxudmFyIHRvU3RyaW5nXzE7XG52YXIgaGFzUmVxdWlyZWRUb1N0cmluZztcblxuZnVuY3Rpb24gcmVxdWlyZVRvU3RyaW5nICgpIHtcblx0aWYgKGhhc1JlcXVpcmVkVG9TdHJpbmcpIHJldHVybiB0b1N0cmluZ18xO1xuXHRoYXNSZXF1aXJlZFRvU3RyaW5nID0gMTtcblx0dmFyIGJhc2VUb1N0cmluZyA9IHJlcXVpcmVfYmFzZVRvU3RyaW5nKCk7XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcuIEFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCBmb3IgYG51bGxgXG5cdCAqIGFuZCBgdW5kZWZpbmVkYCB2YWx1ZXMuIFRoZSBzaWduIG9mIGAtMGAgaXMgcHJlc2VydmVkLlxuXHQgKlxuXHQgKiBAc3RhdGljXG5cdCAqIEBtZW1iZXJPZiBfXG5cdCAqIEBzaW5jZSA0LjAuMFxuXHQgKiBAY2F0ZWdvcnkgTGFuZ1xuXHQgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLlxuXHQgKiBAZXhhbXBsZVxuXHQgKlxuXHQgKiBfLnRvU3RyaW5nKG51bGwpO1xuXHQgKiAvLyA9PiAnJ1xuXHQgKlxuXHQgKiBfLnRvU3RyaW5nKC0wKTtcblx0ICogLy8gPT4gJy0wJ1xuXHQgKlxuXHQgKiBfLnRvU3RyaW5nKFsxLCAyLCAzXSk7XG5cdCAqIC8vID0+ICcxLDIsMydcblx0ICovXG5cdGZ1bmN0aW9uIHRvU3RyaW5nKHZhbHVlKSB7XG5cdCAgcmV0dXJuIHZhbHVlID09IG51bGwgPyAnJyA6IGJhc2VUb1N0cmluZyh2YWx1ZSk7XG5cdH1cblxuXHR0b1N0cmluZ18xID0gdG9TdHJpbmc7XG5cdHJldHVybiB0b1N0cmluZ18xO1xufVxuXG52YXIgX2Nhc3RQYXRoO1xudmFyIGhhc1JlcXVpcmVkX2Nhc3RQYXRoO1xuXG5mdW5jdGlvbiByZXF1aXJlX2Nhc3RQYXRoICgpIHtcblx0aWYgKGhhc1JlcXVpcmVkX2Nhc3RQYXRoKSByZXR1cm4gX2Nhc3RQYXRoO1xuXHRoYXNSZXF1aXJlZF9jYXN0UGF0aCA9IDE7XG5cdHZhciBpc0FycmF5ID0gcmVxdWlyZUlzQXJyYXkoKSxcblx0ICAgIGlzS2V5ID0gcmVxdWlyZV9pc0tleSgpLFxuXHQgICAgc3RyaW5nVG9QYXRoID0gcmVxdWlyZV9zdHJpbmdUb1BhdGgoKSxcblx0ICAgIHRvU3RyaW5nID0gcmVxdWlyZVRvU3RyaW5nKCk7XG5cblx0LyoqXG5cdCAqIENhc3RzIGB2YWx1ZWAgdG8gYSBwYXRoIGFycmF5IGlmIGl0J3Mgbm90IG9uZS5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cblx0ICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkga2V5cyBvbi5cblx0ICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjYXN0IHByb3BlcnR5IHBhdGggYXJyYXkuXG5cdCAqL1xuXHRmdW5jdGlvbiBjYXN0UGF0aCh2YWx1ZSwgb2JqZWN0KSB7XG5cdCAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG5cdCAgICByZXR1cm4gdmFsdWU7XG5cdCAgfVxuXHQgIHJldHVybiBpc0tleSh2YWx1ZSwgb2JqZWN0KSA/IFt2YWx1ZV0gOiBzdHJpbmdUb1BhdGgodG9TdHJpbmcodmFsdWUpKTtcblx0fVxuXG5cdF9jYXN0UGF0aCA9IGNhc3RQYXRoO1xuXHRyZXR1cm4gX2Nhc3RQYXRoO1xufVxuXG52YXIgX3RvS2V5O1xudmFyIGhhc1JlcXVpcmVkX3RvS2V5O1xuXG5mdW5jdGlvbiByZXF1aXJlX3RvS2V5ICgpIHtcblx0aWYgKGhhc1JlcXVpcmVkX3RvS2V5KSByZXR1cm4gX3RvS2V5O1xuXHRoYXNSZXF1aXJlZF90b0tleSA9IDE7XG5cdHZhciBpc1N5bWJvbCA9IHJlcXVpcmVJc1N5bWJvbCgpO1xuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc3RyaW5nIGtleSBpZiBpdCdzIG5vdCBhIHN0cmluZyBvciBzeW1ib2wuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd8c3ltYm9sfSBSZXR1cm5zIHRoZSBrZXkuXG5cdCAqL1xuXHRmdW5jdGlvbiB0b0tleSh2YWx1ZSkge1xuXHQgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHwgaXNTeW1ib2wodmFsdWUpKSB7XG5cdCAgICByZXR1cm4gdmFsdWU7XG5cdCAgfVxuXHQgIHZhciByZXN1bHQgPSAodmFsdWUgKyAnJyk7XG5cdCAgcmV0dXJuIChyZXN1bHQgPT0gJzAnICYmICgxIC8gdmFsdWUpID09IC1JbmZpbml0eSkgPyAnLTAnIDogcmVzdWx0O1xuXHR9XG5cblx0X3RvS2V5ID0gdG9LZXk7XG5cdHJldHVybiBfdG9LZXk7XG59XG5cbnZhciBfYmFzZUdldDtcbnZhciBoYXNSZXF1aXJlZF9iYXNlR2V0O1xuXG5mdW5jdGlvbiByZXF1aXJlX2Jhc2VHZXQgKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRfYmFzZUdldCkgcmV0dXJuIF9iYXNlR2V0O1xuXHRoYXNSZXF1aXJlZF9iYXNlR2V0ID0gMTtcblx0dmFyIGNhc3RQYXRoID0gcmVxdWlyZV9jYXN0UGF0aCgpLFxuXHQgICAgdG9LZXkgPSByZXF1aXJlX3RvS2V5KCk7XG5cblx0LyoqXG5cdCAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmdldGAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWZhdWx0IHZhbHVlcy5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuXHQgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuXHQgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzb2x2ZWQgdmFsdWUuXG5cdCAqL1xuXHRmdW5jdGlvbiBiYXNlR2V0KG9iamVjdCwgcGF0aCkge1xuXHQgIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuXG5cdCAgdmFyIGluZGV4ID0gMCxcblx0ICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGg7XG5cblx0ICB3aGlsZSAob2JqZWN0ICE9IG51bGwgJiYgaW5kZXggPCBsZW5ndGgpIHtcblx0ICAgIG9iamVjdCA9IG9iamVjdFt0b0tleShwYXRoW2luZGV4KytdKV07XG5cdCAgfVxuXHQgIHJldHVybiAoaW5kZXggJiYgaW5kZXggPT0gbGVuZ3RoKSA/IG9iamVjdCA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdF9iYXNlR2V0ID0gYmFzZUdldDtcblx0cmV0dXJuIF9iYXNlR2V0O1xufVxuXG52YXIgZ2V0XzE7XG52YXIgaGFzUmVxdWlyZWRHZXQ7XG5cbmZ1bmN0aW9uIHJlcXVpcmVHZXQgKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRHZXQpIHJldHVybiBnZXRfMTtcblx0aGFzUmVxdWlyZWRHZXQgPSAxO1xuXHR2YXIgYmFzZUdldCA9IHJlcXVpcmVfYmFzZUdldCgpO1xuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSB2YWx1ZSBhdCBgcGF0aGAgb2YgYG9iamVjdGAuIElmIHRoZSByZXNvbHZlZCB2YWx1ZSBpc1xuXHQgKiBgdW5kZWZpbmVkYCwgdGhlIGBkZWZhdWx0VmFsdWVgIGlzIHJldHVybmVkIGluIGl0cyBwbGFjZS5cblx0ICpcblx0ICogQHN0YXRpY1xuXHQgKiBAbWVtYmVyT2YgX1xuXHQgKiBAc2luY2UgMy43LjBcblx0ICogQGNhdGVnb3J5IE9iamVjdFxuXHQgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG5cdCAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG5cdCAqIEBwYXJhbSB7Kn0gW2RlZmF1bHRWYWx1ZV0gVGhlIHZhbHVlIHJldHVybmVkIGZvciBgdW5kZWZpbmVkYCByZXNvbHZlZCB2YWx1ZXMuXG5cdCAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cblx0ICogQGV4YW1wbGVcblx0ICpcblx0ICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiAzIH0gfV0gfTtcblx0ICpcblx0ICogXy5nZXQob2JqZWN0LCAnYVswXS5iLmMnKTtcblx0ICogLy8gPT4gM1xuXHQgKlxuXHQgKiBfLmdldChvYmplY3QsIFsnYScsICcwJywgJ2InLCAnYyddKTtcblx0ICogLy8gPT4gM1xuXHQgKlxuXHQgKiBfLmdldChvYmplY3QsICdhLmIuYycsICdkZWZhdWx0Jyk7XG5cdCAqIC8vID0+ICdkZWZhdWx0J1xuXHQgKi9cblx0ZnVuY3Rpb24gZ2V0KG9iamVjdCwgcGF0aCwgZGVmYXVsdFZhbHVlKSB7XG5cdCAgdmFyIHJlc3VsdCA9IG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogYmFzZUdldChvYmplY3QsIHBhdGgpO1xuXHQgIHJldHVybiByZXN1bHQgPT09IHVuZGVmaW5lZCA/IGRlZmF1bHRWYWx1ZSA6IHJlc3VsdDtcblx0fVxuXG5cdGdldF8xID0gZ2V0O1xuXHRyZXR1cm4gZ2V0XzE7XG59XG5cbnZhciBnZXRFeHBvcnRzID0gcmVxdWlyZUdldCgpO1xudmFyIGdldCA9IC8qQF9fUFVSRV9fKi9nZXREZWZhdWx0RXhwb3J0RnJvbUNqcyhnZXRFeHBvcnRzKTtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTtcbnZhciBoYXNSZXF1aXJlZF9kZWZpbmVQcm9wZXJ0eTtcblxuZnVuY3Rpb24gcmVxdWlyZV9kZWZpbmVQcm9wZXJ0eSAoKSB7XG5cdGlmIChoYXNSZXF1aXJlZF9kZWZpbmVQcm9wZXJ0eSkgcmV0dXJuIF9kZWZpbmVQcm9wZXJ0eTtcblx0aGFzUmVxdWlyZWRfZGVmaW5lUHJvcGVydHkgPSAxO1xuXHR2YXIgZ2V0TmF0aXZlID0gcmVxdWlyZV9nZXROYXRpdmUoKTtcblxuXHR2YXIgZGVmaW5lUHJvcGVydHkgPSAoZnVuY3Rpb24oKSB7XG5cdCAgdHJ5IHtcblx0ICAgIHZhciBmdW5jID0gZ2V0TmF0aXZlKE9iamVjdCwgJ2RlZmluZVByb3BlcnR5Jyk7XG5cdCAgICBmdW5jKHt9LCAnJywge30pO1xuXHQgICAgcmV0dXJuIGZ1bmM7XG5cdCAgfSBjYXRjaCAoZSkge31cblx0fSgpKTtcblxuXHRfZGVmaW5lUHJvcGVydHkgPSBkZWZpbmVQcm9wZXJ0eTtcblx0cmV0dXJuIF9kZWZpbmVQcm9wZXJ0eTtcbn1cblxudmFyIF9iYXNlQXNzaWduVmFsdWU7XG52YXIgaGFzUmVxdWlyZWRfYmFzZUFzc2lnblZhbHVlO1xuXG5mdW5jdGlvbiByZXF1aXJlX2Jhc2VBc3NpZ25WYWx1ZSAoKSB7XG5cdGlmIChoYXNSZXF1aXJlZF9iYXNlQXNzaWduVmFsdWUpIHJldHVybiBfYmFzZUFzc2lnblZhbHVlO1xuXHRoYXNSZXF1aXJlZF9iYXNlQXNzaWduVmFsdWUgPSAxO1xuXHR2YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlX2RlZmluZVByb3BlcnR5KCk7XG5cblx0LyoqXG5cdCAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBhc3NpZ25WYWx1ZWAgYW5kIGBhc3NpZ25NZXJnZVZhbHVlYCB3aXRob3V0XG5cdCAqIHZhbHVlIGNoZWNrcy5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cblx0ICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uXG5cdCAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFzc2lnbi5cblx0ICovXG5cdGZ1bmN0aW9uIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpIHtcblx0ICBpZiAoa2V5ID09ICdfX3Byb3RvX18nICYmIGRlZmluZVByb3BlcnR5KSB7XG5cdCAgICBkZWZpbmVQcm9wZXJ0eShvYmplY3QsIGtleSwge1xuXHQgICAgICAnY29uZmlndXJhYmxlJzogdHJ1ZSxcblx0ICAgICAgJ2VudW1lcmFibGUnOiB0cnVlLFxuXHQgICAgICAndmFsdWUnOiB2YWx1ZSxcblx0ICAgICAgJ3dyaXRhYmxlJzogdHJ1ZVxuXHQgICAgfSk7XG5cdCAgfSBlbHNlIHtcblx0ICAgIG9iamVjdFtrZXldID0gdmFsdWU7XG5cdCAgfVxuXHR9XG5cblx0X2Jhc2VBc3NpZ25WYWx1ZSA9IGJhc2VBc3NpZ25WYWx1ZTtcblx0cmV0dXJuIF9iYXNlQXNzaWduVmFsdWU7XG59XG5cbnZhciBfYXNzaWduVmFsdWU7XG52YXIgaGFzUmVxdWlyZWRfYXNzaWduVmFsdWU7XG5cbmZ1bmN0aW9uIHJlcXVpcmVfYXNzaWduVmFsdWUgKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRfYXNzaWduVmFsdWUpIHJldHVybiBfYXNzaWduVmFsdWU7XG5cdGhhc1JlcXVpcmVkX2Fzc2lnblZhbHVlID0gMTtcblx0dmFyIGJhc2VBc3NpZ25WYWx1ZSA9IHJlcXVpcmVfYmFzZUFzc2lnblZhbHVlKCksXG5cdCAgICBlcSA9IHJlcXVpcmVFcSgpO1xuXG5cdC8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cblx0dmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuXHQvKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cblx0dmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cblx0LyoqXG5cdCAqIEFzc2lnbnMgYHZhbHVlYCB0byBga2V5YCBvZiBgb2JqZWN0YCBpZiB0aGUgZXhpc3RpbmcgdmFsdWUgaXMgbm90IGVxdWl2YWxlbnRcblx0ICogdXNpbmcgW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcblx0ICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuXHQgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cblx0ICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYXNzaWduLlxuXHQgKi9cblx0ZnVuY3Rpb24gYXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKSB7XG5cdCAgdmFyIG9ialZhbHVlID0gb2JqZWN0W2tleV07XG5cdCAgaWYgKCEoaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkgJiYgZXEob2JqVmFsdWUsIHZhbHVlKSkgfHxcblx0ICAgICAgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkpIHtcblx0ICAgIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpO1xuXHQgIH1cblx0fVxuXG5cdF9hc3NpZ25WYWx1ZSA9IGFzc2lnblZhbHVlO1xuXHRyZXR1cm4gX2Fzc2lnblZhbHVlO1xufVxuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cblxudmFyIF9pc0luZGV4O1xudmFyIGhhc1JlcXVpcmVkX2lzSW5kZXg7XG5cbmZ1bmN0aW9uIHJlcXVpcmVfaXNJbmRleCAoKSB7XG5cdGlmIChoYXNSZXF1aXJlZF9pc0luZGV4KSByZXR1cm4gX2lzSW5kZXg7XG5cdGhhc1JlcXVpcmVkX2lzSW5kZXggPSAxO1xuXHR2YXIgTUFYX1NBRkVfSU5URUdFUiA9IDkwMDcxOTkyNTQ3NDA5OTE7XG5cblx0LyoqIFVzZWQgdG8gZGV0ZWN0IHVuc2lnbmVkIGludGVnZXIgdmFsdWVzLiAqL1xuXHR2YXIgcmVJc1VpbnQgPSAvXig/OjB8WzEtOV1cXGQqKSQvO1xuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGFycmF5LWxpa2UgaW5kZXguXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2xlbmd0aD1NQVhfU0FGRV9JTlRFR0VSXSBUaGUgdXBwZXIgYm91bmRzIG9mIGEgdmFsaWQgaW5kZXguXG5cdCAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgaW5kZXgsIGVsc2UgYGZhbHNlYC5cblx0ICovXG5cdGZ1bmN0aW9uIGlzSW5kZXgodmFsdWUsIGxlbmd0aCkge1xuXHQgIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuXHQgIGxlbmd0aCA9IGxlbmd0aCA9PSBudWxsID8gTUFYX1NBRkVfSU5URUdFUiA6IGxlbmd0aDtcblxuXHQgIHJldHVybiAhIWxlbmd0aCAmJlxuXHQgICAgKHR5cGUgPT0gJ251bWJlcicgfHxcblx0ICAgICAgKHR5cGUgIT0gJ3N5bWJvbCcgJiYgcmVJc1VpbnQudGVzdCh2YWx1ZSkpKSAmJlxuXHQgICAgICAgICh2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDwgbGVuZ3RoKTtcblx0fVxuXG5cdF9pc0luZGV4ID0gaXNJbmRleDtcblx0cmV0dXJuIF9pc0luZGV4O1xufVxuXG52YXIgX2Jhc2VTZXQ7XG52YXIgaGFzUmVxdWlyZWRfYmFzZVNldDtcblxuZnVuY3Rpb24gcmVxdWlyZV9iYXNlU2V0ICgpIHtcblx0aWYgKGhhc1JlcXVpcmVkX2Jhc2VTZXQpIHJldHVybiBfYmFzZVNldDtcblx0aGFzUmVxdWlyZWRfYmFzZVNldCA9IDE7XG5cdHZhciBhc3NpZ25WYWx1ZSA9IHJlcXVpcmVfYXNzaWduVmFsdWUoKSxcblx0ICAgIGNhc3RQYXRoID0gcmVxdWlyZV9jYXN0UGF0aCgpLFxuXHQgICAgaXNJbmRleCA9IHJlcXVpcmVfaXNJbmRleCgpLFxuXHQgICAgaXNPYmplY3QgPSByZXF1aXJlSXNPYmplY3QoKSxcblx0ICAgIHRvS2V5ID0gcmVxdWlyZV90b0tleSgpO1xuXG5cdC8qKlxuXHQgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zZXRgLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuXHQgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LlxuXHQgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIHBhdGggY3JlYXRpb24uXG5cdCAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG5cdCAqL1xuXHRmdW5jdGlvbiBiYXNlU2V0KG9iamVjdCwgcGF0aCwgdmFsdWUsIGN1c3RvbWl6ZXIpIHtcblx0ICBpZiAoIWlzT2JqZWN0KG9iamVjdCkpIHtcblx0ICAgIHJldHVybiBvYmplY3Q7XG5cdCAgfVxuXHQgIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuXG5cdCAgdmFyIGluZGV4ID0gLTEsXG5cdCAgICAgIGxlbmd0aCA9IHBhdGgubGVuZ3RoLFxuXHQgICAgICBsYXN0SW5kZXggPSBsZW5ndGggLSAxLFxuXHQgICAgICBuZXN0ZWQgPSBvYmplY3Q7XG5cblx0ICB3aGlsZSAobmVzdGVkICE9IG51bGwgJiYgKytpbmRleCA8IGxlbmd0aCkge1xuXHQgICAgdmFyIGtleSA9IHRvS2V5KHBhdGhbaW5kZXhdKSxcblx0ICAgICAgICBuZXdWYWx1ZSA9IHZhbHVlO1xuXG5cdCAgICBpZiAoa2V5ID09PSAnX19wcm90b19fJyB8fCBrZXkgPT09ICdjb25zdHJ1Y3RvcicgfHwga2V5ID09PSAncHJvdG90eXBlJykge1xuXHQgICAgICByZXR1cm4gb2JqZWN0O1xuXHQgICAgfVxuXG5cdCAgICBpZiAoaW5kZXggIT0gbGFzdEluZGV4KSB7XG5cdCAgICAgIHZhciBvYmpWYWx1ZSA9IG5lc3RlZFtrZXldO1xuXHQgICAgICBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXIgPyBjdXN0b21pemVyKG9ialZhbHVlLCBrZXksIG5lc3RlZCkgOiB1bmRlZmluZWQ7XG5cdCAgICAgIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgbmV3VmFsdWUgPSBpc09iamVjdChvYmpWYWx1ZSlcblx0ICAgICAgICAgID8gb2JqVmFsdWVcblx0ICAgICAgICAgIDogKGlzSW5kZXgocGF0aFtpbmRleCArIDFdKSA/IFtdIDoge30pO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICBhc3NpZ25WYWx1ZShuZXN0ZWQsIGtleSwgbmV3VmFsdWUpO1xuXHQgICAgbmVzdGVkID0gbmVzdGVkW2tleV07XG5cdCAgfVxuXHQgIHJldHVybiBvYmplY3Q7XG5cdH1cblxuXHRfYmFzZVNldCA9IGJhc2VTZXQ7XG5cdHJldHVybiBfYmFzZVNldDtcbn1cblxudmFyIHNldF8xO1xudmFyIGhhc1JlcXVpcmVkU2V0O1xuXG5mdW5jdGlvbiByZXF1aXJlU2V0ICgpIHtcblx0aWYgKGhhc1JlcXVpcmVkU2V0KSByZXR1cm4gc2V0XzE7XG5cdGhhc1JlcXVpcmVkU2V0ID0gMTtcblx0dmFyIGJhc2VTZXQgPSByZXF1aXJlX2Jhc2VTZXQoKTtcblxuXHQvKipcblx0ICogU2V0cyB0aGUgdmFsdWUgYXQgYHBhdGhgIG9mIGBvYmplY3RgLiBJZiBhIHBvcnRpb24gb2YgYHBhdGhgIGRvZXNuJ3QgZXhpc3QsXG5cdCAqIGl0J3MgY3JlYXRlZC4gQXJyYXlzIGFyZSBjcmVhdGVkIGZvciBtaXNzaW5nIGluZGV4IHByb3BlcnRpZXMgd2hpbGUgb2JqZWN0c1xuXHQgKiBhcmUgY3JlYXRlZCBmb3IgYWxsIG90aGVyIG1pc3NpbmcgcHJvcGVydGllcy4gVXNlIGBfLnNldFdpdGhgIHRvIGN1c3RvbWl6ZVxuXHQgKiBgcGF0aGAgY3JlYXRpb24uXG5cdCAqXG5cdCAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuXHQgKlxuXHQgKiBAc3RhdGljXG5cdCAqIEBtZW1iZXJPZiBfXG5cdCAqIEBzaW5jZSAzLjcuMFxuXHQgKiBAY2F0ZWdvcnkgT2JqZWN0XG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG5cdCAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuXG5cdCAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cblx0ICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cblx0ICogQGV4YW1wbGVcblx0ICpcblx0ICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiAzIH0gfV0gfTtcblx0ICpcblx0ICogXy5zZXQob2JqZWN0LCAnYVswXS5iLmMnLCA0KTtcblx0ICogY29uc29sZS5sb2cob2JqZWN0LmFbMF0uYi5jKTtcblx0ICogLy8gPT4gNFxuXHQgKlxuXHQgKiBfLnNldChvYmplY3QsIFsneCcsICcwJywgJ3knLCAneiddLCA1KTtcblx0ICogY29uc29sZS5sb2cob2JqZWN0LnhbMF0ueS56KTtcblx0ICogLy8gPT4gNVxuXHQgKi9cblx0ZnVuY3Rpb24gc2V0KG9iamVjdCwgcGF0aCwgdmFsdWUpIHtcblx0ICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyBvYmplY3QgOiBiYXNlU2V0KG9iamVjdCwgcGF0aCwgdmFsdWUpO1xuXHR9XG5cblx0c2V0XzEgPSBzZXQ7XG5cdHJldHVybiBzZXRfMTtcbn1cblxudmFyIHNldEV4cG9ydHMgPSByZXF1aXJlU2V0KCk7XG52YXIgc2V0ID0gLypAX19QVVJFX18qL2dldERlZmF1bHRFeHBvcnRGcm9tQ2pzKHNldEV4cG9ydHMpO1xuXG4vKipcbiAqIENvcGllcyB0aGUgdmFsdWVzIG9mIGBzb3VyY2VgIHRvIGBhcnJheWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IHNvdXJjZSBUaGUgYXJyYXkgdG8gY29weSB2YWx1ZXMgZnJvbS5cbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheT1bXV0gVGhlIGFycmF5IHRvIGNvcHkgdmFsdWVzIHRvLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gKi9cblxudmFyIF9jb3B5QXJyYXk7XG52YXIgaGFzUmVxdWlyZWRfY29weUFycmF5O1xuXG5mdW5jdGlvbiByZXF1aXJlX2NvcHlBcnJheSAoKSB7XG5cdGlmIChoYXNSZXF1aXJlZF9jb3B5QXJyYXkpIHJldHVybiBfY29weUFycmF5O1xuXHRoYXNSZXF1aXJlZF9jb3B5QXJyYXkgPSAxO1xuXHRmdW5jdGlvbiBjb3B5QXJyYXkoc291cmNlLCBhcnJheSkge1xuXHQgIHZhciBpbmRleCA9IC0xLFxuXHQgICAgICBsZW5ndGggPSBzb3VyY2UubGVuZ3RoO1xuXG5cdCAgYXJyYXkgfHwgKGFycmF5ID0gQXJyYXkobGVuZ3RoKSk7XG5cdCAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcblx0ICAgIGFycmF5W2luZGV4XSA9IHNvdXJjZVtpbmRleF07XG5cdCAgfVxuXHQgIHJldHVybiBhcnJheTtcblx0fVxuXG5cdF9jb3B5QXJyYXkgPSBjb3B5QXJyYXk7XG5cdHJldHVybiBfY29weUFycmF5O1xufVxuXG52YXIgdG9QYXRoXzE7XG52YXIgaGFzUmVxdWlyZWRUb1BhdGg7XG5cbmZ1bmN0aW9uIHJlcXVpcmVUb1BhdGggKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRUb1BhdGgpIHJldHVybiB0b1BhdGhfMTtcblx0aGFzUmVxdWlyZWRUb1BhdGggPSAxO1xuXHR2YXIgYXJyYXlNYXAgPSByZXF1aXJlX2FycmF5TWFwKCksXG5cdCAgICBjb3B5QXJyYXkgPSByZXF1aXJlX2NvcHlBcnJheSgpLFxuXHQgICAgaXNBcnJheSA9IHJlcXVpcmVJc0FycmF5KCksXG5cdCAgICBpc1N5bWJvbCA9IHJlcXVpcmVJc1N5bWJvbCgpLFxuXHQgICAgc3RyaW5nVG9QYXRoID0gcmVxdWlyZV9zdHJpbmdUb1BhdGgoKSxcblx0ICAgIHRvS2V5ID0gcmVxdWlyZV90b0tleSgpLFxuXHQgICAgdG9TdHJpbmcgPSByZXF1aXJlVG9TdHJpbmcoKTtcblxuXHQvKipcblx0ICogQ29udmVydHMgYHZhbHVlYCB0byBhIHByb3BlcnR5IHBhdGggYXJyYXkuXG5cdCAqXG5cdCAqIEBzdGF0aWNcblx0ICogQG1lbWJlck9mIF9cblx0ICogQHNpbmNlIDQuMC4wXG5cdCAqIEBjYXRlZ29yeSBVdGlsXG5cdCAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG5cdCAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHByb3BlcnR5IHBhdGggYXJyYXkuXG5cdCAqIEBleGFtcGxlXG5cdCAqXG5cdCAqIF8udG9QYXRoKCdhLmIuYycpO1xuXHQgKiAvLyA9PiBbJ2EnLCAnYicsICdjJ11cblx0ICpcblx0ICogXy50b1BhdGgoJ2FbMF0uYi5jJyk7XG5cdCAqIC8vID0+IFsnYScsICcwJywgJ2InLCAnYyddXG5cdCAqL1xuXHRmdW5jdGlvbiB0b1BhdGgodmFsdWUpIHtcblx0ICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcblx0ICAgIHJldHVybiBhcnJheU1hcCh2YWx1ZSwgdG9LZXkpO1xuXHQgIH1cblx0ICByZXR1cm4gaXNTeW1ib2wodmFsdWUpID8gW3ZhbHVlXSA6IGNvcHlBcnJheShzdHJpbmdUb1BhdGgodG9TdHJpbmcodmFsdWUpKSk7XG5cdH1cblxuXHR0b1BhdGhfMSA9IHRvUGF0aDtcblx0cmV0dXJuIHRvUGF0aF8xO1xufVxuXG52YXIgdG9QYXRoRXhwb3J0cyA9IHJlcXVpcmVUb1BhdGgoKTtcbnZhciB0b1BhdGggPSAvKkBfX1BVUkVfXyovZ2V0RGVmYXVsdEV4cG9ydEZyb21DanModG9QYXRoRXhwb3J0cyk7XG5cbnZhciBkZWZpbmUkMiA9IHtcbiAgLy8gYWNjZXNzIGRhdGEgZmllbGRcbiAgZGF0YTogZnVuY3Rpb24gZGF0YShwYXJhbXMpIHtcbiAgICB2YXIgZGVmYXVsdHMgPSB7XG4gICAgICBmaWVsZDogJ2RhdGEnLFxuICAgICAgYmluZGluZ0V2ZW50OiAnZGF0YScsXG4gICAgICBhbGxvd0JpbmRpbmc6IGZhbHNlLFxuICAgICAgYWxsb3dTZXR0aW5nOiBmYWxzZSxcbiAgICAgIGFsbG93R2V0dGluZzogZmFsc2UsXG4gICAgICBzZXR0aW5nRXZlbnQ6ICdkYXRhJyxcbiAgICAgIHNldHRpbmdUcmlnZ2Vyc0V2ZW50OiBmYWxzZSxcbiAgICAgIHRyaWdnZXJGbk5hbWU6ICd0cmlnZ2VyJyxcbiAgICAgIGltbXV0YWJsZUtleXM6IHt9LFxuICAgICAgLy8ga2V5ID0+IHRydWUgaWYgaW1tdXRhYmxlXG4gICAgICB1cGRhdGVTdHlsZTogZmFsc2UsXG4gICAgICBiZWZvcmVHZXQ6IGZ1bmN0aW9uIGJlZm9yZUdldChzZWxmKSB7fSxcbiAgICAgIGJlZm9yZVNldDogZnVuY3Rpb24gYmVmb3JlU2V0KHNlbGYsIG9iaikge30sXG4gICAgICBvblNldDogZnVuY3Rpb24gb25TZXQoc2VsZikge30sXG4gICAgICBjYW5TZXQ6IGZ1bmN0aW9uIGNhblNldChzZWxmKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH07XG4gICAgcGFyYW1zID0gZXh0ZW5kKHt9LCBkZWZhdWx0cywgcGFyYW1zKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gZGF0YUltcGwobmFtZSwgdmFsdWUpIHtcbiAgICAgIHZhciBwID0gcGFyYW1zO1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHNlbGZJc0FycmF5TGlrZSA9IHNlbGYubGVuZ3RoICE9PSB1bmRlZmluZWQ7XG4gICAgICB2YXIgYWxsID0gc2VsZklzQXJyYXlMaWtlID8gc2VsZiA6IFtzZWxmXTsgLy8gcHV0IGluIGFycmF5IGlmIG5vdCBhcnJheS1saWtlXG4gICAgICB2YXIgc2luZ2xlID0gc2VsZklzQXJyYXlMaWtlID8gc2VsZlswXSA6IHNlbGY7XG5cbiAgICAgIC8vIC5kYXRhKCdmb28nLCAuLi4pXG4gICAgICBpZiAoc3RyaW5nKG5hbWUpKSB7XG4gICAgICAgIC8vIHNldCBvciBnZXQgcHJvcGVydHlcbiAgICAgICAgdmFyIGlzUGF0aExpa2UgPSBuYW1lLmluZGV4T2YoJy4nKSAhPT0gLTE7IC8vIHRoZXJlIG1pZ2h0IGJlIGEgbm9ybWFsIGZpZWxkIHdpdGggYSBkb3QgXG4gICAgICAgIHZhciBwYXRoID0gaXNQYXRoTGlrZSAmJiB0b1BhdGgobmFtZSk7XG5cbiAgICAgICAgLy8gLmRhdGEoJ2ZvbycpXG4gICAgICAgIGlmIChwLmFsbG93R2V0dGluZyAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gZ2V0XG5cbiAgICAgICAgICB2YXIgcmV0O1xuICAgICAgICAgIGlmIChzaW5nbGUpIHtcbiAgICAgICAgICAgIHAuYmVmb3JlR2V0KHNpbmdsZSk7XG5cbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIGl0J3MgcGF0aCBhbmQgYSBmaWVsZCB3aXRoIHRoZSBzYW1lIG5hbWUgZG9lc24ndCBleGlzdFxuICAgICAgICAgICAgaWYgKHBhdGggJiYgc2luZ2xlLl9wcml2YXRlW3AuZmllbGRdW25hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgcmV0ID0gZ2V0KHNpbmdsZS5fcHJpdmF0ZVtwLmZpZWxkXSwgcGF0aCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXQgPSBzaW5nbGUuX3ByaXZhdGVbcC5maWVsZF1bbmFtZV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXQ7XG5cbiAgICAgICAgICAvLyAuZGF0YSgnZm9vJywgJ2JhcicpXG4gICAgICAgIH0gZWxzZSBpZiAocC5hbGxvd1NldHRpbmcgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIHNldFxuICAgICAgICAgIHZhciB2YWxpZCA9ICFwLmltbXV0YWJsZUtleXNbbmFtZV07XG4gICAgICAgICAgaWYgKHZhbGlkKSB7XG4gICAgICAgICAgICB2YXIgY2hhbmdlID0gX2RlZmluZVByb3BlcnR5JDEoe30sIG5hbWUsIHZhbHVlKTtcbiAgICAgICAgICAgIHAuYmVmb3JlU2V0KHNlbGYsIGNoYW5nZSk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGFsbC5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgICAgdmFyIGVsZSA9IGFsbFtpXTtcbiAgICAgICAgICAgICAgaWYgKHAuY2FuU2V0KGVsZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAocGF0aCAmJiBzaW5nbGUuX3ByaXZhdGVbcC5maWVsZF1bbmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgc2V0KGVsZS5fcHJpdmF0ZVtwLmZpZWxkXSwgcGF0aCwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBlbGUuX3ByaXZhdGVbcC5maWVsZF1bbmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gdXBkYXRlIG1hcHBlcnMgaWYgYXNrZWRcbiAgICAgICAgICAgIGlmIChwLnVwZGF0ZVN0eWxlKSB7XG4gICAgICAgICAgICAgIHNlbGYudXBkYXRlU3R5bGUoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gY2FsbCBvblNldCBjYWxsYmFja1xuICAgICAgICAgICAgcC5vblNldChzZWxmKTtcbiAgICAgICAgICAgIGlmIChwLnNldHRpbmdUcmlnZ2Vyc0V2ZW50KSB7XG4gICAgICAgICAgICAgIHNlbGZbcC50cmlnZ2VyRm5OYW1lXShwLnNldHRpbmdFdmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gLmRhdGEoeyAnZm9vJzogJ2JhcicgfSlcbiAgICAgIH0gZWxzZSBpZiAocC5hbGxvd1NldHRpbmcgJiYgcGxhaW5PYmplY3QobmFtZSkpIHtcbiAgICAgICAgLy8gZXh0ZW5kXG4gICAgICAgIHZhciBvYmogPSBuYW1lO1xuICAgICAgICB2YXIgaywgdjtcbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICAgICAgICBwLmJlZm9yZVNldChzZWxmLCBvYmopO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwga2V5cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICBrID0ga2V5c1tfaV07XG4gICAgICAgICAgdiA9IG9ialtrXTtcbiAgICAgICAgICB2YXIgX3ZhbGlkID0gIXAuaW1tdXRhYmxlS2V5c1trXTtcbiAgICAgICAgICBpZiAoX3ZhbGlkKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGFsbC5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICB2YXIgX2VsZSA9IGFsbFtqXTtcbiAgICAgICAgICAgICAgaWYgKHAuY2FuU2V0KF9lbGUpKSB7XG4gICAgICAgICAgICAgICAgX2VsZS5fcHJpdmF0ZVtwLmZpZWxkXVtrXSA9IHY7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyB1cGRhdGUgbWFwcGVycyBpZiBhc2tlZFxuICAgICAgICBpZiAocC51cGRhdGVTdHlsZSkge1xuICAgICAgICAgIHNlbGYudXBkYXRlU3R5bGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNhbGwgb25TZXQgY2FsbGJhY2tcbiAgICAgICAgcC5vblNldChzZWxmKTtcbiAgICAgICAgaWYgKHAuc2V0dGluZ1RyaWdnZXJzRXZlbnQpIHtcbiAgICAgICAgICBzZWxmW3AudHJpZ2dlckZuTmFtZV0ocC5zZXR0aW5nRXZlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gLmRhdGEoZnVuY3Rpb24oKXsgLi4uIH0pXG4gICAgICB9IGVsc2UgaWYgKHAuYWxsb3dCaW5kaW5nICYmIGZuJDYobmFtZSkpIHtcbiAgICAgICAgLy8gYmluZCB0byBldmVudFxuICAgICAgICB2YXIgZm4gPSBuYW1lO1xuICAgICAgICBzZWxmLm9uKHAuYmluZGluZ0V2ZW50LCBmbik7XG5cbiAgICAgICAgLy8gLmRhdGEoKVxuICAgICAgfSBlbHNlIGlmIChwLmFsbG93R2V0dGluZyAmJiBuYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gZ2V0IHdob2xlIG9iamVjdFxuICAgICAgICB2YXIgX3JldDtcbiAgICAgICAgaWYgKHNpbmdsZSkge1xuICAgICAgICAgIHAuYmVmb3JlR2V0KHNpbmdsZSk7XG4gICAgICAgICAgX3JldCA9IHNpbmdsZS5fcHJpdmF0ZVtwLmZpZWxkXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX3JldDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzZWxmOyAvLyBtYWludGFpbiBjaGFpbmFiaWxpdHlcbiAgICB9OyAvLyBmdW5jdGlvblxuICB9LFxuICAvLyBkYXRhXG5cbiAgLy8gcmVtb3ZlIGRhdGEgZmllbGRcbiAgcmVtb3ZlRGF0YTogZnVuY3Rpb24gcmVtb3ZlRGF0YShwYXJhbXMpIHtcbiAgICB2YXIgZGVmYXVsdHMgPSB7XG4gICAgICBmaWVsZDogJ2RhdGEnLFxuICAgICAgZXZlbnQ6ICdkYXRhJyxcbiAgICAgIHRyaWdnZXJGbk5hbWU6ICd0cmlnZ2VyJyxcbiAgICAgIHRyaWdnZXJFdmVudDogZmFsc2UsXG4gICAgICBpbW11dGFibGVLZXlzOiB7fSAvLyBrZXkgPT4gdHJ1ZSBpZiBpbW11dGFibGVcbiAgICB9O1xuICAgIHBhcmFtcyA9IGV4dGVuZCh7fSwgZGVmYXVsdHMsIHBhcmFtcyk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHJlbW92ZURhdGFJbXBsKG5hbWVzKSB7XG4gICAgICB2YXIgcCA9IHBhcmFtcztcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBzZWxmSXNBcnJheUxpa2UgPSBzZWxmLmxlbmd0aCAhPT0gdW5kZWZpbmVkO1xuICAgICAgdmFyIGFsbCA9IHNlbGZJc0FycmF5TGlrZSA/IHNlbGYgOiBbc2VsZl07IC8vIHB1dCBpbiBhcnJheSBpZiBub3QgYXJyYXktbGlrZVxuXG4gICAgICAvLyAucmVtb3ZlRGF0YSgnZm9vIGJhcicpXG4gICAgICBpZiAoc3RyaW5nKG5hbWVzKSkge1xuICAgICAgICAvLyB0aGVuIGdldCB0aGUgbGlzdCBvZiBrZXlzLCBhbmQgZGVsZXRlIHRoZW1cbiAgICAgICAgdmFyIGtleXMgPSBuYW1lcy5zcGxpdCgvXFxzKy8pO1xuICAgICAgICB2YXIgbCA9IGtleXMubGVuZ3RoO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgIC8vIGRlbGV0ZSBlYWNoIG5vbi1lbXB0eSBrZXlcbiAgICAgICAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgICBpZiAoZW1wdHlTdHJpbmcoa2V5KSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciB2YWxpZCA9ICFwLmltbXV0YWJsZUtleXNba2V5XTsgLy8gbm90IHZhbGlkIGlmIGltbXV0YWJsZVxuICAgICAgICAgIGlmICh2YWxpZCkge1xuICAgICAgICAgICAgZm9yICh2YXIgaV9hID0gMCwgbF9hID0gYWxsLmxlbmd0aDsgaV9hIDwgbF9hOyBpX2ErKykge1xuICAgICAgICAgICAgICBhbGxbaV9hXS5fcHJpdmF0ZVtwLmZpZWxkXVtrZXldID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocC50cmlnZ2VyRXZlbnQpIHtcbiAgICAgICAgICBzZWxmW3AudHJpZ2dlckZuTmFtZV0ocC5ldmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAucmVtb3ZlRGF0YSgpXG4gICAgICB9IGVsc2UgaWYgKG5hbWVzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gdGhlbiBkZWxldGUgYWxsIGtleXNcblxuICAgICAgICBmb3IgKHZhciBfaV9hID0gMCwgX2xfYSA9IGFsbC5sZW5ndGg7IF9pX2EgPCBfbF9hOyBfaV9hKyspIHtcbiAgICAgICAgICB2YXIgX3ByaXZhdGVGaWVsZHMgPSBhbGxbX2lfYV0uX3ByaXZhdGVbcC5maWVsZF07XG4gICAgICAgICAgdmFyIF9rZXlzID0gT2JqZWN0LmtleXMoX3ByaXZhdGVGaWVsZHMpO1xuICAgICAgICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IF9rZXlzLmxlbmd0aDsgX2kyKyspIHtcbiAgICAgICAgICAgIHZhciBfa2V5ID0gX2tleXNbX2kyXTtcbiAgICAgICAgICAgIHZhciB2YWxpZEtleVRvRGVsZXRlID0gIXAuaW1tdXRhYmxlS2V5c1tfa2V5XTtcbiAgICAgICAgICAgIGlmICh2YWxpZEtleVRvRGVsZXRlKSB7XG4gICAgICAgICAgICAgIF9wcml2YXRlRmllbGRzW19rZXldID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocC50cmlnZ2VyRXZlbnQpIHtcbiAgICAgICAgICBzZWxmW3AudHJpZ2dlckZuTmFtZV0ocC5ldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzZWxmOyAvLyBtYWludGFpbiBjaGFpbmluZ1xuICAgIH07IC8vIGZ1bmN0aW9uXG4gIH0gLy8gcmVtb3ZlRGF0YVxufTsgLy8gZGVmaW5lXG5cbnZhciBkZWZpbmUkMSA9IHtcbiAgZXZlbnRBbGlhc2VzT246IGZ1bmN0aW9uIGV2ZW50QWxpYXNlc09uKHByb3RvKSB7XG4gICAgdmFyIHAgPSBwcm90bztcbiAgICBwLmFkZExpc3RlbmVyID0gcC5saXN0ZW4gPSBwLmJpbmQgPSBwLm9uO1xuICAgIHAudW5saXN0ZW4gPSBwLnVuYmluZCA9IHAub2ZmID0gcC5yZW1vdmVMaXN0ZW5lcjtcbiAgICBwLnRyaWdnZXIgPSBwLmVtaXQ7XG5cbiAgICAvLyB0aGlzIGlzIGp1c3QgYSB3cmFwcGVyIGFsaWFzIG9mIC5vbigpXG4gICAgcC5wb24gPSBwLnByb21pc2VPbiA9IGZ1bmN0aW9uIChldmVudHMsIHNlbGVjdG9yKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCk7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UkMShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHZhciBjYWxsYmFjayA9IGZ1bmN0aW9uIGNhbGxiYWNrKGUpIHtcbiAgICAgICAgICBzZWxmLm9mZi5hcHBseShzZWxmLCBvZmZBcmdzKTtcbiAgICAgICAgICByZXNvbHZlKGUpO1xuICAgICAgICB9O1xuICAgICAgICB2YXIgb25BcmdzID0gYXJncy5jb25jYXQoW2NhbGxiYWNrXSk7XG4gICAgICAgIHZhciBvZmZBcmdzID0gb25BcmdzLmNvbmNhdChbXSk7XG4gICAgICAgIHNlbGYub24uYXBwbHkoc2VsZiwgb25BcmdzKTtcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cbn07IC8vIGRlZmluZVxuXG4vLyB1c2UgdGhpcyBtb2R1bGUgdG8gY2hlcnJ5IHBpY2sgZnVuY3Rpb25zIGludG8geW91ciBwcm90b3R5cGVcbi8vICh1c2VmdWwgZm9yIGZ1bmN0aW9ucyBzaGFyZWQgYmV0d2VlbiB0aGUgY29yZSBhbmQgY29sbGVjdGlvbnMsIGZvciBleGFtcGxlKVxuXG52YXIgZGVmaW5lID0ge307XG5bZGVmaW5lJDMsIGRlZmluZSQyLCBkZWZpbmUkMV0uZm9yRWFjaChmdW5jdGlvbiAobSkge1xuICBleHRlbmQoZGVmaW5lLCBtKTtcbn0pO1xuXG52YXIgZWxlc2ZuJGkgPSB7XG4gIGFuaW1hdGU6IGRlZmluZS5hbmltYXRlKCksXG4gIGFuaW1hdGlvbjogZGVmaW5lLmFuaW1hdGlvbigpLFxuICBhbmltYXRlZDogZGVmaW5lLmFuaW1hdGVkKCksXG4gIGNsZWFyUXVldWU6IGRlZmluZS5jbGVhclF1ZXVlKCksXG4gIGRlbGF5OiBkZWZpbmUuZGVsYXkoKSxcbiAgZGVsYXlBbmltYXRpb246IGRlZmluZS5kZWxheUFuaW1hdGlvbigpLFxuICBzdG9wOiBkZWZpbmUuc3RvcCgpXG59O1xuXG52YXIgZWxlc2ZuJGggPSB7XG4gIGNsYXNzZXM6IGZ1bmN0aW9uIGNsYXNzZXMoX2NsYXNzZXMpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKF9jbGFzc2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciByZXQgPSBbXTtcbiAgICAgIHNlbGZbMF0uX3ByaXZhdGUuY2xhc3Nlcy5mb3JFYWNoKGZ1bmN0aW9uIChjbHMpIHtcbiAgICAgICAgcmV0dXJuIHJldC5wdXNoKGNscyk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXQ7XG4gICAgfSBlbHNlIGlmICghYXJyYXkoX2NsYXNzZXMpKSB7XG4gICAgICAvLyBleHRyYWN0IGNsYXNzZXMgZnJvbSBzdHJpbmdcbiAgICAgIF9jbGFzc2VzID0gKF9jbGFzc2VzIHx8ICcnKS5tYXRjaCgvXFxTKy9nKSB8fCBbXTtcbiAgICB9XG4gICAgdmFyIGNoYW5nZWQgPSBbXTtcbiAgICB2YXIgY2xhc3Nlc1NldCA9IG5ldyBTZXQkMShfY2xhc3Nlcyk7XG5cbiAgICAvLyBjaGVjayBhbmQgdXBkYXRlIGVhY2ggZWxlXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBzZWxmLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgZWxlID0gc2VsZltqXTtcbiAgICAgIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgICAgIHZhciBlbGVDbGFzc2VzID0gX3AuY2xhc3NlcztcbiAgICAgIHZhciBjaGFuZ2VkRWxlID0gZmFsc2U7XG5cbiAgICAgIC8vIGNoZWNrIGlmIGVsZSBoYXMgYWxsIG9mIHRoZSBwYXNzZWQgY2xhc3Nlc1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBfY2xhc3Nlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY2xzID0gX2NsYXNzZXNbaV07XG4gICAgICAgIHZhciBlbGVIYXNDbGFzcyA9IGVsZUNsYXNzZXMuaGFzKGNscyk7XG4gICAgICAgIGlmICghZWxlSGFzQ2xhc3MpIHtcbiAgICAgICAgICBjaGFuZ2VkRWxlID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBjaGVjayBpZiBlbGUgaGFzIGNsYXNzZXMgb3V0c2lkZSBvZiB0aG9zZSBwYXNzZWRcbiAgICAgIGlmICghY2hhbmdlZEVsZSkge1xuICAgICAgICBjaGFuZ2VkRWxlID0gZWxlQ2xhc3Nlcy5zaXplICE9PSBfY2xhc3Nlcy5sZW5ndGg7XG4gICAgICB9XG4gICAgICBpZiAoY2hhbmdlZEVsZSkge1xuICAgICAgICBfcC5jbGFzc2VzID0gY2xhc3Nlc1NldDtcbiAgICAgICAgY2hhbmdlZC5wdXNoKGVsZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gdHJpZ2dlciB1cGRhdGUgc3R5bGUgb24gdGhvc2UgZWxlcyB0aGF0IGhhZCBjbGFzcyBjaGFuZ2VzXG4gICAgaWYgKGNoYW5nZWQubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zcGF3bihjaGFuZ2VkKS51cGRhdGVTdHlsZSgpLmVtaXQoJ2NsYXNzJyk7XG4gICAgfVxuICAgIHJldHVybiBzZWxmO1xuICB9LFxuICBhZGRDbGFzczogZnVuY3Rpb24gYWRkQ2xhc3MoY2xhc3Nlcykge1xuICAgIHJldHVybiB0aGlzLnRvZ2dsZUNsYXNzKGNsYXNzZXMsIHRydWUpO1xuICB9LFxuICBoYXNDbGFzczogZnVuY3Rpb24gaGFzQ2xhc3MoY2xhc3NOYW1lKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgcmV0dXJuIGVsZSAhPSBudWxsICYmIGVsZS5fcHJpdmF0ZS5jbGFzc2VzLmhhcyhjbGFzc05hbWUpO1xuICB9LFxuICB0b2dnbGVDbGFzczogZnVuY3Rpb24gdG9nZ2xlQ2xhc3MoY2xhc3NlcywgdG9nZ2xlKSB7XG4gICAgaWYgKCFhcnJheShjbGFzc2VzKSkge1xuICAgICAgLy8gZXh0cmFjdCBjbGFzc2VzIGZyb20gc3RyaW5nXG4gICAgICBjbGFzc2VzID0gY2xhc3Nlcy5tYXRjaCgvXFxTKy9nKSB8fCBbXTtcbiAgICB9XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciB0b2dnbGVVbmRlZmQgPSB0b2dnbGUgPT09IHVuZGVmaW5lZDtcbiAgICB2YXIgY2hhbmdlZCA9IFtdOyAvLyBlbGVzIHdobyBoYWQgY2xhc3NlcyBjaGFuZ2VkXG5cbiAgICBmb3IgKHZhciBpID0gMCwgaWwgPSBzZWxmLmxlbmd0aDsgaSA8IGlsOyBpKyspIHtcbiAgICAgIHZhciBlbGUgPSBzZWxmW2ldO1xuICAgICAgdmFyIGVsZUNsYXNzZXMgPSBlbGUuX3ByaXZhdGUuY2xhc3NlcztcbiAgICAgIHZhciBjaGFuZ2VkRWxlID0gZmFsc2U7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNsYXNzZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIGNscyA9IGNsYXNzZXNbal07XG4gICAgICAgIHZhciBoYXNDbGFzcyA9IGVsZUNsYXNzZXMuaGFzKGNscyk7XG4gICAgICAgIHZhciBjaGFuZ2VkTm93ID0gZmFsc2U7XG4gICAgICAgIGlmICh0b2dnbGUgfHwgdG9nZ2xlVW5kZWZkICYmICFoYXNDbGFzcykge1xuICAgICAgICAgIGVsZUNsYXNzZXMuYWRkKGNscyk7XG4gICAgICAgICAgY2hhbmdlZE5vdyA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRvZ2dsZSB8fCB0b2dnbGVVbmRlZmQgJiYgaGFzQ2xhc3MpIHtcbiAgICAgICAgICBlbGVDbGFzc2VzW1wiZGVsZXRlXCJdKGNscyk7XG4gICAgICAgICAgY2hhbmdlZE5vdyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjaGFuZ2VkRWxlICYmIGNoYW5nZWROb3cpIHtcbiAgICAgICAgICBjaGFuZ2VkLnB1c2goZWxlKTtcbiAgICAgICAgICBjaGFuZ2VkRWxlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBmb3IgaiBjbGFzc2VzXG4gICAgfSAvLyBmb3IgaSBlbGVzXG5cbiAgICAvLyB0cmlnZ2VyIHVwZGF0ZSBzdHlsZSBvbiB0aG9zZSBlbGVzIHRoYXQgaGFkIGNsYXNzIGNoYW5nZXNcbiAgICBpZiAoY2hhbmdlZC5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnNwYXduKGNoYW5nZWQpLnVwZGF0ZVN0eWxlKCkuZW1pdCgnY2xhc3MnKTtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGY7XG4gIH0sXG4gIHJlbW92ZUNsYXNzOiBmdW5jdGlvbiByZW1vdmVDbGFzcyhjbGFzc2VzKSB7XG4gICAgcmV0dXJuIHRoaXMudG9nZ2xlQ2xhc3MoY2xhc3NlcywgZmFsc2UpO1xuICB9LFxuICBmbGFzaENsYXNzOiBmdW5jdGlvbiBmbGFzaENsYXNzKGNsYXNzZXMsIGR1cmF0aW9uKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmIChkdXJhdGlvbiA9PSBudWxsKSB7XG4gICAgICBkdXJhdGlvbiA9IDI1MDtcbiAgICB9IGVsc2UgaWYgKGR1cmF0aW9uID09PSAwKSB7XG4gICAgICByZXR1cm4gc2VsZjsgLy8gbm90aGluZyB0byBkbyByZWFsbHlcbiAgICB9XG4gICAgc2VsZi5hZGRDbGFzcyhjbGFzc2VzKTtcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHNlbGYucmVtb3ZlQ2xhc3MoY2xhc3Nlcyk7XG4gICAgfSwgZHVyYXRpb24pO1xuICAgIHJldHVybiBzZWxmO1xuICB9XG59O1xuZWxlc2ZuJGguY2xhc3NOYW1lID0gZWxlc2ZuJGguY2xhc3NOYW1lcyA9IGVsZXNmbiRoLmNsYXNzZXM7XG5cbi8vIHRva2VucyBpbiB0aGUgcXVlcnkgbGFuZ3VhZ2VcbnZhciB0b2tlbnMgPSB7XG4gIG1ldGFDaGFyOiAnW1xcXFwhXFxcXFwiXFxcXCNcXFxcJFxcXFwlXFxcXCZcXFxcXFwnXFxcXChcXFxcKVxcXFwqXFxcXCtcXFxcLFxcXFwuXFxcXC9cXFxcOlxcXFw7XFxcXDxcXFxcPVxcXFw+XFxcXD9cXFxcQFxcXFxbXFxcXF1cXFxcXlxcXFxgXFxcXHtcXFxcfFxcXFx9XFxcXH5dJyxcbiAgLy8gY2hhcnMgd2UgbmVlZCB0byBlc2NhcGUgaW4gbGV0IG5hbWVzLCBldGNcbiAgY29tcGFyYXRvck9wOiAnPXxcXFxcIT18Pnw+PXw8fDw9fFxcXFwkPXxcXFxcXj18XFxcXCo9JyxcbiAgLy8gYmluYXJ5IGNvbXBhcmlzb24gb3AgKHVzZWQgaW4gZGF0YSBzZWxlY3RvcnMpXG4gIGJvb2xPcDogJ1xcXFw/fFxcXFwhfFxcXFxeJyxcbiAgLy8gYm9vbGVhbiAodW5hcnkpIG9wZXJhdG9ycyAodXNlZCBpbiBkYXRhIHNlbGVjdG9ycylcbiAgc3RyaW5nOiAnXCIoPzpcXFxcXFxcXFwifFteXCJdKSpcIicgKyAnfCcgKyBcIicoPzpcXFxcXFxcXCd8W14nXSkqJ1wiLFxuICAvLyBzdHJpbmcgbGl0ZXJhbHMgKHVzZWQgaW4gZGF0YSBzZWxlY3RvcnMpIC0tIGRvdWJsZXF1b3RlcyB8IHNpbmdsZXF1b3Rlc1xuICBudW1iZXI6IG51bWJlcixcbiAgLy8gbnVtYmVyIGxpdGVyYWwgKHVzZWQgaW4gZGF0YSBzZWxlY3RvcnMpIC0tLSBlLmcuIDAuMTIzNCwgMTIzNCwgMTJlMTIzXG4gIG1ldGE6ICdkZWdyZWV8aW5kZWdyZWV8b3V0ZGVncmVlJyxcbiAgLy8gYWxsb3dlZCBtZXRhZGF0YSBmaWVsZHMgKGkuZS4gYWxsb3dlZCBmdW5jdGlvbnMgdG8gdXNlIGZyb20gQ29sbGVjdGlvbilcbiAgc2VwYXJhdG9yOiAnXFxcXHMqLFxcXFxzKicsXG4gIC8vIHF1ZXJpZXMgYXJlIHNlcGFyYXRlZCBieSBjb21tYXMsIGUuZy4gZWRnZVtmb28gPSAnYmFyJ10sIG5vZGUuc29tZUNsYXNzXG4gIGRlc2NlbmRhbnQ6ICdcXFxccysnLFxuICBjaGlsZDogJ1xcXFxzKz5cXFxccysnLFxuICBzdWJqZWN0OiAnXFxcXCQnLFxuICBncm91cDogJ25vZGV8ZWRnZXxcXFxcKicsXG4gIGRpcmVjdGVkRWRnZTogJ1xcXFxzKy0+XFxcXHMrJyxcbiAgdW5kaXJlY3RlZEVkZ2U6ICdcXFxccys8LT5cXFxccysnXG59O1xudG9rZW5zLnZhcmlhYmxlID0gJyg/OltcXFxcdy0uXXwoPzpcXFxcXFxcXCcgKyB0b2tlbnMubWV0YUNoYXIgKyAnKSkrJzsgLy8gYSB2YXJpYWJsZSBuYW1lIGNhbiBoYXZlIGxldHRlcnMsIG51bWJlcnMsIGRhc2hlcywgYW5kIHBlcmlvZHNcbnRva2Vucy5jbGFzc05hbWUgPSAnKD86W1xcXFx3LV18KD86XFxcXFxcXFwnICsgdG9rZW5zLm1ldGFDaGFyICsgJykpKyc7IC8vIGEgY2xhc3MgbmFtZSBoYXMgdGhlIHNhbWUgcnVsZXMgYXMgYSB2YXJpYWJsZSBleGNlcHQgaXQgY2FuJ3QgaGF2ZSBhICcuJyBpbiB0aGUgbmFtZVxudG9rZW5zLnZhbHVlID0gdG9rZW5zLnN0cmluZyArICd8JyArIHRva2Vucy5udW1iZXI7IC8vIGEgdmFsdWUgbGl0ZXJhbCwgZWl0aGVyIGEgc3RyaW5nIG9yIG51bWJlclxudG9rZW5zLmlkID0gdG9rZW5zLnZhcmlhYmxlOyAvLyBhbiBlbGVtZW50IGlkIChmb2xsb3dzIHZhcmlhYmxlIGNvbnZlbnRpb25zKVxuXG4oZnVuY3Rpb24gKCkge1xuICB2YXIgb3BzLCBvcCwgaTtcblxuICAvLyBhZGQgQCB2YXJpYW50cyB0byBjb21wYXJhdG9yT3BcbiAgb3BzID0gdG9rZW5zLmNvbXBhcmF0b3JPcC5zcGxpdCgnfCcpO1xuICBmb3IgKGkgPSAwOyBpIDwgb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgb3AgPSBvcHNbaV07XG4gICAgdG9rZW5zLmNvbXBhcmF0b3JPcCArPSAnfEAnICsgb3A7XG4gIH1cblxuICAvLyBhZGQgISB2YXJpYW50cyB0byBjb21wYXJhdG9yT3BcbiAgb3BzID0gdG9rZW5zLmNvbXBhcmF0b3JPcC5zcGxpdCgnfCcpO1xuICBmb3IgKGkgPSAwOyBpIDwgb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgb3AgPSBvcHNbaV07XG4gICAgaWYgKG9wLmluZGV4T2YoJyEnKSA+PSAwKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9IC8vIHNraXAgb3BzIHRoYXQgZXhwbGljaXRseSBjb250YWluICFcbiAgICBpZiAob3AgPT09ICc9Jykge1xuICAgICAgY29udGludWU7XG4gICAgfSAvLyBza2lwID0gYi9jICE9IGlzIGV4cGxpY2l0bHkgZGVmaW5lZFxuXG4gICAgdG9rZW5zLmNvbXBhcmF0b3JPcCArPSAnfFxcXFwhJyArIG9wO1xuICB9XG59KSgpO1xuXG4vKipcbiAqIE1ha2UgYSBuZXcgcXVlcnkgb2JqZWN0XG4gKlxuICogQHByb3AgdHlwZSB7VHlwZX0gVGhlIHR5cGUgZW51bSAoaW50KSBvZiB0aGUgcXVlcnlcbiAqIEBwcm9wIGNoZWNrcyBMaXN0IG9mIGNoZWNrcyB0byBtYWtlIGFnYWluc3QgYW4gZWxlIHRvIHRlc3QgZm9yIGEgbWF0Y2hcbiAqL1xudmFyIG5ld1F1ZXJ5ID0gZnVuY3Rpb24gbmV3UXVlcnkoKSB7XG4gIHJldHVybiB7XG4gICAgY2hlY2tzOiBbXVxuICB9O1xufTtcblxuLyoqXG4gKiBBIGNoZWNrIHR5cGUgZW51bS1saWtlIG9iamVjdC4gIFVzZXMgaW50ZWdlciB2YWx1ZXMgZm9yIGZhc3QgbWF0Y2goKSBsb29rdXAuXG4gKiBUaGUgb3JkZXJpbmcgZG9lcyBub3QgbWF0dGVyIGFzIGxvbmcgYXMgdGhlIGludHMgYXJlIHVuaXF1ZS5cbiAqL1xudmFyIFR5cGUgPSB7XG4gIC8qKiBFLmcuIG5vZGUgKi9cbiAgR1JPVVA6IDAsXG4gIC8qKiBBIGNvbGxlY3Rpb24gb2YgZWxlbWVudHMgKi9cbiAgQ09MTEVDVElPTjogMSxcbiAgLyoqIEEgZmlsdGVyKGVsZSkgZnVuY3Rpb24gKi9cbiAgRklMVEVSOiAyLFxuICAvKiogRS5nLiBbZm9vID4gMV0gKi9cbiAgREFUQV9DT01QQVJFOiAzLFxuICAvKiogRS5nLiBbZm9vXSAqL1xuICBEQVRBX0VYSVNUOiA0LFxuICAvKiogRS5nLiBbP2Zvb10gKi9cbiAgREFUQV9CT09MOiA1LFxuICAvKiogRS5nLiBbW2RlZ3JlZSA+IDJdXSAqL1xuICBNRVRBX0NPTVBBUkU6IDYsXG4gIC8qKiBFLmcuIDpzZWxlY3RlZCAqL1xuICBTVEFURTogNyxcbiAgLyoqIEUuZy4gI2ZvbyAqL1xuICBJRDogOCxcbiAgLyoqIEUuZy4gLmZvbyAqL1xuICBDTEFTUzogOSxcbiAgLyoqIEUuZy4gI2ZvbyA8LT4gI2JhciAqL1xuICBVTkRJUkVDVEVEX0VER0U6IDEwLFxuICAvKiogRS5nLiAjZm9vIC0+ICNiYXIgKi9cbiAgRElSRUNURURfRURHRTogMTEsXG4gIC8qKiBFLmcuICQjZm9vIC0+ICNiYXIgKi9cbiAgTk9ERV9TT1VSQ0U6IDEyLFxuICAvKiogRS5nLiAjZm9vIC0+ICQjYmFyICovXG4gIE5PREVfVEFSR0VUOiAxMyxcbiAgLyoqIEUuZy4gJCNmb28gPC0+ICNiYXIgKi9cbiAgTk9ERV9ORUlHSEJPUjogMTQsXG4gIC8qKiBFLmcuICNmb28gPiAjYmFyICovXG4gIENISUxEOiAxNSxcbiAgLyoqIEUuZy4gI2ZvbyAjYmFyICovXG4gIERFU0NFTkRBTlQ6IDE2LFxuICAvKiogRS5nLiAkI2ZvbyA+ICNiYXIgKi9cbiAgUEFSRU5UOiAxNyxcbiAgLyoqIEUuZy4gJCNmb28gI2JhciAqL1xuICBBTkNFU1RPUjogMTgsXG4gIC8qKiBFLmcuICNmb28gPiAkYmFyID4gI2JheiAqL1xuICBDT01QT1VORF9TUExJVDogMTksXG4gIC8qKiBBbHdheXMgbWF0Y2hlcywgdXNlZnVsIHBsYWNlaG9sZGVyIGZvciBzdWJqZWN0IGluIGBDT01QT1VORF9TUExJVGAgKi9cbiAgVFJVRTogMjBcbn07XG5cbnZhciBzdGF0ZVNlbGVjdG9ycyA9IFt7XG4gIHNlbGVjdG9yOiAnOnNlbGVjdGVkJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gZWxlLnNlbGVjdGVkKCk7XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6dW5zZWxlY3RlZCcsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuICFlbGUuc2VsZWN0ZWQoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzpzZWxlY3RhYmxlJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gZWxlLnNlbGVjdGFibGUoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzp1bnNlbGVjdGFibGUnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiAhZWxlLnNlbGVjdGFibGUoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzpsb2NrZWQnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiBlbGUubG9ja2VkKCk7XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6dW5sb2NrZWQnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiAhZWxlLmxvY2tlZCgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOnZpc2libGUnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiBlbGUudmlzaWJsZSgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOmhpZGRlbicsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuICFlbGUudmlzaWJsZSgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOnRyYW5zcGFyZW50JyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gZWxlLnRyYW5zcGFyZW50KCk7XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6Z3JhYmJlZCcsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5ncmFiYmVkKCk7XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6ZnJlZScsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuICFlbGUuZ3JhYmJlZCgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOnJlbW92ZWQnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiBlbGUucmVtb3ZlZCgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOmluc2lkZScsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuICFlbGUucmVtb3ZlZCgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOmdyYWJiYWJsZScsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5ncmFiYmFibGUoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzp1bmdyYWJiYWJsZScsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuICFlbGUuZ3JhYmJhYmxlKCk7XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6YW5pbWF0ZWQnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiBlbGUuYW5pbWF0ZWQoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzp1bmFuaW1hdGVkJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gIWVsZS5hbmltYXRlZCgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOnBhcmVudCcsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5pc1BhcmVudCgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOmNoaWxkbGVzcycsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5pc0NoaWxkbGVzcygpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOmNoaWxkJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gZWxlLmlzQ2hpbGQoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzpvcnBoYW4nLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiBlbGUuaXNPcnBoYW4oKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzpub25vcnBoYW4nLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiBlbGUuaXNDaGlsZCgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOmNvbXBvdW5kJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICBpZiAoZWxlLmlzTm9kZSgpKSB7XG4gICAgICByZXR1cm4gZWxlLmlzUGFyZW50KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBlbGUuc291cmNlKCkuaXNQYXJlbnQoKSB8fCBlbGUudGFyZ2V0KCkuaXNQYXJlbnQoKTtcbiAgICB9XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6bG9vcCcsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5pc0xvb3AoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzpzaW1wbGUnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiBlbGUuaXNTaW1wbGUoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzphY3RpdmUnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiBlbGUuYWN0aXZlKCk7XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6aW5hY3RpdmUnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiAhZWxlLmFjdGl2ZSgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOmJhY2tncm91bmRpbmcnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiBlbGUuYmFja2dyb3VuZGluZygpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOm5vbmJhY2tncm91bmRpbmcnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiAhZWxlLmJhY2tncm91bmRpbmcoKTtcbiAgfVxufV0uc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAvLyBuLmIuIHNlbGVjdG9ycyB0aGF0IGFyZSBzdGFydGluZyBzdWJzdHJpbmdzIG9mIG90aGVycyBtdXN0IGhhdmUgdGhlIGxvbmdlciBvbmVzIGZpcnN0XG4gIHJldHVybiBkZXNjZW5kaW5nKGEuc2VsZWN0b3IsIGIuc2VsZWN0b3IpO1xufSk7XG52YXIgbG9va3VwID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsVG9GbiA9IHt9O1xuICB2YXIgcztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGF0ZVNlbGVjdG9ycy5sZW5ndGg7IGkrKykge1xuICAgIHMgPSBzdGF0ZVNlbGVjdG9yc1tpXTtcbiAgICBzZWxUb0ZuW3Muc2VsZWN0b3JdID0gcy5tYXRjaGVzO1xuICB9XG4gIHJldHVybiBzZWxUb0ZuO1xufSgpO1xudmFyIHN0YXRlU2VsZWN0b3JNYXRjaGVzID0gZnVuY3Rpb24gc3RhdGVTZWxlY3Rvck1hdGNoZXMoc2VsLCBlbGUpIHtcbiAgcmV0dXJuIGxvb2t1cFtzZWxdKGVsZSk7XG59O1xudmFyIHN0YXRlU2VsZWN0b3JSZWdleCA9ICcoJyArIHN0YXRlU2VsZWN0b3JzLm1hcChmdW5jdGlvbiAocykge1xuICByZXR1cm4gcy5zZWxlY3Rvcjtcbn0pLmpvaW4oJ3wnKSArICcpJztcblxuLy8gd2hlbiBhIHRva2VuIGxpa2UgYSB2YXJpYWJsZSBoYXMgZXNjYXBlZCBtZXRhIGNoYXJhY3RlcnMsIHdlIG5lZWQgdG8gY2xlYW4gdGhlIGJhY2tzbGFzaGVzIG91dFxuLy8gc28gdGhhdCB2YWx1ZXMgZ2V0IGNvbXBhcmVkIHByb3Blcmx5IGluIFNlbGVjdG9yLmZpbHRlcigpXG52YXIgY2xlYW5NZXRhQ2hhcnMgPSBmdW5jdGlvbiBjbGVhbk1ldGFDaGFycyhzdHIpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKG5ldyBSZWdFeHAoJ1xcXFxcXFxcKCcgKyB0b2tlbnMubWV0YUNoYXIgKyAnKScsICdnJyksIGZ1bmN0aW9uIChtYXRjaCwgJDEpIHtcbiAgICByZXR1cm4gJDE7XG4gIH0pO1xufTtcbnZhciByZXBsYWNlTGFzdFF1ZXJ5ID0gZnVuY3Rpb24gcmVwbGFjZUxhc3RRdWVyeShzZWxlY3RvciwgZXhhbWluaW5nUXVlcnksIHJlcGxhY2VtZW50UXVlcnkpIHtcbiAgc2VsZWN0b3Jbc2VsZWN0b3IubGVuZ3RoIC0gMV0gPSByZXBsYWNlbWVudFF1ZXJ5O1xufTtcblxuLy8gTk9URTogYWRkIG5ldyBleHByZXNzaW9uIHN5bnRheCBoZXJlIHRvIGhhdmUgaXQgcmVjb2duaXNlZCBieSB0aGUgcGFyc2VyO1xuLy8gLSBhIHF1ZXJ5IGNvbnRhaW5zIGFsbCBhZGphY2VudCAoaS5lLiBubyBzZXBhcmF0b3IgaW4gYmV0d2VlbikgZXhwcmVzc2lvbnM7XG4vLyAtIHRoZSBjdXJyZW50IHF1ZXJ5IGlzIHN0b3JlZCBpbiBzZWxlY3RvcltpXVxuLy8gLSB5b3UgbmVlZCB0byBjaGVjayB0aGUgcXVlcnkgb2JqZWN0cyBpbiBtYXRjaCgpIGZvciBpdCBhY3R1YWxseSBmaWx0ZXIgcHJvcGVybHksIGJ1dCB0aGF0J3MgcHJldHR5IHN0cmFpZ2h0IGZvcndhcmRcbnZhciBleHBycyA9IFt7XG4gIG5hbWU6ICdncm91cCcsXG4gIC8vIGp1c3QgdXNlZCBmb3IgaWRlbnRpZnlpbmcgd2hlbiBkZWJ1Z2dpbmdcbiAgcXVlcnk6IHRydWUsXG4gIHJlZ2V4OiAnKCcgKyB0b2tlbnMuZ3JvdXAgKyAnKScsXG4gIHBvcHVsYXRlOiBmdW5jdGlvbiBwb3B1bGF0ZShzZWxlY3RvciwgcXVlcnksIF9yZWYpIHtcbiAgICB2YXIgX3JlZjIgPSBfc2xpY2VkVG9BcnJheShfcmVmLCAxKSxcbiAgICAgIGdyb3VwID0gX3JlZjJbMF07XG4gICAgcXVlcnkuY2hlY2tzLnB1c2goe1xuICAgICAgdHlwZTogVHlwZS5HUk9VUCxcbiAgICAgIHZhbHVlOiBncm91cCA9PT0gJyonID8gZ3JvdXAgOiBncm91cCArICdzJ1xuICAgIH0pO1xuICB9XG59LCB7XG4gIG5hbWU6ICdzdGF0ZScsXG4gIHF1ZXJ5OiB0cnVlLFxuICByZWdleDogc3RhdGVTZWxlY3RvclJlZ2V4LFxuICBwb3B1bGF0ZTogZnVuY3Rpb24gcG9wdWxhdGUoc2VsZWN0b3IsIHF1ZXJ5LCBfcmVmMykge1xuICAgIHZhciBfcmVmNCA9IF9zbGljZWRUb0FycmF5KF9yZWYzLCAxKSxcbiAgICAgIHN0YXRlID0gX3JlZjRbMF07XG4gICAgcXVlcnkuY2hlY2tzLnB1c2goe1xuICAgICAgdHlwZTogVHlwZS5TVEFURSxcbiAgICAgIHZhbHVlOiBzdGF0ZVxuICAgIH0pO1xuICB9XG59LCB7XG4gIG5hbWU6ICdpZCcsXG4gIHF1ZXJ5OiB0cnVlLFxuICByZWdleDogJ1xcXFwjKCcgKyB0b2tlbnMuaWQgKyAnKScsXG4gIHBvcHVsYXRlOiBmdW5jdGlvbiBwb3B1bGF0ZShzZWxlY3RvciwgcXVlcnksIF9yZWY1KSB7XG4gICAgdmFyIF9yZWY2ID0gX3NsaWNlZFRvQXJyYXkoX3JlZjUsIDEpLFxuICAgICAgaWQgPSBfcmVmNlswXTtcbiAgICBxdWVyeS5jaGVja3MucHVzaCh7XG4gICAgICB0eXBlOiBUeXBlLklELFxuICAgICAgdmFsdWU6IGNsZWFuTWV0YUNoYXJzKGlkKVxuICAgIH0pO1xuICB9XG59LCB7XG4gIG5hbWU6ICdjbGFzc05hbWUnLFxuICBxdWVyeTogdHJ1ZSxcbiAgcmVnZXg6ICdcXFxcLignICsgdG9rZW5zLmNsYXNzTmFtZSArICcpJyxcbiAgcG9wdWxhdGU6IGZ1bmN0aW9uIHBvcHVsYXRlKHNlbGVjdG9yLCBxdWVyeSwgX3JlZjcpIHtcbiAgICB2YXIgX3JlZjggPSBfc2xpY2VkVG9BcnJheShfcmVmNywgMSksXG4gICAgICBjbGFzc05hbWUgPSBfcmVmOFswXTtcbiAgICBxdWVyeS5jaGVja3MucHVzaCh7XG4gICAgICB0eXBlOiBUeXBlLkNMQVNTLFxuICAgICAgdmFsdWU6IGNsZWFuTWV0YUNoYXJzKGNsYXNzTmFtZSlcbiAgICB9KTtcbiAgfVxufSwge1xuICBuYW1lOiAnZGF0YUV4aXN0cycsXG4gIHF1ZXJ5OiB0cnVlLFxuICByZWdleDogJ1xcXFxbXFxcXHMqKCcgKyB0b2tlbnMudmFyaWFibGUgKyAnKVxcXFxzKlxcXFxdJyxcbiAgcG9wdWxhdGU6IGZ1bmN0aW9uIHBvcHVsYXRlKHNlbGVjdG9yLCBxdWVyeSwgX3JlZjkpIHtcbiAgICB2YXIgX3JlZjAgPSBfc2xpY2VkVG9BcnJheShfcmVmOSwgMSksXG4gICAgICB2YXJpYWJsZSA9IF9yZWYwWzBdO1xuICAgIHF1ZXJ5LmNoZWNrcy5wdXNoKHtcbiAgICAgIHR5cGU6IFR5cGUuREFUQV9FWElTVCxcbiAgICAgIGZpZWxkOiBjbGVhbk1ldGFDaGFycyh2YXJpYWJsZSlcbiAgICB9KTtcbiAgfVxufSwge1xuICBuYW1lOiAnZGF0YUNvbXBhcmUnLFxuICBxdWVyeTogdHJ1ZSxcbiAgcmVnZXg6ICdcXFxcW1xcXFxzKignICsgdG9rZW5zLnZhcmlhYmxlICsgJylcXFxccyooJyArIHRva2Vucy5jb21wYXJhdG9yT3AgKyAnKVxcXFxzKignICsgdG9rZW5zLnZhbHVlICsgJylcXFxccypcXFxcXScsXG4gIHBvcHVsYXRlOiBmdW5jdGlvbiBwb3B1bGF0ZShzZWxlY3RvciwgcXVlcnksIF9yZWYxKSB7XG4gICAgdmFyIF9yZWYxMCA9IF9zbGljZWRUb0FycmF5KF9yZWYxLCAzKSxcbiAgICAgIHZhcmlhYmxlID0gX3JlZjEwWzBdLFxuICAgICAgY29tcGFyYXRvck9wID0gX3JlZjEwWzFdLFxuICAgICAgdmFsdWUgPSBfcmVmMTBbMl07XG4gICAgdmFyIHZhbHVlSXNTdHJpbmcgPSBuZXcgUmVnRXhwKCdeJyArIHRva2Vucy5zdHJpbmcgKyAnJCcpLmV4ZWModmFsdWUpICE9IG51bGw7XG4gICAgaWYgKHZhbHVlSXNTdHJpbmcpIHtcbiAgICAgIHZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDEsIHZhbHVlLmxlbmd0aCAtIDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSA9IHBhcnNlRmxvYXQodmFsdWUpO1xuICAgIH1cbiAgICBxdWVyeS5jaGVja3MucHVzaCh7XG4gICAgICB0eXBlOiBUeXBlLkRBVEFfQ09NUEFSRSxcbiAgICAgIGZpZWxkOiBjbGVhbk1ldGFDaGFycyh2YXJpYWJsZSksXG4gICAgICBvcGVyYXRvcjogY29tcGFyYXRvck9wLFxuICAgICAgdmFsdWU6IHZhbHVlXG4gICAgfSk7XG4gIH1cbn0sIHtcbiAgbmFtZTogJ2RhdGFCb29sJyxcbiAgcXVlcnk6IHRydWUsXG4gIHJlZ2V4OiAnXFxcXFtcXFxccyooJyArIHRva2Vucy5ib29sT3AgKyAnKVxcXFxzKignICsgdG9rZW5zLnZhcmlhYmxlICsgJylcXFxccypcXFxcXScsXG4gIHBvcHVsYXRlOiBmdW5jdGlvbiBwb3B1bGF0ZShzZWxlY3RvciwgcXVlcnksIF9yZWYxMSkge1xuICAgIHZhciBfcmVmMTIgPSBfc2xpY2VkVG9BcnJheShfcmVmMTEsIDIpLFxuICAgICAgYm9vbE9wID0gX3JlZjEyWzBdLFxuICAgICAgdmFyaWFibGUgPSBfcmVmMTJbMV07XG4gICAgcXVlcnkuY2hlY2tzLnB1c2goe1xuICAgICAgdHlwZTogVHlwZS5EQVRBX0JPT0wsXG4gICAgICBmaWVsZDogY2xlYW5NZXRhQ2hhcnModmFyaWFibGUpLFxuICAgICAgb3BlcmF0b3I6IGJvb2xPcFxuICAgIH0pO1xuICB9XG59LCB7XG4gIG5hbWU6ICdtZXRhQ29tcGFyZScsXG4gIHF1ZXJ5OiB0cnVlLFxuICByZWdleDogJ1xcXFxbXFxcXFtcXFxccyooJyArIHRva2Vucy5tZXRhICsgJylcXFxccyooJyArIHRva2Vucy5jb21wYXJhdG9yT3AgKyAnKVxcXFxzKignICsgdG9rZW5zLm51bWJlciArICcpXFxcXHMqXFxcXF1cXFxcXScsXG4gIHBvcHVsYXRlOiBmdW5jdGlvbiBwb3B1bGF0ZShzZWxlY3RvciwgcXVlcnksIF9yZWYxMykge1xuICAgIHZhciBfcmVmMTQgPSBfc2xpY2VkVG9BcnJheShfcmVmMTMsIDMpLFxuICAgICAgbWV0YSA9IF9yZWYxNFswXSxcbiAgICAgIGNvbXBhcmF0b3JPcCA9IF9yZWYxNFsxXSxcbiAgICAgIG51bWJlciA9IF9yZWYxNFsyXTtcbiAgICBxdWVyeS5jaGVja3MucHVzaCh7XG4gICAgICB0eXBlOiBUeXBlLk1FVEFfQ09NUEFSRSxcbiAgICAgIGZpZWxkOiBjbGVhbk1ldGFDaGFycyhtZXRhKSxcbiAgICAgIG9wZXJhdG9yOiBjb21wYXJhdG9yT3AsXG4gICAgICB2YWx1ZTogcGFyc2VGbG9hdChudW1iZXIpXG4gICAgfSk7XG4gIH1cbn0sIHtcbiAgbmFtZTogJ25leHRRdWVyeScsXG4gIHNlcGFyYXRvcjogdHJ1ZSxcbiAgcmVnZXg6IHRva2Vucy5zZXBhcmF0b3IsXG4gIHBvcHVsYXRlOiBmdW5jdGlvbiBwb3B1bGF0ZShzZWxlY3RvciwgcXVlcnkpIHtcbiAgICB2YXIgY3VycmVudFN1YmplY3QgPSBzZWxlY3Rvci5jdXJyZW50U3ViamVjdDtcbiAgICB2YXIgZWRnZUNvdW50ID0gc2VsZWN0b3IuZWRnZUNvdW50O1xuICAgIHZhciBjb21wb3VuZENvdW50ID0gc2VsZWN0b3IuY29tcG91bmRDb3VudDtcbiAgICB2YXIgbGFzdFEgPSBzZWxlY3RvcltzZWxlY3Rvci5sZW5ndGggLSAxXTtcbiAgICBpZiAoY3VycmVudFN1YmplY3QgIT0gbnVsbCkge1xuICAgICAgbGFzdFEuc3ViamVjdCA9IGN1cnJlbnRTdWJqZWN0O1xuICAgICAgc2VsZWN0b3IuY3VycmVudFN1YmplY3QgPSBudWxsO1xuICAgIH1cbiAgICBsYXN0US5lZGdlQ291bnQgPSBlZGdlQ291bnQ7XG4gICAgbGFzdFEuY29tcG91bmRDb3VudCA9IGNvbXBvdW5kQ291bnQ7XG4gICAgc2VsZWN0b3IuZWRnZUNvdW50ID0gMDtcbiAgICBzZWxlY3Rvci5jb21wb3VuZENvdW50ID0gMDtcblxuICAgIC8vIGdvIG9uIHRvIG5leHQgcXVlcnlcbiAgICB2YXIgbmV4dFF1ZXJ5ID0gc2VsZWN0b3Jbc2VsZWN0b3IubGVuZ3RoKytdID0gbmV3UXVlcnkoKTtcbiAgICByZXR1cm4gbmV4dFF1ZXJ5OyAvLyB0aGlzIGlzIHRoZSBuZXcgcXVlcnkgdG8gYmUgZmlsbGVkIGJ5IHRoZSBmb2xsb3dpbmcgZXhwcnNcbiAgfVxufSwge1xuICBuYW1lOiAnZGlyZWN0ZWRFZGdlJyxcbiAgc2VwYXJhdG9yOiB0cnVlLFxuICByZWdleDogdG9rZW5zLmRpcmVjdGVkRWRnZSxcbiAgcG9wdWxhdGU6IGZ1bmN0aW9uIHBvcHVsYXRlKHNlbGVjdG9yLCBxdWVyeSkge1xuICAgIGlmIChzZWxlY3Rvci5jdXJyZW50U3ViamVjdCA9PSBudWxsKSB7XG4gICAgICAvLyB1bmRpcmVjdGVkIGVkZ2VcbiAgICAgIHZhciBlZGdlUXVlcnkgPSBuZXdRdWVyeSgpO1xuICAgICAgdmFyIHNvdXJjZSA9IHF1ZXJ5O1xuICAgICAgdmFyIHRhcmdldCA9IG5ld1F1ZXJ5KCk7XG4gICAgICBlZGdlUXVlcnkuY2hlY2tzLnB1c2goe1xuICAgICAgICB0eXBlOiBUeXBlLkRJUkVDVEVEX0VER0UsXG4gICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICB0YXJnZXQ6IHRhcmdldFxuICAgICAgfSk7XG5cbiAgICAgIC8vIHRoZSBxdWVyeSBpbiB0aGUgc2VsZWN0b3Igc2hvdWxkIGJlIHRoZSBlZGdlIHJhdGhlciB0aGFuIHRoZSBzb3VyY2VcbiAgICAgIHJlcGxhY2VMYXN0UXVlcnkoc2VsZWN0b3IsIHF1ZXJ5LCBlZGdlUXVlcnkpO1xuICAgICAgc2VsZWN0b3IuZWRnZUNvdW50Kys7XG5cbiAgICAgIC8vIHdlJ3JlIG5vdyBwb3B1bGF0aW5nIHRoZSB0YXJnZXQgcXVlcnkgd2l0aCBleHByZXNzaW9ucyB0aGF0IGZvbGxvd1xuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gc291cmNlL3RhcmdldFxuICAgICAgdmFyIHNyY1RndFEgPSBuZXdRdWVyeSgpO1xuICAgICAgdmFyIF9zb3VyY2UgPSBxdWVyeTtcbiAgICAgIHZhciBfdGFyZ2V0ID0gbmV3UXVlcnkoKTtcbiAgICAgIHNyY1RndFEuY2hlY2tzLnB1c2goe1xuICAgICAgICB0eXBlOiBUeXBlLk5PREVfU09VUkNFLFxuICAgICAgICBzb3VyY2U6IF9zb3VyY2UsXG4gICAgICAgIHRhcmdldDogX3RhcmdldFxuICAgICAgfSk7XG5cbiAgICAgIC8vIHRoZSBxdWVyeSBpbiB0aGUgc2VsZWN0b3Igc2hvdWxkIGJlIHRoZSBuZWlnaGJvdXJob29kIHJhdGhlciB0aGFuIHRoZSBub2RlXG4gICAgICByZXBsYWNlTGFzdFF1ZXJ5KHNlbGVjdG9yLCBxdWVyeSwgc3JjVGd0USk7XG4gICAgICBzZWxlY3Rvci5lZGdlQ291bnQrKztcbiAgICAgIHJldHVybiBfdGFyZ2V0OyAvLyBub3cgcG9wdWxhdGluZyB0aGUgdGFyZ2V0IHdpdGggdGhlIGZvbGxvd2luZyBleHByZXNzaW9uc1xuICAgIH1cbiAgfVxufSwge1xuICBuYW1lOiAndW5kaXJlY3RlZEVkZ2UnLFxuICBzZXBhcmF0b3I6IHRydWUsXG4gIHJlZ2V4OiB0b2tlbnMudW5kaXJlY3RlZEVkZ2UsXG4gIHBvcHVsYXRlOiBmdW5jdGlvbiBwb3B1bGF0ZShzZWxlY3RvciwgcXVlcnkpIHtcbiAgICBpZiAoc2VsZWN0b3IuY3VycmVudFN1YmplY3QgPT0gbnVsbCkge1xuICAgICAgLy8gdW5kaXJlY3RlZCBlZGdlXG4gICAgICB2YXIgZWRnZVF1ZXJ5ID0gbmV3UXVlcnkoKTtcbiAgICAgIHZhciBzb3VyY2UgPSBxdWVyeTtcbiAgICAgIHZhciB0YXJnZXQgPSBuZXdRdWVyeSgpO1xuICAgICAgZWRnZVF1ZXJ5LmNoZWNrcy5wdXNoKHtcbiAgICAgICAgdHlwZTogVHlwZS5VTkRJUkVDVEVEX0VER0UsXG4gICAgICAgIG5vZGVzOiBbc291cmNlLCB0YXJnZXRdXG4gICAgICB9KTtcblxuICAgICAgLy8gdGhlIHF1ZXJ5IGluIHRoZSBzZWxlY3RvciBzaG91bGQgYmUgdGhlIGVkZ2UgcmF0aGVyIHRoYW4gdGhlIHNvdXJjZVxuICAgICAgcmVwbGFjZUxhc3RRdWVyeShzZWxlY3RvciwgcXVlcnksIGVkZ2VRdWVyeSk7XG4gICAgICBzZWxlY3Rvci5lZGdlQ291bnQrKztcblxuICAgICAgLy8gd2UncmUgbm93IHBvcHVsYXRpbmcgdGhlIHRhcmdldCBxdWVyeSB3aXRoIGV4cHJlc3Npb25zIHRoYXQgZm9sbG93XG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBuZWlnaGJvdXJob29kXG4gICAgICB2YXIgbmhvb2RRID0gbmV3UXVlcnkoKTtcbiAgICAgIHZhciBub2RlID0gcXVlcnk7XG4gICAgICB2YXIgbmVpZ2hib3IgPSBuZXdRdWVyeSgpO1xuICAgICAgbmhvb2RRLmNoZWNrcy5wdXNoKHtcbiAgICAgICAgdHlwZTogVHlwZS5OT0RFX05FSUdIQk9SLFxuICAgICAgICBub2RlOiBub2RlLFxuICAgICAgICBuZWlnaGJvcjogbmVpZ2hib3JcbiAgICAgIH0pO1xuXG4gICAgICAvLyB0aGUgcXVlcnkgaW4gdGhlIHNlbGVjdG9yIHNob3VsZCBiZSB0aGUgbmVpZ2hib3VyaG9vZCByYXRoZXIgdGhhbiB0aGUgbm9kZVxuICAgICAgcmVwbGFjZUxhc3RRdWVyeShzZWxlY3RvciwgcXVlcnksIG5ob29kUSk7XG4gICAgICByZXR1cm4gbmVpZ2hib3I7IC8vIG5vdyBwb3B1bGF0aW5nIHRoZSBuZWlnaGJvciB3aXRoIGZvbGxvd2luZyBleHByZXNzaW9uc1xuICAgIH1cbiAgfVxufSwge1xuICBuYW1lOiAnY2hpbGQnLFxuICBzZXBhcmF0b3I6IHRydWUsXG4gIHJlZ2V4OiB0b2tlbnMuY2hpbGQsXG4gIHBvcHVsYXRlOiBmdW5jdGlvbiBwb3B1bGF0ZShzZWxlY3RvciwgcXVlcnkpIHtcbiAgICBpZiAoc2VsZWN0b3IuY3VycmVudFN1YmplY3QgPT0gbnVsbCkge1xuICAgICAgLy8gZGVmYXVsdDogY2hpbGQgcXVlcnlcbiAgICAgIHZhciBwYXJlbnRDaGlsZFF1ZXJ5ID0gbmV3UXVlcnkoKTtcbiAgICAgIHZhciBjaGlsZCA9IG5ld1F1ZXJ5KCk7XG4gICAgICB2YXIgcGFyZW50ID0gc2VsZWN0b3Jbc2VsZWN0b3IubGVuZ3RoIC0gMV07XG4gICAgICBwYXJlbnRDaGlsZFF1ZXJ5LmNoZWNrcy5wdXNoKHtcbiAgICAgICAgdHlwZTogVHlwZS5DSElMRCxcbiAgICAgICAgcGFyZW50OiBwYXJlbnQsXG4gICAgICAgIGNoaWxkOiBjaGlsZFxuICAgICAgfSk7XG5cbiAgICAgIC8vIHRoZSBxdWVyeSBpbiB0aGUgc2VsZWN0b3Igc2hvdWxkIGJlIHRoZSAnPicgaXRzZWxmXG4gICAgICByZXBsYWNlTGFzdFF1ZXJ5KHNlbGVjdG9yLCBxdWVyeSwgcGFyZW50Q2hpbGRRdWVyeSk7XG4gICAgICBzZWxlY3Rvci5jb21wb3VuZENvdW50Kys7XG5cbiAgICAgIC8vIHdlJ3JlIG5vdyBwb3B1bGF0aW5nIHRoZSBjaGlsZCBxdWVyeSB3aXRoIGV4cHJlc3Npb25zIHRoYXQgZm9sbG93XG4gICAgICByZXR1cm4gY2hpbGQ7XG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5jdXJyZW50U3ViamVjdCA9PT0gcXVlcnkpIHtcbiAgICAgIC8vIGNvbXBvdW5kIHNwbGl0IHF1ZXJ5XG4gICAgICB2YXIgY29tcG91bmQgPSBuZXdRdWVyeSgpO1xuICAgICAgdmFyIGxlZnQgPSBzZWxlY3RvcltzZWxlY3Rvci5sZW5ndGggLSAxXTtcbiAgICAgIHZhciByaWdodCA9IG5ld1F1ZXJ5KCk7XG4gICAgICB2YXIgc3ViamVjdCA9IG5ld1F1ZXJ5KCk7XG4gICAgICB2YXIgX2NoaWxkID0gbmV3UXVlcnkoKTtcbiAgICAgIHZhciBfcGFyZW50ID0gbmV3UXVlcnkoKTtcblxuICAgICAgLy8gc2V0IHVwIHRoZSByb290IGNvbXBvdW5kIHFcbiAgICAgIGNvbXBvdW5kLmNoZWNrcy5wdXNoKHtcbiAgICAgICAgdHlwZTogVHlwZS5DT01QT1VORF9TUExJVCxcbiAgICAgICAgbGVmdDogbGVmdCxcbiAgICAgICAgcmlnaHQ6IHJpZ2h0LFxuICAgICAgICBzdWJqZWN0OiBzdWJqZWN0XG4gICAgICB9KTtcblxuICAgICAgLy8gcG9wdWxhdGUgdGhlIHN1YmplY3QgYW5kIHJlcGxhY2UgdGhlIHEgYXQgdGhlIG9sZCBzcG90ICh3aXRoaW4gbGVmdCkgd2l0aCBUUlVFXG4gICAgICBzdWJqZWN0LmNoZWNrcyA9IHF1ZXJ5LmNoZWNrczsgLy8gdGFrZSB0aGUgY2hlY2tzIGZyb20gdGhlIGxlZnRcbiAgICAgIHF1ZXJ5LmNoZWNrcyA9IFt7XG4gICAgICAgIHR5cGU6IFR5cGUuVFJVRVxuICAgICAgfV07IC8vIGNoZWNrcyB1bmRlciBsZWZ0IHJlZnMgdGhlIHN1YmplY3QgaW1wbGljaXRseVxuXG4gICAgICAvLyBzZXQgdXAgdGhlIHJpZ2h0IHFcbiAgICAgIF9wYXJlbnQuY2hlY2tzLnB1c2goe1xuICAgICAgICB0eXBlOiBUeXBlLlRSVUVcbiAgICAgIH0pOyAvLyBwYXJlbnQgaW1wbGljaXRseSByZWZzIHRoZSBzdWJqZWN0XG4gICAgICByaWdodC5jaGVja3MucHVzaCh7XG4gICAgICAgIHR5cGU6IFR5cGUuUEFSRU5ULFxuICAgICAgICAvLyB0eXBlIGlzIHN3YXBwZWQgb24gcmlnaHQgc2lkZSBxdWVyaWVzXG4gICAgICAgIHBhcmVudDogX3BhcmVudCxcbiAgICAgICAgY2hpbGQ6IF9jaGlsZCAvLyBlbXB0eSBmb3Igbm93XG4gICAgICB9KTtcbiAgICAgIHJlcGxhY2VMYXN0UXVlcnkoc2VsZWN0b3IsIGxlZnQsIGNvbXBvdW5kKTtcblxuICAgICAgLy8gdXBkYXRlIHRoZSByZWYgc2luY2Ugd2UgbW92ZWQgdGhpbmdzIGFyb3VuZCBmb3IgYHF1ZXJ5YFxuICAgICAgc2VsZWN0b3IuY3VycmVudFN1YmplY3QgPSBzdWJqZWN0O1xuICAgICAgc2VsZWN0b3IuY29tcG91bmRDb3VudCsrO1xuICAgICAgcmV0dXJuIF9jaGlsZDsgLy8gbm93IHBvcHVsYXRpbmcgdGhlIHJpZ2h0IHNpZGUncyBjaGlsZFxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBwYXJlbnQgcXVlcnlcbiAgICAgIC8vIGluZm8gZm9yIHBhcmVudCBxdWVyeVxuICAgICAgdmFyIF9wYXJlbnQyID0gbmV3UXVlcnkoKTtcbiAgICAgIHZhciBfY2hpbGQyID0gbmV3UXVlcnkoKTtcbiAgICAgIHZhciBwY1FDaGVja3MgPSBbe1xuICAgICAgICB0eXBlOiBUeXBlLlBBUkVOVCxcbiAgICAgICAgcGFyZW50OiBfcGFyZW50MixcbiAgICAgICAgY2hpbGQ6IF9jaGlsZDJcbiAgICAgIH1dO1xuXG4gICAgICAvLyB0aGUgcGFyZW50LWNoaWxkIHF1ZXJ5IHRha2VzIHRoZSBwbGFjZSBvZiB0aGUgcXVlcnkgcHJldmlvdXNseSBiZWluZyBwb3B1bGF0ZWRcbiAgICAgIF9wYXJlbnQyLmNoZWNrcyA9IHF1ZXJ5LmNoZWNrczsgLy8gdGhlIHByZXZpb3VzIHF1ZXJ5IGNvbnRhaW5zIHRoZSBjaGVja3MgZm9yIHRoZSBwYXJlbnRcbiAgICAgIHF1ZXJ5LmNoZWNrcyA9IHBjUUNoZWNrczsgLy8gcGMgcXVlcnkgdGFrZXMgb3ZlclxuXG4gICAgICBzZWxlY3Rvci5jb21wb3VuZENvdW50Kys7XG4gICAgICByZXR1cm4gX2NoaWxkMjsgLy8gd2UncmUgbm93IHBvcHVsYXRpbmcgdGhlIGNoaWxkXG4gICAgfVxuICB9XG59LCB7XG4gIG5hbWU6ICdkZXNjZW5kYW50JyxcbiAgc2VwYXJhdG9yOiB0cnVlLFxuICByZWdleDogdG9rZW5zLmRlc2NlbmRhbnQsXG4gIHBvcHVsYXRlOiBmdW5jdGlvbiBwb3B1bGF0ZShzZWxlY3RvciwgcXVlcnkpIHtcbiAgICBpZiAoc2VsZWN0b3IuY3VycmVudFN1YmplY3QgPT0gbnVsbCkge1xuICAgICAgLy8gZGVmYXVsdDogZGVzY2VuZGFudCBxdWVyeVxuICAgICAgdmFyIGFuY0NoUXVlcnkgPSBuZXdRdWVyeSgpO1xuICAgICAgdmFyIGRlc2NlbmRhbnQgPSBuZXdRdWVyeSgpO1xuICAgICAgdmFyIGFuY2VzdG9yID0gc2VsZWN0b3Jbc2VsZWN0b3IubGVuZ3RoIC0gMV07XG4gICAgICBhbmNDaFF1ZXJ5LmNoZWNrcy5wdXNoKHtcbiAgICAgICAgdHlwZTogVHlwZS5ERVNDRU5EQU5ULFxuICAgICAgICBhbmNlc3RvcjogYW5jZXN0b3IsXG4gICAgICAgIGRlc2NlbmRhbnQ6IGRlc2NlbmRhbnRcbiAgICAgIH0pO1xuXG4gICAgICAvLyB0aGUgcXVlcnkgaW4gdGhlIHNlbGVjdG9yIHNob3VsZCBiZSB0aGUgJz4nIGl0c2VsZlxuICAgICAgcmVwbGFjZUxhc3RRdWVyeShzZWxlY3RvciwgcXVlcnksIGFuY0NoUXVlcnkpO1xuICAgICAgc2VsZWN0b3IuY29tcG91bmRDb3VudCsrO1xuXG4gICAgICAvLyB3ZSdyZSBub3cgcG9wdWxhdGluZyB0aGUgZGVzY2VuZGFudCBxdWVyeSB3aXRoIGV4cHJlc3Npb25zIHRoYXQgZm9sbG93XG4gICAgICByZXR1cm4gZGVzY2VuZGFudDtcbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmN1cnJlbnRTdWJqZWN0ID09PSBxdWVyeSkge1xuICAgICAgLy8gY29tcG91bmQgc3BsaXQgcXVlcnlcbiAgICAgIHZhciBjb21wb3VuZCA9IG5ld1F1ZXJ5KCk7XG4gICAgICB2YXIgbGVmdCA9IHNlbGVjdG9yW3NlbGVjdG9yLmxlbmd0aCAtIDFdO1xuICAgICAgdmFyIHJpZ2h0ID0gbmV3UXVlcnkoKTtcbiAgICAgIHZhciBzdWJqZWN0ID0gbmV3UXVlcnkoKTtcbiAgICAgIHZhciBfZGVzY2VuZGFudCA9IG5ld1F1ZXJ5KCk7XG4gICAgICB2YXIgX2FuY2VzdG9yID0gbmV3UXVlcnkoKTtcblxuICAgICAgLy8gc2V0IHVwIHRoZSByb290IGNvbXBvdW5kIHFcbiAgICAgIGNvbXBvdW5kLmNoZWNrcy5wdXNoKHtcbiAgICAgICAgdHlwZTogVHlwZS5DT01QT1VORF9TUExJVCxcbiAgICAgICAgbGVmdDogbGVmdCxcbiAgICAgICAgcmlnaHQ6IHJpZ2h0LFxuICAgICAgICBzdWJqZWN0OiBzdWJqZWN0XG4gICAgICB9KTtcblxuICAgICAgLy8gcG9wdWxhdGUgdGhlIHN1YmplY3QgYW5kIHJlcGxhY2UgdGhlIHEgYXQgdGhlIG9sZCBzcG90ICh3aXRoaW4gbGVmdCkgd2l0aCBUUlVFXG4gICAgICBzdWJqZWN0LmNoZWNrcyA9IHF1ZXJ5LmNoZWNrczsgLy8gdGFrZSB0aGUgY2hlY2tzIGZyb20gdGhlIGxlZnRcbiAgICAgIHF1ZXJ5LmNoZWNrcyA9IFt7XG4gICAgICAgIHR5cGU6IFR5cGUuVFJVRVxuICAgICAgfV07IC8vIGNoZWNrcyB1bmRlciBsZWZ0IHJlZnMgdGhlIHN1YmplY3QgaW1wbGljaXRseVxuXG4gICAgICAvLyBzZXQgdXAgdGhlIHJpZ2h0IHFcbiAgICAgIF9hbmNlc3Rvci5jaGVja3MucHVzaCh7XG4gICAgICAgIHR5cGU6IFR5cGUuVFJVRVxuICAgICAgfSk7IC8vIGFuY2VzdG9yIGltcGxpY2l0bHkgcmVmcyB0aGUgc3ViamVjdFxuICAgICAgcmlnaHQuY2hlY2tzLnB1c2goe1xuICAgICAgICB0eXBlOiBUeXBlLkFOQ0VTVE9SLFxuICAgICAgICAvLyB0eXBlIGlzIHN3YXBwZWQgb24gcmlnaHQgc2lkZSBxdWVyaWVzXG4gICAgICAgIGFuY2VzdG9yOiBfYW5jZXN0b3IsXG4gICAgICAgIGRlc2NlbmRhbnQ6IF9kZXNjZW5kYW50IC8vIGVtcHR5IGZvciBub3dcbiAgICAgIH0pO1xuICAgICAgcmVwbGFjZUxhc3RRdWVyeShzZWxlY3RvciwgbGVmdCwgY29tcG91bmQpO1xuXG4gICAgICAvLyB1cGRhdGUgdGhlIHJlZiBzaW5jZSB3ZSBtb3ZlZCB0aGluZ3MgYXJvdW5kIGZvciBgcXVlcnlgXG4gICAgICBzZWxlY3Rvci5jdXJyZW50U3ViamVjdCA9IHN1YmplY3Q7XG4gICAgICBzZWxlY3Rvci5jb21wb3VuZENvdW50Kys7XG4gICAgICByZXR1cm4gX2Rlc2NlbmRhbnQ7IC8vIG5vdyBwb3B1bGF0aW5nIHRoZSByaWdodCBzaWRlJ3MgZGVzY2VuZGFudFxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBhbmNlc3RvciBxdWVyeVxuICAgICAgLy8gaW5mbyBmb3IgcGFyZW50IHF1ZXJ5XG4gICAgICB2YXIgX2FuY2VzdG9yMiA9IG5ld1F1ZXJ5KCk7XG4gICAgICB2YXIgX2Rlc2NlbmRhbnQyID0gbmV3UXVlcnkoKTtcbiAgICAgIHZhciBhZFFDaGVja3MgPSBbe1xuICAgICAgICB0eXBlOiBUeXBlLkFOQ0VTVE9SLFxuICAgICAgICBhbmNlc3RvcjogX2FuY2VzdG9yMixcbiAgICAgICAgZGVzY2VuZGFudDogX2Rlc2NlbmRhbnQyXG4gICAgICB9XTtcblxuICAgICAgLy8gdGhlIHBhcmVudC1jaGlsZCBxdWVyeSB0YWtlcyB0aGUgcGxhY2Ugb2YgdGhlIHF1ZXJ5IHByZXZpb3VzbHkgYmVpbmcgcG9wdWxhdGVkXG4gICAgICBfYW5jZXN0b3IyLmNoZWNrcyA9IHF1ZXJ5LmNoZWNrczsgLy8gdGhlIHByZXZpb3VzIHF1ZXJ5IGNvbnRhaW5zIHRoZSBjaGVja3MgZm9yIHRoZSBwYXJlbnRcbiAgICAgIHF1ZXJ5LmNoZWNrcyA9IGFkUUNoZWNrczsgLy8gcGMgcXVlcnkgdGFrZXMgb3ZlclxuXG4gICAgICBzZWxlY3Rvci5jb21wb3VuZENvdW50Kys7XG4gICAgICByZXR1cm4gX2Rlc2NlbmRhbnQyOyAvLyB3ZSdyZSBub3cgcG9wdWxhdGluZyB0aGUgY2hpbGRcbiAgICB9XG4gIH1cbn0sIHtcbiAgbmFtZTogJ3N1YmplY3QnLFxuICBtb2RpZmllcjogdHJ1ZSxcbiAgcmVnZXg6IHRva2Vucy5zdWJqZWN0LFxuICBwb3B1bGF0ZTogZnVuY3Rpb24gcG9wdWxhdGUoc2VsZWN0b3IsIHF1ZXJ5KSB7XG4gICAgaWYgKHNlbGVjdG9yLmN1cnJlbnRTdWJqZWN0ICE9IG51bGwgJiYgc2VsZWN0b3IuY3VycmVudFN1YmplY3QgIT09IHF1ZXJ5KSB7XG4gICAgICB3YXJuKCdSZWRlZmluaXRpb24gb2Ygc3ViamVjdCBpbiBzZWxlY3RvciBgJyArIHNlbGVjdG9yLnRvU3RyaW5nKCkgKyAnYCcpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBzZWxlY3Rvci5jdXJyZW50U3ViamVjdCA9IHF1ZXJ5O1xuICAgIHZhciB0b3BRID0gc2VsZWN0b3Jbc2VsZWN0b3IubGVuZ3RoIC0gMV07XG4gICAgdmFyIHRvcENoayA9IHRvcFEuY2hlY2tzWzBdO1xuICAgIHZhciB0b3BUeXBlID0gdG9wQ2hrID09IG51bGwgPyBudWxsIDogdG9wQ2hrLnR5cGU7XG4gICAgaWYgKHRvcFR5cGUgPT09IFR5cGUuRElSRUNURURfRURHRSkge1xuICAgICAgLy8gZGlyZWN0ZWQgZWRnZSB3aXRoIHN1YmplY3Qgb24gdGhlIHRhcmdldFxuXG4gICAgICAvLyBjaGFuZ2UgdG8gdGFyZ2V0IG5vZGUgY2hlY2tcbiAgICAgIHRvcENoay50eXBlID0gVHlwZS5OT0RFX1RBUkdFVDtcbiAgICB9IGVsc2UgaWYgKHRvcFR5cGUgPT09IFR5cGUuVU5ESVJFQ1RFRF9FREdFKSB7XG4gICAgICAvLyB1bmRpcmVjdGVkIGVkZ2Ugd2l0aCBzdWJqZWN0IG9uIHRoZSBzZWNvbmQgbm9kZVxuXG4gICAgICAvLyBjaGFuZ2UgdG8gbmVpZ2hib3IgY2hlY2tcbiAgICAgIHRvcENoay50eXBlID0gVHlwZS5OT0RFX05FSUdIQk9SO1xuICAgICAgdG9wQ2hrLm5vZGUgPSB0b3BDaGsubm9kZXNbMV07IC8vIHNlY29uZCBub2RlIGlzIHN1YmplY3RcbiAgICAgIHRvcENoay5uZWlnaGJvciA9IHRvcENoay5ub2Rlc1swXTtcblxuICAgICAgLy8gY2xlYW4gdXAgdW51c2VkIGZpZWxkcyBmb3IgbmV3IHR5cGVcbiAgICAgIHRvcENoay5ub2RlcyA9IG51bGw7XG4gICAgfVxuICB9XG59XTtcbmV4cHJzLmZvckVhY2goZnVuY3Rpb24gKGUpIHtcbiAgcmV0dXJuIGUucmVnZXhPYmogPSBuZXcgUmVnRXhwKCdeJyArIGUucmVnZXgpO1xufSk7XG5cbi8qKlxuICogT2YgYWxsIHRoZSBleHByZXNzaW9ucywgZmluZCB0aGUgZmlyc3QgbWF0Y2ggaW4gdGhlIHJlbWFpbmluZyB0ZXh0LlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbWFpbmluZyBUaGUgcmVtYWluaW5nIHRleHQgdG8gcGFyc2VcbiAqIEByZXR1cm5zIFRoZSBtYXRjaGVkIGV4cHJlc3Npb24gYW5kIHRoZSBuZXdseSByZW1haW5pbmcgdGV4dCBgeyBleHByLCBtYXRjaCwgbmFtZSwgcmVtYWluaW5nIH1gXG4gKi9cbnZhciBjb25zdW1lRXhwciA9IGZ1bmN0aW9uIGNvbnN1bWVFeHByKHJlbWFpbmluZykge1xuICB2YXIgZXhwcjtcbiAgdmFyIG1hdGNoO1xuICB2YXIgbmFtZTtcbiAgZm9yICh2YXIgaiA9IDA7IGogPCBleHBycy5sZW5ndGg7IGorKykge1xuICAgIHZhciBlID0gZXhwcnNbal07XG4gICAgdmFyIG4gPSBlLm5hbWU7XG4gICAgdmFyIG0gPSByZW1haW5pbmcubWF0Y2goZS5yZWdleE9iaik7XG4gICAgaWYgKG0gIT0gbnVsbCkge1xuICAgICAgbWF0Y2ggPSBtO1xuICAgICAgZXhwciA9IGU7XG4gICAgICBuYW1lID0gbjtcbiAgICAgIHZhciBjb25zdW1lZCA9IG1bMF07XG4gICAgICByZW1haW5pbmcgPSByZW1haW5pbmcuc3Vic3RyaW5nKGNvbnN1bWVkLmxlbmd0aCk7XG4gICAgICBicmVhazsgLy8gd2UndmUgY29uc3VtZWQgb25lIGV4cHIsIHNvIHdlIGNhbiByZXR1cm4gbm93XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgZXhwcjogZXhwcixcbiAgICBtYXRjaDogbWF0Y2gsXG4gICAgbmFtZTogbmFtZSxcbiAgICByZW1haW5pbmc6IHJlbWFpbmluZ1xuICB9O1xufTtcblxuLyoqXG4gKiBDb25zdW1lIGFsbCB0aGUgbGVhZGluZyB3aGl0ZXNwYWNlXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVtYWluaW5nIFRoZSB0ZXh0IHRvIGNvbnN1bWVcbiAqIEByZXR1cm5zIFRoZSB0ZXh0IHdpdGggdGhlIGxlYWRpbmcgd2hpdGVzcGFjZSByZW1vdmVkXG4gKi9cbnZhciBjb25zdW1lV2hpdGVzcGFjZSA9IGZ1bmN0aW9uIGNvbnN1bWVXaGl0ZXNwYWNlKHJlbWFpbmluZykge1xuICB2YXIgbWF0Y2ggPSByZW1haW5pbmcubWF0Y2goL15cXHMrLyk7XG4gIGlmIChtYXRjaCkge1xuICAgIHZhciBjb25zdW1lZCA9IG1hdGNoWzBdO1xuICAgIHJlbWFpbmluZyA9IHJlbWFpbmluZy5zdWJzdHJpbmcoY29uc3VtZWQubGVuZ3RoKTtcbiAgfVxuICByZXR1cm4gcmVtYWluaW5nO1xufTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgc3RyaW5nIGFuZCBzdG9yZSB0aGUgcGFyc2VkIHJlcHJlc2VudGF0aW9uIGluIHRoZSBTZWxlY3Rvci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciBUaGUgc2VsZWN0b3Igc3RyaW5nXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHNlbGVjdG9yIHdhcyBzdWNjZXNzZnVsbHkgcGFyc2VkLCBgZmFsc2VgIG90aGVyd2lzZVxuICovXG52YXIgcGFyc2UgPSBmdW5jdGlvbiBwYXJzZShzZWxlY3Rvcikge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciByZW1haW5pbmcgPSBzZWxmLmlucHV0VGV4dCA9IHNlbGVjdG9yO1xuICB2YXIgY3VycmVudFF1ZXJ5ID0gc2VsZlswXSA9IG5ld1F1ZXJ5KCk7XG4gIHNlbGYubGVuZ3RoID0gMTtcbiAgcmVtYWluaW5nID0gY29uc3VtZVdoaXRlc3BhY2UocmVtYWluaW5nKTsgLy8gZ2V0IHJpZCBvZiBsZWFkaW5nIHdoaXRlc3BhY2VcblxuICBmb3IgKDs7KSB7XG4gICAgdmFyIGV4cHJJbmZvID0gY29uc3VtZUV4cHIocmVtYWluaW5nKTtcbiAgICBpZiAoZXhwckluZm8uZXhwciA9PSBudWxsKSB7XG4gICAgICB3YXJuKCdUaGUgc2VsZWN0b3IgYCcgKyBzZWxlY3RvciArICdgaXMgaW52YWxpZCcpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgYXJncyA9IGV4cHJJbmZvLm1hdGNoLnNsaWNlKDEpO1xuXG4gICAgICAvLyBsZXQgdGhlIHRva2VuIHBvcHVsYXRlIHRoZSBzZWxlY3RvciBvYmplY3QgaW4gY3VycmVudFF1ZXJ5XG4gICAgICB2YXIgcmV0ID0gZXhwckluZm8uZXhwci5wb3B1bGF0ZShzZWxmLCBjdXJyZW50UXVlcnksIGFyZ3MpO1xuICAgICAgaWYgKHJldCA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBleGl0IGlmIHBvcHVsYXRpb24gZmFpbGVkXG4gICAgICB9IGVsc2UgaWYgKHJldCAhPSBudWxsKSB7XG4gICAgICAgIGN1cnJlbnRRdWVyeSA9IHJldDsgLy8gY2hhbmdlIHRoZSBjdXJyZW50IHF1ZXJ5IHRvIGJlIGZpbGxlZCBpZiB0aGUgZXhwciBzcGVjaWZpZXNcbiAgICAgIH1cbiAgICB9XG4gICAgcmVtYWluaW5nID0gZXhwckluZm8ucmVtYWluaW5nO1xuXG4gICAgLy8gd2UncmUgZG9uZSB3aGVuIHRoZXJlJ3Mgbm90aGluZyBsZWZ0IHRvIHBhcnNlXG4gICAgaWYgKHJlbWFpbmluZy5tYXRjaCgvXlxccyokLykpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICB2YXIgbGFzdFEgPSBzZWxmW3NlbGYubGVuZ3RoIC0gMV07XG4gIGlmIChzZWxmLmN1cnJlbnRTdWJqZWN0ICE9IG51bGwpIHtcbiAgICBsYXN0US5zdWJqZWN0ID0gc2VsZi5jdXJyZW50U3ViamVjdDtcbiAgfVxuICBsYXN0US5lZGdlQ291bnQgPSBzZWxmLmVkZ2VDb3VudDtcbiAgbGFzdFEuY29tcG91bmRDb3VudCA9IHNlbGYuY29tcG91bmRDb3VudDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHEgPSBzZWxmW2ldO1xuXG4gICAgLy8gaW4gZnV0dXJlLCB0aGlzIGNvdWxkIHBvdGVudGlhbGx5IGJlIGFsbG93ZWQgaWYgdGhlcmUgd2VyZSBvcGVyYXRvciBwcmVjZWRlbmNlIGFuZCBkZXRlY3Rpb24gb2YgaW52YWxpZCBjb21iaW5hdGlvbnNcbiAgICBpZiAocS5jb21wb3VuZENvdW50ID4gMCAmJiBxLmVkZ2VDb3VudCA+IDApIHtcbiAgICAgIHdhcm4oJ1RoZSBzZWxlY3RvciBgJyArIHNlbGVjdG9yICsgJ2AgaXMgaW52YWxpZCBiZWNhdXNlIGl0IHVzZXMgYm90aCBhIGNvbXBvdW5kIHNlbGVjdG9yIGFuZCBhbiBlZGdlIHNlbGVjdG9yJyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChxLmVkZ2VDb3VudCA+IDEpIHtcbiAgICAgIHdhcm4oJ1RoZSBzZWxlY3RvciBgJyArIHNlbGVjdG9yICsgJ2AgaXMgaW52YWxpZCBiZWNhdXNlIGl0IHVzZXMgbXVsdGlwbGUgZWRnZSBzZWxlY3RvcnMnKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKHEuZWRnZUNvdW50ID09PSAxKSB7XG4gICAgICB3YXJuKCdUaGUgc2VsZWN0b3IgYCcgKyBzZWxlY3RvciArICdgIGlzIGRlcHJlY2F0ZWQuICBFZGdlIHNlbGVjdG9ycyBkbyBub3QgdGFrZSBlZmZlY3Qgb24gY2hhbmdlcyB0byBzb3VyY2UgYW5kIHRhcmdldCBub2RlcyBhZnRlciBhbiBlZGdlIGlzIGFkZGVkLCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4gIFVzZSBhIGNsYXNzIG9yIGRhdGEgc2VsZWN0b3Igb24gZWRnZXMgaW5zdGVhZCwgdXBkYXRpbmcgdGhlIGNsYXNzIG9yIGRhdGEgb2YgYW4gZWRnZSB3aGVuIHlvdXIgYXBwIGRldGVjdHMgYSBjaGFuZ2UgaW4gc291cmNlIG9yIHRhcmdldCBub2Rlcy4nKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7IC8vIHN1Y2Nlc3Ncbn07XG5cbi8qKlxuICogR2V0IHRoZSBzZWxlY3RvciByZXByZXNlbnRlZCBhcyBhIHN0cmluZy4gIFRoaXMgdmFsdWUgdXNlcyBkZWZhdWx0IGZvcm1hdHRpbmcsXG4gKiBzbyB0aGluZ3MgbGlrZSBzcGFjaW5nIG1heSBkaWZmZXIgZnJvbSB0aGUgaW5wdXQgdGV4dCBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yLlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIHNlbGVjdG9yIHN0cmluZ1xuICovXG52YXIgdG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgaWYgKHRoaXMudG9TdHJpbmdDYWNoZSAhPSBudWxsKSB7XG4gICAgcmV0dXJuIHRoaXMudG9TdHJpbmdDYWNoZTtcbiAgfVxuICB2YXIgY2xlYW4gPSBmdW5jdGlvbiBjbGVhbihvYmopIHtcbiAgICBpZiAob2JqID09IG51bGwpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG4gIH07XG4gIHZhciBjbGVhblZhbCA9IGZ1bmN0aW9uIGNsZWFuVmFsKHZhbCkge1xuICAgIGlmIChzdHJpbmcodmFsKSkge1xuICAgICAgcmV0dXJuICdcIicgKyB2YWwgKyAnXCInO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gY2xlYW4odmFsKTtcbiAgICB9XG4gIH07XG4gIHZhciBzcGFjZSA9IGZ1bmN0aW9uIHNwYWNlKHZhbCkge1xuICAgIHJldHVybiAnICcgKyB2YWwgKyAnICc7XG4gIH07XG4gIHZhciBjaGVja1RvU3RyaW5nID0gZnVuY3Rpb24gY2hlY2tUb1N0cmluZyhjaGVjaywgc3ViamVjdCkge1xuICAgIHZhciB0eXBlID0gY2hlY2sudHlwZSxcbiAgICAgIHZhbHVlID0gY2hlY2sudmFsdWU7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFR5cGUuR1JPVVA6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgZ3JvdXAgPSBjbGVhbih2YWx1ZSk7XG4gICAgICAgICAgcmV0dXJuIGdyb3VwLnN1YnN0cmluZygwLCBncm91cC5sZW5ndGggLSAxKTtcbiAgICAgICAgfVxuICAgICAgY2FzZSBUeXBlLkRBVEFfQ09NUEFSRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBmaWVsZCA9IGNoZWNrLmZpZWxkLFxuICAgICAgICAgICAgb3BlcmF0b3IgPSBjaGVjay5vcGVyYXRvcjtcbiAgICAgICAgICByZXR1cm4gJ1snICsgZmllbGQgKyBzcGFjZShjbGVhbihvcGVyYXRvcikpICsgY2xlYW5WYWwodmFsdWUpICsgJ10nO1xuICAgICAgICB9XG4gICAgICBjYXNlIFR5cGUuREFUQV9CT09MOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIF9vcGVyYXRvciA9IGNoZWNrLm9wZXJhdG9yLFxuICAgICAgICAgICAgX2ZpZWxkID0gY2hlY2suZmllbGQ7XG4gICAgICAgICAgcmV0dXJuICdbJyArIGNsZWFuKF9vcGVyYXRvcikgKyBfZmllbGQgKyAnXSc7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgVHlwZS5EQVRBX0VYSVNUOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIF9maWVsZDIgPSBjaGVjay5maWVsZDtcbiAgICAgICAgICByZXR1cm4gJ1snICsgX2ZpZWxkMiArICddJztcbiAgICAgICAgfVxuICAgICAgY2FzZSBUeXBlLk1FVEFfQ09NUEFSRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBfb3BlcmF0b3IyID0gY2hlY2sub3BlcmF0b3IsXG4gICAgICAgICAgICBfZmllbGQzID0gY2hlY2suZmllbGQ7XG4gICAgICAgICAgcmV0dXJuICdbWycgKyBfZmllbGQzICsgc3BhY2UoY2xlYW4oX29wZXJhdG9yMikpICsgY2xlYW5WYWwodmFsdWUpICsgJ11dJztcbiAgICAgICAgfVxuICAgICAgY2FzZSBUeXBlLlNUQVRFOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICBjYXNlIFR5cGUuSUQ6XG4gICAgICAgIHtcbiAgICAgICAgICByZXR1cm4gJyMnICsgdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgVHlwZS5DTEFTUzpcbiAgICAgICAge1xuICAgICAgICAgIHJldHVybiAnLicgKyB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgY2FzZSBUeXBlLlBBUkVOVDpcbiAgICAgIGNhc2UgVHlwZS5DSElMRDpcbiAgICAgICAge1xuICAgICAgICAgIHJldHVybiBxdWVyeVRvU3RyaW5nKGNoZWNrLnBhcmVudCwgc3ViamVjdCkgKyBzcGFjZSgnPicpICsgcXVlcnlUb1N0cmluZyhjaGVjay5jaGlsZCwgc3ViamVjdCk7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgVHlwZS5BTkNFU1RPUjpcbiAgICAgIGNhc2UgVHlwZS5ERVNDRU5EQU5UOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIHF1ZXJ5VG9TdHJpbmcoY2hlY2suYW5jZXN0b3IsIHN1YmplY3QpICsgJyAnICsgcXVlcnlUb1N0cmluZyhjaGVjay5kZXNjZW5kYW50LCBzdWJqZWN0KTtcbiAgICAgICAgfVxuICAgICAgY2FzZSBUeXBlLkNPTVBPVU5EX1NQTElUOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGxocyA9IHF1ZXJ5VG9TdHJpbmcoY2hlY2subGVmdCwgc3ViamVjdCk7XG4gICAgICAgICAgdmFyIHN1YiA9IHF1ZXJ5VG9TdHJpbmcoY2hlY2suc3ViamVjdCwgc3ViamVjdCk7XG4gICAgICAgICAgdmFyIHJocyA9IHF1ZXJ5VG9TdHJpbmcoY2hlY2sucmlnaHQsIHN1YmplY3QpO1xuICAgICAgICAgIHJldHVybiBsaHMgKyAobGhzLmxlbmd0aCA+IDAgPyAnICcgOiAnJykgKyBzdWIgKyByaHM7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgVHlwZS5UUlVFOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgfVxuICB9O1xuICB2YXIgcXVlcnlUb1N0cmluZyA9IGZ1bmN0aW9uIHF1ZXJ5VG9TdHJpbmcocXVlcnksIHN1YmplY3QpIHtcbiAgICByZXR1cm4gcXVlcnkuY2hlY2tzLnJlZHVjZShmdW5jdGlvbiAoc3RyLCBjaGssIGkpIHtcbiAgICAgIHJldHVybiBzdHIgKyAoc3ViamVjdCA9PT0gcXVlcnkgJiYgaSA9PT0gMCA/ICckJyA6ICcnKSArIGNoZWNrVG9TdHJpbmcoY2hrLCBzdWJqZWN0KTtcbiAgICB9LCAnJyk7XG4gIH07XG4gIHZhciBzdHIgPSAnJztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHF1ZXJ5ID0gdGhpc1tpXTtcbiAgICBzdHIgKz0gcXVlcnlUb1N0cmluZyhxdWVyeSwgcXVlcnkuc3ViamVjdCk7XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gMSAmJiBpIDwgdGhpcy5sZW5ndGggLSAxKSB7XG4gICAgICBzdHIgKz0gJywgJztcbiAgICB9XG4gIH1cbiAgdGhpcy50b1N0cmluZ0NhY2hlID0gc3RyO1xuICByZXR1cm4gc3RyO1xufTtcbnZhciBwYXJzZSQxID0ge1xuICBwYXJzZTogcGFyc2UsXG4gIHRvU3RyaW5nOiB0b1N0cmluZ1xufTtcblxudmFyIHZhbENtcCA9IGZ1bmN0aW9uIHZhbENtcChmaWVsZFZhbCwgb3BlcmF0b3IsIHZhbHVlKSB7XG4gIHZhciBtYXRjaGVzO1xuICB2YXIgaXNGaWVsZFN0ciA9IHN0cmluZyhmaWVsZFZhbCk7XG4gIHZhciBpc0ZpZWxkTnVtID0gbnVtYmVyJDEoZmllbGRWYWwpO1xuICB2YXIgaXNWYWxTdHIgPSBzdHJpbmcodmFsdWUpO1xuICB2YXIgZmllbGRTdHIsIHZhbFN0cjtcbiAgdmFyIGNhc2VJbnNlbnNpdGl2ZSA9IGZhbHNlO1xuICB2YXIgbm90RXhwciA9IGZhbHNlO1xuICB2YXIgaXNJbmVxQ21wID0gZmFsc2U7XG4gIGlmIChvcGVyYXRvci5pbmRleE9mKCchJykgPj0gMCkge1xuICAgIG9wZXJhdG9yID0gb3BlcmF0b3IucmVwbGFjZSgnIScsICcnKTtcbiAgICBub3RFeHByID0gdHJ1ZTtcbiAgfVxuICBpZiAob3BlcmF0b3IuaW5kZXhPZignQCcpID49IDApIHtcbiAgICBvcGVyYXRvciA9IG9wZXJhdG9yLnJlcGxhY2UoJ0AnLCAnJyk7XG4gICAgY2FzZUluc2Vuc2l0aXZlID0gdHJ1ZTtcbiAgfVxuICBpZiAoaXNGaWVsZFN0ciB8fCBpc1ZhbFN0ciB8fCBjYXNlSW5zZW5zaXRpdmUpIHtcbiAgICBmaWVsZFN0ciA9ICFpc0ZpZWxkU3RyICYmICFpc0ZpZWxkTnVtID8gJycgOiAnJyArIGZpZWxkVmFsO1xuICAgIHZhbFN0ciA9ICcnICsgdmFsdWU7XG4gIH1cblxuICAvLyBpZiB3ZSdyZSBkb2luZyBhIGNhc2UgaW5zZW5zaXRpdmUgY29tcGFyaXNvbiwgdGhlbiB3ZSdyZSB1c2luZyBhIFNUUklORyBjb21wYXJpc29uXG4gIC8vIGV2ZW4gaWYgd2UncmUgY29tcGFyaW5nIG51bWJlcnNcbiAgaWYgKGNhc2VJbnNlbnNpdGl2ZSkge1xuICAgIGZpZWxkVmFsID0gZmllbGRTdHIgPSBmaWVsZFN0ci50b0xvd2VyQ2FzZSgpO1xuICAgIHZhbHVlID0gdmFsU3RyID0gdmFsU3RyLnRvTG93ZXJDYXNlKCk7XG4gIH1cbiAgc3dpdGNoIChvcGVyYXRvcikge1xuICAgIGNhc2UgJyo9JzpcbiAgICAgIG1hdGNoZXMgPSBmaWVsZFN0ci5pbmRleE9mKHZhbFN0cikgPj0gMDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJyQ9JzpcbiAgICAgIG1hdGNoZXMgPSBmaWVsZFN0ci5pbmRleE9mKHZhbFN0ciwgZmllbGRTdHIubGVuZ3RoIC0gdmFsU3RyLmxlbmd0aCkgPj0gMDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ149JzpcbiAgICAgIG1hdGNoZXMgPSBmaWVsZFN0ci5pbmRleE9mKHZhbFN0cikgPT09IDA7XG4gICAgICBicmVhaztcbiAgICBjYXNlICc9JzpcbiAgICAgIG1hdGNoZXMgPSBmaWVsZFZhbCA9PT0gdmFsdWU7XG4gICAgICBicmVhaztcbiAgICBjYXNlICc+JzpcbiAgICAgIGlzSW5lcUNtcCA9IHRydWU7XG4gICAgICBtYXRjaGVzID0gZmllbGRWYWwgPiB2YWx1ZTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJz49JzpcbiAgICAgIGlzSW5lcUNtcCA9IHRydWU7XG4gICAgICBtYXRjaGVzID0gZmllbGRWYWwgPj0gdmFsdWU7XG4gICAgICBicmVhaztcbiAgICBjYXNlICc8JzpcbiAgICAgIGlzSW5lcUNtcCA9IHRydWU7XG4gICAgICBtYXRjaGVzID0gZmllbGRWYWwgPCB2YWx1ZTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJzw9JzpcbiAgICAgIGlzSW5lcUNtcCA9IHRydWU7XG4gICAgICBtYXRjaGVzID0gZmllbGRWYWwgPD0gdmFsdWU7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgbWF0Y2hlcyA9IGZhbHNlO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICAvLyBhcHBseSB0aGUgbm90IG9wLCBidXQgbnVsbCB2YWxzIGZvciBpbmVxdWFsaXRpZXMgc2hvdWxkIGFsd2F5cyBzdGF5IG5vbi1tYXRjaGluZ1xuICBpZiAobm90RXhwciAmJiAoZmllbGRWYWwgIT0gbnVsbCB8fCAhaXNJbmVxQ21wKSkge1xuICAgIG1hdGNoZXMgPSAhbWF0Y2hlcztcbiAgfVxuICByZXR1cm4gbWF0Y2hlcztcbn07XG52YXIgYm9vbENtcCA9IGZ1bmN0aW9uIGJvb2xDbXAoZmllbGRWYWwsIG9wZXJhdG9yKSB7XG4gIHN3aXRjaCAob3BlcmF0b3IpIHtcbiAgICBjYXNlICc/JzpcbiAgICAgIHJldHVybiBmaWVsZFZhbCA/IHRydWUgOiBmYWxzZTtcbiAgICBjYXNlICchJzpcbiAgICAgIHJldHVybiBmaWVsZFZhbCA/IGZhbHNlIDogdHJ1ZTtcbiAgICBjYXNlICdeJzpcbiAgICAgIHJldHVybiBmaWVsZFZhbCA9PT0gdW5kZWZpbmVkO1xuICB9XG59O1xudmFyIGV4aXN0Q21wID0gZnVuY3Rpb24gZXhpc3RDbXAoZmllbGRWYWwpIHtcbiAgcmV0dXJuIGZpZWxkVmFsICE9PSB1bmRlZmluZWQ7XG59O1xudmFyIGRhdGEkMSA9IGZ1bmN0aW9uIGRhdGEoZWxlLCBmaWVsZCkge1xuICByZXR1cm4gZWxlLmRhdGEoZmllbGQpO1xufTtcbnZhciBtZXRhID0gZnVuY3Rpb24gbWV0YShlbGUsIGZpZWxkKSB7XG4gIHJldHVybiBlbGVbZmllbGRdKCk7XG59O1xuXG4vKiogQSBsb29rdXAgb2YgYG1hdGNoKGNoZWNrLCBlbGUpYCBmdW5jdGlvbnMgYnkgYFR5cGVgIGludCAqL1xudmFyIG1hdGNoID0gW107XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIHRoZSBxdWVyeSBtYXRjaGVzIGZvciB0aGUgZWxlbWVudFxuICogQHBhcmFtIHF1ZXJ5IFRoZSBgeyB0eXBlLCB2YWx1ZSwgLi4uIH1gIHF1ZXJ5IG9iamVjdFxuICogQHBhcmFtIGVsZSBUaGUgZWxlbWVudCB0byBjb21wYXJlIGFnYWluc3RcbiovXG52YXIgbWF0Y2hlcyQxID0gZnVuY3Rpb24gbWF0Y2hlcyhxdWVyeSwgZWxlKSB7XG4gIHJldHVybiBxdWVyeS5jaGVja3MuZXZlcnkoZnVuY3Rpb24gKGNoaykge1xuICAgIHJldHVybiBtYXRjaFtjaGsudHlwZV0oY2hrLCBlbGUpO1xuICB9KTtcbn07XG5tYXRjaFtUeXBlLkdST1VQXSA9IGZ1bmN0aW9uIChjaGVjaywgZWxlKSB7XG4gIHZhciBncm91cCA9IGNoZWNrLnZhbHVlO1xuICByZXR1cm4gZ3JvdXAgPT09ICcqJyB8fCBncm91cCA9PT0gZWxlLmdyb3VwKCk7XG59O1xubWF0Y2hbVHlwZS5TVEFURV0gPSBmdW5jdGlvbiAoY2hlY2ssIGVsZSkge1xuICB2YXIgc3RhdGVTZWxlY3RvciA9IGNoZWNrLnZhbHVlO1xuICByZXR1cm4gc3RhdGVTZWxlY3Rvck1hdGNoZXMoc3RhdGVTZWxlY3RvciwgZWxlKTtcbn07XG5tYXRjaFtUeXBlLklEXSA9IGZ1bmN0aW9uIChjaGVjaywgZWxlKSB7XG4gIHZhciBpZCA9IGNoZWNrLnZhbHVlO1xuICByZXR1cm4gZWxlLmlkKCkgPT09IGlkO1xufTtcbm1hdGNoW1R5cGUuQ0xBU1NdID0gZnVuY3Rpb24gKGNoZWNrLCBlbGUpIHtcbiAgdmFyIGNscyA9IGNoZWNrLnZhbHVlO1xuICByZXR1cm4gZWxlLmhhc0NsYXNzKGNscyk7XG59O1xubWF0Y2hbVHlwZS5NRVRBX0NPTVBBUkVdID0gZnVuY3Rpb24gKGNoZWNrLCBlbGUpIHtcbiAgdmFyIGZpZWxkID0gY2hlY2suZmllbGQsXG4gICAgb3BlcmF0b3IgPSBjaGVjay5vcGVyYXRvcixcbiAgICB2YWx1ZSA9IGNoZWNrLnZhbHVlO1xuICByZXR1cm4gdmFsQ21wKG1ldGEoZWxlLCBmaWVsZCksIG9wZXJhdG9yLCB2YWx1ZSk7XG59O1xubWF0Y2hbVHlwZS5EQVRBX0NPTVBBUkVdID0gZnVuY3Rpb24gKGNoZWNrLCBlbGUpIHtcbiAgdmFyIGZpZWxkID0gY2hlY2suZmllbGQsXG4gICAgb3BlcmF0b3IgPSBjaGVjay5vcGVyYXRvcixcbiAgICB2YWx1ZSA9IGNoZWNrLnZhbHVlO1xuICByZXR1cm4gdmFsQ21wKGRhdGEkMShlbGUsIGZpZWxkKSwgb3BlcmF0b3IsIHZhbHVlKTtcbn07XG5tYXRjaFtUeXBlLkRBVEFfQk9PTF0gPSBmdW5jdGlvbiAoY2hlY2ssIGVsZSkge1xuICB2YXIgZmllbGQgPSBjaGVjay5maWVsZCxcbiAgICBvcGVyYXRvciA9IGNoZWNrLm9wZXJhdG9yO1xuICByZXR1cm4gYm9vbENtcChkYXRhJDEoZWxlLCBmaWVsZCksIG9wZXJhdG9yKTtcbn07XG5tYXRjaFtUeXBlLkRBVEFfRVhJU1RdID0gZnVuY3Rpb24gKGNoZWNrLCBlbGUpIHtcbiAgdmFyIGZpZWxkID0gY2hlY2suZmllbGQ7XG4gICAgY2hlY2sub3BlcmF0b3I7XG4gIHJldHVybiBleGlzdENtcChkYXRhJDEoZWxlLCBmaWVsZCkpO1xufTtcbm1hdGNoW1R5cGUuVU5ESVJFQ1RFRF9FREdFXSA9IGZ1bmN0aW9uIChjaGVjaywgZWxlKSB7XG4gIHZhciBxQSA9IGNoZWNrLm5vZGVzWzBdO1xuICB2YXIgcUIgPSBjaGVjay5ub2Rlc1sxXTtcbiAgdmFyIHNyYyA9IGVsZS5zb3VyY2UoKTtcbiAgdmFyIHRndCA9IGVsZS50YXJnZXQoKTtcbiAgcmV0dXJuIG1hdGNoZXMkMShxQSwgc3JjKSAmJiBtYXRjaGVzJDEocUIsIHRndCkgfHwgbWF0Y2hlcyQxKHFCLCBzcmMpICYmIG1hdGNoZXMkMShxQSwgdGd0KTtcbn07XG5tYXRjaFtUeXBlLk5PREVfTkVJR0hCT1JdID0gZnVuY3Rpb24gKGNoZWNrLCBlbGUpIHtcbiAgcmV0dXJuIG1hdGNoZXMkMShjaGVjay5ub2RlLCBlbGUpICYmIGVsZS5uZWlnaGJvcmhvb2QoKS5zb21lKGZ1bmN0aW9uIChuKSB7XG4gICAgcmV0dXJuIG4uaXNOb2RlKCkgJiYgbWF0Y2hlcyQxKGNoZWNrLm5laWdoYm9yLCBuKTtcbiAgfSk7XG59O1xubWF0Y2hbVHlwZS5ESVJFQ1RFRF9FREdFXSA9IGZ1bmN0aW9uIChjaGVjaywgZWxlKSB7XG4gIHJldHVybiBtYXRjaGVzJDEoY2hlY2suc291cmNlLCBlbGUuc291cmNlKCkpICYmIG1hdGNoZXMkMShjaGVjay50YXJnZXQsIGVsZS50YXJnZXQoKSk7XG59O1xubWF0Y2hbVHlwZS5OT0RFX1NPVVJDRV0gPSBmdW5jdGlvbiAoY2hlY2ssIGVsZSkge1xuICByZXR1cm4gbWF0Y2hlcyQxKGNoZWNrLnNvdXJjZSwgZWxlKSAmJiBlbGUub3V0Z29lcnMoKS5zb21lKGZ1bmN0aW9uIChuKSB7XG4gICAgcmV0dXJuIG4uaXNOb2RlKCkgJiYgbWF0Y2hlcyQxKGNoZWNrLnRhcmdldCwgbik7XG4gIH0pO1xufTtcbm1hdGNoW1R5cGUuTk9ERV9UQVJHRVRdID0gZnVuY3Rpb24gKGNoZWNrLCBlbGUpIHtcbiAgcmV0dXJuIG1hdGNoZXMkMShjaGVjay50YXJnZXQsIGVsZSkgJiYgZWxlLmluY29tZXJzKCkuc29tZShmdW5jdGlvbiAobikge1xuICAgIHJldHVybiBuLmlzTm9kZSgpICYmIG1hdGNoZXMkMShjaGVjay5zb3VyY2UsIG4pO1xuICB9KTtcbn07XG5tYXRjaFtUeXBlLkNISUxEXSA9IGZ1bmN0aW9uIChjaGVjaywgZWxlKSB7XG4gIHJldHVybiBtYXRjaGVzJDEoY2hlY2suY2hpbGQsIGVsZSkgJiYgbWF0Y2hlcyQxKGNoZWNrLnBhcmVudCwgZWxlLnBhcmVudCgpKTtcbn07XG5tYXRjaFtUeXBlLlBBUkVOVF0gPSBmdW5jdGlvbiAoY2hlY2ssIGVsZSkge1xuICByZXR1cm4gbWF0Y2hlcyQxKGNoZWNrLnBhcmVudCwgZWxlKSAmJiBlbGUuY2hpbGRyZW4oKS5zb21lKGZ1bmN0aW9uIChjKSB7XG4gICAgcmV0dXJuIG1hdGNoZXMkMShjaGVjay5jaGlsZCwgYyk7XG4gIH0pO1xufTtcbm1hdGNoW1R5cGUuREVTQ0VOREFOVF0gPSBmdW5jdGlvbiAoY2hlY2ssIGVsZSkge1xuICByZXR1cm4gbWF0Y2hlcyQxKGNoZWNrLmRlc2NlbmRhbnQsIGVsZSkgJiYgZWxlLmFuY2VzdG9ycygpLnNvbWUoZnVuY3Rpb24gKGEpIHtcbiAgICByZXR1cm4gbWF0Y2hlcyQxKGNoZWNrLmFuY2VzdG9yLCBhKTtcbiAgfSk7XG59O1xubWF0Y2hbVHlwZS5BTkNFU1RPUl0gPSBmdW5jdGlvbiAoY2hlY2ssIGVsZSkge1xuICByZXR1cm4gbWF0Y2hlcyQxKGNoZWNrLmFuY2VzdG9yLCBlbGUpICYmIGVsZS5kZXNjZW5kYW50cygpLnNvbWUoZnVuY3Rpb24gKGQpIHtcbiAgICByZXR1cm4gbWF0Y2hlcyQxKGNoZWNrLmRlc2NlbmRhbnQsIGQpO1xuICB9KTtcbn07XG5tYXRjaFtUeXBlLkNPTVBPVU5EX1NQTElUXSA9IGZ1bmN0aW9uIChjaGVjaywgZWxlKSB7XG4gIHJldHVybiBtYXRjaGVzJDEoY2hlY2suc3ViamVjdCwgZWxlKSAmJiBtYXRjaGVzJDEoY2hlY2subGVmdCwgZWxlKSAmJiBtYXRjaGVzJDEoY2hlY2sucmlnaHQsIGVsZSk7XG59O1xubWF0Y2hbVHlwZS5UUlVFXSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRydWU7XG59O1xubWF0Y2hbVHlwZS5DT0xMRUNUSU9OXSA9IGZ1bmN0aW9uIChjaGVjaywgZWxlKSB7XG4gIHZhciBjb2xsZWN0aW9uID0gY2hlY2sudmFsdWU7XG4gIHJldHVybiBjb2xsZWN0aW9uLmhhcyhlbGUpO1xufTtcbm1hdGNoW1R5cGUuRklMVEVSXSA9IGZ1bmN0aW9uIChjaGVjaywgZWxlKSB7XG4gIHZhciBmaWx0ZXIgPSBjaGVjay52YWx1ZTtcbiAgcmV0dXJuIGZpbHRlcihlbGUpO1xufTtcblxuLy8gZmlsdGVyIGFuIGV4aXN0aW5nIGNvbGxlY3Rpb25cbnZhciBmaWx0ZXIgPSBmdW5jdGlvbiBmaWx0ZXIoY29sbGVjdGlvbikge1xuICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgLy8gZm9yIDEgaWQgI2ZvbyBxdWVyaWVzLCBqdXN0IGdldCB0aGUgZWxlbWVudFxuICBpZiAoc2VsZi5sZW5ndGggPT09IDEgJiYgc2VsZlswXS5jaGVja3MubGVuZ3RoID09PSAxICYmIHNlbGZbMF0uY2hlY2tzWzBdLnR5cGUgPT09IFR5cGUuSUQpIHtcbiAgICByZXR1cm4gY29sbGVjdGlvbi5nZXRFbGVtZW50QnlJZChzZWxmWzBdLmNoZWNrc1swXS52YWx1ZSkuY29sbGVjdGlvbigpO1xuICB9XG4gIHZhciBzZWxlY3RvckZ1bmN0aW9uID0gZnVuY3Rpb24gc2VsZWN0b3JGdW5jdGlvbihlbGVtZW50KSB7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBzZWxmLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgcXVlcnkgPSBzZWxmW2pdO1xuICAgICAgaWYgKG1hdGNoZXMkMShxdWVyeSwgZWxlbWVudCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcbiAgaWYgKHNlbGYudGV4dCgpID09IG51bGwpIHtcbiAgICBzZWxlY3RvckZ1bmN0aW9uID0gZnVuY3Rpb24gc2VsZWN0b3JGdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIGNvbGxlY3Rpb24uZmlsdGVyKHNlbGVjdG9yRnVuY3Rpb24pO1xufTsgLy8gZmlsdGVyXG5cbi8vIGRvZXMgc2VsZWN0b3IgbWF0Y2ggYSBzaW5nbGUgZWxlbWVudD9cbnZhciBtYXRjaGVzID0gZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBmb3IgKHZhciBqID0gMDsgaiA8IHNlbGYubGVuZ3RoOyBqKyspIHtcbiAgICB2YXIgcXVlcnkgPSBzZWxmW2pdO1xuICAgIGlmIChtYXRjaGVzJDEocXVlcnksIGVsZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59OyAvLyBtYXRjaGVzXG5cbnZhciBtYXRjaGluZyA9IHtcbiAgbWF0Y2hlczogbWF0Y2hlcyxcbiAgZmlsdGVyOiBmaWx0ZXJcbn07XG5cbnZhciBTZWxlY3RvciA9IGZ1bmN0aW9uIFNlbGVjdG9yKHNlbGVjdG9yKSB7XG4gIHRoaXMuaW5wdXRUZXh0ID0gc2VsZWN0b3I7XG4gIHRoaXMuY3VycmVudFN1YmplY3QgPSBudWxsO1xuICB0aGlzLmNvbXBvdW5kQ291bnQgPSAwO1xuICB0aGlzLmVkZ2VDb3VudCA9IDA7XG4gIHRoaXMubGVuZ3RoID0gMDtcbiAgaWYgKHNlbGVjdG9yID09IG51bGwgfHwgc3RyaW5nKHNlbGVjdG9yKSAmJiBzZWxlY3Rvci5tYXRjaCgvXlxccyokLykpIDsgZWxzZSBpZiAoZWxlbWVudE9yQ29sbGVjdGlvbihzZWxlY3RvcikpIHtcbiAgICB0aGlzLmFkZFF1ZXJ5KHtcbiAgICAgIGNoZWNrczogW3tcbiAgICAgICAgdHlwZTogVHlwZS5DT0xMRUNUSU9OLFxuICAgICAgICB2YWx1ZTogc2VsZWN0b3IuY29sbGVjdGlvbigpXG4gICAgICB9XVxuICAgIH0pO1xuICB9IGVsc2UgaWYgKGZuJDYoc2VsZWN0b3IpKSB7XG4gICAgdGhpcy5hZGRRdWVyeSh7XG4gICAgICBjaGVja3M6IFt7XG4gICAgICAgIHR5cGU6IFR5cGUuRklMVEVSLFxuICAgICAgICB2YWx1ZTogc2VsZWN0b3JcbiAgICAgIH1dXG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoc3RyaW5nKHNlbGVjdG9yKSkge1xuICAgIGlmICghdGhpcy5wYXJzZShzZWxlY3RvcikpIHtcbiAgICAgIHRoaXMuaW52YWxpZCA9IHRydWU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGVycm9yKCdBIHNlbGVjdG9yIG11c3QgYmUgY3JlYXRlZCBmcm9tIGEgc3RyaW5nOyBmb3VuZCAnKTtcbiAgfVxufTtcbnZhciBzZWxmbiA9IFNlbGVjdG9yLnByb3RvdHlwZTtcbltwYXJzZSQxLCBtYXRjaGluZ10uZm9yRWFjaChmdW5jdGlvbiAocCkge1xuICByZXR1cm4gZXh0ZW5kKHNlbGZuLCBwKTtcbn0pO1xuc2VsZm4udGV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuaW5wdXRUZXh0O1xufTtcbnNlbGZuLnNpemUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmxlbmd0aDtcbn07XG5zZWxmbi5lcSA9IGZ1bmN0aW9uIChpKSB7XG4gIHJldHVybiB0aGlzW2ldO1xufTtcbnNlbGZuLnNhbWVUZXh0ID0gZnVuY3Rpb24gKG90aGVyU2VsKSB7XG4gIHJldHVybiAhdGhpcy5pbnZhbGlkICYmICFvdGhlclNlbC5pbnZhbGlkICYmIHRoaXMudGV4dCgpID09PSBvdGhlclNlbC50ZXh0KCk7XG59O1xuc2VsZm4uYWRkUXVlcnkgPSBmdW5jdGlvbiAocSkge1xuICB0aGlzW3RoaXMubGVuZ3RoKytdID0gcTtcbn07XG5zZWxmbi5zZWxlY3RvciA9IHNlbGZuLnRvU3RyaW5nO1xuXG52YXIgZWxlc2ZuJGcgPSB7XG4gIGFsbEFyZTogZnVuY3Rpb24gYWxsQXJlKHNlbGVjdG9yKSB7XG4gICAgdmFyIHNlbE9iaiA9IG5ldyBTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgcmV0dXJuIHRoaXMuZXZlcnkoZnVuY3Rpb24gKGVsZSkge1xuICAgICAgcmV0dXJuIHNlbE9iai5tYXRjaGVzKGVsZSk7XG4gICAgfSk7XG4gIH0sXG4gIGlzOiBmdW5jdGlvbiBpcyhzZWxlY3Rvcikge1xuICAgIHZhciBzZWxPYmogPSBuZXcgU2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgIHJldHVybiB0aGlzLnNvbWUoZnVuY3Rpb24gKGVsZSkge1xuICAgICAgcmV0dXJuIHNlbE9iai5tYXRjaGVzKGVsZSk7XG4gICAgfSk7XG4gIH0sXG4gIHNvbWU6IGZ1bmN0aW9uIHNvbWUoZm4sIHRoaXNBcmcpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciByZXQgPSAhdGhpc0FyZyA/IGZuKHRoaXNbaV0sIGksIHRoaXMpIDogZm4uYXBwbHkodGhpc0FyZywgW3RoaXNbaV0sIGksIHRoaXNdKTtcbiAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgZXZlcnk6IGZ1bmN0aW9uIGV2ZXJ5KGZuLCB0aGlzQXJnKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcmV0ID0gIXRoaXNBcmcgPyBmbih0aGlzW2ldLCBpLCB0aGlzKSA6IGZuLmFwcGx5KHRoaXNBcmcsIFt0aGlzW2ldLCBpLCB0aGlzXSk7XG4gICAgICBpZiAoIXJldCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICBzYW1lOiBmdW5jdGlvbiBzYW1lKGNvbGxlY3Rpb24pIHtcbiAgICAvLyBjaGVhcCBjb2xsZWN0aW9uIHJlZiBjaGVja1xuICAgIGlmICh0aGlzID09PSBjb2xsZWN0aW9uKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29sbGVjdGlvbiA9IHRoaXMuY3koKS5jb2xsZWN0aW9uKGNvbGxlY3Rpb24pO1xuICAgIHZhciB0aGlzTGVuZ3RoID0gdGhpcy5sZW5ndGg7XG4gICAgdmFyIGNvbGxlY3Rpb25MZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDtcblxuICAgIC8vIGNoZWFwIGxlbmd0aCBjaGVja1xuICAgIGlmICh0aGlzTGVuZ3RoICE9PSBjb2xsZWN0aW9uTGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gY2hlYXAgZWxlbWVudCByZWYgY2hlY2tcbiAgICBpZiAodGhpc0xlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIHRoaXNbMF0gPT09IGNvbGxlY3Rpb25bMF07XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmV2ZXJ5KGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHJldHVybiBjb2xsZWN0aW9uLmhhc0VsZW1lbnRXaXRoSWQoZWxlLmlkKCkpO1xuICAgIH0pO1xuICB9LFxuICBhbnlTYW1lOiBmdW5jdGlvbiBhbnlTYW1lKGNvbGxlY3Rpb24pIHtcbiAgICBjb2xsZWN0aW9uID0gdGhpcy5jeSgpLmNvbGxlY3Rpb24oY29sbGVjdGlvbik7XG4gICAgcmV0dXJuIHRoaXMuc29tZShmdW5jdGlvbiAoZWxlKSB7XG4gICAgICByZXR1cm4gY29sbGVjdGlvbi5oYXNFbGVtZW50V2l0aElkKGVsZS5pZCgpKTtcbiAgICB9KTtcbiAgfSxcbiAgYWxsQXJlTmVpZ2hib3JzOiBmdW5jdGlvbiBhbGxBcmVOZWlnaGJvcnMoY29sbGVjdGlvbikge1xuICAgIGNvbGxlY3Rpb24gPSB0aGlzLmN5KCkuY29sbGVjdGlvbihjb2xsZWN0aW9uKTtcbiAgICB2YXIgbmhvb2QgPSB0aGlzLm5laWdoYm9yaG9vZCgpO1xuICAgIHJldHVybiBjb2xsZWN0aW9uLmV2ZXJ5KGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHJldHVybiBuaG9vZC5oYXNFbGVtZW50V2l0aElkKGVsZS5pZCgpKTtcbiAgICB9KTtcbiAgfSxcbiAgY29udGFpbnM6IGZ1bmN0aW9uIGNvbnRhaW5zKGNvbGxlY3Rpb24pIHtcbiAgICBjb2xsZWN0aW9uID0gdGhpcy5jeSgpLmNvbGxlY3Rpb24oY29sbGVjdGlvbik7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHJldHVybiBjb2xsZWN0aW9uLmV2ZXJ5KGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHJldHVybiBzZWxmLmhhc0VsZW1lbnRXaXRoSWQoZWxlLmlkKCkpO1xuICAgIH0pO1xuICB9XG59O1xuZWxlc2ZuJGcuYWxsQXJlTmVpZ2hib3VycyA9IGVsZXNmbiRnLmFsbEFyZU5laWdoYm9ycztcbmVsZXNmbiRnLmhhcyA9IGVsZXNmbiRnLmNvbnRhaW5zO1xuZWxlc2ZuJGcuZXF1YWwgPSBlbGVzZm4kZy5lcXVhbHMgPSBlbGVzZm4kZy5zYW1lO1xuXG52YXIgY2FjaGUgPSBmdW5jdGlvbiBjYWNoZShmbiwgbmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24gdHJhdmVyc2FsQ2FjaGUoYXJnMSwgYXJnMiwgYXJnMywgYXJnNCkge1xuICAgIHZhciBzZWxlY3Rvck9yRWxlcyA9IGFyZzE7XG4gICAgdmFyIGVsZXMgPSB0aGlzO1xuICAgIHZhciBrZXk7XG4gICAgaWYgKHNlbGVjdG9yT3JFbGVzID09IG51bGwpIHtcbiAgICAgIGtleSA9ICcnO1xuICAgIH0gZWxzZSBpZiAoZWxlbWVudE9yQ29sbGVjdGlvbihzZWxlY3Rvck9yRWxlcykgJiYgc2VsZWN0b3JPckVsZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICBrZXkgPSBzZWxlY3Rvck9yRWxlcy5pZCgpO1xuICAgIH1cbiAgICBpZiAoZWxlcy5sZW5ndGggPT09IDEgJiYga2V5KSB7XG4gICAgICB2YXIgX3AgPSBlbGVzWzBdLl9wcml2YXRlO1xuICAgICAgdmFyIHRjaCA9IF9wLnRyYXZlcnNhbENhY2hlID0gX3AudHJhdmVyc2FsQ2FjaGUgfHwge307XG4gICAgICB2YXIgY2ggPSB0Y2hbbmFtZV0gPSB0Y2hbbmFtZV0gfHwgW107XG4gICAgICB2YXIgaGFzaCA9IGhhc2hTdHJpbmcoa2V5KTtcbiAgICAgIHZhciBjYWNoZUhpdCA9IGNoW2hhc2hdO1xuICAgICAgaWYgKGNhY2hlSGl0KSB7XG4gICAgICAgIHJldHVybiBjYWNoZUhpdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBjaFtoYXNoXSA9IGZuLmNhbGwoZWxlcywgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKGVsZXMsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQpO1xuICAgIH1cbiAgfTtcbn07XG5cbnZhciBlbGVzZm4kZiA9IHtcbiAgcGFyZW50OiBmdW5jdGlvbiBwYXJlbnQoc2VsZWN0b3IpIHtcbiAgICB2YXIgcGFyZW50cyA9IFtdO1xuXG4gICAgLy8gb3B0aW1pc2F0aW9uIGZvciBzaW5nbGUgZWxlIGNhbGxcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHZhciBwYXJlbnQgPSB0aGlzWzBdLl9wcml2YXRlLnBhcmVudDtcbiAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgcmV0dXJuIHBhcmVudDtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICAgIHZhciBfcGFyZW50ID0gZWxlLl9wcml2YXRlLnBhcmVudDtcbiAgICAgIGlmIChfcGFyZW50KSB7XG4gICAgICAgIHBhcmVudHMucHVzaChfcGFyZW50KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3Bhd24ocGFyZW50cywgdHJ1ZSkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfSxcbiAgcGFyZW50czogZnVuY3Rpb24gcGFyZW50cyhzZWxlY3Rvcikge1xuICAgIHZhciBwYXJlbnRzID0gW107XG4gICAgdmFyIGVsZXMgPSB0aGlzLnBhcmVudCgpO1xuICAgIHdoaWxlIChlbGVzLm5vbmVtcHR5KCkpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICAgICAgcGFyZW50cy5wdXNoKGVsZSk7XG4gICAgICB9XG4gICAgICBlbGVzID0gZWxlcy5wYXJlbnQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3Bhd24ocGFyZW50cywgdHJ1ZSkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfSxcbiAgY29tbW9uQW5jZXN0b3JzOiBmdW5jdGlvbiBjb21tb25BbmNlc3RvcnMoc2VsZWN0b3IpIHtcbiAgICB2YXIgYW5jZXN0b3JzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IHRoaXNbaV07XG4gICAgICB2YXIgcGFyZW50cyA9IGVsZS5wYXJlbnRzKCk7XG4gICAgICBhbmNlc3RvcnMgPSBhbmNlc3RvcnMgfHwgcGFyZW50cztcbiAgICAgIGFuY2VzdG9ycyA9IGFuY2VzdG9ycy5pbnRlcnNlY3QocGFyZW50cyk7IC8vIGN1cnJlbnQgbGlzdCBtdXN0IGJlIGNvbW1vbiB3aXRoIGN1cnJlbnQgZWxlIHBhcmVudHMgc2V0XG4gICAgfVxuICAgIHJldHVybiBhbmNlc3RvcnMuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfSxcbiAgb3JwaGFuczogZnVuY3Rpb24gb3JwaGFucyhzZWxlY3Rvcikge1xuICAgIHJldHVybiB0aGlzLnN0ZEZpbHRlcihmdW5jdGlvbiAoZWxlKSB7XG4gICAgICByZXR1cm4gZWxlLmlzT3JwaGFuKCk7XG4gICAgfSkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfSxcbiAgbm9ub3JwaGFuczogZnVuY3Rpb24gbm9ub3JwaGFucyhzZWxlY3Rvcikge1xuICAgIHJldHVybiB0aGlzLnN0ZEZpbHRlcihmdW5jdGlvbiAoZWxlKSB7XG4gICAgICByZXR1cm4gZWxlLmlzQ2hpbGQoKTtcbiAgICB9KS5maWx0ZXIoc2VsZWN0b3IpO1xuICB9LFxuICBjaGlsZHJlbjogY2FjaGUoZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICAgIHZhciBlbGVDaGlsZHJlbiA9IGVsZS5fcHJpdmF0ZS5jaGlsZHJlbjtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZWxlQ2hpbGRyZW4ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgY2hpbGRyZW4ucHVzaChlbGVDaGlsZHJlbltqXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNwYXduKGNoaWxkcmVuLCB0cnVlKS5maWx0ZXIoc2VsZWN0b3IpO1xuICB9LCAnY2hpbGRyZW4nKSxcbiAgc2libGluZ3M6IGZ1bmN0aW9uIHNpYmxpbmdzKHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50KCkuY2hpbGRyZW4oKS5ub3QodGhpcykuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfSxcbiAgaXNQYXJlbnQ6IGZ1bmN0aW9uIGlzUGFyZW50KCkge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIGlmIChlbGUpIHtcbiAgICAgIHJldHVybiBlbGUuaXNOb2RlKCkgJiYgZWxlLl9wcml2YXRlLmNoaWxkcmVuLmxlbmd0aCAhPT0gMDtcbiAgICB9XG4gIH0sXG4gIGlzQ2hpbGRsZXNzOiBmdW5jdGlvbiBpc0NoaWxkbGVzcygpIHtcbiAgICB2YXIgZWxlID0gdGhpc1swXTtcbiAgICBpZiAoZWxlKSB7XG4gICAgICByZXR1cm4gZWxlLmlzTm9kZSgpICYmIGVsZS5fcHJpdmF0ZS5jaGlsZHJlbi5sZW5ndGggPT09IDA7XG4gICAgfVxuICB9LFxuICBpc0NoaWxkOiBmdW5jdGlvbiBpc0NoaWxkKCkge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIGlmIChlbGUpIHtcbiAgICAgIHJldHVybiBlbGUuaXNOb2RlKCkgJiYgZWxlLl9wcml2YXRlLnBhcmVudCAhPSBudWxsO1xuICAgIH1cbiAgfSxcbiAgaXNPcnBoYW46IGZ1bmN0aW9uIGlzT3JwaGFuKCkge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIGlmIChlbGUpIHtcbiAgICAgIHJldHVybiBlbGUuaXNOb2RlKCkgJiYgZWxlLl9wcml2YXRlLnBhcmVudCA9PSBudWxsO1xuICAgIH1cbiAgfSxcbiAgZGVzY2VuZGFudHM6IGZ1bmN0aW9uIGRlc2NlbmRhbnRzKHNlbGVjdG9yKSB7XG4gICAgdmFyIGVsZW1lbnRzID0gW107XG4gICAgZnVuY3Rpb24gYWRkKGVsZXMpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICAgICAgZWxlbWVudHMucHVzaChlbGUpO1xuICAgICAgICBpZiAoZWxlLmNoaWxkcmVuKCkubm9uZW1wdHkoKSkge1xuICAgICAgICAgIGFkZChlbGUuY2hpbGRyZW4oKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgYWRkKHRoaXMuY2hpbGRyZW4oKSk7XG4gICAgcmV0dXJuIHRoaXMuc3Bhd24oZWxlbWVudHMsIHRydWUpLmZpbHRlcihzZWxlY3Rvcik7XG4gIH1cbn07XG5mdW5jdGlvbiBmb3JFYWNoQ29tcG91bmQoZWxlcywgZm4sIGluY2x1ZGVTZWxmLCByZWN1cnNpdmVTdGVwKSB7XG4gIHZhciBxID0gW107XG4gIHZhciBkaWQgPSBuZXcgU2V0JDEoKTtcbiAgdmFyIGN5ID0gZWxlcy5jeSgpO1xuICB2YXIgaGFzQ29tcG91bmRzID0gY3kuaGFzQ29tcG91bmROb2RlcygpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICBpZiAoaW5jbHVkZVNlbGYpIHtcbiAgICAgIHEucHVzaChlbGUpO1xuICAgIH0gZWxzZSBpZiAoaGFzQ29tcG91bmRzKSB7XG4gICAgICByZWN1cnNpdmVTdGVwKHEsIGRpZCwgZWxlKTtcbiAgICB9XG4gIH1cbiAgd2hpbGUgKHEubGVuZ3RoID4gMCkge1xuICAgIHZhciBfZWxlID0gcS5zaGlmdCgpO1xuICAgIGZuKF9lbGUpO1xuICAgIGRpZC5hZGQoX2VsZS5pZCgpKTtcbiAgICBpZiAoaGFzQ29tcG91bmRzKSB7XG4gICAgICByZWN1cnNpdmVTdGVwKHEsIGRpZCwgX2VsZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBlbGVzO1xufVxuZnVuY3Rpb24gYWRkQ2hpbGRyZW4ocSwgZGlkLCBlbGUpIHtcbiAgaWYgKGVsZS5pc1BhcmVudCgpKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gZWxlLl9wcml2YXRlLmNoaWxkcmVuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgICAgaWYgKCFkaWQuaGFzKGNoaWxkLmlkKCkpKSB7XG4gICAgICAgIHEucHVzaChjaGlsZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8vIHZlcnkgZWZmaWNpZW50IHZlcnNpb24gb2YgZWxlcy5hZGQoIGVsZXMuZGVzY2VuZGFudHMoKSApLmZvckVhY2goKVxuLy8gZm9yIGludGVybmFsIHVzZVxuZWxlc2ZuJGYuZm9yRWFjaERvd24gPSBmdW5jdGlvbiAoZm4pIHtcbiAgdmFyIGluY2x1ZGVTZWxmID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB0cnVlO1xuICByZXR1cm4gZm9yRWFjaENvbXBvdW5kKHRoaXMsIGZuLCBpbmNsdWRlU2VsZiwgYWRkQ2hpbGRyZW4pO1xufTtcbmZ1bmN0aW9uIGFkZFBhcmVudChxLCBkaWQsIGVsZSkge1xuICBpZiAoZWxlLmlzQ2hpbGQoKSkge1xuICAgIHZhciBwYXJlbnQgPSBlbGUuX3ByaXZhdGUucGFyZW50O1xuICAgIGlmICghZGlkLmhhcyhwYXJlbnQuaWQoKSkpIHtcbiAgICAgIHEucHVzaChwYXJlbnQpO1xuICAgIH1cbiAgfVxufVxuZWxlc2ZuJGYuZm9yRWFjaFVwID0gZnVuY3Rpb24gKGZuKSB7XG4gIHZhciBpbmNsdWRlU2VsZiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdHJ1ZTtcbiAgcmV0dXJuIGZvckVhY2hDb21wb3VuZCh0aGlzLCBmbiwgaW5jbHVkZVNlbGYsIGFkZFBhcmVudCk7XG59O1xuZnVuY3Rpb24gYWRkUGFyZW50QW5kQ2hpbGRyZW4ocSwgZGlkLCBlbGUpIHtcbiAgYWRkUGFyZW50KHEsIGRpZCwgZWxlKTtcbiAgYWRkQ2hpbGRyZW4ocSwgZGlkLCBlbGUpO1xufVxuZWxlc2ZuJGYuZm9yRWFjaFVwQW5kRG93biA9IGZ1bmN0aW9uIChmbikge1xuICB2YXIgaW5jbHVkZVNlbGYgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHRydWU7XG4gIHJldHVybiBmb3JFYWNoQ29tcG91bmQodGhpcywgZm4sIGluY2x1ZGVTZWxmLCBhZGRQYXJlbnRBbmRDaGlsZHJlbik7XG59O1xuXG4vLyBhbGlhc2VzXG5lbGVzZm4kZi5hbmNlc3RvcnMgPSBlbGVzZm4kZi5wYXJlbnRzO1xuXG52YXIgZm4kNSwgZWxlc2ZuJGU7XG5mbiQ1ID0gZWxlc2ZuJGUgPSB7XG4gIGRhdGE6IGRlZmluZS5kYXRhKHtcbiAgICBmaWVsZDogJ2RhdGEnLFxuICAgIGJpbmRpbmdFdmVudDogJ2RhdGEnLFxuICAgIGFsbG93QmluZGluZzogdHJ1ZSxcbiAgICBhbGxvd1NldHRpbmc6IHRydWUsXG4gICAgc2V0dGluZ0V2ZW50OiAnZGF0YScsXG4gICAgc2V0dGluZ1RyaWdnZXJzRXZlbnQ6IHRydWUsXG4gICAgdHJpZ2dlckZuTmFtZTogJ3RyaWdnZXInLFxuICAgIGFsbG93R2V0dGluZzogdHJ1ZSxcbiAgICBpbW11dGFibGVLZXlzOiB7XG4gICAgICAnaWQnOiB0cnVlLFxuICAgICAgJ3NvdXJjZSc6IHRydWUsXG4gICAgICAndGFyZ2V0JzogdHJ1ZSxcbiAgICAgICdwYXJlbnQnOiB0cnVlXG4gICAgfSxcbiAgICB1cGRhdGVTdHlsZTogdHJ1ZVxuICB9KSxcbiAgcmVtb3ZlRGF0YTogZGVmaW5lLnJlbW92ZURhdGEoe1xuICAgIGZpZWxkOiAnZGF0YScsXG4gICAgZXZlbnQ6ICdkYXRhJyxcbiAgICB0cmlnZ2VyRm5OYW1lOiAndHJpZ2dlcicsXG4gICAgdHJpZ2dlckV2ZW50OiB0cnVlLFxuICAgIGltbXV0YWJsZUtleXM6IHtcbiAgICAgICdpZCc6IHRydWUsXG4gICAgICAnc291cmNlJzogdHJ1ZSxcbiAgICAgICd0YXJnZXQnOiB0cnVlLFxuICAgICAgJ3BhcmVudCc6IHRydWVcbiAgICB9LFxuICAgIHVwZGF0ZVN0eWxlOiB0cnVlXG4gIH0pLFxuICBzY3JhdGNoOiBkZWZpbmUuZGF0YSh7XG4gICAgZmllbGQ6ICdzY3JhdGNoJyxcbiAgICBiaW5kaW5nRXZlbnQ6ICdzY3JhdGNoJyxcbiAgICBhbGxvd0JpbmRpbmc6IHRydWUsXG4gICAgYWxsb3dTZXR0aW5nOiB0cnVlLFxuICAgIHNldHRpbmdFdmVudDogJ3NjcmF0Y2gnLFxuICAgIHNldHRpbmdUcmlnZ2Vyc0V2ZW50OiB0cnVlLFxuICAgIHRyaWdnZXJGbk5hbWU6ICd0cmlnZ2VyJyxcbiAgICBhbGxvd0dldHRpbmc6IHRydWUsXG4gICAgdXBkYXRlU3R5bGU6IHRydWVcbiAgfSksXG4gIHJlbW92ZVNjcmF0Y2g6IGRlZmluZS5yZW1vdmVEYXRhKHtcbiAgICBmaWVsZDogJ3NjcmF0Y2gnLFxuICAgIGV2ZW50OiAnc2NyYXRjaCcsXG4gICAgdHJpZ2dlckZuTmFtZTogJ3RyaWdnZXInLFxuICAgIHRyaWdnZXJFdmVudDogdHJ1ZSxcbiAgICB1cGRhdGVTdHlsZTogdHJ1ZVxuICB9KSxcbiAgcnNjcmF0Y2g6IGRlZmluZS5kYXRhKHtcbiAgICBmaWVsZDogJ3JzY3JhdGNoJyxcbiAgICBhbGxvd0JpbmRpbmc6IGZhbHNlLFxuICAgIGFsbG93U2V0dGluZzogdHJ1ZSxcbiAgICBzZXR0aW5nVHJpZ2dlcnNFdmVudDogZmFsc2UsXG4gICAgYWxsb3dHZXR0aW5nOiB0cnVlXG4gIH0pLFxuICByZW1vdmVSc2NyYXRjaDogZGVmaW5lLnJlbW92ZURhdGEoe1xuICAgIGZpZWxkOiAncnNjcmF0Y2gnLFxuICAgIHRyaWdnZXJFdmVudDogZmFsc2VcbiAgfSksXG4gIGlkOiBmdW5jdGlvbiBpZCgpIHtcbiAgICB2YXIgZWxlID0gdGhpc1swXTtcbiAgICBpZiAoZWxlKSB7XG4gICAgICByZXR1cm4gZWxlLl9wcml2YXRlLmRhdGEuaWQ7XG4gICAgfVxuICB9XG59O1xuXG4vLyBhbGlhc2VzXG5mbiQ1LmF0dHIgPSBmbiQ1LmRhdGE7XG5mbiQ1LnJlbW92ZUF0dHIgPSBmbiQ1LnJlbW92ZURhdGE7XG52YXIgZGF0YSA9IGVsZXNmbiRlO1xuXG52YXIgZWxlc2ZuJGQgPSB7fTtcbmZ1bmN0aW9uIGRlZmluZURlZ3JlZUZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoaW5jbHVkZUxvb3BzKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmIChpbmNsdWRlTG9vcHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaW5jbHVkZUxvb3BzID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHNlbGYubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzZWxmLmlzTm9kZSgpICYmICFzZWxmLnJlbW92ZWQoKSkge1xuICAgICAgdmFyIGRlZ3JlZSA9IDA7XG4gICAgICB2YXIgbm9kZSA9IHNlbGZbMF07XG4gICAgICB2YXIgY29ubmVjdGVkRWRnZXMgPSBub2RlLl9wcml2YXRlLmVkZ2VzO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25uZWN0ZWRFZGdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWRnZSA9IGNvbm5lY3RlZEVkZ2VzW2ldO1xuICAgICAgICBpZiAoIWluY2x1ZGVMb29wcyAmJiBlZGdlLmlzTG9vcCgpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgZGVncmVlICs9IGNhbGxiYWNrKG5vZGUsIGVkZ2UpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRlZ3JlZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfTtcbn1cbmV4dGVuZChlbGVzZm4kZCwge1xuICBkZWdyZWU6IGRlZmluZURlZ3JlZUZ1bmN0aW9uKGZ1bmN0aW9uIChub2RlLCBlZGdlKSB7XG4gICAgaWYgKGVkZ2Uuc291cmNlKCkuc2FtZShlZGdlLnRhcmdldCgpKSkge1xuICAgICAgcmV0dXJuIDI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgfSksXG4gIGluZGVncmVlOiBkZWZpbmVEZWdyZWVGdW5jdGlvbihmdW5jdGlvbiAobm9kZSwgZWRnZSkge1xuICAgIGlmIChlZGdlLnRhcmdldCgpLnNhbWUobm9kZSkpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gIH0pLFxuICBvdXRkZWdyZWU6IGRlZmluZURlZ3JlZUZ1bmN0aW9uKGZ1bmN0aW9uIChub2RlLCBlZGdlKSB7XG4gICAgaWYgKGVkZ2Uuc291cmNlKCkuc2FtZShub2RlKSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgfSlcbn0pO1xuZnVuY3Rpb24gZGVmaW5lRGVncmVlQm91bmRzRnVuY3Rpb24oZGVncmVlRm4sIGNhbGxiYWNrKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoaW5jbHVkZUxvb3BzKSB7XG4gICAgdmFyIHJldDtcbiAgICB2YXIgbm9kZXMgPSB0aGlzLm5vZGVzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IG5vZGVzW2ldO1xuICAgICAgdmFyIGRlZ3JlZSA9IGVsZVtkZWdyZWVGbl0oaW5jbHVkZUxvb3BzKTtcbiAgICAgIGlmIChkZWdyZWUgIT09IHVuZGVmaW5lZCAmJiAocmV0ID09PSB1bmRlZmluZWQgfHwgY2FsbGJhY2soZGVncmVlLCByZXQpKSkge1xuICAgICAgICByZXQgPSBkZWdyZWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH07XG59XG5leHRlbmQoZWxlc2ZuJGQsIHtcbiAgbWluRGVncmVlOiBkZWZpbmVEZWdyZWVCb3VuZHNGdW5jdGlvbignZGVncmVlJywgZnVuY3Rpb24gKGRlZ3JlZSwgbWluKSB7XG4gICAgcmV0dXJuIGRlZ3JlZSA8IG1pbjtcbiAgfSksXG4gIG1heERlZ3JlZTogZGVmaW5lRGVncmVlQm91bmRzRnVuY3Rpb24oJ2RlZ3JlZScsIGZ1bmN0aW9uIChkZWdyZWUsIG1heCkge1xuICAgIHJldHVybiBkZWdyZWUgPiBtYXg7XG4gIH0pLFxuICBtaW5JbmRlZ3JlZTogZGVmaW5lRGVncmVlQm91bmRzRnVuY3Rpb24oJ2luZGVncmVlJywgZnVuY3Rpb24gKGRlZ3JlZSwgbWluKSB7XG4gICAgcmV0dXJuIGRlZ3JlZSA8IG1pbjtcbiAgfSksXG4gIG1heEluZGVncmVlOiBkZWZpbmVEZWdyZWVCb3VuZHNGdW5jdGlvbignaW5kZWdyZWUnLCBmdW5jdGlvbiAoZGVncmVlLCBtYXgpIHtcbiAgICByZXR1cm4gZGVncmVlID4gbWF4O1xuICB9KSxcbiAgbWluT3V0ZGVncmVlOiBkZWZpbmVEZWdyZWVCb3VuZHNGdW5jdGlvbignb3V0ZGVncmVlJywgZnVuY3Rpb24gKGRlZ3JlZSwgbWluKSB7XG4gICAgcmV0dXJuIGRlZ3JlZSA8IG1pbjtcbiAgfSksXG4gIG1heE91dGRlZ3JlZTogZGVmaW5lRGVncmVlQm91bmRzRnVuY3Rpb24oJ291dGRlZ3JlZScsIGZ1bmN0aW9uIChkZWdyZWUsIG1heCkge1xuICAgIHJldHVybiBkZWdyZWUgPiBtYXg7XG4gIH0pXG59KTtcbmV4dGVuZChlbGVzZm4kZCwge1xuICB0b3RhbERlZ3JlZTogZnVuY3Rpb24gdG90YWxEZWdyZWUoaW5jbHVkZUxvb3BzKSB7XG4gICAgdmFyIHRvdGFsID0gMDtcbiAgICB2YXIgbm9kZXMgPSB0aGlzLm5vZGVzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdG90YWwgKz0gbm9kZXNbaV0uZGVncmVlKGluY2x1ZGVMb29wcyk7XG4gICAgfVxuICAgIHJldHVybiB0b3RhbDtcbiAgfVxufSk7XG5cbnZhciBmbiQ0LCBlbGVzZm4kYztcbnZhciBiZWZvcmVQb3NpdGlvblNldCA9IGZ1bmN0aW9uIGJlZm9yZVBvc2l0aW9uU2V0KGVsZXMsIG5ld1Bvcywgc2lsZW50KSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgIGlmICghZWxlLmxvY2tlZCgpKSB7XG4gICAgICB2YXIgb2xkUG9zID0gZWxlLl9wcml2YXRlLnBvc2l0aW9uO1xuICAgICAgdmFyIGRlbHRhID0ge1xuICAgICAgICB4OiBuZXdQb3MueCAhPSBudWxsID8gbmV3UG9zLnggLSBvbGRQb3MueCA6IDAsXG4gICAgICAgIHk6IG5ld1Bvcy55ICE9IG51bGwgPyBuZXdQb3MueSAtIG9sZFBvcy55IDogMFxuICAgICAgfTtcbiAgICAgIGlmIChlbGUuaXNQYXJlbnQoKSAmJiAhKGRlbHRhLnggPT09IDAgJiYgZGVsdGEueSA9PT0gMCkpIHtcbiAgICAgICAgZWxlLmNoaWxkcmVuKCkuc2hpZnQoZGVsdGEsIHNpbGVudCk7XG4gICAgICB9XG4gICAgICBlbGUuZGlydHlCb3VuZGluZ0JveENhY2hlKCk7XG4gICAgfVxuICB9XG59O1xudmFyIHBvc2l0aW9uRGVmID0ge1xuICBmaWVsZDogJ3Bvc2l0aW9uJyxcbiAgYmluZGluZ0V2ZW50OiAncG9zaXRpb24nLFxuICBhbGxvd0JpbmRpbmc6IHRydWUsXG4gIGFsbG93U2V0dGluZzogdHJ1ZSxcbiAgc2V0dGluZ0V2ZW50OiAncG9zaXRpb24nLFxuICBzZXR0aW5nVHJpZ2dlcnNFdmVudDogdHJ1ZSxcbiAgdHJpZ2dlckZuTmFtZTogJ2VtaXRBbmROb3RpZnknLFxuICBhbGxvd0dldHRpbmc6IHRydWUsXG4gIHZhbGlkS2V5czogWyd4JywgJ3knXSxcbiAgYmVmb3JlR2V0OiBmdW5jdGlvbiBiZWZvcmVHZXQoZWxlKSB7XG4gICAgZWxlLnVwZGF0ZUNvbXBvdW5kQm91bmRzKCk7XG4gIH0sXG4gIGJlZm9yZVNldDogZnVuY3Rpb24gYmVmb3JlU2V0KGVsZXMsIG5ld1Bvcykge1xuICAgIGJlZm9yZVBvc2l0aW9uU2V0KGVsZXMsIG5ld1BvcywgZmFsc2UpO1xuICB9LFxuICBvblNldDogZnVuY3Rpb24gb25TZXQoZWxlcykge1xuICAgIGVsZXMuZGlydHlDb21wb3VuZEJvdW5kc0NhY2hlKCk7XG4gIH0sXG4gIGNhblNldDogZnVuY3Rpb24gY2FuU2V0KGVsZSkge1xuICAgIHJldHVybiAhZWxlLmxvY2tlZCgpO1xuICB9XG59O1xuZm4kNCA9IGVsZXNmbiRjID0ge1xuICBwb3NpdGlvbjogZGVmaW5lLmRhdGEocG9zaXRpb25EZWYpLFxuICAvLyBwb3NpdGlvbiBidXQgbm8gbm90aWZpY2F0aW9uIHRvIHJlbmRlcmVyXG4gIHNpbGVudFBvc2l0aW9uOiBkZWZpbmUuZGF0YShleHRlbmQoe30sIHBvc2l0aW9uRGVmLCB7XG4gICAgYWxsb3dCaW5kaW5nOiBmYWxzZSxcbiAgICBhbGxvd1NldHRpbmc6IHRydWUsXG4gICAgc2V0dGluZ1RyaWdnZXJzRXZlbnQ6IGZhbHNlLFxuICAgIGFsbG93R2V0dGluZzogZmFsc2UsXG4gICAgYmVmb3JlU2V0OiBmdW5jdGlvbiBiZWZvcmVTZXQoZWxlcywgbmV3UG9zKSB7XG4gICAgICBiZWZvcmVQb3NpdGlvblNldChlbGVzLCBuZXdQb3MsIHRydWUpO1xuICAgIH0sXG4gICAgb25TZXQ6IGZ1bmN0aW9uIG9uU2V0KGVsZXMpIHtcbiAgICAgIGVsZXMuZGlydHlDb21wb3VuZEJvdW5kc0NhY2hlKCk7XG4gICAgfVxuICB9KSksXG4gIHBvc2l0aW9uczogZnVuY3Rpb24gcG9zaXRpb25zKHBvcywgc2lsZW50KSB7XG4gICAgaWYgKHBsYWluT2JqZWN0KHBvcykpIHtcbiAgICAgIGlmIChzaWxlbnQpIHtcbiAgICAgICAgdGhpcy5zaWxlbnRQb3NpdGlvbihwb3MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wb3NpdGlvbihwb3MpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZm4kNihwb3MpKSB7XG4gICAgICB2YXIgX2ZuID0gcG9zO1xuICAgICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgICAgY3kuc3RhcnRCYXRjaCgpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBlbGUgPSB0aGlzW2ldO1xuICAgICAgICB2YXIgX3BvcyA9IHZvaWQgMDtcbiAgICAgICAgaWYgKF9wb3MgPSBfZm4oZWxlLCBpKSkge1xuICAgICAgICAgIGlmIChzaWxlbnQpIHtcbiAgICAgICAgICAgIGVsZS5zaWxlbnRQb3NpdGlvbihfcG9zKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZWxlLnBvc2l0aW9uKF9wb3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY3kuZW5kQmF0Y2goKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG4gIHNpbGVudFBvc2l0aW9uczogZnVuY3Rpb24gc2lsZW50UG9zaXRpb25zKHBvcykge1xuICAgIHJldHVybiB0aGlzLnBvc2l0aW9ucyhwb3MsIHRydWUpO1xuICB9LFxuICBzaGlmdDogZnVuY3Rpb24gc2hpZnQoZGltLCB2YWwsIHNpbGVudCkge1xuICAgIHZhciBkZWx0YTtcbiAgICBpZiAocGxhaW5PYmplY3QoZGltKSkge1xuICAgICAgZGVsdGEgPSB7XG4gICAgICAgIHg6IG51bWJlciQxKGRpbS54KSA/IGRpbS54IDogMCxcbiAgICAgICAgeTogbnVtYmVyJDEoZGltLnkpID8gZGltLnkgOiAwXG4gICAgICB9O1xuICAgICAgc2lsZW50ID0gdmFsO1xuICAgIH0gZWxzZSBpZiAoc3RyaW5nKGRpbSkgJiYgbnVtYmVyJDEodmFsKSkge1xuICAgICAgZGVsdGEgPSB7XG4gICAgICAgIHg6IDAsXG4gICAgICAgIHk6IDBcbiAgICAgIH07XG4gICAgICBkZWx0YVtkaW1dID0gdmFsO1xuICAgIH1cbiAgICBpZiAoZGVsdGEgIT0gbnVsbCkge1xuICAgICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgICAgY3kuc3RhcnRCYXRjaCgpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBlbGUgPSB0aGlzW2ldO1xuXG4gICAgICAgIC8vIGV4Y2x1ZGUgYW55IG5vZGUgdGhhdCBpcyBhIGRlc2NlbmRhbnQgb2YgdGhlIGNhbGxpbmcgY29sbGVjdGlvblxuICAgICAgICBpZiAoY3kuaGFzQ29tcG91bmROb2RlcygpICYmIGVsZS5pc0NoaWxkKCkgJiYgZWxlLmFuY2VzdG9ycygpLmFueVNhbWUodGhpcykpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcG9zID0gZWxlLnBvc2l0aW9uKCk7XG4gICAgICAgIHZhciBuZXdQb3MgPSB7XG4gICAgICAgICAgeDogcG9zLnggKyBkZWx0YS54LFxuICAgICAgICAgIHk6IHBvcy55ICsgZGVsdGEueVxuICAgICAgICB9O1xuICAgICAgICBpZiAoc2lsZW50KSB7XG4gICAgICAgICAgZWxlLnNpbGVudFBvc2l0aW9uKG5ld1Bvcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZWxlLnBvc2l0aW9uKG5ld1Bvcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGN5LmVuZEJhdGNoKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBzaWxlbnRTaGlmdDogZnVuY3Rpb24gc2lsZW50U2hpZnQoZGltLCB2YWwpIHtcbiAgICBpZiAocGxhaW5PYmplY3QoZGltKSkge1xuICAgICAgdGhpcy5zaGlmdChkaW0sIHRydWUpO1xuICAgIH0gZWxzZSBpZiAoc3RyaW5nKGRpbSkgJiYgbnVtYmVyJDEodmFsKSkge1xuICAgICAgdGhpcy5zaGlmdChkaW0sIHZhbCwgdHJ1ZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICAvLyBnZXQvc2V0IHRoZSByZW5kZXJlZCAoaS5lLiBvbiBzY3JlZW4pIHBvc2l0b24gb2YgdGhlIGVsZW1lbnRcbiAgcmVuZGVyZWRQb3NpdGlvbjogZnVuY3Rpb24gcmVuZGVyZWRQb3NpdGlvbihkaW0sIHZhbCkge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgICB2YXIgem9vbSA9IGN5Lnpvb20oKTtcbiAgICB2YXIgcGFuID0gY3kucGFuKCk7XG4gICAgdmFyIHJwb3MgPSBwbGFpbk9iamVjdChkaW0pID8gZGltIDogdW5kZWZpbmVkO1xuICAgIHZhciBzZXR0aW5nID0gcnBvcyAhPT0gdW5kZWZpbmVkIHx8IHZhbCAhPT0gdW5kZWZpbmVkICYmIHN0cmluZyhkaW0pO1xuICAgIGlmIChlbGUgJiYgZWxlLmlzTm9kZSgpKSB7XG4gICAgICAvLyBtdXN0IGhhdmUgYW4gZWxlbWVudCBhbmQgbXVzdCBiZSBhIG5vZGUgdG8gcmV0dXJuIHBvc2l0aW9uXG4gICAgICBpZiAoc2V0dGluZykge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgX2VsZSA9IHRoaXNbaV07XG4gICAgICAgICAgaWYgKHZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBzZXQgb25lIGRpbWVuc2lvblxuICAgICAgICAgICAgX2VsZS5wb3NpdGlvbihkaW0sICh2YWwgLSBwYW5bZGltXSkgLyB6b29tKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHJwb3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gc2V0IHdob2xlIHBvc2l0aW9uXG4gICAgICAgICAgICBfZWxlLnBvc2l0aW9uKHJlbmRlcmVkVG9Nb2RlbFBvc2l0aW9uKHJwb3MsIHpvb20sIHBhbikpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZ2V0dGluZ1xuICAgICAgICB2YXIgcG9zID0gZWxlLnBvc2l0aW9uKCk7XG4gICAgICAgIHJwb3MgPSBtb2RlbFRvUmVuZGVyZWRQb3NpdGlvbiQxKHBvcywgem9vbSwgcGFuKTtcbiAgICAgICAgaWYgKGRpbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gdGhlbiByZXR1cm4gdGhlIHdob2xlIHJlbmRlcmVkIHBvc2l0aW9uXG4gICAgICAgICAgcmV0dXJuIHJwb3M7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gdGhlbiByZXR1cm4gdGhlIHNwZWNpZmllZCBkaW1lbnNpb25cbiAgICAgICAgICByZXR1cm4gcnBvc1tkaW1dO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghc2V0dGluZykge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDsgLy8gZm9yIGVtcHR5IGNvbGxlY3Rpb24gY2FzZVxuICAgIH1cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcbiAgLy8gZ2V0L3NldCB0aGUgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIHBhcmVudFxuICByZWxhdGl2ZVBvc2l0aW9uOiBmdW5jdGlvbiByZWxhdGl2ZVBvc2l0aW9uKGRpbSwgdmFsKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgIHZhciBwcG9zID0gcGxhaW5PYmplY3QoZGltKSA/IGRpbSA6IHVuZGVmaW5lZDtcbiAgICB2YXIgc2V0dGluZyA9IHBwb3MgIT09IHVuZGVmaW5lZCB8fCB2YWwgIT09IHVuZGVmaW5lZCAmJiBzdHJpbmcoZGltKTtcbiAgICB2YXIgaGFzQ29tcG91bmROb2RlcyA9IGN5Lmhhc0NvbXBvdW5kTm9kZXMoKTtcbiAgICBpZiAoZWxlICYmIGVsZS5pc05vZGUoKSkge1xuICAgICAgLy8gbXVzdCBoYXZlIGFuIGVsZW1lbnQgYW5kIG11c3QgYmUgYSBub2RlIHRvIHJldHVybiBwb3NpdGlvblxuICAgICAgaWYgKHNldHRpbmcpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIF9lbGUyID0gdGhpc1tpXTtcbiAgICAgICAgICB2YXIgcGFyZW50ID0gaGFzQ29tcG91bmROb2RlcyA/IF9lbGUyLnBhcmVudCgpIDogbnVsbDtcbiAgICAgICAgICB2YXIgaGFzUGFyZW50ID0gcGFyZW50ICYmIHBhcmVudC5sZW5ndGggPiAwO1xuICAgICAgICAgIHZhciByZWxhdGl2ZVRvUGFyZW50ID0gaGFzUGFyZW50O1xuICAgICAgICAgIGlmIChoYXNQYXJlbnQpIHtcbiAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudFswXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIG9yaWdpbiA9IHJlbGF0aXZlVG9QYXJlbnQgPyBwYXJlbnQucG9zaXRpb24oKSA6IHtcbiAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICB5OiAwXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAodmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHNldCBvbmUgZGltZW5zaW9uXG4gICAgICAgICAgICBfZWxlMi5wb3NpdGlvbihkaW0sIHZhbCArIG9yaWdpbltkaW1dKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHBwb3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gc2V0IHdob2xlIHBvc2l0aW9uXG4gICAgICAgICAgICBfZWxlMi5wb3NpdGlvbih7XG4gICAgICAgICAgICAgIHg6IHBwb3MueCArIG9yaWdpbi54LFxuICAgICAgICAgICAgICB5OiBwcG9zLnkgKyBvcmlnaW4ueVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBnZXR0aW5nXG4gICAgICAgIHZhciBwb3MgPSBlbGUucG9zaXRpb24oKTtcbiAgICAgICAgdmFyIF9wYXJlbnQgPSBoYXNDb21wb3VuZE5vZGVzID8gZWxlLnBhcmVudCgpIDogbnVsbDtcbiAgICAgICAgdmFyIF9oYXNQYXJlbnQgPSBfcGFyZW50ICYmIF9wYXJlbnQubGVuZ3RoID4gMDtcbiAgICAgICAgdmFyIF9yZWxhdGl2ZVRvUGFyZW50ID0gX2hhc1BhcmVudDtcbiAgICAgICAgaWYgKF9oYXNQYXJlbnQpIHtcbiAgICAgICAgICBfcGFyZW50ID0gX3BhcmVudFswXTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgX29yaWdpbiA9IF9yZWxhdGl2ZVRvUGFyZW50ID8gX3BhcmVudC5wb3NpdGlvbigpIDoge1xuICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgeTogMFxuICAgICAgICB9O1xuICAgICAgICBwcG9zID0ge1xuICAgICAgICAgIHg6IHBvcy54IC0gX29yaWdpbi54LFxuICAgICAgICAgIHk6IHBvcy55IC0gX29yaWdpbi55XG4gICAgICAgIH07XG4gICAgICAgIGlmIChkaW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIHRoZW4gcmV0dXJuIHRoZSB3aG9sZSByZW5kZXJlZCBwb3NpdGlvblxuICAgICAgICAgIHJldHVybiBwcG9zO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHRoZW4gcmV0dXJuIHRoZSBzcGVjaWZpZWQgZGltZW5zaW9uXG4gICAgICAgICAgcmV0dXJuIHBwb3NbZGltXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIXNldHRpbmcpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7IC8vIGZvciBlbXB0eSBjb2xsZWN0aW9uIGNhc2VcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH1cbn07XG5cbi8vIGFsaWFzZXNcbmZuJDQubW9kZWxQb3NpdGlvbiA9IGZuJDQucG9pbnQgPSBmbiQ0LnBvc2l0aW9uO1xuZm4kNC5tb2RlbFBvc2l0aW9ucyA9IGZuJDQucG9pbnRzID0gZm4kNC5wb3NpdGlvbnM7XG5mbiQ0LnJlbmRlcmVkUG9pbnQgPSBmbiQ0LnJlbmRlcmVkUG9zaXRpb247XG5mbiQ0LnJlbGF0aXZlUG9pbnQgPSBmbiQ0LnJlbGF0aXZlUG9zaXRpb247XG52YXIgcG9zaXRpb24gPSBlbGVzZm4kYztcblxudmFyIGxhYmVsSGFsaWduID0gZnVuY3Rpb24gbGFiZWxIYWxpZ24oaGFsaWduKSB7XG4gIHN3aXRjaCAoaGFsaWduKSB7XG4gICAgY2FzZSAnbGVmdCc6XG4gICAgY2FzZSAncmlnaHQtaW5zaWRlJzpcbiAgICAgIHJldHVybiAnbGVmdCc7XG4gICAgY2FzZSAncmlnaHQnOlxuICAgIGNhc2UgJ2xlZnQtaW5zaWRlJzpcbiAgICAgIHJldHVybiAncmlnaHQnO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gJ2NlbnRlcic7XG4gIH1cbn07XG52YXIgbGFiZWxWYWxpZ24gPSBmdW5jdGlvbiBsYWJlbFZhbGlnbih2YWxpZ24pIHtcbiAgc3dpdGNoICh2YWxpZ24pIHtcbiAgICBjYXNlICd0b3AnOlxuICAgIGNhc2UgJ2JvdHRvbS1pbnNpZGUnOlxuICAgICAgcmV0dXJuICd0b3AnO1xuICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgY2FzZSAndG9wLWluc2lkZSc6XG4gICAgICByZXR1cm4gJ2JvdHRvbSc7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAnY2VudGVyJztcbiAgfVxufTtcbnZhciBsYWJlbEp1c3RpZmljYXRpb24gPSBmdW5jdGlvbiBsYWJlbEp1c3RpZmljYXRpb24oaGFsaWduKSB7XG4gIHN3aXRjaCAoaGFsaWduKSB7XG4gICAgY2FzZSAnbGVmdCc6XG4gICAgICByZXR1cm4gJ3JpZ2h0JztcbiAgICBjYXNlICdyaWdodCc6XG4gICAgICByZXR1cm4gJ2xlZnQnO1xuICAgIGNhc2UgJ2xlZnQtaW5zaWRlJzpcbiAgICAgIHJldHVybiAnbGVmdCc7XG4gICAgY2FzZSAncmlnaHQtaW5zaWRlJzpcbiAgICAgIHJldHVybiAncmlnaHQnO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gJ2NlbnRlcic7XG4gIH1cbn07XG5cbnZhciBmbiQzLCBlbGVzZm4kYjtcbmZuJDMgPSBlbGVzZm4kYiA9IHt9O1xuZWxlc2ZuJGIucmVuZGVyZWRCb3VuZGluZ0JveCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIHZhciBiYiA9IHRoaXMuYm91bmRpbmdCb3gob3B0aW9ucyk7XG4gIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgdmFyIHpvb20gPSBjeS56b29tKCk7XG4gIHZhciBwYW4gPSBjeS5wYW4oKTtcbiAgdmFyIHgxID0gYmIueDEgKiB6b29tICsgcGFuLng7XG4gIHZhciB4MiA9IGJiLngyICogem9vbSArIHBhbi54O1xuICB2YXIgeTEgPSBiYi55MSAqIHpvb20gKyBwYW4ueTtcbiAgdmFyIHkyID0gYmIueTIgKiB6b29tICsgcGFuLnk7XG4gIHJldHVybiB7XG4gICAgeDE6IHgxLFxuICAgIHgyOiB4MixcbiAgICB5MTogeTEsXG4gICAgeTI6IHkyLFxuICAgIHc6IHgyIC0geDEsXG4gICAgaDogeTIgLSB5MVxuICB9O1xufTtcbmVsZXNmbiRiLmRpcnR5Q29tcG91bmRCb3VuZHNDYWNoZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHNpbGVudCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZmFsc2U7XG4gIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgaWYgKCFjeS5zdHlsZUVuYWJsZWQoKSB8fCAhY3kuaGFzQ29tcG91bmROb2RlcygpKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgdGhpcy5mb3JFYWNoVXAoZnVuY3Rpb24gKGVsZSkge1xuICAgIGlmIChlbGUuaXNQYXJlbnQoKSkge1xuICAgICAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICAgICAgX3AuY29tcG91bmRCb3VuZHNDbGVhbiA9IGZhbHNlO1xuICAgICAgX3AuYmJDYWNoZSA9IG51bGw7XG4gICAgICBpZiAoIXNpbGVudCkge1xuICAgICAgICBlbGUuZW1pdEFuZE5vdGlmeSgnYm91bmRzJyk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuZWxlc2ZuJGIudXBkYXRlQ29tcG91bmRCb3VuZHMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBmb3JjZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZmFsc2U7XG4gIHZhciBjeSA9IHRoaXMuY3koKTtcblxuICAvLyBub3QgcG9zc2libGUgdG8gZG8gb24gbm9uLWNvbXBvdW5kIGdyYXBocyBvciB3aXRoIHRoZSBzdHlsZSBkaXNhYmxlZFxuICBpZiAoIWN5LnN0eWxlRW5hYmxlZCgpIHx8ICFjeS5oYXNDb21wb3VuZE5vZGVzKCkpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHNhdmUgY3ljbGVzIHdoZW4gYmF0Y2hpbmcgLS0gYnV0IGJvdW5kcyB3aWxsIGJlIHN0YWxlIChvciBub3QgZXhpc3QgeWV0KVxuICBpZiAoIWZvcmNlICYmIGN5LmJhdGNoaW5nKCkpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBmdW5jdGlvbiB1cGRhdGUocGFyZW50KSB7XG4gICAgaWYgKCFwYXJlbnQuaXNQYXJlbnQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgX3AgPSBwYXJlbnQuX3ByaXZhdGU7XG4gICAgdmFyIGNoaWxkcmVuID0gcGFyZW50LmNoaWxkcmVuKCk7XG4gICAgdmFyIGluY2x1ZGVMYWJlbHMgPSBwYXJlbnQucHN0eWxlKCdjb21wb3VuZC1zaXppbmctd3J0LWxhYmVscycpLnZhbHVlID09PSAnaW5jbHVkZSc7XG4gICAgdmFyIG1pbiA9IHtcbiAgICAgIHdpZHRoOiB7XG4gICAgICAgIHZhbDogcGFyZW50LnBzdHlsZSgnbWluLXdpZHRoJykucGZWYWx1ZSxcbiAgICAgICAgbGVmdDogcGFyZW50LnBzdHlsZSgnbWluLXdpZHRoLWJpYXMtbGVmdCcpLFxuICAgICAgICByaWdodDogcGFyZW50LnBzdHlsZSgnbWluLXdpZHRoLWJpYXMtcmlnaHQnKVxuICAgICAgfSxcbiAgICAgIGhlaWdodDoge1xuICAgICAgICB2YWw6IHBhcmVudC5wc3R5bGUoJ21pbi1oZWlnaHQnKS5wZlZhbHVlLFxuICAgICAgICB0b3A6IHBhcmVudC5wc3R5bGUoJ21pbi1oZWlnaHQtYmlhcy10b3AnKSxcbiAgICAgICAgYm90dG9tOiBwYXJlbnQucHN0eWxlKCdtaW4taGVpZ2h0LWJpYXMtYm90dG9tJylcbiAgICAgIH1cbiAgICB9O1xuICAgIHZhciBiYiA9IGNoaWxkcmVuLmJvdW5kaW5nQm94KHtcbiAgICAgIGluY2x1ZGVMYWJlbHM6IGluY2x1ZGVMYWJlbHMsXG4gICAgICBpbmNsdWRlT3ZlcmxheXM6IGZhbHNlLFxuICAgICAgLy8gdXBkYXRpbmcgdGhlIGNvbXBvdW5kIGJvdW5kcyBoYXBwZW5zIG91dHNpZGUgb2YgdGhlIHJlZ3VsYXJcbiAgICAgIC8vIGNhY2hlIGN5Y2xlIChpLmUuIGJlZm9yZSBmaXJlZCBldmVudHMpXG4gICAgICB1c2VDYWNoZTogZmFsc2VcbiAgICB9KTtcbiAgICB2YXIgcG9zID0gX3AucG9zaXRpb247XG5cbiAgICAvLyBpZiBjaGlsZHJlbiB0YWtlIHVwIHplcm8gYXJlYSB0aGVuIGtlZXAgcG9zaXRpb24gYW5kIGZhbGwgYmFjayBvbiBzdHlsZXNoZWV0IHcvaFxuICAgIGlmIChiYi53ID09PSAwIHx8IGJiLmggPT09IDApIHtcbiAgICAgIGJiID0ge1xuICAgICAgICB3OiBwYXJlbnQucHN0eWxlKCd3aWR0aCcpLnBmVmFsdWUsXG4gICAgICAgIGg6IHBhcmVudC5wc3R5bGUoJ2hlaWdodCcpLnBmVmFsdWVcbiAgICAgIH07XG4gICAgICBiYi54MSA9IHBvcy54IC0gYmIudyAvIDI7XG4gICAgICBiYi54MiA9IHBvcy54ICsgYmIudyAvIDI7XG4gICAgICBiYi55MSA9IHBvcy55IC0gYmIuaCAvIDI7XG4gICAgICBiYi55MiA9IHBvcy55ICsgYmIuaCAvIDI7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXB1dGVCaWFzVmFsdWVzKHByb3BEaWZmLCBwcm9wQmlhcywgcHJvcEJpYXNDb21wbGVtZW50KSB7XG4gICAgICB2YXIgYmlhc0RpZmYgPSAwO1xuICAgICAgdmFyIGJpYXNDb21wbGVtZW50RGlmZiA9IDA7XG4gICAgICB2YXIgYmlhc1RvdGFsID0gcHJvcEJpYXMgKyBwcm9wQmlhc0NvbXBsZW1lbnQ7XG4gICAgICBpZiAocHJvcERpZmYgPiAwICYmIGJpYXNUb3RhbCA+IDApIHtcbiAgICAgICAgYmlhc0RpZmYgPSBwcm9wQmlhcyAvIGJpYXNUb3RhbCAqIHByb3BEaWZmO1xuICAgICAgICBiaWFzQ29tcGxlbWVudERpZmYgPSBwcm9wQmlhc0NvbXBsZW1lbnQgLyBiaWFzVG90YWwgKiBwcm9wRGlmZjtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGJpYXNEaWZmOiBiaWFzRGlmZixcbiAgICAgICAgYmlhc0NvbXBsZW1lbnREaWZmOiBiaWFzQ29tcGxlbWVudERpZmZcbiAgICAgIH07XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXB1dGVQYWRkaW5nVmFsdWVzKHdpZHRoLCBoZWlnaHQsIHBhZGRpbmdPYmplY3QsIHJlbGF0aXZlVG8pIHtcbiAgICAgIC8vIEFzc3VtaW5nIHBlcmNlbnRhZ2UgaXMgbnVtYmVyIGZyb20gMCB0byAxXG4gICAgICBpZiAocGFkZGluZ09iamVjdC51bml0cyA9PT0gJyUnKSB7XG4gICAgICAgIHN3aXRjaCAocmVsYXRpdmVUbykge1xuICAgICAgICAgIGNhc2UgJ3dpZHRoJzpcbiAgICAgICAgICAgIHJldHVybiB3aWR0aCA+IDAgPyBwYWRkaW5nT2JqZWN0LnBmVmFsdWUgKiB3aWR0aCA6IDA7XG4gICAgICAgICAgY2FzZSAnaGVpZ2h0JzpcbiAgICAgICAgICAgIHJldHVybiBoZWlnaHQgPiAwID8gcGFkZGluZ09iamVjdC5wZlZhbHVlICogaGVpZ2h0IDogMDtcbiAgICAgICAgICBjYXNlICdhdmVyYWdlJzpcbiAgICAgICAgICAgIHJldHVybiB3aWR0aCA+IDAgJiYgaGVpZ2h0ID4gMCA/IHBhZGRpbmdPYmplY3QucGZWYWx1ZSAqICh3aWR0aCArIGhlaWdodCkgLyAyIDogMDtcbiAgICAgICAgICBjYXNlICdtaW4nOlxuICAgICAgICAgICAgcmV0dXJuIHdpZHRoID4gMCAmJiBoZWlnaHQgPiAwID8gd2lkdGggPiBoZWlnaHQgPyBwYWRkaW5nT2JqZWN0LnBmVmFsdWUgKiBoZWlnaHQgOiBwYWRkaW5nT2JqZWN0LnBmVmFsdWUgKiB3aWR0aCA6IDA7XG4gICAgICAgICAgY2FzZSAnbWF4JzpcbiAgICAgICAgICAgIHJldHVybiB3aWR0aCA+IDAgJiYgaGVpZ2h0ID4gMCA/IHdpZHRoID4gaGVpZ2h0ID8gcGFkZGluZ09iamVjdC5wZlZhbHVlICogd2lkdGggOiBwYWRkaW5nT2JqZWN0LnBmVmFsdWUgKiBoZWlnaHQgOiAwO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChwYWRkaW5nT2JqZWN0LnVuaXRzID09PSAncHgnKSB7XG4gICAgICAgIHJldHVybiBwYWRkaW5nT2JqZWN0LnBmVmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIGxlZnRWYWwgPSBtaW4ud2lkdGgubGVmdC52YWx1ZTtcbiAgICBpZiAobWluLndpZHRoLmxlZnQudW5pdHMgPT09ICdweCcgJiYgbWluLndpZHRoLnZhbCA+IDApIHtcbiAgICAgIGxlZnRWYWwgPSBsZWZ0VmFsICogMTAwIC8gbWluLndpZHRoLnZhbDtcbiAgICB9XG4gICAgdmFyIHJpZ2h0VmFsID0gbWluLndpZHRoLnJpZ2h0LnZhbHVlO1xuICAgIGlmIChtaW4ud2lkdGgucmlnaHQudW5pdHMgPT09ICdweCcgJiYgbWluLndpZHRoLnZhbCA+IDApIHtcbiAgICAgIHJpZ2h0VmFsID0gcmlnaHRWYWwgKiAxMDAgLyBtaW4ud2lkdGgudmFsO1xuICAgIH1cbiAgICB2YXIgdG9wVmFsID0gbWluLmhlaWdodC50b3AudmFsdWU7XG4gICAgaWYgKG1pbi5oZWlnaHQudG9wLnVuaXRzID09PSAncHgnICYmIG1pbi5oZWlnaHQudmFsID4gMCkge1xuICAgICAgdG9wVmFsID0gdG9wVmFsICogMTAwIC8gbWluLmhlaWdodC52YWw7XG4gICAgfVxuICAgIHZhciBib3R0b21WYWwgPSBtaW4uaGVpZ2h0LmJvdHRvbS52YWx1ZTtcbiAgICBpZiAobWluLmhlaWdodC5ib3R0b20udW5pdHMgPT09ICdweCcgJiYgbWluLmhlaWdodC52YWwgPiAwKSB7XG4gICAgICBib3R0b21WYWwgPSBib3R0b21WYWwgKiAxMDAgLyBtaW4uaGVpZ2h0LnZhbDtcbiAgICB9XG4gICAgdmFyIHdpZHRoQmlhc0RpZmZzID0gY29tcHV0ZUJpYXNWYWx1ZXMobWluLndpZHRoLnZhbCAtIGJiLncsIGxlZnRWYWwsIHJpZ2h0VmFsKTtcbiAgICB2YXIgZGlmZkxlZnQgPSB3aWR0aEJpYXNEaWZmcy5iaWFzRGlmZjtcbiAgICB2YXIgZGlmZlJpZ2h0ID0gd2lkdGhCaWFzRGlmZnMuYmlhc0NvbXBsZW1lbnREaWZmO1xuICAgIHZhciBoZWlnaHRCaWFzRGlmZnMgPSBjb21wdXRlQmlhc1ZhbHVlcyhtaW4uaGVpZ2h0LnZhbCAtIGJiLmgsIHRvcFZhbCwgYm90dG9tVmFsKTtcbiAgICB2YXIgZGlmZlRvcCA9IGhlaWdodEJpYXNEaWZmcy5iaWFzRGlmZjtcbiAgICB2YXIgZGlmZkJvdHRvbSA9IGhlaWdodEJpYXNEaWZmcy5iaWFzQ29tcGxlbWVudERpZmY7XG4gICAgX3AuYXV0b1BhZGRpbmcgPSBjb21wdXRlUGFkZGluZ1ZhbHVlcyhiYi53LCBiYi5oLCBwYXJlbnQucHN0eWxlKCdwYWRkaW5nJyksIHBhcmVudC5wc3R5bGUoJ3BhZGRpbmctcmVsYXRpdmUtdG8nKS52YWx1ZSk7XG4gICAgX3AuYXV0b1dpZHRoID0gTWF0aC5tYXgoYmIudywgbWluLndpZHRoLnZhbCk7XG4gICAgcG9zLnggPSAoLWRpZmZMZWZ0ICsgYmIueDEgKyBiYi54MiArIGRpZmZSaWdodCkgLyAyO1xuICAgIF9wLmF1dG9IZWlnaHQgPSBNYXRoLm1heChiYi5oLCBtaW4uaGVpZ2h0LnZhbCk7XG4gICAgcG9zLnkgPSAoLWRpZmZUb3AgKyBiYi55MSArIGJiLnkyICsgZGlmZkJvdHRvbSkgLyAyO1xuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbGUgPSB0aGlzW2ldO1xuICAgIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgICBpZiAoIV9wLmNvbXBvdW5kQm91bmRzQ2xlYW4gfHwgZm9yY2UpIHtcbiAgICAgIHVwZGF0ZShlbGUpO1xuICAgICAgaWYgKCFjeS5iYXRjaGluZygpKSB7XG4gICAgICAgIF9wLmNvbXBvdW5kQm91bmRzQ2xlYW4gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG52YXIgbm9uaW5mID0gZnVuY3Rpb24gbm9uaW5mKHgpIHtcbiAgaWYgKHggPT09IEluZmluaXR5IHx8IHggPT09IC1JbmZpbml0eSkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIHJldHVybiB4O1xufTtcbnZhciB1cGRhdGVCb3VuZHMgPSBmdW5jdGlvbiB1cGRhdGVCb3VuZHMoYiwgeDEsIHkxLCB4MiwgeTIpIHtcbiAgLy8gZG9uJ3QgdXBkYXRlIHdpdGggemVybyBhcmVhIGJveGVzXG4gIGlmICh4MiAtIHgxID09PSAwIHx8IHkyIC0geTEgPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBkb24ndCB1cGRhdGUgd2l0aCBudWxsIGRpbVxuICBpZiAoeDEgPT0gbnVsbCB8fCB5MSA9PSBudWxsIHx8IHgyID09IG51bGwgfHwgeTIgPT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfVxuICBiLngxID0geDEgPCBiLngxID8geDEgOiBiLngxO1xuICBiLngyID0geDIgPiBiLngyID8geDIgOiBiLngyO1xuICBiLnkxID0geTEgPCBiLnkxID8geTEgOiBiLnkxO1xuICBiLnkyID0geTIgPiBiLnkyID8geTIgOiBiLnkyO1xuICBiLncgPSBiLngyIC0gYi54MTtcbiAgYi5oID0gYi55MiAtIGIueTE7XG59O1xudmFyIHVwZGF0ZUJvdW5kc0Zyb21Cb3ggPSBmdW5jdGlvbiB1cGRhdGVCb3VuZHNGcm9tQm94KGIsIGIyKSB7XG4gIGlmIChiMiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGI7XG4gIH1cbiAgcmV0dXJuIHVwZGF0ZUJvdW5kcyhiLCBiMi54MSwgYjIueTEsIGIyLngyLCBiMi55Mik7XG59O1xudmFyIHByZWZpeGVkUHJvcGVydHkgPSBmdW5jdGlvbiBwcmVmaXhlZFByb3BlcnR5KG9iaiwgZmllbGQsIHByZWZpeCkge1xuICByZXR1cm4gZ2V0UHJlZml4ZWRQcm9wZXJ0eShvYmosIGZpZWxkLCBwcmVmaXgpO1xufTtcbnZhciB1cGRhdGVCb3VuZHNGcm9tQXJyb3cgPSBmdW5jdGlvbiB1cGRhdGVCb3VuZHNGcm9tQXJyb3coYm91bmRzLCBlbGUsIHByZWZpeCkge1xuICBpZiAoZWxlLmN5KCkuaGVhZGxlc3MoKSkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIHZhciByc3R5bGUgPSBfcC5yc3R5bGU7XG4gIHZhciBoYWxmQXJXID0gcnN0eWxlLmFycm93V2lkdGggLyAyO1xuICB2YXIgYXJyb3dUeXBlID0gZWxlLnBzdHlsZShwcmVmaXggKyAnLWFycm93LXNoYXBlJykudmFsdWU7XG4gIHZhciB4O1xuICB2YXIgeTtcbiAgaWYgKGFycm93VHlwZSAhPT0gJ25vbmUnKSB7XG4gICAgaWYgKHByZWZpeCA9PT0gJ3NvdXJjZScpIHtcbiAgICAgIHggPSByc3R5bGUuc3JjWDtcbiAgICAgIHkgPSByc3R5bGUuc3JjWTtcbiAgICB9IGVsc2UgaWYgKHByZWZpeCA9PT0gJ3RhcmdldCcpIHtcbiAgICAgIHggPSByc3R5bGUudGd0WDtcbiAgICAgIHkgPSByc3R5bGUudGd0WTtcbiAgICB9IGVsc2Uge1xuICAgICAgeCA9IHJzdHlsZS5taWRYO1xuICAgICAgeSA9IHJzdHlsZS5taWRZO1xuICAgIH1cblxuICAgIC8vIGFsd2F5cyBzdG9yZSB0aGUgaW5kaXZpZHVhbCBhcnJvdyBib3VuZHNcbiAgICB2YXIgYmJzID0gX3AuYXJyb3dCb3VuZHMgPSBfcC5hcnJvd0JvdW5kcyB8fCB7fTtcbiAgICB2YXIgYmIgPSBiYnNbcHJlZml4XSA9IGJic1twcmVmaXhdIHx8IHt9O1xuICAgIGJiLngxID0geCAtIGhhbGZBclc7XG4gICAgYmIueTEgPSB5IC0gaGFsZkFyVztcbiAgICBiYi54MiA9IHggKyBoYWxmQXJXO1xuICAgIGJiLnkyID0geSArIGhhbGZBclc7XG4gICAgYmIudyA9IGJiLngyIC0gYmIueDE7XG4gICAgYmIuaCA9IGJiLnkyIC0gYmIueTE7XG4gICAgZXhwYW5kQm91bmRpbmdCb3goYmIsIDEpO1xuICAgIHVwZGF0ZUJvdW5kcyhib3VuZHMsIGJiLngxLCBiYi55MSwgYmIueDIsIGJiLnkyKTtcbiAgfVxufTtcbnZhciB1cGRhdGVCb3VuZHNGcm9tTGFiZWwgPSBmdW5jdGlvbiB1cGRhdGVCb3VuZHNGcm9tTGFiZWwoYm91bmRzLCBlbGUsIHByZWZpeCkge1xuICBpZiAoZWxlLmN5KCkuaGVhZGxlc3MoKSkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgcHJlZml4RGFzaDtcbiAgaWYgKHByZWZpeCkge1xuICAgIHByZWZpeERhc2ggPSBwcmVmaXggKyAnLSc7XG4gIH0gZWxzZSB7XG4gICAgcHJlZml4RGFzaCA9ICcnO1xuICB9XG4gIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgdmFyIHJzdHlsZSA9IF9wLnJzdHlsZTtcbiAgdmFyIGxhYmVsID0gZWxlLnBzdHlsZShwcmVmaXhEYXNoICsgJ2xhYmVsJykuc3RyVmFsdWU7XG4gIGlmIChsYWJlbCkge1xuICAgIHZhciBoYWxpZ24gPSBlbGUucHN0eWxlKCd0ZXh0LWhhbGlnbicpO1xuICAgIHZhciB2YWxpZ24gPSBlbGUucHN0eWxlKCd0ZXh0LXZhbGlnbicpO1xuICAgIHZhciBsYWJlbFdpZHRoID0gcHJlZml4ZWRQcm9wZXJ0eShyc3R5bGUsICdsYWJlbFdpZHRoJywgcHJlZml4KTtcbiAgICB2YXIgbGFiZWxIZWlnaHQgPSBwcmVmaXhlZFByb3BlcnR5KHJzdHlsZSwgJ2xhYmVsSGVpZ2h0JywgcHJlZml4KTtcbiAgICB2YXIgbGFiZWxYID0gcHJlZml4ZWRQcm9wZXJ0eShyc3R5bGUsICdsYWJlbFgnLCBwcmVmaXgpO1xuICAgIHZhciBsYWJlbFkgPSBwcmVmaXhlZFByb3BlcnR5KHJzdHlsZSwgJ2xhYmVsWScsIHByZWZpeCk7XG4gICAgdmFyIG1hcmdpblggPSBlbGUucHN0eWxlKHByZWZpeERhc2ggKyAndGV4dC1tYXJnaW4teCcpLnBmVmFsdWU7XG4gICAgdmFyIG1hcmdpblkgPSBlbGUucHN0eWxlKHByZWZpeERhc2ggKyAndGV4dC1tYXJnaW4teScpLnBmVmFsdWU7XG4gICAgdmFyIGlzRWRnZSA9IGVsZS5pc0VkZ2UoKTtcbiAgICB2YXIgcm90YXRpb24gPSBlbGUucHN0eWxlKHByZWZpeERhc2ggKyAndGV4dC1yb3RhdGlvbicpO1xuICAgIHZhciBvdXRsaW5lV2lkdGggPSBlbGUucHN0eWxlKCd0ZXh0LW91dGxpbmUtd2lkdGgnKS5wZlZhbHVlO1xuICAgIHZhciBib3JkZXJXaWR0aCA9IGVsZS5wc3R5bGUoJ3RleHQtYm9yZGVyLXdpZHRoJykucGZWYWx1ZTtcbiAgICB2YXIgaGFsZkJvcmRlcldpZHRoID0gYm9yZGVyV2lkdGggLyAyO1xuICAgIHZhciBwYWRkaW5nID0gZWxlLnBzdHlsZSgndGV4dC1iYWNrZ3JvdW5kLXBhZGRpbmcnKS5wZlZhbHVlO1xuICAgIHZhciBtYXJnaW5PZkVycm9yID0gMjsgLy8gZXhwYW5kIHRvIHdvcmsgYXJvdW5kIGJyb3dzZXIgZGltZW5zaW9uIGluYWNjdXJhY2llc1xuXG4gICAgdmFyIGxoID0gbGFiZWxIZWlnaHQ7XG4gICAgdmFyIGx3ID0gbGFiZWxXaWR0aDtcbiAgICB2YXIgbHdfMiA9IGx3IC8gMjtcbiAgICB2YXIgbGhfMiA9IGxoIC8gMjtcbiAgICB2YXIgbHgxLCBseDIsIGx5MSwgbHkyO1xuICAgIGlmIChpc0VkZ2UpIHtcbiAgICAgIGx4MSA9IGxhYmVsWCAtIGx3XzI7XG4gICAgICBseDIgPSBsYWJlbFggKyBsd18yO1xuICAgICAgbHkxID0gbGFiZWxZIC0gbGhfMjtcbiAgICAgIGx5MiA9IGxhYmVsWSArIGxoXzI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN3aXRjaCAobGFiZWxIYWxpZ24oaGFsaWduLnZhbHVlKSkge1xuICAgICAgICBjYXNlICdsZWZ0JzpcbiAgICAgICAgICBseDEgPSBsYWJlbFggLSBsdztcbiAgICAgICAgICBseDIgPSBsYWJlbFg7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2NlbnRlcic6XG4gICAgICAgICAgbHgxID0gbGFiZWxYIC0gbHdfMjtcbiAgICAgICAgICBseDIgPSBsYWJlbFggKyBsd18yO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgICAgbHgxID0gbGFiZWxYO1xuICAgICAgICAgIGx4MiA9IGxhYmVsWCArIGx3O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc3dpdGNoIChsYWJlbFZhbGlnbih2YWxpZ24udmFsdWUpKSB7XG4gICAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgICAgbHkxID0gbGFiZWxZIC0gbGg7XG4gICAgICAgICAgbHkyID0gbGFiZWxZO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdjZW50ZXInOlxuICAgICAgICAgIGx5MSA9IGxhYmVsWSAtIGxoXzI7XG4gICAgICAgICAgbHkyID0gbGFiZWxZICsgbGhfMjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgICBseTEgPSBsYWJlbFk7XG4gICAgICAgICAgbHkyID0gbGFiZWxZICsgbGg7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gc2hpZnQgYnkgbWFyZ2luIGFuZCBleHBhbmQgYnkgb3V0bGluZSBhbmQgYm9yZGVyXG4gICAgdmFyIGxlZnRQYWQgPSBtYXJnaW5YIC0gTWF0aC5tYXgob3V0bGluZVdpZHRoLCBoYWxmQm9yZGVyV2lkdGgpIC0gcGFkZGluZyAtIG1hcmdpbk9mRXJyb3I7XG4gICAgdmFyIHJpZ2h0UGFkID0gbWFyZ2luWCArIE1hdGgubWF4KG91dGxpbmVXaWR0aCwgaGFsZkJvcmRlcldpZHRoKSArIHBhZGRpbmcgKyBtYXJnaW5PZkVycm9yO1xuICAgIHZhciB0b3BQYWQgPSBtYXJnaW5ZIC0gTWF0aC5tYXgob3V0bGluZVdpZHRoLCBoYWxmQm9yZGVyV2lkdGgpIC0gcGFkZGluZyAtIG1hcmdpbk9mRXJyb3I7XG4gICAgdmFyIGJvdFBhZCA9IG1hcmdpblkgKyBNYXRoLm1heChvdXRsaW5lV2lkdGgsIGhhbGZCb3JkZXJXaWR0aCkgKyBwYWRkaW5nICsgbWFyZ2luT2ZFcnJvcjtcbiAgICBseDEgKz0gbGVmdFBhZDtcbiAgICBseDIgKz0gcmlnaHRQYWQ7XG4gICAgbHkxICs9IHRvcFBhZDtcbiAgICBseTIgKz0gYm90UGFkO1xuXG4gICAgLy8gYWx3YXlzIHN0b3JlIHRoZSB1bnJvdGF0ZWQgbGFiZWwgYm91bmRzIHNlcGFyYXRlbHlcbiAgICB2YXIgYmJQcmVmaXggPSBwcmVmaXggfHwgJ21haW4nO1xuICAgIHZhciBiYnMgPSBfcC5sYWJlbEJvdW5kcztcbiAgICB2YXIgYmIgPSBiYnNbYmJQcmVmaXhdID0gYmJzW2JiUHJlZml4XSB8fCB7fTtcbiAgICBiYi54MSA9IGx4MTtcbiAgICBiYi55MSA9IGx5MTtcbiAgICBiYi54MiA9IGx4MjtcbiAgICBiYi55MiA9IGx5MjtcbiAgICBiYi53ID0gbHgyIC0gbHgxO1xuICAgIGJiLmggPSBseTIgLSBseTE7XG4gICAgYmIubGVmdFBhZCA9IGxlZnRQYWQ7XG4gICAgYmIucmlnaHRQYWQgPSByaWdodFBhZDtcbiAgICBiYi50b3BQYWQgPSB0b3BQYWQ7XG4gICAgYmIuYm90UGFkID0gYm90UGFkO1xuICAgIHZhciBpc0F1dG9yb3RhdGUgPSBpc0VkZ2UgJiYgcm90YXRpb24uc3RyVmFsdWUgPT09ICdhdXRvcm90YXRlJztcbiAgICB2YXIgaXNQZlZhbHVlID0gcm90YXRpb24ucGZWYWx1ZSAhPSBudWxsICYmIHJvdGF0aW9uLnBmVmFsdWUgIT09IDA7XG4gICAgaWYgKGlzQXV0b3JvdGF0ZSB8fCBpc1BmVmFsdWUpIHtcbiAgICAgIHZhciB0aGV0YSA9IGlzQXV0b3JvdGF0ZSA/IHByZWZpeGVkUHJvcGVydHkoX3AucnN0eWxlLCAnbGFiZWxBbmdsZScsIHByZWZpeCkgOiByb3RhdGlvbi5wZlZhbHVlO1xuICAgICAgdmFyIGNvcyA9IE1hdGguY29zKHRoZXRhKTtcbiAgICAgIHZhciBzaW4gPSBNYXRoLnNpbih0aGV0YSk7XG5cbiAgICAgIC8vIHJvdGF0aW9uIHBvaW50IChkZWZhdWx0IHZhbHVlIGZvciBjZW50ZXItY2VudGVyKVxuICAgICAgdmFyIHhvID0gKGx4MSArIGx4MikgLyAyO1xuICAgICAgdmFyIHlvID0gKGx5MSArIGx5MikgLyAyO1xuICAgICAgaWYgKCFpc0VkZ2UpIHtcbiAgICAgICAgc3dpdGNoIChsYWJlbEhhbGlnbihoYWxpZ24udmFsdWUpKSB7XG4gICAgICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgICAgICB4byA9IGx4MjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgICAgIHhvID0gbHgxO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoIChsYWJlbFZhbGlnbih2YWxpZ24udmFsdWUpKSB7XG4gICAgICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgICAgIHlvID0gbHkyO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgICAgIHlvID0gbHkxO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciByb3RhdGUgPSBmdW5jdGlvbiByb3RhdGUoeCwgeSkge1xuICAgICAgICB4ID0geCAtIHhvO1xuICAgICAgICB5ID0geSAtIHlvO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHg6IHggKiBjb3MgLSB5ICogc2luICsgeG8sXG4gICAgICAgICAgeTogeCAqIHNpbiArIHkgKiBjb3MgKyB5b1xuICAgICAgICB9O1xuICAgICAgfTtcbiAgICAgIHZhciBweDF5MSA9IHJvdGF0ZShseDEsIGx5MSk7XG4gICAgICB2YXIgcHgxeTIgPSByb3RhdGUobHgxLCBseTIpO1xuICAgICAgdmFyIHB4MnkxID0gcm90YXRlKGx4MiwgbHkxKTtcbiAgICAgIHZhciBweDJ5MiA9IHJvdGF0ZShseDIsIGx5Mik7XG4gICAgICBseDEgPSBNYXRoLm1pbihweDF5MS54LCBweDF5Mi54LCBweDJ5MS54LCBweDJ5Mi54KTtcbiAgICAgIGx4MiA9IE1hdGgubWF4KHB4MXkxLngsIHB4MXkyLngsIHB4MnkxLngsIHB4MnkyLngpO1xuICAgICAgbHkxID0gTWF0aC5taW4ocHgxeTEueSwgcHgxeTIueSwgcHgyeTEueSwgcHgyeTIueSk7XG4gICAgICBseTIgPSBNYXRoLm1heChweDF5MS55LCBweDF5Mi55LCBweDJ5MS55LCBweDJ5Mi55KTtcbiAgICB9XG4gICAgdmFyIGJiUHJlZml4Um90ID0gYmJQcmVmaXggKyAnUm90JztcbiAgICB2YXIgYmJSb3QgPSBiYnNbYmJQcmVmaXhSb3RdID0gYmJzW2JiUHJlZml4Um90XSB8fCB7fTtcbiAgICBiYlJvdC54MSA9IGx4MTtcbiAgICBiYlJvdC55MSA9IGx5MTtcbiAgICBiYlJvdC54MiA9IGx4MjtcbiAgICBiYlJvdC55MiA9IGx5MjtcbiAgICBiYlJvdC53ID0gbHgyIC0gbHgxO1xuICAgIGJiUm90LmggPSBseTIgLSBseTE7XG4gICAgdXBkYXRlQm91bmRzKGJvdW5kcywgbHgxLCBseTEsIGx4MiwgbHkyKTtcbiAgICB1cGRhdGVCb3VuZHMoX3AubGFiZWxCb3VuZHMuYWxsLCBseDEsIGx5MSwgbHgyLCBseTIpO1xuICB9XG4gIHJldHVybiBib3VuZHM7XG59O1xudmFyIHVwZGF0ZUJvdW5kc0Zyb21PdXRsaW5lID0gZnVuY3Rpb24gdXBkYXRlQm91bmRzRnJvbU91dGxpbmUoYm91bmRzLCBlbGUpIHtcbiAgaWYgKGVsZS5jeSgpLmhlYWRsZXNzKCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG91dGxpbmVPcGFjaXR5ID0gZWxlLnBzdHlsZSgnb3V0bGluZS1vcGFjaXR5JykudmFsdWU7XG4gIHZhciBvdXRsaW5lV2lkdGggPSBlbGUucHN0eWxlKCdvdXRsaW5lLXdpZHRoJykudmFsdWU7XG4gIHZhciBvdXRsaW5lT2Zmc2V0ID0gZWxlLnBzdHlsZSgnb3V0bGluZS1vZmZzZXQnKS52YWx1ZTtcbiAgdmFyIGV4cGFuc2lvbiA9IG91dGxpbmVXaWR0aCArIG91dGxpbmVPZmZzZXQ7XG4gIHVwZGF0ZUJvdW5kc0Zyb21NaXRlcihib3VuZHMsIGVsZSwgb3V0bGluZU9wYWNpdHksIGV4cGFuc2lvbiwgJ291dHNpZGUnLCBleHBhbnNpb24gLyAyKTtcbn07XG52YXIgdXBkYXRlQm91bmRzRnJvbU1pdGVyID0gZnVuY3Rpb24gdXBkYXRlQm91bmRzRnJvbU1pdGVyKGJvdW5kcywgZWxlLCBvcGFjaXR5LCBleHBhbnNpb25TaXplLCBleHBhbnNpb25Qb3NpdGlvbiwgdXNlRmFsbGJhY2tWYWx1ZSkge1xuICBpZiAob3BhY2l0eSA9PT0gMCB8fCBleHBhbnNpb25TaXplIDw9IDAgfHwgZXhwYW5zaW9uUG9zaXRpb24gPT09ICdpbnNpZGUnKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBjeSA9IGVsZS5jeSgpO1xuICB2YXIgciA9IGN5LnJlbmRlcmVyKCk7XG4gIHZhciByc2hhcGUgPSByLm5vZGVTaGFwZXNbci5nZXROb2RlU2hhcGUoZWxlKV07XG4gIGlmICghcnNoYXBlKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBfZWxlJHBvc2l0aW9uID0gZWxlLnBvc2l0aW9uKCksXG4gICAgeCA9IF9lbGUkcG9zaXRpb24ueCxcbiAgICB5ID0gX2VsZSRwb3NpdGlvbi55O1xuICB2YXIgdyA9IGVsZS53aWR0aCgpO1xuICB2YXIgaCA9IGVsZS5oZWlnaHQoKTtcbiAgaWYgKHJzaGFwZS5oYXNNaXRlckJvdW5kcykge1xuICAgIGlmIChleHBhbnNpb25Qb3NpdGlvbiA9PT0gJ2NlbnRlcicpIHtcbiAgICAgIGV4cGFuc2lvblNpemUgLz0gMjtcbiAgICB9XG4gICAgdmFyIG1iYiA9IHJzaGFwZS5taXRlckJvdW5kcyh4LCB5LCB3LCBoLCBleHBhbnNpb25TaXplKTtcbiAgICB1cGRhdGVCb3VuZHNGcm9tQm94KGJvdW5kcywgbWJiKTtcbiAgfSBlbHNlIGlmICh1c2VGYWxsYmFja1ZhbHVlICE9IG51bGwgJiYgdXNlRmFsbGJhY2tWYWx1ZSA+IDApIHtcbiAgICBleHBhbmRCb3VuZGluZ0JveFNpZGVzKGJvdW5kcywgW3VzZUZhbGxiYWNrVmFsdWUsIHVzZUZhbGxiYWNrVmFsdWUsIHVzZUZhbGxiYWNrVmFsdWUsIHVzZUZhbGxiYWNrVmFsdWVdKTtcbiAgfVxufTtcbnZhciB1cGRhdGVCb3VuZHNGcm9tTWl0ZXJCb3JkZXIgPSBmdW5jdGlvbiB1cGRhdGVCb3VuZHNGcm9tTWl0ZXJCb3JkZXIoYm91bmRzLCBlbGUpIHtcbiAgaWYgKGVsZS5jeSgpLmhlYWRsZXNzKCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIGJvcmRlck9wYWNpdHkgPSBlbGUucHN0eWxlKCdib3JkZXItb3BhY2l0eScpLnZhbHVlO1xuICB2YXIgYm9yZGVyV2lkdGggPSBlbGUucHN0eWxlKCdib3JkZXItd2lkdGgnKS5wZlZhbHVlO1xuICB2YXIgYm9yZGVyUG9zaXRpb24gPSBlbGUucHN0eWxlKCdib3JkZXItcG9zaXRpb24nKS52YWx1ZTtcbiAgdXBkYXRlQm91bmRzRnJvbU1pdGVyKGJvdW5kcywgZWxlLCBib3JkZXJPcGFjaXR5LCBib3JkZXJXaWR0aCwgYm9yZGVyUG9zaXRpb24pO1xufTtcblxuLy8gZ2V0IHRoZSBib3VuZGluZyBib3ggb2YgdGhlIGVsZW1lbnRzIChpbiByYXcgbW9kZWwgcG9zaXRpb24pXG52YXIgYm91bmRpbmdCb3hJbXBsID0gZnVuY3Rpb24gYm91bmRpbmdCb3hJbXBsKGVsZSwgb3B0aW9ucykge1xuICB2YXIgY3kgPSBlbGUuX3ByaXZhdGUuY3k7XG4gIHZhciBzdHlsZUVuYWJsZWQgPSBjeS5zdHlsZUVuYWJsZWQoKTtcbiAgdmFyIGhlYWRsZXNzID0gY3kuaGVhZGxlc3MoKTtcbiAgdmFyIGJvdW5kcyA9IG1ha2VCb3VuZGluZ0JveCgpO1xuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIHZhciBpc05vZGUgPSBlbGUuaXNOb2RlKCk7XG4gIHZhciBpc0VkZ2UgPSBlbGUuaXNFZGdlKCk7XG4gIHZhciBleDEsIGV4MiwgZXkxLCBleTI7IC8vIGV4dHJlbWEgb2YgYm9keSAvIGxpbmVzXG4gIHZhciB4LCB5OyAvLyBub2RlIHBvc1xuICB2YXIgcnN0eWxlID0gX3AucnN0eWxlO1xuICB2YXIgbWFudWFsRXhwYW5zaW9uID0gaXNOb2RlICYmIHN0eWxlRW5hYmxlZCA/IGVsZS5wc3R5bGUoJ2JvdW5kcy1leHBhbnNpb24nKS5wZlZhbHVlIDogWzBdO1xuXG4gIC8vIG11c3QgdXNlIGBkaXNwbGF5YCBwcm9wIG9ubHksIGFzIHJlYWRpbmcgYGNvbXBvdW5kLndpZHRoKClgIGNhdXNlcyByZWN1cnNpb25cbiAgLy8gKG90aGVyIGZhY3RvcnMgbGlrZSB3aWR0aCB2YWx1ZXMgd2lsbCBiZSBjb25zaWRlcmVkIGxhdGVyIGluIHRoaXMgZnVuY3Rpb24gYW55d2F5KVxuICB2YXIgaXNEaXNwbGF5ZWQgPSBmdW5jdGlvbiBpc0Rpc3BsYXllZChlbGUpIHtcbiAgICByZXR1cm4gZWxlLnBzdHlsZSgnZGlzcGxheScpLnZhbHVlICE9PSAnbm9uZSc7XG4gIH07XG4gIHZhciBkaXNwbGF5ZWQgPSAhc3R5bGVFbmFibGVkIHx8IGlzRGlzcGxheWVkKGVsZSlcblxuICAvLyBtdXN0IHRha2UgaW50byBhY2NvdW50IGNvbm5lY3RlZCBub2RlcyBiL2Mgb2YgaW1wbGljaXQgZWRnZSBoaWRpbmcgb24gZGlzcGxheTpub25lIG5vZGVcbiAgJiYgKCFpc0VkZ2UgfHwgaXNEaXNwbGF5ZWQoZWxlLnNvdXJjZSgpKSAmJiBpc0Rpc3BsYXllZChlbGUudGFyZ2V0KCkpKTtcbiAgaWYgKGRpc3BsYXllZCkge1xuICAgIC8vIGRpc3BsYXllZCBzdWZmaWNlcywgc2luY2Ugd2Ugd2lsbCBmaW5kIHplcm8gYXJlYSBlbGVzIGFueXdheVxuICAgIHZhciBvdmVybGF5T3BhY2l0eSA9IDA7XG4gICAgdmFyIG92ZXJsYXlQYWRkaW5nID0gMDtcbiAgICBpZiAoc3R5bGVFbmFibGVkICYmIG9wdGlvbnMuaW5jbHVkZU92ZXJsYXlzKSB7XG4gICAgICBvdmVybGF5T3BhY2l0eSA9IGVsZS5wc3R5bGUoJ292ZXJsYXktb3BhY2l0eScpLnZhbHVlO1xuICAgICAgaWYgKG92ZXJsYXlPcGFjaXR5ICE9PSAwKSB7XG4gICAgICAgIG92ZXJsYXlQYWRkaW5nID0gZWxlLnBzdHlsZSgnb3ZlcmxheS1wYWRkaW5nJykudmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciB1bmRlcmxheU9wYWNpdHkgPSAwO1xuICAgIHZhciB1bmRlcmxheVBhZGRpbmcgPSAwO1xuICAgIGlmIChzdHlsZUVuYWJsZWQgJiYgb3B0aW9ucy5pbmNsdWRlVW5kZXJsYXlzKSB7XG4gICAgICB1bmRlcmxheU9wYWNpdHkgPSBlbGUucHN0eWxlKCd1bmRlcmxheS1vcGFjaXR5JykudmFsdWU7XG4gICAgICBpZiAodW5kZXJsYXlPcGFjaXR5ICE9PSAwKSB7XG4gICAgICAgIHVuZGVybGF5UGFkZGluZyA9IGVsZS5wc3R5bGUoJ3VuZGVybGF5LXBhZGRpbmcnKS52YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIHBhZGRpbmcgPSBNYXRoLm1heChvdmVybGF5UGFkZGluZywgdW5kZXJsYXlQYWRkaW5nKTtcbiAgICB2YXIgdyA9IDA7XG4gICAgdmFyIHdIYWxmID0gMDtcbiAgICBpZiAoc3R5bGVFbmFibGVkKSB7XG4gICAgICB3ID0gZWxlLnBzdHlsZSgnd2lkdGgnKS5wZlZhbHVlO1xuICAgICAgd0hhbGYgPSB3IC8gMjtcbiAgICB9XG4gICAgaWYgKGlzTm9kZSAmJiBvcHRpb25zLmluY2x1ZGVOb2Rlcykge1xuICAgICAgdmFyIHBvcyA9IGVsZS5wb3NpdGlvbigpO1xuICAgICAgeCA9IHBvcy54O1xuICAgICAgeSA9IHBvcy55O1xuICAgICAgdmFyIF93ID0gZWxlLm91dGVyV2lkdGgoKTtcbiAgICAgIHZhciBoYWxmVyA9IF93IC8gMjtcbiAgICAgIHZhciBoID0gZWxlLm91dGVySGVpZ2h0KCk7XG4gICAgICB2YXIgaGFsZkggPSBoIC8gMjtcblxuICAgICAgLy8gaGFuZGxlIG5vZGUgZGltZW5zaW9uc1xuICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgICBleDEgPSB4IC0gaGFsZlc7XG4gICAgICBleDIgPSB4ICsgaGFsZlc7XG4gICAgICBleTEgPSB5IC0gaGFsZkg7XG4gICAgICBleTIgPSB5ICsgaGFsZkg7XG4gICAgICB1cGRhdGVCb3VuZHMoYm91bmRzLCBleDEsIGV5MSwgZXgyLCBleTIpO1xuICAgICAgaWYgKHN0eWxlRW5hYmxlZCkge1xuICAgICAgICB1cGRhdGVCb3VuZHNGcm9tT3V0bGluZShib3VuZHMsIGVsZSk7XG4gICAgICB9XG4gICAgICBpZiAoc3R5bGVFbmFibGVkICYmIG9wdGlvbnMuaW5jbHVkZU91dGxpbmVzICYmICFoZWFkbGVzcykge1xuICAgICAgICB1cGRhdGVCb3VuZHNGcm9tT3V0bGluZShib3VuZHMsIGVsZSk7XG4gICAgICB9XG4gICAgICBpZiAoc3R5bGVFbmFibGVkKSB7XG4gICAgICAgIHVwZGF0ZUJvdW5kc0Zyb21NaXRlckJvcmRlcihib3VuZHMsIGVsZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc0VkZ2UgJiYgb3B0aW9ucy5pbmNsdWRlRWRnZXMpIHtcbiAgICAgIGlmIChzdHlsZUVuYWJsZWQgJiYgIWhlYWRsZXNzKSB7XG4gICAgICAgIHZhciBjdXJ2ZVN0eWxlID0gZWxlLnBzdHlsZSgnY3VydmUtc3R5bGUnKS5zdHJWYWx1ZTtcblxuICAgICAgICAvLyBoYW5kbGUgZWRnZSBkaW1lbnNpb25zIChyb3VnaCBib3ggZXN0aW1hdGUpXG4gICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICAgICAgICBleDEgPSBNYXRoLm1pbihyc3R5bGUuc3JjWCwgcnN0eWxlLm1pZFgsIHJzdHlsZS50Z3RYKTtcbiAgICAgICAgZXgyID0gTWF0aC5tYXgocnN0eWxlLnNyY1gsIHJzdHlsZS5taWRYLCByc3R5bGUudGd0WCk7XG4gICAgICAgIGV5MSA9IE1hdGgubWluKHJzdHlsZS5zcmNZLCByc3R5bGUubWlkWSwgcnN0eWxlLnRndFkpO1xuICAgICAgICBleTIgPSBNYXRoLm1heChyc3R5bGUuc3JjWSwgcnN0eWxlLm1pZFksIHJzdHlsZS50Z3RZKTtcblxuICAgICAgICAvLyB0YWtlIGludG8gYWNjb3VudCBlZGdlIHdpZHRoXG4gICAgICAgIGV4MSAtPSB3SGFsZjtcbiAgICAgICAgZXgyICs9IHdIYWxmO1xuICAgICAgICBleTEgLT0gd0hhbGY7XG4gICAgICAgIGV5MiArPSB3SGFsZjtcbiAgICAgICAgdXBkYXRlQm91bmRzKGJvdW5kcywgZXgxLCBleTEsIGV4MiwgZXkyKTtcblxuICAgICAgICAvLyBwcmVjaXNlIGVkZ2VzXG4gICAgICAgIC8vLy8vLy8vLy8vLy8vLy9cblxuICAgICAgICBpZiAoY3VydmVTdHlsZSA9PT0gJ2hheXN0YWNrJykge1xuICAgICAgICAgIHZhciBocHRzID0gcnN0eWxlLmhheXN0YWNrUHRzO1xuICAgICAgICAgIGlmIChocHRzICYmIGhwdHMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICBleDEgPSBocHRzWzBdLng7XG4gICAgICAgICAgICBleTEgPSBocHRzWzBdLnk7XG4gICAgICAgICAgICBleDIgPSBocHRzWzFdLng7XG4gICAgICAgICAgICBleTIgPSBocHRzWzFdLnk7XG4gICAgICAgICAgICBpZiAoZXgxID4gZXgyKSB7XG4gICAgICAgICAgICAgIHZhciB0ZW1wID0gZXgxO1xuICAgICAgICAgICAgICBleDEgPSBleDI7XG4gICAgICAgICAgICAgIGV4MiA9IHRlbXA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXkxID4gZXkyKSB7XG4gICAgICAgICAgICAgIHZhciBfdGVtcCA9IGV5MTtcbiAgICAgICAgICAgICAgZXkxID0gZXkyO1xuICAgICAgICAgICAgICBleTIgPSBfdGVtcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHVwZGF0ZUJvdW5kcyhib3VuZHMsIGV4MSAtIHdIYWxmLCBleTEgLSB3SGFsZiwgZXgyICsgd0hhbGYsIGV5MiArIHdIYWxmKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoY3VydmVTdHlsZSA9PT0gJ2JlemllcicgfHwgY3VydmVTdHlsZSA9PT0gJ3VuYnVuZGxlZC1iZXppZXInIHx8IGVuZHNXaXRoKGN1cnZlU3R5bGUsICdzZWdtZW50cycpIHx8IGVuZHNXaXRoKGN1cnZlU3R5bGUsICd0YXhpJykpIHtcbiAgICAgICAgICB2YXIgcHRzO1xuICAgICAgICAgIHN3aXRjaCAoY3VydmVTdHlsZSkge1xuICAgICAgICAgICAgY2FzZSAnYmV6aWVyJzpcbiAgICAgICAgICAgIGNhc2UgJ3VuYnVuZGxlZC1iZXppZXInOlxuICAgICAgICAgICAgICBwdHMgPSByc3R5bGUuYmV6aWVyUHRzO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3NlZ21lbnRzJzpcbiAgICAgICAgICAgIGNhc2UgJ3RheGknOlxuICAgICAgICAgICAgY2FzZSAncm91bmQtc2VnbWVudHMnOlxuICAgICAgICAgICAgY2FzZSAncm91bmQtdGF4aSc6XG4gICAgICAgICAgICAgIHB0cyA9IHJzdHlsZS5saW5lUHRzO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHB0cyAhPSBudWxsKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHB0cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICB2YXIgcHQgPSBwdHNbal07XG4gICAgICAgICAgICAgIGV4MSA9IHB0LnggLSB3SGFsZjtcbiAgICAgICAgICAgICAgZXgyID0gcHQueCArIHdIYWxmO1xuICAgICAgICAgICAgICBleTEgPSBwdC55IC0gd0hhbGY7XG4gICAgICAgICAgICAgIGV5MiA9IHB0LnkgKyB3SGFsZjtcbiAgICAgICAgICAgICAgdXBkYXRlQm91bmRzKGJvdW5kcywgZXgxLCBleTEsIGV4MiwgZXkyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gYmV6aWVyLWxpa2Ugb3Igc2VnbWVudC1saWtlIGVkZ2VcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGhlYWRsZXNzIG9yIHN0eWxlIGRpc2FibGVkXG5cbiAgICAgICAgLy8gZmFsbGJhY2sgb24gc291cmNlIGFuZCB0YXJnZXQgcG9zaXRpb25zXG4gICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgICAgIHZhciBuMSA9IGVsZS5zb3VyY2UoKTtcbiAgICAgICAgdmFyIG4xcG9zID0gbjEucG9zaXRpb24oKTtcbiAgICAgICAgdmFyIG4yID0gZWxlLnRhcmdldCgpO1xuICAgICAgICB2YXIgbjJwb3MgPSBuMi5wb3NpdGlvbigpO1xuICAgICAgICBleDEgPSBuMXBvcy54O1xuICAgICAgICBleDIgPSBuMnBvcy54O1xuICAgICAgICBleTEgPSBuMXBvcy55O1xuICAgICAgICBleTIgPSBuMnBvcy55O1xuICAgICAgICBpZiAoZXgxID4gZXgyKSB7XG4gICAgICAgICAgdmFyIF90ZW1wMiA9IGV4MTtcbiAgICAgICAgICBleDEgPSBleDI7XG4gICAgICAgICAgZXgyID0gX3RlbXAyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChleTEgPiBleTIpIHtcbiAgICAgICAgICB2YXIgX3RlbXAzID0gZXkxO1xuICAgICAgICAgIGV5MSA9IGV5MjtcbiAgICAgICAgICBleTIgPSBfdGVtcDM7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0YWtlIGludG8gYWNjb3VudCBlZGdlIHdpZHRoXG4gICAgICAgIGV4MSAtPSB3SGFsZjtcbiAgICAgICAgZXgyICs9IHdIYWxmO1xuICAgICAgICBleTEgLT0gd0hhbGY7XG4gICAgICAgIGV5MiArPSB3SGFsZjtcbiAgICAgICAgdXBkYXRlQm91bmRzKGJvdW5kcywgZXgxLCBleTEsIGV4MiwgZXkyKTtcbiAgICAgIH0gLy8gaGVhZGxlc3Mgb3Igc3R5bGUgZGlzYWJsZWRcbiAgICB9IC8vIGVkZ2VzXG5cbiAgICAvLyBoYW5kbGUgZWRnZSBhcnJvdyBzaXplXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgaWYgKHN0eWxlRW5hYmxlZCAmJiBvcHRpb25zLmluY2x1ZGVFZGdlcyAmJiBpc0VkZ2UpIHtcbiAgICAgIHVwZGF0ZUJvdW5kc0Zyb21BcnJvdyhib3VuZHMsIGVsZSwgJ21pZC1zb3VyY2UnKTtcbiAgICAgIHVwZGF0ZUJvdW5kc0Zyb21BcnJvdyhib3VuZHMsIGVsZSwgJ21pZC10YXJnZXQnKTtcbiAgICAgIHVwZGF0ZUJvdW5kc0Zyb21BcnJvdyhib3VuZHMsIGVsZSwgJ3NvdXJjZScpO1xuICAgICAgdXBkYXRlQm91bmRzRnJvbUFycm93KGJvdW5kcywgZWxlLCAndGFyZ2V0Jyk7XG4gICAgfVxuXG4gICAgLy8gZ2hvc3RcbiAgICAvLy8vLy8vL1xuXG4gICAgaWYgKHN0eWxlRW5hYmxlZCkge1xuICAgICAgdmFyIGdob3N0ID0gZWxlLnBzdHlsZSgnZ2hvc3QnKS52YWx1ZSA9PT0gJ3llcyc7XG4gICAgICBpZiAoZ2hvc3QpIHtcbiAgICAgICAgdmFyIGd4ID0gZWxlLnBzdHlsZSgnZ2hvc3Qtb2Zmc2V0LXgnKS5wZlZhbHVlO1xuICAgICAgICB2YXIgZ3kgPSBlbGUucHN0eWxlKCdnaG9zdC1vZmZzZXQteScpLnBmVmFsdWU7XG4gICAgICAgIHVwZGF0ZUJvdW5kcyhib3VuZHMsIGJvdW5kcy54MSArIGd4LCBib3VuZHMueTEgKyBneSwgYm91bmRzLngyICsgZ3gsIGJvdW5kcy55MiArIGd5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBhbHdheXMgc3RvcmUgdGhlIGJvZHkgYm91bmRzIHNlcGFyYXRlbHkgZnJvbSB0aGUgbGFiZWxzXG4gICAgdmFyIGJiQm9keSA9IF9wLmJvZHlCb3VuZHMgPSBfcC5ib2R5Qm91bmRzIHx8IHt9O1xuICAgIGFzc2lnbkJvdW5kaW5nQm94KGJiQm9keSwgYm91bmRzKTtcbiAgICBleHBhbmRCb3VuZGluZ0JveFNpZGVzKGJiQm9keSwgbWFudWFsRXhwYW5zaW9uKTtcbiAgICBleHBhbmRCb3VuZGluZ0JveChiYkJvZHksIDEpOyAvLyBleHBhbmQgdG8gd29yayBhcm91bmQgYnJvd3NlciBkaW1lbnNpb24gaW5hY2N1cmFjaWVzXG5cbiAgICAvLyBvdmVybGF5XG4gICAgLy8vLy8vLy8vL1xuXG4gICAgaWYgKHN0eWxlRW5hYmxlZCkge1xuICAgICAgZXgxID0gYm91bmRzLngxO1xuICAgICAgZXgyID0gYm91bmRzLngyO1xuICAgICAgZXkxID0gYm91bmRzLnkxO1xuICAgICAgZXkyID0gYm91bmRzLnkyO1xuICAgICAgdXBkYXRlQm91bmRzKGJvdW5kcywgZXgxIC0gcGFkZGluZywgZXkxIC0gcGFkZGluZywgZXgyICsgcGFkZGluZywgZXkyICsgcGFkZGluZyk7XG4gICAgfVxuXG4gICAgLy8gYWx3YXlzIHN0b3JlIHRoZSBib2R5IGJvdW5kcyBzZXBhcmF0ZWx5IGZyb20gdGhlIGxhYmVsc1xuICAgIHZhciBiYk92ZXJsYXkgPSBfcC5vdmVybGF5Qm91bmRzID0gX3Aub3ZlcmxheUJvdW5kcyB8fCB7fTtcbiAgICBhc3NpZ25Cb3VuZGluZ0JveChiYk92ZXJsYXksIGJvdW5kcyk7XG4gICAgZXhwYW5kQm91bmRpbmdCb3hTaWRlcyhiYk92ZXJsYXksIG1hbnVhbEV4cGFuc2lvbik7XG4gICAgZXhwYW5kQm91bmRpbmdCb3goYmJPdmVybGF5LCAxKTsgLy8gZXhwYW5kIHRvIHdvcmsgYXJvdW5kIGJyb3dzZXIgZGltZW5zaW9uIGluYWNjdXJhY2llc1xuXG4gICAgLy8gaGFuZGxlIGxhYmVsIGRpbWVuc2lvbnNcbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgdmFyIGJiTGFiZWxzID0gX3AubGFiZWxCb3VuZHMgPSBfcC5sYWJlbEJvdW5kcyB8fCB7fTtcbiAgICBpZiAoYmJMYWJlbHMuYWxsICE9IG51bGwpIHtcbiAgICAgIGNsZWFyQm91bmRpbmdCb3goYmJMYWJlbHMuYWxsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYmJMYWJlbHMuYWxsID0gbWFrZUJvdW5kaW5nQm94KCk7XG4gICAgfVxuICAgIGlmIChzdHlsZUVuYWJsZWQgJiYgb3B0aW9ucy5pbmNsdWRlTGFiZWxzKSB7XG4gICAgICBpZiAob3B0aW9ucy5pbmNsdWRlTWFpbkxhYmVscykge1xuICAgICAgICB1cGRhdGVCb3VuZHNGcm9tTGFiZWwoYm91bmRzLCBlbGUsIG51bGwpO1xuICAgICAgfVxuICAgICAgaWYgKGlzRWRnZSkge1xuICAgICAgICBpZiAob3B0aW9ucy5pbmNsdWRlU291cmNlTGFiZWxzKSB7XG4gICAgICAgICAgdXBkYXRlQm91bmRzRnJvbUxhYmVsKGJvdW5kcywgZWxlLCAnc291cmNlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuaW5jbHVkZVRhcmdldExhYmVscykge1xuICAgICAgICAgIHVwZGF0ZUJvdW5kc0Zyb21MYWJlbChib3VuZHMsIGVsZSwgJ3RhcmdldCcpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSAvLyBzdHlsZSBlbmFibGVkIGZvciBsYWJlbHNcbiAgfSAvLyBpZiBkaXNwbGF5ZWRcblxuICBib3VuZHMueDEgPSBub25pbmYoYm91bmRzLngxKTtcbiAgYm91bmRzLnkxID0gbm9uaW5mKGJvdW5kcy55MSk7XG4gIGJvdW5kcy54MiA9IG5vbmluZihib3VuZHMueDIpO1xuICBib3VuZHMueTIgPSBub25pbmYoYm91bmRzLnkyKTtcbiAgYm91bmRzLncgPSBub25pbmYoYm91bmRzLngyIC0gYm91bmRzLngxKTtcbiAgYm91bmRzLmggPSBub25pbmYoYm91bmRzLnkyIC0gYm91bmRzLnkxKTtcbiAgaWYgKGJvdW5kcy53ID4gMCAmJiBib3VuZHMuaCA+IDAgJiYgZGlzcGxheWVkKSB7XG4gICAgZXhwYW5kQm91bmRpbmdCb3hTaWRlcyhib3VuZHMsIG1hbnVhbEV4cGFuc2lvbik7XG5cbiAgICAvLyBleHBhbmQgYm91bmRzIGJ5IDEgYmVjYXVzZSBhbnRpYWxpYXNpbmcgY2FuIGluY3JlYXNlIHRoZSB2aXN1YWwvZWZmZWN0aXZlIHNpemUgYnkgMSBvbiBhbGwgc2lkZXNcbiAgICBleHBhbmRCb3VuZGluZ0JveChib3VuZHMsIDEpO1xuICB9XG4gIHJldHVybiBib3VuZHM7XG59O1xudmFyIGdldEtleSA9IGZ1bmN0aW9uIGdldEtleShvcHRzKSB7XG4gIHZhciBpID0gMDtcbiAgdmFyIHRmID0gZnVuY3Rpb24gdGYodmFsKSB7XG4gICAgcmV0dXJuICh2YWwgPyAxIDogMCkgPDwgaSsrO1xuICB9O1xuICB2YXIga2V5ID0gMDtcbiAga2V5ICs9IHRmKG9wdHMuaW5jdWRlTm9kZXMpO1xuICBrZXkgKz0gdGYob3B0cy5pbmNsdWRlRWRnZXMpO1xuICBrZXkgKz0gdGYob3B0cy5pbmNsdWRlTGFiZWxzKTtcbiAga2V5ICs9IHRmKG9wdHMuaW5jbHVkZU1haW5MYWJlbHMpO1xuICBrZXkgKz0gdGYob3B0cy5pbmNsdWRlU291cmNlTGFiZWxzKTtcbiAga2V5ICs9IHRmKG9wdHMuaW5jbHVkZVRhcmdldExhYmVscyk7XG4gIGtleSArPSB0ZihvcHRzLmluY2x1ZGVPdmVybGF5cyk7XG4gIGtleSArPSB0ZihvcHRzLmluY2x1ZGVPdXRsaW5lcyk7XG4gIHJldHVybiBrZXk7XG59O1xudmFyIGdldEJvdW5kaW5nQm94UG9zS2V5ID0gZnVuY3Rpb24gZ2V0Qm91bmRpbmdCb3hQb3NLZXkoZWxlKSB7XG4gIHZhciByID0gZnVuY3Rpb24gcih4KSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQoeCk7XG4gIH07XG4gIGlmIChlbGUuaXNFZGdlKCkpIHtcbiAgICB2YXIgcDEgPSBlbGUuc291cmNlKCkucG9zaXRpb24oKTtcbiAgICB2YXIgcDIgPSBlbGUudGFyZ2V0KCkucG9zaXRpb24oKTtcbiAgICByZXR1cm4gaGFzaEludHNBcnJheShbcihwMS54KSwgcihwMS55KSwgcihwMi54KSwgcihwMi55KV0pO1xuICB9IGVsc2Uge1xuICAgIHZhciBwID0gZWxlLnBvc2l0aW9uKCk7XG4gICAgcmV0dXJuIGhhc2hJbnRzQXJyYXkoW3IocC54KSwgcihwLnkpXSk7XG4gIH1cbn07XG52YXIgY2FjaGVkQm91bmRpbmdCb3hJbXBsID0gZnVuY3Rpb24gY2FjaGVkQm91bmRpbmdCb3hJbXBsKGVsZSwgb3B0cykge1xuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIHZhciBiYjtcbiAgdmFyIGlzRWRnZSA9IGVsZS5pc0VkZ2UoKTtcbiAgdmFyIGtleSA9IG9wdHMgPT0gbnVsbCA/IGRlZkJiT3B0c0tleSA6IGdldEtleShvcHRzKTtcbiAgdmFyIHVzaW5nRGVmT3B0cyA9IGtleSA9PT0gZGVmQmJPcHRzS2V5O1xuICBpZiAoX3AuYmJDYWNoZSA9PSBudWxsKSB7XG4gICAgYmIgPSBib3VuZGluZ0JveEltcGwoZWxlLCBkZWZCYk9wdHMpO1xuICAgIF9wLmJiQ2FjaGUgPSBiYjtcbiAgICBfcC5iYkNhY2hlUG9zS2V5ID0gZ2V0Qm91bmRpbmdCb3hQb3NLZXkoZWxlKTtcbiAgfSBlbHNlIHtcbiAgICBiYiA9IF9wLmJiQ2FjaGU7XG4gIH1cblxuICAvLyBub3QgdXNpbmcgZGVmIG9wdHMgPT4gbmVlZCB0byBidWlsZCB1cCBiYiBmcm9tIGNvbWJpbmF0aW9uIG9mIHN1YiBiYnNcbiAgaWYgKCF1c2luZ0RlZk9wdHMpIHtcbiAgICB2YXIgaXNOb2RlID0gZWxlLmlzTm9kZSgpO1xuICAgIGJiID0gbWFrZUJvdW5kaW5nQm94KCk7XG4gICAgaWYgKG9wdHMuaW5jbHVkZU5vZGVzICYmIGlzTm9kZSB8fCBvcHRzLmluY2x1ZGVFZGdlcyAmJiAhaXNOb2RlKSB7XG4gICAgICBpZiAob3B0cy5pbmNsdWRlT3ZlcmxheXMpIHtcbiAgICAgICAgdXBkYXRlQm91bmRzRnJvbUJveChiYiwgX3Aub3ZlcmxheUJvdW5kcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1cGRhdGVCb3VuZHNGcm9tQm94KGJiLCBfcC5ib2R5Qm91bmRzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG9wdHMuaW5jbHVkZUxhYmVscykge1xuICAgICAgaWYgKG9wdHMuaW5jbHVkZU1haW5MYWJlbHMgJiYgKCFpc0VkZ2UgfHwgb3B0cy5pbmNsdWRlU291cmNlTGFiZWxzICYmIG9wdHMuaW5jbHVkZVRhcmdldExhYmVscykpIHtcbiAgICAgICAgdXBkYXRlQm91bmRzRnJvbUJveChiYiwgX3AubGFiZWxCb3VuZHMuYWxsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChvcHRzLmluY2x1ZGVNYWluTGFiZWxzKSB7XG4gICAgICAgICAgdXBkYXRlQm91bmRzRnJvbUJveChiYiwgX3AubGFiZWxCb3VuZHMubWFpblJvdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdHMuaW5jbHVkZVNvdXJjZUxhYmVscykge1xuICAgICAgICAgIHVwZGF0ZUJvdW5kc0Zyb21Cb3goYmIsIF9wLmxhYmVsQm91bmRzLnNvdXJjZVJvdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdHMuaW5jbHVkZVRhcmdldExhYmVscykge1xuICAgICAgICAgIHVwZGF0ZUJvdW5kc0Zyb21Cb3goYmIsIF9wLmxhYmVsQm91bmRzLnRhcmdldFJvdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgYmIudyA9IGJiLngyIC0gYmIueDE7XG4gICAgYmIuaCA9IGJiLnkyIC0gYmIueTE7XG4gIH1cbiAgcmV0dXJuIGJiO1xufTtcbnZhciBkZWZCYk9wdHMgPSB7XG4gIGluY2x1ZGVOb2RlczogdHJ1ZSxcbiAgaW5jbHVkZUVkZ2VzOiB0cnVlLFxuICBpbmNsdWRlTGFiZWxzOiB0cnVlLFxuICBpbmNsdWRlTWFpbkxhYmVsczogdHJ1ZSxcbiAgaW5jbHVkZVNvdXJjZUxhYmVsczogdHJ1ZSxcbiAgaW5jbHVkZVRhcmdldExhYmVsczogdHJ1ZSxcbiAgaW5jbHVkZU92ZXJsYXlzOiB0cnVlLFxuICBpbmNsdWRlVW5kZXJsYXlzOiB0cnVlLFxuICBpbmNsdWRlT3V0bGluZXM6IHRydWUsXG4gIHVzZUNhY2hlOiB0cnVlXG59O1xudmFyIGRlZkJiT3B0c0tleSA9IGdldEtleShkZWZCYk9wdHMpO1xudmFyIGZpbGxlZEJiT3B0cyA9IGRlZmF1bHRzJGcoZGVmQmJPcHRzKTtcbmVsZXNmbiRiLmJvdW5kaW5nQm94ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgdmFyIGJvdW5kcztcbiAgdmFyIHVzZUNhY2hlID0gb3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IG9wdGlvbnMudXNlQ2FjaGUgPT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLnVzZUNhY2hlID09PSB0cnVlO1xuICB2YXIgaXNEaXJ0eSA9IG1lbW9pemUoZnVuY3Rpb24gKGVsZSkge1xuICAgIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgICByZXR1cm4gX3AuYmJDYWNoZSA9PSBudWxsIHx8IF9wLnN0eWxlRGlydHkgfHwgX3AuYmJDYWNoZVBvc0tleSAhPT0gZ2V0Qm91bmRpbmdCb3hQb3NLZXkoZWxlKTtcbiAgfSwgZnVuY3Rpb24gKGVsZSkge1xuICAgIHJldHVybiBlbGUuaWQoKTtcbiAgfSk7XG5cbiAgLy8gdGhlIG1haW4gdXNlY2FzZSBpcyBlbGUuYm91bmRpbmdCb3goKSBmb3IgYSBzaW5nbGUgZWxlbWVudCB3aXRoIG5vL2RlZiBvcHRpb25zXG4gIC8vIHNwZWNpZmllZCBzLnQuIHRoZSBjYWNoZSBpcyB1c2VkLCBzbyBjaGVjayBmb3IgdGhpcyBjYXNlIHRvIG1ha2UgaXQgZmFzdGVyIGJ5XG4gIC8vIGF2b2lkaW5nIHRoZSBvdmVyaGVhZCBvZiB0aGUgcmVzdCBvZiB0aGUgZnVuY3Rpb25cbiAgaWYgKHVzZUNhY2hlICYmIHRoaXMubGVuZ3RoID09PSAxICYmICFpc0RpcnR5KHRoaXNbMF0pKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgb3B0aW9ucyA9IGRlZkJiT3B0cztcbiAgICB9IGVsc2Uge1xuICAgICAgb3B0aW9ucyA9IGZpbGxlZEJiT3B0cyhvcHRpb25zKTtcbiAgICB9XG4gICAgYm91bmRzID0gY2FjaGVkQm91bmRpbmdCb3hJbXBsKHRoaXNbMF0sIG9wdGlvbnMpO1xuICB9IGVsc2Uge1xuICAgIGJvdW5kcyA9IG1ha2VCb3VuZGluZ0JveCgpO1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IGRlZkJiT3B0cztcbiAgICB2YXIgb3B0cyA9IGZpbGxlZEJiT3B0cyhvcHRpb25zKTtcbiAgICB2YXIgZWxlcyA9IHRoaXM7XG4gICAgdmFyIGN5ID0gZWxlcy5jeSgpO1xuICAgIHZhciBzdHlsZUVuYWJsZWQgPSBjeS5zdHlsZUVuYWJsZWQoKTtcblxuICAgIC8vIGNhY2hlIHRoZSBpc0RpcnR5IHN0YXRlIGZvciBhbGwgZWxlcywgZWRnZXMgZmlyc3Qgc2luY2UgdGhleSBkZXBlbmQgb24gbm9kZSBzdGF0ZVxuICAgIHRoaXMuZWRnZXMoKS5mb3JFYWNoKGlzRGlydHkpO1xuICAgIHRoaXMubm9kZXMoKS5mb3JFYWNoKGlzRGlydHkpO1xuICAgIGlmIChzdHlsZUVuYWJsZWQpIHtcbiAgICAgIHRoaXMucmVjYWxjdWxhdGVSZW5kZXJlZFN0eWxlKHVzZUNhY2hlKTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVDb21wb3VuZEJvdW5kcyghdXNlQ2FjaGUpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgICBpZiAoaXNEaXJ0eShlbGUpKSB7XG4gICAgICAgIGVsZS5kaXJ0eUJvdW5kaW5nQm94Q2FjaGUoKTtcbiAgICAgIH1cbiAgICAgIHVwZGF0ZUJvdW5kc0Zyb21Cb3goYm91bmRzLCBjYWNoZWRCb3VuZGluZ0JveEltcGwoZWxlLCBvcHRzKSk7XG4gICAgfVxuICB9XG4gIGJvdW5kcy54MSA9IG5vbmluZihib3VuZHMueDEpO1xuICBib3VuZHMueTEgPSBub25pbmYoYm91bmRzLnkxKTtcbiAgYm91bmRzLngyID0gbm9uaW5mKGJvdW5kcy54Mik7XG4gIGJvdW5kcy55MiA9IG5vbmluZihib3VuZHMueTIpO1xuICBib3VuZHMudyA9IG5vbmluZihib3VuZHMueDIgLSBib3VuZHMueDEpO1xuICBib3VuZHMuaCA9IG5vbmluZihib3VuZHMueTIgLSBib3VuZHMueTEpO1xuICByZXR1cm4gYm91bmRzO1xufTtcbmVsZXNmbiRiLmRpcnR5Qm91bmRpbmdCb3hDYWNoZSA9IGZ1bmN0aW9uICgpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIF9wID0gdGhpc1tpXS5fcHJpdmF0ZTtcbiAgICBfcC5iYkNhY2hlID0gbnVsbDtcbiAgICBfcC5iYkNhY2hlUG9zS2V5ID0gbnVsbDtcbiAgICBfcC5ib2R5Qm91bmRzID0gbnVsbDtcbiAgICBfcC5vdmVybGF5Qm91bmRzID0gbnVsbDtcbiAgICBfcC5sYWJlbEJvdW5kcy5hbGwgPSBudWxsO1xuICAgIF9wLmxhYmVsQm91bmRzLnNvdXJjZSA9IG51bGw7XG4gICAgX3AubGFiZWxCb3VuZHMudGFyZ2V0ID0gbnVsbDtcbiAgICBfcC5sYWJlbEJvdW5kcy5tYWluID0gbnVsbDtcbiAgICBfcC5sYWJlbEJvdW5kcy5zb3VyY2VSb3QgPSBudWxsO1xuICAgIF9wLmxhYmVsQm91bmRzLnRhcmdldFJvdCA9IG51bGw7XG4gICAgX3AubGFiZWxCb3VuZHMubWFpblJvdCA9IG51bGw7XG4gICAgX3AuYXJyb3dCb3VuZHMuc291cmNlID0gbnVsbDtcbiAgICBfcC5hcnJvd0JvdW5kcy50YXJnZXQgPSBudWxsO1xuICAgIF9wLmFycm93Qm91bmRzWydtaWQtc291cmNlJ10gPSBudWxsO1xuICAgIF9wLmFycm93Qm91bmRzWydtaWQtdGFyZ2V0J10gPSBudWxsO1xuICB9XG4gIHRoaXMuZW1pdEFuZE5vdGlmeSgnYm91bmRzJyk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gcHJpdmF0ZSBoZWxwZXIgdG8gZ2V0IGJvdW5kaW5nIGJveCBmb3IgY3VzdG9tIG5vZGUgcG9zaXRpb25zXG4vLyAtIGdvb2QgZm9yIHBlcmYgaW4gY2VydGFpbiBjYXNlcyBidXQgY3VycmVudGx5IHJlcXVpcmVzIGRpcnR5aW5nIHRoZSByZW5kZXJlZCBzdHlsZVxuLy8gLSB3b3VsZCBiZSBiZXR0ZXIgdG8gbm90IG1vZGlmeSB0aGUgbm9kZXMgYnV0IHRoZSBub2RlcyBhcmUgcmVhZCBkaXJlY3RseSBldmVyeXdoZXJlIGluIHRoZSByZW5kZXJlci4uLlxuLy8gLSB0cnkgdG8gdXNlIGZvciBvbmx5IHRoaW5ncyBsaWtlIGRpc2NyZXRlIGxheW91dHMgd2hlcmUgdGhlIG5vZGUgcG9zaXRpb24gd291bGQgY2hhbmdlIGFueXdheVxuZWxlc2ZuJGIuYm91bmRpbmdCb3hBdCA9IGZ1bmN0aW9uIChmbikge1xuICB2YXIgbm9kZXMgPSB0aGlzLm5vZGVzKCk7XG4gIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgdmFyIGhhc0NvbXBvdW5kTm9kZXMgPSBjeS5oYXNDb21wb3VuZE5vZGVzKCk7XG4gIHZhciBwYXJlbnRzID0gY3kuY29sbGVjdGlvbigpO1xuICBpZiAoaGFzQ29tcG91bmROb2Rlcykge1xuICAgIHBhcmVudHMgPSBub2Rlcy5maWx0ZXIoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIHJldHVybiBub2RlLmlzUGFyZW50KCk7XG4gICAgfSk7XG4gICAgbm9kZXMgPSBub2Rlcy5ub3QocGFyZW50cyk7XG4gIH1cbiAgaWYgKHBsYWluT2JqZWN0KGZuKSkge1xuICAgIHZhciBvYmogPSBmbjtcbiAgICBmbiA9IGZ1bmN0aW9uIGZuKCkge1xuICAgICAgcmV0dXJuIG9iajtcbiAgICB9O1xuICB9XG4gIHZhciBzdG9yZU9sZFBvcyA9IGZ1bmN0aW9uIHN0b3JlT2xkUG9zKG5vZGUsIGkpIHtcbiAgICByZXR1cm4gbm9kZS5fcHJpdmF0ZS5iYkF0T2xkUG9zID0gZm4obm9kZSwgaSk7XG4gIH07XG4gIHZhciBnZXRPbGRQb3MgPSBmdW5jdGlvbiBnZXRPbGRQb3Mobm9kZSkge1xuICAgIHJldHVybiBub2RlLl9wcml2YXRlLmJiQXRPbGRQb3M7XG4gIH07XG4gIGN5LnN0YXJ0QmF0Y2goKTtcbiAgbm9kZXMuZm9yRWFjaChzdG9yZU9sZFBvcykuc2lsZW50UG9zaXRpb25zKGZuKTtcbiAgaWYgKGhhc0NvbXBvdW5kTm9kZXMpIHtcbiAgICBwYXJlbnRzLmRpcnR5Q29tcG91bmRCb3VuZHNDYWNoZSgpO1xuICAgIHBhcmVudHMuZGlydHlCb3VuZGluZ0JveENhY2hlKCk7XG4gICAgcGFyZW50cy51cGRhdGVDb21wb3VuZEJvdW5kcyh0cnVlKTsgLy8gZm9yY2UgdXBkYXRlIGIvYyB3ZSdyZSBpbnNpZGUgYSBiYXRjaCBjeWNsZVxuICB9XG4gIHZhciBiYiA9IGNvcHlCb3VuZGluZ0JveCh0aGlzLmJvdW5kaW5nQm94KHtcbiAgICB1c2VDYWNoZTogZmFsc2VcbiAgfSkpO1xuICBub2Rlcy5zaWxlbnRQb3NpdGlvbnMoZ2V0T2xkUG9zKTtcbiAgaWYgKGhhc0NvbXBvdW5kTm9kZXMpIHtcbiAgICBwYXJlbnRzLmRpcnR5Q29tcG91bmRCb3VuZHNDYWNoZSgpO1xuICAgIHBhcmVudHMuZGlydHlCb3VuZGluZ0JveENhY2hlKCk7XG4gICAgcGFyZW50cy51cGRhdGVDb21wb3VuZEJvdW5kcyh0cnVlKTsgLy8gZm9yY2UgdXBkYXRlIGIvYyB3ZSdyZSBpbnNpZGUgYSBiYXRjaCBjeWNsZVxuICB9XG4gIGN5LmVuZEJhdGNoKCk7XG4gIHJldHVybiBiYjtcbn07XG5mbiQzLmJvdW5kaW5nYm94ID0gZm4kMy5iYiA9IGZuJDMuYm91bmRpbmdCb3g7XG5mbiQzLnJlbmRlcmVkQm91bmRpbmdib3ggPSBmbiQzLnJlbmRlcmVkQm91bmRpbmdCb3g7XG52YXIgYm91bmRzID0gZWxlc2ZuJGI7XG5cbnZhciBmbiQyLCBlbGVzZm4kYTtcbmZuJDIgPSBlbGVzZm4kYSA9IHt9O1xudmFyIGRlZmluZURpbUZucyA9IGZ1bmN0aW9uIGRlZmluZURpbUZucyhvcHRzKSB7XG4gIG9wdHMudXBwZXJjYXNlTmFtZSA9IGNhcGl0YWxpemUob3B0cy5uYW1lKTtcbiAgb3B0cy5hdXRvTmFtZSA9ICdhdXRvJyArIG9wdHMudXBwZXJjYXNlTmFtZTtcbiAgb3B0cy5sYWJlbE5hbWUgPSAnbGFiZWwnICsgb3B0cy51cHBlcmNhc2VOYW1lO1xuICBvcHRzLm91dGVyTmFtZSA9ICdvdXRlcicgKyBvcHRzLnVwcGVyY2FzZU5hbWU7XG4gIG9wdHMudXBwZXJjYXNlT3V0ZXJOYW1lID0gY2FwaXRhbGl6ZShvcHRzLm91dGVyTmFtZSk7XG4gIGZuJDJbb3B0cy5uYW1lXSA9IGZ1bmN0aW9uIGRpbUltcGwoKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICAgIHZhciBjeSA9IF9wLmN5O1xuICAgIHZhciBzdHlsZUVuYWJsZWQgPSBjeS5fcHJpdmF0ZS5zdHlsZUVuYWJsZWQ7XG4gICAgaWYgKGVsZSkge1xuICAgICAgaWYgKHN0eWxlRW5hYmxlZCkge1xuICAgICAgICBpZiAoZWxlLmlzUGFyZW50KCkpIHtcbiAgICAgICAgICBlbGUudXBkYXRlQ29tcG91bmRCb3VuZHMoKTtcbiAgICAgICAgICByZXR1cm4gX3Bbb3B0cy5hdXRvTmFtZV0gfHwgMDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZCA9IGVsZS5wc3R5bGUob3B0cy5uYW1lKTtcbiAgICAgICAgc3dpdGNoIChkLnN0clZhbHVlKSB7XG4gICAgICAgICAgY2FzZSAnbGFiZWwnOlxuICAgICAgICAgICAgZWxlLnJlY2FsY3VsYXRlUmVuZGVyZWRTdHlsZSgpO1xuICAgICAgICAgICAgcmV0dXJuIF9wLnJzdHlsZVtvcHRzLmxhYmVsTmFtZV0gfHwgMDtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGQucGZWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBmbiQyWydvdXRlcicgKyBvcHRzLnVwcGVyY2FzZU5hbWVdID0gZnVuY3Rpb24gb3V0ZXJEaW1JbXBsKCkge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgICB2YXIgY3kgPSBfcC5jeTtcbiAgICB2YXIgc3R5bGVFbmFibGVkID0gY3kuX3ByaXZhdGUuc3R5bGVFbmFibGVkO1xuICAgIGlmIChlbGUpIHtcbiAgICAgIGlmIChzdHlsZUVuYWJsZWQpIHtcbiAgICAgICAgdmFyIGRpbSA9IGVsZVtvcHRzLm5hbWVdKCk7XG4gICAgICAgIHZhciBib3JkZXJQb3MgPSBlbGUucHN0eWxlKCdib3JkZXItcG9zaXRpb24nKS52YWx1ZTtcbiAgICAgICAgdmFyIGJvcmRlcjtcbiAgICAgICAgaWYgKGJvcmRlclBvcyA9PT0gJ2NlbnRlcicpIHtcbiAgICAgICAgICBib3JkZXIgPSBlbGUucHN0eWxlKCdib3JkZXItd2lkdGgnKS5wZlZhbHVlOyAvLyBuLmIuIDEvMiBlYWNoIHNpZGVcbiAgICAgICAgfSBlbHNlIGlmIChib3JkZXJQb3MgPT09ICdvdXRzaWRlJykge1xuICAgICAgICAgIGJvcmRlciA9IDIgKiBlbGUucHN0eWxlKCdib3JkZXItd2lkdGgnKS5wZlZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vICdpbnNpZGUnXG4gICAgICAgICAgYm9yZGVyID0gMDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcGFkZGluZyA9IDIgKiBlbGUucGFkZGluZygpO1xuICAgICAgICByZXR1cm4gZGltICsgYm9yZGVyICsgcGFkZGluZztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgZm4kMlsncmVuZGVyZWQnICsgb3B0cy51cHBlcmNhc2VOYW1lXSA9IGZ1bmN0aW9uIHJlbmRlcmVkRGltSW1wbCgpIHtcbiAgICB2YXIgZWxlID0gdGhpc1swXTtcbiAgICBpZiAoZWxlKSB7XG4gICAgICB2YXIgZCA9IGVsZVtvcHRzLm5hbWVdKCk7XG4gICAgICByZXR1cm4gZCAqIHRoaXMuY3koKS56b29tKCk7XG4gICAgfVxuICB9O1xuICBmbiQyWydyZW5kZXJlZCcgKyBvcHRzLnVwcGVyY2FzZU91dGVyTmFtZV0gPSBmdW5jdGlvbiByZW5kZXJlZE91dGVyRGltSW1wbCgpIHtcbiAgICB2YXIgZWxlID0gdGhpc1swXTtcbiAgICBpZiAoZWxlKSB7XG4gICAgICB2YXIgb2QgPSBlbGVbb3B0cy5vdXRlck5hbWVdKCk7XG4gICAgICByZXR1cm4gb2QgKiB0aGlzLmN5KCkuem9vbSgpO1xuICAgIH1cbiAgfTtcbn07XG5kZWZpbmVEaW1GbnMoe1xuICBuYW1lOiAnd2lkdGgnXG59KTtcbmRlZmluZURpbUZucyh7XG4gIG5hbWU6ICdoZWlnaHQnXG59KTtcbmVsZXNmbiRhLnBhZGRpbmcgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBlbGUgPSB0aGlzWzBdO1xuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIGlmIChlbGUuaXNQYXJlbnQoKSkge1xuICAgIGVsZS51cGRhdGVDb21wb3VuZEJvdW5kcygpO1xuICAgIGlmIChfcC5hdXRvUGFkZGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gX3AuYXV0b1BhZGRpbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBlbGUucHN0eWxlKCdwYWRkaW5nJykucGZWYWx1ZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGVsZS5wc3R5bGUoJ3BhZGRpbmcnKS5wZlZhbHVlO1xuICB9XG59O1xuZWxlc2ZuJGEucGFkZGVkSGVpZ2h0ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZWxlID0gdGhpc1swXTtcbiAgcmV0dXJuIGVsZS5oZWlnaHQoKSArIDIgKiBlbGUucGFkZGluZygpO1xufTtcbmVsZXNmbiRhLnBhZGRlZFdpZHRoID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZWxlID0gdGhpc1swXTtcbiAgcmV0dXJuIGVsZS53aWR0aCgpICsgMiAqIGVsZS5wYWRkaW5nKCk7XG59O1xudmFyIHdpZHRoSGVpZ2h0ID0gZWxlc2ZuJGE7XG5cbnZhciBpZkVkZ2UgPSBmdW5jdGlvbiBpZkVkZ2UoZWxlLCBnZXRWYWx1ZSkge1xuICBpZiAoZWxlLmlzRWRnZSgpICYmIGVsZS50YWtlc1VwU3BhY2UoKSkge1xuICAgIHJldHVybiBnZXRWYWx1ZShlbGUpO1xuICB9XG59O1xudmFyIGlmRWRnZVJlbmRlcmVkUG9zaXRpb24gPSBmdW5jdGlvbiBpZkVkZ2VSZW5kZXJlZFBvc2l0aW9uKGVsZSwgZ2V0UG9pbnQpIHtcbiAgaWYgKGVsZS5pc0VkZ2UoKSAmJiBlbGUudGFrZXNVcFNwYWNlKCkpIHtcbiAgICB2YXIgY3kgPSBlbGUuY3koKTtcbiAgICByZXR1cm4gbW9kZWxUb1JlbmRlcmVkUG9zaXRpb24kMShnZXRQb2ludChlbGUpLCBjeS56b29tKCksIGN5LnBhbigpKTtcbiAgfVxufTtcbnZhciBpZkVkZ2VSZW5kZXJlZFBvc2l0aW9ucyA9IGZ1bmN0aW9uIGlmRWRnZVJlbmRlcmVkUG9zaXRpb25zKGVsZSwgZ2V0UG9pbnRzKSB7XG4gIGlmIChlbGUuaXNFZGdlKCkgJiYgZWxlLnRha2VzVXBTcGFjZSgpKSB7XG4gICAgdmFyIGN5ID0gZWxlLmN5KCk7XG4gICAgdmFyIHBhbiA9IGN5LnBhbigpO1xuICAgIHZhciB6b29tID0gY3kuem9vbSgpO1xuICAgIHJldHVybiBnZXRQb2ludHMoZWxlKS5tYXAoZnVuY3Rpb24gKHApIHtcbiAgICAgIHJldHVybiBtb2RlbFRvUmVuZGVyZWRQb3NpdGlvbiQxKHAsIHpvb20sIHBhbik7XG4gICAgfSk7XG4gIH1cbn07XG52YXIgY29udHJvbFBvaW50cyA9IGZ1bmN0aW9uIGNvbnRyb2xQb2ludHMoZWxlKSB7XG4gIHJldHVybiBlbGUucmVuZGVyZXIoKS5nZXRDb250cm9sUG9pbnRzKGVsZSk7XG59O1xudmFyIHNlZ21lbnRQb2ludHMgPSBmdW5jdGlvbiBzZWdtZW50UG9pbnRzKGVsZSkge1xuICByZXR1cm4gZWxlLnJlbmRlcmVyKCkuZ2V0U2VnbWVudFBvaW50cyhlbGUpO1xufTtcbnZhciBzb3VyY2VFbmRwb2ludCA9IGZ1bmN0aW9uIHNvdXJjZUVuZHBvaW50KGVsZSkge1xuICByZXR1cm4gZWxlLnJlbmRlcmVyKCkuZ2V0U291cmNlRW5kcG9pbnQoZWxlKTtcbn07XG52YXIgdGFyZ2V0RW5kcG9pbnQgPSBmdW5jdGlvbiB0YXJnZXRFbmRwb2ludChlbGUpIHtcbiAgcmV0dXJuIGVsZS5yZW5kZXJlcigpLmdldFRhcmdldEVuZHBvaW50KGVsZSk7XG59O1xudmFyIG1pZHBvaW50ID0gZnVuY3Rpb24gbWlkcG9pbnQoZWxlKSB7XG4gIHJldHVybiBlbGUucmVuZGVyZXIoKS5nZXRFZGdlTWlkcG9pbnQoZWxlKTtcbn07XG52YXIgcHRzID0ge1xuICBjb250cm9sUG9pbnRzOiB7XG4gICAgZ2V0OiBjb250cm9sUG9pbnRzLFxuICAgIG11bHQ6IHRydWVcbiAgfSxcbiAgc2VnbWVudFBvaW50czoge1xuICAgIGdldDogc2VnbWVudFBvaW50cyxcbiAgICBtdWx0OiB0cnVlXG4gIH0sXG4gIHNvdXJjZUVuZHBvaW50OiB7XG4gICAgZ2V0OiBzb3VyY2VFbmRwb2ludFxuICB9LFxuICB0YXJnZXRFbmRwb2ludDoge1xuICAgIGdldDogdGFyZ2V0RW5kcG9pbnRcbiAgfSxcbiAgbWlkcG9pbnQ6IHtcbiAgICBnZXQ6IG1pZHBvaW50XG4gIH1cbn07XG52YXIgcmVuZGVyZWROYW1lID0gZnVuY3Rpb24gcmVuZGVyZWROYW1lKG5hbWUpIHtcbiAgcmV0dXJuICdyZW5kZXJlZCcgKyBuYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnN1YnN0cigxKTtcbn07XG52YXIgZWRnZVBvaW50cyA9IE9iamVjdC5rZXlzKHB0cykucmVkdWNlKGZ1bmN0aW9uIChvYmosIG5hbWUpIHtcbiAgdmFyIHNwZWMgPSBwdHNbbmFtZV07XG4gIHZhciByTmFtZSA9IHJlbmRlcmVkTmFtZShuYW1lKTtcbiAgb2JqW25hbWVdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBpZkVkZ2UodGhpcywgc3BlYy5nZXQpO1xuICB9O1xuICBpZiAoc3BlYy5tdWx0KSB7XG4gICAgb2JqW3JOYW1lXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBpZkVkZ2VSZW5kZXJlZFBvc2l0aW9ucyh0aGlzLCBzcGVjLmdldCk7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBvYmpbck5hbWVdID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGlmRWRnZVJlbmRlcmVkUG9zaXRpb24odGhpcywgc3BlYy5nZXQpO1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIG9iajtcbn0sIHt9KTtcblxudmFyIGRpbWVuc2lvbnMgPSBleHRlbmQoe30sIHBvc2l0aW9uLCBib3VuZHMsIHdpZHRoSGVpZ2h0LCBlZGdlUG9pbnRzKTtcblxuLyohXG5FdmVudCBvYmplY3QgYmFzZWQgb24galF1ZXJ5IGV2ZW50cywgTUlUIGxpY2Vuc2VcblxuaHR0cHM6Ly9qcXVlcnkub3JnL2xpY2Vuc2UvXG5odHRwczovL3RsZHJsZWdhbC5jb20vbGljZW5zZS9taXQtbGljZW5zZVxuaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnkvYmxvYi9tYXN0ZXIvc3JjL2V2ZW50LmpzXG4qL1xuXG52YXIgRXZlbnQgPSBmdW5jdGlvbiBFdmVudChzcmMsIHByb3BzKSB7XG4gIHRoaXMucmVjeWNsZShzcmMsIHByb3BzKTtcbn07XG5mdW5jdGlvbiByZXR1cm5GYWxzZSgpIHtcbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gcmV0dXJuVHJ1ZSgpIHtcbiAgcmV0dXJuIHRydWU7XG59XG5cbi8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMDMwMzMxL2VjbWEtc2NyaXB0LWJpbmRpbmcuaHRtbFxuRXZlbnQucHJvdG90eXBlID0ge1xuICBpbnN0YW5jZVN0cmluZzogZnVuY3Rpb24gaW5zdGFuY2VTdHJpbmcoKSB7XG4gICAgcmV0dXJuICdldmVudCc7XG4gIH0sXG4gIHJlY3ljbGU6IGZ1bmN0aW9uIHJlY3ljbGUoc3JjLCBwcm9wcykge1xuICAgIHRoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSB0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSByZXR1cm5GYWxzZTtcbiAgICBpZiAoc3JjICE9IG51bGwgJiYgc3JjLnByZXZlbnREZWZhdWx0KSB7XG4gICAgICAvLyBCcm93c2VyIEV2ZW50IG9iamVjdFxuICAgICAgdGhpcy50eXBlID0gc3JjLnR5cGU7XG5cbiAgICAgIC8vIEV2ZW50cyBidWJibGluZyB1cCB0aGUgZG9jdW1lbnQgbWF5IGhhdmUgYmVlbiBtYXJrZWQgYXMgcHJldmVudGVkXG4gICAgICAvLyBieSBhIGhhbmRsZXIgbG93ZXIgZG93biB0aGUgdHJlZTsgcmVmbGVjdCB0aGUgY29ycmVjdCB2YWx1ZS5cbiAgICAgIHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gc3JjLmRlZmF1bHRQcmV2ZW50ZWQgPyByZXR1cm5UcnVlIDogcmV0dXJuRmFsc2U7XG4gICAgfSBlbHNlIGlmIChzcmMgIT0gbnVsbCAmJiBzcmMudHlwZSkge1xuICAgICAgLy8gUGxhaW4gb2JqZWN0IGNvbnRhaW5pbmcgYWxsIGV2ZW50IGRldGFpbHNcbiAgICAgIHByb3BzID0gc3JjO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBFdmVudCBzdHJpbmdcbiAgICAgIHRoaXMudHlwZSA9IHNyYztcbiAgICB9XG5cbiAgICAvLyBQdXQgZXhwbGljaXRseSBwcm92aWRlZCBwcm9wZXJ0aWVzIG9udG8gdGhlIGV2ZW50IG9iamVjdFxuICAgIGlmIChwcm9wcyAhPSBudWxsKSB7XG4gICAgICAvLyBtb3JlIGVmZmljaWVudCB0byBtYW51YWxseSBjb3B5IGZpZWxkcyB3ZSB1c2VcbiAgICAgIHRoaXMub3JpZ2luYWxFdmVudCA9IHByb3BzLm9yaWdpbmFsRXZlbnQ7XG4gICAgICB0aGlzLnR5cGUgPSBwcm9wcy50eXBlICE9IG51bGwgPyBwcm9wcy50eXBlIDogdGhpcy50eXBlO1xuICAgICAgdGhpcy5jeSA9IHByb3BzLmN5O1xuICAgICAgdGhpcy50YXJnZXQgPSBwcm9wcy50YXJnZXQ7XG4gICAgICB0aGlzLnBvc2l0aW9uID0gcHJvcHMucG9zaXRpb247XG4gICAgICB0aGlzLnJlbmRlcmVkUG9zaXRpb24gPSBwcm9wcy5yZW5kZXJlZFBvc2l0aW9uO1xuICAgICAgdGhpcy5uYW1lc3BhY2UgPSBwcm9wcy5uYW1lc3BhY2U7XG4gICAgICB0aGlzLmxheW91dCA9IHByb3BzLmxheW91dDtcbiAgICB9XG4gICAgaWYgKHRoaXMuY3kgIT0gbnVsbCAmJiB0aGlzLnBvc2l0aW9uICE9IG51bGwgJiYgdGhpcy5yZW5kZXJlZFBvc2l0aW9uID09IG51bGwpIHtcbiAgICAgIC8vIGNyZWF0ZSBhIHJlbmRlcmVkIHBvc2l0aW9uIGJhc2VkIG9uIHRoZSBwYXNzZWQgcG9zaXRpb25cbiAgICAgIHZhciBwb3MgPSB0aGlzLnBvc2l0aW9uO1xuICAgICAgdmFyIHpvb20gPSB0aGlzLmN5Lnpvb20oKTtcbiAgICAgIHZhciBwYW4gPSB0aGlzLmN5LnBhbigpO1xuICAgICAgdGhpcy5yZW5kZXJlZFBvc2l0aW9uID0ge1xuICAgICAgICB4OiBwb3MueCAqIHpvb20gKyBwYW4ueCxcbiAgICAgICAgeTogcG9zLnkgKiB6b29tICsgcGFuLnlcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGEgdGltZXN0YW1wIGlmIGluY29taW5nIGV2ZW50IGRvZXNuJ3QgaGF2ZSBvbmVcbiAgICB0aGlzLnRpbWVTdGFtcCA9IHNyYyAmJiBzcmMudGltZVN0YW1wIHx8IERhdGUubm93KCk7XG4gIH0sXG4gIHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbiBwcmV2ZW50RGVmYXVsdCgpIHtcbiAgICB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IHJldHVyblRydWU7XG4gICAgdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7XG4gICAgaWYgKCFlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gaWYgcHJldmVudERlZmF1bHQgZXhpc3RzIHJ1biBpdCBvbiB0aGUgb3JpZ2luYWwgZXZlbnRcbiAgICBpZiAoZS5wcmV2ZW50RGVmYXVsdCkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfSxcbiAgc3RvcFByb3BhZ2F0aW9uOiBmdW5jdGlvbiBzdG9wUHJvcGFnYXRpb24oKSB7XG4gICAgdGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7XG4gICAgdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7XG4gICAgaWYgKCFlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gaWYgc3RvcFByb3BhZ2F0aW9uIGV4aXN0cyBydW4gaXQgb24gdGhlIG9yaWdpbmFsIGV2ZW50XG4gICAgaWYgKGUuc3RvcFByb3BhZ2F0aW9uKSB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cbiAgfSxcbiAgc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOiBmdW5jdGlvbiBzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSB7XG4gICAgdGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7XG4gICAgdGhpcy5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfSxcbiAgaXNEZWZhdWx0UHJldmVudGVkOiByZXR1cm5GYWxzZSxcbiAgaXNQcm9wYWdhdGlvblN0b3BwZWQ6IHJldHVybkZhbHNlLFxuICBpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2Vcbn07XG5cbnZhciBldmVudFJlZ2V4ID0gL14oW14uXSspKFxcLig/OlteLl0rKSk/JC87IC8vIHJlZ2V4IGZvciBtYXRjaGluZyBldmVudCBzdHJpbmdzIChlLmcuIFwiY2xpY2submFtZXNwYWNlXCIpXG52YXIgdW5pdmVyc2FsTmFtZXNwYWNlID0gJy4qJzsgLy8gbWF0Y2hlcyBhcyBpZiBubyBuYW1lc3BhY2Ugc3BlY2lmaWVkIGFuZCBwcmV2ZW50cyB1c2VycyBmcm9tIHVuYmluZGluZyBhY2NpZGVudGFsbHlcblxudmFyIGRlZmF1bHRzJDggPSB7XG4gIHF1YWxpZmllckNvbXBhcmU6IGZ1bmN0aW9uIHF1YWxpZmllckNvbXBhcmUocTEsIHEyKSB7XG4gICAgcmV0dXJuIHExID09PSBxMjtcbiAgfSxcbiAgZXZlbnRNYXRjaGVzOiBmdW5jdGlvbiBldmVudE1hdGNoZXMoLypjb250ZXh0LCBsaXN0ZW5lciwgZXZlbnRPYmoqL1xuICApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgYWRkRXZlbnRGaWVsZHM6IGZ1bmN0aW9uIGFkZEV2ZW50RmllbGRzKC8qY29udGV4dCwgZXZ0Ki9cbiAgKSB7fSxcbiAgY2FsbGJhY2tDb250ZXh0OiBmdW5jdGlvbiBjYWxsYmFja0NvbnRleHQoY29udGV4dCAvKiwgbGlzdGVuZXIsIGV2ZW50T2JqKi8pIHtcbiAgICByZXR1cm4gY29udGV4dDtcbiAgfSxcbiAgYmVmb3JlRW1pdDogZnVuY3Rpb24gYmVmb3JlRW1pdCgvKiBjb250ZXh0LCBsaXN0ZW5lciwgZXZlbnRPYmogKi9cbiAgKSB7fSxcbiAgYWZ0ZXJFbWl0OiBmdW5jdGlvbiBhZnRlckVtaXQoLyogY29udGV4dCwgbGlzdGVuZXIsIGV2ZW50T2JqICovXG4gICkge30sXG4gIGJ1YmJsZTogZnVuY3Rpb24gYnViYmxlKC8qY29udGV4dCovXG4gICkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgcGFyZW50OiBmdW5jdGlvbiBwYXJlbnQoLypjb250ZXh0Ki9cbiAgKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0sXG4gIGNvbnRleHQ6IG51bGxcbn07XG52YXIgZGVmYXVsdHNLZXlzID0gT2JqZWN0LmtleXMoZGVmYXVsdHMkOCk7XG52YXIgZW1wdHlPcHRzID0ge307XG5mdW5jdGlvbiBFbWl0dGVyKCkge1xuICB2YXIgb3B0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZW1wdHlPcHRzO1xuICB2YXIgY29udGV4dCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkO1xuICAvLyBtaWNyby1vcHRpbWlzYXRpb24gdnMgT2JqZWN0LmFzc2lnbigpIC0tIHJlZHVjZXMgRWxlbWVudCBpbnN0YW50aWF0aW9uIHRpbWVcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZWZhdWx0c0tleXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIga2V5ID0gZGVmYXVsdHNLZXlzW2ldO1xuICAgIHRoaXNba2V5XSA9IG9wdHNba2V5XSB8fCBkZWZhdWx0cyQ4W2tleV07XG4gIH1cbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dCB8fCB0aGlzLmNvbnRleHQ7XG4gIHRoaXMubGlzdGVuZXJzID0gW107XG4gIHRoaXMuZW1pdHRpbmcgPSAwO1xufVxudmFyIHAgPSBFbWl0dGVyLnByb3RvdHlwZTtcbnZhciBmb3JFYWNoRXZlbnQgPSBmdW5jdGlvbiBmb3JFYWNoRXZlbnQoc2VsZiwgaGFuZGxlciwgZXZlbnRzLCBxdWFsaWZpZXIsIGNhbGxiYWNrLCBjb25mLCBjb25mT3ZlcnJpZGVzKSB7XG4gIGlmIChmbiQ2KHF1YWxpZmllcikpIHtcbiAgICBjYWxsYmFjayA9IHF1YWxpZmllcjtcbiAgICBxdWFsaWZpZXIgPSBudWxsO1xuICB9XG4gIGlmIChjb25mT3ZlcnJpZGVzKSB7XG4gICAgaWYgKGNvbmYgPT0gbnVsbCkge1xuICAgICAgY29uZiA9IGNvbmZPdmVycmlkZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbmYgPSBleHRlbmQoe30sIGNvbmYsIGNvbmZPdmVycmlkZXMpO1xuICAgIH1cbiAgfVxuICB2YXIgZXZlbnRMaXN0ID0gYXJyYXkoZXZlbnRzKSA/IGV2ZW50cyA6IGV2ZW50cy5zcGxpdCgvXFxzKy8pO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGV2ZW50TGlzdC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBldnQgPSBldmVudExpc3RbaV07XG4gICAgaWYgKGVtcHR5U3RyaW5nKGV2dCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB2YXIgbWF0Y2ggPSBldnQubWF0Y2goZXZlbnRSZWdleCk7IC8vIHR5cGVbLm5hbWVzcGFjZV1cblxuICAgIGlmIChtYXRjaCkge1xuICAgICAgdmFyIHR5cGUgPSBtYXRjaFsxXTtcbiAgICAgIHZhciBuYW1lc3BhY2UgPSBtYXRjaFsyXSA/IG1hdGNoWzJdIDogbnVsbDtcbiAgICAgIHZhciByZXQgPSBoYW5kbGVyKHNlbGYsIGV2dCwgdHlwZSwgbmFtZXNwYWNlLCBxdWFsaWZpZXIsIGNhbGxiYWNrLCBjb25mKTtcbiAgICAgIGlmIChyZXQgPT09IGZhbHNlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSAvLyBhbGxvdyBleGl0aW5nIGVhcmx5XG4gICAgfVxuICB9XG59O1xudmFyIG1ha2VFdmVudE9iaiA9IGZ1bmN0aW9uIG1ha2VFdmVudE9iaihzZWxmLCBvYmopIHtcbiAgc2VsZi5hZGRFdmVudEZpZWxkcyhzZWxmLmNvbnRleHQsIG9iaik7XG4gIHJldHVybiBuZXcgRXZlbnQob2JqLnR5cGUsIG9iaik7XG59O1xudmFyIGZvckVhY2hFdmVudE9iaiA9IGZ1bmN0aW9uIGZvckVhY2hFdmVudE9iaihzZWxmLCBoYW5kbGVyLCBldmVudHMpIHtcbiAgaWYgKGV2ZW50KGV2ZW50cykpIHtcbiAgICBoYW5kbGVyKHNlbGYsIGV2ZW50cyk7XG4gICAgcmV0dXJuO1xuICB9IGVsc2UgaWYgKHBsYWluT2JqZWN0KGV2ZW50cykpIHtcbiAgICBoYW5kbGVyKHNlbGYsIG1ha2VFdmVudE9iaihzZWxmLCBldmVudHMpKTtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIGV2ZW50TGlzdCA9IGFycmF5KGV2ZW50cykgPyBldmVudHMgOiBldmVudHMuc3BsaXQoL1xccysvKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBldmVudExpc3QubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZXZ0ID0gZXZlbnRMaXN0W2ldO1xuICAgIGlmIChlbXB0eVN0cmluZyhldnQpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdmFyIG1hdGNoID0gZXZ0Lm1hdGNoKGV2ZW50UmVnZXgpOyAvLyB0eXBlWy5uYW1lc3BhY2VdXG5cbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIHZhciB0eXBlID0gbWF0Y2hbMV07XG4gICAgICB2YXIgbmFtZXNwYWNlID0gbWF0Y2hbMl0gPyBtYXRjaFsyXSA6IG51bGw7XG4gICAgICB2YXIgZXZlbnRPYmogPSBtYWtlRXZlbnRPYmooc2VsZiwge1xuICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICBuYW1lc3BhY2U6IG5hbWVzcGFjZSxcbiAgICAgICAgdGFyZ2V0OiBzZWxmLmNvbnRleHRcbiAgICAgIH0pO1xuICAgICAgaGFuZGxlcihzZWxmLCBldmVudE9iaik7XG4gICAgfVxuICB9XG59O1xucC5vbiA9IHAuYWRkTGlzdGVuZXIgPSBmdW5jdGlvbiAoZXZlbnRzLCBxdWFsaWZpZXIsIGNhbGxiYWNrLCBjb25mLCBjb25mT3ZlcnJpZGVzKSB7XG4gIGZvckVhY2hFdmVudCh0aGlzLCBmdW5jdGlvbiAoc2VsZiwgZXZlbnQsIHR5cGUsIG5hbWVzcGFjZSwgcXVhbGlmaWVyLCBjYWxsYmFjaywgY29uZikge1xuICAgIGlmIChmbiQ2KGNhbGxiYWNrKSkge1xuICAgICAgc2VsZi5saXN0ZW5lcnMucHVzaCh7XG4gICAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgICAgLy8gZnVsbCBldmVudCBzdHJpbmdcbiAgICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrLFxuICAgICAgICAvLyBjYWxsYmFjayB0byBydW5cbiAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgLy8gdGhlIGV2ZW50IHR5cGUgKGUuZy4gJ2NsaWNrJylcbiAgICAgICAgbmFtZXNwYWNlOiBuYW1lc3BhY2UsXG4gICAgICAgIC8vIHRoZSBldmVudCBuYW1lc3BhY2UgKGUuZy4gXCIuZm9vXCIpXG4gICAgICAgIHF1YWxpZmllcjogcXVhbGlmaWVyLFxuICAgICAgICAvLyBhIHJlc3RyaWN0aW9uIG9uIHdoZXRoZXIgdG8gbWF0Y2ggdGhpcyBlbWl0dGVyXG4gICAgICAgIGNvbmY6IGNvbmYgLy8gYWRkaXRpb25hbCBjb25maWd1cmF0aW9uXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIGV2ZW50cywgcXVhbGlmaWVyLCBjYWxsYmFjaywgY29uZiwgY29uZk92ZXJyaWRlcyk7XG4gIHJldHVybiB0aGlzO1xufTtcbnAub25lID0gZnVuY3Rpb24gKGV2ZW50cywgcXVhbGlmaWVyLCBjYWxsYmFjaywgY29uZikge1xuICByZXR1cm4gdGhpcy5vbihldmVudHMsIHF1YWxpZmllciwgY2FsbGJhY2ssIGNvbmYsIHtcbiAgICBvbmU6IHRydWVcbiAgfSk7XG59O1xucC5yZW1vdmVMaXN0ZW5lciA9IHAub2ZmID0gZnVuY3Rpb24gKGV2ZW50cywgcXVhbGlmaWVyLCBjYWxsYmFjaywgY29uZikge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuICBpZiAodGhpcy5lbWl0dGluZyAhPT0gMCkge1xuICAgIHRoaXMubGlzdGVuZXJzID0gY29weUFycmF5KHRoaXMubGlzdGVuZXJzKTtcbiAgfVxuICB2YXIgbGlzdGVuZXJzID0gdGhpcy5saXN0ZW5lcnM7XG4gIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKGkpIHtcbiAgICB2YXIgbGlzdGVuZXIgPSBsaXN0ZW5lcnNbaV07XG4gICAgZm9yRWFjaEV2ZW50KF90aGlzLCBmdW5jdGlvbiAoc2VsZiwgZXZlbnQsIHR5cGUsIG5hbWVzcGFjZSwgcXVhbGlmaWVyLCBjYWxsYmFjayAvKiwgY29uZiovKSB7XG4gICAgICBpZiAoKGxpc3RlbmVyLnR5cGUgPT09IHR5cGUgfHwgZXZlbnRzID09PSAnKicpICYmICghbmFtZXNwYWNlICYmIGxpc3RlbmVyLm5hbWVzcGFjZSAhPT0gJy4qJyB8fCBsaXN0ZW5lci5uYW1lc3BhY2UgPT09IG5hbWVzcGFjZSkgJiYgKCFxdWFsaWZpZXIgfHwgc2VsZi5xdWFsaWZpZXJDb21wYXJlKGxpc3RlbmVyLnF1YWxpZmllciwgcXVhbGlmaWVyKSkgJiYgKCFjYWxsYmFjayB8fCBsaXN0ZW5lci5jYWxsYmFjayA9PT0gY2FsbGJhY2spKSB7XG4gICAgICAgIGxpc3RlbmVycy5zcGxpY2UoaSwgMSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9LCBldmVudHMsIHF1YWxpZmllciwgY2FsbGJhY2ssIGNvbmYpO1xuICB9O1xuICBmb3IgKHZhciBpID0gbGlzdGVuZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgX2xvb3AoaSk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xucC5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnJlbW92ZUxpc3RlbmVyKCcqJyk7XG59O1xucC5lbWl0ID0gcC50cmlnZ2VyID0gZnVuY3Rpb24gKGV2ZW50cywgZXh0cmFQYXJhbXMsIG1hbnVhbENhbGxiYWNrKSB7XG4gIHZhciBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVycztcbiAgdmFyIG51bUxpc3RlbmVyc0JlZm9yZUVtaXQgPSBsaXN0ZW5lcnMubGVuZ3RoO1xuICB0aGlzLmVtaXR0aW5nKys7XG4gIGlmICghYXJyYXkoZXh0cmFQYXJhbXMpKSB7XG4gICAgZXh0cmFQYXJhbXMgPSBbZXh0cmFQYXJhbXNdO1xuICB9XG4gIGZvckVhY2hFdmVudE9iaih0aGlzLCBmdW5jdGlvbiAoc2VsZiwgZXZlbnRPYmopIHtcbiAgICBpZiAobWFudWFsQ2FsbGJhY2sgIT0gbnVsbCkge1xuICAgICAgbGlzdGVuZXJzID0gW3tcbiAgICAgICAgZXZlbnQ6IGV2ZW50T2JqLmV2ZW50LFxuICAgICAgICB0eXBlOiBldmVudE9iai50eXBlLFxuICAgICAgICBuYW1lc3BhY2U6IGV2ZW50T2JqLm5hbWVzcGFjZSxcbiAgICAgICAgY2FsbGJhY2s6IG1hbnVhbENhbGxiYWNrXG4gICAgICB9XTtcbiAgICAgIG51bUxpc3RlbmVyc0JlZm9yZUVtaXQgPSBsaXN0ZW5lcnMubGVuZ3RoO1xuICAgIH1cbiAgICB2YXIgX2xvb3AyID0gZnVuY3Rpb24gX2xvb3AyKCkge1xuICAgICAgdmFyIGxpc3RlbmVyID0gbGlzdGVuZXJzW2ldO1xuICAgICAgaWYgKGxpc3RlbmVyLnR5cGUgPT09IGV2ZW50T2JqLnR5cGUgJiYgKCFsaXN0ZW5lci5uYW1lc3BhY2UgfHwgbGlzdGVuZXIubmFtZXNwYWNlID09PSBldmVudE9iai5uYW1lc3BhY2UgfHwgbGlzdGVuZXIubmFtZXNwYWNlID09PSB1bml2ZXJzYWxOYW1lc3BhY2UpICYmIHNlbGYuZXZlbnRNYXRjaGVzKHNlbGYuY29udGV4dCwgbGlzdGVuZXIsIGV2ZW50T2JqKSkge1xuICAgICAgICB2YXIgYXJncyA9IFtldmVudE9ial07XG4gICAgICAgIGlmIChleHRyYVBhcmFtcyAhPSBudWxsKSB7XG4gICAgICAgICAgcHVzaChhcmdzLCBleHRyYVBhcmFtcyk7XG4gICAgICAgIH1cbiAgICAgICAgc2VsZi5iZWZvcmVFbWl0KHNlbGYuY29udGV4dCwgbGlzdGVuZXIsIGV2ZW50T2JqKTtcbiAgICAgICAgaWYgKGxpc3RlbmVyLmNvbmYgJiYgbGlzdGVuZXIuY29uZi5vbmUpIHtcbiAgICAgICAgICBzZWxmLmxpc3RlbmVycyA9IHNlbGYubGlzdGVuZXJzLmZpbHRlcihmdW5jdGlvbiAobCkge1xuICAgICAgICAgICAgcmV0dXJuIGwgIT09IGxpc3RlbmVyO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjb250ZXh0ID0gc2VsZi5jYWxsYmFja0NvbnRleHQoc2VsZi5jb250ZXh0LCBsaXN0ZW5lciwgZXZlbnRPYmopO1xuICAgICAgICB2YXIgcmV0ID0gbGlzdGVuZXIuY2FsbGJhY2suYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgICAgIHNlbGYuYWZ0ZXJFbWl0KHNlbGYuY29udGV4dCwgbGlzdGVuZXIsIGV2ZW50T2JqKTtcbiAgICAgICAgaWYgKHJldCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBldmVudE9iai5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBldmVudE9iai5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICB9IC8vIGlmIGxpc3RlbmVyIG1hdGNoZXNcbiAgICB9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtTGlzdGVuZXJzQmVmb3JlRW1pdDsgaSsrKSB7XG4gICAgICBfbG9vcDIoKTtcbiAgICB9IC8vIGZvciBsaXN0ZW5lclxuXG4gICAgaWYgKHNlbGYuYnViYmxlKHNlbGYuY29udGV4dCkgJiYgIWV2ZW50T2JqLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpIHtcbiAgICAgIHNlbGYucGFyZW50KHNlbGYuY29udGV4dCkuZW1pdChldmVudE9iaiwgZXh0cmFQYXJhbXMpO1xuICAgIH1cbiAgfSwgZXZlbnRzKTtcbiAgdGhpcy5lbWl0dGluZy0tO1xuICByZXR1cm4gdGhpcztcbn07XG5cbnZhciBlbWl0dGVyT3B0aW9ucyQxID0ge1xuICBxdWFsaWZpZXJDb21wYXJlOiBmdW5jdGlvbiBxdWFsaWZpZXJDb21wYXJlKHNlbGVjdG9yMSwgc2VsZWN0b3IyKSB7XG4gICAgaWYgKHNlbGVjdG9yMSA9PSBudWxsIHx8IHNlbGVjdG9yMiA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gc2VsZWN0b3IxID09IG51bGwgJiYgc2VsZWN0b3IyID09IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBzZWxlY3RvcjEuc2FtZVRleHQoc2VsZWN0b3IyKTtcbiAgICB9XG4gIH0sXG4gIGV2ZW50TWF0Y2hlczogZnVuY3Rpb24gZXZlbnRNYXRjaGVzKGVsZSwgbGlzdGVuZXIsIGV2ZW50T2JqKSB7XG4gICAgdmFyIHNlbGVjdG9yID0gbGlzdGVuZXIucXVhbGlmaWVyO1xuICAgIGlmIChzZWxlY3RvciAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gZWxlICE9PSBldmVudE9iai50YXJnZXQgJiYgZWxlbWVudChldmVudE9iai50YXJnZXQpICYmIHNlbGVjdG9yLm1hdGNoZXMoZXZlbnRPYmoudGFyZ2V0KTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIGFkZEV2ZW50RmllbGRzOiBmdW5jdGlvbiBhZGRFdmVudEZpZWxkcyhlbGUsIGV2dCkge1xuICAgIGV2dC5jeSA9IGVsZS5jeSgpO1xuICAgIGV2dC50YXJnZXQgPSBlbGU7XG4gIH0sXG4gIGNhbGxiYWNrQ29udGV4dDogZnVuY3Rpb24gY2FsbGJhY2tDb250ZXh0KGVsZSwgbGlzdGVuZXIsIGV2ZW50T2JqKSB7XG4gICAgcmV0dXJuIGxpc3RlbmVyLnF1YWxpZmllciAhPSBudWxsID8gZXZlbnRPYmoudGFyZ2V0IDogZWxlO1xuICB9LFxuICBiZWZvcmVFbWl0OiBmdW5jdGlvbiBiZWZvcmVFbWl0KGNvbnRleHQsIGxpc3RlbmVyIC8qLCBldmVudE9iaiovKSB7XG4gICAgaWYgKGxpc3RlbmVyLmNvbmYgJiYgbGlzdGVuZXIuY29uZi5vbmNlKSB7XG4gICAgICBsaXN0ZW5lci5jb25mLm9uY2VDb2xsZWN0aW9uLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyLmV2ZW50LCBsaXN0ZW5lci5xdWFsaWZpZXIsIGxpc3RlbmVyLmNhbGxiYWNrKTtcbiAgICB9XG4gIH0sXG4gIGJ1YmJsZTogZnVuY3Rpb24gYnViYmxlKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICBwYXJlbnQ6IGZ1bmN0aW9uIHBhcmVudChlbGUpIHtcbiAgICByZXR1cm4gZWxlLmlzQ2hpbGQoKSA/IGVsZS5wYXJlbnQoKSA6IGVsZS5jeSgpO1xuICB9XG59O1xudmFyIGFyZ1NlbGVjdG9yJDEgPSBmdW5jdGlvbiBhcmdTZWxlY3RvcihhcmcpIHtcbiAgaWYgKHN0cmluZyhhcmcpKSB7XG4gICAgcmV0dXJuIG5ldyBTZWxlY3RvcihhcmcpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBhcmc7XG4gIH1cbn07XG52YXIgZWxlc2ZuJDkgPSB7XG4gIGNyZWF0ZUVtaXR0ZXI6IGZ1bmN0aW9uIGNyZWF0ZUVtaXR0ZXIoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICAgIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgICAgIGlmICghX3AuZW1pdHRlcikge1xuICAgICAgICBfcC5lbWl0dGVyID0gbmV3IEVtaXR0ZXIoZW1pdHRlck9wdGlvbnMkMSwgZWxlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIGVtaXR0ZXI6IGZ1bmN0aW9uIGVtaXR0ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuZW1pdHRlcjtcbiAgfSxcbiAgb246IGZ1bmN0aW9uIG9uKGV2ZW50cywgc2VsZWN0b3IsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGFyZ1NlbCA9IGFyZ1NlbGVjdG9yJDEoc2VsZWN0b3IpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IHRoaXNbaV07XG4gICAgICBlbGUuZW1pdHRlcigpLm9uKGV2ZW50cywgYXJnU2VsLCBjYWxsYmFjayk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICByZW1vdmVMaXN0ZW5lcjogZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXIoZXZlbnRzLCBzZWxlY3RvciwgY2FsbGJhY2spIHtcbiAgICB2YXIgYXJnU2VsID0gYXJnU2VsZWN0b3IkMShzZWxlY3Rvcik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICAgIGVsZS5lbWl0dGVyKCkucmVtb3ZlTGlzdGVuZXIoZXZlbnRzLCBhcmdTZWwsIGNhbGxiYWNrKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIHJlbW92ZUFsbExpc3RlbmVyczogZnVuY3Rpb24gcmVtb3ZlQWxsTGlzdGVuZXJzKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IHRoaXNbaV07XG4gICAgICBlbGUuZW1pdHRlcigpLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgb25lOiBmdW5jdGlvbiBvbmUoZXZlbnRzLCBzZWxlY3RvciwgY2FsbGJhY2spIHtcbiAgICB2YXIgYXJnU2VsID0gYXJnU2VsZWN0b3IkMShzZWxlY3Rvcik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICAgIGVsZS5lbWl0dGVyKCkub25lKGV2ZW50cywgYXJnU2VsLCBjYWxsYmFjayk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBvbmNlOiBmdW5jdGlvbiBvbmNlKGV2ZW50cywgc2VsZWN0b3IsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGFyZ1NlbCA9IGFyZ1NlbGVjdG9yJDEoc2VsZWN0b3IpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IHRoaXNbaV07XG4gICAgICBlbGUuZW1pdHRlcigpLm9uKGV2ZW50cywgYXJnU2VsLCBjYWxsYmFjaywge1xuICAgICAgICBvbmNlOiB0cnVlLFxuICAgICAgICBvbmNlQ29sbGVjdGlvbjogdGhpc1xuICAgICAgfSk7XG4gICAgfVxuICB9LFxuICBlbWl0OiBmdW5jdGlvbiBlbWl0KGV2ZW50cywgZXh0cmFQYXJhbXMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbGUgPSB0aGlzW2ldO1xuICAgICAgZWxlLmVtaXR0ZXIoKS5lbWl0KGV2ZW50cywgZXh0cmFQYXJhbXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgZW1pdEFuZE5vdGlmeTogZnVuY3Rpb24gZW1pdEFuZE5vdGlmeShldmVudCwgZXh0cmFQYXJhbXMpIHtcbiAgICAvLyBmb3IgaW50ZXJuYWwgdXNlIG9ubHlcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIGVtcHR5IGNvbGxlY3Rpb25zIGRvbid0IG5lZWQgdG8gbm90aWZ5IGFueXRoaW5nXG5cbiAgICAvLyBub3RpZnkgcmVuZGVyZXJcbiAgICB0aGlzLmN5KCkubm90aWZ5KGV2ZW50LCB0aGlzKTtcbiAgICB0aGlzLmVtaXQoZXZlbnQsIGV4dHJhUGFyYW1zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufTtcbmRlZmluZS5ldmVudEFsaWFzZXNPbihlbGVzZm4kOSk7XG5cbnZhciBlbGVzZm4kOCA9IHtcbiAgbm9kZXM6IGZ1bmN0aW9uIG5vZGVzKHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHJldHVybiBlbGUuaXNOb2RlKCk7XG4gICAgfSkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfSxcbiAgZWRnZXM6IGZ1bmN0aW9uIGVkZ2VzKHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHJldHVybiBlbGUuaXNFZGdlKCk7XG4gICAgfSkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfSxcbiAgLy8gaW50ZXJuYWwgaGVscGVyIHRvIGdldCBub2RlcyBhbmQgZWRnZXMgYXMgc2VwYXJhdGUgY29sbGVjdGlvbnMgd2l0aCBzaW5nbGUgaXRlcmF0aW9uIG92ZXIgZWxlbWVudHNcbiAgYnlHcm91cDogZnVuY3Rpb24gYnlHcm91cCgpIHtcbiAgICB2YXIgbm9kZXMgPSB0aGlzLnNwYXduKCk7XG4gICAgdmFyIGVkZ2VzID0gdGhpcy5zcGF3bigpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IHRoaXNbaV07XG4gICAgICBpZiAoZWxlLmlzTm9kZSgpKSB7XG4gICAgICAgIG5vZGVzLnB1c2goZWxlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVkZ2VzLnB1c2goZWxlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG5vZGVzOiBub2RlcyxcbiAgICAgIGVkZ2VzOiBlZGdlc1xuICAgIH07XG4gIH0sXG4gIGZpbHRlcjogZnVuY3Rpb24gZmlsdGVyKF9maWx0ZXIsIHRoaXNBcmcpIHtcbiAgICBpZiAoX2ZpbHRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBjaGVjayB0aGlzIGZpcnN0IGIvYyBpdCdzIHRoZSBtb3N0IGNvbW1vbi9wZXJmb3JtYW50IGNhc2VcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0gZWxzZSBpZiAoc3RyaW5nKF9maWx0ZXIpIHx8IGVsZW1lbnRPckNvbGxlY3Rpb24oX2ZpbHRlcikpIHtcbiAgICAgIHJldHVybiBuZXcgU2VsZWN0b3IoX2ZpbHRlcikuZmlsdGVyKHRoaXMpO1xuICAgIH0gZWxzZSBpZiAoZm4kNihfZmlsdGVyKSkge1xuICAgICAgdmFyIGZpbHRlckVsZXMgPSB0aGlzLnNwYXduKCk7XG4gICAgICB2YXIgZWxlcyA9IHRoaXM7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgICAgIHZhciBpbmNsdWRlID0gdGhpc0FyZyA/IF9maWx0ZXIuYXBwbHkodGhpc0FyZywgW2VsZSwgaSwgZWxlc10pIDogX2ZpbHRlcihlbGUsIGksIGVsZXMpO1xuICAgICAgICBpZiAoaW5jbHVkZSkge1xuICAgICAgICAgIGZpbHRlckVsZXMucHVzaChlbGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmlsdGVyRWxlcztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3Bhd24oKTsgLy8gaWYgbm90IGhhbmRsZWQgYnkgYWJvdmUsIGdpdmUgJ2VtIGFuIGVtcHR5IGNvbGxlY3Rpb25cbiAgfSxcbiAgbm90OiBmdW5jdGlvbiBub3QodG9SZW1vdmUpIHtcbiAgICBpZiAoIXRvUmVtb3ZlKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHN0cmluZyh0b1JlbW92ZSkpIHtcbiAgICAgICAgdG9SZW1vdmUgPSB0aGlzLmZpbHRlcih0b1JlbW92ZSk7XG4gICAgICB9XG4gICAgICB2YXIgZWxlbWVudHMgPSB0aGlzLnNwYXduKCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVsZW1lbnQgPSB0aGlzW2ldO1xuICAgICAgICB2YXIgcmVtb3ZlID0gdG9SZW1vdmUuaGFzKGVsZW1lbnQpO1xuICAgICAgICBpZiAoIXJlbW92ZSkge1xuICAgICAgICAgIGVsZW1lbnRzLnB1c2goZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBlbGVtZW50cztcbiAgICB9XG4gIH0sXG4gIGFic29sdXRlQ29tcGxlbWVudDogZnVuY3Rpb24gYWJzb2x1dGVDb21wbGVtZW50KCkge1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgICByZXR1cm4gY3kubXV0YWJsZUVsZW1lbnRzKCkubm90KHRoaXMpO1xuICB9LFxuICBpbnRlcnNlY3Q6IGZ1bmN0aW9uIGludGVyc2VjdChvdGhlcikge1xuICAgIC8vIGlmIGEgc2VsZWN0b3IgaXMgc3BlY2lmaWVkLCB0aGVuIGZpbHRlciBieSBpdCBpbnN0ZWFkXG4gICAgaWYgKHN0cmluZyhvdGhlcikpIHtcbiAgICAgIHZhciBzZWxlY3RvciA9IG90aGVyO1xuICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyKHNlbGVjdG9yKTtcbiAgICB9XG4gICAgdmFyIGVsZW1lbnRzID0gdGhpcy5zcGF3bigpO1xuICAgIHZhciBjb2wxID0gdGhpcztcbiAgICB2YXIgY29sMiA9IG90aGVyO1xuICAgIHZhciBjb2wxU21hbGxlciA9IHRoaXMubGVuZ3RoIDwgb3RoZXIubGVuZ3RoO1xuICAgIHZhciBjb2xTID0gY29sMVNtYWxsZXIgPyBjb2wxIDogY29sMjtcbiAgICB2YXIgY29sTCA9IGNvbDFTbWFsbGVyID8gY29sMiA6IGNvbDE7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2xTLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gY29sU1tpXTtcbiAgICAgIGlmIChjb2xMLmhhcyhlbGUpKSB7XG4gICAgICAgIGVsZW1lbnRzLnB1c2goZWxlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnRzO1xuICB9LFxuICB4b3I6IGZ1bmN0aW9uIHhvcihvdGhlcikge1xuICAgIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3k7XG4gICAgaWYgKHN0cmluZyhvdGhlcikpIHtcbiAgICAgIG90aGVyID0gY3kuJChvdGhlcik7XG4gICAgfVxuICAgIHZhciBlbGVtZW50cyA9IHRoaXMuc3Bhd24oKTtcbiAgICB2YXIgY29sMSA9IHRoaXM7XG4gICAgdmFyIGNvbDIgPSBvdGhlcjtcbiAgICB2YXIgYWRkID0gZnVuY3Rpb24gYWRkKGNvbCwgb3RoZXIpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29sLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBlbGUgPSBjb2xbaV07XG4gICAgICAgIHZhciBpZCA9IGVsZS5fcHJpdmF0ZS5kYXRhLmlkO1xuICAgICAgICB2YXIgaW5PdGhlciA9IG90aGVyLmhhc0VsZW1lbnRXaXRoSWQoaWQpO1xuICAgICAgICBpZiAoIWluT3RoZXIpIHtcbiAgICAgICAgICBlbGVtZW50cy5wdXNoKGVsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIGFkZChjb2wxLCBjb2wyKTtcbiAgICBhZGQoY29sMiwgY29sMSk7XG4gICAgcmV0dXJuIGVsZW1lbnRzO1xuICB9LFxuICBkaWZmOiBmdW5jdGlvbiBkaWZmKG90aGVyKSB7XG4gICAgdmFyIGN5ID0gdGhpcy5fcHJpdmF0ZS5jeTtcbiAgICBpZiAoc3RyaW5nKG90aGVyKSkge1xuICAgICAgb3RoZXIgPSBjeS4kKG90aGVyKTtcbiAgICB9XG4gICAgdmFyIGxlZnQgPSB0aGlzLnNwYXduKCk7XG4gICAgdmFyIHJpZ2h0ID0gdGhpcy5zcGF3bigpO1xuICAgIHZhciBib3RoID0gdGhpcy5zcGF3bigpO1xuICAgIHZhciBjb2wxID0gdGhpcztcbiAgICB2YXIgY29sMiA9IG90aGVyO1xuICAgIHZhciBhZGQgPSBmdW5jdGlvbiBhZGQoY29sLCBvdGhlciwgcmV0RWxlcykge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2wubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVsZSA9IGNvbFtpXTtcbiAgICAgICAgdmFyIGlkID0gZWxlLl9wcml2YXRlLmRhdGEuaWQ7XG4gICAgICAgIHZhciBpbk90aGVyID0gb3RoZXIuaGFzRWxlbWVudFdpdGhJZChpZCk7XG4gICAgICAgIGlmIChpbk90aGVyKSB7XG4gICAgICAgICAgYm90aC5tZXJnZShlbGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldEVsZXMucHVzaChlbGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICBhZGQoY29sMSwgY29sMiwgbGVmdCk7XG4gICAgYWRkKGNvbDIsIGNvbDEsIHJpZ2h0KTtcbiAgICByZXR1cm4ge1xuICAgICAgbGVmdDogbGVmdCxcbiAgICAgIHJpZ2h0OiByaWdodCxcbiAgICAgIGJvdGg6IGJvdGhcbiAgICB9O1xuICB9LFxuICBhZGQ6IGZ1bmN0aW9uIGFkZCh0b0FkZCkge1xuICAgIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3k7XG4gICAgaWYgKCF0b0FkZCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGlmIChzdHJpbmcodG9BZGQpKSB7XG4gICAgICB2YXIgc2VsZWN0b3IgPSB0b0FkZDtcbiAgICAgIHRvQWRkID0gY3kubXV0YWJsZUVsZW1lbnRzKCkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgICB9XG4gICAgdmFyIGVsZW1lbnRzID0gdGhpcy5zcGF3blNlbGYoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRvQWRkLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gdG9BZGRbaV07XG4gICAgICB2YXIgYWRkID0gIXRoaXMuaGFzKGVsZSk7XG4gICAgICBpZiAoYWRkKSB7XG4gICAgICAgIGVsZW1lbnRzLnB1c2goZWxlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnRzO1xuICB9LFxuICAvLyBpbiBwbGFjZSBtZXJnZSBvbiBjYWxsaW5nIGNvbGxlY3Rpb25cbiAgbWVyZ2U6IGZ1bmN0aW9uIG1lcmdlKHRvQWRkKSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICB2YXIgY3kgPSBfcC5jeTtcbiAgICBpZiAoIXRvQWRkKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgaWYgKHRvQWRkICYmIHN0cmluZyh0b0FkZCkpIHtcbiAgICAgIHZhciBzZWxlY3RvciA9IHRvQWRkO1xuICAgICAgdG9BZGQgPSBjeS5tdXRhYmxlRWxlbWVudHMoKS5maWx0ZXIoc2VsZWN0b3IpO1xuICAgIH1cbiAgICB2YXIgbWFwID0gX3AubWFwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9BZGQubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB0b0FkZEVsZSA9IHRvQWRkW2ldO1xuICAgICAgdmFyIGlkID0gdG9BZGRFbGUuX3ByaXZhdGUuZGF0YS5pZDtcbiAgICAgIHZhciBhZGQgPSAhbWFwLmhhcyhpZCk7XG4gICAgICBpZiAoYWRkKSB7XG4gICAgICAgIHZhciBpbmRleCA9IHRoaXMubGVuZ3RoKys7XG4gICAgICAgIHRoaXNbaW5kZXhdID0gdG9BZGRFbGU7XG4gICAgICAgIG1hcC5zZXQoaWQsIHtcbiAgICAgICAgICBlbGU6IHRvQWRkRWxlLFxuICAgICAgICAgIGluZGV4OiBpbmRleFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG4gIHVubWVyZ2VBdDogZnVuY3Rpb24gdW5tZXJnZUF0KGkpIHtcbiAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICB2YXIgaWQgPSBlbGUuaWQoKTtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuICAgIHZhciBtYXAgPSBfcC5tYXA7XG5cbiAgICAvLyByZW1vdmUgZWxlXG4gICAgdGhpc1tpXSA9IHVuZGVmaW5lZDtcbiAgICBtYXBbXCJkZWxldGVcIl0oaWQpO1xuICAgIHZhciB1bm1lcmdlZExhc3RFbGUgPSBpID09PSB0aGlzLmxlbmd0aCAtIDE7XG5cbiAgICAvLyByZXBsYWNlIGVtcHR5IHNwb3Qgd2l0aCBsYXN0IGVsZSBpbiBjb2xsZWN0aW9uXG4gICAgaWYgKHRoaXMubGVuZ3RoID4gMSAmJiAhdW5tZXJnZWRMYXN0RWxlKSB7XG4gICAgICB2YXIgbGFzdEVsZUkgPSB0aGlzLmxlbmd0aCAtIDE7XG4gICAgICB2YXIgbGFzdEVsZSA9IHRoaXNbbGFzdEVsZUldO1xuICAgICAgdmFyIGxhc3RFbGVJZCA9IGxhc3RFbGUuX3ByaXZhdGUuZGF0YS5pZDtcbiAgICAgIHRoaXNbbGFzdEVsZUldID0gdW5kZWZpbmVkO1xuICAgICAgdGhpc1tpXSA9IGxhc3RFbGU7XG4gICAgICBtYXAuc2V0KGxhc3RFbGVJZCwge1xuICAgICAgICBlbGU6IGxhc3RFbGUsXG4gICAgICAgIGluZGV4OiBpXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyB0aGUgY29sbGVjdGlvbiBpcyBub3cgMSBlbGUgc21hbGxlclxuICAgIHRoaXMubGVuZ3RoLS07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIC8vIHJlbW92ZSBzaW5nbGUgZWxlIGluIHBsYWNlIGluIGNhbGxpbmcgY29sbGVjdGlvblxuICB1bm1lcmdlT25lOiBmdW5jdGlvbiB1bm1lcmdlT25lKGVsZSkge1xuICAgIGVsZSA9IGVsZVswXTtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuICAgIHZhciBpZCA9IGVsZS5fcHJpdmF0ZS5kYXRhLmlkO1xuICAgIHZhciBtYXAgPSBfcC5tYXA7XG4gICAgdmFyIGVudHJ5ID0gbWFwLmdldChpZCk7XG4gICAgaWYgKCFlbnRyeSkge1xuICAgICAgcmV0dXJuIHRoaXM7IC8vIG5vIG5lZWQgdG8gcmVtb3ZlXG4gICAgfVxuICAgIHZhciBpID0gZW50cnkuaW5kZXg7XG4gICAgdGhpcy51bm1lcmdlQXQoaSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIC8vIHJlbW92ZSBlbGVzIGluIHBsYWNlIG9uIGNhbGxpbmcgY29sbGVjdGlvblxuICB1bm1lcmdlOiBmdW5jdGlvbiB1bm1lcmdlKHRvUmVtb3ZlKSB7XG4gICAgdmFyIGN5ID0gdGhpcy5fcHJpdmF0ZS5jeTtcbiAgICBpZiAoIXRvUmVtb3ZlKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgaWYgKHRvUmVtb3ZlICYmIHN0cmluZyh0b1JlbW92ZSkpIHtcbiAgICAgIHZhciBzZWxlY3RvciA9IHRvUmVtb3ZlO1xuICAgICAgdG9SZW1vdmUgPSBjeS5tdXRhYmxlRWxlbWVudHMoKS5maWx0ZXIoc2VsZWN0b3IpO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRvUmVtb3ZlLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnVubWVyZ2VPbmUodG9SZW1vdmVbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcbiAgdW5tZXJnZUJ5OiBmdW5jdGlvbiB1bm1lcmdlQnkodG9SbUZuKSB7XG4gICAgZm9yICh2YXIgaSA9IHRoaXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBlbGUgPSB0aGlzW2ldO1xuICAgICAgaWYgKHRvUm1GbihlbGUpKSB7XG4gICAgICAgIHRoaXMudW5tZXJnZUF0KGkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgbWFwOiBmdW5jdGlvbiBtYXAobWFwRm4sIHRoaXNBcmcpIHtcbiAgICB2YXIgYXJyID0gW107XG4gICAgdmFyIGVsZXMgPSB0aGlzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgICB2YXIgcmV0ID0gdGhpc0FyZyA/IG1hcEZuLmFwcGx5KHRoaXNBcmcsIFtlbGUsIGksIGVsZXNdKSA6IG1hcEZuKGVsZSwgaSwgZWxlcyk7XG4gICAgICBhcnIucHVzaChyZXQpO1xuICAgIH1cbiAgICByZXR1cm4gYXJyO1xuICB9LFxuICByZWR1Y2U6IGZ1bmN0aW9uIHJlZHVjZShmbiwgaW5pdGlhbFZhbHVlKSB7XG4gICAgdmFyIHZhbCA9IGluaXRpYWxWYWx1ZTtcbiAgICB2YXIgZWxlcyA9IHRoaXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YWwgPSBmbih2YWwsIGVsZXNbaV0sIGksIGVsZXMpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsO1xuICB9LFxuICBtYXg6IGZ1bmN0aW9uIG1heCh2YWxGbiwgdGhpc0FyZykge1xuICAgIHZhciBtYXggPSAtSW5maW5pdHk7XG4gICAgdmFyIG1heEVsZTtcbiAgICB2YXIgZWxlcyA9IHRoaXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICAgIHZhciB2YWwgPSB0aGlzQXJnID8gdmFsRm4uYXBwbHkodGhpc0FyZywgW2VsZSwgaSwgZWxlc10pIDogdmFsRm4oZWxlLCBpLCBlbGVzKTtcbiAgICAgIGlmICh2YWwgPiBtYXgpIHtcbiAgICAgICAgbWF4ID0gdmFsO1xuICAgICAgICBtYXhFbGUgPSBlbGU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTogbWF4LFxuICAgICAgZWxlOiBtYXhFbGVcbiAgICB9O1xuICB9LFxuICBtaW46IGZ1bmN0aW9uIG1pbih2YWxGbiwgdGhpc0FyZykge1xuICAgIHZhciBtaW4gPSBJbmZpbml0eTtcbiAgICB2YXIgbWluRWxlO1xuICAgIHZhciBlbGVzID0gdGhpcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgICAgdmFyIHZhbCA9IHRoaXNBcmcgPyB2YWxGbi5hcHBseSh0aGlzQXJnLCBbZWxlLCBpLCBlbGVzXSkgOiB2YWxGbihlbGUsIGksIGVsZXMpO1xuICAgICAgaWYgKHZhbCA8IG1pbikge1xuICAgICAgICBtaW4gPSB2YWw7XG4gICAgICAgIG1pbkVsZSA9IGVsZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiBtaW4sXG4gICAgICBlbGU6IG1pbkVsZVxuICAgIH07XG4gIH1cbn07XG5cbi8vIGFsaWFzZXNcbnZhciBmbiQxID0gZWxlc2ZuJDg7XG5mbiQxWyd1J10gPSBmbiQxWyd8J10gPSBmbiQxWycrJ10gPSBmbiQxLnVuaW9uID0gZm4kMS5vciA9IGZuJDEuYWRkO1xuZm4kMVsnXFxcXCddID0gZm4kMVsnISddID0gZm4kMVsnLSddID0gZm4kMS5kaWZmZXJlbmNlID0gZm4kMS5yZWxhdGl2ZUNvbXBsZW1lbnQgPSBmbiQxLnN1YnRyYWN0ID0gZm4kMS5ub3Q7XG5mbiQxWyduJ10gPSBmbiQxWycmJ10gPSBmbiQxWycuJ10gPSBmbiQxLmFuZCA9IGZuJDEuaW50ZXJzZWN0aW9uID0gZm4kMS5pbnRlcnNlY3Q7XG5mbiQxWydeJ10gPSBmbiQxWycoKyknXSA9IGZuJDFbJygtKSddID0gZm4kMS5zeW1tZXRyaWNEaWZmZXJlbmNlID0gZm4kMS5zeW1kaWZmID0gZm4kMS54b3I7XG5mbiQxLmZuRmlsdGVyID0gZm4kMS5maWx0ZXJGbiA9IGZuJDEuc3RkRmlsdGVyID0gZm4kMS5maWx0ZXI7XG5mbiQxLmNvbXBsZW1lbnQgPSBmbiQxLmFic2NvbXAgPSBmbiQxLmFic29sdXRlQ29tcGxlbWVudDtcblxudmFyIGVsZXNmbiQ3ID0ge1xuICBpc05vZGU6IGZ1bmN0aW9uIGlzTm9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy5ncm91cCgpID09PSAnbm9kZXMnO1xuICB9LFxuICBpc0VkZ2U6IGZ1bmN0aW9uIGlzRWRnZSgpIHtcbiAgICByZXR1cm4gdGhpcy5ncm91cCgpID09PSAnZWRnZXMnO1xuICB9LFxuICBpc0xvb3A6IGZ1bmN0aW9uIGlzTG9vcCgpIHtcbiAgICByZXR1cm4gdGhpcy5pc0VkZ2UoKSAmJiB0aGlzLnNvdXJjZSgpWzBdID09PSB0aGlzLnRhcmdldCgpWzBdO1xuICB9LFxuICBpc1NpbXBsZTogZnVuY3Rpb24gaXNTaW1wbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNFZGdlKCkgJiYgdGhpcy5zb3VyY2UoKVswXSAhPT0gdGhpcy50YXJnZXQoKVswXTtcbiAgfSxcbiAgZ3JvdXA6IGZ1bmN0aW9uIGdyb3VwKCkge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIGlmIChlbGUpIHtcbiAgICAgIHJldHVybiBlbGUuX3ByaXZhdGUuZ3JvdXA7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqICBFbGVtZW50cyBhcmUgZHJhd24gaW4gYSBzcGVjaWZpYyBvcmRlciBiYXNlZCBvbiBjb21wb3VuZCBkZXB0aCAobG93IHRvIGhpZ2gpLCB0aGUgZWxlbWVudCB0eXBlIChub2RlcyBhYm92ZSBlZGdlcyksXG4gKiAgYW5kIHotaW5kZXggKGxvdyB0byBoaWdoKS4gIFRoZXNlIHN0eWxlcyBhZmZlY3QgaG93IHRoaXMgYXBwbGllczpcbiAqXG4gKiAgei1jb21wb3VuZC1kZXB0aDogTWF5IGJlIGBib3R0b20gfCBvcnBoYW4gfCBhdXRvIHwgdG9wYC4gIFRoZSBmaXJzdCBkcmF3biBpcyBgYm90dG9tYCwgdGhlbiBgb3JwaGFuYCB3aGljaCBpcyB0aGVcbiAqICAgICAgc2FtZSBkZXB0aCBhcyB0aGUgcm9vdCBvZiB0aGUgY29tcG91bmQgZ3JhcGgsIGZvbGxvd2VkIGJ5IHRoZSBkZWZhdWx0IHZhbHVlIGBhdXRvYCB3aGljaCBkcmF3cyBpbiBvcmRlciBmcm9tXG4gKiAgICAgIHJvb3QgdG8gbGVhdmVzIG9mIHRoZSBjb21wb3VuZCBncmFwaC4gIFRoZSBsYXN0IGRyYXduIGlzIGB0b3BgLlxuICogIHotaW5kZXgtY29tcGFyZTogTWF5IGJlIGBhdXRvIHwgbWFudWFsYC4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBhdXRvYCB3aGljaCBhbHdheXMgZHJhd3MgZWRnZXMgdW5kZXIgbm9kZXMuXG4gKiAgICAgIGBtYW51YWxgIGlnbm9yZXMgdGhpcyBjb252ZW50aW9uIGFuZCBkcmF3cyBiYXNlZCBvbiB0aGUgYHotaW5kZXhgIHZhbHVlIHNldHRpbmcuXG4gKiAgei1pbmRleDogQW4gaW50ZWdlciB2YWx1ZSB0aGF0IGFmZmVjdHMgdGhlIHJlbGF0aXZlIGRyYXcgb3JkZXIgb2YgZWxlbWVudHMuICBJbiBnZW5lcmFsLCBhbiBlbGVtZW50IHdpdGggYSBoaWdoZXJcbiAqICAgICAgYHotaW5kZXhgIHdpbGwgYmUgZHJhd24gb24gdG9wIG9mIGFuIGVsZW1lbnQgd2l0aCBhIGxvd2VyIGB6LWluZGV4YC5cbiAqL1xudmFyIHpJbmRleFNvcnQgPSBmdW5jdGlvbiB6SW5kZXhTb3J0KGEsIGIpIHtcbiAgdmFyIGN5ID0gYS5jeSgpO1xuICB2YXIgaGFzQ29tcG91bmROb2RlcyA9IGN5Lmhhc0NvbXBvdW5kTm9kZXMoKTtcbiAgZnVuY3Rpb24gZ2V0RGVwdGgoZWxlKSB7XG4gICAgdmFyIHN0eWxlID0gZWxlLnBzdHlsZSgnei1jb21wb3VuZC1kZXB0aCcpO1xuICAgIGlmIChzdHlsZS52YWx1ZSA9PT0gJ2F1dG8nKSB7XG4gICAgICByZXR1cm4gaGFzQ29tcG91bmROb2RlcyA/IGVsZS56RGVwdGgoKSA6IDA7XG4gICAgfSBlbHNlIGlmIChzdHlsZS52YWx1ZSA9PT0gJ2JvdHRvbScpIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9IGVsc2UgaWYgKHN0eWxlLnZhbHVlID09PSAndG9wJykge1xuICAgICAgcmV0dXJuIE1BWF9JTlQkMTtcbiAgICB9XG4gICAgLy8gJ29ycGhhbidcbiAgICByZXR1cm4gMDtcbiAgfVxuICB2YXIgZGVwdGhEaWZmID0gZ2V0RGVwdGgoYSkgLSBnZXREZXB0aChiKTtcbiAgaWYgKGRlcHRoRGlmZiAhPT0gMCkge1xuICAgIHJldHVybiBkZXB0aERpZmY7XG4gIH1cbiAgZnVuY3Rpb24gZ2V0RWxlRGVwdGgoZWxlKSB7XG4gICAgdmFyIHN0eWxlID0gZWxlLnBzdHlsZSgnei1pbmRleC1jb21wYXJlJyk7XG4gICAgaWYgKHN0eWxlLnZhbHVlID09PSAnYXV0bycpIHtcbiAgICAgIHJldHVybiBlbGUuaXNOb2RlKCkgPyAxIDogMDtcbiAgICB9XG4gICAgLy8gJ21hbnVhbCdcbiAgICByZXR1cm4gMDtcbiAgfVxuICB2YXIgZWxlRGlmZiA9IGdldEVsZURlcHRoKGEpIC0gZ2V0RWxlRGVwdGgoYik7XG4gIGlmIChlbGVEaWZmICE9PSAwKSB7XG4gICAgcmV0dXJuIGVsZURpZmY7XG4gIH1cbiAgdmFyIHpEaWZmID0gYS5wc3R5bGUoJ3otaW5kZXgnKS52YWx1ZSAtIGIucHN0eWxlKCd6LWluZGV4JykudmFsdWU7XG4gIGlmICh6RGlmZiAhPT0gMCkge1xuICAgIHJldHVybiB6RGlmZjtcbiAgfVxuICAvLyBjb21wYXJlIGluZGljZXMgaW4gdGhlIGNvcmUgKG9yZGVyIGFkZGVkIHRvIGdyYXBoIHcvIGxhc3Qgb24gdG9wKVxuICByZXR1cm4gYS5wb29sSW5kZXgoKSAtIGIucG9vbEluZGV4KCk7XG59O1xuXG52YXIgZWxlc2ZuJDYgPSB7XG4gIGZvckVhY2g6IGZ1bmN0aW9uIGZvckVhY2goZm4sIHRoaXNBcmcpIHtcbiAgICBpZiAoZm4kNihmbikpIHtcbiAgICAgIHZhciBOID0gdGhpcy5sZW5ndGg7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IE47IGkrKykge1xuICAgICAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICAgICAgdmFyIHJldCA9IHRoaXNBcmcgPyBmbi5hcHBseSh0aGlzQXJnLCBbZWxlLCBpLCB0aGlzXSkgOiBmbihlbGUsIGksIHRoaXMpO1xuICAgICAgICBpZiAocmV0ID09PSBmYWxzZSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IC8vIGV4aXQgZWFjaCBlYXJseSBvbiByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIHRvQXJyYXk6IGZ1bmN0aW9uIHRvQXJyYXkoKSB7XG4gICAgdmFyIGFycmF5ID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhcnJheS5wdXNoKHRoaXNbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG4gIH0sXG4gIHNsaWNlOiBmdW5jdGlvbiBzbGljZShzdGFydCwgZW5kKSB7XG4gICAgdmFyIGFycmF5ID0gW107XG4gICAgdmFyIHRoaXNTaXplID0gdGhpcy5sZW5ndGg7XG4gICAgaWYgKGVuZCA9PSBudWxsKSB7XG4gICAgICBlbmQgPSB0aGlzU2l6ZTtcbiAgICB9XG4gICAgaWYgKHN0YXJ0ID09IG51bGwpIHtcbiAgICAgIHN0YXJ0ID0gMDtcbiAgICB9XG4gICAgaWYgKHN0YXJ0IDwgMCkge1xuICAgICAgc3RhcnQgPSB0aGlzU2l6ZSArIHN0YXJ0O1xuICAgIH1cbiAgICBpZiAoZW5kIDwgMCkge1xuICAgICAgZW5kID0gdGhpc1NpemUgKyBlbmQ7XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA+PSAwICYmIGkgPCBlbmQgJiYgaSA8IHRoaXNTaXplOyBpKyspIHtcbiAgICAgIGFycmF5LnB1c2godGhpc1tpXSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNwYXduKGFycmF5KTtcbiAgfSxcbiAgc2l6ZTogZnVuY3Rpb24gc2l6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5sZW5ndGg7XG4gIH0sXG4gIGVxOiBmdW5jdGlvbiBlcShpKSB7XG4gICAgcmV0dXJuIHRoaXNbaV0gfHwgdGhpcy5zcGF3bigpO1xuICB9LFxuICBmaXJzdDogZnVuY3Rpb24gZmlyc3QoKSB7XG4gICAgcmV0dXJuIHRoaXNbMF0gfHwgdGhpcy5zcGF3bigpO1xuICB9LFxuICBsYXN0OiBmdW5jdGlvbiBsYXN0KCkge1xuICAgIHJldHVybiB0aGlzW3RoaXMubGVuZ3RoIC0gMV0gfHwgdGhpcy5zcGF3bigpO1xuICB9LFxuICBlbXB0eTogZnVuY3Rpb24gZW1wdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMubGVuZ3RoID09PSAwO1xuICB9LFxuICBub25lbXB0eTogZnVuY3Rpb24gbm9uZW1wdHkoKSB7XG4gICAgcmV0dXJuICF0aGlzLmVtcHR5KCk7XG4gIH0sXG4gIHNvcnQ6IGZ1bmN0aW9uIHNvcnQoc29ydEZuKSB7XG4gICAgaWYgKCFmbiQ2KHNvcnRGbikpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB2YXIgc29ydGVkID0gdGhpcy50b0FycmF5KCkuc29ydChzb3J0Rm4pO1xuICAgIHJldHVybiB0aGlzLnNwYXduKHNvcnRlZCk7XG4gIH0sXG4gIHNvcnRCeVpJbmRleDogZnVuY3Rpb24gc29ydEJ5WkluZGV4KCkge1xuICAgIHJldHVybiB0aGlzLnNvcnQoekluZGV4U29ydCk7XG4gIH0sXG4gIHpEZXB0aDogZnVuY3Rpb24gekRlcHRoKCkge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIGlmICghZWxlKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIGxldCBjeSA9IGVsZS5jeSgpO1xuICAgIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgICB2YXIgZ3JvdXAgPSBfcC5ncm91cDtcbiAgICBpZiAoZ3JvdXAgPT09ICdub2RlcycpIHtcbiAgICAgIHZhciBkZXB0aCA9IF9wLmRhdGEucGFyZW50ID8gZWxlLnBhcmVudHMoKS5zaXplKCkgOiAwO1xuICAgICAgaWYgKCFlbGUuaXNQYXJlbnQoKSkge1xuICAgICAgICByZXR1cm4gTUFYX0lOVCQxIC0gMTsgLy8gY2hpbGRsZXNzIG5vZGVzIGFsd2F5cyBvbiB0b3BcbiAgICAgIH1cbiAgICAgIHJldHVybiBkZXB0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHNyYyA9IF9wLnNvdXJjZTtcbiAgICAgIHZhciB0Z3QgPSBfcC50YXJnZXQ7XG4gICAgICB2YXIgc3JjRGVwdGggPSBzcmMuekRlcHRoKCk7XG4gICAgICB2YXIgdGd0RGVwdGggPSB0Z3QuekRlcHRoKCk7XG4gICAgICByZXR1cm4gTWF0aC5tYXgoc3JjRGVwdGgsIHRndERlcHRoLCAwKTsgLy8gZGVwdGggb2YgZGVlcGVzdCBwYXJlbnRcbiAgICB9XG4gIH1cbn07XG5lbGVzZm4kNi5lYWNoID0gZWxlc2ZuJDYuZm9yRWFjaDtcbnZhciBkZWZpbmVTeW1ib2xJdGVyYXRvciA9IGZ1bmN0aW9uIGRlZmluZVN5bWJvbEl0ZXJhdG9yKCkge1xuICB2YXIgdHlwZW9mVW5kZWYgPSBcInVuZGVmaW5lZFwiIDtcbiAgdmFyIGlzSXRlcmF0b3JTdXBwb3J0ZWQgPSAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiA/IFwidW5kZWZpbmVkXCIgOiBfdHlwZW9mKFN5bWJvbCkpICE9IHR5cGVvZlVuZGVmICYmIF90eXBlb2YoU3ltYm9sLml0ZXJhdG9yKSAhPSB0eXBlb2ZVbmRlZjtcbiAgaWYgKGlzSXRlcmF0b3JTdXBwb3J0ZWQpIHtcbiAgICBlbGVzZm4kNltTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgIHZhciBlbnRyeSA9IHtcbiAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgZG9uZTogZmFsc2VcbiAgICAgIH07XG4gICAgICB2YXIgaSA9IDA7XG4gICAgICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGg7XG4gICAgICByZXR1cm4gX2RlZmluZVByb3BlcnR5JDEoe1xuICAgICAgICBuZXh0OiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgIGlmIChpIDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICBlbnRyeS52YWx1ZSA9IF90aGlzW2krK107XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVudHJ5LnZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgZW50cnkuZG9uZSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBlbnRyeTtcbiAgICAgICAgfVxuICAgICAgfSwgU3ltYm9sLml0ZXJhdG9yLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfVxufTtcbmRlZmluZVN5bWJvbEl0ZXJhdG9yKCk7XG5cbnZhciBnZXRMYXlvdXREaW1lbnNpb25PcHRpb25zID0gZGVmYXVsdHMkZyh7XG4gIG5vZGVEaW1lbnNpb25zSW5jbHVkZUxhYmVsczogZmFsc2Vcbn0pO1xudmFyIGVsZXNmbiQ1ID0ge1xuICAvLyBDYWxjdWxhdGVzIGFuZCByZXR1cm5zIG5vZGUgZGltZW5zaW9ucyB7IHgsIHkgfSBiYXNlZCBvbiBvcHRpb25zIGdpdmVuXG4gIGxheW91dERpbWVuc2lvbnM6IGZ1bmN0aW9uIGxheW91dERpbWVuc2lvbnMob3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBnZXRMYXlvdXREaW1lbnNpb25PcHRpb25zKG9wdGlvbnMpO1xuICAgIHZhciBkaW1zO1xuICAgIGlmICghdGhpcy50YWtlc1VwU3BhY2UoKSkge1xuICAgICAgZGltcyA9IHtcbiAgICAgICAgdzogMCxcbiAgICAgICAgaDogMFxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMubm9kZURpbWVuc2lvbnNJbmNsdWRlTGFiZWxzKSB7XG4gICAgICB2YXIgYmJEaW0gPSB0aGlzLmJvdW5kaW5nQm94KCk7XG4gICAgICBkaW1zID0ge1xuICAgICAgICB3OiBiYkRpbS53LFxuICAgICAgICBoOiBiYkRpbS5oXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBkaW1zID0ge1xuICAgICAgICB3OiB0aGlzLm91dGVyV2lkdGgoKSxcbiAgICAgICAgaDogdGhpcy5vdXRlckhlaWdodCgpXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIHNhbml0aXNlIHRoZSBkaW1lbnNpb25zIGZvciBleHRlcm5hbCBsYXlvdXRzIChhdm9pZCBkaXZpc2lvbiBieSB6ZXJvKVxuICAgIGlmIChkaW1zLncgPT09IDAgfHwgZGltcy5oID09PSAwKSB7XG4gICAgICBkaW1zLncgPSBkaW1zLmggPSAxO1xuICAgIH1cbiAgICByZXR1cm4gZGltcztcbiAgfSxcbiAgLy8gdXNpbmcgc3RhbmRhcmQgbGF5b3V0IG9wdGlvbnMsIGFwcGx5IHBvc2l0aW9uIGZ1bmN0aW9uICh3LyBvciB3L28gYW5pbWF0aW9uKVxuICBsYXlvdXRQb3NpdGlvbnM6IGZ1bmN0aW9uIGxheW91dFBvc2l0aW9ucyhsYXlvdXQsIG9wdGlvbnMsIGZuKSB7XG4gICAgdmFyIG5vZGVzID0gdGhpcy5ub2RlcygpLmZpbHRlcihmdW5jdGlvbiAobikge1xuICAgICAgcmV0dXJuICFuLmlzUGFyZW50KCk7XG4gICAgfSk7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgIHZhciBsYXlvdXRFbGVzID0gb3B0aW9ucy5lbGVzOyAvLyBub2RlcyAmIGVkZ2VzXG4gICAgdmFyIGdldE1lbW9pemVLZXkgPSBmdW5jdGlvbiBnZXRNZW1vaXplS2V5KG5vZGUpIHtcbiAgICAgIHJldHVybiBub2RlLmlkKCk7XG4gICAgfTtcbiAgICB2YXIgZm5NZW0gPSBtZW1vaXplKGZuLCBnZXRNZW1vaXplS2V5KTsgLy8gbWVtb2l6ZWQgdmVyc2lvbiBvZiBwb3NpdGlvbiBmdW5jdGlvblxuXG4gICAgbGF5b3V0LmVtaXQoe1xuICAgICAgdHlwZTogJ2xheW91dHN0YXJ0JyxcbiAgICAgIGxheW91dDogbGF5b3V0XG4gICAgfSk7XG4gICAgbGF5b3V0LmFuaW1hdGlvbnMgPSBbXTtcbiAgICB2YXIgY2FsY3VsYXRlU3BhY2luZyA9IGZ1bmN0aW9uIGNhbGN1bGF0ZVNwYWNpbmcoc3BhY2luZywgbm9kZXNCYiwgcG9zKSB7XG4gICAgICB2YXIgY2VudGVyID0ge1xuICAgICAgICB4OiBub2Rlc0JiLngxICsgbm9kZXNCYi53IC8gMixcbiAgICAgICAgeTogbm9kZXNCYi55MSArIG5vZGVzQmIuaCAvIDJcbiAgICAgIH07XG4gICAgICB2YXIgc3BhY2luZ1ZlY3RvciA9IHtcbiAgICAgICAgLy8gc2NhbGUgZnJvbSBjZW50ZXIgb2YgYm91bmRpbmcgYm94IChub3QgbmVjZXNzYXJpbHkgMCwwKVxuICAgICAgICB4OiAocG9zLnggLSBjZW50ZXIueCkgKiBzcGFjaW5nLFxuICAgICAgICB5OiAocG9zLnkgLSBjZW50ZXIueSkgKiBzcGFjaW5nXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogY2VudGVyLnggKyBzcGFjaW5nVmVjdG9yLngsXG4gICAgICAgIHk6IGNlbnRlci55ICsgc3BhY2luZ1ZlY3Rvci55XG4gICAgICB9O1xuICAgIH07XG4gICAgdmFyIHVzZVNwYWNpbmdGYWN0b3IgPSBvcHRpb25zLnNwYWNpbmdGYWN0b3IgJiYgb3B0aW9ucy5zcGFjaW5nRmFjdG9yICE9PSAxO1xuICAgIHZhciBzcGFjaW5nQmIgPSBmdW5jdGlvbiBzcGFjaW5nQmIoKSB7XG4gICAgICBpZiAoIXVzZVNwYWNpbmdGYWN0b3IpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICB2YXIgYmIgPSBtYWtlQm91bmRpbmdCb3goKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgICAgdmFyIHBvcyA9IGZuTWVtKG5vZGUsIGkpO1xuICAgICAgICBleHBhbmRCb3VuZGluZ0JveEJ5UG9pbnQoYmIsIHBvcy54LCBwb3MueSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmI7XG4gICAgfTtcbiAgICB2YXIgYmIgPSBzcGFjaW5nQmIoKTtcbiAgICB2YXIgZ2V0RmluYWxQb3MgPSBtZW1vaXplKGZ1bmN0aW9uIChub2RlLCBpKSB7XG4gICAgICB2YXIgbmV3UG9zID0gZm5NZW0obm9kZSwgaSk7XG4gICAgICBpZiAodXNlU3BhY2luZ0ZhY3Rvcikge1xuICAgICAgICB2YXIgc3BhY2luZyA9IE1hdGguYWJzKG9wdGlvbnMuc3BhY2luZ0ZhY3Rvcik7XG4gICAgICAgIG5ld1BvcyA9IGNhbGN1bGF0ZVNwYWNpbmcoc3BhY2luZywgYmIsIG5ld1Bvcyk7XG4gICAgICB9XG4gICAgICBpZiAob3B0aW9ucy50cmFuc2Zvcm0gIT0gbnVsbCkge1xuICAgICAgICBuZXdQb3MgPSBvcHRpb25zLnRyYW5zZm9ybShub2RlLCBuZXdQb3MpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ld1BvcztcbiAgICB9LCBnZXRNZW1vaXplS2V5KTtcbiAgICBpZiAob3B0aW9ucy5hbmltYXRlKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBub2RlID0gbm9kZXNbaV07XG4gICAgICAgIHZhciBuZXdQb3MgPSBnZXRGaW5hbFBvcyhub2RlLCBpKTtcbiAgICAgICAgdmFyIGFuaW1hdGVOb2RlID0gb3B0aW9ucy5hbmltYXRlRmlsdGVyID09IG51bGwgfHwgb3B0aW9ucy5hbmltYXRlRmlsdGVyKG5vZGUsIGkpO1xuICAgICAgICBpZiAoYW5pbWF0ZU5vZGUpIHtcbiAgICAgICAgICB2YXIgYW5pID0gbm9kZS5hbmltYXRpb24oe1xuICAgICAgICAgICAgcG9zaXRpb246IG5ld1BvcyxcbiAgICAgICAgICAgIGR1cmF0aW9uOiBvcHRpb25zLmFuaW1hdGlvbkR1cmF0aW9uLFxuICAgICAgICAgICAgZWFzaW5nOiBvcHRpb25zLmFuaW1hdGlvbkVhc2luZ1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGxheW91dC5hbmltYXRpb25zLnB1c2goYW5pKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBub2RlLnBvc2l0aW9uKG5ld1Bvcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zLmZpdCkge1xuICAgICAgICB2YXIgZml0QW5pID0gY3kuYW5pbWF0aW9uKHtcbiAgICAgICAgICBmaXQ6IHtcbiAgICAgICAgICAgIGJvdW5kaW5nQm94OiBsYXlvdXRFbGVzLmJvdW5kaW5nQm94QXQoZ2V0RmluYWxQb3MpLFxuICAgICAgICAgICAgcGFkZGluZzogb3B0aW9ucy5wYWRkaW5nXG4gICAgICAgICAgfSxcbiAgICAgICAgICBkdXJhdGlvbjogb3B0aW9ucy5hbmltYXRpb25EdXJhdGlvbixcbiAgICAgICAgICBlYXNpbmc6IG9wdGlvbnMuYW5pbWF0aW9uRWFzaW5nXG4gICAgICAgIH0pO1xuICAgICAgICBsYXlvdXQuYW5pbWF0aW9ucy5wdXNoKGZpdEFuaSk7XG4gICAgICB9IGVsc2UgaWYgKG9wdGlvbnMuem9vbSAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnMucGFuICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFyIHpvb21QYW5BbmkgPSBjeS5hbmltYXRpb24oe1xuICAgICAgICAgIHpvb206IG9wdGlvbnMuem9vbSxcbiAgICAgICAgICBwYW46IG9wdGlvbnMucGFuLFxuICAgICAgICAgIGR1cmF0aW9uOiBvcHRpb25zLmFuaW1hdGlvbkR1cmF0aW9uLFxuICAgICAgICAgIGVhc2luZzogb3B0aW9ucy5hbmltYXRpb25FYXNpbmdcbiAgICAgICAgfSk7XG4gICAgICAgIGxheW91dC5hbmltYXRpb25zLnB1c2goem9vbVBhbkFuaSk7XG4gICAgICB9XG4gICAgICBsYXlvdXQuYW5pbWF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChhbmkpIHtcbiAgICAgICAgcmV0dXJuIGFuaS5wbGF5KCk7XG4gICAgICB9KTtcbiAgICAgIGxheW91dC5vbmUoJ2xheW91dHJlYWR5Jywgb3B0aW9ucy5yZWFkeSk7XG4gICAgICBsYXlvdXQuZW1pdCh7XG4gICAgICAgIHR5cGU6ICdsYXlvdXRyZWFkeScsXG4gICAgICAgIGxheW91dDogbGF5b3V0XG4gICAgICB9KTtcbiAgICAgIFByb21pc2UkMS5hbGwobGF5b3V0LmFuaW1hdGlvbnMubWFwKGZ1bmN0aW9uIChhbmkpIHtcbiAgICAgICAgcmV0dXJuIGFuaS5wcm9taXNlKCk7XG4gICAgICB9KSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxheW91dC5vbmUoJ2xheW91dHN0b3AnLCBvcHRpb25zLnN0b3ApO1xuICAgICAgICBsYXlvdXQuZW1pdCh7XG4gICAgICAgICAgdHlwZTogJ2xheW91dHN0b3AnLFxuICAgICAgICAgIGxheW91dDogbGF5b3V0XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGVzLnBvc2l0aW9ucyhnZXRGaW5hbFBvcyk7XG4gICAgICBpZiAob3B0aW9ucy5maXQpIHtcbiAgICAgICAgY3kuZml0KG9wdGlvbnMuZWxlcywgb3B0aW9ucy5wYWRkaW5nKTtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zLnpvb20gIT0gbnVsbCkge1xuICAgICAgICBjeS56b29tKG9wdGlvbnMuem9vbSk7XG4gICAgICB9XG4gICAgICBpZiAob3B0aW9ucy5wYW4pIHtcbiAgICAgICAgY3kucGFuKG9wdGlvbnMucGFuKTtcbiAgICAgIH1cbiAgICAgIGxheW91dC5vbmUoJ2xheW91dHJlYWR5Jywgb3B0aW9ucy5yZWFkeSk7XG4gICAgICBsYXlvdXQuZW1pdCh7XG4gICAgICAgIHR5cGU6ICdsYXlvdXRyZWFkeScsXG4gICAgICAgIGxheW91dDogbGF5b3V0XG4gICAgICB9KTtcbiAgICAgIGxheW91dC5vbmUoJ2xheW91dHN0b3AnLCBvcHRpb25zLnN0b3ApO1xuICAgICAgbGF5b3V0LmVtaXQoe1xuICAgICAgICB0eXBlOiAnbGF5b3V0c3RvcCcsXG4gICAgICAgIGxheW91dDogbGF5b3V0XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG4gIGxheW91dDogZnVuY3Rpb24gbGF5b3V0KG9wdGlvbnMpIHtcbiAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gICAgcmV0dXJuIGN5Lm1ha2VMYXlvdXQoZXh0ZW5kKHt9LCBvcHRpb25zLCB7XG4gICAgICBlbGVzOiB0aGlzXG4gICAgfSkpO1xuICB9XG59O1xuXG4vLyBhbGlhc2VzOlxuZWxlc2ZuJDUuY3JlYXRlTGF5b3V0ID0gZWxlc2ZuJDUubWFrZUxheW91dCA9IGVsZXNmbiQ1LmxheW91dDtcblxuZnVuY3Rpb24gc3R5bGVDYWNoZShrZXksIGZuLCBlbGUpIHtcbiAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICB2YXIgY2FjaGUgPSBfcC5zdHlsZUNhY2hlID0gX3Auc3R5bGVDYWNoZSB8fCBbXTtcbiAgdmFyIHZhbDtcbiAgaWYgKCh2YWwgPSBjYWNoZVtrZXldKSAhPSBudWxsKSB7XG4gICAgcmV0dXJuIHZhbDtcbiAgfSBlbHNlIHtcbiAgICB2YWwgPSBjYWNoZVtrZXldID0gZm4oZWxlKTtcbiAgICByZXR1cm4gdmFsO1xuICB9XG59XG5mdW5jdGlvbiBjYWNoZVN0eWxlRnVuY3Rpb24oa2V5LCBmbikge1xuICBrZXkgPSBoYXNoU3RyaW5nKGtleSk7XG4gIHJldHVybiBmdW5jdGlvbiBjYWNoZWRTdHlsZUZ1bmN0aW9uKGVsZSkge1xuICAgIHJldHVybiBzdHlsZUNhY2hlKGtleSwgZm4sIGVsZSk7XG4gIH07XG59XG5mdW5jdGlvbiBjYWNoZVByb3RvdHlwZVN0eWxlRnVuY3Rpb24oa2V5LCBmbikge1xuICBrZXkgPSBoYXNoU3RyaW5nKGtleSk7XG4gIHZhciBzZWxmRm4gPSBmdW5jdGlvbiBzZWxmRm4oZWxlKSB7XG4gICAgcmV0dXJuIGZuLmNhbGwoZWxlKTtcbiAgfTtcbiAgcmV0dXJuIGZ1bmN0aW9uIGNhY2hlZFByb3RvdHlwZVN0eWxlRnVuY3Rpb24oKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgaWYgKGVsZSkge1xuICAgICAgcmV0dXJuIHN0eWxlQ2FjaGUoa2V5LCBzZWxmRm4sIGVsZSk7XG4gICAgfVxuICB9O1xufVxudmFyIGVsZXNmbiQ0ID0ge1xuICByZWNhbGN1bGF0ZVJlbmRlcmVkU3R5bGU6IGZ1bmN0aW9uIHJlY2FsY3VsYXRlUmVuZGVyZWRTdHlsZSh1c2VDYWNoZSkge1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgICB2YXIgcmVuZGVyZXIgPSBjeS5yZW5kZXJlcigpO1xuICAgIHZhciBzdHlsZUVuYWJsZWQgPSBjeS5zdHlsZUVuYWJsZWQoKTtcbiAgICBpZiAocmVuZGVyZXIgJiYgc3R5bGVFbmFibGVkKSB7XG4gICAgICByZW5kZXJlci5yZWNhbGN1bGF0ZVJlbmRlcmVkU3R5bGUodGhpcywgdXNlQ2FjaGUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgZGlydHlTdHlsZUNhY2hlOiBmdW5jdGlvbiBkaXJ0eVN0eWxlQ2FjaGUoKSB7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgIHZhciBkaXJ0eSA9IGZ1bmN0aW9uIGRpcnR5KGVsZSkge1xuICAgICAgcmV0dXJuIGVsZS5fcHJpdmF0ZS5zdHlsZUNhY2hlID0gbnVsbDtcbiAgICB9O1xuICAgIGlmIChjeS5oYXNDb21wb3VuZE5vZGVzKCkpIHtcbiAgICAgIHZhciBlbGVzO1xuICAgICAgZWxlcyA9IHRoaXMuc3Bhd25TZWxmKCkubWVyZ2UodGhpcy5kZXNjZW5kYW50cygpKS5tZXJnZSh0aGlzLnBhcmVudHMoKSk7XG4gICAgICBlbGVzLm1lcmdlKGVsZXMuY29ubmVjdGVkRWRnZXMoKSk7XG4gICAgICBlbGVzLmZvckVhY2goZGlydHkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICBkaXJ0eShlbGUpO1xuICAgICAgICBlbGUuY29ubmVjdGVkRWRnZXMoKS5mb3JFYWNoKGRpcnR5KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgLy8gZnVsbHkgdXBkYXRlcyAocmVjYWxjdWxhdGVzKSB0aGUgc3R5bGUgZm9yIHRoZSBlbGVtZW50c1xuICB1cGRhdGVTdHlsZTogZnVuY3Rpb24gdXBkYXRlU3R5bGUobm90aWZ5UmVuZGVyZXIpIHtcbiAgICB2YXIgY3kgPSB0aGlzLl9wcml2YXRlLmN5O1xuICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBpZiAoY3kuYmF0Y2hpbmcoKSkge1xuICAgICAgdmFyIGJFbGVzID0gY3kuX3ByaXZhdGUuYmF0Y2hTdHlsZUVsZXM7XG4gICAgICBiRWxlcy5tZXJnZSh0aGlzKTtcbiAgICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZyBhbmQgZXhpdCBlYXJseSB3aGVuIGJhdGNoaW5nXG4gICAgfVxuICAgIHZhciBoYXNDb21wb3VuZHMgPSBjeS5oYXNDb21wb3VuZE5vZGVzKCk7XG4gICAgdmFyIHVwZGF0ZWRFbGVzID0gdGhpcztcbiAgICBub3RpZnlSZW5kZXJlciA9IG5vdGlmeVJlbmRlcmVyIHx8IG5vdGlmeVJlbmRlcmVyID09PSB1bmRlZmluZWQgPyB0cnVlIDogZmFsc2U7XG4gICAgaWYgKGhhc0NvbXBvdW5kcykge1xuICAgICAgLy8gdGhlbiBhZGQgZXZlcnl0aGluZyB1cCBhbmQgZG93biBmb3IgY29tcG91bmQgc2VsZWN0b3IgY2hlY2tzXG4gICAgICB1cGRhdGVkRWxlcyA9IHRoaXMuc3Bhd25TZWxmKCkubWVyZ2UodGhpcy5kZXNjZW5kYW50cygpKS5tZXJnZSh0aGlzLnBhcmVudHMoKSk7XG4gICAgfVxuXG4gICAgLy8gbGV0IGNoYW5nZWRFbGVzID0gc3R5bGUuYXBwbHkoIHVwZGF0ZWRFbGVzICk7XG4gICAgdmFyIGNoYW5nZWRFbGVzID0gdXBkYXRlZEVsZXM7XG4gICAgaWYgKG5vdGlmeVJlbmRlcmVyKSB7XG4gICAgICBjaGFuZ2VkRWxlcy5lbWl0QW5kTm90aWZ5KCdzdHlsZScpOyAvLyBsZXQgcmVuZGVyZXIga25vdyB3ZSBjaGFuZ2VkIHN0eWxlXG4gICAgfSBlbHNlIHtcbiAgICAgIGNoYW5nZWRFbGVzLmVtaXQoJ3N0eWxlJyk7IC8vIGp1c3QgZmlyZSB0aGUgZXZlbnRcbiAgICB9XG4gICAgdXBkYXRlZEVsZXMuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICByZXR1cm4gZWxlLl9wcml2YXRlLnN0eWxlRGlydHkgPSB0cnVlO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuICAvLyBwcml2YXRlOiBjbGVhcnMgZGlydHkgZmxhZyBhbmQgcmVjYWxjdWxhdGVzIHN0eWxlXG4gIGNsZWFuU3R5bGU6IGZ1bmN0aW9uIGNsZWFuU3R5bGUoKSB7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICAgIGlmIChlbGUuX3ByaXZhdGUuc3R5bGVEaXJ0eSkge1xuICAgICAgICAvLyBuLmIuIHRoaXMgZmxhZyBzaG91bGQgYmUgc2V0IGJlZm9yZSBhcHBseSgpIHRvIGF2b2lkIHBvdGVudGlhbCBpbmZpbml0ZSByZWN1cnNpb25cbiAgICAgICAgZWxlLl9wcml2YXRlLnN0eWxlRGlydHkgPSBmYWxzZTtcbiAgICAgICAgY3kuc3R5bGUoKS5hcHBseShlbGUpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgLy8gZ2V0IHRoZSBpbnRlcm5hbCBwYXJzZWQgc3R5bGUgb2JqZWN0IGZvciB0aGUgc3BlY2lmaWVkIHByb3BlcnR5XG4gIHBhcnNlZFN0eWxlOiBmdW5jdGlvbiBwYXJzZWRTdHlsZShwcm9wZXJ0eSkge1xuICAgIHZhciBpbmNsdWRlTm9uRGVmYXVsdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdHJ1ZTtcbiAgICB2YXIgZWxlID0gdGhpc1swXTtcbiAgICB2YXIgY3kgPSBlbGUuY3koKTtcbiAgICBpZiAoIWN5LnN0eWxlRW5hYmxlZCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChlbGUpIHtcbiAgICAgIC8vIHRoaXMuY2xlYW5TdHlsZSgpO1xuXG4gICAgICAvLyBJbmxpbmUgdGhlIGltcG9ydGFudCBwYXJ0IG9mIGNsZWFuU3R5bGUoKSwgZm9yIHJhdyBwZXJmb3JtYW5jZVxuICAgICAgaWYgKGVsZS5fcHJpdmF0ZS5zdHlsZURpcnR5KSB7XG4gICAgICAgIC8vIG4uYi4gdGhpcyBmbGFnIHNob3VsZCBiZSBzZXQgYmVmb3JlIGFwcGx5KCkgdG8gYXZvaWQgcG90ZW50aWFsIGluZmluaXRlIHJlY3Vyc2lvblxuICAgICAgICBlbGUuX3ByaXZhdGUuc3R5bGVEaXJ0eSA9IGZhbHNlO1xuICAgICAgICBjeS5zdHlsZSgpLmFwcGx5KGVsZSk7XG4gICAgICB9XG4gICAgICB2YXIgb3ZlcnJpZGRlblN0eWxlID0gZWxlLl9wcml2YXRlLnN0eWxlW3Byb3BlcnR5XTtcbiAgICAgIGlmIChvdmVycmlkZGVuU3R5bGUgIT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gb3ZlcnJpZGRlblN0eWxlO1xuICAgICAgfSBlbHNlIGlmIChpbmNsdWRlTm9uRGVmYXVsdCkge1xuICAgICAgICByZXR1cm4gY3kuc3R5bGUoKS5nZXREZWZhdWx0UHJvcGVydHkocHJvcGVydHkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBudW1lcmljU3R5bGU6IGZ1bmN0aW9uIG51bWVyaWNTdHlsZShwcm9wZXJ0eSkge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIGlmICghZWxlLmN5KCkuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGVsZSkge1xuICAgICAgdmFyIHBzdHlsZSA9IGVsZS5wc3R5bGUocHJvcGVydHkpO1xuICAgICAgcmV0dXJuIHBzdHlsZS5wZlZhbHVlICE9PSB1bmRlZmluZWQgPyBwc3R5bGUucGZWYWx1ZSA6IHBzdHlsZS52YWx1ZTtcbiAgICB9XG4gIH0sXG4gIG51bWVyaWNTdHlsZVVuaXRzOiBmdW5jdGlvbiBudW1lcmljU3R5bGVVbml0cyhwcm9wZXJ0eSkge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIGlmICghZWxlLmN5KCkuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGVsZSkge1xuICAgICAgcmV0dXJuIGVsZS5wc3R5bGUocHJvcGVydHkpLnVuaXRzO1xuICAgIH1cbiAgfSxcbiAgLy8gZ2V0IHRoZSBzcGVjaWZpZWQgY3NzIHByb3BlcnR5IGFzIGEgcmVuZGVyZWQgdmFsdWUgKGkuZS4gb24tc2NyZWVuIHZhbHVlKVxuICAvLyBvciBnZXQgdGhlIHdob2xlIHJlbmRlcmVkIHN0eWxlIGlmIG5vIHByb3BlcnR5IHNwZWNpZmllZCAoTkIgZG9lc24ndCBhbGxvdyBzZXR0aW5nKVxuICByZW5kZXJlZFN0eWxlOiBmdW5jdGlvbiByZW5kZXJlZFN0eWxlKHByb3BlcnR5KSB7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB2YXIgZWxlID0gdGhpc1swXTtcbiAgICBpZiAoZWxlKSB7XG4gICAgICByZXR1cm4gY3kuc3R5bGUoKS5nZXRSZW5kZXJlZFN0eWxlKGVsZSwgcHJvcGVydHkpO1xuICAgIH1cbiAgfSxcbiAgLy8gcmVhZCB0aGUgY2FsY3VsYXRlZCBjc3Mgc3R5bGUgb2YgdGhlIGVsZW1lbnQgb3Igb3ZlcnJpZGUgdGhlIHN0eWxlICh2aWEgYSBieXBhc3MpXG4gIHN0eWxlOiBmdW5jdGlvbiBzdHlsZShuYW1lLCB2YWx1ZSkge1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgICBpZiAoIWN5LnN0eWxlRW5hYmxlZCgpKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdmFyIHVwZGF0ZVRyYW5zaXRpb25zID0gZmFsc2U7XG4gICAgdmFyIHN0eWxlID0gY3kuc3R5bGUoKTtcbiAgICBpZiAocGxhaW5PYmplY3QobmFtZSkpIHtcbiAgICAgIC8vIHRoZW4gZXh0ZW5kIHRoZSBieXBhc3NcbiAgICAgIHZhciBwcm9wcyA9IG5hbWU7XG4gICAgICBzdHlsZS5hcHBseUJ5cGFzcyh0aGlzLCBwcm9wcywgdXBkYXRlVHJhbnNpdGlvbnMpO1xuICAgICAgdGhpcy5lbWl0QW5kTm90aWZ5KCdzdHlsZScpOyAvLyBsZXQgdGhlIHJlbmRlcmVyIGtub3cgd2UndmUgdXBkYXRlZCBzdHlsZVxuICAgIH0gZWxzZSBpZiAoc3RyaW5nKG5hbWUpKSB7XG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyB0aGVuIGdldCB0aGUgcHJvcGVydHkgZnJvbSB0aGUgc3R5bGVcbiAgICAgICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgICAgIGlmIChlbGUpIHtcbiAgICAgICAgICByZXR1cm4gc3R5bGUuZ2V0U3R5bGVQcm9wZXJ0eVZhbHVlKGVsZSwgbmFtZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gZW1wdHkgY29sbGVjdGlvbiA9PiBjYW4ndCBnZXQgYW55IHZhbHVlXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB0aGVuIHNldCB0aGUgYnlwYXNzIHdpdGggdGhlIHByb3BlcnR5IHZhbHVlXG4gICAgICAgIHN0eWxlLmFwcGx5QnlwYXNzKHRoaXMsIG5hbWUsIHZhbHVlLCB1cGRhdGVUcmFuc2l0aW9ucyk7XG4gICAgICAgIHRoaXMuZW1pdEFuZE5vdGlmeSgnc3R5bGUnKTsgLy8gbGV0IHRoZSByZW5kZXJlciBrbm93IHdlJ3ZlIHVwZGF0ZWQgc3R5bGVcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIF9lbGUgPSB0aGlzWzBdO1xuICAgICAgaWYgKF9lbGUpIHtcbiAgICAgICAgcmV0dXJuIHN0eWxlLmdldFJhd1N0eWxlKF9lbGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZW1wdHkgY29sbGVjdGlvbiA9PiBjYW4ndCBnZXQgYW55IHZhbHVlXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG4gIHJlbW92ZVN0eWxlOiBmdW5jdGlvbiByZW1vdmVTdHlsZShuYW1lcykge1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgICBpZiAoIWN5LnN0eWxlRW5hYmxlZCgpKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdmFyIHVwZGF0ZVRyYW5zaXRpb25zID0gZmFsc2U7XG4gICAgdmFyIHN0eWxlID0gY3kuc3R5bGUoKTtcbiAgICB2YXIgZWxlcyA9IHRoaXM7XG4gICAgaWYgKG5hbWVzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICAgICAgc3R5bGUucmVtb3ZlQWxsQnlwYXNzZXMoZWxlLCB1cGRhdGVUcmFuc2l0aW9ucyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG5hbWVzID0gbmFtZXMuc3BsaXQoL1xccysvKTtcbiAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBlbGVzLmxlbmd0aDsgX2krKykge1xuICAgICAgICB2YXIgX2VsZTIgPSBlbGVzW19pXTtcbiAgICAgICAgc3R5bGUucmVtb3ZlQnlwYXNzZXMoX2VsZTIsIG5hbWVzLCB1cGRhdGVUcmFuc2l0aW9ucyk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuZW1pdEFuZE5vdGlmeSgnc3R5bGUnKTsgLy8gbGV0IHRoZSByZW5kZXJlciBrbm93IHdlJ3ZlIHVwZGF0ZWQgc3R5bGVcblxuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuICBzaG93OiBmdW5jdGlvbiBzaG93KCkge1xuICAgIHRoaXMuY3NzKCdkaXNwbGF5JywgJ2VsZW1lbnQnKTtcbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcbiAgaGlkZTogZnVuY3Rpb24gaGlkZSgpIHtcbiAgICB0aGlzLmNzcygnZGlzcGxheScsICdub25lJyk7XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG4gIGVmZmVjdGl2ZU9wYWNpdHk6IGZ1bmN0aW9uIGVmZmVjdGl2ZU9wYWNpdHkoKSB7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICB2YXIgaGFzQ29tcG91bmROb2RlcyA9IGN5Lmhhc0NvbXBvdW5kTm9kZXMoKTtcbiAgICB2YXIgZWxlID0gdGhpc1swXTtcbiAgICBpZiAoZWxlKSB7XG4gICAgICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gICAgICB2YXIgcGFyZW50T3BhY2l0eSA9IGVsZS5wc3R5bGUoJ29wYWNpdHknKS52YWx1ZTtcbiAgICAgIGlmICghaGFzQ29tcG91bmROb2Rlcykge1xuICAgICAgICByZXR1cm4gcGFyZW50T3BhY2l0eTtcbiAgICAgIH1cbiAgICAgIHZhciBwYXJlbnRzID0gIV9wLmRhdGEucGFyZW50ID8gbnVsbCA6IGVsZS5wYXJlbnRzKCk7XG4gICAgICBpZiAocGFyZW50cykge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgcGFyZW50ID0gcGFyZW50c1tpXTtcbiAgICAgICAgICB2YXIgb3BhY2l0eSA9IHBhcmVudC5wc3R5bGUoJ29wYWNpdHknKS52YWx1ZTtcbiAgICAgICAgICBwYXJlbnRPcGFjaXR5ID0gb3BhY2l0eSAqIHBhcmVudE9wYWNpdHk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXJlbnRPcGFjaXR5O1xuICAgIH1cbiAgfSxcbiAgdHJhbnNwYXJlbnQ6IGZ1bmN0aW9uIHRyYW5zcGFyZW50KCkge1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgICBpZiAoIWN5LnN0eWxlRW5hYmxlZCgpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIHZhciBoYXNDb21wb3VuZE5vZGVzID0gZWxlLmN5KCkuaGFzQ29tcG91bmROb2RlcygpO1xuICAgIGlmIChlbGUpIHtcbiAgICAgIGlmICghaGFzQ29tcG91bmROb2Rlcykge1xuICAgICAgICByZXR1cm4gZWxlLnBzdHlsZSgnb3BhY2l0eScpLnZhbHVlID09PSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGVsZS5lZmZlY3RpdmVPcGFjaXR5KCkgPT09IDA7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBiYWNrZ3JvdW5kaW5nOiBmdW5jdGlvbiBiYWNrZ3JvdW5kaW5nKCkge1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgICBpZiAoIWN5LnN0eWxlRW5hYmxlZCgpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIHJldHVybiBlbGUuX3ByaXZhdGUuYmFja2dyb3VuZGluZyA/IHRydWUgOiBmYWxzZTtcbiAgfVxufTtcbmZ1bmN0aW9uIGNoZWNrQ29tcG91bmQoZWxlLCBwYXJlbnRPaykge1xuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIHZhciBwYXJlbnRzID0gX3AuZGF0YS5wYXJlbnQgPyBlbGUucGFyZW50cygpIDogbnVsbDtcbiAgaWYgKHBhcmVudHMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwYXJlbnQgPSBwYXJlbnRzW2ldO1xuICAgICAgaWYgKCFwYXJlbnRPayhwYXJlbnQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBkZWZpbmVEZXJpdmVkU3RhdGVGdW5jdGlvbihzcGVjcykge1xuICB2YXIgb2sgPSBzcGVjcy5vaztcbiAgdmFyIGVkZ2VPa1ZpYU5vZGUgPSBzcGVjcy5lZGdlT2tWaWFOb2RlIHx8IHNwZWNzLm9rO1xuICB2YXIgcGFyZW50T2sgPSBzcGVjcy5wYXJlbnRPayB8fCBzcGVjcy5vaztcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gICAgaWYgKCFjeS5zdHlsZUVuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIHZhciBoYXNDb21wb3VuZE5vZGVzID0gY3kuaGFzQ29tcG91bmROb2RlcygpO1xuICAgIGlmIChlbGUpIHtcbiAgICAgIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgICAgIGlmICghb2soZWxlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoZWxlLmlzTm9kZSgpKSB7XG4gICAgICAgIHJldHVybiAhaGFzQ29tcG91bmROb2RlcyB8fCBjaGVja0NvbXBvdW5kKGVsZSwgcGFyZW50T2spO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHNyYyA9IF9wLnNvdXJjZTtcbiAgICAgICAgdmFyIHRndCA9IF9wLnRhcmdldDtcbiAgICAgICAgcmV0dXJuIGVkZ2VPa1ZpYU5vZGUoc3JjKSAmJiAoIWhhc0NvbXBvdW5kTm9kZXMgfHwgY2hlY2tDb21wb3VuZChzcmMsIGVkZ2VPa1ZpYU5vZGUpKSAmJiAoc3JjID09PSB0Z3QgfHwgZWRnZU9rVmlhTm9kZSh0Z3QpICYmICghaGFzQ29tcG91bmROb2RlcyB8fCBjaGVja0NvbXBvdW5kKHRndCwgZWRnZU9rVmlhTm9kZSkpKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG52YXIgZWxlVGFrZXNVcFNwYWNlID0gY2FjaGVTdHlsZUZ1bmN0aW9uKCdlbGVUYWtlc1VwU3BhY2UnLCBmdW5jdGlvbiAoZWxlKSB7XG4gIHJldHVybiBlbGUucHN0eWxlKCdkaXNwbGF5JykudmFsdWUgPT09ICdlbGVtZW50JyAmJiBlbGUud2lkdGgoKSAhPT0gMCAmJiAoZWxlLmlzTm9kZSgpID8gZWxlLmhlaWdodCgpICE9PSAwIDogdHJ1ZSk7XG59KTtcbmVsZXNmbiQ0LnRha2VzVXBTcGFjZSA9IGNhY2hlUHJvdG90eXBlU3R5bGVGdW5jdGlvbigndGFrZXNVcFNwYWNlJywgZGVmaW5lRGVyaXZlZFN0YXRlRnVuY3Rpb24oe1xuICBvazogZWxlVGFrZXNVcFNwYWNlXG59KSk7XG52YXIgZWxlSW50ZXJhY3RpdmUgPSBjYWNoZVN0eWxlRnVuY3Rpb24oJ2VsZUludGVyYWN0aXZlJywgZnVuY3Rpb24gKGVsZSkge1xuICByZXR1cm4gZWxlLnBzdHlsZSgnZXZlbnRzJykudmFsdWUgPT09ICd5ZXMnICYmIGVsZS5wc3R5bGUoJ3Zpc2liaWxpdHknKS52YWx1ZSA9PT0gJ3Zpc2libGUnICYmIGVsZVRha2VzVXBTcGFjZShlbGUpO1xufSk7XG52YXIgcGFyZW50SW50ZXJhY3RpdmUgPSBjYWNoZVN0eWxlRnVuY3Rpb24oJ3BhcmVudEludGVyYWN0aXZlJywgZnVuY3Rpb24gKHBhcmVudCkge1xuICByZXR1cm4gcGFyZW50LnBzdHlsZSgndmlzaWJpbGl0eScpLnZhbHVlID09PSAndmlzaWJsZScgJiYgZWxlVGFrZXNVcFNwYWNlKHBhcmVudCk7XG59KTtcbmVsZXNmbiQ0LmludGVyYWN0aXZlID0gY2FjaGVQcm90b3R5cGVTdHlsZUZ1bmN0aW9uKCdpbnRlcmFjdGl2ZScsIGRlZmluZURlcml2ZWRTdGF0ZUZ1bmN0aW9uKHtcbiAgb2s6IGVsZUludGVyYWN0aXZlLFxuICBwYXJlbnRPazogcGFyZW50SW50ZXJhY3RpdmUsXG4gIGVkZ2VPa1ZpYU5vZGU6IGVsZVRha2VzVXBTcGFjZVxufSkpO1xuZWxlc2ZuJDQubm9uaW50ZXJhY3RpdmUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBlbGUgPSB0aGlzWzBdO1xuICBpZiAoZWxlKSB7XG4gICAgcmV0dXJuICFlbGUuaW50ZXJhY3RpdmUoKTtcbiAgfVxufTtcbnZhciBlbGVWaXNpYmxlID0gY2FjaGVTdHlsZUZ1bmN0aW9uKCdlbGVWaXNpYmxlJywgZnVuY3Rpb24gKGVsZSkge1xuICByZXR1cm4gZWxlLnBzdHlsZSgndmlzaWJpbGl0eScpLnZhbHVlID09PSAndmlzaWJsZScgJiYgZWxlLnBzdHlsZSgnb3BhY2l0eScpLnBmVmFsdWUgIT09IDAgJiYgZWxlVGFrZXNVcFNwYWNlKGVsZSk7XG59KTtcbnZhciBlZGdlVmlzaWJsZVZpYU5vZGUgPSBlbGVUYWtlc1VwU3BhY2U7XG5lbGVzZm4kNC52aXNpYmxlID0gY2FjaGVQcm90b3R5cGVTdHlsZUZ1bmN0aW9uKCd2aXNpYmxlJywgZGVmaW5lRGVyaXZlZFN0YXRlRnVuY3Rpb24oe1xuICBvazogZWxlVmlzaWJsZSxcbiAgZWRnZU9rVmlhTm9kZTogZWRnZVZpc2libGVWaWFOb2RlXG59KSk7XG5lbGVzZm4kNC5oaWRkZW4gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBlbGUgPSB0aGlzWzBdO1xuICBpZiAoZWxlKSB7XG4gICAgcmV0dXJuICFlbGUudmlzaWJsZSgpO1xuICB9XG59O1xuZWxlc2ZuJDQuaXNCdW5kbGVkQmV6aWVyID0gY2FjaGVQcm90b3R5cGVTdHlsZUZ1bmN0aW9uKCdpc0J1bmRsZWRCZXppZXInLCBmdW5jdGlvbiAoKSB7XG4gIGlmICghdGhpcy5jeSgpLnN0eWxlRW5hYmxlZCgpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiAhdGhpcy5yZW1vdmVkKCkgJiYgdGhpcy5wc3R5bGUoJ2N1cnZlLXN0eWxlJykudmFsdWUgPT09ICdiZXppZXInICYmIHRoaXMudGFrZXNVcFNwYWNlKCk7XG59KTtcbmVsZXNmbiQ0LmJ5cGFzcyA9IGVsZXNmbiQ0LmNzcyA9IGVsZXNmbiQ0LnN0eWxlO1xuZWxlc2ZuJDQucmVuZGVyZWRDc3MgPSBlbGVzZm4kNC5yZW5kZXJlZFN0eWxlO1xuZWxlc2ZuJDQucmVtb3ZlQnlwYXNzID0gZWxlc2ZuJDQucmVtb3ZlQ3NzID0gZWxlc2ZuJDQucmVtb3ZlU3R5bGU7XG5lbGVzZm4kNC5wc3R5bGUgPSBlbGVzZm4kNC5wYXJzZWRTdHlsZTtcblxudmFyIGVsZXNmbiQzID0ge307XG5mdW5jdGlvbiBkZWZpbmVTd2l0Y2hGdW5jdGlvbihwYXJhbXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICB2YXIgY2hhbmdlZEVsZXMgPSBbXTtcblxuICAgIC8vIGUuZy4gY3kubm9kZXMoKS5zZWxlY3QoIGRhdGEsIGhhbmRsZXIgKVxuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMikge1xuICAgICAgdmFyIGRhdGEgPSBhcmdzWzBdO1xuICAgICAgdmFyIGhhbmRsZXIgPSBhcmdzWzFdO1xuICAgICAgdGhpcy5vbihwYXJhbXMuZXZlbnQsIGRhdGEsIGhhbmRsZXIpO1xuICAgIH1cblxuICAgIC8vIGUuZy4gY3kubm9kZXMoKS5zZWxlY3QoIGhhbmRsZXIgKVxuICAgIGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09PSAxICYmIGZuJDYoYXJnc1swXSkpIHtcbiAgICAgIHZhciBfaGFuZGxlciA9IGFyZ3NbMF07XG4gICAgICB0aGlzLm9uKHBhcmFtcy5ldmVudCwgX2hhbmRsZXIpO1xuICAgIH1cblxuICAgIC8vIGUuZy4gY3kubm9kZXMoKS5zZWxlY3QoKVxuICAgIC8vIGUuZy4gKHByaXZhdGUpIGN5Lm5vZGVzKCkuc2VsZWN0KFsndGFwc2VsZWN0J10pXG4gICAgZWxzZSBpZiAoYXJncy5sZW5ndGggPT09IDAgfHwgYXJncy5sZW5ndGggPT09IDEgJiYgYXJyYXkoYXJnc1swXSkpIHtcbiAgICAgIHZhciBhZGRsRXZlbnRzID0gYXJncy5sZW5ndGggPT09IDEgPyBhcmdzWzBdIDogbnVsbDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICAgICAgdmFyIGFibGUgPSAhcGFyYW1zLmFibGVGaWVsZCB8fCBlbGUuX3ByaXZhdGVbcGFyYW1zLmFibGVGaWVsZF07XG4gICAgICAgIHZhciBjaGFuZ2VkID0gZWxlLl9wcml2YXRlW3BhcmFtcy5maWVsZF0gIT0gcGFyYW1zLnZhbHVlO1xuICAgICAgICBpZiAocGFyYW1zLm92ZXJyaWRlQWJsZSkge1xuICAgICAgICAgIHZhciBvdmVycmlkZUFibGUgPSBwYXJhbXMub3ZlcnJpZGVBYmxlKGVsZSk7XG4gICAgICAgICAgaWYgKG92ZXJyaWRlQWJsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBhYmxlID0gb3ZlcnJpZGVBYmxlO1xuICAgICAgICAgICAgaWYgKCFvdmVycmlkZUFibGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9IC8vIHRvIHNhdmUgY3ljbGVzIGFzc3VtZSBub3QgYWJsZSBmb3IgYWxsIG9uIG92ZXJyaWRlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChhYmxlKSB7XG4gICAgICAgICAgZWxlLl9wcml2YXRlW3BhcmFtcy5maWVsZF0gPSBwYXJhbXMudmFsdWU7XG4gICAgICAgICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgICAgIGNoYW5nZWRFbGVzLnB1c2goZWxlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBjaGFuZ2VkQ29sbCA9IHRoaXMuc3Bhd24oY2hhbmdlZEVsZXMpO1xuICAgICAgY2hhbmdlZENvbGwudXBkYXRlU3R5bGUoKTsgLy8gY2hhbmdlIG9mIHN0YXRlID0+IHBvc3NpYmxlIGNoYW5nZSBvZiBzdHlsZVxuICAgICAgY2hhbmdlZENvbGwuZW1pdChwYXJhbXMuZXZlbnQpO1xuICAgICAgaWYgKGFkZGxFdmVudHMpIHtcbiAgICAgICAgY2hhbmdlZENvbGwuZW1pdChhZGRsRXZlbnRzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG59XG5mdW5jdGlvbiBkZWZpbmVTd2l0Y2hTZXQocGFyYW1zKSB7XG4gIGVsZXNmbiQzW3BhcmFtcy5maWVsZF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgaWYgKGVsZSkge1xuICAgICAgaWYgKHBhcmFtcy5vdmVycmlkZUZpZWxkKSB7XG4gICAgICAgIHZhciB2YWwgPSBwYXJhbXMub3ZlcnJpZGVGaWVsZChlbGUpO1xuICAgICAgICBpZiAodmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZWxlLl9wcml2YXRlW3BhcmFtcy5maWVsZF07XG4gICAgfVxuICB9O1xuICBlbGVzZm4kM1twYXJhbXMub25dID0gZGVmaW5lU3dpdGNoRnVuY3Rpb24oe1xuICAgIGV2ZW50OiBwYXJhbXMub24sXG4gICAgZmllbGQ6IHBhcmFtcy5maWVsZCxcbiAgICBhYmxlRmllbGQ6IHBhcmFtcy5hYmxlRmllbGQsXG4gICAgb3ZlcnJpZGVBYmxlOiBwYXJhbXMub3ZlcnJpZGVBYmxlLFxuICAgIHZhbHVlOiB0cnVlXG4gIH0pO1xuICBlbGVzZm4kM1twYXJhbXMub2ZmXSA9IGRlZmluZVN3aXRjaEZ1bmN0aW9uKHtcbiAgICBldmVudDogcGFyYW1zLm9mZixcbiAgICBmaWVsZDogcGFyYW1zLmZpZWxkLFxuICAgIGFibGVGaWVsZDogcGFyYW1zLmFibGVGaWVsZCxcbiAgICBvdmVycmlkZUFibGU6IHBhcmFtcy5vdmVycmlkZUFibGUsXG4gICAgdmFsdWU6IGZhbHNlXG4gIH0pO1xufVxuZGVmaW5lU3dpdGNoU2V0KHtcbiAgZmllbGQ6ICdsb2NrZWQnLFxuICBvdmVycmlkZUZpZWxkOiBmdW5jdGlvbiBvdmVycmlkZUZpZWxkKGVsZSkge1xuICAgIHJldHVybiBlbGUuY3koKS5hdXRvbG9jaygpID8gdHJ1ZSA6IHVuZGVmaW5lZDtcbiAgfSxcbiAgb246ICdsb2NrJyxcbiAgb2ZmOiAndW5sb2NrJ1xufSk7XG5kZWZpbmVTd2l0Y2hTZXQoe1xuICBmaWVsZDogJ2dyYWJiYWJsZScsXG4gIG92ZXJyaWRlRmllbGQ6IGZ1bmN0aW9uIG92ZXJyaWRlRmllbGQoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5jeSgpLmF1dG91bmdyYWJpZnkoKSB8fCBlbGUucGFubmFibGUoKSA/IGZhbHNlIDogdW5kZWZpbmVkO1xuICB9LFxuICBvbjogJ2dyYWJpZnknLFxuICBvZmY6ICd1bmdyYWJpZnknXG59KTtcbmRlZmluZVN3aXRjaFNldCh7XG4gIGZpZWxkOiAnc2VsZWN0ZWQnLFxuICBhYmxlRmllbGQ6ICdzZWxlY3RhYmxlJyxcbiAgb3ZlcnJpZGVBYmxlOiBmdW5jdGlvbiBvdmVycmlkZUFibGUoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5jeSgpLmF1dG91bnNlbGVjdGlmeSgpID8gZmFsc2UgOiB1bmRlZmluZWQ7XG4gIH0sXG4gIG9uOiAnc2VsZWN0JyxcbiAgb2ZmOiAndW5zZWxlY3QnXG59KTtcbmRlZmluZVN3aXRjaFNldCh7XG4gIGZpZWxkOiAnc2VsZWN0YWJsZScsXG4gIG92ZXJyaWRlRmllbGQ6IGZ1bmN0aW9uIG92ZXJyaWRlRmllbGQoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5jeSgpLmF1dG91bnNlbGVjdGlmeSgpID8gZmFsc2UgOiB1bmRlZmluZWQ7XG4gIH0sXG4gIG9uOiAnc2VsZWN0aWZ5JyxcbiAgb2ZmOiAndW5zZWxlY3RpZnknXG59KTtcbmVsZXNmbiQzLmRlc2VsZWN0ID0gZWxlc2ZuJDMudW5zZWxlY3Q7XG5lbGVzZm4kMy5ncmFiYmVkID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZWxlID0gdGhpc1swXTtcbiAgaWYgKGVsZSkge1xuICAgIHJldHVybiBlbGUuX3ByaXZhdGUuZ3JhYmJlZDtcbiAgfVxufTtcbmRlZmluZVN3aXRjaFNldCh7XG4gIGZpZWxkOiAnYWN0aXZlJyxcbiAgb246ICdhY3RpdmF0ZScsXG4gIG9mZjogJ3VuYWN0aXZhdGUnXG59KTtcbmRlZmluZVN3aXRjaFNldCh7XG4gIGZpZWxkOiAncGFubmFibGUnLFxuICBvbjogJ3BhbmlmeScsXG4gIG9mZjogJ3VucGFuaWZ5J1xufSk7XG5lbGVzZm4kMy5pbmFjdGl2ZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGVsZSA9IHRoaXNbMF07XG4gIGlmIChlbGUpIHtcbiAgICByZXR1cm4gIWVsZS5fcHJpdmF0ZS5hY3RpdmU7XG4gIH1cbn07XG5cbnZhciBlbGVzZm4kMiA9IHt9O1xuXG4vLyBEQUcgZnVuY3Rpb25zXG4vLy8vLy8vLy8vLy8vLy8vXG5cbnZhciBkZWZpbmVEYWdFeHRyZW1pdHkgPSBmdW5jdGlvbiBkZWZpbmVEYWdFeHRyZW1pdHkocGFyYW1zKSB7XG4gIHJldHVybiBmdW5jdGlvbiBkYWdFeHRyZW1pdHlJbXBsKHNlbGVjdG9yKSB7XG4gICAgdmFyIGVsZXMgPSB0aGlzO1xuICAgIHZhciByZXQgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgICAgaWYgKCFlbGUuaXNOb2RlKCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB2YXIgZGlzcXVhbGlmaWVkID0gZmFsc2U7XG4gICAgICB2YXIgZWRnZXMgPSBlbGUuY29ubmVjdGVkRWRnZXMoKTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZWRnZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIGVkZ2UgPSBlZGdlc1tqXTtcbiAgICAgICAgdmFyIHNyYyA9IGVkZ2Uuc291cmNlKCk7XG4gICAgICAgIHZhciB0Z3QgPSBlZGdlLnRhcmdldCgpO1xuICAgICAgICBpZiAocGFyYW1zLm5vSW5jb21pbmdFZGdlcyAmJiB0Z3QgPT09IGVsZSAmJiBzcmMgIT09IGVsZSB8fCBwYXJhbXMubm9PdXRnb2luZ0VkZ2VzICYmIHNyYyA9PT0gZWxlICYmIHRndCAhPT0gZWxlKSB7XG4gICAgICAgICAgZGlzcXVhbGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFkaXNxdWFsaWZpZWQpIHtcbiAgICAgICAgcmV0LnB1c2goZWxlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3Bhd24ocmV0LCB0cnVlKS5maWx0ZXIoc2VsZWN0b3IpO1xuICB9O1xufTtcbnZhciBkZWZpbmVEYWdPbmVIb3AgPSBmdW5jdGlvbiBkZWZpbmVEYWdPbmVIb3AocGFyYW1zKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgICB2YXIgZWxlcyA9IHRoaXM7XG4gICAgdmFyIG9FbGVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICAgIGlmICghZWxlLmlzTm9kZSgpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdmFyIGVkZ2VzID0gZWxlLmNvbm5lY3RlZEVkZ2VzKCk7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGVkZ2VzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBlZGdlID0gZWRnZXNbal07XG4gICAgICAgIHZhciBzcmMgPSBlZGdlLnNvdXJjZSgpO1xuICAgICAgICB2YXIgdGd0ID0gZWRnZS50YXJnZXQoKTtcbiAgICAgICAgaWYgKHBhcmFtcy5vdXRnb2luZyAmJiBzcmMgPT09IGVsZSkge1xuICAgICAgICAgIG9FbGVzLnB1c2goZWRnZSk7XG4gICAgICAgICAgb0VsZXMucHVzaCh0Z3QpO1xuICAgICAgICB9IGVsc2UgaWYgKHBhcmFtcy5pbmNvbWluZyAmJiB0Z3QgPT09IGVsZSkge1xuICAgICAgICAgIG9FbGVzLnB1c2goZWRnZSk7XG4gICAgICAgICAgb0VsZXMucHVzaChzcmMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNwYXduKG9FbGVzLCB0cnVlKS5maWx0ZXIoc2VsZWN0b3IpO1xuICB9O1xufTtcbnZhciBkZWZpbmVEYWdBbGxIb3BzID0gZnVuY3Rpb24gZGVmaW5lRGFnQWxsSG9wcyhwYXJhbXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICAgIHZhciBlbGVzID0gdGhpcztcbiAgICB2YXIgc0VsZXMgPSBbXTtcbiAgICB2YXIgc0VsZXNJZHMgPSB7fTtcbiAgICBmb3IgKDs7KSB7XG4gICAgICB2YXIgbmV4dCA9IHBhcmFtcy5vdXRnb2luZyA/IGVsZXMub3V0Z29lcnMoKSA6IGVsZXMuaW5jb21lcnMoKTtcbiAgICAgIGlmIChuZXh0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH0gLy8gZG9uZSBpZiBub25lIGxlZnRcblxuICAgICAgdmFyIG5ld05leHQgPSBmYWxzZTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmV4dC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgbiA9IG5leHRbaV07XG4gICAgICAgIHZhciBuaWQgPSBuLmlkKCk7XG4gICAgICAgIGlmICghc0VsZXNJZHNbbmlkXSkge1xuICAgICAgICAgIHNFbGVzSWRzW25pZF0gPSB0cnVlO1xuICAgICAgICAgIHNFbGVzLnB1c2gobik7XG4gICAgICAgICAgbmV3TmV4dCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghbmV3TmV4dCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH0gLy8gZG9uZSBpZiB0b3VjaGVkIGFsbCBvdXRnb2VycyBhbHJlYWR5XG5cbiAgICAgIGVsZXMgPSBuZXh0O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zcGF3bihzRWxlcywgdHJ1ZSkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfTtcbn07XG5lbGVzZm4kMi5jbGVhclRyYXZlcnNhbENhY2hlID0gZnVuY3Rpb24gKCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICB0aGlzW2ldLl9wcml2YXRlLnRyYXZlcnNhbENhY2hlID0gbnVsbDtcbiAgfVxufTtcbmV4dGVuZChlbGVzZm4kMiwge1xuICAvLyBnZXQgdGhlIHJvb3Qgbm9kZXMgaW4gdGhlIERBR1xuICByb290czogZGVmaW5lRGFnRXh0cmVtaXR5KHtcbiAgICBub0luY29taW5nRWRnZXM6IHRydWVcbiAgfSksXG4gIC8vIGdldCB0aGUgbGVhZiBub2RlcyBpbiB0aGUgREFHXG4gIGxlYXZlczogZGVmaW5lRGFnRXh0cmVtaXR5KHtcbiAgICBub091dGdvaW5nRWRnZXM6IHRydWVcbiAgfSksXG4gIC8vIG5vcm1hbGx5IGNhbGxlZCBjaGlsZHJlbiBpbiBncmFwaCB0aGVvcnlcbiAgLy8gdGhlc2Ugbm9kZXMgPWVkZ2VzPT4gb3V0Z29pbmcgbm9kZXNcbiAgb3V0Z29lcnM6IGNhY2hlKGRlZmluZURhZ09uZUhvcCh7XG4gICAgb3V0Z29pbmc6IHRydWVcbiAgfSksICdvdXRnb2VycycpLFxuICAvLyBha2EgREFHIGRlc2NlbmRhbnRzXG4gIHN1Y2Nlc3NvcnM6IGRlZmluZURhZ0FsbEhvcHMoe1xuICAgIG91dGdvaW5nOiB0cnVlXG4gIH0pLFxuICAvLyBub3JtYWxseSBjYWxsZWQgcGFyZW50cyBpbiBncmFwaCB0aGVvcnlcbiAgLy8gdGhlc2Ugbm9kZXMgPD1lZGdlcz0gaW5jb21pbmcgbm9kZXNcbiAgaW5jb21lcnM6IGNhY2hlKGRlZmluZURhZ09uZUhvcCh7XG4gICAgaW5jb21pbmc6IHRydWVcbiAgfSksICdpbmNvbWVycycpLFxuICAvLyBha2EgREFHIGFuY2VzdG9yc1xuICBwcmVkZWNlc3NvcnM6IGRlZmluZURhZ0FsbEhvcHMoe1xuICAgIH0pXG59KTtcblxuLy8gTmVpZ2hib3VyaG9vZCBmdW5jdGlvbnNcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbmV4dGVuZChlbGVzZm4kMiwge1xuICBuZWlnaGJvcmhvb2Q6IGNhY2hlKGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICAgIHZhciBlbGVtZW50cyA9IFtdO1xuICAgIHZhciBub2RlcyA9IHRoaXMubm9kZXMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvLyBmb3IgYWxsIG5vZGVzXG4gICAgICB2YXIgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgdmFyIGNvbm5lY3RlZEVkZ2VzID0gbm9kZS5jb25uZWN0ZWRFZGdlcygpO1xuXG4gICAgICAvLyBmb3IgZWFjaCBjb25uZWN0ZWQgZWRnZSwgYWRkIHRoZSBlZGdlIGFuZCB0aGUgb3RoZXIgbm9kZVxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjb25uZWN0ZWRFZGdlcy5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgZWRnZSA9IGNvbm5lY3RlZEVkZ2VzW2pdO1xuICAgICAgICB2YXIgc3JjID0gZWRnZS5zb3VyY2UoKTtcbiAgICAgICAgdmFyIHRndCA9IGVkZ2UudGFyZ2V0KCk7XG4gICAgICAgIHZhciBvdGhlck5vZGUgPSBub2RlID09PSBzcmMgPyB0Z3QgOiBzcmM7XG5cbiAgICAgICAgLy8gbmVlZCBjaGVjayBpbiBjYXNlIG9mIGxvb3BcbiAgICAgICAgaWYgKG90aGVyTm9kZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgZWxlbWVudHMucHVzaChvdGhlck5vZGVbMF0pOyAvLyBhZGQgbm9kZSAxIGhvcCBhd2F5XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhZGQgY29ubmVjdGVkIGVkZ2VcbiAgICAgICAgZWxlbWVudHMucHVzaChlZGdlWzBdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3Bhd24oZWxlbWVudHMsIHRydWUpLmZpbHRlcihzZWxlY3Rvcik7XG4gIH0sICduZWlnaGJvcmhvb2QnKSxcbiAgY2xvc2VkTmVpZ2hib3Job29kOiBmdW5jdGlvbiBjbG9zZWROZWlnaGJvcmhvb2Qoc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gdGhpcy5uZWlnaGJvcmhvb2QoKS5hZGQodGhpcykuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfSxcbiAgb3Blbk5laWdoYm9yaG9vZDogZnVuY3Rpb24gb3Blbk5laWdoYm9yaG9vZChzZWxlY3Rvcikge1xuICAgIHJldHVybiB0aGlzLm5laWdoYm9yaG9vZChzZWxlY3Rvcik7XG4gIH1cbn0pO1xuXG4vLyBhbGlhc2VzXG5lbGVzZm4kMi5uZWlnaGJvdXJob29kID0gZWxlc2ZuJDIubmVpZ2hib3Job29kO1xuZWxlc2ZuJDIuY2xvc2VkTmVpZ2hib3VyaG9vZCA9IGVsZXNmbiQyLmNsb3NlZE5laWdoYm9yaG9vZDtcbmVsZXNmbiQyLm9wZW5OZWlnaGJvdXJob29kID0gZWxlc2ZuJDIub3Blbk5laWdoYm9yaG9vZDtcblxuLy8gRWRnZSBmdW5jdGlvbnNcbi8vLy8vLy8vLy8vLy8vLy8vXG5cbmV4dGVuZChlbGVzZm4kMiwge1xuICBzb3VyY2U6IGNhY2hlKGZ1bmN0aW9uIHNvdXJjZUltcGwoc2VsZWN0b3IpIHtcbiAgICB2YXIgZWxlID0gdGhpc1swXTtcbiAgICB2YXIgc3JjO1xuICAgIGlmIChlbGUpIHtcbiAgICAgIHNyYyA9IGVsZS5fcHJpdmF0ZS5zb3VyY2UgfHwgZWxlLmN5KCkuY29sbGVjdGlvbigpO1xuICAgIH1cbiAgICByZXR1cm4gc3JjICYmIHNlbGVjdG9yID8gc3JjLmZpbHRlcihzZWxlY3RvcikgOiBzcmM7XG4gIH0sICdzb3VyY2UnKSxcbiAgdGFyZ2V0OiBjYWNoZShmdW5jdGlvbiB0YXJnZXRJbXBsKHNlbGVjdG9yKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgdmFyIHRndDtcbiAgICBpZiAoZWxlKSB7XG4gICAgICB0Z3QgPSBlbGUuX3ByaXZhdGUudGFyZ2V0IHx8IGVsZS5jeSgpLmNvbGxlY3Rpb24oKTtcbiAgICB9XG4gICAgcmV0dXJuIHRndCAmJiBzZWxlY3RvciA/IHRndC5maWx0ZXIoc2VsZWN0b3IpIDogdGd0O1xuICB9LCAndGFyZ2V0JyksXG4gIHNvdXJjZXM6IGRlZmluZVNvdXJjZUZ1bmN0aW9uKHtcbiAgICBhdHRyOiAnc291cmNlJ1xuICB9KSxcbiAgdGFyZ2V0czogZGVmaW5lU291cmNlRnVuY3Rpb24oe1xuICAgIGF0dHI6ICd0YXJnZXQnXG4gIH0pXG59KTtcbmZ1bmN0aW9uIGRlZmluZVNvdXJjZUZ1bmN0aW9uKHBhcmFtcykge1xuICByZXR1cm4gZnVuY3Rpb24gc291cmNlSW1wbChzZWxlY3Rvcikge1xuICAgIHZhciBzb3VyY2VzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICAgIHZhciBzcmMgPSBlbGUuX3ByaXZhdGVbcGFyYW1zLmF0dHJdO1xuICAgICAgaWYgKHNyYykge1xuICAgICAgICBzb3VyY2VzLnB1c2goc3JjKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3Bhd24oc291cmNlcywgdHJ1ZSkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfTtcbn1cbmV4dGVuZChlbGVzZm4kMiwge1xuICBlZGdlc1dpdGg6IGNhY2hlKGRlZmluZUVkZ2VzV2l0aEZ1bmN0aW9uKCksICdlZGdlc1dpdGgnKSxcbiAgZWRnZXNUbzogY2FjaGUoZGVmaW5lRWRnZXNXaXRoRnVuY3Rpb24oe1xuICAgIHRoaXNJc1NyYzogdHJ1ZVxuICB9KSwgJ2VkZ2VzVG8nKVxufSk7XG5mdW5jdGlvbiBkZWZpbmVFZGdlc1dpdGhGdW5jdGlvbihwYXJhbXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGVkZ2VzV2l0aEltcGwob3RoZXJOb2Rlcykge1xuICAgIHZhciBlbGVtZW50cyA9IFtdO1xuICAgIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3k7XG4gICAgdmFyIHAgPSBwYXJhbXMgfHwge307XG5cbiAgICAvLyBnZXQgZWxlbWVudHMgaWYgYSBzZWxlY3RvciBpcyBzcGVjaWZpZWRcbiAgICBpZiAoc3RyaW5nKG90aGVyTm9kZXMpKSB7XG4gICAgICBvdGhlck5vZGVzID0gY3kuJChvdGhlck5vZGVzKTtcbiAgICB9XG4gICAgZm9yICh2YXIgaCA9IDA7IGggPCBvdGhlck5vZGVzLmxlbmd0aDsgaCsrKSB7XG4gICAgICB2YXIgZWRnZXMgPSBvdGhlck5vZGVzW2hdLl9wcml2YXRlLmVkZ2VzO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlZGdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWRnZSA9IGVkZ2VzW2ldO1xuICAgICAgICB2YXIgZWRnZURhdGEgPSBlZGdlLl9wcml2YXRlLmRhdGE7XG4gICAgICAgIHZhciB0aGlzVG9PdGhlciA9IHRoaXMuaGFzRWxlbWVudFdpdGhJZChlZGdlRGF0YS5zb3VyY2UpICYmIG90aGVyTm9kZXMuaGFzRWxlbWVudFdpdGhJZChlZGdlRGF0YS50YXJnZXQpO1xuICAgICAgICB2YXIgb3RoZXJUb1RoaXMgPSBvdGhlck5vZGVzLmhhc0VsZW1lbnRXaXRoSWQoZWRnZURhdGEuc291cmNlKSAmJiB0aGlzLmhhc0VsZW1lbnRXaXRoSWQoZWRnZURhdGEudGFyZ2V0KTtcbiAgICAgICAgdmFyIGVkZ2VDb25uZWN0c1RoaXNBbmRPdGhlciA9IHRoaXNUb090aGVyIHx8IG90aGVyVG9UaGlzO1xuICAgICAgICBpZiAoIWVkZ2VDb25uZWN0c1RoaXNBbmRPdGhlcikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwLnRoaXNJc1NyYyB8fCBwLnRoaXNJc1RndCkge1xuICAgICAgICAgIGlmIChwLnRoaXNJc1NyYyAmJiAhdGhpc1RvT3RoZXIpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocC50aGlzSXNUZ3QgJiYgIW90aGVyVG9UaGlzKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxlbWVudHMucHVzaChlZGdlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3Bhd24oZWxlbWVudHMsIHRydWUpO1xuICB9O1xufVxuZXh0ZW5kKGVsZXNmbiQyLCB7XG4gIGNvbm5lY3RlZEVkZ2VzOiBjYWNoZShmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgICB2YXIgcmV0RWxlcyA9IFtdO1xuICAgIHZhciBlbGVzID0gdGhpcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBub2RlID0gZWxlc1tpXTtcbiAgICAgIGlmICghbm9kZS5pc05vZGUoKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBlZGdlcyA9IG5vZGUuX3ByaXZhdGUuZWRnZXM7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGVkZ2VzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBlZGdlID0gZWRnZXNbal07XG4gICAgICAgIHJldEVsZXMucHVzaChlZGdlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3Bhd24ocmV0RWxlcywgdHJ1ZSkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfSwgJ2Nvbm5lY3RlZEVkZ2VzJyksXG4gIGNvbm5lY3RlZE5vZGVzOiBjYWNoZShmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgICB2YXIgcmV0RWxlcyA9IFtdO1xuICAgIHZhciBlbGVzID0gdGhpcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlZGdlID0gZWxlc1tpXTtcbiAgICAgIGlmICghZWRnZS5pc0VkZ2UoKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJldEVsZXMucHVzaChlZGdlLnNvdXJjZSgpWzBdKTtcbiAgICAgIHJldEVsZXMucHVzaChlZGdlLnRhcmdldCgpWzBdKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3Bhd24ocmV0RWxlcywgdHJ1ZSkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfSwgJ2Nvbm5lY3RlZE5vZGVzJyksXG4gIHBhcmFsbGVsRWRnZXM6IGNhY2hlKGRlZmluZVBhcmFsbGVsRWRnZXNGdW5jdGlvbigpLCAncGFyYWxsZWxFZGdlcycpLFxuICBjb2RpcmVjdGVkRWRnZXM6IGNhY2hlKGRlZmluZVBhcmFsbGVsRWRnZXNGdW5jdGlvbih7XG4gICAgY29kaXJlY3RlZDogdHJ1ZVxuICB9KSwgJ2NvZGlyZWN0ZWRFZGdlcycpXG59KTtcbmZ1bmN0aW9uIGRlZmluZVBhcmFsbGVsRWRnZXNGdW5jdGlvbihwYXJhbXMpIHtcbiAgdmFyIGRlZmF1bHRzID0ge1xuICAgIGNvZGlyZWN0ZWQ6IGZhbHNlXG4gIH07XG4gIHBhcmFtcyA9IGV4dGVuZCh7fSwgZGVmYXVsdHMsIHBhcmFtcyk7XG4gIHJldHVybiBmdW5jdGlvbiBwYXJhbGxlbEVkZ2VzSW1wbChzZWxlY3Rvcikge1xuICAgIC8vIG1pY3JvLW9wdGltaXNlZCBmb3IgcmVuZGVyZXJcbiAgICB2YXIgZWxlbWVudHMgPSBbXTtcbiAgICB2YXIgZWRnZXMgPSB0aGlzLmVkZ2VzKCk7XG4gICAgdmFyIHAgPSBwYXJhbXM7XG5cbiAgICAvLyBsb29rIGF0IGFsbCB0aGUgZWRnZXMgaW4gdGhlIGNvbGxlY3Rpb25cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVkZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWRnZTEgPSBlZGdlc1tpXTtcbiAgICAgIHZhciBlZGdlMV9wID0gZWRnZTEuX3ByaXZhdGU7XG4gICAgICB2YXIgc3JjMSA9IGVkZ2UxX3Auc291cmNlO1xuICAgICAgdmFyIHNyY2lkMSA9IHNyYzEuX3ByaXZhdGUuZGF0YS5pZDtcbiAgICAgIHZhciB0Z3RpZDEgPSBlZGdlMV9wLmRhdGEudGFyZ2V0O1xuICAgICAgdmFyIHNyY0VkZ2VzMSA9IHNyYzEuX3ByaXZhdGUuZWRnZXM7XG5cbiAgICAgIC8vIGxvb2sgYXQgZWRnZXMgY29ubmVjdGVkIHRvIHRoZSBzcmMgbm9kZSBvZiB0aGlzIGVkZ2VcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgc3JjRWRnZXMxLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBlZGdlMiA9IHNyY0VkZ2VzMVtqXTtcbiAgICAgICAgdmFyIGVkZ2UyZGF0YSA9IGVkZ2UyLl9wcml2YXRlLmRhdGE7XG4gICAgICAgIHZhciB0Z3RpZDIgPSBlZGdlMmRhdGEudGFyZ2V0O1xuICAgICAgICB2YXIgc3JjaWQyID0gZWRnZTJkYXRhLnNvdXJjZTtcbiAgICAgICAgdmFyIGNvZGlyZWN0ZWQgPSB0Z3RpZDIgPT09IHRndGlkMSAmJiBzcmNpZDIgPT09IHNyY2lkMTtcbiAgICAgICAgdmFyIG9wcGRpcmVjdGVkID0gc3JjaWQxID09PSB0Z3RpZDIgJiYgdGd0aWQxID09PSBzcmNpZDI7XG4gICAgICAgIGlmIChwLmNvZGlyZWN0ZWQgJiYgY29kaXJlY3RlZCB8fCAhcC5jb2RpcmVjdGVkICYmIChjb2RpcmVjdGVkIHx8IG9wcGRpcmVjdGVkKSkge1xuICAgICAgICAgIGVsZW1lbnRzLnB1c2goZWRnZTIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNwYXduKGVsZW1lbnRzLCB0cnVlKS5maWx0ZXIoc2VsZWN0b3IpO1xuICB9O1xufVxuXG4vLyBNaXNjIGZ1bmN0aW9uc1xuLy8vLy8vLy8vLy8vLy8vLy9cblxuZXh0ZW5kKGVsZXNmbiQyLCB7XG4gIGNvbXBvbmVudHM6IGZ1bmN0aW9uIGNvbXBvbmVudHMocm9vdCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgY3kgPSBzZWxmLmN5KCk7XG4gICAgdmFyIHZpc2l0ZWQgPSBjeS5jb2xsZWN0aW9uKCk7XG4gICAgdmFyIHVudmlzaXRlZCA9IHJvb3QgPT0gbnVsbCA/IHNlbGYubm9kZXMoKSA6IHJvb3Qubm9kZXMoKTtcbiAgICB2YXIgY29tcG9uZW50cyA9IFtdO1xuICAgIGlmIChyb290ICE9IG51bGwgJiYgdW52aXNpdGVkLmVtcHR5KCkpIHtcbiAgICAgIC8vIHJvb3QgbWF5IGNvbnRhaW4gb25seSBlZGdlc1xuICAgICAgdW52aXNpdGVkID0gcm9vdC5zb3VyY2VzKCk7IC8vIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIG5vZGUgdG8gdXNlICh1bmRpcmVjdGVkKSwgc28ganVzdCB1c2UgdGhlIHNvdXJjZSBzaWRlc1xuICAgIH1cbiAgICB2YXIgdmlzaXRJbkNvbXBvbmVudCA9IGZ1bmN0aW9uIHZpc2l0SW5Db21wb25lbnQobm9kZSwgY29tcG9uZW50KSB7XG4gICAgICB2aXNpdGVkLm1lcmdlKG5vZGUpO1xuICAgICAgdW52aXNpdGVkLnVubWVyZ2Uobm9kZSk7XG4gICAgICBjb21wb25lbnQubWVyZ2Uobm9kZSk7XG4gICAgfTtcbiAgICBpZiAodW52aXNpdGVkLmVtcHR5KCkpIHtcbiAgICAgIHJldHVybiBzZWxmLnNwYXduKCk7XG4gICAgfVxuICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKCkge1xuICAgICAgLy8gZWFjaCBpdGVyYXRpb24geWllbGRzIGEgY29tcG9uZW50XG4gICAgICB2YXIgY21wdCA9IGN5LmNvbGxlY3Rpb24oKTtcbiAgICAgIGNvbXBvbmVudHMucHVzaChjbXB0KTtcbiAgICAgIHZhciByb290ID0gdW52aXNpdGVkWzBdO1xuICAgICAgdmlzaXRJbkNvbXBvbmVudChyb290LCBjbXB0KTtcbiAgICAgIHNlbGYuYmZzKHtcbiAgICAgICAgZGlyZWN0ZWQ6IGZhbHNlLFxuICAgICAgICByb290czogcm9vdCxcbiAgICAgICAgdmlzaXQ6IGZ1bmN0aW9uIHZpc2l0KHYpIHtcbiAgICAgICAgICByZXR1cm4gdmlzaXRJbkNvbXBvbmVudCh2LCBjbXB0KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjbXB0LmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgbm9kZS5jb25uZWN0ZWRFZGdlcygpLmZvckVhY2goZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAvLyBjb25uZWN0ZWRFZGdlcygpIHVzdWFsbHkgY2FjaGVkXG4gICAgICAgICAgaWYgKHNlbGYuaGFzKGUpICYmIGNtcHQuaGFzKGUuc291cmNlKCkpICYmIGNtcHQuaGFzKGUudGFyZ2V0KCkpKSB7XG4gICAgICAgICAgICAvLyBoYXMoKSBpcyBjaGVhcFxuICAgICAgICAgICAgY21wdC5tZXJnZShlKTsgLy8gZm9yRWFjaCgpIG9ubHkgY29uc2lkZXJzIG5vZGVzIC0tIHNldHMgTiBhdCBjYWxsIHRpbWVcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfTtcbiAgICBkbyB7XG4gICAgICBfbG9vcCgpO1xuICAgIH0gd2hpbGUgKHVudmlzaXRlZC5sZW5ndGggPiAwKTtcbiAgICByZXR1cm4gY29tcG9uZW50cztcbiAgfSxcbiAgY29tcG9uZW50OiBmdW5jdGlvbiBjb21wb25lbnQoKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgcmV0dXJuIGVsZS5jeSgpLm11dGFibGVFbGVtZW50cygpLmNvbXBvbmVudHMoZWxlKVswXTtcbiAgfVxufSk7XG5lbGVzZm4kMi5jb21wb25lbnRzT2YgPSBlbGVzZm4kMi5jb21wb25lbnRzO1xuXG4vLyByZXByZXNlbnRzIGEgc2V0IG9mIG5vZGVzLCBlZGdlcywgb3IgYm90aCB0b2dldGhlclxudmFyIENvbGxlY3Rpb24gPSBmdW5jdGlvbiBDb2xsZWN0aW9uKGN5LCBlbGVtZW50cykge1xuICB2YXIgdW5pcXVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTtcbiAgdmFyIHJlbW92ZWQgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IGZhbHNlO1xuICBpZiAoY3kgPT09IHVuZGVmaW5lZCkge1xuICAgIGVycm9yKCdBIGNvbGxlY3Rpb24gbXVzdCBoYXZlIGEgcmVmZXJlbmNlIHRvIHRoZSBjb3JlJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBtYXAgPSBuZXcgTWFwJDEoKTtcbiAgdmFyIGNyZWF0ZWRFbGVtZW50cyA9IGZhbHNlO1xuICBpZiAoIWVsZW1lbnRzKSB7XG4gICAgZWxlbWVudHMgPSBbXTtcbiAgfSBlbHNlIGlmIChlbGVtZW50cy5sZW5ndGggPiAwICYmIHBsYWluT2JqZWN0KGVsZW1lbnRzWzBdKSAmJiAhZWxlbWVudChlbGVtZW50c1swXSkpIHtcbiAgICBjcmVhdGVkRWxlbWVudHMgPSB0cnVlO1xuXG4gICAgLy8gbWFrZSBlbGVtZW50cyBmcm9tIGpzb24gYW5kIHJlc3RvcmUgYWxsIGF0IG9uY2UgbGF0ZXJcbiAgICB2YXIgZWxlcyA9IFtdO1xuICAgIHZhciBlbGVzSWRzID0gbmV3IFNldCQxKCk7XG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBlbGVtZW50cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIHZhciBqc29uID0gZWxlbWVudHNbaV07XG4gICAgICBpZiAoanNvbi5kYXRhID09IG51bGwpIHtcbiAgICAgICAganNvbi5kYXRhID0ge307XG4gICAgICB9XG4gICAgICB2YXIgX2RhdGEgPSBqc29uLmRhdGE7XG5cbiAgICAgIC8vIG1ha2Ugc3VyZSBuZXdseSBjcmVhdGVkIGVsZW1lbnRzIGhhdmUgdmFsaWQgaWRzXG4gICAgICBpZiAoX2RhdGEuaWQgPT0gbnVsbCkge1xuICAgICAgICBfZGF0YS5pZCA9IHV1aWQoKTtcbiAgICAgIH0gZWxzZSBpZiAoY3kuaGFzRWxlbWVudFdpdGhJZChfZGF0YS5pZCkgfHwgZWxlc0lkcy5oYXMoX2RhdGEuaWQpKSB7XG4gICAgICAgIGNvbnRpbnVlOyAvLyBjYW4ndCBjcmVhdGUgZWxlbWVudCBpZiBwcmlvciBpZCBhbHJlYWR5IGV4aXN0c1xuICAgICAgfVxuICAgICAgdmFyIGVsZSA9IG5ldyBFbGVtZW50KGN5LCBqc29uLCBmYWxzZSk7XG4gICAgICBlbGVzLnB1c2goZWxlKTtcbiAgICAgIGVsZXNJZHMuYWRkKF9kYXRhLmlkKTtcbiAgICB9XG4gICAgZWxlbWVudHMgPSBlbGVzO1xuICB9XG4gIHRoaXMubGVuZ3RoID0gMDtcbiAgZm9yICh2YXIgX2kgPSAwLCBfbCA9IGVsZW1lbnRzLmxlbmd0aDsgX2kgPCBfbDsgX2krKykge1xuICAgIHZhciBlbGVtZW50JDEgPSBlbGVtZW50c1tfaV1bMF07IC8vIFswXSBpbiBjYXNlIGVsZW1lbnRzIGlzIGFuIGFycmF5IG9mIGNvbGxlY3Rpb25zLCByYXRoZXIgdGhhbiBhcnJheSBvZiBlbGVtZW50c1xuICAgIGlmIChlbGVtZW50JDEgPT0gbnVsbCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHZhciBpZCA9IGVsZW1lbnQkMS5fcHJpdmF0ZS5kYXRhLmlkO1xuICAgIGlmICghdW5pcXVlIHx8ICFtYXAuaGFzKGlkKSkge1xuICAgICAgaWYgKHVuaXF1ZSkge1xuICAgICAgICBtYXAuc2V0KGlkLCB7XG4gICAgICAgICAgaW5kZXg6IHRoaXMubGVuZ3RoLFxuICAgICAgICAgIGVsZTogZWxlbWVudCQxXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdGhpc1t0aGlzLmxlbmd0aF0gPSBlbGVtZW50JDE7XG4gICAgICB0aGlzLmxlbmd0aCsrO1xuICAgIH1cbiAgfVxuICB0aGlzLl9wcml2YXRlID0ge1xuICAgIGVsZXM6IHRoaXMsXG4gICAgY3k6IGN5LFxuICAgIGdldCBtYXAoKSB7XG4gICAgICBpZiAodGhpcy5sYXp5TWFwID09IG51bGwpIHtcbiAgICAgICAgdGhpcy5yZWJ1aWxkTWFwKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5sYXp5TWFwO1xuICAgIH0sXG4gICAgc2V0IG1hcChtKSB7XG4gICAgICB0aGlzLmxhenlNYXAgPSBtO1xuICAgIH0sXG4gICAgcmVidWlsZE1hcDogZnVuY3Rpb24gcmVidWlsZE1hcCgpIHtcbiAgICAgIHZhciBtID0gdGhpcy5sYXp5TWFwID0gbmV3IE1hcCQxKCk7XG4gICAgICB2YXIgZWxlcyA9IHRoaXMuZWxlcztcbiAgICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IGVsZXMubGVuZ3RoOyBfaTIrKykge1xuICAgICAgICB2YXIgX2VsZSA9IGVsZXNbX2kyXTtcbiAgICAgICAgbS5zZXQoX2VsZS5pZCgpLCB7XG4gICAgICAgICAgaW5kZXg6IF9pMixcbiAgICAgICAgICBlbGU6IF9lbGVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBpZiAodW5pcXVlKSB7XG4gICAgdGhpcy5fcHJpdmF0ZS5tYXAgPSBtYXA7XG4gIH1cblxuICAvLyByZXN0b3JlIHRoZSBlbGVtZW50cyBpZiB3ZSBjcmVhdGVkIHRoZW0gZnJvbSBqc29uXG4gIGlmIChjcmVhdGVkRWxlbWVudHMgJiYgIXJlbW92ZWQpIHtcbiAgICB0aGlzLnJlc3RvcmUoKTtcbiAgfVxufTtcblxuLy8gRnVuY3Rpb25zXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbi8vIGtlZXAgdGhlIHByb3RvdHlwZXMgaW4gc3luYyAoYW4gZWxlbWVudCBoYXMgdGhlIHNhbWUgZnVuY3Rpb25zIGFzIGEgY29sbGVjdGlvbilcbi8vIGFuZCB1c2UgZWxlZm4gYW5kIGVsZXNmbiBhcyBzaG9ydGhhbmRzIHRvIHRoZSBwcm90b3R5cGVzXG52YXIgZWxlc2ZuJDEgPSBFbGVtZW50LnByb3RvdHlwZSA9IENvbGxlY3Rpb24ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShBcnJheS5wcm90b3R5cGUpO1xuZWxlc2ZuJDEuaW5zdGFuY2VTdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAnY29sbGVjdGlvbic7XG59O1xuZWxlc2ZuJDEuc3Bhd24gPSBmdW5jdGlvbiAoZWxlcywgdW5pcXVlKSB7XG4gIHJldHVybiBuZXcgQ29sbGVjdGlvbih0aGlzLmN5KCksIGVsZXMsIHVuaXF1ZSk7XG59O1xuZWxlc2ZuJDEuc3Bhd25TZWxmID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5zcGF3bih0aGlzKTtcbn07XG5lbGVzZm4kMS5jeSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuY3k7XG59O1xuZWxlc2ZuJDEucmVuZGVyZXIgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLl9wcml2YXRlLmN5LnJlbmRlcmVyKCk7XG59O1xuZWxlc2ZuJDEuZWxlbWVudCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXNbMF07XG59O1xuZWxlc2ZuJDEuY29sbGVjdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKGNvbGxlY3Rpb24odGhpcykpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSBlbHNlIHtcbiAgICAvLyBhbiBlbGVtZW50XG4gICAgcmV0dXJuIG5ldyBDb2xsZWN0aW9uKHRoaXMuX3ByaXZhdGUuY3ksIFt0aGlzXSk7XG4gIH1cbn07XG5lbGVzZm4kMS51bmlxdWUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBuZXcgQ29sbGVjdGlvbih0aGlzLl9wcml2YXRlLmN5LCB0aGlzLCB0cnVlKTtcbn07XG5lbGVzZm4kMS5oYXNFbGVtZW50V2l0aElkID0gZnVuY3Rpb24gKGlkKSB7XG4gIGlkID0gJycgKyBpZDsgLy8gaWQgbXVzdCBiZSBzdHJpbmdcblxuICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5tYXAuaGFzKGlkKTtcbn07XG5lbGVzZm4kMS5nZXRFbGVtZW50QnlJZCA9IGZ1bmN0aW9uIChpZCkge1xuICBpZCA9ICcnICsgaWQ7IC8vIGlkIG11c3QgYmUgc3RyaW5nXG5cbiAgdmFyIGN5ID0gdGhpcy5fcHJpdmF0ZS5jeTtcbiAgdmFyIGVudHJ5ID0gdGhpcy5fcHJpdmF0ZS5tYXAuZ2V0KGlkKTtcbiAgcmV0dXJuIGVudHJ5ID8gZW50cnkuZWxlIDogbmV3IENvbGxlY3Rpb24oY3kpOyAvLyBnZXQgZWxlIG9yIGVtcHR5IGNvbGxlY3Rpb25cbn07XG5lbGVzZm4kMS4kaWQgPSBlbGVzZm4kMS5nZXRFbGVtZW50QnlJZDtcbmVsZXNmbiQxLnBvb2xJbmRleCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGN5ID0gdGhpcy5fcHJpdmF0ZS5jeTtcbiAgdmFyIGVsZXMgPSBjeS5fcHJpdmF0ZS5lbGVtZW50cztcbiAgdmFyIGlkID0gdGhpc1swXS5fcHJpdmF0ZS5kYXRhLmlkO1xuICByZXR1cm4gZWxlcy5fcHJpdmF0ZS5tYXAuZ2V0KGlkKS5pbmRleDtcbn07XG5lbGVzZm4kMS5pbmRleE9mID0gZnVuY3Rpb24gKGVsZSkge1xuICB2YXIgaWQgPSBlbGVbMF0uX3ByaXZhdGUuZGF0YS5pZDtcbiAgcmV0dXJuIHRoaXMuX3ByaXZhdGUubWFwLmdldChpZCkuaW5kZXg7XG59O1xuZWxlc2ZuJDEuaW5kZXhPZklkID0gZnVuY3Rpb24gKGlkKSB7XG4gIGlkID0gJycgKyBpZDsgLy8gaWQgbXVzdCBiZSBzdHJpbmdcblxuICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5tYXAuZ2V0KGlkKS5pbmRleDtcbn07XG5lbGVzZm4kMS5qc29uID0gZnVuY3Rpb24gKG9iaikge1xuICB2YXIgZWxlID0gdGhpcy5lbGVtZW50KCk7XG4gIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgaWYgKGVsZSA9PSBudWxsICYmIG9iaikge1xuICAgIHJldHVybiB0aGlzO1xuICB9IC8vIGNhbid0IHNldCB0byBubyBlbGVzXG5cbiAgaWYgKGVsZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfSAvLyBjYW4ndCBnZXQgZnJvbSBubyBlbGVzXG5cbiAgdmFyIHAgPSBlbGUuX3ByaXZhdGU7XG4gIGlmIChwbGFpbk9iamVjdChvYmopKSB7XG4gICAgLy8gc2V0XG5cbiAgICBjeS5zdGFydEJhdGNoKCk7XG4gICAgaWYgKG9iai5kYXRhKSB7XG4gICAgICBlbGUuZGF0YShvYmouZGF0YSk7XG4gICAgICB2YXIgX2RhdGEyID0gcC5kYXRhO1xuICAgICAgaWYgKGVsZS5pc0VkZ2UoKSkge1xuICAgICAgICAvLyBzb3VyY2UgYW5kIHRhcmdldCBhcmUgaW1tdXRhYmxlIHZpYSBkYXRhKClcbiAgICAgICAgdmFyIG1vdmUgPSBmYWxzZTtcbiAgICAgICAgdmFyIHNwZWMgPSB7fTtcbiAgICAgICAgdmFyIHNyYyA9IG9iai5kYXRhLnNvdXJjZTtcbiAgICAgICAgdmFyIHRndCA9IG9iai5kYXRhLnRhcmdldDtcbiAgICAgICAgaWYgKHNyYyAhPSBudWxsICYmIHNyYyAhPSBfZGF0YTIuc291cmNlKSB7XG4gICAgICAgICAgc3BlYy5zb3VyY2UgPSAnJyArIHNyYzsgLy8gaWQgbXVzdCBiZSBzdHJpbmdcbiAgICAgICAgICBtb3ZlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGd0ICE9IG51bGwgJiYgdGd0ICE9IF9kYXRhMi50YXJnZXQpIHtcbiAgICAgICAgICBzcGVjLnRhcmdldCA9ICcnICsgdGd0OyAvLyBpZCBtdXN0IGJlIHN0cmluZ1xuICAgICAgICAgIG1vdmUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtb3ZlKSB7XG4gICAgICAgICAgZWxlID0gZWxlLm1vdmUoc3BlYyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHBhcmVudCBpcyBpbW11dGFibGUgdmlhIGRhdGEoKVxuICAgICAgICB2YXIgbmV3UGFyZW50VmFsU3BlY2QgPSAncGFyZW50JyBpbiBvYmouZGF0YTtcbiAgICAgICAgdmFyIHBhcmVudCA9IG9iai5kYXRhLnBhcmVudDtcbiAgICAgICAgaWYgKG5ld1BhcmVudFZhbFNwZWNkICYmIChwYXJlbnQgIT0gbnVsbCB8fCBfZGF0YTIucGFyZW50ICE9IG51bGwpICYmIHBhcmVudCAhPSBfZGF0YTIucGFyZW50KSB7XG4gICAgICAgICAgaWYgKHBhcmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBjYW4ndCBzZXQgdW5kZWZpbmVkIGltcGVyYXRpdmVseSwgc28gdXNlIG51bGxcbiAgICAgICAgICAgIHBhcmVudCA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgcGFyZW50ID0gJycgKyBwYXJlbnQ7IC8vIGlkIG11c3QgYmUgc3RyaW5nXG4gICAgICAgICAgfVxuICAgICAgICAgIGVsZSA9IGVsZS5tb3ZlKHtcbiAgICAgICAgICAgIHBhcmVudDogcGFyZW50XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG9iai5wb3NpdGlvbikge1xuICAgICAgZWxlLnBvc2l0aW9uKG9iai5wb3NpdGlvbik7XG4gICAgfVxuXG4gICAgLy8gaWdub3JlIGdyb3VwIC0tIGltbXV0YWJsZVxuXG4gICAgdmFyIGNoZWNrU3dpdGNoID0gZnVuY3Rpb24gY2hlY2tTd2l0Y2goaywgdHJ1ZUZuTmFtZSwgZmFsc2VGbk5hbWUpIHtcbiAgICAgIHZhciBvYmpfayA9IG9ialtrXTtcbiAgICAgIGlmIChvYmpfayAhPSBudWxsICYmIG9ial9rICE9PSBwW2tdKSB7XG4gICAgICAgIGlmIChvYmpfaykge1xuICAgICAgICAgIGVsZVt0cnVlRm5OYW1lXSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVsZVtmYWxzZUZuTmFtZV0oKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgY2hlY2tTd2l0Y2goJ3JlbW92ZWQnLCAncmVtb3ZlJywgJ3Jlc3RvcmUnKTtcbiAgICBjaGVja1N3aXRjaCgnc2VsZWN0ZWQnLCAnc2VsZWN0JywgJ3Vuc2VsZWN0Jyk7XG4gICAgY2hlY2tTd2l0Y2goJ3NlbGVjdGFibGUnLCAnc2VsZWN0aWZ5JywgJ3Vuc2VsZWN0aWZ5Jyk7XG4gICAgY2hlY2tTd2l0Y2goJ2xvY2tlZCcsICdsb2NrJywgJ3VubG9jaycpO1xuICAgIGNoZWNrU3dpdGNoKCdncmFiYmFibGUnLCAnZ3JhYmlmeScsICd1bmdyYWJpZnknKTtcbiAgICBjaGVja1N3aXRjaCgncGFubmFibGUnLCAncGFuaWZ5JywgJ3VucGFuaWZ5Jyk7XG4gICAgaWYgKG9iai5jbGFzc2VzICE9IG51bGwpIHtcbiAgICAgIGVsZS5jbGFzc2VzKG9iai5jbGFzc2VzKTtcbiAgICB9XG4gICAgY3kuZW5kQmF0Y2goKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSBlbHNlIGlmIChvYmogPT09IHVuZGVmaW5lZCkge1xuICAgIC8vIGdldFxuXG4gICAgdmFyIGpzb24gPSB7XG4gICAgICBkYXRhOiBjb3B5KHAuZGF0YSksXG4gICAgICBwb3NpdGlvbjogY29weShwLnBvc2l0aW9uKSxcbiAgICAgIGdyb3VwOiBwLmdyb3VwLFxuICAgICAgcmVtb3ZlZDogcC5yZW1vdmVkLFxuICAgICAgc2VsZWN0ZWQ6IHAuc2VsZWN0ZWQsXG4gICAgICBzZWxlY3RhYmxlOiBwLnNlbGVjdGFibGUsXG4gICAgICBsb2NrZWQ6IHAubG9ja2VkLFxuICAgICAgZ3JhYmJhYmxlOiBwLmdyYWJiYWJsZSxcbiAgICAgIHBhbm5hYmxlOiBwLnBhbm5hYmxlLFxuICAgICAgY2xhc3NlczogbnVsbFxuICAgIH07XG4gICAganNvbi5jbGFzc2VzID0gJyc7XG4gICAgdmFyIGkgPSAwO1xuICAgIHAuY2xhc3Nlcy5mb3JFYWNoKGZ1bmN0aW9uIChjbHMpIHtcbiAgICAgIHJldHVybiBqc29uLmNsYXNzZXMgKz0gaSsrID09PSAwID8gY2xzIDogJyAnICsgY2xzO1xuICAgIH0pO1xuICAgIHJldHVybiBqc29uO1xuICB9XG59O1xuZWxlc2ZuJDEuanNvbnMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBqc29ucyA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICB2YXIganNvbiA9IGVsZS5qc29uKCk7XG4gICAganNvbnMucHVzaChqc29uKTtcbiAgfVxuICByZXR1cm4ganNvbnM7XG59O1xuZWxlc2ZuJDEuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgdmFyIGVsZXNBcnIgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbaV07XG4gICAgdmFyIGpzb24gPSBlbGUuanNvbigpO1xuICAgIHZhciBjbG9uZSA9IG5ldyBFbGVtZW50KGN5LCBqc29uLCBmYWxzZSk7IC8vIE5CIG5vIHJlc3RvcmVcblxuICAgIGVsZXNBcnIucHVzaChjbG9uZSk7XG4gIH1cbiAgcmV0dXJuIG5ldyBDb2xsZWN0aW9uKGN5LCBlbGVzQXJyKTtcbn07XG5lbGVzZm4kMS5jb3B5ID0gZWxlc2ZuJDEuY2xvbmU7XG5lbGVzZm4kMS5yZXN0b3JlID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbm90aWZ5UmVuZGVyZXIgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHRydWU7XG4gIHZhciBhZGRUb1Bvb2wgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHRydWU7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGN5ID0gc2VsZi5jeSgpO1xuICB2YXIgY3lfcCA9IGN5Ll9wcml2YXRlO1xuXG4gIC8vIGNyZWF0ZSBhcnJheXMgb2Ygbm9kZXMgYW5kIGVkZ2VzLCBzaW5jZSB3ZSBuZWVkIHRvXG4gIC8vIHJlc3RvcmUgdGhlIG5vZGVzIGZpcnN0XG4gIHZhciBub2RlcyA9IFtdO1xuICB2YXIgZWRnZXMgPSBbXTtcbiAgdmFyIGVsZW1lbnRzO1xuICBmb3IgKHZhciBfaTMgPSAwLCBsID0gc2VsZi5sZW5ndGg7IF9pMyA8IGw7IF9pMysrKSB7XG4gICAgdmFyIGVsZSA9IHNlbGZbX2kzXTtcbiAgICBpZiAoYWRkVG9Qb29sICYmICFlbGUucmVtb3ZlZCgpKSB7XG4gICAgICAvLyBkb24ndCBuZWVkIHRvIGhhbmRsZSB0aGlzIGVsZVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8ga2VlcCBub2RlcyBmaXJzdCBpbiB0aGUgYXJyYXkgYW5kIGVkZ2VzIGFmdGVyXG4gICAgaWYgKGVsZS5pc05vZGUoKSkge1xuICAgICAgLy8gcHV0IHRvIGZyb250IG9mIGFycmF5IGlmIG5vZGVcbiAgICAgIG5vZGVzLnB1c2goZWxlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gcHV0IHRvIGVuZCBvZiBhcnJheSBpZiBlZGdlXG4gICAgICBlZGdlcy5wdXNoKGVsZSk7XG4gICAgfVxuICB9XG4gIGVsZW1lbnRzID0gbm9kZXMuY29uY2F0KGVkZ2VzKTtcbiAgdmFyIGk7XG4gIHZhciByZW1vdmVGcm9tRWxlbWVudHMgPSBmdW5jdGlvbiByZW1vdmVGcm9tRWxlbWVudHMoKSB7XG4gICAgZWxlbWVudHMuc3BsaWNlKGksIDEpO1xuICAgIGktLTtcbiAgfTtcblxuICAvLyBub3csIHJlc3RvcmUgZWFjaCBlbGVtZW50XG4gIGZvciAoaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBfZWxlMiA9IGVsZW1lbnRzW2ldO1xuICAgIHZhciBfcHJpdmF0ZSA9IF9lbGUyLl9wcml2YXRlO1xuICAgIHZhciBfZGF0YTMgPSBfcHJpdmF0ZS5kYXRhO1xuXG4gICAgLy8gdGhlIHRyYXZlcnNhbCBjYWNoZSBzaG91bGQgc3RhcnQgZnJlc2ggd2hlbiBlbGUgaXMgYWRkZWRcbiAgICBfZWxlMi5jbGVhclRyYXZlcnNhbENhY2hlKCk7XG5cbiAgICAvLyBzZXQgaWQgYW5kIHZhbGlkYXRlXG4gICAgaWYgKCFhZGRUb1Bvb2wgJiYgIV9wcml2YXRlLnJlbW92ZWQpIDsgZWxzZSBpZiAoX2RhdGEzLmlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIF9kYXRhMy5pZCA9IHV1aWQoKTtcbiAgICB9IGVsc2UgaWYgKG51bWJlciQxKF9kYXRhMy5pZCkpIHtcbiAgICAgIF9kYXRhMy5pZCA9ICcnICsgX2RhdGEzLmlkOyAvLyBub3cgaXQncyBhIHN0cmluZ1xuICAgIH0gZWxzZSBpZiAoZW1wdHlTdHJpbmcoX2RhdGEzLmlkKSB8fCAhc3RyaW5nKF9kYXRhMy5pZCkpIHtcbiAgICAgIGVycm9yKCdDYW4gbm90IGNyZWF0ZSBlbGVtZW50IHdpdGggaW52YWxpZCBzdHJpbmcgSUQgYCcgKyBfZGF0YTMuaWQgKyAnYCcpO1xuXG4gICAgICAvLyBjYW4ndCBjcmVhdGUgZWxlbWVudCBpZiBpdCBoYXMgZW1wdHkgc3RyaW5nIGFzIGlkIG9yIG5vbi1zdHJpbmcgaWRcbiAgICAgIHJlbW92ZUZyb21FbGVtZW50cygpO1xuICAgICAgY29udGludWU7XG4gICAgfSBlbHNlIGlmIChjeS5oYXNFbGVtZW50V2l0aElkKF9kYXRhMy5pZCkpIHtcbiAgICAgIGVycm9yKCdDYW4gbm90IGNyZWF0ZSBzZWNvbmQgZWxlbWVudCB3aXRoIElEIGAnICsgX2RhdGEzLmlkICsgJ2AnKTtcblxuICAgICAgLy8gY2FuJ3QgY3JlYXRlIGVsZW1lbnQgaWYgb25lIGFscmVhZHkgaGFzIHRoYXQgaWRcbiAgICAgIHJlbW92ZUZyb21FbGVtZW50cygpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHZhciBpZCA9IF9kYXRhMy5pZDsgLy8gaWQgaXMgZmluYWxpc2VkLCBub3cgbGV0J3Mga2VlcCBhIHJlZlxuXG4gICAgaWYgKF9lbGUyLmlzTm9kZSgpKSB7XG4gICAgICAvLyBleHRyYSBjaGVja3MgZm9yIG5vZGVzXG4gICAgICB2YXIgcG9zID0gX3ByaXZhdGUucG9zaXRpb247XG5cbiAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgbm9kZXMgaGF2ZSBhIGRlZmluZWQgcG9zaXRpb25cblxuICAgICAgaWYgKHBvcy54ID09IG51bGwpIHtcbiAgICAgICAgcG9zLnggPSAwO1xuICAgICAgfVxuICAgICAgaWYgKHBvcy55ID09IG51bGwpIHtcbiAgICAgICAgcG9zLnkgPSAwO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoX2VsZTIuaXNFZGdlKCkpIHtcbiAgICAgIC8vIGV4dHJhIGNoZWNrcyBmb3IgZWRnZXNcblxuICAgICAgdmFyIGVkZ2UgPSBfZWxlMjtcbiAgICAgIHZhciBmaWVsZHMgPSBbJ3NvdXJjZScsICd0YXJnZXQnXTtcbiAgICAgIHZhciBmaWVsZHNMZW5ndGggPSBmaWVsZHMubGVuZ3RoO1xuICAgICAgdmFyIGJhZFNvdXJjZU9yVGFyZ2V0ID0gZmFsc2U7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGZpZWxkc0xlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBmaWVsZCA9IGZpZWxkc1tqXTtcbiAgICAgICAgdmFyIHZhbCA9IF9kYXRhM1tmaWVsZF07XG4gICAgICAgIGlmIChudW1iZXIkMSh2YWwpKSB7XG4gICAgICAgICAgdmFsID0gX2RhdGEzW2ZpZWxkXSA9ICcnICsgX2RhdGEzW2ZpZWxkXTsgLy8gbm93IHN0cmluZ1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWwgPT0gbnVsbCB8fCB2YWwgPT09ICcnKSB7XG4gICAgICAgICAgLy8gY2FuJ3QgY3JlYXRlIGlmIHNvdXJjZSBvciB0YXJnZXQgaXMgbm90IGRlZmluZWQgcHJvcGVybHlcbiAgICAgICAgICBlcnJvcignQ2FuIG5vdCBjcmVhdGUgZWRnZSBgJyArIGlkICsgJ2Agd2l0aCB1bnNwZWNpZmllZCAnICsgZmllbGQpO1xuICAgICAgICAgIGJhZFNvdXJjZU9yVGFyZ2V0ID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmICghY3kuaGFzRWxlbWVudFdpdGhJZCh2YWwpKSB7XG4gICAgICAgICAgLy8gY2FuJ3QgY3JlYXRlIGVkZ2UgaWYgb25lIG9mIGl0cyBub2RlcyBkb2Vzbid0IGV4aXN0XG4gICAgICAgICAgZXJyb3IoJ0NhbiBub3QgY3JlYXRlIGVkZ2UgYCcgKyBpZCArICdgIHdpdGggbm9uZXhpc3RlbnQgJyArIGZpZWxkICsgJyBgJyArIHZhbCArICdgJyk7XG4gICAgICAgICAgYmFkU291cmNlT3JUYXJnZXQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoYmFkU291cmNlT3JUYXJnZXQpIHtcbiAgICAgICAgcmVtb3ZlRnJvbUVsZW1lbnRzKCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSAvLyBjYW4ndCBjcmVhdGUgdGhpc1xuXG4gICAgICB2YXIgc3JjID0gY3kuZ2V0RWxlbWVudEJ5SWQoX2RhdGEzLnNvdXJjZSk7XG4gICAgICB2YXIgdGd0ID0gY3kuZ2V0RWxlbWVudEJ5SWQoX2RhdGEzLnRhcmdldCk7XG5cbiAgICAgIC8vIG9ubHkgb25lIGVkZ2UgaW4gbm9kZSBpZiBsb29wXG4gICAgICBpZiAoc3JjLnNhbWUodGd0KSkge1xuICAgICAgICBzcmMuX3ByaXZhdGUuZWRnZXMucHVzaChlZGdlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNyYy5fcHJpdmF0ZS5lZGdlcy5wdXNoKGVkZ2UpO1xuICAgICAgICB0Z3QuX3ByaXZhdGUuZWRnZXMucHVzaChlZGdlKTtcbiAgICAgIH1cbiAgICAgIGVkZ2UuX3ByaXZhdGUuc291cmNlID0gc3JjO1xuICAgICAgZWRnZS5fcHJpdmF0ZS50YXJnZXQgPSB0Z3Q7XG4gICAgfSAvLyBpZiBpcyBlZGdlXG5cbiAgICAvLyBjcmVhdGUgbW9jayBpZHMgLyBpbmRleGVzIG1hcHMgZm9yIGVsZW1lbnQgc28gaXQgY2FuIGJlIHVzZWQgbGlrZSBjb2xsZWN0aW9uc1xuICAgIF9wcml2YXRlLm1hcCA9IG5ldyBNYXAkMSgpO1xuICAgIF9wcml2YXRlLm1hcC5zZXQoaWQsIHtcbiAgICAgIGVsZTogX2VsZTIsXG4gICAgICBpbmRleDogMFxuICAgIH0pO1xuICAgIF9wcml2YXRlLnJlbW92ZWQgPSBmYWxzZTtcbiAgICBpZiAoYWRkVG9Qb29sKSB7XG4gICAgICBjeS5hZGRUb1Bvb2woX2VsZTIpO1xuICAgIH1cbiAgfSAvLyBmb3IgZWFjaCBlbGVtZW50XG5cbiAgLy8gZG8gY29tcG91bmQgbm9kZSBzYW5pdHkgY2hlY2tzXG4gIGZvciAodmFyIF9pNCA9IDA7IF9pNCA8IG5vZGVzLmxlbmd0aDsgX2k0KyspIHtcbiAgICAvLyBlYWNoIG5vZGVcbiAgICB2YXIgbm9kZSA9IG5vZGVzW19pNF07XG4gICAgdmFyIF9kYXRhNCA9IG5vZGUuX3ByaXZhdGUuZGF0YTtcbiAgICBpZiAobnVtYmVyJDEoX2RhdGE0LnBhcmVudCkpIHtcbiAgICAgIC8vIHRoZW4gYXV0b21ha2Ugc3RyaW5nXG4gICAgICBfZGF0YTQucGFyZW50ID0gJycgKyBfZGF0YTQucGFyZW50O1xuICAgIH1cbiAgICB2YXIgcGFyZW50SWQgPSBfZGF0YTQucGFyZW50O1xuICAgIHZhciBzcGVjaWZpZWRQYXJlbnQgPSBwYXJlbnRJZCAhPSBudWxsO1xuICAgIGlmIChzcGVjaWZpZWRQYXJlbnQgfHwgbm9kZS5fcHJpdmF0ZS5wYXJlbnQpIHtcbiAgICAgIHZhciBwYXJlbnQgPSBub2RlLl9wcml2YXRlLnBhcmVudCA/IGN5LmNvbGxlY3Rpb24oKS5tZXJnZShub2RlLl9wcml2YXRlLnBhcmVudCkgOiBjeS5nZXRFbGVtZW50QnlJZChwYXJlbnRJZCk7XG4gICAgICBpZiAocGFyZW50LmVtcHR5KCkpIHtcbiAgICAgICAgLy8gbm9uLWV4aXN0YW50IHBhcmVudDsganVzdCByZW1vdmUgaXRcbiAgICAgICAgX2RhdGE0LnBhcmVudCA9IHVuZGVmaW5lZDtcbiAgICAgIH0gZWxzZSBpZiAocGFyZW50WzBdLnJlbW92ZWQoKSkge1xuICAgICAgICB3YXJuKCdOb2RlIGFkZGVkIHdpdGggbWlzc2luZyBwYXJlbnQsIHJlZmVyZW5jZSB0byBwYXJlbnQgcmVtb3ZlZCcpO1xuICAgICAgICBfZGF0YTQucGFyZW50ID0gdW5kZWZpbmVkO1xuICAgICAgICBub2RlLl9wcml2YXRlLnBhcmVudCA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgc2VsZkFzUGFyZW50ID0gZmFsc2U7XG4gICAgICAgIHZhciBhbmNlc3RvciA9IHBhcmVudDtcbiAgICAgICAgd2hpbGUgKCFhbmNlc3Rvci5lbXB0eSgpKSB7XG4gICAgICAgICAgaWYgKG5vZGUuc2FtZShhbmNlc3RvcikpIHtcbiAgICAgICAgICAgIC8vIG1hcmsgc2VsZiBhcyBwYXJlbnQgYW5kIHJlbW92ZSBmcm9tIGRhdGFcbiAgICAgICAgICAgIHNlbGZBc1BhcmVudCA9IHRydWU7XG4gICAgICAgICAgICBfZGF0YTQucGFyZW50ID0gdW5kZWZpbmVkOyAvLyByZW1vdmUgcGFyZW50IHJlZmVyZW5jZVxuXG4gICAgICAgICAgICAvLyBleGl0IG9yIHdlIGxvb3AgZm9yZXZlclxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFuY2VzdG9yID0gYW5jZXN0b3IucGFyZW50KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzZWxmQXNQYXJlbnQpIHtcbiAgICAgICAgICAvLyBjb25uZWN0IHdpdGggY2hpbGRyZW5cbiAgICAgICAgICBwYXJlbnRbMF0uX3ByaXZhdGUuY2hpbGRyZW4ucHVzaChub2RlKTtcbiAgICAgICAgICBub2RlLl9wcml2YXRlLnBhcmVudCA9IHBhcmVudFswXTtcblxuICAgICAgICAgIC8vIGxldCB0aGUgY29yZSBrbm93IHdlIGhhdmUgYSBjb21wb3VuZCBncmFwaFxuICAgICAgICAgIGN5X3AuaGFzQ29tcG91bmROb2RlcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gZWxzZVxuICAgIH0gLy8gaWYgc3BlY2lmaWVkIHBhcmVudFxuICB9IC8vIGZvciBlYWNoIG5vZGVcblxuICBpZiAoZWxlbWVudHMubGVuZ3RoID4gMCkge1xuICAgIHZhciByZXN0b3JlZCA9IGVsZW1lbnRzLmxlbmd0aCA9PT0gc2VsZi5sZW5ndGggPyBzZWxmIDogbmV3IENvbGxlY3Rpb24oY3ksIGVsZW1lbnRzKTtcbiAgICBmb3IgKHZhciBfaTUgPSAwOyBfaTUgPCByZXN0b3JlZC5sZW5ndGg7IF9pNSsrKSB7XG4gICAgICB2YXIgX2VsZTMgPSByZXN0b3JlZFtfaTVdO1xuICAgICAgaWYgKF9lbGUzLmlzTm9kZSgpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBhZGRpbmcgYW4gZWRnZSBpbnZhbGlkYXRlcyB0aGUgdHJhdmVyc2FsIGNhY2hlcyBmb3IgdGhlIHBhcmFsbGVsIGVkZ2VzXG4gICAgICBfZWxlMy5wYXJhbGxlbEVkZ2VzKCkuY2xlYXJUcmF2ZXJzYWxDYWNoZSgpO1xuXG4gICAgICAvLyBhZGRpbmcgYW4gZWRnZSBpbnZhbGlkYXRlcyB0aGUgdHJhdmVyc2FsIGNhY2hlIGZvciB0aGUgY29ubmVjdGVkIG5vZGVzXG4gICAgICBfZWxlMy5zb3VyY2UoKS5jbGVhclRyYXZlcnNhbENhY2hlKCk7XG4gICAgICBfZWxlMy50YXJnZXQoKS5jbGVhclRyYXZlcnNhbENhY2hlKCk7XG4gICAgfVxuICAgIHZhciB0b1VwZGF0ZVN0eWxlO1xuICAgIGlmIChjeV9wLmhhc0NvbXBvdW5kTm9kZXMpIHtcbiAgICAgIHRvVXBkYXRlU3R5bGUgPSBjeS5jb2xsZWN0aW9uKCkubWVyZ2UocmVzdG9yZWQpLm1lcmdlKHJlc3RvcmVkLmNvbm5lY3RlZE5vZGVzKCkpLm1lcmdlKHJlc3RvcmVkLnBhcmVudCgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdG9VcGRhdGVTdHlsZSA9IHJlc3RvcmVkO1xuICAgIH1cbiAgICB0b1VwZGF0ZVN0eWxlLmRpcnR5Q29tcG91bmRCb3VuZHNDYWNoZSgpLmRpcnR5Qm91bmRpbmdCb3hDYWNoZSgpLnVwZGF0ZVN0eWxlKG5vdGlmeVJlbmRlcmVyKTtcbiAgICBpZiAobm90aWZ5UmVuZGVyZXIpIHtcbiAgICAgIHJlc3RvcmVkLmVtaXRBbmROb3RpZnkoJ2FkZCcpO1xuICAgIH0gZWxzZSBpZiAoYWRkVG9Qb29sKSB7XG4gICAgICByZXN0b3JlZC5lbWl0KCdhZGQnKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNlbGY7IC8vIGNoYWluYWJpbGl0eVxufTtcbmVsZXNmbiQxLnJlbW92ZWQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBlbGUgPSB0aGlzWzBdO1xuICByZXR1cm4gZWxlICYmIGVsZS5fcHJpdmF0ZS5yZW1vdmVkO1xufTtcbmVsZXNmbiQxLmluc2lkZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGVsZSA9IHRoaXNbMF07XG4gIHJldHVybiBlbGUgJiYgIWVsZS5fcHJpdmF0ZS5yZW1vdmVkO1xufTtcbmVsZXNmbiQxLnJlbW92ZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIG5vdGlmeVJlbmRlcmVyID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB0cnVlO1xuICB2YXIgcmVtb3ZlRnJvbVBvb2wgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHRydWU7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGVsZXNUb1JlbW92ZSA9IFtdO1xuICB2YXIgZWxlc1RvUmVtb3ZlSWRzID0ge307XG4gIHZhciBjeSA9IHNlbGYuX3ByaXZhdGUuY3k7XG5cbiAgLy8gYWRkIGNvbm5lY3RlZCBlZGdlc1xuICBmdW5jdGlvbiBhZGRDb25uZWN0ZWRFZGdlcyhub2RlKSB7XG4gICAgdmFyIGVkZ2VzID0gbm9kZS5fcHJpdmF0ZS5lZGdlcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVkZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhZGQoZWRnZXNbaV0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIGFkZCBkZXNjZW5kYW50IG5vZGVzXG4gIGZ1bmN0aW9uIGFkZENoaWxkcmVuKG5vZGUpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBub2RlLl9wcml2YXRlLmNoaWxkcmVuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGFkZChjaGlsZHJlbltpXSk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGFkZChlbGUpIHtcbiAgICB2YXIgYWxyZWFkeUFkZGVkID0gZWxlc1RvUmVtb3ZlSWRzW2VsZS5pZCgpXTtcbiAgICBpZiAocmVtb3ZlRnJvbVBvb2wgJiYgZWxlLnJlbW92ZWQoKSB8fCBhbHJlYWR5QWRkZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlc1RvUmVtb3ZlSWRzW2VsZS5pZCgpXSA9IHRydWU7XG4gICAgfVxuICAgIGlmIChlbGUuaXNOb2RlKCkpIHtcbiAgICAgIGVsZXNUb1JlbW92ZS5wdXNoKGVsZSk7IC8vIG5vZGVzIGFyZSByZW1vdmVkIGxhc3RcblxuICAgICAgYWRkQ29ubmVjdGVkRWRnZXMoZWxlKTtcbiAgICAgIGFkZENoaWxkcmVuKGVsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZXNUb1JlbW92ZS51bnNoaWZ0KGVsZSk7IC8vIGVkZ2VzIGFyZSByZW1vdmVkIGZpcnN0XG4gICAgfVxuICB9XG5cbiAgLy8gbWFrZSB0aGUgbGlzdCBvZiBlbGVtZW50cyB0byByZW1vdmVcbiAgLy8gKG1heSBiZSByZW1vdmluZyBtb3JlIHRoYW4gc3BlY2lmaWVkIGR1ZSB0byBjb25uZWN0ZWQgZWRnZXMgZXRjKVxuXG4gIGZvciAodmFyIGkgPSAwLCBsID0gc2VsZi5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICB2YXIgZWxlID0gc2VsZltpXTtcbiAgICBhZGQoZWxlKTtcbiAgfVxuICBmdW5jdGlvbiByZW1vdmVFZGdlUmVmKG5vZGUsIGVkZ2UpIHtcbiAgICB2YXIgY29ubmVjdGVkRWRnZXMgPSBub2RlLl9wcml2YXRlLmVkZ2VzO1xuICAgIHJlbW92ZUZyb21BcnJheShjb25uZWN0ZWRFZGdlcywgZWRnZSk7XG5cbiAgICAvLyByZW1vdmluZyBhbiBlZGdlcyBpbnZhbGlkYXRlcyB0aGUgdHJhdmVyc2FsIGNhY2hlIGZvciBpdHMgbm9kZXNcbiAgICBub2RlLmNsZWFyVHJhdmVyc2FsQ2FjaGUoKTtcbiAgfVxuICBmdW5jdGlvbiByZW1vdmVQYXJhbGxlbFJlZihwbGxFZGdlKSB7XG4gICAgLy8gcmVtb3ZpbmcgYW4gZWRnZSBpbnZhbGlkYXRlcyB0aGUgdHJhdmVyc2FsIGNhY2hlcyBmb3IgdGhlIHBhcmFsbGVsIGVkZ2VzXG4gICAgcGxsRWRnZS5jbGVhclRyYXZlcnNhbENhY2hlKCk7XG4gIH1cbiAgdmFyIGFsdGVyZWRQYXJlbnRzID0gW107XG4gIGFsdGVyZWRQYXJlbnRzLmlkcyA9IHt9O1xuICBmdW5jdGlvbiByZW1vdmVDaGlsZFJlZihwYXJlbnQsIGVsZSkge1xuICAgIGVsZSA9IGVsZVswXTtcbiAgICBwYXJlbnQgPSBwYXJlbnRbMF07XG4gICAgdmFyIGNoaWxkcmVuID0gcGFyZW50Ll9wcml2YXRlLmNoaWxkcmVuO1xuICAgIHZhciBwaWQgPSBwYXJlbnQuaWQoKTtcbiAgICByZW1vdmVGcm9tQXJyYXkoY2hpbGRyZW4sIGVsZSk7IC8vIHJlbW92ZSBwYXJlbnQgPT4gY2hpbGQgcmVmXG5cbiAgICBlbGUuX3ByaXZhdGUucGFyZW50ID0gbnVsbDsgLy8gcmVtb3ZlIGNoaWxkID0+IHBhcmVudCByZWZcblxuICAgIGlmICghYWx0ZXJlZFBhcmVudHMuaWRzW3BpZF0pIHtcbiAgICAgIGFsdGVyZWRQYXJlbnRzLmlkc1twaWRdID0gdHJ1ZTtcbiAgICAgIGFsdGVyZWRQYXJlbnRzLnB1c2gocGFyZW50KTtcbiAgICB9XG4gIH1cbiAgc2VsZi5kaXJ0eUNvbXBvdW5kQm91bmRzQ2FjaGUoKTtcbiAgaWYgKHJlbW92ZUZyb21Qb29sKSB7XG4gICAgY3kucmVtb3ZlRnJvbVBvb2woZWxlc1RvUmVtb3ZlKTsgLy8gcmVtb3ZlIGZyb20gY29yZSBwb29sXG4gIH1cbiAgZm9yICh2YXIgX2k2ID0gMDsgX2k2IDwgZWxlc1RvUmVtb3ZlLmxlbmd0aDsgX2k2KyspIHtcbiAgICB2YXIgX2VsZTQgPSBlbGVzVG9SZW1vdmVbX2k2XTtcbiAgICBpZiAoX2VsZTQuaXNFZGdlKCkpIHtcbiAgICAgIC8vIHJlbW92ZSByZWZlcmVuY2VzIHRvIHRoaXMgZWRnZSBpbiBpdHMgY29ubmVjdGVkIG5vZGVzXG4gICAgICB2YXIgc3JjID0gX2VsZTQuc291cmNlKClbMF07XG4gICAgICB2YXIgdGd0ID0gX2VsZTQudGFyZ2V0KClbMF07XG4gICAgICByZW1vdmVFZGdlUmVmKHNyYywgX2VsZTQpO1xuICAgICAgcmVtb3ZlRWRnZVJlZih0Z3QsIF9lbGU0KTtcbiAgICAgIHZhciBwbGxFZGdlcyA9IF9lbGU0LnBhcmFsbGVsRWRnZXMoKTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcGxsRWRnZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIHBsbEVkZ2UgPSBwbGxFZGdlc1tqXTtcbiAgICAgICAgcmVtb3ZlUGFyYWxsZWxSZWYocGxsRWRnZSk7XG4gICAgICAgIGlmIChwbGxFZGdlLmlzQnVuZGxlZEJlemllcigpKSB7XG4gICAgICAgICAgcGxsRWRnZS5kaXJ0eUJvdW5kaW5nQm94Q2FjaGUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyByZW1vdmUgcmVmZXJlbmNlIHRvIHBhcmVudFxuICAgICAgdmFyIHBhcmVudCA9IF9lbGU0LnBhcmVudCgpO1xuICAgICAgaWYgKHBhcmVudC5sZW5ndGggIT09IDApIHtcbiAgICAgICAgcmVtb3ZlQ2hpbGRSZWYocGFyZW50LCBfZWxlNCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyZW1vdmVGcm9tUG9vbCkge1xuICAgICAgLy8gbWFyayBhcyByZW1vdmVkXG4gICAgICBfZWxlNC5fcHJpdmF0ZS5yZW1vdmVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvLyBjaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhIGNvbXBvdW5kIGdyYXBoIG9yIG5vdFxuICB2YXIgZWxlc1N0aWxsSW5zaWRlID0gY3kuX3ByaXZhdGUuZWxlbWVudHM7XG4gIGN5Ll9wcml2YXRlLmhhc0NvbXBvdW5kTm9kZXMgPSBmYWxzZTtcbiAgZm9yICh2YXIgX2k3ID0gMDsgX2k3IDwgZWxlc1N0aWxsSW5zaWRlLmxlbmd0aDsgX2k3KyspIHtcbiAgICB2YXIgX2VsZTUgPSBlbGVzU3RpbGxJbnNpZGVbX2k3XTtcbiAgICBpZiAoX2VsZTUuaXNQYXJlbnQoKSkge1xuICAgICAgY3kuX3ByaXZhdGUuaGFzQ29tcG91bmROb2RlcyA9IHRydWU7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgdmFyIHJlbW92ZWRFbGVtZW50cyA9IG5ldyBDb2xsZWN0aW9uKHRoaXMuY3koKSwgZWxlc1RvUmVtb3ZlKTtcbiAgaWYgKHJlbW92ZWRFbGVtZW50cy5zaXplKCkgPiAwKSB7XG4gICAgLy8gbXVzdCBtYW51YWxseSBub3RpZnkgc2luY2UgdHJpZ2dlciB3b24ndCBkbyB0aGlzIGF1dG9tYXRpY2FsbHkgb25jZSByZW1vdmVkXG5cbiAgICBpZiAobm90aWZ5UmVuZGVyZXIpIHtcbiAgICAgIHJlbW92ZWRFbGVtZW50cy5lbWl0QW5kTm90aWZ5KCdyZW1vdmUnKTtcbiAgICB9IGVsc2UgaWYgKHJlbW92ZUZyb21Qb29sKSB7XG4gICAgICByZW1vdmVkRWxlbWVudHMuZW1pdCgncmVtb3ZlJyk7XG4gICAgfVxuICB9XG5cbiAgLy8gdGhlIHBhcmVudHMgd2hvIHdlcmUgbW9kaWZpZWQgYnkgdGhlIHJlbW92YWwgbmVlZCB0aGVpciBzdHlsZSB1cGRhdGVkXG4gIGZvciAodmFyIF9pOCA9IDA7IF9pOCA8IGFsdGVyZWRQYXJlbnRzLmxlbmd0aDsgX2k4KyspIHtcbiAgICB2YXIgX2VsZTYgPSBhbHRlcmVkUGFyZW50c1tfaThdO1xuICAgIGlmICghcmVtb3ZlRnJvbVBvb2wgfHwgIV9lbGU2LnJlbW92ZWQoKSkge1xuICAgICAgX2VsZTYudXBkYXRlU3R5bGUoKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlbW92ZWRFbGVtZW50cztcbn07XG5lbGVzZm4kMS5tb3ZlID0gZnVuY3Rpb24gKHN0cnVjdCkge1xuICB2YXIgY3kgPSB0aGlzLl9wcml2YXRlLmN5O1xuICB2YXIgZWxlcyA9IHRoaXM7XG5cbiAgLy8ganVzdCBjbGVhbiB1cCByZWZzLCBjYWNoZXMsIGV0Yy4gaW4gdGhlIHNhbWUgd2F5IGFzIHdoZW4gcmVtb3ZpbmcgYW5kIHRoZW4gcmVzdG9yaW5nXG4gIC8vIChvdXIgY2FsbHMgdG8gcmVtb3ZlL3Jlc3RvcmUgZG8gbm90IHJlbW92ZSBmcm9tIHRoZSBncmFwaCBvciBtYWtlIGV2ZW50cylcbiAgdmFyIG5vdGlmeVJlbmRlcmVyID0gZmFsc2U7XG4gIHZhciBtb2RpZnlQb29sID0gZmFsc2U7XG4gIHZhciB0b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKGlkKSB7XG4gICAgcmV0dXJuIGlkID09IG51bGwgPyBpZCA6ICcnICsgaWQ7XG4gIH07IC8vIGlkIG11c3QgYmUgc3RyaW5nXG5cbiAgaWYgKHN0cnVjdC5zb3VyY2UgIT09IHVuZGVmaW5lZCB8fCBzdHJ1Y3QudGFyZ2V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgc3JjSWQgPSB0b1N0cmluZyhzdHJ1Y3Quc291cmNlKTtcbiAgICB2YXIgdGd0SWQgPSB0b1N0cmluZyhzdHJ1Y3QudGFyZ2V0KTtcbiAgICB2YXIgc3JjRXhpc3RzID0gc3JjSWQgIT0gbnVsbCAmJiBjeS5oYXNFbGVtZW50V2l0aElkKHNyY0lkKTtcbiAgICB2YXIgdGd0RXhpc3RzID0gdGd0SWQgIT0gbnVsbCAmJiBjeS5oYXNFbGVtZW50V2l0aElkKHRndElkKTtcbiAgICBpZiAoc3JjRXhpc3RzIHx8IHRndEV4aXN0cykge1xuICAgICAgY3kuYmF0Y2goZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBhdm9pZCBkdXBsaWNhdGUgc3R5bGUgdXBkYXRlc1xuICAgICAgICBlbGVzLnJlbW92ZShub3RpZnlSZW5kZXJlciwgbW9kaWZ5UG9vbCk7IC8vIGNsZWFuIHVwIHJlZnMgZXRjLlxuICAgICAgICBlbGVzLmVtaXRBbmROb3RpZnkoJ21vdmVvdXQnKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgICAgICAgdmFyIF9kYXRhNSA9IGVsZS5fcHJpdmF0ZS5kYXRhO1xuICAgICAgICAgIGlmIChlbGUuaXNFZGdlKCkpIHtcbiAgICAgICAgICAgIGlmIChzcmNFeGlzdHMpIHtcbiAgICAgICAgICAgICAgX2RhdGE1LnNvdXJjZSA9IHNyY0lkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRndEV4aXN0cykge1xuICAgICAgICAgICAgICBfZGF0YTUudGFyZ2V0ID0gdGd0SWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsZXMucmVzdG9yZShub3RpZnlSZW5kZXJlciwgbW9kaWZ5UG9vbCk7IC8vIG1ha2UgbmV3IHJlZnMsIHN0eWxlLCBldGMuXG4gICAgICB9KTtcbiAgICAgIGVsZXMuZW1pdEFuZE5vdGlmeSgnbW92ZScpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChzdHJ1Y3QucGFyZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAvLyBtb3ZlIG5vZGUgdG8gbmV3IHBhcmVudFxuICAgIHZhciBwYXJlbnRJZCA9IHRvU3RyaW5nKHN0cnVjdC5wYXJlbnQpO1xuICAgIHZhciBwYXJlbnRFeGlzdHMgPSBwYXJlbnRJZCA9PT0gbnVsbCB8fCBjeS5oYXNFbGVtZW50V2l0aElkKHBhcmVudElkKTtcbiAgICBpZiAocGFyZW50RXhpc3RzKSB7XG4gICAgICB2YXIgcGlkVG9Bc3NpZ24gPSBwYXJlbnRJZCA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IHBhcmVudElkO1xuICAgICAgY3kuYmF0Y2goZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBhdm9pZCBkdXBsaWNhdGUgc3R5bGUgdXBkYXRlc1xuICAgICAgICB2YXIgdXBkYXRlZCA9IGVsZXMucmVtb3ZlKG5vdGlmeVJlbmRlcmVyLCBtb2RpZnlQb29sKTsgLy8gY2xlYW4gdXAgcmVmcyBldGMuXG4gICAgICAgIHVwZGF0ZWQuZW1pdEFuZE5vdGlmeSgnbW92ZW91dCcpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICAgICAgICB2YXIgX2RhdGE2ID0gZWxlLl9wcml2YXRlLmRhdGE7XG4gICAgICAgICAgaWYgKGVsZS5pc05vZGUoKSkge1xuICAgICAgICAgICAgX2RhdGE2LnBhcmVudCA9IHBpZFRvQXNzaWduO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB1cGRhdGVkLnJlc3RvcmUobm90aWZ5UmVuZGVyZXIsIG1vZGlmeVBvb2wpOyAvLyBtYWtlIG5ldyByZWZzLCBzdHlsZSwgZXRjLlxuICAgICAgfSk7XG4gICAgICBlbGVzLmVtaXRBbmROb3RpZnkoJ21vdmUnKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuW2VsZXNmbiRqLCBlbGVzZm4kaSwgZWxlc2ZuJGgsIGVsZXNmbiRnLCBlbGVzZm4kZiwgZGF0YSwgZWxlc2ZuJGQsIGRpbWVuc2lvbnMsIGVsZXNmbiQ5LCBlbGVzZm4kOCwgZWxlc2ZuJDcsIGVsZXNmbiQ2LCBlbGVzZm4kNSwgZWxlc2ZuJDQsIGVsZXNmbiQzLCBlbGVzZm4kMl0uZm9yRWFjaChmdW5jdGlvbiAocHJvcHMpIHtcbiAgZXh0ZW5kKGVsZXNmbiQxLCBwcm9wcyk7XG59KTtcblxudmFyIGNvcmVmbiQ5ID0ge1xuICBhZGQ6IGZ1bmN0aW9uIGFkZChvcHRzKSB7XG4gICAgdmFyIGVsZW1lbnRzO1xuICAgIHZhciBjeSA9IHRoaXM7XG5cbiAgICAvLyBhZGQgdGhlIGVsZW1lbnRzXG4gICAgaWYgKGVsZW1lbnRPckNvbGxlY3Rpb24ob3B0cykpIHtcbiAgICAgIHZhciBlbGVzID0gb3B0cztcbiAgICAgIGlmIChlbGVzLl9wcml2YXRlLmN5ID09PSBjeSkge1xuICAgICAgICAvLyBzYW1lIGluc3RhbmNlID0+IGp1c3QgcmVzdG9yZVxuICAgICAgICBlbGVtZW50cyA9IGVsZXMucmVzdG9yZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gb3RoZXJ3aXNlLCBjb3B5IGZyb20ganNvblxuICAgICAgICB2YXIganNvbnMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgICAgICAganNvbnMucHVzaChlbGUuanNvbigpKTtcbiAgICAgICAgfVxuICAgICAgICBlbGVtZW50cyA9IG5ldyBDb2xsZWN0aW9uKGN5LCBqc29ucyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gc3BlY2lmeSBhbiBhcnJheSBvZiBvcHRpb25zXG4gICAgZWxzZSBpZiAoYXJyYXkob3B0cykpIHtcbiAgICAgIHZhciBfanNvbnMgPSBvcHRzO1xuICAgICAgZWxlbWVudHMgPSBuZXcgQ29sbGVjdGlvbihjeSwgX2pzb25zKTtcbiAgICB9XG5cbiAgICAvLyBzcGVjaWZ5IHZpYSBvcHRzLm5vZGVzIGFuZCBvcHRzLmVkZ2VzXG4gICAgZWxzZSBpZiAocGxhaW5PYmplY3Qob3B0cykgJiYgKGFycmF5KG9wdHMubm9kZXMpIHx8IGFycmF5KG9wdHMuZWRnZXMpKSkge1xuICAgICAgdmFyIGVsZXNCeUdyb3VwID0gb3B0cztcbiAgICAgIHZhciBfanNvbnMyID0gW107XG4gICAgICB2YXIgZ3JzID0gWydub2RlcycsICdlZGdlcyddO1xuICAgICAgZm9yICh2YXIgX2kgPSAwLCBpbCA9IGdycy5sZW5ndGg7IF9pIDwgaWw7IF9pKyspIHtcbiAgICAgICAgdmFyIGdyb3VwID0gZ3JzW19pXTtcbiAgICAgICAgdmFyIGVsZXNBcnJheSA9IGVsZXNCeUdyb3VwW2dyb3VwXTtcbiAgICAgICAgaWYgKGFycmF5KGVsZXNBcnJheSkpIHtcbiAgICAgICAgICBmb3IgKHZhciBqID0gMCwgamwgPSBlbGVzQXJyYXkubGVuZ3RoOyBqIDwgamw7IGorKykge1xuICAgICAgICAgICAgdmFyIGpzb24gPSBleHRlbmQoe1xuICAgICAgICAgICAgICBncm91cDogZ3JvdXBcbiAgICAgICAgICAgIH0sIGVsZXNBcnJheVtqXSk7XG4gICAgICAgICAgICBfanNvbnMyLnB1c2goanNvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbGVtZW50cyA9IG5ldyBDb2xsZWN0aW9uKGN5LCBfanNvbnMyKTtcbiAgICB9XG5cbiAgICAvLyBzcGVjaWZ5IG9wdGlvbnMgZm9yIG9uZSBlbGVtZW50XG4gICAgZWxzZSB7XG4gICAgICB2YXIgX2pzb24gPSBvcHRzO1xuICAgICAgZWxlbWVudHMgPSBuZXcgRWxlbWVudChjeSwgX2pzb24pLmNvbGxlY3Rpb24oKTtcbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnRzO1xuICB9LFxuICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZShjb2xsZWN0aW9uKSB7XG4gICAgaWYgKGVsZW1lbnRPckNvbGxlY3Rpb24oY29sbGVjdGlvbikpIDsgZWxzZSBpZiAoc3RyaW5nKGNvbGxlY3Rpb24pKSB7XG4gICAgICB2YXIgc2VsZWN0b3IgPSBjb2xsZWN0aW9uO1xuICAgICAgY29sbGVjdGlvbiA9IHRoaXMuJChzZWxlY3Rvcik7XG4gICAgfVxuICAgIHJldHVybiBjb2xsZWN0aW9uLnJlbW92ZSgpO1xuICB9XG59O1xuXG4vKiBnbG9iYWwgRmxvYXQzMkFycmF5ICovXG5cbi8qISBCZXppZXIgY3VydmUgZnVuY3Rpb24gZ2VuZXJhdG9yLiBDb3B5cmlnaHQgR2FldGFuIFJlbmF1ZGVhdS4gTUlUIExpY2Vuc2U6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTUlUX0xpY2Vuc2UgKi9cbmZ1bmN0aW9uIGdlbmVyYXRlQ3ViaWNCZXppZXIobVgxLCBtWTEsIG1YMiwgbVkyKSB7XG4gIHZhciBORVdUT05fSVRFUkFUSU9OUyA9IDQsXG4gICAgTkVXVE9OX01JTl9TTE9QRSA9IDAuMDAxLFxuICAgIFNVQkRJVklTSU9OX1BSRUNJU0lPTiA9IDAuMDAwMDAwMSxcbiAgICBTVUJESVZJU0lPTl9NQVhfSVRFUkFUSU9OUyA9IDEwLFxuICAgIGtTcGxpbmVUYWJsZVNpemUgPSAxMSxcbiAgICBrU2FtcGxlU3RlcFNpemUgPSAxLjAgLyAoa1NwbGluZVRhYmxlU2l6ZSAtIDEuMCksXG4gICAgZmxvYXQzMkFycmF5U3VwcG9ydGVkID0gdHlwZW9mIEZsb2F0MzJBcnJheSAhPT0gJ3VuZGVmaW5lZCc7XG5cbiAgLyogTXVzdCBjb250YWluIGZvdXIgYXJndW1lbnRzLiAqL1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCAhPT0gNCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qIEFyZ3VtZW50cyBtdXN0IGJlIG51bWJlcnMuICovXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgKytpKSB7XG4gICAgaWYgKHR5cGVvZiBhcmd1bWVudHNbaV0gIT09IFwibnVtYmVyXCIgfHwgaXNOYU4oYXJndW1lbnRzW2ldKSB8fCAhaXNGaW5pdGUoYXJndW1lbnRzW2ldKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qIFggdmFsdWVzIG11c3QgYmUgaW4gdGhlIFswLCAxXSByYW5nZS4gKi9cbiAgbVgxID0gTWF0aC5taW4obVgxLCAxKTtcbiAgbVgyID0gTWF0aC5taW4obVgyLCAxKTtcbiAgbVgxID0gTWF0aC5tYXgobVgxLCAwKTtcbiAgbVgyID0gTWF0aC5tYXgobVgyLCAwKTtcbiAgdmFyIG1TYW1wbGVWYWx1ZXMgPSBmbG9hdDMyQXJyYXlTdXBwb3J0ZWQgPyBuZXcgRmxvYXQzMkFycmF5KGtTcGxpbmVUYWJsZVNpemUpIDogbmV3IEFycmF5KGtTcGxpbmVUYWJsZVNpemUpO1xuICBmdW5jdGlvbiBBKGFBMSwgYUEyKSB7XG4gICAgcmV0dXJuIDEuMCAtIDMuMCAqIGFBMiArIDMuMCAqIGFBMTtcbiAgfVxuICBmdW5jdGlvbiBCKGFBMSwgYUEyKSB7XG4gICAgcmV0dXJuIDMuMCAqIGFBMiAtIDYuMCAqIGFBMTtcbiAgfVxuICBmdW5jdGlvbiBDKGFBMSkge1xuICAgIHJldHVybiAzLjAgKiBhQTE7XG4gIH1cbiAgZnVuY3Rpb24gY2FsY0JlemllcihhVCwgYUExLCBhQTIpIHtcbiAgICByZXR1cm4gKChBKGFBMSwgYUEyKSAqIGFUICsgQihhQTEsIGFBMikpICogYVQgKyBDKGFBMSkpICogYVQ7XG4gIH1cbiAgZnVuY3Rpb24gZ2V0U2xvcGUoYVQsIGFBMSwgYUEyKSB7XG4gICAgcmV0dXJuIDMuMCAqIEEoYUExLCBhQTIpICogYVQgKiBhVCArIDIuMCAqIEIoYUExLCBhQTIpICogYVQgKyBDKGFBMSk7XG4gIH1cbiAgZnVuY3Rpb24gbmV3dG9uUmFwaHNvbkl0ZXJhdGUoYVgsIGFHdWVzc1QpIHtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgTkVXVE9OX0lURVJBVElPTlM7ICsrX2kpIHtcbiAgICAgIHZhciBjdXJyZW50U2xvcGUgPSBnZXRTbG9wZShhR3Vlc3NULCBtWDEsIG1YMik7XG4gICAgICBpZiAoY3VycmVudFNsb3BlID09PSAwLjApIHtcbiAgICAgICAgcmV0dXJuIGFHdWVzc1Q7XG4gICAgICB9XG4gICAgICB2YXIgY3VycmVudFggPSBjYWxjQmV6aWVyKGFHdWVzc1QsIG1YMSwgbVgyKSAtIGFYO1xuICAgICAgYUd1ZXNzVCAtPSBjdXJyZW50WCAvIGN1cnJlbnRTbG9wZTtcbiAgICB9XG4gICAgcmV0dXJuIGFHdWVzc1Q7XG4gIH1cbiAgZnVuY3Rpb24gY2FsY1NhbXBsZVZhbHVlcygpIHtcbiAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBrU3BsaW5lVGFibGVTaXplOyArK19pMikge1xuICAgICAgbVNhbXBsZVZhbHVlc1tfaTJdID0gY2FsY0JlemllcihfaTIgKiBrU2FtcGxlU3RlcFNpemUsIG1YMSwgbVgyKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gYmluYXJ5U3ViZGl2aWRlKGFYLCBhQSwgYUIpIHtcbiAgICB2YXIgY3VycmVudFgsXG4gICAgICBjdXJyZW50VCxcbiAgICAgIGkgPSAwO1xuICAgIGRvIHtcbiAgICAgIGN1cnJlbnRUID0gYUEgKyAoYUIgLSBhQSkgLyAyLjA7XG4gICAgICBjdXJyZW50WCA9IGNhbGNCZXppZXIoY3VycmVudFQsIG1YMSwgbVgyKSAtIGFYO1xuICAgICAgaWYgKGN1cnJlbnRYID4gMC4wKSB7XG4gICAgICAgIGFCID0gY3VycmVudFQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhQSA9IGN1cnJlbnRUO1xuICAgICAgfVxuICAgIH0gd2hpbGUgKE1hdGguYWJzKGN1cnJlbnRYKSA+IFNVQkRJVklTSU9OX1BSRUNJU0lPTiAmJiArK2kgPCBTVUJESVZJU0lPTl9NQVhfSVRFUkFUSU9OUyk7XG4gICAgcmV0dXJuIGN1cnJlbnRUO1xuICB9XG4gIGZ1bmN0aW9uIGdldFRGb3JYKGFYKSB7XG4gICAgdmFyIGludGVydmFsU3RhcnQgPSAwLjAsXG4gICAgICBjdXJyZW50U2FtcGxlID0gMSxcbiAgICAgIGxhc3RTYW1wbGUgPSBrU3BsaW5lVGFibGVTaXplIC0gMTtcbiAgICBmb3IgKDsgY3VycmVudFNhbXBsZSAhPT0gbGFzdFNhbXBsZSAmJiBtU2FtcGxlVmFsdWVzW2N1cnJlbnRTYW1wbGVdIDw9IGFYOyArK2N1cnJlbnRTYW1wbGUpIHtcbiAgICAgIGludGVydmFsU3RhcnQgKz0ga1NhbXBsZVN0ZXBTaXplO1xuICAgIH1cbiAgICAtLWN1cnJlbnRTYW1wbGU7XG4gICAgdmFyIGRpc3QgPSAoYVggLSBtU2FtcGxlVmFsdWVzW2N1cnJlbnRTYW1wbGVdKSAvIChtU2FtcGxlVmFsdWVzW2N1cnJlbnRTYW1wbGUgKyAxXSAtIG1TYW1wbGVWYWx1ZXNbY3VycmVudFNhbXBsZV0pLFxuICAgICAgZ3Vlc3NGb3JUID0gaW50ZXJ2YWxTdGFydCArIGRpc3QgKiBrU2FtcGxlU3RlcFNpemUsXG4gICAgICBpbml0aWFsU2xvcGUgPSBnZXRTbG9wZShndWVzc0ZvclQsIG1YMSwgbVgyKTtcbiAgICBpZiAoaW5pdGlhbFNsb3BlID49IE5FV1RPTl9NSU5fU0xPUEUpIHtcbiAgICAgIHJldHVybiBuZXd0b25SYXBoc29uSXRlcmF0ZShhWCwgZ3Vlc3NGb3JUKTtcbiAgICB9IGVsc2UgaWYgKGluaXRpYWxTbG9wZSA9PT0gMC4wKSB7XG4gICAgICByZXR1cm4gZ3Vlc3NGb3JUO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYmluYXJ5U3ViZGl2aWRlKGFYLCBpbnRlcnZhbFN0YXJ0LCBpbnRlcnZhbFN0YXJ0ICsga1NhbXBsZVN0ZXBTaXplKTtcbiAgICB9XG4gIH1cbiAgdmFyIF9wcmVjb21wdXRlZCA9IGZhbHNlO1xuICBmdW5jdGlvbiBwcmVjb21wdXRlKCkge1xuICAgIF9wcmVjb21wdXRlZCA9IHRydWU7XG4gICAgaWYgKG1YMSAhPT0gbVkxIHx8IG1YMiAhPT0gbVkyKSB7XG4gICAgICBjYWxjU2FtcGxlVmFsdWVzKCk7XG4gICAgfVxuICB9XG4gIHZhciBmID0gZnVuY3Rpb24gZihhWCkge1xuICAgIGlmICghX3ByZWNvbXB1dGVkKSB7XG4gICAgICBwcmVjb21wdXRlKCk7XG4gICAgfVxuICAgIGlmIChtWDEgPT09IG1ZMSAmJiBtWDIgPT09IG1ZMikge1xuICAgICAgcmV0dXJuIGFYO1xuICAgIH1cbiAgICBpZiAoYVggPT09IDApIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBpZiAoYVggPT09IDEpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICByZXR1cm4gY2FsY0JlemllcihnZXRURm9yWChhWCksIG1ZMSwgbVkyKTtcbiAgfTtcbiAgZi5nZXRDb250cm9sUG9pbnRzID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBbe1xuICAgICAgeDogbVgxLFxuICAgICAgeTogbVkxXG4gICAgfSwge1xuICAgICAgeDogbVgyLFxuICAgICAgeTogbVkyXG4gICAgfV07XG4gIH07XG4gIHZhciBzdHIgPSBcImdlbmVyYXRlQmV6aWVyKFwiICsgW21YMSwgbVkxLCBtWDIsIG1ZMl0gKyBcIilcIjtcbiAgZi50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gc3RyO1xuICB9O1xuICByZXR1cm4gZjtcbn1cblxuLyohIFJ1bmdlLUt1dHRhIHNwcmluZyBwaHlzaWNzIGZ1bmN0aW9uIGdlbmVyYXRvci4gQWRhcHRlZCBmcm9tIEZyYW1lci5qcywgY29weXJpZ2h0IEtvZW4gQm9rLiBNSVQgTGljZW5zZTogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NSVRfTGljZW5zZSAqL1xuLyogR2l2ZW4gYSB0ZW5zaW9uLCBmcmljdGlvbiwgYW5kIGR1cmF0aW9uLCBhIHNpbXVsYXRpb24gYXQgNjBGUFMgd2lsbCBmaXJzdCBydW4gd2l0aG91dCBhIGRlZmluZWQgZHVyYXRpb24gaW4gb3JkZXIgdG8gY2FsY3VsYXRlIHRoZSBmdWxsIHBhdGguIEEgc2Vjb25kIHBhc3NcbiAgIHRoZW4gYWRqdXN0cyB0aGUgdGltZSBkZWx0YSAtLSB1c2luZyB0aGUgcmVsYXRpb24gYmV0d2VlbiBhY3R1YWwgdGltZSBhbmQgZHVyYXRpb24gLS0gdG8gY2FsY3VsYXRlIHRoZSBwYXRoIGZvciB0aGUgZHVyYXRpb24tY29uc3RyYWluZWQgYW5pbWF0aW9uLiAqL1xudmFyIGdlbmVyYXRlU3ByaW5nUks0ID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBzcHJpbmdBY2NlbGVyYXRpb25Gb3JTdGF0ZShzdGF0ZSkge1xuICAgIHJldHVybiAtc3RhdGUudGVuc2lvbiAqIHN0YXRlLnggLSBzdGF0ZS5mcmljdGlvbiAqIHN0YXRlLnY7XG4gIH1cbiAgZnVuY3Rpb24gc3ByaW5nRXZhbHVhdGVTdGF0ZVdpdGhEZXJpdmF0aXZlKGluaXRpYWxTdGF0ZSwgZHQsIGRlcml2YXRpdmUpIHtcbiAgICB2YXIgc3RhdGUgPSB7XG4gICAgICB4OiBpbml0aWFsU3RhdGUueCArIGRlcml2YXRpdmUuZHggKiBkdCxcbiAgICAgIHY6IGluaXRpYWxTdGF0ZS52ICsgZGVyaXZhdGl2ZS5kdiAqIGR0LFxuICAgICAgdGVuc2lvbjogaW5pdGlhbFN0YXRlLnRlbnNpb24sXG4gICAgICBmcmljdGlvbjogaW5pdGlhbFN0YXRlLmZyaWN0aW9uXG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgZHg6IHN0YXRlLnYsXG4gICAgICBkdjogc3ByaW5nQWNjZWxlcmF0aW9uRm9yU3RhdGUoc3RhdGUpXG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBzcHJpbmdJbnRlZ3JhdGVTdGF0ZShzdGF0ZSwgZHQpIHtcbiAgICB2YXIgYSA9IHtcbiAgICAgICAgZHg6IHN0YXRlLnYsXG4gICAgICAgIGR2OiBzcHJpbmdBY2NlbGVyYXRpb25Gb3JTdGF0ZShzdGF0ZSlcbiAgICAgIH0sXG4gICAgICBiID0gc3ByaW5nRXZhbHVhdGVTdGF0ZVdpdGhEZXJpdmF0aXZlKHN0YXRlLCBkdCAqIDAuNSwgYSksXG4gICAgICBjID0gc3ByaW5nRXZhbHVhdGVTdGF0ZVdpdGhEZXJpdmF0aXZlKHN0YXRlLCBkdCAqIDAuNSwgYiksXG4gICAgICBkID0gc3ByaW5nRXZhbHVhdGVTdGF0ZVdpdGhEZXJpdmF0aXZlKHN0YXRlLCBkdCwgYyksXG4gICAgICBkeGR0ID0gMS4wIC8gNi4wICogKGEuZHggKyAyLjAgKiAoYi5keCArIGMuZHgpICsgZC5keCksXG4gICAgICBkdmR0ID0gMS4wIC8gNi4wICogKGEuZHYgKyAyLjAgKiAoYi5kdiArIGMuZHYpICsgZC5kdik7XG4gICAgc3RhdGUueCA9IHN0YXRlLnggKyBkeGR0ICogZHQ7XG4gICAgc3RhdGUudiA9IHN0YXRlLnYgKyBkdmR0ICogZHQ7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIHJldHVybiBmdW5jdGlvbiBzcHJpbmdSSzRGYWN0b3J5KHRlbnNpb24sIGZyaWN0aW9uLCBkdXJhdGlvbikge1xuICAgIHZhciBpbml0U3RhdGUgPSB7XG4gICAgICAgIHg6IC0xLFxuICAgICAgICB2OiAwLFxuICAgICAgICB0ZW5zaW9uOiBudWxsLFxuICAgICAgICBmcmljdGlvbjogbnVsbFxuICAgICAgfSxcbiAgICAgIHBhdGggPSBbMF0sXG4gICAgICB0aW1lX2xhcHNlZCA9IDAsXG4gICAgICB0b2xlcmFuY2UgPSAxIC8gMTAwMDAsXG4gICAgICBEVCA9IDE2IC8gMTAwMCxcbiAgICAgIGhhdmVfZHVyYXRpb24sXG4gICAgICBkdCxcbiAgICAgIGxhc3Rfc3RhdGU7XG4gICAgdGVuc2lvbiA9IHBhcnNlRmxvYXQodGVuc2lvbikgfHwgNTAwO1xuICAgIGZyaWN0aW9uID0gcGFyc2VGbG9hdChmcmljdGlvbikgfHwgMjA7XG4gICAgZHVyYXRpb24gPSBkdXJhdGlvbiB8fCBudWxsO1xuICAgIGluaXRTdGF0ZS50ZW5zaW9uID0gdGVuc2lvbjtcbiAgICBpbml0U3RhdGUuZnJpY3Rpb24gPSBmcmljdGlvbjtcbiAgICBoYXZlX2R1cmF0aW9uID0gZHVyYXRpb24gIT09IG51bGw7XG5cbiAgICAvKiBDYWxjdWxhdGUgdGhlIGFjdHVhbCB0aW1lIGl0IHRha2VzIGZvciB0aGlzIGFuaW1hdGlvbiB0byBjb21wbGV0ZSB3aXRoIHRoZSBwcm92aWRlZCBjb25kaXRpb25zLiAqL1xuICAgIGlmIChoYXZlX2R1cmF0aW9uKSB7XG4gICAgICAvKiBSdW4gdGhlIHNpbXVsYXRpb24gd2l0aG91dCBhIGR1cmF0aW9uLiAqL1xuICAgICAgdGltZV9sYXBzZWQgPSBzcHJpbmdSSzRGYWN0b3J5KHRlbnNpb24sIGZyaWN0aW9uKTtcbiAgICAgIC8qIENvbXB1dGUgdGhlIGFkanVzdGVkIHRpbWUgZGVsdGEuICovXG4gICAgICBkdCA9IHRpbWVfbGFwc2VkIC8gZHVyYXRpb24gKiBEVDtcbiAgICB9IGVsc2Uge1xuICAgICAgZHQgPSBEVDtcbiAgICB9XG4gICAgZm9yICg7Oykge1xuICAgICAgLyogTmV4dC9zdGVwIGZ1bmN0aW9uIC4qL1xuICAgICAgbGFzdF9zdGF0ZSA9IHNwcmluZ0ludGVncmF0ZVN0YXRlKGxhc3Rfc3RhdGUgfHwgaW5pdFN0YXRlLCBkdCk7XG4gICAgICAvKiBTdG9yZSB0aGUgcG9zaXRpb24uICovXG4gICAgICBwYXRoLnB1c2goMSArIGxhc3Rfc3RhdGUueCk7XG4gICAgICB0aW1lX2xhcHNlZCArPSAxNjtcbiAgICAgIC8qIElmIHRoZSBjaGFuZ2UgdGhyZXNob2xkIGlzIHJlYWNoZWQsIGJyZWFrLiAqL1xuICAgICAgaWYgKCEoTWF0aC5hYnMobGFzdF9zdGF0ZS54KSA+IHRvbGVyYW5jZSAmJiBNYXRoLmFicyhsYXN0X3N0YXRlLnYpID4gdG9sZXJhbmNlKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBJZiBkdXJhdGlvbiBpcyBub3QgZGVmaW5lZCwgcmV0dXJuIHRoZSBhY3R1YWwgdGltZSByZXF1aXJlZCBmb3IgY29tcGxldGluZyB0aGlzIGFuaW1hdGlvbi4gT3RoZXJ3aXNlLCByZXR1cm4gYSBjbG9zdXJlIHRoYXQgaG9sZHMgdGhlXG4gICAgICAgY29tcHV0ZWQgcGF0aCBhbmQgcmV0dXJucyBhIHNuYXBzaG90IG9mIHRoZSBwb3NpdGlvbiBhY2NvcmRpbmcgdG8gYSBnaXZlbiBwZXJjZW50Q29tcGxldGUuICovXG4gICAgcmV0dXJuICFoYXZlX2R1cmF0aW9uID8gdGltZV9sYXBzZWQgOiBmdW5jdGlvbiAocGVyY2VudENvbXBsZXRlKSB7XG4gICAgICByZXR1cm4gcGF0aFtwZXJjZW50Q29tcGxldGUgKiAocGF0aC5sZW5ndGggLSAxKSB8IDBdO1xuICAgIH07XG4gIH07XG59KCk7XG5cbnZhciBjdWJpY0JlemllciA9IGZ1bmN0aW9uIGN1YmljQmV6aWVyKHQxLCBwMSwgdDIsIHAyKSB7XG4gIHZhciBiZXppZXIgPSBnZW5lcmF0ZUN1YmljQmV6aWVyKHQxLCBwMSwgdDIsIHAyKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChzdGFydCwgZW5kLCBwZXJjZW50KSB7XG4gICAgcmV0dXJuIHN0YXJ0ICsgKGVuZCAtIHN0YXJ0KSAqIGJlemllcihwZXJjZW50KTtcbiAgfTtcbn07XG52YXIgZWFzaW5ncyA9IHtcbiAgJ2xpbmVhcic6IGZ1bmN0aW9uIGxpbmVhcihzdGFydCwgZW5kLCBwZXJjZW50KSB7XG4gICAgcmV0dXJuIHN0YXJ0ICsgKGVuZCAtIHN0YXJ0KSAqIHBlcmNlbnQ7XG4gIH0sXG4gIC8vIGRlZmF1bHQgZWFzaW5nc1xuICAnZWFzZSc6IGN1YmljQmV6aWVyKDAuMjUsIDAuMSwgMC4yNSwgMSksXG4gICdlYXNlLWluJzogY3ViaWNCZXppZXIoMC40MiwgMCwgMSwgMSksXG4gICdlYXNlLW91dCc6IGN1YmljQmV6aWVyKDAsIDAsIDAuNTgsIDEpLFxuICAnZWFzZS1pbi1vdXQnOiBjdWJpY0JlemllcigwLjQyLCAwLCAwLjU4LCAxKSxcbiAgLy8gc2luZVxuICAnZWFzZS1pbi1zaW5lJzogY3ViaWNCZXppZXIoMC40NywgMCwgMC43NDUsIDAuNzE1KSxcbiAgJ2Vhc2Utb3V0LXNpbmUnOiBjdWJpY0JlemllcigwLjM5LCAwLjU3NSwgMC41NjUsIDEpLFxuICAnZWFzZS1pbi1vdXQtc2luZSc6IGN1YmljQmV6aWVyKDAuNDQ1LCAwLjA1LCAwLjU1LCAwLjk1KSxcbiAgLy8gcXVhZFxuICAnZWFzZS1pbi1xdWFkJzogY3ViaWNCZXppZXIoMC41NSwgMC4wODUsIDAuNjgsIDAuNTMpLFxuICAnZWFzZS1vdXQtcXVhZCc6IGN1YmljQmV6aWVyKDAuMjUsIDAuNDYsIDAuNDUsIDAuOTQpLFxuICAnZWFzZS1pbi1vdXQtcXVhZCc6IGN1YmljQmV6aWVyKDAuNDU1LCAwLjAzLCAwLjUxNSwgMC45NTUpLFxuICAvLyBjdWJpY1xuICAnZWFzZS1pbi1jdWJpYyc6IGN1YmljQmV6aWVyKDAuNTUsIDAuMDU1LCAwLjY3NSwgMC4xOSksXG4gICdlYXNlLW91dC1jdWJpYyc6IGN1YmljQmV6aWVyKDAuMjE1LCAwLjYxLCAwLjM1NSwgMSksXG4gICdlYXNlLWluLW91dC1jdWJpYyc6IGN1YmljQmV6aWVyKDAuNjQ1LCAwLjA0NSwgMC4zNTUsIDEpLFxuICAvLyBxdWFydFxuICAnZWFzZS1pbi1xdWFydCc6IGN1YmljQmV6aWVyKDAuODk1LCAwLjAzLCAwLjY4NSwgMC4yMiksXG4gICdlYXNlLW91dC1xdWFydCc6IGN1YmljQmV6aWVyKDAuMTY1LCAwLjg0LCAwLjQ0LCAxKSxcbiAgJ2Vhc2UtaW4tb3V0LXF1YXJ0JzogY3ViaWNCZXppZXIoMC43NywgMCwgMC4xNzUsIDEpLFxuICAvLyBxdWludFxuICAnZWFzZS1pbi1xdWludCc6IGN1YmljQmV6aWVyKDAuNzU1LCAwLjA1LCAwLjg1NSwgMC4wNiksXG4gICdlYXNlLW91dC1xdWludCc6IGN1YmljQmV6aWVyKDAuMjMsIDEsIDAuMzIsIDEpLFxuICAnZWFzZS1pbi1vdXQtcXVpbnQnOiBjdWJpY0JlemllcigwLjg2LCAwLCAwLjA3LCAxKSxcbiAgLy8gZXhwb1xuICAnZWFzZS1pbi1leHBvJzogY3ViaWNCZXppZXIoMC45NSwgMC4wNSwgMC43OTUsIDAuMDM1KSxcbiAgJ2Vhc2Utb3V0LWV4cG8nOiBjdWJpY0JlemllcigwLjE5LCAxLCAwLjIyLCAxKSxcbiAgJ2Vhc2UtaW4tb3V0LWV4cG8nOiBjdWJpY0JlemllcigxLCAwLCAwLCAxKSxcbiAgLy8gY2lyY1xuICAnZWFzZS1pbi1jaXJjJzogY3ViaWNCZXppZXIoMC42LCAwLjA0LCAwLjk4LCAwLjMzNSksXG4gICdlYXNlLW91dC1jaXJjJzogY3ViaWNCZXppZXIoMC4wNzUsIDAuODIsIDAuMTY1LCAxKSxcbiAgJ2Vhc2UtaW4tb3V0LWNpcmMnOiBjdWJpY0JlemllcigwLjc4NSwgMC4xMzUsIDAuMTUsIDAuODYpLFxuICAvLyB1c2VyIHBhcmFtIGVhc2luZ3MuLi5cblxuICAnc3ByaW5nJzogZnVuY3Rpb24gc3ByaW5nKHRlbnNpb24sIGZyaWN0aW9uLCBkdXJhdGlvbikge1xuICAgIGlmIChkdXJhdGlvbiA9PT0gMCkge1xuICAgICAgLy8gY2FuJ3QgZ2V0IGEgc3ByaW5nIHcvIGR1cmF0aW9uIDBcbiAgICAgIHJldHVybiBlYXNpbmdzLmxpbmVhcjsgLy8gZHVyYXRpb24gMCA9PiBqdW1wIHRvIGVuZCBzbyBpbXBsIGRvZXNuJ3QgbWF0dGVyXG4gICAgfVxuICAgIHZhciBzcHJpbmcgPSBnZW5lcmF0ZVNwcmluZ1JLNCh0ZW5zaW9uLCBmcmljdGlvbiwgZHVyYXRpb24pO1xuICAgIHJldHVybiBmdW5jdGlvbiAoc3RhcnQsIGVuZCwgcGVyY2VudCkge1xuICAgICAgcmV0dXJuIHN0YXJ0ICsgKGVuZCAtIHN0YXJ0KSAqIHNwcmluZyhwZXJjZW50KTtcbiAgICB9O1xuICB9LFxuICAnY3ViaWMtYmV6aWVyJzogY3ViaWNCZXppZXJcbn07XG5cbmZ1bmN0aW9uIGdldEVhc2VkVmFsdWUodHlwZSwgc3RhcnQsIGVuZCwgcGVyY2VudCwgZWFzaW5nRm4pIHtcbiAgaWYgKHBlcmNlbnQgPT09IDEpIHtcbiAgICByZXR1cm4gZW5kO1xuICB9XG4gIGlmIChzdGFydCA9PT0gZW5kKSB7XG4gICAgcmV0dXJuIGVuZDtcbiAgfVxuICB2YXIgdmFsID0gZWFzaW5nRm4oc3RhcnQsIGVuZCwgcGVyY2VudCk7XG4gIGlmICh0eXBlID09IG51bGwpIHtcbiAgICByZXR1cm4gdmFsO1xuICB9XG4gIGlmICh0eXBlLnJvdW5kVmFsdWUgfHwgdHlwZS5jb2xvcikge1xuICAgIHZhbCA9IE1hdGgucm91bmQodmFsKTtcbiAgfVxuICBpZiAodHlwZS5taW4gIT09IHVuZGVmaW5lZCkge1xuICAgIHZhbCA9IE1hdGgubWF4KHZhbCwgdHlwZS5taW4pO1xuICB9XG4gIGlmICh0eXBlLm1heCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFsID0gTWF0aC5taW4odmFsLCB0eXBlLm1heCk7XG4gIH1cbiAgcmV0dXJuIHZhbDtcbn1cbmZ1bmN0aW9uIGdldFZhbHVlKHByb3AsIHNwZWMpIHtcbiAgaWYgKHByb3AucGZWYWx1ZSAhPSBudWxsIHx8IHByb3AudmFsdWUgIT0gbnVsbCkge1xuICAgIGlmIChwcm9wLnBmVmFsdWUgIT0gbnVsbCAmJiAoc3BlYyA9PSBudWxsIHx8IHNwZWMudHlwZS51bml0cyAhPT0gJyUnKSkge1xuICAgICAgcmV0dXJuIHByb3AucGZWYWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHByb3AudmFsdWU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBwcm9wO1xuICB9XG59XG5mdW5jdGlvbiBlYXNlKHN0YXJ0UHJvcCwgZW5kUHJvcCwgcGVyY2VudCwgZWFzaW5nRm4sIHByb3BTcGVjKSB7XG4gIHZhciB0eXBlID0gcHJvcFNwZWMgIT0gbnVsbCA/IHByb3BTcGVjLnR5cGUgOiBudWxsO1xuICBpZiAocGVyY2VudCA8IDApIHtcbiAgICBwZXJjZW50ID0gMDtcbiAgfSBlbHNlIGlmIChwZXJjZW50ID4gMSkge1xuICAgIHBlcmNlbnQgPSAxO1xuICB9XG4gIHZhciBzdGFydCA9IGdldFZhbHVlKHN0YXJ0UHJvcCwgcHJvcFNwZWMpO1xuICB2YXIgZW5kID0gZ2V0VmFsdWUoZW5kUHJvcCwgcHJvcFNwZWMpO1xuICBpZiAobnVtYmVyJDEoc3RhcnQpICYmIG51bWJlciQxKGVuZCkpIHtcbiAgICByZXR1cm4gZ2V0RWFzZWRWYWx1ZSh0eXBlLCBzdGFydCwgZW5kLCBwZXJjZW50LCBlYXNpbmdGbik7XG4gIH0gZWxzZSBpZiAoYXJyYXkoc3RhcnQpICYmIGFycmF5KGVuZCkpIHtcbiAgICB2YXIgZWFzZWRBcnIgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVuZC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHNpID0gc3RhcnRbaV07XG4gICAgICB2YXIgZWkgPSBlbmRbaV07XG4gICAgICBpZiAoc2kgIT0gbnVsbCAmJiBlaSAhPSBudWxsKSB7XG4gICAgICAgIHZhciB2YWwgPSBnZXRFYXNlZFZhbHVlKHR5cGUsIHNpLCBlaSwgcGVyY2VudCwgZWFzaW5nRm4pO1xuICAgICAgICBlYXNlZEFyci5wdXNoKHZhbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlYXNlZEFyci5wdXNoKGVpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVhc2VkQXJyO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHN0ZXAkMShzZWxmLCBhbmksIG5vdywgaXNDb3JlKSB7XG4gIHZhciBpc0VsZXMgPSAhaXNDb3JlO1xuICB2YXIgX3AgPSBzZWxmLl9wcml2YXRlO1xuICB2YXIgYW5pX3AgPSBhbmkuX3ByaXZhdGU7XG4gIHZhciBwRWFzaW5nID0gYW5pX3AuZWFzaW5nO1xuICB2YXIgc3RhcnRUaW1lID0gYW5pX3Auc3RhcnRUaW1lO1xuICB2YXIgY3kgPSBpc0NvcmUgPyBzZWxmIDogc2VsZi5jeSgpO1xuICB2YXIgc3R5bGUgPSBjeS5zdHlsZSgpO1xuICBpZiAoIWFuaV9wLmVhc2luZ0ltcGwpIHtcbiAgICBpZiAocEVhc2luZyA9PSBudWxsKSB7XG4gICAgICAvLyB1c2UgZGVmYXVsdFxuICAgICAgYW5pX3AuZWFzaW5nSW1wbCA9IGVhc2luZ3NbJ2xpbmVhciddO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB0aGVuIGRlZmluZSB3LyBuYW1lXG4gICAgICB2YXIgZWFzaW5nVmFscztcbiAgICAgIGlmIChzdHJpbmcocEVhc2luZykpIHtcbiAgICAgICAgdmFyIGVhc2luZ1Byb3AgPSBzdHlsZS5wYXJzZSgndHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb24nLCBwRWFzaW5nKTtcbiAgICAgICAgZWFzaW5nVmFscyA9IGVhc2luZ1Byb3AudmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB0aGVuIGFzc3VtZSBwcmVwYXJzZWQgYXJyYXlcbiAgICAgICAgZWFzaW5nVmFscyA9IHBFYXNpbmc7XG4gICAgICB9XG4gICAgICB2YXIgbmFtZSwgYXJncztcbiAgICAgIGlmIChzdHJpbmcoZWFzaW5nVmFscykpIHtcbiAgICAgICAgbmFtZSA9IGVhc2luZ1ZhbHM7XG4gICAgICAgIGFyZ3MgPSBbXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5hbWUgPSBlYXNpbmdWYWxzWzFdO1xuICAgICAgICBhcmdzID0gZWFzaW5nVmFscy5zbGljZSgyKS5tYXAoZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgICByZXR1cm4gK247XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyBjcmVhdGUgd2l0aCBhcmdzXG4gICAgICAgIGlmIChuYW1lID09PSAnc3ByaW5nJykge1xuICAgICAgICAgIGFyZ3MucHVzaChhbmlfcC5kdXJhdGlvbik7IC8vIG5lZWQgZHVyYXRpb24gdG8gZ2VuZXJhdGUgc3ByaW5nXG4gICAgICAgIH1cbiAgICAgICAgYW5pX3AuZWFzaW5nSW1wbCA9IGVhc2luZ3NbbmFtZV0uYXBwbHkobnVsbCwgYXJncyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBzdGF0aWMgaW1wbCBieSBuYW1lXG4gICAgICAgIGFuaV9wLmVhc2luZ0ltcGwgPSBlYXNpbmdzW25hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICB2YXIgZWFzaW5nID0gYW5pX3AuZWFzaW5nSW1wbDtcbiAgdmFyIHBlcmNlbnQ7XG4gIGlmIChhbmlfcC5kdXJhdGlvbiA9PT0gMCkge1xuICAgIHBlcmNlbnQgPSAxO1xuICB9IGVsc2Uge1xuICAgIHBlcmNlbnQgPSAobm93IC0gc3RhcnRUaW1lKSAvIGFuaV9wLmR1cmF0aW9uO1xuICB9XG4gIGlmIChhbmlfcC5hcHBseWluZykge1xuICAgIHBlcmNlbnQgPSBhbmlfcC5wcm9ncmVzcztcbiAgfVxuICBpZiAocGVyY2VudCA8IDApIHtcbiAgICBwZXJjZW50ID0gMDtcbiAgfSBlbHNlIGlmIChwZXJjZW50ID4gMSkge1xuICAgIHBlcmNlbnQgPSAxO1xuICB9XG4gIGlmIChhbmlfcC5kZWxheSA9PSBudWxsKSB7XG4gICAgLy8gdGhlbiB1cGRhdGVcblxuICAgIHZhciBzdGFydFBvcyA9IGFuaV9wLnN0YXJ0UG9zaXRpb247XG4gICAgdmFyIGVuZFBvcyA9IGFuaV9wLnBvc2l0aW9uO1xuICAgIGlmIChlbmRQb3MgJiYgaXNFbGVzICYmICFzZWxmLmxvY2tlZCgpKSB7XG4gICAgICB2YXIgbmV3UG9zID0ge307XG4gICAgICBpZiAodmFsaWQoc3RhcnRQb3MueCwgZW5kUG9zLngpKSB7XG4gICAgICAgIG5ld1Bvcy54ID0gZWFzZShzdGFydFBvcy54LCBlbmRQb3MueCwgcGVyY2VudCwgZWFzaW5nKTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWxpZChzdGFydFBvcy55LCBlbmRQb3MueSkpIHtcbiAgICAgICAgbmV3UG9zLnkgPSBlYXNlKHN0YXJ0UG9zLnksIGVuZFBvcy55LCBwZXJjZW50LCBlYXNpbmcpO1xuICAgICAgfVxuICAgICAgc2VsZi5wb3NpdGlvbihuZXdQb3MpO1xuICAgIH1cbiAgICB2YXIgc3RhcnRQYW4gPSBhbmlfcC5zdGFydFBhbjtcbiAgICB2YXIgZW5kUGFuID0gYW5pX3AucGFuO1xuICAgIHZhciBwYW4gPSBfcC5wYW47XG4gICAgdmFyIGFuaW1hdGluZ1BhbiA9IGVuZFBhbiAhPSBudWxsICYmIGlzQ29yZTtcbiAgICBpZiAoYW5pbWF0aW5nUGFuKSB7XG4gICAgICBpZiAodmFsaWQoc3RhcnRQYW4ueCwgZW5kUGFuLngpKSB7XG4gICAgICAgIHBhbi54ID0gZWFzZShzdGFydFBhbi54LCBlbmRQYW4ueCwgcGVyY2VudCwgZWFzaW5nKTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWxpZChzdGFydFBhbi55LCBlbmRQYW4ueSkpIHtcbiAgICAgICAgcGFuLnkgPSBlYXNlKHN0YXJ0UGFuLnksIGVuZFBhbi55LCBwZXJjZW50LCBlYXNpbmcpO1xuICAgICAgfVxuICAgICAgc2VsZi5lbWl0KCdwYW4nKTtcbiAgICB9XG4gICAgdmFyIHN0YXJ0Wm9vbSA9IGFuaV9wLnN0YXJ0Wm9vbTtcbiAgICB2YXIgZW5kWm9vbSA9IGFuaV9wLnpvb207XG4gICAgdmFyIGFuaW1hdGluZ1pvb20gPSBlbmRab29tICE9IG51bGwgJiYgaXNDb3JlO1xuICAgIGlmIChhbmltYXRpbmdab29tKSB7XG4gICAgICBpZiAodmFsaWQoc3RhcnRab29tLCBlbmRab29tKSkge1xuICAgICAgICBfcC56b29tID0gYm91bmQoX3AubWluWm9vbSwgZWFzZShzdGFydFpvb20sIGVuZFpvb20sIHBlcmNlbnQsIGVhc2luZyksIF9wLm1heFpvb20pO1xuICAgICAgfVxuICAgICAgc2VsZi5lbWl0KCd6b29tJyk7XG4gICAgfVxuICAgIGlmIChhbmltYXRpbmdQYW4gfHwgYW5pbWF0aW5nWm9vbSkge1xuICAgICAgc2VsZi5lbWl0KCd2aWV3cG9ydCcpO1xuICAgIH1cbiAgICB2YXIgcHJvcHMgPSBhbmlfcC5zdHlsZTtcbiAgICBpZiAocHJvcHMgJiYgcHJvcHMubGVuZ3RoID4gMCAmJiBpc0VsZXMpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHByb3AgPSBwcm9wc1tpXTtcbiAgICAgICAgdmFyIF9uYW1lID0gcHJvcC5uYW1lO1xuICAgICAgICB2YXIgZW5kID0gcHJvcDtcbiAgICAgICAgdmFyIHN0YXJ0ID0gYW5pX3Auc3RhcnRTdHlsZVtfbmFtZV07XG4gICAgICAgIHZhciBwcm9wU3BlYyA9IHN0eWxlLnByb3BlcnRpZXNbc3RhcnQubmFtZV07XG4gICAgICAgIHZhciBlYXNlZFZhbCA9IGVhc2Uoc3RhcnQsIGVuZCwgcGVyY2VudCwgZWFzaW5nLCBwcm9wU3BlYyk7XG4gICAgICAgIHN0eWxlLm92ZXJyaWRlQnlwYXNzKHNlbGYsIF9uYW1lLCBlYXNlZFZhbCk7XG4gICAgICB9IC8vIGZvciBwcm9wc1xuXG4gICAgICBzZWxmLmVtaXQoJ3N0eWxlJyk7XG4gICAgfSAvLyBpZlxuICB9XG4gIGFuaV9wLnByb2dyZXNzID0gcGVyY2VudDtcbiAgcmV0dXJuIHBlcmNlbnQ7XG59XG5mdW5jdGlvbiB2YWxpZChzdGFydCwgZW5kKSB7XG4gIGlmIChzdGFydCA9PSBudWxsIHx8IGVuZCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChudW1iZXIkMShzdGFydCkgJiYgbnVtYmVyJDEoZW5kKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2UgaWYgKHN0YXJ0ICYmIGVuZCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gc3RhcnRBbmltYXRpb24oc2VsZiwgYW5pLCBub3csIGlzQ29yZSkge1xuICB2YXIgYW5pX3AgPSBhbmkuX3ByaXZhdGU7XG4gIGFuaV9wLnN0YXJ0ZWQgPSB0cnVlO1xuICBhbmlfcC5zdGFydFRpbWUgPSBub3cgLSBhbmlfcC5wcm9ncmVzcyAqIGFuaV9wLmR1cmF0aW9uO1xufVxuXG5mdW5jdGlvbiBzdGVwQWxsKG5vdywgY3kpIHtcbiAgdmFyIGVsZXMgPSBjeS5fcHJpdmF0ZS5hbmlFbGVzO1xuICB2YXIgZG9uZUVsZXMgPSBbXTtcbiAgZnVuY3Rpb24gc3RlcE9uZShlbGUsIGlzQ29yZSkge1xuICAgIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgICB2YXIgY3VycmVudCA9IF9wLmFuaW1hdGlvbi5jdXJyZW50O1xuICAgIHZhciBxdWV1ZSA9IF9wLmFuaW1hdGlvbi5xdWV1ZTtcbiAgICB2YXIgcmFuQW5pcyA9IGZhbHNlO1xuXG4gICAgLy8gaWYgbm90aGluZyBjdXJyZW50bHkgYW5pbWF0aW5nLCBnZXQgc29tZXRoaW5nIGZyb20gdGhlIHF1ZXVlXG4gICAgaWYgKGN1cnJlbnQubGVuZ3RoID09PSAwKSB7XG4gICAgICB2YXIgbmV4dCA9IHF1ZXVlLnNoaWZ0KCk7XG4gICAgICBpZiAobmV4dCkge1xuICAgICAgICBjdXJyZW50LnB1c2gobmV4dCk7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBjYWxsYmFja3MgPSBmdW5jdGlvbiBjYWxsYmFja3MoX2NhbGxiYWNrcykge1xuICAgICAgZm9yICh2YXIgaiA9IF9jYWxsYmFja3MubGVuZ3RoIC0gMTsgaiA+PSAwOyBqLS0pIHtcbiAgICAgICAgdmFyIGNiID0gX2NhbGxiYWNrc1tqXTtcbiAgICAgICAgY2IoKTtcbiAgICAgIH1cbiAgICAgIF9jYWxsYmFja3Muc3BsaWNlKDAsIF9jYWxsYmFja3MubGVuZ3RoKTtcbiAgICB9O1xuXG4gICAgLy8gc3RlcCBhbmQgcmVtb3ZlIGlmIGRvbmVcbiAgICBmb3IgKHZhciBpID0gY3VycmVudC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGFuaSA9IGN1cnJlbnRbaV07XG4gICAgICB2YXIgYW5pX3AgPSBhbmkuX3ByaXZhdGU7XG4gICAgICBpZiAoYW5pX3Auc3RvcHBlZCkge1xuICAgICAgICBjdXJyZW50LnNwbGljZShpLCAxKTtcbiAgICAgICAgYW5pX3AuaG9va2VkID0gZmFsc2U7XG4gICAgICAgIGFuaV9wLnBsYXlpbmcgPSBmYWxzZTtcbiAgICAgICAgYW5pX3Auc3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICBjYWxsYmFja3MoYW5pX3AuZnJhbWVzKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoIWFuaV9wLnBsYXlpbmcgJiYgIWFuaV9wLmFwcGx5aW5nKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBhbiBhcHBseSgpIHdoaWxlIHBsYXlpbmcgc2hvdWxkbid0IGRvIGFueXRoaW5nXG4gICAgICBpZiAoYW5pX3AucGxheWluZyAmJiBhbmlfcC5hcHBseWluZykge1xuICAgICAgICBhbmlfcC5hcHBseWluZyA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKCFhbmlfcC5zdGFydGVkKSB7XG4gICAgICAgIHN0YXJ0QW5pbWF0aW9uKGVsZSwgYW5pLCBub3cpO1xuICAgICAgfVxuICAgICAgc3RlcCQxKGVsZSwgYW5pLCBub3csIGlzQ29yZSk7XG4gICAgICBpZiAoYW5pX3AuYXBwbHlpbmcpIHtcbiAgICAgICAgYW5pX3AuYXBwbHlpbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNhbGxiYWNrcyhhbmlfcC5mcmFtZXMpO1xuICAgICAgaWYgKGFuaV9wLnN0ZXAgIT0gbnVsbCkge1xuICAgICAgICBhbmlfcC5zdGVwKG5vdyk7XG4gICAgICB9XG4gICAgICBpZiAoYW5pLmNvbXBsZXRlZCgpKSB7XG4gICAgICAgIGN1cnJlbnQuc3BsaWNlKGksIDEpO1xuICAgICAgICBhbmlfcC5ob29rZWQgPSBmYWxzZTtcbiAgICAgICAgYW5pX3AucGxheWluZyA9IGZhbHNlO1xuICAgICAgICBhbmlfcC5zdGFydGVkID0gZmFsc2U7XG4gICAgICAgIGNhbGxiYWNrcyhhbmlfcC5jb21wbGV0ZXMpO1xuICAgICAgfVxuICAgICAgcmFuQW5pcyA9IHRydWU7XG4gICAgfVxuICAgIGlmICghaXNDb3JlICYmIGN1cnJlbnQubGVuZ3RoID09PSAwICYmIHF1ZXVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZG9uZUVsZXMucHVzaChlbGUpO1xuICAgIH1cbiAgICByZXR1cm4gcmFuQW5pcztcbiAgfSAvLyBzdGVwRWxlbWVudFxuXG4gIC8vIGhhbmRsZSBhbGwgZWxlc1xuICB2YXIgcmFuRWxlQW5pID0gZmFsc2U7XG4gIGZvciAodmFyIGUgPSAwOyBlIDwgZWxlcy5sZW5ndGg7IGUrKykge1xuICAgIHZhciBlbGUgPSBlbGVzW2VdO1xuICAgIHZhciBoYW5kbGVkVGhpc0VsZSA9IHN0ZXBPbmUoZWxlKTtcbiAgICByYW5FbGVBbmkgPSByYW5FbGVBbmkgfHwgaGFuZGxlZFRoaXNFbGU7XG4gIH0gLy8gZWFjaCBlbGVtZW50XG5cbiAgdmFyIHJhbkNvcmVBbmkgPSBzdGVwT25lKGN5LCB0cnVlKTtcblxuICAvLyBub3RpZnkgcmVuZGVyZXJcbiAgaWYgKHJhbkVsZUFuaSB8fCByYW5Db3JlQW5pKSB7XG4gICAgaWYgKGVsZXMubGVuZ3RoID4gMCkge1xuICAgICAgY3kubm90aWZ5KCdkcmF3JywgZWxlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN5Lm5vdGlmeSgnZHJhdycpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHJlbW92ZSBlbGVtZW50cyBmcm9tIGxpc3Qgb2YgY3VycmVudGx5IGFuaW1hdGluZyBpZiBpdHMgcXVldWVzIGFyZSBlbXB0eVxuICBlbGVzLnVubWVyZ2UoZG9uZUVsZXMpO1xuICBjeS5lbWl0KCdzdGVwJyk7XG59IC8vIHN0ZXBBbGxcblxudmFyIGNvcmVmbiQ4ID0ge1xuICAvLyBwdWxsIGluIGFuaW1hdGlvbiBmdW5jdGlvbnNcbiAgYW5pbWF0ZTogZGVmaW5lLmFuaW1hdGUoKSxcbiAgYW5pbWF0aW9uOiBkZWZpbmUuYW5pbWF0aW9uKCksXG4gIGFuaW1hdGVkOiBkZWZpbmUuYW5pbWF0ZWQoKSxcbiAgY2xlYXJRdWV1ZTogZGVmaW5lLmNsZWFyUXVldWUoKSxcbiAgZGVsYXk6IGRlZmluZS5kZWxheSgpLFxuICBkZWxheUFuaW1hdGlvbjogZGVmaW5lLmRlbGF5QW5pbWF0aW9uKCksXG4gIHN0b3A6IGRlZmluZS5zdG9wKCksXG4gIGFkZFRvQW5pbWF0aW9uUG9vbDogZnVuY3Rpb24gYWRkVG9BbmltYXRpb25Qb29sKGVsZXMpIHtcbiAgICB2YXIgY3kgPSB0aGlzO1xuICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIHNhdmUgY3ljbGVzIHdoZW4gbm8gc3R5bGUgdXNlZFxuXG4gICAgY3kuX3ByaXZhdGUuYW5pRWxlcy5tZXJnZShlbGVzKTtcbiAgfSxcbiAgc3RvcEFuaW1hdGlvbkxvb3A6IGZ1bmN0aW9uIHN0b3BBbmltYXRpb25Mb29wKCkge1xuICAgIHRoaXMuX3ByaXZhdGUuYW5pbWF0aW9uc1J1bm5pbmcgPSBmYWxzZTtcbiAgfSxcbiAgc3RhcnRBbmltYXRpb25Mb29wOiBmdW5jdGlvbiBzdGFydEFuaW1hdGlvbkxvb3AoKSB7XG4gICAgdmFyIGN5ID0gdGhpcztcbiAgICBjeS5fcHJpdmF0ZS5hbmltYXRpb25zUnVubmluZyA9IHRydWU7XG4gICAgaWYgKCFjeS5zdHlsZUVuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gc2F2ZSBjeWNsZXMgd2hlbiBubyBzdHlsZSB1c2VkXG5cbiAgICAvLyBOQiB0aGUgYW5pbWF0aW9uIGxvb3Agd2lsbCBleGVjIGluIGhlYWRsZXNzIGVudmlyb25tZW50cyBpZiBzdHlsZSBlbmFibGVkXG4gICAgLy8gYW5kIGV4cGxpY2l0IGN5LmRlc3Ryb3koKSBpcyBuZWNlc3NhcnkgdG8gc3RvcCB0aGUgbG9vcFxuXG4gICAgZnVuY3Rpb24gaGVhZGxlc3NTdGVwKCkge1xuICAgICAgaWYgKCFjeS5fcHJpdmF0ZS5hbmltYXRpb25zUnVubmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gYW5pbWF0aW9uU3RlcChub3cpIHtcbiAgICAgICAgc3RlcEFsbChub3csIGN5KTtcbiAgICAgICAgaGVhZGxlc3NTdGVwKCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgdmFyIHJlbmRlcmVyID0gY3kucmVuZGVyZXIoKTtcbiAgICBpZiAocmVuZGVyZXIgJiYgcmVuZGVyZXIuYmVmb3JlUmVuZGVyKSB7XG4gICAgICAvLyBsZXQgdGhlIHJlbmRlcmVyIHNjaGVkdWxlIGFuaW1hdGlvbnNcbiAgICAgIHJlbmRlcmVyLmJlZm9yZVJlbmRlcihmdW5jdGlvbiByZW5kZXJlckFuaW1hdGlvblN0ZXAod2lsbERyYXcsIG5vdykge1xuICAgICAgICBzdGVwQWxsKG5vdywgY3kpO1xuICAgICAgfSwgcmVuZGVyZXIuYmVmb3JlUmVuZGVyUHJpb3JpdGllcy5hbmltYXRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gbWFuYWdlIHRoZSBhbmltYXRpb24gbG9vcCBvdXJzZWx2ZXNcbiAgICAgIGhlYWRsZXNzU3RlcCgpOyAvLyBmaXJzdCBjYWxsXG4gICAgfVxuICB9XG59O1xuXG52YXIgZW1pdHRlck9wdGlvbnMgPSB7XG4gIHF1YWxpZmllckNvbXBhcmU6IGZ1bmN0aW9uIHF1YWxpZmllckNvbXBhcmUoc2VsZWN0b3IxLCBzZWxlY3RvcjIpIHtcbiAgICBpZiAoc2VsZWN0b3IxID09IG51bGwgfHwgc2VsZWN0b3IyID09IG51bGwpIHtcbiAgICAgIHJldHVybiBzZWxlY3RvcjEgPT0gbnVsbCAmJiBzZWxlY3RvcjIgPT0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHNlbGVjdG9yMS5zYW1lVGV4dChzZWxlY3RvcjIpO1xuICAgIH1cbiAgfSxcbiAgZXZlbnRNYXRjaGVzOiBmdW5jdGlvbiBldmVudE1hdGNoZXMoY3ksIGxpc3RlbmVyLCBldmVudE9iaikge1xuICAgIHZhciBzZWxlY3RvciA9IGxpc3RlbmVyLnF1YWxpZmllcjtcbiAgICBpZiAoc2VsZWN0b3IgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGN5ICE9PSBldmVudE9iai50YXJnZXQgJiYgZWxlbWVudChldmVudE9iai50YXJnZXQpICYmIHNlbGVjdG9yLm1hdGNoZXMoZXZlbnRPYmoudGFyZ2V0KTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIGFkZEV2ZW50RmllbGRzOiBmdW5jdGlvbiBhZGRFdmVudEZpZWxkcyhjeSwgZXZ0KSB7XG4gICAgZXZ0LmN5ID0gY3k7XG4gICAgZXZ0LnRhcmdldCA9IGN5O1xuICB9LFxuICBjYWxsYmFja0NvbnRleHQ6IGZ1bmN0aW9uIGNhbGxiYWNrQ29udGV4dChjeSwgbGlzdGVuZXIsIGV2ZW50T2JqKSB7XG4gICAgcmV0dXJuIGxpc3RlbmVyLnF1YWxpZmllciAhPSBudWxsID8gZXZlbnRPYmoudGFyZ2V0IDogY3k7XG4gIH1cbn07XG52YXIgYXJnU2VsZWN0b3IgPSBmdW5jdGlvbiBhcmdTZWxlY3RvcihhcmcpIHtcbiAgaWYgKHN0cmluZyhhcmcpKSB7XG4gICAgcmV0dXJuIG5ldyBTZWxlY3RvcihhcmcpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBhcmc7XG4gIH1cbn07XG52YXIgZWxlc2ZuID0ge1xuICBjcmVhdGVFbWl0dGVyOiBmdW5jdGlvbiBjcmVhdGVFbWl0dGVyKCkge1xuICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG4gICAgaWYgKCFfcC5lbWl0dGVyKSB7XG4gICAgICBfcC5lbWl0dGVyID0gbmV3IEVtaXR0ZXIoZW1pdHRlck9wdGlvbnMsIHRoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgZW1pdHRlcjogZnVuY3Rpb24gZW1pdHRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5lbWl0dGVyO1xuICB9LFxuICBvbjogZnVuY3Rpb24gb24oZXZlbnRzLCBzZWxlY3RvciwgY2FsbGJhY2spIHtcbiAgICB0aGlzLmVtaXR0ZXIoKS5vbihldmVudHMsIGFyZ1NlbGVjdG9yKHNlbGVjdG9yKSwgY2FsbGJhY2spO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICByZW1vdmVMaXN0ZW5lcjogZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXIoZXZlbnRzLCBzZWxlY3RvciwgY2FsbGJhY2spIHtcbiAgICB0aGlzLmVtaXR0ZXIoKS5yZW1vdmVMaXN0ZW5lcihldmVudHMsIGFyZ1NlbGVjdG9yKHNlbGVjdG9yKSwgY2FsbGJhY2spO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICByZW1vdmVBbGxMaXN0ZW5lcnM6IGZ1bmN0aW9uIHJlbW92ZUFsbExpc3RlbmVycygpIHtcbiAgICB0aGlzLmVtaXR0ZXIoKS5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgb25lOiBmdW5jdGlvbiBvbmUoZXZlbnRzLCBzZWxlY3RvciwgY2FsbGJhY2spIHtcbiAgICB0aGlzLmVtaXR0ZXIoKS5vbmUoZXZlbnRzLCBhcmdTZWxlY3RvcihzZWxlY3RvciksIGNhbGxiYWNrKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgb25jZTogZnVuY3Rpb24gb25jZShldmVudHMsIHNlbGVjdG9yLCBjYWxsYmFjaykge1xuICAgIHRoaXMuZW1pdHRlcigpLm9uZShldmVudHMsIGFyZ1NlbGVjdG9yKHNlbGVjdG9yKSwgY2FsbGJhY2spO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBlbWl0OiBmdW5jdGlvbiBlbWl0KGV2ZW50cywgZXh0cmFQYXJhbXMpIHtcbiAgICB0aGlzLmVtaXR0ZXIoKS5lbWl0KGV2ZW50cywgZXh0cmFQYXJhbXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBlbWl0QW5kTm90aWZ5OiBmdW5jdGlvbiBlbWl0QW5kTm90aWZ5KGV2ZW50LCBlbGVzKSB7XG4gICAgdGhpcy5lbWl0KGV2ZW50KTtcbiAgICB0aGlzLm5vdGlmeShldmVudCwgZWxlcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn07XG5kZWZpbmUuZXZlbnRBbGlhc2VzT24oZWxlc2ZuKTtcblxudmFyIGNvcmVmbiQ3ID0ge1xuICBwbmc6IGZ1bmN0aW9uIHBuZyhvcHRpb25zKSB7XG4gICAgdmFyIHJlbmRlcmVyID0gdGhpcy5fcHJpdmF0ZS5yZW5kZXJlcjtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICByZXR1cm4gcmVuZGVyZXIucG5nKG9wdGlvbnMpO1xuICB9LFxuICBqcGc6IGZ1bmN0aW9uIGpwZyhvcHRpb25zKSB7XG4gICAgdmFyIHJlbmRlcmVyID0gdGhpcy5fcHJpdmF0ZS5yZW5kZXJlcjtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBvcHRpb25zLmJnID0gb3B0aW9ucy5iZyB8fCAnI2ZmZic7XG4gICAgcmV0dXJuIHJlbmRlcmVyLmpwZyhvcHRpb25zKTtcbiAgfVxufTtcbmNvcmVmbiQ3LmpwZWcgPSBjb3JlZm4kNy5qcGc7XG5cbnZhciBjb3JlZm4kNiA9IHtcbiAgbGF5b3V0OiBmdW5jdGlvbiBsYXlvdXQob3B0aW9ucykge1xuICAgIHZhciBjeSA9IHRoaXM7XG4gICAgaWYgKG9wdGlvbnMgPT0gbnVsbCkge1xuICAgICAgZXJyb3IoJ0xheW91dCBvcHRpb25zIG11c3QgYmUgc3BlY2lmaWVkIHRvIG1ha2UgYSBsYXlvdXQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMubmFtZSA9PSBudWxsKSB7XG4gICAgICBlcnJvcignQSBgbmFtZWAgbXVzdCBiZSBzcGVjaWZpZWQgdG8gbWFrZSBhIGxheW91dCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgbmFtZSA9IG9wdGlvbnMubmFtZTtcbiAgICB2YXIgTGF5b3V0ID0gY3kuZXh0ZW5zaW9uKCdsYXlvdXQnLCBuYW1lKTtcbiAgICBpZiAoTGF5b3V0ID09IG51bGwpIHtcbiAgICAgIGVycm9yKCdObyBzdWNoIGxheW91dCBgJyArIG5hbWUgKyAnYCBmb3VuZC4gIERpZCB5b3UgZm9yZ2V0IHRvIGltcG9ydCBpdCBhbmQgYGN5dG9zY2FwZS51c2UoKWAgaXQ/Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBlbGVzO1xuICAgIGlmIChzdHJpbmcob3B0aW9ucy5lbGVzKSkge1xuICAgICAgZWxlcyA9IGN5LiQob3B0aW9ucy5lbGVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlcyA9IG9wdGlvbnMuZWxlcyAhPSBudWxsID8gb3B0aW9ucy5lbGVzIDogY3kuJCgpO1xuICAgIH1cbiAgICB2YXIgbGF5b3V0ID0gbmV3IExheW91dChleHRlbmQoe30sIG9wdGlvbnMsIHtcbiAgICAgIGN5OiBjeSxcbiAgICAgIGVsZXM6IGVsZXNcbiAgICB9KSk7XG4gICAgcmV0dXJuIGxheW91dDtcbiAgfVxufTtcbmNvcmVmbiQ2LmNyZWF0ZUxheW91dCA9IGNvcmVmbiQ2Lm1ha2VMYXlvdXQgPSBjb3JlZm4kNi5sYXlvdXQ7XG5cbnZhciBjb3JlZm4kNSA9IHtcbiAgbm90aWZ5OiBmdW5jdGlvbiBub3RpZnkoZXZlbnROYW1lLCBldmVudEVsZXMpIHtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuICAgIGlmICh0aGlzLmJhdGNoaW5nKCkpIHtcbiAgICAgIF9wLmJhdGNoTm90aWZpY2F0aW9ucyA9IF9wLmJhdGNoTm90aWZpY2F0aW9ucyB8fCB7fTtcbiAgICAgIHZhciBlbGVzID0gX3AuYmF0Y2hOb3RpZmljYXRpb25zW2V2ZW50TmFtZV0gPSBfcC5iYXRjaE5vdGlmaWNhdGlvbnNbZXZlbnROYW1lXSB8fCB0aGlzLmNvbGxlY3Rpb24oKTtcbiAgICAgIGlmIChldmVudEVsZXMgIT0gbnVsbCkge1xuICAgICAgICBlbGVzLm1lcmdlKGV2ZW50RWxlcyk7XG4gICAgICB9XG4gICAgICByZXR1cm47IC8vIG5vdGlmaWNhdGlvbnMgYXJlIGRpc2FibGVkIGR1cmluZyBiYXRjaGluZ1xuICAgIH1cbiAgICBpZiAoIV9wLm5vdGlmaWNhdGlvbnNFbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBleGl0IG9uIGRpc2FibGVkXG5cbiAgICB2YXIgcmVuZGVyZXIgPSB0aGlzLnJlbmRlcmVyKCk7XG5cbiAgICAvLyBleGl0IGlmIGRlc3Ryb3koKSBjYWxsZWQgb24gY29yZSBvciByZW5kZXJlciBpbiBiZXR3ZWVuIGZyYW1lcyAjMTQ5OSAjMTUyOFxuICAgIGlmICh0aGlzLmRlc3Ryb3llZCgpIHx8ICFyZW5kZXJlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZW5kZXJlci5ub3RpZnkoZXZlbnROYW1lLCBldmVudEVsZXMpO1xuICB9LFxuICBub3RpZmljYXRpb25zOiBmdW5jdGlvbiBub3RpZmljYXRpb25zKGJvb2wpIHtcbiAgICB2YXIgcCA9IHRoaXMuX3ByaXZhdGU7XG4gICAgaWYgKGJvb2wgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHAubm90aWZpY2F0aW9uc0VuYWJsZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHAubm90aWZpY2F0aW9uc0VuYWJsZWQgPSBib29sID8gdHJ1ZSA6IGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgbm9Ob3RpZmljYXRpb25zOiBmdW5jdGlvbiBub05vdGlmaWNhdGlvbnMoY2FsbGJhY2spIHtcbiAgICB0aGlzLm5vdGlmaWNhdGlvbnMoZmFsc2UpO1xuICAgIGNhbGxiYWNrKCk7XG4gICAgdGhpcy5ub3RpZmljYXRpb25zKHRydWUpO1xuICB9LFxuICBiYXRjaGluZzogZnVuY3Rpb24gYmF0Y2hpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuYmF0Y2hDb3VudCA+IDA7XG4gIH0sXG4gIHN0YXJ0QmF0Y2g6IGZ1bmN0aW9uIHN0YXJ0QmF0Y2goKSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICBpZiAoX3AuYmF0Y2hDb3VudCA9PSBudWxsKSB7XG4gICAgICBfcC5iYXRjaENvdW50ID0gMDtcbiAgICB9XG4gICAgaWYgKF9wLmJhdGNoQ291bnQgPT09IDApIHtcbiAgICAgIF9wLmJhdGNoU3R5bGVFbGVzID0gdGhpcy5jb2xsZWN0aW9uKCk7XG4gICAgICBfcC5iYXRjaE5vdGlmaWNhdGlvbnMgPSB7fTtcbiAgICB9XG4gICAgX3AuYmF0Y2hDb3VudCsrO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBlbmRCYXRjaDogZnVuY3Rpb24gZW5kQmF0Y2goKSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICBpZiAoX3AuYmF0Y2hDb3VudCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIF9wLmJhdGNoQ291bnQtLTtcbiAgICBpZiAoX3AuYmF0Y2hDb3VudCA9PT0gMCkge1xuICAgICAgLy8gdXBkYXRlIHN0eWxlIGZvciBkaXJ0eSBlbGVzXG4gICAgICBfcC5iYXRjaFN0eWxlRWxlcy51cGRhdGVTdHlsZSgpO1xuICAgICAgdmFyIHJlbmRlcmVyID0gdGhpcy5yZW5kZXJlcigpO1xuXG4gICAgICAvLyBub3RpZnkgdGhlIHJlbmRlcmVyIG9mIHF1ZXVlZCBlbGVzIGFuZCBldmVudCB0eXBlc1xuICAgICAgT2JqZWN0LmtleXMoX3AuYmF0Y2hOb3RpZmljYXRpb25zKS5mb3JFYWNoKGZ1bmN0aW9uIChldmVudE5hbWUpIHtcbiAgICAgICAgdmFyIGVsZXMgPSBfcC5iYXRjaE5vdGlmaWNhdGlvbnNbZXZlbnROYW1lXTtcbiAgICAgICAgaWYgKGVsZXMuZW1wdHkoKSkge1xuICAgICAgICAgIHJlbmRlcmVyLm5vdGlmeShldmVudE5hbWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlbmRlcmVyLm5vdGlmeShldmVudE5hbWUsIGVsZXMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIGJhdGNoOiBmdW5jdGlvbiBiYXRjaChjYWxsYmFjaykge1xuICAgIHRoaXMuc3RhcnRCYXRjaCgpO1xuICAgIGNhbGxiYWNrKCk7XG4gICAgdGhpcy5lbmRCYXRjaCgpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICAvLyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgYmF0Y2hEYXRhOiBmdW5jdGlvbiBiYXRjaERhdGEobWFwKSB7XG4gICAgdmFyIGN5ID0gdGhpcztcbiAgICByZXR1cm4gdGhpcy5iYXRjaChmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgaWRzID0gT2JqZWN0LmtleXMobWFwKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBpZCA9IGlkc1tpXTtcbiAgICAgICAgdmFyIGRhdGEgPSBtYXBbaWRdO1xuICAgICAgICB2YXIgZWxlID0gY3kuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgICAgICBlbGUuZGF0YShkYXRhKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufTtcblxudmFyIHJlbmRlcmVyRGVmYXVsdHMgPSBkZWZhdWx0cyRnKHtcbiAgaGlkZUVkZ2VzT25WaWV3cG9ydDogZmFsc2UsXG4gIHRleHR1cmVPblZpZXdwb3J0OiBmYWxzZSxcbiAgbW90aW9uQmx1cjogZmFsc2UsXG4gIG1vdGlvbkJsdXJPcGFjaXR5OiAwLjA1LFxuICBwaXhlbFJhdGlvOiB1bmRlZmluZWQsXG4gIGRlc2t0b3BUYXBUaHJlc2hvbGQ6IDQsXG4gIHRvdWNoVGFwVGhyZXNob2xkOiA4LFxuICB3aGVlbFNlbnNpdGl2aXR5OiAxLFxuICBkZWJ1ZzogZmFsc2UsXG4gIHNob3dGcHM6IGZhbHNlLFxuICAvLyB3ZWJnbCBvcHRpb25zXG4gIHdlYmdsOiBmYWxzZSxcbiAgd2ViZ2xEZWJ1ZzogZmFsc2UsXG4gIHdlYmdsRGVidWdTaG93QXRsYXNlczogZmFsc2UsXG4gIC8vIGRlZmF1bHRzIGdvb2QgZm9yIG1vYmlsZVxuICB3ZWJnbFRleFNpemU6IDIwNDgsXG4gIHdlYmdsVGV4Um93czogMzYsXG4gIHdlYmdsVGV4Um93c05vZGVzOiAxOCxcbiAgd2ViZ2xCYXRjaFNpemU6IDIwNDgsXG4gIHdlYmdsVGV4UGVyQmF0Y2g6IDE0LFxuICB3ZWJnbEJnQ29sb3I6IFsyNTUsIDI1NSwgMjU1XVxufSk7XG52YXIgY29yZWZuJDQgPSB7XG4gIHJlbmRlclRvOiBmdW5jdGlvbiByZW5kZXJUbyhjb250ZXh0LCB6b29tLCBwYW4sIHB4UmF0aW8pIHtcbiAgICB2YXIgciA9IHRoaXMuX3ByaXZhdGUucmVuZGVyZXI7XG4gICAgci5yZW5kZXJUbyhjb250ZXh0LCB6b29tLCBwYW4sIHB4UmF0aW8pO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICByZW5kZXJlcjogZnVuY3Rpb24gcmVuZGVyZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUucmVuZGVyZXI7XG4gIH0sXG4gIGZvcmNlUmVuZGVyOiBmdW5jdGlvbiBmb3JjZVJlbmRlcigpIHtcbiAgICB0aGlzLm5vdGlmeSgnZHJhdycpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICByZXNpemU6IGZ1bmN0aW9uIHJlc2l6ZSgpIHtcbiAgICB0aGlzLmludmFsaWRhdGVTaXplKCk7XG4gICAgdGhpcy5lbWl0QW5kTm90aWZ5KCdyZXNpemUnKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgaW5pdFJlbmRlcmVyOiBmdW5jdGlvbiBpbml0UmVuZGVyZXIob3B0aW9ucykge1xuICAgIHZhciBjeSA9IHRoaXM7XG4gICAgdmFyIFJlbmRlcmVyUHJvdG8gPSBjeS5leHRlbnNpb24oJ3JlbmRlcmVyJywgb3B0aW9ucy5uYW1lKTtcbiAgICBpZiAoUmVuZGVyZXJQcm90byA9PSBudWxsKSB7XG4gICAgICBlcnJvcihcIkNhbiBub3QgaW5pdGlhbGlzZTogTm8gc3VjaCByZW5kZXJlciBgXCIuY29uY2F0KG9wdGlvbnMubmFtZSwgXCJgIGZvdW5kLiBEaWQgeW91IGZvcmdldCB0byBpbXBvcnQgaXQgYW5kIGBjeXRvc2NhcGUudXNlKClgIGl0P1wiKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChvcHRpb25zLndoZWVsU2Vuc2l0aXZpdHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgd2FybihcIllvdSBoYXZlIHNldCBhIGN1c3RvbSB3aGVlbCBzZW5zaXRpdml0eS4gIFRoaXMgd2lsbCBtYWtlIHlvdXIgYXBwIHpvb20gdW5uYXR1cmFsbHkgd2hlbiB1c2luZyBtYWluc3RyZWFtIG1pY2UuICBZb3Ugc2hvdWxkIGNoYW5nZSB0aGlzIHZhbHVlIGZyb20gdGhlIGRlZmF1bHQgb25seSBpZiB5b3UgY2FuIGd1YXJhbnRlZSB0aGF0IGFsbCB5b3VyIHVzZXJzIHdpbGwgdXNlIHRoZSBzYW1lIGhhcmR3YXJlIGFuZCBPUyBjb25maWd1cmF0aW9uIGFzIHlvdXIgY3VycmVudCBtYWNoaW5lLlwiKTtcbiAgICB9XG4gICAgdmFyIHJPcHRzID0gcmVuZGVyZXJEZWZhdWx0cyhvcHRpb25zKTtcbiAgICByT3B0cy5jeSA9IGN5O1xuICAgIGN5Ll9wcml2YXRlLnJlbmRlcmVyID0gbmV3IFJlbmRlcmVyUHJvdG8ock9wdHMpO1xuICAgIHRoaXMubm90aWZ5KCdpbml0Jyk7XG4gIH0sXG4gIGRlc3Ryb3lSZW5kZXJlcjogZnVuY3Rpb24gZGVzdHJveVJlbmRlcmVyKCkge1xuICAgIHZhciBjeSA9IHRoaXM7XG4gICAgY3kubm90aWZ5KCdkZXN0cm95Jyk7IC8vIGRlc3Ryb3kgdGhlIHJlbmRlcmVyXG5cbiAgICB2YXIgZG9tRWxlID0gY3kuY29udGFpbmVyKCk7XG4gICAgaWYgKGRvbUVsZSkge1xuICAgICAgZG9tRWxlLl9jeXJlZyA9IG51bGw7XG4gICAgICB3aGlsZSAoZG9tRWxlLmNoaWxkTm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBkb21FbGUucmVtb3ZlQ2hpbGQoZG9tRWxlLmNoaWxkTm9kZXNbMF0pO1xuICAgICAgfVxuICAgIH1cbiAgICBjeS5fcHJpdmF0ZS5yZW5kZXJlciA9IG51bGw7IC8vIHRvIGJlIGV4dHJhIHNhZmUsIHJlbW92ZSB0aGUgcmVmXG4gICAgY3kubXV0YWJsZUVsZW1lbnRzKCkuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gICAgICBfcC5yc2NyYXRjaCA9IHt9O1xuICAgICAgX3AucnN0eWxlID0ge307XG4gICAgICBfcC5hbmltYXRpb24uY3VycmVudCA9IFtdO1xuICAgICAgX3AuYW5pbWF0aW9uLnF1ZXVlID0gW107XG4gICAgfSk7XG4gIH0sXG4gIG9uUmVuZGVyOiBmdW5jdGlvbiBvblJlbmRlcihmbikge1xuICAgIHJldHVybiB0aGlzLm9uKCdyZW5kZXInLCBmbik7XG4gIH0sXG4gIG9mZlJlbmRlcjogZnVuY3Rpb24gb2ZmUmVuZGVyKGZuKSB7XG4gICAgcmV0dXJuIHRoaXMub2ZmKCdyZW5kZXInLCBmbik7XG4gIH1cbn07XG5jb3JlZm4kNC5pbnZhbGlkYXRlRGltZW5zaW9ucyA9IGNvcmVmbiQ0LnJlc2l6ZTtcblxudmFyIGNvcmVmbiQzID0ge1xuICAvLyBnZXQgYSBjb2xsZWN0aW9uXG4gIC8vIC0gZW1wdHkgY29sbGVjdGlvbiBvbiBubyBhcmdzXG4gIC8vIC0gY29sbGVjdGlvbiBvZiBlbGVtZW50cyBpbiB0aGUgZ3JhcGggb24gc2VsZWN0b3IgYXJnXG4gIC8vIC0gZ3VhcmFudGVlIGEgcmV0dXJuZWQgY29sbGVjdGlvbiB3aGVuIGVsZW1lbnRzIG9yIGNvbGxlY3Rpb24gc3BlY2lmaWVkXG4gIGNvbGxlY3Rpb246IGZ1bmN0aW9uIGNvbGxlY3Rpb24oZWxlcywgb3B0cykge1xuICAgIGlmIChzdHJpbmcoZWxlcykpIHtcbiAgICAgIHJldHVybiB0aGlzLiQoZWxlcyk7XG4gICAgfSBlbHNlIGlmIChlbGVtZW50T3JDb2xsZWN0aW9uKGVsZXMpKSB7XG4gICAgICByZXR1cm4gZWxlcy5jb2xsZWN0aW9uKCk7XG4gICAgfSBlbHNlIGlmIChhcnJheShlbGVzKSkge1xuICAgICAgaWYgKCFvcHRzKSB7XG4gICAgICAgIG9wdHMgPSB7fTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgQ29sbGVjdGlvbih0aGlzLCBlbGVzLCBvcHRzLnVuaXF1ZSwgb3B0cy5yZW1vdmVkKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBDb2xsZWN0aW9uKHRoaXMpO1xuICB9LFxuICBub2RlczogZnVuY3Rpb24gbm9kZXMoc2VsZWN0b3IpIHtcbiAgICB2YXIgbm9kZXMgPSB0aGlzLiQoZnVuY3Rpb24gKGVsZSkge1xuICAgICAgcmV0dXJuIGVsZS5pc05vZGUoKTtcbiAgICB9KTtcbiAgICBpZiAoc2VsZWN0b3IpIHtcbiAgICAgIHJldHVybiBub2Rlcy5maWx0ZXIoc2VsZWN0b3IpO1xuICAgIH1cbiAgICByZXR1cm4gbm9kZXM7XG4gIH0sXG4gIGVkZ2VzOiBmdW5jdGlvbiBlZGdlcyhzZWxlY3Rvcikge1xuICAgIHZhciBlZGdlcyA9IHRoaXMuJChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICByZXR1cm4gZWxlLmlzRWRnZSgpO1xuICAgIH0pO1xuICAgIGlmIChzZWxlY3Rvcikge1xuICAgICAgcmV0dXJuIGVkZ2VzLmZpbHRlcihzZWxlY3Rvcik7XG4gICAgfVxuICAgIHJldHVybiBlZGdlcztcbiAgfSxcbiAgLy8gc2VhcmNoIHRoZSBncmFwaCBsaWtlIGpRdWVyeVxuICAkOiBmdW5jdGlvbiAkKHNlbGVjdG9yKSB7XG4gICAgdmFyIGVsZXMgPSB0aGlzLl9wcml2YXRlLmVsZW1lbnRzO1xuICAgIGlmIChzZWxlY3Rvcikge1xuICAgICAgcmV0dXJuIGVsZXMuZmlsdGVyKHNlbGVjdG9yKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGVsZXMuc3Bhd25TZWxmKCk7XG4gICAgfVxuICB9LFxuICBtdXRhYmxlRWxlbWVudHM6IGZ1bmN0aW9uIG11dGFibGVFbGVtZW50cygpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5lbGVtZW50cztcbiAgfVxufTtcblxuLy8gYWxpYXNlc1xuY29yZWZuJDMuZWxlbWVudHMgPSBjb3JlZm4kMy5maWx0ZXIgPSBjb3JlZm4kMy4kO1xuXG52YXIgc3R5Zm4kOCA9IHt9O1xuXG4vLyBrZXlzIGZvciBzdHlsZSBibG9ja3MsIGUuZy4gdHRmZnR0XG52YXIgVFJVRSA9ICd0JztcbnZhciBGQUxTRSA9ICdmJztcblxuLy8gKHBvdGVudGlhbGx5IGV4cGVuc2l2ZSBjYWxjdWxhdGlvbilcbi8vIGFwcGx5IHRoZSBzdHlsZSB0byB0aGUgZWxlbWVudCBiYXNlZCBvblxuLy8gLSBpdHMgYnlwYXNzXG4vLyAtIHdoYXQgc2VsZWN0b3JzIG1hdGNoIGl0XG5zdHlmbiQ4LmFwcGx5ID0gZnVuY3Rpb24gKGVsZXMpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgX3AgPSBzZWxmLl9wcml2YXRlO1xuICB2YXIgY3kgPSBfcC5jeTtcbiAgdmFyIHVwZGF0ZWRFbGVzID0gY3kuY29sbGVjdGlvbigpO1xuICBmb3IgKHZhciBpZSA9IDA7IGllIDwgZWxlcy5sZW5ndGg7IGllKyspIHtcbiAgICB2YXIgZWxlID0gZWxlc1tpZV07XG4gICAgdmFyIGN4dE1ldGEgPSBzZWxmLmdldENvbnRleHRNZXRhKGVsZSk7XG4gICAgaWYgKGN4dE1ldGEuZW1wdHkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB2YXIgY3h0U3R5bGUgPSBzZWxmLmdldENvbnRleHRTdHlsZShjeHRNZXRhKTtcbiAgICB2YXIgYXBwID0gc2VsZi5hcHBseUNvbnRleHRTdHlsZShjeHRNZXRhLCBjeHRTdHlsZSwgZWxlKTtcbiAgICBpZiAoZWxlLl9wcml2YXRlLmFwcGxpZWRJbml0U3R5bGUpIHtcbiAgICAgIHNlbGYudXBkYXRlVHJhbnNpdGlvbnMoZWxlLCBhcHAuZGlmZlByb3BzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlLl9wcml2YXRlLmFwcGxpZWRJbml0U3R5bGUgPSB0cnVlO1xuICAgIH1cbiAgICB2YXIgaGludHNEaWZmID0gc2VsZi51cGRhdGVTdHlsZUhpbnRzKGVsZSk7XG4gICAgaWYgKGhpbnRzRGlmZikge1xuICAgICAgdXBkYXRlZEVsZXMucHVzaChlbGUpO1xuICAgIH1cbiAgfSAvLyBmb3IgZWxlbWVudHNcblxuICByZXR1cm4gdXBkYXRlZEVsZXM7XG59O1xuc3R5Zm4kOC5nZXRQcm9wZXJ0aWVzRGlmZiA9IGZ1bmN0aW9uIChvbGRDeHRLZXksIG5ld0N4dEtleSkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBjYWNoZSA9IHNlbGYuX3ByaXZhdGUucHJvcERpZmZzID0gc2VsZi5fcHJpdmF0ZS5wcm9wRGlmZnMgfHwge307XG4gIHZhciBkdWFsQ3h0S2V5ID0gb2xkQ3h0S2V5ICsgJy0nICsgbmV3Q3h0S2V5O1xuICB2YXIgY2FjaGVkVmFsID0gY2FjaGVbZHVhbEN4dEtleV07XG4gIGlmIChjYWNoZWRWYWwpIHtcbiAgICByZXR1cm4gY2FjaGVkVmFsO1xuICB9XG4gIHZhciBkaWZmUHJvcHMgPSBbXTtcbiAgdmFyIGFkZGVkUHJvcCA9IHt9O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgY3h0ID0gc2VsZltpXTtcbiAgICB2YXIgb2xkSGFzQ3h0ID0gb2xkQ3h0S2V5W2ldID09PSBUUlVFO1xuICAgIHZhciBuZXdIYXNDeHQgPSBuZXdDeHRLZXlbaV0gPT09IFRSVUU7XG4gICAgdmFyIGN4dEhhc0RpZmZlZCA9IG9sZEhhc0N4dCAhPT0gbmV3SGFzQ3h0O1xuICAgIHZhciBjeHRIYXNNYXBwZWRQcm9wcyA9IGN4dC5tYXBwZWRQcm9wZXJ0aWVzLmxlbmd0aCA+IDA7XG4gICAgaWYgKGN4dEhhc0RpZmZlZCB8fCBuZXdIYXNDeHQgJiYgY3h0SGFzTWFwcGVkUHJvcHMpIHtcbiAgICAgIHZhciBwcm9wcyA9IHZvaWQgMDtcbiAgICAgIGlmIChjeHRIYXNEaWZmZWQgJiYgY3h0SGFzTWFwcGVkUHJvcHMpIHtcbiAgICAgICAgcHJvcHMgPSBjeHQucHJvcGVydGllczsgLy8gc3VmZmljZXMgYi9jIG1hcHBlZFByb3BlcnRpZXMgaXMgYSBzdWJzZXQgb2YgcHJvcGVydGllc1xuICAgICAgfSBlbHNlIGlmIChjeHRIYXNEaWZmZWQpIHtcbiAgICAgICAgcHJvcHMgPSBjeHQucHJvcGVydGllczsgLy8gbmVlZCB0byBjaGVjayB0aGVtIGFsbFxuICAgICAgfSBlbHNlIGlmIChjeHRIYXNNYXBwZWRQcm9wcykge1xuICAgICAgICBwcm9wcyA9IGN4dC5tYXBwZWRQcm9wZXJ0aWVzOyAvLyBvbmx5IG5lZWQgdG8gY2hlY2sgbWFwcGVkXG4gICAgICB9XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHByb3BzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBwcm9wID0gcHJvcHNbal07XG4gICAgICAgIHZhciBuYW1lID0gcHJvcC5uYW1lO1xuXG4gICAgICAgIC8vIGlmIGEgbGF0ZXIgY29udGV4dCBvdmVycmlkZXMgdGhpcyBwcm9wZXJ0eSwgdGhlbiB0aGUgZmFjdCB0aGF0IHRoaXMgY29udGV4dCBoYXMgc3dpdGNoZWQvZGlmZmVkIGRvZXNuJ3QgbWF0dGVyXG4gICAgICAgIC8vIChzZW1pIGV4cGVuc2l2ZSBjaGVjayBzaW5jZSBpdCBtYWtlcyB0aGlzIGZ1bmN0aW9uIE8obl4yKSBvbiBjb250ZXh0IGxlbmd0aCwgYnV0IHdvcnRoIGl0IHNpbmNlIG92ZXJhbGwgcmVzdWx0XG4gICAgICAgIC8vIGlzIGNhY2hlZClcbiAgICAgICAgdmFyIGxhdGVyQ3h0T3ZlcnJpZGVzID0gZmFsc2U7XG4gICAgICAgIGZvciAodmFyIGsgPSBpICsgMTsgayA8IHNlbGYubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICB2YXIgbGF0ZXJDeHQgPSBzZWxmW2tdO1xuICAgICAgICAgIHZhciBoYXNMYXRlckN4dCA9IG5ld0N4dEtleVtrXSA9PT0gVFJVRTtcbiAgICAgICAgICBpZiAoIWhhc0xhdGVyQ3h0KSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9IC8vIGNhbid0IG92ZXJyaWRlIHVubGVzcyB0aGUgY29udGV4dCBpcyBhY3RpdmVcblxuICAgICAgICAgIGxhdGVyQ3h0T3ZlcnJpZGVzID0gbGF0ZXJDeHQucHJvcGVydGllc1twcm9wLm5hbWVdICE9IG51bGw7XG4gICAgICAgICAgaWYgKGxhdGVyQ3h0T3ZlcnJpZGVzKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9IC8vIGV4aXQgZWFybHkgYXMgbG9uZyBhcyBvbmUgbGF0ZXIgY29udGV4dCBvdmVycmlkZXNcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWFkZGVkUHJvcFtuYW1lXSAmJiAhbGF0ZXJDeHRPdmVycmlkZXMpIHtcbiAgICAgICAgICBhZGRlZFByb3BbbmFtZV0gPSB0cnVlO1xuICAgICAgICAgIGRpZmZQcm9wcy5wdXNoKG5hbWUpO1xuICAgICAgICB9XG4gICAgICB9IC8vIGZvciBwcm9wc1xuICAgIH0gLy8gaWZcbiAgfSAvLyBmb3IgY29udGV4dHNcblxuICBjYWNoZVtkdWFsQ3h0S2V5XSA9IGRpZmZQcm9wcztcbiAgcmV0dXJuIGRpZmZQcm9wcztcbn07XG5zdHlmbiQ4LmdldENvbnRleHRNZXRhID0gZnVuY3Rpb24gKGVsZSkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBjeHRLZXkgPSAnJztcbiAgdmFyIGRpZmZQcm9wcztcbiAgdmFyIHByZXZLZXkgPSBlbGUuX3ByaXZhdGUuc3R5bGVDeHRLZXkgfHwgJyc7XG5cbiAgLy8gZ2V0IHRoZSBjeHQga2V5XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjb250ZXh0ID0gc2VsZltpXTtcbiAgICB2YXIgY29udGV4dFNlbGVjdG9yTWF0Y2hlcyA9IGNvbnRleHQuc2VsZWN0b3IgJiYgY29udGV4dC5zZWxlY3Rvci5tYXRjaGVzKGVsZSk7IC8vIE5COiBjb250ZXh0LnNlbGVjdG9yIG1heSBiZSBudWxsIGZvciAnY29yZSdcblxuICAgIGlmIChjb250ZXh0U2VsZWN0b3JNYXRjaGVzKSB7XG4gICAgICBjeHRLZXkgKz0gVFJVRTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3h0S2V5ICs9IEZBTFNFO1xuICAgIH1cbiAgfSAvLyBmb3IgY29udGV4dFxuXG4gIGRpZmZQcm9wcyA9IHNlbGYuZ2V0UHJvcGVydGllc0RpZmYocHJldktleSwgY3h0S2V5KTtcbiAgZWxlLl9wcml2YXRlLnN0eWxlQ3h0S2V5ID0gY3h0S2V5O1xuICByZXR1cm4ge1xuICAgIGtleTogY3h0S2V5LFxuICAgIGRpZmZQcm9wTmFtZXM6IGRpZmZQcm9wcyxcbiAgICBlbXB0eTogZGlmZlByb3BzLmxlbmd0aCA9PT0gMFxuICB9O1xufTtcblxuLy8gZ2V0cyBhIGNvbXB1dGVkIGVsZSBzdHlsZSBvYmplY3QgYmFzZWQgb24gbWF0Y2hlZCBjb250ZXh0c1xuc3R5Zm4kOC5nZXRDb250ZXh0U3R5bGUgPSBmdW5jdGlvbiAoY3h0TWV0YSkge1xuICB2YXIgY3h0S2V5ID0gY3h0TWV0YS5rZXk7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGN4dFN0eWxlcyA9IHRoaXMuX3ByaXZhdGUuY29udGV4dFN0eWxlcyA9IHRoaXMuX3ByaXZhdGUuY29udGV4dFN0eWxlcyB8fCB7fTtcblxuICAvLyBpZiBhbHJlYWR5IGNvbXB1dGVkIHN0eWxlLCByZXR1cm5lZCBjYWNoZWQgY29weVxuICBpZiAoY3h0U3R5bGVzW2N4dEtleV0pIHtcbiAgICByZXR1cm4gY3h0U3R5bGVzW2N4dEtleV07XG4gIH1cbiAgdmFyIHN0eWxlID0ge1xuICAgIF9wcml2YXRlOiB7XG4gICAgICBrZXk6IGN4dEtleVxuICAgIH1cbiAgfTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGN4dCA9IHNlbGZbaV07XG4gICAgdmFyIGhhc0N4dCA9IGN4dEtleVtpXSA9PT0gVFJVRTtcbiAgICBpZiAoIWhhc0N4dCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgY3h0LnByb3BlcnRpZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBwcm9wID0gY3h0LnByb3BlcnRpZXNbal07XG4gICAgICBzdHlsZVtwcm9wLm5hbWVdID0gcHJvcDtcbiAgICB9XG4gIH1cbiAgY3h0U3R5bGVzW2N4dEtleV0gPSBzdHlsZTtcbiAgcmV0dXJuIHN0eWxlO1xufTtcbnN0eWZuJDguYXBwbHlDb250ZXh0U3R5bGUgPSBmdW5jdGlvbiAoY3h0TWV0YSwgY3h0U3R5bGUsIGVsZSkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBkaWZmUHJvcHMgPSBjeHRNZXRhLmRpZmZQcm9wTmFtZXM7XG4gIHZhciByZXREaWZmUHJvcHMgPSB7fTtcbiAgdmFyIHR5cGVzID0gc2VsZi50eXBlcztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaWZmUHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZGlmZlByb3BOYW1lID0gZGlmZlByb3BzW2ldO1xuICAgIHZhciBjeHRQcm9wID0gY3h0U3R5bGVbZGlmZlByb3BOYW1lXTtcbiAgICB2YXIgZWxlUHJvcCA9IGVsZS5wc3R5bGUoZGlmZlByb3BOYW1lKTtcbiAgICBpZiAoIWN4dFByb3ApIHtcbiAgICAgIC8vIG5vIGNvbnRleHQgcHJvcCBtZWFucyBkZWxldGVcbiAgICAgIGlmICghZWxlUHJvcCkge1xuICAgICAgICBjb250aW51ZTsgLy8gbm8gZXhpc3RpbmcgcHJvcCBtZWFucyBub3RoaW5nIG5lZWRzIHRvIGJlIHJlbW92ZWRcbiAgICAgICAgLy8gbmIgYWZmZWN0cyBpbml0aWFsIGFwcGxpY2F0aW9uIG9uIG1hcHBlZCB2YWx1ZXMgbGlrZSBjb250cm9sLXBvaW50LWRpc3RhbmNlc1xuICAgICAgfSBlbHNlIGlmIChlbGVQcm9wLmJ5cGFzcykge1xuICAgICAgICBjeHRQcm9wID0ge1xuICAgICAgICAgIG5hbWU6IGRpZmZQcm9wTmFtZSxcbiAgICAgICAgICBkZWxldGVCeXBhc3NlZDogdHJ1ZVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3h0UHJvcCA9IHtcbiAgICAgICAgICBuYW1lOiBkaWZmUHJvcE5hbWUsXG4gICAgICAgICAgXCJkZWxldGVcIjogdHJ1ZVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHNhdmUgY3ljbGVzIHdoZW4gdGhlIGNvbnRleHQgcHJvcCBkb2Vzbid0IG5lZWQgdG8gYmUgYXBwbGllZFxuICAgIGlmIChlbGVQcm9wID09PSBjeHRQcm9wKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBzYXZlIGN5Y2xlcyB3aGVuIGEgbWFwcGVkIGNvbnRleHQgcHJvcCBkb2Vzbid0IG5lZWQgdG8gYmUgYXBwbGllZFxuICAgIGlmIChjeHRQcm9wLm1hcHBlZCA9PT0gdHlwZXMuZm4gLy8gY29udGV4dCBwcm9wIGlzIGZ1bmN0aW9uIG1hcHBlclxuICAgICYmIGVsZVByb3AgIT0gbnVsbCAvLyBzb21lIHByb3BzIGNhbiBiZSBudWxsIGV2ZW4gYnkgZGVmYXVsdCAoZS5nLiBhIHByb3AgdGhhdCBvdmVycmlkZXMgYW5vdGhlciBvbmUpXG4gICAgJiYgZWxlUHJvcC5tYXBwaW5nICE9IG51bGwgLy8gZWxlIHByb3AgaXMgYSBjb25jcmV0ZSB2YWx1ZSBmcm9tIGZyb20gYSBtYXBwZXJcbiAgICAmJiBlbGVQcm9wLm1hcHBpbmcudmFsdWUgPT09IGN4dFByb3AudmFsdWUgLy8gdGhlIGN1cnJlbnQgcHJvcCBvbiB0aGUgZWxlIGlzIGEgZmxhdCBwcm9wIHZhbHVlIGZvciB0aGUgZnVuY3Rpb24gbWFwcGVyXG4gICAgKSB7XG4gICAgICAvLyBOQiBkb24ndCB3cml0ZSB0byBjeHRQcm9wLCBhcyBpdCdzIHNoYXJlZCBhbW9uZyBlbGVzIChzdG9yZWQgaW4gc3R5bGVzaGVldClcbiAgICAgIHZhciBtYXBwaW5nID0gZWxlUHJvcC5tYXBwaW5nOyAvLyBjYW4gd3JpdGUgdG8gbWFwcGluZywgYXMgaXQncyBhIHBlci1lbGUgY29weVxuICAgICAgdmFyIGZuVmFsdWUgPSBtYXBwaW5nLmZuVmFsdWUgPSBjeHRQcm9wLnZhbHVlKGVsZSk7IC8vIHRlbXBvcmFyaWx5IGNhY2hlIHRoZSB2YWx1ZSBpbiBjYXNlIG9mIGEgbWlzc1xuXG4gICAgICBpZiAoZm5WYWx1ZSA9PT0gbWFwcGluZy5wcmV2Rm5WYWx1ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIHJldERpZmZQcm9wID0gcmV0RGlmZlByb3BzW2RpZmZQcm9wTmFtZV0gPSB7XG4gICAgICBwcmV2OiBlbGVQcm9wXG4gICAgfTtcbiAgICBzZWxmLmFwcGx5UGFyc2VkUHJvcGVydHkoZWxlLCBjeHRQcm9wKTtcbiAgICByZXREaWZmUHJvcC5uZXh0ID0gZWxlLnBzdHlsZShkaWZmUHJvcE5hbWUpO1xuICAgIGlmIChyZXREaWZmUHJvcC5uZXh0ICYmIHJldERpZmZQcm9wLm5leHQuYnlwYXNzKSB7XG4gICAgICByZXREaWZmUHJvcC5uZXh0ID0gcmV0RGlmZlByb3AubmV4dC5ieXBhc3NlZDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBkaWZmUHJvcHM6IHJldERpZmZQcm9wc1xuICB9O1xufTtcbnN0eWZuJDgudXBkYXRlU3R5bGVIaW50cyA9IGZ1bmN0aW9uIChlbGUpIHtcbiAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBwcm9wTmFtZXMgPSBzZWxmLnByb3BlcnR5R3JvdXBOYW1lcztcbiAgdmFyIHByb3BHcktleXMgPSBzZWxmLnByb3BlcnR5R3JvdXBLZXlzO1xuICB2YXIgcHJvcEhhc2ggPSBmdW5jdGlvbiBwcm9wSGFzaChlbGUsIHByb3BOYW1lcywgc2VlZEtleSkge1xuICAgIHJldHVybiBzZWxmLmdldFByb3BlcnRpZXNIYXNoKGVsZSwgcHJvcE5hbWVzLCBzZWVkS2V5KTtcbiAgfTtcbiAgdmFyIG9sZFN0eWxlS2V5ID0gX3Auc3R5bGVLZXk7XG4gIGlmIChlbGUucmVtb3ZlZCgpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBpc05vZGUgPSBfcC5ncm91cCA9PT0gJ25vZGVzJztcblxuICAvLyBnZXQgdGhlIHN0eWxlIGtleSBoYXNoZXMgcGVyIHByb3AgZ3JvdXBcbiAgLy8gYnV0IGxhemlseSAtLSBvbmx5IHVzZSBub24tZGVmYXVsdCBwcm9wIHZhbHVlcyB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBoYXNoZXNcbiAgLy9cblxuICB2YXIgb3ZlcnJpZGRlblN0eWxlcyA9IGVsZS5fcHJpdmF0ZS5zdHlsZTtcbiAgcHJvcE5hbWVzID0gT2JqZWN0LmtleXMob3ZlcnJpZGRlblN0eWxlcyk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcEdyS2V5cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBncktleSA9IHByb3BHcktleXNbaV07XG4gICAgX3Auc3R5bGVLZXlzW2dyS2V5XSA9IFtERUZBVUxUX0hBU0hfU0VFRCwgREVGQVVMVF9IQVNIX1NFRURfQUxUXTtcbiAgfVxuICB2YXIgdXBkYXRlR3JLZXkxID0gZnVuY3Rpb24gdXBkYXRlR3JLZXkxKHZhbCwgZ3JLZXkpIHtcbiAgICByZXR1cm4gX3Auc3R5bGVLZXlzW2dyS2V5XVswXSA9IGhhc2hJbnQodmFsLCBfcC5zdHlsZUtleXNbZ3JLZXldWzBdKTtcbiAgfTtcbiAgdmFyIHVwZGF0ZUdyS2V5MiA9IGZ1bmN0aW9uIHVwZGF0ZUdyS2V5Mih2YWwsIGdyS2V5KSB7XG4gICAgcmV0dXJuIF9wLnN0eWxlS2V5c1tncktleV1bMV0gPSBoYXNoSW50QWx0KHZhbCwgX3Auc3R5bGVLZXlzW2dyS2V5XVsxXSk7XG4gIH07XG4gIHZhciB1cGRhdGVHcktleSA9IGZ1bmN0aW9uIHVwZGF0ZUdyS2V5KHZhbCwgZ3JLZXkpIHtcbiAgICB1cGRhdGVHcktleTEodmFsLCBncktleSk7XG4gICAgdXBkYXRlR3JLZXkyKHZhbCwgZ3JLZXkpO1xuICB9O1xuICB2YXIgdXBkYXRlR3JLZXlXU3RyID0gZnVuY3Rpb24gdXBkYXRlR3JLZXlXU3RyKHN0clZhbCwgZ3JLZXkpIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHN0clZhbC5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIGNoID0gc3RyVmFsLmNoYXJDb2RlQXQoaik7XG4gICAgICB1cGRhdGVHcktleTEoY2gsIGdyS2V5KTtcbiAgICAgIHVwZGF0ZUdyS2V5MihjaCwgZ3JLZXkpO1xuICAgIH1cbiAgfTtcblxuICAvLyAtIGhhc2hpbmcgd29ya3Mgb24gMzIgYml0IGludHMgYi9jIHdlIHVzZSBiaXR3aXNlIG9wc1xuICAvLyAtIHNtYWxsIG51bWJlcnMgZ2V0IGN1dCBvZmYgKGUuZy4gMC4xMjMgaXMgc2VlbiBhcyAwIGJ5IHRoZSBoYXNoaW5nIGZ1bmN0aW9uKVxuICAvLyAtIHJhaXNlIHVwIHNtYWxsIG51bWJlcnMgc28gbW9yZSBzaWduaWZpY2FudCBkaWdpdHMgYXJlIHNlZW4gYnkgaGFzaGluZ1xuICAvLyAtIG1ha2Ugc21hbGwgbnVtYmVycyBsYXJnZXIgdGhhbiBhIG5vcm1hbCB2YWx1ZSB0byBhdm9pZCBjb2xsaXNpb25zXG4gIC8vIC0gd29ya3MgaW4gcHJhY3RpY2UgYW5kIGl0J3MgcmVsYXRpdmVseSBjaGVhcFxuICB2YXIgTiA9IDIwMDAwMDAwMDA7XG4gIHZhciBjbGVhbk51bSA9IGZ1bmN0aW9uIGNsZWFuTnVtKHZhbCkge1xuICAgIHJldHVybiAtMTI4IDwgdmFsICYmIHZhbCA8IDEyOCAmJiBNYXRoLmZsb29yKHZhbCkgIT09IHZhbCA/IE4gLSAodmFsICogMTAyNCB8IDApIDogdmFsO1xuICB9O1xuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgcHJvcE5hbWVzLmxlbmd0aDsgX2krKykge1xuICAgIHZhciBuYW1lID0gcHJvcE5hbWVzW19pXTtcbiAgICB2YXIgcGFyc2VkUHJvcCA9IG92ZXJyaWRkZW5TdHlsZXNbbmFtZV07XG4gICAgaWYgKHBhcnNlZFByb3AgPT0gbnVsbCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHZhciBwcm9wSW5mbyA9IHRoaXMucHJvcGVydGllc1tuYW1lXTtcbiAgICB2YXIgdHlwZSA9IHByb3BJbmZvLnR5cGU7XG4gICAgdmFyIF9ncktleSA9IHByb3BJbmZvLmdyb3VwS2V5O1xuICAgIHZhciBub3JtYWxpemVkTnVtYmVyVmFsID0gdm9pZCAwO1xuICAgIGlmIChwcm9wSW5mby5oYXNoT3ZlcnJpZGUgIT0gbnVsbCkge1xuICAgICAgbm9ybWFsaXplZE51bWJlclZhbCA9IHByb3BJbmZvLmhhc2hPdmVycmlkZShlbGUsIHBhcnNlZFByb3ApO1xuICAgIH0gZWxzZSBpZiAocGFyc2VkUHJvcC5wZlZhbHVlICE9IG51bGwpIHtcbiAgICAgIG5vcm1hbGl6ZWROdW1iZXJWYWwgPSBwYXJzZWRQcm9wLnBmVmFsdWU7XG4gICAgfVxuXG4gICAgLy8gbWlnaHQgbm90IGJlIGEgbnVtYmVyIGlmIGl0IGFsbG93cyBlbnVtc1xuICAgIHZhciBudW1iZXJWYWwgPSBwcm9wSW5mby5lbnVtcyA9PSBudWxsID8gcGFyc2VkUHJvcC52YWx1ZSA6IG51bGw7XG4gICAgdmFyIGhhdmVOb3JtTnVtID0gbm9ybWFsaXplZE51bWJlclZhbCAhPSBudWxsO1xuICAgIHZhciBoYXZlVW5pdGVkTnVtID0gbnVtYmVyVmFsICE9IG51bGw7XG4gICAgdmFyIGhhdmVOdW0gPSBoYXZlTm9ybU51bSB8fCBoYXZlVW5pdGVkTnVtO1xuICAgIHZhciB1bml0cyA9IHBhcnNlZFByb3AudW5pdHM7XG5cbiAgICAvLyBudW1iZXJzIGFyZSBjaGVhcGVyIHRvIGhhc2ggdGhhbiBzdHJpbmdzXG4gICAgLy8gMSBoYXNoIG9wIHZzIG4gaGFzaCBvcHMgKGZvciBsZW5ndGggbiBzdHJpbmcpXG4gICAgaWYgKHR5cGUubnVtYmVyICYmIGhhdmVOdW0gJiYgIXR5cGUubXVsdGlwbGUpIHtcbiAgICAgIHZhciB2ID0gaGF2ZU5vcm1OdW0gPyBub3JtYWxpemVkTnVtYmVyVmFsIDogbnVtYmVyVmFsO1xuICAgICAgdXBkYXRlR3JLZXkoY2xlYW5OdW0odiksIF9ncktleSk7XG4gICAgICBpZiAoIWhhdmVOb3JtTnVtICYmIHVuaXRzICE9IG51bGwpIHtcbiAgICAgICAgdXBkYXRlR3JLZXlXU3RyKHVuaXRzLCBfZ3JLZXkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB1cGRhdGVHcktleVdTdHIocGFyc2VkUHJvcC5zdHJWYWx1ZSwgX2dyS2V5KTtcbiAgICB9XG4gIH1cblxuICAvLyBvdmVyYWxsIHN0eWxlIGtleVxuICAvL1xuXG4gIHZhciBoYXNoID0gW0RFRkFVTFRfSEFTSF9TRUVELCBERUZBVUxUX0hBU0hfU0VFRF9BTFRdO1xuICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBwcm9wR3JLZXlzLmxlbmd0aDsgX2kyKyspIHtcbiAgICB2YXIgX2dyS2V5MiA9IHByb3BHcktleXNbX2kyXTtcbiAgICB2YXIgZ3JIYXNoID0gX3Auc3R5bGVLZXlzW19ncktleTJdO1xuICAgIGhhc2hbMF0gPSBoYXNoSW50KGdySGFzaFswXSwgaGFzaFswXSk7XG4gICAgaGFzaFsxXSA9IGhhc2hJbnRBbHQoZ3JIYXNoWzFdLCBoYXNoWzFdKTtcbiAgfVxuICBfcC5zdHlsZUtleSA9IGNvbWJpbmVIYXNoZXMoaGFzaFswXSwgaGFzaFsxXSk7XG5cbiAgLy8gbGFiZWwgZGltc1xuICAvL1xuXG4gIHZhciBzayA9IF9wLnN0eWxlS2V5cztcbiAgX3AubGFiZWxEaW1zS2V5ID0gY29tYmluZUhhc2hlc0FycmF5KHNrLmxhYmVsRGltZW5zaW9ucyk7XG4gIHZhciBsYWJlbEtleXMgPSBwcm9wSGFzaChlbGUsIFsnbGFiZWwnXSwgc2subGFiZWxEaW1lbnNpb25zKTtcbiAgX3AubGFiZWxLZXkgPSBjb21iaW5lSGFzaGVzQXJyYXkobGFiZWxLZXlzKTtcbiAgX3AubGFiZWxTdHlsZUtleSA9IGNvbWJpbmVIYXNoZXNBcnJheShoYXNoQXJyYXlzKHNrLmNvbW1vbkxhYmVsLCBsYWJlbEtleXMpKTtcbiAgaWYgKCFpc05vZGUpIHtcbiAgICB2YXIgc291cmNlTGFiZWxLZXlzID0gcHJvcEhhc2goZWxlLCBbJ3NvdXJjZS1sYWJlbCddLCBzay5sYWJlbERpbWVuc2lvbnMpO1xuICAgIF9wLnNvdXJjZUxhYmVsS2V5ID0gY29tYmluZUhhc2hlc0FycmF5KHNvdXJjZUxhYmVsS2V5cyk7XG4gICAgX3Auc291cmNlTGFiZWxTdHlsZUtleSA9IGNvbWJpbmVIYXNoZXNBcnJheShoYXNoQXJyYXlzKHNrLmNvbW1vbkxhYmVsLCBzb3VyY2VMYWJlbEtleXMpKTtcbiAgICB2YXIgdGFyZ2V0TGFiZWxLZXlzID0gcHJvcEhhc2goZWxlLCBbJ3RhcmdldC1sYWJlbCddLCBzay5sYWJlbERpbWVuc2lvbnMpO1xuICAgIF9wLnRhcmdldExhYmVsS2V5ID0gY29tYmluZUhhc2hlc0FycmF5KHRhcmdldExhYmVsS2V5cyk7XG4gICAgX3AudGFyZ2V0TGFiZWxTdHlsZUtleSA9IGNvbWJpbmVIYXNoZXNBcnJheShoYXNoQXJyYXlzKHNrLmNvbW1vbkxhYmVsLCB0YXJnZXRMYWJlbEtleXMpKTtcbiAgfVxuXG4gIC8vIG5vZGVcbiAgLy9cblxuICBpZiAoaXNOb2RlKSB7XG4gICAgdmFyIF9wJHN0eWxlS2V5cyA9IF9wLnN0eWxlS2V5cyxcbiAgICAgIG5vZGVCb2R5ID0gX3Akc3R5bGVLZXlzLm5vZGVCb2R5LFxuICAgICAgbm9kZUJvcmRlciA9IF9wJHN0eWxlS2V5cy5ub2RlQm9yZGVyLFxuICAgICAgbm9kZU91dGxpbmUgPSBfcCRzdHlsZUtleXMubm9kZU91dGxpbmUsXG4gICAgICBiYWNrZ3JvdW5kSW1hZ2UgPSBfcCRzdHlsZUtleXMuYmFja2dyb3VuZEltYWdlLFxuICAgICAgY29tcG91bmQgPSBfcCRzdHlsZUtleXMuY29tcG91bmQsXG4gICAgICBwaWUgPSBfcCRzdHlsZUtleXMucGllLFxuICAgICAgc3RyaXBlID0gX3Akc3R5bGVLZXlzLnN0cmlwZTtcbiAgICB2YXIgbm9kZUtleXMgPSBbbm9kZUJvZHksIG5vZGVCb3JkZXIsIG5vZGVPdXRsaW5lLCBiYWNrZ3JvdW5kSW1hZ2UsIGNvbXBvdW5kLCBwaWUsIHN0cmlwZV0uZmlsdGVyKGZ1bmN0aW9uIChrKSB7XG4gICAgICByZXR1cm4gayAhPSBudWxsO1xuICAgIH0pLnJlZHVjZShoYXNoQXJyYXlzLCBbREVGQVVMVF9IQVNIX1NFRUQsIERFRkFVTFRfSEFTSF9TRUVEX0FMVF0pO1xuICAgIF9wLm5vZGVLZXkgPSBjb21iaW5lSGFzaGVzQXJyYXkobm9kZUtleXMpO1xuICAgIF9wLmhhc1BpZSA9IHBpZSAhPSBudWxsICYmIHBpZVswXSAhPT0gREVGQVVMVF9IQVNIX1NFRUQgJiYgcGllWzFdICE9PSBERUZBVUxUX0hBU0hfU0VFRF9BTFQ7XG4gICAgX3AuaGFzU3RyaXBlID0gc3RyaXBlICE9IG51bGwgJiYgc3RyaXBlWzBdICE9PSBERUZBVUxUX0hBU0hfU0VFRCAmJiBzdHJpcGVbMV0gIT09IERFRkFVTFRfSEFTSF9TRUVEX0FMVDtcbiAgfVxuICByZXR1cm4gb2xkU3R5bGVLZXkgIT09IF9wLnN0eWxlS2V5O1xufTtcbnN0eWZuJDguY2xlYXJTdHlsZUhpbnRzID0gZnVuY3Rpb24gKGVsZSkge1xuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIF9wLnN0eWxlQ3h0S2V5ID0gJyc7XG4gIF9wLnN0eWxlS2V5cyA9IHt9O1xuICBfcC5zdHlsZUtleSA9IG51bGw7XG4gIF9wLmxhYmVsS2V5ID0gbnVsbDtcbiAgX3AubGFiZWxTdHlsZUtleSA9IG51bGw7XG4gIF9wLnNvdXJjZUxhYmVsS2V5ID0gbnVsbDtcbiAgX3Auc291cmNlTGFiZWxTdHlsZUtleSA9IG51bGw7XG4gIF9wLnRhcmdldExhYmVsS2V5ID0gbnVsbDtcbiAgX3AudGFyZ2V0TGFiZWxTdHlsZUtleSA9IG51bGw7XG4gIF9wLm5vZGVLZXkgPSBudWxsO1xuICBfcC5oYXNQaWUgPSBudWxsO1xuICBfcC5oYXNTdHJpcGUgPSBudWxsO1xufTtcblxuLy8gYXBwbHkgYSBwcm9wZXJ0eSB0byB0aGUgc3R5bGUgKGZvciBpbnRlcm5hbCB1c2UpXG4vLyByZXR1cm5zIHdoZXRoZXIgYXBwbGljYXRpb24gd2FzIHN1Y2Nlc3NmdWxcbi8vXG4vLyBub3csIHRoaXMgZnVuY3Rpb24gZmxhdHRlbnMgdGhlIHByb3BlcnR5LCBhbmQgaGVyZSdzIGhvdzpcbi8vXG4vLyBmb3IgcGFyc2VkUHJvcDp7IGJ5cGFzczogdHJ1ZSwgZGVsZXRlQnlwYXNzOiB0cnVlIH1cbi8vIG5vIHByb3BlcnR5IGlzIGdlbmVyYXRlZCwgaW5zdGVhZCB0aGUgYnlwYXNzIHByb3BlcnR5IGluIHRoZVxuLy8gZWxlbWVudCdzIHN0eWxlIGlzIHJlcGxhY2VkIGJ5IHdoYXQncyBwb2ludGVkIHRvIGJ5IHRoZSBgYnlwYXNzZWRgXG4vLyBmaWVsZCBpbiB0aGUgYnlwYXNzIHByb3BlcnR5IChpLmUuIHJlc3RvcmluZyB0aGUgcHJvcGVydHkgdGhlXG4vLyBieXBhc3Mgd2FzIG92ZXJyaWRpbmcpXG4vL1xuLy8gZm9yIHBhcnNlZFByb3A6eyBtYXBwZWQ6IHRydXRoeSB9XG4vLyB0aGUgZ2VuZXJhdGVkIGZsYXR0ZW5lZFByb3A6eyBtYXBwaW5nOiBwcm9wIH1cbi8vXG4vLyBmb3IgcGFyc2VkUHJvcDp7IGJ5cGFzczogdHJ1ZSB9XG4vLyB0aGUgZ2VuZXJhdGVkIGZsYXR0ZW5lZFByb3A6eyBieXBhc3NlZDogcGFyc2VkUHJvcCB9XG5zdHlmbiQ4LmFwcGx5UGFyc2VkUHJvcGVydHkgPSBmdW5jdGlvbiAoZWxlLCBwYXJzZWRQcm9wKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHByb3AgPSBwYXJzZWRQcm9wO1xuICB2YXIgc3R5bGUgPSBlbGUuX3ByaXZhdGUuc3R5bGU7XG4gIHZhciBmbGF0UHJvcDtcbiAgdmFyIHR5cGVzID0gc2VsZi50eXBlcztcbiAgdmFyIHR5cGUgPSBzZWxmLnByb3BlcnRpZXNbcHJvcC5uYW1lXS50eXBlO1xuICB2YXIgcHJvcElzQnlwYXNzID0gcHJvcC5ieXBhc3M7XG4gIHZhciBvcmlnUHJvcCA9IHN0eWxlW3Byb3AubmFtZV07XG4gIHZhciBvcmlnUHJvcElzQnlwYXNzID0gb3JpZ1Byb3AgJiYgb3JpZ1Byb3AuYnlwYXNzO1xuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIHZhciBmbGF0UHJvcE1hcHBpbmcgPSAnbWFwcGluZyc7XG4gIHZhciBnZXRWYWwgPSBmdW5jdGlvbiBnZXRWYWwocCkge1xuICAgIGlmIChwID09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSBpZiAocC5wZlZhbHVlICE9IG51bGwpIHtcbiAgICAgIHJldHVybiBwLnBmVmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBwLnZhbHVlO1xuICAgIH1cbiAgfTtcbiAgdmFyIGNoZWNrVHJpZ2dlcnMgPSBmdW5jdGlvbiBjaGVja1RyaWdnZXJzKCkge1xuICAgIHZhciBmcm9tVmFsID0gZ2V0VmFsKG9yaWdQcm9wKTtcbiAgICB2YXIgdG9WYWwgPSBnZXRWYWwocHJvcCk7XG4gICAgc2VsZi5jaGVja1RyaWdnZXJzKGVsZSwgcHJvcC5uYW1lLCBmcm9tVmFsLCB0b1ZhbCk7XG4gIH07XG5cbiAgLy8gZWRnZSBzYW5pdHkgY2hlY2tzIHRvIHByZXZlbnQgdGhlIGNsaWVudCBmcm9tIG1ha2luZyBzZXJpb3VzIG1pc3Rha2VzXG4gIGlmIChwYXJzZWRQcm9wLm5hbWUgPT09ICdjdXJ2ZS1zdHlsZScgJiYgZWxlLmlzRWRnZSgpICYmIChcbiAgLy8gbG9vcHMgbXVzdCBiZSBidW5kbGVkIGJlemllcnNcbiAgcGFyc2VkUHJvcC52YWx1ZSAhPT0gJ2JlemllcicgJiYgZWxlLmlzTG9vcCgpIHx8XG4gIC8vIGVkZ2VzIGNvbm5lY3RlZCB0byBjb21wb3VuZCBub2RlcyBjYW4gbm90IGJlIGhheXN0YWNrc1xuICBwYXJzZWRQcm9wLnZhbHVlID09PSAnaGF5c3RhY2snICYmIChlbGUuc291cmNlKCkuaXNQYXJlbnQoKSB8fCBlbGUudGFyZ2V0KCkuaXNQYXJlbnQoKSkpKSB7XG4gICAgcHJvcCA9IHBhcnNlZFByb3AgPSB0aGlzLnBhcnNlKHBhcnNlZFByb3AubmFtZSwgJ2JlemllcicsIHByb3BJc0J5cGFzcyk7XG4gIH1cbiAgaWYgKHByb3BbXCJkZWxldGVcIl0pIHtcbiAgICAvLyBkZWxldGUgdGhlIHByb3BlcnR5IGFuZCB1c2UgdGhlIGRlZmF1bHQgdmFsdWUgb24gZmFsc2V5IHZhbHVlXG4gICAgc3R5bGVbcHJvcC5uYW1lXSA9IHVuZGVmaW5lZDtcbiAgICBjaGVja1RyaWdnZXJzKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKHByb3AuZGVsZXRlQnlwYXNzZWQpIHtcbiAgICAvLyBkZWxldGUgdGhlIHByb3BlcnR5IHRoYXQgdGhlXG4gICAgaWYgKCFvcmlnUHJvcCkge1xuICAgICAgY2hlY2tUcmlnZ2VycygpO1xuICAgICAgcmV0dXJuIHRydWU7IC8vIGNhbid0IGRlbGV0ZSBpZiBubyBwcm9wXG4gICAgfSBlbHNlIGlmIChvcmlnUHJvcC5ieXBhc3MpIHtcbiAgICAgIC8vIGRlbGV0ZSBieXBhc3NlZFxuICAgICAgb3JpZ1Byb3AuYnlwYXNzZWQgPSB1bmRlZmluZWQ7XG4gICAgICBjaGVja1RyaWdnZXJzKCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlOyAvLyB3ZSdyZSB1bnN1Y2Nlc3NmdWwgZGVsZXRpbmcgdGhlIGJ5cGFzc2VkXG4gICAgfVxuICB9XG5cbiAgLy8gY2hlY2sgaWYgd2UgbmVlZCB0byBkZWxldGUgdGhlIGN1cnJlbnQgYnlwYXNzXG4gIGlmIChwcm9wLmRlbGV0ZUJ5cGFzcykge1xuICAgIC8vIHRoZW4gdGhpcyBwcm9wZXJ0eSBpcyBqdXN0IGhlcmUgdG8gaW5kaWNhdGUgd2UgbmVlZCB0byBkZWxldGVcbiAgICBpZiAoIW9yaWdQcm9wKSB7XG4gICAgICBjaGVja1RyaWdnZXJzKCk7XG4gICAgICByZXR1cm4gdHJ1ZTsgLy8gcHJvcGVydHkgaXMgYWxyZWFkeSBub3QgZGVmaW5lZFxuICAgIH0gZWxzZSBpZiAob3JpZ1Byb3AuYnlwYXNzKSB7XG4gICAgICAvLyB0aGVuIHJlcGxhY2UgdGhlIGJ5cGFzcyBwcm9wZXJ0eSB3aXRoIHRoZSBvcmlnaW5hbFxuICAgICAgLy8gYmVjYXVzZSB0aGUgYnlwYXNzZWQgcHJvcGVydHkgd2FzIGFscmVhZHkgYXBwbGllZCAoYW5kIHRoZXJlZm9yZSBwYXJzZWQpLCB3ZSBjYW4ganVzdCByZXBsYWNlIGl0IChubyByZWFwcGx5aW5nIG5lY2Vzc2FyeSlcbiAgICAgIHN0eWxlW3Byb3AubmFtZV0gPSBvcmlnUHJvcC5ieXBhc3NlZDtcbiAgICAgIGNoZWNrVHJpZ2dlcnMoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7IC8vIHdlJ3JlIHVuc3VjY2Vzc2Z1bCBkZWxldGluZyB0aGUgYnlwYXNzXG4gICAgfVxuICB9XG4gIHZhciBwcmludE1hcHBpbmdFcnIgPSBmdW5jdGlvbiBwcmludE1hcHBpbmdFcnIoKSB7XG4gICAgd2FybignRG8gbm90IGFzc2lnbiBtYXBwaW5ncyB0byBlbGVtZW50cyB3aXRob3V0IGNvcnJlc3BvbmRpbmcgZGF0YSAoaS5lLiBlbGUgYCcgKyBlbGUuaWQoKSArICdgIGhhcyBubyBtYXBwaW5nIGZvciBwcm9wZXJ0eSBgJyArIHByb3AubmFtZSArICdgIHdpdGggZGF0YSBmaWVsZCBgJyArIHByb3AuZmllbGQgKyAnYCk7IHRyeSBhIGBbJyArIHByb3AuZmllbGQgKyAnXWAgc2VsZWN0b3IgdG8gbGltaXQgc2NvcGUgdG8gZWxlbWVudHMgd2l0aCBgJyArIHByb3AuZmllbGQgKyAnYCBkZWZpbmVkJyk7XG4gIH07XG5cbiAgLy8gcHV0IHRoZSBwcm9wZXJ0eSBpbiB0aGUgc3R5bGUgb2JqZWN0c1xuICBzd2l0Y2ggKHByb3AubWFwcGVkKSB7XG4gICAgLy8gZmxhdHRlbiB0aGUgcHJvcGVydHkgaWYgbWFwcGVkXG4gICAgY2FzZSB0eXBlcy5tYXBEYXRhOlxuICAgICAge1xuICAgICAgICAvLyBmbGF0dGVuIHRoZSBmaWVsZCAoZS5nLiBkYXRhLmZvby5iYXIpXG4gICAgICAgIHZhciBmaWVsZHMgPSBwcm9wLmZpZWxkLnNwbGl0KCcuJyk7XG4gICAgICAgIHZhciBmaWVsZFZhbCA9IF9wLmRhdGE7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aCAmJiBmaWVsZFZhbDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGZpZWxkID0gZmllbGRzW2ldO1xuICAgICAgICAgIGZpZWxkVmFsID0gZmllbGRWYWxbZmllbGRdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWVsZFZhbCA9PSBudWxsKSB7XG4gICAgICAgICAgcHJpbnRNYXBwaW5nRXJyKCk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwZXJjZW50O1xuICAgICAgICBpZiAoIW51bWJlciQxKGZpZWxkVmFsKSkge1xuICAgICAgICAgIC8vIHRoZW4gZG9uJ3QgYXBwbHkgYW5kIGZhbGwgYmFjayBvbiB0aGUgZXhpc3Rpbmcgc3R5bGVcbiAgICAgICAgICB3YXJuKCdEbyBub3QgdXNlIGNvbnRpbnVvdXMgbWFwcGVycyB3aXRob3V0IHNwZWNpZnlpbmcgbnVtZXJpYyBkYXRhIChpLmUuIGAnICsgcHJvcC5maWVsZCArICc6ICcgKyBmaWVsZFZhbCArICdgIGZvciBgJyArIGVsZS5pZCgpICsgJ2AgaXMgbm9uLW51bWVyaWMpJyk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBmaWVsZFdpZHRoID0gcHJvcC5maWVsZE1heCAtIHByb3AuZmllbGRNaW47XG4gICAgICAgICAgaWYgKGZpZWxkV2lkdGggPT09IDApIHtcbiAgICAgICAgICAgIC8vIHNhZmV0eSBjaGVjayAtLSBub3Qgc3RyaWN0bHkgbmVjZXNzYXJ5IGFzIG5vIHByb3BzIG9mIHplcm8gcmFuZ2Ugc2hvdWxkIGJlIHBhc3NlZCBoZXJlXG4gICAgICAgICAgICBwZXJjZW50ID0gMDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVyY2VudCA9IChmaWVsZFZhbCAtIHByb3AuZmllbGRNaW4pIC8gZmllbGRXaWR0aDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBtYWtlIHN1cmUgdG8gYm91bmQgcGVyY2VudCB2YWx1ZVxuICAgICAgICBpZiAocGVyY2VudCA8IDApIHtcbiAgICAgICAgICBwZXJjZW50ID0gMDtcbiAgICAgICAgfSBlbHNlIGlmIChwZXJjZW50ID4gMSkge1xuICAgICAgICAgIHBlcmNlbnQgPSAxO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlLmNvbG9yKSB7XG4gICAgICAgICAgdmFyIHIxID0gcHJvcC52YWx1ZU1pblswXTtcbiAgICAgICAgICB2YXIgcjIgPSBwcm9wLnZhbHVlTWF4WzBdO1xuICAgICAgICAgIHZhciBnMSA9IHByb3AudmFsdWVNaW5bMV07XG4gICAgICAgICAgdmFyIGcyID0gcHJvcC52YWx1ZU1heFsxXTtcbiAgICAgICAgICB2YXIgYjEgPSBwcm9wLnZhbHVlTWluWzJdO1xuICAgICAgICAgIHZhciBiMiA9IHByb3AudmFsdWVNYXhbMl07XG4gICAgICAgICAgdmFyIGExID0gcHJvcC52YWx1ZU1pblszXSA9PSBudWxsID8gMSA6IHByb3AudmFsdWVNaW5bM107XG4gICAgICAgICAgdmFyIGEyID0gcHJvcC52YWx1ZU1heFszXSA9PSBudWxsID8gMSA6IHByb3AudmFsdWVNYXhbM107XG4gICAgICAgICAgdmFyIGNsciA9IFtNYXRoLnJvdW5kKHIxICsgKHIyIC0gcjEpICogcGVyY2VudCksIE1hdGgucm91bmQoZzEgKyAoZzIgLSBnMSkgKiBwZXJjZW50KSwgTWF0aC5yb3VuZChiMSArIChiMiAtIGIxKSAqIHBlcmNlbnQpLCBNYXRoLnJvdW5kKGExICsgKGEyIC0gYTEpICogcGVyY2VudCldO1xuICAgICAgICAgIGZsYXRQcm9wID0ge1xuICAgICAgICAgICAgLy8gY29sb3VycyBhcmUgc2ltcGxlLCBzbyBqdXN0IGNyZWF0ZSB0aGUgZmxhdCBwcm9wZXJ0eSBpbnN0ZWFkIG9mIGV4cGVuc2l2ZSBzdHJpbmcgcGFyc2luZ1xuICAgICAgICAgICAgYnlwYXNzOiBwcm9wLmJ5cGFzcyxcbiAgICAgICAgICAgIC8vIHdlJ3JlIGEgYnlwYXNzIGlmIHRoZSBtYXBwaW5nIHByb3BlcnR5IGlzIGEgYnlwYXNzXG4gICAgICAgICAgICBuYW1lOiBwcm9wLm5hbWUsXG4gICAgICAgICAgICB2YWx1ZTogY2xyLFxuICAgICAgICAgICAgc3RyVmFsdWU6ICdyZ2IoJyArIGNsclswXSArICcsICcgKyBjbHJbMV0gKyAnLCAnICsgY2xyWzJdICsgJyknXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlLm51bWJlcikge1xuICAgICAgICAgIHZhciBjYWxjVmFsdWUgPSBwcm9wLnZhbHVlTWluICsgKHByb3AudmFsdWVNYXggLSBwcm9wLnZhbHVlTWluKSAqIHBlcmNlbnQ7XG4gICAgICAgICAgZmxhdFByb3AgPSB0aGlzLnBhcnNlKHByb3AubmFtZSwgY2FsY1ZhbHVlLCBwcm9wLmJ5cGFzcywgZmxhdFByb3BNYXBwaW5nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIGNhbiBvbmx5IG1hcCB0byBjb2xvdXJzIGFuZCBudW1iZXJzXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFmbGF0UHJvcCkge1xuICAgICAgICAgIC8vIGlmIHdlIGNhbid0IGZsYXR0ZW4gdGhlIHByb3BlcnR5LCB0aGVuIGRvbid0IGFwcGx5IHRoZSBwcm9wZXJ0eSBhbmQgZmFsbCBiYWNrIG9uIHRoZSBleGlzdGluZyBzdHlsZVxuICAgICAgICAgIHByaW50TWFwcGluZ0VycigpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBmbGF0UHJvcC5tYXBwaW5nID0gcHJvcDsgLy8ga2VlcCBhIHJlZmVyZW5jZSB0byB0aGUgbWFwcGluZ1xuICAgICAgICBwcm9wID0gZmxhdFByb3A7IC8vIHRoZSBmbGF0dGVuZWQgKG1hcHBlZCkgcHJvcGVydHkgaXMgdGhlIG9uZSB3ZSB3YW50XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAvLyBkaXJlY3QgbWFwcGluZ1xuICAgIGNhc2UgdHlwZXMuZGF0YTpcbiAgICAgIHtcbiAgICAgICAgLy8gZmxhdHRlbiB0aGUgZmllbGQgKGUuZy4gZGF0YS5mb28uYmFyKVxuICAgICAgICB2YXIgX2ZpZWxkcyA9IHByb3AuZmllbGQuc3BsaXQoJy4nKTtcbiAgICAgICAgdmFyIF9maWVsZFZhbCA9IF9wLmRhdGE7XG4gICAgICAgIGZvciAodmFyIF9pMyA9IDA7IF9pMyA8IF9maWVsZHMubGVuZ3RoICYmIF9maWVsZFZhbDsgX2kzKyspIHtcbiAgICAgICAgICB2YXIgX2ZpZWxkID0gX2ZpZWxkc1tfaTNdO1xuICAgICAgICAgIF9maWVsZFZhbCA9IF9maWVsZFZhbFtfZmllbGRdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChfZmllbGRWYWwgIT0gbnVsbCkge1xuICAgICAgICAgIGZsYXRQcm9wID0gdGhpcy5wYXJzZShwcm9wLm5hbWUsIF9maWVsZFZhbCwgcHJvcC5ieXBhc3MsIGZsYXRQcm9wTWFwcGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFmbGF0UHJvcCkge1xuICAgICAgICAgIC8vIGlmIHdlIGNhbid0IGZsYXR0ZW4gdGhlIHByb3BlcnR5LCB0aGVuIGRvbid0IGFwcGx5IGFuZCBmYWxsIGJhY2sgb24gdGhlIGV4aXN0aW5nIHN0eWxlXG4gICAgICAgICAgcHJpbnRNYXBwaW5nRXJyKCk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZsYXRQcm9wLm1hcHBpbmcgPSBwcm9wOyAvLyBrZWVwIGEgcmVmZXJlbmNlIHRvIHRoZSBtYXBwaW5nXG4gICAgICAgIHByb3AgPSBmbGF0UHJvcDsgLy8gdGhlIGZsYXR0ZW5lZCAobWFwcGVkKSBwcm9wZXJ0eSBpcyB0aGUgb25lIHdlIHdhbnRcblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICBjYXNlIHR5cGVzLmZuOlxuICAgICAge1xuICAgICAgICB2YXIgZm4gPSBwcm9wLnZhbHVlO1xuICAgICAgICB2YXIgZm5SZXRWYWwgPSBwcm9wLmZuVmFsdWUgIT0gbnVsbCA/IHByb3AuZm5WYWx1ZSA6IGZuKGVsZSk7IC8vIGNoZWNrIGZvciBjYWNoZWQgdmFsdWUgYmVmb3JlIGNhbGxpbmcgZnVuY3Rpb25cblxuICAgICAgICBwcm9wLnByZXZGblZhbHVlID0gZm5SZXRWYWw7XG4gICAgICAgIGlmIChmblJldFZhbCA9PSBudWxsKSB7XG4gICAgICAgICAgd2FybignQ3VzdG9tIGZ1bmN0aW9uIG1hcHBlcnMgbWF5IG5vdCByZXR1cm4gbnVsbCAoaS5lLiBgJyArIHByb3AubmFtZSArICdgIGZvciBlbGUgYCcgKyBlbGUuaWQoKSArICdgIGlzIG51bGwpJyk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZsYXRQcm9wID0gdGhpcy5wYXJzZShwcm9wLm5hbWUsIGZuUmV0VmFsLCBwcm9wLmJ5cGFzcywgZmxhdFByb3BNYXBwaW5nKTtcbiAgICAgICAgaWYgKCFmbGF0UHJvcCkge1xuICAgICAgICAgIHdhcm4oJ0N1c3RvbSBmdW5jdGlvbiBtYXBwZXJzIG1heSBub3QgcmV0dXJuIGludmFsaWQgdmFsdWVzIGZvciB0aGUgcHJvcGVydHkgdHlwZSAoaS5lLiBgJyArIHByb3AubmFtZSArICdgIGZvciBlbGUgYCcgKyBlbGUuaWQoKSArICdgIGlzIGludmFsaWQpJyk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZsYXRQcm9wLm1hcHBpbmcgPSBjb3B5KHByb3ApOyAvLyBrZWVwIGEgcmVmZXJlbmNlIHRvIHRoZSBtYXBwaW5nXG4gICAgICAgIHByb3AgPSBmbGF0UHJvcDsgLy8gdGhlIGZsYXR0ZW5lZCAobWFwcGVkKSBwcm9wZXJ0eSBpcyB0aGUgb25lIHdlIHdhbnRcblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgIGJyZWFrO1xuICAgIC8vIGp1c3Qgc2V0IHRoZSBwcm9wZXJ0eVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICAvLyBub3QgYSB2YWxpZCBtYXBwaW5nXG4gIH1cblxuICAvLyBpZiB0aGUgcHJvcGVydHkgaXMgYSBieXBhc3MgcHJvcGVydHksIHRoZW4gbGluayB0aGUgcmVzdWx0YW50IHByb3BlcnR5IHRvIHRoZSBvcmlnaW5hbCBvbmVcbiAgaWYgKHByb3BJc0J5cGFzcykge1xuICAgIGlmIChvcmlnUHJvcElzQnlwYXNzKSB7XG4gICAgICAvLyB0aGVuIHRoaXMgYnlwYXNzIG92ZXJyaWRlcyB0aGUgZXhpc3Rpbmcgb25lXG4gICAgICBwcm9wLmJ5cGFzc2VkID0gb3JpZ1Byb3AuYnlwYXNzZWQ7IC8vIHN0ZWFsIGJ5cGFzc2VkIHByb3AgZnJvbSBvbGQgYnlwYXNzXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRoZW4gbGluayB0aGUgb3JpZyBwcm9wIHRvIHRoZSBuZXcgYnlwYXNzXG4gICAgICBwcm9wLmJ5cGFzc2VkID0gb3JpZ1Byb3A7XG4gICAgfVxuICAgIHN0eWxlW3Byb3AubmFtZV0gPSBwcm9wOyAvLyBhbmQgc2V0XG4gIH0gZWxzZSB7XG4gICAgLy8gcHJvcCBpcyBub3QgYnlwYXNzXG4gICAgaWYgKG9yaWdQcm9wSXNCeXBhc3MpIHtcbiAgICAgIC8vIHRoZW4ga2VlcCB0aGUgb3JpZyBwcm9wIChzaW5jZSBpdCdzIGEgYnlwYXNzKSBhbmQgbGluayB0byB0aGUgbmV3IHByb3BcbiAgICAgIG9yaWdQcm9wLmJ5cGFzc2VkID0gcHJvcDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdGhlbiBqdXN0IHJlcGxhY2UgdGhlIG9sZCBwcm9wIHdpdGggdGhlIG5ldyBvbmVcbiAgICAgIHN0eWxlW3Byb3AubmFtZV0gPSBwcm9wO1xuICAgIH1cbiAgfVxuICBjaGVja1RyaWdnZXJzKCk7XG4gIHJldHVybiB0cnVlO1xufTtcbnN0eWZuJDguY2xlYW5FbGVtZW50cyA9IGZ1bmN0aW9uIChlbGVzLCBrZWVwQnlwYXNzZXMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgdGhpcy5jbGVhclN0eWxlSGludHMoZWxlKTtcbiAgICBlbGUuZGlydHlDb21wb3VuZEJvdW5kc0NhY2hlKCk7XG4gICAgZWxlLmRpcnR5Qm91bmRpbmdCb3hDYWNoZSgpO1xuICAgIGlmICgha2VlcEJ5cGFzc2VzKSB7XG4gICAgICBlbGUuX3ByaXZhdGUuc3R5bGUgPSB7fTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHN0eWxlID0gZWxlLl9wcml2YXRlLnN0eWxlO1xuICAgICAgdmFyIHByb3BOYW1lcyA9IE9iamVjdC5rZXlzKHN0eWxlKTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcHJvcE5hbWVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBwcm9wTmFtZSA9IHByb3BOYW1lc1tqXTtcbiAgICAgICAgdmFyIGVsZVByb3AgPSBzdHlsZVtwcm9wTmFtZV07XG4gICAgICAgIGlmIChlbGVQcm9wICE9IG51bGwpIHtcbiAgICAgICAgICBpZiAoZWxlUHJvcC5ieXBhc3MpIHtcbiAgICAgICAgICAgIGVsZVByb3AuYnlwYXNzZWQgPSBudWxsO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdHlsZVtwcm9wTmFtZV0gPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuLy8gdXBkYXRlcyB0aGUgdmlzdWFsIHN0eWxlIGZvciBhbGwgZWxlbWVudHMgKHVzZWZ1bCBmb3IgbWFudWFsIHN0eWxlIG1vZGlmaWNhdGlvbiBhZnRlciBpbml0KVxuc3R5Zm4kOC51cGRhdGUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3k7XG4gIHZhciBlbGVzID0gY3kubXV0YWJsZUVsZW1lbnRzKCk7XG4gIGVsZXMudXBkYXRlU3R5bGUoKTtcbn07XG5cbi8vIGRpZmZQcm9wcyA6IHsgbmFtZSA9PiB7IHByZXYsIG5leHQgfSB9XG5zdHlmbiQ4LnVwZGF0ZVRyYW5zaXRpb25zID0gZnVuY3Rpb24gKGVsZSwgZGlmZlByb3BzKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICB2YXIgcHJvcHMgPSBlbGUucHN0eWxlKCd0cmFuc2l0aW9uLXByb3BlcnR5JykudmFsdWU7XG4gIHZhciBkdXJhdGlvbiA9IGVsZS5wc3R5bGUoJ3RyYW5zaXRpb24tZHVyYXRpb24nKS5wZlZhbHVlO1xuICB2YXIgZGVsYXkgPSBlbGUucHN0eWxlKCd0cmFuc2l0aW9uLWRlbGF5JykucGZWYWx1ZTtcbiAgaWYgKHByb3BzLmxlbmd0aCA+IDAgJiYgZHVyYXRpb24gPiAwKSB7XG4gICAgdmFyIHN0eWxlID0ge307XG5cbiAgICAvLyBidWlsZCB1cCB0aGUgc3R5bGUgdG8gYW5pbWF0ZSB0b3dhcmRzXG4gICAgdmFyIGFueVByZXYgPSBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcHJvcCA9IHByb3BzW2ldO1xuICAgICAgdmFyIHN0eVByb3AgPSBlbGUucHN0eWxlKHByb3ApO1xuICAgICAgdmFyIGRpZmZQcm9wID0gZGlmZlByb3BzW3Byb3BdO1xuICAgICAgaWYgKCFkaWZmUHJvcCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBwcmV2UHJvcCA9IGRpZmZQcm9wLnByZXY7XG4gICAgICB2YXIgZnJvbVByb3AgPSBwcmV2UHJvcDtcbiAgICAgIHZhciB0b1Byb3AgPSBkaWZmUHJvcC5uZXh0ICE9IG51bGwgPyBkaWZmUHJvcC5uZXh0IDogc3R5UHJvcDtcbiAgICAgIHZhciBkaWZmID0gZmFsc2U7XG4gICAgICB2YXIgaW5pdFZhbCA9IHZvaWQgMDtcbiAgICAgIHZhciBpbml0RHQgPSAwLjAwMDAwMTsgLy8gZGVsdGEgdGltZSAlIHZhbHVlIGZvciBpbml0VmFsIChhbGxvd3MgYW5pbWF0aW5nIG91dCBvZiBpbml0IHplcm8gb3BhY2l0eSlcblxuICAgICAgaWYgKCFmcm9tUHJvcCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gY29uc2lkZXIgcHggdmFsdWVzXG4gICAgICBpZiAobnVtYmVyJDEoZnJvbVByb3AucGZWYWx1ZSkgJiYgbnVtYmVyJDEodG9Qcm9wLnBmVmFsdWUpKSB7XG4gICAgICAgIGRpZmYgPSB0b1Byb3AucGZWYWx1ZSAtIGZyb21Qcm9wLnBmVmFsdWU7IC8vIG5vbnplcm8gaXMgdHJ1dGh5XG4gICAgICAgIGluaXRWYWwgPSBmcm9tUHJvcC5wZlZhbHVlICsgaW5pdER0ICogZGlmZjtcblxuICAgICAgICAvLyBjb25zaWRlciBudW1lcmljYWwgdmFsdWVzXG4gICAgICB9IGVsc2UgaWYgKG51bWJlciQxKGZyb21Qcm9wLnZhbHVlKSAmJiBudW1iZXIkMSh0b1Byb3AudmFsdWUpKSB7XG4gICAgICAgIGRpZmYgPSB0b1Byb3AudmFsdWUgLSBmcm9tUHJvcC52YWx1ZTsgLy8gbm9uemVybyBpcyB0cnV0aHlcbiAgICAgICAgaW5pdFZhbCA9IGZyb21Qcm9wLnZhbHVlICsgaW5pdER0ICogZGlmZjtcblxuICAgICAgICAvLyBjb25zaWRlciBjb2xvdXIgdmFsdWVzXG4gICAgICB9IGVsc2UgaWYgKGFycmF5KGZyb21Qcm9wLnZhbHVlKSAmJiBhcnJheSh0b1Byb3AudmFsdWUpKSB7XG4gICAgICAgIGRpZmYgPSBmcm9tUHJvcC52YWx1ZVswXSAhPT0gdG9Qcm9wLnZhbHVlWzBdIHx8IGZyb21Qcm9wLnZhbHVlWzFdICE9PSB0b1Byb3AudmFsdWVbMV0gfHwgZnJvbVByb3AudmFsdWVbMl0gIT09IHRvUHJvcC52YWx1ZVsyXTtcbiAgICAgICAgaW5pdFZhbCA9IGZyb21Qcm9wLnN0clZhbHVlO1xuICAgICAgfVxuXG4gICAgICAvLyB0aGUgcHJldmlvdXMgdmFsdWUgaXMgZ29vZCBmb3IgYW4gYW5pbWF0aW9uIG9ubHkgaWYgaXQncyBkaWZmZXJlbnRcbiAgICAgIGlmIChkaWZmKSB7XG4gICAgICAgIHN0eWxlW3Byb3BdID0gdG9Qcm9wLnN0clZhbHVlOyAvLyB0byB2YWxcbiAgICAgICAgdGhpcy5hcHBseUJ5cGFzcyhlbGUsIHByb3AsIGluaXRWYWwpOyAvLyBmcm9tIHZhbFxuICAgICAgICBhbnlQcmV2ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IC8vIGVuZCBpZiBwcm9wcyBhbGxvdyBhbmlcblxuICAgIC8vIGNhbid0IHRyYW5zaXRpb24gaWYgdGhlcmUncyBub3RoaW5nIHByZXZpb3VzIHRvIHRyYW5zaXRpb24gZnJvbVxuICAgIGlmICghYW55UHJldikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBfcC50cmFuc2l0aW9uaW5nID0gdHJ1ZTtcbiAgICBuZXcgUHJvbWlzZSQxKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICBpZiAoZGVsYXkgPiAwKSB7XG4gICAgICAgIGVsZS5kZWxheUFuaW1hdGlvbihkZWxheSkucGxheSgpLnByb21pc2UoKS50aGVuKHJlc29sdmUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfVxuICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGVsZS5hbmltYXRpb24oe1xuICAgICAgICBzdHlsZTogc3R5bGUsXG4gICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvbixcbiAgICAgICAgZWFzaW5nOiBlbGUucHN0eWxlKCd0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbicpLnZhbHVlLFxuICAgICAgICBxdWV1ZTogZmFsc2VcbiAgICAgIH0pLnBsYXkoKS5wcm9taXNlKCk7XG4gICAgfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBpZiggIWlzQnlwYXNzICl7XG4gICAgICBzZWxmLnJlbW92ZUJ5cGFzc2VzKGVsZSwgcHJvcHMpO1xuICAgICAgZWxlLmVtaXRBbmROb3RpZnkoJ3N0eWxlJyk7XG4gICAgICAvLyB9XG5cbiAgICAgIF9wLnRyYW5zaXRpb25pbmcgPSBmYWxzZTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChfcC50cmFuc2l0aW9uaW5nKSB7XG4gICAgdGhpcy5yZW1vdmVCeXBhc3NlcyhlbGUsIHByb3BzKTtcbiAgICBlbGUuZW1pdEFuZE5vdGlmeSgnc3R5bGUnKTtcbiAgICBfcC50cmFuc2l0aW9uaW5nID0gZmFsc2U7XG4gIH1cbn07XG5zdHlmbiQ4LmNoZWNrVHJpZ2dlciA9IGZ1bmN0aW9uIChlbGUsIG5hbWUsIGZyb21WYWx1ZSwgdG9WYWx1ZSwgZ2V0VHJpZ2dlciwgb25UcmlnZ2VyKSB7XG4gIHZhciBwcm9wID0gdGhpcy5wcm9wZXJ0aWVzW25hbWVdO1xuICB2YXIgdHJpZ2dlckNoZWNrID0gZ2V0VHJpZ2dlcihwcm9wKTtcbiAgaWYgKGVsZS5yZW1vdmVkKCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHRyaWdnZXJDaGVjayAhPSBudWxsICYmIHRyaWdnZXJDaGVjayhmcm9tVmFsdWUsIHRvVmFsdWUsIGVsZSkpIHtcbiAgICBvblRyaWdnZXIocHJvcCk7XG4gIH1cbn07XG5zdHlmbiQ4LmNoZWNrWk9yZGVyVHJpZ2dlciA9IGZ1bmN0aW9uIChlbGUsIG5hbWUsIGZyb21WYWx1ZSwgdG9WYWx1ZSkge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuICB0aGlzLmNoZWNrVHJpZ2dlcihlbGUsIG5hbWUsIGZyb21WYWx1ZSwgdG9WYWx1ZSwgZnVuY3Rpb24gKHByb3ApIHtcbiAgICByZXR1cm4gcHJvcC50cmlnZ2Vyc1pPcmRlcjtcbiAgfSwgZnVuY3Rpb24gKCkge1xuICAgIF90aGlzLl9wcml2YXRlLmN5Lm5vdGlmeSgnem9yZGVyJywgZWxlKTtcbiAgfSk7XG59O1xuc3R5Zm4kOC5jaGVja0JvdW5kc1RyaWdnZXIgPSBmdW5jdGlvbiAoZWxlLCBuYW1lLCBmcm9tVmFsdWUsIHRvVmFsdWUpIHtcbiAgdGhpcy5jaGVja1RyaWdnZXIoZWxlLCBuYW1lLCBmcm9tVmFsdWUsIHRvVmFsdWUsIGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgcmV0dXJuIHByb3AudHJpZ2dlcnNCb3VuZHM7XG4gIH0sIGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgZWxlLmRpcnR5Q29tcG91bmRCb3VuZHNDYWNoZSgpO1xuICAgIGVsZS5kaXJ0eUJvdW5kaW5nQm94Q2FjaGUoKTtcbiAgfSk7XG59O1xuc3R5Zm4kOC5jaGVja0Nvbm5lY3RlZEVkZ2VzQm91bmRzVHJpZ2dlciA9IGZ1bmN0aW9uIChlbGUsIG5hbWUsIGZyb21WYWx1ZSwgdG9WYWx1ZSkge1xuICB0aGlzLmNoZWNrVHJpZ2dlcihlbGUsIG5hbWUsIGZyb21WYWx1ZSwgdG9WYWx1ZSwgZnVuY3Rpb24gKHByb3ApIHtcbiAgICByZXR1cm4gcHJvcC50cmlnZ2Vyc0JvdW5kc09mQ29ubmVjdGVkRWRnZXM7XG4gIH0sIGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgZWxlLmNvbm5lY3RlZEVkZ2VzKCkuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgZWRnZS5kaXJ0eUJvdW5kaW5nQm94Q2FjaGUoKTtcbiAgICB9KTtcbiAgfSk7XG59O1xuc3R5Zm4kOC5jaGVja1BhcmFsbGVsRWRnZXNCb3VuZHNUcmlnZ2VyID0gZnVuY3Rpb24gKGVsZSwgbmFtZSwgZnJvbVZhbHVlLCB0b1ZhbHVlKSB7XG4gIHRoaXMuY2hlY2tUcmlnZ2VyKGVsZSwgbmFtZSwgZnJvbVZhbHVlLCB0b1ZhbHVlLCBmdW5jdGlvbiAocHJvcCkge1xuICAgIHJldHVybiBwcm9wLnRyaWdnZXJzQm91bmRzT2ZQYXJhbGxlbEVkZ2VzO1xuICB9LCBmdW5jdGlvbiAocHJvcCkge1xuICAgIGVsZS5wYXJhbGxlbEVkZ2VzKCkuZm9yRWFjaChmdW5jdGlvbiAocGxsRWRnZSkge1xuICAgICAgcGxsRWRnZS5kaXJ0eUJvdW5kaW5nQm94Q2FjaGUoKTtcbiAgICB9KTtcbiAgfSk7XG59O1xuc3R5Zm4kOC5jaGVja1RyaWdnZXJzID0gZnVuY3Rpb24gKGVsZSwgbmFtZSwgZnJvbVZhbHVlLCB0b1ZhbHVlKSB7XG4gIGVsZS5kaXJ0eVN0eWxlQ2FjaGUoKTtcbiAgdGhpcy5jaGVja1pPcmRlclRyaWdnZXIoZWxlLCBuYW1lLCBmcm9tVmFsdWUsIHRvVmFsdWUpO1xuICB0aGlzLmNoZWNrQm91bmRzVHJpZ2dlcihlbGUsIG5hbWUsIGZyb21WYWx1ZSwgdG9WYWx1ZSk7XG4gIHRoaXMuY2hlY2tDb25uZWN0ZWRFZGdlc0JvdW5kc1RyaWdnZXIoZWxlLCBuYW1lLCBmcm9tVmFsdWUsIHRvVmFsdWUpO1xuICB0aGlzLmNoZWNrUGFyYWxsZWxFZGdlc0JvdW5kc1RyaWdnZXIoZWxlLCBuYW1lLCBmcm9tVmFsdWUsIHRvVmFsdWUpO1xufTtcblxudmFyIHN0eWZuJDcgPSB7fTtcblxuLy8gYnlwYXNzZXMgYXJlIGFwcGxpZWQgdG8gYW4gZXhpc3Rpbmcgc3R5bGUgb24gYW4gZWxlbWVudCwgYW5kIGp1c3QgdGFja2VkIG9uIHRlbXBvcmFyaWx5XG4vLyByZXR1cm5zIHRydWUgaWZmIGFwcGxpY2F0aW9uIHdhcyBzdWNjZXNzZnVsIGZvciBhdCBsZWFzdCAxIHNwZWNpZmllZCBwcm9wZXJ0eVxuc3R5Zm4kNy5hcHBseUJ5cGFzcyA9IGZ1bmN0aW9uIChlbGVzLCBuYW1lLCB2YWx1ZSwgdXBkYXRlVHJhbnNpdGlvbnMpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgcHJvcHMgPSBbXTtcbiAgdmFyIGlzQnlwYXNzID0gdHJ1ZTtcblxuICAvLyBwdXQgYWxsIHRoZSBwcm9wZXJ0aWVzIChjYW4gc3BlY2lmeSBvbmUgb3IgbWFueSkgaW4gYW4gYXJyYXkgYWZ0ZXIgcGFyc2luZyB0aGVtXG4gIGlmIChuYW1lID09PSAnKicgfHwgbmFtZSA9PT0gJyoqJykge1xuICAgIC8vIGFwcGx5IHRvIGFsbCBwcm9wZXJ0eSBuYW1lc1xuXG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5wcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBwcm9wID0gc2VsZi5wcm9wZXJ0aWVzW2ldO1xuICAgICAgICB2YXIgX25hbWUgPSBwcm9wLm5hbWU7XG4gICAgICAgIHZhciBwYXJzZWRQcm9wID0gdGhpcy5wYXJzZShfbmFtZSwgdmFsdWUsIHRydWUpO1xuICAgICAgICBpZiAocGFyc2VkUHJvcCkge1xuICAgICAgICAgIHByb3BzLnB1c2gocGFyc2VkUHJvcCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAoc3RyaW5nKG5hbWUpKSB7XG4gICAgLy8gdGhlbiBwYXJzZSB0aGUgc2luZ2xlIHByb3BlcnR5XG4gICAgdmFyIF9wYXJzZWRQcm9wID0gdGhpcy5wYXJzZShuYW1lLCB2YWx1ZSwgdHJ1ZSk7XG4gICAgaWYgKF9wYXJzZWRQcm9wKSB7XG4gICAgICBwcm9wcy5wdXNoKF9wYXJzZWRQcm9wKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAocGxhaW5PYmplY3QobmFtZSkpIHtcbiAgICAvLyB0aGVuIHBhcnNlIGVhY2ggcHJvcGVydHlcbiAgICB2YXIgc3BlY2lmaWVkUHJvcHMgPSBuYW1lO1xuICAgIHVwZGF0ZVRyYW5zaXRpb25zID0gdmFsdWU7XG4gICAgdmFyIG5hbWVzID0gT2JqZWN0LmtleXMoc3BlY2lmaWVkUHJvcHMpO1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBuYW1lcy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBfbmFtZTIgPSBuYW1lc1tfaV07XG4gICAgICB2YXIgX3ZhbHVlID0gc3BlY2lmaWVkUHJvcHNbX25hbWUyXTtcbiAgICAgIGlmIChfdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyB0cnkgY2FtZWwgY2FzZSBuYW1lIHRvb1xuICAgICAgICBfdmFsdWUgPSBzcGVjaWZpZWRQcm9wc1tkYXNoMmNhbWVsKF9uYW1lMildO1xuICAgICAgfVxuICAgICAgaWYgKF92YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhciBfcGFyc2VkUHJvcDIgPSB0aGlzLnBhcnNlKF9uYW1lMiwgX3ZhbHVlLCB0cnVlKTtcbiAgICAgICAgaWYgKF9wYXJzZWRQcm9wMikge1xuICAgICAgICAgIHByb3BzLnB1c2goX3BhcnNlZFByb3AyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBjYW4ndCBkbyBhbnl0aGluZyB3aXRob3V0IHdlbGwgZGVmaW5lZCBwcm9wZXJ0aWVzXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gd2UndmUgZmFpbGVkIGlmIHRoZXJlIGFyZSBubyB2YWxpZCBwcm9wZXJ0aWVzXG4gIGlmIChwcm9wcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBub3csIGFwcGx5IHRoZSBieXBhc3MgcHJvcGVydGllcyBvbiB0aGUgZWxlbWVudHNcbiAgdmFyIHJldCA9IGZhbHNlOyAvLyByZXR1cm4gdHJ1ZSBpZiBhdCBsZWFzdCBvbmUgc3VjY2VzZnVsIGJ5cGFzcyBhcHBsaWVkXG4gIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IGVsZXMubGVuZ3RoOyBfaTIrKykge1xuICAgIC8vIGZvciBlYWNoIGVsZVxuICAgIHZhciBlbGUgPSBlbGVzW19pMl07XG4gICAgdmFyIGRpZmZQcm9wcyA9IHt9O1xuICAgIHZhciBkaWZmUHJvcCA9IHZvaWQgMDtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHByb3BzLmxlbmd0aDsgaisrKSB7XG4gICAgICAvLyBmb3IgZWFjaCBwcm9wXG4gICAgICB2YXIgX3Byb3AgPSBwcm9wc1tqXTtcbiAgICAgIGlmICh1cGRhdGVUcmFuc2l0aW9ucykge1xuICAgICAgICB2YXIgcHJldlByb3AgPSBlbGUucHN0eWxlKF9wcm9wLm5hbWUpO1xuICAgICAgICBkaWZmUHJvcCA9IGRpZmZQcm9wc1tfcHJvcC5uYW1lXSA9IHtcbiAgICAgICAgICBwcmV2OiBwcmV2UHJvcFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0ID0gdGhpcy5hcHBseVBhcnNlZFByb3BlcnR5KGVsZSwgY29weShfcHJvcCkpIHx8IHJldDtcbiAgICAgIGlmICh1cGRhdGVUcmFuc2l0aW9ucykge1xuICAgICAgICBkaWZmUHJvcC5uZXh0ID0gZWxlLnBzdHlsZShfcHJvcC5uYW1lKTtcbiAgICAgIH1cbiAgICB9IC8vIGZvciBwcm9wc1xuXG4gICAgaWYgKHJldCkge1xuICAgICAgdGhpcy51cGRhdGVTdHlsZUhpbnRzKGVsZSk7XG4gICAgfVxuICAgIGlmICh1cGRhdGVUcmFuc2l0aW9ucykge1xuICAgICAgdGhpcy51cGRhdGVUcmFuc2l0aW9ucyhlbGUsIGRpZmZQcm9wcywgaXNCeXBhc3MpO1xuICAgIH1cbiAgfSAvLyBmb3IgZWxlc1xuXG4gIHJldHVybiByZXQ7XG59O1xuXG4vLyBvbmx5IHVzZWZ1bCBpbiBzcGVjaWZpYyBjYXNlcyBsaWtlIGFuaW1hdGlvblxuc3R5Zm4kNy5vdmVycmlkZUJ5cGFzcyA9IGZ1bmN0aW9uIChlbGVzLCBuYW1lLCB2YWx1ZSkge1xuICBuYW1lID0gY2FtZWwyZGFzaChuYW1lKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgdmFyIHByb3AgPSBlbGUuX3ByaXZhdGUuc3R5bGVbbmFtZV07XG4gICAgdmFyIHR5cGUgPSB0aGlzLnByb3BlcnRpZXNbbmFtZV0udHlwZTtcbiAgICB2YXIgaXNDb2xvciA9IHR5cGUuY29sb3I7XG4gICAgdmFyIGlzTXVsdGkgPSB0eXBlLm11dGlwbGU7XG4gICAgdmFyIG9sZFZhbHVlID0gIXByb3AgPyBudWxsIDogcHJvcC5wZlZhbHVlICE9IG51bGwgPyBwcm9wLnBmVmFsdWUgOiBwcm9wLnZhbHVlO1xuICAgIGlmICghcHJvcCB8fCAhcHJvcC5ieXBhc3MpIHtcbiAgICAgIC8vIG5lZWQgYSBieXBhc3MgaWYgb25lIGRvZXNuJ3QgZXhpc3RcbiAgICAgIHRoaXMuYXBwbHlCeXBhc3MoZWxlLCBuYW1lLCB2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb3AudmFsdWUgPSB2YWx1ZTtcbiAgICAgIGlmIChwcm9wLnBmVmFsdWUgIT0gbnVsbCkge1xuICAgICAgICBwcm9wLnBmVmFsdWUgPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0NvbG9yKSB7XG4gICAgICAgIHByb3Auc3RyVmFsdWUgPSAncmdiKCcgKyB2YWx1ZS5qb2luKCcsJykgKyAnKSc7XG4gICAgICB9IGVsc2UgaWYgKGlzTXVsdGkpIHtcbiAgICAgICAgcHJvcC5zdHJWYWx1ZSA9IHZhbHVlLmpvaW4oJyAnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByb3Auc3RyVmFsdWUgPSAnJyArIHZhbHVlO1xuICAgICAgfVxuICAgICAgdGhpcy51cGRhdGVTdHlsZUhpbnRzKGVsZSk7XG4gICAgfVxuICAgIHRoaXMuY2hlY2tUcmlnZ2VycyhlbGUsIG5hbWUsIG9sZFZhbHVlLCB2YWx1ZSk7XG4gIH1cbn07XG5zdHlmbiQ3LnJlbW92ZUFsbEJ5cGFzc2VzID0gZnVuY3Rpb24gKGVsZXMsIHVwZGF0ZVRyYW5zaXRpb25zKSB7XG4gIHJldHVybiB0aGlzLnJlbW92ZUJ5cGFzc2VzKGVsZXMsIHRoaXMucHJvcGVydHlOYW1lcywgdXBkYXRlVHJhbnNpdGlvbnMpO1xufTtcbnN0eWZuJDcucmVtb3ZlQnlwYXNzZXMgPSBmdW5jdGlvbiAoZWxlcywgcHJvcHMsIHVwZGF0ZVRyYW5zaXRpb25zKSB7XG4gIHZhciBpc0J5cGFzcyA9IHRydWU7XG4gIGZvciAodmFyIGogPSAwOyBqIDwgZWxlcy5sZW5ndGg7IGorKykge1xuICAgIHZhciBlbGUgPSBlbGVzW2pdO1xuICAgIHZhciBkaWZmUHJvcHMgPSB7fTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbmFtZSA9IHByb3BzW2ldO1xuICAgICAgdmFyIHByb3AgPSB0aGlzLnByb3BlcnRpZXNbbmFtZV07XG4gICAgICB2YXIgcHJldlByb3AgPSBlbGUucHN0eWxlKHByb3AubmFtZSk7XG4gICAgICBpZiAoIXByZXZQcm9wIHx8ICFwcmV2UHJvcC5ieXBhc3MpIHtcbiAgICAgICAgLy8gaWYgYSBieXBhc3MgZG9lc24ndCBleGlzdCBmb3IgdGhlIHByb3AsIG5vdGhpbmcgbmVlZHMgdG8gYmUgcmVtb3ZlZFxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciB2YWx1ZSA9ICcnOyAvLyBlbXB0eSA9PiByZW1vdmUgYnlwYXNzXG4gICAgICB2YXIgcGFyc2VkUHJvcCA9IHRoaXMucGFyc2UobmFtZSwgdmFsdWUsIHRydWUpO1xuICAgICAgdmFyIGRpZmZQcm9wID0gZGlmZlByb3BzW3Byb3AubmFtZV0gPSB7XG4gICAgICAgIHByZXY6IHByZXZQcm9wXG4gICAgICB9O1xuICAgICAgdGhpcy5hcHBseVBhcnNlZFByb3BlcnR5KGVsZSwgcGFyc2VkUHJvcCk7XG4gICAgICBkaWZmUHJvcC5uZXh0ID0gZWxlLnBzdHlsZShwcm9wLm5hbWUpO1xuICAgIH0gLy8gZm9yIHByb3BzXG5cbiAgICB0aGlzLnVwZGF0ZVN0eWxlSGludHMoZWxlKTtcbiAgICBpZiAodXBkYXRlVHJhbnNpdGlvbnMpIHtcbiAgICAgIHRoaXMudXBkYXRlVHJhbnNpdGlvbnMoZWxlLCBkaWZmUHJvcHMsIGlzQnlwYXNzKTtcbiAgICB9XG4gIH0gLy8gZm9yIGVsZXNcbn07XG5cbnZhciBzdHlmbiQ2ID0ge307XG5cbi8vIGdldHMgd2hhdCBhbiBlbSBzaXplIGNvcnJlc3BvbmRzIHRvIGluIHBpeGVscyByZWxhdGl2ZSB0byBhIGRvbSBlbGVtZW50XG5zdHlmbiQ2LmdldEVtU2l6ZUluUGl4ZWxzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgcHggPSB0aGlzLmNvbnRhaW5lckNzcygnZm9udC1zaXplJyk7XG4gIGlmIChweCAhPSBudWxsKSB7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQocHgpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAxOyAvLyBmb3IgaGVhZGxlc3NcbiAgfVxufTtcblxuLy8gZ2V0cyBjc3MgcHJvcGVydHkgZnJvbSB0aGUgY29yZSBjb250YWluZXJcbnN0eWZuJDYuY29udGFpbmVyQ3NzID0gZnVuY3Rpb24gKHByb3BOYW1lKSB7XG4gIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3k7XG4gIHZhciBkb21FbGVtZW50ID0gY3kuY29udGFpbmVyKCk7XG4gIHZhciBjb250YWluZXJXaW5kb3cgPSBjeS53aW5kb3coKTtcbiAgaWYgKGNvbnRhaW5lcldpbmRvdyAmJiBkb21FbGVtZW50ICYmIGNvbnRhaW5lcldpbmRvdy5nZXRDb21wdXRlZFN0eWxlKSB7XG4gICAgcmV0dXJuIGNvbnRhaW5lcldpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvbUVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUocHJvcE5hbWUpO1xuICB9XG59O1xuXG52YXIgc3R5Zm4kNSA9IHt9O1xuXG4vLyBnZXRzIHRoZSByZW5kZXJlZCBzdHlsZSBmb3IgYW4gZWxlbWVudFxuc3R5Zm4kNS5nZXRSZW5kZXJlZFN0eWxlID0gZnVuY3Rpb24gKGVsZSwgcHJvcCkge1xuICBpZiAocHJvcCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0eWxlUHJvcGVydHlWYWx1ZShlbGUsIHByb3AsIHRydWUpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB0aGlzLmdldFJhd1N0eWxlKGVsZSwgdHJ1ZSk7XG4gIH1cbn07XG5cbi8vIGdldHMgdGhlIHJhdyBzdHlsZSBmb3IgYW4gZWxlbWVudFxuc3R5Zm4kNS5nZXRSYXdTdHlsZSA9IGZ1bmN0aW9uIChlbGUsIGlzUmVuZGVyZWRWYWwpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBlbGUgPSBlbGVbMF07IC8vIGluc3VyZSBpdCdzIGFuIGVsZW1lbnRcblxuICBpZiAoZWxlKSB7XG4gICAgdmFyIHJzdHlsZSA9IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5wcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcHJvcCA9IHNlbGYucHJvcGVydGllc1tpXTtcbiAgICAgIHZhciB2YWwgPSBzZWxmLmdldFN0eWxlUHJvcGVydHlWYWx1ZShlbGUsIHByb3AubmFtZSwgaXNSZW5kZXJlZFZhbCk7XG4gICAgICBpZiAodmFsICE9IG51bGwpIHtcbiAgICAgICAgcnN0eWxlW3Byb3AubmFtZV0gPSB2YWw7XG4gICAgICAgIHJzdHlsZVtkYXNoMmNhbWVsKHByb3AubmFtZSldID0gdmFsO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcnN0eWxlO1xuICB9XG59O1xuc3R5Zm4kNS5nZXRJbmRleGVkU3R5bGUgPSBmdW5jdGlvbiAoZWxlLCBwcm9wZXJ0eSwgc3VicHJvcGVydHksIGluZGV4KSB7XG4gIHZhciBwc3R5bGUgPSBlbGUucHN0eWxlKHByb3BlcnR5KVtzdWJwcm9wZXJ0eV1baW5kZXhdO1xuICByZXR1cm4gcHN0eWxlICE9IG51bGwgPyBwc3R5bGUgOiBlbGUuY3koKS5zdHlsZSgpLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eSlbc3VicHJvcGVydHldWzBdO1xufTtcbnN0eWZuJDUuZ2V0U3R5bGVQcm9wZXJ0eVZhbHVlID0gZnVuY3Rpb24gKGVsZSwgcHJvcE5hbWUsIGlzUmVuZGVyZWRWYWwpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBlbGUgPSBlbGVbMF07IC8vIGluc3VyZSBpdCdzIGFuIGVsZW1lbnRcblxuICBpZiAoZWxlKSB7XG4gICAgdmFyIHByb3AgPSBzZWxmLnByb3BlcnRpZXNbcHJvcE5hbWVdO1xuICAgIGlmIChwcm9wLmFsaWFzKSB7XG4gICAgICBwcm9wID0gcHJvcC5wb2ludHNUbztcbiAgICB9XG4gICAgdmFyIHR5cGUgPSBwcm9wLnR5cGU7XG4gICAgdmFyIHN0eWxlUHJvcCA9IGVsZS5wc3R5bGUocHJvcC5uYW1lKTtcbiAgICBpZiAoc3R5bGVQcm9wKSB7XG4gICAgICB2YXIgdmFsdWUgPSBzdHlsZVByb3AudmFsdWUsXG4gICAgICAgIHVuaXRzID0gc3R5bGVQcm9wLnVuaXRzLFxuICAgICAgICBzdHJWYWx1ZSA9IHN0eWxlUHJvcC5zdHJWYWx1ZTtcbiAgICAgIGlmIChpc1JlbmRlcmVkVmFsICYmIHR5cGUubnVtYmVyICYmIHZhbHVlICE9IG51bGwgJiYgbnVtYmVyJDEodmFsdWUpKSB7XG4gICAgICAgIHZhciB6b29tID0gZWxlLmN5KCkuem9vbSgpO1xuICAgICAgICB2YXIgZ2V0UmVuZGVyZWRWYWx1ZSA9IGZ1bmN0aW9uIGdldFJlbmRlcmVkVmFsdWUodmFsKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbCAqIHpvb207XG4gICAgICAgIH07XG4gICAgICAgIHZhciBnZXRWYWx1ZVN0cmluZ1dpdGhVbml0cyA9IGZ1bmN0aW9uIGdldFZhbHVlU3RyaW5nV2l0aFVuaXRzKHZhbCwgdW5pdHMpIHtcbiAgICAgICAgICByZXR1cm4gZ2V0UmVuZGVyZWRWYWx1ZSh2YWwpICsgdW5pdHM7XG4gICAgICAgIH07XG4gICAgICAgIHZhciBpc0FycmF5VmFsdWUgPSBhcnJheSh2YWx1ZSk7XG4gICAgICAgIHZhciBoYXZlVW5pdHMgPSBpc0FycmF5VmFsdWUgPyB1bml0cy5ldmVyeShmdW5jdGlvbiAodSkge1xuICAgICAgICAgIHJldHVybiB1ICE9IG51bGw7XG4gICAgICAgIH0pIDogdW5pdHMgIT0gbnVsbDtcbiAgICAgICAgaWYgKGhhdmVVbml0cykge1xuICAgICAgICAgIGlmIChpc0FycmF5VmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5tYXAoZnVuY3Rpb24gKHYsIGkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGdldFZhbHVlU3RyaW5nV2l0aFVuaXRzKHYsIHVuaXRzW2ldKTtcbiAgICAgICAgICAgIH0pLmpvaW4oJyAnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGdldFZhbHVlU3RyaW5nV2l0aFVuaXRzKHZhbHVlLCB1bml0cyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChpc0FycmF5VmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5tYXAoZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHN0cmluZyh2KSA/IHYgOiAnJyArIGdldFJlbmRlcmVkVmFsdWUodik7XG4gICAgICAgICAgICB9KS5qb2luKCcgJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAnJyArIGdldFJlbmRlcmVkVmFsdWUodmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzdHJWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgIHJldHVybiBzdHJWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn07XG5zdHlmbiQ1LmdldEFuaW1hdGlvblN0YXJ0U3R5bGUgPSBmdW5jdGlvbiAoZWxlLCBhbmlQcm9wcykge1xuICB2YXIgcnN0eWxlID0ge307XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYW5pUHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgYW5pUHJvcCA9IGFuaVByb3BzW2ldO1xuICAgIHZhciBuYW1lID0gYW5pUHJvcC5uYW1lO1xuICAgIHZhciBzdHlsZVByb3AgPSBlbGUucHN0eWxlKG5hbWUpO1xuICAgIGlmIChzdHlsZVByb3AgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gdGhlbiBtYWtlIGEgcHJvcCBvZiBpdFxuICAgICAgaWYgKHBsYWluT2JqZWN0KHN0eWxlUHJvcCkpIHtcbiAgICAgICAgc3R5bGVQcm9wID0gdGhpcy5wYXJzZShuYW1lLCBzdHlsZVByb3Auc3RyVmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3R5bGVQcm9wID0gdGhpcy5wYXJzZShuYW1lLCBzdHlsZVByb3ApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3R5bGVQcm9wKSB7XG4gICAgICByc3R5bGVbbmFtZV0gPSBzdHlsZVByb3A7XG4gICAgfVxuICB9XG4gIHJldHVybiByc3R5bGU7XG59O1xuc3R5Zm4kNS5nZXRQcm9wc0xpc3QgPSBmdW5jdGlvbiAocHJvcHNPYmopIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgcnN0eWxlID0gW107XG4gIHZhciBzdHlsZSA9IHByb3BzT2JqO1xuICB2YXIgcHJvcHMgPSBzZWxmLnByb3BlcnRpZXM7XG4gIGlmIChzdHlsZSkge1xuICAgIHZhciBuYW1lcyA9IE9iamVjdC5rZXlzKHN0eWxlKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbmFtZSA9IG5hbWVzW2ldO1xuICAgICAgdmFyIHZhbCA9IHN0eWxlW25hbWVdO1xuICAgICAgdmFyIHByb3AgPSBwcm9wc1tuYW1lXSB8fCBwcm9wc1tjYW1lbDJkYXNoKG5hbWUpXTtcbiAgICAgIHZhciBzdHlsZVByb3AgPSB0aGlzLnBhcnNlKHByb3AubmFtZSwgdmFsKTtcbiAgICAgIGlmIChzdHlsZVByb3ApIHtcbiAgICAgICAgcnN0eWxlLnB1c2goc3R5bGVQcm9wKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJzdHlsZTtcbn07XG5zdHlmbiQ1LmdldE5vbkRlZmF1bHRQcm9wZXJ0aWVzSGFzaCA9IGZ1bmN0aW9uIChlbGUsIHByb3BOYW1lcywgc2VlZCkge1xuICB2YXIgaGFzaCA9IHNlZWQuc2xpY2UoKTtcbiAgdmFyIG5hbWUsIHZhbCwgc3RyVmFsLCBjaFZhbDtcbiAgdmFyIGksIGo7XG4gIGZvciAoaSA9IDA7IGkgPCBwcm9wTmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICBuYW1lID0gcHJvcE5hbWVzW2ldO1xuICAgIHZhbCA9IGVsZS5wc3R5bGUobmFtZSwgZmFsc2UpO1xuICAgIGlmICh2YWwgPT0gbnVsbCkge1xuICAgICAgY29udGludWU7XG4gICAgfSBlbHNlIGlmICh2YWwucGZWYWx1ZSAhPSBudWxsKSB7XG4gICAgICBoYXNoWzBdID0gaGFzaEludChjaFZhbCwgaGFzaFswXSk7XG4gICAgICBoYXNoWzFdID0gaGFzaEludEFsdChjaFZhbCwgaGFzaFsxXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0clZhbCA9IHZhbC5zdHJWYWx1ZTtcbiAgICAgIGZvciAoaiA9IDA7IGogPCBzdHJWYWwubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgY2hWYWwgPSBzdHJWYWwuY2hhckNvZGVBdChqKTtcbiAgICAgICAgaGFzaFswXSA9IGhhc2hJbnQoY2hWYWwsIGhhc2hbMF0pO1xuICAgICAgICBoYXNoWzFdID0gaGFzaEludEFsdChjaFZhbCwgaGFzaFsxXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBoYXNoO1xufTtcbnN0eWZuJDUuZ2V0UHJvcGVydGllc0hhc2ggPSBzdHlmbiQ1LmdldE5vbkRlZmF1bHRQcm9wZXJ0aWVzSGFzaDtcblxudmFyIHN0eWZuJDQgPSB7fTtcbnN0eWZuJDQuYXBwZW5kRnJvbUpzb24gPSBmdW5jdGlvbiAoanNvbikge1xuICB2YXIgc3R5bGUgPSB0aGlzO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGpzb24ubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgY29udGV4dCA9IGpzb25baV07XG4gICAgdmFyIHNlbGVjdG9yID0gY29udGV4dC5zZWxlY3RvcjtcbiAgICB2YXIgcHJvcHMgPSBjb250ZXh0LnN0eWxlIHx8IGNvbnRleHQuY3NzO1xuICAgIHZhciBuYW1lcyA9IE9iamVjdC5rZXlzKHByb3BzKTtcbiAgICBzdHlsZS5zZWxlY3RvcihzZWxlY3Rvcik7IC8vIGFwcGx5IHNlbGVjdG9yXG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG5hbWVzLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgbmFtZSA9IG5hbWVzW2pdO1xuICAgICAgdmFyIHZhbHVlID0gcHJvcHNbbmFtZV07XG4gICAgICBzdHlsZS5jc3MobmFtZSwgdmFsdWUpOyAvLyBhcHBseSBwcm9wZXJ0eVxuICAgIH1cbiAgfVxuICByZXR1cm4gc3R5bGU7XG59O1xuXG4vLyBhY2Nlc3NpYmxlIGN5LnN0eWxlKCkgZnVuY3Rpb25cbnN0eWZuJDQuZnJvbUpzb24gPSBmdW5jdGlvbiAoanNvbikge1xuICB2YXIgc3R5bGUgPSB0aGlzO1xuICBzdHlsZS5yZXNldFRvRGVmYXVsdCgpO1xuICBzdHlsZS5hcHBlbmRGcm9tSnNvbihqc29uKTtcbiAgcmV0dXJuIHN0eWxlO1xufTtcblxuLy8gZ2V0IGpzb24gZnJvbSBjeS5zdHlsZSgpIGFwaVxuc3R5Zm4kNC5qc29uID0gZnVuY3Rpb24gKCkge1xuICB2YXIganNvbiA9IFtdO1xuICBmb3IgKHZhciBpID0gdGhpcy5kZWZhdWx0TGVuZ3RoOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjeHQgPSB0aGlzW2ldO1xuICAgIHZhciBzZWxlY3RvciA9IGN4dC5zZWxlY3RvcjtcbiAgICB2YXIgcHJvcHMgPSBjeHQucHJvcGVydGllcztcbiAgICB2YXIgY3NzID0ge307XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBwcm9wcy5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIHByb3AgPSBwcm9wc1tqXTtcbiAgICAgIGNzc1twcm9wLm5hbWVdID0gcHJvcC5zdHJWYWx1ZTtcbiAgICB9XG4gICAganNvbi5wdXNoKHtcbiAgICAgIHNlbGVjdG9yOiAhc2VsZWN0b3IgPyAnY29yZScgOiBzZWxlY3Rvci50b1N0cmluZygpLFxuICAgICAgc3R5bGU6IGNzc1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBqc29uO1xufTtcblxudmFyIHN0eWZuJDMgPSB7fTtcbnN0eWZuJDMuYXBwZW5kRnJvbVN0cmluZyA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgc3R5bGUgPSB0aGlzO1xuICB2YXIgcmVtYWluaW5nID0gJycgKyBzdHJpbmc7XG4gIHZhciBzZWxBbmRCbG9ja1N0cjtcbiAgdmFyIGJsb2NrUmVtO1xuICB2YXIgcHJvcEFuZFZhbFN0cjtcblxuICAvLyByZW1vdmUgY29tbWVudHMgZnJvbSB0aGUgc3R5bGUgc3RyaW5nXG4gIHJlbWFpbmluZyA9IHJlbWFpbmluZy5yZXBsYWNlKC9bL11bKl0oXFxzfC4pKz9bKl1bL10vZywgJycpO1xuICBmdW5jdGlvbiByZW1vdmVTZWxBbmRCbG9ja0Zyb21SZW1haW5pbmcoKSB7XG4gICAgLy8gcmVtb3ZlIHRoZSBwYXJzZWQgc2VsZWN0b3IgYW5kIGJsb2NrIGZyb20gdGhlIHJlbWFpbmluZyB0ZXh0IHRvIHBhcnNlXG4gICAgaWYgKHJlbWFpbmluZy5sZW5ndGggPiBzZWxBbmRCbG9ja1N0ci5sZW5ndGgpIHtcbiAgICAgIHJlbWFpbmluZyA9IHJlbWFpbmluZy5zdWJzdHIoc2VsQW5kQmxvY2tTdHIubGVuZ3RoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVtYWluaW5nID0gJyc7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHJlbW92ZVByb3BBbmRWYWxGcm9tUmVtKCkge1xuICAgIC8vIHJlbW92ZSB0aGUgcGFyc2VkIHByb3BlcnR5IGFuZCB2YWx1ZSBmcm9tIHRoZSByZW1haW5pbmcgYmxvY2sgdGV4dCB0byBwYXJzZVxuICAgIGlmIChibG9ja1JlbS5sZW5ndGggPiBwcm9wQW5kVmFsU3RyLmxlbmd0aCkge1xuICAgICAgYmxvY2tSZW0gPSBibG9ja1JlbS5zdWJzdHIocHJvcEFuZFZhbFN0ci5sZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBibG9ja1JlbSA9ICcnO1xuICAgIH1cbiAgfVxuICBmb3IgKDs7KSB7XG4gICAgdmFyIG5vdGhpbmdMZWZ0VG9QYXJzZSA9IHJlbWFpbmluZy5tYXRjaCgvXlxccyokLyk7XG4gICAgaWYgKG5vdGhpbmdMZWZ0VG9QYXJzZSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHZhciBzZWxBbmRCbG9jayA9IHJlbWFpbmluZy5tYXRjaCgvXlxccyooKD86LnxcXHMpKz8pXFxzKlxceygoPzoufFxccykrPylcXH0vKTtcbiAgICBpZiAoIXNlbEFuZEJsb2NrKSB7XG4gICAgICB3YXJuKCdIYWx0aW5nIHN0eWxlc2hlZXQgcGFyc2luZzogU3RyaW5nIHN0eWxlc2hlZXQgY29udGFpbnMgbW9yZSB0byBwYXJzZSBidXQgbm8gc2VsZWN0b3IgYW5kIGJsb2NrIGZvdW5kIGluOiAnICsgcmVtYWluaW5nKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBzZWxBbmRCbG9ja1N0ciA9IHNlbEFuZEJsb2NrWzBdO1xuXG4gICAgLy8gcGFyc2UgdGhlIHNlbGVjdG9yXG4gICAgdmFyIHNlbGVjdG9yU3RyID0gc2VsQW5kQmxvY2tbMV07XG4gICAgaWYgKHNlbGVjdG9yU3RyICE9PSAnY29yZScpIHtcbiAgICAgIHZhciBzZWxlY3RvciA9IG5ldyBTZWxlY3RvcihzZWxlY3RvclN0cik7XG4gICAgICBpZiAoc2VsZWN0b3IuaW52YWxpZCkge1xuICAgICAgICB3YXJuKCdTa2lwcGluZyBwYXJzaW5nIG9mIGJsb2NrOiBJbnZhbGlkIHNlbGVjdG9yIGZvdW5kIGluIHN0cmluZyBzdHlsZXNoZWV0OiAnICsgc2VsZWN0b3JTdHIpO1xuXG4gICAgICAgIC8vIHNraXAgdGhpcyBzZWxlY3RvciBhbmQgYmxvY2tcbiAgICAgICAgcmVtb3ZlU2VsQW5kQmxvY2tGcm9tUmVtYWluaW5nKCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHBhcnNlIHRoZSBibG9jayBvZiBwcm9wZXJ0aWVzIGFuZCB2YWx1ZXNcbiAgICB2YXIgYmxvY2tTdHIgPSBzZWxBbmRCbG9ja1syXTtcbiAgICB2YXIgaW52YWxpZEJsb2NrID0gZmFsc2U7XG4gICAgYmxvY2tSZW0gPSBibG9ja1N0cjtcbiAgICB2YXIgcHJvcHMgPSBbXTtcbiAgICBmb3IgKDs7KSB7XG4gICAgICB2YXIgX25vdGhpbmdMZWZ0VG9QYXJzZSA9IGJsb2NrUmVtLm1hdGNoKC9eXFxzKiQvKTtcbiAgICAgIGlmIChfbm90aGluZ0xlZnRUb1BhcnNlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgdmFyIHByb3BBbmRWYWwgPSBibG9ja1JlbS5tYXRjaCgvXlxccyooLis/KVxccyo6XFxzKiguKz8pKD86XFxzKjt8XFxzKiQpLyk7XG4gICAgICBpZiAoIXByb3BBbmRWYWwpIHtcbiAgICAgICAgd2FybignU2tpcHBpbmcgcGFyc2luZyBvZiBibG9jazogSW52YWxpZCBmb3JtYXR0aW5nIG9mIHN0eWxlIHByb3BlcnR5IGFuZCB2YWx1ZSBkZWZpbml0aW9ucyBmb3VuZCBpbjonICsgYmxvY2tTdHIpO1xuICAgICAgICBpbnZhbGlkQmxvY2sgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHByb3BBbmRWYWxTdHIgPSBwcm9wQW5kVmFsWzBdO1xuICAgICAgdmFyIHByb3BTdHIgPSBwcm9wQW5kVmFsWzFdO1xuICAgICAgdmFyIHZhbFN0ciA9IHByb3BBbmRWYWxbMl07XG4gICAgICB2YXIgcHJvcCA9IHNlbGYucHJvcGVydGllc1twcm9wU3RyXTtcbiAgICAgIGlmICghcHJvcCkge1xuICAgICAgICB3YXJuKCdTa2lwcGluZyBwcm9wZXJ0eTogSW52YWxpZCBwcm9wZXJ0eSBuYW1lIGluOiAnICsgcHJvcEFuZFZhbFN0cik7XG5cbiAgICAgICAgLy8gc2tpcCB0aGlzIHByb3BlcnR5IGluIHRoZSBibG9ja1xuICAgICAgICByZW1vdmVQcm9wQW5kVmFsRnJvbVJlbSgpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBwYXJzZWRQcm9wID0gc3R5bGUucGFyc2UocHJvcFN0ciwgdmFsU3RyKTtcbiAgICAgIGlmICghcGFyc2VkUHJvcCkge1xuICAgICAgICB3YXJuKCdTa2lwcGluZyBwcm9wZXJ0eTogSW52YWxpZCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluOiAnICsgcHJvcEFuZFZhbFN0cik7XG5cbiAgICAgICAgLy8gc2tpcCB0aGlzIHByb3BlcnR5IGluIHRoZSBibG9ja1xuICAgICAgICByZW1vdmVQcm9wQW5kVmFsRnJvbVJlbSgpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHByb3BzLnB1c2goe1xuICAgICAgICBuYW1lOiBwcm9wU3RyLFxuICAgICAgICB2YWw6IHZhbFN0clxuICAgICAgfSk7XG4gICAgICByZW1vdmVQcm9wQW5kVmFsRnJvbVJlbSgpO1xuICAgIH1cbiAgICBpZiAoaW52YWxpZEJsb2NrKSB7XG4gICAgICByZW1vdmVTZWxBbmRCbG9ja0Zyb21SZW1haW5pbmcoKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIC8vIHB1dCB0aGUgcGFyc2VkIGJsb2NrIGluIHRoZSBzdHlsZVxuICAgIHN0eWxlLnNlbGVjdG9yKHNlbGVjdG9yU3RyKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgX3Byb3AgPSBwcm9wc1tpXTtcbiAgICAgIHN0eWxlLmNzcyhfcHJvcC5uYW1lLCBfcHJvcC52YWwpO1xuICAgIH1cbiAgICByZW1vdmVTZWxBbmRCbG9ja0Zyb21SZW1haW5pbmcoKTtcbiAgfVxuICByZXR1cm4gc3R5bGU7XG59O1xuc3R5Zm4kMy5mcm9tU3RyaW5nID0gZnVuY3Rpb24gKHN0cmluZykge1xuICB2YXIgc3R5bGUgPSB0aGlzO1xuICBzdHlsZS5yZXNldFRvRGVmYXVsdCgpO1xuICBzdHlsZS5hcHBlbmRGcm9tU3RyaW5nKHN0cmluZyk7XG4gIHJldHVybiBzdHlsZTtcbn07XG5cbnZhciBzdHlmbiQyID0ge307XG4oZnVuY3Rpb24gKCkge1xuICB2YXIgbnVtYmVyJDEgPSBudW1iZXI7XG4gIHZhciByZ2JhID0gcmdiYU5vQmFja1JlZnM7XG4gIHZhciBoc2xhID0gaHNsYU5vQmFja1JlZnM7XG4gIHZhciBoZXgzJDEgPSBoZXgzO1xuICB2YXIgaGV4NiQxID0gaGV4NjtcbiAgdmFyIGRhdGEgPSBmdW5jdGlvbiBkYXRhKHByZWZpeCkge1xuICAgIHJldHVybiAnXicgKyBwcmVmaXggKyAnXFxcXHMqXFxcXChcXFxccyooW1xcXFx3XFxcXC5dKylcXFxccypcXFxcKSQnO1xuICB9O1xuICB2YXIgbWFwRGF0YSA9IGZ1bmN0aW9uIG1hcERhdGEocHJlZml4KSB7XG4gICAgdmFyIG1hcEFyZyA9IG51bWJlciQxICsgJ3xcXFxcdyt8JyArIHJnYmEgKyAnfCcgKyBoc2xhICsgJ3wnICsgaGV4MyQxICsgJ3wnICsgaGV4NiQxO1xuICAgIHJldHVybiAnXicgKyBwcmVmaXggKyAnXFxcXHMqXFxcXCgoW1xcXFx3XFxcXC5dKylcXFxccypcXFxcLFxcXFxzKignICsgbnVtYmVyJDEgKyAnKVxcXFxzKlxcXFwsXFxcXHMqKCcgKyBudW1iZXIkMSArICcpXFxcXHMqLFxcXFxzKignICsgbWFwQXJnICsgJylcXFxccypcXFxcLFxcXFxzKignICsgbWFwQXJnICsgJylcXFxcKSQnO1xuICB9O1xuICB2YXIgdXJsUmVnZXhlcyA9IFsnXnVybFxcXFxzKlxcXFwoXFxcXHMqW1xcJ1wiXT8oLis/KVtcXCdcIl0/XFxcXHMqXFxcXCkkJywgJ14obm9uZSkkJywgJ14oLispJCddO1xuXG4gIC8vIGVhY2ggdmlzdWFsIHN0eWxlIHByb3BlcnR5IGhhcyBhIHR5cGUgYW5kIG5lZWRzIHRvIGJlIHZhbGlkYXRlZCBhY2NvcmRpbmcgdG8gaXRcbiAgc3R5Zm4kMi50eXBlcyA9IHtcbiAgICB0aW1lOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICBtaW46IDAsXG4gICAgICB1bml0czogJ3N8bXMnLFxuICAgICAgaW1wbGljaXRVbml0czogJ21zJ1xuICAgIH0sXG4gICAgcGVyY2VudDoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgbWluOiAwLFxuICAgICAgbWF4OiAxMDAsXG4gICAgICB1bml0czogJyUnLFxuICAgICAgaW1wbGljaXRVbml0czogJyUnXG4gICAgfSxcbiAgICBwZXJjZW50YWdlczoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgbWluOiAwLFxuICAgICAgbWF4OiAxMDAsXG4gICAgICB1bml0czogJyUnLFxuICAgICAgaW1wbGljaXRVbml0czogJyUnLFxuICAgICAgbXVsdGlwbGU6IHRydWVcbiAgICB9LFxuICAgIHplcm9PbmVOdW1iZXI6IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIG1pbjogMCxcbiAgICAgIG1heDogMSxcbiAgICAgIHVuaXRsZXNzOiB0cnVlXG4gICAgfSxcbiAgICB6ZXJvT25lTnVtYmVyczoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgbWluOiAwLFxuICAgICAgbWF4OiAxLFxuICAgICAgdW5pdGxlc3M6IHRydWUsXG4gICAgICBtdWx0aXBsZTogdHJ1ZVxuICAgIH0sXG4gICAgbk9uZU9uZU51bWJlcjoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgbWluOiAtMSxcbiAgICAgIG1heDogMSxcbiAgICAgIHVuaXRsZXNzOiB0cnVlXG4gICAgfSxcbiAgICBub25OZWdhdGl2ZUludDoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgbWluOiAwLFxuICAgICAgaW50ZWdlcjogdHJ1ZSxcbiAgICAgIHVuaXRsZXNzOiB0cnVlXG4gICAgfSxcbiAgICBub25OZWdhdGl2ZU51bWJlcjoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgbWluOiAwLFxuICAgICAgdW5pdGxlc3M6IHRydWVcbiAgICB9LFxuICAgIHBvc2l0aW9uOiB7XG4gICAgICBlbnVtczogWydwYXJlbnQnLCAnb3JpZ2luJ11cbiAgICB9LFxuICAgIG5vZGVTaXplOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICBtaW46IDAsXG4gICAgICBlbnVtczogWydsYWJlbCddXG4gICAgfSxcbiAgICBudW1iZXI6IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIHVuaXRsZXNzOiB0cnVlXG4gICAgfSxcbiAgICBudW1iZXJzOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICB1bml0bGVzczogdHJ1ZSxcbiAgICAgIG11bHRpcGxlOiB0cnVlXG4gICAgfSxcbiAgICBwb3NpdGl2ZU51bWJlcjoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgdW5pdGxlc3M6IHRydWUsXG4gICAgICBtaW46IDAsXG4gICAgICBzdHJpY3RNaW46IHRydWVcbiAgICB9LFxuICAgIHNpemU6IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIG1pbjogMFxuICAgIH0sXG4gICAgYmlkaXJlY3Rpb25hbFNpemU6IHtcbiAgICAgIG51bWJlcjogdHJ1ZVxuICAgIH0sXG4gICAgLy8gYWxsb3dzIG5lZ2F0aXZlXG4gICAgYmlkaXJlY3Rpb25hbFNpemVNYXliZVBlcmNlbnQ6IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIGFsbG93UGVyY2VudDogdHJ1ZVxuICAgIH0sXG4gICAgLy8gYWxsb3dzIG5lZ2F0aXZlXG4gICAgYmlkaXJlY3Rpb25hbFNpemVzOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICBtdWx0aXBsZTogdHJ1ZVxuICAgIH0sXG4gICAgLy8gYWxsb3dzIG5lZ2F0aXZlXG4gICAgc2l6ZU1heWJlUGVyY2VudDoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgbWluOiAwLFxuICAgICAgYWxsb3dQZXJjZW50OiB0cnVlXG4gICAgfSxcbiAgICBheGlzRGlyZWN0aW9uOiB7XG4gICAgICBlbnVtczogWydob3Jpem9udGFsJywgJ2xlZnR3YXJkJywgJ3JpZ2h0d2FyZCcsICd2ZXJ0aWNhbCcsICd1cHdhcmQnLCAnZG93bndhcmQnLCAnYXV0byddXG4gICAgfSxcbiAgICBheGlzRGlyZWN0aW9uRXhwbGljaXQ6IHtcbiAgICAgIGVudW1zOiBbJ2xlZnR3YXJkJywgJ3JpZ2h0d2FyZCcsICd1cHdhcmQnLCAnZG93bndhcmQnXVxuICAgIH0sXG4gICAgYXhpc0RpcmVjdGlvblByaW1hcnk6IHtcbiAgICAgIGVudW1zOiBbJ2hvcml6b250YWwnLCAndmVydGljYWwnXVxuICAgIH0sXG4gICAgcGFkZGluZ1JlbGF0aXZlVG86IHtcbiAgICAgIGVudW1zOiBbJ3dpZHRoJywgJ2hlaWdodCcsICdhdmVyYWdlJywgJ21pbicsICdtYXgnXVxuICAgIH0sXG4gICAgYmdXSDoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgbWluOiAwLFxuICAgICAgYWxsb3dQZXJjZW50OiB0cnVlLFxuICAgICAgZW51bXM6IFsnYXV0byddLFxuICAgICAgbXVsdGlwbGU6IHRydWVcbiAgICB9LFxuICAgIGJnUG9zOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICBhbGxvd1BlcmNlbnQ6IHRydWUsXG4gICAgICBtdWx0aXBsZTogdHJ1ZVxuICAgIH0sXG4gICAgYmdSZWxhdGl2ZVRvOiB7XG4gICAgICBlbnVtczogWydpbm5lcicsICdpbmNsdWRlLXBhZGRpbmcnXSxcbiAgICAgIG11bHRpcGxlOiB0cnVlXG4gICAgfSxcbiAgICBiZ1JlcGVhdDoge1xuICAgICAgZW51bXM6IFsncmVwZWF0JywgJ3JlcGVhdC14JywgJ3JlcGVhdC15JywgJ25vLXJlcGVhdCddLFxuICAgICAgbXVsdGlwbGU6IHRydWVcbiAgICB9LFxuICAgIGJnRml0OiB7XG4gICAgICBlbnVtczogWydub25lJywgJ2NvbnRhaW4nLCAnY292ZXInXSxcbiAgICAgIG11bHRpcGxlOiB0cnVlXG4gICAgfSxcbiAgICBiZ0Nyb3NzT3JpZ2luOiB7XG4gICAgICBlbnVtczogWydhbm9ueW1vdXMnLCAndXNlLWNyZWRlbnRpYWxzJywgJ251bGwnXSxcbiAgICAgIG11bHRpcGxlOiB0cnVlXG4gICAgfSxcbiAgICBiZ0NsaXA6IHtcbiAgICAgIGVudW1zOiBbJ25vbmUnLCAnbm9kZSddLFxuICAgICAgbXVsdGlwbGU6IHRydWVcbiAgICB9LFxuICAgIGJnQ29udGFpbm1lbnQ6IHtcbiAgICAgIGVudW1zOiBbJ2luc2lkZScsICdvdmVyJ10sXG4gICAgICBtdWx0aXBsZTogdHJ1ZVxuICAgIH0sXG4gICAgYm94U2VsZWN0aW9uOiB7XG4gICAgICBlbnVtczogWydjb250YWluJywgJ292ZXJsYXAnLCAnbm9uZSddXG4gICAgfSxcbiAgICBjb2xvcjoge1xuICAgICAgY29sb3I6IHRydWVcbiAgICB9LFxuICAgIGNvbG9yczoge1xuICAgICAgY29sb3I6IHRydWUsXG4gICAgICBtdWx0aXBsZTogdHJ1ZVxuICAgIH0sXG4gICAgZmlsbDoge1xuICAgICAgZW51bXM6IFsnc29saWQnLCAnbGluZWFyLWdyYWRpZW50JywgJ3JhZGlhbC1ncmFkaWVudCddXG4gICAgfSxcbiAgICBib29sOiB7XG4gICAgICBlbnVtczogWyd5ZXMnLCAnbm8nXVxuICAgIH0sXG4gICAgYm9vbHM6IHtcbiAgICAgIGVudW1zOiBbJ3llcycsICdubyddLFxuICAgICAgbXVsdGlwbGU6IHRydWVcbiAgICB9LFxuICAgIGxpbmVTdHlsZToge1xuICAgICAgZW51bXM6IFsnc29saWQnLCAnZG90dGVkJywgJ2Rhc2hlZCddXG4gICAgfSxcbiAgICBsaW5lQ2FwOiB7XG4gICAgICBlbnVtczogWydidXR0JywgJ3JvdW5kJywgJ3NxdWFyZSddXG4gICAgfSxcbiAgICBsaW5lUG9zaXRpb246IHtcbiAgICAgIGVudW1zOiBbJ2NlbnRlcicsICdpbnNpZGUnLCAnb3V0c2lkZSddXG4gICAgfSxcbiAgICBsaW5lSm9pbjoge1xuICAgICAgZW51bXM6IFsncm91bmQnLCAnYmV2ZWwnLCAnbWl0ZXInXVxuICAgIH0sXG4gICAgYm9yZGVyU3R5bGU6IHtcbiAgICAgIGVudW1zOiBbJ3NvbGlkJywgJ2RvdHRlZCcsICdkYXNoZWQnLCAnZG91YmxlJ11cbiAgICB9LFxuICAgIGN1cnZlU3R5bGU6IHtcbiAgICAgIGVudW1zOiBbJ2JlemllcicsICd1bmJ1bmRsZWQtYmV6aWVyJywgJ2hheXN0YWNrJywgJ3NlZ21lbnRzJywgJ3N0cmFpZ2h0JywgJ3N0cmFpZ2h0LXRyaWFuZ2xlJywgJ3RheGknLCAncm91bmQtc2VnbWVudHMnLCAncm91bmQtdGF4aSddXG4gICAgfSxcbiAgICByYWRpdXNUeXBlOiB7XG4gICAgICBlbnVtczogWydhcmMtcmFkaXVzJywgJ2luZmx1ZW5jZS1yYWRpdXMnXSxcbiAgICAgIG11bHRpcGxlOiB0cnVlXG4gICAgfSxcbiAgICBmb250RmFtaWx5OiB7XG4gICAgICByZWdleDogJ14oW1xcXFx3LSBcXFxcXCJdKyg/OlxcXFxzKixcXFxccypbXFxcXHctIFxcXFxcIl0rKSopJCdcbiAgICB9LFxuICAgIGZvbnRTdHlsZToge1xuICAgICAgZW51bXM6IFsnaXRhbGljJywgJ25vcm1hbCcsICdvYmxpcXVlJ11cbiAgICB9LFxuICAgIGZvbnRXZWlnaHQ6IHtcbiAgICAgIGVudW1zOiBbJ25vcm1hbCcsICdib2xkJywgJ2JvbGRlcicsICdsaWdodGVyJywgJzEwMCcsICcyMDAnLCAnMzAwJywgJzQwMCcsICc1MDAnLCAnNjAwJywgJzgwMCcsICc5MDAnLCAxMDAsIDIwMCwgMzAwLCA0MDAsIDUwMCwgNjAwLCA3MDAsIDgwMCwgOTAwXVxuICAgIH0sXG4gICAgdGV4dERlY29yYXRpb246IHtcbiAgICAgIGVudW1zOiBbJ25vbmUnLCAndW5kZXJsaW5lJywgJ292ZXJsaW5lJywgJ2xpbmUtdGhyb3VnaCddXG4gICAgfSxcbiAgICB0ZXh0VHJhbnNmb3JtOiB7XG4gICAgICBlbnVtczogWydub25lJywgJ3VwcGVyY2FzZScsICdsb3dlcmNhc2UnXVxuICAgIH0sXG4gICAgdGV4dFdyYXA6IHtcbiAgICAgIGVudW1zOiBbJ25vbmUnLCAnd3JhcCcsICdlbGxpcHNpcyddXG4gICAgfSxcbiAgICB0ZXh0T3ZlcmZsb3dXcmFwOiB7XG4gICAgICBlbnVtczogWyd3aGl0ZXNwYWNlJywgJ2FueXdoZXJlJ11cbiAgICB9LFxuICAgIHRleHRCYWNrZ3JvdW5kU2hhcGU6IHtcbiAgICAgIGVudW1zOiBbJ3JlY3RhbmdsZScsICdyb3VuZHJlY3RhbmdsZScsICdyb3VuZC1yZWN0YW5nbGUnLCAnY2lyY2xlJ11cbiAgICB9LFxuICAgIG5vZGVTaGFwZToge1xuICAgICAgZW51bXM6IFsncmVjdGFuZ2xlJywgJ3JvdW5kcmVjdGFuZ2xlJywgJ3JvdW5kLXJlY3RhbmdsZScsICdjdXRyZWN0YW5nbGUnLCAnY3V0LXJlY3RhbmdsZScsICdib3R0b21yb3VuZHJlY3RhbmdsZScsICdib3R0b20tcm91bmQtcmVjdGFuZ2xlJywgJ2JhcnJlbCcsICdlbGxpcHNlJywgJ3RyaWFuZ2xlJywgJ3JvdW5kLXRyaWFuZ2xlJywgJ3NxdWFyZScsICdwZW50YWdvbicsICdyb3VuZC1wZW50YWdvbicsICdoZXhhZ29uJywgJ3JvdW5kLWhleGFnb24nLCAnY29uY2F2ZWhleGFnb24nLCAnY29uY2F2ZS1oZXhhZ29uJywgJ2hlcHRhZ29uJywgJ3JvdW5kLWhlcHRhZ29uJywgJ29jdGFnb24nLCAncm91bmQtb2N0YWdvbicsICd0YWcnLCAncm91bmQtdGFnJywgJ3N0YXInLCAnZGlhbW9uZCcsICdyb3VuZC1kaWFtb25kJywgJ3ZlZScsICdyaG9tYm9pZCcsICdyaWdodC1yaG9tYm9pZCcsICdwb2x5Z29uJ11cbiAgICB9LFxuICAgIG92ZXJsYXlTaGFwZToge1xuICAgICAgZW51bXM6IFsncm91bmRyZWN0YW5nbGUnLCAncm91bmQtcmVjdGFuZ2xlJywgJ2VsbGlwc2UnXVxuICAgIH0sXG4gICAgY29ybmVyUmFkaXVzOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICBtaW46IDAsXG4gICAgICB1bml0czogJ3B4fGVtJyxcbiAgICAgIGltcGxpY2l0VW5pdHM6ICdweCcsXG4gICAgICBlbnVtczogWydhdXRvJ11cbiAgICB9LFxuICAgIGNvbXBvdW5kSW5jbHVkZUxhYmVsczoge1xuICAgICAgZW51bXM6IFsnaW5jbHVkZScsICdleGNsdWRlJ11cbiAgICB9LFxuICAgIGFycm93U2hhcGU6IHtcbiAgICAgIGVudW1zOiBbJ3RlZScsICd0cmlhbmdsZScsICd0cmlhbmdsZS10ZWUnLCAnY2lyY2xlLXRyaWFuZ2xlJywgJ3RyaWFuZ2xlLWNyb3NzJywgJ3RyaWFuZ2xlLWJhY2tjdXJ2ZScsICd2ZWUnLCAnc3F1YXJlJywgJ2NpcmNsZScsICdkaWFtb25kJywgJ2NoZXZyb24nLCAnbm9uZSddXG4gICAgfSxcbiAgICBhcnJvd0ZpbGw6IHtcbiAgICAgIGVudW1zOiBbJ2ZpbGxlZCcsICdob2xsb3cnXVxuICAgIH0sXG4gICAgYXJyb3dXaWR0aDoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgdW5pdHM6ICclfHB4fGVtJyxcbiAgICAgIGltcGxpY2l0VW5pdHM6ICdweCcsXG4gICAgICBlbnVtczogWydtYXRjaC1saW5lJ11cbiAgICB9LFxuICAgIGRpc3BsYXk6IHtcbiAgICAgIGVudW1zOiBbJ2VsZW1lbnQnLCAnbm9uZSddXG4gICAgfSxcbiAgICB2aXNpYmlsaXR5OiB7XG4gICAgICBlbnVtczogWydoaWRkZW4nLCAndmlzaWJsZSddXG4gICAgfSxcbiAgICB6Q29tcG91bmREZXB0aDoge1xuICAgICAgZW51bXM6IFsnYm90dG9tJywgJ29ycGhhbicsICdhdXRvJywgJ3RvcCddXG4gICAgfSxcbiAgICB6SW5kZXhDb21wYXJlOiB7XG4gICAgICBlbnVtczogWydhdXRvJywgJ21hbnVhbCddXG4gICAgfSxcbiAgICB2YWxpZ246IHtcbiAgICAgIGVudW1zOiBbJ3RvcCcsICd0b3AtaW5zaWRlJywgJ2NlbnRlcicsICdib3R0b20nLCAnYm90dG9tLWluc2lkZSddXG4gICAgfSxcbiAgICBoYWxpZ246IHtcbiAgICAgIGVudW1zOiBbJ2xlZnQnLCAnbGVmdC1pbnNpZGUnLCAnY2VudGVyJywgJ3JpZ2h0JywgJ3JpZ2h0LWluc2lkZSddXG4gICAgfSxcbiAgICBqdXN0aWZpY2F0aW9uOiB7XG4gICAgICBlbnVtczogWydsZWZ0JywgJ2NlbnRlcicsICdyaWdodCcsICdhdXRvJ11cbiAgICB9LFxuICAgIHRleHRNZXRyaWNzOiB7XG4gICAgICBlbnVtczogWydmb250JywgJ2dseXBoJ11cbiAgICB9LFxuICAgIHRleHQ6IHtcbiAgICAgIHN0cmluZzogdHJ1ZVxuICAgIH0sXG4gICAgZGF0YToge1xuICAgICAgbWFwcGluZzogdHJ1ZSxcbiAgICAgIHJlZ2V4OiBkYXRhKCdkYXRhJylcbiAgICB9LFxuICAgIGxheW91dERhdGE6IHtcbiAgICAgIG1hcHBpbmc6IHRydWUsXG4gICAgICByZWdleDogZGF0YSgnbGF5b3V0RGF0YScpXG4gICAgfSxcbiAgICBzY3JhdGNoOiB7XG4gICAgICBtYXBwaW5nOiB0cnVlLFxuICAgICAgcmVnZXg6IGRhdGEoJ3NjcmF0Y2gnKVxuICAgIH0sXG4gICAgbWFwRGF0YToge1xuICAgICAgbWFwcGluZzogdHJ1ZSxcbiAgICAgIHJlZ2V4OiBtYXBEYXRhKCdtYXBEYXRhJylcbiAgICB9LFxuICAgIG1hcExheW91dERhdGE6IHtcbiAgICAgIG1hcHBpbmc6IHRydWUsXG4gICAgICByZWdleDogbWFwRGF0YSgnbWFwTGF5b3V0RGF0YScpXG4gICAgfSxcbiAgICBtYXBTY3JhdGNoOiB7XG4gICAgICBtYXBwaW5nOiB0cnVlLFxuICAgICAgcmVnZXg6IG1hcERhdGEoJ21hcFNjcmF0Y2gnKVxuICAgIH0sXG4gICAgZm46IHtcbiAgICAgIG1hcHBpbmc6IHRydWUsXG4gICAgICBmbjogdHJ1ZVxuICAgIH0sXG4gICAgdXJsOiB7XG4gICAgICByZWdleGVzOiB1cmxSZWdleGVzLFxuICAgICAgc2luZ2xlUmVnZXhNYXRjaFZhbHVlOiB0cnVlXG4gICAgfSxcbiAgICB1cmxzOiB7XG4gICAgICByZWdleGVzOiB1cmxSZWdleGVzLFxuICAgICAgc2luZ2xlUmVnZXhNYXRjaFZhbHVlOiB0cnVlLFxuICAgICAgbXVsdGlwbGU6IHRydWVcbiAgICB9LFxuICAgIHByb3BMaXN0OiB7XG4gICAgICBwcm9wTGlzdDogdHJ1ZVxuICAgIH0sXG4gICAgYW5nbGU6IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIHVuaXRzOiAnZGVnfHJhZCcsXG4gICAgICBpbXBsaWNpdFVuaXRzOiAncmFkJ1xuICAgIH0sXG4gICAgdGV4dFJvdGF0aW9uOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICB1bml0czogJ2RlZ3xyYWQnLFxuICAgICAgaW1wbGljaXRVbml0czogJ3JhZCcsXG4gICAgICBlbnVtczogWydub25lJywgJ2F1dG9yb3RhdGUnXVxuICAgIH0sXG4gICAgcG9seWdvblBvaW50TGlzdDoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgbXVsdGlwbGU6IHRydWUsXG4gICAgICBldmVuTXVsdGlwbGU6IHRydWUsXG4gICAgICBtaW46IC0xLFxuICAgICAgbWF4OiAxLFxuICAgICAgdW5pdGxlc3M6IHRydWVcbiAgICB9LFxuICAgIGVkZ2VEaXN0YW5jZXM6IHtcbiAgICAgIGVudW1zOiBbJ2ludGVyc2VjdGlvbicsICdub2RlLXBvc2l0aW9uJywgJ2VuZHBvaW50cyddXG4gICAgfSxcbiAgICBlZGdlRW5kcG9pbnQ6IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIG11bHRpcGxlOiB0cnVlLFxuICAgICAgdW5pdHM6ICclfHB4fGVtfGRlZ3xyYWQnLFxuICAgICAgaW1wbGljaXRVbml0czogJ3B4JyxcbiAgICAgIGVudW1zOiBbJ2luc2lkZS10by1ub2RlJywgJ291dHNpZGUtdG8tbm9kZScsICdvdXRzaWRlLXRvLW5vZGUtb3ItbGFiZWwnLCAnb3V0c2lkZS10by1saW5lJywgJ291dHNpZGUtdG8tbGluZS1vci1sYWJlbCddLFxuICAgICAgc2luZ2xlRW51bTogdHJ1ZSxcbiAgICAgIHZhbGlkYXRlOiBmdW5jdGlvbiB2YWxpZGF0ZSh2YWxBcnIsIHVuaXRzQXJyKSB7XG4gICAgICAgIHN3aXRjaCAodmFsQXJyLmxlbmd0aCkge1xuICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIC8vIGNhbiBiZSAlIG9yIHB4IG9ubHlcbiAgICAgICAgICAgIHJldHVybiB1bml0c0FyclswXSAhPT0gJ2RlZycgJiYgdW5pdHNBcnJbMF0gIT09ICdyYWQnICYmIHVuaXRzQXJyWzFdICE9PSAnZGVnJyAmJiB1bml0c0FyclsxXSAhPT0gJ3JhZCc7XG4gICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgLy8gY2FuIGJlIGVudW0sIGRlZywgb3IgcmFkIG9ubHlcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcodmFsQXJyWzBdKSB8fCB1bml0c0FyclswXSA9PT0gJ2RlZycgfHwgdW5pdHNBcnJbMF0gPT09ICdyYWQnO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGVhc2luZzoge1xuICAgICAgcmVnZXhlczogWydeKHNwcmluZylcXFxccypcXFxcKFxcXFxzKignICsgbnVtYmVyJDEgKyAnKVxcXFxzKixcXFxccyooJyArIG51bWJlciQxICsgJylcXFxccypcXFxcKSQnLCAnXihjdWJpYy1iZXppZXIpXFxcXHMqXFxcXChcXFxccyooJyArIG51bWJlciQxICsgJylcXFxccyosXFxcXHMqKCcgKyBudW1iZXIkMSArICcpXFxcXHMqLFxcXFxzKignICsgbnVtYmVyJDEgKyAnKVxcXFxzKixcXFxccyooJyArIG51bWJlciQxICsgJylcXFxccypcXFxcKSQnXSxcbiAgICAgIGVudW1zOiBbJ2xpbmVhcicsICdlYXNlJywgJ2Vhc2UtaW4nLCAnZWFzZS1vdXQnLCAnZWFzZS1pbi1vdXQnLCAnZWFzZS1pbi1zaW5lJywgJ2Vhc2Utb3V0LXNpbmUnLCAnZWFzZS1pbi1vdXQtc2luZScsICdlYXNlLWluLXF1YWQnLCAnZWFzZS1vdXQtcXVhZCcsICdlYXNlLWluLW91dC1xdWFkJywgJ2Vhc2UtaW4tY3ViaWMnLCAnZWFzZS1vdXQtY3ViaWMnLCAnZWFzZS1pbi1vdXQtY3ViaWMnLCAnZWFzZS1pbi1xdWFydCcsICdlYXNlLW91dC1xdWFydCcsICdlYXNlLWluLW91dC1xdWFydCcsICdlYXNlLWluLXF1aW50JywgJ2Vhc2Utb3V0LXF1aW50JywgJ2Vhc2UtaW4tb3V0LXF1aW50JywgJ2Vhc2UtaW4tZXhwbycsICdlYXNlLW91dC1leHBvJywgJ2Vhc2UtaW4tb3V0LWV4cG8nLCAnZWFzZS1pbi1jaXJjJywgJ2Vhc2Utb3V0LWNpcmMnLCAnZWFzZS1pbi1vdXQtY2lyYyddXG4gICAgfSxcbiAgICBncmFkaWVudERpcmVjdGlvbjoge1xuICAgICAgZW51bXM6IFsndG8tYm90dG9tJywgJ3RvLXRvcCcsICd0by1sZWZ0JywgJ3RvLXJpZ2h0JywgJ3RvLWJvdHRvbS1yaWdodCcsICd0by1ib3R0b20tbGVmdCcsICd0by10b3AtcmlnaHQnLCAndG8tdG9wLWxlZnQnLCAndG8tcmlnaHQtYm90dG9tJywgJ3RvLWxlZnQtYm90dG9tJywgJ3RvLXJpZ2h0LXRvcCcsICd0by1sZWZ0LXRvcCcgLy8gZGlmZmVyZW50IG9yZGVyXG4gICAgICBdXG4gICAgfSxcbiAgICBib3VuZHNFeHBhbnNpb246IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIG11bHRpcGxlOiB0cnVlLFxuICAgICAgbWluOiAwLFxuICAgICAgdmFsaWRhdGU6IGZ1bmN0aW9uIHZhbGlkYXRlKHZhbEFycikge1xuICAgICAgICB2YXIgbGVuZ3RoID0gdmFsQXJyLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIGxlbmd0aCA9PT0gMSB8fCBsZW5ndGggPT09IDIgfHwgbGVuZ3RoID09PSA0O1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgdmFyIGRpZmYgPSB7XG4gICAgemVyb05vblplcm86IGZ1bmN0aW9uIHplcm9Ob25aZXJvKHZhbDEsIHZhbDIpIHtcbiAgICAgIGlmICgodmFsMSA9PSBudWxsIHx8IHZhbDIgPT0gbnVsbCkgJiYgdmFsMSAhPT0gdmFsMikge1xuICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gbnVsbCBjYXNlcyBjb3VsZCByZXByZXNlbnQgYW55IHZhbHVlXG4gICAgICB9XG4gICAgICBpZiAodmFsMSA9PSAwICYmIHZhbDIgIT0gMCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAodmFsMSAhPSAwICYmIHZhbDIgPT0gMCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGFueTogZnVuY3Rpb24gYW55KHZhbDEsIHZhbDIpIHtcbiAgICAgIHJldHVybiB2YWwxICE9IHZhbDI7XG4gICAgfSxcbiAgICBlbXB0eU5vbkVtcHR5OiBmdW5jdGlvbiBlbXB0eU5vbkVtcHR5KHN0cjEsIHN0cjIpIHtcbiAgICAgIHZhciBlbXB0eTEgPSBlbXB0eVN0cmluZyhzdHIxKTtcbiAgICAgIHZhciBlbXB0eTIgPSBlbXB0eVN0cmluZyhzdHIyKTtcbiAgICAgIHJldHVybiBlbXB0eTEgJiYgIWVtcHR5MiB8fCAhZW1wdHkxICYmIGVtcHR5MjtcbiAgICB9XG4gIH07XG5cbiAgLy8gZGVmaW5lIHZpc3VhbCBzdHlsZSBwcm9wZXJ0aWVzXG4gIC8vXG4gIC8vIC0gbi5iLiBhZGRpbmcgYSBuZXcgZ3JvdXAgb2YgcHJvcHMgbWF5IHJlcXVpcmUgdXBkYXRlcyB0byB1cGRhdGVTdHlsZUhpbnRzKClcbiAgLy8gLSBhZGRpbmcgbmV3IHByb3BzIHRvIGFuIGV4aXN0aW5nIGdyb3VwIGdldHMgaGFuZGxlZCBhdXRvbWF0aWNhbGx5XG5cbiAgdmFyIHQgPSBzdHlmbiQyLnR5cGVzO1xuICB2YXIgbWFpbkxhYmVsID0gW3tcbiAgICBuYW1lOiAnbGFiZWwnLFxuICAgIHR5cGU6IHQudGV4dCxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnksXG4gICAgdHJpZ2dlcnNaT3JkZXI6IGRpZmYuZW1wdHlOb25FbXB0eVxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtcm90YXRpb24nLFxuICAgIHR5cGU6IHQudGV4dFJvdGF0aW9uLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtbWFyZ2luLXgnLFxuICAgIHR5cGU6IHQuYmlkaXJlY3Rpb25hbFNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1tYXJnaW4teScsXG4gICAgdHlwZTogdC5iaWRpcmVjdGlvbmFsU2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfV07XG4gIHZhciBzb3VyY2VMYWJlbCA9IFt7XG4gICAgbmFtZTogJ3NvdXJjZS1sYWJlbCcsXG4gICAgdHlwZTogdC50ZXh0LFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3NvdXJjZS10ZXh0LXJvdGF0aW9uJyxcbiAgICB0eXBlOiB0LnRleHRSb3RhdGlvbixcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdzb3VyY2UtdGV4dC1tYXJnaW4teCcsXG4gICAgdHlwZTogdC5iaWRpcmVjdGlvbmFsU2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdzb3VyY2UtdGV4dC1tYXJnaW4teScsXG4gICAgdHlwZTogdC5iaWRpcmVjdGlvbmFsU2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdzb3VyY2UtdGV4dC1vZmZzZXQnLFxuICAgIHR5cGU6IHQuc2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfV07XG4gIHZhciB0YXJnZXRMYWJlbCA9IFt7XG4gICAgbmFtZTogJ3RhcmdldC1sYWJlbCcsXG4gICAgdHlwZTogdC50ZXh0LFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RhcmdldC10ZXh0LXJvdGF0aW9uJyxcbiAgICB0eXBlOiB0LnRleHRSb3RhdGlvbixcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0YXJnZXQtdGV4dC1tYXJnaW4teCcsXG4gICAgdHlwZTogdC5iaWRpcmVjdGlvbmFsU2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0YXJnZXQtdGV4dC1tYXJnaW4teScsXG4gICAgdHlwZTogdC5iaWRpcmVjdGlvbmFsU2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0YXJnZXQtdGV4dC1vZmZzZXQnLFxuICAgIHR5cGU6IHQuc2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfV07XG4gIHZhciBsYWJlbERpbWVuc2lvbnMgPSBbe1xuICAgIG5hbWU6ICdmb250LWZhbWlseScsXG4gICAgdHlwZTogdC5mb250RmFtaWx5LFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2ZvbnQtc3R5bGUnLFxuICAgIHR5cGU6IHQuZm9udFN0eWxlLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2ZvbnQtd2VpZ2h0JyxcbiAgICB0eXBlOiB0LmZvbnRXZWlnaHQsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnZm9udC1zaXplJyxcbiAgICB0eXBlOiB0LnNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC10cmFuc2Zvcm0nLFxuICAgIHR5cGU6IHQudGV4dFRyYW5zZm9ybSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LXdyYXAnLFxuICAgIHR5cGU6IHQudGV4dFdyYXAsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1vdmVyZmxvdy13cmFwJyxcbiAgICB0eXBlOiB0LnRleHRPdmVyZmxvd1dyYXAsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1tYXgtd2lkdGgnLFxuICAgIHR5cGU6IHQuc2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LW91dGxpbmUtd2lkdGgnLFxuICAgIHR5cGU6IHQuc2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdsaW5lLWhlaWdodCcsXG4gICAgdHlwZTogdC5wb3NpdGl2ZU51bWJlcixcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfV07XG4gIHZhciBjb21tb25MYWJlbCA9IFt7XG4gICAgbmFtZTogJ3RleHQtdmFsaWduJyxcbiAgICB0eXBlOiB0LnZhbGlnbixcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LWhhbGlnbicsXG4gICAgdHlwZTogdC5oYWxpZ24sXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnY29sb3InLFxuICAgIHR5cGU6IHQuY29sb3JcbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LW91dGxpbmUtY29sb3InLFxuICAgIHR5cGU6IHQuY29sb3JcbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LW91dGxpbmUtb3BhY2l0eScsXG4gICAgdHlwZTogdC56ZXJvT25lTnVtYmVyXG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1iYWNrZ3JvdW5kLWNvbG9yJyxcbiAgICB0eXBlOiB0LmNvbG9yXG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1iYWNrZ3JvdW5kLW9wYWNpdHknLFxuICAgIHR5cGU6IHQuemVyb09uZU51bWJlclxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtYmFja2dyb3VuZC1wYWRkaW5nJyxcbiAgICB0eXBlOiB0LnNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1ib3JkZXItb3BhY2l0eScsXG4gICAgdHlwZTogdC56ZXJvT25lTnVtYmVyXG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1ib3JkZXItY29sb3InLFxuICAgIHR5cGU6IHQuY29sb3JcbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LWJvcmRlci13aWR0aCcsXG4gICAgdHlwZTogdC5zaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtYm9yZGVyLXN0eWxlJyxcbiAgICB0eXBlOiB0LmJvcmRlclN0eWxlLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtYmFja2dyb3VuZC1zaGFwZScsXG4gICAgdHlwZTogdC50ZXh0QmFja2dyb3VuZFNoYXBlLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtanVzdGlmaWNhdGlvbicsXG4gICAgdHlwZTogdC5qdXN0aWZpY2F0aW9uXG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1tZXRyaWNzJyxcbiAgICB0eXBlOiB0LnRleHRNZXRyaWNzXG4gIH0sIHtcbiAgICBuYW1lOiAnYm94LXNlbGVjdC1sYWJlbHMnLFxuICAgIHR5cGU6IHQuYm9vbCxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfV07XG4gIHZhciBiZWhhdmlvciA9IFt7XG4gICAgbmFtZTogJ2V2ZW50cycsXG4gICAgdHlwZTogdC5ib29sLFxuICAgIHRyaWdnZXJzWk9yZGVyOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtZXZlbnRzJyxcbiAgICB0eXBlOiB0LmJvb2wsXG4gICAgdHJpZ2dlcnNaT3JkZXI6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnYm94LXNlbGVjdGlvbicsXG4gICAgdHlwZTogdC5ib3hTZWxlY3Rpb24sXG4gICAgdHJpZ2dlcnNaT3JkZXI6IGRpZmYuYW55XG4gIH1dO1xuICB2YXIgdmlzaWJpbGl0eSA9IFt7XG4gICAgbmFtZTogJ2Rpc3BsYXknLFxuICAgIHR5cGU6IHQuZGlzcGxheSxcbiAgICB0cmlnZ2Vyc1pPcmRlcjogZGlmZi5hbnksXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55LFxuICAgIHRyaWdnZXJzQm91bmRzT2ZDb25uZWN0ZWRFZGdlczogZGlmZi5hbnksXG4gICAgdHJpZ2dlcnNCb3VuZHNPZlBhcmFsbGVsRWRnZXM6IGZ1bmN0aW9uIHRyaWdnZXJzQm91bmRzT2ZQYXJhbGxlbEVkZ2VzKGZyb21WYWx1ZSwgdG9WYWx1ZSwgZWxlKSB7XG4gICAgICBpZiAoZnJvbVZhbHVlID09PSB0b1ZhbHVlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gb25seSBpZiBlZGdlIGlzIGJ1bmRsZWQgYmV6aWVyIChzbyBhcyBub3QgdG8gYWZmZWN0IHBlcmZvcm1hbmNlIG9mIG90aGVyIGVkZ2VzKVxuICAgICAgcmV0dXJuIGVsZS5wc3R5bGUoJ2N1cnZlLXN0eWxlJykudmFsdWUgPT09ICdiZXppZXInO1xuICAgIH1cbiAgfSwge1xuICAgIG5hbWU6ICd2aXNpYmlsaXR5JyxcbiAgICB0eXBlOiB0LnZpc2liaWxpdHksXG4gICAgdHJpZ2dlcnNaT3JkZXI6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnb3BhY2l0eScsXG4gICAgdHlwZTogdC56ZXJvT25lTnVtYmVyLFxuICAgIHRyaWdnZXJzWk9yZGVyOiBkaWZmLnplcm9Ob25aZXJvXG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1vcGFjaXR5JyxcbiAgICB0eXBlOiB0Lnplcm9PbmVOdW1iZXJcbiAgfSwge1xuICAgIG5hbWU6ICdtaW4tem9vbWVkLWZvbnQtc2l6ZScsXG4gICAgdHlwZTogdC5zaXplXG4gIH0sIHtcbiAgICBuYW1lOiAnei1jb21wb3VuZC1kZXB0aCcsXG4gICAgdHlwZTogdC56Q29tcG91bmREZXB0aCxcbiAgICB0cmlnZ2Vyc1pPcmRlcjogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd6LWluZGV4LWNvbXBhcmUnLFxuICAgIHR5cGU6IHQuekluZGV4Q29tcGFyZSxcbiAgICB0cmlnZ2Vyc1pPcmRlcjogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd6LWluZGV4JyxcbiAgICB0eXBlOiB0Lm51bWJlcixcbiAgICB0cmlnZ2Vyc1pPcmRlcjogZGlmZi5hbnlcbiAgfV07XG4gIHZhciBvdmVybGF5ID0gW3tcbiAgICBuYW1lOiAnb3ZlcmxheS1wYWRkaW5nJyxcbiAgICB0eXBlOiB0LnNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnb3ZlcmxheS1jb2xvcicsXG4gICAgdHlwZTogdC5jb2xvclxuICB9LCB7XG4gICAgbmFtZTogJ292ZXJsYXktb3BhY2l0eScsXG4gICAgdHlwZTogdC56ZXJvT25lTnVtYmVyLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLnplcm9Ob25aZXJvXG4gIH0sIHtcbiAgICBuYW1lOiAnb3ZlcmxheS1zaGFwZScsXG4gICAgdHlwZTogdC5vdmVybGF5U2hhcGUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnb3ZlcmxheS1jb3JuZXItcmFkaXVzJyxcbiAgICB0eXBlOiB0LmNvcm5lclJhZGl1c1xuICB9XTtcbiAgdmFyIHVuZGVybGF5ID0gW3tcbiAgICBuYW1lOiAndW5kZXJsYXktcGFkZGluZycsXG4gICAgdHlwZTogdC5zaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3VuZGVybGF5LWNvbG9yJyxcbiAgICB0eXBlOiB0LmNvbG9yXG4gIH0sIHtcbiAgICBuYW1lOiAndW5kZXJsYXktb3BhY2l0eScsXG4gICAgdHlwZTogdC56ZXJvT25lTnVtYmVyLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLnplcm9Ob25aZXJvXG4gIH0sIHtcbiAgICBuYW1lOiAndW5kZXJsYXktc2hhcGUnLFxuICAgIHR5cGU6IHQub3ZlcmxheVNoYXBlLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3VuZGVybGF5LWNvcm5lci1yYWRpdXMnLFxuICAgIHR5cGU6IHQuY29ybmVyUmFkaXVzXG4gIH1dO1xuICB2YXIgdHJhbnNpdGlvbiA9IFt7XG4gICAgbmFtZTogJ3RyYW5zaXRpb24tcHJvcGVydHknLFxuICAgIHR5cGU6IHQucHJvcExpc3RcbiAgfSwge1xuICAgIG5hbWU6ICd0cmFuc2l0aW9uLWR1cmF0aW9uJyxcbiAgICB0eXBlOiB0LnRpbWVcbiAgfSwge1xuICAgIG5hbWU6ICd0cmFuc2l0aW9uLWRlbGF5JyxcbiAgICB0eXBlOiB0LnRpbWVcbiAgfSwge1xuICAgIG5hbWU6ICd0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbicsXG4gICAgdHlwZTogdC5lYXNpbmdcbiAgfV07XG4gIHZhciBub2RlU2l6ZUhhc2hPdmVycmlkZSA9IGZ1bmN0aW9uIG5vZGVTaXplSGFzaE92ZXJyaWRlKGVsZSwgcGFyc2VkUHJvcCkge1xuICAgIGlmIChwYXJzZWRQcm9wLnZhbHVlID09PSAnbGFiZWwnKSB7XG4gICAgICByZXR1cm4gLWVsZS5wb29sSW5kZXgoKTsgLy8gbm8gaGFzaCBrZXkgaGl0cyBpcyB1c2luZyBsYWJlbCBzaXplIChoaXRyYXRlIGZvciBwZXJmIHByb2JhYmx5IGxvdyBhbnl3YXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBwYXJzZWRQcm9wLnBmVmFsdWU7XG4gICAgfVxuICB9O1xuICB2YXIgbm9kZUJvZHkgPSBbe1xuICAgIG5hbWU6ICdoZWlnaHQnLFxuICAgIHR5cGU6IHQubm9kZVNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55LFxuICAgIGhhc2hPdmVycmlkZTogbm9kZVNpemVIYXNoT3ZlcnJpZGVcbiAgfSwge1xuICAgIG5hbWU6ICd3aWR0aCcsXG4gICAgdHlwZTogdC5ub2RlU2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnksXG4gICAgaGFzaE92ZXJyaWRlOiBub2RlU2l6ZUhhc2hPdmVycmlkZVxuICB9LCB7XG4gICAgbmFtZTogJ3NoYXBlJyxcbiAgICB0eXBlOiB0Lm5vZGVTaGFwZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdzaGFwZS1wb2x5Z29uLXBvaW50cycsXG4gICAgdHlwZTogdC5wb2x5Z29uUG9pbnRMaXN0LFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2Nvcm5lci1yYWRpdXMnLFxuICAgIHR5cGU6IHQuY29ybmVyUmFkaXVzXG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1jb2xvcicsXG4gICAgdHlwZTogdC5jb2xvclxuICB9LCB7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtZmlsbCcsXG4gICAgdHlwZTogdC5maWxsXG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1vcGFjaXR5JyxcbiAgICB0eXBlOiB0Lnplcm9PbmVOdW1iZXJcbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLWJsYWNrZW4nLFxuICAgIHR5cGU6IHQubk9uZU9uZU51bWJlclxuICB9LCB7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtZ3JhZGllbnQtc3RvcC1jb2xvcnMnLFxuICAgIHR5cGU6IHQuY29sb3JzXG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1ncmFkaWVudC1zdG9wLXBvc2l0aW9ucycsXG4gICAgdHlwZTogdC5wZXJjZW50YWdlc1xuICB9LCB7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtZ3JhZGllbnQtZGlyZWN0aW9uJyxcbiAgICB0eXBlOiB0LmdyYWRpZW50RGlyZWN0aW9uXG4gIH0sIHtcbiAgICBuYW1lOiAncGFkZGluZycsXG4gICAgdHlwZTogdC5zaXplTWF5YmVQZXJjZW50LFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3BhZGRpbmctcmVsYXRpdmUtdG8nLFxuICAgIHR5cGU6IHQucGFkZGluZ1JlbGF0aXZlVG8sXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnYm91bmRzLWV4cGFuc2lvbicsXG4gICAgdHlwZTogdC5ib3VuZHNFeHBhbnNpb24sXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH1dO1xuICB2YXIgbm9kZUJvcmRlciA9IFt7XG4gICAgbmFtZTogJ2JvcmRlci1jb2xvcicsXG4gICAgdHlwZTogdC5jb2xvclxuICB9LCB7XG4gICAgbmFtZTogJ2JvcmRlci1vcGFjaXR5JyxcbiAgICB0eXBlOiB0Lnplcm9PbmVOdW1iZXJcbiAgfSwge1xuICAgIG5hbWU6ICdib3JkZXItd2lkdGgnLFxuICAgIHR5cGU6IHQuc2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdib3JkZXItc3R5bGUnLFxuICAgIHR5cGU6IHQuYm9yZGVyU3R5bGVcbiAgfSwge1xuICAgIG5hbWU6ICdib3JkZXItY2FwJyxcbiAgICB0eXBlOiB0LmxpbmVDYXBcbiAgfSwge1xuICAgIG5hbWU6ICdib3JkZXItam9pbicsXG4gICAgdHlwZTogdC5saW5lSm9pblxuICB9LCB7XG4gICAgbmFtZTogJ2JvcmRlci1kYXNoLXBhdHRlcm4nLFxuICAgIHR5cGU6IHQubnVtYmVyc1xuICB9LCB7XG4gICAgbmFtZTogJ2JvcmRlci1kYXNoLW9mZnNldCcsXG4gICAgdHlwZTogdC5udW1iZXJcbiAgfSwge1xuICAgIG5hbWU6ICdib3JkZXItcG9zaXRpb24nLFxuICAgIHR5cGU6IHQubGluZVBvc2l0aW9uXG4gIH1dO1xuICB2YXIgbm9kZU91dGxpbmUgPSBbe1xuICAgIG5hbWU6ICdvdXRsaW5lLWNvbG9yJyxcbiAgICB0eXBlOiB0LmNvbG9yXG4gIH0sIHtcbiAgICBuYW1lOiAnb3V0bGluZS1vcGFjaXR5JyxcbiAgICB0eXBlOiB0Lnplcm9PbmVOdW1iZXJcbiAgfSwge1xuICAgIG5hbWU6ICdvdXRsaW5lLXdpZHRoJyxcbiAgICB0eXBlOiB0LnNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnb3V0bGluZS1zdHlsZScsXG4gICAgdHlwZTogdC5ib3JkZXJTdHlsZVxuICB9LCB7XG4gICAgbmFtZTogJ291dGxpbmUtb2Zmc2V0JyxcbiAgICB0eXBlOiB0LnNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH1dO1xuICB2YXIgYmFja2dyb3VuZEltYWdlID0gW3tcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1pbWFnZScsXG4gICAgdHlwZTogdC51cmxzXG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1pbWFnZS1jcm9zc29yaWdpbicsXG4gICAgdHlwZTogdC5iZ0Nyb3NzT3JpZ2luXG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1pbWFnZS1vcGFjaXR5JyxcbiAgICB0eXBlOiB0Lnplcm9PbmVOdW1iZXJzXG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1pbWFnZS1jb250YWlubWVudCcsXG4gICAgdHlwZTogdC5iZ0NvbnRhaW5tZW50XG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1pbWFnZS1zbW9vdGhpbmcnLFxuICAgIHR5cGU6IHQuYm9vbHNcbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLXBvc2l0aW9uLXgnLFxuICAgIHR5cGU6IHQuYmdQb3NcbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLXBvc2l0aW9uLXknLFxuICAgIHR5cGU6IHQuYmdQb3NcbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLXdpZHRoLXJlbGF0aXZlLXRvJyxcbiAgICB0eXBlOiB0LmJnUmVsYXRpdmVUb1xuICB9LCB7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtaGVpZ2h0LXJlbGF0aXZlLXRvJyxcbiAgICB0eXBlOiB0LmJnUmVsYXRpdmVUb1xuICB9LCB7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtcmVwZWF0JyxcbiAgICB0eXBlOiB0LmJnUmVwZWF0XG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1maXQnLFxuICAgIHR5cGU6IHQuYmdGaXRcbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLWNsaXAnLFxuICAgIHR5cGU6IHQuYmdDbGlwXG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC13aWR0aCcsXG4gICAgdHlwZTogdC5iZ1dIXG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1oZWlnaHQnLFxuICAgIHR5cGU6IHQuYmdXSFxuICB9LCB7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtb2Zmc2V0LXgnLFxuICAgIHR5cGU6IHQuYmdQb3NcbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLW9mZnNldC15JyxcbiAgICB0eXBlOiB0LmJnUG9zXG4gIH1dO1xuICB2YXIgY29tcG91bmQgPSBbe1xuICAgIG5hbWU6ICdwb3NpdGlvbicsXG4gICAgdHlwZTogdC5wb3NpdGlvbixcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdjb21wb3VuZC1zaXppbmctd3J0LWxhYmVscycsXG4gICAgdHlwZTogdC5jb21wb3VuZEluY2x1ZGVMYWJlbHMsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnbWluLXdpZHRoJyxcbiAgICB0eXBlOiB0LnNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnbWluLXdpZHRoLWJpYXMtbGVmdCcsXG4gICAgdHlwZTogdC5zaXplTWF5YmVQZXJjZW50LFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ21pbi13aWR0aC1iaWFzLXJpZ2h0JyxcbiAgICB0eXBlOiB0LnNpemVNYXliZVBlcmNlbnQsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnbWluLWhlaWdodCcsXG4gICAgdHlwZTogdC5zaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ21pbi1oZWlnaHQtYmlhcy10b3AnLFxuICAgIHR5cGU6IHQuc2l6ZU1heWJlUGVyY2VudCxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdtaW4taGVpZ2h0LWJpYXMtYm90dG9tJyxcbiAgICB0eXBlOiB0LnNpemVNYXliZVBlcmNlbnQsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH1dO1xuICB2YXIgZWRnZUxpbmUgPSBbe1xuICAgIG5hbWU6ICdsaW5lLXN0eWxlJyxcbiAgICB0eXBlOiB0LmxpbmVTdHlsZVxuICB9LCB7XG4gICAgbmFtZTogJ2xpbmUtY29sb3InLFxuICAgIHR5cGU6IHQuY29sb3JcbiAgfSwge1xuICAgIG5hbWU6ICdsaW5lLWZpbGwnLFxuICAgIHR5cGU6IHQuZmlsbFxuICB9LCB7XG4gICAgbmFtZTogJ2xpbmUtY2FwJyxcbiAgICB0eXBlOiB0LmxpbmVDYXBcbiAgfSwge1xuICAgIG5hbWU6ICdsaW5lLW9wYWNpdHknLFxuICAgIHR5cGU6IHQuemVyb09uZU51bWJlclxuICB9LCB7XG4gICAgbmFtZTogJ2xpbmUtZGFzaC1wYXR0ZXJuJyxcbiAgICB0eXBlOiB0Lm51bWJlcnNcbiAgfSwge1xuICAgIG5hbWU6ICdsaW5lLWRhc2gtb2Zmc2V0JyxcbiAgICB0eXBlOiB0Lm51bWJlclxuICB9LCB7XG4gICAgbmFtZTogJ2xpbmUtb3V0bGluZS13aWR0aCcsXG4gICAgdHlwZTogdC5zaXplXG4gIH0sIHtcbiAgICBuYW1lOiAnbGluZS1vdXRsaW5lLWNvbG9yJyxcbiAgICB0eXBlOiB0LmNvbG9yXG4gIH0sIHtcbiAgICBuYW1lOiAnbGluZS1ncmFkaWVudC1zdG9wLWNvbG9ycycsXG4gICAgdHlwZTogdC5jb2xvcnNcbiAgfSwge1xuICAgIG5hbWU6ICdsaW5lLWdyYWRpZW50LXN0b3AtcG9zaXRpb25zJyxcbiAgICB0eXBlOiB0LnBlcmNlbnRhZ2VzXG4gIH0sIHtcbiAgICBuYW1lOiAnY3VydmUtc3R5bGUnLFxuICAgIHR5cGU6IHQuY3VydmVTdHlsZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnksXG4gICAgdHJpZ2dlcnNCb3VuZHNPZlBhcmFsbGVsRWRnZXM6IGZ1bmN0aW9uIHRyaWdnZXJzQm91bmRzT2ZQYXJhbGxlbEVkZ2VzKGZyb21WYWx1ZSwgdG9WYWx1ZSkge1xuICAgICAgaWYgKGZyb21WYWx1ZSA9PT0gdG9WYWx1ZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9IC8vIG11c3QgaGF2ZSBkaWZmXG5cbiAgICAgIHJldHVybiBmcm9tVmFsdWUgPT09ICdiZXppZXInIHx8XG4gICAgICAvLyByZW1vdmUgZnJvbSBidW5kbGVcbiAgICAgIHRvVmFsdWUgPT09ICdiZXppZXInOyAvLyBhZGQgdG8gYnVuZGxlXG4gICAgfVxuICB9LCB7XG4gICAgbmFtZTogJ2hheXN0YWNrLXJhZGl1cycsXG4gICAgdHlwZTogdC56ZXJvT25lTnVtYmVyLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3NvdXJjZS1lbmRwb2ludCcsXG4gICAgdHlwZTogdC5lZGdlRW5kcG9pbnQsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGFyZ2V0LWVuZHBvaW50JyxcbiAgICB0eXBlOiB0LmVkZ2VFbmRwb2ludCxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdjb250cm9sLXBvaW50LXN0ZXAtc2l6ZScsXG4gICAgdHlwZTogdC5zaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2NvbnRyb2wtcG9pbnQtZGlzdGFuY2VzJyxcbiAgICB0eXBlOiB0LmJpZGlyZWN0aW9uYWxTaXplcyxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdjb250cm9sLXBvaW50LXdlaWdodHMnLFxuICAgIHR5cGU6IHQubnVtYmVycyxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdzZWdtZW50LWRpc3RhbmNlcycsXG4gICAgdHlwZTogdC5iaWRpcmVjdGlvbmFsU2l6ZXMsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnc2VnbWVudC13ZWlnaHRzJyxcbiAgICB0eXBlOiB0Lm51bWJlcnMsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnc2VnbWVudC1yYWRpaScsXG4gICAgdHlwZTogdC5udW1iZXJzLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3JhZGl1cy10eXBlJyxcbiAgICB0eXBlOiB0LnJhZGl1c1R5cGUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGF4aS10dXJuJyxcbiAgICB0eXBlOiB0LmJpZGlyZWN0aW9uYWxTaXplTWF5YmVQZXJjZW50LFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RheGktdHVybi1taW4tZGlzdGFuY2UnLFxuICAgIHR5cGU6IHQuc2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0YXhpLWRpcmVjdGlvbicsXG4gICAgdHlwZTogdC5heGlzRGlyZWN0aW9uLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RheGktcmFkaXVzJyxcbiAgICB0eXBlOiB0Lm51bWJlcixcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdlZGdlLWRpc3RhbmNlcycsXG4gICAgdHlwZTogdC5lZGdlRGlzdGFuY2VzLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2Fycm93LXNjYWxlJyxcbiAgICB0eXBlOiB0LnBvc2l0aXZlTnVtYmVyLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2xvb3AtZGlyZWN0aW9uJyxcbiAgICB0eXBlOiB0LmFuZ2xlLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2xvb3Atc3dlZXAnLFxuICAgIHR5cGU6IHQuYW5nbGUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnc291cmNlLWRpc3RhbmNlLWZyb20tbm9kZScsXG4gICAgdHlwZTogdC5zaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RhcmdldC1kaXN0YW5jZS1mcm9tLW5vZGUnLFxuICAgIHR5cGU6IHQuc2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfV07XG4gIHZhciBnaG9zdCA9IFt7XG4gICAgbmFtZTogJ2dob3N0JyxcbiAgICB0eXBlOiB0LmJvb2wsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnZ2hvc3Qtb2Zmc2V0LXgnLFxuICAgIHR5cGU6IHQuYmlkaXJlY3Rpb25hbFNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnZ2hvc3Qtb2Zmc2V0LXknLFxuICAgIHR5cGU6IHQuYmlkaXJlY3Rpb25hbFNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnZ2hvc3Qtb3BhY2l0eScsXG4gICAgdHlwZTogdC56ZXJvT25lTnVtYmVyXG4gIH1dO1xuICB2YXIgY29yZSA9IFt7XG4gICAgbmFtZTogJ3NlbGVjdGlvbi1ib3gtY29sb3InLFxuICAgIHR5cGU6IHQuY29sb3JcbiAgfSwge1xuICAgIG5hbWU6ICdzZWxlY3Rpb24tYm94LW9wYWNpdHknLFxuICAgIHR5cGU6IHQuemVyb09uZU51bWJlclxuICB9LCB7XG4gICAgbmFtZTogJ3NlbGVjdGlvbi1ib3gtYm9yZGVyLWNvbG9yJyxcbiAgICB0eXBlOiB0LmNvbG9yXG4gIH0sIHtcbiAgICBuYW1lOiAnc2VsZWN0aW9uLWJveC1ib3JkZXItd2lkdGgnLFxuICAgIHR5cGU6IHQuc2l6ZVxuICB9LCB7XG4gICAgbmFtZTogJ2FjdGl2ZS1iZy1jb2xvcicsXG4gICAgdHlwZTogdC5jb2xvclxuICB9LCB7XG4gICAgbmFtZTogJ2FjdGl2ZS1iZy1vcGFjaXR5JyxcbiAgICB0eXBlOiB0Lnplcm9PbmVOdW1iZXJcbiAgfSwge1xuICAgIG5hbWU6ICdhY3RpdmUtYmctc2l6ZScsXG4gICAgdHlwZTogdC5zaXplXG4gIH0sIHtcbiAgICBuYW1lOiAnb3V0c2lkZS10ZXh0dXJlLWJnLWNvbG9yJyxcbiAgICB0eXBlOiB0LmNvbG9yXG4gIH0sIHtcbiAgICBuYW1lOiAnb3V0c2lkZS10ZXh0dXJlLWJnLW9wYWNpdHknLFxuICAgIHR5cGU6IHQuemVyb09uZU51bWJlclxuICB9XTtcblxuICAvLyBwaWUgYmFja2dyb3VuZHMgZm9yIG5vZGVzXG4gIHZhciBwaWUgPSBbXTtcbiAgc3R5Zm4kMi5waWVCYWNrZ3JvdW5kTiA9IDE2OyAvLyBiZWNhdXNlIHRoZSBwaWUgcHJvcGVydGllcyBhcmUgbnVtYmVyZWQsIGdpdmUgYWNjZXNzIHRvIGEgY29uc3RhbnQgTiAoZm9yIHJlbmRlcmVyIHVzZSlcbiAgcGllLnB1c2goe1xuICAgIG5hbWU6ICdwaWUtc2l6ZScsXG4gICAgdHlwZTogdC5zaXplTWF5YmVQZXJjZW50XG4gIH0pO1xuICBwaWUucHVzaCh7XG4gICAgbmFtZTogJ3BpZS1ob2xlJyxcbiAgICB0eXBlOiB0LnNpemVNYXliZVBlcmNlbnRcbiAgfSk7XG4gIHBpZS5wdXNoKHtcbiAgICBuYW1lOiAncGllLXN0YXJ0LWFuZ2xlJyxcbiAgICB0eXBlOiB0LmFuZ2xlXG4gIH0pO1xuICBmb3IgKHZhciBpID0gMTsgaSA8PSBzdHlmbiQyLnBpZUJhY2tncm91bmROOyBpKyspIHtcbiAgICBwaWUucHVzaCh7XG4gICAgICBuYW1lOiAncGllLScgKyBpICsgJy1iYWNrZ3JvdW5kLWNvbG9yJyxcbiAgICAgIHR5cGU6IHQuY29sb3JcbiAgICB9KTtcbiAgICBwaWUucHVzaCh7XG4gICAgICBuYW1lOiAncGllLScgKyBpICsgJy1iYWNrZ3JvdW5kLXNpemUnLFxuICAgICAgdHlwZTogdC5wZXJjZW50XG4gICAgfSk7XG4gICAgcGllLnB1c2goe1xuICAgICAgbmFtZTogJ3BpZS0nICsgaSArICctYmFja2dyb3VuZC1vcGFjaXR5JyxcbiAgICAgIHR5cGU6IHQuemVyb09uZU51bWJlclxuICAgIH0pO1xuICB9XG5cbiAgLy8gc3RyaXBlIGJhY2tncm91bmRzIGZvciBub2Rlc1xuICB2YXIgc3RyaXBlID0gW107XG4gIHN0eWZuJDIuc3RyaXBlQmFja2dyb3VuZE4gPSAxNjsgLy8gYmVjYXVzZSB0aGUgc3RyaXBlIHByb3BlcnRpZXMgYXJlIG51bWJlcmVkLCBnaXZlIGFjY2VzcyB0byBhIGNvbnN0YW50IE4gKGZvciByZW5kZXJlciB1c2UpXG4gIHN0cmlwZS5wdXNoKHtcbiAgICBuYW1lOiAnc3RyaXBlLXNpemUnLFxuICAgIHR5cGU6IHQuc2l6ZU1heWJlUGVyY2VudFxuICB9KTtcbiAgc3RyaXBlLnB1c2goe1xuICAgIG5hbWU6ICdzdHJpcGUtZGlyZWN0aW9uJyxcbiAgICB0eXBlOiB0LmF4aXNEaXJlY3Rpb25QcmltYXJ5XG4gIH0pO1xuICBmb3IgKHZhciBfaSA9IDE7IF9pIDw9IHN0eWZuJDIuc3RyaXBlQmFja2dyb3VuZE47IF9pKyspIHtcbiAgICBzdHJpcGUucHVzaCh7XG4gICAgICBuYW1lOiAnc3RyaXBlLScgKyBfaSArICctYmFja2dyb3VuZC1jb2xvcicsXG4gICAgICB0eXBlOiB0LmNvbG9yXG4gICAgfSk7XG4gICAgc3RyaXBlLnB1c2goe1xuICAgICAgbmFtZTogJ3N0cmlwZS0nICsgX2kgKyAnLWJhY2tncm91bmQtc2l6ZScsXG4gICAgICB0eXBlOiB0LnBlcmNlbnRcbiAgICB9KTtcbiAgICBzdHJpcGUucHVzaCh7XG4gICAgICBuYW1lOiAnc3RyaXBlLScgKyBfaSArICctYmFja2dyb3VuZC1vcGFjaXR5JyxcbiAgICAgIHR5cGU6IHQuemVyb09uZU51bWJlclxuICAgIH0pO1xuICB9XG5cbiAgLy8gZWRnZSBhcnJvd3NcbiAgdmFyIGVkZ2VBcnJvdyA9IFtdO1xuICB2YXIgYXJyb3dQcmVmaXhlcyA9IHN0eWZuJDIuYXJyb3dQcmVmaXhlcyA9IFsnc291cmNlJywgJ21pZC1zb3VyY2UnLCAndGFyZ2V0JywgJ21pZC10YXJnZXQnXTtcbiAgW3tcbiAgICBuYW1lOiAnYXJyb3ctc2hhcGUnLFxuICAgIHR5cGU6IHQuYXJyb3dTaGFwZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdhcnJvdy1jb2xvcicsXG4gICAgdHlwZTogdC5jb2xvclxuICB9LCB7XG4gICAgbmFtZTogJ2Fycm93LWZpbGwnLFxuICAgIHR5cGU6IHQuYXJyb3dGaWxsXG4gIH0sIHtcbiAgICBuYW1lOiAnYXJyb3ctd2lkdGgnLFxuICAgIHR5cGU6IHQuYXJyb3dXaWR0aFxuICB9XS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgYXJyb3dQcmVmaXhlcy5mb3JFYWNoKGZ1bmN0aW9uIChwcmVmaXgpIHtcbiAgICAgIHZhciBuYW1lID0gcHJlZml4ICsgJy0nICsgcHJvcC5uYW1lO1xuICAgICAgdmFyIHR5cGUgPSBwcm9wLnR5cGUsXG4gICAgICAgIHRyaWdnZXJzQm91bmRzID0gcHJvcC50cmlnZ2Vyc0JvdW5kcztcbiAgICAgIGVkZ2VBcnJvdy5wdXNoKHtcbiAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgdHJpZ2dlcnNCb3VuZHM6IHRyaWdnZXJzQm91bmRzXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSwge30pO1xuICB2YXIgcHJvcHMgPSBzdHlmbiQyLnByb3BlcnRpZXMgPSBbXS5jb25jYXQoYmVoYXZpb3IsIHRyYW5zaXRpb24sIHZpc2liaWxpdHksIG92ZXJsYXksIHVuZGVybGF5LCBnaG9zdCwgY29tbW9uTGFiZWwsIGxhYmVsRGltZW5zaW9ucywgbWFpbkxhYmVsLCBzb3VyY2VMYWJlbCwgdGFyZ2V0TGFiZWwsIG5vZGVCb2R5LCBub2RlQm9yZGVyLCBub2RlT3V0bGluZSwgYmFja2dyb3VuZEltYWdlLCBwaWUsIHN0cmlwZSwgY29tcG91bmQsIGVkZ2VMaW5lLCBlZGdlQXJyb3csIGNvcmUpO1xuICB2YXIgcHJvcEdyb3VwcyA9IHN0eWZuJDIucHJvcGVydHlHcm91cHMgPSB7XG4gICAgLy8gY29tbW9uIHRvIGFsbCBlbGVzXG4gICAgYmVoYXZpb3I6IGJlaGF2aW9yLFxuICAgIHRyYW5zaXRpb246IHRyYW5zaXRpb24sXG4gICAgdmlzaWJpbGl0eTogdmlzaWJpbGl0eSxcbiAgICBvdmVybGF5OiBvdmVybGF5LFxuICAgIHVuZGVybGF5OiB1bmRlcmxheSxcbiAgICBnaG9zdDogZ2hvc3QsXG4gICAgLy8gbGFiZWxzXG4gICAgY29tbW9uTGFiZWw6IGNvbW1vbkxhYmVsLFxuICAgIGxhYmVsRGltZW5zaW9uczogbGFiZWxEaW1lbnNpb25zLFxuICAgIG1haW5MYWJlbDogbWFpbkxhYmVsLFxuICAgIHNvdXJjZUxhYmVsOiBzb3VyY2VMYWJlbCxcbiAgICB0YXJnZXRMYWJlbDogdGFyZ2V0TGFiZWwsXG4gICAgLy8gbm9kZSBwcm9wc1xuICAgIG5vZGVCb2R5OiBub2RlQm9keSxcbiAgICBub2RlQm9yZGVyOiBub2RlQm9yZGVyLFxuICAgIG5vZGVPdXRsaW5lOiBub2RlT3V0bGluZSxcbiAgICBiYWNrZ3JvdW5kSW1hZ2U6IGJhY2tncm91bmRJbWFnZSxcbiAgICBwaWU6IHBpZSxcbiAgICBzdHJpcGU6IHN0cmlwZSxcbiAgICBjb21wb3VuZDogY29tcG91bmQsXG4gICAgLy8gZWRnZSBwcm9wc1xuICAgIGVkZ2VMaW5lOiBlZGdlTGluZSxcbiAgICBlZGdlQXJyb3c6IGVkZ2VBcnJvdyxcbiAgICBjb3JlOiBjb3JlXG4gIH07XG4gIHZhciBwcm9wR3JvdXBOYW1lcyA9IHN0eWZuJDIucHJvcGVydHlHcm91cE5hbWVzID0ge307XG4gIHZhciBwcm9wR3JvdXBLZXlzID0gc3R5Zm4kMi5wcm9wZXJ0eUdyb3VwS2V5cyA9IE9iamVjdC5rZXlzKHByb3BHcm91cHMpO1xuICBwcm9wR3JvdXBLZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIHByb3BHcm91cE5hbWVzW2tleV0gPSBwcm9wR3JvdXBzW2tleV0ubWFwKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICByZXR1cm4gcHJvcC5uYW1lO1xuICAgIH0pO1xuICAgIHByb3BHcm91cHNba2V5XS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICByZXR1cm4gcHJvcC5ncm91cEtleSA9IGtleTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gZGVmaW5lIGFsaWFzZXNcbiAgdmFyIGFsaWFzZXMgPSBzdHlmbiQyLmFsaWFzZXMgPSBbe1xuICAgIG5hbWU6ICdjb250ZW50JyxcbiAgICBwb2ludHNUbzogJ2xhYmVsJ1xuICB9LCB7XG4gICAgbmFtZTogJ2NvbnRyb2wtcG9pbnQtZGlzdGFuY2UnLFxuICAgIHBvaW50c1RvOiAnY29udHJvbC1wb2ludC1kaXN0YW5jZXMnXG4gIH0sIHtcbiAgICBuYW1lOiAnY29udHJvbC1wb2ludC13ZWlnaHQnLFxuICAgIHBvaW50c1RvOiAnY29udHJvbC1wb2ludC13ZWlnaHRzJ1xuICB9LCB7XG4gICAgbmFtZTogJ3NlZ21lbnQtZGlzdGFuY2UnLFxuICAgIHBvaW50c1RvOiAnc2VnbWVudC1kaXN0YW5jZXMnXG4gIH0sIHtcbiAgICBuYW1lOiAnc2VnbWVudC13ZWlnaHQnLFxuICAgIHBvaW50c1RvOiAnc2VnbWVudC13ZWlnaHRzJ1xuICB9LCB7XG4gICAgbmFtZTogJ3NlZ21lbnQtcmFkaXVzJyxcbiAgICBwb2ludHNUbzogJ3NlZ21lbnQtcmFkaWknXG4gIH0sIHtcbiAgICBuYW1lOiAnZWRnZS10ZXh0LXJvdGF0aW9uJyxcbiAgICBwb2ludHNUbzogJ3RleHQtcm90YXRpb24nXG4gIH0sIHtcbiAgICBuYW1lOiAncGFkZGluZy1sZWZ0JyxcbiAgICBwb2ludHNUbzogJ3BhZGRpbmcnXG4gIH0sIHtcbiAgICBuYW1lOiAncGFkZGluZy1yaWdodCcsXG4gICAgcG9pbnRzVG86ICdwYWRkaW5nJ1xuICB9LCB7XG4gICAgbmFtZTogJ3BhZGRpbmctdG9wJyxcbiAgICBwb2ludHNUbzogJ3BhZGRpbmcnXG4gIH0sIHtcbiAgICBuYW1lOiAncGFkZGluZy1ib3R0b20nLFxuICAgIHBvaW50c1RvOiAncGFkZGluZydcbiAgfV07XG5cbiAgLy8gbGlzdCBvZiBwcm9wZXJ0eSBuYW1lc1xuICBzdHlmbiQyLnByb3BlcnR5TmFtZXMgPSBwcm9wcy5tYXAoZnVuY3Rpb24gKHApIHtcbiAgICByZXR1cm4gcC5uYW1lO1xuICB9KTtcblxuICAvLyBhbGxvdyBhY2Nlc3Mgb2YgcHJvcGVydGllcyBieSBuYW1lICggZS5nLiBzdHlsZS5wcm9wZXJ0aWVzLmhlaWdodCApXG4gIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IHByb3BzLmxlbmd0aDsgX2kyKyspIHtcbiAgICB2YXIgcHJvcCA9IHByb3BzW19pMl07XG4gICAgcHJvcHNbcHJvcC5uYW1lXSA9IHByb3A7IC8vIGFsbG93IGxvb2t1cCBieSBuYW1lXG4gIH1cblxuICAvLyBtYXAgYWxpYXNlc1xuICBmb3IgKHZhciBfaTMgPSAwOyBfaTMgPCBhbGlhc2VzLmxlbmd0aDsgX2kzKyspIHtcbiAgICB2YXIgYWxpYXMgPSBhbGlhc2VzW19pM107XG4gICAgdmFyIHBvaW50c1RvUHJvcCA9IHByb3BzW2FsaWFzLnBvaW50c1RvXTtcbiAgICB2YXIgYWxpYXNQcm9wID0ge1xuICAgICAgbmFtZTogYWxpYXMubmFtZSxcbiAgICAgIGFsaWFzOiB0cnVlLFxuICAgICAgcG9pbnRzVG86IHBvaW50c1RvUHJvcFxuICAgIH07XG5cbiAgICAvLyBhZGQgYWxpYXMgcHJvcCBmb3IgcGFyc2luZ1xuICAgIHByb3BzLnB1c2goYWxpYXNQcm9wKTtcbiAgICBwcm9wc1thbGlhcy5uYW1lXSA9IGFsaWFzUHJvcDsgLy8gYWxsb3cgbG9va3VwIGJ5IG5hbWVcbiAgfVxufSkoKTtcbnN0eWZuJDIuZ2V0RGVmYXVsdFByb3BlcnR5ID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgcmV0dXJuIHRoaXMuZ2V0RGVmYXVsdFByb3BlcnRpZXMoKVtuYW1lXTtcbn07XG5zdHlmbiQyLmdldERlZmF1bHRQcm9wZXJ0aWVzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuICBpZiAoX3AuZGVmYXVsdFByb3BlcnRpZXMgIT0gbnVsbCkge1xuICAgIHJldHVybiBfcC5kZWZhdWx0UHJvcGVydGllcztcbiAgfVxuICB2YXIgcmF3UHJvcHMgPSBleHRlbmQoe1xuICAgIC8vIGNvcmUgcHJvcHNcbiAgICAnc2VsZWN0aW9uLWJveC1jb2xvcic6ICcjZGRkJyxcbiAgICAnc2VsZWN0aW9uLWJveC1vcGFjaXR5JzogMC42NSxcbiAgICAnc2VsZWN0aW9uLWJveC1ib3JkZXItY29sb3InOiAnI2FhYScsXG4gICAgJ3NlbGVjdGlvbi1ib3gtYm9yZGVyLXdpZHRoJzogMSxcbiAgICAnYWN0aXZlLWJnLWNvbG9yJzogJ2JsYWNrJyxcbiAgICAnYWN0aXZlLWJnLW9wYWNpdHknOiAwLjE1LFxuICAgICdhY3RpdmUtYmctc2l6ZSc6IDMwLFxuICAgICdvdXRzaWRlLXRleHR1cmUtYmctY29sb3InOiAnIzAwMCcsXG4gICAgJ291dHNpZGUtdGV4dHVyZS1iZy1vcGFjaXR5JzogMC4xMjUsXG4gICAgLy8gY29tbW9uIG5vZGUvZWRnZSBwcm9wc1xuICAgICdldmVudHMnOiAneWVzJyxcbiAgICAndGV4dC1ldmVudHMnOiAnbm8nLFxuICAgICd0ZXh0LXZhbGlnbic6ICd0b3AnLFxuICAgICd0ZXh0LWhhbGlnbic6ICdjZW50ZXInLFxuICAgICd0ZXh0LWp1c3RpZmljYXRpb24nOiAnYXV0bycsXG4gICAgJ2xpbmUtaGVpZ2h0JzogMSxcbiAgICAnY29sb3InOiAnIzAwMCcsXG4gICAgJ2JveC1zZWxlY3Rpb24nOiAnY29udGFpbicsXG4gICAgJ3RleHQtb3V0bGluZS1jb2xvcic6ICcjMDAwJyxcbiAgICAndGV4dC1vdXRsaW5lLXdpZHRoJzogMCxcbiAgICAndGV4dC1vdXRsaW5lLW9wYWNpdHknOiAxLFxuICAgICd0ZXh0LW9wYWNpdHknOiAxLFxuICAgICd0ZXh0LWRlY29yYXRpb24nOiAnbm9uZScsXG4gICAgJ3RleHQtdHJhbnNmb3JtJzogJ25vbmUnLFxuICAgICd0ZXh0LXdyYXAnOiAnbm9uZScsXG4gICAgJ3RleHQtb3ZlcmZsb3ctd3JhcCc6ICd3aGl0ZXNwYWNlJyxcbiAgICAndGV4dC1tYXgtd2lkdGgnOiA5OTk5LFxuICAgICd0ZXh0LWJhY2tncm91bmQtY29sb3InOiAnIzAwMCcsXG4gICAgJ3RleHQtYmFja2dyb3VuZC1vcGFjaXR5JzogMCxcbiAgICAndGV4dC1iYWNrZ3JvdW5kLXNoYXBlJzogJ3JlY3RhbmdsZScsXG4gICAgJ3RleHQtYmFja2dyb3VuZC1wYWRkaW5nJzogMCxcbiAgICAndGV4dC1ib3JkZXItb3BhY2l0eSc6IDAsXG4gICAgJ3RleHQtYm9yZGVyLXdpZHRoJzogMCxcbiAgICAndGV4dC1ib3JkZXItc3R5bGUnOiAnc29saWQnLFxuICAgICd0ZXh0LWJvcmRlci1jb2xvcic6ICcjMDAwJyxcbiAgICAnZm9udC1mYW1pbHknOiAnSGVsdmV0aWNhIE5ldWUsIEhlbHZldGljYSwgc2Fucy1zZXJpZicsXG4gICAgJ2ZvbnQtc3R5bGUnOiAnbm9ybWFsJyxcbiAgICAnZm9udC13ZWlnaHQnOiAnbm9ybWFsJyxcbiAgICAnZm9udC1zaXplJzogMTYsXG4gICAgJ21pbi16b29tZWQtZm9udC1zaXplJzogMCxcbiAgICAndGV4dC1yb3RhdGlvbic6ICdub25lJyxcbiAgICAnc291cmNlLXRleHQtcm90YXRpb24nOiAnbm9uZScsXG4gICAgJ3RhcmdldC10ZXh0LXJvdGF0aW9uJzogJ25vbmUnLFxuICAgICd2aXNpYmlsaXR5JzogJ3Zpc2libGUnLFxuICAgICdkaXNwbGF5JzogJ2VsZW1lbnQnLFxuICAgICdvcGFjaXR5JzogMSxcbiAgICAnei1jb21wb3VuZC1kZXB0aCc6ICdhdXRvJyxcbiAgICAnei1pbmRleC1jb21wYXJlJzogJ2F1dG8nLFxuICAgICd6LWluZGV4JzogMCxcbiAgICAnbGFiZWwnOiAnJyxcbiAgICAndGV4dC1tYXJnaW4teCc6IDAsXG4gICAgJ3RleHQtbWFyZ2luLXknOiAwLFxuICAgICdzb3VyY2UtbGFiZWwnOiAnJyxcbiAgICAnc291cmNlLXRleHQtb2Zmc2V0JzogMCxcbiAgICAnc291cmNlLXRleHQtbWFyZ2luLXgnOiAwLFxuICAgICdzb3VyY2UtdGV4dC1tYXJnaW4teSc6IDAsXG4gICAgJ3RhcmdldC1sYWJlbCc6ICcnLFxuICAgICd0YXJnZXQtdGV4dC1vZmZzZXQnOiAwLFxuICAgICd0YXJnZXQtdGV4dC1tYXJnaW4teCc6IDAsXG4gICAgJ3RhcmdldC10ZXh0LW1hcmdpbi15JzogMCxcbiAgICAnb3ZlcmxheS1vcGFjaXR5JzogMCxcbiAgICAnb3ZlcmxheS1jb2xvcic6ICcjMDAwJyxcbiAgICAnb3ZlcmxheS1wYWRkaW5nJzogMTAsXG4gICAgJ292ZXJsYXktc2hhcGUnOiAncm91bmQtcmVjdGFuZ2xlJyxcbiAgICAnb3ZlcmxheS1jb3JuZXItcmFkaXVzJzogJ2F1dG8nLFxuICAgICd1bmRlcmxheS1vcGFjaXR5JzogMCxcbiAgICAndW5kZXJsYXktY29sb3InOiAnIzAwMCcsXG4gICAgJ3VuZGVybGF5LXBhZGRpbmcnOiAxMCxcbiAgICAndW5kZXJsYXktc2hhcGUnOiAncm91bmQtcmVjdGFuZ2xlJyxcbiAgICAndW5kZXJsYXktY29ybmVyLXJhZGl1cyc6ICdhdXRvJyxcbiAgICAndGV4dC1tZXRyaWNzJzogJ2ZvbnQnLFxuICAgICd0cmFuc2l0aW9uLXByb3BlcnR5JzogJ25vbmUnLFxuICAgICd0cmFuc2l0aW9uLWR1cmF0aW9uJzogMCxcbiAgICAndHJhbnNpdGlvbi1kZWxheSc6IDAsXG4gICAgJ3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uJzogJ2xpbmVhcicsXG4gICAgJ2JveC1zZWxlY3QtbGFiZWxzJzogJ25vJyxcbiAgICAvLyBub2RlIHByb3BzXG4gICAgJ2JhY2tncm91bmQtYmxhY2tlbic6IDAsXG4gICAgJ2JhY2tncm91bmQtY29sb3InOiAnIzk5OScsXG4gICAgJ2JhY2tncm91bmQtZmlsbCc6ICdzb2xpZCcsXG4gICAgJ2JhY2tncm91bmQtb3BhY2l0eSc6IDEsXG4gICAgJ2JhY2tncm91bmQtaW1hZ2UnOiAnbm9uZScsXG4gICAgJ2JhY2tncm91bmQtaW1hZ2UtY3Jvc3NvcmlnaW4nOiAnYW5vbnltb3VzJyxcbiAgICAnYmFja2dyb3VuZC1pbWFnZS1vcGFjaXR5JzogMSxcbiAgICAnYmFja2dyb3VuZC1pbWFnZS1jb250YWlubWVudCc6ICdpbnNpZGUnLFxuICAgICdiYWNrZ3JvdW5kLWltYWdlLXNtb290aGluZyc6ICd5ZXMnLFxuICAgICdiYWNrZ3JvdW5kLXBvc2l0aW9uLXgnOiAnNTAlJyxcbiAgICAnYmFja2dyb3VuZC1wb3NpdGlvbi15JzogJzUwJScsXG4gICAgJ2JhY2tncm91bmQtb2Zmc2V0LXgnOiAwLFxuICAgICdiYWNrZ3JvdW5kLW9mZnNldC15JzogMCxcbiAgICAnYmFja2dyb3VuZC13aWR0aC1yZWxhdGl2ZS10byc6ICdpbmNsdWRlLXBhZGRpbmcnLFxuICAgICdiYWNrZ3JvdW5kLWhlaWdodC1yZWxhdGl2ZS10byc6ICdpbmNsdWRlLXBhZGRpbmcnLFxuICAgICdiYWNrZ3JvdW5kLXJlcGVhdCc6ICduby1yZXBlYXQnLFxuICAgICdiYWNrZ3JvdW5kLWZpdCc6ICdub25lJyxcbiAgICAnYmFja2dyb3VuZC1jbGlwJzogJ25vZGUnLFxuICAgICdiYWNrZ3JvdW5kLXdpZHRoJzogJ2F1dG8nLFxuICAgICdiYWNrZ3JvdW5kLWhlaWdodCc6ICdhdXRvJyxcbiAgICAnYm9yZGVyLWNvbG9yJzogJyMwMDAnLFxuICAgICdib3JkZXItb3BhY2l0eSc6IDEsXG4gICAgJ2JvcmRlci13aWR0aCc6IDAsXG4gICAgJ2JvcmRlci1zdHlsZSc6ICdzb2xpZCcsXG4gICAgJ2JvcmRlci1kYXNoLXBhdHRlcm4nOiBbNCwgMl0sXG4gICAgJ2JvcmRlci1kYXNoLW9mZnNldCc6IDAsXG4gICAgJ2JvcmRlci1jYXAnOiAnYnV0dCcsXG4gICAgJ2JvcmRlci1qb2luJzogJ21pdGVyJyxcbiAgICAnYm9yZGVyLXBvc2l0aW9uJzogJ2NlbnRlcicsXG4gICAgJ291dGxpbmUtY29sb3InOiAnIzk5OScsXG4gICAgJ291dGxpbmUtb3BhY2l0eSc6IDEsXG4gICAgJ291dGxpbmUtd2lkdGgnOiAwLFxuICAgICdvdXRsaW5lLW9mZnNldCc6IDAsXG4gICAgJ291dGxpbmUtc3R5bGUnOiAnc29saWQnLFxuICAgICdoZWlnaHQnOiAzMCxcbiAgICAnd2lkdGgnOiAzMCxcbiAgICAnc2hhcGUnOiAnZWxsaXBzZScsXG4gICAgJ3NoYXBlLXBvbHlnb24tcG9pbnRzJzogJy0xLCAtMSwgICAxLCAtMSwgICAxLCAxLCAgIC0xLCAxJyxcbiAgICAnY29ybmVyLXJhZGl1cyc6ICdhdXRvJyxcbiAgICAnYm91bmRzLWV4cGFuc2lvbic6IDAsXG4gICAgLy8gbm9kZSBncmFkaWVudFxuICAgICdiYWNrZ3JvdW5kLWdyYWRpZW50LWRpcmVjdGlvbic6ICd0by1ib3R0b20nLFxuICAgICdiYWNrZ3JvdW5kLWdyYWRpZW50LXN0b3AtY29sb3JzJzogJyM5OTknLFxuICAgICdiYWNrZ3JvdW5kLWdyYWRpZW50LXN0b3AtcG9zaXRpb25zJzogJzAlJyxcbiAgICAvLyBnaG9zdCBwcm9wc1xuICAgICdnaG9zdCc6ICdubycsXG4gICAgJ2dob3N0LW9mZnNldC15JzogMCxcbiAgICAnZ2hvc3Qtb2Zmc2V0LXgnOiAwLFxuICAgICdnaG9zdC1vcGFjaXR5JzogMCxcbiAgICAvLyBjb21wb3VuZCBwcm9wc1xuICAgICdwYWRkaW5nJzogMCxcbiAgICAncGFkZGluZy1yZWxhdGl2ZS10byc6ICd3aWR0aCcsXG4gICAgJ3Bvc2l0aW9uJzogJ29yaWdpbicsXG4gICAgJ2NvbXBvdW5kLXNpemluZy13cnQtbGFiZWxzJzogJ2luY2x1ZGUnLFxuICAgICdtaW4td2lkdGgnOiAwLFxuICAgICdtaW4td2lkdGgtYmlhcy1sZWZ0JzogMCxcbiAgICAnbWluLXdpZHRoLWJpYXMtcmlnaHQnOiAwLFxuICAgICdtaW4taGVpZ2h0JzogMCxcbiAgICAnbWluLWhlaWdodC1iaWFzLXRvcCc6IDAsXG4gICAgJ21pbi1oZWlnaHQtYmlhcy1ib3R0b20nOiAwXG4gIH0sIHtcbiAgICAvLyBub2RlIHBpZSBiZ1xuICAgICdwaWUtc2l6ZSc6ICcxMDAlJyxcbiAgICAncGllLWhvbGUnOiAwLFxuICAgICdwaWUtc3RhcnQtYW5nbGUnOiAnMGRlZydcbiAgfSwgW3tcbiAgICBuYW1lOiAncGllLXt7aX19LWJhY2tncm91bmQtY29sb3InLFxuICAgIHZhbHVlOiAnYmxhY2snXG4gIH0sIHtcbiAgICBuYW1lOiAncGllLXt7aX19LWJhY2tncm91bmQtc2l6ZScsXG4gICAgdmFsdWU6ICcwJSdcbiAgfSwge1xuICAgIG5hbWU6ICdwaWUte3tpfX0tYmFja2dyb3VuZC1vcGFjaXR5JyxcbiAgICB2YWx1ZTogMVxuICB9XS5yZWR1Y2UoZnVuY3Rpb24gKGNzcywgcHJvcCkge1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDw9IHN0eWZuJDIucGllQmFja2dyb3VuZE47IGkrKykge1xuICAgICAgdmFyIG5hbWUgPSBwcm9wLm5hbWUucmVwbGFjZSgne3tpfX0nLCBpKTtcbiAgICAgIHZhciB2YWwgPSBwcm9wLnZhbHVlO1xuICAgICAgY3NzW25hbWVdID0gdmFsO1xuICAgIH1cbiAgICByZXR1cm4gY3NzO1xuICB9LCB7fSksIHtcbiAgICAvLyBub2RlIHN0cmlwZXMgYmdcbiAgICAnc3RyaXBlLXNpemUnOiAnMTAwJScsXG4gICAgJ3N0cmlwZS1kaXJlY3Rpb24nOiAnaG9yaXpvbnRhbCdcbiAgfSwgW3tcbiAgICBuYW1lOiAnc3RyaXBlLXt7aX19LWJhY2tncm91bmQtY29sb3InLFxuICAgIHZhbHVlOiAnYmxhY2snXG4gIH0sIHtcbiAgICBuYW1lOiAnc3RyaXBlLXt7aX19LWJhY2tncm91bmQtc2l6ZScsXG4gICAgdmFsdWU6ICcwJSdcbiAgfSwge1xuICAgIG5hbWU6ICdzdHJpcGUte3tpfX0tYmFja2dyb3VuZC1vcGFjaXR5JyxcbiAgICB2YWx1ZTogMVxuICB9XS5yZWR1Y2UoZnVuY3Rpb24gKGNzcywgcHJvcCkge1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDw9IHN0eWZuJDIuc3RyaXBlQmFja2dyb3VuZE47IGkrKykge1xuICAgICAgdmFyIG5hbWUgPSBwcm9wLm5hbWUucmVwbGFjZSgne3tpfX0nLCBpKTtcbiAgICAgIHZhciB2YWwgPSBwcm9wLnZhbHVlO1xuICAgICAgY3NzW25hbWVdID0gdmFsO1xuICAgIH1cbiAgICByZXR1cm4gY3NzO1xuICB9LCB7fSksIHtcbiAgICAvLyBlZGdlIHByb3BzXG4gICAgJ2xpbmUtc3R5bGUnOiAnc29saWQnLFxuICAgICdsaW5lLWNvbG9yJzogJyM5OTknLFxuICAgICdsaW5lLWZpbGwnOiAnc29saWQnLFxuICAgICdsaW5lLWNhcCc6ICdidXR0JyxcbiAgICAnbGluZS1vcGFjaXR5JzogMSxcbiAgICAnbGluZS1vdXRsaW5lLXdpZHRoJzogMCxcbiAgICAnbGluZS1vdXRsaW5lLWNvbG9yJzogJyMwMDAnLFxuICAgICdsaW5lLWdyYWRpZW50LXN0b3AtY29sb3JzJzogJyM5OTknLFxuICAgICdsaW5lLWdyYWRpZW50LXN0b3AtcG9zaXRpb25zJzogJzAlJyxcbiAgICAnY29udHJvbC1wb2ludC1zdGVwLXNpemUnOiA0MCxcbiAgICAnY29udHJvbC1wb2ludC13ZWlnaHRzJzogMC41LFxuICAgICdzZWdtZW50LXdlaWdodHMnOiAwLjUsXG4gICAgJ3NlZ21lbnQtZGlzdGFuY2VzJzogMjAsXG4gICAgJ3NlZ21lbnQtcmFkaWknOiAxNSxcbiAgICAncmFkaXVzLXR5cGUnOiAnYXJjLXJhZGl1cycsXG4gICAgJ3RheGktdHVybic6ICc1MCUnLFxuICAgICd0YXhpLXJhZGl1cyc6IDE1LFxuICAgICd0YXhpLXR1cm4tbWluLWRpc3RhbmNlJzogMTAsXG4gICAgJ3RheGktZGlyZWN0aW9uJzogJ2F1dG8nLFxuICAgICdlZGdlLWRpc3RhbmNlcyc6ICdpbnRlcnNlY3Rpb24nLFxuICAgICdjdXJ2ZS1zdHlsZSc6ICdoYXlzdGFjaycsXG4gICAgJ2hheXN0YWNrLXJhZGl1cyc6IDAsXG4gICAgJ2Fycm93LXNjYWxlJzogMSxcbiAgICAnbG9vcC1kaXJlY3Rpb24nOiAnLTQ1ZGVnJyxcbiAgICAnbG9vcC1zd2VlcCc6ICctOTBkZWcnLFxuICAgICdzb3VyY2UtZGlzdGFuY2UtZnJvbS1ub2RlJzogMCxcbiAgICAndGFyZ2V0LWRpc3RhbmNlLWZyb20tbm9kZSc6IDAsXG4gICAgJ3NvdXJjZS1lbmRwb2ludCc6ICdvdXRzaWRlLXRvLW5vZGUnLFxuICAgICd0YXJnZXQtZW5kcG9pbnQnOiAnb3V0c2lkZS10by1ub2RlJyxcbiAgICAnbGluZS1kYXNoLXBhdHRlcm4nOiBbNiwgM10sXG4gICAgJ2xpbmUtZGFzaC1vZmZzZXQnOiAwXG4gIH0sIFt7XG4gICAgbmFtZTogJ2Fycm93LXNoYXBlJyxcbiAgICB2YWx1ZTogJ25vbmUnXG4gIH0sIHtcbiAgICBuYW1lOiAnYXJyb3ctY29sb3InLFxuICAgIHZhbHVlOiAnIzk5OSdcbiAgfSwge1xuICAgIG5hbWU6ICdhcnJvdy1maWxsJyxcbiAgICB2YWx1ZTogJ2ZpbGxlZCdcbiAgfSwge1xuICAgIG5hbWU6ICdhcnJvdy13aWR0aCcsXG4gICAgdmFsdWU6IDFcbiAgfV0ucmVkdWNlKGZ1bmN0aW9uIChjc3MsIHByb3ApIHtcbiAgICBzdHlmbiQyLmFycm93UHJlZml4ZXMuZm9yRWFjaChmdW5jdGlvbiAocHJlZml4KSB7XG4gICAgICB2YXIgbmFtZSA9IHByZWZpeCArICctJyArIHByb3AubmFtZTtcbiAgICAgIHZhciB2YWwgPSBwcm9wLnZhbHVlO1xuICAgICAgY3NzW25hbWVdID0gdmFsO1xuICAgIH0pO1xuICAgIHJldHVybiBjc3M7XG4gIH0sIHt9KSk7XG4gIHZhciBwYXJzZWRQcm9wcyA9IHt9O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBwcm9wID0gdGhpcy5wcm9wZXJ0aWVzW2ldO1xuICAgIGlmIChwcm9wLnBvaW50c1RvKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdmFyIG5hbWUgPSBwcm9wLm5hbWU7XG4gICAgdmFyIHZhbCA9IHJhd1Byb3BzW25hbWVdO1xuICAgIHZhciBwYXJzZWRQcm9wID0gdGhpcy5wYXJzZShuYW1lLCB2YWwpO1xuICAgIHBhcnNlZFByb3BzW25hbWVdID0gcGFyc2VkUHJvcDtcbiAgfVxuICBfcC5kZWZhdWx0UHJvcGVydGllcyA9IHBhcnNlZFByb3BzO1xuICByZXR1cm4gX3AuZGVmYXVsdFByb3BlcnRpZXM7XG59O1xuc3R5Zm4kMi5hZGREZWZhdWx0U3R5bGVzaGVldCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5zZWxlY3RvcignOnBhcmVudCcpLmNzcyh7XG4gICAgJ3NoYXBlJzogJ3JlY3RhbmdsZScsXG4gICAgJ3BhZGRpbmcnOiAxMCxcbiAgICAnYmFja2dyb3VuZC1jb2xvcic6ICcjZWVlJyxcbiAgICAnYm9yZGVyLWNvbG9yJzogJyNjY2MnLFxuICAgICdib3JkZXItd2lkdGgnOiAxXG4gIH0pLnNlbGVjdG9yKCdlZGdlJykuY3NzKHtcbiAgICAnd2lkdGgnOiAzXG4gIH0pLnNlbGVjdG9yKCc6bG9vcCcpLmNzcyh7XG4gICAgJ2N1cnZlLXN0eWxlJzogJ2JlemllcidcbiAgfSkuc2VsZWN0b3IoJ2VkZ2U6Y29tcG91bmQnKS5jc3Moe1xuICAgICdjdXJ2ZS1zdHlsZSc6ICdiZXppZXInLFxuICAgICdzb3VyY2UtZW5kcG9pbnQnOiAnb3V0c2lkZS10by1saW5lJyxcbiAgICAndGFyZ2V0LWVuZHBvaW50JzogJ291dHNpZGUtdG8tbGluZSdcbiAgfSkuc2VsZWN0b3IoJzpzZWxlY3RlZCcpLmNzcyh7XG4gICAgJ2JhY2tncm91bmQtY29sb3InOiAnIzAxNjlEOScsXG4gICAgJ2xpbmUtY29sb3InOiAnIzAxNjlEOScsXG4gICAgJ3NvdXJjZS1hcnJvdy1jb2xvcic6ICcjMDE2OUQ5JyxcbiAgICAndGFyZ2V0LWFycm93LWNvbG9yJzogJyMwMTY5RDknLFxuICAgICdtaWQtc291cmNlLWFycm93LWNvbG9yJzogJyMwMTY5RDknLFxuICAgICdtaWQtdGFyZ2V0LWFycm93LWNvbG9yJzogJyMwMTY5RDknXG4gIH0pLnNlbGVjdG9yKCc6cGFyZW50OnNlbGVjdGVkJykuY3NzKHtcbiAgICAnYmFja2dyb3VuZC1jb2xvcic6ICcjQ0NFMUY5JyxcbiAgICAnYm9yZGVyLWNvbG9yJzogJyNhZWM4ZTUnXG4gIH0pLnNlbGVjdG9yKCc6YWN0aXZlJykuY3NzKHtcbiAgICAnb3ZlcmxheS1jb2xvcic6ICdibGFjaycsXG4gICAgJ292ZXJsYXktcGFkZGluZyc6IDEwLFxuICAgICdvdmVybGF5LW9wYWNpdHknOiAwLjI1XG4gIH0pO1xuICB0aGlzLmRlZmF1bHRMZW5ndGggPSB0aGlzLmxlbmd0aDtcbn07XG5cbnZhciBzdHlmbiQxID0ge307XG5cbi8vIGEgY2FjaGluZyBsYXllciBmb3IgcHJvcGVydHkgcGFyc2luZ1xuc3R5Zm4kMS5wYXJzZSA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSwgcHJvcElzQnlwYXNzLCBwcm9wSXNGbGF0KSB7XG4gIHZhciBzZWxmID0gdGhpcztcblxuICAvLyBmdW5jdGlvbiB2YWx1ZXMgY2FuJ3QgYmUgY2FjaGVkIGluIGFsbCBjYXNlcywgYW5kIHRoZXJlIGlzbid0IG11Y2ggYmVuZWZpdCBvZiBjYWNoaW5nIHRoZW0gYW55d2F5XG4gIGlmIChmbiQ2KHZhbHVlKSkge1xuICAgIHJldHVybiBzZWxmLnBhcnNlSW1wbFdhcm4obmFtZSwgdmFsdWUsIHByb3BJc0J5cGFzcywgcHJvcElzRmxhdCk7XG4gIH1cbiAgdmFyIGZsYXRLZXkgPSBwcm9wSXNGbGF0ID09PSAnbWFwcGluZycgfHwgcHJvcElzRmxhdCA9PT0gdHJ1ZSB8fCBwcm9wSXNGbGF0ID09PSBmYWxzZSB8fCBwcm9wSXNGbGF0ID09IG51bGwgPyAnZG9udGNhcmUnIDogcHJvcElzRmxhdDtcbiAgdmFyIGJ5cGFzc0tleSA9IHByb3BJc0J5cGFzcyA/ICd0JyA6ICdmJztcbiAgdmFyIHZhbHVlS2V5ID0gJycgKyB2YWx1ZTtcbiAgdmFyIGFyZ0hhc2ggPSBoYXNoU3RyaW5ncyhuYW1lLCB2YWx1ZUtleSwgYnlwYXNzS2V5LCBmbGF0S2V5KTtcbiAgdmFyIHByb3BDYWNoZSA9IHNlbGYucHJvcENhY2hlID0gc2VsZi5wcm9wQ2FjaGUgfHwgW107XG4gIHZhciByZXQ7XG4gIGlmICghKHJldCA9IHByb3BDYWNoZVthcmdIYXNoXSkpIHtcbiAgICByZXQgPSBwcm9wQ2FjaGVbYXJnSGFzaF0gPSBzZWxmLnBhcnNlSW1wbFdhcm4obmFtZSwgdmFsdWUsIHByb3BJc0J5cGFzcywgcHJvcElzRmxhdCk7XG4gIH1cblxuICAvLyAtIGJ5cGFzc2VzIGNhbid0IGJlIHNoYXJlZCBiL2MgdGhlIHZhbHVlIGNhbiBiZSBjaGFuZ2VkIGJ5IGFuaW1hdGlvbnMgb3Igb3RoZXJ3aXNlIG92ZXJyaWRkZW5cbiAgLy8gLSBtYXBwaW5ncyBjYW4ndCBiZSBzaGFyZWQgYi9jIG1hcHBpbmdzIGFyZSBwZXItZWxlbWVudFxuICBpZiAocHJvcElzQnlwYXNzIHx8IHByb3BJc0ZsYXQgPT09ICdtYXBwaW5nJykge1xuICAgIC8vIG5lZWQgYSBjb3B5IHNpbmNlIHByb3BzIGFyZSBtdXRhdGVkIGxhdGVyIGluIHRoZWlyIGxpZmVjeWNsZXNcbiAgICByZXQgPSBjb3B5KHJldCk7XG4gICAgaWYgKHJldCkge1xuICAgICAgcmV0LnZhbHVlID0gY29weShyZXQudmFsdWUpOyAvLyBiZWNhdXNlIGl0IGNvdWxkIGJlIGFuIGFycmF5LCBlLmcuIGNvbG91clxuICAgIH1cbiAgfVxuICByZXR1cm4gcmV0O1xufTtcbnN0eWZuJDEucGFyc2VJbXBsV2FybiA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSwgcHJvcElzQnlwYXNzLCBwcm9wSXNGbGF0KSB7XG4gIHZhciBwcm9wID0gdGhpcy5wYXJzZUltcGwobmFtZSwgdmFsdWUsIHByb3BJc0J5cGFzcywgcHJvcElzRmxhdCk7XG4gIGlmICghcHJvcCAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgd2FybihcIlRoZSBzdHlsZSBwcm9wZXJ0eSBgXCIuY29uY2F0KG5hbWUsIFwiOiBcIikuY29uY2F0KHZhbHVlLCBcImAgaXMgaW52YWxpZFwiKSk7XG4gIH1cbiAgaWYgKHByb3AgJiYgKHByb3AubmFtZSA9PT0gJ3dpZHRoJyB8fCBwcm9wLm5hbWUgPT09ICdoZWlnaHQnKSAmJiB2YWx1ZSA9PT0gJ2xhYmVsJykge1xuICAgIHdhcm4oJ1RoZSBzdHlsZSB2YWx1ZSBvZiBgbGFiZWxgIGlzIGRlcHJlY2F0ZWQgZm9yIGAnICsgcHJvcC5uYW1lICsgJ2AnKTtcbiAgfVxuICByZXR1cm4gcHJvcDtcbn07XG5cbi8vIHBhcnNlIGEgcHJvcGVydHk7IHJldHVybiBudWxsIG9uIGludmFsaWQ7IHJldHVybiBwYXJzZWQgcHJvcGVydHkgb3RoZXJ3aXNlXG4vLyBmaWVsZHMgOlxuLy8gLSBuYW1lIDogdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5XG4vLyAtIHZhbHVlIDogdGhlIHBhcnNlZCwgbmF0aXZlLXR5cGVkIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eVxuLy8gLSBzdHJWYWx1ZSA6IGEgc3RyaW5nIHZhbHVlIHRoYXQgcmVwcmVzZW50cyB0aGUgcHJvcGVydHkgdmFsdWUgaW4gdmFsaWQgY3NzXG4vLyAtIGJ5cGFzcyA6IHRydWUgaWZmIHRoZSBwcm9wZXJ0eSBpcyBhIGJ5cGFzcyBwcm9wZXJ0eVxuc3R5Zm4kMS5wYXJzZUltcGwgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUsIHByb3BJc0J5cGFzcywgcHJvcElzRmxhdCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIG5hbWUgPSBjYW1lbDJkYXNoKG5hbWUpOyAvLyBtYWtlIHN1cmUgdGhlIHByb3BlcnR5IG5hbWUgaXMgaW4gZGFzaCBmb3JtIChlLmcuICdwcm9wZXJ0eS1uYW1lJyBub3QgJ3Byb3BlcnR5TmFtZScpXG5cbiAgdmFyIHByb3BlcnR5ID0gc2VsZi5wcm9wZXJ0aWVzW25hbWVdO1xuICB2YXIgcGFzc2VkVmFsdWUgPSB2YWx1ZTtcbiAgdmFyIHR5cGVzID0gc2VsZi50eXBlcztcbiAgaWYgKCFwcm9wZXJ0eSkge1xuICAgIHJldHVybiBudWxsO1xuICB9IC8vIHJldHVybiBudWxsIG9uIHByb3BlcnR5IG9mIHVua25vd24gbmFtZVxuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9IC8vIGNhbid0IGFzc2lnbiB1bmRlZmluZWRcblxuICAvLyB0aGUgcHJvcGVydHkgbWF5IGJlIGFuIGFsaWFzXG4gIGlmIChwcm9wZXJ0eS5hbGlhcykge1xuICAgIHByb3BlcnR5ID0gcHJvcGVydHkucG9pbnRzVG87XG4gICAgbmFtZSA9IHByb3BlcnR5Lm5hbWU7XG4gIH1cbiAgdmFyIHZhbHVlSXNTdHJpbmcgPSBzdHJpbmcodmFsdWUpO1xuICBpZiAodmFsdWVJc1N0cmluZykge1xuICAgIC8vIHRyaW0gdGhlIHZhbHVlIHRvIG1ha2UgcGFyc2luZyBlYXNpZXJcbiAgICB2YWx1ZSA9IHZhbHVlLnRyaW0oKTtcbiAgfVxuICB2YXIgdHlwZSA9IHByb3BlcnR5LnR5cGU7XG4gIGlmICghdHlwZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9IC8vIG5vIHR5cGUsIG5vIGx1Y2tcblxuICAvLyBjaGVjayBpZiBieXBhc3MgaXMgbnVsbCBvciBlbXB0eSBzdHJpbmcgKGkuZS4gaW5kaWNhdGlvbiB0byBkZWxldGUgYnlwYXNzIHByb3BlcnR5KVxuICBpZiAocHJvcElzQnlwYXNzICYmICh2YWx1ZSA9PT0gJycgfHwgdmFsdWUgPT09IG51bGwpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBieXBhc3M6IHRydWUsXG4gICAgICBkZWxldGVCeXBhc3M6IHRydWVcbiAgICB9O1xuICB9XG5cbiAgLy8gY2hlY2sgaWYgdmFsdWUgaXMgYSBmdW5jdGlvbiB1c2VkIGFzIGEgbWFwcGVyXG4gIGlmIChmbiQ2KHZhbHVlKSkge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgc3RyVmFsdWU6ICdmbicsXG4gICAgICBtYXBwZWQ6IHR5cGVzLmZuLFxuICAgICAgYnlwYXNzOiBwcm9wSXNCeXBhc3NcbiAgICB9O1xuICB9XG5cbiAgLy8gY2hlY2sgaWYgdmFsdWUgaXMgbWFwcGVkXG4gIHZhciBkYXRhLCBtYXBEYXRhO1xuICBpZiAoIXZhbHVlSXNTdHJpbmcgfHwgcHJvcElzRmxhdCB8fCB2YWx1ZS5sZW5ndGggPCA3IHx8IHZhbHVlWzFdICE9PSAnYScpIDsgZWxzZSBpZiAodmFsdWUubGVuZ3RoID49IDcgJiYgdmFsdWVbMF0gPT09ICdkJyAmJiAoZGF0YSA9IG5ldyBSZWdFeHAodHlwZXMuZGF0YS5yZWdleCkuZXhlYyh2YWx1ZSkpKSB7XG4gICAgaWYgKHByb3BJc0J5cGFzcykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gbWFwcGVycyBub3QgYWxsb3dlZCBpbiBieXBhc3NcblxuICAgIHZhciBtYXBwZWQgPSB0eXBlcy5kYXRhO1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgdmFsdWU6IGRhdGEsXG4gICAgICBzdHJWYWx1ZTogJycgKyB2YWx1ZSxcbiAgICAgIG1hcHBlZDogbWFwcGVkLFxuICAgICAgZmllbGQ6IGRhdGFbMV0sXG4gICAgICBieXBhc3M6IHByb3BJc0J5cGFzc1xuICAgIH07XG4gIH0gZWxzZSBpZiAodmFsdWUubGVuZ3RoID49IDEwICYmIHZhbHVlWzBdID09PSAnbScgJiYgKG1hcERhdGEgPSBuZXcgUmVnRXhwKHR5cGVzLm1hcERhdGEucmVnZXgpLmV4ZWModmFsdWUpKSkge1xuICAgIGlmIChwcm9wSXNCeXBhc3MpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IC8vIG1hcHBlcnMgbm90IGFsbG93ZWQgaW4gYnlwYXNzXG4gICAgaWYgKHR5cGUubXVsdGlwbGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IC8vIGltcG9zc2libGUgdG8gbWFwIHRvIG51bVxuXG4gICAgdmFyIF9tYXBwZWQgPSB0eXBlcy5tYXBEYXRhO1xuXG4gICAgLy8gd2UgY2FuIG1hcCBvbmx5IGlmIHRoZSB0eXBlIGlzIGEgY29sb3VyIG9yIGEgbnVtYmVyXG4gICAgaWYgKCEodHlwZS5jb2xvciB8fCB0eXBlLm51bWJlcikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIHZhbHVlTWluID0gdGhpcy5wYXJzZShuYW1lLCBtYXBEYXRhWzRdKTsgLy8gcGFyc2UgdG8gdmFsaWRhdGVcbiAgICBpZiAoIXZhbHVlTWluIHx8IHZhbHVlTWluLm1hcHBlZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gY2FuJ3QgYmUgaW52YWxpZCBvciBtYXBwZWRcblxuICAgIHZhciB2YWx1ZU1heCA9IHRoaXMucGFyc2UobmFtZSwgbWFwRGF0YVs1XSk7IC8vIHBhcnNlIHRvIHZhbGlkYXRlXG4gICAgaWYgKCF2YWx1ZU1heCB8fCB2YWx1ZU1heC5tYXBwZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IC8vIGNhbid0IGJlIGludmFsaWQgb3IgbWFwcGVkXG5cbiAgICAvLyBjaGVjayBpZiB2YWx1ZU1pbiBhbmQgdmFsdWVNYXggYXJlIHRoZSBzYW1lXG4gICAgaWYgKHZhbHVlTWluLnBmVmFsdWUgPT09IHZhbHVlTWF4LnBmVmFsdWUgfHwgdmFsdWVNaW4uc3RyVmFsdWUgPT09IHZhbHVlTWF4LnN0clZhbHVlKSB7XG4gICAgICB3YXJuKCdgJyArIG5hbWUgKyAnOiAnICsgdmFsdWUgKyAnYCBpcyBub3QgYSB2YWxpZCBtYXBwZXIgYmVjYXVzZSB0aGUgb3V0cHV0IHJhbmdlIGlzIHplcm87IGNvbnZlcnRpbmcgdG8gYCcgKyBuYW1lICsgJzogJyArIHZhbHVlTWluLnN0clZhbHVlICsgJ2AnKTtcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlKG5hbWUsIHZhbHVlTWluLnN0clZhbHVlKTsgLy8gY2FuJ3QgbWFrZSBtdWNoIG9mIGEgbWFwcGVyIHdpdGhvdXQgYSByYW5nZVxuICAgIH0gZWxzZSBpZiAodHlwZS5jb2xvcikge1xuICAgICAgdmFyIGMxID0gdmFsdWVNaW4udmFsdWU7XG4gICAgICB2YXIgYzIgPSB2YWx1ZU1heC52YWx1ZTtcbiAgICAgIHZhciBzYW1lID0gYzFbMF0gPT09IGMyWzBdIC8vIHJlZFxuICAgICAgJiYgYzFbMV0gPT09IGMyWzFdIC8vIGdyZWVuXG4gICAgICAmJiBjMVsyXSA9PT0gYzJbMl0gLy8gYmx1ZVxuICAgICAgJiYgKFxuICAgICAgLy8gb3B0aW9uYWwgYWxwaGFcbiAgICAgIGMxWzNdID09PSBjMlszXSAvLyBzYW1lIGFscGhhIG91dHJpZ2h0XG4gICAgICB8fCAoYzFbM10gPT0gbnVsbCB8fCBjMVszXSA9PT0gMSAvLyBmdWxsIG9wYWNpdHkgZm9yIGNvbG91ciAxP1xuICAgICAgKSAmJiAoYzJbM10gPT0gbnVsbCB8fCBjMlszXSA9PT0gMSkgLy8gZnVsbCBvcGFjaXR5IGZvciBjb2xvdXIgMj9cbiAgICAgICk7XG4gICAgICBpZiAoc2FtZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9IC8vIGNhbid0IG1ha2UgYSBtYXBwZXIgd2l0aG91dCBhIHJhbmdlXG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgdmFsdWU6IG1hcERhdGEsXG4gICAgICBzdHJWYWx1ZTogJycgKyB2YWx1ZSxcbiAgICAgIG1hcHBlZDogX21hcHBlZCxcbiAgICAgIGZpZWxkOiBtYXBEYXRhWzFdLFxuICAgICAgZmllbGRNaW46IHBhcnNlRmxvYXQobWFwRGF0YVsyXSksXG4gICAgICAvLyBtaW4gJiBtYXggYXJlIG51bWVyaWNcbiAgICAgIGZpZWxkTWF4OiBwYXJzZUZsb2F0KG1hcERhdGFbM10pLFxuICAgICAgdmFsdWVNaW46IHZhbHVlTWluLnZhbHVlLFxuICAgICAgdmFsdWVNYXg6IHZhbHVlTWF4LnZhbHVlLFxuICAgICAgYnlwYXNzOiBwcm9wSXNCeXBhc3NcbiAgICB9O1xuICB9XG4gIGlmICh0eXBlLm11bHRpcGxlICYmIHByb3BJc0ZsYXQgIT09ICdtdWx0aXBsZScpIHtcbiAgICB2YXIgdmFscztcbiAgICBpZiAodmFsdWVJc1N0cmluZykge1xuICAgICAgdmFscyA9IHZhbHVlLnNwbGl0KC9cXHMrLyk7XG4gICAgfSBlbHNlIGlmIChhcnJheSh2YWx1ZSkpIHtcbiAgICAgIHZhbHMgPSB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFscyA9IFt2YWx1ZV07XG4gICAgfVxuICAgIGlmICh0eXBlLmV2ZW5NdWx0aXBsZSAmJiB2YWxzLmxlbmd0aCAlIDIgIT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB2YXIgdmFsQXJyID0gW107XG4gICAgdmFyIHVuaXRzQXJyID0gW107XG4gICAgdmFyIHBmVmFsQXJyID0gW107XG4gICAgdmFyIHN0clZhbCA9ICcnO1xuICAgIHZhciBoYXNFbnVtID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcCA9IHNlbGYucGFyc2UobmFtZSwgdmFsc1tpXSwgcHJvcElzQnlwYXNzLCAnbXVsdGlwbGUnKTtcbiAgICAgIGhhc0VudW0gPSBoYXNFbnVtIHx8IHN0cmluZyhwLnZhbHVlKTtcbiAgICAgIHZhbEFyci5wdXNoKHAudmFsdWUpO1xuICAgICAgcGZWYWxBcnIucHVzaChwLnBmVmFsdWUgIT0gbnVsbCA/IHAucGZWYWx1ZSA6IHAudmFsdWUpO1xuICAgICAgdW5pdHNBcnIucHVzaChwLnVuaXRzKTtcbiAgICAgIHN0clZhbCArPSAoaSA+IDAgPyAnICcgOiAnJykgKyBwLnN0clZhbHVlO1xuICAgIH1cbiAgICBpZiAodHlwZS52YWxpZGF0ZSAmJiAhdHlwZS52YWxpZGF0ZSh2YWxBcnIsIHVuaXRzQXJyKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmICh0eXBlLnNpbmdsZUVudW0gJiYgaGFzRW51bSkge1xuICAgICAgaWYgKHZhbEFyci5sZW5ndGggPT09IDEgJiYgc3RyaW5nKHZhbEFyclswXSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgIHZhbHVlOiB2YWxBcnJbMF0sXG4gICAgICAgICAgc3RyVmFsdWU6IHZhbEFyclswXSxcbiAgICAgICAgICBieXBhc3M6IHByb3BJc0J5cGFzc1xuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgdmFsdWU6IHZhbEFycixcbiAgICAgIHBmVmFsdWU6IHBmVmFsQXJyLFxuICAgICAgc3RyVmFsdWU6IHN0clZhbCxcbiAgICAgIGJ5cGFzczogcHJvcElzQnlwYXNzLFxuICAgICAgdW5pdHM6IHVuaXRzQXJyXG4gICAgfTtcbiAgfVxuXG4gIC8vIHNldmVyYWwgdHlwZXMgYWxzbyBhbGxvdyBlbnVtc1xuICB2YXIgY2hlY2tFbnVtcyA9IGZ1bmN0aW9uIGNoZWNrRW51bXMoKSB7XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IHR5cGUuZW51bXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgZW4gPSB0eXBlLmVudW1zW19pXTtcbiAgICAgIGlmIChlbiA9PT0gdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICBzdHJWYWx1ZTogJycgKyB2YWx1ZSxcbiAgICAgICAgICBieXBhc3M6IHByb3BJc0J5cGFzc1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICAvLyBjaGVjayB0aGUgdHlwZSBhbmQgcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBvYmplY3RcbiAgaWYgKHR5cGUubnVtYmVyKSB7XG4gICAgdmFyIHVuaXRzO1xuICAgIHZhciBpbXBsaWNpdFVuaXRzID0gJ3B4JzsgLy8gbm90IHNldCA9PiBweFxuXG4gICAgaWYgKHR5cGUudW5pdHMpIHtcbiAgICAgIC8vIHVzZSBzcGVjaWZpZWQgdW5pdHMgaWYgc2V0XG4gICAgICB1bml0cyA9IHR5cGUudW5pdHM7XG4gICAgfVxuICAgIGlmICh0eXBlLmltcGxpY2l0VW5pdHMpIHtcbiAgICAgIGltcGxpY2l0VW5pdHMgPSB0eXBlLmltcGxpY2l0VW5pdHM7XG4gICAgfVxuICAgIGlmICghdHlwZS51bml0bGVzcykge1xuICAgICAgaWYgKHZhbHVlSXNTdHJpbmcpIHtcbiAgICAgICAgdmFyIHVuaXRzUmVnZXggPSAncHh8ZW0nICsgKHR5cGUuYWxsb3dQZXJjZW50ID8gJ3xcXFxcJScgOiAnJyk7XG4gICAgICAgIGlmICh1bml0cykge1xuICAgICAgICAgIHVuaXRzUmVnZXggPSB1bml0cztcbiAgICAgICAgfSAvLyBvbmx5IGFsbG93IGV4cGxpY2l0IHVuaXRzIGlmIHNvIHNldFxuICAgICAgICB2YXIgbWF0Y2ggPSB2YWx1ZS5tYXRjaCgnXignICsgbnVtYmVyICsgJykoJyArIHVuaXRzUmVnZXggKyAnKT8nICsgJyQnKTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgdmFsdWUgPSBtYXRjaFsxXTtcbiAgICAgICAgICB1bml0cyA9IG1hdGNoWzJdIHx8IGltcGxpY2l0VW5pdHM7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIXVuaXRzIHx8IHR5cGUuaW1wbGljaXRVbml0cykge1xuICAgICAgICB1bml0cyA9IGltcGxpY2l0VW5pdHM7IC8vIGltcGxpY2l0bHkgcHggaWYgdW5zcGVjaWZpZWRcbiAgICAgIH1cbiAgICB9XG4gICAgdmFsdWUgPSBwYXJzZUZsb2F0KHZhbHVlKTtcblxuICAgIC8vIGlmIG5vdCBhIG51bWJlciBhbmQgZW51bXMgbm90IGFsbG93ZWQsIHRoZW4gdGhlIHZhbHVlIGlzIGludmFsaWRcbiAgICBpZiAoaXNOYU4odmFsdWUpICYmIHR5cGUuZW51bXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgaWYgdGhpcyBudW1iZXIgdHlwZSBhbHNvIGFjY2VwdHMgc3BlY2lhbCBrZXl3b3JkcyBpbiBwbGFjZSBvZiBudW1iZXJzXG4gICAgLy8gKGkuZS4gYGxlZnRgLCBgYXV0b2AsIGV0YylcbiAgICBpZiAoaXNOYU4odmFsdWUpICYmIHR5cGUuZW51bXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFsdWUgPSBwYXNzZWRWYWx1ZTtcbiAgICAgIHJldHVybiBjaGVja0VudW1zKCk7XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgaWYgdmFsdWUgbXVzdCBiZSBhbiBpbnRlZ2VyXG4gICAgaWYgKHR5cGUuaW50ZWdlciAmJiAhaW50ZWdlcih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIGNoZWNrIHZhbHVlIGlzIHdpdGhpbiByYW5nZVxuICAgIGlmICh0eXBlLm1pbiAhPT0gdW5kZWZpbmVkICYmICh2YWx1ZSA8IHR5cGUubWluIHx8IHR5cGUuc3RyaWN0TWluICYmIHZhbHVlID09PSB0eXBlLm1pbikgfHwgdHlwZS5tYXggIT09IHVuZGVmaW5lZCAmJiAodmFsdWUgPiB0eXBlLm1heCB8fCB0eXBlLnN0cmljdE1heCAmJiB2YWx1ZSA9PT0gdHlwZS5tYXgpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdmFyIHJldCA9IHtcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBzdHJWYWx1ZTogJycgKyB2YWx1ZSArICh1bml0cyA/IHVuaXRzIDogJycpLFxuICAgICAgdW5pdHM6IHVuaXRzLFxuICAgICAgYnlwYXNzOiBwcm9wSXNCeXBhc3NcbiAgICB9O1xuXG4gICAgLy8gbm9ybWFsaXNlIHZhbHVlIGluIHBpeGVsc1xuICAgIGlmICh0eXBlLnVuaXRsZXNzIHx8IHVuaXRzICE9PSAncHgnICYmIHVuaXRzICE9PSAnZW0nKSB7XG4gICAgICByZXQucGZWYWx1ZSA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXQucGZWYWx1ZSA9IHVuaXRzID09PSAncHgnIHx8ICF1bml0cyA/IHZhbHVlIDogdGhpcy5nZXRFbVNpemVJblBpeGVscygpICogdmFsdWU7XG4gICAgfVxuXG4gICAgLy8gbm9ybWFsaXNlIHZhbHVlIGluIG1zXG4gICAgaWYgKHVuaXRzID09PSAnbXMnIHx8IHVuaXRzID09PSAncycpIHtcbiAgICAgIHJldC5wZlZhbHVlID0gdW5pdHMgPT09ICdtcycgPyB2YWx1ZSA6IDEwMDAgKiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBub3JtYWxpc2UgdmFsdWUgaW4gcmFkXG4gICAgaWYgKHVuaXRzID09PSAnZGVnJyB8fCB1bml0cyA9PT0gJ3JhZCcpIHtcbiAgICAgIHJldC5wZlZhbHVlID0gdW5pdHMgPT09ICdyYWQnID8gdmFsdWUgOiBkZWcycmFkKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvLyBub3JtYWxpemUgdmFsdWUgaW4gJVxuICAgIGlmICh1bml0cyA9PT0gJyUnKSB7XG4gICAgICByZXQucGZWYWx1ZSA9IHZhbHVlIC8gMTAwO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9IGVsc2UgaWYgKHR5cGUucHJvcExpc3QpIHtcbiAgICB2YXIgcHJvcHMgPSBbXTtcbiAgICB2YXIgcHJvcHNTdHIgPSAnJyArIHZhbHVlO1xuICAgIGlmIChwcm9wc1N0ciA9PT0gJ25vbmUnKSA7IGVsc2Uge1xuICAgICAgLy8gZ28gb3ZlciBlYWNoIHByb3BcblxuICAgICAgdmFyIHByb3BzU3BsaXQgPSBwcm9wc1N0ci5zcGxpdCgvXFxzKixcXHMqfFxccysvKTtcbiAgICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IHByb3BzU3BsaXQubGVuZ3RoOyBfaTIrKykge1xuICAgICAgICB2YXIgcHJvcE5hbWUgPSBwcm9wc1NwbGl0W19pMl0udHJpbSgpO1xuICAgICAgICBpZiAoc2VsZi5wcm9wZXJ0aWVzW3Byb3BOYW1lXSkge1xuICAgICAgICAgIHByb3BzLnB1c2gocHJvcE5hbWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHdhcm4oJ2AnICsgcHJvcE5hbWUgKyAnYCBpcyBub3QgYSB2YWxpZCBwcm9wZXJ0eSBuYW1lJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChwcm9wcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgdmFsdWU6IHByb3BzLFxuICAgICAgc3RyVmFsdWU6IHByb3BzLmxlbmd0aCA9PT0gMCA/ICdub25lJyA6IHByb3BzLmpvaW4oJyAnKSxcbiAgICAgIGJ5cGFzczogcHJvcElzQnlwYXNzXG4gICAgfTtcbiAgfSBlbHNlIGlmICh0eXBlLmNvbG9yKSB7XG4gICAgdmFyIHR1cGxlID0gY29sb3IydHVwbGUodmFsdWUpO1xuICAgIGlmICghdHVwbGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIHZhbHVlOiB0dXBsZSxcbiAgICAgIHBmVmFsdWU6IHR1cGxlLFxuICAgICAgc3RyVmFsdWU6ICdyZ2IoJyArIHR1cGxlWzBdICsgJywnICsgdHVwbGVbMV0gKyAnLCcgKyB0dXBsZVsyXSArICcpJyxcbiAgICAgIC8vIG4uYi4gbm8gc3BhY2VzIGIvYyBvZiBtdWx0aXBsZSBzdXBwb3J0XG4gICAgICBieXBhc3M6IHByb3BJc0J5cGFzc1xuICAgIH07XG4gIH0gZWxzZSBpZiAodHlwZS5yZWdleCB8fCB0eXBlLnJlZ2V4ZXMpIHtcbiAgICAvLyBmaXJzdCBjaGVjayBlbnVtc1xuICAgIGlmICh0eXBlLmVudW1zKSB7XG4gICAgICB2YXIgZW51bVByb3AgPSBjaGVja0VudW1zKCk7XG4gICAgICBpZiAoZW51bVByb3ApIHtcbiAgICAgICAgcmV0dXJuIGVudW1Qcm9wO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgcmVnZXhlcyA9IHR5cGUucmVnZXhlcyA/IHR5cGUucmVnZXhlcyA6IFt0eXBlLnJlZ2V4XTtcbiAgICBmb3IgKHZhciBfaTMgPSAwOyBfaTMgPCByZWdleGVzLmxlbmd0aDsgX2kzKyspIHtcbiAgICAgIHZhciByZWdleCA9IG5ldyBSZWdFeHAocmVnZXhlc1tfaTNdKTsgLy8gbWFrZSBhIHJlZ2V4IGZyb20gdGhlIHR5cGUgc3RyaW5nXG4gICAgICB2YXIgbSA9IHJlZ2V4LmV4ZWModmFsdWUpO1xuICAgICAgaWYgKG0pIHtcbiAgICAgICAgLy8gcmVnZXggbWF0Y2hlc1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgdmFsdWU6IHR5cGUuc2luZ2xlUmVnZXhNYXRjaFZhbHVlID8gbVsxXSA6IG0sXG4gICAgICAgICAgc3RyVmFsdWU6ICcnICsgdmFsdWUsXG4gICAgICAgICAgYnlwYXNzOiBwcm9wSXNCeXBhc3NcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7IC8vIGRpZG4ndCBtYXRjaCBhbnlcbiAgfSBlbHNlIGlmICh0eXBlLnN0cmluZykge1xuICAgIC8vIGp1c3QgcmV0dXJuXG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICB2YWx1ZTogJycgKyB2YWx1ZSxcbiAgICAgIHN0clZhbHVlOiAnJyArIHZhbHVlLFxuICAgICAgYnlwYXNzOiBwcm9wSXNCeXBhc3NcbiAgICB9O1xuICB9IGVsc2UgaWYgKHR5cGUuZW51bXMpIHtcbiAgICAvLyBjaGVjayBlbnVtcyBsYXN0IGJlY2F1c2UgaXQncyBhIGNvbWJvIHR5cGUgaW4gb3RoZXJzXG4gICAgcmV0dXJuIGNoZWNrRW51bXMoKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbDsgLy8gbm90IGEgdHlwZSB3ZSBjYW4gaGFuZGxlXG4gIH1cbn07XG5cbnZhciBfU3R5bGUgPSBmdW5jdGlvbiBTdHlsZShjeSkge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgX1N0eWxlKSkge1xuICAgIHJldHVybiBuZXcgX1N0eWxlKGN5KTtcbiAgfVxuICBpZiAoIWNvcmUoY3kpKSB7XG4gICAgZXJyb3IoJ0Egc3R5bGUgbXVzdCBoYXZlIGEgY29yZSByZWZlcmVuY2UnKTtcbiAgICByZXR1cm47XG4gIH1cbiAgdGhpcy5fcHJpdmF0ZSA9IHtcbiAgICBjeTogY3ksXG4gICAgY29yZVN0eWxlOiB7fVxuICB9O1xuICB0aGlzLmxlbmd0aCA9IDA7XG4gIHRoaXMucmVzZXRUb0RlZmF1bHQoKTtcbn07XG52YXIgc3R5Zm4gPSBfU3R5bGUucHJvdG90eXBlO1xuc3R5Zm4uaW5zdGFuY2VTdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAnc3R5bGUnO1xufTtcblxuLy8gcmVtb3ZlIGFsbCBjb250ZXh0c1xuc3R5Zm4uY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG4gIHZhciBjeSA9IF9wLmN5O1xuICB2YXIgZWxlcyA9IGN5LmVsZW1lbnRzKCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgIHRoaXNbaV0gPSB1bmRlZmluZWQ7XG4gIH1cbiAgdGhpcy5sZW5ndGggPSAwO1xuICBfcC5jb250ZXh0U3R5bGVzID0ge307XG4gIF9wLnByb3BEaWZmcyA9IHt9O1xuICB0aGlzLmNsZWFuRWxlbWVudHMoZWxlcywgdHJ1ZSk7XG4gIGVsZXMuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgdmFyIGVsZV9wID0gZWxlWzBdLl9wcml2YXRlO1xuICAgIGVsZV9wLnN0eWxlRGlydHkgPSB0cnVlO1xuICAgIGVsZV9wLmFwcGxpZWRJbml0U3R5bGUgPSBmYWxzZTtcbiAgfSk7XG4gIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xufTtcbnN0eWZuLnJlc2V0VG9EZWZhdWx0ID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmNsZWFyKCk7XG4gIHRoaXMuYWRkRGVmYXVsdFN0eWxlc2hlZXQoKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBidWlsZHMgYSBzdHlsZSBvYmplY3QgZm9yIHRoZSAnY29yZScgc2VsZWN0b3JcbnN0eWZuLmNvcmUgPSBmdW5jdGlvbiAocHJvcE5hbWUpIHtcbiAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuY29yZVN0eWxlW3Byb3BOYW1lXSB8fCB0aGlzLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wTmFtZSk7XG59O1xuXG4vLyBjcmVhdGUgYSBuZXcgY29udGV4dCBmcm9tIHRoZSBzcGVjaWZpZWQgc2VsZWN0b3Igc3RyaW5nIGFuZCBzd2l0Y2ggdG8gdGhhdCBjb250ZXh0XG5zdHlmbi5zZWxlY3RvciA9IGZ1bmN0aW9uIChzZWxlY3RvclN0cikge1xuICAvLyAnY29yZScgaXMgYSBzcGVjaWFsIGNhc2UgYW5kIGRvZXMgbm90IG5lZWQgYSBzZWxlY3RvclxuICB2YXIgc2VsZWN0b3IgPSBzZWxlY3RvclN0ciA9PT0gJ2NvcmUnID8gbnVsbCA6IG5ldyBTZWxlY3RvcihzZWxlY3RvclN0cik7XG4gIHZhciBpID0gdGhpcy5sZW5ndGgrKzsgLy8gbmV3IGNvbnRleHQgbWVhbnMgbmV3IGluZGV4XG4gIHRoaXNbaV0gPSB7XG4gICAgc2VsZWN0b3I6IHNlbGVjdG9yLFxuICAgIHByb3BlcnRpZXM6IFtdLFxuICAgIG1hcHBlZFByb3BlcnRpZXM6IFtdLFxuICAgIGluZGV4OiBpXG4gIH07XG4gIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xufTtcblxuLy8gYWRkIG9uZSBvciBtYW55IGNzcyBydWxlcyB0byB0aGUgY3VycmVudCBjb250ZXh0XG5zdHlmbi5jc3MgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gIGlmIChhcmdzLmxlbmd0aCA9PT0gMSkge1xuICAgIHZhciBtYXAgPSBhcmdzWzBdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5wcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcHJvcCA9IHNlbGYucHJvcGVydGllc1tpXTtcbiAgICAgIHZhciBtYXBWYWwgPSBtYXBbcHJvcC5uYW1lXTtcbiAgICAgIGlmIChtYXBWYWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBtYXBWYWwgPSBtYXBbZGFzaDJjYW1lbChwcm9wLm5hbWUpXTtcbiAgICAgIH1cbiAgICAgIGlmIChtYXBWYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmNzc1J1bGUocHJvcC5uYW1lLCBtYXBWYWwpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PT0gMikge1xuICAgIHRoaXMuY3NzUnVsZShhcmdzWzBdLCBhcmdzWzFdKTtcbiAgfVxuXG4gIC8vIGRvIG5vdGhpbmcgaWYgYXJncyBhcmUgaW52YWxpZFxuXG4gIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xufTtcbnN0eWZuLnN0eWxlID0gc3R5Zm4uY3NzO1xuXG4vLyBhZGQgYSBzaW5nbGUgY3NzIHJ1bGUgdG8gdGhlIGN1cnJlbnQgY29udGV4dFxuc3R5Zm4uY3NzUnVsZSA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAvLyBuYW1lLXZhbHVlIHBhaXJcbiAgdmFyIHByb3BlcnR5ID0gdGhpcy5wYXJzZShuYW1lLCB2YWx1ZSk7XG5cbiAgLy8gYWRkIHByb3BlcnR5IHRvIGN1cnJlbnQgY29udGV4dCBpZiB2YWxpZFxuICBpZiAocHJvcGVydHkpIHtcbiAgICB2YXIgaSA9IHRoaXMubGVuZ3RoIC0gMTtcbiAgICB0aGlzW2ldLnByb3BlcnRpZXMucHVzaChwcm9wZXJ0eSk7XG4gICAgdGhpc1tpXS5wcm9wZXJ0aWVzW3Byb3BlcnR5Lm5hbWVdID0gcHJvcGVydHk7IC8vIGFsbG93IGFjY2VzcyBieSBuYW1lIGFzIHdlbGxcblxuICAgIGlmIChwcm9wZXJ0eS5uYW1lLm1hdGNoKC9waWUtKFxcZCspLWJhY2tncm91bmQtc2l6ZS8pICYmIHByb3BlcnR5LnZhbHVlKSB7XG4gICAgICB0aGlzLl9wcml2YXRlLmhhc1BpZSA9IHRydWU7XG4gICAgfVxuICAgIGlmIChwcm9wZXJ0eS5uYW1lLm1hdGNoKC9zdHJpcGUtKFxcZCspLWJhY2tncm91bmQtc2l6ZS8pICYmIHByb3BlcnR5LnZhbHVlKSB7XG4gICAgICB0aGlzLl9wcml2YXRlLmhhc1N0cmlwZSA9IHRydWU7XG4gICAgfVxuICAgIGlmIChwcm9wZXJ0eS5tYXBwZWQpIHtcbiAgICAgIHRoaXNbaV0ubWFwcGVkUHJvcGVydGllcy5wdXNoKHByb3BlcnR5KTtcbiAgICB9XG5cbiAgICAvLyBhZGQgdG8gY29yZSBzdHlsZSBpZiBuZWNlc3NhcnlcbiAgICB2YXIgY3VycmVudFNlbGVjdG9ySXNDb3JlID0gIXRoaXNbaV0uc2VsZWN0b3I7XG4gICAgaWYgKGN1cnJlbnRTZWxlY3RvcklzQ29yZSkge1xuICAgICAgdGhpcy5fcHJpdmF0ZS5jb3JlU3R5bGVbcHJvcGVydHkubmFtZV0gPSBwcm9wZXJ0eTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG59O1xuc3R5Zm4uYXBwZW5kID0gZnVuY3Rpb24gKHN0eWxlKSB7XG4gIGlmIChzdHlsZXNoZWV0KHN0eWxlKSkge1xuICAgIHN0eWxlLmFwcGVuZFRvU3R5bGUodGhpcyk7XG4gIH0gZWxzZSBpZiAoYXJyYXkoc3R5bGUpKSB7XG4gICAgdGhpcy5hcHBlbmRGcm9tSnNvbihzdHlsZSk7XG4gIH0gZWxzZSBpZiAoc3RyaW5nKHN0eWxlKSkge1xuICAgIHRoaXMuYXBwZW5kRnJvbVN0cmluZyhzdHlsZSk7XG4gIH0gLy8geW91IHByb2JhYmx5IHdvdWxkbid0IHdhbnQgdG8gYXBwZW5kIGEgU3R5bGUsIHNpbmNlIHlvdSdkIGR1cGxpY2F0ZSB0aGUgZGVmYXVsdCBwYXJ0c1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gc3RhdGljIGZ1bmN0aW9uXG5fU3R5bGUuZnJvbUpzb24gPSBmdW5jdGlvbiAoY3ksIGpzb24pIHtcbiAgdmFyIHN0eWxlID0gbmV3IF9TdHlsZShjeSk7XG4gIHN0eWxlLmZyb21Kc29uKGpzb24pO1xuICByZXR1cm4gc3R5bGU7XG59O1xuX1N0eWxlLmZyb21TdHJpbmcgPSBmdW5jdGlvbiAoY3ksIHN0cmluZykge1xuICByZXR1cm4gbmV3IF9TdHlsZShjeSkuZnJvbVN0cmluZyhzdHJpbmcpO1xufTtcbltzdHlmbiQ4LCBzdHlmbiQ3LCBzdHlmbiQ2LCBzdHlmbiQ1LCBzdHlmbiQ0LCBzdHlmbiQzLCBzdHlmbiQyLCBzdHlmbiQxXS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wcykge1xuICBleHRlbmQoc3R5Zm4sIHByb3BzKTtcbn0pO1xuX1N0eWxlLnR5cGVzID0gc3R5Zm4udHlwZXM7XG5fU3R5bGUucHJvcGVydGllcyA9IHN0eWZuLnByb3BlcnRpZXM7XG5fU3R5bGUucHJvcGVydHlHcm91cHMgPSBzdHlmbi5wcm9wZXJ0eUdyb3Vwcztcbl9TdHlsZS5wcm9wZXJ0eUdyb3VwTmFtZXMgPSBzdHlmbi5wcm9wZXJ0eUdyb3VwTmFtZXM7XG5fU3R5bGUucHJvcGVydHlHcm91cEtleXMgPSBzdHlmbi5wcm9wZXJ0eUdyb3VwS2V5cztcblxudmFyIGNvcmVmbiQyID0ge1xuICBzdHlsZTogZnVuY3Rpb24gc3R5bGUobmV3U3R5bGUpIHtcbiAgICBpZiAobmV3U3R5bGUpIHtcbiAgICAgIHZhciBzID0gdGhpcy5zZXRTdHlsZShuZXdTdHlsZSk7XG4gICAgICBzLnVwZGF0ZSgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5zdHlsZTtcbiAgfSxcbiAgc2V0U3R5bGU6IGZ1bmN0aW9uIHNldFN0eWxlKHN0eWxlKSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICBpZiAoc3R5bGVzaGVldChzdHlsZSkpIHtcbiAgICAgIF9wLnN0eWxlID0gc3R5bGUuZ2VuZXJhdGVTdHlsZSh0aGlzKTtcbiAgICB9IGVsc2UgaWYgKGFycmF5KHN0eWxlKSkge1xuICAgICAgX3Auc3R5bGUgPSBfU3R5bGUuZnJvbUpzb24odGhpcywgc3R5bGUpO1xuICAgIH0gZWxzZSBpZiAoc3RyaW5nKHN0eWxlKSkge1xuICAgICAgX3Auc3R5bGUgPSBfU3R5bGUuZnJvbVN0cmluZyh0aGlzLCBzdHlsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIF9wLnN0eWxlID0gX1N0eWxlKHRoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gX3Auc3R5bGU7XG4gIH0sXG4gIC8vIGUuZy4gY3kuZGF0YSgpIGNoYW5nZWQgPT4gcmVjYWxjIGVsZSBtYXBwZXJzXG4gIHVwZGF0ZVN0eWxlOiBmdW5jdGlvbiB1cGRhdGVTdHlsZSgpIHtcbiAgICB0aGlzLm11dGFibGVFbGVtZW50cygpLnVwZGF0ZVN0eWxlKCk7IC8vIGp1c3Qgc2VuZCB0byBhbGwgZWxlc1xuICB9XG59O1xuXG52YXIgZGVmYXVsdFNlbGVjdGlvblR5cGUgPSAnc2luZ2xlJztcbnZhciBjb3JlZm4kMSA9IHtcbiAgYXV0b2xvY2s6IGZ1bmN0aW9uIGF1dG9sb2NrKGJvb2wpIHtcbiAgICBpZiAoYm9vbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9wcml2YXRlLmF1dG9sb2NrID0gYm9vbCA/IHRydWUgOiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuYXV0b2xvY2s7XG4gICAgfVxuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuICBhdXRvdW5ncmFiaWZ5OiBmdW5jdGlvbiBhdXRvdW5ncmFiaWZ5KGJvb2wpIHtcbiAgICBpZiAoYm9vbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9wcml2YXRlLmF1dG91bmdyYWJpZnkgPSBib29sID8gdHJ1ZSA6IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5hdXRvdW5ncmFiaWZ5O1xuICAgIH1cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcbiAgYXV0b3Vuc2VsZWN0aWZ5OiBmdW5jdGlvbiBhdXRvdW5zZWxlY3RpZnkoYm9vbCkge1xuICAgIGlmIChib29sICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX3ByaXZhdGUuYXV0b3Vuc2VsZWN0aWZ5ID0gYm9vbCA/IHRydWUgOiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuYXV0b3Vuc2VsZWN0aWZ5O1xuICAgIH1cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcbiAgc2VsZWN0aW9uVHlwZTogZnVuY3Rpb24gc2VsZWN0aW9uVHlwZShzZWxUeXBlKSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICBpZiAoX3Auc2VsZWN0aW9uVHlwZSA9PSBudWxsKSB7XG4gICAgICBfcC5zZWxlY3Rpb25UeXBlID0gZGVmYXVsdFNlbGVjdGlvblR5cGU7XG4gICAgfVxuICAgIGlmIChzZWxUeXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChzZWxUeXBlID09PSAnYWRkaXRpdmUnIHx8IHNlbFR5cGUgPT09ICdzaW5nbGUnKSB7XG4gICAgICAgIF9wLnNlbGVjdGlvblR5cGUgPSBzZWxUeXBlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gX3Auc2VsZWN0aW9uVHlwZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIHBhbm5pbmdFbmFibGVkOiBmdW5jdGlvbiBwYW5uaW5nRW5hYmxlZChib29sKSB7XG4gICAgaWYgKGJvb2wgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fcHJpdmF0ZS5wYW5uaW5nRW5hYmxlZCA9IGJvb2wgPyB0cnVlIDogZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLl9wcml2YXRlLnBhbm5pbmdFbmFibGVkO1xuICAgIH1cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcbiAgdXNlclBhbm5pbmdFbmFibGVkOiBmdW5jdGlvbiB1c2VyUGFubmluZ0VuYWJsZWQoYm9vbCkge1xuICAgIGlmIChib29sICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX3ByaXZhdGUudXNlclBhbm5pbmdFbmFibGVkID0gYm9vbCA/IHRydWUgOiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUudXNlclBhbm5pbmdFbmFibGVkO1xuICAgIH1cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcbiAgem9vbWluZ0VuYWJsZWQ6IGZ1bmN0aW9uIHpvb21pbmdFbmFibGVkKGJvb2wpIHtcbiAgICBpZiAoYm9vbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9wcml2YXRlLnpvb21pbmdFbmFibGVkID0gYm9vbCA/IHRydWUgOiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuem9vbWluZ0VuYWJsZWQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuICB1c2VyWm9vbWluZ0VuYWJsZWQ6IGZ1bmN0aW9uIHVzZXJab29taW5nRW5hYmxlZChib29sKSB7XG4gICAgaWYgKGJvb2wgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fcHJpdmF0ZS51c2VyWm9vbWluZ0VuYWJsZWQgPSBib29sID8gdHJ1ZSA6IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS51c2VyWm9vbWluZ0VuYWJsZWQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuICBib3hTZWxlY3Rpb25FbmFibGVkOiBmdW5jdGlvbiBib3hTZWxlY3Rpb25FbmFibGVkKGJvb2wpIHtcbiAgICBpZiAoYm9vbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9wcml2YXRlLmJveFNlbGVjdGlvbkVuYWJsZWQgPSBib29sID8gdHJ1ZSA6IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5ib3hTZWxlY3Rpb25FbmFibGVkO1xuICAgIH1cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcbiAgcGFuOiBmdW5jdGlvbiBwYW4oKSB7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgdmFyIHBhbiA9IHRoaXMuX3ByaXZhdGUucGFuO1xuICAgIHZhciBkaW0sIHZhbCwgZGltcywgeCwgeTtcbiAgICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIC8vIC5wYW4oKVxuICAgICAgICByZXR1cm4gcGFuO1xuICAgICAgY2FzZSAxOlxuICAgICAgICBpZiAoc3RyaW5nKGFyZ3NbMF0pKSB7XG4gICAgICAgICAgLy8gLnBhbigneCcpXG4gICAgICAgICAgZGltID0gYXJnc1swXTtcbiAgICAgICAgICByZXR1cm4gcGFuW2RpbV07XG4gICAgICAgIH0gZWxzZSBpZiAocGxhaW5PYmplY3QoYXJnc1swXSkpIHtcbiAgICAgICAgICAvLyAucGFuKHsgeDogMCwgeTogMTAwIH0pXG4gICAgICAgICAgaWYgKCF0aGlzLl9wcml2YXRlLnBhbm5pbmdFbmFibGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICB9XG4gICAgICAgICAgZGltcyA9IGFyZ3NbMF07XG4gICAgICAgICAgeCA9IGRpbXMueDtcbiAgICAgICAgICB5ID0gZGltcy55O1xuICAgICAgICAgIGlmIChudW1iZXIkMSh4KSkge1xuICAgICAgICAgICAgcGFuLnggPSB4O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobnVtYmVyJDEoeSkpIHtcbiAgICAgICAgICAgIHBhbi55ID0geTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5lbWl0KCdwYW4gdmlld3BvcnQnKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgLy8gLnBhbigneCcsIDEwMClcbiAgICAgICAgaWYgKCF0aGlzLl9wcml2YXRlLnBhbm5pbmdFbmFibGVkKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgZGltID0gYXJnc1swXTtcbiAgICAgICAgdmFsID0gYXJnc1sxXTtcbiAgICAgICAgaWYgKChkaW0gPT09ICd4JyB8fCBkaW0gPT09ICd5JykgJiYgbnVtYmVyJDEodmFsKSkge1xuICAgICAgICAgIHBhbltkaW1dID0gdmFsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZW1pdCgncGFuIHZpZXdwb3J0Jyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgLy8gaW52YWxpZFxuICAgIH1cbiAgICB0aGlzLm5vdGlmeSgndmlld3BvcnQnKTtcbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcbiAgcGFuQnk6IGZ1bmN0aW9uIHBhbkJ5KGFyZzAsIGFyZzEpIHtcbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICB2YXIgcGFuID0gdGhpcy5fcHJpdmF0ZS5wYW47XG4gICAgdmFyIGRpbSwgdmFsLCBkaW1zLCB4LCB5O1xuICAgIGlmICghdGhpcy5fcHJpdmF0ZS5wYW5uaW5nRW5hYmxlZCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgaWYgKHBsYWluT2JqZWN0KGFyZzApKSB7XG4gICAgICAgICAgLy8gLnBhbkJ5KHsgeDogMCwgeTogMTAwIH0pXG4gICAgICAgICAgZGltcyA9IGFyZ3NbMF07XG4gICAgICAgICAgeCA9IGRpbXMueDtcbiAgICAgICAgICB5ID0gZGltcy55O1xuICAgICAgICAgIGlmIChudW1iZXIkMSh4KSkge1xuICAgICAgICAgICAgcGFuLnggKz0geDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG51bWJlciQxKHkpKSB7XG4gICAgICAgICAgICBwYW4ueSArPSB5O1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmVtaXQoJ3BhbiB2aWV3cG9ydCcpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyOlxuICAgICAgICAvLyAucGFuQnkoJ3gnLCAxMDApXG4gICAgICAgIGRpbSA9IGFyZzA7XG4gICAgICAgIHZhbCA9IGFyZzE7XG4gICAgICAgIGlmICgoZGltID09PSAneCcgfHwgZGltID09PSAneScpICYmIG51bWJlciQxKHZhbCkpIHtcbiAgICAgICAgICBwYW5bZGltXSArPSB2YWw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbWl0KCdwYW4gdmlld3BvcnQnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICAvLyBpbnZhbGlkXG4gICAgfVxuICAgIHRoaXMubm90aWZ5KCd2aWV3cG9ydCcpO1xuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuICBnYzogZnVuY3Rpb24gZ2MoKSB7XG4gICAgdGhpcy5ub3RpZnkoJ2djJyk7XG4gIH0sXG4gIGZpdDogZnVuY3Rpb24gZml0KGVsZW1lbnRzLCBwYWRkaW5nKSB7XG4gICAgdmFyIHZpZXdwb3J0U3RhdGUgPSB0aGlzLmdldEZpdFZpZXdwb3J0KGVsZW1lbnRzLCBwYWRkaW5nKTtcbiAgICBpZiAodmlld3BvcnRTdGF0ZSkge1xuICAgICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICAgIF9wLnpvb20gPSB2aWV3cG9ydFN0YXRlLnpvb207XG4gICAgICBfcC5wYW4gPSB2aWV3cG9ydFN0YXRlLnBhbjtcbiAgICAgIHRoaXMuZW1pdCgncGFuIHpvb20gdmlld3BvcnQnKTtcbiAgICAgIHRoaXMubm90aWZ5KCd2aWV3cG9ydCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcbiAgZ2V0Rml0Vmlld3BvcnQ6IGZ1bmN0aW9uIGdldEZpdFZpZXdwb3J0KGVsZW1lbnRzLCBwYWRkaW5nKSB7XG4gICAgaWYgKG51bWJlciQxKGVsZW1lbnRzKSAmJiBwYWRkaW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIGVsZW1lbnRzIGlzIG9wdGlvbmFsXG4gICAgICBwYWRkaW5nID0gZWxlbWVudHM7XG4gICAgICBlbGVtZW50cyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKCF0aGlzLl9wcml2YXRlLnBhbm5pbmdFbmFibGVkIHx8ICF0aGlzLl9wcml2YXRlLnpvb21pbmdFbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBiYjtcbiAgICBpZiAoc3RyaW5nKGVsZW1lbnRzKSkge1xuICAgICAgdmFyIHNlbCA9IGVsZW1lbnRzO1xuICAgICAgZWxlbWVudHMgPSB0aGlzLiQoc2VsKTtcbiAgICB9IGVsc2UgaWYgKGJvdW5kaW5nQm94KGVsZW1lbnRzKSkge1xuICAgICAgLy8gYXNzdW1lIGJiXG4gICAgICB2YXIgYmJlID0gZWxlbWVudHM7XG4gICAgICBiYiA9IHtcbiAgICAgICAgeDE6IGJiZS54MSxcbiAgICAgICAgeTE6IGJiZS55MSxcbiAgICAgICAgeDI6IGJiZS54MixcbiAgICAgICAgeTI6IGJiZS55MlxuICAgICAgfTtcbiAgICAgIGJiLncgPSBiYi54MiAtIGJiLngxO1xuICAgICAgYmIuaCA9IGJiLnkyIC0gYmIueTE7XG4gICAgfSBlbHNlIGlmICghZWxlbWVudE9yQ29sbGVjdGlvbihlbGVtZW50cykpIHtcbiAgICAgIGVsZW1lbnRzID0gdGhpcy5tdXRhYmxlRWxlbWVudHMoKTtcbiAgICB9XG4gICAgaWYgKGVsZW1lbnRPckNvbGxlY3Rpb24oZWxlbWVudHMpICYmIGVsZW1lbnRzLmVtcHR5KCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIGNhbid0IGZpdCB0byBub3RoaW5nXG5cbiAgICBiYiA9IGJiIHx8IGVsZW1lbnRzLmJvdW5kaW5nQm94KCk7XG4gICAgdmFyIHcgPSB0aGlzLndpZHRoKCk7XG4gICAgdmFyIGggPSB0aGlzLmhlaWdodCgpO1xuICAgIHZhciB6b29tO1xuICAgIHBhZGRpbmcgPSBudW1iZXIkMShwYWRkaW5nKSA/IHBhZGRpbmcgOiAwO1xuICAgIGlmICghaXNOYU4odykgJiYgIWlzTmFOKGgpICYmIHcgPiAwICYmIGggPiAwICYmICFpc05hTihiYi53KSAmJiAhaXNOYU4oYmIuaCkgJiYgYmIudyA+IDAgJiYgYmIuaCA+IDApIHtcbiAgICAgIHpvb20gPSBNYXRoLm1pbigodyAtIDIgKiBwYWRkaW5nKSAvIGJiLncsIChoIC0gMiAqIHBhZGRpbmcpIC8gYmIuaCk7XG5cbiAgICAgIC8vIGNyb3Agem9vbVxuICAgICAgem9vbSA9IHpvb20gPiB0aGlzLl9wcml2YXRlLm1heFpvb20gPyB0aGlzLl9wcml2YXRlLm1heFpvb20gOiB6b29tO1xuICAgICAgem9vbSA9IHpvb20gPCB0aGlzLl9wcml2YXRlLm1pblpvb20gPyB0aGlzLl9wcml2YXRlLm1pblpvb20gOiB6b29tO1xuICAgICAgdmFyIHBhbiA9IHtcbiAgICAgICAgLy8gbm93IHBhbiB0byBtaWRkbGVcbiAgICAgICAgeDogKHcgLSB6b29tICogKGJiLngxICsgYmIueDIpKSAvIDIsXG4gICAgICAgIHk6IChoIC0gem9vbSAqIChiYi55MSArIGJiLnkyKSkgLyAyXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgem9vbTogem9vbSxcbiAgICAgICAgcGFuOiBwYW5cbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybjtcbiAgfSxcbiAgem9vbVJhbmdlOiBmdW5jdGlvbiB6b29tUmFuZ2UobWluLCBtYXgpIHtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuICAgIGlmIChtYXggPT0gbnVsbCkge1xuICAgICAgdmFyIG9wdHMgPSBtaW47XG4gICAgICBtaW4gPSBvcHRzLm1pbjtcbiAgICAgIG1heCA9IG9wdHMubWF4O1xuICAgIH1cbiAgICBpZiAobnVtYmVyJDEobWluKSAmJiBudW1iZXIkMShtYXgpICYmIG1pbiA8PSBtYXgpIHtcbiAgICAgIF9wLm1pblpvb20gPSBtaW47XG4gICAgICBfcC5tYXhab29tID0gbWF4O1xuICAgIH0gZWxzZSBpZiAobnVtYmVyJDEobWluKSAmJiBtYXggPT09IHVuZGVmaW5lZCAmJiBtaW4gPD0gX3AubWF4Wm9vbSkge1xuICAgICAgX3AubWluWm9vbSA9IG1pbjtcbiAgICB9IGVsc2UgaWYgKG51bWJlciQxKG1heCkgJiYgbWluID09PSB1bmRlZmluZWQgJiYgbWF4ID49IF9wLm1pblpvb20pIHtcbiAgICAgIF9wLm1heFpvb20gPSBtYXg7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBtaW5ab29tOiBmdW5jdGlvbiBtaW5ab29tKHpvb20pIHtcbiAgICBpZiAoem9vbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5taW5ab29tO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy56b29tUmFuZ2Uoe1xuICAgICAgICBtaW46IHpvb21cbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcbiAgbWF4Wm9vbTogZnVuY3Rpb24gbWF4Wm9vbSh6b29tKSB7XG4gICAgaWYgKHpvb20gPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUubWF4Wm9vbTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuem9vbVJhbmdlKHtcbiAgICAgICAgbWF4OiB6b29tXG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG4gIGdldFpvb21lZFZpZXdwb3J0OiBmdW5jdGlvbiBnZXRab29tZWRWaWV3cG9ydChwYXJhbXMpIHtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuICAgIHZhciBjdXJyZW50UGFuID0gX3AucGFuO1xuICAgIHZhciBjdXJyZW50Wm9vbSA9IF9wLnpvb207XG4gICAgdmFyIHBvczsgLy8gaW4gcmVuZGVyZWQgcHhcbiAgICB2YXIgem9vbTtcbiAgICB2YXIgYmFpbCA9IGZhbHNlO1xuICAgIGlmICghX3Auem9vbWluZ0VuYWJsZWQpIHtcbiAgICAgIC8vIHpvb21pbmcgZGlzYWJsZWRcbiAgICAgIGJhaWwgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAobnVtYmVyJDEocGFyYW1zKSkge1xuICAgICAgLy8gdGhlbiBzZXQgdGhlIHpvb21cbiAgICAgIHpvb20gPSBwYXJhbXM7XG4gICAgfSBlbHNlIGlmIChwbGFpbk9iamVjdChwYXJhbXMpKSB7XG4gICAgICAvLyB0aGVuIHpvb20gYWJvdXQgYSBwb2ludFxuICAgICAgem9vbSA9IHBhcmFtcy5sZXZlbDtcbiAgICAgIGlmIChwYXJhbXMucG9zaXRpb24gIT0gbnVsbCkge1xuICAgICAgICBwb3MgPSBtb2RlbFRvUmVuZGVyZWRQb3NpdGlvbiQxKHBhcmFtcy5wb3NpdGlvbiwgY3VycmVudFpvb20sIGN1cnJlbnRQYW4pO1xuICAgICAgfSBlbHNlIGlmIChwYXJhbXMucmVuZGVyZWRQb3NpdGlvbiAhPSBudWxsKSB7XG4gICAgICAgIHBvcyA9IHBhcmFtcy5yZW5kZXJlZFBvc2l0aW9uO1xuICAgICAgfVxuICAgICAgaWYgKHBvcyAhPSBudWxsICYmICFfcC5wYW5uaW5nRW5hYmxlZCkge1xuICAgICAgICAvLyBwYW5uaW5nIGRpc2FibGVkXG4gICAgICAgIGJhaWwgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNyb3Agem9vbVxuICAgIHpvb20gPSB6b29tID4gX3AubWF4Wm9vbSA/IF9wLm1heFpvb20gOiB6b29tO1xuICAgIHpvb20gPSB6b29tIDwgX3AubWluWm9vbSA/IF9wLm1pblpvb20gOiB6b29tO1xuXG4gICAgLy8gY2FuJ3Qgem9vbSB3aXRoIGludmFsaWQgcGFyYW1zXG4gICAgaWYgKGJhaWwgfHwgIW51bWJlciQxKHpvb20pIHx8IHpvb20gPT09IGN1cnJlbnRab29tIHx8IHBvcyAhPSBudWxsICYmICghbnVtYmVyJDEocG9zLngpIHx8ICFudW1iZXIkMShwb3MueSkpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKHBvcyAhPSBudWxsKSB7XG4gICAgICAvLyBzZXQgem9vbSBhYm91dCBwb3NpdGlvblxuICAgICAgdmFyIHBhbjEgPSBjdXJyZW50UGFuO1xuICAgICAgdmFyIHpvb20xID0gY3VycmVudFpvb207XG4gICAgICB2YXIgem9vbTIgPSB6b29tO1xuICAgICAgdmFyIHBhbjIgPSB7XG4gICAgICAgIHg6IC16b29tMiAvIHpvb20xICogKHBvcy54IC0gcGFuMS54KSArIHBvcy54LFxuICAgICAgICB5OiAtem9vbTIgLyB6b29tMSAqIChwb3MueSAtIHBhbjEueSkgKyBwb3MueVxuICAgICAgfTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHpvb21lZDogdHJ1ZSxcbiAgICAgICAgcGFubmVkOiB0cnVlLFxuICAgICAgICB6b29tOiB6b29tMixcbiAgICAgICAgcGFuOiBwYW4yXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBqdXN0IHNldCB0aGUgem9vbVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgem9vbWVkOiB0cnVlLFxuICAgICAgICBwYW5uZWQ6IGZhbHNlLFxuICAgICAgICB6b29tOiB6b29tLFxuICAgICAgICBwYW46IGN1cnJlbnRQYW5cbiAgICAgIH07XG4gICAgfVxuICB9LFxuICB6b29tOiBmdW5jdGlvbiB6b29tKHBhcmFtcykge1xuICAgIGlmIChwYXJhbXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gZ2V0XG4gICAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS56b29tO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBzZXRcbiAgICAgIHZhciB2cCA9IHRoaXMuZ2V0Wm9vbWVkVmlld3BvcnQocGFyYW1zKTtcbiAgICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG4gICAgICBpZiAodnAgPT0gbnVsbCB8fCAhdnAuem9vbWVkKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgX3Auem9vbSA9IHZwLnpvb207XG4gICAgICBpZiAodnAucGFubmVkKSB7XG4gICAgICAgIF9wLnBhbi54ID0gdnAucGFuLng7XG4gICAgICAgIF9wLnBhbi55ID0gdnAucGFuLnk7XG4gICAgICB9XG4gICAgICB0aGlzLmVtaXQoJ3pvb20nICsgKHZwLnBhbm5lZCA/ICcgcGFuJyA6ICcnKSArICcgdmlld3BvcnQnKTtcbiAgICAgIHRoaXMubm90aWZ5KCd2aWV3cG9ydCcpO1xuICAgICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gICAgfVxuICB9LFxuICB2aWV3cG9ydDogZnVuY3Rpb24gdmlld3BvcnQob3B0cykge1xuICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG4gICAgdmFyIHpvb21EZWZkID0gdHJ1ZTtcbiAgICB2YXIgcGFuRGVmZCA9IHRydWU7XG4gICAgdmFyIGV2ZW50cyA9IFtdOyAvLyB0byB0cmlnZ2VyXG4gICAgdmFyIHpvb21GYWlsZWQgPSBmYWxzZTtcbiAgICB2YXIgcGFuRmFpbGVkID0gZmFsc2U7XG4gICAgaWYgKCFvcHRzKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgaWYgKCFudW1iZXIkMShvcHRzLnpvb20pKSB7XG4gICAgICB6b29tRGVmZCA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIXBsYWluT2JqZWN0KG9wdHMucGFuKSkge1xuICAgICAgcGFuRGVmZCA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIXpvb21EZWZkICYmICFwYW5EZWZkKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgaWYgKHpvb21EZWZkKSB7XG4gICAgICB2YXIgeiA9IG9wdHMuem9vbTtcbiAgICAgIGlmICh6IDwgX3AubWluWm9vbSB8fCB6ID4gX3AubWF4Wm9vbSB8fCAhX3Auem9vbWluZ0VuYWJsZWQpIHtcbiAgICAgICAgem9vbUZhaWxlZCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfcC56b29tID0gejtcbiAgICAgICAgZXZlbnRzLnB1c2goJ3pvb20nKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBhbkRlZmQgJiYgKCF6b29tRmFpbGVkIHx8ICFvcHRzLmNhbmNlbE9uRmFpbGVkWm9vbSkgJiYgX3AucGFubmluZ0VuYWJsZWQpIHtcbiAgICAgIHZhciBwID0gb3B0cy5wYW47XG4gICAgICBpZiAobnVtYmVyJDEocC54KSkge1xuICAgICAgICBfcC5wYW4ueCA9IHAueDtcbiAgICAgICAgcGFuRmFpbGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAobnVtYmVyJDEocC55KSkge1xuICAgICAgICBfcC5wYW4ueSA9IHAueTtcbiAgICAgICAgcGFuRmFpbGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoIXBhbkZhaWxlZCkge1xuICAgICAgICBldmVudHMucHVzaCgncGFuJyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChldmVudHMubGVuZ3RoID4gMCkge1xuICAgICAgZXZlbnRzLnB1c2goJ3ZpZXdwb3J0Jyk7XG4gICAgICB0aGlzLmVtaXQoZXZlbnRzLmpvaW4oJyAnKSk7XG4gICAgICB0aGlzLm5vdGlmeSgndmlld3BvcnQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG4gIGNlbnRlcjogZnVuY3Rpb24gY2VudGVyKGVsZW1lbnRzKSB7XG4gICAgdmFyIHBhbiA9IHRoaXMuZ2V0Q2VudGVyUGFuKGVsZW1lbnRzKTtcbiAgICBpZiAocGFuKSB7XG4gICAgICB0aGlzLl9wcml2YXRlLnBhbiA9IHBhbjtcbiAgICAgIHRoaXMuZW1pdCgncGFuIHZpZXdwb3J0Jyk7XG4gICAgICB0aGlzLm5vdGlmeSgndmlld3BvcnQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG4gIGdldENlbnRlclBhbjogZnVuY3Rpb24gZ2V0Q2VudGVyUGFuKGVsZW1lbnRzLCB6b29tKSB7XG4gICAgaWYgKCF0aGlzLl9wcml2YXRlLnBhbm5pbmdFbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzdHJpbmcoZWxlbWVudHMpKSB7XG4gICAgICB2YXIgc2VsZWN0b3IgPSBlbGVtZW50cztcbiAgICAgIGVsZW1lbnRzID0gdGhpcy5tdXRhYmxlRWxlbWVudHMoKS5maWx0ZXIoc2VsZWN0b3IpO1xuICAgIH0gZWxzZSBpZiAoIWVsZW1lbnRPckNvbGxlY3Rpb24oZWxlbWVudHMpKSB7XG4gICAgICBlbGVtZW50cyA9IHRoaXMubXV0YWJsZUVsZW1lbnRzKCk7XG4gICAgfVxuICAgIGlmIChlbGVtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIGNhbid0IGNlbnRyZSBwYW4gdG8gbm90aGluZ1xuXG4gICAgdmFyIGJiID0gZWxlbWVudHMuYm91bmRpbmdCb3goKTtcbiAgICB2YXIgdyA9IHRoaXMud2lkdGgoKTtcbiAgICB2YXIgaCA9IHRoaXMuaGVpZ2h0KCk7XG4gICAgem9vbSA9IHpvb20gPT09IHVuZGVmaW5lZCA/IHRoaXMuX3ByaXZhdGUuem9vbSA6IHpvb207XG4gICAgdmFyIHBhbiA9IHtcbiAgICAgIC8vIG1pZGRsZVxuICAgICAgeDogKHcgLSB6b29tICogKGJiLngxICsgYmIueDIpKSAvIDIsXG4gICAgICB5OiAoaCAtIHpvb20gKiAoYmIueTEgKyBiYi55MikpIC8gMlxuICAgIH07XG4gICAgcmV0dXJuIHBhbjtcbiAgfSxcbiAgcmVzZXQ6IGZ1bmN0aW9uIHJlc2V0KCkge1xuICAgIGlmICghdGhpcy5fcHJpdmF0ZS5wYW5uaW5nRW5hYmxlZCB8fCAhdGhpcy5fcHJpdmF0ZS56b29taW5nRW5hYmxlZCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHRoaXMudmlld3BvcnQoe1xuICAgICAgcGFuOiB7XG4gICAgICAgIHg6IDAsXG4gICAgICAgIHk6IDBcbiAgICAgIH0sXG4gICAgICB6b29tOiAxXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG4gIGludmFsaWRhdGVTaXplOiBmdW5jdGlvbiBpbnZhbGlkYXRlU2l6ZSgpIHtcbiAgICB0aGlzLl9wcml2YXRlLnNpemVDYWNoZSA9IG51bGw7XG4gIH0sXG4gIHNpemU6IGZ1bmN0aW9uIHNpemUoKSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICB2YXIgY29udGFpbmVyID0gX3AuY29udGFpbmVyO1xuICAgIHZhciBjeSA9IHRoaXM7XG4gICAgcmV0dXJuIF9wLnNpemVDYWNoZSA9IF9wLnNpemVDYWNoZSB8fCAoY29udGFpbmVyID8gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHN0eWxlID0gY3kud2luZG93KCkuZ2V0Q29tcHV0ZWRTdHlsZShjb250YWluZXIpO1xuICAgICAgdmFyIHZhbCA9IGZ1bmN0aW9uIHZhbChuYW1lKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUZsb2F0KHN0eWxlLmdldFByb3BlcnR5VmFsdWUobmFtZSkpO1xuICAgICAgfTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHdpZHRoOiBjb250YWluZXIuY2xpZW50V2lkdGggLSB2YWwoJ3BhZGRpbmctbGVmdCcpIC0gdmFsKCdwYWRkaW5nLXJpZ2h0JyksXG4gICAgICAgIGhlaWdodDogY29udGFpbmVyLmNsaWVudEhlaWdodCAtIHZhbCgncGFkZGluZy10b3AnKSAtIHZhbCgncGFkZGluZy1ib3R0b20nKVxuICAgICAgfTtcbiAgICB9KCkgOiB7XG4gICAgICAvLyBmYWxsYmFjayBpZiBubyBjb250YWluZXIgKG5vdCAwIGIvYyBjYW4gYmUgdXNlZCBmb3IgZGl2aWRpbmcgZXRjKVxuICAgICAgd2lkdGg6IDEsXG4gICAgICBoZWlnaHQ6IDFcbiAgICB9KTtcbiAgfSxcbiAgd2lkdGg6IGZ1bmN0aW9uIHdpZHRoKCkge1xuICAgIHJldHVybiB0aGlzLnNpemUoKS53aWR0aDtcbiAgfSxcbiAgaGVpZ2h0OiBmdW5jdGlvbiBoZWlnaHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2l6ZSgpLmhlaWdodDtcbiAgfSxcbiAgZXh0ZW50OiBmdW5jdGlvbiBleHRlbnQoKSB7XG4gICAgdmFyIHBhbiA9IHRoaXMuX3ByaXZhdGUucGFuO1xuICAgIHZhciB6b29tID0gdGhpcy5fcHJpdmF0ZS56b29tO1xuICAgIHZhciByYiA9IHRoaXMucmVuZGVyZWRFeHRlbnQoKTtcbiAgICB2YXIgYiA9IHtcbiAgICAgIHgxOiAocmIueDEgLSBwYW4ueCkgLyB6b29tLFxuICAgICAgeDI6IChyYi54MiAtIHBhbi54KSAvIHpvb20sXG4gICAgICB5MTogKHJiLnkxIC0gcGFuLnkpIC8gem9vbSxcbiAgICAgIHkyOiAocmIueTIgLSBwYW4ueSkgLyB6b29tXG4gICAgfTtcbiAgICBiLncgPSBiLngyIC0gYi54MTtcbiAgICBiLmggPSBiLnkyIC0gYi55MTtcbiAgICByZXR1cm4gYjtcbiAgfSxcbiAgcmVuZGVyZWRFeHRlbnQ6IGZ1bmN0aW9uIHJlbmRlcmVkRXh0ZW50KCkge1xuICAgIHZhciB3aWR0aCA9IHRoaXMud2lkdGgoKTtcbiAgICB2YXIgaGVpZ2h0ID0gdGhpcy5oZWlnaHQoKTtcbiAgICByZXR1cm4ge1xuICAgICAgeDE6IDAsXG4gICAgICB5MTogMCxcbiAgICAgIHgyOiB3aWR0aCxcbiAgICAgIHkyOiBoZWlnaHQsXG4gICAgICB3OiB3aWR0aCxcbiAgICAgIGg6IGhlaWdodFxuICAgIH07XG4gIH0sXG4gIG11bHRpQ2xpY2tEZWJvdW5jZVRpbWU6IGZ1bmN0aW9uIG11bHRpQ2xpY2tEZWJvdW5jZVRpbWUoX2ludCkge1xuICAgIGlmIChfaW50KSB0aGlzLl9wcml2YXRlLm11bHRpQ2xpY2tEZWJvdW5jZVRpbWUgPSBfaW50O2Vsc2UgcmV0dXJuIHRoaXMuX3ByaXZhdGUubXVsdGlDbGlja0RlYm91bmNlVGltZTtcbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfVxufTtcblxuLy8gYWxpYXNlc1xuY29yZWZuJDEuY2VudHJlID0gY29yZWZuJDEuY2VudGVyO1xuXG4vLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuY29yZWZuJDEuYXV0b2xvY2tOb2RlcyA9IGNvcmVmbiQxLmF1dG9sb2NrO1xuY29yZWZuJDEuYXV0b3VuZ3JhYmlmeU5vZGVzID0gY29yZWZuJDEuYXV0b3VuZ3JhYmlmeTtcblxudmFyIGZuID0ge1xuICBkYXRhOiBkZWZpbmUuZGF0YSh7XG4gICAgZmllbGQ6ICdkYXRhJyxcbiAgICBiaW5kaW5nRXZlbnQ6ICdkYXRhJyxcbiAgICBhbGxvd0JpbmRpbmc6IHRydWUsXG4gICAgYWxsb3dTZXR0aW5nOiB0cnVlLFxuICAgIHNldHRpbmdFdmVudDogJ2RhdGEnLFxuICAgIHNldHRpbmdUcmlnZ2Vyc0V2ZW50OiB0cnVlLFxuICAgIHRyaWdnZXJGbk5hbWU6ICd0cmlnZ2VyJyxcbiAgICBhbGxvd0dldHRpbmc6IHRydWUsXG4gICAgdXBkYXRlU3R5bGU6IHRydWVcbiAgfSksXG4gIHJlbW92ZURhdGE6IGRlZmluZS5yZW1vdmVEYXRhKHtcbiAgICBmaWVsZDogJ2RhdGEnLFxuICAgIGV2ZW50OiAnZGF0YScsXG4gICAgdHJpZ2dlckZuTmFtZTogJ3RyaWdnZXInLFxuICAgIHRyaWdnZXJFdmVudDogdHJ1ZSxcbiAgICB1cGRhdGVTdHlsZTogdHJ1ZVxuICB9KSxcbiAgc2NyYXRjaDogZGVmaW5lLmRhdGEoe1xuICAgIGZpZWxkOiAnc2NyYXRjaCcsXG4gICAgYmluZGluZ0V2ZW50OiAnc2NyYXRjaCcsXG4gICAgYWxsb3dCaW5kaW5nOiB0cnVlLFxuICAgIGFsbG93U2V0dGluZzogdHJ1ZSxcbiAgICBzZXR0aW5nRXZlbnQ6ICdzY3JhdGNoJyxcbiAgICBzZXR0aW5nVHJpZ2dlcnNFdmVudDogdHJ1ZSxcbiAgICB0cmlnZ2VyRm5OYW1lOiAndHJpZ2dlcicsXG4gICAgYWxsb3dHZXR0aW5nOiB0cnVlLFxuICAgIHVwZGF0ZVN0eWxlOiB0cnVlXG4gIH0pLFxuICByZW1vdmVTY3JhdGNoOiBkZWZpbmUucmVtb3ZlRGF0YSh7XG4gICAgZmllbGQ6ICdzY3JhdGNoJyxcbiAgICBldmVudDogJ3NjcmF0Y2gnLFxuICAgIHRyaWdnZXJGbk5hbWU6ICd0cmlnZ2VyJyxcbiAgICB0cmlnZ2VyRXZlbnQ6IHRydWUsXG4gICAgdXBkYXRlU3R5bGU6IHRydWVcbiAgfSlcbn07XG5cbi8vIGFsaWFzZXNcbmZuLmF0dHIgPSBmbi5kYXRhO1xuZm4ucmVtb3ZlQXR0ciA9IGZuLnJlbW92ZURhdGE7XG5cbnZhciBDb3JlID0gZnVuY3Rpb24gQ29yZShvcHRzKSB7XG4gIHZhciBjeSA9IHRoaXM7XG4gIG9wdHMgPSBleHRlbmQoe30sIG9wdHMpO1xuICB2YXIgY29udGFpbmVyID0gb3B0cy5jb250YWluZXI7XG5cbiAgLy8gYWxsb3cgZm9yIHBhc3NpbmcgYSB3cmFwcGVkIGpxdWVyeSBvYmplY3RcbiAgLy8gZS5nLiBjeXRvc2NhcGUoeyBjb250YWluZXI6ICQoJyNjeScpIH0pXG4gIGlmIChjb250YWluZXIgJiYgIWh0bWxFbGVtZW50KGNvbnRhaW5lcikgJiYgaHRtbEVsZW1lbnQoY29udGFpbmVyWzBdKSkge1xuICAgIGNvbnRhaW5lciA9IGNvbnRhaW5lclswXTtcbiAgfVxuICB2YXIgcmVnID0gY29udGFpbmVyID8gY29udGFpbmVyLl9jeXJlZyA6IG51bGw7IC8vIGUuZy4gYWxyZWFkeSByZWdpc3RlcmVkIHNvbWUgaW5mbyAoZS5nLiByZWFkaWVzKSB2aWEganF1ZXJ5XG4gIHJlZyA9IHJlZyB8fCB7fTtcbiAgaWYgKHJlZyAmJiByZWcuY3kpIHtcbiAgICByZWcuY3kuZGVzdHJveSgpO1xuICAgIHJlZyA9IHt9OyAvLyBvbGQgaW5zdGFuY2UgPT4gcmVwbGFjZSByZWcgY29tcGxldGVseVxuICB9XG4gIHZhciByZWFkaWVzID0gcmVnLnJlYWRpZXMgPSByZWcucmVhZGllcyB8fCBbXTtcbiAgaWYgKGNvbnRhaW5lcikge1xuICAgIGNvbnRhaW5lci5fY3lyZWcgPSByZWc7XG4gIH0gLy8gbWFrZSBzdXJlIGNvbnRhaW5lciBhc3NvYydkIHJlZyBwb2ludHMgdG8gdGhpcyBjeVxuICByZWcuY3kgPSBjeTtcbiAgdmFyIGhlYWQgPSBfd2luZG93ICE9PSB1bmRlZmluZWQgJiYgY29udGFpbmVyICE9PSB1bmRlZmluZWQgJiYgIW9wdHMuaGVhZGxlc3M7XG4gIHZhciBvcHRpb25zID0gb3B0cztcbiAgb3B0aW9ucy5sYXlvdXQgPSBleHRlbmQoe1xuICAgIG5hbWU6IGhlYWQgPyAnZ3JpZCcgOiAnbnVsbCdcbiAgfSwgb3B0aW9ucy5sYXlvdXQpO1xuICBvcHRpb25zLnJlbmRlcmVyID0gZXh0ZW5kKHtcbiAgICBuYW1lOiBoZWFkID8gJ2NhbnZhcycgOiAnbnVsbCdcbiAgfSwgb3B0aW9ucy5yZW5kZXJlcik7XG4gIHZhciBkZWZWYWwgPSBmdW5jdGlvbiBkZWZWYWwoZGVmLCB2YWwsIGFsdFZhbCkge1xuICAgIGlmICh2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHZhbDtcbiAgICB9IGVsc2UgaWYgKGFsdFZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gYWx0VmFsO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZGVmO1xuICAgIH1cbiAgfTtcbiAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZSA9IHtcbiAgICBjb250YWluZXI6IGNvbnRhaW5lcixcbiAgICAvLyBodG1sIGRvbSBlbGUgY29udGFpbmVyXG4gICAgcmVhZHk6IGZhbHNlLFxuICAgIC8vIHdoZXRoZXIgcmVhZHkgaGFzIGJlZW4gdHJpZ2dlcmVkXG4gICAgb3B0aW9uczogb3B0aW9ucyxcbiAgICAvLyBjYWNoZWQgb3B0aW9uc1xuICAgIGVsZW1lbnRzOiBuZXcgQ29sbGVjdGlvbih0aGlzKSxcbiAgICAvLyBlbGVtZW50cyBpbiB0aGUgZ3JhcGhcbiAgICBsaXN0ZW5lcnM6IFtdLFxuICAgIC8vIGxpc3Qgb2YgbGlzdGVuZXJzXG4gICAgYW5pRWxlczogbmV3IENvbGxlY3Rpb24odGhpcyksXG4gICAgLy8gZWxlbWVudHMgYmVpbmcgYW5pbWF0ZWRcbiAgICBkYXRhOiBvcHRpb25zLmRhdGEgfHwge30sXG4gICAgLy8gZGF0YSBmb3IgdGhlIGNvcmVcbiAgICBzY3JhdGNoOiB7fSxcbiAgICAvLyBzY3JhdGNoIG9iamVjdCBmb3IgY29yZVxuICAgIGxheW91dDogbnVsbCxcbiAgICByZW5kZXJlcjogbnVsbCxcbiAgICBkZXN0cm95ZWQ6IGZhbHNlLFxuICAgIC8vIHdoZXRoZXIgZGVzdHJveSB3YXMgY2FsbGVkXG4gICAgbm90aWZpY2F0aW9uc0VuYWJsZWQ6IHRydWUsXG4gICAgLy8gd2hldGhlciBub3RpZmljYXRpb25zIGFyZSBzZW50IHRvIHRoZSByZW5kZXJlclxuICAgIG1pblpvb206IDFlLTUwLFxuICAgIG1heFpvb206IDFlNTAsXG4gICAgem9vbWluZ0VuYWJsZWQ6IGRlZlZhbCh0cnVlLCBvcHRpb25zLnpvb21pbmdFbmFibGVkKSxcbiAgICB1c2VyWm9vbWluZ0VuYWJsZWQ6IGRlZlZhbCh0cnVlLCBvcHRpb25zLnVzZXJab29taW5nRW5hYmxlZCksXG4gICAgcGFubmluZ0VuYWJsZWQ6IGRlZlZhbCh0cnVlLCBvcHRpb25zLnBhbm5pbmdFbmFibGVkKSxcbiAgICB1c2VyUGFubmluZ0VuYWJsZWQ6IGRlZlZhbCh0cnVlLCBvcHRpb25zLnVzZXJQYW5uaW5nRW5hYmxlZCksXG4gICAgYm94U2VsZWN0aW9uRW5hYmxlZDogZGVmVmFsKHRydWUsIG9wdGlvbnMuYm94U2VsZWN0aW9uRW5hYmxlZCksXG4gICAgYXV0b2xvY2s6IGRlZlZhbChmYWxzZSwgb3B0aW9ucy5hdXRvbG9jaywgb3B0aW9ucy5hdXRvbG9ja05vZGVzKSxcbiAgICBhdXRvdW5ncmFiaWZ5OiBkZWZWYWwoZmFsc2UsIG9wdGlvbnMuYXV0b3VuZ3JhYmlmeSwgb3B0aW9ucy5hdXRvdW5ncmFiaWZ5Tm9kZXMpLFxuICAgIGF1dG91bnNlbGVjdGlmeTogZGVmVmFsKGZhbHNlLCBvcHRpb25zLmF1dG91bnNlbGVjdGlmeSksXG4gICAgc3R5bGVFbmFibGVkOiBvcHRpb25zLnN0eWxlRW5hYmxlZCA9PT0gdW5kZWZpbmVkID8gaGVhZCA6IG9wdGlvbnMuc3R5bGVFbmFibGVkLFxuICAgIHpvb206IG51bWJlciQxKG9wdGlvbnMuem9vbSkgPyBvcHRpb25zLnpvb20gOiAxLFxuICAgIHBhbjoge1xuICAgICAgeDogcGxhaW5PYmplY3Qob3B0aW9ucy5wYW4pICYmIG51bWJlciQxKG9wdGlvbnMucGFuLngpID8gb3B0aW9ucy5wYW4ueCA6IDAsXG4gICAgICB5OiBwbGFpbk9iamVjdChvcHRpb25zLnBhbikgJiYgbnVtYmVyJDEob3B0aW9ucy5wYW4ueSkgPyBvcHRpb25zLnBhbi55IDogMFxuICAgIH0sXG4gICAgYW5pbWF0aW9uOiB7XG4gICAgICAvLyBvYmplY3QgZm9yIGN1cnJlbnRseS1ydW5uaW5nIGFuaW1hdGlvbnNcbiAgICAgIGN1cnJlbnQ6IFtdLFxuICAgICAgcXVldWU6IFtdXG4gICAgfSxcbiAgICBoYXNDb21wb3VuZE5vZGVzOiBmYWxzZSxcbiAgICBtdWx0aUNsaWNrRGVib3VuY2VUaW1lOiBkZWZWYWwoMjUwLCBvcHRpb25zLm11bHRpQ2xpY2tEZWJvdW5jZVRpbWUpXG4gIH07XG4gIHRoaXMuY3JlYXRlRW1pdHRlcigpO1xuXG4gIC8vIHNldCBzZWxlY3Rpb24gdHlwZVxuICB0aGlzLnNlbGVjdGlvblR5cGUob3B0aW9ucy5zZWxlY3Rpb25UeXBlKTtcblxuICAvLyBpbml0IHpvb20gYm91bmRzXG4gIHRoaXMuem9vbVJhbmdlKHtcbiAgICBtaW46IG9wdGlvbnMubWluWm9vbSxcbiAgICBtYXg6IG9wdGlvbnMubWF4Wm9vbVxuICB9KTtcbiAgdmFyIGxvYWRFeHREYXRhID0gZnVuY3Rpb24gbG9hZEV4dERhdGEoZXh0RGF0YSwgbmV4dCkge1xuICAgIHZhciBhbnlJc1Byb21pc2UgPSBleHREYXRhLnNvbWUocHJvbWlzZSk7XG4gICAgaWYgKGFueUlzUHJvbWlzZSkge1xuICAgICAgcmV0dXJuIFByb21pc2UkMS5hbGwoZXh0RGF0YSkudGhlbihuZXh0KTsgLy8gbG9hZCBhbGwgZGF0YSBhc3luY2hyb25vdXNseSwgdGhlbiBleGVjIHJlc3Qgb2YgaW5pdFxuICAgIH0gZWxzZSB7XG4gICAgICBuZXh0KGV4dERhdGEpOyAvLyBleGVjIHN5bmNocm9ub3VzbHkgZm9yIGNvbnZlbmllbmNlXG4gICAgfVxuICB9O1xuXG4gIC8vIHN0YXJ0IHdpdGggdGhlIGRlZmF1bHQgc3R5bGVzaGVldCBzbyB3ZSBoYXZlIHNvbWV0aGluZyBiZWZvcmUgbG9hZGluZyBhbiBleHRlcm5hbCBzdHlsZXNoZWV0XG4gIGlmIChfcC5zdHlsZUVuYWJsZWQpIHtcbiAgICBjeS5zZXRTdHlsZShbXSk7XG4gIH1cblxuICAvLyBjcmVhdGUgdGhlIHJlbmRlcmVyXG4gIHZhciByZW5kZXJlck9wdGlvbnMgPSBleHRlbmQoe30sIG9wdGlvbnMsIG9wdGlvbnMucmVuZGVyZXIpOyAvLyBhbGxvdyByZW5kZXJpbmcgaGludHMgaW4gdG9wIGxldmVsIG9wdGlvbnNcbiAgY3kuaW5pdFJlbmRlcmVyKHJlbmRlcmVyT3B0aW9ucyk7XG4gIHZhciBzZXRFbGVzQW5kTGF5b3V0ID0gZnVuY3Rpb24gc2V0RWxlc0FuZExheW91dChlbGVtZW50cywgb25sb2FkLCBvbmRvbmUpIHtcbiAgICBjeS5ub3RpZmljYXRpb25zKGZhbHNlKTtcblxuICAgIC8vIHJlbW92ZSBvbGQgZWxlbWVudHNcbiAgICB2YXIgb2xkRWxlcyA9IGN5Lm11dGFibGVFbGVtZW50cygpO1xuICAgIGlmIChvbGRFbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIG9sZEVsZXMucmVtb3ZlKCk7XG4gICAgfVxuICAgIGlmIChlbGVtZW50cyAhPSBudWxsKSB7XG4gICAgICBpZiAocGxhaW5PYmplY3QoZWxlbWVudHMpIHx8IGFycmF5KGVsZW1lbnRzKSkge1xuICAgICAgICBjeS5hZGQoZWxlbWVudHMpO1xuICAgICAgfVxuICAgIH1cbiAgICBjeS5vbmUoJ2xheW91dHJlYWR5JywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIGN5Lm5vdGlmaWNhdGlvbnModHJ1ZSk7XG4gICAgICBjeS5lbWl0KGUpOyAvLyB3ZSBtaXNzZWQgdGhpcyBldmVudCBieSB0dXJuaW5nIG5vdGlmaWNhdGlvbnMgb2ZmLCBzbyBwYXNzIGl0IG9uXG5cbiAgICAgIGN5Lm9uZSgnbG9hZCcsIG9ubG9hZCk7XG4gICAgICBjeS5lbWl0QW5kTm90aWZ5KCdsb2FkJyk7XG4gICAgfSkub25lKCdsYXlvdXRzdG9wJywgZnVuY3Rpb24gKCkge1xuICAgICAgY3kub25lKCdkb25lJywgb25kb25lKTtcbiAgICAgIGN5LmVtaXQoJ2RvbmUnKTtcbiAgICB9KTtcbiAgICB2YXIgbGF5b3V0T3B0cyA9IGV4dGVuZCh7fSwgY3kuX3ByaXZhdGUub3B0aW9ucy5sYXlvdXQpO1xuICAgIGxheW91dE9wdHMuZWxlcyA9IGN5LmVsZW1lbnRzKCk7XG4gICAgY3kubGF5b3V0KGxheW91dE9wdHMpLnJ1bigpO1xuICB9O1xuICBsb2FkRXh0RGF0YShbb3B0aW9ucy5zdHlsZSwgb3B0aW9ucy5lbGVtZW50c10sIGZ1bmN0aW9uICh0aGVucykge1xuICAgIHZhciBpbml0U3R5bGUgPSB0aGVuc1swXTtcbiAgICB2YXIgaW5pdEVsZXMgPSB0aGVuc1sxXTtcblxuICAgIC8vIGluaXQgc3R5bGVcbiAgICBpZiAoX3Auc3R5bGVFbmFibGVkKSB7XG4gICAgICBjeS5zdHlsZSgpLmFwcGVuZChpbml0U3R5bGUpO1xuICAgIH1cblxuICAgIC8vIGluaXRpYWwgbG9hZFxuICAgIHNldEVsZXNBbmRMYXlvdXQoaW5pdEVsZXMsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIG9ucmVhZHlcbiAgICAgIGN5LnN0YXJ0QW5pbWF0aW9uTG9vcCgpO1xuICAgICAgX3AucmVhZHkgPSB0cnVlO1xuXG4gICAgICAvLyBpZiBhIHJlYWR5IGNhbGxiYWNrIGlzIHNwZWNpZmllZCBhcyBhbiBvcHRpb24sIHRoZSBiaW5kIGl0XG4gICAgICBpZiAoZm4kNihvcHRpb25zLnJlYWR5KSkge1xuICAgICAgICBjeS5vbigncmVhZHknLCBvcHRpb25zLnJlYWR5KTtcbiAgICAgIH1cblxuICAgICAgLy8gYmluZCBhbGwgdGhlIHJlYWR5IGhhbmRsZXJzIHJlZ2lzdGVyZWQgYmVmb3JlIGNyZWF0aW5nIHRoaXMgaW5zdGFuY2VcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVhZGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZm4gPSByZWFkaWVzW2ldO1xuICAgICAgICBjeS5vbigncmVhZHknLCBmbik7XG4gICAgICB9XG4gICAgICBpZiAocmVnKSB7XG4gICAgICAgIHJlZy5yZWFkaWVzID0gW107XG4gICAgICB9IC8vIGNsZWFyIGIvYyB3ZSd2ZSBib3VuZCB0aGVtIGFsbCBhbmQgZG9uJ3Qgd2FudCB0byBrZWVwIGl0IGFyb3VuZCBpbiBjYXNlIGEgbmV3IGNvcmUgdXNlcyB0aGUgc2FtZSBkaXYgZXRjXG5cbiAgICAgIGN5LmVtaXQoJ3JlYWR5Jyk7XG4gICAgfSwgb3B0aW9ucy5kb25lKTtcbiAgfSk7XG59O1xudmFyIGNvcmVmbiA9IENvcmUucHJvdG90eXBlOyAvLyBzaG9ydCBhbGlhc1xuXG5leHRlbmQoY29yZWZuLCB7XG4gIGluc3RhbmNlU3RyaW5nOiBmdW5jdGlvbiBpbnN0YW5jZVN0cmluZygpIHtcbiAgICByZXR1cm4gJ2NvcmUnO1xuICB9LFxuICBpc1JlYWR5OiBmdW5jdGlvbiBpc1JlYWR5KCkge1xuICAgIHJldHVybiB0aGlzLl9wcml2YXRlLnJlYWR5O1xuICB9LFxuICBkZXN0cm95ZWQ6IGZ1bmN0aW9uIGRlc3Ryb3llZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5kZXN0cm95ZWQ7XG4gIH0sXG4gIHJlYWR5OiBmdW5jdGlvbiByZWFkeShmbikge1xuICAgIGlmICh0aGlzLmlzUmVhZHkoKSkge1xuICAgICAgdGhpcy5lbWl0dGVyKCkuZW1pdCgncmVhZHknLCBbXSwgZm4pOyAvLyBqdXN0IGNhbGxzIGZuIGFzIHRob3VnaCB0cmlnZ2VyZWQgdmlhIHJlYWR5IGV2ZW50XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub24oJ3JlYWR5JywgZm4pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICB2YXIgY3kgPSB0aGlzO1xuICAgIGlmIChjeS5kZXN0cm95ZWQoKSkgcmV0dXJuO1xuICAgIGN5LnN0b3BBbmltYXRpb25Mb29wKCk7XG4gICAgY3kuZGVzdHJveVJlbmRlcmVyKCk7XG4gICAgdGhpcy5lbWl0KCdkZXN0cm95Jyk7XG4gICAgY3kuX3ByaXZhdGUuZGVzdHJveWVkID0gdHJ1ZTtcbiAgICByZXR1cm4gY3k7XG4gIH0sXG4gIGhhc0VsZW1lbnRXaXRoSWQ6IGZ1bmN0aW9uIGhhc0VsZW1lbnRXaXRoSWQoaWQpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5lbGVtZW50cy5oYXNFbGVtZW50V2l0aElkKGlkKTtcbiAgfSxcbiAgZ2V0RWxlbWVudEJ5SWQ6IGZ1bmN0aW9uIGdldEVsZW1lbnRCeUlkKGlkKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuZWxlbWVudHMuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICB9LFxuICBoYXNDb21wb3VuZE5vZGVzOiBmdW5jdGlvbiBoYXNDb21wb3VuZE5vZGVzKCkge1xuICAgIHJldHVybiB0aGlzLl9wcml2YXRlLmhhc0NvbXBvdW5kTm9kZXM7XG4gIH0sXG4gIGhlYWRsZXNzOiBmdW5jdGlvbiBoZWFkbGVzcygpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5yZW5kZXJlci5pc0hlYWRsZXNzKCk7XG4gIH0sXG4gIHN0eWxlRW5hYmxlZDogZnVuY3Rpb24gc3R5bGVFbmFibGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9wcml2YXRlLnN0eWxlRW5hYmxlZDtcbiAgfSxcbiAgYWRkVG9Qb29sOiBmdW5jdGlvbiBhZGRUb1Bvb2woZWxlcykge1xuICAgIHRoaXMuX3ByaXZhdGUuZWxlbWVudHMubWVyZ2UoZWxlcyk7XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG4gIHJlbW92ZUZyb21Qb29sOiBmdW5jdGlvbiByZW1vdmVGcm9tUG9vbChlbGVzKSB7XG4gICAgdGhpcy5fcHJpdmF0ZS5lbGVtZW50cy51bm1lcmdlKGVsZXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBjb250YWluZXI6IGZ1bmN0aW9uIGNvbnRhaW5lcigpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5jb250YWluZXIgfHwgbnVsbDtcbiAgfSxcbiAgd2luZG93OiBmdW5jdGlvbiB3aW5kb3coKSB7XG4gICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuX3ByaXZhdGUuY29udGFpbmVyO1xuICAgIGlmIChjb250YWluZXIgPT0gbnVsbCkgcmV0dXJuIF93aW5kb3c7XG4gICAgdmFyIG93bmVyRG9jdW1lbnQgPSB0aGlzLl9wcml2YXRlLmNvbnRhaW5lci5vd25lckRvY3VtZW50O1xuICAgIGlmIChvd25lckRvY3VtZW50ID09PSB1bmRlZmluZWQgfHwgb3duZXJEb2N1bWVudCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gX3dpbmRvdztcbiAgICB9XG4gICAgcmV0dXJuIG93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgfHwgX3dpbmRvdztcbiAgfSxcbiAgbW91bnQ6IGZ1bmN0aW9uIG1vdW50KGNvbnRhaW5lcikge1xuICAgIGlmIChjb250YWluZXIgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgY3kgPSB0aGlzO1xuICAgIHZhciBfcCA9IGN5Ll9wcml2YXRlO1xuICAgIHZhciBvcHRpb25zID0gX3Aub3B0aW9ucztcbiAgICBpZiAoIWh0bWxFbGVtZW50KGNvbnRhaW5lcikgJiYgaHRtbEVsZW1lbnQoY29udGFpbmVyWzBdKSkge1xuICAgICAgY29udGFpbmVyID0gY29udGFpbmVyWzBdO1xuICAgIH1cbiAgICBjeS5zdG9wQW5pbWF0aW9uTG9vcCgpO1xuICAgIGN5LmRlc3Ryb3lSZW5kZXJlcigpO1xuICAgIF9wLmNvbnRhaW5lciA9IGNvbnRhaW5lcjtcbiAgICBfcC5zdHlsZUVuYWJsZWQgPSB0cnVlO1xuICAgIGN5LmludmFsaWRhdGVTaXplKCk7XG4gICAgY3kuaW5pdFJlbmRlcmVyKGV4dGVuZCh7fSwgb3B0aW9ucywgb3B0aW9ucy5yZW5kZXJlciwge1xuICAgICAgLy8gYWxsb3cgY3VzdG9tIHJlbmRlcmVyIG5hbWUgdG8gYmUgcmUtdXNlZCwgb3RoZXJ3aXNlIHVzZSBjYW52YXNcbiAgICAgIG5hbWU6IG9wdGlvbnMucmVuZGVyZXIubmFtZSA9PT0gJ251bGwnID8gJ2NhbnZhcycgOiBvcHRpb25zLnJlbmRlcmVyLm5hbWVcbiAgICB9KSk7XG4gICAgY3kuc3RhcnRBbmltYXRpb25Mb29wKCk7XG4gICAgY3kuc3R5bGUob3B0aW9ucy5zdHlsZSk7XG4gICAgY3kuZW1pdCgnbW91bnQnKTtcbiAgICByZXR1cm4gY3k7XG4gIH0sXG4gIHVubW91bnQ6IGZ1bmN0aW9uIHVubW91bnQoKSB7XG4gICAgdmFyIGN5ID0gdGhpcztcbiAgICBjeS5zdG9wQW5pbWF0aW9uTG9vcCgpO1xuICAgIGN5LmRlc3Ryb3lSZW5kZXJlcigpO1xuICAgIGN5LmluaXRSZW5kZXJlcih7XG4gICAgICBuYW1lOiAnbnVsbCdcbiAgICB9KTtcbiAgICBjeS5lbWl0KCd1bm1vdW50Jyk7XG4gICAgcmV0dXJuIGN5O1xuICB9LFxuICBvcHRpb25zOiBmdW5jdGlvbiBvcHRpb25zKCkge1xuICAgIHJldHVybiBjb3B5KHRoaXMuX3ByaXZhdGUub3B0aW9ucyk7XG4gIH0sXG4gIGpzb246IGZ1bmN0aW9uIGpzb24ob2JqKSB7XG4gICAgdmFyIGN5ID0gdGhpcztcbiAgICB2YXIgX3AgPSBjeS5fcHJpdmF0ZTtcbiAgICB2YXIgZWxlcyA9IGN5Lm11dGFibGVFbGVtZW50cygpO1xuICAgIHZhciBnZXRGcmVzaFJlZiA9IGZ1bmN0aW9uIGdldEZyZXNoUmVmKGVsZSkge1xuICAgICAgcmV0dXJuIGN5LmdldEVsZW1lbnRCeUlkKGVsZS5pZCgpKTtcbiAgICB9O1xuICAgIGlmIChwbGFpbk9iamVjdChvYmopKSB7XG4gICAgICAvLyBzZXRcblxuICAgICAgY3kuc3RhcnRCYXRjaCgpO1xuICAgICAgaWYgKG9iai5lbGVtZW50cykge1xuICAgICAgICB2YXIgaWRJbkpzb24gPSB7fTtcbiAgICAgICAgdmFyIHVwZGF0ZUVsZXMgPSBmdW5jdGlvbiB1cGRhdGVFbGVzKGpzb25zLCBncikge1xuICAgICAgICAgIHZhciB0b0FkZCA9IFtdO1xuICAgICAgICAgIHZhciB0b01vZCA9IFtdO1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwganNvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBqc29uID0ganNvbnNbaV07XG4gICAgICAgICAgICBpZiAoIWpzb24uZGF0YS5pZCkge1xuICAgICAgICAgICAgICB3YXJuKCdjeS5qc29uKCkgY2Fubm90IGhhbmRsZSBlbGVtZW50cyB3aXRob3V0IGFuIElEIGF0dHJpYnV0ZScpO1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBpZCA9ICcnICsganNvbi5kYXRhLmlkOyAvLyBpZCBtdXN0IGJlIHN0cmluZ1xuICAgICAgICAgICAgdmFyIGVsZSA9IGN5LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICAgICAgICAgIGlkSW5Kc29uW2lkXSA9IHRydWU7XG4gICAgICAgICAgICBpZiAoZWxlLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAvLyBleGlzdGluZyBlbGVtZW50IHNob3VsZCBiZSB1cGRhdGVkXG4gICAgICAgICAgICAgIHRvTW9kLnB1c2goe1xuICAgICAgICAgICAgICAgIGVsZTogZWxlLFxuICAgICAgICAgICAgICAgIGpzb246IGpzb25cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBvdGhlcndpc2Ugc2hvdWxkIGJlIGFkZGVkXG4gICAgICAgICAgICAgIGlmIChncikge1xuICAgICAgICAgICAgICAgIGpzb24uZ3JvdXAgPSBncjtcbiAgICAgICAgICAgICAgICB0b0FkZC5wdXNoKGpzb24pO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRvQWRkLnB1c2goanNvbik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY3kuYWRkKHRvQWRkKTtcbiAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgdG9Nb2QubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB2YXIgX3RvTW9kJF9pID0gdG9Nb2RbX2ldLFxuICAgICAgICAgICAgICBfZWxlID0gX3RvTW9kJF9pLmVsZSxcbiAgICAgICAgICAgICAgX2pzb24gPSBfdG9Nb2QkX2kuanNvbjtcbiAgICAgICAgICAgIF9lbGUuanNvbihfanNvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBpZiAoYXJyYXkob2JqLmVsZW1lbnRzKSkge1xuICAgICAgICAgIC8vIGVsZW1lbnRzOiBbXVxuICAgICAgICAgIHVwZGF0ZUVsZXMob2JqLmVsZW1lbnRzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBlbGVtZW50czogeyBub2RlczogW10sIGVkZ2VzOiBbXSB9XG4gICAgICAgICAgdmFyIGdycyA9IFsnbm9kZXMnLCAnZWRnZXMnXTtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGdyID0gZ3JzW2ldO1xuICAgICAgICAgICAgdmFyIGVsZW1lbnRzID0gb2JqLmVsZW1lbnRzW2dyXTtcbiAgICAgICAgICAgIGlmIChhcnJheShlbGVtZW50cykpIHtcbiAgICAgICAgICAgICAgdXBkYXRlRWxlcyhlbGVtZW50cywgZ3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgcGFyZW50c1RvUmVtb3ZlID0gY3kuY29sbGVjdGlvbigpO1xuICAgICAgICBlbGVzLmZpbHRlcihmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgICAgcmV0dXJuICFpZEluSnNvbltlbGUuaWQoKV07XG4gICAgICAgIH0pLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICAgIGlmIChlbGUuaXNQYXJlbnQoKSkge1xuICAgICAgICAgICAgcGFyZW50c1RvUmVtb3ZlLm1lcmdlKGVsZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVsZS5yZW1vdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIHNvIHRoYXQgY2hpbGRyZW4gYXJlIG5vdCByZW1vdmVkIHcvcGFyZW50XG4gICAgICAgIHBhcmVudHNUb1JlbW92ZS5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgICByZXR1cm4gZWxlLmNoaWxkcmVuKCkubW92ZSh7XG4gICAgICAgICAgICBwYXJlbnQ6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gaW50ZXJtZWRpYXRlIHBhcmVudHMgbWF5IGJlIG1vdmVkIGJ5IHByaW9yIGxpbmUsIHNvIG1ha2Ugc3VyZSB3ZSByZW1vdmUgYnkgZnJlc2ggcmVmc1xuICAgICAgICBwYXJlbnRzVG9SZW1vdmUuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgICAgcmV0dXJuIGdldEZyZXNoUmVmKGVsZSkucmVtb3ZlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKG9iai5zdHlsZSkge1xuICAgICAgICBjeS5zdHlsZShvYmouc3R5bGUpO1xuICAgICAgfVxuICAgICAgaWYgKG9iai56b29tICE9IG51bGwgJiYgb2JqLnpvb20gIT09IF9wLnpvb20pIHtcbiAgICAgICAgY3kuem9vbShvYmouem9vbSk7XG4gICAgICB9XG4gICAgICBpZiAob2JqLnBhbikge1xuICAgICAgICBpZiAob2JqLnBhbi54ICE9PSBfcC5wYW4ueCB8fCBvYmoucGFuLnkgIT09IF9wLnBhbi55KSB7XG4gICAgICAgICAgY3kucGFuKG9iai5wYW4pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAob2JqLmRhdGEpIHtcbiAgICAgICAgY3kuZGF0YShvYmouZGF0YSk7XG4gICAgICB9XG4gICAgICB2YXIgZmllbGRzID0gWydtaW5ab29tJywgJ21heFpvb20nLCAnem9vbWluZ0VuYWJsZWQnLCAndXNlclpvb21pbmdFbmFibGVkJywgJ3Bhbm5pbmdFbmFibGVkJywgJ3VzZXJQYW5uaW5nRW5hYmxlZCcsICdib3hTZWxlY3Rpb25FbmFibGVkJywgJ2F1dG9sb2NrJywgJ2F1dG91bmdyYWJpZnknLCAnYXV0b3Vuc2VsZWN0aWZ5JywgJ211bHRpQ2xpY2tEZWJvdW5jZVRpbWUnXTtcbiAgICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IGZpZWxkcy5sZW5ndGg7IF9pMisrKSB7XG4gICAgICAgIHZhciBmID0gZmllbGRzW19pMl07XG4gICAgICAgIGlmIChvYmpbZl0gIT0gbnVsbCkge1xuICAgICAgICAgIGN5W2ZdKG9ialtmXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGN5LmVuZEJhdGNoKCk7XG4gICAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZ2V0XG4gICAgICB2YXIgZmxhdCA9ICEhb2JqO1xuICAgICAgdmFyIGpzb24gPSB7fTtcbiAgICAgIGlmIChmbGF0KSB7XG4gICAgICAgIGpzb24uZWxlbWVudHMgPSB0aGlzLmVsZW1lbnRzKCkubWFwKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgICByZXR1cm4gZWxlLmpzb24oKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBqc29uLmVsZW1lbnRzID0ge307XG4gICAgICAgIGVsZXMuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgICAgdmFyIGdyb3VwID0gZWxlLmdyb3VwKCk7XG4gICAgICAgICAgaWYgKCFqc29uLmVsZW1lbnRzW2dyb3VwXSkge1xuICAgICAgICAgICAganNvbi5lbGVtZW50c1tncm91cF0gPSBbXTtcbiAgICAgICAgICB9XG4gICAgICAgICAganNvbi5lbGVtZW50c1tncm91cF0ucHVzaChlbGUuanNvbigpKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fcHJpdmF0ZS5zdHlsZUVuYWJsZWQpIHtcbiAgICAgICAganNvbi5zdHlsZSA9IGN5LnN0eWxlKCkuanNvbigpO1xuICAgICAgfVxuICAgICAganNvbi5kYXRhID0gY29weShjeS5kYXRhKCkpO1xuICAgICAgdmFyIG9wdGlvbnMgPSBfcC5vcHRpb25zO1xuICAgICAganNvbi56b29taW5nRW5hYmxlZCA9IF9wLnpvb21pbmdFbmFibGVkO1xuICAgICAganNvbi51c2VyWm9vbWluZ0VuYWJsZWQgPSBfcC51c2VyWm9vbWluZ0VuYWJsZWQ7XG4gICAgICBqc29uLnpvb20gPSBfcC56b29tO1xuICAgICAganNvbi5taW5ab29tID0gX3AubWluWm9vbTtcbiAgICAgIGpzb24ubWF4Wm9vbSA9IF9wLm1heFpvb207XG4gICAgICBqc29uLnBhbm5pbmdFbmFibGVkID0gX3AucGFubmluZ0VuYWJsZWQ7XG4gICAgICBqc29uLnVzZXJQYW5uaW5nRW5hYmxlZCA9IF9wLnVzZXJQYW5uaW5nRW5hYmxlZDtcbiAgICAgIGpzb24ucGFuID0gY29weShfcC5wYW4pO1xuICAgICAganNvbi5ib3hTZWxlY3Rpb25FbmFibGVkID0gX3AuYm94U2VsZWN0aW9uRW5hYmxlZDtcbiAgICAgIGpzb24ucmVuZGVyZXIgPSBjb3B5KG9wdGlvbnMucmVuZGVyZXIpO1xuICAgICAganNvbi5oaWRlRWRnZXNPblZpZXdwb3J0ID0gb3B0aW9ucy5oaWRlRWRnZXNPblZpZXdwb3J0O1xuICAgICAganNvbi50ZXh0dXJlT25WaWV3cG9ydCA9IG9wdGlvbnMudGV4dHVyZU9uVmlld3BvcnQ7XG4gICAgICBqc29uLndoZWVsU2Vuc2l0aXZpdHkgPSBvcHRpb25zLndoZWVsU2Vuc2l0aXZpdHk7XG4gICAgICBqc29uLm1vdGlvbkJsdXIgPSBvcHRpb25zLm1vdGlvbkJsdXI7XG4gICAgICBqc29uLm11bHRpQ2xpY2tEZWJvdW5jZVRpbWUgPSBvcHRpb25zLm11bHRpQ2xpY2tEZWJvdW5jZVRpbWU7XG4gICAgICByZXR1cm4ganNvbjtcbiAgICB9XG4gIH1cbn0pO1xuY29yZWZuLiRpZCA9IGNvcmVmbi5nZXRFbGVtZW50QnlJZDtcbltjb3JlZm4kOSwgY29yZWZuJDgsIGVsZXNmbiwgY29yZWZuJDcsIGNvcmVmbiQ2LCBjb3JlZm4kNSwgY29yZWZuJDQsIGNvcmVmbiQzLCBjb3JlZm4kMiwgY29yZWZuJDEsIGZuXS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wcykge1xuICBleHRlbmQoY29yZWZuLCBwcm9wcyk7XG59KTtcblxuLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cbnZhciBkZWZhdWx0cyQ3ID0ge1xuICBmaXQ6IHRydWUsXG4gIC8vIHdoZXRoZXIgdG8gZml0IHRoZSB2aWV3cG9ydCB0byB0aGUgZ3JhcGhcbiAgZGlyZWN0ZWQ6IGZhbHNlLFxuICAvLyB3aGV0aGVyIHRoZSB0cmVlIGlzIGRpcmVjdGVkIGRvd253YXJkcyAob3IgZWRnZXMgY2FuIHBvaW50IGluIGFueSBkaXJlY3Rpb24gaWYgZmFsc2UpXG4gIGRpcmVjdGlvbjogJ2Rvd253YXJkJyxcbiAgLy8gZGV0ZXJtaW5lcyB0aGUgZGlyZWN0aW9uIGluIHdoaWNoIHRoZSB0cmVlIHN0cnVjdHVyZSBpcyBkcmF3bi4gIFRoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlICdkb3dud2FyZCcsICd1cHdhcmQnLCAncmlnaHR3YXJkJywgb3IgJ2xlZnR3YXJkJy5cbiAgcGFkZGluZzogMzAsXG4gIC8vIHBhZGRpbmcgb24gZml0XG4gIGNpcmNsZTogZmFsc2UsXG4gIC8vIHB1dCBkZXB0aHMgaW4gY29uY2VudHJpYyBjaXJjbGVzIGlmIHRydWUsIHB1dCBkZXB0aHMgdG9wIGRvd24gaWYgZmFsc2VcbiAgZ3JpZDogZmFsc2UsXG4gIC8vIHdoZXRoZXIgdG8gY3JlYXRlIGFuIGV2ZW4gZ3JpZCBpbnRvIHdoaWNoIHRoZSBEQUcgaXMgcGxhY2VkIChjaXJjbGU6ZmFsc2Ugb25seSlcbiAgc3BhY2luZ0ZhY3RvcjogMS43NSxcbiAgLy8gcG9zaXRpdmUgc3BhY2luZyBmYWN0b3IsIGxhcmdlciA9PiBtb3JlIHNwYWNlIGJldHdlZW4gbm9kZXMgKE4uQi4gbi9hIGlmIGNhdXNlcyBvdmVybGFwKVxuICBib3VuZGluZ0JveDogdW5kZWZpbmVkLFxuICAvLyBjb25zdHJhaW4gbGF5b3V0IGJvdW5kczsgeyB4MSwgeTEsIHgyLCB5MiB9IG9yIHsgeDEsIHkxLCB3LCBoIH1cbiAgYXZvaWRPdmVybGFwOiB0cnVlLFxuICAvLyBwcmV2ZW50cyBub2RlIG92ZXJsYXAsIG1heSBvdmVyZmxvdyBib3VuZGluZ0JveCBpZiBub3QgZW5vdWdoIHNwYWNlXG4gIG5vZGVEaW1lbnNpb25zSW5jbHVkZUxhYmVsczogZmFsc2UsXG4gIC8vIEV4Y2x1ZGVzIHRoZSBsYWJlbCB3aGVuIGNhbGN1bGF0aW5nIG5vZGUgYm91bmRpbmcgYm94ZXMgZm9yIHRoZSBsYXlvdXQgYWxnb3JpdGhtXG4gIHJvb3RzOiB1bmRlZmluZWQsXG4gIC8vIHRoZSByb290cyBvZiB0aGUgdHJlZXNcbiAgZGVwdGhTb3J0OiB1bmRlZmluZWQsXG4gIC8vIGEgc29ydGluZyBmdW5jdGlvbiB0byBvcmRlciBub2RlcyBhdCBlcXVhbCBkZXB0aC4gZS5nLiBmdW5jdGlvbihhLCBiKXsgcmV0dXJuIGEuZGF0YSgnd2VpZ2h0JykgLSBiLmRhdGEoJ3dlaWdodCcpIH1cbiAgYW5pbWF0ZTogZmFsc2UsXG4gIC8vIHdoZXRoZXIgdG8gdHJhbnNpdGlvbiB0aGUgbm9kZSBwb3NpdGlvbnNcbiAgYW5pbWF0aW9uRHVyYXRpb246IDUwMCxcbiAgLy8gZHVyYXRpb24gb2YgYW5pbWF0aW9uIGluIG1zIGlmIGVuYWJsZWRcbiAgYW5pbWF0aW9uRWFzaW5nOiB1bmRlZmluZWQsXG4gIC8vIGVhc2luZyBvZiBhbmltYXRpb24gaWYgZW5hYmxlZCxcbiAgYW5pbWF0ZUZpbHRlcjogZnVuY3Rpb24gYW5pbWF0ZUZpbHRlcihub2RlLCBpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIC8vIGEgZnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIG5vZGUgc2hvdWxkIGJlIGFuaW1hdGVkLiAgQWxsIG5vZGVzIGFuaW1hdGVkIGJ5IGRlZmF1bHQgb24gYW5pbWF0ZSBlbmFibGVkLiAgTm9uLWFuaW1hdGVkIG5vZGVzIGFyZSBwb3NpdGlvbmVkIGltbWVkaWF0ZWx5IHdoZW4gdGhlIGxheW91dCBzdGFydHNcbiAgcmVhZHk6IHVuZGVmaW5lZCxcbiAgLy8gY2FsbGJhY2sgb24gbGF5b3V0cmVhZHlcbiAgc3RvcDogdW5kZWZpbmVkLFxuICAvLyBjYWxsYmFjayBvbiBsYXlvdXRzdG9wXG4gIHRyYW5zZm9ybTogZnVuY3Rpb24gdHJhbnNmb3JtKG5vZGUsIHBvc2l0aW9uKSB7XG4gICAgcmV0dXJuIHBvc2l0aW9uO1xuICB9IC8vIHRyYW5zZm9ybSBhIGdpdmVuIG5vZGUgcG9zaXRpb24uIFVzZWZ1bCBmb3IgY2hhbmdpbmcgZmxvdyBkaXJlY3Rpb24gaW4gZGlzY3JldGUgbGF5b3V0c1xufTtcbnZhciBkZXByZWNhdGVkT3B0aW9uRGVmYXVsdHMgPSB7XG4gIG1heGltYWw6IGZhbHNlLFxuICAvLyB3aGV0aGVyIHRvIHNoaWZ0IG5vZGVzIGRvd24gdGhlaXIgbmF0dXJhbCBCRlMgZGVwdGhzIGluIG9yZGVyIHRvIGF2b2lkIHVwd2FyZHMgZWRnZXMgKERBR1Mgb25seSk7IHNldHRpbmcgYWN5Y2xpYyB0byB0cnVlIHNldHMgbWF4aW1hbCB0byB0cnVlIGFsc29cbiAgYWN5Y2xpYzogZmFsc2UgLy8gd2hldGhlciB0aGUgdHJlZSBpcyBhY3ljbGljIGFuZCB0aHVzIGEgbm9kZSBjb3VsZCBiZSBzaGlmdGVkIChkdWUgdG8gdGhlIG1heGltYWwgb3B0aW9uKSBtdWx0aXBsZSB0aW1lcyB3aXRob3V0IGNhdXNpbmcgYW4gaW5maW5pdGUgbG9vcDsgc2V0dGluZyB0byB0cnVlIHNldHMgbWF4aW1hbCB0byB0cnVlIGFsc287IGlmIHlvdSBhcmUgdW5jZXJ0YWluIHdoZXRoZXIgYSB0cmVlIGlzIGFjeWNsaWMsIHNldCB0byBmYWxzZSB0byBhdm9pZCBwb3RlbnRpYWwgaW5maW5pdGUgbG9vcHNcbn07XG5cbi8qIGVzbGludC1lbmFibGUgKi9cblxudmFyIGdldEluZm8gPSBmdW5jdGlvbiBnZXRJbmZvKGVsZSkge1xuICByZXR1cm4gZWxlLnNjcmF0Y2goJ2JyZWFkdGhmaXJzdCcpO1xufTtcbnZhciBzZXRJbmZvID0gZnVuY3Rpb24gc2V0SW5mbyhlbGUsIG9iaikge1xuICByZXR1cm4gZWxlLnNjcmF0Y2goJ2JyZWFkdGhmaXJzdCcsIG9iaik7XG59O1xuZnVuY3Rpb24gQnJlYWR0aEZpcnN0TGF5b3V0KG9wdGlvbnMpIHtcbiAgdGhpcy5vcHRpb25zID0gZXh0ZW5kKHt9LCBkZWZhdWx0cyQ3LCBkZXByZWNhdGVkT3B0aW9uRGVmYXVsdHMsIG9wdGlvbnMpO1xufVxuQnJlYWR0aEZpcnN0TGF5b3V0LnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICB2YXIgY3kgPSBvcHRpb25zLmN5O1xuICB2YXIgZWxlcyA9IG9wdGlvbnMuZWxlcztcbiAgdmFyIG5vZGVzID0gZWxlcy5ub2RlcygpLmZpbHRlcihmdW5jdGlvbiAobikge1xuICAgIHJldHVybiBuLmlzQ2hpbGRsZXNzKCk7XG4gIH0pO1xuICB2YXIgZ3JhcGggPSBlbGVzO1xuICB2YXIgZGlyZWN0ZWQgPSBvcHRpb25zLmRpcmVjdGVkO1xuICB2YXIgbWF4aW1hbCA9IG9wdGlvbnMuYWN5Y2xpYyB8fCBvcHRpb25zLm1heGltYWwgfHwgb3B0aW9ucy5tYXhpbWFsQWRqdXN0bWVudHMgPiAwOyAvLyBtYXhpbWFsQWRqdXN0bWVudHMgZm9yIGNvbXBhdC4gdy8gb2xkIGNvZGU7IGFsc28sIHNldHRpbmcgYWN5Y2xpYyB0byB0cnVlIHNldHMgbWF4aW1hbCB0byB0cnVlXG5cbiAgdmFyIGhhc0JvdW5kaW5nQm94ID0gISFvcHRpb25zLmJvdW5kaW5nQm94O1xuICB2YXIgYmIgPSBtYWtlQm91bmRpbmdCb3goaGFzQm91bmRpbmdCb3ggPyBvcHRpb25zLmJvdW5kaW5nQm94IDogc3RydWN0dXJlZENsb25lKGN5LmV4dGVudCgpKSk7XG4gIHZhciByb290cztcbiAgaWYgKGVsZW1lbnRPckNvbGxlY3Rpb24ob3B0aW9ucy5yb290cykpIHtcbiAgICByb290cyA9IG9wdGlvbnMucm9vdHM7XG4gIH0gZWxzZSBpZiAoYXJyYXkob3B0aW9ucy5yb290cykpIHtcbiAgICB2YXIgcm9vdHNBcnJheSA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3B0aW9ucy5yb290cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGlkID0gb3B0aW9ucy5yb290c1tpXTtcbiAgICAgIHZhciBlbGUgPSBjeS5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgICByb290c0FycmF5LnB1c2goZWxlKTtcbiAgICB9XG4gICAgcm9vdHMgPSBjeS5jb2xsZWN0aW9uKHJvb3RzQXJyYXkpO1xuICB9IGVsc2UgaWYgKHN0cmluZyhvcHRpb25zLnJvb3RzKSkge1xuICAgIHJvb3RzID0gY3kuJChvcHRpb25zLnJvb3RzKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoZGlyZWN0ZWQpIHtcbiAgICAgIHJvb3RzID0gbm9kZXMucm9vdHMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGNvbXBvbmVudHMgPSBlbGVzLmNvbXBvbmVudHMoKTtcbiAgICAgIHJvb3RzID0gY3kuY29sbGVjdGlvbigpO1xuICAgICAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoKSB7XG4gICAgICAgIHZhciBjb21wID0gY29tcG9uZW50c1tfaV07XG4gICAgICAgIHZhciBtYXhEZWdyZWUgPSBjb21wLm1heERlZ3JlZShmYWxzZSk7XG4gICAgICAgIHZhciBjb21wUm9vdHMgPSBjb21wLmZpbHRlcihmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgICAgcmV0dXJuIGVsZS5kZWdyZWUoZmFsc2UpID09PSBtYXhEZWdyZWU7XG4gICAgICAgIH0pO1xuICAgICAgICByb290cyA9IHJvb3RzLmFkZChjb21wUm9vdHMpO1xuICAgICAgfTtcbiAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBjb21wb25lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICBfbG9vcCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICB2YXIgZGVwdGhzID0gW107XG4gIHZhciBmb3VuZEJ5QmZzID0ge307XG4gIHZhciBhZGRUb0RlcHRoID0gZnVuY3Rpb24gYWRkVG9EZXB0aChlbGUsIGQpIHtcbiAgICBpZiAoZGVwdGhzW2RdID09IG51bGwpIHtcbiAgICAgIGRlcHRoc1tkXSA9IFtdO1xuICAgIH1cbiAgICB2YXIgaSA9IGRlcHRoc1tkXS5sZW5ndGg7XG4gICAgZGVwdGhzW2RdLnB1c2goZWxlKTtcbiAgICBzZXRJbmZvKGVsZSwge1xuICAgICAgaW5kZXg6IGksXG4gICAgICBkZXB0aDogZFxuICAgIH0pO1xuICB9O1xuICB2YXIgY2hhbmdlRGVwdGggPSBmdW5jdGlvbiBjaGFuZ2VEZXB0aChlbGUsIG5ld0RlcHRoKSB7XG4gICAgdmFyIF9nZXRJbmZvID0gZ2V0SW5mbyhlbGUpLFxuICAgICAgZGVwdGggPSBfZ2V0SW5mby5kZXB0aCxcbiAgICAgIGluZGV4ID0gX2dldEluZm8uaW5kZXg7XG4gICAgZGVwdGhzW2RlcHRoXVtpbmRleF0gPSBudWxsO1xuXG4gICAgLy8gYWRkIG9ubHkgY2hpbGRsZXNzIG5vZGVzXG4gICAgaWYgKGVsZS5pc0NoaWxkbGVzcygpKSBhZGRUb0RlcHRoKGVsZSwgbmV3RGVwdGgpO1xuICB9O1xuXG4gIC8vIGZpbmQgdGhlIGRlcHRocyBvZiB0aGUgbm9kZXNcbiAgZ3JhcGguYmZzKHtcbiAgICByb290czogcm9vdHMsXG4gICAgZGlyZWN0ZWQ6IG9wdGlvbnMuZGlyZWN0ZWQsXG4gICAgdmlzaXQ6IGZ1bmN0aW9uIHZpc2l0KG5vZGUsIGVkZ2UsIHBOb2RlLCBpLCBkZXB0aCkge1xuICAgICAgdmFyIGVsZSA9IG5vZGVbMF07XG4gICAgICB2YXIgaWQgPSBlbGUuaWQoKTtcblxuICAgICAgLy8gYWRkIG9ubHkgY2hpbGRsZXNzIG5vZGVzXG4gICAgICBpZiAoZWxlLmlzQ2hpbGRsZXNzKCkpIGFkZFRvRGVwdGgoZWxlLCBkZXB0aCk7XG4gICAgICBmb3VuZEJ5QmZzW2lkXSA9IHRydWU7XG4gICAgfVxuICB9KTtcblxuICAvLyBjaGVjayBmb3Igbm9kZXMgbm90IGZvdW5kIGJ5IGJmc1xuICB2YXIgb3JwaGFuTm9kZXMgPSBbXTtcbiAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgbm9kZXMubGVuZ3RoOyBfaTIrKykge1xuICAgIHZhciBfZWxlID0gbm9kZXNbX2kyXTtcbiAgICBpZiAoZm91bmRCeUJmc1tfZWxlLmlkKCldKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3JwaGFuTm9kZXMucHVzaChfZWxlKTtcbiAgICB9XG4gIH1cblxuICAvLyBhc3NpZ24gdGhlIG5vZGVzIGEgZGVwdGggYW5kIGluZGV4XG4gIHZhciBhc3NpZ25EZXB0aHNBdCA9IGZ1bmN0aW9uIGFzc2lnbkRlcHRoc0F0KGkpIHtcbiAgICB2YXIgZWxlcyA9IGRlcHRoc1tpXTtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGVsZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBfZWxlMiA9IGVsZXNbal07XG4gICAgICBpZiAoX2VsZTIgPT0gbnVsbCkge1xuICAgICAgICBlbGVzLnNwbGljZShqLCAxKTtcbiAgICAgICAgai0tO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHNldEluZm8oX2VsZTIsIHtcbiAgICAgICAgZGVwdGg6IGksXG4gICAgICAgIGluZGV4OiBqXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG4gIHZhciBhZGp1c3RNYXhpbWFsbHkgPSBmdW5jdGlvbiBhZGp1c3RNYXhpbWFsbHkoZWxlLCBzaGlmdGVkKSB7XG4gICAgdmFyIGVJbmZvID0gZ2V0SW5mbyhlbGUpO1xuICAgIHZhciBpbmNvbWVycyA9IGVsZS5pbmNvbWVycygpLmZpbHRlcihmdW5jdGlvbiAoZWwpIHtcbiAgICAgIHJldHVybiBlbC5pc05vZGUoKSAmJiBlbGVzLmhhcyhlbCk7XG4gICAgfSk7XG4gICAgdmFyIG1heERlcHRoID0gLTE7XG4gICAgdmFyIGlkID0gZWxlLmlkKCk7XG4gICAgZm9yICh2YXIgayA9IDA7IGsgPCBpbmNvbWVycy5sZW5ndGg7IGsrKykge1xuICAgICAgdmFyIGluY21yID0gaW5jb21lcnNba107XG4gICAgICB2YXIgaUluZm8gPSBnZXRJbmZvKGluY21yKTtcbiAgICAgIG1heERlcHRoID0gTWF0aC5tYXgobWF4RGVwdGgsIGlJbmZvLmRlcHRoKTtcbiAgICB9XG4gICAgaWYgKGVJbmZvLmRlcHRoIDw9IG1heERlcHRoKSB7XG4gICAgICBpZiAoIW9wdGlvbnMuYWN5Y2xpYyAmJiBzaGlmdGVkW2lkXSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHZhciBuZXdEZXB0aCA9IG1heERlcHRoICsgMTtcbiAgICAgIGNoYW5nZURlcHRoKGVsZSwgbmV3RGVwdGgpO1xuICAgICAgc2hpZnRlZFtpZF0gPSBuZXdEZXB0aDtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgLy8gZm9yIHRoZSBkaXJlY3RlZCBjYXNlLCB0cnkgdG8gbWFrZSB0aGUgZWRnZXMgYWxsIGdvIGRvd24gKGkuZS4gZGVwdGggaSA9PiBkZXB0aCBpICsgMSlcbiAgaWYgKGRpcmVjdGVkICYmIG1heGltYWwpIHtcbiAgICB2YXIgUSA9IFtdO1xuICAgIHZhciBzaGlmdGVkID0ge307XG4gICAgdmFyIGVucXVldWUgPSBmdW5jdGlvbiBlbnF1ZXVlKG4pIHtcbiAgICAgIHJldHVybiBRLnB1c2gobik7XG4gICAgfTtcbiAgICB2YXIgZGVxdWV1ZSA9IGZ1bmN0aW9uIGRlcXVldWUoKSB7XG4gICAgICByZXR1cm4gUS5zaGlmdCgpO1xuICAgIH07XG4gICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbiAobikge1xuICAgICAgcmV0dXJuIFEucHVzaChuKTtcbiAgICB9KTtcbiAgICB3aGlsZSAoUS5sZW5ndGggPiAwKSB7XG4gICAgICB2YXIgX2VsZTMgPSBkZXF1ZXVlKCk7XG4gICAgICB2YXIgZGlkU2hpZnQgPSBhZGp1c3RNYXhpbWFsbHkoX2VsZTMsIHNoaWZ0ZWQpO1xuICAgICAgaWYgKGRpZFNoaWZ0KSB7XG4gICAgICAgIF9lbGUzLm91dGdvZXJzKCkuZmlsdGVyKGZ1bmN0aW9uIChlbCkge1xuICAgICAgICAgIHJldHVybiBlbC5pc05vZGUoKSAmJiBlbGVzLmhhcyhlbCk7XG4gICAgICAgIH0pLmZvckVhY2goZW5xdWV1ZSk7XG4gICAgICB9IGVsc2UgaWYgKGRpZFNoaWZ0ID09PSBudWxsKSB7XG4gICAgICAgIHdhcm4oJ0RldGVjdGVkIGRvdWJsZSBtYXhpbWFsIHNoaWZ0IGZvciBub2RlIGAnICsgX2VsZTMuaWQoKSArICdgLiAgQmFpbGluZyBtYXhpbWFsIGFkanVzdG1lbnQgZHVlIHRvIGN5Y2xlLiAgVXNlIGBvcHRpb25zLm1heGltYWw6IHRydWVgIG9ubHkgb24gREFHcy4nKTtcbiAgICAgICAgYnJlYWs7IC8vIGV4aXQgb24gZmFpbHVyZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIGZpbmQgbWluIGRpc3RhbmNlIHdlIG5lZWQgdG8gbGVhdmUgYmV0d2VlbiBub2Rlc1xuICB2YXIgbWluRGlzdGFuY2UgPSAwO1xuICBpZiAob3B0aW9ucy5hdm9pZE92ZXJsYXApIHtcbiAgICBmb3IgKHZhciBfaTMgPSAwOyBfaTMgPCBub2Rlcy5sZW5ndGg7IF9pMysrKSB7XG4gICAgICB2YXIgbiA9IG5vZGVzW19pM107XG4gICAgICB2YXIgbmJiID0gbi5sYXlvdXREaW1lbnNpb25zKG9wdGlvbnMpO1xuICAgICAgdmFyIHcgPSBuYmIudztcbiAgICAgIHZhciBoID0gbmJiLmg7XG4gICAgICBtaW5EaXN0YW5jZSA9IE1hdGgubWF4KG1pbkRpc3RhbmNlLCB3LCBoKTtcbiAgICB9XG4gIH1cblxuICAvLyBnZXQgdGhlIHdlaWdodGVkIHBlcmNlbnQgZm9yIGFuIGVsZW1lbnQgYmFzZWQgb24gaXRzIGNvbm5lY3Rpdml0eSB0byBvdGhlciBsZXZlbHNcbiAgdmFyIGNhY2hlZFdlaWdodGVkUGVyY2VudCA9IHt9O1xuICB2YXIgZ2V0V2VpZ2h0ZWRQZXJjZW50ID0gZnVuY3Rpb24gZ2V0V2VpZ2h0ZWRQZXJjZW50KGVsZSkge1xuICAgIGlmIChjYWNoZWRXZWlnaHRlZFBlcmNlbnRbZWxlLmlkKCldKSB7XG4gICAgICByZXR1cm4gY2FjaGVkV2VpZ2h0ZWRQZXJjZW50W2VsZS5pZCgpXTtcbiAgICB9XG4gICAgdmFyIGVsZURlcHRoID0gZ2V0SW5mbyhlbGUpLmRlcHRoO1xuICAgIHZhciBuZWlnaGJvcnMgPSBlbGUubmVpZ2hib3Job29kKCk7XG4gICAgdmFyIHBlcmNlbnQgPSAwO1xuICAgIHZhciBzYW1wbGVzID0gMDtcbiAgICBmb3IgKHZhciBfaTQgPSAwOyBfaTQgPCBuZWlnaGJvcnMubGVuZ3RoOyBfaTQrKykge1xuICAgICAgdmFyIG5laWdoYm9yID0gbmVpZ2hib3JzW19pNF07XG4gICAgICBpZiAobmVpZ2hib3IuaXNFZGdlKCkgfHwgbmVpZ2hib3IuaXNQYXJlbnQoKSB8fCAhbm9kZXMuaGFzKG5laWdoYm9yKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBiZiA9IGdldEluZm8obmVpZ2hib3IpO1xuICAgICAgaWYgKGJmID09IG51bGwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSBiZi5pbmRleDtcbiAgICAgIHZhciBkZXB0aCA9IGJmLmRlcHRoO1xuXG4gICAgICAvLyB1bmFzc2lnbmVkIG5laWdoYm91cnMgc2hvdWxkbid0IGFmZmVjdCB0aGUgb3JkZXJpbmdcbiAgICAgIGlmIChpbmRleCA9PSBudWxsIHx8IGRlcHRoID09IG51bGwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB2YXIgbkRlcHRoID0gZGVwdGhzW2RlcHRoXS5sZW5ndGg7XG4gICAgICBpZiAoZGVwdGggPCBlbGVEZXB0aCkge1xuICAgICAgICAvLyBvbmx5IGdldCBpbmZsdWVuY2VkIGJ5IGVsZW1lbnRzIGFib3ZlXG4gICAgICAgIHBlcmNlbnQgKz0gaW5kZXggLyBuRGVwdGg7XG4gICAgICAgIHNhbXBsZXMrKztcbiAgICAgIH1cbiAgICB9XG4gICAgc2FtcGxlcyA9IE1hdGgubWF4KDEsIHNhbXBsZXMpO1xuICAgIHBlcmNlbnQgPSBwZXJjZW50IC8gc2FtcGxlcztcbiAgICBpZiAoc2FtcGxlcyA9PT0gMCkge1xuICAgICAgLy8gcHV0IGxvbmUgbm9kZXMgYXQgdGhlIHN0YXJ0XG4gICAgICBwZXJjZW50ID0gMDtcbiAgICB9XG4gICAgY2FjaGVkV2VpZ2h0ZWRQZXJjZW50W2VsZS5pZCgpXSA9IHBlcmNlbnQ7XG4gICAgcmV0dXJuIHBlcmNlbnQ7XG4gIH07XG5cbiAgLy8gcmVhcnJhbmdlIHRoZSBpbmRpY2VzIGluIGVhY2ggZGVwdGggbGV2ZWwgYmFzZWQgb24gY29ubmVjdGl2aXR5XG4gIHZhciBzb3J0Rm4gPSBmdW5jdGlvbiBzb3J0Rm4oYSwgYikge1xuICAgIHZhciBhcGN0ID0gZ2V0V2VpZ2h0ZWRQZXJjZW50KGEpO1xuICAgIHZhciBicGN0ID0gZ2V0V2VpZ2h0ZWRQZXJjZW50KGIpO1xuICAgIHZhciBkaWZmID0gYXBjdCAtIGJwY3Q7XG4gICAgaWYgKGRpZmYgPT09IDApIHtcbiAgICAgIHJldHVybiBhc2NlbmRpbmcoYS5pZCgpLCBiLmlkKCkpOyAvLyBtYWtlIHN1cmUgc29ydCBkb2Vzbid0IGhhdmUgZG9uJ3QtY2FyZSBjb21wYXJpc29uc1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZGlmZjtcbiAgICB9XG4gIH07XG4gIGlmIChvcHRpb25zLmRlcHRoU29ydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgc29ydEZuID0gb3B0aW9ucy5kZXB0aFNvcnQ7XG4gIH1cbiAgdmFyIGRlcHRoc0xlbiA9IGRlcHRocy5sZW5ndGg7XG5cbiAgLy8gc29ydCBlYWNoIGxldmVsIHRvIG1ha2UgY29ubmVjdGVkIG5vZGVzIGNsb3NlclxuICBmb3IgKHZhciBfaTUgPSAwOyBfaTUgPCBkZXB0aHNMZW47IF9pNSsrKSB7XG4gICAgZGVwdGhzW19pNV0uc29ydChzb3J0Rm4pO1xuICAgIGFzc2lnbkRlcHRoc0F0KF9pNSk7XG4gIH1cblxuICAvLyBhc3NpZ24gb3JwaGFuIG5vZGVzIHRvIGEgbmV3IHRvcC1sZXZlbCBkZXB0aFxuICB2YXIgb3JwaGFuRGVwdGggPSBbXTtcbiAgZm9yICh2YXIgX2k2ID0gMDsgX2k2IDwgb3JwaGFuTm9kZXMubGVuZ3RoOyBfaTYrKykge1xuICAgIG9ycGhhbkRlcHRoLnB1c2gob3JwaGFuTm9kZXNbX2k2XSk7XG4gIH1cbiAgdmFyIGFzc2lnbkRlcHRocyA9IGZ1bmN0aW9uIGFzc2lnbkRlcHRocygpIHtcbiAgICBmb3IgKHZhciBfaTcgPSAwOyBfaTcgPCBkZXB0aHNMZW47IF9pNysrKSB7XG4gICAgICBhc3NpZ25EZXB0aHNBdChfaTcpO1xuICAgIH1cbiAgfTtcblxuICAvLyBhZGQgYSBuZXcgdG9wLWxldmVsIGRlcHRoIG9ubHkgd2hlbiB0aGVyZSBhcmUgb3JwaGFuIG5vZGVzXG4gIGlmIChvcnBoYW5EZXB0aC5sZW5ndGgpIHtcbiAgICBkZXB0aHMudW5zaGlmdChvcnBoYW5EZXB0aCk7XG4gICAgZGVwdGhzTGVuID0gZGVwdGhzLmxlbmd0aDtcbiAgICBhc3NpZ25EZXB0aHMoKTtcbiAgfVxuICB2YXIgYmlnZ2VzdERlcHRoU2l6ZSA9IDA7XG4gIGZvciAodmFyIF9pOCA9IDA7IF9pOCA8IGRlcHRoc0xlbjsgX2k4KyspIHtcbiAgICBiaWdnZXN0RGVwdGhTaXplID0gTWF0aC5tYXgoZGVwdGhzW19pOF0ubGVuZ3RoLCBiaWdnZXN0RGVwdGhTaXplKTtcbiAgfVxuICB2YXIgY2VudGVyID0ge1xuICAgIHg6IGJiLngxICsgYmIudyAvIDIsXG4gICAgeTogYmIueTEgKyBiYi5oIC8gMlxuICB9O1xuXG4gIC8vIGF2ZXJhZ2Ugbm9kZSBzaXplXG4gIHZhciBhdmVOb2RlU2l6ZSA9IG5vZGVzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBub2RlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChib3gpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHc6IGFjYy53ID09PSAtMSA/IGJveC53IDogKGFjYy53ICsgYm94LncpIC8gMixcbiAgICAgICAgaDogYWNjLmggPT09IC0xID8gYm94LmggOiAoYWNjLmggKyBib3guaCkgLyAyXG4gICAgICB9O1xuICAgIH0obm9kZS5ib3VuZGluZ0JveCh7XG4gICAgICBpbmNsdWRlTGFiZWxzOiBvcHRpb25zLm5vZGVEaW1lbnNpb25zSW5jbHVkZUxhYmVsc1xuICAgIH0pKTtcbiAgfSwge1xuICAgIHc6IC0xLFxuICAgIGg6IC0xXG4gIH0pO1xuICB2YXIgZGlzdGFuY2VZID0gTWF0aC5tYXgoXG4gIC8vIG9ubHkgb25lIGRlcHRoXG4gIGRlcHRoc0xlbiA9PT0gMSA/IDAgOlxuICAvLyBpbnNpZGUgYSBib3VuZGluZyBib3gsIG5vIG5lZWQgZm9yIHRvcCAmIGJvdHRvbSBwYWRkaW5nXG4gIGhhc0JvdW5kaW5nQm94ID8gKGJiLmggLSBvcHRpb25zLnBhZGRpbmcgKiAyIC0gYXZlTm9kZVNpemUuaCkgLyAoZGVwdGhzTGVuIC0gMSkgOiAoYmIuaCAtIG9wdGlvbnMucGFkZGluZyAqIDIgLSBhdmVOb2RlU2l6ZS5oKSAvIChkZXB0aHNMZW4gKyAxKSwgbWluRGlzdGFuY2UpO1xuICB2YXIgbWF4RGVwdGhTaXplID0gZGVwdGhzLnJlZHVjZShmdW5jdGlvbiAobWF4LCBlbGVzKSB7XG4gICAgcmV0dXJuIE1hdGgubWF4KG1heCwgZWxlcy5sZW5ndGgpO1xuICB9LCAwKTtcbiAgdmFyIGdldFBvc2l0aW9uVG9wQm90dG9tID0gZnVuY3Rpb24gZ2V0UG9zaXRpb25Ub3BCb3R0b20oZWxlKSB7XG4gICAgdmFyIF9nZXRJbmZvMiA9IGdldEluZm8oZWxlKSxcbiAgICAgIGRlcHRoID0gX2dldEluZm8yLmRlcHRoLFxuICAgICAgaW5kZXggPSBfZ2V0SW5mbzIuaW5kZXg7XG4gICAgaWYgKG9wdGlvbnMuY2lyY2xlKSB7XG4gICAgICB2YXIgcmFkaXVzU3RlcFNpemUgPSBNYXRoLm1pbihiYi53IC8gMiAvIGRlcHRoc0xlbiwgYmIuaCAvIDIgLyBkZXB0aHNMZW4pO1xuICAgICAgcmFkaXVzU3RlcFNpemUgPSBNYXRoLm1heChyYWRpdXNTdGVwU2l6ZSwgbWluRGlzdGFuY2UpO1xuICAgICAgdmFyIHJhZGl1cyA9IHJhZGl1c1N0ZXBTaXplICogZGVwdGggKyByYWRpdXNTdGVwU2l6ZSAtIChkZXB0aHNMZW4gPiAwICYmIGRlcHRoc1swXS5sZW5ndGggPD0gMyA/IHJhZGl1c1N0ZXBTaXplIC8gMiA6IDApO1xuICAgICAgdmFyIHRoZXRhID0gMiAqIE1hdGguUEkgLyBkZXB0aHNbZGVwdGhdLmxlbmd0aCAqIGluZGV4O1xuICAgICAgaWYgKGRlcHRoID09PSAwICYmIGRlcHRoc1swXS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmFkaXVzID0gMTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IGNlbnRlci54ICsgcmFkaXVzICogTWF0aC5jb3ModGhldGEpLFxuICAgICAgICB5OiBjZW50ZXIueSArIHJhZGl1cyAqIE1hdGguc2luKHRoZXRhKVxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGRlcHRoU2l6ZSA9IGRlcHRoc1tkZXB0aF0ubGVuZ3RoO1xuICAgICAgdmFyIGRpc3RhbmNlWCA9IE1hdGgubWF4KFxuICAgICAgLy8gb25seSBvbmUgZGVwdGhcbiAgICAgIGRlcHRoU2l6ZSA9PT0gMSA/IDAgOlxuICAgICAgLy8gaW5zaWRlIGEgYm91bmRpbmcgYm94LCBubyBuZWVkIGZvciBsZWZ0ICYgcmlnaHQgcGFkZGluZ1xuICAgICAgaGFzQm91bmRpbmdCb3ggPyAoYmIudyAtIG9wdGlvbnMucGFkZGluZyAqIDIgLSBhdmVOb2RlU2l6ZS53KSAvICgob3B0aW9ucy5ncmlkID8gbWF4RGVwdGhTaXplIDogZGVwdGhTaXplKSAtIDEpIDogKGJiLncgLSBvcHRpb25zLnBhZGRpbmcgKiAyIC0gYXZlTm9kZVNpemUudykgLyAoKG9wdGlvbnMuZ3JpZCA/IG1heERlcHRoU2l6ZSA6IGRlcHRoU2l6ZSkgKyAxKSwgbWluRGlzdGFuY2UpO1xuICAgICAgdmFyIGVwb3MgPSB7XG4gICAgICAgIHg6IGNlbnRlci54ICsgKGluZGV4ICsgMSAtIChkZXB0aFNpemUgKyAxKSAvIDIpICogZGlzdGFuY2VYLFxuICAgICAgICB5OiBjZW50ZXIueSArIChkZXB0aCArIDEgLSAoZGVwdGhzTGVuICsgMSkgLyAyKSAqIGRpc3RhbmNlWVxuICAgICAgfTtcbiAgICAgIHJldHVybiBlcG9zO1xuICAgIH1cbiAgfTtcbiAgdmFyIHJvdGF0ZURlZ3JlZXMgPSB7XG4gICAgJ2Rvd253YXJkJzogMCxcbiAgICAnbGVmdHdhcmQnOiA5MCxcbiAgICAndXB3YXJkJzogMTgwLFxuICAgICdyaWdodHdhcmQnOiAtOTBcbiAgfTtcbiAgaWYgKE9iamVjdC5rZXlzKHJvdGF0ZURlZ3JlZXMpLmluZGV4T2Yob3B0aW9ucy5kaXJlY3Rpb24pID09PSAtMSkge1xuICAgIGVycm9yKFwiSW52YWxpZCBkaXJlY3Rpb24gJ1wiLmNvbmNhdChvcHRpb25zLmRpcmVjdGlvbiwgXCInIHNwZWNpZmllZCBmb3IgYnJlYWR0aGZpcnN0IGxheW91dC4gVmFsaWQgdmFsdWVzIGFyZTogXCIpLmNvbmNhdChPYmplY3Qua2V5cyhyb3RhdGVEZWdyZWVzKS5qb2luKCcsICcpKSk7XG4gIH1cbiAgdmFyIGdldFBvc2l0aW9uID0gZnVuY3Rpb24gZ2V0UG9zaXRpb24oZWxlKSB7XG4gICAgcmV0dXJuIHJvdGF0ZVBvc0FuZFNrZXdCeUJveChnZXRQb3NpdGlvblRvcEJvdHRvbShlbGUpLCBiYiwgcm90YXRlRGVncmVlc1tvcHRpb25zLmRpcmVjdGlvbl0pO1xuICB9O1xuICBlbGVzLm5vZGVzKCkubGF5b3V0UG9zaXRpb25zKHRoaXMsIG9wdGlvbnMsIGdldFBvc2l0aW9uKTtcbiAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG59O1xuXG52YXIgZGVmYXVsdHMkNiA9IHtcbiAgZml0OiB0cnVlLFxuICAvLyB3aGV0aGVyIHRvIGZpdCB0aGUgdmlld3BvcnQgdG8gdGhlIGdyYXBoXG4gIHBhZGRpbmc6IDMwLFxuICAvLyB0aGUgcGFkZGluZyBvbiBmaXRcbiAgYm91bmRpbmdCb3g6IHVuZGVmaW5lZCxcbiAgLy8gY29uc3RyYWluIGxheW91dCBib3VuZHM7IHsgeDEsIHkxLCB4MiwgeTIgfSBvciB7IHgxLCB5MSwgdywgaCB9XG4gIGF2b2lkT3ZlcmxhcDogdHJ1ZSxcbiAgLy8gcHJldmVudHMgbm9kZSBvdmVybGFwLCBtYXkgb3ZlcmZsb3cgYm91bmRpbmdCb3ggYW5kIHJhZGl1cyBpZiBub3QgZW5vdWdoIHNwYWNlXG4gIG5vZGVEaW1lbnNpb25zSW5jbHVkZUxhYmVsczogZmFsc2UsXG4gIC8vIEV4Y2x1ZGVzIHRoZSBsYWJlbCB3aGVuIGNhbGN1bGF0aW5nIG5vZGUgYm91bmRpbmcgYm94ZXMgZm9yIHRoZSBsYXlvdXQgYWxnb3JpdGhtXG4gIHNwYWNpbmdGYWN0b3I6IHVuZGVmaW5lZCxcbiAgLy8gQXBwbGllcyBhIG11bHRpcGxpY2F0aXZlIGZhY3RvciAoPjApIHRvIGV4cGFuZCBvciBjb21wcmVzcyB0aGUgb3ZlcmFsbCBhcmVhIHRoYXQgdGhlIG5vZGVzIHRha2UgdXBcbiAgcmFkaXVzOiB1bmRlZmluZWQsXG4gIC8vIHRoZSByYWRpdXMgb2YgdGhlIGNpcmNsZVxuICBzdGFydEFuZ2xlOiAzIC8gMiAqIE1hdGguUEksXG4gIC8vIHdoZXJlIG5vZGVzIHN0YXJ0IGluIHJhZGlhbnNcbiAgc3dlZXA6IHVuZGVmaW5lZCxcbiAgLy8gaG93IG1hbnkgcmFkaWFucyBzaG91bGQgYmUgYmV0d2VlbiB0aGUgZmlyc3QgYW5kIGxhc3Qgbm9kZSAoZGVmYXVsdHMgdG8gZnVsbCBjaXJjbGUpXG4gIGNsb2Nrd2lzZTogdHJ1ZSxcbiAgLy8gd2hldGhlciB0aGUgbGF5b3V0IHNob3VsZCBnbyBjbG9ja3dpc2UgKHRydWUpIG9yIGNvdW50ZXJjbG9ja3dpc2UvYW50aWNsb2Nrd2lzZSAoZmFsc2UpXG4gIHNvcnQ6IHVuZGVmaW5lZCxcbiAgLy8gYSBzb3J0aW5nIGZ1bmN0aW9uIHRvIG9yZGVyIHRoZSBub2RlczsgZS5nLiBmdW5jdGlvbihhLCBiKXsgcmV0dXJuIGEuZGF0YSgnd2VpZ2h0JykgLSBiLmRhdGEoJ3dlaWdodCcpIH1cbiAgYW5pbWF0ZTogZmFsc2UsXG4gIC8vIHdoZXRoZXIgdG8gdHJhbnNpdGlvbiB0aGUgbm9kZSBwb3NpdGlvbnNcbiAgYW5pbWF0aW9uRHVyYXRpb246IDUwMCxcbiAgLy8gZHVyYXRpb24gb2YgYW5pbWF0aW9uIGluIG1zIGlmIGVuYWJsZWRcbiAgYW5pbWF0aW9uRWFzaW5nOiB1bmRlZmluZWQsXG4gIC8vIGVhc2luZyBvZiBhbmltYXRpb24gaWYgZW5hYmxlZFxuICBhbmltYXRlRmlsdGVyOiBmdW5jdGlvbiBhbmltYXRlRmlsdGVyKG5vZGUsIGkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgLy8gYSBmdW5jdGlvbiB0aGF0IGRldGVybWluZXMgd2hldGhlciB0aGUgbm9kZSBzaG91bGQgYmUgYW5pbWF0ZWQuICBBbGwgbm9kZXMgYW5pbWF0ZWQgYnkgZGVmYXVsdCBvbiBhbmltYXRlIGVuYWJsZWQuICBOb24tYW5pbWF0ZWQgbm9kZXMgYXJlIHBvc2l0aW9uZWQgaW1tZWRpYXRlbHkgd2hlbiB0aGUgbGF5b3V0IHN0YXJ0c1xuICByZWFkeTogdW5kZWZpbmVkLFxuICAvLyBjYWxsYmFjayBvbiBsYXlvdXRyZWFkeVxuICBzdG9wOiB1bmRlZmluZWQsXG4gIC8vIGNhbGxiYWNrIG9uIGxheW91dHN0b3BcbiAgdHJhbnNmb3JtOiBmdW5jdGlvbiB0cmFuc2Zvcm0obm9kZSwgcG9zaXRpb24pIHtcbiAgICByZXR1cm4gcG9zaXRpb247XG4gIH0gLy8gdHJhbnNmb3JtIGEgZ2l2ZW4gbm9kZSBwb3NpdGlvbi4gVXNlZnVsIGZvciBjaGFuZ2luZyBmbG93IGRpcmVjdGlvbiBpbiBkaXNjcmV0ZSBsYXlvdXRzIFxufTtcbmZ1bmN0aW9uIENpcmNsZUxheW91dChvcHRpb25zKSB7XG4gIHRoaXMub3B0aW9ucyA9IGV4dGVuZCh7fSwgZGVmYXVsdHMkNiwgb3B0aW9ucyk7XG59XG5DaXJjbGVMYXlvdXQucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHBhcmFtcyA9IHRoaXMub3B0aW9ucztcbiAgdmFyIG9wdGlvbnMgPSBwYXJhbXM7XG4gIHZhciBjeSA9IHBhcmFtcy5jeTtcbiAgdmFyIGVsZXMgPSBvcHRpb25zLmVsZXM7XG4gIHZhciBjbG9ja3dpc2UgPSBvcHRpb25zLmNvdW50ZXJjbG9ja3dpc2UgIT09IHVuZGVmaW5lZCA/ICFvcHRpb25zLmNvdW50ZXJjbG9ja3dpc2UgOiBvcHRpb25zLmNsb2Nrd2lzZTtcbiAgdmFyIG5vZGVzID0gZWxlcy5ub2RlcygpLm5vdCgnOnBhcmVudCcpO1xuICBpZiAob3B0aW9ucy5zb3J0KSB7XG4gICAgbm9kZXMgPSBub2Rlcy5zb3J0KG9wdGlvbnMuc29ydCk7XG4gIH1cbiAgdmFyIGJiID0gbWFrZUJvdW5kaW5nQm94KG9wdGlvbnMuYm91bmRpbmdCb3ggPyBvcHRpb25zLmJvdW5kaW5nQm94IDoge1xuICAgIHgxOiAwLFxuICAgIHkxOiAwLFxuICAgIHc6IGN5LndpZHRoKCksXG4gICAgaDogY3kuaGVpZ2h0KClcbiAgfSk7XG4gIHZhciBjZW50ZXIgPSB7XG4gICAgeDogYmIueDEgKyBiYi53IC8gMixcbiAgICB5OiBiYi55MSArIGJiLmggLyAyXG4gIH07XG4gIHZhciBzd2VlcCA9IG9wdGlvbnMuc3dlZXAgPT09IHVuZGVmaW5lZCA/IDIgKiBNYXRoLlBJIC0gMiAqIE1hdGguUEkgLyBub2Rlcy5sZW5ndGggOiBvcHRpb25zLnN3ZWVwO1xuICB2YXIgZFRoZXRhID0gc3dlZXAgLyBNYXRoLm1heCgxLCBub2Rlcy5sZW5ndGggLSAxKTtcbiAgdmFyIHI7XG4gIHZhciBtaW5EaXN0YW5jZSA9IDA7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbiA9IG5vZGVzW2ldO1xuICAgIHZhciBuYmIgPSBuLmxheW91dERpbWVuc2lvbnMob3B0aW9ucyk7XG4gICAgdmFyIHcgPSBuYmIudztcbiAgICB2YXIgaCA9IG5iYi5oO1xuICAgIG1pbkRpc3RhbmNlID0gTWF0aC5tYXgobWluRGlzdGFuY2UsIHcsIGgpO1xuICB9XG4gIGlmIChudW1iZXIkMShvcHRpb25zLnJhZGl1cykpIHtcbiAgICByID0gb3B0aW9ucy5yYWRpdXM7XG4gIH0gZWxzZSBpZiAobm9kZXMubGVuZ3RoIDw9IDEpIHtcbiAgICByID0gMDtcbiAgfSBlbHNlIHtcbiAgICByID0gTWF0aC5taW4oYmIuaCwgYmIudykgLyAyIC0gbWluRGlzdGFuY2U7XG4gIH1cblxuICAvLyBjYWxjdWxhdGUgdGhlIHJhZGl1c1xuICBpZiAobm9kZXMubGVuZ3RoID4gMSAmJiBvcHRpb25zLmF2b2lkT3ZlcmxhcCkge1xuICAgIC8vIGJ1dCBvbmx5IGlmIG1vcmUgdGhhbiBvbmUgbm9kZSAoY2FuJ3Qgb3ZlcmxhcClcbiAgICBtaW5EaXN0YW5jZSAqPSAxLjc1OyAvLyBqdXN0IHRvIGhhdmUgc29tZSBuaWNlIHNwYWNpbmdcblxuICAgIHZhciBkY29zID0gTWF0aC5jb3MoZFRoZXRhKSAtIE1hdGguY29zKDApO1xuICAgIHZhciBkc2luID0gTWF0aC5zaW4oZFRoZXRhKSAtIE1hdGguc2luKDApO1xuICAgIHZhciByTWluID0gTWF0aC5zcXJ0KG1pbkRpc3RhbmNlICogbWluRGlzdGFuY2UgLyAoZGNvcyAqIGRjb3MgKyBkc2luICogZHNpbikpOyAvLyBzLnQuIG5vIG5vZGVzIG92ZXJsYXBwaW5nXG4gICAgciA9IE1hdGgubWF4KHJNaW4sIHIpO1xuICB9XG4gIHZhciBnZXRQb3MgPSBmdW5jdGlvbiBnZXRQb3MoZWxlLCBpKSB7XG4gICAgdmFyIHRoZXRhID0gb3B0aW9ucy5zdGFydEFuZ2xlICsgaSAqIGRUaGV0YSAqIChjbG9ja3dpc2UgPyAxIDogLTEpO1xuICAgIHZhciByeCA9IHIgKiBNYXRoLmNvcyh0aGV0YSk7XG4gICAgdmFyIHJ5ID0gciAqIE1hdGguc2luKHRoZXRhKTtcbiAgICB2YXIgcG9zID0ge1xuICAgICAgeDogY2VudGVyLnggKyByeCxcbiAgICAgIHk6IGNlbnRlci55ICsgcnlcbiAgICB9O1xuICAgIHJldHVybiBwb3M7XG4gIH07XG4gIGVsZXMubm9kZXMoKS5sYXlvdXRQb3NpdGlvbnModGhpcywgb3B0aW9ucywgZ2V0UG9zKTtcbiAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG59O1xuXG52YXIgZGVmYXVsdHMkNSA9IHtcbiAgZml0OiB0cnVlLFxuICAvLyB3aGV0aGVyIHRvIGZpdCB0aGUgdmlld3BvcnQgdG8gdGhlIGdyYXBoXG4gIHBhZGRpbmc6IDMwLFxuICAvLyB0aGUgcGFkZGluZyBvbiBmaXRcbiAgc3RhcnRBbmdsZTogMyAvIDIgKiBNYXRoLlBJLFxuICAvLyB3aGVyZSBub2RlcyBzdGFydCBpbiByYWRpYW5zXG4gIHN3ZWVwOiB1bmRlZmluZWQsXG4gIC8vIGhvdyBtYW55IHJhZGlhbnMgc2hvdWxkIGJlIGJldHdlZW4gdGhlIGZpcnN0IGFuZCBsYXN0IG5vZGUgKGRlZmF1bHRzIHRvIGZ1bGwgY2lyY2xlKVxuICBjbG9ja3dpc2U6IHRydWUsXG4gIC8vIHdoZXRoZXIgdGhlIGxheW91dCBzaG91bGQgZ28gY2xvY2t3aXNlICh0cnVlKSBvciBjb3VudGVyY2xvY2t3aXNlL2FudGljbG9ja3dpc2UgKGZhbHNlKVxuICBlcXVpZGlzdGFudDogZmFsc2UsXG4gIC8vIHdoZXRoZXIgbGV2ZWxzIGhhdmUgYW4gZXF1YWwgcmFkaWFsIGRpc3RhbmNlIGJldHdlbiB0aGVtLCBtYXkgY2F1c2UgYm91bmRpbmcgYm94IG92ZXJmbG93XG4gIG1pbk5vZGVTcGFjaW5nOiAxMCxcbiAgLy8gbWluIHNwYWNpbmcgYmV0d2VlbiBvdXRzaWRlIG9mIG5vZGVzICh1c2VkIGZvciByYWRpdXMgYWRqdXN0bWVudClcbiAgYm91bmRpbmdCb3g6IHVuZGVmaW5lZCxcbiAgLy8gY29uc3RyYWluIGxheW91dCBib3VuZHM7IHsgeDEsIHkxLCB4MiwgeTIgfSBvciB7IHgxLCB5MSwgdywgaCB9XG4gIGF2b2lkT3ZlcmxhcDogdHJ1ZSxcbiAgLy8gcHJldmVudHMgbm9kZSBvdmVybGFwLCBtYXkgb3ZlcmZsb3cgYm91bmRpbmdCb3ggaWYgbm90IGVub3VnaCBzcGFjZVxuICBub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHM6IGZhbHNlLFxuICAvLyBFeGNsdWRlcyB0aGUgbGFiZWwgd2hlbiBjYWxjdWxhdGluZyBub2RlIGJvdW5kaW5nIGJveGVzIGZvciB0aGUgbGF5b3V0IGFsZ29yaXRobVxuICBoZWlnaHQ6IHVuZGVmaW5lZCxcbiAgLy8gaGVpZ2h0IG9mIGxheW91dCBhcmVhIChvdmVycmlkZXMgY29udGFpbmVyIGhlaWdodClcbiAgd2lkdGg6IHVuZGVmaW5lZCxcbiAgLy8gd2lkdGggb2YgbGF5b3V0IGFyZWEgKG92ZXJyaWRlcyBjb250YWluZXIgd2lkdGgpXG4gIHNwYWNpbmdGYWN0b3I6IHVuZGVmaW5lZCxcbiAgLy8gQXBwbGllcyBhIG11bHRpcGxpY2F0aXZlIGZhY3RvciAoPjApIHRvIGV4cGFuZCBvciBjb21wcmVzcyB0aGUgb3ZlcmFsbCBhcmVhIHRoYXQgdGhlIG5vZGVzIHRha2UgdXBcbiAgY29uY2VudHJpYzogZnVuY3Rpb24gY29uY2VudHJpYyhub2RlKSB7XG4gICAgLy8gcmV0dXJucyBudW1lcmljIHZhbHVlIGZvciBlYWNoIG5vZGUsIHBsYWNpbmcgaGlnaGVyIG5vZGVzIGluIGxldmVscyB0b3dhcmRzIHRoZSBjZW50cmVcbiAgICByZXR1cm4gbm9kZS5kZWdyZWUoKTtcbiAgfSxcbiAgbGV2ZWxXaWR0aDogZnVuY3Rpb24gbGV2ZWxXaWR0aChub2Rlcykge1xuICAgIC8vIHRoZSB2YXJpYXRpb24gb2YgY29uY2VudHJpYyB2YWx1ZXMgaW4gZWFjaCBsZXZlbFxuICAgIHJldHVybiBub2Rlcy5tYXhEZWdyZWUoKSAvIDQ7XG4gIH0sXG4gIGFuaW1hdGU6IGZhbHNlLFxuICAvLyB3aGV0aGVyIHRvIHRyYW5zaXRpb24gdGhlIG5vZGUgcG9zaXRpb25zXG4gIGFuaW1hdGlvbkR1cmF0aW9uOiA1MDAsXG4gIC8vIGR1cmF0aW9uIG9mIGFuaW1hdGlvbiBpbiBtcyBpZiBlbmFibGVkXG4gIGFuaW1hdGlvbkVhc2luZzogdW5kZWZpbmVkLFxuICAvLyBlYXNpbmcgb2YgYW5pbWF0aW9uIGlmIGVuYWJsZWRcbiAgYW5pbWF0ZUZpbHRlcjogZnVuY3Rpb24gYW5pbWF0ZUZpbHRlcihub2RlLCBpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIC8vIGEgZnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIG5vZGUgc2hvdWxkIGJlIGFuaW1hdGVkLiAgQWxsIG5vZGVzIGFuaW1hdGVkIGJ5IGRlZmF1bHQgb24gYW5pbWF0ZSBlbmFibGVkLiAgTm9uLWFuaW1hdGVkIG5vZGVzIGFyZSBwb3NpdGlvbmVkIGltbWVkaWF0ZWx5IHdoZW4gdGhlIGxheW91dCBzdGFydHNcbiAgcmVhZHk6IHVuZGVmaW5lZCxcbiAgLy8gY2FsbGJhY2sgb24gbGF5b3V0cmVhZHlcbiAgc3RvcDogdW5kZWZpbmVkLFxuICAvLyBjYWxsYmFjayBvbiBsYXlvdXRzdG9wXG4gIHRyYW5zZm9ybTogZnVuY3Rpb24gdHJhbnNmb3JtKG5vZGUsIHBvc2l0aW9uKSB7XG4gICAgcmV0dXJuIHBvc2l0aW9uO1xuICB9IC8vIHRyYW5zZm9ybSBhIGdpdmVuIG5vZGUgcG9zaXRpb24uIFVzZWZ1bCBmb3IgY2hhbmdpbmcgZmxvdyBkaXJlY3Rpb24gaW4gZGlzY3JldGUgbGF5b3V0c1xufTtcbmZ1bmN0aW9uIENvbmNlbnRyaWNMYXlvdXQob3B0aW9ucykge1xuICB0aGlzLm9wdGlvbnMgPSBleHRlbmQoe30sIGRlZmF1bHRzJDUsIG9wdGlvbnMpO1xufVxuQ29uY2VudHJpY0xheW91dC5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICB2YXIgcGFyYW1zID0gdGhpcy5vcHRpb25zO1xuICB2YXIgb3B0aW9ucyA9IHBhcmFtcztcbiAgdmFyIGNsb2Nrd2lzZSA9IG9wdGlvbnMuY291bnRlcmNsb2Nrd2lzZSAhPT0gdW5kZWZpbmVkID8gIW9wdGlvbnMuY291bnRlcmNsb2Nrd2lzZSA6IG9wdGlvbnMuY2xvY2t3aXNlO1xuICB2YXIgY3kgPSBwYXJhbXMuY3k7XG4gIHZhciBlbGVzID0gb3B0aW9ucy5lbGVzO1xuICB2YXIgbm9kZXMgPSBlbGVzLm5vZGVzKCkubm90KCc6cGFyZW50Jyk7XG4gIHZhciBiYiA9IG1ha2VCb3VuZGluZ0JveChvcHRpb25zLmJvdW5kaW5nQm94ID8gb3B0aW9ucy5ib3VuZGluZ0JveCA6IHtcbiAgICB4MTogMCxcbiAgICB5MTogMCxcbiAgICB3OiBjeS53aWR0aCgpLFxuICAgIGg6IGN5LmhlaWdodCgpXG4gIH0pO1xuICB2YXIgY2VudGVyID0ge1xuICAgIHg6IGJiLngxICsgYmIudyAvIDIsXG4gICAgeTogYmIueTEgKyBiYi5oIC8gMlxuICB9O1xuICB2YXIgbm9kZVZhbHVlcyA9IFtdOyAvLyB7IG5vZGUsIHZhbHVlIH1cbiAgdmFyIG1heE5vZGVTaXplID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBub2RlID0gbm9kZXNbaV07XG4gICAgdmFyIHZhbHVlID0gdm9pZCAwO1xuXG4gICAgLy8gY2FsY3VsYXRlIHRoZSBub2RlIHZhbHVlXG4gICAgdmFsdWUgPSBvcHRpb25zLmNvbmNlbnRyaWMobm9kZSk7XG4gICAgbm9kZVZhbHVlcy5wdXNoKHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIG5vZGU6IG5vZGVcbiAgICB9KTtcblxuICAgIC8vIGZvciBzdHlsZSBtYXBwaW5nXG4gICAgbm9kZS5fcHJpdmF0ZS5zY3JhdGNoLmNvbmNlbnRyaWMgPSB2YWx1ZTtcbiAgfVxuXG4gIC8vIGluIGNhc2Ugd2UgdXNlZCB0aGUgYGNvbmNlbnRyaWNgIGluIHN0eWxlXG4gIG5vZGVzLnVwZGF0ZVN0eWxlKCk7XG5cbiAgLy8gY2FsY3VsYXRlIG1heCBzaXplIG5vdyBiYXNlZCBvbiBwb3RlbnRpYWxseSB1cGRhdGVkIG1hcHBlcnNcbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IG5vZGVzLmxlbmd0aDsgX2krKykge1xuICAgIHZhciBfbm9kZSA9IG5vZGVzW19pXTtcbiAgICB2YXIgbmJiID0gX25vZGUubGF5b3V0RGltZW5zaW9ucyhvcHRpb25zKTtcbiAgICBtYXhOb2RlU2l6ZSA9IE1hdGgubWF4KG1heE5vZGVTaXplLCBuYmIudywgbmJiLmgpO1xuICB9XG5cbiAgLy8gc29ydCBub2RlIHZhbHVlcyBpbiBkZXNjcmVhc2luZyBvcmRlclxuICBub2RlVmFsdWVzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gYi52YWx1ZSAtIGEudmFsdWU7XG4gIH0pO1xuICB2YXIgbGV2ZWxXaWR0aCA9IG9wdGlvbnMubGV2ZWxXaWR0aChub2Rlcyk7XG5cbiAgLy8gcHV0IHRoZSB2YWx1ZXMgaW50byBsZXZlbHNcbiAgdmFyIGxldmVscyA9IFtbXV07XG4gIHZhciBjdXJyZW50TGV2ZWwgPSBsZXZlbHNbMF07XG4gIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IG5vZGVWYWx1ZXMubGVuZ3RoOyBfaTIrKykge1xuICAgIHZhciB2YWwgPSBub2RlVmFsdWVzW19pMl07XG4gICAgaWYgKGN1cnJlbnRMZXZlbC5sZW5ndGggPiAwKSB7XG4gICAgICB2YXIgZGlmZiA9IE1hdGguYWJzKGN1cnJlbnRMZXZlbFswXS52YWx1ZSAtIHZhbC52YWx1ZSk7XG4gICAgICBpZiAoZGlmZiA+PSBsZXZlbFdpZHRoKSB7XG4gICAgICAgIGN1cnJlbnRMZXZlbCA9IFtdO1xuICAgICAgICBsZXZlbHMucHVzaChjdXJyZW50TGV2ZWwpO1xuICAgICAgfVxuICAgIH1cbiAgICBjdXJyZW50TGV2ZWwucHVzaCh2YWwpO1xuICB9XG5cbiAgLy8gY3JlYXRlIHBvc2l0aW9ucyBmcm9tIGxldmVsc1xuXG4gIHZhciBtaW5EaXN0ID0gbWF4Tm9kZVNpemUgKyBvcHRpb25zLm1pbk5vZGVTcGFjaW5nOyAvLyBtaW4gZGlzdCBiZXR3ZWVuIG5vZGVzXG5cbiAgaWYgKCFvcHRpb25zLmF2b2lkT3ZlcmxhcCkge1xuICAgIC8vIHRoZW4gc3RyaWN0bHkgY29uc3RyYWluIHRvIGJiXG4gICAgdmFyIGZpcnN0THZsSGFzTXVsdGkgPSBsZXZlbHMubGVuZ3RoID4gMCAmJiBsZXZlbHNbMF0ubGVuZ3RoID4gMTtcbiAgICB2YXIgbWF4UiA9IE1hdGgubWluKGJiLncsIGJiLmgpIC8gMiAtIG1pbkRpc3Q7XG4gICAgdmFyIHJTdGVwID0gbWF4UiAvIChsZXZlbHMubGVuZ3RoICsgZmlyc3RMdmxIYXNNdWx0aSA/IDEgOiAwKTtcbiAgICBtaW5EaXN0ID0gTWF0aC5taW4obWluRGlzdCwgclN0ZXApO1xuICB9XG5cbiAgLy8gZmluZCB0aGUgbWV0cmljcyBmb3IgZWFjaCBsZXZlbFxuICB2YXIgciA9IDA7XG4gIGZvciAodmFyIF9pMyA9IDA7IF9pMyA8IGxldmVscy5sZW5ndGg7IF9pMysrKSB7XG4gICAgdmFyIGxldmVsID0gbGV2ZWxzW19pM107XG4gICAgdmFyIHN3ZWVwID0gb3B0aW9ucy5zd2VlcCA9PT0gdW5kZWZpbmVkID8gMiAqIE1hdGguUEkgLSAyICogTWF0aC5QSSAvIGxldmVsLmxlbmd0aCA6IG9wdGlvbnMuc3dlZXA7XG4gICAgdmFyIGRUaGV0YSA9IGxldmVsLmRUaGV0YSA9IHN3ZWVwIC8gTWF0aC5tYXgoMSwgbGV2ZWwubGVuZ3RoIC0gMSk7XG5cbiAgICAvLyBjYWxjdWxhdGUgdGhlIHJhZGl1c1xuICAgIGlmIChsZXZlbC5sZW5ndGggPiAxICYmIG9wdGlvbnMuYXZvaWRPdmVybGFwKSB7XG4gICAgICAvLyBidXQgb25seSBpZiBtb3JlIHRoYW4gb25lIG5vZGUgKGNhbid0IG92ZXJsYXApXG4gICAgICB2YXIgZGNvcyA9IE1hdGguY29zKGRUaGV0YSkgLSBNYXRoLmNvcygwKTtcbiAgICAgIHZhciBkc2luID0gTWF0aC5zaW4oZFRoZXRhKSAtIE1hdGguc2luKDApO1xuICAgICAgdmFyIHJNaW4gPSBNYXRoLnNxcnQobWluRGlzdCAqIG1pbkRpc3QgLyAoZGNvcyAqIGRjb3MgKyBkc2luICogZHNpbikpOyAvLyBzLnQuIG5vIG5vZGVzIG92ZXJsYXBwaW5nXG5cbiAgICAgIHIgPSBNYXRoLm1heChyTWluLCByKTtcbiAgICB9XG4gICAgbGV2ZWwuciA9IHI7XG4gICAgciArPSBtaW5EaXN0O1xuICB9XG4gIGlmIChvcHRpb25zLmVxdWlkaXN0YW50KSB7XG4gICAgdmFyIHJEZWx0YU1heCA9IDA7XG4gICAgdmFyIF9yID0gMDtcbiAgICBmb3IgKHZhciBfaTQgPSAwOyBfaTQgPCBsZXZlbHMubGVuZ3RoOyBfaTQrKykge1xuICAgICAgdmFyIF9sZXZlbCA9IGxldmVsc1tfaTRdO1xuICAgICAgdmFyIHJEZWx0YSA9IF9sZXZlbC5yIC0gX3I7XG4gICAgICByRGVsdGFNYXggPSBNYXRoLm1heChyRGVsdGFNYXgsIHJEZWx0YSk7XG4gICAgfVxuICAgIF9yID0gMDtcbiAgICBmb3IgKHZhciBfaTUgPSAwOyBfaTUgPCBsZXZlbHMubGVuZ3RoOyBfaTUrKykge1xuICAgICAgdmFyIF9sZXZlbDIgPSBsZXZlbHNbX2k1XTtcbiAgICAgIGlmIChfaTUgPT09IDApIHtcbiAgICAgICAgX3IgPSBfbGV2ZWwyLnI7XG4gICAgICB9XG4gICAgICBfbGV2ZWwyLnIgPSBfcjtcbiAgICAgIF9yICs9IHJEZWx0YU1heDtcbiAgICB9XG4gIH1cblxuICAvLyBjYWxjdWxhdGUgdGhlIG5vZGUgcG9zaXRpb25zXG4gIHZhciBwb3MgPSB7fTsgLy8gaWQgPT4gcG9zaXRpb25cbiAgZm9yICh2YXIgX2k2ID0gMDsgX2k2IDwgbGV2ZWxzLmxlbmd0aDsgX2k2KyspIHtcbiAgICB2YXIgX2xldmVsMyA9IGxldmVsc1tfaTZdO1xuICAgIHZhciBfZFRoZXRhID0gX2xldmVsMy5kVGhldGE7XG4gICAgdmFyIF9yMiA9IF9sZXZlbDMucjtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IF9sZXZlbDMubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBfdmFsID0gX2xldmVsM1tqXTtcbiAgICAgIHZhciB0aGV0YSA9IG9wdGlvbnMuc3RhcnRBbmdsZSArIChjbG9ja3dpc2UgPyAxIDogLTEpICogX2RUaGV0YSAqIGo7XG4gICAgICB2YXIgcCA9IHtcbiAgICAgICAgeDogY2VudGVyLnggKyBfcjIgKiBNYXRoLmNvcyh0aGV0YSksXG4gICAgICAgIHk6IGNlbnRlci55ICsgX3IyICogTWF0aC5zaW4odGhldGEpXG4gICAgICB9O1xuICAgICAgcG9zW192YWwubm9kZS5pZCgpXSA9IHA7XG4gICAgfVxuICB9XG5cbiAgLy8gcG9zaXRpb24gdGhlIG5vZGVzXG4gIGVsZXMubm9kZXMoKS5sYXlvdXRQb3NpdGlvbnModGhpcywgb3B0aW9ucywgZnVuY3Rpb24gKGVsZSkge1xuICAgIHZhciBpZCA9IGVsZS5pZCgpO1xuICAgIHJldHVybiBwb3NbaWRdO1xuICB9KTtcbiAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG59O1xuXG4vKlxuVGhlIENvU0UgbGF5b3V0IHdhcyB3cml0dGVuIGJ5IEdlcmFyZG8gSHVjay5cbmh0dHBzOi8vd3d3LmxpbmtlZGluLmNvbS9pbi9nZXJhcmRvaHVjay9cblxuQmFzZWQgb24gdGhlIGZvbGxvd2luZyBhcnRpY2xlOlxuaHR0cDovL2RsLmFjbS5vcmcvY2l0YXRpb24uY2ZtP2lkPTE0OTgwNDdcblxuTW9kaWZpY2F0aW9ucyB0cmFja2VkIG9uIEdpdGh1Yi5cbiovXG5cbnZhciBERUJVRztcblxuLyoqXG4gKiBAYnJpZWYgOiAgZGVmYXVsdCBsYXlvdXQgb3B0aW9uc1xuICovXG52YXIgZGVmYXVsdHMkNCA9IHtcbiAgLy8gQ2FsbGVkIG9uIGBsYXlvdXRyZWFkeWBcbiAgcmVhZHk6IGZ1bmN0aW9uIHJlYWR5KCkge30sXG4gIC8vIENhbGxlZCBvbiBgbGF5b3V0c3RvcGBcbiAgc3RvcDogZnVuY3Rpb24gc3RvcCgpIHt9LFxuICAvLyBXaGV0aGVyIHRvIGFuaW1hdGUgd2hpbGUgcnVubmluZyB0aGUgbGF5b3V0XG4gIC8vIHRydWUgOiBBbmltYXRlIGNvbnRpbnVvdXNseSBhcyB0aGUgbGF5b3V0IGlzIHJ1bm5pbmdcbiAgLy8gZmFsc2UgOiBKdXN0IHNob3cgdGhlIGVuZCByZXN1bHRcbiAgLy8gJ2VuZCcgOiBBbmltYXRlIHdpdGggdGhlIGVuZCByZXN1bHQsIGZyb20gdGhlIGluaXRpYWwgcG9zaXRpb25zIHRvIHRoZSBlbmQgcG9zaXRpb25zXG4gIGFuaW1hdGU6IHRydWUsXG4gIC8vIEVhc2luZyBvZiB0aGUgYW5pbWF0aW9uIGZvciBhbmltYXRlOidlbmQnXG4gIGFuaW1hdGlvbkVhc2luZzogdW5kZWZpbmVkLFxuICAvLyBUaGUgZHVyYXRpb24gb2YgdGhlIGFuaW1hdGlvbiBmb3IgYW5pbWF0ZTonZW5kJ1xuICBhbmltYXRpb25EdXJhdGlvbjogdW5kZWZpbmVkLFxuICAvLyBBIGZ1bmN0aW9uIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBub2RlIHNob3VsZCBiZSBhbmltYXRlZFxuICAvLyBBbGwgbm9kZXMgYW5pbWF0ZWQgYnkgZGVmYXVsdCBvbiBhbmltYXRlIGVuYWJsZWRcbiAgLy8gTm9uLWFuaW1hdGVkIG5vZGVzIGFyZSBwb3NpdGlvbmVkIGltbWVkaWF0ZWx5IHdoZW4gdGhlIGxheW91dCBzdGFydHNcbiAgYW5pbWF0ZUZpbHRlcjogZnVuY3Rpb24gYW5pbWF0ZUZpbHRlcihub2RlLCBpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIC8vIFRoZSBsYXlvdXQgYW5pbWF0ZXMgb25seSBhZnRlciB0aGlzIG1hbnkgbWlsbGlzZWNvbmRzIGZvciBhbmltYXRlOnRydWVcbiAgLy8gKHByZXZlbnRzIGZsYXNoaW5nIG9uIGZhc3QgcnVucylcbiAgYW5pbWF0aW9uVGhyZXNob2xkOiAyNTAsXG4gIC8vIE51bWJlciBvZiBpdGVyYXRpb25zIGJldHdlZW4gY29uc2VjdXRpdmUgc2NyZWVuIHBvc2l0aW9ucyB1cGRhdGVcbiAgcmVmcmVzaDogMjAsXG4gIC8vIFdoZXRoZXIgdG8gZml0IHRoZSBuZXR3b3JrIHZpZXcgYWZ0ZXIgd2hlbiBkb25lXG4gIGZpdDogdHJ1ZSxcbiAgLy8gUGFkZGluZyBvbiBmaXRcbiAgcGFkZGluZzogMzAsXG4gIC8vIENvbnN0cmFpbiBsYXlvdXQgYm91bmRzOyB7IHgxLCB5MSwgeDIsIHkyIH0gb3IgeyB4MSwgeTEsIHcsIGggfVxuICBib3VuZGluZ0JveDogdW5kZWZpbmVkLFxuICAvLyBFeGNsdWRlcyB0aGUgbGFiZWwgd2hlbiBjYWxjdWxhdGluZyBub2RlIGJvdW5kaW5nIGJveGVzIGZvciB0aGUgbGF5b3V0IGFsZ29yaXRobVxuICBub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHM6IGZhbHNlLFxuICAvLyBSYW5kb21pemUgdGhlIGluaXRpYWwgcG9zaXRpb25zIG9mIHRoZSBub2RlcyAodHJ1ZSkgb3IgdXNlIGV4aXN0aW5nIHBvc2l0aW9ucyAoZmFsc2UpXG4gIHJhbmRvbWl6ZTogZmFsc2UsXG4gIC8vIEV4dHJhIHNwYWNpbmcgYmV0d2VlbiBjb21wb25lbnRzIGluIG5vbi1jb21wb3VuZCBncmFwaHNcbiAgY29tcG9uZW50U3BhY2luZzogNDAsXG4gIC8vIE5vZGUgcmVwdWxzaW9uIChub24gb3ZlcmxhcHBpbmcpIG11bHRpcGxpZXJcbiAgbm9kZVJlcHVsc2lvbjogZnVuY3Rpb24gbm9kZVJlcHVsc2lvbihub2RlKSB7XG4gICAgcmV0dXJuIDIwNDg7XG4gIH0sXG4gIC8vIE5vZGUgcmVwdWxzaW9uIChvdmVybGFwcGluZykgbXVsdGlwbGllclxuICBub2RlT3ZlcmxhcDogNCxcbiAgLy8gSWRlYWwgZWRnZSAobm9uIG5lc3RlZCkgbGVuZ3RoXG4gIGlkZWFsRWRnZUxlbmd0aDogZnVuY3Rpb24gaWRlYWxFZGdlTGVuZ3RoKGVkZ2UpIHtcbiAgICByZXR1cm4gMzI7XG4gIH0sXG4gIC8vIERpdmlzb3IgdG8gY29tcHV0ZSBlZGdlIGZvcmNlc1xuICBlZGdlRWxhc3RpY2l0eTogZnVuY3Rpb24gZWRnZUVsYXN0aWNpdHkoZWRnZSkge1xuICAgIHJldHVybiAzMjtcbiAgfSxcbiAgLy8gTmVzdGluZyBmYWN0b3IgKG11bHRpcGxpZXIpIHRvIGNvbXB1dGUgaWRlYWwgZWRnZSBsZW5ndGggZm9yIG5lc3RlZCBlZGdlc1xuICBuZXN0aW5nRmFjdG9yOiAxLjIsXG4gIC8vIEdyYXZpdHkgZm9yY2UgKGNvbnN0YW50KVxuICBncmF2aXR5OiAxLFxuICAvLyBNYXhpbXVtIG51bWJlciBvZiBpdGVyYXRpb25zIHRvIHBlcmZvcm1cbiAgbnVtSXRlcjogMTAwMCxcbiAgLy8gSW5pdGlhbCB0ZW1wZXJhdHVyZSAobWF4aW11bSBub2RlIGRpc3BsYWNlbWVudClcbiAgaW5pdGlhbFRlbXA6IDEwMDAsXG4gIC8vIENvb2xpbmcgZmFjdG9yIChob3cgdGhlIHRlbXBlcmF0dXJlIGlzIHJlZHVjZWQgYmV0d2VlbiBjb25zZWN1dGl2ZSBpdGVyYXRpb25zXG4gIGNvb2xpbmdGYWN0b3I6IDAuOTksXG4gIC8vIExvd2VyIHRlbXBlcmF0dXJlIHRocmVzaG9sZCAoYmVsb3cgdGhpcyBwb2ludCB0aGUgbGF5b3V0IHdpbGwgZW5kKVxuICBtaW5UZW1wOiAxLjBcbn07XG5cbi8qKlxuICogQGJyaWVmICAgICAgIDogY29uc3RydWN0b3JcbiAqIEBhcmcgb3B0aW9ucyA6IG9iamVjdCBjb250YWluaW5nIGxheW91dCBvcHRpb25zXG4gKi9cbmZ1bmN0aW9uIENvc2VMYXlvdXQob3B0aW9ucykge1xuICB0aGlzLm9wdGlvbnMgPSBleHRlbmQoe30sIGRlZmF1bHRzJDQsIG9wdGlvbnMpO1xuICB0aGlzLm9wdGlvbnMubGF5b3V0ID0gdGhpcztcblxuICAvLyBFeGNsdWRlIGFueSBlZGdlIHRoYXQgaGFzIGEgc291cmNlIG9yIHRhcmdldCBub2RlIHRoYXQgaXMgbm90IGluIHRoZSBzZXQgb2YgcGFzc2VkLWluIG5vZGVzXG4gIHZhciBub2RlcyA9IHRoaXMub3B0aW9ucy5lbGVzLm5vZGVzKCk7XG4gIHZhciBlZGdlcyA9IHRoaXMub3B0aW9ucy5lbGVzLmVkZ2VzKCk7XG4gIHZhciBub3RFZGdlcyA9IGVkZ2VzLmZpbHRlcihmdW5jdGlvbiAoZSkge1xuICAgIHZhciBzb3VyY2VJZCA9IGUuc291cmNlKCkuZGF0YSgnaWQnKTtcbiAgICB2YXIgdGFyZ2V0SWQgPSBlLnRhcmdldCgpLmRhdGEoJ2lkJyk7XG4gICAgdmFyIGhhc1NvdXJjZSA9IG5vZGVzLnNvbWUoZnVuY3Rpb24gKG4pIHtcbiAgICAgIHJldHVybiBuLmRhdGEoJ2lkJykgPT09IHNvdXJjZUlkO1xuICAgIH0pO1xuICAgIHZhciBoYXNUYXJnZXQgPSBub2Rlcy5zb21lKGZ1bmN0aW9uIChuKSB7XG4gICAgICByZXR1cm4gbi5kYXRhKCdpZCcpID09PSB0YXJnZXRJZDtcbiAgICB9KTtcbiAgICByZXR1cm4gIWhhc1NvdXJjZSB8fCAhaGFzVGFyZ2V0O1xuICB9KTtcbiAgdGhpcy5vcHRpb25zLmVsZXMgPSB0aGlzLm9wdGlvbnMuZWxlcy5ub3Qobm90RWRnZXMpO1xufVxuXG4vKipcbiAqIEBicmllZiA6IHJ1bnMgdGhlIGxheW91dFxuICovXG5Db3NlTGF5b3V0LnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICB2YXIgY3kgPSBvcHRpb25zLmN5O1xuICB2YXIgbGF5b3V0ID0gdGhpcztcbiAgbGF5b3V0LnN0b3BwZWQgPSBmYWxzZTtcbiAgaWYgKG9wdGlvbnMuYW5pbWF0ZSA9PT0gdHJ1ZSB8fCBvcHRpb25zLmFuaW1hdGUgPT09IGZhbHNlKSB7XG4gICAgbGF5b3V0LmVtaXQoe1xuICAgICAgdHlwZTogJ2xheW91dHN0YXJ0JyxcbiAgICAgIGxheW91dDogbGF5b3V0XG4gICAgfSk7XG4gIH1cblxuICAvLyBTZXQgREVCVUcgLSBHbG9iYWwgdmFyaWFibGVcbiAgaWYgKHRydWUgPT09IG9wdGlvbnMuZGVidWcpIHtcbiAgICBERUJVRyA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgREVCVUcgPSBmYWxzZTtcbiAgfVxuXG4gIC8vIEluaXRpYWxpemUgbGF5b3V0IGluZm9cbiAgdmFyIGxheW91dEluZm8gPSBjcmVhdGVMYXlvdXRJbmZvKGN5LCBsYXlvdXQsIG9wdGlvbnMpO1xuXG4gIC8vIFNob3cgTGF5b3V0SW5mbyBjb250ZW50cyBpZiBkZWJ1Z2dpbmdcbiAgaWYgKERFQlVHKSB7XG4gICAgcHJpbnRMYXlvdXRJbmZvKGxheW91dEluZm8pO1xuICB9XG5cbiAgLy8gSWYgcmVxdWlyZWQsIHJhbmRvbWl6ZSBub2RlIHBvc2l0aW9uc1xuICBpZiAob3B0aW9ucy5yYW5kb21pemUpIHtcbiAgICByYW5kb21pemVQb3NpdGlvbnMobGF5b3V0SW5mbyk7XG4gIH1cbiAgdmFyIHN0YXJ0VGltZSA9IHBlcmZvcm1hbmNlTm93KCk7XG4gIHZhciByZWZyZXNoID0gZnVuY3Rpb24gcmVmcmVzaCgpIHtcbiAgICByZWZyZXNoUG9zaXRpb25zKGxheW91dEluZm8sIGN5LCBvcHRpb25zKTtcblxuICAgIC8vIEZpdCB0aGUgZ3JhcGggaWYgbmVjZXNzYXJ5XG4gICAgaWYgKHRydWUgPT09IG9wdGlvbnMuZml0KSB7XG4gICAgICBjeS5maXQob3B0aW9ucy5wYWRkaW5nKTtcbiAgICB9XG4gIH07XG4gIHZhciBtYWluTG9vcCA9IGZ1bmN0aW9uIG1haW5Mb29wKGkpIHtcbiAgICBpZiAobGF5b3V0LnN0b3BwZWQgfHwgaSA+PSBvcHRpb25zLm51bUl0ZXIpIHtcbiAgICAgIC8vIGxvZ0RlYnVnKFwiTGF5b3V0IG1hbnVhbGx5IHN0b3BwZWQuIFN0b3BwaW5nIGNvbXB1dGF0aW9uIGluIHN0ZXAgXCIgKyBpKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBEbyBvbmUgc3RlcCBpbiB0aGUgcGhpc2ljYWwgc2ltdWxhdGlvblxuICAgIHN0ZXAobGF5b3V0SW5mbywgb3B0aW9ucyk7XG5cbiAgICAvLyBVcGRhdGUgdGVtcGVyYXR1cmVcbiAgICBsYXlvdXRJbmZvLnRlbXBlcmF0dXJlID0gbGF5b3V0SW5mby50ZW1wZXJhdHVyZSAqIG9wdGlvbnMuY29vbGluZ0ZhY3RvcjtcbiAgICAvLyBsb2dEZWJ1ZyhcIk5ldyB0ZW1wZXJhdHVyZTogXCIgKyBsYXlvdXRJbmZvLnRlbXBlcmF0dXJlKTtcblxuICAgIGlmIChsYXlvdXRJbmZvLnRlbXBlcmF0dXJlIDwgb3B0aW9ucy5taW5UZW1wKSB7XG4gICAgICAvLyBsb2dEZWJ1ZyhcIlRlbXBlcmF0dXJlIGRyb3AgYmVsb3cgbWluaW11bSB0aHJlc2hvbGQuIFN0b3BwaW5nIGNvbXB1dGF0aW9uIGluIHN0ZXAgXCIgKyBpKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG4gIHZhciBkb25lID0gZnVuY3Rpb24gZG9uZSgpIHtcbiAgICBpZiAob3B0aW9ucy5hbmltYXRlID09PSB0cnVlIHx8IG9wdGlvbnMuYW5pbWF0ZSA9PT0gZmFsc2UpIHtcbiAgICAgIHJlZnJlc2goKTtcblxuICAgICAgLy8gTGF5b3V0IGhhcyBmaW5pc2hlZFxuICAgICAgbGF5b3V0Lm9uZSgnbGF5b3V0c3RvcCcsIG9wdGlvbnMuc3RvcCk7XG4gICAgICBsYXlvdXQuZW1pdCh7XG4gICAgICAgIHR5cGU6ICdsYXlvdXRzdG9wJyxcbiAgICAgICAgbGF5b3V0OiBsYXlvdXRcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbm9kZXMgPSBvcHRpb25zLmVsZXMubm9kZXMoKTtcbiAgICAgIHZhciBnZXRTY2FsZWRQb3MgPSBnZXRTY2FsZUluQm91bmRzRm4obGF5b3V0SW5mbywgb3B0aW9ucywgbm9kZXMpO1xuICAgICAgbm9kZXMubGF5b3V0UG9zaXRpb25zKGxheW91dCwgb3B0aW9ucywgZ2V0U2NhbGVkUG9zKTtcbiAgICB9XG4gIH07XG4gIHZhciBpID0gMDtcbiAgdmFyIGxvb3BSZXQgPSB0cnVlO1xuICBpZiAob3B0aW9ucy5hbmltYXRlID09PSB0cnVlKSB7XG4gICAgdmFyIF9mcmFtZSA9IGZ1bmN0aW9uIGZyYW1lKCkge1xuICAgICAgdmFyIGYgPSAwO1xuICAgICAgd2hpbGUgKGxvb3BSZXQgJiYgZiA8IG9wdGlvbnMucmVmcmVzaCkge1xuICAgICAgICBsb29wUmV0ID0gbWFpbkxvb3AoaSk7XG4gICAgICAgIGkrKztcbiAgICAgICAgZisrO1xuICAgICAgfVxuICAgICAgaWYgKCFsb29wUmV0KSB7XG4gICAgICAgIC8vIGl0J3MgZG9uZVxuICAgICAgICBzZXBhcmF0ZUNvbXBvbmVudHMobGF5b3V0SW5mbywgb3B0aW9ucyk7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBub3cgPSBwZXJmb3JtYW5jZU5vdygpO1xuICAgICAgICBpZiAobm93IC0gc3RhcnRUaW1lID49IG9wdGlvbnMuYW5pbWF0aW9uVGhyZXNob2xkKSB7XG4gICAgICAgICAgcmVmcmVzaCgpO1xuICAgICAgICB9XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShfZnJhbWUpO1xuICAgICAgfVxuICAgIH07XG4gICAgX2ZyYW1lKCk7XG4gIH0gZWxzZSB7XG4gICAgd2hpbGUgKGxvb3BSZXQpIHtcbiAgICAgIGxvb3BSZXQgPSBtYWluTG9vcChpKTtcbiAgICAgIGkrKztcbiAgICB9XG4gICAgc2VwYXJhdGVDb21wb25lbnRzKGxheW91dEluZm8sIG9wdGlvbnMpO1xuICAgIGRvbmUoKTtcbiAgfVxuICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbn07XG5cbi8qKlxuICogQGJyaWVmIDogY2FsbGVkIG9uIGNvbnRpbnVvdXMgbGF5b3V0cyB0byBzdG9wIHRoZW0gYmVmb3JlIHRoZXkgZmluaXNoXG4gKi9cbkNvc2VMYXlvdXQucHJvdG90eXBlLnN0b3AgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuc3RvcHBlZCA9IHRydWU7XG4gIGlmICh0aGlzLnRocmVhZCkge1xuICAgIHRoaXMudGhyZWFkLnN0b3AoKTtcbiAgfVxuICB0aGlzLmVtaXQoJ2xheW91dHN0b3AnKTtcbiAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG59O1xuQ29zZUxheW91dC5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMudGhyZWFkKSB7XG4gICAgdGhpcy50aHJlYWQuc3RvcCgpO1xuICB9XG4gIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xufTtcblxuLyoqXG4gKiBAYnJpZWYgICAgIDogQ3JlYXRlcyBhbiBvYmplY3Qgd2hpY2ggaXMgY29udGFpbnMgYWxsIHRoZSBkYXRhXG4gKiAgICAgICAgICAgICAgdXNlZCBpbiB0aGUgbGF5b3V0IHByb2Nlc3NcbiAqIEBhcmcgY3kgICAgOiBjeXRvc2NhcGUuanMgb2JqZWN0XG4gKiBAcmV0dXJuICAgIDogbGF5b3V0SW5mbyBvYmplY3QgaW5pdGlhbGl6ZWRcbiAqL1xudmFyIGNyZWF0ZUxheW91dEluZm8gPSBmdW5jdGlvbiBjcmVhdGVMYXlvdXRJbmZvKGN5LCBsYXlvdXQsIG9wdGlvbnMpIHtcbiAgLy8gU2hvcnRjdXRcbiAgdmFyIGVkZ2VzID0gb3B0aW9ucy5lbGVzLmVkZ2VzKCk7XG4gIHZhciBub2RlcyA9IG9wdGlvbnMuZWxlcy5ub2RlcygpO1xuICB2YXIgYmIgPSBtYWtlQm91bmRpbmdCb3gob3B0aW9ucy5ib3VuZGluZ0JveCA/IG9wdGlvbnMuYm91bmRpbmdCb3ggOiB7XG4gICAgeDE6IDAsXG4gICAgeTE6IDAsXG4gICAgdzogY3kud2lkdGgoKSxcbiAgICBoOiBjeS5oZWlnaHQoKVxuICB9KTtcbiAgdmFyIGxheW91dEluZm8gPSB7XG4gICAgaXNDb21wb3VuZDogY3kuaGFzQ29tcG91bmROb2RlcygpLFxuICAgIGxheW91dE5vZGVzOiBbXSxcbiAgICBpZFRvSW5kZXg6IHt9LFxuICAgIG5vZGVTaXplOiBub2Rlcy5zaXplKCksXG4gICAgZ3JhcGhTZXQ6IFtdLFxuICAgIGluZGV4VG9HcmFwaDogW10sXG4gICAgbGF5b3V0RWRnZXM6IFtdLFxuICAgIGVkZ2VTaXplOiBlZGdlcy5zaXplKCksXG4gICAgdGVtcGVyYXR1cmU6IG9wdGlvbnMuaW5pdGlhbFRlbXAsXG4gICAgY2xpZW50V2lkdGg6IGJiLncsXG4gICAgY2xpZW50SGVpZ2h0OiBiYi5oLFxuICAgIGJvdW5kaW5nQm94OiBiYlxuICB9O1xuICB2YXIgY29tcG9uZW50cyA9IG9wdGlvbnMuZWxlcy5jb21wb25lbnRzKCk7XG4gIHZhciBpZDJjbXB0SWQgPSB7fTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21wb25lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGNvbXBvbmVudCA9IGNvbXBvbmVudHNbaV07XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBjb21wb25lbnQubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBub2RlID0gY29tcG9uZW50W2pdO1xuICAgICAgaWQyY21wdElkW25vZGUuaWQoKV0gPSBpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEl0ZXJhdGUgb3ZlciBhbGwgbm9kZXMsIGNyZWF0aW5nIGxheW91dCBub2Rlc1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxheW91dEluZm8ubm9kZVNpemU7IGkrKykge1xuICAgIHZhciBuID0gbm9kZXNbaV07XG4gICAgdmFyIG5iYiA9IG4ubGF5b3V0RGltZW5zaW9ucyhvcHRpb25zKTtcbiAgICB2YXIgdGVtcE5vZGUgPSB7fTtcbiAgICB0ZW1wTm9kZS5pc0xvY2tlZCA9IG4ubG9ja2VkKCk7XG4gICAgdGVtcE5vZGUuaWQgPSBuLmRhdGEoJ2lkJyk7XG4gICAgdGVtcE5vZGUucGFyZW50SWQgPSBuLmRhdGEoJ3BhcmVudCcpO1xuICAgIHRlbXBOb2RlLmNtcHRJZCA9IGlkMmNtcHRJZFtuLmlkKCldO1xuICAgIHRlbXBOb2RlLmNoaWxkcmVuID0gW107XG4gICAgdGVtcE5vZGUucG9zaXRpb25YID0gbi5wb3NpdGlvbigneCcpO1xuICAgIHRlbXBOb2RlLnBvc2l0aW9uWSA9IG4ucG9zaXRpb24oJ3knKTtcbiAgICB0ZW1wTm9kZS5vZmZzZXRYID0gMDtcbiAgICB0ZW1wTm9kZS5vZmZzZXRZID0gMDtcbiAgICB0ZW1wTm9kZS5oZWlnaHQgPSBuYmIudztcbiAgICB0ZW1wTm9kZS53aWR0aCA9IG5iYi5oO1xuICAgIHRlbXBOb2RlLm1heFggPSB0ZW1wTm9kZS5wb3NpdGlvblggKyB0ZW1wTm9kZS53aWR0aCAvIDI7XG4gICAgdGVtcE5vZGUubWluWCA9IHRlbXBOb2RlLnBvc2l0aW9uWCAtIHRlbXBOb2RlLndpZHRoIC8gMjtcbiAgICB0ZW1wTm9kZS5tYXhZID0gdGVtcE5vZGUucG9zaXRpb25ZICsgdGVtcE5vZGUuaGVpZ2h0IC8gMjtcbiAgICB0ZW1wTm9kZS5taW5ZID0gdGVtcE5vZGUucG9zaXRpb25ZIC0gdGVtcE5vZGUuaGVpZ2h0IC8gMjtcbiAgICB0ZW1wTm9kZS5wYWRMZWZ0ID0gcGFyc2VGbG9hdChuLnN0eWxlKCdwYWRkaW5nJykpO1xuICAgIHRlbXBOb2RlLnBhZFJpZ2h0ID0gcGFyc2VGbG9hdChuLnN0eWxlKCdwYWRkaW5nJykpO1xuICAgIHRlbXBOb2RlLnBhZFRvcCA9IHBhcnNlRmxvYXQobi5zdHlsZSgncGFkZGluZycpKTtcbiAgICB0ZW1wTm9kZS5wYWRCb3R0b20gPSBwYXJzZUZsb2F0KG4uc3R5bGUoJ3BhZGRpbmcnKSk7XG5cbiAgICAvLyBmb3JjZXNcbiAgICB0ZW1wTm9kZS5ub2RlUmVwdWxzaW9uID0gZm4kNihvcHRpb25zLm5vZGVSZXB1bHNpb24pID8gb3B0aW9ucy5ub2RlUmVwdWxzaW9uKG4pIDogb3B0aW9ucy5ub2RlUmVwdWxzaW9uO1xuXG4gICAgLy8gQWRkIG5ldyBub2RlXG4gICAgbGF5b3V0SW5mby5sYXlvdXROb2Rlcy5wdXNoKHRlbXBOb2RlKTtcbiAgICAvLyBBZGQgZW50cnkgdG8gaWQtaW5kZXggbWFwXG4gICAgbGF5b3V0SW5mby5pZFRvSW5kZXhbdGVtcE5vZGUuaWRdID0gaTtcbiAgfVxuXG4gIC8vIElubGluZSBpbXBsZW1lbnRhdGlvbiBvZiBhIHF1ZXVlLCB1c2VkIGZvciB0cmF2ZXJzaW5nIHRoZSBncmFwaCBpbiBCRlMgb3JkZXJcbiAgdmFyIHF1ZXVlID0gW107XG4gIHZhciBzdGFydCA9IDA7IC8vIFBvaW50cyB0byB0aGUgc3RhcnQgdGhlIHF1ZXVlXG4gIHZhciBlbmQgPSAtMTsgLy8gUG9pbnRzIHRvIHRoZSBlbmQgb2YgdGhlIHF1ZXVlXG5cbiAgdmFyIHRlbXBHcmFwaCA9IFtdO1xuXG4gIC8vIFNlY29uZCBwYXNzIHRvIGFkZCBjaGlsZCBpbmZvcm1hdGlvbiBhbmRcbiAgLy8gaW5pdGlhbGl6ZSBxdWV1ZSBmb3IgaGllcmFyY2hpY2FsIHRyYXZlcnNhbFxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxheW91dEluZm8ubm9kZVNpemU7IGkrKykge1xuICAgIHZhciBuID0gbGF5b3V0SW5mby5sYXlvdXROb2Rlc1tpXTtcbiAgICB2YXIgcF9pZCA9IG4ucGFyZW50SWQ7XG4gICAgLy8gQ2hlY2sgaWYgbm9kZSBuIGhhcyBhIHBhcmVudCBub2RlXG4gICAgaWYgKG51bGwgIT0gcF9pZCkge1xuICAgICAgLy8gQWRkIG5vZGUgSWQgdG8gcGFyZW50J3MgbGlzdCBvZiBjaGlsZHJlblxuICAgICAgbGF5b3V0SW5mby5sYXlvdXROb2Rlc1tsYXlvdXRJbmZvLmlkVG9JbmRleFtwX2lkXV0uY2hpbGRyZW4ucHVzaChuLmlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgYSBub2RlIGRvZXNuJ3QgaGF2ZSBhIHBhcmVudCwgdGhlbiBpdCdzIGluIHRoZSByb290IGdyYXBoXG4gICAgICBxdWV1ZVsrK2VuZF0gPSBuLmlkO1xuICAgICAgdGVtcEdyYXBoLnB1c2gobi5pZCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQWRkIHJvb3QgZ3JhcGggdG8gZ3JhcGhTZXRcbiAgbGF5b3V0SW5mby5ncmFwaFNldC5wdXNoKHRlbXBHcmFwaCk7XG5cbiAgLy8gVHJhdmVyc2UgdGhlIGdyYXBoLCBsZXZlbCBieSBsZXZlbCxcbiAgd2hpbGUgKHN0YXJ0IDw9IGVuZCkge1xuICAgIC8vIEdldCB0aGUgbm9kZSB0byB2aXNpdCBhbmQgcmVtb3ZlIGl0IGZyb20gcXVldWVcbiAgICB2YXIgbm9kZV9pZCA9IHF1ZXVlW3N0YXJ0KytdO1xuICAgIHZhciBub2RlX2l4ID0gbGF5b3V0SW5mby5pZFRvSW5kZXhbbm9kZV9pZF07XG4gICAgdmFyIG5vZGUgPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW25vZGVfaXhdO1xuICAgIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47XG4gICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIEFkZCBjaGlsZHJlbiBub2RlcyBhcyBhIG5ldyBncmFwaCB0byBncmFwaCBzZXRcbiAgICAgIGxheW91dEluZm8uZ3JhcGhTZXQucHVzaChjaGlsZHJlbik7XG4gICAgICAvLyBBZGQgY2hpbGRyZW4gdG8gcXVlIHF1ZXVlIHRvIGJlIHZpc2l0ZWRcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcXVldWVbKytlbmRdID0gY2hpbGRyZW5baV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gQ3JlYXRlIGluZGV4VG9HcmFwaCBtYXBcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXlvdXRJbmZvLmdyYXBoU2V0Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGdyYXBoID0gbGF5b3V0SW5mby5ncmFwaFNldFtpXTtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGdyYXBoLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgaW5kZXggPSBsYXlvdXRJbmZvLmlkVG9JbmRleFtncmFwaFtqXV07XG4gICAgICBsYXlvdXRJbmZvLmluZGV4VG9HcmFwaFtpbmRleF0gPSBpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEl0ZXJhdGUgb3ZlciBhbGwgZWRnZXMsIGNyZWF0aW5nIExheW91dCBFZGdlc1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxheW91dEluZm8uZWRnZVNpemU7IGkrKykge1xuICAgIHZhciBlID0gZWRnZXNbaV07XG4gICAgdmFyIHRlbXBFZGdlID0ge307XG4gICAgdGVtcEVkZ2UuaWQgPSBlLmRhdGEoJ2lkJyk7XG4gICAgdGVtcEVkZ2Uuc291cmNlSWQgPSBlLmRhdGEoJ3NvdXJjZScpO1xuICAgIHRlbXBFZGdlLnRhcmdldElkID0gZS5kYXRhKCd0YXJnZXQnKTtcblxuICAgIC8vIENvbXB1dGUgaWRlYWwgbGVuZ3RoXG4gICAgdmFyIGlkZWFsTGVuZ3RoID0gZm4kNihvcHRpb25zLmlkZWFsRWRnZUxlbmd0aCkgPyBvcHRpb25zLmlkZWFsRWRnZUxlbmd0aChlKSA6IG9wdGlvbnMuaWRlYWxFZGdlTGVuZ3RoO1xuICAgIHZhciBlbGFzdGljaXR5ID0gZm4kNihvcHRpb25zLmVkZ2VFbGFzdGljaXR5KSA/IG9wdGlvbnMuZWRnZUVsYXN0aWNpdHkoZSkgOiBvcHRpb25zLmVkZ2VFbGFzdGljaXR5O1xuXG4gICAgLy8gQ2hlY2sgaWYgaXQncyBhbiBpbnRlciBncmFwaCBlZGdlXG4gICAgdmFyIHNvdXJjZUl4ID0gbGF5b3V0SW5mby5pZFRvSW5kZXhbdGVtcEVkZ2Uuc291cmNlSWRdO1xuICAgIHZhciB0YXJnZXRJeCA9IGxheW91dEluZm8uaWRUb0luZGV4W3RlbXBFZGdlLnRhcmdldElkXTtcbiAgICB2YXIgc291cmNlR3JhcGggPSBsYXlvdXRJbmZvLmluZGV4VG9HcmFwaFtzb3VyY2VJeF07XG4gICAgdmFyIHRhcmdldEdyYXBoID0gbGF5b3V0SW5mby5pbmRleFRvR3JhcGhbdGFyZ2V0SXhdO1xuICAgIGlmIChzb3VyY2VHcmFwaCAhPSB0YXJnZXRHcmFwaCkge1xuICAgICAgLy8gRmluZCBsb3dlc3QgY29tbW9uIGdyYXBoIGFuY2VzdG9yXG4gICAgICB2YXIgbGNhID0gZmluZExDQSh0ZW1wRWRnZS5zb3VyY2VJZCwgdGVtcEVkZ2UudGFyZ2V0SWQsIGxheW91dEluZm8pO1xuXG4gICAgICAvLyBDb21wdXRlIHN1bSBvZiBub2RlIGRlcHRocywgcmVsYXRpdmUgdG8gbGNhIGdyYXBoXG4gICAgICB2YXIgbGNhR3JhcGggPSBsYXlvdXRJbmZvLmdyYXBoU2V0W2xjYV07XG4gICAgICB2YXIgZGVwdGggPSAwO1xuXG4gICAgICAvLyBTb3VyY2UgZGVwdGhcbiAgICAgIHZhciB0ZW1wTm9kZSA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXNbc291cmNlSXhdO1xuICAgICAgd2hpbGUgKC0xID09PSBsY2FHcmFwaC5pbmRleE9mKHRlbXBOb2RlLmlkKSkge1xuICAgICAgICB0ZW1wTm9kZSA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXNbbGF5b3V0SW5mby5pZFRvSW5kZXhbdGVtcE5vZGUucGFyZW50SWRdXTtcbiAgICAgICAgZGVwdGgrKztcbiAgICAgIH1cblxuICAgICAgLy8gVGFyZ2V0IGRlcHRoXG4gICAgICB0ZW1wTm9kZSA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXNbdGFyZ2V0SXhdO1xuICAgICAgd2hpbGUgKC0xID09PSBsY2FHcmFwaC5pbmRleE9mKHRlbXBOb2RlLmlkKSkge1xuICAgICAgICB0ZW1wTm9kZSA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXNbbGF5b3V0SW5mby5pZFRvSW5kZXhbdGVtcE5vZGUucGFyZW50SWRdXTtcbiAgICAgICAgZGVwdGgrKztcbiAgICAgIH1cblxuICAgICAgLy8gbG9nRGVidWcoJ0xDQSBvZiBub2RlcyAnICsgdGVtcEVkZ2Uuc291cmNlSWQgKyAnIGFuZCAnICsgdGVtcEVkZ2UudGFyZ2V0SWQgK1xuICAgICAgLy8gIFwiLiBJbmRleDogXCIgKyBsY2EgKyBcIiBDb250ZW50czogXCIgKyBsY2FHcmFwaC50b1N0cmluZygpICtcbiAgICAgIC8vICBcIi4gRGVwdGg6IFwiICsgZGVwdGgpO1xuXG4gICAgICAvLyBVcGRhdGUgaWRlYWxMZW5ndGhcbiAgICAgIGlkZWFsTGVuZ3RoICo9IGRlcHRoICogb3B0aW9ucy5uZXN0aW5nRmFjdG9yO1xuICAgIH1cbiAgICB0ZW1wRWRnZS5pZGVhbExlbmd0aCA9IGlkZWFsTGVuZ3RoO1xuICAgIHRlbXBFZGdlLmVsYXN0aWNpdHkgPSBlbGFzdGljaXR5O1xuICAgIGxheW91dEluZm8ubGF5b3V0RWRnZXMucHVzaCh0ZW1wRWRnZSk7XG4gIH1cblxuICAvLyBGaW5hbGx5LCByZXR1cm4gbGF5b3V0SW5mbyBvYmplY3RcbiAgcmV0dXJuIGxheW91dEluZm87XG59O1xuXG4vKipcbiAqIEBicmllZiA6IFRoaXMgZnVuY3Rpb24gZmluZHMgdGhlIGluZGV4IG9mIHRoZSBsb3dlc3QgY29tbW9uXG4gKiAgICAgICAgICBncmFwaCBhbmNlc3RvciBiZXR3ZWVuIDIgbm9kZXMgaW4gdGhlIHN1YnRyZWVcbiAqICAgICAgICAgIChmcm9tIHRoZSBncmFwaCBoaWVyYXJjaHkgaW5kdWNlZCB0cmVlKSB3aG9zZVxuICogICAgICAgICAgcm9vdCBpcyBncmFwaEl4XG4gKlxuICogQGFyZyBub2RlMTogbm9kZTEncyBJRFxuICogQGFyZyBub2RlMjogbm9kZTIncyBJRFxuICogQGFyZyBsYXlvdXRJbmZvOiBsYXlvdXRJbmZvIG9iamVjdFxuICpcbiAqL1xudmFyIGZpbmRMQ0EgPSBmdW5jdGlvbiBmaW5kTENBKG5vZGUxLCBub2RlMiwgbGF5b3V0SW5mbykge1xuICAvLyBGaW5kIHRoZWlyIGNvbW1vbiBhbmNlc3Rlciwgc3RhcnRpbmcgZnJvbSB0aGUgcm9vdCBncmFwaFxuICB2YXIgcmVzID0gX2ZpbmRMQ0FfYXV4KG5vZGUxLCBub2RlMiwgMCwgbGF5b3V0SW5mbyk7XG4gIGlmICgyID4gcmVzLmNvdW50KSB7XG4gICAgLy8gSWYgYXV4IGZ1bmN0aW9uIGNvdWxkbid0IGZpbmQgdGhlIGNvbW1vbiBhbmNlc3RlcixcbiAgICAvLyB0aGVuIGl0IGlzIHRoZSByb290IGdyYXBoXG4gICAgcmV0dXJuIDA7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHJlcy5ncmFwaDtcbiAgfVxufTtcblxuLyoqXG4gKiBAYnJpZWYgICAgICAgICAgOiBBdXhpbGlhcnkgZnVuY3Rpb24gdXNlZCBmb3IgTENBIGNvbXB1dGF0aW9uXG4gKlxuICogQGFyZyBub2RlMSAgICAgIDogbm9kZTEncyBJRFxuICogQGFyZyBub2RlMiAgICAgIDogbm9kZTIncyBJRFxuICogQGFyZyBncmFwaEl4ICAgIDogc3ViZ3JhcGggaW5kZXhcbiAqIEBhcmcgbGF5b3V0SW5mbyA6IGxheW91dEluZm8gb2JqZWN0XG4gKlxuICogQHJldHVybiAgICAgICAgIDogb2JqZWN0IG9mIHRoZSBmb3JtIHtjb3VudDogWCwgZ3JhcGg6IFl9LCB3aGVyZTpcbiAqICAgICAgICAgICAgICAgICAgIFggaXMgdGhlIG51bWJlciBvZiBhbmNlc3RvcnMgKG1heDogMikgZm91bmQgaW5cbiAqICAgICAgICAgICAgICAgICAgIGdyYXBoSXggKGFuZCBpdCdzIHN1YmdyYXBocyksXG4gKiAgICAgICAgICAgICAgICAgICBZIGlzIHRoZSBncmFwaCBpbmRleCBvZiB0aGUgbG93ZXN0IGdyYXBoIGNvbnRhaW5pbmdcbiAqICAgICAgICAgICAgICAgICAgIGFsbCBYIG5vZGVzXG4gKi9cbnZhciBfZmluZExDQV9hdXggPSBmdW5jdGlvbiBmaW5kTENBX2F1eChub2RlMSwgbm9kZTIsIGdyYXBoSXgsIGxheW91dEluZm8pIHtcbiAgdmFyIGdyYXBoID0gbGF5b3V0SW5mby5ncmFwaFNldFtncmFwaEl4XTtcbiAgLy8gSWYgYm90aCBub2RlcyBiZWxvbmdzIHRvIGdyYXBoSXhcbiAgaWYgKC0xIDwgZ3JhcGguaW5kZXhPZihub2RlMSkgJiYgLTEgPCBncmFwaC5pbmRleE9mKG5vZGUyKSkge1xuICAgIHJldHVybiB7XG4gICAgICBjb3VudDogMixcbiAgICAgIGdyYXBoOiBncmFwaEl4XG4gICAgfTtcbiAgfVxuXG4gIC8vIE1ha2UgcmVjdXJzaXZlIGNhbGxzIGZvciBhbGwgc3ViZ3JhcGhzXG4gIHZhciBjID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBncmFwaC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBub2RlSWQgPSBncmFwaFtpXTtcbiAgICB2YXIgbm9kZUl4ID0gbGF5b3V0SW5mby5pZFRvSW5kZXhbbm9kZUlkXTtcbiAgICB2YXIgY2hpbGRyZW4gPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW25vZGVJeF0uY2hpbGRyZW47XG5cbiAgICAvLyBJZiB0aGUgbm9kZSBoYXMgbm8gY2hpbGQsIHNraXAgaXRcbiAgICBpZiAoMCA9PT0gY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdmFyIGNoaWxkR3JhcGhJeCA9IGxheW91dEluZm8uaW5kZXhUb0dyYXBoW2xheW91dEluZm8uaWRUb0luZGV4W2NoaWxkcmVuWzBdXV07XG4gICAgdmFyIHJlc3VsdCA9IF9maW5kTENBX2F1eChub2RlMSwgbm9kZTIsIGNoaWxkR3JhcGhJeCwgbGF5b3V0SW5mbyk7XG4gICAgaWYgKDAgPT09IHJlc3VsdC5jb3VudCkge1xuICAgICAgLy8gTmVpdGhlciBub2RlMSBub3Igbm9kZTIgYXJlIHByZXNlbnQgaW4gdGhpcyBzdWJncmFwaFxuICAgICAgY29udGludWU7XG4gICAgfSBlbHNlIGlmICgxID09PSByZXN1bHQuY291bnQpIHtcbiAgICAgIC8vIE9uZSBvZiAobm9kZTEsIG5vZGUyKSBpcyBwcmVzZW50IGluIHRoaXMgc3ViZ3JhcGhcbiAgICAgIGMrKztcbiAgICAgIGlmICgyID09PSBjKSB7XG4gICAgICAgIC8vIFdlJ3ZlIGFscmVhZHkgZm91bmQgYm90aCBub2Rlcywgbm8gbmVlZCB0byBrZWVwIHNlYXJjaGluZ1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQm90aCBub2RlcyBhcmUgcHJlc2VudCBpbiB0aGlzIHN1YmdyYXBoXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIGNvdW50OiBjLFxuICAgIGdyYXBoOiBncmFwaEl4XG4gIH07XG59O1xuXG4vKipcbiAqIEBicmllZjogcHJpbnRzTGF5b3V0SW5mbyBpbnRvIGpzIGNvbnNvbGVcbiAqICAgICAgICAgT25seSB1c2VkIGZvciBkZWJidWdpbmdcbiAqL1xudmFyIHByaW50TGF5b3V0SW5mbzsgXG5cbi8qKlxuICogQGJyaWVmIDogUmFuZG9taXplcyB0aGUgcG9zaXRpb24gb2YgYWxsIG5vZGVzXG4gKi9cbnZhciByYW5kb21pemVQb3NpdGlvbnMgPSBmdW5jdGlvbiByYW5kb21pemVQb3NpdGlvbnMobGF5b3V0SW5mbywgY3kpIHtcbiAgdmFyIHdpZHRoID0gbGF5b3V0SW5mby5jbGllbnRXaWR0aDtcbiAgdmFyIGhlaWdodCA9IGxheW91dEluZm8uY2xpZW50SGVpZ2h0O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxheW91dEluZm8ubm9kZVNpemU7IGkrKykge1xuICAgIHZhciBuID0gbGF5b3V0SW5mby5sYXlvdXROb2Rlc1tpXTtcblxuICAgIC8vIE5vIG5lZWQgdG8gcmFuZG9taXplIGNvbXBvdW5kIG5vZGVzIG9yIGxvY2tlZCBub2Rlc1xuICAgIGlmICgwID09PSBuLmNoaWxkcmVuLmxlbmd0aCAmJiAhbi5pc0xvY2tlZCkge1xuICAgICAgbi5wb3NpdGlvblggPSBNYXRoLnJhbmRvbSgpICogd2lkdGg7XG4gICAgICBuLnBvc2l0aW9uWSA9IE1hdGgucmFuZG9tKCkgKiBoZWlnaHQ7XG4gICAgfVxuICB9XG59O1xudmFyIGdldFNjYWxlSW5Cb3VuZHNGbiA9IGZ1bmN0aW9uIGdldFNjYWxlSW5Cb3VuZHNGbihsYXlvdXRJbmZvLCBvcHRpb25zLCBub2Rlcykge1xuICB2YXIgYmIgPSBsYXlvdXRJbmZvLmJvdW5kaW5nQm94O1xuICB2YXIgY29zZUJCID0ge1xuICAgIHgxOiBJbmZpbml0eSxcbiAgICB4MjogLUluZmluaXR5LFxuICAgIHkxOiBJbmZpbml0eSxcbiAgICB5MjogLUluZmluaXR5XG4gIH07XG4gIGlmIChvcHRpb25zLmJvdW5kaW5nQm94KSB7XG4gICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgdmFyIGxub2RlID0gbGF5b3V0SW5mby5sYXlvdXROb2Rlc1tsYXlvdXRJbmZvLmlkVG9JbmRleFtub2RlLmRhdGEoJ2lkJyldXTtcbiAgICAgIGNvc2VCQi54MSA9IE1hdGgubWluKGNvc2VCQi54MSwgbG5vZGUucG9zaXRpb25YKTtcbiAgICAgIGNvc2VCQi54MiA9IE1hdGgubWF4KGNvc2VCQi54MiwgbG5vZGUucG9zaXRpb25YKTtcbiAgICAgIGNvc2VCQi55MSA9IE1hdGgubWluKGNvc2VCQi55MSwgbG5vZGUucG9zaXRpb25ZKTtcbiAgICAgIGNvc2VCQi55MiA9IE1hdGgubWF4KGNvc2VCQi55MiwgbG5vZGUucG9zaXRpb25ZKTtcbiAgICB9KTtcbiAgICBjb3NlQkIudyA9IGNvc2VCQi54MiAtIGNvc2VCQi54MTtcbiAgICBjb3NlQkIuaCA9IGNvc2VCQi55MiAtIGNvc2VCQi55MTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24gKGVsZSwgaSkge1xuICAgIHZhciBsbm9kZSA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXNbbGF5b3V0SW5mby5pZFRvSW5kZXhbZWxlLmRhdGEoJ2lkJyldXTtcbiAgICBpZiAob3B0aW9ucy5ib3VuZGluZ0JveCkge1xuICAgICAgLy8gdGhlbiBhZGQgZXh0cmEgYm91bmRpbmcgYm94IGNvbnN0cmFpbnRcbiAgICAgIC8vIEhhbmRsZSBzaW5nbGUgbm9kZSBjYXNlIHdoZXJlIGNvc2VCQi53IG9yIGNvc2VCQi5oIGlzIDBcbiAgICAgIHZhciBwY3RYID0gY29zZUJCLncgPT09IDAgPyAwLjUgOiAobG5vZGUucG9zaXRpb25YIC0gY29zZUJCLngxKSAvIGNvc2VCQi53O1xuICAgICAgdmFyIHBjdFkgPSBjb3NlQkIuaCA9PT0gMCA/IDAuNSA6IChsbm9kZS5wb3NpdGlvblkgLSBjb3NlQkIueTEpIC8gY29zZUJCLmg7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4OiBiYi54MSArIHBjdFggKiBiYi53LFxuICAgICAgICB5OiBiYi55MSArIHBjdFkgKiBiYi5oXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4OiBsbm9kZS5wb3NpdGlvblgsXG4gICAgICAgIHk6IGxub2RlLnBvc2l0aW9uWVxuICAgICAgfTtcbiAgICB9XG4gIH07XG59O1xuXG4vKipcbiAqIEBicmllZiAgICAgICAgICA6IFVwZGF0ZXMgdGhlIHBvc2l0aW9ucyBvZiBub2RlcyBpbiB0aGUgbmV0d29ya1xuICogQGFyZyBsYXlvdXRJbmZvIDogTGF5b3V0SW5mbyBvYmplY3RcbiAqIEBhcmcgY3kgICAgICAgICA6IEN5dG9zY2FwZSBvYmplY3RcbiAqIEBhcmcgb3B0aW9ucyAgICA6IExheW91dCBvcHRpb25zXG4gKi9cbnZhciByZWZyZXNoUG9zaXRpb25zID0gZnVuY3Rpb24gcmVmcmVzaFBvc2l0aW9ucyhsYXlvdXRJbmZvLCBjeSwgb3B0aW9ucykge1xuICAvLyB2YXIgcyA9ICdSZWZyZXNoaW5nIHBvc2l0aW9ucyc7XG4gIC8vIGxvZ0RlYnVnKHMpO1xuXG4gIHZhciBsYXlvdXQgPSBvcHRpb25zLmxheW91dDtcbiAgdmFyIG5vZGVzID0gb3B0aW9ucy5lbGVzLm5vZGVzKCk7XG4gIHZhciBnZXRTY2FsZWRQb3MgPSBnZXRTY2FsZUluQm91bmRzRm4obGF5b3V0SW5mbywgb3B0aW9ucywgbm9kZXMpO1xuICBub2Rlcy5wb3NpdGlvbnMoZ2V0U2NhbGVkUG9zKTtcblxuICAvLyBUcmlnZ2VyIGxheW91dFJlYWR5IG9ubHkgb24gZmlyc3QgY2FsbFxuICBpZiAodHJ1ZSAhPT0gbGF5b3V0SW5mby5yZWFkeSkge1xuICAgIC8vIHMgPSAnVHJpZ2dlcmluZyBsYXlvdXRyZWFkeSc7XG4gICAgLy8gbG9nRGVidWcocyk7XG4gICAgbGF5b3V0SW5mby5yZWFkeSA9IHRydWU7XG4gICAgbGF5b3V0Lm9uZSgnbGF5b3V0cmVhZHknLCBvcHRpb25zLnJlYWR5KTtcbiAgICBsYXlvdXQuZW1pdCh7XG4gICAgICB0eXBlOiAnbGF5b3V0cmVhZHknLFxuICAgICAgbGF5b3V0OiB0aGlzXG4gICAgfSk7XG4gIH1cbn07XG5cbi8qKlxuICogQGJyaWVmIDogTG9ncyBhIGRlYnVnIG1lc3NhZ2UgaW4gSlMgY29uc29sZSwgaWYgREVCVUcgaXMgT05cbiAqL1xuLy8gdmFyIGxvZ0RlYnVnID0gZnVuY3Rpb24odGV4dCkge1xuLy8gICBpZiAoREVCVUcpIHtcbi8vICAgICBjb25zb2xlLmRlYnVnKHRleHQpO1xuLy8gICB9XG4vLyB9O1xuXG4vKipcbiAqIEBicmllZiAgICAgICAgICA6IFBlcmZvcm1zIG9uZSBpdGVyYXRpb24gb2YgdGhlIHBoeXNpY2FsIHNpbXVsYXRpb25cbiAqIEBhcmcgbGF5b3V0SW5mbyA6IExheW91dEluZm8gb2JqZWN0IGFscmVhZHkgaW5pdGlhbGl6ZWRcbiAqIEBhcmcgY3kgICAgICAgICA6IEN5dG9zY2FwZSBvYmplY3RcbiAqIEBhcmcgb3B0aW9ucyAgICA6IExheW91dCBvcHRpb25zXG4gKi9cbnZhciBzdGVwID0gZnVuY3Rpb24gc3RlcChsYXlvdXRJbmZvLCBvcHRpb25zLCBfc3RlcCkge1xuICAvLyB2YXIgcyA9IFwiXFxuXFxuIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1wiO1xuICAvLyBzICs9IFwiXFxuU1RFUDogXCIgKyBzdGVwO1xuICAvLyBzICs9IFwiXFxuIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xcblwiO1xuICAvLyBsb2dEZWJ1ZyhzKTtcblxuICAvLyBDYWxjdWxhdGUgbm9kZSByZXB1bHNpb25zXG4gIGNhbGN1bGF0ZU5vZGVGb3JjZXMobGF5b3V0SW5mbywgb3B0aW9ucyk7XG4gIC8vIENhbGN1bGF0ZSBlZGdlIGZvcmNlc1xuICBjYWxjdWxhdGVFZGdlRm9yY2VzKGxheW91dEluZm8pO1xuICAvLyBDYWxjdWxhdGUgZ3Jhdml0eSBmb3JjZXNcbiAgY2FsY3VsYXRlR3Jhdml0eUZvcmNlcyhsYXlvdXRJbmZvLCBvcHRpb25zKTtcbiAgLy8gUHJvcGFnYXRlIGZvcmNlcyBmcm9tIHBhcmVudCB0byBjaGlsZFxuICBwcm9wYWdhdGVGb3JjZXMobGF5b3V0SW5mbyk7XG4gIC8vIFVwZGF0ZSBwb3NpdGlvbnMgYmFzZWQgb24gY2FsY3VsYXRlZCBmb3JjZXNcbiAgdXBkYXRlUG9zaXRpb25zKGxheW91dEluZm8pO1xufTtcblxuLyoqXG4gKiBAYnJpZWYgOiBDb21wdXRlcyB0aGUgbm9kZSByZXB1bHNpb24gZm9yY2VzXG4gKi9cbnZhciBjYWxjdWxhdGVOb2RlRm9yY2VzID0gZnVuY3Rpb24gY2FsY3VsYXRlTm9kZUZvcmNlcyhsYXlvdXRJbmZvLCBvcHRpb25zKSB7XG4gIC8vIEdvIHRocm91Z2ggZWFjaCBvZiB0aGUgZ3JhcGhzIGluIGdyYXBoU2V0XG4gIC8vIE5vZGVzIG9ubHkgcmVwZWwgZWFjaCBvdGhlciBpZiB0aGV5IGJlbG9uZyB0byB0aGUgc2FtZSBncmFwaFxuICAvLyB2YXIgcyA9ICdjYWxjdWxhdGVOb2RlRm9yY2VzJztcbiAgLy8gbG9nRGVidWcocyk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGF5b3V0SW5mby5ncmFwaFNldC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBncmFwaCA9IGxheW91dEluZm8uZ3JhcGhTZXRbaV07XG4gICAgdmFyIG51bU5vZGVzID0gZ3JhcGgubGVuZ3RoO1xuXG4gICAgLy8gcyA9IFwiU2V0OiBcIiArIGdyYXBoLnRvU3RyaW5nKCk7XG4gICAgLy8gbG9nRGVidWcocyk7XG5cbiAgICAvLyBOb3cgZ2V0IGFsbCB0aGUgcGFpcnMgb2Ygbm9kZXNcbiAgICAvLyBPbmx5IGdldCBlYWNoIHBhaXIgb25jZSwgKEEsIEIpID0gKEIsIEEpXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBudW1Ob2RlczsgaisrKSB7XG4gICAgICB2YXIgbm9kZTEgPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW2xheW91dEluZm8uaWRUb0luZGV4W2dyYXBoW2pdXV07XG4gICAgICBmb3IgKHZhciBrID0gaiArIDE7IGsgPCBudW1Ob2RlczsgaysrKSB7XG4gICAgICAgIHZhciBub2RlMiA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXNbbGF5b3V0SW5mby5pZFRvSW5kZXhbZ3JhcGhba11dXTtcbiAgICAgICAgbm9kZVJlcHVsc2lvbihub2RlMSwgbm9kZTIsIGxheW91dEluZm8sIG9wdGlvbnMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcbnZhciByYW5kb21EaXN0YW5jZSA9IGZ1bmN0aW9uIHJhbmRvbURpc3RhbmNlKG1heCkge1xuICByZXR1cm4gLW1heCArIDIgKiBtYXggKiBNYXRoLnJhbmRvbSgpO1xufTtcblxuLyoqXG4gKiBAYnJpZWYgOiBDb21wdXRlIHRoZSBub2RlIHJlcHVsc2lvbiBmb3JjZXMgYmV0d2VlbiBhIHBhaXIgb2Ygbm9kZXNcbiAqL1xudmFyIG5vZGVSZXB1bHNpb24gPSBmdW5jdGlvbiBub2RlUmVwdWxzaW9uKG5vZGUxLCBub2RlMiwgbGF5b3V0SW5mbywgb3B0aW9ucykge1xuICAvLyB2YXIgcyA9IFwiTm9kZSByZXB1bHNpb24uIE5vZGUxOiBcIiArIG5vZGUxLmlkICsgXCIgTm9kZTI6IFwiICsgbm9kZTIuaWQ7XG5cbiAgdmFyIGNtcHRJZDEgPSBub2RlMS5jbXB0SWQ7XG4gIHZhciBjbXB0SWQyID0gbm9kZTIuY21wdElkO1xuICBpZiAoY21wdElkMSAhPT0gY21wdElkMiAmJiAhbGF5b3V0SW5mby5pc0NvbXBvdW5kKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gR2V0IGRpcmVjdGlvbiBvZiBsaW5lIGNvbm5lY3RpbmcgYm90aCBub2RlIGNlbnRlcnNcbiAgdmFyIGRpcmVjdGlvblggPSBub2RlMi5wb3NpdGlvblggLSBub2RlMS5wb3NpdGlvblg7XG4gIHZhciBkaXJlY3Rpb25ZID0gbm9kZTIucG9zaXRpb25ZIC0gbm9kZTEucG9zaXRpb25ZO1xuICB2YXIgbWF4UmFuZERpc3QgPSAxO1xuICAvLyBzICs9IFwiXFxuZGlyZWN0aW9uWDogXCIgKyBkaXJlY3Rpb25YICsgXCIsIGRpcmVjdGlvblk6IFwiICsgZGlyZWN0aW9uWTtcblxuICAvLyBJZiBib3RoIGNlbnRlcnMgYXJlIHRoZSBzYW1lLCBhcHBseSBhIHJhbmRvbSBmb3JjZVxuICBpZiAoMCA9PT0gZGlyZWN0aW9uWCAmJiAwID09PSBkaXJlY3Rpb25ZKSB7XG4gICAgZGlyZWN0aW9uWCA9IHJhbmRvbURpc3RhbmNlKG1heFJhbmREaXN0KTtcbiAgICBkaXJlY3Rpb25ZID0gcmFuZG9tRGlzdGFuY2UobWF4UmFuZERpc3QpO1xuICB9XG4gIHZhciBvdmVybGFwID0gbm9kZXNPdmVybGFwKG5vZGUxLCBub2RlMiwgZGlyZWN0aW9uWCwgZGlyZWN0aW9uWSk7XG4gIGlmIChvdmVybGFwID4gMCkge1xuICAgIC8vIHMgKz0gXCJcXG5Ob2RlcyBETyBvdmVybGFwLlwiO1xuICAgIC8vIHMgKz0gXCJcXG5PdmVybGFwOiBcIiArIG92ZXJsYXA7XG4gICAgLy8gSWYgbm9kZXMgb3ZlcmxhcCwgcmVwdWxzaW9uIGZvcmNlIGlzIHByb3BvcnRpb25hbFxuICAgIC8vIHRvIHRoZSBvdmVybGFwXG4gICAgdmFyIGZvcmNlID0gb3B0aW9ucy5ub2RlT3ZlcmxhcCAqIG92ZXJsYXA7XG5cbiAgICAvLyBDb21wdXRlIHRoZSBtb2R1bGUgYW5kIGNvbXBvbmVudHMgb2YgdGhlIGZvcmNlIHZlY3RvclxuICAgIHZhciBkaXN0YW5jZSA9IE1hdGguc3FydChkaXJlY3Rpb25YICogZGlyZWN0aW9uWCArIGRpcmVjdGlvblkgKiBkaXJlY3Rpb25ZKTtcbiAgICAvLyBzICs9IFwiXFxuRGlzdGFuY2U6IFwiICsgZGlzdGFuY2U7XG4gICAgdmFyIGZvcmNlWCA9IGZvcmNlICogZGlyZWN0aW9uWCAvIGRpc3RhbmNlO1xuICAgIHZhciBmb3JjZVkgPSBmb3JjZSAqIGRpcmVjdGlvblkgLyBkaXN0YW5jZTtcbiAgfSBlbHNlIHtcbiAgICAvLyBzICs9IFwiXFxuTm9kZXMgZG8gTk9UIG92ZXJsYXAuXCI7XG4gICAgLy8gSWYgdGhlcmUncyBubyBvdmVybGFwLCBmb3JjZSBpcyBpbnZlcnNlbHkgcHJvcG9ydGlvbmFsXG4gICAgLy8gdG8gc3F1YXJlZCBkaXN0YW5jZVxuXG4gICAgLy8gR2V0IGNsaXBwaW5nIHBvaW50cyBmb3IgYm90aCBub2Rlc1xuICAgIHZhciBwb2ludDEgPSBmaW5kQ2xpcHBpbmdQb2ludChub2RlMSwgZGlyZWN0aW9uWCwgZGlyZWN0aW9uWSk7XG4gICAgdmFyIHBvaW50MiA9IGZpbmRDbGlwcGluZ1BvaW50KG5vZGUyLCAtMSAqIGRpcmVjdGlvblgsIC0xICogZGlyZWN0aW9uWSk7XG5cbiAgICAvLyBVc2UgY2xpcHBpbmcgcG9pbnRzIHRvIGNvbXB1dGUgZGlzdGFuY2VcbiAgICB2YXIgZGlzdGFuY2VYID0gcG9pbnQyLnggLSBwb2ludDEueDtcbiAgICB2YXIgZGlzdGFuY2VZID0gcG9pbnQyLnkgLSBwb2ludDEueTtcbiAgICB2YXIgZGlzdGFuY2VTcXIgPSBkaXN0YW5jZVggKiBkaXN0YW5jZVggKyBkaXN0YW5jZVkgKiBkaXN0YW5jZVk7XG4gICAgdmFyIGRpc3RhbmNlID0gTWF0aC5zcXJ0KGRpc3RhbmNlU3FyKTtcbiAgICAvLyBzICs9IFwiXFxuRGlzdGFuY2U6IFwiICsgZGlzdGFuY2U7XG5cbiAgICAvLyBDb21wdXRlIHRoZSBtb2R1bGUgYW5kIGNvbXBvbmVudHMgb2YgdGhlIGZvcmNlIHZlY3RvclxuICAgIHZhciBmb3JjZSA9IChub2RlMS5ub2RlUmVwdWxzaW9uICsgbm9kZTIubm9kZVJlcHVsc2lvbikgLyBkaXN0YW5jZVNxcjtcbiAgICB2YXIgZm9yY2VYID0gZm9yY2UgKiBkaXN0YW5jZVggLyBkaXN0YW5jZTtcbiAgICB2YXIgZm9yY2VZID0gZm9yY2UgKiBkaXN0YW5jZVkgLyBkaXN0YW5jZTtcbiAgfVxuXG4gIC8vIEFwcGx5IGZvcmNlXG4gIGlmICghbm9kZTEuaXNMb2NrZWQpIHtcbiAgICBub2RlMS5vZmZzZXRYIC09IGZvcmNlWDtcbiAgICBub2RlMS5vZmZzZXRZIC09IGZvcmNlWTtcbiAgfVxuICBpZiAoIW5vZGUyLmlzTG9ja2VkKSB7XG4gICAgbm9kZTIub2Zmc2V0WCArPSBmb3JjZVg7XG4gICAgbm9kZTIub2Zmc2V0WSArPSBmb3JjZVk7XG4gIH1cblxuICAvLyBzICs9IFwiXFxuRm9yY2VYOiBcIiArIGZvcmNlWCArIFwiIEZvcmNlWTogXCIgKyBmb3JjZVk7XG4gIC8vIGxvZ0RlYnVnKHMpO1xuXG4gIHJldHVybjtcbn07XG5cbi8qKlxuICogQGJyaWVmICA6IERldGVybWluZXMgd2hldGhlciB0d28gbm9kZXMgb3ZlcmxhcCBvciBub3RcbiAqIEByZXR1cm4gOiBBbW91bnQgb2Ygb3ZlcmxhcHBpbmcgKDAgPT4gbm8gb3ZlcmxhcClcbiAqL1xudmFyIG5vZGVzT3ZlcmxhcCA9IGZ1bmN0aW9uIG5vZGVzT3ZlcmxhcChub2RlMSwgbm9kZTIsIGRYLCBkWSkge1xuICBpZiAoZFggPiAwKSB7XG4gICAgdmFyIG92ZXJsYXBYID0gbm9kZTEubWF4WCAtIG5vZGUyLm1pblg7XG4gIH0gZWxzZSB7XG4gICAgdmFyIG92ZXJsYXBYID0gbm9kZTIubWF4WCAtIG5vZGUxLm1pblg7XG4gIH1cbiAgaWYgKGRZID4gMCkge1xuICAgIHZhciBvdmVybGFwWSA9IG5vZGUxLm1heFkgLSBub2RlMi5taW5ZO1xuICB9IGVsc2Uge1xuICAgIHZhciBvdmVybGFwWSA9IG5vZGUyLm1heFkgLSBub2RlMS5taW5ZO1xuICB9XG4gIGlmIChvdmVybGFwWCA+PSAwICYmIG92ZXJsYXBZID49IDApIHtcbiAgICByZXR1cm4gTWF0aC5zcXJ0KG92ZXJsYXBYICogb3ZlcmxhcFggKyBvdmVybGFwWSAqIG92ZXJsYXBZKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gMDtcbiAgfVxufTtcblxuLyoqXG4gKiBAYnJpZWYgOiBGaW5kcyB0aGUgcG9pbnQgaW4gd2hpY2ggYW4gZWRnZSAoZGlyZWN0aW9uIGRYLCBkWSkgaW50ZXJzZWN0c1xuICogICAgICAgICAgdGhlIHJlY3Rhbmd1bGFyIGJvdW5kaW5nIGJveCBvZiBpdCdzIHNvdXJjZS90YXJnZXQgbm9kZVxuICovXG52YXIgZmluZENsaXBwaW5nUG9pbnQgPSBmdW5jdGlvbiBmaW5kQ2xpcHBpbmdQb2ludChub2RlLCBkWCwgZFkpIHtcbiAgLy8gU2hvcmN1dHNcbiAgdmFyIFggPSBub2RlLnBvc2l0aW9uWDtcbiAgdmFyIFkgPSBub2RlLnBvc2l0aW9uWTtcbiAgdmFyIEggPSBub2RlLmhlaWdodCB8fCAxO1xuICB2YXIgVyA9IG5vZGUud2lkdGggfHwgMTtcbiAgdmFyIGRpclNsb3BlID0gZFkgLyBkWDtcbiAgdmFyIG5vZGVTbG9wZSA9IEggLyBXO1xuXG4gIC8vIHZhciBzID0gJ0NvbXB1dGluZyBjbGlwcGluZyBwb2ludCBvZiBub2RlICcgKyBub2RlLmlkICtcbiAgLy8gICBcIiAuIEhlaWdodDogIFwiICsgSCArIFwiLCBXaWR0aDogXCIgKyBXICtcbiAgLy8gICBcIlxcbkRpcmVjdGlvbiBcIiArIGRYICsgXCIsIFwiICsgZFk7XG4gIC8vXG4gIC8vIENvbXB1dGUgaW50ZXJzZWN0aW9uXG4gIHZhciByZXMgPSB7fTtcblxuICAvLyBDYXNlOiBWZXJ0aWNhbCBkaXJlY3Rpb24gKHVwKVxuICBpZiAoMCA9PT0gZFggJiYgMCA8IGRZKSB7XG4gICAgcmVzLnggPSBYO1xuICAgIC8vIHMgKz0gXCJcXG5VcCBkaXJlY3Rpb25cIjtcbiAgICByZXMueSA9IFkgKyBIIC8gMjtcbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLy8gQ2FzZTogVmVydGljYWwgZGlyZWN0aW9uIChkb3duKVxuICBpZiAoMCA9PT0gZFggJiYgMCA+IGRZKSB7XG4gICAgcmVzLnggPSBYO1xuICAgIHJlcy55ID0gWSArIEggLyAyO1xuICAgIC8vIHMgKz0gXCJcXG5Eb3duIGRpcmVjdGlvblwiO1xuXG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8vIENhc2U6IEludGVyc2VjdHMgdGhlIHJpZ2h0IGJvcmRlclxuICBpZiAoMCA8IGRYICYmIC0xICogbm9kZVNsb3BlIDw9IGRpclNsb3BlICYmIGRpclNsb3BlIDw9IG5vZGVTbG9wZSkge1xuICAgIHJlcy54ID0gWCArIFcgLyAyO1xuICAgIHJlcy55ID0gWSArIFcgKiBkWSAvIDIgLyBkWDtcbiAgICAvLyBzICs9IFwiXFxuUmlnaHRib3JkZXJcIjtcblxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvLyBDYXNlOiBJbnRlcnNlY3RzIHRoZSBsZWZ0IGJvcmRlclxuICBpZiAoMCA+IGRYICYmIC0xICogbm9kZVNsb3BlIDw9IGRpclNsb3BlICYmIGRpclNsb3BlIDw9IG5vZGVTbG9wZSkge1xuICAgIHJlcy54ID0gWCAtIFcgLyAyO1xuICAgIHJlcy55ID0gWSAtIFcgKiBkWSAvIDIgLyBkWDtcbiAgICAvLyBzICs9IFwiXFxuTGVmdGJvcmRlclwiO1xuXG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8vIENhc2U6IEludGVyc2VjdHMgdGhlIHRvcCBib3JkZXJcbiAgaWYgKDAgPCBkWSAmJiAoZGlyU2xvcGUgPD0gLTEgKiBub2RlU2xvcGUgfHwgZGlyU2xvcGUgPj0gbm9kZVNsb3BlKSkge1xuICAgIHJlcy54ID0gWCArIEggKiBkWCAvIDIgLyBkWTtcbiAgICByZXMueSA9IFkgKyBIIC8gMjtcbiAgICAvLyBzICs9IFwiXFxuVG9wIGJvcmRlclwiO1xuXG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8vIENhc2U6IEludGVyc2VjdHMgdGhlIGJvdHRvbSBib3JkZXJcbiAgaWYgKDAgPiBkWSAmJiAoZGlyU2xvcGUgPD0gLTEgKiBub2RlU2xvcGUgfHwgZGlyU2xvcGUgPj0gbm9kZVNsb3BlKSkge1xuICAgIHJlcy54ID0gWCAtIEggKiBkWCAvIDIgLyBkWTtcbiAgICByZXMueSA9IFkgLSBIIC8gMjtcbiAgICAvLyBzICs9IFwiXFxuQm90dG9tIGJvcmRlclwiO1xuXG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8vIHMgKz0gXCJcXG5DbGlwcGluZyBwb2ludCBmb3VuZCBhdCBcIiArIHJlcy54ICsgXCIsIFwiICsgcmVzLnk7XG4gIC8vIGxvZ0RlYnVnKHMpO1xuICByZXR1cm4gcmVzO1xufTtcblxuLyoqXG4gKiBAYnJpZWYgOiBDYWxjdWxhdGVzIGFsbCBlZGdlIGZvcmNlc1xuICovXG52YXIgY2FsY3VsYXRlRWRnZUZvcmNlcyA9IGZ1bmN0aW9uIGNhbGN1bGF0ZUVkZ2VGb3JjZXMobGF5b3V0SW5mbywgb3B0aW9ucykge1xuICAvLyBJdGVyYXRlIG92ZXIgYWxsIGVkZ2VzXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGF5b3V0SW5mby5lZGdlU2l6ZTsgaSsrKSB7XG4gICAgLy8gR2V0IGVkZ2UsIHNvdXJjZSAmIHRhcmdldCBub2Rlc1xuICAgIHZhciBlZGdlID0gbGF5b3V0SW5mby5sYXlvdXRFZGdlc1tpXTtcbiAgICB2YXIgc291cmNlSXggPSBsYXlvdXRJbmZvLmlkVG9JbmRleFtlZGdlLnNvdXJjZUlkXTtcbiAgICB2YXIgc291cmNlID0gbGF5b3V0SW5mby5sYXlvdXROb2Rlc1tzb3VyY2VJeF07XG4gICAgdmFyIHRhcmdldEl4ID0gbGF5b3V0SW5mby5pZFRvSW5kZXhbZWRnZS50YXJnZXRJZF07XG4gICAgdmFyIHRhcmdldCA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXNbdGFyZ2V0SXhdO1xuXG4gICAgLy8gR2V0IGRpcmVjdGlvbiBvZiBsaW5lIGNvbm5lY3RpbmcgYm90aCBub2RlIGNlbnRlcnNcbiAgICB2YXIgZGlyZWN0aW9uWCA9IHRhcmdldC5wb3NpdGlvblggLSBzb3VyY2UucG9zaXRpb25YO1xuICAgIHZhciBkaXJlY3Rpb25ZID0gdGFyZ2V0LnBvc2l0aW9uWSAtIHNvdXJjZS5wb3NpdGlvblk7XG5cbiAgICAvLyBJZiBib3RoIGNlbnRlcnMgYXJlIHRoZSBzYW1lLCBkbyBub3RoaW5nLlxuICAgIC8vIEEgcmFuZG9tIGZvcmNlIGhhcyBhbHJlYWR5IGJlZW4gYXBwbGllZCBhcyBub2RlIHJlcHVsc2lvblxuICAgIGlmICgwID09PSBkaXJlY3Rpb25YICYmIDAgPT09IGRpcmVjdGlvblkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIEdldCBjbGlwcGluZyBwb2ludHMgZm9yIGJvdGggbm9kZXNcbiAgICB2YXIgcG9pbnQxID0gZmluZENsaXBwaW5nUG9pbnQoc291cmNlLCBkaXJlY3Rpb25YLCBkaXJlY3Rpb25ZKTtcbiAgICB2YXIgcG9pbnQyID0gZmluZENsaXBwaW5nUG9pbnQodGFyZ2V0LCAtMSAqIGRpcmVjdGlvblgsIC0xICogZGlyZWN0aW9uWSk7XG4gICAgdmFyIGx4ID0gcG9pbnQyLnggLSBwb2ludDEueDtcbiAgICB2YXIgbHkgPSBwb2ludDIueSAtIHBvaW50MS55O1xuICAgIHZhciBsID0gTWF0aC5zcXJ0KGx4ICogbHggKyBseSAqIGx5KTtcbiAgICB2YXIgZm9yY2UgPSBNYXRoLnBvdyhlZGdlLmlkZWFsTGVuZ3RoIC0gbCwgMikgLyBlZGdlLmVsYXN0aWNpdHk7XG4gICAgaWYgKDAgIT09IGwpIHtcbiAgICAgIHZhciBmb3JjZVggPSBmb3JjZSAqIGx4IC8gbDtcbiAgICAgIHZhciBmb3JjZVkgPSBmb3JjZSAqIGx5IC8gbDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGZvcmNlWCA9IDA7XG4gICAgICB2YXIgZm9yY2VZID0gMDtcbiAgICB9XG5cbiAgICAvLyBBZGQgdGhpcyBmb3JjZSB0byB0YXJnZXQgYW5kIHNvdXJjZSBub2Rlc1xuICAgIGlmICghc291cmNlLmlzTG9ja2VkKSB7XG4gICAgICBzb3VyY2Uub2Zmc2V0WCArPSBmb3JjZVg7XG4gICAgICBzb3VyY2Uub2Zmc2V0WSArPSBmb3JjZVk7XG4gICAgfVxuICAgIGlmICghdGFyZ2V0LmlzTG9ja2VkKSB7XG4gICAgICB0YXJnZXQub2Zmc2V0WCAtPSBmb3JjZVg7XG4gICAgICB0YXJnZXQub2Zmc2V0WSAtPSBmb3JjZVk7XG4gICAgfVxuXG4gICAgLy8gdmFyIHMgPSAnRWRnZSBmb3JjZSBiZXR3ZWVuIG5vZGVzICcgKyBzb3VyY2UuaWQgKyAnIGFuZCAnICsgdGFyZ2V0LmlkO1xuICAgIC8vIHMgKz0gXCJcXG5EaXN0YW5jZTogXCIgKyBsICsgXCIgRm9yY2U6IChcIiArIGZvcmNlWCArIFwiLCBcIiArIGZvcmNlWSArIFwiKVwiO1xuICAgIC8vIGxvZ0RlYnVnKHMpO1xuICB9XG59O1xuXG4vKipcbiAqIEBicmllZiA6IENvbXB1dGVzIGdyYXZpdHkgZm9yY2VzIGZvciBhbGwgbm9kZXNcbiAqL1xudmFyIGNhbGN1bGF0ZUdyYXZpdHlGb3JjZXMgPSBmdW5jdGlvbiBjYWxjdWxhdGVHcmF2aXR5Rm9yY2VzKGxheW91dEluZm8sIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMuZ3Jhdml0eSA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgZGlzdFRocmVzaG9sZCA9IDE7XG5cbiAgLy8gdmFyIHMgPSAnY2FsY3VsYXRlR3Jhdml0eUZvcmNlcyc7XG4gIC8vIGxvZ0RlYnVnKHMpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxheW91dEluZm8uZ3JhcGhTZXQubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZ3JhcGggPSBsYXlvdXRJbmZvLmdyYXBoU2V0W2ldO1xuICAgIHZhciBudW1Ob2RlcyA9IGdyYXBoLmxlbmd0aDtcblxuICAgIC8vIHMgPSBcIlNldDogXCIgKyBncmFwaC50b1N0cmluZygpO1xuICAgIC8vIGxvZ0RlYnVnKHMpO1xuXG4gICAgLy8gQ29tcHV0ZSBncmFwaCBjZW50ZXJcbiAgICBpZiAoMCA9PT0gaSkge1xuICAgICAgdmFyIGNlbnRlclggPSBsYXlvdXRJbmZvLmNsaWVudEhlaWdodCAvIDI7XG4gICAgICB2YXIgY2VudGVyWSA9IGxheW91dEluZm8uY2xpZW50V2lkdGggLyAyO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBHZXQgUGFyZW50IG5vZGUgZm9yIHRoaXMgZ3JhcGgsIGFuZCB1c2UgaXRzIHBvc2l0aW9uIGFzIGNlbnRlclxuICAgICAgdmFyIHRlbXAgPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW2xheW91dEluZm8uaWRUb0luZGV4W2dyYXBoWzBdXV07XG4gICAgICB2YXIgcGFyZW50ID0gbGF5b3V0SW5mby5sYXlvdXROb2Rlc1tsYXlvdXRJbmZvLmlkVG9JbmRleFt0ZW1wLnBhcmVudElkXV07XG4gICAgICB2YXIgY2VudGVyWCA9IHBhcmVudC5wb3NpdGlvblg7XG4gICAgICB2YXIgY2VudGVyWSA9IHBhcmVudC5wb3NpdGlvblk7XG4gICAgfVxuICAgIC8vIHMgPSBcIkNlbnRlciBmb3VuZCBhdDogXCIgKyBjZW50ZXJYICsgXCIsIFwiICsgY2VudGVyWTtcbiAgICAvLyBsb2dEZWJ1ZyhzKTtcblxuICAgIC8vIEFwcGx5IGZvcmNlIHRvIGFsbCBub2RlcyBpbiBncmFwaFxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgbnVtTm9kZXM7IGorKykge1xuICAgICAgdmFyIG5vZGUgPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW2xheW91dEluZm8uaWRUb0luZGV4W2dyYXBoW2pdXV07XG4gICAgICAvLyBzID0gXCJOb2RlOiBcIiArIG5vZGUuaWQ7XG5cbiAgICAgIGlmIChub2RlLmlzTG9ja2VkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdmFyIGR4ID0gY2VudGVyWCAtIG5vZGUucG9zaXRpb25YO1xuICAgICAgdmFyIGR5ID0gY2VudGVyWSAtIG5vZGUucG9zaXRpb25ZO1xuICAgICAgdmFyIGQgPSBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpO1xuICAgICAgaWYgKGQgPiBkaXN0VGhyZXNob2xkKSB7XG4gICAgICAgIHZhciBmeCA9IG9wdGlvbnMuZ3Jhdml0eSAqIGR4IC8gZDtcbiAgICAgICAgdmFyIGZ5ID0gb3B0aW9ucy5ncmF2aXR5ICogZHkgLyBkO1xuICAgICAgICBub2RlLm9mZnNldFggKz0gZng7XG4gICAgICAgIG5vZGUub2Zmc2V0WSArPSBmeTtcbiAgICAgICAgLy8gcyArPSBcIjogQXBwbGllZCBmb3JjZTogXCIgKyBmeCArIFwiLCBcIiArIGZ5O1xuICAgICAgfVxuICAgICAgLy8gbG9nRGVidWcocyk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEBicmllZiAgICAgICAgICA6IFRoaXMgZnVuY3Rpb24gcHJvcGFnYXRlcyB0aGUgZXhpc3Rpbmcgb2Zmc2V0cyBmcm9tXG4gKiAgICAgICAgICAgICAgICAgICBwYXJlbnQgbm9kZXMgdG8gaXRzIGRlc2NlbmRlbnRzLlxuICogQGFyZyBsYXlvdXRJbmZvIDogbGF5b3V0SW5mbyBPYmplY3RcbiAqIEBhcmcgY3kgICAgICAgICA6IGN5dG9zY2FwZSBPYmplY3RcbiAqIEBhcmcgb3B0aW9ucyAgICA6IExheW91dCBvcHRpb25zXG4gKi9cbnZhciBwcm9wYWdhdGVGb3JjZXMgPSBmdW5jdGlvbiBwcm9wYWdhdGVGb3JjZXMobGF5b3V0SW5mbywgb3B0aW9ucykge1xuICAvLyBJbmxpbmUgaW1wbGVtZW50YXRpb24gb2YgYSBxdWV1ZSwgdXNlZCBmb3IgdHJhdmVyc2luZyB0aGUgZ3JhcGggaW4gQkZTIG9yZGVyXG4gIHZhciBxdWV1ZSA9IFtdO1xuICB2YXIgc3RhcnQgPSAwOyAvLyBQb2ludHMgdG8gdGhlIHN0YXJ0IHRoZSBxdWV1ZVxuICB2YXIgZW5kID0gLTE7IC8vIFBvaW50cyB0byB0aGUgZW5kIG9mIHRoZSBxdWV1ZVxuXG4gIC8vIGxvZ0RlYnVnKCdwcm9wYWdhdGVGb3JjZXMnKTtcblxuICAvLyBTdGFydCBieSB2aXNpdGluZyB0aGUgbm9kZXMgaW4gdGhlIHJvb3QgZ3JhcGhcbiAgcXVldWUucHVzaC5hcHBseShxdWV1ZSwgbGF5b3V0SW5mby5ncmFwaFNldFswXSk7XG4gIGVuZCArPSBsYXlvdXRJbmZvLmdyYXBoU2V0WzBdLmxlbmd0aDtcblxuICAvLyBUcmF2ZXJzZSB0aGUgZ3JhcGgsIGxldmVsIGJ5IGxldmVsLFxuICB3aGlsZSAoc3RhcnQgPD0gZW5kKSB7XG4gICAgLy8gR2V0IHRoZSBub2RlIHRvIHZpc2l0IGFuZCByZW1vdmUgaXQgZnJvbSBxdWV1ZVxuICAgIHZhciBub2RlSWQgPSBxdWV1ZVtzdGFydCsrXTtcbiAgICB2YXIgbm9kZUluZGV4ID0gbGF5b3V0SW5mby5pZFRvSW5kZXhbbm9kZUlkXTtcbiAgICB2YXIgbm9kZSA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXNbbm9kZUluZGV4XTtcbiAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xuXG4gICAgLy8gV2Ugb25seSBuZWVkIHRvIHByb2Nlc3MgdGhlIG5vZGUgaWYgaXQncyBjb21wb3VuZFxuICAgIGlmICgwIDwgY2hpbGRyZW4ubGVuZ3RoICYmICFub2RlLmlzTG9ja2VkKSB7XG4gICAgICB2YXIgb2ZmWCA9IG5vZGUub2Zmc2V0WDtcbiAgICAgIHZhciBvZmZZID0gbm9kZS5vZmZzZXRZO1xuXG4gICAgICAvLyB2YXIgcyA9IFwiUHJvcGFnYXRpbmcgb2Zmc2V0IGZyb20gcGFyZW50IG5vZGUgOiBcIiArIG5vZGUuaWQgK1xuICAgICAgLy8gICBcIi4gT2Zmc2V0WDogXCIgKyBvZmZYICsgXCIuIE9mZnNldFk6IFwiICsgb2ZmWTtcbiAgICAgIC8vIHMgKz0gXCJcXG4gQ2hpbGRyZW46IFwiICsgY2hpbGRyZW4udG9TdHJpbmcoKTtcbiAgICAgIC8vIGxvZ0RlYnVnKHMpO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjaGlsZE5vZGUgPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW2xheW91dEluZm8uaWRUb0luZGV4W2NoaWxkcmVuW2ldXV07XG4gICAgICAgIC8vIFByb3BhZ2F0ZSBvZmZzZXRcbiAgICAgICAgY2hpbGROb2RlLm9mZnNldFggKz0gb2ZmWDtcbiAgICAgICAgY2hpbGROb2RlLm9mZnNldFkgKz0gb2ZmWTtcbiAgICAgICAgLy8gQWRkIGNoaWxkcmVuIHRvIHF1ZXVlIHRvIGJlIHZpc2l0ZWRcbiAgICAgICAgcXVldWVbKytlbmRdID0gY2hpbGRyZW5baV07XG4gICAgICB9XG5cbiAgICAgIC8vIFJlc2V0IHBhcmVudCBvZmZzZXRzXG4gICAgICBub2RlLm9mZnNldFggPSAwO1xuICAgICAgbm9kZS5vZmZzZXRZID0gMDtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogQGJyaWVmIDogVXBkYXRlcyB0aGUgbGF5b3V0IG1vZGVsIHBvc2l0aW9ucywgYmFzZWQgb25cbiAqICAgICAgICAgIHRoZSBhY2N1bXVsYXRlZCBmb3JjZXNcbiAqL1xudmFyIHVwZGF0ZVBvc2l0aW9ucyA9IGZ1bmN0aW9uIHVwZGF0ZVBvc2l0aW9ucyhsYXlvdXRJbmZvLCBvcHRpb25zKSB7XG4gIC8vIHZhciBzID0gJ1VwZGF0aW5nIHBvc2l0aW9ucyc7XG4gIC8vIGxvZ0RlYnVnKHMpO1xuXG4gIC8vIFJlc2V0IGJvdW5kYXJpZXMgZm9yIGNvbXBvdW5kIG5vZGVzXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGF5b3V0SW5mby5ub2RlU2l6ZTsgaSsrKSB7XG4gICAgdmFyIG4gPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW2ldO1xuICAgIGlmICgwIDwgbi5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgIC8vIGxvZ0RlYnVnKFwiUmVzZXR0aW5nIGJvdW5kYXJpZXMgb2YgY29tcG91bmQgbm9kZTogXCIgKyBuLmlkKTtcbiAgICAgIG4ubWF4WCA9IHVuZGVmaW5lZDtcbiAgICAgIG4ubWluWCA9IHVuZGVmaW5lZDtcbiAgICAgIG4ubWF4WSA9IHVuZGVmaW5lZDtcbiAgICAgIG4ubWluWSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXlvdXRJbmZvLm5vZGVTaXplOyBpKyspIHtcbiAgICB2YXIgbiA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXNbaV07XG4gICAgaWYgKDAgPCBuLmNoaWxkcmVuLmxlbmd0aCB8fCBuLmlzTG9ja2VkKSB7XG4gICAgICAvLyBObyBuZWVkIHRvIHNldCBjb21wb3VuZCBvciBsb2NrZWQgbm9kZSBwb3NpdGlvblxuICAgICAgLy8gbG9nRGVidWcoXCJTa2lwcGluZyBwb3NpdGlvbiB1cGRhdGUgb2Ygbm9kZTogXCIgKyBuLmlkKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICAvLyBzID0gXCJOb2RlOiBcIiArIG4uaWQgKyBcIiBQcmV2aW91cyBwb3NpdGlvbjogKFwiICtcbiAgICAvLyBuLnBvc2l0aW9uWCArIFwiLCBcIiArIG4ucG9zaXRpb25ZICsgXCIpLlwiO1xuXG4gICAgLy8gTGltaXQgZGlzcGxhY2VtZW50IGluIG9yZGVyIHRvIGltcHJvdmUgc3RhYmlsaXR5XG4gICAgdmFyIHRlbXBGb3JjZSA9IGxpbWl0Rm9yY2Uobi5vZmZzZXRYLCBuLm9mZnNldFksIGxheW91dEluZm8udGVtcGVyYXR1cmUpO1xuICAgIG4ucG9zaXRpb25YICs9IHRlbXBGb3JjZS54O1xuICAgIG4ucG9zaXRpb25ZICs9IHRlbXBGb3JjZS55O1xuICAgIG4ub2Zmc2V0WCA9IDA7XG4gICAgbi5vZmZzZXRZID0gMDtcbiAgICBuLm1pblggPSBuLnBvc2l0aW9uWCAtIG4ud2lkdGg7XG4gICAgbi5tYXhYID0gbi5wb3NpdGlvblggKyBuLndpZHRoO1xuICAgIG4ubWluWSA9IG4ucG9zaXRpb25ZIC0gbi5oZWlnaHQ7XG4gICAgbi5tYXhZID0gbi5wb3NpdGlvblkgKyBuLmhlaWdodDtcbiAgICAvLyBzICs9IFwiIE5ldyBQb3NpdGlvbjogKFwiICsgbi5wb3NpdGlvblggKyBcIiwgXCIgKyBuLnBvc2l0aW9uWSArIFwiKS5cIjtcbiAgICAvLyBsb2dEZWJ1ZyhzKTtcblxuICAgIC8vIFVwZGF0ZSBhbmNlc3RyeSBib3VkYXJpZXNcbiAgICBfdXBkYXRlQW5jZXN0cnlCb3VuZGFyaWVzKG4sIGxheW91dEluZm8pO1xuICB9XG5cbiAgLy8gVXBkYXRlIHNpemUsIHBvc2l0aW9uIG9mIGNvbXB1bmQgbm9kZXNcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXlvdXRJbmZvLm5vZGVTaXplOyBpKyspIHtcbiAgICB2YXIgbiA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXNbaV07XG4gICAgaWYgKDAgPCBuLmNoaWxkcmVuLmxlbmd0aCAmJiAhbi5pc0xvY2tlZCkge1xuICAgICAgbi5wb3NpdGlvblggPSAobi5tYXhYICsgbi5taW5YKSAvIDI7XG4gICAgICBuLnBvc2l0aW9uWSA9IChuLm1heFkgKyBuLm1pblkpIC8gMjtcbiAgICAgIG4ud2lkdGggPSBuLm1heFggLSBuLm1pblg7XG4gICAgICBuLmhlaWdodCA9IG4ubWF4WSAtIG4ubWluWTtcbiAgICAgIC8vIHMgPSBcIlVwZGF0aW5nIHBvc2l0aW9uLCBzaXplIG9mIGNvbXBvdW5kIG5vZGUgXCIgKyBuLmlkO1xuICAgICAgLy8gcyArPSBcIlxcblBvc2l0aW9uWDogXCIgKyBuLnBvc2l0aW9uWCArIFwiLCBQb3NpdGlvblk6IFwiICsgbi5wb3NpdGlvblk7XG4gICAgICAvLyBzICs9IFwiXFxuV2lkdGg6IFwiICsgbi53aWR0aCArIFwiLCBIZWlnaHQ6IFwiICsgbi5oZWlnaHQ7XG4gICAgICAvLyBsb2dEZWJ1ZyhzKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogQGJyaWVmIDogTGltaXRzIGEgZm9yY2UgKGZvcmNlWCwgZm9yY2VZKSB0byBiZSBub3RcbiAqICAgICAgICAgIGdyZWF0ZXIgKGluIG1vZHVsbykgdGhhbiBtYXguXG4gOCAgICAgICAgICBQcmVzZXJ2ZXMgZm9yY2UgZGlyZWN0aW9uLlxuICAqL1xudmFyIGxpbWl0Rm9yY2UgPSBmdW5jdGlvbiBsaW1pdEZvcmNlKGZvcmNlWCwgZm9yY2VZLCBtYXgpIHtcbiAgLy8gdmFyIHMgPSBcIkxpbWl0aW5nIGZvcmNlOiAoXCIgKyBmb3JjZVggKyBcIiwgXCIgKyBmb3JjZVkgKyBcIikuIE1heDogXCIgKyBtYXg7XG4gIHZhciBmb3JjZSA9IE1hdGguc3FydChmb3JjZVggKiBmb3JjZVggKyBmb3JjZVkgKiBmb3JjZVkpO1xuICBpZiAoZm9yY2UgPiBtYXgpIHtcbiAgICB2YXIgcmVzID0ge1xuICAgICAgeDogbWF4ICogZm9yY2VYIC8gZm9yY2UsXG4gICAgICB5OiBtYXggKiBmb3JjZVkgLyBmb3JjZVxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgdmFyIHJlcyA9IHtcbiAgICAgIHg6IGZvcmNlWCxcbiAgICAgIHk6IGZvcmNlWVxuICAgIH07XG4gIH1cblxuICAvLyBzICs9IFwiLlxcblJlc3VsdDogKFwiICsgcmVzLnggKyBcIiwgXCIgKyByZXMueSArIFwiKVwiO1xuICAvLyBsb2dEZWJ1ZyhzKTtcblxuICByZXR1cm4gcmVzO1xufTtcblxuLyoqXG4gKiBAYnJpZWYgOiBGdW5jdGlvbiB1c2VkIGZvciBrZWVwaW5nIHRyYWNrIG9mIGNvbXBvdW5kIG5vZGVcbiAqICAgICAgICAgIHNpemVzLCBzaW5jZSB0aGV5IHNob3VsZCBib3VuZCBhbGwgdGhlaXIgc3Vibm9kZXMuXG4gKi9cbnZhciBfdXBkYXRlQW5jZXN0cnlCb3VuZGFyaWVzID0gZnVuY3Rpb24gdXBkYXRlQW5jZXN0cnlCb3VuZGFyaWVzKG5vZGUsIGxheW91dEluZm8pIHtcbiAgLy8gdmFyIHMgPSBcIlByb3BhZ2F0aW5nIG5ldyBwb3NpdGlvbi9zaXplIG9mIG5vZGUgXCIgKyBub2RlLmlkO1xuICB2YXIgcGFyZW50SWQgPSBub2RlLnBhcmVudElkO1xuICBpZiAobnVsbCA9PSBwYXJlbnRJZCkge1xuICAgIC8vIElmIHRoZXJlJ3Mgbm8gcGFyZW50LCB3ZSBhcmUgZG9uZVxuICAgIC8vIHMgKz0gXCIuIE5vIHBhcmVudCBub2RlLlwiO1xuICAgIC8vIGxvZ0RlYnVnKHMpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEdldCBQYXJlbnQgTm9kZVxuICB2YXIgcCA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXNbbGF5b3V0SW5mby5pZFRvSW5kZXhbcGFyZW50SWRdXTtcbiAgdmFyIGZsYWcgPSBmYWxzZTtcblxuICAvLyBNYXhYXG4gIGlmIChudWxsID09IHAubWF4WCB8fCBub2RlLm1heFggKyBwLnBhZFJpZ2h0ID4gcC5tYXhYKSB7XG4gICAgcC5tYXhYID0gbm9kZS5tYXhYICsgcC5wYWRSaWdodDtcbiAgICBmbGFnID0gdHJ1ZTtcbiAgICAvLyBzICs9IFwiXFxuTmV3IG1heFggZm9yIHBhcmVudCBub2RlIFwiICsgcC5pZCArIFwiOiBcIiArIHAubWF4WDtcbiAgfVxuXG4gIC8vIE1pblhcbiAgaWYgKG51bGwgPT0gcC5taW5YIHx8IG5vZGUubWluWCAtIHAucGFkTGVmdCA8IHAubWluWCkge1xuICAgIHAubWluWCA9IG5vZGUubWluWCAtIHAucGFkTGVmdDtcbiAgICBmbGFnID0gdHJ1ZTtcbiAgICAvLyBzICs9IFwiXFxuTmV3IG1pblggZm9yIHBhcmVudCBub2RlIFwiICsgcC5pZCArIFwiOiBcIiArIHAubWluWDtcbiAgfVxuXG4gIC8vIE1heFlcbiAgaWYgKG51bGwgPT0gcC5tYXhZIHx8IG5vZGUubWF4WSArIHAucGFkQm90dG9tID4gcC5tYXhZKSB7XG4gICAgcC5tYXhZID0gbm9kZS5tYXhZICsgcC5wYWRCb3R0b207XG4gICAgZmxhZyA9IHRydWU7XG4gICAgLy8gcyArPSBcIlxcbk5ldyBtYXhZIGZvciBwYXJlbnQgbm9kZSBcIiArIHAuaWQgKyBcIjogXCIgKyBwLm1heFk7XG4gIH1cblxuICAvLyBNaW5ZXG4gIGlmIChudWxsID09IHAubWluWSB8fCBub2RlLm1pblkgLSBwLnBhZFRvcCA8IHAubWluWSkge1xuICAgIHAubWluWSA9IG5vZGUubWluWSAtIHAucGFkVG9wO1xuICAgIGZsYWcgPSB0cnVlO1xuICAgIC8vIHMgKz0gXCJcXG5OZXcgbWluWSBmb3IgcGFyZW50IG5vZGUgXCIgKyBwLmlkICsgXCI6IFwiICsgcC5taW5ZO1xuICB9XG5cbiAgLy8gSWYgdXBkYXRlZCBib3VuZGFyaWVzLCBwcm9wYWdhdGUgY2hhbmdlcyB1cHdhcmRcbiAgaWYgKGZsYWcpIHtcbiAgICAvLyBsb2dEZWJ1ZyhzKTtcbiAgICByZXR1cm4gX3VwZGF0ZUFuY2VzdHJ5Qm91bmRhcmllcyhwLCBsYXlvdXRJbmZvKTtcbiAgfVxuXG4gIC8vIHMgKz0gXCIuIE5vIGNoYW5nZXMgaW4gYm91bmRhcmllcy9wb3NpdGlvbiBvZiBwYXJlbnQgbm9kZSBcIiArIHAuaWQ7XG4gIC8vIGxvZ0RlYnVnKHMpO1xuICByZXR1cm47XG59O1xudmFyIHNlcGFyYXRlQ29tcG9uZW50cyA9IGZ1bmN0aW9uIHNlcGFyYXRlQ29tcG9uZW50cyhsYXlvdXRJbmZvLCBvcHRpb25zKSB7XG4gIHZhciBub2RlcyA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXM7XG4gIHZhciBjb21wb25lbnRzID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbm9kZSA9IG5vZGVzW2ldO1xuICAgIHZhciBjaWQgPSBub2RlLmNtcHRJZDtcbiAgICB2YXIgY29tcG9uZW50ID0gY29tcG9uZW50c1tjaWRdID0gY29tcG9uZW50c1tjaWRdIHx8IFtdO1xuICAgIGNvbXBvbmVudC5wdXNoKG5vZGUpO1xuICB9XG4gIHZhciB0b3RhbEEgPSAwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbXBvbmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgYyA9IGNvbXBvbmVudHNbaV07XG4gICAgaWYgKCFjKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgYy54MSA9IEluZmluaXR5O1xuICAgIGMueDIgPSAtSW5maW5pdHk7XG4gICAgYy55MSA9IEluZmluaXR5O1xuICAgIGMueTIgPSAtSW5maW5pdHk7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBjLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgbiA9IGNbal07XG4gICAgICBjLngxID0gTWF0aC5taW4oYy54MSwgbi5wb3NpdGlvblggLSBuLndpZHRoIC8gMik7XG4gICAgICBjLngyID0gTWF0aC5tYXgoYy54Miwgbi5wb3NpdGlvblggKyBuLndpZHRoIC8gMik7XG4gICAgICBjLnkxID0gTWF0aC5taW4oYy55MSwgbi5wb3NpdGlvblkgLSBuLmhlaWdodCAvIDIpO1xuICAgICAgYy55MiA9IE1hdGgubWF4KGMueTIsIG4ucG9zaXRpb25ZICsgbi5oZWlnaHQgLyAyKTtcbiAgICB9XG4gICAgYy53ID0gYy54MiAtIGMueDE7XG4gICAgYy5oID0gYy55MiAtIGMueTE7XG4gICAgdG90YWxBICs9IGMudyAqIGMuaDtcbiAgfVxuICBjb21wb25lbnRzLnNvcnQoZnVuY3Rpb24gKGMxLCBjMikge1xuICAgIHJldHVybiBjMi53ICogYzIuaCAtIGMxLncgKiBjMS5oO1xuICB9KTtcbiAgdmFyIHggPSAwO1xuICB2YXIgeSA9IDA7XG4gIHZhciB1c2VkVyA9IDA7XG4gIHZhciByb3dIID0gMDtcbiAgdmFyIG1heFJvd1cgPSBNYXRoLnNxcnQodG90YWxBKSAqIGxheW91dEluZm8uY2xpZW50V2lkdGggLyBsYXlvdXRJbmZvLmNsaWVudEhlaWdodDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21wb25lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGMgPSBjb21wb25lbnRzW2ldO1xuICAgIGlmICghYykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgYy5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIG4gPSBjW2pdO1xuICAgICAgaWYgKCFuLmlzTG9ja2VkKSB7XG4gICAgICAgIG4ucG9zaXRpb25YICs9IHggLSBjLngxO1xuICAgICAgICBuLnBvc2l0aW9uWSArPSB5IC0gYy55MTtcbiAgICAgIH1cbiAgICB9XG4gICAgeCArPSBjLncgKyBvcHRpb25zLmNvbXBvbmVudFNwYWNpbmc7XG4gICAgdXNlZFcgKz0gYy53ICsgb3B0aW9ucy5jb21wb25lbnRTcGFjaW5nO1xuICAgIHJvd0ggPSBNYXRoLm1heChyb3dILCBjLmgpO1xuICAgIGlmICh1c2VkVyA+IG1heFJvd1cpIHtcbiAgICAgIHkgKz0gcm93SCArIG9wdGlvbnMuY29tcG9uZW50U3BhY2luZztcbiAgICAgIHggPSAwO1xuICAgICAgdXNlZFcgPSAwO1xuICAgICAgcm93SCA9IDA7XG4gICAgfVxuICB9XG59O1xuXG52YXIgZGVmYXVsdHMkMyA9IHtcbiAgZml0OiB0cnVlLFxuICAvLyB3aGV0aGVyIHRvIGZpdCB0aGUgdmlld3BvcnQgdG8gdGhlIGdyYXBoXG4gIHBhZGRpbmc6IDMwLFxuICAvLyBwYWRkaW5nIHVzZWQgb24gZml0XG4gIGJvdW5kaW5nQm94OiB1bmRlZmluZWQsXG4gIC8vIGNvbnN0cmFpbiBsYXlvdXQgYm91bmRzOyB7IHgxLCB5MSwgeDIsIHkyIH0gb3IgeyB4MSwgeTEsIHcsIGggfVxuICBhdm9pZE92ZXJsYXA6IHRydWUsXG4gIC8vIHByZXZlbnRzIG5vZGUgb3ZlcmxhcCwgbWF5IG92ZXJmbG93IGJvdW5kaW5nQm94IGlmIG5vdCBlbm91Z2ggc3BhY2VcbiAgYXZvaWRPdmVybGFwUGFkZGluZzogMTAsXG4gIC8vIGV4dHJhIHNwYWNpbmcgYXJvdW5kIG5vZGVzIHdoZW4gYXZvaWRPdmVybGFwOiB0cnVlXG4gIG5vZGVEaW1lbnNpb25zSW5jbHVkZUxhYmVsczogZmFsc2UsXG4gIC8vIEV4Y2x1ZGVzIHRoZSBsYWJlbCB3aGVuIGNhbGN1bGF0aW5nIG5vZGUgYm91bmRpbmcgYm94ZXMgZm9yIHRoZSBsYXlvdXQgYWxnb3JpdGhtXG4gIHNwYWNpbmdGYWN0b3I6IHVuZGVmaW5lZCxcbiAgLy8gQXBwbGllcyBhIG11bHRpcGxpY2F0aXZlIGZhY3RvciAoPjApIHRvIGV4cGFuZCBvciBjb21wcmVzcyB0aGUgb3ZlcmFsbCBhcmVhIHRoYXQgdGhlIG5vZGVzIHRha2UgdXBcbiAgY29uZGVuc2U6IGZhbHNlLFxuICAvLyB1c2VzIGFsbCBhdmFpbGFibGUgc3BhY2Ugb24gZmFsc2UsIHVzZXMgbWluaW1hbCBzcGFjZSBvbiB0cnVlXG4gIHJvd3M6IHVuZGVmaW5lZCxcbiAgLy8gZm9yY2UgbnVtIG9mIHJvd3MgaW4gdGhlIGdyaWRcbiAgY29sczogdW5kZWZpbmVkLFxuICAvLyBmb3JjZSBudW0gb2YgY29sdW1ucyBpbiB0aGUgZ3JpZFxuICBwb3NpdGlvbjogZnVuY3Rpb24gcG9zaXRpb24obm9kZSkge30sXG4gIC8vIHJldHVybnMgeyByb3csIGNvbCB9IGZvciBlbGVtZW50XG4gIHNvcnQ6IHVuZGVmaW5lZCxcbiAgLy8gYSBzb3J0aW5nIGZ1bmN0aW9uIHRvIG9yZGVyIHRoZSBub2RlczsgZS5nLiBmdW5jdGlvbihhLCBiKXsgcmV0dXJuIGEuZGF0YSgnd2VpZ2h0JykgLSBiLmRhdGEoJ3dlaWdodCcpIH1cbiAgYW5pbWF0ZTogZmFsc2UsXG4gIC8vIHdoZXRoZXIgdG8gdHJhbnNpdGlvbiB0aGUgbm9kZSBwb3NpdGlvbnNcbiAgYW5pbWF0aW9uRHVyYXRpb246IDUwMCxcbiAgLy8gZHVyYXRpb24gb2YgYW5pbWF0aW9uIGluIG1zIGlmIGVuYWJsZWRcbiAgYW5pbWF0aW9uRWFzaW5nOiB1bmRlZmluZWQsXG4gIC8vIGVhc2luZyBvZiBhbmltYXRpb24gaWYgZW5hYmxlZFxuICBhbmltYXRlRmlsdGVyOiBmdW5jdGlvbiBhbmltYXRlRmlsdGVyKG5vZGUsIGkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgLy8gYSBmdW5jdGlvbiB0aGF0IGRldGVybWluZXMgd2hldGhlciB0aGUgbm9kZSBzaG91bGQgYmUgYW5pbWF0ZWQuICBBbGwgbm9kZXMgYW5pbWF0ZWQgYnkgZGVmYXVsdCBvbiBhbmltYXRlIGVuYWJsZWQuICBOb24tYW5pbWF0ZWQgbm9kZXMgYXJlIHBvc2l0aW9uZWQgaW1tZWRpYXRlbHkgd2hlbiB0aGUgbGF5b3V0IHN0YXJ0c1xuICByZWFkeTogdW5kZWZpbmVkLFxuICAvLyBjYWxsYmFjayBvbiBsYXlvdXRyZWFkeVxuICBzdG9wOiB1bmRlZmluZWQsXG4gIC8vIGNhbGxiYWNrIG9uIGxheW91dHN0b3BcbiAgdHJhbnNmb3JtOiBmdW5jdGlvbiB0cmFuc2Zvcm0obm9kZSwgcG9zaXRpb24pIHtcbiAgICByZXR1cm4gcG9zaXRpb247XG4gIH0gLy8gdHJhbnNmb3JtIGEgZ2l2ZW4gbm9kZSBwb3NpdGlvbi4gVXNlZnVsIGZvciBjaGFuZ2luZyBmbG93IGRpcmVjdGlvbiBpbiBkaXNjcmV0ZSBsYXlvdXRzIFxufTtcbmZ1bmN0aW9uIEdyaWRMYXlvdXQob3B0aW9ucykge1xuICB0aGlzLm9wdGlvbnMgPSBleHRlbmQoe30sIGRlZmF1bHRzJDMsIG9wdGlvbnMpO1xufVxuR3JpZExheW91dC5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICB2YXIgcGFyYW1zID0gdGhpcy5vcHRpb25zO1xuICB2YXIgb3B0aW9ucyA9IHBhcmFtcztcbiAgdmFyIGN5ID0gcGFyYW1zLmN5O1xuICB2YXIgZWxlcyA9IG9wdGlvbnMuZWxlcztcbiAgdmFyIG5vZGVzID0gZWxlcy5ub2RlcygpLm5vdCgnOnBhcmVudCcpO1xuICBpZiAob3B0aW9ucy5zb3J0KSB7XG4gICAgbm9kZXMgPSBub2Rlcy5zb3J0KG9wdGlvbnMuc29ydCk7XG4gIH1cbiAgdmFyIGJiID0gbWFrZUJvdW5kaW5nQm94KG9wdGlvbnMuYm91bmRpbmdCb3ggPyBvcHRpb25zLmJvdW5kaW5nQm94IDoge1xuICAgIHgxOiAwLFxuICAgIHkxOiAwLFxuICAgIHc6IGN5LndpZHRoKCksXG4gICAgaDogY3kuaGVpZ2h0KClcbiAgfSk7XG4gIGlmIChiYi5oID09PSAwIHx8IGJiLncgPT09IDApIHtcbiAgICBlbGVzLm5vZGVzKCkubGF5b3V0UG9zaXRpb25zKHRoaXMsIG9wdGlvbnMsIGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IGJiLngxLFxuICAgICAgICB5OiBiYi55MVxuICAgICAgfTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICAvLyB3aWR0aC9oZWlnaHQgKiBzcGxpdHNeMiA9IGNlbGxzIHdoZXJlIHNwbGl0cyBpcyBudW1iZXIgb2YgdGltZXMgdG8gc3BsaXQgd2lkdGhcbiAgICB2YXIgY2VsbHMgPSBub2Rlcy5zaXplKCk7XG4gICAgdmFyIHNwbGl0cyA9IE1hdGguc3FydChjZWxscyAqIGJiLmggLyBiYi53KTtcbiAgICB2YXIgcm93cyA9IE1hdGgucm91bmQoc3BsaXRzKTtcbiAgICB2YXIgY29scyA9IE1hdGgucm91bmQoYmIudyAvIGJiLmggKiBzcGxpdHMpO1xuICAgIHZhciBzbWFsbCA9IGZ1bmN0aW9uIHNtYWxsKHZhbCkge1xuICAgICAgaWYgKHZhbCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBNYXRoLm1pbihyb3dzLCBjb2xzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBtaW4gPSBNYXRoLm1pbihyb3dzLCBjb2xzKTtcbiAgICAgICAgaWYgKG1pbiA9PSByb3dzKSB7XG4gICAgICAgICAgcm93cyA9IHZhbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb2xzID0gdmFsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICB2YXIgbGFyZ2UgPSBmdW5jdGlvbiBsYXJnZSh2YWwpIHtcbiAgICAgIGlmICh2YWwgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gTWF0aC5tYXgocm93cywgY29scyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgbWF4ID0gTWF0aC5tYXgocm93cywgY29scyk7XG4gICAgICAgIGlmIChtYXggPT0gcm93cykge1xuICAgICAgICAgIHJvd3MgPSB2YWw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29scyA9IHZhbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgdmFyIG9Sb3dzID0gb3B0aW9ucy5yb3dzO1xuICAgIHZhciBvQ29scyA9IG9wdGlvbnMuY29scyAhPSBudWxsID8gb3B0aW9ucy5jb2xzIDogb3B0aW9ucy5jb2x1bW5zO1xuXG4gICAgLy8gaWYgcm93cyBvciBjb2x1bW5zIHdlcmUgc2V0IGluIG9wdGlvbnMsIHVzZSB0aG9zZSB2YWx1ZXNcbiAgICBpZiAob1Jvd3MgIT0gbnVsbCAmJiBvQ29scyAhPSBudWxsKSB7XG4gICAgICByb3dzID0gb1Jvd3M7XG4gICAgICBjb2xzID0gb0NvbHM7XG4gICAgfSBlbHNlIGlmIChvUm93cyAhPSBudWxsICYmIG9Db2xzID09IG51bGwpIHtcbiAgICAgIHJvd3MgPSBvUm93cztcbiAgICAgIGNvbHMgPSBNYXRoLmNlaWwoY2VsbHMgLyByb3dzKTtcbiAgICB9IGVsc2UgaWYgKG9Sb3dzID09IG51bGwgJiYgb0NvbHMgIT0gbnVsbCkge1xuICAgICAgY29scyA9IG9Db2xzO1xuICAgICAgcm93cyA9IE1hdGguY2VpbChjZWxscyAvIGNvbHMpO1xuICAgIH1cblxuICAgIC8vIG90aGVyd2lzZSB1c2UgdGhlIGF1dG9tYXRpYyB2YWx1ZXMgYW5kIGFkanVzdCBhY2NvcmRpbmdseVxuXG4gICAgLy8gaWYgcm91bmRpbmcgd2FzIHVwLCBzZWUgaWYgd2UgY2FuIHJlZHVjZSByb3dzIG9yIGNvbHVtbnNcbiAgICBlbHNlIGlmIChjb2xzICogcm93cyA+IGNlbGxzKSB7XG4gICAgICB2YXIgc20gPSBzbWFsbCgpO1xuICAgICAgdmFyIGxnID0gbGFyZ2UoKTtcblxuICAgICAgLy8gcmVkdWNpbmcgdGhlIHNtYWxsIHNpZGUgdGFrZXMgYXdheSB0aGUgbW9zdCBjZWxscywgc28gdHJ5IGl0IGZpcnN0XG4gICAgICBpZiAoKHNtIC0gMSkgKiBsZyA+PSBjZWxscykge1xuICAgICAgICBzbWFsbChzbSAtIDEpO1xuICAgICAgfSBlbHNlIGlmICgobGcgLSAxKSAqIHNtID49IGNlbGxzKSB7XG4gICAgICAgIGxhcmdlKGxnIC0gMSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGlmIHJvdW5kaW5nIHdhcyB0b28gbG93LCBhZGQgcm93cyBvciBjb2x1bW5zXG4gICAgICB3aGlsZSAoY29scyAqIHJvd3MgPCBjZWxscykge1xuICAgICAgICB2YXIgX3NtID0gc21hbGwoKTtcbiAgICAgICAgdmFyIF9sZyA9IGxhcmdlKCk7XG5cbiAgICAgICAgLy8gdHJ5IHRvIGFkZCB0byBsYXJnZXIgc2lkZSBmaXJzdCAoYWRkcyBsZXNzIGluIG11bHRpcGxpY2F0aW9uKVxuICAgICAgICBpZiAoKF9sZyArIDEpICogX3NtID49IGNlbGxzKSB7XG4gICAgICAgICAgbGFyZ2UoX2xnICsgMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc21hbGwoX3NtICsgMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIGNlbGxXaWR0aCA9IGJiLncgLyBjb2xzO1xuICAgIHZhciBjZWxsSGVpZ2h0ID0gYmIuaCAvIHJvd3M7XG4gICAgaWYgKG9wdGlvbnMuY29uZGVuc2UpIHtcbiAgICAgIGNlbGxXaWR0aCA9IDA7XG4gICAgICBjZWxsSGVpZ2h0ID0gMDtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuYXZvaWRPdmVybGFwKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBub2RlID0gbm9kZXNbaV07XG4gICAgICAgIHZhciBwb3MgPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uO1xuICAgICAgICBpZiAocG9zLnggPT0gbnVsbCB8fCBwb3MueSA9PSBudWxsKSB7XG4gICAgICAgICAgLy8gZm9yIGJiXG4gICAgICAgICAgcG9zLnggPSAwO1xuICAgICAgICAgIHBvcy55ID0gMDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbmJiID0gbm9kZS5sYXlvdXREaW1lbnNpb25zKG9wdGlvbnMpO1xuICAgICAgICB2YXIgcCA9IG9wdGlvbnMuYXZvaWRPdmVybGFwUGFkZGluZztcbiAgICAgICAgdmFyIHcgPSBuYmIudyArIHA7XG4gICAgICAgIHZhciBoID0gbmJiLmggKyBwO1xuICAgICAgICBjZWxsV2lkdGggPSBNYXRoLm1heChjZWxsV2lkdGgsIHcpO1xuICAgICAgICBjZWxsSGVpZ2h0ID0gTWF0aC5tYXgoY2VsbEhlaWdodCwgaCk7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBjZWxsVXNlZCA9IHt9OyAvLyBlLmcuICdjLTAtMicgPT4gdHJ1ZVxuXG4gICAgdmFyIHVzZWQgPSBmdW5jdGlvbiB1c2VkKHJvdywgY29sKSB7XG4gICAgICByZXR1cm4gY2VsbFVzZWRbJ2MtJyArIHJvdyArICctJyArIGNvbF0gPyB0cnVlIDogZmFsc2U7XG4gICAgfTtcbiAgICB2YXIgdXNlID0gZnVuY3Rpb24gdXNlKHJvdywgY29sKSB7XG4gICAgICBjZWxsVXNlZFsnYy0nICsgcm93ICsgJy0nICsgY29sXSA9IHRydWU7XG4gICAgfTtcblxuICAgIC8vIHRvIGtlZXAgdHJhY2sgb2YgY3VycmVudCBjZWxsIHBvc2l0aW9uXG4gICAgdmFyIHJvdyA9IDA7XG4gICAgdmFyIGNvbCA9IDA7XG4gICAgdmFyIG1vdmVUb05leHRDZWxsID0gZnVuY3Rpb24gbW92ZVRvTmV4dENlbGwoKSB7XG4gICAgICBjb2wrKztcbiAgICAgIGlmIChjb2wgPj0gY29scykge1xuICAgICAgICBjb2wgPSAwO1xuICAgICAgICByb3crKztcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gZ2V0IGEgY2FjaGUgb2YgYWxsIHRoZSBtYW51YWwgcG9zaXRpb25zXG4gICAgdmFyIGlkMm1hblBvcyA9IHt9O1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBub2Rlcy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBfbm9kZSA9IG5vZGVzW19pXTtcbiAgICAgIHZhciByY1BvcyA9IG9wdGlvbnMucG9zaXRpb24oX25vZGUpO1xuICAgICAgaWYgKHJjUG9zICYmIChyY1Bvcy5yb3cgIT09IHVuZGVmaW5lZCB8fCByY1Bvcy5jb2wgIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgLy8gbXVzdCBoYXZlIGF0IGxlYXN0IHJvdyBvciBjb2wgZGVmJ2RcbiAgICAgICAgdmFyIF9wb3MgPSB7XG4gICAgICAgICAgcm93OiByY1Bvcy5yb3csXG4gICAgICAgICAgY29sOiByY1Bvcy5jb2xcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKF9wb3MuY29sID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBmaW5kIHVudXNlZCBjb2xcbiAgICAgICAgICBfcG9zLmNvbCA9IDA7XG4gICAgICAgICAgd2hpbGUgKHVzZWQoX3Bvcy5yb3csIF9wb3MuY29sKSkge1xuICAgICAgICAgICAgX3Bvcy5jb2wrKztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoX3Bvcy5yb3cgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIGZpbmQgdW51c2VkIHJvd1xuICAgICAgICAgIF9wb3Mucm93ID0gMDtcbiAgICAgICAgICB3aGlsZSAodXNlZChfcG9zLnJvdywgX3Bvcy5jb2wpKSB7XG4gICAgICAgICAgICBfcG9zLnJvdysrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZDJtYW5Qb3NbX25vZGUuaWQoKV0gPSBfcG9zO1xuICAgICAgICB1c2UoX3Bvcy5yb3csIF9wb3MuY29sKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIGdldFBvcyA9IGZ1bmN0aW9uIGdldFBvcyhlbGVtZW50LCBpKSB7XG4gICAgICB2YXIgeCwgeTtcbiAgICAgIGlmIChlbGVtZW50LmxvY2tlZCgpIHx8IGVsZW1lbnQuaXNQYXJlbnQoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIHNlZSBpZiB3ZSBoYXZlIGEgbWFudWFsIHBvc2l0aW9uIHNldFxuICAgICAgdmFyIHJjUG9zID0gaWQybWFuUG9zW2VsZW1lbnQuaWQoKV07XG4gICAgICBpZiAocmNQb3MpIHtcbiAgICAgICAgeCA9IHJjUG9zLmNvbCAqIGNlbGxXaWR0aCArIGNlbGxXaWR0aCAvIDIgKyBiYi54MTtcbiAgICAgICAgeSA9IHJjUG9zLnJvdyAqIGNlbGxIZWlnaHQgKyBjZWxsSGVpZ2h0IC8gMiArIGJiLnkxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gb3RoZXJ3aXNlIHNldCBhdXRvbWF0aWNhbGx5XG5cbiAgICAgICAgd2hpbGUgKHVzZWQocm93LCBjb2wpKSB7XG4gICAgICAgICAgbW92ZVRvTmV4dENlbGwoKTtcbiAgICAgICAgfVxuICAgICAgICB4ID0gY29sICogY2VsbFdpZHRoICsgY2VsbFdpZHRoIC8gMiArIGJiLngxO1xuICAgICAgICB5ID0gcm93ICogY2VsbEhlaWdodCArIGNlbGxIZWlnaHQgLyAyICsgYmIueTE7XG4gICAgICAgIHVzZShyb3csIGNvbCk7XG4gICAgICAgIG1vdmVUb05leHRDZWxsKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4OiB4LFxuICAgICAgICB5OiB5XG4gICAgICB9O1xuICAgIH07XG4gICAgbm9kZXMubGF5b3V0UG9zaXRpb25zKHRoaXMsIG9wdGlvbnMsIGdldFBvcyk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG59O1xuXG4vLyBkZWZhdWx0IGxheW91dCBvcHRpb25zXG52YXIgZGVmYXVsdHMkMiA9IHtcbiAgcmVhZHk6IGZ1bmN0aW9uIHJlYWR5KCkge30sXG4gIC8vIG9uIGxheW91dHJlYWR5XG4gIHN0b3A6IGZ1bmN0aW9uIHN0b3AoKSB7fSAvLyBvbiBsYXlvdXRzdG9wXG59O1xuXG4vLyBjb25zdHJ1Y3RvclxuLy8gb3B0aW9ucyA6IG9iamVjdCBjb250YWluaW5nIGxheW91dCBvcHRpb25zXG5mdW5jdGlvbiBOdWxsTGF5b3V0KG9wdGlvbnMpIHtcbiAgdGhpcy5vcHRpb25zID0gZXh0ZW5kKHt9LCBkZWZhdWx0cyQyLCBvcHRpb25zKTtcbn1cblxuLy8gcnVucyB0aGUgbGF5b3V0XG5OdWxsTGF5b3V0LnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICB2YXIgZWxlcyA9IG9wdGlvbnMuZWxlczsgLy8gZWxlbWVudHMgdG8gY29uc2lkZXIgaW4gdGhlIGxheW91dFxuICB2YXIgbGF5b3V0ID0gdGhpcztcblxuICAvLyBjeSBpcyBhdXRvbWF0aWNhbGx5IHBvcHVsYXRlZCBmb3IgdXMgaW4gdGhlIGNvbnN0cnVjdG9yXG4gIC8vIChkaXNhYmxlIGVzbGludCBmb3IgbmV4dCBsaW5lIGFzIHRoaXMgc2VydmVzIGFzIGV4YW1wbGUgbGF5b3V0IGNvZGUgdG8gZXh0ZXJuYWwgZGV2ZWxvcGVycylcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIG9wdGlvbnMuY3k7XG4gIGxheW91dC5lbWl0KCdsYXlvdXRzdGFydCcpO1xuXG4gIC8vIHB1dHMgYWxsIG5vZGVzIGF0ICgwLCAwKVxuICAvLyBuLmIuIG1vc3QgbGF5b3V0cyB3b3VsZCB1c2UgbGF5b3V0UG9zaXRpb25zKCksIGluc3RlYWQgb2YgcG9zaXRpb25zKCkgYW5kIG1hbnVhbCBldmVudHNcbiAgZWxlcy5ub2RlcygpLnBvc2l0aW9ucyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IDAsXG4gICAgICB5OiAwXG4gICAgfTtcbiAgfSk7XG5cbiAgLy8gdHJpZ2dlciBsYXlvdXRyZWFkeSB3aGVuIGVhY2ggbm9kZSBoYXMgaGFkIGl0cyBwb3NpdGlvbiBzZXQgYXQgbGVhc3Qgb25jZVxuICBsYXlvdXQub25lKCdsYXlvdXRyZWFkeScsIG9wdGlvbnMucmVhZHkpO1xuICBsYXlvdXQuZW1pdCgnbGF5b3V0cmVhZHknKTtcblxuICAvLyB0cmlnZ2VyIGxheW91dHN0b3Agd2hlbiB0aGUgbGF5b3V0IHN0b3BzIChlLmcuIGZpbmlzaGVzKVxuICBsYXlvdXQub25lKCdsYXlvdXRzdG9wJywgb3B0aW9ucy5zdG9wKTtcbiAgbGF5b3V0LmVtaXQoJ2xheW91dHN0b3AnKTtcbiAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG59O1xuXG4vLyBjYWxsZWQgb24gY29udGludW91cyBsYXlvdXRzIHRvIHN0b3AgdGhlbSBiZWZvcmUgdGhleSBmaW5pc2hcbk51bGxMYXlvdXQucHJvdG90eXBlLnN0b3AgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xufTtcblxudmFyIGRlZmF1bHRzJDEgPSB7XG4gIHBvc2l0aW9uczogdW5kZWZpbmVkLFxuICAvLyBtYXAgb2YgKG5vZGUgaWQpID0+IChwb3NpdGlvbiBvYmopOyBvciBmdW5jdGlvbihub2RlKXsgcmV0dXJuIHNvbVBvczsgfVxuICB6b29tOiB1bmRlZmluZWQsXG4gIC8vIHRoZSB6b29tIGxldmVsIHRvIHNldCAocHJvYiB3YW50IGZpdCA9IGZhbHNlIGlmIHNldClcbiAgcGFuOiB1bmRlZmluZWQsXG4gIC8vIHRoZSBwYW4gbGV2ZWwgdG8gc2V0IChwcm9iIHdhbnQgZml0ID0gZmFsc2UgaWYgc2V0KVxuICBmaXQ6IHRydWUsXG4gIC8vIHdoZXRoZXIgdG8gZml0IHRvIHZpZXdwb3J0XG4gIHBhZGRpbmc6IDMwLFxuICAvLyBwYWRkaW5nIG9uIGZpdFxuICBzcGFjaW5nRmFjdG9yOiB1bmRlZmluZWQsXG4gIC8vIEFwcGxpZXMgYSBtdWx0aXBsaWNhdGl2ZSBmYWN0b3IgKD4wKSB0byBleHBhbmQgb3IgY29tcHJlc3MgdGhlIG92ZXJhbGwgYXJlYSB0aGF0IHRoZSBub2RlcyB0YWtlIHVwXG4gIGFuaW1hdGU6IGZhbHNlLFxuICAvLyB3aGV0aGVyIHRvIHRyYW5zaXRpb24gdGhlIG5vZGUgcG9zaXRpb25zXG4gIGFuaW1hdGlvbkR1cmF0aW9uOiA1MDAsXG4gIC8vIGR1cmF0aW9uIG9mIGFuaW1hdGlvbiBpbiBtcyBpZiBlbmFibGVkXG4gIGFuaW1hdGlvbkVhc2luZzogdW5kZWZpbmVkLFxuICAvLyBlYXNpbmcgb2YgYW5pbWF0aW9uIGlmIGVuYWJsZWRcbiAgYW5pbWF0ZUZpbHRlcjogZnVuY3Rpb24gYW5pbWF0ZUZpbHRlcihub2RlLCBpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIC8vIGEgZnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIG5vZGUgc2hvdWxkIGJlIGFuaW1hdGVkLiAgQWxsIG5vZGVzIGFuaW1hdGVkIGJ5IGRlZmF1bHQgb24gYW5pbWF0ZSBlbmFibGVkLiAgTm9uLWFuaW1hdGVkIG5vZGVzIGFyZSBwb3NpdGlvbmVkIGltbWVkaWF0ZWx5IHdoZW4gdGhlIGxheW91dCBzdGFydHNcbiAgcmVhZHk6IHVuZGVmaW5lZCxcbiAgLy8gY2FsbGJhY2sgb24gbGF5b3V0cmVhZHlcbiAgc3RvcDogdW5kZWZpbmVkLFxuICAvLyBjYWxsYmFjayBvbiBsYXlvdXRzdG9wXG4gIHRyYW5zZm9ybTogZnVuY3Rpb24gdHJhbnNmb3JtKG5vZGUsIHBvc2l0aW9uKSB7XG4gICAgcmV0dXJuIHBvc2l0aW9uO1xuICB9IC8vIHRyYW5zZm9ybSBhIGdpdmVuIG5vZGUgcG9zaXRpb24uIFVzZWZ1bCBmb3IgY2hhbmdpbmcgZmxvdyBkaXJlY3Rpb24gaW4gZGlzY3JldGUgbGF5b3V0c1xufTtcbmZ1bmN0aW9uIFByZXNldExheW91dChvcHRpb25zKSB7XG4gIHRoaXMub3B0aW9ucyA9IGV4dGVuZCh7fSwgZGVmYXVsdHMkMSwgb3B0aW9ucyk7XG59XG5QcmVzZXRMYXlvdXQucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gIHZhciBlbGVzID0gb3B0aW9ucy5lbGVzO1xuICB2YXIgbm9kZXMgPSBlbGVzLm5vZGVzKCk7XG4gIHZhciBwb3NJc0ZuID0gZm4kNihvcHRpb25zLnBvc2l0aW9ucyk7XG4gIGZ1bmN0aW9uIGdldFBvc2l0aW9uKG5vZGUpIHtcbiAgICBpZiAob3B0aW9ucy5wb3NpdGlvbnMgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGNvcHlQb3NpdGlvbihub2RlLnBvc2l0aW9uKCkpO1xuICAgIH1cbiAgICBpZiAocG9zSXNGbikge1xuICAgICAgcmV0dXJuIG9wdGlvbnMucG9zaXRpb25zKG5vZGUpO1xuICAgIH1cbiAgICB2YXIgcG9zID0gb3B0aW9ucy5wb3NpdGlvbnNbbm9kZS5fcHJpdmF0ZS5kYXRhLmlkXTtcbiAgICBpZiAocG9zID09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gcG9zO1xuICB9XG4gIG5vZGVzLmxheW91dFBvc2l0aW9ucyh0aGlzLCBvcHRpb25zLCBmdW5jdGlvbiAobm9kZSwgaSkge1xuICAgIHZhciBwb3NpdGlvbiA9IGdldFBvc2l0aW9uKG5vZGUpO1xuICAgIGlmIChub2RlLmxvY2tlZCgpIHx8IHBvc2l0aW9uID09IG51bGwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHBvc2l0aW9uO1xuICB9KTtcbiAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG59O1xuXG52YXIgZGVmYXVsdHMgPSB7XG4gIGZpdDogdHJ1ZSxcbiAgLy8gd2hldGhlciB0byBmaXQgdG8gdmlld3BvcnRcbiAgcGFkZGluZzogMzAsXG4gIC8vIGZpdCBwYWRkaW5nXG4gIGJvdW5kaW5nQm94OiB1bmRlZmluZWQsXG4gIC8vIGNvbnN0cmFpbiBsYXlvdXQgYm91bmRzOyB7IHgxLCB5MSwgeDIsIHkyIH0gb3IgeyB4MSwgeTEsIHcsIGggfVxuICBhbmltYXRlOiBmYWxzZSxcbiAgLy8gd2hldGhlciB0byB0cmFuc2l0aW9uIHRoZSBub2RlIHBvc2l0aW9uc1xuICBhbmltYXRpb25EdXJhdGlvbjogNTAwLFxuICAvLyBkdXJhdGlvbiBvZiBhbmltYXRpb24gaW4gbXMgaWYgZW5hYmxlZFxuICBhbmltYXRpb25FYXNpbmc6IHVuZGVmaW5lZCxcbiAgLy8gZWFzaW5nIG9mIGFuaW1hdGlvbiBpZiBlbmFibGVkXG4gIGFuaW1hdGVGaWx0ZXI6IGZ1bmN0aW9uIGFuaW1hdGVGaWx0ZXIobm9kZSwgaSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICAvLyBhIGZ1bmN0aW9uIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBub2RlIHNob3VsZCBiZSBhbmltYXRlZC4gIEFsbCBub2RlcyBhbmltYXRlZCBieSBkZWZhdWx0IG9uIGFuaW1hdGUgZW5hYmxlZC4gIE5vbi1hbmltYXRlZCBub2RlcyBhcmUgcG9zaXRpb25lZCBpbW1lZGlhdGVseSB3aGVuIHRoZSBsYXlvdXQgc3RhcnRzXG4gIHJlYWR5OiB1bmRlZmluZWQsXG4gIC8vIGNhbGxiYWNrIG9uIGxheW91dHJlYWR5XG4gIHN0b3A6IHVuZGVmaW5lZCxcbiAgLy8gY2FsbGJhY2sgb24gbGF5b3V0c3RvcFxuICB0cmFuc2Zvcm06IGZ1bmN0aW9uIHRyYW5zZm9ybShub2RlLCBwb3NpdGlvbikge1xuICAgIHJldHVybiBwb3NpdGlvbjtcbiAgfSAvLyB0cmFuc2Zvcm0gYSBnaXZlbiBub2RlIHBvc2l0aW9uLiBVc2VmdWwgZm9yIGNoYW5naW5nIGZsb3cgZGlyZWN0aW9uIGluIGRpc2NyZXRlIGxheW91dHMgXG59O1xuZnVuY3Rpb24gUmFuZG9tTGF5b3V0KG9wdGlvbnMpIHtcbiAgdGhpcy5vcHRpb25zID0gZXh0ZW5kKHt9LCBkZWZhdWx0cywgb3B0aW9ucyk7XG59XG5SYW5kb21MYXlvdXQucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gIHZhciBjeSA9IG9wdGlvbnMuY3k7XG4gIHZhciBlbGVzID0gb3B0aW9ucy5lbGVzO1xuICB2YXIgYmIgPSBtYWtlQm91bmRpbmdCb3gob3B0aW9ucy5ib3VuZGluZ0JveCA/IG9wdGlvbnMuYm91bmRpbmdCb3ggOiB7XG4gICAgeDE6IDAsXG4gICAgeTE6IDAsXG4gICAgdzogY3kud2lkdGgoKSxcbiAgICBoOiBjeS5oZWlnaHQoKVxuICB9KTtcbiAgdmFyIGdldFBvcyA9IGZ1bmN0aW9uIGdldFBvcyhub2RlLCBpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IGJiLngxICsgTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpICogYmIudyksXG4gICAgICB5OiBiYi55MSArIE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSAqIGJiLmgpXG4gICAgfTtcbiAgfTtcbiAgZWxlcy5ub2RlcygpLmxheW91dFBvc2l0aW9ucyh0aGlzLCBvcHRpb25zLCBnZXRQb3MpO1xuICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbn07XG5cbnZhciBsYXlvdXQgPSBbe1xuICBuYW1lOiAnYnJlYWR0aGZpcnN0JyxcbiAgaW1wbDogQnJlYWR0aEZpcnN0TGF5b3V0XG59LCB7XG4gIG5hbWU6ICdjaXJjbGUnLFxuICBpbXBsOiBDaXJjbGVMYXlvdXRcbn0sIHtcbiAgbmFtZTogJ2NvbmNlbnRyaWMnLFxuICBpbXBsOiBDb25jZW50cmljTGF5b3V0XG59LCB7XG4gIG5hbWU6ICdjb3NlJyxcbiAgaW1wbDogQ29zZUxheW91dFxufSwge1xuICBuYW1lOiAnZ3JpZCcsXG4gIGltcGw6IEdyaWRMYXlvdXRcbn0sIHtcbiAgbmFtZTogJ251bGwnLFxuICBpbXBsOiBOdWxsTGF5b3V0XG59LCB7XG4gIG5hbWU6ICdwcmVzZXQnLFxuICBpbXBsOiBQcmVzZXRMYXlvdXRcbn0sIHtcbiAgbmFtZTogJ3JhbmRvbScsXG4gIGltcGw6IFJhbmRvbUxheW91dFxufV07XG5cbmZ1bmN0aW9uIE51bGxSZW5kZXJlcihvcHRpb25zKSB7XG4gIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gIHRoaXMubm90aWZpY2F0aW9ucyA9IDA7IC8vIGZvciB0ZXN0aW5nXG59XG52YXIgbm9vcCA9IGZ1bmN0aW9uIG5vb3AoKSB7fTtcbnZhciB0aHJvd0ltZ0VyciA9IGZ1bmN0aW9uIHRocm93SW1nRXJyKCkge1xuICB0aHJvdyBuZXcgRXJyb3IoJ0EgaGVhZGxlc3MgaW5zdGFuY2UgY2FuIG5vdCByZW5kZXIgaW1hZ2VzJyk7XG59O1xuTnVsbFJlbmRlcmVyLnByb3RvdHlwZSA9IHtcbiAgcmVjYWxjdWxhdGVSZW5kZXJlZFN0eWxlOiBub29wLFxuICBub3RpZnk6IGZ1bmN0aW9uIG5vdGlmeSgpIHtcbiAgICB0aGlzLm5vdGlmaWNhdGlvbnMrKztcbiAgfSxcbiAgaW5pdDogbm9vcCxcbiAgaXNIZWFkbGVzczogZnVuY3Rpb24gaXNIZWFkbGVzcygpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgcG5nOiB0aHJvd0ltZ0VycixcbiAganBnOiB0aHJvd0ltZ0VyclxufTtcblxudmFyIEJScCRmID0ge307XG5CUnAkZi5hcnJvd1NoYXBlV2lkdGggPSAwLjM7XG5CUnAkZi5yZWdpc3RlckFycm93U2hhcGVzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgYXJyb3dTaGFwZXMgPSB0aGlzLmFycm93U2hhcGVzID0ge307XG4gIHZhciByZW5kZXJlciA9IHRoaXM7XG5cbiAgLy8gQ29udHJhY3QgZm9yIGFycm93IHNoYXBlczpcbiAgLy8gMCwgMCBpcyBhcnJvdyB0aXBcbiAgLy8gKDAsIDEpIGlzIGRpcmVjdGlvbiB0b3dhcmRzIG5vZGVcbiAgLy8gKDEsIDApIGlzIHJpZ2h0XG4gIC8vXG4gIC8vIGZ1bmN0aW9uYWwgYXBpOlxuICAvLyBjb2xsaWRlOiBjaGVjayB4LCB5IGluIHNoYXBlXG4gIC8vIHJvdWdoQ29sbGlkZTogY2FsbGVkIGJlZm9yZSBjb2xsaWRlLCBubyBmYWxzZSBuZWdhdGl2ZXNcbiAgLy8gZHJhdzogZHJhd1xuICAvLyBzcGFjaW5nOiBkaXN0KGFycm93VGlwLCBub2RlQm91bmRhcnkpXG4gIC8vIGdhcDogZGlzdChlZGdlVGlwLCBub2RlQm91bmRhcnkpLCBlZGdlVGlwIG1heSAhPSBhcnJvd1RpcFxuXG4gIHZhciBiYkNvbGxpZGUgPSBmdW5jdGlvbiBiYkNvbGxpZGUoeCwgeSwgc2l6ZSwgYW5nbGUsIHRyYW5zbGF0aW9uLCBlZGdlV2lkdGgsIHBhZGRpbmcpIHtcbiAgICB2YXIgeDEgPSB0cmFuc2xhdGlvbi54IC0gc2l6ZSAvIDIgLSBwYWRkaW5nO1xuICAgIHZhciB4MiA9IHRyYW5zbGF0aW9uLnggKyBzaXplIC8gMiArIHBhZGRpbmc7XG4gICAgdmFyIHkxID0gdHJhbnNsYXRpb24ueSAtIHNpemUgLyAyIC0gcGFkZGluZztcbiAgICB2YXIgeTIgPSB0cmFuc2xhdGlvbi55ICsgc2l6ZSAvIDIgKyBwYWRkaW5nO1xuICAgIHZhciBpbnNpZGUgPSB4MSA8PSB4ICYmIHggPD0geDIgJiYgeTEgPD0geSAmJiB5IDw9IHkyO1xuICAgIHJldHVybiBpbnNpZGU7XG4gIH07XG4gIHZhciB0cmFuc2Zvcm0gPSBmdW5jdGlvbiB0cmFuc2Zvcm0oeCwgeSwgc2l6ZSwgYW5nbGUsIHRyYW5zbGF0aW9uKSB7XG4gICAgdmFyIHhSb3RhdGVkID0geCAqIE1hdGguY29zKGFuZ2xlKSAtIHkgKiBNYXRoLnNpbihhbmdsZSk7XG4gICAgdmFyIHlSb3RhdGVkID0geCAqIE1hdGguc2luKGFuZ2xlKSArIHkgKiBNYXRoLmNvcyhhbmdsZSk7XG4gICAgdmFyIHhTY2FsZWQgPSB4Um90YXRlZCAqIHNpemU7XG4gICAgdmFyIHlTY2FsZWQgPSB5Um90YXRlZCAqIHNpemU7XG4gICAgdmFyIHhUcmFuc2xhdGVkID0geFNjYWxlZCArIHRyYW5zbGF0aW9uLng7XG4gICAgdmFyIHlUcmFuc2xhdGVkID0geVNjYWxlZCArIHRyYW5zbGF0aW9uLnk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IHhUcmFuc2xhdGVkLFxuICAgICAgeTogeVRyYW5zbGF0ZWRcbiAgICB9O1xuICB9O1xuICB2YXIgdHJhbnNmb3JtUG9pbnRzID0gZnVuY3Rpb24gdHJhbnNmb3JtUG9pbnRzKHB0cywgc2l6ZSwgYW5nbGUsIHRyYW5zbGF0aW9uKSB7XG4gICAgdmFyIHJldFB0cyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHRzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICB2YXIgeCA9IHB0c1tpXTtcbiAgICAgIHZhciB5ID0gcHRzW2kgKyAxXTtcbiAgICAgIHJldFB0cy5wdXNoKHRyYW5zZm9ybSh4LCB5LCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24pKTtcbiAgICB9XG4gICAgcmV0dXJuIHJldFB0cztcbiAgfTtcbiAgdmFyIHBvaW50c1RvQXJyID0gZnVuY3Rpb24gcG9pbnRzVG9BcnIocHRzKSB7XG4gICAgdmFyIHJldCA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcCA9IHB0c1tpXTtcbiAgICAgIHJldC5wdXNoKHAueCwgcC55KTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfTtcbiAgdmFyIHN0YW5kYXJkR2FwID0gZnVuY3Rpb24gc3RhbmRhcmRHYXAoZWRnZSkge1xuICAgIHJldHVybiBlZGdlLnBzdHlsZSgnd2lkdGgnKS5wZlZhbHVlICogZWRnZS5wc3R5bGUoJ2Fycm93LXNjYWxlJykucGZWYWx1ZSAqIDI7XG4gIH07XG4gIHZhciBkZWZpbmVBcnJvd1NoYXBlID0gZnVuY3Rpb24gZGVmaW5lQXJyb3dTaGFwZShuYW1lLCBkZWZuKSB7XG4gICAgaWYgKHN0cmluZyhkZWZuKSkge1xuICAgICAgZGVmbiA9IGFycm93U2hhcGVzW2RlZm5dO1xuICAgIH1cbiAgICBhcnJvd1NoYXBlc1tuYW1lXSA9IGV4dGVuZCh7XG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgcG9pbnRzOiBbLTAuMTUsIC0wLjMsIDAuMTUsIC0wLjMsIDAuMTUsIDAuMywgLTAuMTUsIDAuM10sXG4gICAgICBjb2xsaWRlOiBmdW5jdGlvbiBjb2xsaWRlKHgsIHksIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbiwgcGFkZGluZykge1xuICAgICAgICB2YXIgcG9pbnRzID0gcG9pbnRzVG9BcnIodHJhbnNmb3JtUG9pbnRzKHRoaXMucG9pbnRzLCBzaXplICsgMiAqIHBhZGRpbmcsIGFuZ2xlLCB0cmFuc2xhdGlvbikpO1xuICAgICAgICB2YXIgaW5zaWRlID0gcG9pbnRJbnNpZGVQb2x5Z29uUG9pbnRzKHgsIHksIHBvaW50cyk7XG4gICAgICAgIHJldHVybiBpbnNpZGU7XG4gICAgICB9LFxuICAgICAgcm91Z2hDb2xsaWRlOiBiYkNvbGxpZGUsXG4gICAgICBkcmF3OiBmdW5jdGlvbiBkcmF3KGNvbnRleHQsIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbikge1xuICAgICAgICB2YXIgcG9pbnRzID0gdHJhbnNmb3JtUG9pbnRzKHRoaXMucG9pbnRzLCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24pO1xuICAgICAgICByZW5kZXJlci5hcnJvd1NoYXBlSW1wbCgncG9seWdvbicpKGNvbnRleHQsIHBvaW50cyk7XG4gICAgICB9LFxuICAgICAgc3BhY2luZzogZnVuY3Rpb24gc3BhY2luZyhlZGdlKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfSxcbiAgICAgIGdhcDogc3RhbmRhcmRHYXBcbiAgICB9LCBkZWZuKTtcbiAgfTtcbiAgZGVmaW5lQXJyb3dTaGFwZSgnbm9uZScsIHtcbiAgICBjb2xsaWRlOiBmYWxzaWZ5LFxuICAgIHJvdWdoQ29sbGlkZTogZmFsc2lmeSxcbiAgICBkcmF3OiBub29wJDEsXG4gICAgc3BhY2luZzogemVyb2lmeSxcbiAgICBnYXA6IHplcm9pZnlcbiAgfSk7XG4gIGRlZmluZUFycm93U2hhcGUoJ3RyaWFuZ2xlJywge1xuICAgIHBvaW50czogWy0wLjE1LCAtMC4zLCAwLCAwLCAwLjE1LCAtMC4zXVxuICB9KTtcbiAgZGVmaW5lQXJyb3dTaGFwZSgnYXJyb3cnLCAndHJpYW5nbGUnKTtcbiAgZGVmaW5lQXJyb3dTaGFwZSgndHJpYW5nbGUtYmFja2N1cnZlJywge1xuICAgIHBvaW50czogYXJyb3dTaGFwZXNbJ3RyaWFuZ2xlJ10ucG9pbnRzLFxuICAgIGNvbnRyb2xQb2ludDogWzAsIC0wLjE1XSxcbiAgICByb3VnaENvbGxpZGU6IGJiQ29sbGlkZSxcbiAgICBkcmF3OiBmdW5jdGlvbiBkcmF3KGNvbnRleHQsIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbiwgZWRnZVdpZHRoKSB7XG4gICAgICB2YXIgcHRzVHJhbnMgPSB0cmFuc2Zvcm1Qb2ludHModGhpcy5wb2ludHMsIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbik7XG4gICAgICB2YXIgY3RybFB0ID0gdGhpcy5jb250cm9sUG9pbnQ7XG4gICAgICB2YXIgY3RybFB0VHJhbnMgPSB0cmFuc2Zvcm0oY3RybFB0WzBdLCBjdHJsUHRbMV0sIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbik7XG4gICAgICByZW5kZXJlci5hcnJvd1NoYXBlSW1wbCh0aGlzLm5hbWUpKGNvbnRleHQsIHB0c1RyYW5zLCBjdHJsUHRUcmFucyk7XG4gICAgfSxcbiAgICBnYXA6IGZ1bmN0aW9uIGdhcChlZGdlKSB7XG4gICAgICByZXR1cm4gc3RhbmRhcmRHYXAoZWRnZSkgKiAwLjg7XG4gICAgfVxuICB9KTtcbiAgZGVmaW5lQXJyb3dTaGFwZSgndHJpYW5nbGUtdGVlJywge1xuICAgIHBvaW50czogWzAsIDAsIDAuMTUsIC0wLjMsIC0wLjE1LCAtMC4zLCAwLCAwXSxcbiAgICBwb2ludHNUZWU6IFstMC4xNSwgLTAuNCwgLTAuMTUsIC0wLjUsIDAuMTUsIC0wLjUsIDAuMTUsIC0wLjRdLFxuICAgIGNvbGxpZGU6IGZ1bmN0aW9uIGNvbGxpZGUoeCwgeSwgc2l6ZSwgYW5nbGUsIHRyYW5zbGF0aW9uLCBlZGdlV2lkdGgsIHBhZGRpbmcpIHtcbiAgICAgIHZhciB0cmlQdHMgPSBwb2ludHNUb0Fycih0cmFuc2Zvcm1Qb2ludHModGhpcy5wb2ludHMsIHNpemUgKyAyICogcGFkZGluZywgYW5nbGUsIHRyYW5zbGF0aW9uKSk7XG4gICAgICB2YXIgdGVlUHRzID0gcG9pbnRzVG9BcnIodHJhbnNmb3JtUG9pbnRzKHRoaXMucG9pbnRzVGVlLCBzaXplICsgMiAqIHBhZGRpbmcsIGFuZ2xlLCB0cmFuc2xhdGlvbikpO1xuICAgICAgdmFyIGluc2lkZSA9IHBvaW50SW5zaWRlUG9seWdvblBvaW50cyh4LCB5LCB0cmlQdHMpIHx8IHBvaW50SW5zaWRlUG9seWdvblBvaW50cyh4LCB5LCB0ZWVQdHMpO1xuICAgICAgcmV0dXJuIGluc2lkZTtcbiAgICB9LFxuICAgIGRyYXc6IGZ1bmN0aW9uIGRyYXcoY29udGV4dCwgc2l6ZSwgYW5nbGUsIHRyYW5zbGF0aW9uLCBlZGdlV2lkdGgpIHtcbiAgICAgIHZhciB0cmlQdHMgPSB0cmFuc2Zvcm1Qb2ludHModGhpcy5wb2ludHMsIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbik7XG4gICAgICB2YXIgdGVlUHRzID0gdHJhbnNmb3JtUG9pbnRzKHRoaXMucG9pbnRzVGVlLCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24pO1xuICAgICAgcmVuZGVyZXIuYXJyb3dTaGFwZUltcGwodGhpcy5uYW1lKShjb250ZXh0LCB0cmlQdHMsIHRlZVB0cyk7XG4gICAgfVxuICB9KTtcbiAgZGVmaW5lQXJyb3dTaGFwZSgnY2lyY2xlLXRyaWFuZ2xlJywge1xuICAgIHJhZGl1czogMC4xNSxcbiAgICBwb2ludHNUcjogWzAsIC0wLjE1LCAwLjE1LCAtMC40NSwgLTAuMTUsIC0wLjQ1LCAwLCAtMC4xNV0sXG4gICAgY29sbGlkZTogZnVuY3Rpb24gY29sbGlkZSh4LCB5LCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24sIGVkZ2VXaWR0aCwgcGFkZGluZykge1xuICAgICAgdmFyIHQgPSB0cmFuc2xhdGlvbjtcbiAgICAgIHZhciBjaXJjbGVJbnNpZGUgPSBNYXRoLnBvdyh0LnggLSB4LCAyKSArIE1hdGgucG93KHQueSAtIHksIDIpIDw9IE1hdGgucG93KChzaXplICsgMiAqIHBhZGRpbmcpICogdGhpcy5yYWRpdXMsIDIpO1xuICAgICAgdmFyIHRyaVB0cyA9IHBvaW50c1RvQXJyKHRyYW5zZm9ybVBvaW50cyh0aGlzLnBvaW50cywgc2l6ZSArIDIgKiBwYWRkaW5nLCBhbmdsZSwgdHJhbnNsYXRpb24pKTtcbiAgICAgIHJldHVybiBwb2ludEluc2lkZVBvbHlnb25Qb2ludHMoeCwgeSwgdHJpUHRzKSB8fCBjaXJjbGVJbnNpZGU7XG4gICAgfSxcbiAgICBkcmF3OiBmdW5jdGlvbiBkcmF3KGNvbnRleHQsIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbiwgZWRnZVdpZHRoKSB7XG4gICAgICB2YXIgdHJpUHRzID0gdHJhbnNmb3JtUG9pbnRzKHRoaXMucG9pbnRzVHIsIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbik7XG4gICAgICByZW5kZXJlci5hcnJvd1NoYXBlSW1wbCh0aGlzLm5hbWUpKGNvbnRleHQsIHRyaVB0cywgdHJhbnNsYXRpb24ueCwgdHJhbnNsYXRpb24ueSwgdGhpcy5yYWRpdXMgKiBzaXplKTtcbiAgICB9LFxuICAgIHNwYWNpbmc6IGZ1bmN0aW9uIHNwYWNpbmcoZWRnZSkge1xuICAgICAgcmV0dXJuIHJlbmRlcmVyLmdldEFycm93V2lkdGgoZWRnZS5wc3R5bGUoJ3dpZHRoJykucGZWYWx1ZSwgZWRnZS5wc3R5bGUoJ2Fycm93LXNjYWxlJykudmFsdWUpICogdGhpcy5yYWRpdXM7XG4gICAgfVxuICB9KTtcbiAgZGVmaW5lQXJyb3dTaGFwZSgndHJpYW5nbGUtY3Jvc3MnLCB7XG4gICAgcG9pbnRzOiBbMCwgMCwgMC4xNSwgLTAuMywgLTAuMTUsIC0wLjMsIDAsIDBdLFxuICAgIGJhc2VDcm9zc0xpbmVQdHM6IFstMC4xNSwgLTAuNCxcbiAgICAvLyBmaXJzdCBoYWxmIG9mIHRoZSByZWN0YW5nbGVcbiAgICAtMC4xNSwgLTAuNCwgMC4xNSwgLTAuNCxcbiAgICAvLyBzZWNvbmQgaGFsZiBvZiB0aGUgcmVjdGFuZ2xlXG4gICAgMC4xNSwgLTAuNF0sXG4gICAgY3Jvc3NMaW5lUHRzOiBmdW5jdGlvbiBjcm9zc0xpbmVQdHMoc2l6ZSwgZWRnZVdpZHRoKSB7XG4gICAgICAvLyBzaGlmdCBwb2ludHMgc28gdGhhdCB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgY3Jvc3MgcG9pbnRzIG1hdGNoZXMgZWRnZSB3aWR0aFxuICAgICAgdmFyIHAgPSB0aGlzLmJhc2VDcm9zc0xpbmVQdHMuc2xpY2UoKTtcbiAgICAgIHZhciBzaGlmdEZhY3RvciA9IGVkZ2VXaWR0aCAvIHNpemU7XG4gICAgICB2YXIgeTAgPSAzO1xuICAgICAgdmFyIHkxID0gNTtcbiAgICAgIHBbeTBdID0gcFt5MF0gLSBzaGlmdEZhY3RvcjtcbiAgICAgIHBbeTFdID0gcFt5MV0gLSBzaGlmdEZhY3RvcjtcbiAgICAgIHJldHVybiBwO1xuICAgIH0sXG4gICAgY29sbGlkZTogZnVuY3Rpb24gY29sbGlkZSh4LCB5LCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24sIGVkZ2VXaWR0aCwgcGFkZGluZykge1xuICAgICAgdmFyIHRyaVB0cyA9IHBvaW50c1RvQXJyKHRyYW5zZm9ybVBvaW50cyh0aGlzLnBvaW50cywgc2l6ZSArIDIgKiBwYWRkaW5nLCBhbmdsZSwgdHJhbnNsYXRpb24pKTtcbiAgICAgIHZhciB0ZWVQdHMgPSBwb2ludHNUb0Fycih0cmFuc2Zvcm1Qb2ludHModGhpcy5jcm9zc0xpbmVQdHMoc2l6ZSwgZWRnZVdpZHRoKSwgc2l6ZSArIDIgKiBwYWRkaW5nLCBhbmdsZSwgdHJhbnNsYXRpb24pKTtcbiAgICAgIHZhciBpbnNpZGUgPSBwb2ludEluc2lkZVBvbHlnb25Qb2ludHMoeCwgeSwgdHJpUHRzKSB8fCBwb2ludEluc2lkZVBvbHlnb25Qb2ludHMoeCwgeSwgdGVlUHRzKTtcbiAgICAgIHJldHVybiBpbnNpZGU7XG4gICAgfSxcbiAgICBkcmF3OiBmdW5jdGlvbiBkcmF3KGNvbnRleHQsIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbiwgZWRnZVdpZHRoKSB7XG4gICAgICB2YXIgdHJpUHRzID0gdHJhbnNmb3JtUG9pbnRzKHRoaXMucG9pbnRzLCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24pO1xuICAgICAgdmFyIGNyb3NzTGluZVB0cyA9IHRyYW5zZm9ybVBvaW50cyh0aGlzLmNyb3NzTGluZVB0cyhzaXplLCBlZGdlV2lkdGgpLCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24pO1xuICAgICAgcmVuZGVyZXIuYXJyb3dTaGFwZUltcGwodGhpcy5uYW1lKShjb250ZXh0LCB0cmlQdHMsIGNyb3NzTGluZVB0cyk7XG4gICAgfVxuICB9KTtcbiAgZGVmaW5lQXJyb3dTaGFwZSgndmVlJywge1xuICAgIHBvaW50czogWy0wLjE1LCAtMC4zLCAwLCAwLCAwLjE1LCAtMC4zLCAwLCAtMC4xNV0sXG4gICAgZ2FwOiBmdW5jdGlvbiBnYXAoZWRnZSkge1xuICAgICAgcmV0dXJuIHN0YW5kYXJkR2FwKGVkZ2UpICogMC41MjU7XG4gICAgfVxuICB9KTtcbiAgZGVmaW5lQXJyb3dTaGFwZSgnY2lyY2xlJywge1xuICAgIHJhZGl1czogMC4xNSxcbiAgICBjb2xsaWRlOiBmdW5jdGlvbiBjb2xsaWRlKHgsIHksIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbiwgZWRnZVdpZHRoLCBwYWRkaW5nKSB7XG4gICAgICB2YXIgdCA9IHRyYW5zbGF0aW9uO1xuICAgICAgdmFyIGluc2lkZSA9IE1hdGgucG93KHQueCAtIHgsIDIpICsgTWF0aC5wb3codC55IC0geSwgMikgPD0gTWF0aC5wb3coKHNpemUgKyAyICogcGFkZGluZykgKiB0aGlzLnJhZGl1cywgMik7XG4gICAgICByZXR1cm4gaW5zaWRlO1xuICAgIH0sXG4gICAgZHJhdzogZnVuY3Rpb24gZHJhdyhjb250ZXh0LCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24sIGVkZ2VXaWR0aCkge1xuICAgICAgcmVuZGVyZXIuYXJyb3dTaGFwZUltcGwodGhpcy5uYW1lKShjb250ZXh0LCB0cmFuc2xhdGlvbi54LCB0cmFuc2xhdGlvbi55LCB0aGlzLnJhZGl1cyAqIHNpemUpO1xuICAgIH0sXG4gICAgc3BhY2luZzogZnVuY3Rpb24gc3BhY2luZyhlZGdlKSB7XG4gICAgICByZXR1cm4gcmVuZGVyZXIuZ2V0QXJyb3dXaWR0aChlZGdlLnBzdHlsZSgnd2lkdGgnKS5wZlZhbHVlLCBlZGdlLnBzdHlsZSgnYXJyb3ctc2NhbGUnKS52YWx1ZSkgKiB0aGlzLnJhZGl1cztcbiAgICB9XG4gIH0pO1xuICBkZWZpbmVBcnJvd1NoYXBlKCd0ZWUnLCB7XG4gICAgcG9pbnRzOiBbLTAuMTUsIDAsIC0wLjE1LCAtMC4xLCAwLjE1LCAtMC4xLCAwLjE1LCAwXSxcbiAgICBzcGFjaW5nOiBmdW5jdGlvbiBzcGFjaW5nKGVkZ2UpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH0sXG4gICAgZ2FwOiBmdW5jdGlvbiBnYXAoZWRnZSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICB9KTtcbiAgZGVmaW5lQXJyb3dTaGFwZSgnc3F1YXJlJywge1xuICAgIHBvaW50czogWy0wLjE1LCAwLjAwLCAwLjE1LCAwLjAwLCAwLjE1LCAtMC4zLCAtMC4xNSwgLTAuM11cbiAgfSk7XG4gIGRlZmluZUFycm93U2hhcGUoJ2RpYW1vbmQnLCB7XG4gICAgcG9pbnRzOiBbLTAuMTUsIC0wLjE1LCAwLCAtMC4zLCAwLjE1LCAtMC4xNSwgMCwgMF0sXG4gICAgZ2FwOiBmdW5jdGlvbiBnYXAoZWRnZSkge1xuICAgICAgcmV0dXJuIGVkZ2UucHN0eWxlKCd3aWR0aCcpLnBmVmFsdWUgKiBlZGdlLnBzdHlsZSgnYXJyb3ctc2NhbGUnKS52YWx1ZTtcbiAgICB9XG4gIH0pO1xuICBkZWZpbmVBcnJvd1NoYXBlKCdjaGV2cm9uJywge1xuICAgIHBvaW50czogWzAsIDAsIC0wLjE1LCAtMC4xNSwgLTAuMSwgLTAuMiwgMCwgLTAuMSwgMC4xLCAtMC4yLCAwLjE1LCAtMC4xNV0sXG4gICAgZ2FwOiBmdW5jdGlvbiBnYXAoZWRnZSkge1xuICAgICAgcmV0dXJuIDAuOTUgKiBlZGdlLnBzdHlsZSgnd2lkdGgnKS5wZlZhbHVlICogZWRnZS5wc3R5bGUoJ2Fycm93LXNjYWxlJykudmFsdWU7XG4gICAgfVxuICB9KTtcbn07XG5cbnZhciBCUnAkZSA9IHt9O1xuXG4vLyBQcm9qZWN0IG1vdXNlXG5CUnAkZS5wcm9qZWN0SW50b1ZpZXdwb3J0ID0gZnVuY3Rpb24gKGNsaWVudFgsIGNsaWVudFkpIHtcbiAgdmFyIGN5ID0gdGhpcy5jeTtcbiAgdmFyIG9mZnNldHMgPSB0aGlzLmZpbmRDb250YWluZXJDbGllbnRDb29yZHMoKTtcbiAgdmFyIG9mZnNldExlZnQgPSBvZmZzZXRzWzBdO1xuICB2YXIgb2Zmc2V0VG9wID0gb2Zmc2V0c1sxXTtcbiAgdmFyIHNjYWxlID0gb2Zmc2V0c1s0XTtcbiAgdmFyIHBhbiA9IGN5LnBhbigpO1xuICB2YXIgem9vbSA9IGN5Lnpvb20oKTtcbiAgdmFyIHggPSAoKGNsaWVudFggLSBvZmZzZXRMZWZ0KSAvIHNjYWxlIC0gcGFuLngpIC8gem9vbTtcbiAgdmFyIHkgPSAoKGNsaWVudFkgLSBvZmZzZXRUb3ApIC8gc2NhbGUgLSBwYW4ueSkgLyB6b29tO1xuICByZXR1cm4gW3gsIHldO1xufTtcbkJScCRlLmZpbmRDb250YWluZXJDbGllbnRDb29yZHMgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLmNvbnRhaW5lckJCKSB7XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyQkI7XG4gIH1cbiAgdmFyIGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyO1xuICB2YXIgcmVjdCA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgdmFyIHN0eWxlID0gdGhpcy5jeS53aW5kb3coKS5nZXRDb21wdXRlZFN0eWxlKGNvbnRhaW5lcik7XG4gIHZhciBzdHlsZVZhbHVlID0gZnVuY3Rpb24gc3R5bGVWYWx1ZShuYW1lKSB7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQoc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKSk7XG4gIH07XG4gIHZhciBwYWRkaW5nID0ge1xuICAgIGxlZnQ6IHN0eWxlVmFsdWUoJ3BhZGRpbmctbGVmdCcpLFxuICAgIHJpZ2h0OiBzdHlsZVZhbHVlKCdwYWRkaW5nLXJpZ2h0JyksXG4gICAgdG9wOiBzdHlsZVZhbHVlKCdwYWRkaW5nLXRvcCcpLFxuICAgIGJvdHRvbTogc3R5bGVWYWx1ZSgncGFkZGluZy1ib3R0b20nKVxuICB9O1xuICB2YXIgYm9yZGVyID0ge1xuICAgIGxlZnQ6IHN0eWxlVmFsdWUoJ2JvcmRlci1sZWZ0LXdpZHRoJyksXG4gICAgcmlnaHQ6IHN0eWxlVmFsdWUoJ2JvcmRlci1yaWdodC13aWR0aCcpLFxuICAgIHRvcDogc3R5bGVWYWx1ZSgnYm9yZGVyLXRvcC13aWR0aCcpLFxuICAgIGJvdHRvbTogc3R5bGVWYWx1ZSgnYm9yZGVyLWJvdHRvbS13aWR0aCcpXG4gIH07XG4gIHZhciBjbGllbnRXaWR0aCA9IGNvbnRhaW5lci5jbGllbnRXaWR0aDtcbiAgdmFyIGNsaWVudEhlaWdodCA9IGNvbnRhaW5lci5jbGllbnRIZWlnaHQ7XG4gIHZhciBwYWRkaW5nSG9yID0gcGFkZGluZy5sZWZ0ICsgcGFkZGluZy5yaWdodDtcbiAgdmFyIHBhZGRpbmdWZXIgPSBwYWRkaW5nLnRvcCArIHBhZGRpbmcuYm90dG9tO1xuICB2YXIgYm9yZGVySG9yID0gYm9yZGVyLmxlZnQgKyBib3JkZXIucmlnaHQ7XG4gIHZhciBzY2FsZSA9IHJlY3Qud2lkdGggLyAoY2xpZW50V2lkdGggKyBib3JkZXJIb3IpO1xuICB2YXIgdW5zY2FsZWRXID0gY2xpZW50V2lkdGggLSBwYWRkaW5nSG9yO1xuICB2YXIgdW5zY2FsZWRIID0gY2xpZW50SGVpZ2h0IC0gcGFkZGluZ1ZlcjtcbiAgdmFyIGxlZnQgPSByZWN0LmxlZnQgKyBwYWRkaW5nLmxlZnQgKyBib3JkZXIubGVmdDtcbiAgdmFyIHRvcCA9IHJlY3QudG9wICsgcGFkZGluZy50b3AgKyBib3JkZXIudG9wO1xuICByZXR1cm4gdGhpcy5jb250YWluZXJCQiA9IFtsZWZ0LCB0b3AsIHVuc2NhbGVkVywgdW5zY2FsZWRILCBzY2FsZV07XG59O1xuQlJwJGUuaW52YWxpZGF0ZUNvbnRhaW5lckNsaWVudENvb3Jkc0NhY2hlID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmNvbnRhaW5lckJCID0gbnVsbDtcbn07XG5CUnAkZS5maW5kTmVhcmVzdEVsZW1lbnQgPSBmdW5jdGlvbiAoeCwgeSwgaW50ZXJhY3RpdmVFbGVtZW50c09ubHksIGlzVG91Y2gpIHtcbiAgcmV0dXJuIHRoaXMuZmluZE5lYXJlc3RFbGVtZW50cyh4LCB5LCBpbnRlcmFjdGl2ZUVsZW1lbnRzT25seSwgaXNUb3VjaClbMF07XG59O1xuQlJwJGUuZmluZE5lYXJlc3RFbGVtZW50cyA9IGZ1bmN0aW9uICh4LCB5LCBpbnRlcmFjdGl2ZUVsZW1lbnRzT25seSwgaXNUb3VjaCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIGVsZXMgPSByLmdldENhY2hlZFpTb3J0ZWRFbGVzKCk7XG4gIHZhciBuZWFyID0gW107IC8vIDEgbm9kZSBtYXgsIDEgZWRnZSBtYXhcbiAgdmFyIHpvb20gPSByLmN5Lnpvb20oKTtcbiAgdmFyIGhhc0NvbXBvdW5kcyA9IHIuY3kuaGFzQ29tcG91bmROb2RlcygpO1xuICB2YXIgZWRnZVRocmVzaG9sZCA9IChpc1RvdWNoID8gMjQgOiA4KSAvIHpvb207XG4gIHZhciBub2RlVGhyZXNob2xkID0gKGlzVG91Y2ggPyA4IDogMikgLyB6b29tO1xuICB2YXIgbGFiZWxUaHJlc2hvbGQgPSAoaXNUb3VjaCA/IDggOiAyKSAvIHpvb207XG4gIHZhciBtaW5TcURpc3QgPSBJbmZpbml0eTtcbiAgdmFyIG5lYXJFZGdlO1xuICB2YXIgbmVhck5vZGU7XG4gIGlmIChpbnRlcmFjdGl2ZUVsZW1lbnRzT25seSkge1xuICAgIGVsZXMgPSBlbGVzLmludGVyYWN0aXZlO1xuICB9XG4gIGZ1bmN0aW9uIGFkZEVsZShlbGUsIHNxRGlzdCkge1xuICAgIGlmIChlbGUuaXNOb2RlKCkpIHtcbiAgICAgIGlmIChuZWFyTm9kZSkge1xuICAgICAgICByZXR1cm47IC8vIGNhbid0IHJlcGxhY2Ugbm9kZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmVhck5vZGUgPSBlbGU7XG4gICAgICAgIG5lYXIucHVzaChlbGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZWxlLmlzRWRnZSgpICYmIChzcURpc3QgPT0gbnVsbCB8fCBzcURpc3QgPCBtaW5TcURpc3QpKSB7XG4gICAgICBpZiAobmVhckVkZ2UpIHtcbiAgICAgICAgLy8gdGhlbiByZXBsYWNlIGV4aXN0aW5nIGVkZ2VcbiAgICAgICAgLy8gY2FuIHJlcGxhY2Ugb25seSBpZiBzYW1lIHotaW5kZXhcbiAgICAgICAgaWYgKG5lYXJFZGdlLnBzdHlsZSgnei1jb21wb3VuZC1kZXB0aCcpLnZhbHVlID09PSBlbGUucHN0eWxlKCd6LWNvbXBvdW5kLWRlcHRoJykudmFsdWUgJiYgbmVhckVkZ2UucHN0eWxlKCd6LWNvbXBvdW5kLWRlcHRoJykudmFsdWUgPT09IGVsZS5wc3R5bGUoJ3otY29tcG91bmQtZGVwdGgnKS52YWx1ZSkge1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmVhci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKG5lYXJbaV0uaXNFZGdlKCkpIHtcbiAgICAgICAgICAgICAgbmVhcltpXSA9IGVsZTtcbiAgICAgICAgICAgICAgbmVhckVkZ2UgPSBlbGU7XG4gICAgICAgICAgICAgIG1pblNxRGlzdCA9IHNxRGlzdCAhPSBudWxsID8gc3FEaXN0IDogbWluU3FEaXN0O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5lYXIucHVzaChlbGUpO1xuICAgICAgICBuZWFyRWRnZSA9IGVsZTtcbiAgICAgICAgbWluU3FEaXN0ID0gc3FEaXN0ICE9IG51bGwgPyBzcURpc3QgOiBtaW5TcURpc3Q7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGNoZWNrTm9kZShub2RlKSB7XG4gICAgdmFyIHdpZHRoID0gbm9kZS5vdXRlcldpZHRoKCkgKyAyICogbm9kZVRocmVzaG9sZDtcbiAgICB2YXIgaGVpZ2h0ID0gbm9kZS5vdXRlckhlaWdodCgpICsgMiAqIG5vZGVUaHJlc2hvbGQ7XG4gICAgdmFyIGh3ID0gd2lkdGggLyAyO1xuICAgIHZhciBoaCA9IGhlaWdodCAvIDI7XG4gICAgdmFyIHBvcyA9IG5vZGUucG9zaXRpb24oKTtcbiAgICB2YXIgY29ybmVyUmFkaXVzID0gbm9kZS5wc3R5bGUoJ2Nvcm5lci1yYWRpdXMnKS52YWx1ZSA9PT0gJ2F1dG8nID8gJ2F1dG8nIDogbm9kZS5wc3R5bGUoJ2Nvcm5lci1yYWRpdXMnKS5wZlZhbHVlO1xuICAgIHZhciBycyA9IG5vZGUuX3ByaXZhdGUucnNjcmF0Y2g7XG4gICAgaWYgKHBvcy54IC0gaHcgPD0geCAmJiB4IDw9IHBvcy54ICsgaHcgLy8gYmIgY2hlY2sgeFxuICAgICYmIHBvcy55IC0gaGggPD0geSAmJiB5IDw9IHBvcy55ICsgaGggLy8gYmIgY2hlY2sgeVxuICAgICkge1xuICAgICAgdmFyIHNoYXBlID0gci5ub2RlU2hhcGVzW3NlbGYuZ2V0Tm9kZVNoYXBlKG5vZGUpXTtcbiAgICAgIGlmIChzaGFwZS5jaGVja1BvaW50KHgsIHksIDAsIHdpZHRoLCBoZWlnaHQsIHBvcy54LCBwb3MueSwgY29ybmVyUmFkaXVzLCBycykpIHtcbiAgICAgICAgYWRkRWxlKG5vZGUsIDApO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gY2hlY2tFZGdlKGVkZ2UpIHtcbiAgICB2YXIgX3AgPSBlZGdlLl9wcml2YXRlO1xuICAgIHZhciBycyA9IF9wLnJzY3JhdGNoO1xuICAgIHZhciBzdHlsZVdpZHRoID0gZWRnZS5wc3R5bGUoJ3dpZHRoJykucGZWYWx1ZTtcbiAgICB2YXIgc2NhbGUgPSBlZGdlLnBzdHlsZSgnYXJyb3ctc2NhbGUnKS52YWx1ZTtcbiAgICB2YXIgd2lkdGggPSBzdHlsZVdpZHRoIC8gMiArIGVkZ2VUaHJlc2hvbGQ7IC8vIG1vcmUgbGlrZSBhIGRpc3RhbmNlIHJhZGl1cyBmcm9tIGNlbnRyZVxuICAgIHZhciB3aWR0aFNxID0gd2lkdGggKiB3aWR0aDtcbiAgICB2YXIgd2lkdGgyID0gd2lkdGggKiAyO1xuICAgIHZhciBzcmMgPSBfcC5zb3VyY2U7XG4gICAgdmFyIHRndCA9IF9wLnRhcmdldDtcbiAgICB2YXIgc3FEaXN0O1xuICAgIGlmIChycy5lZGdlVHlwZSA9PT0gJ3NlZ21lbnRzJyB8fCBycy5lZGdlVHlwZSA9PT0gJ3N0cmFpZ2h0JyB8fCBycy5lZGdlVHlwZSA9PT0gJ2hheXN0YWNrJykge1xuICAgICAgdmFyIHB0cyA9IHJzLmFsbHB0cztcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpICsgMyA8IHB0cy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICBpZiAoaW5MaW5lVmljaW5pdHkoeCwgeSwgcHRzW2ldLCBwdHNbaSArIDFdLCBwdHNbaSArIDJdLCBwdHNbaSArIDNdLCB3aWR0aDIpICYmIHdpZHRoU3EgPiAoc3FEaXN0ID0gc3FkaXN0VG9GaW5pdGVMaW5lKHgsIHksIHB0c1tpXSwgcHRzW2kgKyAxXSwgcHRzW2kgKyAyXSwgcHRzW2kgKyAzXSkpKSB7XG4gICAgICAgICAgYWRkRWxlKGVkZ2UsIHNxRGlzdCk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHJzLmVkZ2VUeXBlID09PSAnYmV6aWVyJyB8fCBycy5lZGdlVHlwZSA9PT0gJ211bHRpYmV6aWVyJyB8fCBycy5lZGdlVHlwZSA9PT0gJ3NlbGYnIHx8IHJzLmVkZ2VUeXBlID09PSAnY29tcG91bmQnKSB7XG4gICAgICB2YXIgcHRzID0gcnMuYWxscHRzO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgKyA1IDwgcnMuYWxscHRzLmxlbmd0aDsgaSArPSA0KSB7XG4gICAgICAgIGlmIChpbkJlemllclZpY2luaXR5KHgsIHksIHB0c1tpXSwgcHRzW2kgKyAxXSwgcHRzW2kgKyAyXSwgcHRzW2kgKyAzXSwgcHRzW2kgKyA0XSwgcHRzW2kgKyA1XSwgd2lkdGgyKSAmJiB3aWR0aFNxID4gKHNxRGlzdCA9IHNxZGlzdFRvUXVhZHJhdGljQmV6aWVyKHgsIHksIHB0c1tpXSwgcHRzW2kgKyAxXSwgcHRzW2kgKyAyXSwgcHRzW2kgKyAzXSwgcHRzW2kgKyA0XSwgcHRzW2kgKyA1XSkpKSB7XG4gICAgICAgICAgYWRkRWxlKGVkZ2UsIHNxRGlzdCk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBpZiB3ZSdyZSBjbG9zZSB0byB0aGUgZWRnZSBidXQgZGlkbid0IGhpdCBpdCwgbWF5YmUgd2UgaGl0IGl0cyBhcnJvd3NcblxuICAgIHZhciBzcmMgPSBzcmMgfHwgX3Auc291cmNlO1xuICAgIHZhciB0Z3QgPSB0Z3QgfHwgX3AudGFyZ2V0O1xuICAgIHZhciBhclNpemUgPSBzZWxmLmdldEFycm93V2lkdGgoc3R5bGVXaWR0aCwgc2NhbGUpO1xuICAgIHZhciBhcnJvd3MgPSBbe1xuICAgICAgbmFtZTogJ3NvdXJjZScsXG4gICAgICB4OiBycy5hcnJvd1N0YXJ0WCxcbiAgICAgIHk6IHJzLmFycm93U3RhcnRZLFxuICAgICAgYW5nbGU6IHJzLnNyY0Fycm93QW5nbGVcbiAgICB9LCB7XG4gICAgICBuYW1lOiAndGFyZ2V0JyxcbiAgICAgIHg6IHJzLmFycm93RW5kWCxcbiAgICAgIHk6IHJzLmFycm93RW5kWSxcbiAgICAgIGFuZ2xlOiBycy50Z3RBcnJvd0FuZ2xlXG4gICAgfSwge1xuICAgICAgbmFtZTogJ21pZC1zb3VyY2UnLFxuICAgICAgeDogcnMubWlkWCxcbiAgICAgIHk6IHJzLm1pZFksXG4gICAgICBhbmdsZTogcnMubWlkc3JjQXJyb3dBbmdsZVxuICAgIH0sIHtcbiAgICAgIG5hbWU6ICdtaWQtdGFyZ2V0JyxcbiAgICAgIHg6IHJzLm1pZFgsXG4gICAgICB5OiBycy5taWRZLFxuICAgICAgYW5nbGU6IHJzLm1pZHRndEFycm93QW5nbGVcbiAgICB9XTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGFyID0gYXJyb3dzW2ldO1xuICAgICAgdmFyIHNoYXBlID0gci5hcnJvd1NoYXBlc1tlZGdlLnBzdHlsZShhci5uYW1lICsgJy1hcnJvdy1zaGFwZScpLnZhbHVlXTtcbiAgICAgIHZhciBlZGdlV2lkdGggPSBlZGdlLnBzdHlsZSgnd2lkdGgnKS5wZlZhbHVlO1xuICAgICAgaWYgKHNoYXBlLnJvdWdoQ29sbGlkZSh4LCB5LCBhclNpemUsIGFyLmFuZ2xlLCB7XG4gICAgICAgIHg6IGFyLngsXG4gICAgICAgIHk6IGFyLnlcbiAgICAgIH0sIGVkZ2VXaWR0aCwgZWRnZVRocmVzaG9sZCkgJiYgc2hhcGUuY29sbGlkZSh4LCB5LCBhclNpemUsIGFyLmFuZ2xlLCB7XG4gICAgICAgIHg6IGFyLngsXG4gICAgICAgIHk6IGFyLnlcbiAgICAgIH0sIGVkZ2VXaWR0aCwgZWRnZVRocmVzaG9sZCkpIHtcbiAgICAgICAgYWRkRWxlKGVkZ2UpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBmb3IgY29tcG91bmQgZ3JhcGhzLCBoaXR0aW5nIGVkZ2UgbWF5IGFjdHVhbGx5IHdhbnQgYSBjb25uZWN0ZWQgbm9kZSBpbnN0ZWFkIChiL2MgZWRnZSBtYXkgaGF2ZSBncmVhdGVyIHotaW5kZXggcHJlY2VkZW5jZSlcbiAgICBpZiAoaGFzQ29tcG91bmRzICYmIG5lYXIubGVuZ3RoID4gMCkge1xuICAgICAgY2hlY2tOb2RlKHNyYyk7XG4gICAgICBjaGVja05vZGUodGd0KTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gcHJlcHJvcChvYmosIG5hbWUsIHByZSkge1xuICAgIHJldHVybiBnZXRQcmVmaXhlZFByb3BlcnR5KG9iaiwgbmFtZSwgcHJlKTtcbiAgfVxuICBmdW5jdGlvbiBjaGVja0xhYmVsKGVsZSwgcHJlZml4KSB7XG4gICAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICAgIHZhciB0aCA9IGxhYmVsVGhyZXNob2xkO1xuICAgIHZhciBwcmVmaXhEYXNoO1xuICAgIGlmIChwcmVmaXgpIHtcbiAgICAgIHByZWZpeERhc2ggPSBwcmVmaXggKyAnLSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByZWZpeERhc2ggPSAnJztcbiAgICB9XG4gICAgZWxlLmJvdW5kaW5nQm94KCk7XG4gICAgdmFyIGJiID0gX3AubGFiZWxCb3VuZHNbcHJlZml4IHx8ICdtYWluJ107XG4gICAgdmFyIHRleHQgPSBlbGUucHN0eWxlKHByZWZpeERhc2ggKyAnbGFiZWwnKS52YWx1ZTtcbiAgICB2YXIgZXZlbnRzRW5hYmxlZCA9IGVsZS5wc3R5bGUoJ3RleHQtZXZlbnRzJykuc3RyVmFsdWUgPT09ICd5ZXMnO1xuICAgIGlmICghZXZlbnRzRW5hYmxlZCB8fCAhdGV4dCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgbHggPSBwcmVwcm9wKF9wLnJzY3JhdGNoLCAnbGFiZWxYJywgcHJlZml4KTtcbiAgICB2YXIgbHkgPSBwcmVwcm9wKF9wLnJzY3JhdGNoLCAnbGFiZWxZJywgcHJlZml4KTtcbiAgICB2YXIgdGhldGEgPSBwcmVwcm9wKF9wLnJzY3JhdGNoLCAnbGFiZWxBbmdsZScsIHByZWZpeCk7XG4gICAgdmFyIG94ID0gZWxlLnBzdHlsZShwcmVmaXhEYXNoICsgJ3RleHQtbWFyZ2luLXgnKS5wZlZhbHVlO1xuICAgIHZhciBveSA9IGVsZS5wc3R5bGUocHJlZml4RGFzaCArICd0ZXh0LW1hcmdpbi15JykucGZWYWx1ZTtcbiAgICB2YXIgbHgxID0gYmIueDEgLSB0aCAtIG94OyAvLyAoLW94LCAtb3kpIGFzIGJiIGFscmVhZHkgaW5jbHVkZXMgbWFyZ2luXG4gICAgdmFyIGx4MiA9IGJiLngyICsgdGggLSBveDsgLy8gYW5kIHJvdGF0aW9uIGlzIGFib3V0IChseCwgbHkpXG4gICAgdmFyIGx5MSA9IGJiLnkxIC0gdGggLSBveTtcbiAgICB2YXIgbHkyID0gYmIueTIgKyB0aCAtIG95O1xuICAgIGlmICh0aGV0YSkge1xuICAgICAgdmFyIGNvcyA9IE1hdGguY29zKHRoZXRhKTtcbiAgICAgIHZhciBzaW4gPSBNYXRoLnNpbih0aGV0YSk7XG4gICAgICB2YXIgcm90YXRlID0gZnVuY3Rpb24gcm90YXRlKHgsIHkpIHtcbiAgICAgICAgeCA9IHggLSBseDtcbiAgICAgICAgeSA9IHkgLSBseTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB4OiB4ICogY29zIC0geSAqIHNpbiArIGx4LFxuICAgICAgICAgIHk6IHggKiBzaW4gKyB5ICogY29zICsgbHlcbiAgICAgICAgfTtcbiAgICAgIH07XG4gICAgICB2YXIgcHgxeTEgPSByb3RhdGUobHgxLCBseTEpO1xuICAgICAgdmFyIHB4MXkyID0gcm90YXRlKGx4MSwgbHkyKTtcbiAgICAgIHZhciBweDJ5MSA9IHJvdGF0ZShseDIsIGx5MSk7XG4gICAgICB2YXIgcHgyeTIgPSByb3RhdGUobHgyLCBseTIpO1xuICAgICAgdmFyIHBvaW50cyA9IFtcbiAgICAgIC8vIHdpdGggdGhlIG1hcmdpbiBhZGRlZCBhZnRlciB0aGUgcm90YXRpb24gaXMgYXBwbGllZFxuICAgICAgcHgxeTEueCArIG94LCBweDF5MS55ICsgb3ksIHB4MnkxLnggKyBveCwgcHgyeTEueSArIG95LCBweDJ5Mi54ICsgb3gsIHB4MnkyLnkgKyBveSwgcHgxeTIueCArIG94LCBweDF5Mi55ICsgb3ldO1xuICAgICAgaWYgKHBvaW50SW5zaWRlUG9seWdvblBvaW50cyh4LCB5LCBwb2ludHMpKSB7XG4gICAgICAgIGFkZEVsZShlbGUpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZG8gYSBjaGVhcGVyIGJiIGNoZWNrXG4gICAgICBpZiAoaW5Cb3VuZGluZ0JveChiYiwgeCwgeSkpIHtcbiAgICAgICAgYWRkRWxlKGVsZSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBmb3IgKHZhciBpID0gZWxlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIC8vIHJldmVyc2Ugb3JkZXIgZm9yIHByZWNlZGVuY2VcbiAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICBpZiAoZWxlLmlzTm9kZSgpKSB7XG4gICAgICBjaGVja05vZGUoZWxlKSB8fCBjaGVja0xhYmVsKGVsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRoZW4gZWRnZVxuICAgICAgY2hlY2tFZGdlKGVsZSkgfHwgY2hlY2tMYWJlbChlbGUpIHx8IGNoZWNrTGFiZWwoZWxlLCAnc291cmNlJykgfHwgY2hlY2tMYWJlbChlbGUsICd0YXJnZXQnKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5lYXI7XG59O1xuXG4vLyAnR2l2ZSBtZSBldmVyeXRoaW5nIGZyb20gdGhpcyBib3gnXG5CUnAkZS5nZXRBbGxJbkJveCA9IGZ1bmN0aW9uICh4MSwgeTEsIHgyLCB5Mikge1xuICB2YXIgZWxlcyA9IHRoaXMuZ2V0Q2FjaGVkWlNvcnRlZEVsZXMoKS5pbnRlcmFjdGl2ZTtcbiAgdmFyIHpvb20gPSB0aGlzLmN5Lnpvb20oKTtcbiAgdmFyIGxhYmVsVGhyZXNob2xkID0gMiAvIHpvb207XG4gIHZhciBib3ggPSBbXTtcbiAgdmFyIHgxYyA9IE1hdGgubWluKHgxLCB4Mik7XG4gIHZhciB4MmMgPSBNYXRoLm1heCh4MSwgeDIpO1xuICB2YXIgeTFjID0gTWF0aC5taW4oeTEsIHkyKTtcbiAgdmFyIHkyYyA9IE1hdGgubWF4KHkxLCB5Mik7XG4gIHgxID0geDFjO1xuICB4MiA9IHgyYztcbiAgeTEgPSB5MWM7XG4gIHkyID0geTJjO1xuICB2YXIgYm94QmIgPSBtYWtlQm91bmRpbmdCb3goe1xuICAgIHgxOiB4MSxcbiAgICB5MTogeTEsXG4gICAgeDI6IHgyLFxuICAgIHkyOiB5MlxuICB9KTtcbiAgdmFyIHNlbGVjdGlvbkJveCA9IFt7XG4gICAgeDogYm94QmIueDEsXG4gICAgeTogYm94QmIueTFcbiAgfSwge1xuICAgIHg6IGJveEJiLngyLFxuICAgIHk6IGJveEJiLnkxXG4gIH0sIHtcbiAgICB4OiBib3hCYi54MixcbiAgICB5OiBib3hCYi55MlxuICB9LCB7XG4gICAgeDogYm94QmIueDEsXG4gICAgeTogYm94QmIueTJcbiAgfV07XG4gIHZhciBib3hFZGdlcyA9IFtbc2VsZWN0aW9uQm94WzBdLCBzZWxlY3Rpb25Cb3hbMV1dLCBbc2VsZWN0aW9uQm94WzFdLCBzZWxlY3Rpb25Cb3hbMl1dLCBbc2VsZWN0aW9uQm94WzJdLCBzZWxlY3Rpb25Cb3hbM11dLCBbc2VsZWN0aW9uQm94WzNdLCBzZWxlY3Rpb25Cb3hbMF1dXTtcbiAgZnVuY3Rpb24gcHJlcHJvcChvYmosIG5hbWUsIHByZSkge1xuICAgIHJldHVybiBnZXRQcmVmaXhlZFByb3BlcnR5KG9iaiwgbmFtZSwgcHJlKTtcbiAgfVxuICBmdW5jdGlvbiBnZXRSb3RhdGVkTGFiZWxCb3goZWxlLCBwcmVmaXgpIHtcbiAgICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gICAgdmFyIHRoID0gbGFiZWxUaHJlc2hvbGQ7XG4gICAgdmFyIHByZWZpeERhc2ggPSAnJztcbiAgICBlbGUuYm91bmRpbmdCb3goKTtcbiAgICB2YXIgYmIgPSBfcC5sYWJlbEJvdW5kc1snbWFpbiddO1xuXG4gICAgLy8gSWYgdGhlIGJvdW5kaW5nIGJveCBpcyBub3QgYXZhaWxhYmxlLCByZXR1cm4gbnVsbC5cbiAgICAvLyBUaGlzIGluZGljYXRlcyB0aGF0IHRoZSBsYWJlbCBib3ggY2Fubm90IGJlIGNhbGN1bGF0ZWQsIHdoaWNoIGlzIGNvbnNpc3RlbnRcbiAgICAvLyB3aXRoIHRoZSBleHBlY3RlZCBiZWhhdmlvciBvZiB0aGlzIGZ1bmN0aW9uLiBSZXR1cm5pbmcgbnVsbCBhbGxvd3MgdGhlIGNhbGxlclxuICAgIC8vIHRvIGhhbmRsZSB0aGUgYWJzZW5jZSBvZiBhIGJvdW5kaW5nIGJveCBleHBsaWNpdGx5LlxuICAgIGlmICghYmIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB2YXIgbHggPSBwcmVwcm9wKF9wLnJzY3JhdGNoLCAnbGFiZWxYJywgcHJlZml4KTtcbiAgICB2YXIgbHkgPSBwcmVwcm9wKF9wLnJzY3JhdGNoLCAnbGFiZWxZJywgcHJlZml4KTtcbiAgICB2YXIgdGhldGEgPSBwcmVwcm9wKF9wLnJzY3JhdGNoLCAnbGFiZWxBbmdsZScsIHByZWZpeCk7XG4gICAgdmFyIG94ID0gZWxlLnBzdHlsZShwcmVmaXhEYXNoICsgJ3RleHQtbWFyZ2luLXgnKS5wZlZhbHVlO1xuICAgIHZhciBveSA9IGVsZS5wc3R5bGUocHJlZml4RGFzaCArICd0ZXh0LW1hcmdpbi15JykucGZWYWx1ZTtcbiAgICB2YXIgbHgxID0gYmIueDEgLSB0aCAtIG94O1xuICAgIHZhciBseDIgPSBiYi54MiArIHRoIC0gb3g7XG4gICAgdmFyIGx5MSA9IGJiLnkxIC0gdGggLSBveTtcbiAgICB2YXIgbHkyID0gYmIueTIgKyB0aCAtIG95O1xuICAgIGlmICh0aGV0YSkge1xuICAgICAgdmFyIGNvcyA9IE1hdGguY29zKHRoZXRhKTtcbiAgICAgIHZhciBzaW4gPSBNYXRoLnNpbih0aGV0YSk7XG4gICAgICB2YXIgcm90YXRlID0gZnVuY3Rpb24gcm90YXRlKHgsIHkpIHtcbiAgICAgICAgeCA9IHggLSBseDtcbiAgICAgICAgeSA9IHkgLSBseTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB4OiB4ICogY29zIC0geSAqIHNpbiArIGx4LFxuICAgICAgICAgIHk6IHggKiBzaW4gKyB5ICogY29zICsgbHlcbiAgICAgICAgfTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gW3JvdGF0ZShseDEsIGx5MSksIHJvdGF0ZShseDIsIGx5MSksIHJvdGF0ZShseDIsIGx5MiksIHJvdGF0ZShseDEsIGx5MildO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW3tcbiAgICAgICAgeDogbHgxLFxuICAgICAgICB5OiBseTFcbiAgICAgIH0sIHtcbiAgICAgICAgeDogbHgyLFxuICAgICAgICB5OiBseTFcbiAgICAgIH0sIHtcbiAgICAgICAgeDogbHgyLFxuICAgICAgICB5OiBseTJcbiAgICAgIH0sIHtcbiAgICAgICAgeDogbHgxLFxuICAgICAgICB5OiBseTJcbiAgICAgIH1dO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBkb0xpbmVzSW50ZXJzZWN0KHAxLCBwMiwgcTEsIHEyKSB7XG4gICAgZnVuY3Rpb24gY2N3KGEsIGIsIGMpIHtcbiAgICAgIHJldHVybiAoYy55IC0gYS55KSAqIChiLnggLSBhLngpID4gKGIueSAtIGEueSkgKiAoYy54IC0gYS54KTtcbiAgICB9XG4gICAgcmV0dXJuIGNjdyhwMSwgcTEsIHEyKSAhPT0gY2N3KHAyLCBxMSwgcTIpICYmIGNjdyhwMSwgcDIsIHExKSAhPT0gY2N3KHAxLCBwMiwgcTIpO1xuICB9XG4gIGZvciAodmFyIGUgPSAwOyBlIDwgZWxlcy5sZW5ndGg7IGUrKykge1xuICAgIHZhciBlbGUgPSBlbGVzW2VdO1xuICAgIGlmIChlbGUuaXNOb2RlKCkpIHtcbiAgICAgIHZhciBub2RlID0gZWxlO1xuICAgICAgdmFyIHRleHRFdmVudHMgPSBub2RlLnBzdHlsZSgndGV4dC1ldmVudHMnKS5zdHJWYWx1ZSA9PT0gJ3llcyc7XG4gICAgICB2YXIgbm9kZUJveFNlbGVjdE1vZGUgPSBub2RlLnBzdHlsZSgnYm94LXNlbGVjdGlvbicpLnN0clZhbHVlO1xuICAgICAgdmFyIGxhYmVsQm94U2VsZWN0RW5hYmxlZCA9IG5vZGUucHN0eWxlKCdib3gtc2VsZWN0LWxhYmVscycpLnN0clZhbHVlID09PSAneWVzJztcbiAgICAgIGlmIChub2RlQm94U2VsZWN0TW9kZSA9PT0gJ25vbmUnKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdmFyIGluY2x1ZGVMYWJlbHMgPSAobm9kZUJveFNlbGVjdE1vZGUgPT09ICdvdmVybGFwJyB8fCBsYWJlbEJveFNlbGVjdEVuYWJsZWQpICYmIHRleHRFdmVudHM7XG4gICAgICB2YXIgbm9kZUJiID0gbm9kZS5ib3VuZGluZ0JveCh7XG4gICAgICAgIGluY2x1ZGVOb2RlczogdHJ1ZSxcbiAgICAgICAgaW5jbHVkZUVkZ2VzOiBmYWxzZSxcbiAgICAgICAgaW5jbHVkZUxhYmVsczogaW5jbHVkZUxhYmVsc1xuICAgICAgfSk7XG4gICAgICBpZiAobm9kZUJveFNlbGVjdE1vZGUgPT09ICdjb250YWluJykge1xuICAgICAgICB2YXIgc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKGxhYmVsQm94U2VsZWN0RW5hYmxlZCAmJiB0ZXh0RXZlbnRzKSB7XG4gICAgICAgICAgdmFyIHJvdGF0ZWRMYWJlbEJveCA9IGdldFJvdGF0ZWRMYWJlbEJveChub2RlKTtcbiAgICAgICAgICBpZiAocm90YXRlZExhYmVsQm94ICYmIHNhdFBvbHlnb25JbnRlcnNlY3Rpb24ocm90YXRlZExhYmVsQm94LCBzZWxlY3Rpb25Cb3gpKSB7XG4gICAgICAgICAgICBib3gucHVzaChub2RlKTtcbiAgICAgICAgICAgIHNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzZWxlY3RlZCAmJiBib3VuZGluZ0JveEluQm91bmRpbmdCb3goYm94QmIsIG5vZGVCYikpIHtcbiAgICAgICAgICBib3gucHVzaChub2RlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChub2RlQm94U2VsZWN0TW9kZSA9PT0gJ292ZXJsYXAnKSB7XG4gICAgICAgIGlmIChib3VuZGluZ0JveGVzSW50ZXJzZWN0KGJveEJiLCBub2RlQmIpKSB7XG4gICAgICAgICAgdmFyIG5vZGVCb2R5QmIgPSBub2RlLmJvdW5kaW5nQm94KHtcbiAgICAgICAgICAgIGluY2x1ZGVOb2RlczogdHJ1ZSxcbiAgICAgICAgICAgIGluY2x1ZGVFZGdlczogdHJ1ZSxcbiAgICAgICAgICAgIGluY2x1ZGVMYWJlbHM6IGZhbHNlLFxuICAgICAgICAgICAgaW5jbHVkZU1haW5MYWJlbHM6IGZhbHNlLFxuICAgICAgICAgICAgaW5jbHVkZVNvdXJjZUxhYmVsczogZmFsc2UsXG4gICAgICAgICAgICBpbmNsdWRlVGFyZ2V0TGFiZWxzOiBmYWxzZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHZhciBub2RlQm9keUNvcm5lcnMgPSBbe1xuICAgICAgICAgICAgeDogbm9kZUJvZHlCYi54MSxcbiAgICAgICAgICAgIHk6IG5vZGVCb2R5QmIueTFcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICB4OiBub2RlQm9keUJiLngyLFxuICAgICAgICAgICAgeTogbm9kZUJvZHlCYi55MVxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIHg6IG5vZGVCb2R5QmIueDIsXG4gICAgICAgICAgICB5OiBub2RlQm9keUJiLnkyXG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgeDogbm9kZUJvZHlCYi54MSxcbiAgICAgICAgICAgIHk6IG5vZGVCb2R5QmIueTJcbiAgICAgICAgICB9XTtcblxuICAgICAgICAgIC8vIGlmIG5vZGUgYm9keSBpbnRlcnNlY3RzLCBubyBuZWVkIHRvIGNoZWNrIGxhYmVsXG4gICAgICAgICAgaWYgKHNhdFBvbHlnb25JbnRlcnNlY3Rpb24obm9kZUJvZHlDb3JuZXJzLCBzZWxlY3Rpb25Cb3gpKSB7XG4gICAgICAgICAgICBib3gucHVzaChub2RlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gb25seSBjaGVjayBsYWJlbCBpZiBub2RlIGJvZHkgZGlkbid0IGludGVyc2VjdFxuICAgICAgICAgICAgdmFyIF9yb3RhdGVkTGFiZWxCb3ggPSBnZXRSb3RhdGVkTGFiZWxCb3gobm9kZSk7XG4gICAgICAgICAgICBpZiAoX3JvdGF0ZWRMYWJlbEJveCAmJiBzYXRQb2x5Z29uSW50ZXJzZWN0aW9uKF9yb3RhdGVkTGFiZWxCb3gsIHNlbGVjdGlvbkJveCkpIHtcbiAgICAgICAgICAgICAgYm94LnB1c2gobm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBlZGdlID0gZWxlO1xuICAgICAgdmFyIF9wID0gZWRnZS5fcHJpdmF0ZTtcbiAgICAgIHZhciBycyA9IF9wLnJzY3JhdGNoO1xuICAgICAgdmFyIGVkZ2VCb3hTZWxlY3RNb2RlID0gZWRnZS5wc3R5bGUoJ2JveC1zZWxlY3Rpb24nKS5zdHJWYWx1ZTtcbiAgICAgIGlmIChlZGdlQm94U2VsZWN0TW9kZSA9PT0gJ25vbmUnKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGVkZ2VCb3hTZWxlY3RNb2RlID09PSAnY29udGFpbicpIHtcbiAgICAgICAgaWYgKHJzLnN0YXJ0WCAhPSBudWxsICYmIHJzLnN0YXJ0WSAhPSBudWxsICYmICFpbkJvdW5kaW5nQm94KGJveEJiLCBycy5zdGFydFgsIHJzLnN0YXJ0WSkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocnMuZW5kWCAhPSBudWxsICYmIHJzLmVuZFkgIT0gbnVsbCAmJiAhaW5Cb3VuZGluZ0JveChib3hCYiwgcnMuZW5kWCwgcnMuZW5kWSkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocnMuZWRnZVR5cGUgPT09ICdiZXppZXInIHx8IHJzLmVkZ2VUeXBlID09PSAnbXVsdGliZXppZXInIHx8IHJzLmVkZ2VUeXBlID09PSAnc2VsZicgfHwgcnMuZWRnZVR5cGUgPT09ICdjb21wb3VuZCcgfHwgcnMuZWRnZVR5cGUgPT09ICdzZWdtZW50cycgfHwgcnMuZWRnZVR5cGUgPT09ICdoYXlzdGFjaycpIHtcbiAgICAgICAgICB2YXIgcHRzID0gX3AucnN0eWxlLmJlemllclB0cyB8fCBfcC5yc3R5bGUubGluZVB0cyB8fCBfcC5yc3R5bGUuaGF5c3RhY2tQdHM7XG4gICAgICAgICAgdmFyIGFsbEluc2lkZSA9IHRydWU7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghcG9pbnRJbkJvdW5kaW5nQm94KGJveEJiLCBwdHNbaV0pKSB7XG4gICAgICAgICAgICAgIGFsbEluc2lkZSA9IGZhbHNlO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGFsbEluc2lkZSkge1xuICAgICAgICAgICAgYm94LnB1c2goZWRnZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHJzLmVkZ2VUeXBlID09PSAnc3RyYWlnaHQnKSB7XG4gICAgICAgICAgYm94LnB1c2goZWRnZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZWRnZUJveFNlbGVjdE1vZGUgPT09ICdvdmVybGFwJykge1xuICAgICAgICB2YXIgX3NlbGVjdGVkID0gZmFsc2U7XG5cbiAgICAgICAgLy8gQ2hlY2s6IGVpdGhlciBlbmRwb2ludCBpbnNpZGUgYm94XG4gICAgICAgIGlmIChycy5zdGFydFggIT0gbnVsbCAmJiBycy5zdGFydFkgIT0gbnVsbCAmJiBycy5lbmRYICE9IG51bGwgJiYgcnMuZW5kWSAhPSBudWxsICYmIChpbkJvdW5kaW5nQm94KGJveEJiLCBycy5zdGFydFgsIHJzLnN0YXJ0WSkgfHwgaW5Cb3VuZGluZ0JveChib3hCYiwgcnMuZW5kWCwgcnMuZW5kWSkpKSB7XG4gICAgICAgICAgYm94LnB1c2goZWRnZSk7XG4gICAgICAgICAgX3NlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEhheXN0YWNrIGZhbGxiYWNrIChvbmx5IGNoZWNrIGlmIG5vdCBhbHJlYWR5IHNlbGVjdGVkKVxuICAgICAgICBlbHNlIGlmICghX3NlbGVjdGVkICYmIHJzLmVkZ2VUeXBlID09PSAnaGF5c3RhY2snKSB7XG4gICAgICAgICAgdmFyIGhheXN0YWNrUHRzID0gX3AucnN0eWxlLmhheXN0YWNrUHRzO1xuICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBoYXlzdGFja1B0cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGlmIChwb2ludEluQm91bmRpbmdCb3goYm94QmIsIGhheXN0YWNrUHRzW19pXSkpIHtcbiAgICAgICAgICAgICAgYm94LnB1c2goZWRnZSk7XG4gICAgICAgICAgICAgIF9zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNlZ21lbnQgaW50ZXJzZWN0aW9uIGNoZWNrIChvbmx5IGlmIG5vdCBhbHJlYWR5IHNlbGVjdGVkKVxuICAgICAgICBpZiAoIV9zZWxlY3RlZCkge1xuICAgICAgICAgIHZhciBfcHRzID0gX3AucnN0eWxlLmJlemllclB0cyB8fCBfcC5yc3R5bGUubGluZVB0cyB8fCBfcC5yc3R5bGUuaGF5c3RhY2tQdHM7XG5cbiAgICAgICAgICAvLyBzdHJhaWdodCBlZGdlc1xuICAgICAgICAgIGlmICgoIV9wdHMgfHwgX3B0cy5sZW5ndGggPCAyKSAmJiBycy5lZGdlVHlwZSA9PT0gJ3N0cmFpZ2h0Jykge1xuICAgICAgICAgICAgaWYgKHJzLnN0YXJ0WCAhPSBudWxsICYmIHJzLnN0YXJ0WSAhPSBudWxsICYmIHJzLmVuZFggIT0gbnVsbCAmJiBycy5lbmRZICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgX3B0cyA9IFt7XG4gICAgICAgICAgICAgICAgeDogcnMuc3RhcnRYLFxuICAgICAgICAgICAgICAgIHk6IHJzLnN0YXJ0WVxuICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgeDogcnMuZW5kWCxcbiAgICAgICAgICAgICAgICB5OiBycy5lbmRZXG4gICAgICAgICAgICAgIH1dO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIV9wdHMgfHwgX3B0cy5sZW5ndGggPCAyKSBjb250aW51ZTtcbiAgICAgICAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBfcHRzLmxlbmd0aCAtIDE7IF9pMisrKSB7XG4gICAgICAgICAgICB2YXIgc2VnU3RhcnQgPSBfcHRzW19pMl07XG4gICAgICAgICAgICB2YXIgc2VnRW5kID0gX3B0c1tfaTIgKyAxXTtcbiAgICAgICAgICAgIGZvciAodmFyIGIgPSAwOyBiIDwgYm94RWRnZXMubGVuZ3RoOyBiKyspIHtcbiAgICAgICAgICAgICAgdmFyIF9ib3hFZGdlcyRiID0gX3NsaWNlZFRvQXJyYXkoYm94RWRnZXNbYl0sIDIpLFxuICAgICAgICAgICAgICAgIGJveFN0YXJ0ID0gX2JveEVkZ2VzJGJbMF0sXG4gICAgICAgICAgICAgICAgYm94RW5kID0gX2JveEVkZ2VzJGJbMV07XG4gICAgICAgICAgICAgIGlmIChkb0xpbmVzSW50ZXJzZWN0KHNlZ1N0YXJ0LCBzZWdFbmQsIGJveFN0YXJ0LCBib3hFbmQpKSB7XG4gICAgICAgICAgICAgICAgYm94LnB1c2goZWRnZSk7XG4gICAgICAgICAgICAgICAgX3NlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKF9zZWxlY3RlZCkgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBib3g7XG59O1xuXG52YXIgQlJwJGQgPSB7fTtcbkJScCRkLmNhbGN1bGF0ZUFycm93QW5nbGVzID0gZnVuY3Rpb24gKGVkZ2UpIHtcbiAgdmFyIHJzID0gZWRnZS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgdmFyIGlzSGF5c3RhY2sgPSBycy5lZGdlVHlwZSA9PT0gJ2hheXN0YWNrJztcbiAgdmFyIGlzQmV6aWVyID0gcnMuZWRnZVR5cGUgPT09ICdiZXppZXInO1xuICB2YXIgaXNNdWx0aWJlemllciA9IHJzLmVkZ2VUeXBlID09PSAnbXVsdGliZXppZXInO1xuICB2YXIgaXNTZWdtZW50cyA9IHJzLmVkZ2VUeXBlID09PSAnc2VnbWVudHMnO1xuICB2YXIgaXNDb21wb3VuZCA9IHJzLmVkZ2VUeXBlID09PSAnY29tcG91bmQnO1xuICB2YXIgaXNTZWxmID0gcnMuZWRnZVR5cGUgPT09ICdzZWxmJztcblxuICAvLyBEaXNwbGFjZW1lbnQgZ2l2ZXMgZGlyZWN0aW9uIGZvciBhcnJvd2hlYWQgb3JpZW50YXRpb25cbiAgdmFyIGRpc3BYLCBkaXNwWTtcbiAgdmFyIHN0YXJ0WCwgc3RhcnRZLCBlbmRYLCBlbmRZLCBtaWRYLCBtaWRZO1xuICBpZiAoaXNIYXlzdGFjaykge1xuICAgIHN0YXJ0WCA9IHJzLmhheXN0YWNrUHRzWzBdO1xuICAgIHN0YXJ0WSA9IHJzLmhheXN0YWNrUHRzWzFdO1xuICAgIGVuZFggPSBycy5oYXlzdGFja1B0c1syXTtcbiAgICBlbmRZID0gcnMuaGF5c3RhY2tQdHNbM107XG4gIH0gZWxzZSB7XG4gICAgc3RhcnRYID0gcnMuYXJyb3dTdGFydFg7XG4gICAgc3RhcnRZID0gcnMuYXJyb3dTdGFydFk7XG4gICAgZW5kWCA9IHJzLmFycm93RW5kWDtcbiAgICBlbmRZID0gcnMuYXJyb3dFbmRZO1xuICB9XG4gIG1pZFggPSBycy5taWRYO1xuICBtaWRZID0gcnMubWlkWTtcblxuICAvLyBzb3VyY2VcbiAgLy9cblxuICBpZiAoaXNTZWdtZW50cykge1xuICAgIGRpc3BYID0gc3RhcnRYIC0gcnMuc2VncHRzWzBdO1xuICAgIGRpc3BZID0gc3RhcnRZIC0gcnMuc2VncHRzWzFdO1xuICB9IGVsc2UgaWYgKGlzTXVsdGliZXppZXIgfHwgaXNDb21wb3VuZCB8fCBpc1NlbGYgfHwgaXNCZXppZXIpIHtcbiAgICB2YXIgcHRzID0gcnMuYWxscHRzO1xuICAgIHZhciBiWCA9IHFiZXppZXJBdChwdHNbMF0sIHB0c1syXSwgcHRzWzRdLCAwLjEpO1xuICAgIHZhciBiWSA9IHFiZXppZXJBdChwdHNbMV0sIHB0c1szXSwgcHRzWzVdLCAwLjEpO1xuICAgIGRpc3BYID0gc3RhcnRYIC0gYlg7XG4gICAgZGlzcFkgPSBzdGFydFkgLSBiWTtcbiAgfSBlbHNlIHtcbiAgICBkaXNwWCA9IHN0YXJ0WCAtIG1pZFg7XG4gICAgZGlzcFkgPSBzdGFydFkgLSBtaWRZO1xuICB9XG4gIHJzLnNyY0Fycm93QW5nbGUgPSBnZXRBbmdsZUZyb21EaXNwKGRpc3BYLCBkaXNwWSk7XG5cbiAgLy8gbWlkIHRhcmdldFxuICAvL1xuXG4gIHZhciBtaWRYID0gcnMubWlkWDtcbiAgdmFyIG1pZFkgPSBycy5taWRZO1xuICBpZiAoaXNIYXlzdGFjaykge1xuICAgIG1pZFggPSAoc3RhcnRYICsgZW5kWCkgLyAyO1xuICAgIG1pZFkgPSAoc3RhcnRZICsgZW5kWSkgLyAyO1xuICB9XG4gIGRpc3BYID0gZW5kWCAtIHN0YXJ0WDtcbiAgZGlzcFkgPSBlbmRZIC0gc3RhcnRZO1xuICBpZiAoaXNTZWdtZW50cykge1xuICAgIHZhciBwdHMgPSBycy5hbGxwdHM7XG4gICAgaWYgKHB0cy5sZW5ndGggLyAyICUgMiA9PT0gMCkge1xuICAgICAgdmFyIGkyID0gcHRzLmxlbmd0aCAvIDI7XG4gICAgICB2YXIgaTEgPSBpMiAtIDI7XG4gICAgICBkaXNwWCA9IHB0c1tpMl0gLSBwdHNbaTFdO1xuICAgICAgZGlzcFkgPSBwdHNbaTIgKyAxXSAtIHB0c1tpMSArIDFdO1xuICAgIH0gZWxzZSBpZiAocnMuaXNSb3VuZCkge1xuICAgICAgZGlzcFggPSBycy5taWRWZWN0b3JbMV07XG4gICAgICBkaXNwWSA9IC1ycy5taWRWZWN0b3JbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBpMiA9IHB0cy5sZW5ndGggLyAyIC0gMTtcbiAgICAgIHZhciBpMSA9IGkyIC0gMjtcbiAgICAgIGRpc3BYID0gcHRzW2kyXSAtIHB0c1tpMV07XG4gICAgICBkaXNwWSA9IHB0c1tpMiArIDFdIC0gcHRzW2kxICsgMV07XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzTXVsdGliZXppZXIgfHwgaXNDb21wb3VuZCB8fCBpc1NlbGYpIHtcbiAgICB2YXIgcHRzID0gcnMuYWxscHRzO1xuICAgIHZhciBjcHRzID0gcnMuY3RybHB0cztcbiAgICB2YXIgYnAweCwgYnAweTtcbiAgICB2YXIgYnAxeCwgYnAxeTtcbiAgICBpZiAoY3B0cy5sZW5ndGggLyAyICUgMiA9PT0gMCkge1xuICAgICAgdmFyIHAwID0gcHRzLmxlbmd0aCAvIDIgLSAxOyAvLyBzdGFydHB0XG4gICAgICB2YXIgaWMgPSBwMCArIDI7XG4gICAgICB2YXIgcDEgPSBpYyArIDI7XG4gICAgICBicDB4ID0gcWJlemllckF0KHB0c1twMF0sIHB0c1tpY10sIHB0c1twMV0sIDAuMCk7XG4gICAgICBicDB5ID0gcWJlemllckF0KHB0c1twMCArIDFdLCBwdHNbaWMgKyAxXSwgcHRzW3AxICsgMV0sIDAuMCk7XG4gICAgICBicDF4ID0gcWJlemllckF0KHB0c1twMF0sIHB0c1tpY10sIHB0c1twMV0sIDAuMDAwMSk7XG4gICAgICBicDF5ID0gcWJlemllckF0KHB0c1twMCArIDFdLCBwdHNbaWMgKyAxXSwgcHRzW3AxICsgMV0sIDAuMDAwMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBpYyA9IHB0cy5sZW5ndGggLyAyIC0gMTsgLy8gY3RycHRcbiAgICAgIHZhciBwMCA9IGljIC0gMjsgLy8gc3RhcnRwdFxuICAgICAgdmFyIHAxID0gaWMgKyAyOyAvLyBlbmRwdFxuXG4gICAgICBicDB4ID0gcWJlemllckF0KHB0c1twMF0sIHB0c1tpY10sIHB0c1twMV0sIDAuNDk5OSk7XG4gICAgICBicDB5ID0gcWJlemllckF0KHB0c1twMCArIDFdLCBwdHNbaWMgKyAxXSwgcHRzW3AxICsgMV0sIDAuNDk5OSk7XG4gICAgICBicDF4ID0gcWJlemllckF0KHB0c1twMF0sIHB0c1tpY10sIHB0c1twMV0sIDAuNSk7XG4gICAgICBicDF5ID0gcWJlemllckF0KHB0c1twMCArIDFdLCBwdHNbaWMgKyAxXSwgcHRzW3AxICsgMV0sIDAuNSk7XG4gICAgfVxuICAgIGRpc3BYID0gYnAxeCAtIGJwMHg7XG4gICAgZGlzcFkgPSBicDF5IC0gYnAweTtcbiAgfVxuICBycy5taWR0Z3RBcnJvd0FuZ2xlID0gZ2V0QW5nbGVGcm9tRGlzcChkaXNwWCwgZGlzcFkpO1xuICBycy5taWREaXNwWCA9IGRpc3BYO1xuICBycy5taWREaXNwWSA9IGRpc3BZO1xuXG4gIC8vIG1pZCBzb3VyY2VcbiAgLy9cblxuICBkaXNwWCAqPSAtMTtcbiAgZGlzcFkgKj0gLTE7XG4gIGlmIChpc1NlZ21lbnRzKSB7XG4gICAgdmFyIHB0cyA9IHJzLmFsbHB0cztcbiAgICBpZiAocHRzLmxlbmd0aCAvIDIgJSAyID09PSAwKSA7IGVsc2UgaWYgKCFycy5pc1JvdW5kKSB7XG4gICAgICB2YXIgaTIgPSBwdHMubGVuZ3RoIC8gMiAtIDE7XG4gICAgICB2YXIgaTMgPSBpMiArIDI7XG4gICAgICBkaXNwWCA9IC0ocHRzW2kzXSAtIHB0c1tpMl0pO1xuICAgICAgZGlzcFkgPSAtKHB0c1tpMyArIDFdIC0gcHRzW2kyICsgMV0pO1xuICAgIH1cbiAgfVxuICBycy5taWRzcmNBcnJvd0FuZ2xlID0gZ2V0QW5nbGVGcm9tRGlzcChkaXNwWCwgZGlzcFkpO1xuXG4gIC8vIHRhcmdldFxuICAvL1xuXG4gIGlmIChpc1NlZ21lbnRzKSB7XG4gICAgZGlzcFggPSBlbmRYIC0gcnMuc2VncHRzW3JzLnNlZ3B0cy5sZW5ndGggLSAyXTtcbiAgICBkaXNwWSA9IGVuZFkgLSBycy5zZWdwdHNbcnMuc2VncHRzLmxlbmd0aCAtIDFdO1xuICB9IGVsc2UgaWYgKGlzTXVsdGliZXppZXIgfHwgaXNDb21wb3VuZCB8fCBpc1NlbGYgfHwgaXNCZXppZXIpIHtcbiAgICB2YXIgcHRzID0gcnMuYWxscHRzO1xuICAgIHZhciBsID0gcHRzLmxlbmd0aDtcbiAgICB2YXIgYlggPSBxYmV6aWVyQXQocHRzW2wgLSA2XSwgcHRzW2wgLSA0XSwgcHRzW2wgLSAyXSwgMC45KTtcbiAgICB2YXIgYlkgPSBxYmV6aWVyQXQocHRzW2wgLSA1XSwgcHRzW2wgLSAzXSwgcHRzW2wgLSAxXSwgMC45KTtcbiAgICBkaXNwWCA9IGVuZFggLSBiWDtcbiAgICBkaXNwWSA9IGVuZFkgLSBiWTtcbiAgfSBlbHNlIHtcbiAgICBkaXNwWCA9IGVuZFggLSBtaWRYO1xuICAgIGRpc3BZID0gZW5kWSAtIG1pZFk7XG4gIH1cbiAgcnMudGd0QXJyb3dBbmdsZSA9IGdldEFuZ2xlRnJvbURpc3AoZGlzcFgsIGRpc3BZKTtcbn07XG5CUnAkZC5nZXRBcnJvd1dpZHRoID0gQlJwJGQuZ2V0QXJyb3dIZWlnaHQgPSBmdW5jdGlvbiAoZWRnZVdpZHRoLCBzY2FsZSkge1xuICB2YXIgY2FjaGUgPSB0aGlzLmFycm93V2lkdGhDYWNoZSA9IHRoaXMuYXJyb3dXaWR0aENhY2hlIHx8IHt9O1xuICB2YXIgY2FjaGVkVmFsID0gY2FjaGVbZWRnZVdpZHRoICsgJywgJyArIHNjYWxlXTtcbiAgaWYgKGNhY2hlZFZhbCkge1xuICAgIHJldHVybiBjYWNoZWRWYWw7XG4gIH1cbiAgY2FjaGVkVmFsID0gTWF0aC5tYXgoTWF0aC5wb3coZWRnZVdpZHRoICogMTMuMzcsIDAuOSksIDI5KSAqIHNjYWxlO1xuICBjYWNoZVtlZGdlV2lkdGggKyAnLCAnICsgc2NhbGVdID0gY2FjaGVkVmFsO1xuICByZXR1cm4gY2FjaGVkVmFsO1xufTtcblxuLyoqXG4gKiBFeHBsYWluZWQgYnkgQmxpbmRtYW42NyBhdCBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNDQ4NTY5MjUvMTEwMjg4MjhcbiAqL1xuXG4vLyBEZWNsYXJlIHJldXNlZCB2YXJpYWJsZSB0byBhdm9pZCByZWFsbG9jYXRpbmcgdmFyaWFibGVzIGV2ZXJ5IHRpbWUgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZFxudmFyIHgsXG4gIHksXG4gIHYxID0ge30sXG4gIHYyID0ge30sXG4gIHNpbkEsXG4gIHNpbkE5MCxcbiAgcmFkRGlyZWN0aW9uLFxuICBkcmF3RGlyZWN0aW9uLFxuICBhbmdsZSxcbiAgaGFsZkFuZ2xlLFxuICBjUmFkaXVzLFxuICBsZW5PdXQsXG4gIHJhZGl1cyxcbiAgbGltaXQ7XG52YXIgc3RhcnRYLCBzdGFydFksIHN0b3BYLCBzdG9wWTtcbnZhciBsYXN0UG9pbnQ7XG5cbi8vIGNvbnZlcnQgMiBwb2ludHMgaW50byB2ZWN0b3IgZm9ybSwgcG9sYXIgZm9ybSwgYW5kIG5vcm1hbGlzZWRcbnZhciBhc1ZlYyA9IGZ1bmN0aW9uIGFzVmVjKHAsIHBwLCB2KSB7XG4gIHYueCA9IHBwLnggLSBwLng7XG4gIHYueSA9IHBwLnkgLSBwLnk7XG4gIHYubGVuID0gTWF0aC5zcXJ0KHYueCAqIHYueCArIHYueSAqIHYueSk7XG4gIHYubnggPSB2LnggLyB2LmxlbjtcbiAgdi5ueSA9IHYueSAvIHYubGVuO1xuICB2LmFuZyA9IE1hdGguYXRhbjIodi5ueSwgdi5ueCk7XG59O1xudmFyIGludmVydFZlYyA9IGZ1bmN0aW9uIGludmVydFZlYyhvcmlnaW5hbFYsIGludmVydGVkVikge1xuICBpbnZlcnRlZFYueCA9IG9yaWdpbmFsVi54ICogLTE7XG4gIGludmVydGVkVi55ID0gb3JpZ2luYWxWLnkgKiAtMTtcbiAgaW52ZXJ0ZWRWLm54ID0gb3JpZ2luYWxWLm54ICogLTE7XG4gIGludmVydGVkVi5ueSA9IG9yaWdpbmFsVi5ueSAqIC0xO1xuICBpbnZlcnRlZFYuYW5nID0gb3JpZ2luYWxWLmFuZyA+IDAgPyAtKE1hdGguUEkgLSBvcmlnaW5hbFYuYW5nKSA6IE1hdGguUEkgKyBvcmlnaW5hbFYuYW5nO1xufTtcbnZhciBjYWxjQ29ybmVyQXJjID0gZnVuY3Rpb24gY2FsY0Nvcm5lckFyYyhwcmV2aW91c1BvaW50LCBjdXJyZW50UG9pbnQsIG5leHRQb2ludCwgcmFkaXVzTWF4LCBpc0FyY1JhZGl1cykge1xuICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIFBhcnQgMVxuICBwcmV2aW91c1BvaW50ICE9PSBsYXN0UG9pbnQgPyBhc1ZlYyhjdXJyZW50UG9pbnQsIHByZXZpb3VzUG9pbnQsIHYxKSA6IGludmVydFZlYyh2MiwgdjEpOyAvLyBBdm9pZCByZWNhbGN1bGF0aW5nIHZlYyBpZiBpdCBpcyB0aGUgaW52ZXJ0IG9mIHRoZSBsYXN0IG9uZSBjYWxjdWxhdGVkXG4gIGFzVmVjKGN1cnJlbnRQb2ludCwgbmV4dFBvaW50LCB2Mik7XG4gIHNpbkEgPSB2MS5ueCAqIHYyLm55IC0gdjEubnkgKiB2Mi5ueDtcbiAgc2luQTkwID0gdjEubnggKiB2Mi5ueCAtIHYxLm55ICogLXYyLm55O1xuICBhbmdsZSA9IE1hdGguYXNpbihNYXRoLm1heCgtMSwgTWF0aC5taW4oMSwgc2luQSkpKTtcbiAgaWYgKE1hdGguYWJzKGFuZ2xlKSA8IDFlLTYpIHtcbiAgICB4ID0gY3VycmVudFBvaW50Lng7XG4gICAgeSA9IGN1cnJlbnRQb2ludC55O1xuICAgIGNSYWRpdXMgPSByYWRpdXMgPSAwO1xuICAgIHJldHVybjtcbiAgfVxuICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIHJhZERpcmVjdGlvbiA9IDE7XG4gIGRyYXdEaXJlY3Rpb24gPSBmYWxzZTtcbiAgaWYgKHNpbkE5MCA8IDApIHtcbiAgICBpZiAoYW5nbGUgPCAwKSB7XG4gICAgICBhbmdsZSA9IE1hdGguUEkgKyBhbmdsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgYW5nbGUgPSBNYXRoLlBJIC0gYW5nbGU7XG4gICAgICByYWREaXJlY3Rpb24gPSAtMTtcbiAgICAgIGRyYXdEaXJlY3Rpb24gPSB0cnVlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoYW5nbGUgPiAwKSB7XG4gICAgICByYWREaXJlY3Rpb24gPSAtMTtcbiAgICAgIGRyYXdEaXJlY3Rpb24gPSB0cnVlO1xuICAgIH1cbiAgfVxuICBpZiAoY3VycmVudFBvaW50LnJhZGl1cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmFkaXVzID0gY3VycmVudFBvaW50LnJhZGl1cztcbiAgfSBlbHNlIHtcbiAgICByYWRpdXMgPSByYWRpdXNNYXg7XG4gIH1cbiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBQYXJ0IDJcbiAgaGFsZkFuZ2xlID0gYW5nbGUgLyAyO1xuICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgbGltaXQgPSBNYXRoLm1pbih2MS5sZW4gLyAyLCB2Mi5sZW4gLyAyKTtcbiAgaWYgKGlzQXJjUmFkaXVzKSB7XG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFBhcnQgM1xuICAgIGxlbk91dCA9IE1hdGguYWJzKE1hdGguY29zKGhhbGZBbmdsZSkgKiByYWRpdXMgLyBNYXRoLnNpbihoYWxmQW5nbGUpKTtcblxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBTcGVjaWFsIHBhcnQgQVxuICAgIGlmIChsZW5PdXQgPiBsaW1pdCkge1xuICAgICAgbGVuT3V0ID0gbGltaXQ7XG4gICAgICBjUmFkaXVzID0gTWF0aC5hYnMobGVuT3V0ICogTWF0aC5zaW4oaGFsZkFuZ2xlKSAvIE1hdGguY29zKGhhbGZBbmdsZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjUmFkaXVzID0gcmFkaXVzO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsZW5PdXQgPSBNYXRoLm1pbihsaW1pdCwgcmFkaXVzKTtcbiAgICBjUmFkaXVzID0gTWF0aC5hYnMobGVuT3V0ICogTWF0aC5zaW4oaGFsZkFuZ2xlKSAvIE1hdGguY29zKGhhbGZBbmdsZSkpO1xuICB9XG4gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIFBhcnQgNFxuICBzdG9wWCA9IGN1cnJlbnRQb2ludC54ICsgdjIubnggKiBsZW5PdXQ7XG4gIHN0b3BZID0gY3VycmVudFBvaW50LnkgKyB2Mi5ueSAqIGxlbk91dDtcbiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBQYXJ0IDVcbiAgeCA9IHN0b3BYIC0gdjIubnkgKiBjUmFkaXVzICogcmFkRGlyZWN0aW9uO1xuICB5ID0gc3RvcFkgKyB2Mi5ueCAqIGNSYWRpdXMgKiByYWREaXJlY3Rpb247XG4gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gQWRkaXRpb25hbCBQYXJ0IDogY2FsY3VsYXRlIHN0YXJ0IHBvaW50IEVcbiAgc3RhcnRYID0gY3VycmVudFBvaW50LnggKyB2MS5ueCAqIGxlbk91dDtcbiAgc3RhcnRZID0gY3VycmVudFBvaW50LnkgKyB2MS5ueSAqIGxlbk91dDtcblxuICAvLyBTYXZlIGxhc3QgcG9pbnQgdG8gYXZvaWQgcmVjYWxjdWxhdGluZyB2ZWN0b3Igd2hlbiBub3QgbmVlZGVkXG4gIGxhc3RQb2ludCA9IGN1cnJlbnRQb2ludDtcbn07XG5cbi8qKlxuICogRHJhdyBjb3JuZXIgcHJvdmlkZWQgYnkge0BsaW5rIGdldFJvdW5kQ29ybmVyfVxuICpcbiAqIEBwYXJhbSBjdHggOkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRFxuICogQHBhcmFtIHJvdW5kQ29ybmVyIHt7Y3g6bnVtYmVyLCBjeTpudW1iZXIsIHJhZGl1czpudW1iZXIsIGVuZEFuZ2xlOiBudW1iZXIsIHN0YXJ0QW5nbGU6IG51bWJlciwgY291bnRlckNsb2Nrd2lzZTogYm9vbGVhbn19XG4gKi9cbmZ1bmN0aW9uIGRyYXdQcmVwYXJlZFJvdW5kQ29ybmVyKGN0eCwgcm91bmRDb3JuZXIpIHtcbiAgaWYgKHJvdW5kQ29ybmVyLnJhZGl1cyA9PT0gMCkgY3R4LmxpbmVUbyhyb3VuZENvcm5lci5jeCwgcm91bmRDb3JuZXIuY3kpO2Vsc2UgY3R4LmFyYyhyb3VuZENvcm5lci5jeCwgcm91bmRDb3JuZXIuY3ksIHJvdW5kQ29ybmVyLnJhZGl1cywgcm91bmRDb3JuZXIuc3RhcnRBbmdsZSwgcm91bmRDb3JuZXIuZW5kQW5nbGUsIHJvdW5kQ29ybmVyLmNvdW50ZXJDbG9ja3dpc2UpO1xufVxuXG4vKipcbiAqIEdldCByb3VuZCBjb3JuZXIgZnJvbSBhIHBvaW50IGFuZCBpdHMgcHJldmlvdXMgYW5kIG5leHQgbmVpZ2hib3VycyBpbiBhIHBhdGhcbiAqXG4gKiBAcGFyYW0gcHJldmlvdXNQb2ludCB7e3g6IG51bWJlciwgeTpudW1iZXIsIHJhZGl1czogbnVtYmVyP319XG4gKiBAcGFyYW0gY3VycmVudFBvaW50IHt7eDogbnVtYmVyLCB5Om51bWJlciwgcmFkaXVzOiBudW1iZXI/fX1cbiAqIEBwYXJhbSBuZXh0UG9pbnQge3t4OiBudW1iZXIsIHk6bnVtYmVyLCByYWRpdXM6IG51bWJlcj99fVxuICogQHBhcmFtIHJhZGl1c01heCA6bnVtYmVyXG4gKiBAcGFyYW0gaXNBcmNSYWRpdXMgOmJvb2xlYW5cbiAqIEByZXR1cm4ge3tcbiAqIGN4Om51bWJlciwgY3k6bnVtYmVyLCByYWRpdXM6bnVtYmVyLFxuICogc3RhcnRYOm51bWJlciwgc3RhcnRZOm51bWJlcixcbiAqIHN0b3BYOm51bWJlciwgc3RvcFk6IG51bWJlcixcbiAqIGVuZEFuZ2xlOiBudW1iZXIsIHN0YXJ0QW5nbGU6IG51bWJlciwgY291bnRlckNsb2Nrd2lzZTogYm9vbGVhblxuICogfX1cbiAqL1xuZnVuY3Rpb24gZ2V0Um91bmRDb3JuZXIocHJldmlvdXNQb2ludCwgY3VycmVudFBvaW50LCBuZXh0UG9pbnQsIHJhZGl1c01heCkge1xuICB2YXIgaXNBcmNSYWRpdXMgPSBhcmd1bWVudHMubGVuZ3RoID4gNCAmJiBhcmd1bWVudHNbNF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s0XSA6IHRydWU7XG4gIGlmIChyYWRpdXNNYXggPT09IDAgfHwgY3VycmVudFBvaW50LnJhZGl1cyA9PT0gMCkgcmV0dXJuIHtcbiAgICBjeDogY3VycmVudFBvaW50LngsXG4gICAgY3k6IGN1cnJlbnRQb2ludC55LFxuICAgIHJhZGl1czogMCxcbiAgICBzdGFydFg6IGN1cnJlbnRQb2ludC54LFxuICAgIHN0YXJ0WTogY3VycmVudFBvaW50LnksXG4gICAgc3RvcFg6IGN1cnJlbnRQb2ludC54LFxuICAgIHN0b3BZOiBjdXJyZW50UG9pbnQueSxcbiAgICBzdGFydEFuZ2xlOiB1bmRlZmluZWQsXG4gICAgZW5kQW5nbGU6IHVuZGVmaW5lZCxcbiAgICBjb3VudGVyQ2xvY2t3aXNlOiB1bmRlZmluZWRcbiAgfTtcbiAgY2FsY0Nvcm5lckFyYyhwcmV2aW91c1BvaW50LCBjdXJyZW50UG9pbnQsIG5leHRQb2ludCwgcmFkaXVzTWF4LCBpc0FyY1JhZGl1cyk7XG4gIHJldHVybiB7XG4gICAgY3g6IHgsXG4gICAgY3k6IHksXG4gICAgcmFkaXVzOiBjUmFkaXVzLFxuICAgIHN0YXJ0WDogc3RhcnRYLFxuICAgIHN0YXJ0WTogc3RhcnRZLFxuICAgIHN0b3BYOiBzdG9wWCxcbiAgICBzdG9wWTogc3RvcFksXG4gICAgc3RhcnRBbmdsZTogdjEuYW5nICsgTWF0aC5QSSAvIDIgKiByYWREaXJlY3Rpb24sXG4gICAgZW5kQW5nbGU6IHYyLmFuZyAtIE1hdGguUEkgLyAyICogcmFkRGlyZWN0aW9uLFxuICAgIGNvdW50ZXJDbG9ja3dpc2U6IGRyYXdEaXJlY3Rpb25cbiAgfTtcbn1cblxudmFyIEFWT0lEX0lNUE9TU0lCTEVfQkVaSUVSX0NPTlNUQU5UID0gMC4wMTtcbnZhciBBVk9JRF9JTVBPU1NJQkxFX0JFWklFUl9DT05TVEFOVF9MID0gTWF0aC5zcXJ0KDIgKiBBVk9JRF9JTVBPU1NJQkxFX0JFWklFUl9DT05TVEFOVCk7XG52YXIgQlJwJGMgPSB7fTtcbkJScCRjLmZpbmRNaWRwdFB0c0V0YyA9IGZ1bmN0aW9uIChlZGdlLCBwYWlySW5mbykge1xuICB2YXIgcG9zUHRzID0gcGFpckluZm8ucG9zUHRzLFxuICAgIGludGVyc2VjdGlvblB0cyA9IHBhaXJJbmZvLmludGVyc2VjdGlvblB0cyxcbiAgICB2ZWN0b3JOb3JtSW52ZXJzZSA9IHBhaXJJbmZvLnZlY3Rvck5vcm1JbnZlcnNlO1xuICB2YXIgbWlkcHRQdHM7XG5cbiAgLy8gbi5iLiBhc3N1bWVzIGFsbCBlZGdlcyBpbiBiZXppZXIgYnVuZGxlIGhhdmUgc2FtZSBlbmRwb2ludHMgc3BlY2lmaWVkXG4gIHZhciBzcmNNYW5FbmRwdCA9IGVkZ2UucHN0eWxlKCdzb3VyY2UtZW5kcG9pbnQnKTtcbiAgdmFyIHRndE1hbkVuZHB0ID0gZWRnZS5wc3R5bGUoJ3RhcmdldC1lbmRwb2ludCcpO1xuICB2YXIgaGF2ZU1hbnVhbEVuZFB0cyA9IHNyY01hbkVuZHB0LnVuaXRzICE9IG51bGwgJiYgdGd0TWFuRW5kcHQudW5pdHMgIT0gbnVsbDtcbiAgdmFyIHJlY2FsY1ZlY3Rvck5vcm1JbnZlcnNlID0gZnVuY3Rpb24gcmVjYWxjVmVjdG9yTm9ybUludmVyc2UoeDEsIHkxLCB4MiwgeTIpIHtcbiAgICB2YXIgZHkgPSB5MiAtIHkxO1xuICAgIHZhciBkeCA9IHgyIC0geDE7XG4gICAgdmFyIGwgPSBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpO1xuICAgIHJldHVybiB7XG4gICAgICB4OiAtZHkgLyBsLFxuICAgICAgeTogZHggLyBsXG4gICAgfTtcbiAgfTtcbiAgdmFyIGVkZ2VEaXN0YW5jZXMgPSBlZGdlLnBzdHlsZSgnZWRnZS1kaXN0YW5jZXMnKS52YWx1ZTtcbiAgc3dpdGNoIChlZGdlRGlzdGFuY2VzKSB7XG4gICAgY2FzZSAnbm9kZS1wb3NpdGlvbic6XG4gICAgICBtaWRwdFB0cyA9IHBvc1B0cztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2ludGVyc2VjdGlvbic6XG4gICAgICBtaWRwdFB0cyA9IGludGVyc2VjdGlvblB0cztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2VuZHBvaW50cyc6XG4gICAgICB7XG4gICAgICAgIGlmIChoYXZlTWFudWFsRW5kUHRzKSB7XG4gICAgICAgICAgdmFyIF90aGlzJG1hbnVhbEVuZHB0VG9QeCA9IHRoaXMubWFudWFsRW5kcHRUb1B4KGVkZ2Uuc291cmNlKClbMF0sIHNyY01hbkVuZHB0KSxcbiAgICAgICAgICAgIF90aGlzJG1hbnVhbEVuZHB0VG9QeDIgPSBfc2xpY2VkVG9BcnJheShfdGhpcyRtYW51YWxFbmRwdFRvUHgsIDIpLFxuICAgICAgICAgICAgeDEgPSBfdGhpcyRtYW51YWxFbmRwdFRvUHgyWzBdLFxuICAgICAgICAgICAgeTEgPSBfdGhpcyRtYW51YWxFbmRwdFRvUHgyWzFdO1xuICAgICAgICAgIHZhciBfdGhpcyRtYW51YWxFbmRwdFRvUHgzID0gdGhpcy5tYW51YWxFbmRwdFRvUHgoZWRnZS50YXJnZXQoKVswXSwgdGd0TWFuRW5kcHQpLFxuICAgICAgICAgICAgX3RoaXMkbWFudWFsRW5kcHRUb1B4NCA9IF9zbGljZWRUb0FycmF5KF90aGlzJG1hbnVhbEVuZHB0VG9QeDMsIDIpLFxuICAgICAgICAgICAgeDIgPSBfdGhpcyRtYW51YWxFbmRwdFRvUHg0WzBdLFxuICAgICAgICAgICAgeTIgPSBfdGhpcyRtYW51YWxFbmRwdFRvUHg0WzFdO1xuICAgICAgICAgIHZhciBlbmRQdHMgPSB7XG4gICAgICAgICAgICB4MTogeDEsXG4gICAgICAgICAgICB5MTogeTEsXG4gICAgICAgICAgICB4MjogeDIsXG4gICAgICAgICAgICB5MjogeTJcbiAgICAgICAgICB9O1xuICAgICAgICAgIHZlY3Rvck5vcm1JbnZlcnNlID0gcmVjYWxjVmVjdG9yTm9ybUludmVyc2UoeDEsIHkxLCB4MiwgeTIpO1xuICAgICAgICAgIG1pZHB0UHRzID0gZW5kUHRzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHdhcm4oXCJFZGdlIFwiLmNvbmNhdChlZGdlLmlkKCksIFwiIGhhcyBlZGdlLWRpc3RhbmNlczplbmRwb2ludHMgc3BlY2lmaWVkIHdpdGhvdXQgbWFudWFsIGVuZHBvaW50cyBzcGVjaWZpZWQgdmlhIHNvdXJjZS1lbmRwb2ludCBhbmQgdGFyZ2V0LWVuZHBvaW50LiAgRmFsbGluZyBiYWNrIG9uIGVkZ2UtZGlzdGFuY2VzOmludGVyc2VjdGlvbiAoZGVmYXVsdCkuXCIpKTtcbiAgICAgICAgICBtaWRwdFB0cyA9IGludGVyc2VjdGlvblB0czsgLy8gYmFjayB0byBkZWZhdWx0XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBtaWRwdFB0czogbWlkcHRQdHMsXG4gICAgdmVjdG9yTm9ybUludmVyc2U6IHZlY3Rvck5vcm1JbnZlcnNlXG4gIH07XG59O1xuQlJwJGMuZmluZEhheXN0YWNrUG9pbnRzID0gZnVuY3Rpb24gKGVkZ2VzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWRnZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZWRnZSA9IGVkZ2VzW2ldO1xuICAgIHZhciBfcCA9IGVkZ2UuX3ByaXZhdGU7XG4gICAgdmFyIHJzID0gX3AucnNjcmF0Y2g7XG4gICAgaWYgKCFycy5oYXlzdGFjaykge1xuICAgICAgdmFyIGFuZ2xlID0gTWF0aC5yYW5kb20oKSAqIDIgKiBNYXRoLlBJO1xuICAgICAgcnMuc291cmNlID0ge1xuICAgICAgICB4OiBNYXRoLmNvcyhhbmdsZSksXG4gICAgICAgIHk6IE1hdGguc2luKGFuZ2xlKVxuICAgICAgfTtcbiAgICAgIGFuZ2xlID0gTWF0aC5yYW5kb20oKSAqIDIgKiBNYXRoLlBJO1xuICAgICAgcnMudGFyZ2V0ID0ge1xuICAgICAgICB4OiBNYXRoLmNvcyhhbmdsZSksXG4gICAgICAgIHk6IE1hdGguc2luKGFuZ2xlKVxuICAgICAgfTtcbiAgICB9XG4gICAgdmFyIHNyYyA9IF9wLnNvdXJjZTtcbiAgICB2YXIgdGd0ID0gX3AudGFyZ2V0O1xuICAgIHZhciBzcmNQb3MgPSBzcmMucG9zaXRpb24oKTtcbiAgICB2YXIgdGd0UG9zID0gdGd0LnBvc2l0aW9uKCk7XG4gICAgdmFyIHNyY1cgPSBzcmMud2lkdGgoKTtcbiAgICB2YXIgdGd0VyA9IHRndC53aWR0aCgpO1xuICAgIHZhciBzcmNIID0gc3JjLmhlaWdodCgpO1xuICAgIHZhciB0Z3RIID0gdGd0LmhlaWdodCgpO1xuICAgIHZhciByYWRpdXMgPSBlZGdlLnBzdHlsZSgnaGF5c3RhY2stcmFkaXVzJykudmFsdWU7XG4gICAgdmFyIGhhbGZSYWRpdXMgPSByYWRpdXMgLyAyOyAvLyBiL2MgaGF2ZSB0byBoYWxmIHdpZHRoL2hlaWdodFxuXG4gICAgcnMuaGF5c3RhY2tQdHMgPSBycy5hbGxwdHMgPSBbcnMuc291cmNlLnggKiBzcmNXICogaGFsZlJhZGl1cyArIHNyY1Bvcy54LCBycy5zb3VyY2UueSAqIHNyY0ggKiBoYWxmUmFkaXVzICsgc3JjUG9zLnksIHJzLnRhcmdldC54ICogdGd0VyAqIGhhbGZSYWRpdXMgKyB0Z3RQb3MueCwgcnMudGFyZ2V0LnkgKiB0Z3RIICogaGFsZlJhZGl1cyArIHRndFBvcy55XTtcbiAgICBycy5taWRYID0gKHJzLmFsbHB0c1swXSArIHJzLmFsbHB0c1syXSkgLyAyO1xuICAgIHJzLm1pZFkgPSAocnMuYWxscHRzWzFdICsgcnMuYWxscHRzWzNdKSAvIDI7XG5cbiAgICAvLyBhbHdheXMgb3ZlcnJpZGUgYXMgaGF5c3RhY2sgaW4gY2FzZSBzZXQgdG8gZGlmZmVyZW50IHR5cGUgcHJldmlvdXNseVxuICAgIHJzLmVkZ2VUeXBlID0gJ2hheXN0YWNrJztcbiAgICBycy5oYXlzdGFjayA9IHRydWU7XG4gICAgdGhpcy5zdG9yZUVkZ2VQcm9qZWN0aW9ucyhlZGdlKTtcbiAgICB0aGlzLmNhbGN1bGF0ZUFycm93QW5nbGVzKGVkZ2UpO1xuICAgIHRoaXMucmVjYWxjdWxhdGVFZGdlTGFiZWxQcm9qZWN0aW9ucyhlZGdlKTtcbiAgICB0aGlzLmNhbGN1bGF0ZUxhYmVsQW5nbGVzKGVkZ2UpO1xuICB9XG59O1xuQlJwJGMuZmluZFNlZ21lbnRzUG9pbnRzID0gZnVuY3Rpb24gKGVkZ2UsIHBhaXJJbmZvKSB7XG4gIC8vIFNlZ21lbnRzIChtdWx0aXBsZSBzdHJhaWdodCBsaW5lcylcblxuICB2YXIgcnMgPSBlZGdlLl9wcml2YXRlLnJzY3JhdGNoO1xuICB2YXIgc2VnbWVudFdzID0gZWRnZS5wc3R5bGUoJ3NlZ21lbnQtd2VpZ2h0cycpO1xuICB2YXIgc2VnbWVudERzID0gZWRnZS5wc3R5bGUoJ3NlZ21lbnQtZGlzdGFuY2VzJyk7XG4gIHZhciBzZWdtZW50UnMgPSBlZGdlLnBzdHlsZSgnc2VnbWVudC1yYWRpaScpO1xuICB2YXIgc2VnbWVudFRzID0gZWRnZS5wc3R5bGUoJ3JhZGl1cy10eXBlJyk7XG4gIHZhciBzZWdtZW50c04gPSBNYXRoLm1pbihzZWdtZW50V3MucGZWYWx1ZS5sZW5ndGgsIHNlZ21lbnREcy5wZlZhbHVlLmxlbmd0aCk7XG4gIHZhciBsYXN0UmFkaXVzID0gc2VnbWVudFJzLnBmVmFsdWVbc2VnbWVudFJzLnBmVmFsdWUubGVuZ3RoIC0gMV07XG4gIHZhciBsYXN0UmFkaXVzVHlwZSA9IHNlZ21lbnRUcy5wZlZhbHVlW3NlZ21lbnRUcy5wZlZhbHVlLmxlbmd0aCAtIDFdO1xuICBycy5lZGdlVHlwZSA9ICdzZWdtZW50cyc7XG4gIHJzLnNlZ3B0cyA9IFtdO1xuICBycy5yYWRpaSA9IFtdO1xuICBycy5pc0FyY1JhZGl1cyA9IFtdO1xuICBmb3IgKHZhciBzID0gMDsgcyA8IHNlZ21lbnRzTjsgcysrKSB7XG4gICAgdmFyIHcgPSBzZWdtZW50V3MucGZWYWx1ZVtzXTtcbiAgICB2YXIgZCA9IHNlZ21lbnREcy5wZlZhbHVlW3NdO1xuICAgIHZhciB3MSA9IDEgLSB3O1xuICAgIHZhciB3MiA9IHc7XG4gICAgdmFyIF90aGlzJGZpbmRNaWRwdFB0c0V0YyA9IHRoaXMuZmluZE1pZHB0UHRzRXRjKGVkZ2UsIHBhaXJJbmZvKSxcbiAgICAgIG1pZHB0UHRzID0gX3RoaXMkZmluZE1pZHB0UHRzRXRjLm1pZHB0UHRzLFxuICAgICAgdmVjdG9yTm9ybUludmVyc2UgPSBfdGhpcyRmaW5kTWlkcHRQdHNFdGMudmVjdG9yTm9ybUludmVyc2U7XG4gICAgdmFyIGFkanVzdGVkTWlkcHQgPSB7XG4gICAgICB4OiBtaWRwdFB0cy54MSAqIHcxICsgbWlkcHRQdHMueDIgKiB3MixcbiAgICAgIHk6IG1pZHB0UHRzLnkxICogdzEgKyBtaWRwdFB0cy55MiAqIHcyXG4gICAgfTtcbiAgICBycy5zZWdwdHMucHVzaChhZGp1c3RlZE1pZHB0LnggKyB2ZWN0b3JOb3JtSW52ZXJzZS54ICogZCwgYWRqdXN0ZWRNaWRwdC55ICsgdmVjdG9yTm9ybUludmVyc2UueSAqIGQpO1xuICAgIHJzLnJhZGlpLnB1c2goc2VnbWVudFJzLnBmVmFsdWVbc10gIT09IHVuZGVmaW5lZCA/IHNlZ21lbnRScy5wZlZhbHVlW3NdIDogbGFzdFJhZGl1cyk7XG4gICAgcnMuaXNBcmNSYWRpdXMucHVzaCgoc2VnbWVudFRzLnBmVmFsdWVbc10gIT09IHVuZGVmaW5lZCA/IHNlZ21lbnRUcy5wZlZhbHVlW3NdIDogbGFzdFJhZGl1c1R5cGUpID09PSAnYXJjLXJhZGl1cycpO1xuICB9XG59O1xuQlJwJGMuZmluZExvb3BQb2ludHMgPSBmdW5jdGlvbiAoZWRnZSwgcGFpckluZm8sIGksIGVkZ2VJc1VuYnVuZGxlZCkge1xuICAvLyBTZWxmLWVkZ2VcblxuICB2YXIgcnMgPSBlZGdlLl9wcml2YXRlLnJzY3JhdGNoO1xuICB2YXIgZGlyQ291bnRzID0gcGFpckluZm8uZGlyQ291bnRzLFxuICAgIHNyY1BvcyA9IHBhaXJJbmZvLnNyY1BvcztcbiAgdmFyIGN0cmxwdERpc3RzID0gZWRnZS5wc3R5bGUoJ2NvbnRyb2wtcG9pbnQtZGlzdGFuY2VzJyk7XG4gIHZhciBjdHJscHREaXN0ID0gY3RybHB0RGlzdHMgPyBjdHJscHREaXN0cy5wZlZhbHVlWzBdIDogdW5kZWZpbmVkO1xuICB2YXIgbG9vcERpciA9IGVkZ2UucHN0eWxlKCdsb29wLWRpcmVjdGlvbicpLnBmVmFsdWU7XG4gIHZhciBsb29wU3dwID0gZWRnZS5wc3R5bGUoJ2xvb3Atc3dlZXAnKS5wZlZhbHVlO1xuICB2YXIgc3RlcFNpemUgPSBlZGdlLnBzdHlsZSgnY29udHJvbC1wb2ludC1zdGVwLXNpemUnKS5wZlZhbHVlO1xuICBycy5lZGdlVHlwZSA9ICdzZWxmJztcbiAgdmFyIGogPSBpO1xuICB2YXIgbG9vcERpc3QgPSBzdGVwU2l6ZTtcbiAgaWYgKGVkZ2VJc1VuYnVuZGxlZCkge1xuICAgIGogPSAwO1xuICAgIGxvb3BEaXN0ID0gY3RybHB0RGlzdDtcbiAgfVxuICB2YXIgbG9vcEFuZ2xlID0gbG9vcERpciAtIE1hdGguUEkgLyAyO1xuICB2YXIgb3V0QW5nbGUgPSBsb29wQW5nbGUgLSBsb29wU3dwIC8gMjtcbiAgdmFyIGluQW5nbGUgPSBsb29wQW5nbGUgKyBsb29wU3dwIC8gMjtcblxuICAvLyBpbmNyZWFzZSBieSBzdGVwIHNpemUgZm9yIG92ZXJsYXBwaW5nIGxvb3BzLCBrZXllZCBvbiBkaXJlY3Rpb24gYW5kIHN3ZWVwIHZhbHVlc1xuICB2YXIgZGMgPSBTdHJpbmcobG9vcERpciArICdfJyArIGxvb3BTd3ApO1xuICBqID0gZGlyQ291bnRzW2RjXSA9PT0gdW5kZWZpbmVkID8gZGlyQ291bnRzW2RjXSA9IDAgOiArK2RpckNvdW50c1tkY107XG4gIHJzLmN0cmxwdHMgPSBbc3JjUG9zLnggKyBNYXRoLmNvcyhvdXRBbmdsZSkgKiAxLjQgKiBsb29wRGlzdCAqIChqIC8gMyArIDEpLCBzcmNQb3MueSArIE1hdGguc2luKG91dEFuZ2xlKSAqIDEuNCAqIGxvb3BEaXN0ICogKGogLyAzICsgMSksIHNyY1Bvcy54ICsgTWF0aC5jb3MoaW5BbmdsZSkgKiAxLjQgKiBsb29wRGlzdCAqIChqIC8gMyArIDEpLCBzcmNQb3MueSArIE1hdGguc2luKGluQW5nbGUpICogMS40ICogbG9vcERpc3QgKiAoaiAvIDMgKyAxKV07XG59O1xuQlJwJGMuZmluZENvbXBvdW5kTG9vcFBvaW50cyA9IGZ1bmN0aW9uIChlZGdlLCBwYWlySW5mbywgaSwgZWRnZUlzVW5idW5kbGVkKSB7XG4gIC8vIENvbXBvdW5kIGVkZ2VcblxuICB2YXIgcnMgPSBlZGdlLl9wcml2YXRlLnJzY3JhdGNoO1xuICBycy5lZGdlVHlwZSA9ICdjb21wb3VuZCc7XG4gIHZhciBzcmNQb3MgPSBwYWlySW5mby5zcmNQb3MsXG4gICAgdGd0UG9zID0gcGFpckluZm8udGd0UG9zLFxuICAgIHNyY1cgPSBwYWlySW5mby5zcmNXLFxuICAgIHNyY0ggPSBwYWlySW5mby5zcmNILFxuICAgIHRndFcgPSBwYWlySW5mby50Z3RXLFxuICAgIHRndEggPSBwYWlySW5mby50Z3RIO1xuICB2YXIgc3RlcFNpemUgPSBlZGdlLnBzdHlsZSgnY29udHJvbC1wb2ludC1zdGVwLXNpemUnKS5wZlZhbHVlO1xuICB2YXIgY3RybHB0RGlzdHMgPSBlZGdlLnBzdHlsZSgnY29udHJvbC1wb2ludC1kaXN0YW5jZXMnKTtcbiAgdmFyIGN0cmxwdERpc3QgPSBjdHJscHREaXN0cyA/IGN0cmxwdERpc3RzLnBmVmFsdWVbMF0gOiB1bmRlZmluZWQ7XG4gIHZhciBqID0gaTtcbiAgdmFyIGxvb3BEaXN0ID0gc3RlcFNpemU7XG4gIGlmIChlZGdlSXNVbmJ1bmRsZWQpIHtcbiAgICBqID0gMDtcbiAgICBsb29wRGlzdCA9IGN0cmxwdERpc3Q7XG4gIH1cbiAgdmFyIGxvb3BXID0gNTA7XG4gIHZhciBsb29wYVBvcyA9IHtcbiAgICB4OiBzcmNQb3MueCAtIHNyY1cgLyAyLFxuICAgIHk6IHNyY1Bvcy55IC0gc3JjSCAvIDJcbiAgfTtcbiAgdmFyIGxvb3BiUG9zID0ge1xuICAgIHg6IHRndFBvcy54IC0gdGd0VyAvIDIsXG4gICAgeTogdGd0UG9zLnkgLSB0Z3RIIC8gMlxuICB9O1xuICB2YXIgbG9vcFBvcyA9IHtcbiAgICB4OiBNYXRoLm1pbihsb29wYVBvcy54LCBsb29wYlBvcy54KSxcbiAgICB5OiBNYXRoLm1pbihsb29wYVBvcy55LCBsb29wYlBvcy55KVxuICB9O1xuXG4gIC8vIGF2b2lkcyBjYXNlcyB3aXRoIGltcG9zc2libGUgYmV6aWVyc1xuICB2YXIgbWluQ29tcG91bmRTdHJldGNoID0gMC41O1xuICB2YXIgY29tcG91bmRTdHJldGNoQSA9IE1hdGgubWF4KG1pbkNvbXBvdW5kU3RyZXRjaCwgTWF0aC5sb2coc3JjVyAqIEFWT0lEX0lNUE9TU0lCTEVfQkVaSUVSX0NPTlNUQU5UKSk7XG4gIHZhciBjb21wb3VuZFN0cmV0Y2hCID0gTWF0aC5tYXgobWluQ29tcG91bmRTdHJldGNoLCBNYXRoLmxvZyh0Z3RXICogQVZPSURfSU1QT1NTSUJMRV9CRVpJRVJfQ09OU1RBTlQpKTtcbiAgcnMuY3RybHB0cyA9IFtsb29wUG9zLngsIGxvb3BQb3MueSAtICgxICsgTWF0aC5wb3cobG9vcFcsIDEuMTIpIC8gMTAwKSAqIGxvb3BEaXN0ICogKGogLyAzICsgMSkgKiBjb21wb3VuZFN0cmV0Y2hBLCBsb29wUG9zLnggLSAoMSArIE1hdGgucG93KGxvb3BXLCAxLjEyKSAvIDEwMCkgKiBsb29wRGlzdCAqIChqIC8gMyArIDEpICogY29tcG91bmRTdHJldGNoQiwgbG9vcFBvcy55XTtcbn07XG5CUnAkYy5maW5kU3RyYWlnaHRFZGdlUG9pbnRzID0gZnVuY3Rpb24gKGVkZ2UpIHtcbiAgLy8gU3RyYWlnaHQgZWRnZSB3aXRoaW4gYnVuZGxlXG5cbiAgZWRnZS5fcHJpdmF0ZS5yc2NyYXRjaC5lZGdlVHlwZSA9ICdzdHJhaWdodCc7XG59O1xuQlJwJGMuZmluZEJlemllclBvaW50cyA9IGZ1bmN0aW9uIChlZGdlLCBwYWlySW5mbywgaSwgZWRnZUlzVW5idW5kbGVkLCBlZGdlSXNTd2FwcGVkKSB7XG4gIHZhciBycyA9IGVkZ2UuX3ByaXZhdGUucnNjcmF0Y2g7XG4gIHZhciBzdGVwU2l6ZSA9IGVkZ2UucHN0eWxlKCdjb250cm9sLXBvaW50LXN0ZXAtc2l6ZScpLnBmVmFsdWU7XG4gIHZhciBjdHJscHREaXN0cyA9IGVkZ2UucHN0eWxlKCdjb250cm9sLXBvaW50LWRpc3RhbmNlcycpO1xuICB2YXIgY3RybHB0V3MgPSBlZGdlLnBzdHlsZSgnY29udHJvbC1wb2ludC13ZWlnaHRzJyk7XG4gIHZhciBiZXppZXJOID0gY3RybHB0RGlzdHMgJiYgY3RybHB0V3MgPyBNYXRoLm1pbihjdHJscHREaXN0cy52YWx1ZS5sZW5ndGgsIGN0cmxwdFdzLnZhbHVlLmxlbmd0aCkgOiAxO1xuICB2YXIgY3RybHB0RGlzdCA9IGN0cmxwdERpc3RzID8gY3RybHB0RGlzdHMucGZWYWx1ZVswXSA6IHVuZGVmaW5lZDtcbiAgdmFyIGN0cmxwdFdlaWdodCA9IGN0cmxwdFdzLnZhbHVlWzBdO1xuXG4gIC8vIChNdWx0aSliZXppZXJcblxuICB2YXIgbXVsdGkgPSBlZGdlSXNVbmJ1bmRsZWQ7XG4gIHJzLmVkZ2VUeXBlID0gbXVsdGkgPyAnbXVsdGliZXppZXInIDogJ2Jlemllcic7XG4gIHJzLmN0cmxwdHMgPSBbXTtcbiAgZm9yICh2YXIgYiA9IDA7IGIgPCBiZXppZXJOOyBiKyspIHtcbiAgICB2YXIgbm9ybWN0cmxwdERpc3QgPSAoMC41IC0gcGFpckluZm8uZWxlcy5sZW5ndGggLyAyICsgaSkgKiBzdGVwU2l6ZSAqIChlZGdlSXNTd2FwcGVkID8gLTEgOiAxKTtcbiAgICB2YXIgbWFuY3RybHB0RGlzdCA9IHZvaWQgMDtcbiAgICB2YXIgc2lnbiA9IHNpZ251bShub3JtY3RybHB0RGlzdCk7XG4gICAgaWYgKG11bHRpKSB7XG4gICAgICBjdHJscHREaXN0ID0gY3RybHB0RGlzdHMgPyBjdHJscHREaXN0cy5wZlZhbHVlW2JdIDogc3RlcFNpemU7IC8vIGZhbGwgYmFjayBvbiBzdGVwIHNpemVcbiAgICAgIGN0cmxwdFdlaWdodCA9IGN0cmxwdFdzLnZhbHVlW2JdO1xuICAgIH1cbiAgICBpZiAoZWRnZUlzVW5idW5kbGVkKSB7XG4gICAgICAvLyBtdWx0aSBvciBzaW5nbGUgdW5idW5kbGVkXG4gICAgICBtYW5jdHJscHREaXN0ID0gY3RybHB0RGlzdDtcbiAgICB9IGVsc2Uge1xuICAgICAgbWFuY3RybHB0RGlzdCA9IGN0cmxwdERpc3QgIT09IHVuZGVmaW5lZCA/IHNpZ24gKiBjdHJscHREaXN0IDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICB2YXIgZGlzdGFuY2VGcm9tTWlkcG9pbnQgPSBtYW5jdHJscHREaXN0ICE9PSB1bmRlZmluZWQgPyBtYW5jdHJscHREaXN0IDogbm9ybWN0cmxwdERpc3Q7XG4gICAgdmFyIHcxID0gMSAtIGN0cmxwdFdlaWdodDtcbiAgICB2YXIgdzIgPSBjdHJscHRXZWlnaHQ7XG4gICAgdmFyIF90aGlzJGZpbmRNaWRwdFB0c0V0YzIgPSB0aGlzLmZpbmRNaWRwdFB0c0V0YyhlZGdlLCBwYWlySW5mbyksXG4gICAgICBtaWRwdFB0cyA9IF90aGlzJGZpbmRNaWRwdFB0c0V0YzIubWlkcHRQdHMsXG4gICAgICB2ZWN0b3JOb3JtSW52ZXJzZSA9IF90aGlzJGZpbmRNaWRwdFB0c0V0YzIudmVjdG9yTm9ybUludmVyc2U7XG4gICAgdmFyIGFkanVzdGVkTWlkcHQgPSB7XG4gICAgICB4OiBtaWRwdFB0cy54MSAqIHcxICsgbWlkcHRQdHMueDIgKiB3MixcbiAgICAgIHk6IG1pZHB0UHRzLnkxICogdzEgKyBtaWRwdFB0cy55MiAqIHcyXG4gICAgfTtcbiAgICBycy5jdHJscHRzLnB1c2goYWRqdXN0ZWRNaWRwdC54ICsgdmVjdG9yTm9ybUludmVyc2UueCAqIGRpc3RhbmNlRnJvbU1pZHBvaW50LCBhZGp1c3RlZE1pZHB0LnkgKyB2ZWN0b3JOb3JtSW52ZXJzZS55ICogZGlzdGFuY2VGcm9tTWlkcG9pbnQpO1xuICB9XG59O1xuQlJwJGMuZmluZFRheGlQb2ludHMgPSBmdW5jdGlvbiAoZWRnZSwgcGFpckluZm8pIHtcbiAgLy8gVGF4aWNhYiBnZW9tZXRyeSB3aXRoIHR3byB0dXJucyBtYXhpbXVtXG5cbiAgdmFyIHJzID0gZWRnZS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgcnMuZWRnZVR5cGUgPSAnc2VnbWVudHMnO1xuICB2YXIgVkVSVElDQUwgPSAndmVydGljYWwnO1xuICB2YXIgSE9SSVpPTlRBTCA9ICdob3Jpem9udGFsJztcbiAgdmFyIExFRlRXQVJEID0gJ2xlZnR3YXJkJztcbiAgdmFyIFJJR0hUV0FSRCA9ICdyaWdodHdhcmQnO1xuICB2YXIgRE9XTldBUkQgPSAnZG93bndhcmQnO1xuICB2YXIgVVBXQVJEID0gJ3Vwd2FyZCc7XG4gIHZhciBBVVRPID0gJ2F1dG8nO1xuICB2YXIgcG9zUHRzID0gcGFpckluZm8ucG9zUHRzLFxuICAgIHNyY1cgPSBwYWlySW5mby5zcmNXLFxuICAgIHNyY0ggPSBwYWlySW5mby5zcmNILFxuICAgIHRndFcgPSBwYWlySW5mby50Z3RXLFxuICAgIHRndEggPSBwYWlySW5mby50Z3RIO1xuICB2YXIgZWRnZURpc3RhbmNlcyA9IGVkZ2UucHN0eWxlKCdlZGdlLWRpc3RhbmNlcycpLnZhbHVlO1xuICB2YXIgZEluY2x1ZGVzTm9kZUJvZHkgPSBlZGdlRGlzdGFuY2VzICE9PSAnbm9kZS1wb3NpdGlvbic7XG4gIHZhciB0YXhpRGlyID0gZWRnZS5wc3R5bGUoJ3RheGktZGlyZWN0aW9uJykudmFsdWU7XG4gIHZhciByYXdUYXhpRGlyID0gdGF4aURpcjsgLy8gdW5wcm9jZXNzZWQgdmFsdWVcbiAgdmFyIHRheGlUdXJuID0gZWRnZS5wc3R5bGUoJ3RheGktdHVybicpO1xuICB2YXIgdHVybklzUGVyY2VudCA9IHRheGlUdXJuLnVuaXRzID09PSAnJSc7XG4gIHZhciB0YXhpVHVyblBmVmFsID0gdGF4aVR1cm4ucGZWYWx1ZTtcbiAgdmFyIHR1cm5Jc05lZ2F0aXZlID0gdGF4aVR1cm5QZlZhbCA8IDA7IC8vIGkuZS4gZnJvbSB0YXJnZXQgc2lkZVxuICB2YXIgbWluRCA9IGVkZ2UucHN0eWxlKCd0YXhpLXR1cm4tbWluLWRpc3RhbmNlJykucGZWYWx1ZTtcbiAgdmFyIGR3ID0gZEluY2x1ZGVzTm9kZUJvZHkgPyAoc3JjVyArIHRndFcpIC8gMiA6IDA7XG4gIHZhciBkaCA9IGRJbmNsdWRlc05vZGVCb2R5ID8gKHNyY0ggKyB0Z3RIKSAvIDIgOiAwO1xuICB2YXIgcGR4ID0gcG9zUHRzLngyIC0gcG9zUHRzLngxO1xuICB2YXIgcGR5ID0gcG9zUHRzLnkyIC0gcG9zUHRzLnkxO1xuXG4gIC8vIHRha2UgYXdheSB0aGUgZWZmZWN0aXZlIHcvaCBmcm9tIHRoZSBtYWduaXR1ZGUgb2YgdGhlIGRlbHRhIHZhbHVlXG4gIHZhciBzdWJEV0ggPSBmdW5jdGlvbiBzdWJEV0goZHh5LCBkd2gpIHtcbiAgICBpZiAoZHh5ID4gMCkge1xuICAgICAgcmV0dXJuIE1hdGgubWF4KGR4eSAtIGR3aCwgMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBNYXRoLm1pbihkeHkgKyBkd2gsIDApO1xuICAgIH1cbiAgfTtcbiAgdmFyIGR4ID0gc3ViRFdIKHBkeCwgZHcpO1xuICB2YXIgZHkgPSBzdWJEV0gocGR5LCBkaCk7XG4gIHZhciBpc0V4cGxpY2l0RGlyID0gZmFsc2U7XG4gIGlmIChyYXdUYXhpRGlyID09PSBBVVRPKSB7XG4gICAgdGF4aURpciA9IE1hdGguYWJzKGR4KSA+IE1hdGguYWJzKGR5KSA/IEhPUklaT05UQUwgOiBWRVJUSUNBTDtcbiAgfSBlbHNlIGlmIChyYXdUYXhpRGlyID09PSBVUFdBUkQgfHwgcmF3VGF4aURpciA9PT0gRE9XTldBUkQpIHtcbiAgICB0YXhpRGlyID0gVkVSVElDQUw7XG4gICAgaXNFeHBsaWNpdERpciA9IHRydWU7XG4gIH0gZWxzZSBpZiAocmF3VGF4aURpciA9PT0gTEVGVFdBUkQgfHwgcmF3VGF4aURpciA9PT0gUklHSFRXQVJEKSB7XG4gICAgdGF4aURpciA9IEhPUklaT05UQUw7XG4gICAgaXNFeHBsaWNpdERpciA9IHRydWU7XG4gIH1cbiAgdmFyIGlzVmVydCA9IHRheGlEaXIgPT09IFZFUlRJQ0FMO1xuICB2YXIgbCA9IGlzVmVydCA/IGR5IDogZHg7XG4gIHZhciBwbCA9IGlzVmVydCA/IHBkeSA6IHBkeDtcbiAgdmFyIHNnbkwgPSBzaWdudW0ocGwpO1xuICB2YXIgZm9yY2VkRGlyID0gZmFsc2U7XG4gIGlmICghKGlzRXhwbGljaXREaXIgJiYgKHR1cm5Jc1BlcmNlbnQgfHwgdHVybklzTmVnYXRpdmUpKSAvLyBmb3JjaW5nIGluIHRoaXMgY2FzZSB3b3VsZCBjYXVzZSB3ZWlyZCBncm93aW5nIGluIHRoZSBvcHBvc2l0ZSBkaXJlY3Rpb25cbiAgJiYgKHJhd1RheGlEaXIgPT09IERPV05XQVJEICYmIHBsIDwgMCB8fCByYXdUYXhpRGlyID09PSBVUFdBUkQgJiYgcGwgPiAwIHx8IHJhd1RheGlEaXIgPT09IExFRlRXQVJEICYmIHBsID4gMCB8fCByYXdUYXhpRGlyID09PSBSSUdIVFdBUkQgJiYgcGwgPCAwKSkge1xuICAgIHNnbkwgKj0gLTE7XG4gICAgbCA9IHNnbkwgKiBNYXRoLmFicyhsKTtcbiAgICBmb3JjZWREaXIgPSB0cnVlO1xuICB9XG4gIHZhciBkO1xuICBpZiAodHVybklzUGVyY2VudCkge1xuICAgIHZhciBwID0gdGF4aVR1cm5QZlZhbCA8IDAgPyAxICsgdGF4aVR1cm5QZlZhbCA6IHRheGlUdXJuUGZWYWw7XG4gICAgZCA9IHAgKiBsO1xuICB9IGVsc2Uge1xuICAgIHZhciBrID0gdGF4aVR1cm5QZlZhbCA8IDAgPyBsIDogMDtcbiAgICBkID0gayArIHRheGlUdXJuUGZWYWwgKiBzZ25MO1xuICB9XG4gIHZhciBnZXRJc1Rvb0Nsb3NlID0gZnVuY3Rpb24gZ2V0SXNUb29DbG9zZShkKSB7XG4gICAgcmV0dXJuIE1hdGguYWJzKGQpIDwgbWluRCB8fCBNYXRoLmFicyhkKSA+PSBNYXRoLmFicyhsKTtcbiAgfTtcbiAgdmFyIGlzVG9vQ2xvc2VTcmMgPSBnZXRJc1Rvb0Nsb3NlKGQpO1xuICB2YXIgaXNUb29DbG9zZVRndCA9IGdldElzVG9vQ2xvc2UoTWF0aC5hYnMobCkgLSBNYXRoLmFicyhkKSk7XG4gIHZhciBpc1Rvb0Nsb3NlID0gaXNUb29DbG9zZVNyYyB8fCBpc1Rvb0Nsb3NlVGd0O1xuICBpZiAoaXNUb29DbG9zZSAmJiAhZm9yY2VkRGlyKSB7XG4gICAgLy8gbm9uLWlkZWFsIHJvdXRpbmdcbiAgICBpZiAoaXNWZXJ0KSB7XG4gICAgICAvLyB2ZXJ0aWNhbCBmYWxsYmFja3NcbiAgICAgIHZhciBsU2hhcGVJbnNpZGVTcmMgPSBNYXRoLmFicyhwbCkgPD0gc3JjSCAvIDI7XG4gICAgICB2YXIgbFNoYXBlSW5zaWRlVGd0ID0gTWF0aC5hYnMocGR4KSA8PSB0Z3RXIC8gMjtcbiAgICAgIGlmIChsU2hhcGVJbnNpZGVTcmMpIHtcbiAgICAgICAgLy8gaG9yaXpvbnRhbCBaLXNoYXBlIChkaXJlY3Rpb24gbm90IHJlc3BlY3RlZClcbiAgICAgICAgdmFyIHggPSAocG9zUHRzLngxICsgcG9zUHRzLngyKSAvIDI7XG4gICAgICAgIHZhciB5MSA9IHBvc1B0cy55MSxcbiAgICAgICAgICB5MiA9IHBvc1B0cy55MjtcbiAgICAgICAgcnMuc2VncHRzID0gW3gsIHkxLCB4LCB5Ml07XG4gICAgICB9IGVsc2UgaWYgKGxTaGFwZUluc2lkZVRndCkge1xuICAgICAgICAvLyB2ZXJ0aWNhbCBaLXNoYXBlIChkaXN0YW5jZSBub3QgcmVzcGVjdGVkKVxuICAgICAgICB2YXIgeSA9IChwb3NQdHMueTEgKyBwb3NQdHMueTIpIC8gMjtcbiAgICAgICAgdmFyIHgxID0gcG9zUHRzLngxLFxuICAgICAgICAgIHgyID0gcG9zUHRzLngyO1xuICAgICAgICBycy5zZWdwdHMgPSBbeDEsIHksIHgyLCB5XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEwtc2hhcGUgZmFsbGJhY2sgKHR1cm4gZGlzdGFuY2Ugbm90IHJlc3BlY3RlZCwgYnV0IHdvcmtzIHdlbGwgd2l0aCB0cmVlIHNpYmxpbmdzKVxuICAgICAgICBycy5zZWdwdHMgPSBbcG9zUHRzLngxLCBwb3NQdHMueTJdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBob3Jpem9udGFsIGZhbGxiYWNrc1xuICAgICAgdmFyIF9sU2hhcGVJbnNpZGVTcmMgPSBNYXRoLmFicyhwbCkgPD0gc3JjVyAvIDI7XG4gICAgICB2YXIgX2xTaGFwZUluc2lkZVRndCA9IE1hdGguYWJzKHBkeSkgPD0gdGd0SCAvIDI7XG4gICAgICBpZiAoX2xTaGFwZUluc2lkZVNyYykge1xuICAgICAgICAvLyB2ZXJ0aWNhbCBaLXNoYXBlIChkaXJlY3Rpb24gbm90IHJlc3BlY3RlZClcbiAgICAgICAgdmFyIF95ID0gKHBvc1B0cy55MSArIHBvc1B0cy55MikgLyAyO1xuICAgICAgICB2YXIgX3ggPSBwb3NQdHMueDEsXG4gICAgICAgICAgX3gyID0gcG9zUHRzLngyO1xuICAgICAgICBycy5zZWdwdHMgPSBbX3gsIF95LCBfeDIsIF95XTtcbiAgICAgIH0gZWxzZSBpZiAoX2xTaGFwZUluc2lkZVRndCkge1xuICAgICAgICAvLyBob3Jpem9udGFsIFotc2hhcGUgKHR1cm4gZGlzdGFuY2Ugbm90IHJlc3BlY3RlZClcbiAgICAgICAgdmFyIF94MyA9IChwb3NQdHMueDEgKyBwb3NQdHMueDIpIC8gMjtcbiAgICAgICAgdmFyIF95MiA9IHBvc1B0cy55MSxcbiAgICAgICAgICBfeTMgPSBwb3NQdHMueTI7XG4gICAgICAgIHJzLnNlZ3B0cyA9IFtfeDMsIF95MiwgX3gzLCBfeTNdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTC1zaGFwZSAodHVybiBkaXN0YW5jZSBub3QgcmVzcGVjdGVkLCBidXQgd29ya3Mgd2VsbCBmb3IgdHJlZSBzaWJsaW5ncylcbiAgICAgICAgcnMuc2VncHRzID0gW3Bvc1B0cy54MiwgcG9zUHRzLnkxXTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gaWRlYWwgcm91dGluZ1xuICAgIGlmIChpc1ZlcnQpIHtcbiAgICAgIHZhciBfeTQgPSBwb3NQdHMueTEgKyBkICsgKGRJbmNsdWRlc05vZGVCb2R5ID8gc3JjSCAvIDIgKiBzZ25MIDogMCk7XG4gICAgICB2YXIgX3g0ID0gcG9zUHRzLngxLFxuICAgICAgICBfeDUgPSBwb3NQdHMueDI7XG4gICAgICBycy5zZWdwdHMgPSBbX3g0LCBfeTQsIF94NSwgX3k0XTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaG9yaXpvbnRhbFxuICAgICAgdmFyIF94NiA9IHBvc1B0cy54MSArIGQgKyAoZEluY2x1ZGVzTm9kZUJvZHkgPyBzcmNXIC8gMiAqIHNnbkwgOiAwKTtcbiAgICAgIHZhciBfeTUgPSBwb3NQdHMueTEsXG4gICAgICAgIF95NiA9IHBvc1B0cy55MjtcbiAgICAgIHJzLnNlZ3B0cyA9IFtfeDYsIF95NSwgX3g2LCBfeTZdO1xuICAgIH1cbiAgfVxuICBpZiAocnMuaXNSb3VuZCkge1xuICAgIHZhciByYWRpdXMgPSBlZGdlLnBzdHlsZSgndGF4aS1yYWRpdXMnKS52YWx1ZTtcbiAgICB2YXIgaXNBcmNSYWRpdXMgPSBlZGdlLnBzdHlsZSgncmFkaXVzLXR5cGUnKS52YWx1ZVswXSA9PT0gJ2FyYy1yYWRpdXMnO1xuICAgIHJzLnJhZGlpID0gbmV3IEFycmF5KHJzLnNlZ3B0cy5sZW5ndGggLyAyKS5maWxsKHJhZGl1cyk7XG4gICAgcnMuaXNBcmNSYWRpdXMgPSBuZXcgQXJyYXkocnMuc2VncHRzLmxlbmd0aCAvIDIpLmZpbGwoaXNBcmNSYWRpdXMpO1xuICB9XG59O1xuQlJwJGMudHJ5VG9Db3JyZWN0SW52YWxpZFBvaW50cyA9IGZ1bmN0aW9uIChlZGdlLCBwYWlySW5mbykge1xuICB2YXIgcnMgPSBlZGdlLl9wcml2YXRlLnJzY3JhdGNoO1xuXG4gIC8vIGNhbiBvbmx5IGNvcnJlY3QgYmV6aWVycyBmb3Igbm93Li4uXG4gIGlmIChycy5lZGdlVHlwZSA9PT0gJ2JlemllcicpIHtcbiAgICB2YXIgc3JjUG9zID0gcGFpckluZm8uc3JjUG9zLFxuICAgICAgdGd0UG9zID0gcGFpckluZm8udGd0UG9zLFxuICAgICAgc3JjVyA9IHBhaXJJbmZvLnNyY1csXG4gICAgICBzcmNIID0gcGFpckluZm8uc3JjSCxcbiAgICAgIHRndFcgPSBwYWlySW5mby50Z3RXLFxuICAgICAgdGd0SCA9IHBhaXJJbmZvLnRndEgsXG4gICAgICBzcmNTaGFwZSA9IHBhaXJJbmZvLnNyY1NoYXBlLFxuICAgICAgdGd0U2hhcGUgPSBwYWlySW5mby50Z3RTaGFwZSxcbiAgICAgIHNyY0Nvcm5lclJhZGl1cyA9IHBhaXJJbmZvLnNyY0Nvcm5lclJhZGl1cyxcbiAgICAgIHRndENvcm5lclJhZGl1cyA9IHBhaXJJbmZvLnRndENvcm5lclJhZGl1cyxcbiAgICAgIHNyY1JzID0gcGFpckluZm8uc3JjUnMsXG4gICAgICB0Z3RScyA9IHBhaXJJbmZvLnRndFJzO1xuICAgIHZhciBiYWRTdGFydCA9ICFudW1iZXIkMShycy5zdGFydFgpIHx8ICFudW1iZXIkMShycy5zdGFydFkpO1xuICAgIHZhciBiYWRBU3RhcnQgPSAhbnVtYmVyJDEocnMuYXJyb3dTdGFydFgpIHx8ICFudW1iZXIkMShycy5hcnJvd1N0YXJ0WSk7XG4gICAgdmFyIGJhZEVuZCA9ICFudW1iZXIkMShycy5lbmRYKSB8fCAhbnVtYmVyJDEocnMuZW5kWSk7XG4gICAgdmFyIGJhZEFFbmQgPSAhbnVtYmVyJDEocnMuYXJyb3dFbmRYKSB8fCAhbnVtYmVyJDEocnMuYXJyb3dFbmRZKTtcbiAgICB2YXIgbWluQ3BBRGlzdEZhY3RvciA9IDM7XG4gICAgdmFyIGFycm93VyA9IHRoaXMuZ2V0QXJyb3dXaWR0aChlZGdlLnBzdHlsZSgnd2lkdGgnKS5wZlZhbHVlLCBlZGdlLnBzdHlsZSgnYXJyb3ctc2NhbGUnKS52YWx1ZSkgKiB0aGlzLmFycm93U2hhcGVXaWR0aDtcbiAgICB2YXIgbWluQ3BBRGlzdCA9IG1pbkNwQURpc3RGYWN0b3IgKiBhcnJvd1c7XG4gICAgdmFyIHN0YXJ0QUNwRGlzdCA9IGRpc3Qoe1xuICAgICAgeDogcnMuY3RybHB0c1swXSxcbiAgICAgIHk6IHJzLmN0cmxwdHNbMV1cbiAgICB9LCB7XG4gICAgICB4OiBycy5zdGFydFgsXG4gICAgICB5OiBycy5zdGFydFlcbiAgICB9KTtcbiAgICB2YXIgY2xvc2VTdGFydEFDcCA9IHN0YXJ0QUNwRGlzdCA8IG1pbkNwQURpc3Q7XG4gICAgdmFyIGVuZEFDcERpc3QgPSBkaXN0KHtcbiAgICAgIHg6IHJzLmN0cmxwdHNbMF0sXG4gICAgICB5OiBycy5jdHJscHRzWzFdXG4gICAgfSwge1xuICAgICAgeDogcnMuZW5kWCxcbiAgICAgIHk6IHJzLmVuZFlcbiAgICB9KTtcbiAgICB2YXIgY2xvc2VFbmRBQ3AgPSBlbmRBQ3BEaXN0IDwgbWluQ3BBRGlzdDtcbiAgICB2YXIgb3ZlcmxhcHBpbmcgPSBmYWxzZTtcbiAgICBpZiAoYmFkU3RhcnQgfHwgYmFkQVN0YXJ0IHx8IGNsb3NlU3RhcnRBQ3ApIHtcbiAgICAgIG92ZXJsYXBwaW5nID0gdHJ1ZTtcblxuICAgICAgLy8gcHJvamVjdCBjb250cm9sIHBvaW50IGFsb25nIGxpbmUgZnJvbSBzcmMgY2VudHJlIHRvIG91dHNpZGUgdGhlIHNyYyBzaGFwZVxuICAgICAgLy8gKG90aGVyd2lzZSBpbnRlcnNlY3Rpb24gd2lsbCB5aWVsZCBub3RoaW5nKVxuICAgICAgdmFyIGNwRCA9IHtcbiAgICAgICAgLy8gZGVsdGFcbiAgICAgICAgeDogcnMuY3RybHB0c1swXSAtIHNyY1Bvcy54LFxuICAgICAgICB5OiBycy5jdHJscHRzWzFdIC0gc3JjUG9zLnlcbiAgICAgIH07XG4gICAgICB2YXIgY3BMID0gTWF0aC5zcXJ0KGNwRC54ICogY3BELnggKyBjcEQueSAqIGNwRC55KTsgLy8gbGVuZ3RoIG9mIGxpbmVcbiAgICAgIHZhciBjcE0gPSB7XG4gICAgICAgIC8vIG5vcm1hbGlzZWQgZGVsdGFcbiAgICAgICAgeDogY3BELnggLyBjcEwsXG4gICAgICAgIHk6IGNwRC55IC8gY3BMXG4gICAgICB9O1xuICAgICAgdmFyIHJhZGl1cyA9IE1hdGgubWF4KHNyY1csIHNyY0gpO1xuICAgICAgdmFyIGNwUHJvaiA9IHtcbiAgICAgICAgLy8gKjIgcmFkaXVzIGd1YXJhbnRlZXMgb3V0c2lkZSBzaGFwZVxuICAgICAgICB4OiBycy5jdHJscHRzWzBdICsgY3BNLnggKiAyICogcmFkaXVzLFxuICAgICAgICB5OiBycy5jdHJscHRzWzFdICsgY3BNLnkgKiAyICogcmFkaXVzXG4gICAgICB9O1xuICAgICAgdmFyIHNyY0N0cmxQdEludG4gPSBzcmNTaGFwZS5pbnRlcnNlY3RMaW5lKHNyY1Bvcy54LCBzcmNQb3MueSwgc3JjVywgc3JjSCwgY3BQcm9qLngsIGNwUHJvai55LCAwLCBzcmNDb3JuZXJSYWRpdXMsIHNyY1JzKTtcbiAgICAgIGlmIChjbG9zZVN0YXJ0QUNwKSB7XG4gICAgICAgIHJzLmN0cmxwdHNbMF0gPSBycy5jdHJscHRzWzBdICsgY3BNLnggKiAobWluQ3BBRGlzdCAtIHN0YXJ0QUNwRGlzdCk7XG4gICAgICAgIHJzLmN0cmxwdHNbMV0gPSBycy5jdHJscHRzWzFdICsgY3BNLnkgKiAobWluQ3BBRGlzdCAtIHN0YXJ0QUNwRGlzdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBycy5jdHJscHRzWzBdID0gc3JjQ3RybFB0SW50blswXSArIGNwTS54ICogbWluQ3BBRGlzdDtcbiAgICAgICAgcnMuY3RybHB0c1sxXSA9IHNyY0N0cmxQdEludG5bMV0gKyBjcE0ueSAqIG1pbkNwQURpc3Q7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChiYWRFbmQgfHwgYmFkQUVuZCB8fCBjbG9zZUVuZEFDcCkge1xuICAgICAgb3ZlcmxhcHBpbmcgPSB0cnVlO1xuXG4gICAgICAvLyBwcm9qZWN0IGNvbnRyb2wgcG9pbnQgYWxvbmcgbGluZSBmcm9tIHRndCBjZW50cmUgdG8gb3V0c2lkZSB0aGUgdGd0IHNoYXBlXG4gICAgICAvLyAob3RoZXJ3aXNlIGludGVyc2VjdGlvbiB3aWxsIHlpZWxkIG5vdGhpbmcpXG4gICAgICB2YXIgX2NwRCA9IHtcbiAgICAgICAgLy8gZGVsdGFcbiAgICAgICAgeDogcnMuY3RybHB0c1swXSAtIHRndFBvcy54LFxuICAgICAgICB5OiBycy5jdHJscHRzWzFdIC0gdGd0UG9zLnlcbiAgICAgIH07XG4gICAgICB2YXIgX2NwTCA9IE1hdGguc3FydChfY3BELnggKiBfY3BELnggKyBfY3BELnkgKiBfY3BELnkpOyAvLyBsZW5ndGggb2YgbGluZVxuICAgICAgdmFyIF9jcE0gPSB7XG4gICAgICAgIC8vIG5vcm1hbGlzZWQgZGVsdGFcbiAgICAgICAgeDogX2NwRC54IC8gX2NwTCxcbiAgICAgICAgeTogX2NwRC55IC8gX2NwTFxuICAgICAgfTtcbiAgICAgIHZhciBfcmFkaXVzID0gTWF0aC5tYXgoc3JjVywgc3JjSCk7XG4gICAgICB2YXIgX2NwUHJvaiA9IHtcbiAgICAgICAgLy8gKjIgcmFkaXVzIGd1YXJhbnRlZXMgb3V0c2lkZSBzaGFwZVxuICAgICAgICB4OiBycy5jdHJscHRzWzBdICsgX2NwTS54ICogMiAqIF9yYWRpdXMsXG4gICAgICAgIHk6IHJzLmN0cmxwdHNbMV0gKyBfY3BNLnkgKiAyICogX3JhZGl1c1xuICAgICAgfTtcbiAgICAgIHZhciB0Z3RDdHJsUHRJbnRuID0gdGd0U2hhcGUuaW50ZXJzZWN0TGluZSh0Z3RQb3MueCwgdGd0UG9zLnksIHRndFcsIHRndEgsIF9jcFByb2oueCwgX2NwUHJvai55LCAwLCB0Z3RDb3JuZXJSYWRpdXMsIHRndFJzKTtcbiAgICAgIGlmIChjbG9zZUVuZEFDcCkge1xuICAgICAgICBycy5jdHJscHRzWzBdID0gcnMuY3RybHB0c1swXSArIF9jcE0ueCAqIChtaW5DcEFEaXN0IC0gZW5kQUNwRGlzdCk7XG4gICAgICAgIHJzLmN0cmxwdHNbMV0gPSBycy5jdHJscHRzWzFdICsgX2NwTS55ICogKG1pbkNwQURpc3QgLSBlbmRBQ3BEaXN0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJzLmN0cmxwdHNbMF0gPSB0Z3RDdHJsUHRJbnRuWzBdICsgX2NwTS54ICogbWluQ3BBRGlzdDtcbiAgICAgICAgcnMuY3RybHB0c1sxXSA9IHRndEN0cmxQdEludG5bMV0gKyBfY3BNLnkgKiBtaW5DcEFEaXN0O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAob3ZlcmxhcHBpbmcpIHtcbiAgICAgIC8vIHJlY2FsYyBlbmRwdHNcbiAgICAgIHRoaXMuZmluZEVuZHBvaW50cyhlZGdlKTtcbiAgICB9XG4gIH1cbn07XG5CUnAkYy5zdG9yZUFsbHB0cyA9IGZ1bmN0aW9uIChlZGdlKSB7XG4gIHZhciBycyA9IGVkZ2UuX3ByaXZhdGUucnNjcmF0Y2g7XG4gIGlmIChycy5lZGdlVHlwZSA9PT0gJ211bHRpYmV6aWVyJyB8fCBycy5lZGdlVHlwZSA9PT0gJ2JlemllcicgfHwgcnMuZWRnZVR5cGUgPT09ICdzZWxmJyB8fCBycy5lZGdlVHlwZSA9PT0gJ2NvbXBvdW5kJykge1xuICAgIHJzLmFsbHB0cyA9IFtdO1xuICAgIHJzLmFsbHB0cy5wdXNoKHJzLnN0YXJ0WCwgcnMuc3RhcnRZKTtcbiAgICBmb3IgKHZhciBiID0gMDsgYiArIDEgPCBycy5jdHJscHRzLmxlbmd0aDsgYiArPSAyKSB7XG4gICAgICAvLyBjdHJsIHB0IGl0c2VsZlxuICAgICAgcnMuYWxscHRzLnB1c2gocnMuY3RybHB0c1tiXSwgcnMuY3RybHB0c1tiICsgMV0pO1xuXG4gICAgICAvLyB0aGUgbWlkcHQgYmV0d2VlbiBjdHJscHRzIGFzIGludGVybWVkaWF0ZSBkZXN0aW5hdGlvbiBwdHNcbiAgICAgIGlmIChiICsgMyA8IHJzLmN0cmxwdHMubGVuZ3RoKSB7XG4gICAgICAgIHJzLmFsbHB0cy5wdXNoKChycy5jdHJscHRzW2JdICsgcnMuY3RybHB0c1tiICsgMl0pIC8gMiwgKHJzLmN0cmxwdHNbYiArIDFdICsgcnMuY3RybHB0c1tiICsgM10pIC8gMik7XG4gICAgICB9XG4gICAgfVxuICAgIHJzLmFsbHB0cy5wdXNoKHJzLmVuZFgsIHJzLmVuZFkpO1xuICAgIHZhciBtLCBtdDtcbiAgICBpZiAocnMuY3RybHB0cy5sZW5ndGggLyAyICUgMiA9PT0gMCkge1xuICAgICAgbSA9IHJzLmFsbHB0cy5sZW5ndGggLyAyIC0gMTtcbiAgICAgIHJzLm1pZFggPSBycy5hbGxwdHNbbV07XG4gICAgICBycy5taWRZID0gcnMuYWxscHRzW20gKyAxXTtcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IHJzLmFsbHB0cy5sZW5ndGggLyAyIC0gMztcbiAgICAgIG10ID0gMC41O1xuICAgICAgcnMubWlkWCA9IHFiZXppZXJBdChycy5hbGxwdHNbbV0sIHJzLmFsbHB0c1ttICsgMl0sIHJzLmFsbHB0c1ttICsgNF0sIG10KTtcbiAgICAgIHJzLm1pZFkgPSBxYmV6aWVyQXQocnMuYWxscHRzW20gKyAxXSwgcnMuYWxscHRzW20gKyAzXSwgcnMuYWxscHRzW20gKyA1XSwgbXQpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChycy5lZGdlVHlwZSA9PT0gJ3N0cmFpZ2h0Jykge1xuICAgIC8vIG5lZWQgdG8gY2FsYyB0aGVzZSBhZnRlciBlbmRwdHNcbiAgICBycy5hbGxwdHMgPSBbcnMuc3RhcnRYLCBycy5zdGFydFksIHJzLmVuZFgsIHJzLmVuZFldO1xuXG4gICAgLy8gZGVmYXVsdCBtaWRwdCBmb3IgbGFiZWxzIGV0Y1xuICAgIHJzLm1pZFggPSAocnMuc3RhcnRYICsgcnMuZW5kWCArIHJzLmFycm93U3RhcnRYICsgcnMuYXJyb3dFbmRYKSAvIDQ7XG4gICAgcnMubWlkWSA9IChycy5zdGFydFkgKyBycy5lbmRZICsgcnMuYXJyb3dTdGFydFkgKyBycy5hcnJvd0VuZFkpIC8gNDtcbiAgfSBlbHNlIGlmIChycy5lZGdlVHlwZSA9PT0gJ3NlZ21lbnRzJykge1xuICAgIHJzLmFsbHB0cyA9IFtdO1xuICAgIHJzLmFsbHB0cy5wdXNoKHJzLnN0YXJ0WCwgcnMuc3RhcnRZKTtcbiAgICBycy5hbGxwdHMucHVzaC5hcHBseShycy5hbGxwdHMsIHJzLnNlZ3B0cyk7XG4gICAgcnMuYWxscHRzLnB1c2gocnMuZW5kWCwgcnMuZW5kWSk7XG4gICAgaWYgKHJzLmlzUm91bmQpIHtcbiAgICAgIHJzLnJvdW5kQ29ybmVycyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDI7IGkgKyAzIDwgcnMuYWxscHRzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgIHZhciByYWRpdXMgPSBycy5yYWRpaVtpIC8gMiAtIDFdO1xuICAgICAgICB2YXIgaXNBcmNSYWRpdXMgPSBycy5pc0FyY1JhZGl1c1tpIC8gMiAtIDFdO1xuICAgICAgICBycy5yb3VuZENvcm5lcnMucHVzaChnZXRSb3VuZENvcm5lcih7XG4gICAgICAgICAgeDogcnMuYWxscHRzW2kgLSAyXSxcbiAgICAgICAgICB5OiBycy5hbGxwdHNbaSAtIDFdXG4gICAgICAgIH0sIHtcbiAgICAgICAgICB4OiBycy5hbGxwdHNbaV0sXG4gICAgICAgICAgeTogcnMuYWxscHRzW2kgKyAxXSxcbiAgICAgICAgICByYWRpdXM6IHJhZGl1c1xuICAgICAgICB9LCB7XG4gICAgICAgICAgeDogcnMuYWxscHRzW2kgKyAyXSxcbiAgICAgICAgICB5OiBycy5hbGxwdHNbaSArIDNdXG4gICAgICAgIH0sIHJhZGl1cywgaXNBcmNSYWRpdXMpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJzLnNlZ3B0cy5sZW5ndGggJSA0ID09PSAwKSB7XG4gICAgICB2YXIgaTIgPSBycy5zZWdwdHMubGVuZ3RoIC8gMjtcbiAgICAgIHZhciBpMSA9IGkyIC0gMjtcbiAgICAgIHJzLm1pZFggPSAocnMuc2VncHRzW2kxXSArIHJzLnNlZ3B0c1tpMl0pIC8gMjtcbiAgICAgIHJzLm1pZFkgPSAocnMuc2VncHRzW2kxICsgMV0gKyBycy5zZWdwdHNbaTIgKyAxXSkgLyAyO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgX2kgPSBycy5zZWdwdHMubGVuZ3RoIC8gMiAtIDE7XG4gICAgICBpZiAoIXJzLmlzUm91bmQpIHtcbiAgICAgICAgcnMubWlkWCA9IHJzLnNlZ3B0c1tfaV07XG4gICAgICAgIHJzLm1pZFkgPSBycy5zZWdwdHNbX2kgKyAxXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBwb2ludCA9IHtcbiAgICAgICAgICB4OiBycy5zZWdwdHNbX2ldLFxuICAgICAgICAgIHk6IHJzLnNlZ3B0c1tfaSArIDFdXG4gICAgICAgIH07XG4gICAgICAgIHZhciBjb3JuZXIgPSBycy5yb3VuZENvcm5lcnNbX2kgLyAyXTtcbiAgICAgICAgaWYgKGNvcm5lci5yYWRpdXMgPT09IDApIHtcbiAgICAgICAgICAvLyBPbiBjb2xsaW5lYXIgcG9pbnRzXG4gICAgICAgICAgdmFyIG5leHRQb2ludCA9IHtcbiAgICAgICAgICAgIHg6IHJzLnNlZ3B0c1tfaSArIDJdLFxuICAgICAgICAgICAgeTogcnMuc2VncHRzW19pICsgM11cbiAgICAgICAgICB9O1xuICAgICAgICAgIHJzLm1pZFggPSBwb2ludC54O1xuICAgICAgICAgIHJzLm1pZFkgPSBwb2ludC55O1xuICAgICAgICAgIHJzLm1pZFZlY3RvciA9IFtwb2ludC55IC0gbmV4dFBvaW50LnksIG5leHRQb2ludC54IC0gcG9pbnQueF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gT24gcm91bmRlZCBwb2ludHNcbiAgICAgICAgICB2YXIgdiA9IFtwb2ludC54IC0gY29ybmVyLmN4LCBwb2ludC55IC0gY29ybmVyLmN5XTtcbiAgICAgICAgICB2YXIgZmFjdG9yID0gY29ybmVyLnJhZGl1cyAvIE1hdGguc3FydChNYXRoLnBvdyh2WzBdLCAyKSArIE1hdGgucG93KHZbMV0sIDIpKTtcbiAgICAgICAgICB2ID0gdi5tYXAoZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgICAgIHJldHVybiBjICogZmFjdG9yO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJzLm1pZFggPSBjb3JuZXIuY3ggKyB2WzBdO1xuICAgICAgICAgIHJzLm1pZFkgPSBjb3JuZXIuY3kgKyB2WzFdO1xuICAgICAgICAgIHJzLm1pZFZlY3RvciA9IHY7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5CUnAkYy5jaGVja0ZvckludmFsaWRFZGdlV2FybmluZyA9IGZ1bmN0aW9uIChlZGdlKSB7XG4gIHZhciBycyA9IGVkZ2VbMF0uX3ByaXZhdGUucnNjcmF0Y2g7XG4gIGlmIChycy5ub2Rlc092ZXJsYXAgfHwgbnVtYmVyJDEocnMuc3RhcnRYKSAmJiBudW1iZXIkMShycy5zdGFydFkpICYmIG51bWJlciQxKHJzLmVuZFgpICYmIG51bWJlciQxKHJzLmVuZFkpKSB7XG4gICAgcnMubG9nZ2VkRXJyID0gZmFsc2U7XG4gIH0gZWxzZSB7XG4gICAgaWYgKCFycy5sb2dnZWRFcnIpIHtcbiAgICAgIHJzLmxvZ2dlZEVyciA9IHRydWU7XG4gICAgICB3YXJuKCdFZGdlIGAnICsgZWRnZS5pZCgpICsgJ2AgaGFzIGludmFsaWQgZW5kcG9pbnRzIGFuZCBzbyBpdCBpcyBpbXBvc3NpYmxlIHRvIGRyYXcuICBBZGp1c3QgeW91ciBlZGdlIHN0eWxlIChlLmcuIGNvbnRyb2wgcG9pbnRzKSBhY2NvcmRpbmdseSBvciB1c2UgYW4gYWx0ZXJuYXRpdmUgZWRnZSB0eXBlLiAgVGhpcyBpcyBleHBlY3RlZCBiZWhhdmlvdXIgd2hlbiB0aGUgc291cmNlIG5vZGUgYW5kIHRoZSB0YXJnZXQgbm9kZSBvdmVybGFwLicpO1xuICAgIH1cbiAgfVxufTtcbkJScCRjLmZpbmRFZGdlQ29udHJvbFBvaW50cyA9IGZ1bmN0aW9uIChlZGdlcykge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuICBpZiAoIWVkZ2VzIHx8IGVkZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgciA9IHRoaXM7XG4gIHZhciBjeSA9IHIuY3k7XG4gIHZhciBoYXNDb21wb3VuZHMgPSBjeS5oYXNDb21wb3VuZE5vZGVzKCk7XG4gIHZhciBoYXNoVGFibGUgPSBuZXcgTWFwJDEoKTtcbiAgdmFyIGdldEtleSA9IGZ1bmN0aW9uIGdldEtleShwYWlySWQsIGVkZ2VJc1VuYnVuZGxlZCkge1xuICAgIHJldHVybiBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHBhaXJJZCksIFtlZGdlSXNVbmJ1bmRsZWQgPyAxIDogMF0pLmpvaW4oJy0nKTtcbiAgfTtcbiAgdmFyIHBhaXJJZHMgPSBbXTtcbiAgdmFyIGhheXN0YWNrRWRnZXMgPSBbXTtcblxuICAvLyBjcmVhdGUgYSB0YWJsZSBvZiBlZGdlIChzcmMsIHRndCkgPT4gbGlzdCBvZiBlZGdlcyBiZXR3ZWVuIHRoZW1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlZGdlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlZGdlID0gZWRnZXNbaV07XG4gICAgdmFyIF9wID0gZWRnZS5fcHJpdmF0ZTtcbiAgICB2YXIgY3VydmVTdHlsZSA9IGVkZ2UucHN0eWxlKCdjdXJ2ZS1zdHlsZScpLnZhbHVlO1xuXG4gICAgLy8gaWdub3JlIGVkZ2VzIHdobyBhcmUgbm90IHRvIGJlIGRpc3BsYXllZFxuICAgIC8vIHRoZXkgc2hvdWxkbid0IHRha2UgdXAgc3BhY2VcbiAgICBpZiAoZWRnZS5yZW1vdmVkKCkgfHwgIWVkZ2UudGFrZXNVcFNwYWNlKCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY3VydmVTdHlsZSA9PT0gJ2hheXN0YWNrJykge1xuICAgICAgaGF5c3RhY2tFZGdlcy5wdXNoKGVkZ2UpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHZhciBlZGdlSXNVbmJ1bmRsZWQgPSBjdXJ2ZVN0eWxlID09PSAndW5idW5kbGVkLWJlemllcicgfHwgZW5kc1dpdGgoY3VydmVTdHlsZSwgJ3NlZ21lbnRzJykgfHwgY3VydmVTdHlsZSA9PT0gJ3N0cmFpZ2h0JyB8fCBjdXJ2ZVN0eWxlID09PSAnc3RyYWlnaHQtdHJpYW5nbGUnIHx8IGVuZHNXaXRoKGN1cnZlU3R5bGUsICd0YXhpJyk7XG4gICAgdmFyIGVkZ2VJc0JlemllciA9IGN1cnZlU3R5bGUgPT09ICd1bmJ1bmRsZWQtYmV6aWVyJyB8fCBjdXJ2ZVN0eWxlID09PSAnYmV6aWVyJztcbiAgICB2YXIgc3JjID0gX3Auc291cmNlO1xuICAgIHZhciB0Z3QgPSBfcC50YXJnZXQ7XG4gICAgdmFyIHNyY0luZGV4ID0gc3JjLnBvb2xJbmRleCgpO1xuICAgIHZhciB0Z3RJbmRleCA9IHRndC5wb29sSW5kZXgoKTtcbiAgICB2YXIgcGFpcklkID0gW3NyY0luZGV4LCB0Z3RJbmRleF0uc29ydCgpO1xuICAgIHZhciBrZXkgPSBnZXRLZXkocGFpcklkLCBlZGdlSXNVbmJ1bmRsZWQpO1xuICAgIHZhciB0YWJsZUVudHJ5ID0gaGFzaFRhYmxlLmdldChrZXkpO1xuICAgIGlmICh0YWJsZUVudHJ5ID09IG51bGwpIHtcbiAgICAgIHRhYmxlRW50cnkgPSB7XG4gICAgICAgIGVsZXM6IFtdXG4gICAgICB9O1xuICAgICAgcGFpcklkcy5wdXNoKHtcbiAgICAgICAgcGFpcklkOiBwYWlySWQsXG4gICAgICAgIGVkZ2VJc1VuYnVuZGxlZDogZWRnZUlzVW5idW5kbGVkXG4gICAgICB9KTtcbiAgICAgIGhhc2hUYWJsZS5zZXQoa2V5LCB0YWJsZUVudHJ5KTtcbiAgICB9XG4gICAgdGFibGVFbnRyeS5lbGVzLnB1c2goZWRnZSk7XG4gICAgaWYgKGVkZ2VJc1VuYnVuZGxlZCkge1xuICAgICAgdGFibGVFbnRyeS5oYXNVbmJ1bmRsZWQgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoZWRnZUlzQmV6aWVyKSB7XG4gICAgICB0YWJsZUVudHJ5Lmhhc0JlemllciA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLy8gZm9yIGVhY2ggcGFpciAoc3JjLCB0Z3QpLCBjcmVhdGUgdGhlIGN0cmwgcHRzXG4gIC8vIE5lc3RlZCBmb3IgbG9vcCBpcyBPSzsgdG90YWwgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgZm9yIGJvdGggbG9vcHMgPSBlZGdlQ291bnRcbiAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoKSB7XG4gICAgdmFyIF9wYWlySWRzJHAgPSBwYWlySWRzW3BdLFxuICAgICAgcGFpcklkID0gX3BhaXJJZHMkcC5wYWlySWQsXG4gICAgICBlZGdlSXNVbmJ1bmRsZWQgPSBfcGFpcklkcyRwLmVkZ2VJc1VuYnVuZGxlZDtcbiAgICB2YXIga2V5ID0gZ2V0S2V5KHBhaXJJZCwgZWRnZUlzVW5idW5kbGVkKTtcbiAgICB2YXIgcGFpckluZm8gPSBoYXNoVGFibGUuZ2V0KGtleSk7XG4gICAgdmFyIHN3YXBwZWRwYWlySW5mbztcbiAgICBpZiAoIXBhaXJJbmZvLmhhc1VuYnVuZGxlZCkge1xuICAgICAgdmFyIHBsbEVkZ2VzID0gcGFpckluZm8uZWxlc1swXS5wYXJhbGxlbEVkZ2VzKCkuZmlsdGVyKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiBlLmlzQnVuZGxlZEJlemllcigpO1xuICAgICAgfSk7XG4gICAgICBjbGVhckFycmF5KHBhaXJJbmZvLmVsZXMpO1xuICAgICAgcGxsRWRnZXMuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgICByZXR1cm4gcGFpckluZm8uZWxlcy5wdXNoKGVkZ2UpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIGZvciBlYWNoIHBhaXIgaWQsIHRoZSBlZGdlcyBzaG91bGQgYmUgc29ydGVkIGJ5IGluZGV4XG4gICAgICBwYWlySW5mby5lbGVzLnNvcnQoZnVuY3Rpb24gKGVkZ2UxLCBlZGdlMikge1xuICAgICAgICByZXR1cm4gZWRnZTEucG9vbEluZGV4KCkgLSBlZGdlMi5wb29sSW5kZXgoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB2YXIgZmlyc3RFZGdlID0gcGFpckluZm8uZWxlc1swXTtcbiAgICB2YXIgc3JjID0gZmlyc3RFZGdlLnNvdXJjZSgpO1xuICAgIHZhciB0Z3QgPSBmaXJzdEVkZ2UudGFyZ2V0KCk7XG5cbiAgICAvLyBtYWtlIHN1cmUgc3JjL3RndCBkaXN0aW5jdGlvbiBpcyBjb25zaXN0ZW50IHcuci50LiBwYWlySWRcbiAgICBpZiAoc3JjLnBvb2xJbmRleCgpID4gdGd0LnBvb2xJbmRleCgpKSB7XG4gICAgICB2YXIgdGVtcCA9IHNyYztcbiAgICAgIHNyYyA9IHRndDtcbiAgICAgIHRndCA9IHRlbXA7XG4gICAgfVxuICAgIHZhciBzcmNQb3MgPSBwYWlySW5mby5zcmNQb3MgPSBzcmMucG9zaXRpb24oKTtcbiAgICB2YXIgdGd0UG9zID0gcGFpckluZm8udGd0UG9zID0gdGd0LnBvc2l0aW9uKCk7XG4gICAgdmFyIHNyY1cgPSBwYWlySW5mby5zcmNXID0gc3JjLm91dGVyV2lkdGgoKTtcbiAgICB2YXIgc3JjSCA9IHBhaXJJbmZvLnNyY0ggPSBzcmMub3V0ZXJIZWlnaHQoKTtcbiAgICB2YXIgdGd0VyA9IHBhaXJJbmZvLnRndFcgPSB0Z3Qub3V0ZXJXaWR0aCgpO1xuICAgIHZhciB0Z3RIID0gcGFpckluZm8udGd0SCA9IHRndC5vdXRlckhlaWdodCgpO1xuICAgIHZhciBzcmNTaGFwZSA9IHBhaXJJbmZvLnNyY1NoYXBlID0gci5ub2RlU2hhcGVzW190aGlzLmdldE5vZGVTaGFwZShzcmMpXTtcbiAgICB2YXIgdGd0U2hhcGUgPSBwYWlySW5mby50Z3RTaGFwZSA9IHIubm9kZVNoYXBlc1tfdGhpcy5nZXROb2RlU2hhcGUodGd0KV07XG4gICAgdmFyIHNyY0Nvcm5lclJhZGl1cyA9IHBhaXJJbmZvLnNyY0Nvcm5lclJhZGl1cyA9IHNyYy5wc3R5bGUoJ2Nvcm5lci1yYWRpdXMnKS52YWx1ZSA9PT0gJ2F1dG8nID8gJ2F1dG8nIDogc3JjLnBzdHlsZSgnY29ybmVyLXJhZGl1cycpLnBmVmFsdWU7XG4gICAgdmFyIHRndENvcm5lclJhZGl1cyA9IHBhaXJJbmZvLnRndENvcm5lclJhZGl1cyA9IHRndC5wc3R5bGUoJ2Nvcm5lci1yYWRpdXMnKS52YWx1ZSA9PT0gJ2F1dG8nID8gJ2F1dG8nIDogdGd0LnBzdHlsZSgnY29ybmVyLXJhZGl1cycpLnBmVmFsdWU7XG4gICAgdmFyIHRndFJzID0gcGFpckluZm8udGd0UnMgPSB0Z3QuX3ByaXZhdGUucnNjcmF0Y2g7XG4gICAgdmFyIHNyY1JzID0gcGFpckluZm8uc3JjUnMgPSBzcmMuX3ByaXZhdGUucnNjcmF0Y2g7XG4gICAgcGFpckluZm8uZGlyQ291bnRzID0ge1xuICAgICAgJ25vcnRoJzogMCxcbiAgICAgICd3ZXN0JzogMCxcbiAgICAgICdzb3V0aCc6IDAsXG4gICAgICAnZWFzdCc6IDAsXG4gICAgICAnbm9ydGh3ZXN0JzogMCxcbiAgICAgICdzb3V0aHdlc3QnOiAwLFxuICAgICAgJ25vcnRoZWFzdCc6IDAsXG4gICAgICAnc291dGhlYXN0JzogMFxuICAgIH07XG4gICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgcGFpckluZm8uZWxlcy5sZW5ndGg7IF9pMisrKSB7XG4gICAgICB2YXIgX2VkZ2UgPSBwYWlySW5mby5lbGVzW19pMl07XG4gICAgICB2YXIgcnMgPSBfZWRnZVswXS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgICAgIHZhciBfY3VydmVTdHlsZSA9IF9lZGdlLnBzdHlsZSgnY3VydmUtc3R5bGUnKS52YWx1ZTtcbiAgICAgIHZhciBfZWRnZUlzVW5idW5kbGVkID0gX2N1cnZlU3R5bGUgPT09ICd1bmJ1bmRsZWQtYmV6aWVyJyB8fCBlbmRzV2l0aChfY3VydmVTdHlsZSwgJ3NlZ21lbnRzJykgfHwgZW5kc1dpdGgoX2N1cnZlU3R5bGUsICd0YXhpJyk7XG5cbiAgICAgIC8vIHdoZXRoZXIgdGhlIG5vcm1hbGlzZWQgcGFpciBvcmRlciBpcyB0aGUgcmV2ZXJzZSBvZiB0aGUgZWRnZSdzIHNyYy10Z3Qgb3JkZXJcbiAgICAgIHZhciBlZGdlSXNTd2FwcGVkID0gIXNyYy5zYW1lKF9lZGdlLnNvdXJjZSgpKTtcbiAgICAgIGlmICghcGFpckluZm8uY2FsY3VsYXRlZEludGVyc2VjdGlvbiAmJiBzcmMgIT09IHRndCAmJiAocGFpckluZm8uaGFzQmV6aWVyIHx8IHBhaXJJbmZvLmhhc1VuYnVuZGxlZCkpIHtcbiAgICAgICAgcGFpckluZm8uY2FsY3VsYXRlZEludGVyc2VjdGlvbiA9IHRydWU7XG5cbiAgICAgICAgLy8gcHQgb3V0c2lkZSBzcmMgc2hhcGUgdG8gY2FsYyBkaXN0YW5jZS9kaXNwbGFjZW1lbnQgZnJvbSBzcmMgdG8gdGd0XG4gICAgICAgIHZhciBzcmNPdXRzaWRlID0gc3JjU2hhcGUuaW50ZXJzZWN0TGluZShzcmNQb3MueCwgc3JjUG9zLnksIHNyY1csIHNyY0gsIHRndFBvcy54LCB0Z3RQb3MueSwgMCwgc3JjQ29ybmVyUmFkaXVzLCBzcmNScyk7XG4gICAgICAgIHZhciBzcmNJbnRuID0gcGFpckluZm8uc3JjSW50biA9IHNyY091dHNpZGU7XG5cbiAgICAgICAgLy8gcHQgb3V0c2lkZSB0Z3Qgc2hhcGUgdG8gY2FsYyBkaXN0YW5jZS9kaXNwbGFjZW1lbnQgZnJvbSBzcmMgdG8gdGd0XG4gICAgICAgIHZhciB0Z3RPdXRzaWRlID0gdGd0U2hhcGUuaW50ZXJzZWN0TGluZSh0Z3RQb3MueCwgdGd0UG9zLnksIHRndFcsIHRndEgsIHNyY1Bvcy54LCBzcmNQb3MueSwgMCwgdGd0Q29ybmVyUmFkaXVzLCB0Z3RScyk7XG4gICAgICAgIHZhciB0Z3RJbnRuID0gcGFpckluZm8udGd0SW50biA9IHRndE91dHNpZGU7XG4gICAgICAgIHZhciBpbnRlcnNlY3Rpb25QdHMgPSBwYWlySW5mby5pbnRlcnNlY3Rpb25QdHMgPSB7XG4gICAgICAgICAgeDE6IHNyY091dHNpZGVbMF0sXG4gICAgICAgICAgeDI6IHRndE91dHNpZGVbMF0sXG4gICAgICAgICAgeTE6IHNyY091dHNpZGVbMV0sXG4gICAgICAgICAgeTI6IHRndE91dHNpZGVbMV1cbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHBvc1B0cyA9IHBhaXJJbmZvLnBvc1B0cyA9IHtcbiAgICAgICAgICB4MTogc3JjUG9zLngsXG4gICAgICAgICAgeDI6IHRndFBvcy54LFxuICAgICAgICAgIHkxOiBzcmNQb3MueSxcbiAgICAgICAgICB5MjogdGd0UG9zLnlcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIGR5ID0gdGd0T3V0c2lkZVsxXSAtIHNyY091dHNpZGVbMV07XG4gICAgICAgIHZhciBkeCA9IHRndE91dHNpZGVbMF0gLSBzcmNPdXRzaWRlWzBdO1xuICAgICAgICB2YXIgbCA9IE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSk7XG4gICAgICAgIGlmIChudW1iZXIkMShsKSAmJiBsID49IEFWT0lEX0lNUE9TU0lCTEVfQkVaSUVSX0NPTlNUQU5UX0wpIDsgZWxzZSB7XG4gICAgICAgICAgbCA9IE1hdGguc3FydChNYXRoLm1heChkeCAqIGR4LCBBVk9JRF9JTVBPU1NJQkxFX0JFWklFUl9DT05TVEFOVCkgKyBNYXRoLm1heChkeSAqIGR5LCBBVk9JRF9JTVBPU1NJQkxFX0JFWklFUl9DT05TVEFOVCkpO1xuICAgICAgICB9XG4gICAgICAgIHZhciB2ZWN0b3IgPSBwYWlySW5mby52ZWN0b3IgPSB7XG4gICAgICAgICAgeDogZHgsXG4gICAgICAgICAgeTogZHlcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHZlY3Rvck5vcm0gPSBwYWlySW5mby52ZWN0b3JOb3JtID0ge1xuICAgICAgICAgIHg6IHZlY3Rvci54IC8gbCxcbiAgICAgICAgICB5OiB2ZWN0b3IueSAvIGxcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHZlY3Rvck5vcm1JbnZlcnNlID0ge1xuICAgICAgICAgIHg6IC12ZWN0b3JOb3JtLnksXG4gICAgICAgICAgeTogdmVjdG9yTm9ybS54XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gaWYgbm9kZSBzaGFwZXMgb3ZlcmxhcCwgdGhlbiBubyBjdHJsIHB0cyB0byBkcmF3XG4gICAgICAgIHBhaXJJbmZvLm5vZGVzT3ZlcmxhcCA9ICFudW1iZXIkMShsKSB8fCB0Z3RTaGFwZS5jaGVja1BvaW50KHNyY091dHNpZGVbMF0sIHNyY091dHNpZGVbMV0sIDAsIHRndFcsIHRndEgsIHRndFBvcy54LCB0Z3RQb3MueSwgdGd0Q29ybmVyUmFkaXVzLCB0Z3RScykgfHwgc3JjU2hhcGUuY2hlY2tQb2ludCh0Z3RPdXRzaWRlWzBdLCB0Z3RPdXRzaWRlWzFdLCAwLCBzcmNXLCBzcmNILCBzcmNQb3MueCwgc3JjUG9zLnksIHNyY0Nvcm5lclJhZGl1cywgc3JjUnMpO1xuICAgICAgICBwYWlySW5mby52ZWN0b3JOb3JtSW52ZXJzZSA9IHZlY3Rvck5vcm1JbnZlcnNlO1xuICAgICAgICBzd2FwcGVkcGFpckluZm8gPSB7XG4gICAgICAgICAgbm9kZXNPdmVybGFwOiBwYWlySW5mby5ub2Rlc092ZXJsYXAsXG4gICAgICAgICAgZGlyQ291bnRzOiBwYWlySW5mby5kaXJDb3VudHMsXG4gICAgICAgICAgY2FsY3VsYXRlZEludGVyc2VjdGlvbjogdHJ1ZSxcbiAgICAgICAgICBoYXNCZXppZXI6IHBhaXJJbmZvLmhhc0JlemllcixcbiAgICAgICAgICBoYXNVbmJ1bmRsZWQ6IHBhaXJJbmZvLmhhc1VuYnVuZGxlZCxcbiAgICAgICAgICBlbGVzOiBwYWlySW5mby5lbGVzLFxuICAgICAgICAgIHNyY1BvczogdGd0UG9zLFxuICAgICAgICAgIHNyY1JzOiB0Z3RScyxcbiAgICAgICAgICB0Z3RQb3M6IHNyY1BvcyxcbiAgICAgICAgICB0Z3RSczogc3JjUnMsXG4gICAgICAgICAgc3JjVzogdGd0VyxcbiAgICAgICAgICBzcmNIOiB0Z3RILFxuICAgICAgICAgIHRndFc6IHNyY1csXG4gICAgICAgICAgdGd0SDogc3JjSCxcbiAgICAgICAgICBzcmNJbnRuOiB0Z3RJbnRuLFxuICAgICAgICAgIHRndEludG46IHNyY0ludG4sXG4gICAgICAgICAgc3JjU2hhcGU6IHRndFNoYXBlLFxuICAgICAgICAgIHRndFNoYXBlOiBzcmNTaGFwZSxcbiAgICAgICAgICBwb3NQdHM6IHtcbiAgICAgICAgICAgIHgxOiBwb3NQdHMueDIsXG4gICAgICAgICAgICB5MTogcG9zUHRzLnkyLFxuICAgICAgICAgICAgeDI6IHBvc1B0cy54MSxcbiAgICAgICAgICAgIHkyOiBwb3NQdHMueTFcbiAgICAgICAgICB9LFxuICAgICAgICAgIGludGVyc2VjdGlvblB0czoge1xuICAgICAgICAgICAgeDE6IGludGVyc2VjdGlvblB0cy54MixcbiAgICAgICAgICAgIHkxOiBpbnRlcnNlY3Rpb25QdHMueTIsXG4gICAgICAgICAgICB4MjogaW50ZXJzZWN0aW9uUHRzLngxLFxuICAgICAgICAgICAgeTI6IGludGVyc2VjdGlvblB0cy55MVxuICAgICAgICAgIH0sXG4gICAgICAgICAgdmVjdG9yOiB7XG4gICAgICAgICAgICB4OiAtdmVjdG9yLngsXG4gICAgICAgICAgICB5OiAtdmVjdG9yLnlcbiAgICAgICAgICB9LFxuICAgICAgICAgIHZlY3Rvck5vcm06IHtcbiAgICAgICAgICAgIHg6IC12ZWN0b3JOb3JtLngsXG4gICAgICAgICAgICB5OiAtdmVjdG9yTm9ybS55XG4gICAgICAgICAgfSxcbiAgICAgICAgICB2ZWN0b3JOb3JtSW52ZXJzZToge1xuICAgICAgICAgICAgeDogLXZlY3Rvck5vcm1JbnZlcnNlLngsXG4gICAgICAgICAgICB5OiAtdmVjdG9yTm9ybUludmVyc2UueVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHZhciBwYXNzZWRQYWlySW5mbyA9IGVkZ2VJc1N3YXBwZWQgPyBzd2FwcGVkcGFpckluZm8gOiBwYWlySW5mbztcbiAgICAgIHJzLm5vZGVzT3ZlcmxhcCA9IHBhc3NlZFBhaXJJbmZvLm5vZGVzT3ZlcmxhcDtcbiAgICAgIHJzLnNyY0ludG4gPSBwYXNzZWRQYWlySW5mby5zcmNJbnRuO1xuICAgICAgcnMudGd0SW50biA9IHBhc3NlZFBhaXJJbmZvLnRndEludG47XG4gICAgICBycy5pc1JvdW5kID0gX2N1cnZlU3R5bGUuc3RhcnRzV2l0aCgncm91bmQnKTtcbiAgICAgIGlmIChoYXNDb21wb3VuZHMgJiYgKHNyYy5pc1BhcmVudCgpIHx8IHNyYy5pc0NoaWxkKCkgfHwgdGd0LmlzUGFyZW50KCkgfHwgdGd0LmlzQ2hpbGQoKSkgJiYgKHNyYy5wYXJlbnRzKCkuYW55U2FtZSh0Z3QpIHx8IHRndC5wYXJlbnRzKCkuYW55U2FtZShzcmMpIHx8IHNyYy5zYW1lKHRndCkgJiYgc3JjLmlzUGFyZW50KCkpKSB7XG4gICAgICAgIF90aGlzLmZpbmRDb21wb3VuZExvb3BQb2ludHMoX2VkZ2UsIHBhc3NlZFBhaXJJbmZvLCBfaTIsIF9lZGdlSXNVbmJ1bmRsZWQpO1xuICAgICAgfSBlbHNlIGlmIChzcmMgPT09IHRndCkge1xuICAgICAgICBfdGhpcy5maW5kTG9vcFBvaW50cyhfZWRnZSwgcGFzc2VkUGFpckluZm8sIF9pMiwgX2VkZ2VJc1VuYnVuZGxlZCk7XG4gICAgICB9IGVsc2UgaWYgKF9jdXJ2ZVN0eWxlLmVuZHNXaXRoKCdzZWdtZW50cycpKSB7XG4gICAgICAgIF90aGlzLmZpbmRTZWdtZW50c1BvaW50cyhfZWRnZSwgcGFzc2VkUGFpckluZm8pO1xuICAgICAgfSBlbHNlIGlmIChfY3VydmVTdHlsZS5lbmRzV2l0aCgndGF4aScpKSB7XG4gICAgICAgIF90aGlzLmZpbmRUYXhpUG9pbnRzKF9lZGdlLCBwYXNzZWRQYWlySW5mbyk7XG4gICAgICB9IGVsc2UgaWYgKF9jdXJ2ZVN0eWxlID09PSAnc3RyYWlnaHQnIHx8ICFfZWRnZUlzVW5idW5kbGVkICYmIHBhaXJJbmZvLmVsZXMubGVuZ3RoICUgMiA9PT0gMSAmJiBfaTIgPT09IE1hdGguZmxvb3IocGFpckluZm8uZWxlcy5sZW5ndGggLyAyKSkge1xuICAgICAgICBfdGhpcy5maW5kU3RyYWlnaHRFZGdlUG9pbnRzKF9lZGdlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF90aGlzLmZpbmRCZXppZXJQb2ludHMoX2VkZ2UsIHBhc3NlZFBhaXJJbmZvLCBfaTIsIF9lZGdlSXNVbmJ1bmRsZWQsIGVkZ2VJc1N3YXBwZWQpO1xuICAgICAgfVxuICAgICAgX3RoaXMuZmluZEVuZHBvaW50cyhfZWRnZSk7XG4gICAgICBfdGhpcy50cnlUb0NvcnJlY3RJbnZhbGlkUG9pbnRzKF9lZGdlLCBwYXNzZWRQYWlySW5mbyk7XG4gICAgICBfdGhpcy5jaGVja0ZvckludmFsaWRFZGdlV2FybmluZyhfZWRnZSk7XG4gICAgICBfdGhpcy5zdG9yZUFsbHB0cyhfZWRnZSk7XG4gICAgICBfdGhpcy5zdG9yZUVkZ2VQcm9qZWN0aW9ucyhfZWRnZSk7XG4gICAgICBfdGhpcy5jYWxjdWxhdGVBcnJvd0FuZ2xlcyhfZWRnZSk7XG4gICAgICBfdGhpcy5yZWNhbGN1bGF0ZUVkZ2VMYWJlbFByb2plY3Rpb25zKF9lZGdlKTtcbiAgICAgIF90aGlzLmNhbGN1bGF0ZUxhYmVsQW5nbGVzKF9lZGdlKTtcbiAgICB9IC8vIGZvciBwYWlyIGVkZ2VzXG4gIH07XG4gIGZvciAodmFyIHAgPSAwOyBwIDwgcGFpcklkcy5sZW5ndGg7IHArKykge1xuICAgIF9sb29wKCk7XG4gIH0gLy8gZm9yIHBhaXIgaWRzXG5cbiAgLy8gaGF5c3RhY2tzIGF2b2lkIHRoZSBleHBlbnNlIG9mIHBhaXJJbmZvIHN0dWZmIChpbnRlcnNlY3Rpb25zIGV0Yy4pXG4gIHRoaXMuZmluZEhheXN0YWNrUG9pbnRzKGhheXN0YWNrRWRnZXMpO1xufTtcbmZ1bmN0aW9uIGdldFB0cyhwdHMpIHtcbiAgdmFyIHJldFB0cyA9IFtdO1xuICBpZiAocHRzID09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwdHMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICB2YXIgeCA9IHB0c1tpXTtcbiAgICB2YXIgeSA9IHB0c1tpICsgMV07XG4gICAgcmV0UHRzLnB1c2goe1xuICAgICAgeDogeCxcbiAgICAgIHk6IHlcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcmV0UHRzO1xufVxuQlJwJGMuZ2V0U2VnbWVudFBvaW50cyA9IGZ1bmN0aW9uIChlZGdlKSB7XG4gIHZhciBycyA9IGVkZ2VbMF0uX3ByaXZhdGUucnNjcmF0Y2g7XG4gIHRoaXMucmVjYWxjdWxhdGVSZW5kZXJlZFN0eWxlKGVkZ2UpO1xuICB2YXIgdHlwZSA9IHJzLmVkZ2VUeXBlO1xuICBpZiAodHlwZSA9PT0gJ3NlZ21lbnRzJykge1xuICAgIHJldHVybiBnZXRQdHMocnMuc2VncHRzKTtcbiAgfVxufTtcbkJScCRjLmdldENvbnRyb2xQb2ludHMgPSBmdW5jdGlvbiAoZWRnZSkge1xuICB2YXIgcnMgPSBlZGdlWzBdLl9wcml2YXRlLnJzY3JhdGNoO1xuICB0aGlzLnJlY2FsY3VsYXRlUmVuZGVyZWRTdHlsZShlZGdlKTtcbiAgdmFyIHR5cGUgPSBycy5lZGdlVHlwZTtcbiAgaWYgKHR5cGUgPT09ICdiZXppZXInIHx8IHR5cGUgPT09ICdtdWx0aWJlemllcicgfHwgdHlwZSA9PT0gJ3NlbGYnIHx8IHR5cGUgPT09ICdjb21wb3VuZCcpIHtcbiAgICByZXR1cm4gZ2V0UHRzKHJzLmN0cmxwdHMpO1xuICB9XG59O1xuQlJwJGMuZ2V0RWRnZU1pZHBvaW50ID0gZnVuY3Rpb24gKGVkZ2UpIHtcbiAgdmFyIHJzID0gZWRnZVswXS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgdGhpcy5yZWNhbGN1bGF0ZVJlbmRlcmVkU3R5bGUoZWRnZSk7XG4gIHJldHVybiB7XG4gICAgeDogcnMubWlkWCxcbiAgICB5OiBycy5taWRZXG4gIH07XG59O1xuXG52YXIgQlJwJGIgPSB7fTtcbkJScCRiLm1hbnVhbEVuZHB0VG9QeCA9IGZ1bmN0aW9uIChub2RlLCBwcm9wKSB7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIG5wb3MgPSBub2RlLnBvc2l0aW9uKCk7XG4gIHZhciB3ID0gbm9kZS5vdXRlcldpZHRoKCk7XG4gIHZhciBoID0gbm9kZS5vdXRlckhlaWdodCgpO1xuICB2YXIgcnMgPSBub2RlLl9wcml2YXRlLnJzY3JhdGNoO1xuICBpZiAocHJvcC52YWx1ZS5sZW5ndGggPT09IDIpIHtcbiAgICB2YXIgcCA9IFtwcm9wLnBmVmFsdWVbMF0sIHByb3AucGZWYWx1ZVsxXV07XG4gICAgaWYgKHByb3AudW5pdHNbMF0gPT09ICclJykge1xuICAgICAgcFswXSA9IHBbMF0gKiB3O1xuICAgIH1cbiAgICBpZiAocHJvcC51bml0c1sxXSA9PT0gJyUnKSB7XG4gICAgICBwWzFdID0gcFsxXSAqIGg7XG4gICAgfVxuICAgIHBbMF0gKz0gbnBvcy54O1xuICAgIHBbMV0gKz0gbnBvcy55O1xuICAgIHJldHVybiBwO1xuICB9IGVsc2Uge1xuICAgIHZhciBhbmdsZSA9IHByb3AucGZWYWx1ZVswXTtcbiAgICBhbmdsZSA9IC1NYXRoLlBJIC8gMiArIGFuZ2xlOyAvLyBzdGFydCBhdCAxMiBvJ2Nsb2NrXG5cbiAgICB2YXIgbCA9IDIgKiBNYXRoLm1heCh3LCBoKTtcbiAgICB2YXIgX3AgPSBbbnBvcy54ICsgTWF0aC5jb3MoYW5nbGUpICogbCwgbnBvcy55ICsgTWF0aC5zaW4oYW5nbGUpICogbF07XG4gICAgcmV0dXJuIHIubm9kZVNoYXBlc1t0aGlzLmdldE5vZGVTaGFwZShub2RlKV0uaW50ZXJzZWN0TGluZShucG9zLngsIG5wb3MueSwgdywgaCwgX3BbMF0sIF9wWzFdLCAwLCBub2RlLnBzdHlsZSgnY29ybmVyLXJhZGl1cycpLnZhbHVlID09PSAnYXV0bycgPyAnYXV0bycgOiBub2RlLnBzdHlsZSgnY29ybmVyLXJhZGl1cycpLnBmVmFsdWUsIHJzKTtcbiAgfVxufTtcbkJScCRiLmZpbmRFbmRwb2ludHMgPSBmdW5jdGlvbiAoZWRnZSkge1xuICB2YXIgX3JlZiwgX3RndE1hbkVuZHB0JHBmVmFsdWUsIF9yZWYyLCBfc3JjTWFuRW5kcHQkcGZWYWx1ZTtcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgaW50ZXJzZWN0O1xuICB2YXIgc291cmNlID0gZWRnZS5zb3VyY2UoKVswXTtcbiAgdmFyIHRhcmdldCA9IGVkZ2UudGFyZ2V0KClbMF07XG4gIHZhciBzcmNQb3MgPSBzb3VyY2UucG9zaXRpb24oKTtcbiAgdmFyIHRndFBvcyA9IHRhcmdldC5wb3NpdGlvbigpO1xuICB2YXIgdGd0QXJTaGFwZSA9IGVkZ2UucHN0eWxlKCd0YXJnZXQtYXJyb3ctc2hhcGUnKS52YWx1ZTtcbiAgdmFyIHNyY0FyU2hhcGUgPSBlZGdlLnBzdHlsZSgnc291cmNlLWFycm93LXNoYXBlJykudmFsdWU7XG4gIHZhciB0Z3REaXN0ID0gZWRnZS5wc3R5bGUoJ3RhcmdldC1kaXN0YW5jZS1mcm9tLW5vZGUnKS5wZlZhbHVlO1xuICB2YXIgc3JjRGlzdCA9IGVkZ2UucHN0eWxlKCdzb3VyY2UtZGlzdGFuY2UtZnJvbS1ub2RlJykucGZWYWx1ZTtcbiAgdmFyIHNyY1JzID0gc291cmNlLl9wcml2YXRlLnJzY3JhdGNoO1xuICB2YXIgdGd0UnMgPSB0YXJnZXQuX3ByaXZhdGUucnNjcmF0Y2g7XG4gIHZhciBjdXJ2ZVN0eWxlID0gZWRnZS5wc3R5bGUoJ2N1cnZlLXN0eWxlJykudmFsdWU7XG4gIHZhciBycyA9IGVkZ2UuX3ByaXZhdGUucnNjcmF0Y2g7XG4gIHZhciBldCA9IHJzLmVkZ2VUeXBlO1xuICB2YXIgdGF4aSA9IGVuZHNXaXRoKGN1cnZlU3R5bGUsICd0YXhpJyk7IC8vIENvdmVycyB0YXhpIGFuZCByb3VuZC10YXhpXG4gIHZhciBzZWxmID0gZXQgPT09ICdzZWxmJyB8fCBldCA9PT0gJ2NvbXBvdW5kJztcbiAgdmFyIGJlemllciA9IGV0ID09PSAnYmV6aWVyJyB8fCBldCA9PT0gJ211bHRpYmV6aWVyJyB8fCBzZWxmO1xuICB2YXIgbXVsdGkgPSBldCAhPT0gJ2Jlemllcic7XG4gIHZhciBsaW5lcyA9IGV0ID09PSAnc3RyYWlnaHQnIHx8IGV0ID09PSAnc2VnbWVudHMnO1xuICB2YXIgc2VnbWVudHMgPSBldCA9PT0gJ3NlZ21lbnRzJztcbiAgdmFyIGhhc0VuZHB0cyA9IGJlemllciB8fCBtdWx0aSB8fCBsaW5lcztcbiAgdmFyIG92ZXJyaWRlRW5kcHRzID0gc2VsZiB8fCB0YXhpO1xuICB2YXIgc3JjTWFuRW5kcHQgPSBlZGdlLnBzdHlsZSgnc291cmNlLWVuZHBvaW50Jyk7XG4gIHZhciBzcmNNYW5FbmRwdFZhbCA9IG92ZXJyaWRlRW5kcHRzID8gJ291dHNpZGUtdG8tbm9kZScgOiBzcmNNYW5FbmRwdC52YWx1ZTtcbiAgdmFyIHNyY0Nvcm5lclJhZGl1cyA9IHNvdXJjZS5wc3R5bGUoJ2Nvcm5lci1yYWRpdXMnKS52YWx1ZSA9PT0gJ2F1dG8nID8gJ2F1dG8nIDogc291cmNlLnBzdHlsZSgnY29ybmVyLXJhZGl1cycpLnBmVmFsdWU7XG4gIHZhciB0Z3RNYW5FbmRwdCA9IGVkZ2UucHN0eWxlKCd0YXJnZXQtZW5kcG9pbnQnKTtcbiAgdmFyIHRndE1hbkVuZHB0VmFsID0gb3ZlcnJpZGVFbmRwdHMgPyAnb3V0c2lkZS10by1ub2RlJyA6IHRndE1hbkVuZHB0LnZhbHVlO1xuICB2YXIgdGd0Q29ybmVyUmFkaXVzID0gdGFyZ2V0LnBzdHlsZSgnY29ybmVyLXJhZGl1cycpLnZhbHVlID09PSAnYXV0bycgPyAnYXV0bycgOiB0YXJnZXQucHN0eWxlKCdjb3JuZXItcmFkaXVzJykucGZWYWx1ZTtcbiAgcnMuc3JjTWFuRW5kcHQgPSBzcmNNYW5FbmRwdDtcbiAgcnMudGd0TWFuRW5kcHQgPSB0Z3RNYW5FbmRwdDtcbiAgdmFyIHAxOyAvLyBsYXN0IGtub3duIHBvaW50IG9mIGVkZ2Ugb24gdGFyZ2V0IHNpZGVcbiAgdmFyIHAyOyAvLyBsYXN0IGtub3duIHBvaW50IG9mIGVkZ2Ugb24gc291cmNlIHNpZGVcblxuICB2YXIgcDFfaTsgLy8gcG9pbnQgdG8gaW50ZXJzZWN0IHdpdGggdGFyZ2V0IHNoYXBlXG4gIHZhciBwMl9pOyAvLyBwb2ludCB0byBpbnRlcnNlY3Qgd2l0aCBzb3VyY2Ugc2hhcGVcblxuICB2YXIgdGd0TWFuRW5kcHRQdCA9IChfcmVmID0gKHRndE1hbkVuZHB0ID09PSBudWxsIHx8IHRndE1hbkVuZHB0ID09PSB2b2lkIDAgfHwgKF90Z3RNYW5FbmRwdCRwZlZhbHVlID0gdGd0TWFuRW5kcHQucGZWYWx1ZSkgPT09IG51bGwgfHwgX3RndE1hbkVuZHB0JHBmVmFsdWUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90Z3RNYW5FbmRwdCRwZlZhbHVlLmxlbmd0aCkgPT09IDIgPyB0Z3RNYW5FbmRwdC5wZlZhbHVlIDogbnVsbCkgIT09IG51bGwgJiYgX3JlZiAhPT0gdm9pZCAwID8gX3JlZiA6IFswLCAwXTtcbiAgdmFyIHNyY01hbkVuZHB0UHQgPSAoX3JlZjIgPSAoc3JjTWFuRW5kcHQgPT09IG51bGwgfHwgc3JjTWFuRW5kcHQgPT09IHZvaWQgMCB8fCAoX3NyY01hbkVuZHB0JHBmVmFsdWUgPSBzcmNNYW5FbmRwdC5wZlZhbHVlKSA9PT0gbnVsbCB8fCBfc3JjTWFuRW5kcHQkcGZWYWx1ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3NyY01hbkVuZHB0JHBmVmFsdWUubGVuZ3RoKSA9PT0gMiA/IHNyY01hbkVuZHB0LnBmVmFsdWUgOiBudWxsKSAhPT0gbnVsbCAmJiBfcmVmMiAhPT0gdm9pZCAwID8gX3JlZjIgOiBbMCwgMF07XG4gIGlmIChiZXppZXIpIHtcbiAgICB2YXIgY3BTdGFydCA9IFtycy5jdHJscHRzWzBdLCBycy5jdHJscHRzWzFdXTtcbiAgICB2YXIgY3BFbmQgPSBtdWx0aSA/IFtycy5jdHJscHRzW3JzLmN0cmxwdHMubGVuZ3RoIC0gMl0sIHJzLmN0cmxwdHNbcnMuY3RybHB0cy5sZW5ndGggLSAxXV0gOiBjcFN0YXJ0O1xuICAgIHAxID0gY3BFbmQ7XG4gICAgcDIgPSBjcFN0YXJ0O1xuICB9IGVsc2UgaWYgKGxpbmVzKSB7XG4gICAgdmFyIHNyY0Fycm93RnJvbVB0ID0gIXNlZ21lbnRzID8gW3RndFBvcy54ICsgdGd0TWFuRW5kcHRQdFswXSwgdGd0UG9zLnkgKyB0Z3RNYW5FbmRwdFB0WzFdXSA6IHJzLnNlZ3B0cy5zbGljZSgwLCAyKTtcbiAgICB2YXIgdGd0QXJyb3dGcm9tUHQgPSAhc2VnbWVudHMgPyBbc3JjUG9zLnggKyBzcmNNYW5FbmRwdFB0WzBdLCBzcmNQb3MueSArIHNyY01hbkVuZHB0UHRbMV1dIDogcnMuc2VncHRzLnNsaWNlKHJzLnNlZ3B0cy5sZW5ndGggLSAyKTtcbiAgICBwMSA9IHRndEFycm93RnJvbVB0O1xuICAgIHAyID0gc3JjQXJyb3dGcm9tUHQ7XG4gIH1cbiAgaWYgKHRndE1hbkVuZHB0VmFsID09PSAnaW5zaWRlLXRvLW5vZGUnKSB7XG4gICAgaW50ZXJzZWN0ID0gW3RndFBvcy54LCB0Z3RQb3MueV07XG4gIH0gZWxzZSBpZiAodGd0TWFuRW5kcHQudW5pdHMpIHtcbiAgICBpbnRlcnNlY3QgPSB0aGlzLm1hbnVhbEVuZHB0VG9QeCh0YXJnZXQsIHRndE1hbkVuZHB0KTtcbiAgfSBlbHNlIGlmICh0Z3RNYW5FbmRwdFZhbCA9PT0gJ291dHNpZGUtdG8tbGluZScpIHtcbiAgICBpbnRlcnNlY3QgPSBycy50Z3RJbnRuOyAvLyB1c2UgY2FjaGVkIHZhbHVlIGZyb20gY3RybHB0IGNhbGNcbiAgfSBlbHNlIHtcbiAgICBpZiAodGd0TWFuRW5kcHRWYWwgPT09ICdvdXRzaWRlLXRvLW5vZGUnIHx8IHRndE1hbkVuZHB0VmFsID09PSAnb3V0c2lkZS10by1ub2RlLW9yLWxhYmVsJykge1xuICAgICAgcDFfaSA9IHAxO1xuICAgIH0gZWxzZSBpZiAodGd0TWFuRW5kcHRWYWwgPT09ICdvdXRzaWRlLXRvLWxpbmUnIHx8IHRndE1hbkVuZHB0VmFsID09PSAnb3V0c2lkZS10by1saW5lLW9yLWxhYmVsJykge1xuICAgICAgcDFfaSA9IFtzcmNQb3MueCwgc3JjUG9zLnldO1xuICAgIH1cbiAgICBpbnRlcnNlY3QgPSByLm5vZGVTaGFwZXNbdGhpcy5nZXROb2RlU2hhcGUodGFyZ2V0KV0uaW50ZXJzZWN0TGluZSh0Z3RQb3MueCwgdGd0UG9zLnksIHRhcmdldC5vdXRlcldpZHRoKCksIHRhcmdldC5vdXRlckhlaWdodCgpLCBwMV9pWzBdLCBwMV9pWzFdLCAwLCB0Z3RDb3JuZXJSYWRpdXMsIHRndFJzKTtcbiAgICBpZiAodGd0TWFuRW5kcHRWYWwgPT09ICdvdXRzaWRlLXRvLW5vZGUtb3ItbGFiZWwnIHx8IHRndE1hbkVuZHB0VmFsID09PSAnb3V0c2lkZS10by1saW5lLW9yLWxhYmVsJykge1xuICAgICAgdmFyIHRycyA9IHRhcmdldC5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgICAgIHZhciBsdyA9IHRycy5sYWJlbFdpZHRoO1xuICAgICAgdmFyIGxoID0gdHJzLmxhYmVsSGVpZ2h0O1xuICAgICAgdmFyIGx4ID0gdHJzLmxhYmVsWDtcbiAgICAgIHZhciBseSA9IHRycy5sYWJlbFk7XG4gICAgICB2YXIgbHcyID0gbHcgLyAyO1xuICAgICAgdmFyIGxoMiA9IGxoIC8gMjtcbiAgICAgIHZhciB2YSA9IHRhcmdldC5wc3R5bGUoJ3RleHQtdmFsaWduJykudmFsdWU7XG4gICAgICB2YSA9IGxhYmVsVmFsaWduKHZhKTtcbiAgICAgIGlmICh2YSA9PT0gJ3RvcCcpIHtcbiAgICAgICAgbHkgLT0gbGgyO1xuICAgICAgfSBlbHNlIGlmICh2YSA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgbHkgKz0gbGgyO1xuICAgICAgfVxuICAgICAgdmFyIGhhID0gdGFyZ2V0LnBzdHlsZSgndGV4dC1oYWxpZ24nKS52YWx1ZTtcbiAgICAgIGhhID0gbGFiZWxIYWxpZ24oaGEpO1xuICAgICAgaWYgKGhhID09PSAnbGVmdCcpIHtcbiAgICAgICAgbHggLT0gbHcyO1xuICAgICAgfSBlbHNlIGlmIChoYSA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICBseCArPSBsdzI7XG4gICAgICB9XG4gICAgICB2YXIgbGFiZWxJbnRlcnNlY3QgPSBwb2x5Z29uSW50ZXJzZWN0TGluZShwMV9pWzBdLCBwMV9pWzFdLCBbbHggLSBsdzIsIGx5IC0gbGgyLCBseCArIGx3MiwgbHkgLSBsaDIsIGx4ICsgbHcyLCBseSArIGxoMiwgbHggLSBsdzIsIGx5ICsgbGgyXSwgdGd0UG9zLngsIHRndFBvcy55KTtcbiAgICAgIGlmIChsYWJlbEludGVyc2VjdC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZhciByZWZQdCA9IHNyY1BvcztcbiAgICAgICAgdmFyIGludFNxZGlzdCA9IHNxZGlzdChyZWZQdCwgYXJyYXkycG9pbnQoaW50ZXJzZWN0KSk7XG4gICAgICAgIHZhciBsYWJJbnRTcWRpc3QgPSBzcWRpc3QocmVmUHQsIGFycmF5MnBvaW50KGxhYmVsSW50ZXJzZWN0KSk7XG4gICAgICAgIHZhciBtaW5TcURpc3QgPSBpbnRTcWRpc3Q7XG4gICAgICAgIGlmIChsYWJJbnRTcWRpc3QgPCBpbnRTcWRpc3QpIHtcbiAgICAgICAgICBpbnRlcnNlY3QgPSBsYWJlbEludGVyc2VjdDtcbiAgICAgICAgICBtaW5TcURpc3QgPSBsYWJJbnRTcWRpc3Q7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxhYmVsSW50ZXJzZWN0Lmxlbmd0aCA+IDIpIHtcbiAgICAgICAgICB2YXIgbGFiSW50MlNxRGlzdCA9IHNxZGlzdChyZWZQdCwge1xuICAgICAgICAgICAgeDogbGFiZWxJbnRlcnNlY3RbMl0sXG4gICAgICAgICAgICB5OiBsYWJlbEludGVyc2VjdFszXVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChsYWJJbnQyU3FEaXN0IDwgbWluU3FEaXN0KSB7XG4gICAgICAgICAgICBpbnRlcnNlY3QgPSBbbGFiZWxJbnRlcnNlY3RbMl0sIGxhYmVsSW50ZXJzZWN0WzNdXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgdmFyIGFycm93RW5kID0gc2hvcnRlbkludGVyc2VjdGlvbihpbnRlcnNlY3QsIHAxLCByLmFycm93U2hhcGVzW3RndEFyU2hhcGVdLnNwYWNpbmcoZWRnZSkgKyB0Z3REaXN0KTtcbiAgdmFyIGVkZ2VFbmQgPSBzaG9ydGVuSW50ZXJzZWN0aW9uKGludGVyc2VjdCwgcDEsIHIuYXJyb3dTaGFwZXNbdGd0QXJTaGFwZV0uZ2FwKGVkZ2UpICsgdGd0RGlzdCk7XG4gIHJzLmVuZFggPSBlZGdlRW5kWzBdO1xuICBycy5lbmRZID0gZWRnZUVuZFsxXTtcbiAgcnMuYXJyb3dFbmRYID0gYXJyb3dFbmRbMF07XG4gIHJzLmFycm93RW5kWSA9IGFycm93RW5kWzFdO1xuICBpZiAoc3JjTWFuRW5kcHRWYWwgPT09ICdpbnNpZGUtdG8tbm9kZScpIHtcbiAgICBpbnRlcnNlY3QgPSBbc3JjUG9zLngsIHNyY1Bvcy55XTtcbiAgfSBlbHNlIGlmIChzcmNNYW5FbmRwdC51bml0cykge1xuICAgIGludGVyc2VjdCA9IHRoaXMubWFudWFsRW5kcHRUb1B4KHNvdXJjZSwgc3JjTWFuRW5kcHQpO1xuICB9IGVsc2UgaWYgKHNyY01hbkVuZHB0VmFsID09PSAnb3V0c2lkZS10by1saW5lJykge1xuICAgIGludGVyc2VjdCA9IHJzLnNyY0ludG47IC8vIHVzZSBjYWNoZWQgdmFsdWUgZnJvbSBjdHJscHQgY2FsY1xuICB9IGVsc2Uge1xuICAgIGlmIChzcmNNYW5FbmRwdFZhbCA9PT0gJ291dHNpZGUtdG8tbm9kZScgfHwgc3JjTWFuRW5kcHRWYWwgPT09ICdvdXRzaWRlLXRvLW5vZGUtb3ItbGFiZWwnKSB7XG4gICAgICBwMl9pID0gcDI7XG4gICAgfSBlbHNlIGlmIChzcmNNYW5FbmRwdFZhbCA9PT0gJ291dHNpZGUtdG8tbGluZScgfHwgc3JjTWFuRW5kcHRWYWwgPT09ICdvdXRzaWRlLXRvLWxpbmUtb3ItbGFiZWwnKSB7XG4gICAgICBwMl9pID0gW3RndFBvcy54LCB0Z3RQb3MueV07XG4gICAgfVxuICAgIGludGVyc2VjdCA9IHIubm9kZVNoYXBlc1t0aGlzLmdldE5vZGVTaGFwZShzb3VyY2UpXS5pbnRlcnNlY3RMaW5lKHNyY1Bvcy54LCBzcmNQb3MueSwgc291cmNlLm91dGVyV2lkdGgoKSwgc291cmNlLm91dGVySGVpZ2h0KCksIHAyX2lbMF0sIHAyX2lbMV0sIDAsIHNyY0Nvcm5lclJhZGl1cywgc3JjUnMpO1xuICAgIGlmIChzcmNNYW5FbmRwdFZhbCA9PT0gJ291dHNpZGUtdG8tbm9kZS1vci1sYWJlbCcgfHwgc3JjTWFuRW5kcHRWYWwgPT09ICdvdXRzaWRlLXRvLWxpbmUtb3ItbGFiZWwnKSB7XG4gICAgICB2YXIgc3JzID0gc291cmNlLl9wcml2YXRlLnJzY3JhdGNoO1xuICAgICAgdmFyIF9sdyA9IHNycy5sYWJlbFdpZHRoO1xuICAgICAgdmFyIF9saCA9IHNycy5sYWJlbEhlaWdodDtcbiAgICAgIHZhciBfbHggPSBzcnMubGFiZWxYO1xuICAgICAgdmFyIF9seSA9IHNycy5sYWJlbFk7XG4gICAgICB2YXIgX2x3MiA9IF9sdyAvIDI7XG4gICAgICB2YXIgX2xoMiA9IF9saCAvIDI7XG4gICAgICB2YXIgX3ZhID0gc291cmNlLnBzdHlsZSgndGV4dC12YWxpZ24nKS52YWx1ZTtcbiAgICAgIF92YSA9IGxhYmVsVmFsaWduKF92YSk7XG4gICAgICBpZiAoX3ZhID09PSAndG9wJykge1xuICAgICAgICBfbHkgLT0gX2xoMjtcbiAgICAgIH0gZWxzZSBpZiAoX3ZhID09PSAnYm90dG9tJykge1xuICAgICAgICBfbHkgKz0gX2xoMjtcbiAgICAgIH1cbiAgICAgIHZhciBfaGEgPSBzb3VyY2UucHN0eWxlKCd0ZXh0LWhhbGlnbicpLnZhbHVlO1xuICAgICAgX2hhID0gbGFiZWxIYWxpZ24oX2hhKTtcbiAgICAgIGlmIChfaGEgPT09ICdsZWZ0Jykge1xuICAgICAgICBfbHggLT0gX2x3MjtcbiAgICAgIH0gZWxzZSBpZiAoX2hhID09PSAncmlnaHQnKSB7XG4gICAgICAgIF9seCArPSBfbHcyO1xuICAgICAgfVxuICAgICAgdmFyIF9sYWJlbEludGVyc2VjdCA9IHBvbHlnb25JbnRlcnNlY3RMaW5lKHAyX2lbMF0sIHAyX2lbMV0sIFtfbHggLSBfbHcyLCBfbHkgLSBfbGgyLCBfbHggKyBfbHcyLCBfbHkgLSBfbGgyLCBfbHggKyBfbHcyLCBfbHkgKyBfbGgyLCBfbHggLSBfbHcyLCBfbHkgKyBfbGgyXSwgc3JjUG9zLngsIHNyY1Bvcy55KTtcbiAgICAgIGlmIChfbGFiZWxJbnRlcnNlY3QubGVuZ3RoID4gMCkge1xuICAgICAgICB2YXIgX3JlZlB0ID0gdGd0UG9zO1xuICAgICAgICB2YXIgX2ludFNxZGlzdCA9IHNxZGlzdChfcmVmUHQsIGFycmF5MnBvaW50KGludGVyc2VjdCkpO1xuICAgICAgICB2YXIgX2xhYkludFNxZGlzdCA9IHNxZGlzdChfcmVmUHQsIGFycmF5MnBvaW50KF9sYWJlbEludGVyc2VjdCkpO1xuICAgICAgICB2YXIgX21pblNxRGlzdCA9IF9pbnRTcWRpc3Q7XG4gICAgICAgIGlmIChfbGFiSW50U3FkaXN0IDwgX2ludFNxZGlzdCkge1xuICAgICAgICAgIGludGVyc2VjdCA9IFtfbGFiZWxJbnRlcnNlY3RbMF0sIF9sYWJlbEludGVyc2VjdFsxXV07XG4gICAgICAgICAgX21pblNxRGlzdCA9IF9sYWJJbnRTcWRpc3Q7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKF9sYWJlbEludGVyc2VjdC5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgdmFyIF9sYWJJbnQyU3FEaXN0ID0gc3FkaXN0KF9yZWZQdCwge1xuICAgICAgICAgICAgeDogX2xhYmVsSW50ZXJzZWN0WzJdLFxuICAgICAgICAgICAgeTogX2xhYmVsSW50ZXJzZWN0WzNdXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKF9sYWJJbnQyU3FEaXN0IDwgX21pblNxRGlzdCkge1xuICAgICAgICAgICAgaW50ZXJzZWN0ID0gW19sYWJlbEludGVyc2VjdFsyXSwgX2xhYmVsSW50ZXJzZWN0WzNdXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgdmFyIGFycm93U3RhcnQgPSBzaG9ydGVuSW50ZXJzZWN0aW9uKGludGVyc2VjdCwgcDIsIHIuYXJyb3dTaGFwZXNbc3JjQXJTaGFwZV0uc3BhY2luZyhlZGdlKSArIHNyY0Rpc3QpO1xuICB2YXIgZWRnZVN0YXJ0ID0gc2hvcnRlbkludGVyc2VjdGlvbihpbnRlcnNlY3QsIHAyLCByLmFycm93U2hhcGVzW3NyY0FyU2hhcGVdLmdhcChlZGdlKSArIHNyY0Rpc3QpO1xuICBycy5zdGFydFggPSBlZGdlU3RhcnRbMF07XG4gIHJzLnN0YXJ0WSA9IGVkZ2VTdGFydFsxXTtcbiAgcnMuYXJyb3dTdGFydFggPSBhcnJvd1N0YXJ0WzBdO1xuICBycy5hcnJvd1N0YXJ0WSA9IGFycm93U3RhcnRbMV07XG4gIGlmIChoYXNFbmRwdHMpIHtcbiAgICBpZiAoIW51bWJlciQxKHJzLnN0YXJ0WCkgfHwgIW51bWJlciQxKHJzLnN0YXJ0WSkgfHwgIW51bWJlciQxKHJzLmVuZFgpIHx8ICFudW1iZXIkMShycy5lbmRZKSkge1xuICAgICAgcnMuYmFkTGluZSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJzLmJhZExpbmUgPSBmYWxzZTtcbiAgICB9XG4gIH1cbn07XG5CUnAkYi5nZXRTb3VyY2VFbmRwb2ludCA9IGZ1bmN0aW9uIChlZGdlKSB7XG4gIHZhciBycyA9IGVkZ2VbMF0uX3ByaXZhdGUucnNjcmF0Y2g7XG4gIHRoaXMucmVjYWxjdWxhdGVSZW5kZXJlZFN0eWxlKGVkZ2UpO1xuICBzd2l0Y2ggKHJzLmVkZ2VUeXBlKSB7XG4gICAgY2FzZSAnaGF5c3RhY2snOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogcnMuaGF5c3RhY2tQdHNbMF0sXG4gICAgICAgIHk6IHJzLmhheXN0YWNrUHRzWzFdXG4gICAgICB9O1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4OiBycy5hcnJvd1N0YXJ0WCxcbiAgICAgICAgeTogcnMuYXJyb3dTdGFydFlcbiAgICAgIH07XG4gIH1cbn07XG5CUnAkYi5nZXRUYXJnZXRFbmRwb2ludCA9IGZ1bmN0aW9uIChlZGdlKSB7XG4gIHZhciBycyA9IGVkZ2VbMF0uX3ByaXZhdGUucnNjcmF0Y2g7XG4gIHRoaXMucmVjYWxjdWxhdGVSZW5kZXJlZFN0eWxlKGVkZ2UpO1xuICBzd2l0Y2ggKHJzLmVkZ2VUeXBlKSB7XG4gICAgY2FzZSAnaGF5c3RhY2snOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogcnMuaGF5c3RhY2tQdHNbMl0sXG4gICAgICAgIHk6IHJzLmhheXN0YWNrUHRzWzNdXG4gICAgICB9O1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4OiBycy5hcnJvd0VuZFgsXG4gICAgICAgIHk6IHJzLmFycm93RW5kWVxuICAgICAgfTtcbiAgfVxufTtcblxudmFyIEJScCRhID0ge307XG5mdW5jdGlvbiBwdXNoQmV6aWVyUHRzKHIsIGVkZ2UsIHB0cykge1xuICB2YXIgcWJlemllckF0JDEgPSBmdW5jdGlvbiBxYmV6aWVyQXQkMShwMSwgcDIsIHAzLCB0KSB7XG4gICAgcmV0dXJuIHFiZXppZXJBdChwMSwgcDIsIHAzLCB0KTtcbiAgfTtcbiAgdmFyIF9wID0gZWRnZS5fcHJpdmF0ZTtcbiAgdmFyIGJwdHMgPSBfcC5yc3R5bGUuYmV6aWVyUHRzO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHIuYmV6aWVyUHJvalBjdHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcCA9IHIuYmV6aWVyUHJvalBjdHNbaV07XG4gICAgYnB0cy5wdXNoKHtcbiAgICAgIHg6IHFiZXppZXJBdCQxKHB0c1swXSwgcHRzWzJdLCBwdHNbNF0sIHApLFxuICAgICAgeTogcWJlemllckF0JDEocHRzWzFdLCBwdHNbM10sIHB0c1s1XSwgcClcbiAgICB9KTtcbiAgfVxufVxuQlJwJGEuc3RvcmVFZGdlUHJvamVjdGlvbnMgPSBmdW5jdGlvbiAoZWRnZSkge1xuICB2YXIgX3AgPSBlZGdlLl9wcml2YXRlO1xuICB2YXIgcnMgPSBfcC5yc2NyYXRjaDtcbiAgdmFyIGV0ID0gcnMuZWRnZVR5cGU7XG5cbiAgLy8gY2xlYXIgdGhlIGNhY2hlZCBwb2ludHMgc3RhdGVcbiAgX3AucnN0eWxlLmJlemllclB0cyA9IG51bGw7XG4gIF9wLnJzdHlsZS5saW5lUHRzID0gbnVsbDtcbiAgX3AucnN0eWxlLmhheXN0YWNrUHRzID0gbnVsbDtcbiAgaWYgKGV0ID09PSAnbXVsdGliZXppZXInIHx8IGV0ID09PSAnYmV6aWVyJyB8fCBldCA9PT0gJ3NlbGYnIHx8IGV0ID09PSAnY29tcG91bmQnKSB7XG4gICAgX3AucnN0eWxlLmJlemllclB0cyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpICsgNSA8IHJzLmFsbHB0cy5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgcHVzaEJlemllclB0cyh0aGlzLCBlZGdlLCBycy5hbGxwdHMuc2xpY2UoaSwgaSArIDYpKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoZXQgPT09ICdzZWdtZW50cycpIHtcbiAgICB2YXIgbHB0cyA9IF9wLnJzdHlsZS5saW5lUHRzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgKyAxIDwgcnMuYWxscHRzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICBscHRzLnB1c2goe1xuICAgICAgICB4OiBycy5hbGxwdHNbaV0sXG4gICAgICAgIHk6IHJzLmFsbHB0c1tpICsgMV1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIGlmIChldCA9PT0gJ2hheXN0YWNrJykge1xuICAgIHZhciBocHRzID0gcnMuaGF5c3RhY2tQdHM7XG4gICAgX3AucnN0eWxlLmhheXN0YWNrUHRzID0gW3tcbiAgICAgIHg6IGhwdHNbMF0sXG4gICAgICB5OiBocHRzWzFdXG4gICAgfSwge1xuICAgICAgeDogaHB0c1syXSxcbiAgICAgIHk6IGhwdHNbM11cbiAgICB9XTtcbiAgfVxuICBfcC5yc3R5bGUuYXJyb3dXaWR0aCA9IHRoaXMuZ2V0QXJyb3dXaWR0aChlZGdlLnBzdHlsZSgnd2lkdGgnKS5wZlZhbHVlLCBlZGdlLnBzdHlsZSgnYXJyb3ctc2NhbGUnKS52YWx1ZSkgKiB0aGlzLmFycm93U2hhcGVXaWR0aDtcbn07XG5CUnAkYS5yZWNhbGN1bGF0ZUVkZ2VQcm9qZWN0aW9ucyA9IGZ1bmN0aW9uIChlZGdlcykge1xuICB0aGlzLmZpbmRFZGdlQ29udHJvbFBvaW50cyhlZGdlcyk7XG59O1xuXG52YXIgQlJwJDkgPSB7fTtcbkJScCQ5LnJlY2FsY3VsYXRlTm9kZUxhYmVsUHJvamVjdGlvbiA9IGZ1bmN0aW9uIChub2RlKSB7XG4gIHZhciBjb250ZW50ID0gbm9kZS5wc3R5bGUoJ2xhYmVsJykuc3RyVmFsdWU7XG4gIGlmIChlbXB0eVN0cmluZyhjb250ZW50KSkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgdGV4dFgsIHRleHRZO1xuICB2YXIgX3AgPSBub2RlLl9wcml2YXRlO1xuICB2YXIgbm9kZVdpZHRoID0gbm9kZS53aWR0aCgpO1xuICB2YXIgbm9kZUhlaWdodCA9IG5vZGUuaGVpZ2h0KCk7XG4gIHZhciBwYWRkaW5nID0gbm9kZS5wYWRkaW5nKCk7XG4gIHZhciBub2RlUG9zID0gbm9kZS5wb3NpdGlvbigpO1xuICB2YXIgdGV4dEhhbGlnbiA9IG5vZGUucHN0eWxlKCd0ZXh0LWhhbGlnbicpLnN0clZhbHVlO1xuICB2YXIgdGV4dFZhbGlnbiA9IG5vZGUucHN0eWxlKCd0ZXh0LXZhbGlnbicpLnN0clZhbHVlO1xuICB2YXIgcnMgPSBfcC5yc2NyYXRjaDtcbiAgdmFyIHJzdHlsZSA9IF9wLnJzdHlsZTtcbiAgc3dpdGNoICh0ZXh0SGFsaWduKSB7XG4gICAgY2FzZSAnbGVmdCc6XG4gICAgICB0ZXh0WCA9IG5vZGVQb3MueCAtIG5vZGVXaWR0aCAvIDIgLSBwYWRkaW5nO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnbGVmdC1pbnNpZGUnOlxuICAgICAgdGV4dFggPSBub2RlUG9zLnggLSBub2RlV2lkdGggLyAyICsgcGFkZGluZztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgIHRleHRYID0gbm9kZVBvcy54ICsgbm9kZVdpZHRoIC8gMiArIHBhZGRpbmc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdyaWdodC1pbnNpZGUnOlxuICAgICAgdGV4dFggPSBub2RlUG9zLnggKyBub2RlV2lkdGggLyAyIC0gcGFkZGluZztcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBlLmcuIGNlbnRlclxuICAgICAgdGV4dFggPSBub2RlUG9zLng7XG4gIH1cbiAgc3dpdGNoICh0ZXh0VmFsaWduKSB7XG4gICAgY2FzZSAndG9wJzpcbiAgICAgIHRleHRZID0gbm9kZVBvcy55IC0gbm9kZUhlaWdodCAvIDIgLSBwYWRkaW5nO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndG9wLWluc2lkZSc6XG4gICAgICB0ZXh0WSA9IG5vZGVQb3MueSAtIG5vZGVIZWlnaHQgLyAyICsgcGFkZGluZztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICB0ZXh0WSA9IG5vZGVQb3MueSArIG5vZGVIZWlnaHQgLyAyICsgcGFkZGluZztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2JvdHRvbS1pbnNpZGUnOlxuICAgICAgdGV4dFkgPSBub2RlUG9zLnkgKyBub2RlSGVpZ2h0IC8gMiAtIHBhZGRpbmc7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgLy8gZS5nLiBtaWRkbGVcbiAgICAgIHRleHRZID0gbm9kZVBvcy55O1xuICB9XG4gIHJzLmxhYmVsWCA9IHRleHRYO1xuICBycy5sYWJlbFkgPSB0ZXh0WTtcbiAgcnN0eWxlLmxhYmVsWCA9IHRleHRYO1xuICByc3R5bGUubGFiZWxZID0gdGV4dFk7XG4gIHRoaXMuY2FsY3VsYXRlTGFiZWxBbmdsZXMobm9kZSk7XG4gIHRoaXMuYXBwbHlMYWJlbERpbWVuc2lvbnMobm9kZSk7XG59O1xudmFyIGxpbmVBbmdsZUZyb21EZWx0YSA9IGZ1bmN0aW9uIGxpbmVBbmdsZUZyb21EZWx0YShkeCwgZHkpIHtcbiAgdmFyIGFuZ2xlID0gTWF0aC5hdGFuKGR5IC8gZHgpO1xuICBpZiAoZHggPT09IDAgJiYgYW5nbGUgPCAwKSB7XG4gICAgYW5nbGUgPSBhbmdsZSAqIC0xO1xuICB9XG4gIHJldHVybiBhbmdsZTtcbn07XG52YXIgbGluZUFuZ2xlID0gZnVuY3Rpb24gbGluZUFuZ2xlKHAwLCBwMSkge1xuICB2YXIgZHggPSBwMS54IC0gcDAueDtcbiAgdmFyIGR5ID0gcDEueSAtIHAwLnk7XG4gIHJldHVybiBsaW5lQW5nbGVGcm9tRGVsdGEoZHgsIGR5KTtcbn07XG52YXIgYmV6aWVyQW5nbGUgPSBmdW5jdGlvbiBiZXppZXJBbmdsZShwMCwgcDEsIHAyLCB0KSB7XG4gIHZhciB0MCA9IGJvdW5kKDAsIHQgLSAwLjAwMSwgMSk7XG4gIHZhciB0MSA9IGJvdW5kKDAsIHQgKyAwLjAwMSwgMSk7XG4gIHZhciBscDAgPSBxYmV6aWVyUHRBdChwMCwgcDEsIHAyLCB0MCk7XG4gIHZhciBscDEgPSBxYmV6aWVyUHRBdChwMCwgcDEsIHAyLCB0MSk7XG4gIHJldHVybiBsaW5lQW5nbGUobHAwLCBscDEpO1xufTtcbkJScCQ5LnJlY2FsY3VsYXRlRWRnZUxhYmVsUHJvamVjdGlvbnMgPSBmdW5jdGlvbiAoZWRnZSkge1xuICB2YXIgcDtcbiAgdmFyIF9wID0gZWRnZS5fcHJpdmF0ZTtcbiAgdmFyIHJzID0gX3AucnNjcmF0Y2g7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIGNvbnRlbnQgPSB7XG4gICAgbWlkOiBlZGdlLnBzdHlsZSgnbGFiZWwnKS5zdHJWYWx1ZSxcbiAgICBzb3VyY2U6IGVkZ2UucHN0eWxlKCdzb3VyY2UtbGFiZWwnKS5zdHJWYWx1ZSxcbiAgICB0YXJnZXQ6IGVkZ2UucHN0eWxlKCd0YXJnZXQtbGFiZWwnKS5zdHJWYWx1ZVxuICB9O1xuICBpZiAoY29udGVudC5taWQgfHwgY29udGVudC5zb3VyY2UgfHwgY29udGVudC50YXJnZXQpIDsgZWxzZSB7XG4gICAgcmV0dXJuOyAvLyBubyBsYWJlbHMgPT4gbm8gY2FsY3NcbiAgfVxuXG4gIC8vIGFkZCBjZW50ZXIgcG9pbnQgdG8gc3R5bGUgc28gYm91bmRpbmcgYm94IGNhbGN1bGF0aW9ucyBjYW4gdXNlIGl0XG4gIC8vXG4gIHAgPSB7XG4gICAgeDogcnMubWlkWCxcbiAgICB5OiBycy5taWRZXG4gIH07XG4gIHZhciBzZXRScyA9IGZ1bmN0aW9uIHNldFJzKHByb3BOYW1lLCBwcmVmaXgsIHZhbHVlKSB7XG4gICAgc2V0UHJlZml4ZWRQcm9wZXJ0eShfcC5yc2NyYXRjaCwgcHJvcE5hbWUsIHByZWZpeCwgdmFsdWUpO1xuICAgIHNldFByZWZpeGVkUHJvcGVydHkoX3AucnN0eWxlLCBwcm9wTmFtZSwgcHJlZml4LCB2YWx1ZSk7XG4gIH07XG4gIHNldFJzKCdsYWJlbFgnLCBudWxsLCBwLngpO1xuICBzZXRScygnbGFiZWxZJywgbnVsbCwgcC55KTtcbiAgdmFyIG1pZEFuZ2xlID0gbGluZUFuZ2xlRnJvbURlbHRhKHJzLm1pZERpc3BYLCBycy5taWREaXNwWSk7XG4gIHNldFJzKCdsYWJlbEF1dG9BbmdsZScsIG51bGwsIG1pZEFuZ2xlKTtcbiAgdmFyIF9jcmVhdGVDb250cm9sUG9pbnRJbmZvID0gZnVuY3Rpb24gY3JlYXRlQ29udHJvbFBvaW50SW5mbygpIHtcbiAgICBpZiAoX2NyZWF0ZUNvbnRyb2xQb2ludEluZm8uY2FjaGUpIHtcbiAgICAgIHJldHVybiBfY3JlYXRlQ29udHJvbFBvaW50SW5mby5jYWNoZTtcbiAgICB9IC8vIHVzZSBjYWNoZSBzbyBvbmx5IDF4IHBlciBlZGdlXG5cbiAgICB2YXIgY3RybHB0cyA9IFtdO1xuXG4gICAgLy8gc3RvcmUgZWFjaCBjdHJscHQgaW5mbyBpbml0XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgKyA1IDwgcnMuYWxscHRzLmxlbmd0aDsgaSArPSA0KSB7XG4gICAgICB2YXIgcDAgPSB7XG4gICAgICAgIHg6IHJzLmFsbHB0c1tpXSxcbiAgICAgICAgeTogcnMuYWxscHRzW2kgKyAxXVxuICAgICAgfTtcbiAgICAgIHZhciBwMSA9IHtcbiAgICAgICAgeDogcnMuYWxscHRzW2kgKyAyXSxcbiAgICAgICAgeTogcnMuYWxscHRzW2kgKyAzXVxuICAgICAgfTsgLy8gY3RybHB0XG4gICAgICB2YXIgcDIgPSB7XG4gICAgICAgIHg6IHJzLmFsbHB0c1tpICsgNF0sXG4gICAgICAgIHk6IHJzLmFsbHB0c1tpICsgNV1cbiAgICAgIH07XG4gICAgICBjdHJscHRzLnB1c2goe1xuICAgICAgICBwMDogcDAsXG4gICAgICAgIHAxOiBwMSxcbiAgICAgICAgcDI6IHAyLFxuICAgICAgICBzdGFydERpc3Q6IDAsXG4gICAgICAgIGxlbmd0aDogMCxcbiAgICAgICAgc2VnbWVudHM6IFtdXG4gICAgICB9KTtcbiAgICB9XG4gICAgdmFyIGJwdHMgPSBfcC5yc3R5bGUuYmV6aWVyUHRzO1xuICAgIHZhciBuUHJvanMgPSByLmJlemllclByb2pQY3RzLmxlbmd0aDtcbiAgICBmdW5jdGlvbiBhZGRTZWdtZW50KGNwLCBwMCwgcDEsIHQwLCB0MSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGRpc3QocDAsIHAxKTtcbiAgICAgIHZhciBwcmV2U2VnbWVudCA9IGNwLnNlZ21lbnRzW2NwLnNlZ21lbnRzLmxlbmd0aCAtIDFdO1xuICAgICAgdmFyIHNlZ21lbnQgPSB7XG4gICAgICAgIHAwOiBwMCxcbiAgICAgICAgcDE6IHAxLFxuICAgICAgICB0MDogdDAsXG4gICAgICAgIHQxOiB0MSxcbiAgICAgICAgc3RhcnREaXN0OiBwcmV2U2VnbWVudCA/IHByZXZTZWdtZW50LnN0YXJ0RGlzdCArIHByZXZTZWdtZW50Lmxlbmd0aCA6IDAsXG4gICAgICAgIGxlbmd0aDogbGVuZ3RoXG4gICAgICB9O1xuICAgICAgY3Auc2VnbWVudHMucHVzaChzZWdtZW50KTtcbiAgICAgIGNwLmxlbmd0aCArPSBsZW5ndGg7XG4gICAgfVxuXG4gICAgLy8gdXBkYXRlIGVhY2ggY3RybHB0IHdpdGggc2VnbWVudCBpbmZvXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGN0cmxwdHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgY3AgPSBjdHJscHRzW19pXTtcbiAgICAgIHZhciBwcmV2Q3AgPSBjdHJscHRzW19pIC0gMV07XG4gICAgICBpZiAocHJldkNwKSB7XG4gICAgICAgIGNwLnN0YXJ0RGlzdCA9IHByZXZDcC5zdGFydERpc3QgKyBwcmV2Q3AubGVuZ3RoO1xuICAgICAgfVxuICAgICAgYWRkU2VnbWVudChjcCwgY3AucDAsIGJwdHNbX2kgKiBuUHJvanNdLCAwLCByLmJlemllclByb2pQY3RzWzBdKTsgLy8gZmlyc3RcblxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBuUHJvanMgLSAxOyBqKyspIHtcbiAgICAgICAgYWRkU2VnbWVudChjcCwgYnB0c1tfaSAqIG5Qcm9qcyArIGpdLCBicHRzW19pICogblByb2pzICsgaiArIDFdLCByLmJlemllclByb2pQY3RzW2pdLCByLmJlemllclByb2pQY3RzW2ogKyAxXSk7XG4gICAgICB9XG4gICAgICBhZGRTZWdtZW50KGNwLCBicHRzW19pICogblByb2pzICsgblByb2pzIC0gMV0sIGNwLnAyLCByLmJlemllclByb2pQY3RzW25Qcm9qcyAtIDFdLCAxKTsgLy8gbGFzdFxuICAgIH1cbiAgICByZXR1cm4gX2NyZWF0ZUNvbnRyb2xQb2ludEluZm8uY2FjaGUgPSBjdHJscHRzO1xuICB9O1xuICB2YXIgY2FsY3VsYXRlRW5kUHJvamVjdGlvbiA9IGZ1bmN0aW9uIGNhbGN1bGF0ZUVuZFByb2plY3Rpb24ocHJlZml4KSB7XG4gICAgdmFyIGFuZ2xlO1xuICAgIHZhciBpc1NyYyA9IHByZWZpeCA9PT0gJ3NvdXJjZSc7XG4gICAgaWYgKCFjb250ZW50W3ByZWZpeF0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIG9mZnNldCA9IGVkZ2UucHN0eWxlKHByZWZpeCArICctdGV4dC1vZmZzZXQnKS5wZlZhbHVlO1xuICAgIHN3aXRjaCAocnMuZWRnZVR5cGUpIHtcbiAgICAgIGNhc2UgJ3NlbGYnOlxuICAgICAgY2FzZSAnY29tcG91bmQnOlxuICAgICAgY2FzZSAnYmV6aWVyJzpcbiAgICAgIGNhc2UgJ211bHRpYmV6aWVyJzpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBjcHMgPSBfY3JlYXRlQ29udHJvbFBvaW50SW5mbygpO1xuICAgICAgICAgIHZhciBzZWxlY3RlZDtcbiAgICAgICAgICB2YXIgc3RhcnREaXN0ID0gMDtcbiAgICAgICAgICB2YXIgdG90YWxEaXN0ID0gMDtcblxuICAgICAgICAgIC8vIGZpbmQgdGhlIHNlZ21lbnQgd2UncmUgb25cbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIF9jcCA9IGNwc1tpc1NyYyA/IGkgOiBjcHMubGVuZ3RoIC0gMSAtIGldO1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBfY3Auc2VnbWVudHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgdmFyIF9zZWcgPSBfY3Auc2VnbWVudHNbaXNTcmMgPyBqIDogX2NwLnNlZ21lbnRzLmxlbmd0aCAtIDEgLSBqXTtcbiAgICAgICAgICAgICAgdmFyIGxhc3RTZWcgPSBpID09PSBjcHMubGVuZ3RoIC0gMSAmJiBqID09PSBfY3Auc2VnbWVudHMubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgc3RhcnREaXN0ID0gdG90YWxEaXN0O1xuICAgICAgICAgICAgICB0b3RhbERpc3QgKz0gX3NlZy5sZW5ndGg7XG4gICAgICAgICAgICAgIGlmICh0b3RhbERpc3QgPj0gb2Zmc2V0IHx8IGxhc3RTZWcpIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZCA9IHtcbiAgICAgICAgICAgICAgICAgIGNwOiBfY3AsXG4gICAgICAgICAgICAgICAgICBzZWdtZW50OiBfc2VnXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgY3AgPSBzZWxlY3RlZC5jcDtcbiAgICAgICAgICB2YXIgc2VnID0gc2VsZWN0ZWQuc2VnbWVudDtcbiAgICAgICAgICB2YXIgdFNlZ21lbnQgPSAob2Zmc2V0IC0gc3RhcnREaXN0KSAvIHNlZy5sZW5ndGg7XG4gICAgICAgICAgdmFyIHNlZ0R0ID0gc2VnLnQxIC0gc2VnLnQwO1xuICAgICAgICAgIHZhciB0ID0gaXNTcmMgPyBzZWcudDAgKyBzZWdEdCAqIHRTZWdtZW50IDogc2VnLnQxIC0gc2VnRHQgKiB0U2VnbWVudDtcbiAgICAgICAgICB0ID0gYm91bmQoMCwgdCwgMSk7XG4gICAgICAgICAgcCA9IHFiZXppZXJQdEF0KGNwLnAwLCBjcC5wMSwgY3AucDIsIHQpO1xuICAgICAgICAgIGFuZ2xlID0gYmV6aWVyQW5nbGUoY3AucDAsIGNwLnAxLCBjcC5wMiwgdCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgJ3N0cmFpZ2h0JzpcbiAgICAgIGNhc2UgJ3NlZ21lbnRzJzpcbiAgICAgIGNhc2UgJ2hheXN0YWNrJzpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBkID0gMCxcbiAgICAgICAgICAgIGRpLFxuICAgICAgICAgICAgZDA7XG4gICAgICAgICAgdmFyIHAwLCBwMTtcbiAgICAgICAgICB2YXIgbCA9IHJzLmFsbHB0cy5sZW5ndGg7XG4gICAgICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyICsgMyA8IGw7IF9pMiArPSAyKSB7XG4gICAgICAgICAgICBpZiAoaXNTcmMpIHtcbiAgICAgICAgICAgICAgcDAgPSB7XG4gICAgICAgICAgICAgICAgeDogcnMuYWxscHRzW19pMl0sXG4gICAgICAgICAgICAgICAgeTogcnMuYWxscHRzW19pMiArIDFdXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIHAxID0ge1xuICAgICAgICAgICAgICAgIHg6IHJzLmFsbHB0c1tfaTIgKyAyXSxcbiAgICAgICAgICAgICAgICB5OiBycy5hbGxwdHNbX2kyICsgM11cbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHAwID0ge1xuICAgICAgICAgICAgICAgIHg6IHJzLmFsbHB0c1tsIC0gMiAtIF9pMl0sXG4gICAgICAgICAgICAgICAgeTogcnMuYWxscHRzW2wgLSAxIC0gX2kyXVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBwMSA9IHtcbiAgICAgICAgICAgICAgICB4OiBycy5hbGxwdHNbbCAtIDQgLSBfaTJdLFxuICAgICAgICAgICAgICAgIHk6IHJzLmFsbHB0c1tsIC0gMyAtIF9pMl1cbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRpID0gZGlzdChwMCwgcDEpO1xuICAgICAgICAgICAgZDAgPSBkO1xuICAgICAgICAgICAgZCArPSBkaTtcbiAgICAgICAgICAgIGlmIChkID49IG9mZnNldCkge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIHBEID0gb2Zmc2V0IC0gZDA7XG4gICAgICAgICAgdmFyIF90ID0gcEQgLyBkaTtcbiAgICAgICAgICBfdCA9IGJvdW5kKDAsIF90LCAxKTtcbiAgICAgICAgICBwID0gbGluZUF0KHAwLCBwMSwgX3QpO1xuICAgICAgICAgIGFuZ2xlID0gbGluZUFuZ2xlKHAwLCBwMSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2V0UnMoJ2xhYmVsWCcsIHByZWZpeCwgcC54KTtcbiAgICBzZXRScygnbGFiZWxZJywgcHJlZml4LCBwLnkpO1xuICAgIHNldFJzKCdsYWJlbEF1dG9BbmdsZScsIHByZWZpeCwgYW5nbGUpO1xuICB9O1xuICBjYWxjdWxhdGVFbmRQcm9qZWN0aW9uKCdzb3VyY2UnKTtcbiAgY2FsY3VsYXRlRW5kUHJvamVjdGlvbigndGFyZ2V0Jyk7XG4gIHRoaXMuYXBwbHlMYWJlbERpbWVuc2lvbnMoZWRnZSk7XG59O1xuQlJwJDkuYXBwbHlMYWJlbERpbWVuc2lvbnMgPSBmdW5jdGlvbiAoZWxlKSB7XG4gIHRoaXMuYXBwbHlQcmVmaXhlZExhYmVsRGltZW5zaW9ucyhlbGUpO1xuICBpZiAoZWxlLmlzRWRnZSgpKSB7XG4gICAgdGhpcy5hcHBseVByZWZpeGVkTGFiZWxEaW1lbnNpb25zKGVsZSwgJ3NvdXJjZScpO1xuICAgIHRoaXMuYXBwbHlQcmVmaXhlZExhYmVsRGltZW5zaW9ucyhlbGUsICd0YXJnZXQnKTtcbiAgfVxufTtcbkJScCQ5LmFwcGx5UHJlZml4ZWRMYWJlbERpbWVuc2lvbnMgPSBmdW5jdGlvbiAoZWxlLCBwcmVmaXgpIHtcbiAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICB2YXIgdGV4dCA9IHRoaXMuZ2V0TGFiZWxUZXh0KGVsZSwgcHJlZml4KTtcbiAgdmFyIGNhY2hlS2V5ID0gaGFzaFN0cmluZyh0ZXh0LCBlbGUuX3ByaXZhdGUubGFiZWxEaW1zS2V5KTtcblxuICAvLyBzYXZlIHJlY2FsYyBpZiB0aGUgbGFiZWwgaXMgdGhlIHNhbWUgYXMgYmVmb3JlXG4gIGlmIChnZXRQcmVmaXhlZFByb3BlcnR5KF9wLnJzY3JhdGNoLCAncHJlZml4ZWRMYWJlbERpbXNLZXknLCBwcmVmaXgpID09PSBjYWNoZUtleSkge1xuICAgIHJldHVybjsgLy8gdGhlbiB0aGUgbGFiZWwgZGltZW5zaW9ucyArIHRleHQgYXJlIHRoZSBzYW1lXG4gIH1cblxuICAvLyBzYXZlIHRoZSBrZXlcbiAgc2V0UHJlZml4ZWRQcm9wZXJ0eShfcC5yc2NyYXRjaCwgJ3ByZWZpeGVkTGFiZWxEaW1zS2V5JywgcHJlZml4LCBjYWNoZUtleSk7XG4gIHZhciBsYWJlbERpbXMgPSB0aGlzLmNhbGN1bGF0ZUxhYmVsRGltZW5zaW9ucyhlbGUsIHRleHQpO1xuICB2YXIgbGluZUhlaWdodCA9IGVsZS5wc3R5bGUoJ2xpbmUtaGVpZ2h0JykucGZWYWx1ZTtcbiAgdmFyIHNpemUgPSBlbGUucHN0eWxlKCdmb250LXNpemUnKS5wZlZhbHVlO1xuICB2YXIgdGV4dFdyYXAgPSBlbGUucHN0eWxlKCd0ZXh0LXdyYXAnKS5zdHJWYWx1ZTtcbiAgdmFyIGxpbmVzID0gZ2V0UHJlZml4ZWRQcm9wZXJ0eShfcC5yc2NyYXRjaCwgJ2xhYmVsV3JhcENhY2hlZExpbmVzJywgcHJlZml4KSB8fCBbXTtcbiAgdmFyIG51bUxpbmVzID0gdGV4dFdyYXAgIT09ICd3cmFwJyA/IDEgOiBNYXRoLm1heChsaW5lcy5sZW5ndGgsIDEpO1xuICB2YXIgbGFiZWxMaW5lSGVpZ2h0ID0gc2l6ZSAqIGxpbmVIZWlnaHQ7XG4gIHZhciB3aWR0aCA9IGxhYmVsRGltcy53aWR0aDtcbiAgdmFyIGhlaWdodCA9IGxhYmVsRGltcy5oZWlnaHQgKyAobnVtTGluZXMgLSAxKSAqIChsaW5lSGVpZ2h0IC0gMSkgKiBzaXplO1xuICBzZXRQcmVmaXhlZFByb3BlcnR5KF9wLnJzdHlsZSwgJ2xhYmVsV2lkdGgnLCBwcmVmaXgsIHdpZHRoKTtcbiAgc2V0UHJlZml4ZWRQcm9wZXJ0eShfcC5yc2NyYXRjaCwgJ2xhYmVsV2lkdGgnLCBwcmVmaXgsIHdpZHRoKTtcbiAgc2V0UHJlZml4ZWRQcm9wZXJ0eShfcC5yc3R5bGUsICdsYWJlbEhlaWdodCcsIHByZWZpeCwgaGVpZ2h0KTtcbiAgc2V0UHJlZml4ZWRQcm9wZXJ0eShfcC5yc2NyYXRjaCwgJ2xhYmVsSGVpZ2h0JywgcHJlZml4LCBoZWlnaHQpO1xuICBzZXRQcmVmaXhlZFByb3BlcnR5KF9wLnJzY3JhdGNoLCAnbGFiZWxMaW5lSGVpZ2h0JywgcHJlZml4LCBsYWJlbExpbmVIZWlnaHQpO1xuICBzZXRQcmVmaXhlZFByb3BlcnR5KF9wLnJzY3JhdGNoLCAnbGFiZWxBY3R1YWxEZXNjZW50JywgcHJlZml4LCBsYWJlbERpbXMubGFiZWxBY3R1YWxEZXNjZW50KTtcbn07XG5CUnAkOS5nZXRMYWJlbFRleHQgPSBmdW5jdGlvbiAoZWxlLCBwcmVmaXgpIHtcbiAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICB2YXIgcGZkID0gcHJlZml4ID8gcHJlZml4ICsgJy0nIDogJyc7XG4gIHZhciB0ZXh0ID0gZWxlLnBzdHlsZShwZmQgKyAnbGFiZWwnKS5zdHJWYWx1ZTtcbiAgdmFyIHRleHRUcmFuc2Zvcm0gPSBlbGUucHN0eWxlKCd0ZXh0LXRyYW5zZm9ybScpLnZhbHVlO1xuICB2YXIgcnNjcmF0Y2ggPSBmdW5jdGlvbiByc2NyYXRjaChwcm9wTmFtZSwgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHNldFByZWZpeGVkUHJvcGVydHkoX3AucnNjcmF0Y2gsIHByb3BOYW1lLCBwcmVmaXgsIHZhbHVlKTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGdldFByZWZpeGVkUHJvcGVydHkoX3AucnNjcmF0Y2gsIHByb3BOYW1lLCBwcmVmaXgpO1xuICAgIH1cbiAgfTtcblxuICAvLyBmb3IgZW1wdHkgdGV4dCwgc2tpcCBhbGwgcHJvY2Vzc2luZ1xuICBpZiAoIXRleHQpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgaWYgKHRleHRUcmFuc2Zvcm0gPT0gJ25vbmUnKSA7IGVsc2UgaWYgKHRleHRUcmFuc2Zvcm0gPT0gJ3VwcGVyY2FzZScpIHtcbiAgICB0ZXh0ID0gdGV4dC50b1VwcGVyQ2FzZSgpO1xuICB9IGVsc2UgaWYgKHRleHRUcmFuc2Zvcm0gPT0gJ2xvd2VyY2FzZScpIHtcbiAgICB0ZXh0ID0gdGV4dC50b0xvd2VyQ2FzZSgpO1xuICB9XG4gIHZhciB3cmFwU3R5bGUgPSBlbGUucHN0eWxlKCd0ZXh0LXdyYXAnKS52YWx1ZTtcbiAgaWYgKHdyYXBTdHlsZSA9PT0gJ3dyYXAnKSB7XG4gICAgdmFyIGxhYmVsS2V5ID0gcnNjcmF0Y2goJ2xhYmVsS2V5Jyk7XG5cbiAgICAvLyBzYXZlIHJlY2FsYyBpZiB0aGUgbGFiZWwgaXMgdGhlIHNhbWUgYXMgYmVmb3JlXG4gICAgaWYgKGxhYmVsS2V5ICE9IG51bGwgJiYgcnNjcmF0Y2goJ2xhYmVsV3JhcEtleScpID09PSBsYWJlbEtleSkge1xuICAgICAgcmV0dXJuIHJzY3JhdGNoKCdsYWJlbFdyYXBDYWNoZWRUZXh0Jyk7XG4gICAgfVxuICAgIHZhciB6d3NwID0gXCJcXHUyMDBCXCI7XG4gICAgdmFyIGxpbmVzID0gdGV4dC5zcGxpdCgnXFxuJyk7XG4gICAgdmFyIG1heFcgPSBlbGUucHN0eWxlKCd0ZXh0LW1heC13aWR0aCcpLnBmVmFsdWU7XG4gICAgdmFyIG92ZXJmbG93ID0gZWxlLnBzdHlsZSgndGV4dC1vdmVyZmxvdy13cmFwJykudmFsdWU7XG4gICAgdmFyIG92ZXJmbG93QW55ID0gb3ZlcmZsb3cgPT09ICdhbnl3aGVyZSc7XG4gICAgdmFyIHdyYXBwZWRMaW5lcyA9IFtdO1xuICAgIHZhciBzZXBhcmF0b3JSZWdleCA9IC9bXFxzXFx1MjAwYl0rfCQvZzsgLy8gSW5jbHVkZSBlbmQgb2Ygc3RyaW5nIHRvIGFkZCBsYXN0IHdvcmRcblxuICAgIGZvciAodmFyIGwgPSAwOyBsIDwgbGluZXMubGVuZ3RoOyBsKyspIHtcbiAgICAgIHZhciBsaW5lID0gbGluZXNbbF07XG4gICAgICB2YXIgbGluZURpbXMgPSB0aGlzLmNhbGN1bGF0ZUxhYmVsRGltZW5zaW9ucyhlbGUsIGxpbmUpO1xuICAgICAgdmFyIGxpbmVXID0gbGluZURpbXMud2lkdGg7XG4gICAgICBpZiAob3ZlcmZsb3dBbnkpIHtcbiAgICAgICAgdmFyIHByb2Nlc3NlZExpbmUgPSBsaW5lLnNwbGl0KCcnKS5qb2luKHp3c3ApO1xuICAgICAgICBsaW5lID0gcHJvY2Vzc2VkTGluZTtcbiAgICAgIH1cbiAgICAgIGlmIChsaW5lVyA+IG1heFcpIHtcbiAgICAgICAgLy8gbGluZSBpcyB0b28gbG9uZ1xuICAgICAgICB2YXIgc2VwYXJhdG9yTWF0Y2hlcyA9IGxpbmUubWF0Y2hBbGwoc2VwYXJhdG9yUmVnZXgpO1xuICAgICAgICB2YXIgc3VibGluZSA9ICcnO1xuICAgICAgICB2YXIgcHJldmlvdXNJbmRleCA9IDA7XG4gICAgICAgIC8vIEFkZCBmYWtlIG1hdGNoXG4gICAgICAgIHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihzZXBhcmF0b3JNYXRjaGVzKSxcbiAgICAgICAgICBfc3RlcDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmb3IgKF9pdGVyYXRvci5zKCk7ICEoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lOykge1xuICAgICAgICAgICAgdmFyIHNlcGFyYXRvck1hdGNoID0gX3N0ZXAudmFsdWU7XG4gICAgICAgICAgICB2YXIgd29yZFNlcGFyYXRvciA9IHNlcGFyYXRvck1hdGNoWzBdO1xuICAgICAgICAgICAgdmFyIHdvcmQgPSBsaW5lLnN1YnN0cmluZyhwcmV2aW91c0luZGV4LCBzZXBhcmF0b3JNYXRjaC5pbmRleCk7XG4gICAgICAgICAgICBwcmV2aW91c0luZGV4ID0gc2VwYXJhdG9yTWF0Y2guaW5kZXggKyB3b3JkU2VwYXJhdG9yLmxlbmd0aDtcbiAgICAgICAgICAgIHZhciB0ZXN0TGluZSA9IHN1YmxpbmUubGVuZ3RoID09PSAwID8gd29yZCA6IHN1YmxpbmUgKyB3b3JkICsgd29yZFNlcGFyYXRvcjtcbiAgICAgICAgICAgIHZhciB0ZXN0RGltcyA9IHRoaXMuY2FsY3VsYXRlTGFiZWxEaW1lbnNpb25zKGVsZSwgdGVzdExpbmUpO1xuICAgICAgICAgICAgdmFyIHRlc3RXID0gdGVzdERpbXMud2lkdGg7XG4gICAgICAgICAgICBpZiAodGVzdFcgPD0gbWF4Vykge1xuICAgICAgICAgICAgICAvLyB3b3JkIGZpdHMgb24gY3VycmVudCBsaW5lXG4gICAgICAgICAgICAgIHN1YmxpbmUgKz0gd29yZCArIHdvcmRTZXBhcmF0b3I7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyB3b3JkIHN0YXJ0cyBuZXcgbGluZVxuICAgICAgICAgICAgICBpZiAoc3VibGluZSkge1xuICAgICAgICAgICAgICAgIHdyYXBwZWRMaW5lcy5wdXNoKHN1YmxpbmUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHN1YmxpbmUgPSB3b3JkICsgd29yZFNlcGFyYXRvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBpZiB0aGVyZSdzIHJlbWFpbmluZyB0ZXh0LCBwdXQgaXQgaW4gYSB3cmFwcGVkIGxpbmVcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgX2l0ZXJhdG9yLmUoZXJyKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBfaXRlcmF0b3IuZigpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc3VibGluZS5tYXRjaCgvXltcXHNcXHUyMDBiXSskLykpIHtcbiAgICAgICAgICB3cmFwcGVkTGluZXMucHVzaChzdWJsaW5lKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gbGluZSBpcyBhbHJlYWR5IHNob3J0IGVub3VnaFxuICAgICAgICB3cmFwcGVkTGluZXMucHVzaChsaW5lKTtcbiAgICAgIH1cbiAgICB9IC8vIGZvclxuXG4gICAgcnNjcmF0Y2goJ2xhYmVsV3JhcENhY2hlZExpbmVzJywgd3JhcHBlZExpbmVzKTtcbiAgICB0ZXh0ID0gcnNjcmF0Y2goJ2xhYmVsV3JhcENhY2hlZFRleHQnLCB3cmFwcGVkTGluZXMuam9pbignXFxuJykpO1xuICAgIHJzY3JhdGNoKCdsYWJlbFdyYXBLZXknLCBsYWJlbEtleSk7XG4gIH0gZWxzZSBpZiAod3JhcFN0eWxlID09PSAnZWxsaXBzaXMnKSB7XG4gICAgdmFyIF9tYXhXID0gZWxlLnBzdHlsZSgndGV4dC1tYXgtd2lkdGgnKS5wZlZhbHVlO1xuICAgIHZhciBlbGxpcHNpemVkID0gJyc7XG4gICAgdmFyIGVsbGlwc2lzID0gXCJcXHUyMDI2XCI7XG4gICAgdmFyIGluY0xhc3RDaCA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmNhbGN1bGF0ZUxhYmVsRGltZW5zaW9ucyhlbGUsIHRleHQpLndpZHRoIDwgX21heFcpIHtcbiAgICAgIC8vIHRoZSBsYWJlbCBhbHJlYWR5IGZpdHNcbiAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRleHQubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB3aWR0aFdpdGhOZXh0Q2ggPSB0aGlzLmNhbGN1bGF0ZUxhYmVsRGltZW5zaW9ucyhlbGUsIGVsbGlwc2l6ZWQgKyB0ZXh0W2ldICsgZWxsaXBzaXMpLndpZHRoO1xuICAgICAgaWYgKHdpZHRoV2l0aE5leHRDaCA+IF9tYXhXKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZWxsaXBzaXplZCArPSB0ZXh0W2ldO1xuICAgICAgaWYgKGkgPT09IHRleHQubGVuZ3RoIC0gMSkge1xuICAgICAgICBpbmNMYXN0Q2ggPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWluY0xhc3RDaCkge1xuICAgICAgZWxsaXBzaXplZCArPSBlbGxpcHNpcztcbiAgICB9XG4gICAgcmV0dXJuIGVsbGlwc2l6ZWQ7XG4gIH0gLy8gaWYgZWxsaXBzaXplXG5cbiAgcmV0dXJuIHRleHQ7XG59O1xuQlJwJDkuZ2V0TGFiZWxKdXN0aWZpY2F0aW9uID0gZnVuY3Rpb24gKGVsZSkge1xuICB2YXIganVzdGlmaWNhdGlvbiA9IGVsZS5wc3R5bGUoJ3RleHQtanVzdGlmaWNhdGlvbicpLnN0clZhbHVlO1xuICB2YXIgdGV4dEhhbGlnbiA9IGVsZS5wc3R5bGUoJ3RleHQtaGFsaWduJykuc3RyVmFsdWU7XG4gIGlmIChqdXN0aWZpY2F0aW9uID09PSAnYXV0bycpIHtcbiAgICBpZiAoZWxlLmlzTm9kZSgpKSB7XG4gICAgICByZXR1cm4gbGFiZWxKdXN0aWZpY2F0aW9uKHRleHRIYWxpZ24pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJ2NlbnRlcic7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBqdXN0aWZpY2F0aW9uO1xuICB9XG59O1xuQlJwJDkuY2FsY3VsYXRlTGFiZWxEaW1lbnNpb25zID0gZnVuY3Rpb24gKGVsZSwgdGV4dCkge1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBjb250YWluZXJXaW5kb3cgPSByLmN5LndpbmRvdygpO1xuICB2YXIgZG9jdW1lbnQgPSBjb250YWluZXJXaW5kb3cuZG9jdW1lbnQ7XG4gIHZhciBwYWRkaW5nID0gMDsgLy8gYWRkIHBhZGRpbmcgYXJvdW5kIHRleHQgZGltcywgYXMgdGhlIG1lYXN1cmVtZW50IGlzbid0IHRoYXQgYWNjdXJhdGVcbiAgdmFyIGZTdHlsZSA9IGVsZS5wc3R5bGUoJ2ZvbnQtc3R5bGUnKS5zdHJWYWx1ZTtcbiAgdmFyIHNpemUgPSBlbGUucHN0eWxlKCdmb250LXNpemUnKS5wZlZhbHVlO1xuICB2YXIgZmFtaWx5ID0gZWxlLnBzdHlsZSgnZm9udC1mYW1pbHknKS5zdHJWYWx1ZTtcbiAgdmFyIHdlaWdodCA9IGVsZS5wc3R5bGUoJ2ZvbnQtd2VpZ2h0Jykuc3RyVmFsdWU7XG4gIHZhciB0ZXh0TWV0cmljcyA9IGVsZS5wc3R5bGUoJ3RleHQtbWV0cmljcycpLnN0clZhbHVlIHx8ICdmb250JztcbiAgdmFyIGNhbnZhcyA9IHRoaXMubGFiZWxDYWxjQ2FudmFzO1xuICB2YXIgYzJkID0gdGhpcy5sYWJlbENhbGNDYW52YXNDb250ZXh0O1xuICBpZiAoIWNhbnZhcykge1xuICAgIGNhbnZhcyA9IHRoaXMubGFiZWxDYWxjQ2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgYzJkID0gdGhpcy5sYWJlbENhbGNDYW52YXNDb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgdmFyIGRzID0gY2FudmFzLnN0eWxlO1xuICAgIGRzLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICBkcy5sZWZ0ID0gJy05OTk5cHgnO1xuICAgIGRzLnRvcCA9ICctOTk5OXB4JztcbiAgICBkcy56SW5kZXggPSAnLTEnO1xuICAgIGRzLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICBkcy5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuICB9XG4gIGMyZC5mb250ID0gXCJcIi5jb25jYXQoZlN0eWxlLCBcIiBcIikuY29uY2F0KHdlaWdodCwgXCIgXCIpLmNvbmNhdChzaXplLCBcInB4IFwiKS5jb25jYXQoZmFtaWx5KTtcbiAgdmFyIHdpZHRoID0gMDtcbiAgdmFyIGhlaWdodCA9IDA7XG4gIHZhciBsaW5lcyA9IHRleHQuc3BsaXQoJ1xcbicpO1xuICB2YXIgbGluZUNvdW50ID0gbGluZXMubGVuZ3RoO1xuICB2YXIgbGFiZWxBY3R1YWxEZXNjZW50ID0gMDtcbiAgdmFyIGxhYmVsQWN0dWFsQXNjZW50ID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lQ291bnQ7IGkrKykge1xuICAgIHZhciBsaW5lID0gbGluZXNbaV07XG4gICAgdmFyIG1ldHJpY3MgPSBjMmQubWVhc3VyZVRleHQobGluZSk7XG4gICAgdmFyIHcgPSBNYXRoLmNlaWwobWV0cmljcy53aWR0aCk7XG4gICAgdmFyIGggPSBzaXplO1xuICAgIGlmICh0ZXh0TWV0cmljcyA9PT0gJ2dseXBoJykge1xuICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgbGFiZWxBY3R1YWxBc2NlbnQgPSBtZXRyaWNzLmFjdHVhbEJvdW5kaW5nQm94QXNjZW50O1xuICAgICAgfVxuICAgICAgaWYgKGkgPT09IGxpbmVDb3VudCAtIDEpIHtcbiAgICAgICAgbGFiZWxBY3R1YWxEZXNjZW50ID0gbWV0cmljcy5hY3R1YWxCb3VuZGluZ0JveERlc2NlbnQ7XG4gICAgICB9XG4gICAgfVxuICAgIHdpZHRoID0gTWF0aC5tYXgodywgd2lkdGgpO1xuICAgIGhlaWdodCArPSBoO1xuICB9XG4gIGlmICh0ZXh0TWV0cmljcyA9PT0gJ2dseXBoJykge1xuICAgIGhlaWdodCAtPSBzaXplIC0gbGFiZWxBY3R1YWxBc2NlbnQgLSBsYWJlbEFjdHVhbERlc2NlbnQ7XG4gIH1cbiAgd2lkdGggKz0gcGFkZGluZztcbiAgaGVpZ2h0ICs9IHBhZGRpbmc7XG4gIHJldHVybiB7XG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0LFxuICAgIGxhYmVsQWN0dWFsQXNjZW50OiBsYWJlbEFjdHVhbEFzY2VudCxcbiAgICBsYWJlbEFjdHVhbERlc2NlbnQ6IGxhYmVsQWN0dWFsRGVzY2VudFxuICB9O1xufTtcbkJScCQ5LmNhbGN1bGF0ZUxhYmVsQW5nbGUgPSBmdW5jdGlvbiAoZWxlLCBwcmVmaXgpIHtcbiAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICB2YXIgcnMgPSBfcC5yc2NyYXRjaDtcbiAgdmFyIGlzRWRnZSA9IGVsZS5pc0VkZ2UoKTtcbiAgdmFyIHByZWZpeERhc2ggPSBwcmVmaXggPyBwcmVmaXggKyAnLScgOiAnJztcbiAgdmFyIHJvdCA9IGVsZS5wc3R5bGUocHJlZml4RGFzaCArICd0ZXh0LXJvdGF0aW9uJyk7XG4gIHZhciByb3RTdHIgPSByb3Quc3RyVmFsdWU7XG4gIGlmIChyb3RTdHIgPT09ICdub25lJykge1xuICAgIHJldHVybiAwO1xuICB9IGVsc2UgaWYgKGlzRWRnZSAmJiByb3RTdHIgPT09ICdhdXRvcm90YXRlJykge1xuICAgIHJldHVybiBycy5sYWJlbEF1dG9BbmdsZTtcbiAgfSBlbHNlIGlmIChyb3RTdHIgPT09ICdhdXRvcm90YXRlJykge1xuICAgIHJldHVybiAwO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiByb3QucGZWYWx1ZTtcbiAgfVxufTtcbkJScCQ5LmNhbGN1bGF0ZUxhYmVsQW5nbGVzID0gZnVuY3Rpb24gKGVsZSkge1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBpc0VkZ2UgPSBlbGUuaXNFZGdlKCk7XG4gIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgdmFyIHJzID0gX3AucnNjcmF0Y2g7XG4gIHJzLmxhYmVsQW5nbGUgPSByLmNhbGN1bGF0ZUxhYmVsQW5nbGUoZWxlKTtcbiAgaWYgKGlzRWRnZSkge1xuICAgIHJzLnNvdXJjZUxhYmVsQW5nbGUgPSByLmNhbGN1bGF0ZUxhYmVsQW5nbGUoZWxlLCAnc291cmNlJyk7XG4gICAgcnMudGFyZ2V0TGFiZWxBbmdsZSA9IHIuY2FsY3VsYXRlTGFiZWxBbmdsZShlbGUsICd0YXJnZXQnKTtcbiAgfVxufTtcblxudmFyIEJScCQ4ID0ge307XG52YXIgVE9PX1NNQUxMX0NVVF9SRUNUID0gMjg7XG52YXIgd2FybmVkQ3V0UmVjdCA9IGZhbHNlO1xuQlJwJDguZ2V0Tm9kZVNoYXBlID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgc2hhcGUgPSBub2RlLnBzdHlsZSgnc2hhcGUnKS52YWx1ZTtcbiAgaWYgKHNoYXBlID09PSAnY3V0cmVjdGFuZ2xlJyAmJiAobm9kZS53aWR0aCgpIDwgVE9PX1NNQUxMX0NVVF9SRUNUIHx8IG5vZGUuaGVpZ2h0KCkgPCBUT09fU01BTExfQ1VUX1JFQ1QpKSB7XG4gICAgaWYgKCF3YXJuZWRDdXRSZWN0KSB7XG4gICAgICB3YXJuKCdUaGUgYGN1dHJlY3RhbmdsZWAgbm9kZSBzaGFwZSBjYW4gbm90IGJlIHVzZWQgYXQgc21hbGwgc2l6ZXMgc28gYHJlY3RhbmdsZWAgaXMgdXNlZCBpbnN0ZWFkJyk7XG4gICAgICB3YXJuZWRDdXRSZWN0ID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuICdyZWN0YW5nbGUnO1xuICB9XG4gIGlmIChub2RlLmlzUGFyZW50KCkpIHtcbiAgICBpZiAoc2hhcGUgPT09ICdyZWN0YW5nbGUnIHx8IHNoYXBlID09PSAncm91bmRyZWN0YW5nbGUnIHx8IHNoYXBlID09PSAncm91bmQtcmVjdGFuZ2xlJyB8fCBzaGFwZSA9PT0gJ2N1dHJlY3RhbmdsZScgfHwgc2hhcGUgPT09ICdjdXQtcmVjdGFuZ2xlJyB8fCBzaGFwZSA9PT0gJ2JhcnJlbCcpIHtcbiAgICAgIHJldHVybiBzaGFwZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICdyZWN0YW5nbGUnO1xuICAgIH1cbiAgfVxuICBpZiAoc2hhcGUgPT09ICdwb2x5Z29uJykge1xuICAgIHZhciBwb2ludHMgPSBub2RlLnBzdHlsZSgnc2hhcGUtcG9seWdvbi1wb2ludHMnKS52YWx1ZTtcbiAgICByZXR1cm4gci5ub2RlU2hhcGVzLm1ha2VQb2x5Z29uKHBvaW50cykubmFtZTtcbiAgfVxuICByZXR1cm4gc2hhcGU7XG59O1xuXG52YXIgQlJwJDcgPSB7fTtcbkJScCQ3LnJlZ2lzdGVyQ2FsY3VsYXRpb25MaXN0ZW5lcnMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBjeSA9IHRoaXMuY3k7XG4gIHZhciBlbGVzVG9VcGRhdGUgPSBjeS5jb2xsZWN0aW9uKCk7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIGVucXVldWUgPSBmdW5jdGlvbiBlbnF1ZXVlKGVsZXMpIHtcbiAgICB2YXIgZGlydHlTdHlsZUNhY2hlcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdHJ1ZTtcbiAgICBlbGVzVG9VcGRhdGUubWVyZ2UoZWxlcyk7XG4gICAgaWYgKGRpcnR5U3R5bGVDYWNoZXMpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICAgICAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICAgICAgICB2YXIgcnN0eWxlID0gX3AucnN0eWxlO1xuICAgICAgICByc3R5bGUuY2xlYW4gPSBmYWxzZTtcbiAgICAgICAgcnN0eWxlLmNsZWFuQ29ubmVjdGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICByLmJpbmRlcihjeSkub24oJ2JvdW5kcy4qIGRpcnR5LionLCBmdW5jdGlvbiBvbkRpcnR5Qm91bmRzKGUpIHtcbiAgICB2YXIgZWxlID0gZS50YXJnZXQ7XG4gICAgZW5xdWV1ZShlbGUpO1xuICB9KS5vbignc3R5bGUuKiBiYWNrZ3JvdW5kLionLCBmdW5jdGlvbiBvbkRpcnR5U3R5bGUoZSkge1xuICAgIHZhciBlbGUgPSBlLnRhcmdldDtcbiAgICBlbnF1ZXVlKGVsZSwgZmFsc2UpO1xuICB9KTtcbiAgdmFyIHVwZGF0ZUVsZUNhbGNzID0gZnVuY3Rpb24gdXBkYXRlRWxlQ2FsY3Mod2lsbERyYXcpIHtcbiAgICBpZiAod2lsbERyYXcpIHtcbiAgICAgIHZhciBmbnMgPSByLm9uVXBkYXRlRWxlQ2FsY3NGbnM7XG5cbiAgICAgIC8vIGJlY2F1c2Ugd2UgbmVlZCB0byBoYXZlIHVwLXRvLWRhdGUgc3R5bGUgKGUuZy4gc3R5bGVzaGVldCBtYXBwZXJzKVxuICAgICAgLy8gYmVmb3JlIGNhbGN1bGF0aW5nIHJlbmRlcmVkIHN0eWxlIChhbmQgcHN0eWxlIG1pZ2h0IG5vdCBiZSBjYWxsZWQgeWV0KVxuICAgICAgZWxlc1RvVXBkYXRlLmNsZWFuU3R5bGUoKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlc1RvVXBkYXRlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBlbGUgPSBlbGVzVG9VcGRhdGVbaV07XG4gICAgICAgIHZhciByc3R5bGUgPSBlbGUuX3ByaXZhdGUucnN0eWxlO1xuICAgICAgICBpZiAoZWxlLmlzTm9kZSgpICYmICFyc3R5bGUuY2xlYW5Db25uZWN0ZWQpIHtcbiAgICAgICAgICBlbnF1ZXVlKGVsZS5jb25uZWN0ZWRFZGdlcygpKTtcbiAgICAgICAgICByc3R5bGUuY2xlYW5Db25uZWN0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZm5zKSB7XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBmbnMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgdmFyIGZuID0gZm5zW19pXTtcbiAgICAgICAgICBmbih3aWxsRHJhdywgZWxlc1RvVXBkYXRlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgci5yZWNhbGN1bGF0ZVJlbmRlcmVkU3R5bGUoZWxlc1RvVXBkYXRlKTtcbiAgICAgIGVsZXNUb1VwZGF0ZSA9IGN5LmNvbGxlY3Rpb24oKTtcbiAgICB9XG4gIH07XG4gIHIuZmx1c2hSZW5kZXJlZFN0eWxlUXVldWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgdXBkYXRlRWxlQ2FsY3ModHJ1ZSk7XG4gIH07XG4gIHIuYmVmb3JlUmVuZGVyKHVwZGF0ZUVsZUNhbGNzLCByLmJlZm9yZVJlbmRlclByaW9yaXRpZXMuZWxlQ2FsY3MpO1xufTtcbkJScCQ3Lm9uVXBkYXRlRWxlQ2FsY3MgPSBmdW5jdGlvbiAoZm4pIHtcbiAgdmFyIGZucyA9IHRoaXMub25VcGRhdGVFbGVDYWxjc0ZucyA9IHRoaXMub25VcGRhdGVFbGVDYWxjc0ZucyB8fCBbXTtcbiAgZm5zLnB1c2goZm4pO1xufTtcbkJScCQ3LnJlY2FsY3VsYXRlUmVuZGVyZWRTdHlsZSA9IGZ1bmN0aW9uIChlbGVzLCB1c2VDYWNoZSkge1xuICB2YXIgaXNDbGVhbkNvbm5lY3RlZCA9IGZ1bmN0aW9uIGlzQ2xlYW5Db25uZWN0ZWQoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5fcHJpdmF0ZS5yc3R5bGUuY2xlYW5Db25uZWN0ZWQ7XG4gIH07XG4gIGlmIChlbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgZWRnZXMgPSBbXTtcbiAgdmFyIG5vZGVzID0gW107XG5cbiAgLy8gdGhlIHJlbmRlcmVyIGNhbid0IGJlIHVzZWQgZm9yIGNhbGNzIHdoZW4gZGVzdHJveWVkLCBlLmcuIGVsZS5ib3VuZGluZ0JveCgpXG4gIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIHVzZSBjYWNoZSBieSBkZWZhdWx0IGZvciBwZXJmXG4gIGlmICh1c2VDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdXNlQ2FjaGUgPSB0cnVlO1xuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgICB2YXIgcnN0eWxlID0gX3AucnN0eWxlO1xuXG4gICAgLy8gYW4gZWRnZSBtYXkgYmUgaW1wbGljaXRseSBkaXJ0eSBiL2Mgb2Ygb25lIG9mIGl0cyBjb25uZWN0ZWQgbm9kZXNcbiAgICAvLyAoYW5kIGEgcmVxdWVzdCBmb3IgcmVjYWxjIG1heSBjb21lIGluIGJldHdlZW4gZnJhbWVzKVxuICAgIGlmIChlbGUuaXNFZGdlKCkgJiYgKCFpc0NsZWFuQ29ubmVjdGVkKGVsZS5zb3VyY2UoKSkgfHwgIWlzQ2xlYW5Db25uZWN0ZWQoZWxlLnRhcmdldCgpKSkpIHtcbiAgICAgIHJzdHlsZS5jbGVhbiA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoZWxlLmlzRWRnZSgpICYmIGVsZS5pc0J1bmRsZWRCZXppZXIoKSkge1xuICAgICAgaWYgKGVsZS5wYXJhbGxlbEVkZ2VzKCkuc29tZShmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgIHJldHVybiAhZWxlLl9wcml2YXRlLnJzdHlsZS5jbGVhbiAmJiBlbGUuaXNCdW5kbGVkQmV6aWVyKCk7XG4gICAgICB9KSkge1xuICAgICAgICByc3R5bGUuY2xlYW4gPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBvbmx5IHVwZGF0ZSBpZiBkaXJ0eSBhbmQgaW4gZ3JhcGhcbiAgICBpZiAodXNlQ2FjaGUgJiYgcnN0eWxlLmNsZWFuIHx8IGVsZS5yZW1vdmVkKCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIG9ubHkgdXBkYXRlIGlmIG5vdCBkaXNwbGF5OiBub25lXG4gICAgaWYgKGVsZS5wc3R5bGUoJ2Rpc3BsYXknKS52YWx1ZSA9PT0gJ25vbmUnKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKF9wLmdyb3VwID09PSAnbm9kZXMnKSB7XG4gICAgICBub2Rlcy5wdXNoKGVsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGVkZ2VzXG4gICAgICBlZGdlcy5wdXNoKGVsZSk7XG4gICAgfVxuICAgIHJzdHlsZS5jbGVhbiA9IHRydWU7XG4gIH1cblxuICAvLyB1cGRhdGUgbm9kZSBkYXRhIGZyb20gcHJvamVjdGlvbnNcbiAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgbm9kZXMubGVuZ3RoOyBfaTIrKykge1xuICAgIHZhciBfZWxlID0gbm9kZXNbX2kyXTtcbiAgICB2YXIgX3AyID0gX2VsZS5fcHJpdmF0ZTtcbiAgICB2YXIgX3JzdHlsZSA9IF9wMi5yc3R5bGU7XG4gICAgdmFyIHBvcyA9IF9lbGUucG9zaXRpb24oKTtcbiAgICB0aGlzLnJlY2FsY3VsYXRlTm9kZUxhYmVsUHJvamVjdGlvbihfZWxlKTtcbiAgICBfcnN0eWxlLm5vZGVYID0gcG9zLng7XG4gICAgX3JzdHlsZS5ub2RlWSA9IHBvcy55O1xuICAgIF9yc3R5bGUubm9kZVcgPSBfZWxlLnBzdHlsZSgnd2lkdGgnKS5wZlZhbHVlO1xuICAgIF9yc3R5bGUubm9kZUggPSBfZWxlLnBzdHlsZSgnaGVpZ2h0JykucGZWYWx1ZTtcbiAgfVxuICB0aGlzLnJlY2FsY3VsYXRlRWRnZVByb2plY3Rpb25zKGVkZ2VzKTtcblxuICAvLyB1cGRhdGUgZWRnZSBkYXRhIGZyb20gcHJvamVjdGlvbnNcbiAgZm9yICh2YXIgX2kzID0gMDsgX2kzIDwgZWRnZXMubGVuZ3RoOyBfaTMrKykge1xuICAgIHZhciBfZWxlMiA9IGVkZ2VzW19pM107XG4gICAgdmFyIF9wMyA9IF9lbGUyLl9wcml2YXRlO1xuICAgIHZhciBfcnN0eWxlMiA9IF9wMy5yc3R5bGU7XG4gICAgdmFyIHJzID0gX3AzLnJzY3JhdGNoO1xuXG4gICAgLy8gdXBkYXRlIHJzdHlsZSBwb3NpdGlvbnNcbiAgICBfcnN0eWxlMi5zcmNYID0gcnMuYXJyb3dTdGFydFg7XG4gICAgX3JzdHlsZTIuc3JjWSA9IHJzLmFycm93U3RhcnRZO1xuICAgIF9yc3R5bGUyLnRndFggPSBycy5hcnJvd0VuZFg7XG4gICAgX3JzdHlsZTIudGd0WSA9IHJzLmFycm93RW5kWTtcbiAgICBfcnN0eWxlMi5taWRYID0gcnMubWlkWDtcbiAgICBfcnN0eWxlMi5taWRZID0gcnMubWlkWTtcbiAgICBfcnN0eWxlMi5sYWJlbEFuZ2xlID0gcnMubGFiZWxBbmdsZTtcbiAgICBfcnN0eWxlMi5zb3VyY2VMYWJlbEFuZ2xlID0gcnMuc291cmNlTGFiZWxBbmdsZTtcbiAgICBfcnN0eWxlMi50YXJnZXRMYWJlbEFuZ2xlID0gcnMudGFyZ2V0TGFiZWxBbmdsZTtcbiAgfVxufTtcblxudmFyIEJScCQ2ID0ge307XG5CUnAkNi51cGRhdGVDYWNoZWRHcmFiYmVkRWxlcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGVsZXMgPSB0aGlzLmNhY2hlZFpTb3J0ZWRFbGVzO1xuICBpZiAoIWVsZXMpIHtcbiAgICAvLyBqdXN0IGxldCB0aGlzIGJlIHJlY2FsY3VsYXRlZCBvbiB0aGUgbmV4dCB6IHNvcnQgdGlja1xuICAgIHJldHVybjtcbiAgfVxuICBlbGVzLmRyYWcgPSBbXTtcbiAgZWxlcy5ub25kcmFnID0gW107XG4gIHZhciBncmFiVGFyZ2V0cyA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICB2YXIgcnMgPSBlbGUuX3ByaXZhdGUucnNjcmF0Y2g7XG4gICAgaWYgKGVsZS5ncmFiYmVkKCkgJiYgIWVsZS5pc1BhcmVudCgpKSB7XG4gICAgICBncmFiVGFyZ2V0cy5wdXNoKGVsZSk7XG4gICAgfSBlbHNlIGlmIChycy5pbkRyYWdMYXllcikge1xuICAgICAgZWxlcy5kcmFnLnB1c2goZWxlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlcy5ub25kcmFnLnB1c2goZWxlKTtcbiAgICB9XG4gIH1cblxuICAvLyBwdXQgdGhlIGdyYWIgdGFyZ2V0IG5vZGVzIGxhc3Qgc28gaXQncyBvbiB0b3Agb2YgaXRzIG5laWdoYm91cmhvb2RcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBncmFiVGFyZ2V0cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbGUgPSBncmFiVGFyZ2V0c1tpXTtcbiAgICBlbGVzLmRyYWcucHVzaChlbGUpO1xuICB9XG59O1xuQlJwJDYuaW52YWxpZGF0ZUNhY2hlZFpTb3J0ZWRFbGVzID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmNhY2hlZFpTb3J0ZWRFbGVzID0gbnVsbDtcbn07XG5CUnAkNi5nZXRDYWNoZWRaU29ydGVkRWxlcyA9IGZ1bmN0aW9uIChmb3JjZVJlY2FsYykge1xuICBpZiAoZm9yY2VSZWNhbGMgfHwgIXRoaXMuY2FjaGVkWlNvcnRlZEVsZXMpIHtcbiAgICB2YXIgZWxlcyA9IHRoaXMuY3kubXV0YWJsZUVsZW1lbnRzKCkudG9BcnJheSgpO1xuICAgIGVsZXMuc29ydCh6SW5kZXhTb3J0KTtcbiAgICBlbGVzLmludGVyYWN0aXZlID0gZWxlcy5maWx0ZXIoZnVuY3Rpb24gKGVsZSkge1xuICAgICAgcmV0dXJuIGVsZS5pbnRlcmFjdGl2ZSgpO1xuICAgIH0pO1xuICAgIHRoaXMuY2FjaGVkWlNvcnRlZEVsZXMgPSBlbGVzO1xuICAgIHRoaXMudXBkYXRlQ2FjaGVkR3JhYmJlZEVsZXMoKTtcbiAgfSBlbHNlIHtcbiAgICBlbGVzID0gdGhpcy5jYWNoZWRaU29ydGVkRWxlcztcbiAgfVxuICByZXR1cm4gZWxlcztcbn07XG5cbnZhciBCUnAkNSA9IHt9O1xuW0JScCRlLCBCUnAkZCwgQlJwJGMsIEJScCRiLCBCUnAkYSwgQlJwJDksIEJScCQ4LCBCUnAkNywgQlJwJDZdLmZvckVhY2goZnVuY3Rpb24gKHByb3BzKSB7XG4gIGV4dGVuZChCUnAkNSwgcHJvcHMpO1xufSk7XG5cbnZhciBCUnAkNCA9IHt9O1xuQlJwJDQuZ2V0Q2FjaGVkSW1hZ2UgPSBmdW5jdGlvbiAodXJsLCBjcm9zc09yaWdpbiwgb25Mb2FkKSB7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIGltYWdlQ2FjaGUgPSByLmltYWdlQ2FjaGUgPSByLmltYWdlQ2FjaGUgfHwge307XG4gIHZhciBjYWNoZSA9IGltYWdlQ2FjaGVbdXJsXTtcbiAgaWYgKGNhY2hlKSB7XG4gICAgaWYgKCFjYWNoZS5pbWFnZS5jb21wbGV0ZSkge1xuICAgICAgY2FjaGUuaW1hZ2UuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIG9uTG9hZCk7XG4gICAgfVxuICAgIHJldHVybiBjYWNoZS5pbWFnZTtcbiAgfSBlbHNlIHtcbiAgICBjYWNoZSA9IGltYWdlQ2FjaGVbdXJsXSA9IGltYWdlQ2FjaGVbdXJsXSB8fCB7fTtcbiAgICB2YXIgaW1hZ2UgPSBjYWNoZS5pbWFnZSA9IG5ldyBJbWFnZSgpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG5cbiAgICBpbWFnZS5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgb25Mb2FkKTtcbiAgICBpbWFnZS5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGltYWdlLmVycm9yID0gdHJ1ZTtcbiAgICB9KTtcblxuICAgIC8vICMxNTgyIHNhZmFyaSBkb2Vzbid0IGxvYWQgZGF0YSB1cmlzIHdpdGggY3Jvc3NPcmlnaW4gcHJvcGVybHlcbiAgICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTIzOTc4XG4gICAgdmFyIGRhdGFVcmlQcmVmaXggPSAnZGF0YTonO1xuICAgIHZhciBpc0RhdGFVcmkgPSB1cmwuc3Vic3RyaW5nKDAsIGRhdGFVcmlQcmVmaXgubGVuZ3RoKS50b0xvd2VyQ2FzZSgpID09PSBkYXRhVXJpUHJlZml4O1xuICAgIGlmICghaXNEYXRhVXJpKSB7XG4gICAgICAvLyBpZiBjcm9zc29yaWdpbiBpcyAnbnVsbCcoc3RyaW5naWZpZWQpLCB0aGVuIG1hbnVhbGx5IHNldCBpdCB0byBudWxsIFxuICAgICAgY3Jvc3NPcmlnaW4gPSBjcm9zc09yaWdpbiA9PT0gJ251bGwnID8gbnVsbCA6IGNyb3NzT3JpZ2luO1xuICAgICAgaW1hZ2UuY3Jvc3NPcmlnaW4gPSBjcm9zc09yaWdpbjsgLy8gcHJldmVudCB0YWludGVkIGNhbnZhc1xuICAgIH1cbiAgICBpbWFnZS5zcmMgPSB1cmw7XG4gICAgcmV0dXJuIGltYWdlO1xuICB9XG59O1xuXG52YXIgc2V0R3JhYlN0YXRlID0gZnVuY3Rpb24gc2V0R3JhYlN0YXRlKGVsZSwgZ3JhYmJlZCkge1xuICB2YXIgZWxlMCA9IGVsZVswXTtcbiAgaWYgKCFlbGUwIHx8IGVsZTAuX3ByaXZhdGUuZ3JhYmJlZCA9PT0gZ3JhYmJlZCkge1xuICAgIHJldHVybjtcbiAgfVxuICBlbGUwLl9wcml2YXRlLmdyYWJiZWQgPSBncmFiYmVkO1xuICBlbGUudXBkYXRlU3R5bGUoZmFsc2UpO1xufTtcbnZhciBzZXRHcmFiYmVkID0gZnVuY3Rpb24gc2V0R3JhYmJlZChlbGUpIHtcbiAgc2V0R3JhYlN0YXRlKGVsZSwgdHJ1ZSk7XG59O1xudmFyIHNldEZyZWVkID0gZnVuY3Rpb24gc2V0RnJlZWQoZWxlKSB7XG4gIHNldEdyYWJTdGF0ZShlbGUsIGZhbHNlKTtcbn07XG5cbnZhciBCUnAkMyA9IHt9O1xuXG4vKiBnbG9iYWwgZG9jdW1lbnQsIFJlc2l6ZU9ic2VydmVyLCBNdXRhdGlvbk9ic2VydmVyICovXG5cbkJScCQzLnJlZ2lzdGVyQmluZGluZyA9IGZ1bmN0aW9uICh0YXJnZXQsIGV2ZW50LCBoYW5kbGVyLCB1c2VDYXB0dXJlKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYXJndW1lbnRzLCBbMV0pOyAvLyBjb3B5XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodGFyZ2V0KSkge1xuICAgIHZhciByZXMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRhcmdldC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHQgPSB0YXJnZXRbaV07XG4gICAgICBpZiAodCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhciBiID0gdGhpcy5iaW5kZXIodCk7XG4gICAgICAgIHJlcy5wdXNoKGIub24uYXBwbHkoYiwgYXJncykpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHZhciBiID0gdGhpcy5iaW5kZXIodGFyZ2V0KTtcbiAgcmV0dXJuIGIub24uYXBwbHkoYiwgYXJncyk7XG59O1xuQlJwJDMuYmluZGVyID0gZnVuY3Rpb24gKHRndCkge1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBjb250YWluZXJXaW5kb3cgPSByLmN5LndpbmRvdygpO1xuICB2YXIgdGd0SXNEb20gPSB0Z3QgPT09IGNvbnRhaW5lcldpbmRvdyB8fCB0Z3QgPT09IGNvbnRhaW5lcldpbmRvdy5kb2N1bWVudCB8fCB0Z3QgPT09IGNvbnRhaW5lcldpbmRvdy5kb2N1bWVudC5ib2R5IHx8IGRvbUVsZW1lbnQodGd0KTtcbiAgaWYgKHIuc3VwcG9ydHNQYXNzaXZlRXZlbnRzID09IG51bGwpIHtcbiAgICAvLyBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9XSUNHL0V2ZW50TGlzdGVuZXJPcHRpb25zL2Jsb2IvZ2gtcGFnZXMvZXhwbGFpbmVyLm1kI2ZlYXR1cmUtZGV0ZWN0aW9uXG4gICAgdmFyIHN1cHBvcnRzUGFzc2l2ZSA9IGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICB2YXIgb3B0cyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ3Bhc3NpdmUnLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgIHN1cHBvcnRzUGFzc2l2ZSA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY29udGFpbmVyV2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCBudWxsLCBvcHRzKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIG5vdCBzdXBwb3J0ZWRcbiAgICB9XG4gICAgci5zdXBwb3J0c1Bhc3NpdmVFdmVudHMgPSBzdXBwb3J0c1Bhc3NpdmU7XG4gIH1cbiAgdmFyIG9uID0gZnVuY3Rpb24gb24oZXZlbnQsIGhhbmRsZXIsIHVzZUNhcHR1cmUpIHtcbiAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgaWYgKHRndElzRG9tICYmIHIuc3VwcG9ydHNQYXNzaXZlRXZlbnRzKSB7XG4gICAgICAvLyByZXBsYWNlIHVzZUNhcHR1cmUgdy8gb3B0cyBvYmpcbiAgICAgIGFyZ3NbMl0gPSB7XG4gICAgICAgIGNhcHR1cmU6IHVzZUNhcHR1cmUgIT0gbnVsbCA/IHVzZUNhcHR1cmUgOiBmYWxzZSxcbiAgICAgICAgcGFzc2l2ZTogZmFsc2UsXG4gICAgICAgIG9uY2U6IGZhbHNlXG4gICAgICB9O1xuICAgIH1cbiAgICByLmJpbmRpbmdzLnB1c2goe1xuICAgICAgdGFyZ2V0OiB0Z3QsXG4gICAgICBhcmdzOiBhcmdzXG4gICAgfSk7XG4gICAgKHRndC5hZGRFdmVudExpc3RlbmVyIHx8IHRndC5vbikuYXBwbHkodGd0LCBhcmdzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBvbjogb24sXG4gICAgYWRkRXZlbnRMaXN0ZW5lcjogb24sXG4gICAgYWRkTGlzdGVuZXI6IG9uLFxuICAgIGJpbmQ6IG9uXG4gIH07XG59O1xuQlJwJDMubm9kZUlzRHJhZ2dhYmxlID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUgJiYgbm9kZS5pc05vZGUoKSAmJiAhbm9kZS5sb2NrZWQoKSAmJiBub2RlLmdyYWJiYWJsZSgpO1xufTtcbkJScCQzLm5vZGVJc0dyYWJiYWJsZSA9IGZ1bmN0aW9uIChub2RlKSB7XG4gIHJldHVybiB0aGlzLm5vZGVJc0RyYWdnYWJsZShub2RlKSAmJiBub2RlLmludGVyYWN0aXZlKCk7XG59O1xuQlJwJDMubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgY29udGFpbmVyV2luZG93ID0gci5jeS53aW5kb3coKTtcbiAgdmFyIGlzU2VsZWN0ZWQgPSBmdW5jdGlvbiBpc1NlbGVjdGVkKGVsZSkge1xuICAgIHJldHVybiBlbGUuc2VsZWN0ZWQoKTtcbiAgfTtcbiAgdmFyIGdldFNoYWRvd1Jvb3QgPSBmdW5jdGlvbiBnZXRTaGFkb3dSb290KGVsZW1lbnQpIHtcbiAgICB2YXIgcm9vdE5vZGUgPSBlbGVtZW50LmdldFJvb3ROb2RlKCk7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHJvb3Qgbm9kZSBpcyBhIHNoYWRvdyByb290XG4gICAgaWYgKHJvb3ROb2RlICYmIHJvb3ROb2RlLm5vZGVUeXBlID09PSAxMSAmJiByb290Tm9kZS5ob3N0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiByb290Tm9kZTtcbiAgICB9XG4gIH07XG4gIHZhciB0cmlnZ2VyRXZlbnRzID0gZnVuY3Rpb24gdHJpZ2dlckV2ZW50cyh0YXJnZXQsIG5hbWVzLCBlLCBwb3NpdGlvbikge1xuICAgIGlmICh0YXJnZXQgPT0gbnVsbCkge1xuICAgICAgdGFyZ2V0ID0gci5jeTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG5hbWUgPSBuYW1lc1tpXTtcbiAgICAgIHRhcmdldC5lbWl0KHtcbiAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgdHlwZTogbmFtZSxcbiAgICAgICAgcG9zaXRpb246IHBvc2l0aW9uXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG4gIHZhciBpc011bHRTZWxLZXlEb3duID0gZnVuY3Rpb24gaXNNdWx0U2VsS2V5RG93bihlKSB7XG4gICAgcmV0dXJuIGUuc2hpZnRLZXkgfHwgZS5tZXRhS2V5IHx8IGUuY3RybEtleTsgLy8gbWF5YmUgZS5hbHRLZXlcbiAgfTtcbiAgdmFyIGFsbG93UGFubmluZ1Bhc3N0aHJvdWdoID0gZnVuY3Rpb24gYWxsb3dQYW5uaW5nUGFzc3Rocm91Z2goZG93biwgZG93bnMpIHtcbiAgICB2YXIgYWxsb3dQYXNzdGhyb3VnaCA9IHRydWU7XG4gICAgaWYgKHIuY3kuaGFzQ29tcG91bmROb2RlcygpICYmIGRvd24gJiYgZG93bi5wYW5uYWJsZSgpKSB7XG4gICAgICAvLyBhIGdyYWJiYWJsZSBjb21wb3VuZCBub2RlIGJlbG93IHRoZSBlbGUgPT4gbm8gcGFzc3Rocm91Z2ggcGFubmluZ1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGRvd25zICYmIGkgPCBkb3ducy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZG93biA9IGRvd25zW2ldO1xuXG4gICAgICAgIC8vaWYgYW55IHBhcmVudCBub2RlIGluIGV2ZW50IGhpZXJhcmNoeSBpc24ndCBwYW5uYWJsZSwgcmVqZWN0IHBhc3N0aHJvdWdoXG4gICAgICAgIGlmIChkb3duLmlzTm9kZSgpICYmIGRvd24uaXNQYXJlbnQoKSAmJiAhZG93bi5wYW5uYWJsZSgpKSB7XG4gICAgICAgICAgYWxsb3dQYXNzdGhyb3VnaCA9IGZhbHNlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGFsbG93UGFzc3Rocm91Z2ggPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gYWxsb3dQYXNzdGhyb3VnaDtcbiAgfTtcbiAgdmFyIHNldEluRHJhZ0xheWVyID0gZnVuY3Rpb24gc2V0SW5EcmFnTGF5ZXIoZWxlKSB7XG4gICAgZWxlWzBdLl9wcml2YXRlLnJzY3JhdGNoLmluRHJhZ0xheWVyID0gdHJ1ZTtcbiAgfTtcbiAgdmFyIHNldE91dERyYWdMYXllciA9IGZ1bmN0aW9uIHNldE91dERyYWdMYXllcihlbGUpIHtcbiAgICBlbGVbMF0uX3ByaXZhdGUucnNjcmF0Y2guaW5EcmFnTGF5ZXIgPSBmYWxzZTtcbiAgfTtcbiAgdmFyIHNldEdyYWJUYXJnZXQgPSBmdW5jdGlvbiBzZXRHcmFiVGFyZ2V0KGVsZSkge1xuICAgIGVsZVswXS5fcHJpdmF0ZS5yc2NyYXRjaC5pc0dyYWJUYXJnZXQgPSB0cnVlO1xuICB9O1xuICB2YXIgcmVtb3ZlR3JhYlRhcmdldCA9IGZ1bmN0aW9uIHJlbW92ZUdyYWJUYXJnZXQoZWxlKSB7XG4gICAgZWxlWzBdLl9wcml2YXRlLnJzY3JhdGNoLmlzR3JhYlRhcmdldCA9IGZhbHNlO1xuICB9O1xuICB2YXIgYWRkVG9EcmFnTGlzdCA9IGZ1bmN0aW9uIGFkZFRvRHJhZ0xpc3QoZWxlLCBvcHRzKSB7XG4gICAgdmFyIGxpc3QgPSBvcHRzLmFkZFRvTGlzdDtcbiAgICB2YXIgbGlzdEhhc0VsZSA9IGxpc3QuaGFzKGVsZSk7XG4gICAgaWYgKCFsaXN0SGFzRWxlICYmIGVsZS5ncmFiYmFibGUoKSAmJiAhZWxlLmxvY2tlZCgpKSB7XG4gICAgICBsaXN0Lm1lcmdlKGVsZSk7XG4gICAgICBzZXRHcmFiYmVkKGVsZSk7XG4gICAgfVxuICB9O1xuXG4gIC8vIGhlbHBlciBmdW5jdGlvbiB0byBkZXRlcm1pbmUgd2hpY2ggY2hpbGQgbm9kZXMgYW5kIGlubmVyIGVkZ2VzXG4gIC8vIG9mIGEgY29tcG91bmQgbm9kZSB0byBiZSBkcmFnZ2VkIGFzIHdlbGwgYXMgdGhlIGdyYWJiZWQgYW5kIHNlbGVjdGVkIG5vZGVzXG4gIHZhciBhZGREZXNjZW5kYW50c1RvRHJhZyA9IGZ1bmN0aW9uIGFkZERlc2NlbmRhbnRzVG9EcmFnKG5vZGUsIG9wdHMpIHtcbiAgICBpZiAoIW5vZGUuY3koKS5oYXNDb21wb3VuZE5vZGVzKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG9wdHMuaW5EcmFnTGF5ZXIgPT0gbnVsbCAmJiBvcHRzLmFkZFRvTGlzdCA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBub3RoaW5nIHRvIGRvXG5cbiAgICB2YXIgaW5uZXJOb2RlcyA9IG5vZGUuZGVzY2VuZGFudHMoKTtcbiAgICBpZiAob3B0cy5pbkRyYWdMYXllcikge1xuICAgICAgaW5uZXJOb2Rlcy5mb3JFYWNoKHNldEluRHJhZ0xheWVyKTtcbiAgICAgIGlubmVyTm9kZXMuY29ubmVjdGVkRWRnZXMoKS5mb3JFYWNoKHNldEluRHJhZ0xheWVyKTtcbiAgICB9XG4gICAgaWYgKG9wdHMuYWRkVG9MaXN0KSB7XG4gICAgICBhZGRUb0RyYWdMaXN0KGlubmVyTm9kZXMsIG9wdHMpO1xuICAgIH1cbiAgfTtcblxuICAvLyBhZGRzIHRoZSBnaXZlbiBub2RlcyBhbmQgaXRzIG5laWdoYm91cmhvb2QgdG8gdGhlIGRyYWcgbGF5ZXJcbiAgdmFyIGFkZE5vZGVzVG9EcmFnID0gZnVuY3Rpb24gYWRkTm9kZXNUb0RyYWcobm9kZXMsIG9wdHMpIHtcbiAgICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgICB2YXIgaGFzQ29tcG91bmROb2RlcyA9IG5vZGVzLmN5KCkuaGFzQ29tcG91bmROb2RlcygpO1xuICAgIGlmIChvcHRzLmluRHJhZ0xheWVyKSB7XG4gICAgICBub2Rlcy5mb3JFYWNoKHNldEluRHJhZ0xheWVyKTtcbiAgICAgIG5vZGVzLm5laWdoYm9yaG9vZCgpLnN0ZEZpbHRlcihmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgIHJldHVybiAhaGFzQ29tcG91bmROb2RlcyB8fCBlbGUuaXNFZGdlKCk7XG4gICAgICB9KS5mb3JFYWNoKHNldEluRHJhZ0xheWVyKTtcbiAgICB9XG4gICAgaWYgKG9wdHMuYWRkVG9MaXN0KSB7XG4gICAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgYWRkVG9EcmFnTGlzdChlbGUsIG9wdHMpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGFkZERlc2NlbmRhbnRzVG9EcmFnKG5vZGVzLCBvcHRzKTsgLy8gYWx3YXlzIGFkZCB0byBkcmFnXG5cbiAgICAvLyBhbHNvIGFkZCBub2RlcyBhbmQgZWRnZXMgcmVsYXRlZCB0byB0aGUgdG9wbW9zdCBhbmNlc3RvclxuICAgIHVwZGF0ZUFuY2VzdG9yc0luRHJhZ0xheWVyKG5vZGVzLCB7XG4gICAgICBpbkRyYWdMYXllcjogb3B0cy5pbkRyYWdMYXllclxuICAgIH0pO1xuICAgIHIudXBkYXRlQ2FjaGVkR3JhYmJlZEVsZXMoKTtcbiAgfTtcbiAgdmFyIGFkZE5vZGVUb0RyYWcgPSBhZGROb2Rlc1RvRHJhZztcbiAgdmFyIGZyZWVEcmFnZ2VkRWxlbWVudHMgPSBmdW5jdGlvbiBmcmVlRHJhZ2dlZEVsZW1lbnRzKGdyYWJiZWRFbGVzKSB7XG4gICAgaWYgKCFncmFiYmVkRWxlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGp1c3QgZ28gb3ZlciBhbGwgZWxlbWVudHMgcmF0aGVyIHRoYW4gZG9pbmcgYSBidW5jaCBvZiAocG9zc2libHkgZXhwZW5zaXZlKSB0cmF2ZXJzYWxzXG4gICAgci5nZXRDYWNoZWRaU29ydGVkRWxlcygpLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgICAgc2V0RnJlZWQoZWxlKTtcbiAgICAgIHNldE91dERyYWdMYXllcihlbGUpO1xuICAgICAgcmVtb3ZlR3JhYlRhcmdldChlbGUpO1xuICAgIH0pO1xuICAgIHIudXBkYXRlQ2FjaGVkR3JhYmJlZEVsZXMoKTtcbiAgfTtcblxuICAvLyBoZWxwZXIgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHdoaWNoIGFuY2VzdG9yIG5vZGVzIGFuZCBlZGdlcyBzaG91bGQgZ29cbiAgLy8gdG8gdGhlIGRyYWcgbGF5ZXIgKG9yIHNob3VsZCBiZSByZW1vdmVkIGZyb20gZHJhZyBsYXllcikuXG4gIHZhciB1cGRhdGVBbmNlc3RvcnNJbkRyYWdMYXllciA9IGZ1bmN0aW9uIHVwZGF0ZUFuY2VzdG9yc0luRHJhZ0xheWVyKG5vZGUsIG9wdHMpIHtcbiAgICBpZiAob3B0cy5pbkRyYWdMYXllciA9PSBudWxsICYmIG9wdHMuYWRkVG9MaXN0ID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIG5vdGhpbmcgdG8gZG9cblxuICAgIGlmICghbm9kZS5jeSgpLmhhc0NvbXBvdW5kTm9kZXMoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGZpbmQgdG9wLWxldmVsIHBhcmVudFxuICAgIHZhciBwYXJlbnQgPSBub2RlLmFuY2VzdG9ycygpLm9ycGhhbnMoKTtcblxuICAgIC8vIG5vIHBhcmVudCBub2RlOiBubyBub2RlcyB0byBhZGQgdG8gdGhlIGRyYWcgbGF5ZXJcbiAgICBpZiAocGFyZW50LnNhbWUobm9kZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIG5vZGVzID0gcGFyZW50LmRlc2NlbmRhbnRzKCkuc3Bhd25TZWxmKCkubWVyZ2UocGFyZW50KS51bm1lcmdlKG5vZGUpLnVubWVyZ2Uobm9kZS5kZXNjZW5kYW50cygpKTtcbiAgICB2YXIgZWRnZXMgPSBub2Rlcy5jb25uZWN0ZWRFZGdlcygpO1xuICAgIGlmIChvcHRzLmluRHJhZ0xheWVyKSB7XG4gICAgICBlZGdlcy5mb3JFYWNoKHNldEluRHJhZ0xheWVyKTtcbiAgICAgIG5vZGVzLmZvckVhY2goc2V0SW5EcmFnTGF5ZXIpO1xuICAgIH1cbiAgICBpZiAob3B0cy5hZGRUb0xpc3QpIHtcbiAgICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICBhZGRUb0RyYWdMaXN0KGVsZSwgb3B0cyk7XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG4gIHZhciBibHVyQWN0aXZlRG9tRWxlbWVudCA9IGZ1bmN0aW9uIGJsdXJBY3RpdmVEb21FbGVtZW50KCkge1xuICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ICE9IG51bGwgJiYgZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5ibHVyICE9IG51bGwpIHtcbiAgICAgIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQuYmx1cigpO1xuICAgIH1cbiAgfTtcbiAgdmFyIGhhdmVNdXRhdGlvbnNBcGkgPSB0eXBlb2YgTXV0YXRpb25PYnNlcnZlciAhPT0gJ3VuZGVmaW5lZCc7XG4gIHZhciBoYXZlUmVzaXplT2JzZXJ2ZXJBcGkgPSB0eXBlb2YgUmVzaXplT2JzZXJ2ZXIgIT09ICd1bmRlZmluZWQnO1xuXG4gIC8vIHdhdGNoIGZvciB3aGVuIHRoZSBjeSBjb250YWluZXIgaXMgcmVtb3ZlZCBmcm9tIHRoZSBkb21cbiAgaWYgKGhhdmVNdXRhdGlvbnNBcGkpIHtcbiAgICByLnJlbW92ZU9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24gKG11dG5zKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG11dG5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBtdXRuID0gbXV0bnNbaV07XG4gICAgICAgIHZhciByTm9kZXMgPSBtdXRuLnJlbW92ZWROb2RlcztcbiAgICAgICAgaWYgKHJOb2Rlcykge1xuICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgck5vZGVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICB2YXIgck5vZGUgPSByTm9kZXNbal07XG4gICAgICAgICAgICBpZiAock5vZGUgPT09IHIuY29udGFpbmVyKSB7XG4gICAgICAgICAgICAgIHIuZGVzdHJveSgpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoci5jb250YWluZXIucGFyZW50Tm9kZSkge1xuICAgICAgci5yZW1vdmVPYnNlcnZlci5vYnNlcnZlKHIuY29udGFpbmVyLnBhcmVudE5vZGUsIHtcbiAgICAgICAgY2hpbGRMaXN0OiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgci5yZWdpc3RlckJpbmRpbmcoci5jb250YWluZXIsICdET01Ob2RlUmVtb3ZlZCcsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgICByLmRlc3Ryb3koKTtcbiAgICB9KTtcbiAgfVxuICB2YXIgb25SZXNpemUgPSBkZWJvdW5jZShmdW5jdGlvbiAoKSB7XG4gICAgci5jeS5yZXNpemUoKTtcbiAgfSwgMTAwKTtcbiAgaWYgKGhhdmVNdXRhdGlvbnNBcGkpIHtcbiAgICByLnN0eWxlT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihvblJlc2l6ZSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcblxuICAgIHIuc3R5bGVPYnNlcnZlci5vYnNlcnZlKHIuY29udGFpbmVyLCB7XG4gICAgICBhdHRyaWJ1dGVzOiB0cnVlXG4gICAgfSk7XG4gIH1cblxuICAvLyBhdXRvIHJlc2l6ZVxuICByLnJlZ2lzdGVyQmluZGluZyhjb250YWluZXJXaW5kb3csICdyZXNpemUnLCBvblJlc2l6ZSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcblxuICBpZiAoaGF2ZVJlc2l6ZU9ic2VydmVyQXBpKSB7XG4gICAgci5yZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcihvblJlc2l6ZSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcblxuICAgIHIucmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShyLmNvbnRhaW5lcik7XG4gIH1cbiAgdmFyIGZvckVhY2hVcCA9IGZ1bmN0aW9uIGZvckVhY2hVcChkb21FbGUsIGZuKSB7XG4gICAgd2hpbGUgKGRvbUVsZSAhPSBudWxsKSB7XG4gICAgICBmbihkb21FbGUpO1xuICAgICAgZG9tRWxlID0gZG9tRWxlLnBhcmVudE5vZGU7XG4gICAgfVxuICB9O1xuICB2YXIgaW52YWxpZGF0ZUNvb3JkcyA9IGZ1bmN0aW9uIGludmFsaWRhdGVDb29yZHMoKSB7XG4gICAgci5pbnZhbGlkYXRlQ29udGFpbmVyQ2xpZW50Q29vcmRzQ2FjaGUoKTtcbiAgfTtcbiAgZm9yRWFjaFVwKHIuY29udGFpbmVyLCBmdW5jdGlvbiAoZG9tRWxlKSB7XG4gICAgci5yZWdpc3RlckJpbmRpbmcoZG9tRWxlLCAndHJhbnNpdGlvbmVuZCcsIGludmFsaWRhdGVDb29yZHMpO1xuICAgIHIucmVnaXN0ZXJCaW5kaW5nKGRvbUVsZSwgJ2FuaW1hdGlvbmVuZCcsIGludmFsaWRhdGVDb29yZHMpO1xuICAgIHIucmVnaXN0ZXJCaW5kaW5nKGRvbUVsZSwgJ3Njcm9sbCcsIGludmFsaWRhdGVDb29yZHMpO1xuICB9KTtcblxuICAvLyBzdG9wIHJpZ2h0IGNsaWNrIG1lbnUgZnJvbSBhcHBlYXJpbmcgb24gY3lcbiAgci5yZWdpc3RlckJpbmRpbmcoci5jb250YWluZXIsICdjb250ZXh0bWVudScsIGZ1bmN0aW9uIChlKSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICB9KTtcbiAgdmFyIGluQm94U2VsZWN0aW9uID0gZnVuY3Rpb24gaW5Cb3hTZWxlY3Rpb24oKSB7XG4gICAgcmV0dXJuIHIuc2VsZWN0aW9uWzRdICE9PSAwO1xuICB9O1xuICB2YXIgZXZlbnRJbkNvbnRhaW5lciA9IGZ1bmN0aW9uIGV2ZW50SW5Db250YWluZXIoZSkge1xuICAgIC8vIHNhdmUgY3ljbGVzIGlmIG1vdXNlIGV2ZW50cyBhcmVuJ3QgdG8gYmUgY2FwdHVyZWRcbiAgICB2YXIgY29udGFpbmVyUGFnZUNvb3JkcyA9IHIuZmluZENvbnRhaW5lckNsaWVudENvb3JkcygpO1xuICAgIHZhciB4ID0gY29udGFpbmVyUGFnZUNvb3Jkc1swXTtcbiAgICB2YXIgeSA9IGNvbnRhaW5lclBhZ2VDb29yZHNbMV07XG4gICAgdmFyIHdpZHRoID0gY29udGFpbmVyUGFnZUNvb3Jkc1syXTtcbiAgICB2YXIgaGVpZ2h0ID0gY29udGFpbmVyUGFnZUNvb3Jkc1szXTtcbiAgICB2YXIgcG9zaXRpb25zID0gZS50b3VjaGVzID8gZS50b3VjaGVzIDogW2VdO1xuICAgIHZhciBhdExlYXN0T25lUG9zSW5zaWRlID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwID0gcG9zaXRpb25zW2ldO1xuICAgICAgaWYgKHggPD0gcC5jbGllbnRYICYmIHAuY2xpZW50WCA8PSB4ICsgd2lkdGggJiYgeSA8PSBwLmNsaWVudFkgJiYgcC5jbGllbnRZIDw9IHkgKyBoZWlnaHQpIHtcbiAgICAgICAgYXRMZWFzdE9uZVBvc0luc2lkZSA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWF0TGVhc3RPbmVQb3NJbnNpZGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIGNvbnRhaW5lciA9IHIuY29udGFpbmVyO1xuICAgIHZhciB0YXJnZXQgPSBlLnRhcmdldDtcbiAgICB2YXIgdFBhcmVudCA9IHRhcmdldC5wYXJlbnROb2RlO1xuICAgIHZhciBjb250YWluZXJJc1RhcmdldCA9IGZhbHNlO1xuICAgIHdoaWxlICh0UGFyZW50KSB7XG4gICAgICBpZiAodFBhcmVudCA9PT0gY29udGFpbmVyKSB7XG4gICAgICAgIGNvbnRhaW5lcklzVGFyZ2V0ID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICB0UGFyZW50ID0gdFBhcmVudC5wYXJlbnROb2RlO1xuICAgIH1cbiAgICBpZiAoIWNvbnRhaW5lcklzVGFyZ2V0KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSAvLyBpZiB0YXJnZXQgaXMgb3V0aXNkZSBjeSBjb250YWluZXIsIHRoZW4gdGhpcyBldmVudCBpcyBub3QgZm9yIHVzXG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICAvLyBQcmltYXJ5IGtleVxuICByLnJlZ2lzdGVyQmluZGluZyhyLmNvbnRhaW5lciwgJ21vdXNlZG93bicsIGZ1bmN0aW9uIG1vdXNlZG93bkhhbmRsZXIoZSkge1xuICAgIGlmICghZXZlbnRJbkNvbnRhaW5lcihlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGR1cmluZyBsZWZ0IG1vdXNlIGJ1dHRvbiBnZXN0dXJlcywgaWdub3JlIG90aGVyIGJ1dHRvbnNcbiAgICBpZiAoci5ob3ZlckRhdGEud2hpY2ggPT09IDEgJiYgZS53aGljaCAhPT0gMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgYmx1ckFjdGl2ZURvbUVsZW1lbnQoKTtcbiAgICByLmhvdmVyRGF0YS5jYXB0dXJlID0gdHJ1ZTtcbiAgICByLmhvdmVyRGF0YS53aGljaCA9IGUud2hpY2g7XG4gICAgdmFyIGN5ID0gci5jeTtcbiAgICB2YXIgZ3BvcyA9IFtlLmNsaWVudFgsIGUuY2xpZW50WV07XG4gICAgdmFyIHBvcyA9IHIucHJvamVjdEludG9WaWV3cG9ydChncG9zWzBdLCBncG9zWzFdKTtcbiAgICB2YXIgc2VsZWN0ID0gci5zZWxlY3Rpb247XG4gICAgdmFyIG5lYXJzID0gci5maW5kTmVhcmVzdEVsZW1lbnRzKHBvc1swXSwgcG9zWzFdLCB0cnVlLCBmYWxzZSk7XG4gICAgdmFyIG5lYXIgPSBuZWFyc1swXTtcbiAgICB2YXIgZHJhZ2dlZEVsZW1lbnRzID0gci5kcmFnRGF0YS5wb3NzaWJsZURyYWdFbGVtZW50cztcbiAgICByLmhvdmVyRGF0YS5tZG93blBvcyA9IHBvcztcbiAgICByLmhvdmVyRGF0YS5tZG93bkdQb3MgPSBncG9zO1xuICAgIHZhciBtYWtlRXZlbnQgPSBmdW5jdGlvbiBtYWtlRXZlbnQodHlwZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgICAgeTogcG9zWzFdXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfTtcbiAgICB2YXIgY2hlY2tGb3JUYXBob2xkID0gZnVuY3Rpb24gY2hlY2tGb3JUYXBob2xkKCkge1xuICAgICAgci5ob3ZlckRhdGEudGFwaG9sZENhbmNlbGxlZCA9IGZhbHNlO1xuICAgICAgY2xlYXJUaW1lb3V0KHIuaG92ZXJEYXRhLnRhcGhvbGRUaW1lb3V0KTtcbiAgICAgIHIuaG92ZXJEYXRhLnRhcGhvbGRUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChyLmhvdmVyRGF0YS50YXBob2xkQ2FuY2VsbGVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBlbGUgPSByLmhvdmVyRGF0YS5kb3duO1xuICAgICAgICAgIGlmIChlbGUpIHtcbiAgICAgICAgICAgIGVsZS5lbWl0KG1ha2VFdmVudCgndGFwaG9sZCcpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY3kuZW1pdChtYWtlRXZlbnQoJ3RhcGhvbGQnKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCByLnRhcGhvbGREdXJhdGlvbik7XG4gICAgfTtcblxuICAgIC8vIFJpZ2h0IGNsaWNrIGJ1dHRvblxuICAgIGlmIChlLndoaWNoID09IDMpIHtcbiAgICAgIHIuaG92ZXJEYXRhLmN4dFN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgdmFyIGN4dEV2dCA9IHtcbiAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgdHlwZTogJ2N4dHRhcHN0YXJ0JyxcbiAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgICAgeTogcG9zWzFdXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBpZiAobmVhcikge1xuICAgICAgICBuZWFyLmFjdGl2YXRlKCk7XG4gICAgICAgIG5lYXIuZW1pdChjeHRFdnQpO1xuICAgICAgICByLmhvdmVyRGF0YS5kb3duID0gbmVhcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN5LmVtaXQoY3h0RXZ0KTtcbiAgICAgIH1cbiAgICAgIHIuaG92ZXJEYXRhLmRvd25UaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICByLmhvdmVyRGF0YS5jeHREcmFnZ2VkID0gZmFsc2U7XG5cbiAgICAgIC8vIFByaW1hcnkgYnV0dG9uXG4gICAgfSBlbHNlIGlmIChlLndoaWNoID09IDEpIHtcbiAgICAgIGlmIChuZWFyKSB7XG4gICAgICAgIG5lYXIuYWN0aXZhdGUoKTtcbiAgICAgIH1cblxuICAgICAgLy8gRWxlbWVudCBkcmFnZ2luZ1xuICAgICAge1xuICAgICAgICAvLyBJZiBzb21ldGhpbmcgaXMgdW5kZXIgdGhlIGN1cnNvciBhbmQgaXQgaXMgZHJhZ2dhYmxlLCBwcmVwYXJlIHRvIGdyYWIgaXRcbiAgICAgICAgaWYgKG5lYXIgIT0gbnVsbCkge1xuICAgICAgICAgIGlmIChyLm5vZGVJc0dyYWJiYWJsZShuZWFyKSkge1xuICAgICAgICAgICAgdmFyIHRyaWdnZXJHcmFiID0gZnVuY3Rpb24gdHJpZ2dlckdyYWIoZWxlKSB7XG4gICAgICAgICAgICAgIGVsZS5lbWl0KG1ha2VFdmVudCgnZ3JhYicpKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBzZXRHcmFiVGFyZ2V0KG5lYXIpO1xuICAgICAgICAgICAgaWYgKCFuZWFyLnNlbGVjdGVkKCkpIHtcbiAgICAgICAgICAgICAgZHJhZ2dlZEVsZW1lbnRzID0gci5kcmFnRGF0YS5wb3NzaWJsZURyYWdFbGVtZW50cyA9IGN5LmNvbGxlY3Rpb24oKTtcbiAgICAgICAgICAgICAgYWRkTm9kZVRvRHJhZyhuZWFyLCB7XG4gICAgICAgICAgICAgICAgYWRkVG9MaXN0OiBkcmFnZ2VkRWxlbWVudHNcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIG5lYXIuZW1pdChtYWtlRXZlbnQoJ2dyYWJvbicpKS5lbWl0KG1ha2VFdmVudCgnZ3JhYicpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGRyYWdnZWRFbGVtZW50cyA9IHIuZHJhZ0RhdGEucG9zc2libGVEcmFnRWxlbWVudHMgPSBjeS5jb2xsZWN0aW9uKCk7XG4gICAgICAgICAgICAgIHZhciBzZWxlY3RlZE5vZGVzID0gY3kuJChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZS5pc05vZGUoKSAmJiBlbGUuc2VsZWN0ZWQoKSAmJiByLm5vZGVJc0dyYWJiYWJsZShlbGUpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgYWRkTm9kZXNUb0RyYWcoc2VsZWN0ZWROb2Rlcywge1xuICAgICAgICAgICAgICAgIGFkZFRvTGlzdDogZHJhZ2dlZEVsZW1lbnRzXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBuZWFyLmVtaXQobWFrZUV2ZW50KCdncmFib24nKSk7XG4gICAgICAgICAgICAgIHNlbGVjdGVkTm9kZXMuZm9yRWFjaCh0cmlnZ2VyR3JhYik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgICAgICAgIHIucmVkcmF3SGludCgnZHJhZycsIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByLmhvdmVyRGF0YS5kb3duID0gbmVhcjtcbiAgICAgICAgci5ob3ZlckRhdGEuZG93bnMgPSBuZWFycztcbiAgICAgICAgci5ob3ZlckRhdGEuZG93blRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgIH1cbiAgICAgIHRyaWdnZXJFdmVudHMobmVhciwgWydtb3VzZWRvd24nLCAndGFwc3RhcnQnLCAndm1vdXNlZG93biddLCBlLCB7XG4gICAgICAgIHg6IHBvc1swXSxcbiAgICAgICAgeTogcG9zWzFdXG4gICAgICB9KTtcbiAgICAgIGlmIChuZWFyID09IG51bGwpIHtcbiAgICAgICAgc2VsZWN0WzRdID0gMTtcbiAgICAgICAgci5kYXRhLmJnQWN0aXZlUG9zaXN0aW9uID0ge1xuICAgICAgICAgIHg6IHBvc1swXSxcbiAgICAgICAgICB5OiBwb3NbMV1cbiAgICAgICAgfTtcbiAgICAgICAgci5yZWRyYXdIaW50KCdzZWxlY3QnLCB0cnVlKTtcbiAgICAgICAgci5yZWRyYXcoKTtcbiAgICAgIH0gZWxzZSBpZiAobmVhci5wYW5uYWJsZSgpKSB7XG4gICAgICAgIHNlbGVjdFs0XSA9IDE7IC8vIGZvciBmdXR1cmUgcGFuXG4gICAgICB9XG4gICAgICBjaGVja0ZvclRhcGhvbGQoKTtcbiAgICB9XG5cbiAgICAvLyBJbml0aWFsaXplIHNlbGVjdGlvbiBib3ggY29vcmRpbmF0ZXNcbiAgICBzZWxlY3RbMF0gPSBzZWxlY3RbMl0gPSBwb3NbMF07XG4gICAgc2VsZWN0WzFdID0gc2VsZWN0WzNdID0gcG9zWzFdO1xuICB9LCBmYWxzZSk7XG4gIHZhciBzaGFkb3dSb290ID0gZ2V0U2hhZG93Um9vdChyLmNvbnRhaW5lcik7XG4gIHIucmVnaXN0ZXJCaW5kaW5nKFtjb250YWluZXJXaW5kb3csIHNoYWRvd1Jvb3RdLCAnbW91c2Vtb3ZlJywgZnVuY3Rpb24gbW91c2Vtb3ZlSGFuZGxlcihlKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuICAgIHZhciBjYXB0dXJlID0gci5ob3ZlckRhdGEuY2FwdHVyZTtcbiAgICBpZiAoIWNhcHR1cmUgJiYgIWV2ZW50SW5Db250YWluZXIoZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHByZXZlbnREZWZhdWx0ID0gZmFsc2U7XG4gICAgdmFyIGN5ID0gci5jeTtcbiAgICB2YXIgem9vbSA9IGN5Lnpvb20oKTtcbiAgICB2YXIgZ3BvcyA9IFtlLmNsaWVudFgsIGUuY2xpZW50WV07XG4gICAgdmFyIHBvcyA9IHIucHJvamVjdEludG9WaWV3cG9ydChncG9zWzBdLCBncG9zWzFdKTtcbiAgICB2YXIgbWRvd25Qb3MgPSByLmhvdmVyRGF0YS5tZG93blBvcztcbiAgICB2YXIgbWRvd25HUG9zID0gci5ob3ZlckRhdGEubWRvd25HUG9zO1xuICAgIHZhciBzZWxlY3QgPSByLnNlbGVjdGlvbjtcbiAgICB2YXIgbmVhciA9IG51bGw7XG4gICAgaWYgKCFyLmhvdmVyRGF0YS5kcmFnZ2luZ0VsZXMgJiYgIXIuaG92ZXJEYXRhLmRyYWdnaW5nICYmICFyLmhvdmVyRGF0YS5zZWxlY3RpbmcpIHtcbiAgICAgIG5lYXIgPSByLmZpbmROZWFyZXN0RWxlbWVudChwb3NbMF0sIHBvc1sxXSwgdHJ1ZSwgZmFsc2UpO1xuICAgIH1cbiAgICB2YXIgbGFzdCA9IHIuaG92ZXJEYXRhLmxhc3Q7XG4gICAgdmFyIGRvd24gPSByLmhvdmVyRGF0YS5kb3duO1xuICAgIHZhciBkaXNwID0gW3Bvc1swXSAtIHNlbGVjdFsyXSwgcG9zWzFdIC0gc2VsZWN0WzNdXTtcbiAgICB2YXIgZHJhZ2dlZEVsZW1lbnRzID0gci5kcmFnRGF0YS5wb3NzaWJsZURyYWdFbGVtZW50cztcbiAgICB2YXIgaXNPdmVyVGhyZXNob2xkRHJhZztcbiAgICBpZiAobWRvd25HUG9zKSB7XG4gICAgICB2YXIgZHggPSBncG9zWzBdIC0gbWRvd25HUG9zWzBdO1xuICAgICAgdmFyIGR4MiA9IGR4ICogZHg7XG4gICAgICB2YXIgZHkgPSBncG9zWzFdIC0gbWRvd25HUG9zWzFdO1xuICAgICAgdmFyIGR5MiA9IGR5ICogZHk7XG4gICAgICB2YXIgZGlzdDIgPSBkeDIgKyBkeTI7XG4gICAgICByLmhvdmVyRGF0YS5pc092ZXJUaHJlc2hvbGREcmFnID0gaXNPdmVyVGhyZXNob2xkRHJhZyA9IGRpc3QyID49IHIuZGVza3RvcFRhcFRocmVzaG9sZDI7XG4gICAgfVxuICAgIHZhciBtdWx0U2VsS2V5RG93biA9IGlzTXVsdFNlbEtleURvd24oZSk7XG4gICAgaWYgKGlzT3ZlclRocmVzaG9sZERyYWcpIHtcbiAgICAgIHIuaG92ZXJEYXRhLnRhcGhvbGRDYW5jZWxsZWQgPSB0cnVlO1xuICAgIH1cbiAgICB2YXIgdXBkYXRlRHJhZ0RlbHRhID0gZnVuY3Rpb24gdXBkYXRlRHJhZ0RlbHRhKCkge1xuICAgICAgdmFyIGRyYWdEZWx0YSA9IHIuaG92ZXJEYXRhLmRyYWdEZWx0YSA9IHIuaG92ZXJEYXRhLmRyYWdEZWx0YSB8fCBbXTtcbiAgICAgIGlmIChkcmFnRGVsdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGRyYWdEZWx0YS5wdXNoKGRpc3BbMF0pO1xuICAgICAgICBkcmFnRGVsdGEucHVzaChkaXNwWzFdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRyYWdEZWx0YVswXSArPSBkaXNwWzBdO1xuICAgICAgICBkcmFnRGVsdGFbMV0gKz0gZGlzcFsxXTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHByZXZlbnREZWZhdWx0ID0gdHJ1ZTtcbiAgICB0cmlnZ2VyRXZlbnRzKG5lYXIsIFsnbW91c2Vtb3ZlJywgJ3Ztb3VzZW1vdmUnLCAndGFwZHJhZyddLCBlLCB7XG4gICAgICB4OiBwb3NbMF0sXG4gICAgICB5OiBwb3NbMV1cbiAgICB9KTtcbiAgICB2YXIgbWFrZUV2ZW50ID0gZnVuY3Rpb24gbWFrZUV2ZW50KHR5cGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICAgIHk6IHBvc1sxXVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH07XG4gICAgdmFyIGdvSW50b0JveE1vZGUgPSBmdW5jdGlvbiBnb0ludG9Cb3hNb2RlKCkge1xuICAgICAgci5kYXRhLmJnQWN0aXZlUG9zaXN0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgaWYgKCFyLmhvdmVyRGF0YS5zZWxlY3RpbmcpIHtcbiAgICAgICAgY3kuZW1pdChtYWtlRXZlbnQoJ2JveHN0YXJ0JykpO1xuICAgICAgfVxuICAgICAgc2VsZWN0WzRdID0gMTtcbiAgICAgIHIuaG92ZXJEYXRhLnNlbGVjdGluZyA9IHRydWU7XG4gICAgICByLnJlZHJhd0hpbnQoJ3NlbGVjdCcsIHRydWUpO1xuICAgICAgci5yZWRyYXcoKTtcbiAgICB9O1xuXG4gICAgLy8gdHJpZ2dlciBjb250ZXh0IGRyYWcgaWYgcm1vdXNlIGRvd25cbiAgICBpZiAoci5ob3ZlckRhdGEud2hpY2ggPT09IDMpIHtcbiAgICAgIC8vIGJ1dCBvbmx5IGlmIG92ZXIgdGhyZXNob2xkXG4gICAgICBpZiAoaXNPdmVyVGhyZXNob2xkRHJhZykge1xuICAgICAgICB2YXIgY3h0RXZ0ID0gbWFrZUV2ZW50KCdjeHRkcmFnJyk7XG4gICAgICAgIGlmIChkb3duKSB7XG4gICAgICAgICAgZG93bi5lbWl0KGN4dEV2dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3kuZW1pdChjeHRFdnQpO1xuICAgICAgICB9XG4gICAgICAgIHIuaG92ZXJEYXRhLmN4dERyYWdnZWQgPSB0cnVlO1xuICAgICAgICBpZiAoIXIuaG92ZXJEYXRhLmN4dE92ZXIgfHwgbmVhciAhPT0gci5ob3ZlckRhdGEuY3h0T3Zlcikge1xuICAgICAgICAgIGlmIChyLmhvdmVyRGF0YS5jeHRPdmVyKSB7XG4gICAgICAgICAgICByLmhvdmVyRGF0YS5jeHRPdmVyLmVtaXQobWFrZUV2ZW50KCdjeHRkcmFnb3V0JykpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByLmhvdmVyRGF0YS5jeHRPdmVyID0gbmVhcjtcbiAgICAgICAgICBpZiAobmVhcikge1xuICAgICAgICAgICAgbmVhci5lbWl0KG1ha2VFdmVudCgnY3h0ZHJhZ292ZXInKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHdlIGFyZSBkcmFnIHBhbm5pbmcgdGhlIGVudGlyZSBncmFwaFxuICAgIH0gZWxzZSBpZiAoci5ob3ZlckRhdGEuZHJhZ2dpbmcpIHtcbiAgICAgIHByZXZlbnREZWZhdWx0ID0gdHJ1ZTtcbiAgICAgIGlmIChjeS5wYW5uaW5nRW5hYmxlZCgpICYmIGN5LnVzZXJQYW5uaW5nRW5hYmxlZCgpKSB7XG4gICAgICAgIHZhciBkZWx0YVA7XG4gICAgICAgIGlmIChyLmhvdmVyRGF0YS5qdXN0U3RhcnRlZFBhbikge1xuICAgICAgICAgIHZhciBtZFBvcyA9IHIuaG92ZXJEYXRhLm1kb3duUG9zO1xuICAgICAgICAgIGRlbHRhUCA9IHtcbiAgICAgICAgICAgIHg6IChwb3NbMF0gLSBtZFBvc1swXSkgKiB6b29tLFxuICAgICAgICAgICAgeTogKHBvc1sxXSAtIG1kUG9zWzFdKSAqIHpvb21cbiAgICAgICAgICB9O1xuICAgICAgICAgIHIuaG92ZXJEYXRhLmp1c3RTdGFydGVkUGFuID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVsdGFQID0ge1xuICAgICAgICAgICAgeDogZGlzcFswXSAqIHpvb20sXG4gICAgICAgICAgICB5OiBkaXNwWzFdICogem9vbVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY3kucGFuQnkoZGVsdGFQKTtcbiAgICAgICAgY3kuZW1pdChtYWtlRXZlbnQoJ2RyYWdwYW4nKSk7XG4gICAgICAgIHIuaG92ZXJEYXRhLmRyYWdnZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBOZWVkcyByZXByb2plY3QgZHVlIHRvIHBhbiBjaGFuZ2luZyB2aWV3cG9ydFxuICAgICAgcG9zID0gci5wcm9qZWN0SW50b1ZpZXdwb3J0KGUuY2xpZW50WCwgZS5jbGllbnRZKTtcblxuICAgICAgLy8gQ2hlY2tzIHByaW1hcnkgYnV0dG9uIGRvd24gJiBvdXQgb2YgdGltZSAmIG1vdXNlIG5vdCBtb3ZlZCBtdWNoXG4gICAgfSBlbHNlIGlmIChzZWxlY3RbNF0gPT0gMSAmJiAoZG93biA9PSBudWxsIHx8IGRvd24ucGFubmFibGUoKSkpIHtcbiAgICAgIGlmIChpc092ZXJUaHJlc2hvbGREcmFnKSB7XG4gICAgICAgIGlmICghci5ob3ZlckRhdGEuZHJhZ2dpbmcgJiYgY3kuYm94U2VsZWN0aW9uRW5hYmxlZCgpICYmIChtdWx0U2VsS2V5RG93biB8fCAhY3kucGFubmluZ0VuYWJsZWQoKSB8fCAhY3kudXNlclBhbm5pbmdFbmFibGVkKCkpKSB7XG4gICAgICAgICAgZ29JbnRvQm94TW9kZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKCFyLmhvdmVyRGF0YS5zZWxlY3RpbmcgJiYgY3kucGFubmluZ0VuYWJsZWQoKSAmJiBjeS51c2VyUGFubmluZ0VuYWJsZWQoKSkge1xuICAgICAgICAgIHZhciBhbGxvd1Bhc3N0aHJvdWdoID0gYWxsb3dQYW5uaW5nUGFzc3Rocm91Z2goZG93biwgci5ob3ZlckRhdGEuZG93bnMpO1xuICAgICAgICAgIGlmIChhbGxvd1Bhc3N0aHJvdWdoKSB7XG4gICAgICAgICAgICByLmhvdmVyRGF0YS5kcmFnZ2luZyA9IHRydWU7XG4gICAgICAgICAgICByLmhvdmVyRGF0YS5qdXN0U3RhcnRlZFBhbiA9IHRydWU7XG4gICAgICAgICAgICBzZWxlY3RbNF0gPSAwO1xuICAgICAgICAgICAgci5kYXRhLmJnQWN0aXZlUG9zaXN0aW9uID0gYXJyYXkycG9pbnQobWRvd25Qb3MpO1xuICAgICAgICAgICAgci5yZWRyYXdIaW50KCdzZWxlY3QnLCB0cnVlKTtcbiAgICAgICAgICAgIHIucmVkcmF3KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChkb3duICYmIGRvd24ucGFubmFibGUoKSAmJiBkb3duLmFjdGl2ZSgpKSB7XG4gICAgICAgICAgZG93bi51bmFjdGl2YXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGRvd24gJiYgZG93bi5wYW5uYWJsZSgpICYmIGRvd24uYWN0aXZlKCkpIHtcbiAgICAgICAgZG93bi51bmFjdGl2YXRlKCk7XG4gICAgICB9XG4gICAgICBpZiAoKCFkb3duIHx8ICFkb3duLmdyYWJiZWQoKSkgJiYgbmVhciAhPSBsYXN0KSB7XG4gICAgICAgIGlmIChsYXN0KSB7XG4gICAgICAgICAgdHJpZ2dlckV2ZW50cyhsYXN0LCBbJ21vdXNlb3V0JywgJ3RhcGRyYWdvdXQnXSwgZSwge1xuICAgICAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICAgICAgeTogcG9zWzFdXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5lYXIpIHtcbiAgICAgICAgICB0cmlnZ2VyRXZlbnRzKG5lYXIsIFsnbW91c2VvdmVyJywgJ3RhcGRyYWdvdmVyJ10sIGUsIHtcbiAgICAgICAgICAgIHg6IHBvc1swXSxcbiAgICAgICAgICAgIHk6IHBvc1sxXVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHIuaG92ZXJEYXRhLmxhc3QgPSBuZWFyO1xuICAgICAgfVxuICAgICAgaWYgKGRvd24pIHtcbiAgICAgICAgaWYgKGlzT3ZlclRocmVzaG9sZERyYWcpIHtcbiAgICAgICAgICAvLyB0aGVuIHdlIGNhbiB0YWtlIGFjdGlvblxuXG4gICAgICAgICAgaWYgKGN5LmJveFNlbGVjdGlvbkVuYWJsZWQoKSAmJiBtdWx0U2VsS2V5RG93bikge1xuICAgICAgICAgICAgLy8gdGhlbiBzZWxlY3Rpb24gb3ZlcnJpZGVzXG4gICAgICAgICAgICBpZiAoZG93biAmJiBkb3duLmdyYWJiZWQoKSkge1xuICAgICAgICAgICAgICBmcmVlRHJhZ2dlZEVsZW1lbnRzKGRyYWdnZWRFbGVtZW50cyk7XG4gICAgICAgICAgICAgIGRvd24uZW1pdChtYWtlRXZlbnQoJ2ZyZWVvbicpKTtcbiAgICAgICAgICAgICAgZHJhZ2dlZEVsZW1lbnRzLmVtaXQobWFrZUV2ZW50KCdmcmVlJykpO1xuICAgICAgICAgICAgICBpZiAoci5kcmFnRGF0YS5kaWREcmFnKSB7XG4gICAgICAgICAgICAgICAgZG93bi5lbWl0KG1ha2VFdmVudCgnZHJhZ2ZyZWVvbicpKTtcbiAgICAgICAgICAgICAgICBkcmFnZ2VkRWxlbWVudHMuZW1pdChtYWtlRXZlbnQoJ2RyYWdmcmVlJykpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBnb0ludG9Cb3hNb2RlKCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChkb3duICYmIGRvd24uZ3JhYmJlZCgpICYmIHIubm9kZUlzRHJhZ2dhYmxlKGRvd24pKSB7XG4gICAgICAgICAgICAvLyBkcmFnIG5vZGVcbiAgICAgICAgICAgIHZhciBqdXN0U3RhcnRlZERyYWcgPSAhci5kcmFnRGF0YS5kaWREcmFnO1xuICAgICAgICAgICAgaWYgKGp1c3RTdGFydGVkRHJhZykge1xuICAgICAgICAgICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHIuZHJhZ0RhdGEuZGlkRHJhZyA9IHRydWU7IC8vIGluZGljYXRlIHRoYXQgd2UgYWN0dWFsbHkgZGlkIGRyYWcgdGhlIG5vZGVcblxuICAgICAgICAgICAgLy8gbm93LCBhZGQgdGhlIGVsZW1lbnRzIHRvIHRoZSBkcmFnIGxheWVyIGlmIG5vdCBkb25lIGFscmVhZHlcbiAgICAgICAgICAgIGlmICghci5ob3ZlckRhdGEuZHJhZ2dpbmdFbGVzKSB7XG4gICAgICAgICAgICAgIGFkZE5vZGVzVG9EcmFnKGRyYWdnZWRFbGVtZW50cywge1xuICAgICAgICAgICAgICAgIGluRHJhZ0xheWVyOiB0cnVlXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHRvdGFsU2hpZnQgPSB7XG4gICAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICAgIHk6IDBcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAobnVtYmVyJDEoZGlzcFswXSkgJiYgbnVtYmVyJDEoZGlzcFsxXSkpIHtcbiAgICAgICAgICAgICAgdG90YWxTaGlmdC54ICs9IGRpc3BbMF07XG4gICAgICAgICAgICAgIHRvdGFsU2hpZnQueSArPSBkaXNwWzFdO1xuICAgICAgICAgICAgICBpZiAoanVzdFN0YXJ0ZWREcmFnKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRyYWdEZWx0YSA9IHIuaG92ZXJEYXRhLmRyYWdEZWx0YTtcbiAgICAgICAgICAgICAgICBpZiAoZHJhZ0RlbHRhICYmIG51bWJlciQxKGRyYWdEZWx0YVswXSkgJiYgbnVtYmVyJDEoZHJhZ0RlbHRhWzFdKSkge1xuICAgICAgICAgICAgICAgICAgdG90YWxTaGlmdC54ICs9IGRyYWdEZWx0YVswXTtcbiAgICAgICAgICAgICAgICAgIHRvdGFsU2hpZnQueSArPSBkcmFnRGVsdGFbMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByLmhvdmVyRGF0YS5kcmFnZ2luZ0VsZXMgPSB0cnVlO1xuICAgICAgICAgICAgZHJhZ2dlZEVsZW1lbnRzLnNpbGVudFNoaWZ0KHRvdGFsU2hpZnQpLmVtaXQobWFrZUV2ZW50KCdwb3NpdGlvbicpKS5lbWl0KG1ha2VFdmVudCgnZHJhZycpKTtcbiAgICAgICAgICAgIHIucmVkcmF3SGludCgnZHJhZycsIHRydWUpO1xuICAgICAgICAgICAgci5yZWRyYXcoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gb3RoZXJ3aXNlIHNhdmUgZHJhZyBkZWx0YSBmb3Igd2hlbiB3ZSBhY3R1YWxseSBzdGFydCBkcmFnZ2luZyBzbyB0aGUgcmVsYXRpdmUgZ3JhYiBwb3MgaXMgY29uc3RhbnRcbiAgICAgICAgICB1cGRhdGVEcmFnRGVsdGEoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBwcmV2ZW50IHRoZSBkcmFnZ2luZyBmcm9tIHRyaWdnZXJpbmcgdGV4dCBzZWxlY3Rpb24gb24gdGhlIHBhZ2VcbiAgICAgIHByZXZlbnREZWZhdWx0ID0gdHJ1ZTtcbiAgICB9XG4gICAgc2VsZWN0WzJdID0gcG9zWzBdO1xuICAgIHNlbGVjdFszXSA9IHBvc1sxXTtcbiAgICBpZiAocHJldmVudERlZmF1bHQpIHtcbiAgICAgIGlmIChlLnN0b3BQcm9wYWdhdGlvbikgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGlmIChlLnByZXZlbnREZWZhdWx0KSBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LCBmYWxzZSk7XG4gIHZhciBjbGlja1RpbWVvdXQsIGRpZERvdWJsZUNsaWNrLCBwcmV2Q2xpY2tUaW1lU3RhbXA7XG4gIHIucmVnaXN0ZXJCaW5kaW5nKGNvbnRhaW5lcldpbmRvdywgJ21vdXNldXAnLCBmdW5jdGlvbiBtb3VzZXVwSGFuZGxlcihlKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuICAgIC8vIGR1cmluZyBsZWZ0IG1vdXNlIGJ1dHRvbiBnZXN0dXJlcywgaWdub3JlIG90aGVyIGJ1dHRvbnNcbiAgICBpZiAoci5ob3ZlckRhdGEud2hpY2ggPT09IDEgJiYgZS53aGljaCAhPT0gMSAmJiByLmhvdmVyRGF0YS5jYXB0dXJlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBjYXB0dXJlID0gci5ob3ZlckRhdGEuY2FwdHVyZTtcbiAgICBpZiAoIWNhcHR1cmUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgci5ob3ZlckRhdGEuY2FwdHVyZSA9IGZhbHNlO1xuICAgIHZhciBjeSA9IHIuY3k7XG4gICAgdmFyIHBvcyA9IHIucHJvamVjdEludG9WaWV3cG9ydChlLmNsaWVudFgsIGUuY2xpZW50WSk7XG4gICAgdmFyIHNlbGVjdCA9IHIuc2VsZWN0aW9uO1xuICAgIHZhciBuZWFyID0gci5maW5kTmVhcmVzdEVsZW1lbnQocG9zWzBdLCBwb3NbMV0sIHRydWUsIGZhbHNlKTtcbiAgICB2YXIgZHJhZ2dlZEVsZW1lbnRzID0gci5kcmFnRGF0YS5wb3NzaWJsZURyYWdFbGVtZW50cztcbiAgICB2YXIgZG93biA9IHIuaG92ZXJEYXRhLmRvd247XG4gICAgdmFyIG11bHRTZWxLZXlEb3duID0gaXNNdWx0U2VsS2V5RG93bihlKTtcbiAgICBpZiAoci5kYXRhLmJnQWN0aXZlUG9zaXN0aW9uKSB7XG4gICAgICByLnJlZHJhd0hpbnQoJ3NlbGVjdCcsIHRydWUpO1xuICAgICAgci5yZWRyYXcoKTtcbiAgICB9XG4gICAgci5ob3ZlckRhdGEudGFwaG9sZENhbmNlbGxlZCA9IHRydWU7XG4gICAgci5kYXRhLmJnQWN0aXZlUG9zaXN0aW9uID0gdW5kZWZpbmVkOyAvLyBub3QgYWN0aXZlIGJnIG5vd1xuXG4gICAgaWYgKGRvd24pIHtcbiAgICAgIGRvd24udW5hY3RpdmF0ZSgpO1xuICAgIH1cbiAgICB2YXIgbWFrZUV2ZW50ID0gZnVuY3Rpb24gbWFrZUV2ZW50KHR5cGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICAgIHk6IHBvc1sxXVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH07XG4gICAgaWYgKHIuaG92ZXJEYXRhLndoaWNoID09PSAzKSB7XG4gICAgICB2YXIgY3h0RXZ0ID0gbWFrZUV2ZW50KCdjeHR0YXBlbmQnKTtcbiAgICAgIGlmIChkb3duKSB7XG4gICAgICAgIGRvd24uZW1pdChjeHRFdnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3kuZW1pdChjeHRFdnQpO1xuICAgICAgfVxuICAgICAgaWYgKCFyLmhvdmVyRGF0YS5jeHREcmFnZ2VkKSB7XG4gICAgICAgIHZhciBjeHRUYXAgPSBtYWtlRXZlbnQoJ2N4dHRhcCcpO1xuICAgICAgICBpZiAoZG93bikge1xuICAgICAgICAgIGRvd24uZW1pdChjeHRUYXApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN5LmVtaXQoY3h0VGFwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgci5ob3ZlckRhdGEuY3h0RHJhZ2dlZCA9IGZhbHNlO1xuICAgICAgci5ob3ZlckRhdGEud2hpY2ggPSBudWxsO1xuICAgIH0gZWxzZSBpZiAoci5ob3ZlckRhdGEud2hpY2ggPT09IDEpIHtcbiAgICAgIHRyaWdnZXJFdmVudHMobmVhciwgWydtb3VzZXVwJywgJ3RhcGVuZCcsICd2bW91c2V1cCddLCBlLCB7XG4gICAgICAgIHg6IHBvc1swXSxcbiAgICAgICAgeTogcG9zWzFdXG4gICAgICB9KTtcbiAgICAgIGlmICghci5kcmFnRGF0YS5kaWREcmFnICYmXG4gICAgICAvLyBkaWRuJ3QgbW92ZSBhIG5vZGUgYXJvdW5kXG4gICAgICAhci5ob3ZlckRhdGEuZHJhZ2dlZCAmJlxuICAgICAgLy8gZGlkbid0IHBhblxuICAgICAgIXIuaG92ZXJEYXRhLnNlbGVjdGluZyAmJlxuICAgICAgLy8gbm90IGJveCBzZWxlY3Rpb25cbiAgICAgICFyLmhvdmVyRGF0YS5pc092ZXJUaHJlc2hvbGREcmFnIC8vIGRpZG4ndCBtb3ZlIHRvbyBtdWNoXG4gICAgICApIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50cyhkb3duLCBbXCJjbGlja1wiLCBcInRhcFwiLCBcInZjbGlja1wiXSwgZSwge1xuICAgICAgICAgIHg6IHBvc1swXSxcbiAgICAgICAgICB5OiBwb3NbMV1cbiAgICAgICAgfSk7XG4gICAgICAgIGRpZERvdWJsZUNsaWNrID0gZmFsc2U7XG4gICAgICAgIGlmIChlLnRpbWVTdGFtcCAtIHByZXZDbGlja1RpbWVTdGFtcCA8PSBjeS5tdWx0aUNsaWNrRGVib3VuY2VUaW1lKCkpIHtcbiAgICAgICAgICBjbGlja1RpbWVvdXQgJiYgY2xlYXJUaW1lb3V0KGNsaWNrVGltZW91dCk7XG4gICAgICAgICAgZGlkRG91YmxlQ2xpY2sgPSB0cnVlO1xuICAgICAgICAgIHByZXZDbGlja1RpbWVTdGFtcCA9IG51bGw7XG4gICAgICAgICAgdHJpZ2dlckV2ZW50cyhkb3duLCBbXCJkYmxjbGlja1wiLCBcImRibHRhcFwiLCBcInZkYmxjbGlja1wiXSwgZSwge1xuICAgICAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICAgICAgeTogcG9zWzFdXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2xpY2tUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoZGlkRG91YmxlQ2xpY2spIHJldHVybjtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudHMoZG93biwgW1wib25lY2xpY2tcIiwgXCJvbmV0YXBcIiwgXCJ2b25lY2xpY2tcIl0sIGUsIHtcbiAgICAgICAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICAgICAgICB5OiBwb3NbMV1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sIGN5Lm11bHRpQ2xpY2tEZWJvdW5jZVRpbWUoKSk7XG4gICAgICAgICAgcHJldkNsaWNrVGltZVN0YW1wID0gZS50aW1lU3RhbXA7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRGVzZWxlY3QgYWxsIGVsZW1lbnRzIGlmIG5vdGhpbmcgaXMgY3VycmVudGx5IHVuZGVyIHRoZSBtb3VzZSBjdXJzb3IgYW5kIHdlIGFyZW4ndCBkcmFnZ2luZyBzb21ldGhpbmdcbiAgICAgIGlmIChkb3duID09IG51bGwgLy8gbm90IG1vdXNlZG93biBvbiBub2RlXG4gICAgICAmJiAhci5kcmFnRGF0YS5kaWREcmFnIC8vIGRpZG4ndCBtb3ZlIHRoZSBub2RlIGFyb3VuZFxuICAgICAgJiYgIXIuaG92ZXJEYXRhLnNlbGVjdGluZyAvLyBub3QgYm94IHNlbGVjdGlvblxuICAgICAgJiYgIXIuaG92ZXJEYXRhLmRyYWdnZWQgLy8gZGlkbid0IHBhblxuICAgICAgJiYgIWlzTXVsdFNlbEtleURvd24oZSkpIHtcbiAgICAgICAgY3kuJChpc1NlbGVjdGVkKS51bnNlbGVjdChbJ3RhcHVuc2VsZWN0J10pO1xuICAgICAgICBpZiAoZHJhZ2dlZEVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICByLmRyYWdEYXRhLnBvc3NpYmxlRHJhZ0VsZW1lbnRzID0gZHJhZ2dlZEVsZW1lbnRzID0gY3kuY29sbGVjdGlvbigpO1xuICAgICAgfVxuXG4gICAgICAvLyBTaW5nbGUgc2VsZWN0aW9uXG4gICAgICBpZiAobmVhciA9PSBkb3duICYmICFyLmRyYWdEYXRhLmRpZERyYWcgJiYgIXIuaG92ZXJEYXRhLnNlbGVjdGluZykge1xuICAgICAgICBpZiAobmVhciAhPSBudWxsICYmIG5lYXIuX3ByaXZhdGUuc2VsZWN0YWJsZSkge1xuICAgICAgICAgIGlmIChyLmhvdmVyRGF0YS5kcmFnZ2luZykgOyBlbHNlIGlmIChjeS5zZWxlY3Rpb25UeXBlKCkgPT09ICdhZGRpdGl2ZScgfHwgbXVsdFNlbEtleURvd24pIHtcbiAgICAgICAgICAgIGlmIChuZWFyLnNlbGVjdGVkKCkpIHtcbiAgICAgICAgICAgICAgbmVhci51bnNlbGVjdChbJ3RhcHVuc2VsZWN0J10pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbmVhci5zZWxlY3QoWyd0YXBzZWxlY3QnXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghbXVsdFNlbEtleURvd24pIHtcbiAgICAgICAgICAgICAgY3kuJChpc1NlbGVjdGVkKS51bm1lcmdlKG5lYXIpLnVuc2VsZWN0KFsndGFwdW5zZWxlY3QnXSk7XG4gICAgICAgICAgICAgIG5lYXIuc2VsZWN0KFsndGFwc2VsZWN0J10pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHIuaG92ZXJEYXRhLnNlbGVjdGluZykge1xuICAgICAgICB2YXIgYm94ID0gY3kuY29sbGVjdGlvbihyLmdldEFsbEluQm94KHNlbGVjdFswXSwgc2VsZWN0WzFdLCBzZWxlY3RbMl0sIHNlbGVjdFszXSkpO1xuICAgICAgICByLnJlZHJhd0hpbnQoJ3NlbGVjdCcsIHRydWUpO1xuICAgICAgICBpZiAoYm94Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBjeS5lbWl0KG1ha2VFdmVudCgnYm94ZW5kJykpO1xuICAgICAgICB2YXIgZWxlV291bGRCZVNlbGVjdGVkID0gZnVuY3Rpb24gZWxlV291bGRCZVNlbGVjdGVkKGVsZSkge1xuICAgICAgICAgIHJldHVybiBlbGUuc2VsZWN0YWJsZSgpICYmICFlbGUuc2VsZWN0ZWQoKTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGN5LnNlbGVjdGlvblR5cGUoKSA9PT0gJ2FkZGl0aXZlJykge1xuICAgICAgICAgIGJveC5lbWl0KG1ha2VFdmVudCgnYm94JykpLnN0ZEZpbHRlcihlbGVXb3VsZEJlU2VsZWN0ZWQpLnNlbGVjdCgpLmVtaXQobWFrZUV2ZW50KCdib3hzZWxlY3QnKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCFtdWx0U2VsS2V5RG93bikge1xuICAgICAgICAgICAgY3kuJChpc1NlbGVjdGVkKS51bm1lcmdlKGJveCkudW5zZWxlY3QoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYm94LmVtaXQobWFrZUV2ZW50KCdib3gnKSkuc3RkRmlsdGVyKGVsZVdvdWxkQmVTZWxlY3RlZCkuc2VsZWN0KCkuZW1pdChtYWtlRXZlbnQoJ2JveHNlbGVjdCcpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFsd2F5cyBuZWVkIHJlZHJhdyBpbiBjYXNlIGVsZXMgdW5zZWxlY3RhYmxlXG4gICAgICAgIHIucmVkcmF3KCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENhbmNlbCBkcmFnIHBhblxuICAgICAgaWYgKHIuaG92ZXJEYXRhLmRyYWdnaW5nKSB7XG4gICAgICAgIHIuaG92ZXJEYXRhLmRyYWdnaW5nID0gZmFsc2U7XG4gICAgICAgIHIucmVkcmF3SGludCgnc2VsZWN0JywgdHJ1ZSk7XG4gICAgICAgIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICAgICAgICByLnJlZHJhdygpO1xuICAgICAgfVxuICAgICAgaWYgKCFzZWxlY3RbNF0pIHtcbiAgICAgICAgci5yZWRyYXdIaW50KCdkcmFnJywgdHJ1ZSk7XG4gICAgICAgIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICAgICAgICB2YXIgZG93bldhc0dyYWJiZWQgPSBkb3duICYmIGRvd24uZ3JhYmJlZCgpO1xuICAgICAgICBmcmVlRHJhZ2dlZEVsZW1lbnRzKGRyYWdnZWRFbGVtZW50cyk7XG4gICAgICAgIGlmIChkb3duV2FzR3JhYmJlZCkge1xuICAgICAgICAgIGRvd24uZW1pdChtYWtlRXZlbnQoJ2ZyZWVvbicpKTtcbiAgICAgICAgICBkcmFnZ2VkRWxlbWVudHMuZW1pdChtYWtlRXZlbnQoJ2ZyZWUnKSk7XG4gICAgICAgICAgaWYgKHIuZHJhZ0RhdGEuZGlkRHJhZykge1xuICAgICAgICAgICAgZG93bi5lbWl0KG1ha2VFdmVudCgnZHJhZ2ZyZWVvbicpKTtcbiAgICAgICAgICAgIGRyYWdnZWRFbGVtZW50cy5lbWl0KG1ha2VFdmVudCgnZHJhZ2ZyZWUnKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSAvLyBlbHNlIG5vdCByaWdodCBtb3VzZVxuXG4gICAgc2VsZWN0WzRdID0gMDtcbiAgICByLmhvdmVyRGF0YS5kb3duID0gbnVsbDtcbiAgICByLmhvdmVyRGF0YS5jeHRTdGFydGVkID0gZmFsc2U7XG4gICAgci5ob3ZlckRhdGEuZHJhZ2dpbmdFbGVzID0gZmFsc2U7XG4gICAgci5ob3ZlckRhdGEuc2VsZWN0aW5nID0gZmFsc2U7XG4gICAgci5ob3ZlckRhdGEuaXNPdmVyVGhyZXNob2xkRHJhZyA9IGZhbHNlO1xuICAgIHIuZHJhZ0RhdGEuZGlkRHJhZyA9IGZhbHNlO1xuICAgIHIuaG92ZXJEYXRhLmRyYWdnZWQgPSBmYWxzZTtcbiAgICByLmhvdmVyRGF0YS5kcmFnRGVsdGEgPSBbXTtcbiAgICByLmhvdmVyRGF0YS5tZG93blBvcyA9IG51bGw7XG4gICAgci5ob3ZlckRhdGEubWRvd25HUG9zID0gbnVsbDtcbiAgICByLmhvdmVyRGF0YS53aGljaCA9IG51bGw7XG4gIH0sIGZhbHNlKTtcbiAgdmFyIHdoZWVsRGVsdGFzID0gW107IC8vIGxvZyBvZiBmaXJzdCBOIHdoZWVsIGRlbHRhcycgbWFnbml0dWRlc1xuICB2YXIgd2hlZWxEZWx0YU4gPSA0OyAvLyBob3cgbWFueSBldmVudHMgdG8gbG9nXG4gIHZhciBpbmFjY3VyYXRlU2Nyb2xsRGV2aWNlO1xuICB2YXIgaW5hY2N1cmF0ZVNjcm9sbEZhY3RvciA9IDEwMDAwMDsgLy8gYmFzZSBvZiBpbmFjY3VyYXRlIHdoZWVsIGRlbHRhcyAoZS5nLiBiYXNlIDUgY291bGQgeWllbGQgd2hlZWxzIG9mIDEwLCAyNSwgNTAsIGV0Yy4pXG5cbiAgdmFyIGFsbEFyZVNhbWVNYWduaXR1ZGUgPSBmdW5jdGlvbiBhbGxBcmVTYW1lTWFnbml0dWRlKGxpc3QpIHtcbiAgICB2YXIgZmlyc3RNYWcgPSBNYXRoLmFicyhsaXN0WzBdKTtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChNYXRoLmFicyhsaXN0W2ldKSAhPT0gZmlyc3RNYWcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbiAgdmFyIHdoZWVsSGFuZGxlciA9IGZ1bmN0aW9uIHdoZWVsSGFuZGxlcihlKSB7XG4gICAgdmFyIGNsYW1wID0gZmFsc2U7XG4gICAgdmFyIGRlbHRhID0gZS5kZWx0YVk7XG4gICAgaWYgKGRlbHRhID09IG51bGwpIHtcbiAgICAgIC8vIGNvbXBhdGliaWxpdHkgd2l0aCBvbGQgYnJvd3NlcnNcbiAgICAgIGlmIChlLndoZWVsRGVsdGFZICE9IG51bGwpIHtcbiAgICAgICAgZGVsdGEgPSBlLndoZWVsRGVsdGFZIC8gNDtcbiAgICAgIH0gZWxzZSBpZiAoZS53aGVlbERlbHRhICE9IG51bGwpIHtcbiAgICAgICAgZGVsdGEgPSBlLndoZWVsRGVsdGEgLyA0O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGVsdGEgPT09IDApIHtcbiAgICAgIHJldHVybjsgLy8gbm8gY2hhbmdlIGluIHpvb20gKEJ1ZzogWm9vbSBiZWNvbWVzIGVycmF0aWMgb24gcmFwaWQgc2Nyb2xsIGR1ZSB0byBkZWx0YVk6IDAgZXZlbnQgIzMzOTQpXG4gICAgfVxuICAgIGlmIChpbmFjY3VyYXRlU2Nyb2xsRGV2aWNlID09IG51bGwpIHtcbiAgICAgIGlmICh3aGVlbERlbHRhcy5sZW5ndGggPj0gd2hlZWxEZWx0YU4pIHtcbiAgICAgICAgLy8gdXNlIGxvZyB0byBkZXRlcm1pbmUgaWYgaW5hY2N1cmF0ZVxuICAgICAgICBpbmFjY3VyYXRlU2Nyb2xsRGV2aWNlID0gZmFsc2U7XG4gICAgICAgIHZhciB3ZHMgPSB3aGVlbERlbHRhcztcbiAgICAgICAgaWYgKHdkc1swXSA+PSA1KSB7XG4gICAgICAgICAgdmFyIGZhY3RvcjtcbiAgICAgICAgICAvLyBhbiBhcnJheSBvZiBlcXVhbCBpbnRlZ2VycyBcInhcIiB3aWxsIGhhdmUgYSBHQ0Qgb2YgeCwgc28gaW4gdGhhdFxuICAgICAgICAgIC8vIGNhc2UgdGhlcmUgaXMgbm8gbmVlZCB0byBoYXZlIGEgc2VwYXJhdGUgXCJhbGxBcmVTYW1lTWFnbml0dWRlXCJcbiAgICAgICAgICAvLyBjaGVjay4gYnV0IHRoZSBHQ0QgZnVuY3Rpb24gb25seSBzdXBwb3J0cyBpbnRlZ2Vycywgc28ga2VlcGluZ1xuICAgICAgICAgIC8vIGJvdGggY2hlY2tzIGFsbG93cyBhcnJheXMgb2YgZXF1YWwgZmxvYXRpbmctcG9pbnQgbnVtYmVyc1xuICAgICAgICAgIGlmIChhbGxBcmVTYW1lTWFnbml0dWRlKHdkcykpIHtcbiAgICAgICAgICAgIGZhY3RvciA9IHdkc1swXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmFjdG9yID0gZ2NkTXVsdGlwbGVaZXJvSWZOb25JbnQod2RzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGZhY3RvciA+IDEpIHtcbiAgICAgICAgICAgIGluYWNjdXJhdGVTY3JvbGxEZXZpY2UgPSB0cnVlO1xuICAgICAgICAgICAgaW5hY2N1cmF0ZVNjcm9sbEZhY3RvciA9IGZhY3RvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gY29uc29sZS5sb2coJ1NhbXBsZWQgd2hlZWwgZGVsdGFzOicsIHdkcyk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdpbmFjY3VyYXRlU2Nyb2xsRGV2aWNlOicsIGluYWNjdXJhdGVTY3JvbGxEZXZpY2UpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnaW5hY2N1cmF0ZVNjcm9sbEZhY3RvcjonLCBpbmFjY3VyYXRlU2Nyb2xsRmFjdG9yKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGNsYW1wIGFuZCBsb2cgdW50aWwgd2UgcmVhY2ggTlxuICAgICAgICB3aGVlbERlbHRhcy5wdXNoKE1hdGguYWJzKGRlbHRhKSk7XG4gICAgICAgIGNsYW1wID0gdHJ1ZTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ0NsYW1waW5nIGluaXRpYWwgd2hlZWwgZXZlbnRzIHVudGlsIHdlIGdldCBhIGdvb2Qgc2FtcGxlJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpbmFjY3VyYXRlU2Nyb2xsRGV2aWNlKSB7XG4gICAgICAvLyBrZWVwIHVwZGF0aW5nXG4gICAgICBpbmFjY3VyYXRlU2Nyb2xsRmFjdG9yID0gTWF0aC5taW4oTWF0aC5hYnMoZGVsdGEpLCBpbmFjY3VyYXRlU2Nyb2xsRmFjdG9yKTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdLZWVwIHVwZGF0aW5nIGluYWNjdXJhdGVTY3JvbGxGYWN0b3IgYmV5b25kIHNhbXBsZSBpbiBjYXNlIHdlIGRpZCBub3QgZ2V0IHRoZSBzbWFsbGVzdCBwb3NzaWJsZSB2YWw6JywgaW5hY2N1cmF0ZVNjcm9sbEZhY3Rvcik7XG4gICAgfVxuICAgIGlmIChyLnNjcm9sbGluZ1BhZ2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIHdoaWxlIHNjcm9sbGluZywgaWdub3JlIHdoZWVsLXRvLXpvb21cblxuICAgIHZhciBjeSA9IHIuY3k7XG4gICAgdmFyIHpvb20gPSBjeS56b29tKCk7XG4gICAgdmFyIHBhbiA9IGN5LnBhbigpO1xuICAgIHZhciBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZS5jbGllbnRYLCBlLmNsaWVudFkpO1xuICAgIHZhciBycG9zID0gW3Bvc1swXSAqIHpvb20gKyBwYW4ueCwgcG9zWzFdICogem9vbSArIHBhbi55XTtcbiAgICBpZiAoci5ob3ZlckRhdGEuZHJhZ2dpbmdFbGVzIHx8IHIuaG92ZXJEYXRhLmRyYWdnaW5nIHx8IHIuaG92ZXJEYXRhLmN4dFN0YXJ0ZWQgfHwgaW5Cb3hTZWxlY3Rpb24oKSkge1xuICAgICAgLy8gaWYgcGFuIGRyYWdnaW5nIG9yIGN4dCBkcmFnZ2luZywgd2hlZWwgbW92ZW1lbnRzIG1ha2Ugbm8gem9vbVxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoY3kucGFubmluZ0VuYWJsZWQoKSAmJiBjeS51c2VyUGFubmluZ0VuYWJsZWQoKSAmJiBjeS56b29taW5nRW5hYmxlZCgpICYmIGN5LnVzZXJab29taW5nRW5hYmxlZCgpKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICByLmRhdGEud2hlZWxab29taW5nID0gdHJ1ZTtcbiAgICAgIGNsZWFyVGltZW91dChyLmRhdGEud2hlZWxUaW1lb3V0KTtcbiAgICAgIHIuZGF0YS53aGVlbFRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgci5kYXRhLndoZWVsWm9vbWluZyA9IGZhbHNlO1xuICAgICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgICAgci5yZWRyYXcoKTtcbiAgICAgIH0sIDE1MCk7XG4gICAgICB2YXIgZGlmZjtcbiAgICAgIGlmIChjbGFtcCAmJiBNYXRoLmFicyhkZWx0YSkgPiA1KSB7XG4gICAgICAgIGRlbHRhID0gc2lnbnVtKGRlbHRhKSAqIDU7XG4gICAgICB9XG4gICAgICBkaWZmID0gZGVsdGEgLyAtMjUwO1xuICAgICAgaWYgKGluYWNjdXJhdGVTY3JvbGxEZXZpY2UpIHtcbiAgICAgICAgZGlmZiAvPSBpbmFjY3VyYXRlU2Nyb2xsRmFjdG9yO1xuICAgICAgICBkaWZmICo9IDM7XG4gICAgICB9XG4gICAgICBkaWZmID0gZGlmZiAqIHIud2hlZWxTZW5zaXRpdml0eTtcblxuICAgICAgLy8gY29uc29sZS5sb2coYGRlbHRhID0gJHtkZWx0YX0sIGRpZmYgPSAke2RpZmZ9LCBtb2RlID0gJHtlLmRlbHRhTW9kZX1gKVxuXG4gICAgICB2YXIgbmVlZHNXaGVlbEZpeCA9IGUuZGVsdGFNb2RlID09PSAxO1xuICAgICAgaWYgKG5lZWRzV2hlZWxGaXgpIHtcbiAgICAgICAgLy8gZml4ZXMgc2xvdyB3aGVlbCBldmVudHMgb24gZmYvbGludXggYW5kIGZmL3dpbmRvd3NcbiAgICAgICAgZGlmZiAqPSAzMztcbiAgICAgIH1cbiAgICAgIHZhciBuZXdab29tID0gY3kuem9vbSgpICogTWF0aC5wb3coMTAsIGRpZmYpO1xuICAgICAgaWYgKGUudHlwZSA9PT0gJ2dlc3R1cmVjaGFuZ2UnKSB7XG4gICAgICAgIG5ld1pvb20gPSByLmdlc3R1cmVTdGFydFpvb20gKiBlLnNjYWxlO1xuICAgICAgfVxuICAgICAgY3kuem9vbSh7XG4gICAgICAgIGxldmVsOiBuZXdab29tLFxuICAgICAgICByZW5kZXJlZFBvc2l0aW9uOiB7XG4gICAgICAgICAgeDogcnBvc1swXSxcbiAgICAgICAgICB5OiBycG9zWzFdXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY3kuZW1pdCh7XG4gICAgICAgIHR5cGU6IGUudHlwZSA9PT0gJ2dlc3R1cmVjaGFuZ2UnID8gJ3BpbmNoem9vbScgOiAnc2Nyb2xsem9vbScsXG4gICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICAgIHk6IHBvc1sxXVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgLy8gRnVuY3Rpb25zIHRvIGhlbHAgd2l0aCB3aGV0aGVyIG1vdXNlIHdoZWVsIHNob3VsZCB0cmlnZ2VyIHpvb21pbmdcbiAgLy8gLS1cbiAgci5yZWdpc3RlckJpbmRpbmcoci5jb250YWluZXIsICd3aGVlbCcsIHdoZWVsSGFuZGxlciwgdHJ1ZSk7XG5cbiAgLy8gZGlzYWJsZSBub25zdGFuZGFyZCB3aGVlbCBldmVudHNcbiAgLy8gci5yZWdpc3RlckJpbmRpbmcoci5jb250YWluZXIsICdtb3VzZXdoZWVsJywgd2hlZWxIYW5kbGVyLCB0cnVlKTtcbiAgLy8gci5yZWdpc3RlckJpbmRpbmcoci5jb250YWluZXIsICdET01Nb3VzZVNjcm9sbCcsIHdoZWVsSGFuZGxlciwgdHJ1ZSk7XG4gIC8vIHIucmVnaXN0ZXJCaW5kaW5nKHIuY29udGFpbmVyLCAnTW96TW91c2VQaXhlbFNjcm9sbCcsIHdoZWVsSGFuZGxlciwgdHJ1ZSk7IC8vIG9sZGVyIGZpcmVmb3hcblxuICByLnJlZ2lzdGVyQmluZGluZyhjb250YWluZXJXaW5kb3csICdzY3JvbGwnLCBmdW5jdGlvbiBzY3JvbGxIYW5kbGVyKGUpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgci5zY3JvbGxpbmdQYWdlID0gdHJ1ZTtcbiAgICBjbGVhclRpbWVvdXQoci5zY3JvbGxpbmdQYWdlVGltZW91dCk7XG4gICAgci5zY3JvbGxpbmdQYWdlVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgci5zY3JvbGxpbmdQYWdlID0gZmFsc2U7XG4gICAgfSwgMjUwKTtcbiAgfSwgdHJ1ZSk7XG5cbiAgLy8gZGVza3RvcCBzYWZhcmkgcGluY2ggdG8gem9vbSBzdGFydFxuICByLnJlZ2lzdGVyQmluZGluZyhyLmNvbnRhaW5lciwgJ2dlc3R1cmVzdGFydCcsIGZ1bmN0aW9uIGdlc3R1cmVTdGFydEhhbmRsZXIoZSkge1xuICAgIHIuZ2VzdHVyZVN0YXJ0Wm9vbSA9IHIuY3kuem9vbSgpO1xuICAgIGlmICghci5oYXNUb3VjaFN0YXJ0ZWQpIHtcbiAgICAgIC8vIGRvbid0IGFmZmVjdCB0b3VjaCBkZXZpY2VzIGxpa2UgaXBob25lXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9LCB0cnVlKTtcbiAgci5yZWdpc3RlckJpbmRpbmcoci5jb250YWluZXIsICdnZXN0dXJlY2hhbmdlJywgZnVuY3Rpb24gKGUpIHtcbiAgICBpZiAoIXIuaGFzVG91Y2hTdGFydGVkKSB7XG4gICAgICAvLyBkb24ndCBhZmZlY3QgdG91Y2ggZGV2aWNlcyBsaWtlIGlwaG9uZVxuICAgICAgd2hlZWxIYW5kbGVyKGUpO1xuICAgIH1cbiAgfSwgdHJ1ZSk7XG5cbiAgLy8gRnVuY3Rpb25zIHRvIGhlbHAgd2l0aCBoYW5kbGluZyBtb3VzZW91dC9tb3VzZW92ZXIgb24gdGhlIEN5dG9zY2FwZSBjb250YWluZXJcbiAgLy8gSGFuZGxlIG1vdXNlb3V0IG9uIEN5dG9zY2FwZSBjb250YWluZXJcbiAgci5yZWdpc3RlckJpbmRpbmcoci5jb250YWluZXIsICdtb3VzZW91dCcsIGZ1bmN0aW9uIG1vdXNlT3V0SGFuZGxlcihlKSB7XG4gICAgdmFyIHBvcyA9IHIucHJvamVjdEludG9WaWV3cG9ydChlLmNsaWVudFgsIGUuY2xpZW50WSk7XG4gICAgci5jeS5lbWl0KHtcbiAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICB0eXBlOiAnbW91c2VvdXQnLFxuICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICB5OiBwb3NbMV1cbiAgICAgIH1cbiAgICB9KTtcbiAgfSwgZmFsc2UpO1xuICByLnJlZ2lzdGVyQmluZGluZyhyLmNvbnRhaW5lciwgJ21vdXNlb3ZlcicsIGZ1bmN0aW9uIG1vdXNlT3ZlckhhbmRsZXIoZSkge1xuICAgIHZhciBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZS5jbGllbnRYLCBlLmNsaWVudFkpO1xuICAgIHIuY3kuZW1pdCh7XG4gICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgdHlwZTogJ21vdXNlb3ZlcicsXG4gICAgICBwb3NpdGlvbjoge1xuICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgIHk6IHBvc1sxXVxuICAgICAgfVxuICAgIH0pO1xuICB9LCBmYWxzZSk7XG4gIHZhciBmMXgxLCBmMXkxLCBmMngxLCBmMnkxOyAvLyBzdGFydGluZyBwb2ludHMgZm9yIHBpbmNoLXRvLXpvb21cbiAgdmFyIGRpc3RhbmNlMSwgZGlzdGFuY2UxU3E7IC8vIGluaXRpYWwgZGlzdGFuY2UgYmV0d2VlbiBmaW5nZXIgMSBhbmQgZmluZ2VyIDIgZm9yIHBpbmNoLXRvLXpvb21cbiAgdmFyIGNlbnRlcjEsIG1vZGVsQ2VudGVyMTsgLy8gY2VudGVyIHBvaW50IG9uIHN0YXJ0IHBpbmNoIHRvIHpvb21cbiAgdmFyIG9mZnNldExlZnQsIG9mZnNldFRvcDtcbiAgdmFyIGNvbnRhaW5lcldpZHRoLCBjb250YWluZXJIZWlnaHQ7XG4gIHZhciB0d29GaW5nZXJzU3RhcnRJbnNpZGU7XG4gIHZhciBkaXN0YW5jZSA9IGZ1bmN0aW9uIGRpc3RhbmNlKHgxLCB5MSwgeDIsIHkyKSB7XG4gICAgcmV0dXJuIE1hdGguc3FydCgoeDIgLSB4MSkgKiAoeDIgLSB4MSkgKyAoeTIgLSB5MSkgKiAoeTIgLSB5MSkpO1xuICB9O1xuICB2YXIgZGlzdGFuY2VTcSA9IGZ1bmN0aW9uIGRpc3RhbmNlU3EoeDEsIHkxLCB4MiwgeTIpIHtcbiAgICByZXR1cm4gKHgyIC0geDEpICogKHgyIC0geDEpICsgKHkyIC0geTEpICogKHkyIC0geTEpO1xuICB9O1xuICB2YXIgdG91Y2hzdGFydEhhbmRsZXI7XG4gIHIucmVnaXN0ZXJCaW5kaW5nKHIuY29udGFpbmVyLCAndG91Y2hzdGFydCcsIHRvdWNoc3RhcnRIYW5kbGVyID0gZnVuY3Rpb24gdG91Y2hzdGFydEhhbmRsZXIoZSkge1xuICAgIHIuaGFzVG91Y2hTdGFydGVkID0gdHJ1ZTtcbiAgICBpZiAoIWV2ZW50SW5Db250YWluZXIoZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYmx1ckFjdGl2ZURvbUVsZW1lbnQoKTtcbiAgICByLnRvdWNoRGF0YS5jYXB0dXJlID0gdHJ1ZTtcbiAgICByLmRhdGEuYmdBY3RpdmVQb3Npc3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgdmFyIGN5ID0gci5jeTtcbiAgICB2YXIgbm93ID0gci50b3VjaERhdGEubm93O1xuICAgIHZhciBlYXJsaWVyID0gci50b3VjaERhdGEuZWFybGllcjtcbiAgICBpZiAoZS50b3VjaGVzWzBdKSB7XG4gICAgICB2YXIgcG9zID0gci5wcm9qZWN0SW50b1ZpZXdwb3J0KGUudG91Y2hlc1swXS5jbGllbnRYLCBlLnRvdWNoZXNbMF0uY2xpZW50WSk7XG4gICAgICBub3dbMF0gPSBwb3NbMF07XG4gICAgICBub3dbMV0gPSBwb3NbMV07XG4gICAgfVxuICAgIGlmIChlLnRvdWNoZXNbMV0pIHtcbiAgICAgIHZhciBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZS50b3VjaGVzWzFdLmNsaWVudFgsIGUudG91Y2hlc1sxXS5jbGllbnRZKTtcbiAgICAgIG5vd1syXSA9IHBvc1swXTtcbiAgICAgIG5vd1szXSA9IHBvc1sxXTtcbiAgICB9XG4gICAgaWYgKGUudG91Y2hlc1syXSkge1xuICAgICAgdmFyIHBvcyA9IHIucHJvamVjdEludG9WaWV3cG9ydChlLnRvdWNoZXNbMl0uY2xpZW50WCwgZS50b3VjaGVzWzJdLmNsaWVudFkpO1xuICAgICAgbm93WzRdID0gcG9zWzBdO1xuICAgICAgbm93WzVdID0gcG9zWzFdO1xuICAgIH1cbiAgICB2YXIgbWFrZUV2ZW50ID0gZnVuY3Rpb24gbWFrZUV2ZW50KHR5cGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgeDogbm93WzBdLFxuICAgICAgICAgIHk6IG5vd1sxXVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH07XG5cbiAgICAvLyByZWNvcmQgc3RhcnRpbmcgcG9pbnRzIGZvciBwaW5jaC10by16b29tXG4gICAgaWYgKGUudG91Y2hlc1sxXSkge1xuICAgICAgci50b3VjaERhdGEuc2luZ2xlVG91Y2hNb3ZlZCA9IHRydWU7XG4gICAgICBmcmVlRHJhZ2dlZEVsZW1lbnRzKHIuZHJhZ0RhdGEudG91Y2hEcmFnRWxlcyk7XG4gICAgICB2YXIgb2Zmc2V0cyA9IHIuZmluZENvbnRhaW5lckNsaWVudENvb3JkcygpO1xuICAgICAgb2Zmc2V0TGVmdCA9IG9mZnNldHNbMF07XG4gICAgICBvZmZzZXRUb3AgPSBvZmZzZXRzWzFdO1xuICAgICAgY29udGFpbmVyV2lkdGggPSBvZmZzZXRzWzJdO1xuICAgICAgY29udGFpbmVySGVpZ2h0ID0gb2Zmc2V0c1szXTtcbiAgICAgIGYxeDEgPSBlLnRvdWNoZXNbMF0uY2xpZW50WCAtIG9mZnNldExlZnQ7XG4gICAgICBmMXkxID0gZS50b3VjaGVzWzBdLmNsaWVudFkgLSBvZmZzZXRUb3A7XG4gICAgICBmMngxID0gZS50b3VjaGVzWzFdLmNsaWVudFggLSBvZmZzZXRMZWZ0O1xuICAgICAgZjJ5MSA9IGUudG91Y2hlc1sxXS5jbGllbnRZIC0gb2Zmc2V0VG9wO1xuICAgICAgdHdvRmluZ2Vyc1N0YXJ0SW5zaWRlID0gMCA8PSBmMXgxICYmIGYxeDEgPD0gY29udGFpbmVyV2lkdGggJiYgMCA8PSBmMngxICYmIGYyeDEgPD0gY29udGFpbmVyV2lkdGggJiYgMCA8PSBmMXkxICYmIGYxeTEgPD0gY29udGFpbmVySGVpZ2h0ICYmIDAgPD0gZjJ5MSAmJiBmMnkxIDw9IGNvbnRhaW5lckhlaWdodDtcbiAgICAgIHZhciBwYW4gPSBjeS5wYW4oKTtcbiAgICAgIHZhciB6b29tID0gY3kuem9vbSgpO1xuICAgICAgZGlzdGFuY2UxID0gZGlzdGFuY2UoZjF4MSwgZjF5MSwgZjJ4MSwgZjJ5MSk7XG4gICAgICBkaXN0YW5jZTFTcSA9IGRpc3RhbmNlU3EoZjF4MSwgZjF5MSwgZjJ4MSwgZjJ5MSk7XG4gICAgICBjZW50ZXIxID0gWyhmMXgxICsgZjJ4MSkgLyAyLCAoZjF5MSArIGYyeTEpIC8gMl07XG4gICAgICBtb2RlbENlbnRlcjEgPSBbKGNlbnRlcjFbMF0gLSBwYW4ueCkgLyB6b29tLCAoY2VudGVyMVsxXSAtIHBhbi55KSAvIHpvb21dO1xuXG4gICAgICAvLyBjb25zaWRlciBjb250ZXh0IHRhcFxuICAgICAgdmFyIGN4dERpc3RUaHJlc2hvbGQgPSAyMDA7XG4gICAgICB2YXIgY3h0RGlzdFRocmVzaG9sZFNxID0gY3h0RGlzdFRocmVzaG9sZCAqIGN4dERpc3RUaHJlc2hvbGQ7XG4gICAgICBpZiAoZGlzdGFuY2UxU3EgPCBjeHREaXN0VGhyZXNob2xkU3EgJiYgIWUudG91Y2hlc1syXSkge1xuICAgICAgICB2YXIgbmVhcjEgPSByLmZpbmROZWFyZXN0RWxlbWVudChub3dbMF0sIG5vd1sxXSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHZhciBuZWFyMiA9IHIuZmluZE5lYXJlc3RFbGVtZW50KG5vd1syXSwgbm93WzNdLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgaWYgKG5lYXIxICYmIG5lYXIxLmlzTm9kZSgpKSB7XG4gICAgICAgICAgbmVhcjEuYWN0aXZhdGUoKS5lbWl0KG1ha2VFdmVudCgnY3h0dGFwc3RhcnQnKSk7XG4gICAgICAgICAgci50b3VjaERhdGEuc3RhcnQgPSBuZWFyMTtcbiAgICAgICAgfSBlbHNlIGlmIChuZWFyMiAmJiBuZWFyMi5pc05vZGUoKSkge1xuICAgICAgICAgIG5lYXIyLmFjdGl2YXRlKCkuZW1pdChtYWtlRXZlbnQoJ2N4dHRhcHN0YXJ0JykpO1xuICAgICAgICAgIHIudG91Y2hEYXRhLnN0YXJ0ID0gbmVhcjI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3kuZW1pdChtYWtlRXZlbnQoJ2N4dHRhcHN0YXJ0JykpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyLnRvdWNoRGF0YS5zdGFydCkge1xuICAgICAgICAgIHIudG91Y2hEYXRhLnN0YXJ0Ll9wcml2YXRlLmdyYWJiZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByLnRvdWNoRGF0YS5jeHQgPSB0cnVlO1xuICAgICAgICByLnRvdWNoRGF0YS5jeHREcmFnZ2VkID0gZmFsc2U7XG4gICAgICAgIHIuZGF0YS5iZ0FjdGl2ZVBvc2lzdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgci5yZWRyYXcoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZS50b3VjaGVzWzJdKSB7XG4gICAgICAvLyBpZ25vcmVcblxuICAgICAgLy8gc2FmYXJpIG9uIGlvcyBwYW5zIHRoZSBwYWdlIG90aGVyd2lzZSAobm9ybWFsbHkgeW91IHNob3VsZCBiZSBhYmxlIHRvIHByZXZlbnRkZWZhdWx0IG9uIHRvdWNobW92ZS4uLilcbiAgICAgIGlmIChjeS5ib3hTZWxlY3Rpb25FbmFibGVkKCkpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZS50b3VjaGVzWzFdKSA7IGVsc2UgaWYgKGUudG91Y2hlc1swXSkge1xuICAgICAgdmFyIG5lYXJzID0gci5maW5kTmVhcmVzdEVsZW1lbnRzKG5vd1swXSwgbm93WzFdLCB0cnVlLCB0cnVlKTtcbiAgICAgIHZhciBuZWFyID0gbmVhcnNbMF07XG4gICAgICBpZiAobmVhciAhPSBudWxsKSB7XG4gICAgICAgIG5lYXIuYWN0aXZhdGUoKTtcbiAgICAgICAgci50b3VjaERhdGEuc3RhcnQgPSBuZWFyO1xuICAgICAgICByLnRvdWNoRGF0YS5zdGFydHMgPSBuZWFycztcbiAgICAgICAgaWYgKHIubm9kZUlzR3JhYmJhYmxlKG5lYXIpKSB7XG4gICAgICAgICAgdmFyIGRyYWdnZWRFbGVzID0gci5kcmFnRGF0YS50b3VjaERyYWdFbGVzID0gY3kuY29sbGVjdGlvbigpO1xuICAgICAgICAgIHZhciBzZWxlY3RlZE5vZGVzID0gbnVsbDtcbiAgICAgICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgICAgICByLnJlZHJhd0hpbnQoJ2RyYWcnLCB0cnVlKTtcbiAgICAgICAgICBpZiAobmVhci5zZWxlY3RlZCgpKSB7XG4gICAgICAgICAgICAvLyByZXNldCBkcmFnIGVsZW1lbnRzLCBzaW5jZSBuZWFyIHdpbGwgYmUgYWRkZWQgYWdhaW5cblxuICAgICAgICAgICAgc2VsZWN0ZWROb2RlcyA9IGN5LiQoZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICAgICAgICByZXR1cm4gZWxlLnNlbGVjdGVkKCkgJiYgci5ub2RlSXNHcmFiYmFibGUoZWxlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYWRkTm9kZXNUb0RyYWcoc2VsZWN0ZWROb2Rlcywge1xuICAgICAgICAgICAgICBhZGRUb0xpc3Q6IGRyYWdnZWRFbGVzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWRkTm9kZVRvRHJhZyhuZWFyLCB7XG4gICAgICAgICAgICAgIGFkZFRvTGlzdDogZHJhZ2dlZEVsZXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZXRHcmFiVGFyZ2V0KG5lYXIpO1xuICAgICAgICAgIG5lYXIuZW1pdChtYWtlRXZlbnQoJ2dyYWJvbicpKTtcbiAgICAgICAgICBpZiAoc2VsZWN0ZWROb2Rlcykge1xuICAgICAgICAgICAgc2VsZWN0ZWROb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7XG4gICAgICAgICAgICAgIG4uZW1pdChtYWtlRXZlbnQoJ2dyYWInKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmVhci5lbWl0KG1ha2VFdmVudCgnZ3JhYicpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRyaWdnZXJFdmVudHMobmVhciwgWyd0b3VjaHN0YXJ0JywgJ3RhcHN0YXJ0JywgJ3Ztb3VzZWRvd24nXSwgZSwge1xuICAgICAgICB4OiBub3dbMF0sXG4gICAgICAgIHk6IG5vd1sxXVxuICAgICAgfSk7XG4gICAgICBpZiAobmVhciA9PSBudWxsKSB7XG4gICAgICAgIHIuZGF0YS5iZ0FjdGl2ZVBvc2lzdGlvbiA9IHtcbiAgICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgICAgeTogcG9zWzFdXG4gICAgICAgIH07XG4gICAgICAgIHIucmVkcmF3SGludCgnc2VsZWN0JywgdHJ1ZSk7XG4gICAgICAgIHIucmVkcmF3KCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFRhcCwgdGFwaG9sZFxuICAgICAgLy8gLS0tLS1cblxuICAgICAgci50b3VjaERhdGEuc2luZ2xlVG91Y2hNb3ZlZCA9IGZhbHNlO1xuICAgICAgci50b3VjaERhdGEuc2luZ2xlVG91Y2hTdGFydFRpbWUgPSArbmV3IERhdGUoKTtcbiAgICAgIGNsZWFyVGltZW91dChyLnRvdWNoRGF0YS50YXBob2xkVGltZW91dCk7XG4gICAgICByLnRvdWNoRGF0YS50YXBob2xkVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoci50b3VjaERhdGEuc2luZ2xlVG91Y2hNb3ZlZCA9PT0gZmFsc2UgJiYgIXIucGluY2hpbmcgLy8gaWYgcGluY2hpbmcsIHRoZW4gdGFwaG9sZCB1bnNlbGVjdCBzaG91bGRuJ3QgdGFrZSBlZmZlY3RcbiAgICAgICAgJiYgIXIudG91Y2hEYXRhLnNlbGVjdGluZyAvLyBib3ggc2VsZWN0aW9uIHNob3VsZG4ndCBhbGxvdyB0YXBob2xkIHRocm91Z2hcbiAgICAgICAgKSB7XG4gICAgICAgICAgdHJpZ2dlckV2ZW50cyhyLnRvdWNoRGF0YS5zdGFydCwgWyd0YXBob2xkJ10sIGUsIHtcbiAgICAgICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgICAgIHk6IG5vd1sxXVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LCByLnRhcGhvbGREdXJhdGlvbik7XG4gICAgfVxuICAgIGlmIChlLnRvdWNoZXMubGVuZ3RoID49IDEpIHtcbiAgICAgIHZhciBzUG9zID0gci50b3VjaERhdGEuc3RhcnRQb3NpdGlvbiA9IFtudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm93Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHNQb3NbaV0gPSBlYXJsaWVyW2ldID0gbm93W2ldO1xuICAgICAgfVxuICAgICAgdmFyIHRvdWNoMCA9IGUudG91Y2hlc1swXTtcbiAgICAgIHIudG91Y2hEYXRhLnN0YXJ0R1Bvc2l0aW9uID0gW3RvdWNoMC5jbGllbnRYLCB0b3VjaDAuY2xpZW50WV07XG4gICAgfVxuICB9LCBmYWxzZSk7XG4gIHZhciB0b3VjaG1vdmVIYW5kbGVyO1xuICByLnJlZ2lzdGVyQmluZGluZyhjb250YWluZXJXaW5kb3csICd0b3VjaG1vdmUnLCB0b3VjaG1vdmVIYW5kbGVyID0gZnVuY3Rpb24gdG91Y2htb3ZlSGFuZGxlcihlKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuICAgIHZhciBjYXB0dXJlID0gci50b3VjaERhdGEuY2FwdHVyZTtcbiAgICBpZiAoIWNhcHR1cmUgJiYgIWV2ZW50SW5Db250YWluZXIoZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHNlbGVjdCA9IHIuc2VsZWN0aW9uO1xuICAgIHZhciBjeSA9IHIuY3k7XG4gICAgdmFyIG5vdyA9IHIudG91Y2hEYXRhLm5vdztcbiAgICB2YXIgZWFybGllciA9IHIudG91Y2hEYXRhLmVhcmxpZXI7XG4gICAgdmFyIHpvb20gPSBjeS56b29tKCk7XG4gICAgaWYgKGUudG91Y2hlc1swXSkge1xuICAgICAgdmFyIHBvcyA9IHIucHJvamVjdEludG9WaWV3cG9ydChlLnRvdWNoZXNbMF0uY2xpZW50WCwgZS50b3VjaGVzWzBdLmNsaWVudFkpO1xuICAgICAgbm93WzBdID0gcG9zWzBdO1xuICAgICAgbm93WzFdID0gcG9zWzFdO1xuICAgIH1cbiAgICBpZiAoZS50b3VjaGVzWzFdKSB7XG4gICAgICB2YXIgcG9zID0gci5wcm9qZWN0SW50b1ZpZXdwb3J0KGUudG91Y2hlc1sxXS5jbGllbnRYLCBlLnRvdWNoZXNbMV0uY2xpZW50WSk7XG4gICAgICBub3dbMl0gPSBwb3NbMF07XG4gICAgICBub3dbM10gPSBwb3NbMV07XG4gICAgfVxuICAgIGlmIChlLnRvdWNoZXNbMl0pIHtcbiAgICAgIHZhciBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZS50b3VjaGVzWzJdLmNsaWVudFgsIGUudG91Y2hlc1syXS5jbGllbnRZKTtcbiAgICAgIG5vd1s0XSA9IHBvc1swXTtcbiAgICAgIG5vd1s1XSA9IHBvc1sxXTtcbiAgICB9XG4gICAgdmFyIG1ha2VFdmVudCA9IGZ1bmN0aW9uIG1ha2VFdmVudCh0eXBlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgICB5OiBub3dbMV1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9O1xuICAgIHZhciBzdGFydEdQb3MgPSByLnRvdWNoRGF0YS5zdGFydEdQb3NpdGlvbjtcbiAgICB2YXIgaXNPdmVyVGhyZXNob2xkRHJhZztcbiAgICBpZiAoY2FwdHVyZSAmJiBlLnRvdWNoZXNbMF0gJiYgc3RhcnRHUG9zKSB7XG4gICAgICB2YXIgZGlzcCA9IFtdO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBub3cubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgZGlzcFtqXSA9IG5vd1tqXSAtIGVhcmxpZXJbal07XG4gICAgICB9XG4gICAgICB2YXIgZHggPSBlLnRvdWNoZXNbMF0uY2xpZW50WCAtIHN0YXJ0R1Bvc1swXTtcbiAgICAgIHZhciBkeDIgPSBkeCAqIGR4O1xuICAgICAgdmFyIGR5ID0gZS50b3VjaGVzWzBdLmNsaWVudFkgLSBzdGFydEdQb3NbMV07XG4gICAgICB2YXIgZHkyID0gZHkgKiBkeTtcbiAgICAgIHZhciBkaXN0MiA9IGR4MiArIGR5MjtcbiAgICAgIGlzT3ZlclRocmVzaG9sZERyYWcgPSBkaXN0MiA+PSByLnRvdWNoVGFwVGhyZXNob2xkMjtcbiAgICB9XG5cbiAgICAvLyBjb250ZXh0IHN3aXBlIGNhbmNlbGxpbmdcbiAgICBpZiAoY2FwdHVyZSAmJiByLnRvdWNoRGF0YS5jeHQpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHZhciBmMXgyID0gZS50b3VjaGVzWzBdLmNsaWVudFggLSBvZmZzZXRMZWZ0LFxuICAgICAgICBmMXkyID0gZS50b3VjaGVzWzBdLmNsaWVudFkgLSBvZmZzZXRUb3A7XG4gICAgICB2YXIgZjJ4MiA9IGUudG91Y2hlc1sxXS5jbGllbnRYIC0gb2Zmc2V0TGVmdCxcbiAgICAgICAgZjJ5MiA9IGUudG91Y2hlc1sxXS5jbGllbnRZIC0gb2Zmc2V0VG9wO1xuICAgICAgLy8gdmFyIGRpc3RhbmNlMiA9IGRpc3RhbmNlKCBmMXgyLCBmMXkyLCBmMngyLCBmMnkyICk7XG4gICAgICB2YXIgZGlzdGFuY2UyU3EgPSBkaXN0YW5jZVNxKGYxeDIsIGYxeTIsIGYyeDIsIGYyeTIpO1xuICAgICAgdmFyIGZhY3RvclNxID0gZGlzdGFuY2UyU3EgLyBkaXN0YW5jZTFTcTtcbiAgICAgIHZhciBkaXN0VGhyZXNob2xkID0gMTUwO1xuICAgICAgdmFyIGRpc3RUaHJlc2hvbGRTcSA9IGRpc3RUaHJlc2hvbGQgKiBkaXN0VGhyZXNob2xkO1xuICAgICAgdmFyIGZhY3RvclRocmVzaG9sZCA9IDEuNTtcbiAgICAgIHZhciBmYWN0b3JUaHJlc2hvbGRTcSA9IGZhY3RvclRocmVzaG9sZCAqIGZhY3RvclRocmVzaG9sZDtcblxuICAgICAgLy8gY2FuY2VsIGN0eCBnZXN0dXJlcyBpZiB0aGUgZGlzdGFuY2UgYi90IHRoZSBmaW5nZXJzIGluY3JlYXNlc1xuICAgICAgaWYgKGZhY3RvclNxID49IGZhY3RvclRocmVzaG9sZFNxIHx8IGRpc3RhbmNlMlNxID49IGRpc3RUaHJlc2hvbGRTcSkge1xuICAgICAgICByLnRvdWNoRGF0YS5jeHQgPSBmYWxzZTtcbiAgICAgICAgci5kYXRhLmJnQWN0aXZlUG9zaXN0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgICByLnJlZHJhd0hpbnQoJ3NlbGVjdCcsIHRydWUpO1xuICAgICAgICB2YXIgY3h0RXZ0ID0gbWFrZUV2ZW50KCdjeHR0YXBlbmQnKTtcbiAgICAgICAgaWYgKHIudG91Y2hEYXRhLnN0YXJ0KSB7XG4gICAgICAgICAgci50b3VjaERhdGEuc3RhcnQudW5hY3RpdmF0ZSgpLmVtaXQoY3h0RXZ0KTtcbiAgICAgICAgICByLnRvdWNoRGF0YS5zdGFydCA9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3kuZW1pdChjeHRFdnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gY29udGV4dCBzd2lwZVxuICAgIGlmIChjYXB0dXJlICYmIHIudG91Y2hEYXRhLmN4dCkge1xuICAgICAgdmFyIGN4dEV2dCA9IG1ha2VFdmVudCgnY3h0ZHJhZycpO1xuICAgICAgci5kYXRhLmJnQWN0aXZlUG9zaXN0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgci5yZWRyYXdIaW50KCdzZWxlY3QnLCB0cnVlKTtcbiAgICAgIGlmIChyLnRvdWNoRGF0YS5zdGFydCkge1xuICAgICAgICByLnRvdWNoRGF0YS5zdGFydC5lbWl0KGN4dEV2dCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjeS5lbWl0KGN4dEV2dCk7XG4gICAgICB9XG4gICAgICBpZiAoci50b3VjaERhdGEuc3RhcnQpIHtcbiAgICAgICAgci50b3VjaERhdGEuc3RhcnQuX3ByaXZhdGUuZ3JhYmJlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgci50b3VjaERhdGEuY3h0RHJhZ2dlZCA9IHRydWU7XG4gICAgICB2YXIgbmVhciA9IHIuZmluZE5lYXJlc3RFbGVtZW50KG5vd1swXSwgbm93WzFdLCB0cnVlLCB0cnVlKTtcbiAgICAgIGlmICghci50b3VjaERhdGEuY3h0T3ZlciB8fCBuZWFyICE9PSByLnRvdWNoRGF0YS5jeHRPdmVyKSB7XG4gICAgICAgIGlmIChyLnRvdWNoRGF0YS5jeHRPdmVyKSB7XG4gICAgICAgICAgci50b3VjaERhdGEuY3h0T3Zlci5lbWl0KG1ha2VFdmVudCgnY3h0ZHJhZ291dCcpKTtcbiAgICAgICAgfVxuICAgICAgICByLnRvdWNoRGF0YS5jeHRPdmVyID0gbmVhcjtcbiAgICAgICAgaWYgKG5lYXIpIHtcbiAgICAgICAgICBuZWFyLmVtaXQobWFrZUV2ZW50KCdjeHRkcmFnb3ZlcicpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBib3ggc2VsZWN0aW9uXG4gICAgfSBlbHNlIGlmIChjYXB0dXJlICYmIGUudG91Y2hlc1syXSAmJiBjeS5ib3hTZWxlY3Rpb25FbmFibGVkKCkpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHIuZGF0YS5iZ0FjdGl2ZVBvc2lzdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMubGFzdFRocmVlVG91Y2ggPSArbmV3IERhdGUoKTtcbiAgICAgIGlmICghci50b3VjaERhdGEuc2VsZWN0aW5nKSB7XG4gICAgICAgIGN5LmVtaXQobWFrZUV2ZW50KCdib3hzdGFydCcpKTtcbiAgICAgIH1cbiAgICAgIHIudG91Y2hEYXRhLnNlbGVjdGluZyA9IHRydWU7XG4gICAgICByLnRvdWNoRGF0YS5kaWRTZWxlY3QgPSB0cnVlO1xuICAgICAgc2VsZWN0WzRdID0gMTtcbiAgICAgIGlmICghc2VsZWN0IHx8IHNlbGVjdC5sZW5ndGggPT09IDAgfHwgc2VsZWN0WzBdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc2VsZWN0WzBdID0gKG5vd1swXSArIG5vd1syXSArIG5vd1s0XSkgLyAzO1xuICAgICAgICBzZWxlY3RbMV0gPSAobm93WzFdICsgbm93WzNdICsgbm93WzVdKSAvIDM7XG4gICAgICAgIHNlbGVjdFsyXSA9IChub3dbMF0gKyBub3dbMl0gKyBub3dbNF0pIC8gMyArIDE7XG4gICAgICAgIHNlbGVjdFszXSA9IChub3dbMV0gKyBub3dbM10gKyBub3dbNV0pIC8gMyArIDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxlY3RbMl0gPSAobm93WzBdICsgbm93WzJdICsgbm93WzRdKSAvIDM7XG4gICAgICAgIHNlbGVjdFszXSA9IChub3dbMV0gKyBub3dbM10gKyBub3dbNV0pIC8gMztcbiAgICAgIH1cbiAgICAgIHIucmVkcmF3SGludCgnc2VsZWN0JywgdHJ1ZSk7XG4gICAgICByLnJlZHJhdygpO1xuXG4gICAgICAvLyBwaW5jaCB0byB6b29tXG4gICAgfSBlbHNlIGlmIChjYXB0dXJlICYmIGUudG91Y2hlc1sxXSAmJiAhci50b3VjaERhdGEuZGlkU2VsZWN0IC8vIGRvbid0IGFsbG93IGJveCBzZWxlY3Rpb24gdG8gZGVncmFkZSB0byBwaW5jaC10by16b29tXG4gICAgJiYgY3kuem9vbWluZ0VuYWJsZWQoKSAmJiBjeS5wYW5uaW5nRW5hYmxlZCgpICYmIGN5LnVzZXJab29taW5nRW5hYmxlZCgpICYmIGN5LnVzZXJQYW5uaW5nRW5hYmxlZCgpKSB7XG4gICAgICAvLyB0d28gZmluZ2VycyA9PiBwaW5jaCB0byB6b29tXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICByLmRhdGEuYmdBY3RpdmVQb3Npc3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgICByLnJlZHJhd0hpbnQoJ3NlbGVjdCcsIHRydWUpO1xuICAgICAgdmFyIGRyYWdnZWRFbGVzID0gci5kcmFnRGF0YS50b3VjaERyYWdFbGVzO1xuICAgICAgaWYgKGRyYWdnZWRFbGVzKSB7XG4gICAgICAgIHIucmVkcmF3SGludCgnZHJhZycsIHRydWUpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRyYWdnZWRFbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGRlX3AgPSBkcmFnZ2VkRWxlc1tpXS5fcHJpdmF0ZTtcbiAgICAgICAgICBkZV9wLmdyYWJiZWQgPSBmYWxzZTtcbiAgICAgICAgICBkZV9wLnJzY3JhdGNoLmluRHJhZ0xheWVyID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBfc3RhcnQgPSByLnRvdWNoRGF0YS5zdGFydDtcblxuICAgICAgLy8gKHgyLCB5MikgZm9yIGZpbmdlcnMgMSBhbmQgMlxuICAgICAgdmFyIGYxeDIgPSBlLnRvdWNoZXNbMF0uY2xpZW50WCAtIG9mZnNldExlZnQsXG4gICAgICAgIGYxeTIgPSBlLnRvdWNoZXNbMF0uY2xpZW50WSAtIG9mZnNldFRvcDtcbiAgICAgIHZhciBmMngyID0gZS50b3VjaGVzWzFdLmNsaWVudFggLSBvZmZzZXRMZWZ0LFxuICAgICAgICBmMnkyID0gZS50b3VjaGVzWzFdLmNsaWVudFkgLSBvZmZzZXRUb3A7XG4gICAgICB2YXIgZGlzdGFuY2UyID0gZGlzdGFuY2UoZjF4MiwgZjF5MiwgZjJ4MiwgZjJ5Mik7XG4gICAgICAvLyB2YXIgZGlzdGFuY2UyU3EgPSBkaXN0YW5jZVNxKCBmMXgyLCBmMXkyLCBmMngyLCBmMnkyICk7XG4gICAgICAvLyB2YXIgZmFjdG9yID0gTWF0aC5zcXJ0KCBkaXN0YW5jZTJTcSApIC8gTWF0aC5zcXJ0KCBkaXN0YW5jZTFTcSApO1xuICAgICAgdmFyIGZhY3RvciA9IGRpc3RhbmNlMiAvIGRpc3RhbmNlMTtcbiAgICAgIGlmICh0d29GaW5nZXJzU3RhcnRJbnNpZGUpIHtcbiAgICAgICAgLy8gZGVsdGEgZmluZ2VyMVxuICAgICAgICB2YXIgZGYxeCA9IGYxeDIgLSBmMXgxO1xuICAgICAgICB2YXIgZGYxeSA9IGYxeTIgLSBmMXkxO1xuXG4gICAgICAgIC8vIGRlbHRhIGZpbmdlciAyXG4gICAgICAgIHZhciBkZjJ4ID0gZjJ4MiAtIGYyeDE7XG4gICAgICAgIHZhciBkZjJ5ID0gZjJ5MiAtIGYyeTE7XG5cbiAgICAgICAgLy8gdHJhbnNsYXRpb24gaXMgdGhlIG5vcm1hbGlzZWQgdmVjdG9yIG9mIHRoZSB0d28gZmluZ2VycyBtb3ZlbWVudFxuICAgICAgICAvLyBpLmUuIHNvIHBpbmNoaW5nIGNhbmNlbHMgb3V0IGFuZCBtb3ZpbmcgdG9nZXRoZXIgcGFuc1xuICAgICAgICB2YXIgdHggPSAoZGYxeCArIGRmMngpIC8gMjtcbiAgICAgICAgdmFyIHR5ID0gKGRmMXkgKyBkZjJ5KSAvIDI7XG5cbiAgICAgICAgLy8gbm93IGNhbGN1bGF0ZSB0aGUgem9vbVxuICAgICAgICB2YXIgem9vbTEgPSBjeS56b29tKCk7XG4gICAgICAgIHZhciB6b29tMiA9IHpvb20xICogZmFjdG9yO1xuICAgICAgICB2YXIgcGFuMSA9IGN5LnBhbigpO1xuXG4gICAgICAgIC8vIHRoZSBtb2RlbCBjZW50ZXIgcG9pbnQgY29udmVydGVkIHRvIHRoZSBjdXJyZW50IHJlbmRlcmVkIHBvc1xuICAgICAgICB2YXIgY3RyeCA9IG1vZGVsQ2VudGVyMVswXSAqIHpvb20xICsgcGFuMS54O1xuICAgICAgICB2YXIgY3RyeSA9IG1vZGVsQ2VudGVyMVsxXSAqIHpvb20xICsgcGFuMS55O1xuICAgICAgICB2YXIgcGFuMiA9IHtcbiAgICAgICAgICB4OiAtem9vbTIgLyB6b29tMSAqIChjdHJ4IC0gcGFuMS54IC0gdHgpICsgY3RyeCxcbiAgICAgICAgICB5OiAtem9vbTIgLyB6b29tMSAqIChjdHJ5IC0gcGFuMS55IC0gdHkpICsgY3RyeVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIHJlbW92ZSBkcmFnZ2VkIGVsZXNcbiAgICAgICAgaWYgKF9zdGFydCAmJiBfc3RhcnQuYWN0aXZlKCkpIHtcbiAgICAgICAgICB2YXIgZHJhZ2dlZEVsZXMgPSByLmRyYWdEYXRhLnRvdWNoRHJhZ0VsZXM7XG4gICAgICAgICAgZnJlZURyYWdnZWRFbGVtZW50cyhkcmFnZ2VkRWxlcyk7XG4gICAgICAgICAgci5yZWRyYXdIaW50KCdkcmFnJywgdHJ1ZSk7XG4gICAgICAgICAgci5yZWRyYXdIaW50KCdlbGVzJywgdHJ1ZSk7XG4gICAgICAgICAgX3N0YXJ0LnVuYWN0aXZhdGUoKS5lbWl0KG1ha2VFdmVudCgnZnJlZW9uJykpO1xuICAgICAgICAgIGlmIChkcmFnZ2VkRWxlcykge1xuICAgICAgICAgICAgZHJhZ2dlZEVsZXMuZW1pdChtYWtlRXZlbnQoJ2ZyZWUnKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyLmRyYWdEYXRhLmRpZERyYWcpIHtcbiAgICAgICAgICAgIF9zdGFydC5lbWl0KG1ha2VFdmVudCgnZHJhZ2ZyZWVvbicpKTtcbiAgICAgICAgICAgIGlmIChkcmFnZ2VkRWxlcykge1xuICAgICAgICAgICAgICBkcmFnZ2VkRWxlcy5lbWl0KG1ha2VFdmVudCgnZHJhZ2ZyZWUnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGN5LnZpZXdwb3J0KHtcbiAgICAgICAgICB6b29tOiB6b29tMixcbiAgICAgICAgICBwYW46IHBhbjIsXG4gICAgICAgICAgY2FuY2VsT25GYWlsZWRab29tOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBjeS5lbWl0KG1ha2VFdmVudCgncGluY2h6b29tJykpO1xuICAgICAgICBkaXN0YW5jZTEgPSBkaXN0YW5jZTI7XG4gICAgICAgIGYxeDEgPSBmMXgyO1xuICAgICAgICBmMXkxID0gZjF5MjtcbiAgICAgICAgZjJ4MSA9IGYyeDI7XG4gICAgICAgIGYyeTEgPSBmMnkyO1xuICAgICAgICByLnBpbmNoaW5nID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gUmUtcHJvamVjdFxuICAgICAgaWYgKGUudG91Y2hlc1swXSkge1xuICAgICAgICB2YXIgcG9zID0gci5wcm9qZWN0SW50b1ZpZXdwb3J0KGUudG91Y2hlc1swXS5jbGllbnRYLCBlLnRvdWNoZXNbMF0uY2xpZW50WSk7XG4gICAgICAgIG5vd1swXSA9IHBvc1swXTtcbiAgICAgICAgbm93WzFdID0gcG9zWzFdO1xuICAgICAgfVxuICAgICAgaWYgKGUudG91Y2hlc1sxXSkge1xuICAgICAgICB2YXIgcG9zID0gci5wcm9qZWN0SW50b1ZpZXdwb3J0KGUudG91Y2hlc1sxXS5jbGllbnRYLCBlLnRvdWNoZXNbMV0uY2xpZW50WSk7XG4gICAgICAgIG5vd1syXSA9IHBvc1swXTtcbiAgICAgICAgbm93WzNdID0gcG9zWzFdO1xuICAgICAgfVxuICAgICAgaWYgKGUudG91Y2hlc1syXSkge1xuICAgICAgICB2YXIgcG9zID0gci5wcm9qZWN0SW50b1ZpZXdwb3J0KGUudG91Y2hlc1syXS5jbGllbnRYLCBlLnRvdWNoZXNbMl0uY2xpZW50WSk7XG4gICAgICAgIG5vd1s0XSA9IHBvc1swXTtcbiAgICAgICAgbm93WzVdID0gcG9zWzFdO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZS50b3VjaGVzWzBdICYmICFyLnRvdWNoRGF0YS5kaWRTZWxlY3QgLy8gZG9uJ3QgYWxsb3cgYm94IHNlbGVjdGlvbiB0byBkZWdyYWRlIHRvIHNpbmdsZSBmaW5nZXIgZXZlbnRzIGxpa2UgcGFubmluZ1xuICAgICkge1xuICAgICAgdmFyIHN0YXJ0ID0gci50b3VjaERhdGEuc3RhcnQ7XG4gICAgICB2YXIgbGFzdCA9IHIudG91Y2hEYXRhLmxhc3Q7XG4gICAgICB2YXIgbmVhcjtcbiAgICAgIGlmICghci5ob3ZlckRhdGEuZHJhZ2dpbmdFbGVzICYmICFyLnN3aXBlUGFubmluZykge1xuICAgICAgICBuZWFyID0gci5maW5kTmVhcmVzdEVsZW1lbnQobm93WzBdLCBub3dbMV0sIHRydWUsIHRydWUpO1xuICAgICAgfVxuICAgICAgaWYgKGNhcHR1cmUgJiYgc3RhcnQgIT0gbnVsbCkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIC8vIGRyYWdnaW5nIG5vZGVzXG4gICAgICBpZiAoY2FwdHVyZSAmJiBzdGFydCAhPSBudWxsICYmIHIubm9kZUlzRHJhZ2dhYmxlKHN0YXJ0KSkge1xuICAgICAgICBpZiAoaXNPdmVyVGhyZXNob2xkRHJhZykge1xuICAgICAgICAgIC8vIHRoZW4gZHJhZ2dpbmcgY2FuIGhhcHBlblxuICAgICAgICAgIHZhciBkcmFnZ2VkRWxlcyA9IHIuZHJhZ0RhdGEudG91Y2hEcmFnRWxlcztcbiAgICAgICAgICB2YXIganVzdFN0YXJ0ZWREcmFnID0gIXIuZHJhZ0RhdGEuZGlkRHJhZztcbiAgICAgICAgICBpZiAoanVzdFN0YXJ0ZWREcmFnKSB7XG4gICAgICAgICAgICBhZGROb2Rlc1RvRHJhZyhkcmFnZ2VkRWxlcywge1xuICAgICAgICAgICAgICBpbkRyYWdMYXllcjogdHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHIuZHJhZ0RhdGEuZGlkRHJhZyA9IHRydWU7XG4gICAgICAgICAgdmFyIHRvdGFsU2hpZnQgPSB7XG4gICAgICAgICAgICB4OiAwLFxuICAgICAgICAgICAgeTogMFxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKG51bWJlciQxKGRpc3BbMF0pICYmIG51bWJlciQxKGRpc3BbMV0pKSB7XG4gICAgICAgICAgICB0b3RhbFNoaWZ0LnggKz0gZGlzcFswXTtcbiAgICAgICAgICAgIHRvdGFsU2hpZnQueSArPSBkaXNwWzFdO1xuICAgICAgICAgICAgaWYgKGp1c3RTdGFydGVkRHJhZykge1xuICAgICAgICAgICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgICAgICAgICAgdmFyIGRyYWdEZWx0YSA9IHIudG91Y2hEYXRhLmRyYWdEZWx0YTtcbiAgICAgICAgICAgICAgaWYgKGRyYWdEZWx0YSAmJiBudW1iZXIkMShkcmFnRGVsdGFbMF0pICYmIG51bWJlciQxKGRyYWdEZWx0YVsxXSkpIHtcbiAgICAgICAgICAgICAgICB0b3RhbFNoaWZ0LnggKz0gZHJhZ0RlbHRhWzBdO1xuICAgICAgICAgICAgICAgIHRvdGFsU2hpZnQueSArPSBkcmFnRGVsdGFbMV07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgci5ob3ZlckRhdGEuZHJhZ2dpbmdFbGVzID0gdHJ1ZTtcbiAgICAgICAgICBkcmFnZ2VkRWxlcy5zaWxlbnRTaGlmdCh0b3RhbFNoaWZ0KS5lbWl0KG1ha2VFdmVudCgncG9zaXRpb24nKSkuZW1pdChtYWtlRXZlbnQoJ2RyYWcnKSk7XG4gICAgICAgICAgci5yZWRyYXdIaW50KCdkcmFnJywgdHJ1ZSk7XG4gICAgICAgICAgaWYgKHIudG91Y2hEYXRhLnN0YXJ0UG9zaXRpb25bMF0gPT0gZWFybGllclswXSAmJiByLnRvdWNoRGF0YS5zdGFydFBvc2l0aW9uWzFdID09IGVhcmxpZXJbMV0pIHtcbiAgICAgICAgICAgIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByLnJlZHJhdygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIG90aGVyd2lzZSBrZWVwIHRyYWNrIG9mIGRyYWcgZGVsdGEgZm9yIGxhdGVyXG4gICAgICAgICAgdmFyIGRyYWdEZWx0YSA9IHIudG91Y2hEYXRhLmRyYWdEZWx0YSA9IHIudG91Y2hEYXRhLmRyYWdEZWx0YSB8fCBbXTtcbiAgICAgICAgICBpZiAoZHJhZ0RlbHRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgZHJhZ0RlbHRhLnB1c2goZGlzcFswXSk7XG4gICAgICAgICAgICBkcmFnRGVsdGEucHVzaChkaXNwWzFdKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZHJhZ0RlbHRhWzBdICs9IGRpc3BbMF07XG4gICAgICAgICAgICBkcmFnRGVsdGFbMV0gKz0gZGlzcFsxXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gdG91Y2htb3ZlXG4gICAgICB7XG4gICAgICAgIHRyaWdnZXJFdmVudHMoc3RhcnQgfHwgbmVhciwgWyd0b3VjaG1vdmUnLCAndGFwZHJhZycsICd2bW91c2Vtb3ZlJ10sIGUsIHtcbiAgICAgICAgICB4OiBub3dbMF0sXG4gICAgICAgICAgeTogbm93WzFdXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoKCFzdGFydCB8fCAhc3RhcnQuZ3JhYmJlZCgpKSAmJiBuZWFyICE9IGxhc3QpIHtcbiAgICAgICAgICBpZiAobGFzdCkge1xuICAgICAgICAgICAgbGFzdC5lbWl0KG1ha2VFdmVudCgndGFwZHJhZ291dCcpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG5lYXIpIHtcbiAgICAgICAgICAgIG5lYXIuZW1pdChtYWtlRXZlbnQoJ3RhcGRyYWdvdmVyJykpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByLnRvdWNoRGF0YS5sYXN0ID0gbmVhcjtcbiAgICAgIH1cblxuICAgICAgLy8gY2hlY2sgdG8gY2FuY2VsIHRhcGhvbGRcbiAgICAgIGlmIChjYXB0dXJlKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm93Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKG5vd1tpXSAmJiByLnRvdWNoRGF0YS5zdGFydFBvc2l0aW9uW2ldICYmIGlzT3ZlclRocmVzaG9sZERyYWcpIHtcbiAgICAgICAgICAgIHIudG91Y2hEYXRhLnNpbmdsZVRvdWNoTW92ZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBwYW5uaW5nXG4gICAgICBpZiAoY2FwdHVyZSAmJiAoc3RhcnQgPT0gbnVsbCB8fCBzdGFydC5wYW5uYWJsZSgpKSAmJiBjeS5wYW5uaW5nRW5hYmxlZCgpICYmIGN5LnVzZXJQYW5uaW5nRW5hYmxlZCgpKSB7XG4gICAgICAgIHZhciBhbGxvd1Bhc3N0aHJvdWdoID0gYWxsb3dQYW5uaW5nUGFzc3Rocm91Z2goc3RhcnQsIHIudG91Y2hEYXRhLnN0YXJ0cyk7XG4gICAgICAgIGlmIChhbGxvd1Bhc3N0aHJvdWdoKSB7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGlmICghci5kYXRhLmJnQWN0aXZlUG9zaXN0aW9uKSB7XG4gICAgICAgICAgICByLmRhdGEuYmdBY3RpdmVQb3Npc3Rpb24gPSBhcnJheTJwb2ludChyLnRvdWNoRGF0YS5zdGFydFBvc2l0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHIuc3dpcGVQYW5uaW5nKSB7XG4gICAgICAgICAgICBjeS5wYW5CeSh7XG4gICAgICAgICAgICAgIHg6IGRpc3BbMF0gKiB6b29tLFxuICAgICAgICAgICAgICB5OiBkaXNwWzFdICogem9vbVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjeS5lbWl0KG1ha2VFdmVudCgnZHJhZ3BhbicpKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzT3ZlclRocmVzaG9sZERyYWcpIHtcbiAgICAgICAgICAgIHIuc3dpcGVQYW5uaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIGN5LnBhbkJ5KHtcbiAgICAgICAgICAgICAgeDogZHggKiB6b29tLFxuICAgICAgICAgICAgICB5OiBkeSAqIHpvb21cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY3kuZW1pdChtYWtlRXZlbnQoJ2RyYWdwYW4nKSk7XG4gICAgICAgICAgICBpZiAoc3RhcnQpIHtcbiAgICAgICAgICAgICAgc3RhcnQudW5hY3RpdmF0ZSgpO1xuICAgICAgICAgICAgICByLnJlZHJhd0hpbnQoJ3NlbGVjdCcsIHRydWUpO1xuICAgICAgICAgICAgICByLnRvdWNoRGF0YS5zdGFydCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmUtcHJvamVjdFxuICAgICAgICB2YXIgcG9zID0gci5wcm9qZWN0SW50b1ZpZXdwb3J0KGUudG91Y2hlc1swXS5jbGllbnRYLCBlLnRvdWNoZXNbMF0uY2xpZW50WSk7XG4gICAgICAgIG5vd1swXSA9IHBvc1swXTtcbiAgICAgICAgbm93WzFdID0gcG9zWzFdO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG5vdy5sZW5ndGg7IGorKykge1xuICAgICAgZWFybGllcltqXSA9IG5vd1tqXTtcbiAgICB9XG5cbiAgICAvLyB0aGUgYWN0aXZlIGJnIGluZGljYXRvciBzaG91bGQgYmUgcmVtb3ZlZCB3aGVuIG1ha2luZyBhIHN3aXBlIHRoYXQgaXMgbmVpdGhlciBmb3IgZHJhZ2dpbmcgbm9kZXMgb3IgcGFubmluZ1xuICAgIGlmIChjYXB0dXJlICYmIGUudG91Y2hlcy5sZW5ndGggPiAwICYmICFyLmhvdmVyRGF0YS5kcmFnZ2luZ0VsZXMgJiYgIXIuc3dpcGVQYW5uaW5nICYmIHIuZGF0YS5iZ0FjdGl2ZVBvc2lzdGlvbiAhPSBudWxsKSB7XG4gICAgICByLmRhdGEuYmdBY3RpdmVQb3Npc3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgICByLnJlZHJhd0hpbnQoJ3NlbGVjdCcsIHRydWUpO1xuICAgICAgci5yZWRyYXcoKTtcbiAgICB9XG4gIH0sIGZhbHNlKTtcbiAgdmFyIHRvdWNoY2FuY2VsSGFuZGxlcjtcbiAgci5yZWdpc3RlckJpbmRpbmcoY29udGFpbmVyV2luZG93LCAndG91Y2hjYW5jZWwnLCB0b3VjaGNhbmNlbEhhbmRsZXIgPSBmdW5jdGlvbiB0b3VjaGNhbmNlbEhhbmRsZXIoZSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICB2YXIgc3RhcnQgPSByLnRvdWNoRGF0YS5zdGFydDtcbiAgICByLnRvdWNoRGF0YS5jYXB0dXJlID0gZmFsc2U7XG4gICAgaWYgKHN0YXJ0KSB7XG4gICAgICBzdGFydC51bmFjdGl2YXRlKCk7XG4gICAgfVxuICB9KTtcbiAgdmFyIHRvdWNoZW5kSGFuZGxlciwgZGlkRG91YmxlVG91Y2gsIHRvdWNoVGltZW91dCwgcHJldlRvdWNoVGltZVN0YW1wO1xuICByLnJlZ2lzdGVyQmluZGluZyhjb250YWluZXJXaW5kb3csICd0b3VjaGVuZCcsIHRvdWNoZW5kSGFuZGxlciA9IGZ1bmN0aW9uIHRvdWNoZW5kSGFuZGxlcihlKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIHZhciBzdGFydCA9IHIudG91Y2hEYXRhLnN0YXJ0O1xuICAgIHZhciBjYXB0dXJlID0gci50b3VjaERhdGEuY2FwdHVyZTtcbiAgICBpZiAoY2FwdHVyZSkge1xuICAgICAgaWYgKGUudG91Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgci50b3VjaERhdGEuY2FwdHVyZSA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBzZWxlY3QgPSByLnNlbGVjdGlvbjtcbiAgICByLnN3aXBlUGFubmluZyA9IGZhbHNlO1xuICAgIHIuaG92ZXJEYXRhLmRyYWdnaW5nRWxlcyA9IGZhbHNlO1xuICAgIHZhciBjeSA9IHIuY3k7XG4gICAgdmFyIHpvb20gPSBjeS56b29tKCk7XG4gICAgdmFyIG5vdyA9IHIudG91Y2hEYXRhLm5vdztcbiAgICB2YXIgZWFybGllciA9IHIudG91Y2hEYXRhLmVhcmxpZXI7XG4gICAgaWYgKGUudG91Y2hlc1swXSkge1xuICAgICAgdmFyIHBvcyA9IHIucHJvamVjdEludG9WaWV3cG9ydChlLnRvdWNoZXNbMF0uY2xpZW50WCwgZS50b3VjaGVzWzBdLmNsaWVudFkpO1xuICAgICAgbm93WzBdID0gcG9zWzBdO1xuICAgICAgbm93WzFdID0gcG9zWzFdO1xuICAgIH1cbiAgICBpZiAoZS50b3VjaGVzWzFdKSB7XG4gICAgICB2YXIgcG9zID0gci5wcm9qZWN0SW50b1ZpZXdwb3J0KGUudG91Y2hlc1sxXS5jbGllbnRYLCBlLnRvdWNoZXNbMV0uY2xpZW50WSk7XG4gICAgICBub3dbMl0gPSBwb3NbMF07XG4gICAgICBub3dbM10gPSBwb3NbMV07XG4gICAgfVxuICAgIGlmIChlLnRvdWNoZXNbMl0pIHtcbiAgICAgIHZhciBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZS50b3VjaGVzWzJdLmNsaWVudFgsIGUudG91Y2hlc1syXS5jbGllbnRZKTtcbiAgICAgIG5vd1s0XSA9IHBvc1swXTtcbiAgICAgIG5vd1s1XSA9IHBvc1sxXTtcbiAgICB9XG4gICAgdmFyIG1ha2VFdmVudCA9IGZ1bmN0aW9uIG1ha2VFdmVudCh0eXBlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgICB5OiBub3dbMV1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9O1xuICAgIGlmIChzdGFydCkge1xuICAgICAgc3RhcnQudW5hY3RpdmF0ZSgpO1xuICAgIH1cbiAgICB2YXIgY3R4VGFwZW5kO1xuICAgIGlmIChyLnRvdWNoRGF0YS5jeHQpIHtcbiAgICAgIGN0eFRhcGVuZCA9IG1ha2VFdmVudCgnY3h0dGFwZW5kJyk7XG4gICAgICBpZiAoc3RhcnQpIHtcbiAgICAgICAgc3RhcnQuZW1pdChjdHhUYXBlbmQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3kuZW1pdChjdHhUYXBlbmQpO1xuICAgICAgfVxuICAgICAgaWYgKCFyLnRvdWNoRGF0YS5jeHREcmFnZ2VkKSB7XG4gICAgICAgIHZhciBjdHhUYXAgPSBtYWtlRXZlbnQoJ2N4dHRhcCcpO1xuICAgICAgICBpZiAoc3RhcnQpIHtcbiAgICAgICAgICBzdGFydC5lbWl0KGN0eFRhcCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3kuZW1pdChjdHhUYXApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoci50b3VjaERhdGEuc3RhcnQpIHtcbiAgICAgICAgci50b3VjaERhdGEuc3RhcnQuX3ByaXZhdGUuZ3JhYmJlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgci50b3VjaERhdGEuY3h0ID0gZmFsc2U7XG4gICAgICByLnRvdWNoRGF0YS5zdGFydCA9IG51bGw7XG4gICAgICByLnJlZHJhdygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIG5vIG1vcmUgYm94IHNlbGVjdGlvbiBpZiB3ZSBkb24ndCBoYXZlIHRocmVlIGZpbmdlcnNcbiAgICBpZiAoIWUudG91Y2hlc1syXSAmJiBjeS5ib3hTZWxlY3Rpb25FbmFibGVkKCkgJiYgci50b3VjaERhdGEuc2VsZWN0aW5nKSB7XG4gICAgICByLnRvdWNoRGF0YS5zZWxlY3RpbmcgPSBmYWxzZTtcbiAgICAgIHZhciBib3ggPSBjeS5jb2xsZWN0aW9uKHIuZ2V0QWxsSW5Cb3goc2VsZWN0WzBdLCBzZWxlY3RbMV0sIHNlbGVjdFsyXSwgc2VsZWN0WzNdKSk7XG4gICAgICBzZWxlY3RbMF0gPSB1bmRlZmluZWQ7XG4gICAgICBzZWxlY3RbMV0gPSB1bmRlZmluZWQ7XG4gICAgICBzZWxlY3RbMl0gPSB1bmRlZmluZWQ7XG4gICAgICBzZWxlY3RbM10gPSB1bmRlZmluZWQ7XG4gICAgICBzZWxlY3RbNF0gPSAwO1xuICAgICAgci5yZWRyYXdIaW50KCdzZWxlY3QnLCB0cnVlKTtcbiAgICAgIGN5LmVtaXQobWFrZUV2ZW50KCdib3hlbmQnKSk7XG4gICAgICB2YXIgZWxlV291bGRCZVNlbGVjdGVkID0gZnVuY3Rpb24gZWxlV291bGRCZVNlbGVjdGVkKGVsZSkge1xuICAgICAgICByZXR1cm4gZWxlLnNlbGVjdGFibGUoKSAmJiAhZWxlLnNlbGVjdGVkKCk7XG4gICAgICB9O1xuICAgICAgYm94LmVtaXQobWFrZUV2ZW50KCdib3gnKSkuc3RkRmlsdGVyKGVsZVdvdWxkQmVTZWxlY3RlZCkuc2VsZWN0KCkuZW1pdChtYWtlRXZlbnQoJ2JveHNlbGVjdCcpKTtcbiAgICAgIGlmIChib3gubm9uZW1wdHkoKSkge1xuICAgICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHIucmVkcmF3KCk7XG4gICAgfVxuICAgIGlmIChzdGFydCAhPSBudWxsKSB7XG4gICAgICBzdGFydC51bmFjdGl2YXRlKCk7XG4gICAgfVxuICAgIGlmIChlLnRvdWNoZXNbMl0pIHtcbiAgICAgIHIuZGF0YS5iZ0FjdGl2ZVBvc2lzdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgIHIucmVkcmF3SGludCgnc2VsZWN0JywgdHJ1ZSk7XG4gICAgfSBlbHNlIGlmIChlLnRvdWNoZXNbMV0pIDsgZWxzZSBpZiAoZS50b3VjaGVzWzBdKSA7IGVsc2UgaWYgKCFlLnRvdWNoZXNbMF0pIHtcbiAgICAgIHIuZGF0YS5iZ0FjdGl2ZVBvc2lzdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgIHIucmVkcmF3SGludCgnc2VsZWN0JywgdHJ1ZSk7XG4gICAgICB2YXIgZHJhZ2dlZEVsZXMgPSByLmRyYWdEYXRhLnRvdWNoRHJhZ0VsZXM7XG4gICAgICBpZiAoc3RhcnQgIT0gbnVsbCkge1xuICAgICAgICB2YXIgc3RhcnRXYXNHcmFiYmVkID0gc3RhcnQuX3ByaXZhdGUuZ3JhYmJlZDtcbiAgICAgICAgZnJlZURyYWdnZWRFbGVtZW50cyhkcmFnZ2VkRWxlcyk7XG4gICAgICAgIHIucmVkcmF3SGludCgnZHJhZycsIHRydWUpO1xuICAgICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgICAgaWYgKHN0YXJ0V2FzR3JhYmJlZCkge1xuICAgICAgICAgIHN0YXJ0LmVtaXQobWFrZUV2ZW50KCdmcmVlb24nKSk7XG4gICAgICAgICAgZHJhZ2dlZEVsZXMuZW1pdChtYWtlRXZlbnQoJ2ZyZWUnKSk7XG4gICAgICAgICAgaWYgKHIuZHJhZ0RhdGEuZGlkRHJhZykge1xuICAgICAgICAgICAgc3RhcnQuZW1pdChtYWtlRXZlbnQoJ2RyYWdmcmVlb24nKSk7XG4gICAgICAgICAgICBkcmFnZ2VkRWxlcy5lbWl0KG1ha2VFdmVudCgnZHJhZ2ZyZWUnKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRyaWdnZXJFdmVudHMoc3RhcnQsIFsndG91Y2hlbmQnLCAndGFwZW5kJywgJ3Ztb3VzZXVwJywgJ3RhcGRyYWdvdXQnXSwgZSwge1xuICAgICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgICB5OiBub3dbMV1cbiAgICAgICAgfSk7XG4gICAgICAgIHN0YXJ0LnVuYWN0aXZhdGUoKTtcbiAgICAgICAgci50b3VjaERhdGEuc3RhcnQgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIG5lYXIgPSByLmZpbmROZWFyZXN0RWxlbWVudChub3dbMF0sIG5vd1sxXSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHRyaWdnZXJFdmVudHMobmVhciwgWyd0b3VjaGVuZCcsICd0YXBlbmQnLCAndm1vdXNldXAnLCAndGFwZHJhZ291dCddLCBlLCB7XG4gICAgICAgICAgeDogbm93WzBdLFxuICAgICAgICAgIHk6IG5vd1sxXVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHZhciBkeCA9IHIudG91Y2hEYXRhLnN0YXJ0UG9zaXRpb25bMF0gLSBub3dbMF07XG4gICAgICB2YXIgZHgyID0gZHggKiBkeDtcbiAgICAgIHZhciBkeSA9IHIudG91Y2hEYXRhLnN0YXJ0UG9zaXRpb25bMV0gLSBub3dbMV07XG4gICAgICB2YXIgZHkyID0gZHkgKiBkeTtcbiAgICAgIHZhciBkaXN0MiA9IGR4MiArIGR5MjtcbiAgICAgIHZhciByZGlzdDIgPSBkaXN0MiAqIHpvb20gKiB6b29tO1xuXG4gICAgICAvLyBUYXAgZXZlbnQsIHJvdWdobHkgc2FtZSBhcyBtb3VzZSBjbGljayBldmVudCBmb3IgdG91Y2hcbiAgICAgIGlmICghci50b3VjaERhdGEuc2luZ2xlVG91Y2hNb3ZlZCkge1xuICAgICAgICBpZiAoIXN0YXJ0KSB7XG4gICAgICAgICAgY3kuJCgnOnNlbGVjdGVkJykudW5zZWxlY3QoWyd0YXB1bnNlbGVjdCddKTtcbiAgICAgICAgfVxuICAgICAgICB0cmlnZ2VyRXZlbnRzKHN0YXJ0LCBbJ3RhcCcsICd2Y2xpY2snXSwgZSwge1xuICAgICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgICB5OiBub3dbMV1cbiAgICAgICAgfSk7XG4gICAgICAgIGRpZERvdWJsZVRvdWNoID0gZmFsc2U7XG4gICAgICAgIGlmIChlLnRpbWVTdGFtcCAtIHByZXZUb3VjaFRpbWVTdGFtcCA8PSBjeS5tdWx0aUNsaWNrRGVib3VuY2VUaW1lKCkpIHtcbiAgICAgICAgICB0b3VjaFRpbWVvdXQgJiYgY2xlYXJUaW1lb3V0KHRvdWNoVGltZW91dCk7XG4gICAgICAgICAgZGlkRG91YmxlVG91Y2ggPSB0cnVlO1xuICAgICAgICAgIHByZXZUb3VjaFRpbWVTdGFtcCA9IG51bGw7XG4gICAgICAgICAgdHJpZ2dlckV2ZW50cyhzdGFydCwgWydkYmx0YXAnLCAndmRibGNsaWNrJ10sIGUsIHtcbiAgICAgICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgICAgIHk6IG5vd1sxXVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRvdWNoVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKGRpZERvdWJsZVRvdWNoKSByZXR1cm47XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnRzKHN0YXJ0LCBbJ29uZXRhcCcsICd2b25lY2xpY2snXSwgZSwge1xuICAgICAgICAgICAgICB4OiBub3dbMF0sXG4gICAgICAgICAgICAgIHk6IG5vd1sxXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSwgY3kubXVsdGlDbGlja0RlYm91bmNlVGltZSgpKTtcbiAgICAgICAgICBwcmV2VG91Y2hUaW1lU3RhbXAgPSBlLnRpbWVTdGFtcDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBQcmVwYXJlIHRvIHNlbGVjdCB0aGUgY3VycmVudGx5IHRvdWNoZWQgbm9kZSwgb25seSBpZiBpdCBoYXNuJ3QgYmVlbiBkcmFnZ2VkIHBhc3QgYSBjZXJ0YWluIGRpc3RhbmNlXG4gICAgICBpZiAoc3RhcnQgIT0gbnVsbCAmJiAhci5kcmFnRGF0YS5kaWREcmFnIC8vIGRpZG4ndCBkcmFnIG5vZGVzIGFyb3VuZFxuICAgICAgJiYgc3RhcnQuX3ByaXZhdGUuc2VsZWN0YWJsZSAmJiByZGlzdDIgPCByLnRvdWNoVGFwVGhyZXNob2xkMiAmJiAhci5waW5jaGluZyAvLyBwaW5jaCB0byB6b29tIHNob3VsZCBub3QgYWZmZWN0IHNlbGVjdGlvblxuICAgICAgKSB7XG4gICAgICAgIGlmIChjeS5zZWxlY3Rpb25UeXBlKCkgPT09ICdzaW5nbGUnKSB7XG4gICAgICAgICAgY3kuJChpc1NlbGVjdGVkKS51bm1lcmdlKHN0YXJ0KS51bnNlbGVjdChbJ3RhcHVuc2VsZWN0J10pO1xuICAgICAgICAgIHN0YXJ0LnNlbGVjdChbJ3RhcHNlbGVjdCddKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoc3RhcnQuc2VsZWN0ZWQoKSkge1xuICAgICAgICAgICAgc3RhcnQudW5zZWxlY3QoWyd0YXB1bnNlbGVjdCddKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RhcnQuc2VsZWN0KFsndGFwc2VsZWN0J10pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHIudG91Y2hEYXRhLnNpbmdsZVRvdWNoTW92ZWQgPSB0cnVlO1xuICAgIH1cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG5vdy5sZW5ndGg7IGorKykge1xuICAgICAgZWFybGllcltqXSA9IG5vd1tqXTtcbiAgICB9XG4gICAgci5kcmFnRGF0YS5kaWREcmFnID0gZmFsc2U7IC8vIHJlc2V0IGZvciBuZXh0IHRvdWNoc3RhcnRcblxuICAgIGlmIChlLnRvdWNoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByLnRvdWNoRGF0YS5kcmFnRGVsdGEgPSBbXTtcbiAgICAgIHIudG91Y2hEYXRhLnN0YXJ0UG9zaXRpb24gPSBbbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbF07XG4gICAgICByLnRvdWNoRGF0YS5zdGFydEdQb3NpdGlvbiA9IG51bGw7XG4gICAgICByLnRvdWNoRGF0YS5kaWRTZWxlY3QgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGUudG91Y2hlcy5sZW5ndGggPCAyKSB7XG4gICAgICBpZiAoZS50b3VjaGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAvLyB0aGUgb2xkIHN0YXJ0IGdsb2JhbCBwb3MnbiBtYXkgbm90IGJlIHRoZSBzYW1lIGZpbmdlciB0aGF0IHJlbWFpbnNcbiAgICAgICAgci50b3VjaERhdGEuc3RhcnRHUG9zaXRpb24gPSBbZS50b3VjaGVzWzBdLmNsaWVudFgsIGUudG91Y2hlc1swXS5jbGllbnRZXTtcbiAgICAgIH1cbiAgICAgIHIucGluY2hpbmcgPSBmYWxzZTtcbiAgICAgIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICAgICAgci5yZWRyYXcoKTtcbiAgICB9XG5cbiAgICAvL3IucmVkcmF3KCk7XG4gIH0sIGZhbHNlKTtcblxuICAvLyBmYWxsYmFjayBjb21wYXRpYmlsaXR5IGxheWVyIGZvciBtcyBwb2ludGVyIGV2ZW50c1xuICBpZiAodHlwZW9mIFRvdWNoRXZlbnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgdmFyIHBvaW50ZXJzID0gW107XG4gICAgdmFyIG1ha2VUb3VjaCA9IGZ1bmN0aW9uIG1ha2VUb3VjaChlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjbGllbnRYOiBlLmNsaWVudFgsXG4gICAgICAgIGNsaWVudFk6IGUuY2xpZW50WSxcbiAgICAgICAgZm9yY2U6IDEsXG4gICAgICAgIGlkZW50aWZpZXI6IGUucG9pbnRlcklkLFxuICAgICAgICBwYWdlWDogZS5wYWdlWCxcbiAgICAgICAgcGFnZVk6IGUucGFnZVksXG4gICAgICAgIHJhZGl1c1g6IGUud2lkdGggLyAyLFxuICAgICAgICByYWRpdXNZOiBlLmhlaWdodCAvIDIsXG4gICAgICAgIHNjcmVlblg6IGUuc2NyZWVuWCxcbiAgICAgICAgc2NyZWVuWTogZS5zY3JlZW5ZLFxuICAgICAgICB0YXJnZXQ6IGUudGFyZ2V0XG4gICAgICB9O1xuICAgIH07XG4gICAgdmFyIG1ha2VQb2ludGVyID0gZnVuY3Rpb24gbWFrZVBvaW50ZXIoZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXZlbnQ6IGUsXG4gICAgICAgIHRvdWNoOiBtYWtlVG91Y2goZSlcbiAgICAgIH07XG4gICAgfTtcbiAgICB2YXIgYWRkUG9pbnRlciA9IGZ1bmN0aW9uIGFkZFBvaW50ZXIoZSkge1xuICAgICAgcG9pbnRlcnMucHVzaChtYWtlUG9pbnRlcihlKSk7XG4gICAgfTtcbiAgICB2YXIgcmVtb3ZlUG9pbnRlciA9IGZ1bmN0aW9uIHJlbW92ZVBvaW50ZXIoZSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcCA9IHBvaW50ZXJzW2ldO1xuICAgICAgICBpZiAocC5ldmVudC5wb2ludGVySWQgPT09IGUucG9pbnRlcklkKSB7XG4gICAgICAgICAgcG9pbnRlcnMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgdmFyIHVwZGF0ZVBvaW50ZXIgPSBmdW5jdGlvbiB1cGRhdGVQb2ludGVyKGUpIHtcbiAgICAgIHZhciBwID0gcG9pbnRlcnMuZmlsdGVyKGZ1bmN0aW9uIChwKSB7XG4gICAgICAgIHJldHVybiBwLmV2ZW50LnBvaW50ZXJJZCA9PT0gZS5wb2ludGVySWQ7XG4gICAgICB9KVswXTtcbiAgICAgIHAuZXZlbnQgPSBlO1xuICAgICAgcC50b3VjaCA9IG1ha2VUb3VjaChlKTtcbiAgICB9O1xuICAgIHZhciBhZGRUb3VjaGVzVG9FdmVudCA9IGZ1bmN0aW9uIGFkZFRvdWNoZXNUb0V2ZW50KGUpIHtcbiAgICAgIGUudG91Y2hlcyA9IHBvaW50ZXJzLm1hcChmdW5jdGlvbiAocCkge1xuICAgICAgICByZXR1cm4gcC50b3VjaDtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgdmFyIHBvaW50ZXJJc01vdXNlID0gZnVuY3Rpb24gcG9pbnRlcklzTW91c2UoZSkge1xuICAgICAgcmV0dXJuIGUucG9pbnRlclR5cGUgPT09ICdtb3VzZScgfHwgZS5wb2ludGVyVHlwZSA9PT0gNDtcbiAgICB9O1xuICAgIHIucmVnaXN0ZXJCaW5kaW5nKHIuY29udGFpbmVyLCAncG9pbnRlcmRvd24nLCBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKHBvaW50ZXJJc01vdXNlKGUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gbW91c2UgYWxyZWFkeSBoYW5kbGVkXG5cbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGFkZFBvaW50ZXIoZSk7XG4gICAgICBhZGRUb3VjaGVzVG9FdmVudChlKTtcbiAgICAgIHRvdWNoc3RhcnRIYW5kbGVyKGUpO1xuICAgIH0pO1xuICAgIHIucmVnaXN0ZXJCaW5kaW5nKHIuY29udGFpbmVyLCAncG9pbnRlcnVwJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmIChwb2ludGVySXNNb3VzZShlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IC8vIG1vdXNlIGFscmVhZHkgaGFuZGxlZFxuXG4gICAgICByZW1vdmVQb2ludGVyKGUpO1xuICAgICAgYWRkVG91Y2hlc1RvRXZlbnQoZSk7XG4gICAgICB0b3VjaGVuZEhhbmRsZXIoZSk7XG4gICAgfSk7XG4gICAgci5yZWdpc3RlckJpbmRpbmcoci5jb250YWluZXIsICdwb2ludGVyY2FuY2VsJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmIChwb2ludGVySXNNb3VzZShlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IC8vIG1vdXNlIGFscmVhZHkgaGFuZGxlZFxuXG4gICAgICByZW1vdmVQb2ludGVyKGUpO1xuICAgICAgYWRkVG91Y2hlc1RvRXZlbnQoZSk7XG4gICAgICB0b3VjaGNhbmNlbEhhbmRsZXIoZSk7XG4gICAgfSk7XG4gICAgci5yZWdpc3RlckJpbmRpbmcoci5jb250YWluZXIsICdwb2ludGVybW92ZScsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAocG9pbnRlcklzTW91c2UoZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyBtb3VzZSBhbHJlYWR5IGhhbmRsZWRcblxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdXBkYXRlUG9pbnRlcihlKTtcbiAgICAgIGFkZFRvdWNoZXNUb0V2ZW50KGUpO1xuICAgICAgdG91Y2htb3ZlSGFuZGxlcihlKTtcbiAgICB9KTtcbiAgfVxufTtcblxudmFyIEJScCQyID0ge307XG5CUnAkMi5nZW5lcmF0ZVBvbHlnb24gPSBmdW5jdGlvbiAobmFtZSwgcG9pbnRzKSB7XG4gIHJldHVybiB0aGlzLm5vZGVTaGFwZXNbbmFtZV0gPSB7XG4gICAgcmVuZGVyZXI6IHRoaXMsXG4gICAgbmFtZTogbmFtZSxcbiAgICBwb2ludHM6IHBvaW50cyxcbiAgICBkcmF3OiBmdW5jdGlvbiBkcmF3KGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIGNvcm5lclJhZGl1cykge1xuICAgICAgdGhpcy5yZW5kZXJlci5ub2RlU2hhcGVJbXBsKCdwb2x5Z29uJywgY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgdGhpcy5wb2ludHMpO1xuICAgIH0sXG4gICAgaW50ZXJzZWN0TGluZTogZnVuY3Rpb24gaW50ZXJzZWN0TGluZShub2RlWCwgbm9kZVksIHdpZHRoLCBoZWlnaHQsIHgsIHksIHBhZGRpbmcsIGNvcm5lclJhZGl1cykge1xuICAgICAgcmV0dXJuIHBvbHlnb25JbnRlcnNlY3RMaW5lKHgsIHksIHRoaXMucG9pbnRzLCBub2RlWCwgbm9kZVksIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMiwgcGFkZGluZyk7XG4gICAgfSxcbiAgICBjaGVja1BvaW50OiBmdW5jdGlvbiBjaGVja1BvaW50KHgsIHksIHBhZGRpbmcsIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclksIGNvcm5lclJhZGl1cykge1xuICAgICAgcmV0dXJuIHBvaW50SW5zaWRlUG9seWdvbih4LCB5LCB0aGlzLnBvaW50cywgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgWzAsIC0xXSwgcGFkZGluZyk7XG4gICAgfSxcbiAgICBoYXNNaXRlckJvdW5kczogbmFtZSAhPT0gJ3JlY3RhbmdsZScsXG4gICAgbWl0ZXJCb3VuZHM6IGZ1bmN0aW9uIG1pdGVyQm91bmRzKGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHN0cm9rZVdpZHRoLCBzdHJva2VQb3NpdGlvbikge1xuICAgICAgcmV0dXJuIG1pdGVyQm94KHRoaXMucG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBzdHJva2VXaWR0aCk7XG4gICAgfVxuICB9O1xufTtcbkJScCQyLmdlbmVyYXRlRWxsaXBzZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubm9kZVNoYXBlc1snZWxsaXBzZSddID0ge1xuICAgIHJlbmRlcmVyOiB0aGlzLFxuICAgIG5hbWU6ICdlbGxpcHNlJyxcbiAgICBkcmF3OiBmdW5jdGlvbiBkcmF3KGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIGNvcm5lclJhZGl1cykge1xuICAgICAgdGhpcy5yZW5kZXJlci5ub2RlU2hhcGVJbXBsKHRoaXMubmFtZSwgY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCk7XG4gICAgfSxcbiAgICBpbnRlcnNlY3RMaW5lOiBmdW5jdGlvbiBpbnRlcnNlY3RMaW5lKG5vZGVYLCBub2RlWSwgd2lkdGgsIGhlaWdodCwgeCwgeSwgcGFkZGluZywgY29ybmVyUmFkaXVzKSB7XG4gICAgICByZXR1cm4gaW50ZXJzZWN0TGluZUVsbGlwc2UoeCwgeSwgbm9kZVgsIG5vZGVZLCB3aWR0aCAvIDIgKyBwYWRkaW5nLCBoZWlnaHQgLyAyICsgcGFkZGluZyk7XG4gICAgfSxcbiAgICBjaGVja1BvaW50OiBmdW5jdGlvbiBjaGVja1BvaW50KHgsIHksIHBhZGRpbmcsIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclksIGNvcm5lclJhZGl1cykge1xuICAgICAgcmV0dXJuIGNoZWNrSW5FbGxpcHNlKHgsIHksIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclksIHBhZGRpbmcpO1xuICAgIH1cbiAgfTtcbn07XG5CUnAkMi5nZW5lcmF0ZVJvdW5kUG9seWdvbiA9IGZ1bmN0aW9uIChuYW1lLCBwb2ludHMpIHtcbiAgcmV0dXJuIHRoaXMubm9kZVNoYXBlc1tuYW1lXSA9IHtcbiAgICByZW5kZXJlcjogdGhpcyxcbiAgICBuYW1lOiBuYW1lLFxuICAgIHBvaW50czogcG9pbnRzLFxuICAgIGdldE9yQ3JlYXRlQ29ybmVyczogZnVuY3Rpb24gZ2V0T3JDcmVhdGVDb3JuZXJzKGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIGNvcm5lclJhZGl1cywgcnMsIGZpZWxkKSB7XG4gICAgICBpZiAocnNbZmllbGRdICE9PSB1bmRlZmluZWQgJiYgcnNbZmllbGQgKyAnLWN4J10gPT09IGNlbnRlclggJiYgcnNbZmllbGQgKyAnLWN5J10gPT09IGNlbnRlclkgJiYgcnNbZmllbGQgKyAnLXcnXSA9PT0gd2lkdGggJiYgcnNbZmllbGQgKyAnLWgnXSA9PT0gaGVpZ2h0ICYmIHJzW2ZpZWxkICsgJy1jb3JuZXItcmFkaXVzJ10gPT09IGNvcm5lclJhZGl1cykge1xuICAgICAgICByZXR1cm4gcnNbZmllbGRdO1xuICAgICAgfVxuICAgICAgcnNbZmllbGRdID0gbmV3IEFycmF5KHBvaW50cy5sZW5ndGggLyAyKTtcbiAgICAgIHJzW2ZpZWxkICsgJy1jeCddID0gY2VudGVyWDtcbiAgICAgIHJzW2ZpZWxkICsgJy1jeSddID0gY2VudGVyWTtcbiAgICAgIHJzW2ZpZWxkICsgJy13J10gPSB3aWR0aDtcbiAgICAgIHJzW2ZpZWxkICsgJy1oJ10gPSBoZWlnaHQ7XG4gICAgICByc1tmaWVsZCArICctY29ybmVyLXJhZGl1cyddID0gY29ybmVyUmFkaXVzO1xuICAgICAgdmFyIGhhbGZXID0gd2lkdGggLyAyO1xuICAgICAgdmFyIGhhbGZIID0gaGVpZ2h0IC8gMjtcbiAgICAgIGNvcm5lclJhZGl1cyA9IGNvcm5lclJhZGl1cyA9PT0gJ2F1dG8nID8gZ2V0Um91bmRQb2x5Z29uUmFkaXVzKHdpZHRoLCBoZWlnaHQpIDogY29ybmVyUmFkaXVzO1xuICAgICAgdmFyIHAgPSBuZXcgQXJyYXkocG9pbnRzLmxlbmd0aCAvIDIpO1xuICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IHBvaW50cy5sZW5ndGggLyAyOyBfaSsrKSB7XG4gICAgICAgIHBbX2ldID0ge1xuICAgICAgICAgIHg6IGNlbnRlclggKyBoYWxmVyAqIHBvaW50c1tfaSAqIDJdLFxuICAgICAgICAgIHk6IGNlbnRlclkgKyBoYWxmSCAqIHBvaW50c1tfaSAqIDIgKyAxXVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgdmFyIGksXG4gICAgICAgIHAxLFxuICAgICAgICBwMixcbiAgICAgICAgcDMsXG4gICAgICAgIGxlbiA9IHAubGVuZ3RoO1xuICAgICAgcDEgPSBwW2xlbiAtIDFdO1xuICAgICAgLy8gZm9yIGVhY2ggcG9pbnRcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBwMiA9IHBbaSAlIGxlbl07XG4gICAgICAgIHAzID0gcFsoaSArIDEpICUgbGVuXTtcbiAgICAgICAgcnNbZmllbGRdW2ldID0gZ2V0Um91bmRDb3JuZXIocDEsIHAyLCBwMywgY29ybmVyUmFkaXVzKTtcbiAgICAgICAgcDEgPSBwMjtcbiAgICAgICAgcDIgPSBwMztcbiAgICAgIH1cbiAgICAgIHJldHVybiByc1tmaWVsZF07XG4gICAgfSxcbiAgICBkcmF3OiBmdW5jdGlvbiBkcmF3KGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIGNvcm5lclJhZGl1cywgcnMpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIubm9kZVNoYXBlSW1wbCgncm91bmQtcG9seWdvbicsIGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHRoaXMucG9pbnRzLCB0aGlzLmdldE9yQ3JlYXRlQ29ybmVycyhjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBjb3JuZXJSYWRpdXMsIHJzLCAnZHJhd0Nvcm5lcnMnKSk7XG4gICAgfSxcbiAgICBpbnRlcnNlY3RMaW5lOiBmdW5jdGlvbiBpbnRlcnNlY3RMaW5lKG5vZGVYLCBub2RlWSwgd2lkdGgsIGhlaWdodCwgeCwgeSwgcGFkZGluZywgY29ybmVyUmFkaXVzLCBycykge1xuICAgICAgcmV0dXJuIHJvdW5kUG9seWdvbkludGVyc2VjdExpbmUoeCwgeSwgdGhpcy5wb2ludHMsIG5vZGVYLCBub2RlWSwgd2lkdGgsIGhlaWdodCwgcGFkZGluZywgdGhpcy5nZXRPckNyZWF0ZUNvcm5lcnMobm9kZVgsIG5vZGVZLCB3aWR0aCwgaGVpZ2h0LCBjb3JuZXJSYWRpdXMsIHJzLCAnY29ybmVycycpKTtcbiAgICB9LFxuICAgIGNoZWNrUG9pbnQ6IGZ1bmN0aW9uIGNoZWNrUG9pbnQoeCwgeSwgcGFkZGluZywgd2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSwgY29ybmVyUmFkaXVzLCBycykge1xuICAgICAgcmV0dXJuIHBvaW50SW5zaWRlUm91bmRQb2x5Z29uKHgsIHksIHRoaXMucG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCB0aGlzLmdldE9yQ3JlYXRlQ29ybmVycyhjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBjb3JuZXJSYWRpdXMsIHJzLCAnY29ybmVycycpKTtcbiAgICB9XG4gIH07XG59O1xuQlJwJDIuZ2VuZXJhdGVSb3VuZFJlY3RhbmdsZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubm9kZVNoYXBlc1sncm91bmQtcmVjdGFuZ2xlJ10gPSB0aGlzLm5vZGVTaGFwZXNbJ3JvdW5kcmVjdGFuZ2xlJ10gPSB7XG4gICAgcmVuZGVyZXI6IHRoaXMsXG4gICAgbmFtZTogJ3JvdW5kLXJlY3RhbmdsZScsXG4gICAgcG9pbnRzOiBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoNCwgMCksXG4gICAgZHJhdzogZnVuY3Rpb24gZHJhdyhjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBjb3JuZXJSYWRpdXMpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIubm9kZVNoYXBlSW1wbCh0aGlzLm5hbWUsIGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHRoaXMucG9pbnRzLCBjb3JuZXJSYWRpdXMpO1xuICAgIH0sXG4gICAgaW50ZXJzZWN0TGluZTogZnVuY3Rpb24gaW50ZXJzZWN0TGluZShub2RlWCwgbm9kZVksIHdpZHRoLCBoZWlnaHQsIHgsIHksIHBhZGRpbmcsIGNvcm5lclJhZGl1cykge1xuICAgICAgcmV0dXJuIHJvdW5kUmVjdGFuZ2xlSW50ZXJzZWN0TGluZSh4LCB5LCBub2RlWCwgbm9kZVksIHdpZHRoLCBoZWlnaHQsIHBhZGRpbmcsIGNvcm5lclJhZGl1cyk7XG4gICAgfSxcbiAgICBjaGVja1BvaW50OiBmdW5jdGlvbiBjaGVja1BvaW50KHgsIHksIHBhZGRpbmcsIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclksIGNvcm5lclJhZGl1cykge1xuICAgICAgdmFyIGhhbGZXaWR0aCA9IHdpZHRoIC8gMjtcbiAgICAgIHZhciBoYWxmSGVpZ2h0ID0gaGVpZ2h0IC8gMjtcbiAgICAgIGNvcm5lclJhZGl1cyA9IGNvcm5lclJhZGl1cyA9PT0gJ2F1dG8nID8gZ2V0Um91bmRSZWN0YW5nbGVSYWRpdXMod2lkdGgsIGhlaWdodCkgOiBjb3JuZXJSYWRpdXM7XG4gICAgICBjb3JuZXJSYWRpdXMgPSBNYXRoLm1pbihoYWxmV2lkdGgsIGhhbGZIZWlnaHQsIGNvcm5lclJhZGl1cyk7XG4gICAgICB2YXIgZGlhbSA9IGNvcm5lclJhZGl1cyAqIDI7XG5cbiAgICAgIC8vIENoZWNrIGhCb3hcbiAgICAgIGlmIChwb2ludEluc2lkZVBvbHlnb24oeCwgeSwgdGhpcy5wb2ludHMsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQgLSBkaWFtLCBbMCwgLTFdLCBwYWRkaW5nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgdkJveFxuICAgICAgaWYgKHBvaW50SW5zaWRlUG9seWdvbih4LCB5LCB0aGlzLnBvaW50cywgY2VudGVyWCwgY2VudGVyWSwgd2lkdGggLSBkaWFtLCBoZWlnaHQsIFswLCAtMV0sIHBhZGRpbmcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayB0b3AgbGVmdCBxdWFydGVyIGNpcmNsZVxuICAgICAgaWYgKGNoZWNrSW5FbGxpcHNlKHgsIHksIGRpYW0sIGRpYW0sIGNlbnRlclggLSBoYWxmV2lkdGggKyBjb3JuZXJSYWRpdXMsIGNlbnRlclkgLSBoYWxmSGVpZ2h0ICsgY29ybmVyUmFkaXVzLCBwYWRkaW5nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgdG9wIHJpZ2h0IHF1YXJ0ZXIgY2lyY2xlXG4gICAgICBpZiAoY2hlY2tJbkVsbGlwc2UoeCwgeSwgZGlhbSwgZGlhbSwgY2VudGVyWCArIGhhbGZXaWR0aCAtIGNvcm5lclJhZGl1cywgY2VudGVyWSAtIGhhbGZIZWlnaHQgKyBjb3JuZXJSYWRpdXMsIHBhZGRpbmcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBib3R0b20gcmlnaHQgcXVhcnRlciBjaXJjbGVcbiAgICAgIGlmIChjaGVja0luRWxsaXBzZSh4LCB5LCBkaWFtLCBkaWFtLCBjZW50ZXJYICsgaGFsZldpZHRoIC0gY29ybmVyUmFkaXVzLCBjZW50ZXJZICsgaGFsZkhlaWdodCAtIGNvcm5lclJhZGl1cywgcGFkZGluZykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGJvdHRvbSBsZWZ0IHF1YXJ0ZXIgY2lyY2xlXG4gICAgICBpZiAoY2hlY2tJbkVsbGlwc2UoeCwgeSwgZGlhbSwgZGlhbSwgY2VudGVyWCAtIGhhbGZXaWR0aCArIGNvcm5lclJhZGl1cywgY2VudGVyWSArIGhhbGZIZWlnaHQgLSBjb3JuZXJSYWRpdXMsIHBhZGRpbmcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcbn07XG5CUnAkMi5nZW5lcmF0ZUN1dFJlY3RhbmdsZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubm9kZVNoYXBlc1snY3V0LXJlY3RhbmdsZSddID0gdGhpcy5ub2RlU2hhcGVzWydjdXRyZWN0YW5nbGUnXSA9IHtcbiAgICByZW5kZXJlcjogdGhpcyxcbiAgICBuYW1lOiAnY3V0LXJlY3RhbmdsZScsXG4gICAgY29ybmVyTGVuZ3RoOiBnZXRDdXRSZWN0YW5nbGVDb3JuZXJMZW5ndGgoKSxcbiAgICBwb2ludHM6IGdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSg0LCAwKSxcbiAgICBkcmF3OiBmdW5jdGlvbiBkcmF3KGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIGNvcm5lclJhZGl1cykge1xuICAgICAgdGhpcy5yZW5kZXJlci5ub2RlU2hhcGVJbXBsKHRoaXMubmFtZSwgY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgbnVsbCwgY29ybmVyUmFkaXVzKTtcbiAgICB9LFxuICAgIGdlbmVyYXRlQ3V0VHJpYW5nbGVQdHM6IGZ1bmN0aW9uIGdlbmVyYXRlQ3V0VHJpYW5nbGVQdHMod2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSwgY29ybmVyUmFkaXVzKSB7XG4gICAgICB2YXIgY2wgPSBjb3JuZXJSYWRpdXMgPT09ICdhdXRvJyA/IHRoaXMuY29ybmVyTGVuZ3RoIDogY29ybmVyUmFkaXVzO1xuICAgICAgdmFyIGhoID0gaGVpZ2h0IC8gMjtcbiAgICAgIHZhciBodyA9IHdpZHRoIC8gMjtcbiAgICAgIHZhciB4QmVnaW4gPSBjZW50ZXJYIC0gaHc7XG4gICAgICB2YXIgeEVuZCA9IGNlbnRlclggKyBodztcbiAgICAgIHZhciB5QmVnaW4gPSBjZW50ZXJZIC0gaGg7XG4gICAgICB2YXIgeUVuZCA9IGNlbnRlclkgKyBoaDtcblxuICAgICAgLy8gcG9pbnRzIGFyZSBpbiBjbG9ja3dpc2Ugb3JkZXIsIGlubmVyIChpbWFnaW5hcnkpIHRyaWFuZ2xlIHB0IG9uIFs0LCA1XVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdG9wTGVmdDogW3hCZWdpbiwgeUJlZ2luICsgY2wsIHhCZWdpbiArIGNsLCB5QmVnaW4sIHhCZWdpbiArIGNsLCB5QmVnaW4gKyBjbF0sXG4gICAgICAgIHRvcFJpZ2h0OiBbeEVuZCAtIGNsLCB5QmVnaW4sIHhFbmQsIHlCZWdpbiArIGNsLCB4RW5kIC0gY2wsIHlCZWdpbiArIGNsXSxcbiAgICAgICAgYm90dG9tUmlnaHQ6IFt4RW5kLCB5RW5kIC0gY2wsIHhFbmQgLSBjbCwgeUVuZCwgeEVuZCAtIGNsLCB5RW5kIC0gY2xdLFxuICAgICAgICBib3R0b21MZWZ0OiBbeEJlZ2luICsgY2wsIHlFbmQsIHhCZWdpbiwgeUVuZCAtIGNsLCB4QmVnaW4gKyBjbCwgeUVuZCAtIGNsXVxuICAgICAgfTtcbiAgICB9LFxuICAgIGludGVyc2VjdExpbmU6IGZ1bmN0aW9uIGludGVyc2VjdExpbmUobm9kZVgsIG5vZGVZLCB3aWR0aCwgaGVpZ2h0LCB4LCB5LCBwYWRkaW5nLCBjb3JuZXJSYWRpdXMpIHtcbiAgICAgIHZhciBjUHRzID0gdGhpcy5nZW5lcmF0ZUN1dFRyaWFuZ2xlUHRzKHdpZHRoICsgMiAqIHBhZGRpbmcsIGhlaWdodCArIDIgKiBwYWRkaW5nLCBub2RlWCwgbm9kZVksIGNvcm5lclJhZGl1cyk7XG4gICAgICB2YXIgcHRzID0gW10uY29uY2F0LmFwcGx5KFtdLCBbY1B0cy50b3BMZWZ0LnNwbGljZSgwLCA0KSwgY1B0cy50b3BSaWdodC5zcGxpY2UoMCwgNCksIGNQdHMuYm90dG9tUmlnaHQuc3BsaWNlKDAsIDQpLCBjUHRzLmJvdHRvbUxlZnQuc3BsaWNlKDAsIDQpXSk7XG4gICAgICByZXR1cm4gcG9seWdvbkludGVyc2VjdExpbmUoeCwgeSwgcHRzLCBub2RlWCwgbm9kZVkpO1xuICAgIH0sXG4gICAgY2hlY2tQb2ludDogZnVuY3Rpb24gY2hlY2tQb2ludCh4LCB5LCBwYWRkaW5nLCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZLCBjb3JuZXJSYWRpdXMpIHtcbiAgICAgIHZhciBjbCA9IGNvcm5lclJhZGl1cyA9PT0gJ2F1dG8nID8gdGhpcy5jb3JuZXJMZW5ndGggOiBjb3JuZXJSYWRpdXM7XG4gICAgICAvLyBDaGVjayBoQm94XG4gICAgICBpZiAocG9pbnRJbnNpZGVQb2x5Z29uKHgsIHksIHRoaXMucG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0IC0gMiAqIGNsLCBbMCwgLTFdLCBwYWRkaW5nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgdkJveFxuICAgICAgaWYgKHBvaW50SW5zaWRlUG9seWdvbih4LCB5LCB0aGlzLnBvaW50cywgY2VudGVyWCwgY2VudGVyWSwgd2lkdGggLSAyICogY2wsIGhlaWdodCwgWzAsIC0xXSwgcGFkZGluZykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICB2YXIgY3V0VHJpYW5nbGVQdHMgPSB0aGlzLmdlbmVyYXRlQ3V0VHJpYW5nbGVQdHMod2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSk7XG4gICAgICByZXR1cm4gcG9pbnRJbnNpZGVQb2x5Z29uUG9pbnRzKHgsIHksIGN1dFRyaWFuZ2xlUHRzLnRvcExlZnQpIHx8IHBvaW50SW5zaWRlUG9seWdvblBvaW50cyh4LCB5LCBjdXRUcmlhbmdsZVB0cy50b3BSaWdodCkgfHwgcG9pbnRJbnNpZGVQb2x5Z29uUG9pbnRzKHgsIHksIGN1dFRyaWFuZ2xlUHRzLmJvdHRvbVJpZ2h0KSB8fCBwb2ludEluc2lkZVBvbHlnb25Qb2ludHMoeCwgeSwgY3V0VHJpYW5nbGVQdHMuYm90dG9tTGVmdCk7XG4gICAgfVxuICB9O1xufTtcbkJScCQyLmdlbmVyYXRlQmFycmVsID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5ub2RlU2hhcGVzWydiYXJyZWwnXSA9IHtcbiAgICByZW5kZXJlcjogdGhpcyxcbiAgICBuYW1lOiAnYmFycmVsJyxcbiAgICBwb2ludHM6IGdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSg0LCAwKSxcbiAgICBkcmF3OiBmdW5jdGlvbiBkcmF3KGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIGNvcm5lclJhZGl1cykge1xuICAgICAgdGhpcy5yZW5kZXJlci5ub2RlU2hhcGVJbXBsKHRoaXMubmFtZSwgY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCk7XG4gICAgfSxcbiAgICBpbnRlcnNlY3RMaW5lOiBmdW5jdGlvbiBpbnRlcnNlY3RMaW5lKG5vZGVYLCBub2RlWSwgd2lkdGgsIGhlaWdodCwgeCwgeSwgcGFkZGluZywgY29ybmVyUmFkaXVzKSB7XG4gICAgICAvLyB1c2UgdHdvIGZpeGVkIHQgdmFsdWVzIGZvciB0aGUgYmV6aWVyIGN1cnZlIGFwcHJveGltYXRpb25cblxuICAgICAgdmFyIHQwID0gMC4xNTtcbiAgICAgIHZhciB0MSA9IDAuNTtcbiAgICAgIHZhciB0MiA9IDAuODU7XG4gICAgICB2YXIgYlB0cyA9IHRoaXMuZ2VuZXJhdGVCYXJyZWxCZXppZXJQdHMod2lkdGggKyAyICogcGFkZGluZywgaGVpZ2h0ICsgMiAqIHBhZGRpbmcsIG5vZGVYLCBub2RlWSk7XG4gICAgICB2YXIgYXBwcm94aW1hdGVCYXJyZWxDdXJ2ZVB0cyA9IGZ1bmN0aW9uIGFwcHJveGltYXRlQmFycmVsQ3VydmVQdHMocHRzKSB7XG4gICAgICAgIC8vIGFwcHJveGltYXRlIGN1cnZlIHB0cyBiYXNlZCBvbiB0aGUgdHdvIHQgdmFsdWVzXG4gICAgICAgIHZhciBtMCA9IHFiZXppZXJQdEF0KHtcbiAgICAgICAgICB4OiBwdHNbMF0sXG4gICAgICAgICAgeTogcHRzWzFdXG4gICAgICAgIH0sIHtcbiAgICAgICAgICB4OiBwdHNbMl0sXG4gICAgICAgICAgeTogcHRzWzNdXG4gICAgICAgIH0sIHtcbiAgICAgICAgICB4OiBwdHNbNF0sXG4gICAgICAgICAgeTogcHRzWzVdXG4gICAgICAgIH0sIHQwKTtcbiAgICAgICAgdmFyIG0xID0gcWJlemllclB0QXQoe1xuICAgICAgICAgIHg6IHB0c1swXSxcbiAgICAgICAgICB5OiBwdHNbMV1cbiAgICAgICAgfSwge1xuICAgICAgICAgIHg6IHB0c1syXSxcbiAgICAgICAgICB5OiBwdHNbM11cbiAgICAgICAgfSwge1xuICAgICAgICAgIHg6IHB0c1s0XSxcbiAgICAgICAgICB5OiBwdHNbNV1cbiAgICAgICAgfSwgdDEpO1xuICAgICAgICB2YXIgbTIgPSBxYmV6aWVyUHRBdCh7XG4gICAgICAgICAgeDogcHRzWzBdLFxuICAgICAgICAgIHk6IHB0c1sxXVxuICAgICAgICB9LCB7XG4gICAgICAgICAgeDogcHRzWzJdLFxuICAgICAgICAgIHk6IHB0c1szXVxuICAgICAgICB9LCB7XG4gICAgICAgICAgeDogcHRzWzRdLFxuICAgICAgICAgIHk6IHB0c1s1XVxuICAgICAgICB9LCB0Mik7XG4gICAgICAgIHJldHVybiBbcHRzWzBdLCBwdHNbMV0sIG0wLngsIG0wLnksIG0xLngsIG0xLnksIG0yLngsIG0yLnksIHB0c1s0XSwgcHRzWzVdXTtcbiAgICAgIH07XG4gICAgICB2YXIgcHRzID0gW10uY29uY2F0KGFwcHJveGltYXRlQmFycmVsQ3VydmVQdHMoYlB0cy50b3BMZWZ0KSwgYXBwcm94aW1hdGVCYXJyZWxDdXJ2ZVB0cyhiUHRzLnRvcFJpZ2h0KSwgYXBwcm94aW1hdGVCYXJyZWxDdXJ2ZVB0cyhiUHRzLmJvdHRvbVJpZ2h0KSwgYXBwcm94aW1hdGVCYXJyZWxDdXJ2ZVB0cyhiUHRzLmJvdHRvbUxlZnQpKTtcbiAgICAgIHJldHVybiBwb2x5Z29uSW50ZXJzZWN0TGluZSh4LCB5LCBwdHMsIG5vZGVYLCBub2RlWSk7XG4gICAgfSxcbiAgICBnZW5lcmF0ZUJhcnJlbEJlemllclB0czogZnVuY3Rpb24gZ2VuZXJhdGVCYXJyZWxCZXppZXJQdHMod2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSkge1xuICAgICAgdmFyIGhoID0gaGVpZ2h0IC8gMjtcbiAgICAgIHZhciBodyA9IHdpZHRoIC8gMjtcbiAgICAgIHZhciB4QmVnaW4gPSBjZW50ZXJYIC0gaHc7XG4gICAgICB2YXIgeEVuZCA9IGNlbnRlclggKyBodztcbiAgICAgIHZhciB5QmVnaW4gPSBjZW50ZXJZIC0gaGg7XG4gICAgICB2YXIgeUVuZCA9IGNlbnRlclkgKyBoaDtcbiAgICAgIHZhciBjdXJ2ZUNvbnN0YW50cyA9IGdldEJhcnJlbEN1cnZlQ29uc3RhbnRzKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgdmFyIGhPZmZzZXQgPSBjdXJ2ZUNvbnN0YW50cy5oZWlnaHRPZmZzZXQ7XG4gICAgICB2YXIgd09mZnNldCA9IGN1cnZlQ29uc3RhbnRzLndpZHRoT2Zmc2V0O1xuICAgICAgdmFyIGN0cmxQdFhPZmZzZXQgPSBjdXJ2ZUNvbnN0YW50cy5jdHJsUHRPZmZzZXRQY3QgKiB3aWR0aDtcblxuICAgICAgLy8gcG9pbnRzIGFyZSBpbiBjbG9ja3dpc2Ugb3JkZXIsIGlubmVyIChpbWFnaW5hcnkpIGNvbnRyb2wgcHQgb24gWzQsIDVdXG4gICAgICB2YXIgcHRzID0ge1xuICAgICAgICB0b3BMZWZ0OiBbeEJlZ2luLCB5QmVnaW4gKyBoT2Zmc2V0LCB4QmVnaW4gKyBjdHJsUHRYT2Zmc2V0LCB5QmVnaW4sIHhCZWdpbiArIHdPZmZzZXQsIHlCZWdpbl0sXG4gICAgICAgIHRvcFJpZ2h0OiBbeEVuZCAtIHdPZmZzZXQsIHlCZWdpbiwgeEVuZCAtIGN0cmxQdFhPZmZzZXQsIHlCZWdpbiwgeEVuZCwgeUJlZ2luICsgaE9mZnNldF0sXG4gICAgICAgIGJvdHRvbVJpZ2h0OiBbeEVuZCwgeUVuZCAtIGhPZmZzZXQsIHhFbmQgLSBjdHJsUHRYT2Zmc2V0LCB5RW5kLCB4RW5kIC0gd09mZnNldCwgeUVuZF0sXG4gICAgICAgIGJvdHRvbUxlZnQ6IFt4QmVnaW4gKyB3T2Zmc2V0LCB5RW5kLCB4QmVnaW4gKyBjdHJsUHRYT2Zmc2V0LCB5RW5kLCB4QmVnaW4sIHlFbmQgLSBoT2Zmc2V0XVxuICAgICAgfTtcbiAgICAgIHB0cy50b3BMZWZ0LmlzVG9wID0gdHJ1ZTtcbiAgICAgIHB0cy50b3BSaWdodC5pc1RvcCA9IHRydWU7XG4gICAgICBwdHMuYm90dG9tTGVmdC5pc0JvdHRvbSA9IHRydWU7XG4gICAgICBwdHMuYm90dG9tUmlnaHQuaXNCb3R0b20gPSB0cnVlO1xuICAgICAgcmV0dXJuIHB0cztcbiAgICB9LFxuICAgIGNoZWNrUG9pbnQ6IGZ1bmN0aW9uIGNoZWNrUG9pbnQoeCwgeSwgcGFkZGluZywgd2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSwgY29ybmVyUmFkaXVzKSB7XG4gICAgICB2YXIgY3VydmVDb25zdGFudHMgPSBnZXRCYXJyZWxDdXJ2ZUNvbnN0YW50cyh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIHZhciBoT2Zmc2V0ID0gY3VydmVDb25zdGFudHMuaGVpZ2h0T2Zmc2V0O1xuICAgICAgdmFyIHdPZmZzZXQgPSBjdXJ2ZUNvbnN0YW50cy53aWR0aE9mZnNldDtcblxuICAgICAgLy8gQ2hlY2sgaEJveFxuICAgICAgaWYgKHBvaW50SW5zaWRlUG9seWdvbih4LCB5LCB0aGlzLnBvaW50cywgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCAtIDIgKiBoT2Zmc2V0LCBbMCwgLTFdLCBwYWRkaW5nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgdkJveFxuICAgICAgaWYgKHBvaW50SW5zaWRlUG9seWdvbih4LCB5LCB0aGlzLnBvaW50cywgY2VudGVyWCwgY2VudGVyWSwgd2lkdGggLSAyICogd09mZnNldCwgaGVpZ2h0LCBbMCwgLTFdLCBwYWRkaW5nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHZhciBiYXJyZWxDdXJ2ZVB0cyA9IHRoaXMuZ2VuZXJhdGVCYXJyZWxCZXppZXJQdHMod2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSk7XG4gICAgICB2YXIgZ2V0Q3VydmVUID0gZnVuY3Rpb24gZ2V0Q3VydmVUKHgsIHksIGN1cnZlUHRzKSB7XG4gICAgICAgIHZhciB4MCA9IGN1cnZlUHRzWzRdO1xuICAgICAgICB2YXIgeDEgPSBjdXJ2ZVB0c1syXTtcbiAgICAgICAgdmFyIHgyID0gY3VydmVQdHNbMF07XG4gICAgICAgIHZhciB5MCA9IGN1cnZlUHRzWzVdO1xuICAgICAgICAvLyB2YXIgeTEgPSBjdXJ2ZVB0c1sgMyBdO1xuICAgICAgICB2YXIgeTIgPSBjdXJ2ZVB0c1sxXTtcbiAgICAgICAgdmFyIHhNaW4gPSBNYXRoLm1pbih4MCwgeDIpO1xuICAgICAgICB2YXIgeE1heCA9IE1hdGgubWF4KHgwLCB4Mik7XG4gICAgICAgIHZhciB5TWluID0gTWF0aC5taW4oeTAsIHkyKTtcbiAgICAgICAgdmFyIHlNYXggPSBNYXRoLm1heCh5MCwgeTIpO1xuICAgICAgICBpZiAoeE1pbiA8PSB4ICYmIHggPD0geE1heCAmJiB5TWluIDw9IHkgJiYgeSA8PSB5TWF4KSB7XG4gICAgICAgICAgdmFyIGNvZWZmID0gYmV6aWVyUHRzVG9RdWFkQ29lZmYoeDAsIHgxLCB4Mik7XG4gICAgICAgICAgdmFyIHJvb3RzID0gc29sdmVRdWFkcmF0aWMoY29lZmZbMF0sIGNvZWZmWzFdLCBjb2VmZlsyXSwgeCk7XG4gICAgICAgICAgdmFyIHZhbGlkUm9vdHMgPSByb290cy5maWx0ZXIoZnVuY3Rpb24gKHIpIHtcbiAgICAgICAgICAgIHJldHVybiAwIDw9IHIgJiYgciA8PSAxO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmICh2YWxpZFJvb3RzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiB2YWxpZFJvb3RzWzBdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH07XG4gICAgICB2YXIgY3VydmVSZWdpb25zID0gT2JqZWN0LmtleXMoYmFycmVsQ3VydmVQdHMpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjdXJ2ZVJlZ2lvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNvcm5lciA9IGN1cnZlUmVnaW9uc1tpXTtcbiAgICAgICAgdmFyIGNvcm5lclB0cyA9IGJhcnJlbEN1cnZlUHRzW2Nvcm5lcl07XG4gICAgICAgIHZhciB0ID0gZ2V0Q3VydmVUKHgsIHksIGNvcm5lclB0cyk7XG4gICAgICAgIGlmICh0ID09IG51bGwpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgeTAgPSBjb3JuZXJQdHNbNV07XG4gICAgICAgIHZhciB5MSA9IGNvcm5lclB0c1szXTtcbiAgICAgICAgdmFyIHkyID0gY29ybmVyUHRzWzFdO1xuICAgICAgICB2YXIgYmV6WSA9IHFiZXppZXJBdCh5MCwgeTEsIHkyLCB0KTtcbiAgICAgICAgaWYgKGNvcm5lclB0cy5pc1RvcCAmJiBiZXpZIDw9IHkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29ybmVyUHRzLmlzQm90dG9tICYmIHkgPD0gYmV6WSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9O1xufTtcbkJScCQyLmdlbmVyYXRlQm90dG9tUm91bmRyZWN0YW5nbGUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLm5vZGVTaGFwZXNbJ2JvdHRvbS1yb3VuZC1yZWN0YW5nbGUnXSA9IHRoaXMubm9kZVNoYXBlc1snYm90dG9tcm91bmRyZWN0YW5nbGUnXSA9IHtcbiAgICByZW5kZXJlcjogdGhpcyxcbiAgICBuYW1lOiAnYm90dG9tLXJvdW5kLXJlY3RhbmdsZScsXG4gICAgcG9pbnRzOiBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoNCwgMCksXG4gICAgZHJhdzogZnVuY3Rpb24gZHJhdyhjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBjb3JuZXJSYWRpdXMpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIubm9kZVNoYXBlSW1wbCh0aGlzLm5hbWUsIGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHRoaXMucG9pbnRzLCBjb3JuZXJSYWRpdXMpO1xuICAgIH0sXG4gICAgaW50ZXJzZWN0TGluZTogZnVuY3Rpb24gaW50ZXJzZWN0TGluZShub2RlWCwgbm9kZVksIHdpZHRoLCBoZWlnaHQsIHgsIHksIHBhZGRpbmcsIGNvcm5lclJhZGl1cykge1xuICAgICAgdmFyIHRvcFN0YXJ0WCA9IG5vZGVYIC0gKHdpZHRoIC8gMiArIHBhZGRpbmcpO1xuICAgICAgdmFyIHRvcFN0YXJ0WSA9IG5vZGVZIC0gKGhlaWdodCAvIDIgKyBwYWRkaW5nKTtcbiAgICAgIHZhciB0b3BFbmRZID0gdG9wU3RhcnRZO1xuICAgICAgdmFyIHRvcEVuZFggPSBub2RlWCArICh3aWR0aCAvIDIgKyBwYWRkaW5nKTtcbiAgICAgIHZhciB0b3BJbnRlcnNlY3Rpb25zID0gZmluaXRlTGluZXNJbnRlcnNlY3QoeCwgeSwgbm9kZVgsIG5vZGVZLCB0b3BTdGFydFgsIHRvcFN0YXJ0WSwgdG9wRW5kWCwgdG9wRW5kWSwgZmFsc2UpO1xuICAgICAgaWYgKHRvcEludGVyc2VjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gdG9wSW50ZXJzZWN0aW9ucztcbiAgICAgIH1cbiAgICAgIHJldHVybiByb3VuZFJlY3RhbmdsZUludGVyc2VjdExpbmUoeCwgeSwgbm9kZVgsIG5vZGVZLCB3aWR0aCwgaGVpZ2h0LCBwYWRkaW5nLCBjb3JuZXJSYWRpdXMpO1xuICAgIH0sXG4gICAgY2hlY2tQb2ludDogZnVuY3Rpb24gY2hlY2tQb2ludCh4LCB5LCBwYWRkaW5nLCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZLCBjb3JuZXJSYWRpdXMpIHtcbiAgICAgIGNvcm5lclJhZGl1cyA9IGNvcm5lclJhZGl1cyA9PT0gJ2F1dG8nID8gZ2V0Um91bmRSZWN0YW5nbGVSYWRpdXMod2lkdGgsIGhlaWdodCkgOiBjb3JuZXJSYWRpdXM7XG4gICAgICB2YXIgZGlhbSA9IDIgKiBjb3JuZXJSYWRpdXM7XG5cbiAgICAgIC8vIENoZWNrIGhCb3hcbiAgICAgIGlmIChwb2ludEluc2lkZVBvbHlnb24oeCwgeSwgdGhpcy5wb2ludHMsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQgLSBkaWFtLCBbMCwgLTFdLCBwYWRkaW5nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgdkJveFxuICAgICAgaWYgKHBvaW50SW5zaWRlUG9seWdvbih4LCB5LCB0aGlzLnBvaW50cywgY2VudGVyWCwgY2VudGVyWSwgd2lkdGggLSBkaWFtLCBoZWlnaHQsIFswLCAtMV0sIHBhZGRpbmcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBjaGVjayBub24tcm91bmRlZCB0b3Agc2lkZVxuICAgICAgdmFyIG91dGVyV2lkdGggPSB3aWR0aCAvIDIgKyAyICogcGFkZGluZztcbiAgICAgIHZhciBvdXRlckhlaWdodCA9IGhlaWdodCAvIDIgKyAyICogcGFkZGluZztcbiAgICAgIHZhciBwb2ludHMgPSBbY2VudGVyWCAtIG91dGVyV2lkdGgsIGNlbnRlclkgLSBvdXRlckhlaWdodCwgY2VudGVyWCAtIG91dGVyV2lkdGgsIGNlbnRlclksIGNlbnRlclggKyBvdXRlcldpZHRoLCBjZW50ZXJZLCBjZW50ZXJYICsgb3V0ZXJXaWR0aCwgY2VudGVyWSAtIG91dGVySGVpZ2h0XTtcbiAgICAgIGlmIChwb2ludEluc2lkZVBvbHlnb25Qb2ludHMoeCwgeSwgcG9pbnRzKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgYm90dG9tIHJpZ2h0IHF1YXJ0ZXIgY2lyY2xlXG4gICAgICBpZiAoY2hlY2tJbkVsbGlwc2UoeCwgeSwgZGlhbSwgZGlhbSwgY2VudGVyWCArIHdpZHRoIC8gMiAtIGNvcm5lclJhZGl1cywgY2VudGVyWSArIGhlaWdodCAvIDIgLSBjb3JuZXJSYWRpdXMsIHBhZGRpbmcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBib3R0b20gbGVmdCBxdWFydGVyIGNpcmNsZVxuICAgICAgaWYgKGNoZWNrSW5FbGxpcHNlKHgsIHksIGRpYW0sIGRpYW0sIGNlbnRlclggLSB3aWR0aCAvIDIgKyBjb3JuZXJSYWRpdXMsIGNlbnRlclkgKyBoZWlnaHQgLyAyIC0gY29ybmVyUmFkaXVzLCBwYWRkaW5nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH07XG59O1xuQlJwJDIucmVnaXN0ZXJOb2RlU2hhcGVzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbm9kZVNoYXBlcyA9IHRoaXMubm9kZVNoYXBlcyA9IHt9O1xuICB2YXIgcmVuZGVyZXIgPSB0aGlzO1xuICB0aGlzLmdlbmVyYXRlRWxsaXBzZSgpO1xuICB0aGlzLmdlbmVyYXRlUG9seWdvbigndHJpYW5nbGUnLCBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoMywgMCkpO1xuICB0aGlzLmdlbmVyYXRlUm91bmRQb2x5Z29uKCdyb3VuZC10cmlhbmdsZScsIGdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSgzLCAwKSk7XG4gIHRoaXMuZ2VuZXJhdGVQb2x5Z29uKCdyZWN0YW5nbGUnLCBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoNCwgMCkpO1xuICBub2RlU2hhcGVzWydzcXVhcmUnXSA9IG5vZGVTaGFwZXNbJ3JlY3RhbmdsZSddO1xuICB0aGlzLmdlbmVyYXRlUm91bmRSZWN0YW5nbGUoKTtcbiAgdGhpcy5nZW5lcmF0ZUN1dFJlY3RhbmdsZSgpO1xuICB0aGlzLmdlbmVyYXRlQmFycmVsKCk7XG4gIHRoaXMuZ2VuZXJhdGVCb3R0b21Sb3VuZHJlY3RhbmdsZSgpO1xuICB7XG4gICAgdmFyIGRpYW1vbmRQb2ludHMgPSBbMCwgMSwgMSwgMCwgMCwgLTEsIC0xLCAwXTtcbiAgICB0aGlzLmdlbmVyYXRlUG9seWdvbignZGlhbW9uZCcsIGRpYW1vbmRQb2ludHMpO1xuICAgIHRoaXMuZ2VuZXJhdGVSb3VuZFBvbHlnb24oJ3JvdW5kLWRpYW1vbmQnLCBkaWFtb25kUG9pbnRzKTtcbiAgfVxuICB0aGlzLmdlbmVyYXRlUG9seWdvbigncGVudGFnb24nLCBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoNSwgMCkpO1xuICB0aGlzLmdlbmVyYXRlUm91bmRQb2x5Z29uKCdyb3VuZC1wZW50YWdvbicsIGdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSg1LCAwKSk7XG4gIHRoaXMuZ2VuZXJhdGVQb2x5Z29uKCdoZXhhZ29uJywgZ2VuZXJhdGVVbml0TmdvblBvaW50c0ZpdFRvU3F1YXJlKDYsIDApKTtcbiAgdGhpcy5nZW5lcmF0ZVJvdW5kUG9seWdvbigncm91bmQtaGV4YWdvbicsIGdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSg2LCAwKSk7XG4gIHRoaXMuZ2VuZXJhdGVQb2x5Z29uKCdoZXB0YWdvbicsIGdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSg3LCAwKSk7XG4gIHRoaXMuZ2VuZXJhdGVSb3VuZFBvbHlnb24oJ3JvdW5kLWhlcHRhZ29uJywgZ2VuZXJhdGVVbml0TmdvblBvaW50c0ZpdFRvU3F1YXJlKDcsIDApKTtcbiAgdGhpcy5nZW5lcmF0ZVBvbHlnb24oJ29jdGFnb24nLCBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoOCwgMCkpO1xuICB0aGlzLmdlbmVyYXRlUm91bmRQb2x5Z29uKCdyb3VuZC1vY3RhZ29uJywgZ2VuZXJhdGVVbml0TmdvblBvaW50c0ZpdFRvU3F1YXJlKDgsIDApKTtcbiAgdmFyIHN0YXI1UG9pbnRzID0gbmV3IEFycmF5KDIwKTtcbiAge1xuICAgIHZhciBvdXRlclBvaW50cyA9IGdlbmVyYXRlVW5pdE5nb25Qb2ludHMoNSwgMCk7XG4gICAgdmFyIGlubmVyUG9pbnRzID0gZ2VuZXJhdGVVbml0TmdvblBvaW50cyg1LCBNYXRoLlBJIC8gNSk7XG5cbiAgICAvLyBPdXRlciByYWRpdXMgaXMgMTsgaW5uZXIgcmFkaXVzIG9mIHN0YXIgaXMgc21hbGxlclxuICAgIHZhciBpbm5lclJhZGl1cyA9IDAuNSAqICgzIC0gTWF0aC5zcXJ0KDUpKTtcbiAgICBpbm5lclJhZGl1cyAqPSAxLjU3O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5uZXJQb2ludHMubGVuZ3RoIC8gMjsgaSsrKSB7XG4gICAgICBpbm5lclBvaW50c1tpICogMl0gKj0gaW5uZXJSYWRpdXM7XG4gICAgICBpbm5lclBvaW50c1tpICogMiArIDFdICo9IGlubmVyUmFkaXVzO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDIwIC8gNDsgaSsrKSB7XG4gICAgICBzdGFyNVBvaW50c1tpICogNF0gPSBvdXRlclBvaW50c1tpICogMl07XG4gICAgICBzdGFyNVBvaW50c1tpICogNCArIDFdID0gb3V0ZXJQb2ludHNbaSAqIDIgKyAxXTtcbiAgICAgIHN0YXI1UG9pbnRzW2kgKiA0ICsgMl0gPSBpbm5lclBvaW50c1tpICogMl07XG4gICAgICBzdGFyNVBvaW50c1tpICogNCArIDNdID0gaW5uZXJQb2ludHNbaSAqIDIgKyAxXTtcbiAgICB9XG4gIH1cbiAgc3RhcjVQb2ludHMgPSBmaXRQb2x5Z29uVG9TcXVhcmUoc3RhcjVQb2ludHMpO1xuICB0aGlzLmdlbmVyYXRlUG9seWdvbignc3RhcicsIHN0YXI1UG9pbnRzKTtcbiAgdGhpcy5nZW5lcmF0ZVBvbHlnb24oJ3ZlZScsIFstMSwgLTEsIDAsIC0wLjMzMywgMSwgLTEsIDAsIDFdKTtcbiAgdGhpcy5nZW5lcmF0ZVBvbHlnb24oJ3Job21ib2lkJywgWy0xLCAtMSwgMC4zMzMsIC0xLCAxLCAxLCAtMC4zMzMsIDFdKTtcbiAgdGhpcy5nZW5lcmF0ZVBvbHlnb24oJ3JpZ2h0LXJob21ib2lkJywgWy0wLjMzMywgLTEsIDEsIC0xLCAwLjMzMywgMSwgLTEsIDFdKTtcbiAgdGhpcy5ub2RlU2hhcGVzWydjb25jYXZlaGV4YWdvbiddID0gdGhpcy5nZW5lcmF0ZVBvbHlnb24oJ2NvbmNhdmUtaGV4YWdvbicsIFstMSwgLTAuOTUsIC0wLjc1LCAwLCAtMSwgMC45NSwgMSwgMC45NSwgMC43NSwgMCwgMSwgLTAuOTVdKTtcbiAge1xuICAgIHZhciB0YWdQb2ludHMgPSBbLTEsIC0xLCAwLjI1LCAtMSwgMSwgMCwgMC4yNSwgMSwgLTEsIDFdO1xuICAgIHRoaXMuZ2VuZXJhdGVQb2x5Z29uKCd0YWcnLCB0YWdQb2ludHMpO1xuICAgIHRoaXMuZ2VuZXJhdGVSb3VuZFBvbHlnb24oJ3JvdW5kLXRhZycsIHRhZ1BvaW50cyk7XG4gIH1cbiAgbm9kZVNoYXBlcy5tYWtlUG9seWdvbiA9IGZ1bmN0aW9uIChwb2ludHMpIHtcbiAgICAvLyB1c2UgY2FjaGluZyBvbiB1c2VyLXNwZWNpZmllZCBwb2x5Z29ucyBzbyB0aGV5IGFyZSBhcyBmYXN0IGFzIG5hdGl2ZSBzaGFwZXNcblxuICAgIHZhciBrZXkgPSBwb2ludHMuam9pbignJCcpO1xuICAgIHZhciBuYW1lID0gJ3BvbHlnb24tJyArIGtleTtcbiAgICB2YXIgc2hhcGU7XG4gICAgaWYgKHNoYXBlID0gdGhpc1tuYW1lXSkge1xuICAgICAgLy8gZ290IGNhY2hlZCBzaGFwZVxuICAgICAgcmV0dXJuIHNoYXBlO1xuICAgIH1cblxuICAgIC8vIGNyZWF0ZSBhbmQgY2FjaGUgbmV3IHNoYXBlXG4gICAgcmV0dXJuIHJlbmRlcmVyLmdlbmVyYXRlUG9seWdvbihuYW1lLCBwb2ludHMpO1xuICB9O1xufTtcblxudmFyIEJScCQxID0ge307XG5CUnAkMS50aW1lVG9SZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnJlZHJhd1RvdGFsVGltZSAvIHRoaXMucmVkcmF3Q291bnQ7XG59O1xuQlJwJDEucmVkcmF3ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwgc3RhdGljRW1wdHlPYmplY3QoKTtcbiAgdmFyIHIgPSB0aGlzO1xuICBpZiAoci5hdmVyYWdlUmVkcmF3VGltZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgci5hdmVyYWdlUmVkcmF3VGltZSA9IDA7XG4gIH1cbiAgaWYgKHIubGFzdFJlZHJhd1RpbWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHIubGFzdFJlZHJhd1RpbWUgPSAwO1xuICB9XG4gIGlmIChyLmxhc3REcmF3VGltZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgci5sYXN0RHJhd1RpbWUgPSAwO1xuICB9XG4gIHIucmVxdWVzdGVkRnJhbWUgPSB0cnVlO1xuICByLnJlbmRlck9wdGlvbnMgPSBvcHRpb25zO1xufTtcbkJScCQxLmJlZm9yZVJlbmRlciA9IGZ1bmN0aW9uIChmbiwgcHJpb3JpdHkpIHtcbiAgLy8gdGhlIHJlbmRlcmVyIGNhbid0IGFkZCB0aWNrIGNhbGxiYWNrcyB3aGVuIGRlc3Ryb3llZFxuICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHByaW9yaXR5ID09IG51bGwpIHtcbiAgICBlcnJvcignUHJpb3JpdHkgaXMgbm90IG9wdGlvbmFsIGZvciBiZWZvcmVSZW5kZXInKTtcbiAgfVxuICB2YXIgY2JzID0gdGhpcy5iZWZvcmVSZW5kZXJDYWxsYmFja3M7XG4gIGNicy5wdXNoKHtcbiAgICBmbjogZm4sXG4gICAgcHJpb3JpdHk6IHByaW9yaXR5XG4gIH0pO1xuXG4gIC8vIGhpZ2hlciBwcmlvcml0eSBjYWxsYmFja3MgZXhlY3V0ZWQgZmlyc3RcbiAgY2JzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gYi5wcmlvcml0eSAtIGEucHJpb3JpdHk7XG4gIH0pO1xufTtcbnZhciBiZWZvcmVSZW5kZXJDYWxsYmFja3MgPSBmdW5jdGlvbiBiZWZvcmVSZW5kZXJDYWxsYmFja3Mociwgd2lsbERyYXcsIHN0YXJ0VGltZSkge1xuICB2YXIgY2JzID0gci5iZWZvcmVSZW5kZXJDYWxsYmFja3M7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY2JzLmxlbmd0aDsgaSsrKSB7XG4gICAgY2JzW2ldLmZuKHdpbGxEcmF3LCBzdGFydFRpbWUpO1xuICB9XG59O1xuQlJwJDEuc3RhcnRSZW5kZXJMb29wID0gZnVuY3Rpb24gKCkge1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBjeSA9IHIuY3k7XG4gIGlmIChyLnJlbmRlckxvb3BTdGFydGVkKSB7XG4gICAgcmV0dXJuO1xuICB9IGVsc2Uge1xuICAgIHIucmVuZGVyTG9vcFN0YXJ0ZWQgPSB0cnVlO1xuICB9XG4gIHZhciBfcmVuZGVyRm4gPSBmdW5jdGlvbiByZW5kZXJGbihyZXF1ZXN0VGltZSkge1xuICAgIGlmIChyLmRlc3Ryb3llZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoY3kuYmF0Y2hpbmcoKSkgOyBlbHNlIGlmIChyLnJlcXVlc3RlZEZyYW1lICYmICFyLnNraXBGcmFtZSkge1xuICAgICAgYmVmb3JlUmVuZGVyQ2FsbGJhY2tzKHIsIHRydWUsIHJlcXVlc3RUaW1lKTtcbiAgICAgIHZhciBzdGFydFRpbWUgPSBwZXJmb3JtYW5jZU5vdygpO1xuICAgICAgci5yZW5kZXIoci5yZW5kZXJPcHRpb25zKTtcbiAgICAgIHZhciBlbmRUaW1lID0gci5sYXN0RHJhd1RpbWUgPSBwZXJmb3JtYW5jZU5vdygpO1xuICAgICAgaWYgKHIuYXZlcmFnZVJlZHJhd1RpbWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByLmF2ZXJhZ2VSZWRyYXdUaW1lID0gZW5kVGltZSAtIHN0YXJ0VGltZTtcbiAgICAgIH1cbiAgICAgIGlmIChyLnJlZHJhd0NvdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgci5yZWRyYXdDb3VudCA9IDA7XG4gICAgICB9XG4gICAgICByLnJlZHJhd0NvdW50Kys7XG4gICAgICBpZiAoci5yZWRyYXdUb3RhbFRpbWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByLnJlZHJhd1RvdGFsVGltZSA9IDA7XG4gICAgICB9XG4gICAgICB2YXIgZHVyYXRpb24gPSBlbmRUaW1lIC0gc3RhcnRUaW1lO1xuICAgICAgci5yZWRyYXdUb3RhbFRpbWUgKz0gZHVyYXRpb247XG4gICAgICByLmxhc3RSZWRyYXdUaW1lID0gZHVyYXRpb247XG5cbiAgICAgIC8vIHVzZSBhIHdlaWdodGVkIGF2ZXJhZ2Ugd2l0aCBhIGJpYXMgZnJvbSB0aGUgcHJldmlvdXMgYXZlcmFnZSBzbyB3ZSBkb24ndCBzcGlrZSBzbyBlYXNpbHlcbiAgICAgIHIuYXZlcmFnZVJlZHJhd1RpbWUgPSByLmF2ZXJhZ2VSZWRyYXdUaW1lIC8gMiArIGR1cmF0aW9uIC8gMjtcbiAgICAgIHIucmVxdWVzdGVkRnJhbWUgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgYmVmb3JlUmVuZGVyQ2FsbGJhY2tzKHIsIGZhbHNlLCByZXF1ZXN0VGltZSk7XG4gICAgfVxuICAgIHIuc2tpcEZyYW1lID0gZmFsc2U7XG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKF9yZW5kZXJGbik7XG4gIH07XG4gIHJlcXVlc3RBbmltYXRpb25GcmFtZShfcmVuZGVyRm4pO1xufTtcblxudmFyIEJhc2VSZW5kZXJlciA9IGZ1bmN0aW9uIEJhc2VSZW5kZXJlcihvcHRpb25zKSB7XG4gIHRoaXMuaW5pdChvcHRpb25zKTtcbn07XG52YXIgQlIgPSBCYXNlUmVuZGVyZXI7XG52YXIgQlJwID0gQlIucHJvdG90eXBlO1xuQlJwLmNsaWVudEZ1bmN0aW9ucyA9IFsncmVkcmF3SGludCcsICdyZW5kZXInLCAncmVuZGVyVG8nLCAnbWF0Y2hDYW52YXNTaXplJywgJ25vZGVTaGFwZUltcGwnLCAnYXJyb3dTaGFwZUltcGwnXTtcbkJScC5pbml0ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICByLm9wdGlvbnMgPSBvcHRpb25zO1xuICByLmN5ID0gb3B0aW9ucy5jeTtcbiAgdmFyIGN0ciA9IHIuY29udGFpbmVyID0gb3B0aW9ucy5jeS5jb250YWluZXIoKTtcbiAgdmFyIGNvbnRhaW5lcldpbmRvdyA9IHIuY3kud2luZG93KCk7XG5cbiAgLy8gcHJlcGVuZCBhIHN0eWxlc2hlZXQgaW4gdGhlIGhlYWQgc3VjaCB0aGF0XG4gIGlmIChjb250YWluZXJXaW5kb3cpIHtcbiAgICB2YXIgZG9jdW1lbnQgPSBjb250YWluZXJXaW5kb3cuZG9jdW1lbnQ7XG4gICAgdmFyIGhlYWQgPSBkb2N1bWVudC5oZWFkO1xuICAgIHZhciBzdHlsZXNoZWV0SWQgPSAnX19fX19fX19fX2N5dG9zY2FwZV9zdHlsZXNoZWV0JztcbiAgICB2YXIgY2xhc3NOYW1lID0gJ19fX19fX19fX19jeXRvc2NhcGVfY29udGFpbmVyJztcbiAgICB2YXIgc3R5bGVzaGVldEFscmVhZHlFeGlzdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzdHlsZXNoZWV0SWQpICE9IG51bGw7XG4gICAgaWYgKGN0ci5jbGFzc05hbWUuaW5kZXhPZihjbGFzc05hbWUpIDwgMCkge1xuICAgICAgY3RyLmNsYXNzTmFtZSA9IChjdHIuY2xhc3NOYW1lIHx8ICcnKSArICcgJyArIGNsYXNzTmFtZTtcbiAgICB9XG4gICAgaWYgKCFzdHlsZXNoZWV0QWxyZWFkeUV4aXN0cykge1xuICAgICAgdmFyIHN0eWxlc2hlZXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgc3R5bGVzaGVldC5pZCA9IHN0eWxlc2hlZXRJZDtcbiAgICAgIHN0eWxlc2hlZXQudGV4dENvbnRlbnQgPSAnLicgKyBjbGFzc05hbWUgKyAnIHsgcG9zaXRpb246IHJlbGF0aXZlOyB9JztcbiAgICAgIGhlYWQuaW5zZXJ0QmVmb3JlKHN0eWxlc2hlZXQsIGhlYWQuY2hpbGRyZW5bMF0pOyAvLyBmaXJzdCBzbyBsb3dlc3QgcHJpb3JpdHlcbiAgICB9XG4gICAgdmFyIGNvbXB1dGVkU3R5bGUgPSBjb250YWluZXJXaW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjdHIpO1xuICAgIHZhciBwb3NpdGlvbiA9IGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgncG9zaXRpb24nKTtcbiAgICBpZiAocG9zaXRpb24gPT09ICdzdGF0aWMnKSB7XG4gICAgICB3YXJuKCdBIEN5dG9zY2FwZSBjb250YWluZXIgaGFzIHN0eWxlIHBvc2l0aW9uOnN0YXRpYyBhbmQgc28gY2FuIG5vdCB1c2UgVUkgZXh0ZW5zaW9ucyBwcm9wZXJseScpO1xuICAgIH1cbiAgfVxuICByLnNlbGVjdGlvbiA9IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIDBdOyAvLyBDb29yZGluYXRlcyBmb3Igc2VsZWN0aW9uIGJveCwgcGx1cyBlbmFibGVkIGZsYWdcblxuICByLmJlemllclByb2pQY3RzID0gWzAuMDUsIDAuMjI1LCAwLjQsIDAuNSwgMC42LCAwLjc3NSwgMC45NV07XG5cbiAgLy8tLVBvaW50ZXItcmVsYXRlZCBkYXRhXG4gIHIuaG92ZXJEYXRhID0ge1xuICAgIGRvd246IG51bGwsXG4gICAgbGFzdDogbnVsbCxcbiAgICBkb3duVGltZTogbnVsbCxcbiAgICB0cmlnZ2VyTW9kZTogbnVsbCxcbiAgICBkcmFnZ2luZzogZmFsc2UsXG4gICAgaW5pdGlhbFBhbjogW251bGwsIG51bGxdLFxuICAgIGNhcHR1cmU6IGZhbHNlXG4gIH07XG4gIHIuZHJhZ0RhdGEgPSB7XG4gICAgcG9zc2libGVEcmFnRWxlbWVudHM6IFtdXG4gIH07XG4gIHIudG91Y2hEYXRhID0ge1xuICAgIHN0YXJ0OiBudWxsLFxuICAgIGNhcHR1cmU6IGZhbHNlLFxuICAgIC8vIFRoZXNlIDMgZmllbGRzIHJlbGF0ZWQgdG8gdGFwLCB0YXBob2xkIGV2ZW50c1xuICAgIHN0YXJ0UG9zaXRpb246IFtudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsXSxcbiAgICBzaW5nbGVUb3VjaFN0YXJ0VGltZTogbnVsbCxcbiAgICBzaW5nbGVUb3VjaE1vdmVkOiB0cnVlLFxuICAgIG5vdzogW251bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGxdLFxuICAgIGVhcmxpZXI6IFtudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsXVxuICB9O1xuICByLnJlZHJhd3MgPSAwO1xuICByLnNob3dGcHMgPSBvcHRpb25zLnNob3dGcHM7XG4gIHIuZGVidWcgPSBvcHRpb25zLmRlYnVnO1xuICByLndlYmdsID0gb3B0aW9ucy53ZWJnbDtcbiAgci5oaWRlRWRnZXNPblZpZXdwb3J0ID0gb3B0aW9ucy5oaWRlRWRnZXNPblZpZXdwb3J0O1xuICByLnRleHR1cmVPblZpZXdwb3J0ID0gb3B0aW9ucy50ZXh0dXJlT25WaWV3cG9ydDtcbiAgci53aGVlbFNlbnNpdGl2aXR5ID0gb3B0aW9ucy53aGVlbFNlbnNpdGl2aXR5O1xuICByLm1vdGlvbkJsdXJFbmFibGVkID0gb3B0aW9ucy5tb3Rpb25CbHVyOyAvLyBvbiBieSBkZWZhdWx0XG4gIHIuZm9yY2VkUGl4ZWxSYXRpbyA9IG51bWJlciQxKG9wdGlvbnMucGl4ZWxSYXRpbykgPyBvcHRpb25zLnBpeGVsUmF0aW8gOiBudWxsO1xuICByLm1vdGlvbkJsdXIgPSBvcHRpb25zLm1vdGlvbkJsdXI7IC8vIGZvciBpbml0aWFsIGtpY2sgb2ZmXG4gIHIubW90aW9uQmx1ck9wYWNpdHkgPSBvcHRpb25zLm1vdGlvbkJsdXJPcGFjaXR5O1xuICByLm1vdGlvbkJsdXJUcmFuc3BhcmVuY3kgPSAxIC0gci5tb3Rpb25CbHVyT3BhY2l0eTtcbiAgci5tb3Rpb25CbHVyUHhSYXRpbyA9IDE7XG4gIHIubWJQeFJCbHVycnkgPSAxOyAvLzAuODtcbiAgci5taW5NYkxvd1F1YWxGcmFtZXMgPSA0O1xuICByLmZ1bGxRdWFsaXR5TWIgPSBmYWxzZTtcbiAgci5jbGVhcmVkRm9yTW90aW9uQmx1ciA9IFtdO1xuICByLmRlc2t0b3BUYXBUaHJlc2hvbGQgPSBvcHRpb25zLmRlc2t0b3BUYXBUaHJlc2hvbGQ7XG4gIHIuZGVza3RvcFRhcFRocmVzaG9sZDIgPSBvcHRpb25zLmRlc2t0b3BUYXBUaHJlc2hvbGQgKiBvcHRpb25zLmRlc2t0b3BUYXBUaHJlc2hvbGQ7XG4gIHIudG91Y2hUYXBUaHJlc2hvbGQgPSBvcHRpb25zLnRvdWNoVGFwVGhyZXNob2xkO1xuICByLnRvdWNoVGFwVGhyZXNob2xkMiA9IG9wdGlvbnMudG91Y2hUYXBUaHJlc2hvbGQgKiBvcHRpb25zLnRvdWNoVGFwVGhyZXNob2xkO1xuICByLnRhcGhvbGREdXJhdGlvbiA9IDUwMDtcbiAgci5iaW5kaW5ncyA9IFtdO1xuICByLmJlZm9yZVJlbmRlckNhbGxiYWNrcyA9IFtdO1xuICByLmJlZm9yZVJlbmRlclByaW9yaXRpZXMgPSB7XG4gICAgLy8gaGlnaGVyIHByaW9yaXR5IGV4ZWNzIGJlZm9yZSBsb3dlciBvbmVcbiAgICBhbmltYXRpb25zOiA0MDAsXG4gICAgZWxlQ2FsY3M6IDMwMCxcbiAgICBlbGVUeHJEZXE6IDIwMCxcbiAgICBseXJUeHJEZXE6IDE1MCxcbiAgICBseXJUeHJTa2lwOiAxMDBcbiAgfTtcbiAgci5yZWdpc3Rlck5vZGVTaGFwZXMoKTtcbiAgci5yZWdpc3RlckFycm93U2hhcGVzKCk7XG4gIHIucmVnaXN0ZXJDYWxjdWxhdGlvbkxpc3RlbmVycygpO1xufTtcbkJScC5ub3RpZnkgPSBmdW5jdGlvbiAoZXZlbnROYW1lLCBlbGVzKSB7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIGN5ID0gci5jeTtcblxuICAvLyB0aGUgcmVuZGVyZXIgY2FuJ3QgYmUgbm90aWZpZWQgYWZ0ZXIgaXQncyBkZXN0cm95ZWRcbiAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChldmVudE5hbWUgPT09ICdpbml0Jykge1xuICAgIHIubG9hZCgpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoZXZlbnROYW1lID09PSAnZGVzdHJveScpIHtcbiAgICByLmRlc3Ryb3koKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGV2ZW50TmFtZSA9PT0gJ2FkZCcgfHwgZXZlbnROYW1lID09PSAncmVtb3ZlJyB8fCBldmVudE5hbWUgPT09ICdtb3ZlJyAmJiBjeS5oYXNDb21wb3VuZE5vZGVzKCkgfHwgZXZlbnROYW1lID09PSAnbG9hZCcgfHwgZXZlbnROYW1lID09PSAnem9yZGVyJyB8fCBldmVudE5hbWUgPT09ICdtb3VudCcpIHtcbiAgICByLmludmFsaWRhdGVDYWNoZWRaU29ydGVkRWxlcygpO1xuICB9XG4gIGlmIChldmVudE5hbWUgPT09ICd2aWV3cG9ydCcpIHtcbiAgICByLnJlZHJhd0hpbnQoJ3NlbGVjdCcsIHRydWUpO1xuICB9XG4gIGlmIChldmVudE5hbWUgPT09ICdnYycpIHtcbiAgICByLnJlZHJhd0hpbnQoJ2djJywgdHJ1ZSk7XG4gIH1cbiAgaWYgKGV2ZW50TmFtZSA9PT0gJ2xvYWQnIHx8IGV2ZW50TmFtZSA9PT0gJ3Jlc2l6ZScgfHwgZXZlbnROYW1lID09PSAnbW91bnQnKSB7XG4gICAgci5pbnZhbGlkYXRlQ29udGFpbmVyQ2xpZW50Q29vcmRzQ2FjaGUoKTtcbiAgICByLm1hdGNoQ2FudmFzU2l6ZShyLmNvbnRhaW5lcik7XG4gIH1cbiAgci5yZWRyYXdIaW50KCdlbGVzJywgdHJ1ZSk7XG4gIHIucmVkcmF3SGludCgnZHJhZycsIHRydWUpO1xuICB0aGlzLnN0YXJ0UmVuZGVyTG9vcCgpO1xuICB0aGlzLnJlZHJhdygpO1xufTtcbkJScC5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgciA9IHRoaXM7XG4gIHIuZGVzdHJveWVkID0gdHJ1ZTtcbiAgci5jeS5zdG9wQW5pbWF0aW9uTG9vcCgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHIuYmluZGluZ3MubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgYmluZGluZyA9IHIuYmluZGluZ3NbaV07XG4gICAgdmFyIGIgPSBiaW5kaW5nO1xuICAgIHZhciB0Z3QgPSBiLnRhcmdldDtcbiAgICAodGd0Lm9mZiB8fCB0Z3QucmVtb3ZlRXZlbnRMaXN0ZW5lcikuYXBwbHkodGd0LCBiLmFyZ3MpO1xuICB9XG4gIHIuYmluZGluZ3MgPSBbXTtcbiAgci5iZWZvcmVSZW5kZXJDYWxsYmFja3MgPSBbXTtcbiAgci5vblVwZGF0ZUVsZUNhbGNzRm5zID0gW107XG4gIGlmIChyLnJlbW92ZU9ic2VydmVyKSB7XG4gICAgci5yZW1vdmVPYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gIH1cbiAgaWYgKHIuc3R5bGVPYnNlcnZlcikge1xuICAgIHIuc3R5bGVPYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gIH1cbiAgaWYgKHIucmVzaXplT2JzZXJ2ZXIpIHtcbiAgICByLnJlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgfVxuICBpZiAoci5sYWJlbENhbGNEaXYpIHtcbiAgICB0cnkge1xuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChyLmxhYmVsQ2FsY0Rpdik7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBpZTEwIGlzc3VlICMxMDE0XG4gICAgfVxuICB9XG59O1xuQlJwLmlzSGVhZGxlc3MgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmYWxzZTtcbn07XG5bQlJwJGYsIEJScCQ1LCBCUnAkNCwgQlJwJDMsIEJScCQyLCBCUnAkMV0uZm9yRWFjaChmdW5jdGlvbiAocHJvcHMpIHtcbiAgZXh0ZW5kKEJScCwgcHJvcHMpO1xufSk7XG5cbnZhciBmdWxsRnBzVGltZSA9IDEwMDAgLyA2MDsgLy8gYXNzdW1lIDYwIGZyYW1lcyBwZXIgc2Vjb25kXG5cbnZhciBkZWZzID0ge1xuICBzZXR1cERlcXVldWVpbmc6IGZ1bmN0aW9uIHNldHVwRGVxdWV1ZWluZyhvcHRzKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHNldHVwRGVxdWV1ZWluZ0ltcGwoKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgciA9IHRoaXMucmVuZGVyZXI7XG4gICAgICBpZiAoc2VsZi5kZXF1ZXVlaW5nU2V0dXApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VsZi5kZXF1ZXVlaW5nU2V0dXAgPSB0cnVlO1xuICAgICAgfVxuICAgICAgdmFyIHF1ZXVlUmVkcmF3ID0gZGVib3VuY2UoZnVuY3Rpb24gKCkge1xuICAgICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgICAgci5yZWRyYXdIaW50KCdkcmFnJywgdHJ1ZSk7XG4gICAgICAgIHIucmVkcmF3KCk7XG4gICAgICB9LCBvcHRzLmRlcVJlZHJhd1RocmVzaG9sZCk7XG4gICAgICB2YXIgZGVxdWV1ZSA9IGZ1bmN0aW9uIGRlcXVldWUod2lsbERyYXcsIGZyYW1lU3RhcnRUaW1lKSB7XG4gICAgICAgIHZhciBzdGFydFRpbWUgPSBwZXJmb3JtYW5jZU5vdygpO1xuICAgICAgICB2YXIgYXZnUmVuZGVyVGltZSA9IHIuYXZlcmFnZVJlZHJhd1RpbWU7XG4gICAgICAgIHZhciByZW5kZXJUaW1lID0gci5sYXN0UmVkcmF3VGltZTtcbiAgICAgICAgdmFyIGRlcWQgPSBbXTtcbiAgICAgICAgdmFyIGV4dGVudCA9IHIuY3kuZXh0ZW50KCk7XG4gICAgICAgIHZhciBwaXhlbFJhdGlvID0gci5nZXRQaXhlbFJhdGlvKCk7XG5cbiAgICAgICAgLy8gaWYgd2UgYXJlbid0IGluIGEgdGljayB0aGF0IGNhdXNlcyBhIGRyYXcsIHRoZW4gdGhlIHJlbmRlcmVkIHN0eWxlXG4gICAgICAgIC8vIHF1ZXVlIHdvbid0IGF1dG9tYXRpY2FsbHkgYmUgZmx1c2hlZCBiZWZvcmUgZGVxdWV1ZWluZyBzdGFydHNcbiAgICAgICAgaWYgKCF3aWxsRHJhdykge1xuICAgICAgICAgIHIuZmx1c2hSZW5kZXJlZFN0eWxlUXVldWUoKTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc3RhbnQtY29uZGl0aW9uXG4gICAgICAgICAgdmFyIG5vdyA9IHBlcmZvcm1hbmNlTm93KCk7XG4gICAgICAgICAgdmFyIGR1cmF0aW9uID0gbm93IC0gc3RhcnRUaW1lO1xuICAgICAgICAgIHZhciBmcmFtZUR1cmF0aW9uID0gbm93IC0gZnJhbWVTdGFydFRpbWU7XG4gICAgICAgICAgaWYgKHJlbmRlclRpbWUgPCBmdWxsRnBzVGltZSkge1xuICAgICAgICAgICAgLy8gaWYgd2UncmUgcmVuZGVyaW5nIGZhc3RlciB0aGFuIHRoZSBpZGVhbCBmcHMsIHRoZW4gZG8gZGVxdWV1ZWluZ1xuICAgICAgICAgICAgLy8gZHVyaW5nIGFsbCBvZiB0aGUgcmVtYWluaW5nIGZyYW1lIHRpbWVcblxuICAgICAgICAgICAgdmFyIHRpbWVBdmFpbGFibGUgPSBmdWxsRnBzVGltZSAtICh3aWxsRHJhdyA/IGF2Z1JlbmRlclRpbWUgOiAwKTtcbiAgICAgICAgICAgIGlmIChmcmFtZUR1cmF0aW9uID49IG9wdHMuZGVxRmFzdENvc3QgKiB0aW1lQXZhaWxhYmxlKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAod2lsbERyYXcpIHtcbiAgICAgICAgICAgICAgaWYgKGR1cmF0aW9uID49IG9wdHMuZGVxQ29zdCAqIHJlbmRlclRpbWUgfHwgZHVyYXRpb24gPj0gb3B0cy5kZXFBdmdDb3N0ICogYXZnUmVuZGVyVGltZSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGZyYW1lRHVyYXRpb24gPj0gb3B0cy5kZXFOb0RyYXdDb3N0ICogZnVsbEZwc1RpbWUpIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciB0aGlzRGVxZCA9IG9wdHMuZGVxKHNlbGYsIHBpeGVsUmF0aW8sIGV4dGVudCk7XG4gICAgICAgICAgaWYgKHRoaXNEZXFkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpc0RlcWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgZGVxZC5wdXNoKHRoaXNEZXFkW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2FsbGJhY2tzIG9uIGRlcXVldWVcbiAgICAgICAgaWYgKGRlcWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgIG9wdHMub25EZXFkKHNlbGYsIGRlcWQpO1xuICAgICAgICAgIGlmICghd2lsbERyYXcgJiYgb3B0cy5zaG91bGRSZWRyYXcoc2VsZiwgZGVxZCwgcGl4ZWxSYXRpbywgZXh0ZW50KSkge1xuICAgICAgICAgICAgcXVldWVSZWRyYXcoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB2YXIgcHJpb3JpdHkgPSBvcHRzLnByaW9yaXR5IHx8IG5vb3AkMTtcbiAgICAgIHIuYmVmb3JlUmVuZGVyKGRlcXVldWUsIHByaW9yaXR5KHNlbGYpKTtcbiAgICB9O1xuICB9XG59O1xuXG4vLyBBbGxvd3MgbG9va3VwcyBmb3IgKGVsZSwgbHZsKSA9PiBjYWNoZS5cbi8vIFVzZXMga2V5cyBzbyBlbGVtZW50cyBtYXkgc2hhcmUgdGhlIHNhbWUgY2FjaGUuXG52YXIgRWxlbWVudFRleHR1cmVDYWNoZUxvb2t1cCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEVsZW1lbnRUZXh0dXJlQ2FjaGVMb29rdXAoZ2V0S2V5KSB7XG4gICAgdmFyIGRvZXNFbGVJbnZhbGlkYXRlS2V5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzaWZ5O1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBFbGVtZW50VGV4dHVyZUNhY2hlTG9va3VwKTtcbiAgICB0aGlzLmlkc0J5S2V5ID0gbmV3IE1hcCQxKCk7XG4gICAgdGhpcy5rZXlGb3JJZCA9IG5ldyBNYXAkMSgpO1xuICAgIHRoaXMuY2FjaGVzQnlMdmwgPSBuZXcgTWFwJDEoKTtcbiAgICB0aGlzLmx2bHMgPSBbXTtcbiAgICB0aGlzLmdldEtleSA9IGdldEtleTtcbiAgICB0aGlzLmRvZXNFbGVJbnZhbGlkYXRlS2V5ID0gZG9lc0VsZUludmFsaWRhdGVLZXk7XG4gIH1cbiAgcmV0dXJuIF9jcmVhdGVDbGFzcyhFbGVtZW50VGV4dHVyZUNhY2hlTG9va3VwLCBbe1xuICAgIGtleTogXCJnZXRJZHNGb3JcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0SWRzRm9yKGtleSkge1xuICAgICAgaWYgKGtleSA9PSBudWxsKSB7XG4gICAgICAgIGVycm9yKFwiQ2FuIG5vdCBnZXQgaWQgbGlzdCBmb3IgbnVsbCBrZXlcIik7XG4gICAgICB9XG4gICAgICB2YXIgaWRzQnlLZXkgPSB0aGlzLmlkc0J5S2V5O1xuICAgICAgdmFyIGlkcyA9IHRoaXMuaWRzQnlLZXkuZ2V0KGtleSk7XG4gICAgICBpZiAoIWlkcykge1xuICAgICAgICBpZHMgPSBuZXcgU2V0JDEoKTtcbiAgICAgICAgaWRzQnlLZXkuc2V0KGtleSwgaWRzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpZHM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImFkZElkRm9yS2V5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZElkRm9yS2V5KGtleSwgaWQpIHtcbiAgICAgIGlmIChrZXkgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLmdldElkc0ZvcihrZXkpLmFkZChpZCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImRlbGV0ZUlkRm9yS2V5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlbGV0ZUlkRm9yS2V5KGtleSwgaWQpIHtcbiAgICAgIGlmIChrZXkgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLmdldElkc0ZvcihrZXkpW1wiZGVsZXRlXCJdKGlkKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0TnVtYmVyT2ZJZHNGb3JLZXlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0TnVtYmVyT2ZJZHNGb3JLZXkoa2V5KSB7XG4gICAgICBpZiAoa2V5ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRJZHNGb3Ioa2V5KS5zaXplO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ1cGRhdGVLZXlNYXBwaW5nRm9yXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVwZGF0ZUtleU1hcHBpbmdGb3IoZWxlKSB7XG4gICAgICB2YXIgaWQgPSBlbGUuaWQoKTtcbiAgICAgIHZhciBwcmV2S2V5ID0gdGhpcy5rZXlGb3JJZC5nZXQoaWQpO1xuICAgICAgdmFyIGN1cnJLZXkgPSB0aGlzLmdldEtleShlbGUpO1xuICAgICAgdGhpcy5kZWxldGVJZEZvcktleShwcmV2S2V5LCBpZCk7XG4gICAgICB0aGlzLmFkZElkRm9yS2V5KGN1cnJLZXksIGlkKTtcbiAgICAgIHRoaXMua2V5Rm9ySWQuc2V0KGlkLCBjdXJyS2V5KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZGVsZXRlS2V5TWFwcGluZ0ZvclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZWxldGVLZXlNYXBwaW5nRm9yKGVsZSkge1xuICAgICAgdmFyIGlkID0gZWxlLmlkKCk7XG4gICAgICB2YXIgcHJldktleSA9IHRoaXMua2V5Rm9ySWQuZ2V0KGlkKTtcbiAgICAgIHRoaXMuZGVsZXRlSWRGb3JLZXkocHJldktleSwgaWQpO1xuICAgICAgdGhpcy5rZXlGb3JJZFtcImRlbGV0ZVwiXShpZCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImtleUhhc0NoYW5nZWRGb3JcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24ga2V5SGFzQ2hhbmdlZEZvcihlbGUpIHtcbiAgICAgIHZhciBpZCA9IGVsZS5pZCgpO1xuICAgICAgdmFyIHByZXZLZXkgPSB0aGlzLmtleUZvcklkLmdldChpZCk7XG4gICAgICB2YXIgbmV3S2V5ID0gdGhpcy5nZXRLZXkoZWxlKTtcbiAgICAgIHJldHVybiBwcmV2S2V5ICE9PSBuZXdLZXk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImlzSW52YWxpZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpc0ludmFsaWQoZWxlKSB7XG4gICAgICByZXR1cm4gdGhpcy5rZXlIYXNDaGFuZ2VkRm9yKGVsZSkgfHwgdGhpcy5kb2VzRWxlSW52YWxpZGF0ZUtleShlbGUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRDYWNoZXNBdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRDYWNoZXNBdChsdmwpIHtcbiAgICAgIHZhciBjYWNoZXNCeUx2bCA9IHRoaXMuY2FjaGVzQnlMdmwsXG4gICAgICAgIGx2bHMgPSB0aGlzLmx2bHM7XG4gICAgICB2YXIgY2FjaGVzID0gY2FjaGVzQnlMdmwuZ2V0KGx2bCk7XG4gICAgICBpZiAoIWNhY2hlcykge1xuICAgICAgICBjYWNoZXMgPSBuZXcgTWFwJDEoKTtcbiAgICAgICAgY2FjaGVzQnlMdmwuc2V0KGx2bCwgY2FjaGVzKTtcbiAgICAgICAgbHZscy5wdXNoKGx2bCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2FjaGVzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRDYWNoZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRDYWNoZShrZXksIGx2bCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2FjaGVzQXQobHZsKS5nZXQoa2V5KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldChlbGUsIGx2bCkge1xuICAgICAgdmFyIGtleSA9IHRoaXMuZ2V0S2V5KGVsZSk7XG4gICAgICB2YXIgY2FjaGUgPSB0aGlzLmdldENhY2hlKGtleSwgbHZsKTtcblxuICAgICAgLy8gZ2V0dGluZyBmb3IgYW4gZWxlbWVudCBtYXkgbmVlZCB0byBhZGQgdG8gdGhlIGlkIGxpc3QgYi9jIGVsZXMgY2FuIHNoYXJlIGtleXNcbiAgICAgIGlmIChjYWNoZSAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMudXBkYXRlS2V5TWFwcGluZ0ZvcihlbGUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNhY2hlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRGb3JDYWNoZWRLZXlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Rm9yQ2FjaGVkS2V5KGVsZSwgbHZsKSB7XG4gICAgICB2YXIga2V5ID0gdGhpcy5rZXlGb3JJZC5nZXQoZWxlLmlkKCkpOyAvLyBuLmIuIHVzZSBjYWNoZWQga2V5LCBub3QgbmV3bHkgY29tcHV0ZWQga2V5XG4gICAgICB2YXIgY2FjaGUgPSB0aGlzLmdldENhY2hlKGtleSwgbHZsKTtcbiAgICAgIHJldHVybiBjYWNoZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaGFzQ2FjaGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFzQ2FjaGUoa2V5LCBsdmwpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldENhY2hlc0F0KGx2bCkuaGFzKGtleSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImhhc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYXMoZWxlLCBsdmwpIHtcbiAgICAgIHZhciBrZXkgPSB0aGlzLmdldEtleShlbGUpO1xuICAgICAgcmV0dXJuIHRoaXMuaGFzQ2FjaGUoa2V5LCBsdmwpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZXRDYWNoZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRDYWNoZShrZXksIGx2bCwgY2FjaGUpIHtcbiAgICAgIGNhY2hlLmtleSA9IGtleTtcbiAgICAgIHRoaXMuZ2V0Q2FjaGVzQXQobHZsKS5zZXQoa2V5LCBjYWNoZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXQoZWxlLCBsdmwsIGNhY2hlKSB7XG4gICAgICB2YXIga2V5ID0gdGhpcy5nZXRLZXkoZWxlKTtcbiAgICAgIHRoaXMuc2V0Q2FjaGUoa2V5LCBsdmwsIGNhY2hlKTtcbiAgICAgIHRoaXMudXBkYXRlS2V5TWFwcGluZ0ZvcihlbGUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJkZWxldGVDYWNoZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZWxldGVDYWNoZShrZXksIGx2bCkge1xuICAgICAgdGhpcy5nZXRDYWNoZXNBdChsdmwpW1wiZGVsZXRlXCJdKGtleSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImRlbGV0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfZGVsZXRlKGVsZSwgbHZsKSB7XG4gICAgICB2YXIga2V5ID0gdGhpcy5nZXRLZXkoZWxlKTtcbiAgICAgIHRoaXMuZGVsZXRlQ2FjaGUoa2V5LCBsdmwpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpbnZhbGlkYXRlS2V5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGludmFsaWRhdGVLZXkoa2V5KSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgdGhpcy5sdmxzLmZvckVhY2goZnVuY3Rpb24gKGx2bCkge1xuICAgICAgICByZXR1cm4gX3RoaXMuZGVsZXRlQ2FjaGUoa2V5LCBsdmwpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gcmV0dXJucyB0cnVlIGlmIG5vIG90aGVyIGVsZXMgcmVmZXJlbmNlIHRoZSBpbnZhbGlkYXRlZCBjYWNoZSAobi5iLiBvdGhlciBlbGVzIG1heSBuZWVkIHRoZSBjYWNoZSB3aXRoIHRoZSBzYW1lIGtleSlcbiAgfSwge1xuICAgIGtleTogXCJpbnZhbGlkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGludmFsaWRhdGUoZWxlKSB7XG4gICAgICB2YXIgaWQgPSBlbGUuaWQoKTtcbiAgICAgIHZhciBrZXkgPSB0aGlzLmtleUZvcklkLmdldChpZCk7IC8vIG4uYi4gdXNlIHN0b3JlZCBrZXkgcmF0aGVyIHRoYW4gY3VycmVudCAocG90ZW50aWFsIGtleSlcblxuICAgICAgdGhpcy5kZWxldGVLZXlNYXBwaW5nRm9yKGVsZSk7XG4gICAgICB2YXIgZW50aXJlS2V5SW52YWxpZGF0ZWQgPSB0aGlzLmRvZXNFbGVJbnZhbGlkYXRlS2V5KGVsZSk7XG4gICAgICBpZiAoZW50aXJlS2V5SW52YWxpZGF0ZWQpIHtcbiAgICAgICAgLy8gY2xlYXIgbWFwcGluZyBmb3IgY3VycmVudCBrZXlcbiAgICAgICAgdGhpcy5pbnZhbGlkYXRlS2V5KGtleSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZW50aXJlS2V5SW52YWxpZGF0ZWQgfHwgdGhpcy5nZXROdW1iZXJPZklkc0ZvcktleShrZXkpID09PSAwO1xuICAgIH1cbiAgfV0pO1xufSgpO1xuXG52YXIgbWluVHhySCA9IDI1OyAvLyB0aGUgc2l6ZSBvZiB0aGUgdGV4dHVyZSBjYWNoZSBmb3Igc21hbGwgaGVpZ2h0IGVsZXMgKHNwZWNpYWwgY2FzZSlcbnZhciB0eHJTdGVwSCA9IDUwOyAvLyB0aGUgbWluIHNpemUgb2YgdGhlIHJlZ3VsYXIgY2FjaGUsIGFuZCB0aGUgc2l6ZSBpdCBpbmNyZWFzZXMgd2l0aCBlYWNoIHN0ZXAgdXBcbnZhciBtaW5MdmwkMSA9IC00OyAvLyB3aGVuIHNjYWxpbmcgc21hbGxlciB0aGFuIHRoYXQgd2UgZG9uJ3QgbmVlZCB0byByZS1yZW5kZXJcbnZhciBtYXhMdmwkMSA9IDM7IC8vIHdoZW4gbGFyZ2VyIHRoYW4gdGhpcyBzY2FsZSBqdXN0IHJlbmRlciBkaXJlY3RseSAoY2FjaGluZyBpcyBub3QgaGVscGZ1bClcbnZhciBtYXhab29tJDEgPSA3Ljk5OyAvLyBiZXlvbmQgdGhpcyB6b29tIGxldmVsLCBsYXllcmVkIHRleHR1cmVzIGFyZSBub3QgdXNlZFxudmFyIGVsZVR4clNwYWNpbmcgPSA4OyAvLyBzcGFjaW5nIGJldHdlZW4gZWxlbWVudHMgb24gdGV4dHVyZXMgdG8gYXZvaWQgYmxpdHRpbmcgb3ZlcmxhcHNcbnZhciBkZWZUeHJXaWR0aCA9IDEwMjQ7IC8vIGRlZmF1bHQvbWluaW11bSB0ZXh0dXJlIHdpZHRoXG52YXIgbWF4VHhyVyA9IDEwMjQ7IC8vIHRoZSBtYXhpbXVtIHdpZHRoIG9mIGEgdGV4dHVyZVxudmFyIG1heFR4ckggPSAxMDI0OyAvLyB0aGUgbWF4aW11bSBoZWlnaHQgb2YgYSB0ZXh0dXJlXG52YXIgbWluVXRpbGl0eSA9IDAuMjsgLy8gaWYgdXNhZ2Ugb2YgdGV4dHVyZSBpcyBsZXNzIHRoYW4gdGhpcywgaXQgaXMgcmV0aXJlZFxudmFyIG1heEZ1bGxuZXNzID0gMC44OyAvLyBmdWxsbmVzcyBvZiB0ZXh0dXJlIGFmdGVyIHdoaWNoIHF1ZXVlIHJlbW92YWwgaXMgY2hlY2tlZFxudmFyIG1heEZ1bGxuZXNzQ2hlY2tzID0gMTA7IC8vIGRlcXVldWVkIGFmdGVyIHRoaXMgbWFueSBjaGVja3NcbnZhciBkZXFDb3N0JDEgPSAwLjE1OyAvLyAlIG9mIGFkZCdsIHJlbmRlcmluZyBjb3N0IGFsbG93ZWQgZm9yIGRlcXVldWluZyBlbGUgY2FjaGVzIGVhY2ggZnJhbWVcbnZhciBkZXFBdmdDb3N0JDEgPSAwLjE7IC8vICUgb2YgYWRkJ2wgcmVuZGVyaW5nIGNvc3QgY29tcGFyZWQgdG8gYXZlcmFnZSBvdmVyYWxsIHJlZHJhdyB0aW1lXG52YXIgZGVxTm9EcmF3Q29zdCQxID0gMC45OyAvLyAlIG9mIGF2ZyBmcmFtZSB0aW1lIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGRlcXVldWVpbmcgd2hlbiBub3QgZHJhd2luZ1xudmFyIGRlcUZhc3RDb3N0JDEgPSAwLjk7IC8vICUgb2YgZnJhbWUgdGltZSB0byBiZSB1c2VkIHdoZW4gPjYwZnBzXG52YXIgZGVxUmVkcmF3VGhyZXNob2xkJDEgPSAxMDA7IC8vIHRpbWUgdG8gYmF0Y2ggcmVkcmF3cyB0b2dldGhlciBmcm9tIGRlcXVldWVpbmcgdG8gYWxsb3cgbW9yZSBkZXF1ZXVlaW5nIGNhbGNzIHRvIGhhcHBlbiBpbiB0aGUgbWVhbndoaWxlXG52YXIgbWF4RGVxU2l6ZSQxID0gMTsgLy8gbnVtYmVyIG9mIGVsZXMgdG8gZGVxdWV1ZSBhbmQgcmVuZGVyIGF0IGhpZ2hlciB0ZXh0dXJlIGluIGVhY2ggYmF0Y2hcblxudmFyIGdldFR4clJlYXNvbnMgPSB7XG4gIGRlcXVldWU6ICdkZXF1ZXVlJyxcbiAgZG93bnNjYWxlOiAnZG93bnNjYWxlJyxcbiAgaGlnaFF1YWxpdHk6ICdoaWdoUXVhbGl0eSdcbn07XG52YXIgaW5pdERlZmF1bHRzID0gZGVmYXVsdHMkZyh7XG4gIGdldEtleTogbnVsbCxcbiAgZG9lc0VsZUludmFsaWRhdGVLZXk6IGZhbHNpZnksXG4gIGRyYXdFbGVtZW50OiBudWxsLFxuICBnZXRCb3VuZGluZ0JveDogbnVsbCxcbiAgZ2V0Um90YXRpb25Qb2ludDogbnVsbCxcbiAgZ2V0Um90YXRpb25PZmZzZXQ6IG51bGwsXG4gIGlzVmlzaWJsZTogdHJ1ZWlmeSxcbiAgYWxsb3dFZGdlVHhyQ2FjaGluZzogdHJ1ZSxcbiAgYWxsb3dQYXJlbnRUeHJDYWNoaW5nOiB0cnVlXG59KTtcbnZhciBFbGVtZW50VGV4dHVyZUNhY2hlID0gZnVuY3Rpb24gRWxlbWVudFRleHR1cmVDYWNoZShyZW5kZXJlciwgaW5pdE9wdGlvbnMpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBzZWxmLnJlbmRlcmVyID0gcmVuZGVyZXI7XG4gIHNlbGYub25EZXF1ZXVlcyA9IFtdO1xuICB2YXIgb3B0cyA9IGluaXREZWZhdWx0cyhpbml0T3B0aW9ucyk7XG4gIGV4dGVuZChzZWxmLCBvcHRzKTtcbiAgc2VsZi5sb29rdXAgPSBuZXcgRWxlbWVudFRleHR1cmVDYWNoZUxvb2t1cChvcHRzLmdldEtleSwgb3B0cy5kb2VzRWxlSW52YWxpZGF0ZUtleSk7XG4gIHNlbGYuc2V0dXBEZXF1ZXVlaW5nKCk7XG59O1xudmFyIEVUQ3AgPSBFbGVtZW50VGV4dHVyZUNhY2hlLnByb3RvdHlwZTtcbkVUQ3AucmVhc29ucyA9IGdldFR4clJlYXNvbnM7XG5cbi8vIHRoZSBsaXN0IG9mIHRleHR1cmVzIGluIHdoaWNoIG5ldyBzdWJ0ZXh0dXJlcyBmb3IgZWxlbWVudHMgY2FuIGJlIHBsYWNlZFxuRVRDcC5nZXRUZXh0dXJlUXVldWUgPSBmdW5jdGlvbiAodHhySCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHNlbGYuZWxlSW1nQ2FjaGVzID0gc2VsZi5lbGVJbWdDYWNoZXMgfHwge307XG4gIHJldHVybiBzZWxmLmVsZUltZ0NhY2hlc1t0eHJIXSA9IHNlbGYuZWxlSW1nQ2FjaGVzW3R4ckhdIHx8IFtdO1xufTtcblxuLy8gdGhlIGxpc3Qgb2YgdXN1c2VkIHRleHR1cmVzIHdoaWNoIGNhbiBiZSByZWN5Y2xlZCAoaW4gdXNlIGluIHRleHR1cmUgcXVldWUpXG5FVENwLmdldFJldGlyZWRUZXh0dXJlUXVldWUgPSBmdW5jdGlvbiAodHhySCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBydHh0clFzID0gc2VsZi5lbGVJbWdDYWNoZXMucmV0aXJlZCA9IHNlbGYuZWxlSW1nQ2FjaGVzLnJldGlyZWQgfHwge307XG4gIHZhciBydHh0clEgPSBydHh0clFzW3R4ckhdID0gcnR4dHJRc1t0eHJIXSB8fCBbXTtcbiAgcmV0dXJuIHJ0eHRyUTtcbn07XG5cbi8vIHF1ZXVlIG9mIGVsZW1lbnQgZHJhdyByZXF1ZXN0cyBhdCBkaWZmZXJlbnQgc2NhbGUgbGV2ZWxzXG5FVENwLmdldEVsZW1lbnRRdWV1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgcSA9IHNlbGYuZWxlQ2FjaGVRdWV1ZSA9IHNlbGYuZWxlQ2FjaGVRdWV1ZSB8fCBuZXcgSGVhcChmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBiLnJlcXMgLSBhLnJlcXM7XG4gIH0pO1xuICByZXR1cm4gcTtcbn07XG5cbi8vIHF1ZXVlIG9mIGVsZW1lbnQgZHJhdyByZXF1ZXN0cyBhdCBkaWZmZXJlbnQgc2NhbGUgbGV2ZWxzIChlbGVtZW50IGlkIGxvb2t1cClcbkVUQ3AuZ2V0RWxlbWVudEtleVRvUXVldWUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGsycSA9IHNlbGYuZWxlS2V5VG9DYWNoZVF1ZXVlID0gc2VsZi5lbGVLZXlUb0NhY2hlUXVldWUgfHwge307XG4gIHJldHVybiBrMnE7XG59O1xuRVRDcC5nZXRFbGVtZW50ID0gZnVuY3Rpb24gKGVsZSwgYmIsIHB4UmF0aW8sIGx2bCwgcmVhc29uKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHIgPSB0aGlzLnJlbmRlcmVyO1xuICB2YXIgem9vbSA9IHIuY3kuem9vbSgpO1xuICB2YXIgbG9va3VwID0gdGhpcy5sb29rdXA7XG4gIGlmICghYmIgfHwgYmIudyA9PT0gMCB8fCBiYi5oID09PSAwIHx8IGlzTmFOKGJiLncpIHx8IGlzTmFOKGJiLmgpIHx8ICFlbGUudmlzaWJsZSgpIHx8IGVsZS5yZW1vdmVkKCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAoIXNlbGYuYWxsb3dFZGdlVHhyQ2FjaGluZyAmJiBlbGUuaXNFZGdlKCkgfHwgIXNlbGYuYWxsb3dQYXJlbnRUeHJDYWNoaW5nICYmIGVsZS5pc1BhcmVudCgpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKGx2bCA9PSBudWxsKSB7XG4gICAgbHZsID0gTWF0aC5jZWlsKGxvZzIoem9vbSAqIHB4UmF0aW8pKTtcbiAgfVxuICBpZiAobHZsIDwgbWluTHZsJDEpIHtcbiAgICBsdmwgPSBtaW5MdmwkMTtcbiAgfSBlbHNlIGlmICh6b29tID49IG1heFpvb20kMSB8fCBsdmwgPiBtYXhMdmwkMSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZhciBzY2FsZSA9IE1hdGgucG93KDIsIGx2bCk7XG4gIHZhciBlbGVTY2FsZWRIID0gYmIuaCAqIHNjYWxlO1xuICB2YXIgZWxlU2NhbGVkVyA9IGJiLncgKiBzY2FsZTtcbiAgdmFyIHNjYWxlZExhYmVsU2hvd24gPSByLmVsZVRleHRCaWdnZXJUaGFuTWluKGVsZSwgc2NhbGUpO1xuICBpZiAoIXRoaXMuaXNWaXNpYmxlKGVsZSwgc2NhbGVkTGFiZWxTaG93bikpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2YXIgZWxlQ2FjaGUgPSBsb29rdXAuZ2V0KGVsZSwgbHZsKTtcblxuICAvLyBpZiB0aGlzIGdldCB3YXMgb24gYW4gdW51c2VkL2ludmFsaWRhdGVkIGNhY2hlLCB0aGVuIHJlc3RvcmUgdGhlIHRleHR1cmUgdXNhZ2UgbWV0cmljXG4gIGlmIChlbGVDYWNoZSAmJiBlbGVDYWNoZS5pbnZhbGlkYXRlZCkge1xuICAgIGVsZUNhY2hlLmludmFsaWRhdGVkID0gZmFsc2U7XG4gICAgZWxlQ2FjaGUudGV4dHVyZS5pbnZhbGlkYXRlZFdpZHRoIC09IGVsZUNhY2hlLndpZHRoO1xuICB9XG4gIGlmIChlbGVDYWNoZSkge1xuICAgIHJldHVybiBlbGVDYWNoZTtcbiAgfVxuICB2YXIgdHhySDsgLy8gd2hpY2ggdGV4dHVyZSBoZWlnaHQgdGhpcyBlbGUgYmVsb25ncyB0b1xuXG4gIGlmIChlbGVTY2FsZWRIIDw9IG1pblR4ckgpIHtcbiAgICB0eHJIID0gbWluVHhySDtcbiAgfSBlbHNlIGlmIChlbGVTY2FsZWRIIDw9IHR4clN0ZXBIKSB7XG4gICAgdHhySCA9IHR4clN0ZXBIO1xuICB9IGVsc2Uge1xuICAgIHR4ckggPSBNYXRoLmNlaWwoZWxlU2NhbGVkSCAvIHR4clN0ZXBIKSAqIHR4clN0ZXBIO1xuICB9XG4gIGlmIChlbGVTY2FsZWRIID4gbWF4VHhySCB8fCBlbGVTY2FsZWRXID4gbWF4VHhyVykge1xuICAgIHJldHVybiBudWxsOyAvLyBjYWNoaW5nIGxhcmdlIGVsZW1lbnRzIGlzIG5vdCBlZmZpY2llbnRcbiAgfVxuICB2YXIgdHhyUSA9IHNlbGYuZ2V0VGV4dHVyZVF1ZXVlKHR4ckgpO1xuXG4gIC8vIGZpcnN0IHRyeSB0aGUgc2Vjb25kIGxhc3Qgb25lIGluIGNhc2UgaXQgaGFzIHNwYWNlIGF0IHRoZSBlbmRcbiAgdmFyIHR4ciA9IHR4clFbdHhyUS5sZW5ndGggLSAyXTtcbiAgdmFyIGFkZE5ld1R4ciA9IGZ1bmN0aW9uIGFkZE5ld1R4cigpIHtcbiAgICByZXR1cm4gc2VsZi5yZWN5Y2xlVGV4dHVyZSh0eHJILCBlbGVTY2FsZWRXKSB8fCBzZWxmLmFkZFRleHR1cmUodHhySCwgZWxlU2NhbGVkVyk7XG4gIH07XG5cbiAgLy8gdHJ5IHRoZSBsYXN0IG9uZSBpZiB0aGVyZSBpcyBubyBzZWNvbmQgbGFzdCBvbmVcbiAgaWYgKCF0eHIpIHtcbiAgICB0eHIgPSB0eHJRW3R4clEubGVuZ3RoIC0gMV07XG4gIH1cblxuICAvLyBpZiB0aGUgbGFzdCBvbmUgZG9lc24ndCBleGlzdCwgd2UgbmVlZCBhIGZpcnN0IG9uZVxuICBpZiAoIXR4cikge1xuICAgIHR4ciA9IGFkZE5ld1R4cigpO1xuICB9XG5cbiAgLy8gaWYgdGhlcmUncyBubyByb29tIGluIHRoZSBjdXJyZW50IHRleHR1cmUsIHdlIG5lZWQgYSBuZXcgb25lXG4gIGlmICh0eHIud2lkdGggLSB0eHIudXNlZFdpZHRoIDwgZWxlU2NhbGVkVykge1xuICAgIHR4ciA9IGFkZE5ld1R4cigpO1xuICB9XG4gIHZhciBzY2FsYWJsZUZyb20gPSBmdW5jdGlvbiBzY2FsYWJsZUZyb20ob3RoZXJDYWNoZSkge1xuICAgIHJldHVybiBvdGhlckNhY2hlICYmIG90aGVyQ2FjaGUuc2NhbGVkTGFiZWxTaG93biA9PT0gc2NhbGVkTGFiZWxTaG93bjtcbiAgfTtcbiAgdmFyIGRlcWluZyA9IHJlYXNvbiAmJiByZWFzb24gPT09IGdldFR4clJlYXNvbnMuZGVxdWV1ZTtcbiAgdmFyIGhpZ2hRdWFsaXR5UmVxID0gcmVhc29uICYmIHJlYXNvbiA9PT0gZ2V0VHhyUmVhc29ucy5oaWdoUXVhbGl0eTtcbiAgdmFyIGRvd25zY2FsZVJlcSA9IHJlYXNvbiAmJiByZWFzb24gPT09IGdldFR4clJlYXNvbnMuZG93bnNjYWxlO1xuICB2YXIgaGlnaGVyQ2FjaGU7IC8vIHRoZSBuZWFyZXN0IGNhY2hlIHdpdGggYSBoaWdoZXIgbGV2ZWxcbiAgZm9yICh2YXIgbCA9IGx2bCArIDE7IGwgPD0gbWF4THZsJDE7IGwrKykge1xuICAgIHZhciBjID0gbG9va3VwLmdldChlbGUsIGwpO1xuICAgIGlmIChjKSB7XG4gICAgICBoaWdoZXJDYWNoZSA9IGM7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgdmFyIG9uZVVwQ2FjaGUgPSBoaWdoZXJDYWNoZSAmJiBoaWdoZXJDYWNoZS5sZXZlbCA9PT0gbHZsICsgMSA/IGhpZ2hlckNhY2hlIDogbnVsbDtcbiAgdmFyIGRvd25zY2FsZSA9IGZ1bmN0aW9uIGRvd25zY2FsZSgpIHtcbiAgICB0eHIuY29udGV4dC5kcmF3SW1hZ2Uob25lVXBDYWNoZS50ZXh0dXJlLmNhbnZhcywgb25lVXBDYWNoZS54LCAwLCBvbmVVcENhY2hlLndpZHRoLCBvbmVVcENhY2hlLmhlaWdodCwgdHhyLnVzZWRXaWR0aCwgMCwgZWxlU2NhbGVkVywgZWxlU2NhbGVkSCk7XG4gIH07XG5cbiAgLy8gcmVzZXQgZWxlIGFyZWEgaW4gdGV4dHVyZVxuICB0eHIuY29udGV4dC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7XG4gIHR4ci5jb250ZXh0LmNsZWFyUmVjdCh0eHIudXNlZFdpZHRoLCAwLCBlbGVTY2FsZWRXLCB0eHJIKTtcbiAgaWYgKHNjYWxhYmxlRnJvbShvbmVVcENhY2hlKSkge1xuICAgIC8vIHRoZW4gd2UgY2FuIHJlbGF0aXZlbHkgY2hlYXBseSByZXNjYWxlIHRoZSBleGlzdGluZyBpbWFnZSB3L28gcmVyZW5kZXJpbmdcbiAgICBkb3duc2NhbGUoKTtcbiAgfSBlbHNlIGlmIChzY2FsYWJsZUZyb20oaGlnaGVyQ2FjaGUpKSB7XG4gICAgLy8gdGhlbiB1c2UgdGhlIGhpZ2hlciBjYWNoZSBmb3Igbm93IGFuZCBxdWV1ZSB0aGUgbmV4dCBsZXZlbCBkb3duXG4gICAgLy8gdG8gY2hlYXBseSBzY2FsZSB0b3dhcmRzIHRoZSBzbWFsbGVyIGxldmVsXG5cbiAgICBpZiAoaGlnaFF1YWxpdHlSZXEpIHtcbiAgICAgIGZvciAodmFyIF9sID0gaGlnaGVyQ2FjaGUubGV2ZWw7IF9sID4gbHZsOyBfbC0tKSB7XG4gICAgICAgIG9uZVVwQ2FjaGUgPSBzZWxmLmdldEVsZW1lbnQoZWxlLCBiYiwgcHhSYXRpbywgX2wsIGdldFR4clJlYXNvbnMuZG93bnNjYWxlKTtcbiAgICAgIH1cbiAgICAgIGRvd25zY2FsZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZWxmLnF1ZXVlRWxlbWVudChlbGUsIGhpZ2hlckNhY2hlLmxldmVsIC0gMSk7XG4gICAgICByZXR1cm4gaGlnaGVyQ2FjaGU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBsb3dlckNhY2hlOyAvLyB0aGUgbmVhcmVzdCBjYWNoZSB3aXRoIGEgbG93ZXIgbGV2ZWxcbiAgICBpZiAoIWRlcWluZyAmJiAhaGlnaFF1YWxpdHlSZXEgJiYgIWRvd25zY2FsZVJlcSkge1xuICAgICAgZm9yICh2YXIgX2wyID0gbHZsIC0gMTsgX2wyID49IG1pbkx2bCQxOyBfbDItLSkge1xuICAgICAgICB2YXIgX2MgPSBsb29rdXAuZ2V0KGVsZSwgX2wyKTtcbiAgICAgICAgaWYgKF9jKSB7XG4gICAgICAgICAgbG93ZXJDYWNoZSA9IF9jO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzY2FsYWJsZUZyb20obG93ZXJDYWNoZSkpIHtcbiAgICAgIC8vIHRoZW4gdXNlIHRoZSBsb3dlciBxdWFsaXR5IGNhY2hlIGZvciBub3cgYW5kIHF1ZXVlIHRoZSBiZXR0ZXIgb25lIGZvciBsYXRlclxuXG4gICAgICBzZWxmLnF1ZXVlRWxlbWVudChlbGUsIGx2bCk7XG4gICAgICByZXR1cm4gbG93ZXJDYWNoZTtcbiAgICB9XG4gICAgdHhyLmNvbnRleHQudHJhbnNsYXRlKHR4ci51c2VkV2lkdGgsIDApO1xuICAgIHR4ci5jb250ZXh0LnNjYWxlKHNjYWxlLCBzY2FsZSk7XG4gICAgdGhpcy5kcmF3RWxlbWVudCh0eHIuY29udGV4dCwgZWxlLCBiYiwgc2NhbGVkTGFiZWxTaG93biwgZmFsc2UpO1xuICAgIHR4ci5jb250ZXh0LnNjYWxlKDEgLyBzY2FsZSwgMSAvIHNjYWxlKTtcbiAgICB0eHIuY29udGV4dC50cmFuc2xhdGUoLXR4ci51c2VkV2lkdGgsIDApO1xuICB9XG4gIGVsZUNhY2hlID0ge1xuICAgIHg6IHR4ci51c2VkV2lkdGgsXG4gICAgdGV4dHVyZTogdHhyLFxuICAgIGxldmVsOiBsdmwsXG4gICAgc2NhbGU6IHNjYWxlLFxuICAgIHdpZHRoOiBlbGVTY2FsZWRXLFxuICAgIGhlaWdodDogZWxlU2NhbGVkSCxcbiAgICBzY2FsZWRMYWJlbFNob3duOiBzY2FsZWRMYWJlbFNob3duXG4gIH07XG4gIHR4ci51c2VkV2lkdGggKz0gTWF0aC5jZWlsKGVsZVNjYWxlZFcgKyBlbGVUeHJTcGFjaW5nKTtcbiAgdHhyLmVsZUNhY2hlcy5wdXNoKGVsZUNhY2hlKTtcbiAgbG9va3VwLnNldChlbGUsIGx2bCwgZWxlQ2FjaGUpO1xuICBzZWxmLmNoZWNrVGV4dHVyZUZ1bGxuZXNzKHR4cik7XG4gIHJldHVybiBlbGVDYWNoZTtcbn07XG5FVENwLmludmFsaWRhdGVFbGVtZW50cyA9IGZ1bmN0aW9uIChlbGVzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgIHRoaXMuaW52YWxpZGF0ZUVsZW1lbnQoZWxlc1tpXSk7XG4gIH1cbn07XG5FVENwLmludmFsaWRhdGVFbGVtZW50ID0gZnVuY3Rpb24gKGVsZSkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBsb29rdXAgPSBzZWxmLmxvb2t1cDtcbiAgdmFyIGNhY2hlcyA9IFtdO1xuICB2YXIgaW52YWxpZCA9IGxvb2t1cC5pc0ludmFsaWQoZWxlKTtcbiAgaWYgKCFpbnZhbGlkKSB7XG4gICAgcmV0dXJuOyAvLyBvdmVycmlkZSB0aGUgaW52YWxpZGF0aW9uIHJlcXVlc3QgaWYgdGhlIGVsZW1lbnQga2V5IGhhcyBub3QgY2hhbmdlZFxuICB9XG4gIGZvciAodmFyIGx2bCA9IG1pbkx2bCQxOyBsdmwgPD0gbWF4THZsJDE7IGx2bCsrKSB7XG4gICAgdmFyIGNhY2hlID0gbG9va3VwLmdldEZvckNhY2hlZEtleShlbGUsIGx2bCk7XG4gICAgaWYgKGNhY2hlKSB7XG4gICAgICBjYWNoZXMucHVzaChjYWNoZSk7XG4gICAgfVxuICB9XG4gIHZhciBub090aGVyRWxlc1VzZUNhY2hlID0gbG9va3VwLmludmFsaWRhdGUoZWxlKTtcbiAgaWYgKG5vT3RoZXJFbGVzVXNlQ2FjaGUpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNhY2hlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIF9jYWNoZSA9IGNhY2hlc1tpXTtcbiAgICAgIHZhciB0eHIgPSBfY2FjaGUudGV4dHVyZTtcblxuICAgICAgLy8gcmVtb3ZlIHNwYWNlIGZyb20gdGhlIHRleHR1cmUgaXQgYmVsb25ncyB0b1xuICAgICAgdHhyLmludmFsaWRhdGVkV2lkdGggKz0gX2NhY2hlLndpZHRoO1xuXG4gICAgICAvLyBtYXJrIHRoZSBjYWNoZSBhcyBpbnZhbGlkYXRlZFxuICAgICAgX2NhY2hlLmludmFsaWRhdGVkID0gdHJ1ZTtcblxuICAgICAgLy8gcmV0aXJlIHRoZSB0ZXh0dXJlIGlmIGl0cyB1dGlsaXR5IGlzIGxvd1xuICAgICAgc2VsZi5jaGVja1RleHR1cmVVdGlsaXR5KHR4cik7XG4gICAgfVxuICB9XG5cbiAgLy8gcmVtb3ZlIGZyb20gcXVldWUgc2luY2UgdGhlIG9sZCByZXEgd2FzIGZvciB0aGUgb2xkIHN0YXRlXG4gIHNlbGYucmVtb3ZlRnJvbVF1ZXVlKGVsZSk7XG59O1xuRVRDcC5jaGVja1RleHR1cmVVdGlsaXR5ID0gZnVuY3Rpb24gKHR4cikge1xuICAvLyBpbnZhbGlkYXRlIGFsbCBlbnRyaWVzIGluIHRoZSBjYWNoZSBpZiB0aGUgY2FjaGUgc2l6ZSBpcyBzbWFsbFxuICBpZiAodHhyLmludmFsaWRhdGVkV2lkdGggPj0gbWluVXRpbGl0eSAqIHR4ci53aWR0aCkge1xuICAgIHRoaXMucmV0aXJlVGV4dHVyZSh0eHIpO1xuICB9XG59O1xuRVRDcC5jaGVja1RleHR1cmVGdWxsbmVzcyA9IGZ1bmN0aW9uICh0eHIpIHtcbiAgLy8gaWYgdGV4dHVyZSBoYXMgYmVlbiBtb3N0bHkgZmlsbGVkIGFuZCBwYXNzZWQgb3ZlciBzZXZlcmFsIHRpbWVzLCByZW1vdmVcbiAgLy8gaXQgZnJvbSB0aGUgcXVldWUgc28gd2UgZG9uJ3QgbmVlZCB0byB3YXN0ZSB0aW1lIGxvb2tpbmcgYXQgaXQgdG8gcHV0IG5ldyB0aGluZ3NcblxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciB0eHJRID0gc2VsZi5nZXRUZXh0dXJlUXVldWUodHhyLmhlaWdodCk7XG4gIGlmICh0eHIudXNlZFdpZHRoIC8gdHhyLndpZHRoID4gbWF4RnVsbG5lc3MgJiYgdHhyLmZ1bGxuZXNzQ2hlY2tzID49IG1heEZ1bGxuZXNzQ2hlY2tzKSB7XG4gICAgcmVtb3ZlRnJvbUFycmF5KHR4clEsIHR4cik7XG4gIH0gZWxzZSB7XG4gICAgdHhyLmZ1bGxuZXNzQ2hlY2tzKys7XG4gIH1cbn07XG5FVENwLnJldGlyZVRleHR1cmUgPSBmdW5jdGlvbiAodHhyKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHR4ckggPSB0eHIuaGVpZ2h0O1xuICB2YXIgdHhyUSA9IHNlbGYuZ2V0VGV4dHVyZVF1ZXVlKHR4ckgpO1xuICB2YXIgbG9va3VwID0gdGhpcy5sb29rdXA7XG5cbiAgLy8gcmV0aXJlIHRoZSB0ZXh0dXJlIGZyb20gdGhlIGFjdGl2ZSAvIHNlYXJjaGFibGUgcXVldWU6XG5cbiAgcmVtb3ZlRnJvbUFycmF5KHR4clEsIHR4cik7XG4gIHR4ci5yZXRpcmVkID0gdHJ1ZTtcblxuICAvLyByZW1vdmUgdGhlIHJlZnMgZnJvbSB0aGUgZWxlcyB0byB0aGUgY2FjaGVzOlxuXG4gIHZhciBlbGVDYWNoZXMgPSB0eHIuZWxlQ2FjaGVzO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZUNhY2hlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbGVDYWNoZSA9IGVsZUNhY2hlc1tpXTtcbiAgICBsb29rdXAuZGVsZXRlQ2FjaGUoZWxlQ2FjaGUua2V5LCBlbGVDYWNoZS5sZXZlbCk7XG4gIH1cbiAgY2xlYXJBcnJheShlbGVDYWNoZXMpO1xuXG4gIC8vIGFkZCB0aGUgdGV4dHVyZSB0byBhIHJldGlyZWQgcXVldWUgc28gaXQgY2FuIGJlIHJlY3ljbGVkIGluIGZ1dHVyZTpcblxuICB2YXIgcnR4dHJRID0gc2VsZi5nZXRSZXRpcmVkVGV4dHVyZVF1ZXVlKHR4ckgpO1xuICBydHh0clEucHVzaCh0eHIpO1xufTtcbkVUQ3AuYWRkVGV4dHVyZSA9IGZ1bmN0aW9uICh0eHJILCBtaW5XKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHR4clEgPSBzZWxmLmdldFRleHR1cmVRdWV1ZSh0eHJIKTtcbiAgdmFyIHR4ciA9IHt9O1xuICB0eHJRLnB1c2godHhyKTtcbiAgdHhyLmVsZUNhY2hlcyA9IFtdO1xuICB0eHIuaGVpZ2h0ID0gdHhySDtcbiAgdHhyLndpZHRoID0gTWF0aC5tYXgoZGVmVHhyV2lkdGgsIG1pblcpO1xuICB0eHIudXNlZFdpZHRoID0gMDtcbiAgdHhyLmludmFsaWRhdGVkV2lkdGggPSAwO1xuICB0eHIuZnVsbG5lc3NDaGVja3MgPSAwO1xuICB0eHIuY2FudmFzID0gc2VsZi5yZW5kZXJlci5tYWtlT2Zmc2NyZWVuQ2FudmFzKHR4ci53aWR0aCwgdHhyLmhlaWdodCk7XG4gIHR4ci5jb250ZXh0ID0gdHhyLmNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICByZXR1cm4gdHhyO1xufTtcbkVUQ3AucmVjeWNsZVRleHR1cmUgPSBmdW5jdGlvbiAodHhySCwgbWluVykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciB0eHJRID0gc2VsZi5nZXRUZXh0dXJlUXVldWUodHhySCk7XG4gIHZhciBydHh0clEgPSBzZWxmLmdldFJldGlyZWRUZXh0dXJlUXVldWUodHhySCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcnR4dHJRLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHR4ciA9IHJ0eHRyUVtpXTtcbiAgICBpZiAodHhyLndpZHRoID49IG1pblcpIHtcbiAgICAgIHR4ci5yZXRpcmVkID0gZmFsc2U7XG4gICAgICB0eHIudXNlZFdpZHRoID0gMDtcbiAgICAgIHR4ci5pbnZhbGlkYXRlZFdpZHRoID0gMDtcbiAgICAgIHR4ci5mdWxsbmVzc0NoZWNrcyA9IDA7XG4gICAgICBjbGVhckFycmF5KHR4ci5lbGVDYWNoZXMpO1xuICAgICAgdHhyLmNvbnRleHQuc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuICAgICAgdHhyLmNvbnRleHQuY2xlYXJSZWN0KDAsIDAsIHR4ci53aWR0aCwgdHhyLmhlaWdodCk7XG4gICAgICByZW1vdmVGcm9tQXJyYXkocnR4dHJRLCB0eHIpO1xuICAgICAgdHhyUS5wdXNoKHR4cik7XG4gICAgICByZXR1cm4gdHhyO1xuICAgIH1cbiAgfVxufTtcbkVUQ3AucXVldWVFbGVtZW50ID0gZnVuY3Rpb24gKGVsZSwgbHZsKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHEgPSBzZWxmLmdldEVsZW1lbnRRdWV1ZSgpO1xuICB2YXIgazJxID0gc2VsZi5nZXRFbGVtZW50S2V5VG9RdWV1ZSgpO1xuICB2YXIga2V5ID0gdGhpcy5nZXRLZXkoZWxlKTtcbiAgdmFyIGV4aXN0aW5nUmVxID0gazJxW2tleV07XG4gIGlmIChleGlzdGluZ1JlcSkge1xuICAgIC8vIHVzZSB0aGUgbWF4IGx2bCBiL2MgaW4gYmV0d2VlbiBsdmxzIGFyZSBjaGVhcCB0byBtYWtlXG4gICAgZXhpc3RpbmdSZXEubGV2ZWwgPSBNYXRoLm1heChleGlzdGluZ1JlcS5sZXZlbCwgbHZsKTtcbiAgICBleGlzdGluZ1JlcS5lbGVzLm1lcmdlKGVsZSk7XG4gICAgZXhpc3RpbmdSZXEucmVxcysrO1xuICAgIHEudXBkYXRlSXRlbShleGlzdGluZ1JlcSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHJlcSA9IHtcbiAgICAgIGVsZXM6IGVsZS5zcGF3bigpLm1lcmdlKGVsZSksXG4gICAgICBsZXZlbDogbHZsLFxuICAgICAgcmVxczogMSxcbiAgICAgIGtleToga2V5XG4gICAgfTtcbiAgICBxLnB1c2gocmVxKTtcbiAgICBrMnFba2V5XSA9IHJlcTtcbiAgfVxufTtcbkVUQ3AuZGVxdWV1ZSA9IGZ1bmN0aW9uIChweFJhdGlvIC8qLCBleHRlbnQqLykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBxID0gc2VsZi5nZXRFbGVtZW50UXVldWUoKTtcbiAgdmFyIGsycSA9IHNlbGYuZ2V0RWxlbWVudEtleVRvUXVldWUoKTtcbiAgdmFyIGRlcXVldWVkID0gW107XG4gIHZhciBsb29rdXAgPSBzZWxmLmxvb2t1cDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXhEZXFTaXplJDE7IGkrKykge1xuICAgIGlmIChxLnNpemUoKSA+IDApIHtcbiAgICAgIHZhciByZXEgPSBxLnBvcCgpO1xuICAgICAgdmFyIGtleSA9IHJlcS5rZXk7XG4gICAgICB2YXIgZWxlID0gcmVxLmVsZXNbMF07IC8vIGFsbCBlbGVzIGhhdmUgdGhlIHNhbWUga2V5XG4gICAgICB2YXIgY2FjaGVFeGlzdHMgPSBsb29rdXAuaGFzQ2FjaGUoZWxlLCByZXEubGV2ZWwpO1xuXG4gICAgICAvLyBjbGVhciBvdXQgdGhlIGtleSB0byByZXEgbG9va3VwXG4gICAgICBrMnFba2V5XSA9IG51bGw7XG5cbiAgICAgIC8vIGRlcXVldWVpbmcgaXNuJ3QgbmVjZXNzYXJ5IHdpdGggYW4gZXhpc3RpbmcgY2FjaGVcbiAgICAgIGlmIChjYWNoZUV4aXN0cykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGRlcXVldWVkLnB1c2gocmVxKTtcbiAgICAgIHZhciBiYiA9IHNlbGYuZ2V0Qm91bmRpbmdCb3goZWxlKTtcbiAgICAgIHNlbGYuZ2V0RWxlbWVudChlbGUsIGJiLCBweFJhdGlvLCByZXEubGV2ZWwsIGdldFR4clJlYXNvbnMuZGVxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGVxdWV1ZWQ7XG59O1xuRVRDcC5yZW1vdmVGcm9tUXVldWUgPSBmdW5jdGlvbiAoZWxlKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHEgPSBzZWxmLmdldEVsZW1lbnRRdWV1ZSgpO1xuICB2YXIgazJxID0gc2VsZi5nZXRFbGVtZW50S2V5VG9RdWV1ZSgpO1xuICB2YXIga2V5ID0gdGhpcy5nZXRLZXkoZWxlKTtcbiAgdmFyIHJlcSA9IGsycVtrZXldO1xuICBpZiAocmVxICE9IG51bGwpIHtcbiAgICBpZiAocmVxLmVsZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAvLyByZW1vdmUgaWYgbGFzdCBlbGUgaW4gdGhlIHJlcVxuICAgICAgLy8gYnJpbmcgdG8gZnJvbnQgb2YgcXVldWVcbiAgICAgIHJlcS5yZXFzID0gTUFYX0lOVCQxO1xuICAgICAgcS51cGRhdGVJdGVtKHJlcSk7XG4gICAgICBxLnBvcCgpOyAvLyByZW1vdmUgZnJvbSBxdWV1ZVxuXG4gICAgICBrMnFba2V5XSA9IG51bGw7IC8vIHJlbW92ZSBmcm9tIGxvb2t1cCBtYXBcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gb3RoZXJ3aXNlIGp1c3QgcmVtb3ZlIGVsZSBmcm9tIHJlcVxuICAgICAgcmVxLmVsZXMudW5tZXJnZShlbGUpO1xuICAgIH1cbiAgfVxufTtcbkVUQ3Aub25EZXF1ZXVlID0gZnVuY3Rpb24gKGZuKSB7XG4gIHRoaXMub25EZXF1ZXVlcy5wdXNoKGZuKTtcbn07XG5FVENwLm9mZkRlcXVldWUgPSBmdW5jdGlvbiAoZm4pIHtcbiAgcmVtb3ZlRnJvbUFycmF5KHRoaXMub25EZXF1ZXVlcywgZm4pO1xufTtcbkVUQ3Auc2V0dXBEZXF1ZXVlaW5nID0gZGVmcy5zZXR1cERlcXVldWVpbmcoe1xuICBkZXFSZWRyYXdUaHJlc2hvbGQ6IGRlcVJlZHJhd1RocmVzaG9sZCQxLFxuICBkZXFDb3N0OiBkZXFDb3N0JDEsXG4gIGRlcUF2Z0Nvc3Q6IGRlcUF2Z0Nvc3QkMSxcbiAgZGVxTm9EcmF3Q29zdDogZGVxTm9EcmF3Q29zdCQxLFxuICBkZXFGYXN0Q29zdDogZGVxRmFzdENvc3QkMSxcbiAgZGVxOiBmdW5jdGlvbiBkZXEoc2VsZiwgcHhSYXRpbywgZXh0ZW50KSB7XG4gICAgcmV0dXJuIHNlbGYuZGVxdWV1ZShweFJhdGlvLCBleHRlbnQpO1xuICB9LFxuICBvbkRlcWQ6IGZ1bmN0aW9uIG9uRGVxZChzZWxmLCBkZXFkKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLm9uRGVxdWV1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBmbiA9IHNlbGYub25EZXF1ZXVlc1tpXTtcbiAgICAgIGZuKGRlcWQpO1xuICAgIH1cbiAgfSxcbiAgc2hvdWxkUmVkcmF3OiBmdW5jdGlvbiBzaG91bGRSZWRyYXcoc2VsZiwgZGVxZCwgcHhSYXRpbywgZXh0ZW50KSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZXFkLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlcyA9IGRlcWRbaV0uZWxlcztcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZWxlcy5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgYmIgPSBlbGVzW2pdLmJvdW5kaW5nQm94KCk7XG4gICAgICAgIGlmIChib3VuZGluZ0JveGVzSW50ZXJzZWN0KGJiLCBleHRlbnQpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBwcmlvcml0eTogZnVuY3Rpb24gcHJpb3JpdHkoc2VsZikge1xuICAgIHJldHVybiBzZWxmLnJlbmRlcmVyLmJlZm9yZVJlbmRlclByaW9yaXRpZXMuZWxlVHhyRGVxO1xuICB9XG59KTtcblxudmFyIGRlZk51bUxheWVycyA9IDE7IC8vIGRlZmF1bHQgbnVtYmVyIG9mIGxheWVycyB0byB1c2VcbnZhciBtaW5MdmwgPSAtNDsgLy8gd2hlbiBzY2FsaW5nIHNtYWxsZXIgdGhhbiB0aGF0IHdlIGRvbid0IG5lZWQgdG8gcmUtcmVuZGVyXG52YXIgbWF4THZsID0gMjsgLy8gd2hlbiBsYXJnZXIgdGhhbiB0aGlzIHNjYWxlIGp1c3QgcmVuZGVyIGRpcmVjdGx5IChjYWNoaW5nIGlzIG5vdCBoZWxwZnVsKVxudmFyIG1heFpvb20gPSAzLjk5OyAvLyBiZXlvbmQgdGhpcyB6b29tIGxldmVsLCBsYXllcmVkIHRleHR1cmVzIGFyZSBub3QgdXNlZFxudmFyIGRlcVJlZHJhd1RocmVzaG9sZCA9IDUwOyAvLyB0aW1lIHRvIGJhdGNoIHJlZHJhd3MgdG9nZXRoZXIgZnJvbSBkZXF1ZXVlaW5nIHRvIGFsbG93IG1vcmUgZGVxdWV1ZWluZyBjYWxjcyB0byBoYXBwZW4gaW4gdGhlIG1lYW53aGlsZVxudmFyIHJlZmluZUVsZURlYm91bmNlVGltZSA9IDUwOyAvLyB0aW1lIHRvIGRlYm91bmNlIHNoYXJwZXIgZWxlIHRleHR1cmUgdXBkYXRlc1xudmFyIGRlcUNvc3QgPSAwLjE1OyAvLyAlIG9mIGFkZCdsIHJlbmRlcmluZyBjb3N0IGFsbG93ZWQgZm9yIGRlcXVldWluZyBlbGUgY2FjaGVzIGVhY2ggZnJhbWVcbnZhciBkZXFBdmdDb3N0ID0gMC4xOyAvLyAlIG9mIGFkZCdsIHJlbmRlcmluZyBjb3N0IGNvbXBhcmVkIHRvIGF2ZXJhZ2Ugb3ZlcmFsbCByZWRyYXcgdGltZVxudmFyIGRlcU5vRHJhd0Nvc3QgPSAwLjk7IC8vICUgb2YgYXZnIGZyYW1lIHRpbWUgdGhhdCBjYW4gYmUgdXNlZCBmb3IgZGVxdWV1ZWluZyB3aGVuIG5vdCBkcmF3aW5nXG52YXIgZGVxRmFzdENvc3QgPSAwLjk7IC8vICUgb2YgZnJhbWUgdGltZSB0byBiZSB1c2VkIHdoZW4gPjYwZnBzXG52YXIgbWF4RGVxU2l6ZSA9IDE7IC8vIG51bWJlciBvZiBlbGVzIHRvIGRlcXVldWUgYW5kIHJlbmRlciBhdCBoaWdoZXIgdGV4dHVyZSBpbiBlYWNoIGJhdGNoXG52YXIgaW52YWxpZFRocmVzaG9sZCA9IDI1MDsgLy8gdGltZSB0aHJlc2hvbGQgZm9yIGRpc2FibGluZyBiL2Mgb2YgaW52YWxpZGF0aW9uc1xudmFyIG1heExheWVyQXJlYSA9IDQwMDAgKiA0MDAwOyAvLyBsYXllcnMgY2FuJ3QgYmUgYmlnZ2VyIHRoYW4gdGhpc1xudmFyIG1heExheWVyRGltID0gMzI3Njc7IC8vIG1heGltdW0gc2l6ZSBmb3IgdGhlIHdpZHRoL2hlaWdodCBvZiBsYXllciBjYW52YXNlc1xudmFyIHVzZUhpZ2hRdWFsaXR5RWxlVHhyUmVxcyA9IHRydWU7IC8vIHdoZXRoZXIgdG8gdXNlIGhpZ2ggcXVhbGl0eSBlbGUgdHhyIHJlcXVlc3RzIChnZW5lcmFsbHkgZmFzdGVyIGFuZCBjaGVhcGVyIGluIHRoZSBsb25ndGVybSlcblxuLy8gdmFyIGxvZyA9IGZ1bmN0aW9uKCl7IGNvbnNvbGUubG9nLmFwcGx5KCBjb25zb2xlLCBhcmd1bWVudHMgKTsgfTtcblxudmFyIExheWVyZWRUZXh0dXJlQ2FjaGUgPSBmdW5jdGlvbiBMYXllcmVkVGV4dHVyZUNhY2hlKHJlbmRlcmVyKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHIgPSBzZWxmLnJlbmRlcmVyID0gcmVuZGVyZXI7XG4gIHZhciBjeSA9IHIuY3k7XG4gIHNlbGYubGF5ZXJzQnlMZXZlbCA9IHt9OyAvLyBlLmcuIDIgPT4gWyBsYXllcjEsIGxheWVyMiwgLi4uLCBsYXllck4gXVxuXG4gIHNlbGYuZmlyc3RHZXQgPSB0cnVlO1xuICBzZWxmLmxhc3RJbnZhbGlkYXRpb25UaW1lID0gcGVyZm9ybWFuY2VOb3coKSAtIDIgKiBpbnZhbGlkVGhyZXNob2xkO1xuICBzZWxmLnNraXBwaW5nID0gZmFsc2U7XG4gIHNlbGYuZWxlVHhyRGVxcyA9IGN5LmNvbGxlY3Rpb24oKTtcbiAgc2VsZi5zY2hlZHVsZUVsZW1lbnRSZWZpbmVtZW50ID0gZGVib3VuY2UoZnVuY3Rpb24gKCkge1xuICAgIHNlbGYucmVmaW5lRWxlbWVudFRleHR1cmVzKHNlbGYuZWxlVHhyRGVxcyk7XG4gICAgc2VsZi5lbGVUeHJEZXFzLnVubWVyZ2Uoc2VsZi5lbGVUeHJEZXFzKTtcbiAgfSwgcmVmaW5lRWxlRGVib3VuY2VUaW1lKTtcbiAgci5iZWZvcmVSZW5kZXIoZnVuY3Rpb24gKHdpbGxEcmF3LCBub3cpIHtcbiAgICBpZiAobm93IC0gc2VsZi5sYXN0SW52YWxpZGF0aW9uVGltZSA8PSBpbnZhbGlkVGhyZXNob2xkKSB7XG4gICAgICBzZWxmLnNraXBwaW5nID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZi5za2lwcGluZyA9IGZhbHNlO1xuICAgIH1cbiAgfSwgci5iZWZvcmVSZW5kZXJQcmlvcml0aWVzLmx5clR4clNraXApO1xuICB2YXIgcVNvcnQgPSBmdW5jdGlvbiBxU29ydChhLCBiKSB7XG4gICAgcmV0dXJuIGIucmVxcyAtIGEucmVxcztcbiAgfTtcbiAgc2VsZi5sYXllcnNRdWV1ZSA9IG5ldyBIZWFwKHFTb3J0KTtcbiAgc2VsZi5zZXR1cERlcXVldWVpbmcoKTtcbn07XG52YXIgTFRDcCA9IExheWVyZWRUZXh0dXJlQ2FjaGUucHJvdG90eXBlO1xudmFyIGxheWVySWRQb29sID0gMDtcbnZhciBNQVhfSU5UID0gTWF0aC5wb3coMiwgNTMpIC0gMTtcbkxUQ3AubWFrZUxheWVyID0gZnVuY3Rpb24gKGJiLCBsdmwpIHtcbiAgdmFyIHNjYWxlID0gTWF0aC5wb3coMiwgbHZsKTtcbiAgdmFyIHcgPSBNYXRoLmNlaWwoYmIudyAqIHNjYWxlKTtcbiAgdmFyIGggPSBNYXRoLmNlaWwoYmIuaCAqIHNjYWxlKTtcbiAgdmFyIGNhbnZhcyA9IHRoaXMucmVuZGVyZXIubWFrZU9mZnNjcmVlbkNhbnZhcyh3LCBoKTtcbiAgdmFyIGxheWVyID0ge1xuICAgIGlkOiBsYXllcklkUG9vbCA9ICsrbGF5ZXJJZFBvb2wgJSBNQVhfSU5ULFxuICAgIGJiOiBiYixcbiAgICBsZXZlbDogbHZsLFxuICAgIHdpZHRoOiB3LFxuICAgIGhlaWdodDogaCxcbiAgICBjYW52YXM6IGNhbnZhcyxcbiAgICBjb250ZXh0OiBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKSxcbiAgICBlbGVzOiBbXSxcbiAgICBlbGVzUXVldWU6IFtdLFxuICAgIHJlcXM6IDBcbiAgfTtcblxuICAvLyBsb2coJ21ha2UgbGF5ZXIgJXMgd2l0aCB3ICVzIGFuZCBoICVzIGFuZCBsdmwgJXMnLCBsYXllci5pZCwgbGF5ZXIud2lkdGgsIGxheWVyLmhlaWdodCwgbGF5ZXIubGV2ZWwpO1xuXG4gIHZhciBjeHQgPSBsYXllci5jb250ZXh0O1xuICB2YXIgZHggPSAtbGF5ZXIuYmIueDE7XG4gIHZhciBkeSA9IC1sYXllci5iYi55MTtcblxuICAvLyBkbyB0aGUgdHJhbnNmb3JtIG9uIGNyZWF0aW9uIHRvIHNhdmUgY3ljbGVzIChpdCdzIHRoZSBzYW1lIGZvciBhbGwgZWxlcylcbiAgY3h0LnNjYWxlKHNjYWxlLCBzY2FsZSk7XG4gIGN4dC50cmFuc2xhdGUoZHgsIGR5KTtcbiAgcmV0dXJuIGxheWVyO1xufTtcbkxUQ3AuZ2V0TGF5ZXJzID0gZnVuY3Rpb24gKGVsZXMsIHB4UmF0aW8sIGx2bCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciByID0gc2VsZi5yZW5kZXJlcjtcbiAgdmFyIGN5ID0gci5jeTtcbiAgdmFyIHpvb20gPSBjeS56b29tKCk7XG4gIHZhciBmaXJzdEdldCA9IHNlbGYuZmlyc3RHZXQ7XG4gIHNlbGYuZmlyc3RHZXQgPSBmYWxzZTtcblxuICAvLyBsb2coJy0tXFxuZ2V0IGxheWVycyB3aXRoICVzIGVsZXMnLCBlbGVzLmxlbmd0aCk7XG4gIC8vbG9nIGVsZXMubWFwKGZ1bmN0aW9uKGVsZSl7IHJldHVybiBlbGUuaWQoKSB9KSApO1xuXG4gIGlmIChsdmwgPT0gbnVsbCkge1xuICAgIGx2bCA9IE1hdGguY2VpbChsb2cyKHpvb20gKiBweFJhdGlvKSk7XG4gICAgaWYgKGx2bCA8IG1pbkx2bCkge1xuICAgICAgbHZsID0gbWluTHZsO1xuICAgIH0gZWxzZSBpZiAoem9vbSA+PSBtYXhab29tIHx8IGx2bCA+IG1heEx2bCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG4gIHNlbGYudmFsaWRhdGVMYXllcnNFbGVzT3JkZXJpbmcobHZsLCBlbGVzKTtcbiAgdmFyIGxheWVyc0J5THZsID0gc2VsZi5sYXllcnNCeUxldmVsO1xuICB2YXIgc2NhbGUgPSBNYXRoLnBvdygyLCBsdmwpO1xuICB2YXIgbGF5ZXJzID0gbGF5ZXJzQnlMdmxbbHZsXSA9IGxheWVyc0J5THZsW2x2bF0gfHwgW107XG4gIHZhciBiYjtcbiAgdmFyIGx2bENvbXBsZXRlID0gc2VsZi5sZXZlbElzQ29tcGxldGUobHZsLCBlbGVzKTtcbiAgdmFyIHRtcExheWVycztcbiAgdmFyIGNoZWNrVGVtcExldmVscyA9IGZ1bmN0aW9uIGNoZWNrVGVtcExldmVscygpIHtcbiAgICB2YXIgY2FuVXNlQXNUbXBMdmwgPSBmdW5jdGlvbiBjYW5Vc2VBc1RtcEx2bChsKSB7XG4gICAgICBzZWxmLnZhbGlkYXRlTGF5ZXJzRWxlc09yZGVyaW5nKGwsIGVsZXMpO1xuICAgICAgaWYgKHNlbGYubGV2ZWxJc0NvbXBsZXRlKGwsIGVsZXMpKSB7XG4gICAgICAgIHRtcExheWVycyA9IGxheWVyc0J5THZsW2xdO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHZhciBjaGVja0x2bHMgPSBmdW5jdGlvbiBjaGVja0x2bHMoZGlyKSB7XG4gICAgICBpZiAodG1wTGF5ZXJzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGwgPSBsdmwgKyBkaXI7IG1pbkx2bCA8PSBsICYmIGwgPD0gbWF4THZsOyBsICs9IGRpcikge1xuICAgICAgICBpZiAoY2FuVXNlQXNUbXBMdmwobCkpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgY2hlY2tMdmxzKDEpO1xuICAgIGNoZWNrTHZscygtMSk7XG5cbiAgICAvLyByZW1vdmUgdGhlIGludmFsaWQgbGF5ZXJzOyB0aGV5IHdpbGwgYmUgcmVwbGFjZWQgYXMgbmVlZGVkIGxhdGVyIGluIHRoaXMgZnVuY3Rpb25cbiAgICBmb3IgKHZhciBpID0gbGF5ZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgbGF5ZXIgPSBsYXllcnNbaV07XG4gICAgICBpZiAobGF5ZXIuaW52YWxpZCkge1xuICAgICAgICByZW1vdmVGcm9tQXJyYXkobGF5ZXJzLCBsYXllcik7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBpZiAoIWx2bENvbXBsZXRlKSB7XG4gICAgLy8gaWYgdGhlIGN1cnJlbnQgbGV2ZWwgaXMgaW5jb21wbGV0ZSwgdGhlbiB1c2UgdGhlIGNsb3Nlc3QsIGJlc3QgcXVhbGl0eSBsYXllcnNldCB0ZW1wb3JhcmlseVxuICAgIC8vIGFuZCBsYXRlciBxdWV1ZSB0aGUgY3VycmVudCBsYXllcnNldCBzbyB3ZSBjYW4gZ2V0IHRoZSBwcm9wZXIgcXVhbGl0eSBsZXZlbCBzb29uXG5cbiAgICBjaGVja1RlbXBMZXZlbHMoKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBsb2coJ2xldmVsIGNvbXBsZXRlLCB1c2luZyBleGlzdGluZyBsYXllcnNcXG4tLScpO1xuICAgIHJldHVybiBsYXllcnM7XG4gIH1cbiAgdmFyIGdldEJiID0gZnVuY3Rpb24gZ2V0QmIoKSB7XG4gICAgaWYgKCFiYikge1xuICAgICAgYmIgPSBtYWtlQm91bmRpbmdCb3goKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB1cGRhdGVCb3VuZGluZ0JveChiYiwgZWxlc1tpXS5ib3VuZGluZ0JveCgpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJiO1xuICB9O1xuICB2YXIgbWFrZUxheWVyID0gZnVuY3Rpb24gbWFrZUxheWVyKG9wdHMpIHtcbiAgICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgICB2YXIgYWZ0ZXIgPSBvcHRzLmFmdGVyO1xuICAgIGdldEJiKCk7XG4gICAgdmFyIHcgPSBNYXRoLmNlaWwoYmIudyAqIHNjYWxlKTtcbiAgICB2YXIgaCA9IE1hdGguY2VpbChiYi5oICogc2NhbGUpO1xuICAgIGlmICh3ID4gbWF4TGF5ZXJEaW0gfHwgaCA+IG1heExheWVyRGltKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdmFyIGFyZWEgPSB3ICogaDtcbiAgICBpZiAoYXJlYSA+IG1heExheWVyQXJlYSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHZhciBsYXllciA9IHNlbGYubWFrZUxheWVyKGJiLCBsdmwpO1xuICAgIGlmIChhZnRlciAhPSBudWxsKSB7XG4gICAgICB2YXIgaW5kZXggPSBsYXllcnMuaW5kZXhPZihhZnRlcikgKyAxO1xuICAgICAgbGF5ZXJzLnNwbGljZShpbmRleCwgMCwgbGF5ZXIpO1xuICAgIH0gZWxzZSBpZiAob3B0cy5pbnNlcnQgPT09IHVuZGVmaW5lZCB8fCBvcHRzLmluc2VydCkge1xuICAgICAgLy8gbm8gYWZ0ZXIgc3BlY2lmaWVkID0+IGZpcnN0IGxheWVyIG1hZGUgc28gcHV0IGF0IHN0YXJ0XG4gICAgICBsYXllcnMudW5zaGlmdChsYXllcik7XG4gICAgfVxuXG4gICAgLy8gaWYoIHRtcExheWVycyApe1xuICAgIC8vc2VsZi5xdWV1ZUxheWVyKCBsYXllciApO1xuICAgIC8vIH1cblxuICAgIHJldHVybiBsYXllcjtcbiAgfTtcbiAgaWYgKHNlbGYuc2tpcHBpbmcgJiYgIWZpcnN0R2V0KSB7XG4gICAgLy8gbG9nKCdza2lwIGxheWVycycpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gbG9nKCdkbyBsYXllcnMnKTtcblxuICB2YXIgbGF5ZXIgPSBudWxsO1xuICB2YXIgbWF4RWxlc1BlckxheWVyID0gZWxlcy5sZW5ndGggLyBkZWZOdW1MYXllcnM7XG4gIHZhciBhbGxvd0xhenlRdWV1ZWluZyA9ICFmaXJzdEdldDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgdmFyIHJzID0gZWxlLl9wcml2YXRlLnJzY3JhdGNoO1xuICAgIHZhciBjYWNoZXMgPSBycy5pbWdMYXllckNhY2hlcyA9IHJzLmltZ0xheWVyQ2FjaGVzIHx8IHt9O1xuXG4gICAgLy8gbG9nKCdsb29rIGF0IGVsZScsIGVsZS5pZCgpKTtcblxuICAgIHZhciBleGlzdGluZ0xheWVyID0gY2FjaGVzW2x2bF07XG4gICAgaWYgKGV4aXN0aW5nTGF5ZXIpIHtcbiAgICAgIC8vIHJldXNlIGxheWVyIGZvciBsYXRlciBlbGVzXG4gICAgICAvLyBsb2coJ3JldXNlIGxheWVyIGZvcicsIGVsZS5pZCgpKTtcbiAgICAgIGxheWVyID0gZXhpc3RpbmdMYXllcjtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoIWxheWVyIHx8IGxheWVyLmVsZXMubGVuZ3RoID49IG1heEVsZXNQZXJMYXllciB8fCAhYm91bmRpbmdCb3hJbkJvdW5kaW5nQm94KGxheWVyLmJiLCBlbGUuYm91bmRpbmdCb3goKSkpIHtcbiAgICAgIC8vIGxvZygnbWFrZSBuZXcgbGF5ZXIgZm9yIGVsZSAlcycsIGVsZS5pZCgpKTtcblxuICAgICAgbGF5ZXIgPSBtYWtlTGF5ZXIoe1xuICAgICAgICBpbnNlcnQ6IHRydWUsXG4gICAgICAgIGFmdGVyOiBsYXllclxuICAgICAgfSk7XG5cbiAgICAgIC8vIGlmIG5vdyBsYXllciBjYW4gYmUgYnVpbHQgdGhlbiB3ZSBjYW4ndCB1c2UgbGF5ZXJzIGF0IHRoaXMgbGV2ZWxcbiAgICAgIGlmICghbGF5ZXIpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIGxvZygnbmV3IGxheWVyIHdpdGggaWQgJXMnLCBsYXllci5pZCk7XG4gICAgfVxuICAgIGlmICh0bXBMYXllcnMgfHwgYWxsb3dMYXp5UXVldWVpbmcpIHtcbiAgICAgIC8vIGxvZygncXVldWUgZWxlICVzIGluIGxheWVyICVzJywgZWxlLmlkKCksIGxheWVyLmlkKTtcbiAgICAgIHNlbGYucXVldWVMYXllcihsYXllciwgZWxlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gbG9nKCdkcmF3IGVsZSAlcyBpbiBsYXllciAlcycsIGVsZS5pZCgpLCBsYXllci5pZCk7XG4gICAgICBzZWxmLmRyYXdFbGVJbkxheWVyKGxheWVyLCBlbGUsIGx2bCwgcHhSYXRpbyk7XG4gICAgfVxuICAgIGxheWVyLmVsZXMucHVzaChlbGUpO1xuICAgIGNhY2hlc1tsdmxdID0gbGF5ZXI7XG4gIH1cblxuICAvLyBsb2coJy0tJyk7XG5cbiAgaWYgKHRtcExheWVycykge1xuICAgIC8vIHRoZW4gd2Ugb25seSBxdWV1ZWQgdGhlIGN1cnJlbnQgbGF5ZXJzZXQgYW5kIGNhbid0IGRyYXcgaXQgeWV0XG4gICAgcmV0dXJuIHRtcExheWVycztcbiAgfVxuICBpZiAoYWxsb3dMYXp5UXVldWVpbmcpIHtcbiAgICAvLyBsb2coJ2xhenkgcXVldWUgbGV2ZWwnLCBsdmwpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBsYXllcnM7XG59O1xuXG4vLyBhIGxheWVyIG1heSB3YW50IHRvIHVzZSBhbiBlbGUgY2FjaGUgb2YgYSBoaWdoZXIgbGV2ZWwgdG8gYXZvaWQgYmx1cnJpbmVzc1xuLy8gc28gdGhlIGxheWVyIGxldmVsIG1pZ2h0IG5vdCBlcXVhbCB0aGUgZWxlIGxldmVsXG5MVENwLmdldEVsZUxldmVsRm9yTGF5ZXJMZXZlbCA9IGZ1bmN0aW9uIChsdmwsIHB4UmF0aW8pIHtcbiAgcmV0dXJuIGx2bDtcbn07XG5MVENwLmRyYXdFbGVJbkxheWVyID0gZnVuY3Rpb24gKGxheWVyLCBlbGUsIGx2bCwgcHhSYXRpbykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciByID0gdGhpcy5yZW5kZXJlcjtcbiAgdmFyIGNvbnRleHQgPSBsYXllci5jb250ZXh0O1xuICB2YXIgYmIgPSBlbGUuYm91bmRpbmdCb3goKTtcbiAgaWYgKGJiLncgPT09IDAgfHwgYmIuaCA9PT0gMCB8fCAhZWxlLnZpc2libGUoKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBsdmwgPSBzZWxmLmdldEVsZUxldmVsRm9yTGF5ZXJMZXZlbChsdmwsIHB4UmF0aW8pO1xuICB7XG4gICAgci5zZXRJbWdTbW9vdGhpbmcoY29udGV4dCwgZmFsc2UpO1xuICB9XG4gIHtcbiAgICByLmRyYXdDYWNoZWRFbGVtZW50KGNvbnRleHQsIGVsZSwgbnVsbCwgbnVsbCwgbHZsLCB1c2VIaWdoUXVhbGl0eUVsZVR4clJlcXMpO1xuICB9XG4gIHtcbiAgICByLnNldEltZ1Ntb290aGluZyhjb250ZXh0LCB0cnVlKTtcbiAgfVxufTtcbkxUQ3AubGV2ZWxJc0NvbXBsZXRlID0gZnVuY3Rpb24gKGx2bCwgZWxlcykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBsYXllcnMgPSBzZWxmLmxheWVyc0J5TGV2ZWxbbHZsXTtcbiAgaWYgKCFsYXllcnMgfHwgbGF5ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgbnVtRWxlc0luTGF5ZXJzID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXllcnMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbGF5ZXIgPSBsYXllcnNbaV07XG5cbiAgICAvLyBpZiB0aGVyZSBhcmUgYW55IGVsZXMgbmVlZGVkIHRvIGJlIGRyYXduIHlldCwgdGhlIGxldmVsIGlzIG5vdCBjb21wbGV0ZVxuICAgIGlmIChsYXllci5yZXFzID4gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIGlmIHRoZSBsYXllciBpcyBpbnZhbGlkLCB0aGUgbGV2ZWwgaXMgbm90IGNvbXBsZXRlXG4gICAgaWYgKGxheWVyLmludmFsaWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgbnVtRWxlc0luTGF5ZXJzICs9IGxheWVyLmVsZXMubGVuZ3RoO1xuICB9XG5cbiAgLy8gd2Ugc2hvdWxkIGhhdmUgZXhhY3RseSB0aGUgbnVtYmVyIG9mIGVsZXMgcGFzc2VkIGluIHRvIGJlIGNvbXBsZXRlXG4gIGlmIChudW1FbGVzSW5MYXllcnMgIT09IGVsZXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufTtcbkxUQ3AudmFsaWRhdGVMYXllcnNFbGVzT3JkZXJpbmcgPSBmdW5jdGlvbiAobHZsLCBlbGVzKSB7XG4gIHZhciBsYXllcnMgPSB0aGlzLmxheWVyc0J5TGV2ZWxbbHZsXTtcbiAgaWYgKCFsYXllcnMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBpZiBpbiBhIGxheWVyIHRoZSBlbGVzIGFyZSBub3QgaW4gdGhlIHNhbWUgb3JkZXIsIHRoZW4gdGhlIGxheWVyIGlzIGludmFsaWRcbiAgLy8gKGkuZS4gdGhlcmUgaXMgYW4gZWxlIGluIGJldHdlZW4gdGhlIGVsZXMgaW4gdGhlIGxheWVyKVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGF5ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGxheWVyID0gbGF5ZXJzW2ldO1xuICAgIHZhciBvZmZzZXQgPSAtMTtcblxuICAgIC8vIGZpbmQgdGhlIG9mZnNldFxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgZWxlcy5sZW5ndGg7IGorKykge1xuICAgICAgaWYgKGxheWVyLmVsZXNbMF0gPT09IGVsZXNbal0pIHtcbiAgICAgICAgb2Zmc2V0ID0gajtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChvZmZzZXQgPCAwKSB7XG4gICAgICAvLyB0aGVuIHRoZSBsYXllciBoYXMgbm9uZXhpc3RlbnQgZWxlbWVudHMgYW5kIGlzIGludmFsaWRcbiAgICAgIHRoaXMuaW52YWxpZGF0ZUxheWVyKGxheWVyKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIHRoZSBlbGVzIGluIHRoZSBsYXllciBtdXN0IGJlIGluIHRoZSBzYW1lIGNvbnRpbnVvdXMgb3JkZXIsIGVsc2UgdGhlIGxheWVyIGlzIGludmFsaWRcblxuICAgIHZhciBvID0gb2Zmc2V0O1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgbGF5ZXIuZWxlcy5sZW5ndGg7IGorKykge1xuICAgICAgaWYgKGxheWVyLmVsZXNbal0gIT09IGVsZXNbbyArIGpdKSB7XG4gICAgICAgIC8vIGxvZygnaW52YWxpZGF0ZSBiYXNlZCBvbiBvcmRlcmluZycsIGxheWVyLmlkKTtcblxuICAgICAgICB0aGlzLmludmFsaWRhdGVMYXllcihsYXllcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcbkxUQ3AudXBkYXRlRWxlbWVudHNJbkxheWVycyA9IGZ1bmN0aW9uIChlbGVzLCB1cGRhdGUpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgaXNFbGVzID0gZWxlbWVudChlbGVzWzBdKTtcblxuICAvLyBjb2xsZWN0IHVkcGF0ZWQgZWxlbWVudHMgKGNhc2NhZGVkIGZyb20gdGhlIGxheWVycykgYW5kIHVwZGF0ZSBlYWNoXG4gIC8vIGxheWVyIGl0c2VsZiBhbG9uZyB0aGUgd2F5XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciByZXEgPSBpc0VsZXMgPyBudWxsIDogZWxlc1tpXTtcbiAgICB2YXIgZWxlID0gaXNFbGVzID8gZWxlc1tpXSA6IGVsZXNbaV0uZWxlO1xuICAgIHZhciBycyA9IGVsZS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgICB2YXIgY2FjaGVzID0gcnMuaW1nTGF5ZXJDYWNoZXMgPSBycy5pbWdMYXllckNhY2hlcyB8fCB7fTtcbiAgICBmb3IgKHZhciBsID0gbWluTHZsOyBsIDw9IG1heEx2bDsgbCsrKSB7XG4gICAgICB2YXIgbGF5ZXIgPSBjYWNoZXNbbF07XG4gICAgICBpZiAoIWxheWVyKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBpZiB1cGRhdGUgaXMgYSByZXF1ZXN0IGZyb20gdGhlIGVsZSBjYWNoZSwgdGhlbiBpdCBhZmZlY3RzIG9ubHlcbiAgICAgIC8vIHRoZSBtYXRjaGluZyBsZXZlbFxuICAgICAgaWYgKHJlcSAmJiBzZWxmLmdldEVsZUxldmVsRm9yTGF5ZXJMZXZlbChsYXllci5sZXZlbCkgIT09IHJlcS5sZXZlbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHVwZGF0ZShsYXllciwgZWxlLCByZXEpO1xuICAgIH1cbiAgfVxufTtcbkxUQ3AuaGF2ZUxheWVycyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgaGF2ZUxheWVycyA9IGZhbHNlO1xuICBmb3IgKHZhciBsID0gbWluTHZsOyBsIDw9IG1heEx2bDsgbCsrKSB7XG4gICAgdmFyIGxheWVycyA9IHNlbGYubGF5ZXJzQnlMZXZlbFtsXTtcbiAgICBpZiAobGF5ZXJzICYmIGxheWVycy5sZW5ndGggPiAwKSB7XG4gICAgICBoYXZlTGF5ZXJzID0gdHJ1ZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaGF2ZUxheWVycztcbn07XG5MVENwLmludmFsaWRhdGVFbGVtZW50cyA9IGZ1bmN0aW9uIChlbGVzKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgaWYgKGVsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHNlbGYubGFzdEludmFsaWRhdGlvblRpbWUgPSBwZXJmb3JtYW5jZU5vdygpO1xuXG4gIC8vIGxvZygndXBkYXRlIGludmFsaWRhdGUgbGF5ZXIgdGltZSBmcm9tIGVsZXMnKTtcblxuICBpZiAoZWxlcy5sZW5ndGggPT09IDAgfHwgIXNlbGYuaGF2ZUxheWVycygpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHNlbGYudXBkYXRlRWxlbWVudHNJbkxheWVycyhlbGVzLCBmdW5jdGlvbiBpbnZhbEFzc29jTGF5ZXJzKGxheWVyLCBlbGUsIHJlcSkge1xuICAgIHNlbGYuaW52YWxpZGF0ZUxheWVyKGxheWVyKTtcbiAgfSk7XG59O1xuTFRDcC5pbnZhbGlkYXRlTGF5ZXIgPSBmdW5jdGlvbiAobGF5ZXIpIHtcbiAgLy8gbG9nKCd1cGRhdGUgaW52YWxpZGF0ZSBsYXllciB0aW1lJyk7XG5cbiAgdGhpcy5sYXN0SW52YWxpZGF0aW9uVGltZSA9IHBlcmZvcm1hbmNlTm93KCk7XG4gIGlmIChsYXllci5pbnZhbGlkKSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIHNhdmUgY3ljbGVzXG5cbiAgdmFyIGx2bCA9IGxheWVyLmxldmVsO1xuICB2YXIgZWxlcyA9IGxheWVyLmVsZXM7XG4gIHZhciBsYXllcnMgPSB0aGlzLmxheWVyc0J5TGV2ZWxbbHZsXTtcblxuICAvLyBsb2coJ2ludmFsaWRhdGUgbGF5ZXInLCBsYXllci5pZCApO1xuXG4gIHJlbW92ZUZyb21BcnJheShsYXllcnMsIGxheWVyKTtcbiAgLy8gbGF5ZXIuZWxlcyA9IFtdO1xuXG4gIGxheWVyLmVsZXNRdWV1ZSA9IFtdO1xuICBsYXllci5pbnZhbGlkID0gdHJ1ZTtcbiAgaWYgKGxheWVyLnJlcGxhY2VtZW50KSB7XG4gICAgbGF5ZXIucmVwbGFjZW1lbnQuaW52YWxpZCA9IHRydWU7XG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGNhY2hlcyA9IGVsZXNbaV0uX3ByaXZhdGUucnNjcmF0Y2guaW1nTGF5ZXJDYWNoZXM7XG4gICAgaWYgKGNhY2hlcykge1xuICAgICAgY2FjaGVzW2x2bF0gPSBudWxsO1xuICAgIH1cbiAgfVxufTtcbkxUQ3AucmVmaW5lRWxlbWVudFRleHR1cmVzID0gZnVuY3Rpb24gKGVsZXMpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gIC8vIGxvZygncmVmaW5lJywgZWxlcy5sZW5ndGgpO1xuXG4gIHNlbGYudXBkYXRlRWxlbWVudHNJbkxheWVycyhlbGVzLCBmdW5jdGlvbiByZWZpbmVFYWNoRWxlKGxheWVyLCBlbGUsIHJlcSkge1xuICAgIHZhciByTHlyID0gbGF5ZXIucmVwbGFjZW1lbnQ7XG4gICAgaWYgKCFyTHlyKSB7XG4gICAgICByTHlyID0gbGF5ZXIucmVwbGFjZW1lbnQgPSBzZWxmLm1ha2VMYXllcihsYXllci5iYiwgbGF5ZXIubGV2ZWwpO1xuICAgICAgckx5ci5yZXBsYWNlcyA9IGxheWVyO1xuICAgICAgckx5ci5lbGVzID0gbGF5ZXIuZWxlcztcblxuICAgICAgLy8gbG9nKCdtYWtlIHJlcGxhY2VtZW50IGxheWVyICVzIGZvciAlcyB3aXRoIGxldmVsICVzJywgckx5ci5pZCwgbGF5ZXIuaWQsIHJMeXIubGV2ZWwpO1xuICAgIH1cbiAgICBpZiAoIXJMeXIucmVxcykge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByTHlyLmVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgc2VsZi5xdWV1ZUxheWVyKHJMeXIsIHJMeXIuZWxlc1tpXSk7XG4gICAgICB9XG5cbiAgICAgIC8vIGxvZygncXVldWUgcmVwbGFjZW1lbnQgbGF5ZXIgcmVmaW5lbWVudCcsIHJMeXIuaWQpO1xuICAgIH1cbiAgfSk7XG59O1xuTFRDcC5lbnF1ZXVlRWxlbWVudFJlZmluZW1lbnQgPSBmdW5jdGlvbiAoZWxlKSB7XG4gIHRoaXMuZWxlVHhyRGVxcy5tZXJnZShlbGUpO1xuICB0aGlzLnNjaGVkdWxlRWxlbWVudFJlZmluZW1lbnQoKTtcbn07XG5MVENwLnF1ZXVlTGF5ZXIgPSBmdW5jdGlvbiAobGF5ZXIsIGVsZSkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBxID0gc2VsZi5sYXllcnNRdWV1ZTtcbiAgdmFyIGVsZXNRID0gbGF5ZXIuZWxlc1F1ZXVlO1xuICB2YXIgaGFzSWQgPSBlbGVzUS5oYXNJZCA9IGVsZXNRLmhhc0lkIHx8IHt9O1xuXG4gIC8vIGlmIGEgbGF5ZXIgaXMgZ29pbmcgdG8gYmUgcmVwbGFjZWQsIHF1ZXVpbmcgaXMgYSB3YXN0ZSBvZiB0aW1lXG4gIGlmIChsYXllci5yZXBsYWNlbWVudCkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoZWxlKSB7XG4gICAgaWYgKGhhc0lkW2VsZS5pZCgpXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbGVzUS5wdXNoKGVsZSk7XG4gICAgaGFzSWRbZWxlLmlkKCldID0gdHJ1ZTtcbiAgfVxuICBpZiAobGF5ZXIucmVxcykge1xuICAgIGxheWVyLnJlcXMrKztcbiAgICBxLnVwZGF0ZUl0ZW0obGF5ZXIpO1xuICB9IGVsc2Uge1xuICAgIGxheWVyLnJlcXMgPSAxO1xuICAgIHEucHVzaChsYXllcik7XG4gIH1cbn07XG5MVENwLmRlcXVldWUgPSBmdW5jdGlvbiAocHhSYXRpbykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBxID0gc2VsZi5sYXllcnNRdWV1ZTtcbiAgdmFyIGRlcWQgPSBbXTtcbiAgdmFyIGVsZURlcXMgPSAwO1xuICB3aGlsZSAoZWxlRGVxcyA8IG1heERlcVNpemUpIHtcbiAgICBpZiAocS5zaXplKCkgPT09IDApIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB2YXIgbGF5ZXIgPSBxLnBlZWsoKTtcblxuICAgIC8vIGlmIGEgbGF5ZXIgaGFzIGJlZW4gb3Igd2lsbCBiZSByZXBsYWNlZCwgdGhlbiBkb24ndCB3YXN0ZSB0aW1lIHdpdGggaXRcbiAgICBpZiAobGF5ZXIucmVwbGFjZW1lbnQpIHtcbiAgICAgIC8vIGxvZygnbGF5ZXIgJXMgaW4gcXVldWUgc2tpcHBlZCBiL2MgaXQgYWxyZWFkeSBoYXMgYSByZXBsYWNlbWVudCcsIGxheWVyLmlkKTtcbiAgICAgIHEucG9wKCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBpZiB0aGlzIGlzIGEgcmVwbGFjZW1lbnQgbGF5ZXIgdGhhdCBoYXMgYmVlbiBzdXBlcmNlZGVkLCB0aGVuIGZvcmdldCBpdFxuICAgIGlmIChsYXllci5yZXBsYWNlcyAmJiBsYXllciAhPT0gbGF5ZXIucmVwbGFjZXMucmVwbGFjZW1lbnQpIHtcbiAgICAgIC8vIGxvZygnbGF5ZXIgaXMgbm8gbG9uZ2VyIHRoZSBtb3N0IHVwdG9kYXRlIHJlcGxhY2VtZW50OyBkZXF1ZXVlZCcsIGxheWVyLmlkKVxuICAgICAgcS5wb3AoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAobGF5ZXIuaW52YWxpZCkge1xuICAgICAgLy8gbG9nKCdyZXBsYWNlbWVudCBsYXllciAlcyBpcyBpbnZhbGlkOyBkZXF1ZXVlZCcsIGxheWVyLmlkKTtcbiAgICAgIHEucG9wKCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdmFyIGVsZSA9IGxheWVyLmVsZXNRdWV1ZS5zaGlmdCgpO1xuICAgIGlmIChlbGUpIHtcbiAgICAgIC8vIGxvZygnZGVxdWV1ZSBsYXllciAlcycsIGxheWVyLmlkKTtcblxuICAgICAgc2VsZi5kcmF3RWxlSW5MYXllcihsYXllciwgZWxlLCBsYXllci5sZXZlbCwgcHhSYXRpbyk7XG4gICAgICBlbGVEZXFzKys7XG4gICAgfVxuICAgIGlmIChkZXFkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gd2UgbmVlZCBvbmx5IG9uZSBlbnRyeSBpbiBkZXFkIHRvIHF1ZXVlIHJlZHJhd2luZyBldGNcbiAgICAgIGRlcWQucHVzaCh0cnVlKTtcbiAgICB9XG5cbiAgICAvLyBpZiB0aGUgbGF5ZXIgaGFzIGFsbCBpdHMgZWxlcyBkb25lLCB0aGVuIHJlbW92ZSBmcm9tIHRoZSBxdWV1ZVxuICAgIGlmIChsYXllci5lbGVzUXVldWUubGVuZ3RoID09PSAwKSB7XG4gICAgICBxLnBvcCgpO1xuICAgICAgbGF5ZXIucmVxcyA9IDA7XG5cbiAgICAgIC8vIGxvZygnZGVxdWV1ZSBvZiBsYXllciAlcyBjb21wbGV0ZScsIGxheWVyLmlkKTtcblxuICAgICAgLy8gd2hlbiBhIHJlcGxhY2VtZW50IGxheWVyIGlzIGRlcXVldWVkLCBpdCByZXBsYWNlcyB0aGUgb2xkIGxheWVyIGluIHRoZSBsZXZlbFxuICAgICAgaWYgKGxheWVyLnJlcGxhY2VzKSB7XG4gICAgICAgIHNlbGYuYXBwbHlMYXllclJlcGxhY2VtZW50KGxheWVyKTtcbiAgICAgIH1cbiAgICAgIHNlbGYucmVxdWVzdFJlZHJhdygpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGVxZDtcbn07XG5MVENwLmFwcGx5TGF5ZXJSZXBsYWNlbWVudCA9IGZ1bmN0aW9uIChsYXllcikge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBsYXllcnNJbkxldmVsID0gc2VsZi5sYXllcnNCeUxldmVsW2xheWVyLmxldmVsXTtcbiAgdmFyIHJlcGxhY2VkID0gbGF5ZXIucmVwbGFjZXM7XG4gIHZhciBpbmRleCA9IGxheWVyc0luTGV2ZWwuaW5kZXhPZihyZXBsYWNlZCk7XG5cbiAgLy8gaWYgdGhlIHJlcGxhY2VkIGxheWVyIGlzIG5vdCBpbiB0aGUgYWN0aXZlIGxpc3QgZm9yIHRoZSBsZXZlbCwgdGhlbiByZXBsYWNpbmdcbiAgLy8gcmVmcyB3b3VsZCBiZSBhIG1pc3Rha2UgKGkuZS4gb3ZlcndyaXRpbmcgdGhlIHRydWUgYWN0aXZlIGxheWVyKVxuICBpZiAoaW5kZXggPCAwIHx8IHJlcGxhY2VkLmludmFsaWQpIHtcbiAgICAvLyBsb2coJ3JlcGxhY2VtZW50IGxheWVyIHdvdWxkIGhhdmUgbm8gZWZmZWN0JywgbGF5ZXIuaWQpO1xuICAgIHJldHVybjtcbiAgfVxuICBsYXllcnNJbkxldmVsW2luZGV4XSA9IGxheWVyOyAvLyByZXBsYWNlIGxldmVsIHJlZlxuXG4gIC8vIHJlcGxhY2UgcmVmcyBpbiBlbGVzXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGF5ZXIuZWxlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBfcCA9IGxheWVyLmVsZXNbaV0uX3ByaXZhdGU7XG4gICAgdmFyIGNhY2hlID0gX3AuaW1nTGF5ZXJDYWNoZXMgPSBfcC5pbWdMYXllckNhY2hlcyB8fCB7fTtcbiAgICBpZiAoY2FjaGUpIHtcbiAgICAgIGNhY2hlW2xheWVyLmxldmVsXSA9IGxheWVyO1xuICAgIH1cbiAgfVxuXG4gIC8vIGxvZygnYXBwbHkgcmVwbGFjZW1lbnQgbGF5ZXIgJXMgb3ZlciAlcycsIGxheWVyLmlkLCByZXBsYWNlZC5pZCk7XG5cbiAgc2VsZi5yZXF1ZXN0UmVkcmF3KCk7XG59O1xuTFRDcC5yZXF1ZXN0UmVkcmF3ID0gZGVib3VuY2UoZnVuY3Rpb24gKCkge1xuICB2YXIgciA9IHRoaXMucmVuZGVyZXI7XG4gIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICByLnJlZHJhd0hpbnQoJ2RyYWcnLCB0cnVlKTtcbiAgci5yZWRyYXcoKTtcbn0sIDEwMCk7XG5MVENwLnNldHVwRGVxdWV1ZWluZyA9IGRlZnMuc2V0dXBEZXF1ZXVlaW5nKHtcbiAgZGVxUmVkcmF3VGhyZXNob2xkOiBkZXFSZWRyYXdUaHJlc2hvbGQsXG4gIGRlcUNvc3Q6IGRlcUNvc3QsXG4gIGRlcUF2Z0Nvc3Q6IGRlcUF2Z0Nvc3QsXG4gIGRlcU5vRHJhd0Nvc3Q6IGRlcU5vRHJhd0Nvc3QsXG4gIGRlcUZhc3RDb3N0OiBkZXFGYXN0Q29zdCxcbiAgZGVxOiBmdW5jdGlvbiBkZXEoc2VsZiwgcHhSYXRpbykge1xuICAgIHJldHVybiBzZWxmLmRlcXVldWUocHhSYXRpbyk7XG4gIH0sXG4gIG9uRGVxZDogbm9vcCQxLFxuICBzaG91bGRSZWRyYXc6IHRydWVpZnksXG4gIHByaW9yaXR5OiBmdW5jdGlvbiBwcmlvcml0eShzZWxmKSB7XG4gICAgcmV0dXJuIHNlbGYucmVuZGVyZXIuYmVmb3JlUmVuZGVyUHJpb3JpdGllcy5seXJUeHJEZXE7XG4gIH1cbn0pO1xuXG52YXIgQ1JwJGIgPSB7fTtcbnZhciBpbXBsO1xuZnVuY3Rpb24gcG9seWdvbihjb250ZXh0LCBwb2ludHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcHQgPSBwb2ludHNbaV07XG4gICAgY29udGV4dC5saW5lVG8ocHQueCwgcHQueSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHRyaWFuZ2xlQmFja2N1cnZlKGNvbnRleHQsIHBvaW50cywgY29udHJvbFBvaW50KSB7XG4gIHZhciBmaXJzdFB0O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBwdCA9IHBvaW50c1tpXTtcbiAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgZmlyc3RQdCA9IHB0O1xuICAgIH1cbiAgICBjb250ZXh0LmxpbmVUbyhwdC54LCBwdC55KTtcbiAgfVxuICBjb250ZXh0LnF1YWRyYXRpY0N1cnZlVG8oY29udHJvbFBvaW50LngsIGNvbnRyb2xQb2ludC55LCBmaXJzdFB0LngsIGZpcnN0UHQueSk7XG59XG5mdW5jdGlvbiB0cmlhbmdsZVRlZShjb250ZXh0LCB0cmlhbmdsZVBvaW50cywgdGVlUG9pbnRzKSB7XG4gIGlmIChjb250ZXh0LmJlZ2luUGF0aCkge1xuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gIH1cbiAgdmFyIHRyaVB0cyA9IHRyaWFuZ2xlUG9pbnRzO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHRyaVB0cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBwdCA9IHRyaVB0c1tpXTtcbiAgICBjb250ZXh0LmxpbmVUbyhwdC54LCBwdC55KTtcbiAgfVxuICB2YXIgdGVlUHRzID0gdGVlUG9pbnRzO1xuICB2YXIgZmlyc3RUZWVQdCA9IHRlZVBvaW50c1swXTtcbiAgY29udGV4dC5tb3ZlVG8oZmlyc3RUZWVQdC54LCBmaXJzdFRlZVB0LnkpO1xuICBmb3IgKHZhciBpID0gMTsgaSA8IHRlZVB0cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBwdCA9IHRlZVB0c1tpXTtcbiAgICBjb250ZXh0LmxpbmVUbyhwdC54LCBwdC55KTtcbiAgfVxuICBpZiAoY29udGV4dC5jbG9zZVBhdGgpIHtcbiAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICB9XG59XG5mdW5jdGlvbiBjaXJjbGVUcmlhbmdsZShjb250ZXh0LCB0cmlhbmdsZVBvaW50cywgcngsIHJ5LCByKSB7XG4gIGlmIChjb250ZXh0LmJlZ2luUGF0aCkge1xuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gIH1cbiAgY29udGV4dC5hcmMocngsIHJ5LCByLCAwLCBNYXRoLlBJICogMiwgZmFsc2UpO1xuICB2YXIgdHJpUHRzID0gdHJpYW5nbGVQb2ludHM7XG4gIHZhciBmaXJzdFRyUHQgPSB0cmlQdHNbMF07XG4gIGNvbnRleHQubW92ZVRvKGZpcnN0VHJQdC54LCBmaXJzdFRyUHQueSk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdHJpUHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHB0ID0gdHJpUHRzW2ldO1xuICAgIGNvbnRleHQubGluZVRvKHB0LngsIHB0LnkpO1xuICB9XG4gIGlmIChjb250ZXh0LmNsb3NlUGF0aCkge1xuICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGNpcmNsZSQxKGNvbnRleHQsIHJ4LCByeSwgcikge1xuICBjb250ZXh0LmFyYyhyeCwgcnksIHIsIDAsIE1hdGguUEkgKiAyLCBmYWxzZSk7XG59XG5DUnAkYi5hcnJvd1NoYXBlSW1wbCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIHJldHVybiAoaW1wbCB8fCAoaW1wbCA9IHtcbiAgICAncG9seWdvbic6IHBvbHlnb24sXG4gICAgJ3RyaWFuZ2xlLWJhY2tjdXJ2ZSc6IHRyaWFuZ2xlQmFja2N1cnZlLFxuICAgICd0cmlhbmdsZS10ZWUnOiB0cmlhbmdsZVRlZSxcbiAgICAnY2lyY2xlLXRyaWFuZ2xlJzogY2lyY2xlVHJpYW5nbGUsXG4gICAgJ3RyaWFuZ2xlLWNyb3NzJzogdHJpYW5nbGVUZWUsXG4gICAgJ2NpcmNsZSc6IGNpcmNsZSQxXG4gIH0pKVtuYW1lXTtcbn07XG5cbnZhciBDUnAkYSA9IHt9O1xuQ1JwJGEuZHJhd0VsZW1lbnQgPSBmdW5jdGlvbiAoY29udGV4dCwgZWxlLCBzaGlmdFRvT3JpZ2luV2l0aEJiLCBzaG93TGFiZWwsIHNob3dPdmVybGF5LCBzaG93T3BhY2l0eSkge1xuICB2YXIgciA9IHRoaXM7XG4gIGlmIChlbGUuaXNOb2RlKCkpIHtcbiAgICByLmRyYXdOb2RlKGNvbnRleHQsIGVsZSwgc2hpZnRUb09yaWdpbldpdGhCYiwgc2hvd0xhYmVsLCBzaG93T3ZlcmxheSwgc2hvd09wYWNpdHkpO1xuICB9IGVsc2Uge1xuICAgIHIuZHJhd0VkZ2UoY29udGV4dCwgZWxlLCBzaGlmdFRvT3JpZ2luV2l0aEJiLCBzaG93TGFiZWwsIHNob3dPdmVybGF5LCBzaG93T3BhY2l0eSk7XG4gIH1cbn07XG5DUnAkYS5kcmF3RWxlbWVudE92ZXJsYXkgPSBmdW5jdGlvbiAoY29udGV4dCwgZWxlKSB7XG4gIHZhciByID0gdGhpcztcbiAgaWYgKGVsZS5pc05vZGUoKSkge1xuICAgIHIuZHJhd05vZGVPdmVybGF5KGNvbnRleHQsIGVsZSk7XG4gIH0gZWxzZSB7XG4gICAgci5kcmF3RWRnZU92ZXJsYXkoY29udGV4dCwgZWxlKTtcbiAgfVxufTtcbkNScCRhLmRyYXdFbGVtZW50VW5kZXJsYXkgPSBmdW5jdGlvbiAoY29udGV4dCwgZWxlKSB7XG4gIHZhciByID0gdGhpcztcbiAgaWYgKGVsZS5pc05vZGUoKSkge1xuICAgIHIuZHJhd05vZGVVbmRlcmxheShjb250ZXh0LCBlbGUpO1xuICB9IGVsc2Uge1xuICAgIHIuZHJhd0VkZ2VVbmRlcmxheShjb250ZXh0LCBlbGUpO1xuICB9XG59O1xuQ1JwJGEuZHJhd0NhY2hlZEVsZW1lbnRQb3J0aW9uID0gZnVuY3Rpb24gKGNvbnRleHQsIGVsZSwgZWxlVHhyQ2FjaGUsIHB4UmF0aW8sIGx2bCwgcmVhc29uLCBnZXRSb3RhdGlvbiwgZ2V0T3BhY2l0eSkge1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBiYiA9IGVsZVR4ckNhY2hlLmdldEJvdW5kaW5nQm94KGVsZSk7XG4gIGlmIChiYi53ID09PSAwIHx8IGJiLmggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH0gLy8gaWdub3JlIHplcm8gc2l6ZSBjYXNlXG5cbiAgdmFyIGVsZUNhY2hlID0gZWxlVHhyQ2FjaGUuZ2V0RWxlbWVudChlbGUsIGJiLCBweFJhdGlvLCBsdmwsIHJlYXNvbik7XG4gIGlmIChlbGVDYWNoZSAhPSBudWxsKSB7XG4gICAgdmFyIG9wYWNpdHkgPSBnZXRPcGFjaXR5KHIsIGVsZSk7XG4gICAgaWYgKG9wYWNpdHkgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRoZXRhID0gZ2V0Um90YXRpb24ociwgZWxlKTtcbiAgICB2YXIgeDEgPSBiYi54MSxcbiAgICAgIHkxID0gYmIueTEsXG4gICAgICB3ID0gYmIudyxcbiAgICAgIGggPSBiYi5oO1xuICAgIHZhciB4LCB5LCBzeCwgc3ksIHNtb290aDtcbiAgICBpZiAodGhldGEgIT09IDApIHtcbiAgICAgIHZhciByb3RQdCA9IGVsZVR4ckNhY2hlLmdldFJvdGF0aW9uUG9pbnQoZWxlKTtcbiAgICAgIHN4ID0gcm90UHQueDtcbiAgICAgIHN5ID0gcm90UHQueTtcbiAgICAgIGNvbnRleHQudHJhbnNsYXRlKHN4LCBzeSk7XG4gICAgICBjb250ZXh0LnJvdGF0ZSh0aGV0YSk7XG4gICAgICBzbW9vdGggPSByLmdldEltZ1Ntb290aGluZyhjb250ZXh0KTtcbiAgICAgIGlmICghc21vb3RoKSB7XG4gICAgICAgIHIuc2V0SW1nU21vb3RoaW5nKGNvbnRleHQsIHRydWUpO1xuICAgICAgfVxuICAgICAgdmFyIG9mZiA9IGVsZVR4ckNhY2hlLmdldFJvdGF0aW9uT2Zmc2V0KGVsZSk7XG4gICAgICB4ID0gb2ZmLng7XG4gICAgICB5ID0gb2ZmLnk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHggPSB4MTtcbiAgICAgIHkgPSB5MTtcbiAgICB9XG4gICAgdmFyIG9sZEdsb2JhbEFscGhhO1xuICAgIGlmIChvcGFjaXR5ICE9PSAxKSB7XG4gICAgICBvbGRHbG9iYWxBbHBoYSA9IGNvbnRleHQuZ2xvYmFsQWxwaGE7XG4gICAgICBjb250ZXh0Lmdsb2JhbEFscGhhID0gb2xkR2xvYmFsQWxwaGEgKiBvcGFjaXR5O1xuICAgIH1cbiAgICBjb250ZXh0LmRyYXdJbWFnZShlbGVDYWNoZS50ZXh0dXJlLmNhbnZhcywgZWxlQ2FjaGUueCwgMCwgZWxlQ2FjaGUud2lkdGgsIGVsZUNhY2hlLmhlaWdodCwgeCwgeSwgdywgaCk7XG4gICAgaWYgKG9wYWNpdHkgIT09IDEpIHtcbiAgICAgIGNvbnRleHQuZ2xvYmFsQWxwaGEgPSBvbGRHbG9iYWxBbHBoYTtcbiAgICB9XG4gICAgaWYgKHRoZXRhICE9PSAwKSB7XG4gICAgICBjb250ZXh0LnJvdGF0ZSgtdGhldGEpO1xuICAgICAgY29udGV4dC50cmFuc2xhdGUoLXN4LCAtc3kpO1xuICAgICAgaWYgKCFzbW9vdGgpIHtcbiAgICAgICAgci5zZXRJbWdTbW9vdGhpbmcoY29udGV4dCwgZmFsc2UpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBlbGVUeHJDYWNoZS5kcmF3RWxlbWVudChjb250ZXh0LCBlbGUpOyAvLyBkaXJlY3QgZHJhdyBmYWxsYmFja1xuICB9XG59O1xudmFyIGdldFplcm9Sb3RhdGlvbiA9IGZ1bmN0aW9uIGdldFplcm9Sb3RhdGlvbigpIHtcbiAgcmV0dXJuIDA7XG59O1xudmFyIGdldExhYmVsUm90YXRpb24gPSBmdW5jdGlvbiBnZXRMYWJlbFJvdGF0aW9uKHIsIGVsZSkge1xuICByZXR1cm4gci5nZXRUZXh0QW5nbGUoZWxlLCBudWxsKTtcbn07XG52YXIgZ2V0U291cmNlTGFiZWxSb3RhdGlvbiA9IGZ1bmN0aW9uIGdldFNvdXJjZUxhYmVsUm90YXRpb24ociwgZWxlKSB7XG4gIHJldHVybiByLmdldFRleHRBbmdsZShlbGUsICdzb3VyY2UnKTtcbn07XG52YXIgZ2V0VGFyZ2V0TGFiZWxSb3RhdGlvbiA9IGZ1bmN0aW9uIGdldFRhcmdldExhYmVsUm90YXRpb24ociwgZWxlKSB7XG4gIHJldHVybiByLmdldFRleHRBbmdsZShlbGUsICd0YXJnZXQnKTtcbn07XG52YXIgZ2V0T3BhY2l0eSA9IGZ1bmN0aW9uIGdldE9wYWNpdHkociwgZWxlKSB7XG4gIHJldHVybiBlbGUuZWZmZWN0aXZlT3BhY2l0eSgpO1xufTtcbnZhciBnZXRUZXh0T3BhY2l0eSA9IGZ1bmN0aW9uIGdldFRleHRPcGFjaXR5KGUsIGVsZSkge1xuICByZXR1cm4gZWxlLnBzdHlsZSgndGV4dC1vcGFjaXR5JykucGZWYWx1ZSAqIGVsZS5lZmZlY3RpdmVPcGFjaXR5KCk7XG59O1xuQ1JwJGEuZHJhd0NhY2hlZEVsZW1lbnQgPSBmdW5jdGlvbiAoY29udGV4dCwgZWxlLCBweFJhdGlvLCBleHRlbnQsIGx2bCwgcmVxdWVzdEhpZ2hRdWFsaXR5KSB7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIF9yJGRhdGEgPSByLmRhdGEsXG4gICAgZWxlVHhyQ2FjaGUgPSBfciRkYXRhLmVsZVR4ckNhY2hlLFxuICAgIGxibFR4ckNhY2hlID0gX3IkZGF0YS5sYmxUeHJDYWNoZSxcbiAgICBzbGJUeHJDYWNoZSA9IF9yJGRhdGEuc2xiVHhyQ2FjaGUsXG4gICAgdGxiVHhyQ2FjaGUgPSBfciRkYXRhLnRsYlR4ckNhY2hlO1xuICB2YXIgYmIgPSBlbGUuYm91bmRpbmdCb3goKTtcbiAgdmFyIHJlYXNvbiA9IHJlcXVlc3RIaWdoUXVhbGl0eSA9PT0gdHJ1ZSA/IGVsZVR4ckNhY2hlLnJlYXNvbnMuaGlnaFF1YWxpdHkgOiBudWxsO1xuICBpZiAoYmIudyA9PT0gMCB8fCBiYi5oID09PSAwIHx8ICFlbGUudmlzaWJsZSgpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICghZXh0ZW50IHx8IGJvdW5kaW5nQm94ZXNJbnRlcnNlY3QoYmIsIGV4dGVudCkpIHtcbiAgICB2YXIgaXNFZGdlID0gZWxlLmlzRWRnZSgpO1xuICAgIHZhciBiYWRMaW5lID0gZWxlLmVsZW1lbnQoKS5fcHJpdmF0ZS5yc2NyYXRjaC5iYWRMaW5lO1xuICAgIHIuZHJhd0VsZW1lbnRVbmRlcmxheShjb250ZXh0LCBlbGUpO1xuICAgIHIuZHJhd0NhY2hlZEVsZW1lbnRQb3J0aW9uKGNvbnRleHQsIGVsZSwgZWxlVHhyQ2FjaGUsIHB4UmF0aW8sIGx2bCwgcmVhc29uLCBnZXRaZXJvUm90YXRpb24sIGdldE9wYWNpdHkpO1xuICAgIGlmICghaXNFZGdlIHx8ICFiYWRMaW5lKSB7XG4gICAgICByLmRyYXdDYWNoZWRFbGVtZW50UG9ydGlvbihjb250ZXh0LCBlbGUsIGxibFR4ckNhY2hlLCBweFJhdGlvLCBsdmwsIHJlYXNvbiwgZ2V0TGFiZWxSb3RhdGlvbiwgZ2V0VGV4dE9wYWNpdHkpO1xuICAgIH1cbiAgICBpZiAoaXNFZGdlICYmICFiYWRMaW5lKSB7XG4gICAgICByLmRyYXdDYWNoZWRFbGVtZW50UG9ydGlvbihjb250ZXh0LCBlbGUsIHNsYlR4ckNhY2hlLCBweFJhdGlvLCBsdmwsIHJlYXNvbiwgZ2V0U291cmNlTGFiZWxSb3RhdGlvbiwgZ2V0VGV4dE9wYWNpdHkpO1xuICAgICAgci5kcmF3Q2FjaGVkRWxlbWVudFBvcnRpb24oY29udGV4dCwgZWxlLCB0bGJUeHJDYWNoZSwgcHhSYXRpbywgbHZsLCByZWFzb24sIGdldFRhcmdldExhYmVsUm90YXRpb24sIGdldFRleHRPcGFjaXR5KTtcbiAgICB9XG4gICAgci5kcmF3RWxlbWVudE92ZXJsYXkoY29udGV4dCwgZWxlKTtcbiAgfVxufTtcbkNScCRhLmRyYXdFbGVtZW50cyA9IGZ1bmN0aW9uIChjb250ZXh0LCBlbGVzKSB7XG4gIHZhciByID0gdGhpcztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgci5kcmF3RWxlbWVudChjb250ZXh0LCBlbGUpO1xuICB9XG59O1xuQ1JwJGEuZHJhd0NhY2hlZEVsZW1lbnRzID0gZnVuY3Rpb24gKGNvbnRleHQsIGVsZXMsIHB4UmF0aW8sIGV4dGVudCkge1xuICB2YXIgciA9IHRoaXM7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgIHIuZHJhd0NhY2hlZEVsZW1lbnQoY29udGV4dCwgZWxlLCBweFJhdGlvLCBleHRlbnQpO1xuICB9XG59O1xuQ1JwJGEuZHJhd0NhY2hlZE5vZGVzID0gZnVuY3Rpb24gKGNvbnRleHQsIGVsZXMsIHB4UmF0aW8sIGV4dGVudCkge1xuICB2YXIgciA9IHRoaXM7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgIGlmICghZWxlLmlzTm9kZSgpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgci5kcmF3Q2FjaGVkRWxlbWVudChjb250ZXh0LCBlbGUsIHB4UmF0aW8sIGV4dGVudCk7XG4gIH1cbn07XG5DUnAkYS5kcmF3TGF5ZXJlZEVsZW1lbnRzID0gZnVuY3Rpb24gKGNvbnRleHQsIGVsZXMsIHB4UmF0aW8sIGV4dGVudCkge1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBsYXllcnMgPSByLmRhdGEubHlyVHhyQ2FjaGUuZ2V0TGF5ZXJzKGVsZXMsIHB4UmF0aW8pO1xuICBpZiAobGF5ZXJzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXllcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBsYXllciA9IGxheWVyc1tpXTtcbiAgICAgIHZhciBiYiA9IGxheWVyLmJiO1xuICAgICAgaWYgKGJiLncgPT09IDAgfHwgYmIuaCA9PT0gMCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnRleHQuZHJhd0ltYWdlKGxheWVyLmNhbnZhcywgYmIueDEsIGJiLnkxLCBiYi53LCBiYi5oKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gZmFsbCBiYWNrIG9uIHBsYWluIGNhY2hpbmcgaWYgbm8gbGF5ZXJzXG4gICAgci5kcmF3Q2FjaGVkRWxlbWVudHMoY29udGV4dCwgZWxlcywgcHhSYXRpbywgZXh0ZW50KTtcbiAgfVxufTtcblxudmFyIENScCQ5ID0ge307XG5DUnAkOS5kcmF3RWRnZSA9IGZ1bmN0aW9uIChjb250ZXh0LCBlZGdlLCBzaGlmdFRvT3JpZ2luV2l0aEJiKSB7XG4gIHZhciBkcmF3TGFiZWwgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IHRydWU7XG4gIHZhciBzaG91bGREcmF3T3ZlcmxheSA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ICYmIGFyZ3VtZW50c1s0XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzRdIDogdHJ1ZTtcbiAgdmFyIHNob3VsZERyYXdPcGFjaXR5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDUgJiYgYXJndW1lbnRzWzVdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNV0gOiB0cnVlO1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBycyA9IGVkZ2UuX3ByaXZhdGUucnNjcmF0Y2g7XG4gIGlmIChzaG91bGREcmF3T3BhY2l0eSAmJiAhZWRnZS52aXNpYmxlKCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBpZiBiZXppZXIgY3RybCBwdHMgY2FuIG5vdCBiZSBjYWxjdWxhdGVkLCB0aGVuIGRpZVxuICBpZiAocnMuYmFkTGluZSB8fCBycy5hbGxwdHMgPT0gbnVsbCB8fCBpc05hTihycy5hbGxwdHNbMF0pKSB7XG4gICAgLy8gaXNOYU4gaW4gY2FzZSBlZGdlIGlzIGltcG9zc2libGUgYW5kIGJyb3dzZXIgYnVncyAoZS5nLiBzYWZhcmkpXG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBiYjtcbiAgaWYgKHNoaWZ0VG9PcmlnaW5XaXRoQmIpIHtcbiAgICBiYiA9IHNoaWZ0VG9PcmlnaW5XaXRoQmI7XG4gICAgY29udGV4dC50cmFuc2xhdGUoLWJiLngxLCAtYmIueTEpO1xuICB9XG4gIHZhciBvcGFjaXR5ID0gc2hvdWxkRHJhd09wYWNpdHkgPyBlZGdlLnBzdHlsZSgnb3BhY2l0eScpLnZhbHVlIDogMTtcbiAgdmFyIGxpbmVPcGFjaXR5ID0gc2hvdWxkRHJhd09wYWNpdHkgPyBlZGdlLnBzdHlsZSgnbGluZS1vcGFjaXR5JykudmFsdWUgOiAxO1xuICB2YXIgY3VydmVTdHlsZSA9IGVkZ2UucHN0eWxlKCdjdXJ2ZS1zdHlsZScpLnZhbHVlO1xuICB2YXIgbGluZVN0eWxlID0gZWRnZS5wc3R5bGUoJ2xpbmUtc3R5bGUnKS52YWx1ZTtcbiAgdmFyIGVkZ2VXaWR0aCA9IGVkZ2UucHN0eWxlKCd3aWR0aCcpLnBmVmFsdWU7XG4gIHZhciBsaW5lQ2FwID0gZWRnZS5wc3R5bGUoJ2xpbmUtY2FwJykudmFsdWU7XG4gIHZhciBsaW5lT3V0bGluZVdpZHRoID0gZWRnZS5wc3R5bGUoJ2xpbmUtb3V0bGluZS13aWR0aCcpLnZhbHVlO1xuICB2YXIgbGluZU91dGxpbmVDb2xvciA9IGVkZ2UucHN0eWxlKCdsaW5lLW91dGxpbmUtY29sb3InKS52YWx1ZTtcbiAgdmFyIGVmZmVjdGl2ZUxpbmVPcGFjaXR5ID0gb3BhY2l0eSAqIGxpbmVPcGFjaXR5O1xuICAvLyBzZXBhcmF0ZSBhcnJvdyBvcGFjaXR5IHdvdWxkIHJlcXVpcmUgYXJyb3ctb3BhY2l0eSBwcm9wZXJ0eVxuICB2YXIgZWZmZWN0aXZlQXJyb3dPcGFjaXR5ID0gb3BhY2l0eSAqIGxpbmVPcGFjaXR5O1xuICB2YXIgZHJhd0xpbmUgPSBmdW5jdGlvbiBkcmF3TGluZSgpIHtcbiAgICB2YXIgc3Ryb2tlT3BhY2l0eSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZWZmZWN0aXZlTGluZU9wYWNpdHk7XG4gICAgaWYgKGN1cnZlU3R5bGUgPT09ICdzdHJhaWdodC10cmlhbmdsZScpIHtcbiAgICAgIHIuZWxlU3Ryb2tlU3R5bGUoY29udGV4dCwgZWRnZSwgc3Ryb2tlT3BhY2l0eSk7XG4gICAgICByLmRyYXdFZGdlVHJpYW5nbGVQYXRoKGVkZ2UsIGNvbnRleHQsIHJzLmFsbHB0cyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRleHQubGluZVdpZHRoID0gZWRnZVdpZHRoO1xuICAgICAgY29udGV4dC5saW5lQ2FwID0gbGluZUNhcDtcbiAgICAgIHIuZWxlU3Ryb2tlU3R5bGUoY29udGV4dCwgZWRnZSwgc3Ryb2tlT3BhY2l0eSk7XG4gICAgICByLmRyYXdFZGdlUGF0aChlZGdlLCBjb250ZXh0LCBycy5hbGxwdHMsIGxpbmVTdHlsZSk7XG4gICAgICBjb250ZXh0LmxpbmVDYXAgPSAnYnV0dCc7IC8vIHJlc2V0IGZvciBvdGhlciBkcmF3aW5nIGZ1bmN0aW9uc1xuICAgIH1cbiAgfTtcbiAgdmFyIGRyYXdMaW5lT3V0bGluZSA9IGZ1bmN0aW9uIGRyYXdMaW5lT3V0bGluZSgpIHtcbiAgICB2YXIgc3Ryb2tlT3BhY2l0eSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZWZmZWN0aXZlTGluZU9wYWNpdHk7XG4gICAgY29udGV4dC5saW5lV2lkdGggPSBlZGdlV2lkdGggKyBsaW5lT3V0bGluZVdpZHRoO1xuICAgIGNvbnRleHQubGluZUNhcCA9IGxpbmVDYXA7XG4gICAgaWYgKGxpbmVPdXRsaW5lV2lkdGggPiAwKSB7XG4gICAgICByLmNvbG9yU3Ryb2tlU3R5bGUoY29udGV4dCwgbGluZU91dGxpbmVDb2xvclswXSwgbGluZU91dGxpbmVDb2xvclsxXSwgbGluZU91dGxpbmVDb2xvclsyXSwgc3Ryb2tlT3BhY2l0eSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGRvIG5vdCBkcmF3IGFueSBsaW5lT3V0bGluZVxuICAgICAgY29udGV4dC5saW5lQ2FwID0gJ2J1dHQnOyAvLyByZXNldCBmb3Igb3RoZXIgZHJhd2luZyBmdW5jdGlvbnNcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGN1cnZlU3R5bGUgPT09ICdzdHJhaWdodC10cmlhbmdsZScpIHtcbiAgICAgIHIuZHJhd0VkZ2VUcmlhbmdsZVBhdGgoZWRnZSwgY29udGV4dCwgcnMuYWxscHRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgci5kcmF3RWRnZVBhdGgoZWRnZSwgY29udGV4dCwgcnMuYWxscHRzLCBsaW5lU3R5bGUpO1xuICAgICAgY29udGV4dC5saW5lQ2FwID0gJ2J1dHQnOyAvLyByZXNldCBmb3Igb3RoZXIgZHJhd2luZyBmdW5jdGlvbnNcbiAgICB9XG4gIH07XG4gIHZhciBkcmF3T3ZlcmxheSA9IGZ1bmN0aW9uIGRyYXdPdmVybGF5KCkge1xuICAgIGlmICghc2hvdWxkRHJhd092ZXJsYXkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgci5kcmF3RWRnZU92ZXJsYXkoY29udGV4dCwgZWRnZSk7XG4gIH07XG4gIHZhciBkcmF3VW5kZXJsYXkgPSBmdW5jdGlvbiBkcmF3VW5kZXJsYXkoKSB7XG4gICAgaWYgKCFzaG91bGREcmF3T3ZlcmxheSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByLmRyYXdFZGdlVW5kZXJsYXkoY29udGV4dCwgZWRnZSk7XG4gIH07XG4gIHZhciBkcmF3QXJyb3dzID0gZnVuY3Rpb24gZHJhd0Fycm93cygpIHtcbiAgICB2YXIgYXJyb3dPcGFjaXR5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBlZmZlY3RpdmVBcnJvd09wYWNpdHk7XG4gICAgci5kcmF3QXJyb3doZWFkcyhjb250ZXh0LCBlZGdlLCBhcnJvd09wYWNpdHkpO1xuICB9O1xuICB2YXIgZHJhd1RleHQgPSBmdW5jdGlvbiBkcmF3VGV4dCgpIHtcbiAgICByLmRyYXdFbGVtZW50VGV4dChjb250ZXh0LCBlZGdlLCBudWxsLCBkcmF3TGFiZWwpO1xuICB9O1xuICBjb250ZXh0LmxpbmVKb2luID0gJ3JvdW5kJztcbiAgdmFyIGdob3N0ID0gZWRnZS5wc3R5bGUoJ2dob3N0JykudmFsdWUgPT09ICd5ZXMnO1xuICBpZiAoZ2hvc3QpIHtcbiAgICB2YXIgZ3ggPSBlZGdlLnBzdHlsZSgnZ2hvc3Qtb2Zmc2V0LXgnKS5wZlZhbHVlO1xuICAgIHZhciBneSA9IGVkZ2UucHN0eWxlKCdnaG9zdC1vZmZzZXQteScpLnBmVmFsdWU7XG4gICAgdmFyIGdob3N0T3BhY2l0eSA9IGVkZ2UucHN0eWxlKCdnaG9zdC1vcGFjaXR5JykudmFsdWU7XG4gICAgdmFyIGVmZmVjdGl2ZUdob3N0T3BhY2l0eSA9IGVmZmVjdGl2ZUxpbmVPcGFjaXR5ICogZ2hvc3RPcGFjaXR5O1xuICAgIGNvbnRleHQudHJhbnNsYXRlKGd4LCBneSk7XG4gICAgZHJhd0xpbmUoZWZmZWN0aXZlR2hvc3RPcGFjaXR5KTtcbiAgICBkcmF3QXJyb3dzKGVmZmVjdGl2ZUdob3N0T3BhY2l0eSk7XG4gICAgY29udGV4dC50cmFuc2xhdGUoLWd4LCAtZ3kpO1xuICB9IGVsc2Uge1xuICAgIGRyYXdMaW5lT3V0bGluZSgpO1xuICB9XG4gIGRyYXdVbmRlcmxheSgpO1xuICBkcmF3TGluZSgpO1xuICBkcmF3QXJyb3dzKCk7XG4gIGRyYXdPdmVybGF5KCk7XG4gIGRyYXdUZXh0KCk7XG4gIGlmIChzaGlmdFRvT3JpZ2luV2l0aEJiKSB7XG4gICAgY29udGV4dC50cmFuc2xhdGUoYmIueDEsIGJiLnkxKTtcbiAgfVxufTtcbnZhciBkcmF3RWRnZU92ZXJsYXlVbmRlcmxheSA9IGZ1bmN0aW9uIGRyYXdFZGdlT3ZlcmxheVVuZGVybGF5KG92ZXJsYXlPclVuZGVybGF5KSB7XG4gIGlmICghWydvdmVybGF5JywgJ3VuZGVybGF5J10uaW5jbHVkZXMob3ZlcmxheU9yVW5kZXJsYXkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHN0YXRlJyk7XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uIChjb250ZXh0LCBlZGdlKSB7XG4gICAgaWYgKCFlZGdlLnZpc2libGUoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgb3BhY2l0eSA9IGVkZ2UucHN0eWxlKFwiXCIuY29uY2F0KG92ZXJsYXlPclVuZGVybGF5LCBcIi1vcGFjaXR5XCIpKS52YWx1ZTtcbiAgICBpZiAob3BhY2l0eSA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgciA9IHRoaXM7XG4gICAgdmFyIHVzZVBhdGhzID0gci51c2VQYXRocygpO1xuICAgIHZhciBycyA9IGVkZ2UuX3ByaXZhdGUucnNjcmF0Y2g7XG4gICAgdmFyIHBhZGRpbmcgPSBlZGdlLnBzdHlsZShcIlwiLmNvbmNhdChvdmVybGF5T3JVbmRlcmxheSwgXCItcGFkZGluZ1wiKSkucGZWYWx1ZTtcbiAgICB2YXIgd2lkdGggPSAyICogcGFkZGluZztcbiAgICB2YXIgY29sb3IgPSBlZGdlLnBzdHlsZShcIlwiLmNvbmNhdChvdmVybGF5T3JVbmRlcmxheSwgXCItY29sb3JcIikpLnZhbHVlO1xuICAgIGNvbnRleHQubGluZVdpZHRoID0gd2lkdGg7XG4gICAgaWYgKHJzLmVkZ2VUeXBlID09PSAnc2VsZicgJiYgIXVzZVBhdGhzKSB7XG4gICAgICBjb250ZXh0LmxpbmVDYXAgPSAnYnV0dCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRleHQubGluZUNhcCA9ICdyb3VuZCc7XG4gICAgfVxuICAgIHIuY29sb3JTdHJva2VTdHlsZShjb250ZXh0LCBjb2xvclswXSwgY29sb3JbMV0sIGNvbG9yWzJdLCBvcGFjaXR5KTtcbiAgICByLmRyYXdFZGdlUGF0aChlZGdlLCBjb250ZXh0LCBycy5hbGxwdHMsICdzb2xpZCcpO1xuICB9O1xufTtcbkNScCQ5LmRyYXdFZGdlT3ZlcmxheSA9IGRyYXdFZGdlT3ZlcmxheVVuZGVybGF5KCdvdmVybGF5Jyk7XG5DUnAkOS5kcmF3RWRnZVVuZGVybGF5ID0gZHJhd0VkZ2VPdmVybGF5VW5kZXJsYXkoJ3VuZGVybGF5Jyk7XG5DUnAkOS5kcmF3RWRnZVBhdGggPSBmdW5jdGlvbiAoZWRnZSwgY29udGV4dCwgcHRzLCB0eXBlKSB7XG4gIHZhciBycyA9IGVkZ2UuX3ByaXZhdGUucnNjcmF0Y2g7XG4gIHZhciBjYW52YXNDeHQgPSBjb250ZXh0O1xuICB2YXIgcGF0aDtcbiAgdmFyIHBhdGhDYWNoZUhpdCA9IGZhbHNlO1xuICB2YXIgdXNlUGF0aHMgPSB0aGlzLnVzZVBhdGhzKCk7XG4gIHZhciBsaW5lRGFzaFBhdHRlcm4gPSBlZGdlLnBzdHlsZSgnbGluZS1kYXNoLXBhdHRlcm4nKS5wZlZhbHVlO1xuICB2YXIgbGluZURhc2hPZmZzZXQgPSBlZGdlLnBzdHlsZSgnbGluZS1kYXNoLW9mZnNldCcpLnBmVmFsdWU7XG4gIGlmICh1c2VQYXRocykge1xuICAgIHZhciBwYXRoQ2FjaGVLZXkgPSBwdHMuam9pbignJCcpO1xuICAgIHZhciBrZXlNYXRjaGVzID0gcnMucGF0aENhY2hlS2V5ICYmIHJzLnBhdGhDYWNoZUtleSA9PT0gcGF0aENhY2hlS2V5O1xuICAgIGlmIChrZXlNYXRjaGVzKSB7XG4gICAgICBwYXRoID0gY29udGV4dCA9IHJzLnBhdGhDYWNoZTtcbiAgICAgIHBhdGhDYWNoZUhpdCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhdGggPSBjb250ZXh0ID0gbmV3IFBhdGgyRCgpO1xuICAgICAgcnMucGF0aENhY2hlS2V5ID0gcGF0aENhY2hlS2V5O1xuICAgICAgcnMucGF0aENhY2hlID0gcGF0aDtcbiAgICB9XG4gIH1cbiAgaWYgKGNhbnZhc0N4dC5zZXRMaW5lRGFzaCkge1xuICAgIC8vIGZvciB2ZXJ5IG91dG9mZGF0ZSBicm93c2Vyc1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnZG90dGVkJzpcbiAgICAgICAgY2FudmFzQ3h0LnNldExpbmVEYXNoKFsxLCAxXSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZGFzaGVkJzpcbiAgICAgICAgY2FudmFzQ3h0LnNldExpbmVEYXNoKGxpbmVEYXNoUGF0dGVybik7XG4gICAgICAgIGNhbnZhc0N4dC5saW5lRGFzaE9mZnNldCA9IGxpbmVEYXNoT2Zmc2V0O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3NvbGlkJzpcbiAgICAgICAgY2FudmFzQ3h0LnNldExpbmVEYXNoKFtdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGlmICghcGF0aENhY2hlSGl0ICYmICFycy5iYWRMaW5lKSB7XG4gICAgaWYgKGNvbnRleHQuYmVnaW5QYXRoKSB7XG4gICAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgIH1cbiAgICBjb250ZXh0Lm1vdmVUbyhwdHNbMF0sIHB0c1sxXSk7XG4gICAgc3dpdGNoIChycy5lZGdlVHlwZSkge1xuICAgICAgY2FzZSAnYmV6aWVyJzpcbiAgICAgIGNhc2UgJ3NlbGYnOlxuICAgICAgY2FzZSAnY29tcG91bmQnOlxuICAgICAgY2FzZSAnbXVsdGliZXppZXInOlxuICAgICAgICBmb3IgKHZhciBpID0gMjsgaSArIDMgPCBwdHMubGVuZ3RoOyBpICs9IDQpIHtcbiAgICAgICAgICBjb250ZXh0LnF1YWRyYXRpY0N1cnZlVG8ocHRzW2ldLCBwdHNbaSArIDFdLCBwdHNbaSArIDJdLCBwdHNbaSArIDNdKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3N0cmFpZ2h0JzpcbiAgICAgIGNhc2UgJ2hheXN0YWNrJzpcbiAgICAgICAgZm9yICh2YXIgX2kgPSAyOyBfaSArIDEgPCBwdHMubGVuZ3RoOyBfaSArPSAyKSB7XG4gICAgICAgICAgY29udGV4dC5saW5lVG8ocHRzW19pXSwgcHRzW19pICsgMV0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc2VnbWVudHMnOlxuICAgICAgICBpZiAocnMuaXNSb3VuZCkge1xuICAgICAgICAgIHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihycy5yb3VuZENvcm5lcnMpLFxuICAgICAgICAgICAgX3N0ZXA7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgICAgIHZhciBjb3JuZXIgPSBfc3RlcC52YWx1ZTtcbiAgICAgICAgICAgICAgZHJhd1ByZXBhcmVkUm91bmRDb3JuZXIoY29udGV4dCwgY29ybmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIF9pdGVyYXRvci5lKGVycik7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIF9pdGVyYXRvci5mKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRleHQubGluZVRvKHB0c1twdHMubGVuZ3RoIC0gMl0sIHB0c1twdHMubGVuZ3RoIC0gMV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvciAodmFyIF9pMiA9IDI7IF9pMiArIDEgPCBwdHMubGVuZ3RoOyBfaTIgKz0gMikge1xuICAgICAgICAgICAgY29udGV4dC5saW5lVG8ocHRzW19pMl0sIHB0c1tfaTIgKyAxXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBjb250ZXh0ID0gY2FudmFzQ3h0O1xuICBpZiAodXNlUGF0aHMpIHtcbiAgICBjb250ZXh0LnN0cm9rZShwYXRoKTtcbiAgfSBlbHNlIHtcbiAgICBjb250ZXh0LnN0cm9rZSgpO1xuICB9XG5cbiAgLy8gcmVzZXQgYW55IGxpbmUgZGFzaGVzXG4gIGlmIChjb250ZXh0LnNldExpbmVEYXNoKSB7XG4gICAgLy8gZm9yIHZlcnkgb3V0b2ZkYXRlIGJyb3dzZXJzXG4gICAgY29udGV4dC5zZXRMaW5lRGFzaChbXSk7XG4gIH1cbn07XG5DUnAkOS5kcmF3RWRnZVRyaWFuZ2xlUGF0aCA9IGZ1bmN0aW9uIChlZGdlLCBjb250ZXh0LCBwdHMpIHtcbiAgLy8gdXNlIGxpbmUgc3Ryb2tlIHN0eWxlIGZvciB0cmlhbmdsZSBmaWxsIHN0eWxlXG4gIGNvbnRleHQuZmlsbFN0eWxlID0gY29udGV4dC5zdHJva2VTdHlsZTtcbiAgdmFyIGVkZ2VXaWR0aCA9IGVkZ2UucHN0eWxlKCd3aWR0aCcpLnBmVmFsdWU7XG4gIGZvciAodmFyIGkgPSAwOyBpICsgMSA8IHB0cy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHZhciB2ZWN0b3IgPSBbcHRzW2kgKyAyXSAtIHB0c1tpXSwgcHRzW2kgKyAzXSAtIHB0c1tpICsgMV1dO1xuICAgIHZhciBsZW5ndGggPSBNYXRoLnNxcnQodmVjdG9yWzBdICogdmVjdG9yWzBdICsgdmVjdG9yWzFdICogdmVjdG9yWzFdKTtcbiAgICB2YXIgbm9ybWFsID0gW3ZlY3RvclsxXSAvIGxlbmd0aCwgLXZlY3RvclswXSAvIGxlbmd0aF07XG4gICAgdmFyIHRyaWFuZ2xlSGVhZCA9IFtub3JtYWxbMF0gKiBlZGdlV2lkdGggLyAyLCBub3JtYWxbMV0gKiBlZGdlV2lkdGggLyAyXTtcbiAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgIGNvbnRleHQubW92ZVRvKHB0c1tpXSAtIHRyaWFuZ2xlSGVhZFswXSwgcHRzW2kgKyAxXSAtIHRyaWFuZ2xlSGVhZFsxXSk7XG4gICAgY29udGV4dC5saW5lVG8ocHRzW2ldICsgdHJpYW5nbGVIZWFkWzBdLCBwdHNbaSArIDFdICsgdHJpYW5nbGVIZWFkWzFdKTtcbiAgICBjb250ZXh0LmxpbmVUbyhwdHNbaSArIDJdLCBwdHNbaSArIDNdKTtcbiAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgIGNvbnRleHQuZmlsbCgpO1xuICB9XG59O1xuQ1JwJDkuZHJhd0Fycm93aGVhZHMgPSBmdW5jdGlvbiAoY29udGV4dCwgZWRnZSwgb3BhY2l0eSkge1xuICB2YXIgcnMgPSBlZGdlLl9wcml2YXRlLnJzY3JhdGNoO1xuICB2YXIgaXNIYXlzdGFjayA9IHJzLmVkZ2VUeXBlID09PSAnaGF5c3RhY2snO1xuICBpZiAoIWlzSGF5c3RhY2spIHtcbiAgICB0aGlzLmRyYXdBcnJvd2hlYWQoY29udGV4dCwgZWRnZSwgJ3NvdXJjZScsIHJzLmFycm93U3RhcnRYLCBycy5hcnJvd1N0YXJ0WSwgcnMuc3JjQXJyb3dBbmdsZSwgb3BhY2l0eSk7XG4gIH1cbiAgdGhpcy5kcmF3QXJyb3doZWFkKGNvbnRleHQsIGVkZ2UsICdtaWQtdGFyZ2V0JywgcnMubWlkWCwgcnMubWlkWSwgcnMubWlkdGd0QXJyb3dBbmdsZSwgb3BhY2l0eSk7XG4gIHRoaXMuZHJhd0Fycm93aGVhZChjb250ZXh0LCBlZGdlLCAnbWlkLXNvdXJjZScsIHJzLm1pZFgsIHJzLm1pZFksIHJzLm1pZHNyY0Fycm93QW5nbGUsIG9wYWNpdHkpO1xuICBpZiAoIWlzSGF5c3RhY2spIHtcbiAgICB0aGlzLmRyYXdBcnJvd2hlYWQoY29udGV4dCwgZWRnZSwgJ3RhcmdldCcsIHJzLmFycm93RW5kWCwgcnMuYXJyb3dFbmRZLCBycy50Z3RBcnJvd0FuZ2xlLCBvcGFjaXR5KTtcbiAgfVxufTtcbkNScCQ5LmRyYXdBcnJvd2hlYWQgPSBmdW5jdGlvbiAoY29udGV4dCwgZWRnZSwgcHJlZml4LCB4LCB5LCBhbmdsZSwgb3BhY2l0eSkge1xuICBpZiAoaXNOYU4oeCkgfHwgeCA9PSBudWxsIHx8IGlzTmFOKHkpIHx8IHkgPT0gbnVsbCB8fCBpc05hTihhbmdsZSkgfHwgYW5nbGUgPT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBhcnJvd1NoYXBlID0gZWRnZS5wc3R5bGUocHJlZml4ICsgJy1hcnJvdy1zaGFwZScpLnZhbHVlO1xuICBpZiAoYXJyb3dTaGFwZSA9PT0gJ25vbmUnKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBhcnJvd0NsZWFyRmlsbCA9IGVkZ2UucHN0eWxlKHByZWZpeCArICctYXJyb3ctZmlsbCcpLnZhbHVlID09PSAnaG9sbG93JyA/ICdib3RoJyA6ICdmaWxsZWQnO1xuICB2YXIgYXJyb3dGaWxsID0gZWRnZS5wc3R5bGUocHJlZml4ICsgJy1hcnJvdy1maWxsJykudmFsdWU7XG4gIHZhciBlZGdlV2lkdGggPSBlZGdlLnBzdHlsZSgnd2lkdGgnKS5wZlZhbHVlO1xuICB2YXIgcEFycm93V2lkdGggPSBlZGdlLnBzdHlsZShwcmVmaXggKyAnLWFycm93LXdpZHRoJyk7XG4gIHZhciBhcnJvd1dpZHRoID0gcEFycm93V2lkdGgudmFsdWUgPT09ICdtYXRjaC1saW5lJyA/IGVkZ2VXaWR0aCA6IHBBcnJvd1dpZHRoLnBmVmFsdWU7XG4gIGlmIChwQXJyb3dXaWR0aC51bml0cyA9PT0gJyUnKSBhcnJvd1dpZHRoICo9IGVkZ2VXaWR0aDtcbiAgdmFyIGVkZ2VPcGFjaXR5ID0gZWRnZS5wc3R5bGUoJ29wYWNpdHknKS52YWx1ZTtcbiAgaWYgKG9wYWNpdHkgPT09IHVuZGVmaW5lZCkge1xuICAgIG9wYWNpdHkgPSBlZGdlT3BhY2l0eTtcbiAgfVxuICB2YXIgZ2NvID0gY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb247XG4gIGlmIChvcGFjaXR5ICE9PSAxIHx8IGFycm93RmlsbCA9PT0gJ2hvbGxvdycpIHtcbiAgICAvLyB0aGVuIGV4dHJhIGNsZWFyIGlzIG5lZWRlZFxuICAgIGNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ2Rlc3RpbmF0aW9uLW91dCc7XG4gICAgc2VsZi5jb2xvckZpbGxTdHlsZShjb250ZXh0LCAyNTUsIDI1NSwgMjU1LCAxKTtcbiAgICBzZWxmLmNvbG9yU3Ryb2tlU3R5bGUoY29udGV4dCwgMjU1LCAyNTUsIDI1NSwgMSk7XG4gICAgc2VsZi5kcmF3QXJyb3dTaGFwZShlZGdlLCBjb250ZXh0LCBhcnJvd0NsZWFyRmlsbCwgZWRnZVdpZHRoLCBhcnJvd1NoYXBlLCBhcnJvd1dpZHRoLCB4LCB5LCBhbmdsZSk7XG4gICAgY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBnY287XG4gIH0gLy8gb3RoZXJ3aXNlLCB0aGUgb3BhcXVlIGFycm93IGNsZWFycyBpdCBmb3IgZnJlZSA6KVxuXG4gIHZhciBjb2xvciA9IGVkZ2UucHN0eWxlKHByZWZpeCArICctYXJyb3ctY29sb3InKS52YWx1ZTtcbiAgc2VsZi5jb2xvckZpbGxTdHlsZShjb250ZXh0LCBjb2xvclswXSwgY29sb3JbMV0sIGNvbG9yWzJdLCBvcGFjaXR5KTtcbiAgc2VsZi5jb2xvclN0cm9rZVN0eWxlKGNvbnRleHQsIGNvbG9yWzBdLCBjb2xvclsxXSwgY29sb3JbMl0sIG9wYWNpdHkpO1xuICBzZWxmLmRyYXdBcnJvd1NoYXBlKGVkZ2UsIGNvbnRleHQsIGFycm93RmlsbCwgZWRnZVdpZHRoLCBhcnJvd1NoYXBlLCBhcnJvd1dpZHRoLCB4LCB5LCBhbmdsZSk7XG59O1xuQ1JwJDkuZHJhd0Fycm93U2hhcGUgPSBmdW5jdGlvbiAoZWRnZSwgY29udGV4dCwgZmlsbCwgZWRnZVdpZHRoLCBzaGFwZSwgc2hhcGVXaWR0aCwgeCwgeSwgYW5nbGUpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgdXNlUGF0aHMgPSB0aGlzLnVzZVBhdGhzKCkgJiYgc2hhcGUgIT09ICd0cmlhbmdsZS1jcm9zcyc7XG4gIHZhciBwYXRoQ2FjaGVIaXQgPSBmYWxzZTtcbiAgdmFyIHBhdGg7XG4gIHZhciBjYW52YXNDb250ZXh0ID0gY29udGV4dDtcbiAgdmFyIHRyYW5zbGF0aW9uID0ge1xuICAgIHg6IHgsXG4gICAgeTogeVxuICB9O1xuICB2YXIgc2NhbGUgPSBlZGdlLnBzdHlsZSgnYXJyb3ctc2NhbGUnKS52YWx1ZTtcbiAgdmFyIHNpemUgPSB0aGlzLmdldEFycm93V2lkdGgoZWRnZVdpZHRoLCBzY2FsZSk7XG4gIHZhciBzaGFwZUltcGwgPSByLmFycm93U2hhcGVzW3NoYXBlXTtcbiAgaWYgKHVzZVBhdGhzKSB7XG4gICAgdmFyIGNhY2hlID0gci5hcnJvd1BhdGhDYWNoZSA9IHIuYXJyb3dQYXRoQ2FjaGUgfHwgW107XG4gICAgdmFyIGtleSA9IGhhc2hTdHJpbmcoc2hhcGUpO1xuICAgIHZhciBjYWNoZWRQYXRoID0gY2FjaGVba2V5XTtcbiAgICBpZiAoY2FjaGVkUGF0aCAhPSBudWxsKSB7XG4gICAgICBwYXRoID0gY29udGV4dCA9IGNhY2hlZFBhdGg7XG4gICAgICBwYXRoQ2FjaGVIaXQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXRoID0gY29udGV4dCA9IG5ldyBQYXRoMkQoKTtcbiAgICAgIGNhY2hlW2tleV0gPSBwYXRoO1xuICAgIH1cbiAgfVxuICBpZiAoIXBhdGhDYWNoZUhpdCkge1xuICAgIGlmIChjb250ZXh0LmJlZ2luUGF0aCkge1xuICAgICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICB9XG4gICAgaWYgKHVzZVBhdGhzKSB7XG4gICAgICAvLyBzdG9yZSBpbiB0aGUgcGF0aCBjYWNoZSB3aXRoIHZhbHVlcyBlYXNpbHkgbWFuaXB1bGF0ZWQgbGF0ZXJcbiAgICAgIHNoYXBlSW1wbC5kcmF3KGNvbnRleHQsIDEsIDAsIHtcbiAgICAgICAgeDogMCxcbiAgICAgICAgeTogMFxuICAgICAgfSwgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNoYXBlSW1wbC5kcmF3KGNvbnRleHQsIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbiwgZWRnZVdpZHRoKTtcbiAgICB9XG4gICAgaWYgKGNvbnRleHQuY2xvc2VQYXRoKSB7XG4gICAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgIH1cbiAgfVxuICBjb250ZXh0ID0gY2FudmFzQ29udGV4dDtcbiAgaWYgKHVzZVBhdGhzKSB7XG4gICAgLy8gc2V0IHRyYW5zZm9ybSB0byBhcnJvdyBwb3NpdGlvbi9vcmllbnRhdGlvblxuICAgIGNvbnRleHQudHJhbnNsYXRlKHgsIHkpO1xuICAgIGNvbnRleHQucm90YXRlKGFuZ2xlKTtcbiAgICBjb250ZXh0LnNjYWxlKHNpemUsIHNpemUpO1xuICB9XG4gIGlmIChmaWxsID09PSAnZmlsbGVkJyB8fCBmaWxsID09PSAnYm90aCcpIHtcbiAgICBpZiAodXNlUGF0aHMpIHtcbiAgICAgIGNvbnRleHQuZmlsbChwYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGV4dC5maWxsKCk7XG4gICAgfVxuICB9XG4gIGlmIChmaWxsID09PSAnaG9sbG93JyB8fCBmaWxsID09PSAnYm90aCcpIHtcbiAgICBjb250ZXh0LmxpbmVXaWR0aCA9IHNoYXBlV2lkdGggLyAodXNlUGF0aHMgPyBzaXplIDogMSk7XG4gICAgY29udGV4dC5saW5lSm9pbiA9ICdtaXRlcic7XG4gICAgaWYgKHVzZVBhdGhzKSB7XG4gICAgICBjb250ZXh0LnN0cm9rZShwYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGV4dC5zdHJva2UoKTtcbiAgICB9XG4gIH1cbiAgaWYgKHVzZVBhdGhzKSB7XG4gICAgLy8gcmVzZXQgdHJhbnNmb3JtIGJ5IGFwcGx5aW5nIGludmVyc2VcbiAgICBjb250ZXh0LnNjYWxlKDEgLyBzaXplLCAxIC8gc2l6ZSk7XG4gICAgY29udGV4dC5yb3RhdGUoLWFuZ2xlKTtcbiAgICBjb250ZXh0LnRyYW5zbGF0ZSgteCwgLXkpO1xuICB9XG59O1xuXG52YXIgQ1JwJDggPSB7fTtcbkNScCQ4LnNhZmVEcmF3SW1hZ2UgPSBmdW5jdGlvbiAoY29udGV4dCwgaW1nLCBpeCwgaXksIGl3LCBpaCwgeCwgeSwgdywgaCkge1xuICAvLyBkZXRlY3QgcHJvYmxlbWF0aWMgY2FzZXMgZm9yIG9sZCBicm93c2VycyB3aXRoIGJhZCBpbWFnZXMgKGNoZWFwZXIgdGhhbiB0cnktY2F0Y2gpXG4gIGlmIChpdyA8PSAwIHx8IGloIDw9IDAgfHwgdyA8PSAwIHx8IGggPD0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICB0cnkge1xuICAgIGNvbnRleHQuZHJhd0ltYWdlKGltZywgaXgsIGl5LCBpdywgaWgsIHgsIHksIHcsIGgpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgd2FybihlKTtcbiAgfVxufTtcbkNScCQ4LmRyYXdJbnNjcmliZWRJbWFnZSA9IGZ1bmN0aW9uIChjb250ZXh0LCBpbWcsIG5vZGUsIGluZGV4LCBub2RlT3BhY2l0eSkge1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBwb3MgPSBub2RlLnBvc2l0aW9uKCk7XG4gIHZhciBub2RlWCA9IHBvcy54O1xuICB2YXIgbm9kZVkgPSBwb3MueTtcbiAgdmFyIHN0eWxlT2JqID0gbm9kZS5jeSgpLnN0eWxlKCk7XG4gIHZhciBnZXRJbmRleGVkU3R5bGUgPSBzdHlsZU9iai5nZXRJbmRleGVkU3R5bGUuYmluZChzdHlsZU9iaik7XG4gIHZhciBmaXQgPSBnZXRJbmRleGVkU3R5bGUobm9kZSwgJ2JhY2tncm91bmQtZml0JywgJ3ZhbHVlJywgaW5kZXgpO1xuICB2YXIgcmVwZWF0ID0gZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLXJlcGVhdCcsICd2YWx1ZScsIGluZGV4KTtcbiAgdmFyIG5vZGVXID0gbm9kZS53aWR0aCgpO1xuICB2YXIgbm9kZUggPSBub2RlLmhlaWdodCgpO1xuICB2YXIgcGFkZGluZ1gyID0gbm9kZS5wYWRkaW5nKCkgKiAyO1xuICB2YXIgbm9kZVRXID0gbm9kZVcgKyAoZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLXdpZHRoLXJlbGF0aXZlLXRvJywgJ3ZhbHVlJywgaW5kZXgpID09PSAnaW5uZXInID8gMCA6IHBhZGRpbmdYMik7XG4gIHZhciBub2RlVEggPSBub2RlSCArIChnZXRJbmRleGVkU3R5bGUobm9kZSwgJ2JhY2tncm91bmQtaGVpZ2h0LXJlbGF0aXZlLXRvJywgJ3ZhbHVlJywgaW5kZXgpID09PSAnaW5uZXInID8gMCA6IHBhZGRpbmdYMik7XG4gIHZhciBycyA9IG5vZGUuX3ByaXZhdGUucnNjcmF0Y2g7XG4gIHZhciBjbGlwID0gZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLWNsaXAnLCAndmFsdWUnLCBpbmRleCk7XG4gIHZhciBzaG91bGRDbGlwID0gY2xpcCA9PT0gJ25vZGUnO1xuICB2YXIgaW1nT3BhY2l0eSA9IGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC1pbWFnZS1vcGFjaXR5JywgJ3ZhbHVlJywgaW5kZXgpICogbm9kZU9wYWNpdHk7XG4gIHZhciBzbW9vdGggPSBnZXRJbmRleGVkU3R5bGUobm9kZSwgJ2JhY2tncm91bmQtaW1hZ2Utc21vb3RoaW5nJywgJ3ZhbHVlJywgaW5kZXgpO1xuICB2YXIgY29ybmVyUmFkaXVzID0gbm9kZS5wc3R5bGUoJ2Nvcm5lci1yYWRpdXMnKS52YWx1ZTtcbiAgaWYgKGNvcm5lclJhZGl1cyAhPT0gJ2F1dG8nKSBjb3JuZXJSYWRpdXMgPSBub2RlLnBzdHlsZSgnY29ybmVyLXJhZGl1cycpLnBmVmFsdWU7XG4gIHZhciBpbWdXID0gaW1nLndpZHRoIHx8IGltZy5jYWNoZWRXO1xuICB2YXIgaW1nSCA9IGltZy5oZWlnaHQgfHwgaW1nLmNhY2hlZEg7XG5cbiAgLy8gd29ya2Fyb3VuZCBmb3IgYnJva2VuIGJyb3dzZXJzIGxpa2UgaWVcbiAgaWYgKG51bGwgPT0gaW1nVyB8fCBudWxsID09IGltZ0gpIHtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGltZyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcblxuICAgIGltZ1cgPSBpbWcuY2FjaGVkVyA9IGltZy53aWR0aCB8fCBpbWcub2Zmc2V0V2lkdGg7XG4gICAgaW1nSCA9IGltZy5jYWNoZWRIID0gaW1nLmhlaWdodCB8fCBpbWcub2Zmc2V0SGVpZ2h0O1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoaW1nKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuICB9XG4gIHZhciB3ID0gaW1nVztcbiAgdmFyIGggPSBpbWdIO1xuICBpZiAoZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLXdpZHRoJywgJ3ZhbHVlJywgaW5kZXgpICE9PSAnYXV0bycpIHtcbiAgICBpZiAoZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLXdpZHRoJywgJ3VuaXRzJywgaW5kZXgpID09PSAnJScpIHtcbiAgICAgIHcgPSBnZXRJbmRleGVkU3R5bGUobm9kZSwgJ2JhY2tncm91bmQtd2lkdGgnLCAncGZWYWx1ZScsIGluZGV4KSAqIG5vZGVUVztcbiAgICB9IGVsc2Uge1xuICAgICAgdyA9IGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC13aWR0aCcsICdwZlZhbHVlJywgaW5kZXgpO1xuICAgIH1cbiAgfVxuICBpZiAoZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLWhlaWdodCcsICd2YWx1ZScsIGluZGV4KSAhPT0gJ2F1dG8nKSB7XG4gICAgaWYgKGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC1oZWlnaHQnLCAndW5pdHMnLCBpbmRleCkgPT09ICclJykge1xuICAgICAgaCA9IGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC1oZWlnaHQnLCAncGZWYWx1ZScsIGluZGV4KSAqIG5vZGVUSDtcbiAgICB9IGVsc2Uge1xuICAgICAgaCA9IGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC1oZWlnaHQnLCAncGZWYWx1ZScsIGluZGV4KTtcbiAgICB9XG4gIH1cbiAgaWYgKHcgPT09IDAgfHwgaCA9PT0gMCkge1xuICAgIHJldHVybjsgLy8gbm8gcG9pbnQgaW4gZHJhd2luZyBlbXB0eSBpbWFnZSAoYW5kIGNocm9tZSBpcyBicm9rZW4gaW4gdGhpcyBjYXNlKVxuICB9XG4gIGlmIChmaXQgPT09ICdjb250YWluJykge1xuICAgIHZhciBzY2FsZSA9IE1hdGgubWluKG5vZGVUVyAvIHcsIG5vZGVUSCAvIGgpO1xuICAgIHcgKj0gc2NhbGU7XG4gICAgaCAqPSBzY2FsZTtcbiAgfSBlbHNlIGlmIChmaXQgPT09ICdjb3ZlcicpIHtcbiAgICB2YXIgc2NhbGUgPSBNYXRoLm1heChub2RlVFcgLyB3LCBub2RlVEggLyBoKTtcbiAgICB3ICo9IHNjYWxlO1xuICAgIGggKj0gc2NhbGU7XG4gIH1cbiAgdmFyIHggPSBub2RlWCAtIG5vZGVUVyAvIDI7IC8vIGxlZnRcbiAgdmFyIHBvc1hVbml0cyA9IGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC1wb3NpdGlvbi14JywgJ3VuaXRzJywgaW5kZXgpO1xuICB2YXIgcG9zWFBmVmFsID0gZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLXBvc2l0aW9uLXgnLCAncGZWYWx1ZScsIGluZGV4KTtcbiAgaWYgKHBvc1hVbml0cyA9PT0gJyUnKSB7XG4gICAgeCArPSAobm9kZVRXIC0gdykgKiBwb3NYUGZWYWw7XG4gIH0gZWxzZSB7XG4gICAgeCArPSBwb3NYUGZWYWw7XG4gIH1cbiAgdmFyIG9mZlhVbml0cyA9IGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC1vZmZzZXQteCcsICd1bml0cycsIGluZGV4KTtcbiAgdmFyIG9mZlhQZlZhbCA9IGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC1vZmZzZXQteCcsICdwZlZhbHVlJywgaW5kZXgpO1xuICBpZiAob2ZmWFVuaXRzID09PSAnJScpIHtcbiAgICB4ICs9IChub2RlVFcgLSB3KSAqIG9mZlhQZlZhbDtcbiAgfSBlbHNlIHtcbiAgICB4ICs9IG9mZlhQZlZhbDtcbiAgfVxuICB2YXIgeSA9IG5vZGVZIC0gbm9kZVRIIC8gMjsgLy8gdG9wXG4gIHZhciBwb3NZVW5pdHMgPSBnZXRJbmRleGVkU3R5bGUobm9kZSwgJ2JhY2tncm91bmQtcG9zaXRpb24teScsICd1bml0cycsIGluZGV4KTtcbiAgdmFyIHBvc1lQZlZhbCA9IGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC1wb3NpdGlvbi15JywgJ3BmVmFsdWUnLCBpbmRleCk7XG4gIGlmIChwb3NZVW5pdHMgPT09ICclJykge1xuICAgIHkgKz0gKG5vZGVUSCAtIGgpICogcG9zWVBmVmFsO1xuICB9IGVsc2Uge1xuICAgIHkgKz0gcG9zWVBmVmFsO1xuICB9XG4gIHZhciBvZmZZVW5pdHMgPSBnZXRJbmRleGVkU3R5bGUobm9kZSwgJ2JhY2tncm91bmQtb2Zmc2V0LXknLCAndW5pdHMnLCBpbmRleCk7XG4gIHZhciBvZmZZUGZWYWwgPSBnZXRJbmRleGVkU3R5bGUobm9kZSwgJ2JhY2tncm91bmQtb2Zmc2V0LXknLCAncGZWYWx1ZScsIGluZGV4KTtcbiAgaWYgKG9mZllVbml0cyA9PT0gJyUnKSB7XG4gICAgeSArPSAobm9kZVRIIC0gaCkgKiBvZmZZUGZWYWw7XG4gIH0gZWxzZSB7XG4gICAgeSArPSBvZmZZUGZWYWw7XG4gIH1cbiAgaWYgKHJzLnBhdGhDYWNoZSkge1xuICAgIHggLT0gbm9kZVg7XG4gICAgeSAtPSBub2RlWTtcbiAgICBub2RlWCA9IDA7XG4gICAgbm9kZVkgPSAwO1xuICB9XG4gIHZhciBnQWxwaGEgPSBjb250ZXh0Lmdsb2JhbEFscGhhO1xuICBjb250ZXh0Lmdsb2JhbEFscGhhID0gaW1nT3BhY2l0eTtcbiAgdmFyIHNtb290aGluZ0VuYWJsZWQgPSByLmdldEltZ1Ntb290aGluZyhjb250ZXh0KTtcbiAgdmFyIGlzU21vb3RoaW5nU3dpdGNoZWQgPSBmYWxzZTtcbiAgaWYgKHNtb290aCA9PT0gJ25vJyAmJiBzbW9vdGhpbmdFbmFibGVkKSB7XG4gICAgci5zZXRJbWdTbW9vdGhpbmcoY29udGV4dCwgZmFsc2UpO1xuICAgIGlzU21vb3RoaW5nU3dpdGNoZWQgPSB0cnVlO1xuICB9IGVsc2UgaWYgKHNtb290aCA9PT0gJ3llcycgJiYgIXNtb290aGluZ0VuYWJsZWQpIHtcbiAgICByLnNldEltZ1Ntb290aGluZyhjb250ZXh0LCB0cnVlKTtcbiAgICBpc1Ntb290aGluZ1N3aXRjaGVkID0gdHJ1ZTtcbiAgfVxuICBpZiAocmVwZWF0ID09PSAnbm8tcmVwZWF0Jykge1xuICAgIGlmIChzaG91bGRDbGlwKSB7XG4gICAgICBjb250ZXh0LnNhdmUoKTtcbiAgICAgIGlmIChycy5wYXRoQ2FjaGUpIHtcbiAgICAgICAgY29udGV4dC5jbGlwKHJzLnBhdGhDYWNoZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByLm5vZGVTaGFwZXNbci5nZXROb2RlU2hhcGUobm9kZSldLmRyYXcoY29udGV4dCwgbm9kZVgsIG5vZGVZLCBub2RlVFcsIG5vZGVUSCwgY29ybmVyUmFkaXVzLCBycyk7XG4gICAgICAgIGNvbnRleHQuY2xpcCgpO1xuICAgICAgfVxuICAgIH1cbiAgICByLnNhZmVEcmF3SW1hZ2UoY29udGV4dCwgaW1nLCAwLCAwLCBpbWdXLCBpbWdILCB4LCB5LCB3LCBoKTtcbiAgICBpZiAoc2hvdWxkQ2xpcCkge1xuICAgICAgY29udGV4dC5yZXN0b3JlKCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBwYXR0ZXJuID0gY29udGV4dC5jcmVhdGVQYXR0ZXJuKGltZywgcmVwZWF0KTtcbiAgICBjb250ZXh0LmZpbGxTdHlsZSA9IHBhdHRlcm47XG4gICAgci5ub2RlU2hhcGVzW3IuZ2V0Tm9kZVNoYXBlKG5vZGUpXS5kcmF3KGNvbnRleHQsIG5vZGVYLCBub2RlWSwgbm9kZVRXLCBub2RlVEgsIGNvcm5lclJhZGl1cywgcnMpO1xuICAgIGNvbnRleHQudHJhbnNsYXRlKHgsIHkpO1xuICAgIGNvbnRleHQuZmlsbCgpO1xuICAgIGNvbnRleHQudHJhbnNsYXRlKC14LCAteSk7XG4gIH1cbiAgY29udGV4dC5nbG9iYWxBbHBoYSA9IGdBbHBoYTtcbiAgaWYgKGlzU21vb3RoaW5nU3dpdGNoZWQpIHtcbiAgICByLnNldEltZ1Ntb290aGluZyhjb250ZXh0LCBzbW9vdGhpbmdFbmFibGVkKTtcbiAgfVxufTtcblxudmFyIENScCQ3ID0ge307XG5DUnAkNy5lbGVUZXh0QmlnZ2VyVGhhbk1pbiA9IGZ1bmN0aW9uIChlbGUsIHNjYWxlKSB7XG4gIGlmICghc2NhbGUpIHtcbiAgICB2YXIgem9vbSA9IGVsZS5jeSgpLnpvb20oKTtcbiAgICB2YXIgcHhSYXRpbyA9IHRoaXMuZ2V0UGl4ZWxSYXRpbygpO1xuICAgIHZhciBsdmwgPSBNYXRoLmNlaWwobG9nMih6b29tICogcHhSYXRpbykpOyAvLyB0aGUgZWZmZWN0aXZlIHRleHR1cmUgbGV2ZWxcblxuICAgIHNjYWxlID0gTWF0aC5wb3coMiwgbHZsKTtcbiAgfVxuICB2YXIgY29tcHV0ZWRTaXplID0gZWxlLnBzdHlsZSgnZm9udC1zaXplJykucGZWYWx1ZSAqIHNjYWxlO1xuICB2YXIgbWluU2l6ZSA9IGVsZS5wc3R5bGUoJ21pbi16b29tZWQtZm9udC1zaXplJykucGZWYWx1ZTtcbiAgaWYgKGNvbXB1dGVkU2l6ZSA8IG1pblNpemUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59O1xuQ1JwJDcuZHJhd0VsZW1lbnRUZXh0ID0gZnVuY3Rpb24gKGNvbnRleHQsIGVsZSwgc2hpZnRUb09yaWdpbldpdGhCYiwgZm9yY2UsIHByZWZpeCkge1xuICB2YXIgdXNlRWxlT3BhY2l0eSA9IGFyZ3VtZW50cy5sZW5ndGggPiA1ICYmIGFyZ3VtZW50c1s1XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzVdIDogdHJ1ZTtcbiAgdmFyIHIgPSB0aGlzO1xuICBpZiAoZm9yY2UgPT0gbnVsbCkge1xuICAgIGlmICh1c2VFbGVPcGFjaXR5ICYmICFyLmVsZVRleHRCaWdnZXJUaGFuTWluKGVsZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH0gZWxzZSBpZiAoZm9yY2UgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChlbGUuaXNOb2RlKCkpIHtcbiAgICB2YXIgbGFiZWwgPSBlbGUucHN0eWxlKCdsYWJlbCcpO1xuICAgIGlmICghbGFiZWwgfHwgIWxhYmVsLnZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBqdXN0aWZpY2F0aW9uID0gci5nZXRMYWJlbEp1c3RpZmljYXRpb24oZWxlKTtcbiAgICB2YXIgaXNUZXh0TWV0cmljc0dseXBoID0gZWxlLnBzdHlsZSgndGV4dC1tZXRyaWNzJykuc3RyVmFsdWUgPT09ICdnbHlwaCc7XG4gICAgY29udGV4dC50ZXh0QWxpZ24gPSBqdXN0aWZpY2F0aW9uO1xuICAgIGNvbnRleHQudGV4dEJhc2VsaW5lID0gaXNUZXh0TWV0cmljc0dseXBoID8gJ2FscGhhYmV0aWMnIDogJ2JvdHRvbSc7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGJhZExpbmUgPSBlbGUuZWxlbWVudCgpLl9wcml2YXRlLnJzY3JhdGNoLmJhZExpbmU7XG4gICAgdmFyIF9sYWJlbCA9IGVsZS5wc3R5bGUoJ2xhYmVsJyk7XG4gICAgdmFyIHNyY0xhYmVsID0gZWxlLnBzdHlsZSgnc291cmNlLWxhYmVsJyk7XG4gICAgdmFyIHRndExhYmVsID0gZWxlLnBzdHlsZSgndGFyZ2V0LWxhYmVsJyk7XG4gICAgaWYgKGJhZExpbmUgfHwgKCFfbGFiZWwgfHwgIV9sYWJlbC52YWx1ZSkgJiYgKCFzcmNMYWJlbCB8fCAhc3JjTGFiZWwudmFsdWUpICYmICghdGd0TGFiZWwgfHwgIXRndExhYmVsLnZhbHVlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb250ZXh0LnRleHRBbGlnbiA9ICdjZW50ZXInO1xuICAgIGNvbnRleHQudGV4dEJhc2VsaW5lID0gJ2JvdHRvbSc7XG4gIH1cbiAgdmFyIGFwcGx5Um90YXRpb24gPSAhc2hpZnRUb09yaWdpbldpdGhCYjtcbiAgdmFyIGJiO1xuICBpZiAoc2hpZnRUb09yaWdpbldpdGhCYikge1xuICAgIGJiID0gc2hpZnRUb09yaWdpbldpdGhCYjtcbiAgICBjb250ZXh0LnRyYW5zbGF0ZSgtYmIueDEsIC1iYi55MSk7XG4gIH1cbiAgaWYgKHByZWZpeCA9PSBudWxsKSB7XG4gICAgci5kcmF3VGV4dChjb250ZXh0LCBlbGUsIG51bGwsIGFwcGx5Um90YXRpb24sIHVzZUVsZU9wYWNpdHkpO1xuICAgIGlmIChlbGUuaXNFZGdlKCkpIHtcbiAgICAgIHIuZHJhd1RleHQoY29udGV4dCwgZWxlLCAnc291cmNlJywgYXBwbHlSb3RhdGlvbiwgdXNlRWxlT3BhY2l0eSk7XG4gICAgICByLmRyYXdUZXh0KGNvbnRleHQsIGVsZSwgJ3RhcmdldCcsIGFwcGx5Um90YXRpb24sIHVzZUVsZU9wYWNpdHkpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByLmRyYXdUZXh0KGNvbnRleHQsIGVsZSwgcHJlZml4LCBhcHBseVJvdGF0aW9uLCB1c2VFbGVPcGFjaXR5KTtcbiAgfVxuICBpZiAoc2hpZnRUb09yaWdpbldpdGhCYikge1xuICAgIGNvbnRleHQudHJhbnNsYXRlKGJiLngxLCBiYi55MSk7XG4gIH1cbn07XG5DUnAkNy5nZXRGb250Q2FjaGUgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICB2YXIgY2FjaGU7XG4gIHRoaXMuZm9udENhY2hlcyA9IHRoaXMuZm9udENhY2hlcyB8fCBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmZvbnRDYWNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjYWNoZSA9IHRoaXMuZm9udENhY2hlc1tpXTtcbiAgICBpZiAoY2FjaGUuY29udGV4dCA9PT0gY29udGV4dCkge1xuICAgICAgcmV0dXJuIGNhY2hlO1xuICAgIH1cbiAgfVxuICBjYWNoZSA9IHtcbiAgICBjb250ZXh0OiBjb250ZXh0XG4gIH07XG4gIHRoaXMuZm9udENhY2hlcy5wdXNoKGNhY2hlKTtcbiAgcmV0dXJuIGNhY2hlO1xufTtcblxuLy8gc2V0IHVwIGNhbnZhcyBjb250ZXh0IHdpdGggZm9udFxuLy8gcmV0dXJucyB0cmFuc2Zvcm1lZCB0ZXh0IHN0cmluZ1xuQ1JwJDcuc2V0dXBUZXh0U3R5bGUgPSBmdW5jdGlvbiAoY29udGV4dCwgZWxlKSB7XG4gIHZhciB1c2VFbGVPcGFjaXR5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB0cnVlO1xuICAvLyBGb250IHN0eWxlXG4gIHZhciBsYWJlbFN0eWxlID0gZWxlLnBzdHlsZSgnZm9udC1zdHlsZScpLnN0clZhbHVlO1xuICB2YXIgbGFiZWxTaXplID0gZWxlLnBzdHlsZSgnZm9udC1zaXplJykucGZWYWx1ZSArICdweCc7XG4gIHZhciBsYWJlbEZhbWlseSA9IGVsZS5wc3R5bGUoJ2ZvbnQtZmFtaWx5Jykuc3RyVmFsdWU7XG4gIHZhciBsYWJlbFdlaWdodCA9IGVsZS5wc3R5bGUoJ2ZvbnQtd2VpZ2h0Jykuc3RyVmFsdWU7XG4gIHZhciBvcGFjaXR5ID0gdXNlRWxlT3BhY2l0eSA/IGVsZS5lZmZlY3RpdmVPcGFjaXR5KCkgKiBlbGUucHN0eWxlKCd0ZXh0LW9wYWNpdHknKS52YWx1ZSA6IDE7XG4gIHZhciBvdXRsaW5lT3BhY2l0eSA9IGVsZS5wc3R5bGUoJ3RleHQtb3V0bGluZS1vcGFjaXR5JykudmFsdWUgKiBvcGFjaXR5O1xuICB2YXIgY29sb3IgPSBlbGUucHN0eWxlKCdjb2xvcicpLnZhbHVlO1xuICB2YXIgb3V0bGluZUNvbG9yID0gZWxlLnBzdHlsZSgndGV4dC1vdXRsaW5lLWNvbG9yJykudmFsdWU7XG4gIGNvbnRleHQuZm9udCA9IGxhYmVsU3R5bGUgKyAnICcgKyBsYWJlbFdlaWdodCArICcgJyArIGxhYmVsU2l6ZSArICcgJyArIGxhYmVsRmFtaWx5O1xuICBjb250ZXh0LmxpbmVKb2luID0gJ3JvdW5kJzsgLy8gc28gdGV4dCBvdXRsaW5lcyBhcmVuJ3QgamFnZ2VkXG5cbiAgdGhpcy5jb2xvckZpbGxTdHlsZShjb250ZXh0LCBjb2xvclswXSwgY29sb3JbMV0sIGNvbG9yWzJdLCBvcGFjaXR5KTtcbiAgdGhpcy5jb2xvclN0cm9rZVN0eWxlKGNvbnRleHQsIG91dGxpbmVDb2xvclswXSwgb3V0bGluZUNvbG9yWzFdLCBvdXRsaW5lQ29sb3JbMl0sIG91dGxpbmVPcGFjaXR5KTtcbn07XG5mdW5jdGlvbiBjaXJjbGUoY3R4LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KSB7XG4gIHZhciBkaWFtZXRlciA9IE1hdGgubWluKHdpZHRoLCBoZWlnaHQpO1xuICB2YXIgcmFkaXVzID0gZGlhbWV0ZXIgLyAyO1xuICB2YXIgY2VudGVyWCA9IHggKyB3aWR0aCAvIDI7XG4gIHZhciBjZW50ZXJZID0geSArIGhlaWdodCAvIDI7XG4gIGN0eC5iZWdpblBhdGgoKTtcbiAgY3R4LmFyYyhjZW50ZXJYLCBjZW50ZXJZLCByYWRpdXMsIDAsIE1hdGguUEkgKiAyKTtcbiAgY3R4LmNsb3NlUGF0aCgpO1xufVxuZnVuY3Rpb24gcm91bmRSZWN0KGN0eCwgeCwgeSwgd2lkdGgsIGhlaWdodCkge1xuICB2YXIgcmFkaXVzID0gYXJndW1lbnRzLmxlbmd0aCA+IDUgJiYgYXJndW1lbnRzWzVdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNV0gOiA1O1xuICB2YXIgciA9IE1hdGgubWluKHJhZGl1cywgd2lkdGggLyAyLCBoZWlnaHQgLyAyKTsgLy8gcHJldmVudCBvdmVyZmxvd1xuICBjdHguYmVnaW5QYXRoKCk7XG4gIGN0eC5tb3ZlVG8oeCArIHIsIHkpO1xuICBjdHgubGluZVRvKHggKyB3aWR0aCAtIHIsIHkpO1xuICBjdHgucXVhZHJhdGljQ3VydmVUbyh4ICsgd2lkdGgsIHksIHggKyB3aWR0aCwgeSArIHIpO1xuICBjdHgubGluZVRvKHggKyB3aWR0aCwgeSArIGhlaWdodCAtIHIpO1xuICBjdHgucXVhZHJhdGljQ3VydmVUbyh4ICsgd2lkdGgsIHkgKyBoZWlnaHQsIHggKyB3aWR0aCAtIHIsIHkgKyBoZWlnaHQpO1xuICBjdHgubGluZVRvKHggKyByLCB5ICsgaGVpZ2h0KTtcbiAgY3R4LnF1YWRyYXRpY0N1cnZlVG8oeCwgeSArIGhlaWdodCwgeCwgeSArIGhlaWdodCAtIHIpO1xuICBjdHgubGluZVRvKHgsIHkgKyByKTtcbiAgY3R4LnF1YWRyYXRpY0N1cnZlVG8oeCwgeSwgeCArIHIsIHkpO1xuICBjdHguY2xvc2VQYXRoKCk7XG59XG5DUnAkNy5nZXRUZXh0QW5nbGUgPSBmdW5jdGlvbiAoZWxlLCBwcmVmaXgpIHtcbiAgdmFyIHRoZXRhO1xuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIHZhciByc2NyYXRjaCA9IF9wLnJzY3JhdGNoO1xuICB2YXIgcGRhc2ggPSBwcmVmaXggPyBwcmVmaXggKyAnLScgOiAnJztcbiAgdmFyIHJvdGF0aW9uID0gZWxlLnBzdHlsZShwZGFzaCArICd0ZXh0LXJvdGF0aW9uJyk7XG4gIGlmIChyb3RhdGlvbi5zdHJWYWx1ZSA9PT0gJ2F1dG9yb3RhdGUnKSB7XG4gICAgdmFyIHRleHRBbmdsZSA9IGdldFByZWZpeGVkUHJvcGVydHkocnNjcmF0Y2gsICdsYWJlbEFuZ2xlJywgcHJlZml4KTtcbiAgICB0aGV0YSA9IGVsZS5pc0VkZ2UoKSA/IHRleHRBbmdsZSA6IDA7XG4gIH0gZWxzZSBpZiAocm90YXRpb24uc3RyVmFsdWUgPT09ICdub25lJykge1xuICAgIHRoZXRhID0gMDtcbiAgfSBlbHNlIHtcbiAgICB0aGV0YSA9IHJvdGF0aW9uLnBmVmFsdWU7XG4gIH1cbiAgcmV0dXJuIHRoZXRhO1xufTtcbkNScCQ3LmRyYXdUZXh0ID0gZnVuY3Rpb24gKGNvbnRleHQsIGVsZSwgcHJlZml4KSB7XG4gIHZhciBhcHBseVJvdGF0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiB0cnVlO1xuICB2YXIgdXNlRWxlT3BhY2l0eSA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ICYmIGFyZ3VtZW50c1s0XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzRdIDogdHJ1ZTtcbiAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICB2YXIgcnNjcmF0Y2ggPSBfcC5yc2NyYXRjaDtcbiAgdmFyIHBhcmVudE9wYWNpdHkgPSB1c2VFbGVPcGFjaXR5ID8gZWxlLmVmZmVjdGl2ZU9wYWNpdHkoKSA6IDE7XG4gIGlmICh1c2VFbGVPcGFjaXR5ICYmIChwYXJlbnRPcGFjaXR5ID09PSAwIHx8IGVsZS5wc3R5bGUoJ3RleHQtb3BhY2l0eScpLnZhbHVlID09PSAwKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIHVzZSAnbWFpbicgYXMgYW4gYWxpYXMgZm9yIHRoZSBtYWluIGxhYmVsIChpLmUuIG51bGwgcHJlZml4KVxuICBpZiAocHJlZml4ID09PSAnbWFpbicpIHtcbiAgICBwcmVmaXggPSBudWxsO1xuICB9XG4gIHZhciB0ZXh0WCA9IGdldFByZWZpeGVkUHJvcGVydHkocnNjcmF0Y2gsICdsYWJlbFgnLCBwcmVmaXgpO1xuICB2YXIgdGV4dFkgPSBnZXRQcmVmaXhlZFByb3BlcnR5KHJzY3JhdGNoLCAnbGFiZWxZJywgcHJlZml4KTtcbiAgdmFyIG9yZ1RleHRYLCBvcmdUZXh0WTsgLy8gdXNlZCBmb3Igcm90YXRpb25cbiAgdmFyIHRleHQgPSB0aGlzLmdldExhYmVsVGV4dChlbGUsIHByZWZpeCk7XG4gIGlmICh0ZXh0ICE9IG51bGwgJiYgdGV4dCAhPT0gJycgJiYgIWlzTmFOKHRleHRYKSAmJiAhaXNOYU4odGV4dFkpKSB7XG4gICAgdGhpcy5zZXR1cFRleHRTdHlsZShjb250ZXh0LCBlbGUsIHVzZUVsZU9wYWNpdHkpO1xuICAgIHZhciBwZGFzaCA9IHByZWZpeCA/IHByZWZpeCArICctJyA6ICcnO1xuICAgIHZhciB0ZXh0VyA9IGdldFByZWZpeGVkUHJvcGVydHkocnNjcmF0Y2gsICdsYWJlbFdpZHRoJywgcHJlZml4KTtcbiAgICB2YXIgdGV4dEggPSBnZXRQcmVmaXhlZFByb3BlcnR5KHJzY3JhdGNoLCAnbGFiZWxIZWlnaHQnLCBwcmVmaXgpO1xuICAgIHZhciBsYWJlbEFjdHVhbERlc2NlbnQgPSBnZXRQcmVmaXhlZFByb3BlcnR5KHJzY3JhdGNoLCAnbGFiZWxBY3R1YWxEZXNjZW50JywgcHJlZml4KTtcbiAgICB2YXIgbWFyZ2luWCA9IGVsZS5wc3R5bGUocGRhc2ggKyAndGV4dC1tYXJnaW4teCcpLnBmVmFsdWU7XG4gICAgdmFyIG1hcmdpblkgPSBlbGUucHN0eWxlKHBkYXNoICsgJ3RleHQtbWFyZ2luLXknKS5wZlZhbHVlO1xuICAgIHZhciBpc0VkZ2UgPSBlbGUuaXNFZGdlKCk7XG4gICAgdmFyIGhhbGlnbiA9IGVsZS5wc3R5bGUoJ3RleHQtaGFsaWduJykudmFsdWU7XG4gICAgdmFyIHZhbGlnbiA9IGVsZS5wc3R5bGUoJ3RleHQtdmFsaWduJykudmFsdWU7XG4gICAgaWYgKGlzRWRnZSkge1xuICAgICAgaGFsaWduID0gJ2NlbnRlcic7XG4gICAgICB2YWxpZ24gPSAnY2VudGVyJztcbiAgICB9XG4gICAgdGV4dFggKz0gbWFyZ2luWDtcbiAgICB0ZXh0WSArPSBtYXJnaW5ZO1xuICAgIHZhciB0aGV0YTtcbiAgICBpZiAoIWFwcGx5Um90YXRpb24pIHtcbiAgICAgIHRoZXRhID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhldGEgPSB0aGlzLmdldFRleHRBbmdsZShlbGUsIHByZWZpeCk7XG4gICAgfVxuICAgIGlmICh0aGV0YSAhPT0gMCkge1xuICAgICAgb3JnVGV4dFggPSB0ZXh0WDtcbiAgICAgIG9yZ1RleHRZID0gdGV4dFk7XG4gICAgICBjb250ZXh0LnRyYW5zbGF0ZShvcmdUZXh0WCwgb3JnVGV4dFkpO1xuICAgICAgY29udGV4dC5yb3RhdGUodGhldGEpO1xuICAgICAgdGV4dFggPSAwO1xuICAgICAgdGV4dFkgPSAwO1xuICAgIH1cbiAgICB2YXIgYm94SGFsaWduID0gbGFiZWxIYWxpZ24oaGFsaWduKTtcbiAgICB2YXIgYm94VmFsaWduID0gbGFiZWxWYWxpZ24odmFsaWduKTtcbiAgICBzd2l0Y2ggKGJveFZhbGlnbikge1xuICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdjZW50ZXInOlxuICAgICAgICB0ZXh0WSArPSB0ZXh0SCAvIDI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgdGV4dFkgKz0gdGV4dEg7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB2YXIgYmFja2dyb3VuZE9wYWNpdHkgPSBlbGUucHN0eWxlKCd0ZXh0LWJhY2tncm91bmQtb3BhY2l0eScpLnZhbHVlO1xuICAgIHZhciBib3JkZXJPcGFjaXR5ID0gZWxlLnBzdHlsZSgndGV4dC1ib3JkZXItb3BhY2l0eScpLnZhbHVlO1xuICAgIHZhciB0ZXh0Qm9yZGVyV2lkdGggPSBlbGUucHN0eWxlKCd0ZXh0LWJvcmRlci13aWR0aCcpLnBmVmFsdWU7XG4gICAgdmFyIGJhY2tncm91bmRQYWRkaW5nID0gZWxlLnBzdHlsZSgndGV4dC1iYWNrZ3JvdW5kLXBhZGRpbmcnKS5wZlZhbHVlO1xuICAgIHZhciBzdHlsZVNoYXBlID0gZWxlLnBzdHlsZSgndGV4dC1iYWNrZ3JvdW5kLXNoYXBlJykuc3RyVmFsdWU7XG4gICAgdmFyIHJvdW5kZWQgPSBzdHlsZVNoYXBlID09PSAncm91bmQtcmVjdGFuZ2xlJyB8fCBzdHlsZVNoYXBlID09PSAncm91bmRyZWN0YW5nbGUnO1xuICAgIHZhciBjaXJjbGVkID0gc3R5bGVTaGFwZSA9PT0gJ2NpcmNsZSc7XG4gICAgdmFyIHJvdW5kUmFkaXVzID0gMjtcbiAgICBpZiAoYmFja2dyb3VuZE9wYWNpdHkgPiAwIHx8IHRleHRCb3JkZXJXaWR0aCA+IDAgJiYgYm9yZGVyT3BhY2l0eSA+IDApIHtcbiAgICAgIHZhciB0ZXh0RmlsbCA9IGNvbnRleHQuZmlsbFN0eWxlO1xuICAgICAgdmFyIHRleHRTdHJva2UgPSBjb250ZXh0LnN0cm9rZVN0eWxlO1xuICAgICAgdmFyIHRleHRMaW5lV2lkdGggPSBjb250ZXh0LmxpbmVXaWR0aDtcbiAgICAgIHZhciB0ZXh0QmFja2dyb3VuZENvbG9yID0gZWxlLnBzdHlsZSgndGV4dC1iYWNrZ3JvdW5kLWNvbG9yJykudmFsdWU7XG4gICAgICB2YXIgdGV4dEJvcmRlckNvbG9yID0gZWxlLnBzdHlsZSgndGV4dC1ib3JkZXItY29sb3InKS52YWx1ZTtcbiAgICAgIHZhciB0ZXh0Qm9yZGVyU3R5bGUgPSBlbGUucHN0eWxlKCd0ZXh0LWJvcmRlci1zdHlsZScpLnZhbHVlO1xuICAgICAgdmFyIGRvRmlsbCA9IGJhY2tncm91bmRPcGFjaXR5ID4gMDtcbiAgICAgIHZhciBkb1N0cm9rZSA9IHRleHRCb3JkZXJXaWR0aCA+IDAgJiYgYm9yZGVyT3BhY2l0eSA+IDA7XG4gICAgICB2YXIgYmdYID0gdGV4dFggLSBiYWNrZ3JvdW5kUGFkZGluZztcbiAgICAgIHN3aXRjaCAoYm94SGFsaWduKSB7XG4gICAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICAgIGJnWCAtPSB0ZXh0VztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnY2VudGVyJzpcbiAgICAgICAgICBiZ1ggLT0gdGV4dFcgLyAyO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgdmFyIGJnWSA9IHRleHRZIC0gdGV4dEggLSBiYWNrZ3JvdW5kUGFkZGluZztcbiAgICAgIHZhciBiZ1cgPSB0ZXh0VyArIDIgKiBiYWNrZ3JvdW5kUGFkZGluZztcbiAgICAgIHZhciBiZ0ggPSB0ZXh0SCArIDIgKiBiYWNrZ3JvdW5kUGFkZGluZztcbiAgICAgIGlmIChkb0ZpbGwpIHtcbiAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBcInJnYmEoXCIuY29uY2F0KHRleHRCYWNrZ3JvdW5kQ29sb3JbMF0sIFwiLFwiKS5jb25jYXQodGV4dEJhY2tncm91bmRDb2xvclsxXSwgXCIsXCIpLmNvbmNhdCh0ZXh0QmFja2dyb3VuZENvbG9yWzJdLCBcIixcIikuY29uY2F0KGJhY2tncm91bmRPcGFjaXR5ICogcGFyZW50T3BhY2l0eSwgXCIpXCIpO1xuICAgICAgfVxuICAgICAgaWYgKGRvU3Ryb2tlKSB7XG4gICAgICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBcInJnYmEoXCIuY29uY2F0KHRleHRCb3JkZXJDb2xvclswXSwgXCIsXCIpLmNvbmNhdCh0ZXh0Qm9yZGVyQ29sb3JbMV0sIFwiLFwiKS5jb25jYXQodGV4dEJvcmRlckNvbG9yWzJdLCBcIixcIikuY29uY2F0KGJvcmRlck9wYWNpdHkgKiBwYXJlbnRPcGFjaXR5LCBcIilcIik7XG4gICAgICAgIGNvbnRleHQubGluZVdpZHRoID0gdGV4dEJvcmRlcldpZHRoO1xuICAgICAgICBpZiAoY29udGV4dC5zZXRMaW5lRGFzaCkge1xuICAgICAgICAgIHN3aXRjaCAodGV4dEJvcmRlclN0eWxlKSB7XG4gICAgICAgICAgICBjYXNlICdkb3R0ZWQnOlxuICAgICAgICAgICAgICBjb250ZXh0LnNldExpbmVEYXNoKFsxLCAxXSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZGFzaGVkJzpcbiAgICAgICAgICAgICAgY29udGV4dC5zZXRMaW5lRGFzaChbNCwgMl0pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2RvdWJsZSc6XG4gICAgICAgICAgICAgIGNvbnRleHQubGluZVdpZHRoID0gdGV4dEJvcmRlcldpZHRoIC8gNDtcbiAgICAgICAgICAgICAgY29udGV4dC5zZXRMaW5lRGFzaChbXSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnc29saWQnOlxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgY29udGV4dC5zZXRMaW5lRGFzaChbXSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHJvdW5kZWQpIHtcbiAgICAgICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICAgICAgcm91bmRSZWN0KGNvbnRleHQsIGJnWCwgYmdZLCBiZ1csIGJnSCwgcm91bmRSYWRpdXMpO1xuICAgICAgfSBlbHNlIGlmIChjaXJjbGVkKSB7XG4gICAgICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgICAgIGNpcmNsZShjb250ZXh0LCBiZ1gsIGJnWSwgYmdXLCBiZ0gpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICAgICAgY29udGV4dC5yZWN0KGJnWCwgYmdZLCBiZ1csIGJnSCk7XG4gICAgICB9XG4gICAgICBpZiAoZG9GaWxsKSBjb250ZXh0LmZpbGwoKTtcbiAgICAgIGlmIChkb1N0cm9rZSkgY29udGV4dC5zdHJva2UoKTtcblxuICAgICAgLy8gRG91YmxlIGJvcmRlciBwYXNzIGZvciAnZG91YmxlJyBzdHlsZVxuICAgICAgaWYgKGRvU3Ryb2tlICYmIHRleHRCb3JkZXJTdHlsZSA9PT0gJ2RvdWJsZScpIHtcbiAgICAgICAgdmFyIHdoaXRlV2lkdGggPSB0ZXh0Qm9yZGVyV2lkdGggLyAyO1xuICAgICAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgICAgICBpZiAocm91bmRlZCkge1xuICAgICAgICAgIHJvdW5kUmVjdChjb250ZXh0LCBiZ1ggKyB3aGl0ZVdpZHRoLCBiZ1kgKyB3aGl0ZVdpZHRoLCBiZ1cgLSAyICogd2hpdGVXaWR0aCwgYmdIIC0gMiAqIHdoaXRlV2lkdGgsIHJvdW5kUmFkaXVzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb250ZXh0LnJlY3QoYmdYICsgd2hpdGVXaWR0aCwgYmdZICsgd2hpdGVXaWR0aCwgYmdXIC0gMiAqIHdoaXRlV2lkdGgsIGJnSCAtIDIgKiB3aGl0ZVdpZHRoKTtcbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0LnN0cm9rZSgpO1xuICAgICAgfVxuICAgICAgY29udGV4dC5maWxsU3R5bGUgPSB0ZXh0RmlsbDtcbiAgICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSB0ZXh0U3Ryb2tlO1xuICAgICAgY29udGV4dC5saW5lV2lkdGggPSB0ZXh0TGluZVdpZHRoO1xuICAgICAgaWYgKGNvbnRleHQuc2V0TGluZURhc2gpIGNvbnRleHQuc2V0TGluZURhc2goW10pO1xuICAgIH1cbiAgICB2YXIgbGluZVdpZHRoID0gMiAqIGVsZS5wc3R5bGUoJ3RleHQtb3V0bGluZS13aWR0aCcpLnBmVmFsdWU7IC8vICoyIGIvYyB0aGUgc3Ryb2tlIGlzIGRyYXduIGNlbnRyZWQgb24gdGhlIG1pZGRsZVxuXG4gICAgaWYgKGxpbmVXaWR0aCA+IDApIHtcbiAgICAgIGNvbnRleHQubGluZVdpZHRoID0gbGluZVdpZHRoO1xuICAgIH1cbiAgICB0ZXh0WSAtPSBsYWJlbEFjdHVhbERlc2NlbnQ7XG4gICAgaWYgKGVsZS5wc3R5bGUoJ3RleHQtd3JhcCcpLnZhbHVlID09PSAnd3JhcCcpIHtcbiAgICAgIHZhciBsaW5lcyA9IGdldFByZWZpeGVkUHJvcGVydHkocnNjcmF0Y2gsICdsYWJlbFdyYXBDYWNoZWRMaW5lcycsIHByZWZpeCk7XG4gICAgICB2YXIgbGluZUhlaWdodCA9IGdldFByZWZpeGVkUHJvcGVydHkocnNjcmF0Y2gsICdsYWJlbExpbmVIZWlnaHQnLCBwcmVmaXgpO1xuICAgICAgdmFyIGhhbGZUZXh0VyA9IHRleHRXIC8gMjtcbiAgICAgIHZhciBqdXN0aWZpY2F0aW9uID0gdGhpcy5nZXRMYWJlbEp1c3RpZmljYXRpb24oZWxlKTtcbiAgICAgIGlmIChqdXN0aWZpY2F0aW9uID09PSAnYXV0bycpIDsgZWxzZSBpZiAoYm94SGFsaWduID09PSAnbGVmdCcpIHtcbiAgICAgICAgLy8gYXV0byBqdXN0aWZpY2F0aW9uIDogcmlnaHRcbiAgICAgICAgaWYgKGp1c3RpZmljYXRpb24gPT09ICdsZWZ0Jykge1xuICAgICAgICAgIHRleHRYICs9IC10ZXh0VztcbiAgICAgICAgfSBlbHNlIGlmIChqdXN0aWZpY2F0aW9uID09PSAnY2VudGVyJykge1xuICAgICAgICAgIHRleHRYICs9IC1oYWxmVGV4dFc7XG4gICAgICAgIH0gLy8gZWxzZSBzYW1lIGFzIGF1dG9cbiAgICAgIH0gZWxzZSBpZiAoYm94SGFsaWduID09PSAnY2VudGVyJykge1xuICAgICAgICAvLyBhdXRvIGp1c3RmaWNhdGlvbiA6IGNlbnRlclxuICAgICAgICBpZiAoanVzdGlmaWNhdGlvbiA9PT0gJ2xlZnQnKSB7XG4gICAgICAgICAgdGV4dFggKz0gLWhhbGZUZXh0VztcbiAgICAgICAgfSBlbHNlIGlmIChqdXN0aWZpY2F0aW9uID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgdGV4dFggKz0gaGFsZlRleHRXO1xuICAgICAgICB9IC8vIGVsc2Ugc2FtZSBhcyBhdXRvXG4gICAgICB9IGVsc2UgaWYgKGJveEhhbGlnbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAvLyBhdXRvIGp1c3RpZmljYXRpb24gOiBsZWZ0XG4gICAgICAgIGlmIChqdXN0aWZpY2F0aW9uID09PSAnY2VudGVyJykge1xuICAgICAgICAgIHRleHRYICs9IGhhbGZUZXh0VztcbiAgICAgICAgfSBlbHNlIGlmIChqdXN0aWZpY2F0aW9uID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgdGV4dFggKz0gdGV4dFc7XG4gICAgICAgIH0gLy8gZWxzZSBzYW1lIGFzIGF1dG9cbiAgICAgIH1cbiAgICAgIHN3aXRjaCAoYm94VmFsaWduKSB7XG4gICAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgICAgdGV4dFkgLT0gKGxpbmVzLmxlbmd0aCAtIDEpICogbGluZUhlaWdodDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnY2VudGVyJzpcbiAgICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgICB0ZXh0WSAtPSAobGluZXMubGVuZ3RoIC0gMSkgKiBsaW5lSGVpZ2h0O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIgbCA9IDA7IGwgPCBsaW5lcy5sZW5ndGg7IGwrKykge1xuICAgICAgICBpZiAobGluZVdpZHRoID4gMCkge1xuICAgICAgICAgIGNvbnRleHQuc3Ryb2tlVGV4dChsaW5lc1tsXSwgdGV4dFgsIHRleHRZKTtcbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0LmZpbGxUZXh0KGxpbmVzW2xdLCB0ZXh0WCwgdGV4dFkpO1xuICAgICAgICB0ZXh0WSArPSBsaW5lSGVpZ2h0O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAobGluZVdpZHRoID4gMCkge1xuICAgICAgICBjb250ZXh0LnN0cm9rZVRleHQodGV4dCwgdGV4dFgsIHRleHRZKTtcbiAgICAgIH1cbiAgICAgIGNvbnRleHQuZmlsbFRleHQodGV4dCwgdGV4dFgsIHRleHRZKTtcbiAgICB9XG4gICAgaWYgKHRoZXRhICE9PSAwKSB7XG4gICAgICBjb250ZXh0LnJvdGF0ZSgtdGhldGEpO1xuICAgICAgY29udGV4dC50cmFuc2xhdGUoLW9yZ1RleHRYLCAtb3JnVGV4dFkpO1xuICAgIH1cbiAgfVxufTtcblxuLyogZ2xvYmFsIFBhdGgyRCAqL1xuXG52YXIgQ1JwJDYgPSB7fTtcbkNScCQ2LmRyYXdOb2RlID0gZnVuY3Rpb24gKGNvbnRleHQsIG5vZGUsIHNoaWZ0VG9PcmlnaW5XaXRoQmIpIHtcbiAgdmFyIGRyYXdMYWJlbCA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogdHJ1ZTtcbiAgdmFyIHNob3VsZERyYXdPdmVybGF5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgYXJndW1lbnRzWzRdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNF0gOiB0cnVlO1xuICB2YXIgc2hvdWxkRHJhd09wYWNpdHkgPSBhcmd1bWVudHMubGVuZ3RoID4gNSAmJiBhcmd1bWVudHNbNV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s1XSA6IHRydWU7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIG5vZGVXaWR0aCwgbm9kZUhlaWdodDtcbiAgdmFyIF9wID0gbm9kZS5fcHJpdmF0ZTtcbiAgdmFyIHJzID0gX3AucnNjcmF0Y2g7XG4gIHZhciBwb3MgPSBub2RlLnBvc2l0aW9uKCk7XG4gIGlmICghbnVtYmVyJDEocG9zLngpIHx8ICFudW1iZXIkMShwb3MueSkpIHtcbiAgICByZXR1cm47IC8vIGNhbid0IGRyYXcgbm9kZSB3aXRoIHVuZGVmaW5lZCBwb3NpdGlvblxuICB9XG4gIGlmIChzaG91bGREcmF3T3BhY2l0eSAmJiAhbm9kZS52aXNpYmxlKCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIGVsZU9wYWNpdHkgPSBzaG91bGREcmF3T3BhY2l0eSA/IG5vZGUuZWZmZWN0aXZlT3BhY2l0eSgpIDogMTtcbiAgdmFyIHVzZVBhdGhzID0gci51c2VQYXRocygpO1xuICB2YXIgcGF0aDtcbiAgdmFyIHBhdGhDYWNoZUhpdCA9IGZhbHNlO1xuICB2YXIgcGFkZGluZyA9IG5vZGUucGFkZGluZygpO1xuICBub2RlV2lkdGggPSBub2RlLndpZHRoKCkgKyAyICogcGFkZGluZztcbiAgbm9kZUhlaWdodCA9IG5vZGUuaGVpZ2h0KCkgKyAyICogcGFkZGluZztcblxuICAvL1xuICAvLyBzZXR1cCBzaGlmdFxuXG4gIHZhciBiYjtcbiAgaWYgKHNoaWZ0VG9PcmlnaW5XaXRoQmIpIHtcbiAgICBiYiA9IHNoaWZ0VG9PcmlnaW5XaXRoQmI7XG4gICAgY29udGV4dC50cmFuc2xhdGUoLWJiLngxLCAtYmIueTEpO1xuICB9XG5cbiAgLy9cbiAgLy8gbG9hZCBiZyBpbWFnZVxuXG4gIHZhciBiZ0ltZ1Byb3AgPSBub2RlLnBzdHlsZSgnYmFja2dyb3VuZC1pbWFnZScpO1xuICB2YXIgdXJscyA9IGJnSW1nUHJvcC52YWx1ZTtcbiAgdmFyIHVybERlZmluZWQgPSBuZXcgQXJyYXkodXJscy5sZW5ndGgpO1xuICB2YXIgaW1hZ2UgPSBuZXcgQXJyYXkodXJscy5sZW5ndGgpO1xuICB2YXIgbnVtSW1hZ2VzID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB1cmxzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHVybCA9IHVybHNbaV07XG4gICAgdmFyIGRlZmQgPSB1cmxEZWZpbmVkW2ldID0gdXJsICE9IG51bGwgJiYgdXJsICE9PSAnbm9uZSc7XG4gICAgaWYgKGRlZmQpIHtcbiAgICAgIHZhciBiZ0ltZ0Nyb3NzT3JpZ2luID0gbm9kZS5jeSgpLnN0eWxlKCkuZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLWltYWdlLWNyb3Nzb3JpZ2luJywgJ3ZhbHVlJywgaSk7XG4gICAgICBudW1JbWFnZXMrKztcblxuICAgICAgLy8gZ2V0IGltYWdlLCBhbmQgaWYgbm90IGxvYWRlZCB0aGVuIGFzayB0byByZWRyYXcgd2hlbiBsYXRlciBsb2FkZWRcbiAgICAgIGltYWdlW2ldID0gci5nZXRDYWNoZWRJbWFnZSh1cmwsIGJnSW1nQ3Jvc3NPcmlnaW4sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3AuYmFja2dyb3VuZFRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgICAgIG5vZGUuZW1pdEFuZE5vdGlmeSgnYmFja2dyb3VuZCcpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLy9cbiAgLy8gc2V0dXAgc3R5bGVzXG5cbiAgdmFyIGRhcmtuZXNzID0gbm9kZS5wc3R5bGUoJ2JhY2tncm91bmQtYmxhY2tlbicpLnZhbHVlO1xuICB2YXIgYm9yZGVyV2lkdGggPSBub2RlLnBzdHlsZSgnYm9yZGVyLXdpZHRoJykucGZWYWx1ZTtcbiAgdmFyIGJnT3BhY2l0eSA9IG5vZGUucHN0eWxlKCdiYWNrZ3JvdW5kLW9wYWNpdHknKS52YWx1ZSAqIGVsZU9wYWNpdHk7XG4gIHZhciBib3JkZXJDb2xvciA9IG5vZGUucHN0eWxlKCdib3JkZXItY29sb3InKS52YWx1ZTtcbiAgdmFyIGJvcmRlclN0eWxlID0gbm9kZS5wc3R5bGUoJ2JvcmRlci1zdHlsZScpLnZhbHVlO1xuICB2YXIgYm9yZGVySm9pbiA9IG5vZGUucHN0eWxlKCdib3JkZXItam9pbicpLnZhbHVlO1xuICB2YXIgYm9yZGVyQ2FwID0gbm9kZS5wc3R5bGUoJ2JvcmRlci1jYXAnKS52YWx1ZTtcbiAgdmFyIGJvcmRlclBvc2l0aW9uID0gbm9kZS5wc3R5bGUoJ2JvcmRlci1wb3NpdGlvbicpLnZhbHVlO1xuICB2YXIgYm9yZGVyUGF0dGVybiA9IG5vZGUucHN0eWxlKCdib3JkZXItZGFzaC1wYXR0ZXJuJykucGZWYWx1ZTtcbiAgdmFyIGJvcmRlck9mZnNldCA9IG5vZGUucHN0eWxlKCdib3JkZXItZGFzaC1vZmZzZXQnKS5wZlZhbHVlO1xuICB2YXIgYm9yZGVyT3BhY2l0eSA9IG5vZGUucHN0eWxlKCdib3JkZXItb3BhY2l0eScpLnZhbHVlICogZWxlT3BhY2l0eTtcbiAgdmFyIG91dGxpbmVXaWR0aCA9IG5vZGUucHN0eWxlKCdvdXRsaW5lLXdpZHRoJykucGZWYWx1ZTtcbiAgdmFyIG91dGxpbmVDb2xvciA9IG5vZGUucHN0eWxlKCdvdXRsaW5lLWNvbG9yJykudmFsdWU7XG4gIHZhciBvdXRsaW5lU3R5bGUgPSBub2RlLnBzdHlsZSgnb3V0bGluZS1zdHlsZScpLnZhbHVlO1xuICB2YXIgb3V0bGluZU9wYWNpdHkgPSBub2RlLnBzdHlsZSgnb3V0bGluZS1vcGFjaXR5JykudmFsdWUgKiBlbGVPcGFjaXR5O1xuICB2YXIgb3V0bGluZU9mZnNldCA9IG5vZGUucHN0eWxlKCdvdXRsaW5lLW9mZnNldCcpLnZhbHVlO1xuICB2YXIgY29ybmVyUmFkaXVzID0gbm9kZS5wc3R5bGUoJ2Nvcm5lci1yYWRpdXMnKS52YWx1ZTtcbiAgaWYgKGNvcm5lclJhZGl1cyAhPT0gJ2F1dG8nKSBjb3JuZXJSYWRpdXMgPSBub2RlLnBzdHlsZSgnY29ybmVyLXJhZGl1cycpLnBmVmFsdWU7XG4gIHZhciBzZXR1cFNoYXBlQ29sb3IgPSBmdW5jdGlvbiBzZXR1cFNoYXBlQ29sb3IoKSB7XG4gICAgdmFyIGJnT3B5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBiZ09wYWNpdHk7XG4gICAgci5lbGVGaWxsU3R5bGUoY29udGV4dCwgbm9kZSwgYmdPcHkpO1xuICB9O1xuICB2YXIgc2V0dXBCb3JkZXJDb2xvciA9IGZ1bmN0aW9uIHNldHVwQm9yZGVyQ29sb3IoKSB7XG4gICAgdmFyIGJkck9weSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogYm9yZGVyT3BhY2l0eTtcbiAgICByLmNvbG9yU3Ryb2tlU3R5bGUoY29udGV4dCwgYm9yZGVyQ29sb3JbMF0sIGJvcmRlckNvbG9yWzFdLCBib3JkZXJDb2xvclsyXSwgYmRyT3B5KTtcbiAgfTtcbiAgdmFyIHNldHVwT3V0bGluZUNvbG9yID0gZnVuY3Rpb24gc2V0dXBPdXRsaW5lQ29sb3IoKSB7XG4gICAgdmFyIG90bG5PcHkgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IG91dGxpbmVPcGFjaXR5O1xuICAgIHIuY29sb3JTdHJva2VTdHlsZShjb250ZXh0LCBvdXRsaW5lQ29sb3JbMF0sIG91dGxpbmVDb2xvclsxXSwgb3V0bGluZUNvbG9yWzJdLCBvdGxuT3B5KTtcbiAgfTtcblxuICAvL1xuICAvLyBzZXR1cCBzaGFwZVxuXG4gIHZhciBnZXRQYXRoID0gZnVuY3Rpb24gZ2V0UGF0aCh3aWR0aCwgaGVpZ2h0LCBzaGFwZSwgcG9pbnRzKSB7XG4gICAgdmFyIHBhdGhDYWNoZSA9IHIubm9kZVBhdGhDYWNoZSA9IHIubm9kZVBhdGhDYWNoZSB8fCBbXTtcbiAgICB2YXIga2V5ID0gaGFzaFN0cmluZ3Moc2hhcGUgPT09ICdwb2x5Z29uJyA/IHNoYXBlICsgJywnICsgcG9pbnRzLmpvaW4oJywnKSA6IHNoYXBlLCAnJyArIGhlaWdodCwgJycgKyB3aWR0aCwgJycgKyBjb3JuZXJSYWRpdXMpO1xuICAgIHZhciBjYWNoZWRQYXRoID0gcGF0aENhY2hlW2tleV07XG4gICAgdmFyIHBhdGg7XG4gICAgdmFyIGNhY2hlSGl0ID0gZmFsc2U7XG4gICAgaWYgKGNhY2hlZFBhdGggIT0gbnVsbCkge1xuICAgICAgcGF0aCA9IGNhY2hlZFBhdGg7XG4gICAgICBjYWNoZUhpdCA9IHRydWU7XG4gICAgICBycy5wYXRoQ2FjaGUgPSBwYXRoO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXRoID0gbmV3IFBhdGgyRCgpO1xuICAgICAgcGF0aENhY2hlW2tleV0gPSBycy5wYXRoQ2FjaGUgPSBwYXRoO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcGF0aDogcGF0aCxcbiAgICAgIGNhY2hlSGl0OiBjYWNoZUhpdFxuICAgIH07XG4gIH07XG4gIHZhciBzdHlsZVNoYXBlID0gbm9kZS5wc3R5bGUoJ3NoYXBlJykuc3RyVmFsdWU7XG4gIHZhciBzaGFwZVB0cyA9IG5vZGUucHN0eWxlKCdzaGFwZS1wb2x5Z29uLXBvaW50cycpLnBmVmFsdWU7XG4gIGlmICh1c2VQYXRocykge1xuICAgIGNvbnRleHQudHJhbnNsYXRlKHBvcy54LCBwb3MueSk7XG4gICAgdmFyIHNoYXBlUGF0aCA9IGdldFBhdGgobm9kZVdpZHRoLCBub2RlSGVpZ2h0LCBzdHlsZVNoYXBlLCBzaGFwZVB0cyk7XG4gICAgcGF0aCA9IHNoYXBlUGF0aC5wYXRoO1xuICAgIHBhdGhDYWNoZUhpdCA9IHNoYXBlUGF0aC5jYWNoZUhpdDtcbiAgfVxuICB2YXIgZHJhd1NoYXBlID0gZnVuY3Rpb24gZHJhd1NoYXBlKCkge1xuICAgIGlmICghcGF0aENhY2hlSGl0KSB7XG4gICAgICB2YXIgbnBvcyA9IHBvcztcbiAgICAgIGlmICh1c2VQYXRocykge1xuICAgICAgICBucG9zID0ge1xuICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgeTogMFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgci5ub2RlU2hhcGVzW3IuZ2V0Tm9kZVNoYXBlKG5vZGUpXS5kcmF3KHBhdGggfHwgY29udGV4dCwgbnBvcy54LCBucG9zLnksIG5vZGVXaWR0aCwgbm9kZUhlaWdodCwgY29ybmVyUmFkaXVzLCBycyk7XG4gICAgfVxuICAgIGlmICh1c2VQYXRocykge1xuICAgICAgY29udGV4dC5maWxsKHBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250ZXh0LmZpbGwoKTtcbiAgICB9XG4gIH07XG4gIHZhciBkcmF3SW1hZ2VzID0gZnVuY3Rpb24gZHJhd0ltYWdlcygpIHtcbiAgICB2YXIgbm9kZU9wYWNpdHkgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGVsZU9wYWNpdHk7XG4gICAgdmFyIGluc2lkZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdHJ1ZTtcbiAgICB2YXIgcHJldkJnaW5nID0gX3AuYmFja2dyb3VuZGluZztcbiAgICB2YXIgdG90YWxDb21wbGV0ZWQgPSAwO1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBpbWFnZS5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBiZ0NvbnRhaW5tZW50ID0gbm9kZS5jeSgpLnN0eWxlKCkuZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLWltYWdlLWNvbnRhaW5tZW50JywgJ3ZhbHVlJywgX2kpO1xuICAgICAgaWYgKGluc2lkZSAmJiBiZ0NvbnRhaW5tZW50ID09PSAnb3ZlcicgfHwgIWluc2lkZSAmJiBiZ0NvbnRhaW5tZW50ID09PSAnaW5zaWRlJykge1xuICAgICAgICB0b3RhbENvbXBsZXRlZCsrO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICh1cmxEZWZpbmVkW19pXSAmJiBpbWFnZVtfaV0uY29tcGxldGUgJiYgIWltYWdlW19pXS5lcnJvcikge1xuICAgICAgICB0b3RhbENvbXBsZXRlZCsrO1xuICAgICAgICByLmRyYXdJbnNjcmliZWRJbWFnZShjb250ZXh0LCBpbWFnZVtfaV0sIG5vZGUsIF9pLCBub2RlT3BhY2l0eSk7XG4gICAgICB9XG4gICAgfVxuICAgIF9wLmJhY2tncm91bmRpbmcgPSAhKHRvdGFsQ29tcGxldGVkID09PSBudW1JbWFnZXMpO1xuICAgIGlmIChwcmV2QmdpbmcgIT09IF9wLmJhY2tncm91bmRpbmcpIHtcbiAgICAgIC8vIHVwZGF0ZSBzdHlsZSBiL2MgOmJhY2tncm91bmRpbmcgc3RhdGUgY2hhbmdlZFxuICAgICAgbm9kZS51cGRhdGVTdHlsZShmYWxzZSk7XG4gICAgfVxuICB9O1xuICB2YXIgZHJhd1BpZSA9IGZ1bmN0aW9uIGRyYXdQaWUoKSB7XG4gICAgdmFyIHJlZHJhd1NoYXBlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBmYWxzZTtcbiAgICB2YXIgcGllT3BhY2l0eSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZWxlT3BhY2l0eTtcbiAgICBpZiAoci5oYXNQaWUobm9kZSkpIHtcbiAgICAgIHIuZHJhd1BpZShjb250ZXh0LCBub2RlLCBwaWVPcGFjaXR5KTtcblxuICAgICAgLy8gcmVkcmF3L3Jlc3RvcmUgcGF0aCBpZiBzdGVwcyBhZnRlciBwaWUgbmVlZCBpdFxuICAgICAgaWYgKHJlZHJhd1NoYXBlKSB7XG4gICAgICAgIGlmICghdXNlUGF0aHMpIHtcbiAgICAgICAgICByLm5vZGVTaGFwZXNbci5nZXROb2RlU2hhcGUobm9kZSldLmRyYXcoY29udGV4dCwgcG9zLngsIHBvcy55LCBub2RlV2lkdGgsIG5vZGVIZWlnaHQsIGNvcm5lclJhZGl1cywgcnMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuICB2YXIgZHJhd1N0cmlwZSA9IGZ1bmN0aW9uIGRyYXdTdHJpcGUoKSB7XG4gICAgdmFyIHJlZHJhd1NoYXBlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBmYWxzZTtcbiAgICB2YXIgc3RyaXBlT3BhY2l0eSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZWxlT3BhY2l0eTtcbiAgICBpZiAoci5oYXNTdHJpcGUobm9kZSkpIHtcbiAgICAgIGNvbnRleHQuc2F2ZSgpO1xuICAgICAgaWYgKHVzZVBhdGhzKSB7XG4gICAgICAgIGNvbnRleHQuY2xpcChycy5wYXRoQ2FjaGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgci5ub2RlU2hhcGVzW3IuZ2V0Tm9kZVNoYXBlKG5vZGUpXS5kcmF3KGNvbnRleHQsIHBvcy54LCBwb3MueSwgbm9kZVdpZHRoLCBub2RlSGVpZ2h0LCBjb3JuZXJSYWRpdXMsIHJzKTtcbiAgICAgICAgY29udGV4dC5jbGlwKCk7XG4gICAgICB9XG4gICAgICByLmRyYXdTdHJpcGUoY29udGV4dCwgbm9kZSwgc3RyaXBlT3BhY2l0eSk7XG4gICAgICBjb250ZXh0LnJlc3RvcmUoKTtcblxuICAgICAgLy8gcmVkcmF3L3Jlc3RvcmUgcGF0aCBpZiBzdGVwcyBhZnRlciBzdHJpcGVzIG5lZWQgaXRcbiAgICAgIGlmIChyZWRyYXdTaGFwZSkge1xuICAgICAgICBpZiAoIXVzZVBhdGhzKSB7XG4gICAgICAgICAgci5ub2RlU2hhcGVzW3IuZ2V0Tm9kZVNoYXBlKG5vZGUpXS5kcmF3KGNvbnRleHQsIHBvcy54LCBwb3MueSwgbm9kZVdpZHRoLCBub2RlSGVpZ2h0LCBjb3JuZXJSYWRpdXMsIHJzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgdmFyIGRhcmtlbiA9IGZ1bmN0aW9uIGRhcmtlbigpIHtcbiAgICB2YXIgZGFya2VuT3BhY2l0eSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZWxlT3BhY2l0eTtcbiAgICB2YXIgb3BhY2l0eSA9IChkYXJrbmVzcyA+IDAgPyBkYXJrbmVzcyA6IC1kYXJrbmVzcykgKiBkYXJrZW5PcGFjaXR5O1xuICAgIHZhciBjID0gZGFya25lc3MgPiAwID8gMCA6IDI1NTtcbiAgICBpZiAoZGFya25lc3MgIT09IDApIHtcbiAgICAgIHIuY29sb3JGaWxsU3R5bGUoY29udGV4dCwgYywgYywgYywgb3BhY2l0eSk7XG4gICAgICBpZiAodXNlUGF0aHMpIHtcbiAgICAgICAgY29udGV4dC5maWxsKHBhdGgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGV4dC5maWxsKCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICB2YXIgZHJhd0JvcmRlciA9IGZ1bmN0aW9uIGRyYXdCb3JkZXIoKSB7XG4gICAgaWYgKGJvcmRlcldpZHRoID4gMCkge1xuICAgICAgY29udGV4dC5saW5lV2lkdGggPSBib3JkZXJXaWR0aDtcbiAgICAgIGNvbnRleHQubGluZUNhcCA9IGJvcmRlckNhcDtcbiAgICAgIGNvbnRleHQubGluZUpvaW4gPSBib3JkZXJKb2luO1xuICAgICAgaWYgKGNvbnRleHQuc2V0TGluZURhc2gpIHtcbiAgICAgICAgLy8gZm9yIHZlcnkgb3V0b2ZkYXRlIGJyb3dzZXJzXG4gICAgICAgIHN3aXRjaCAoYm9yZGVyU3R5bGUpIHtcbiAgICAgICAgICBjYXNlICdkb3R0ZWQnOlxuICAgICAgICAgICAgY29udGV4dC5zZXRMaW5lRGFzaChbMSwgMV0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnZGFzaGVkJzpcbiAgICAgICAgICAgIGNvbnRleHQuc2V0TGluZURhc2goYm9yZGVyUGF0dGVybik7XG4gICAgICAgICAgICBjb250ZXh0LmxpbmVEYXNoT2Zmc2V0ID0gYm9yZGVyT2Zmc2V0O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnc29saWQnOlxuICAgICAgICAgIGNhc2UgJ2RvdWJsZSc6XG4gICAgICAgICAgICBjb250ZXh0LnNldExpbmVEYXNoKFtdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoYm9yZGVyUG9zaXRpb24gIT09ICdjZW50ZXInKSB7XG4gICAgICAgIGNvbnRleHQuc2F2ZSgpO1xuICAgICAgICBjb250ZXh0LmxpbmVXaWR0aCAqPSAyO1xuICAgICAgICBpZiAoYm9yZGVyUG9zaXRpb24gPT09ICdpbnNpZGUnKSB7XG4gICAgICAgICAgdXNlUGF0aHMgPyBjb250ZXh0LmNsaXAocGF0aCkgOiBjb250ZXh0LmNsaXAoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgcmVnaW9uID0gbmV3IFBhdGgyRCgpO1xuICAgICAgICAgIHJlZ2lvbi5yZWN0KC1ub2RlV2lkdGggLyAyIC0gYm9yZGVyV2lkdGgsIC1ub2RlSGVpZ2h0IC8gMiAtIGJvcmRlcldpZHRoLCBub2RlV2lkdGggKyAyICogYm9yZGVyV2lkdGgsIG5vZGVIZWlnaHQgKyAyICogYm9yZGVyV2lkdGgpO1xuICAgICAgICAgIHJlZ2lvbi5hZGRQYXRoKHBhdGgpO1xuICAgICAgICAgIGNvbnRleHQuY2xpcChyZWdpb24sICdldmVub2RkJyk7XG4gICAgICAgIH1cbiAgICAgICAgdXNlUGF0aHMgPyBjb250ZXh0LnN0cm9rZShwYXRoKSA6IGNvbnRleHQuc3Ryb2tlKCk7XG4gICAgICAgIGNvbnRleHQucmVzdG9yZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdXNlUGF0aHMgPyBjb250ZXh0LnN0cm9rZShwYXRoKSA6IGNvbnRleHQuc3Ryb2tlKCk7XG4gICAgICB9XG4gICAgICBpZiAoYm9yZGVyU3R5bGUgPT09ICdkb3VibGUnKSB7XG4gICAgICAgIGNvbnRleHQubGluZVdpZHRoID0gYm9yZGVyV2lkdGggLyAzO1xuICAgICAgICB2YXIgZ2NvID0gY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb247XG4gICAgICAgIGNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ2Rlc3RpbmF0aW9uLW91dCc7XG4gICAgICAgIGlmICh1c2VQYXRocykge1xuICAgICAgICAgIGNvbnRleHQuc3Ryb2tlKHBhdGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnRleHQuc3Ryb2tlKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBnY287XG4gICAgICB9XG5cbiAgICAgIC8vIHJlc2V0IGluIGNhc2Ugd2UgY2hhbmdlZCB0aGUgYm9yZGVyIHN0eWxlXG4gICAgICBpZiAoY29udGV4dC5zZXRMaW5lRGFzaCkge1xuICAgICAgICAvLyBmb3IgdmVyeSBvdXRvZmRhdGUgYnJvd3NlcnNcbiAgICAgICAgY29udGV4dC5zZXRMaW5lRGFzaChbXSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICB2YXIgZHJhd091dGxpbmUgPSBmdW5jdGlvbiBkcmF3T3V0bGluZSgpIHtcbiAgICBpZiAob3V0bGluZVdpZHRoID4gMCkge1xuICAgICAgY29udGV4dC5saW5lV2lkdGggPSBvdXRsaW5lV2lkdGg7XG4gICAgICBjb250ZXh0LmxpbmVDYXAgPSAnYnV0dCc7XG4gICAgICBpZiAoY29udGV4dC5zZXRMaW5lRGFzaCkge1xuICAgICAgICAvLyBmb3IgdmVyeSBvdXRvZmRhdGUgYnJvd3NlcnNcbiAgICAgICAgc3dpdGNoIChvdXRsaW5lU3R5bGUpIHtcbiAgICAgICAgICBjYXNlICdkb3R0ZWQnOlxuICAgICAgICAgICAgY29udGV4dC5zZXRMaW5lRGFzaChbMSwgMV0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnZGFzaGVkJzpcbiAgICAgICAgICAgIGNvbnRleHQuc2V0TGluZURhc2goWzQsIDJdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ3NvbGlkJzpcbiAgICAgICAgICBjYXNlICdkb3VibGUnOlxuICAgICAgICAgICAgY29udGV4dC5zZXRMaW5lRGFzaChbXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIG5wb3MgPSBwb3M7XG4gICAgICBpZiAodXNlUGF0aHMpIHtcbiAgICAgICAgbnBvcyA9IHtcbiAgICAgICAgICB4OiAwLFxuICAgICAgICAgIHk6IDBcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHZhciBzaGFwZSA9IHIuZ2V0Tm9kZVNoYXBlKG5vZGUpO1xuICAgICAgdmFyIGJXaWR0aCA9IGJvcmRlcldpZHRoO1xuICAgICAgaWYgKGJvcmRlclBvc2l0aW9uID09PSAnaW5zaWRlJykgYldpZHRoID0gMDtcbiAgICAgIGlmIChib3JkZXJQb3NpdGlvbiA9PT0gJ291dHNpZGUnKSBiV2lkdGggKj0gMjtcbiAgICAgIHZhciBzY2FsZVggPSAobm9kZVdpZHRoICsgYldpZHRoICsgKG91dGxpbmVXaWR0aCArIG91dGxpbmVPZmZzZXQpKSAvIG5vZGVXaWR0aDtcbiAgICAgIHZhciBzY2FsZVkgPSAobm9kZUhlaWdodCArIGJXaWR0aCArIChvdXRsaW5lV2lkdGggKyBvdXRsaW5lT2Zmc2V0KSkgLyBub2RlSGVpZ2h0O1xuICAgICAgdmFyIHNXaWR0aCA9IG5vZGVXaWR0aCAqIHNjYWxlWDtcbiAgICAgIHZhciBzSGVpZ2h0ID0gbm9kZUhlaWdodCAqIHNjYWxlWTtcbiAgICAgIHZhciBwb2ludHMgPSByLm5vZGVTaGFwZXNbc2hhcGVdLnBvaW50cztcbiAgICAgIHZhciBfcGF0aDtcbiAgICAgIGlmICh1c2VQYXRocykge1xuICAgICAgICB2YXIgb3V0bGluZVBhdGggPSBnZXRQYXRoKHNXaWR0aCwgc0hlaWdodCwgc2hhcGUsIHBvaW50cyk7XG4gICAgICAgIF9wYXRoID0gb3V0bGluZVBhdGgucGF0aDtcbiAgICAgIH1cblxuICAgICAgLy8gZHJhdyB0aGUgb3V0bGluZSBwYXRoLCBlaXRoZXIgYnkgdXNpbmcgZXhwYW5kZWQgcG9pbnRzIG9yIGJ5IHNjYWxpbmcgXG4gICAgICAvLyB0aGUgZGltZW5zaW9ucywgZGVwZW5kaW5nIG9uIHNoYXBlXG4gICAgICBpZiAoc2hhcGUgPT09IFwiZWxsaXBzZVwiKSB7XG4gICAgICAgIHIuZHJhd0VsbGlwc2VQYXRoKF9wYXRoIHx8IGNvbnRleHQsIG5wb3MueCwgbnBvcy55LCBzV2lkdGgsIHNIZWlnaHQpO1xuICAgICAgfSBlbHNlIGlmIChbJ3JvdW5kLWRpYW1vbmQnLCAncm91bmQtaGVwdGFnb24nLCAncm91bmQtaGV4YWdvbicsICdyb3VuZC1vY3RhZ29uJywgJ3JvdW5kLXBlbnRhZ29uJywgJ3JvdW5kLXBvbHlnb24nLCAncm91bmQtdHJpYW5nbGUnLCAncm91bmQtdGFnJ10uaW5jbHVkZXMoc2hhcGUpKSB7XG4gICAgICAgIHZhciBzTXVsdCA9IDA7XG4gICAgICAgIHZhciBvZmZzZXRYID0gMDtcbiAgICAgICAgdmFyIG9mZnNldFkgPSAwO1xuICAgICAgICBpZiAoc2hhcGUgPT09ICdyb3VuZC1kaWFtb25kJykge1xuICAgICAgICAgIHNNdWx0ID0gKGJXaWR0aCArIG91dGxpbmVPZmZzZXQgKyBvdXRsaW5lV2lkdGgpICogMS40O1xuICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAncm91bmQtaGVwdGFnb24nKSB7XG4gICAgICAgICAgc011bHQgPSAoYldpZHRoICsgb3V0bGluZU9mZnNldCArIG91dGxpbmVXaWR0aCkgKiAxLjA3NTtcbiAgICAgICAgICBvZmZzZXRZID0gLShiV2lkdGggLyAyICsgb3V0bGluZU9mZnNldCArIG91dGxpbmVXaWR0aCkgLyAzNTtcbiAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gJ3JvdW5kLWhleGFnb24nKSB7XG4gICAgICAgICAgc011bHQgPSAoYldpZHRoICsgb3V0bGluZU9mZnNldCArIG91dGxpbmVXaWR0aCkgKiAxLjEyO1xuICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAncm91bmQtcGVudGFnb24nKSB7XG4gICAgICAgICAgc011bHQgPSAoYldpZHRoICsgb3V0bGluZU9mZnNldCArIG91dGxpbmVXaWR0aCkgKiAxLjEzO1xuICAgICAgICAgIG9mZnNldFkgPSAtKGJXaWR0aCAvIDIgKyBvdXRsaW5lT2Zmc2V0ICsgb3V0bGluZVdpZHRoKSAvIDE1O1xuICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAncm91bmQtdGFnJykge1xuICAgICAgICAgIHNNdWx0ID0gKGJXaWR0aCArIG91dGxpbmVPZmZzZXQgKyBvdXRsaW5lV2lkdGgpICogMS4xMjtcbiAgICAgICAgICBvZmZzZXRYID0gKGJXaWR0aCAvIDIgKyBvdXRsaW5lV2lkdGggKyBvdXRsaW5lT2Zmc2V0KSAqIC4wNztcbiAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gJ3JvdW5kLXRyaWFuZ2xlJykge1xuICAgICAgICAgIHNNdWx0ID0gKGJXaWR0aCArIG91dGxpbmVPZmZzZXQgKyBvdXRsaW5lV2lkdGgpICogKE1hdGguUEkgLyAyKTtcbiAgICAgICAgICBvZmZzZXRZID0gLShiV2lkdGggKyBvdXRsaW5lT2Zmc2V0IC8gMiArIG91dGxpbmVXaWR0aCkgLyBNYXRoLlBJO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzTXVsdCAhPT0gMCkge1xuICAgICAgICAgIHNjYWxlWCA9IChub2RlV2lkdGggKyBzTXVsdCkgLyBub2RlV2lkdGg7XG4gICAgICAgICAgc1dpZHRoID0gbm9kZVdpZHRoICogc2NhbGVYO1xuICAgICAgICAgIGlmICghWydyb3VuZC1oZXhhZ29uJywgJ3JvdW5kLXRhZyddLmluY2x1ZGVzKHNoYXBlKSkge1xuICAgICAgICAgICAgc2NhbGVZID0gKG5vZGVIZWlnaHQgKyBzTXVsdCkgLyBub2RlSGVpZ2h0O1xuICAgICAgICAgICAgc0hlaWdodCA9IG5vZGVIZWlnaHQgKiBzY2FsZVk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvcm5lclJhZGl1cyA9IGNvcm5lclJhZGl1cyA9PT0gJ2F1dG8nID8gZ2V0Um91bmRQb2x5Z29uUmFkaXVzKHNXaWR0aCwgc0hlaWdodCkgOiBjb3JuZXJSYWRpdXM7XG4gICAgICAgIHZhciBoYWxmVyA9IHNXaWR0aCAvIDI7XG4gICAgICAgIHZhciBoYWxmSCA9IHNIZWlnaHQgLyAyO1xuICAgICAgICB2YXIgcmFkaXVzID0gY29ybmVyUmFkaXVzICsgKGJXaWR0aCArIG91dGxpbmVXaWR0aCArIG91dGxpbmVPZmZzZXQpIC8gMjtcbiAgICAgICAgdmFyIHAgPSBuZXcgQXJyYXkocG9pbnRzLmxlbmd0aCAvIDIpO1xuICAgICAgICB2YXIgY29ybmVycyA9IG5ldyBBcnJheShwb2ludHMubGVuZ3RoIC8gMik7XG4gICAgICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IHBvaW50cy5sZW5ndGggLyAyOyBfaTIrKykge1xuICAgICAgICAgIHBbX2kyXSA9IHtcbiAgICAgICAgICAgIHg6IG5wb3MueCArIG9mZnNldFggKyBoYWxmVyAqIHBvaW50c1tfaTIgKiAyXSxcbiAgICAgICAgICAgIHk6IG5wb3MueSArIG9mZnNldFkgKyBoYWxmSCAqIHBvaW50c1tfaTIgKiAyICsgMV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHZhciBfaTMsXG4gICAgICAgICAgcDEsXG4gICAgICAgICAgcDIsXG4gICAgICAgICAgcDMsXG4gICAgICAgICAgbGVuID0gcC5sZW5ndGg7XG4gICAgICAgIHAxID0gcFtsZW4gLSAxXTtcbiAgICAgICAgLy8gZm9yIGVhY2ggcG9pbnRcbiAgICAgICAgZm9yIChfaTMgPSAwOyBfaTMgPCBsZW47IF9pMysrKSB7XG4gICAgICAgICAgcDIgPSBwW19pMyAlIGxlbl07XG4gICAgICAgICAgcDMgPSBwWyhfaTMgKyAxKSAlIGxlbl07XG4gICAgICAgICAgY29ybmVyc1tfaTNdID0gZ2V0Um91bmRDb3JuZXIocDEsIHAyLCBwMywgcmFkaXVzKTtcbiAgICAgICAgICBwMSA9IHAyO1xuICAgICAgICAgIHAyID0gcDM7XG4gICAgICAgIH1cbiAgICAgICAgci5kcmF3Um91bmRQb2x5Z29uUGF0aChfcGF0aCB8fCBjb250ZXh0LCBucG9zLnggKyBvZmZzZXRYLCBucG9zLnkgKyBvZmZzZXRZLCBub2RlV2lkdGggKiBzY2FsZVgsIG5vZGVIZWlnaHQgKiBzY2FsZVksIHBvaW50cywgY29ybmVycyk7XG4gICAgICB9IGVsc2UgaWYgKFsncm91bmRyZWN0YW5nbGUnLCAncm91bmQtcmVjdGFuZ2xlJ10uaW5jbHVkZXMoc2hhcGUpKSB7XG4gICAgICAgIGNvcm5lclJhZGl1cyA9IGNvcm5lclJhZGl1cyA9PT0gJ2F1dG8nID8gZ2V0Um91bmRSZWN0YW5nbGVSYWRpdXMoc1dpZHRoLCBzSGVpZ2h0KSA6IGNvcm5lclJhZGl1cztcbiAgICAgICAgci5kcmF3Um91bmRSZWN0YW5nbGVQYXRoKF9wYXRoIHx8IGNvbnRleHQsIG5wb3MueCwgbnBvcy55LCBzV2lkdGgsIHNIZWlnaHQsIGNvcm5lclJhZGl1cyArIChiV2lkdGggKyBvdXRsaW5lV2lkdGggKyBvdXRsaW5lT2Zmc2V0KSAvIDIpO1xuICAgICAgfSBlbHNlIGlmIChbJ2N1dHJlY3RhbmdsZScsICdjdXQtcmVjdGFuZ2xlJ10uaW5jbHVkZXMoc2hhcGUpKSB7XG4gICAgICAgIGNvcm5lclJhZGl1cyA9IGNvcm5lclJhZGl1cyA9PT0gJ2F1dG8nID8gZ2V0Q3V0UmVjdGFuZ2xlQ29ybmVyTGVuZ3RoKCkgOiBjb3JuZXJSYWRpdXM7XG4gICAgICAgIHIuZHJhd0N1dFJlY3RhbmdsZVBhdGgoX3BhdGggfHwgY29udGV4dCwgbnBvcy54LCBucG9zLnksIHNXaWR0aCwgc0hlaWdodCwgbnVsbCwgY29ybmVyUmFkaXVzICsgKGJXaWR0aCArIG91dGxpbmVXaWR0aCArIG91dGxpbmVPZmZzZXQpIC8gNCk7XG4gICAgICB9IGVsc2UgaWYgKFsnYm90dG9tcm91bmRyZWN0YW5nbGUnLCAnYm90dG9tLXJvdW5kLXJlY3RhbmdsZSddLmluY2x1ZGVzKHNoYXBlKSkge1xuICAgICAgICBjb3JuZXJSYWRpdXMgPSBjb3JuZXJSYWRpdXMgPT09ICdhdXRvJyA/IGdldFJvdW5kUmVjdGFuZ2xlUmFkaXVzKHNXaWR0aCwgc0hlaWdodCkgOiBjb3JuZXJSYWRpdXM7XG4gICAgICAgIHIuZHJhd0JvdHRvbVJvdW5kUmVjdGFuZ2xlUGF0aChfcGF0aCB8fCBjb250ZXh0LCBucG9zLngsIG5wb3MueSwgc1dpZHRoLCBzSGVpZ2h0LCBjb3JuZXJSYWRpdXMgKyAoYldpZHRoICsgb3V0bGluZVdpZHRoICsgb3V0bGluZU9mZnNldCkgLyAyKTtcbiAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09IFwiYmFycmVsXCIpIHtcbiAgICAgICAgci5kcmF3QmFycmVsUGF0aChfcGF0aCB8fCBjb250ZXh0LCBucG9zLngsIG5wb3MueSwgc1dpZHRoLCBzSGVpZ2h0KTtcbiAgICAgIH0gZWxzZSBpZiAoc2hhcGUuc3RhcnRzV2l0aChcInBvbHlnb25cIikgfHwgWydyaG9tYm9pZCcsICdyaWdodC1yaG9tYm9pZCcsICdyb3VuZC10YWcnLCAndGFnJywgJ3ZlZSddLmluY2x1ZGVzKHNoYXBlKSkge1xuICAgICAgICB2YXIgcGFkID0gKGJXaWR0aCArIG91dGxpbmVXaWR0aCArIG91dGxpbmVPZmZzZXQpIC8gbm9kZVdpZHRoO1xuICAgICAgICBwb2ludHMgPSBqb2luTGluZXMoZXhwYW5kUG9seWdvbihwb2ludHMsIHBhZCkpO1xuICAgICAgICByLmRyYXdQb2x5Z29uUGF0aChfcGF0aCB8fCBjb250ZXh0LCBucG9zLngsIG5wb3MueSwgbm9kZVdpZHRoLCBub2RlSGVpZ2h0LCBwb2ludHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIF9wYWQgPSAoYldpZHRoICsgb3V0bGluZVdpZHRoICsgb3V0bGluZU9mZnNldCkgLyBub2RlV2lkdGg7XG4gICAgICAgIHBvaW50cyA9IGpvaW5MaW5lcyhleHBhbmRQb2x5Z29uKHBvaW50cywgLV9wYWQpKTtcbiAgICAgICAgci5kcmF3UG9seWdvblBhdGgoX3BhdGggfHwgY29udGV4dCwgbnBvcy54LCBucG9zLnksIG5vZGVXaWR0aCwgbm9kZUhlaWdodCwgcG9pbnRzKTtcbiAgICAgIH1cbiAgICAgIGlmICh1c2VQYXRocykge1xuICAgICAgICBjb250ZXh0LnN0cm9rZShfcGF0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250ZXh0LnN0cm9rZSgpO1xuICAgICAgfVxuICAgICAgaWYgKG91dGxpbmVTdHlsZSA9PT0gJ2RvdWJsZScpIHtcbiAgICAgICAgY29udGV4dC5saW5lV2lkdGggPSBiV2lkdGggLyAzO1xuICAgICAgICB2YXIgZ2NvID0gY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb247XG4gICAgICAgIGNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ2Rlc3RpbmF0aW9uLW91dCc7XG4gICAgICAgIGlmICh1c2VQYXRocykge1xuICAgICAgICAgIGNvbnRleHQuc3Ryb2tlKF9wYXRoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb250ZXh0LnN0cm9rZSgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gZ2NvO1xuICAgICAgfVxuXG4gICAgICAvLyByZXNldCBpbiBjYXNlIHdlIGNoYW5nZWQgdGhlIGJvcmRlciBzdHlsZVxuICAgICAgaWYgKGNvbnRleHQuc2V0TGluZURhc2gpIHtcbiAgICAgICAgLy8gZm9yIHZlcnkgb3V0b2ZkYXRlIGJyb3dzZXJzXG4gICAgICAgIGNvbnRleHQuc2V0TGluZURhc2goW10pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgdmFyIGRyYXdPdmVybGF5ID0gZnVuY3Rpb24gZHJhd092ZXJsYXkoKSB7XG4gICAgaWYgKHNob3VsZERyYXdPdmVybGF5KSB7XG4gICAgICByLmRyYXdOb2RlT3ZlcmxheShjb250ZXh0LCBub2RlLCBwb3MsIG5vZGVXaWR0aCwgbm9kZUhlaWdodCk7XG4gICAgfVxuICB9O1xuICB2YXIgZHJhd1VuZGVybGF5ID0gZnVuY3Rpb24gZHJhd1VuZGVybGF5KCkge1xuICAgIGlmIChzaG91bGREcmF3T3ZlcmxheSkge1xuICAgICAgci5kcmF3Tm9kZVVuZGVybGF5KGNvbnRleHQsIG5vZGUsIHBvcywgbm9kZVdpZHRoLCBub2RlSGVpZ2h0KTtcbiAgICB9XG4gIH07XG4gIHZhciBkcmF3VGV4dCA9IGZ1bmN0aW9uIGRyYXdUZXh0KCkge1xuICAgIHIuZHJhd0VsZW1lbnRUZXh0KGNvbnRleHQsIG5vZGUsIG51bGwsIGRyYXdMYWJlbCk7XG4gIH07XG4gIHZhciBnaG9zdCA9IG5vZGUucHN0eWxlKCdnaG9zdCcpLnZhbHVlID09PSAneWVzJztcbiAgaWYgKGdob3N0KSB7XG4gICAgdmFyIGd4ID0gbm9kZS5wc3R5bGUoJ2dob3N0LW9mZnNldC14JykucGZWYWx1ZTtcbiAgICB2YXIgZ3kgPSBub2RlLnBzdHlsZSgnZ2hvc3Qtb2Zmc2V0LXknKS5wZlZhbHVlO1xuICAgIHZhciBnaG9zdE9wYWNpdHkgPSBub2RlLnBzdHlsZSgnZ2hvc3Qtb3BhY2l0eScpLnZhbHVlO1xuICAgIHZhciBlZmZHaG9zdE9wYWNpdHkgPSBnaG9zdE9wYWNpdHkgKiBlbGVPcGFjaXR5O1xuICAgIGNvbnRleHQudHJhbnNsYXRlKGd4LCBneSk7XG4gICAgc2V0dXBPdXRsaW5lQ29sb3IoKTtcbiAgICBkcmF3T3V0bGluZSgpO1xuICAgIHNldHVwU2hhcGVDb2xvcihnaG9zdE9wYWNpdHkgKiBiZ09wYWNpdHkpO1xuICAgIGRyYXdTaGFwZSgpO1xuICAgIGRyYXdJbWFnZXMoZWZmR2hvc3RPcGFjaXR5LCB0cnVlKTtcbiAgICBzZXR1cEJvcmRlckNvbG9yKGdob3N0T3BhY2l0eSAqIGJvcmRlck9wYWNpdHkpO1xuICAgIGRyYXdCb3JkZXIoKTtcbiAgICBkcmF3UGllKGRhcmtuZXNzICE9PSAwIHx8IGJvcmRlcldpZHRoICE9PSAwKTtcbiAgICBkcmF3U3RyaXBlKGRhcmtuZXNzICE9PSAwIHx8IGJvcmRlcldpZHRoICE9PSAwKTtcbiAgICBkcmF3SW1hZ2VzKGVmZkdob3N0T3BhY2l0eSwgZmFsc2UpO1xuICAgIGRhcmtlbihlZmZHaG9zdE9wYWNpdHkpO1xuICAgIGNvbnRleHQudHJhbnNsYXRlKC1neCwgLWd5KTtcbiAgfVxuICBpZiAodXNlUGF0aHMpIHtcbiAgICBjb250ZXh0LnRyYW5zbGF0ZSgtcG9zLngsIC1wb3MueSk7XG4gIH1cbiAgZHJhd1VuZGVybGF5KCk7XG4gIGlmICh1c2VQYXRocykge1xuICAgIGNvbnRleHQudHJhbnNsYXRlKHBvcy54LCBwb3MueSk7XG4gIH1cbiAgc2V0dXBPdXRsaW5lQ29sb3IoKTtcbiAgZHJhd091dGxpbmUoKTtcbiAgc2V0dXBTaGFwZUNvbG9yKCk7XG4gIGRyYXdTaGFwZSgpO1xuICBkcmF3SW1hZ2VzKGVsZU9wYWNpdHksIHRydWUpO1xuICBzZXR1cEJvcmRlckNvbG9yKCk7XG4gIGRyYXdCb3JkZXIoKTtcbiAgZHJhd1BpZShkYXJrbmVzcyAhPT0gMCB8fCBib3JkZXJXaWR0aCAhPT0gMCk7XG4gIGRyYXdTdHJpcGUoZGFya25lc3MgIT09IDAgfHwgYm9yZGVyV2lkdGggIT09IDApO1xuICBkcmF3SW1hZ2VzKGVsZU9wYWNpdHksIGZhbHNlKTtcbiAgZGFya2VuKCk7XG4gIGlmICh1c2VQYXRocykge1xuICAgIGNvbnRleHQudHJhbnNsYXRlKC1wb3MueCwgLXBvcy55KTtcbiAgfVxuICBkcmF3VGV4dCgpO1xuICBkcmF3T3ZlcmxheSgpO1xuXG4gIC8vXG4gIC8vIGNsZWFuIHVwIHNoaWZ0XG5cbiAgaWYgKHNoaWZ0VG9PcmlnaW5XaXRoQmIpIHtcbiAgICBjb250ZXh0LnRyYW5zbGF0ZShiYi54MSwgYmIueTEpO1xuICB9XG59O1xudmFyIGRyYXdOb2RlT3ZlcmxheVVuZGVybGF5ID0gZnVuY3Rpb24gZHJhd05vZGVPdmVybGF5VW5kZXJsYXkob3ZlcmxheU9yVW5kZXJsYXkpIHtcbiAgaWYgKCFbJ292ZXJsYXknLCAndW5kZXJsYXknXS5pbmNsdWRlcyhvdmVybGF5T3JVbmRlcmxheSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc3RhdGUnKTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24gKGNvbnRleHQsIG5vZGUsIHBvcywgbm9kZVdpZHRoLCBub2RlSGVpZ2h0KSB7XG4gICAgdmFyIHIgPSB0aGlzO1xuICAgIGlmICghbm9kZS52aXNpYmxlKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHBhZGRpbmcgPSBub2RlLnBzdHlsZShcIlwiLmNvbmNhdChvdmVybGF5T3JVbmRlcmxheSwgXCItcGFkZGluZ1wiKSkucGZWYWx1ZTtcbiAgICB2YXIgb3BhY2l0eSA9IG5vZGUucHN0eWxlKFwiXCIuY29uY2F0KG92ZXJsYXlPclVuZGVybGF5LCBcIi1vcGFjaXR5XCIpKS52YWx1ZTtcbiAgICB2YXIgY29sb3IgPSBub2RlLnBzdHlsZShcIlwiLmNvbmNhdChvdmVybGF5T3JVbmRlcmxheSwgXCItY29sb3JcIikpLnZhbHVlO1xuICAgIHZhciBzaGFwZSA9IG5vZGUucHN0eWxlKFwiXCIuY29uY2F0KG92ZXJsYXlPclVuZGVybGF5LCBcIi1zaGFwZVwiKSkudmFsdWU7XG4gICAgdmFyIHJhZGl1cyA9IG5vZGUucHN0eWxlKFwiXCIuY29uY2F0KG92ZXJsYXlPclVuZGVybGF5LCBcIi1jb3JuZXItcmFkaXVzXCIpKS52YWx1ZTtcbiAgICBpZiAob3BhY2l0eSA+IDApIHtcbiAgICAgIHBvcyA9IHBvcyB8fCBub2RlLnBvc2l0aW9uKCk7XG4gICAgICBpZiAobm9kZVdpZHRoID09IG51bGwgfHwgbm9kZUhlaWdodCA9PSBudWxsKSB7XG4gICAgICAgIHZhciBfcGFkZGluZyA9IG5vZGUucGFkZGluZygpO1xuICAgICAgICBub2RlV2lkdGggPSBub2RlLndpZHRoKCkgKyAyICogX3BhZGRpbmc7XG4gICAgICAgIG5vZGVIZWlnaHQgPSBub2RlLmhlaWdodCgpICsgMiAqIF9wYWRkaW5nO1xuICAgICAgfVxuICAgICAgci5jb2xvckZpbGxTdHlsZShjb250ZXh0LCBjb2xvclswXSwgY29sb3JbMV0sIGNvbG9yWzJdLCBvcGFjaXR5KTtcbiAgICAgIHIubm9kZVNoYXBlc1tzaGFwZV0uZHJhdyhjb250ZXh0LCBwb3MueCwgcG9zLnksIG5vZGVXaWR0aCArIHBhZGRpbmcgKiAyLCBub2RlSGVpZ2h0ICsgcGFkZGluZyAqIDIsIHJhZGl1cyk7XG4gICAgICBjb250ZXh0LmZpbGwoKTtcbiAgICB9XG4gIH07XG59O1xuQ1JwJDYuZHJhd05vZGVPdmVybGF5ID0gZHJhd05vZGVPdmVybGF5VW5kZXJsYXkoJ292ZXJsYXknKTtcbkNScCQ2LmRyYXdOb2RlVW5kZXJsYXkgPSBkcmF3Tm9kZU92ZXJsYXlVbmRlcmxheSgndW5kZXJsYXknKTtcblxuLy8gZG9lcyB0aGUgbm9kZSBoYXZlIGF0IGxlYXN0IG9uZSBwaWUgcGllY2U/XG5DUnAkNi5oYXNQaWUgPSBmdW5jdGlvbiAobm9kZSkge1xuICBub2RlID0gbm9kZVswXTsgLy8gZW5zdXJlIGVsZSByZWZcblxuICByZXR1cm4gbm9kZS5fcHJpdmF0ZS5oYXNQaWU7XG59O1xuQ1JwJDYuaGFzU3RyaXBlID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgbm9kZSA9IG5vZGVbMF07IC8vIGVuc3VyZSBlbGUgcmVmXG5cbiAgcmV0dXJuIG5vZGUuX3ByaXZhdGUuaGFzU3RyaXBlO1xufTtcbkNScCQ2LmRyYXdQaWUgPSBmdW5jdGlvbiAoY29udGV4dCwgbm9kZSwgbm9kZU9wYWNpdHksIHBvcykge1xuICBub2RlID0gbm9kZVswXTsgLy8gZW5zdXJlIGVsZSByZWZcbiAgcG9zID0gcG9zIHx8IG5vZGUucG9zaXRpb24oKTtcbiAgdmFyIGN5U3R5bGUgPSBub2RlLmN5KCkuc3R5bGUoKTtcbiAgdmFyIHBpZVNpemUgPSBub2RlLnBzdHlsZSgncGllLXNpemUnKTtcbiAgdmFyIGhvbGUgPSBub2RlLnBzdHlsZSgncGllLWhvbGUnKTtcbiAgdmFyIG92ZXJhbGxTdGFydEFuZ2xlID0gbm9kZS5wc3R5bGUoJ3BpZS1zdGFydC1hbmdsZScpLnBmVmFsdWU7XG4gIHZhciB4ID0gcG9zLng7XG4gIHZhciB5ID0gcG9zLnk7XG4gIHZhciBub2RlVyA9IG5vZGUud2lkdGgoKTtcbiAgdmFyIG5vZGVIID0gbm9kZS5oZWlnaHQoKTtcbiAgdmFyIHJhZGl1cyA9IE1hdGgubWluKG5vZGVXLCBub2RlSCkgLyAyOyAvLyBtdXN0IGZpdCBpbiBub2RlXG4gIHZhciBob2xlUmFkaXVzO1xuICB2YXIgbGFzdFBlcmNlbnQgPSAwOyAvLyB3aGF0ICUgdG8gY29udGludWUgZHJhd2luZyBwaWUgc2xpY2VzIGZyb20gb24gWzAsIDFdXG4gIHZhciB1c2VQYXRocyA9IHRoaXMudXNlUGF0aHMoKTtcbiAgaWYgKHVzZVBhdGhzKSB7XG4gICAgeCA9IDA7XG4gICAgeSA9IDA7XG4gIH1cbiAgaWYgKHBpZVNpemUudW5pdHMgPT09ICclJykge1xuICAgIHJhZGl1cyA9IHJhZGl1cyAqIHBpZVNpemUucGZWYWx1ZTtcbiAgfSBlbHNlIGlmIChwaWVTaXplLnBmVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgIHJhZGl1cyA9IHBpZVNpemUucGZWYWx1ZSAvIDI7IC8vIGRpYW1ldGVyIGluIHBpeGVscyA9PiByYWRpdXNcbiAgfVxuICBpZiAoaG9sZS51bml0cyA9PT0gJyUnKSB7XG4gICAgaG9sZVJhZGl1cyA9IHJhZGl1cyAqIGhvbGUucGZWYWx1ZTtcbiAgfSBlbHNlIGlmIChob2xlLnBmVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgIGhvbGVSYWRpdXMgPSBob2xlLnBmVmFsdWUgLyAyOyAvLyBkaWFtZXRlciBpbiBwaXhlbHMgPT4gcmFkaXVzXG4gIH1cbiAgaWYgKGhvbGVSYWRpdXMgPj0gcmFkaXVzKSB7XG4gICAgcmV0dXJuOyAvLyB0aGUgcGllIHdvdWxkIGJlIGludmlzaWJsZSBhbnl3YXlcbiAgfVxuICBmb3IgKHZhciBpID0gMTsgaSA8PSBjeVN0eWxlLnBpZUJhY2tncm91bmROOyBpKyspIHtcbiAgICAvLyAxLi5OXG4gICAgdmFyIHNpemUgPSBub2RlLnBzdHlsZSgncGllLScgKyBpICsgJy1iYWNrZ3JvdW5kLXNpemUnKS52YWx1ZTtcbiAgICB2YXIgY29sb3IgPSBub2RlLnBzdHlsZSgncGllLScgKyBpICsgJy1iYWNrZ3JvdW5kLWNvbG9yJykudmFsdWU7XG4gICAgdmFyIG9wYWNpdHkgPSBub2RlLnBzdHlsZSgncGllLScgKyBpICsgJy1iYWNrZ3JvdW5kLW9wYWNpdHknKS52YWx1ZSAqIG5vZGVPcGFjaXR5O1xuICAgIHZhciBwZXJjZW50ID0gc2l6ZSAvIDEwMDsgLy8gbWFwIGludGVnZXIgcmFuZ2UgWzAsIDEwMF0gdG8gWzAsIDFdXG5cbiAgICAvLyBwZXJjZW50IGNhbid0IHB1c2ggYmV5b25kIDFcbiAgICBpZiAocGVyY2VudCArIGxhc3RQZXJjZW50ID4gMSkge1xuICAgICAgcGVyY2VudCA9IDEgLSBsYXN0UGVyY2VudDtcbiAgICB9XG4gICAgdmFyIGFuZ2xlU3RhcnQgPSAxLjUgKiBNYXRoLlBJICsgMiAqIE1hdGguUEkgKiBsYXN0UGVyY2VudDsgLy8gc3RhcnQgYXQgMTIgbydjbG9jayBhbmQgZ28gY2xvY2t3aXNlXG4gICAgYW5nbGVTdGFydCArPSBvdmVyYWxsU3RhcnRBbmdsZTsgLy8gc2hpZnQgYnkgdGhlIG92ZXJhbGwgcGllIHN0YXJ0IGFuZ2xlXG4gICAgdmFyIGFuZ2xlRGVsdGEgPSAyICogTWF0aC5QSSAqIHBlcmNlbnQ7XG4gICAgdmFyIGFuZ2xlRW5kID0gYW5nbGVTdGFydCArIGFuZ2xlRGVsdGE7XG5cbiAgICAvLyBpZ25vcmUgaWZcbiAgICAvLyAtIHplcm8gc2l6ZVxuICAgIC8vIC0gd2UncmUgYWxyZWFkeSBiZXlvbmQgdGhlIGZ1bGwgY2lyY2xlXG4gICAgLy8gLSBhZGRpbmcgdGhlIGN1cnJlbnQgc2xpY2Ugd291bGQgZ28gYmV5b25kIHRoZSBmdWxsIGNpcmNsZVxuICAgIGlmIChzaXplID09PSAwIHx8IGxhc3RQZXJjZW50ID49IDEgfHwgbGFzdFBlcmNlbnQgKyBwZXJjZW50ID4gMSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChob2xlUmFkaXVzID09PSAwKSB7XG4gICAgICAvLyBtYWtlIGEgcGllIHNsaWNlXG4gICAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgICAgY29udGV4dC5tb3ZlVG8oeCwgeSk7XG4gICAgICBjb250ZXh0LmFyYyh4LCB5LCByYWRpdXMsIGFuZ2xlU3RhcnQsIGFuZ2xlRW5kKTtcbiAgICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG1ha2UgYSBwaWUgc2xpY2UgdGhhdCdzIGxpa2UgdGhlIGFib3ZlIGJ1dCB3aXRoIGEgaG9sZSBpbiB0aGUgbWlkZGxlXG4gICAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgICAgY29udGV4dC5hcmMoeCwgeSwgcmFkaXVzLCBhbmdsZVN0YXJ0LCBhbmdsZUVuZCk7XG4gICAgICBjb250ZXh0LmFyYyh4LCB5LCBob2xlUmFkaXVzLCBhbmdsZUVuZCwgYW5nbGVTdGFydCwgdHJ1ZSk7IC8vIHRydWUgZm9yIGFudGljbG9ja3dpc2VcbiAgICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gICAgfVxuICAgIHRoaXMuY29sb3JGaWxsU3R5bGUoY29udGV4dCwgY29sb3JbMF0sIGNvbG9yWzFdLCBjb2xvclsyXSwgb3BhY2l0eSk7XG4gICAgY29udGV4dC5maWxsKCk7XG4gICAgbGFzdFBlcmNlbnQgKz0gcGVyY2VudDtcbiAgfVxufTtcbkNScCQ2LmRyYXdTdHJpcGUgPSBmdW5jdGlvbiAoY29udGV4dCwgbm9kZSwgbm9kZU9wYWNpdHksIHBvcykge1xuICBub2RlID0gbm9kZVswXTsgLy8gZW5zdXJlIGVsZSByZWZcbiAgcG9zID0gcG9zIHx8IG5vZGUucG9zaXRpb24oKTtcbiAgdmFyIGN5U3R5bGUgPSBub2RlLmN5KCkuc3R5bGUoKTtcbiAgdmFyIHggPSBwb3MueDtcbiAgdmFyIHkgPSBwb3MueTtcbiAgdmFyIG5vZGVXID0gbm9kZS53aWR0aCgpO1xuICB2YXIgbm9kZUggPSBub2RlLmhlaWdodCgpO1xuICB2YXIgbGFzdFBlcmNlbnQgPSAwOyAvLyB3aGF0ICUgdG8gY29udGludWUgZHJhd2luZyBwaWUgc2xpY2VzIGZyb20gb24gWzAsIDFdXG4gIHZhciB1c2VQYXRocyA9IHRoaXMudXNlUGF0aHMoKTtcbiAgY29udGV4dC5zYXZlKCk7XG4gIHZhciBkaXJlY3Rpb24gPSBub2RlLnBzdHlsZSgnc3RyaXBlLWRpcmVjdGlvbicpLnZhbHVlO1xuICB2YXIgc3RyaXBlU2l6ZSA9IG5vZGUucHN0eWxlKCdzdHJpcGUtc2l6ZScpO1xuICBzd2l0Y2ggKGRpcmVjdGlvbikge1xuICAgIGNhc2UgJ3ZlcnRpY2FsJzpcbiAgICAgIGJyZWFrO1xuICAgIC8vIGRlZmF1bHRcbiAgICBjYXNlICdyaWdod2FyZCc6XG4gICAgICBjb250ZXh0LnJvdGF0ZSgtTWF0aC5QSSAvIDIpO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgdmFyIHN0cmlwZVcgPSBub2RlVztcbiAgdmFyIHN0cmlwZUggPSBub2RlSDtcbiAgaWYgKHN0cmlwZVNpemUudW5pdHMgPT09ICclJykge1xuICAgIHN0cmlwZVcgPSBzdHJpcGVXICogc3RyaXBlU2l6ZS5wZlZhbHVlO1xuICAgIHN0cmlwZUggPSBzdHJpcGVIICogc3RyaXBlU2l6ZS5wZlZhbHVlO1xuICB9IGVsc2UgaWYgKHN0cmlwZVNpemUucGZWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgc3RyaXBlVyA9IHN0cmlwZVNpemUucGZWYWx1ZTtcbiAgICBzdHJpcGVIID0gc3RyaXBlU2l6ZS5wZlZhbHVlO1xuICB9XG4gIGlmICh1c2VQYXRocykge1xuICAgIHggPSAwO1xuICAgIHkgPSAwO1xuICB9XG5cbiAgLy8gc2hpZnQgdXAgZnJvbSB0aGUgY2VudHJlIG9mIHRoZSBub2RlIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXJcbiAgeSAtPSBzdHJpcGVXIC8gMjtcbiAgeCAtPSBzdHJpcGVIIC8gMjtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPD0gY3lTdHlsZS5zdHJpcGVCYWNrZ3JvdW5kTjsgaSsrKSB7XG4gICAgLy8gMS4uTlxuICAgIHZhciBzaXplID0gbm9kZS5wc3R5bGUoJ3N0cmlwZS0nICsgaSArICctYmFja2dyb3VuZC1zaXplJykudmFsdWU7XG4gICAgdmFyIGNvbG9yID0gbm9kZS5wc3R5bGUoJ3N0cmlwZS0nICsgaSArICctYmFja2dyb3VuZC1jb2xvcicpLnZhbHVlO1xuICAgIHZhciBvcGFjaXR5ID0gbm9kZS5wc3R5bGUoJ3N0cmlwZS0nICsgaSArICctYmFja2dyb3VuZC1vcGFjaXR5JykudmFsdWUgKiBub2RlT3BhY2l0eTtcbiAgICB2YXIgcGVyY2VudCA9IHNpemUgLyAxMDA7IC8vIG1hcCBpbnRlZ2VyIHJhbmdlIFswLCAxMDBdIHRvIFswLCAxXVxuXG4gICAgLy8gcGVyY2VudCBjYW4ndCBwdXNoIGJleW9uZCAxXG4gICAgaWYgKHBlcmNlbnQgKyBsYXN0UGVyY2VudCA+IDEpIHtcbiAgICAgIHBlcmNlbnQgPSAxIC0gbGFzdFBlcmNlbnQ7XG4gICAgfVxuXG4gICAgLy8gaWdub3JlIGlmXG4gICAgLy8gLSB6ZXJvIHNpemVcbiAgICAvLyAtIHdlJ3JlIGFscmVhZHkgYmV5b25kIHRoZSBmdWxsIGNoYXJ0XG4gICAgLy8gLSBhZGRpbmcgdGhlIGN1cnJlbnQgc2xpY2Ugd291bGQgZ28gYmV5b25kIHRoZSBmdWxsIGNoYXJ0XG4gICAgaWYgKHNpemUgPT09IDAgfHwgbGFzdFBlcmNlbnQgPj0gMSB8fCBsYXN0UGVyY2VudCArIHBlcmNlbnQgPiAxKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBkcmF3IHJlY3QgZm9yIHRoZSBjdXJyZW50IHN0cmlwZVxuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgY29udGV4dC5yZWN0KHgsIHkgKyBzdHJpcGVIICogbGFzdFBlcmNlbnQsIHN0cmlwZVcsIHN0cmlwZUggKiBwZXJjZW50KTtcbiAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgIHRoaXMuY29sb3JGaWxsU3R5bGUoY29udGV4dCwgY29sb3JbMF0sIGNvbG9yWzFdLCBjb2xvclsyXSwgb3BhY2l0eSk7XG4gICAgY29udGV4dC5maWxsKCk7XG4gICAgbGFzdFBlcmNlbnQgKz0gcGVyY2VudDtcbiAgfVxuICBjb250ZXh0LnJlc3RvcmUoKTtcbn07XG5cbnZhciBDUnAkNSA9IHt9O1xudmFyIG1vdGlvbkJsdXJEZWxheSA9IDEwMDtcblxuLy8gdmFyIGlzRmlyZWZveCA9IHR5cGVvZiBJbnN0YWxsVHJpZ2dlciAhPT0gJ3VuZGVmaW5lZCc7XG5cbkNScCQ1LmdldFBpeGVsUmF0aW8gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBjb250ZXh0ID0gdGhpcy5kYXRhLmNvbnRleHRzWzBdO1xuICBpZiAodGhpcy5mb3JjZWRQaXhlbFJhdGlvICE9IG51bGwpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JjZWRQaXhlbFJhdGlvO1xuICB9XG4gIHZhciBjb250YWluZXJXaW5kb3cgPSB0aGlzLmN5LndpbmRvdygpO1xuICB2YXIgYmFja2luZ1N0b3JlID0gY29udGV4dC5iYWNraW5nU3RvcmVQaXhlbFJhdGlvIHx8IGNvbnRleHQud2Via2l0QmFja2luZ1N0b3JlUGl4ZWxSYXRpbyB8fCBjb250ZXh0Lm1vekJhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHwgY29udGV4dC5tc0JhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHwgY29udGV4dC5vQmFja2luZ1N0b3JlUGl4ZWxSYXRpbyB8fCBjb250ZXh0LmJhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHwgMTtcbiAgcmV0dXJuIChjb250YWluZXJXaW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxKSAvIGJhY2tpbmdTdG9yZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxufTtcbkNScCQ1LnBhaW50Q2FjaGUgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICB2YXIgY2FjaGVzID0gdGhpcy5wYWludENhY2hlcyA9IHRoaXMucGFpbnRDYWNoZXMgfHwgW107XG4gIHZhciBuZWVkVG9DcmVhdGVDYWNoZSA9IHRydWU7XG4gIHZhciBjYWNoZTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYWNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjYWNoZSA9IGNhY2hlc1tpXTtcbiAgICBpZiAoY2FjaGUuY29udGV4dCA9PT0gY29udGV4dCkge1xuICAgICAgbmVlZFRvQ3JlYXRlQ2FjaGUgPSBmYWxzZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBpZiAobmVlZFRvQ3JlYXRlQ2FjaGUpIHtcbiAgICBjYWNoZSA9IHtcbiAgICAgIGNvbnRleHQ6IGNvbnRleHRcbiAgICB9O1xuICAgIGNhY2hlcy5wdXNoKGNhY2hlKTtcbiAgfVxuICByZXR1cm4gY2FjaGU7XG59O1xuQ1JwJDUuY3JlYXRlR3JhZGllbnRTdHlsZUZvciA9IGZ1bmN0aW9uIChjb250ZXh0LCBzaGFwZVN0eWxlTmFtZSwgZWxlLCBmaWxsLCBvcGFjaXR5KSB7XG4gIHZhciBncmFkaWVudFN0eWxlO1xuICB2YXIgdXNlUGF0aHMgPSB0aGlzLnVzZVBhdGhzKCk7XG4gIHZhciBjb2xvcnMgPSBlbGUucHN0eWxlKHNoYXBlU3R5bGVOYW1lICsgJy1ncmFkaWVudC1zdG9wLWNvbG9ycycpLnZhbHVlLFxuICAgIHBvc2l0aW9ucyA9IGVsZS5wc3R5bGUoc2hhcGVTdHlsZU5hbWUgKyAnLWdyYWRpZW50LXN0b3AtcG9zaXRpb25zJykucGZWYWx1ZTtcbiAgaWYgKGZpbGwgPT09ICdyYWRpYWwtZ3JhZGllbnQnKSB7XG4gICAgaWYgKGVsZS5pc0VkZ2UoKSkge1xuICAgICAgdmFyIHN0YXJ0ID0gZWxlLnNvdXJjZUVuZHBvaW50KCksXG4gICAgICAgIGVuZCA9IGVsZS50YXJnZXRFbmRwb2ludCgpLFxuICAgICAgICBtaWQgPSBlbGUubWlkcG9pbnQoKTtcbiAgICAgIHZhciBkMSA9IGRpc3Qoc3RhcnQsIG1pZCk7XG4gICAgICB2YXIgZDIgPSBkaXN0KGVuZCwgbWlkKTtcbiAgICAgIGdyYWRpZW50U3R5bGUgPSBjb250ZXh0LmNyZWF0ZVJhZGlhbEdyYWRpZW50KG1pZC54LCBtaWQueSwgMCwgbWlkLngsIG1pZC55LCBNYXRoLm1heChkMSwgZDIpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHBvcyA9IHVzZVBhdGhzID8ge1xuICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgeTogMFxuICAgICAgICB9IDogZWxlLnBvc2l0aW9uKCksXG4gICAgICAgIHdpZHRoID0gZWxlLnBhZGRlZFdpZHRoKCksXG4gICAgICAgIGhlaWdodCA9IGVsZS5wYWRkZWRIZWlnaHQoKTtcbiAgICAgIGdyYWRpZW50U3R5bGUgPSBjb250ZXh0LmNyZWF0ZVJhZGlhbEdyYWRpZW50KHBvcy54LCBwb3MueSwgMCwgcG9zLngsIHBvcy55LCBNYXRoLm1heCh3aWR0aCwgaGVpZ2h0KSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChlbGUuaXNFZGdlKCkpIHtcbiAgICAgIHZhciBfc3RhcnQgPSBlbGUuc291cmNlRW5kcG9pbnQoKSxcbiAgICAgICAgX2VuZCA9IGVsZS50YXJnZXRFbmRwb2ludCgpO1xuICAgICAgZ3JhZGllbnRTdHlsZSA9IGNvbnRleHQuY3JlYXRlTGluZWFyR3JhZGllbnQoX3N0YXJ0LngsIF9zdGFydC55LCBfZW5kLngsIF9lbmQueSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBfcG9zID0gdXNlUGF0aHMgPyB7XG4gICAgICAgICAgeDogMCxcbiAgICAgICAgICB5OiAwXG4gICAgICAgIH0gOiBlbGUucG9zaXRpb24oKSxcbiAgICAgICAgX3dpZHRoID0gZWxlLnBhZGRlZFdpZHRoKCksXG4gICAgICAgIF9oZWlnaHQgPSBlbGUucGFkZGVkSGVpZ2h0KCksXG4gICAgICAgIGhhbGZXaWR0aCA9IF93aWR0aCAvIDIsXG4gICAgICAgIGhhbGZIZWlnaHQgPSBfaGVpZ2h0IC8gMjtcbiAgICAgIHZhciBkaXJlY3Rpb24gPSBlbGUucHN0eWxlKCdiYWNrZ3JvdW5kLWdyYWRpZW50LWRpcmVjdGlvbicpLnZhbHVlO1xuICAgICAgc3dpdGNoIChkaXJlY3Rpb24pIHtcbiAgICAgICAgY2FzZSAndG8tYm90dG9tJzpcbiAgICAgICAgICBncmFkaWVudFN0eWxlID0gY29udGV4dC5jcmVhdGVMaW5lYXJHcmFkaWVudChfcG9zLngsIF9wb3MueSAtIGhhbGZIZWlnaHQsIF9wb3MueCwgX3Bvcy55ICsgaGFsZkhlaWdodCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3RvLXRvcCc6XG4gICAgICAgICAgZ3JhZGllbnRTdHlsZSA9IGNvbnRleHQuY3JlYXRlTGluZWFyR3JhZGllbnQoX3Bvcy54LCBfcG9zLnkgKyBoYWxmSGVpZ2h0LCBfcG9zLngsIF9wb3MueSAtIGhhbGZIZWlnaHQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd0by1sZWZ0JzpcbiAgICAgICAgICBncmFkaWVudFN0eWxlID0gY29udGV4dC5jcmVhdGVMaW5lYXJHcmFkaWVudChfcG9zLnggKyBoYWxmV2lkdGgsIF9wb3MueSwgX3Bvcy54IC0gaGFsZldpZHRoLCBfcG9zLnkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd0by1yaWdodCc6XG4gICAgICAgICAgZ3JhZGllbnRTdHlsZSA9IGNvbnRleHQuY3JlYXRlTGluZWFyR3JhZGllbnQoX3Bvcy54IC0gaGFsZldpZHRoLCBfcG9zLnksIF9wb3MueCArIGhhbGZXaWR0aCwgX3Bvcy55KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndG8tYm90dG9tLXJpZ2h0JzpcbiAgICAgICAgY2FzZSAndG8tcmlnaHQtYm90dG9tJzpcbiAgICAgICAgICBncmFkaWVudFN0eWxlID0gY29udGV4dC5jcmVhdGVMaW5lYXJHcmFkaWVudChfcG9zLnggLSBoYWxmV2lkdGgsIF9wb3MueSAtIGhhbGZIZWlnaHQsIF9wb3MueCArIGhhbGZXaWR0aCwgX3Bvcy55ICsgaGFsZkhlaWdodCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3RvLXRvcC1yaWdodCc6XG4gICAgICAgIGNhc2UgJ3RvLXJpZ2h0LXRvcCc6XG4gICAgICAgICAgZ3JhZGllbnRTdHlsZSA9IGNvbnRleHQuY3JlYXRlTGluZWFyR3JhZGllbnQoX3Bvcy54IC0gaGFsZldpZHRoLCBfcG9zLnkgKyBoYWxmSGVpZ2h0LCBfcG9zLnggKyBoYWxmV2lkdGgsIF9wb3MueSAtIGhhbGZIZWlnaHQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd0by1ib3R0b20tbGVmdCc6XG4gICAgICAgIGNhc2UgJ3RvLWxlZnQtYm90dG9tJzpcbiAgICAgICAgICBncmFkaWVudFN0eWxlID0gY29udGV4dC5jcmVhdGVMaW5lYXJHcmFkaWVudChfcG9zLnggKyBoYWxmV2lkdGgsIF9wb3MueSAtIGhhbGZIZWlnaHQsIF9wb3MueCAtIGhhbGZXaWR0aCwgX3Bvcy55ICsgaGFsZkhlaWdodCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3RvLXRvcC1sZWZ0JzpcbiAgICAgICAgY2FzZSAndG8tbGVmdC10b3AnOlxuICAgICAgICAgIGdyYWRpZW50U3R5bGUgPSBjb250ZXh0LmNyZWF0ZUxpbmVhckdyYWRpZW50KF9wb3MueCArIGhhbGZXaWR0aCwgX3Bvcy55ICsgaGFsZkhlaWdodCwgX3Bvcy54IC0gaGFsZldpZHRoLCBfcG9zLnkgLSBoYWxmSGVpZ2h0KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKCFncmFkaWVudFN0eWxlKSByZXR1cm4gbnVsbDsgLy8gaW52YWxpZCBncmFkaWVudCBzdHlsZVxuXG4gIHZhciBoYXNQb3NpdGlvbnMgPSBwb3NpdGlvbnMubGVuZ3RoID09PSBjb2xvcnMubGVuZ3RoO1xuICB2YXIgbGVuZ3RoID0gY29sb3JzLmxlbmd0aDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIGdyYWRpZW50U3R5bGUuYWRkQ29sb3JTdG9wKGhhc1Bvc2l0aW9ucyA/IHBvc2l0aW9uc1tpXSA6IGkgLyAobGVuZ3RoIC0gMSksICdyZ2JhKCcgKyBjb2xvcnNbaV1bMF0gKyAnLCcgKyBjb2xvcnNbaV1bMV0gKyAnLCcgKyBjb2xvcnNbaV1bMl0gKyAnLCcgKyBvcGFjaXR5ICsgJyknKTtcbiAgfVxuICByZXR1cm4gZ3JhZGllbnRTdHlsZTtcbn07XG5DUnAkNS5ncmFkaWVudEZpbGxTdHlsZSA9IGZ1bmN0aW9uIChjb250ZXh0LCBlbGUsIGZpbGwsIG9wYWNpdHkpIHtcbiAgdmFyIGdyYWRpZW50U3R5bGUgPSB0aGlzLmNyZWF0ZUdyYWRpZW50U3R5bGVGb3IoY29udGV4dCwgJ2JhY2tncm91bmQnLCBlbGUsIGZpbGwsIG9wYWNpdHkpO1xuICBpZiAoIWdyYWRpZW50U3R5bGUpIHJldHVybiBudWxsOyAvLyBlcnJvclxuICBjb250ZXh0LmZpbGxTdHlsZSA9IGdyYWRpZW50U3R5bGU7XG59O1xuQ1JwJDUuY29sb3JGaWxsU3R5bGUgPSBmdW5jdGlvbiAoY29udGV4dCwgciwgZywgYiwgYSkge1xuICBjb250ZXh0LmZpbGxTdHlsZSA9ICdyZ2JhKCcgKyByICsgJywnICsgZyArICcsJyArIGIgKyAnLCcgKyBhICsgJyknO1xuICAvLyB0dXJuIG9mZiBmb3Igbm93LCBzZWVtcyBjb250ZXh0IGRvZXMgaXRzIG93biBjYWNoaW5nXG5cbiAgLy8gdmFyIGNhY2hlID0gdGhpcy5wYWludENhY2hlKGNvbnRleHQpO1xuXG4gIC8vIHZhciBmaWxsU3R5bGUgPSAncmdiYSgnICsgciArICcsJyArIGcgKyAnLCcgKyBiICsgJywnICsgYSArICcpJztcblxuICAvLyBpZiggY2FjaGUuZmlsbFN0eWxlICE9PSBmaWxsU3R5bGUgKXtcbiAgLy8gICBjb250ZXh0LmZpbGxTdHlsZSA9IGNhY2hlLmZpbGxTdHlsZSA9IGZpbGxTdHlsZTtcbiAgLy8gfVxufTtcbkNScCQ1LmVsZUZpbGxTdHlsZSA9IGZ1bmN0aW9uIChjb250ZXh0LCBlbGUsIG9wYWNpdHkpIHtcbiAgdmFyIGJhY2tncm91bmRGaWxsID0gZWxlLnBzdHlsZSgnYmFja2dyb3VuZC1maWxsJykudmFsdWU7XG4gIGlmIChiYWNrZ3JvdW5kRmlsbCA9PT0gJ2xpbmVhci1ncmFkaWVudCcgfHwgYmFja2dyb3VuZEZpbGwgPT09ICdyYWRpYWwtZ3JhZGllbnQnKSB7XG4gICAgdGhpcy5ncmFkaWVudEZpbGxTdHlsZShjb250ZXh0LCBlbGUsIGJhY2tncm91bmRGaWxsLCBvcGFjaXR5KTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgYmFja2dyb3VuZENvbG9yID0gZWxlLnBzdHlsZSgnYmFja2dyb3VuZC1jb2xvcicpLnZhbHVlO1xuICAgIHRoaXMuY29sb3JGaWxsU3R5bGUoY29udGV4dCwgYmFja2dyb3VuZENvbG9yWzBdLCBiYWNrZ3JvdW5kQ29sb3JbMV0sIGJhY2tncm91bmRDb2xvclsyXSwgb3BhY2l0eSk7XG4gIH1cbn07XG5DUnAkNS5ncmFkaWVudFN0cm9rZVN0eWxlID0gZnVuY3Rpb24gKGNvbnRleHQsIGVsZSwgZmlsbCwgb3BhY2l0eSkge1xuICB2YXIgZ3JhZGllbnRTdHlsZSA9IHRoaXMuY3JlYXRlR3JhZGllbnRTdHlsZUZvcihjb250ZXh0LCAnbGluZScsIGVsZSwgZmlsbCwgb3BhY2l0eSk7XG4gIGlmICghZ3JhZGllbnRTdHlsZSkgcmV0dXJuIG51bGw7IC8vIGVycm9yXG4gIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBncmFkaWVudFN0eWxlO1xufTtcbkNScCQ1LmNvbG9yU3Ryb2tlU3R5bGUgPSBmdW5jdGlvbiAoY29udGV4dCwgciwgZywgYiwgYSkge1xuICBjb250ZXh0LnN0cm9rZVN0eWxlID0gJ3JnYmEoJyArIHIgKyAnLCcgKyBnICsgJywnICsgYiArICcsJyArIGEgKyAnKSc7XG4gIC8vIHR1cm4gb2ZmIGZvciBub3csIHNlZW1zIGNvbnRleHQgZG9lcyBpdHMgb3duIGNhY2hpbmdcblxuICAvLyB2YXIgY2FjaGUgPSB0aGlzLnBhaW50Q2FjaGUoY29udGV4dCk7XG5cbiAgLy8gdmFyIHN0cm9rZVN0eWxlID0gJ3JnYmEoJyArIHIgKyAnLCcgKyBnICsgJywnICsgYiArICcsJyArIGEgKyAnKSc7XG5cbiAgLy8gaWYoIGNhY2hlLnN0cm9rZVN0eWxlICE9PSBzdHJva2VTdHlsZSApe1xuICAvLyAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBjYWNoZS5zdHJva2VTdHlsZSA9IHN0cm9rZVN0eWxlO1xuICAvLyB9XG59O1xuQ1JwJDUuZWxlU3Ryb2tlU3R5bGUgPSBmdW5jdGlvbiAoY29udGV4dCwgZWxlLCBvcGFjaXR5KSB7XG4gIHZhciBsaW5lRmlsbCA9IGVsZS5wc3R5bGUoJ2xpbmUtZmlsbCcpLnZhbHVlO1xuICBpZiAobGluZUZpbGwgPT09ICdsaW5lYXItZ3JhZGllbnQnIHx8IGxpbmVGaWxsID09PSAncmFkaWFsLWdyYWRpZW50Jykge1xuICAgIHRoaXMuZ3JhZGllbnRTdHJva2VTdHlsZShjb250ZXh0LCBlbGUsIGxpbmVGaWxsLCBvcGFjaXR5KTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbGluZUNvbG9yID0gZWxlLnBzdHlsZSgnbGluZS1jb2xvcicpLnZhbHVlO1xuICAgIHRoaXMuY29sb3JTdHJva2VTdHlsZShjb250ZXh0LCBsaW5lQ29sb3JbMF0sIGxpbmVDb2xvclsxXSwgbGluZUNvbG9yWzJdLCBvcGFjaXR5KTtcbiAgfVxufTtcblxuLy8gUmVzaXplIGNhbnZhc1xuQ1JwJDUubWF0Y2hDYW52YXNTaXplID0gZnVuY3Rpb24gKGNvbnRhaW5lcikge1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBkYXRhID0gci5kYXRhO1xuICB2YXIgYmIgPSByLmZpbmRDb250YWluZXJDbGllbnRDb29yZHMoKTtcbiAgdmFyIHdpZHRoID0gYmJbMl07XG4gIHZhciBoZWlnaHQgPSBiYlszXTtcbiAgdmFyIHBpeGVsUmF0aW8gPSByLmdldFBpeGVsUmF0aW8oKTtcbiAgdmFyIG1iUHhSYXRpbyA9IHIubW90aW9uQmx1clB4UmF0aW87XG4gIGlmIChjb250YWluZXIgPT09IHIuZGF0YS5idWZmZXJDYW52YXNlc1tyLk1PVElPTkJMVVJfQlVGRkVSX05PREVdIHx8IGNvbnRhaW5lciA9PT0gci5kYXRhLmJ1ZmZlckNhbnZhc2VzW3IuTU9USU9OQkxVUl9CVUZGRVJfRFJBR10pIHtcbiAgICBwaXhlbFJhdGlvID0gbWJQeFJhdGlvO1xuICB9XG4gIHZhciBjYW52YXNXaWR0aCA9IHdpZHRoICogcGl4ZWxSYXRpbztcbiAgdmFyIGNhbnZhc0hlaWdodCA9IGhlaWdodCAqIHBpeGVsUmF0aW87XG4gIHZhciBjYW52YXM7XG4gIGlmIChjYW52YXNXaWR0aCA9PT0gci5jYW52YXNXaWR0aCAmJiBjYW52YXNIZWlnaHQgPT09IHIuY2FudmFzSGVpZ2h0KSB7XG4gICAgcmV0dXJuOyAvLyBzYXZlIGN5Y2xlcyBpZiBzYW1lXG4gIH1cbiAgci5mb250Q2FjaGVzID0gbnVsbDsgLy8gcmVzaXppbmcgcmVzZXRzIHRoZSBzdHlsZVxuXG4gIHZhciBjYW52YXNDb250YWluZXIgPSBkYXRhLmNhbnZhc0NvbnRhaW5lcjtcbiAgY2FudmFzQ29udGFpbmVyLnN0eWxlLndpZHRoID0gd2lkdGggKyAncHgnO1xuICBjYW52YXNDb250YWluZXIuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByLkNBTlZBU19MQVlFUlM7IGkrKykge1xuICAgIGNhbnZhcyA9IGRhdGEuY2FudmFzZXNbaV07XG4gICAgY2FudmFzLndpZHRoID0gY2FudmFzV2lkdGg7XG4gICAgY2FudmFzLmhlaWdodCA9IGNhbnZhc0hlaWdodDtcbiAgICBjYW52YXMuc3R5bGUud2lkdGggPSB3aWR0aCArICdweCc7XG4gICAgY2FudmFzLnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCc7XG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByLkJVRkZFUl9DT1VOVDsgaSsrKSB7XG4gICAgY2FudmFzID0gZGF0YS5idWZmZXJDYW52YXNlc1tpXTtcbiAgICBjYW52YXMud2lkdGggPSBjYW52YXNXaWR0aDtcbiAgICBjYW52YXMuaGVpZ2h0ID0gY2FudmFzSGVpZ2h0O1xuICAgIGNhbnZhcy5zdHlsZS53aWR0aCA9IHdpZHRoICsgJ3B4JztcbiAgICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JztcbiAgfVxuICByLnRleHR1cmVNdWx0ID0gMTtcbiAgaWYgKHBpeGVsUmF0aW8gPD0gMSkge1xuICAgIGNhbnZhcyA9IGRhdGEuYnVmZmVyQ2FudmFzZXNbci5URVhUVVJFX0JVRkZFUl07XG4gICAgci50ZXh0dXJlTXVsdCA9IDI7XG4gICAgY2FudmFzLndpZHRoID0gY2FudmFzV2lkdGggKiByLnRleHR1cmVNdWx0O1xuICAgIGNhbnZhcy5oZWlnaHQgPSBjYW52YXNIZWlnaHQgKiByLnRleHR1cmVNdWx0O1xuICB9XG4gIHIuY2FudmFzV2lkdGggPSBjYW52YXNXaWR0aDtcbiAgci5jYW52YXNIZWlnaHQgPSBjYW52YXNIZWlnaHQ7XG4gIHIucGl4ZWxSYXRpbyA9IHBpeGVsUmF0aW87XG59O1xuQ1JwJDUucmVuZGVyVG8gPSBmdW5jdGlvbiAoY3h0LCB6b29tLCBwYW4sIHB4UmF0aW8pIHtcbiAgdGhpcy5yZW5kZXIoe1xuICAgIGZvcmNlZENvbnRleHQ6IGN4dCxcbiAgICBmb3JjZWRab29tOiB6b29tLFxuICAgIGZvcmNlZFBhbjogcGFuLFxuICAgIGRyYXdBbGxMYXllcnM6IHRydWUsXG4gICAgZm9yY2VkUHhSYXRpbzogcHhSYXRpb1xuICB9KTtcbn07XG5DUnAkNS5jbGVhckNhbnZhcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgZGF0YSA9IHIuZGF0YTtcbiAgZnVuY3Rpb24gY2xlYXIoY29udGV4dCkge1xuICAgIGNvbnRleHQuY2xlYXJSZWN0KDAsIDAsIHIuY2FudmFzV2lkdGgsIHIuY2FudmFzSGVpZ2h0KTtcbiAgfVxuICBjbGVhcihkYXRhLmNvbnRleHRzW3IuTk9ERV0pO1xuICBjbGVhcihkYXRhLmNvbnRleHRzW3IuRFJBR10pO1xufTtcbkNScCQ1LnJlbmRlciA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIHZhciByID0gdGhpcztcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwgc3RhdGljRW1wdHlPYmplY3QoKTtcbiAgdmFyIGN5ID0gci5jeTtcbiAgdmFyIGZvcmNlZENvbnRleHQgPSBvcHRpb25zLmZvcmNlZENvbnRleHQ7XG4gIHZhciBkcmF3QWxsTGF5ZXJzID0gb3B0aW9ucy5kcmF3QWxsTGF5ZXJzO1xuICB2YXIgZHJhd09ubHlOb2RlTGF5ZXIgPSBvcHRpb25zLmRyYXdPbmx5Tm9kZUxheWVyO1xuICB2YXIgZm9yY2VkWm9vbSA9IG9wdGlvbnMuZm9yY2VkWm9vbTtcbiAgdmFyIGZvcmNlZFBhbiA9IG9wdGlvbnMuZm9yY2VkUGFuO1xuICB2YXIgcGl4ZWxSYXRpbyA9IG9wdGlvbnMuZm9yY2VkUHhSYXRpbyA9PT0gdW5kZWZpbmVkID8gdGhpcy5nZXRQaXhlbFJhdGlvKCkgOiBvcHRpb25zLmZvcmNlZFB4UmF0aW87XG4gIHZhciBkYXRhID0gci5kYXRhO1xuICB2YXIgbmVlZERyYXcgPSBkYXRhLmNhbnZhc05lZWRzUmVkcmF3O1xuICB2YXIgdGV4dHVyZURyYXcgPSByLnRleHR1cmVPblZpZXdwb3J0ICYmICFmb3JjZWRDb250ZXh0ICYmIChyLnBpbmNoaW5nIHx8IHIuaG92ZXJEYXRhLmRyYWdnaW5nIHx8IHIuc3dpcGVQYW5uaW5nIHx8IHIuZGF0YS53aGVlbFpvb21pbmcpO1xuICB2YXIgbW90aW9uQmx1ciA9IG9wdGlvbnMubW90aW9uQmx1ciAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5tb3Rpb25CbHVyIDogci5tb3Rpb25CbHVyO1xuICB2YXIgbWJQeFJhdGlvID0gci5tb3Rpb25CbHVyUHhSYXRpbztcbiAgdmFyIGhhc0NvbXBvdW5kTm9kZXMgPSBjeS5oYXNDb21wb3VuZE5vZGVzKCk7XG4gIHZhciBpbk5vZGVEcmFnR2VzdHVyZSA9IHIuaG92ZXJEYXRhLmRyYWdnaW5nRWxlcztcbiAgdmFyIGluQm94U2VsZWN0aW9uID0gci5ob3ZlckRhdGEuc2VsZWN0aW5nIHx8IHIudG91Y2hEYXRhLnNlbGVjdGluZyA/IHRydWUgOiBmYWxzZTtcbiAgbW90aW9uQmx1ciA9IG1vdGlvbkJsdXIgJiYgIWZvcmNlZENvbnRleHQgJiYgci5tb3Rpb25CbHVyRW5hYmxlZCAmJiAhaW5Cb3hTZWxlY3Rpb247XG4gIHZhciBtb3Rpb25CbHVyRmFkZUVmZmVjdCA9IG1vdGlvbkJsdXI7XG4gIGlmICghZm9yY2VkQ29udGV4dCkge1xuICAgIGlmIChyLnByZXZQeFJhdGlvICE9PSBwaXhlbFJhdGlvKSB7XG4gICAgICByLmludmFsaWRhdGVDb250YWluZXJDbGllbnRDb29yZHNDYWNoZSgpO1xuICAgICAgci5tYXRjaENhbnZhc1NpemUoci5jb250YWluZXIpO1xuICAgICAgci5yZWRyYXdIaW50KCdlbGVzJywgdHJ1ZSk7XG4gICAgICByLnJlZHJhd0hpbnQoJ2RyYWcnLCB0cnVlKTtcbiAgICB9XG4gICAgci5wcmV2UHhSYXRpbyA9IHBpeGVsUmF0aW87XG4gIH1cbiAgaWYgKCFmb3JjZWRDb250ZXh0ICYmIHIubW90aW9uQmx1clRpbWVvdXQpIHtcbiAgICBjbGVhclRpbWVvdXQoci5tb3Rpb25CbHVyVGltZW91dCk7XG4gIH1cbiAgaWYgKG1vdGlvbkJsdXIpIHtcbiAgICBpZiAoci5tYkZyYW1lcyA9PSBudWxsKSB7XG4gICAgICByLm1iRnJhbWVzID0gMDtcbiAgICB9XG4gICAgci5tYkZyYW1lcysrO1xuICAgIGlmIChyLm1iRnJhbWVzIDwgMykge1xuICAgICAgLy8gbmVlZCBzZXZlcmFsIGZyYW1lcyBiZWZvcmUgZXZlbiBoaWdoIHF1YWxpdHkgbW90aW9uYmx1clxuICAgICAgbW90aW9uQmx1ckZhZGVFZmZlY3QgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBnbyB0byBsb3dlciBxdWFsaXR5IGJsdXJyeSBmcmFtZXMgd2hlbiBzZXZlcmFsIG0vYiBmcmFtZXMgaGF2ZSBiZWVuIHJlbmRlcmVkIChhdm9pZHMgZmxhc2hpbmcpXG4gICAgaWYgKHIubWJGcmFtZXMgPiByLm1pbk1iTG93UXVhbEZyYW1lcykge1xuICAgICAgLy9yLmZ1bGxRdWFsaXR5TWIgPSBmYWxzZTtcbiAgICAgIHIubW90aW9uQmx1clB4UmF0aW8gPSByLm1iUHhSQmx1cnJ5O1xuICAgIH1cbiAgfVxuICBpZiAoci5jbGVhcmluZ01vdGlvbkJsdXIpIHtcbiAgICByLm1vdGlvbkJsdXJQeFJhdGlvID0gMTtcbiAgfVxuXG4gIC8vIGIvYyBkcmF3VG9Db250ZXh0KCkgbWF5IGJlIGFzeW5jIHcuci50LiByZWRyYXcoKSwga2VlcCB0cmFjayBvZiBsYXN0IHRleHR1cmUgZnJhbWVcbiAgLy8gYmVjYXVzZSBhIHJvZ3VlIGFzeW5jIHRleHR1cmUgZnJhbWUgd291bGQgY2xlYXIgbmVlZERyYXdcbiAgaWYgKHIudGV4dHVyZURyYXdMYXN0RnJhbWUgJiYgIXRleHR1cmVEcmF3KSB7XG4gICAgbmVlZERyYXdbci5OT0RFXSA9IHRydWU7XG4gICAgbmVlZERyYXdbci5TRUxFQ1RfQk9YXSA9IHRydWU7XG4gIH1cbiAgdmFyIHN0eWxlID0gY3kuc3R5bGUoKTtcbiAgdmFyIHpvb20gPSBjeS56b29tKCk7XG4gIHZhciBlZmZlY3RpdmVab29tID0gZm9yY2VkWm9vbSAhPT0gdW5kZWZpbmVkID8gZm9yY2VkWm9vbSA6IHpvb207XG4gIHZhciBwYW4gPSBjeS5wYW4oKTtcbiAgdmFyIGVmZmVjdGl2ZVBhbiA9IHtcbiAgICB4OiBwYW4ueCxcbiAgICB5OiBwYW4ueVxuICB9O1xuICB2YXIgdnAgPSB7XG4gICAgem9vbTogem9vbSxcbiAgICBwYW46IHtcbiAgICAgIHg6IHBhbi54LFxuICAgICAgeTogcGFuLnlcbiAgICB9XG4gIH07XG4gIHZhciBwcmV2VnAgPSByLnByZXZWaWV3cG9ydDtcbiAgdmFyIHZpZXdwb3J0SXNEaWZmID0gcHJldlZwID09PSB1bmRlZmluZWQgfHwgdnAuem9vbSAhPT0gcHJldlZwLnpvb20gfHwgdnAucGFuLnggIT09IHByZXZWcC5wYW4ueCB8fCB2cC5wYW4ueSAhPT0gcHJldlZwLnBhbi55O1xuXG4gIC8vIHdlIHdhbnQgdGhlIGxvdyBxdWFsaXR5IG1vdGlvbmJsdXIgb25seSB3aGVuIHRoZSB2aWV3cG9ydCBpcyBiZWluZyBtYW5pcHVsYXRlZCBldGMgKHdoZXJlIGl0J3Mgbm90IG5vdGljZWQpXG4gIGlmICghdmlld3BvcnRJc0RpZmYgJiYgIShpbk5vZGVEcmFnR2VzdHVyZSAmJiAhaGFzQ29tcG91bmROb2RlcykpIHtcbiAgICByLm1vdGlvbkJsdXJQeFJhdGlvID0gMTtcbiAgfVxuICBpZiAoZm9yY2VkUGFuKSB7XG4gICAgZWZmZWN0aXZlUGFuID0gZm9yY2VkUGFuO1xuICB9XG5cbiAgLy8gYXBwbHkgcGl4ZWwgcmF0aW9cblxuICBlZmZlY3RpdmVab29tICo9IHBpeGVsUmF0aW87XG4gIGVmZmVjdGl2ZVBhbi54ICo9IHBpeGVsUmF0aW87XG4gIGVmZmVjdGl2ZVBhbi55ICo9IHBpeGVsUmF0aW87XG4gIHZhciBlbGVzID0gci5nZXRDYWNoZWRaU29ydGVkRWxlcygpO1xuICBmdW5jdGlvbiBtYmNsZWFyKGNvbnRleHQsIHgsIHksIHcsIGgpIHtcbiAgICB2YXIgZ2NvID0gY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb247XG4gICAgY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAnZGVzdGluYXRpb24tb3V0JztcbiAgICByLmNvbG9yRmlsbFN0eWxlKGNvbnRleHQsIDI1NSwgMjU1LCAyNTUsIHIubW90aW9uQmx1clRyYW5zcGFyZW5jeSk7XG4gICAgY29udGV4dC5maWxsUmVjdCh4LCB5LCB3LCBoKTtcbiAgICBjb250ZXh0Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IGdjbztcbiAgfVxuICBmdW5jdGlvbiBzZXRDb250ZXh0VHJhbnNmb3JtKGNvbnRleHQsIGNsZWFyKSB7XG4gICAgdmFyIGVQYW4sIGVab29tLCB3LCBoO1xuICAgIGlmICghci5jbGVhcmluZ01vdGlvbkJsdXIgJiYgKGNvbnRleHQgPT09IGRhdGEuYnVmZmVyQ29udGV4dHNbci5NT1RJT05CTFVSX0JVRkZFUl9OT0RFXSB8fCBjb250ZXh0ID09PSBkYXRhLmJ1ZmZlckNvbnRleHRzW3IuTU9USU9OQkxVUl9CVUZGRVJfRFJBR10pKSB7XG4gICAgICBlUGFuID0ge1xuICAgICAgICB4OiBwYW4ueCAqIG1iUHhSYXRpbyxcbiAgICAgICAgeTogcGFuLnkgKiBtYlB4UmF0aW9cbiAgICAgIH07XG4gICAgICBlWm9vbSA9IHpvb20gKiBtYlB4UmF0aW87XG4gICAgICB3ID0gci5jYW52YXNXaWR0aCAqIG1iUHhSYXRpbztcbiAgICAgIGggPSByLmNhbnZhc0hlaWdodCAqIG1iUHhSYXRpbztcbiAgICB9IGVsc2Uge1xuICAgICAgZVBhbiA9IGVmZmVjdGl2ZVBhbjtcbiAgICAgIGVab29tID0gZWZmZWN0aXZlWm9vbTtcbiAgICAgIHcgPSByLmNhbnZhc1dpZHRoO1xuICAgICAgaCA9IHIuY2FudmFzSGVpZ2h0O1xuICAgIH1cbiAgICBjb250ZXh0LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcbiAgICBpZiAoY2xlYXIgPT09ICdtb3Rpb25CbHVyJykge1xuICAgICAgbWJjbGVhcihjb250ZXh0LCAwLCAwLCB3LCBoKTtcbiAgICB9IGVsc2UgaWYgKCFmb3JjZWRDb250ZXh0ICYmIChjbGVhciA9PT0gdW5kZWZpbmVkIHx8IGNsZWFyKSkge1xuICAgICAgY29udGV4dC5jbGVhclJlY3QoMCwgMCwgdywgaCk7XG4gICAgfVxuICAgIGlmICghZHJhd0FsbExheWVycykge1xuICAgICAgY29udGV4dC50cmFuc2xhdGUoZVBhbi54LCBlUGFuLnkpO1xuICAgICAgY29udGV4dC5zY2FsZShlWm9vbSwgZVpvb20pO1xuICAgIH1cbiAgICBpZiAoZm9yY2VkUGFuKSB7XG4gICAgICBjb250ZXh0LnRyYW5zbGF0ZShmb3JjZWRQYW4ueCwgZm9yY2VkUGFuLnkpO1xuICAgIH1cbiAgICBpZiAoZm9yY2VkWm9vbSkge1xuICAgICAgY29udGV4dC5zY2FsZShmb3JjZWRab29tLCBmb3JjZWRab29tKTtcbiAgICB9XG4gIH1cbiAgaWYgKCF0ZXh0dXJlRHJhdykge1xuICAgIHIudGV4dHVyZURyYXdMYXN0RnJhbWUgPSBmYWxzZTtcbiAgfVxuICBpZiAodGV4dHVyZURyYXcpIHtcbiAgICByLnRleHR1cmVEcmF3TGFzdEZyYW1lID0gdHJ1ZTtcbiAgICBpZiAoIXIudGV4dHVyZUNhY2hlKSB7XG4gICAgICByLnRleHR1cmVDYWNoZSA9IHt9O1xuICAgICAgci50ZXh0dXJlQ2FjaGUuYmIgPSBjeS5tdXRhYmxlRWxlbWVudHMoKS5ib3VuZGluZ0JveCgpO1xuICAgICAgci50ZXh0dXJlQ2FjaGUudGV4dHVyZSA9IHIuZGF0YS5idWZmZXJDYW52YXNlc1tyLlRFWFRVUkVfQlVGRkVSXTtcbiAgICAgIHZhciBjeHQgPSByLmRhdGEuYnVmZmVyQ29udGV4dHNbci5URVhUVVJFX0JVRkZFUl07XG4gICAgICBjeHQuc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuICAgICAgY3h0LmNsZWFyUmVjdCgwLCAwLCByLmNhbnZhc1dpZHRoICogci50ZXh0dXJlTXVsdCwgci5jYW52YXNIZWlnaHQgKiByLnRleHR1cmVNdWx0KTtcbiAgICAgIHIucmVuZGVyKHtcbiAgICAgICAgZm9yY2VkQ29udGV4dDogY3h0LFxuICAgICAgICBkcmF3T25seU5vZGVMYXllcjogdHJ1ZSxcbiAgICAgICAgZm9yY2VkUHhSYXRpbzogcGl4ZWxSYXRpbyAqIHIudGV4dHVyZU11bHRcbiAgICAgIH0pO1xuICAgICAgdmFyIHZwID0gci50ZXh0dXJlQ2FjaGUudmlld3BvcnQgPSB7XG4gICAgICAgIHpvb206IGN5Lnpvb20oKSxcbiAgICAgICAgcGFuOiBjeS5wYW4oKSxcbiAgICAgICAgd2lkdGg6IHIuY2FudmFzV2lkdGgsXG4gICAgICAgIGhlaWdodDogci5jYW52YXNIZWlnaHRcbiAgICAgIH07XG4gICAgICB2cC5tcGFuID0ge1xuICAgICAgICB4OiAoMCAtIHZwLnBhbi54KSAvIHZwLnpvb20sXG4gICAgICAgIHk6ICgwIC0gdnAucGFuLnkpIC8gdnAuem9vbVxuICAgICAgfTtcbiAgICB9XG4gICAgbmVlZERyYXdbci5EUkFHXSA9IGZhbHNlO1xuICAgIG5lZWREcmF3W3IuTk9ERV0gPSBmYWxzZTtcbiAgICB2YXIgY29udGV4dCA9IGRhdGEuY29udGV4dHNbci5OT0RFXTtcbiAgICB2YXIgdGV4dHVyZSA9IHIudGV4dHVyZUNhY2hlLnRleHR1cmU7XG4gICAgdmFyIHZwID0gci50ZXh0dXJlQ2FjaGUudmlld3BvcnQ7XG4gICAgY29udGV4dC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7XG4gICAgaWYgKG1vdGlvbkJsdXIpIHtcbiAgICAgIG1iY2xlYXIoY29udGV4dCwgMCwgMCwgdnAud2lkdGgsIHZwLmhlaWdodCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRleHQuY2xlYXJSZWN0KDAsIDAsIHZwLndpZHRoLCB2cC5oZWlnaHQpO1xuICAgIH1cbiAgICB2YXIgb3V0c2lkZUJnQ29sb3IgPSBzdHlsZS5jb3JlKCdvdXRzaWRlLXRleHR1cmUtYmctY29sb3InKS52YWx1ZTtcbiAgICB2YXIgb3V0c2lkZUJnT3BhY2l0eSA9IHN0eWxlLmNvcmUoJ291dHNpZGUtdGV4dHVyZS1iZy1vcGFjaXR5JykudmFsdWU7XG4gICAgci5jb2xvckZpbGxTdHlsZShjb250ZXh0LCBvdXRzaWRlQmdDb2xvclswXSwgb3V0c2lkZUJnQ29sb3JbMV0sIG91dHNpZGVCZ0NvbG9yWzJdLCBvdXRzaWRlQmdPcGFjaXR5KTtcbiAgICBjb250ZXh0LmZpbGxSZWN0KDAsIDAsIHZwLndpZHRoLCB2cC5oZWlnaHQpO1xuICAgIHZhciB6b29tID0gY3kuem9vbSgpO1xuICAgIHNldENvbnRleHRUcmFuc2Zvcm0oY29udGV4dCwgZmFsc2UpO1xuICAgIGNvbnRleHQuY2xlYXJSZWN0KHZwLm1wYW4ueCwgdnAubXBhbi55LCB2cC53aWR0aCAvIHZwLnpvb20gLyBwaXhlbFJhdGlvLCB2cC5oZWlnaHQgLyB2cC56b29tIC8gcGl4ZWxSYXRpbyk7XG4gICAgY29udGV4dC5kcmF3SW1hZ2UodGV4dHVyZSwgdnAubXBhbi54LCB2cC5tcGFuLnksIHZwLndpZHRoIC8gdnAuem9vbSAvIHBpeGVsUmF0aW8sIHZwLmhlaWdodCAvIHZwLnpvb20gLyBwaXhlbFJhdGlvKTtcbiAgfSBlbHNlIGlmIChyLnRleHR1cmVPblZpZXdwb3J0ICYmICFmb3JjZWRDb250ZXh0KSB7XG4gICAgLy8gY2xlYXIgdGhlIGNhY2hlIHNpbmNlIHdlIGRvbid0IG5lZWQgaXRcbiAgICByLnRleHR1cmVDYWNoZSA9IG51bGw7XG4gIH1cbiAgdmFyIGV4dGVudCA9IGN5LmV4dGVudCgpO1xuICB2YXIgdnBNYW5pcCA9IHIucGluY2hpbmcgfHwgci5ob3ZlckRhdGEuZHJhZ2dpbmcgfHwgci5zd2lwZVBhbm5pbmcgfHwgci5kYXRhLndoZWVsWm9vbWluZyB8fCByLmhvdmVyRGF0YS5kcmFnZ2luZ0VsZXMgfHwgci5jeS5hbmltYXRlZCgpO1xuICB2YXIgaGlkZUVkZ2VzID0gci5oaWRlRWRnZXNPblZpZXdwb3J0ICYmIHZwTWFuaXA7XG4gIHZhciBuZWVkTWJDbGVhciA9IFtdO1xuICBuZWVkTWJDbGVhcltyLk5PREVdID0gIW5lZWREcmF3W3IuTk9ERV0gJiYgbW90aW9uQmx1ciAmJiAhci5jbGVhcmVkRm9yTW90aW9uQmx1cltyLk5PREVdIHx8IHIuY2xlYXJpbmdNb3Rpb25CbHVyO1xuICBpZiAobmVlZE1iQ2xlYXJbci5OT0RFXSkge1xuICAgIHIuY2xlYXJlZEZvck1vdGlvbkJsdXJbci5OT0RFXSA9IHRydWU7XG4gIH1cbiAgbmVlZE1iQ2xlYXJbci5EUkFHXSA9ICFuZWVkRHJhd1tyLkRSQUddICYmIG1vdGlvbkJsdXIgJiYgIXIuY2xlYXJlZEZvck1vdGlvbkJsdXJbci5EUkFHXSB8fCByLmNsZWFyaW5nTW90aW9uQmx1cjtcbiAgaWYgKG5lZWRNYkNsZWFyW3IuRFJBR10pIHtcbiAgICByLmNsZWFyZWRGb3JNb3Rpb25CbHVyW3IuRFJBR10gPSB0cnVlO1xuICB9XG4gIGlmIChuZWVkRHJhd1tyLk5PREVdIHx8IGRyYXdBbGxMYXllcnMgfHwgZHJhd09ubHlOb2RlTGF5ZXIgfHwgbmVlZE1iQ2xlYXJbci5OT0RFXSkge1xuICAgIHZhciB1c2VCdWZmZXIgPSBtb3Rpb25CbHVyICYmICFuZWVkTWJDbGVhcltyLk5PREVdICYmIG1iUHhSYXRpbyAhPT0gMTtcbiAgICB2YXIgY29udGV4dCA9IGZvcmNlZENvbnRleHQgfHwgKHVzZUJ1ZmZlciA/IHIuZGF0YS5idWZmZXJDb250ZXh0c1tyLk1PVElPTkJMVVJfQlVGRkVSX05PREVdIDogZGF0YS5jb250ZXh0c1tyLk5PREVdKTtcbiAgICB2YXIgY2xlYXIgPSBtb3Rpb25CbHVyICYmICF1c2VCdWZmZXIgPyAnbW90aW9uQmx1cicgOiB1bmRlZmluZWQ7XG4gICAgc2V0Q29udGV4dFRyYW5zZm9ybShjb250ZXh0LCBjbGVhcik7XG4gICAgaWYgKGhpZGVFZGdlcykge1xuICAgICAgci5kcmF3Q2FjaGVkTm9kZXMoY29udGV4dCwgZWxlcy5ub25kcmFnLCBwaXhlbFJhdGlvLCBleHRlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByLmRyYXdMYXllcmVkRWxlbWVudHMoY29udGV4dCwgZWxlcy5ub25kcmFnLCBwaXhlbFJhdGlvLCBleHRlbnQpO1xuICAgIH1cbiAgICBpZiAoci5kZWJ1Zykge1xuICAgICAgci5kcmF3RGVidWdQb2ludHMoY29udGV4dCwgZWxlcy5ub25kcmFnKTtcbiAgICB9XG4gICAgaWYgKCFkcmF3QWxsTGF5ZXJzICYmICFtb3Rpb25CbHVyKSB7XG4gICAgICBuZWVkRHJhd1tyLk5PREVdID0gZmFsc2U7XG4gICAgfVxuICB9XG4gIGlmICghZHJhd09ubHlOb2RlTGF5ZXIgJiYgKG5lZWREcmF3W3IuRFJBR10gfHwgZHJhd0FsbExheWVycyB8fCBuZWVkTWJDbGVhcltyLkRSQUddKSkge1xuICAgIHZhciB1c2VCdWZmZXIgPSBtb3Rpb25CbHVyICYmICFuZWVkTWJDbGVhcltyLkRSQUddICYmIG1iUHhSYXRpbyAhPT0gMTtcbiAgICB2YXIgY29udGV4dCA9IGZvcmNlZENvbnRleHQgfHwgKHVzZUJ1ZmZlciA/IHIuZGF0YS5idWZmZXJDb250ZXh0c1tyLk1PVElPTkJMVVJfQlVGRkVSX0RSQUddIDogZGF0YS5jb250ZXh0c1tyLkRSQUddKTtcbiAgICBzZXRDb250ZXh0VHJhbnNmb3JtKGNvbnRleHQsIG1vdGlvbkJsdXIgJiYgIXVzZUJ1ZmZlciA/ICdtb3Rpb25CbHVyJyA6IHVuZGVmaW5lZCk7XG4gICAgaWYgKGhpZGVFZGdlcykge1xuICAgICAgci5kcmF3Q2FjaGVkTm9kZXMoY29udGV4dCwgZWxlcy5kcmFnLCBwaXhlbFJhdGlvLCBleHRlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByLmRyYXdDYWNoZWRFbGVtZW50cyhjb250ZXh0LCBlbGVzLmRyYWcsIHBpeGVsUmF0aW8sIGV4dGVudCk7XG4gICAgfVxuICAgIGlmIChyLmRlYnVnKSB7XG4gICAgICByLmRyYXdEZWJ1Z1BvaW50cyhjb250ZXh0LCBlbGVzLmRyYWcpO1xuICAgIH1cbiAgICBpZiAoIWRyYXdBbGxMYXllcnMgJiYgIW1vdGlvbkJsdXIpIHtcbiAgICAgIG5lZWREcmF3W3IuRFJBR10gPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgdGhpcy5kcmF3U2VsZWN0aW9uUmVjdGFuZ2xlKG9wdGlvbnMsIHNldENvbnRleHRUcmFuc2Zvcm0pO1xuXG4gIC8vIG1vdGlvbmJsdXI6IGJsaXQgcmVuZGVyZWQgYmx1cnJ5IGZyYW1lc1xuICBpZiAobW90aW9uQmx1ciAmJiBtYlB4UmF0aW8gIT09IDEpIHtcbiAgICB2YXIgY3h0Tm9kZSA9IGRhdGEuY29udGV4dHNbci5OT0RFXTtcbiAgICB2YXIgdHh0Tm9kZSA9IHIuZGF0YS5idWZmZXJDYW52YXNlc1tyLk1PVElPTkJMVVJfQlVGRkVSX05PREVdO1xuICAgIHZhciBjeHREcmFnID0gZGF0YS5jb250ZXh0c1tyLkRSQUddO1xuICAgIHZhciB0eHREcmFnID0gci5kYXRhLmJ1ZmZlckNhbnZhc2VzW3IuTU9USU9OQkxVUl9CVUZGRVJfRFJBR107XG4gICAgdmFyIGRyYXdNb3Rpb25CbHVyID0gZnVuY3Rpb24gZHJhd01vdGlvbkJsdXIoY3h0LCB0eHQsIG5lZWRDbGVhcikge1xuICAgICAgY3h0LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcbiAgICAgIGlmIChuZWVkQ2xlYXIgfHwgIW1vdGlvbkJsdXJGYWRlRWZmZWN0KSB7XG4gICAgICAgIGN4dC5jbGVhclJlY3QoMCwgMCwgci5jYW52YXNXaWR0aCwgci5jYW52YXNIZWlnaHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWJjbGVhcihjeHQsIDAsIDAsIHIuY2FudmFzV2lkdGgsIHIuY2FudmFzSGVpZ2h0KTtcbiAgICAgIH1cbiAgICAgIHZhciBweHIgPSBtYlB4UmF0aW87XG4gICAgICBjeHQuZHJhd0ltYWdlKHR4dCxcbiAgICAgIC8vIGltZ1xuICAgICAgMCwgMCxcbiAgICAgIC8vIHN4LCBzeVxuICAgICAgci5jYW52YXNXaWR0aCAqIHB4ciwgci5jYW52YXNIZWlnaHQgKiBweHIsXG4gICAgICAvLyBzdywgc2hcbiAgICAgIDAsIDAsXG4gICAgICAvLyB4LCB5XG4gICAgICByLmNhbnZhc1dpZHRoLCByLmNhbnZhc0hlaWdodCAvLyB3LCBoXG4gICAgICApO1xuICAgIH07XG4gICAgaWYgKG5lZWREcmF3W3IuTk9ERV0gfHwgbmVlZE1iQ2xlYXJbci5OT0RFXSkge1xuICAgICAgZHJhd01vdGlvbkJsdXIoY3h0Tm9kZSwgdHh0Tm9kZSwgbmVlZE1iQ2xlYXJbci5OT0RFXSk7XG4gICAgICBuZWVkRHJhd1tyLk5PREVdID0gZmFsc2U7XG4gICAgfVxuICAgIGlmIChuZWVkRHJhd1tyLkRSQUddIHx8IG5lZWRNYkNsZWFyW3IuRFJBR10pIHtcbiAgICAgIGRyYXdNb3Rpb25CbHVyKGN4dERyYWcsIHR4dERyYWcsIG5lZWRNYkNsZWFyW3IuRFJBR10pO1xuICAgICAgbmVlZERyYXdbci5EUkFHXSA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICByLnByZXZWaWV3cG9ydCA9IHZwO1xuICBpZiAoci5jbGVhcmluZ01vdGlvbkJsdXIpIHtcbiAgICByLmNsZWFyaW5nTW90aW9uQmx1ciA9IGZhbHNlO1xuICAgIHIubW90aW9uQmx1ckNsZWFyZWQgPSB0cnVlO1xuICAgIHIubW90aW9uQmx1ciA9IHRydWU7XG4gIH1cbiAgaWYgKG1vdGlvbkJsdXIpIHtcbiAgICByLm1vdGlvbkJsdXJUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICByLm1vdGlvbkJsdXJUaW1lb3V0ID0gbnVsbDtcbiAgICAgIHIuY2xlYXJlZEZvck1vdGlvbkJsdXJbci5OT0RFXSA9IGZhbHNlO1xuICAgICAgci5jbGVhcmVkRm9yTW90aW9uQmx1cltyLkRSQUddID0gZmFsc2U7XG4gICAgICByLm1vdGlvbkJsdXIgPSBmYWxzZTtcbiAgICAgIHIuY2xlYXJpbmdNb3Rpb25CbHVyID0gIXRleHR1cmVEcmF3O1xuICAgICAgci5tYkZyYW1lcyA9IDA7XG4gICAgICBuZWVkRHJhd1tyLk5PREVdID0gdHJ1ZTtcbiAgICAgIG5lZWREcmF3W3IuRFJBR10gPSB0cnVlO1xuICAgICAgci5yZWRyYXcoKTtcbiAgICB9LCBtb3Rpb25CbHVyRGVsYXkpO1xuICB9XG4gIGlmICghZm9yY2VkQ29udGV4dCkge1xuICAgIGN5LmVtaXQoJ3JlbmRlcicpO1xuICB9XG59O1xudmFyIGZwc0hlaWdodDtcbkNScCQ1LmRyYXdTZWxlY3Rpb25SZWN0YW5nbGUgPSBmdW5jdGlvbiAob3B0aW9ucywgc2V0Q29udGV4dFRyYW5zZm9ybSkge1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBjeSA9IHIuY3k7XG4gIHZhciBkYXRhID0gci5kYXRhO1xuICB2YXIgc3R5bGUgPSBjeS5zdHlsZSgpO1xuICB2YXIgZHJhd09ubHlOb2RlTGF5ZXIgPSBvcHRpb25zLmRyYXdPbmx5Tm9kZUxheWVyO1xuICB2YXIgZHJhd0FsbExheWVycyA9IG9wdGlvbnMuZHJhd0FsbExheWVycztcbiAgdmFyIG5lZWREcmF3ID0gZGF0YS5jYW52YXNOZWVkc1JlZHJhdztcbiAgdmFyIGZvcmNlZENvbnRleHQgPSBvcHRpb25zLmZvcmNlZENvbnRleHQ7XG4gIGlmIChyLnNob3dGcHMgfHwgIWRyYXdPbmx5Tm9kZUxheWVyICYmIG5lZWREcmF3W3IuU0VMRUNUX0JPWF0gJiYgIWRyYXdBbGxMYXllcnMpIHtcbiAgICB2YXIgY29udGV4dCA9IGZvcmNlZENvbnRleHQgfHwgZGF0YS5jb250ZXh0c1tyLlNFTEVDVF9CT1hdO1xuICAgIHNldENvbnRleHRUcmFuc2Zvcm0oY29udGV4dCk7XG4gICAgaWYgKHIuc2VsZWN0aW9uWzRdID09IDEgJiYgKHIuaG92ZXJEYXRhLnNlbGVjdGluZyB8fCByLnRvdWNoRGF0YS5zZWxlY3RpbmcpKSB7XG4gICAgICB2YXIgem9vbSA9IHIuY3kuem9vbSgpO1xuICAgICAgdmFyIGJvcmRlcldpZHRoID0gc3R5bGUuY29yZSgnc2VsZWN0aW9uLWJveC1ib3JkZXItd2lkdGgnKS52YWx1ZSAvIHpvb207XG4gICAgICBjb250ZXh0LmxpbmVXaWR0aCA9IGJvcmRlcldpZHRoO1xuICAgICAgY29udGV4dC5maWxsU3R5bGUgPSAncmdiYSgnICsgc3R5bGUuY29yZSgnc2VsZWN0aW9uLWJveC1jb2xvcicpLnZhbHVlWzBdICsgJywnICsgc3R5bGUuY29yZSgnc2VsZWN0aW9uLWJveC1jb2xvcicpLnZhbHVlWzFdICsgJywnICsgc3R5bGUuY29yZSgnc2VsZWN0aW9uLWJveC1jb2xvcicpLnZhbHVlWzJdICsgJywnICsgc3R5bGUuY29yZSgnc2VsZWN0aW9uLWJveC1vcGFjaXR5JykudmFsdWUgKyAnKSc7XG4gICAgICBjb250ZXh0LmZpbGxSZWN0KHIuc2VsZWN0aW9uWzBdLCByLnNlbGVjdGlvblsxXSwgci5zZWxlY3Rpb25bMl0gLSByLnNlbGVjdGlvblswXSwgci5zZWxlY3Rpb25bM10gLSByLnNlbGVjdGlvblsxXSk7XG4gICAgICBpZiAoYm9yZGVyV2lkdGggPiAwKSB7XG4gICAgICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSAncmdiYSgnICsgc3R5bGUuY29yZSgnc2VsZWN0aW9uLWJveC1ib3JkZXItY29sb3InKS52YWx1ZVswXSArICcsJyArIHN0eWxlLmNvcmUoJ3NlbGVjdGlvbi1ib3gtYm9yZGVyLWNvbG9yJykudmFsdWVbMV0gKyAnLCcgKyBzdHlsZS5jb3JlKCdzZWxlY3Rpb24tYm94LWJvcmRlci1jb2xvcicpLnZhbHVlWzJdICsgJywnICsgc3R5bGUuY29yZSgnc2VsZWN0aW9uLWJveC1vcGFjaXR5JykudmFsdWUgKyAnKSc7XG4gICAgICAgIGNvbnRleHQuc3Ryb2tlUmVjdChyLnNlbGVjdGlvblswXSwgci5zZWxlY3Rpb25bMV0sIHIuc2VsZWN0aW9uWzJdIC0gci5zZWxlY3Rpb25bMF0sIHIuc2VsZWN0aW9uWzNdIC0gci5zZWxlY3Rpb25bMV0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGF0YS5iZ0FjdGl2ZVBvc2lzdGlvbiAmJiAhci5ob3ZlckRhdGEuc2VsZWN0aW5nKSB7XG4gICAgICB2YXIgem9vbSA9IHIuY3kuem9vbSgpO1xuICAgICAgdmFyIHBvcyA9IGRhdGEuYmdBY3RpdmVQb3Npc3Rpb247XG4gICAgICBjb250ZXh0LmZpbGxTdHlsZSA9ICdyZ2JhKCcgKyBzdHlsZS5jb3JlKCdhY3RpdmUtYmctY29sb3InKS52YWx1ZVswXSArICcsJyArIHN0eWxlLmNvcmUoJ2FjdGl2ZS1iZy1jb2xvcicpLnZhbHVlWzFdICsgJywnICsgc3R5bGUuY29yZSgnYWN0aXZlLWJnLWNvbG9yJykudmFsdWVbMl0gKyAnLCcgKyBzdHlsZS5jb3JlKCdhY3RpdmUtYmctb3BhY2l0eScpLnZhbHVlICsgJyknO1xuICAgICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICAgIGNvbnRleHQuYXJjKHBvcy54LCBwb3MueSwgc3R5bGUuY29yZSgnYWN0aXZlLWJnLXNpemUnKS5wZlZhbHVlIC8gem9vbSwgMCwgMiAqIE1hdGguUEkpO1xuICAgICAgY29udGV4dC5maWxsKCk7XG4gICAgfVxuICAgIHZhciB0aW1lVG9SZW5kZXIgPSByLmxhc3RSZWRyYXdUaW1lO1xuICAgIGlmIChyLnNob3dGcHMgJiYgdGltZVRvUmVuZGVyKSB7XG4gICAgICB0aW1lVG9SZW5kZXIgPSBNYXRoLnJvdW5kKHRpbWVUb1JlbmRlcik7XG4gICAgICB2YXIgZnBzID0gTWF0aC5yb3VuZCgxMDAwIC8gdGltZVRvUmVuZGVyKTtcbiAgICAgIHZhciB0ZXh0ID0gJzEgZnJhbWUgPSAnICsgdGltZVRvUmVuZGVyICsgJyBtcyA9ICcgKyBmcHMgKyAnIGZwcyc7XG4gICAgICBjb250ZXh0LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcbiAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gJ3JnYmEoMjU1LCAwLCAwLCAwLjc1KSc7XG4gICAgICBjb250ZXh0LnN0cm9rZVN0eWxlID0gJ3JnYmEoMjU1LCAwLCAwLCAwLjc1KSc7XG4gICAgICAvLyBjb250ZXh0LmxpbmVXaWR0aCA9IDE7XG4gICAgICBjb250ZXh0LmZvbnQgPSAnMzBweCBBcmlhbCc7XG4gICAgICBpZiAoIWZwc0hlaWdodCkge1xuICAgICAgICB2YXIgZGltcyA9IGNvbnRleHQubWVhc3VyZVRleHQodGV4dCk7XG4gICAgICAgIGZwc0hlaWdodCA9IGRpbXMuYWN0dWFsQm91bmRpbmdCb3hBc2NlbnQ7XG4gICAgICB9XG4gICAgICBjb250ZXh0LmZpbGxUZXh0KHRleHQsIDAsIGZwc0hlaWdodCk7XG4gICAgICB2YXIgbWF4RnBzID0gNjA7XG4gICAgICBjb250ZXh0LnN0cm9rZVJlY3QoMCwgZnBzSGVpZ2h0ICsgMTAsIDI1MCwgMjApO1xuICAgICAgY29udGV4dC5maWxsUmVjdCgwLCBmcHNIZWlnaHQgKyAxMCwgMjUwICogTWF0aC5taW4oZnBzIC8gbWF4RnBzLCAxKSwgMjApO1xuICAgIH1cbiAgICBpZiAoIWRyYXdBbGxMYXllcnMpIHtcbiAgICAgIG5lZWREcmF3W3IuU0VMRUNUX0JPWF0gPSBmYWxzZTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogTm90ZXM6XG4gKiAtIEFsbCBjb2xvcnMgaGF2ZSBwcmVtdWx0aXBsaWVkIGFscGhhLiBWZXJ5IGltcG9ydGFudCBmb3IgdGV4dHVlcyBhbmQgXG4gKiAgIGJsZW5kaW5nIHRvIHdvcmsgY29ycmVjdGx5LlxuICovXG5cbmZ1bmN0aW9uIGNvbXBpbGVTaGFkZXIoZ2wsIHR5cGUsIHNvdXJjZSkge1xuICB2YXIgc2hhZGVyID0gZ2wuY3JlYXRlU2hhZGVyKHR5cGUpO1xuICBnbC5zaGFkZXJTb3VyY2Uoc2hhZGVyLCBzb3VyY2UpO1xuICBnbC5jb21waWxlU2hhZGVyKHNoYWRlcik7XG4gIGlmICghZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKHNoYWRlciwgZ2wuQ09NUElMRV9TVEFUVVMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGdsLmdldFNoYWRlckluZm9Mb2coc2hhZGVyKSk7XG4gIH1cbiAgLy8gY29uc29sZS5sb2coZ2wuZ2V0U2hhZGVySW5mb0xvZyhzaGFkZXIpKTtcbiAgcmV0dXJuIHNoYWRlcjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVByb2dyYW0oZ2wsIHZlcnRleFNvdXJjZSwgZnJhZ2VtZW50U291cmNlKSB7XG4gIHZhciB2ZXJ0ZXhTaGFkZXIgPSBjb21waWxlU2hhZGVyKGdsLCBnbC5WRVJURVhfU0hBREVSLCB2ZXJ0ZXhTb3VyY2UpO1xuICB2YXIgZnJhZ21lbnRTaGFkZXIgPSBjb21waWxlU2hhZGVyKGdsLCBnbC5GUkFHTUVOVF9TSEFERVIsIGZyYWdlbWVudFNvdXJjZSk7XG4gIHZhciBwcm9ncmFtID0gZ2wuY3JlYXRlUHJvZ3JhbSgpO1xuICBnbC5hdHRhY2hTaGFkZXIocHJvZ3JhbSwgdmVydGV4U2hhZGVyKTtcbiAgZ2wuYXR0YWNoU2hhZGVyKHByb2dyYW0sIGZyYWdtZW50U2hhZGVyKTtcbiAgZ2wubGlua1Byb2dyYW0ocHJvZ3JhbSk7XG4gIGlmICghZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlcihwcm9ncmFtLCBnbC5MSU5LX1NUQVRVUykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBpbml0aWFsaXplIHNoYWRlcnMnKTtcbiAgfVxuICByZXR1cm4gcHJvZ3JhbTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIG9mZnNjcmVuIGNhbnZhcyB3aXRoIGEgMkQgY29udGV4dCwgZm9yIHRoZVxuICogY2FudmFzIHJlbmRlcmVyIHRvIHVzZSBmb3IgZHJhd2luZyB0ZXh0dXJlcy5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlVGV4dHVyZUNhbnZhcyhyLCB3aWR0aCwgaGVpZ2h0KSB7XG4gIGlmIChoZWlnaHQgPT09IHVuZGVmaW5lZCkge1xuICAgIGhlaWdodCA9IHdpZHRoO1xuICB9XG4gIHZhciBjYW52YXMgPSByLm1ha2VPZmZzY3JlZW5DYW52YXMod2lkdGgsIGhlaWdodCk7XG4gIHZhciBjdHggPSBjYW52YXMuY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICBjYW52YXMuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGN0eC5jbGVhclJlY3QoMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcbiAgfTtcbiAgY2FudmFzLmNsZWFyKCk7XG4gIHJldHVybiBjYW52YXM7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgY3VycmVudCBwYW4gJiB6b29tIHZhbHVlcywgc2NhbGVkIGJ5IHRoZSBwaXhlbCByYXRpby5cbiAqL1xuZnVuY3Rpb24gZ2V0RWZmZWN0aXZlUGFuWm9vbShyKSB7XG4gIHZhciBwaXhlbFJhdGlvID0gci5waXhlbFJhdGlvO1xuICB2YXIgem9vbSA9IHIuY3kuem9vbSgpO1xuICB2YXIgcGFuID0gci5jeS5wYW4oKTtcbiAgcmV0dXJuIHtcbiAgICB6b29tOiB6b29tICogcGl4ZWxSYXRpbyxcbiAgICBwYW46IHtcbiAgICAgIHg6IHBhbi54ICogcGl4ZWxSYXRpbyxcbiAgICAgIHk6IHBhbi55ICogcGl4ZWxSYXRpb1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSB6b29tIHZhbHVlLCBzY2FsZWQgYnkgdGhlIHBpeGVsIHJhdGlvLlxuICovXG5mdW5jdGlvbiBnZXRFZmZlY3RpdmVab29tKHIpIHtcbiAgdmFyIHBpeGVsUmF0aW8gPSByLnBpeGVsUmF0aW87XG4gIHZhciB6b29tID0gci5jeS56b29tKCk7XG4gIHJldHVybiB6b29tICogcGl4ZWxSYXRpbztcbn1cbmZ1bmN0aW9uIG1vZGVsVG9SZW5kZXJlZFBvc2l0aW9uKHIsIHBhbiwgem9vbSwgeCwgeSkge1xuICB2YXIgcnggPSB4ICogem9vbSArIHBhbi54O1xuICB2YXIgcnkgPSB5ICogem9vbSArIHBhbi55O1xuICByeSA9IE1hdGgucm91bmQoci5jYW52YXNIZWlnaHQgLSByeSk7IC8vIGFkanVzdCBmb3Igd2ViZ2xcbiAgcmV0dXJuIFtyeCwgcnldO1xufVxuZnVuY3Rpb24gaXNTaW1wbGVTaGFwZShub2RlLCByZW5kZXJUYXJnZXQpIHtcbiAgLy8gdGhlIGFjdHVhbCBzaGFwZSBpcyBjaGVja2VkIGluIEVsZW1lbnREcmF3aW5nV2ViR0wuX2dldFZlcnRUeXBlRm9yU2hhcGUoKVxuICAvLyBubyBuZWVkIHRvIGNoZWNrIGl0IHR3aWNlLCB0aGlzIGp1c3QgY2hlY2tzIG90aGVyIHZpc3VhbCBwcm9wZXJ0aWVzXG4gIGlmIChyZW5kZXJUYXJnZXQucGlja2luZykge1xuICAgIC8vIFdlIGRvbid0IGNhcmUgYWJvdXQgdGhlIGJvcmRlciBvciBiYWNrZ3JvdW5kIHN0eWxlIGZvciBwaWNraW5nXG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSB7XG4gICAgaWYgKG5vZGUucHN0eWxlKCdiYWNrZ3JvdW5kLWZpbGwnKS52YWx1ZSAhPT0gJ3NvbGlkJykgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChub2RlLnBzdHlsZSgnYmFja2dyb3VuZC1pbWFnZScpLnN0clZhbHVlICE9PSAnbm9uZScpIHJldHVybiBmYWxzZTtcbiAgICBpZiAobm9kZS5wc3R5bGUoJ2JvcmRlci13aWR0aCcpLnZhbHVlID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAobm9kZS5wc3R5bGUoJ2JvcmRlci1vcGFjaXR5JykudmFsdWUgPT09IDApIHJldHVybiB0cnVlO1xuICAgIC8vIHdlIGhhdmUgYSBib3JkZXIgYnV0IGl0IG11c3QgYmUgc2ltcGxlXG4gICAgaWYgKG5vZGUucHN0eWxlKCdib3JkZXItc3R5bGUnKS52YWx1ZSAhPT0gJ3NvbGlkJykgcmV0dXJuIGZhbHNlO1xuICAgIC8vIFRPRE8gaWdub3JpbmcgJ2JvcmRlci1jYXAnLCAnYm9yZGVyLWpvaW4nIGFuZCAnYm9yZGVyLXBvc2l0aW9uJyBmb3Igbm93XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cbmZ1bmN0aW9uIGFycmF5RXF1YWwoYTEsIGEyKSB7XG4gIGlmIChhMS5sZW5ndGggIT09IGEyLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGExLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGExW2ldICE9PSBhMltpXSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBUYWtlcyBjb2xvciAmIG9wYWNpdHkgc3R5bGUgdmFsdWVzIGFuZCBjb252ZXJ0cyB0aGVtIHRvIFdlYkdMIGZvcm1hdC4gXG4gKiBBbHBoYSBpcyBwcmVtdWx0aXBsaWVkLlxuICovXG5mdW5jdGlvbiB0b1dlYkdMQ29sb3IoY29sb3IsIG9wYWNpdHksIG91dEFycmF5KSB7XG4gIHZhciByID0gY29sb3JbMF0gLyAyNTU7XG4gIHZhciBnID0gY29sb3JbMV0gLyAyNTU7XG4gIHZhciBiID0gY29sb3JbMl0gLyAyNTU7XG4gIHZhciBhID0gb3BhY2l0eTtcbiAgdmFyIGFyciA9IG91dEFycmF5IHx8IG5ldyBBcnJheSg0KTtcbiAgYXJyWzBdID0gciAqIGE7XG4gIGFyclsxXSA9IGcgKiBhO1xuICBhcnJbMl0gPSBiICogYTtcbiAgYXJyWzNdID0gYTtcbiAgcmV0dXJuIGFycjtcbn1cbmZ1bmN0aW9uIGluZGV4VG9WZWM0KGluZGV4LCBvdXRBcnJheSkge1xuICB2YXIgYXJyID0gb3V0QXJyYXkgfHwgbmV3IEFycmF5KDQpO1xuICBhcnJbMF0gPSAoaW5kZXggPj4gMCAmIDB4RkYpIC8gMHhGRjtcbiAgYXJyWzFdID0gKGluZGV4ID4+IDggJiAweEZGKSAvIDB4RkY7XG4gIGFyclsyXSA9IChpbmRleCA+PiAxNiAmIDB4RkYpIC8gMHhGRjtcbiAgYXJyWzNdID0gKGluZGV4ID4+IDI0ICYgMHhGRikgLyAweEZGO1xuICByZXR1cm4gYXJyO1xufVxuZnVuY3Rpb24gdmVjNFRvSW5kZXgodmVjNCkge1xuICByZXR1cm4gdmVjNFswXSArICh2ZWM0WzFdIDw8IDgpICsgKHZlYzRbMl0gPDwgMTYpICsgKHZlYzRbM10gPDwgMjQpO1xufVxuZnVuY3Rpb24gY3JlYXRlVGV4dHVyZShnbCwgZGVidWdJRCkge1xuICB2YXIgdGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKTtcbiAgdGV4dHVyZS5idWZmZXIgPSBmdW5jdGlvbiAob2Zmc2NyZWVuQ2FudmFzKSB7XG4gICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZSk7XG4gICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfUywgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfVCwgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLkxJTkVBUik7XG4gICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLkxJTkVBUl9NSVBNQVBfTkVBUkVTVCk7XG5cbiAgICAvLyB2ZXJ5IGltcG9ydGFudCwgdGhpcyB0ZWxscyB3ZWJnbCB0byBwcmVtdWx0aXBseSBjb2xvcnMgYnkgdGhlIGFscGhhIGNoYW5uZWxcbiAgICBnbC5waXhlbFN0b3JlaShnbC5VTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0wsIHRydWUpO1xuICAgIGdsLnRleEltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgZ2wuUkdCQSwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgb2Zmc2NyZWVuQ2FudmFzKTtcbiAgICBnbC5nZW5lcmF0ZU1pcG1hcChnbC5URVhUVVJFXzJEKTtcbiAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBudWxsKTtcbiAgfTtcbiAgdGV4dHVyZS5kZWxldGVUZXh0dXJlID0gZnVuY3Rpb24gKCkge1xuICAgIGdsLmRlbGV0ZVRleHR1cmUodGV4dHVyZSk7XG4gIH07XG4gIHJldHVybiB0ZXh0dXJlO1xufVxuZnVuY3Rpb24gZ2V0VHlwZUluZm8oZ2wsIGdsc2xUeXBlKSB7XG4gIHN3aXRjaCAoZ2xzbFR5cGUpIHtcbiAgICBjYXNlICdmbG9hdCc6XG4gICAgICByZXR1cm4gWzEsIGdsLkZMT0FULCA0XTtcbiAgICBjYXNlICd2ZWMyJzpcbiAgICAgIHJldHVybiBbMiwgZ2wuRkxPQVQsIDRdO1xuICAgIGNhc2UgJ3ZlYzMnOlxuICAgICAgcmV0dXJuIFszLCBnbC5GTE9BVCwgNF07XG4gICAgY2FzZSAndmVjNCc6XG4gICAgICByZXR1cm4gWzQsIGdsLkZMT0FULCA0XTtcbiAgICBjYXNlICdpbnQnOlxuICAgICAgcmV0dXJuIFsxLCBnbC5JTlQsIDRdO1xuICAgIGNhc2UgJ2l2ZWMyJzpcbiAgICAgIHJldHVybiBbMiwgZ2wuSU5ULCA0XTtcbiAgfVxufVxuZnVuY3Rpb24gY3JlYXRlVHlwZWRBcnJheShnbCwgZ2xUeXBlLCBkYXRhT3JTaXplKSB7XG4gIHN3aXRjaCAoZ2xUeXBlKSB7XG4gICAgY2FzZSBnbC5GTE9BVDpcbiAgICAgIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KGRhdGFPclNpemUpO1xuICAgIGNhc2UgZ2wuSU5UOlxuICAgICAgcmV0dXJuIG5ldyBJbnQzMkFycmF5KGRhdGFPclNpemUpO1xuICB9XG59XG5mdW5jdGlvbiBjcmVhdGVUeXBlZEFycmF5VmlldyhnbCwgZ2xUeXBlLCBhcnJheSwgc3RyaWRlLCBzaXplLCBpKSB7XG4gIHN3aXRjaCAoZ2xUeXBlKSB7XG4gICAgY2FzZSBnbC5GTE9BVDpcbiAgICAgIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KGFycmF5LmJ1ZmZlciwgaSAqIHN0cmlkZSwgc2l6ZSk7XG4gICAgY2FzZSBnbC5JTlQ6XG4gICAgICByZXR1cm4gbmV3IEludDMyQXJyYXkoYXJyYXkuYnVmZmVyLCBpICogc3RyaWRlLCBzaXplKTtcbiAgfVxufVxuXG4vKiogQHBhcmFtIHtXZWJHTFJlbmRlcmluZ0NvbnRleHR9IGdsICovXG5mdW5jdGlvbiBjcmVhdGVCdWZmZXJTdGF0aWNEcmF3KGdsLCB0eXBlLCBhdHRyaWJ1dGVMb2MsIGRhdGFBcnJheSkge1xuICB2YXIgX2dldFR5cGVJbmZvID0gZ2V0VHlwZUluZm8oZ2wsIHR5cGUpLFxuICAgIF9nZXRUeXBlSW5mbzIgPSBfc2xpY2VkVG9BcnJheShfZ2V0VHlwZUluZm8sIDIpLFxuICAgIHNpemUgPSBfZ2V0VHlwZUluZm8yWzBdLFxuICAgIGdsVHlwZSA9IF9nZXRUeXBlSW5mbzJbMV07XG4gIHZhciBkYXRhID0gY3JlYXRlVHlwZWRBcnJheShnbCwgZ2xUeXBlLCBkYXRhQXJyYXkpO1xuICB2YXIgYnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7XG4gIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBidWZmZXIpO1xuICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgZGF0YSwgZ2wuU1RBVElDX0RSQVcpO1xuICBpZiAoZ2xUeXBlID09PSBnbC5GTE9BVCkge1xuICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoYXR0cmlidXRlTG9jLCBzaXplLCBnbFR5cGUsIGZhbHNlLCAwLCAwKTtcbiAgfSBlbHNlIGlmIChnbFR5cGUgPT09IGdsLklOVCkge1xuICAgIGdsLnZlcnRleEF0dHJpYklQb2ludGVyKGF0dHJpYnV0ZUxvYywgc2l6ZSwgZ2xUeXBlLCAwLCAwKTtcbiAgfVxuICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShhdHRyaWJ1dGVMb2MpO1xuICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgbnVsbCk7XG4gIHJldHVybiBidWZmZXI7XG59XG5cbi8qKiBcbiAqIENyZWF0ZXMgYSBmbG9hdCBidWZmZXIgd2l0aCBnbC5EWU5BTUlDX0RSQVcuXG4gKiBUaGUgcmV0dXJuZWQgYnVmZmVyIG9iamVjdCBjb250YWlucyBmdW5jdGlvbnMgdG8gZWFzaWx5IHNldCBpbnN0YW5jZSBkYXRhIGFuZCBidWZmZXIgdGhlIGRhdGEgYmVmb3JlIGEgZHJhdyBjYWxsLlxuICogQHBhcmFtIHtXZWJHTFJlbmRlcmluZ0NvbnRleHR9IGdsIFxuICovXG5mdW5jdGlvbiBjcmVhdGVCdWZmZXJEeW5hbWljRHJhdyhnbCwgaW5zdGFuY2VzLCB0eXBlLCBhdHRyaWJ1dGVMb2MpIHtcbiAgdmFyIF9nZXRUeXBlSW5mbzMgPSBnZXRUeXBlSW5mbyhnbCwgdHlwZSksXG4gICAgX2dldFR5cGVJbmZvNCA9IF9zbGljZWRUb0FycmF5KF9nZXRUeXBlSW5mbzMsIDMpLFxuICAgIHNpemUgPSBfZ2V0VHlwZUluZm80WzBdLFxuICAgIGdsVHlwZSA9IF9nZXRUeXBlSW5mbzRbMV0sXG4gICAgYnl0ZXMgPSBfZ2V0VHlwZUluZm80WzJdO1xuICB2YXIgZGF0YUFycmF5ID0gY3JlYXRlVHlwZWRBcnJheShnbCwgZ2xUeXBlLCBpbnN0YW5jZXMgKiBzaXplKTtcbiAgdmFyIHN0cmlkZSA9IHNpemUgKiBieXRlcztcbiAgdmFyIGJ1ZmZlciA9IGdsLmNyZWF0ZUJ1ZmZlcigpO1xuICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgYnVmZmVyKTtcbiAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIGluc3RhbmNlcyAqIHN0cmlkZSwgZ2wuRFlOQU1JQ19EUkFXKTtcbiAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoYXR0cmlidXRlTG9jKTtcbiAgaWYgKGdsVHlwZSA9PT0gZ2wuRkxPQVQpIHtcbiAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGF0dHJpYnV0ZUxvYywgc2l6ZSwgZ2xUeXBlLCBmYWxzZSwgc3RyaWRlLCAwKTtcbiAgfSBlbHNlIGlmIChnbFR5cGUgPT09IGdsLklOVCkge1xuICAgIGdsLnZlcnRleEF0dHJpYklQb2ludGVyKGF0dHJpYnV0ZUxvYywgc2l6ZSwgZ2xUeXBlLCBzdHJpZGUsIDApO1xuICB9XG4gIGdsLnZlcnRleEF0dHJpYkRpdmlzb3IoYXR0cmlidXRlTG9jLCAxKTtcbiAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIG51bGwpO1xuXG4gIC8vIHVzZSBhcnJheSB2aWV3cyB0byBzZXQgdmFsdWVzIGRpcmVjdGx5IGludG8gdGhlIGJ1ZmZlciBhcnJheVxuICB2YXIgdmlld3MgPSBuZXcgQXJyYXkoaW5zdGFuY2VzKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbnN0YW5jZXM7IGkrKykge1xuICAgIHZpZXdzW2ldID0gY3JlYXRlVHlwZWRBcnJheVZpZXcoZ2wsIGdsVHlwZSwgZGF0YUFycmF5LCBzdHJpZGUsIHNpemUsIGkpO1xuICB9XG4gIGJ1ZmZlci5kYXRhQXJyYXkgPSBkYXRhQXJyYXk7XG4gIGJ1ZmZlci5zdHJpZGUgPSBzdHJpZGU7XG4gIGJ1ZmZlci5zaXplID0gc2l6ZTtcbiAgYnVmZmVyLmdldFZpZXcgPSBmdW5jdGlvbiAoaSkge1xuICAgIHJldHVybiB2aWV3c1tpXTtcbiAgfTtcbiAgYnVmZmVyLnNldFBvaW50ID0gZnVuY3Rpb24gKGksIHgsIHkpIHtcbiAgICB2YXIgdmlldyA9IHZpZXdzW2ldO1xuICAgIHZpZXdbMF0gPSB4O1xuICAgIHZpZXdbMV0gPSB5O1xuICB9O1xuICBidWZmZXIuYnVmZmVyU3ViRGF0YSA9IGZ1bmN0aW9uIChjb3VudCkge1xuICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBidWZmZXIpO1xuICAgIGlmIChjb3VudCkge1xuICAgICAgZ2wuYnVmZmVyU3ViRGF0YShnbC5BUlJBWV9CVUZGRVIsIDAsIGRhdGFBcnJheSwgMCwgY291bnQgKiBzaXplKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2wuYnVmZmVyU3ViRGF0YShnbC5BUlJBWV9CVUZGRVIsIDAsIGRhdGFBcnJheSk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gYnVmZmVyO1xufVxuXG4vKiogXG4gKiBDcmVhdGVzIGEgYnVmZmVyIG9mIDN4MyBtYXRyaXggZGF0YSBmb3IgdXNlIGFzIGF0dHJpYnV0ZSBkYXRhLlxuICogQHBhcmFtIHtXZWJHTFJlbmRlcmluZ0NvbnRleHR9IGdsIFxuICovXG5mdW5jdGlvbiBjcmVhdGUzeDNNYXRyaXhCdWZmZXJEeW5hbWljRHJhdyhnbCwgaW5zdGFuY2VzLCBhdHRyaWJ1dGVMb2MpIHtcbiAgdmFyIG1hdHJpeFNpemUgPSA5OyAvLyAzeDMgbWF0cml4XG4gIHZhciBtYXRyaXhEYXRhID0gbmV3IEZsb2F0MzJBcnJheShpbnN0YW5jZXMgKiBtYXRyaXhTaXplKTtcblxuICAvLyB1c2UgbWF0cml4IHZpZXdzIHRvIHNldCB2YWx1ZXMgZGlyZWN0bHkgaW50byB0aGUgbWF0cml4RGF0YSBhcnJheVxuICB2YXIgbWF0cml4Vmlld3MgPSBuZXcgQXJyYXkoaW5zdGFuY2VzKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbnN0YW5jZXM7IGkrKykge1xuICAgIHZhciBieXRlT2Zmc2V0ID0gaSAqIG1hdHJpeFNpemUgKiA0OyAvLyA0IGJ5dGVzIHBlciBmbG9hdFxuICAgIG1hdHJpeFZpZXdzW2ldID0gbmV3IEZsb2F0MzJBcnJheShtYXRyaXhEYXRhLmJ1ZmZlciwgYnl0ZU9mZnNldCwgbWF0cml4U2l6ZSk7IC8vIGFycmF5IHZpZXdcbiAgfVxuICB2YXIgYnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7XG4gIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBidWZmZXIpO1xuICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgbWF0cml4RGF0YS5ieXRlTGVuZ3RoLCBnbC5EWU5BTUlDX0RSQVcpO1xuXG4gIC8vIGVhY2ggcm93IG9mIHRoZSBtYXRyaXggbmVlZHMgdG8gYmUgYSBzZXBhcmF0ZSBhdHRyaWJ1dGVcbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IDM7IF9pKyspIHtcbiAgICB2YXIgbG9jID0gYXR0cmlidXRlTG9jICsgX2k7XG4gICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkobG9jKTtcbiAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGxvYywgMywgZ2wuRkxPQVQsIGZhbHNlLCAzICogMTIsIF9pICogMTIpO1xuICAgIGdsLnZlcnRleEF0dHJpYkRpdmlzb3IobG9jLCAxKTtcbiAgfVxuICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgbnVsbCk7XG4gIGJ1ZmZlci5nZXRNYXRyaXhWaWV3ID0gZnVuY3Rpb24gKGkpIHtcbiAgICByZXR1cm4gbWF0cml4Vmlld3NbaV07XG4gIH07XG5cbiAgLy8gVE9ETyB0aGlzIGlzIHRvbyBzbG93LCB1c2UgZ2V0TWF0cml4VmlldyBhbmQgcGFzcyB0aGUgdmlldyBkaXJlY3RseSB0byB0aGUgZ2xtYXRyaXggbGlicmFyeVxuICBidWZmZXIuc2V0RGF0YSA9IGZ1bmN0aW9uIChtYXRyaXgsIGkpIHtcbiAgICBtYXRyaXhWaWV3c1tpXS5zZXQobWF0cml4LCAwKTtcbiAgfTtcbiAgYnVmZmVyLmJ1ZmZlclN1YkRhdGEgPSBmdW5jdGlvbiAoKSB7XG4gICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIGJ1ZmZlcik7XG4gICAgZ2wuYnVmZmVyU3ViRGF0YShnbC5BUlJBWV9CVUZGRVIsIDAsIG1hdHJpeERhdGEpO1xuICB9O1xuICByZXR1cm4gYnVmZmVyO1xufVxuXG4vKiogXG4gKiBDcmVhdGVzIGEgRnJhbWUgQnVmZmVyIHRvIHVzZSBmb3Igb2Zmc2NyZWVuIHJlbmRlcmluZy5cbiAqIEBwYXJhbSB7V2ViR0xSZW5kZXJpbmdDb250ZXh0fSBnbCBcbiAqL1xuZnVuY3Rpb24gY3JlYXRlUGlja2luZ0ZyYW1lQnVmZmVyKGdsKSB7XG4gIC8vIENyZWF0ZSBhbmQgYmluZCB0aGUgZnJhbWVidWZmZXJcbiAgdmFyIGZiID0gZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTtcbiAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBmYik7XG5cbiAgLy8gQ3JlYXRlIGEgdGV4dHVyZSB0byByZW5kZXIgdG9cbiAgdmFyIHRhcmdldFRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCk7XG4gIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRhcmdldFRleHR1cmUpO1xuICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTElORUFSKTtcbiAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfUywgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1QsIGdsLkNMQU1QX1RPX0VER0UpO1xuXG4gIC8vIGF0dGFjaCB0aGUgdGV4dHVyZSBhcyB0aGUgZmlyc3QgY29sb3IgYXR0YWNobWVudFxuICBnbC5mcmFtZWJ1ZmZlclRleHR1cmUyRChnbC5GUkFNRUJVRkZFUiwgZ2wuQ09MT1JfQVRUQUNITUVOVDAsIGdsLlRFWFRVUkVfMkQsIHRhcmdldFRleHR1cmUsIDApO1xuICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIG51bGwpO1xuICBmYi5zZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRTaXplcyA9IGZ1bmN0aW9uICh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGFyZ2V0VGV4dHVyZSk7XG4gICAgZ2wudGV4SW1hZ2UyRChnbC5URVhUVVJFXzJELCAwLCBnbC5SR0JBLCB3aWR0aCwgaGVpZ2h0LCAwLCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCBudWxsKTtcbiAgfTtcbiAgcmV0dXJuIGZiO1xufVxuXG4vKipcbiAqIENvbW1vbiB1dGlsaXRpZXNcbiAqIEBtb2R1bGUgZ2xNYXRyaXhcbiAqL1xuLy8gQ29uZmlndXJhdGlvbiBDb25zdGFudHNcbnZhciBBUlJBWV9UWVBFID0gdHlwZW9mIEZsb2F0MzJBcnJheSAhPT0gJ3VuZGVmaW5lZCcgPyBGbG9hdDMyQXJyYXkgOiBBcnJheTtcbmlmICghTWF0aC5oeXBvdCkgTWF0aC5oeXBvdCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHkgPSAwLFxuICAgICAgaSA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cbiAgd2hpbGUgKGktLSkge1xuICAgIHkgKz0gYXJndW1lbnRzW2ldICogYXJndW1lbnRzW2ldO1xuICB9XG5cbiAgcmV0dXJuIE1hdGguc3FydCh5KTtcbn07XG5cbi8qKlxuICogM3gzIE1hdHJpeFxuICogQG1vZHVsZSBtYXQzXG4gKi9cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGlkZW50aXR5IG1hdDNcbiAqXG4gKiBAcmV0dXJucyB7bWF0M30gYSBuZXcgM3gzIG1hdHJpeFxuICovXG5cbmZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgdmFyIG91dCA9IG5ldyBBUlJBWV9UWVBFKDkpO1xuXG4gIGlmIChBUlJBWV9UWVBFICE9IEZsb2F0MzJBcnJheSkge1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAwO1xuICAgIG91dFs1XSA9IDA7XG4gICAgb3V0WzZdID0gMDtcbiAgICBvdXRbN10gPSAwO1xuICB9XG5cbiAgb3V0WzBdID0gMTtcbiAgb3V0WzRdID0gMTtcbiAgb3V0WzhdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogU2V0IGEgbWF0MyB0byB0aGUgaWRlbnRpdHkgbWF0cml4XG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xuXG5mdW5jdGlvbiBpZGVudGl0eShvdXQpIHtcbiAgb3V0WzBdID0gMTtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gMTtcbiAgb3V0WzVdID0gMDtcbiAgb3V0WzZdID0gMDtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogTXVsdGlwbGllcyB0d28gbWF0MydzXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xuXG5mdW5jdGlvbiBtdWx0aXBseShvdXQsIGEsIGIpIHtcbiAgdmFyIGEwMCA9IGFbMF0sXG4gICAgICBhMDEgPSBhWzFdLFxuICAgICAgYTAyID0gYVsyXTtcbiAgdmFyIGExMCA9IGFbM10sXG4gICAgICBhMTEgPSBhWzRdLFxuICAgICAgYTEyID0gYVs1XTtcbiAgdmFyIGEyMCA9IGFbNl0sXG4gICAgICBhMjEgPSBhWzddLFxuICAgICAgYTIyID0gYVs4XTtcbiAgdmFyIGIwMCA9IGJbMF0sXG4gICAgICBiMDEgPSBiWzFdLFxuICAgICAgYjAyID0gYlsyXTtcbiAgdmFyIGIxMCA9IGJbM10sXG4gICAgICBiMTEgPSBiWzRdLFxuICAgICAgYjEyID0gYls1XTtcbiAgdmFyIGIyMCA9IGJbNl0sXG4gICAgICBiMjEgPSBiWzddLFxuICAgICAgYjIyID0gYls4XTtcbiAgb3V0WzBdID0gYjAwICogYTAwICsgYjAxICogYTEwICsgYjAyICogYTIwO1xuICBvdXRbMV0gPSBiMDAgKiBhMDEgKyBiMDEgKiBhMTEgKyBiMDIgKiBhMjE7XG4gIG91dFsyXSA9IGIwMCAqIGEwMiArIGIwMSAqIGExMiArIGIwMiAqIGEyMjtcbiAgb3V0WzNdID0gYjEwICogYTAwICsgYjExICogYTEwICsgYjEyICogYTIwO1xuICBvdXRbNF0gPSBiMTAgKiBhMDEgKyBiMTEgKiBhMTEgKyBiMTIgKiBhMjE7XG4gIG91dFs1XSA9IGIxMCAqIGEwMiArIGIxMSAqIGExMiArIGIxMiAqIGEyMjtcbiAgb3V0WzZdID0gYjIwICogYTAwICsgYjIxICogYTEwICsgYjIyICogYTIwO1xuICBvdXRbN10gPSBiMjAgKiBhMDEgKyBiMjEgKiBhMTEgKyBiMjIgKiBhMjE7XG4gIG91dFs4XSA9IGIyMCAqIGEwMiArIGIyMSAqIGExMiArIGIyMiAqIGEyMjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogVHJhbnNsYXRlIGEgbWF0MyBieSB0aGUgZ2l2ZW4gdmVjdG9yXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBhIHRoZSBtYXRyaXggdG8gdHJhbnNsYXRlXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gdiB2ZWN0b3IgdG8gdHJhbnNsYXRlIGJ5XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cblxuZnVuY3Rpb24gdHJhbnNsYXRlKG91dCwgYSwgdikge1xuICB2YXIgYTAwID0gYVswXSxcbiAgICAgIGEwMSA9IGFbMV0sXG4gICAgICBhMDIgPSBhWzJdLFxuICAgICAgYTEwID0gYVszXSxcbiAgICAgIGExMSA9IGFbNF0sXG4gICAgICBhMTIgPSBhWzVdLFxuICAgICAgYTIwID0gYVs2XSxcbiAgICAgIGEyMSA9IGFbN10sXG4gICAgICBhMjIgPSBhWzhdLFxuICAgICAgeCA9IHZbMF0sXG4gICAgICB5ID0gdlsxXTtcbiAgb3V0WzBdID0gYTAwO1xuICBvdXRbMV0gPSBhMDE7XG4gIG91dFsyXSA9IGEwMjtcbiAgb3V0WzNdID0gYTEwO1xuICBvdXRbNF0gPSBhMTE7XG4gIG91dFs1XSA9IGExMjtcbiAgb3V0WzZdID0geCAqIGEwMCArIHkgKiBhMTAgKyBhMjA7XG4gIG91dFs3XSA9IHggKiBhMDEgKyB5ICogYTExICsgYTIxO1xuICBvdXRbOF0gPSB4ICogYTAyICsgeSAqIGExMiArIGEyMjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUm90YXRlcyBhIG1hdDMgYnkgdGhlIGdpdmVuIGFuZ2xlXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBhIHRoZSBtYXRyaXggdG8gcm90YXRlXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5cbmZ1bmN0aW9uIHJvdGF0ZShvdXQsIGEsIHJhZCkge1xuICB2YXIgYTAwID0gYVswXSxcbiAgICAgIGEwMSA9IGFbMV0sXG4gICAgICBhMDIgPSBhWzJdLFxuICAgICAgYTEwID0gYVszXSxcbiAgICAgIGExMSA9IGFbNF0sXG4gICAgICBhMTIgPSBhWzVdLFxuICAgICAgYTIwID0gYVs2XSxcbiAgICAgIGEyMSA9IGFbN10sXG4gICAgICBhMjIgPSBhWzhdLFxuICAgICAgcyA9IE1hdGguc2luKHJhZCksXG4gICAgICBjID0gTWF0aC5jb3MocmFkKTtcbiAgb3V0WzBdID0gYyAqIGEwMCArIHMgKiBhMTA7XG4gIG91dFsxXSA9IGMgKiBhMDEgKyBzICogYTExO1xuICBvdXRbMl0gPSBjICogYTAyICsgcyAqIGExMjtcbiAgb3V0WzNdID0gYyAqIGExMCAtIHMgKiBhMDA7XG4gIG91dFs0XSA9IGMgKiBhMTEgLSBzICogYTAxO1xuICBvdXRbNV0gPSBjICogYTEyIC0gcyAqIGEwMjtcbiAgb3V0WzZdID0gYTIwO1xuICBvdXRbN10gPSBhMjE7XG4gIG91dFs4XSA9IGEyMjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogU2NhbGVzIHRoZSBtYXQzIGJ5IHRoZSBkaW1lbnNpb25zIGluIHRoZSBnaXZlbiB2ZWMyXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBhIHRoZSBtYXRyaXggdG8gcm90YXRlXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gdiB0aGUgdmVjMiB0byBzY2FsZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKiovXG5cbmZ1bmN0aW9uIHNjYWxlKG91dCwgYSwgdikge1xuICB2YXIgeCA9IHZbMF0sXG4gICAgICB5ID0gdlsxXTtcbiAgb3V0WzBdID0geCAqIGFbMF07XG4gIG91dFsxXSA9IHggKiBhWzFdO1xuICBvdXRbMl0gPSB4ICogYVsyXTtcbiAgb3V0WzNdID0geSAqIGFbM107XG4gIG91dFs0XSA9IHkgKiBhWzRdO1xuICBvdXRbNV0gPSB5ICogYVs1XTtcbiAgb3V0WzZdID0gYVs2XTtcbiAgb3V0WzddID0gYVs3XTtcbiAgb3V0WzhdID0gYVs4XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogR2VuZXJhdGVzIGEgMkQgcHJvamVjdGlvbiBtYXRyaXggd2l0aCB0aGUgZ2l2ZW4gYm91bmRzXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgbWF0MyBmcnVzdHVtIG1hdHJpeCB3aWxsIGJlIHdyaXR0ZW4gaW50b1xuICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIFdpZHRoIG9mIHlvdXIgZ2wgY29udGV4dFxuICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCBIZWlnaHQgb2YgZ2wgY29udGV4dFxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5cbmZ1bmN0aW9uIHByb2plY3Rpb24ob3V0LCB3aWR0aCwgaGVpZ2h0KSB7XG4gIG91dFswXSA9IDIgLyB3aWR0aDtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gLTIgLyBoZWlnaHQ7XG4gIG91dFs1XSA9IDA7XG4gIG91dFs2XSA9IC0xO1xuICBvdXRbN10gPSAxO1xuICBvdXRbOF0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuXG4vLyBBIFwidGV4dHVyZSBhdGxhc1wiIGlzIGEgYmlnIGNhbnZhcywgYW5kIHNlY3Rpb25zIG9mIGl0IGFyZSB1c2VkIGFzIHRleHR1cmVzIGZvciBub2Rlcy9sYWJlbHMuXG5cbi8qKlxuICogQSBzaW5nbGUgc3F1YXJlIHRleHR1cmUgYXRsYXMgKGFsc28ga25vd24gYXMgYSBcInNwcml0ZSBzaGVldFwiKS5cbiAqL1xudmFyIEF0bGFzID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQXRsYXMociwgdGV4U2l6ZSwgdGV4Um93cywgY3JlYXRlVGV4dHVyZUNhbnZhcykge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBBdGxhcyk7XG4gICAgdGhpcy5kZWJ1Z0lEID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTAwMDApO1xuICAgIHRoaXMuciA9IHI7XG4gICAgdGhpcy50ZXhTaXplID0gdGV4U2l6ZTtcbiAgICB0aGlzLnRleFJvd3MgPSB0ZXhSb3dzO1xuICAgIHRoaXMudGV4SGVpZ2h0ID0gTWF0aC5mbG9vcih0ZXhTaXplIC8gdGV4Um93cyk7XG4gICAgdGhpcy5lbmFibGVXcmFwcGluZyA9IHRydWU7IC8vIGhhcmRjb2RlZCBmb3Igbm93LCBjYW4gYmUgbWFkZSBhbiBvcHRpb25cblxuICAgIHRoaXMubG9ja2VkID0gZmFsc2U7IC8vIG9uY2UgYW4gYXRsYXMgaXMgbG9ja2VkIGl0IGNhbiBubyBsb25nZXIgYmUgZHJhd24gdG9cbiAgICB0aGlzLnRleHR1cmUgPSBudWxsOyAvLyBXZWJHTFRleHR1cmUgb2JqZWN0XG4gICAgdGhpcy5uZWVkc0J1ZmZlciA9IHRydWU7XG5cbiAgICAvLyBhIFwibG9jYXRpb25cIiBpcyBhbiBwb2ludGVyIGludG8gdGhlIGF0bGFzIHdpdGggYSAncm93JyBhbmQgJ3gnIGZpZWxkc1xuICAgIHRoaXMuZnJlZVBvaW50ZXIgPSB7XG4gICAgICB4OiAwLFxuICAgICAgcm93OiAwXG4gICAgfTtcblxuICAgIC8vIG1hcCBmcm9tIHRoZSBzdHlsZSBrZXkgdG8gdGhlIHJvdy94IHdoZXJlIHRoZSB0ZXh0dXJlIHN0YXJ0c1xuICAgIC8vIGlmIHRoZSB0ZXh0dXJlIHdyYXBzIHRoZW4gdGhlcmUncyBhIHNlY29uZCBsb2NhdGlvblxuICAgIHRoaXMua2V5VG9Mb2NhdGlvbiA9IG5ldyBNYXAoKTsgLy8gc3R5bGVLZXkgLT4gWyBsb2NhdGlvbiwgbG9jYXRpb24gXVxuXG4gICAgdGhpcy5jYW52YXMgPSBjcmVhdGVUZXh0dXJlQ2FudmFzKHIsIHRleFNpemUsIHRleFNpemUpO1xuICAgIHRoaXMuc2NyYXRjaCA9IGNyZWF0ZVRleHR1cmVDYW52YXMociwgdGV4U2l6ZSwgdGhpcy50ZXhIZWlnaHQsICdzY3JhdGNoJyk7XG4gIH1cbiAgcmV0dXJuIF9jcmVhdGVDbGFzcyhBdGxhcywgW3tcbiAgICBrZXk6IFwibG9ja1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBsb2NrKCkge1xuICAgICAgdGhpcy5sb2NrZWQgPSB0cnVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRLZXlzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEtleXMoKSB7XG4gICAgICByZXR1cm4gbmV3IFNldCh0aGlzLmtleVRvTG9jYXRpb24ua2V5cygpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0U2NhbGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0U2NhbGUoX3JlZikge1xuICAgICAgdmFyIHcgPSBfcmVmLncsXG4gICAgICAgIGggPSBfcmVmLmg7XG4gICAgICB2YXIgdGV4SGVpZ2h0ID0gdGhpcy50ZXhIZWlnaHQsXG4gICAgICAgIG1heFRleFdpZHRoID0gdGhpcy50ZXhTaXplO1xuICAgICAgLy8gdHJ5IHRvIGZpdCB0byB0aGUgaGVpZ2h0IG9mIGEgcm93XG4gICAgICB2YXIgc2NhbGUgPSB0ZXhIZWlnaHQgLyBoOyAvLyBUT0RPIHdoYXQgYWJvdXQgcGl4ZWxSYXRpbz9cbiAgICAgIHZhciB0ZXhXID0gdyAqIHNjYWxlO1xuICAgICAgdmFyIHRleEggPSBoICogc2NhbGU7XG4gICAgICAvLyBpZiB0aGUgc2NhbGVkIHdpZHRoIGlzIHRvbyB3aWRlIHRoZW4gc2NhbGUgdG8gZml0IG1heCB3aWR0aCBpbnN0ZWFkXG4gICAgICBpZiAodGV4VyA+IG1heFRleFdpZHRoKSB7XG4gICAgICAgIHNjYWxlID0gbWF4VGV4V2lkdGggLyB3O1xuICAgICAgICB0ZXhXID0gdyAqIHNjYWxlO1xuICAgICAgICB0ZXhIID0gaCAqIHNjYWxlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2NhbGU6IHNjYWxlLFxuICAgICAgICB0ZXhXOiB0ZXhXLFxuICAgICAgICB0ZXhIOiB0ZXhIXG4gICAgICB9O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJkcmF3XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRyYXcoa2V5LCBiYiwgZG9EcmF3aW5nKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgaWYgKHRoaXMubG9ja2VkKSB0aHJvdyBuZXcgRXJyb3IoJ2NhblxcJ3QgZHJhdywgYXRsYXMgaXMgbG9ja2VkJyk7XG4gICAgICB2YXIgdGV4U2l6ZSA9IHRoaXMudGV4U2l6ZSxcbiAgICAgICAgdGV4Um93cyA9IHRoaXMudGV4Um93cyxcbiAgICAgICAgdGV4SGVpZ2h0ID0gdGhpcy50ZXhIZWlnaHQ7XG4gICAgICB2YXIgX3RoaXMkZ2V0U2NhbGUgPSB0aGlzLmdldFNjYWxlKGJiKSxcbiAgICAgICAgc2NhbGUgPSBfdGhpcyRnZXRTY2FsZS5zY2FsZSxcbiAgICAgICAgdGV4VyA9IF90aGlzJGdldFNjYWxlLnRleFcsXG4gICAgICAgIHRleEggPSBfdGhpcyRnZXRTY2FsZS50ZXhIO1xuICAgICAgdmFyIGRyYXdBdCA9IGZ1bmN0aW9uIGRyYXdBdChsb2NhdGlvbiwgY2FudmFzKSB7XG4gICAgICAgIGlmIChkb0RyYXdpbmcgJiYgY2FudmFzKSB7XG4gICAgICAgICAgdmFyIGNvbnRleHQgPSBjYW52YXMuY29udGV4dDtcbiAgICAgICAgICB2YXIgeCA9IGxvY2F0aW9uLngsXG4gICAgICAgICAgICByb3cgPSBsb2NhdGlvbi5yb3c7XG4gICAgICAgICAgdmFyIHhPZmZzZXQgPSB4O1xuICAgICAgICAgIHZhciB5T2Zmc2V0ID0gdGV4SGVpZ2h0ICogcm93O1xuICAgICAgICAgIGNvbnRleHQuc2F2ZSgpO1xuICAgICAgICAgIGNvbnRleHQudHJhbnNsYXRlKHhPZmZzZXQsIHlPZmZzZXQpO1xuICAgICAgICAgIGNvbnRleHQuc2NhbGUoc2NhbGUsIHNjYWxlKTtcbiAgICAgICAgICBkb0RyYXdpbmcoY29udGV4dCwgYmIpO1xuICAgICAgICAgIGNvbnRleHQucmVzdG9yZSgpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgdmFyIGxvY2F0aW9ucyA9IFtudWxsLCBudWxsXTtcbiAgICAgIHZhciBkcmF3Tm9ybWFsID0gZnVuY3Rpb24gZHJhd05vcm1hbCgpIHtcbiAgICAgICAgLy8gZG9uJ3QgbmVlZCB0byB3cmFwLCBkcmF3IGRpcmVjdGx5IG9uIHRoZSBjYW52YXNcbiAgICAgICAgZHJhd0F0KF90aGlzLmZyZWVQb2ludGVyLCBfdGhpcy5jYW52YXMpO1xuICAgICAgICBsb2NhdGlvbnNbMF0gPSB7XG4gICAgICAgICAgeDogX3RoaXMuZnJlZVBvaW50ZXIueCxcbiAgICAgICAgICB5OiBfdGhpcy5mcmVlUG9pbnRlci5yb3cgKiB0ZXhIZWlnaHQsXG4gICAgICAgICAgdzogdGV4VyxcbiAgICAgICAgICBoOiB0ZXhIXG4gICAgICAgIH07XG4gICAgICAgIGxvY2F0aW9uc1sxXSA9IHtcbiAgICAgICAgICAvLyBjcmVhdGUgYSBzZWNvbmQgbG9jYXRpb24gd2l0aCBhIHdpZHRoIG9mIDAsIGZvciBjb252ZW5pZW5jZVxuICAgICAgICAgIHg6IF90aGlzLmZyZWVQb2ludGVyLnggKyB0ZXhXLFxuICAgICAgICAgIHk6IF90aGlzLmZyZWVQb2ludGVyLnJvdyAqIHRleEhlaWdodCxcbiAgICAgICAgICB3OiAwLFxuICAgICAgICAgIGg6IHRleEhcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBtb3ZlIHRoZSBwb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhlIHRleHR1cmVcbiAgICAgICAgX3RoaXMuZnJlZVBvaW50ZXIueCArPSB0ZXhXO1xuICAgICAgICBpZiAoX3RoaXMuZnJlZVBvaW50ZXIueCA9PSB0ZXhTaXplKSB7XG4gICAgICAgICAgX3RoaXMuZnJlZVBvaW50ZXIueCA9IDA7XG4gICAgICAgICAgX3RoaXMuZnJlZVBvaW50ZXIucm93Kys7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB2YXIgZHJhd1dyYXBwZWQgPSBmdW5jdGlvbiBkcmF3V3JhcHBlZCgpIHtcbiAgICAgICAgdmFyIHNjcmF0Y2ggPSBfdGhpcy5zY3JhdGNoLFxuICAgICAgICAgIGNhbnZhcyA9IF90aGlzLmNhbnZhcztcblxuICAgICAgICAvLyBEcmF3IHRvIHRoZSBzY3JhdGNoIGNhbnZhc1xuICAgICAgICBzY3JhdGNoLmNsZWFyKCk7XG4gICAgICAgIGRyYXdBdCh7XG4gICAgICAgICAgeDogMCxcbiAgICAgICAgICByb3c6IDBcbiAgICAgICAgfSwgc2NyYXRjaCk7XG4gICAgICAgIHZhciBmaXJzdFRleFcgPSB0ZXhTaXplIC0gX3RoaXMuZnJlZVBvaW50ZXIueDtcbiAgICAgICAgdmFyIHNlY29uZFRleFcgPSB0ZXhXIC0gZmlyc3RUZXhXO1xuICAgICAgICB2YXIgaCA9IHRleEhlaWdodDtcbiAgICAgICAge1xuICAgICAgICAgIC8vIGNvcHkgZmlyc3QgcGFydCBvZiBzY3JhdGNoIHRvIHRoZSBmaXJzdCB0ZXh0dXJlXG4gICAgICAgICAgdmFyIGR4ID0gX3RoaXMuZnJlZVBvaW50ZXIueDtcbiAgICAgICAgICB2YXIgZHkgPSBfdGhpcy5mcmVlUG9pbnRlci5yb3cgKiB0ZXhIZWlnaHQ7XG4gICAgICAgICAgdmFyIHcgPSBmaXJzdFRleFc7XG4gICAgICAgICAgY2FudmFzLmNvbnRleHQuZHJhd0ltYWdlKHNjcmF0Y2gsIDAsIDAsIHcsIGgsIGR4LCBkeSwgdywgaCk7XG4gICAgICAgICAgbG9jYXRpb25zWzBdID0ge1xuICAgICAgICAgICAgeDogZHgsXG4gICAgICAgICAgICB5OiBkeSxcbiAgICAgICAgICAgIHc6IHcsXG4gICAgICAgICAgICBoOiB0ZXhIXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB7XG4gICAgICAgICAgLy8gY29weSBzZWNvbmQgcGFydCBvZiBzY3JhdGNoIHRvIHRoZSBzZWNvbmQgdGV4dHVyZVxuICAgICAgICAgIHZhciBzeCA9IGZpcnN0VGV4VztcbiAgICAgICAgICB2YXIgX2R5ID0gKF90aGlzLmZyZWVQb2ludGVyLnJvdyArIDEpICogdGV4SGVpZ2h0O1xuICAgICAgICAgIHZhciBfdyA9IHNlY29uZFRleFc7XG4gICAgICAgICAgaWYgKGNhbnZhcykge1xuICAgICAgICAgICAgY2FudmFzLmNvbnRleHQuZHJhd0ltYWdlKHNjcmF0Y2gsIHN4LCAwLCBfdywgaCwgMCwgX2R5LCBfdywgaCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxvY2F0aW9uc1sxXSA9IHtcbiAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICB5OiBfZHksXG4gICAgICAgICAgICB3OiBfdyxcbiAgICAgICAgICAgIGg6IHRleEhcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIF90aGlzLmZyZWVQb2ludGVyLnggPSBzZWNvbmRUZXhXO1xuICAgICAgICBfdGhpcy5mcmVlUG9pbnRlci5yb3crKztcbiAgICAgIH07XG4gICAgICB2YXIgbW92ZVRvU3RhcnRPZk5leHRSb3cgPSBmdW5jdGlvbiBtb3ZlVG9TdGFydE9mTmV4dFJvdygpIHtcbiAgICAgICAgX3RoaXMuZnJlZVBvaW50ZXIueCA9IDA7XG4gICAgICAgIF90aGlzLmZyZWVQb2ludGVyLnJvdysrO1xuICAgICAgfTtcbiAgICAgIGlmICh0aGlzLmZyZWVQb2ludGVyLnggKyB0ZXhXIDw9IHRleFNpemUpIHtcbiAgICAgICAgLy8gVGhlcmUncyBlbm91Z2ggc3BhY2UgaW4gdGhlIGN1cnJlbnQgcm93XG4gICAgICAgIGRyYXdOb3JtYWwoKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5mcmVlUG9pbnRlci5yb3cgPj0gdGV4Um93cyAtIDEpIHtcbiAgICAgICAgLy8gTmVlZCB0byBtb3ZlIHRvIHRoZSBuZXh0IHJvdywgYnV0IHRoZXJlIGFyZSBubyBtb3JlIHJvd3MsIGF0bGFzIGlzIGZ1bGwuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5mcmVlUG9pbnRlci54ID09PSB0ZXhTaXplKSB7XG4gICAgICAgIC8vIGhhcHBlbiB0byBiZSByaWdodCBhdCBlbmQgb2YgY3VycmVudCByb3dcbiAgICAgICAgbW92ZVRvU3RhcnRPZk5leHRSb3coKTtcbiAgICAgICAgZHJhd05vcm1hbCgpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmVuYWJsZVdyYXBwaW5nKSB7XG4gICAgICAgIC8vIGRyYXcgcGFydCBvZiB0aGUgdGV4dHVyZSB0byB0aGUgZW5kIG9mIHRoZSBjdXJlbnQgcm93LCB0aGVuIHdyYXAgdG8gdGhlIG5leHQgcm93XG4gICAgICAgIGRyYXdXcmFwcGVkKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBtb3ZlIHRvIHRoZSBzdGFydCBvZiB0aGUgbmV4dCByb3csIHRoZW4gZHJhdyBub3JtYWxseVxuICAgICAgICBtb3ZlVG9TdGFydE9mTmV4dFJvdygpO1xuICAgICAgICBkcmF3Tm9ybWFsKCk7XG4gICAgICB9XG4gICAgICB0aGlzLmtleVRvTG9jYXRpb24uc2V0KGtleSwgbG9jYXRpb25zKTtcbiAgICAgIHRoaXMubmVlZHNCdWZmZXIgPSB0cnVlO1xuICAgICAgcmV0dXJuIGxvY2F0aW9ucztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0T2Zmc2V0c1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRPZmZzZXRzKGtleSkge1xuICAgICAgcmV0dXJuIHRoaXMua2V5VG9Mb2NhdGlvbi5nZXQoa2V5KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaXNFbXB0eVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpc0VtcHR5KCkge1xuICAgICAgcmV0dXJuIHRoaXMuZnJlZVBvaW50ZXIueCA9PT0gMCAmJiB0aGlzLmZyZWVQb2ludGVyLnJvdyA9PT0gMDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY2FuRml0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNhbkZpdChiYikge1xuICAgICAgaWYgKHRoaXMubG9ja2VkKSByZXR1cm4gZmFsc2U7XG4gICAgICB2YXIgdGV4U2l6ZSA9IHRoaXMudGV4U2l6ZSxcbiAgICAgICAgdGV4Um93cyA9IHRoaXMudGV4Um93cztcbiAgICAgIHZhciBfdGhpcyRnZXRTY2FsZTIgPSB0aGlzLmdldFNjYWxlKGJiKSxcbiAgICAgICAgdGV4VyA9IF90aGlzJGdldFNjYWxlMi50ZXhXO1xuICAgICAgaWYgKHRoaXMuZnJlZVBvaW50ZXIueCArIHRleFcgPiB0ZXhTaXplKSB7XG4gICAgICAgIC8vIG5lZWQgdG8gd3JhcFxuICAgICAgICByZXR1cm4gdGhpcy5mcmVlUG9pbnRlci5yb3cgPCB0ZXhSb3dzIC0gMTsgLy8gcmV0dXJuIHRydWUgaWYgdGhlcmUncyBhIHJvdyB0byB3cmFwIHRvXG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBjYWxsZWQgb24gZXZlcnkgZnJhbWVcbiAgfSwge1xuICAgIGtleTogXCJidWZmZXJJZk5lZWRlZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWZmZXJJZk5lZWRlZChnbCkge1xuICAgICAgaWYgKCF0aGlzLnRleHR1cmUpIHtcbiAgICAgICAgdGhpcy50ZXh0dXJlID0gY3JlYXRlVGV4dHVyZShnbCwgdGhpcy5kZWJ1Z0lEKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm5lZWRzQnVmZmVyKSB7XG4gICAgICAgIHRoaXMudGV4dHVyZS5idWZmZXIodGhpcy5jYW52YXMpO1xuICAgICAgICB0aGlzLm5lZWRzQnVmZmVyID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLmxvY2tlZCkge1xuICAgICAgICAgIHRoaXMuY2FudmFzID0gbnVsbDtcbiAgICAgICAgICB0aGlzLnNjcmF0Y2ggPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImRpc3Bvc2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGlzcG9zZSgpIHtcbiAgICAgIGlmICh0aGlzLnRleHR1cmUpIHtcbiAgICAgICAgdGhpcy50ZXh0dXJlLmRlbGV0ZVRleHR1cmUoKTtcbiAgICAgICAgdGhpcy50ZXh0dXJlID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2FudmFzID0gbnVsbDtcbiAgICAgIHRoaXMuc2NyYXRjaCA9IG51bGw7XG4gICAgICB0aGlzLmxvY2tlZCA9IHRydWU7XG4gICAgfVxuICB9XSk7XG59KCk7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHRleHR1cmUgYXRsYXNlcywgYWxsIG9mIHRoZSBzYW1lIFwicmVuZGVyIHR5cGVcIi4gXG4gKiAoJ25vZGUtYm9keScgaXMgYW4gZXhhbXBsZSBvZiBhIHJlbmRlciB0eXBlLilcbiAqIEFuIEF0bGFzQ29sbGVjdGlvbiBjYW4gYWxzbyBiZSBub3RpZmllZCB3aGVuIGEgdGV4dHVyZSBpcyBubyBsb25nZXIgbmVlZGVkLCBcbiAqIGFuZCBpdCBjYW4gZ2FyYmFnZSBjb2xsZWN0IHRoZSB1bnVzZWQgdGV4dHVyZXMuXG4gKi9cbnZhciBBdGxhc0NvbGxlY3Rpb24gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBBdGxhc0NvbGxlY3Rpb24ociwgdGV4U2l6ZSwgdGV4Um93cywgY3JlYXRlVGV4dHVyZUNhbnZhcykge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBBdGxhc0NvbGxlY3Rpb24pO1xuICAgIHRoaXMuciA9IHI7XG4gICAgdGhpcy50ZXhTaXplID0gdGV4U2l6ZTtcbiAgICB0aGlzLnRleFJvd3MgPSB0ZXhSb3dzO1xuICAgIHRoaXMuY3JlYXRlVGV4dHVyZUNhbnZhcyA9IGNyZWF0ZVRleHR1cmVDYW52YXM7XG4gICAgdGhpcy5hdGxhc2VzID0gW107XG4gICAgdGhpcy5zdHlsZUtleVRvQXRsYXMgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5tYXJrZWRLZXlzID0gbmV3IFNldCgpOyAvLyBtYXJrZWQgZm9yIGdhcmJhZ2UgY29sbGVjdGlvblxuICB9XG4gIHJldHVybiBfY3JlYXRlQ2xhc3MoQXRsYXNDb2xsZWN0aW9uLCBbe1xuICAgIGtleTogXCJnZXRLZXlzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEtleXMoKSB7XG4gICAgICByZXR1cm4gbmV3IFNldCh0aGlzLnN0eWxlS2V5VG9BdGxhcy5rZXlzKCkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfY3JlYXRlQXRsYXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2NyZWF0ZUF0bGFzKCkge1xuICAgICAgdmFyIHIgPSB0aGlzLnIsXG4gICAgICAgIHRleFNpemUgPSB0aGlzLnRleFNpemUsXG4gICAgICAgIHRleFJvd3MgPSB0aGlzLnRleFJvd3MsXG4gICAgICAgIGNyZWF0ZVRleHR1cmVDYW52YXMgPSB0aGlzLmNyZWF0ZVRleHR1cmVDYW52YXM7XG4gICAgICByZXR1cm4gbmV3IEF0bGFzKHIsIHRleFNpemUsIHRleFJvd3MsIGNyZWF0ZVRleHR1cmVDYW52YXMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfZ2V0U2NyYXRjaENhbnZhc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfZ2V0U2NyYXRjaENhbnZhcygpIHtcbiAgICAgIGlmICghdGhpcy5zY3JhdGNoKSB7XG4gICAgICAgIHZhciByID0gdGhpcy5yLFxuICAgICAgICAgIHRleFNpemUgPSB0aGlzLnRleFNpemUsXG4gICAgICAgICAgdGV4Um93cyA9IHRoaXMudGV4Um93cyxcbiAgICAgICAgICBjcmVhdGVUZXh0dXJlQ2FudmFzID0gdGhpcy5jcmVhdGVUZXh0dXJlQ2FudmFzO1xuICAgICAgICB2YXIgdGV4SGVpZ2h0ID0gTWF0aC5mbG9vcih0ZXhTaXplIC8gdGV4Um93cyk7XG4gICAgICAgIHRoaXMuc2NyYXRjaCA9IGNyZWF0ZVRleHR1cmVDYW52YXMociwgdGV4U2l6ZSwgdGV4SGVpZ2h0LCAnc2NyYXRjaCcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuc2NyYXRjaDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZHJhd1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkcmF3KGtleSwgYmIsIGRvRHJhd2luZykge1xuICAgICAgdmFyIGF0bGFzID0gdGhpcy5zdHlsZUtleVRvQXRsYXMuZ2V0KGtleSk7XG4gICAgICBpZiAoIWF0bGFzKSB7XG4gICAgICAgIC8vIGNoZWNrIGZvciBzcGFjZSBhdCB0aGUgZW5kIG9mIHRoZSBsYXN0IGF0bGFzXG4gICAgICAgIGF0bGFzID0gdGhpcy5hdGxhc2VzW3RoaXMuYXRsYXNlcy5sZW5ndGggLSAxXTtcbiAgICAgICAgaWYgKCFhdGxhcyB8fCAhYXRsYXMuY2FuRml0KGJiKSkge1xuICAgICAgICAgIGlmIChhdGxhcykgYXRsYXMubG9jaygpO1xuICAgICAgICAgIC8vIGNyZWF0ZSBhIG5ldyBhdGxhc1xuICAgICAgICAgIGF0bGFzID0gdGhpcy5fY3JlYXRlQXRsYXMoKTtcbiAgICAgICAgICB0aGlzLmF0bGFzZXMucHVzaChhdGxhcyk7XG4gICAgICAgIH1cbiAgICAgICAgYXRsYXMuZHJhdyhrZXksIGJiLCBkb0RyYXdpbmcpO1xuICAgICAgICB0aGlzLnN0eWxlS2V5VG9BdGxhcy5zZXQoa2V5LCBhdGxhcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXRsYXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldEF0bGFzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEF0bGFzKGtleSkge1xuICAgICAgcmV0dXJuIHRoaXMuc3R5bGVLZXlUb0F0bGFzLmdldChrZXkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJoYXNBdGxhc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYXNBdGxhcyhrZXkpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0eWxlS2V5VG9BdGxhcy5oYXMoa2V5KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibWFya0tleUZvckdDXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1hcmtLZXlGb3JHQyhrZXkpIHtcbiAgICAgIHRoaXMubWFya2VkS2V5cy5hZGQoa2V5KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2NcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2MoKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcbiAgICAgIHZhciBtYXJrZWRLZXlzID0gdGhpcy5tYXJrZWRLZXlzO1xuICAgICAgaWYgKG1hcmtlZEtleXMuc2l6ZSA9PT0gMCkge1xuICAgICAgICBjb25zb2xlLmxvZygnbm90aGluZyB0byBnYXJiYWdlIGNvbGxlY3QnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIG5ld0F0bGFzZXMgPSBbXTtcbiAgICAgIHZhciBuZXdTdHlsZUtleVRvQXRsYXMgPSBuZXcgTWFwKCk7XG4gICAgICB2YXIgbmV3QXRsYXMgPSBudWxsO1xuICAgICAgdmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHRoaXMuYXRsYXNlcyksXG4gICAgICAgIF9zdGVwO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoKSB7XG4gICAgICAgICAgdmFyIGF0bGFzID0gX3N0ZXAudmFsdWU7XG4gICAgICAgICAgdmFyIGtleXMgPSBhdGxhcy5nZXRLZXlzKCk7XG4gICAgICAgICAgdmFyIGtleXNUb0NvbGxlY3QgPSBpbnRlcnNlY3Rpb24obWFya2VkS2V5cywga2V5cyk7XG4gICAgICAgICAgaWYgKGtleXNUb0NvbGxlY3Quc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgLy8gdGhpcyBhdGxhcyBjYW4gc3RpbGwgYmUgdXNlZFxuICAgICAgICAgICAgbmV3QXRsYXNlcy5wdXNoKGF0bGFzKTtcbiAgICAgICAgICAgIGtleXMuZm9yRWFjaChmdW5jdGlvbiAoaykge1xuICAgICAgICAgICAgICByZXR1cm4gbmV3U3R5bGVLZXlUb0F0bGFzLnNldChrLCBhdGxhcyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiAxOyAvLyBjb250aW51ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIW5ld0F0bGFzKSB7XG4gICAgICAgICAgICBuZXdBdGxhcyA9IF90aGlzMi5fY3JlYXRlQXRsYXMoKTtcbiAgICAgICAgICAgIG5ld0F0bGFzZXMucHVzaChuZXdBdGxhcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBfaXRlcmF0b3IyID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoa2V5cyksXG4gICAgICAgICAgICBfc3RlcDI7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAoX2l0ZXJhdG9yMi5zKCk7ICEoX3N0ZXAyID0gX2l0ZXJhdG9yMi5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgICAgIHZhciBrZXkgPSBfc3RlcDIudmFsdWU7XG4gICAgICAgICAgICAgIGlmICgha2V5c1RvQ29sbGVjdC5oYXMoa2V5KSkge1xuICAgICAgICAgICAgICAgIHZhciBfYXRsYXMkZ2V0T2Zmc2V0cyA9IGF0bGFzLmdldE9mZnNldHMoa2V5KSxcbiAgICAgICAgICAgICAgICAgIF9hdGxhcyRnZXRPZmZzZXRzMiA9IF9zbGljZWRUb0FycmF5KF9hdGxhcyRnZXRPZmZzZXRzLCAyKSxcbiAgICAgICAgICAgICAgICAgIHMxID0gX2F0bGFzJGdldE9mZnNldHMyWzBdLFxuICAgICAgICAgICAgICAgICAgczIgPSBfYXRsYXMkZ2V0T2Zmc2V0czJbMV07XG4gICAgICAgICAgICAgICAgaWYgKCFuZXdBdGxhcy5jYW5GaXQoe1xuICAgICAgICAgICAgICAgICAgdzogczEudyArIHMyLncsXG4gICAgICAgICAgICAgICAgICBoOiBzMS5oXG4gICAgICAgICAgICAgICAgfSkpIHtcbiAgICAgICAgICAgICAgICAgIG5ld0F0bGFzLmxvY2soKTtcbiAgICAgICAgICAgICAgICAgIG5ld0F0bGFzID0gX3RoaXMyLl9jcmVhdGVBdGxhcygpO1xuICAgICAgICAgICAgICAgICAgbmV3QXRsYXNlcy5wdXNoKG5ld0F0bGFzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGF0bGFzLmNhbnZhcykge1xuICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHRleHR1cmUgY2FuJ3QgYmUgY29waWVkIHRoZW4gaXQgd2lsbCBoYXZlIHRvIGJlIHJlZHJhd24gb24gdGhlIG5leHQgZnJhbWVcbiAgICAgICAgICAgICAgICAgIF90aGlzMi5fY29weVRleHR1cmVUb05ld0F0bGFzKGtleSwgYXRsYXMsIG5ld0F0bGFzKTtcbiAgICAgICAgICAgICAgICAgIG5ld1N0eWxlS2V5VG9BdGxhcy5zZXQoa2V5LCBuZXdBdGxhcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBfaXRlcmF0b3IyLmUoZXJyKTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgX2l0ZXJhdG9yMi5mKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGF0bGFzLmRpc3Bvc2UoKTtcbiAgICAgICAgfTtcbiAgICAgICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHtcbiAgICAgICAgICBpZiAoX2xvb3AoKSkgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBfaXRlcmF0b3IuZShlcnIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgX2l0ZXJhdG9yLmYoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYXRsYXNlcyA9IG5ld0F0bGFzZXM7XG4gICAgICB0aGlzLnN0eWxlS2V5VG9BdGxhcyA9IG5ld1N0eWxlS2V5VG9BdGxhcztcbiAgICAgIHRoaXMubWFya2VkS2V5cyA9IG5ldyBTZXQoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX2NvcHlUZXh0dXJlVG9OZXdBdGxhc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfY29weVRleHR1cmVUb05ld0F0bGFzKGtleSwgb2xkQXRsYXMsIG5ld0F0bGFzKSB7XG4gICAgICB2YXIgX29sZEF0bGFzJGdldE9mZnNldHMgPSBvbGRBdGxhcy5nZXRPZmZzZXRzKGtleSksXG4gICAgICAgIF9vbGRBdGxhcyRnZXRPZmZzZXRzMiA9IF9zbGljZWRUb0FycmF5KF9vbGRBdGxhcyRnZXRPZmZzZXRzLCAyKSxcbiAgICAgICAgczEgPSBfb2xkQXRsYXMkZ2V0T2Zmc2V0czJbMF0sXG4gICAgICAgIHMyID0gX29sZEF0bGFzJGdldE9mZnNldHMyWzFdO1xuICAgICAgaWYgKHMyLncgPT09IDApIHtcbiAgICAgICAgLy8gdGhlIHRleHR1cmUgZG9lcyBub3Qgd3JhcCwgZHJhdyBkaXJlY3RseSB0byBuZXcgYXRsYXNcbiAgICAgICAgbmV3QXRsYXMuZHJhdyhrZXksIHMxLCBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICAgIGNvbnRleHQuZHJhd0ltYWdlKG9sZEF0bGFzLmNhbnZhcywgczEueCwgczEueSwgczEudywgczEuaCwgMCwgMCwgczEudywgczEuaCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gdGhlIHRleHR1cmUgd3JhcHMsIGZpcnN0IGRyYXcgYm90aCBwYXJ0cyB0byBhIHNjcmF0Y2ggY2FudmFzXG4gICAgICAgIHZhciBzY3JhdGNoID0gdGhpcy5fZ2V0U2NyYXRjaENhbnZhcygpO1xuICAgICAgICBzY3JhdGNoLmNsZWFyKCk7XG4gICAgICAgIHNjcmF0Y2guY29udGV4dC5kcmF3SW1hZ2Uob2xkQXRsYXMuY2FudmFzLCBzMS54LCBzMS55LCBzMS53LCBzMS5oLCAwLCAwLCBzMS53LCBzMS5oKTtcbiAgICAgICAgc2NyYXRjaC5jb250ZXh0LmRyYXdJbWFnZShvbGRBdGxhcy5jYW52YXMsIHMyLngsIHMyLnksIHMyLncsIHMyLmgsIHMxLncsIDAsIHMyLncsIHMyLmgpO1xuXG4gICAgICAgIC8vIG5vdyBkcmF3IHRoZSBzY3JhdGNoIHRvIHRoZSBuZXcgYXRsYXNcbiAgICAgICAgdmFyIHcgPSBzMS53ICsgczIudztcbiAgICAgICAgdmFyIGggPSBzMS5oO1xuICAgICAgICBuZXdBdGxhcy5kcmF3KGtleSwge1xuICAgICAgICAgIHc6IHcsXG4gICAgICAgICAgaDogaFxuICAgICAgICB9LCBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICAgIGNvbnRleHQuZHJhd0ltYWdlKHNjcmF0Y2gsIDAsIDAsIHcsIGgsIDAsIDAsIHcsIGggLy8gdGhlIGRlc3RpbmF0aW9uIGNvbnRleHQgaGFzIGFscmVhZHkgYmVlbiB0cmFuc2xhdGVkIHRvIHRoZSBjb3JyZWN0IHBvc2l0aW9uXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldENvdW50c1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRDb3VudHMoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBrZXlDb3VudDogdGhpcy5zdHlsZUtleVRvQXRsYXMuc2l6ZSxcbiAgICAgICAgYXRsYXNDb3VudDogbmV3IFNldCh0aGlzLnN0eWxlS2V5VG9BdGxhcy52YWx1ZXMoKSkuc2l6ZVxuICAgICAgfTtcbiAgICB9XG4gIH1dKTtcbn0oKTtcbmZ1bmN0aW9uIGludGVyc2VjdGlvbihzZXQxLCBzZXQyKSB7XG4gIC8vIFRPRE8gd2h5IG5vIFNldC5pbnRlcnNlY3Rpb24gaW4gbm9kZSAxNj8/P1xuICBpZiAoc2V0MS5pbnRlcnNlY3Rpb24pIHJldHVybiBzZXQxLmludGVyc2VjdGlvbihzZXQyKTtlbHNlIHJldHVybiBuZXcgU2V0KF90b0NvbnN1bWFibGVBcnJheShzZXQxKS5maWx0ZXIoZnVuY3Rpb24gKHgpIHtcbiAgICByZXR1cm4gc2V0Mi5oYXMoeCk7XG4gIH0pKTtcbn1cblxuLyoqXG4gKiBVc2VkIHRvIG1hbmFnZSBiYXRjaGVzIG9mIEF0bGFzZXMgZm9yIGRyYXdpbmcgbm9kZXMgYW5kIGxhYmVscy5cbiAqIFN1cHBvcnRzIGRpZmZlcmVudCB0eXBlcyBvZiBBdGxhc0NvbGxlY3Rpb25zIGZvciBkaWZmZXJlbnQgcmVuZGVyIHR5cGVzLFxuICogZm9yIGV4YW1wbGUgJ25vZGUtYm9keScgYW5kICdub2RlLWxhYmVsJyB3b3VsZCBiZSBkaWZmZXJlbnQgcmVuZGVyIHR5cGVzLlxuICogUmVuZGVyIHR5cGVzIGFyZSBrZXB0IHNlcGFyYXRlIGJlY2F1c2UgdGhleSB3aWxsIGxpa2VseSBuZWVkIHRvIGJlIGdhcmJhZ2UgY29sbGVjdGVkXG4gKiBzZXBhcmF0ZWx5IGFuZCBpdHMgbm90IGVudGllcmx5IGd1YXJhbnRlZWQgdGhhdCB0aGVpciBzdHlsZSBrZXlzIHdvbid0IGNvbGxpZGUuXG4gKi9cbnZhciBBdGxhc01hbmFnZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBBdGxhc01hbmFnZXIociwgZ2xvYmFsT3B0aW9ucykge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBBdGxhc01hbmFnZXIpO1xuICAgIHRoaXMuciA9IHI7XG4gICAgdGhpcy5nbG9iYWxPcHRpb25zID0gZ2xvYmFsT3B0aW9ucztcbiAgICB0aGlzLmF0bGFzU2l6ZSA9IGdsb2JhbE9wdGlvbnMud2ViZ2xUZXhTaXplO1xuICAgIHRoaXMubWF4QXRsYXNlc1BlckJhdGNoID0gZ2xvYmFsT3B0aW9ucy53ZWJnbFRleFBlckJhdGNoO1xuICAgIHRoaXMucmVuZGVyVHlwZXMgPSBuZXcgTWFwKCk7IC8vIHJlbmRlclR5cGU6c3RyaW5nIC0+IHJlbmRlclR5cGVPcHRpb25zXG4gICAgdGhpcy5jb2xsZWN0aW9ucyA9IG5ldyBNYXAoKTsgLy8gY29sbGVjdGlvbk5hbWU6c3RyaW5nIC0+IEF0bGFzQ29sbGVjdGlvblxuXG4gICAgdGhpcy50eXBlQW5kSWRUb0tleSA9IG5ldyBNYXAoKTsgLy8gW3JlbmRlclR5cGUsaWRdID0+IEFycmF5PHN0eWxlIGtleT5cbiAgfVxuICByZXR1cm4gX2NyZWF0ZUNsYXNzKEF0bGFzTWFuYWdlciwgW3tcbiAgICBrZXk6IFwiZ2V0QXRsYXNTaXplXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEF0bGFzU2l6ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmF0bGFzU2l6ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYWRkQXRsYXNDb2xsZWN0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZEF0bGFzQ29sbGVjdGlvbihjb2xsZWN0aW9uTmFtZSwgYXRsYXNDb2xsZWN0aW9uT3B0aW9ucykge1xuICAgICAgdmFyIF90aGlzJGdsb2JhbE9wdGlvbnMgPSB0aGlzLmdsb2JhbE9wdGlvbnMsXG4gICAgICAgIHdlYmdsVGV4U2l6ZSA9IF90aGlzJGdsb2JhbE9wdGlvbnMud2ViZ2xUZXhTaXplLFxuICAgICAgICBjcmVhdGVUZXh0dXJlQ2FudmFzID0gX3RoaXMkZ2xvYmFsT3B0aW9ucy5jcmVhdGVUZXh0dXJlQ2FudmFzO1xuICAgICAgdmFyIHRleFJvd3MgPSBhdGxhc0NvbGxlY3Rpb25PcHRpb25zLnRleFJvd3M7XG4gICAgICB2YXIgY2FjaGVkQ3JlYXRlVGV4dHVyZUNhbnZhcyA9IHRoaXMuX2NhY2hlU2NyYXRjaENhbnZhcyhjcmVhdGVUZXh0dXJlQ2FudmFzKTtcbiAgICAgIHZhciBhdGxhc0NvbGxlY3Rpb24gPSBuZXcgQXRsYXNDb2xsZWN0aW9uKHRoaXMuciwgd2ViZ2xUZXhTaXplLCB0ZXhSb3dzLCBjYWNoZWRDcmVhdGVUZXh0dXJlQ2FudmFzKTtcbiAgICAgIHRoaXMuY29sbGVjdGlvbnMuc2V0KGNvbGxlY3Rpb25OYW1lLCBhdGxhc0NvbGxlY3Rpb24pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJhZGRSZW5kZXJUeXBlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZFJlbmRlclR5cGUodHlwZSwgcmVuZGVyVHlwZU9wdGlvbnMpIHtcbiAgICAgIHZhciBjb2xsZWN0aW9uID0gcmVuZGVyVHlwZU9wdGlvbnMuY29sbGVjdGlvbjtcbiAgICAgIGlmICghdGhpcy5jb2xsZWN0aW9ucy5oYXMoY29sbGVjdGlvbikpIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgYXRsYXMgY29sbGVjdGlvbiBuYW1lICdcIi5jb25jYXQoY29sbGVjdGlvbiwgXCInXCIpKTtcbiAgICAgIHZhciBhdGxhc0NvbGxlY3Rpb24gPSB0aGlzLmNvbGxlY3Rpb25zLmdldChjb2xsZWN0aW9uKTtcbiAgICAgIHZhciBvcHRzID0gZXh0ZW5kKHtcbiAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgYXRsYXNDb2xsZWN0aW9uOiBhdGxhc0NvbGxlY3Rpb25cbiAgICAgIH0sIHJlbmRlclR5cGVPcHRpb25zKTtcbiAgICAgIHRoaXMucmVuZGVyVHlwZXMuc2V0KHR5cGUsIG9wdHMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRSZW5kZXJUeXBlT3B0c1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRSZW5kZXJUeXBlT3B0cyh0eXBlKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZW5kZXJUeXBlcy5nZXQodHlwZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldEF0bGFzQ29sbGVjdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRBdGxhc0NvbGxlY3Rpb24obmFtZSkge1xuICAgICAgcmV0dXJuIHRoaXMuY29sbGVjdGlvbnMuZ2V0KG5hbWUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfY2FjaGVTY3JhdGNoQ2FudmFzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9jYWNoZVNjcmF0Y2hDYW52YXMoY3JlYXRlVGV4dHVyZUNhbnZhcykge1xuICAgICAgLy8gYWxsIHNjcmF0Y2ggY2FudmFzZXMgZm9yIHRoZSBzYW1lIHJlbmRlciB0eXBlIHdpbGwgaGF2ZSB0aGUgc2FtZSB3aWR0aCBhbmQgaGVpZ2h0IChpZSB3ZWJnbFRleFJvd3Mgb3B0aW9uKVxuICAgICAgLy8gYnV0IHdlJ2xsIGtlZXAgdHJhY2sgb2YgdGhlIHdpZHRoIGFuZCBoZWlnaHQganVzdCB0byBiZSBzYWZlXG4gICAgICB2YXIgcHJldlcgPSAtMTtcbiAgICAgIHZhciBwcmV2SCA9IC0xO1xuICAgICAgdmFyIHNjcmF0Y2hDYW52YXMgPSBudWxsO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChyLCB3LCBoLCBzY3JhdGNoKSB7XG4gICAgICAgIGlmIChzY3JhdGNoKSB7XG4gICAgICAgICAgaWYgKCFzY3JhdGNoQ2FudmFzIHx8IHcgIT0gcHJldlcgfHwgaCAhPSBwcmV2SCkge1xuICAgICAgICAgICAgcHJldlcgPSB3O1xuICAgICAgICAgICAgcHJldkggPSBoO1xuICAgICAgICAgICAgc2NyYXRjaENhbnZhcyA9IGNyZWF0ZVRleHR1cmVDYW52YXMociwgdywgaCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBzY3JhdGNoQ2FudmFzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVUZXh0dXJlQ2FudmFzKHIsIHcsIGgpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfa2V5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9rZXkocmVuZGVyVHlwZSwgaWQpIHtcbiAgICAgIHJldHVybiBcIlwiLmNvbmNhdChyZW5kZXJUeXBlLCBcIi1cIikuY29uY2F0KGlkKTsgLy8gVE9ETyBub3QgdmVyeSBlZmZpY2llbnRcbiAgICB9XG5cbiAgICAvKiogTWFya3MgdGV4dHVlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnQgZm9yIGdhcmJhZ2UgY29sbGVjdGlvbi4gKi9cbiAgfSwge1xuICAgIGtleTogXCJpbnZhbGlkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGludmFsaWRhdGUoZWxlcykge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG4gICAgICB2YXIgX3JlZjIgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9LFxuICAgICAgICBfcmVmMiRmb3JjZVJlZHJhdyA9IF9yZWYyLmZvcmNlUmVkcmF3LFxuICAgICAgICBmb3JjZVJlZHJhdyA9IF9yZWYyJGZvcmNlUmVkcmF3ID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWYyJGZvcmNlUmVkcmF3LFxuICAgICAgICBfcmVmMiRmaWx0ZXJFbGUgPSBfcmVmMi5maWx0ZXJFbGUsXG4gICAgICAgIGZpbHRlckVsZSA9IF9yZWYyJGZpbHRlckVsZSA9PT0gdm9pZCAwID8gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IDogX3JlZjIkZmlsdGVyRWxlLFxuICAgICAgICBfcmVmMiRmaWx0ZXJUeXBlID0gX3JlZjIuZmlsdGVyVHlwZSxcbiAgICAgICAgZmlsdGVyVHlwZSA9IF9yZWYyJGZpbHRlclR5cGUgPT09IHZvaWQgMCA/IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSA6IF9yZWYyJGZpbHRlclR5cGU7XG4gICAgICB2YXIgbmVlZEdDID0gZmFsc2U7XG4gICAgICB2YXIgcnVuR0NOb3cgPSBmYWxzZTtcbiAgICAgIHZhciBfaXRlcmF0b3IzID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoZWxlcyksXG4gICAgICAgIF9zdGVwMztcbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAoX2l0ZXJhdG9yMy5zKCk7ICEoX3N0ZXAzID0gX2l0ZXJhdG9yMy5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgdmFyIGVsZSA9IF9zdGVwMy52YWx1ZTtcbiAgICAgICAgICBpZiAoZmlsdGVyRWxlKGVsZSkpIHtcbiAgICAgICAgICAgIHZhciBfaXRlcmF0b3I0ID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIodGhpcy5yZW5kZXJUeXBlcy52YWx1ZXMoKSksXG4gICAgICAgICAgICAgIF9zdGVwNDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHZhciBfbG9vcDIgPSBmdW5jdGlvbiBfbG9vcDIoKSB7XG4gICAgICAgICAgICAgICAgdmFyIG9wdHMgPSBfc3RlcDQudmFsdWU7XG4gICAgICAgICAgICAgICAgdmFyIHJlbmRlclR5cGUgPSBvcHRzLnR5cGU7XG4gICAgICAgICAgICAgICAgaWYgKGZpbHRlclR5cGUocmVuZGVyVHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgIHZhciBhdGxhc0NvbGxlY3Rpb24gPSBfdGhpczMuY29sbGVjdGlvbnMuZ2V0KG9wdHMuY29sbGVjdGlvbik7XG4gICAgICAgICAgICAgICAgICB2YXIga2V5ID0gb3B0cy5nZXRLZXkoZWxlKTtcbiAgICAgICAgICAgICAgICAgIHZhciBrZXlBcnJheSA9IEFycmF5LmlzQXJyYXkoa2V5KSA/IGtleSA6IFtrZXldO1xuXG4gICAgICAgICAgICAgICAgICAvLyB3aGVuIGEgbm9kZSdzIGJhY2tncm91bmQgaW1hZ2UgZmluaXNoZXMgbG9hZGluZywgdGhlIHN0eWxlIGtleSBkb2Vzbid0IGNoYW5nZSBidXQgc3RpbGwgbmVlZHMgdG8gYmUgcmVkcmF3blxuICAgICAgICAgICAgICAgICAgaWYgKGZvcmNlUmVkcmF3KSB7XG4gICAgICAgICAgICAgICAgICAgIGtleUFycmF5LmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhdGxhc0NvbGxlY3Rpb24ubWFya0tleUZvckdDKGtleSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBydW5HQ05vdyA9IHRydWU7IC8vIHJ1biBHQyB0byByZW1vdmUgdGhlIG9sZCB0ZXh0dXJlIHJpZ2h0IG5vdywgdGhhdCB3YXkgd2UgZG9uJ3QgbmVlZCB0byByZW1lbWJlciBmb3IgdGhlIG5leHQgZ2MgXG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSBvcHRzLmdldElEID8gb3B0cy5nZXRJRChlbGUpIDogZWxlLmlkKCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtYXBLZXkgPSBfdGhpczMuX2tleShyZW5kZXJUeXBlLCBpZCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBvbGRLZXlBcnJheSA9IF90aGlzMy50eXBlQW5kSWRUb0tleS5nZXQobWFwS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9sZEtleUFycmF5ICE9PSB1bmRlZmluZWQgJiYgIWFycmF5RXF1YWwoa2V5QXJyYXksIG9sZEtleUFycmF5KSkge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNlcnZhdGl2ZSBhcHByb2FjaCwgaWYgYW55IG9mIHRoZSBrZXlzIGRvbid0IG1hdGNoIHRoZW4gdGhyb3cgdGhlbSBhbGwgYXdheVxuICAgICAgICAgICAgICAgICAgICAgIG5lZWRHQyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgX3RoaXMzLnR5cGVBbmRJZFRvS2V5W1wiZGVsZXRlXCJdKG1hcEtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgb2xkS2V5QXJyYXkuZm9yRWFjaChmdW5jdGlvbiAob2xkS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXRsYXNDb2xsZWN0aW9uLm1hcmtLZXlGb3JHQyhvbGRLZXkpO1xuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBmb3IgKF9pdGVyYXRvcjQucygpOyAhKF9zdGVwNCA9IF9pdGVyYXRvcjQubigpKS5kb25lOykge1xuICAgICAgICAgICAgICAgIF9sb29wMigpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgX2l0ZXJhdG9yNC5lKGVycik7XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICBfaXRlcmF0b3I0LmYoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBfaXRlcmF0b3IzLmUoZXJyKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIF9pdGVyYXRvcjMuZigpO1xuICAgICAgfVxuICAgICAgaWYgKHJ1bkdDTm93KSB7XG4gICAgICAgIHRoaXMuZ2MoKTtcbiAgICAgICAgbmVlZEdDID0gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmVlZEdDO1xuICAgIH1cblxuICAgIC8qKiBHYXJiYWdlIGNvbGxlY3QgKi9cbiAgfSwge1xuICAgIGtleTogXCJnY1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnYygpIHtcbiAgICAgIHZhciBfaXRlcmF0b3I1ID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIodGhpcy5jb2xsZWN0aW9ucy52YWx1ZXMoKSksXG4gICAgICAgIF9zdGVwNTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAoX2l0ZXJhdG9yNS5zKCk7ICEoX3N0ZXA1ID0gX2l0ZXJhdG9yNS5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgdmFyIGNvbGxlY3Rpb24gPSBfc3RlcDUudmFsdWU7XG4gICAgICAgICAgY29sbGVjdGlvbi5nYygpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgX2l0ZXJhdG9yNS5lKGVycik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBfaXRlcmF0b3I1LmYoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0T3JDcmVhdGVBdGxhc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRPckNyZWF0ZUF0bGFzKGVsZSwgdHlwZSwgYmIsIHN0eWxlS2V5KSB7XG4gICAgICAvLyBzdHlsZUtleSBpcyBub3QgYW4gYXJyYXkgaGVyZVxuICAgICAgdmFyIG9wdHMgPSB0aGlzLnJlbmRlclR5cGVzLmdldCh0eXBlKTtcbiAgICAgIHZhciBhdGxhc0NvbGxlY3Rpb24gPSB0aGlzLmNvbGxlY3Rpb25zLmdldChvcHRzLmNvbGxlY3Rpb24pO1xuXG4gICAgICAvLyBkcmF3cyB0aGUgdGV4dHVyZSBvbmx5IGlmIG5lZWRlZFxuICAgICAgdmFyIGRyYXduID0gZmFsc2U7XG4gICAgICB2YXIgYXRsYXMgPSBhdGxhc0NvbGxlY3Rpb24uZHJhdyhzdHlsZUtleSwgYmIsIGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIGlmIChvcHRzLmRyYXdDbGlwcGVkKSB7XG4gICAgICAgICAgY29udGV4dC5zYXZlKCk7XG4gICAgICAgICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICAgICAgICBjb250ZXh0LnJlY3QoMCwgMCwgYmIudywgYmIuaCk7XG4gICAgICAgICAgY29udGV4dC5jbGlwKCk7XG4gICAgICAgICAgb3B0cy5kcmF3RWxlbWVudChjb250ZXh0LCBlbGUsIGJiLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgICBjb250ZXh0LnJlc3RvcmUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvcHRzLmRyYXdFbGVtZW50KGNvbnRleHQsIGVsZSwgYmIsIHRydWUsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGRyYXduID0gdHJ1ZTtcbiAgICAgIH0pO1xuICAgICAgaWYgKGRyYXduKSB7XG4gICAgICAgIHZhciBpZCA9IG9wdHMuZ2V0SUQgPyBvcHRzLmdldElEKGVsZSkgOiBlbGUuaWQoKTsgLy8gZm9yIHRlc3RpbmdcbiAgICAgICAgdmFyIG1hcEtleSA9IHRoaXMuX2tleSh0eXBlLCBpZCk7XG4gICAgICAgIGlmICh0aGlzLnR5cGVBbmRJZFRvS2V5LmhhcyhtYXBLZXkpKSB7XG4gICAgICAgICAgdGhpcy50eXBlQW5kSWRUb0tleS5nZXQobWFwS2V5KS5wdXNoKHN0eWxlS2V5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnR5cGVBbmRJZFRvS2V5LnNldChtYXBLZXksIFtzdHlsZUtleV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYXRsYXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldEF0bGFzSW5mb1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRBdGxhc0luZm8oZWxlLCB0eXBlKSB7XG4gICAgICB2YXIgX3RoaXM0ID0gdGhpcztcbiAgICAgIHZhciBvcHRzID0gdGhpcy5yZW5kZXJUeXBlcy5nZXQodHlwZSk7XG4gICAgICB2YXIga2V5ID0gb3B0cy5nZXRLZXkoZWxlKTtcbiAgICAgIHZhciBrZXlBcnJheSA9IEFycmF5LmlzQXJyYXkoa2V5KSA/IGtleSA6IFtrZXldO1xuICAgICAgcmV0dXJuIGtleUFycmF5Lm1hcChmdW5jdGlvbiAoc3R5bGVLZXkpIHtcbiAgICAgICAgdmFyIGJiID0gb3B0cy5nZXRCb3VuZGluZ0JveChlbGUsIHN0eWxlS2V5KTsgLy8gcGFzcyB0aGUga2V5IGJhY2sgdG8gdGhlIGdldEJvdW5kaW5nQm94IG1ldGhvZFxuICAgICAgICB2YXIgYXRsYXMgPSBfdGhpczQuZ2V0T3JDcmVhdGVBdGxhcyhlbGUsIHR5cGUsIGJiLCBzdHlsZUtleSk7XG4gICAgICAgIHZhciBfYXRsYXMkZ2V0T2Zmc2V0czMgPSBhdGxhcy5nZXRPZmZzZXRzKHN0eWxlS2V5KSxcbiAgICAgICAgICBfYXRsYXMkZ2V0T2Zmc2V0czQgPSBfc2xpY2VkVG9BcnJheShfYXRsYXMkZ2V0T2Zmc2V0czMsIDIpLFxuICAgICAgICAgIHRleDEgPSBfYXRsYXMkZ2V0T2Zmc2V0czRbMF0sXG4gICAgICAgICAgdGV4MiA9IF9hdGxhcyRnZXRPZmZzZXRzNFsxXTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBhdGxhczogYXRsYXMsXG4gICAgICAgICAgdGV4OiB0ZXgxLFxuICAgICAgICAgIHRleDE6IHRleDEsXG4gICAgICAgICAgdGV4MjogdGV4MixcbiAgICAgICAgICBiYjogYmJcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXREZWJ1Z0luZm9cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0RGVidWdJbmZvKCkge1xuICAgICAgdmFyIGRlYnVnSW5mbyA9IFtdO1xuICAgICAgdmFyIF9pdGVyYXRvcjYgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcih0aGlzLmNvbGxlY3Rpb25zKSxcbiAgICAgICAgX3N0ZXA2O1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIChfaXRlcmF0b3I2LnMoKTsgIShfc3RlcDYgPSBfaXRlcmF0b3I2Lm4oKSkuZG9uZTspIHtcbiAgICAgICAgICB2YXIgX3N0ZXA2JHZhbHVlID0gX3NsaWNlZFRvQXJyYXkoX3N0ZXA2LnZhbHVlLCAyKSxcbiAgICAgICAgICAgIG5hbWUgPSBfc3RlcDYkdmFsdWVbMF0sXG4gICAgICAgICAgICBjb2xsZWN0aW9uID0gX3N0ZXA2JHZhbHVlWzFdO1xuICAgICAgICAgIHZhciBfY29sbGVjdGlvbiRnZXRDb3VudHMgPSBjb2xsZWN0aW9uLmdldENvdW50cygpLFxuICAgICAgICAgICAga2V5Q291bnQgPSBfY29sbGVjdGlvbiRnZXRDb3VudHMua2V5Q291bnQsXG4gICAgICAgICAgICBhdGxhc0NvdW50ID0gX2NvbGxlY3Rpb24kZ2V0Q291bnRzLmF0bGFzQ291bnQ7XG4gICAgICAgICAgZGVidWdJbmZvLnB1c2goe1xuICAgICAgICAgICAgdHlwZTogbmFtZSxcbiAgICAgICAgICAgIGtleUNvdW50OiBrZXlDb3VudCxcbiAgICAgICAgICAgIGF0bGFzQ291bnQ6IGF0bGFzQ291bnRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIF9pdGVyYXRvcjYuZShlcnIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgX2l0ZXJhdG9yNi5mKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGVidWdJbmZvO1xuICAgIH1cbiAgfV0pO1xufSgpO1xudmFyIEF0bGFzQmF0Y2hNYW5hZ2VyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQXRsYXNCYXRjaE1hbmFnZXIoZ2xvYmFsT3B0aW9ucykge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBBdGxhc0JhdGNoTWFuYWdlcik7XG4gICAgdGhpcy5nbG9iYWxPcHRpb25zID0gZ2xvYmFsT3B0aW9ucztcbiAgICB0aGlzLmF0bGFzU2l6ZSA9IGdsb2JhbE9wdGlvbnMud2ViZ2xUZXhTaXplO1xuICAgIHRoaXMubWF4QXRsYXNlc1BlckJhdGNoID0gZ2xvYmFsT3B0aW9ucy53ZWJnbFRleFBlckJhdGNoO1xuICAgIHRoaXMuYmF0Y2hBdGxhc2VzID0gW107XG4gIH1cbiAgcmV0dXJuIF9jcmVhdGVDbGFzcyhBdGxhc0JhdGNoTWFuYWdlciwgW3tcbiAgICBrZXk6IFwiZ2V0TWF4QXRsYXNlc1BlckJhdGNoXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldE1heEF0bGFzZXNQZXJCYXRjaCgpIHtcbiAgICAgIHJldHVybiB0aGlzLm1heEF0bGFzZXNQZXJCYXRjaDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0QXRsYXNTaXplXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEF0bGFzU2l6ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmF0bGFzU2l6ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0SW5kZXhBcnJheVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRJbmRleEFycmF5KCkge1xuICAgICAgcmV0dXJuIEFycmF5LmZyb20oe1xuICAgICAgICBsZW5ndGg6IHRoaXMubWF4QXRsYXNlc1BlckJhdGNoXG4gICAgICB9LCBmdW5jdGlvbiAodiwgaSkge1xuICAgICAgICByZXR1cm4gaTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzdGFydEJhdGNoXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHN0YXJ0QmF0Y2goKSB7XG4gICAgICB0aGlzLmJhdGNoQXRsYXNlcyA9IFtdO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRBdGxhc0NvdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEF0bGFzQ291bnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5iYXRjaEF0bGFzZXMubGVuZ3RoO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRBdGxhc2VzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEF0bGFzZXMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5iYXRjaEF0bGFzZXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNhbkFkZFRvQ3VycmVudEJhdGNoXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNhbkFkZFRvQ3VycmVudEJhdGNoKGF0bGFzKSB7XG4gICAgICBpZiAodGhpcy5iYXRjaEF0bGFzZXMubGVuZ3RoID09PSB0aGlzLm1heEF0bGFzZXNQZXJCYXRjaCkge1xuICAgICAgICByZXR1cm4gdGhpcy5iYXRjaEF0bGFzZXMuaW5jbHVkZXMoYXRsYXMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7IC8vIG5vdCBmdWxsXG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldEF0bGFzSW5kZXhGb3JCYXRjaFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRBdGxhc0luZGV4Rm9yQmF0Y2goYXRsYXMpIHtcbiAgICAgIHZhciBhdGxhc0lEID0gdGhpcy5iYXRjaEF0bGFzZXMuaW5kZXhPZihhdGxhcyk7XG4gICAgICBpZiAoYXRsYXNJRCA8IDApIHtcbiAgICAgICAgaWYgKHRoaXMuYmF0Y2hBdGxhc2VzLmxlbmd0aCA9PT0gdGhpcy5tYXhBdGxhc2VzUGVyQmF0Y2gpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Nhbm5vdCBhZGQgbW9yZSBhdGxhc2VzIHRvIGJhdGNoJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5iYXRjaEF0bGFzZXMucHVzaChhdGxhcyk7XG4gICAgICAgIGF0bGFzSUQgPSB0aGlzLmJhdGNoQXRsYXNlcy5sZW5ndGggLSAxO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGF0bGFzSUQ7XG4gICAgfVxuICB9XSk7XG59KCk7XG5cbi8vIEZyYWdtZW50IHNoYWRlciBmdW5jdGlvbnMgdG8gY2FsY3VsYXRlIHNpZ25lZCBkaXN0YW5jZVxuLy8gaHR0cHM6Ly9pcXVpbGV6bGVzLm9yZy9hcnRpY2xlcy9kaXN0ZnVuY3Rpb25zMmQvXG4vLyBlbGxpcHNlOiBodHRwczovL3d3dy5zaGFkZXJ0b3kuY29tL3ZpZXcvNGxzWEROIFxuXG4vKipcbiAqIHBhcmFtIHAgLSBwb2ludFxuICogZmxvYXQgciAtIGNpcmNsZSByYWRpdXMsIGVnIDAuNSBmb3IgdW5pdCBjaXJjbGVcbiAqL1xudmFyIGNpcmNsZVNEID0gXCJcXG4gIGZsb2F0IGNpcmNsZVNEKHZlYzIgcCwgZmxvYXQgcikge1xcbiAgICByZXR1cm4gZGlzdGFuY2UodmVjMigwKSwgcCkgLSByOyAvLyBzaWduZWQgZGlzdGFuY2VcXG4gIH1cXG5cIjtcblxuLyoqXG4gKiBwYXJhbSBwIC0gcG9pbnRcbiAqIHBhcmFtIGIgLSBiLnggPSBoYWxmIHdpZHRoLCBiLnkgPSBoYWxmIGhlaWdodFxuICovXG52YXIgcmVjdGFuZ2xlU0QgPSBcIlxcbiAgZmxvYXQgcmVjdGFuZ2xlU0QodmVjMiBwLCB2ZWMyIGIpIHtcXG4gICAgdmVjMiBkID0gYWJzKHApLWI7XFxuICAgIHJldHVybiBkaXN0YW5jZSh2ZWMyKDApLG1heChkLDAuMCkpICsgbWluKG1heChkLngsZC55KSwwLjApO1xcbiAgfVxcblwiO1xuXG4vKipcbiAqIHBhcmFtIHAgLSBwb2ludFxuICogcGFyYW0gYiAtIGIueCA9IGhhbGYgd2lkdGgsIGIueSA9IGhhbGYgaGVpZ2h0XG4gKiBwYXJhbSBjciAtIHZlY3RvciBvZiBjb3JuZXIgcmFkaXVzZXNcbiAqL1xudmFyIHJvdW5kUmVjdGFuZ2xlU0QgPSBcIlxcbiAgZmxvYXQgcm91bmRSZWN0YW5nbGVTRCh2ZWMyIHAsIHZlYzIgYiwgdmVjNCBjcikge1xcbiAgICBjci54eSA9IChwLnggPiAwLjApID8gY3IueHkgOiBjci56dztcXG4gICAgY3IueCAgPSAocC55ID4gMC4wKSA/IGNyLnggIDogY3IueTtcXG4gICAgdmVjMiBxID0gYWJzKHApIC0gYiArIGNyLng7XFxuICAgIHJldHVybiBtaW4obWF4KHEueCwgcS55KSwgMC4wKSArIGRpc3RhbmNlKHZlYzIoMCksIG1heChxLCAwLjApKSAtIGNyLng7XFxuICB9XFxuXCI7XG5cbi8qKlxuICogcGFyYW0gcCAtIHBvaW50XG4gKiBwYXJhbSBhYiAtIGEueCA9IGhvcml6b250YWwgcmFkaXVzLCBhLnkgPSB2ZXJ0aWNhbCByYWRpdXNcbiAqL1xudmFyIGVsbGlwc2VTRCA9IFwiXFxuICBmbG9hdCBlbGxpcHNlU0QodmVjMiBwLCB2ZWMyIGFiKSB7XFxuICAgIHAgPSBhYnMoIHAgKTsgLy8gc3ltbWV0cnlcXG5cXG4gICAgLy8gZmluZCByb290IHdpdGggTmV3dG9uIHNvbHZlclxcbiAgICB2ZWMyIHEgPSBhYioocC1hYik7XFxuICAgIGZsb2F0IHcgPSAocS54PHEueSk/IDEuNTcwNzk2MzI3IDogMC4wO1xcbiAgICBmb3IoIGludCBpPTA7IGk8NTsgaSsrICkge1xcbiAgICAgIHZlYzIgY3MgPSB2ZWMyKGNvcyh3KSxzaW4odykpO1xcbiAgICAgIHZlYzIgdSA9IGFiKnZlYzIoIGNzLngsY3MueSk7XFxuICAgICAgdmVjMiB2ID0gYWIqdmVjMigtY3MueSxjcy54KTtcXG4gICAgICB3ID0gdyArIGRvdChwLXUsdikvKGRvdChwLXUsdSkrZG90KHYsdikpO1xcbiAgICB9XFxuICAgIFxcbiAgICAvLyBjb21wdXRlIGZpbmFsIHBvaW50IGFuZCBkaXN0YW5jZVxcbiAgICBmbG9hdCBkID0gbGVuZ3RoKHAtYWIqdmVjMihjb3Modyksc2luKHcpKSk7XFxuICAgIFxcbiAgICAvLyByZXR1cm4gc2lnbmVkIGRpc3RhbmNlXFxuICAgIHJldHVybiAoZG90KHAvYWIscC9hYik+MS4wKSA/IGQgOiAtZDtcXG4gIH1cXG5cIjtcblxuLyoqXG4gKiBUd28gcmVuZGVyIG1vZGVzLiBFYWNoIG1vZGUgaGFzIGl0cyBvd24gc2hhZGVyIHByb2dyYW0uIFRoZXkgYXJlIGFsbW9zdCBpZGVudGljYWwsIHRoZSBtYWluIGRpZmZlcmVuY2UgaXMgdGhlIG91dHB1dC5cbiAqIFNDUkVFTjogIG91dHB1dCBwaXhlbCBjb2xvcnMgdG8gdGhlIHNjcmVlblxuICogUElDS0lORzogb3V0cHV0IHotb3JkZXIgaW5kZXggdG8gYW4gb2Zmc2NyZWVuIGZyYW1lYnVmZmVyLCB1c2VkIHRvIGRldGVjdCB3aGF0J3MgdW5kZXIgdGhlIG1vdXNlIGN1cnNvclxuICovXG52YXIgUkVOREVSX1RBUkdFVCA9IHtcbiAgU0NSRUVOOiB7XG4gICAgbmFtZTogJ3NjcmVlbicsXG4gICAgc2NyZWVuOiB0cnVlXG4gIH0sXG4gIFBJQ0tJTkc6IHtcbiAgICBuYW1lOiAncGlja2luZycsXG4gICAgcGlja2luZzogdHJ1ZVxuICB9XG59O1xuXG4vKipcbiAqIFNwZWNpYWwgaGFuZGluZyBmb3IgbGFiZWwgdGV4dHVyZXMgaW4gUElDS0lORyBtb2RlLiBTZWUgaXNzdWUgIzMzMzcuXG4gKi9cbnZhciBURVhfUElDS0lOR19NT0RFID0ge1xuICAvLyByZW5kZXIgdGhlIHRleHR1cmUganVzdCBsaWtlIGluIFJFTkRFUl9UQVJHRVQuU0NSRUVOIG1vZGVcbiAgSUdOT1JFOiAxLFxuICAvLyBkb24ndCByZW5kZXIgdGhlIHRleHR1cmUgYXQgYWxsXG4gIFVTRV9CQjogMiAvLyByZW5kZXIgdGhlIGJvdW5kaW5nIGJveCBhcyBhbiBvcGFxdWUgcmVjdGFuZ2xlXG59O1xuXG4vLyBWZXJ0ZXggdHlwZXMuXG4vLyBVc2VkIGRpcmVjdGx5IGluIHRoZSBzaGFkZXJzIHNvIG11c3QgYmUgbnVtZXJpYy5cbi8vIFRoZXJlIGlzIG9ubHkgb25lIHNoYWRlciBwcm9ncmFtIHVzZWQgZm9yIGFuIGVudGlyZSBmcmFtZSB0aGF0IHJlbmRlcnMgYWxsIHR5cGVzIG9mIGVsZW1lbnRzLlxuLy8gVGhlcmUgYXJlIGlmLWVsc2UgYmxvY2tzIGluIHRoZSBzaGFkZXJzIHRoYXQgZG8gZGlmZmVyZW50IHRoaW5ncyBkZXBlbmRpbmcgb24gdGhlIHZlcnRleCB0eXBlLlxuLy8gVGhpcyBhbGxvd3MgYWxsIGVsZW1lbnRzIHRvIGJlIHJlbmRlcmVyZCBpbiBsYXJnZSBiYXRjaGVzIHdpdGhvdXQgc3dpdGNoaW5nIHNoYWRlciBwcm9ncmFtcy5cbnZhciBURVhUVVJFID0gMDtcbnZhciBFREdFX1NUUkFJR0hUID0gMTtcbnZhciBFREdFX0NVUlZFX1NFR01FTlQgPSAyO1xudmFyIEVER0VfQVJST1cgPSAzO1xudmFyIFJFQ1RBTkdMRSA9IDQ7XG52YXIgUk9VTkRfUkVDVEFOR0xFID0gNTtcbnZhciBCT1RUT01fUk9VTkRfUkVDVEFOR0xFID0gNjtcbnZhciBFTExJUFNFID0gNztcbnZhciBFbGVtZW50RHJhd2luZ1dlYkdMID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJpbmdDb250ZXh0fSBnbFxuICAgKi9cbiAgZnVuY3Rpb24gRWxlbWVudERyYXdpbmdXZWJHTChyLCBnbCwgb3B0cykge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBFbGVtZW50RHJhd2luZ1dlYkdMKTtcbiAgICB0aGlzLnIgPSByOyAvLyByZWZlcmVuY2UgdG8gdGhlIGNhbnZhcyByZW5kZXJlclxuICAgIHRoaXMuZ2wgPSBnbDtcbiAgICB0aGlzLm1heEluc3RhbmNlcyA9IG9wdHMud2ViZ2xCYXRjaFNpemU7XG4gICAgdGhpcy5hdGxhc1NpemUgPSBvcHRzLndlYmdsVGV4U2l6ZTtcbiAgICB0aGlzLmJnQ29sb3IgPSBvcHRzLmJnQ29sb3I7XG4gICAgdGhpcy5kZWJ1ZyA9IG9wdHMud2ViZ2xEZWJ1ZztcbiAgICB0aGlzLmJhdGNoRGVidWdJbmZvID0gW107XG4gICAgb3B0cy5lbmFibGVXcmFwcGluZyA9IHRydWU7XG4gICAgb3B0cy5jcmVhdGVUZXh0dXJlQ2FudmFzID0gY3JlYXRlVGV4dHVyZUNhbnZhczsgLy8gVW5pdCB0ZXN0cyBtb2NrIHRoaXNcblxuICAgIHRoaXMuYXRsYXNNYW5hZ2VyID0gbmV3IEF0bGFzTWFuYWdlcihyLCBvcHRzKTtcbiAgICB0aGlzLmJhdGNoTWFuYWdlciA9IG5ldyBBdGxhc0JhdGNoTWFuYWdlcihvcHRzKTtcbiAgICB0aGlzLnNpbXBsZVNoYXBlT3B0aW9ucyA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLnByb2dyYW0gPSB0aGlzLl9jcmVhdGVTaGFkZXJQcm9ncmFtKFJFTkRFUl9UQVJHRVQuU0NSRUVOKTtcbiAgICB0aGlzLnBpY2tpbmdQcm9ncmFtID0gdGhpcy5fY3JlYXRlU2hhZGVyUHJvZ3JhbShSRU5ERVJfVEFSR0VULlBJQ0tJTkcpO1xuICAgIHRoaXMudmFvID0gdGhpcy5fY3JlYXRlVkFPKCk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHsgc3RyaW5nIH0gY29sbGVjdGlvbk5hbWVcbiAgICogQHBhcmFtIHt7IHRleFJvd3M6IG51bWJlciB9fSBvcHRzXG4gICAqL1xuICByZXR1cm4gX2NyZWF0ZUNsYXNzKEVsZW1lbnREcmF3aW5nV2ViR0wsIFt7XG4gICAga2V5OiBcImFkZEF0bGFzQ29sbGVjdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRBdGxhc0NvbGxlY3Rpb24oY29sbGVjdGlvbk5hbWUsIG9wdHMpIHtcbiAgICAgIHRoaXMuYXRsYXNNYW5hZ2VyLmFkZEF0bGFzQ29sbGVjdGlvbihjb2xsZWN0aW9uTmFtZSwgb3B0cyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHR5cGVkZWYgeyBPYmplY3QgfSBUZXh0dXJlUmVuZGVyVHlwZU9wdHNcbiAgICAgKiBAcHJvcGVydHkgeyBzdHJpbmcgfSBjb2xsZWN0aW9uIC0gbmFtZSBvZiBhdGxhcyBjb2xsZWN0aW9uIHRvIHJlbmRlciB0ZXh0dXJlcyB0b1xuICAgICAqIEBwcm9wZXJ0eSB7IGZ1bmN0aW9uIH0gZ2V0S2V5IC0gcmV0dXJucyB0aGUgXCJzdHlsZSBrZXlcIiBmb3IgYW4gZWxlbWVudCwgbWF5IGJlIGEgc2luZ2xlIHZhbHVlIG9yIGFuIGFycmF5IGZvciBtdWx0aS1saW5lIGxhYmxlc1xuICAgICAqIEBwcm9wZXJ0eSB7IGZ1bmN0aW9uIH0gZHJhd0VsZW1lbnQgLSB1c2VzIGEgY2FudmFzIHJlbmRlcmVyIHRvIGRyYXcgdGhlIGVsZW1lbnQgdG8gdGhlIHRleHR1cmUgYXRsYXNcbiAgICAgKiBAcHJvcGVydHkgeyBib29sZWFuICB9IGRyYXdDbGlwcGVkIC0gaWYgdHJ1ZSB0aGUgY29udGV4dCB3aWxsIGJlIGNsaXBwZWQgdG8gdGhlIGJvdW5kaW5nIGJveCBiZWZvcmUgZHJhd0VsZW1lbnQoKSBpcyBjYWxsZWQsIG1heSBhZmZlY3QgcGVyZm9ybWFuY2VcbiAgICAgKiBAcHJvcGVydHkgeyBmdW5jdGlvbiB9IGdldEJvdW5kaW5nQm94IC0gcmV0dXJucyB0aGUgYm91bmRpbmcgYm94IGZvciBhbiBlbGVtZW50XG4gICAgICogQHByb3BlcnR5IHsgZnVuY3Rpb24gfSBnZXRSb3RhdGlvblxuICAgICAqIEBwcm9wZXJ0eSB7IGZ1bmN0aW9uIH0gZ2V0Um90YXRpb25Qb2ludFxuICAgICAqIEBwcm9wZXJ0eSB7IGZ1bmN0aW9uIH0gZ2V0Um90YXRpb25PZmZzZXRcbiAgICAgKiBAcHJvcGVydHkgeyBmdW5jdGlvbiB9IGlzVmlzaWJsZSAtIGFuIGV4dHJhIGNoZWNrIGZvciB2aXNpYmlsaXR5IGluIGFkZGl0aW9uIHRvIGVsZS52aXNpYmxlKClcbiAgICAgKiBAcHJvcGVydHkgeyBmdW5jdGlvbiB9IGdldFRleFBpY2tpbmdNb2RlIC0gcmV0dXJucyBhIHZhbHVlIGZyb20gdGhlIFRFWF9QSUNLSU5HX01PREUgZW51bVxuICAgICAqL1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7IHN0cmluZyB9IHR5cGVOYW1lXG4gICAgICogQHBhcmFtIHsgVGV4dHVyZVJlbmRlclR5cGVPcHRzIH0gb3B0c1xuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiBcImFkZFRleHR1cmVBdGxhc1JlbmRlclR5cGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkVGV4dHVyZUF0bGFzUmVuZGVyVHlwZSh0eXBlTmFtZSwgb3B0cykge1xuICAgICAgdGhpcy5hdGxhc01hbmFnZXIuYWRkUmVuZGVyVHlwZSh0eXBlTmFtZSwgb3B0cyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHR5cGVkZWYgeyBPYmplY3QgfSBTaW1wbGVTaGFwZVJlbmRlclR5cGVPcHRzXG4gICAgICogQHByb3BlcnR5IHsgZnVuY3Rpb24gfSBnZXRCb3VuZGluZ0JveCAtIHJldHVybnMgdGhlIGJvdW5kaW5nIGJveCBmb3IgYW4gZWxlbWVudFxuICAgICAqIEBwcm9wZXJ0eSB7IGZ1bmN0aW9uIH0gaXNWaXNpYmxlIC0gdGhpcyBpcyBhbiBleHRyYSBjaGVjayBmb3IgdmlzaWJpbGl0eSBpbiBhZGRpdGlvbiB0byBlbGUudmlzaWJsZSgpXG4gICAgICogQHByb3BlcnR5IHsgZnVuY3Rpb24gfSBpc1NpbXBsZSAtIGNoZWNrIGlmIGVsZW1lbnQgaXMgYSBzaW1wbGUgc2hhcGUsIG9yIGlmIGl0IG5lZWRzIHRvIGZhbGwgYmFjayB0byB0ZXh0dXJlIHJlbmRlcmluZ1xuICAgICAqIEBwcm9wZXJ0eSB7IFNoYXBlVmlzdWFsUHJvcGVydGllcyB9IHNoYXBlUHJvcHNcbiAgICAgKi9cbiAgICAvKipcbiAgICAgKiBAdHlwZWRlZiB7IE9iamVjdCB9IFNoYXBlVmlzdWFsUHJvcGVydGllc1xuICAgICAqIEBwcm9wZXJ0eSB7IHN0cmluZyB9IHNoYXBlXG4gICAgICogQHByb3BlcnR5IHsgc3RyaW5nIH0gY29sb3JcbiAgICAgKiBAcHJvcGVydHkgeyBzdHJpbmcgfSBvcGFjaXR5XG4gICAgICogQHByb3BlcnR5IHsgc3RyaW5nIH0gcGFkZGluZ1xuICAgICAqIEBwcm9wZXJ0eSB7IHN0cmluZyB9IHJhZGl1c1xuICAgICAqIEBwcm9wZXJ0eSB7IGJvb2xlYW4gfSBib3JkZXJcbiAgICAqL1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7IHN0cmluZyB9IHR5cGVOYW1lXG4gICAgICogQHBhcmFtIHsgU2ltcGxlU2hhcGVSZW5kZXJUeXBlT3B0cyB9IG9wdHNcbiAgICAgKi9cbiAgfSwge1xuICAgIGtleTogXCJhZGRTaW1wbGVTaGFwZVJlbmRlclR5cGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkU2ltcGxlU2hhcGVSZW5kZXJUeXBlKHR5cGVOYW1lLCBvcHRzKSB7XG4gICAgICB0aGlzLnNpbXBsZVNoYXBlT3B0aW9ucy5zZXQodHlwZU5hbWUsIG9wdHMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluZm9ybSB0aGUgYXRsYXNNYW5hZ2VyIHdoZW4gZWxlbWVudCBzdHlsZSBrZXlzIG1heSBoYXZlIGNoYW5nZWQuXG4gICAgICogVGhlIGF0bGFzTWFuYWdlciBjYW4gdGhlbiBtYXJrIHVudXNlZCB0ZXh0dXJlcyBmb3IgXCJnYXJiYWdlIGNvbGxlY3Rpb25cIi5cbiAgICAgKi9cbiAgfSwge1xuICAgIGtleTogXCJpbnZhbGlkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGludmFsaWRhdGUoZWxlcykge1xuICAgICAgdmFyIF9yZWYgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9LFxuICAgICAgICB0eXBlID0gX3JlZi50eXBlO1xuICAgICAgdmFyIGF0bGFzTWFuYWdlciA9IHRoaXMuYXRsYXNNYW5hZ2VyO1xuICAgICAgaWYgKHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIGF0bGFzTWFuYWdlci5pbnZhbGlkYXRlKGVsZXMsIHtcbiAgICAgICAgICBmaWx0ZXJUeXBlOiBmdW5jdGlvbiBmaWx0ZXJUeXBlKHQpIHtcbiAgICAgICAgICAgIHJldHVybiB0ID09PSB0eXBlO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZm9yY2VSZWRyYXc6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYXRsYXNNYW5hZ2VyLmludmFsaWRhdGUoZWxlcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUnVuIHRleHR1cmUgZ2FyYmFnZSBjb2xsZWN0aW9uLlxuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiBcImdjXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdjKCkge1xuICAgICAgdGhpcy5hdGxhc01hbmFnZXIuZ2MoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX2NyZWF0ZVNoYWRlclByb2dyYW1cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2NyZWF0ZVNoYWRlclByb2dyYW0ocmVuZGVyVGFyZ2V0KSB7XG4gICAgICB2YXIgZ2wgPSB0aGlzLmdsO1xuICAgICAgdmFyIHZlcnRleFNoYWRlclNvdXJjZSA9IFwiI3ZlcnNpb24gMzAwIGVzXFxuICAgICAgcHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xcblxcbiAgICAgIHVuaWZvcm0gbWF0MyB1UGFuWm9vbU1hdHJpeDtcXG4gICAgICB1bmlmb3JtIGludCAgdUF0bGFzU2l6ZTtcXG4gICAgICBcXG4gICAgICAvLyBpbnN0YW5jZWRcXG4gICAgICBpbiB2ZWMyIGFQb3NpdGlvbjsgLy8gYSB2ZXJ0ZXggZnJvbSB0aGUgdW5pdCBzcXVhcmVcXG4gICAgICBcXG4gICAgICBpbiBtYXQzIGFUcmFuc2Zvcm07IC8vIHVzZWQgdG8gdHJhbnNmb3JtIHZlcnRpY2llcywgZWcgaW50byBhIGJvdW5kaW5nIGJveFxcbiAgICAgIGluIGludCBhVmVydFR5cGU7IC8vIHRoZSB0eXBlIG9mIHRoaW5nIHdlIGFyZSByZW5kZXJpbmdcXG5cXG4gICAgICAvLyB0aGUgei1pbmRleCB0aGF0IGlzIG91dHB1dCB3aGVuIHVzaW5nIHBpY2tpbmcgbW9kZVxcbiAgICAgIGluIHZlYzQgYUluZGV4O1xcbiAgICAgIFxcbiAgICAgIC8vIEZvciB0ZXh0dXJlc1xcbiAgICAgIGluIGludCBhQXRsYXNJZDsgLy8gd2hpY2ggc2hhZGVyIHVuaXQvYXRsYXMgdG8gdXNlXFxuICAgICAgaW4gdmVjNCBhVGV4OyAvLyB4L3kvdy9oIG9mIHRleHR1cmUgaW4gYXRsYXNcXG5cXG4gICAgICAvLyBmb3IgZWRnZXNcXG4gICAgICBpbiB2ZWM0IGFQb2ludEFQb2ludEI7XFxuICAgICAgaW4gdmVjNCBhUG9pbnRDUG9pbnREO1xcbiAgICAgIGluIHZlYzIgYUxpbmVXaWR0aDsgLy8gYWxzbyB1c2VkIGZvciBub2RlIGJvcmRlciB3aWR0aFxcblxcbiAgICAgIC8vIHNpbXBsZSBzaGFwZXNcXG4gICAgICBpbiB2ZWM0IGFDb3JuZXJSYWRpdXM7IC8vIGZvciByb3VuZC1yZWN0YW5nbGUgW3RvcC1yaWdodCwgYm90dG9tLXJpZ2h0LCB0b3AtbGVmdCwgYm90dG9tLWxlZnRdXFxuICAgICAgaW4gdmVjNCBhQ29sb3I7IC8vIGFsc28gdXNlZCBmb3IgZWRnZXNcXG4gICAgICBpbiB2ZWM0IGFCb3JkZXJDb2xvcjsgLy8gYUxpbmVXaWR0aCBpcyB1c2VkIGZvciBib3JkZXIgd2lkdGhcXG5cXG4gICAgICAvLyBvdXRwdXQgdmFsdWVzIHBhc3NlZCB0byB0aGUgZnJhZ21lbnQgc2hhZGVyXFxuICAgICAgb3V0IHZlYzIgdlRleENvb3JkO1xcbiAgICAgIG91dCB2ZWM0IHZDb2xvcjtcXG4gICAgICBvdXQgdmVjMiB2UG9zaXRpb247XFxuICAgICAgLy8gZmxhdCB2YWx1ZXMgYXJlIG5vdCBpbnRlcnBvbGF0ZWRcXG4gICAgICBmbGF0IG91dCBpbnQgdkF0bGFzSWQ7IFxcbiAgICAgIGZsYXQgb3V0IGludCB2VmVydFR5cGU7XFxuICAgICAgZmxhdCBvdXQgdmVjMiB2VG9wUmlnaHQ7XFxuICAgICAgZmxhdCBvdXQgdmVjMiB2Qm90TGVmdDtcXG4gICAgICBmbGF0IG91dCB2ZWM0IHZDb3JuZXJSYWRpdXM7XFxuICAgICAgZmxhdCBvdXQgdmVjNCB2Qm9yZGVyQ29sb3I7XFxuICAgICAgZmxhdCBvdXQgdmVjMiB2Qm9yZGVyV2lkdGg7XFxuICAgICAgZmxhdCBvdXQgdmVjNCB2SW5kZXg7XFxuICAgICAgXFxuICAgICAgdm9pZCBtYWluKHZvaWQpIHtcXG4gICAgICAgIGludCB2aWQgPSBnbF9WZXJ0ZXhJRDtcXG4gICAgICAgIHZlYzIgcG9zaXRpb24gPSBhUG9zaXRpb247IC8vIFRPRE8gbWFrZSB0aGlzIGEgdmVjMywgc2ltcGxpZmllcyBzb21lIGNvZGUgYmVsb3dcXG5cXG4gICAgICAgIGlmKGFWZXJ0VHlwZSA9PSBcIi5jb25jYXQoVEVYVFVSRSwgXCIpIHtcXG4gICAgICAgICAgZmxvYXQgdGV4WCA9IGFUZXgueDsgLy8gdGV4dHVyZSBjb29yZGluYXRlc1xcbiAgICAgICAgICBmbG9hdCB0ZXhZID0gYVRleC55O1xcbiAgICAgICAgICBmbG9hdCB0ZXhXID0gYVRleC56O1xcbiAgICAgICAgICBmbG9hdCB0ZXhIID0gYVRleC53O1xcblxcbiAgICAgICAgICBpZih2aWQgPT0gMSB8fCB2aWQgPT0gMiB8fCB2aWQgPT0gNCkge1xcbiAgICAgICAgICAgIHRleFggKz0gdGV4VztcXG4gICAgICAgICAgfVxcbiAgICAgICAgICBpZih2aWQgPT0gMiB8fCB2aWQgPT0gNCB8fCB2aWQgPT0gNSkge1xcbiAgICAgICAgICAgIHRleFkgKz0gdGV4SDtcXG4gICAgICAgICAgfVxcblxcbiAgICAgICAgICBmbG9hdCBkID0gZmxvYXQodUF0bGFzU2l6ZSk7XFxuICAgICAgICAgIHZUZXhDb29yZCA9IHZlYzIodGV4WCAvIGQsIHRleFkgLyBkKTsgLy8gdGV4IGNvb3JkcyBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMVxcblxcbiAgICAgICAgICBnbF9Qb3NpdGlvbiA9IHZlYzQodVBhblpvb21NYXRyaXggKiBhVHJhbnNmb3JtICogdmVjMyhwb3NpdGlvbiwgMS4wKSwgMS4wKTtcXG4gICAgICAgIH1cXG4gICAgICAgIGVsc2UgaWYoYVZlcnRUeXBlID09IFwiKS5jb25jYXQoUkVDVEFOR0xFLCBcIiB8fCBhVmVydFR5cGUgPT0gXCIpLmNvbmNhdChFTExJUFNFLCBcIiBcXG4gICAgICAgICAgICAgfHwgYVZlcnRUeXBlID09IFwiKS5jb25jYXQoUk9VTkRfUkVDVEFOR0xFLCBcIiB8fCBhVmVydFR5cGUgPT0gXCIpLmNvbmNhdChCT1RUT01fUk9VTkRfUkVDVEFOR0xFLCBcIikgeyAvLyBzaW1wbGUgc2hhcGVzXFxuXFxuICAgICAgICAgIC8vIHRoZSBib3VuZGluZyBib3ggaXMgbmVlZGVkIGJ5IHRoZSBmcmFnbWVudCBzaGFkZXJcXG4gICAgICAgICAgdkJvdExlZnQgID0gKGFUcmFuc2Zvcm0gKiB2ZWMzKDAsIDAsIDEpKS54eTsgLy8gZmxhdFxcbiAgICAgICAgICB2VG9wUmlnaHQgPSAoYVRyYW5zZm9ybSAqIHZlYzMoMSwgMSwgMSkpLnh5OyAvLyBmbGF0XFxuICAgICAgICAgIHZQb3NpdGlvbiA9IChhVHJhbnNmb3JtICogdmVjMyhwb3NpdGlvbiwgMSkpLnh5OyAvLyB3aWxsIGJlIGludGVycG9sYXRlZFxcblxcbiAgICAgICAgICAvLyBjYWxjdWxhdGlvbnMgYXJlIGRvbmUgaW4gdGhlIGZyYWdtZW50IHNoYWRlciwganVzdCBwYXNzIHRoZXNlIGFsb25nXFxuICAgICAgICAgIHZDb2xvciA9IGFDb2xvcjtcXG4gICAgICAgICAgdkNvcm5lclJhZGl1cyA9IGFDb3JuZXJSYWRpdXM7XFxuICAgICAgICAgIHZCb3JkZXJDb2xvciA9IGFCb3JkZXJDb2xvcjtcXG4gICAgICAgICAgdkJvcmRlcldpZHRoID0gYUxpbmVXaWR0aDtcXG5cXG4gICAgICAgICAgZ2xfUG9zaXRpb24gPSB2ZWM0KHVQYW5ab29tTWF0cml4ICogYVRyYW5zZm9ybSAqIHZlYzMocG9zaXRpb24sIDEuMCksIDEuMCk7XFxuICAgICAgICB9XFxuICAgICAgICBlbHNlIGlmKGFWZXJ0VHlwZSA9PSBcIikuY29uY2F0KEVER0VfU1RSQUlHSFQsIFwiKSB7XFxuICAgICAgICAgIHZlYzIgc291cmNlID0gYVBvaW50QVBvaW50Qi54eTtcXG4gICAgICAgICAgdmVjMiB0YXJnZXQgPSBhUG9pbnRBUG9pbnRCLnp3O1xcblxcbiAgICAgICAgICAvLyBhZGp1c3QgdGhlIGdlb21ldHJ5IHNvIHRoYXQgdGhlIGxpbmUgaXMgY2VudGVyZWQgb24gdGhlIGVkZ2VcXG4gICAgICAgICAgcG9zaXRpb24ueSA9IHBvc2l0aW9uLnkgLSAwLjU7XFxuXFxuICAgICAgICAgIC8vIHN0cmV0Y2ggdGhlIHVuaXQgc3F1YXJlIGludG8gYSBsb25nIHNraW5ueSByZWN0YW5nbGVcXG4gICAgICAgICAgdmVjMiB4QmFzaXMgPSB0YXJnZXQgLSBzb3VyY2U7XFxuICAgICAgICAgIHZlYzIgeUJhc2lzID0gbm9ybWFsaXplKHZlYzIoLXhCYXNpcy55LCB4QmFzaXMueCkpO1xcbiAgICAgICAgICB2ZWMyIHBvaW50ID0gc291cmNlICsgeEJhc2lzICogcG9zaXRpb24ueCArIHlCYXNpcyAqIGFMaW5lV2lkdGhbMF0gKiBwb3NpdGlvbi55O1xcblxcbiAgICAgICAgICBnbF9Qb3NpdGlvbiA9IHZlYzQodVBhblpvb21NYXRyaXggKiB2ZWMzKHBvaW50LCAxLjApLCAxLjApO1xcbiAgICAgICAgICB2Q29sb3IgPSBhQ29sb3I7XFxuICAgICAgICB9IFxcbiAgICAgICAgZWxzZSBpZihhVmVydFR5cGUgPT0gXCIpLmNvbmNhdChFREdFX0NVUlZFX1NFR01FTlQsIFwiKSB7XFxuICAgICAgICAgIHZlYzIgcG9pbnRBID0gYVBvaW50QVBvaW50Qi54eTtcXG4gICAgICAgICAgdmVjMiBwb2ludEIgPSBhUG9pbnRBUG9pbnRCLnp3O1xcbiAgICAgICAgICB2ZWMyIHBvaW50QyA9IGFQb2ludENQb2ludEQueHk7XFxuICAgICAgICAgIHZlYzIgcG9pbnREID0gYVBvaW50Q1BvaW50RC56dztcXG5cXG4gICAgICAgICAgLy8gYWRqdXN0IHRoZSBnZW9tZXRyeSBzbyB0aGF0IHRoZSBsaW5lIGlzIGNlbnRlcmVkIG9uIHRoZSBlZGdlXFxuICAgICAgICAgIHBvc2l0aW9uLnkgPSBwb3NpdGlvbi55IC0gMC41O1xcblxcbiAgICAgICAgICB2ZWMyIHAwLCBwMSwgcDIsIHBvcztcXG4gICAgICAgICAgaWYocG9zaXRpb24ueCA9PSAwLjApIHsgLy8gVGhlIGxlZnQgc2lkZSBvZiB0aGUgdW5pdCBzcXVhcmVcXG4gICAgICAgICAgICBwMCA9IHBvaW50QTtcXG4gICAgICAgICAgICBwMSA9IHBvaW50QjtcXG4gICAgICAgICAgICBwMiA9IHBvaW50QztcXG4gICAgICAgICAgICBwb3MgPSBwb3NpdGlvbjtcXG4gICAgICAgICAgfSBlbHNlIHsgLy8gVGhlIHJpZ2h0IHNpZGUgb2YgdGhlIHVuaXQgc3F1YXJlLCB1c2Ugc2FtZSBhcHByb2FjaCBidXQgZmxpcCB0aGUgZ2VvbWV0cnkgdXBzaWRlIGRvd25cXG4gICAgICAgICAgICBwMCA9IHBvaW50RDtcXG4gICAgICAgICAgICBwMSA9IHBvaW50QztcXG4gICAgICAgICAgICBwMiA9IHBvaW50QjtcXG4gICAgICAgICAgICBwb3MgPSB2ZWMyKDAuMCwgLXBvc2l0aW9uLnkpO1xcbiAgICAgICAgICB9XFxuXFxuICAgICAgICAgIHZlYzIgcDAxID0gcDEgLSBwMDtcXG4gICAgICAgICAgdmVjMiBwMTIgPSBwMiAtIHAxO1xcbiAgICAgICAgICB2ZWMyIHAyMSA9IHAxIC0gcDI7XFxuXFxuICAgICAgICAgIC8vIEZpbmQgdGhlIG5vcm1hbCB2ZWN0b3IuXFxuICAgICAgICAgIHZlYzIgdGFuZ2VudCA9IG5vcm1hbGl6ZShub3JtYWxpemUocDEyKSArIG5vcm1hbGl6ZShwMDEpKTtcXG4gICAgICAgICAgdmVjMiBub3JtYWwgPSB2ZWMyKC10YW5nZW50LnksIHRhbmdlbnQueCk7XFxuXFxuICAgICAgICAgIC8vIEZpbmQgdGhlIHZlY3RvciBwZXJwZW5kaWN1bGFyIHRvIHAwIC0+IHAxLlxcbiAgICAgICAgICB2ZWMyIHAwMU5vcm0gPSBub3JtYWxpemUodmVjMigtcDAxLnksIHAwMS54KSk7XFxuXFxuICAgICAgICAgIC8vIERldGVybWluZSB0aGUgYmVuZCBkaXJlY3Rpb24uXFxuICAgICAgICAgIGZsb2F0IHNpZ21hID0gc2lnbihkb3QocDAxICsgcDIxLCBub3JtYWwpKTtcXG4gICAgICAgICAgZmxvYXQgd2lkdGggPSBhTGluZVdpZHRoWzBdO1xcblxcbiAgICAgICAgICBpZihzaWduKHBvcy55KSA9PSAtc2lnbWEpIHtcXG4gICAgICAgICAgICAvLyBUaGlzIGlzIGFuIGludGVyc2VjdGluZyB2ZXJ0ZXguIEFkanVzdCB0aGUgcG9zaXRpb24gc28gdGhhdCB0aGVyZSdzIG5vIG92ZXJsYXAuXFxuICAgICAgICAgICAgdmVjMiBwb2ludCA9IDAuNSAqIHdpZHRoICogbm9ybWFsICogLXNpZ21hIC8gZG90KG5vcm1hbCwgcDAxTm9ybSk7XFxuICAgICAgICAgICAgZ2xfUG9zaXRpb24gPSB2ZWM0KHVQYW5ab29tTWF0cml4ICogdmVjMyhwMSArIHBvaW50LCAxLjApLCAxLjApO1xcbiAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBub24taW50ZXJzZWN0aW5nIHZlcnRleC4gVHJlYXQgaXQgbGlrZSBhIG1pdHJlIGpvaW4uXFxuICAgICAgICAgICAgdmVjMiBwb2ludCA9IDAuNSAqIHdpZHRoICogbm9ybWFsICogc2lnbWEgKiBkb3Qobm9ybWFsLCBwMDFOb3JtKTtcXG4gICAgICAgICAgICBnbF9Qb3NpdGlvbiA9IHZlYzQodVBhblpvb21NYXRyaXggKiB2ZWMzKHAxICsgcG9pbnQsIDEuMCksIDEuMCk7XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgdkNvbG9yID0gYUNvbG9yO1xcbiAgICAgICAgfSBcXG4gICAgICAgIGVsc2UgaWYoYVZlcnRUeXBlID09IFwiKS5jb25jYXQoRURHRV9BUlJPVywgXCIgJiYgdmlkIDwgMykge1xcbiAgICAgICAgICAvLyBtYXNzYWdlIHRoZSBmaXJzdCB0cmlhbmdsZSBpbnRvIGFuIGVkZ2UgYXJyb3dcXG4gICAgICAgICAgaWYodmlkID09IDApXFxuICAgICAgICAgICAgcG9zaXRpb24gPSB2ZWMyKC0wLjE1LCAtMC4zKTtcXG4gICAgICAgICAgaWYodmlkID09IDEpXFxuICAgICAgICAgICAgcG9zaXRpb24gPSB2ZWMyKCAgMC4wLCAgMC4wKTtcXG4gICAgICAgICAgaWYodmlkID09IDIpXFxuICAgICAgICAgICAgcG9zaXRpb24gPSB2ZWMyKCAwLjE1LCAtMC4zKTtcXG5cXG4gICAgICAgICAgZ2xfUG9zaXRpb24gPSB2ZWM0KHVQYW5ab29tTWF0cml4ICogYVRyYW5zZm9ybSAqIHZlYzMocG9zaXRpb24sIDEuMCksIDEuMCk7XFxuICAgICAgICAgIHZDb2xvciA9IGFDb2xvcjtcXG4gICAgICAgIH1cXG4gICAgICAgIGVsc2Uge1xcbiAgICAgICAgICBnbF9Qb3NpdGlvbiA9IHZlYzQoMi4wLCAwLjAsIDAuMCwgMS4wKTsgLy8gZGlzY2FyZCB2ZXJ0ZXggYnkgcHV0dGluZyBpdCBvdXRzaWRlIHdlYmdsIGNsaXAgc3BhY2VcXG4gICAgICAgIH1cXG5cXG4gICAgICAgIHZBdGxhc0lkID0gYUF0bGFzSWQ7XFxuICAgICAgICB2VmVydFR5cGUgPSBhVmVydFR5cGU7XFxuICAgICAgICB2SW5kZXggPSBhSW5kZXg7XFxuICAgICAgfVxcbiAgICBcIik7XG4gICAgICB2YXIgaWR4cyA9IHRoaXMuYmF0Y2hNYW5hZ2VyLmdldEluZGV4QXJyYXkoKTtcbiAgICAgIHZhciBmcmFnbWVudFNoYWRlclNvdXJjZSA9IFwiI3ZlcnNpb24gMzAwIGVzXFxuICAgICAgcHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xcblxcbiAgICAgIC8vIGRlY2xhcmUgdGV4dHVyZSB1bml0IGZvciBlYWNoIHRleHR1cmUgYXRsYXMgaW4gdGhlIGJhdGNoXFxuICAgICAgXCIuY29uY2F0KGlkeHMubWFwKGZ1bmN0aW9uIChpKSB7XG4gICAgICAgIHJldHVybiBcInVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlXCIuY29uY2F0KGksIFwiO1wiKTtcbiAgICAgIH0pLmpvaW4oJ1xcblxcdCcpLCBcIlxcblxcbiAgICAgIHVuaWZvcm0gdmVjNCB1QkdDb2xvcjtcXG4gICAgICB1bmlmb3JtIGZsb2F0IHVab29tO1xcblxcbiAgICAgIGluIHZlYzIgdlRleENvb3JkO1xcbiAgICAgIGluIHZlYzQgdkNvbG9yO1xcbiAgICAgIGluIHZlYzIgdlBvc2l0aW9uOyAvLyBtb2RlbCBjb29yZGluYXRlc1xcblxcbiAgICAgIGZsYXQgaW4gaW50IHZBdGxhc0lkO1xcbiAgICAgIGZsYXQgaW4gdmVjNCB2SW5kZXg7XFxuICAgICAgZmxhdCBpbiBpbnQgdlZlcnRUeXBlO1xcbiAgICAgIGZsYXQgaW4gdmVjMiB2VG9wUmlnaHQ7XFxuICAgICAgZmxhdCBpbiB2ZWMyIHZCb3RMZWZ0O1xcbiAgICAgIGZsYXQgaW4gdmVjNCB2Q29ybmVyUmFkaXVzO1xcbiAgICAgIGZsYXQgaW4gdmVjNCB2Qm9yZGVyQ29sb3I7XFxuICAgICAgZmxhdCBpbiB2ZWMyIHZCb3JkZXJXaWR0aDtcXG5cXG4gICAgICBvdXQgdmVjNCBvdXRDb2xvcjtcXG5cXG4gICAgICBcIikuY29uY2F0KGNpcmNsZVNELCBcIlxcbiAgICAgIFwiKS5jb25jYXQocmVjdGFuZ2xlU0QsIFwiXFxuICAgICAgXCIpLmNvbmNhdChyb3VuZFJlY3RhbmdsZVNELCBcIlxcbiAgICAgIFwiKS5jb25jYXQoZWxsaXBzZVNELCBcIlxcblxcbiAgICAgIHZlYzQgYmxlbmQodmVjNCB0b3AsIHZlYzQgYm90KSB7IC8vIGJsZW5kIGNvbG9ycyB3aXRoIHByZW11bHRpcGxpZWQgYWxwaGFcXG4gICAgICAgIHJldHVybiB2ZWM0KCBcXG4gICAgICAgICAgdG9wLnJnYiArIChib3QucmdiICogKDEuMCAtIHRvcC5hKSksXFxuICAgICAgICAgIHRvcC5hICAgKyAoYm90LmEgICAqICgxLjAgLSB0b3AuYSkpIFxcbiAgICAgICAgKTtcXG4gICAgICB9XFxuXFxuICAgICAgdmVjNCBkaXN0SW50ZXJwKHZlYzQgY0EsIHZlYzQgY0IsIGZsb2F0IGQpIHsgLy8gaW50ZXJwb2xhdGUgY29sb3IgdXNpbmcgU2lnbmVkIERpc3RhbmNlXFxuICAgICAgICAvLyBzY2FsZSB0byB0aGUgem9vbSBsZXZlbCBzbyB0aGF0IGJvcmRlcnMgZG9uJ3QgbG9vayBibHVycnkgd2hlbiB6b29tZWQgaW5cXG4gICAgICAgIC8vIG5vdGUgMS41IGlzIGFuIGFyaWJpdHJhcnkgdmFsdWUgY2hvc2VuIGJlY2F1c2UgaXQgbG9va3MgZ29vZFxcbiAgICAgICAgcmV0dXJuIG1peChjQSwgY0IsIDEuMCAtIHNtb290aHN0ZXAoMC4wLCAxLjUgLyB1Wm9vbSwgYWJzKGQpKSk7IFxcbiAgICAgIH1cXG5cXG4gICAgICB2b2lkIG1haW4odm9pZCkge1xcbiAgICAgICAgaWYodlZlcnRUeXBlID09IFwiKS5jb25jYXQoVEVYVFVSRSwgXCIpIHtcXG4gICAgICAgICAgLy8gbG9vayB1cCB0aGUgdGV4ZWwgZnJvbSB0aGUgdGV4dHVyZSB1bml0XFxuICAgICAgICAgIFwiKS5jb25jYXQoaWR4cy5tYXAoZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgcmV0dXJuIFwiaWYodkF0bGFzSWQgPT0gXCIuY29uY2F0KGksIFwiKSBvdXRDb2xvciA9IHRleHR1cmUodVRleHR1cmVcIikuY29uY2F0KGksIFwiLCB2VGV4Q29vcmQpO1wiKTtcbiAgICAgIH0pLmpvaW4oJ1xcblxcdGVsc2UgJyksIFwiXFxuICAgICAgICB9IFxcbiAgICAgICAgZWxzZSBpZih2VmVydFR5cGUgPT0gXCIpLmNvbmNhdChFREdFX0FSUk9XLCBcIikge1xcbiAgICAgICAgICAvLyBtaW1pY3MgaG93IGNhbnZhcyByZW5kZXJlciB1c2VzIGNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ2Rlc3RpbmF0aW9uLW91dCc7XFxuICAgICAgICAgIG91dENvbG9yID0gYmxlbmQodkNvbG9yLCB1QkdDb2xvcik7XFxuICAgICAgICAgIG91dENvbG9yLmEgPSAxLjA7IC8vIG1ha2Ugb3BhcXVlLCBtYXNrcyBvdXQgbGluZSB1bmRlciBhcnJvd1xcbiAgICAgICAgfVxcbiAgICAgICAgZWxzZSBpZih2VmVydFR5cGUgPT0gXCIpLmNvbmNhdChSRUNUQU5HTEUsIFwiICYmIHZCb3JkZXJXaWR0aCA9PSB2ZWMyKDAuMCkpIHsgLy8gc2ltcGxlIHJlY3RhbmdsZSB3aXRoIG5vIGJvcmRlclxcbiAgICAgICAgICBvdXRDb2xvciA9IHZDb2xvcjsgLy8gdW5pdCBzcXVhcmUgaXMgYWxyZWFkeSB0cmFuc2Zvcm1lZCB0byB0aGUgcmVjdGFuZ2xlLCBub3RoaW5nIGVsc2UgbmVlZHMgdG8gYmUgZG9uZVxcbiAgICAgICAgfVxcbiAgICAgICAgZWxzZSBpZih2VmVydFR5cGUgPT0gXCIpLmNvbmNhdChSRUNUQU5HTEUsIFwiIHx8IHZWZXJ0VHlwZSA9PSBcIikuY29uY2F0KEVMTElQU0UsIFwiIFxcbiAgICAgICAgICB8fCB2VmVydFR5cGUgPT0gXCIpLmNvbmNhdChST1VORF9SRUNUQU5HTEUsIFwiIHx8IHZWZXJ0VHlwZSA9PSBcIikuY29uY2F0KEJPVFRPTV9ST1VORF9SRUNUQU5HTEUsIFwiKSB7IC8vIHVzZSBTREZcXG5cXG4gICAgICAgICAgZmxvYXQgb3V0ZXJCb3JkZXIgPSB2Qm9yZGVyV2lkdGhbMF07XFxuICAgICAgICAgIGZsb2F0IGlubmVyQm9yZGVyID0gdkJvcmRlcldpZHRoWzFdO1xcbiAgICAgICAgICBmbG9hdCBib3JkZXJQYWRkaW5nID0gb3V0ZXJCb3JkZXIgKiAyLjA7XFxuICAgICAgICAgIGZsb2F0IHcgPSB2VG9wUmlnaHQueCAtIHZCb3RMZWZ0LnggLSBib3JkZXJQYWRkaW5nO1xcbiAgICAgICAgICBmbG9hdCBoID0gdlRvcFJpZ2h0LnkgLSB2Qm90TGVmdC55IC0gYm9yZGVyUGFkZGluZztcXG4gICAgICAgICAgdmVjMiBiID0gdmVjMih3LzIuMCwgaC8yLjApOyAvLyBoYWxmIHdpZHRoLCBoYWxmIGhlaWdodFxcbiAgICAgICAgICB2ZWMyIHAgPSB2UG9zaXRpb24gLSB2ZWMyKHZUb3BSaWdodC54IC0gYlswXSAtIG91dGVyQm9yZGVyLCB2VG9wUmlnaHQueSAtIGJbMV0gLSBvdXRlckJvcmRlcik7IC8vIHRyYW5zbGF0ZSB0byBjZW50ZXJcXG5cXG4gICAgICAgICAgZmxvYXQgZDsgLy8gc2lnbmVkIGRpc3RhbmNlXFxuICAgICAgICAgIGlmKHZWZXJ0VHlwZSA9PSBcIikuY29uY2F0KFJFQ1RBTkdMRSwgXCIpIHtcXG4gICAgICAgICAgICBkID0gcmVjdGFuZ2xlU0QocCwgYik7XFxuICAgICAgICAgIH0gZWxzZSBpZih2VmVydFR5cGUgPT0gXCIpLmNvbmNhdChFTExJUFNFLCBcIiAmJiB3ID09IGgpIHtcXG4gICAgICAgICAgICBkID0gY2lyY2xlU0QocCwgYi54KTsgLy8gZmFzdGVyIHRoYW4gZWxsaXBzZVxcbiAgICAgICAgICB9IGVsc2UgaWYodlZlcnRUeXBlID09IFwiKS5jb25jYXQoRUxMSVBTRSwgXCIpIHtcXG4gICAgICAgICAgICBkID0gZWxsaXBzZVNEKHAsIGIpO1xcbiAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGQgPSByb3VuZFJlY3RhbmdsZVNEKHAsIGIsIHZDb3JuZXJSYWRpdXMud3p5eCk7XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgLy8gdXNlIHRoZSBkaXN0YW5jZSB0byBpbnRlcnBvbGF0ZSBhIGNvbG9yIHRvIHNtb290aCB0aGUgZWRnZXMgb2YgdGhlIHNoYXBlLCBkb2Vzbid0IG5lZWQgbXVsdGlzYW1wbGluZ1xcbiAgICAgICAgICAvLyB3ZSBtdXN0IHNtb290aCBjb2xvcnMgaW53YXJkcywgYmVjYXVzZSB3ZSBjYW4ndCBjaGFuZ2UgcGl4ZWxzIG91dHNpZGUgdGhlIHNoYXBlJ3MgYm91bmRpbmcgYm94XFxuICAgICAgICAgIGlmKGQgPiAwLjApIHtcXG4gICAgICAgICAgICBpZihkID4gb3V0ZXJCb3JkZXIpIHtcXG4gICAgICAgICAgICAgIGRpc2NhcmQ7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgIG91dENvbG9yID0gZGlzdEludGVycCh2Qm9yZGVyQ29sb3IsIHZlYzQoMCksIGQgLSBvdXRlckJvcmRlcik7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGlmKGQgPiBpbm5lckJvcmRlcikge1xcbiAgICAgICAgICAgICAgdmVjNCBvdXRlckNvbG9yID0gb3V0ZXJCb3JkZXIgPT0gMC4wID8gdmVjNCgwKSA6IHZCb3JkZXJDb2xvcjtcXG4gICAgICAgICAgICAgIHZlYzQgaW5uZXJCb3JkZXJDb2xvciA9IGJsZW5kKHZCb3JkZXJDb2xvciwgdkNvbG9yKTtcXG4gICAgICAgICAgICAgIG91dENvbG9yID0gZGlzdEludGVycChpbm5lckJvcmRlckNvbG9yLCBvdXRlckNvbG9yLCBkKTtcXG4gICAgICAgICAgICB9IFxcbiAgICAgICAgICAgIGVsc2Uge1xcbiAgICAgICAgICAgICAgdmVjNCBvdXRlckNvbG9yO1xcbiAgICAgICAgICAgICAgaWYoaW5uZXJCb3JkZXIgPT0gMC4wICYmIG91dGVyQm9yZGVyID09IDAuMCkge1xcbiAgICAgICAgICAgICAgICBvdXRlckNvbG9yID0gdmVjNCgwKTtcXG4gICAgICAgICAgICAgIH0gZWxzZSBpZihpbm5lckJvcmRlciA9PSAwLjApIHtcXG4gICAgICAgICAgICAgICAgb3V0ZXJDb2xvciA9IHZCb3JkZXJDb2xvcjtcXG4gICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIG91dGVyQ29sb3IgPSBibGVuZCh2Qm9yZGVyQ29sb3IsIHZDb2xvcik7XFxuICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICBvdXRDb2xvciA9IGRpc3RJbnRlcnAodkNvbG9yLCBvdXRlckNvbG9yLCBkIC0gaW5uZXJCb3JkZXIpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICAgICAgZWxzZSB7XFxuICAgICAgICAgIG91dENvbG9yID0gdkNvbG9yO1xcbiAgICAgICAgfVxcblxcbiAgICAgICAgXCIpLmNvbmNhdChyZW5kZXJUYXJnZXQucGlja2luZyA/IFwiaWYob3V0Q29sb3IuYSA9PSAwLjApIGRpc2NhcmQ7XFxuICAgICAgICAgICAgIGVsc2Ugb3V0Q29sb3IgPSB2SW5kZXg7XCIgOiAnJywgXCJcXG4gICAgICB9XFxuICAgIFwiKTtcbiAgICAgIHZhciBwcm9ncmFtID0gY3JlYXRlUHJvZ3JhbShnbCwgdmVydGV4U2hhZGVyU291cmNlLCBmcmFnbWVudFNoYWRlclNvdXJjZSk7XG5cbiAgICAgIC8vIGluc3RhbmNlIGdlb21ldHJ5XG4gICAgICBwcm9ncmFtLmFQb3NpdGlvbiA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sICdhUG9zaXRpb24nKTtcblxuICAgICAgLy8gYXR0cmlidXRlc1xuICAgICAgcHJvZ3JhbS5hSW5kZXggPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCAnYUluZGV4Jyk7XG4gICAgICBwcm9ncmFtLmFWZXJ0VHlwZSA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sICdhVmVydFR5cGUnKTtcbiAgICAgIHByb2dyYW0uYVRyYW5zZm9ybSA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sICdhVHJhbnNmb3JtJyk7XG4gICAgICBwcm9ncmFtLmFBdGxhc0lkID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgJ2FBdGxhc0lkJyk7XG4gICAgICBwcm9ncmFtLmFUZXggPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCAnYVRleCcpO1xuICAgICAgcHJvZ3JhbS5hUG9pbnRBUG9pbnRCID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgJ2FQb2ludEFQb2ludEInKTtcbiAgICAgIHByb2dyYW0uYVBvaW50Q1BvaW50RCA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sICdhUG9pbnRDUG9pbnREJyk7XG4gICAgICBwcm9ncmFtLmFMaW5lV2lkdGggPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCAnYUxpbmVXaWR0aCcpO1xuICAgICAgcHJvZ3JhbS5hQ29sb3IgPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCAnYUNvbG9yJyk7XG4gICAgICBwcm9ncmFtLmFDb3JuZXJSYWRpdXMgPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCAnYUNvcm5lclJhZGl1cycpO1xuICAgICAgcHJvZ3JhbS5hQm9yZGVyQ29sb3IgPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCAnYUJvcmRlckNvbG9yJyk7XG5cbiAgICAgIC8vIHVuaWZvcm1zXG4gICAgICBwcm9ncmFtLnVQYW5ab29tTWF0cml4ID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICd1UGFuWm9vbU1hdHJpeCcpO1xuICAgICAgcHJvZ3JhbS51QXRsYXNTaXplID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICd1QXRsYXNTaXplJyk7XG4gICAgICBwcm9ncmFtLnVCR0NvbG9yID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICd1QkdDb2xvcicpO1xuICAgICAgcHJvZ3JhbS51Wm9vbSA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAndVpvb20nKTtcbiAgICAgIHByb2dyYW0udVRleHR1cmVzID0gW107XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuYmF0Y2hNYW5hZ2VyLmdldE1heEF0bGFzZXNQZXJCYXRjaCgpOyBpKyspIHtcbiAgICAgICAgcHJvZ3JhbS51VGV4dHVyZXMucHVzaChnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgXCJ1VGV4dHVyZVwiLmNvbmNhdChpKSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHByb2dyYW07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9jcmVhdGVWQU9cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2NyZWF0ZVZBTygpIHtcbiAgICAgIHZhciB1bml0U3F1YXJlID0gWzAsIDAsIDEsIDAsIDEsIDEsIDAsIDAsIDEsIDEsIDAsIDFdO1xuICAgICAgdGhpcy52ZXJ0ZXhDb3VudCA9IHVuaXRTcXVhcmUubGVuZ3RoIC8gMjtcbiAgICAgIHZhciBuID0gdGhpcy5tYXhJbnN0YW5jZXM7XG4gICAgICB2YXIgZ2wgPSB0aGlzLmdsLFxuICAgICAgICBwcm9ncmFtID0gdGhpcy5wcm9ncmFtO1xuICAgICAgdmFyIHZhbyA9IGdsLmNyZWF0ZVZlcnRleEFycmF5KCk7XG4gICAgICBnbC5iaW5kVmVydGV4QXJyYXkodmFvKTtcbiAgICAgIGNyZWF0ZUJ1ZmZlclN0YXRpY0RyYXcoZ2wsICd2ZWMyJywgcHJvZ3JhbS5hUG9zaXRpb24sIHVuaXRTcXVhcmUpO1xuXG4gICAgICAvLyBDcmVhdGUgYnVmZmVycyBmb3IgYWxsIHRoZSBhdHRyaWJ1dGVzXG4gICAgICB0aGlzLnRyYW5zZm9ybUJ1ZmZlciA9IGNyZWF0ZTN4M01hdHJpeEJ1ZmZlckR5bmFtaWNEcmF3KGdsLCBuLCBwcm9ncmFtLmFUcmFuc2Zvcm0pO1xuICAgICAgdGhpcy5pbmRleEJ1ZmZlciA9IGNyZWF0ZUJ1ZmZlckR5bmFtaWNEcmF3KGdsLCBuLCAndmVjNCcsIHByb2dyYW0uYUluZGV4KTtcbiAgICAgIHRoaXMudmVydFR5cGVCdWZmZXIgPSBjcmVhdGVCdWZmZXJEeW5hbWljRHJhdyhnbCwgbiwgJ2ludCcsIHByb2dyYW0uYVZlcnRUeXBlKTtcbiAgICAgIHRoaXMuYXRsYXNJZEJ1ZmZlciA9IGNyZWF0ZUJ1ZmZlckR5bmFtaWNEcmF3KGdsLCBuLCAnaW50JywgcHJvZ3JhbS5hQXRsYXNJZCk7XG4gICAgICB0aGlzLnRleEJ1ZmZlciA9IGNyZWF0ZUJ1ZmZlckR5bmFtaWNEcmF3KGdsLCBuLCAndmVjNCcsIHByb2dyYW0uYVRleCk7XG4gICAgICB0aGlzLnBvaW50QVBvaW50QkJ1ZmZlciA9IGNyZWF0ZUJ1ZmZlckR5bmFtaWNEcmF3KGdsLCBuLCAndmVjNCcsIHByb2dyYW0uYVBvaW50QVBvaW50Qik7XG4gICAgICB0aGlzLnBvaW50Q1BvaW50REJ1ZmZlciA9IGNyZWF0ZUJ1ZmZlckR5bmFtaWNEcmF3KGdsLCBuLCAndmVjNCcsIHByb2dyYW0uYVBvaW50Q1BvaW50RCk7XG4gICAgICB0aGlzLmxpbmVXaWR0aEJ1ZmZlciA9IGNyZWF0ZUJ1ZmZlckR5bmFtaWNEcmF3KGdsLCBuLCAndmVjMicsIHByb2dyYW0uYUxpbmVXaWR0aCk7XG4gICAgICB0aGlzLmNvbG9yQnVmZmVyID0gY3JlYXRlQnVmZmVyRHluYW1pY0RyYXcoZ2wsIG4sICd2ZWM0JywgcHJvZ3JhbS5hQ29sb3IpO1xuICAgICAgdGhpcy5jb3JuZXJSYWRpdXNCdWZmZXIgPSBjcmVhdGVCdWZmZXJEeW5hbWljRHJhdyhnbCwgbiwgJ3ZlYzQnLCBwcm9ncmFtLmFDb3JuZXJSYWRpdXMpO1xuICAgICAgdGhpcy5ib3JkZXJDb2xvckJ1ZmZlciA9IGNyZWF0ZUJ1ZmZlckR5bmFtaWNEcmF3KGdsLCBuLCAndmVjNCcsIHByb2dyYW0uYUJvcmRlckNvbG9yKTtcbiAgICAgIGdsLmJpbmRWZXJ0ZXhBcnJheShudWxsKTtcbiAgICAgIHJldHVybiB2YW87XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImJ1ZmZlcnNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICBpZiAoIXRoaXMuX2J1ZmZlcnMpIHtcbiAgICAgICAgdGhpcy5fYnVmZmVycyA9IE9iamVjdC5rZXlzKHRoaXMpLmZpbHRlcihmdW5jdGlvbiAoaykge1xuICAgICAgICAgIHJldHVybiBlbmRzV2l0aChrLCAnQnVmZmVyJyk7XG4gICAgICAgIH0pLm1hcChmdW5jdGlvbiAoaykge1xuICAgICAgICAgIHJldHVybiBfdGhpc1trXTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5fYnVmZmVycztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic3RhcnRGcmFtZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzdGFydEZyYW1lKHBhblpvb21NYXRyaXgpIHtcbiAgICAgIHZhciByZW5kZXJUYXJnZXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IFJFTkRFUl9UQVJHRVQuU0NSRUVOO1xuICAgICAgdGhpcy5wYW5ab29tTWF0cml4ID0gcGFuWm9vbU1hdHJpeDtcbiAgICAgIHRoaXMucmVuZGVyVGFyZ2V0ID0gcmVuZGVyVGFyZ2V0O1xuICAgICAgdGhpcy5iYXRjaERlYnVnSW5mbyA9IFtdO1xuICAgICAgdGhpcy53cmFwcGVkQ291bnQgPSAwO1xuICAgICAgdGhpcy5zaW1wbGVDb3VudCA9IDA7XG4gICAgICB0aGlzLnN0YXJ0QmF0Y2goKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic3RhcnRCYXRjaFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzdGFydEJhdGNoKCkge1xuICAgICAgdGhpcy5pbnN0YW5jZUNvdW50ID0gMDtcbiAgICAgIHRoaXMuYmF0Y2hNYW5hZ2VyLnN0YXJ0QmF0Y2goKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZW5kRnJhbWVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZW5kRnJhbWUoKSB7XG4gICAgICB0aGlzLmVuZEJhdGNoKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9pc1Zpc2libGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2lzVmlzaWJsZShlbGUsIG9wdHMpIHtcbiAgICAgIGlmIChlbGUudmlzaWJsZSgpKSB7XG4gICAgICAgIGlmIChvcHRzICYmIG9wdHMuaXNWaXNpYmxlKSB7XG4gICAgICAgICAgcmV0dXJuIG9wdHMuaXNWaXNpYmxlKGVsZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHJhd3MgYSB0ZXh0dXJlIHVzaW5nIHRoZSB0ZXh0dXJlIGF0bGFzLlxuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiBcImRyYXdUZXh0dXJlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRyYXdUZXh0dXJlKGVsZSwgZWxlSW5kZXgsIHR5cGUpIHtcbiAgICAgIHZhciBhdGxhc01hbmFnZXIgPSB0aGlzLmF0bGFzTWFuYWdlcixcbiAgICAgICAgYmF0Y2hNYW5hZ2VyID0gdGhpcy5iYXRjaE1hbmFnZXI7XG4gICAgICB2YXIgb3B0cyA9IGF0bGFzTWFuYWdlci5nZXRSZW5kZXJUeXBlT3B0cyh0eXBlKTtcbiAgICAgIGlmICghdGhpcy5faXNWaXNpYmxlKGVsZSwgb3B0cykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBFZGdlcyB3aXRoIGludmFsaWQgcG9pbnRzIGNvdWxkIGJlIHBhc3NlZCBoZXJlIChsYWJlbHMpLCBjYXVzaW5nIGVycm9yc1xuICAgICAgLy8gUmVmOiBSYW5kb20gXCJTY3JpcHQgRXJyb3JcIiB0aHJvd24gd2hlbiBnZW5lcmF0aW5nIG5vZGVzIGFuZCBlZGdlcyBpbiBuZXdlc3Qgd2ViZ2wgdmVyc2lvbiAjMzM2NVxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2N5dG9zY2FwZS9jeXRvc2NhcGUuanMvaXNzdWVzLzMzNjVcbiAgICAgIGlmIChlbGUuaXNFZGdlKCkgJiYgIXRoaXMuX2lzVmFsaWRFZGdlKGVsZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMucmVuZGVyVGFyZ2V0LnBpY2tpbmcgJiYgb3B0cy5nZXRUZXhQaWNraW5nTW9kZSkge1xuICAgICAgICB2YXIgbW9kZSA9IG9wdHMuZ2V0VGV4UGlja2luZ01vZGUoZWxlKTtcbiAgICAgICAgaWYgKG1vZGUgPT09IFRFWF9QSUNLSU5HX01PREUuSUdOT1JFKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gVEVYX1BJQ0tJTkdfTU9ERS5VU0VfQkIpIHtcbiAgICAgICAgICB0aGlzLmRyYXdQaWNraW5nUmVjdGFuZ2xlKGVsZSwgZWxlSW5kZXgsIHR5cGUpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBHZXQgdGhlIGF0bGFzIGFuZCB0aGUgdGV4dHVyZSBjb29yZGluYXRlcywgd2lsbCBkcmF3IHRoZSB0ZXh0dXJlIGlmIGl0IGhhc24ndCBiZWVuIGRyYXduIHlldFxuICAgICAgLy8gTWF5IGJlIG1vcmUgdGhhbiBvbmUgdGV4dHVyZSBpZiBmb3IgZXhhbXBsZSB0aGUgbGFiZWwgaGFzIG11bHRpcGxlIGxpbmVzXG4gICAgICB2YXIgYXRsYXNJbmZvQXJyYXkgPSBhdGxhc01hbmFnZXIuZ2V0QXRsYXNJbmZvKGVsZSwgdHlwZSk7XG4gICAgICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoYXRsYXNJbmZvQXJyYXkpLFxuICAgICAgICBfc3RlcDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgdmFyIGF0bGFzSW5mbyA9IF9zdGVwLnZhbHVlO1xuICAgICAgICAgIHZhciBhdGxhcyA9IGF0bGFzSW5mby5hdGxhcyxcbiAgICAgICAgICAgIHRleDEgPSBhdGxhc0luZm8udGV4MSxcbiAgICAgICAgICAgIHRleDIgPSBhdGxhc0luZm8udGV4MjsgLy8gdGV4MiBpcyB1c2VkIGlmIHRoZSBsYWJlbCB3cmFwcyBhbmQgdGhlcmUgYXJlIHR3byB0ZXh0dXJlc1xuXG4gICAgICAgICAgaWYgKCFiYXRjaE1hbmFnZXIuY2FuQWRkVG9DdXJyZW50QmF0Y2goYXRsYXMpKSB7XG4gICAgICAgICAgICB0aGlzLmVuZEJhdGNoKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBhdGxhc0luZGV4ID0gYmF0Y2hNYW5hZ2VyLmdldEF0bGFzSW5kZXhGb3JCYXRjaChhdGxhcyk7XG4gICAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBfYXJyID0gW1t0ZXgxLCB0cnVlXSwgW3RleDIsIGZhbHNlXV07IF9pIDwgX2Fyci5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIHZhciBfYXJyJF9pID0gX3NsaWNlZFRvQXJyYXkoX2FycltfaV0sIDIpLFxuICAgICAgICAgICAgICB0ZXggPSBfYXJyJF9pWzBdLFxuICAgICAgICAgICAgICBmaXJzdCA9IF9hcnIkX2lbMV07XG4gICAgICAgICAgICBpZiAodGV4LncgIT0gMCkge1xuICAgICAgICAgICAgICB2YXIgaW5zdGFuY2UgPSB0aGlzLmluc3RhbmNlQ291bnQ7XG4gICAgICAgICAgICAgIHRoaXMudmVydFR5cGVCdWZmZXIuZ2V0VmlldyhpbnN0YW5jZSlbMF0gPSBURVhUVVJFO1xuICAgICAgICAgICAgICB2YXIgaW5kZXhWaWV3ID0gdGhpcy5pbmRleEJ1ZmZlci5nZXRWaWV3KGluc3RhbmNlKTtcbiAgICAgICAgICAgICAgaW5kZXhUb1ZlYzQoZWxlSW5kZXgsIGluZGV4Vmlldyk7XG5cbiAgICAgICAgICAgICAgLy8gU2V0IHZhbHVlcyBpbiB0aGUgYnVmZmVycyB1c2luZyBUeXBlZCBBcnJheSBWaWV3cyBmb3IgcGVyZm9ybWFuY2UuXG4gICAgICAgICAgICAgIHZhciBhdGxhc0lkVmlldyA9IHRoaXMuYXRsYXNJZEJ1ZmZlci5nZXRWaWV3KGluc3RhbmNlKTtcbiAgICAgICAgICAgICAgYXRsYXNJZFZpZXdbMF0gPSBhdGxhc0luZGV4O1xuXG4gICAgICAgICAgICAgIC8vIHdlIGhhdmUgdHdvIHNldHMgb2YgdGV4dHVyZSBjb29yZGluYXRlcyBhbmQgdHJhbnNmb3JtcyBiZWNhdXNlIHRleHR1cmVzIGNhbiB3cmFwIGluIHRoZSBhdGxhc1xuICAgICAgICAgICAgICB2YXIgdGV4VmlldyA9IHRoaXMudGV4QnVmZmVyLmdldFZpZXcoaW5zdGFuY2UpO1xuICAgICAgICAgICAgICB0ZXhWaWV3WzBdID0gdGV4Lng7XG4gICAgICAgICAgICAgIHRleFZpZXdbMV0gPSB0ZXgueTtcbiAgICAgICAgICAgICAgdGV4Vmlld1syXSA9IHRleC53O1xuICAgICAgICAgICAgICB0ZXhWaWV3WzNdID0gdGV4Lmg7XG4gICAgICAgICAgICAgIHZhciBtYXRyaXhWaWV3ID0gdGhpcy50cmFuc2Zvcm1CdWZmZXIuZ2V0TWF0cml4VmlldyhpbnN0YW5jZSk7XG4gICAgICAgICAgICAgIHRoaXMuc2V0VHJhbnNmb3JtTWF0cml4KGVsZSwgbWF0cml4Vmlldywgb3B0cywgYXRsYXNJbmZvLCBmaXJzdCk7XG4gICAgICAgICAgICAgIHRoaXMuaW5zdGFuY2VDb3VudCsrO1xuICAgICAgICAgICAgICBpZiAoIWZpcnN0KSB0aGlzLndyYXBwZWRDb3VudCsrO1xuICAgICAgICAgICAgICBpZiAodGhpcy5pbnN0YW5jZUNvdW50ID49IHRoaXMubWF4SW5zdGFuY2VzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbmRCYXRjaCgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgX2l0ZXJhdG9yLmUoZXJyKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIF9pdGVyYXRvci5mKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogbWF0cml4IGlzIGV4cGVjdGVkIHRvIGJlIGEgOSBlbGVtZW50IGFycmF5XG4gICAgICogdGhpcyBmdW5jdGlvbiBmb2xsb3dzIHNhbWUgcGF0dGVybiBhcyBDUnAuZHJhd0NhY2hlZEVsZW1lbnRQb3J0aW9uKC4uLilcbiAgICAgKi9cbiAgfSwge1xuICAgIGtleTogXCJzZXRUcmFuc2Zvcm1NYXRyaXhcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0VHJhbnNmb3JtTWF0cml4KGVsZSwgbWF0cml4LCBvcHRzLCBhdGxhc0luZm8pIHtcbiAgICAgIHZhciBmaXJzdCA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ICYmIGFyZ3VtZW50c1s0XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzRdIDogdHJ1ZTtcbiAgICAgIHZhciBwYWRkaW5nID0gMDtcbiAgICAgIGlmIChvcHRzLnNoYXBlUHJvcHMgJiYgb3B0cy5zaGFwZVByb3BzLnBhZGRpbmcpIHtcbiAgICAgICAgcGFkZGluZyA9IGVsZS5wc3R5bGUob3B0cy5zaGFwZVByb3BzLnBhZGRpbmcpLnBmVmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAoYXRsYXNJbmZvKSB7XG4gICAgICAgIC8vIHdlJ3ZlIGFscmVhZHkgY29tcHV0ZWQgdGhlIGJiIGFuZCB0ZXggYm91bmRzIGZvciBhIHRleHR1cmVcbiAgICAgICAgdmFyIGJiID0gYXRsYXNJbmZvLmJiLFxuICAgICAgICAgIHRleDEgPSBhdGxhc0luZm8udGV4MSxcbiAgICAgICAgICB0ZXgyID0gYXRsYXNJbmZvLnRleDI7XG4gICAgICAgIC8vIHdyYXBwZWQgdGV4dHVyZXMgbmVlZCBzZXBhcmF0ZSBtYXRyaXggZm9yIGVhY2ggcGFydFxuICAgICAgICB2YXIgcmF0aW8gPSB0ZXgxLncgLyAodGV4MS53ICsgdGV4Mi53KTtcbiAgICAgICAgaWYgKCFmaXJzdCkge1xuICAgICAgICAgIC8vIGZpcnN0ID0gdHJ1ZSBtZWFucyBpdHMgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIHdyYXBwZWQgdGV4dHVyZVxuICAgICAgICAgIHJhdGlvID0gMSAtIHJhdGlvO1xuICAgICAgICB9XG4gICAgICAgIHZhciBhZGpCQiA9IHRoaXMuX2dldEFkanVzdGVkQkIoYmIsIHBhZGRpbmcsIGZpcnN0LCByYXRpbyk7XG4gICAgICAgIHRoaXMuX2FwcGx5VHJhbnNmb3JtTWF0cml4KG1hdHJpeCwgYWRqQkIsIG9wdHMsIGVsZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB3ZSBkb24ndCBoYXZlIGEgdGV4dHVyZSwgb3Igd2Ugd2FudCB0byBhdm9pZCBjcmVhdGluZyBhIHRleHR1cmUgZm9yIHNpbXBsZSBzaGFwZXNcbiAgICAgICAgdmFyIF9iYiA9IG9wdHMuZ2V0Qm91bmRpbmdCb3goZWxlKTtcbiAgICAgICAgdmFyIF9hZGpCQiA9IHRoaXMuX2dldEFkanVzdGVkQkIoX2JiLCBwYWRkaW5nLCB0cnVlLCAxKTtcbiAgICAgICAgdGhpcy5fYXBwbHlUcmFuc2Zvcm1NYXRyaXgobWF0cml4LCBfYWRqQkIsIG9wdHMsIGVsZSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9hcHBseVRyYW5zZm9ybU1hdHJpeFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfYXBwbHlUcmFuc2Zvcm1NYXRyaXgobWF0cml4LCBhZGpCQiwgb3B0cywgZWxlKSB7XG4gICAgICB2YXIgeCwgeTtcbiAgICAgIGlkZW50aXR5KG1hdHJpeCk7XG4gICAgICB2YXIgdGhldGEgPSBvcHRzLmdldFJvdGF0aW9uID8gb3B0cy5nZXRSb3RhdGlvbihlbGUpIDogMDtcbiAgICAgIGlmICh0aGV0YSAhPT0gMCkge1xuICAgICAgICB2YXIgX29wdHMkZ2V0Um90YXRpb25Qb2luID0gb3B0cy5nZXRSb3RhdGlvblBvaW50KGVsZSksXG4gICAgICAgICAgc3ggPSBfb3B0cyRnZXRSb3RhdGlvblBvaW4ueCxcbiAgICAgICAgICBzeSA9IF9vcHRzJGdldFJvdGF0aW9uUG9pbi55O1xuICAgICAgICB0cmFuc2xhdGUobWF0cml4LCBtYXRyaXgsIFtzeCwgc3ldKTtcbiAgICAgICAgcm90YXRlKG1hdHJpeCwgbWF0cml4LCB0aGV0YSk7XG4gICAgICAgIHZhciBvZmZzZXQgPSBvcHRzLmdldFJvdGF0aW9uT2Zmc2V0KGVsZSk7XG4gICAgICAgIHggPSBvZmZzZXQueCArIChhZGpCQi54T2Zmc2V0IHx8IDApO1xuICAgICAgICB5ID0gb2Zmc2V0LnkgKyAoYWRqQkIueU9mZnNldCB8fCAwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHggPSBhZGpCQi54MTtcbiAgICAgICAgeSA9IGFkakJCLnkxO1xuICAgICAgfVxuICAgICAgdHJhbnNsYXRlKG1hdHJpeCwgbWF0cml4LCBbeCwgeV0pO1xuICAgICAgc2NhbGUobWF0cml4LCBtYXRyaXgsIFthZGpCQi53LCBhZGpCQi5oXSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRqdXN0cyBhIG5vZGUgb3IgbGFiZWwgQkIgdG8gYWNjb21vZGF0ZSBwYWRkaW5nIGFuZCBzcGxpdCBmb3Igd3JhcHBlZCB0ZXh0dXJlcy5cbiAgICAgKiBAcGFyYW0gYmIgLSB0aGUgb3JpZ2luYWwgYm91bmRpbmcgYm94XG4gICAgICogQHBhcmFtIHBhZGRpbmcgLSB0aGUgcGFkZGluZyB0byBhZGQgdG8gdGhlIGJvdW5kaW5nIGJveFxuICAgICAqIEBwYXJhbSBmaXJzdCAtIHdoZXRoZXIgdGhpcyBpcyB0aGUgZmlyc3QgcGFydCBvZiBhIHdyYXBwZWQgdGV4dHVyZVxuICAgICAqIEBwYXJhbSByYXRpbyAtIHRoZSByYXRpbyBvZiB0aGUgdGV4dHVyZSB3aWR0aCBvZiBwYXJ0IG9mIHRoZSB0ZXh0IHRvIHRoZSBlbnRpcmUgdGV4dHVyZVxuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiBcIl9nZXRBZGp1c3RlZEJCXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9nZXRBZGp1c3RlZEJCKGJiLCBwYWRkaW5nLCBmaXJzdCwgcmF0aW8pIHtcbiAgICAgIHZhciB4MSA9IGJiLngxLFxuICAgICAgICB5MSA9IGJiLnkxLFxuICAgICAgICB3ID0gYmIudyxcbiAgICAgICAgaCA9IGJiLmgsXG4gICAgICAgIHlPZmZzZXQgPSBiYi55T2Zmc2V0O1xuICAgICAgaWYgKHBhZGRpbmcpIHtcbiAgICAgICAgeDEgLT0gcGFkZGluZztcbiAgICAgICAgeTEgLT0gcGFkZGluZztcbiAgICAgICAgdyArPSAyICogcGFkZGluZztcbiAgICAgICAgaCArPSAyICogcGFkZGluZztcbiAgICAgIH1cbiAgICAgIHZhciB4T2Zmc2V0ID0gMDtcbiAgICAgIHZhciBhZGpXID0gdyAqIHJhdGlvO1xuICAgICAgaWYgKGZpcnN0ICYmIHJhdGlvIDwgMSkge1xuICAgICAgICB3ID0gYWRqVztcbiAgICAgIH0gZWxzZSBpZiAoIWZpcnN0ICYmIHJhdGlvIDwgMSkge1xuICAgICAgICB4T2Zmc2V0ID0gdyAtIGFkalc7XG4gICAgICAgIHgxICs9IHhPZmZzZXQ7XG4gICAgICAgIHcgPSBhZGpXO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDE6IHgxLFxuICAgICAgICB5MTogeTEsXG4gICAgICAgIHc6IHcsXG4gICAgICAgIGg6IGgsXG4gICAgICAgIHhPZmZzZXQ6IHhPZmZzZXQsXG4gICAgICAgIHlPZmZzZXQ6IHlPZmZzZXRcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHJhdyBhIHNvbGlkIG9wYXF1ZSByZWN0YW5nbGUgbWF0Y2hpbmcgdGhlIGVsZW1lbnQncyBCb3VuZGluZyBCb3guXG4gICAgICogVXNlZCBieSB0aGUgUElDS0lORyBtb2RlIHRvIG1ha2UgdGhlIGVudGlyZSBCQiBvZiBhIGxhYmVsIGNsaWNrYWJsZS5cbiAgICAgKi9cbiAgfSwge1xuICAgIGtleTogXCJkcmF3UGlja2luZ1JlY3RhbmdsZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkcmF3UGlja2luZ1JlY3RhbmdsZShlbGUsIGVsZUluZGV4LCB0eXBlKSB7XG4gICAgICB2YXIgb3B0cyA9IHRoaXMuYXRsYXNNYW5hZ2VyLmdldFJlbmRlclR5cGVPcHRzKHR5cGUpO1xuICAgICAgdmFyIGluc3RhbmNlID0gdGhpcy5pbnN0YW5jZUNvdW50O1xuICAgICAgdGhpcy52ZXJ0VHlwZUJ1ZmZlci5nZXRWaWV3KGluc3RhbmNlKVswXSA9IFJFQ1RBTkdMRTtcbiAgICAgIHZhciBpbmRleFZpZXcgPSB0aGlzLmluZGV4QnVmZmVyLmdldFZpZXcoaW5zdGFuY2UpO1xuICAgICAgaW5kZXhUb1ZlYzQoZWxlSW5kZXgsIGluZGV4Vmlldyk7XG4gICAgICB2YXIgY29sb3JWaWV3ID0gdGhpcy5jb2xvckJ1ZmZlci5nZXRWaWV3KGluc3RhbmNlKTtcbiAgICAgIHRvV2ViR0xDb2xvcihbMCwgMCwgMF0sIDEsIGNvbG9yVmlldyk7IC8vIG9wYXF1ZSwgc28gZW50aXJlIGxhYmVsIEJCIGlzIGNsaWNrYWJsZVxuXG4gICAgICB2YXIgbWF0cml4VmlldyA9IHRoaXMudHJhbnNmb3JtQnVmZmVyLmdldE1hdHJpeFZpZXcoaW5zdGFuY2UpO1xuICAgICAgdGhpcy5zZXRUcmFuc2Zvcm1NYXRyaXgoZWxlLCBtYXRyaXhWaWV3LCBvcHRzKTtcbiAgICAgIHRoaXMuc2ltcGxlQ291bnQrKztcbiAgICAgIHRoaXMuaW5zdGFuY2VDb3VudCsrO1xuICAgICAgaWYgKHRoaXMuaW5zdGFuY2VDb3VudCA+PSB0aGlzLm1heEluc3RhbmNlcykge1xuICAgICAgICB0aGlzLmVuZEJhdGNoKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHJhdyBhIG5vZGUgdXNpbmcgZWl0aGVyIGEgdGV4dHVyZSBvciBhIFwic2ltcGxlIHNoYXBlXCIuXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6IFwiZHJhd05vZGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZHJhd05vZGUobm9kZSwgZWxlSW5kZXgsIHR5cGUpIHtcbiAgICAgIHZhciBvcHRzID0gdGhpcy5zaW1wbGVTaGFwZU9wdGlvbnMuZ2V0KHR5cGUpO1xuICAgICAgaWYgKCF0aGlzLl9pc1Zpc2libGUobm9kZSwgb3B0cykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIHByb3BzID0gb3B0cy5zaGFwZVByb3BzO1xuXG4gICAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIHRvIHVzZSBhIHRleHR1cmVcbiAgICAgIHZhciB2ZXJ0VHlwZSA9IHRoaXMuX2dldFZlcnRUeXBlRm9yU2hhcGUobm9kZSwgcHJvcHMuc2hhcGUpO1xuICAgICAgaWYgKHZlcnRUeXBlID09PSB1bmRlZmluZWQgfHwgb3B0cy5pc1NpbXBsZSAmJiAhb3B0cy5pc1NpbXBsZShub2RlLCB0aGlzLnJlbmRlclRhcmdldCkpIHtcbiAgICAgICAgdGhpcy5kcmF3VGV4dHVyZShub2RlLCBlbGVJbmRleCwgdHlwZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gUmVuZGVyIGEgXCJzaW1wbGUgc2hhcGVcIiB1c2luZyBTREYgKHNpZ25lZCBkaXN0YW5jZSBmaWVsZHMpXG4gICAgICB2YXIgaW5zdGFuY2UgPSB0aGlzLmluc3RhbmNlQ291bnQ7XG4gICAgICB0aGlzLnZlcnRUeXBlQnVmZmVyLmdldFZpZXcoaW5zdGFuY2UpWzBdID0gdmVydFR5cGU7XG4gICAgICBpZiAodmVydFR5cGUgPT09IFJPVU5EX1JFQ1RBTkdMRSB8fCB2ZXJ0VHlwZSA9PT0gQk9UVE9NX1JPVU5EX1JFQ1RBTkdMRSkge1xuICAgICAgICAvLyBnZXQgY29ybmVyIHJhZGl1c1xuICAgICAgICB2YXIgYmIgPSBvcHRzLmdldEJvdW5kaW5nQm94KG5vZGUpO1xuICAgICAgICB2YXIgcmFkaXVzID0gdGhpcy5fZ2V0Q29ybmVyUmFkaXVzKG5vZGUsIHByb3BzLnJhZGl1cywgYmIpO1xuICAgICAgICB2YXIgcmFkaXVzVmlldyA9IHRoaXMuY29ybmVyUmFkaXVzQnVmZmVyLmdldFZpZXcoaW5zdGFuY2UpO1xuICAgICAgICByYWRpdXNWaWV3WzBdID0gcmFkaXVzOyAvLyB0b3AtcmlnaHRcbiAgICAgICAgcmFkaXVzVmlld1sxXSA9IHJhZGl1czsgLy8gYm90dG9tLXJpZ2h0XG4gICAgICAgIHJhZGl1c1ZpZXdbMl0gPSByYWRpdXM7IC8vIHRvcC1sZWZ0XG4gICAgICAgIHJhZGl1c1ZpZXdbM10gPSByYWRpdXM7IC8vIGJvdHRvbS1sZWZ0XG4gICAgICAgIGlmICh2ZXJ0VHlwZSA9PT0gQk9UVE9NX1JPVU5EX1JFQ1RBTkdMRSkge1xuICAgICAgICAgIHJhZGl1c1ZpZXdbMF0gPSAwO1xuICAgICAgICAgIHJhZGl1c1ZpZXdbMl0gPSAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXhWaWV3ID0gdGhpcy5pbmRleEJ1ZmZlci5nZXRWaWV3KGluc3RhbmNlKTtcbiAgICAgIGluZGV4VG9WZWM0KGVsZUluZGV4LCBpbmRleFZpZXcpO1xuXG4gICAgICAvLyBOb2RlcyBzaG91bGQgc3RpbGwgYmUgY2xpY2thYmxlIGlmIHRoZXkgcGFzcyB0aGUgdmlzaWJpbGl0eSBjaGVjayBidXRcbiAgICAgIC8vIGhhdmUgYmFja2dyb3VuZC1vcGFjaXR5OiAwXG4gICAgICAvLyBBbHNvOiBldmVyeXRoaW5nIGJ1dCBub2RlLWJvZHkgaXMgZXhlbXB0IGZyb20gZWZmZWN0aXZlIG9wYWNpdHkgaW5oZXJpdGVuY2Uvc3RhY2tpbmdcbiAgICAgIHZhciBvcGFjaXR5ID0gdGhpcy5yZW5kZXJUYXJnZXQucGlja2luZyA/IDEgOiB0eXBlID09PSAnbm9kZS1ib2R5JyA/IG5vZGUuZWZmZWN0aXZlT3BhY2l0eSgpIDogMTtcbiAgICAgIHZhciBiZ09wYWNpdHkgPSB0aGlzLnJlbmRlclRhcmdldC5waWNraW5nID8gMSA6IG5vZGUucHN0eWxlKHByb3BzLm9wYWNpdHkpLnZhbHVlICogb3BhY2l0eTtcbiAgICAgIHZhciBjb2xvciA9IG5vZGUucHN0eWxlKHByb3BzLmNvbG9yKS52YWx1ZTtcbiAgICAgIHZhciBjb2xvclZpZXcgPSB0aGlzLmNvbG9yQnVmZmVyLmdldFZpZXcoaW5zdGFuY2UpO1xuICAgICAgdG9XZWJHTENvbG9yKGNvbG9yLCBiZ09wYWNpdHksIGNvbG9yVmlldyk7XG4gICAgICB2YXIgbGluZVdpZHRoVmlldyA9IHRoaXMubGluZVdpZHRoQnVmZmVyLmdldFZpZXcoaW5zdGFuY2UpOyAvLyByZXVzZSBlZGdlIGxpbmUgd2lkdGggYXR0cmlidXRlIGZvciBub2RlIGJvcmRlclxuICAgICAgbGluZVdpZHRoVmlld1swXSA9IDA7XG4gICAgICBsaW5lV2lkdGhWaWV3WzFdID0gMDtcbiAgICAgIGlmIChwcm9wcy5ib3JkZXIpIHtcbiAgICAgICAgdmFyIGJvcmRlcldpZHRoID0gbm9kZS5wc3R5bGUoJ2JvcmRlci13aWR0aCcpLnZhbHVlO1xuICAgICAgICBpZiAoYm9yZGVyV2lkdGggPiAwKSB7XG4gICAgICAgICAgdmFyIGJvcmRlckNvbG9yID0gbm9kZS5wc3R5bGUoJ2JvcmRlci1jb2xvcicpLnZhbHVlO1xuICAgICAgICAgIHZhciBib3JkZXJPcGFjaXR5ID0gb3BhY2l0eSAqIG5vZGUucHN0eWxlKCdib3JkZXItb3BhY2l0eScpLnZhbHVlO1xuICAgICAgICAgIHZhciBib3JkZXJDb2xvclZpZXcgPSB0aGlzLmJvcmRlckNvbG9yQnVmZmVyLmdldFZpZXcoaW5zdGFuY2UpO1xuICAgICAgICAgIHRvV2ViR0xDb2xvcihib3JkZXJDb2xvciwgYm9yZGVyT3BhY2l0eSwgYm9yZGVyQ29sb3JWaWV3KTtcblxuICAgICAgICAgIC8vIFNERiBkaXN0YW5jZSBpcyBuZWdhdGl2ZSBpbnNpZGUgdGhlIHNoYXBlIGFuZCBwb3NpdGl2ZSBvdXRzaWRlXG4gICAgICAgICAgdmFyIGJvcmRlclBvcyA9IG5vZGUucHN0eWxlKCdib3JkZXItcG9zaXRpb24nKS52YWx1ZTtcbiAgICAgICAgICBpZiAoYm9yZGVyUG9zID09PSAnaW5zaWRlJykge1xuICAgICAgICAgICAgbGluZVdpZHRoVmlld1swXSA9IDA7XG4gICAgICAgICAgICBsaW5lV2lkdGhWaWV3WzFdID0gLWJvcmRlcldpZHRoO1xuICAgICAgICAgIH0gZWxzZSBpZiAoYm9yZGVyUG9zID09PSAnb3V0c2lkZScpIHtcbiAgICAgICAgICAgIGxpbmVXaWR0aFZpZXdbMF0gPSBib3JkZXJXaWR0aDtcbiAgICAgICAgICAgIGxpbmVXaWR0aFZpZXdbMV0gPSAwO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyAnY2VudGVyJ1xuICAgICAgICAgICAgdmFyIGhhbGZXaWR0aCA9IGJvcmRlcldpZHRoIC8gMjtcbiAgICAgICAgICAgIGxpbmVXaWR0aFZpZXdbMF0gPSBoYWxmV2lkdGg7XG4gICAgICAgICAgICBsaW5lV2lkdGhWaWV3WzFdID0gLWhhbGZXaWR0aDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBtYXRyaXhWaWV3ID0gdGhpcy50cmFuc2Zvcm1CdWZmZXIuZ2V0TWF0cml4VmlldyhpbnN0YW5jZSk7XG4gICAgICB0aGlzLnNldFRyYW5zZm9ybU1hdHJpeChub2RlLCBtYXRyaXhWaWV3LCBvcHRzKTtcbiAgICAgIHRoaXMuc2ltcGxlQ291bnQrKztcbiAgICAgIHRoaXMuaW5zdGFuY2VDb3VudCsrO1xuICAgICAgaWYgKHRoaXMuaW5zdGFuY2VDb3VudCA+PSB0aGlzLm1heEluc3RhbmNlcykge1xuICAgICAgICB0aGlzLmVuZEJhdGNoKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9nZXRWZXJ0VHlwZUZvclNoYXBlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9nZXRWZXJ0VHlwZUZvclNoYXBlKG5vZGUsIHNoYXBlUHJvcCkge1xuICAgICAgdmFyIHNoYXBlID0gbm9kZS5wc3R5bGUoc2hhcGVQcm9wKS52YWx1ZTtcbiAgICAgIHN3aXRjaCAoc2hhcGUpIHtcbiAgICAgICAgY2FzZSAncmVjdGFuZ2xlJzpcbiAgICAgICAgICByZXR1cm4gUkVDVEFOR0xFO1xuICAgICAgICBjYXNlICdlbGxpcHNlJzpcbiAgICAgICAgICByZXR1cm4gRUxMSVBTRTtcbiAgICAgICAgY2FzZSAncm91bmRyZWN0YW5nbGUnOlxuICAgICAgICBjYXNlICdyb3VuZC1yZWN0YW5nbGUnOlxuICAgICAgICAgIHJldHVybiBST1VORF9SRUNUQU5HTEU7XG4gICAgICAgIGNhc2UgJ2JvdHRvbS1yb3VuZC1yZWN0YW5nbGUnOlxuICAgICAgICAgIHJldHVybiBCT1RUT01fUk9VTkRfUkVDVEFOR0xFO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9nZXRDb3JuZXJSYWRpdXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2dldENvcm5lclJhZGl1cyhub2RlLCByYWRpdXNQcm9wLCBfcmVmMikge1xuICAgICAgdmFyIHcgPSBfcmVmMi53LFxuICAgICAgICBoID0gX3JlZjIuaDtcbiAgICAgIC8vIHNlZSBDUnAuZHJhd1JvdW5kUmVjdGFuZ2xlUGF0aFxuICAgICAgaWYgKG5vZGUucHN0eWxlKHJhZGl1c1Byb3ApLnZhbHVlID09PSAnYXV0bycpIHtcbiAgICAgICAgcmV0dXJuIGdldFJvdW5kUmVjdGFuZ2xlUmFkaXVzKHcsIGgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHJhZGl1cyA9IG5vZGUucHN0eWxlKHJhZGl1c1Byb3ApLnBmVmFsdWU7XG4gICAgICAgIHZhciBoYWxmV2lkdGggPSB3IC8gMjtcbiAgICAgICAgdmFyIGhhbGZIZWlnaHQgPSBoIC8gMjtcbiAgICAgICAgcmV0dXJuIE1hdGgubWluKHJhZGl1cywgaGFsZkhlaWdodCwgaGFsZldpZHRoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPbmx5IHN1cHBvcnRzIGRyYXdpbmcgdHJpYW5nbGVzIGF0IHRoZSBtb21lbnQuXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6IFwiZHJhd0VkZ2VBcnJvd1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkcmF3RWRnZUFycm93KGVkZ2UsIGVsZUluZGV4LCBwcmVmaXgpIHtcbiAgICAgIGlmICghZWRnZS52aXNpYmxlKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gRWRnZSBwb2ludHMgYW5kIGFycm93IGFuZ2xlcyBldGMgYXJlIGNhbGN1bGF0ZWQgYnkgdGhlIGJhc2UgcmVuZGVyZXIgYW5kIGNhY2hlZCBpbiB0aGUgcnNjcmF0Y2ggb2JqZWN0LlxuICAgICAgdmFyIHJzID0gZWRnZS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgICAgIHZhciB4LCB5LCBhbmdsZTtcbiAgICAgIGlmIChwcmVmaXggPT09ICdzb3VyY2UnKSB7XG4gICAgICAgIHggPSBycy5hcnJvd1N0YXJ0WDtcbiAgICAgICAgeSA9IHJzLmFycm93U3RhcnRZO1xuICAgICAgICBhbmdsZSA9IHJzLnNyY0Fycm93QW5nbGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB4ID0gcnMuYXJyb3dFbmRYO1xuICAgICAgICB5ID0gcnMuYXJyb3dFbmRZO1xuICAgICAgICBhbmdsZSA9IHJzLnRndEFycm93QW5nbGU7XG4gICAgICB9XG5cbiAgICAgIC8vIHRha2VuIGZyb20gQ1JwLmRyYXdBcnJvd2hlYWRcbiAgICAgIGlmIChpc05hTih4KSB8fCB4ID09IG51bGwgfHwgaXNOYU4oeSkgfHwgeSA9PSBudWxsIHx8IGlzTmFOKGFuZ2xlKSB8fCBhbmdsZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gY2hlY2sgc2hhcGUgYWZ0ZXIgdGhlIHgveSBjaGVjayBiZWNhdXNlIHBzdHlsZSgpIGlzIGEgYml0IHNsb3dcbiAgICAgIHZhciBhcnJvd1NoYXBlID0gZWRnZS5wc3R5bGUocHJlZml4ICsgJy1hcnJvdy1zaGFwZScpLnZhbHVlO1xuICAgICAgaWYgKGFycm93U2hhcGUgPT09ICdub25lJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgY29sb3IgPSBlZGdlLnBzdHlsZShwcmVmaXggKyAnLWFycm93LWNvbG9yJykudmFsdWU7XG4gICAgICB2YXIgYmFzZU9wYWNpdHkgPSBlZGdlLnBzdHlsZSgnb3BhY2l0eScpLnZhbHVlO1xuICAgICAgdmFyIGxpbmVPcGFjaXR5ID0gZWRnZS5wc3R5bGUoJ2xpbmUtb3BhY2l0eScpLnZhbHVlO1xuICAgICAgdmFyIG9wYWNpdHkgPSBiYXNlT3BhY2l0eSAqIGxpbmVPcGFjaXR5O1xuICAgICAgdmFyIGxpbmVXaWR0aCA9IGVkZ2UucHN0eWxlKCd3aWR0aCcpLnBmVmFsdWU7XG4gICAgICB2YXIgc2NhbGUkMSA9IGVkZ2UucHN0eWxlKCdhcnJvdy1zY2FsZScpLnZhbHVlO1xuICAgICAgdmFyIHNpemUgPSB0aGlzLnIuZ2V0QXJyb3dXaWR0aChsaW5lV2lkdGgsIHNjYWxlJDEpO1xuICAgICAgdmFyIGluc3RhbmNlID0gdGhpcy5pbnN0YW5jZUNvdW50O1xuICAgICAgdmFyIHRyYW5zZm9ybSA9IHRoaXMudHJhbnNmb3JtQnVmZmVyLmdldE1hdHJpeFZpZXcoaW5zdGFuY2UpO1xuICAgICAgaWRlbnRpdHkodHJhbnNmb3JtKTtcbiAgICAgIHRyYW5zbGF0ZSh0cmFuc2Zvcm0sIHRyYW5zZm9ybSwgW3gsIHldKTtcbiAgICAgIHNjYWxlKHRyYW5zZm9ybSwgdHJhbnNmb3JtLCBbc2l6ZSwgc2l6ZV0pO1xuICAgICAgcm90YXRlKHRyYW5zZm9ybSwgdHJhbnNmb3JtLCBhbmdsZSk7XG4gICAgICB0aGlzLnZlcnRUeXBlQnVmZmVyLmdldFZpZXcoaW5zdGFuY2UpWzBdID0gRURHRV9BUlJPVztcbiAgICAgIHZhciBpbmRleFZpZXcgPSB0aGlzLmluZGV4QnVmZmVyLmdldFZpZXcoaW5zdGFuY2UpO1xuICAgICAgaW5kZXhUb1ZlYzQoZWxlSW5kZXgsIGluZGV4Vmlldyk7XG4gICAgICB2YXIgY29sb3JWaWV3ID0gdGhpcy5jb2xvckJ1ZmZlci5nZXRWaWV3KGluc3RhbmNlKTtcbiAgICAgIHRvV2ViR0xDb2xvcihjb2xvciwgb3BhY2l0eSwgY29sb3JWaWV3KTtcbiAgICAgIHRoaXMuaW5zdGFuY2VDb3VudCsrO1xuICAgICAgaWYgKHRoaXMuaW5zdGFuY2VDb3VudCA+PSB0aGlzLm1heEluc3RhbmNlcykge1xuICAgICAgICB0aGlzLmVuZEJhdGNoKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHJhdyBzdHJhaWdodC1saW5lIG9yIGJlemllciBjdXJ2ZSBlZGdlcy5cbiAgICAgKi9cbiAgfSwge1xuICAgIGtleTogXCJkcmF3RWRnZUxpbmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZHJhd0VkZ2VMaW5lKGVkZ2UsIGVsZUluZGV4KSB7XG4gICAgICBpZiAoIWVkZ2UudmlzaWJsZSgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciBwb2ludHMgPSB0aGlzLl9nZXRFZGdlUG9pbnRzKGVkZ2UpO1xuICAgICAgaWYgKCFwb2ludHMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBsaW5lIHN0eWxlXG4gICAgICB2YXIgYmFzZU9wYWNpdHkgPSBlZGdlLnBzdHlsZSgnb3BhY2l0eScpLnZhbHVlO1xuICAgICAgdmFyIGxpbmVPcGFjaXR5ID0gZWRnZS5wc3R5bGUoJ2xpbmUtb3BhY2l0eScpLnZhbHVlO1xuICAgICAgdmFyIHdpZHRoID0gZWRnZS5wc3R5bGUoJ3dpZHRoJykucGZWYWx1ZTtcbiAgICAgIHZhciBjb2xvciA9IGVkZ2UucHN0eWxlKCdsaW5lLWNvbG9yJykudmFsdWU7XG4gICAgICB2YXIgb3BhY2l0eSA9IGJhc2VPcGFjaXR5ICogbGluZU9wYWNpdHk7XG4gICAgICBpZiAocG9pbnRzLmxlbmd0aCAvIDIgKyB0aGlzLmluc3RhbmNlQ291bnQgPiB0aGlzLm1heEluc3RhbmNlcykge1xuICAgICAgICB0aGlzLmVuZEJhdGNoKCk7XG4gICAgICB9XG4gICAgICBpZiAocG9pbnRzLmxlbmd0aCA9PSA0KSB7XG4gICAgICAgIC8vIHN0cmFpZ2h0IGxpbmVcbiAgICAgICAgdmFyIGluc3RhbmNlID0gdGhpcy5pbnN0YW5jZUNvdW50O1xuICAgICAgICB0aGlzLnZlcnRUeXBlQnVmZmVyLmdldFZpZXcoaW5zdGFuY2UpWzBdID0gRURHRV9TVFJBSUdIVDtcbiAgICAgICAgdmFyIGluZGV4VmlldyA9IHRoaXMuaW5kZXhCdWZmZXIuZ2V0VmlldyhpbnN0YW5jZSk7XG4gICAgICAgIGluZGV4VG9WZWM0KGVsZUluZGV4LCBpbmRleFZpZXcpO1xuICAgICAgICB2YXIgY29sb3JWaWV3ID0gdGhpcy5jb2xvckJ1ZmZlci5nZXRWaWV3KGluc3RhbmNlKTtcbiAgICAgICAgdG9XZWJHTENvbG9yKGNvbG9yLCBvcGFjaXR5LCBjb2xvclZpZXcpO1xuICAgICAgICB2YXIgbGluZVdpZHRoQnVmZmVyID0gdGhpcy5saW5lV2lkdGhCdWZmZXIuZ2V0VmlldyhpbnN0YW5jZSk7XG4gICAgICAgIGxpbmVXaWR0aEJ1ZmZlclswXSA9IHdpZHRoO1xuICAgICAgICB2YXIgc291cmNlVGFyZ2V0VmlldyA9IHRoaXMucG9pbnRBUG9pbnRCQnVmZmVyLmdldFZpZXcoaW5zdGFuY2UpO1xuICAgICAgICBzb3VyY2VUYXJnZXRWaWV3WzBdID0gcG9pbnRzWzBdOyAvLyBzb3VyY2UgeFxuICAgICAgICBzb3VyY2VUYXJnZXRWaWV3WzFdID0gcG9pbnRzWzFdOyAvLyBzb3VyY2UgeVxuICAgICAgICBzb3VyY2VUYXJnZXRWaWV3WzJdID0gcG9pbnRzWzJdOyAvLyB0YXJnZXQgeFxuICAgICAgICBzb3VyY2VUYXJnZXRWaWV3WzNdID0gcG9pbnRzWzNdOyAvLyB0YXJnZXQgeVxuXG4gICAgICAgIHRoaXMuaW5zdGFuY2VDb3VudCsrO1xuICAgICAgICBpZiAodGhpcy5pbnN0YW5jZUNvdW50ID49IHRoaXMubWF4SW5zdGFuY2VzKSB7XG4gICAgICAgICAgdGhpcy5lbmRCYXRjaCgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBjdXJ2ZWQgbGluZVxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGggLSAyOyBpICs9IDIpIHtcbiAgICAgICAgICB2YXIgX2luc3RhbmNlID0gdGhpcy5pbnN0YW5jZUNvdW50O1xuICAgICAgICAgIHRoaXMudmVydFR5cGVCdWZmZXIuZ2V0VmlldyhfaW5zdGFuY2UpWzBdID0gRURHRV9DVVJWRV9TRUdNRU5UO1xuICAgICAgICAgIHZhciBfaW5kZXhWaWV3ID0gdGhpcy5pbmRleEJ1ZmZlci5nZXRWaWV3KF9pbnN0YW5jZSk7XG4gICAgICAgICAgaW5kZXhUb1ZlYzQoZWxlSW5kZXgsIF9pbmRleFZpZXcpO1xuICAgICAgICAgIHZhciBfY29sb3JWaWV3ID0gdGhpcy5jb2xvckJ1ZmZlci5nZXRWaWV3KF9pbnN0YW5jZSk7XG4gICAgICAgICAgdG9XZWJHTENvbG9yKGNvbG9yLCBvcGFjaXR5LCBfY29sb3JWaWV3KTtcbiAgICAgICAgICB2YXIgX2xpbmVXaWR0aEJ1ZmZlciA9IHRoaXMubGluZVdpZHRoQnVmZmVyLmdldFZpZXcoX2luc3RhbmNlKTtcbiAgICAgICAgICBfbGluZVdpZHRoQnVmZmVyWzBdID0gd2lkdGg7XG4gICAgICAgICAgdmFyIHBBeCA9IHBvaW50c1tpIC0gMl0sXG4gICAgICAgICAgICBwQXkgPSBwb2ludHNbaSAtIDFdO1xuICAgICAgICAgIHZhciBwQnggPSBwb2ludHNbaV0sXG4gICAgICAgICAgICBwQnkgPSBwb2ludHNbaSArIDFdO1xuICAgICAgICAgIHZhciBwQ3ggPSBwb2ludHNbaSArIDJdLFxuICAgICAgICAgICAgcEN5ID0gcG9pbnRzW2kgKyAzXTtcbiAgICAgICAgICB2YXIgcER4ID0gcG9pbnRzW2kgKyA0XSxcbiAgICAgICAgICAgIHBEeSA9IHBvaW50c1tpICsgNV07XG5cbiAgICAgICAgICAvLyBtYWtlIHBoYW50b20gcG9pbnRzIGZvciB0aGUgZmlyc3QgYW5kIGxhc3Qgc2VnbWVudHNcbiAgICAgICAgICAvLyBUT0RPIGFkZGluZyAwLjAwMSB0byBhdm9pZCBkaXZpc2lvbiBieSB6ZXJvIGluIHRoZSBzaGFkZXIgKEkgdGhpbmspLCBuZWVkIGEgYmV0dGVyIHNvbHV0aW9uXG4gICAgICAgICAgaWYgKGkgPT0gMCkge1xuICAgICAgICAgICAgcEF4ID0gMiAqIHBCeCAtIHBDeCArIDAuMDAxO1xuICAgICAgICAgICAgcEF5ID0gMiAqIHBCeSAtIHBDeSArIDAuMDAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaSA9PSBwb2ludHMubGVuZ3RoIC0gNCkge1xuICAgICAgICAgICAgcER4ID0gMiAqIHBDeCAtIHBCeCArIDAuMDAxO1xuICAgICAgICAgICAgcER5ID0gMiAqIHBDeSAtIHBCeSArIDAuMDAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgcG9pbnRBQlZpZXcgPSB0aGlzLnBvaW50QVBvaW50QkJ1ZmZlci5nZXRWaWV3KF9pbnN0YW5jZSk7XG4gICAgICAgICAgcG9pbnRBQlZpZXdbMF0gPSBwQXg7XG4gICAgICAgICAgcG9pbnRBQlZpZXdbMV0gPSBwQXk7XG4gICAgICAgICAgcG9pbnRBQlZpZXdbMl0gPSBwQng7XG4gICAgICAgICAgcG9pbnRBQlZpZXdbM10gPSBwQnk7XG4gICAgICAgICAgdmFyIHBvaW50Q0RWaWV3ID0gdGhpcy5wb2ludENQb2ludERCdWZmZXIuZ2V0VmlldyhfaW5zdGFuY2UpO1xuICAgICAgICAgIHBvaW50Q0RWaWV3WzBdID0gcEN4O1xuICAgICAgICAgIHBvaW50Q0RWaWV3WzFdID0gcEN5O1xuICAgICAgICAgIHBvaW50Q0RWaWV3WzJdID0gcER4O1xuICAgICAgICAgIHBvaW50Q0RWaWV3WzNdID0gcER5O1xuICAgICAgICAgIHRoaXMuaW5zdGFuY2VDb3VudCsrO1xuICAgICAgICAgIGlmICh0aGlzLmluc3RhbmNlQ291bnQgPj0gdGhpcy5tYXhJbnN0YW5jZXMpIHtcbiAgICAgICAgICAgIHRoaXMuZW5kQmF0Y2goKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX2lzVmFsaWRFZGdlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9pc1ZhbGlkRWRnZShlZGdlKSB7XG4gICAgICB2YXIgcnMgPSBlZGdlLl9wcml2YXRlLnJzY3JhdGNoO1xuICAgICAgaWYgKHJzLmJhZExpbmUgfHwgcnMuYWxscHRzID09IG51bGwgfHwgaXNOYU4ocnMuYWxscHRzWzBdKSkge1xuICAgICAgICAvLyBpc05hTiBpbiBjYXNlIGVkZ2UgaXMgaW1wb3NzaWJsZSBhbmQgYnJvd3NlciBidWdzIChlLmcuIHNhZmFyaSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9nZXRFZGdlUG9pbnRzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9nZXRFZGdlUG9pbnRzKGVkZ2UpIHtcbiAgICAgIHZhciBycyA9IGVkZ2UuX3ByaXZhdGUucnNjcmF0Y2g7XG5cbiAgICAgIC8vIGlmIGJlemllciBjdHJsIHB0cyBjYW4gbm90IGJlIGNhbGN1bGF0ZWQsIHRoZW4gZGllXG4gICAgICBpZiAoIXRoaXMuX2lzVmFsaWRFZGdlKGVkZ2UpKSB7XG4gICAgICAgIC8vIGlzTmFOIGluIGNhc2UgZWRnZSBpcyBpbXBvc3NpYmxlIGFuZCBicm93c2VyIGJ1Z3MgKGUuZy4gc2FmYXJpKVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgY29udHJvbFBvaW50cyA9IHJzLmFsbHB0cztcbiAgICAgIGlmIChjb250cm9sUG9pbnRzLmxlbmd0aCA9PSA0KSB7XG4gICAgICAgIHJldHVybiBjb250cm9sUG9pbnRzO1xuICAgICAgfVxuICAgICAgdmFyIG51bVNlZ21lbnRzID0gdGhpcy5fZ2V0TnVtU2VnbWVudHMoZWRnZSk7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0Q3VydmVTZWdtZW50UG9pbnRzKGNvbnRyb2xQb2ludHMsIG51bVNlZ21lbnRzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX2dldE51bVNlZ21lbnRzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9nZXROdW1TZWdtZW50cyhlZGdlKSB7XG4gICAgICAvLyBUT0RPIE5lZWQgYSBoZXVyaXN0aWMgdGhhdCBkZWNpZGVzIGhvdyBtYW55IHNlZ21lbnRzIHRvIHVzZS4gRmFjdG9ycyB0byBjb25zaWRlcjpcbiAgICAgIC8vIC0gZWRnZSB3aWR0aC9sZW5ndGhcbiAgICAgIC8vIC0gZWRnZSBjdXJ2YXR1cmUgKHRoZSBtb3JlIHRoZSBjdXJ2YXR1cmUsIHRoZSBtb3JlIHNlZ21lbnRzKVxuICAgICAgLy8gLSB6b29tIGxldmVsIChtb3JlIHNlZ21lbnRzIHdoZW4gem9vbWVkIGluKVxuICAgICAgLy8gLSBudW1iZXIgb2YgdmlzaWJsZSBlZGdlcyAobW9yZSBzZWdtZW50cyB3aGVuIHRoZXJlIGFyZSBmZXdlciBlZGdlcylcbiAgICAgIC8vIC0gcGVyZm9ybWFuY2UgKGZld2VyIHNlZ21lbnRzIHdoZW4gcGVyZm9ybWFuY2UgaXMgYSBjb25jZXJuKVxuICAgICAgLy8gLSB1c2VyIGNvbmZpZ3VyYWJsZSBvcHRpb24ocylcbiAgICAgIC8vIG5vdGU6IG51bWJlciBvZiBzZWdtZW50cyBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgbWF4IG51bWJlciBvZiBpbnN0YW5jZXNcbiAgICAgIC8vIG5vdGU6IHNlZ21lbnRzIGRvbid0IG5lZWQgdG8gYmUgZXZlbmx5IHNwYWNlZCBvdXQsIGl0IG1pZ2h0IG1ha2Ugc2Vuc2UgdG8gaGF2ZSBzaG9ydGVyIHNlZ21lbnRzIG5lYXJlciB0byB0aGUgY29udHJvbCBwb2ludHNcbiAgICAgIHZhciBudW1TZWdtZW50cyA9IDE1O1xuICAgICAgcmV0dXJuIE1hdGgubWluKE1hdGgubWF4KG51bVNlZ21lbnRzLCA1KSwgdGhpcy5tYXhJbnN0YW5jZXMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfZ2V0Q3VydmVTZWdtZW50UG9pbnRzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9nZXRDdXJ2ZVNlZ21lbnRQb2ludHMoY29udHJvbFBvaW50cywgc2VnbWVudHMpIHtcbiAgICAgIGlmIChjb250cm9sUG9pbnRzLmxlbmd0aCA9PSA0KSB7XG4gICAgICAgIHJldHVybiBjb250cm9sUG9pbnRzOyAvLyBzdHJhaWdodCBsaW5lXG4gICAgICB9XG4gICAgICB2YXIgY3VydmVQb2ludHMgPSBBcnJheSgoc2VnbWVudHMgKyAxKSAqIDIpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gc2VnbWVudHM7IGkrKykge1xuICAgICAgICAvLyB0aGUgZmlyc3QgYW5kIGxhc3QgcG9pbnRzIGFyZSB0aGUgc2FtZSBhcyB0aGUgZmlyc3QgYW5kIGxhc3QgY29udHJvbCBwb2ludHNcbiAgICAgICAgaWYgKGkgPT0gMCkge1xuICAgICAgICAgIGN1cnZlUG9pbnRzWzBdID0gY29udHJvbFBvaW50c1swXTtcbiAgICAgICAgICBjdXJ2ZVBvaW50c1sxXSA9IGNvbnRyb2xQb2ludHNbMV07XG4gICAgICAgIH0gZWxzZSBpZiAoaSA9PSBzZWdtZW50cykge1xuICAgICAgICAgIGN1cnZlUG9pbnRzW2kgKiAyXSA9IGNvbnRyb2xQb2ludHNbY29udHJvbFBvaW50cy5sZW5ndGggLSAyXTtcbiAgICAgICAgICBjdXJ2ZVBvaW50c1tpICogMiArIDFdID0gY29udHJvbFBvaW50c1tjb250cm9sUG9pbnRzLmxlbmd0aCAtIDFdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciB0ID0gaSAvIHNlZ21lbnRzOyAvLyBzZWdtZW50cyBoYXZlIGVxdWFsIGxlbmd0aCwgaXRzIG5vdCBzdHJpY3RseSBuZWNlc3NhcnkgdG8gZG8gaXQgdGhpcyB3YXlcbiAgICAgICAgICAvLyBwYXNzIGluIGN1cnZlUG9pbnRzIHRvIHNldCB0aGUgdmFsdWVzIGluIHRoZSBhcnJheSBkaXJlY3RseVxuICAgICAgICAgIHRoaXMuX3NldEN1cnZlUG9pbnQoY29udHJvbFBvaW50cywgdCwgY3VydmVQb2ludHMsIGkgKiAyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGN1cnZlUG9pbnRzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfc2V0Q3VydmVQb2ludFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfc2V0Q3VydmVQb2ludChwb2ludHMsIHQsIGN1cnZlUG9pbnRzLCBjcGkpIHtcbiAgICAgIGlmIChwb2ludHMubGVuZ3RoIDw9IDIpIHtcbiAgICAgICAgY3VydmVQb2ludHNbY3BpXSA9IHBvaW50c1swXTtcbiAgICAgICAgY3VydmVQb2ludHNbY3BpICsgMV0gPSBwb2ludHNbMV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgbmV3cG9pbnRzID0gQXJyYXkocG9pbnRzLmxlbmd0aCAtIDIpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5ld3BvaW50cy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICAgIHZhciB4ID0gKDEgLSB0KSAqIHBvaW50c1tpXSArIHQgKiBwb2ludHNbaSArIDJdO1xuICAgICAgICAgIHZhciB5ID0gKDEgLSB0KSAqIHBvaW50c1tpICsgMV0gKyB0ICogcG9pbnRzW2kgKyAzXTtcbiAgICAgICAgICBuZXdwb2ludHNbaV0gPSB4O1xuICAgICAgICAgIG5ld3BvaW50c1tpICsgMV0gPSB5O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9zZXRDdXJ2ZVBvaW50KG5ld3BvaW50cywgdCwgY3VydmVQb2ludHMsIGNwaSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImVuZEJhdGNoXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVuZEJhdGNoKCkge1xuICAgICAgdmFyIGdsID0gdGhpcy5nbCxcbiAgICAgICAgdmFvID0gdGhpcy52YW8sXG4gICAgICAgIHZlcnRleENvdW50ID0gdGhpcy52ZXJ0ZXhDb3VudCxcbiAgICAgICAgY291bnQgPSB0aGlzLmluc3RhbmNlQ291bnQ7XG4gICAgICBpZiAoY291bnQgPT09IDApIHJldHVybjtcbiAgICAgIHZhciBwcm9ncmFtID0gdGhpcy5yZW5kZXJUYXJnZXQucGlja2luZyA/IHRoaXMucGlja2luZ1Byb2dyYW0gOiB0aGlzLnByb2dyYW07XG4gICAgICBnbC51c2VQcm9ncmFtKHByb2dyYW0pO1xuICAgICAgZ2wuYmluZFZlcnRleEFycmF5KHZhbyk7XG5cbiAgICAgIC8vIGJ1ZmZlciB0aGUgYXR0cmlidXRlIGRhdGFcbiAgICAgIHZhciBfaXRlcmF0b3IyID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIodGhpcy5idWZmZXJzKSxcbiAgICAgICAgX3N0ZXAyO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIChfaXRlcmF0b3IyLnMoKTsgIShfc3RlcDIgPSBfaXRlcmF0b3IyLm4oKSkuZG9uZTspIHtcbiAgICAgICAgICB2YXIgYnVmZmVyID0gX3N0ZXAyLnZhbHVlO1xuICAgICAgICAgIGJ1ZmZlci5idWZmZXJTdWJEYXRhKGNvdW50KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIF9pdGVyYXRvcjIuZShlcnIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgX2l0ZXJhdG9yMi5mKCk7XG4gICAgICB9XG4gICAgICB2YXIgYXRsYXNlcyA9IHRoaXMuYmF0Y2hNYW5hZ2VyLmdldEF0bGFzZXMoKTtcbiAgICAgIC8vIG11c3QgYnVmZmVyIGJlZm9yZSBhY3RpdmF0aW5nIHRleHR1cmUgdW5pdHNcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXRsYXNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBhdGxhc2VzW2ldLmJ1ZmZlcklmTmVlZGVkKGdsKTtcbiAgICAgIH1cbiAgICAgIC8vIEFjdGl2YXRlIGFsbCB0aGUgdGV4dHVyZSB1bml0cyB0aGF0IHdlIG5lZWRcbiAgICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IGF0bGFzZXMubGVuZ3RoOyBfaTIrKykge1xuICAgICAgICBnbC5hY3RpdmVUZXh0dXJlKGdsLlRFWFRVUkUwICsgX2kyKTtcbiAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgYXRsYXNlc1tfaTJdLnRleHR1cmUpO1xuICAgICAgICBnbC51bmlmb3JtMWkocHJvZ3JhbS51VGV4dHVyZXNbX2kyXSwgX2kyKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IHRoZSB1bmlmb3Jtc1xuICAgICAgZ2wudW5pZm9ybTFmKHByb2dyYW0udVpvb20sIGdldEVmZmVjdGl2ZVpvb20odGhpcy5yKSk7XG4gICAgICBnbC51bmlmb3JtTWF0cml4M2Z2KHByb2dyYW0udVBhblpvb21NYXRyaXgsIGZhbHNlLCB0aGlzLnBhblpvb21NYXRyaXgpO1xuICAgICAgZ2wudW5pZm9ybTFpKHByb2dyYW0udUF0bGFzU2l6ZSwgdGhpcy5iYXRjaE1hbmFnZXIuZ2V0QXRsYXNTaXplKCkpO1xuICAgICAgLy8gc2V0IGJhY2tncm91bmQgY29sb3IsIG5lZWRlZCBmb3IgZWRnZSBhcnJvdyBjb2xvciBibGVuZGluZ1xuICAgICAgdmFyIHdlYmdsQmdDb2xvciA9IHRvV2ViR0xDb2xvcih0aGlzLmJnQ29sb3IsIDEpO1xuICAgICAgZ2wudW5pZm9ybTRmdihwcm9ncmFtLnVCR0NvbG9yLCB3ZWJnbEJnQ29sb3IpO1xuXG4gICAgICAvLyBkcmF3IVxuICAgICAgZ2wuZHJhd0FycmF5c0luc3RhbmNlZChnbC5UUklBTkdMRVMsIDAsIHZlcnRleENvdW50LCBjb3VudCk7XG4gICAgICBnbC5iaW5kVmVydGV4QXJyYXkobnVsbCk7XG4gICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBudWxsKTsgLy8gVE9ETyBpcyB0aGlzIHJpZ2h0IHdoZW4gaGF2aW5nIG11bHRpcGxlIHRleHR1cmUgdW5pdHM/XG5cbiAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgIHRoaXMuYmF0Y2hEZWJ1Z0luZm8ucHVzaCh7XG4gICAgICAgICAgY291bnQ6IGNvdW50LFxuICAgICAgICAgIC8vIGluc3RhbmNlIGNvdW50XG4gICAgICAgICAgYXRsYXNDb3VudDogYXRsYXNlcy5sZW5ndGhcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIHN0YXJ0IHRoZSBuZXh0IGJhdGNoLCBldmVuIGlmIG5vdCBuZWVkZWRcbiAgICAgIHRoaXMuc3RhcnRCYXRjaCgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXREZWJ1Z0luZm9cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0RGVidWdJbmZvKCkge1xuICAgICAgdmFyIGF0bGFzSW5mbyA9IHRoaXMuYXRsYXNNYW5hZ2VyLmdldERlYnVnSW5mbygpO1xuICAgICAgdmFyIHRvdGFsQXRsYXNlcyA9IGF0bGFzSW5mby5yZWR1Y2UoZnVuY3Rpb24gKGNvdW50LCBpbmZvKSB7XG4gICAgICAgIHJldHVybiBjb3VudCArIGluZm8uYXRsYXNDb3VudDtcbiAgICAgIH0sIDApO1xuICAgICAgdmFyIGJhdGNoSW5mbyA9IHRoaXMuYmF0Y2hEZWJ1Z0luZm87XG4gICAgICB2YXIgdG90YWxJbnN0YW5jZXMgPSBiYXRjaEluZm8ucmVkdWNlKGZ1bmN0aW9uIChjb3VudCwgaW5mbykge1xuICAgICAgICByZXR1cm4gY291bnQgKyBpbmZvLmNvdW50O1xuICAgICAgfSwgMCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhdGxhc0luZm86IGF0bGFzSW5mbyxcbiAgICAgICAgdG90YWxBdGxhc2VzOiB0b3RhbEF0bGFzZXMsXG4gICAgICAgIHdyYXBwZWRDb3VudDogdGhpcy53cmFwcGVkQ291bnQsXG4gICAgICAgIHNpbXBsZUNvdW50OiB0aGlzLnNpbXBsZUNvdW50LFxuICAgICAgICBiYXRjaENvdW50OiBiYXRjaEluZm8ubGVuZ3RoLFxuICAgICAgICBiYXRjaEluZm86IGJhdGNoSW5mbyxcbiAgICAgICAgdG90YWxJbnN0YW5jZXM6IHRvdGFsSW5zdGFuY2VzXG4gICAgICB9O1xuICAgIH1cbiAgfV0pO1xufSgpO1xuXG52YXIgQ1JwJDQgPSB7fTtcblxuLyoqXG4gKiBJbml0aWFsaXplIHRoZSBXZWJHTCByZW5kZXJpbmcgbW9kZSBhZnRlciB0aGUgQ2FudmFzIHJlbmRlcmVyIGhhcyBiZWVuIGluaXRpYWxpemVkLlxuICovXG5DUnAkNC5pbml0V2ViZ2wgPSBmdW5jdGlvbiAob3B0cywgZm5zKSB7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIGdsID0gci5kYXRhLmNvbnRleHRzW3IuV0VCR0xdO1xuXG4gIC8vIFNldCBkZWZhdWx0cyBhbmQgbGltaXRzIGZvciBjb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gIG9wdHMuYmdDb2xvciA9IGdldEJHQ29sb3Iocik7XG4gIG9wdHMud2ViZ2xUZXhTaXplID0gTWF0aC5taW4ob3B0cy53ZWJnbFRleFNpemUsIGdsLmdldFBhcmFtZXRlcihnbC5NQVhfVEVYVFVSRV9TSVpFKSk7XG4gIG9wdHMud2ViZ2xUZXhSb3dzID0gTWF0aC5taW4ob3B0cy53ZWJnbFRleFJvd3MsIDU0KTtcbiAgb3B0cy53ZWJnbFRleFJvd3NOb2RlcyA9IE1hdGgubWluKG9wdHMud2ViZ2xUZXhSb3dzTm9kZXMsIDU0KTtcbiAgb3B0cy53ZWJnbEJhdGNoU2l6ZSA9IE1hdGgubWluKG9wdHMud2ViZ2xCYXRjaFNpemUsIDE2Mzg0KTtcbiAgb3B0cy53ZWJnbFRleFBlckJhdGNoID0gTWF0aC5taW4ob3B0cy53ZWJnbFRleFBlckJhdGNoLCBnbC5nZXRQYXJhbWV0ZXIoZ2wuTUFYX1RFWFRVUkVfSU1BR0VfVU5JVFMpKTtcblxuICAvLyBUdXJuIGRlYnVnIG1vZGUgb24gb3Igb2ZmLlxuICByLndlYmdsRGVidWcgPSBvcHRzLndlYmdsRGVidWc7XG4gIHIud2ViZ2xEZWJ1Z1Nob3dBdGxhc2VzID0gb3B0cy53ZWJnbERlYnVnU2hvd0F0bGFzZXM7XG5cbiAgLy8gQ3JlYXRlIG9mZnNjcmVlbiBmcmFtZWJ1ZmZlciB0aGF0IHN0b3JlcyB0aGUgcmVzdWx0cyB3aGVuIFJFTkRFUl9UQVJHRVQuUElDS0lORyBpcyBlbmFibGVkLlxuICAvLyBUaGlzIGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRvcG1vc3QgZWxlbWVudCB6LWluZGV4IGZvciBlYWNoIHBpeGVsLCB3aGljaCBpcyB1c2VkIHRvIHRlbGwgd2hhdHMgdW5kZXIgdGhlIG1vdXNlIGN1cnNvciBwb2ludC5cbiAgci5waWNraW5nRnJhbWVCdWZmZXIgPSBjcmVhdGVQaWNraW5nRnJhbWVCdWZmZXIoZ2wpO1xuICByLnBpY2tpbmdGcmFtZUJ1ZmZlci5uZWVkc0RyYXcgPSB0cnVlO1xuXG4gIC8vIENyZWF0ZSBhbiBFbGVtZW50RHJhd2luZ1dlYkdMIGluc3RhbmNlIHdpY2ggaXMgdXNlZCB0byBkbyB0aGUgYWN0dWFsIFdlYkdMIHJlbmRlcmluZy5cbiAgLy8gVGhpcyBpbnN0YW5jZSBuZWVkcyB0byBiZSBjb25maWd1cmVkIHRvIGRyYXcgdmFyaW91cyB0eXBlcyBvZiBlbGVtZW50cy5cbiAgci5kcmF3aW5nID0gbmV3IEVsZW1lbnREcmF3aW5nV2ViR0wociwgZ2wsIG9wdHMpO1xuXG4gIC8vIFNvbWUgZnVuY3Rpb25zIHRoYXQgYXJlIHVzZWQgdG8gY29uZmlndXJlIEVsZW1lbnREcmF3aW5nV2ViR0xcbiAgdmFyIGdldExhYmVsUm90YXRpb24gPSBmdW5jdGlvbiBnZXRMYWJlbFJvdGF0aW9uKHByb3ApIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGVsZSkge1xuICAgICAgcmV0dXJuIHIuZ2V0VGV4dEFuZ2xlKGVsZSwgcHJvcCk7XG4gICAgfTtcbiAgfTtcbiAgdmFyIGlzTGFiZWxWaXNpYmxlID0gZnVuY3Rpb24gaXNMYWJlbFZpc2libGUocHJvcCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZWxlKSB7XG4gICAgICB2YXIgbGFiZWwgPSBlbGUucHN0eWxlKHByb3ApO1xuICAgICAgcmV0dXJuIGxhYmVsICYmIGxhYmVsLnZhbHVlO1xuICAgIH07XG4gIH07XG4gIHZhciBpc0xheWVyVmlzaWJsZSA9IGZ1bmN0aW9uIGlzTGF5ZXJWaXNpYmxlKHByZWZpeCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgLy8gcHJlZml4IGlzICdvdmVybGF5JyBvciAndW5kZXJsYXknXG4gICAgICByZXR1cm4gbm9kZS5wc3R5bGUoXCJcIi5jb25jYXQocHJlZml4LCBcIi1vcGFjaXR5XCIpKS52YWx1ZSA+IDA7XG4gICAgfTtcbiAgfTtcbiAgdmFyIGdldFRleFBpY2tpbmdNb2RlID0gZnVuY3Rpb24gZ2V0VGV4UGlja2luZ01vZGUoZWxlKSB7XG4gICAgLy8gdGVsbHMgd2hlbiBhIGxhYmVsIHNob3VsZCBiZSBjbGlja2FibGVcbiAgICB2YXIgZW5hYmxlZCA9IGVsZS5wc3R5bGUoJ3RleHQtZXZlbnRzJykuc3RyVmFsdWUgPT09ICd5ZXMnO1xuICAgIHJldHVybiBlbmFibGVkID8gVEVYX1BJQ0tJTkdfTU9ERS5VU0VfQkIgOiBURVhfUElDS0lOR19NT0RFLklHTk9SRTtcbiAgfTtcbiAgdmFyIGdldEJCRm9yU2ltcGxlU2hhcGUgPSBmdW5jdGlvbiBnZXRCQkZvclNpbXBsZVNoYXBlKG5vZGUpIHtcbiAgICAvLyBcInNpbXBsZVwiIHNoYXBlcyBuZWVkIHRoZWlyIEJCIHRvIGluY2x1ZGUgYm9yZGVyIGFuZCBwYWRkaW5nXG4gICAgdmFyIF9ub2RlJHBvc2l0aW9uID0gbm9kZS5wb3NpdGlvbigpLFxuICAgICAgeCA9IF9ub2RlJHBvc2l0aW9uLngsXG4gICAgICB5ID0gX25vZGUkcG9zaXRpb24ueTtcbiAgICB2YXIgdyA9IG5vZGUub3V0ZXJXaWR0aCgpOyAvLyBpbmNsdWRlcyBib3JkZXIgYW5kIHBhZGRpbmdcbiAgICB2YXIgaCA9IG5vZGUub3V0ZXJIZWlnaHQoKTtcbiAgICByZXR1cm4ge1xuICAgICAgdzogdyxcbiAgICAgIGg6IGgsXG4gICAgICB4MTogeCAtIHcgLyAyLFxuICAgICAgeTE6IHkgLSBoIC8gMlxuICAgIH07XG4gIH07XG5cbiAgLy8gQW4gQXRsYXNDb2xsZWN0aW9uIGlzIGEgY29sbGVjdGlvbiBvZiBBdGxhc2VzIHRoYXQgaGF2ZSB0aGUgc2FtZSBjb25maWd1cmFpdG9uIG9wdGlvbnMuXG4gIC8vIENyZWF0ZSBvbmUgZm9yIG5vZGUgYm9kaWVzIGFuZCBvbmUgZm9yIGFsbCB0eXBlcyBvZiBsYWJlbHMuXG4gIHIuZHJhd2luZy5hZGRBdGxhc0NvbGxlY3Rpb24oJ25vZGUnLCB7XG4gICAgdGV4Um93czogb3B0cy53ZWJnbFRleFJvd3NOb2Rlc1xuICB9KTtcbiAgci5kcmF3aW5nLmFkZEF0bGFzQ29sbGVjdGlvbignbGFiZWwnLCB7XG4gICAgdGV4Um93czogb3B0cy53ZWJnbFRleFJvd3NcbiAgfSk7XG5cbiAgLy8gQ29uZmlndXJlIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgZWxlbWVudHMgdGhhdCBjYW4gYmUgcmVuZGVyZWQuXG5cbiAgLy8gTm9kZSBib2RpZXMgY2FuIGJlIHJlbmRlcmVkIGFzIHRleHR1cmVzIG9yIGFzIFwic2ltcGxlIHNoYXBlc1wiLiBcbiAgLy8gU2ltcGxlIHNoYXBlcyBhcmUgcHJlZmVycmVkIGJlY2F1c2UgdGhleSBkbyBub3QgdXNlIHRleHR1cmUgbWVtb3J5LlxuICAvLyBUZXh0dXJlcyBhcmUgcmVxdWlyZWQgaWYgdGhlIG5vZGUgYm9keSB1c2VzIGNvbXBsZXggc3R5bGVzLiBcbiAgci5kcmF3aW5nLmFkZFRleHR1cmVBdGxhc1JlbmRlclR5cGUoJ25vZGUtYm9keScsIHtcbiAgICBjb2xsZWN0aW9uOiAnbm9kZScsXG4gICAgZ2V0S2V5OiBmbnMuZ2V0U3R5bGVLZXksXG4gICAgZ2V0Qm91bmRpbmdCb3g6IGZucy5nZXRFbGVtZW50Qm94LFxuICAgIGRyYXdFbGVtZW50OiBmbnMuZHJhd0VsZW1lbnRcbiAgfSk7XG4gIHIuZHJhd2luZy5hZGRTaW1wbGVTaGFwZVJlbmRlclR5cGUoJ25vZGUtYm9keScsIHtcbiAgICBnZXRCb3VuZGluZ0JveDogZ2V0QkJGb3JTaW1wbGVTaGFwZSxcbiAgICBpc1NpbXBsZTogaXNTaW1wbGVTaGFwZSxcbiAgICBzaGFwZVByb3BzOiB7XG4gICAgICBzaGFwZTogJ3NoYXBlJyxcbiAgICAgIGNvbG9yOiAnYmFja2dyb3VuZC1jb2xvcicsXG4gICAgICBvcGFjaXR5OiAnYmFja2dyb3VuZC1vcGFjaXR5JyxcbiAgICAgIHJhZGl1czogJ2Nvcm5lci1yYWRpdXMnLFxuICAgICAgYm9yZGVyOiB0cnVlXG4gICAgfVxuICB9KTtcbiAgci5kcmF3aW5nLmFkZFNpbXBsZVNoYXBlUmVuZGVyVHlwZSgnbm9kZS1vdmVybGF5Jywge1xuICAgIGdldEJvdW5kaW5nQm94OiBnZXRCQkZvclNpbXBsZVNoYXBlLFxuICAgIGlzVmlzaWJsZTogaXNMYXllclZpc2libGUoJ292ZXJsYXknKSxcbiAgICBzaGFwZVByb3BzOiB7XG4gICAgICBzaGFwZTogJ292ZXJsYXktc2hhcGUnLFxuICAgICAgY29sb3I6ICdvdmVybGF5LWNvbG9yJyxcbiAgICAgIG9wYWNpdHk6ICdvdmVybGF5LW9wYWNpdHknLFxuICAgICAgcGFkZGluZzogJ292ZXJsYXktcGFkZGluZycsXG4gICAgICByYWRpdXM6ICdvdmVybGF5LWNvcm5lci1yYWRpdXMnXG4gICAgfVxuICB9KTtcbiAgci5kcmF3aW5nLmFkZFNpbXBsZVNoYXBlUmVuZGVyVHlwZSgnbm9kZS11bmRlcmxheScsIHtcbiAgICBnZXRCb3VuZGluZ0JveDogZ2V0QkJGb3JTaW1wbGVTaGFwZSxcbiAgICBpc1Zpc2libGU6IGlzTGF5ZXJWaXNpYmxlKCd1bmRlcmxheScpLFxuICAgIHNoYXBlUHJvcHM6IHtcbiAgICAgIHNoYXBlOiAndW5kZXJsYXktc2hhcGUnLFxuICAgICAgY29sb3I6ICd1bmRlcmxheS1jb2xvcicsXG4gICAgICBvcGFjaXR5OiAndW5kZXJsYXktb3BhY2l0eScsXG4gICAgICBwYWRkaW5nOiAndW5kZXJsYXktcGFkZGluZycsXG4gICAgICByYWRpdXM6ICd1bmRlcmxheS1jb3JuZXItcmFkaXVzJ1xuICAgIH1cbiAgfSk7XG4gIHIuZHJhd2luZy5hZGRUZXh0dXJlQXRsYXNSZW5kZXJUeXBlKCdsYWJlbCcsIHtcbiAgICAvLyBub2RlIGxhYmVsIG9yIGVkZ2UgbWlkIGxhYmVsXG4gICAgY29sbGVjdGlvbjogJ2xhYmVsJyxcbiAgICBnZXRUZXhQaWNraW5nTW9kZTogZ2V0VGV4UGlja2luZ01vZGUsXG4gICAgZ2V0S2V5OiBnZXRTdHlsZUtleXNGb3JMYWJlbChmbnMuZ2V0TGFiZWxLZXksIG51bGwpLFxuICAgIGdldEJvdW5kaW5nQm94OiBnZXRCb3VuZGluZ0JveEZvckxhYmVsKGZucy5nZXRMYWJlbEJveCwgbnVsbCksXG4gICAgZHJhd0NsaXBwZWQ6IHRydWUsXG4gICAgZHJhd0VsZW1lbnQ6IGZucy5kcmF3TGFiZWwsXG4gICAgZ2V0Um90YXRpb246IGdldExhYmVsUm90YXRpb24obnVsbCksXG4gICAgZ2V0Um90YXRpb25Qb2ludDogZm5zLmdldExhYmVsUm90YXRpb25Qb2ludCxcbiAgICBnZXRSb3RhdGlvbk9mZnNldDogZm5zLmdldExhYmVsUm90YXRpb25PZmZzZXQsXG4gICAgaXNWaXNpYmxlOiBpc0xhYmVsVmlzaWJsZSgnbGFiZWwnKVxuICB9KTtcbiAgci5kcmF3aW5nLmFkZFRleHR1cmVBdGxhc1JlbmRlclR5cGUoJ2VkZ2Utc291cmNlLWxhYmVsJywge1xuICAgIGNvbGxlY3Rpb246ICdsYWJlbCcsXG4gICAgZ2V0VGV4UGlja2luZ01vZGU6IGdldFRleFBpY2tpbmdNb2RlLFxuICAgIGdldEtleTogZ2V0U3R5bGVLZXlzRm9yTGFiZWwoZm5zLmdldFNvdXJjZUxhYmVsS2V5LCAnc291cmNlJyksXG4gICAgZ2V0Qm91bmRpbmdCb3g6IGdldEJvdW5kaW5nQm94Rm9yTGFiZWwoZm5zLmdldFNvdXJjZUxhYmVsQm94LCAnc291cmNlJyksXG4gICAgZHJhd0NsaXBwZWQ6IHRydWUsXG4gICAgZHJhd0VsZW1lbnQ6IGZucy5kcmF3U291cmNlTGFiZWwsXG4gICAgZ2V0Um90YXRpb246IGdldExhYmVsUm90YXRpb24oJ3NvdXJjZScpLFxuICAgIGdldFJvdGF0aW9uUG9pbnQ6IGZucy5nZXRTb3VyY2VMYWJlbFJvdGF0aW9uUG9pbnQsXG4gICAgZ2V0Um90YXRpb25PZmZzZXQ6IGZucy5nZXRTb3VyY2VMYWJlbFJvdGF0aW9uT2Zmc2V0LFxuICAgIGlzVmlzaWJsZTogaXNMYWJlbFZpc2libGUoJ3NvdXJjZS1sYWJlbCcpXG4gIH0pO1xuICByLmRyYXdpbmcuYWRkVGV4dHVyZUF0bGFzUmVuZGVyVHlwZSgnZWRnZS10YXJnZXQtbGFiZWwnLCB7XG4gICAgY29sbGVjdGlvbjogJ2xhYmVsJyxcbiAgICBnZXRUZXhQaWNraW5nTW9kZTogZ2V0VGV4UGlja2luZ01vZGUsXG4gICAgZ2V0S2V5OiBnZXRTdHlsZUtleXNGb3JMYWJlbChmbnMuZ2V0VGFyZ2V0TGFiZWxLZXksICd0YXJnZXQnKSxcbiAgICBnZXRCb3VuZGluZ0JveDogZ2V0Qm91bmRpbmdCb3hGb3JMYWJlbChmbnMuZ2V0VGFyZ2V0TGFiZWxCb3gsICd0YXJnZXQnKSxcbiAgICBkcmF3Q2xpcHBlZDogdHJ1ZSxcbiAgICBkcmF3RWxlbWVudDogZm5zLmRyYXdUYXJnZXRMYWJlbCxcbiAgICBnZXRSb3RhdGlvbjogZ2V0TGFiZWxSb3RhdGlvbigndGFyZ2V0JyksXG4gICAgZ2V0Um90YXRpb25Qb2ludDogZm5zLmdldFRhcmdldExhYmVsUm90YXRpb25Qb2ludCxcbiAgICBnZXRSb3RhdGlvbk9mZnNldDogZm5zLmdldFRhcmdldExhYmVsUm90YXRpb25PZmZzZXQsXG4gICAgaXNWaXNpYmxlOiBpc0xhYmVsVmlzaWJsZSgndGFyZ2V0LWxhYmVsJylcbiAgfSk7XG5cbiAgLy8gVmVyeSBzaW1wbGlzdGljIHdheSBvZiB0cmlnZ2VyaW5nIGdhcmJhZ2UgY29sbGVjdGlvbiwganVzdCB1c2UgYSB0aW1lci5cbiAgdmFyIHNldEdDRmxhZyA9IGRlYm91bmNlKGZ1bmN0aW9uICgpIHtcbiAgICBjb25zb2xlLmxvZygnZ2FyYmFnZSBjb2xsZWN0IGZsYWcgc2V0Jyk7XG4gICAgci5kYXRhLmdjID0gdHJ1ZTtcbiAgfSwgMTAwMDApO1xuXG4gIC8vIEV2ZW50IGxpc3RlbmVyIGNoZWNrcyBpZiBzdHlsZSBrZXlzIGFyZSBubyBsb25nZXIgaW4gdXNlLlxuICByLm9uVXBkYXRlRWxlQ2FsY3MoZnVuY3Rpb24gKHdpbGxEcmF3LCBlbGVzKSB7XG4gICAgdmFyIGdjTmVlZGVkID0gZmFsc2U7XG4gICAgaWYgKGVsZXMgJiYgZWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBnY05lZWRlZCB8PSByLmRyYXdpbmcuaW52YWxpZGF0ZShlbGVzKTtcbiAgICB9XG4gICAgaWYgKGdjTmVlZGVkKSB7XG4gICAgICBzZXRHQ0ZsYWcoKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIFwiT3ZlcnJpZGVcIiBjZXJ0YWluIGZ1bmN0aW9ucyBpbiBjYW52YXMgYW5kIGJhc2UgcmVuZGVyZXJcbiAgb3ZlcnJpZGVDYW52YXNSZW5kZXJlckZ1bmN0aW9ucyhyKTtcbn07XG5mdW5jdGlvbiBnZXRCR0NvbG9yKHIpIHtcbiAgdmFyIGNvbnRhaW5lciA9IHIuY3kuY29udGFpbmVyKCk7XG4gIHZhciBjc3NDb2xvciA9IGNvbnRhaW5lciAmJiBjb250YWluZXIuc3R5bGUgJiYgY29udGFpbmVyLnN0eWxlLmJhY2tncm91bmRDb2xvciB8fCAnd2hpdGUnO1xuICByZXR1cm4gY29sb3IydHVwbGUoY3NzQ29sb3IpO1xufVxuZnVuY3Rpb24gZ2V0TGFiZWxMaW5lcyhlbGUsIHByZWZpeCkge1xuICB2YXIgcnMgPSBlbGUuX3ByaXZhdGUucnNjcmF0Y2g7XG4gIHJldHVybiBnZXRQcmVmaXhlZFByb3BlcnR5KHJzLCAnbGFiZWxXcmFwQ2FjaGVkTGluZXMnLCBwcmVmaXgpIHx8IFtdO1xufVxuXG4vKiogXG4gKiBIYW5kbGUgbXVsdGktbGluZSBsYWJlbHMgYnkgcmVuZGVyaW5nIGVhY2ggbGluZSBhcyBhIHNlcGVyYXRlIHRleHR1cmUuXG4gKiBUaGF0IG1lYW5zIGVhY2ggbGluZSBuZWVkcyBpdHMgb3duIHN0eWxlIGtleS5cbiAqL1xudmFyIGdldFN0eWxlS2V5c0ZvckxhYmVsID0gZnVuY3Rpb24gZ2V0U3R5bGVLZXlzRm9yTGFiZWwoZ2V0S2V5LCBwcmVmaXgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChlbGUpIHtcbiAgICB2YXIga2V5ID0gZ2V0S2V5KGVsZSk7XG4gICAgdmFyIGxpbmVzID0gZ2V0TGFiZWxMaW5lcyhlbGUsIHByZWZpeCk7XG4gICAgaWYgKGxpbmVzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHJldHVybiBsaW5lcy5tYXAoZnVuY3Rpb24gKGxpbmUsIGluZGV4KSB7XG4gICAgICAgIHJldHVybiBcIlwiLmNvbmNhdChrZXksIFwiX1wiKS5jb25jYXQoaW5kZXgpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBrZXk7XG4gIH07XG59O1xuXG4vKipcbiAqIE5lZWQgdG8gY3JlYXRlIGEgc2VwYXJhdGUgYm91bmRpbmcgYm94IGZvciBlYWNoIGxpbmUgb2YgYSBtdWx0aS1saW5lIGxhYmVsLlxuICogTm90ZSB0aGF0ICdkcmF3Q2xpcHBlZDogdHJ1ZScgc2hvdWxkIGJlIHVzZWQgd2l0aCB0aGlzLlxuICovXG52YXIgZ2V0Qm91bmRpbmdCb3hGb3JMYWJlbCA9IGZ1bmN0aW9uIGdldEJvdW5kaW5nQm94Rm9yTGFiZWwoZ2V0Qm91bmRpbmdCb3gsIHByZWZpeCkge1xuICByZXR1cm4gZnVuY3Rpb24gKGVsZSwgc3R5bGVLZXkpIHtcbiAgICB2YXIgYmIgPSBnZXRCb3VuZGluZ0JveChlbGUpO1xuICAgIGlmICh0eXBlb2Ygc3R5bGVLZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgICB2YXIgdWkgPSBzdHlsZUtleS5pbmRleE9mKCdfJyk7XG4gICAgICBpZiAodWkgPiAwKSB7XG4gICAgICAgIHZhciBsaW5lSW5kZXggPSBOdW1iZXIoc3R5bGVLZXkuc3Vic3RyaW5nKHVpICsgMSkpO1xuICAgICAgICB2YXIgbGluZXMgPSBnZXRMYWJlbExpbmVzKGVsZSwgcHJlZml4KTtcbiAgICAgICAgLy8gQWRqdXN0IHRoZSBoZWlnaHQgYW5kIFkgY29vcmRpbmF0ZSBmb3Igb25lIGxpbmUgb2YgdGhlIGxhYmVsLlxuICAgICAgICB2YXIgaCA9IGJiLmggLyBsaW5lcy5sZW5ndGg7XG4gICAgICAgIHZhciB5T2Zmc2V0ID0gaCAqIGxpbmVJbmRleDtcbiAgICAgICAgdmFyIHkxID0gYmIueTEgKyB5T2Zmc2V0O1xuICAgICAgICAvLyB0aGUgeU9mZnNldCBpcyBuZWVkZWQgd2hlbiByb3RhdGluZyB0aGUgbGFiZWxcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB4MTogYmIueDEsXG4gICAgICAgICAgdzogYmIudyxcbiAgICAgICAgICB5MTogeTEsXG4gICAgICAgICAgaDogaCxcbiAgICAgICAgICB5T2Zmc2V0OiB5T2Zmc2V0XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiYjtcbiAgfTtcbn07XG5cbi8qKlxuICogUGx1ZyBpbnRvIHRoZSBjYW52YXMgcmVuZGVyZXIgYnkgZHluYW1pY2FsbHkgb3ZlcnJpZGluZyBzb21lIG9mIGl0cyBmdW5jdGlvbnMuXG4gKiBUaGlzIHJlcXVpcmVzIG1pbmltYWwgY2hhbmdlcyB0byB0aGUgY2FudmFzIHJlbmRyZXJlci5cbiAqL1xuZnVuY3Rpb24gb3ZlcnJpZGVDYW52YXNSZW5kZXJlckZ1bmN0aW9ucyhyKSB7XG4gIHtcbiAgICAvLyBPdmVycmlkZSB0aGUgcmVuZGVyIGZ1bmN0aW9uIHRvIGNhbGwgdGhlIHdlYmdsIHJlbmRlciBmdW5jdGlvbiBpZiB0aGUgem9vbSBsZXZlbCBpcyBhcHByb3ByaWF0ZVxuICAgIHZhciByZW5kZXJDYW52YXMgPSByLnJlbmRlcjtcbiAgICByLnJlbmRlciA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgIHZhciBjeSA9IHIuY3k7XG4gICAgICBpZiAoci53ZWJnbCkge1xuICAgICAgICAvLyBJZiB0aGUgem9vbSBsZXZlbCBpcyBncmVhdGVyIHRoYW4gdGhlIG1heCB6b29tIGxldmVsLCB0aGVuIGRpc2FibGUgd2ViZ2wgYW5kIHN3aXRjaCBiYWNrIHRvIFxuICAgICAgICAvLyB0aGUgY2FudmFzIHJlbmRlcmVyLlxuICAgICAgICBpZiAoY3kuem9vbSgpID4gbWF4Wm9vbSQxKSB7XG4gICAgICAgICAgY2xlYXJXZWJnbChyKTtcbiAgICAgICAgICByZW5kZXJDYW52YXMuY2FsbChyLCBvcHRpb25zKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjbGVhckNhbnZhcyhyKTtcbiAgICAgICAgICByZW5kZXJXZWJnbChyLCBvcHRpb25zLCBSRU5ERVJfVEFSR0VULlNDUkVFTik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIHtcbiAgICAvLyBPdmVycmlkZSB0aGUgbWF0Y2hDYW52YXNTaXplIGZ1bmN0aW9uIHRvIHVwZGF0ZSB0aGUgcGlja2luZyBmcmFtZSBidWZmZXIgc2l6ZVxuICAgIHZhciBiYXNlRnVuYyA9IHIubWF0Y2hDYW52YXNTaXplO1xuICAgIHIubWF0Y2hDYW52YXNTaXplID0gZnVuY3Rpb24gKGNvbnRhaW5lcikge1xuICAgICAgYmFzZUZ1bmMuY2FsbChyLCBjb250YWluZXIpO1xuICAgICAgci5waWNraW5nRnJhbWVCdWZmZXIuc2V0RnJhbWVidWZmZXJBdHRhY2htZW50U2l6ZXMoci5jYW52YXNXaWR0aCwgci5jYW52YXNIZWlnaHQpO1xuICAgICAgci5waWNraW5nRnJhbWVCdWZmZXIubmVlZHNEcmF3ID0gdHJ1ZTtcbiAgICB9O1xuICB9XG4gIHtcbiAgICAvLyBPdmVycmlkZSBmdW5jdGlvbiB0byBjYWxsIHRoZSB3ZWJnbCB2ZXJzaW9uIGZvciBwaWNraW5nLlxuICAgIC8vIERvbid0IG92ZXJyaWRlIHIuZ2V0QWxsSW5Cb3goKSBzZWxjdGlvbiBib3ggcGlja2luZywgaXRzIG5vdCBhY2N1cmF0ZSBlbm91Z2ggd2l0aCB3ZWJnbFxuICAgIHIuZmluZE5lYXJlc3RFbGVtZW50cyA9IGZ1bmN0aW9uICh4LCB5LCBpbnRlcmFjdGl2ZUVsZW1lbnRzT25seSwgaXNUb3VjaCkge1xuICAgICAgLy8gdGhlIGNhbnZhcyB2ZXJzaW9uIG9mIHRoaXMgZnVuY3Rpb24gaXMgdmVyeSBzbG93IG9uIGxhcmdlIGdyYXBoc1xuICAgICAgcmV0dXJuIGZpbmROZWFyZXN0RWxlbWVudHNXZWJnbChyLCB4LCB5KTtcbiAgICB9O1xuICB9XG4gIHtcbiAgICAvLyBuZWVkIHRvIGtub3cgd2hlbiB0aGUgY2FjaGVkIGVsZW1lbnRzIGhhdmUgY2hhbmdlZCBzbyB3ZSBjYW4gaW52YWxpZGF0ZSBvdXIgY2FjaGVzXG4gICAgdmFyIF9iYXNlRnVuYyA9IHIuaW52YWxpZGF0ZUNhY2hlZFpTb3J0ZWRFbGVzO1xuICAgIHIuaW52YWxpZGF0ZUNhY2hlZFpTb3J0ZWRFbGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgX2Jhc2VGdW5jLmNhbGwocik7XG4gICAgICByLnBpY2tpbmdGcmFtZUJ1ZmZlci5uZWVkc0RyYXcgPSB0cnVlO1xuICAgIH07XG4gIH1cbiAge1xuICAgIC8vIG5lZWQgdG8ga25vdyB3aGVuIHRoZSBjYWNoZWQgZWxlbWVudHMgaGF2ZSBjaGFuZ2VkIHNvIHdlIGNhbiBpbnZhbGlkYXRlIG91ciBjYWNoZXNcbiAgICB2YXIgX2Jhc2VGdW5jMiA9IHIubm90aWZ5O1xuICAgIHIubm90aWZ5ID0gZnVuY3Rpb24gKGV2ZW50TmFtZSwgZWxlcykge1xuICAgICAgX2Jhc2VGdW5jMi5jYWxsKHIsIGV2ZW50TmFtZSwgZWxlcyk7XG4gICAgICBpZiAoZXZlbnROYW1lID09PSAndmlld3BvcnQnIHx8IGV2ZW50TmFtZSA9PT0gJ2JvdW5kcycpIHtcbiAgICAgICAgci5waWNraW5nRnJhbWVCdWZmZXIubmVlZHNEcmF3ID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnROYW1lID09PSAnYmFja2dyb3VuZCcpIHtcbiAgICAgICAgLy8gYmFja2dyb3VuZCBpbWFnZSBmaW5pc2hlZCBsb2FkaW5nLCBuZWVkIHRvIHJlZHJhd1xuICAgICAgICByLmRyYXdpbmcuaW52YWxpZGF0ZShlbGVzLCB7XG4gICAgICAgICAgdHlwZTogJ25vZGUtYm9keSdcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuZnVuY3Rpb24gY2xlYXJXZWJnbChyKSB7XG4gIHZhciBnbCA9IHIuZGF0YS5jb250ZXh0c1tyLldFQkdMXTtcbiAgZ2wuY2xlYXIoZ2wuQ09MT1JfQlVGRkVSX0JJVCB8IGdsLkRFUFRIX0JVRkZFUl9CSVQpO1xufVxuZnVuY3Rpb24gY2xlYXJDYW52YXMocikge1xuICAvLyB0aGUgQ1JwLmNsZWFyQ2FudmFzKCkgZnVuY3Rpb24gZG9lc24ndCB0YWtlIHRoZSB0cmFuc2Zvcm0gaW50byBhY2NvdW50XG4gIHZhciBjbGVhciA9IGZ1bmN0aW9uIGNsZWFyKGNvbnRleHQpIHtcbiAgICBjb250ZXh0LnNhdmUoKTtcbiAgICBjb250ZXh0LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcbiAgICBjb250ZXh0LmNsZWFyUmVjdCgwLCAwLCByLmNhbnZhc1dpZHRoLCByLmNhbnZhc0hlaWdodCk7XG4gICAgY29udGV4dC5yZXN0b3JlKCk7XG4gIH07XG4gIGNsZWFyKHIuZGF0YS5jb250ZXh0c1tyLk5PREVdKTtcbiAgY2xlYXIoci5kYXRhLmNvbnRleHRzW3IuRFJBR10pO1xufVxuZnVuY3Rpb24gY3JlYXRlUGFuWm9vbU1hdHJpeChyKSB7XG4gIHZhciB3aWR0aCA9IHIuY2FudmFzV2lkdGg7XG4gIHZhciBoZWlnaHQgPSByLmNhbnZhc0hlaWdodDtcbiAgdmFyIF91dGlsJGdldEVmZmVjdGl2ZVBhbiA9IGdldEVmZmVjdGl2ZVBhblpvb20ociksXG4gICAgcGFuID0gX3V0aWwkZ2V0RWZmZWN0aXZlUGFuLnBhbixcbiAgICB6b29tID0gX3V0aWwkZ2V0RWZmZWN0aXZlUGFuLnpvb207XG4gIHZhciB0cmFuc2Zvcm0gPSBjcmVhdGUoKTtcbiAgdHJhbnNsYXRlKHRyYW5zZm9ybSwgdHJhbnNmb3JtLCBbcGFuLngsIHBhbi55XSk7XG4gIHNjYWxlKHRyYW5zZm9ybSwgdHJhbnNmb3JtLCBbem9vbSwgem9vbV0pO1xuICB2YXIgcHJvamVjdGlvbiQxID0gY3JlYXRlKCk7XG4gIHByb2plY3Rpb24ocHJvamVjdGlvbiQxLCB3aWR0aCwgaGVpZ2h0KTtcbiAgdmFyIHByb2R1Y3QgPSBjcmVhdGUoKTtcbiAgbXVsdGlwbHkocHJvZHVjdCwgcHJvamVjdGlvbiQxLCB0cmFuc2Zvcm0pO1xuICByZXR1cm4gcHJvZHVjdDtcbn1cbmZ1bmN0aW9uIHNldENvbnRleHRUcmFuc2Zvcm0ociwgY29udGV4dCkge1xuICB2YXIgd2lkdGggPSByLmNhbnZhc1dpZHRoO1xuICB2YXIgaGVpZ2h0ID0gci5jYW52YXNIZWlnaHQ7XG4gIHZhciBfdXRpbCRnZXRFZmZlY3RpdmVQYW4yID0gZ2V0RWZmZWN0aXZlUGFuWm9vbShyKSxcbiAgICBwYW4gPSBfdXRpbCRnZXRFZmZlY3RpdmVQYW4yLnBhbixcbiAgICB6b29tID0gX3V0aWwkZ2V0RWZmZWN0aXZlUGFuMi56b29tO1xuICBjb250ZXh0LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcbiAgY29udGV4dC5jbGVhclJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gIGNvbnRleHQudHJhbnNsYXRlKHBhbi54LCBwYW4ueSk7XG4gIGNvbnRleHQuc2NhbGUoem9vbSwgem9vbSk7XG59XG5mdW5jdGlvbiBkcmF3U2VsZWN0aW9uUmVjdGFuZ2xlKHIsIG9wdGlvbnMpIHtcbiAgci5kcmF3U2VsZWN0aW9uUmVjdGFuZ2xlKG9wdGlvbnMsIGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgcmV0dXJuIHNldENvbnRleHRUcmFuc2Zvcm0ociwgY29udGV4dCk7XG4gIH0pO1xufVxuZnVuY3Rpb24gZHJhd0F4ZXMocikge1xuICAvLyBmb3IgZGViZ2dpbmdcbiAgdmFyIGNvbnRleHQgPSByLmRhdGEuY29udGV4dHNbci5OT0RFXTtcbiAgY29udGV4dC5zYXZlKCk7XG4gIHNldENvbnRleHRUcmFuc2Zvcm0ociwgY29udGV4dCk7XG4gIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSAncmdiYSgwLCAwLCAwLCAwLjMpJztcbiAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgY29udGV4dC5tb3ZlVG8oLTFlMywgMCk7XG4gIGNvbnRleHQubGluZVRvKDEwMDAsIDApO1xuICBjb250ZXh0LnN0cm9rZSgpO1xuICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICBjb250ZXh0Lm1vdmVUbygwLCAtMWUzKTtcbiAgY29udGV4dC5saW5lVG8oMCwgMTAwMCk7XG4gIGNvbnRleHQuc3Ryb2tlKCk7XG4gIGNvbnRleHQucmVzdG9yZSgpO1xufVxuZnVuY3Rpb24gZHJhd0F0bGFzZXMocikge1xuICAvLyBGb3IgZGVidWdnaW5nIHRoZSBhdGxhc2VzLCB0aGlzIGRvZXNuJ3Qgd29yayBmb3IgQXRsYXNlcyB0aGF0IGFyZSBsb2NrZWRcbiAgdmFyIGRyYXcgPSBmdW5jdGlvbiBkcmF3KGRyYXdpbmcsIG5hbWUsIHJvdykge1xuICAgIHZhciBjb2xsZWN0aW9uID0gZHJhd2luZy5hdGxhc01hbmFnZXIuZ2V0QXRsYXNDb2xsZWN0aW9uKG5hbWUpO1xuICAgIHZhciBjb250ZXh0ID0gci5kYXRhLmNvbnRleHRzW3IuTk9ERV07XG4gICAgdmFyIGF0bGFzZXMgPSBjb2xsZWN0aW9uLmF0bGFzZXM7XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGF0bGFzZXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgYXRsYXMgPSBhdGxhc2VzW19pXTtcbiAgICAgIHZhciBjYW52YXMgPSBhdGxhcy5jYW52YXM7XG4gICAgICBpZiAoY2FudmFzKSB7XG4gICAgICAgIHZhciB3ID0gY2FudmFzLndpZHRoO1xuICAgICAgICB2YXIgaCA9IGNhbnZhcy5oZWlnaHQ7XG4gICAgICAgIHZhciB4ID0gdyAqIF9pO1xuICAgICAgICB2YXIgeSA9IGNhbnZhcy5oZWlnaHQgKiByb3c7XG4gICAgICAgIHZhciBzY2FsZSA9IDAuNDtcbiAgICAgICAgY29udGV4dC5zYXZlKCk7XG4gICAgICAgIGNvbnRleHQuc2NhbGUoc2NhbGUsIHNjYWxlKTtcbiAgICAgICAgY29udGV4dC5kcmF3SW1hZ2UoY2FudmFzLCB4LCB5KTtcbiAgICAgICAgY29udGV4dC5zdHJva2VTdHlsZSA9ICdibGFjayc7XG4gICAgICAgIGNvbnRleHQucmVjdCh4LCB5LCB3LCBoKTtcbiAgICAgICAgY29udGV4dC5zdHJva2UoKTtcbiAgICAgICAgY29udGV4dC5yZXN0b3JlKCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICB2YXIgaSA9IDA7XG4gIGRyYXcoci5kcmF3aW5nLCAnbm9kZScsIGkrKyk7XG4gIGRyYXcoci5kcmF3aW5nLCAnbGFiZWwnLCBpKyspO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHotb3JkZXIgaW5kZXggb2YgZWxtZW50cyB1bmRlciBvciB2ZXJ5IGNsb3NlIHRvIHRoZSBtb3VzZSBjdXJzb3IgcG9pbnQuXG4gKiBBcmd1bWVudHMgYXJlIGluIG1vZGVsIGNvb3JkaW5hdGVzLlxuICogKHgxLCB5MSkgaXMgdG9wIGxlZnQgY29ybmVyXG4gKiAoeDIsIHkyKSBpcyBib3R0b20gcmlnaHQgY29ybmVyIChvcHRpb25hbClcbiAqIFJldHVybnMgYSBTZXQgb2YgaW5kZXhlcy5cbiAqL1xuZnVuY3Rpb24gZ2V0UGlja2luZ0luZGV4ZXMociwgbVgxLCBtWTEsIG1YMiwgbVkyKSB7XG4gIHZhciB4LCB5LCB3LCBoO1xuICB2YXIgX3V0aWwkZ2V0RWZmZWN0aXZlUGFuMyA9IGdldEVmZmVjdGl2ZVBhblpvb20ociksXG4gICAgcGFuID0gX3V0aWwkZ2V0RWZmZWN0aXZlUGFuMy5wYW4sXG4gICAgem9vbSA9IF91dGlsJGdldEVmZmVjdGl2ZVBhbjMuem9vbTtcbiAge1xuICAgIHZhciBfdXRpbCRtb2RlbFRvUmVuZGVyZWQgPSBtb2RlbFRvUmVuZGVyZWRQb3NpdGlvbihyLCBwYW4sIHpvb20sIG1YMSwgbVkxKSxcbiAgICAgIF91dGlsJG1vZGVsVG9SZW5kZXJlZDIgPSBfc2xpY2VkVG9BcnJheShfdXRpbCRtb2RlbFRvUmVuZGVyZWQsIDIpLFxuICAgICAgY1gxID0gX3V0aWwkbW9kZWxUb1JlbmRlcmVkMlswXSxcbiAgICAgIGNZMSA9IF91dGlsJG1vZGVsVG9SZW5kZXJlZDJbMV07XG4gICAgdmFyIHQgPSA2OyAvLyBzaG91bGQgYmUgZXZlblxuICAgIHggPSBjWDEgLSB0IC8gMjtcbiAgICB5ID0gY1kxIC0gdCAvIDI7XG4gICAgdyA9IHQ7XG4gICAgaCA9IHQ7XG4gIH1cbiAgaWYgKHcgPT09IDAgfHwgaCA9PT0gMCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICB2YXIgZ2wgPSByLmRhdGEuY29udGV4dHNbci5XRUJHTF07XG4gIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgci5waWNraW5nRnJhbWVCdWZmZXIpO1xuICBpZiAoci5waWNraW5nRnJhbWVCdWZmZXIubmVlZHNEcmF3KSB7XG4gICAgLy8gRHJhdyBlbGVtZW50IHotaW5kZXhlcyB0byB0aGUgcGlja2luZyBmcmFtZWJ1ZmZlclxuICAgIGdsLnZpZXdwb3J0KDAsIDAsIGdsLmNhbnZhcy53aWR0aCwgZ2wuY2FudmFzLmhlaWdodCk7XG4gICAgcmVuZGVyV2ViZ2wociwgbnVsbCwgUkVOREVSX1RBUkdFVC5QSUNLSU5HKTtcbiAgICByLnBpY2tpbmdGcmFtZUJ1ZmZlci5uZWVkc0RyYXcgPSBmYWxzZTtcbiAgfVxuICB2YXIgbiA9IHcgKiBoOyAvLyBudW1iZXIgb2YgcGl4ZWxzIHRvIHJlYWRcbiAgdmFyIGRhdGEgPSBuZXcgVWludDhBcnJheShuICogNCk7IC8vIDQgYnl0ZXMgcGVyIHBpeGVsXG4gIGdsLnJlYWRQaXhlbHMoeCwgeSwgdywgaCwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgZGF0YSk7XG4gIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgbnVsbCk7XG4gIHZhciBpbmRleGVzID0gbmV3IFNldCgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykge1xuICAgIHZhciBwaXhlbCA9IGRhdGEuc2xpY2UoaSAqIDQsIGkgKiA0ICsgNCk7XG4gICAgdmFyIGluZGV4ID0gdmVjNFRvSW5kZXgocGl4ZWwpIC0gMTsgLy8gVGhlIGZyYW1lYnVmZmVyIGlzIGNsZWFyZWQgd2l0aCAwcywgc28gei1pbmRleGVzIGFyZSBvZmZzZXQgYnkgMVxuICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICBpbmRleGVzLmFkZChpbmRleCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBpbmRleGVzO1xufVxuXG4vKipcbiAqIEN5LmpzOiBtb2RlbCBjb29yZGluYXRlIHkgYXhpcyBnb2VzIGRvd25cbiAqL1xuZnVuY3Rpb24gZmluZE5lYXJlc3RFbGVtZW50c1dlYmdsKHIsIHgsIHkpIHtcbiAgLy8gbW9kZWwgY29vcmRpbmF0ZXNcbiAgdmFyIGluZGV4ZXMgPSBnZXRQaWNraW5nSW5kZXhlcyhyLCB4LCB5KTtcbiAgdmFyIGVsZXMgPSByLmdldENhY2hlZFpTb3J0ZWRFbGVzKCk7XG4gIHZhciBub2RlLCBlZGdlO1xuICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoaW5kZXhlcyksXG4gICAgX3N0ZXA7XG4gIHRyeSB7XG4gICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHtcbiAgICAgIHZhciBpbmRleCA9IF9zdGVwLnZhbHVlO1xuICAgICAgdmFyIGVsZSA9IGVsZXNbaW5kZXhdO1xuICAgICAgaWYgKCFub2RlICYmIGVsZS5pc05vZGUoKSkge1xuICAgICAgICBub2RlID0gZWxlO1xuICAgICAgfVxuICAgICAgaWYgKCFlZGdlICYmIGVsZS5pc0VkZ2UoKSkge1xuICAgICAgICBlZGdlID0gZWxlO1xuICAgICAgfVxuICAgICAgaWYgKG5vZGUgJiYgZWRnZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIF9pdGVyYXRvci5lKGVycik7XG4gIH0gZmluYWxseSB7XG4gICAgX2l0ZXJhdG9yLmYoKTtcbiAgfVxuICByZXR1cm4gW25vZGUsIGVkZ2VdLmZpbHRlcihCb29sZWFuKTtcbn1cblxuLyoqXG4gKiBEcmF3IG9uZSBub2RlIG9yIGVkZ2UuIFxuICovXG5mdW5jdGlvbiBkcmF3RWxlKHIsIGluZGV4LCBlbGUpIHtcbiAgdmFyIGRyYXdpbmcgPSByLmRyYXdpbmc7XG4gIGluZGV4ICs9IDE7IC8vIDAgaXMgdXNlZCB0byBjbGVhciB0aGUgYmFja2dyb3VuZCwgbmVlZCB0byBvZmZzZXQgYWxsIHotaW5kZXhlcyBieSBvbmVcbiAgaWYgKGVsZS5pc05vZGUoKSkge1xuICAgIGRyYXdpbmcuZHJhd05vZGUoZWxlLCBpbmRleCwgJ25vZGUtdW5kZXJsYXknKTtcbiAgICBkcmF3aW5nLmRyYXdOb2RlKGVsZSwgaW5kZXgsICdub2RlLWJvZHknKTtcbiAgICBkcmF3aW5nLmRyYXdUZXh0dXJlKGVsZSwgaW5kZXgsICdsYWJlbCcpO1xuICAgIGRyYXdpbmcuZHJhd05vZGUoZWxlLCBpbmRleCwgJ25vZGUtb3ZlcmxheScpO1xuICB9IGVsc2Uge1xuICAgIGRyYXdpbmcuZHJhd0VkZ2VMaW5lKGVsZSwgaW5kZXgpO1xuICAgIGRyYXdpbmcuZHJhd0VkZ2VBcnJvdyhlbGUsIGluZGV4LCAnc291cmNlJyk7XG4gICAgZHJhd2luZy5kcmF3RWRnZUFycm93KGVsZSwgaW5kZXgsICd0YXJnZXQnKTtcbiAgICBkcmF3aW5nLmRyYXdUZXh0dXJlKGVsZSwgaW5kZXgsICdsYWJlbCcpO1xuICAgIGRyYXdpbmcuZHJhd1RleHR1cmUoZWxlLCBpbmRleCwgJ2VkZ2Utc291cmNlLWxhYmVsJyk7XG4gICAgZHJhd2luZy5kcmF3VGV4dHVyZShlbGUsIGluZGV4LCAnZWRnZS10YXJnZXQtbGFiZWwnKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlbmRlciBvbmUgZnJhbWUuXG4gKi9cbmZ1bmN0aW9uIHJlbmRlcldlYmdsKHIsIG9wdGlvbnMsIHJlbmRlclRhcmdldCkge1xuICB2YXIgc3RhcnQ7XG4gIGlmIChyLndlYmdsRGVidWcpIHtcbiAgICBzdGFydCA9IHBlcmZvcm1hbmNlLm5vdygpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4gIH1cbiAgdmFyIGRyYXdpbmcgPSByLmRyYXdpbmc7XG4gIHZhciBlbGVDb3VudCA9IDA7XG4gIGlmIChyZW5kZXJUYXJnZXQuc2NyZWVuKSB7XG4gICAgaWYgKHIuZGF0YS5jYW52YXNOZWVkc1JlZHJhd1tyLlNFTEVDVF9CT1hdKSB7XG4gICAgICBkcmF3U2VsZWN0aW9uUmVjdGFuZ2xlKHIsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHNlZSBkcmF3aW5nLWVsZW1lbnRzLmpzIGRyYXdDYWNoZWRFbGVtZW50KClcbiAgaWYgKHIuZGF0YS5jYW52YXNOZWVkc1JlZHJhd1tyLk5PREVdIHx8IHJlbmRlclRhcmdldC5waWNraW5nKSB7XG4gICAgdmFyIGdsID0gci5kYXRhLmNvbnRleHRzW3IuV0VCR0xdO1xuICAgIGlmIChyZW5kZXJUYXJnZXQuc2NyZWVuKSB7XG4gICAgICBnbC5jbGVhckNvbG9yKDAsIDAsIDAsIDApOyAvLyBiYWNrZ3JvdW5kIGNvbG9yXG4gICAgICBnbC5lbmFibGUoZ2wuQkxFTkQpOyAvLyBlbmFibGUgYWxwaGEgYmxlbmRpbmcgb2YgY29sb3JzXG4gICAgICBnbC5ibGVuZEZ1bmMoZ2wuT05FLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBKTsgLy8gd2ViZ2wgY29sb3JzIHVzZSBwcmVtdWx0aXBsaWVkIGFscGhhXG4gICAgfSBlbHNlIHtcbiAgICAgIGdsLmRpc2FibGUoZ2wuQkxFTkQpOyAvLyBkb24ndCBibGVuZCB6LW9yZGVyIGluZGV4IHZhbHVlcyEgdGhleSBhcmUgbm90IGNvbG9yc1xuICAgIH1cbiAgICBnbC5jbGVhcihnbC5DT0xPUl9CVUZGRVJfQklUIHwgZ2wuREVQVEhfQlVGRkVSX0JJVCk7XG4gICAgZ2wudmlld3BvcnQoMCwgMCwgZ2wuY2FudmFzLndpZHRoLCBnbC5jYW52YXMuaGVpZ2h0KTtcbiAgICB2YXIgcGFuWm9vbU1hdHJpeCA9IGNyZWF0ZVBhblpvb21NYXRyaXgocik7XG4gICAgdmFyIGVsZXMgPSByLmdldENhY2hlZFpTb3J0ZWRFbGVzKCk7XG4gICAgZWxlQ291bnQgPSBlbGVzLmxlbmd0aDtcbiAgICBkcmF3aW5nLnN0YXJ0RnJhbWUocGFuWm9vbU1hdHJpeCwgcmVuZGVyVGFyZ2V0KTtcbiAgICBpZiAocmVuZGVyVGFyZ2V0LnNjcmVlbikge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLm5vbmRyYWcubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZHJhd0VsZShyLCBpLCBlbGVzLm5vbmRyYWdbaV0pO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgZWxlcy5kcmFnLmxlbmd0aDsgX2kyKyspIHtcbiAgICAgICAgZHJhd0VsZShyLCBfaTIsIGVsZXMuZHJhZ1tfaTJdKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHJlbmRlclRhcmdldC5waWNraW5nKSB7XG4gICAgICBmb3IgKHZhciBfaTMgPSAwOyBfaTMgPCBlbGVzLmxlbmd0aDsgX2kzKyspIHtcbiAgICAgICAgZHJhd0VsZShyLCBfaTMsIGVsZXNbX2kzXSk7XG4gICAgICB9XG4gICAgfVxuICAgIGRyYXdpbmcuZW5kRnJhbWUoKTtcbiAgICBpZiAocmVuZGVyVGFyZ2V0LnNjcmVlbiAmJiByLndlYmdsRGVidWdTaG93QXRsYXNlcykge1xuICAgICAgZHJhd0F4ZXMocik7XG4gICAgICBkcmF3QXRsYXNlcyhyKTtcbiAgICB9XG4gICAgci5kYXRhLmNhbnZhc05lZWRzUmVkcmF3W3IuTk9ERV0gPSBmYWxzZTtcbiAgICByLmRhdGEuY2FudmFzTmVlZHNSZWRyYXdbci5EUkFHXSA9IGZhbHNlO1xuICB9XG4gIGlmIChyLndlYmdsRGVidWcpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgICB2YXIgZW5kID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgdmFyIGNvbXBhY3QgPSBmYWxzZTtcbiAgICB2YXIgdGltZSA9IE1hdGguY2VpbChlbmQgLSBzdGFydCk7XG4gICAgdmFyIGRlYnVnSW5mbyA9IGRyYXdpbmcuZ2V0RGVidWdJbmZvKCk7XG4gICAgdmFyIHJlcG9ydCA9IFtcIlwiLmNvbmNhdChlbGVDb3VudCwgXCIgZWxlbWVudHNcIiksIFwiXCIuY29uY2F0KGRlYnVnSW5mby50b3RhbEluc3RhbmNlcywgXCIgaW5zdGFuY2VzXCIpLCBcIlwiLmNvbmNhdChkZWJ1Z0luZm8uYmF0Y2hDb3VudCwgXCIgYmF0Y2hlc1wiKSwgXCJcIi5jb25jYXQoZGVidWdJbmZvLnRvdGFsQXRsYXNlcywgXCIgYXRsYXNlc1wiKSwgXCJcIi5jb25jYXQoZGVidWdJbmZvLndyYXBwZWRDb3VudCwgXCIgd3JhcHBlZCB0ZXh0dXJlc1wiKSwgXCJcIi5jb25jYXQoZGVidWdJbmZvLnNpbXBsZUNvdW50LCBcIiBzaW1wbGUgc2hhcGVzXCIpXS5qb2luKCcsICcpO1xuICAgIGlmIChjb21wYWN0KSB7XG4gICAgICBjb25zb2xlLmxvZyhcIldlYkdMIChcIi5jb25jYXQocmVuZGVyVGFyZ2V0Lm5hbWUsIFwiKSAtIHRpbWUgXCIpLmNvbmNhdCh0aW1lLCBcIm1zLCBcIikuY29uY2F0KHJlcG9ydCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZyhcIldlYkdMIChcIi5jb25jYXQocmVuZGVyVGFyZ2V0Lm5hbWUsIFwiKSAtIGZyYW1lIHRpbWUgXCIpLmNvbmNhdCh0aW1lLCBcIm1zXCIpKTtcbiAgICAgIGNvbnNvbGUubG9nKCdUb3RhbHM6Jyk7XG4gICAgICBjb25zb2xlLmxvZyhcIiAgXCIuY29uY2F0KHJlcG9ydCkpO1xuICAgICAgY29uc29sZS5sb2coJ1RleHR1cmUgQXRsYXNlcyBVc2VkOicpO1xuICAgICAgdmFyIGF0bGFzSW5mbyA9IGRlYnVnSW5mby5hdGxhc0luZm87XG4gICAgICB2YXIgX2l0ZXJhdG9yMiA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGF0bGFzSW5mbyksXG4gICAgICAgIF9zdGVwMjtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAoX2l0ZXJhdG9yMi5zKCk7ICEoX3N0ZXAyID0gX2l0ZXJhdG9yMi5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgdmFyIGluZm8gPSBfc3RlcDIudmFsdWU7XG4gICAgICAgICAgY29uc29sZS5sb2coXCIgIFwiLmNvbmNhdChpbmZvLnR5cGUsIFwiOiBcIikuY29uY2F0KGluZm8ua2V5Q291bnQsIFwiIGtleXMsIFwiKS5jb25jYXQoaW5mby5hdGxhc0NvdW50LCBcIiBhdGxhc2VzXCIpKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIF9pdGVyYXRvcjIuZShlcnIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgX2l0ZXJhdG9yMi5mKCk7XG4gICAgICB9XG4gICAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgfVxuICB9XG4gIGlmIChyLmRhdGEuZ2MpIHtcbiAgICBjb25zb2xlLmxvZygnR2FyYmFnZSBDb2xsZWN0IScpO1xuICAgIHIuZGF0YS5nYyA9IGZhbHNlO1xuICAgIGRyYXdpbmcuZ2MoKTtcbiAgfVxufVxuXG52YXIgQ1JwJDMgPSB7fTtcblxuLy8gQE8gUG9seWdvbiBkcmF3aW5nXG5DUnAkMy5kcmF3UG9seWdvblBhdGggPSBmdW5jdGlvbiAoY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgcG9pbnRzKSB7XG4gIHZhciBoYWxmVyA9IHdpZHRoIC8gMjtcbiAgdmFyIGhhbGZIID0gaGVpZ2h0IC8gMjtcbiAgaWYgKGNvbnRleHQuYmVnaW5QYXRoKSB7XG4gICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgfVxuICBjb250ZXh0Lm1vdmVUbyh4ICsgaGFsZlcgKiBwb2ludHNbMF0sIHkgKyBoYWxmSCAqIHBvaW50c1sxXSk7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgcG9pbnRzLmxlbmd0aCAvIDI7IGkrKykge1xuICAgIGNvbnRleHQubGluZVRvKHggKyBoYWxmVyAqIHBvaW50c1tpICogMl0sIHkgKyBoYWxmSCAqIHBvaW50c1tpICogMiArIDFdKTtcbiAgfVxuICBjb250ZXh0LmNsb3NlUGF0aCgpO1xufTtcbkNScCQzLmRyYXdSb3VuZFBvbHlnb25QYXRoID0gZnVuY3Rpb24gKGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIHBvaW50cywgY29ybmVycykge1xuICBjb3JuZXJzLmZvckVhY2goZnVuY3Rpb24gKGNvcm5lcikge1xuICAgIHJldHVybiBkcmF3UHJlcGFyZWRSb3VuZENvcm5lcihjb250ZXh0LCBjb3JuZXIpO1xuICB9KTtcbiAgY29udGV4dC5jbG9zZVBhdGgoKTtcbn07XG5cbi8vIFJvdW5kIHJlY3RhbmdsZSBkcmF3aW5nXG5DUnAkMy5kcmF3Um91bmRSZWN0YW5nbGVQYXRoID0gZnVuY3Rpb24gKGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIHJhZGl1cykge1xuICB2YXIgaGFsZldpZHRoID0gd2lkdGggLyAyO1xuICB2YXIgaGFsZkhlaWdodCA9IGhlaWdodCAvIDI7XG4gIHZhciBjb3JuZXJSYWRpdXMgPSByYWRpdXMgPT09ICdhdXRvJyA/IGdldFJvdW5kUmVjdGFuZ2xlUmFkaXVzKHdpZHRoLCBoZWlnaHQpIDogTWF0aC5taW4ocmFkaXVzLCBoYWxmSGVpZ2h0LCBoYWxmV2lkdGgpO1xuICBpZiAoY29udGV4dC5iZWdpblBhdGgpIHtcbiAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICB9XG5cbiAgLy8gU3RhcnQgYXQgdG9wIG1pZGRsZVxuICBjb250ZXh0Lm1vdmVUbyh4LCB5IC0gaGFsZkhlaWdodCk7XG4gIC8vIEFyYyBmcm9tIG1pZGRsZSB0b3AgdG8gcmlnaHQgc2lkZVxuICBjb250ZXh0LmFyY1RvKHggKyBoYWxmV2lkdGgsIHkgLSBoYWxmSGVpZ2h0LCB4ICsgaGFsZldpZHRoLCB5LCBjb3JuZXJSYWRpdXMpO1xuICAvLyBBcmMgZnJvbSByaWdodCBzaWRlIHRvIGJvdHRvbVxuICBjb250ZXh0LmFyY1RvKHggKyBoYWxmV2lkdGgsIHkgKyBoYWxmSGVpZ2h0LCB4LCB5ICsgaGFsZkhlaWdodCwgY29ybmVyUmFkaXVzKTtcbiAgLy8gQXJjIGZyb20gYm90dG9tIHRvIGxlZnQgc2lkZVxuICBjb250ZXh0LmFyY1RvKHggLSBoYWxmV2lkdGgsIHkgKyBoYWxmSGVpZ2h0LCB4IC0gaGFsZldpZHRoLCB5LCBjb3JuZXJSYWRpdXMpO1xuICAvLyBBcmMgZnJvbSBsZWZ0IHNpZGUgdG8gdG9wQm9yZGVyXG4gIGNvbnRleHQuYXJjVG8oeCAtIGhhbGZXaWR0aCwgeSAtIGhhbGZIZWlnaHQsIHgsIHkgLSBoYWxmSGVpZ2h0LCBjb3JuZXJSYWRpdXMpO1xuICAvLyBKb2luIGxpbmVcbiAgY29udGV4dC5saW5lVG8oeCwgeSAtIGhhbGZIZWlnaHQpO1xuICBjb250ZXh0LmNsb3NlUGF0aCgpO1xufTtcbkNScCQzLmRyYXdCb3R0b21Sb3VuZFJlY3RhbmdsZVBhdGggPSBmdW5jdGlvbiAoY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgcmFkaXVzKSB7XG4gIHZhciBoYWxmV2lkdGggPSB3aWR0aCAvIDI7XG4gIHZhciBoYWxmSGVpZ2h0ID0gaGVpZ2h0IC8gMjtcbiAgdmFyIGNvcm5lclJhZGl1cyA9IHJhZGl1cyA9PT0gJ2F1dG8nID8gZ2V0Um91bmRSZWN0YW5nbGVSYWRpdXMod2lkdGgsIGhlaWdodCkgOiByYWRpdXM7XG4gIGlmIChjb250ZXh0LmJlZ2luUGF0aCkge1xuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gIH1cblxuICAvLyBTdGFydCBhdCB0b3AgbWlkZGxlXG4gIGNvbnRleHQubW92ZVRvKHgsIHkgLSBoYWxmSGVpZ2h0KTtcbiAgY29udGV4dC5saW5lVG8oeCArIGhhbGZXaWR0aCwgeSAtIGhhbGZIZWlnaHQpO1xuICBjb250ZXh0LmxpbmVUbyh4ICsgaGFsZldpZHRoLCB5KTtcbiAgY29udGV4dC5hcmNUbyh4ICsgaGFsZldpZHRoLCB5ICsgaGFsZkhlaWdodCwgeCwgeSArIGhhbGZIZWlnaHQsIGNvcm5lclJhZGl1cyk7XG4gIGNvbnRleHQuYXJjVG8oeCAtIGhhbGZXaWR0aCwgeSArIGhhbGZIZWlnaHQsIHggLSBoYWxmV2lkdGgsIHksIGNvcm5lclJhZGl1cyk7XG4gIGNvbnRleHQubGluZVRvKHggLSBoYWxmV2lkdGgsIHkgLSBoYWxmSGVpZ2h0KTtcbiAgY29udGV4dC5saW5lVG8oeCwgeSAtIGhhbGZIZWlnaHQpO1xuICBjb250ZXh0LmNsb3NlUGF0aCgpO1xufTtcbkNScCQzLmRyYXdDdXRSZWN0YW5nbGVQYXRoID0gZnVuY3Rpb24gKGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIHBvaW50cywgY29ybmVycykge1xuICB2YXIgaGFsZldpZHRoID0gd2lkdGggLyAyO1xuICB2YXIgaGFsZkhlaWdodCA9IGhlaWdodCAvIDI7XG4gIHZhciBjb3JuZXJMZW5ndGggPSBjb3JuZXJzID09PSAnYXV0bycgPyBnZXRDdXRSZWN0YW5nbGVDb3JuZXJMZW5ndGgoKSA6IGNvcm5lcnM7XG4gIGlmIChjb250ZXh0LmJlZ2luUGF0aCkge1xuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gIH1cbiAgY29udGV4dC5tb3ZlVG8oeCAtIGhhbGZXaWR0aCArIGNvcm5lckxlbmd0aCwgeSAtIGhhbGZIZWlnaHQpO1xuICBjb250ZXh0LmxpbmVUbyh4ICsgaGFsZldpZHRoIC0gY29ybmVyTGVuZ3RoLCB5IC0gaGFsZkhlaWdodCk7XG4gIGNvbnRleHQubGluZVRvKHggKyBoYWxmV2lkdGgsIHkgLSBoYWxmSGVpZ2h0ICsgY29ybmVyTGVuZ3RoKTtcbiAgY29udGV4dC5saW5lVG8oeCArIGhhbGZXaWR0aCwgeSArIGhhbGZIZWlnaHQgLSBjb3JuZXJMZW5ndGgpO1xuICBjb250ZXh0LmxpbmVUbyh4ICsgaGFsZldpZHRoIC0gY29ybmVyTGVuZ3RoLCB5ICsgaGFsZkhlaWdodCk7XG4gIGNvbnRleHQubGluZVRvKHggLSBoYWxmV2lkdGggKyBjb3JuZXJMZW5ndGgsIHkgKyBoYWxmSGVpZ2h0KTtcbiAgY29udGV4dC5saW5lVG8oeCAtIGhhbGZXaWR0aCwgeSArIGhhbGZIZWlnaHQgLSBjb3JuZXJMZW5ndGgpO1xuICBjb250ZXh0LmxpbmVUbyh4IC0gaGFsZldpZHRoLCB5IC0gaGFsZkhlaWdodCArIGNvcm5lckxlbmd0aCk7XG4gIGNvbnRleHQuY2xvc2VQYXRoKCk7XG59O1xuQ1JwJDMuZHJhd0JhcnJlbFBhdGggPSBmdW5jdGlvbiAoY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCkge1xuICB2YXIgaGFsZldpZHRoID0gd2lkdGggLyAyO1xuICB2YXIgaGFsZkhlaWdodCA9IGhlaWdodCAvIDI7XG4gIHZhciB4QmVnaW4gPSB4IC0gaGFsZldpZHRoO1xuICB2YXIgeEVuZCA9IHggKyBoYWxmV2lkdGg7XG4gIHZhciB5QmVnaW4gPSB5IC0gaGFsZkhlaWdodDtcbiAgdmFyIHlFbmQgPSB5ICsgaGFsZkhlaWdodDtcbiAgdmFyIGJhcnJlbEN1cnZlQ29uc3RhbnRzID0gZ2V0QmFycmVsQ3VydmVDb25zdGFudHMod2lkdGgsIGhlaWdodCk7XG4gIHZhciB3T2Zmc2V0ID0gYmFycmVsQ3VydmVDb25zdGFudHMud2lkdGhPZmZzZXQ7XG4gIHZhciBoT2Zmc2V0ID0gYmFycmVsQ3VydmVDb25zdGFudHMuaGVpZ2h0T2Zmc2V0O1xuICB2YXIgY3RybFB0WE9mZnNldCA9IGJhcnJlbEN1cnZlQ29uc3RhbnRzLmN0cmxQdE9mZnNldFBjdCAqIHdPZmZzZXQ7XG4gIGlmIChjb250ZXh0LmJlZ2luUGF0aCkge1xuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gIH1cbiAgY29udGV4dC5tb3ZlVG8oeEJlZ2luLCB5QmVnaW4gKyBoT2Zmc2V0KTtcbiAgY29udGV4dC5saW5lVG8oeEJlZ2luLCB5RW5kIC0gaE9mZnNldCk7XG4gIGNvbnRleHQucXVhZHJhdGljQ3VydmVUbyh4QmVnaW4gKyBjdHJsUHRYT2Zmc2V0LCB5RW5kLCB4QmVnaW4gKyB3T2Zmc2V0LCB5RW5kKTtcbiAgY29udGV4dC5saW5lVG8oeEVuZCAtIHdPZmZzZXQsIHlFbmQpO1xuICBjb250ZXh0LnF1YWRyYXRpY0N1cnZlVG8oeEVuZCAtIGN0cmxQdFhPZmZzZXQsIHlFbmQsIHhFbmQsIHlFbmQgLSBoT2Zmc2V0KTtcbiAgY29udGV4dC5saW5lVG8oeEVuZCwgeUJlZ2luICsgaE9mZnNldCk7XG4gIGNvbnRleHQucXVhZHJhdGljQ3VydmVUbyh4RW5kIC0gY3RybFB0WE9mZnNldCwgeUJlZ2luLCB4RW5kIC0gd09mZnNldCwgeUJlZ2luKTtcbiAgY29udGV4dC5saW5lVG8oeEJlZ2luICsgd09mZnNldCwgeUJlZ2luKTtcbiAgY29udGV4dC5xdWFkcmF0aWNDdXJ2ZVRvKHhCZWdpbiArIGN0cmxQdFhPZmZzZXQsIHlCZWdpbiwgeEJlZ2luLCB5QmVnaW4gKyBoT2Zmc2V0KTtcbiAgY29udGV4dC5jbG9zZVBhdGgoKTtcbn07XG52YXIgc2luMCA9IE1hdGguc2luKDApO1xudmFyIGNvczAgPSBNYXRoLmNvcygwKTtcbnZhciBzaW4gPSB7fTtcbnZhciBjb3MgPSB7fTtcbnZhciBlbGxpcHNlU3RlcFNpemUgPSBNYXRoLlBJIC8gNDA7XG5mb3IgKHZhciBpID0gMCAqIE1hdGguUEk7IGkgPCAyICogTWF0aC5QSTsgaSArPSBlbGxpcHNlU3RlcFNpemUpIHtcbiAgc2luW2ldID0gTWF0aC5zaW4oaSk7XG4gIGNvc1tpXSA9IE1hdGguY29zKGkpO1xufVxuQ1JwJDMuZHJhd0VsbGlwc2VQYXRoID0gZnVuY3Rpb24gKGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQpIHtcbiAgaWYgKGNvbnRleHQuYmVnaW5QYXRoKSB7XG4gICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgfVxuICBpZiAoY29udGV4dC5lbGxpcHNlKSB7XG4gICAgY29udGV4dC5lbGxpcHNlKGNlbnRlclgsIGNlbnRlclksIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMiwgMCwgMCwgMiAqIE1hdGguUEkpO1xuICB9IGVsc2Uge1xuICAgIHZhciB4UG9zLCB5UG9zO1xuICAgIHZhciBydyA9IHdpZHRoIC8gMjtcbiAgICB2YXIgcmggPSBoZWlnaHQgLyAyO1xuICAgIGZvciAodmFyIGkgPSAwICogTWF0aC5QSTsgaSA8IDIgKiBNYXRoLlBJOyBpICs9IGVsbGlwc2VTdGVwU2l6ZSkge1xuICAgICAgeFBvcyA9IGNlbnRlclggLSBydyAqIHNpbltpXSAqIHNpbjAgKyBydyAqIGNvc1tpXSAqIGNvczA7XG4gICAgICB5UG9zID0gY2VudGVyWSArIHJoICogY29zW2ldICogc2luMCArIHJoICogc2luW2ldICogY29zMDtcbiAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgIGNvbnRleHQubW92ZVRvKHhQb3MsIHlQb3MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGV4dC5saW5lVG8oeFBvcywgeVBvcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbnRleHQuY2xvc2VQYXRoKCk7XG59O1xuXG4vKiBnbG9iYWwgYXRvYiwgQXJyYXlCdWZmZXIsIFVpbnQ4QXJyYXksIEJsb2IgKi9cblxudmFyIENScCQyID0ge307XG5DUnAkMi5jcmVhdGVCdWZmZXIgPSBmdW5jdGlvbiAodywgaCkge1xuICB2YXIgYnVmZmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiAgYnVmZmVyLndpZHRoID0gdztcbiAgYnVmZmVyLmhlaWdodCA9IGg7XG4gIHJldHVybiBbYnVmZmVyLCBidWZmZXIuZ2V0Q29udGV4dCgnMmQnKV07XG59O1xuQ1JwJDIuYnVmZmVyQ2FudmFzSW1hZ2UgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICB2YXIgY3kgPSB0aGlzLmN5O1xuICB2YXIgZWxlcyA9IGN5Lm11dGFibGVFbGVtZW50cygpO1xuICB2YXIgYmIgPSBlbGVzLmJvdW5kaW5nQm94KCk7XG4gIHZhciBjdHJSZWN0ID0gdGhpcy5maW5kQ29udGFpbmVyQ2xpZW50Q29vcmRzKCk7XG4gIHZhciB3aWR0aCA9IG9wdGlvbnMuZnVsbCA/IE1hdGguY2VpbChiYi53KSA6IGN0clJlY3RbMl07XG4gIHZhciBoZWlnaHQgPSBvcHRpb25zLmZ1bGwgPyBNYXRoLmNlaWwoYmIuaCkgOiBjdHJSZWN0WzNdO1xuICB2YXIgc3BlY2RNYXhEaW1zID0gbnVtYmVyJDEob3B0aW9ucy5tYXhXaWR0aCkgfHwgbnVtYmVyJDEob3B0aW9ucy5tYXhIZWlnaHQpO1xuICB2YXIgcHhSYXRpbyA9IHRoaXMuZ2V0UGl4ZWxSYXRpbygpO1xuICB2YXIgc2NhbGUgPSAxO1xuICBpZiAob3B0aW9ucy5zY2FsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgd2lkdGggKj0gb3B0aW9ucy5zY2FsZTtcbiAgICBoZWlnaHQgKj0gb3B0aW9ucy5zY2FsZTtcbiAgICBzY2FsZSA9IG9wdGlvbnMuc2NhbGU7XG4gIH0gZWxzZSBpZiAoc3BlY2RNYXhEaW1zKSB7XG4gICAgdmFyIG1heFNjYWxlVyA9IEluZmluaXR5O1xuICAgIHZhciBtYXhTY2FsZUggPSBJbmZpbml0eTtcbiAgICBpZiAobnVtYmVyJDEob3B0aW9ucy5tYXhXaWR0aCkpIHtcbiAgICAgIG1heFNjYWxlVyA9IHNjYWxlICogb3B0aW9ucy5tYXhXaWR0aCAvIHdpZHRoO1xuICAgIH1cbiAgICBpZiAobnVtYmVyJDEob3B0aW9ucy5tYXhIZWlnaHQpKSB7XG4gICAgICBtYXhTY2FsZUggPSBzY2FsZSAqIG9wdGlvbnMubWF4SGVpZ2h0IC8gaGVpZ2h0O1xuICAgIH1cbiAgICBzY2FsZSA9IE1hdGgubWluKG1heFNjYWxlVywgbWF4U2NhbGVIKTtcbiAgICB3aWR0aCAqPSBzY2FsZTtcbiAgICBoZWlnaHQgKj0gc2NhbGU7XG4gIH1cbiAgaWYgKCFzcGVjZE1heERpbXMpIHtcbiAgICB3aWR0aCAqPSBweFJhdGlvO1xuICAgIGhlaWdodCAqPSBweFJhdGlvO1xuICAgIHNjYWxlICo9IHB4UmF0aW87XG4gIH1cbiAgdmFyIGJ1ZmZDYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuXG4gIGJ1ZmZDYW52YXMud2lkdGggPSB3aWR0aDtcbiAgYnVmZkNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gIGJ1ZmZDYW52YXMuc3R5bGUud2lkdGggPSB3aWR0aCArICdweCc7XG4gIGJ1ZmZDYW52YXMuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JztcbiAgdmFyIGJ1ZmZDeHQgPSBidWZmQ2FudmFzLmdldENvbnRleHQoJzJkJyk7XG5cbiAgLy8gUmFzdGVyaXplIHRoZSBsYXllcnMsIGJ1dCBvbmx5IGlmIGNvbnRhaW5lciBoYXMgbm9uemVybyBzaXplXG4gIGlmICh3aWR0aCA+IDAgJiYgaGVpZ2h0ID4gMCkge1xuICAgIGJ1ZmZDeHQuY2xlYXJSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgIGJ1ZmZDeHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ3NvdXJjZS1vdmVyJztcbiAgICB2YXIgenNvcnRlZEVsZXMgPSB0aGlzLmdldENhY2hlZFpTb3J0ZWRFbGVzKCk7XG4gICAgaWYgKG9wdGlvbnMuZnVsbCkge1xuICAgICAgLy8gZHJhdyB0aGUgZnVsbCBib3VuZHMgb2YgdGhlIGdyYXBoXG4gICAgICBidWZmQ3h0LnRyYW5zbGF0ZSgtYmIueDEgKiBzY2FsZSwgLWJiLnkxICogc2NhbGUpO1xuICAgICAgYnVmZkN4dC5zY2FsZShzY2FsZSwgc2NhbGUpO1xuICAgICAgdGhpcy5kcmF3RWxlbWVudHMoYnVmZkN4dCwgenNvcnRlZEVsZXMpO1xuICAgICAgYnVmZkN4dC5zY2FsZSgxIC8gc2NhbGUsIDEgLyBzY2FsZSk7XG4gICAgICBidWZmQ3h0LnRyYW5zbGF0ZShiYi54MSAqIHNjYWxlLCBiYi55MSAqIHNjYWxlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZHJhdyB0aGUgY3VycmVudCB2aWV3XG4gICAgICB2YXIgcGFuID0gY3kucGFuKCk7XG4gICAgICB2YXIgdHJhbnNsYXRpb24gPSB7XG4gICAgICAgIHg6IHBhbi54ICogc2NhbGUsXG4gICAgICAgIHk6IHBhbi55ICogc2NhbGVcbiAgICAgIH07XG4gICAgICBzY2FsZSAqPSBjeS56b29tKCk7XG4gICAgICBidWZmQ3h0LnRyYW5zbGF0ZSh0cmFuc2xhdGlvbi54LCB0cmFuc2xhdGlvbi55KTtcbiAgICAgIGJ1ZmZDeHQuc2NhbGUoc2NhbGUsIHNjYWxlKTtcbiAgICAgIHRoaXMuZHJhd0VsZW1lbnRzKGJ1ZmZDeHQsIHpzb3J0ZWRFbGVzKTtcbiAgICAgIGJ1ZmZDeHQuc2NhbGUoMSAvIHNjYWxlLCAxIC8gc2NhbGUpO1xuICAgICAgYnVmZkN4dC50cmFuc2xhdGUoLXRyYW5zbGF0aW9uLngsIC10cmFuc2xhdGlvbi55KTtcbiAgICB9XG5cbiAgICAvLyBuZWVkIHRvIGZpbGwgYmcgYXQgZW5kIGxpa2UgdGhpcyBpbiBvcmRlciB0byBmaWxsIGNsZWFyZWQgdHJhbnNwYXJlbnQgcGl4ZWxzIGluIGpwZ3NcbiAgICBpZiAob3B0aW9ucy5iZykge1xuICAgICAgYnVmZkN4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAnZGVzdGluYXRpb24tb3Zlcic7XG4gICAgICBidWZmQ3h0LmZpbGxTdHlsZSA9IG9wdGlvbnMuYmc7XG4gICAgICBidWZmQ3h0LnJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICBidWZmQ3h0LmZpbGwoKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGJ1ZmZDYW52YXM7XG59O1xuZnVuY3Rpb24gYjY0VG9CbG9iKGI2NCwgbWltZVR5cGUpIHtcbiAgdmFyIGJ5dGVzID0gYXRvYihiNjQpO1xuICB2YXIgYnVmZiA9IG5ldyBBcnJheUJ1ZmZlcihieXRlcy5sZW5ndGgpO1xuICB2YXIgYnVmZlVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkoYnVmZik7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICBidWZmVWludDhbaV0gPSBieXRlcy5jaGFyQ29kZUF0KGkpO1xuICB9XG4gIHJldHVybiBuZXcgQmxvYihbYnVmZl0sIHtcbiAgICB0eXBlOiBtaW1lVHlwZVxuICB9KTtcbn1cbmZ1bmN0aW9uIGI2NFVyaVRvQjY0KGI2NHVyaSkge1xuICB2YXIgaSA9IGI2NHVyaS5pbmRleE9mKCcsJyk7XG4gIHJldHVybiBiNjR1cmkuc3Vic3RyKGkgKyAxKTtcbn1cbmZ1bmN0aW9uIG91dHB1dChvcHRpb25zLCBjYW52YXMsIG1pbWVUeXBlKSB7XG4gIHZhciBnZXRCNjRVcmkgPSBmdW5jdGlvbiBnZXRCNjRVcmkoKSB7XG4gICAgcmV0dXJuIGNhbnZhcy50b0RhdGFVUkwobWltZVR5cGUsIG9wdGlvbnMucXVhbGl0eSk7XG4gIH07XG4gIHN3aXRjaCAob3B0aW9ucy5vdXRwdXQpIHtcbiAgICBjYXNlICdibG9iLXByb21pc2UnOlxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlJDEoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNhbnZhcy50b0Jsb2IoZnVuY3Rpb24gKGJsb2IpIHtcbiAgICAgICAgICAgIGlmIChibG9iICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZShibG9iKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ2BjYW52YXMudG9CbG9iKClgIHNlbnQgYSBudWxsIHZhbHVlIGluIGl0cyBjYWxsYmFjaycpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCBtaW1lVHlwZSwgb3B0aW9ucy5xdWFsaXR5KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIGNhc2UgJ2Jsb2InOlxuICAgICAgcmV0dXJuIGI2NFRvQmxvYihiNjRVcmlUb0I2NChnZXRCNjRVcmkoKSksIG1pbWVUeXBlKTtcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgcmV0dXJuIGI2NFVyaVRvQjY0KGdldEI2NFVyaSgpKTtcbiAgICBjYXNlICdiYXNlNjR1cmknOlxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZ2V0QjY0VXJpKCk7XG4gIH1cbn1cbkNScCQyLnBuZyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIHJldHVybiBvdXRwdXQob3B0aW9ucywgdGhpcy5idWZmZXJDYW52YXNJbWFnZShvcHRpb25zKSwgJ2ltYWdlL3BuZycpO1xufTtcbkNScCQyLmpwZyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIHJldHVybiBvdXRwdXQob3B0aW9ucywgdGhpcy5idWZmZXJDYW52YXNJbWFnZShvcHRpb25zKSwgJ2ltYWdlL2pwZWcnKTtcbn07XG5cbnZhciBDUnAkMSA9IHt9O1xuQ1JwJDEubm9kZVNoYXBlSW1wbCA9IGZ1bmN0aW9uIChuYW1lLCBjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBwb2ludHMsIGNvcm5lcnMpIHtcbiAgc3dpdGNoIChuYW1lKSB7XG4gICAgY2FzZSAnZWxsaXBzZSc6XG4gICAgICByZXR1cm4gdGhpcy5kcmF3RWxsaXBzZVBhdGgoY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCk7XG4gICAgY2FzZSAncG9seWdvbic6XG4gICAgICByZXR1cm4gdGhpcy5kcmF3UG9seWdvblBhdGgoY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgcG9pbnRzKTtcbiAgICBjYXNlICdyb3VuZC1wb2x5Z29uJzpcbiAgICAgIHJldHVybiB0aGlzLmRyYXdSb3VuZFBvbHlnb25QYXRoKGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHBvaW50cywgY29ybmVycyk7XG4gICAgY2FzZSAncm91bmRyZWN0YW5nbGUnOlxuICAgIGNhc2UgJ3JvdW5kLXJlY3RhbmdsZSc6XG4gICAgICByZXR1cm4gdGhpcy5kcmF3Um91bmRSZWN0YW5nbGVQYXRoKGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIGNvcm5lcnMpO1xuICAgIGNhc2UgJ2N1dHJlY3RhbmdsZSc6XG4gICAgY2FzZSAnY3V0LXJlY3RhbmdsZSc6XG4gICAgICByZXR1cm4gdGhpcy5kcmF3Q3V0UmVjdGFuZ2xlUGF0aChjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBwb2ludHMsIGNvcm5lcnMpO1xuICAgIGNhc2UgJ2JvdHRvbXJvdW5kcmVjdGFuZ2xlJzpcbiAgICBjYXNlICdib3R0b20tcm91bmQtcmVjdGFuZ2xlJzpcbiAgICAgIHJldHVybiB0aGlzLmRyYXdCb3R0b21Sb3VuZFJlY3RhbmdsZVBhdGgoY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgY29ybmVycyk7XG4gICAgY2FzZSAnYmFycmVsJzpcbiAgICAgIHJldHVybiB0aGlzLmRyYXdCYXJyZWxQYXRoKGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQpO1xuICB9XG59O1xuXG52YXIgQ1IgPSBDYW52YXNSZW5kZXJlcjtcbnZhciBDUnAgPSBDYW52YXNSZW5kZXJlci5wcm90b3R5cGU7XG5DUnAuQ0FOVkFTX0xBWUVSUyA9IDM7XG4vL1xuQ1JwLlNFTEVDVF9CT1ggPSAwO1xuQ1JwLkRSQUcgPSAxO1xuQ1JwLk5PREUgPSAyO1xuQ1JwLldFQkdMID0gMztcbkNScC5DQU5WQVNfVFlQRVMgPSBbJzJkJywgJzJkJywgJzJkJywgJ3dlYmdsMiddO1xuQ1JwLkJVRkZFUl9DT1VOVCA9IDM7XG4vL1xuQ1JwLlRFWFRVUkVfQlVGRkVSID0gMDtcbkNScC5NT1RJT05CTFVSX0JVRkZFUl9OT0RFID0gMTtcbkNScC5NT1RJT05CTFVSX0JVRkZFUl9EUkFHID0gMjtcbmZ1bmN0aW9uIENhbnZhc1JlbmRlcmVyKG9wdGlvbnMpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgY29udGFpbmVyV2luZG93ID0gci5jeS53aW5kb3coKTtcbiAgdmFyIGRvY3VtZW50ID0gY29udGFpbmVyV2luZG93LmRvY3VtZW50O1xuICBpZiAob3B0aW9ucy53ZWJnbCkge1xuICAgIENScC5DQU5WQVNfTEFZRVJTID0gci5DQU5WQVNfTEFZRVJTID0gNDtcbiAgICBjb25zb2xlLmxvZygnd2ViZ2wgcmVuZGVyaW5nIGVuYWJsZWQnKTtcbiAgfVxuICByLmRhdGEgPSB7XG4gICAgY2FudmFzZXM6IG5ldyBBcnJheShDUnAuQ0FOVkFTX0xBWUVSUyksXG4gICAgY29udGV4dHM6IG5ldyBBcnJheShDUnAuQ0FOVkFTX0xBWUVSUyksXG4gICAgY2FudmFzTmVlZHNSZWRyYXc6IG5ldyBBcnJheShDUnAuQ0FOVkFTX0xBWUVSUyksXG4gICAgYnVmZmVyQ2FudmFzZXM6IG5ldyBBcnJheShDUnAuQlVGRkVSX0NPVU5UKSxcbiAgICBidWZmZXJDb250ZXh0czogbmV3IEFycmF5KENScC5DQU5WQVNfTEFZRVJTKVxuICB9O1xuICB2YXIgdGFwSGxPZmZBdHRyID0gJy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcic7XG4gIHZhciB0YXBIbE9mZlN0eWxlID0gJ3JnYmEoMCwwLDAsMCknO1xuICByLmRhdGEuY2FudmFzQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiAgdmFyIGNvbnRhaW5lclN0eWxlID0gci5kYXRhLmNhbnZhc0NvbnRhaW5lci5zdHlsZTtcbiAgci5kYXRhLmNhbnZhc0NvbnRhaW5lci5zdHlsZVt0YXBIbE9mZkF0dHJdID0gdGFwSGxPZmZTdHlsZTtcbiAgY29udGFpbmVyU3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xuICBjb250YWluZXJTdHlsZS56SW5kZXggPSAnMCc7XG4gIGNvbnRhaW5lclN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XG4gIHZhciBjb250YWluZXIgPSBvcHRpb25zLmN5LmNvbnRhaW5lcigpO1xuICBjb250YWluZXIuYXBwZW5kQ2hpbGQoci5kYXRhLmNhbnZhc0NvbnRhaW5lcik7XG4gIGNvbnRhaW5lci5zdHlsZVt0YXBIbE9mZkF0dHJdID0gdGFwSGxPZmZTdHlsZTtcbiAgdmFyIHN0eWxlTWFwID0ge1xuICAgICctd2Via2l0LXVzZXItc2VsZWN0JzogJ25vbmUnLFxuICAgICctbW96LXVzZXItc2VsZWN0JzogJy1tb3otbm9uZScsXG4gICAgJ3VzZXItc2VsZWN0JzogJ25vbmUnLFxuICAgICctd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3InOiAncmdiYSgwLDAsMCwwKScsXG4gICAgJ291dGxpbmUtc3R5bGUnOiAnbm9uZSdcbiAgfTtcbiAgaWYgKG1zKCkpIHtcbiAgICBzdHlsZU1hcFsnLW1zLXRvdWNoLWFjdGlvbiddID0gJ25vbmUnO1xuICAgIHN0eWxlTWFwWyd0b3VjaC1hY3Rpb24nXSA9ICdub25lJztcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IENScC5DQU5WQVNfTEFZRVJTOyBpKyspIHtcbiAgICB2YXIgY2FudmFzID0gci5kYXRhLmNhbnZhc2VzW2ldID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiAgICB2YXIgdHlwZSA9IENScC5DQU5WQVNfVFlQRVNbaV07XG4gICAgci5kYXRhLmNvbnRleHRzW2ldID0gY2FudmFzLmdldENvbnRleHQodHlwZSk7XG4gICAgaWYgKCFyLmRhdGEuY29udGV4dHNbaV0pIHtcbiAgICAgIGVycm9yKCdDb3VsZCBub3QgY3JlYXRlIGNhbnZhcyBvZiB0eXBlICcgKyB0eXBlKTtcbiAgICB9XG4gICAgT2JqZWN0LmtleXMoc3R5bGVNYXApLmZvckVhY2goZnVuY3Rpb24gKGspIHtcbiAgICAgIGNhbnZhcy5zdHlsZVtrXSA9IHN0eWxlTWFwW2tdO1xuICAgIH0pO1xuICAgIGNhbnZhcy5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgY2FudmFzLnNldEF0dHJpYnV0ZSgnZGF0YS1pZCcsICdsYXllcicgKyBpKTtcbiAgICBjYW52YXMuc3R5bGUuekluZGV4ID0gU3RyaW5nKENScC5DQU5WQVNfTEFZRVJTIC0gaSk7XG4gICAgci5kYXRhLmNhbnZhc0NvbnRhaW5lci5hcHBlbmRDaGlsZChjYW52YXMpO1xuICAgIHIuZGF0YS5jYW52YXNOZWVkc1JlZHJhd1tpXSA9IGZhbHNlO1xuICB9XG4gIHIuZGF0YS50b3BDYW52YXMgPSByLmRhdGEuY2FudmFzZXNbMF07XG4gIHIuZGF0YS5jYW52YXNlc1tDUnAuTk9ERV0uc2V0QXR0cmlidXRlKCdkYXRhLWlkJywgJ2xheWVyJyArIENScC5OT0RFICsgJy1ub2RlJyk7XG4gIHIuZGF0YS5jYW52YXNlc1tDUnAuU0VMRUNUX0JPWF0uc2V0QXR0cmlidXRlKCdkYXRhLWlkJywgJ2xheWVyJyArIENScC5TRUxFQ1RfQk9YICsgJy1zZWxlY3Rib3gnKTtcbiAgci5kYXRhLmNhbnZhc2VzW0NScC5EUkFHXS5zZXRBdHRyaWJ1dGUoJ2RhdGEtaWQnLCAnbGF5ZXInICsgQ1JwLkRSQUcgKyAnLWRyYWcnKTtcbiAgaWYgKHIuZGF0YS5jYW52YXNlc1tDUnAuV0VCR0xdKSB7XG4gICAgci5kYXRhLmNhbnZhc2VzW0NScC5XRUJHTF0uc2V0QXR0cmlidXRlKCdkYXRhLWlkJywgJ2xheWVyJyArIENScC5XRUJHTCArICctd2ViZ2wnKTtcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IENScC5CVUZGRVJfQ09VTlQ7IGkrKykge1xuICAgIHIuZGF0YS5idWZmZXJDYW52YXNlc1tpXSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4gICAgci5kYXRhLmJ1ZmZlckNvbnRleHRzW2ldID0gci5kYXRhLmJ1ZmZlckNhbnZhc2VzW2ldLmdldENvbnRleHQoJzJkJyk7XG4gICAgci5kYXRhLmJ1ZmZlckNhbnZhc2VzW2ldLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICByLmRhdGEuYnVmZmVyQ2FudmFzZXNbaV0uc2V0QXR0cmlidXRlKCdkYXRhLWlkJywgJ2J1ZmZlcicgKyBpKTtcbiAgICByLmRhdGEuYnVmZmVyQ2FudmFzZXNbaV0uc3R5bGUuekluZGV4ID0gU3RyaW5nKC1pIC0gMSk7XG4gICAgci5kYXRhLmJ1ZmZlckNhbnZhc2VzW2ldLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAvL3IuZGF0YS5jYW52YXNDb250YWluZXIuYXBwZW5kQ2hpbGQoci5kYXRhLmJ1ZmZlckNhbnZhc2VzW2ldKTtcbiAgfVxuICByLnBhdGhzRW5hYmxlZCA9IHRydWU7XG4gIHZhciBlbXB0eUJiID0gbWFrZUJvdW5kaW5nQm94KCk7XG4gIHZhciBnZXRCb3hDZW50ZXIgPSBmdW5jdGlvbiBnZXRCb3hDZW50ZXIoYmIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgeDogKGJiLngxICsgYmIueDIpIC8gMixcbiAgICAgIHk6IChiYi55MSArIGJiLnkyKSAvIDJcbiAgICB9O1xuICB9O1xuICB2YXIgZ2V0Q2VudGVyT2Zmc2V0ID0gZnVuY3Rpb24gZ2V0Q2VudGVyT2Zmc2V0KGJiKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IC1iYi53IC8gMixcbiAgICAgIHk6IC1iYi5oIC8gMlxuICAgIH07XG4gIH07XG4gIHZhciBiYWNrZ3JvdW5kVGltZXN0YW1wSGFzQ2hhbmdlZCA9IGZ1bmN0aW9uIGJhY2tncm91bmRUaW1lc3RhbXBIYXNDaGFuZ2VkKGVsZSkge1xuICAgIHZhciBfcCA9IGVsZVswXS5fcHJpdmF0ZTtcbiAgICB2YXIgc2FtZSA9IF9wLm9sZEJhY2tncm91bmRUaW1lc3RhbXAgPT09IF9wLmJhY2tncm91bmRUaW1lc3RhbXA7XG4gICAgcmV0dXJuICFzYW1lO1xuICB9O1xuICB2YXIgZ2V0U3R5bGVLZXkgPSBmdW5jdGlvbiBnZXRTdHlsZUtleShlbGUpIHtcbiAgICByZXR1cm4gZWxlWzBdLl9wcml2YXRlLm5vZGVLZXk7XG4gIH07XG4gIHZhciBnZXRMYWJlbEtleSA9IGZ1bmN0aW9uIGdldExhYmVsS2V5KGVsZSkge1xuICAgIHJldHVybiBlbGVbMF0uX3ByaXZhdGUubGFiZWxTdHlsZUtleTtcbiAgfTtcbiAgdmFyIGdldFNvdXJjZUxhYmVsS2V5ID0gZnVuY3Rpb24gZ2V0U291cmNlTGFiZWxLZXkoZWxlKSB7XG4gICAgcmV0dXJuIGVsZVswXS5fcHJpdmF0ZS5zb3VyY2VMYWJlbFN0eWxlS2V5O1xuICB9O1xuICB2YXIgZ2V0VGFyZ2V0TGFiZWxLZXkgPSBmdW5jdGlvbiBnZXRUYXJnZXRMYWJlbEtleShlbGUpIHtcbiAgICByZXR1cm4gZWxlWzBdLl9wcml2YXRlLnRhcmdldExhYmVsU3R5bGVLZXk7XG4gIH07XG4gIHZhciBkcmF3RWxlbWVudCA9IGZ1bmN0aW9uIGRyYXdFbGVtZW50KGNvbnRleHQsIGVsZSwgYmIsIHNjYWxlZExhYmVsU2hvd24sIHVzZUVsZU9wYWNpdHkpIHtcbiAgICByZXR1cm4gci5kcmF3RWxlbWVudChjb250ZXh0LCBlbGUsIGJiLCBmYWxzZSwgZmFsc2UsIHVzZUVsZU9wYWNpdHkpO1xuICB9O1xuICB2YXIgZHJhd0xhYmVsID0gZnVuY3Rpb24gZHJhd0xhYmVsKGNvbnRleHQsIGVsZSwgYmIsIHNjYWxlZExhYmVsU2hvd24sIHVzZUVsZU9wYWNpdHkpIHtcbiAgICByZXR1cm4gci5kcmF3RWxlbWVudFRleHQoY29udGV4dCwgZWxlLCBiYiwgc2NhbGVkTGFiZWxTaG93biwgJ21haW4nLCB1c2VFbGVPcGFjaXR5KTtcbiAgfTtcbiAgdmFyIGRyYXdTb3VyY2VMYWJlbCA9IGZ1bmN0aW9uIGRyYXdTb3VyY2VMYWJlbChjb250ZXh0LCBlbGUsIGJiLCBzY2FsZWRMYWJlbFNob3duLCB1c2VFbGVPcGFjaXR5KSB7XG4gICAgcmV0dXJuIHIuZHJhd0VsZW1lbnRUZXh0KGNvbnRleHQsIGVsZSwgYmIsIHNjYWxlZExhYmVsU2hvd24sICdzb3VyY2UnLCB1c2VFbGVPcGFjaXR5KTtcbiAgfTtcbiAgdmFyIGRyYXdUYXJnZXRMYWJlbCA9IGZ1bmN0aW9uIGRyYXdUYXJnZXRMYWJlbChjb250ZXh0LCBlbGUsIGJiLCBzY2FsZWRMYWJlbFNob3duLCB1c2VFbGVPcGFjaXR5KSB7XG4gICAgcmV0dXJuIHIuZHJhd0VsZW1lbnRUZXh0KGNvbnRleHQsIGVsZSwgYmIsIHNjYWxlZExhYmVsU2hvd24sICd0YXJnZXQnLCB1c2VFbGVPcGFjaXR5KTtcbiAgfTtcbiAgdmFyIGdldEVsZW1lbnRCb3ggPSBmdW5jdGlvbiBnZXRFbGVtZW50Qm94KGVsZSkge1xuICAgIGVsZS5ib3VuZGluZ0JveCgpO1xuICAgIHJldHVybiBlbGVbMF0uX3ByaXZhdGUuYm9keUJvdW5kcztcbiAgfTtcbiAgdmFyIGdldExhYmVsQm94ID0gZnVuY3Rpb24gZ2V0TGFiZWxCb3goZWxlKSB7XG4gICAgZWxlLmJvdW5kaW5nQm94KCk7XG4gICAgcmV0dXJuIGVsZVswXS5fcHJpdmF0ZS5sYWJlbEJvdW5kcy5tYWluIHx8IGVtcHR5QmI7XG4gIH07XG4gIHZhciBnZXRTb3VyY2VMYWJlbEJveCA9IGZ1bmN0aW9uIGdldFNvdXJjZUxhYmVsQm94KGVsZSkge1xuICAgIGVsZS5ib3VuZGluZ0JveCgpO1xuICAgIHJldHVybiBlbGVbMF0uX3ByaXZhdGUubGFiZWxCb3VuZHMuc291cmNlIHx8IGVtcHR5QmI7XG4gIH07XG4gIHZhciBnZXRUYXJnZXRMYWJlbEJveCA9IGZ1bmN0aW9uIGdldFRhcmdldExhYmVsQm94KGVsZSkge1xuICAgIGVsZS5ib3VuZGluZ0JveCgpO1xuICAgIHJldHVybiBlbGVbMF0uX3ByaXZhdGUubGFiZWxCb3VuZHMudGFyZ2V0IHx8IGVtcHR5QmI7XG4gIH07XG4gIHZhciBpc0xhYmVsVmlzaWJsZUF0U2NhbGUgPSBmdW5jdGlvbiBpc0xhYmVsVmlzaWJsZUF0U2NhbGUoZWxlLCBzY2FsZWRMYWJlbFNob3duKSB7XG4gICAgcmV0dXJuIHNjYWxlZExhYmVsU2hvd247XG4gIH07XG4gIHZhciBnZXRFbGVtZW50Um90YXRpb25Qb2ludCA9IGZ1bmN0aW9uIGdldEVsZW1lbnRSb3RhdGlvblBvaW50KGVsZSkge1xuICAgIHJldHVybiBnZXRCb3hDZW50ZXIoZ2V0RWxlbWVudEJveChlbGUpKTtcbiAgfTtcbiAgdmFyIGFkZFRleHRNYXJnaW4gPSBmdW5jdGlvbiBhZGRUZXh0TWFyZ2luKHByZWZpeCwgcHQsIGVsZSkge1xuICAgIHZhciBwcmUgPSBwcmVmaXggPyBwcmVmaXggKyAnLScgOiAnJztcbiAgICByZXR1cm4ge1xuICAgICAgeDogcHQueCArIGVsZS5wc3R5bGUocHJlICsgJ3RleHQtbWFyZ2luLXgnKS5wZlZhbHVlLFxuICAgICAgeTogcHQueSArIGVsZS5wc3R5bGUocHJlICsgJ3RleHQtbWFyZ2luLXknKS5wZlZhbHVlXG4gICAgfTtcbiAgfTtcbiAgdmFyIGdldFJzUHQgPSBmdW5jdGlvbiBnZXRSc1B0KGVsZSwgeCwgeSkge1xuICAgIHZhciBycyA9IGVsZVswXS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgICByZXR1cm4ge1xuICAgICAgeDogcnNbeF0sXG4gICAgICB5OiByc1t5XVxuICAgIH07XG4gIH07XG4gIHZhciBnZXRMYWJlbFJvdGF0aW9uUG9pbnQgPSBmdW5jdGlvbiBnZXRMYWJlbFJvdGF0aW9uUG9pbnQoZWxlKSB7XG4gICAgcmV0dXJuIGFkZFRleHRNYXJnaW4oJycsIGdldFJzUHQoZWxlLCAnbGFiZWxYJywgJ2xhYmVsWScpLCBlbGUpO1xuICB9O1xuICB2YXIgZ2V0U291cmNlTGFiZWxSb3RhdGlvblBvaW50ID0gZnVuY3Rpb24gZ2V0U291cmNlTGFiZWxSb3RhdGlvblBvaW50KGVsZSkge1xuICAgIHJldHVybiBhZGRUZXh0TWFyZ2luKCdzb3VyY2UnLCBnZXRSc1B0KGVsZSwgJ3NvdXJjZUxhYmVsWCcsICdzb3VyY2VMYWJlbFknKSwgZWxlKTtcbiAgfTtcbiAgdmFyIGdldFRhcmdldExhYmVsUm90YXRpb25Qb2ludCA9IGZ1bmN0aW9uIGdldFRhcmdldExhYmVsUm90YXRpb25Qb2ludChlbGUpIHtcbiAgICByZXR1cm4gYWRkVGV4dE1hcmdpbigndGFyZ2V0JywgZ2V0UnNQdChlbGUsICd0YXJnZXRMYWJlbFgnLCAndGFyZ2V0TGFiZWxZJyksIGVsZSk7XG4gIH07XG4gIHZhciBnZXRFbGVtZW50Um90YXRpb25PZmZzZXQgPSBmdW5jdGlvbiBnZXRFbGVtZW50Um90YXRpb25PZmZzZXQoZWxlKSB7XG4gICAgcmV0dXJuIGdldENlbnRlck9mZnNldChnZXRFbGVtZW50Qm94KGVsZSkpO1xuICB9O1xuICB2YXIgZ2V0U291cmNlTGFiZWxSb3RhdGlvbk9mZnNldCA9IGZ1bmN0aW9uIGdldFNvdXJjZUxhYmVsUm90YXRpb25PZmZzZXQoZWxlKSB7XG4gICAgcmV0dXJuIGdldENlbnRlck9mZnNldChnZXRTb3VyY2VMYWJlbEJveChlbGUpKTtcbiAgfTtcbiAgdmFyIGdldFRhcmdldExhYmVsUm90YXRpb25PZmZzZXQgPSBmdW5jdGlvbiBnZXRUYXJnZXRMYWJlbFJvdGF0aW9uT2Zmc2V0KGVsZSkge1xuICAgIHJldHVybiBnZXRDZW50ZXJPZmZzZXQoZ2V0VGFyZ2V0TGFiZWxCb3goZWxlKSk7XG4gIH07XG4gIHZhciBnZXRMYWJlbFJvdGF0aW9uT2Zmc2V0ID0gZnVuY3Rpb24gZ2V0TGFiZWxSb3RhdGlvbk9mZnNldChlbGUpIHtcbiAgICB2YXIgYmIgPSBnZXRMYWJlbEJveChlbGUpO1xuICAgIHZhciBwID0gZ2V0Q2VudGVyT2Zmc2V0KGdldExhYmVsQm94KGVsZSkpO1xuICAgIGlmIChlbGUuaXNOb2RlKCkpIHtcbiAgICAgIHN3aXRjaCAobGFiZWxIYWxpZ24oZWxlLnBzdHlsZSgndGV4dC1oYWxpZ24nKS52YWx1ZSkpIHtcbiAgICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgICAgcC54ID0gLWJiLncgLSAoYmIubGVmdFBhZCB8fCAwKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICAgIHAueCA9IC0oYmIucmlnaHRQYWQgfHwgMCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKGxhYmVsVmFsaWduKGVsZS5wc3R5bGUoJ3RleHQtdmFsaWduJykudmFsdWUpKSB7XG4gICAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgICAgcC55ID0gLWJiLmggLSAoYmIudG9wUGFkIHx8IDApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICAgIHAueSA9IC0oYmIuYm90UGFkIHx8IDApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcDtcbiAgfTtcbiAgdmFyIGVsZVR4ckNhY2hlID0gci5kYXRhLmVsZVR4ckNhY2hlID0gbmV3IEVsZW1lbnRUZXh0dXJlQ2FjaGUociwge1xuICAgIGdldEtleTogZ2V0U3R5bGVLZXksXG4gICAgZG9lc0VsZUludmFsaWRhdGVLZXk6IGJhY2tncm91bmRUaW1lc3RhbXBIYXNDaGFuZ2VkLFxuICAgIGRyYXdFbGVtZW50OiBkcmF3RWxlbWVudCxcbiAgICBnZXRCb3VuZGluZ0JveDogZ2V0RWxlbWVudEJveCxcbiAgICBnZXRSb3RhdGlvblBvaW50OiBnZXRFbGVtZW50Um90YXRpb25Qb2ludCxcbiAgICBnZXRSb3RhdGlvbk9mZnNldDogZ2V0RWxlbWVudFJvdGF0aW9uT2Zmc2V0LFxuICAgIGFsbG93RWRnZVR4ckNhY2hpbmc6IGZhbHNlLFxuICAgIGFsbG93UGFyZW50VHhyQ2FjaGluZzogZmFsc2VcbiAgfSk7XG4gIHZhciBsYmxUeHJDYWNoZSA9IHIuZGF0YS5sYmxUeHJDYWNoZSA9IG5ldyBFbGVtZW50VGV4dHVyZUNhY2hlKHIsIHtcbiAgICBnZXRLZXk6IGdldExhYmVsS2V5LFxuICAgIGRyYXdFbGVtZW50OiBkcmF3TGFiZWwsXG4gICAgZ2V0Qm91bmRpbmdCb3g6IGdldExhYmVsQm94LFxuICAgIGdldFJvdGF0aW9uUG9pbnQ6IGdldExhYmVsUm90YXRpb25Qb2ludCxcbiAgICBnZXRSb3RhdGlvbk9mZnNldDogZ2V0TGFiZWxSb3RhdGlvbk9mZnNldCxcbiAgICBpc1Zpc2libGU6IGlzTGFiZWxWaXNpYmxlQXRTY2FsZVxuICB9KTtcbiAgdmFyIHNsYlR4ckNhY2hlID0gci5kYXRhLnNsYlR4ckNhY2hlID0gbmV3IEVsZW1lbnRUZXh0dXJlQ2FjaGUociwge1xuICAgIGdldEtleTogZ2V0U291cmNlTGFiZWxLZXksXG4gICAgZHJhd0VsZW1lbnQ6IGRyYXdTb3VyY2VMYWJlbCxcbiAgICBnZXRCb3VuZGluZ0JveDogZ2V0U291cmNlTGFiZWxCb3gsXG4gICAgZ2V0Um90YXRpb25Qb2ludDogZ2V0U291cmNlTGFiZWxSb3RhdGlvblBvaW50LFxuICAgIGdldFJvdGF0aW9uT2Zmc2V0OiBnZXRTb3VyY2VMYWJlbFJvdGF0aW9uT2Zmc2V0LFxuICAgIGlzVmlzaWJsZTogaXNMYWJlbFZpc2libGVBdFNjYWxlXG4gIH0pO1xuICB2YXIgdGxiVHhyQ2FjaGUgPSByLmRhdGEudGxiVHhyQ2FjaGUgPSBuZXcgRWxlbWVudFRleHR1cmVDYWNoZShyLCB7XG4gICAgZ2V0S2V5OiBnZXRUYXJnZXRMYWJlbEtleSxcbiAgICBkcmF3RWxlbWVudDogZHJhd1RhcmdldExhYmVsLFxuICAgIGdldEJvdW5kaW5nQm94OiBnZXRUYXJnZXRMYWJlbEJveCxcbiAgICBnZXRSb3RhdGlvblBvaW50OiBnZXRUYXJnZXRMYWJlbFJvdGF0aW9uUG9pbnQsXG4gICAgZ2V0Um90YXRpb25PZmZzZXQ6IGdldFRhcmdldExhYmVsUm90YXRpb25PZmZzZXQsXG4gICAgaXNWaXNpYmxlOiBpc0xhYmVsVmlzaWJsZUF0U2NhbGVcbiAgfSk7XG4gIHZhciBseXJUeHJDYWNoZSA9IHIuZGF0YS5seXJUeHJDYWNoZSA9IG5ldyBMYXllcmVkVGV4dHVyZUNhY2hlKHIpO1xuICByLm9uVXBkYXRlRWxlQ2FsY3MoZnVuY3Rpb24gaW52YWxpZGF0ZVRleHR1cmVDYWNoZXMod2lsbERyYXcsIGVsZXMpIHtcbiAgICAvLyBlYWNoIGNhY2hlIHNob3VsZCBjaGVjayBmb3Igc3ViLWtleSBkaWZmIHRvIHNlZSB0aGF0IHRoZSB1cGRhdGUgYWZmZWN0cyB0aGF0IGNhY2hlIHBhcnRpY3VsYXJseVxuICAgIGVsZVR4ckNhY2hlLmludmFsaWRhdGVFbGVtZW50cyhlbGVzKTtcbiAgICBsYmxUeHJDYWNoZS5pbnZhbGlkYXRlRWxlbWVudHMoZWxlcyk7XG4gICAgc2xiVHhyQ2FjaGUuaW52YWxpZGF0ZUVsZW1lbnRzKGVsZXMpO1xuICAgIHRsYlR4ckNhY2hlLmludmFsaWRhdGVFbGVtZW50cyhlbGVzKTtcblxuICAgIC8vIGFueSBjaGFuZ2UgaW52YWxpZGF0ZXMgdGhlIGxheWVyc1xuICAgIGx5clR4ckNhY2hlLmludmFsaWRhdGVFbGVtZW50cyhlbGVzKTtcblxuICAgIC8vIHVwZGF0ZSB0aGUgb2xkIGJnIHRpbWVzdGFtcCBzbyBkaWZmcyBjYW4gYmUgZG9uZSBpbiB0aGUgZWxlIHR4ciBjYWNoZXNcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgZWxlcy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBfcCA9IGVsZXNbX2ldLl9wcml2YXRlO1xuICAgICAgX3Aub2xkQmFja2dyb3VuZFRpbWVzdGFtcCA9IF9wLmJhY2tncm91bmRUaW1lc3RhbXA7XG4gICAgfVxuICB9KTtcbiAgdmFyIHJlZmluZUluTGF5ZXJzID0gZnVuY3Rpb24gcmVmaW5lSW5MYXllcnMocmVxcykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVxcy5sZW5ndGg7IGkrKykge1xuICAgICAgbHlyVHhyQ2FjaGUuZW5xdWV1ZUVsZW1lbnRSZWZpbmVtZW50KHJlcXNbaV0uZWxlKTtcbiAgICB9XG4gIH07XG4gIGVsZVR4ckNhY2hlLm9uRGVxdWV1ZShyZWZpbmVJbkxheWVycyk7XG4gIGxibFR4ckNhY2hlLm9uRGVxdWV1ZShyZWZpbmVJbkxheWVycyk7XG4gIHNsYlR4ckNhY2hlLm9uRGVxdWV1ZShyZWZpbmVJbkxheWVycyk7XG4gIHRsYlR4ckNhY2hlLm9uRGVxdWV1ZShyZWZpbmVJbkxheWVycyk7XG4gIGlmIChvcHRpb25zLndlYmdsKSB7XG4gICAgci5pbml0V2ViZ2wob3B0aW9ucywge1xuICAgICAgZ2V0U3R5bGVLZXk6IGdldFN0eWxlS2V5LFxuICAgICAgZ2V0TGFiZWxLZXk6IGdldExhYmVsS2V5LFxuICAgICAgZ2V0U291cmNlTGFiZWxLZXk6IGdldFNvdXJjZUxhYmVsS2V5LFxuICAgICAgZ2V0VGFyZ2V0TGFiZWxLZXk6IGdldFRhcmdldExhYmVsS2V5LFxuICAgICAgZHJhd0VsZW1lbnQ6IGRyYXdFbGVtZW50LFxuICAgICAgZHJhd0xhYmVsOiBkcmF3TGFiZWwsXG4gICAgICBkcmF3U291cmNlTGFiZWw6IGRyYXdTb3VyY2VMYWJlbCxcbiAgICAgIGRyYXdUYXJnZXRMYWJlbDogZHJhd1RhcmdldExhYmVsLFxuICAgICAgZ2V0RWxlbWVudEJveDogZ2V0RWxlbWVudEJveCxcbiAgICAgIGdldExhYmVsQm94OiBnZXRMYWJlbEJveCxcbiAgICAgIGdldFNvdXJjZUxhYmVsQm94OiBnZXRTb3VyY2VMYWJlbEJveCxcbiAgICAgIGdldFRhcmdldExhYmVsQm94OiBnZXRUYXJnZXRMYWJlbEJveCxcbiAgICAgIGdldEVsZW1lbnRSb3RhdGlvblBvaW50OiBnZXRFbGVtZW50Um90YXRpb25Qb2ludCxcbiAgICAgIGdldEVsZW1lbnRSb3RhdGlvbk9mZnNldDogZ2V0RWxlbWVudFJvdGF0aW9uT2Zmc2V0LFxuICAgICAgZ2V0TGFiZWxSb3RhdGlvblBvaW50OiBnZXRMYWJlbFJvdGF0aW9uUG9pbnQsXG4gICAgICBnZXRTb3VyY2VMYWJlbFJvdGF0aW9uUG9pbnQ6IGdldFNvdXJjZUxhYmVsUm90YXRpb25Qb2ludCxcbiAgICAgIGdldFRhcmdldExhYmVsUm90YXRpb25Qb2ludDogZ2V0VGFyZ2V0TGFiZWxSb3RhdGlvblBvaW50LFxuICAgICAgZ2V0TGFiZWxSb3RhdGlvbk9mZnNldDogZ2V0TGFiZWxSb3RhdGlvbk9mZnNldCxcbiAgICAgIGdldFNvdXJjZUxhYmVsUm90YXRpb25PZmZzZXQ6IGdldFNvdXJjZUxhYmVsUm90YXRpb25PZmZzZXQsXG4gICAgICBnZXRUYXJnZXRMYWJlbFJvdGF0aW9uT2Zmc2V0OiBnZXRUYXJnZXRMYWJlbFJvdGF0aW9uT2Zmc2V0XG4gICAgfSk7XG4gIH1cbn1cbkNScC5yZWRyYXdIaW50ID0gZnVuY3Rpb24gKGdyb3VwLCBib29sKSB7XG4gIHZhciByID0gdGhpcztcbiAgc3dpdGNoIChncm91cCkge1xuICAgIGNhc2UgJ2VsZXMnOlxuICAgICAgci5kYXRhLmNhbnZhc05lZWRzUmVkcmF3W0NScC5OT0RFXSA9IGJvb2w7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdkcmFnJzpcbiAgICAgIHIuZGF0YS5jYW52YXNOZWVkc1JlZHJhd1tDUnAuRFJBR10gPSBib29sO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgIHIuZGF0YS5jYW52YXNOZWVkc1JlZHJhd1tDUnAuU0VMRUNUX0JPWF0gPSBib29sO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZ2MnOlxuICAgICAgci5kYXRhLmdjID0gdHJ1ZTtcbiAgICAgIGJyZWFrO1xuICB9XG59O1xuXG4vLyB3aGV0aGVyIHRvIHVzZSBQYXRoMkQgY2FjaGluZyBmb3IgZHJhd2luZ1xudmFyIHBhdGhzSW1wbGQgPSB0eXBlb2YgUGF0aDJEICE9PSAndW5kZWZpbmVkJztcbkNScC5wYXRoMmRFbmFibGVkID0gZnVuY3Rpb24gKG9uKSB7XG4gIGlmIChvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHRoaXMucGF0aHNFbmFibGVkO1xuICB9XG4gIHRoaXMucGF0aHNFbmFibGVkID0gb24gPyB0cnVlIDogZmFsc2U7XG59O1xuQ1JwLnVzZVBhdGhzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gcGF0aHNJbXBsZCAmJiB0aGlzLnBhdGhzRW5hYmxlZDtcbn07XG5DUnAuc2V0SW1nU21vb3RoaW5nID0gZnVuY3Rpb24gKGNvbnRleHQsIGJvb2wpIHtcbiAgaWYgKGNvbnRleHQuaW1hZ2VTbW9vdGhpbmdFbmFibGVkICE9IG51bGwpIHtcbiAgICBjb250ZXh0LmltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGJvb2w7XG4gIH0gZWxzZSB7XG4gICAgY29udGV4dC53ZWJraXRJbWFnZVNtb290aGluZ0VuYWJsZWQgPSBib29sO1xuICAgIGNvbnRleHQubW96SW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gYm9vbDtcbiAgICBjb250ZXh0Lm1zSW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gYm9vbDtcbiAgfVxufTtcbkNScC5nZXRJbWdTbW9vdGhpbmcgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICBpZiAoY29udGV4dC5pbWFnZVNtb290aGluZ0VuYWJsZWQgIT0gbnVsbCkge1xuICAgIHJldHVybiBjb250ZXh0LmltYWdlU21vb3RoaW5nRW5hYmxlZDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY29udGV4dC53ZWJraXRJbWFnZVNtb290aGluZ0VuYWJsZWQgfHwgY29udGV4dC5tb3pJbWFnZVNtb290aGluZ0VuYWJsZWQgfHwgY29udGV4dC5tc0ltYWdlU21vb3RoaW5nRW5hYmxlZDtcbiAgfVxufTtcbkNScC5tYWtlT2Zmc2NyZWVuQ2FudmFzID0gZnVuY3Rpb24gKHdpZHRoLCBoZWlnaHQpIHtcbiAgdmFyIGNhbnZhcztcbiAgaWYgKCh0eXBlb2YgT2Zmc2NyZWVuQ2FudmFzID09PSBcInVuZGVmaW5lZFwiID8gXCJ1bmRlZmluZWRcIiA6IF90eXBlb2YoT2Zmc2NyZWVuQ2FudmFzKSkgIT09IChcInVuZGVmaW5lZFwiICkpIHtcbiAgICBjYW52YXMgPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKHdpZHRoLCBoZWlnaHQpO1xuICB9IGVsc2Uge1xuICAgIHZhciBjb250YWluZXJXaW5kb3cgPSB0aGlzLmN5LndpbmRvdygpO1xuICAgIHZhciBkb2N1bWVudCA9IGNvbnRhaW5lcldpbmRvdy5kb2N1bWVudDtcbiAgICBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gIH1cbiAgcmV0dXJuIGNhbnZhcztcbn07XG5bQ1JwJGIsIENScCRhLCBDUnAkOSwgQ1JwJDgsIENScCQ3LCBDUnAkNiwgQ1JwJDUsIENScCQ0LCBDUnAkMywgQ1JwJDIsIENScCQxXS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wcykge1xuICBleHRlbmQoQ1JwLCBwcm9wcyk7XG59KTtcblxudmFyIHJlbmRlcmVyID0gW3tcbiAgbmFtZTogJ251bGwnLFxuICBpbXBsOiBOdWxsUmVuZGVyZXJcbn0sIHtcbiAgbmFtZTogJ2Jhc2UnLFxuICBpbXBsOiBCUlxufSwge1xuICBuYW1lOiAnY2FudmFzJyxcbiAgaW1wbDogQ1Jcbn1dO1xuXG52YXIgaW5jRXh0cyA9IFt7XG4gIHR5cGU6ICdsYXlvdXQnLFxuICBleHRlbnNpb25zOiBsYXlvdXRcbn0sIHtcbiAgdHlwZTogJ3JlbmRlcmVyJyxcbiAgZXh0ZW5zaW9uczogcmVuZGVyZXJcbn1dO1xuXG4vLyByZWdpc3RlcmVkIGV4dGVuc2lvbnMgdG8gY3l0b3NjYXBlLCBpbmRleGVkIGJ5IG5hbWVcbnZhciBleHRlbnNpb25zID0ge307XG5cbi8vIHJlZ2lzdGVyZWQgbW9kdWxlcyBmb3IgZXh0ZW5zaW9ucywgaW5kZXhlZCBieSBuYW1lXG52YXIgbW9kdWxlcyA9IHt9O1xuZnVuY3Rpb24gc2V0RXh0ZW5zaW9uKHR5cGUsIG5hbWUsIHJlZ2lzdHJhbnQpIHtcbiAgdmFyIGV4dCA9IHJlZ2lzdHJhbnQ7XG4gIHZhciBvdmVycmlkZUVyciA9IGZ1bmN0aW9uIG92ZXJyaWRlRXJyKGZpZWxkKSB7XG4gICAgd2FybignQ2FuIG5vdCByZWdpc3RlciBgJyArIG5hbWUgKyAnYCBmb3IgYCcgKyB0eXBlICsgJ2Agc2luY2UgYCcgKyBmaWVsZCArICdgIGFscmVhZHkgZXhpc3RzIGluIHRoZSBwcm90b3R5cGUgYW5kIGNhbiBub3QgYmUgb3ZlcnJpZGRlbicpO1xuICB9O1xuICBpZiAodHlwZSA9PT0gJ2NvcmUnKSB7XG4gICAgaWYgKENvcmUucHJvdG90eXBlW25hbWVdKSB7XG4gICAgICByZXR1cm4gb3ZlcnJpZGVFcnIobmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIENvcmUucHJvdG90eXBlW25hbWVdID0gcmVnaXN0cmFudDtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2NvbGxlY3Rpb24nKSB7XG4gICAgaWYgKENvbGxlY3Rpb24ucHJvdG90eXBlW25hbWVdKSB7XG4gICAgICByZXR1cm4gb3ZlcnJpZGVFcnIobmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIENvbGxlY3Rpb24ucHJvdG90eXBlW25hbWVdID0gcmVnaXN0cmFudDtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2xheW91dCcpIHtcbiAgICAvLyBmaWxsIGluIG1pc3NpbmcgbGF5b3V0IGZ1bmN0aW9ucyBpbiB0aGUgcHJvdG90eXBlXG5cbiAgICB2YXIgTGF5b3V0ID0gZnVuY3Rpb24gTGF5b3V0KG9wdGlvbnMpIHtcbiAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICByZWdpc3RyYW50LmNhbGwodGhpcywgb3B0aW9ucyk7XG5cbiAgICAgIC8vIG1ha2Ugc3VyZSBsYXlvdXQgaGFzIF9wcml2YXRlIGZvciB1c2Ugdy8gc3RkIGFwaXMgbGlrZSAub24oKVxuICAgICAgaWYgKCFwbGFpbk9iamVjdCh0aGlzLl9wcml2YXRlKSkge1xuICAgICAgICB0aGlzLl9wcml2YXRlID0ge307XG4gICAgICB9XG4gICAgICB0aGlzLl9wcml2YXRlLmN5ID0gb3B0aW9ucy5jeTtcbiAgICAgIHRoaXMuX3ByaXZhdGUubGlzdGVuZXJzID0gW107XG4gICAgICB0aGlzLmNyZWF0ZUVtaXR0ZXIoKTtcbiAgICB9O1xuICAgIHZhciBsYXlvdXRQcm90byA9IExheW91dC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHJlZ2lzdHJhbnQucHJvdG90eXBlKTtcbiAgICB2YXIgb3B0TGF5b3V0Rm5zID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcHRMYXlvdXRGbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBmbk5hbWUgPSBvcHRMYXlvdXRGbnNbaV07XG4gICAgICBsYXlvdXRQcm90b1tmbk5hbWVdID0gbGF5b3V0UHJvdG9bZm5OYW1lXSB8fCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBlaXRoZXIgLnN0YXJ0KCkgb3IgLnJ1bigpIGlzIGRlZmluZWQsIHNvIGF1dG9nZW4gdGhlIG90aGVyXG4gICAgaWYgKGxheW91dFByb3RvLnN0YXJ0ICYmICFsYXlvdXRQcm90by5ydW4pIHtcbiAgICAgIGxheW91dFByb3RvLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5zdGFydCgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmICghbGF5b3V0UHJvdG8uc3RhcnQgJiYgbGF5b3V0UHJvdG8ucnVuKSB7XG4gICAgICBsYXlvdXRQcm90by5zdGFydCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5ydW4oKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9O1xuICAgIH1cbiAgICB2YXIgcmVnU3RvcCA9IHJlZ2lzdHJhbnQucHJvdG90eXBlLnN0b3A7XG4gICAgbGF5b3V0UHJvdG8uc3RvcCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBvcHRzID0gdGhpcy5vcHRpb25zO1xuICAgICAgaWYgKG9wdHMgJiYgb3B0cy5hbmltYXRlKSB7XG4gICAgICAgIHZhciBhbmlzID0gdGhpcy5hbmltYXRpb25zO1xuICAgICAgICBpZiAoYW5pcykge1xuICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhbmlzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgYW5pc1tfaV0uc3RvcCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHJlZ1N0b3ApIHtcbiAgICAgICAgcmVnU3RvcC5jYWxsKHRoaXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5lbWl0KCdsYXlvdXRzdG9wJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIGlmICghbGF5b3V0UHJvdG8uZGVzdHJveSkge1xuICAgICAgbGF5b3V0UHJvdG8uZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9O1xuICAgIH1cbiAgICBsYXlvdXRQcm90by5jeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9wcml2YXRlLmN5O1xuICAgIH07XG4gICAgdmFyIGdldEN5ID0gZnVuY3Rpb24gZ2V0Q3kobGF5b3V0KSB7XG4gICAgICByZXR1cm4gbGF5b3V0Ll9wcml2YXRlLmN5O1xuICAgIH07XG4gICAgdmFyIGVtaXR0ZXJPcHRzID0ge1xuICAgICAgYWRkRXZlbnRGaWVsZHM6IGZ1bmN0aW9uIGFkZEV2ZW50RmllbGRzKGxheW91dCwgZXZ0KSB7XG4gICAgICAgIGV2dC5sYXlvdXQgPSBsYXlvdXQ7XG4gICAgICAgIGV2dC5jeSA9IGdldEN5KGxheW91dCk7XG4gICAgICAgIGV2dC50YXJnZXQgPSBsYXlvdXQ7XG4gICAgICB9LFxuICAgICAgYnViYmxlOiBmdW5jdGlvbiBidWJibGUoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSxcbiAgICAgIHBhcmVudDogZnVuY3Rpb24gcGFyZW50KGxheW91dCkge1xuICAgICAgICByZXR1cm4gZ2V0Q3kobGF5b3V0KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGV4dGVuZChsYXlvdXRQcm90bywge1xuICAgICAgY3JlYXRlRW1pdHRlcjogZnVuY3Rpb24gY3JlYXRlRW1pdHRlcigpIHtcbiAgICAgICAgdGhpcy5fcHJpdmF0ZS5lbWl0dGVyID0gbmV3IEVtaXR0ZXIoZW1pdHRlck9wdHMsIHRoaXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG4gICAgICBlbWl0dGVyOiBmdW5jdGlvbiBlbWl0dGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5lbWl0dGVyO1xuICAgICAgfSxcbiAgICAgIG9uOiBmdW5jdGlvbiBvbihldnQsIGNiKSB7XG4gICAgICAgIHRoaXMuZW1pdHRlcigpLm9uKGV2dCwgY2IpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG4gICAgICBvbmU6IGZ1bmN0aW9uIG9uZShldnQsIGNiKSB7XG4gICAgICAgIHRoaXMuZW1pdHRlcigpLm9uZShldnQsIGNiKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuICAgICAgb25jZTogZnVuY3Rpb24gb25jZShldnQsIGNiKSB7XG4gICAgICAgIHRoaXMuZW1pdHRlcigpLm9uZShldnQsIGNiKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuICAgICAgcmVtb3ZlTGlzdGVuZXI6IGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKGV2dCwgY2IpIHtcbiAgICAgICAgdGhpcy5lbWl0dGVyKCkucmVtb3ZlTGlzdGVuZXIoZXZ0LCBjYik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICAgIHJlbW92ZUFsbExpc3RlbmVyczogZnVuY3Rpb24gcmVtb3ZlQWxsTGlzdGVuZXJzKCkge1xuICAgICAgICB0aGlzLmVtaXR0ZXIoKS5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuICAgICAgZW1pdDogZnVuY3Rpb24gZW1pdChldnQsIHBhcmFtcykge1xuICAgICAgICB0aGlzLmVtaXR0ZXIoKS5lbWl0KGV2dCwgcGFyYW1zKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgfSk7XG4gICAgZGVmaW5lLmV2ZW50QWxpYXNlc09uKGxheW91dFByb3RvKTtcbiAgICBleHQgPSBMYXlvdXQ7IC8vIHJlcGxhY2Ugd2l0aCBvdXIgd3JhcHBlZCBsYXlvdXRcbiAgfSBlbHNlIGlmICh0eXBlID09PSAncmVuZGVyZXInICYmIG5hbWUgIT09ICdudWxsJyAmJiBuYW1lICE9PSAnYmFzZScpIHtcbiAgICAvLyB1c2VyIHJlZ2lzdGVyZWQgcmVuZGVyZXJzIGluaGVyaXQgZnJvbSBiYXNlXG5cbiAgICB2YXIgQmFzZVJlbmRlcmVyID0gZ2V0RXh0ZW5zaW9uKCdyZW5kZXJlcicsICdiYXNlJyk7XG4gICAgdmFyIGJQcm90byA9IEJhc2VSZW5kZXJlci5wcm90b3R5cGU7XG4gICAgdmFyIFJlZ2lzdHJhbnRSZW5kZXJlciA9IHJlZ2lzdHJhbnQ7XG4gICAgdmFyIHJQcm90byA9IHJlZ2lzdHJhbnQucHJvdG90eXBlO1xuICAgIHZhciBSZW5kZXJlciA9IGZ1bmN0aW9uIFJlbmRlcmVyKCkge1xuICAgICAgQmFzZVJlbmRlcmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICBSZWdpc3RyYW50UmVuZGVyZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICAgIHZhciBwcm90byA9IFJlbmRlcmVyLnByb3RvdHlwZTtcbiAgICBmb3IgKHZhciBwTmFtZSBpbiBiUHJvdG8pIHtcbiAgICAgIHZhciBwVmFsID0gYlByb3RvW3BOYW1lXTtcbiAgICAgIHZhciBleGlzdHNJblIgPSByUHJvdG9bcE5hbWVdICE9IG51bGw7XG4gICAgICBpZiAoZXhpc3RzSW5SKSB7XG4gICAgICAgIHJldHVybiBvdmVycmlkZUVycihwTmFtZSk7XG4gICAgICB9XG4gICAgICBwcm90b1twTmFtZV0gPSBwVmFsOyAvLyB0YWtlIGltcGwgZnJvbSBiYXNlXG4gICAgfVxuICAgIGZvciAodmFyIF9wTmFtZSBpbiByUHJvdG8pIHtcbiAgICAgIHByb3RvW19wTmFtZV0gPSByUHJvdG9bX3BOYW1lXTsgLy8gdGFrZSBpbXBsIGZyb20gcmVnaXN0cmFudFxuICAgIH1cbiAgICBiUHJvdG8uY2xpZW50RnVuY3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIHByb3RvW25hbWVdID0gcHJvdG9bbmFtZV0gfHwgZnVuY3Rpb24gKCkge1xuICAgICAgICBlcnJvcignUmVuZGVyZXIgZG9lcyBub3QgaW1wbGVtZW50IGByZW5kZXJlci4nICsgbmFtZSArICcoKWAgb24gaXRzIHByb3RvdHlwZScpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgICBleHQgPSBSZW5kZXJlcjtcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnX19wcm90b19fJyB8fCB0eXBlID09PSAnY29uc3RydWN0b3InIHx8IHR5cGUgPT09ICdwcm90b3R5cGUnKSB7XG4gICAgLy8gdG8gYXZvaWQgcG90ZW50aWFsIHByb3RvdHlwZSBwb2xsdXRpb25cbiAgICByZXR1cm4gZXJyb3IodHlwZSArICcgaXMgYW4gaWxsZWdhbCB0eXBlIHRvIGJlIHJlZ2lzdGVyZWQsIHBvc3NpYmx5IGxlYWQgdG8gcHJvdG90eXBlIHBvbGx1dGlvbnMnKTtcbiAgfVxuICByZXR1cm4gc2V0TWFwKHtcbiAgICBtYXA6IGV4dGVuc2lvbnMsXG4gICAga2V5czogW3R5cGUsIG5hbWVdLFxuICAgIHZhbHVlOiBleHRcbiAgfSk7XG59XG5mdW5jdGlvbiBnZXRFeHRlbnNpb24odHlwZSwgbmFtZSkge1xuICByZXR1cm4gZ2V0TWFwKHtcbiAgICBtYXA6IGV4dGVuc2lvbnMsXG4gICAga2V5czogW3R5cGUsIG5hbWVdXG4gIH0pO1xufVxuZnVuY3Rpb24gc2V0TW9kdWxlKHR5cGUsIG5hbWUsIG1vZHVsZVR5cGUsIG1vZHVsZU5hbWUsIHJlZ2lzdHJhbnQpIHtcbiAgcmV0dXJuIHNldE1hcCh7XG4gICAgbWFwOiBtb2R1bGVzLFxuICAgIGtleXM6IFt0eXBlLCBuYW1lLCBtb2R1bGVUeXBlLCBtb2R1bGVOYW1lXSxcbiAgICB2YWx1ZTogcmVnaXN0cmFudFxuICB9KTtcbn1cbmZ1bmN0aW9uIGdldE1vZHVsZSh0eXBlLCBuYW1lLCBtb2R1bGVUeXBlLCBtb2R1bGVOYW1lKSB7XG4gIHJldHVybiBnZXRNYXAoe1xuICAgIG1hcDogbW9kdWxlcyxcbiAgICBrZXlzOiBbdHlwZSwgbmFtZSwgbW9kdWxlVHlwZSwgbW9kdWxlTmFtZV1cbiAgfSk7XG59XG52YXIgZXh0ZW5zaW9uID0gZnVuY3Rpb24gZXh0ZW5zaW9uKCkge1xuICAvLyBlLmcuIGV4dGVuc2lvbigncmVuZGVyZXInLCAnc3ZnJylcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICByZXR1cm4gZ2V0RXh0ZW5zaW9uLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gIH1cblxuICAvLyBlLmcuIGV4dGVuc2lvbigncmVuZGVyZXInLCAnc3ZnJywgeyAuLi4gfSlcbiAgZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykge1xuICAgIHJldHVybiBzZXRFeHRlbnNpb24uYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgfVxuXG4gIC8vIGUuZy4gZXh0ZW5zaW9uKCdyZW5kZXJlcicsICdzdmcnLCAnbm9kZVNoYXBlJywgJ2VsbGlwc2UnKVxuICBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSA0KSB7XG4gICAgcmV0dXJuIGdldE1vZHVsZS5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgLy8gZS5nLiBleHRlbnNpb24oJ3JlbmRlcmVyJywgJ3N2ZycsICdub2RlU2hhcGUnLCAnZWxsaXBzZScsIHsgLi4uIH0pXG4gIGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDUpIHtcbiAgICByZXR1cm4gc2V0TW9kdWxlLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gIH0gZWxzZSB7XG4gICAgZXJyb3IoJ0ludmFsaWQgZXh0ZW5zaW9uIGFjY2VzcyBzeW50YXgnKTtcbiAgfVxufTtcblxuLy8gYWxsb3dzIGEgY29yZSBpbnN0YW5jZSB0byBhY2Nlc3MgZXh0ZW5zaW9ucyBpbnRlcm5hbGx5XG5Db3JlLnByb3RvdHlwZS5leHRlbnNpb24gPSBleHRlbnNpb247XG5cbi8vIGluY2x1ZGVkIGV4dGVuc2lvbnNcbmluY0V4dHMuZm9yRWFjaChmdW5jdGlvbiAoZ3JvdXApIHtcbiAgZ3JvdXAuZXh0ZW5zaW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChleHQpIHtcbiAgICBzZXRFeHRlbnNpb24oZ3JvdXAudHlwZSwgZXh0Lm5hbWUsIGV4dC5pbXBsKTtcbiAgfSk7XG59KTtcblxuLy8gYSBkdW1teSBzdHlsZXNoZWV0IG9iamVjdCB0aGF0IGRvZXNuJ3QgbmVlZCBhIHJlZmVyZW5jZSB0byB0aGUgY29yZVxuLy8gKHVzZWZ1bCBmb3IgaW5pdClcbnZhciBfU3R5bGVzaGVldCA9IGZ1bmN0aW9uIFN0eWxlc2hlZXQoKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBfU3R5bGVzaGVldCkpIHtcbiAgICByZXR1cm4gbmV3IF9TdHlsZXNoZWV0KCk7XG4gIH1cbiAgdGhpcy5sZW5ndGggPSAwO1xufTtcbnZhciBzaGVldGZuID0gX1N0eWxlc2hlZXQucHJvdG90eXBlO1xuc2hlZXRmbi5pbnN0YW5jZVN0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICdzdHlsZXNoZWV0Jztcbn07XG5cbi8vIGp1c3Qgc3RvcmUgdGhlIHNlbGVjdG9yIHRvIGJlIHBhcnNlZCBsYXRlclxuc2hlZXRmbi5zZWxlY3RvciA9IGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICB2YXIgaSA9IHRoaXMubGVuZ3RoKys7XG4gIHRoaXNbaV0gPSB7XG4gICAgc2VsZWN0b3I6IHNlbGVjdG9yLFxuICAgIHByb3BlcnRpZXM6IFtdXG4gIH07XG4gIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xufTtcblxuLy8ganVzdCBzdG9yZSB0aGUgcHJvcGVydHkgdG8gYmUgcGFyc2VkIGxhdGVyXG5zaGVldGZuLmNzcyA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICB2YXIgaSA9IHRoaXMubGVuZ3RoIC0gMTtcbiAgaWYgKHN0cmluZyhuYW1lKSkge1xuICAgIHRoaXNbaV0ucHJvcGVydGllcy5wdXNoKHtcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICB2YWx1ZTogdmFsdWVcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChwbGFpbk9iamVjdChuYW1lKSkge1xuICAgIHZhciBtYXAgPSBuYW1lO1xuICAgIHZhciBwcm9wTmFtZXMgPSBPYmplY3Qua2V5cyhtYXApO1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgcHJvcE5hbWVzLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIga2V5ID0gcHJvcE5hbWVzW2pdO1xuICAgICAgdmFyIG1hcFZhbCA9IG1hcFtrZXldO1xuICAgICAgaWYgKG1hcFZhbCA9PSBudWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdmFyIHByb3AgPSBfU3R5bGUucHJvcGVydGllc1trZXldIHx8IF9TdHlsZS5wcm9wZXJ0aWVzW2Rhc2gyY2FtZWwoa2V5KV07XG4gICAgICBpZiAocHJvcCA9PSBudWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdmFyIF9uYW1lID0gcHJvcC5uYW1lO1xuICAgICAgdmFyIF92YWx1ZSA9IG1hcFZhbDtcbiAgICAgIHRoaXNbaV0ucHJvcGVydGllcy5wdXNoKHtcbiAgICAgICAgbmFtZTogX25hbWUsXG4gICAgICAgIHZhbHVlOiBfdmFsdWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbn07XG5zaGVldGZuLnN0eWxlID0gc2hlZXRmbi5jc3M7XG5cbi8vIGdlbmVyYXRlIGEgcmVhbCBzdHlsZSBvYmplY3QgZnJvbSB0aGUgZHVtbXkgc3R5bGVzaGVldFxuc2hlZXRmbi5nZW5lcmF0ZVN0eWxlID0gZnVuY3Rpb24gKGN5KSB7XG4gIHZhciBzdHlsZSA9IG5ldyBfU3R5bGUoY3kpO1xuICByZXR1cm4gdGhpcy5hcHBlbmRUb1N0eWxlKHN0eWxlKTtcbn07XG5cbi8vIGFwcGVuZCBhIGR1bW15IHN0eWxlc2hlZXQgb2JqZWN0IG9uIGEgcmVhbCBzdHlsZSBvYmplY3RcbnNoZWV0Zm4uYXBwZW5kVG9TdHlsZSA9IGZ1bmN0aW9uIChzdHlsZSkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgY29udGV4dCA9IHRoaXNbaV07XG4gICAgdmFyIHNlbGVjdG9yID0gY29udGV4dC5zZWxlY3RvcjtcbiAgICB2YXIgcHJvcHMgPSBjb250ZXh0LnByb3BlcnRpZXM7XG4gICAgc3R5bGUuc2VsZWN0b3Ioc2VsZWN0b3IpOyAvLyBhcHBseSBzZWxlY3RvclxuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBwcm9wcy5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIHByb3AgPSBwcm9wc1tqXTtcbiAgICAgIHN0eWxlLmNzcyhwcm9wLm5hbWUsIHByb3AudmFsdWUpOyAvLyBhcHBseSBwcm9wZXJ0eVxuICAgIH1cbiAgfVxuICByZXR1cm4gc3R5bGU7XG59O1xuXG52YXIgdmVyc2lvbiA9IFwiMy4zNC4zXCI7XG5cbnZhciBjeXRvc2NhcGUgPSBmdW5jdGlvbiBjeXRvc2NhcGUob3B0aW9ucykge1xuICAvLyBpZiBubyBvcHRpb25zIHNwZWNpZmllZCwgdXNlIGRlZmF1bHRcbiAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIC8vIGNyZWF0ZSBpbnN0YW5jZVxuICBpZiAocGxhaW5PYmplY3Qob3B0aW9ucykpIHtcbiAgICByZXR1cm4gbmV3IENvcmUob3B0aW9ucyk7XG4gIH1cblxuICAvLyBhbGxvdyBmb3IgcmVnaXN0cmF0aW9uIG9mIGV4dGVuc2lvbnNcbiAgZWxzZSBpZiAoc3RyaW5nKG9wdGlvbnMpKSB7XG4gICAgcmV0dXJuIGV4dGVuc2lvbi5hcHBseShleHRlbnNpb24sIGFyZ3VtZW50cyk7XG4gIH1cbn07XG5cbi8vIGUuZy4gY3l0b3NjYXBlLnVzZSggcmVxdWlyZSgnY3l0b3NjYXBlLWZvbycpLCBiYXIgKVxuY3l0b3NjYXBlLnVzZSA9IGZ1bmN0aW9uIChleHQpIHtcbiAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOyAvLyBhcmdzIHRvIHBhc3MgdG8gZXh0XG5cbiAgYXJncy51bnNoaWZ0KGN5dG9zY2FwZSk7IC8vIGN5dG9zY2FwZSBpcyBmaXJzdCBhcmcgdG8gZXh0XG5cbiAgZXh0LmFwcGx5KG51bGwsIGFyZ3MpO1xuICByZXR1cm4gdGhpcztcbn07XG5jeXRvc2NhcGUud2FybmluZ3MgPSBmdW5jdGlvbiAoYm9vbCkge1xuICByZXR1cm4gd2FybmluZ3MoYm9vbCk7XG59O1xuXG4vLyByZXBsYWNlZCBieSBidWlsZCBzeXN0ZW1cbmN5dG9zY2FwZS52ZXJzaW9uID0gdmVyc2lvbjtcblxuLy8gZXhwb3NlIHB1YmxpYyBhcGlzIChtb3N0bHkgZm9yIGV4dGVuc2lvbnMpXG5jeXRvc2NhcGUuc3R5bGVzaGVldCA9IGN5dG9zY2FwZS5TdHlsZXNoZWV0ID0gX1N0eWxlc2hlZXQ7XG5cbmV4cG9ydCB7IGN5dG9zY2FwZSBhcyBkZWZhdWx0IH07XG4iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdGlkOiBtb2R1bGVJZCxcblx0XHRsb2FkZWQ6IGZhbHNlLFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdGlmICghKG1vZHVsZUlkIGluIF9fd2VicGFja19tb2R1bGVzX18pKSB7XG5cdFx0ZGVsZXRlIF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgbW9kdWxlSWQgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuXHRtb2R1bGUubG9hZGVkID0gdHJ1ZTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcblx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG5cdFx0ZnVuY3Rpb24oKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG5cdFx0ZnVuY3Rpb24oKSB7IHJldHVybiBtb2R1bGU7IH07XG5cdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsIHsgYTogZ2V0dGVyIH0pO1xuXHRyZXR1cm4gZ2V0dGVyO1xufTsiLCIvLyBkZWZpbmUgZ2V0dGVyL3ZhbHVlIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBkZWZpbml0aW9uKSB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18uZyA9IChmdW5jdGlvbigpIHtcblx0aWYgKHR5cGVvZiBnbG9iYWxUaGlzID09PSAnb2JqZWN0JykgcmV0dXJuIGdsb2JhbFRoaXM7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIHRoaXMgfHwgbmV3IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ29iamVjdCcpIHJldHVybiB3aW5kb3c7XG5cdH1cbn0pKCk7IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqLCBwcm9wKSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTsgfTsiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm5tZCA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuXHRtb2R1bGUucGF0aHMgPSBbXTtcblx0aWYgKCFtb2R1bGUuY2hpbGRyZW4pIG1vZHVsZS5jaGlsZHJlbiA9IFtdO1xuXHRyZXR1cm4gbW9kdWxlO1xufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm5jID0gdW5kZWZpbmVkOyIsIi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvdHlwZS1idWlsdGlucyAqL1xudmFyIGcgPVxuICAodHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnICYmIGdsb2JhbFRoaXMpIHx8XG4gICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgJiYgc2VsZikgfHxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyAmJiBnbG9iYWwpIHx8XG4gIHt9XG5cbnZhciBzdXBwb3J0ID0ge1xuICBzZWFyY2hQYXJhbXM6ICdVUkxTZWFyY2hQYXJhbXMnIGluIGcsXG4gIGl0ZXJhYmxlOiAnU3ltYm9sJyBpbiBnICYmICdpdGVyYXRvcicgaW4gU3ltYm9sLFxuICBibG9iOlxuICAgICdGaWxlUmVhZGVyJyBpbiBnICYmXG4gICAgJ0Jsb2InIGluIGcgJiZcbiAgICAoZnVuY3Rpb24oKSB7XG4gICAgICB0cnkge1xuICAgICAgICBuZXcgQmxvYigpXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH0pKCksXG4gIGZvcm1EYXRhOiAnRm9ybURhdGEnIGluIGcsXG4gIGFycmF5QnVmZmVyOiAnQXJyYXlCdWZmZXInIGluIGdcbn1cblxuZnVuY3Rpb24gaXNEYXRhVmlldyhvYmopIHtcbiAgcmV0dXJuIG9iaiAmJiBEYXRhVmlldy5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihvYmopXG59XG5cbmlmIChzdXBwb3J0LmFycmF5QnVmZmVyKSB7XG4gIHZhciB2aWV3Q2xhc3NlcyA9IFtcbiAgICAnW29iamVjdCBJbnQ4QXJyYXldJyxcbiAgICAnW29iamVjdCBVaW50OEFycmF5XScsXG4gICAgJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJyxcbiAgICAnW29iamVjdCBJbnQxNkFycmF5XScsXG4gICAgJ1tvYmplY3QgVWludDE2QXJyYXldJyxcbiAgICAnW29iamVjdCBJbnQzMkFycmF5XScsXG4gICAgJ1tvYmplY3QgVWludDMyQXJyYXldJyxcbiAgICAnW29iamVjdCBGbG9hdDMyQXJyYXldJyxcbiAgICAnW29iamVjdCBGbG9hdDY0QXJyYXldJ1xuICBdXG5cbiAgdmFyIGlzQXJyYXlCdWZmZXJWaWV3ID1cbiAgICBBcnJheUJ1ZmZlci5pc1ZpZXcgfHxcbiAgICBmdW5jdGlvbihvYmopIHtcbiAgICAgIHJldHVybiBvYmogJiYgdmlld0NsYXNzZXMuaW5kZXhPZihPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSkgPiAtMVxuICAgIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTmFtZShuYW1lKSB7XG4gIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICBuYW1lID0gU3RyaW5nKG5hbWUpXG4gIH1cbiAgaWYgKC9bXmEtejAtOVxcLSMkJSYnKisuXl9gfH4hXS9pLnRlc3QobmFtZSkgfHwgbmFtZSA9PT0gJycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGNoYXJhY3RlciBpbiBoZWFkZXIgZmllbGQgbmFtZTogXCInICsgbmFtZSArICdcIicpXG4gIH1cbiAgcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVWYWx1ZSh2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgIHZhbHVlID0gU3RyaW5nKHZhbHVlKVxuICB9XG4gIHJldHVybiB2YWx1ZVxufVxuXG4vLyBCdWlsZCBhIGRlc3RydWN0aXZlIGl0ZXJhdG9yIGZvciB0aGUgdmFsdWUgbGlzdFxuZnVuY3Rpb24gaXRlcmF0b3JGb3IoaXRlbXMpIHtcbiAgdmFyIGl0ZXJhdG9yID0ge1xuICAgIG5leHQ6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHZhbHVlID0gaXRlbXMuc2hpZnQoKVxuICAgICAgcmV0dXJuIHtkb25lOiB2YWx1ZSA9PT0gdW5kZWZpbmVkLCB2YWx1ZTogdmFsdWV9XG4gICAgfVxuICB9XG5cbiAgaWYgKHN1cHBvcnQuaXRlcmFibGUpIHtcbiAgICBpdGVyYXRvcltTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gaXRlcmF0b3JcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaXRlcmF0b3Jcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEhlYWRlcnMoaGVhZGVycykge1xuICB0aGlzLm1hcCA9IHt9XG5cbiAgaWYgKGhlYWRlcnMgaW5zdGFuY2VvZiBIZWFkZXJzKSB7XG4gICAgaGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgICB0aGlzLmFwcGVuZChuYW1lLCB2YWx1ZSlcbiAgICB9LCB0aGlzKVxuICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoaGVhZGVycykpIHtcbiAgICBoZWFkZXJzLmZvckVhY2goZnVuY3Rpb24oaGVhZGVyKSB7XG4gICAgICBpZiAoaGVhZGVyLmxlbmd0aCAhPSAyKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0hlYWRlcnMgY29uc3RydWN0b3I6IGV4cGVjdGVkIG5hbWUvdmFsdWUgcGFpciB0byBiZSBsZW5ndGggMiwgZm91bmQnICsgaGVhZGVyLmxlbmd0aClcbiAgICAgIH1cbiAgICAgIHRoaXMuYXBwZW5kKGhlYWRlclswXSwgaGVhZGVyWzFdKVxuICAgIH0sIHRoaXMpXG4gIH0gZWxzZSBpZiAoaGVhZGVycykge1xuICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGhlYWRlcnMpLmZvckVhY2goZnVuY3Rpb24obmFtZSkge1xuICAgICAgdGhpcy5hcHBlbmQobmFtZSwgaGVhZGVyc1tuYW1lXSlcbiAgICB9LCB0aGlzKVxuICB9XG59XG5cbkhlYWRlcnMucHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIG5hbWUgPSBub3JtYWxpemVOYW1lKG5hbWUpXG4gIHZhbHVlID0gbm9ybWFsaXplVmFsdWUodmFsdWUpXG4gIHZhciBvbGRWYWx1ZSA9IHRoaXMubWFwW25hbWVdXG4gIHRoaXMubWFwW25hbWVdID0gb2xkVmFsdWUgPyBvbGRWYWx1ZSArICcsICcgKyB2YWx1ZSA6IHZhbHVlXG59XG5cbkhlYWRlcnMucHJvdG90eXBlWydkZWxldGUnXSA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgZGVsZXRlIHRoaXMubWFwW25vcm1hbGl6ZU5hbWUobmFtZSldXG59XG5cbkhlYWRlcnMucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgbmFtZSA9IG5vcm1hbGl6ZU5hbWUobmFtZSlcbiAgcmV0dXJuIHRoaXMuaGFzKG5hbWUpID8gdGhpcy5tYXBbbmFtZV0gOiBudWxsXG59XG5cbkhlYWRlcnMucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgcmV0dXJuIHRoaXMubWFwLmhhc093blByb3BlcnR5KG5vcm1hbGl6ZU5hbWUobmFtZSkpXG59XG5cbkhlYWRlcnMucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHRoaXMubWFwW25vcm1hbGl6ZU5hbWUobmFtZSldID0gbm9ybWFsaXplVmFsdWUodmFsdWUpXG59XG5cbkhlYWRlcnMucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbihjYWxsYmFjaywgdGhpc0FyZykge1xuICBmb3IgKHZhciBuYW1lIGluIHRoaXMubWFwKSB7XG4gICAgaWYgKHRoaXMubWFwLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICBjYWxsYmFjay5jYWxsKHRoaXNBcmcsIHRoaXMubWFwW25hbWVdLCBuYW1lLCB0aGlzKVxuICAgIH1cbiAgfVxufVxuXG5IZWFkZXJzLnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24oKSB7XG4gIHZhciBpdGVtcyA9IFtdXG4gIHRoaXMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgIGl0ZW1zLnB1c2gobmFtZSlcbiAgfSlcbiAgcmV0dXJuIGl0ZXJhdG9yRm9yKGl0ZW1zKVxufVxuXG5IZWFkZXJzLnByb3RvdHlwZS52YWx1ZXMgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGl0ZW1zID0gW11cbiAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgaXRlbXMucHVzaCh2YWx1ZSlcbiAgfSlcbiAgcmV0dXJuIGl0ZXJhdG9yRm9yKGl0ZW1zKVxufVxuXG5IZWFkZXJzLnByb3RvdHlwZS5lbnRyaWVzID0gZnVuY3Rpb24oKSB7XG4gIHZhciBpdGVtcyA9IFtdXG4gIHRoaXMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgIGl0ZW1zLnB1c2goW25hbWUsIHZhbHVlXSlcbiAgfSlcbiAgcmV0dXJuIGl0ZXJhdG9yRm9yKGl0ZW1zKVxufVxuXG5pZiAoc3VwcG9ydC5pdGVyYWJsZSkge1xuICBIZWFkZXJzLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID0gSGVhZGVycy5wcm90b3R5cGUuZW50cmllc1xufVxuXG5mdW5jdGlvbiBjb25zdW1lZChib2R5KSB7XG4gIGlmIChib2R5Ll9ub0JvZHkpIHJldHVyblxuICBpZiAoYm9keS5ib2R5VXNlZCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgVHlwZUVycm9yKCdBbHJlYWR5IHJlYWQnKSlcbiAgfVxuICBib2R5LmJvZHlVc2VkID0gdHJ1ZVxufVxuXG5mdW5jdGlvbiBmaWxlUmVhZGVyUmVhZHkocmVhZGVyKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICByZWFkZXIub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXNvbHZlKHJlYWRlci5yZXN1bHQpXG4gICAgfVxuICAgIHJlYWRlci5vbmVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICByZWplY3QocmVhZGVyLmVycm9yKVxuICAgIH1cbiAgfSlcbn1cblxuZnVuY3Rpb24gcmVhZEJsb2JBc0FycmF5QnVmZmVyKGJsb2IpIHtcbiAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKClcbiAgdmFyIHByb21pc2UgPSBmaWxlUmVhZGVyUmVhZHkocmVhZGVyKVxuICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoYmxvYilcbiAgcmV0dXJuIHByb21pc2Vcbn1cblxuZnVuY3Rpb24gcmVhZEJsb2JBc1RleHQoYmxvYikge1xuICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKVxuICB2YXIgcHJvbWlzZSA9IGZpbGVSZWFkZXJSZWFkeShyZWFkZXIpXG4gIHZhciBtYXRjaCA9IC9jaGFyc2V0PShbQS1aYS16MC05Xy1dKykvLmV4ZWMoYmxvYi50eXBlKVxuICB2YXIgZW5jb2RpbmcgPSBtYXRjaCA/IG1hdGNoWzFdIDogJ3V0Zi04J1xuICByZWFkZXIucmVhZEFzVGV4dChibG9iLCBlbmNvZGluZylcbiAgcmV0dXJuIHByb21pc2Vcbn1cblxuZnVuY3Rpb24gcmVhZEFycmF5QnVmZmVyQXNUZXh0KGJ1Zikge1xuICB2YXIgdmlldyA9IG5ldyBVaW50OEFycmF5KGJ1ZilcbiAgdmFyIGNoYXJzID0gbmV3IEFycmF5KHZpZXcubGVuZ3RoKVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdmlldy5sZW5ndGg7IGkrKykge1xuICAgIGNoYXJzW2ldID0gU3RyaW5nLmZyb21DaGFyQ29kZSh2aWV3W2ldKVxuICB9XG4gIHJldHVybiBjaGFycy5qb2luKCcnKVxufVxuXG5mdW5jdGlvbiBidWZmZXJDbG9uZShidWYpIHtcbiAgaWYgKGJ1Zi5zbGljZSkge1xuICAgIHJldHVybiBidWYuc2xpY2UoMClcbiAgfSBlbHNlIHtcbiAgICB2YXIgdmlldyA9IG5ldyBVaW50OEFycmF5KGJ1Zi5ieXRlTGVuZ3RoKVxuICAgIHZpZXcuc2V0KG5ldyBVaW50OEFycmF5KGJ1ZikpXG4gICAgcmV0dXJuIHZpZXcuYnVmZmVyXG4gIH1cbn1cblxuZnVuY3Rpb24gQm9keSgpIHtcbiAgdGhpcy5ib2R5VXNlZCA9IGZhbHNlXG5cbiAgdGhpcy5faW5pdEJvZHkgPSBmdW5jdGlvbihib2R5KSB7XG4gICAgLypcbiAgICAgIGZldGNoLW1vY2sgd3JhcHMgdGhlIFJlc3BvbnNlIG9iamVjdCBpbiBhbiBFUzYgUHJveHkgdG9cbiAgICAgIHByb3ZpZGUgdXNlZnVsIHRlc3QgaGFybmVzcyBmZWF0dXJlcyBzdWNoIGFzIGZsdXNoLiBIb3dldmVyLCBvblxuICAgICAgRVM1IGJyb3dzZXJzIHdpdGhvdXQgZmV0Y2ggb3IgUHJveHkgc3VwcG9ydCBwb2xseWZpbGxzIG11c3QgYmUgdXNlZDtcbiAgICAgIHRoZSBwcm94eS1wb2xseWZpbGwgaXMgdW5hYmxlIHRvIHByb3h5IGFuIGF0dHJpYnV0ZSB1bmxlc3MgaXQgZXhpc3RzXG4gICAgICBvbiB0aGUgb2JqZWN0IGJlZm9yZSB0aGUgUHJveHkgaXMgY3JlYXRlZC4gVGhpcyBjaGFuZ2UgZW5zdXJlc1xuICAgICAgUmVzcG9uc2UuYm9keVVzZWQgZXhpc3RzIG9uIHRoZSBpbnN0YW5jZSwgd2hpbGUgbWFpbnRhaW5pbmcgdGhlXG4gICAgICBzZW1hbnRpYyBvZiBzZXR0aW5nIFJlcXVlc3QuYm9keVVzZWQgaW4gdGhlIGNvbnN0cnVjdG9yIGJlZm9yZVxuICAgICAgX2luaXRCb2R5IGlzIGNhbGxlZC5cbiAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWFzc2lnblxuICAgIHRoaXMuYm9keVVzZWQgPSB0aGlzLmJvZHlVc2VkXG4gICAgdGhpcy5fYm9keUluaXQgPSBib2R5XG4gICAgaWYgKCFib2R5KSB7XG4gICAgICB0aGlzLl9ub0JvZHkgPSB0cnVlO1xuICAgICAgdGhpcy5fYm9keVRleHQgPSAnJ1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGJvZHkgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLl9ib2R5VGV4dCA9IGJvZHlcbiAgICB9IGVsc2UgaWYgKHN1cHBvcnQuYmxvYiAmJiBCbG9iLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGJvZHkpKSB7XG4gICAgICB0aGlzLl9ib2R5QmxvYiA9IGJvZHlcbiAgICB9IGVsc2UgaWYgKHN1cHBvcnQuZm9ybURhdGEgJiYgRm9ybURhdGEucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYm9keSkpIHtcbiAgICAgIHRoaXMuX2JvZHlGb3JtRGF0YSA9IGJvZHlcbiAgICB9IGVsc2UgaWYgKHN1cHBvcnQuc2VhcmNoUGFyYW1zICYmIFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihib2R5KSkge1xuICAgICAgdGhpcy5fYm9keVRleHQgPSBib2R5LnRvU3RyaW5nKClcbiAgICB9IGVsc2UgaWYgKHN1cHBvcnQuYXJyYXlCdWZmZXIgJiYgc3VwcG9ydC5ibG9iICYmIGlzRGF0YVZpZXcoYm9keSkpIHtcbiAgICAgIHRoaXMuX2JvZHlBcnJheUJ1ZmZlciA9IGJ1ZmZlckNsb25lKGJvZHkuYnVmZmVyKVxuICAgICAgLy8gSUUgMTAtMTEgY2FuJ3QgaGFuZGxlIGEgRGF0YVZpZXcgYm9keS5cbiAgICAgIHRoaXMuX2JvZHlJbml0ID0gbmV3IEJsb2IoW3RoaXMuX2JvZHlBcnJheUJ1ZmZlcl0pXG4gICAgfSBlbHNlIGlmIChzdXBwb3J0LmFycmF5QnVmZmVyICYmIChBcnJheUJ1ZmZlci5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihib2R5KSB8fCBpc0FycmF5QnVmZmVyVmlldyhib2R5KSkpIHtcbiAgICAgIHRoaXMuX2JvZHlBcnJheUJ1ZmZlciA9IGJ1ZmZlckNsb25lKGJvZHkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2JvZHlUZXh0ID0gYm9keSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChib2R5KVxuICAgIH1cblxuICAgIGlmICghdGhpcy5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJykpIHtcbiAgICAgIGlmICh0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy5oZWFkZXJzLnNldCgnY29udGVudC10eXBlJywgJ3RleHQvcGxhaW47Y2hhcnNldD1VVEYtOCcpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX2JvZHlCbG9iICYmIHRoaXMuX2JvZHlCbG9iLnR5cGUpIHtcbiAgICAgICAgdGhpcy5oZWFkZXJzLnNldCgnY29udGVudC10eXBlJywgdGhpcy5fYm9keUJsb2IudHlwZSlcbiAgICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5zZWFyY2hQYXJhbXMgJiYgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGJvZHkpKSB7XG4gICAgICAgIHRoaXMuaGVhZGVycy5zZXQoJ2NvbnRlbnQtdHlwZScsICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD1VVEYtOCcpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHN1cHBvcnQuYmxvYikge1xuICAgIHRoaXMuYmxvYiA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHJlamVjdGVkID0gY29uc3VtZWQodGhpcylcbiAgICAgIGlmIChyZWplY3RlZCkge1xuICAgICAgICByZXR1cm4gcmVqZWN0ZWRcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX2JvZHlCbG9iKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYm9keUJsb2IpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX2JvZHlBcnJheUJ1ZmZlcikge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ldyBCbG9iKFt0aGlzLl9ib2R5QXJyYXlCdWZmZXJdKSlcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fYm9keUZvcm1EYXRhKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IHJlYWQgRm9ybURhdGEgYm9keSBhcyBibG9iJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobmV3IEJsb2IoW3RoaXMuX2JvZHlUZXh0XSkpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdGhpcy5hcnJheUJ1ZmZlciA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpIHtcbiAgICAgIHZhciBpc0NvbnN1bWVkID0gY29uc3VtZWQodGhpcylcbiAgICAgIGlmIChpc0NvbnN1bWVkKSB7XG4gICAgICAgIHJldHVybiBpc0NvbnN1bWVkXG4gICAgICB9IGVsc2UgaWYgKEFycmF5QnVmZmVyLmlzVmlldyh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoXG4gICAgICAgICAgdGhpcy5fYm9keUFycmF5QnVmZmVyLmJ1ZmZlci5zbGljZShcbiAgICAgICAgICAgIHRoaXMuX2JvZHlBcnJheUJ1ZmZlci5ieXRlT2Zmc2V0LFxuICAgICAgICAgICAgdGhpcy5fYm9keUFycmF5QnVmZmVyLmJ5dGVPZmZzZXQgKyB0aGlzLl9ib2R5QXJyYXlCdWZmZXIuYnl0ZUxlbmd0aFxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzdXBwb3J0LmJsb2IpIHtcbiAgICAgIHJldHVybiB0aGlzLmJsb2IoKS50aGVuKHJlYWRCbG9iQXNBcnJheUJ1ZmZlcilcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgcmVhZCBhcyBBcnJheUJ1ZmZlcicpXG4gICAgfVxuICB9XG5cbiAgdGhpcy50ZXh0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHJlamVjdGVkID0gY29uc3VtZWQodGhpcylcbiAgICBpZiAocmVqZWN0ZWQpIHtcbiAgICAgIHJldHVybiByZWplY3RlZFxuICAgIH1cblxuICAgIGlmICh0aGlzLl9ib2R5QmxvYikge1xuICAgICAgcmV0dXJuIHJlYWRCbG9iQXNUZXh0KHRoaXMuX2JvZHlCbG9iKVxuICAgIH0gZWxzZSBpZiAodGhpcy5fYm9keUFycmF5QnVmZmVyKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlYWRBcnJheUJ1ZmZlckFzVGV4dCh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpKVxuICAgIH0gZWxzZSBpZiAodGhpcy5fYm9keUZvcm1EYXRhKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdWxkIG5vdCByZWFkIEZvcm1EYXRhIGJvZHkgYXMgdGV4dCcpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYm9keVRleHQpXG4gICAgfVxuICB9XG5cbiAgaWYgKHN1cHBvcnQuZm9ybURhdGEpIHtcbiAgICB0aGlzLmZvcm1EYXRhID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy50ZXh0KCkudGhlbihkZWNvZGUpXG4gICAgfVxuICB9XG5cbiAgdGhpcy5qc29uID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudGV4dCgpLnRoZW4oSlNPTi5wYXJzZSlcbiAgfVxuXG4gIHJldHVybiB0aGlzXG59XG5cbi8vIEhUVFAgbWV0aG9kcyB3aG9zZSBjYXBpdGFsaXphdGlvbiBzaG91bGQgYmUgbm9ybWFsaXplZFxudmFyIG1ldGhvZHMgPSBbJ0NPTk5FQ1QnLCAnREVMRVRFJywgJ0dFVCcsICdIRUFEJywgJ09QVElPTlMnLCAnUEFUQ0gnLCAnUE9TVCcsICdQVVQnLCAnVFJBQ0UnXVxuXG5mdW5jdGlvbiBub3JtYWxpemVNZXRob2QobWV0aG9kKSB7XG4gIHZhciB1cGNhc2VkID0gbWV0aG9kLnRvVXBwZXJDYXNlKClcbiAgcmV0dXJuIG1ldGhvZHMuaW5kZXhPZih1cGNhc2VkKSA+IC0xID8gdXBjYXNlZCA6IG1ldGhvZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gUmVxdWVzdChpbnB1dCwgb3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUmVxdWVzdCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdQbGVhc2UgdXNlIHRoZSBcIm5ld1wiIG9wZXJhdG9yLCB0aGlzIERPTSBvYmplY3QgY29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLicpXG4gIH1cblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fVxuICB2YXIgYm9keSA9IG9wdGlvbnMuYm9keVxuXG4gIGlmIChpbnB1dCBpbnN0YW5jZW9mIFJlcXVlc3QpIHtcbiAgICBpZiAoaW5wdXQuYm9keVVzZWQpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FscmVhZHkgcmVhZCcpXG4gICAgfVxuICAgIHRoaXMudXJsID0gaW5wdXQudXJsXG4gICAgdGhpcy5jcmVkZW50aWFscyA9IGlucHV0LmNyZWRlbnRpYWxzXG4gICAgaWYgKCFvcHRpb25zLmhlYWRlcnMpIHtcbiAgICAgIHRoaXMuaGVhZGVycyA9IG5ldyBIZWFkZXJzKGlucHV0LmhlYWRlcnMpXG4gICAgfVxuICAgIHRoaXMubWV0aG9kID0gaW5wdXQubWV0aG9kXG4gICAgdGhpcy5tb2RlID0gaW5wdXQubW9kZVxuICAgIHRoaXMuc2lnbmFsID0gaW5wdXQuc2lnbmFsXG4gICAgaWYgKCFib2R5ICYmIGlucHV0Ll9ib2R5SW5pdCAhPSBudWxsKSB7XG4gICAgICBib2R5ID0gaW5wdXQuX2JvZHlJbml0XG4gICAgICBpbnB1dC5ib2R5VXNlZCA9IHRydWVcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhpcy51cmwgPSBTdHJpbmcoaW5wdXQpXG4gIH1cblxuICB0aGlzLmNyZWRlbnRpYWxzID0gb3B0aW9ucy5jcmVkZW50aWFscyB8fCB0aGlzLmNyZWRlbnRpYWxzIHx8ICdzYW1lLW9yaWdpbidcbiAgaWYgKG9wdGlvbnMuaGVhZGVycyB8fCAhdGhpcy5oZWFkZXJzKSB7XG4gICAgdGhpcy5oZWFkZXJzID0gbmV3IEhlYWRlcnMob3B0aW9ucy5oZWFkZXJzKVxuICB9XG4gIHRoaXMubWV0aG9kID0gbm9ybWFsaXplTWV0aG9kKG9wdGlvbnMubWV0aG9kIHx8IHRoaXMubWV0aG9kIHx8ICdHRVQnKVxuICB0aGlzLm1vZGUgPSBvcHRpb25zLm1vZGUgfHwgdGhpcy5tb2RlIHx8IG51bGxcbiAgdGhpcy5zaWduYWwgPSBvcHRpb25zLnNpZ25hbCB8fCB0aGlzLnNpZ25hbCB8fCAoZnVuY3Rpb24gKCkge1xuICAgIGlmICgnQWJvcnRDb250cm9sbGVyJyBpbiBnKSB7XG4gICAgICB2YXIgY3RybCA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgIHJldHVybiBjdHJsLnNpZ25hbDtcbiAgICB9XG4gIH0oKSk7XG4gIHRoaXMucmVmZXJyZXIgPSBudWxsXG5cbiAgaWYgKCh0aGlzLm1ldGhvZCA9PT0gJ0dFVCcgfHwgdGhpcy5tZXRob2QgPT09ICdIRUFEJykgJiYgYm9keSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0JvZHkgbm90IGFsbG93ZWQgZm9yIEdFVCBvciBIRUFEIHJlcXVlc3RzJylcbiAgfVxuICB0aGlzLl9pbml0Qm9keShib2R5KVxuXG4gIGlmICh0aGlzLm1ldGhvZCA9PT0gJ0dFVCcgfHwgdGhpcy5tZXRob2QgPT09ICdIRUFEJykge1xuICAgIGlmIChvcHRpb25zLmNhY2hlID09PSAnbm8tc3RvcmUnIHx8IG9wdGlvbnMuY2FjaGUgPT09ICduby1jYWNoZScpIHtcbiAgICAgIC8vIFNlYXJjaCBmb3IgYSAnXycgcGFyYW1ldGVyIGluIHRoZSBxdWVyeSBzdHJpbmdcbiAgICAgIHZhciByZVBhcmFtU2VhcmNoID0gLyhbPyZdKV89W14mXSovXG4gICAgICBpZiAocmVQYXJhbVNlYXJjaC50ZXN0KHRoaXMudXJsKSkge1xuICAgICAgICAvLyBJZiBpdCBhbHJlYWR5IGV4aXN0cyB0aGVuIHNldCB0aGUgdmFsdWUgd2l0aCB0aGUgY3VycmVudCB0aW1lXG4gICAgICAgIHRoaXMudXJsID0gdGhpcy51cmwucmVwbGFjZShyZVBhcmFtU2VhcmNoLCAnJDFfPScgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE90aGVyd2lzZSBhZGQgYSBuZXcgJ18nIHBhcmFtZXRlciB0byB0aGUgZW5kIHdpdGggdGhlIGN1cnJlbnQgdGltZVxuICAgICAgICB2YXIgcmVRdWVyeVN0cmluZyA9IC9cXD8vXG4gICAgICAgIHRoaXMudXJsICs9IChyZVF1ZXJ5U3RyaW5nLnRlc3QodGhpcy51cmwpID8gJyYnIDogJz8nKSArICdfPScgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFJlcXVlc3QodGhpcywge2JvZHk6IHRoaXMuX2JvZHlJbml0fSlcbn1cblxuZnVuY3Rpb24gZGVjb2RlKGJvZHkpIHtcbiAgdmFyIGZvcm0gPSBuZXcgRm9ybURhdGEoKVxuICBib2R5XG4gICAgLnRyaW0oKVxuICAgIC5zcGxpdCgnJicpXG4gICAgLmZvckVhY2goZnVuY3Rpb24oYnl0ZXMpIHtcbiAgICAgIGlmIChieXRlcykge1xuICAgICAgICB2YXIgc3BsaXQgPSBieXRlcy5zcGxpdCgnPScpXG4gICAgICAgIHZhciBuYW1lID0gc3BsaXQuc2hpZnQoKS5yZXBsYWNlKC9cXCsvZywgJyAnKVxuICAgICAgICB2YXIgdmFsdWUgPSBzcGxpdC5qb2luKCc9JykucmVwbGFjZSgvXFwrL2csICcgJylcbiAgICAgICAgZm9ybS5hcHBlbmQoZGVjb2RlVVJJQ29tcG9uZW50KG5hbWUpLCBkZWNvZGVVUklDb21wb25lbnQodmFsdWUpKVxuICAgICAgfVxuICAgIH0pXG4gIHJldHVybiBmb3JtXG59XG5cbmZ1bmN0aW9uIHBhcnNlSGVhZGVycyhyYXdIZWFkZXJzKSB7XG4gIHZhciBoZWFkZXJzID0gbmV3IEhlYWRlcnMoKVxuICAvLyBSZXBsYWNlIGluc3RhbmNlcyBvZiBcXHJcXG4gYW5kIFxcbiBmb2xsb3dlZCBieSBhdCBsZWFzdCBvbmUgc3BhY2Ugb3IgaG9yaXpvbnRhbCB0YWIgd2l0aCBhIHNwYWNlXG4gIC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMwI3NlY3Rpb24tMy4yXG4gIHZhciBwcmVQcm9jZXNzZWRIZWFkZXJzID0gcmF3SGVhZGVycy5yZXBsYWNlKC9cXHI/XFxuW1xcdCBdKy9nLCAnICcpXG4gIC8vIEF2b2lkaW5nIHNwbGl0IHZpYSByZWdleCB0byB3b3JrIGFyb3VuZCBhIGNvbW1vbiBJRTExIGJ1ZyB3aXRoIHRoZSBjb3JlLWpzIDMuNi4wIHJlZ2V4IHBvbHlmaWxsXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9naXRodWIvZmV0Y2gvaXNzdWVzLzc0OFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNzUxXG4gIHByZVByb2Nlc3NlZEhlYWRlcnNcbiAgICAuc3BsaXQoJ1xccicpXG4gICAgLm1hcChmdW5jdGlvbihoZWFkZXIpIHtcbiAgICAgIHJldHVybiBoZWFkZXIuaW5kZXhPZignXFxuJykgPT09IDAgPyBoZWFkZXIuc3Vic3RyKDEsIGhlYWRlci5sZW5ndGgpIDogaGVhZGVyXG4gICAgfSlcbiAgICAuZm9yRWFjaChmdW5jdGlvbihsaW5lKSB7XG4gICAgICB2YXIgcGFydHMgPSBsaW5lLnNwbGl0KCc6JylcbiAgICAgIHZhciBrZXkgPSBwYXJ0cy5zaGlmdCgpLnRyaW0oKVxuICAgICAgaWYgKGtleSkge1xuICAgICAgICB2YXIgdmFsdWUgPSBwYXJ0cy5qb2luKCc6JykudHJpbSgpXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaGVhZGVycy5hcHBlbmQoa2V5LCB2YWx1ZSlcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1Jlc3BvbnNlICcgKyBlcnJvci5tZXNzYWdlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgcmV0dXJuIGhlYWRlcnNcbn1cblxuQm9keS5jYWxsKFJlcXVlc3QucHJvdG90eXBlKVxuXG5leHBvcnQgZnVuY3Rpb24gUmVzcG9uc2UoYm9keUluaXQsIG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFJlc3BvbnNlKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1BsZWFzZSB1c2UgdGhlIFwibmV3XCIgb3BlcmF0b3IsIHRoaXMgRE9NIG9iamVjdCBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgY2FsbGVkIGFzIGEgZnVuY3Rpb24uJylcbiAgfVxuICBpZiAoIW9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0ge31cbiAgfVxuXG4gIHRoaXMudHlwZSA9ICdkZWZhdWx0J1xuICB0aGlzLnN0YXR1cyA9IG9wdGlvbnMuc3RhdHVzID09PSB1bmRlZmluZWQgPyAyMDAgOiBvcHRpb25zLnN0YXR1c1xuICBpZiAodGhpcy5zdGF0dXMgPCAyMDAgfHwgdGhpcy5zdGF0dXMgPiA1OTkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkZhaWxlZCB0byBjb25zdHJ1Y3QgJ1Jlc3BvbnNlJzogVGhlIHN0YXR1cyBwcm92aWRlZCAoMCkgaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzIwMCwgNTk5XS5cIilcbiAgfVxuICB0aGlzLm9rID0gdGhpcy5zdGF0dXMgPj0gMjAwICYmIHRoaXMuc3RhdHVzIDwgMzAwXG4gIHRoaXMuc3RhdHVzVGV4dCA9IG9wdGlvbnMuc3RhdHVzVGV4dCA9PT0gdW5kZWZpbmVkID8gJycgOiAnJyArIG9wdGlvbnMuc3RhdHVzVGV4dFxuICB0aGlzLmhlYWRlcnMgPSBuZXcgSGVhZGVycyhvcHRpb25zLmhlYWRlcnMpXG4gIHRoaXMudXJsID0gb3B0aW9ucy51cmwgfHwgJydcbiAgdGhpcy5faW5pdEJvZHkoYm9keUluaXQpXG59XG5cbkJvZHkuY2FsbChSZXNwb25zZS5wcm90b3R5cGUpXG5cblJlc3BvbnNlLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFJlc3BvbnNlKHRoaXMuX2JvZHlJbml0LCB7XG4gICAgc3RhdHVzOiB0aGlzLnN0YXR1cyxcbiAgICBzdGF0dXNUZXh0OiB0aGlzLnN0YXR1c1RleHQsXG4gICAgaGVhZGVyczogbmV3IEhlYWRlcnModGhpcy5oZWFkZXJzKSxcbiAgICB1cmw6IHRoaXMudXJsXG4gIH0pXG59XG5cblJlc3BvbnNlLmVycm9yID0gZnVuY3Rpb24oKSB7XG4gIHZhciByZXNwb25zZSA9IG5ldyBSZXNwb25zZShudWxsLCB7c3RhdHVzOiAyMDAsIHN0YXR1c1RleHQ6ICcnfSlcbiAgcmVzcG9uc2Uub2sgPSBmYWxzZVxuICByZXNwb25zZS5zdGF0dXMgPSAwXG4gIHJlc3BvbnNlLnR5cGUgPSAnZXJyb3InXG4gIHJldHVybiByZXNwb25zZVxufVxuXG52YXIgcmVkaXJlY3RTdGF0dXNlcyA9IFszMDEsIDMwMiwgMzAzLCAzMDcsIDMwOF1cblxuUmVzcG9uc2UucmVkaXJlY3QgPSBmdW5jdGlvbih1cmwsIHN0YXR1cykge1xuICBpZiAocmVkaXJlY3RTdGF0dXNlcy5pbmRleE9mKHN0YXR1cykgPT09IC0xKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgc3RhdHVzIGNvZGUnKVxuICB9XG5cbiAgcmV0dXJuIG5ldyBSZXNwb25zZShudWxsLCB7c3RhdHVzOiBzdGF0dXMsIGhlYWRlcnM6IHtsb2NhdGlvbjogdXJsfX0pXG59XG5cbmV4cG9ydCB2YXIgRE9NRXhjZXB0aW9uID0gZy5ET01FeGNlcHRpb25cbnRyeSB7XG4gIG5ldyBET01FeGNlcHRpb24oKVxufSBjYXRjaCAoZXJyKSB7XG4gIERPTUV4Y2VwdGlvbiA9IGZ1bmN0aW9uKG1lc3NhZ2UsIG5hbWUpIHtcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlXG4gICAgdGhpcy5uYW1lID0gbmFtZVxuICAgIHZhciBlcnJvciA9IEVycm9yKG1lc3NhZ2UpXG4gICAgdGhpcy5zdGFjayA9IGVycm9yLnN0YWNrXG4gIH1cbiAgRE9NRXhjZXB0aW9uLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKVxuICBET01FeGNlcHRpb24ucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRE9NRXhjZXB0aW9uXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmZXRjaChpbnB1dCwgaW5pdCkge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgdmFyIHJlcXVlc3QgPSBuZXcgUmVxdWVzdChpbnB1dCwgaW5pdClcblxuICAgIGlmIChyZXF1ZXN0LnNpZ25hbCAmJiByZXF1ZXN0LnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICByZXR1cm4gcmVqZWN0KG5ldyBET01FeGNlcHRpb24oJ0Fib3J0ZWQnLCAnQWJvcnRFcnJvcicpKVxuICAgIH1cblxuICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxuXG4gICAgZnVuY3Rpb24gYWJvcnRYaHIoKSB7XG4gICAgICB4aHIuYWJvcnQoKVxuICAgIH1cblxuICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICBzdGF0dXNUZXh0OiB4aHIuc3RhdHVzVGV4dCxcbiAgICAgICAgaGVhZGVyczogcGFyc2VIZWFkZXJzKHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSB8fCAnJylcbiAgICAgIH1cbiAgICAgIC8vIFRoaXMgY2hlY2sgaWYgc3BlY2lmaWNhbGx5IGZvciB3aGVuIGEgdXNlciBmZXRjaGVzIGEgZmlsZSBsb2NhbGx5IGZyb20gdGhlIGZpbGUgc3lzdGVtXG4gICAgICAvLyBPbmx5IGlmIHRoZSBzdGF0dXMgaXMgb3V0IG9mIGEgbm9ybWFsIHJhbmdlXG4gICAgICBpZiAocmVxdWVzdC51cmwuaW5kZXhPZignZmlsZTovLycpID09PSAwICYmICh4aHIuc3RhdHVzIDwgMjAwIHx8IHhoci5zdGF0dXMgPiA1OTkpKSB7XG4gICAgICAgIG9wdGlvbnMuc3RhdHVzID0gMjAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3B0aW9ucy5zdGF0dXMgPSB4aHIuc3RhdHVzO1xuICAgICAgfVxuICAgICAgb3B0aW9ucy51cmwgPSAncmVzcG9uc2VVUkwnIGluIHhociA/IHhoci5yZXNwb25zZVVSTCA6IG9wdGlvbnMuaGVhZGVycy5nZXQoJ1gtUmVxdWVzdC1VUkwnKVxuICAgICAgdmFyIGJvZHkgPSAncmVzcG9uc2UnIGluIHhociA/IHhoci5yZXNwb25zZSA6IHhoci5yZXNwb25zZVRleHRcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlc29sdmUobmV3IFJlc3BvbnNlKGJvZHksIG9wdGlvbnMpKVxuICAgICAgfSwgMClcbiAgICB9XG5cbiAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBUeXBlRXJyb3IoJ05ldHdvcmsgcmVxdWVzdCBmYWlsZWQnKSlcbiAgICAgIH0sIDApXG4gICAgfVxuXG4gICAgeGhyLm9udGltZW91dCA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBUeXBlRXJyb3IoJ05ldHdvcmsgcmVxdWVzdCB0aW1lZCBvdXQnKSlcbiAgICAgIH0sIDApXG4gICAgfVxuXG4gICAgeGhyLm9uYWJvcnQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlamVjdChuZXcgRE9NRXhjZXB0aW9uKCdBYm9ydGVkJywgJ0Fib3J0RXJyb3InKSlcbiAgICAgIH0sIDApXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZml4VXJsKHVybCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVybCA9PT0gJycgJiYgZy5sb2NhdGlvbi5ocmVmID8gZy5sb2NhdGlvbi5ocmVmIDogdXJsXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiB1cmxcbiAgICAgIH1cbiAgICB9XG5cbiAgICB4aHIub3BlbihyZXF1ZXN0Lm1ldGhvZCwgZml4VXJsKHJlcXVlc3QudXJsKSwgdHJ1ZSlcblxuICAgIGlmIChyZXF1ZXN0LmNyZWRlbnRpYWxzID09PSAnaW5jbHVkZScpIHtcbiAgICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSB0cnVlXG4gICAgfSBlbHNlIGlmIChyZXF1ZXN0LmNyZWRlbnRpYWxzID09PSAnb21pdCcpIHtcbiAgICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSBmYWxzZVxuICAgIH1cblxuICAgIGlmICgncmVzcG9uc2VUeXBlJyBpbiB4aHIpIHtcbiAgICAgIGlmIChzdXBwb3J0LmJsb2IpIHtcbiAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdibG9iJ1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgc3VwcG9ydC5hcnJheUJ1ZmZlclxuICAgICAgKSB7XG4gICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAnYXJyYXlidWZmZXInXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGluaXQgJiYgdHlwZW9mIGluaXQuaGVhZGVycyA9PT0gJ29iamVjdCcgJiYgIShpbml0LmhlYWRlcnMgaW5zdGFuY2VvZiBIZWFkZXJzIHx8IChnLkhlYWRlcnMgJiYgaW5pdC5oZWFkZXJzIGluc3RhbmNlb2YgZy5IZWFkZXJzKSkpIHtcbiAgICAgIHZhciBuYW1lcyA9IFtdO1xuICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoaW5pdC5oZWFkZXJzKS5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgbmFtZXMucHVzaChub3JtYWxpemVOYW1lKG5hbWUpKVxuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihuYW1lLCBub3JtYWxpemVWYWx1ZShpbml0LmhlYWRlcnNbbmFtZV0pKVxuICAgICAgfSlcbiAgICAgIHJlcXVlc3QuaGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgICAgIGlmIChuYW1lcy5pbmRleE9mKG5hbWUpID09PSAtMSkge1xuICAgICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKG5hbWUsIHZhbHVlKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICByZXF1ZXN0LmhlYWRlcnMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihuYW1lLCB2YWx1ZSlcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3Quc2lnbmFsKSB7XG4gICAgICByZXF1ZXN0LnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0WGhyKVxuXG4gICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIERPTkUgKHN1Y2Nlc3Mgb3IgZmFpbHVyZSlcbiAgICAgICAgaWYgKHhoci5yZWFkeVN0YXRlID09PSA0KSB7XG4gICAgICAgICAgcmVxdWVzdC5zaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBhYm9ydFhocilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHhoci5zZW5kKHR5cGVvZiByZXF1ZXN0Ll9ib2R5SW5pdCA9PT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogcmVxdWVzdC5fYm9keUluaXQpXG4gIH0pXG59XG5cbmZldGNoLnBvbHlmaWxsID0gdHJ1ZVxuXG5pZiAoIWcuZmV0Y2gpIHtcbiAgZy5mZXRjaCA9IGZldGNoXG4gIGcuSGVhZGVycyA9IEhlYWRlcnNcbiAgZy5SZXF1ZXN0ID0gUmVxdWVzdFxuICBnLlJlc3BvbnNlID0gUmVzcG9uc2Vcbn1cbiIsImltcG9ydCAnLi9yZWFjdC1zaGltJzsgLy8gRmFsbGJhY2s7IG5vcm1hbGx5IGxvYWRlZCBzdGFuZGFsb25lIHJpZ2h0IGFmdGVyIFJlYWN0XG5pbXBvcnQge0Rhc2hSZW5kZXJlcn0gZnJvbSAnLi9EYXNoUmVuZGVyZXInO1xuaW1wb3J0ICcuL3V0aWxzL2NsaWVudHNpZGVGdW5jdGlvbnMnO1xuXG4vLyBtYWtlIERhc2hSZW5kZXJlciBnbG9iYWxseSBhdmFpbGFibGVcbndpbmRvdy5EYXNoUmVuZGVyZXIgPSBEYXNoUmVuZGVyZXI7XG4iXSwibmFtZXMiOlsiUHJvcFR5cGVzIiwiUmVhY3QiLCJ1c2VTdGF0ZSIsInVzZUVmZmVjdCIsIlByb3ZpZGVyIiwiU3RvcmUiLCJBcHBDb250YWluZXIiLCJnZXRDb25maWdGcm9tRE9NIiwiaW5pdGlhbGl6ZVdlYlNvY2tldCIsImRpc2Nvbm5lY3RXZWJTb2NrZXQiLCJBcHBQcm92aWRlciIsIl9yZWYiLCJfcmVmJGhvb2tzIiwiaG9va3MiLCJsYXlvdXRfcHJlIiwibGF5b3V0X3Bvc3QiLCJyZXF1ZXN0X3ByZSIsInJlcXVlc3RfcG9zdCIsImNhbGxiYWNrX3Jlc29sdmVkIiwicmVxdWVzdF9yZWZyZXNoX2p3dCIsIl91c2VTdGF0ZSIsIl91c2VTdGF0ZTIiLCJfc2xpY2VkVG9BcnJheSIsInN0b3JlIiwiX2NvbmZpZyR3ZWJzb2NrZXQiLCJfY29uZmlnJHdlYnNvY2tldDIiLCJjb25maWciLCJ3ZWJzb2NrZXQiLCJ1cmwiLCJ3b3JrZXJfdXJsIiwiZnVsbENvbmZpZyIsIl9vYmplY3RTcHJlYWQiLCJmZXRjaCIsImNyZWRlbnRpYWxzIiwiaGVhZGVycyIsIkFjY2VwdCIsImNyZWF0ZUVsZW1lbnQiLCJwcm9wVHlwZXMiLCJzaGFwZSIsImZ1bmMiLCJhbnkiLCJmaWx0ZXIiLCJtYXAiLCJwYXRoIiwiU3RvcmVPYnNlcnZlciIsIl9jcmVhdGVDbGFzcyIsIl90aGlzIiwiX2NsYXNzQ2FsbENoZWNrIiwiX2RlZmluZVByb3BlcnR5Iiwib2JzZXJ2ZXIiLCJpbnB1dHMiLCJBcnJheSIsImlzQXJyYXkiLCJFcnJvciIsImFkZCIsInJlbW92ZSIsIl9fZmluYWxpemVfXyIsIl9faW5pdF9fIiwiX3RoaXMkX3Vuc3Vic2NyaWJlIiwiX3Vuc3Vic2NyaWJlIiwiY2FsbCIsIl9zdG9yZSIsInN1YnNjcmliZSIsIm5vdGlmeSIsIl9vYnNlcnZlcnMiLCJmb3JFYWNoIiwibyIsImxhc3RTdGF0ZSIsInB1c2giLCJpbnB1dFBhdGhzIiwicCIsInNwbGl0IiwidHJpZ2dlcmVkIiwic3RhdGUiLCJnZXRTdGF0ZSIsImkiLCJzcGxpY2UiLCJmaW5kSW5kZXgiLCJkZWZhdWx0IiwiZSIsInQiLCJyIiwiU3ltYm9sIiwibiIsIml0ZXJhdG9yIiwidG9TdHJpbmdUYWciLCJjIiwicHJvdG90eXBlIiwiR2VuZXJhdG9yIiwidSIsIk9iamVjdCIsImNyZWF0ZSIsIl9yZWdlbmVyYXRvckRlZmluZTIiLCJmIiwieSIsIkciLCJ2IiwiYSIsImQiLCJiaW5kIiwibGVuZ3RoIiwibCIsIlR5cGVFcnJvciIsImRvbmUiLCJ2YWx1ZSIsInJldHVybiIsIkdlbmVyYXRvckZ1bmN0aW9uIiwiR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUiLCJnZXRQcm90b3R5cGVPZiIsInNldFByb3RvdHlwZU9mIiwiX19wcm90b19fIiwiZGlzcGxheU5hbWUiLCJfcmVnZW5lcmF0b3IiLCJ3IiwibSIsImRlZmluZVByb3BlcnR5IiwiX3JlZ2VuZXJhdG9yRGVmaW5lIiwiX2ludm9rZSIsImVudW1lcmFibGUiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsImFzeW5jR2VuZXJhdG9yU3RlcCIsIlByb21pc2UiLCJyZXNvbHZlIiwidGhlbiIsIl9hc3luY1RvR2VuZXJhdG9yIiwiYXJndW1lbnRzIiwiYXBwbHkiLCJfbmV4dCIsIl90aHJvdyIsIl90b0NvbnN1bWFibGVBcnJheSIsIl9hcnJheVdpdGhvdXRIb2xlcyIsIl9pdGVyYWJsZVRvQXJyYXkiLCJfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkiLCJfbm9uSXRlcmFibGVTcHJlYWQiLCJmcm9tIiwiX2FycmF5TGlrZVRvQXJyYXkiLCJfYXJyYXlXaXRoSG9sZXMiLCJfaXRlcmFibGVUb0FycmF5TGltaXQiLCJfbm9uSXRlcmFibGVSZXN0IiwidG9TdHJpbmciLCJzbGljZSIsImNvbnN0cnVjdG9yIiwibmFtZSIsInRlc3QiLCJuZXh0Iiwib3duS2V5cyIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsIl90b1Byb3BlcnR5S2V5IiwiX3RvUHJpbWl0aXZlIiwiX3R5cGVvZiIsInRvUHJpbWl0aXZlIiwiU3RyaW5nIiwiTnVtYmVyIiwiY29uY2F0IiwiZmxhdHRlbiIsImludGVyc2VjdGlvbiIsIm1lcmdlRGVlcFJpZ2h0IiwicGljayIsInBsdWNrIiwidmFsdWVzIiwidG9QYWlycyIsInppcCIsImFzc29jUGF0aCIsIlNUQVRVUyIsIkpXVF9FWFBJUkVEX01FU1NBR0UiLCJNQVhfQVVUSF9SRVRSSUVTIiwiQ2FsbGJhY2tBY3Rpb25UeXBlIiwiQ2FsbGJhY2tBZ2dyZWdhdGVBY3Rpb25UeXBlIiwiaXNNdWx0aVZhbHVlZCIsInN0cmluZ2lmeUlkIiwiaXNNdWx0aU91dHB1dFByb3AiLCJ1cmxCYXNlIiwiZ2V0Q1NSRkhlYWRlciIsImRpc3BhdGNoRXJyb3IiLCJzZXRQYXRocyIsImNyZWF0ZUFjdGlvbiIsImFkZEh0dHBIZWFkZXJzIiwibm90aWZ5T2JzZXJ2ZXJzIiwidXBkYXRlUHJvcHMiLCJpc1BhdGNoIiwicGFyc2VQYXRjaFByb3BzIiwiY3JlYXRlUGF0Y2hBbmFseXNpcyIsImNvbXB1dGVQYXRocyIsImdldFBhdGgiLCJyZXF1ZXN0RGVwZW5kZW5jaWVzIiwibG9hZExpYnJhcnkiLCJnZXRTdHJlYW1DbGllbnQiLCJpc1N0cmVhbU11bHRpcGxleGVkIiwicGFyc2VQTUNJZCIsInJlcGxhY2VQTUMiLCJsb2FkZWQiLCJsb2FkaW5nIiwiZ2V0Q29tcG9uZW50TGF5b3V0IiwiZ2V0V29ya2VyQ2xpZW50IiwiaXNXZWJTb2NrZXRFbmFibGVkIiwiaXNXZWJTb2NrZXRBdmFpbGFibGUiLCJhZGRCbG9ja2VkQ2FsbGJhY2tzIiwiQWRkQmxvY2tlZCIsImFkZENvbXBsZXRlZENhbGxiYWNrcyIsIkFkZENvbXBsZXRlZCIsImFkZEV4ZWN1dGVkQ2FsbGJhY2tzIiwiQWRkRXhlY3V0ZWQiLCJhZGRFeGVjdXRpbmdDYWxsYmFja3MiLCJBZGRFeGVjdXRpbmciLCJhZGRQcmlvcml0aXplZENhbGxiYWNrcyIsIkFkZFByaW9yaXRpemVkIiwiYWRkUmVxdWVzdGVkQ2FsbGJhY2tzIiwiQWRkUmVxdWVzdGVkIiwiYWRkU3RvcmVkQ2FsbGJhY2tzIiwiQWRkU3RvcmVkIiwiYWRkV2F0Y2hlZENhbGxiYWNrcyIsIkFkZFdhdGNoZWQiLCJyZW1vdmVFeGVjdXRlZENhbGxiYWNrcyIsIlJlbW92ZUV4ZWN1dGVkIiwicmVtb3ZlQmxvY2tlZENhbGxiYWNrcyIsIlJlbW92ZUJsb2NrZWQiLCJyZW1vdmVFeGVjdXRpbmdDYWxsYmFja3MiLCJSZW1vdmVFeGVjdXRpbmciLCJyZW1vdmVQcmlvcml0aXplZENhbGxiYWNrcyIsIlJlbW92ZVByaW9yaXRpemVkIiwicmVtb3ZlUmVxdWVzdGVkQ2FsbGJhY2tzIiwiUmVtb3ZlUmVxdWVzdGVkIiwicmVtb3ZlU3RvcmVkQ2FsbGJhY2tzIiwiUmVtb3ZlU3RvcmVkIiwicmVtb3ZlV2F0Y2hlZENhbGxiYWNrcyIsIlJlbW92ZVdhdGNoZWQiLCJhZ2dyZWdhdGVDYWxsYmFja3MiLCJBZ2dyZWdhdGUiLCJ1cGRhdGVSZXNvdXJjZVVzYWdlIiwiYWRkQ2FsbGJhY2tKb2IiLCJyZW1vdmVDYWxsYmFja0pvYiIsInNldENhbGxiYWNrSm9iT3V0ZGF0ZWQiLCJ1bndyYXBJZk5vdE11bHRpIiwicGF0aHMiLCJpZFByb3BzIiwic3BlYyIsImFueVZhbHMiLCJkZXBUeXBlIiwibXNnIiwiYWxsb3dfb3B0aW9uYWwiLCJpc1N0ciIsImlkIiwiSlNPTiIsInN0cmluZ2lmeSIsInByb3BlcnR5Iiwic3RycyIsImpvaW4iLCJmaWxsVmFscyIsImxheW91dCIsImNiIiwic3BlY3MiLCJhbGxvd0FsbE1pc3NpbmciLCJ1bmRlZmluZWQiLCJnZXR0ZXIiLCJnZXRJbnB1dHMiLCJlcnJvcnMiLCJlbXB0eU11bHRpVmFsdWVzIiwiaW5wdXRWYWxzIiwiaW5wdXRMaXN0IiwiX3Vud3JhcElmTm90TXVsdGkiLCJwYXRoXyIsIl91bndyYXBJZk5vdE11bHRpMiIsImlucHV0RXJyb3IiLCJyZWZFcnIiLCJlcnIiLCJpbmRleE9mIiwiY29uc29sZSIsImVycm9yIiwib2JqcyIsIlJlZmVyZW5jZUVycm9yIiwiZ2V0VmFscyIsImlucHV0IiwiemlwSWZBcnJheSIsImIiLCJ3aW5kb3ciLCJkYXNoX2NsaWVudHNpZGUiLCJub191cGRhdGUiLCJjbGVhbk91dHB1dFByb3AiLCJwYXRjaGVkUmVzdWx0RmllbGRzIiwicGF0Y2hlZE91dHB1dHMiLCJhcHBseVBhdGNoZWRPdXRwdXRzIiwib3V0cHV0cyIsImN1cnJlbnRMYXlvdXQiLCJkYXRhIiwib3V0IiwicHJvcE5hbWUiLCJvdXRwdXRQYXRoIiwiaWRTdHIiLCJkYXRhUGF0aCIsIm91dHB1dFZhbHVlIiwib2xkUHJvcHMiLCJuZXdQcm9wcyIsImhhbmRsZUNsaWVudHNpZGUiLCJfeCIsIl94MiIsIl94MyIsIl94NCIsIl9oYW5kbGVDbGllbnRzaWRlIiwiX2NhbGxlZTUiLCJkaXNwYXRjaCIsImNsaWVudHNpZGVfZnVuY3Rpb24iLCJwYXlsb2FkIiwiZGMiLCJyZXF1ZXN0VGltZSIsImlucHV0RGljdCIsInN0YXRlRGljdCIsInJlc3VsdCIsInN0YXR1cyIsIl9kYyRuYW1lc3BhY2UiLCJfcmV0dXJuVmFsdWUiLCJuYW1lc3BhY2UiLCJmdW5jdGlvbl9uYW1lIiwiYXJncyIsInJldHVyblZhbHVlIiwidG90YWxUaW1lIiwicmVzb3VyY2VzIiwiX3Q4IiwiX2NvbnRleHQ1IiwiZGVzY3JpcHRpb24iLCJEYXRlIiwibm93IiwiaW5wdXRzVG9EaWN0IiwiT0siLCJjYWxsYmFja19jb250ZXh0IiwiY2hhbmdlZFByb3BJZHMiLCJwcm9wX2lkIiwidHJpZ2dlcmVkX2lkIiwiZ2V0VHJpZ2dlcmVkSWQiLCJpbnB1dHNfbGlzdCIsInN0YXRlc19saXN0Iiwic3RhdGVzIiwib3V0cHV0c19saXN0IiwiX3JlZjE3IiwiX3JlZjE4Iiwib3V0aSIsInJldGkiLCJfcmVmMTkiLCJfcmVmMjAiLCJvdXRpaiIsInJldGlqIiwiZGF0YUZvcklkIiwiUHJldmVudFVwZGF0ZSIsIlBSRVZFTlRfVVBEQVRFIiwiQ0xJRU5UU0lERV9FUlJPUiIsIl9fZGFzaF9zZXJ2ZXIiLCJfX2Rhc2hfY2xpZW50IiwiX19kYXNoX3VwbG9hZCIsIl9fZGFzaF9kb3dubG9hZCIsInVpIiwib3V0cHV0IiwidXNhZ2UiLCJ1cGRhdGVDb21wb25lbnQiLCJjb21wb25lbnRfaWQiLCJwcm9wcyIsIl9nZXRTdGF0ZSIsImNvbXBvbmVudFBhdGgiLCJzdXBwcmVzc19jYWxsYmFja19leGNlcHRpb25zIiwiaXRlbXBhdGgiLCJyZW5kZXJUeXBlIiwic2lkZVVwZGF0ZSIsInJlZHVjZSIsImFjYyIsIl9yZWYyIiwiX3JlZjMiLCJjb21wb25lbnRJZCIsInJlcGxhY2VkSWRzIiwic3RhcnRzV2l0aCIsIl9wYXJzZVBNQ0lkIiwiX3BhcnNlUE1DSWQyIiwiaW5jbHVkZXMiLCJfaWQkc3BsaXQiLCJfaWQkc3BsaXQyIiwicmVwIiwiX3JlZjQiLCJfb2xkQ29tcG9uZW50IiwiX3JlZjUiLCJvbGRDb21wb25lbnQiLCJwYXRjaGVkUHJvcHMiLCJldmVudHMiLCJhcHBseVN0cmVhbUZyYW1lIiwiZnJhbWUiLCJyZXNwb25zZSIsImZsYXQiLCJfcmVmNiIsIl9yZWY3IiwiX3JlZjgiLCJfcmVmOSIsInByb3AiLCJoYW5kbGVTdHJlYW1DYWxsYmFjayIsIl94NSIsIl94NiIsIl94NyIsIl94OCIsIl9oYW5kbGVTdHJlYW1DYWxsYmFjayIsIl9jYWxsZWU2IiwicnVubmluZyIsInJ1bm5pbmdPZmYiLCJpbml0IiwiX2NvbnRleHQ2IiwicnVuIiwiZW5kX2lkIiwiZGlzdCIsImFsbCIsImhhbmRsZVNlcnZlcnNpZGUiLCJiYWNrZ3JvdW5kIiwiYWRkaXRpb25hbEFyZ3MiLCJjb21wcmVzc1BheWxvYWQiLCJjb21wcmVzc1RocmVzaG9sZCIsImJvZHkiLCJjYWNoZUtleSIsImpvYiIsInByb2dyZXNzRGVmYXVsdCIsIm1vcmVBcmdzIiwiZmV0Y2hDYWxsYmFjayIsIl9yZWYwIiwiX2NhbGxlZSIsIm5ld0JvZHkiLCJhZGRBcmciLCJ0bXBCb2R5IiwiX2kiLCJmZXRjaEJvZHkiLCJzdHJlYW0iLCJfdCIsIl9jb250ZXh0IiwiZGVsaW0iLCJwYXJzZSIsIl9yZWYxIiwiX3JlZjEwIiwia2V5IiwiX3JlZjExIiwiX3JlZjEyIiwiXyIsIl9fIiwic2luZ2xlIiwiQmxvYiIsInBpcGVUaHJvdWdoIiwiQ29tcHJlc3Npb25TdHJlYW0iLCJSZXNwb25zZSIsImJsb2IiLCJ3YXJuIiwibWV0aG9kIiwicmVqZWN0IiwiaGFuZGxlT3V0cHV0IiwicmVzIiwiY2FsbGJhY2tKb2IiLCJjYWxsYmFja0pvYnMiLCJvdXRkYXRlZCIsImpvYklkIiwicmVjb3JkUHJvZmlsZSIsImdldCIsInRpbWluZ0hlYWRlcnMiLCJoZWFkZXIiLCJkdXIiLCJtYXRjaCIsImZpbmlzaExpbmUiLCJtdWx0aSIsInN1YnN0ciIsImxhc3RJbmRleE9mIiwiY29tcGxldGVKb2IiLCJoYW5kbGVTdHJlYW1lZFJlc3BvbnNlIiwiX3JlZjEzIiwiX2NhbGxlZTMiLCJzdHJlYW1SZXMiLCJyZWFkZXIiLCJkZWNvZGVyIiwiYnVmZmVyIiwibGFzdFJlc3BvbnNlIiwiZmluaXNoZWQiLCJwcm9jZXNzRnJhbWUiLCJfeWllbGQkcmVhZGVyJHJlYWQiLCJsaW5lcyIsIl9pdGVyYXRvciIsIl9zdGVwIiwibGluZSIsIl90MiIsIl90MyIsIl9jb250ZXh0MyIsImdldFJlYWRlciIsIlRleHREZWNvZGVyIiwiX3JlZjE0IiwiX2NhbGxlZTIiLCJfY29udGV4dDIiLCJtZXNzYWdlIiwiX3gwIiwicmVhZCIsImRlY29kZSIsInBvcCIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwicyIsInRyaW0iLCJjYW5jZWwiLCJfeDkiLCJjb250ZW50VHlwZSIsImpzb24iLCJqb2JJbmZvIiwiY2FuY2VsSW5wdXRzIiwicHJvZ3Jlc3MiLCJzZXRUaW1lb3V0IiwiaGFuZGxlIiwiaW50ZXJ2YWwiLCJoYW5kbGVFcnJvciIsIk5PX1JFU1BPTlNFIiwiaGFuZGxlV2Vic29ja2V0Q2FsbGJhY2siLCJfeDEiLCJfeDEwIiwiX3gxMSIsIl94MTIiLCJfeDEzIiwiX2hhbmRsZVdlYnNvY2tldENhbGxiYWNrIiwiX2NhbGxlZTciLCJ3b3JrZXJDbGllbnQiLCJsYXN0U3RyZWFtUmVzcG9uc2UiLCJfdG90YWxUaW1lIiwiY2FsbGJhY2tEYXRhIiwiX3JlZjIxIiwiY2FsbGJhY2tSZXNwb25zZSIsIl90b3RhbFRpbWUyIiwiX3Q5IiwiX2NvbnRleHQ3IiwiZW5zdXJlQ29ubmVjdGVkIiwic2VuZENhbGxiYWNrIiwiaW5wdXRzaSIsImlpIiwiX2lucHV0c2kkaWkkdmFsdWUiLCJpZF9zdHIiLCJfaW5wdXRzX2xpc3QkaSR2YWx1ZSIsInRyaWciLCJzdWJzdHJpbmciLCJleGVjdXRlQ2FsbGJhY2siLCJfcmVmMTUiLCJhbGxPdXRwdXRzIiwiX2NiJGNhbGxiYWNrIiwiY2FsbGJhY2siLCJkeW5hbWljX2NyZWF0b3IiLCJpblZhbHMiLCJleGVjdXRpb25Qcm9taXNlIiwib3V0cHV0RXJyb3JzIiwiX3Vud3JhcElmTm90TXVsdGkzIiwiX3Vud3JhcElmTm90TXVsdGk0IiwiZXJyaSIsIl9fZXhlY3V0ZSIsIl9yZWYxNiIsIl9jYWxsZWU0IiwibG9hZGluZ091dHB1dHMiLCJwYXJzZWRDaGFuZ2VkUHJvcHNJZHMiLCJfYXBwbHlQYXRjaGVkT3V0cHV0cyIsInBhdGNoZWREYXRhIiwibmV3Q29uZmlnIiwibmV3SGVhZGVycyIsImxhc3RFcnJvciIsImpzb25PdXRwdXQiLCJ1c2VXZWJTb2NrZXQiLCJ1c2VTdHJlYW0iLCJyZXRyeSIsIl9kYXRhIiwiX3N0cmVhbUVyciRtZXNzYWdlIiwiX2FwcGx5UGF0Y2hlZE91dHB1dHMyIiwiX3BhdGNoZWREYXRhIiwiX3BhdGNoZWRPdXRwdXRzIiwib2xkSnd0IiwibmV3Snd0IiwiX3Q0IiwiX3Q1IiwiX3Q2IiwiX3Q3IiwiX2NvbnRleHQ0IiwiX291dCRwcm9wZXJ0eSIsInByb3BJZCIsImludGVyIiwiY29tcHJlc3NfcGF5bG9hZCIsImNvbXByZXNzX3RocmVzaG9sZCIsIlVOQVVUSE9SSVpFRCIsIkJBRF9SRVFVRVNUIiwidGV4dCIsIkF1dGhvcml6YXRpb24iLCJuZXdDYiIsImFzc29jIiwiZGlmZmVyZW5jZSIsImlzRW1wdHkiLCJtZXJnZVdpdGgiLCJwYXJ0aXRpb24iLCJwaWNrQnkiLCJ6aXBPYmoiLCJhZGRBbGxSZXNvbHZlZEZyb21PdXRwdXRzIiwiZ2V0QW55VmFscyIsImdldFVuZmlsdGVyZWRMYXlvdXRDYWxsYmFja3MiLCJpZE1hdGNoIiwicGFydGlhbElkTWF0Y2giLCJzcGxpdElkQW5kUHJvcCIsIkRJUkVDVCIsIklORElSRUNUIiwibWVyZ2VNYXgiLCJNYXRoIiwibWF4IiwiY29tYmluZUlkQW5kUHJvcCIsImdldENhbGxiYWNrc0J5SW5wdXQiLCJncmFwaHMiLCJjaGFuZ2VUeXBlIiwid2l0aFByaW9yaXR5IiwibWF0Y2hlcyIsImlkQW5kUHJvcCIsImNhbGxiYWNrcyIsImlucHV0TWFwIiwicmVzb2x2ZURlcHMiLCJpZEtleXMiLCJzb3J0IiwidmFscyIsImlkS2V5U3RyIiwicGF0dGVybnMiLCJpbnB1dFBhdHRlcm5zIiwicGF0dGVybiIsInBhcnRpYWwiLCJ0cmlnZ2VyQW55VmFscyIsInBhdHRlcm5SZWZWYWxzIiwiayIsInJlc29sdmVQYXJ0aWFsRGVwcyIsImhhc1BhcnRpYWxJbnB1dFBhdHRlcm5zIiwicGF0S2V5U3RyIiwicGFydGlhbElucHV0UGF0dGVybnMiLCJwYXRLZXlzIiwiZXZlcnkiLCJwYXRQcm9wUGF0dGVybnMiLCJwcmlvcml0eSIsImdldFByaW9yaXR5IiwidG91Y2hlZE91dHB1dHMiLCJ0b3VjaGVkQ2JJZHMiLCJ0b3VjaGVkIiwicmVzb2x2ZWRJZCIsImdldE91dHB1dHMiLCJ1bnNoaWZ0IiwibWluIiwiZ2V0QWxsU3Vic2VxdWVudE91dHB1dHNGb3JDYWxsYmFjayIsImdldFJlYWR5Q2FsbGJhY2tzIiwiY2FuZGlkYXRlcyIsIm91dHB1dHNNYXAiLCJhbGxUb3VjaGVkT3V0cHV0cyIsImFzc2lnbiIsImRpZmZlcmVuY2VCYXNlZE9uSWQiLCJzb21lIiwiY2JwIiwiZ2V0TGF5b3V0Q2FsbGJhY2tzIiwib3B0aW9ucyIsImV4Y2x1c2lvbnMiLCJfcGFydGl0aW9uIiwiX3BhcnRpdGlvbjIiLCJpbmNsdWRlZCIsImV4Y2x1ZGVkIiwiZmlsdGVyUm9vdCIsInJvb3RJZCIsInByZXZpb3VzIiwiZXhlY3V0aW9uR3JvdXAiLCJyYW5kb20iLCJnZXRVbmlxdWVJZGVudGlmaWVyIiwiX3JlZjYkY2FsbGJhY2siLCJpZFBhcnRzIiwiaW5jbHVkZU9ic2VydmVycyIsInByb3BlcnRpZXMiLCJtYWtlUmVzb2x2ZWRDYWxsYmFjayIsImluaXRpYWxDYWxsIiwicHJ1bmVDYWxsYmFja3MiLCJfcGFydGl0aW9uMyIsIl9wYXJ0aXRpb240IiwicmVtb3ZlZCIsIl9wYXJ0aXRpb241IiwiX3BhcnRpdGlvbjYiLCJtb2RpZmllZCIsImFkZGVkIiwicmVmS2V5cyIsInJlZlZhbHMiLCJyZWZQYXR0ZXJuVmFscyIsImlkUGF0dGVybiIsImlzUGFydGlhbCIsInBhdHRlcm5WYWxzIiwia2V5UGF0aHMiLCJfbG9vcCIsIm9iaktleXMiLCJvYmpLZXlTdHIiLCJvYmpLZXlQYXRocyIsInBhdHRlcm5LZXlzIiwiX2NvbXBvbmVudEtleXMiLCJtYXBwZWRSZWZWYWxzIiwiaWR4IiwibWFwcGVkUmVmUGF0dGVyblZhbHMiLCJfbG9vcDIiLCJJc0xvYWRpbmdBY3Rpb25UeXBlIiwic2V0SXNMb2FkaW5nIiwiU2V0IiwiYXBwZW5kIiwiZGlzc29jUGF0aCIsImVtcHR5IiwiZXF1YWxzIiwiaGFzIiwiaW5zZXJ0IiwiaXMiLCJwcmVwZW5kIiwicmV2ZXJzZSIsImlzRHJ5Q29tcG9uZW50Iiwib2JqIiwiZ2V0TG9jYXRpb25JbmRleCIsImdldExvY2F0aW9uUGF0aCIsImxvY2F0aW9uIiwiY3VycmVudCIsIlBhdGNoQnVpbGRlciIsIm9wZXJhdGlvbnMiLCJvcGVyYXRpb24iLCJwYXJhbXMiLCJtZXJnZSIsImV4dGVuZCIsImRlbGV0ZSIsImluZGV4Iiwic3ViIiwibXVsIiwiZGl2IiwiY2xlYXIiLCJidWlsZCIsIl9fZGFzaF9wYXRjaF91cGRhdGUiLCJwYXRjaEhhbmRsZXJzIiwiQXNzaWduIiwicGF0Y2hPcGVyYXRpb24iLCJNZXJnZSIsInByZXYiLCJFeHRlbmQiLCJEZWxldGUiLCJJbnNlcnQiLCJBcHBlbmQiLCJQcmVwZW5kIiwiQWRkIiwiU3ViIiwiTXVsIiwiRGl2IiwiQ2xlYXIiLCJSZXZlcnNlIiwiUmVtb3ZlIiwiaXRlbSIsImluc2VydGluZ09wZXJhdGlvbnMiLCJjb2xsZWN0Q29tcG9uZW50SWRzIiwiZnJlc2hJZHMiLCJ2aXNpdGVkIiwicmVjb3JkV3JpdHRlblByb3AiLCJ3cml0dGVuUHJvcHMiLCJ0YWlsQXBwZW5kQ291bnRzIiwicmVjb3JkVGFpbEFwcGVuZCIsImFuYWx5c2lzIiwiZXhpc3RpbmciLCJ0YWlsQXBwZW5kcyIsImNvdW50IiwicmVjb3JkUGF0Y2hPcGVyYXRpb24iLCJoYW5kbGVQYXRjaCIsInByZXZpb3VzVmFsdWUiLCJwYXRjaFZhbHVlIiwicmVkdWNlZFZhbHVlIiwicGF0Y2giLCJoYW5kbGVyIiwicHJldmlvdXNQcm9wcyIsIl9PYmplY3Qka2V5cyIsInZhbCIsImFuYWx5c2lzRm9yUHJvcCIsImFuYWx5c2lzRm9yQWxsUHJvcHMiLCJpc0NhcnJpZWRPdmVyQnlQYXRjaCIsImlzVW50b3VjaGVkQnlQYXRjaCIsIndhc1dyaXR0ZW5CeVBhdGNoIiwiX2FuYWx5c2lzJHdyaXR0ZW5Qcm9wIiwiQm9vbGVhbiIsInRhaWxBcHBlbmQiLCJlbnRyeSIsInRhaWxBcHBlbmRDb3VudCIsIl90YWlsQXBwZW5kJGNvdW50IiwiX3RhaWxBcHBlbmQiLCJkaXNzb2MiLCJnZXRBbGxQTUNJZHMiLCJ0cmlnZ2VyS2V5Iiwia2V5c09mSWRzIiwiaWRLZXkiLCJleHRyYXMiLCJyZXBsYWNlZCIsInRyaWdnZXJWYWx1ZSIsImJhdGNoIiwic2V0R3JhcGhzIiwiYXBpVGh1bmsiLCJyZXNldCIsImNvbmZpZ0VsZW1lbnQiLCJkb2N1bWVudCIsImdldEVsZW1lbnRCeUlkIiwidGV4dENvbnRlbnQiLCJEYXNoQ29udGV4dCIsInVzZURhc2hDb250ZXh0IiwiZ2V0U3RvcmVzIiwiRXh0ZXJuYWxXcmFwcGVyIiwiRGV2dG9vbENvbnRleHQiLCJ1c2VEZXZ0b29sIiwidXNlRGV2dG9vbE1lbnVCdXR0b25DbGFzc05hbWUiLCJnZXRMYXlvdXQiLCJjb21wb25lbnRQYXRoT3JJZCIsImRzIiwiX2RzJHkkZ2V0U3RhdGUiLCJkYXNoX2NvbXBvbmVudF9hcGkiLCJkZXZ0b29sIiwidXBkYXRlVGl0bGUiLCJpc0xvYWRpbmciLCJ1cGRhdGVfdGl0bGUiLCJ0aXRsZSIsIm11dGF0aW9uT2JzZXJ2ZXIiLCJfZ2V0U3RhdGUyIiwiX29ic2VydmVyJG11dGF0aW9uT2JzIiwiZGlzY29ubmVjdCIsIk11dGF0aW9uT2JzZXJ2ZXIiLCJxdWVyeVNlbGVjdG9yIiwib2JzZXJ2ZSIsInN1YnRyZWUiLCJjaGlsZExpc3QiLCJhdHRyaWJ1dGVzIiwiY2hhcmFjdGVyRGF0YSIsImlzTmlsIiwicGF0aE9yIiwicGFyc2VJZldpbGRjYXJkIiwiaGFuZGxlQXN5bmNFcnJvciIsImFwcGVuZFBhdGhzIiwiYXBwbHlQZXJzaXN0ZW5jZSIsInBydW5lUGVyc2lzdGVuY2UiLCJleGVjdXRlZCIsImFwcGx5UHJvcHMiLCJ1cGRhdGVkUHJvcHMiLCJwYXRjaEFuYWx5c2lzIiwiX2FwcGx5UGVyc2lzdGVuY2UiLCJzb3VyY2UiLCJyZXF1ZXN0ZWRDYWxsYmFja3MiLCJzdG9yZWRDYWxsYmFja3MiLCJfY2IkcHJlZGVjZXNzb3JzIiwicHJlZGVjZXNzb3JzIiwiZXhlY3V0aW9uUmVzdWx0IiwiZW50cmllcyIsInBhcnNlZElkIiwiX2dldFN0YXRlMyIsIm9sZExheW91dCIsIm9sZFBhdGhzIiwiYXBwbGllZFByb3BzIiwicmNiIiwiYmFzZVBhdGgiLCJvbGRPYmoiLCJjaGlsZHJlblByb3BzIiwidHlwZSIsIl9fZGFzaHByaXZhdGVfY2hpbGRyZW5Qcm9wcyIsImhhbmRsZVBhdGhzIiwiY2hpbGRyZW4iLCJvbGRDaGlsZHJlbiIsIm9sZENoaWxkcmVuUGF0aCIsInByb3BBbmFseXNpcyIsIm9QYXRocyIsIm5ld0xpc3QiLCJvbGRMaXN0IiwiaXNUYWlsQXBwZW5kIiwiY2h1bmtQYXRoIiwicmVtb3ZlZEFycmF5SW5wdXRzT25seSIsIm5ld1BhdGhzIiwicmVjb21wdXRlZCIsImNoaWxkcmVuUHJvcCIsIl9jaGlsZHJlblByb3Akc3BsaXQkbSIsIl9jaGlsZHJlblByb3Akc3BsaXQkbTIiLCJmcm9udFBhdGgiLCJmcm9udE9iaiIsImNoaWxkcmVuUHJvcFBhdGgiLCJjaGlsZHJlblByb3BBbmFseXNpcyIsImFkZGVkUHJvcHMiLCJfZ2V0U3RhdGU0IiwiY3VycmVudEdyYXBocyIsImV4ZWN1dGlvbk1ldGEiLCJhbGxQcm9wcyIsIm5vX291dHB1dCIsImlucHRzIiwibnMiLCJmbiIsImZpbmQiLCJnZXRBcHBTdGF0ZSIsImV4ZWN1dGluZyIsImRlZmVycmVkIiwic2tpcHBlZE9yUmVhZHkiLCJ3YXRjaGVkIiwiYXBwTGlmZWN5Y2xlIiwiY3VycmVudENiIiwiX2NiIiwiZ2V0UGVuZGluZ0NhbGxiYWNrcyIsInBlbmRpbmdDYWxsYmFja3MiLCJub25QZXJzaXN0ZW50Q2FsbGJhY2tzIiwicGVyc2lzdGVudCIsImlzQXBwUmVhZHkiLCJNQVhfQ09OQ1VSUkVOVF9IVFRQX0NBTExCQUNLUyIsInVzZXNSZXF1ZXN0U2xvdCIsInNvcnRQcmlvcml0eSIsImMxIiwiYzIiLCJfYzEkcHJpb3JpdHkiLCJfYzIkcHJpb3JpdHkiLCJnZXRTdGFzaCIsImZsYXRPdXRwdXRzIiwiYWxsUHJvcElkcyIsInJlcU91dCIsImlkT3V0IiwiZ2V0SWRzIiwiaXRlbXMiLCJ1bmlxdWVJZHMiLCJNYXAiLCJ1bmlxdWVJdGVtcyIsIl9vYnNlcnZlciIsIl9nZXRTdGF0ZSRjYWxsYmFja3MiLCJwcmlvcml0aXplZCIsImNvdW50c1Rvd2FyZCIsImluRmxpZ2h0IiwiYXZhaWxhYmxlIiwiYnVkZ2V0ZWQiLCJleGVtcHQiLCJpc1JlYWR5IiwiYnVkZ2V0ZWRTeW5jIiwiYnVkZ2V0ZWRBc3luYyIsInBpY2tlZEJ1ZGdldGVkU3luYyIsInBpY2tlZEJ1ZGdldGVkQXN5bmMiLCJleGVtcHRTeW5jIiwiZXhlbXB0QXN5bmMiLCJwaWNrZWRTeW5jQ2FsbGJhY2tzIiwicGlja2VkQXN5bmNDYWxsYmFja3MiLCJibG9ja2VkIiwiZXhlY3V0aW5nQ2FsbGJhY2siLCJyb3V0ZWRPdmVyV2ViU29ja2V0IiwiZ3JvdXBCeSIsIm1lcmdlTGVmdCIsIndhaXQiLCJzdG9yZWQiLCJyZXF1ZXN0ZWQiLCJpbml0aWFsUmVxdWVzdGVkIiwickNpcmN1bGFycyIsInJEdXBsaWNhdGVzIiwick1lcmdlZER1cGxpY2F0ZXMiLCJwRHVwbGljYXRlcyIsImJEdXBsaWNhdGVzIiwiZUR1cGxpY2F0ZXMiLCJ3RHVwbGljYXRlcyIsIl9wcnVuZUNhbGxiYWNrcyIsInJBZGRlZCIsInJSZW1vdmVkIiwiX3BydW5lQ2FsbGJhY2tzMiIsInBBZGRlZCIsInBSZW1vdmVkIiwiX3BydW5lQ2FsbGJhY2tzMyIsImJBZGRlZCIsImJSZW1vdmVkIiwiX3BydW5lQ2FsbGJhY2tzNCIsImVBZGRlZCIsImVSZW1vdmVkIiwiX3BydW5lQ2FsbGJhY2tzNSIsIndBZGRlZCIsIndSZW1vdmVkIiwicmVhZHlDYWxsYmFja3MiLCJvbGRCbG9ja2VkIiwibmV3QmxvY2tlZCIsInBlbmRpbmdHcm91cHMiLCJkcm9wcGVkIiwiZ3JvdXAiLCJpbml0aWFsIiwiZ3JvdXBXaXRob3V0SW5pdGlhbCIsImV4ZyIsInJlYWR5Q2FsbGJhY2siLCJibG9ja2VkQnlBc3N1bXB0aW9ucyIsIl9jYiRwcmVkZWNlc3NvcnMyIiwiX3JlZ2VuZXJhdG9yVmFsdWVzIiwiZ2NiIiwidXBkYXRlZCIsImRlcCIsIm51bGxHcm91cENhbGxiYWNrcyIsImdyb3VwQ2FsbGJhY2tzIiwiZXhlY3V0aW9uR3JvdXBzIiwiZXhlY3V0aW9uR3JvdXBDYWxsYmFja3MiLCJfbiIsIkYiLCJyZXNvbHZlUHJvcFBhdGgiLCJwYXJzZUNvbXBvbmVudElkIiwiZW5kc1dpdGgiLCJfdW51c2VkIiwicmVhZFJlcXVlc3RlZFByb3BzIiwiY29tcG9uZW50UHJvcHMiLCJwcm9wUGF0aCIsIl9yZXNvbHZlUHJvcFBhdGgiLCJfaW5pdGlhbGl6ZVdlYlNvY2tldCIsIl9jb25maWckd2Vic29ja2V0MyIsIl9jb25maWckd2Vic29ja2V0NCIsIndzQXZhaWxhYmxlIiwicHJvY2Vzc1NldFByb3BzIiwid2FzRGlzY29ubmVjdGVkIiwid3NVcmwiLCJTaGFyZWRXb3JrZXIiLCJyYXdQcm9wcyIsInByb2Nlc3NlZFByb3BzIiwidXBkYXRlZFN0YXRlIiwib25TZXRQcm9wcyIsIm9uU2V0UHJvcHNCYXRjaCIsInBheWxvYWRzIiwiX2l0ZXJhdG9yMiIsIl9zdGVwMiIsIm9uR2V0UHJvcHNSZXF1ZXN0IiwicmVxdWVzdElkIiwic2VuZEdldFByb3BzUmVzcG9uc2UiLCJvbkNvbm5lY3RlZCIsImxvZyIsInBlcnNpc3RlbnRDYWxsYmFja3MiLCJub091dHB1dCIsInJlc29sdmVkIiwib25EaXNjb25uZWN0ZWQiLCJyZWFzb24iLCJvbkVycm9yIiwiY29kZSIsImFkZEV2ZW50TGlzdGVuZXIiLCJ2aXNpYmlsaXR5U3RhdGUiLCJjb25uZWN0ZWQiLCJub3RpZnlUYWJWaXNpYmxlIiwiY2F0Y2giLCJlbmFibGVkIiwiYnVpbGRXZWJTb2NrZXRVcmwiLCJjb25uZWN0IiwiaW5hY3Rpdml0eV90aW1lb3V0Iiwid3NQcm90b2NvbCIsInByb3RvY29sIiwiaG9zdCIsInNldEpvYiIsInJlbW92ZUpvYiIsInNldE91dGRhdGVkIiwiYWN0aW9uIiwiREVGQVVMVF9TVEFURSIsImNvbXBsZXRlZCIsInRyYW5zZm9ybXMiLCJmaWVsZHMiLCJtdXRhdGVDb21wbGV0ZWQiLCJtdXRhdGVDYWxsYmFja3MiLCJ0cmFuc2Zvcm0iLCJmaWVsZCIsImxvYWQiLCJsb2FkUGF0aCIsIm9uY2UiLCJjcmVhdGVTdG9yZSIsImFwcGx5TWlkZGxld2FyZSIsInRodW5rIiwiY3JlYXRlUmVkdWNlciIsImRvY3VtZW50VGl0bGUiLCJleGVjdXRlZENhbGxiYWNrcyIsImV4ZWN1dGluZ0NhbGxiYWNrcyIsInByaW9yaXRpemVkQ2FsbGJhY2tzIiwiUmVuZGVyZXJTdG9yZSIsInN0b3JlT2JzZXJ2ZXIiLCJyZWR1Y2VyIiwibWlkZGxld2FyZSIsIl9fc3RvcmUiLCJzZXRTdG9yZSIsImRhc2hfc3RvcmVzIiwic2V0T2JzZXJ2ZXJzIiwicHJvY2VzcyIsImVudiIsIk5PREVfRU5WIiwiY3JlYXRlQXBwU3RvcmUiLCJyZWR1eERURUMiLCJfX1JFRFVYX0RFVlRPT0xTX0VYVEVOU0lPTl9DT01QT1NFX18iLCJhY3Rpb25zRGVueWxpc3QiLCJtb2R1bGUiLCJob3QiLCJhY2NlcHQiLCJuZXh0Um9vdFJlZHVjZXIiLCJyZXF1aXJlIiwicmVwbGFjZVJlZHVjZXIiLCJpbml0aWFsaXplU3RvcmUiLCJvbWl0IiwiX0FycmF5Iiwic2V0X3Byb3BzIiwiaWRPclBhdGgiLCJfZHMkeSIsImludmFsaWRQcm90b2NvbHMiLCJuZXdMaW5lcyIsImN0cmxDaGFycyIsImh0bWxFbnRpdGllcyIsImNsZWFuX3VybCIsImZhbGxiYWNrIiwiY2xlYW5lZCIsInJlcGxhY2UiLCJkZWMiLCJmcm9tQ2hhckNvZGUiLCJyZXNvdXJjZSIsInByb20iLCJoZWFkIiwiZWxlbWVudCIsInNyYyIsImFzeW5jIiwib25sb2FkIiwib25lcnJvciIsImFwcGVuZENoaWxkIiwiaHJlZiIsInJlbCIsInJlc29sdmVBcnJheUtleSIsImlzU2FmZUludGVnZXIiLCJyZXNvbHZlT2JqZWN0S2V5IiwiY2FjaGVkUmVuZGVyZXJJZCIsImdldFJlbmRlcmVySWQiLCJjcnlwdG8iLCJyYW5kb21VVUlEIiwic3RvcmVzIiwiX2RlZmluZVByb3BlcnRpZXMiLCJERUZBVUxUX1BPTExfSU5URVJWQUwiLCJFTVBUWV9QT0xMU19CRUZPUkVfQkFDS09GRiIsIk1BWF9CQUNLT0ZGX0ZBQ1RPUiIsImdlbklkIiwic2xlZXAiLCJtcyIsIlN0cmVhbUNsaWVudCIsIl9vcHRzJGZldGNoSW1wbCIsIl9vcHRzJHJlY29ubmVjdERlbGF5IiwiX29wdHMkbWF4UmVjb25uZWN0RGVsIiwiX29wdHMkcmVjb25uZWN0V2luZG93Iiwib3B0cyIsImZldGNoSW1wbCIsImdsb2JhbFRoaXMiLCJyZWNvbm5lY3REZWxheSIsIm1heFJlY29ubmVjdERlbGF5IiwicmVjb25uZWN0V2luZG93IiwiY29uZmlndXJlIiwidHJhbnNwb3J0IiwibW9kZSIsIl90cmFuc3BvcnQiLCJwb2xsSW50ZXJ2YWwiLCJwZW5kaW5nIiwic2l6ZSIsImVuZElkIiwic3RyZWFtVXJsIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiZG93bmxpbmtJZCIsIm9uRnJhbWUiLCJzdGFydCIsInNldHRsZWQiLCJjdXJzb3IiLCJsb2NhbElkIiwiY291bnRlciIsInNldCIsImFja2VkIiwiZ290RnJhbWUiLCJzdHJlYW1Db25uZWN0aW9uIiwiY2hlY2tVcGxpbmsiLCJmYWlsIiwic3RyZWFtQ2FuY2VsIiwic3RvcERvd25saW5rSWZJZGxlIiwib2siLCJfdGhpcyR3YWtlVXAiLCJlbnN1cmVEb3dubGluayIsIndva2VuRm9yTmV3U3RyZWFtIiwid2FrZVVwIiwiaGFzQWNrZWQiLCJkaXNwYXRjaEVudmVsb3BlIiwiZW52ZWxvcGUiLCJzZXR0bGVBbGwiLCJzZXEiLCJyaWQiLCJjbG9zZURvd25saW5rIiwiZG93bmxpbmtPcGVuIiwiX3RoaXMkd2FrZVVwMiIsImFib3J0IiwibG9vcEdlbiIsInJlYWRMb29wIiwiX3JlYWRMb29wIiwiZ2VuIiwiX3RoaXMkX3RyYW5zcG9ydCRwb2xsIiwicG9sbGluZyIsImJhc2UiLCJpZGxlUGF1c2UiLCJlbXB0eVBvbGxzIiwidW5yZWFjaGFibGVTaW5jZSIsImRlbGF5IiwicmVjZWl2ZWQiLCJBYm9ydENvbnRyb2xsZXIiLCJzaWduYWwiLCJzdHJlYW1Eb3dubGluayIsImNvbnN1bWUiLCJwYXVzZSIsIl90aGlzMiIsInRpbWVyIiwiY2xlYXJUaW1lb3V0IiwiX2NvbnN1bWUiLCJubCIsIlNoYXJlZFN0cmVhbUNsaWVudCIsInBvcnQiLCJfdGhpczMiLCJfcG9ydCRzdGFydCIsInJlbmRlcmVySWQiLCJvbm1lc3NhZ2UiLCJldmVudCIsImhhbmRsZU1lc3NhZ2UiLCJfYnJva2VuIiwiX3RoaXM0IiwicG9zdE1lc3NhZ2UiLCJyZWxlYXNlIiwic2luZ2xldG9uIiwiX2NvbmZpZyRzdHJlYW0iLCJfY29uZmlnJHN0cmVhbTIiLCJfY29uZmlnJHN0cmVhbTMiLCJicm9rZW4iLCJwb2xsX2ludGVydmFsIiwid29ya2VyVXJsIiwid29ya2VyIiwiY2xpZW50IiwiX2NvbmZpZyRzdHJlYW00IiwiZHVyYXRpb24iLCJfcmVzb2x2ZSIsIldvcmtlck1lc3NhZ2VUeXBlIiwiV29ya2VyQ2xpZW50IiwiX2Nvbm5lY3QiLCJzZXJ2ZXJVcmwiLCJpbmFjdGl2aXR5VGltZW91dCIsImhlYXJ0YmVhdEludGVydmFsIiwiY29ubmVjdGlvblByb21pc2UiLCJjb25uZWN0aW9uUmVzb2x2ZSIsIkNPTk5FQ1QiLCJESVNDT05ORUNUIiwiY2xvc2UiLCJpc0Nvbm5lY3RlZCIsIl9zdGVwJHZhbHVlIiwiX2Vuc3VyZUNvbm5lY3RlZCIsImhlYXJ0YmVhdF9pbnRlcnZhbCIsIl9zZW5kQ2FsbGJhY2siLCJyZXF1ZXN0Q291bnRlciIsIkNBTExCQUNLX1JFUVVFU1QiLCJHRVRfUFJPUFNfUkVTUE9OU0UiLCJUQUJfVklTSUJMRSIsIkNPTk5FQ1RFRCIsIkRJU0NPTk5FQ1RFRCIsIl9zdGVwMiR2YWx1ZSIsIl9tZXNzYWdlJHBheWxvYWQiLCJDQUxMQkFDS19SRVNQT05TRSIsIlNFVF9QUk9QUyIsIlNFVF9QUk9QU19CQVRDSCIsIkdFVF9QUk9QU19SRVFVRVNUIiwiRVJST1IiLCJfbWVzc2FnZSRwYXlsb2FkMiIsIl9tZXNzYWdlJHBheWxvYWQzIiwid29ya2VyQ2xpZW50SW5zdGFuY2UiLCJfY29uZmlnJHdlYnNvY2tldDUiLCJjaGVja1Byb3BUeXBlcyIsInByb3BUeXBlRXJyb3JIYW5kbGVyIiwidmFsaWRhdGVDb21wb25lbnQiLCJDaGVja2VkQ29tcG9uZW50IiwiY29tcG9uZW50IiwiZXJyb3JNZXNzYWdlIiwidXNlQ2FsbGJhY2siLCJ1c2VDb250ZXh0IiwidXNlTWVtbyIsInVzZVN0b3JlIiwidXNlU2VsZWN0b3IiLCJ1c2VEaXNwYXRjaCIsImNyZWF0ZUNvbnRleHQiLCJEYXNoQ29udGV4dFByb3ZpZGVyIiwic3RyaW5nUGF0aCIsImV4dHJhUGF0aCIsInJhd1BhdGgiLCJmaWx0ZXJGdW5jIiwibG9hZGluZ1BhdGgiLCJ1c2VMb2FkaW5nIiwiY3R4VmFsdWUiLCJjdHgiLCJ1c2VSZWYiLCJtZXJnZVJpZ2h0IiwibWFwT2JqSW5kZXhlZCIsIkNvbXBvbmVudEVycm9yQm91bmRhcnkiLCJyZXNldENvbXBvbmVudFN0YXRlIiwiZ2V0V2F0Y2hlZEtleXMiLCJjaGVja1JlbmRlclR5cGVQcm9wIiwic3RyaW5naWZ5UGF0aCIsIlJlZ2lzdHJ5IiwiaXNTaW1wbGVDb21wb25lbnQiLCJzZWxlY3REYXNoUHJvcHMiLCJzZWxlY3REYXNoUHJvcHNFcXVhbGl0eUZuIiwic2VsZWN0Q29uZmlnIiwiY29tcG9uZW50SWRlbnRpdHkiLCJfY29tcG9uZW50JHByb3BzIiwiRGFzaFdyYXBwZXIiLCJfZGFzaHByaXZhdGVfZXJyb3IiLCJfcGFzc2VkQ29tcG9uZW50IiwiX25ld1JlbmRlciIsIl9vYmplY3RXaXRob3V0UHJvcGVydGllcyIsIl9leGNsdWRlZCIsIm1lbW9pemVkS2V5cyIsIm5ld1JlbmRlciIsImZyZXNoUmVuZGVycyIsInJlbW91bnRlZFRoaXNSZW5kZXIiLCJyZW5kZXJlZElkZW50aXR5IiwiaGFzRnJlc2hSZW5kZXJlZCIsInJlbmRlcmVkUGF0aCIsInByZXZDaGlsZHJlbkFycmF5cyIsInJlbmRlckNvbXBvbmVudCIsInJlbmRlckNvbXBvbmVudFByb3BzIiwicmVuZGVySCIsIl91c2VTZWxlY3RvciIsIl91c2VTZWxlY3RvcjIiLCJoIiwiY2hhbmdlZFByb3BzIiwiaWRlbnRpdHkiLCJpc1JlbW91bnQiLCJfZGFzaHByaXZhdGVfcmVtb3VudCIsInNldFByb3BzIiwiX3JlbmRlckNvbXBvbmVudFByb3BzIiwiX2Rhc2hfZXJyb3IiLCJyZXN0UHJvcHMiLCJfZXhjbHVkZWQyIiwiY3VycmVudFN0YXRlIiwid2F0Y2hlZEtleXMiLCJjcmVhdGVDb250YWluZXIiLCJjb250YWluZXIiLCJjb250YWluZXJQYXRoIiwiX2NoaWxkTmV3UmVuZGVyIiwiX2NvbnRhaW5lciRwcm9wcyIsIndyYXBDaGlsZHJlblByb3AiLCJub2RlIiwiY2hpbGRyZW5QYXRoIiwiYWxsb3dSZWZTa2lwIiwicGF0aEtleSIsInByZXZBcnJheSIsInVuY2hhbmdlZCIsImV4dHJhUHJvcHMiLCJzZXRIeWRyYXRlZFByb3BzIiwiY2hpbGROZXdSZW5kZXIiLCJoYW5kbGVPYmplY3QiLCJvcGF0aCIsIm5vZGVWYWx1ZSIsIl9ub2RlIiwiYmFja1BhdGgiLCJmb3VuZCIsImhhc09iamVjdCIsImZpcnN0Tm9kZSIsImVsIiwiZWxlbWVudFBhdGgiLCJsaXN0VmFsdWUiLCJmcm9udCIsImR5bmFtaWMiLCJoYXNCYWNrIiwiaiIsImN1ciIsImR5blZhbHVlIiwiYVBhdGgiLCJfcmV0IiwiaHlkcmF0ZUZ1bmMiLCJoeWRyYXRlZFByb3BzIiwiaHlkcmF0ZWRDaGlsZHJlbiIsInByb3BzX2NoZWNrIiwiaHlkcmF0ZWQiLCJpc1ZhbGlkRWxlbWVudCIsImNvbXBvbmVudFR5cGUiLCJhZGRDb21wb25lbnRUb0xheW91dCIsInJlbW92ZUNvbXBvbmVudCIsIl9yZWYkdGVtcCIsInRlbXAiLCJpbnNlcnRlZCIsInNldEluc2VydGVkIiwiX2Rpc3BhdGNoIiwiZXhpc3RzIiwiY2hlY2tEYXNoQ2hpbGRyZW5VcGRhdGUiLCJwcmV2aW91c0hhc2hlcyIsImlzRmlyc3RMZXZlbFByb3BzQ2hpbGQiLCJ1cGRhdGVkUGF0aCIsInN0clBhdGgiLCJ1cGRhdGVkU2VnbWVudHMiLCJmdWxsU2VnbWVudHMiLCJzdGFydHNXaXRoUGF0aCIsInNlZyIsInJlbWFpbmluZ1NlZ21lbnRzIiwicHJvcHNDb3VudCIsImRldGVybWluZUNoYW5nZWRQcm9wcyIsImNvbWJpbmVkSGFzaCIsImxheW91dEhhc2hlcyIsInBhdGhIYXNoIiwiX2lzRmlyc3RMZXZlbFByb3BzQ2hpIiwiX2lzRmlyc3RMZXZlbFByb3BzQ2hpMiIsImRlc2NlbmRhbnQiLCJwcmV2aW91c0hhc2giLCJoYXNoIiwiX19fIiwiX19fXyIsImNvbXBvbmVudERlZmluaXRpb24iLCJsYXlvdXRQYXRoIiwiR2xvYmFsRXJyb3JDb250YWluZXIiLCJoeWRyYXRlSW5pdGlhbE91dHB1dHMiLCJzZXRMYXlvdXQiLCJjb21wdXRlR3JhcGhzIiwiRXZlbnRFbWl0dGVyIiwiVW5jb25uZWN0ZWRDb250YWluZXIiLCJkZXBlbmRlbmNpZXNSZXF1ZXN0IiwibGF5b3V0UmVxdWVzdCIsImVycm9yTG9hZGluZyIsInNldEVycm9yTG9hZGluZyIsInJlbmRlcmVkVHJlZSIsInN0b3JlRWZmZWN0IiwiZW1pdCIsInNlcnZlX2xvY2FsbHkiLCJfZGFzaFBsb3RseUpTVVJMIiwicmVxdWVzdHNfcGF0aG5hbWVfcHJlZml4IiwicGxvdGx5anNfdXJsIiwiY29udGVudCIsImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIiwiX19odG1sIiwiY2xhc3NOYW1lIiwiRnJhZ21lbnQiLCJjb21wb25lbnRzIiwiZmluYWxMYXlvdXQiLCJoYXNFcnJvciIsImZyb250RW5kIiwiYmFja0VuZCIsIm9uZU9mIiwib2JqZWN0IiwiaGlzdG9yeSIsIkNvbnRhaW5lciIsIkFQSUNvbnRyb2xsZXIiLCJMb2FkaW5nIiwiVG9vbGJhciIsIlJlbG9hZGVyIiwic2V0SG9va3MiLCJzZXRDb25maWciLCJtZW1vaXplV2l0aCIsIlVuY29ubmVjdGVkQXBwQ29udGFpbmVyIiwiX1JlYWN0JENvbXBvbmVudCIsIl9jYWxsU3VwZXIiLCJfaW5oZXJpdHMiLCJVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50IiwicmVuZGVyIiwic2hvd191bmRvX3JlZG8iLCJDb21wb25lbnQiLCJSZWFjdERPTSIsIkRhc2hSZW5kZXJlciIsImNyZWF0ZVJvb3QiLCJyb290IiwibG9nV2FybmluZ09uY2UiLCJHRVQiLCJmZXRjaENvbmZpZyIsIl9ib2R5IiwiUE9TVCIsInJlcXVlc3QiLCJlbmRwb2ludCIsInNldENvbm5lY3Rpb25TdGF0dXMiLCJfYm9keTIiLCJfc2V0Q29ubmVjdGlvblN0YXR1cyIsImJhY2tFbmRDb25uZWN0ZWQiLCJhY3Rpb25MaXN0IiwiT05fUFJPUF9DSEFOR0UiLCJTRVRfUkVRVUVTVF9RVUVVRSIsIlNFVF9HUkFQSFMiLCJTRVRfUEFUSFMiLCJTRVRfTEFZT1VUIiwiU0VUX0FQUF9MSUZFQ1lDTEUiLCJTRVRfQ09ORklHIiwiQUREX0hUVFBfSEVBREVSUyIsIk9OX0VSUk9SIiwiU0VUX0hPT0tTIiwiSU5TRVJUX0NPTVBPTkVOVCIsIlJFTU9WRV9DT01QT05FTlQiLCJSRVNFVF9DT01QT05FTlRfU1RBVEUiLCJnZXRBY3Rpb24iLCJEZXBHcmFwaCIsImlzTnVtZXJpYyIsImFwIiwiZXZvbHZlIiwiZm9yRWFjaE9iakluZGV4ZWQiLCJjcmF3bExheW91dCIsIkFMTCIsIndpbGQiLCJNQVRDSCIsIkFMTFNNQUxMRVIiLCJleHBhbmQiLCJ3aWxkY2FyZHMiLCJhbGxvd2VkV2lsZGNhcmRzIiwiT3V0cHV0IiwiSW5wdXQiLCJTdGF0ZSIsIndpbGRjYXJkVmFsVHlwZXMiLCJpZEludmFsaWRDaGFycyIsImlzV2lsZGNhcmRJZCIsInBhcnNlV2lsZGNhcmRJZCIsInBhcnNlTXVsdGlwbGVPdXRwdXRzIiwib3V0cHV0SWRBbmRQcm9wIiwiZG90UG9zIiwic3RyaW5naWZ5VmFsIiwicGFydHMiLCJpZFZhbFNvcnQiLCJiSXNOdW1lcmljIiwiYU4iLCJiTiIsImFJc0Jvb2wiLCJ2YWxCZWZvcmUiLCJ2YWxBZnRlciIsImFkZE1hcCIsImRlcE1hcCIsImRlcGVuZGVuY3kiLCJpZE1hcCIsImFkZFBhdHRlcm4iLCJpZFNwZWMiLCJrZXlTdHIiLCJ2YWx1ZXNLZXkiLCJwcm9wTWFwIiwidmFsdWVNYXAiLCJ2YWxNYXRjaCIsImFkZFBhcnRpYWxQYXR0ZXJuIiwib2ZmbG9hZFBhdHRlcm5zIiwicGF0dGVybnNNYXAiLCJ0YXJnZXRNYXAiLCJ2YWxpZGF0ZURlcGVuZGVuY2llcyIsInBhcnNlZERlcGVuZGVuY2llcyIsIm91dFN0cnMiLCJvdXRPYmpzIiwiaGFzT3V0cHV0cyIsInByZXZlbnRfaW5pdGlhbF9jYWxsIiwiY2xzIiwiaWRQcm9wIiwidmFsaWRhdGVBcmciLCJmaW5kRHVwbGljYXRlT3V0cHV0cyIsImZpbmRNaXNtYXRjaGVkV2lsZGNhcmRzIiwiaW52YWxpZENoYXJzIiwibmV3T3V0cHV0U3RycyIsIm5ld091dHB1dE9ianMiLCJpZE9iaiIsInNlbGZPdmVybGFwIiwid2lsZGNhcmRPdmVybGFwIiwib3RoZXJPdmVybGFwIiwiaWRQcm9wMiIsImNoZWNrSW5PdXRPdmVybGFwIiwib3V0SWQiLCJvdXRQcm9wIiwiaW5fIiwiaW5JZCIsImluUHJvcCIsIl9maW5kV2lsZGNhcmRLZXlzIiwiZmluZFdpbGRjYXJkS2V5cyIsIm91dDBNYXRjaEtleXMiLCJtYXRjaEtleXMiLCJvdXRwdXRzSGF2ZU1hdGNoIiwiYXJnIiwiX2ZpbmRXaWxkY2FyZEtleXMyIiwiYWxsc21hbGxlcktleXMiLCJkaWZmS2V5cyIsImRpZmYiLCJvdXREZXNjIiwibWF0Y2hXaWxkS2V5cyIsImFXaWxkIiwiYldpbGQiLCJpZFZhbHMiLCJfaXRlcmF0b3IzIiwiX3N0ZXAzIiwiaWQyIiwicHJvcGVydHkyIiwidmFsaWRhdGVDYWxsYmFja3NUb0xheW91dCIsInN0YXRlXyIsImxheW91dF8iLCJwYXRoc18iLCJ2YWxpZGF0ZUlkcyIsInZhbGlkYXRpb25fbGF5b3V0Iiwib3V0cHV0TWFwIiwib3V0cHV0UGF0dGVybnMiLCJ0YWlsIiwibWlzc2luZ0lkIiwidmFsaWRhdGVQcm9wIiwiaWRQYXRoIiwicmF3UHJvcCIsImxhc3QiLCJjaGFyQXQiLCJ2YWxpZGF0ZUlkUGF0dGVyblByb3AiLCJpZFJlc29sdmVkIiwiY2FsbGJhY2tJZHNDaGVja2VkRm9yU3RhdGUiLCJ2YWxpZGF0ZVN0YXRlIiwidmFsaWRhdGVNYXAiLCJkb1N0YXRlIiwiZmNiIiwib3B0aW9uYWwiLCJkZXBzIiwidmFsaWRhdGVQYXR0ZXJucyIsImtleVBhdHRlcm5zIiwiZGVwZW5kZW5jaWVzIiwibXVsdGlHcmFwaCIsInBlcmZvcm1hbmNlIiwid2lsZGNhcmRQbGFjZWhvbGRlcnMiLCJmaXhJZHMiLCJvdXRwdXRzX21ldGEiLCJvdXRwdXRTdHJzIiwicGFyc2VkIiwid3JhcHBlZERFIiwidmFsaWRhdGVfY2FsbGJhY2tzIiwib3V0cHV0UGF0dGVybk1hcCIsImlucHV0UGF0dGVybk1hcCIsInBhcnRpYWxPdXRwdXRQYXR0ZXJuTWFwIiwicGFydGlhbElucHV0UGF0dGVybk1hcCIsInBhcnRpYWxPdXRwdXRQYXR0ZXJucyIsImhhc1BhcnRpYWxPdXRwdXRQYXR0ZXJucyIsImZpbmFsR3JhcGhzIiwiTXVsdGlHcmFwaCIsImV4YWN0Iiwia2V5UGxhY2Vob2xkZXJzIiwibWFrZUFsbElkcyIsIm91dElkRmluYWwiLCJpZExpc3QiLCJ0ZXN0VmFscyIsIm91dFZhbEluZGV4IiwibmV3VmFscyIsIm91dHB1dFRhZyIsImR1cGxpY2F0ZU91dHB1dHMiLCJjYkluIiwiY2JPdXQiLCJhZGRJbnB1dFRvTXVsdGkiLCJpbklkUHJvcCIsIm91dElkUHJvcCIsImZpcnN0UGFzcyIsImFkZE5vZGUiLCJhZGREZXBlbmRlbmN5IiwiYWRkT3V0cHV0VG9NdWx0aSIsImluT2JqIiwiaW5JZExpc3QiLCJfZmluZFdpbGRjYXJkS2V5czMiLCJmaXJzdFNpbmdsZU91dHB1dCIsImZpbmFsRGVwZW5kZW5jeSIsIm91dFBhcnRpYWwiLCJhbHNvSW5wdXQiLCJvdXRJZExpc3QiLCJ0ZW1wT3V0SWRQcm9wIiwib3V0SWROYW1lIiwiaW5wdXRPYmplY3QiLCJpblBhcnRpYWwiLCJkdXBlT3V0SWRQcm9wIiwib3JpZ2luYWxOYW1lIiwibmV3TmFtZSIsImNudCIsImluTmFtZSIsIm91dE5hbWUiLCJlbmQiLCJjYWxsYmFja0dyYXBoVGltZSIsInRvRml4ZWQiLCJwYXR0ZXJuVmFsIiwicmVmSW5kZXgiLCJyZWZQYXR0ZXJuVmFsIiwiY29tcG9uZW50S2V5cyIsImNvbXBvbmVudFZhbHMiLCJwYXR0ZXJuS2V5IiwiY29tcEluZGV4IiwiX3JlZjEyJHBhcnRpYWwiLCJnZXRDYWxsYmFja0J5T3V0cHV0IiwiX2tleXMiLCJhZGRSZXNvbHZlZEZyb21PdXRwdXRzIiwib3V0UGF0dGVybiIsIm91dHMiLCJvdXQwS2V5cyIsIm91dDBQYXR0ZXJuVmFscyIsImZvdW5kQ2JJZHMiLCJvdXRWYWxzIiwic2luZ2xlT3V0UGF0dGVybiIsImFueVNlZW4iLCJvdXRTZXQiLCJtYXRjaFN0ciIsIm5ld1Byb3AiLCJfbG9vcDMiLCJsYXlvdXRDaHVuayIsIm91dHB1dHNPbmx5IiwiYWRkQ2FsbGJhY2siLCJmb3VuZEluZGV4IiwiZm91bmRDYiIsImFkZENhbGxiYWNrSWZBcnJheSIsImluaSIsImluaWoiLCJoYW5kbGVPbmVJZCIsIm91dElkQ2FsbGJhY2tzIiwiaW5JZENhbGxiYWNrcyIsImlzQ2FycnlPdmVyIiwibWF5YmVBZGRDYWxsYmFjayIsImhhbmRsZVRoaXNDYWxsYmFjayIsImNoaWxkIiwicGFyc2VDb29raWUiLCJyZWNvcmRVaUVkaXQiLCJzZXRBcHBMaWZlY3ljbGUiLCJzZXRSZXF1ZXN0UXVldWUiLCJpbnNlcnRDb21wb25lbnQiLCJvblByb3BDaGFuZ2UiLCJodG1sIiwidHJpZ2dlckRlZmF1bHRTdGF0ZSIsInRva2VuTmFtZSIsImNzcmZfdG9rZW5fbmFtZSIsImhlYWRlck5hbWUiLCJjc3JmX2hlYWRlcl9uYW1lIiwiY29va2llcyIsImNvb2tpZSIsInRva2VuIiwib3ZlcmFsbE9yZGVyIiwibGF5b3V0Q2FsbGJhY2tzIiwic3BlY2lhbENhbGxiYWNrcyIsImlzTm9PdXRwdXQiLCJpc05vSW5wdXQiLCJpbnAiLCJyZWRvIiwibW92ZUhpc3RvcnkiLCJ1bmRvIiwicmV2ZXJ0IiwiZnV0dXJlIiwicGFzdCIsInRhcmdldHMiLCJwcm9taXNlcyIsInJlbmRlcmVkIiwicmVzb2x2ZVJlbmRlcmVkIiwicGF0aE9mSWQiLCJ0YXJnZXQiLCJyZWFkeSIsInJhY2UiLCJwcm9wRXEiLCJzdWJUcmVlIiwic3RhcnRpbmdQYXRoIiwib2xkU3RycyIsIm9sZE9ianMiLCJfcmVmJG9iakluZGV4Iiwib2JqSW5kZXgiLCJvbGRPYmpJbmRleCIsImRpZmZIZWFkIiwic3BMZW4iLCJlZGl0TWFwIiwib2xkVmFsUGF0aHMiLCJvbGRLZXlzIiwib2xkaWUiLCJuZXdJdGVtcyIsImFwcGVuZE9mZnNldCIsIm5ld09iakl0ZW1zIiwiZnVsbFBhdGgiLCJwYXRoT2JqIiwiaGFzVXJsQmFzZSIsImhhc1JlcVByZWZpeCIsInVybF9iYXNlX3BhdGhuYW1lIiwicHJvcHNDaGlsZHJlbiIsImN1cnJlbnRQYXRoIiwib2JqT2YiLCJiYWNrIiwiY2hpbGRPYmoiLCJjaGlsZFBhdGgiLCJuZXdQYXRoIiwiY3AiLCJjdXJQYXRoIiwib1ZhbHVlIiwiX2NyYXdsTGF5b3V0IiwiX2V2Iiwib24iLCJsaXN0ZW5lciIsInJlbW92ZUxpc3RlbmVyIiwiX2xlbiIsIl9rZXkiLCJfbGVuMiIsIl9rZXkyIiwiUmVhY3RQcm9wVHlwZXNTZWNyZXQiLCJ0eXBlU3BlY3MiLCJjb21wb25lbnROYW1lIiwiZ2V0U3RhY2siLCJ0eXBlU3BlY05hbWUiLCJoYXNPd25Qcm9wZXJ0eSIsImV4Iiwic3RhY2siLCJib29sIiwiaXNSZXF1aXJlZCIsImNvbXBhcmF0b3IiLCJsdCIsImhvdF9yZWxvYWQiLCJfcHJvcHMkY29uZmlnJGhvdF9yZWwiLCJtYXhfcmV0cnkiLCJkaXNhYmxlZCIsImludGVydmFsSWQiLCJwYWNrYWdlcyIsIl9yZXRyeSIsIl9oZWFkIiwiY2xlYXJJbnRlcnZhbCIsInNldFN0YXRlIiwiY29tcG9uZW50RGlkVXBkYXRlIiwicHJldlByb3BzIiwicHJldlN0YXRlIiwicmVsb2FkUmVxdWVzdCIsImhhcmQiLCJ3YXNfY3NzIiwiZmlsZXMiLCJpc19jc3MiLCJub2Rlc1RvRGlzYWJsZSIsIml0IiwiZXZhbHVhdGUiLCJpdGVyYXRlTmV4dCIsInNldEF0dHJpYnV0ZSIsImxpbmsiLCJyZWxvYWQiLCJhbGVydCIsImNvbXBvbmVudERpZE1vdW50IiwiX3RoaXMkcHJvcHMiLCJfdGhpcyRzdGF0ZSIsInNldEludGVydmFsIiwiY29tcG9uZW50V2lsbFVubW91bnQiLCJnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMiLCJkZWZhdWx0UHJvcHMiLCJzdHJpbmciLCJudW1iZXIiLCJVbmNvbm5lY3RlZFRvb2xiYXIiLCJ1bmRvTGluayIsIm9uQ2xpY2siLCJyZWRvTGluayIsIkN5dG9zY2FwZSIsIkN5dG9zY2FwZUNvbXBvbmVudCIsImRhZ3JlIiwiZmNvc2UiLCJKU09OVHJlZSIsInN0eWxlc2hlZXQiLCJ1cGRhdGVTZWxlY3RlZE5vZGUiLCJ1cGRhdGVDaGFuZ2VkUHJvcHMiLCJ1cGRhdGVDYWxsYmFjayIsInVzZSIsImdlbmVyYXRlRWxlbWVudHMiLCJwcm9maWxlIiwiZXh0cmFMaW5rcyIsImNvbnN1bWVkIiwiZWxlbWVudHMiLCJzdHJ1Y3R1cmUiLCJyZWNvcmROb2RlIiwicmF3UHJvcGVydHkiLCJpZFR5cGUiLCJwYXJlbnRJZCIsImNoaWxkSWQiLCJsYWJlbCIsInBhcmVudCIsInJlY29yZEVkZ2UiLCJ2aXNpYmxlSW5kZXgiLCJoaWRkZW4iLCJjYlByb2ZpbGUiLCJ0aW1lIiwidG90YWwiLCJyb3VuZCIsImxvYWRpbmdTZXQiLCJlcnJvclNldCIsIm5vZGVJZCIsImNoaWxkSWRzIiwiY2hpbGRGcm9tIiwiY2hpbGRUbyIsInJlZHVjZVN0YXR1cyIsImxhdGVzdCIsImZsYXR0ZW5PdXRwdXRzIiwiZmxhdHRlbklucHV0cyIsImluQXJyYXkiLCJmaW5hbCIsImluSXRlbSIsImNsZWFuT3V0cHV0SWQiLCJvdXRwdXRJZCIsImFnZyIsImNiUHJlZml4TGVuIiwiZGFncmVMYXlvdXQiLCJwYWRkaW5nIiwicmFua2VyIiwiZm9yY2VMYXlvdXQiLCJhbmltYXRlIiwibGF5b3V0cyIsInNwYWNpbmdGYWN0b3IiLCJub2RlU2VwIiwicmFua1NlcCIsInJhbmtEaXIiLCJmb3JjZSIsIkNhbGxiYWNrR3JhcGgiLCJjaGFuZ2VkIiwibGlmZWN5Y2xlU3RhdGUiLCJzZWxlY3RlZCIsInNldFNlbGVjdGVkIiwiX3VzZVN0YXRlMyIsIl91c2VTdGF0ZTQiLCJjeXRvc2NhcGUiLCJzZXRDeXRvc2NhcGUiLCJncmFwaExheW91dCIsImNob3NlblR5cGUiLCJfY2hvc2VuVHlwZSIsImxheW91dFNlbGVjdG9yIiwiX3VzZVN0YXRlNSIsIl91c2VTdGF0ZTYiLCJsYXlvdXRUeXBlIiwic2V0TGF5b3V0VHlwZSIsInVzZUN5dG9zY2FwZUVmZmVjdCIsImVmZmVjdCIsImNvbmRpdGlvbiIsImdldENvbXBvbmVudCIsImhhc1BhdHRlcm5zIiwiZ2V0UHJvcFZhbHVlIiwic2V0UHJlc2V0TGF5b3V0IiwiX2xheW91dFNlbGVjdG9yJGN1cnJlIiwiY3kiLCJwb3NpdGlvbnMiLCJub2RlcyIsImVhY2giLCJwb3NpdGlvbiIsImZpdCIsInpvb20iLCJwYW4iLCJlbGVtZW50TmFtZSIsImVsZW1lbnRJbmZvIiwiX2dldENvbXBvbmVudCIsInJlc3QiLCJjYWxsYmFja091dHB1dElkIiwibmV0d29yayIsImNvbXB1dGUiLCJhdmciLCJ0aW1pbmciLCJkb3dubG9hZCIsInVwbG9hZCIsImN5TGF5b3V0Iiwic3R5bGUiLCJ3aWR0aCIsImhlaWdodCIsInRoZW1lIiwibGFiZWxSZW5kZXJlciIsImdldEl0ZW1TdHJpbmciLCJpdGVtVHlwZSIsInNob3VsZEV4cGFuZE5vZGUiLCJrZXlOYW1lIiwibGV2ZWwiLCJvbkNoYW5nZSIsInJlZiIsIlVuY29ubmVjdGVkQ2FsbGJhY2tHcmFwaENvbnRhaW5lciIsIl9Db21wb25lbnQiLCJjb21wb25lbnREaWRDYXRjaCIsImluZm8iLCJteUlEIiwiZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yIiwiQ2FsbGJhY2tHcmFwaENvbnRhaW5lciIsInNlbGVjdG9yIiwiZGlzcGxheSIsImNvbG9yIiwiZ2hvc3QiLCJvcGFjaXR5IiwiU1RBVFVTTUFQIiwiZ2V0RWRnZVR5cGVzIiwiY29ubmVjdGVkRWRnZXMiLCJhc2NlbmQiLCJjb2xsZWN0aW9uIiwiZWRnZXMiLCJwYXJlbnRzIiwic291cmNlcyIsImFuY2VzdG9ycyIsImRlc2NlbmQiLCJhZGRDbGFzcyIsIm90aGVyIiwiYWJzb2x1dGVDb21wbGVtZW50IiwicmVtb3ZlQ2xhc3MiLCJmbGFzaFRpbWUiLCJmbGFzaENsYXNzIiwiZWRnZXNUbyIsImF2Z1RpbWUiLCJoYXNDbGFzcyIsInRpbWVMZWZ0IiwicHJldkNoaWxkcmVuIiwiQ29sbGFwc2VJY29uIiwid2Vya3pldWdDc3MiLCJGcm9udEVuZEVycm9yIiwiY29sbGFwc2VkIiwiaXNMaXN0SXRlbSIsImluQWxlcnRzVHJheSIsImNhcmRDbGFzc2VzIiwiZXJyb3JIZWFkZXIiLCJ0aW1lc3RhbXAiLCJ0b0xvY2FsZVRpbWVTdHJpbmciLCJFcnJvckNvbnRlbnQiLCJCYWNrZW5kRXJyb3IiLCJpZnJhbWVSZWYiLCJzZXRIZWlnaHQiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwic3JjRG9jIiwiYm9yZGVyIiwiTUFYX01FU1NBR0VfTEVOR1RIIiwiVW5jb25uZWN0ZWRFcnJvckNvbnRlbnQiLCJpc0Z1bGxIdG1sRG9jIiwidG9Mb3dlckNhc2UiLCJpc0h0bWxGcmFnbWVudCIsImVycm9yUHJvcFR5cGVzIiwiRnJvbnRFbmRFcnJvckNvbnRhaW5lciIsImNsaWNrSGFuZGxlciIsImVycm9yRWxlbWVudHMiLCJhcnJheSIsIkRlYnVnTWVudSIsIlVuY29ubmVjdGVkR2xvYmFsRXJyb3JDb250YWluZXIiLCJob3RSZWxvYWQiLCJDaGVja0ljb24iLCJDbG9ja0ljb24iLCJFcnJvckljb24iLCJHcmFwaEljb24iLCJPZmZJY29uIiwiRXhwYW5kIiwiVmVyc2lvbkluZm8iLCJQbG90bHlDbG91ZCIsIkRldnRvb2xQcm92aWRlciIsImNsYXNzZXMiLCJ2YXJpYW50IiwidmFyaWFudDIiLCJpc0NvbGxhcHNlZCIsImxvY2FsU3RvcmFnZSIsImdldEl0ZW0iLCJNZW51Q29udGVudCIsIl9jb25maWckZGV2X3Rvb2xzIiwicG9wdXAiLCJ0b2dnbGVFcnJvcnMiLCJlcnJDb3VudCIsInRvZ2dsZUNhbGxiYWNrR3JhcGgiLCJfU3RhdHVzSWNvbiIsImN1c3RvbSIsImRldl90b29scyIsIl9kZXZ0b29sJHByb3BzIiwiY29tcCIsImxlZnQiLCJyaWdodCIsInBsb3RseV9jbG91ZF9pbnN0YWxsZWQiLCJmaWxsIiwibWFyZ2luUmlnaHQiLCJEZWJ1ZyIsIl91c2VEZXZ0b29sIiwic2V0UG9wdXAiLCJzZXRDb2xsYXBzZWQiLCJ0b2dnbGVDb2xsYXBzZWQiLCJzZXRJdGVtIiwicG9wdXBDb250ZW50IiwibWVudUNvbnRlbnQiLCJwb3B1cE5hbWUiLCJDbG91ZFNsYXNoSWNvbiIsIkNMT1VEX1BPUFVQIiwiaXNPcGVuIiwib25Db3B5IiwibmF2aWdhdG9yIiwiY2xpcGJvYXJkIiwid3JpdGVUZXh0IiwiREFZX0lOX01TIiwiY29tcGFyZVZlcnNpb25zIiwidjEiLCJ2MiIsInYxUGFydHMiLCJ2MlBhcnRzIiwicGFydDEiLCJwYXJ0MiIsInJlcXVlc3REYXNoVmVyc2lvbkluZm8iLCJfcmVxdWVzdERhc2hWZXJzaW9uSW5mbyIsImN1cnJlbnREYXNoVmVyc2lvbiIsImRhc2hWZXJzaW9uVXJsIiwicHl0aG9uVmVyc2lvbiIsImRka1ZlcnNpb24iLCJwbG90bHlWZXJzaW9uIiwiY2FjaGVkVmVyc2lvbkluZm8iLCJjYWNoZWROZXdEYXNoVmVyc2lvbkxpbmsiLCJsYXN0RmV0Y2hlZCIsInF1ZXJ5UGFyYW1zIiwiZGFzaF92ZXJzaW9uIiwiZGFzaF92ZXJzaW9uX3VybCIsInB5dGhvbl92ZXJzaW9uIiwiZGRrX3ZlcnNpb24iLCJwbG90bHlfdmVyc2lvbiIsInZlcnNpb24iLCJzaG91bGRSZXF1ZXN0RGFzaFZlcnNpb24iLCJVUkxTZWFyY2hQYXJhbXMiLCJkaXNhYmxlX3ZlcnNpb25fY2hlY2siLCJzaG93Tm90aWZpY2F0aW9ucyIsInNob3VsZFNob3dVcGdyYWRlTm90aWZpY2F0aW9uIiwibmV3RGFzaFZlcnNpb24iLCJsYXN0RGlzbWlzc2VkIiwibGFzdERpc21pc3NlZFZlcnNpb24iLCJzZXROZXdEYXNoVmVyc2lvbiIsIm5ld0Rhc2hWZXJzaW9uTGluayIsInNldE5ld0Rhc2hWZXJzaW9uTGluayIsInVwZ3JhZGVUb29sdGlwT3BlbmVkIiwic2V0VXBncmFkZVRvb2x0aXBPcGVuZWQiLCJzZXREb250U2hvd0FnYWluIiwic2V0UmVtaW5kTWVMYXRlciIsInNldFNraXBUaGlzVmVyc2lvbiIsImhpZGVVcGdyYWRlVG9vbHRpcCIsIlJFRElSRUNUX1VSSV9QQVRITkFNRSIsIk9BVVRIX0NPT0tJRV9OQU1FIiwibWVzc2FnZVBhcnRzIiwiaW52YWxpZFByb3BQYXRoIiwiZXhwZWN0ZWRQcm9wVHlwZSIsImludmFsaWRQcm9wVHlwZVByb3ZpZGVkIiwianNvblN1cHBsaWVkVmFsdWUiLCJTSU1QTEVfQ09NUE9ORU5UX1RZUEVTIiwibGVuc1BhdGgiLCJzdG9yZVByZWZpeCIsImtleVByZWZpeE1hdGNoIiwicHJlZml4Iiwic2VwYXJhdG9yIiwiZnVsbFN0ciIsImZ1bGxMZW4iLCJVTkRFRklORUQiLCJfcGFyc2UiLCJfc3RyaW5naWZ5IiwiV2ViU3RvcmUiLCJfbmFtZSIsIl9zdG9yYWdlIiwiaGFzSXRlbSIsIl9zZXRJdGVtIiwicmVtb3ZlSXRlbSIsImtleVByZWZpeCIsImZ1bGxQcmVmaXgiLCJrZXlNYXRjaCIsImtleXNUb1JlbW92ZSIsImZ1bGxLZXkiLCJNZW1TdG9yZSIsInBvdyIsImxvbmdTdHJpbmciLCJtZW1vcnkiLCJiYWNrRW5kcyIsImxvY2FsIiwic2Vzc2lvbiIsInRyeUdldFdlYlN0b3JlIiwiZmFsbGJhY2tTdG9yZSIsInN0b3JlVGVzdCIsInRlc3RLZXkiLCJnZXRTdG9yZSIsIm5vb3BUcmFuc2Zvcm0iLCJleHRyYWN0IiwicHJvcFZhbHVlIiwic3RvcmVkVmFsdWUiLCJfcHJvcFZhbHVlIiwiZ2V0VHJhbnNmb3JtIiwicHJvcFBhcnQiLCJwZXJzaXN0ZW5jZVRyYW5zZm9ybXMiLCJnZXRWYWxzS2V5IiwicGVyc2lzdGVkUHJvcCIsInBlcnNpc3RlbmNlIiwiZ2V0UHJvcHMiLCJnZXRWYWwiLCJkYXNoUGVyc2lzdGVuY2UiLCJwZXJzaXN0ZWRfcHJvcHMiLCJwZXJzaXN0ZW5jZV90eXBlIiwiY2FuUGVyc2lzdCIsIl9nZXRQcm9wcyIsImlzUGVyc2lzdGVuY2VNaXNtYXRjaCIsIl9wZXJzaXN0ZWRQcm9wJHNwbGl0IiwiX3BlcnNpc3RlZFByb3Akc3BsaXQyIiwic3RvcmFnZSIsIl9nZXRUcmFuc2Zvcm0iLCJ2YWxzS2V5Iiwib3JpZ2luYWxWYWwiLCJuZXdWYWwiLCJsYXkiLCJwZXJzaXN0ZW5jZU1vZHMiLCJVTkRPIiwibW9kUHJvcCIsInVwZGF0ZSIsIl9zdG9yYWdlJGdldEl0ZW0iLCJfc3RvcmFnZSRnZXRJdGVtMiIsImZyb21WYWwiLCJ0b1ZhbCIsIl9wZXJzaXN0ZWRQcm9wJHNwbGl0MyIsIl9wZXJzaXN0ZWRQcm9wJHNwbGl0NCIsInRyZWVQYXRoIiwiX2dldFByb3BzMiIsImxheW91dE91dCIsImNhcnJpZWRPdmVyIiwiX2dldFByb3BzMyIsImdldEZpbmFsIiwicHJldlZhbCIsImZpbmFsUGVyc2lzdGVuY2UiLCJmaW5hbFBlcnNpc3RlbmNlVHlwZSIsImZpbmFsUGVyc2lzdGVkUHJvcHMiLCJwZXJzaXN0ZW5jZUNoYW5nZWQiLCJub3RJbk5ld1Byb3BzIiwiZGVwZXJzaXN0ZWRQcm9wcyIsImZpbmFsU3RvcmFnZSIsImludGVybmFscyIsIl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEIiwiUmVhY3RDdXJyZW50T3duZXIiLCJSZWFjdEN1cnJlbnREaXNwYXRjaGVyIiwiUmVhY3RDdXJyZW50QmF0Y2hDb25maWciLCJ0cmFuc2l0aW9uIiwicmVhY3RNYWpvciIsInBhcnNlSW50IiwiZm9yIiwiZWxlbWVudFN5bWJvbCIsIm9yaWdpbmFsU3ltYm9sRm9yIiwiUmVhY3RKU1hSdW50aW1lIiwianN4IiwibWF5YmVLZXkiLCJqc3hzIiwianN4REVWIiwiY3JlYXRlQXBpUmVkdWNlciIsIkFwaVJlZHVjZXIiLCJuZXdTdGF0ZSIsIl9hY3Rpb24kcGF5bG9hZCIsIm5ld1JlcXVlc3QiLCJpbml0aWFsQ2hhbmdlIiwiY2hpbGRyZW5fcHJvcHMiLCJzdGF0ZUxpc3QiLCJTVEFSVEVEIiwiSFlEUkFURUQiLCJERVNUUk9ZRUQiLCJpbml0aWFsR3JhcGgiLCJpbml0aWFsRXJyb3IiLCJpbml0aWFsSGlzdG9yeSIsInByZXNlbnQiLCJuZXdQYXN0IiwibmV3RnV0dXJlIiwiY3VzdG9tSG9va3MiLCJiZWFyIiwidmlldyIsImV4aXN0aW5nUHJvcHMiLCJtZXJnZWRQcm9wcyIsImluaXRpYWxQYXRocyIsImNsb25lIiwiZGVmYXVsdFByb2ZpbGUiLCJkZWZhdWx0U3RhdGUiLCJzdGF0dXNNYXBwZWQiLCJjYlJlc291cmNlcyIsInRvdGFsUmVzb3VyY2VzIiwidXNlciIsImNvbWJpbmVSZWR1Y2VycyIsImFwaVJlcXVlc3RzIiwiYWN0aW9uUGF0aCIsInByZWZpeFN0ciIsImZyb21FbnRyaWVzIiwibWFpblJlZHVjZXIiLCJnZXRJbnB1dEhpc3RvcnlTdGF0ZSIsInJlY29yZENoYW5nZXMiLCJyZWZQcm9wcyIsImhpc3RvcnlFbnRyeSIsInByb3BLZXkiLCJyZWNvcmRIaXN0b3J5IiwibmV4dFN0YXRlIiwicmVsb2FkZXJSZWR1Y2VyIiwid2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJmYWN0b3J5IiwiZXhwb3J0cyIsImRlZmluZSIsImFtZCIsIl9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzE0MF9fIiwiX193ZWJwYWNrX21vZHVsZXNfXyIsInRndCIsInNyY3MiLCJfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwic2xpY2VJdGVyYXRvciIsImFyciIsIl9hcnIiLCJfZCIsIl9lIiwiX3MiLCJMaW5rZWRMaXN0IiwibGF5b3V0QmFzZSIsImF1eGlsaWFyeSIsImdldFRvcE1vc3ROb2RlcyIsIm5vZGVzTWFwIiwicm9vdHMiLCJlbGUiLCJjb25uZWN0Q29tcG9uZW50cyIsImVsZXMiLCJ0b3BNb3N0Tm9kZXMiLCJkdW1teU5vZGVzIiwicXVldWUiLCJ2aXNpdGVkVG9wTW9zdE5vZGVzIiwiY3VycmVudE5laWdoYm9yIiwibWluRGVncmVlTm9kZSIsIm1pbkRlZ3JlZSIsIm5vZGVzQ29ubmVjdGVkVG9EdW1teSIsImNtcHQiLCJjdXJyZW50Tm9kZSIsImNoaWxkcmVuT2ZDdXJyZW50Tm9kZSIsImRlc2NlbmRhbnRzIiwic2hpZnQiLCJuZWlnaGJvck5vZGVzIiwibmVpZ2hib3Job29kIiwiZWRnZXNXaXRoIiwibmVpZ2hib3JOb2RlIiwidW5pb24iLCJjaGlsZHJlbk9mTmVpZ2hib3IiLCJyZWxvY2F0ZUNvbXBvbmVudCIsIm9yaWdpbmFsQ2VudGVyIiwiY29tcG9uZW50UmVzdWx0IiwiZml4ZWROb2RlQ29uc3RyYWludCIsIm1pblhDb29yZCIsIlBPU0lUSVZFX0lORklOSVRZIiwibWF4WENvb3JkIiwiTkVHQVRJVkVfSU5GSU5JVFkiLCJtaW5ZQ29vcmQiLCJtYXhZQ29vcmQiLCJxdWFsaXR5IiwiX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiIsIl9kaWRJdGVyYXRvckVycm9yIiwiX2l0ZXJhdG9yRXJyb3IiLCJub2RlSW5kZXhlcyIsImN5Tm9kZSIsIm5vZGVCQiIsImJvdW5kaW5nQm94IiwibGVmdFgiLCJ4Q29vcmRzIiwicmlnaHRYIiwidG9wWSIsInlDb29yZHMiLCJib3R0b21ZIiwiZGlmZk9uWCIsIngiLCJkaWZmT25ZIiwiZ2V0UmVjdCIsIl9kaWZmT25YIiwiX2RpZmZPblkiLCJzZXRDZW50ZXIiLCJnZXRDZW50ZXJYIiwiZ2V0Q2VudGVyWSIsImNhbGNCb3VuZGluZ0JveCIsInBhcmVudE5vZGUiLCJNQVhfU0FGRV9JTlRFR0VSIiwiTUlOX1NBRkVfSU5URUdFUiIsInRvcCIsImJvdHRvbSIsIm5vZGVMZWZ0Iiwibm9kZVJpZ2h0Iiwibm9kZVRvcCIsIm5vZGVCb3R0b20iLCJub3QiLCJ0b3BMZWZ0WCIsInRvcExlZnRZIiwiY2FsY1BhcmVudHNXaXRob3V0Q2hpbGRyZW4iLCJwYXJlbnRzV2l0aG91dENoaWxkcmVuIiwiY2hlY2siLCJjc3MiLCJhdXgiLCJDb1NFTGF5b3V0IiwiQ29TRU5vZGUiLCJQb2ludEQiLCJEaW1lbnNpb25EIiwiTGF5b3V0Q29uc3RhbnRzIiwiRkRMYXlvdXRDb25zdGFudHMiLCJDb1NFQ29uc3RhbnRzIiwiY29zZUxheW91dCIsInNwZWN0cmFsUmVzdWx0IiwiaWRUb0xOb2RlIiwicmFuZG9taXplIiwiaXNGbiIsIm9wdEZuIiwib3B0IiwicHJvY2Vzc0NoaWxkcmVuTGlzdCIsInRoZUNoaWxkIiwiY2hpbGRyZW5fb2ZfY2hpbGRyZW4iLCJ0aGVOb2RlIiwiZGltZW5zaW9ucyIsImxheW91dERpbWVuc2lvbnMiLCJub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHMiLCJvdXRlcldpZHRoIiwib3V0ZXJIZWlnaHQiLCJpc1BhcmVudCIsImdyYXBoTWFuYWdlciIsInBhcnNlRmxvYXQiLCJwYXJlbnRJbmZvIiwibm9kZVJlcHVsc2lvbiIsInBhZGRpbmdMZWZ0IiwicGFkZGluZ1RvcCIsInBhZGRpbmdSaWdodCIsInBhZGRpbmdCb3R0b20iLCJsYWJlbFdpZHRoIiwiaW5jbHVkZUxhYmVscyIsImluY2x1ZGVOb2RlcyIsImluY2x1ZGVPdmVybGF5cyIsImxhYmVsSGVpZ2h0IiwibGFiZWxQb3NWZXJ0aWNhbCIsImxhYmVsUG9zSG9yaXpvbnRhbCIsImlzTmFOIiwicmVjdCIsInRoZU5ld0dyYXBoIiwiZ2V0R3JhcGhNYW5hZ2VyIiwibmV3R3JhcGgiLCJwcm9jZXNzRWRnZXMiLCJnbSIsImlkZWFsTGVuZ3RoVG90YWwiLCJlZGdlQ291bnQiLCJlZGdlIiwic291cmNlTm9kZSIsInRhcmdldE5vZGUiLCJnZXRFZGdlc0JldHdlZW4iLCJlMSIsIm5ld0VkZ2UiLCJpZGVhbExlbmd0aCIsImlkZWFsRWRnZUxlbmd0aCIsImVkZ2VFbGFzdGljaXR5IiwiREVGQVVMVF9FREdFX0xFTkdUSCIsIk1JTl9SRVBVTFNJT05fRElTVCIsIkRFRkFVTFRfUkFESUFMX1NFUEFSQVRJT04iLCJwcm9jZXNzQ29uc3RyYWludHMiLCJjb25zdHJhaW50cyIsImFsaWdubWVudENvbnN0cmFpbnQiLCJyZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQiLCJuZXN0aW5nRmFjdG9yIiwiUEVSX0xFVkVMX0lERUFMX0VER0VfTEVOR1RIX0ZBQ1RPUiIsImdyYXZpdHkiLCJERUZBVUxUX0dSQVZJVFlfU1RSRU5HVEgiLCJudW1JdGVyIiwiTUFYX0lURVJBVElPTlMiLCJncmF2aXR5UmFuZ2UiLCJERUZBVUxUX0dSQVZJVFlfUkFOR0VfRkFDVE9SIiwiZ3Jhdml0eUNvbXBvdW5kIiwiREVGQVVMVF9DT01QT1VORF9HUkFWSVRZX1NUUkVOR1RIIiwiZ3Jhdml0eVJhbmdlQ29tcG91bmQiLCJERUZBVUxUX0NPTVBPVU5EX0dSQVZJVFlfUkFOR0VfRkFDVE9SIiwiaW5pdGlhbEVuZXJneU9uSW5jcmVtZW50YWwiLCJERUZBVUxUX0NPT0xJTkdfRkFDVE9SX0lOQ1JFTUVOVEFMIiwidGlsaW5nQ29tcGFyZUJ5IiwiVElMSU5HX0NPTVBBUkVfQlkiLCJRVUFMSVRZIiwiTk9ERV9ESU1FTlNJT05TX0lOQ0xVREVfTEFCRUxTIiwiREVGQVVMVF9JTkNSRU1FTlRBTCIsIkFOSU1BVEUiLCJUSUxFIiwidGlsZSIsIlRJTElOR19QQURESU5HX1ZFUlRJQ0FMIiwidGlsaW5nUGFkZGluZ1ZlcnRpY2FsIiwiVElMSU5HX1BBRERJTkdfSE9SSVpPTlRBTCIsInRpbGluZ1BhZGRpbmdIb3Jpem9udGFsIiwiUFVSRV9JTkNSRU1FTlRBTCIsIkRFRkFVTFRfVU5JRk9STV9MRUFGX05PREVfU0laRVMiLCJ1bmlmb3JtTm9kZURpbWVuc2lvbnMiLCJzdGVwIiwiVFJBTlNGT1JNX09OX0NPTlNUUkFJTlRfSEFORExJTkciLCJFTkZPUkNFX0NPTlNUUkFJTlRTIiwiQVBQTFlfTEFZT1VUIiwiVFJFRV9SRURVQ1RJT05fT05fSU5DUkVNRU5UQUwiLCJuZXdHcmFwaE1hbmFnZXIiLCJhZGRSb290IiwicnVuTGF5b3V0IiwiZGVzY3JpcHRvciIsIkNvbnN0cnVjdG9yIiwicHJvdG9Qcm9wcyIsInN0YXRpY1Byb3BzIiwiaW5zdGFuY2UiLCJfcmVxdWlyZSIsInNwZWN0cmFsTGF5b3V0IiwiX3JlcXVpcmUyIiwiZGVmYXVsdHMiLCJmcmVlemUiLCJhbmltYXRpb25EdXJhdGlvbiIsImFuaW1hdGlvbkVhc2luZyIsInBhY2tDb21wb25lbnRzIiwic2FtcGxpbmdUeXBlIiwic2FtcGxlU2l6ZSIsIm5vZGVTZXBhcmF0aW9uIiwicGlUb2wiLCJzdG9wIiwiTGF5b3V0IiwiY29zZVJlc3VsdCIsImNvbXBvbmVudENlbnRlcnMiLCJ2ZXJ0aWNhbCIsImhvcml6b250YWwiLCJjb25zdHJhaW50RXhpc3QiLCJsYXlVdGlsIiwicGFja2luZ0VuYWJsZWQiLCJsYXlvdXRVdGlsaXRpZXMiLCJ4MSIsInkxIiwidG9CZVRpbGVkTm9kZXMiLCJfeENvb3JkcyIsIl95Q29vcmRzIiwidGVtcFNwZWN0cmFsUmVzdWx0IiwiaW5kZXhlc1RvQmVEZWxldGVkIiwiX2JvdW5kaW5nQm94IiwiY29tcG9uZW50c0V2YWx1YXRlZCIsInN1YmdyYXBocyIsImhpZGRlbkVsZXMiLCJzdWJncmFwaCIsIm5vZGVJbmRleCIsImJvdW5kaW5nYm94IiwiZ2V0TGVmdCIsImdldFRvcCIsImdldFdpZHRoIiwiZ2V0SGVpZ2h0Iiwic291cmNlTm9kZUluZGV4IiwidGFyZ2V0Tm9kZUluZGV4Iiwic291cmNlQ2VudGVyIiwidGFyZ2V0Q2VudGVyIiwiX3BhcmVudEluZm8iLCJzdGFydFgiLCJzdGFydFkiLCJlbmRYIiwiZW5kWSIsInNoaWZ0UmVzdWx0Iiwic2hpZnRzIiwibmV3WENvb3JkcyIsImR4IiwibmV3WUNvb3JkcyIsImR5IiwiX2NvdW50Iiwibm9kZVJlY3RhbmdsZSIsImdldFBvc2l0aW9ucyIsInBvcyIsInRoZUlkIiwiX3BvcyIsIl9oaWRkZW5FbGVzIiwibGF5b3V0UG9zaXRpb25zIiwiTWF0cml4IiwiU1ZEIiwicGFyZW50Tm9kZXMiLCJwYXJlbnRDaGlsZE1hcCIsImFsbE5vZGVzTmVpZ2hib3Job29kIiwic2FtcGxlc0NvbHVtbiIsIm1pbkRpc3RhbmNlc0NvbHVtbiIsIkMiLCJQSEkiLCJJTlYiLCJmaXJzdFNhbXBsZSIsIm5vZGVTaXplIiwiaW5maW5pdHkiLCJzbWFsbCIsInJhbmRvbVNhbXBsZUNSIiwic2FtcGxlIiwiZmxhZyIsImZsb29yIiwiQkZTIiwicGl2b3QiLCJzYW1wbGluZ01ldGhvZCIsImRpc3RhbmNlIiwibWF4X2Rpc3QiLCJtYXhfaW5kIiwibmVpZ2hib3JzIiwiX2kyIiwiX2kzIiwiYWxsQkZTIiwiX2k0IiwiX2k1IiwiX2k2IiwiX2k3IiwiX2k4IiwiX2oiLCJTVkRSZXN1bHQiLCJzdmQiLCJhX3EiLCJTIiwiYV91IiwiVSIsImFfdiIsIlYiLCJtYXhfcyIsImFfU2lnIiwibXVsdE1hdCIsInRyYW5zcG9zZSIsInBvd2VySXRlcmF0aW9uIiwidGhldGExIiwidGhldGEyIiwiWTEiLCJZMiIsIlYxIiwiVjIiLCJub3JtYWxpemUiLCJfaTkiLCJtdWx0R2FtbWEiLCJtdWx0TCIsImRvdFByb2R1Y3QiLCJhYnMiLCJfaTEwIiwiX2kxMSIsIm1pbnVzT3AiLCJtdWx0Q29ucyIsIl9pMTIiLCJzcXJ0IiwiX2kxMyIsImVsZTIiLCJlbGVJbmRleCIsImRpc2Nvbm5lY3RlZElkIiwiX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjIiLCJfZGlkSXRlcmF0b3JFcnJvcjIiLCJfaXRlcmF0b3JFcnJvcjIiLCJfaTE0IiwiX2kxNSIsImZpcnN0Tm9kZVBvcyIsImZpcnN0Tm9kZVdpZHRoIiwic2Vjb25kTm9kZSIsInNlY29uZE5vZGVXaWR0aCIsImltcGwiLCJyZWdpc3RlciIsIl9fd2VicGFja19tb2R1bGVfY2FjaGVfXyIsIm1vZHVsZUlkIiwiY2FjaGVkTW9kdWxlIiwiX193ZWJwYWNrX2V4cG9ydHNfXyIsIm9uZU9mVHlwZSIsInBhbm5pbmdFbmFibGVkIiwidXNlclBhbm5pbmdFbmFibGVkIiwibWluWm9vbSIsIm1heFpvb20iLCJ6b29taW5nRW5hYmxlZCIsInVzZXJab29taW5nRW5hYmxlZCIsImJveFNlbGVjdGlvbkVuYWJsZWQiLCJhdXRvdW5ncmFiaWZ5IiwiYXV0b2xvY2siLCJhdXRvdW5zZWxlY3RpZnkiLCJ0b0pzb24iLCJoZWFkbGVzcyIsInN0eWxlRW5hYmxlZCIsImhpZGVFZGdlc09uVmlld3BvcnQiLCJ0ZXh0dXJlT25WaWV3cG9ydCIsIm1vdGlvbkJsdXIiLCJtb3Rpb25CbHVyT3BhY2l0eSIsIndoZWVsU2Vuc2l0aXZpdHkiLCJwaXhlbFJhdGlvIiwic2hhbGxvd09iakRpZmYiLCJtaXNtYXRjaGVzIiwiaXNEaWZmQXRLZXkiLCJFIiwiZyIsInBhdGNoSnNvbiIsInZhbDIiLCJmcm9tSnNvbiIsImdldElkIiwiZWxlMSIsIk8iLCJzY3JhdGNoIiwiX2UkQ29tcG9uZW50IiwiY29udGFpbmVyUmVmIiwiY3JlYXRlUmVmIiwiZ2xvYmFsIiwiX2N5IiwidXBkYXRlQ3l0b3NjYXBlIiwiZGVzdHJveSIsIl90aGlzJHByb3BzMiIsIm5vcm1hbGl6ZUVsZW1lbnRzIiwic3RhdGljIiwiQ29udGV4dEtleSIsImdUIiwiZ2V0Q29udGV4dCIsIl9nVCRDb250ZXh0S2V5IiwiY29udGV4dE1hcCIsInJlYWxDb250ZXh0IiwiUmVhY3RSZWR1eENvbnRleHQiLCJjcmVhdGVTdWJzY3JpcHRpb24iLCJ1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0IiwiY29udGV4dCIsInNlcnZlclN0YXRlIiwiX3JlZiRzdGFiaWxpdHlDaGVjayIsInN0YWJpbGl0eUNoZWNrIiwiX3JlZiRub29wQ2hlY2siLCJub29wQ2hlY2siLCJjb250ZXh0VmFsdWUiLCJzdWJzY3JpcHRpb24iLCJnZXRTZXJ2ZXJTdGF0ZSIsInByZXZpb3VzU3RhdGUiLCJvblN0YXRlQ2hhbmdlIiwibm90aWZ5TmVzdGVkU3VicyIsInRyeVN1YnNjcmliZSIsInRyeVVuc3Vic2NyaWJlIiwiQ29udGV4dCIsIl9leHRlbmRzIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UiLCJob2lzdFN0YXRpY3MiLCJpc1ZhbGlkRWxlbWVudFR5cGUiLCJpc0NvbnRleHRDb25zdW1lciIsImRlZmF1bHRTZWxlY3RvckZhY3RvcnkiLCJtYXBEaXNwYXRjaFRvUHJvcHNGYWN0b3J5IiwibWFwU3RhdGVUb1Byb3BzRmFjdG9yeSIsIm1lcmdlUHJvcHNGYWN0b3J5Iiwic2hhbGxvd0VxdWFsIiwid2FybmluZyIsIm5vdEluaXRpYWxpemVkIiwidXNlU3luY0V4dGVybmFsU3RvcmUiLCJpbml0aWFsaXplQ29ubmVjdCIsIkVNUFRZX0FSUkFZIiwiTk9fU1VCU0NSSVBUSU9OX0FSUkFZIiwic3RyaW5naWZ5Q29tcG9uZW50IiwiQ29tcCIsInVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3RXaXRoQXJncyIsImVmZmVjdEZ1bmMiLCJlZmZlY3RBcmdzIiwiY2FwdHVyZVdyYXBwZXJQcm9wcyIsImxhc3RXcmFwcGVyUHJvcHMiLCJsYXN0Q2hpbGRQcm9wcyIsInJlbmRlcklzU2NoZWR1bGVkIiwid3JhcHBlclByb3BzIiwiY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZSIsInN1YnNjcmliZVVwZGF0ZXMiLCJzaG91bGRIYW5kbGVTdGF0ZUNoYW5nZXMiLCJjaGlsZFByb3BzU2VsZWN0b3IiLCJpc01vdW50ZWQiLCJhZGRpdGlvbmFsU3Vic2NyaWJlTGlzdGVuZXIiLCJkaWRVbnN1YnNjcmliZSIsImxhc3RUaHJvd25FcnJvciIsImNoZWNrRm9yVXBkYXRlcyIsImxhdGVzdFN0b3JlU3RhdGUiLCJuZXdDaGlsZFByb3BzIiwidW5zdWJzY3JpYmVXcmFwcGVyIiwiaW5pdFN0YXRlVXBkYXRlcyIsInN0cmljdEVxdWFsIiwiaGFzV2FybmVkQWJvdXREZXByZWNhdGVkUHVyZU9wdGlvbiIsIm1hcFN0YXRlVG9Qcm9wcyIsIm1hcERpc3BhdGNoVG9Qcm9wcyIsIm1lcmdlUHJvcHMiLCJwdXJlIiwiX3JlZiRhcmVTdGF0ZXNFcXVhbCIsImFyZVN0YXRlc0VxdWFsIiwiX3JlZiRhcmVPd25Qcm9wc0VxdWFsIiwiYXJlT3duUHJvcHNFcXVhbCIsIl9yZWYkYXJlU3RhdGVQcm9wc0VxdSIsImFyZVN0YXRlUHJvcHNFcXVhbCIsIl9yZWYkYXJlTWVyZ2VkUHJvcHNFcSIsImFyZU1lcmdlZFByb3BzRXF1YWwiLCJfcmVmJGZvcndhcmRSZWYiLCJmb3J3YXJkUmVmIiwiX3JlZiRjb250ZXh0IiwiaW5pdE1hcFN0YXRlVG9Qcm9wcyIsImluaXRNYXBEaXNwYXRjaFRvUHJvcHMiLCJpbml0TWVyZ2VQcm9wcyIsIndyYXBXaXRoQ29ubmVjdCIsIldyYXBwZWRDb21wb25lbnQiLCJ3cmFwcGVkQ29tcG9uZW50TmFtZSIsInNlbGVjdG9yRmFjdG9yeU9wdGlvbnMiLCJDb25uZWN0RnVuY3Rpb24iLCJfUmVhY3QkdXNlTWVtbyIsInJlYWN0UmVkdXhGb3J3YXJkZWRSZWYiLCJfUmVhY3QkdXNlTWVtbzIiLCJwcm9wc0NvbnRleHQiLCJDb250ZXh0VG9Vc2UiLCJDb25zdW1lciIsImRpZFN0b3JlQ29tZUZyb21Qcm9wcyIsImRpZFN0b3JlQ29tZUZyb21Db250ZXh0IiwiX1JlYWN0JHVzZU1lbW8zIiwiX1JlYWN0JHVzZU1lbW80Iiwib3ZlcnJpZGRlbkNvbnRleHRWYWx1ZSIsImlzUHJvY2Vzc2luZ0Rpc3BhdGNoIiwibGF0ZXN0U3Vic2NyaXB0aW9uQ2FsbGJhY2tFcnJvciIsImFjdHVhbENoaWxkUHJvcHNTZWxlY3RvciIsInN1YnNjcmliZUZvclJlYWN0IiwicmVhY3RMaXN0ZW5lciIsImFjdHVhbENoaWxkUHJvcHMiLCJyZW5kZXJlZFdyYXBwZWRDb21wb25lbnQiLCJyZW5kZXJlZENoaWxkIiwiX0Nvbm5lY3QiLCJtZW1vIiwiQ29ubmVjdCIsIl9mb3J3YXJkZWQiLCJmb3J3YXJkQ29ubmVjdFJlZiIsImZvcndhcmRlZCIsImNyZWF0ZUludmFsaWRBcmdGYWN0b3J5IiwiYmluZEFjdGlvbkNyZWF0b3JzIiwid3JhcE1hcFRvUHJvcHNDb25zdGFudCIsIndyYXBNYXBUb1Byb3BzRnVuYyIsInZlcmlmeVBsYWluT2JqZWN0IiwiZGVmYXVsdE1lcmdlUHJvcHMiLCJzdGF0ZVByb3BzIiwiZGlzcGF0Y2hQcm9wcyIsIm93blByb3BzIiwid3JhcE1lcmdlUHJvcHNGdW5jIiwiaW5pdE1lcmdlUHJvcHNQcm94eSIsImhhc1J1bk9uY2UiLCJtZXJnZVByb3BzUHJveHkiLCJuZXh0TWVyZ2VkUHJvcHMiLCJ2ZXJpZnlTdWJzZWxlY3RvcnMiLCJwdXJlRmluYWxQcm9wc1NlbGVjdG9yRmFjdG9yeSIsImhhc1J1bkF0TGVhc3RPbmNlIiwiaGFuZGxlRmlyc3RDYWxsIiwiZmlyc3RTdGF0ZSIsImZpcnN0T3duUHJvcHMiLCJoYW5kbGVOZXdQcm9wc0FuZE5ld1N0YXRlIiwiZGVwZW5kc09uT3duUHJvcHMiLCJoYW5kbGVOZXdQcm9wcyIsImhhbmRsZU5ld1N0YXRlIiwibmV4dFN0YXRlUHJvcHMiLCJzdGF0ZVByb3BzQ2hhbmdlZCIsImhhbmRsZVN1YnNlcXVlbnRDYWxscyIsIm5leHRPd25Qcm9wcyIsInByb3BzQ2hhbmdlZCIsInN0YXRlQ2hhbmdlZCIsInB1cmVGaW5hbFByb3BzU2VsZWN0b3IiLCJmaW5hbFByb3BzU2VsZWN0b3JGYWN0b3J5IiwidmVyaWZ5IiwibWV0aG9kTmFtZSIsImdldENvbnN0YW50IiwiaW5pdENvbnN0YW50U2VsZWN0b3IiLCJjb25zdGFudCIsImNvbnN0YW50U2VsZWN0b3IiLCJnZXREZXBlbmRzT25Pd25Qcm9wcyIsIm1hcFRvUHJvcHMiLCJpbml0UHJveHlTZWxlY3RvciIsInByb3h5IiwibWFwVG9Qcm9wc1Byb3h5Iiwic3RhdGVPckRpc3BhdGNoIiwiZGV0ZWN0RmFjdG9yeUFuZFZlcmlmeSIsImNyZWF0ZURpc3BhdGNoSG9vayIsImNyZWF0ZVNlbGVjdG9ySG9vayIsImNyZWF0ZVN0b3JlSG9vayIsInVzZURlZmF1bHRTdG9yZSIsImNyZWF0ZVJlZHV4Q29udGV4dEhvb2siLCJ1c2VSZWR1eENvbnRleHQiLCJ1c2VEZWJ1Z1ZhbHVlIiwidXNlRGVmYXVsdFJlZHV4Q29udGV4dCIsInVzZVN5bmNFeHRlcm5hbFN0b3JlV2l0aFNlbGVjdG9yIiwiaW5pdGlhbGl6ZVVzZVNlbGVjdG9yIiwicmVmRXF1YWxpdHkiLCJlcXVhbGl0eUZuT3JPcHRpb25zIiwiZXF1YWxpdHlGbiIsIl9yZWYkZXF1YWxpdHlGbiIsIl91c2VSZWR1eENvbnRleHQiLCJnbG9iYWxTdGFiaWxpdHlDaGVjayIsImdsb2JhbE5vb3BDaGVjayIsImZpcnN0UnVuIiwid3JhcHBlZFNlbGVjdG9yIiwiZmluYWxTdGFiaWxpdHlDaGVjayIsInRvQ29tcGFyZSIsInNlbGVjdGVkMiIsImZpbmFsTm9vcENoZWNrIiwic2VsZWN0ZWRTdGF0ZSIsImFkZE5lc3RlZFN1YiIsInVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzIiwic2V0QmF0Y2giLCJnZXRCYXRjaCIsImNyZWF0ZUxpc3RlbmVyQ29sbGVjdGlvbiIsImZpcnN0IiwibGlzdGVuZXJzIiwiaXNTdWJzY3JpYmVkIiwidW5zdWJzY3JpYmUiLCJudWxsTGlzdGVuZXJzIiwicGFyZW50U3ViIiwic3Vic2NyaXB0aW9uc0Ftb3VudCIsInNlbGZTdWJzY3JpYmVkIiwiY2xlYW51cExpc3RlbmVyIiwiaGFuZGxlQ2hhbmdlV3JhcHBlciIsInRyeVN1YnNjcmliZVNlbGYiLCJ0cnlVbnN1YnNjcmliZVNlbGYiLCJnZXRMaXN0ZW5lcnMiLCJkZWZhdWx0Tm9vcEJhdGNoIiwibmV3QmF0Y2giLCJhY3Rpb25DcmVhdG9ycyIsImJvdW5kQWN0aW9uQ3JlYXRvcnMiLCJhY3Rpb25DcmVhdG9yIiwiaXNQbGFpbk9iamVjdCIsInByb3RvIiwiYmFzZVByb3RvIiwib2JqQSIsIm9iakIiLCJrZXlzQSIsImtleXNCIiwiY2FuVXNlRE9NIiwidXNlTGF5b3V0RWZmZWN0IiwiUkVBQ1RfRUxFTUVOVF9UWVBFIiwiUkVBQ1RfUE9SVEFMX1RZUEUiLCJSRUFDVF9GUkFHTUVOVF9UWVBFIiwiUkVBQ1RfU1RSSUNUX01PREVfVFlQRSIsIlJFQUNUX1BST0ZJTEVSX1RZUEUiLCJSRUFDVF9QUk9WSURFUl9UWVBFIiwiUkVBQ1RfQ09OVEVYVF9UWVBFIiwiUkVBQ1RfU0VSVkVSX0NPTlRFWFRfVFlQRSIsIlJFQUNUX0ZPUldBUkRfUkVGX1RZUEUiLCJSRUFDVF9TVVNQRU5TRV9UWVBFIiwiUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFIiwiUkVBQ1RfTUVNT19UWVBFIiwiUkVBQ1RfTEFaWV9UWVBFIiwiUkVBQ1RfT0ZGU0NSRUVOX1RZUEUiLCJlbmFibGVTY29wZUFQSSIsImVuYWJsZUNhY2hlRWxlbWVudCIsImVuYWJsZVRyYW5zaXRpb25UcmFjaW5nIiwiZW5hYmxlTGVnYWN5SGlkZGVuIiwiZW5hYmxlRGVidWdUcmFjaW5nIiwiUkVBQ1RfTU9EVUxFX1JFRkVSRU5DRSIsIiQkdHlwZW9mIiwiZ2V0TW9kdWxlSWQiLCJ0eXBlT2YiLCIkJHR5cGVvZlR5cGUiLCJDb250ZXh0Q29uc3VtZXIiLCJDb250ZXh0UHJvdmlkZXIiLCJFbGVtZW50IiwiRm9yd2FyZFJlZiIsIkxhenkiLCJNZW1vIiwiUG9ydGFsIiwiUHJvZmlsZXIiLCJTdHJpY3RNb2RlIiwiU3VzcGVuc2UiLCJTdXNwZW5zZUxpc3QiLCJoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0FzeW5jTW9kZSIsImhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQ29uY3VycmVudE1vZGUiLCJpc0FzeW5jTW9kZSIsImlzQ29uY3VycmVudE1vZGUiLCJpc0NvbnRleHRQcm92aWRlciIsImlzRWxlbWVudCIsImlzRm9yd2FyZFJlZiIsImlzRnJhZ21lbnQiLCJpc0xhenkiLCJpc01lbW8iLCJpc1BvcnRhbCIsImlzUHJvZmlsZXIiLCJpc1N0cmljdE1vZGUiLCJpc1N1c3BlbnNlIiwiaXNTdXNwZW5zZUxpc3QiLCJjb29raWVOYW1lUmVnRXhwIiwiY29va2llVmFsdWVSZWdFeHAiLCJkb21haW5WYWx1ZVJlZ0V4cCIsInBhdGhWYWx1ZVJlZ0V4cCIsIm1heEFnZVJlZ0V4cCIsImNvb2tpZU9jdGV0UmVnRXhwIiwiTnVsbE9iamVjdCIsInN0ciIsImxlbiIsImVxSWR4IiwiZXFJbmRleCIsImVuZElkeCIsImVuZEluZGV4IiwidmFsdWVTbGljZSIsInN0cmluZ2lmeUNvb2tpZSIsImVuYyIsImVuY29kZSIsImRlZmF1bHRFbmNvZGUiLCJzdHJpbmdpZnlTZXRDb29raWUiLCJtYXhBZ2UiLCJpc0ludGVnZXIiLCJkb21haW4iLCJleHBpcmVzIiwiaXNGaW5pdGUiLCJ2YWx1ZU9mIiwidG9VVENTdHJpbmciLCJodHRwT25seSIsInNlY3VyZSIsInBhcnRpdGlvbmVkIiwic2FtZVNpdGUiLCJwYXJzZVNldENvb2tpZSIsInNldENvb2tpZSIsImF0dHIiLCJkYXRlIiwiY2hhckNvZGVBdCIsImRlY29kZVVSSUNvbXBvbmVudCIsIl9jdXJyeTIiLCJfZGlzcGF0Y2hhYmxlIiwiX3hhbGwiLCJsaXN0IiwiX2N1cnJ5MSIsImFsd2F5cyIsIl94YW55IiwiX2NvbmNhdCIsIl9yZWR1Y2UiLCJhcHBseUYiLCJhcHBseVgiLCJfY3VycnkzIiwiX2hhcyIsIl9pc0ludGVnZXIiLCJfYXNzb2MiLCJuZXh0T2JqIiwiX2FyaXR5IiwidGhpc09iaiIsIl9jbG9uZSIsInByZWQiLCJfaXNBcnJheSIsIl9pc0Z1bmN0aW9uIiwiX2lzU3RyaW5nIiwiX21hcCIsImN1cnJ5TiIsImNvbnZlcmdlIiwiYWZ0ZXIiLCJmbnMiLCJfY3VycnlOIiwiZGVmYXVsdFRvIiwiX1NldCIsInNlY29uZCIsImZpcnN0TGVuIiwic2Vjb25kTGVuIiwidG9GaWx0ZXJPdXQiLCJfZGlzc29jIiwiX3NoYWxsb3dDbG9uZU9iamVjdCIsIl9pc0FyZ3VtZW50cyIsIl9pc09iamVjdCIsIl9pc1R5cGVkQXJyYXkiLCJfZXF1YWxzIiwidHJhbnNmb3JtYXRpb25zIiwidHJhbnNmb3JtYXRpb24iLCJfYXJyYXlSZWR1Y2UiLCJfZmlsdGVyIiwiX3hmaWx0ZXIiLCJmaWx0ZXJhYmxlIiwiX3hmaW5kIiwiX3hmaW5kSW5kZXgiLCJfbWFrZUZsYXQiLCJfY2hlY2tGb3JNZXRob2QiLCJrZXlMaXN0IiwicmVkdWNlQnkiLCJoYXNQYXRoIiwiX3BhdGgiLCJfaWRlbnRpdHkiLCJfaW5jbHVkZXMiLCJfaW5kZXhPZiIsInhzIiwiZWx0IiwiX25hdGl2ZVNldCIsIl9pdGVtcyIsImhhc09yQWRkIiwic2hvdWxkQWRkIiwicHJldlNpemUiLCJuZXdTaXplIiwiSW5maW5pdHkiLCJiSWR4IiwiYTAiLCJhMSIsImEyIiwiYTMiLCJhNCIsImE1IiwiYTYiLCJhNyIsImE4IiwiYTkiLCJfYXJyYXlGcm9tSXRlcmF0b3IiLCJpdGVyIiwibWV0aG9kbmFtZSIsIl9jbG9uZVJlZ0V4cCIsImRlZXAiLCJfT2JqZWN0TWFwIiwiX2lzUHJpbWl0aXZlIiwiY29weSIsImNvcGllZFZhbHVlIiwiY2FjaGVkQ29weSIsInBhcmFtIiwiaGFzaGVkS2V5IiwiYnVja2V0IiwiUmVnRXhwIiwiZmxhZ3MiLCJpZ25vcmVDYXNlIiwibXVsdGlsaW5lIiwic3RpY2t5IiwidW5pY29kZSIsImRvdEFsbCIsIl9jb21wbGVtZW50Iiwic2V0MSIsInNldDIiLCJsZW4xIiwibGVuMiIsIl9pc0FycmF5TGlrZSIsInN5bUl0ZXJhdG9yIiwiX2NyZWF0ZVJlZHVjZSIsImFycmF5UmVkdWNlIiwibWV0aG9kUmVkdWNlIiwiaXRlcmFibGVSZWR1Y2UiLCJ4ZiIsIl9pc1BsYWNlaG9sZGVyIiwiZjEiLCJmMiIsIl9iIiwiX2EiLCJmMyIsIl9jIiwiY29tYmluZWQiLCJhcmdzSWR4IiwiY29tYmluZWRJZHgiLCJoYXNQbGFjZWhvbGRlciIsIl9pc1RyYW5zZm9ybWVyIiwibWV0aG9kTmFtZXMiLCJ0cmFuc2R1Y2VyQ3JlYXRvciIsInRyYW5zZHVjZXIiLCJfaW5jbHVkZXNXaXRoIiwiX2Z1bmN0aW9uTmFtZSIsIl9vYmplY3RJcyIsIl91bmlxQ29udGVudEVxdWFscyIsImFJdGVyYXRvciIsImJJdGVyYXRvciIsInN0YWNrQSIsInN0YWNrQiIsImVxIiwiYUl0ZW0iLCJ0eXBlQSIsImV4dGVuZGVkU3RhY2tBIiwiZXh0ZW5kZWRTdGFja0IiLCJpbmYiLCJpc0FycmF5TGlrZSIsInJlY3Vyc2l2ZSIsImZsYXR0IiwiamxlbiIsImlsZW4iLCJmdW5jdG9yIiwiX250aCIsIm9mZnNldCIsIl9vYmplY3RBc3NpZ24iLCJuZXh0S2V5IiwicGF0aEFyIiwiX3F1b3RlIiwiZXNjYXBlZCIsIl9pdGVyYWJsZVJlZHVjZSIsIl9tZXRob2RSZWR1Y2UiLCJfcmVkdWNlZCIsInBhZCIsIl90b0lTT1N0cmluZyIsInRvSVNPU3RyaW5nIiwiZ2V0VVRDRnVsbFllYXIiLCJnZXRVVENNb250aCIsImdldFVUQ0RhdGUiLCJnZXRVVENIb3VycyIsImdldFVUQ01pbnV0ZXMiLCJnZXRVVENTZWNvbmRzIiwiZ2V0VVRDTWlsbGlzZWNvbmRzIiwiX3RvU3RyaW5nIiwic2VlbiIsInJlY3VyIiwibWFwUGFpcnMiLCJOYU4iLCJyZXByIiwiX3hBcnJheVJlZHVjZSIsIl94SXRlcmFibGVSZWR1Y2UiLCJfeE1ldGhvZFJlZHVjZSIsIl94UmVkdWNlIiwiX3hmQmFzZSIsIlhBbGwiLCJYQW55IiwiWEZpbHRlciIsIlhGaW5kIiwiWEZpbmRJbmRleCIsIlhNYXAiLCJfeG1hcCIsIlhSZWR1Y2VCeSIsInZhbHVlRm4iLCJ2YWx1ZUFjYyIsImtleUZuIiwiX3hyZWR1Y2VCeSIsIlhUYWtlIiwicmV0IiwiX3h0YWtlIiwiWFVuaXFCeSIsIl94dW5pcUJ5IiwiWFdyYXAiLCJfeHdyYXAiLCJ1bmlxIiwibGlzdDEiLCJsaXN0MiIsInRvS2VlcCIsImludm9rZXIiLCJhcml0eSIsIkN0b3IiLCJqdXh0IiwiaGFzRW51bUJ1ZyIsInByb3BlcnR5SXNFbnVtZXJhYmxlIiwibm9uRW51bWVyYWJsZVByb3BzIiwiaGFzQXJnc0VudW1CdWciLCJjb250YWlucyIsIm5JZHgiLCJrcyIsImNoZWNrQXJnc0xlbmd0aCIsImxlbnMiLCJzZXR0ZXIiLCJ0b0Z1bmN0b3JGbiIsImZvY3VzIiwic2FmZU1heCIsIm1heEJ5VmFsdWUiLCJtYXhCeVR5cGUiLCJzdHJpbmdBIiwibWF4QnlTdHJpbmdWYWx1ZSIsImtleUdlbiIsImNhY2hlIiwibWVyZ2VEZWVwV2l0aEtleSIsImxPYmoiLCJyT2JqIiwibFZhbCIsInJWYWwiLCJtZXJnZVdpdGhLZXkiLCJfbCIsIl9yIiwibmFtZXMiLCJjYWxsZWQiLCJJZGVudGl0eSIsIm92ZXIiLCJwcyIsImZyb21JbmRleCIsInRvSW5kZXgiLCJ0YWtlIiwicGFpcnMiLCJ1bmlxQnkiLCJhcHBsaWVkSXRlbSIsIkNvbnN0IiwiZmFudGFzeUxhbmRfbWFwIiwicnYiXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0M7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQzs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0M7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQzs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0M7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQzs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0M7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQzs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0M7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQzs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0M7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQzs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7O0FBRWxCLGdD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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0M7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQzs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0M7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQzs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0M7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQzs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0M7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQzs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0M7Ozs7Ozs7Ozs7O0FDdkJZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUFDQTtBQUNBLGNBQWMsbUJBQW1CO0FBQ2pDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLGNBQWM7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtCQUFrQixjQUFjO0FBQ2hDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHNFQUFzRSxtQ0FBbUM7O0FBRXpHO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCLGdCQUFnQjtBQUNsQztBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBLGtCQUFrQixPQUFPO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUU7O0FBRUY7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpQkFBaUIsWUFBWTtBQUM3QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ2plQTtBQUNBLGtCQUFrQixtQkFBTyxDQUFDLHlFQUFZOztBQUV0QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTywyQkFBMkI7QUFDbEMsT0FBTywyQkFBMkI7QUFDbEMsT0FBTywyQkFBMkI7QUFDbEMsT0FBTywyQkFBMkI7QUFDbEMsUUFBUSw0QkFBNEI7QUFDcEMsT0FBTywyQkFBMkI7QUFDbEMsT0FBTywyQkFBMkI7QUFDbEMsT0FBTywyQkFBMkI7QUFDbEMsT0FBTyw2QkFBNkI7QUFDcEMsV0FBVyxpQ0FBaUM7QUFDNUMsVUFBVSxnQ0FBZ0M7QUFDMUMsV0FBVyxpQ0FBaUM7QUFDNUMsT0FBTyxxQ0FBcUM7QUFDNUMsU0FBUywyQ0FBMkM7QUFDcEQsUUFBUTtBQUNSOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscURBQXFELGdCQUFnQjtBQUNyRSxtREFBbUQsY0FBYztBQUNqRTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLGlCQUFpQixPQUFPO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSx3QkFBd0I7O0FBRXhCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixPQUFPLFFBQVE7QUFDaEMsaUJBQWlCLE9BQU8sUUFBUTtBQUNoQyxrQkFBa0IsT0FBTyxPQUFPO0FBQ2hDLGtCQUFrQixPQUFPLE9BQU87QUFDaEMsaUJBQWlCLFFBQVEsT0FBTztBQUNoQyxpQkFBaUIsUUFBUSxPQUFPO0FBQ2hDOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVFQUF1RTs7QUFFdkU7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLCtDQUErQyxFQUFFLFVBQVUsRUFBRTtBQUM3RDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtB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O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixrQkFBa0I7QUFDcEM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0Isa0JBQWtCO0FBQ3BDOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLGtIQUFrSCxVQUFVLFlBQVksT0FBTyxLQUFLLFlBQVksV0FBVyxVQUFVLFVBQVUsVUFBVSxVQUFVLE9BQU8sS0FBSyxVQUFVLE9BQU8sS0FBSyxZQUFZLGFBQWEsYUFBYSxhQUFhLE9BQU8sS0FBSyxVQUFVLFVBQVUsWUFBWSxhQUFhLE1BQU0sS0FBSyxVQUFVLFVBQVUsWUFBWSxXQUFXLFVBQVUsWUFBWSxNQUFNLEtBQUssVUFBVSxVQUFVLFVBQVUsTUFBTSxLQUFLLE9BQU8sT0FBTyxXQUFXLEtBQUssS0FBSyxZQUFZLGFBQWEsTUFBTSxLQUFLLFlBQVksV0FBVyxZQUFZLFdBQVcsWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxLQUFLLFlBQVksTUFBTSxLQUFLLFlBQVksYUFBYSxhQUFhLE9BQU8sS0FBSyxVQUFVLFVBQVUsVUFBVSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsV0FBVyxPQUFPLEtBQUssWUFBWSxhQUFhLFlBQVksWUFB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTywwR0FBMEcsWUFBWSxXQUFXLFVBQVUsVUFBVSxVQUFVLFlBQVksYUFBYSxXQUFXLFlBQVksYUFBYSxXQUFXLFVBQVUsVUFBVSxNQUFNLEtBQUssWUFBWSxPQUFPLEtBQUssVUFBVSxVQUFVLFlBQVksYUFBYSxXQUFXLFlBQVksYUFBYSxhQUFhLFdBQVcsVUFBVSxVQUFVLFlBQVksV0FBVyxVQUFVLFlBQVksT0FBTyxLQUFLLFVBQVUsWUFBWSxhQUFhLFdBQVcsVUFBVSxVQUFVLFlBQVksYUFBYSxPQUFPLEtBQUssVUFBVSxVQUFVLFVBQVUsWUFBWSxhQUFhLFdBQVcsWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsT0FBTyxPQUFPLE9BQU8sS0FBSyxZQUFZLE9BQU8sS0FBSyxVQUFVLFlBQVksT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFVBQVUsVUFBVSxZQUFZLGFBQWEsYUFBYSxhQUFhLFdBQVcsWUFBWSxhQUFhLE9BQU8sS0FBSyxVQUFVLFVBQVUsWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLE9BQU8sS0FBSyxVQUFVLFVBQVUsWUFBWSxPQUFPLEtBQUssWUFBWSxXQUFXLFlBQVksT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFlBQVksYUFBYSxXQUFXLFVBQVUsVUFBVSxVQUFVLFVBQVUsWUFBWSxhQUFhLFdBQVcsWUFBWSxhQUFhLFdBQVcsWUFBWSxXQUFXLFlBQVksTUFBTSxPQUFPLGFBQWEsTUFBTSxLQUFLLFVBQVUsTUFBTSxLQUFLLFlBQVksT0FBTyxLQUFLLFlBQVksYUFBYSxXQUFXLFVBQVUsWUFBWSxhQUFhLGFBQWEsYUFBYSxXQUFXLFlBQVksV0FBVyxPQUFPLEtBQUssVUFBVSxZQUFZLE1BQU0sS0FBSyxZQUFZLE1BQU0sS0FBSyxVQUFVLFVBQVUsWUFBWSxhQUFhLGFBQWEsV0FBVyxVQUFVLEtBQUssS0FBSyxVQUFVLFlBQVksV0FBVyxNQUFN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Q0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLHVEQUF1RCxtQkFBbUI7QUFDMUU7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQyxZQUFZO0FBQ3ZEO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDO0FBQzNDLDBDQUEwQztBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEM7QUFDMUMsMkNBQTJDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNsYWE7O0FBRWIsUUFBUSxtQkFBTyxDQUFDLHFEQUFXO0FBQzNCLFdBQVcsbUJBQU8sQ0FBQyxp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Q0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxN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Q0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUN2SmE7O0FBRWIsUUFBUSxtQkFBTyxDQUFDLHVEQUFVOztBQUUxQjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvRUFBb0UsV0FBVztBQUMvRTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxhQUFhLGNBQWM7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Es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O0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsT0FBTztBQUMzQjs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxrQkFBa0IsT0FBTztBQUN6QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0IsT0FBTztBQUN6Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsa0JBQWtCLE9BQU87QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtCQUFrQixPQUFPO0FBQ3pCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixVQUFVO0FBQzlCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxPQUFPO0FBQ1A7QUFDQSxpQ0FBaUMsZ0NBQW1COztBQUVwRDs7O0FBR0E7QUFDQSxZQUFZLGdDQUFtQjs7QUFFL0I7QUFDQSxXQUFXLGdDQUFtQixLQUFLO0FBQ25DOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxvQkFBb0IsT0FBTztBQUMzQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0Esb0JBQW9CLE9BQU87QUFDM0I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLE9BQU87QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsbUJBQW1CO0FBQ3ZDO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQixPQUFPO0FBQ3pCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07O0FBRU47QUFDQSxJQUFJOztBQUVKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0IsT0FBTztBQUN6QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCLE9BQU87QUFDekI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0IsMEJBQTBCO0FBQzVDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBLE9BQU87QUFDUDtBQUNBLGlDQUFpQyxnQ0FBbUI7O0FBRXBEOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsWUFBWSxnQ0FBbUI7O0FBRS9COztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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Q0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0EsQ0FBQzs7QUFFRDs7QUFFQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsT0FBTztBQUNQO0FBQ0E7O0FBRUE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7O0FBR0EscUdBQXFHLHFCQUFxQixtQkFBbUI7O0FBRTdJOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsT0FBTztBQUNQO0FBQ0EsaUNBQWlDLGdDQUFtQjs7QUFFcEQ7OztBQUdBLG1DQUFtQywwQkFBMEIsMENBQTBDLGdCQUFnQixPQUFPLG9CQUFvQixlQUFlLE9BQU87O0FBRXhLLHNCQUFzQixnQ0FBbUI7QUFDekMsb0JBQW9CLGdDQUFtQjtBQUN2QyxZQUFZLGdDQUFtQjtBQUMvQixZQUFZLGdDQUFtQjtBQUMvQixhQUFhLGdDQUFtQjtBQUNoQyxhQUFhLGdDQUFtQjtBQUNoQyxnQkFBZ0IsZ0NBQW1CO0FBQ25DLGNBQWMsZ0NBQW1COztBQUVqQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IscUJBQXFCO0FBQ3pDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0Isa0JBQWtCO0FBQ3RDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0Isa0JBQWtCO0FBQ3hDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBLHNCQUFzQixrQkFBa0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNB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QUVBLE9BQU87QUFDUDtBQUNBOztBQUVBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbURBQW1EOztBQUVuRDtBQUNBLDhDQUE4Qzs7QUFFOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0M7O0FBRWhDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQztBQUMzQyxzRUFBc0U7QUFDdEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7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QUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFlBQVksU0FBUztBQUNyQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFVBQVU7QUFDckIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsR0FBRztBQUNkLGFBQWEsVUFBVTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsVUFBVTtBQUNyQixhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsVUFBVTtBQUNyQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLGFBQWEsVUFBVTtBQUN2QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07O0FBRU47QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7O0FBRVI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixPQUFPO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixPQUFPO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsc0hBQXNILHFCQUFNLG1CQUFtQixxQkFBTTs7QUFFcko7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLFFBQVE7QUFDcEIsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksUUFBUTtBQUNwQixjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxHQUFHO0FBQ2YsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLEdBQUc7QUFDZixjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxHQUFHO0FBQ2YsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxHQUFHO0FBQ2YsY0FBYyxTQUFTO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxHQUFHO0FBQ2YsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksVUFBVTtBQUN0QixZQUFZLFFBQVE7QUFDcEIsWUFBWSxRQUFRLFdBQVc7QUFDL0IsWUFBWSxTQUFTO0FBQ3JCO0FBQ0EsWUFBWSxRQUFRO0FBQ3BCO0FBQ0EsWUFBWSxTQUFTO0FBQ3JCO0FBQ0EsY0FBYyxVQUFVO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsZ0RBQWdELGlCQUFpQjtBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixpQkFBaUI7QUFDbkM7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJ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QUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGNBQWM7O0FBRWQ7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlEQUF5RCxtQ0FBbUMsMEJBQTBCO0FBQ3RIO0FBQ0EsT0FBTztBQUNQO0FBQ0Esd0NBQXdDLFdBQVc7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxXQUFXO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsV0FBVztBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlELHNDQUFzQztBQUN2RjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLOztBQUVMLEdBQUc7QUFDSCxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxvQkFBb0Isa0JBQWtCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsaUJBQWlCO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qix3QkFBd0I7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUixNQUFNOztBQUVOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1COztBQUVuQjtBQUNBLHNCQUFzQixtQkFBbUI7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0JBQW9CLGNBQWM7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wscUJBQXFCLGVBQWU7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixvQkFBb0I7QUFDMUM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSLE1BQU07O0FBRU47QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQixZQUFZO0FBQzlCO0FBQ0E7O0FBRUE7QUFDQSxtQkFBbUIsYUFBYTtBQUNoQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGdCQUFnQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLE9BQU87QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxvQkFBb0IsU0FBUztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFD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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EseURBQXlEOztBQUV6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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Q0EsaURBQWlEO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGdCQUFnQjtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlEO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQSxrREFBa0Q7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWLGtDQUFrQztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRDtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCOztBQUVBO0FBQ0Esc0JBQXNCLGdCQUFnQjtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFD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QTtBQUNBLGVBQWUsTUFBTTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsMkJBQTJCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxrQkFBa0IsaUJBQWlCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsdUJBQXVCLGtCQUFrQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNB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Q0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQiwyQkFBMkI7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixrQkFBa0I7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFH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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixpQkFBaUI7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCOztBQUUzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUIsWUFBWTtBQUNaO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLGdCQUFnQjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWLFFBQVE7QUFDUjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1IsTUFBTTs7QUFFTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0M7O0FBRWxDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUM7O0FBRXJDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGlCQUFpQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixpQkFBaUI7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7QUFDeEM7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1REFBdUQ7QUFDdkQsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLE9BQU87QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxvQkFBb0IsaUJBQWlCO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsbUNBQW1DO0FBQzNEO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFD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QUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLEdBQUc7QUFDSDtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0Isb0JBQW9CO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixvQkFBb0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLG9CQUFvQixnQkFBZ0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUM7QUFDckM7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGtCQUFrQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7O0FBRVI7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEMsUUFBUTtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EscUNBQXFDLFFBQVE7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQSxrQkFBa0IsaUJBQWlCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOztBQUVOO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07O0FBRU47QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsTUFBTTtBQUNOO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EscUNBQXFDO0FBQ3JDO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBLE1BQU07O0FBRU47O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixnQkFBZ0I7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsMEJBQTBCOztBQUUxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsK0JBQStCO0FBQy9CLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFROztBQUVSO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLCtCQUErQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxrQkFBa0IsNkJBQTZCO0FBQy9DO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQSxrQ0FBa0M7QUFDbEM7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxtQkFBbUIsaUNBQWlDO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMLEdBQUcsSUFBSTtBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLG9CQUFvQixvQkFBb0I7QUFDeEM7QUFDQSw2QkFBNkI7QUFDN0I7O0FBRUE7QUFDQSxvQkFBb0Isc0JBQXNCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxtQ0FBbUM7QUFDbkM7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07O0FBRU47QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOztBQUVOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxLQUFLO0FBQ0wsaUJBQWlCO0FBQ2pCLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSwwREFBMEQ7QUFDMUQsaUJBQWlCO0FBQ2pCO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCOztBQUVBO0FBQ0Esc0JBQXNCLHFCQUFxQjtBQUMzQztBQUNBO0FBQ0E7QUFDQSxpREFBaUQ7QUFDakQ7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQix1QkFBdUI7QUFDekM7QUFDQSxvQkFBb0Isc0JBQXNCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCLHlCQUF5QjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixnQkFBZ0I7O0FBRWhCOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0IseUJBQXlCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixxQkFBcUI7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0IsZ0NBQWdDO0FBQ2xEO0FBQ0Esb0JBQW9CLGtCQUFrQjtBQUN0QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQix5QkFBeUI7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QyxtQkFBbUI7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCLGtCQUFrQjtBQUNwQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IseUJBQXlCO0FBQzNDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsZ0NBQWdDO0FBQ2xEO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esb0JBQW9CLGNBQWM7QUFDbEM7QUFDQSwwQkFBMEIsY0FBYztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQix5QkFBeUI7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0IsZ0NBQWdDO0FBQ2xEO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0JBQW9CLGNBQWM7QUFDbEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0Isa0JBQWtCO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1Qjs7QUFFdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxxQkFBcUIsbUJBQW1CO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmOztBQUVBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQSwyQkFBMkI7QUFDM0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmOztBQUVBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7O0FBRUE7QUFDQTtBQUNBLHlDQUF5QyxtQkFBbUI7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsZUFBZTtBQUNmOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxpQkFBaUIsS0FBSztBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGdCQUFnQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGdCQUFnQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0Esd0JBQXdCO0FBQ3hCO0FBQ0E7QUFDQSwyRUFBMkU7QUFDM0U7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCLHlCQUF5QjtBQUN6QixzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLHNDQUFzQztBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixrQkFBa0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDOztBQUVqQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsZUFBZTtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixhQUFhO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0VBQW9FO0FBQ3BFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQztBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMERBQTBEO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrREFBK0Q7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQiwyQkFBMkI7QUFDL0M7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLDBCQUEwQjtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQixrQkFBa0I7QUFDcEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Es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QUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQiw2QkFBNkI7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQiwwQkFBMEI7QUFDOUM7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLG9CQUFvQiwwQkFBMEI7QUFDOUM7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1IsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1Qzs7QUFFdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQzs7QUFFMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFdBQVc7QUFDWDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQztBQUN0QztBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOztBQUVOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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Q0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qix3QkFBd0I7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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O0FBQ0E7QUFDQSxRQUFROztBQUVSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLFFBQVE7O0FBRVI7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLFFBQVE7O0FBRVI7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLFFBQVE7O0FBRVI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsd0JBQXdCO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixTQUFTO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IseUJBQXlCO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBLG9CQUFvQiw0QkFBNEI7QUFDaEQ7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLFlBQVk7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLDZDQUE2QztBQUM3QztBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDOztBQUV2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7O0FB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9DQUFvQzs7QUFFcEM7QUFDQTtBQUNBLG9DQUFvQztBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQ0FBK0M7O0FBRS9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLDRCQUE0QjtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7O0FBRTlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQ7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrRUFBa0U7O0FBRWxFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQztBQUN0QztBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVO0FBQ1YsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVixRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGtCQUFrQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixpQkFBaUI7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLG1CQUFtQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIseUJBQXlCO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixXQUFXO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQjs7QUFFbEI7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCOztBQUVsQjtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDO0FBQzNDO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKLGtDQUFrQztBQUNsQztBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osbUNBQW1DO0FBQ25DO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQSxrQkFBa0IsNkJBQTZCO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCOztBQUU5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdFQUFnRTtBQUNoRSxxQ0FBcUM7QUFDckM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxpRUFBaUU7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsZ0NBQWdDO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCOztBQUU5QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUVBQWlFO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsbUJBQW1CO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DOztBQUVuQztBQUNBO0FBQ0Esa0JBQWtCLFlBQVk7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0EsdUJBQXVCOztBQUV2QjtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IscUJBQXFCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixvQkFBb0I7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixlQUFlO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQ7QUFDbkQ7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxnQ0FBZ0M7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsOEJBQThCO0FBQzFEO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7QUFDQSx3REFBd0Q7QUFDeEQ7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQztBQUNsQyxrQ0FBa0M7O0FBRWxDLHFDQUFxQztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0Esb0RBQW9EO0FBQ3BEOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLHdGQUF3RjtBQUN4RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLGdDQUFnQztBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckIscUNBQXFDO0FBQ3JDLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsZ0NBQWdDO0FBQ25FO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLGdDQUFnQztBQUM3RDtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsMERBQTBEO0FBQzFEO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscURBQXFEO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsZ0NBQWdDO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDOztBQUVEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRCx1Q0FBdUMsdUJBQXVCOztBQUVuSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBEQUEwRCx3QkFBd0Isa0VBQWtFLEtBQUs7O0FBRXpKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2RUFBNkUsMENBQTBDLHlDQUF5QyxpQ0FBaUMsNkVBQTZFLEtBQUs7O0FBRW5SO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXVELG9CQUFvQiwyRUFBMkUsNkNBQTZDLG9CQUFvQixLQUFLLE9BQU8sc0NBQXNDLHFDQUFxQyxxQ0FBcUMsaURBQWlELE9BQU8sZ0dBQWdHLGdGQUFnRixLQUFLOztBQUVoa0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsdUJBQXVCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9EQUFvRDs7QUFFcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxjQUFjLFNBQVM7QUFDdkIsZUFBZSxtQkFBbUI7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCLFNBQVM7QUFDM0IsbUJBQW1CLFNBQVM7QUFDNUIsbUJBQW1CLFdBQVc7QUFDOUIsbUJBQW1CLFdBQVc7QUFDOUIsbUJBQW1CLFdBQVc7QUFDOUIsbUJBQW1CLFdBQVc7QUFDOUIsbUJBQW1CLFdBQVc7QUFDOUIsbUJBQW1CLFdBQVc7QUFDOUIsbUJBQW1CLFdBQVc7QUFDOUIsbUJBQW1CLFdBQVc7QUFDOUIsbUJBQW1CLFdBQVc7QUFDOUI7QUFDQTtBQUNBLGdCQUFnQixTQUFTO0FBQ3pCLGdCQUFnQix3QkFBd0I7QUFDeEM7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0IsU0FBUztBQUMzQixtQkFBbUIsV0FBVztBQUM5QixtQkFBbUIsV0FBVztBQUM5QixtQkFBbUIsV0FBVztBQUM5QixtQkFBbUIsd0JBQXdCO0FBQzNDO0FBQ0E7QUFDQSxrQkFBa0IsU0FBUztBQUMzQixtQkFBbUIsU0FBUztBQUM1QixtQkFBbUIsU0FBUztBQUM1QixtQkFBbUIsU0FBUztBQUM1QixtQkFBbUIsU0FBUztBQUM1QixtQkFBbUIsU0FBUztBQUM1QixtQkFBbUIsVUFBVTtBQUM3QjtBQUNBO0FBQ0EsZ0JBQWdCLFNBQVM7QUFDekIsZ0JBQWdCLDRCQUE0QjtBQUM1QztBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsdUZBQXVGO0FBQ3ZGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVCxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSw2RUFBNkUsc0NBQXNDLGdDQUFnQyx1REFBdUQsb0VBQW9FLGdGQUFnRiwySEFBMkgsd0RBQXdELHVEQUF1RCxrRkFBa0YsOEJBQThCLDRCQUE0QiwyRkFBMkYsK0ZBQStGLG9EQUFvRCx5SEFBeUgsd0JBQXdCLDJCQUEyQiwwRUFBMEUsK0JBQStCLGdDQUFnQywrQkFBK0Isb0NBQW9DLG1DQUFtQyxtQ0FBbUMsNkJBQTZCLGlDQUFpQyxnQ0FBZ0MscUNBQXFDLHNHQUFzRyxpQ0FBaUMsc0RBQXNELGdDQUFnQyxnQ0FBZ0Msb0RBQW9ELDJCQUEyQixhQUFhLGtEQUFrRCwyQkFBMkIsYUFBYSwwQ0FBMEMsa0RBQWtELDhIQUE4SCxXQUFXLDhNQUE4TSwySUFBMkksZ0VBQWdFLG9FQUFvRSx1SUFBdUksMENBQTBDLHdDQUF3QyxzQ0FBc0MseUZBQXlGLFdBQVcsNERBQTRELDJDQUEyQywyQ0FBMkMsdUhBQXVILCtHQUErRywrREFBK0QsNEZBQTRGLHlFQUF5RSw0QkFBNEIsWUFBWSxpRUFBaUUsMkNBQTJDLDJDQUEyQywyQ0FBMkMsMkNBQTJDLHVIQUF1SCxtQ0FBbUMsb0NBQW9DLDZEQUE2RCwwQkFBMEIsMEJBQTBCLDZCQUE2QixjQUFjLE9BQU8sbUhBQW1ILDBCQUEwQiwwQkFBMEIsMkNBQTJDLGFBQWEsaUNBQWlDLCtCQUErQiwrQkFBK0IsOEdBQThHLHNEQUFzRCxxSEFBcUgscUdBQXFHLHdDQUF3Qyx5Q0FBeUMsZ0xBQWdMLDhFQUE4RSxjQUFjLE1BQU0sOEpBQThKLDhFQUE4RSxhQUFhLDhCQUE4QixZQUFZLG9FQUFvRSwrSEFBK0gsbUVBQW1FLG1FQUFtRSx5RkFBeUYsNEJBQTRCLFdBQVcsZ0JBQWdCLG9EQUFvRCxtRUFBbUUsZ0NBQWdDLGdDQUFnQywwQkFBMEIsU0FBUztBQUNscU07QUFDQSwrRUFBK0U7QUFDL0Usd0RBQXdEO0FBQ3hELE9BQU8saURBQWlELDRCQUE0Qiw0QkFBNEIsdUJBQXVCLDJCQUEyQixtREFBbUQsNEJBQTRCLDhCQUE4QiwrQkFBK0IsOEJBQThCLG1DQUFtQyxrQ0FBa0Msa0NBQWtDLDRCQUE0Qiw2S0FBNkssMktBQTJLLFNBQVMsdURBQXVELGtSQUFrUixTQUFTLDJCQUEyQixpREFBaUQ7QUFDOXNDLG9HQUFvRztBQUNwRyxPQUFPLGtDQUFrQyx5REFBeUQsb0dBQW9HLCtDQUErQyw4QkFBOEIscURBQXFELHNGQUFzRixpRUFBaUUsZ0dBQWdHLDJNQUEyTSw0REFBNEQsZ0RBQWdELG9EQUFvRCwrREFBK0QsK0RBQStELHlDQUF5QyxxSUFBcUksNkNBQTZDLHVFQUF1RSxvQ0FBb0MsY0FBYyxzREFBc0Qsb0NBQW9DLG9DQUFvQyw0Q0FBNEMsa0NBQWtDLGNBQWMsTUFBTSw2REFBNkQsYUFBYSwyUEFBMlAsbUNBQW1DLHdCQUF3QixnQkFBZ0IsTUFBTSw4RUFBOEUsZUFBZSxjQUFjLE1BQU0sbUNBQW1DLDhFQUE4RSxvRUFBb0UsdUVBQXVFLGdCQUFnQixvQkFBb0IsZ0NBQWdDLDhEQUE4RCx1Q0FBdUMsa0JBQWtCLDZCQUE2Qiw0Q0FBNEMsa0JBQWtCLE1BQU0sMkRBQTJELGlCQUFpQiwyRUFBMkUsZUFBZSxhQUFhLFdBQVcsZ0JBQWdCLDhCQUE4QixXQUFXLDRFQUE0RSxzQ0FBc0Msa0JBQWtCO0FBQ3QvRjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsK0NBQStDO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLDhCQUE4QjtBQUMxRDtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7O0FBRW5DO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUVBQWlFLGtCQUFrQjtBQUNuRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDOztBQUU3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQztBQUNoQyxnQ0FBZ0M7QUFDaEMsZ0NBQWdDO0FBQ2hDLGdDQUFnQztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0VBQWtFO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDLHlDQUF5QztBQUN6Qyx5Q0FBeUM7QUFDekMseUNBQXlDOztBQUV6QztBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLHdCQUF3Qix1QkFBdUI7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQSxzQkFBc0IsZUFBZTtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsVUFBVTtBQUNWLGdDQUFnQztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLHdCQUF3QixzQkFBc0I7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixnQ0FBZ0M7QUFDN0Q7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLG9CQUFvQjtBQUMxQztBQUNBO0FBQ0E7QUFDQSx3QkFBd0Isc0JBQXNCO0FBQzlDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQzs7QUFFM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQzs7QUFFRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHOztBQUVIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLHFCQUFxQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLG9DQUFvQztBQUNwQztBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsT0FBTztBQUN6QjtBQUNBLHdDQUF3QztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qiw4QkFBOEI7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDLDJCQUEyQjtBQUMzQixvREFBb0Q7QUFDcEQsTUFBTTtBQUNOLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLHlCQUF5QjtBQUMvQztBQUNBO0FBQ0Esd0JBQXdCLHdCQUF3QjtBQUNoRDtBQUNBO0FBQ0EsTUFBTTtBQUNOLHdCQUF3QixtQkFBbUI7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLGdDQUFnQztBQUM3RDtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHVCQUF1QjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQixpQkFBaUI7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixpQkFBaUI7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxpREFBaUQ7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQ7O0FBRXJEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0Isa0JBQWtCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsVUFBVTtBQUNWO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMERBQTBEO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHVCQUF1QjtBQUN6Qyx3RUFBd0U7QUFDeEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0Isc0JBQXNCO0FBQ3hDLGlFQUFpRTtBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EscUJBQXFCLGtCQUFrQjtBQUN2QztBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxvQkFBb0IsaUJBQWlCO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSwrQ0FBK0M7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQix5QkFBeUI7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGtCQUFrQixpQkFBaUI7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxxREFBcUQ7QUFDckQsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSLDRFQUE0RTtBQUM1RTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw0QkFBNEIscUJBQXFCO0FBQ2pEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBLHFDQUFxQyw0QkFBNEI7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw2QkFBNkIsMEJBQTBCLGVBQWU7QUFDdEU7O0FBRU87QUFDUDtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsTUFBTTtBQUNOO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FDam9Cc0IsQ0FBQztBQUNxQjtBQUNQOztBQUVyQztBQUNBcFQsTUFBTSxDQUFDOG5DLFlBQVksR0FBR0EsdURBQVksQyIsInNvdXJjZXMiOlsid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQHBsb3RseS9kYXNoLWNvbXBvbmVudC1wbHVnaW5zL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL2ljb25zL0NoZWNrSWNvbi5zdmciLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL2ljb25zL0Nsb2NrSWNvbi5zdmciLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL2ljb25zL0Nsb3VkU2xhc2hJY29uLnN2ZyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvaWNvbnMvQ29sbGFwc2VJY29uLnN2ZyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvaWNvbnMvRXJyb3JJY29uLnN2ZyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvaWNvbnMvRXhwYW5kLnN2ZyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvaWNvbnMvR3JhcGhJY29uLnN2ZyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvaWNvbnMvT2ZmSWNvbi5zdmciLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9BcHBQcm92aWRlci5yZWFjdC50c3giLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9TdG9yZU9ic2VydmVyLnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvYWN0aW9ucy9jYWxsYmFja3MudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9hY3Rpb25zL2RlcGVuZGVuY2llc190cy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2FjdGlvbnMvaXNMb2FkaW5nLnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvYWN0aW9ucy9sb2FkaW5nLnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvYWN0aW9ucy9wYXRjaC50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2FjdGlvbnMvcGF0Y2hBbmFseXNpcy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2FjdGlvbnMvcGF0dGVybk1hdGNoaW5nLnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvYWN0aW9ucy9yZXF1ZXN0RGVwZW5kZW5jaWVzLnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29uZmlnLnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvZGFzaEFwaS50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL29ic2VydmVycy9kb2N1bWVudFRpdGxlLnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvb2JzZXJ2ZXJzL2V4ZWN1dGVkQ2FsbGJhY2tzLnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvb2JzZXJ2ZXJzL2V4ZWN1dGluZ0NhbGxiYWNrcy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL29ic2VydmVycy9pc0xvYWRpbmcudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9vYnNlcnZlcnMvcHJpb3JpdGl6ZWRDYWxsYmFja3MudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9vYnNlcnZlcnMvcmVxdWVzdFNsb3QudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9vYnNlcnZlcnMvcmVxdWVzdGVkQ2FsbGJhY2tzLnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvb2JzZXJ2ZXJzL3N0b3JlZENhbGxiYWNrcy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL29ic2VydmVycy93ZWJzb2NrZXRPYnNlcnZlci50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2NhbGxiYWNrSm9icy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2NhbGxiYWNrcy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2lzTG9hZGluZy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2xvYWRpbmcudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9zdG9yZS50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3V0aWxzL2NhbGxiYWNrcy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3V0aWxzL2NsaWVudHNpZGVGdW5jdGlvbnMudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy91dGlscy9saWJyYXJpZXMudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy91dGlscy9wcm9wUGF0aC50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3V0aWxzL3JlbmRlcmVySWQudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy91dGlscy9zdG9yZXMudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy91dGlscy9zdHJlYW1DbGllbnQudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy91dGlscy93YWl0LnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvdXRpbHMvd29ya2VyQ2xpZW50LnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvd3JhcHBlci9DaGVja2VkQ29tcG9uZW50LnRzeCIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3dyYXBwZXIvRGFzaENvbnRleHQudHN4Iiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvd3JhcHBlci9EYXNoV3JhcHBlci50c3giLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy93cmFwcGVyL0V4dGVybmFsV3JhcHBlci50c3giLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy93cmFwcGVyL3NlbGVjdG9ycy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3dyYXBwZXIvd3JhcHBpbmcudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9BUElDb250cm9sbGVyLnJlYWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvQXBwQ29udGFpbmVyLnJlYWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvRGFzaFJlbmRlcmVyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvYWN0aW9ucy9hcGkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9hY3Rpb25zL2NvbnN0YW50cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2FjdGlvbnMvZGVwZW5kZW5jaWVzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvYWN0aW9ucy9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2FjdGlvbnMvaXNBcHBSZWFkeS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2FjdGlvbnMvcGF0aHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9hY3Rpb25zL3V0aWxzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY2hlY2tQcm9wVHlwZXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2NvcmUvTG9hZGluZy5yZWFjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvY29yZS9SZWxvYWRlci5yZWFjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvY29yZS9Ub29sYmFyLnJlYWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9DYWxsYmFja0dyYXBoL0NhbGxiYWNrR3JhcGhDb250YWluZXIucmVhY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL0NhbGxiYWNrR3JhcGgvQ2FsbGJhY2tHcmFwaENvbnRhaW5lclN0eWxlc2hlZXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL0NhbGxiYWNrR3JhcGgvQ2FsbGJhY2tHcmFwaEVmZmVjdHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL0NvbXBvbmVudEVycm9yQm91bmRhcnkucmVhY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL0Zyb250RW5kL0Zyb250RW5kRXJyb3IucmVhY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL0Zyb250RW5kL0Zyb250RW5kRXJyb3JDb250YWluZXIucmVhY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL0dsb2JhbEVycm9yQ29udGFpbmVyLnJlYWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9tZW51L0RlYnVnTWVudS5yZWFjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvbWVudS9EZXZ0b29sQ29udGV4dC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvbWVudS9QbG90bHlDbG91ZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvbWVudS9WZXJzaW9uSW5mby5yZWFjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3Ivd2Vya3pldWdjc3MuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb25zdGFudHMvY29uc3RhbnRzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvZXhjZXB0aW9ucy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2lzU2ltcGxlQ29tcG9uZW50LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvcGVyc2lzdGVuY2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9yZWFjdC1zaGltLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvcmVkdWNlcnMvYXBpLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvcmVkdWNlcnMvYXBwTGlmZWN5Y2xlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvcmVkdWNlcnMvY2hhbmdlZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2NvbmZpZy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2NvbnN0YW50cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2RlcGVuZGVuY3lHcmFwaC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2Vycm9yLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvcmVkdWNlcnMvaGlzdG9yeS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2hvb2tzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvcmVkdWNlcnMvbGF5b3V0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvcmVkdWNlcnMvcGF0aHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9yZWR1Y2Vycy9wcm9maWxlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvcmVkdWNlcnMvcmVkdWNlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZ2lzdHJ5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvY3l0b3NjYXBlLWZjb3NlL2N5dG9zY2FwZS1mY29zZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4uL3NyYy90eXBlcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4uL3NyYy9kaWZmLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi4vc3JjL2pzb24uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uLi9zcmMvZGVmYXVsdHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uLi9zcmMvcGF0Y2guanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uLi9zcmMvY29tcG9uZW50LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvY29tcG9uZW50cy9Db250ZXh0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvY29tcG9uZW50cy9Qcm92aWRlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2NvbXBvbmVudHMvY29ubmVjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2Nvbm5lY3QvaW52YWxpZEFyZ0ZhY3RvcnkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9jb25uZWN0L21hcERpc3BhdGNoVG9Qcm9wcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2Nvbm5lY3QvbWFwU3RhdGVUb1Byb3BzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvY29ubmVjdC9tZXJnZVByb3BzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvY29ubmVjdC9zZWxlY3RvckZhY3RvcnkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9jb25uZWN0L3ZlcmlmeVN1YnNlbGVjdG9ycy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2Nvbm5lY3Qvd3JhcE1hcFRvUHJvcHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9leHBvcnRzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvaG9va3MvdXNlRGlzcGF0Y2guanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9ob29rcy91c2VSZWR1eENvbnRleHQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9ob29rcy91c2VTZWxlY3Rvci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2hvb2tzL3VzZVN0b3JlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy90eXBlcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL3V0aWxzL1N1YnNjcmlwdGlvbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL3V0aWxzL2JhdGNoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvdXRpbHMvYmluZEFjdGlvbkNyZWF0b3JzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvdXRpbHMvaXNQbGFpbk9iamVjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL3V0aWxzL3JlYWN0QmF0Y2hlZFVwZGF0ZXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy91dGlscy9zaGFsbG93RXF1YWwuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy91dGlscy91c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvdXRpbHMvdXNlU3luY0V4dGVybmFsU3RvcmUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy91dGlscy92ZXJpZnlQbGFpbk9iamVjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL3V0aWxzL3dhcm5pbmcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9ub2RlX21vZHVsZXMvcmVhY3QtaXMvY2pzL3JlYWN0LWlzLmRldmVsb3BtZW50LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvbm9kZV9tb2R1bGVzL3JlYWN0LWlzL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9hcGF0aHkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL2FzaGVzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9hdGVsaWVyLWR1bmUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL2F0ZWxpZXItZm9yZXN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9hdGVsaWVyLWhlYXRoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9hdGVsaWVyLWxha2VzaWRlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9hdGVsaWVyLXNlYXNpZGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL2Jlc3Bpbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvYnJld2VyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9icmlnaHQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL2NoYWxrLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9jb2Rlc2Nob29sLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9jb2xvcnMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL2RlZmF1bHQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL2VpZ2h0aWVzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9lbWJlcnMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL2ZsYXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL2dvb2dsZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvZ3JheXNjYWxlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9ncmVlbnNjcmVlbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvaGFybW9uaWMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL2hvcHNjb3RjaC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL2lzb3RvcGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL21hcnJha2VzaC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvbW9jaGEuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL21vbm9rYWkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL29jZWFuLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9wYXJhaXNvLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9wb3AuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL3JhaWxzY2FzdHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL3NoYXBlc2hpZnRlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvc29sYXJpemVkLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9zdW1tZXJmcnVpdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvdGhyZWV6ZXJvdHdvZm91ci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvdG9tb3Jyb3cuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL3R1YmUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL3R3aWxpZ2h0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvY29sb3ItbmFtZS9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2NvbG9yLXN0cmluZy9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2NvbG9yL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvY29sb3Ivbm9kZV9tb2R1bGVzL2NvbG9yLWNvbnZlcnQvY29udmVyc2lvbnMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9jb2xvci9ub2RlX21vZHVsZXMvY29sb3ItY29udmVydC9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2NvbG9yL25vZGVfbW9kdWxlcy9jb2xvci1jb252ZXJ0L3JvdXRlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvY29sb3Ivbm9kZV9tb2R1bGVzL2NvbG9yLW5hbWUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9jb3NlLWJhc2UvY29zZS1iYXNlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9jb3JlL1Rvb2xiYXIuY3NzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9DYWxsYmFja0dyYXBoL0NhbGxiYWNrR3JhcGhDb250YWluZXIuY3NzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9Gcm9udEVuZC9Gcm9udEVuZEVycm9yLmNzcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvUGVyY3kuY3NzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9tZW51L0RlYnVnTWVudS5jc3MiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL21lbnUvUGxvdGx5Q2xvdWQuY3NzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9tZW51L1ZlcnNpb25JbmZvLmNzcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9jeXRvc2NhcGUtZGFncmUvY3l0b3NjYXBlLWRhZ3JlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvYWN5Y2xpYy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9hZGQtYm9yZGVyLXNlZ21lbnRzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL2Nvb3JkaW5hdGUtc3lzdGVtLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL2RhdGEvbGlzdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9kZWJ1Zy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9ncmFwaGxpYi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9ncmVlZHktZmFzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL2xheW91dC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9sb2Rhc2guanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvbmVzdGluZy1ncmFwaC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9ub3JtYWxpemUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvb3JkZXIvYWRkLXN1YmdyYXBoLWNvbnN0cmFpbnRzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL29yZGVyL2JhcnljZW50ZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvb3JkZXIvYnVpbGQtbGF5ZXItZ3JhcGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvb3JkZXIvY3Jvc3MtY291bnQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvb3JkZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvb3JkZXIvaW5pdC1vcmRlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9vcmRlci9yZXNvbHZlLWNvbmZsaWN0cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9vcmRlci9zb3J0LXN1YmdyYXBoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL29yZGVyL3NvcnQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvcGFyZW50LWR1bW15LWNoYWlucy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9wb3NpdGlvbi9iay5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9wb3NpdGlvbi9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9yYW5rL2ZlYXNpYmxlLXRyZWUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvcmFuay9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9yYW5rL25ldHdvcmstc2ltcGxleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9yYW5rL3V0aWwuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvdXRpbC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi92ZXJzaW9uLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGVwZW5kZW5jeS1ncmFwaC9saWIvZGVwX2dyYXBoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZmFzdC1pc251bWVyaWMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9ncmFwaGxpYi9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9hbGcvY29tcG9uZW50cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9hbGcvZGZzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy9kaWprc3RyYS1hbGwuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvYWxnL2RpamtzdHJhLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy9maW5kLWN5Y2xlcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9hbGcvZmxveWQtd2Fyc2hhbGwuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvYWxnL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy9pcy1hY3ljbGljLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy9wb3N0b3JkZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvYWxnL3ByZW9yZGVyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy9wcmltLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy90YXJqYW4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvYWxnL3RvcHNvcnQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvZGF0YS9wcmlvcml0eS1xdWV1ZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9ncmFwaC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9qc29uLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2xvZGFzaC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi92ZXJzaW9uLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvaG9pc3Qtbm9uLXJlYWN0LXN0YXRpY3MvZGlzdC9ob2lzdC1ub24tcmVhY3Qtc3RhdGljcy5janMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9pbnZhcmlhbnQvYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2lzLXN0cmluZy1ibGFuay9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xheW91dC1iYXNlL2xheW91dC1iYXNlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoLmN1cnJ5L2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19EYXRhVmlldy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fSGFzaC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fTGlzdENhY2hlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19NYXAuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX01hcENhY2hlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19Qcm9taXNlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19TZXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX1NldENhY2hlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19TdGFjay5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fU3ltYm9sLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19VaW50OEFycmF5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19XZWFrTWFwLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hcHBseS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlFYWNoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheUZpbHRlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlJbmNsdWRlcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlJbmNsdWRlc1dpdGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2FycmF5TGlrZUtleXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2FycmF5TWFwLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheVB1c2guanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2FycmF5UmVkdWNlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheVNvbWUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2FzY2lpU2l6ZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXNzaWduTWVyZ2VWYWx1ZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXNzaWduVmFsdWUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Fzc29jSW5kZXhPZi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUFzc2lnbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUFzc2lnbkluLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlQXNzaWduVmFsdWUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VDbG9uZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUNyZWF0ZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUVhY2guanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VFeHRyZW11bS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUZpbHRlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUZpbmRJbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUZsYXR0ZW4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VGb3IuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VGb3JPd24uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VHZXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VHZXRBbGxLZXlzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlR2V0VGFnLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlR3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VIYXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VIYXNJbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUluZGV4T2YuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc0FyZ3VtZW50cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzRXF1YWwuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc0VxdWFsRGVlcC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzTWFwLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXNNYXRjaC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzTmFOLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXNOYXRpdmUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc1NldC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzVHlwZWRBcnJheS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUl0ZXJhdGVlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlS2V5cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUtleXNJbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUx0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlTWFwLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlTWF0Y2hlcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZU1hdGNoZXNQcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZU1lcmdlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlTWVyZ2VEZWVwLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlT3JkZXJCeS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVBpY2suanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VQaWNrQnkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VQcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVByb3BlcnR5RGVlcC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVJhbmdlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlUmVkdWNlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlUmVzdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVNldC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVNldFRvU3RyaW5nLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlU29ydEJ5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlVGltZXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VUb1N0cmluZy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVRyaW0uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VVbmFyeS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVVuaXEuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VWYWx1ZXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VaaXBPYmplY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NhY2hlSGFzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jYXN0RnVuY3Rpb24uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Nhc3RQYXRoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jbG9uZUFycmF5QnVmZmVyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jbG9uZUJ1ZmZlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY2xvbmVEYXRhVmlldy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY2xvbmVSZWdFeHAuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Nsb25lU3ltYm9sLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jbG9uZVR5cGVkQXJyYXkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NvbXBhcmVBc2NlbmRpbmcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NvbXBhcmVNdWx0aXBsZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY29weUFycmF5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jb3B5T2JqZWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jb3B5U3ltYm9scy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY29weVN5bWJvbHNJbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY29yZUpzRGF0YS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY3JlYXRlQXNzaWduZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NyZWF0ZUJhc2VFYWNoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jcmVhdGVCYXNlRm9yLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jcmVhdGVGaW5kLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jcmVhdGVSYW5nZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY3JlYXRlU2V0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19kZWZpbmVQcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZXF1YWxBcnJheXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2VxdWFsQnlUYWcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2VxdWFsT2JqZWN0cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZmxhdFJlc3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2ZyZWVHbG9iYWwuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldEFsbEtleXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldEFsbEtleXNJbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0TWFwRGF0YS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0TWF0Y2hEYXRhLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXROYXRpdmUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldFByb3RvdHlwZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0UmF3VGFnLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXRTeW1ib2xzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXRTeW1ib2xzSW4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldFRhZy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0VmFsdWUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc1BhdGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc1VuaWNvZGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc2hDbGVhci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faGFzaERlbGV0ZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faGFzaEdldC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faGFzaEhhcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faGFzaFNldC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faW5pdENsb25lQXJyYXkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2luaXRDbG9uZUJ5VGFnLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19pbml0Q2xvbmVPYmplY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzRmxhdHRlbmFibGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzSW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzSXRlcmF0ZWVDYWxsLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19pc0tleS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faXNLZXlhYmxlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19pc01hc2tlZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faXNQcm90b3R5cGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzU3RyaWN0Q29tcGFyYWJsZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbGlzdENhY2hlQ2xlYXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2xpc3RDYWNoZURlbGV0ZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbGlzdENhY2hlR2V0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19saXN0Q2FjaGVIYXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2xpc3RDYWNoZVNldC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbWFwQ2FjaGVDbGVhci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbWFwQ2FjaGVEZWxldGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX21hcENhY2hlR2V0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19tYXBDYWNoZUhhcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbWFwQ2FjaGVTZXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX21hcFRvQXJyYXkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX21hdGNoZXNTdHJpY3RDb21wYXJhYmxlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19tZW1vaXplQ2FwcGVkLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19uYXRpdmVDcmVhdGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX25hdGl2ZUtleXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX25hdGl2ZUtleXNJbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbm9kZVV0aWwuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX29iamVjdFRvU3RyaW5nLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19vdmVyQXJnLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19vdmVyUmVzdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fcm9vdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc2FmZUdldC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc2V0Q2FjaGVBZGQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3NldENhY2hlSGFzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zZXRUb0FycmF5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zZXRUb1N0cmluZy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc2hvcnRPdXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3N0YWNrQ2xlYXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3N0YWNrRGVsZXRlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zdGFja0dldC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc3RhY2tIYXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3N0YWNrU2V0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zdHJpY3RJbmRleE9mLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zdHJpbmdTaXplLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zdHJpbmdUb1BhdGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3RvS2V5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL190b1NvdXJjZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fdHJpbW1lZEVuZEluZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL191bmljb2RlU2l6ZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9jbG9uZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9jbG9uZURlZXAuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvY29uc3RhbnQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvZGVmYXVsdHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvZWFjaC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9lcS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9maWx0ZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvZmluZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9maW5kSW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvZmxhdHRlbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9mb3JFYWNoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2ZvckluLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2dldC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9oYXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaGFzSW4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaWRlbnRpdHkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNBcmd1bWVudHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNBcnJheS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0FycmF5TGlrZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0FycmF5TGlrZU9iamVjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0J1ZmZlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0VtcHR5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzRnVuY3Rpb24uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNMZW5ndGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNNYXAuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNPYmplY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNPYmplY3RMaWtlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzUGxhaW5PYmplY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNTZXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNTdHJpbmcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNTeW1ib2wuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNUeXBlZEFycmF5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzVW5kZWZpbmVkLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2tleXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gva2V5c0luLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2xhc3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvbWFwLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL21hcFZhbHVlcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9tYXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvbWVtb2l6ZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9tZXJnZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9taW4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvbWluQnkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvbm9vcC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9ub3cuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvcGljay5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9yYW5nZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9yZWR1Y2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvc2l6ZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9zb3J0QnkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvc3R1YkFycmF5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3N0dWJGYWxzZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC90b0Zpbml0ZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC90b0ludGVnZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvdG9OdW1iZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvdG9QbGFpbk9iamVjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC90b1N0cmluZy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC90cmFuc2Zvcm0uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvdW5pb24uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvdW5pcXVlSWQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvdmFsdWVzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3ppcE9iamVjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3Byb3AtdHlwZXMvbGliL1JlYWN0UHJvcFR5cGVzU2VjcmV0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtYmFzZTE2LXN0eWxpbmcvbGliL2VzbS9jb2xvckNvbnZlcnRlcnMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1iYXNlMTYtc3R5bGluZy9saWIvZXNtL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtaXMvY2pzL3JlYWN0LWlzLmRldmVsb3BtZW50LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtaXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1qc29uLXRyZWUvbGliL2VzbS9JdGVtUmFuZ2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1qc29uLXRyZWUvbGliL2VzbS9KU09OQXJyYXlOb2RlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtanNvbi10cmVlL2xpYi9lc20vSlNPTkFycm93LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtanNvbi10cmVlL2xpYi9lc20vSlNPTkl0ZXJhYmxlTm9kZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWpzb24tdHJlZS9saWIvZXNtL0pTT05OZXN0ZWROb2RlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtanNvbi10cmVlL2xpYi9lc20vSlNPTk5vZGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1qc29uLXRyZWUvbGliL2VzbS9KU09OT2JqZWN0Tm9kZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWpzb24tdHJlZS9saWIvZXNtL0pTT05WYWx1ZU5vZGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1qc29uLXRyZWUvbGliL2VzbS9jcmVhdGVTdHlsaW5nRnJvbVRoZW1lLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtanNvbi10cmVlL2xpYi9lc20vZ2V0Q29sbGVjdGlvbkVudHJpZXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1qc29uLXRyZWUvbGliL2VzbS9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWpzb24tdHJlZS9saWIvZXNtL29ialR5cGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1qc29uLXRyZWUvbGliL2VzbS90aGVtZXMvc29sYXJpemVkLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVkdXgtYWN0aW9ucy9lcy9jcmVhdGVBY3Rpb24uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWR1eC1hY3Rpb25zL2VzL3V0aWxzL2lkZW50aXR5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVkdXgtYWN0aW9ucy9lcy91dGlscy9pc0Z1bmN0aW9uLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVkdXgtYWN0aW9ucy9lcy91dGlscy9pc051bGwuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWR1eC10aHVuay9lcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlZHV4L2VzL3JlZHV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvc2ltcGxlLXN3aXp6bGUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9zaW1wbGUtc3dpenpsZS9ub2RlX21vZHVsZXMvaXMtYXJyYXlpc2gvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2NvcmUvVG9vbGJhci5jc3M/ZDgxMyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvQ2FsbGJhY2tHcmFwaC9DYWxsYmFja0dyYXBoQ29udGFpbmVyLmNzcz81OGUyIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9Gcm9udEVuZC9Gcm9udEVuZEVycm9yLmNzcz9hOTAwIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9QZXJjeS5jc3M/YWYzOCIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvbWVudS9EZWJ1Z01lbnUuY3NzPzZkNTQiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL21lbnUvUGxvdGx5Q2xvdWQuY3NzPzlhOGIiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL21lbnUvVmVyc2lvbkluZm8uY3NzP2RiMjIiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlL2Nqcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS1zaGltLmRldmVsb3BtZW50LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUvY2pzL3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlLXNoaW0vd2l0aC1zZWxlY3Rvci5kZXZlbG9wbWVudC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlL3NoaW0vaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS9zaGltL3dpdGgtc2VsZWN0b3IuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci9leHRlcm5hbCB3aW5kb3cgXCJQcm9wVHlwZXNcIiIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyL2V4dGVybmFsIHdpbmRvdyBcIlJlYWN0XCIiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci9leHRlcm5hbCB3aW5kb3cgXCJSZWFjdERPTVwiIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vYXJyYXlMaWtlVG9BcnJheS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2FycmF5V2l0aEhvbGVzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vYXJyYXlXaXRob3V0SG9sZXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVjay5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZ2V0UHJvdG90eXBlT2YuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2l0ZXJhYmxlVG9BcnJheS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2l0ZXJhYmxlVG9BcnJheUxpbWl0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vbm9uSXRlcmFibGVSZXN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vbm9uSXRlcmFibGVTcHJlYWQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vcG9zc2libGVDb25zdHJ1Y3RvclJldHVybi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NldFByb3RvdHlwZU9mLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9QcmltaXRpdmUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b1Byb3BlcnR5S2V5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uLi9zcmMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9hbGwuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9hbHdheXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9hbnkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9hcC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2FwcGVuZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2Fzc29jLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvYXNzb2NQYXRoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvYmluZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2Nsb25lLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvY29tcGFyYXRvci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2NvbmNhdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2NvbnZlcmdlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvY3VycnlOLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvZGVmYXVsdFRvLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvZGlmZmVyZW5jZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2Rpc3NvYy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2Rpc3NvY1BhdGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9lbXB0eS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2VxdWFscy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2V2b2x2ZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ZpbHRlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ZpbmQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9maW5kSW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9mbGF0dGVuLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvZm9yRWFjaC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ZvckVhY2hPYmpJbmRleGVkLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvZ3JvdXBCeS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2hhcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2hhc1BhdGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pZGVudGl0eS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2luY2x1ZGVzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW5kZXhPZi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2luc2VydC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19TZXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fYXJpdHkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fYXJyYXlGcm9tSXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fYXJyYXlSZWR1Y2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fYXNzb2MuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fY2hlY2tGb3JNZXRob2QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fY2xvbmUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fY2xvbmVSZWdFeHAuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fY29tcGxlbWVudC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19jb25jYXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fY3JlYXRlUmVkdWNlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2N1cnJ5MS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19jdXJyeTIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fY3VycnkzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2N1cnJ5Ti5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19kaXNwYXRjaGFibGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fZGlzc29jLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2VxdWFscy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19maWx0ZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fZnVuY3Rpb25OYW1lLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2hhcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19pZGVudGl0eS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19pbmNsdWRlcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19pbmNsdWRlc1dpdGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9faW5kZXhPZi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19pc0FyZ3VtZW50cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19pc0FycmF5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2lzQXJyYXlMaWtlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2lzRnVuY3Rpb24uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9faXNJbnRlZ2VyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2lzT2JqZWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2lzUGxhY2Vob2xkZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9faXNTdHJpbmcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9faXNUcmFuc2Zvcm1lci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19pc1R5cGVkQXJyYXkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fbWFrZUZsYXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fbWFwLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX250aC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19vYmplY3RBc3NpZ24uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fb2JqZWN0SXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fcGF0aC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19xdW90ZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19yZWR1Y2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fcmVkdWNlZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL190b0lTT1N0cmluZy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL190b1N0cmluZy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL194QXJyYXlSZWR1Y2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9feFJlZHVjZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL194YWxsLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX3hhbnkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9feGZCYXNlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX3hmaWx0ZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9feGZpbmQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9feGZpbmRJbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL194bWFwLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX3hyZWR1Y2VCeS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL194dGFrZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL194dW5pcUJ5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX3h3cmFwLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJzZWN0aW9uLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW52b2tlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2lzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaXNFbXB0eS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2lzTmlsLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvam9pbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2p1eHQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9rZXlzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvbGVucy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2xlbnNQYXRoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvbHQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9tYXAuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9tYXBPYmpJbmRleGVkLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvbWF4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvbWVtb2l6ZVdpdGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9tZXJnZURlZXBSaWdodC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL21lcmdlRGVlcFdpdGhLZXkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9tZXJnZUxlZnQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9tZXJnZVJpZ2h0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvbWVyZ2VXaXRoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvbWVyZ2VXaXRoS2V5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvb21pdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL29uY2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9vdmVyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvcGFydGl0aW9uLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvcGF0aC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3BhdGhPci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3BpY2suanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9waWNrQnkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9wbHVjay5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3ByZXBlbmQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9wcm9wLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvcHJvcEVxLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvcHJvcHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9yZWR1Y2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9yZWR1Y2VCeS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3JlamVjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3JlbW92ZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3JldmVyc2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9zZXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9zbGljZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3NvcnQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9zdGFydHNXaXRoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvdGFrZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3RvUGFpcnMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy90b1N0cmluZy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3R5cGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy91bmlxLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvdW5pcUJ5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvdmFsdWVzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvdmlldy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3ppcC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3ppcE9iai5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2N5dG9zY2FwZS9kaXN0L2N5dG9zY2FwZS5lc20ubWpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci93ZWJwYWNrL3J1bnRpbWUvY29tcGF0IGdldCBkZWZhdWx0IGV4cG9ydCIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyL3dlYnBhY2svcnVudGltZS9nbG9iYWwiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyL3dlYnBhY2svcnVudGltZS9ub2RlIG1vZHVsZSBkZWNvcmF0b3IiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci93ZWJwYWNrL3J1bnRpbWUvbm9uY2UiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy93aGF0d2ctZmV0Y2gvZmV0Y2guanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIhZnVuY3Rpb24oZSxuKXtcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJvYmplY3RcIj09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1uKHJlcXVpcmUoXCJyZWFjdFwiKSk6XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXCJyZWFjdFwiXSxuKTpcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cz9leHBvcnRzW1wiZGFzaC1jb21wb25lbnQtcGx1Z2luc1wiXT1uKHJlcXVpcmUoXCJyZWFjdFwiKSk6ZVtcImRhc2gtY29tcG9uZW50LXBsdWdpbnNcIl09bihlLlJlYWN0KX0od2luZG93LChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIG49e307ZnVuY3Rpb24gdChyKXtpZihuW3JdKXJldHVybiBuW3JdLmV4cG9ydHM7dmFyIG89bltyXT17aTpyLGw6ITEsZXhwb3J0czp7fX07cmV0dXJuIGVbcl0uY2FsbChvLmV4cG9ydHMsbyxvLmV4cG9ydHMsdCksby5sPSEwLG8uZXhwb3J0c31yZXR1cm4gdC5tPWUsdC5jPW4sdC5kPWZ1bmN0aW9uKGUsbixyKXt0Lm8oZSxuKXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsbix7ZW51bWVyYWJsZTohMCxnZXQ6cn0pfSx0LnI9ZnVuY3Rpb24oZSl7XCJ1bmRlZmluZWRcIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLnRvU3RyaW5nVGFnJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxTeW1ib2wudG9TdHJpbmdUYWcse3ZhbHVlOlwiTW9kdWxlXCJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KX0sdC50PWZ1bmN0aW9uKGUsbil7aWYoMSZuJiYoZT10KGUpKSw4Jm4pcmV0dXJuIGU7aWYoNCZuJiZcIm9iamVjdFwiPT10eXBlb2YgZSYmZSYmZS5fX2VzTW9kdWxlKXJldHVybiBlO3ZhciByPU9iamVjdC5jcmVhdGUobnVsbCk7aWYodC5yKHIpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLFwiZGVmYXVsdFwiLHtlbnVtZXJhYmxlOiEwLHZhbHVlOmV9KSwyJm4mJlwic3RyaW5nXCIhPXR5cGVvZiBlKWZvcih2YXIgbyBpbiBlKXQuZChyLG8sZnVuY3Rpb24obil7cmV0dXJuIGVbbl19LmJpbmQobnVsbCxvKSk7cmV0dXJuIHJ9LHQubj1mdW5jdGlvbihlKXt2YXIgbj1lJiZlLl9fZXNNb2R1bGU/ZnVuY3Rpb24oKXtyZXR1cm4gZS5kZWZhdWx0fTpmdW5jdGlvbigpe3JldHVybiBlfTtyZXR1cm4gdC5kKG4sXCJhXCIsbiksbn0sdC5vPWZ1bmN0aW9uKGUsbil7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLG4pfSx0LnA9XCJcIix0KHQucz0xKX0oW2Z1bmN0aW9uKG4sdCl7bi5leHBvcnRzPWV9LGZ1bmN0aW9uKGUsbix0KXtcInVzZSBzdHJpY3RcIjt0LnIobiksdC5kKG4sXCJhc3luY0RlY29yYXRvclwiLChmdW5jdGlvbigpe3JldHVybiB1fSkpLHQuZChuLFwiaW5oZXJpdEFzeW5jRGVjb3JhdG9yXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGF9KSksdC5kKG4sXCJpc1JlYWR5XCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGN9KSksdC5kKG4sXCJIaXN0b3J5XCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGR9KSk7dmFyIHI9dCgwKTtmdW5jdGlvbiBvKGUsbix0LHIsbyxpLHUpe3RyeXt2YXIgYT1lW2ldKHUpLGM9YS52YWx1ZX1jYXRjaChlKXtyZXR1cm4gdm9pZCB0KGUpfWEuZG9uZT9uKGMpOlByb21pc2UucmVzb2x2ZShjKS50aGVuKHIsbyl9ZnVuY3Rpb24gaShlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj10aGlzLHQ9YXJndW1lbnRzO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24ocixpKXt2YXIgdT1lLmFwcGx5KG4sdCk7ZnVuY3Rpb24gYShlKXtvKHUscixpLGEsYyxcIm5leHRcIixlKX1mdW5jdGlvbiBjKGUpe28odSxyLGksYSxjLFwidGhyb3dcIixlKX1hKHZvaWQgMCl9KSl9fXZhciB1PWZ1bmN0aW9uKGUsbil7dmFyIHQsbz17aXNSZWFkeTpuZXcgUHJvbWlzZSgoZnVuY3Rpb24oZSl7dD1lfSkpLGdldDpPYmplY3Qoci5sYXp5KSgoZnVuY3Rpb24oKXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG4oKSkudGhlbigoZnVuY3Rpb24oZSl7cmV0dXJuIHNldFRpbWVvdXQoaShyZWdlbmVyYXRvclJ1bnRpbWUubWFyaygoZnVuY3Rpb24gZSgpe3JldHVybiByZWdlbmVyYXRvclJ1bnRpbWUud3JhcCgoZnVuY3Rpb24oZSl7Zm9yKDs7KXN3aXRjaChlLnByZXY9ZS5uZXh0KXtjYXNlIDA6cmV0dXJuIGUubmV4dD0yLHQoITApO2Nhc2UgMjpvLmlzUmVhZHk9ITA7Y2FzZSAzOmNhc2VcImVuZFwiOnJldHVybiBlLnN0b3AoKX19KSxlKX0pKSksMCksZX0pKX0pKX07cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX2Rhc2hwcml2YXRlX2lzTGF6eUNvbXBvbmVudFJlYWR5XCIse2dldDpmdW5jdGlvbigpe3JldHVybiBvLmlzUmVhZHl9fSksby5nZXR9LGE9ZnVuY3Rpb24oZSxuKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9kYXNocHJpdmF0ZV9pc0xhenlDb21wb25lbnRSZWFkeVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYyhuKX19KX0sYz1mdW5jdGlvbihlKXtyZXR1cm4gZSYmZS5fZGFzaHByaXZhdGVfaXNMYXp5Q29tcG9uZW50UmVhZHl9O2Z1bmN0aW9uIGYoZSxuKXtmb3IodmFyIHQ9MDt0PG4ubGVuZ3RoO3QrKyl7dmFyIHI9blt0XTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCxcInZhbHVlXCJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXZhciBzPVwiX2Rhc2hwcml2YXRlX2hpc3RvcnljaGFuZ2VcIixkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpeyFmdW5jdGlvbihlLG4pe2lmKCEoZSBpbnN0YW5jZW9mIG4pKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIil9KHRoaXMsZSl9dmFyIG4sdCxyO3JldHVybiBuPWUscj1be2tleTpcImRpc3BhdGNoQ2hhbmdlRXZlbnRcIix2YWx1ZTpmdW5jdGlvbigpe3dpbmRvdy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChzKSl9fSx7a2V5Olwib25DaGFuZ2VcIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIocyxlKSxmdW5jdGlvbigpe3JldHVybiB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihzLGUpfX19XSwodD1udWxsKSYmZihuLnByb3RvdHlwZSx0KSxyJiZmKG4sciksT2JqZWN0LmRlZmluZVByb3BlcnR5KG4sXCJwcm90b3R5cGVcIix7d3JpdGFibGU6ITF9KSxlfSgpfV0pfSkpOyIsInZhciBfcGF0aDtcbmZ1bmN0aW9uIF9leHRlbmRzKCkgeyByZXR1cm4gX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAobikgeyBmb3IgKHZhciBlID0gMTsgZSA8IGFyZ3VtZW50cy5sZW5ndGg7IGUrKykgeyB2YXIgdCA9IGFyZ3VtZW50c1tlXTsgZm9yICh2YXIgciBpbiB0KSAoe30pLmhhc093blByb3BlcnR5LmNhbGwodCwgcikgJiYgKG5bcl0gPSB0W3JdKTsgfSByZXR1cm4gbjsgfSwgX2V4dGVuZHMuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG52YXIgU3ZnQ2hlY2tJY29uID0gZnVuY3Rpb24gU3ZnQ2hlY2tJY29uKHByb3BzKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCBfZXh0ZW5kcyh7XG4gICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgICB3aWR0aDogMTgsXG4gICAgaGVpZ2h0OiAxOCxcbiAgICBmaWxsOiBcIm5vbmVcIixcbiAgICB2aWV3Qm94OiBcIjAgMCAxNCAxNFwiXG4gIH0sIHByb3BzKSwgX3BhdGggfHwgKF9wYXRoID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBmaWxsOiBcIiMwNjgwMEFcIixcbiAgICBmaWxsT3BhY2l0eTogMC44LFxuICAgIGQ6IFwiTTkuODU0IDUuMTQ2YS41LjUgMCAwIDEgMCAuNzA4bC0zLjUgMy41YS41LjUgMCAwIDEtLjcwOCAwbC0xLjUtMS41YS41LjUgMCAxIDEgLjcwOC0uNzA4TDYgOC4yOTNsMy4xNDYtMy4xNDdhLjUuNSAwIDAgMSAuNzA4IDBNMTMuNSA3QTYuNSA2LjUgMCAxIDEgNyAuNSA2LjUwNyA2LjUwNyAwIDAgMSAxMy41IDdtLTEgMEE1LjUgNS41IDAgMSAwIDcgMTIuNSA1LjUwNyA1LjUwNyAwIDAgMCAxMi41IDdcIlxuICB9KSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IFN2Z0NoZWNrSWNvbjsiLCJ2YXIgX3BhdGg7XG5mdW5jdGlvbiBfZXh0ZW5kcygpIHsgcmV0dXJuIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKG4pIHsgZm9yICh2YXIgZSA9IDE7IGUgPCBhcmd1bWVudHMubGVuZ3RoOyBlKyspIHsgdmFyIHQgPSBhcmd1bWVudHNbZV07IGZvciAodmFyIHIgaW4gdCkgKHt9KS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIHIpICYmIChuW3JdID0gdFtyXSk7IH0gcmV0dXJuIG47IH0sIF9leHRlbmRzLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH1cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xudmFyIFN2Z0Nsb2NrSWNvbiA9IGZ1bmN0aW9uIFN2Z0Nsb2NrSWNvbihwcm9wcykge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgX2V4dGVuZHMoe1xuICAgIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gICAgdmlld0JveDogXCIwIDAgNTQgMjRcIlxuICB9LCBwcm9wcyksIF9wYXRoIHx8IChfcGF0aCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbDogXCJub25lXCIsXG4gICAgc3Ryb2tlOiBcIiNmZmZcIixcbiAgICBzdHJva2VXaWR0aDogNCxcbiAgICBkOiBcIk0yNyAwdjIyaDIyXCJcbiAgfSkpKTtcbn07XG5leHBvcnQgZGVmYXVsdCBTdmdDbG9ja0ljb247IiwidmFyIF9wYXRoO1xuZnVuY3Rpb24gX2V4dGVuZHMoKSB7IHJldHVybiBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uIChuKSB7IGZvciAodmFyIGUgPSAxOyBlIDwgYXJndW1lbnRzLmxlbmd0aDsgZSsrKSB7IHZhciB0ID0gYXJndW1lbnRzW2VdOyBmb3IgKHZhciByIGluIHQpICh7fSkuaGFzT3duUHJvcGVydHkuY2FsbCh0LCByKSAmJiAobltyXSA9IHRbcl0pOyB9IHJldHVybiBuOyB9LCBfZXh0ZW5kcy5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbnZhciBTdmdDbG91ZFNsYXNoSWNvbiA9IGZ1bmN0aW9uIFN2Z0Nsb3VkU2xhc2hJY29uKHByb3BzKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCBfZXh0ZW5kcyh7XG4gICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgICB3aWR0aDogMzIsXG4gICAgaGVpZ2h0OiAzMixcbiAgICB2aWV3Qm94OiBcIjAgMCAyNTYgMjU2XCJcbiAgfSwgcHJvcHMpLCBfcGF0aCB8fCAoX3BhdGggPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTI0OCAxMjguNzJBODcuNzQgODcuNzQgMCAwIDEgMjIyLjQxIDE5MGE0IDQgMCAwIDEtNS43Ny0uMTZMMTAzLjc4IDY1LjY3YTQgNCAwIDAgMSAuMzktNS43NkE4Ny44MiA4Ny44MiAwIDAgMSAxNjAuODcgNDBjNDguMjguNDcgODcuNTEgNDAuNDMgODcuMTMgODguNzJNNTMuOTIgMzQuNjJhOCA4IDAgMSAwLTExLjg0IDEwLjc2bDM5LjI1IDQzLjE4LS4wNi4xMUE2NCA2NCAwIDAgMCA4IDE1M2MuNTMgMzUuMTIgMjkuODQgNjMgNjUgNjNoODdhODcuNyA4Ny43IDAgMCAwIDMxLjc4LTUuOTVsMTAuMyAxMS4zM2E4IDggMCAwIDAgMTEuMzMuNTIgOC4zMiA4LjMyIDAgMCAwIC4yOS0xMS41MlpcIlxuICB9KSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IFN2Z0Nsb3VkU2xhc2hJY29uOyIsInZhciBfcGF0aDtcbmZ1bmN0aW9uIF9leHRlbmRzKCkgeyByZXR1cm4gX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAobikgeyBmb3IgKHZhciBlID0gMTsgZSA8IGFyZ3VtZW50cy5sZW5ndGg7IGUrKykgeyB2YXIgdCA9IGFyZ3VtZW50c1tlXTsgZm9yICh2YXIgciBpbiB0KSAoe30pLmhhc093blByb3BlcnR5LmNhbGwodCwgcikgJiYgKG5bcl0gPSB0W3JdKTsgfSByZXR1cm4gbjsgfSwgX2V4dGVuZHMuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG52YXIgU3ZnQ29sbGFwc2VJY29uID0gZnVuY3Rpb24gU3ZnQ29sbGFwc2VJY29uKHByb3BzKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCBfZXh0ZW5kcyh7XG4gICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgICB3aWR0aDogMTAsXG4gICAgaGVpZ2h0OiA2LFxuICAgIGZpbGw6IFwibm9uZVwiXG4gIH0sIHByb3BzKSwgX3BhdGggfHwgKF9wYXRoID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBzdHJva2U6IFwiI0EyQjFDNlwiLFxuICAgIGQ6IFwibTEgMSA0IDQgNC00XCJcbiAgfSkpKTtcbn07XG5leHBvcnQgZGVmYXVsdCBTdmdDb2xsYXBzZUljb247IiwidmFyIF9wYXRoO1xuZnVuY3Rpb24gX2V4dGVuZHMoKSB7IHJldHVybiBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uIChuKSB7IGZvciAodmFyIGUgPSAxOyBlIDwgYXJndW1lbnRzLmxlbmd0aDsgZSsrKSB7IHZhciB0ID0gYXJndW1lbnRzW2VdOyBmb3IgKHZhciByIGluIHQpICh7fSkuaGFzT3duUHJvcGVydHkuY2FsbCh0LCByKSAmJiAobltyXSA9IHRbcl0pOyB9IHJldHVybiBuOyB9LCBfZXh0ZW5kcy5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbnZhciBTdmdFcnJvckljb24gPSBmdW5jdGlvbiBTdmdFcnJvckljb24ocHJvcHMpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIF9leHRlbmRzKHtcbiAgICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICAgIHdpZHRoOiAzMixcbiAgICBoZWlnaHQ6IDMyLFxuICAgIHZpZXdCb3g6IFwiMCAwIDI1NiAyNTZcIlxuICB9LCBwcm9wcyksIF9wYXRoIHx8IChfcGF0aCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMjM2LjggMTg4LjA5IDE0OS4zNSAzNi4yMmEyNC43NiAyNC43NiAwIDAgMC00Mi43IDBMMTkuMiAxODguMDlhMjMuNTEgMjMuNTEgMCAwIDAgMCAyMy43MkEyNC4zNSAyNC4zNSAwIDAgMCA0MC41NSAyMjRoMTc0LjlhMjQuMzUgMjQuMzUgMCAwIDAgMjEuMzMtMTIuMTkgMjMuNTEgMjMuNTEgMCAwIDAgLjAyLTIzLjcybS0xMy44NyAxNS43MWE4LjUgOC41IDAgMCAxLTcuNDggNC4ySDQwLjU1YTguNSA4LjUgMCAwIDEtNy40OC00LjIgNy41OSA3LjU5IDAgMCAxIDAtNy43Mmw4Ny40NS0xNTEuODdhOC43NSA4Ljc1IDAgMCAxIDE1IDBsODcuNDUgMTUxLjg3YTcuNTkgNy41OSAwIDAgMS0uMDQgNy43Mk0xMjAgMTQ0di00MGE4IDggMCAwIDEgMTYgMHY0MGE4IDggMCAwIDEtMTYgMG0yMCAzNmExMiAxMiAwIDEgMS0xMi0xMiAxMiAxMiAwIDAgMSAxMiAxMlwiXG4gIH0pKSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgU3ZnRXJyb3JJY29uOyIsInZhciBfcGF0aDtcbmZ1bmN0aW9uIF9leHRlbmRzKCkgeyByZXR1cm4gX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAobikgeyBmb3IgKHZhciBlID0gMTsgZSA8IGFyZ3VtZW50cy5sZW5ndGg7IGUrKykgeyB2YXIgdCA9IGFyZ3VtZW50c1tlXTsgZm9yICh2YXIgciBpbiB0KSAoe30pLmhhc093blByb3BlcnR5LmNhbGwodCwgcikgJiYgKG5bcl0gPSB0W3JdKTsgfSByZXR1cm4gbjsgfSwgX2V4dGVuZHMuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG52YXIgU3ZnRXhwYW5kID0gZnVuY3Rpb24gU3ZnRXhwYW5kKHByb3BzKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCBfZXh0ZW5kcyh7XG4gICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgICB3aWR0aDogMzAsXG4gICAgaGVpZ2h0OiAzMCxcbiAgICBmaWxsOiBcImN1cnJlbnRDb2xvclwiLFxuICAgIHZpZXdCb3g6IFwiMCAwIDI1NiAyNTZcIlxuICB9LCBwcm9wcyksIF9wYXRoIHx8IChfcGF0aCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMjAxLjU0IDU0LjQ2QTEwNCAxMDQgMCAwIDAgNTQuNDYgMjAxLjU0IDEwNCAxMDQgMCAwIDAgMjAxLjU0IDU0LjQ2bS0xMS4zMSAxMzUuNzdhODggODggMCAxIDEgMC0xMjQuNDYgODguMTEgODguMTEgMCAwIDEgMCAxMjQuNDZtLTE2LjU3LTg4LjU3TDE0Ny4zMSAxMjhsMjYuMzUgMjYuMzRhOCA4IDAgMCAxLTExLjMyIDExLjMybC0zMi0zMmE4IDggMCAwIDEgMC0xMS4zMmwzMi0zMmE4IDggMCAwIDEgMTEuMzIgMTEuMzJtLTU2IDBMOTEuMzEgMTI4bDI2LjM1IDI2LjM0YTggOCAwIDAgMS0xMS4zMiAxMS4zMmwtMzItMzJhOCA4IDAgMCAxIDAtMTEuMzJsMzItMzJhOCA4IDAgMCAxIDExLjMyIDExLjMyXCJcbiAgfSkpKTtcbn07XG5leHBvcnQgZGVmYXVsdCBTdmdFeHBhbmQ7IiwidmFyIF9wYXRoO1xuZnVuY3Rpb24gX2V4dGVuZHMoKSB7IHJldHVybiBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uIChuKSB7IGZvciAodmFyIGUgPSAxOyBlIDwgYXJndW1lbnRzLmxlbmd0aDsgZSsrKSB7IHZhciB0ID0gYXJndW1lbnRzW2VdOyBmb3IgKHZhciByIGluIHQpICh7fSkuaGFzT3duUHJvcGVydHkuY2FsbCh0LCByKSAmJiAobltyXSA9IHRbcl0pOyB9IHJldHVybiBuOyB9LCBfZXh0ZW5kcy5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbnZhciBTdmdHcmFwaEljb24gPSBmdW5jdGlvbiBTdmdHcmFwaEljb24ocHJvcHMpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIF9leHRlbmRzKHtcbiAgICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICAgIHdpZHRoOiAzMixcbiAgICBoZWlnaHQ6IDMyLFxuICAgIHZpZXdCb3g6IFwiMCAwIDI1NiAyNTZcIlxuICB9LCBwcm9wcyksIF9wYXRoIHx8IChfcGF0aCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMjAwIDE1MmEzMS44NCAzMS44NCAwIDAgMC0xOS41MyA2LjY4bC0yMy4xMS0xOEEzMS42NSAzMS42NSAwIDAgMCAxNjAgMTI4YzAtLjc0IDAtMS40OC0uMDgtMi4yMWwxMy4yMy00LjQxQTMyIDMyIDAgMSAwIDE2OCAxMDRjMCAuNzQgMCAxLjQ4LjA4IDIuMjFsLTEzLjIzIDQuNDFBMzIgMzIgMCAwIDAgMTI4IDk2YTMyLjYgMzIuNiAwIDAgMC01LjI3LjQ0TDExNS44OSA4MUEzMiAzMiAwIDEgMCA5NiA4OGEzMi42IDMyLjYgMCAwIDAgNS4yNy0uNDRsNi44NCAxNS40YTMxLjkyIDMxLjkyIDAgMCAwLTguNTcgMzkuNjRsLTI1LjcxIDIyLjg0YTMyLjA2IDMyLjA2IDAgMSAwIDEwLjYzIDEybDI1LjcxLTIyLjg0YTMxLjkxIDMxLjkxIDAgMCAwIDM3LjM2LTEuMjRsMjMuMTEgMThBMzEuNjUgMzEuNjUgMCAwIDAgMTY4IDE4NGEzMiAzMiAwIDEgMCAzMi0zMm0wLTY0YTE2IDE2IDAgMSAxLTE2IDE2IDE2IDE2IDAgMCAxIDE2LTE2TTgwIDU2YTE2IDE2IDAgMSAxIDE2IDE2IDE2IDE2IDAgMCAxLTE2LTE2TTU2IDIwOGExNiAxNiAwIDEgMSAxNi0xNiAxNiAxNiAwIDAgMS0xNiAxNm01Ni04MGExNiAxNiAwIDEgMSAxNiAxNiAxNiAxNiAwIDAgMS0xNi0xNm04OCA3MmExNiAxNiAwIDEgMSAxNi0xNiAxNiAxNiAwIDAgMS0xNiAxNlwiXG4gIH0pKSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgU3ZnR3JhcGhJY29uOyIsInZhciBfcGF0aDtcbmZ1bmN0aW9uIF9leHRlbmRzKCkgeyByZXR1cm4gX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAobikgeyBmb3IgKHZhciBlID0gMTsgZSA8IGFyZ3VtZW50cy5sZW5ndGg7IGUrKykgeyB2YXIgdCA9IGFyZ3VtZW50c1tlXTsgZm9yICh2YXIgciBpbiB0KSAoe30pLmhhc093blByb3BlcnR5LmNhbGwodCwgcikgJiYgKG5bcl0gPSB0W3JdKTsgfSByZXR1cm4gbjsgfSwgX2V4dGVuZHMuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG52YXIgU3ZnT2ZmSWNvbiA9IGZ1bmN0aW9uIFN2Z09mZkljb24ocHJvcHMpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIF9leHRlbmRzKHtcbiAgICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICAgIHdpZHRoOiAxOCxcbiAgICBoZWlnaHQ6IDE4LFxuICAgIGZpbGw6IFwiI0M3M0EzQVwiLFxuICAgIHZpZXdCb3g6IFwiMCAwIDI1NiAyNTZcIlxuICB9LCBwcm9wcyksIF9wYXRoIHx8IChfcGF0aCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTY1LjY2IDEwMS42NiAxMzkuMzEgMTI4bDI2LjM1IDI2LjM0YTggOCAwIDAgMS0xMS4zMiAxMS4zMkwxMjggMTM5LjMxbC0yNi4zNCAyNi4zNWE4IDggMCAwIDEtMTEuMzItMTEuMzJMMTE2LjY5IDEyOGwtMjYuMzUtMjYuMzRhOCA4IDAgMCAxIDExLjMyLTExLjMyTDEyOCAxMTYuNjlsMjYuMzQtMjYuMzVhOCA4IDAgMCAxIDExLjMyIDExLjMyTTIzMiAxMjhBMTA0IDEwNCAwIDEgMSAxMjggMjRhMTA0LjExIDEwNC4xMSAwIDAgMSAxMDQgMTA0bS0xNiAwYTg4IDg4IDAgMSAwLTg4IDg4IDg4LjEgODguMSAwIDAgMCA4OC04OFwiXG4gIH0pKSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgU3ZnT2ZmSWNvbjsiLCJpbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0LCB7IHVzZVN0YXRlLCB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBQcm92aWRlciB9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCBTdG9yZSBmcm9tICcuL3N0b3JlJztcbmltcG9ydCBBcHBDb250YWluZXIgZnJvbSAnLi9BcHBDb250YWluZXIucmVhY3QnO1xuaW1wb3J0IGdldENvbmZpZ0Zyb21ET00gZnJvbSAnLi9jb25maWcnO1xuaW1wb3J0IHsgaW5pdGlhbGl6ZVdlYlNvY2tldCwgZGlzY29ubmVjdFdlYlNvY2tldCB9IGZyb20gJy4vb2JzZXJ2ZXJzL3dlYnNvY2tldE9ic2VydmVyJztcbmNvbnN0IEFwcFByb3ZpZGVyID0gKHsgaG9va3MgPSB7XG4gICAgbGF5b3V0X3ByZTogbnVsbCxcbiAgICBsYXlvdXRfcG9zdDogbnVsbCxcbiAgICByZXF1ZXN0X3ByZTogbnVsbCxcbiAgICByZXF1ZXN0X3Bvc3Q6IG51bGwsXG4gICAgY2FsbGJhY2tfcmVzb2x2ZWQ6IG51bGwsXG4gICAgcmVxdWVzdF9yZWZyZXNoX2p3dDogbnVsbFxufSB9KSA9PiB7XG4gICAgY29uc3QgW3sgc3RvcmUgfV0gPSB1c2VTdGF0ZSgoKSA9PiBuZXcgU3RvcmUoKSk7XG4gICAgLy8gUmVnaXN0ZXIgdGhlIFdlYlNvY2tldCBvYnNlcnZlciB3aGVuZXZlciB0aGUgYmFja2VuZCBleHBvc2VzIHdlYnNvY2tldFxuICAgIC8vIGluZnJhc3RydWN0dXJlLiBpbml0aWFsaXplV2ViU29ja2V0IG9ubHkgb3BlbnMgdGhlIHNvY2tldCBlYWdlcmx5IHdoZW5cbiAgICAvLyB3ZWJzb2NrZXQgY2FsbGJhY2tzIGFyZSBlbmFibGVkIGdsb2JhbGx5OyBwZXItY2FsbGJhY2sgd2Vic29ja2V0PVRydWVcbiAgICAvLyBvcGVucyBpdCBsYXppbHkgb24gZmlyc3QgZGlzcGF0Y2guXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgY29uc3QgY29uZmlnID0gZ2V0Q29uZmlnRnJvbURPTSgpO1xuICAgICAgICBpZiAoY29uZmlnLndlYnNvY2tldD8udXJsICYmIGNvbmZpZy53ZWJzb2NrZXQ/Lndvcmtlcl91cmwpIHtcbiAgICAgICAgICAgIC8vIEFkZCBmZXRjaCBjb25maWcgZm9yIGNvbnNpc3RlbmN5XG4gICAgICAgICAgICBjb25zdCBmdWxsQ29uZmlnID0ge1xuICAgICAgICAgICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgICAgICAgICBmZXRjaDoge1xuICAgICAgICAgICAgICAgICAgICBjcmVkZW50aWFsczogJ3NhbWUtb3JpZ2luJyxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgQWNjZXB0OiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaW5pdGlhbGl6ZVdlYlNvY2tldChzdG9yZSwgZnVsbENvbmZpZyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2xlYW51cCBvbiB1bm1vdW50XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBkaXNjb25uZWN0V2ViU29ja2V0KCk7XG4gICAgICAgIH07XG4gICAgfSwgW3N0b3JlXSk7XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFByb3ZpZGVyLCB7IHN0b3JlOiBzdG9yZSB9LFxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KEFwcENvbnRhaW5lciwgeyBob29rczogaG9va3MgfSkpKTtcbn07XG5BcHBQcm92aWRlci5wcm9wVHlwZXMgPSB7XG4gICAgaG9va3M6IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgICAgIGxheW91dF9wcmU6IFByb3BUeXBlcy5mdW5jLFxuICAgICAgICBsYXlvdXRfcG9zdDogUHJvcFR5cGVzLmZ1bmMsXG4gICAgICAgIHJlcXVlc3RfcHJlOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAgICAgcmVxdWVzdF9wb3N0OiBQcm9wVHlwZXMuZnVuYyxcbiAgICAgICAgY2FsbGJhY2tfcmVzb2x2ZWQ6IFByb3BUeXBlcy5mdW5jLFxuICAgICAgICByZXF1ZXN0X3JlZnJlc2hfand0OiBQcm9wVHlwZXMuZnVuY1xuICAgIH0pXG59O1xuZXhwb3J0IGRlZmF1bHQgQXBwUHJvdmlkZXI7XG4iLCJpbXBvcnQgeyBhbnksIGZpbHRlciwgbWFwLCBwYXRoIH0gZnJvbSAncmFtZGEnO1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3RvcmVPYnNlcnZlciB7XG4gICAgX3N0b3JlO1xuICAgIF91bnN1YnNjcmliZTtcbiAgICBfb2JzZXJ2ZXJzID0gW107XG4gICAgY29uc3RydWN0b3Ioc3RvcmUpIHtcbiAgICAgICAgdGhpcy5fX2luaXRfXyhzdG9yZSk7XG4gICAgfVxuICAgIG9ic2VydmUgPSAob2JzZXJ2ZXIsIGlucHV0cykgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIG9ic2VydmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoaW5wdXRzKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW5wdXRzIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYWRkKG9ic2VydmVyLCBpbnB1dHMpO1xuICAgICAgICAgICAgcmV0dXJuICgpID0+IHRoaXMucmVtb3ZlKG9ic2VydmVyKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFkZChvYnNlcnZlci5vYnNlcnZlciwgb2JzZXJ2ZXIuaW5wdXRzKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHRoaXMucmVtb3ZlKG9ic2VydmVyLm9ic2VydmVyKTtcbiAgICB9O1xuICAgIHNldFN0b3JlID0gKHN0b3JlKSA9PiB7XG4gICAgICAgIHRoaXMuX19maW5hbGl6ZV9fKCk7XG4gICAgICAgIHRoaXMuX19pbml0X18oc3RvcmUpO1xuICAgIH07XG4gICAgX19maW5hbGl6ZV9fID0gKCkgPT4gdGhpcy5fdW5zdWJzY3JpYmU/LigpO1xuICAgIF9faW5pdF9fID0gKHN0b3JlKSA9PiB7XG4gICAgICAgIHRoaXMuX3N0b3JlID0gc3RvcmU7XG4gICAgICAgIGlmIChzdG9yZSkge1xuICAgICAgICAgICAgdGhpcy5fdW5zdWJzY3JpYmUgPSBzdG9yZS5zdWJzY3JpYmUodGhpcy5ub3RpZnkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX29ic2VydmVycy5mb3JFYWNoKG8gPT4ge1xuICAgICAgICAgICAgby5sYXN0U3RhdGUgPSBudWxsO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIGFkZCA9IChvYnNlcnZlciwgaW5wdXRzKSA9PiB0aGlzLl9vYnNlcnZlcnMucHVzaCh7XG4gICAgICAgIGlucHV0UGF0aHM6IG1hcChwID0+IHAuc3BsaXQoJy4nKSwgaW5wdXRzKSxcbiAgICAgICAgbGFzdFN0YXRlOiBudWxsLFxuICAgICAgICBvYnNlcnZlcixcbiAgICAgICAgdHJpZ2dlcmVkOiBmYWxzZVxuICAgIH0pO1xuICAgIG5vdGlmeSA9ICgpID0+IHtcbiAgICAgICAgY29uc3Qgc3RvcmUgPSB0aGlzLl9zdG9yZTtcbiAgICAgICAgaWYgKCFzdG9yZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0YXRlID0gc3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgICAgY29uc3QgdHJpZ2dlcmVkID0gZmlsdGVyKG8gPT4gIW8udHJpZ2dlcmVkICYmXG4gICAgICAgICAgICBhbnkoaSA9PiBwYXRoKGksIHN0YXRlKSAhPT0gcGF0aChpLCBvLmxhc3RTdGF0ZSksIG8uaW5wdXRQYXRocyksIHRoaXMuX29ic2VydmVycyk7XG4gICAgICAgIHRyaWdnZXJlZC5mb3JFYWNoKG8gPT4ge1xuICAgICAgICAgICAgby50cmlnZ2VyZWQgPSB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgICAgdHJpZ2dlcmVkLmZvckVhY2gobyA9PiB7XG4gICAgICAgICAgICBvLmxhc3RTdGF0ZSA9IHN0b3JlLmdldFN0YXRlKCk7XG4gICAgICAgICAgICBvLm9ic2VydmVyKHN0b3JlKTtcbiAgICAgICAgICAgIG8udHJpZ2dlcmVkID0gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmVtb3ZlID0gKG9ic2VydmVyKSA9PiB0aGlzLl9vYnNlcnZlcnMuc3BsaWNlKHRoaXMuX29ic2VydmVycy5maW5kSW5kZXgobyA9PiBvYnNlcnZlciA9PT0gby5vYnNlcnZlciwgdGhpcy5fb2JzZXJ2ZXJzKSwgMSk7XG59XG4iLCJpbXBvcnQgeyBjb25jYXQsIGZsYXR0ZW4sIGludGVyc2VjdGlvbiwga2V5cywgbWFwLCBtZXJnZURlZXBSaWdodCwgcGF0aCwgcGljaywgcGx1Y2ssIHZhbHVlcywgdG9QYWlycywgemlwLCBhc3NvY1BhdGggfSBmcm9tICdyYW1kYSc7XG5pbXBvcnQgeyBTVEFUVVMsIEpXVF9FWFBJUkVEX01FU1NBR0UgfSBmcm9tICcuLi9jb25zdGFudHMvY29uc3RhbnRzJztcbmltcG9ydCB7IE1BWF9BVVRIX1JFVFJJRVMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBDYWxsYmFja0FjdGlvblR5cGUsIENhbGxiYWNrQWdncmVnYXRlQWN0aW9uVHlwZSB9IGZyb20gJy4uL3JlZHVjZXJzL2NhbGxiYWNrcyc7XG5pbXBvcnQgeyBpc011bHRpVmFsdWVkLCBzdHJpbmdpZnlJZCwgaXNNdWx0aU91dHB1dFByb3AgfSBmcm9tICcuL2RlcGVuZGVuY2llcyc7XG5pbXBvcnQgeyB1cmxCYXNlIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBnZXRDU1JGSGVhZGVyLCBkaXNwYXRjaEVycm9yLCBzZXRQYXRocyB9IGZyb20gJy4nO1xuaW1wb3J0IHsgY3JlYXRlQWN0aW9uIH0gZnJvbSAncmVkdXgtYWN0aW9ucyc7XG5pbXBvcnQgeyBhZGRIdHRwSGVhZGVycyB9IGZyb20gJy4uL2FjdGlvbnMnO1xuaW1wb3J0IHsgbm90aWZ5T2JzZXJ2ZXJzLCB1cGRhdGVQcm9wcyB9IGZyb20gJy4vaW5kZXgnO1xuaW1wb3J0IHsgaXNQYXRjaCwgcGFyc2VQYXRjaFByb3BzIH0gZnJvbSAnLi9wYXRjaCc7XG5pbXBvcnQgeyBjcmVhdGVQYXRjaEFuYWx5c2lzIH0gZnJvbSAnLi9wYXRjaEFuYWx5c2lzJztcbmltcG9ydCB7IGNvbXB1dGVQYXRocywgZ2V0UGF0aCB9IGZyb20gJy4vcGF0aHMnO1xuaW1wb3J0IHsgcmVxdWVzdERlcGVuZGVuY2llcyB9IGZyb20gJy4vcmVxdWVzdERlcGVuZGVuY2llcyc7XG5pbXBvcnQgeyBsb2FkTGlicmFyeSB9IGZyb20gJy4uL3V0aWxzL2xpYnJhcmllcyc7XG5pbXBvcnQgeyBnZXRTdHJlYW1DbGllbnQsIGlzU3RyZWFtTXVsdGlwbGV4ZWQgfSBmcm9tICcuLi91dGlscy9zdHJlYW1DbGllbnQnO1xuaW1wb3J0IHsgcGFyc2VQTUNJZCB9IGZyb20gJy4vcGF0dGVybk1hdGNoaW5nJztcbmltcG9ydCB7IHJlcGxhY2VQTUMgfSBmcm9tICcuL3BhdHRlcm5NYXRjaGluZyc7XG5pbXBvcnQgeyBsb2FkZWQsIGxvYWRpbmcgfSBmcm9tICcuL2xvYWRpbmcnO1xuaW1wb3J0IHsgZ2V0Q29tcG9uZW50TGF5b3V0IH0gZnJvbSAnLi4vd3JhcHBlci93cmFwcGluZyc7XG5pbXBvcnQgeyBnZXRXb3JrZXJDbGllbnQsIGlzV2ViU29ja2V0RW5hYmxlZCwgaXNXZWJTb2NrZXRBdmFpbGFibGUgfSBmcm9tICcuLi91dGlscy93b3JrZXJDbGllbnQnO1xuZXhwb3J0IGNvbnN0IGFkZEJsb2NrZWRDYWxsYmFja3MgPSBjcmVhdGVBY3Rpb24oQ2FsbGJhY2tBY3Rpb25UeXBlLkFkZEJsb2NrZWQpO1xuZXhwb3J0IGNvbnN0IGFkZENvbXBsZXRlZENhbGxiYWNrcyA9IGNyZWF0ZUFjdGlvbihDYWxsYmFja0FnZ3JlZ2F0ZUFjdGlvblR5cGUuQWRkQ29tcGxldGVkKTtcbmV4cG9ydCBjb25zdCBhZGRFeGVjdXRlZENhbGxiYWNrcyA9IGNyZWF0ZUFjdGlvbihDYWxsYmFja0FjdGlvblR5cGUuQWRkRXhlY3V0ZWQpO1xuZXhwb3J0IGNvbnN0IGFkZEV4ZWN1dGluZ0NhbGxiYWNrcyA9IGNyZWF0ZUFjdGlvbihDYWxsYmFja0FjdGlvblR5cGUuQWRkRXhlY3V0aW5nKTtcbmV4cG9ydCBjb25zdCBhZGRQcmlvcml0aXplZENhbGxiYWNrcyA9IGNyZWF0ZUFjdGlvbihDYWxsYmFja0FjdGlvblR5cGUuQWRkUHJpb3JpdGl6ZWQpO1xuZXhwb3J0IGNvbnN0IGFkZFJlcXVlc3RlZENhbGxiYWNrcyA9IGNyZWF0ZUFjdGlvbihDYWxsYmFja0FjdGlvblR5cGUuQWRkUmVxdWVzdGVkKTtcbmV4cG9ydCBjb25zdCBhZGRTdG9yZWRDYWxsYmFja3MgPSBjcmVhdGVBY3Rpb24oQ2FsbGJhY2tBY3Rpb25UeXBlLkFkZFN0b3JlZCk7XG5leHBvcnQgY29uc3QgYWRkV2F0Y2hlZENhbGxiYWNrcyA9IGNyZWF0ZUFjdGlvbihDYWxsYmFja0FjdGlvblR5cGUuQWRkV2F0Y2hlZCk7XG5leHBvcnQgY29uc3QgcmVtb3ZlRXhlY3V0ZWRDYWxsYmFja3MgPSBjcmVhdGVBY3Rpb24oQ2FsbGJhY2tBY3Rpb25UeXBlLlJlbW92ZUV4ZWN1dGVkKTtcbmV4cG9ydCBjb25zdCByZW1vdmVCbG9ja2VkQ2FsbGJhY2tzID0gY3JlYXRlQWN0aW9uKENhbGxiYWNrQWN0aW9uVHlwZS5SZW1vdmVCbG9ja2VkKTtcbmV4cG9ydCBjb25zdCByZW1vdmVFeGVjdXRpbmdDYWxsYmFja3MgPSBjcmVhdGVBY3Rpb24oQ2FsbGJhY2tBY3Rpb25UeXBlLlJlbW92ZUV4ZWN1dGluZyk7XG5leHBvcnQgY29uc3QgcmVtb3ZlUHJpb3JpdGl6ZWRDYWxsYmFja3MgPSBjcmVhdGVBY3Rpb24oQ2FsbGJhY2tBY3Rpb25UeXBlLlJlbW92ZVByaW9yaXRpemVkKTtcbmV4cG9ydCBjb25zdCByZW1vdmVSZXF1ZXN0ZWRDYWxsYmFja3MgPSBjcmVhdGVBY3Rpb24oQ2FsbGJhY2tBY3Rpb25UeXBlLlJlbW92ZVJlcXVlc3RlZCk7XG5leHBvcnQgY29uc3QgcmVtb3ZlU3RvcmVkQ2FsbGJhY2tzID0gY3JlYXRlQWN0aW9uKENhbGxiYWNrQWN0aW9uVHlwZS5SZW1vdmVTdG9yZWQpO1xuZXhwb3J0IGNvbnN0IHJlbW92ZVdhdGNoZWRDYWxsYmFja3MgPSBjcmVhdGVBY3Rpb24oQ2FsbGJhY2tBY3Rpb25UeXBlLlJlbW92ZVdhdGNoZWQpO1xuZXhwb3J0IGNvbnN0IGFnZ3JlZ2F0ZUNhbGxiYWNrcyA9IGNyZWF0ZUFjdGlvbihDYWxsYmFja0FnZ3JlZ2F0ZUFjdGlvblR5cGUuQWdncmVnYXRlKTtcbmNvbnN0IHVwZGF0ZVJlc291cmNlVXNhZ2UgPSBjcmVhdGVBY3Rpb24oJ1VQREFURV9SRVNPVVJDRV9VU0FHRScpO1xuY29uc3QgYWRkQ2FsbGJhY2tKb2IgPSBjcmVhdGVBY3Rpb24oJ0FERF9DQUxMQkFDS19KT0InKTtcbmNvbnN0IHJlbW92ZUNhbGxiYWNrSm9iID0gY3JlYXRlQWN0aW9uKCdSRU1PVkVfQ0FMTEJBQ0tfSk9CJyk7XG5jb25zdCBzZXRDYWxsYmFja0pvYk91dGRhdGVkID0gY3JlYXRlQWN0aW9uKCdDQUxMQkFDS19KT0JfT1VUREFURUQnKTtcbmZ1bmN0aW9uIHVud3JhcElmTm90TXVsdGkocGF0aHMsIGlkUHJvcHMsIHNwZWMsIGFueVZhbHMsIGRlcFR5cGUpIHtcbiAgICBsZXQgbXNnID0gJyc7XG4gICAgaWYgKGlzTXVsdGlWYWx1ZWQoc3BlYykpIHtcbiAgICAgICAgcmV0dXJuIFtpZFByb3BzLCBtc2ddO1xuICAgIH1cbiAgICBpZiAoaWRQcm9wcy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgaWYgKCFpZFByb3BzLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKHNwZWMuYWxsb3dfb3B0aW9uYWwpIHtcbiAgICAgICAgICAgICAgICBpZFByb3BzID0gW3sgLi4uc3BlYywgdmFsdWU6IG51bGwgfV07XG4gICAgICAgICAgICAgICAgbXNnID0gJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpc1N0ciA9IHR5cGVvZiBzcGVjLmlkID09PSAnc3RyaW5nJztcbiAgICAgICAgICAgICAgICBtc2cgPVxuICAgICAgICAgICAgICAgICAgICAnQSBub25leGlzdGVudCBvYmplY3Qgd2FzIHVzZWQgaW4gYW4gYCcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVwVHlwZSArXG4gICAgICAgICAgICAgICAgICAgICAgICAnYCBvZiBhIERhc2ggY2FsbGJhY2suIFRoZSBpZCBvZiB0aGlzIG9iamVjdCBpcyAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgIChpc1N0clxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ2AnICsgc3BlYy5pZCArICdgJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogSlNPTi5zdHJpbmdpZnkoc3BlYy5pZCkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYW55VmFscyA/ICcgd2l0aCBNQVRDSCB2YWx1ZXMgJyArIGFueVZhbHMgOiAnJykpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcgYW5kIHRoZSBwcm9wZXJ0eSBpcyBgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICBzcGVjLnByb3BlcnR5ICtcbiAgICAgICAgICAgICAgICAgICAgICAgIChpc1N0clxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ2AuIFRoZSBzdHJpbmcgaWRzIGluIHRoZSBjdXJyZW50IGxheW91dCBhcmU6IFsnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5cyhwYXRocy5zdHJzKS5qb2luKCcsICcpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ10nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnYC4gVGhlIHdpbGRjYXJkIGlkcyBjdXJyZW50bHkgYXZhaWxhYmxlIGFyZSBsb2dnZWQgYWJvdmUuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBtc2cgPVxuICAgICAgICAgICAgICAgICdNdWx0aXBsZSBvYmplY3RzIHdlcmUgZm91bmQgZm9yIGFuIGAnICtcbiAgICAgICAgICAgICAgICAgICAgZGVwVHlwZSArXG4gICAgICAgICAgICAgICAgICAgICdgIG9mIGEgY2FsbGJhY2sgdGhhdCBvbmx5IHRha2VzIG9uZSB2YWx1ZS4gVGhlIGlkIHNwZWMgaXMgJyArXG4gICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHNwZWMuaWQpICtcbiAgICAgICAgICAgICAgICAgICAgKGFueVZhbHMgPyAnIHdpdGggTUFUQ0ggdmFsdWVzICcgKyBhbnlWYWxzIDogJycpICtcbiAgICAgICAgICAgICAgICAgICAgJyBhbmQgdGhlIHByb3BlcnR5IGlzIGAnICtcbiAgICAgICAgICAgICAgICAgICAgc3BlYy5wcm9wZXJ0eSArXG4gICAgICAgICAgICAgICAgICAgICdgLiBUaGUgb2JqZWN0cyB3ZSBmb3VuZCBhcmU6ICcgK1xuICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShtYXAocGljayhbJ2lkJywgJ3Byb3BlcnR5J10pLCBpZFByb3BzKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFtpZFByb3BzWzBdLCBtc2ddO1xufVxuZnVuY3Rpb24gZmlsbFZhbHMocGF0aHMsIGxheW91dCwgY2IsIHNwZWNzLCBkZXBUeXBlLCBhbGxvd0FsbE1pc3NpbmcgPSBmYWxzZSkge1xuICAgIGNvbnN0IGdldHRlciA9IGRlcFR5cGUgPT09ICdJbnB1dCcgPyBjYi5nZXRJbnB1dHMgOiBjYi5nZXRTdGF0ZTtcbiAgICBjb25zdCBlcnJvcnMgPSBbXTtcbiAgICBsZXQgZW1wdHlNdWx0aVZhbHVlcyA9IDA7XG4gICAgY29uc3QgaW5wdXRWYWxzID0gZ2V0dGVyKHBhdGhzKS5tYXAoKGlucHV0TGlzdCwgaSkgPT4ge1xuICAgICAgICBjb25zdCBbaW5wdXRzLCBpbnB1dEVycm9yXSA9IHVud3JhcElmTm90TXVsdGkocGF0aHMsIGlucHV0TGlzdC5tYXAoKHsgaWQsIHByb3BlcnR5LCBwYXRoOiBwYXRoXyB9KSA9PiAoe1xuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICBwcm9wZXJ0eSxcbiAgICAgICAgICAgIHZhbHVlOiBwYXRoKFsuLi5wYXRoXywgJ3Byb3BzJywgcHJvcGVydHldLCBsYXlvdXQpXG4gICAgICAgIH0pKSwgc3BlY3NbaV0sIGNiLmFueVZhbHMsIGRlcFR5cGUpO1xuICAgICAgICBpZiAoaXNNdWx0aVZhbHVlZChzcGVjc1tpXSkgJiYgIWlucHV0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGVtcHR5TXVsdGlWYWx1ZXMrKztcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5wdXRFcnJvcikge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2goaW5wdXRFcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlucHV0cztcbiAgICB9KTtcbiAgICBpZiAoZXJyb3JzLmxlbmd0aCkge1xuICAgICAgICBpZiAoYWxsb3dBbGxNaXNzaW5nICYmXG4gICAgICAgICAgICBlcnJvcnMubGVuZ3RoICsgZW1wdHlNdWx0aVZhbHVlcyA9PT0gaW5wdXRWYWxzLmxlbmd0aCkge1xuICAgICAgICAgICAgLy8gV2UgaGF2ZSBhdCBsZWFzdCBvbmUgbm9uLW11bHRpdmFsdWVkIGlucHV0LCBidXQgYWxsIHNpbXBsZSBhbmRcbiAgICAgICAgICAgIC8vIG11bHRpLXZhbHVlZCBpbnB1dHMgYXJlIG1pc3NpbmcuXG4gICAgICAgICAgICAvLyAoaWYgYWxsIGlucHV0cyBhcmUgbXVsdGl2YWx1ZWQgYW5kIGFsbCBtaXNzaW5nIHdlIHN0aWxsIHJldHVyblxuICAgICAgICAgICAgLy8gdGhlbSBhcyBub3JtYWwsIGFuZCBmaXJlIHRoZSBjYWxsYmFjay4pXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB3ZSBnZXQgaGVyZSB3ZSBoYXZlIHNvbWUgbWlzc2luZyBhbmQgc29tZSBwcmVzZW50IGlucHV0cy5cbiAgICAgICAgLy8gT3IgYWxsIG1pc3NpbmcgaW4gYSBjb250ZXh0IHRoYXQgZG9lc24ndCBhbGxvdyB0aGlzLlxuICAgICAgICAvLyBUaGF0J3MgYSByZWFsIHByb2JsZW0sIHNvIHRocm93IHRoZSBmaXJzdCBtZXNzYWdlIGFzIGFuIGVycm9yLlxuICAgICAgICByZWZFcnIoZXJyb3JzLCBwYXRocyk7XG4gICAgfVxuICAgIHJldHVybiBpbnB1dFZhbHM7XG59XG5mdW5jdGlvbiByZWZFcnIoZXJyb3JzLCBwYXRocykge1xuICAgIGNvbnN0IGVyciA9IGVycm9yc1swXTtcbiAgICBpZiAoZXJyLmluZGV4T2YoJ2xvZ2dlZCBhYm92ZScpICE9PSAtMSkge1xuICAgICAgICAvLyBXaWxkY2FyZCByZWZlcmVuY2UgZXJyb3JzIG1lbnRpb24gYSBsaXN0IG9mIHdpbGRjYXJkIHNwZWNzIGxvZ2dlZFxuICAgICAgICAvLyBUT0RPOiB1bndyYXBwZWQgbGlzdCBvZiB3aWxkY2FyZCBpZHM/XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUuZXJyb3IocGF0aHMub2Jqcyk7XG4gICAgfVxuICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihlcnIpO1xufVxuY29uc3QgZ2V0VmFscyA9IChpbnB1dCkgPT4gQXJyYXkuaXNBcnJheShpbnB1dCkgPyBwbHVjaygndmFsdWUnLCBpbnB1dCkgOiBpbnB1dC52YWx1ZTtcbmNvbnN0IHppcElmQXJyYXkgPSAoYSwgYikgPT4ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGEpKSB7XG4gICAgICAgIC8vIEZvciBjbGllbnQtc2lkZSBjYWxsYmFja3Mgd2l0aCBtdWx0aXBsZSBPdXRwdXRzLCBvbmx5IHJldHVybiBhIHNpbmdsZSBkYXNoX2NsaWVudHNpZGUubm9fdXBkYXRlXG4gICAgICAgIGlmIChiID09PSB3aW5kb3cuZGFzaF9jbGllbnRzaWRlLm5vX3VwZGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHppcChhLCBbYl0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB6aXAoYSwgYik7XG4gICAgfVxuICAgIHJldHVybiBbW2EsIGJdXTtcbn07XG5mdW5jdGlvbiBjbGVhbk91dHB1dFByb3AocHJvcGVydHkpIHtcbiAgICByZXR1cm4gcHJvcGVydHkuc3BsaXQoJ0AnKVswXTtcbn1cbmZ1bmN0aW9uIHBhdGNoZWRSZXN1bHRGaWVsZHMocGF0Y2hlZE91dHB1dHMpIHtcbiAgICByZXR1cm4ga2V5cyhwYXRjaGVkT3V0cHV0cykubGVuZ3RoID8geyBwYXRjaGVkT3V0cHV0cyB9IDoge307XG59XG4vLyBXaGVuIHRoZSBMYXlvdXQgbWF5IGhhdmUgY2hhbmdlZCwgcnVuIGVhY2ggb3V0cHV0IHRocm91Z2ggcGFyc2VQYXRjaFByb3BzIGFnYWluc3Rcbi8vIHRoZSBjdXJyZW50IGxheW91dCwgcmVjb3JkaW5nIGEgUGF0Y2hBbmFseXNpcyBmb3IgZWFjaCBvdXRwdXQgdGhhdFxuLy8gcmV0dXJuZWQgYSBQYXRjaC4gU2hhcmVkIGJ5IHRoZSBjbGllbnRzaWRlIGFuZCBzZXJ2ZXJzaWRlIHJlc3VsdCBwYXRoc1xuZnVuY3Rpb24gYXBwbHlQYXRjaGVkT3V0cHV0cyhvdXRwdXRzLCBwYXRocywgY3VycmVudExheW91dCwgZGF0YSkge1xuICAgIGNvbnN0IHBhdGNoZWRPdXRwdXRzID0ge307XG4gICAgZmxhdHRlbihvdXRwdXRzKS5mb3JFYWNoKChvdXQpID0+IHtcbiAgICAgICAgY29uc3QgcHJvcE5hbWUgPSBjbGVhbk91dHB1dFByb3Aob3V0LnByb3BlcnR5KTtcbiAgICAgICAgY29uc3Qgb3V0cHV0UGF0aCA9IGdldFBhdGgocGF0aHMsIG91dC5pZCk7XG4gICAgICAgIGNvbnN0IGlkU3RyID0gc3RyaW5naWZ5SWQob3V0LmlkKTtcbiAgICAgICAgY29uc3QgZGF0YVBhdGggPSBbaWRTdHIsIHByb3BOYW1lXTtcbiAgICAgICAgY29uc3Qgb3V0cHV0VmFsdWUgPSBwYXRoKGRhdGFQYXRoLCBkYXRhKTtcbiAgICAgICAgaWYgKG91dHB1dFZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNQYXRjaChvdXRwdXRWYWx1ZSkpIHtcbiAgICAgICAgICAgIC8vIE9uZSBhbmFseXNpcyBwZXIgb3V0cHV0LCBzaGFyZWQgYnkgYWxsIG9mIGl0c1xuICAgICAgICAgICAgLy8gcGF0Y2hlZCBwcm9wc1xuICAgICAgICAgICAgcGF0Y2hlZE91dHB1dHNbaWRTdHJdID1cbiAgICAgICAgICAgICAgICBwYXRjaGVkT3V0cHV0c1tpZFN0cl0gfHwgY3JlYXRlUGF0Y2hBbmFseXNpcygpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9sZFByb3BzID0gcGF0aChvdXRwdXRQYXRoLmNvbmNhdChbJ3Byb3BzJ10pLCBjdXJyZW50TGF5b3V0KSB8fCB7fTtcbiAgICAgICAgY29uc3QgbmV3UHJvcHMgPSBwYXJzZVBhdGNoUHJvcHMoeyBbcHJvcE5hbWVdOiBvdXRwdXRWYWx1ZSB9LCBvbGRQcm9wcywgcGF0Y2hlZE91dHB1dHNbaWRTdHJdKTtcbiAgICAgICAgZGF0YSA9IGFzc29jUGF0aChkYXRhUGF0aCwgbmV3UHJvcHNbcHJvcE5hbWVdLCBkYXRhKTtcbiAgICB9KTtcbiAgICByZXR1cm4geyBkYXRhLCBwYXRjaGVkT3V0cHV0cyB9O1xufVxuYXN5bmMgZnVuY3Rpb24gaGFuZGxlQ2xpZW50c2lkZShkaXNwYXRjaCwgY2xpZW50c2lkZV9mdW5jdGlvbiwgY29uZmlnLCBwYXlsb2FkKSB7XG4gICAgY29uc3QgZGMgPSAod2luZG93LmRhc2hfY2xpZW50c2lkZSA9XG4gICAgICAgIHdpbmRvdy5kYXNoX2NsaWVudHNpZGUgfHwge30pO1xuICAgIGlmICghZGMubm9fdXBkYXRlKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkYywgJ25vX3VwZGF0ZScsIHtcbiAgICAgICAgICAgIHZhbHVlOiB7IGRlc2NyaXB0aW9uOiAnUmV0dXJuIHRvIHByZXZlbnQgdXBkYXRpbmcgYW4gT3V0cHV0LicgfSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRjLCAnUHJldmVudFVwZGF0ZScsIHtcbiAgICAgICAgICAgIHZhbHVlOiB7IGRlc2NyaXB0aW9uOiAnVGhyb3cgdG8gcHJldmVudCB1cGRhdGluZyBhbGwgT3V0cHV0cy4nIH0sXG4gICAgICAgICAgICB3cml0YWJsZTogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IHsgaW5wdXRzLCBvdXRwdXRzLCBzdGF0ZSB9ID0gcGF5bG9hZDtcbiAgICBjb25zdCByZXF1ZXN0VGltZSA9IERhdGUubm93KCk7XG4gICAgY29uc3QgaW5wdXREaWN0ID0gaW5wdXRzVG9EaWN0KGlucHV0cyk7XG4gICAgY29uc3Qgc3RhdGVEaWN0ID0gaW5wdXRzVG9EaWN0KHN0YXRlKTtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBsZXQgc3RhdHVzID0gU1RBVFVTLk9LO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHsgbmFtZXNwYWNlLCBmdW5jdGlvbl9uYW1lIH0gPSBjbGllbnRzaWRlX2Z1bmN0aW9uO1xuICAgICAgICBsZXQgYXJncyA9IGlucHV0cy5tYXAoZ2V0VmFscyk7XG4gICAgICAgIGlmIChzdGF0ZSkge1xuICAgICAgICAgICAgYXJncyA9IGNvbmNhdChhcmdzLCBzdGF0ZS5tYXAoZ2V0VmFscykpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHNldHVwIGNhbGxiYWNrIGNvbnRleHRcbiAgICAgICAgZGMuY2FsbGJhY2tfY29udGV4dCA9IHt9O1xuICAgICAgICBkYy5jYWxsYmFja19jb250ZXh0LnRyaWdnZXJlZCA9IHBheWxvYWQuY2hhbmdlZFByb3BJZHMubWFwKHByb3BfaWQgPT4gKHtcbiAgICAgICAgICAgIHByb3BfaWQ6IHByb3BfaWQsXG4gICAgICAgICAgICB2YWx1ZTogaW5wdXREaWN0W3Byb3BfaWRdXG4gICAgICAgIH0pKTtcbiAgICAgICAgZGMuY2FsbGJhY2tfY29udGV4dC50cmlnZ2VyZWRfaWQgPSBnZXRUcmlnZ2VyZWRJZChwYXlsb2FkLmNoYW5nZWRQcm9wSWRzKTtcbiAgICAgICAgZGMuY2FsbGJhY2tfY29udGV4dC5pbnB1dHNfbGlzdCA9IGlucHV0cztcbiAgICAgICAgZGMuY2FsbGJhY2tfY29udGV4dC5pbnB1dHMgPSBpbnB1dERpY3Q7XG4gICAgICAgIGRjLmNhbGxiYWNrX2NvbnRleHQuc3RhdGVzX2xpc3QgPSBzdGF0ZTtcbiAgICAgICAgZGMuY2FsbGJhY2tfY29udGV4dC5zdGF0ZXMgPSBzdGF0ZURpY3Q7XG4gICAgICAgIGRjLmNhbGxiYWNrX2NvbnRleHQub3V0cHV0c19saXN0ID0gb3V0cHV0cztcbiAgICAgICAgbGV0IHJldHVyblZhbHVlID0gZGNbbmFtZXNwYWNlXVtmdW5jdGlvbl9uYW1lXSguLi5hcmdzKTtcbiAgICAgICAgZGVsZXRlIGRjLmNhbGxiYWNrX2NvbnRleHQ7XG4gICAgICAgIGlmICh0eXBlb2YgcmV0dXJuVmFsdWU/LnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVyblZhbHVlID0gYXdhaXQgcmV0dXJuVmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG91dHB1dHMpIHtcbiAgICAgICAgICAgIHppcElmQXJyYXkob3V0cHV0cywgcmV0dXJuVmFsdWUpLmZvckVhY2goKFtvdXRpLCByZXRpXSkgPT4ge1xuICAgICAgICAgICAgICAgIHppcElmQXJyYXkob3V0aSwgcmV0aSkuZm9yRWFjaCgoW291dGlqLCByZXRpal0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBpZCwgcHJvcGVydHkgfSA9IG91dGlqO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpZFN0ciA9IHN0cmluZ2lmeUlkKGlkKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0YUZvcklkID0gKHJlc3VsdFtpZFN0cl0gPSByZXN1bHRbaWRTdHJdIHx8IHt9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJldGlqICE9PSBkYy5ub191cGRhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFGb3JJZFtjbGVhbk91dHB1dFByb3AocHJvcGVydHkpXSA9IHJldGlqO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoZSA9PT0gZGMuUHJldmVudFVwZGF0ZSkge1xuICAgICAgICAgICAgc3RhdHVzID0gU1RBVFVTLlBSRVZFTlRfVVBEQVRFO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc3RhdHVzID0gU1RBVFVTLkNMSUVOVFNJREVfRVJST1I7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICBkZWxldGUgZGMuY2FsbGJhY2tfY29udGV4dDtcbiAgICAgICAgLy8gU2V0dGluZyBzZXJ2ZXIgPSBjbGllbnQgZm9yY2VzIG5ldHdvcmsgPSAwXG4gICAgICAgIGNvbnN0IHRvdGFsVGltZSA9IERhdGUubm93KCkgLSByZXF1ZXN0VGltZTtcbiAgICAgICAgY29uc3QgcmVzb3VyY2VzID0ge1xuICAgICAgICAgICAgX19kYXNoX3NlcnZlcjogdG90YWxUaW1lLFxuICAgICAgICAgICAgX19kYXNoX2NsaWVudDogdG90YWxUaW1lLFxuICAgICAgICAgICAgX19kYXNoX3VwbG9hZDogMCxcbiAgICAgICAgICAgIF9fZGFzaF9kb3dubG9hZDogMFxuICAgICAgICB9O1xuICAgICAgICBpZiAoY29uZmlnLnVpKSB7XG4gICAgICAgICAgICBkaXNwYXRjaCh1cGRhdGVSZXNvdXJjZVVzYWdlKHtcbiAgICAgICAgICAgICAgICBpZDogcGF5bG9hZC5vdXRwdXQsXG4gICAgICAgICAgICAgICAgdXNhZ2U6IHJlc291cmNlcyxcbiAgICAgICAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgICAgIGlucHV0cyxcbiAgICAgICAgICAgICAgICBzdGF0ZVxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiB1cGRhdGVDb21wb25lbnQoY29tcG9uZW50X2lkLCBwcm9wcywgY2IpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGRpc3BhdGNoLCBnZXRTdGF0ZSkge1xuICAgICAgICBjb25zdCB7IHBhdGhzLCBjb25maWcgfSA9IGdldFN0YXRlKCk7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudFBhdGggPSBnZXRQYXRoKHBhdGhzLCBjb21wb25lbnRfaWQpO1xuICAgICAgICBpZiAoIWNvbXBvbmVudFBhdGgpIHtcbiAgICAgICAgICAgIGlmICghY29uZmlnLnN1cHByZXNzX2NhbGxiYWNrX2V4Y2VwdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaEVycm9yKGRpc3BhdGNoKSgnSUQgcnVubmluZyBjb21wb25lbnQgbm90IGZvdW5kIGluIGxheW91dCcsIFtcbiAgICAgICAgICAgICAgICAgICAgJ0NvbXBvbmVudCBkZWZpbmVkIGluIHJ1bm5pbmcga2V5d29yZCBub3QgZm91bmQgaW4gbGF5b3V0LicsXG4gICAgICAgICAgICAgICAgICAgIGBDb21wb25lbnQgaWQ6IFwiJHtzdHJpbmdpZnlJZChjb21wb25lbnRfaWQpfVwiYCxcbiAgICAgICAgICAgICAgICAgICAgJ1RoaXMgSUQgd2FzIHVzZWQgaW4gdGhlIGNhbGxiYWNrKHMpIGZvciBPdXRwdXQocyk6JyxcbiAgICAgICAgICAgICAgICAgICAgYCR7Y2Iub3V0cHV0fWAsXG4gICAgICAgICAgICAgICAgICAgICdZb3UgY2FuIHN1cHByZXNzIHRoaXMgZXhjZXB0aW9uIGJ5IHNldHRpbmcnLFxuICAgICAgICAgICAgICAgICAgICAnYHN1cHByZXNzX2NhbGxiYWNrX2V4Y2VwdGlvbnM9VHJ1ZWAuJ1xuICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBzdG9wIGZ1cnRoZXIgcHJvY2Vzc2luZyBiZWNhdXNlIGZ1bmN0aW9ucyBmdXJ0aGVyIG9uXG4gICAgICAgICAgICAvLyBjYW4ndCBvcGVyYXRlIG9uIGFuICd1bmRlZmluZWQnIG9iamVjdCwgYW5kIHRoZXkgd2lsbCB0aHJvdyBhblxuICAgICAgICAgICAgLy8gZXJyb3IuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZGlzcGF0Y2godXBkYXRlUHJvcHMoe1xuICAgICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgICBpdGVtcGF0aDogY29tcG9uZW50UGF0aCxcbiAgICAgICAgICAgIHJlbmRlclR5cGU6ICdjYWxsYmFjaydcbiAgICAgICAgfSkpO1xuICAgICAgICBkaXNwYXRjaChub3RpZnlPYnNlcnZlcnMoeyBpZDogY29tcG9uZW50X2lkLCBwcm9wcyB9KSk7XG4gICAgfTtcbn1cbi8qKlxuICogVXBkYXRlIGEgY29tcG9uZW50IHByb3BzIHdpdGggYHJ1bm5pbmdgL2Bwcm9ncmVzc2AvYHNldF9wcm9wc2AgY2FsbHMuXG4gKlxuICogQHBhcmFtIG91dHB1dHMgUHJvcHMgdG8gdXBkYXRlLlxuICogQHBhcmFtIGNiIFRoZSBvcmlnaW5hdGluZyBjYWxsYmFjayBpbmZvLlxuICogQHJldHVybnNcbiAqL1xuZnVuY3Rpb24gc2lkZVVwZGF0ZShvdXRwdXRzLCBjYikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZGlzcGF0Y2gsIGdldFN0YXRlKSB7XG4gICAgICAgIHRvUGFpcnMob3V0cHV0cylcbiAgICAgICAgICAgIC5yZWR1Y2UoKGFjYywgW2lkLCB2YWx1ZV0sIGkpID0+IHtcbiAgICAgICAgICAgIGxldCBjb21wb25lbnRJZCA9IGlkLCBwcm9wTmFtZSwgcmVwbGFjZWRJZHMgPSBbXTtcbiAgICAgICAgICAgIGlmIChpZC5zdGFydHNXaXRoKCd7JykpIHtcbiAgICAgICAgICAgICAgICBbY29tcG9uZW50SWQsIHByb3BOYW1lXSA9IHBhcnNlUE1DSWQoaWQpO1xuICAgICAgICAgICAgICAgIHJlcGxhY2VkSWRzID0gcmVwbGFjZVBNQyhjb21wb25lbnRJZCwgY2IsIGksIGdldFN0YXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlkLmluY2x1ZGVzKCcuJykpIHtcbiAgICAgICAgICAgICAgICBbY29tcG9uZW50SWQsIHByb3BOYW1lXSA9IGlkLnNwbGl0KCcuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBwcm9wcyA9IHByb3BOYW1lID8geyBbcHJvcE5hbWVdOiB2YWx1ZSB9IDogdmFsdWU7XG4gICAgICAgICAgICBpZiAocmVwbGFjZWRJZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgYWNjLnB1c2goW2NvbXBvbmVudElkLCBwcm9wc10pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocmVwbGFjZWRJZHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgYWNjLnB1c2goW3JlcGxhY2VkSWRzWzBdLCBwcm9wc10pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVwbGFjZWRJZHMuZm9yRWFjaCgocmVwKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGFjYy5wdXNoKFtyZXAsIHByb3BzXSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LCBbXSlcbiAgICAgICAgICAgIC5mb3JFYWNoKChbaWQsIGlkUHJvcHNdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdGF0ZSA9IGdldFN0YXRlKCk7XG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnRQYXRoID0gZ2V0UGF0aChzdGF0ZS5wYXRocywgaWQpO1xuICAgICAgICAgICAgbGV0IG9sZENvbXBvbmVudCA9IHsgcHJvcHM6IHt9IH07XG4gICAgICAgICAgICBpZiAoY29tcG9uZW50UGF0aCkge1xuICAgICAgICAgICAgICAgIG9sZENvbXBvbmVudCA9IGdldENvbXBvbmVudExheW91dChjb21wb25lbnRQYXRoLCBzdGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBvbGRQcm9wcyA9IG9sZENvbXBvbmVudD8ucHJvcHMgfHwge307XG4gICAgICAgICAgICBjb25zdCBwYXRjaGVkUHJvcHMgPSBwYXJzZVBhdGNoUHJvcHMoaWRQcm9wcywgb2xkUHJvcHMpO1xuICAgICAgICAgICAgZGlzcGF0Y2godXBkYXRlQ29tcG9uZW50KGlkLCBwYXRjaGVkUHJvcHMsIGNiKSk7XG4gICAgICAgICAgICBpZiAoIWNvbXBvbmVudFBhdGgpIHtcbiAgICAgICAgICAgICAgICAvLyBDb21wb25lbnQgZG9lc24ndCBleGlzdCwgZG9lc24ndCBtYXR0ZXIganVzdCBhbGxvdyB0aGVcbiAgICAgICAgICAgICAgICAvLyBjYWxsYmFjayB0byBjb250aW51ZS5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkaXNwYXRjaChzZXRQYXRocyhjb21wdXRlUGF0aHMoe1xuICAgICAgICAgICAgICAgIC4uLm9sZENvbXBvbmVudCxcbiAgICAgICAgICAgICAgICBwcm9wczogeyAuLi5vbGRDb21wb25lbnQucHJvcHMsIC4uLnBhdGNoZWRQcm9wcyB9XG4gICAgICAgICAgICB9LCBbLi4uY29tcG9uZW50UGF0aF0sIHN0YXRlLnBhdGhzLCBzdGF0ZS5wYXRocy5ldmVudHMpKSk7XG4gICAgICAgIH0pO1xuICAgIH07XG59XG4vKipcbiAqIEFwcGx5IGFuIGludGVybWVkaWF0ZSBmcmFtZSBmcm9tIGEgc3RyZWFtaW5nIGNhbGxiYWNrLlxuICpcbiAqIFRoZSBmcmFtZSdzIGRlY2xhcmVkIG91dHB1dHMgYXJlIGZsYXR0ZW5lZCB0byBgaWQucHJvcGAga2V5cyBhbmQgYXBwbGllZFxuICogdGhyb3VnaCB0aGUgc2lkZVVwZGF0ZSBwYXRoIChwYXJzZVBhdGNoUHJvcHMgKyB1cGRhdGVDb21wb25lbnQpLCBzbyBQYXRjaFxuICogdmFsdWVzIGFwcGx5IGluY3JlbWVudGFsbHksIHBhdGhzIHJlY29tcHV0ZSBmb3IgbmV3bHkgYWRkZWQgY29tcG9uZW50cyxcbiAqIGFuZCBvYnNlcnZlcnMgYXJlIG5vdGlmaWVkIOKAlCB0aGUgc2FtZSBzZW1hbnRpY3MgYXMgc2V0X3Byb3BzLiBUaGVcbiAqIGNhbGxiYWNrJ3MgZXhlY3V0aW9uIHByb21pc2Ugc3RheXMgcGVuZGluZyB1bnRpbCB0aGUgdGVybWluYWwgZnJhbWUuXG4gKi9cbmZ1bmN0aW9uIGFwcGx5U3RyZWFtRnJhbWUoZGlzcGF0Y2gsIGZyYW1lLCBwYXlsb2FkKSB7XG4gICAgaWYgKGZyYW1lLnJlc3BvbnNlKSB7XG4gICAgICAgIGNvbnN0IGZsYXQgPSB7fTtcbiAgICAgICAgdG9QYWlycyhmcmFtZS5yZXNwb25zZSkuZm9yRWFjaCgoW2lkLCBwcm9wc10pID0+IHtcbiAgICAgICAgICAgIHRvUGFpcnMocHJvcHMpLmZvckVhY2goKFtwcm9wLCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgICAgICBmbGF0W2Ake2lkfS4ke3Byb3B9YF0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGtleXMoZmxhdCkubGVuZ3RoKSB7XG4gICAgICAgICAgICBkaXNwYXRjaChzaWRlVXBkYXRlKGZsYXQsIHBheWxvYWQpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoZnJhbWUuc2lkZVVwZGF0ZSkge1xuICAgICAgICBkaXNwYXRjaChzaWRlVXBkYXRlKGZyYW1lLnNpZGVVcGRhdGUsIHBheWxvYWQpKTtcbiAgICB9XG59XG4vKipcbiAqIFJ1biBhIHN0cmVhbWluZyBjYWxsYmFjayBvdmVyIHRoZSBtdWx0aXBsZXhlZCB0cmFuc3BvcnQ6IGEgc2luZ2xlIGRvd25saW5rXG4gKiBzaGFyZWQgYnkgYWxsIG9mIHRoZSBwYWdlJ3Mgc3RyZWFtcyAtLSBhbmQsIGhvc3RlZCBpbiBhIFNoYXJlZFdvcmtlciwgYnkgYWxsXG4gKiBvZiB0aGUgYnJvd3NlcidzIHRhYnMgKHNlZSB1dGlscy9zdHJlYW1DbGllbnQpLiBGcmFtZXMgYXJlXG4gKiBhcHBsaWVkIGFzIHRoZXkgYXJyaXZlLCBzbyB0aGUgcmVzb2x2ZWQgdmFsdWUgaXMgZW1wdHkgbGlrZSB0aGUgV2ViU29ja2V0XG4gKiBzdHJlYW1pbmcgcGF0aC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gaGFuZGxlU3RyZWFtQ2FsbGJhY2soZGlzcGF0Y2gsIGNvbmZpZywgcGF5bG9hZCwgcnVubmluZykge1xuICAgIGxldCBydW5uaW5nT2ZmO1xuICAgIGlmIChydW5uaW5nKSB7XG4gICAgICAgIGRpc3BhdGNoKHNpZGVVcGRhdGUocnVubmluZy5ydW5uaW5nLCBwYXlsb2FkKSk7XG4gICAgICAgIHJ1bm5pbmdPZmYgPSBydW5uaW5nLnJ1bm5pbmdPZmY7XG4gICAgfVxuICAgIGNvbnN0IHVybCA9IGAke3VybEJhc2UoY29uZmlnKX1fZGFzaC11cGRhdGUtY29tcG9uZW50YDtcbiAgICBjb25zdCBpbml0ID0gbWVyZ2VEZWVwUmlnaHQoY29uZmlnLmZldGNoLCB7XG4gICAgICAgIGhlYWRlcnM6IGdldENTUkZIZWFkZXIoY29uZmlnKVxuICAgIH0pO1xuICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGdldFN0cmVhbUNsaWVudChjb25maWcpLnJ1bih1cmwsIGluaXQsIGNvbmZpZy5lbmRfaWQsIHBheWxvYWQsIChmcmFtZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGZyYW1lLmRpc3QpIHtcbiAgICAgICAgICAgICAgICBQcm9taXNlLmFsbChmcmFtZS5kaXN0Lm1hcChsb2FkTGlicmFyeSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXBwbHlTdHJlYW1GcmFtZShkaXNwYXRjaCwgZnJhbWUsIHBheWxvYWQpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZmluYWxseSB7XG4gICAgICAgIGlmIChydW5uaW5nT2ZmKSB7XG4gICAgICAgICAgICBkaXNwYXRjaChzaWRlVXBkYXRlKHJ1bm5pbmdPZmYsIHBheWxvYWQpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBGcmFtZXMgd2VyZSBhcHBsaWVkIGFzIHRoZXkgYXJyaXZlZDsgdGhlIHRlcm1pbmFsIHN0b3JlIHVwZGF0ZSBpcyBhIG5vLW9wLlxuICAgIHJldHVybiB7fTtcbn1cbmZ1bmN0aW9uIGhhbmRsZVNlcnZlcnNpZGUoZGlzcGF0Y2gsIGhvb2tzLCBjb25maWcsIHBheWxvYWQsIGJhY2tncm91bmQsIGFkZGl0aW9uYWxBcmdzLCBnZXRTdGF0ZSwgcnVubmluZywgY29tcHJlc3NQYXlsb2FkLCBjb21wcmVzc1RocmVzaG9sZCkge1xuICAgIGlmIChob29rcy5yZXF1ZXN0X3ByZSkge1xuICAgICAgICBob29rcy5yZXF1ZXN0X3ByZShwYXlsb2FkKTtcbiAgICB9XG4gICAgY29uc3QgcmVxdWVzdFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGJvZHkgPSBKU09OLnN0cmluZ2lmeShwYXlsb2FkKTtcbiAgICBsZXQgY2FjaGVLZXk7XG4gICAgbGV0IGpvYjtcbiAgICBsZXQgcnVubmluZ09mZjtcbiAgICBsZXQgcHJvZ3Jlc3NEZWZhdWx0O1xuICAgIGxldCBtb3JlQXJncyA9IGFkZGl0aW9uYWxBcmdzO1xuICAgIGlmIChydW5uaW5nKSB7XG4gICAgICAgIGRpc3BhdGNoKHNpZGVVcGRhdGUocnVubmluZy5ydW5uaW5nLCBwYXlsb2FkKSk7XG4gICAgICAgIHJ1bm5pbmdPZmYgPSBydW5uaW5nLnJ1bm5pbmdPZmY7XG4gICAgfVxuICAgIGNvbnN0IGZldGNoQ2FsbGJhY2sgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSBnZXRDU1JGSGVhZGVyKGNvbmZpZyk7XG4gICAgICAgIGxldCB1cmwgPSBgJHt1cmxCYXNlKGNvbmZpZyl9X2Rhc2gtdXBkYXRlLWNvbXBvbmVudGA7XG4gICAgICAgIGxldCBuZXdCb2R5ID0gYm9keTtcbiAgICAgICAgY29uc3QgYWRkQXJnID0gKG5hbWUsIHZhbHVlKSA9PiB7XG4gICAgICAgICAgICBsZXQgZGVsaW0gPSAnPyc7XG4gICAgICAgICAgICBpZiAodXJsLmluY2x1ZGVzKCc/JykpIHtcbiAgICAgICAgICAgICAgICBkZWxpbSA9ICcmJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHVybCA9IGAke3VybH0ke2RlbGltfSR7bmFtZX09JHt2YWx1ZX1gO1xuICAgICAgICB9O1xuICAgICAgICAvLyBFY2hvIHRoZSBzZXJ2ZXItaXNzdWVkIHRva2VuIHNvIHRoZSBzZXJ2ZXIgY2FuIGJpbmQvdmVyaWZ5IHRoZVxuICAgICAgICAvLyBiYWNrZ3JvdW5kLWNhbGxiYWNrIGhhbmRsZXMgKGNhY2hlS2V5L2pvYi9vbGRKb2IvY2FuY2VsSm9iKSBpdCBzaWducy5cbiAgICAgICAgaWYgKGNvbmZpZy5lbmRfaWQpIHtcbiAgICAgICAgICAgIGFkZEFyZygnZW5kSWQnLCBjb25maWcuZW5kX2lkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2FjaGVLZXkgfHwgam9iKSB7XG4gICAgICAgICAgICBpZiAoY2FjaGVLZXkpXG4gICAgICAgICAgICAgICAgYWRkQXJnKCdjYWNoZUtleScsIGNhY2hlS2V5KTtcbiAgICAgICAgICAgIGlmIChqb2IpXG4gICAgICAgICAgICAgICAgYWRkQXJnKCdqb2InLCBqb2IpO1xuICAgICAgICAgICAgLy8gY2xlYXIgaW5wdXRzIGFzIGJhY2tncm91bmQgY2FsbGJhY2sgZG9lc250IG5lZWQgaW5wdXRzLCBqdXN0IHZlcmlmeSBmb3IgY29udGV4dFxuICAgICAgICAgICAgY29uc3QgdG1wQm9keSA9IEpTT04ucGFyc2UobmV3Qm9keSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRtcEJvZHkuaW5wdXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdG1wQm9keS5pbnB1dHNbaV1bJ3ZhbHVlJ10gPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAodG1wQm9keT8uc3RhdGUgfHwgW10pLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdG1wQm9keS5zdGF0ZVtpXVsndmFsdWUnXSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXdCb2R5ID0gSlNPTi5zdHJpbmdpZnkodG1wQm9keSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1vcmVBcmdzKSB7XG4gICAgICAgICAgICBtb3JlQXJncy5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IGFkZEFyZyhrZXksIHZhbHVlKSk7XG4gICAgICAgICAgICBtb3JlQXJncyA9IG1vcmVBcmdzLmZpbHRlcigoW18sIF9fLCBzaW5nbGVdKSA9PiAhc2luZ2xlKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZmV0Y2hCb2R5ID0gbmV3Qm9keTtcbiAgICAgICAgLy8gQ29tcHJlc3MgcGF5bG9hZCBpZiBlbmFibGVkIGFuZCBzaXplIHRocmVzaG9sZCBpcyBtZXRcbiAgICAgICAgaWYgKGNvbXByZXNzUGF5bG9hZCAmJlxuICAgICAgICAgICAgY29tcHJlc3NUaHJlc2hvbGQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgbmV3Qm9keS5sZW5ndGggPiBjb21wcmVzc1RocmVzaG9sZCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdHJlYW0gPSBuZXcgQmxvYihbbmV3Qm9keV0pXG4gICAgICAgICAgICAgICAgICAgIC5zdHJlYW0oKVxuICAgICAgICAgICAgICAgICAgICAucGlwZVRocm91Z2gobmV3IENvbXByZXNzaW9uU3RyZWFtKCdnemlwJykpO1xuICAgICAgICAgICAgICAgIGZldGNoQm9keSA9IGF3YWl0IG5ldyBSZXNwb25zZShzdHJlYW0pLmJsb2IoKTtcbiAgICAgICAgICAgICAgICBoZWFkZXJzWydDb250ZW50LUVuY29kaW5nJ10gPSAnZ3ppcCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAvLyBGYWxsIHRocm91Z2ggdG8gc2VuZCB1bmNvbXByZXNzZWRcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignU2VuZGluZyB1bmNvbXByZXNzZWQgcGF5bG9hZCwgYmVjYXVzZSBjb21wcmVzc2luZyBmYWlsZWQ6JywgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmZXRjaCh1cmwsIG1lcmdlRGVlcFJpZ2h0KGNvbmZpZy5mZXRjaCwge1xuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgICAgYm9keTogZmV0Y2hCb2R5XG4gICAgICAgIH0pKTtcbiAgICB9O1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGhhbmRsZU91dHB1dCA9IChyZXMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgc3RhdHVzIH0gPSByZXM7XG4gICAgICAgICAgICBpZiAoam9iKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2FsbGJhY2tKb2IgPSBnZXRTdGF0ZSgpLmNhbGxiYWNrSm9ic1tqb2JdO1xuICAgICAgICAgICAgICAgIGlmIChjYWxsYmFja0pvYj8ub3V0ZGF0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2gocmVtb3ZlQ2FsbGJhY2tKb2IoeyBqb2JJZDogam9iIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoe30pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIHJlY29yZFByb2ZpbGUocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZy51aSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBDYWxsYmFjayBwcm9maWxpbmcgLSBvbmx5IHJlbGV2YW50IGlmIHdlJ3JlIHNob3dpbmcgdGhlIGRlYnVnIHVpXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc291cmNlcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9fZGFzaF9zZXJ2ZXI6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICBfX2Rhc2hfY2xpZW50OiBEYXRlLm5vdygpIC0gcmVxdWVzdFRpbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBfX2Rhc2hfdXBsb2FkOiBib2R5Lmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIF9fZGFzaF9kb3dubG9hZDogTnVtYmVyKHJlcy5oZWFkZXJzLmdldCgnQ29udGVudC1MZW5ndGgnKSlcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGltaW5nSGVhZGVycyA9IHJlcy5oZWFkZXJzLmdldCgnU2VydmVyLVRpbWluZycpIHx8ICcnO1xuICAgICAgICAgICAgICAgICAgICB0aW1pbmdIZWFkZXJzLnNwbGl0KCcsJykuZm9yRWFjaCgoaGVhZGVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gaGVhZGVyLnNwbGl0KCc7JylbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkdXIgPSBoZWFkZXIubWF0Y2goLztkdXI9WzAtOS5dKy8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR1cikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlc1tuYW1lXSA9IE51bWJlcihkdXJbMF0uc2xpY2UoNSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2godXBkYXRlUmVzb3VyY2VVc2FnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogcGF5bG9hZC5vdXRwdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2FnZTogcmVzb3VyY2VzLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRzOiBwYXlsb2FkLmlucHV0cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlOiBwYXlsb2FkLnN0YXRlXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBmaW5pc2hMaW5lID0gKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IG11bHRpLCByZXNwb25zZSB9ID0gZGF0YTtcbiAgICAgICAgICAgICAgICBpZiAoaG9va3MucmVxdWVzdF9wb3N0KSB7XG4gICAgICAgICAgICAgICAgICAgIGhvb2tzLnJlcXVlc3RfcG9zdChwYXlsb2FkLCByZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgICAgICAgICAgaWYgKG11bHRpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3BvbnNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBvdXRwdXQgfSA9IHBheWxvYWQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gb3V0cHV0LnN1YnN0cigwLCBvdXRwdXQubGFzdEluZGV4T2YoJy4nKSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHsgW2lkXTogcmVzcG9uc2UucHJvcHMgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVjb3JkUHJvZmlsZShyZXN1bHQpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBjb21wbGV0ZUpvYiA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoam9iKSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKHJlbW92ZUNhbGxiYWNrSm9iKHsgam9iSWQ6IGpvYiB9KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChydW5uaW5nT2ZmKSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKHNpZGVVcGRhdGUocnVubmluZ09mZiwgcGF5bG9hZCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocHJvZ3Jlc3NEZWZhdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKHNpZGVVcGRhdGUocHJvZ3Jlc3NEZWZhdWx0LCBwYXlsb2FkKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIC8vIFN0cmVhbWluZyBjYWxsYmFja3M6IHJlYWQgTkRKU09OIGZyYW1lcyBhcyB0aGV5IGFycml2ZSxcbiAgICAgICAgICAgIC8vIGFwcGx5IGVhY2ggb25lIGltbWVkaWF0ZWx5LCBhbmQgcmVzb2x2ZSBvbiB0aGUgdGVybWluYWwgZnJhbWUuXG4gICAgICAgICAgICBjb25zdCBoYW5kbGVTdHJlYW1lZFJlc3BvbnNlID0gYXN5bmMgKHN0cmVhbVJlcykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlYWRlciA9IHN0cmVhbVJlcy5ib2R5LmdldFJlYWRlcigpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcbiAgICAgICAgICAgICAgICBsZXQgYnVmZmVyID0gJyc7XG4gICAgICAgICAgICAgICAgbGV0IGxhc3RSZXNwb25zZTtcbiAgICAgICAgICAgICAgICBsZXQgZmluaXNoZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9jZXNzRnJhbWUgPSBhc3luYyAoZnJhbWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lLmRvbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlSm9iKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWUuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRQcm9maWxlKHt9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKGZyYW1lLmVycm9yLm1lc3NhZ2UgfHwgJ0NhbGxiYWNrIGVycm9yJykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChob29rcy5yZXF1ZXN0X3Bvc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob29rcy5yZXF1ZXN0X3Bvc3QocGF5bG9hZCwgbGFzdFJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZFByb2ZpbGUobGFzdFJlc3BvbnNlIHx8IHt9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZyYW1lcyB3ZXJlIGFscmVhZHkgYXBwbGllZDsgcmVzb2x2ZSBlbXB0eSBzbyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRlcm1pbmFsIHN0b3JlIHVwZGF0ZSBpcyBhIG5vLW9wIChQYXRjaCBmcmFtZXMgbXVzdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90IHJlLWFwcGx5KS5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoe30pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZS5kaXN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChmcmFtZS5kaXN0Lm1hcChsb2FkTGlicmFyeSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxhc3RSZXNwb25zZSA9IGZyYW1lLnJlc3BvbnNlO1xuICAgICAgICAgICAgICAgICAgICBhcHBseVN0cmVhbUZyYW1lKGRpc3BhdGNoLCBmcmFtZSwgcGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciArPSBkZWNvZGVyLmRlY29kZSh2YWx1ZSwgeyBzdHJlYW06IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsaW5lcyA9IGJ1ZmZlci5zcGxpdCgnXFxuJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSBsaW5lcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbGluZS50cmltKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb2Nlc3NGcmFtZShKU09OLnBhcnNlKGxpbmUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmluaXNoZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLmNhbmNlbCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChidWZmZXIudHJpbSgpICYmICFmaW5pc2hlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvY2Vzc0ZyYW1lKEpTT04ucGFyc2UoYnVmZmVyKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbmlzaGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZUpvYigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RSZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZFByb2ZpbGUobGFzdFJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHt9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZFByb2ZpbGUoe30pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghZmluaXNoZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU3RyZWFtIGVuZGVkIHdpdGhvdXQgYSB0ZXJtaW5hbCBmcmFtZSAoY29ubmVjdGlvblxuICAgICAgICAgICAgICAgICAgICAvLyBkcm9wcGVkKTogY2xlYXIgbG9hZGluZywga2VlcCBhcHBsaWVkIGZyYW1lcy5cbiAgICAgICAgICAgICAgICAgICAgY29tcGxldGVKb2IoKTtcbiAgICAgICAgICAgICAgICAgICAgcmVjb3JkUHJvZmlsZShsYXN0UmVzcG9uc2UgfHwge30pO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHt9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKHN0YXR1cyA9PT0gU1RBVFVTLk9LKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudFR5cGUgPSByZXMuaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpIHx8ICcnO1xuICAgICAgICAgICAgICAgIGlmIChjb250ZW50VHlwZS5pbmNsdWRlcygnYXBwbGljYXRpb24veC1uZGpzb24nKSAmJiByZXMuYm9keSkge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVTdHJlYW1lZFJlc3BvbnNlKHJlcyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzLmpzb24oKS50aGVuKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY2FjaGVLZXkgJiYgZGF0YS5jYWNoZUtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVLZXkgPSBkYXRhLmNhY2hlS2V5O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICgham9iICYmIGRhdGEuam9iKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqb2JJbmZvID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvYklkOiBkYXRhLmpvYixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZUtleTogZGF0YS5jYWNoZUtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxJbnB1dHM6IGRhdGEuY2FuY2VsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzRGVmYXVsdDogZGF0YS5wcm9ncmVzc0RlZmF1bHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0OiBKU09OLnN0cmluZ2lmeShwYXlsb2FkLm91dHB1dHMpXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2goYWRkQ2FsbGJhY2tKb2Ioam9iSW5mbykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgam9iID0gZGF0YS5qb2I7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuc2lkZVVwZGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2goc2lkZVVwZGF0ZShkYXRhLnNpZGVVcGRhdGUsIHBheWxvYWQpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5wcm9ncmVzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2goc2lkZVVwZGF0ZShkYXRhLnByb2dyZXNzLCBwYXlsb2FkKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwcm9ncmVzc0RlZmF1bHQgJiYgZGF0YS5wcm9ncmVzc0RlZmF1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzRGVmYXVsdCA9IGRhdGEucHJvZ3Jlc3NEZWZhdWx0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghYmFja2dyb3VuZCB8fCBkYXRhLnJlc3BvbnNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmRpc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9taXNlLmFsbChkYXRhLmRpc3QubWFwKGxvYWRMaWJyYXJ5KSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlSm9iKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaExpbmUoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZUpvYigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaExpbmUoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBQb2xsIGNoYWluLlxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChoYW5kbGUsIGJhY2tncm91bmQuaW50ZXJ2YWwgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYmFja2dyb3VuZC5pbnRlcnZhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogNTAwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoc3RhdHVzID09PSBTVEFUVVMuUFJFVkVOVF9VUERBVEUpIHtcbiAgICAgICAgICAgICAgICBjb21wbGV0ZUpvYigpO1xuICAgICAgICAgICAgICAgIHJlY29yZFByb2ZpbGUoe30pO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoe30pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29tcGxldGVKb2IoKTtcbiAgICAgICAgICAgICAgICByZWplY3QocmVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgaGFuZGxlRXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoY29uZmlnLnVpKSB7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2godXBkYXRlUmVzb3VyY2VVc2FnZSh7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBwYXlsb2FkLm91dHB1dCxcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBTVEFUVVMuTk9fUkVTUE9OU0UsXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdDoge30sXG4gICAgICAgICAgICAgICAgICAgIGlucHV0czogcGF5bG9hZC5pbnB1dHMsXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlOiBwYXlsb2FkLnN0YXRlXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignQ2FsbGJhY2sgZmFpbGVkOiB0aGUgc2VydmVyIGRpZCBub3QgcmVzcG9uZC4nKSk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGhhbmRsZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGZldGNoQ2FsbGJhY2soKS50aGVuKGhhbmRsZU91dHB1dCwgaGFuZGxlRXJyb3IpO1xuICAgICAgICB9O1xuICAgICAgICBoYW5kbGUoKTtcbiAgICB9KTtcbn1cbi8qKlxuICogSGFuZGxlIHNlcnZlcnNpZGUgY2FsbGJhY2sgdmlhIFdlYlNvY2tldCBjb25uZWN0aW9uLlxuICpcbiAqIFVzZXMgdGhlIFNoYXJlZFdvcmtlciB0byBzZW5kIHRoZSBjYWxsYmFjayByZXF1ZXN0IHRocm91Z2ggdGhlIHBlcnNpc3RlbnRcbiAqIFdlYlNvY2tldCBjb25uZWN0aW9uIGluc3RlYWQgb2YgSFRUUCBQT1NULlxuICovXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVXZWJzb2NrZXRDYWxsYmFjayhkaXNwYXRjaCwgaG9va3MsIGNvbmZpZywgcGF5bG9hZCwgcnVubmluZykge1xuICAgIGlmIChob29rcy5yZXF1ZXN0X3ByZSkge1xuICAgICAgICBob29rcy5yZXF1ZXN0X3ByZShwYXlsb2FkKTtcbiAgICB9XG4gICAgY29uc3QgcmVxdWVzdFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGxldCBydW5uaW5nT2ZmO1xuICAgIGlmIChydW5uaW5nKSB7XG4gICAgICAgIGRpc3BhdGNoKHNpZGVVcGRhdGUocnVubmluZy5ydW5uaW5nLCBwYXlsb2FkKSk7XG4gICAgICAgIHJ1bm5pbmdPZmYgPSBydW5uaW5nLnJ1bm5pbmdPZmY7XG4gICAgfVxuICAgIGNvbnN0IHdvcmtlckNsaWVudCA9IGdldFdvcmtlckNsaWVudCgpO1xuICAgIHRyeSB7XG4gICAgICAgIC8vIEVuc3VyZSBXZWJTb2NrZXQgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZFxuICAgICAgICBhd2FpdCB3b3JrZXJDbGllbnQuZW5zdXJlQ29ubmVjdGVkKGNvbmZpZyk7XG4gICAgICAgIC8vIFN0cmVhbWluZyBjYWxsYmFja3MgZGVsaXZlciBpbnRlcm1lZGlhdGUgZnJhbWVzIGJlZm9yZSB0aGVcbiAgICAgICAgLy8gdGVybWluYWwgcmVzcG9uc2U7IGFwcGx5IGVhY2ggb25lIGFzIGl0IGFycml2ZXMuXG4gICAgICAgIGxldCBsYXN0U3RyZWFtUmVzcG9uc2U7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgd29ya2VyQ2xpZW50LnNlbmRDYWxsYmFjayhwYXlsb2FkLCAoZnJhbWUpID0+IHtcbiAgICAgICAgICAgIGxhc3RTdHJlYW1SZXNwb25zZSA9IGZyYW1lPy5yZXNwb25zZTtcbiAgICAgICAgICAgIGFwcGx5U3RyZWFtRnJhbWUoZGlzcGF0Y2gsIGZyYW1lLCBwYXlsb2FkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIEhhbmRsZSBydW5uaW5nIG9mZiBzdGF0ZVxuICAgICAgICBpZiAocnVubmluZ09mZikge1xuICAgICAgICAgICAgZGlzcGF0Y2goc2lkZVVwZGF0ZShydW5uaW5nT2ZmLCBwYXlsb2FkKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gJ3ByZXZlbnRfdXBkYXRlJykge1xuICAgICAgICAgICAgLy8gUmVjb3JkIHRpbWluZyBmb3IgcHJvZmlsaW5nXG4gICAgICAgICAgICBpZiAoY29uZmlnLnVpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdG90YWxUaW1lID0gRGF0ZS5ub3coKSAtIHJlcXVlc3RUaW1lO1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoKHVwZGF0ZVJlc291cmNlVXNhZ2Uoe1xuICAgICAgICAgICAgICAgICAgICBpZDogcGF5bG9hZC5vdXRwdXQsXG4gICAgICAgICAgICAgICAgICAgIHVzYWdlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfX2Rhc2hfc2VydmVyOiB0b3RhbFRpbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBfX2Rhc2hfY2xpZW50OiB0b3RhbFRpbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBfX2Rhc2hfdXBsb2FkOiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgX19kYXNoX2Rvd25sb2FkOiAwXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1czogU1RBVFVTLlBSRVZFTlRfVVBEQVRFLFxuICAgICAgICAgICAgICAgICAgICByZXN1bHQ6IHt9LFxuICAgICAgICAgICAgICAgICAgICBpbnB1dHM6IHBheWxvYWQuaW5wdXRzLFxuICAgICAgICAgICAgICAgICAgICBzdGF0ZTogcGF5bG9hZC5zdGF0ZVxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSAnZXJyb3InKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocmVzcG9uc2UubWVzc2FnZSB8fCAnQ2FsbGJhY2sgZXJyb3InKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzcG9uc2Uuc3RyZWFtKSB7XG4gICAgICAgICAgICAvLyBUZXJtaW5hbCBmcmFtZSBvZiBhIHN0cmVhbWVkIGNhbGxiYWNrOiBldmVyeSBmcmFtZSB3YXMgYWxyZWFkeVxuICAgICAgICAgICAgLy8gYXBwbGllZCBvbiBhcnJpdmFsLCBzbyByZXNvbHZlIGVtcHR5ICh0aGUgdGVybWluYWwgc3RvcmUgdXBkYXRlXG4gICAgICAgICAgICAvLyBtdXN0IGJlIGEgbm8tb3Ag4oCUIFBhdGNoIGZyYW1lcyBtdXN0IG5vdCByZS1hcHBseSkuXG4gICAgICAgICAgICBpZiAoaG9va3MucmVxdWVzdF9wb3N0KSB7XG4gICAgICAgICAgICAgICAgaG9va3MucmVxdWVzdF9wb3N0KHBheWxvYWQsIGxhc3RTdHJlYW1SZXNwb25zZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29uZmlnLnVpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdG90YWxUaW1lID0gRGF0ZS5ub3coKSAtIHJlcXVlc3RUaW1lO1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoKHVwZGF0ZVJlc291cmNlVXNhZ2Uoe1xuICAgICAgICAgICAgICAgICAgICBpZDogcGF5bG9hZC5vdXRwdXQsXG4gICAgICAgICAgICAgICAgICAgIHVzYWdlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfX2Rhc2hfc2VydmVyOiB0b3RhbFRpbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBfX2Rhc2hfY2xpZW50OiB0b3RhbFRpbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBfX2Rhc2hfdXBsb2FkOiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgX19kYXNoX2Rvd25sb2FkOiAwXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1czogU1RBVFVTLk9LLFxuICAgICAgICAgICAgICAgICAgICByZXN1bHQ6IGxhc3RTdHJlYW1SZXNwb25zZSB8fCB7fSxcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRzOiBwYXlsb2FkLmlucHV0cyxcbiAgICAgICAgICAgICAgICAgICAgc3RhdGU6IHBheWxvYWQuc3RhdGVcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICAgICAgLy8gRXh0cmFjdCB0aGUgY2FsbGJhY2sgZGF0YSAtIHN0cnVjdHVyZSBpcyB7bXVsdGk6IGJvb2xlYW4sIHJlc3BvbnNlOiB7Li4ufX1cbiAgICAgICAgY29uc3QgY2FsbGJhY2tEYXRhID0gcmVzcG9uc2UuZGF0YTtcbiAgICAgICAgLy8gSGFuZGxlIHNpZGVVcGRhdGUgaWYgcHJlc2VudFxuICAgICAgICBpZiAoY2FsbGJhY2tEYXRhPy5zaWRlVXBkYXRlKSB7XG4gICAgICAgICAgICBkaXNwYXRjaChzaWRlVXBkYXRlKGNhbGxiYWNrRGF0YS5zaWRlVXBkYXRlLCBwYXlsb2FkKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRXh0cmFjdCB0aGUgYWN0dWFsIG91dHB1dHMgZnJvbSB0aGUgcmVzcG9uc2VcbiAgICAgICAgLy8gRm9ybWF0IGlzIHNpbWlsYXIgdG8gSFRUUCBwYXRoJ3MgZmluaXNoTGluZSBmdW5jdGlvblxuICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICBjb25zdCB7IG11bHRpLCByZXNwb25zZTogY2FsbGJhY2tSZXNwb25zZSB9ID0gY2FsbGJhY2tEYXRhIHx8IHt9O1xuICAgICAgICBpZiAoaG9va3MucmVxdWVzdF9wb3N0KSB7XG4gICAgICAgICAgICBob29rcy5yZXF1ZXN0X3Bvc3QocGF5bG9hZCwgY2FsbGJhY2tSZXNwb25zZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG11bHRpKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBjYWxsYmFja1Jlc3BvbnNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gU2luZ2xlIG91dHB1dCAtIGNvbnZlcnQgdG8gdGhlIGV4cGVjdGVkIGZvcm1hdFxuICAgICAgICAgICAgY29uc3QgeyBvdXRwdXQgfSA9IHBheWxvYWQ7XG4gICAgICAgICAgICBjb25zdCBpZCA9IG91dHB1dC5zdWJzdHIoMCwgb3V0cHV0Lmxhc3RJbmRleE9mKCcuJykpO1xuICAgICAgICAgICAgcmVzdWx0ID0geyBbaWRdOiBjYWxsYmFja1Jlc3BvbnNlPy5wcm9wcyB9O1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlY29yZCB0aW1pbmcgZm9yIHByb2ZpbGluZ1xuICAgICAgICBpZiAoY29uZmlnLnVpKSB7XG4gICAgICAgICAgICBjb25zdCB0b3RhbFRpbWUgPSBEYXRlLm5vdygpIC0gcmVxdWVzdFRpbWU7XG4gICAgICAgICAgICBkaXNwYXRjaCh1cGRhdGVSZXNvdXJjZVVzYWdlKHtcbiAgICAgICAgICAgICAgICBpZDogcGF5bG9hZC5vdXRwdXQsXG4gICAgICAgICAgICAgICAgdXNhZ2U6IHtcbiAgICAgICAgICAgICAgICAgICAgX19kYXNoX3NlcnZlcjogdG90YWxUaW1lLFxuICAgICAgICAgICAgICAgICAgICBfX2Rhc2hfY2xpZW50OiB0b3RhbFRpbWUsXG4gICAgICAgICAgICAgICAgICAgIF9fZGFzaF91cGxvYWQ6IDAsXG4gICAgICAgICAgICAgICAgICAgIF9fZGFzaF9kb3dubG9hZDogMFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBTVEFUVVMuT0ssXG4gICAgICAgICAgICAgICAgcmVzdWx0OiByZXN1bHQgfHwge30sXG4gICAgICAgICAgICAgICAgaW5wdXRzOiBwYXlsb2FkLmlucHV0cyxcbiAgICAgICAgICAgICAgICBzdGF0ZTogcGF5bG9hZC5zdGF0ZVxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQgfHwge307XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBIYW5kbGUgcnVubmluZyBvZmYgc3RhdGUgb24gZXJyb3JcbiAgICAgICAgaWYgKHJ1bm5pbmdPZmYpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoKHNpZGVVcGRhdGUocnVubmluZ09mZiwgcGF5bG9hZCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWcudWkpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoKHVwZGF0ZVJlc291cmNlVXNhZ2Uoe1xuICAgICAgICAgICAgICAgIGlkOiBwYXlsb2FkLm91dHB1dCxcbiAgICAgICAgICAgICAgICBzdGF0dXM6IFNUQVRVUy5OT19SRVNQT05TRSxcbiAgICAgICAgICAgICAgICByZXN1bHQ6IHt9LFxuICAgICAgICAgICAgICAgIGlucHV0czogcGF5bG9hZC5pbnB1dHMsXG4gICAgICAgICAgICAgICAgc3RhdGU6IHBheWxvYWQuc3RhdGVcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG59XG5mdW5jdGlvbiBpbnB1dHNUb0RpY3QoaW5wdXRzX2xpc3QpIHtcbiAgICAvLyBQb3J0ZWQgZGlyZWN0bHkgZnJvbSBfdXRpbHMucHksIGlucHV0c190b19kaWN0XG4gICAgLy8gdGFrZXMgYW4gYXJyYXkgb2YgaW5wdXRzIChzb21lIGlucHV0cyBtYXkgYmUgYW4gYXJyYXkpXG4gICAgLy8gcmV0dXJucyBhbiBPYmplY3QgKG1hcCk6XG4gICAgLy8gIGtleXMgb2YgdGhlIGZvcm0gYGlkLnByb3BlcnR5YCBvciBge1wiaWRcIjogMH0ucHJvcGVydHlgXG4gICAgLy8gIHZhbHVlcyBjb250YWluIHRoZSBwcm9wZXJ0eSB2YWx1ZVxuICAgIGlmICghaW5wdXRzX2xpc3QpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICBjb25zdCBpbnB1dHMgPSB7fTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0c19saXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGlucHV0c19saXN0W2ldKSkge1xuICAgICAgICAgICAgY29uc3QgaW5wdXRzaSA9IGlucHV0c19saXN0W2ldO1xuICAgICAgICAgICAgZm9yIChsZXQgaWkgPSAwOyBpaSA8IGlucHV0c2kubGVuZ3RoOyBpaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaWRfc3RyID0gYCR7c3RyaW5naWZ5SWQoaW5wdXRzaVtpaV0uaWQpfS4ke2lucHV0c2lbaWldLnByb3BlcnR5fWA7XG4gICAgICAgICAgICAgICAgaW5wdXRzW2lkX3N0cl0gPSBpbnB1dHNpW2lpXS52YWx1ZSA/PyBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgaWRfc3RyID0gYCR7c3RyaW5naWZ5SWQoaW5wdXRzX2xpc3RbaV0uaWQpfS4ke2lucHV0c19saXN0W2ldLnByb3BlcnR5fWA7XG4gICAgICAgICAgICBpbnB1dHNbaWRfc3RyXSA9IGlucHV0c19saXN0W2ldLnZhbHVlID8/IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGlucHV0cztcbn1cbmZ1bmN0aW9uIGdldFRyaWdnZXJlZElkKHRyaWdnZXJlZCkge1xuICAgIC8vIGZvciByZWd1bGFyIGNhbGxiYWNrcywgIHRha2VzIHRoZSBmaXJzdCB0cmlnZ2VyZWQgcHJvcF9pZCwgZS5nLiAgXCJidG4ubl9jbGlja3NcIiBhbmQgcmV0dXJucyBcImJ0blwiXG4gICAgLy8gZm9yIHBhdHRlcm4gbWF0Y2hpbmcgY2FsbGJhY2ssIGUuZy4gJ3tcImluZGV4XCI6MCwgXCJ0eXBlXCI6XCJidG5cIn0nIGFuZCByZXR1cm5zIHtpbmRleDowLCB0eXBlOiBcImJ0blwifSdcbiAgICBpZiAodHJpZ2dlcmVkICYmIHRyaWdnZXJlZC5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgdHJpZyA9IHRyaWdnZXJlZFswXTtcbiAgICAgICAgbGV0IGNvbXBvbmVudElkO1xuICAgICAgICBpZiAodHJpZy5zdGFydHNXaXRoKCd7JykpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudElkID0gSlNPTi5wYXJzZSh0cmlnLnN1YnN0cmluZygwLCB0cmlnLmxhc3RJbmRleE9mKCd9JykgKyAxKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb21wb25lbnRJZCA9IHRyaWcuc3BsaXQoJy4nKVswXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9uZW50SWQ7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGV4ZWN1dGVDYWxsYmFjayhjYiwgY29uZmlnLCBob29rcywgcGF0aHMsIGxheW91dCwgeyBhbGxPdXRwdXRzIH0sIGRpc3BhdGNoLCBnZXRTdGF0ZSkge1xuICAgIGNvbnN0IHsgb3V0cHV0LCBpbnB1dHMsIHN0YXRlLCBjbGllbnRzaWRlX2Z1bmN0aW9uLCBiYWNrZ3JvdW5kLCBkeW5hbWljX2NyZWF0b3IgfSA9IGNiLmNhbGxiYWNrO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGluVmFscyA9IGZpbGxWYWxzKHBhdGhzLCBsYXlvdXQsIGNiLCBpbnB1dHMsICdJbnB1dCcsIHRydWUpO1xuICAgICAgICAvKiBQcmV2ZW50IGNhbGxiYWNrIGlmIHRoZXJlJ3Mgbm8gaW5wdXRzICovXG4gICAgICAgIGlmIChpblZhbHMgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4uY2IsXG4gICAgICAgICAgICAgICAgZXhlY3V0aW9uUHJvbWlzZTogbnVsbFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvdXRwdXRzID0gW107XG4gICAgICAgIGNvbnN0IG91dHB1dEVycm9ycyA9IFtdO1xuICAgICAgICBhbGxPdXRwdXRzLmZvckVhY2goKG91dCwgaSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgW291dGksIGVycmldID0gdW53cmFwSWZOb3RNdWx0aShwYXRocywgbWFwKHBpY2soWydpZCcsICdwcm9wZXJ0eSddKSwgb3V0KSwgY2IuY2FsbGJhY2sub3V0cHV0c1tpXSwgY2IuYW55VmFscywgJ091dHB1dCcpO1xuICAgICAgICAgICAgb3V0cHV0cy5wdXNoKG91dGkpO1xuICAgICAgICAgICAgaWYgKGVycmkpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRFcnJvcnMucHVzaChlcnJpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChvdXRwdXRFcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoZmxhdHRlbihpblZhbHMpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJlZkVycihvdXRwdXRFcnJvcnMsIHBhdGhzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRoaXMgY2FzZSBpcyBhbGwtZW1wdHkgbXVsdGl2YWx1ZWQgd2lsZGNhcmQgaW5wdXRzLFxuICAgICAgICAgICAgLy8gd2hpY2ggd2Ugd291bGQgbm9ybWFsbHkgZmlyZSB0aGUgY2FsbGJhY2sgZm9yLCBleGNlcHRcbiAgICAgICAgICAgIC8vIHNvbWUgb3V0cHV0cyBhcmUgbWlzc2luZy4gU28gaW5zdGVhZCB3ZSB0cmVhdCBpdCBsaWtlXG4gICAgICAgICAgICAvLyByZWd1bGFyIG1pc3NpbmcgaW5wdXRzIGFuZCBqdXN0IHNpbGVudGx5IHByZXZlbnQgaXQuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLmNiLFxuICAgICAgICAgICAgICAgIGV4ZWN1dGlvblByb21pc2U6IG51bGxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgX19leGVjdXRlID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbG9hZGluZ091dHB1dHMgPSBmbGF0dGVuKG91dHB1dHMpLm1hcChvdXQgPT4gKHtcbiAgICAgICAgICAgICAgICBwYXRoOiBnZXRQYXRoKHBhdGhzLCBvdXQuaWQpLFxuICAgICAgICAgICAgICAgIHByb3BlcnR5OiBvdXQucHJvcGVydHk/LnNwbGl0KCdAJylbMF0sXG4gICAgICAgICAgICAgICAgaWQ6IHN0cmluZ2lmeUlkKG91dC5pZClcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIGRpc3BhdGNoKGxvYWRpbmcobG9hZGluZ091dHB1dHMpKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hhbmdlZFByb3BJZHMgPSBrZXlzKGNiLmNoYW5nZWRQcm9wSWRzKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWRDaGFuZ2VkUHJvcHNJZHMgPSBjaGFuZ2VkUHJvcElkcy5tYXAocHJvcElkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BJZC5zdGFydHNXaXRoKCd7JykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZVBNQ0lkKHByb3BJZClbMF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3BJZDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXQsXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dHM6IGlzTXVsdGlPdXRwdXRQcm9wKG91dHB1dCkgPyBvdXRwdXRzIDogb3V0cHV0c1swXSxcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRzOiBpblZhbHMsXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZWRQcm9wSWRzLFxuICAgICAgICAgICAgICAgICAgICBwYXJzZWRDaGFuZ2VkUHJvcHNJZHMsXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlOiBjYi5jYWxsYmFjay5zdGF0ZS5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgID8gZmlsbFZhbHMocGF0aHMsIGxheW91dCwgY2IsIHN0YXRlLCAnU3RhdGUnKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmIChjbGllbnRzaWRlX2Z1bmN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgaGFuZGxlQ2xpZW50c2lkZShkaXNwYXRjaCwgY2xpZW50c2lkZV9mdW5jdGlvbiwgY29uZmlnLCBwYXlsb2FkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIExheW91dCBtYXkgaGF2ZSBjaGFuZ2VkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgUnVuIGV2ZXJ5IG91dHB1dCB0aHJvdWdoIHBhcnNlUGF0Y2hQcm9wcyBhZ2FpbnN0IHRoZSBjdXJyZW50IGxheW91dFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBkYXRhOiBwYXRjaGVkRGF0YSwgcGF0Y2hlZE91dHB1dHMgfSA9IGFwcGx5UGF0Y2hlZE91dHB1dHMob3V0cHV0cywgcGF0aHMsIGdldFN0YXRlKCkubGF5b3V0LCBkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogcGF0Y2hlZERhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5wYXRjaGVkUmVzdWx0RmllbGRzKHBhdGNoZWRPdXRwdXRzKVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGVycm9yLCBwYXlsb2FkIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IG5ld0NvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgICAgICAgICBsZXQgbmV3SGVhZGVycyA9IG51bGw7XG4gICAgICAgICAgICAgICAgbGV0IGxhc3RFcnJvcjtcbiAgICAgICAgICAgICAgICBjb25zdCBhZGRpdGlvbmFsQXJncyA9IFtdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGpzb25PdXRwdXQgPSBKU09OLnN0cmluZ2lmeShwYXlsb2FkLm91dHB1dHMpO1xuICAgICAgICAgICAgICAgIHZhbHVlcyhnZXRTdGF0ZSgpLmNhbGxiYWNrSm9icykuZm9yRWFjaCgoam9iKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChqc29uT3V0cHV0ID09PSBqb2Iub3V0cHV0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUZXJtaW5hdGUgdGhlIG9sZCBqb2JzIHRoYXQgYXJlIG5vdCBjb21wbGV0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBhcyBvdXRkYXRlZCBmb3IgdGhlIGNhbGxiYWNrIHByb21pc2UgdG9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc29sdmUgYW5kIHJlbW92ZSBhZnRlci5cbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxBcmdzLnB1c2goWydvbGRKb2InLCBqb2Iuam9iSWQsIHRydWVdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKHNldENhbGxiYWNrSm9iT3V0ZGF0ZWQoeyBqb2JJZDogam9iLmpvYklkIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWpvYi5jYW5jZWxJbnB1dHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnRlciA9IGludGVyc2VjdGlvbihqb2IuY2FuY2VsSW5wdXRzLCBjYi5jYWxsYmFjay5pbnB1dHMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsQXJncy5wdXNoKFsnY2FuY2VsSm9iJywgam9iLmpvYklkXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoam9iLnByb2dyZXNzRGVmYXVsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKHNpZGVVcGRhdGUoam9iLnByb2dyZXNzRGVmYXVsdCwgcGF5bG9hZCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gVXNlIFdlYlNvY2tldCBmb3IgY2FsbGJhY2tzIHdoZW46XG4gICAgICAgICAgICAgICAgLy8gMS4gR2xvYmFsIFdlYlNvY2tldCBpcyBlbmFibGVkLCBPUlxuICAgICAgICAgICAgICAgIC8vIDIuIFBlci1jYWxsYmFjayB3ZWJzb2NrZXQgZmxhZyBpcyBzZXQgKGFuZCBXZWJTb2NrZXQgaXMgYXZhaWxhYmxlKVxuICAgICAgICAgICAgICAgIC8vIChidXQgbmV2ZXIgZm9yIGJhY2tncm91bmQgY2FsbGJhY2tzKVxuICAgICAgICAgICAgICAgIGNvbnN0IHVzZVdlYlNvY2tldCA9ICFiYWNrZ3JvdW5kICYmXG4gICAgICAgICAgICAgICAgICAgIChpc1dlYlNvY2tldEVuYWJsZWQoY29uZmlnKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKGNiLmNhbGxiYWNrLndlYnNvY2tldCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzV2ViU29ja2V0QXZhaWxhYmxlKGNvbmZpZykpKTtcbiAgICAgICAgICAgICAgICAvLyBTdHJlYW1pbmcgY2FsbGJhY2tzIHJpZGUgdGhlIHNpbmdsZSBtdWx0aXBsZXhlZCBkb3dubGluayB3aGVuXG4gICAgICAgICAgICAgICAgLy8gdGhlIHNlcnZlciBvZmZlcnMgaXQgKHNoYXJlZCBzdG9yYWdlIGVuYWJsZWQpIGFuZCB0aGV5IGFyZSBub3RcbiAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IG9uIHRoZSBXZWJTb2NrZXQgdHJhbnNwb3J0IG9yIGEgYmFja2dyb3VuZCBqb2IuXG4gICAgICAgICAgICAgICAgY29uc3QgdXNlU3RyZWFtID0gIWJhY2tncm91bmQgJiZcbiAgICAgICAgICAgICAgICAgICAgIXVzZVdlYlNvY2tldCAmJlxuICAgICAgICAgICAgICAgICAgICBjYi5jYWxsYmFjay5zdHJlYW0gJiZcbiAgICAgICAgICAgICAgICAgICAgaXNTdHJlYW1NdWx0aXBsZXhlZChjb25maWcpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHJldHJ5ID0gMDsgcmV0cnkgPD0gTUFYX0FVVEhfUkVUUklFUzsgcmV0cnkrKykge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlV2ViU29ja2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlIFdlYlNvY2tldCBwYXRoIGZvciByZWFsLXRpbWUgY2FsbGJhY2tzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGF3YWl0IGhhbmRsZVdlYnNvY2tldENhbGxiYWNrKGRpc3BhdGNoLCBob29rcywgbmV3Q29uZmlnLCBwYXlsb2FkLCBjYi5jYWxsYmFjay5ydW5uaW5nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHVzZVN0cmVhbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBhd2FpdCBoYW5kbGVTdHJlYW1DYWxsYmFjayhkaXNwYXRjaCwgbmV3Q29uZmlnLCBwYXlsb2FkLCBjYi5jYWxsYmFjay5ydW5uaW5nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKHN0cmVhbUVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtRXJyPy5tZXNzYWdlPy5pbmNsdWRlcygnNDAzJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBhd2FpdCBoYW5kbGVTZXJ2ZXJzaWRlKGRpc3BhdGNoLCBob29rcywgbmV3Q29uZmlnLCBwYXlsb2FkLCBiYWNrZ3JvdW5kLCBhZGRpdGlvbmFsQXJncy5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGFkZGl0aW9uYWxBcmdzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsIGdldFN0YXRlLCBjYi5jYWxsYmFjay5ydW5uaW5nLCBjYi5jYWxsYmFjay5jb21wcmVzc19wYXlsb2FkLCBjYi5jYWxsYmFjay5jb21wcmVzc190aHJlc2hvbGQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3RyZWFtRXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlIHRyYWRpdGlvbmFsIEhUVFAgcGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBhd2FpdCBoYW5kbGVTZXJ2ZXJzaWRlKGRpc3BhdGNoLCBob29rcywgbmV3Q29uZmlnLCBwYXlsb2FkLCBiYWNrZ3JvdW5kLCBhZGRpdGlvbmFsQXJncy5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBhZGRpdGlvbmFsQXJnc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCwgZ2V0U3RhdGUsIGNiLmNhbGxiYWNrLnJ1bm5pbmcsIGNiLmNhbGxiYWNrLmNvbXByZXNzX3BheWxvYWQsIGNiLmNhbGxiYWNrLmNvbXByZXNzX3RocmVzaG9sZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3SGVhZGVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKGFkZEh0dHBIZWFkZXJzKG5ld0hlYWRlcnMpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIExheW91dCBtYXkgaGF2ZSBjaGFuZ2VkLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUnVuIHBhcnNlUGF0Y2hQcm9wcyBhZ2FpbnN0IHRoZSBjdXJyZW50IGxheW91dFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBkYXRhOiBwYXRjaGVkRGF0YSwgcGF0Y2hlZE91dHB1dHMgfSA9IGFwcGx5UGF0Y2hlZE91dHB1dHMob3V0cHV0cywgcGF0aHMsIGdldFN0YXRlKCkubGF5b3V0LCBkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkeW5hbWljX2NyZWF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IGRpc3BhdGNoKHJlcXVlc3REZXBlbmRlbmNpZXMoKSksIDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBwYXRjaGVkRGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnBhdGNoZWRSZXN1bHRGaWVsZHMocGF0Y2hlZE91dHB1dHMpXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RFcnJvciA9IHJlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXRyeSA8PSBNQVhfQVVUSF9SRVRSSUVTICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlcy5zdGF0dXMgPT09IFNUQVRVUy5VTkFVVEhPUklaRUQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLnN0YXR1cyA9PT0gU1RBVFVTLkJBRF9SRVFVRVNUKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCByZXMudGV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChib2R5LmluY2x1ZGVzKEpXVF9FWFBJUkVEX01FU1NBR0UpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChob29rcy5yZXF1ZXN0X3JlZnJlc2hfand0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgb2xkSnd0ID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcuZmV0Y2guaGVhZGVycy5BdXRob3JpemF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkSnd0ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmZldGNoLmhlYWRlcnMuQXV0aG9yaXphdGlvbi5zdWJzdHIoJ0JlYXJlciAnLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdKd3QgPSBhd2FpdCBob29rcy5yZXF1ZXN0X3JlZnJlc2hfand0KG9sZEp3dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Snd0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SGVhZGVycyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke25ld0p3dH1gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb25maWcgPSBtZXJnZURlZXBSaWdodChjb25maWcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2g6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IG5ld0hlYWRlcnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gd2UgcmVhY2ggaGVyZSB3aGVuIHdlIHJ1biBvdXQgb2YgcmV0cmllcy5cbiAgICAgICAgICAgICAgICByZXR1cm4geyBlcnJvcjogbGFzdEVycm9yLCBwYXlsb2FkOiBudWxsIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBlcnJvciwgcGF5bG9hZDogbnVsbCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2gobG9hZGVkKGxvYWRpbmdPdXRwdXRzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG5ld0NiID0ge1xuICAgICAgICAgICAgLi4uY2IsXG4gICAgICAgICAgICBleGVjdXRpb25Qcm9taXNlOiBfX2V4ZWN1dGUoKVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gbmV3Q2I7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uY2IsXG4gICAgICAgICAgICBleGVjdXRpb25Qcm9taXNlOiB7IGVycm9yLCBwYXlsb2FkOiBudWxsIH1cbiAgICAgICAgfTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBhbGwsIGFzc29jLCBjb25jYXQsIGRpZmZlcmVuY2UsIGZpbHRlciwgZmxhdHRlbiwgaXNFbXB0eSwga2V5cywgbWFwLCBtZXJnZVdpdGgsIHBhcnRpdGlvbiwgcGF0aCwgcGlja0J5LCBwcm9wcywgcmVkdWNlLCB6aXBPYmogfSBmcm9tICdyYW1kYSc7XG5pbXBvcnQgeyBhZGRBbGxSZXNvbHZlZEZyb21PdXRwdXRzLCBnZXRBbnlWYWxzLCBnZXRVbmZpbHRlcmVkTGF5b3V0Q2FsbGJhY2tzLCBpZE1hdGNoLCBpc011bHRpVmFsdWVkLCBwYXJ0aWFsSWRNYXRjaCwgc3BsaXRJZEFuZFByb3AsIHN0cmluZ2lmeUlkIH0gZnJvbSAnLi9kZXBlbmRlbmNpZXMnO1xuaW1wb3J0IHsgZ2V0UGF0aCB9IGZyb20gJy4vcGF0aHMnO1xuZXhwb3J0IGNvbnN0IERJUkVDVCA9IDI7XG5leHBvcnQgY29uc3QgSU5ESVJFQ1QgPSAxO1xuZXhwb3J0IGNvbnN0IG1lcmdlTWF4ID0gbWVyZ2VXaXRoKE1hdGgubWF4KTtcbmV4cG9ydCBjb25zdCBjb21iaW5lSWRBbmRQcm9wID0gKHsgaWQsIHByb3BlcnR5IH0pID0+IGAke3N0cmluZ2lmeUlkKGlkKX0uJHtwcm9wZXJ0eX1gO1xuZXhwb3J0IGZ1bmN0aW9uIGdldENhbGxiYWNrc0J5SW5wdXQoZ3JhcGhzLCBwYXRocywgaWQsIHByb3AsIGNoYW5nZVR5cGUsIHdpdGhQcmlvcml0eSA9IHRydWUpIHtcbiAgICBjb25zdCBtYXRjaGVzID0gW107XG4gICAgY29uc3QgaWRBbmRQcm9wID0gY29tYmluZUlkQW5kUHJvcCh7IGlkLCBwcm9wZXJ0eTogcHJvcCB9KTtcbiAgICBpZiAodHlwZW9mIGlkID09PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBzdGFuZGFyZCBpZCB2ZXJzaW9uXG4gICAgICAgIGNvbnN0IGNhbGxiYWNrcyA9IChncmFwaHMuaW5wdXRNYXBbaWRdIHx8IHt9KVtwcm9wXTtcbiAgICAgICAgaWYgKCFjYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICBjYWxsYmFja3MuZm9yRWFjaChhZGRBbGxSZXNvbHZlZEZyb21PdXRwdXRzKHJlc29sdmVEZXBzKCksIHBhdGhzLCBtYXRjaGVzKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyB3aWxkY2FyZCB2ZXJzaW9uXG4gICAgICAgIGNvbnN0IGlkS2V5cyA9IE9iamVjdC5rZXlzKGlkKS5zb3J0KCk7XG4gICAgICAgIGNvbnN0IHZhbHMgPSBwcm9wcyhpZEtleXMsIGlkKTtcbiAgICAgICAgY29uc3QgaWRLZXlTdHIgPSBpZEtleXMuam9pbignLCcpO1xuICAgICAgICBjb25zdCBwYXR0ZXJucyA9IChncmFwaHMuaW5wdXRQYXR0ZXJuc1tpZEtleVN0cl0gfHwge30pW3Byb3BdO1xuICAgICAgICBpZiAocGF0dGVybnMpIHtcbiAgICAgICAgICAgIHBhdHRlcm5zLmZvckVhY2goKHBhdHRlcm4pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocGF0dGVybi5wYXJ0aWFsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFBhcnRpYWwgcGF0dGVybnMgc3RvcmVkIHVuZGVyIHNhbWUgaWRLZXlTdHIgd29uJ3QgaGFwcGVuXG4gICAgICAgICAgICAgICAgICAgIC8vIG5vcm1hbGx5LCBidXQgaGFuZGxlIGl0IGZvciBjb21wbGV0ZW5lc3NcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnRpYWxJZE1hdGNoKHBhdHRlcm4ua2V5cywgcGF0dGVybi52YWx1ZXMsIGlkS2V5cywgdmFscykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRyaWdnZXJBbnlWYWxzID0gZ2V0QW55VmFscyhwYXR0ZXJuLnZhbHVlcywgdmFscyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBFeHRyYWN0IHZhbHMgZm9yIHBhdHRlcm4ga2V5cyBmcm9tIHRoZSBjb21wb25lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhdHRlcm5SZWZWYWxzID0gcGF0dGVybi5rZXlzLm1hcCgoaykgPT4gdmFsc1tpZEtleXMuaW5kZXhPZihrKV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybi5jYWxsYmFja3MuZm9yRWFjaChhZGRBbGxSZXNvbHZlZEZyb21PdXRwdXRzKHJlc29sdmVQYXJ0aWFsRGVwcyhwYXR0ZXJuLmtleXMsIHBhdHRlcm5SZWZWYWxzLCBwYXR0ZXJuLnZhbHVlcywgaWRLZXlzKSwgcGF0aHMsIG1hdGNoZXMsIHRyaWdnZXJBbnlWYWxzKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoaWRNYXRjaChpZEtleXMsIHZhbHMsIHBhdHRlcm4udmFsdWVzKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0cmlnZ2VyQW55VmFscyA9IGdldEFueVZhbHMocGF0dGVybi52YWx1ZXMsIHZhbHMpO1xuICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuLmNhbGxiYWNrcy5mb3JFYWNoKGFkZEFsbFJlc29sdmVkRnJvbU91dHB1dHMocmVzb2x2ZURlcHMoaWRLZXlzLCB2YWxzLCBwYXR0ZXJuLnZhbHVlcyksIHBhdGhzLCBtYXRjaGVzLCB0cmlnZ2VyQW55VmFscykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFsc28gY2hlY2sgcGFydGlhbCBwYXR0ZXJucyB3aG9zZSBrZXlzIGFyZSBhIHN1YnNldCBvZiB0aGlzXG4gICAgICAgIC8vIGNvbXBvbmVudCdzIGtleXNcbiAgICAgICAgaWYgKGdyYXBocy5oYXNQYXJ0aWFsSW5wdXRQYXR0ZXJucykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBwYXRLZXlTdHIgaW4gZ3JhcGhzLnBhcnRpYWxJbnB1dFBhdHRlcm5zKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhdEtleVN0ciA9PT0gaWRLZXlTdHIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIGFscmVhZHkgaGFuZGxlZCBhYm92ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBwYXRLZXlzID0gcGF0S2V5U3RyLnNwbGl0KCcsJyk7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgcGF0dGVybiBrZXlzIGFyZSBhIHN1YnNldCBvZiBjb21wb25lbnQga2V5c1xuICAgICAgICAgICAgICAgIGlmICghcGF0S2V5cy5ldmVyeSgoaykgPT4gaWRLZXlzLmluZGV4T2YoaykgIT09IC0xKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcGF0UHJvcFBhdHRlcm5zID0gZ3JhcGhzLnBhcnRpYWxJbnB1dFBhdHRlcm5zW3BhdEtleVN0cl1bcHJvcF07XG4gICAgICAgICAgICAgICAgaWYgKCFwYXRQcm9wUGF0dGVybnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHBhdFByb3BQYXR0ZXJucy5mb3JFYWNoKChwYXR0ZXJuKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0aWFsSWRNYXRjaChwYXR0ZXJuLmtleXMsIHBhdHRlcm4udmFsdWVzLCBpZEtleXMsIHZhbHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0cmlnZ2VyQW55VmFscyA9IGdldEFueVZhbHMocGF0dGVybi52YWx1ZXMsIHZhbHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXh0cmFjdCB2YWxzIGZvciBwYXR0ZXJuIGtleXMgZnJvbSB0aGUgY29tcG9uZW50XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXR0ZXJuUmVmVmFscyA9IHBhdHRlcm4ua2V5cy5tYXAoKGspID0+IHZhbHNbaWRLZXlzLmluZGV4T2YoayldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4uY2FsbGJhY2tzLmZvckVhY2goYWRkQWxsUmVzb2x2ZWRGcm9tT3V0cHV0cyhyZXNvbHZlUGFydGlhbERlcHMocGF0dGVybi5rZXlzLCBwYXR0ZXJuUmVmVmFscywgcGF0dGVybi52YWx1ZXMsIGlkS2V5cyksIHBhdGhzLCBtYXRjaGVzLCB0cmlnZ2VyQW55VmFscykpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gLy8gZW5kIGhhc1BhcnRpYWxJbnB1dFBhdHRlcm5zIGd1YXJkXG4gICAgfVxuICAgIG1hdGNoZXMuZm9yRWFjaChtYXRjaCA9PiB7XG4gICAgICAgIG1hdGNoLmNoYW5nZWRQcm9wSWRzW2lkQW5kUHJvcF0gPSBjaGFuZ2VUeXBlIHx8IERJUkVDVDtcbiAgICAgICAgaWYgKHdpdGhQcmlvcml0eSkge1xuICAgICAgICAgICAgbWF0Y2gucHJpb3JpdHkgPSBnZXRQcmlvcml0eShncmFwaHMsIHBhdGhzLCBtYXRjaCk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gbWF0Y2hlcztcbn1cbi8qXG4gKiBCdWlsZHMgYSB0cmVlIG9mIGFsbCBjYWxsYmFja3MgdGhhdCBjYW4gYmUgdHJpZ2dlcmVkIGJ5IHRoZSBwcm92aWRlZCBjYWxsYmFjay5cbiAqIFVzZXMgdGhlIG51bWJlciBvZiBjYWxsYmFja3MgYXQgZWFjaCB0cmVlIGRlcHRoIGFuZCB0aGUgdG90YWwgZGVwdGggb2YgdGhlIHRyZWVcbiAqIHRvIGNyZWF0ZSBhIHNvcnRhYmxlIHByaW9yaXR5IGhhc2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcmlvcml0eShncmFwaHMsIHBhdGhzLCBjYWxsYmFjaykge1xuICAgIGxldCBjYWxsYmFja3MgPSBbY2FsbGJhY2tdO1xuICAgIGNvbnN0IHRvdWNoZWRPdXRwdXRzID0ge307XG4gICAgY29uc3QgdG91Y2hlZENiSWRzID0ge307XG4gICAgY29uc3QgcHJpb3JpdHkgPSBbXTtcbiAgICB3aGlsZSAoY2FsbGJhY2tzLmxlbmd0aCkge1xuICAgICAgICBjYWxsYmFja3MgPSBmaWx0ZXIoYyA9PiB7XG4gICAgICAgICAgICBjb25zdCB0b3VjaGVkID0gdG91Y2hlZENiSWRzW2MucmVzb2x2ZWRJZF07XG4gICAgICAgICAgICB0b3VjaGVkQ2JJZHNbYy5yZXNvbHZlZElkXSA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gdG91Y2hlZDtcbiAgICAgICAgfSwgY2FsbGJhY2tzKTtcbiAgICAgICAgY29uc3Qgb3V0cHV0cyA9IGZpbHRlcihvID0+ICF0b3VjaGVkT3V0cHV0c1tjb21iaW5lSWRBbmRQcm9wKG8pXSwgZmxhdHRlbihtYXAoY2IgPT4gZmxhdHRlbihjYi5nZXRPdXRwdXRzKHBhdGhzKSksIGNhbGxiYWNrcykpKTtcbiAgICAgICAgb3V0cHV0cy5mb3JFYWNoKG8gPT4gKHRvdWNoZWRPdXRwdXRzW2NvbWJpbmVJZEFuZFByb3AobyldID0gdHJ1ZSkpO1xuICAgICAgICBjYWxsYmFja3MgPSBmbGF0dGVuKG1hcCgoeyBpZCwgcHJvcGVydHkgfSkgPT4gZ2V0Q2FsbGJhY2tzQnlJbnB1dChncmFwaHMsIHBhdGhzLCBpZCwgcHJvcGVydHksIElORElSRUNULCBmYWxzZSksIG91dHB1dHMpKTtcbiAgICAgICAgaWYgKGNhbGxiYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHByaW9yaXR5LnB1c2goY2FsbGJhY2tzLmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJpb3JpdHkudW5zaGlmdChwcmlvcml0eS5sZW5ndGgpO1xuICAgIHJldHVybiBtYXAoaSA9PiBNYXRoLm1pbihpLCAzNSkudG9TdHJpbmcoMzYpLCBwcmlvcml0eSkuam9pbignJyk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0QWxsU3Vic2VxdWVudE91dHB1dHNGb3JDYWxsYmFjayhncmFwaHMsIHBhdGhzLCBjYWxsYmFjaykge1xuICAgIGxldCBjYWxsYmFja3MgPSBbY2FsbGJhY2tdO1xuICAgIGxldCB0b3VjaGVkT3V0cHV0cyA9IHt9O1xuICAgIC8vIHRoaXMgdHJhdmVyc2VzIHRoZSBncmFwaCBhbGwgdGhlIHdheSB0byB0aGUgZW5kXG4gICAgd2hpbGUgKGNhbGxiYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgLy8gZG9uJ3QgYWRkIGl0IGlmIGl0IGFscmVhZHkgZXhpc3RzIGJhc2VkIG9uIGlkIGFuZCBwcm9wc1xuICAgICAgICBjb25zdCBvdXRwdXRzID0gZmlsdGVyKG8gPT4gIXRvdWNoZWRPdXRwdXRzW2NvbWJpbmVJZEFuZFByb3AobyldLCBmbGF0dGVuKG1hcChjYiA9PiBmbGF0dGVuKGNiLmdldE91dHB1dHMocGF0aHMpKSwgY2FsbGJhY2tzKSkpO1xuICAgICAgICB0b3VjaGVkT3V0cHV0cyA9IHJlZHVjZSgodG91Y2hlZCwgbykgPT4gYXNzb2MoY29tYmluZUlkQW5kUHJvcChvKSwgdHJ1ZSwgdG91Y2hlZCksIHRvdWNoZWRPdXRwdXRzLCBvdXRwdXRzKTtcbiAgICAgICAgY2FsbGJhY2tzID0gZmxhdHRlbihtYXAoKHsgaWQsIHByb3BlcnR5IH0pID0+IGdldENhbGxiYWNrc0J5SW5wdXQoZ3JhcGhzLCBwYXRocywgaWQsIHByb3BlcnR5LCBJTkRJUkVDVCwgZmFsc2UpLCBvdXRwdXRzKSk7XG4gICAgfVxuICAgIHJldHVybiB0b3VjaGVkT3V0cHV0cztcbn1cbmV4cG9ydCBjb25zdCBnZXRSZWFkeUNhbGxiYWNrcyA9IChwYXRocywgY2FuZGlkYXRlcywgY2FsbGJhY2tzID0gY2FuZGlkYXRlcywgZ3JhcGhzID0ge30pID0+IHtcbiAgICAvLyBTa2lwIGlmIHRoZXJlJ3Mgbm8gY2FuZGlkYXRlc1xuICAgIGlmICghY2FuZGlkYXRlcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICAvLyBGaW5kIGFsbCBvdXRwdXRzIG9mIGFsbCBhY3RpdmUgY2FsbGJhY2tzXG4gICAgY29uc3Qgb3V0cHV0cyA9IG1hcChjb21iaW5lSWRBbmRQcm9wLCByZWR1Y2UoKG8sIGNiKSA9PiBjb25jYXQobywgZmxhdHRlbihjYi5nZXRPdXRwdXRzKHBhdGhzKSkpLCBbXSwgY2FsbGJhY2tzKSk7XG4gICAgLy8gTWFrZSBgb3V0cHV0c2AgaGFzaCB0YWJsZSBmb3IgZmFzdGVyIGFjY2Vzc1xuICAgIGxldCBvdXRwdXRzTWFwID0ge307XG4gICAgb3V0cHV0cy5mb3JFYWNoKG91dHB1dCA9PiAob3V0cHV0c01hcFtvdXRwdXRdID0gdHJ1ZSkpO1xuICAgIC8vIGZpbmQgYWxsIHRoZSBvdXRwdXRzIHRvdWNoZWQgYnkgYWN0aXZlQ2FsbGJhY2tzXG4gICAgLy8gcmVtb3ZlIHRoaXMgY2hlY2sgaWYgZ3JhcGggaXMgYWNjZXNzaWJsZSBhbGwgdGhlIHRpbWVcbiAgICBpZiAoT2JqZWN0LmtleXMoZ3JhcGhzKS5sZW5ndGgpIHtcbiAgICAgICAgLy9ub3Qgc3VyZSBpZiBncmFwaCB3aWxsIGJlIGFjY2Vzc2libGUgYWxsIHRoZSB0aW1lXG4gICAgICAgIGNvbnN0IGFsbFRvdWNoZWRPdXRwdXRzID0gZmxhdHRlbihtYXAoY2IgPT4gZ2V0QWxsU3Vic2VxdWVudE91dHB1dHNGb3JDYWxsYmFjayhncmFwaHMsIHBhdGhzLCBjYiksIGNhbGxiYWNrcykpO1xuICAgICAgICAvLyBvdmVycnJpZGVzIHRoZSBvdXRwdXRzTWFwLCB3aWxsIGR1cGxpY2F0ZSBjYWxsYmFja3MgZmlsdGVyZWRcbiAgICAgICAgLy8gdGhpcyBpcyBvbmx5IGRvbmUgdG8gc2lsZW5jZSB0eXBlc2NyaXB0IGVycm9yc1xuICAgICAgICBpZiAoYWxsVG91Y2hlZE91dHB1dHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgb3V0cHV0c01hcCA9IE9iamVjdC5hc3NpZ24oYWxsVG91Y2hlZE91dHB1dHNbMF0sIC4uLmFsbFRvdWNoZWRPdXRwdXRzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBSYW1kYS5KUyBgZGlmZmVyZW5jZWAgZnVuY3Rpb24gaXMgc2xvdyBiZWNhdXNlIGl0IGNvbXBhcmVzIG9iamVjdHMgZW50aXJlbHlcbiAgICAvLyBUaGlzIGNhdXNlIHRoZSBmb2xsb3dpbmcgYGZpbHRlcmAgdG8gYmUgZXhwb25lbnRpYWxseSBzbG93IGFzIHRoZSBudW1iZXIgb2YgaW5wdXRzIG9yIG91dHB1dHMgZ3Jvd1xuICAgIC8vIFdlIGNhbiBvcHRpbWl6ZSB0aGlzIGJ5IGNvbXBhcmluZyBvbmx5IHRoZSBgaWQrcHJvcGAgcGFydCBvZiB0aGUgaW5wdXRzICYgb3V0cHV0cy5cbiAgICAvLyBPcmlnaW5hbCBkaWZmZXJlbmNlIHRha2VzIDM4MG1zIG9uIGF2ZXJhZ2UgdG8gY29tcHV0ZSBkaWZmZXJlbmNlIGJldHdlZW4gMjAwIGlucHV0cyBhbmQgMSBvdXRwdXQuXG4gICAgLy8gVGhlIGZvbGxvd2luZyBmdW5jdGlvbiB0YWtlcyAxLTJtcyBvbiBhdmVyYWdlLlxuICAgIGNvbnN0IGRpZmZlcmVuY2VCYXNlZE9uSWQgPSAoaW5wdXRzLCBvdXRwdXRzKSA9PiBpbnB1dHMuZmlsdGVyKGlucHV0ID0+ICFvdXRwdXRzLnNvbWUob3V0cHV0ID0+IGNvbWJpbmVJZEFuZFByb3AoaW5wdXQpID09PSBjb21iaW5lSWRBbmRQcm9wKG91dHB1dCkpKTtcbiAgICAvLyBGaW5kIGByZXF1ZXN0ZWRgIGNhbGxiYWNrcyB0aGF0IGRvIG5vdCBkZXBlbmQgb24gYSBvdXRzdGFuZGluZyBvdXRwdXQgKGFzIGVpdGhlciBpbnB1dCBvciBzdGF0ZSlcbiAgICAvLyBPdXRwdXRzIHdoaWNoIG92ZXJsYXAgYW4gaW5wdXQgZG8gbm90IGNvdW50IGFzIGFuIG91dHN0YW5kaW5nIG91dHB1dFxuICAgIHJldHVybiBmaWx0ZXIoY2IgPT4gYWxsKGNicCA9PiAhb3V0cHV0c01hcFtjb21iaW5lSWRBbmRQcm9wKGNicCldLCBkaWZmZXJlbmNlQmFzZWRPbklkKGZsYXR0ZW4oY2IuZ2V0SW5wdXRzKHBhdGhzKSksIGZsYXR0ZW4oY2IuZ2V0T3V0cHV0cyhwYXRocykpKSksIGNhbmRpZGF0ZXMpO1xufTtcbmV4cG9ydCBjb25zdCBnZXRMYXlvdXRDYWxsYmFja3MgPSAoZ3JhcGhzLCBwYXRocywgbGF5b3V0LCBvcHRpb25zKSA9PiB7XG4gICAgbGV0IGV4Y2x1c2lvbnMgPSBbXTtcbiAgICBsZXQgY2FsbGJhY2tzID0gZ2V0VW5maWx0ZXJlZExheW91dENhbGxiYWNrcyhncmFwaHMsIHBhdGhzLCBsYXlvdXQsIG9wdGlvbnMpO1xuICAgIC8qXG4gICAgICAgIFJlbW92ZSBmcm9tIHRoZSBpbml0aWFsIGNhbGxiYWNrcyB0aG9zZSB0aGF0IGFyZSBsZWZ0IHdpdGggb25seSBleGNsdWRlZCBpbnB1dHMuXG5cbiAgICAgICAgRXhjbHVzaW9uIG9mIGlucHV0cyBoYXBwZW5zIHdoZW46XG4gICAgICAgIC0gYW4gaW5wdXQgaXMgbWlzc2luZ1xuICAgICAgICAtIGFuIGlucHV0IGluIHRoZSBpbml0aWFsIGNhbGxiYWNrIGNoYWluIGRlcGVuZHMgb25seSBvbiBleGNsdWRlZCBpbnB1dHNcblxuICAgICAgICBGdXJ0aGVyIGV4Y2x1c2lvbiBtaWdodCBoYXBwZW4gYWZ0ZXIgY2FsbGJhY2tzIHJldHVybiB3aXRoOlxuICAgICAgICAtIFByZXZlbnRVcGRhdGVcbiAgICAgICAgLSBub191cGRhdGVcbiAgICAqL1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIC8vIEZpbmQgY2FsbGJhY2tzIGZvciB3aGljaCBhbGwgaW5wdXRzIGFyZSBtaXNzaW5nIG9yIGluIHRoZSBleGNsdXNpb25zXG4gICAgICAgIGNvbnN0IFtpbmNsdWRlZCwgZXhjbHVkZWRdID0gcGFydGl0aW9uKCh7IGNhbGxiYWNrOiB7IGlucHV0cyB9LCBnZXRJbnB1dHMgfSkgPT4gYWxsKGlzTXVsdGlWYWx1ZWQsIGlucHV0cykgfHxcbiAgICAgICAgICAgICFpc0VtcHR5KGRpZmZlcmVuY2UobWFwKGNvbWJpbmVJZEFuZFByb3AsIGZsYXR0ZW4oZ2V0SW5wdXRzKHBhdGhzKSkpLCBleGNsdXNpb25zKSksIGNhbGxiYWNrcyk7XG4gICAgICAgIC8vIElmIHRoZXJlJ3Mgbm8gYWRkaXRpb25hbCBleGNsdXNpb25zLCBicmVhayBsb29wIC0gY2FsbGJhY2tzIGhhdmUgYmVlbiBjbGVhbmVkXG4gICAgICAgIGlmICghZXhjbHVkZWQubGVuZ3RoKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYWxsYmFja3MgPSBpbmNsdWRlZDtcbiAgICAgICAgLy8gdXBkYXRlIGV4Y2x1c2lvbnMgd2l0aCBhbGwgYWRkaXRpb25hbCBleGNsdWRlZCBvdXRwdXRzXG4gICAgICAgIGV4Y2x1c2lvbnMgPSBjb25jYXQoZXhjbHVzaW9ucywgbWFwKGNvbWJpbmVJZEFuZFByb3AsIGZsYXR0ZW4obWFwKCh7IGdldE91dHB1dHMgfSkgPT4gZ2V0T3V0cHV0cyhwYXRocyksIGV4Y2x1ZGVkKSkpKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuZmlsdGVyUm9vdCkge1xuICAgICAgICBsZXQgcm9vdElkID0gcGF0aChbJ3Byb3BzJywgJ2lkJ10sIGxheW91dCk7XG4gICAgICAgIGlmIChyb290SWQpIHtcbiAgICAgICAgICAgIHJvb3RJZCA9IHN0cmluZ2lmeUlkKHJvb3RJZCk7XG4gICAgICAgICAgICAvLyBGaWx0ZXIgaW5wdXRzIHRoYXQgYXJlIG5vdCBwcmVzZW50IGluIHRoZSByZXNwb25zZVxuICAgICAgICAgICAgY2FsbGJhY2tzID0gY2FsbGJhY2tzLmZpbHRlcihjYiA9PiBjYi5jYWxsYmFjay5pbnB1dHMucmVkdWNlKChwcmV2aW91cywgaW5wdXQpID0+IHByZXZpb3VzIHx8XG4gICAgICAgICAgICAgICAgKHN0cmluZ2lmeUlkKGlucHV0LmlkKSA9PSByb290SWQgJiZcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5maWx0ZXJSb290LmluY2x1ZGVzKGlucHV0LnByb3BlcnR5KSksIGZhbHNlKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLypcbiAgICAgICAgUmV0dXJuIGFsbCBjYWxsYmFja3Mgd2l0aCBhbiBgZXhlY3V0aW9uR3JvdXBgIHRvIGFsbG93IGdyb3VwLXByb2Nlc3NpbmdcbiAgICAqL1xuICAgIGNvbnN0IGV4ZWN1dGlvbkdyb3VwID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygxNik7XG4gICAgcmV0dXJuIG1hcChjYiA9PiAoeyAuLi5jYiwgZXhlY3V0aW9uR3JvdXAgfSksIGNhbGxiYWNrcyk7XG59O1xuZXhwb3J0IGNvbnN0IGdldFVuaXF1ZUlkZW50aWZpZXIgPSAoeyBhbnlWYWxzLCBjYWxsYmFjazogeyBpbnB1dHMsIG91dHB1dHMsIHN0YXRlLCBvdXRwdXQgfSB9KSA9PiB7XG4gICAgY29uc3QgaWRQYXJ0cyA9IG1hcChjb21iaW5lSWRBbmRQcm9wLCBbLi4uaW5wdXRzLCAuLi5vdXRwdXRzLCAuLi5zdGF0ZV0pO1xuICAgIC8vIEZvciBuby1vdXRwdXQgY2FsbGJhY2tzLCBpbmNsdWRlIHRoZSBvdXRwdXQgaGFzaCB0byBlbnN1cmUgdW5pcXVlbmVzc1xuICAgIGlmIChvdXRwdXRzLmxlbmd0aCA9PT0gMCAmJiBvdXRwdXQpIHtcbiAgICAgICAgaWRQYXJ0cy5wdXNoKG91dHB1dCk7XG4gICAgfVxuICAgIHJldHVybiBjb25jYXQoaWRQYXJ0cywgQXJyYXkuaXNBcnJheShhbnlWYWxzKSA/IGFueVZhbHMgOiBhbnlWYWxzID09PSAnJyA/IFtdIDogW2FueVZhbHNdKS5qb2luKCcsJyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIGluY2x1ZGVPYnNlcnZlcnMoaWQsIHByb3BlcnRpZXMsIGdyYXBocywgcGF0aHMpIHtcbiAgICByZXR1cm4gZmxhdHRlbihtYXAocHJvcE5hbWUgPT4gZ2V0Q2FsbGJhY2tzQnlJbnB1dChncmFwaHMsIHBhdGhzLCBpZCwgcHJvcE5hbWUpLCBrZXlzKHByb3BlcnRpZXMpKSk7XG59XG4vKlxuICogQ3JlYXRlIGEgcGVuZGluZyBjYWxsYmFjayBvYmplY3QuIEluY2x1ZGVzIHRoZSBvcmlnaW5hbCBjYWxsYmFjayBkZWZpbml0aW9uLFxuICogaXRzIHJlc29sdmVkIElEIChpbmNsdWRpbmcgdGhlIHZhbHVlIG9mIGFsbCBNQVRDSCB3aWxkY2FyZHMpLFxuICogYWNjZXNzb3JzIHRvIGZpbmQgYWxsIGlucHV0cywgb3V0cHV0cywgYW5kIHN0YXRlIGludm9sdmVkIGluIHRoaXNcbiAqIGNhbGxiYWNrIChsYXp5IGFzIG5vdCBhbGwgdXNlcnMgd2lsbCB3YW50IGFsbCBvZiB0aGVzZSkuXG4gKi9cbmV4cG9ydCBjb25zdCBtYWtlUmVzb2x2ZWRDYWxsYmFjayA9IChjYWxsYmFjaywgcmVzb2x2ZSwgYW55VmFscykgPT4gKHtcbiAgICBjYWxsYmFjayxcbiAgICBhbnlWYWxzLFxuICAgIHJlc29sdmVkSWQ6IGNhbGxiYWNrLm91dHB1dCArIGFueVZhbHMsXG4gICAgZ2V0T3V0cHV0czogcGF0aHMgPT4gY2FsbGJhY2sub3V0cHV0cy5tYXAocmVzb2x2ZShwYXRocykpLFxuICAgIGdldElucHV0czogcGF0aHMgPT4gY2FsbGJhY2suaW5wdXRzLm1hcChyZXNvbHZlKHBhdGhzKSksXG4gICAgZ2V0U3RhdGU6IHBhdGhzID0+IGNhbGxiYWNrLnN0YXRlLm1hcChyZXNvbHZlKHBhdGhzKSksXG4gICAgY2hhbmdlZFByb3BJZHM6IHt9LFxuICAgIGluaXRpYWxDYWxsOiBmYWxzZVxufSk7XG5leHBvcnQgZnVuY3Rpb24gcHJ1bmVDYWxsYmFja3MoY2FsbGJhY2tzLCBwYXRocykge1xuICAgIGNvbnN0IFssIHJlbW92ZWRdID0gcGFydGl0aW9uKCh7IGdldE91dHB1dHMsIGNhbGxiYWNrOiB7IG91dHB1dHMgfSB9KSA9PiBmbGF0dGVuKGdldE91dHB1dHMocGF0aHMpKS5sZW5ndGggPT09IG91dHB1dHMubGVuZ3RoLCBjYWxsYmFja3MpO1xuICAgIGNvbnN0IFssIG1vZGlmaWVkXSA9IHBhcnRpdGlvbigoeyBnZXRPdXRwdXRzIH0pID0+ICFmbGF0dGVuKGdldE91dHB1dHMocGF0aHMpKS5sZW5ndGgsIHJlbW92ZWQpO1xuICAgIGNvbnN0IGFkZGVkID0gbWFwKGNiID0+IGFzc29jKCdjaGFuZ2VkUHJvcElkcycsIHBpY2tCeSgoXywgcHJvcElkKSA9PiBnZXRQYXRoKHBhdGhzLCBzcGxpdElkQW5kUHJvcChwcm9wSWQpLmlkKSwgY2IuY2hhbmdlZFByb3BJZHMpLCBjYiksIG1vZGlmaWVkKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBhZGRlZCxcbiAgICAgICAgcmVtb3ZlZFxuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZURlcHMocmVmS2V5cywgcmVmVmFscywgcmVmUGF0dGVyblZhbHMpIHtcbiAgICByZXR1cm4gKHBhdGhzKSA9PiAoeyBpZDogaWRQYXR0ZXJuLCBwcm9wZXJ0eSwgcGFydGlhbDogaXNQYXJ0aWFsIH0pID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBpZFBhdHRlcm4gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCBwYXRoID0gZ2V0UGF0aChwYXRocywgaWRQYXR0ZXJuKTtcbiAgICAgICAgICAgIHJldHVybiBwYXRoID8gW3sgaWQ6IGlkUGF0dGVybiwgcHJvcGVydHksIHBhdGggfV0gOiBbXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpZEtleXMgPSBPYmplY3Qua2V5cyhpZFBhdHRlcm4pLnNvcnQoKTtcbiAgICAgICAgY29uc3QgcGF0dGVyblZhbHMgPSBwcm9wcyhpZEtleXMsIGlkUGF0dGVybik7XG4gICAgICAgIGNvbnN0IGlkS2V5U3RyID0gaWRLZXlzLmpvaW4oJywnKTtcbiAgICAgICAgY29uc3Qga2V5UGF0aHMgPSBwYXRocy5vYmpzW2lkS2V5U3RyXTtcbiAgICAgICAgaWYgKGtleVBhdGhzKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgICAgIGtleVBhdGhzLmZvckVhY2goKHsgdmFsdWVzOiB2YWxzLCBwYXRoIH0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaWRNYXRjaChpZEtleXMsIHZhbHMsIHBhdHRlcm5WYWxzLCByZWZLZXlzLCByZWZWYWxzLCByZWZQYXR0ZXJuVmFscykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goeyBpZDogemlwT2JqKGlkS2V5cywgdmFscyksIHByb3BlcnR5LCBwYXRoIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiBubyBleGFjdCBpZEtleVN0ciBtYXRjaCBhbmQgaW5wdXQgaXMgcGFydGlhbCwgc2VhcmNoIGZvclxuICAgICAgICAvLyBzdXBlcnNldCBrZXlTdHJzIChzYW1lIGxvZ2ljIGFzIHJlc29sdmVQYXJ0aWFsRGVwcylcbiAgICAgICAgaWYgKGlzUGFydGlhbCkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG9iaktleVN0ciBpbiBwYXRocy5vYmpzKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2JqS2V5cyA9IG9iaktleVN0ci5zcGxpdCgnLCcpO1xuICAgICAgICAgICAgICAgIGlmICghaWRLZXlzLmV2ZXJ5KChrKSA9PiBvYmpLZXlzLmluZGV4T2YoaykgIT09IC0xKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3Qgb2JqS2V5UGF0aHMgPSBwYXRocy5vYmpzW29iaktleVN0cl07XG4gICAgICAgICAgICAgICAgb2JqS2V5UGF0aHMuZm9yRWFjaCgoeyB2YWx1ZXM6IHZhbHMsIHBhdGggfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFydGlhbElkTWF0Y2goaWRLZXlzLCBwYXR0ZXJuVmFscywgb2JqS2V5cywgdmFscywgcmVmS2V5cywgcmVmVmFscywgcmVmUGF0dGVyblZhbHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHppcE9iaihvYmpLZXlzLCB2YWxzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW107XG4gICAgfTtcbn1cbi8qXG4gKiByZXNvbHZlUGFydGlhbERlcHM6IGxpa2UgcmVzb2x2ZURlcHMgYnV0IGZvciBwYXJ0aWFsIHBhdHRlcm5zLlxuICogVGhlIHBhdHRlcm4gbWF5IGhhdmUgZmV3ZXIga2V5cyB0aGFuIHRoZSBjb21wb25lbnRzIGluIHRoZSBsYXlvdXQuXG4gKiBXZSBzZWFyY2ggYWxsIHBhdGhzLm9ianMgZW50cmllcyB3aG9zZSBrZXlzIGFyZSBhIHN1cGVyc2V0IG9mIHRoZVxuICogcGF0dGVybidzIGtleXMuXG4gKlxuICogcGF0dGVybktleXM6IHRoZSBrZXlzIGRlZmluZWQgaW4gdGhlIHRyaWdnZXJpbmcgcGF0dGVyblxuICogcmVmVmFsczogdGhlIHRyaWdnZXJpbmcgY29tcG9uZW50J3MgdmFsdWVzIGZvciB0aGUgcGF0dGVybiBrZXlzXG4gKiByZWZQYXR0ZXJuVmFsczogdGhlIHBhdHRlcm4gdmFsdWVzICh3aWxkY2FyZHMvbGl0ZXJhbHMpIGZvciB0aGUgcGF0dGVybiBrZXlzXG4gKiBjb21wb25lbnRLZXlzOiB0aGUgZnVsbCBrZXlzIG9mIHRoZSB0cmlnZ2VyaW5nIGNvbXBvbmVudCAoc3VwZXJzZXQpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUGFydGlhbERlcHMocGF0dGVybktleXMsIHJlZlZhbHMsIHJlZlBhdHRlcm5WYWxzLCBfY29tcG9uZW50S2V5cykge1xuICAgIHJldHVybiAocGF0aHMpID0+ICh7IGlkOiBpZFBhdHRlcm4sIHByb3BlcnR5LCBwYXJ0aWFsOiBpc1BhcnRpYWwgfSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIGlkUGF0dGVybiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhdGggPSBnZXRQYXRoKHBhdGhzLCBpZFBhdHRlcm4pO1xuICAgICAgICAgICAgcmV0dXJuIHBhdGggPyBbeyBpZDogaWRQYXR0ZXJuLCBwcm9wZXJ0eSwgcGF0aCB9XSA6IFtdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlkS2V5cyA9IE9iamVjdC5rZXlzKGlkUGF0dGVybikuc29ydCgpO1xuICAgICAgICBjb25zdCBwYXR0ZXJuVmFscyA9IHByb3BzKGlkS2V5cywgaWRQYXR0ZXJuKTtcbiAgICAgICAgaWYgKCFpc1BhcnRpYWwpIHtcbiAgICAgICAgICAgIC8vIE5vbi1wYXJ0aWFsIGRlcGVuZGVuY3kgaW4gdGhlIHNhbWUgY2FsbGJhY2sgLSB1c2UgZXhhY3QgbWF0Y2hcbiAgICAgICAgICAgIGNvbnN0IGlkS2V5U3RyID0gaWRLZXlzLmpvaW4oJywnKTtcbiAgICAgICAgICAgIGNvbnN0IGtleVBhdGhzID0gcGF0aHMub2Jqc1tpZEtleVN0cl07XG4gICAgICAgICAgICBpZiAoIWtleVBhdGhzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgICAgICAvLyBNYXAgcmVmVmFscyBmcm9tIHBhdHRlcm5LZXlzIHRvIGlkS2V5cyBvcmRlcmluZ1xuICAgICAgICAgICAgY29uc3QgbWFwcGVkUmVmVmFscyA9IHJlZlZhbHNcbiAgICAgICAgICAgICAgICA/IGlkS2V5cy5tYXAoKGspID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaWR4ID0gcGF0dGVybktleXMuaW5kZXhPZihrKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlkeCAhPT0gLTEgPyByZWZWYWxzW2lkeF0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IG1hcHBlZFJlZlBhdHRlcm5WYWxzID0gcmVmUGF0dGVyblZhbHNcbiAgICAgICAgICAgICAgICA/IGlkS2V5cy5tYXAoKGspID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaWR4ID0gcGF0dGVybktleXMuaW5kZXhPZihrKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlkeCAhPT0gLTEgPyByZWZQYXR0ZXJuVmFsc1tpZHhdIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBrZXlQYXRocy5mb3JFYWNoKCh7IHZhbHVlczogdmFscywgcGF0aCB9KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGlkTWF0Y2goaWRLZXlzLCB2YWxzLCBwYXR0ZXJuVmFscywgcGF0dGVybktleXMsIG1hcHBlZFJlZlZhbHMsIG1hcHBlZFJlZlBhdHRlcm5WYWxzKSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh7IGlkOiB6aXBPYmooaWRLZXlzLCB2YWxzKSwgcHJvcGVydHksIHBhdGggfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIC8vIFBhcnRpYWw6IHNlYXJjaCBhbGwgcGF0aHMub2JqcyBlbnRyaWVzIHdob3NlIGtleXMgYXJlIGFcbiAgICAgICAgLy8gc3VwZXJzZXQgb2YgdGhpcyBwYXR0ZXJuJ3Mga2V5c1xuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBvYmpLZXlTdHIgaW4gcGF0aHMub2Jqcykge1xuICAgICAgICAgICAgY29uc3Qgb2JqS2V5cyA9IG9iaktleVN0ci5zcGxpdCgnLCcpO1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgb2JqS2V5cyBpcyBhIHN1cGVyc2V0IG9mIGlkS2V5c1xuICAgICAgICAgICAgaWYgKCFpZEtleXMuZXZlcnkoKGspID0+IG9iaktleXMuaW5kZXhPZihrKSAhPT0gLTEpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBrZXlQYXRocyA9IHBhdGhzLm9ianNbb2JqS2V5U3RyXTtcbiAgICAgICAgICAgIGtleVBhdGhzLmZvckVhY2goKHsgdmFsdWVzOiB2YWxzLCBwYXRoIH0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocGFydGlhbElkTWF0Y2goaWRLZXlzLCBwYXR0ZXJuVmFscywgb2JqS2V5cywgdmFscywgcGF0dGVybktleXMsIHJlZlZhbHMsIHJlZlBhdHRlcm5WYWxzKSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogemlwT2JqKG9iaktleXMsIHZhbHMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHksXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbn1cbiIsImltcG9ydCB7IGNyZWF0ZUFjdGlvbiB9IGZyb20gJ3JlZHV4LWFjdGlvbnMnO1xuaW1wb3J0IHsgSXNMb2FkaW5nQWN0aW9uVHlwZSB9IGZyb20gJy4uL3JlZHVjZXJzL2lzTG9hZGluZyc7XG5leHBvcnQgY29uc3Qgc2V0SXNMb2FkaW5nID0gY3JlYXRlQWN0aW9uKElzTG9hZGluZ0FjdGlvblR5cGUuU2V0KTtcbiIsImltcG9ydCB7IGNyZWF0ZUFjdGlvbiB9IGZyb20gJ3JlZHV4LWFjdGlvbnMnO1xuZXhwb3J0IGNvbnN0IGxvYWRpbmcgPSBjcmVhdGVBY3Rpb24oJ0xPQURJTkcnKTtcbmV4cG9ydCBjb25zdCBsb2FkZWQgPSBjcmVhdGVBY3Rpb24oJ0xPQURFRCcpO1xuIiwiaW1wb3J0IHsgYXBwZW5kLCBhc3NvY1BhdGgsIGNvbmNhdCwgZGlzc29jUGF0aCwgZW1wdHksIGVxdWFscywgaGFzLCBpbnNlcnQsIGlzLCBwYXRoLCBwcmVwZW5kLCByZXZlcnNlIH0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IHsgc3RyaW5naWZ5SWQgfSBmcm9tICcuL2RlcGVuZGVuY2llcyc7XG5pbXBvcnQgeyBpc0RyeUNvbXBvbmVudCB9IGZyb20gJy4uL3dyYXBwZXIvd3JhcHBpbmcnO1xuZXhwb3J0IGZ1bmN0aW9uIGlzUGF0Y2gob2JqKSB7XG4gICAgcmV0dXJuIGhhcygnX19kYXNoX3BhdGNoX3VwZGF0ZScsIG9iaik7XG59XG5mdW5jdGlvbiBnZXRMb2NhdGlvbkluZGV4KHZhbHVlLCBwcmV2aW91cykge1xuICAgIGlmIChpcyhOdW1iZXIsIHZhbHVlKSAmJiB2YWx1ZSA8IDApIHtcbiAgICAgICAgcmV0dXJuIHByZXZpb3VzLmxlbmd0aCArIHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG5mdW5jdGlvbiBnZXRMb2NhdGlvblBhdGgobG9jYXRpb24sIG9iaikge1xuICAgIGNvbnN0IGN1cnJlbnQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxvY2F0aW9uLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0TG9jYXRpb25JbmRleChsb2NhdGlvbltpXSwgcGF0aChjdXJyZW50LCBvYmopKTtcbiAgICAgICAgY3VycmVudC5wdXNoKHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIGN1cnJlbnQ7XG59XG5leHBvcnQgY2xhc3MgUGF0Y2hCdWlsZGVyIHtcbiAgICBvcGVyYXRpb25zID0gW107XG4gICAgYXNzaWduKGxvY2F0aW9uLCB2YWx1ZSkge1xuICAgICAgICB0aGlzLm9wZXJhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBvcGVyYXRpb246ICdBc3NpZ24nLFxuICAgICAgICAgICAgbG9jYXRpb24sXG4gICAgICAgICAgICBwYXJhbXM6IHsgdmFsdWUgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIG1lcmdlKGxvY2F0aW9uLCB2YWx1ZSkge1xuICAgICAgICB0aGlzLm9wZXJhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBvcGVyYXRpb246ICdNZXJnZScsXG4gICAgICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgICAgIHBhcmFtczogeyB2YWx1ZSB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZXh0ZW5kKGxvY2F0aW9uLCB2YWx1ZSkge1xuICAgICAgICB0aGlzLm9wZXJhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBvcGVyYXRpb246ICdFeHRlbmQnLFxuICAgICAgICAgICAgbG9jYXRpb24sXG4gICAgICAgICAgICBwYXJhbXM6IHsgdmFsdWUgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGRlbGV0ZShsb2NhdGlvbikge1xuICAgICAgICB0aGlzLm9wZXJhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBvcGVyYXRpb246ICdEZWxldGUnLFxuICAgICAgICAgICAgbG9jYXRpb24sXG4gICAgICAgICAgICBwYXJhbXM6IHt9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgaW5zZXJ0KGxvY2F0aW9uLCBpbmRleCwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5vcGVyYXRpb25zLnB1c2goe1xuICAgICAgICAgICAgb3BlcmF0aW9uOiAnSW5zZXJ0JyxcbiAgICAgICAgICAgIGxvY2F0aW9uLFxuICAgICAgICAgICAgcGFyYW1zOiB7IGluZGV4LCB2YWx1ZSB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgYXBwZW5kKGxvY2F0aW9uLCB2YWx1ZSkge1xuICAgICAgICB0aGlzLm9wZXJhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBvcGVyYXRpb246ICdBcHBlbmQnLFxuICAgICAgICAgICAgbG9jYXRpb24sXG4gICAgICAgICAgICBwYXJhbXM6IHsgdmFsdWUgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHByZXBlbmQobG9jYXRpb24sIHZhbHVlKSB7XG4gICAgICAgIHRoaXMub3BlcmF0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIG9wZXJhdGlvbjogJ1ByZXBlbmQnLFxuICAgICAgICAgICAgbG9jYXRpb24sXG4gICAgICAgICAgICBwYXJhbXM6IHsgdmFsdWUgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGFkZChsb2NhdGlvbiwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5vcGVyYXRpb25zLnB1c2goe1xuICAgICAgICAgICAgb3BlcmF0aW9uOiAnQWRkJyxcbiAgICAgICAgICAgIGxvY2F0aW9uLFxuICAgICAgICAgICAgcGFyYW1zOiB7IHZhbHVlIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzdWIobG9jYXRpb24sIHZhbHVlKSB7XG4gICAgICAgIHRoaXMub3BlcmF0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIG9wZXJhdGlvbjogJ1N1YicsXG4gICAgICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgICAgIHBhcmFtczogeyB2YWx1ZSB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgbXVsKGxvY2F0aW9uLCB2YWx1ZSkge1xuICAgICAgICB0aGlzLm9wZXJhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBvcGVyYXRpb246ICdNdWwnLFxuICAgICAgICAgICAgbG9jYXRpb24sXG4gICAgICAgICAgICBwYXJhbXM6IHsgdmFsdWUgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGRpdihsb2NhdGlvbiwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5vcGVyYXRpb25zLnB1c2goe1xuICAgICAgICAgICAgb3BlcmF0aW9uOiAnRGl2JyxcbiAgICAgICAgICAgIGxvY2F0aW9uLFxuICAgICAgICAgICAgcGFyYW1zOiB7IHZhbHVlIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBjbGVhcihsb2NhdGlvbikge1xuICAgICAgICB0aGlzLm9wZXJhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBvcGVyYXRpb246ICdDbGVhcicsXG4gICAgICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgICAgIHBhcmFtczoge31cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICByZXZlcnNlKGxvY2F0aW9uKSB7XG4gICAgICAgIHRoaXMub3BlcmF0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIG9wZXJhdGlvbjogJ1JldmVyc2UnLFxuICAgICAgICAgICAgbG9jYXRpb24sXG4gICAgICAgICAgICBwYXJhbXM6IHt9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmVtb3ZlKGxvY2F0aW9uLCB2YWx1ZSkge1xuICAgICAgICB0aGlzLm9wZXJhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBvcGVyYXRpb246ICdSZW1vdmUnLFxuICAgICAgICAgICAgbG9jYXRpb24sXG4gICAgICAgICAgICBwYXJhbXM6IHsgdmFsdWUgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGJ1aWxkKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgX19kYXNoX3BhdGNoX3VwZGF0ZTogJ19fZGFzaF9wYXRjaF91cGRhdGUnLFxuICAgICAgICAgICAgb3BlcmF0aW9uczogdGhpcy5vcGVyYXRpb25zXG4gICAgICAgIH07XG4gICAgfVxufVxuY29uc3QgcGF0Y2hIYW5kbGVycyA9IHtcbiAgICBBc3NpZ246IChwcmV2aW91cywgcGF0Y2hPcGVyYXRpb24pID0+IHtcbiAgICAgICAgY29uc3QgeyBwYXJhbXMsIGxvY2F0aW9uIH0gPSBwYXRjaE9wZXJhdGlvbjtcbiAgICAgICAgcmV0dXJuIGFzc29jUGF0aChsb2NhdGlvbiwgcGFyYW1zLnZhbHVlLCBwcmV2aW91cyk7XG4gICAgfSxcbiAgICBNZXJnZTogKHByZXZpb3VzLCBwYXRjaE9wZXJhdGlvbikgPT4ge1xuICAgICAgICBjb25zdCBwcmV2ID0gcGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwgcHJldmlvdXMpO1xuICAgICAgICByZXR1cm4gYXNzb2NQYXRoKHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLCB7XG4gICAgICAgICAgICAuLi5wcmV2LFxuICAgICAgICAgICAgLi4ucGF0Y2hPcGVyYXRpb24ucGFyYW1zLnZhbHVlXG4gICAgICAgIH0sIHByZXZpb3VzKTtcbiAgICB9LFxuICAgIEV4dGVuZDogKHByZXZpb3VzLCBwYXRjaE9wZXJhdGlvbikgPT4ge1xuICAgICAgICBjb25zdCBwcmV2ID0gcGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwgcHJldmlvdXMpO1xuICAgICAgICByZXR1cm4gYXNzb2NQYXRoKHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLCBjb25jYXQocHJldiwgcGF0Y2hPcGVyYXRpb24ucGFyYW1zLnZhbHVlKSwgcHJldmlvdXMpO1xuICAgIH0sXG4gICAgRGVsZXRlOiAocHJldmlvdXMsIHBhdGNoT3BlcmF0aW9uKSA9PiB7XG4gICAgICAgIHJldHVybiBkaXNzb2NQYXRoKHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLCBwcmV2aW91cyk7XG4gICAgfSxcbiAgICBJbnNlcnQ6IChwcmV2aW91cywgcGF0Y2hPcGVyYXRpb24pID0+IHtcbiAgICAgICAgY29uc3QgcHJldiA9IHBhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIHByZXZpb3VzKTtcbiAgICAgICAgcmV0dXJuIGFzc29jUGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwgaW5zZXJ0KGdldExvY2F0aW9uSW5kZXgocGF0Y2hPcGVyYXRpb24ucGFyYW1zLmluZGV4LCBwcmV2KSwgcGF0Y2hPcGVyYXRpb24ucGFyYW1zLnZhbHVlLCBwcmV2KSwgcHJldmlvdXMpO1xuICAgIH0sXG4gICAgQXBwZW5kOiAocHJldmlvdXMsIHBhdGNoT3BlcmF0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IHByZXYgPSBwYXRoKHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLCBwcmV2aW91cyk7XG4gICAgICAgIHJldHVybiBhc3NvY1BhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIGFwcGVuZChwYXRjaE9wZXJhdGlvbi5wYXJhbXMudmFsdWUsIHByZXYpLCBwcmV2aW91cyk7XG4gICAgfSxcbiAgICBQcmVwZW5kOiAocHJldmlvdXMsIHBhdGNoT3BlcmF0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IHByZXYgPSBwYXRoKHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLCBwcmV2aW91cyk7XG4gICAgICAgIHJldHVybiBhc3NvY1BhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIHByZXBlbmQocGF0Y2hPcGVyYXRpb24ucGFyYW1zLnZhbHVlLCBwcmV2KSwgcHJldmlvdXMpO1xuICAgIH0sXG4gICAgQWRkOiAocHJldmlvdXMsIHBhdGNoT3BlcmF0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IHByZXYgPSBwYXRoKHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLCBwcmV2aW91cyk7XG4gICAgICAgIHJldHVybiBhc3NvY1BhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIHByZXYgKyBwYXRjaE9wZXJhdGlvbi5wYXJhbXMudmFsdWUsIHByZXZpb3VzKTtcbiAgICB9LFxuICAgIFN1YjogKHByZXZpb3VzLCBwYXRjaE9wZXJhdGlvbikgPT4ge1xuICAgICAgICBjb25zdCBwcmV2ID0gcGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwgcHJldmlvdXMpO1xuICAgICAgICByZXR1cm4gYXNzb2NQYXRoKHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLCBwcmV2IC0gcGF0Y2hPcGVyYXRpb24ucGFyYW1zLnZhbHVlLCBwcmV2aW91cyk7XG4gICAgfSxcbiAgICBNdWw6IChwcmV2aW91cywgcGF0Y2hPcGVyYXRpb24pID0+IHtcbiAgICAgICAgY29uc3QgcHJldiA9IHBhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIHByZXZpb3VzKTtcbiAgICAgICAgcmV0dXJuIGFzc29jUGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwgcHJldiAqIHBhdGNoT3BlcmF0aW9uLnBhcmFtcy52YWx1ZSwgcHJldmlvdXMpO1xuICAgIH0sXG4gICAgRGl2OiAocHJldmlvdXMsIHBhdGNoT3BlcmF0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IHByZXYgPSBwYXRoKHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLCBwcmV2aW91cyk7XG4gICAgICAgIHJldHVybiBhc3NvY1BhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIHByZXYgLyBwYXRjaE9wZXJhdGlvbi5wYXJhbXMudmFsdWUsIHByZXZpb3VzKTtcbiAgICB9LFxuICAgIENsZWFyOiAocHJldmlvdXMsIHBhdGNoT3BlcmF0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IHByZXYgPSBwYXRoKHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLCBwcmV2aW91cyk7XG4gICAgICAgIHJldHVybiBhc3NvY1BhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIGVtcHR5KHByZXYpLCBwcmV2aW91cyk7XG4gICAgfSxcbiAgICBSZXZlcnNlOiAocHJldmlvdXMsIHBhdGNoT3BlcmF0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IHByZXYgPSBwYXRoKHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLCBwcmV2aW91cyk7XG4gICAgICAgIHJldHVybiBhc3NvY1BhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIHJldmVyc2UocHJldiksIHByZXZpb3VzKTtcbiAgICB9LFxuICAgIFJlbW92ZTogKHByZXZpb3VzLCBwYXRjaE9wZXJhdGlvbikgPT4ge1xuICAgICAgICBjb25zdCBwcmV2ID0gcGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwgcHJldmlvdXMpO1xuICAgICAgICByZXR1cm4gYXNzb2NQYXRoKHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLCBwcmV2LmZpbHRlcigoaXRlbSkgPT4gIWVxdWFscyhpdGVtLCBwYXRjaE9wZXJhdGlvbi5wYXJhbXMudmFsdWUpKSwgcHJldmlvdXMpO1xuICAgIH1cbn07XG4vKlxuICogT3BlcmF0aW9ucyB0aGF0IHB1dCBhIHZhbHVlIGludG8gdGhlIHRyZWUsIHdoaWNoIGFkZC9yZW1vdmUgaWRzLFxuICogYW5kIG5lZWQgdG8gYmUgaGFuZGxlZCBkdXJpbmcgYSBwYXRjaFxuICovXG5jb25zdCBpbnNlcnRpbmdPcGVyYXRpb25zID0ge1xuICAgIEFzc2lnbjogdHJ1ZSxcbiAgICBNZXJnZTogdHJ1ZSxcbiAgICBFeHRlbmQ6IHRydWUsXG4gICAgSW5zZXJ0OiB0cnVlLFxuICAgIEFwcGVuZDogdHJ1ZSxcbiAgICBQcmVwZW5kOiB0cnVlXG59O1xuZnVuY3Rpb24gY29sbGVjdENvbXBvbmVudElkcyh2YWx1ZSwgZnJlc2hJZHMsIHZpc2l0ZWQpIHtcbiAgICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgdmlzaXRlZC5oYXModmFsdWUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmlzaXRlZC5hZGQodmFsdWUpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKGl0ZW0gPT4gY29sbGVjdENvbXBvbmVudElkcyhpdGVtLCBmcmVzaElkcywgdmlzaXRlZCkpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpc0RyeUNvbXBvbmVudCh2YWx1ZSkpIHtcbiAgICAgICAgY29uc3QgeyBpZCB9ID0gdmFsdWUucHJvcHM7XG4gICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkICYmIGlkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBmcmVzaElkc1tzdHJpbmdpZnlJZChpZCldID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb2xsZWN0Q29tcG9uZW50SWRzKHZhbHVlLnByb3BzLCBmcmVzaElkcywgdmlzaXRlZCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgY29sbGVjdENvbXBvbmVudElkcyh2YWx1ZVtrZXldLCBmcmVzaElkcywgdmlzaXRlZCk7XG4gICAgfVxufVxuZnVuY3Rpb24gcmVjb3JkV3JpdHRlblByb3AocHJldmlvdXMsIGxvY2F0aW9uLCB3cml0dGVuUHJvcHMpIHtcbiAgICBsZXQgY3VycmVudCA9IHByZXZpb3VzO1xuICAgIGxldCBpZFN0ciA9IG51bGw7XG4gICAgbGV0IHByb3BlcnR5ID0gbnVsbDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxvY2F0aW9uLmxlbmd0aCAmJiBjdXJyZW50OyBpKyspIHtcbiAgICAgICAgY29uc3Qga2V5ID0gbG9jYXRpb25baV07XG4gICAgICAgIGlmIChrZXkgPT09ICdwcm9wcycgJiZcbiAgICAgICAgICAgIGkgKyAxIDwgbG9jYXRpb24ubGVuZ3RoICYmXG4gICAgICAgICAgICBpc0RyeUNvbXBvbmVudChjdXJyZW50KSAmJlxuICAgICAgICAgICAgY3VycmVudC5wcm9wcy5pZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICBjdXJyZW50LnByb3BzLmlkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZFN0ciA9IHN0cmluZ2lmeUlkKGN1cnJlbnQucHJvcHMuaWQpO1xuICAgICAgICAgICAgcHJvcGVydHkgPSBTdHJpbmcobG9jYXRpb25baSArIDFdKTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50ID0gY3VycmVudFtrZXldO1xuICAgIH1cbiAgICBpZiAoaWRTdHIgIT09IG51bGwgJiYgcHJvcGVydHkgIT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgcHJvcHMgPSB3cml0dGVuUHJvcHNbaWRTdHJdIHx8ICh3cml0dGVuUHJvcHNbaWRTdHJdID0ge30pO1xuICAgICAgICBwcm9wc1twcm9wZXJ0eV0gPSB0cnVlO1xuICAgIH1cbn1cbi8qXG4gKiBPcGVyYXRpb25zIHRoYXQgb25seSBhZGQgaXRlbXMgYXQgdGhlIGVuZCBvZiBhIGxpc3QsIGFuZCBob3cgbWFueSBpdGVtc1xuICogZWFjaCBvbmUgYWRkcy4gYGxvY2F0aW9uYCBpcyB0aGUgbGlzdCB0aGV5IGFwcGVuZCB0by4gQW55dGhpbmcgZWxzZSB0aGF0XG4gKiB0b3VjaGVzIGEgbGlzdCAoSW5zZXJ0LCBQcmVwZW5kLCBEZWxldGUsIFJlbW92ZSwgQ2xlYXIsIFJldmVyc2UsIEFzc2lnbilcbiAqIGludmFsaWRhdGVzIHRoZSBhcHBlbmQtb25seSBzaG9ydGN1dCBmb3IgdGhhdCBwcm9wZXJ0eSwgc2luY2Ugb2xkIGl0ZW1zIGNhblxuICogbm8gbG9uZ2VyIGJlIGFzc3VtZWQgdG8gaGF2ZSBrZXB0IHRoZWlyIGluZGljZXMuXG4gKi9cbmNvbnN0IHRhaWxBcHBlbmRDb3VudHMgPSB7XG4gICAgQXBwZW5kOiAoKSA9PiAxLFxuICAgIEV4dGVuZDogcGFyYW1zID0+IChBcnJheS5pc0FycmF5KHBhcmFtcy52YWx1ZSkgPyBwYXJhbXMudmFsdWUubGVuZ3RoIDogMClcbn07XG5mdW5jdGlvbiByZWNvcmRUYWlsQXBwZW5kKHByb3BlcnR5LCBsb2NhdGlvbiwgb3BlcmF0aW9uLCBwYXJhbXMsIGFuYWx5c2lzKSB7XG4gICAgaWYgKHByb3BlcnR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBleGlzdGluZyA9IGFuYWx5c2lzLnRhaWxBcHBlbmRzW3Byb3BlcnR5XTtcbiAgICBpZiAoZXhpc3RpbmcgPT09IGZhbHNlKSB7XG4gICAgICAgIC8vIEFscmVhZHkgaW52YWxpZGF0ZWQgZm9yIHRoaXMgcHJvcGVydHk7IG5vdGhpbmcgY2FuIHVuZG8gdGhhdC5cbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAob3BlcmF0aW9uIGluIHRhaWxBcHBlbmRDb3VudHMpIHtcbiAgICAgICAgY29uc3QgY291bnQgPSB0YWlsQXBwZW5kQ291bnRzW29wZXJhdGlvbl0ocGFyYW1zKTtcbiAgICAgICAgaWYgKGV4aXN0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIEZpcnN0IGFwcGVuZCB0byB0aGlzIHByb3BlcnR5OiByZW1lbWJlciB3aGljaCBsaXN0IGl0IGdyZXcuXG4gICAgICAgICAgICBhbmFseXNpcy50YWlsQXBwZW5kc1twcm9wZXJ0eV0gPSB7IGxvY2F0aW9uLCBjb3VudCB9O1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlcXVhbHMoZXhpc3RpbmcubG9jYXRpb24sIGxvY2F0aW9uKSkge1xuICAgICAgICAgICAgLy8gQW5vdGhlciBhcHBlbmQgdG8gdGhlIHNhbWUgbGlzdCAtIHN0aWxsIGEgcHVyZSBzaW5nbGUtbGlzdFxuICAgICAgICAgICAgLy8gYXBwZW5kLCBqdXN0IG1vcmUgaXRlbXMuXG4gICAgICAgICAgICBleGlzdGluZy5jb3VudCArPSBjb3VudDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBBcHBlbmRlZCB0byBhIHNlY29uZCwgZGlmZmVyZW50IGxpc3QuIFdlIGNhbiBvbmx5IGV4cHJlc3Mgb25lXG4gICAgICAgIC8vIGdyb3duIGxpc3QgcGVyIHByb3BlcnR5LCBzbyBmYWxsIGJhY2sgdG8gYSBmdWxsIHJlY29tcHV0ZS5cbiAgICB9XG4gICAgYW5hbHlzaXMudGFpbEFwcGVuZHNbcHJvcGVydHldID0gZmFsc2U7XG59XG5mdW5jdGlvbiByZWNvcmRQYXRjaE9wZXJhdGlvbihwcmV2aW91cywgcGF0Y2hPcGVyYXRpb24sIGFuYWx5c2lzLCBwcm9wZXJ0eSkge1xuICAgIGNvbnN0IHsgb3BlcmF0aW9uLCBsb2NhdGlvbiwgcGFyYW1zIH0gPSBwYXRjaE9wZXJhdGlvbjtcbiAgICBpZiAoaW5zZXJ0aW5nT3BlcmF0aW9uc1tvcGVyYXRpb25dKSB7XG4gICAgICAgIGNvbGxlY3RDb21wb25lbnRJZHMocGFyYW1zLnZhbHVlLCBhbmFseXNpcy5mcmVzaElkcywgbmV3IFNldCgpKTtcbiAgICB9XG4gICAgcmVjb3JkVGFpbEFwcGVuZChwcm9wZXJ0eSwgbG9jYXRpb24sIG9wZXJhdGlvbiwgcGFyYW1zLCBhbmFseXNpcyk7XG4gICAgaWYgKG9wZXJhdGlvbiA9PT0gJ01lcmdlJyAmJiBwYXJhbXMudmFsdWUgJiYgaXMoT2JqZWN0LCBwYXJhbXMudmFsdWUpKSB7XG4gICAgICAgIE9iamVjdC5rZXlzKHBhcmFtcy52YWx1ZSkuZm9yRWFjaChrZXkgPT4gcmVjb3JkV3JpdHRlblByb3AocHJldmlvdXMsIGxvY2F0aW9uLmNvbmNhdChrZXkpLCBhbmFseXNpcy53cml0dGVuUHJvcHMpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZWNvcmRXcml0dGVuUHJvcChwcmV2aW91cywgbG9jYXRpb24sIGFuYWx5c2lzLndyaXR0ZW5Qcm9wcyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlUGF0Y2gocHJldmlvdXNWYWx1ZSwgcGF0Y2hWYWx1ZSwgYW5hbHlzaXMsIHByb3BlcnR5KSB7XG4gICAgbGV0IHJlZHVjZWRWYWx1ZSA9IHByZXZpb3VzVmFsdWU7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRjaFZhbHVlLm9wZXJhdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgcGF0Y2ggPSBwYXRjaFZhbHVlLm9wZXJhdGlvbnNbaV07XG4gICAgICAgIHBhdGNoLmxvY2F0aW9uID0gZ2V0TG9jYXRpb25QYXRoKHBhdGNoLmxvY2F0aW9uLCByZWR1Y2VkVmFsdWUpO1xuICAgICAgICBjb25zdCBoYW5kbGVyID0gcGF0Y2hIYW5kbGVyc1twYXRjaC5vcGVyYXRpb25dO1xuICAgICAgICBpZiAoIWhhbmRsZXIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBPcGVyYXRpb24gJHtwYXRjaC5vcGVyYXRpb259YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFuYWx5c2lzKSB7XG4gICAgICAgICAgICByZWNvcmRQYXRjaE9wZXJhdGlvbihyZWR1Y2VkVmFsdWUsIHBhdGNoLCBhbmFseXNpcywgcHJvcGVydHkpO1xuICAgICAgICB9XG4gICAgICAgIHJlZHVjZWRWYWx1ZSA9IGhhbmRsZXIocmVkdWNlZFZhbHVlLCBwYXRjaCk7XG4gICAgfVxuICAgIHJldHVybiByZWR1Y2VkVmFsdWU7XG59XG4vKlxuICogYGFuYWx5c2lzYCwgd2hlbiBwcm92aWRlZCwgaXMgZmlsbGVkIGluIHdpdGggd2hhdCB0aGUgcGF0Y2hlcyBkaWQuXG4gKiBQcm9wcyB0aGF0IGFyZSBub3QgcGF0Y2hlcyBhcmUgbGVmdCBvdXQgb2YgaXQsIHNvIGNhbGxlcnNcbiAqIGNhbiB0ZWxsIGEgcGF0Y2hlZCBwcm9wIGZyb20gYSBmdWxseSByZXBsYWNlZCBvbmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUGF0Y2hQcm9wcyhwcm9wcywgcHJldmlvdXNQcm9wcywgYW5hbHlzaXMpIHtcbiAgICBpZiAoIWlzKE9iamVjdCwgcHJvcHMpKSB7XG4gICAgICAgIHJldHVybiBwcm9wcztcbiAgICB9XG4gICAgY29uc3QgcGF0Y2hlZFByb3BzID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocHJvcHMpKSB7XG4gICAgICAgIGNvbnN0IHZhbCA9IHByb3BzW2tleV07XG4gICAgICAgIGlmIChpc1BhdGNoKHZhbCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSBwcmV2aW91c1Byb3BzW2tleV07XG4gICAgICAgICAgICBpZiAocHJldmlvdXNWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcGF0Y2ggdW5kZWZpbmVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYW5hbHlzaXMpIHtcbiAgICAgICAgICAgICAgICBhbmFseXNpcy5wYXRjaGVkUHJvcHNba2V5XSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXRjaGVkUHJvcHNba2V5XSA9IGhhbmRsZVBhdGNoKHByZXZpb3VzVmFsdWUsIHZhbCwgYW5hbHlzaXMsIGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwYXRjaGVkUHJvcHNba2V5XSA9IHZhbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcGF0Y2hlZFByb3BzO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVBhdGNoQW5hbHlzaXMoKSB7XG4gICAgcmV0dXJuIHsgcGF0Y2hlZFByb3BzOiB7fSwgZnJlc2hJZHM6IHt9LCB3cml0dGVuUHJvcHM6IHt9LCB0YWlsQXBwZW5kczoge30gfTtcbn1cbi8qXG4gKiBUaGUgYW5hbHlzaXMsIGJ1dCBvbmx5IGlmIGBwcm9wZXJ0eWAgaXMgb25lIG9mIHRoZSBwcm9wcyBpdCBkZXNjcmliZXMuXG4gKiBBIGNhbGxiYWNrIGNhbiByZXR1cm4gYSBQYXRjaCBmb3Igb25lIHByb3AgYW5kIGEgZnVsbCB2YWx1ZSBmb3IgYW5vdGhlciwgYW5kXG4gKiBhIGZ1bGwgdmFsdWUgaXMgYSBmcmVzaCBzdWItdHJlZSBpbiB3aGljaCBub3RoaW5nIHdhcyBjYXJyaWVkIG92ZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFuYWx5c2lzRm9yUHJvcChhbmFseXNpcywgcHJvcGVydHkpIHtcbiAgICByZXR1cm4gYW5hbHlzaXM/LnBhdGNoZWRQcm9wc1twcm9wZXJ0eV0gPyBhbmFseXNpcyA6IHVuZGVmaW5lZDtcbn1cbi8qXG4gKiBGb3IgY29uc3VtZXJzIHRoYXQgbG9vayBhdCBzZXZlcmFsIHByb3BzIG9mIGFuIG91dHB1dCBhdCBvbmNlLCB0aGVcbiAqIGFuYWx5c2lzIG9ubHkgYXBwbGllcyBpZiBldmVyeSBvbmUgb2YgdGhlbSBjYW1lIGZyb20gYSBQYXRjaFxuICovXG5leHBvcnQgZnVuY3Rpb24gYW5hbHlzaXNGb3JBbGxQcm9wcyhhbmFseXNpcywgcHJvcGVydGllcykge1xuICAgIHJldHVybiBhbmFseXNpcyAmJlxuICAgICAgICBwcm9wZXJ0aWVzLmxlbmd0aCAmJlxuICAgICAgICBwcm9wZXJ0aWVzLmV2ZXJ5KHByb3BlcnR5ID0+IGFuYWx5c2lzLnBhdGNoZWRQcm9wc1twcm9wZXJ0eV0pXG4gICAgICAgID8gYW5hbHlzaXNcbiAgICAgICAgOiB1bmRlZmluZWQ7XG59XG4vKlxuICogV2FzIHRoaXMgY29tcG9uZW50IGFscmVhZHkgaW4gdGhlIGxheW91dCBiZWZvcmUgdGhlIHBhdGNoP1xuICogV2l0aG91dCBhbiBhbmFseXNpcyB0aGUgY2h1bmsgZGlkIG5vdCBjb21lIGZyb20gYSBwYXRjaCwgc29cbiAqIG5vdGhpbmcgd2FzIGNhcnJpZWQgb3Zlciwgc28gZXZlcnkgY29tcG9uZW50IGlzIG5ld1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDYXJyaWVkT3ZlckJ5UGF0Y2goYW5hbHlzaXMsIGlkU3RyKSB7XG4gICAgaWYgKCFhbmFseXNpcyB8fCAhaWRTdHIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gIWFuYWx5c2lzLmZyZXNoSWRzW2lkU3RyXTtcbn1cbi8qXG4gKiBTdHJpY3RlciB2ZXJzaW9uIG9mIGBpc0NhcnJpZWRPdmVyQnlQYXRjaGAgZm9yIHBlcnNpc3RlbmNlIHdoZXJlIGEgY29tcG9uZW50XG4gKiB3YXMga2VwdCBhbmQgdGhlIHBhdGNoIGRpZCBub3Qgd3JpdGUgYW55IHByb3Agb24uIFRoZXNlIGNvbXBvbmVudHMgc3RpbGwgaG9sZFxuICogdXNlciBlZGl0cyBpbiBSZWR1eCwgc28gcGVyc2lzdGVuY2UgbXVzdCBsZWF2ZSBpdCBhbG9uZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNVbnRvdWNoZWRCeVBhdGNoKGFuYWx5c2lzLCBpZFN0cikge1xuICAgIGlmICghYW5hbHlzaXMgfHwgIWlkU3RyKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuICFhbmFseXNpcy5mcmVzaElkc1tpZFN0cl0gJiYgIWFuYWx5c2lzLndyaXR0ZW5Qcm9wc1tpZFN0cl07XG59XG4vKlxuICogRGlkIHRoZSBwYXRjaCB3cml0ZSBkaXJlY3RseSBvbiB0aGlzIHByb3Agb2YgYSBjb21wb25lbnQgaXQgZGlkIG5vdFxuICogcmVjcmVhdGU/IFRoaXMgY2FuIGJlIHRydWUgZm9yIGEgY29tcG9uZW50IHdob3NlIG93biBpbml0aWFsIGNhbGwgc3RheXNcbiAqIHN1cHByZXNzZWQgYnkgYGlzQ2FycmllZE92ZXJCeVBhdGNoYCwgaXQncyBub3QgZnJlc2gsIGV2ZW4gdGhvdWdoIG9uZSBvZlxuICogaXRzIHByb3BzIGNoYW5nZWQsIGNhbGxiYWNrcyB0aGF0IGRlcGVuZCBvbiB0aGF0IHByb3AgYXMgYW4gSW5wdXRcbiAqIHN0aWxsIG5lZWQgdG8gcnVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3YXNXcml0dGVuQnlQYXRjaChhbmFseXNpcywgaWRTdHIsIHByb3BlcnR5KSB7XG4gICAgaWYgKCFhbmFseXNpcyB8fCAhaWRTdHIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gQm9vbGVhbihhbmFseXNpcy53cml0dGVuUHJvcHNbaWRTdHJdPy5bcHJvcGVydHldKTtcbn1cbi8qXG4gKiBXaGVyZSBhbmQgaG93IG11Y2ggdGhpcyBwYXRjaCBhcHBlbmRlZCwgaWYgYXBwZW5kaW5nIHRvIG9uZSBzaW5nbGUgbGlzdFxuICogKHBvc3NpYmx5IG5lc3RlZCkgaXMgKmFsbCogaXQgZGlkIHRvIGBwcm9wZXJ0eWAgLSB3aGF0IHBhdGhzLmpzIG5lZWRzIHRvXG4gKiBjb21wdXRlIHBhdGhzIGZvciBvbmx5IHRoZSBuZXcgaXRlbXMgaW5zdGVhZCBvZiByZS1jcmF3bGluZyBldmVyeVxuICogcHJlLWV4aXN0aW5nIG9uZS4gYG51bGxgIHdoZW4gdGhlIGFuYWx5c2lzIGRvZXNuJ3QgY292ZXIgdGhpcyBwcm9wZXJ0eSwgb3JcbiAqIHdoZW4gdGhlIHBhdGNoIHRvdWNoZWQgYSBsaXN0IGluIHNvbWUgb3RoZXIgd2F5IChzZWUgYHRhaWxBcHBlbmRzYCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0YWlsQXBwZW5kKGFuYWx5c2lzLCBwcm9wZXJ0eSkge1xuICAgIGNvbnN0IGVudHJ5ID0gYW5hbHlzaXM/LnRhaWxBcHBlbmRzW3Byb3BlcnR5XTtcbiAgICByZXR1cm4gZW50cnkgJiYgdHlwZW9mIGVudHJ5ID09PSAnb2JqZWN0JyA/IGVudHJ5IDogbnVsbDtcbn1cbi8qXG4gKiBIb3cgbWFueSBpdGVtcyBgdGFpbEFwcGVuZGAgcmVwb3J0cyBmb3IgYHByb3BlcnR5YCAoMCB3aGVuIGl0IHJlcG9ydHMgbm9uZSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0YWlsQXBwZW5kQ291bnQoYW5hbHlzaXMsIHByb3BlcnR5KSB7XG4gICAgcmV0dXJuIHRhaWxBcHBlbmQoYW5hbHlzaXMsIHByb3BlcnR5KT8uY291bnQgPz8gMDtcbn1cbiIsImltcG9ydCB7IGtleXMsIGVxdWFscywgZGlzc29jLCB0b1BhaXJzIH0gZnJvbSAncmFtZGEnO1xuLyoqXG4gKiBEZXNlcmlhbGl6ZSBwYXR0ZXJuIG1hdGNoaW5nIGlkcyB0aGF0IGNvbWUgaW4gb25lIG9mIHRoZSBmb3JtOlxuICogLSAne1widHlwZVwiOlwiY29tcG9uZW50XCIsXCJpbmRleFwiOltcIk1BVENIXCJdfS5jaGlsZHJlbidcbiAqIC0gJ3tcInR5cGVcIjpcImNvbXBvbmVudFwiLFwiaW5kZXhcIjpbXCJNQVRDSFwiXX0nXG4gKlxuICogQHBhcmFtIGlkIFRoZSByYXcgb2JqZWN0IGFzIGEgc3RyaW5nIGlkLlxuICogQHJldHVybnMgVGhlIGlkIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUE1DSWQoaWQpIHtcbiAgICBsZXQgY29tcG9uZW50SWQsIHByb3BOYW1lO1xuICAgIGNvbnN0IGluZGV4ID0gaWQubGFzdEluZGV4T2YoJ30nKTtcbiAgICBpZiAoaW5kZXggKyAyIDwgaWQubGVuZ3RoKSB7XG4gICAgICAgIHByb3BOYW1lID0gaWQuc3Vic3RyaW5nKGluZGV4ICsgMik7XG4gICAgICAgIGNvbXBvbmVudElkID0gSlNPTi5wYXJzZShpZC5zdWJzdHJpbmcoMCwgaW5kZXggKyAxKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb21wb25lbnRJZCA9IEpTT04ucGFyc2UoaWQpO1xuICAgIH1cbiAgICByZXR1cm4gW2NvbXBvbmVudElkLCBwcm9wTmFtZV07XG59XG4vKipcbiAqIEdldCBhbGwgdGhlIGFzc29jaWF0ZWQgaWRzIGZvciBhbiBpZC5cbiAqXG4gKiBAcGFyYW0gaWQgSWQgdG8gZ2V0IGFsbCB0aGUgcG1jIGlkcyBmcm9tLlxuICogQHBhcmFtIHN0YXRlIFN0YXRlIG9mIHRoZSBzdG9yZS5cbiAqIEBwYXJhbSB0cmlnZ2VyS2V5IEtleSB0byByZW1vdmUgZnJvbSB0aGUgZXF1YWxpdHkgY29tcGFyaXNvbi5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbGxQTUNJZHMoaWQsIHN0YXRlLCB0cmlnZ2VyS2V5KSB7XG4gICAgY29uc3Qga2V5c09mSWRzID0ga2V5cyhpZCk7XG4gICAgY29uc3QgaWRLZXkgPSBrZXlzT2ZJZHMuam9pbignLCcpO1xuICAgIHJldHVybiBzdGF0ZS5wYXRocy5vYmpzW2lkS2V5XVxuICAgICAgICAubWFwKChvYmopID0+IGtleXNPZklkcy5yZWR1Y2UoKGFjYywga2V5LCBpKSA9PiB7XG4gICAgICAgIGFjY1trZXldID0gb2JqLnZhbHVlc1tpXTtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSkpXG4gICAgICAgIC5maWx0ZXIoKG9iaikgPT4gZXF1YWxzKGRpc3NvYyh0cmlnZ2VyS2V5LCBvYmopLCBkaXNzb2ModHJpZ2dlcktleSwgaWQpKSk7XG59XG4vKipcbiAqIFJlcGxhY2UgdGhlIHBhdHRlcm4gbWF0Y2hpbmcgaWRzIHdpdGggdGhlIGFjdHVhbCB0cmlnZ2VyIHZhbHVlXG4gKiBmb3IgTUFUQ0gsIGFsbCB0aGUgaWRzIGZvciBBTEwgYW5kIHNtYWxsZXIgdGhhbiB0aGUgdHJpZ2dlciB2YWx1ZVxuICogZm9yIEFMTFNNQUxMRVIuXG4gKlxuICogQHBhcmFtIGlkIFRoZSBwYXJzZWQgaWQgaW4gZGljdGlvbmFyeSBmb3JtYXQuXG4gKiBAcGFyYW0gY2IgT3JpZ2luYWwgY2FsbGJhY2sgaW5mby5cbiAqIEBwYXJhbSBpbmRleCBJbmRleCBvZiB0aGUgZGVwZW5kZW5jeSBpbiBjYXNlIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgY2hhbmdlZCBpZC5cbiAqIEBwYXJhbSBnZXRTdGF0ZSBGdW5jdGlvbiB0byBnZXQgdGhlIHN0YXRlIG9mIHRoZSByZWR1eCBzdG9yZS5cbiAqIEByZXR1cm5zIExpc3Qgb2YgcmVwbGFjZWQgaWRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVwbGFjZVBNQyhpZCwgY2IsIGluZGV4LCBnZXRTdGF0ZSkge1xuICAgIGxldCBleHRyYXMgPSBbXTtcbiAgICBjb25zdCByZXBsYWNlZCA9IHt9O1xuICAgIHRvUGFpcnMoaWQpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICBpZiAoZXh0cmFzLmxlbmd0aCkge1xuICAgICAgICAgICAgLy8gQWxsIGRvbmUuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICBjb25zdCB0cmlnZ2VyVmFsdWUgPSAoY2IucGFyc2VkQ2hhbmdlZFByb3BzSWRzW2luZGV4XSB8fFxuICAgICAgICAgICAgICAgIGNiLnBhcnNlZENoYW5nZWRQcm9wc0lkc1swXSlba2V5XTtcbiAgICAgICAgICAgIGlmICh2YWx1ZS5pbmNsdWRlcygnTUFUQ0gnKSkge1xuICAgICAgICAgICAgICAgIHJlcGxhY2VkW2tleV0gPSB0cmlnZ2VyVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZS5pbmNsdWRlcygnQUxMJykpIHtcbiAgICAgICAgICAgICAgICBleHRyYXMgPSBnZXRBbGxQTUNJZHMoaWQsIGdldFN0YXRlKCksIGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZS5pbmNsdWRlcygnQUxMU01BTExFUicpKSB7XG4gICAgICAgICAgICAgICAgZXh0cmFzID0gZ2V0QWxsUE1DSWRzKGlkLCBnZXRTdGF0ZSgpLCBrZXkpLmZpbHRlcigob2JqKSA9PiBvYmpba2V5XSA8IHRyaWdnZXJWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXBsYWNlZFtrZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoZXh0cmFzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZXh0cmFzO1xuICAgIH1cbiAgICByZXR1cm4gW3JlcGxhY2VkXTtcbn1cbiIsImltcG9ydCB7IGJhdGNoIH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IHsgc2V0R3JhcGhzIH0gZnJvbSAnLi9pbmRleCc7XG5pbXBvcnQgYXBpVGh1bmsgZnJvbSAnLi9hcGknO1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVlc3REZXBlbmRlbmNpZXMoKSB7XG4gICAgcmV0dXJuIChkaXNwYXRjaCwgZ2V0U3RhdGUpID0+IHtcbiAgICAgICAgYmF0Y2goKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBncmFwaHMgfSA9IGdldFN0YXRlKCk7XG4gICAgICAgICAgICBkaXNwYXRjaChzZXRHcmFwaHMoeyAuLi5ncmFwaHMsIHJlc2V0OiB0cnVlIH0pKTtcbiAgICAgICAgICAgIGRpc3BhdGNoKGFwaVRodW5rKCdfZGFzaC1kZXBlbmRlbmNpZXMnLCAnR0VUJywgJ2RlcGVuZGVuY2llc1JlcXVlc3QnKSk7XG4gICAgICAgIH0pO1xuICAgIH07XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRDb25maWdGcm9tRE9NKCkge1xuICAgIGNvbnN0IGNvbmZpZ0VsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnX2Rhc2gtY29uZmlnJyk7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoY29uZmlnRWxlbWVudD8udGV4dENvbnRlbnQgPyBjb25maWdFbGVtZW50Py50ZXh0Q29udGVudCA6ICd7fScpO1xufVxuIiwiaW1wb3J0IHsgcGF0aCB9IGZyb20gJ3JhbWRhJztcbmltcG9ydCB7IERhc2hDb250ZXh0LCB1c2VEYXNoQ29udGV4dCB9IGZyb20gJy4vd3JhcHBlci9EYXNoQ29udGV4dCc7XG5pbXBvcnQgeyBnZXRQYXRoIH0gZnJvbSAnLi9hY3Rpb25zL3BhdGhzJztcbmltcG9ydCB7IGdldFN0b3JlcyB9IGZyb20gJy4vdXRpbHMvc3RvcmVzJztcbmltcG9ydCBFeHRlcm5hbFdyYXBwZXIgZnJvbSAnLi93cmFwcGVyL0V4dGVybmFsV3JhcHBlcic7XG5pbXBvcnQgeyBzdHJpbmdpZnlJZCB9IGZyb20gJy4vYWN0aW9ucy9kZXBlbmRlbmNpZXMnO1xuaW1wb3J0IHsgRGV2dG9vbENvbnRleHQsIHVzZURldnRvb2wsIHVzZURldnRvb2xNZW51QnV0dG9uQ2xhc3NOYW1lIH0gZnJvbSAnLi9jb21wb25lbnRzL2Vycm9yL21lbnUvRGV2dG9vbENvbnRleHQnO1xuLyoqXG4gKiBHZXQgdGhlIGRhc2ggcHJvcHMgZnJvbSBhIGNvbXBvbmVudCBwYXRoIG9yIGlkLlxuICpcbiAqIEBwYXJhbSBjb21wb25lbnRQYXRoT3JJZCBUaGUgcGF0aCBvciB0aGUgaWQgb2YgdGhlIGNvbXBvbmVudCB0byBnZXQgdGhlIHByb3BzIG9mLlxuICogQHBhcmFtIHByb3BQYXRoIEFkZGl0aW9uYWwga2V5IHRvIGdldCB0aGUgcHJvcGVydHkgaW5zdGVhZCBvZiBwbGFpbiBwcm9wcy5cbiAqIEByZXR1cm5zXG4gKi9cbmZ1bmN0aW9uIGdldExheW91dChjb21wb25lbnRQYXRoT3JJZCkge1xuICAgIGNvbnN0IGRzID0gZ2V0U3RvcmVzKCk7XG4gICAgZm9yIChsZXQgeSA9IDA7IHkgPCBkcy5sZW5ndGg7IHkrKykge1xuICAgICAgICBjb25zdCB7IHBhdGhzLCBsYXlvdXQgfSA9IGRzW3ldLmdldFN0YXRlKCk7XG4gICAgICAgIGxldCBjb21wb25lbnRQYXRoO1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29tcG9uZW50UGF0aE9ySWQpKSB7XG4gICAgICAgICAgICBjb21wb25lbnRQYXRoID0gZ2V0UGF0aChwYXRocywgY29tcG9uZW50UGF0aE9ySWQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29tcG9uZW50UGF0aCA9IGNvbXBvbmVudFBhdGhPcklkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByb3BzID0gcGF0aChjb21wb25lbnRQYXRoLCBsYXlvdXQpO1xuICAgICAgICBpZiAocHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHByb3BzO1xuICAgICAgICB9XG4gICAgfVxufVxud2luZG93LmRhc2hfY29tcG9uZW50X2FwaSA9IE9iamVjdC5hc3NpZ24od2luZG93LmRhc2hfY29tcG9uZW50X2FwaSB8fCB7fSwge1xuICAgIEV4dGVybmFsV3JhcHBlcixcbiAgICBEYXNoQ29udGV4dCxcbiAgICB1c2VEYXNoQ29udGV4dCxcbiAgICBnZXRMYXlvdXQsXG4gICAgc3RyaW5naWZ5SWQsXG4gICAgZGV2dG9vbDoge1xuICAgICAgICBEZXZ0b29sQ29udGV4dCxcbiAgICAgICAgdXNlRGV2dG9vbCxcbiAgICAgICAgdXNlRGV2dG9vbE1lbnVCdXR0b25DbGFzc05hbWVcbiAgICB9XG59KTtcbiIsImNvbnN0IHVwZGF0ZVRpdGxlID0gKGdldFN0YXRlKSA9PiB7XG4gICAgY29uc3QgeyBjb25maWcsIGlzTG9hZGluZyB9ID0gZ2V0U3RhdGUoKTtcbiAgICBjb25zdCB1cGRhdGVfdGl0bGUgPSBjb25maWc/LnVwZGF0ZV90aXRsZTtcbiAgICBpZiAoIXVwZGF0ZV90aXRsZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpc0xvYWRpbmcpIHtcbiAgICAgICAgaWYgKGRvY3VtZW50LnRpdGxlICE9PSB1cGRhdGVfdGl0bGUpIHtcbiAgICAgICAgICAgIG9ic2VydmVyLnRpdGxlID0gZG9jdW1lbnQudGl0bGU7XG4gICAgICAgICAgICBkb2N1bWVudC50aXRsZSA9IHVwZGF0ZV90aXRsZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKGRvY3VtZW50LnRpdGxlID09PSB1cGRhdGVfdGl0bGUpIHtcbiAgICAgICAgICAgIGRvY3VtZW50LnRpdGxlID0gb2JzZXJ2ZXIudGl0bGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvYnNlcnZlci50aXRsZSA9IGRvY3VtZW50LnRpdGxlO1xuICAgICAgICB9XG4gICAgfVxufTtcbmNvbnN0IG9ic2VydmVyID0ge1xuICAgIGlucHV0czogWydpc0xvYWRpbmcnXSxcbiAgICBtdXRhdGlvbk9ic2VydmVyOiB1bmRlZmluZWQsXG4gICAgb2JzZXJ2ZXI6ICh7IGdldFN0YXRlIH0pID0+IHtcbiAgICAgICAgY29uc3QgeyBjb25maWcgfSA9IGdldFN0YXRlKCk7XG4gICAgICAgIGlmIChvYnNlcnZlci5jb25maWcgIT09IGNvbmZpZykge1xuICAgICAgICAgICAgb2JzZXJ2ZXIuY29uZmlnID0gY29uZmlnO1xuICAgICAgICAgICAgb2JzZXJ2ZXIubXV0YXRpb25PYnNlcnZlcj8uZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgb2JzZXJ2ZXIubXV0YXRpb25PYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHVwZGF0ZVRpdGxlKGdldFN0YXRlKSk7XG4gICAgICAgICAgICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3RpdGxlJyk7XG4gICAgICAgICAgICBpZiAodGl0bGUpIHtcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5tdXRhdGlvbk9ic2VydmVyLm9ic2VydmUodGl0bGUsIHtcbiAgICAgICAgICAgICAgICAgICAgc3VidHJlZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRMaXN0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJEYXRhOiB0cnVlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdXBkYXRlVGl0bGUoZ2V0U3RhdGUpO1xuICAgIH1cbn07XG5leHBvcnQgZGVmYXVsdCBvYnNlcnZlcjtcbiIsImltcG9ydCB7IGNvbmNhdCwgZmxhdHRlbiwgaXNFbXB0eSwgaXNOaWwsIG1hcCwgcGF0aCwga2V5cywgcGlja0J5LCB0b1BhaXJzLCBwYXRoT3IgfSBmcm9tICdyYW1kYSc7XG5pbXBvcnQgeyBhZ2dyZWdhdGVDYWxsYmFja3MsIGFkZFJlcXVlc3RlZENhbGxiYWNrcywgcmVtb3ZlRXhlY3V0ZWRDYWxsYmFja3MsIGFkZENvbXBsZXRlZENhbGxiYWNrcywgYWRkU3RvcmVkQ2FsbGJhY2tzIH0gZnJvbSAnLi4vYWN0aW9ucy9jYWxsYmFja3MnO1xuaW1wb3J0IHsgcGFyc2VJZldpbGRjYXJkIH0gZnJvbSAnLi4vYWN0aW9ucy9kZXBlbmRlbmNpZXMnO1xuaW1wb3J0IHsgY29tYmluZUlkQW5kUHJvcCwgZ2V0Q2FsbGJhY2tzQnlJbnB1dCwgZ2V0TGF5b3V0Q2FsbGJhY2tzLCBpbmNsdWRlT2JzZXJ2ZXJzIH0gZnJvbSAnLi4vYWN0aW9ucy9kZXBlbmRlbmNpZXNfdHMnO1xuaW1wb3J0IHsgdXBkYXRlUHJvcHMsIHNldFBhdGhzLCBoYW5kbGVBc3luY0Vycm9yIH0gZnJvbSAnLi4vYWN0aW9ucyc7XG5pbXBvcnQgeyBnZXRQYXRoLCBjb21wdXRlUGF0aHMsIGFwcGVuZFBhdGhzIH0gZnJvbSAnLi4vYWN0aW9ucy9wYXRocyc7XG5pbXBvcnQgeyBhbmFseXNpc0ZvckFsbFByb3BzLCBhbmFseXNpc0ZvclByb3AsIHRhaWxBcHBlbmQgfSBmcm9tICcuLi9hY3Rpb25zL3BhdGNoQW5hbHlzaXMnO1xuaW1wb3J0IHsgYXBwbHlQZXJzaXN0ZW5jZSwgcHJ1bmVQZXJzaXN0ZW5jZSB9IGZyb20gJy4uL3BlcnNpc3RlbmNlJztcbmNvbnN0IG9ic2VydmVyID0ge1xuICAgIG9ic2VydmVyOiAoeyBkaXNwYXRjaCwgZ2V0U3RhdGUgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IGNhbGxiYWNrczogeyBleGVjdXRlZCB9IH0gPSBnZXRTdGF0ZSgpO1xuICAgICAgICBmdW5jdGlvbiBhcHBseVByb3BzKGlkLCB1cGRhdGVkUHJvcHMsIHBhdGNoQW5hbHlzaXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgbGF5b3V0LCBwYXRocyB9ID0gZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1wYXRoID0gZ2V0UGF0aChwYXRocywgaWQpO1xuICAgICAgICAgICAgaWYgKCFpdGVtcGF0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBjYWxsYmFjay1nZW5lcmF0ZWQgdXBkYXRlLlxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpbnZhbGlkYXRlcyBleGlzdGluZyBwZXJzaXN0ZWQgcHJvcCB2YWx1ZXMsXG4gICAgICAgICAgICAvLyBvciBpZiBwZXJzaXN0ZW5jZSBjaGFuZ2VkLCB3aGV0aGVyIHRoaXMgdXBkYXRlcyBvdGhlciBwcm9wcy5cbiAgICAgICAgICAgIHVwZGF0ZWRQcm9wcyA9IHBydW5lUGVyc2lzdGVuY2UocGF0aChpdGVtcGF0aCwgbGF5b3V0KSwgdXBkYXRlZFByb3BzLCBkaXNwYXRjaCk7XG4gICAgICAgICAgICAvLyBJbiBjYXNlIHRoZSB1cGRhdGUgY29udGFpbnMgd2hvbGUgY29tcG9uZW50cywgc2VlIGlmIGFueSBvZlxuICAgICAgICAgICAgLy8gdGhvc2UgY29tcG9uZW50cyBoYXZlIHByb3BzIHRvIHVwZGF0ZSB0byBwZXJzaXN0IHVzZXIgZWRpdHMuXG4gICAgICAgICAgICAvLyBBIFBhdGNoIHJlc29sdmVzIGJ5IGNhcnJ5aW5nIHByZS1leGlzdGluZyBjaGlsZHJlbiBvdmVyIGZyb21cbiAgICAgICAgICAgIC8vIFJlZHV4LCB1c2VyIGVkaXRzIGluY2x1ZGVkLCBzbyBhcHBseVBlcnNpc3RlbmNlIG11c3QgbGVhdmUgdGhvc2VcbiAgICAgICAgICAgIC8vIGFsb25lLiBJdCB3b3VsZCBvdGhlcndpc2Ugc2VlIGEgXCJzZXJ2ZXIgb3ZlcnJpZGVcIiBhbmQgY2xlYXIgdGhlXG4gICAgICAgICAgICAvLyBzdG9yZWQgZWRpdC4gVGhlIGFuYWx5c2lzIHNheXMgd2hpY2ggY29tcG9uZW50cyB0aGUgcGF0Y2ggcmVhbGx5XG4gICAgICAgICAgICAvLyBjcmVhdGVkLiBFdmVyeXRoaW5nIGVsc2UgY2FtZSBmcm9tIGEgZnVsbCByZXBsYWNlbWVudCwgd2hlcmUgdGhlXG4gICAgICAgICAgICAvLyBzZXJ2ZXIgcmV0dXJucyBmcmVzaCBkZWZhdWx0IHZhbHVlcyBhbmQgcGVyc2lzdGVkIGVkaXRzIG11c3QgYmVcbiAgICAgICAgICAgIC8vIHJlc3RvcmVkIChlLmcuIGFmdGVyIGEgY29tcG9uZW50IG1vdmVzIG9uIHBhZ2UpLlxuICAgICAgICAgICAgLy8gT25seSB0aGUgYGNoaWxkcmVuYCBwcm9wIG1hdHRlcnMgaGVyZSwgdGhhdCBpcyB0aGUgb25lXG4gICAgICAgICAgICAvLyBhcHBseVBlcnNpc3RlbmNlIHJlY3Vyc2VzIHRocm91Z2hcbiAgICAgICAgICAgIGNvbnN0IHsgcHJvcHMgfSA9IGFwcGx5UGVyc2lzdGVuY2UoeyBwcm9wczogdXBkYXRlZFByb3BzIH0sIGRpc3BhdGNoLCBhbmFseXNpc0ZvclByb3AocGF0Y2hBbmFseXNpcywgJ2NoaWxkcmVuJykpO1xuICAgICAgICAgICAgZGlzcGF0Y2godXBkYXRlUHJvcHMoe1xuICAgICAgICAgICAgICAgIGl0ZW1wYXRoLFxuICAgICAgICAgICAgICAgIHByb3BzLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogJ3Jlc3BvbnNlJyxcbiAgICAgICAgICAgICAgICByZW5kZXJUeXBlOiAnY2FsbGJhY2snXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICByZXR1cm4gcHJvcHM7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlcXVlc3RlZENhbGxiYWNrcyA9IFtdO1xuICAgICAgICBjb25zdCBzdG9yZWRDYWxsYmFja3MgPSBbXTtcbiAgICAgICAgZXhlY3V0ZWQuZm9yRWFjaChjYiA9PiB7XG4gICAgICAgICAgICBjb25zdCBwcmVkZWNlc3NvcnMgPSBjb25jYXQoY2IucHJlZGVjZXNzb3JzID8/IFtdLCBbY2IuY2FsbGJhY2tdKTtcbiAgICAgICAgICAgIGNvbnN0IHsgY2FsbGJhY2s6IHsgY2xpZW50c2lkZV9mdW5jdGlvbiwgb3V0cHV0IH0sIGV4ZWN1dGlvblJlc3VsdCB9ID0gY2I7XG4gICAgICAgICAgICBpZiAoaXNOaWwoZXhlY3V0aW9uUmVzdWx0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgZGF0YSwgZXJyb3IsIHBheWxvYWQsIHBhdGNoZWRPdXRwdXRzIH0gPSBleGVjdXRpb25SZXN1bHQ7XG4gICAgICAgICAgICBpZiAoZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoZGF0YSkuZm9yRWFjaCgoW2lkLCBwcm9wc10pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkSWQgPSBwYXJzZUlmV2lsZGNhcmQoaWQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGdyYXBocywgbGF5b3V0OiBvbGRMYXlvdXQsIHBhdGhzOiBvbGRQYXRocyB9ID0gZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gV2hhdCB0aGUgUGF0Y2ggb3BlcmF0aW9ucyBvZiB0aGlzIG91dHB1dCBjaGFuZ2VkXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhdGNoQW5hbHlzaXMgPSBwYXRjaGVkT3V0cHV0cz8uW2lkXTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ29tcG9uZW50cyB3aWxsIHRyaWdnZXIgY2FsbGJhY2tzIG9uIHRoZWlyIG93biBhcyByZXF1aXJlZCAoZWcuIGRlcml2ZWQpXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFwcGxpZWRQcm9wcyA9IGFwcGx5UHJvcHMocGFyc2VkSWQsIHByb3BzLCBwYXRjaEFuYWx5c2lzKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQWRkIGNhbGxiYWNrcyBmb3IgbW9kaWZpZWQgaW5wdXRzXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZENhbGxiYWNrcyA9IGNvbmNhdChyZXF1ZXN0ZWRDYWxsYmFja3MsIGZsYXR0ZW4obWFwKHByb3AgPT4gZ2V0Q2FsbGJhY2tzQnlJbnB1dChncmFwaHMsIG9sZFBhdGhzLCBwYXJzZWRJZCwgcHJvcCwgdHJ1ZSksIGtleXMocHJvcHMpKSkubWFwKHJjYiA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4ucmNiLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGVjZXNzb3JzXG4gICAgICAgICAgICAgICAgICAgIH0pKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2VQYXRoID0gZ2V0UGF0aChvbGRQYXRocywgcGFyc2VkSWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWJhc2VQYXRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2xkT2JqID0gcGF0aChiYXNlUGF0aCwgb2xkTGF5b3V0KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGRyZW5Qcm9wcyA9IHBhdGhPcignZGVmYXVsdFZhbHVlJywgW29sZE9iai5uYW1lc3BhY2UsIG9sZE9iai50eXBlXSwgd2luZG93Ll9fZGFzaHByaXZhdGVfY2hpbGRyZW5Qcm9wcyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZVBhdGhzID0gKGNoaWxkcmVuLCBvbGRDaGlsZHJlbiwgb2xkQ2hpbGRyZW5QYXRoLCBmaWx0ZXJSb290ID0gZmFsc2UsIHByb3BBbmFseXNpcywgYXBwZW5kID0gbnVsbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb1BhdGhzID0gZ2V0U3RhdGUoKS5wYXRocztcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgcGF0Y2gncyBvbmx5IHN0cnVjdHVyYWwgY2hhbmdlIHdhc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwZW5kaW5nIGl0ZW1zIHRvIHRoZSB0YWlsIG9mIG9uZSBsaXN0ICh0cmFja2VkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBieSBwYXRjaEFuYWx5c2lzLnRhaWxBcHBlbmRzKSwgdGhlIHByZS1leGlzdGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hpbGRyZW4ga2VwdCB0aGVpciBwb3NpdGlvbnMgYW5kIGlkZW50aXRpZXMuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDb21wdXRlIHBhdGhzIG9ubHkgZm9yIHRoZSBuZXcgdGFpbCBzbGljZSBpbnN0ZWFkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiByZS1jcmF3bGluZyB0aGUgd2hvbGUgYXJyYXkgLSB0aGUgZG9taW5hbnQgY29zdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgYSByZXBlYXRlZCBQYXRjaCgpLmFwcGVuZCgpIGludG8gYSBsYXJnZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udGFpbmVyLiBgbG9jYXRpb25gIHBvaW50cyBhdCB0aGUgZ3Jvd24gbGlzdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIG1heSBiZSBuZXN0ZWQgKGBbXWAgZm9yIGEgcGxhaW4gYGNoaWxkcmVuYCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBbMCwgJ3Byb3BzJywgJ2NoaWxkcmVuJ11gIGZvciBhIG5lc3RlZCBleHRlbmQpLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3TGlzdCA9IGFwcGVuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYXBwZW5kLmxvY2F0aW9uLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHBhdGgoYXBwZW5kLmxvY2F0aW9uLCBjaGlsZHJlbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjaGlsZHJlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2xkTGlzdCA9IGFwcGVuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYXBwZW5kLmxvY2F0aW9uLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHBhdGgoYXBwZW5kLmxvY2F0aW9uLCBvbGRDaGlsZHJlbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBvbGRDaGlsZHJlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNUYWlsQXBwZW5kID0gISFhcHBlbmQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQuY291bnQgPiAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShuZXdMaXN0KSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkob2xkTGlzdCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMaXN0Lmxlbmd0aCA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkTGlzdC5sZW5ndGggKyBhcHBlbmQuY291bnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXRocyA9IGlzVGFpbEFwcGVuZCAmJiBhcHBlbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGFwcGVuZFBhdGhzKG5ld0xpc3Quc2xpY2Uob2xkTGlzdC5sZW5ndGgpLCBvbGRDaGlsZHJlblBhdGguY29uY2F0KGFwcGVuZC5sb2NhdGlvbiksIG9sZExpc3QubGVuZ3RoLCBvUGF0aHMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjb21wdXRlUGF0aHMoY2hpbGRyZW4sIG9sZENoaWxkcmVuUGF0aCwgb1BhdGhzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKHNldFBhdGhzKHBhdGhzKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXQgY2FsbGJhY2tzIGZvciBuZXcgbGF5b3V0ICh3LyBleGVjdXRpb24gZ3JvdXApXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRDYWxsYmFja3MgPSBjb25jYXQocmVxdWVzdGVkQ2FsbGJhY2tzLCBnZXRMYXlvdXRDYWxsYmFja3MoZ3JhcGhzLCBwYXRocywgY2hpbGRyZW4sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHVua1BhdGg6IG9sZENoaWxkcmVuUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaEFuYWx5c2lzOiBwcm9wQW5hbHlzaXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyUm9vdFxuICAgICAgICAgICAgICAgICAgICAgICAgfSkubWFwKHJjYiA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnJjYixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkZWNlc3NvcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXaWxkY2FyZCBjYWxsYmFja3Mgd2l0aCBhcnJheSBpbnB1dHMgKEFMTCAvIEFMTFNNQUxMRVIpIG5lZWQgdG8gdHJpZ2dlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbiBkdWUgdG8gdGhlIGRlbGV0aW9uIG9mIGNvbXBvbmVudHMuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHRhaWwgYXBwZW5kIG5ldmVyIHJlbW92ZXMgYW55dGhpbmcsIHNvIG9sZENoaWxkcmVuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyB1bmNoYW5nZWQgYW5kIHRoaXMgcGFzcyBjYW4gb25seSBmaW5kIHdoYXQgaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvdW5kIGxhc3QgdGltZSAobm90aGluZyBuZXcpIC0gc2tpcCB0aGUgY3Jhd2wuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzVGFpbEFwcGVuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZENhbGxiYWNrcyA9IGNvbmNhdChyZXF1ZXN0ZWRDYWxsYmFja3MsIGdldExheW91dENhbGxiYWNrcyhncmFwaHMsIG9sZFBhdGhzLCBvbGRDaGlsZHJlbiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVkQXJyYXlJbnB1dHNPbmx5OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXRoczogcGF0aHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rUGF0aDogb2xkQ2hpbGRyZW5QYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJSb290XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkubWFwKHJjYiA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5yY2IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRlY2Vzc29yc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGxldCByZWNvbXB1dGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIFsnY2hpbGRyZW4nXVxuICAgICAgICAgICAgICAgICAgICAgICAgLmNvbmNhdChjaGlsZHJlblByb3BzKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmZvckVhY2goY2hpbGRyZW5Qcm9wID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWNvbXB1dGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuUHJvcC5pbmNsdWRlcygnW10nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFtmcm9udFBhdGhdID0gY2hpbGRyZW5Qcm9wXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zcGxpdCgnW10nKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKHAgPT4gcC5zcGxpdCgnLicpLmZpbHRlcihlID0+IGUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmcm9udE9iaiA9IHBhdGgoZnJvbnRQYXRoLCBhcHBsaWVkUHJvcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZnJvbnRPYmopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDcmF3bCBsYXlvdXQgbmVlZHMgdGhlIG5zL3R5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGNyYXdscyBldmVyeSBwcm9wIG9mIHRoZSBjb21wb25lbnQgYXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmNlLCBzbyB0aGUgYW5hbHlzaXMgb25seSBhcHBsaWVzIGlmIGFsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIHRoZW0gY2FtZSBmcm9tIGEgUGF0Y2hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVQYXRocyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLm9sZE9iaixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLm9sZE9iai5wcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmFwcGxpZWRQcm9wc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgb2xkT2JqLCBiYXNlUGF0aCwga2V5cyhhcHBsaWVkUHJvcHMpLCBhbmFseXNpc0ZvckFsbFByb3BzKHBhdGNoQW5hbHlzaXMsIGtleXMocHJvcHMpKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBkbyBpdCBvbmNlIGZvciB0aGUgY29tcG9uZW50LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29tcHV0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGRyZW5Qcm9wUGF0aCA9IGNoaWxkcmVuUHJvcC5zcGxpdCgnLicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gcGF0aChjaGlsZHJlblByb3BQYXRoLCBhcHBsaWVkUHJvcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2xkQ2hpbGRyZW5QYXRoID0gY29uY2F0KGdldFBhdGgob2xkUGF0aHMsIHBhcnNlZElkKSwgWydwcm9wcyddLmNvbmNhdChjaGlsZHJlblByb3BQYXRoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2xkQ2hpbGRyZW4gPSBwYXRoKG9sZENoaWxkcmVuUGF0aCwgb2xkTGF5b3V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZHJlblByb3BBbmFseXNpcyA9IGFuYWx5c2lzRm9yUHJvcChwYXRjaEFuYWx5c2lzLCBjaGlsZHJlblByb3BQYXRoWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVQYXRocyhjaGlsZHJlbiwgb2xkQ2hpbGRyZW4sIG9sZENoaWxkcmVuUGF0aCwgZmFsc2UsIGNoaWxkcmVuUHJvcEFuYWx5c2lzLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBgdGFpbEFwcGVuZHNgIGxvY2F0aW9ucyBhcmUgcmVsYXRpdmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byB0aGUgdG9wLWxldmVsIHByb3BlcnR5J3MgdmFsdWUsIHNvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNob3J0Y3V0IG9ubHkgYXBwbGllcyB3aGVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYGNoaWxkcmVuYCAqaXMqIHRoYXQgdmFsdWUgKGEgcGxhaW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBgY2hpbGRyZW5gKSwgbm90IGEgZG90dGVkIHN1Yi1wYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGBmaWd1cmUuZGF0YWApIGludG8gaXQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5Qcm9wUGF0aC5sZW5ndGggPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB0YWlsQXBwZW5kKGNoaWxkcmVuUHJvcEFuYWx5c2lzLCBjaGlsZHJlblByb3BQYXRoWzBdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gcGVyc2lzdGVuY2UgZWRnZSBjYXNlOiBpZiB5b3UgZXhwbGljaXRseSB1cGRhdGUgdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIHBlcnNpc3RlbmNlIGtleSwgb3RoZXIgcHJvcHMgbWF5IGNoYW5nZSB0aGF0IHJlcXVpcmUgdXNcbiAgICAgICAgICAgICAgICAgICAgLy8gdG8gZmlyZSBhZGRpdGlvbmFsIGNhbGxiYWNrc1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhZGRlZFByb3BzID0gcGlja0J5KChfLCBrKSA9PiAhKGsgaW4gcHJvcHMpLCBhcHBsaWVkUHJvcHMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzRW1wdHkoYWRkZWRQcm9wcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgZ3JhcGhzOiBjdXJyZW50R3JhcGhzLCBwYXRocyB9ID0gZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZENhbGxiYWNrcyA9IGNvbmNhdChyZXF1ZXN0ZWRDYWxsYmFja3MsIGluY2x1ZGVPYnNlcnZlcnMoaWQsIGFkZGVkUHJvcHMsIGN1cnJlbnRHcmFwaHMsIHBhdGhzKS5tYXAocmNiID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ucmNiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRlY2Vzc29yc1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIEFkZCBpbmZvcm1hdGlvbiBhYm91dCBwb3RlbnRpYWxseSB1cGRhdGVkIG91dHB1dHMgdnMuIHVwZGF0ZWQgb3V0cHV0cyxcbiAgICAgICAgICAgICAgICAvLyB0aGlzIHdpbGwgYmUgdXNlZCB0byBkcm9wIGNhbGxiYWNrcyBmcm9tIGV4ZWN1dGlvbiBncm91cHMgd2hlbiBubyBvdXRwdXRcbiAgICAgICAgICAgICAgICAvLyBtYXRjaGluZyB0aGUgZG93bnN0cmVhbSBjYWxsYmFjaydzIGlucHV0cyB3ZXJlIG1vZGlmaWVkXG4gICAgICAgICAgICAgICAgc3RvcmVkQ2FsbGJhY2tzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAuLi5jYixcbiAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uTWV0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWxsUHJvcHM6IG1hcChjb21iaW5lSWRBbmRQcm9wLCBmbGF0dGVuKGNiLmdldE91dHB1dHMoZ2V0U3RhdGUoKS5wYXRocykpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRQcm9wczogZmxhdHRlbihtYXAoKFtpZCwgdmFsdWVdKSA9PiBtYXAocHJvcGVydHkgPT4gY29tYmluZUlkQW5kUHJvcCh7IGlkLCBwcm9wZXJ0eSB9KSwga2V5cyh2YWx1ZSkpLCB0b1BhaXJzKGRhdGEpKSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZTtcbiAgICAgICAgICAgICAgICBpZiAoY2IuY2FsbGJhY2subm9fb3V0cHV0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHRzID0ga2V5cyhjYi5jaGFuZ2VkUHJvcElkcykuam9pbignLCAnKTtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IGBDYWxsYmFjayBlcnJvciB3aXRoIG5vIG91dHB1dCBmcm9tIGlucHV0ICR7aW5wdHN9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG91dHB1dHMgPSBwYXlsb2FkXG4gICAgICAgICAgICAgICAgICAgICAgICA/IG1hcChjb21iaW5lSWRBbmRQcm9wLCBmbGF0dGVuKFtwYXlsb2FkLm91dHB1dHNdKSkuam9pbignLCAnKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBvdXRwdXQ7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgQ2FsbGJhY2sgZXJyb3IgdXBkYXRpbmcgJHtvdXRwdXRzfWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjbGllbnRzaWRlX2Z1bmN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgbmFtZXNwYWNlOiBucywgZnVuY3Rpb25fbmFtZTogZm4gfSA9IGNsaWVudHNpZGVfZnVuY3Rpb247XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgKz0gYCB2aWEgY2xpZW50c2lkZSBmdW5jdGlvbiAke25zfS4ke2ZufWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGhhbmRsZUFzeW5jRXJyb3IoZXJyb3IsIG1lc3NhZ2UsIGRpc3BhdGNoKTtcbiAgICAgICAgICAgICAgICBzdG9yZWRDYWxsYmFja3MucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIC4uLmNiLFxuICAgICAgICAgICAgICAgICAgICBleGVjdXRpb25NZXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbGxQcm9wczogbWFwKGNvbWJpbmVJZEFuZFByb3AsIGZsYXR0ZW4oY2IuZ2V0T3V0cHV0cyhnZXRTdGF0ZSgpLnBhdGhzKSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZFByb3BzOiBbXVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBkaXNwYXRjaChhZ2dyZWdhdGVDYWxsYmFja3MoW1xuICAgICAgICAgICAgZXhlY3V0ZWQubGVuZ3RoID8gcmVtb3ZlRXhlY3V0ZWRDYWxsYmFja3MoZXhlY3V0ZWQpIDogbnVsbCxcbiAgICAgICAgICAgIGV4ZWN1dGVkLmxlbmd0aCA/IGFkZENvbXBsZXRlZENhbGxiYWNrcyhleGVjdXRlZC5sZW5ndGgpIDogbnVsbCxcbiAgICAgICAgICAgIHN0b3JlZENhbGxiYWNrcy5sZW5ndGhcbiAgICAgICAgICAgICAgICA/IGFkZFN0b3JlZENhbGxiYWNrcyhzdG9yZWRDYWxsYmFja3MpXG4gICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgICAgcmVxdWVzdGVkQ2FsbGJhY2tzLmxlbmd0aFxuICAgICAgICAgICAgICAgID8gYWRkUmVxdWVzdGVkQ2FsbGJhY2tzKHJlcXVlc3RlZENhbGxiYWNrcylcbiAgICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgXSkpO1xuICAgIH0sXG4gICAgaW5wdXRzOiBbJ2NhbGxiYWNrcy5leGVjdXRlZCddXG59O1xuZXhwb3J0IGRlZmF1bHQgb2JzZXJ2ZXI7XG4iLCJpbXBvcnQgeyBhc3NvYywgZmluZCwgcGFydGl0aW9uIH0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IHsgYWRkRXhlY3V0ZWRDYWxsYmFja3MsIGFkZFdhdGNoZWRDYWxsYmFja3MsIGFnZ3JlZ2F0ZUNhbGxiYWNrcywgcmVtb3ZlRXhlY3V0aW5nQ2FsbGJhY2tzLCByZW1vdmVXYXRjaGVkQ2FsbGJhY2tzIH0gZnJvbSAnLi4vYWN0aW9ucy9jYWxsYmFja3MnO1xuaW1wb3J0IHsgZ2V0QXBwU3RhdGUgfSBmcm9tICcuLi9yZWR1Y2Vycy9jb25zdGFudHMnO1xuY29uc3Qgb2JzZXJ2ZXIgPSB7XG4gICAgb2JzZXJ2ZXI6ICh7IGRpc3BhdGNoLCBnZXRTdGF0ZSB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgY2FsbGJhY2tzOiB7IGV4ZWN1dGluZyB9IH0gPSBnZXRTdGF0ZSgpO1xuICAgICAgICBjb25zdCBbZGVmZXJyZWQsIHNraXBwZWRPclJlYWR5XSA9IHBhcnRpdGlvbihjYiA9PiBjYi5leGVjdXRpb25Qcm9taXNlIGluc3RhbmNlb2YgUHJvbWlzZSwgZXhlY3V0aW5nKTtcbiAgICAgICAgZGlzcGF0Y2goYWdncmVnYXRlQ2FsbGJhY2tzKFtcbiAgICAgICAgICAgIGV4ZWN1dGluZy5sZW5ndGggPyByZW1vdmVFeGVjdXRpbmdDYWxsYmFja3MoZXhlY3V0aW5nKSA6IG51bGwsXG4gICAgICAgICAgICBkZWZlcnJlZC5sZW5ndGggPyBhZGRXYXRjaGVkQ2FsbGJhY2tzKGRlZmVycmVkKSA6IG51bGwsXG4gICAgICAgICAgICBza2lwcGVkT3JSZWFkeS5sZW5ndGhcbiAgICAgICAgICAgICAgICA/IGFkZEV4ZWN1dGVkQ2FsbGJhY2tzKHNraXBwZWRPclJlYWR5Lm1hcChjYiA9PiBhc3NvYygnZXhlY3V0aW9uUmVzdWx0JywgY2IuZXhlY3V0aW9uUHJvbWlzZSwgY2IpKSlcbiAgICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgXSkpO1xuICAgICAgICBkZWZlcnJlZC5mb3JFYWNoKGFzeW5jIChjYikgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2IuZXhlY3V0aW9uUHJvbWlzZTtcbiAgICAgICAgICAgIGNvbnN0IHsgY2FsbGJhY2tzOiB7IHdhdGNoZWQgfSwgYXBwTGlmZWN5Y2xlLCBob29rczogeyBjYWxsYmFja19yZXNvbHZlZCB9IH0gPSBnZXRTdGF0ZSgpO1xuICAgICAgICAgICAgaWYgKGFwcExpZmVjeWNsZSAhPT0gZ2V0QXBwU3RhdGUoJ0hZRFJBVEVEJykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY2FsbGJhY2tfcmVzb2x2ZWQpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFja19yZXNvbHZlZChjYi5jYWxsYmFjaywgcmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIGl0J3MgYmVlbiByZW1vdmVkIGZyb20gdGhlIGB3YXRjaGVkYCBsaXN0IHNpbmNlIC0gb24gY2FsbGJhY2sgY29tcGxldGlvbiwgYW5vdGhlciBjYWxsYmFjayBtYXkgYmUgY2FuY2VsbGVkXG4gICAgICAgICAgICAvLyBGaW5kIHRoZSBjYWxsYmFjayBpbnN0YW5jZSBvciBvbmUgdGhhdCBtYXRjaGVzIGl0cyBwcm9taXNlIChlZy4gY291bGQgaGF2ZSBiZWVuIHBydW5lZClcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRDYiA9IGZpbmQoX2NiID0+IF9jYiA9PT0gY2IgfHwgX2NiLmV4ZWN1dGlvblByb21pc2UgPT09IGNiLmV4ZWN1dGlvblByb21pc2UsIHdhdGNoZWQpO1xuICAgICAgICAgICAgaWYgKCFjdXJyZW50Q2IpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBPdGhlcndpc2UgbW92ZSB0byBgZXhlY3V0ZWRgIGFuZCByZW1vdmUgZnJvbSBgd2F0Y2hlZGBcbiAgICAgICAgICAgIGRpc3BhdGNoKGFnZ3JlZ2F0ZUNhbGxiYWNrcyhbXG4gICAgICAgICAgICAgICAgcmVtb3ZlV2F0Y2hlZENhbGxiYWNrcyhbY3VycmVudENiXSksXG4gICAgICAgICAgICAgICAgYWRkRXhlY3V0ZWRDYWxsYmFja3MoW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50Q2IsXG4gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb25SZXN1bHQ6IHJlc3VsdFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgIF0pKTtcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBpbnB1dHM6IFsnY2FsbGJhY2tzLmV4ZWN1dGluZyddXG59O1xuZXhwb3J0IGRlZmF1bHQgb2JzZXJ2ZXI7XG4iLCJpbXBvcnQgeyBnZXRQZW5kaW5nQ2FsbGJhY2tzIH0gZnJvbSAnLi4vdXRpbHMvY2FsbGJhY2tzJztcbmltcG9ydCB7IHNldElzTG9hZGluZyB9IGZyb20gJy4uL2FjdGlvbnMvaXNMb2FkaW5nJztcbmNvbnN0IG9ic2VydmVyID0ge1xuICAgIG9ic2VydmVyOiAoeyBkaXNwYXRjaCwgZ2V0U3RhdGUgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IGNhbGxiYWNrcywgaXNMb2FkaW5nIH0gPSBnZXRTdGF0ZSgpO1xuICAgICAgICBjb25zdCBwZW5kaW5nQ2FsbGJhY2tzID0gZ2V0UGVuZGluZ0NhbGxiYWNrcyhjYWxsYmFja3MpO1xuICAgICAgICAvLyBGaWx0ZXIgb3V0IHBlcnNpc3RlbnQgY2FsbGJhY2tzIC0gdGhleSBzaG91bGRuJ3QgdHJpZ2dlciB0aGUgbG9hZGluZyBpbmRpY2F0b3JcbiAgICAgICAgY29uc3Qgbm9uUGVyc2lzdGVudENhbGxiYWNrcyA9IHBlbmRpbmdDYWxsYmFja3MuZmlsdGVyKGNiID0+ICFjYi5jYWxsYmFjay5wZXJzaXN0ZW50KTtcbiAgICAgICAgY29uc3QgbmV4dCA9IEJvb2xlYW4obm9uUGVyc2lzdGVudENhbGxiYWNrcy5sZW5ndGgpO1xuICAgICAgICBpZiAoaXNMb2FkaW5nICE9PSBuZXh0KSB7XG4gICAgICAgICAgICBkaXNwYXRjaChzZXRJc0xvYWRpbmcobmV4dCkpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBpbnB1dHM6IFsnY2FsbGJhY2tzJ11cbn07XG5leHBvcnQgZGVmYXVsdCBvYnNlcnZlcjtcbiIsImltcG9ydCB7IGZpbmQsIGZsYXR0ZW4sIG1hcCwgcGFydGl0aW9uLCBzb3J0IH0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IHsgYWRkQmxvY2tlZENhbGxiYWNrcywgYWRkRXhlY3V0aW5nQ2FsbGJhY2tzLCBhZ2dyZWdhdGVDYWxsYmFja3MsIGV4ZWN1dGVDYWxsYmFjaywgcmVtb3ZlQmxvY2tlZENhbGxiYWNrcywgcmVtb3ZlUHJpb3JpdGl6ZWRDYWxsYmFja3MgfSBmcm9tICcuLi9hY3Rpb25zL2NhbGxiYWNrcyc7XG5pbXBvcnQgeyBzdHJpbmdpZnlJZCB9IGZyb20gJy4uL2FjdGlvbnMvZGVwZW5kZW5jaWVzJztcbmltcG9ydCB7IGNvbWJpbmVJZEFuZFByb3AgfSBmcm9tICcuLi9hY3Rpb25zL2RlcGVuZGVuY2llc190cyc7XG5pbXBvcnQgaXNBcHBSZWFkeSBmcm9tICcuLi9hY3Rpb25zL2lzQXBwUmVhZHknO1xuaW1wb3J0IHsgTUFYX0NPTkNVUlJFTlRfSFRUUF9DQUxMQkFDS1MsIHVzZXNSZXF1ZXN0U2xvdCB9IGZyb20gJy4vcmVxdWVzdFNsb3QnO1xuaW1wb3J0IHsgZ2V0QXBwU3RhdGUgfSBmcm9tICcuLi9yZWR1Y2Vycy9jb25zdGFudHMnO1xuY29uc3Qgc29ydFByaW9yaXR5ID0gKGMxLCBjMikgPT4ge1xuICAgIHJldHVybiAoYzEucHJpb3JpdHkgPz8gJycpID4gKGMyLnByaW9yaXR5ID8/ICcnKSA/IC0xIDogMTtcbn07XG5jb25zdCBnZXRTdGFzaCA9IChjYiwgcGF0aHMpID0+IHtcbiAgICBjb25zdCB7IGdldE91dHB1dHMgfSA9IGNiO1xuICAgIGNvbnN0IGFsbE91dHB1dHMgPSBnZXRPdXRwdXRzKHBhdGhzKTtcbiAgICBjb25zdCBmbGF0T3V0cHV0cyA9IGZsYXR0ZW4oYWxsT3V0cHV0cyk7XG4gICAgY29uc3QgYWxsUHJvcElkcyA9IFtdO1xuICAgIGNvbnN0IHJlcU91dCA9IHt9O1xuICAgIGZsYXRPdXRwdXRzLmZvckVhY2goKHsgaWQsIHByb3BlcnR5IH0pID0+IHtcbiAgICAgICAgY29uc3QgaWRTdHIgPSBzdHJpbmdpZnlJZChpZCk7XG4gICAgICAgIGNvbnN0IGlkT3V0ID0gKHJlcU91dFtpZFN0cl0gPSByZXFPdXRbaWRTdHJdIHx8IFtdKTtcbiAgICAgICAgaWRPdXQucHVzaChwcm9wZXJ0eSk7XG4gICAgICAgIGFsbFByb3BJZHMucHVzaChjb21iaW5lSWRBbmRQcm9wKHsgaWQ6IGlkU3RyLCBwcm9wZXJ0eSB9KSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHsgYWxsT3V0cHV0cywgYWxsUHJvcElkcyB9O1xufTtcbmNvbnN0IGdldElkcyA9IChjYiwgcGF0aHMpID0+IHtcbiAgICBjb25zdCBpdGVtcyA9IFtcbiAgICAgICAgLi4uZmxhdHRlbihjYi5nZXRJbnB1dHMocGF0aHMpKSxcbiAgICAgICAgLi4uZmxhdHRlbihjYi5nZXRTdGF0ZShwYXRocykpXG4gICAgXTtcbiAgICBjb25zdCB1bmlxdWVJZHMgPSBuZXcgTWFwKGl0ZW1zLm1hcChpdGVtID0+IFtzdHJpbmdpZnlJZChpdGVtLmlkKSwgaXRlbV0pKTtcbiAgICBjb25zdCB1bmlxdWVJdGVtcyA9IEFycmF5LmZyb20odW5pcXVlSWRzLnZhbHVlcygpKTtcbiAgICByZXR1cm4gdW5pcXVlSXRlbXM7XG59O1xuY29uc3Qgb2JzZXJ2ZXIgPSB7XG4gICAgb2JzZXJ2ZXI6IGFzeW5jICh7IGRpc3BhdGNoLCBnZXRTdGF0ZSB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgY2FsbGJhY2tzOiB7IGV4ZWN1dGluZywgd2F0Y2hlZCB9LCBjb25maWcsIGhvb2tzLCBsYXlvdXQsIHBhdGhzLCBhcHBMaWZlY3ljbGUgfSA9IGdldFN0YXRlKCk7XG4gICAgICAgIGxldCB7IGNhbGxiYWNrczogeyBwcmlvcml0aXplZCB9IH0gPSBnZXRTdGF0ZSgpO1xuICAgICAgICBpZiAoYXBwTGlmZWN5Y2xlICE9PSBnZXRBcHBTdGF0ZSgnSFlEUkFURUQnKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIE9ubHkgY2FsbGJhY2tzIGhvbGRpbmcgYW4gaW4tZmxpZ2h0IEhUVFAgcmVxdWVzdCBjb3VudCB0b3dhcmQgdGhlXG4gICAgICAgIC8vIGJ1ZGdldDsgY2xpZW50c2lkZSwgc3RyZWFtaW5nIGFuZCB3ZWJzb2NrZXQtcm91dGVkIG9uZXMgYXJlIGV4ZW1wdC5cbiAgICAgICAgY29uc3QgY291bnRzVG93YXJkID0gKGNiKSA9PiB1c2VzUmVxdWVzdFNsb3QoY2IsIGNvbmZpZyk7XG4gICAgICAgIGNvbnN0IGluRmxpZ2h0ID0gZXhlY3V0aW5nLmZpbHRlcihjb3VudHNUb3dhcmQpLmxlbmd0aCArXG4gICAgICAgICAgICB3YXRjaGVkLmZpbHRlcihjb3VudHNUb3dhcmQpLmxlbmd0aDtcbiAgICAgICAgY29uc3QgYXZhaWxhYmxlID0gTWF0aC5tYXgoMCwgTUFYX0NPTkNVUlJFTlRfSFRUUF9DQUxMQkFDS1MgLSBpbkZsaWdodCk7XG4gICAgICAgIC8vIE9yZGVyIHByaW9yaXRpemVkIGNhbGxiYWNrcyBiYXNlZCBvbiBkZXB0aCBhbmQgYnJlYWR0aCBvZiBjYWxsYmFjayBjaGFpblxuICAgICAgICBwcmlvcml0aXplZCA9IHNvcnQoc29ydFByaW9yaXR5LCBwcmlvcml0aXplZCk7XG4gICAgICAgIC8vIEV4ZW1wdCBjYWxsYmFja3MgYWx3YXlzIGRpc3BhdGNoOyBvbmx5IHJlcXVlc3Qtc2xvdCBjYWxsYmFja3MgYXJlXG4gICAgICAgIC8vIGxpbWl0ZWQgdG8gdGhlIGF2YWlsYWJsZSBidWRnZXQgKHJlYWR5IG9uZXMgZmlyc3QsIGFzIGJlZm9yZSkuXG4gICAgICAgIGNvbnN0IFtidWRnZXRlZCwgZXhlbXB0XSA9IHBhcnRpdGlvbihjb3VudHNUb3dhcmQsIHByaW9yaXRpemVkKTtcbiAgICAgICAgY29uc3QgaXNSZWFkeSA9IChjYikgPT4gaXNBcHBSZWFkeShsYXlvdXQsIHBhdGhzLCBnZXRJZHMoY2IsIHBhdGhzKSkgPT09IHRydWU7XG4gICAgICAgIGNvbnN0IFtidWRnZXRlZFN5bmMsIGJ1ZGdldGVkQXN5bmNdID0gcGFydGl0aW9uKGlzUmVhZHksIGJ1ZGdldGVkKTtcbiAgICAgICAgY29uc3QgcGlja2VkQnVkZ2V0ZWRTeW5jID0gYnVkZ2V0ZWRTeW5jLnNsaWNlKDAsIGF2YWlsYWJsZSk7XG4gICAgICAgIGNvbnN0IHBpY2tlZEJ1ZGdldGVkQXN5bmMgPSBidWRnZXRlZEFzeW5jLnNsaWNlKDAsIGF2YWlsYWJsZSAtIHBpY2tlZEJ1ZGdldGVkU3luYy5sZW5ndGgpO1xuICAgICAgICBjb25zdCBbZXhlbXB0U3luYywgZXhlbXB0QXN5bmNdID0gcGFydGl0aW9uKGlzUmVhZHksIGV4ZW1wdCk7XG4gICAgICAgIC8vIERpdmlkZSBiZXR3ZWVuIHN5bmMgKGNvbXBvbmVudHMgcmVhZHkpIGFuZCBhc3luYyAoZGVmZXJyZWQgdW50aWwgcmVhZHkpXG4gICAgICAgIGNvbnN0IHBpY2tlZFN5bmNDYWxsYmFja3MgPSBbLi4uZXhlbXB0U3luYywgLi4ucGlja2VkQnVkZ2V0ZWRTeW5jXTtcbiAgICAgICAgY29uc3QgcGlja2VkQXN5bmNDYWxsYmFja3MgPSBbLi4uZXhlbXB0QXN5bmMsIC4uLnBpY2tlZEJ1ZGdldGVkQXN5bmNdO1xuICAgICAgICBpZiAocGlja2VkU3luY0NhbGxiYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoKGFnZ3JlZ2F0ZUNhbGxiYWNrcyhbXG4gICAgICAgICAgICAgICAgcmVtb3ZlUHJpb3JpdGl6ZWRDYWxsYmFja3MocGlja2VkU3luY0NhbGxiYWNrcyksXG4gICAgICAgICAgICAgICAgYWRkRXhlY3V0aW5nQ2FsbGJhY2tzKG1hcChjYiA9PiBleGVjdXRlQ2FsbGJhY2soY2IsIGNvbmZpZywgaG9va3MsIHBhdGhzLCBsYXlvdXQsIGdldFN0YXNoKGNiLCBwYXRocyksIGRpc3BhdGNoLCBnZXRTdGF0ZSksIHBpY2tlZFN5bmNDYWxsYmFja3MpKVxuICAgICAgICAgICAgXSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwaWNrZWRBc3luY0NhbGxiYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlZmVycmVkID0gbWFwKGNiID0+ICh7XG4gICAgICAgICAgICAgICAgLi4uY2IsXG4gICAgICAgICAgICAgICAgLi4uZ2V0U3Rhc2goY2IsIHBhdGhzKSxcbiAgICAgICAgICAgICAgICBpc1JlYWR5OiBpc0FwcFJlYWR5KGxheW91dCwgcGF0aHMsIGdldElkcyhjYiwgcGF0aHMpKVxuICAgICAgICAgICAgfSksIHBpY2tlZEFzeW5jQ2FsbGJhY2tzKTtcbiAgICAgICAgICAgIGRpc3BhdGNoKGFnZ3JlZ2F0ZUNhbGxiYWNrcyhbXG4gICAgICAgICAgICAgICAgcmVtb3ZlUHJpb3JpdGl6ZWRDYWxsYmFja3MocGlja2VkQXN5bmNDYWxsYmFja3MpLFxuICAgICAgICAgICAgICAgIGFkZEJsb2NrZWRDYWxsYmFja3MoZGVmZXJyZWQpXG4gICAgICAgICAgICBdKSk7XG4gICAgICAgICAgICBkZWZlcnJlZC5mb3JFYWNoKGFzeW5jIChjYikgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IGNiLmlzUmVhZHk7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBjYWxsYmFja3M6IHsgYmxvY2tlZCB9IH0gPSBnZXRTdGF0ZSgpO1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGl0J3MgYmVlbiByZW1vdmVkIGZyb20gdGhlIGBibG9ja2VkYCBsaXN0IHNpbmNlIC0gb25cbiAgICAgICAgICAgICAgICAvLyBjYWxsYmFjayBjb21wbGV0aW9uLCBhbm90aGVyIGNhbGxiYWNrIG1heSBiZSBjYW5jZWxsZWRcbiAgICAgICAgICAgICAgICAvLyBGaW5kIHRoZSBjYWxsYmFjayBpbnN0YW5jZSBvciBvbmUgdGhhdCBtYXRjaGVzIGl0cyBwcm9taXNlXG4gICAgICAgICAgICAgICAgLy8gKGVnLiBjb3VsZCBoYXZlIGJlZW4gcHJ1bmVkKVxuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRDYiA9IGZpbmQoX2NiID0+IF9jYiA9PT0gY2IgfHwgX2NiLmlzUmVhZHkgPT09IGNiLmlzUmVhZHksIGJsb2NrZWQpO1xuICAgICAgICAgICAgICAgIGlmICghY3VycmVudENiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgZXhlY3V0aW5nQ2FsbGJhY2sgPSBleGVjdXRlQ2FsbGJhY2soY2IsIGNvbmZpZywgaG9va3MsIHBhdGhzLCBsYXlvdXQsIGNiLCBkaXNwYXRjaCwgZ2V0U3RhdGUpO1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoKGFnZ3JlZ2F0ZUNhbGxiYWNrcyhbXG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZUJsb2NrZWRDYWxsYmFja3MoW2NiXSksXG4gICAgICAgICAgICAgICAgICAgIGFkZEV4ZWN1dGluZ0NhbGxiYWNrcyhbZXhlY3V0aW5nQ2FsbGJhY2tdKVxuICAgICAgICAgICAgICAgIF0pKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBpbnB1dHM6IFsnY2FsbGJhY2tzLnByaW9yaXRpemVkJywgJ2NhbGxiYWNrcy5jb21wbGV0ZWQnXVxufTtcbmV4cG9ydCBkZWZhdWx0IG9ic2VydmVyO1xuIiwiaW1wb3J0IHsgaXNXZWJTb2NrZXRBdmFpbGFibGUsIGlzV2ViU29ja2V0RW5hYmxlZCB9IGZyb20gJy4uL3V0aWxzL3dvcmtlckNsaWVudCc7XG4vLyBDYXAgb24gaG93IG1hbnkgY2FsbGJhY2tzIG1heSBoYXZlIGFuIGluLWZsaWdodCBIVFRQIHJlcXVlc3QgdG8gdGhlIHNlcnZlciBhdFxuLy8gb25jZS4gVGhpcyBpcyBOT1QgYSBsaW1pdCBvbiB0b3RhbCBjYWxsYmFja3MgLS0gaXQgb25seSB0aHJvdHRsZXMgdGhlIGZhbi1vdXRcbi8vIG9mIGNvbmN1cnJlbnQgSFRUUCByZXF1ZXN0cyBzbyB0aGUgYnJvd3NlcidzIH42LWNvbm5lY3Rpb25zLXBlci1ob3N0IGNlaWxpbmdcbi8vIGRvZXNuJ3Qgc3RhbGwgdGhlIGFwcCB1bmRlciBhIHdpZGUgY2FsbGJhY2sgZ3JhcGguIENhbGxiYWNrcyB0aGF0IGRvbid0IGhvbGRcbi8vIGFuIEhUVFAgY29ubmVjdGlvbiBmb3IgdGhlaXIgbGlmZXRpbWUgYXJlIGV4ZW1wdCAoc2VlIGB1c2VzUmVxdWVzdFNsb3RgKTpcbi8vIGNsaWVudHNpZGUgY2FsbGJhY2tzIChydW4gaW4tYnJvd3NlciksIHN0cmVhbWluZyBjYWxsYmFja3MgKGxvbmctbGl2ZWQpLCBhbmRcbi8vIGFueXRoaW5nIHJvdXRlZCBvdmVyIHRoZSBtdWx0aXBsZXhlZCBXZWJTb2NrZXQgdHJhbnNwb3J0LlxuZXhwb3J0IGNvbnN0IE1BWF9DT05DVVJSRU5UX0hUVFBfQ0FMTEJBQ0tTID0gMTI7XG4vLyBBIGNhbGxiYWNrIHJpZGVzIHRoZSBtdWx0aXBsZXhlZCBXZWJTb2NrZXQgdHJhbnNwb3J0IChyYXRoZXIgdGhhbiBpdHMgb3duIEhUVFBcbi8vIHJlcXVlc3QpIHdoZW4gd2Vic29ja2V0IGNhbGxiYWNrcyBhcmUgZW5hYmxlZCBnbG9iYWxseSwgb3Igd2hlbiBpdCBvcHRzIGluXG4vLyBwZXItY2FsbGJhY2sgYW5kIHRoZSB0cmFuc3BvcnQgaXMgYXZhaWxhYmxlLiBOZXZlciBmb3IgYmFja2dyb3VuZCBjYWxsYmFja3MsXG4vLyB3aGljaCBhbHdheXMgcG9sbCBvdmVyIEhUVFAuIE1pcnJvcnMgdGhlIHJvdXRpbmcgZGVjaXNpb24gaW4gaGFuZGxlU2VydmVyc2lkZS5cbmV4cG9ydCBjb25zdCByb3V0ZWRPdmVyV2ViU29ja2V0ID0gKGNiLCBjb25maWcpID0+ICFjYi5jYWxsYmFjay5iYWNrZ3JvdW5kICYmXG4gICAgKGlzV2ViU29ja2V0RW5hYmxlZChjb25maWcpIHx8XG4gICAgICAgIChCb29sZWFuKGNiLmNhbGxiYWNrLndlYnNvY2tldCkgJiYgaXNXZWJTb2NrZXRBdmFpbGFibGUoY29uZmlnKSkpO1xuLy8gVHJ1ZSBvbmx5IGZvciBjYWxsYmFja3MgdGhhdCBob2xkIGFuIEhUVFAgY29ubmVjdGlvbiBmb3IgdGhlaXIgbGlmZXRpbWUgLS0gdGhlXG4vLyBvbmx5IG9uZXMgdGhhdCBjb3VudCBhZ2FpbnN0IE1BWF9DT05DVVJSRU5UX0hUVFBfQ0FMTEJBQ0tTLiBDbGllbnRzaWRlXG4vLyBjYWxsYmFja3MgbWFrZSBubyByZXF1ZXN0LCBzdHJlYW1pbmcgY2FsbGJhY2tzIGFyZSBsb25nLWxpdmVkICh0aGV5IG11c3Qgbm90XG4vLyBwaW4gYSBzbG90IGZvciB0aGVpciB3aG9sZSBsaWZlIC0tIHRoYXQgd291bGQgc3RhcnZlIGV2ZXJ5dGhpbmcgZWxzZSxcbi8vIGluY2x1ZGluZyBjbGllbnRzaWRlIGNhbGxiYWNrcyksIGFuZCB3ZWJzb2NrZXQtcm91dGVkIGNhbGxiYWNrcyBzaGFyZSBvbmVcbi8vIHNvY2tldCwgc28gbm9uZSBvZiB0aG9zZSBjb3VudC5cbmV4cG9ydCBjb25zdCB1c2VzUmVxdWVzdFNsb3QgPSAoY2IsIGNvbmZpZykgPT4gIWNiLmNhbGxiYWNrLmNsaWVudHNpZGVfZnVuY3Rpb24gJiZcbiAgICAhY2IuY2FsbGJhY2suc3RyZWFtICYmXG4gICAgIXJvdXRlZE92ZXJXZWJTb2NrZXQoY2IsIGNvbmZpZyk7XG4iLCJpbXBvcnQgeyBhbGwsIGNvbmNhdCwgZGlmZmVyZW5jZSwgZmlsdGVyLCBmbGF0dGVuLCBncm91cEJ5LCBpbmNsdWRlcywgaW50ZXJzZWN0aW9uLCBpc0VtcHR5LCBpc05pbCwgbWFwLCBtZXJnZUxlZnQsIG1lcmdlV2l0aCwgcGx1Y2ssIHJlZHVjZSwgdmFsdWVzIH0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IHsgYWdncmVnYXRlQ2FsbGJhY2tzLCByZW1vdmVQcmlvcml0aXplZENhbGxiYWNrcywgcmVtb3ZlRXhlY3V0aW5nQ2FsbGJhY2tzLCByZW1vdmVXYXRjaGVkQ2FsbGJhY2tzLCBhZGRQcmlvcml0aXplZENhbGxiYWNrcywgYWRkRXhlY3V0aW5nQ2FsbGJhY2tzLCBhZGRXYXRjaGVkQ2FsbGJhY2tzLCByZW1vdmVCbG9ja2VkQ2FsbGJhY2tzLCBhZGRCbG9ja2VkQ2FsbGJhY2tzLCBhZGRSZXF1ZXN0ZWRDYWxsYmFja3MsIHJlbW92ZVJlcXVlc3RlZENhbGxiYWNrcyB9IGZyb20gJy4uL2FjdGlvbnMvY2FsbGJhY2tzJztcbmltcG9ydCB7IGlzTXVsdGlWYWx1ZWQgfSBmcm9tICcuLi9hY3Rpb25zL2RlcGVuZGVuY2llcyc7XG5pbXBvcnQgeyBjb21iaW5lSWRBbmRQcm9wLCBnZXRSZWFkeUNhbGxiYWNrcywgZ2V0VW5pcXVlSWRlbnRpZmllciwgcHJ1bmVDYWxsYmFja3MgfSBmcm9tICcuLi9hY3Rpb25zL2RlcGVuZGVuY2llc190cyc7XG5pbXBvcnQgd2FpdCBmcm9tICcuLy4uL3V0aWxzL3dhaXQnO1xuaW1wb3J0IHsgZ2V0UGVuZGluZ0NhbGxiYWNrcyB9IGZyb20gJy4uL3V0aWxzL2NhbGxiYWNrcyc7XG5jb25zdCBvYnNlcnZlciA9IHtcbiAgICBvYnNlcnZlcjogYXN5bmMgKHsgZGlzcGF0Y2gsIGdldFN0YXRlIH0pID0+IHtcbiAgICAgICAgYXdhaXQgd2FpdCgwKTtcbiAgICAgICAgY29uc3QgeyBjYWxsYmFja3MsIGNhbGxiYWNrczogeyBwcmlvcml0aXplZCwgYmxvY2tlZCwgZXhlY3V0aW5nLCB3YXRjaGVkLCBzdG9yZWQgfSwgcGF0aHMsIGdyYXBocyB9ID0gZ2V0U3RhdGUoKTtcbiAgICAgICAgbGV0IHsgY2FsbGJhY2tzOiB7IHJlcXVlc3RlZCB9IH0gPSBnZXRTdGF0ZSgpO1xuICAgICAgICBjb25zdCBpbml0aWFsUmVxdWVzdGVkID0gcmVxdWVzdGVkLnNsaWNlKDApO1xuICAgICAgICBjb25zdCBwZW5kaW5nQ2FsbGJhY2tzID0gZ2V0UGVuZGluZ0NhbGxiYWNrcyhjYWxsYmFja3MpO1xuICAgICAgICAvKlxuICAgICAgICAgICAgMC4gUHJ1bmUgY2lyY3VsYXIgY2FsbGJhY2tzIHRoYXQgaGF2ZSBjb21wbGV0ZWQgdGhlIGxvb3BcbiAgICAgICAgICAgIC0gY2IuY2FsbGJhY2sgaW5jbHVkZWQgaW4gY2IucHJlZGVjZXNzb3JzXG4gICAgICAgICovXG4gICAgICAgIGNvbnN0IHJDaXJjdWxhcnMgPSBmaWx0ZXIoY2IgPT4gaW5jbHVkZXMoY2IuY2FsbGJhY2ssIGNiLnByZWRlY2Vzc29ycyA/PyBbXSksIHJlcXVlc3RlZCk7XG4gICAgICAgIC8qXG4gICAgICAgICAgICBUT0RPP1xuICAgICAgICAgICAgQ2xlYW4gdXAgdGhlIGByZXF1ZXN0ZWRgIGxpc3QgLSBkdXJpbmcgdGhlIGRpc3BhdGNoIHBoYXNlLFxuICAgICAgICAgICAgY2lyY3VsYXJzIHdpbGwgYmUgcmVtb3ZlZCBmb3IgcmVhbFxuICAgICAgICAqL1xuICAgICAgICByZXF1ZXN0ZWQgPSBkaWZmZXJlbmNlKHJlcXVlc3RlZCwgckNpcmN1bGFycyk7XG4gICAgICAgIC8qXG4gICAgICAgICAgICAxLiBSZW1vdmUgZHVwbGljYXRlZCBgcmVxdWVzdGVkYCBjYWxsYmFja3MgLSBnaXZlIHByZWNlZGVuY2UgdG8gbmV3ZXIgY2FsbGJhY2tzIG92ZXIgb2xkZXIgb25lc1xuICAgICAgICAqL1xuICAgICAgICBsZXQgckR1cGxpY2F0ZXMgPSBbXTtcbiAgICAgICAgY29uc3Qgck1lcmdlZER1cGxpY2F0ZXMgPSBbXTtcbiAgICAgICAgdmFsdWVzKGdyb3VwQnkoZ2V0VW5pcXVlSWRlbnRpZmllciwgcmVxdWVzdGVkKSkuZm9yRWFjaChncm91cCA9PiB7XG4gICAgICAgICAgICBpZiAoZ3JvdXAubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgLy8ga2VlcCBjYWxsYmFjayBpZiBpdHMgdGhlIG9ubHkgb25lIG9mIGl0cyBraW5kXG4gICAgICAgICAgICAgICAgck1lcmdlZER1cGxpY2F0ZXMucHVzaChncm91cFswXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbml0aWFsID0gZ3JvdXAuZmluZChjYiA9PiBjYi5pbml0aWFsQ2FsbCk7XG4gICAgICAgICAgICAgICAgaWYgKGluaXRpYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZHJvcCB0aGUgaW5pdGlhbCBjYWxsYmFjayBpZiBpdCdzIG5vdCBhbG9uZVxuICAgICAgICAgICAgICAgICAgICByRHVwbGljYXRlcy5wdXNoKGluaXRpYWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBncm91cFdpdGhvdXRJbml0aWFsID0gZ3JvdXAuZmlsdGVyKGNiID0+IGNiICE9PSBpbml0aWFsKTtcbiAgICAgICAgICAgICAgICBpZiAoZ3JvdXBXaXRob3V0SW5pdGlhbC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUncyBvbmx5IG9uZSBjYWxsYmFjayBiZXNpZGUgdGhlIGluaXRpYWwgb25lLCBrZWVwIHRoYXQgY2FsbGJhY2tcbiAgICAgICAgICAgICAgICAgICAgck1lcmdlZER1cGxpY2F0ZXMucHVzaChncm91cFdpdGhvdXRJbml0aWFsWzBdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSBtZXJnZSBhbGwgcmVtYWluaW5nIGNhbGxiYWNrcyB0b2dldGhlclxuICAgICAgICAgICAgICAgICAgICByRHVwbGljYXRlcyA9IGNvbmNhdChyRHVwbGljYXRlcywgZ3JvdXBXaXRob3V0SW5pdGlhbCk7XG4gICAgICAgICAgICAgICAgICAgIHJNZXJnZWREdXBsaWNhdGVzLnB1c2gobWVyZ2VMZWZ0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWRQcm9wSWRzOiByZWR1Y2UobWVyZ2VXaXRoKE1hdGgubWF4KSwge30sIHBsdWNrKCdjaGFuZ2VkUHJvcElkcycsIGdyb3VwV2l0aG91dEluaXRpYWwpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkdyb3VwOiBmaWx0ZXIoZXhnID0+IEJvb2xlYW4oZXhnKSwgcGx1Y2soJ2V4ZWN1dGlvbkdyb3VwJywgZ3JvdXBXaXRob3V0SW5pdGlhbCkpLnNsaWNlKC0xKVswXVxuICAgICAgICAgICAgICAgICAgICB9LCBncm91cFdpdGhvdXRJbml0aWFsLnNsaWNlKC0xKVswXSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8qXG4gICAgICAgICAgICBUT0RPP1xuICAgICAgICAgICAgQ2xlYW4gdXAgdGhlIGByZXF1ZXN0ZWRgIGxpc3QgLSBkdXJpbmcgdGhlIGRpc3BhdGNoIHBoYXNlLFxuICAgICAgICAgICAgZHVwbGljYXRlcyB3aWxsIGJlIHJlbW92ZWQgZm9yIHJlYWxcbiAgICAgICAgKi9cbiAgICAgICAgcmVxdWVzdGVkID0gck1lcmdlZER1cGxpY2F0ZXM7XG4gICAgICAgIC8qXG4gICAgICAgICAgICAyLiBSZW1vdmUgZHVwbGljYXRlZCBgcHJpb3JpdGl6ZWRgLCBgZXhlY3V0aW5nYCBhbmQgYHdhdGNoaW5nYCBjYWxsYmFja3NcbiAgICAgICAgKi9cbiAgICAgICAgLypcbiAgICAgICAgICAgIEV4dHJhY3QgYWxsIGJ1dCB0aGUgZmlyc3QgY2FsbGJhY2sgZnJvbSBlYWNoIElPUy1rZXkgZ3JvdXBcbiAgICAgICAgICAgIHRoZXNlIGNhbGxiYWNrcyBhcmUgYHByaW9yaXRpemVkYCBhbmQgZHVwbGljYXRlcy5cbiAgICAgICAgKi9cbiAgICAgICAgY29uc3QgcER1cGxpY2F0ZXMgPSBmbGF0dGVuKG1hcChncm91cCA9PiBncm91cC5zbGljZSgwLCAtMSksIHZhbHVlcyhncm91cEJ5KGdldFVuaXF1ZUlkZW50aWZpZXIsIGNvbmNhdChwcmlvcml0aXplZCwgcmVxdWVzdGVkKSkpKSk7XG4gICAgICAgIGNvbnN0IGJEdXBsaWNhdGVzID0gZmxhdHRlbihtYXAoZ3JvdXAgPT4gZ3JvdXAuc2xpY2UoMCwgLTEpLCB2YWx1ZXMoZ3JvdXBCeShnZXRVbmlxdWVJZGVudGlmaWVyLCBjb25jYXQoYmxvY2tlZCwgcmVxdWVzdGVkKSkpKSk7XG4gICAgICAgIGNvbnN0IGVEdXBsaWNhdGVzID0gZmxhdHRlbihtYXAoZ3JvdXAgPT4gZ3JvdXAuc2xpY2UoMCwgLTEpLCB2YWx1ZXMoZ3JvdXBCeShnZXRVbmlxdWVJZGVudGlmaWVyLCBjb25jYXQoZXhlY3V0aW5nLCByZXF1ZXN0ZWQpKSkpKTtcbiAgICAgICAgY29uc3Qgd0R1cGxpY2F0ZXMgPSBmbGF0dGVuKG1hcChncm91cCA9PiBncm91cC5zbGljZSgwLCAtMSksIHZhbHVlcyhncm91cEJ5KGdldFVuaXF1ZUlkZW50aWZpZXIsIGNvbmNhdCh3YXRjaGVkLCByZXF1ZXN0ZWQpKSkpKTtcbiAgICAgICAgLypcbiAgICAgICAgICAgIDMuIE1vZGlmeSBvciByZW1vdmUgY2FsbGJhY2tzIHRoYXQgYXJlIG91dHB1dHRpbmcgdG8gbm9uLWV4aXN0aW5nIGxheW91dCBgaWRgLlxuICAgICAgICAqL1xuICAgICAgICBjb25zdCB7IGFkZGVkOiByQWRkZWQsIHJlbW92ZWQ6IHJSZW1vdmVkIH0gPSBwcnVuZUNhbGxiYWNrcyhyZXF1ZXN0ZWQsIHBhdGhzKTtcbiAgICAgICAgY29uc3QgeyBhZGRlZDogcEFkZGVkLCByZW1vdmVkOiBwUmVtb3ZlZCB9ID0gcHJ1bmVDYWxsYmFja3MocHJpb3JpdGl6ZWQsIHBhdGhzKTtcbiAgICAgICAgY29uc3QgeyBhZGRlZDogYkFkZGVkLCByZW1vdmVkOiBiUmVtb3ZlZCB9ID0gcHJ1bmVDYWxsYmFja3MoYmxvY2tlZCwgcGF0aHMpO1xuICAgICAgICBjb25zdCB7IGFkZGVkOiBlQWRkZWQsIHJlbW92ZWQ6IGVSZW1vdmVkIH0gPSBwcnVuZUNhbGxiYWNrcyhleGVjdXRpbmcsIHBhdGhzKTtcbiAgICAgICAgY29uc3QgeyBhZGRlZDogd0FkZGVkLCByZW1vdmVkOiB3UmVtb3ZlZCB9ID0gcHJ1bmVDYWxsYmFja3Mod2F0Y2hlZCwgcGF0aHMpO1xuICAgICAgICAvKlxuICAgICAgICAgICAgVE9ETz9cbiAgICAgICAgICAgIENsZWFuIHVwIHRoZSBgcmVxdWVzdGVkYCBsaXN0IC0gZHVyaW5nIHRoZSBkaXNwYXRjaCBwaGFzZSxcbiAgICAgICAgICAgIGl0IHdpbGwgYmUgdXBkYXRlZCBmb3IgcmVhbFxuICAgICAgICAqL1xuICAgICAgICByZXF1ZXN0ZWQgPSBjb25jYXQoZGlmZmVyZW5jZShyZXF1ZXN0ZWQsIHJSZW1vdmVkKSwgckFkZGVkKTtcbiAgICAgICAgLypcbiAgICAgICAgICAgIDQuIEZpbmQgYHJlcXVlc3RlZGAgY2FsbGJhY2tzIHRoYXQgZG8gbm90IGRlcGVuZCBvbiBhIG91dHN0YW5kaW5nIG91dHB1dCAoYXMgZWl0aGVyIGlucHV0IG9yIHN0YXRlKVxuICAgICAgICAqL1xuICAgICAgICBsZXQgcmVhZHlDYWxsYmFja3MgPSBnZXRSZWFkeUNhbGxiYWNrcyhwYXRocywgcmVxdWVzdGVkLCBwZW5kaW5nQ2FsbGJhY2tzLCBncmFwaHMpO1xuICAgICAgICBsZXQgb2xkQmxvY2tlZCA9IFtdO1xuICAgICAgICBsZXQgbmV3QmxvY2tlZCA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogSWYgdGhlcmUgaXMgOlxuICAgICAgICAgKiAtIG5vIHJlYWR5IGNhbGxiYWNrc1xuICAgICAgICAgKiAtIGF0IGxlYXN0IG9uZSByZXF1ZXN0ZWQgY2FsbGJhY2tcbiAgICAgICAgICogLSBubyBhZGRpdGlvbmFsIHBlbmRpbmcgY2FsbGJhY2tzXG4gICAgICAgICAqXG4gICAgICAgICAqIGNhbiBhc3N1bWU6XG4gICAgICAgICAqIC0gdGhlIHJlcXVlc3RlZCBjYWxsYmFja3MgYXJlIHBhcnQgb2YgYSBjaXJjdWxhciBkZXBlbmRlbmN5IGxvb3BcbiAgICAgICAgICpcbiAgICAgICAgICogdGhlbiByZWN1cnNpdmVseTpcbiAgICAgICAgICogLSBhc3N1bWUgdGhlIGZpcnN0IGNhbGxiYWNrIGluIHRoZSBsaXN0IGlzIHJlYWR5ICh0aGUgZW50cnkgcG9pbnQgZm9yIHRoZSBsb29wKVxuICAgICAgICAgKiAtIGNoZWNrIHdoYXQgY2FsbGJhY2tzIGFyZSBibG9ja2VkIC8gcmVhZHkgd2l0aCB0aGUgYXNzdW1wdGlvblxuICAgICAgICAgKiAtIHVwZGF0ZSB0aGUgbWlzc2luZyBwcmVkZWNlc3NvcnMgYmFzZWQgb24gYXNzdW1wdGlvbnNcbiAgICAgICAgICogLSBjb250aW51ZSB1bnRpbCB0aGVyZSBhcmUgbm8gcmVtYWluaW5nIGNhbmRpZGF0ZXNcbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGlmICghcmVhZHlDYWxsYmFja3MubGVuZ3RoICYmXG4gICAgICAgICAgICByZXF1ZXN0ZWQubGVuZ3RoICYmXG4gICAgICAgICAgICByZXF1ZXN0ZWQubGVuZ3RoID09PSBwZW5kaW5nQ2FsbGJhY2tzLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IGNhbmRpZGF0ZXMgPSByZXF1ZXN0ZWQuc2xpY2UoMCk7XG4gICAgICAgICAgICB3aGlsZSAoY2FuZGlkYXRlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAvLyBBc3N1bWUgMXN0IGNhbGxiYWNrIGlzIHJlYWR5IGFuZFxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBjYW5kaWRhdGVzIC8gcmVhZHlDYWxsYmFja3MgYWNjb3JkaW5nbHlcbiAgICAgICAgICAgICAgICBjb25zdCByZWFkeUNhbGxiYWNrID0gY2FuZGlkYXRlc1swXTtcbiAgICAgICAgICAgICAgICByZWFkeUNhbGxiYWNrcy5wdXNoKHJlYWR5Q2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIGNhbmRpZGF0ZXMgPSBjYW5kaWRhdGVzLnNsaWNlKDEpO1xuICAgICAgICAgICAgICAgIC8vIFJlbWFpbmluZyBjYW5kaWRhdGVzIGFyZSBub3QgYmxvY2tlZCBieSBjdXJyZW50IGFzc3VtcHRpb25zXG4gICAgICAgICAgICAgICAgY2FuZGlkYXRlcyA9IGdldFJlYWR5Q2FsbGJhY2tzKHBhdGhzLCBjYW5kaWRhdGVzLCByZWFkeUNhbGxiYWNrcyk7XG4gICAgICAgICAgICAgICAgLy8gQmxvY2tlZCByZXF1ZXN0cyBuZWVkIHRvIG1ha2Ugc3VyZSB0aGV5IGhhdmUgdGhlIGNhbGxiYWNrIGFzIGEgcHJlZGVjZXNzb3JcbiAgICAgICAgICAgICAgICBjb25zdCBibG9ja2VkQnlBc3N1bXB0aW9ucyA9IGRpZmZlcmVuY2UoY2FuZGlkYXRlcywgY2FuZGlkYXRlcyk7XG4gICAgICAgICAgICAgICAgY29uc3QgbW9kaWZpZWQgPSBmaWx0ZXIoY2IgPT4gIWNiLnByZWRlY2Vzc29ycyB8fFxuICAgICAgICAgICAgICAgICAgICAhaW5jbHVkZXMocmVhZHlDYWxsYmFjay5jYWxsYmFjaywgY2IucHJlZGVjZXNzb3JzKSwgYmxvY2tlZEJ5QXNzdW1wdGlvbnMpO1xuICAgICAgICAgICAgICAgIG9sZEJsb2NrZWQgPSBjb25jYXQob2xkQmxvY2tlZCwgbW9kaWZpZWQpO1xuICAgICAgICAgICAgICAgIG5ld0Jsb2NrZWQgPSBjb25jYXQobmV3QmxvY2tlZCwgbW9kaWZpZWQubWFwKGNiID0+ICh7XG4gICAgICAgICAgICAgICAgICAgIC4uLmNiLFxuICAgICAgICAgICAgICAgICAgICBwcmVkZWNlc3NvcnM6IGNvbmNhdChjYi5wcmVkZWNlc3NvcnMgPz8gW10sIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWR5Q2FsbGJhY2suY2FsbGJhY2tcbiAgICAgICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICB9KSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qXG4gICAgICAgICAgICBUT0RPP1xuICAgICAgICAgICAgQ2xlYW4gdXAgdGhlIGByZXF1ZXN0ZWRgIGxpc3QgLSBkdXJpbmcgdGhlIGRpc3BhdGNoIHBoYXNlLFxuICAgICAgICAgICAgaXQgd2lsbCBiZSB1cGRhdGVkIGZvciByZWFsXG4gICAgICAgICovXG4gICAgICAgIHJlcXVlc3RlZCA9IGNvbmNhdChkaWZmZXJlbmNlKHJlcXVlc3RlZCwgb2xkQmxvY2tlZCksIG5ld0Jsb2NrZWQpO1xuICAgICAgICAvKlxuICAgICAgICAgICAgNS4gUHJ1bmUgY2FsbGJhY2tzIHRoYXQgYmVjYW1lIGlycmVsZXZhbnQgaW4gdGhlaXIgYGV4ZWN1dGlvbkdyb3VwYFxuICAgICAgICAqL1xuICAgICAgICAvLyBHcm91cCBieSBleGVjdXRpb25Hcm91cCwgZHJvcCBub24tZXhlY3V0aW9uR3JvdXAgY2FsbGJhY2tzXG4gICAgICAgIC8vIHRob3NlIHdlcmUgbm90IHRyaWdnZXJlZCBieSBsYXlvdXQgY2hhbmdlcyBhbmQgZG9uJ3QgaGF2ZSBcInN0cm9uZ1wiIGludGVyZGVwZW5kZW5jeSBmb3JcbiAgICAgICAgLy8gY2FsbGJhY2sgY2hhaW4gY29tcGxldGlvblxuICAgICAgICBjb25zdCBwZW5kaW5nR3JvdXBzID0gZ3JvdXBCeShjYiA9PiBjYi5leGVjdXRpb25Hcm91cCwgZmlsdGVyKGNiID0+ICFpc05pbChjYi5leGVjdXRpb25Hcm91cCksIHN0b3JlZCkpO1xuICAgICAgICBjb25zdCBkcm9wcGVkID0gZmlsdGVyKGNiID0+IHtcbiAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIG5vIGBzdG9yZWRgIGNhbGxiYWNrIGZvciB0aGUgZ3JvdXAsIG5vIG91dHB1dHMgd2VyZSBkcm9wcGVkIC0+IGBjYmAgaXMga2VwdFxuICAgICAgICAgICAgaWYgKCFjYi5leGVjdXRpb25Hcm91cCB8fFxuICAgICAgICAgICAgICAgICFwZW5kaW5nR3JvdXBzW2NiLmV4ZWN1dGlvbkdyb3VwXSB8fFxuICAgICAgICAgICAgICAgICFwZW5kaW5nR3JvdXBzW2NiLmV4ZWN1dGlvbkdyb3VwXS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBHZXQgYWxsIGlucHV0cyBmb3IgYGNiYFxuICAgICAgICAgICAgY29uc3QgaW5wdXRzID0gbWFwKGNvbWJpbmVJZEFuZFByb3AsIGZsYXR0ZW4oY2IuZ2V0SW5wdXRzKHBhdGhzKSkpO1xuICAgICAgICAgICAgLy8gR2V0IGFsbCB0aGUgcG90ZW50aWFsbHkgdXBkYXRlZCBwcm9wcyBmb3IgdGhlIGdyb3VwIHNvIGZhclxuICAgICAgICAgICAgY29uc3QgYWxsUHJvcHMgPSBmbGF0dGVuKG1hcChnY2IgPT4gZ2NiLmV4ZWN1dGlvbk1ldGEuYWxsUHJvcHMsIHBlbmRpbmdHcm91cHNbY2IuZXhlY3V0aW9uR3JvdXBdKSk7XG4gICAgICAgICAgICAvLyBHZXQgYWxsIHRoZSB1cGRhdGVkIHByb3BzIGZvciB0aGUgZ3JvdXAgc28gZmFyXG4gICAgICAgICAgICBjb25zdCB1cGRhdGVkID0gZmxhdHRlbihtYXAoZ2NiID0+IGdjYi5leGVjdXRpb25NZXRhLnVwZGF0ZWRQcm9wcywgcGVuZGluZ0dyb3Vwc1tjYi5leGVjdXRpb25Hcm91cF0pKTtcbiAgICAgICAgICAgIC8vIElmIHRoZXJlJ3Mgbm8gb3ZlcmxhcCBiZXR3ZWVuIHRoZSB1cGRhdGVkIHByb3BzIGFuZCB0aGUgaW5wdXRzLFxuICAgICAgICAgICAgLy8gKyB0aGVyZSdzIG5vIHByb3BzIHRoYXQgYXJlbid0IGNvdmVyZWQgYnkgdGhlIHBvdGVudGlhbGx5IHVwZGF0ZWQgcHJvcHMsXG4gICAgICAgICAgICAvLyBhbmQgbm90IGFsbCBpbnB1dHMgYXJlIG11bHRpIHZhbHVlZFxuICAgICAgICAgICAgLy8gLT4gZHJvcCBgY2JgXG4gICAgICAgICAgICBjb25zdCByZXMgPSBpc0VtcHR5KGludGVyc2VjdGlvbihpbnB1dHMsIHVwZGF0ZWQpKSAmJlxuICAgICAgICAgICAgICAgIGlzRW1wdHkoZGlmZmVyZW5jZShpbnB1dHMsIGFsbFByb3BzKSkgJiZcbiAgICAgICAgICAgICAgICAhYWxsKGRlcCA9PiBpc011bHRpVmFsdWVkKGRlcCksIGNiLmNhbGxiYWNrLmlucHV0cyk7XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9LCByZWFkeUNhbGxiYWNrcyk7XG4gICAgICAgIC8qXG4gICAgICAgICAgICBUT0RPP1xuICAgICAgICAgICAgQ2xlYW4gdXAgdGhlIGByZXF1ZXN0ZWRgIGxpc3QgLSBkdXJpbmcgdGhlIGRpc3BhdGNoIHBoYXNlLFxuICAgICAgICAgICAgaXQgd2lsbCBiZSB1cGRhdGVkIGZvciByZWFsXG4gICAgICAgICovXG4gICAgICAgIHJlcXVlc3RlZCA9IGRpZmZlcmVuY2UocmVxdWVzdGVkLCBkcm9wcGVkKTtcbiAgICAgICAgcmVhZHlDYWxsYmFja3MgPSBkaWZmZXJlbmNlKHJlYWR5Q2FsbGJhY2tzLCBkcm9wcGVkKTtcbiAgICAgICAgcmVxdWVzdGVkID0gZGlmZmVyZW5jZShyZXF1ZXN0ZWQsIHJlYWR5Q2FsbGJhY2tzKTtcbiAgICAgICAgY29uc3QgYWRkZWQgPSBkaWZmZXJlbmNlKHJlcXVlc3RlZCwgaW5pdGlhbFJlcXVlc3RlZCk7XG4gICAgICAgIGNvbnN0IHJlbW92ZWQgPSBkaWZmZXJlbmNlKGluaXRpYWxSZXF1ZXN0ZWQsIHJlcXVlc3RlZCk7XG4gICAgICAgIGRpc3BhdGNoKGFnZ3JlZ2F0ZUNhbGxiYWNrcyhbXG4gICAgICAgICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0ZWQgY2FsbGJhY2tzXG4gICAgICAgICAgICBhZGRlZC5sZW5ndGggPyBhZGRSZXF1ZXN0ZWRDYWxsYmFja3MoYWRkZWQpIDogbnVsbCxcbiAgICAgICAgICAgIHJlbW92ZWQubGVuZ3RoID8gcmVtb3ZlUmVxdWVzdGVkQ2FsbGJhY2tzKHJlbW92ZWQpIDogbnVsbCxcbiAgICAgICAgICAgIC8vIENsZWFuIHVwIGR1cGxpY2F0ZWQgY2FsbGJhY2tzXG4gICAgICAgICAgICBwRHVwbGljYXRlcy5sZW5ndGhcbiAgICAgICAgICAgICAgICA/IHJlbW92ZVByaW9yaXRpemVkQ2FsbGJhY2tzKHBEdXBsaWNhdGVzKVxuICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgIGJEdXBsaWNhdGVzLmxlbmd0aCA/IHJlbW92ZUJsb2NrZWRDYWxsYmFja3MoYkR1cGxpY2F0ZXMpIDogbnVsbCxcbiAgICAgICAgICAgIGVEdXBsaWNhdGVzLmxlbmd0aFxuICAgICAgICAgICAgICAgID8gcmVtb3ZlRXhlY3V0aW5nQ2FsbGJhY2tzKGVEdXBsaWNhdGVzKVxuICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgIHdEdXBsaWNhdGVzLmxlbmd0aCA/IHJlbW92ZVdhdGNoZWRDYWxsYmFja3Mod0R1cGxpY2F0ZXMpIDogbnVsbCxcbiAgICAgICAgICAgIC8vIFBydW5lIGNhbGxiYWNrc1xuICAgICAgICAgICAgcFJlbW92ZWQubGVuZ3RoID8gcmVtb3ZlUHJpb3JpdGl6ZWRDYWxsYmFja3MocFJlbW92ZWQpIDogbnVsbCxcbiAgICAgICAgICAgIHBBZGRlZC5sZW5ndGggPyBhZGRQcmlvcml0aXplZENhbGxiYWNrcyhwQWRkZWQpIDogbnVsbCxcbiAgICAgICAgICAgIGJSZW1vdmVkLmxlbmd0aCA/IHJlbW92ZUJsb2NrZWRDYWxsYmFja3MoYlJlbW92ZWQpIDogbnVsbCxcbiAgICAgICAgICAgIGJBZGRlZC5sZW5ndGggPyBhZGRCbG9ja2VkQ2FsbGJhY2tzKGJBZGRlZCkgOiBudWxsLFxuICAgICAgICAgICAgZVJlbW92ZWQubGVuZ3RoID8gcmVtb3ZlRXhlY3V0aW5nQ2FsbGJhY2tzKGVSZW1vdmVkKSA6IG51bGwsXG4gICAgICAgICAgICBlQWRkZWQubGVuZ3RoID8gYWRkRXhlY3V0aW5nQ2FsbGJhY2tzKGVBZGRlZCkgOiBudWxsLFxuICAgICAgICAgICAgd1JlbW92ZWQubGVuZ3RoID8gcmVtb3ZlV2F0Y2hlZENhbGxiYWNrcyh3UmVtb3ZlZCkgOiBudWxsLFxuICAgICAgICAgICAgd0FkZGVkLmxlbmd0aCA/IGFkZFdhdGNoZWRDYWxsYmFja3Mod0FkZGVkKSA6IG51bGwsXG4gICAgICAgICAgICAvLyBQcm9tb3RlIGNhbGxiYWNrc1xuICAgICAgICAgICAgcmVhZHlDYWxsYmFja3MubGVuZ3RoXG4gICAgICAgICAgICAgICAgPyBhZGRQcmlvcml0aXplZENhbGxiYWNrcyhyZWFkeUNhbGxiYWNrcylcbiAgICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgXSkpO1xuICAgIH0sXG4gICAgaW5wdXRzOiBbJ2NhbGxiYWNrcy5yZXF1ZXN0ZWQnLCAnY2FsbGJhY2tzLmNvbXBsZXRlZCddXG59O1xuZXhwb3J0IGRlZmF1bHQgb2JzZXJ2ZXI7XG4iLCJpbXBvcnQgeyBjb25jYXQsIGZpbHRlciwgZ3JvdXBCeSwgaXNOaWwsIHBhcnRpdGlvbiwgcmVkdWNlLCB0b1BhaXJzIH0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IHsgYWdncmVnYXRlQ2FsbGJhY2tzLCByZW1vdmVTdG9yZWRDYWxsYmFja3MgfSBmcm9tICcuLi9hY3Rpb25zL2NhbGxiYWNrcyc7XG5pbXBvcnQgeyBnZXRQZW5kaW5nQ2FsbGJhY2tzIH0gZnJvbSAnLi4vdXRpbHMvY2FsbGJhY2tzJztcbmNvbnN0IG9ic2VydmVyID0ge1xuICAgIG9ic2VydmVyOiAoeyBkaXNwYXRjaCwgZ2V0U3RhdGUgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IGNhbGxiYWNrcyB9ID0gZ2V0U3RhdGUoKTtcbiAgICAgICAgY29uc3QgcGVuZGluZ0NhbGxiYWNrcyA9IGdldFBlbmRpbmdDYWxsYmFja3MoY2FsbGJhY2tzKTtcbiAgICAgICAgY29uc3QgeyBjYWxsYmFja3M6IHsgc3RvcmVkIH0gfSA9IGdldFN0YXRlKCk7XG4gICAgICAgIGNvbnN0IFtudWxsR3JvdXBDYWxsYmFja3MsIGdyb3VwQ2FsbGJhY2tzXSA9IHBhcnRpdGlvbihjYiA9PiBpc05pbChjYi5leGVjdXRpb25Hcm91cCksIHN0b3JlZCk7XG4gICAgICAgIGNvbnN0IGV4ZWN1dGlvbkdyb3VwcyA9IGdyb3VwQnkoY2IgPT4gY2IuZXhlY3V0aW9uR3JvdXAsIGdyb3VwQ2FsbGJhY2tzKTtcbiAgICAgICAgY29uc3QgcGVuZGluZ0dyb3VwcyA9IGdyb3VwQnkoY2IgPT4gY2IuZXhlY3V0aW9uR3JvdXAsIGZpbHRlcihjYiA9PiAhaXNOaWwoY2IuZXhlY3V0aW9uR3JvdXApLCBwZW5kaW5nQ2FsbGJhY2tzKSk7XG4gICAgICAgIGNvbnN0IGRyb3BwZWQgPSByZWR1Y2UoKHJlcywgW2V4ZWN1dGlvbkdyb3VwLCBleGVjdXRpb25Hcm91cENhbGxiYWNrc10pID0+ICFwZW5kaW5nR3JvdXBzW2V4ZWN1dGlvbkdyb3VwXVxuICAgICAgICAgICAgPyBjb25jYXQocmVzLCBleGVjdXRpb25Hcm91cENhbGxiYWNrcylcbiAgICAgICAgICAgIDogcmVzLCBbXSwgdG9QYWlycyhleGVjdXRpb25Hcm91cHMpKTtcbiAgICAgICAgZGlzcGF0Y2goYWdncmVnYXRlQ2FsbGJhY2tzKFtcbiAgICAgICAgICAgIG51bGxHcm91cENhbGxiYWNrcy5sZW5ndGhcbiAgICAgICAgICAgICAgICA/IHJlbW92ZVN0b3JlZENhbGxiYWNrcyhudWxsR3JvdXBDYWxsYmFja3MpXG4gICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgICAgZHJvcHBlZC5sZW5ndGggPyByZW1vdmVTdG9yZWRDYWxsYmFja3MoZHJvcHBlZCkgOiBudWxsXG4gICAgICAgIF0pKTtcbiAgICB9LFxuICAgIGlucHV0czogWydjYWxsYmFja3Muc3RvcmVkJywgJ2NhbGxiYWNrcy5jb21wbGV0ZWQnXVxufTtcbmV4cG9ydCBkZWZhdWx0IG9ic2VydmVyO1xuIiwiLyoqXG4gKiBPYnNlcnZlciBmb3IgaGFuZGxpbmcgaW5jb21pbmcgV2ViU29ja2V0IG1lc3NhZ2VzIChTRVRfUFJPUFMsIEdFVF9QUk9QU19SRVFVRVNUKS5cbiAqL1xuaW1wb3J0IHsgaGFzLCBwYXRoIH0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IHsgdXBkYXRlUHJvcHMsIG5vdGlmeU9ic2VydmVycywgc2V0UGF0aHMgfSBmcm9tICcuLi9hY3Rpb25zJztcbmltcG9ydCB7IHBhcnNlUGF0Y2hQcm9wcyB9IGZyb20gJy4uL2FjdGlvbnMvcGF0Y2gnO1xuaW1wb3J0IHsgcmVzb2x2ZVByb3BQYXRoIH0gZnJvbSAnLi4vdXRpbHMvcHJvcFBhdGgnO1xuaW1wb3J0IHsgY29tcHV0ZVBhdGhzLCBnZXRQYXRoIH0gZnJvbSAnLi4vYWN0aW9ucy9wYXRocyc7XG5pbXBvcnQgeyBiYXRjaCB9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCB7IGdldFdvcmtlckNsaWVudCB9IGZyb20gJy4uL3V0aWxzL3dvcmtlckNsaWVudCc7XG5pbXBvcnQgeyBhZGRSZXF1ZXN0ZWRDYWxsYmFja3MgfSBmcm9tICcuLi9hY3Rpb25zL2NhbGxiYWNrcyc7XG5pbXBvcnQgeyBtYWtlUmVzb2x2ZWRDYWxsYmFjaywgcmVzb2x2ZURlcHMgfSBmcm9tICcuLi9hY3Rpb25zL2RlcGVuZGVuY2llc190cyc7XG4vKipcbiAqIFBhcnNlIGEgY29tcG9uZW50IElEIHRoYXQgbWF5IGJlIGEgc3RyaW5naWZpZWQgSlNPTiBvYmplY3QuXG4gKiBUaGlzIGhhbmRsZXMgZGljdCBJRHMgbGlrZSAne1wiaW5kZXhcIjowLFwidHlwZVwiOlwib3V0cHV0XCJ9JyB0aGF0IG5lZWRcbiAqIHRvIGJlIHBhcnNlZCBiYWNrIHRvIG9iamVjdHMgZm9yIGdldFBhdGggdG8gd29yayBjb3JyZWN0bHkuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlQ29tcG9uZW50SWQoY29tcG9uZW50SWQpIHtcbiAgICBpZiAoY29tcG9uZW50SWQuc3RhcnRzV2l0aCgneycpICYmIGNvbXBvbmVudElkLmVuZHNXaXRoKCd9JykpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKGNvbXBvbmVudElkKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCB7XG4gICAgICAgICAgICAvLyBOb3QgdmFsaWQgSlNPTiwgcmV0dXJuIGFzLWlzXG4gICAgICAgICAgICByZXR1cm4gY29tcG9uZW50SWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvbXBvbmVudElkO1xufVxuZnVuY3Rpb24gcmVhZFJlcXVlc3RlZFByb3BzKGNvbXBvbmVudFByb3BzLCBwcm9wZXJ0aWVzLCBwcm9wUGF0aCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHByb3BQYXRoID09PSB1bmRlZmluZWQgPyB7fSA6IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgaWYgKCFjb21wb25lbnRQcm9wcykge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHByb3BOYW1lIG9mIHByb3BlcnRpZXMpIHtcbiAgICAgICAgaWYgKHByb3BQYXRoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdFtwcm9wTmFtZV0gPSBjb21wb25lbnRQcm9wc1twcm9wTmFtZV07XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWx1ZSA9IGhhcyhwcm9wTmFtZSwgY29tcG9uZW50UHJvcHMpXG4gICAgICAgICAgICA/IGNvbXBvbmVudFByb3BzW3Byb3BOYW1lXVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIHJlc3VsdFtwcm9wTmFtZV0gPSByZXNvbHZlUHJvcFBhdGgodmFsdWUsIHByb3BQYXRoKSA/PyBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiBJbml0aWFsaXplIHRoZSBXZWJTb2NrZXQgb2JzZXJ2ZXIuXG4gKlxuICogU2V0cyB1cCBoYW5kbGVycyBmb3I6XG4gKiAtIFNFVF9QUk9QUzogVXBkYXRlIGNvbXBvbmVudCBwcm9wcyB3aGVuIHJlY2VpdmVkIGZyb20gc2VydmVyXG4gKiAtIEdFVF9QUk9QU19SRVFVRVNUOiBTZW5kIGN1cnJlbnQgcHJvcCB2YWx1ZXMgYmFjayB0byBzZXJ2ZXJcbiAqXG4gKiBAcGFyYW0gc3RvcmUgUmVkdXggc3RvcmVcbiAqIEBwYXJhbSBjb25maWcgRGFzaCBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbml0aWFsaXplV2ViU29ja2V0KHN0b3JlLCBjb25maWcpIHtcbiAgICAvLyBSZWdpc3RlciB0aGUgb2JzZXJ2ZXIgd2hlbmV2ZXIgdGhlIGJhY2tlbmQgZXhwb3NlcyB3ZWJzb2NrZXRcbiAgICAvLyBpbmZyYXN0cnVjdHVyZS4gVGhlIGhhbmRsZXJzIGJlbG93IGFyZSBzZXQgdXAgaW4gYm90aCBjYXNlcywgYnV0IHRoZVxuICAgIC8vIHNvY2tldCBpcyBvbmx5IG9wZW5lZCBlYWdlcmx5IHdoZW4gd2Vic29ja2V0IGNhbGxiYWNrcyBhcmUgZW5hYmxlZFxuICAgIC8vIGdsb2JhbGx5IChzZWUgdGhlIGVuZCBvZiB0aGlzIGZ1bmN0aW9uKS4gV2hlbiBvbmx5IHBlci1jYWxsYmFja1xuICAgIC8vIHdlYnNvY2tldD1UcnVlIGlzIHVzZWQsIHRoZSBjb25uZWN0aW9uIGlzIG9wZW5lZCBsYXppbHkgb24gZmlyc3QgZGlzcGF0Y2hcbiAgICAvLyAoaGFuZGxlV2Vic29ja2V0Q2FsbGJhY2sgLT4gd29ya2VyQ2xpZW50LmVuc3VyZUNvbm5lY3RlZCkuXG4gICAgY29uc3Qgd3NBdmFpbGFibGUgPSAhIShjb25maWcud2Vic29ja2V0Py51cmwgJiYgY29uZmlnLndlYnNvY2tldD8ud29ya2VyX3VybCk7XG4gICAgaWYgKCF3c0F2YWlsYWJsZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIENoZWNrIGlmIFNoYXJlZFdvcmtlciBpcyBzdXBwb3J0ZWRcbiAgICBpZiAodHlwZW9mIFNoYXJlZFdvcmtlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdTaGFyZWRXb3JrZXIgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGJyb3dzZXIuICcgK1xuICAgICAgICAgICAgJ1dlYlNvY2tldCBjYWxsYmFja3Mgd2lsbCBmYWxsIGJhY2sgdG8gSFRUUC4nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB3b3JrZXJDbGllbnQgPSBnZXRXb3JrZXJDbGllbnQoKTtcbiAgICAvLyBIZWxwZXIgdG8gcHJvY2VzcyBhIHNpbmdsZSBzZXRfcHJvcHMgcGF5bG9hZFxuICAgIGNvbnN0IHByb2Nlc3NTZXRQcm9wcyA9IChwYXlsb2FkKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgY29tcG9uZW50SWQsIHByb3BzOiByYXdQcm9wcyB9ID0gcGF5bG9hZDtcbiAgICAgICAgY29uc3QgcGFyc2VkSWQgPSBwYXJzZUNvbXBvbmVudElkKGNvbXBvbmVudElkKTtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBzdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICBjb25zdCBjb21wb25lbnRQYXRoID0gZ2V0UGF0aChzdGF0ZS5wYXRocywgcGFyc2VkSWQpO1xuICAgICAgICBpZiAoIWNvbXBvbmVudFBhdGgpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgU0VUX1BST1BTOiBDb21wb25lbnQgJHtjb21wb25lbnRJZH0gbm90IGZvdW5kIGluIGxheW91dGApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEdldCBvbGQgY29tcG9uZW50IGZvciBQYXRjaCBwcm9jZXNzaW5nIGFuZCBwYXRoIHJlY29tcHV0YXRpb25cbiAgICAgICAgY29uc3Qgb2xkQ29tcG9uZW50ID0gcGF0aChjb21wb25lbnRQYXRoLCBzdGF0ZS5sYXlvdXQpO1xuICAgICAgICBjb25zdCBvbGRQcm9wcyA9IChvbGRDb21wb25lbnQ/LnByb3BzIHx8IHt9KTtcbiAgICAgICAgLy8gUHJvY2VzcyBwcm9wcyB0byBoYW5kbGUgUGF0Y2ggb2JqZWN0c1xuICAgICAgICBjb25zdCBwcm9jZXNzZWRQcm9wcyA9IHBhcnNlUGF0Y2hQcm9wcyhyYXdQcm9wcywgb2xkUHJvcHMpO1xuICAgICAgICAvLyBVcGRhdGUgdGhlIGNvbXBvbmVudCBwcm9wc1xuICAgICAgICBzdG9yZS5kaXNwYXRjaCh1cGRhdGVQcm9wcyh7XG4gICAgICAgICAgICBwcm9wczogcHJvY2Vzc2VkUHJvcHMsXG4gICAgICAgICAgICBpdGVtcGF0aDogY29tcG9uZW50UGF0aCxcbiAgICAgICAgICAgIHJlbmRlclR5cGU6ICd3ZWJzb2NrZXQnXG4gICAgICAgIH0pKTtcbiAgICAgICAgLy8gTm90aWZ5IG9ic2VydmVyc1xuICAgICAgICBzdG9yZS5kaXNwYXRjaChub3RpZnlPYnNlcnZlcnMoeyBpZDogcGFyc2VkSWQsIHByb3BzOiBwcm9jZXNzZWRQcm9wcyB9KSk7XG4gICAgICAgIC8vIFJlY29tcHV0ZSBwYXRocyBmb3IgYW55IG5ldyBjaGlsZCBjb21wb25lbnRzXG4gICAgICAgIGlmIChvbGRDb21wb25lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRTdGF0ZSA9IHN0b3JlLmdldFN0YXRlKCk7XG4gICAgICAgICAgICBzdG9yZS5kaXNwYXRjaChzZXRQYXRocyhjb21wdXRlUGF0aHMoe1xuICAgICAgICAgICAgICAgIC4uLm9sZENvbXBvbmVudCxcbiAgICAgICAgICAgICAgICBwcm9wczogeyAuLi5vbGRQcm9wcywgLi4ucHJvY2Vzc2VkUHJvcHMgfVxuICAgICAgICAgICAgfSwgWy4uLmNvbXBvbmVudFBhdGhdLCB1cGRhdGVkU3RhdGUucGF0aHMsIHVwZGF0ZWRTdGF0ZS5wYXRocy5ldmVudHMpKSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8vIEhhbmRsZSBzaW5nbGUgU0VUX1BST1BTIG1lc3NhZ2VcbiAgICB3b3JrZXJDbGllbnQub25TZXRQcm9wcyA9IHByb2Nlc3NTZXRQcm9wcztcbiAgICAvLyBIYW5kbGUgYmF0Y2hlZCBTRVRfUFJPUFNfQkFUQ0ggbWVzc2FnZVxuICAgIHdvcmtlckNsaWVudC5vblNldFByb3BzQmF0Y2ggPSAocGF5bG9hZHMpID0+IHtcbiAgICAgICAgYmF0Y2goKCkgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCBwYXlsb2FkIG9mIHBheWxvYWRzKSB7XG4gICAgICAgICAgICAgICAgcHJvY2Vzc1NldFByb3BzKHBheWxvYWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8vIEhhbmRsZSBHRVRfUFJPUFNfUkVRVUVTVCBtZXNzYWdlc1xuICAgIHdvcmtlckNsaWVudC5vbkdldFByb3BzUmVxdWVzdCA9IChyZXF1ZXN0SWQsIHBheWxvYWQpID0+IHtcbiAgICAgICAgY29uc3QgeyBjb21wb25lbnRJZCwgcHJvcGVydGllcywgcGF0aDogcHJvcFBhdGggfSA9IHBheWxvYWQ7XG4gICAgICAgIGNvbnN0IHBhcnNlZElkID0gcGFyc2VDb21wb25lbnRJZChjb21wb25lbnRJZCk7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gc3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50UGF0aCA9IGdldFBhdGgoc3RhdGUucGF0aHMsIHBhcnNlZElkKTtcbiAgICAgICAgbGV0IGNvbXBvbmVudFByb3BzO1xuICAgICAgICBpZiAoY29tcG9uZW50UGF0aCkge1xuICAgICAgICAgICAgY29tcG9uZW50UHJvcHMgPSBwYXRoKFsuLi5jb21wb25lbnRQYXRoLCAncHJvcHMnXSwgc3RhdGUubGF5b3V0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgR0VUX1BST1BTX1JFUVVFU1Q6IENvbXBvbmVudCAke2NvbXBvbmVudElkfSBub3QgZm91bmQgaW4gbGF5b3V0YCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2VuZCB0aGUgcmVzcG9uc2VcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcmVhZFJlcXVlc3RlZFByb3BzKGNvbXBvbmVudFByb3BzLCBwcm9wZXJ0aWVzLCBwcm9wUGF0aCk7XG4gICAgICAgIHdvcmtlckNsaWVudC5zZW5kR2V0UHJvcHNSZXNwb25zZShyZXF1ZXN0SWQsIHJlc3VsdCk7XG4gICAgfTtcbiAgICAvLyBUcmFjayBjb25uZWN0aW9uIHN0YXRlIGZvciByZWNvbm5lY3Rpb24gaGFuZGxpbmdcbiAgICBsZXQgd2FzRGlzY29ubmVjdGVkID0gZmFsc2U7XG4gICAgLy8gSGFuZGxlIGNvbm5lY3Rpb24gZXZlbnRzXG4gICAgd29ya2VyQ2xpZW50Lm9uQ29ubmVjdGVkID0gKCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnW0Rhc2hdIFdlYlNvY2tldCBjb25uZWN0ZWQnKTtcbiAgICAgICAgLy8gT24gcmVjb25uZWN0IChub3QgaW5pdGlhbCBjb25uZWN0KSwgcmUtdHJpZ2dlciBwZXJzaXN0ZW50IGNhbGxiYWNrc1xuICAgICAgICBpZiAod2FzRGlzY29ubmVjdGVkKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnW0Rhc2hdIFJlY29ubmVjdGVkIC0gcmUtdHJpZ2dlcmluZyBwZXJzaXN0ZW50IGNhbGxiYWNrcycpO1xuICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSBzdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICAgICAgY29uc3QgeyBncmFwaHMgfSA9IHN0YXRlO1xuICAgICAgICAgICAgaWYgKGdyYXBocz8uY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGVyc2lzdGVudENhbGxiYWNrcyA9IGdyYXBocy5jYWxsYmFja3MucmVkdWNlKChhY2MsIGNiKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgcmUtdHJpZ2dlciBuby1vdXRwdXQgY2FsbGJhY2tzIHdpdGggbm8gaW5wdXRzXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZXNlIGFyZSB0aGUgXCJwZXJzaXN0ZW50XCIgY2FsbGJhY2tzIHRoYXQgc2hvdWxkIHJlc3RhcnRcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNiLm5vT3V0cHV0ICYmIGNiLmlucHV0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkID0gbWFrZVJlc29sdmVkQ2FsbGJhY2soY2IsIHJlc29sdmVEZXBzKCksICcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVkLmluaXRpYWxDYWxsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjYy5wdXNoKHJlc29sdmVkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgICAgICAgIH0sIFtdKTtcbiAgICAgICAgICAgICAgICBpZiAocGVyc2lzdGVudENhbGxiYWNrcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBbRGFzaF0gUmUtdHJpZ2dlcmluZyAke3BlcnNpc3RlbnRDYWxsYmFja3MubGVuZ3RofSBwZXJzaXN0ZW50IGNhbGxiYWNrKHMpYCk7XG4gICAgICAgICAgICAgICAgICAgIHN0b3JlLmRpc3BhdGNoKGFkZFJlcXVlc3RlZENhbGxiYWNrcyhwZXJzaXN0ZW50Q2FsbGJhY2tzKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICB3b3JrZXJDbGllbnQub25EaXNjb25uZWN0ZWQgPSAocmVhc29uKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBbRGFzaF0gV2ViU29ja2V0IGRpc2Nvbm5lY3RlZDogJHtyZWFzb259YCk7XG4gICAgICAgIHdhc0Rpc2Nvbm5lY3RlZCA9IHRydWU7XG4gICAgfTtcbiAgICB3b3JrZXJDbGllbnQub25FcnJvciA9IChtZXNzYWdlLCBjb2RlKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFtEYXNoXSBXZWJTb2NrZXQgZXJyb3I6ICR7bWVzc2FnZX1gLCBjb2RlKTtcbiAgICB9O1xuICAgIC8vIEhhbmRsZSB0YWIgdmlzaWJpbGl0eSBjaGFuZ2VzLiBPbmx5IHJlY29ubmVjdCBhIHNvY2tldCB0aGF0IHdhc1xuICAgIC8vIHByZXZpb3VzbHkgZXN0YWJsaXNoZWQgKHdhc0Rpc2Nvbm5lY3RlZCk7IG5ldmVyIG9wZW4gdGhlIGZpcnN0IGNvbm5lY3Rpb25cbiAgICAvLyBoZXJlLCBzbyBhcHBzIHdpdGhvdXQgYW4gYWN0aXZlIHdlYnNvY2tldCBjYWxsYmFjayBzdGF5IHNvY2tldC1mcmVlLlxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgIGlmIChkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgPT09ICd2aXNpYmxlJykge1xuICAgICAgICAgICAgaWYgKHdvcmtlckNsaWVudC5jb25uZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBUYWIgdmlzaWJsZSBhbmQgY29ubmVjdGVkIC0gcmVzZXQgaW5hY3Rpdml0eSB0aW1lclxuICAgICAgICAgICAgICAgIHdvcmtlckNsaWVudC5ub3RpZnlUYWJWaXNpYmxlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh3YXNEaXNjb25uZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBUYWIgdmlzaWJsZSBidXQgZHJvcHBlZCAtIHJlY29ubmVjdFxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbRGFzaF0gVGFiIHZpc2libGUsIHJlY29ubmVjdGluZyBXZWJTb2NrZXQuLi4nKTtcbiAgICAgICAgICAgICAgICB3b3JrZXJDbGllbnRcbiAgICAgICAgICAgICAgICAgICAgLmVuc3VyZUNvbm5lY3RlZChjb25maWcpXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaChlcnIgPT4gY29uc29sZS5lcnJvcignW0Rhc2hdIEZhaWxlZCB0byByZWNvbm5lY3Q6JywgZXJyKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICAvLyBPbmx5IG9wZW4gdGhlIHNvY2tldCBlYWdlcmx5IHdoZW4gd2Vic29ja2V0IGNhbGxiYWNrcyBhcmUgZW5hYmxlZFxuICAgIC8vIGdsb2JhbGx5LiBXaXRoIG9ubHkgcGVyLWNhbGxiYWNrIHdlYnNvY2tldD1UcnVlLCB0aGUgaGFuZGxlcnMgYWJvdmUgc3RheVxuICAgIC8vIHJlZ2lzdGVyZWQgYnV0IG5vIHNvY2tldCBpcyBvcGVuZWQgdW50aWwgYSB3ZWJzb2NrZXQgY2FsbGJhY2sgYWN0dWFsbHlcbiAgICAvLyBydW5zIGFuZCBjYWxscyBlbnN1cmVDb25uZWN0ZWQuXG4gICAgaWYgKCFjb25maWcud2Vic29ja2V0Py5lbmFibGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gQ29ubmVjdCB0byB0aGUgd29ya2VyXG4gICAgY29uc3Qgd3NVcmwgPSBidWlsZFdlYlNvY2tldFVybChjb25maWcpO1xuICAgIHRyeSB7XG4gICAgICAgIC8vIGNvbmZpZy53ZWJzb2NrZXQgaXMgZ3VhcmFudGVlZCB0byBleGlzdCBkdWUgdG8gd3NBdmFpbGFibGUgY2hlY2sgYWJvdmVcbiAgICAgICAgYXdhaXQgd29ya2VyQ2xpZW50LmNvbm5lY3QoY29uZmlnLndlYnNvY2tldC53b3JrZXJfdXJsLCB3c1VybCwgY29uZmlnLndlYnNvY2tldC5pbmFjdGl2aXR5X3RpbWVvdXQpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignW0Rhc2hdIEZhaWxlZCB0byBjb25uZWN0IHRvIFdlYlNvY2tldCB3b3JrZXI6JywgZXJyb3IpO1xuICAgIH1cbn1cbi8qKlxuICogQnVpbGQgdGhlIFdlYlNvY2tldCBVUkwgZnJvbSBjb25maWcuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkV2ViU29ja2V0VXJsKGNvbmZpZykge1xuICAgIGlmICghY29uZmlnLndlYnNvY2tldD8udXJsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignV2ViU29ja2V0IFVSTCBub3QgY29uZmlndXJlZCcpO1xuICAgIH1cbiAgICAvLyBDb252ZXJ0IEhUVFAoUykgVVJMIHRvIFdTKFMpXG4gICAgY29uc3Qgd3NQcm90b2NvbCA9IHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCA9PT0gJ2h0dHBzOicgPyAnd3NzOicgOiAnd3M6JztcbiAgICBjb25zdCBob3N0ID0gd2luZG93LmxvY2F0aW9uLmhvc3Q7XG4gICAgLy8gVGhlIGNvbmZpZy53ZWJzb2NrZXQudXJsIGlzIGEgcGF0aCBsaWtlIFwiL19kYXNoLXdzLWNhbGxiYWNrXCJcbiAgICByZXR1cm4gYCR7d3NQcm90b2NvbH0vLyR7aG9zdH0ke2NvbmZpZy53ZWJzb2NrZXQudXJsfWA7XG59XG4vKipcbiAqIERpc2Nvbm5lY3QgZnJvbSB0aGUgV2ViU29ja2V0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlzY29ubmVjdFdlYlNvY2tldCgpIHtcbiAgICBjb25zdCB3b3JrZXJDbGllbnQgPSBnZXRXb3JrZXJDbGllbnQoKTtcbiAgICB3b3JrZXJDbGllbnQuZGlzY29ubmVjdCgpO1xufVxuIiwiaW1wb3J0IHsgYXNzb2MsIGFzc29jUGF0aCwgZGlzc29jIH0gZnJvbSAncmFtZGEnO1xuY29uc3Qgc2V0Sm9iID0gKGpvYiwgc3RhdGUpID0+IGFzc29jKGpvYi5qb2JJZCwgam9iLCBzdGF0ZSk7XG5jb25zdCByZW1vdmVKb2IgPSAoam9iSWQsIHN0YXRlKSA9PiBkaXNzb2Moam9iSWQsIHN0YXRlKTtcbmNvbnN0IHNldE91dGRhdGVkID0gKGpvYklkLCBzdGF0ZSkgPT4gYXNzb2NQYXRoKFtqb2JJZCwgJ291dGRhdGVkJ10sIHRydWUsIHN0YXRlKTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChzdGF0ZSA9IHt9LCBhY3Rpb24pIHtcbiAgICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgICAgIGNhc2UgJ0FERF9DQUxMQkFDS19KT0InOlxuICAgICAgICAgICAgcmV0dXJuIHNldEpvYihhY3Rpb24ucGF5bG9hZCwgc3RhdGUpO1xuICAgICAgICBjYXNlICdSRU1PVkVfQ0FMTEJBQ0tfSk9CJzpcbiAgICAgICAgICAgIHJldHVybiByZW1vdmVKb2IoYWN0aW9uLnBheWxvYWQuam9iSWQsIHN0YXRlKTtcbiAgICAgICAgY2FzZSAnQ0FMTEJBQ0tfSk9CX09VVERBVEVEJzpcbiAgICAgICAgICAgIHJldHVybiBzZXRPdXRkYXRlZChhY3Rpb24ucGF5bG9hZC5qb2JJZCwgc3RhdGUpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IGNvbmNhdCwgZGlmZmVyZW5jZSwgcmVkdWNlIH0gZnJvbSAncmFtZGEnO1xuZXhwb3J0IHZhciBDYWxsYmFja0FjdGlvblR5cGU7XG4oZnVuY3Rpb24gKENhbGxiYWNrQWN0aW9uVHlwZSkge1xuICAgIENhbGxiYWNrQWN0aW9uVHlwZVtcIkFkZEJsb2NrZWRcIl0gPSBcIkNhbGxiYWNrcy5BZGRCbG9ja2VkXCI7XG4gICAgQ2FsbGJhY2tBY3Rpb25UeXBlW1wiQWRkRXhlY3V0ZWRcIl0gPSBcIkNhbGxiYWNrcy5BZGRFeGVjdXRlZFwiO1xuICAgIENhbGxiYWNrQWN0aW9uVHlwZVtcIkFkZEV4ZWN1dGluZ1wiXSA9IFwiQ2FsbGJhY2tzLkFkZEV4ZWN1dGluZ1wiO1xuICAgIENhbGxiYWNrQWN0aW9uVHlwZVtcIkFkZFByaW9yaXRpemVkXCJdID0gXCJDYWxsYmFja3MuQWRkUHJpb3JpdGl6ZWRcIjtcbiAgICBDYWxsYmFja0FjdGlvblR5cGVbXCJBZGRSZXF1ZXN0ZWRcIl0gPSBcIkNhbGxiYWNrcy5BZGRSZXF1ZXN0ZWRcIjtcbiAgICBDYWxsYmFja0FjdGlvblR5cGVbXCJBZGRTdG9yZWRcIl0gPSBcIkNhbGxiYWNrcy5BZGRTdG9yZWRcIjtcbiAgICBDYWxsYmFja0FjdGlvblR5cGVbXCJBZGRXYXRjaGVkXCJdID0gXCJDYWxsYmFja3MuQWRkV2F0Y2hlZFwiO1xuICAgIENhbGxiYWNrQWN0aW9uVHlwZVtcIlJlbW92ZUJsb2NrZWRcIl0gPSBcIkNhbGxiYWNrcy5SZW1vdmVCbG9ja2VkXCI7XG4gICAgQ2FsbGJhY2tBY3Rpb25UeXBlW1wiUmVtb3ZlRXhlY3V0ZWRcIl0gPSBcIkNhbGxiYWNrcy5SZW1vdmVFeGVjdXRlZFwiO1xuICAgIENhbGxiYWNrQWN0aW9uVHlwZVtcIlJlbW92ZUV4ZWN1dGluZ1wiXSA9IFwiQ2FsbGJhY2tzLlJlbW92ZUV4ZWN1dGluZ1wiO1xuICAgIENhbGxiYWNrQWN0aW9uVHlwZVtcIlJlbW92ZVByaW9yaXRpemVkXCJdID0gXCJDYWxsYmFja3MuUmVtb3ZlUHJpb3JpdGl6ZWRcIjtcbiAgICBDYWxsYmFja0FjdGlvblR5cGVbXCJSZW1vdmVSZXF1ZXN0ZWRcIl0gPSBcIkNhbGxiYWNrcy5SZW1vdmVSZXF1ZXN0ZWRcIjtcbiAgICBDYWxsYmFja0FjdGlvblR5cGVbXCJSZW1vdmVTdG9yZWRcIl0gPSBcIkNhbGxiYWNrcy5SZW1vdmVTdG9yZWRcIjtcbiAgICBDYWxsYmFja0FjdGlvblR5cGVbXCJSZW1vdmVXYXRjaGVkXCJdID0gXCJDYWxsYmFja3MuUmVtb3ZlV2F0Y2hlZFwiO1xufSkoQ2FsbGJhY2tBY3Rpb25UeXBlIHx8IChDYWxsYmFja0FjdGlvblR5cGUgPSB7fSkpO1xuZXhwb3J0IHZhciBDYWxsYmFja0FnZ3JlZ2F0ZUFjdGlvblR5cGU7XG4oZnVuY3Rpb24gKENhbGxiYWNrQWdncmVnYXRlQWN0aW9uVHlwZSkge1xuICAgIENhbGxiYWNrQWdncmVnYXRlQWN0aW9uVHlwZVtcIkFkZENvbXBsZXRlZFwiXSA9IFwiQ2FsbGJhY2tzLkNvbXBsZXRlZFwiO1xuICAgIENhbGxiYWNrQWdncmVnYXRlQWN0aW9uVHlwZVtcIkFnZ3JlZ2F0ZVwiXSA9IFwiQ2FsbGJhY2tzLkFnZ3JlZ2F0ZVwiO1xufSkoQ2FsbGJhY2tBZ2dyZWdhdGVBY3Rpb25UeXBlIHx8IChDYWxsYmFja0FnZ3JlZ2F0ZUFjdGlvblR5cGUgPSB7fSkpO1xuY29uc3QgREVGQVVMVF9TVEFURSA9IHtcbiAgICBibG9ja2VkOiBbXSxcbiAgICBleGVjdXRlZDogW10sXG4gICAgZXhlY3V0aW5nOiBbXSxcbiAgICBwcmlvcml0aXplZDogW10sXG4gICAgcmVxdWVzdGVkOiBbXSxcbiAgICBzdG9yZWQ6IFtdLFxuICAgIHdhdGNoZWQ6IFtdLFxuICAgIGNvbXBsZXRlZDogMFxufTtcbmNvbnN0IHRyYW5zZm9ybXMgPSB7XG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5BZGRCbG9ja2VkXTogY29uY2F0LFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuQWRkRXhlY3V0ZWRdOiBjb25jYXQsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5BZGRFeGVjdXRpbmddOiBjb25jYXQsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5BZGRQcmlvcml0aXplZF06IGNvbmNhdCxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLkFkZFJlcXVlc3RlZF06IGNvbmNhdCxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLkFkZFN0b3JlZF06IGNvbmNhdCxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLkFkZFdhdGNoZWRdOiBjb25jYXQsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5SZW1vdmVCbG9ja2VkXTogZGlmZmVyZW5jZSxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLlJlbW92ZUV4ZWN1dGVkXTogZGlmZmVyZW5jZSxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLlJlbW92ZUV4ZWN1dGluZ106IGRpZmZlcmVuY2UsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5SZW1vdmVQcmlvcml0aXplZF06IGRpZmZlcmVuY2UsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5SZW1vdmVSZXF1ZXN0ZWRdOiBkaWZmZXJlbmNlLFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuUmVtb3ZlU3RvcmVkXTogZGlmZmVyZW5jZSxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLlJlbW92ZVdhdGNoZWRdOiBkaWZmZXJlbmNlXG59O1xuY29uc3QgZmllbGRzID0ge1xuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuQWRkQmxvY2tlZF06ICdibG9ja2VkJyxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLkFkZEV4ZWN1dGVkXTogJ2V4ZWN1dGVkJyxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLkFkZEV4ZWN1dGluZ106ICdleGVjdXRpbmcnLFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuQWRkUHJpb3JpdGl6ZWRdOiAncHJpb3JpdGl6ZWQnLFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuQWRkUmVxdWVzdGVkXTogJ3JlcXVlc3RlZCcsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5BZGRTdG9yZWRdOiAnc3RvcmVkJyxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLkFkZFdhdGNoZWRdOiAnd2F0Y2hlZCcsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5SZW1vdmVCbG9ja2VkXTogJ2Jsb2NrZWQnLFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuUmVtb3ZlRXhlY3V0ZWRdOiAnZXhlY3V0ZWQnLFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuUmVtb3ZlRXhlY3V0aW5nXTogJ2V4ZWN1dGluZycsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5SZW1vdmVQcmlvcml0aXplZF06ICdwcmlvcml0aXplZCcsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5SZW1vdmVSZXF1ZXN0ZWRdOiAncmVxdWVzdGVkJyxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLlJlbW92ZVN0b3JlZF06ICdzdG9yZWQnLFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuUmVtb3ZlV2F0Y2hlZF06ICd3YXRjaGVkJ1xufTtcbmNvbnN0IG11dGF0ZUNvbXBsZXRlZCA9IChzdGF0ZSwgYWN0aW9uKSA9PiAoe1xuICAgIC4uLnN0YXRlLFxuICAgIGNvbXBsZXRlZDogc3RhdGUuY29tcGxldGVkICsgYWN0aW9uLnBheWxvYWRcbn0pO1xuY29uc3QgbXV0YXRlQ2FsbGJhY2tzID0gKHN0YXRlLCBhY3Rpb24pID0+IHtcbiAgICBjb25zdCB0cmFuc2Zvcm0gPSB0cmFuc2Zvcm1zW2FjdGlvbi50eXBlXTtcbiAgICBjb25zdCBmaWVsZCA9IGZpZWxkc1thY3Rpb24udHlwZV07XG4gICAgcmV0dXJuICF0cmFuc2Zvcm0gfHwgIWZpZWxkIHx8IGFjdGlvbi5wYXlsb2FkLmxlbmd0aCA9PT0gMFxuICAgICAgICA/IHN0YXRlXG4gICAgICAgIDoge1xuICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICBbZmllbGRdOiB0cmFuc2Zvcm0oc3RhdGVbZmllbGRdLCBhY3Rpb24ucGF5bG9hZClcbiAgICAgICAgfTtcbn07XG5leHBvcnQgZGVmYXVsdCAoc3RhdGUgPSBERUZBVUxUX1NUQVRFLCBhY3Rpb24pID0+IHJlZHVjZSgocywgYSkgPT4ge1xuICAgIGlmIChhID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBzO1xuICAgIH1cbiAgICBlbHNlIGlmIChhLnR5cGUgPT09IENhbGxiYWNrQWdncmVnYXRlQWN0aW9uVHlwZS5BZGRDb21wbGV0ZWQpIHtcbiAgICAgICAgcmV0dXJuIG11dGF0ZUNvbXBsZXRlZChzLCBhKTtcbiAgICB9XG4gICAgcmV0dXJuIG11dGF0ZUNhbGxiYWNrcyhzLCBhKTtcbn0sIHN0YXRlLCBhY3Rpb24udHlwZSA9PT0gQ2FsbGJhY2tBZ2dyZWdhdGVBY3Rpb25UeXBlLkFnZ3JlZ2F0ZVxuICAgID8gYWN0aW9uLnBheWxvYWRcbiAgICA6IFthY3Rpb25dKTtcbiIsImV4cG9ydCB2YXIgSXNMb2FkaW5nQWN0aW9uVHlwZTtcbihmdW5jdGlvbiAoSXNMb2FkaW5nQWN0aW9uVHlwZSkge1xuICAgIElzTG9hZGluZ0FjdGlvblR5cGVbXCJTZXRcIl0gPSBcIklzTG9hZGluZy5TZXRcIjtcbn0pKElzTG9hZGluZ0FjdGlvblR5cGUgfHwgKElzTG9hZGluZ0FjdGlvblR5cGUgPSB7fSkpO1xuY29uc3QgREVGQVVMVF9TVEFURSA9IHRydWU7XG5leHBvcnQgZGVmYXVsdCAoc3RhdGUgPSBERUZBVUxUX1NUQVRFLCBhY3Rpb24pID0+IChhY3Rpb24udHlwZSA9PT0gSXNMb2FkaW5nQWN0aW9uVHlwZS5TZXQgPyBhY3Rpb24ucGF5bG9hZCA6IHN0YXRlKTtcbiIsImltcG9ydCB7IGFzc29jUGF0aCwgaW5jbHVkZXMsIHBhdGhPciB9IGZyb20gJ3JhbWRhJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGxvYWRpbmcoc3RhdGUgPSB7fSwgYWN0aW9uKSB7XG4gICAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgICAgICBjYXNlICdMT0FERUQnOlxuICAgICAgICAgICAgcmV0dXJuIGFjdGlvbi5wYXlsb2FkLnJlZHVjZSgoYWNjLCBsb2FkKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbG9hZFBhdGggPSBbSlNPTi5zdHJpbmdpZnkobG9hZC5wYXRoKV07XG4gICAgICAgICAgICAgICAgY29uc3QgcHJldiA9IHBhdGhPcihbXSwgbG9hZFBhdGgsIGFjYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFzc29jUGF0aChsb2FkUGF0aCwgcHJldi5maWx0ZXIoKGxvYWRpbmcpID0+IGxvYWRpbmcucHJvcGVydHkgIT09IGxvYWQucHJvcGVydHkpLCBhY2MpO1xuICAgICAgICAgICAgfSwgc3RhdGUpO1xuICAgICAgICBjYXNlICdMT0FESU5HJzpcbiAgICAgICAgICAgIHJldHVybiBhY3Rpb24ucGF5bG9hZC5yZWR1Y2UoKGFjYywgbG9hZCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRQYXRoID0gW0pTT04uc3RyaW5naWZ5KGxvYWQucGF0aCldO1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXYgPSBwYXRoT3IoW10sIGxvYWRQYXRoLCBhY2MpO1xuICAgICAgICAgICAgICAgIGlmICghaW5jbHVkZXMobG9hZCwgcHJldikpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZHVwbGljYXRlIG91dHB1dHNcbiAgICAgICAgICAgICAgICAgICAgcHJldi5wdXNoKGxvYWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYXNzb2NQYXRoKGxvYWRQYXRoLCBwcmV2LCBhY2MpO1xuICAgICAgICAgICAgfSwgc3RhdGUpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IG9uY2UgfSBmcm9tICdyYW1kYSc7XG5pbXBvcnQgeyBjcmVhdGVTdG9yZSwgYXBwbHlNaWRkbGV3YXJlIH0gZnJvbSAncmVkdXgnO1xuaW1wb3J0IHRodW5rIGZyb20gJ3JlZHV4LXRodW5rJztcbmltcG9ydCB7IGNyZWF0ZVJlZHVjZXIgfSBmcm9tICcuL3JlZHVjZXJzL3JlZHVjZXInO1xuaW1wb3J0IFN0b3JlT2JzZXJ2ZXIgZnJvbSAnLi9TdG9yZU9ic2VydmVyJztcbmltcG9ydCBkb2N1bWVudFRpdGxlIGZyb20gJy4vb2JzZXJ2ZXJzL2RvY3VtZW50VGl0bGUnO1xuaW1wb3J0IGV4ZWN1dGVkQ2FsbGJhY2tzIGZyb20gJy4vb2JzZXJ2ZXJzL2V4ZWN1dGVkQ2FsbGJhY2tzJztcbmltcG9ydCBleGVjdXRpbmdDYWxsYmFja3MgZnJvbSAnLi9vYnNlcnZlcnMvZXhlY3V0aW5nQ2FsbGJhY2tzJztcbmltcG9ydCBpc0xvYWRpbmcgZnJvbSAnLi9vYnNlcnZlcnMvaXNMb2FkaW5nJztcbmltcG9ydCBwcmlvcml0aXplZENhbGxiYWNrcyBmcm9tICcuL29ic2VydmVycy9wcmlvcml0aXplZENhbGxiYWNrcyc7XG5pbXBvcnQgcmVxdWVzdGVkQ2FsbGJhY2tzIGZyb20gJy4vb2JzZXJ2ZXJzL3JlcXVlc3RlZENhbGxiYWNrcyc7XG5pbXBvcnQgc3RvcmVkQ2FsbGJhY2tzIGZyb20gJy4vb2JzZXJ2ZXJzL3N0b3JlZENhbGxiYWNrcyc7XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZW5kZXJlclN0b3JlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5fX3N0b3JlID0gdGhpcy5pbml0aWFsaXplU3RvcmUoKTtcbiAgICB9XG4gICAgX19zdG9yZTtcbiAgICBnZXQgc3RvcmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9fc3RvcmU7XG4gICAgfVxuICAgIHN0b3JlT2JzZXJ2ZXIgPSBuZXcgU3RvcmVPYnNlcnZlcigpO1xuICAgIHNldE9ic2VydmVycyA9IG9uY2UoKCkgPT4ge1xuICAgICAgICBjb25zdCBvYnNlcnZlID0gdGhpcy5zdG9yZU9ic2VydmVyLm9ic2VydmU7XG4gICAgICAgIC8vIEZJWE1FIFJlbW92ZSBvYnNlcnZlciBwYXR0ZXJuIGFuZCByZWZhY3RvciB0byBzdGFuZGFyZCByZWR1Y2Vycy9hY3Rpb25zL3NlbGVjdG9ycy5cbiAgICAgICAgb2JzZXJ2ZShkb2N1bWVudFRpdGxlKTtcbiAgICAgICAgb2JzZXJ2ZShpc0xvYWRpbmcpO1xuICAgICAgICBvYnNlcnZlKHJlcXVlc3RlZENhbGxiYWNrcyk7XG4gICAgICAgIG9ic2VydmUocHJpb3JpdGl6ZWRDYWxsYmFja3MpO1xuICAgICAgICBvYnNlcnZlKGV4ZWN1dGluZ0NhbGxiYWNrcyk7XG4gICAgICAgIG9ic2VydmUoZXhlY3V0ZWRDYWxsYmFja3MpO1xuICAgICAgICBvYnNlcnZlKHN0b3JlZENhbGxiYWNrcyk7XG4gICAgfSk7XG4gICAgY3JlYXRlQXBwU3RvcmUgPSAocmVkdWNlciwgbWlkZGxld2FyZSkgPT4ge1xuICAgICAgICB0aGlzLl9fc3RvcmUgPSBjcmVhdGVTdG9yZShyZWR1Y2VyLCBtaWRkbGV3YXJlKTtcbiAgICAgICAgdGhpcy5zdG9yZU9ic2VydmVyLnNldFN0b3JlKHRoaXMuX19zdG9yZSk7XG4gICAgICAgIGNvbnN0IGRzID0gKHdpbmRvdy5kYXNoX3N0b3JlcyA9XG4gICAgICAgICAgICB3aW5kb3cuZGFzaF9zdG9yZXMgfHwgW10pO1xuICAgICAgICBpZiAoIWRzLmluY2x1ZGVzKHRoaXMuX19zdG9yZSkpIHtcbiAgICAgICAgICAgIGRzLnB1c2godGhpcy5fX3N0b3JlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldE9ic2VydmVycygpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSBhIFJlZHV4IHN0b3JlIHdpdGggdGh1bmssIHBsdXMgbG9nZ2luZyAob25seSBpbiBkZXZlbG9wbWVudCBtb2RlKSBtaWRkbGV3YXJlXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2Jvb2x9IHJlc2V0OiBkaXNjYXJkIGFueSBwcmV2aW91cyBzdG9yZVxuICAgICAqXG4gICAgICogQHJldHVybnMge1N0b3JlPEdlbmVyaWNTdG9yZUVuaGFuY2VyPn1cbiAgICAgKiAgQW4gaW5pdGlhbGl6ZWQgcmVkdXggc3RvcmUgd2l0aCBtaWRkbGV3YXJlIGFuZCBwb3NzaWJsZSBob3QgcmVsb2FkaW5nIG9mIHJlZHVjZXJzXG4gICAgICovXG4gICAgaW5pdGlhbGl6ZVN0b3JlID0gKHJlc2V0KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLl9fc3RvcmUgJiYgIXJlc2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fX3N0b3JlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlZHVjZXIgPSBjcmVhdGVSZWR1Y2VyKCk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm9jZXNzLWVudlxuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVBcHBTdG9yZShyZWR1Y2VyLCBhcHBseU1pZGRsZXdhcmUodGh1bmspKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIG9ubHkgYXR0YWNoIGxvZ2dlciB0byBtaWRkbGV3YXJlIGluIG5vbi1wcm9kdWN0aW9uIG1vZGVcbiAgICAgICAgICAgIGNvbnN0IHJlZHV4RFRFQyA9IHdpbmRvd1xuICAgICAgICAgICAgICAgIC5fX1JFRFVYX0RFVlRPT0xTX0VYVEVOU0lPTl9DT01QT1NFX187XG4gICAgICAgICAgICBpZiAocmVkdXhEVEVDKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVBcHBTdG9yZShyZWR1Y2VyLCByZWR1eERURUMoeyBhY3Rpb25zRGVueWxpc3Q6IFsncmVsb2FkUmVxdWVzdCddIH0pKGFwcGx5TWlkZGxld2FyZSh0aHVuaykpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlQXBwU3RvcmUocmVkdWNlciwgYXBwbHlNaWRkbGV3YXJlKHRodW5rKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFyZXNldCkge1xuICAgICAgICAgICAgLy8gVE9ETyAtIFByb3RlY3QgdGhpcyB1bmRlciBhIGRlYnVnIG1vZGU/XG4gICAgICAgICAgICB3aW5kb3cuc3RvcmUgPSB0aGlzLl9fc3RvcmU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1vZHVsZS5ob3QpIHtcbiAgICAgICAgICAgIC8vIEVuYWJsZSBob3QgbW9kdWxlIHJlcGxhY2VtZW50IGZvciByZWR1Y2Vyc1xuICAgICAgICAgICAgbW9kdWxlLmhvdC5hY2NlcHQoJy4vcmVkdWNlcnMvcmVkdWNlcicsICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0Um9vdFJlZHVjZXIgPSByZXF1aXJlKCcuL3JlZHVjZXJzL3JlZHVjZXInKS5jcmVhdGVSZWR1Y2VyKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fX3N0b3JlLnJlcGxhY2VSZWR1Y2VyKG5leHRSb290UmVkdWNlcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fX3N0b3JlO1xuICAgIH07XG59XG4iLCJpbXBvcnQgeyBvbWl0LCB2YWx1ZXMgfSBmcm9tICdyYW1kYSc7XG5leHBvcnQgY29uc3QgZ2V0UGVuZGluZ0NhbGxiYWNrcyA9IChzdGF0ZSkgPT4gQXJyYXkoKS5jb25jYXQoLi4udmFsdWVzKG9taXQoWydzdG9yZWQnLCAnY29tcGxldGVkJ10sIHN0YXRlKSkpO1xuIiwiaW1wb3J0IHsgdXBkYXRlUHJvcHMsIG5vdGlmeU9ic2VydmVycywgc2V0UGF0aHMgfSBmcm9tICcuLi9hY3Rpb25zL2luZGV4JztcbmltcG9ydCB7IHBhcnNlUGF0Y2hQcm9wcywgUGF0Y2hCdWlsZGVyIH0gZnJvbSAnLi4vYWN0aW9ucy9wYXRjaCc7XG5pbXBvcnQgeyBjb21wdXRlUGF0aHMsIGdldFBhdGggfSBmcm9tICcuLi9hY3Rpb25zL3BhdGhzJztcbmltcG9ydCB7IGdldENvbXBvbmVudExheW91dCB9IGZyb20gJy4uL3dyYXBwZXIvd3JhcHBpbmcnO1xuaW1wb3J0IHsgZ2V0U3RvcmVzIH0gZnJvbSAnLi9zdG9yZXMnO1xuLyoqXG4gKiBTZXQgdGhlIHByb3BzIG9mIGEgZGFzaCBjb21wb25lbnQgYnkgaWQgb3IgcGF0aC5cbiAqXG4gKiBAcGFyYW0gaWRPclBhdGggUGF0aCBvciBpZCBvZiB0aGUgZGFzaCBjb21wb25lbnQgdG8gdXBkYXRlLlxuICogQHBhcmFtIHByb3BzIFRoZSBwcm9wcyB0byB1cGRhdGUuXG4gKi9cbmZ1bmN0aW9uIHNldF9wcm9wcyhpZE9yUGF0aCwgcHJvcHMpIHtcbiAgICBjb25zdCBkcyA9IGdldFN0b3JlcygpO1xuICAgIGZvciAobGV0IHkgPSAwOyB5IDwgZHMubGVuZ3RoOyB5KyspIHtcbiAgICAgICAgY29uc3QgeyBkaXNwYXRjaCwgZ2V0U3RhdGUgfSA9IGRzW3ldO1xuICAgICAgICBsZXQgY29tcG9uZW50UGF0aDtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBnZXRTdGF0ZSgpO1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoaWRPclBhdGgpKSB7XG4gICAgICAgICAgICBjb21wb25lbnRQYXRoID0gZ2V0UGF0aChzdGF0ZS5wYXRocywgaWRPclBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29tcG9uZW50UGF0aCA9IGlkT3JQYXRoO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9sZENvbXBvbmVudCA9IGdldENvbXBvbmVudExheW91dChjb21wb25lbnRQYXRoLCBzdGF0ZSk7XG4gICAgICAgIC8vIEhhbmRsZSBhbnkgcGF0Y2ggcHJvcHNcbiAgICAgICAgcHJvcHMgPSBwYXJzZVBhdGNoUHJvcHMocHJvcHMsIG9sZENvbXBvbmVudD8ucHJvcHMgfHwge30pO1xuICAgICAgICAvLyBVcGRhdGUgdGhlIHByb3BzXG4gICAgICAgIGRpc3BhdGNoKHVwZGF0ZVByb3BzKHtcbiAgICAgICAgICAgIHByb3BzLFxuICAgICAgICAgICAgaXRlbXBhdGg6IGNvbXBvbmVudFBhdGgsXG4gICAgICAgICAgICByZW5kZXJUeXBlOiAnY2xpZW50c2lkZUFwaSdcbiAgICAgICAgfSkpO1xuICAgICAgICBkaXNwYXRjaChub3RpZnlPYnNlcnZlcnMoeyBpZDogaWRPclBhdGgsIHByb3BzIH0pKTtcbiAgICAgICAgaWYgKCFvbGRDb21wb25lbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBkaXNwYXRjaChzZXRQYXRocyhjb21wdXRlUGF0aHMoe1xuICAgICAgICAgICAgLi4ub2xkQ29tcG9uZW50LFxuICAgICAgICAgICAgcHJvcHM6IHsgLi4ub2xkQ29tcG9uZW50LnByb3BzLCAuLi5wcm9wcyB9XG4gICAgICAgIH0sIFsuLi5jb21wb25lbnRQYXRoXSwgc3RhdGUucGF0aHMsIHN0YXRlLnBhdGhzLmV2ZW50cykpKTtcbiAgICB9XG59XG4vLyBDbGVhbiB1cmwgY29kZSBhZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2JyYWludHJlZS9zYW5pdGl6ZS11cmwvYmxvYi9tYWluL3NyYy9jb25zdGFudHMudHNcbi8vIHRvIGFsbG93IGZvciBkYXRhIHByb3RvY29sLlxuY29uc3QgaW52YWxpZFByb3RvY29scyA9IC9eKFteXFx3XSopKGphdmFzY3JpcHR8dmJzY3JpcHQpL2ltO1xuY29uc3QgbmV3TGluZXMgPSAvJih0YWJ8bmV3bGluZSk7L2dpO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRyb2wtcmVnZXhcbmNvbnN0IGN0cmxDaGFycyA9IC9bXFx1MDAwMC1cXHUwMDFGXFx1MDA3Ri1cXHUwMDlGXFx1MjAwMC1cXHUyMDBEXFx1RkVGRl0vZ2ltO1xuY29uc3QgaHRtbEVudGl0aWVzID0gLyYjKFxcdyspKF5cXHd8Oyk/L2c7XG5jb25zdCBjbGVhbl91cmwgPSAodXJsLCBmYWxsYmFjayA9ICdhYm91dDpibGFuaycpID0+IHtcbiAgICBpZiAodXJsID09PSAnJykge1xuICAgICAgICByZXR1cm4gdXJsO1xuICAgIH1cbiAgICBjb25zdCBjbGVhbmVkID0gdXJsXG4gICAgICAgIC5yZXBsYWNlKG5ld0xpbmVzLCAnJylcbiAgICAgICAgLnJlcGxhY2UoY3RybENoYXJzLCAnJylcbiAgICAgICAgLnJlcGxhY2UoaHRtbEVudGl0aWVzLCAoXywgZGVjKSA9PiBTdHJpbmcuZnJvbUNoYXJDb2RlKGRlYykpXG4gICAgICAgIC50cmltKCk7XG4gICAgaWYgKGludmFsaWRQcm90b2NvbHMudGVzdChjbGVhbmVkKSkge1xuICAgICAgICByZXR1cm4gZmFsbGJhY2s7XG4gICAgfVxuICAgIHJldHVybiB1cmw7XG59O1xuY29uc3QgZGMgPSAod2luZG93LmRhc2hfY2xpZW50c2lkZSA9XG4gICAgd2luZG93LmRhc2hfY2xpZW50c2lkZSB8fCB7fSk7XG5kY1snc2V0X3Byb3BzJ10gPSBzZXRfcHJvcHM7XG5kY1snY2xlYW5fdXJsJ10gPSBkY1snY2xlYW5fdXJsJ10gPT09IHVuZGVmaW5lZCA/IGNsZWFuX3VybCA6IGRjWydjbGVhbl91cmwnXTtcbmRjWydQYXRjaCddID0gUGF0Y2hCdWlsZGVyO1xuIiwiZXhwb3J0IGZ1bmN0aW9uIGxvYWRMaWJyYXJ5KHJlc291cmNlKSB7XG4gICAgbGV0IHByb207XG4gICAgY29uc3QgaGVhZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2hlYWQnKTtcbiAgICBpZiAocmVzb3VyY2UudHlwZSA9PT0gJ19qc19kaXN0Jykge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICAgIGVsZW1lbnQuc3JjID0gcmVzb3VyY2UudXJsO1xuICAgICAgICBlbGVtZW50LmFzeW5jID0gdHJ1ZTtcbiAgICAgICAgcHJvbSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGVsZW1lbnQub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBlbGVtZW50Lm9uZXJyb3IgPSBlcnJvciA9PiByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICAgICAgaGVhZD8uYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHJlc291cmNlLnR5cGUgPT09ICdfY3NzX2Rpc3QnKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7XG4gICAgICAgIGVsZW1lbnQuaHJlZiA9IHJlc291cmNlLnVybDtcbiAgICAgICAgZWxlbWVudC5yZWwgPSAnc3R5bGVzaGVldCc7XG4gICAgICAgIHByb20gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBlbGVtZW50Lm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZWxlbWVudC5vbmVycm9yID0gZXJyb3IgPT4gcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGhlYWQ/LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgIH1cbiAgICByZXR1cm4gcHJvbTtcbn1cbiIsImltcG9ydCB7IGhhcyB9IGZyb20gJ3JhbWRhJztcbmZ1bmN0aW9uIHJlc29sdmVBcnJheUtleSh2YWx1ZSwga2V5KSB7XG4gICAgaWYgKHR5cGVvZiBrZXkgIT09ICdudW1iZXInIHx8ICFOdW1iZXIuaXNTYWZlSW50ZWdlcihrZXkpKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IGluZGV4ID0ga2V5IDwgMCA/IHZhbHVlLmxlbmd0aCArIGtleSA6IGtleTtcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHZhbHVlLmxlbmd0aCB8fCAhaGFzKFN0cmluZyhpbmRleCksIHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWVbaW5kZXhdO1xufVxuZnVuY3Rpb24gcmVzb2x2ZU9iamVjdEtleSh2YWx1ZSwga2V5KSB7XG4gICAgaWYgKHR5cGVvZiBrZXkgIT09ICdzdHJpbmcnIHx8ICFoYXMoa2V5LCB2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlW2tleV07XG59XG4vKipcbiAqIFJlYWQgYSBkaWN0aW9uYXJ5L2xpc3QgbG9jYXRpb24gd2l0aG91dCBjb3B5aW5nIG9yIGNoYW5naW5nIHRoZSBzb3VyY2UgdmFsdWUuXG4gKiBMaWtlIFBhdGNoIGxvY2F0aW9ucywgbmVnYXRpdmUgaW5kaWNlcyBhcmUgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgbGlzdC5cbiAqIFN0cmluZyBrZXlzIHNlbGVjdCBvd24gZGljdGlvbmFyeSBwcm9wZXJ0aWVzOyBpbnRlZ2VycyBzZWxlY3QgbGlzdCBlbnRyaWVzLlxuICogTWlzc2luZyBvciBpbmNvbXBhdGlibGUgbG9jYXRpb25zIHJldHVybiB1bmRlZmluZWQuIEVtcHR5IHBhdGhzIHNlbGVjdCB0aGVcbiAqIGVudGlyZSB2YWx1ZS4gSXRlcmF0aW9uIHRha2VzIE8ocGF0aC5sZW5ndGgpIHRpbWUgYW5kIE8oMSkgZXh0cmEgc3BhY2U7IGl0XG4gKiBuZXZlciB0cmF2ZXJzZXMgc2libGluZ3Mgb3IgY2xvbmVzIHRoZSBzZWxlY3RlZCBzdWJ0cmVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVByb3BQYXRoKHZhbHVlLCBwYXRoKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHBhdGgpKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGxldCBjdXJyZW50ID0gdmFsdWU7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgcGF0aCkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjdXJyZW50KSkge1xuICAgICAgICAgICAgY3VycmVudCA9IHJlc29sdmVBcnJheUtleShjdXJyZW50LCBrZXkpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGN1cnJlbnQgPT09IG51bGwgfHwgdHlwZW9mIGN1cnJlbnQgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnQgPSByZXNvbHZlT2JqZWN0S2V5KGN1cnJlbnQsIGtleSk7XG4gICAgfVxuICAgIHJldHVybiBjdXJyZW50O1xufVxuIiwiLyoqIENhY2hlZCByZW5kZXJlciBJRCBmb3IgdGhpcyBwYWdlIGluc3RhbmNlICovXG5sZXQgY2FjaGVkUmVuZGVyZXJJZCA9IG51bGw7XG4vKipcbiAqIEdlbmVyYXRlIGEgdW5pcXVlIHJlbmRlcmVyIElEIGZvciB0aGlzIHBhZ2UgaW5zdGFuY2UuXG4gKlxuICogRWFjaCBwYWdlIGxvYWQgZ2V0cyBhIGZyZXNoIElEIHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIHN0YWxlXG4gKiBjb25uZWN0aW9ucyBpbiB0aGUgU2hhcmVkV29ya2VyIGFmdGVyIHBhZ2UgcmVsb2Fkcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJlbmRlcmVySWQoKSB7XG4gICAgaWYgKCFjYWNoZWRSZW5kZXJlcklkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY3J5cHRvICE9PSAndW5kZWZpbmVkJyAmJiBjcnlwdG8ucmFuZG9tVVVJRCkge1xuICAgICAgICAgICAgY2FjaGVkUmVuZGVyZXJJZCA9IGNyeXB0by5yYW5kb21VVUlEKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBGYWxsYmFjayBmb3Igb2xkZXIgYnJvd3NlcnNcbiAgICAgICAgICAgIGNhY2hlZFJlbmRlcmVySWQgPSBgJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKClcbiAgICAgICAgICAgICAgICAudG9TdHJpbmcoMzYpXG4gICAgICAgICAgICAgICAgLnNsaWNlKDIpfWA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNhY2hlZFJlbmRlcmVySWQ7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gZ2V0U3RvcmVzKCkge1xuICAgIGNvbnN0IHN0b3JlcyA9ICh3aW5kb3cuZGFzaF9zdG9yZXMgPVxuICAgICAgICB3aW5kb3cuZGFzaF9zdG9yZXMgfHwgW10pO1xuICAgIHJldHVybiBzdG9yZXM7XG59XG4iLCIvKipcbiAqIE11bHRpcGxleGVkIHN0cmVhbWluZyB0cmFuc3BvcnQgZm9yIHN0cmVhbWluZyBjYWxsYmFja3MuXG4gKlxuICogSW5zdGVhZCBvZiBvbmUgbG9uZy1saXZlZCBOREpTT04gY29ubmVjdGlvbiBwZXIgc3RyZWFtaW5nIGNhbGxiYWNrICh3aGljaCBoaXRzXG4gKiB0aGUgYnJvd3NlcidzIH42LWNvbm5lY3Rpb25zLXBlci1ob3N0IGNlaWxpbmcpLCBldmVyeSBzdHJlYW1pbmcgY2FsbGJhY2sgc2hhcmVzXG4gKiBPTkUgZG93bmxpbmsgY29ubmVjdGlvbi4gQSBjYWxsYmFjayBQT1NUcyBpdHMgcmVxdWVzdCAod2hpY2ggcmV0dXJucyBhIGZhc3QgYWNrKVxuICogY2FycnlpbmcgYSByZXF1ZXN0IGlkOyB0aGUgc2VydmVyIHB1bXBzIHRoYXQgY2FsbGJhY2sncyBmcmFtZXMgb250byB0aGVcbiAqIGNvbm5lY3Rpb24ncyBzaGFyZWQtc3RvcmFnZSB0b3BpYzsgdGhlIHNpbmdsZSBkb3dubGluayByZWxheXMgdGhlbSBhbmQgdGhlXG4gKiBjbGllbnQgcm91dGVzIGVhY2ggZnJhbWUgYmFjayB0byB0aGUgcmlnaHQgY2FsbGJhY2sgYnkgcmVxdWVzdCBpZC5cbiAqXG4gKiBUaGUgY29ubmVjdGlvbiBpcyBrZXllZCBzZXJ2ZXItc2lkZSBvbiB0aGUgcGFnZSdzIHNpZ25lZCBlbmRJZCAoc2VudCBhcyBhIHF1ZXJ5XG4gKiBwYXJhbWV0ZXIgb24gZXZlcnkgdXBsaW5rLCBkb3dubGluayBhbmQgY2FuY2VsKSwgbmV2ZXIgb24gYW55dGhpbmcgdGhlIGNsaWVudFxuICogcGlja3MsIHNvIGEgcGFnZSBjYW4gb25seSBldmVyIHJlYWQgb3Igd3JpdGUgaXRzIG93biB0b3BpYy5cbiAqXG4gKiBUd28gaG9zdHMgcnVuIHRoaXMgdHJhbnNwb3J0OlxuICpcbiAqIC0gYFN0cmVhbUNsaWVudGAgb3ducyB0aGUgSFRUUCBzaWRlOiB0aGUgdXBsaW5rIFBPU1RzIGFuZCB0aGUgZG93bmxpbmsgcmVhZFxuICogICBsb29wLiBJdCBydW5zIGluc2lkZSB0aGUgcGFnZSB3aGVuIG5vIHdvcmtlciBpcyBhdmFpbGFibGUuXG4gKiAtIGBTaGFyZWRTdHJlYW1DbGllbnRgIGlzIHRoZSBwYWdlJ3MgcHJveHkgdG8gYSBgU3RyZWFtQ2xpZW50YCBob3N0ZWQgaW4gYVxuICogICBTaGFyZWRXb3JrZXIgKGB3b3JrZXJzL3N0cmVhbVdvcmtlci50c2ApLCBzbyBldmVyeSB0YWIgb2YgdGhlIGJyb3dzZXIgc2hhcmVzXG4gKiAgIG9uZSBkb3dubGluayAtLSB0aGUgcGVyLWhvc3QgY29ubmVjdGlvbiBjYXAgaXMgc2hhcmVkIGFjcm9zcyB0YWJzLCBhbmQgYVxuICogICBkb3dubGluayBwZXIgdGFiIHN0YWxscyB0aGUgc2l4dGggdGFiLiBUaGUgd29ya2VyIHBpbnMgdGhlIGVuZElkIG9mIHRoZVxuICogICBmaXJzdCB0YWIgdGhhdCBzdHJlYW1zIGZvciBhcyBsb25nIGFzIHRoZSBjb25uZWN0aW9uIGhhcyBzdHJlYW1zIGluXG4gKiAgIGZsaWdodCwga2VlcHMgdGhlIGRvd25saW5rIG9wZW4gd2hpbGUgYW55IHRhYiBoYXMgYSBzdHJlYW0sIGFuZCBjYW5jZWxzIGFcbiAqICAgdGFiJ3Mgc3RyZWFtcyBzZXJ2ZXItc2lkZSB3aGVuIHRoYXQgdGFiIGdvZXMgYXdheS5cbiAqXG4gKiBUd28gZG93bmxpbmsgbW9kZXMsIGNob3NlbiBieSB0aGUgc2VydmVyIChjb25maWcuc3RyZWFtLm1vZGUpOlxuICpcbiAqIC0gJ3N0cmVhbScgKEFTR0kpOiBvbmUgbG9uZy1saXZlZCBOREpTT04gcmVzcG9uc2U7IGZyYW1lcyBhcnJpdmUgYXMgcHJvZHVjZWQuXG4gKiAtICdwb2xsJyAoV1NHSSk6IGVhY2ggZG93bmxpbmsgcmVxdWVzdCByZXR1cm5zIHRoZSBmcmFtZXMgcXVldWVkIHNpbmNlIHRoZVxuICogICBjdXJzb3IgYW5kIGVuZHMgYXQgb25jZSwgc28gaXQgaG9sZHMgYSBzZXJ2ZXIgd29ya2VyIHRocmVhZCBmb3JcbiAqICAgbWlsbGlzZWNvbmRzIHJhdGhlciB0aGFuIGZvciB0aGUgd2hvbGUgdmlzaXQuIFRoZSBjbGllbnQgcmUtcG9sbHMgYWZ0ZXJcbiAqICAgYHBvbGxJbnRlcnZhbGAgd2hpbGUgZnJhbWVzIGtlZXAgY29taW5nLCBiYWNrcyBvZmYgdG8gdGVuIHRpbWVzIHRoYXQgd2hpbGVcbiAqICAgcXVpZXQsIGFuZCBwb2xscyBpbW1lZGlhdGVseSB3aGVuIGEgbmV3IHN0cmVhbSBzdGFydHMuXG4gKlxuICogTGlmZWN5Y2xlOiB0aGUgZG93bmxpbmsgb3BlbnMgb25jZSB0aGUgZmlyc3QgdXBsaW5rIGlzIGFja25vd2xlZGdlZCBhbmQgY2xvc2VzXG4gKiB3aGVuIG5vIGFja25vd2xlZGdlZCBjYWxsYmFjayByZW1haW5zIGluIGZsaWdodCAoXCJjb2xsZWN0IHRoZSBkb25lcyB0byBtYXRjaFxuICogdGhlIHJ1bm5pbmdzXCIpLiBXYWl0aW5nIGZvciB0aGUgYWNrIGxldHMgYSBzaW5nbGUgcmVxdWVzdCBzbG90IHNlcnZlIHRoZSB0d29cbiAqIGluIHR1cm47IGZyYW1lcyBwdWJsaXNoZWQgYmVmb3JlIHRoZSBkb3dubGluayBzdWJzY3JpYmVzIGFyZSByZXBsYXllZCBmcm9tXG4gKiB0aGUgY3Vyc29yLiBJZiB0aGUgZG93bmxpbmsgZHJvcHMgd2hpbGUgY2FsbGJhY2tzIGFyZSBzdGlsbCBydW5uaW5nIGl0XG4gKiByZWNvbm5lY3RzLCByZXN1bWluZyBmcm9tIHRoZSBsYXN0IHNlcXVlbmNlIGl0IHNhdywgYmFja2luZyBvZmYgdW50aWwgdGhlXG4gKiBzZXJ2ZXIgaGFzIGJlZW4gdW5yZWFjaGFibGUgZm9yIHRoZSB3aG9sZSByZWNvbm5lY3Qgd2luZG93LlxuICovXG5pbXBvcnQgeyBnZXRSZW5kZXJlcklkIH0gZnJvbSAnLi9yZW5kZXJlcklkJztcbmNvbnN0IERFRkFVTFRfUE9MTF9JTlRFUlZBTCA9IDEwMDtcbi8vIElkbGUgcG9sbHMgc3RheSBhdCB0aGUgaW50ZXJ2YWwgZm9yIHRoaXMgbWFueSBlbXB0eSBwb2xscyAoYSBjYWxsYmFjaydzXG4vLyBuZXh0IGZyYW1lIGlzIHVzdWFsbHkgbW9tZW50cyBhd2F5KSwgdGhlbiBiYWNrIG9mZiBnZW9tZXRyaWNhbGx5IHVwIHRvXG4vLyBNQVhfQkFDS09GRl9GQUNUT1IgdGltZXMgdGhlIGludGVydmFsLiBUd28ga2VlcHMgYSBzdHJlYW0gdGhhdCB5aWVsZHMgZXZlcnlcbi8vIGhhbGYgc2Vjb25kIGF0IGFib3V0IGZvdXIgcG9sbHMgcGVyIGZyYW1lIGluc3RlYWQgb2YgdGVuOyB0aGUgY2FwIGJvdW5kc1xuLy8gdGhlIGxhdGVuY3kgb2YgYSBzbG93IHN0cmVhbSdzIG5leHQgZnJhbWUgc28gY29uc2VjdXRpdmUgZnJhbWVzIHN0aWxsXG4vLyByZW5kZXIgb25lIGF0IGEgdGltZSBpbnN0ZWFkIG9mIGJ1bmNoaW5nIGludG8gb25lIHBvbGwuXG5jb25zdCBFTVBUWV9QT0xMU19CRUZPUkVfQkFDS09GRiA9IDI7XG5jb25zdCBNQVhfQkFDS09GRl9GQUNUT1IgPSA1O1xuY29uc3QgZ2VuSWQgPSAoKSA9PiBgJHtEYXRlLm5vdygpLnRvU3RyaW5nKDM2KX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCAxMCl9YDtcbmNvbnN0IHNsZWVwID0gKG1zKSA9PiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbmV4cG9ydCBjbGFzcyBTdHJlYW1DbGllbnQge1xuICAgIC8vIExvY2FsIGlkLCB1c2VkIG9ubHkgdG8gbWFrZSByZXF1ZXN0IGlkcyB1bmlxdWUgb24gdGhpcyBob3N0LiBUaGUgc2VydmVyXG4gICAgLy8gZG9lcyBOT1Qga2V5IHRoZSB0b3BpYyBvbiBpdDogdGhlIGNvbm5lY3Rpb24gaXMga2V5ZWQgb24gdGhlIHNpZ25lZCBlbmRJZFxuICAgIC8vIGluc3RlYWQsIHNvIGEgY2xpZW50IGNhbid0IG5hbWUgYW5vdGhlciBwYWdlJ3MgdG9waWMuIFNlZSBzdHJlYW1VcmwuXG4gICAgbG9jYWxJZCA9IGdlbklkKCk7XG4gICAgLy8gVGhlIGVuZElkIHRoaXMgY29ubmVjdGlvbiBpcyBrZXllZCBvbi4gUGlubmVkIGJ5IHRoZSBmaXJzdCBzdHJlYW0gYW5kXG4gICAgLy8ga2VwdCB3aGlsZSBhbnkgc3RyZWFtIGlzIGluIGZsaWdodCwgc28gZXZlcnkgdGFiIGJlaGluZCBhIHNoYXJlZCB3b3JrZXJcbiAgICAvLyBwdWJsaXNoZXMgdG8gYW5kIHJlYWRzIGZyb20gdGhlIHNhbWUgdG9waWMuXG4gICAgZW5kSWQgPSAnJztcbiAgICAvLyBQaWNrZWQgZnJlc2ggd2l0aCB0aGUgZW5kSWQgZm9yIGVhY2ggcnVuIG9mIHN0cmVhbXMsIHNvIGVhY2ggcnVuIHJlYWRzIGFcbiAgICAvLyB0b3BpYyBvZiBpdHMgb3duOiB0aGUgcHJldmlvdXMgcnVuJ3MgdG9waWMgbWF5IGhhdmUgYmVlbiByZWxlYXNlZCBieSB0aGVcbiAgICAvLyBzZXJ2ZXIgd2hpbGUgdGhlIHBhZ2Ugc2F0IGlkbGUsIGFuZCBpdHMgY3Vyc29yIG1lYW5zIG5vdGhpbmcgaGVyZS5cbiAgICBkb3dubGlua0lkID0gJyc7XG4gICAgcGVuZGluZyA9IG5ldyBNYXAoKTtcbiAgICBjb3VudGVyID0gMDtcbiAgICAvLyBMYXN0IHNlcXVlbmNlIGFwcGxpZWQ7IHRoZSBkb3dubGluayByZXN1bWVzIGZyb20gaGVyZSBvbiByZWNvbm5lY3QuIFN0YXJ0c1xuICAgIC8vIGVhY2ggcnVuIGF0IDAgc28gdGhlIGZpcnN0IGNvbm5lY3QgcmVwbGF5cyBhbnl0aGluZyBwdWJsaXNoZWQgYmVmb3JlIGl0XG4gICAgLy8gc3Vic2NyaWJlZCAodGhlIHVwbGluayBQT1NUIGFuZCB0aGUgZG93bmxpbmsgb3BlbiByYWNlKS5cbiAgICBjdXJzb3IgPSAwO1xuICAgIGRvd25saW5rT3BlbiA9IGZhbHNlO1xuICAgIGFib3J0ID0gbnVsbDtcbiAgICAvLyBCdW1wZWQgd2hlbmV2ZXIgYSByZWFkIGxvb3Agc3RhcnRzIG9yIHRoZSBkb3dubGluayBpcyBjbG9zZWQsIHNvIGFcbiAgICAvLyByZXRpcmVkIGxvb3AgKGNsb3NlZCB3aGlsZSBpdCB3YXMgbWlkLWF3YWl0KSBub3RpY2VzIGFuZCBleGl0cyBpbnN0ZWFkXG4gICAgLy8gb2YgZmlnaHRpbmcgYSBuZXdlciBsb29wIGZvciB0aGUgY29ubmVjdGlvbi5cbiAgICBsb29wR2VuID0gMDtcbiAgICByZWNvbm5lY3REZWxheTtcbiAgICBtYXhSZWNvbm5lY3REZWxheTtcbiAgICByZWNvbm5lY3RXaW5kb3c7XG4gICAgZmV0Y2hJbXBsO1xuICAgIF90cmFuc3BvcnQgPSB7fTtcbiAgICAvLyBSZXNvbHZlcyB0aGUgY3VycmVudCBpZGxlIHBhdXNlIGVhcmx5IChhIG5ldyBzdHJlYW0gc3RhcnRlZCkuXG4gICAgd2FrZVVwID0gbnVsbDtcbiAgICAvLyBTZXQgYnkgc3RhcnQoKTogdGhlIHJlYWQgbG9vcCByZXNldHMgaXRzIGlkbGUgYmFja29mZiBvbiB0aGUgbmV4dCB0dXJuLlxuICAgIHdva2VuRm9yTmV3U3RyZWFtID0gZmFsc2U7XG4gICAgY29uc3RydWN0b3Iob3B0cyA9IHt9KSB7XG4gICAgICAgIC8vIE5hdGl2ZSBmZXRjaCBtdXN0IGJlIGludm9rZWQgd2l0aCBgdGhpcyA9PT0gd2luZG93YDsgY2FsbGluZyBpdCBhcyBhXG4gICAgICAgIC8vIG1ldGhvZCBvZiB0aGlzIG9iamVjdCB0aHJvd3MgXCJJbGxlZ2FsIGludm9jYXRpb25cIiwgc28gYmluZCBpdC5cbiAgICAgICAgLy8gZ2xvYmFsVGhpcyBpcyB3aW5kb3cgb24gYSBwYWdlIGFuZCBzZWxmIGluIGEgd29ya2VyLlxuICAgICAgICB0aGlzLmZldGNoSW1wbCA9IG9wdHMuZmV0Y2hJbXBsID8/IGZldGNoLmJpbmQoZ2xvYmFsVGhpcyk7XG4gICAgICAgIHRoaXMucmVjb25uZWN0RGVsYXkgPSBvcHRzLnJlY29ubmVjdERlbGF5ID8/IDEwMDA7XG4gICAgICAgIHRoaXMubWF4UmVjb25uZWN0RGVsYXkgPSBvcHRzLm1heFJlY29ubmVjdERlbGF5ID8/IDUwMDA7XG4gICAgICAgIHRoaXMucmVjb25uZWN0V2luZG93ID0gb3B0cy5yZWNvbm5lY3RXaW5kb3cgPz8gMzAwMDA7XG4gICAgICAgIHRoaXMuY29uZmlndXJlKG9wdHMpO1xuICAgIH1cbiAgICAvKiogQWRvcHQgdGhlIHNlcnZlcidzIGRvd25saW5rIG1vZGUgKHRoZSB3b3JrZXIgaG9zdCBsZWFybnMgaXQgZnJvbSB0aGUgcGFnZSkuICovXG4gICAgY29uZmlndXJlKHRyYW5zcG9ydCkge1xuICAgICAgICBpZiAodHJhbnNwb3J0Lm1vZGUpIHtcbiAgICAgICAgICAgIHRoaXMuX3RyYW5zcG9ydC5tb2RlID0gdHJhbnNwb3J0Lm1vZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0cmFuc3BvcnQucG9sbEludGVydmFsID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdGhpcy5fdHJhbnNwb3J0LnBvbGxJbnRlcnZhbCA9IHRyYW5zcG9ydC5wb2xsSW50ZXJ2YWw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IHRyYW5zcG9ydCgpIHtcbiAgICAgICAgcmV0dXJuIHsgLi4udGhpcy5fdHJhbnNwb3J0IH07XG4gICAgfVxuICAgIGdldCBhY3RpdmVDb3VudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGVuZGluZy5zaXplO1xuICAgIH1cbiAgICAvKiogVGhlIGVuZElkIHRoaXMgY29ubmVjdGlvbiBpcyBjdXJyZW50bHkga2V5ZWQgb24gKGVtcHR5IHdoZW4gaWRsZSkuICovXG4gICAgZ2V0IGNvbm5lY3Rpb25FbmRJZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5kSWQ7XG4gICAgfVxuICAgIC8qKiBBcHBlbmQgdGhlIHNpZ25lZCBlbmRJZCBzbyB0aGUgc2VydmVyIGNhbiBkZXJpdmUgKGFuZCBhdXRob3JpemUpIHRoZVxuICAgICAqIGNvbm5lY3Rpb24gdG9waWMuIFRoZSBzZXJ2ZXIgbmV2ZXIgdHJ1c3RzIGEgY2xpZW50LXN1cHBsaWVkIHRvcGljIGlkLiAqL1xuICAgIHN0cmVhbVVybCh1cmwpIHtcbiAgICAgICAgaWYgKCF0aGlzLmVuZElkKSB7XG4gICAgICAgICAgICByZXR1cm4gdXJsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRlbGltID0gdXJsLmluY2x1ZGVzKCc/JykgPyAnJicgOiAnPyc7XG4gICAgICAgIHJldHVybiAoYCR7dXJsfSR7ZGVsaW19ZW5kSWQ9JHtlbmNvZGVVUklDb21wb25lbnQodGhpcy5lbmRJZCl9YCArXG4gICAgICAgICAgICBgJmRvd25saW5rSWQ9JHtlbmNvZGVVUklDb21wb25lbnQodGhpcy5kb3dubGlua0lkKX1gKTtcbiAgICB9XG4gICAgcnVuKHVybCwgaW5pdCwgZW5kSWQsIHBheWxvYWQsIG9uRnJhbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnQodXJsLCBpbml0LCBlbmRJZCwgcGF5bG9hZCwgb25GcmFtZSkuc2V0dGxlZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogYHJ1bmAsIGFsc28gaGFuZGluZyBiYWNrIHRoZSByZXF1ZXN0IGlkIHNvIHRoZSBjYWxsZXIgY2FuIGBjYW5jZWxgIHRoZVxuICAgICAqIHN0cmVhbSBsYXRlciAodGhlIHdvcmtlciBob3N0IGRvZXMsIGZvciBhIHRhYiB0aGF0IHdlbnQgYXdheSkuXG4gICAgICovXG4gICAgc3RhcnQodXJsLCBpbml0LCBlbmRJZCwgcGF5bG9hZCwgb25GcmFtZSkge1xuICAgICAgICBpZiAodGhpcy5wZW5kaW5nLnNpemUgPT09IDAgfHwgIXRoaXMuZW5kSWQpIHtcbiAgICAgICAgICAgIC8vIE5vdGhpbmcgaW4gZmxpZ2h0OiB0aGlzIHN0cmVhbSdzIHBhZ2Uga2V5cyB0aGUgY29ubmVjdGlvbi4gV2hpbGVcbiAgICAgICAgICAgIC8vIHN0cmVhbXMgYXJlIGluIGZsaWdodCB0aGUga2V5IHN0YXlzIHB1dCwgc28gYSBzdHJlYW0gZnJvbVxuICAgICAgICAgICAgLy8gYW5vdGhlciB0YWIgKHNoYXJlZCB3b3JrZXIpIGxhbmRzIG9uIHRoZSBzYW1lIHRvcGljLlxuICAgICAgICAgICAgdGhpcy5lbmRJZCA9IGVuZElkIHx8ICcnO1xuICAgICAgICAgICAgdGhpcy5kb3dubGlua0lkID0gZ2VuSWQoKTtcbiAgICAgICAgICAgIHRoaXMuY3Vyc29yID0gMDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXF1ZXN0SWQgPSBgJHt0aGlzLmxvY2FsSWR9LSR7Kyt0aGlzLmNvdW50ZXJ9YDtcbiAgICAgICAgY29uc3Qgc2V0dGxlZCA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZy5zZXQocmVxdWVzdElkLCB7XG4gICAgICAgICAgICAgICAgb25GcmFtZSxcbiAgICAgICAgICAgICAgICByZXNvbHZlLFxuICAgICAgICAgICAgICAgIHJlamVjdCxcbiAgICAgICAgICAgICAgICBhY2tlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgZ290RnJhbWU6IGZhbHNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIFVwbGluayBQT1NUOiByZXR1cm5zIGEgZmFzdCBhY2s7IHRoZSBvdXRwdXRzIGFycml2ZSBvbiB0aGUgZG93bmxpbmssXG4gICAgICAgIC8vIHdoaWNoIG9wZW5zIG9uY2UgdGhlIGFjayBpcyBpbi5cbiAgICAgICAgdGhpcy5mZXRjaEltcGwodGhpcy5zdHJlYW1VcmwodXJsKSwge1xuICAgICAgICAgICAgLi4uaW5pdCxcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgIC4uLnBheWxvYWQsXG4gICAgICAgICAgICAgICAgc3RyZWFtQ29ubmVjdGlvbjogeyByZXF1ZXN0SWQgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKHJlcyA9PiB0aGlzLmNoZWNrVXBsaW5rKHJlcXVlc3RJZCwgcmVzLCB1cmwsIGluaXQpKVxuICAgICAgICAgICAgLmNhdGNoKGVyciA9PiB0aGlzLmZhaWwocmVxdWVzdElkLCBlcnIpKTtcbiAgICAgICAgcmV0dXJuIHsgcmVxdWVzdElkLCBzZXR0bGVkIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFiYW5kb24gb25lIGluLWZsaWdodCBjYWxsYmFjayB3aG9zZSBjb25zdW1lciBpcyBnb25lOiBzdG9wIHdhaXRpbmcgZm9yXG4gICAgICogaXRzIGZyYW1lcyAodGhleSBhcmUgZHJvcHBlZCBvbiBhcnJpdmFsKSBhbmQgdGVsbCB0aGUgc2VydmVyIHRvIGNhbmNlbFxuICAgICAqIGl0LCBzbyBpdCBkb2VzIG5vdCBydW4gdG8gY29tcGxldGlvbiBmb3Igbm9ib2R5LiBJdHMgcHJvbWlzZSByZWplY3RzLlxuICAgICAqL1xuICAgIGNhbmNlbChyZXF1ZXN0SWQsIHVybCwgaW5pdCkge1xuICAgICAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5wZW5kaW5nLmdldChyZXF1ZXN0SWQpO1xuICAgICAgICBpZiAoIXBlbmRpbmcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBlbmRpbmcuZGVsZXRlKHJlcXVlc3RJZCk7XG4gICAgICAgIHBlbmRpbmcucmVqZWN0KG5ldyBFcnJvcignU3RyZWFtaW5nIGNhbGxiYWNrIGNhbmNlbGxlZCcpKTtcbiAgICAgICAgdGhpcy5mZXRjaEltcGwodGhpcy5zdHJlYW1VcmwodXJsKSwge1xuICAgICAgICAgICAgLi4uaW5pdCxcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBzdHJlYW1DYW5jZWw6IHsgcmVxdWVzdElkIH0gfSlcbiAgICAgICAgfSkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICAgICAgdGhpcy5zdG9wRG93bmxpbmtJZklkbGUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHVwbGluayByZXR1cm5zIGEgZmFzdCBhY2sgKDIwMCk7IHRoZSBmcmFtZXMgdGhlbiBhcnJpdmUgb24gdGhlXG4gICAgICogZG93bmxpbmssIHNvIG1ha2Ugc3VyZSBvbmUgaXMgb3Blbi4gQW55IG5vbi1vayBzdGF0dXMgKGUuZy4gNDAzIHdoZW4gdGhlXG4gICAgICogY29ubmVjdGlvbiBkaWQgbm90IHZlcmlmeSkgbWVhbnMgbm8gZnJhbWVzIGFyZSBjb21pbmcsIHNvIGZhaWwgdGhlXG4gICAgICogcmVxdWVzdCBsb3VkbHkgcmF0aGVyIHRoYW4gbGVhdmUgdGhlIGNhbGxiYWNrIHBlbmRpbmcgZm9yZXZlci5cbiAgICAgKi9cbiAgICBjaGVja1VwbGluayhyZXF1ZXN0SWQsIHJlcywgdXJsLCBpbml0KSB7XG4gICAgICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgICAgICB0aGlzLmZhaWwocmVxdWVzdElkLCBuZXcgRXJyb3IoYHN0cmVhbSB1cGxpbmsgcmVzcG9uZGVkICR7cmVzLnN0YXR1c31gKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGVuZGluZyA9IHRoaXMucGVuZGluZy5nZXQocmVxdWVzdElkKTtcbiAgICAgICAgaWYgKHBlbmRpbmcpIHtcbiAgICAgICAgICAgIHBlbmRpbmcuYWNrZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5lbnN1cmVEb3dubGluayh1cmwsIGluaXQpO1xuICAgICAgICAgICAgLy8gQSBwb2xsaW5nIGRvd25saW5rIG1heSBiZSBwYXVzaW5nIGJldHdlZW4gcG9sbHM6IHRoaXMgc3RyZWFtJ3NcbiAgICAgICAgICAgIC8vIGZpcnN0IGZyYW1lIHNob3VsZCBub3Qgd2FpdCBvdXQgdGhhdCBwYXVzZS5cbiAgICAgICAgICAgIHRoaXMud29rZW5Gb3JOZXdTdHJlYW0gPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy53YWtlVXA/LigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKiBXaGV0aGVyIGFueSBhY2tub3dsZWRnZWQgY2FsbGJhY2sgaXMgc3RpbGwgd2FpdGluZyBvbiB0aGUgZG93bmxpbmsuICovXG4gICAgaGFzQWNrZWQoKSB7XG4gICAgICAgIGZvciAoY29uc3QgcCBvZiB0aGlzLnBlbmRpbmcudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIGlmIChwLmFja2VkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvKiogUm91dGUgb25lIGRvd25saW5rIGVudmVsb3BlIHRvIGl0cyBjYWxsYmFjay4gUHVibGljIGZvciB0ZXN0aW5nLiAqL1xuICAgIGRpc3BhdGNoRW52ZWxvcGUoZW52ZWxvcGUpIHtcbiAgICAgICAgaWYgKGVudmVsb3BlLnJlc2V0KSB7XG4gICAgICAgICAgICAvLyBPdXIgY3Vyc29yIHBvaW50cyBpbnRvIGEgc2VydmVyIGluY2FybmF0aW9uIHRoYXQgbG9zdCBvdXIgZnJhbWVzXG4gICAgICAgICAgICAvLyAoaXQgcmVzdGFydGVkLCBvciB0aGUgc3RvcmFnZSBvd25lciBjaGFuZ2VkKS4gUmVzZXQgdG8gdGhlIGhlYWQgc29cbiAgICAgICAgICAgIC8vIGEgbGF0ZXIgZG93bmxpbmsgc3RhcnRzIGZyb20gd2hhdCB0aGUgZnJlc2ggdG9waWMgYWN0dWFsbHkgaGFzLFxuICAgICAgICAgICAgLy8gYW5kIHNldHRsZSB0aGUgY2FsbGJhY2tzIGluIGZsaWdodDogdGhlIGZyYW1lcyB0aGV5IHdlcmUgd2FpdGluZ1xuICAgICAgICAgICAgLy8gb24gYXJlIGdvbmUsIGFuZCBhZnRlciBhIHJlc3RhcnQgbm90aGluZyB3aWxsIGV2ZXIgZmluaXNoIHRoZW0uXG4gICAgICAgICAgICB0aGlzLmN1cnNvciA9IDA7XG4gICAgICAgICAgICB0aGlzLnNldHRsZUFsbChuZXcgRXJyb3IoJ3N0cmVhbSByZXNldDogdGhlIHNlcnZlciBsb3N0IHRoaXMgY29ubmVjdGlvbiAocmVzdGFydCBvciBvd25lciBjaGFuZ2UpJykpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZW52ZWxvcGUuc2VxID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdGhpcy5jdXJzb3IgPSBlbnZlbG9wZS5zZXE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVudmVsb3BlLnJpZCA9PT0gdW5kZWZpbmVkIHx8IGVudmVsb3BlLmZyYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5wZW5kaW5nLmdldChlbnZlbG9wZS5yaWQpO1xuICAgICAgICBpZiAoIXBlbmRpbmcpIHtcbiAgICAgICAgICAgIC8vIEEgZnJhbWUgZm9yIGEgY2FsbGJhY2sgd2UgYWxyZWFkeSByZXNvbHZlZCAoZS5nLiBhIHJlcGxheWVkXG4gICAgICAgICAgICAvLyBkdXBsaWNhdGUgYWZ0ZXIgcmVjb25uZWN0KSAtLSBzYWZlIHRvIGRyb3AuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBmcmFtZSB9ID0gZW52ZWxvcGU7XG4gICAgICAgIGlmIChmcmFtZS5kb25lKSB7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmcuZGVsZXRlKGVudmVsb3BlLnJpZCk7XG4gICAgICAgICAgICBpZiAoZnJhbWUuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBwZW5kaW5nLnJlamVjdChuZXcgRXJyb3IoZnJhbWUuZXJyb3IubWVzc2FnZSB8fCAnU3RyZWFtaW5nIGNhbGxiYWNrIGVycm9yJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcGVuZGluZy5yZXNvbHZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnN0b3BEb3dubGlua0lmSWRsZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcGVuZGluZy5nb3RGcmFtZSA9IHRydWU7XG4gICAgICAgICAgICBwZW5kaW5nLm9uRnJhbWUoZnJhbWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBkb3dubGluayBpcyBnb25lIGZvciBnb29kIChyZWZ1c2VkIGJ5IHRoZSBzZXJ2ZXIsIHJlc2V0LCBvclxuICAgICAqIHVucmVhY2hhYmxlIHBhc3QgdGhlIHJlY29ubmVjdCB3aW5kb3cpLiBDYWxsYmFja3MgdGhhdCBhbHJlYWR5IGFwcGxpZWRcbiAgICAgKiBmcmFtZXMgcmVzb2x2ZSBzbyB0aG9zZSBmcmFtZXMgc3RheSBvbiB0aGUgcGFnZTsgb25lcyB0aGF0IG5ldmVyIGdvdCBhXG4gICAgICogZnJhbWUgcmVqZWN0IHdpdGggYGVycmAsIGFuZCB0aGUgcmVhZCBsb29wIHdpbmRzIGRvd24gc2luY2Ugbm90aGluZyBpc1xuICAgICAqIHBlbmRpbmcgYW55IG1vcmUuXG4gICAgICovXG4gICAgc2V0dGxlQWxsKGVycikge1xuICAgICAgICBjb25zdCBwZW5kaW5nID0gQXJyYXkuZnJvbSh0aGlzLnBlbmRpbmcudmFsdWVzKCkpO1xuICAgICAgICB0aGlzLnBlbmRpbmcuY2xlYXIoKTtcbiAgICAgICAgLy8gQ2xvc2UgYmVmb3JlIHNldHRsaW5nOiBhIGNvbnRpbnVhdGlvbiBvZiBhIHNldHRsZWQgcHJvbWlzZSBtYXkgc3RhcnRcbiAgICAgICAgLy8gYSBuZXcgc3RyZWFtIHJpZ2h0IGF3YXksIGFuZCBpdCBtdXN0IGdldCBhIGZyZXNoIGRvd25saW5rIHJhdGhlclxuICAgICAgICAvLyB0aGFuIGZpbmQgdGhpcyBvbmUgc3RpbGwgbWFya2VkIG9wZW4uXG4gICAgICAgIHRoaXMuY2xvc2VEb3dubGluaygpO1xuICAgICAgICBwZW5kaW5nLmZvckVhY2gocCA9PiAocC5nb3RGcmFtZSA/IHAucmVzb2x2ZSgpIDogcC5yZWplY3QoZXJyKSkpO1xuICAgIH1cbiAgICBmYWlsKHJlcXVlc3RJZCwgZXJyKSB7XG4gICAgICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlzLnBlbmRpbmcuZ2V0KHJlcXVlc3RJZCk7XG4gICAgICAgIGlmIChwZW5kaW5nKSB7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmcuZGVsZXRlKHJlcXVlc3RJZCk7XG4gICAgICAgICAgICBwZW5kaW5nLnJlamVjdChlcnIpO1xuICAgICAgICAgICAgdGhpcy5zdG9wRG93bmxpbmtJZklkbGUoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdG9wRG93bmxpbmtJZklkbGUoKSB7XG4gICAgICAgIGlmICh0aGlzLmRvd25saW5rT3BlbiAmJiAhdGhpcy5oYXNBY2tlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlRG93bmxpbmsoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKiogUmV0aXJlIHRoZSBjdXJyZW50IHJlYWQgbG9vcCBhbmQgZW5kIGl0cyBjb25uZWN0aW9uLiAqL1xuICAgIGNsb3NlRG93bmxpbmsoKSB7XG4gICAgICAgIGNvbnN0IGFib3J0ID0gdGhpcy5hYm9ydDtcbiAgICAgICAgdGhpcy5hYm9ydCA9IG51bGw7XG4gICAgICAgIHRoaXMuZG93bmxpbmtPcGVuID0gZmFsc2U7XG4gICAgICAgIHRoaXMubG9vcEdlbisrO1xuICAgICAgICB0aGlzLndha2VVcD8uKCk7XG4gICAgICAgIGlmIChhYm9ydCkge1xuICAgICAgICAgICAgYWJvcnQuYWJvcnQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbnN1cmVEb3dubGluayh1cmwsIGluaXQpIHtcbiAgICAgICAgaWYgKHRoaXMuZG93bmxpbmtPcGVuKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kb3dubGlua09wZW4gPSB0cnVlO1xuICAgICAgICAvLyBGaXJlLWFuZC1mb3JnZXQgcmVhZCBsb29wOyBpdCBleGl0cyB3aGVuIG5vIGNhbGxiYWNrcyByZW1haW4uXG4gICAgICAgIHRoaXMucmVhZExvb3AodXJsLCBpbml0LCArK3RoaXMubG9vcEdlbik7XG4gICAgfVxuICAgIGFzeW5jIHJlYWRMb29wKHVybCwgaW5pdCwgZ2VuKSB7XG4gICAgICAgIGNvbnN0IHBvbGxpbmcgPSB0aGlzLl90cmFuc3BvcnQubW9kZSA9PT0gJ3BvbGwnO1xuICAgICAgICBjb25zdCBiYXNlID0gdGhpcy5fdHJhbnNwb3J0LnBvbGxJbnRlcnZhbCA/PyBERUZBVUxUX1BPTExfSU5URVJWQUw7XG4gICAgICAgIGxldCBpZGxlUGF1c2UgPSBiYXNlO1xuICAgICAgICBsZXQgZW1wdHlQb2xscyA9IDA7XG4gICAgICAgIGxldCB1bnJlYWNoYWJsZVNpbmNlID0gbnVsbDtcbiAgICAgICAgbGV0IGRlbGF5ID0gdGhpcy5yZWNvbm5lY3REZWxheTtcbiAgICAgICAgd2hpbGUgKHRoaXMuaGFzQWNrZWQoKSAmJiB0aGlzLmxvb3BHZW4gPT09IGdlbikge1xuICAgICAgICAgICAgaWYgKHRoaXMud29rZW5Gb3JOZXdTdHJlYW0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLndva2VuRm9yTmV3U3RyZWFtID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgZW1wdHlQb2xscyA9IDA7XG4gICAgICAgICAgICAgICAgaWRsZVBhdXNlID0gYmFzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYWJvcnQgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICAgICAgICBsZXQgcmVjZWl2ZWQgPSAwO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmZldGNoSW1wbCh0aGlzLnN0cmVhbVVybCh1cmwpLCB7XG4gICAgICAgICAgICAgICAgICAgIC4uLmluaXQsXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgICAgICBzaWduYWw6IHRoaXMuYWJvcnQuc2lnbmFsLFxuICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1Eb3dubGluazogeyBmcm9tOiB0aGlzLmN1cnNvciB9XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlcy5zdGF0dXMgPj0gNDAwICYmIHJlcy5zdGF0dXMgPCA1MDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHNlcnZlciByZWZ1c2VzIHRoaXMgY29ubmVjdGlvbiBvdXRyaWdodCwgdHlwaWNhbGx5XG4gICAgICAgICAgICAgICAgICAgIC8vIDQwMyBhZnRlciBhIHJlc3RhcnQgbWludGVkIGEgbmV3IHNpZ25pbmcgc2VjcmV0IHNvIG91clxuICAgICAgICAgICAgICAgICAgICAvLyBlbmRJZCBubyBsb25nZXIgdmVyaWZpZXMuIFJldHJ5aW5nIGNhbm5vdCBmaXggdGhhdC5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0bGVBbGwobmV3IEVycm9yKGBzdHJlYW0gZG93bmxpbmsgcmVzcG9uZGVkICR7cmVzLnN0YXR1c31gKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXJlcy5vayB8fCAhcmVzLmJvZHkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBkb3dubGluayByZXNwb25kZWQgJHtyZXMuc3RhdHVzfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZWNlaXZlZCA9IGF3YWl0IHRoaXMuY29uc3VtZShyZXMuYm9keSwgZ2VuKTtcbiAgICAgICAgICAgICAgICBpZiAocmVjZWl2ZWQgPT09IDAgJiYgIXBvbGxpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQWNjZXB0ZWQgdGhlbiBjbG9zZWQgd2l0aG91dCBhIHNpbmdsZSBlbnZlbG9wZSAoYSBzZXJ2ZXJcbiAgICAgICAgICAgICAgICAgICAgLy8gbWlkLXNodXRkb3duLCBhIHByb3h5IGRyb3BwaW5nIGlkbGUgY29ubmVjdGlvbnMpOiBiYWNrXG4gICAgICAgICAgICAgICAgICAgIC8vIG9mZiBsaWtlIGEgZmFpbHVyZSBpbnN0ZWFkIG9mIHJlY29ubmVjdGluZyBpbiBhIGJ1cnN0LlxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Rvd25saW5rIGNsb3NlZCB3aXRob3V0IGRhdGEnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQSBwcm9kdWN0aXZlIGNvbm5lY3Rpb24gZW5kZWQgKHByb3h5IHRpbWVvdXQsIHdvcmtlclxuICAgICAgICAgICAgICAgIC8vIHJlY3ljbGUpIG9yIGEgcG9sbCBjb21wbGV0ZWQ6IGZyZXNoIGJhY2tvZmYuXG4gICAgICAgICAgICAgICAgdW5yZWFjaGFibGVTaW5jZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgZGVsYXkgPSB0aGlzLnJlY29ubmVjdERlbGF5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5oYXNBY2tlZCgpIHx8IHRoaXMubG9vcEdlbiAhPT0gZ2VuKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBjbG9zZWQgb24gcHVycG9zZTogaWRsZSwgb3Igc2V0dGxlZCBhbmQgcmV0aXJlZFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBHZW51aW5lIGRyb3Agd2l0aCB3b3JrIG91dHN0YW5kaW5nOiByZWNvbm5lY3QgZnJvbSB0aGVcbiAgICAgICAgICAgICAgICAvLyBjdXJzb3IsIGJhY2tpbmcgb2ZmLCB1bnRpbCB0aGUgc2VydmVyIGhhcyBiZWVuIHVucmVhY2hhYmxlXG4gICAgICAgICAgICAgICAgLy8gZm9yIHRoZSB3aG9sZSB3aW5kb3cuIFBhc3QgdGhhdCB0aGUgY2FsbGJhY2tzIGFyZSBsb3N0LlxuICAgICAgICAgICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgdW5yZWFjaGFibGVTaW5jZSA9IHVucmVhY2hhYmxlU2luY2UgPz8gbm93O1xuICAgICAgICAgICAgICAgIGlmIChub3cgLSB1bnJlYWNoYWJsZVNpbmNlID49IHRoaXMucmVjb25uZWN0V2luZG93KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0dGxlQWxsKG5ldyBFcnJvcignc3RyZWFtIGRvd25saW5rIGxvc3Q6IGNvdWxkIG5vdCByZWNvbm5lY3QgdG8gdGhlIHNlcnZlcicpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGF3YWl0IHNsZWVwKGRlbGF5KTtcbiAgICAgICAgICAgICAgICBkZWxheSA9IE1hdGgubWluKGRlbGF5ICogMiwgdGhpcy5tYXhSZWNvbm5lY3REZWxheSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocG9sbGluZyAmJiB0aGlzLmhhc0Fja2VkKCkgJiYgdGhpcy5sb29wR2VuID09PSBnZW4pIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgcmVzcG9uc2Ugd2FzIG9uZSBwb2xsLiBGcmFtZXMgY2FtZTogcG9sbCBhZ2FpbiBzb29uLlxuICAgICAgICAgICAgICAgIC8vIE5vdGhpbmcgY2FtZToga2VlcCB0aGUgcGFjZSBmb3IgYSBmZXcgcG9sbHMsIHRoZW4gYmFjayBvZmZcbiAgICAgICAgICAgICAgICAvLyB1cCB0byBhIGJvdW5kLCB1bnRpbCBmcmFtZXMgb3IgYSBuZXcgc3RyZWFtIHdha2UgdXMuXG4gICAgICAgICAgICAgICAgaWYgKHJlY2VpdmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGVtcHR5UG9sbHMgPSAwO1xuICAgICAgICAgICAgICAgICAgICBpZGxlUGF1c2UgPSBiYXNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICgrK2VtcHR5UG9sbHMgPiBFTVBUWV9QT0xMU19CRUZPUkVfQkFDS09GRikge1xuICAgICAgICAgICAgICAgICAgICBpZGxlUGF1c2UgPSBNYXRoLm1pbihpZGxlUGF1c2UgKiAyLCBiYXNlICogTUFYX0JBQ0tPRkZfRkFDVE9SKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wYXVzZShpZGxlUGF1c2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmxvb3BHZW4gPT09IGdlbikge1xuICAgICAgICAgICAgdGhpcy5kb3dubGlua09wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuYWJvcnQgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKiBTbGVlcCBmb3IgYG1zYCwgb3IgdW50aWwgYSBuZXcgc3RyZWFtIHN0YXJ0cyBvciB0aGUgZG93bmxpbmsgY2xvc2VzLiAqL1xuICAgIHBhdXNlKG1zKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy53YWtlVXAgPSBudWxsO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH0sIG1zKTtcbiAgICAgICAgICAgIHRoaXMud2FrZVVwID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgICAgICAgdGhpcy53YWtlVXAgPSBudWxsO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKiogUmVsYXkgZW52ZWxvcGVzIHVudGlsIHRoZSBjb25uZWN0aW9uIGVuZHM7IHJldHVybnMgaG93IG1hbnkgYXJyaXZlZC4gKi9cbiAgICBhc3luYyBjb25zdW1lKGJvZHksIGdlbikge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBib2R5LmdldFJlYWRlcigpO1xuICAgICAgICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG4gICAgICAgIGxldCBidWZmZXIgPSAnJztcbiAgICAgICAgbGV0IHJlY2VpdmVkID0gMDtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgY29uc3QgeyBkb25lLCB2YWx1ZSB9ID0gYXdhaXQgcmVhZGVyLnJlYWQoKTtcbiAgICAgICAgICAgIGlmIChkb25lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlY2VpdmVkOyAvLyBjb25uZWN0aW9uIGVuZGVkIC0+IHRoZSByZWFkIGxvb3AgZGVjaWRlc1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnVmZmVyICs9IGRlY29kZXIuZGVjb2RlKHZhbHVlLCB7IHN0cmVhbTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIGxldCBubDtcbiAgICAgICAgICAgIHdoaWxlICgobmwgPSBidWZmZXIuaW5kZXhPZignXFxuJykpID49IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsaW5lID0gYnVmZmVyLnNsaWNlKDAsIG5sKTtcbiAgICAgICAgICAgICAgICBidWZmZXIgPSBidWZmZXIuc2xpY2UobmwgKyAxKTtcbiAgICAgICAgICAgICAgICBpZiAoIWxpbmUudHJpbSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBrZWVwYWxpdmUgYmxhbmsgbGluZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5sb29wR2VuICE9PSBnZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUmV0aXJlZCB3aGlsZSByZWFkaW5nOiBhIG5ld2VyIHJ1biBvd25zIHRoZSBjdXJzb3IuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWNlaXZlZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQrKztcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRW52ZWxvcGUoSlNPTi5wYXJzZShsaW5lKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIFRoZSBwYWdlJ3MgZW5kIG9mIHRoZSBTaGFyZWRXb3JrZXIgdHJhbnNwb3J0OiBmb3J3YXJkcyBlYWNoIHN0cmVhbSB0byB0aGVcbiAqIHdvcmtlciBhbmQgcm91dGVzIGl0cyBmcmFtZXMgYmFjayB0byB0aGUgY2FsbGJhY2sgdGhhdCBzdGFydGVkIGl0LlxuICovXG5leHBvcnQgY2xhc3MgU2hhcmVkU3RyZWFtQ2xpZW50IHtcbiAgICBwZW5kaW5nID0gbmV3IE1hcCgpO1xuICAgIGNvdW50ZXIgPSAwO1xuICAgIHBvcnQ7XG4gICAgcmVuZGVyZXJJZDtcbiAgICB0cmFuc3BvcnQ7XG4gICAgX2Jyb2tlbiA9IGZhbHNlO1xuICAgIGNvbnN0cnVjdG9yKHBvcnQsIHJlbmRlcmVySWQgPSBnZXRSZW5kZXJlcklkKCksIHRyYW5zcG9ydCA9IHt9KSB7XG4gICAgICAgIHRoaXMucG9ydCA9IHBvcnQ7XG4gICAgICAgIHRoaXMucmVuZGVyZXJJZCA9IHJlbmRlcmVySWQ7XG4gICAgICAgIHRoaXMudHJhbnNwb3J0ID0gdHJhbnNwb3J0O1xuICAgICAgICBwb3J0Lm9ubWVzc2FnZSA9IGV2ZW50ID0+IHRoaXMuaGFuZGxlTWVzc2FnZShldmVudC5kYXRhKTtcbiAgICAgICAgcG9ydC5zdGFydD8uKCk7XG4gICAgfVxuICAgIC8qKiBUcnVlIG9uY2UgdGhlIHdvcmtlciBmYWlsZWQ7IGNhbGxlcnMgc2hvdWxkIGZhbGwgYmFjayB0byBgU3RyZWFtQ2xpZW50YC4gKi9cbiAgICBnZXQgYnJva2VuKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYnJva2VuO1xuICAgIH1cbiAgICBnZXQgYWN0aXZlQ291bnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBlbmRpbmcuc2l6ZTtcbiAgICB9XG4gICAgcnVuKHVybCwgaW5pdCwgZW5kSWQsIHBheWxvYWQsIG9uRnJhbWUpIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdElkID0gYCR7dGhpcy5yZW5kZXJlcklkfS0keysrdGhpcy5jb3VudGVyfWA7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmcuc2V0KHJlcXVlc3RJZCwge1xuICAgICAgICAgICAgICAgIG9uRnJhbWUsXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSxcbiAgICAgICAgICAgICAgICByZWplY3QsXG4gICAgICAgICAgICAgICAgYWNrZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGdvdEZyYW1lOiBmYWxzZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdzdHJlYW0nLFxuICAgICAgICAgICAgICAgIHJlbmRlcmVySWQ6IHRoaXMucmVuZGVyZXJJZCxcbiAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgICAgIGluaXQsXG4gICAgICAgICAgICAgICAgZW5kSWQ6IGVuZElkIHx8ICcnLFxuICAgICAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICAgICAgICAgdHJhbnNwb3J0OiB0aGlzLnRyYW5zcG9ydFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMucG9ydC5wb3N0TWVzc2FnZShtZXNzYWdlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoaXMgdGFiIGlzIGdvaW5nIGF3YXkgKHBhZ2VoaWRlKTogaXRzIHN0cmVhbXMgaGF2ZSBubyBjb25zdW1lciBhbnlcbiAgICAgKiBtb3JlLCBzbyB0aGUgd29ya2VyIGNhbmNlbHMgdGhlbSBzZXJ2ZXItc2lkZS5cbiAgICAgKi9cbiAgICByZWxlYXNlKCkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICAgICAgdHlwZTogJ3VucmVnaXN0ZXInLFxuICAgICAgICAgICAgcmVuZGVyZXJJZDogdGhpcy5yZW5kZXJlcklkXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucG9ydC5wb3N0TWVzc2FnZShtZXNzYWdlKTtcbiAgICB9XG4gICAgLyoqIFRoZSB3b3JrZXIgZGllZCBvciBmYWlsZWQgdG8gbG9hZDogcmVqZWN0IGV2ZXJ5dGhpbmcgaW4gZmxpZ2h0LiAqL1xuICAgIGZhaWwoZXJyKSB7XG4gICAgICAgIHRoaXMuX2Jyb2tlbiA9IHRydWU7XG4gICAgICAgIGZvciAoY29uc3QgcGVuZGluZyBvZiB0aGlzLnBlbmRpbmcudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIHBlbmRpbmcucmVqZWN0KGVycik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wZW5kaW5nLmNsZWFyKCk7XG4gICAgfVxuICAgIGhhbmRsZU1lc3NhZ2UobWVzc2FnZSkge1xuICAgICAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5wZW5kaW5nLmdldChtZXNzYWdlLnJlcXVlc3RJZCk7XG4gICAgICAgIGlmICghcGVuZGluZykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnR5cGUgPT09ICdmcmFtZScpIHtcbiAgICAgICAgICAgIHBlbmRpbmcub25GcmFtZShtZXNzYWdlLmZyYW1lKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBlbmRpbmcuZGVsZXRlKG1lc3NhZ2UucmVxdWVzdElkKTtcbiAgICAgICAgaWYgKG1lc3NhZ2UudHlwZSA9PT0gJ2RvbmUnKSB7XG4gICAgICAgICAgICBwZW5kaW5nLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHBlbmRpbmcucmVqZWN0KG5ldyBFcnJvcihtZXNzYWdlLm1lc3NhZ2UpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmxldCBzaW5nbGV0b24gPSBudWxsO1xuLyoqXG4gKiBUaGUgcGFnZSdzIHN0cmVhbWluZyB0cmFuc3BvcnQ6IHRoZSBTaGFyZWRXb3JrZXItaG9zdGVkIGRvd25saW5rIHdoZW4gdGhlXG4gKiBzZXJ2ZXIgcHJvdmlkZXMgdGhlIHdvcmtlciBzY3JpcHQgYW5kIHRoZSBicm93c2VyIHN1cHBvcnRzIFNoYXJlZFdvcmtlcixcbiAqIG90aGVyd2lzZSBhIGRvd25saW5rIG9mIHRoZSBwYWdlJ3Mgb3duLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RyZWFtQ2xpZW50KGNvbmZpZyA9IHt9KSB7XG4gICAgaWYgKHNpbmdsZXRvbiBpbnN0YW5jZW9mIFNoYXJlZFN0cmVhbUNsaWVudCAmJiBzaW5nbGV0b24uYnJva2VuKSB7XG4gICAgICAgIHNpbmdsZXRvbiA9IG51bGw7XG4gICAgfVxuICAgIGlmIChzaW5nbGV0b24pIHtcbiAgICAgICAgcmV0dXJuIHNpbmdsZXRvbjtcbiAgICB9XG4gICAgY29uc3QgdHJhbnNwb3J0ID0ge1xuICAgICAgICBtb2RlOiBjb25maWcuc3RyZWFtPy5tb2RlLFxuICAgICAgICBwb2xsSW50ZXJ2YWw6IGNvbmZpZy5zdHJlYW0/LnBvbGxfaW50ZXJ2YWxcbiAgICB9O1xuICAgIGNvbnN0IHdvcmtlclVybCA9IGNvbmZpZy5zdHJlYW0/Lndvcmtlcl91cmw7XG4gICAgaWYgKHdvcmtlclVybCAmJiB0eXBlb2YgU2hhcmVkV29ya2VyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qgd29ya2VyID0gbmV3IFNoYXJlZFdvcmtlcih3b3JrZXJVcmwsIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnZGFzaC1zdHJlYW0td29ya2VyJ1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBjbGllbnQgPSBuZXcgU2hhcmVkU3RyZWFtQ2xpZW50KHdvcmtlci5wb3J0LCBnZXRSZW5kZXJlcklkKCksIHRyYW5zcG9ydCk7XG4gICAgICAgICAgICB3b3JrZXIub25lcnJvciA9ICgpID0+IGNsaWVudC5mYWlsKG5ldyBFcnJvcignRGFzaCBzdHJlYW0gd29ya2VyIGZhaWxlZCcpKTtcbiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdwYWdlaGlkZScsICgpID0+IGNsaWVudC5yZWxlYXNlKCkpO1xuICAgICAgICAgICAgc2luZ2xldG9uID0gY2xpZW50O1xuICAgICAgICAgICAgcmV0dXJuIHNpbmdsZXRvbjtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAvLyBGYWxsIHRocm91Z2ggdG8gdGhlIGluLXBhZ2UgdHJhbnNwb3J0LlxuICAgICAgICB9XG4gICAgfVxuICAgIHNpbmdsZXRvbiA9IG5ldyBTdHJlYW1DbGllbnQodHJhbnNwb3J0KTtcbiAgICByZXR1cm4gc2luZ2xldG9uO1xufVxuLyoqXG4gKiBXaGV0aGVyIHRoZSBzZXJ2ZXIgb2ZmZXJzIHRoZSBtdWx0aXBsZXhlZCBzdHJlYW1pbmcgdHJhbnNwb3J0IChpLmUuIGl0IGhhcyBhXG4gKiBzaGFyZWQtc3RvcmFnZSBiYWNrZW5kKS4gV2hlbiBmYWxzZSwgc3RyZWFtaW5nIGNhbGxiYWNrcyBmYWxsIGJhY2sgdG8gb25lXG4gKiBOREpTT04gY29ubmVjdGlvbiBlYWNoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJlYW1NdWx0aXBsZXhlZChjb25maWcpIHtcbiAgICByZXR1cm4gISFjb25maWcuc3RyZWFtPy5lbmFibGVkO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgYXN5bmMgKGR1cmF0aW9uKSA9PiB7XG4gICAgbGV0IF9yZXNvbHZlO1xuICAgIGNvbnN0IHAgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IChfcmVzb2x2ZSA9IHJlc29sdmUpKTtcbiAgICBzZXRUaW1lb3V0KF9yZXNvbHZlLCBkdXJhdGlvbik7XG4gICAgcmV0dXJuIHA7XG59O1xuIiwiLyoqXG4gKiBDbGllbnQgZm9yIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgRGFzaCBXZWJTb2NrZXQgU2hhcmVkV29ya2VyLlxuICovXG5pbXBvcnQgeyBnZXRSZW5kZXJlcklkIH0gZnJvbSAnLi9yZW5kZXJlcklkJztcbi8qKiBNZXNzYWdlIHR5cGVzIGZvciB3b3JrZXIgY29tbXVuaWNhdGlvbiAqL1xuZXhwb3J0IHZhciBXb3JrZXJNZXNzYWdlVHlwZTtcbihmdW5jdGlvbiAoV29ya2VyTWVzc2FnZVR5cGUpIHtcbiAgICBXb3JrZXJNZXNzYWdlVHlwZVtcIkNPTk5FQ1RcIl0gPSBcImNvbm5lY3RcIjtcbiAgICBXb3JrZXJNZXNzYWdlVHlwZVtcIkRJU0NPTk5FQ1RcIl0gPSBcImRpc2Nvbm5lY3RcIjtcbiAgICBXb3JrZXJNZXNzYWdlVHlwZVtcIkNBTExCQUNLX1JFUVVFU1RcIl0gPSBcImNhbGxiYWNrX3JlcXVlc3RcIjtcbiAgICBXb3JrZXJNZXNzYWdlVHlwZVtcIkdFVF9QUk9QU19SRVNQT05TRVwiXSA9IFwiZ2V0X3Byb3BzX3Jlc3BvbnNlXCI7XG4gICAgV29ya2VyTWVzc2FnZVR5cGVbXCJUQUJfVklTSUJMRVwiXSA9IFwidGFiX3Zpc2libGVcIjtcbiAgICBXb3JrZXJNZXNzYWdlVHlwZVtcIkNPTk5FQ1RFRFwiXSA9IFwiY29ubmVjdGVkXCI7XG4gICAgV29ya2VyTWVzc2FnZVR5cGVbXCJESVNDT05ORUNURURcIl0gPSBcImRpc2Nvbm5lY3RlZFwiO1xuICAgIFdvcmtlck1lc3NhZ2VUeXBlW1wiQ0FMTEJBQ0tfUkVTUE9OU0VcIl0gPSBcImNhbGxiYWNrX3Jlc3BvbnNlXCI7XG4gICAgV29ya2VyTWVzc2FnZVR5cGVbXCJTRVRfUFJPUFNcIl0gPSBcInNldF9wcm9wc1wiO1xuICAgIFdvcmtlck1lc3NhZ2VUeXBlW1wiU0VUX1BST1BTX0JBVENIXCJdID0gXCJzZXRfcHJvcHNfYmF0Y2hcIjtcbiAgICBXb3JrZXJNZXNzYWdlVHlwZVtcIkdFVF9QUk9QU19SRVFVRVNUXCJdID0gXCJnZXRfcHJvcHNfcmVxdWVzdFwiO1xuICAgIFdvcmtlck1lc3NhZ2VUeXBlW1wiRVJST1JcIl0gPSBcImVycm9yXCI7XG59KShXb3JrZXJNZXNzYWdlVHlwZSB8fCAoV29ya2VyTWVzc2FnZVR5cGUgPSB7fSkpO1xuLyoqXG4gKiBDbGllbnQgZm9yIHRoZSBEYXNoIFdlYlNvY2tldCBTaGFyZWRXb3JrZXIuXG4gKi9cbmNsYXNzIFdvcmtlckNsaWVudCB7XG4gICAgd29ya2VyID0gbnVsbDtcbiAgICByZW5kZXJlcklkO1xuICAgIHBlbmRpbmdDYWxsYmFja3MgPSBuZXcgTWFwKCk7XG4gICAgcmVxdWVzdENvdW50ZXIgPSAwO1xuICAgIGlzQ29ubmVjdGVkID0gZmFsc2U7XG4gICAgY29ubmVjdGlvblByb21pc2UgPSBudWxsO1xuICAgIGNvbm5lY3Rpb25SZXNvbHZlID0gbnVsbDtcbiAgICAvKiogQ2FsbGJhY2sgd2hlbiBTRVRfUFJPUFMgbWVzc2FnZSBpcyByZWNlaXZlZCAqL1xuICAgIG9uU2V0UHJvcHMgPSBudWxsO1xuICAgIC8qKiBDYWxsYmFjayB3aGVuIFNFVF9QUk9QU19CQVRDSCBtZXNzYWdlIGlzIHJlY2VpdmVkICovXG4gICAgb25TZXRQcm9wc0JhdGNoID0gbnVsbDtcbiAgICAvKiogQ2FsbGJhY2sgd2hlbiBHRVRfUFJPUFNfUkVRVUVTVCBtZXNzYWdlIGlzIHJlY2VpdmVkICovXG4gICAgb25HZXRQcm9wc1JlcXVlc3QgPSBudWxsO1xuICAgIC8qKiBDYWxsYmFjayB3aGVuIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQgKi9cbiAgICBvbkNvbm5lY3RlZCA9IG51bGw7XG4gICAgLyoqIENhbGxiYWNrIHdoZW4gY29ubmVjdGlvbiBpcyBsb3N0ICovXG4gICAgb25EaXNjb25uZWN0ZWQgPSBudWxsO1xuICAgIC8qKiBDYWxsYmFjayB3aGVuIGFuIGVycm9yIG9jY3VycyAqL1xuICAgIG9uRXJyb3IgPSBudWxsO1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnJlbmRlcmVySWQgPSBnZXRSZW5kZXJlcklkKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgdGhlIHdvcmtlciBjb25uZWN0aW9uLlxuICAgICAqIEBwYXJhbSB3b3JrZXJVcmwgVVJMIHRvIHRoZSBTaGFyZWRXb3JrZXIgc2NyaXB0XG4gICAgICogQHBhcmFtIHNlcnZlclVybCBXZWJTb2NrZXQgc2VydmVyIFVSTFxuICAgICAqIEBwYXJhbSBpbmFjdGl2aXR5VGltZW91dCBPcHRpb25hbCBpbmFjdGl2aXR5IHRpbWVvdXQgaW4gbXNcbiAgICAgKiBAcGFyYW0gaGVhcnRiZWF0SW50ZXJ2YWwgT3B0aW9uYWwgaGVhcnRiZWF0IGludGVydmFsIGluIG1zXG4gICAgICovXG4gICAgYXN5bmMgY29ubmVjdCh3b3JrZXJVcmwsIHNlcnZlclVybCwgaW5hY3Rpdml0eVRpbWVvdXQsIGhlYXJ0YmVhdEludGVydmFsKSB7XG4gICAgICAgIGlmICh0aGlzLndvcmtlcikge1xuICAgICAgICAgICAgLy8gQWxyZWFkeSBjb25uZWN0ZWRcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBDcmVhdGUgdGhlIFNoYXJlZFdvcmtlclxuICAgICAgICB0aGlzLndvcmtlciA9IG5ldyBTaGFyZWRXb3JrZXIod29ya2VyVXJsLCB7XG4gICAgICAgICAgICBuYW1lOiAnZGFzaC13cy13b3JrZXInXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBTZXQgdXAgbWVzc2FnZSBoYW5kbGluZ1xuICAgICAgICB0aGlzLndvcmtlci5wb3J0Lm9ubWVzc2FnZSA9IHRoaXMuaGFuZGxlTWVzc2FnZS5iaW5kKHRoaXMpO1xuICAgICAgICAvLyBDcmVhdGUgcHJvbWlzZSBmb3IgY29ubmVjdGlvblxuICAgICAgICB0aGlzLmNvbm5lY3Rpb25Qcm9taXNlID0gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25SZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIFN0YXJ0IHRoZSBwb3J0XG4gICAgICAgIHRoaXMud29ya2VyLnBvcnQuc3RhcnQoKTtcbiAgICAgICAgLy8gU2VuZCBjb25uZWN0IG1lc3NhZ2VcbiAgICAgICAgdGhpcy53b3JrZXIucG9ydC5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICB0eXBlOiBXb3JrZXJNZXNzYWdlVHlwZS5DT05ORUNULFxuICAgICAgICAgICAgcmVuZGVyZXJJZDogdGhpcy5yZW5kZXJlcklkLFxuICAgICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgICAgIHNlcnZlclVybCxcbiAgICAgICAgICAgICAgICBpbmFjdGl2aXR5VGltZW91dCxcbiAgICAgICAgICAgICAgICBoZWFydGJlYXRJbnRlcnZhbFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gV2FpdCBmb3IgY29ubmVjdGlvblxuICAgICAgICBhd2FpdCB0aGlzLmNvbm5lY3Rpb25Qcm9taXNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEaXNjb25uZWN0IGZyb20gdGhlIHdvcmtlci5cbiAgICAgKi9cbiAgICBkaXNjb25uZWN0KCkge1xuICAgICAgICBpZiAodGhpcy53b3JrZXIpIHtcbiAgICAgICAgICAgIHRoaXMud29ya2VyLnBvcnQucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgIHR5cGU6IFdvcmtlck1lc3NhZ2VUeXBlLkRJU0NPTk5FQ1QsXG4gICAgICAgICAgICAgICAgcmVuZGVyZXJJZDogdGhpcy5yZW5kZXJlcklkXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMud29ya2VyLnBvcnQuY2xvc2UoKTtcbiAgICAgICAgICAgIHRoaXMud29ya2VyID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzQ29ubmVjdGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvblByb21pc2UgPSBudWxsO1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb25SZXNvbHZlID0gbnVsbDtcbiAgICAgICAgLy8gUmVzb2x2ZSBwZW5kaW5nIGNhbGxiYWNrcyB3aXRoIHByZXZlbnRfdXBkYXRlIHNvIGxvYWRpbmcgc3RhdGVzIGNsZWFyXG4gICAgICAgIGZvciAoY29uc3QgWywgcGVuZGluZ10gb2YgdGhpcy5wZW5kaW5nQ2FsbGJhY2tzKSB7XG4gICAgICAgICAgICBwZW5kaW5nLnJlc29sdmUoeyBzdGF0dXM6ICdwcmV2ZW50X3VwZGF0ZScgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wZW5kaW5nQ2FsbGJhY2tzLmNsZWFyKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVuc3VyZSB0aGUgd29ya2VyIGlzIGNvbm5lY3RlZCwgaW5pdGlhdGluZyBjb25uZWN0aW9uIGlmIG5lZWRlZC5cbiAgICAgKiBAcGFyYW0gY29uZmlnIFRoZSBEYXNoIGNvbmZpZyB3aXRoIHdlYnNvY2tldCBzZXR0aW5nc1xuICAgICAqL1xuICAgIGFzeW5jIGVuc3VyZUNvbm5lY3RlZChjb25maWcpIHtcbiAgICAgICAgLy8gQWxyZWFkeSBjb25uZWN0ZWRcbiAgICAgICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBDb25uZWN0aW9uIGluIHByb2dyZXNzLCB3YWl0IGZvciBpdFxuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uUHJvbWlzZSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jb25uZWN0aW9uUHJvbWlzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBOZWVkIHRvIGluaXRpYXRlIGNvbm5lY3Rpb25cbiAgICAgICAgaWYgKCFjb25maWcud2Vic29ja2V0Py51cmwgfHwgIWNvbmZpZy53ZWJzb2NrZXQ/Lndvcmtlcl91cmwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV2ViU29ja2V0IGNvbmZpZyBub3QgYXZhaWxhYmxlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBTaGFyZWRXb3JrZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NoYXJlZFdvcmtlciBub3Qgc3VwcG9ydGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQnVpbGQgV2ViU29ja2V0IFVSTFxuICAgICAgICBjb25zdCB3c1Byb3RvY29sID0gd2luZG93LmxvY2F0aW9uLnByb3RvY29sID09PSAnaHR0cHM6JyA/ICd3c3M6JyA6ICd3czonO1xuICAgICAgICBjb25zdCBob3N0ID0gd2luZG93LmxvY2F0aW9uLmhvc3Q7XG4gICAgICAgIGNvbnN0IHdzVXJsID0gYCR7d3NQcm90b2NvbH0vLyR7aG9zdH0ke2NvbmZpZy53ZWJzb2NrZXQudXJsfWA7XG4gICAgICAgIGF3YWl0IHRoaXMuY29ubmVjdChjb25maWcud2Vic29ja2V0Lndvcmtlcl91cmwsIHdzVXJsLCBjb25maWcud2Vic29ja2V0LmluYWN0aXZpdHlfdGltZW91dCwgY29uZmlnLndlYnNvY2tldC5oZWFydGJlYXRfaW50ZXJ2YWwpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIGEgY2FsbGJhY2sgcmVxdWVzdCB0byB0aGUgc2VydmVyIHZpYSB0aGUgd29ya2VyLlxuICAgICAqIEBwYXJhbSBwYXlsb2FkIFRoZSBjYWxsYmFjayBwYXlsb2FkXG4gICAgICogQHBhcmFtIG9uRnJhbWUgT3B0aW9uYWwgaGFuZGxlciBmb3IgaW50ZXJtZWRpYXRlIGZyYW1lcyBmcm9tIGFcbiAgICAgKiAgIHN0cmVhbWluZyBjYWxsYmFjazsgdGhlIHJldHVybmVkIHByb21pc2Ugc3RpbGwgcmVzb2x2ZXMgb25jZSB3aXRoXG4gICAgICogICB0aGUgdGVybWluYWwgcmVzcG9uc2UuXG4gICAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGNhbGxiYWNrIHJlc3BvbnNlXG4gICAgICovXG4gICAgYXN5bmMgc2VuZENhbGxiYWNrKHBheWxvYWQsIG9uRnJhbWUpIHtcbiAgICAgICAgLy8gV2FpdCBmb3IgaW5pdGlhbCBjb25uZWN0aW9uIGlmIG9uZSBpcyBpbiBwcm9ncmVzc1xuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uUHJvbWlzZSAmJiAhdGhpcy5pc0Nvbm5lY3RlZCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jb25uZWN0aW9uUHJvbWlzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMud29ya2VyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dvcmtlciBub3QgY29ubmVjdGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVxdWVzdElkID0gYCR7dGhpcy5yZW5kZXJlcklkfS0keysrdGhpcy5yZXF1ZXN0Q291bnRlcn1gO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nQ2FsbGJhY2tzLnNldChyZXF1ZXN0SWQsIHsgcmVzb2x2ZSwgcmVqZWN0LCBvbkZyYW1lIH0pO1xuICAgICAgICAgICAgdGhpcy53b3JrZXIucG9ydC5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgdHlwZTogV29ya2VyTWVzc2FnZVR5cGUuQ0FMTEJBQ0tfUkVRVUVTVCxcbiAgICAgICAgICAgICAgICByZW5kZXJlcklkOiB0aGlzLnJlbmRlcmVySWQsXG4gICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZCBhIGdldF9wcm9wcyByZXNwb25zZSBiYWNrIHRvIHRoZSBzZXJ2ZXIuXG4gICAgICogQHBhcmFtIHJlcXVlc3RJZCBUaGUgcmVxdWVzdCBJRCBmcm9tIHRoZSBnZXRfcHJvcHMgcmVxdWVzdFxuICAgICAqIEBwYXJhbSBwcm9wcyBUaGUgcHJvcGVydHkgdmFsdWVzXG4gICAgICovXG4gICAgc2VuZEdldFByb3BzUmVzcG9uc2UocmVxdWVzdElkLCBwcm9wcykge1xuICAgICAgICBpZiAoIXRoaXMud29ya2VyIHx8ICF0aGlzLmlzQ29ubmVjdGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy53b3JrZXIucG9ydC5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICB0eXBlOiBXb3JrZXJNZXNzYWdlVHlwZS5HRVRfUFJPUFNfUkVTUE9OU0UsXG4gICAgICAgICAgICByZW5kZXJlcklkOiB0aGlzLnJlbmRlcmVySWQsXG4gICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICBwYXlsb2FkOiBwcm9wc1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIHdvcmtlciBpcyBjb25uZWN0ZWQuXG4gICAgICovXG4gICAgZ2V0IGNvbm5lY3RlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNDb25uZWN0ZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE5vdGlmeSB0aGUgd29ya2VyIHRoYXQgdGhlIHRhYiBpcyBub3cgdmlzaWJsZS5cbiAgICAgKiBUaGlzIHJlc2V0cyB0aGUgaW5hY3Rpdml0eSB0aW1lciB0byBwcmV2ZW50IHRpbWVvdXQgd2hpbGUgdXNlciBpcyB2aWV3aW5nLlxuICAgICAqL1xuICAgIG5vdGlmeVRhYlZpc2libGUoKSB7XG4gICAgICAgIGlmICh0aGlzLndvcmtlciAmJiB0aGlzLmlzQ29ubmVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLndvcmtlci5wb3J0LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBXb3JrZXJNZXNzYWdlVHlwZS5UQUJfVklTSUJMRSxcbiAgICAgICAgICAgICAgICByZW5kZXJlcklkOiB0aGlzLnJlbmRlcmVySWRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZU1lc3NhZ2UoZXZlbnQpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGV2ZW50LmRhdGE7XG4gICAgICAgIHN3aXRjaCAobWVzc2FnZS50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFdvcmtlck1lc3NhZ2VUeXBlLkNPTk5FQ1RFRDpcbiAgICAgICAgICAgICAgICB0aGlzLmlzQ29ubmVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uUmVzb2x2ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25SZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvblJlc29sdmUgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vbkNvbm5lY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uQ29ubmVjdGVkKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBXb3JrZXJNZXNzYWdlVHlwZS5ESVNDT05ORUNURUQ6XG4gICAgICAgICAgICAgICAgdGhpcy5pc0Nvbm5lY3RlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIC8vIFJlc29sdmUgcGVuZGluZyBjYWxsYmFja3Mgd2l0aCBwcmV2ZW50X3VwZGF0ZSBzbyBsb2FkaW5nIHN0YXRlcyBjbGVhclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgWywgcGVuZGluZ10gb2YgdGhpcy5wZW5kaW5nQ2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAgICAgICAgIHBlbmRpbmcucmVzb2x2ZSh7IHN0YXR1czogJ3ByZXZlbnRfdXBkYXRlJyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nQ2FsbGJhY2tzLmNsZWFyKCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub25EaXNjb25uZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkRpc2Nvbm5lY3RlZChtZXNzYWdlLnBheWxvYWQ/LnJlYXNvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBXb3JrZXJNZXNzYWdlVHlwZS5DQUxMQkFDS19SRVNQT05TRToge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RJZCA9IG1lc3NhZ2UucmVxdWVzdElkO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlzLnBlbmRpbmdDYWxsYmFja3MuZ2V0KHJlcXVlc3RJZCk7XG4gICAgICAgICAgICAgICAgaWYgKHBlbmRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IG1lc3NhZ2UucGF5bG9hZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBheWxvYWQ/LnN0cmVhbSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgIXBheWxvYWQuZG9uZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZC5zdGF0dXMgPT09ICdvaycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybWVkaWF0ZSBzdHJlYW0gZnJhbWU6IGRlbGl2ZXIgaXQgYW5kIGtlZXAgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXF1ZXN0IHBlbmRpbmcgdW50aWwgdGhlIHRlcm1pbmFsIGZyYW1lIGFycml2ZXMuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGVuZGluZy5vbkZyYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZy5vbkZyYW1lKHBheWxvYWQuZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmdDYWxsYmFja3MuZGVsZXRlKHJlcXVlc3RJZCk7XG4gICAgICAgICAgICAgICAgICAgIHBlbmRpbmcucmVzb2x2ZShwYXlsb2FkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFdvcmtlck1lc3NhZ2VUeXBlLlNFVF9QUk9QUzpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vblNldFByb3BzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25TZXRQcm9wcyhtZXNzYWdlLnBheWxvYWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgV29ya2VyTWVzc2FnZVR5cGUuU0VUX1BST1BTX0JBVENIOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uU2V0UHJvcHNCYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uU2V0UHJvcHNCYXRjaChtZXNzYWdlLnBheWxvYWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgV29ya2VyTWVzc2FnZVR5cGUuR0VUX1BST1BTX1JFUVVFU1Q6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub25HZXRQcm9wc1JlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkdldFByb3BzUmVxdWVzdChtZXNzYWdlLnJlcXVlc3RJZCwgbWVzc2FnZS5wYXlsb2FkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFdvcmtlck1lc3NhZ2VUeXBlLkVSUk9SOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkVycm9yKG1lc3NhZ2UucGF5bG9hZD8ubWVzc2FnZSB8fCAnVW5rbm93biBlcnJvcicsIG1lc3NhZ2UucGF5bG9hZD8uY29kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8gU2luZ2xldG9uIGluc3RhbmNlXG5sZXQgd29ya2VyQ2xpZW50SW5zdGFuY2UgPSBudWxsO1xuLyoqXG4gKiBHZXQgdGhlIHNpbmdsZXRvbiBXb3JrZXJDbGllbnQgaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXb3JrZXJDbGllbnQoKSB7XG4gICAgaWYgKCF3b3JrZXJDbGllbnRJbnN0YW5jZSkge1xuICAgICAgICB3b3JrZXJDbGllbnRJbnN0YW5jZSA9IG5ldyBXb3JrZXJDbGllbnQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHdvcmtlckNsaWVudEluc3RhbmNlO1xufVxuLyoqXG4gKiBDaGVjayBpZiBXZWJTb2NrZXQgY2FsbGJhY2tzIGFyZSBnbG9iYWxseSBlbmFibGVkIGFuZCBzdXBwb3J0ZWQuXG4gKiBAcGFyYW0gY29uZmlnIFRoZSBEYXNoIGNvbmZpZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNXZWJTb2NrZXRFbmFibGVkKGNvbmZpZykge1xuICAgIHJldHVybiAhIShjb25maWcud2Vic29ja2V0Py5lbmFibGVkICYmIHR5cGVvZiBTaGFyZWRXb3JrZXIgIT09ICd1bmRlZmluZWQnKTtcbn1cbi8qKlxuICogQ2hlY2sgaWYgV2ViU29ja2V0IGluZnJhc3RydWN0dXJlIGlzIGF2YWlsYWJsZSAoZm9yIHBlci1jYWxsYmFjayB3ZWJzb2NrZXQpLlxuICogQHBhcmFtIGNvbmZpZyBUaGUgRGFzaCBjb25maWdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzV2ViU29ja2V0QXZhaWxhYmxlKGNvbmZpZykge1xuICAgIHJldHVybiAhIShjb25maWcud2Vic29ja2V0Py51cmwgJiZcbiAgICAgICAgY29uZmlnLndlYnNvY2tldD8ud29ya2VyX3VybCAmJlxuICAgICAgICB0eXBlb2YgU2hhcmVkV29ya2VyICE9PSAndW5kZWZpbmVkJyk7XG59XG4iLCJpbXBvcnQgY2hlY2tQcm9wVHlwZXMgZnJvbSAnLi4vY2hlY2tQcm9wVHlwZXMnO1xuaW1wb3J0IHsgcHJvcFR5cGVFcnJvckhhbmRsZXIgfSBmcm9tICcuLi9leGNlcHRpb25zJztcbmltcG9ydCB7IHZhbGlkYXRlQ29tcG9uZW50IH0gZnJvbSAnLi93cmFwcGluZyc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBDaGVja2VkQ29tcG9uZW50KHApIHtcbiAgICBjb25zdCB7IGVsZW1lbnQsIHByb3BzLCBjaGlsZHJlbiwgY29tcG9uZW50IH0gPSBwO1xuICAgIHZhbGlkYXRlQ29tcG9uZW50KGNvbXBvbmVudCk7XG4gICAgY29uc3QgZXJyb3JNZXNzYWdlID0gY2hlY2tQcm9wVHlwZXMoZWxlbWVudC5wcm9wVHlwZXMsIHByb3BzLCAnY29tcG9uZW50IHByb3AnLCBlbGVtZW50KTtcbiAgICBpZiAoZXJyb3JNZXNzYWdlKSB7XG4gICAgICAgIHByb3BUeXBlRXJyb3JIYW5kbGVyKGVycm9yTWVzc2FnZSwgcHJvcHMsIGNvbXBvbmVudC50eXBlKTtcbiAgICB9XG4gICAgcmV0dXJuIGNoaWxkcmVuO1xufVxuIiwiaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VDb250ZXh0LCB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlU3RvcmUsIHVzZVNlbGVjdG9yLCB1c2VEaXNwYXRjaCB9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCB7IGNvbmNhdCwgcGF0aE9yIH0gZnJvbSAncmFtZGEnO1xuZXhwb3J0IGNvbnN0IERhc2hDb250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dCh7fSk7XG5leHBvcnQgZnVuY3Rpb24gRGFzaENvbnRleHRQcm92aWRlcihwcm9wcykge1xuICAgIGNvbnN0IHsgY2hpbGRyZW4sIGNvbXBvbmVudFBhdGggfSA9IHByb3BzO1xuICAgIGNvbnN0IHN0cmluZ1BhdGggPSB1c2VNZW1vKCgpID0+IEpTT04uc3RyaW5naWZ5KGNvbXBvbmVudFBhdGgpLCBbY29tcG9uZW50UGF0aF0pO1xuICAgIGNvbnN0IHN0b3JlID0gdXNlU3RvcmUoKTtcbiAgICBjb25zdCBpc0xvYWRpbmcgPSB1c2VDYWxsYmFjaygob3B0aW9ucykgPT4ge1xuICAgICAgICBjb25zdCB7IGV4dHJhUGF0aCwgcmF3UGF0aCwgZmlsdGVyRnVuYyB9ID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgbGV0IGxvYWRpbmdQYXRoID0gW3N0cmluZ1BhdGhdO1xuICAgICAgICBpZiAoZXh0cmFQYXRoKSB7XG4gICAgICAgICAgICBsb2FkaW5nUGF0aCA9IFtcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShjb25jYXQoY29tcG9uZW50UGF0aCwgZXh0cmFQYXRoKSlcbiAgICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocmF3UGF0aCkge1xuICAgICAgICAgICAgbG9hZGluZ1BhdGggPSBbSlNPTi5zdHJpbmdpZnkocmF3UGF0aCldO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxvYWRpbmcgPSBwYXRoT3IoW10sIGxvYWRpbmdQYXRoLCBzdG9yZS5nZXRTdGF0ZSgpLmxvYWRpbmcpO1xuICAgICAgICByZXR1cm4gZmlsdGVyRnVuY1xuICAgICAgICAgICAgPyBsb2FkaW5nLmZpbHRlcihmaWx0ZXJGdW5jKS5sZW5ndGggPiAwXG4gICAgICAgICAgICA6IGxvYWRpbmcubGVuZ3RoID4gMDtcbiAgICB9LCBbc3RyaW5nUGF0aF0pO1xuICAgIGNvbnN0IHVzZUxvYWRpbmcgPSB1c2VDYWxsYmFjaygob3B0aW9ucykgPT4ge1xuICAgICAgICBjb25zdCB7IGZpbHRlckZ1bmMsIGV4dHJhUGF0aCwgcmF3UGF0aCB9ID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgcmV0dXJuIHVzZVNlbGVjdG9yKChzdGF0ZSkgPT4ge1xuICAgICAgICAgICAgbGV0IGxvYWRpbmdQYXRoID0gW3N0cmluZ1BhdGhdO1xuICAgICAgICAgICAgaWYgKGV4dHJhUGF0aCkge1xuICAgICAgICAgICAgICAgIGxvYWRpbmdQYXRoID0gW1xuICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShjb25jYXQoY29tcG9uZW50UGF0aCwgZXh0cmFQYXRoKSlcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocmF3UGF0aCkge1xuICAgICAgICAgICAgICAgIGxvYWRpbmdQYXRoID0gW0pTT04uc3RyaW5naWZ5KHJhd1BhdGgpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGxvYWQgPSBwYXRoT3IoW10sIGxvYWRpbmdQYXRoLCBzdGF0ZS5sb2FkaW5nKTtcbiAgICAgICAgICAgIGlmIChmaWx0ZXJGdW5jKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvYWQuZmlsdGVyKGZpbHRlckZ1bmMpLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbG9hZC5sZW5ndGggPiAwO1xuICAgICAgICB9KTtcbiAgICB9LCBbc3RyaW5nUGF0aF0pO1xuICAgIGNvbnN0IGN0eFZhbHVlID0gdXNlTWVtbygoKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb21wb25lbnRQYXRoLFxuICAgICAgICAgICAgaXNMb2FkaW5nLFxuICAgICAgICAgICAgdXNlTG9hZGluZyxcbiAgICAgICAgICAgIHVzZVNlbGVjdG9yLFxuICAgICAgICAgICAgdXNlU3RvcmUsXG4gICAgICAgICAgICB1c2VEaXNwYXRjaFxuICAgICAgICB9O1xuICAgIH0sIFtzdHJpbmdQYXRoXSk7XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KERhc2hDb250ZXh0LlByb3ZpZGVyLCB7IHZhbHVlOiBjdHhWYWx1ZSB9LCBjaGlsZHJlbikpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHVzZURhc2hDb250ZXh0KCkge1xuICAgIGNvbnN0IGN0eCA9IHVzZUNvbnRleHQoRGFzaENvbnRleHQpO1xuICAgIGlmICghY3R4KSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Rhc2ggQ29udGV4dCB3YXMgbm90IGZvdW5kLCBjb21wb25lbnQgd2FzIHJlbmRlcmVkIHdpdGhvdXQgYSB3cmFwcGVyLiBVc2UgYHdpbmRvdy5kYXNoX2NvbXBvbmVudF9hcGkuRXh0ZXJuYWxXcmFwcGVyYCB0byBtYWtlIHN1cmUgdGhlIGNvbXBvbmVudCBpcyBwcm9wZXJseSBjb25uZWN0ZWQuJyk7XG4gICAgfVxuICAgIHJldHVybiBjdHggfHwge307XG59XG4iLCJpbXBvcnQgUmVhY3QsIHsgdXNlQ2FsbGJhY2ssIHVzZVJlZiwgdXNlTWVtbywgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgcGF0aCwgY29uY2F0LCBwaWNrQnksIGVxdWFscywga2V5cywgaXMsIGlzRW1wdHksIHBpY2ssIGFzc29jUGF0aCwgcGF0aE9yLCBtZXJnZVJpZ2h0LCBkaXNzb2MsIGFzc29jLCBtYXBPYmpJbmRleGVkLCB0eXBlIH0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IHsgdXNlU2VsZWN0b3IsIHVzZURpc3BhdGNoLCBiYXRjaCB9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCBDb21wb25lbnRFcnJvckJvdW5kYXJ5IGZyb20gJy4uL2NvbXBvbmVudHMvZXJyb3IvQ29tcG9uZW50RXJyb3JCb3VuZGFyeS5yZWFjdCc7XG5pbXBvcnQgeyBub3RpZnlPYnNlcnZlcnMsIG9uRXJyb3IsIHVwZGF0ZVByb3BzLCByZXNldENvbXBvbmVudFN0YXRlIH0gZnJvbSAnLi4vYWN0aW9ucyc7XG5pbXBvcnQgeyBnZXRXYXRjaGVkS2V5cywgc3RyaW5naWZ5SWQgfSBmcm9tICcuLi9hY3Rpb25zL2RlcGVuZGVuY2llcyc7XG5pbXBvcnQgeyBjcmVhdGVFbGVtZW50LCBnZXRDb21wb25lbnRMYXlvdXQsIGlzRHJ5Q29tcG9uZW50LCBjaGVja1JlbmRlclR5cGVQcm9wLCBzdHJpbmdpZnlQYXRoIH0gZnJvbSAnLi93cmFwcGluZyc7XG5pbXBvcnQgUmVnaXN0cnkgZnJvbSAnLi4vcmVnaXN0cnknO1xuaW1wb3J0IGlzU2ltcGxlQ29tcG9uZW50IGZyb20gJy4uL2lzU2ltcGxlQ29tcG9uZW50JztcbmltcG9ydCB7IHNlbGVjdERhc2hQcm9wcywgc2VsZWN0RGFzaFByb3BzRXF1YWxpdHlGbiwgc2VsZWN0Q29uZmlnIH0gZnJvbSAnLi9zZWxlY3RvcnMnO1xuaW1wb3J0IENoZWNrZWRDb21wb25lbnQgZnJvbSAnLi9DaGVja2VkQ29tcG9uZW50JztcbmltcG9ydCB7IERhc2hDb250ZXh0UHJvdmlkZXIgfSBmcm9tICcuL0Rhc2hDb250ZXh0Jztcbi8vIElkZW50aXR5IG9mIGEgZGFzaCBjb21wb25lbnQ6IHdoaWNoIGNvbXBvbmVudCBpdCBpcywgbm90IHdoYXQgaXRzXG4vLyBjdXJyZW50IHByb3AgdmFsdWVzIGFyZS4gVXNlZCB0byBkZWNpZGUgYmV0d2VlbiByZW1vdW50aW5nIChpZGVudGl0eVxuLy8gY2hhbmdlZCkgYW5kIHJlY29uY2lsaW5nIGluIHBsYWNlIChzYW1lIGNvbXBvbmVudCwgbmV3IHByb3BzKS5cbmNvbnN0IGNvbXBvbmVudElkZW50aXR5ID0gKGNvbXBvbmVudCkgPT4ge1xuICAgIGNvbnN0IGlkID0gY29tcG9uZW50Py5wcm9wcz8uaWQ7XG4gICAgcmV0dXJuIGAke2NvbXBvbmVudD8ubmFtZXNwYWNlfS4ke2NvbXBvbmVudD8udHlwZX0uJHtpZCA/IHN0cmluZ2lmeUlkKGlkKSA6ICcnfWA7XG59O1xuZnVuY3Rpb24gRGFzaFdyYXBwZXIoeyBjb21wb25lbnRQYXRoLCBfZGFzaHByaXZhdGVfZXJyb3IsIF9wYXNzZWRDb21wb25lbnQsIC8vIHBhc3MgY29tcG9uZW50IHRvIHRoZSBEYXNoV3JhcHBlciBpbiB0aGUgZXZlbnQgdGhhdCBpdCBpcyBhIG5ld1JlbmRlciBhbmQgdGhlcmUgYXJlIG5vIGxheW91dGhhc2hlc1xuX25ld1JlbmRlciwgLy8gdGhpcyBpcyB0byBmb3JjZSB0aGUgY29tcG9uZW50IHRvIG5ld2x5IHJlbmRlciByZWdhcmRsZXNzIG9mIHByb3BzIChyZWRyYXcgYW5kIGNvbXBvbmVudCBhcyBwcm9wcykgaXMgcGFzc2VkIGZyb20gdGhlIHBhcmVudFxuLi4uZXh0cmFzIH0pIHtcbiAgICBjb25zdCBkaXNwYXRjaCA9IHVzZURpc3BhdGNoKCk7XG4gICAgY29uc3QgbWVtb2l6ZWRLZXlzID0gdXNlUmVmKHt9KTtcbiAgICBjb25zdCBuZXdSZW5kZXIgPSB1c2VSZWYoZmFsc2UpO1xuICAgIGNvbnN0IGZyZXNoUmVuZGVycyA9IHVzZVJlZigwKTtcbiAgICAvLyBEaWQgKnRoaXMqIHJlbmRlciByZW1vdW50IHRoZSBzdWJ0cmVlIChpZGVudGl0eSBjaGFuZ2VkIG9yIGFuIGV4cGxpY2l0XG4gICAgLy8gZGFzaC5yZW1vdW50KCkpPyBBIHJlbW91bnQgcmVidWlsZHMgZXZlcnkgZGVzY2VuZGFudCBmcm9tIHNjcmF0Y2gsIHNvXG4gICAgLy8gdGhlIGl0ZW0tYnktaXRlbSByZWYtc2tpcCBiZWxvdyBtdXN0IG5vdCBjYXJyeSBhbnl0aGluZyBvdmVyIGFjcm9zcyBpdC5cbiAgICBjb25zdCByZW1vdW50ZWRUaGlzUmVuZGVyID0gdXNlUmVmKGZhbHNlKTtcbiAgICBjb25zdCByZW5kZXJlZElkZW50aXR5ID0gdXNlUmVmKG51bGwpO1xuICAgIGNvbnN0IGhhc0ZyZXNoUmVuZGVyZWQgPSB1c2VSZWYoZmFsc2UpO1xuICAgIGNvbnN0IHJlbmRlcmVkUGF0aCA9IHVzZVJlZihjb21wb25lbnRQYXRoKTtcbiAgICBjb25zdCBwcmV2Q2hpbGRyZW5BcnJheXMgPSB1c2VSZWYoe30pO1xuICAgIGxldCByZW5kZXJDb21wb25lbnQgPSBudWxsO1xuICAgIGxldCByZW5kZXJDb21wb25lbnRQcm9wcyA9IG51bGw7XG4gICAgbGV0IHJlbmRlckggPSBudWxsO1xuICAgIC8vIEdldCB0aGUgY29uZmlnIGZvciB0aGUgY29tcG9uZW50IGFzIHByb3BzXG4gICAgY29uc3QgY29uZmlnID0gdXNlU2VsZWN0b3Ioc2VsZWN0Q29uZmlnKTtcbiAgICAvLyBTZWxlY3QgY29tcG9uZW50IGFuZCBpdCdzIHByb3BzLCBhbG9uZyB3aXRoIHJlbmRlciBoYXNoLCBjaGFuZ2VkIHByb3BzIGFuZCB0aGUgcmVhc29uIGZvciByZW5kZXJcbiAgICBjb25zdCBbY29tcG9uZW50LCBjb21wb25lbnRQcm9wcywgaCwgY2hhbmdlZFByb3BzLCByZW5kZXJUeXBlXSA9IHVzZVNlbGVjdG9yKHNlbGVjdERhc2hQcm9wcyhjb21wb25lbnRQYXRoKSwgc2VsZWN0RGFzaFByb3BzRXF1YWxpdHlGbik7XG4gICAgcmVuZGVyQ29tcG9uZW50ID0gY29tcG9uZW50O1xuICAgIHJlbmRlckNvbXBvbmVudFByb3BzID0gY29tcG9uZW50UHJvcHM7XG4gICAgcmVuZGVySCA9IGg7XG4gICAgdXNlTWVtbygoKSA9PiB7XG4gICAgICAgIGlmIChfbmV3UmVuZGVyKSB7XG4gICAgICAgICAgICBuZXdSZW5kZXIuY3VycmVudCA9IHRydWU7XG4gICAgICAgICAgICByZW5kZXJIID0gMDtcbiAgICAgICAgICAgIC8vIE9ubHkgZm9yY2UgYSByZW1vdW50ICh2aWEgdGhlIGBrZXlgIGJ1bXAgYmVsb3cpIHdoZW4gdGhlXG4gICAgICAgICAgICAvLyBjb21wb25lbnQgaWRlbnRpdHkgYXQgdGhpcyBwYXRoIGFjdHVhbGx5IGNoYW5nZWQuIFdoZW4gdGhlXG4gICAgICAgICAgICAvLyBzYW1lIGNvbXBvbmVudCBpcyBwYXNzZWQgYWdhaW4gKGVnOiBhIGNhbGxiYWNrIHJldHVybmluZ1xuICAgICAgICAgICAgLy8gdXBkYXRlZCBjaGlsZHJlbiB3aXRoIHRoZSBzYW1lIHN0cnVjdHVyZSksIHJlY29uY2lsZSBpblxuICAgICAgICAgICAgLy8gcGxhY2UgaW5zdGVhZCBvZiB1bm1vdW50aW5nIHRoZSB3aG9sZSBzdWJ0cmVlLiAoIzM4NDYpXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gYF9kYXNocHJpdmF0ZV9yZW1vdW50YCBpcyBzZXQgYnkgYGRhc2gucmVtb3VudCgpYCBhbmQgZm9yY2VzXG4gICAgICAgICAgICAvLyBhIHJlbW91bnQgZXZlbiB3aGVuIHRoZSBpZGVudGl0eSBpcyB1bmNoYW5nZWQsIGxldHRpbmcgYVxuICAgICAgICAgICAgLy8gY2FsbGJhY2sgZXhwbGljaXRseSByZXNldCBhIGNvbXBvbmVudCdzIGludGVybmFsIHN0YXRlLlxuICAgICAgICAgICAgY29uc3QgaWRlbnRpdHkgPSBjb21wb25lbnRJZGVudGl0eShfcGFzc2VkQ29tcG9uZW50KTtcbiAgICAgICAgICAgIGNvbnN0IGlzUmVtb3VudCA9IEJvb2xlYW4oX3Bhc3NlZENvbXBvbmVudD8uX2Rhc2hwcml2YXRlX3JlbW91bnQgfHxcbiAgICAgICAgICAgICAgICAocmVuZGVyZWRJZGVudGl0eS5jdXJyZW50ICE9PSBudWxsICYmXG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkSWRlbnRpdHkuY3VycmVudCAhPT0gaWRlbnRpdHkpKTtcbiAgICAgICAgICAgIHJlbW91bnRlZFRoaXNSZW5kZXIuY3VycmVudCA9IGlzUmVtb3VudDtcbiAgICAgICAgICAgIGlmIChpc1JlbW91bnQpIHtcbiAgICAgICAgICAgICAgICBmcmVzaFJlbmRlcnMuY3VycmVudCArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVuZGVyZWRJZGVudGl0eS5jdXJyZW50ID0gaWRlbnRpdHk7XG4gICAgICAgICAgICBpZiAocmVuZGVySCBpbiBtZW1vaXplZEtleXMuY3VycmVudCkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBtZW1vaXplZEtleXMuY3VycmVudFtyZW5kZXJIXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG5ld1JlbmRlci5jdXJyZW50ID0gZmFsc2U7XG4gICAgICAgICAgICByZW1vdW50ZWRUaGlzUmVuZGVyLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZW5kZXJlZFBhdGguY3VycmVudCA9IGNvbXBvbmVudFBhdGg7XG4gICAgfSwgW19uZXdSZW5kZXJdKTtcbiAgICBjb25zdCBzZXRQcm9wcyA9IChuZXdQcm9wcykgPT4ge1xuICAgICAgICBjb25zdCB7IGlkIH0gPSByZW5kZXJDb21wb25lbnRQcm9wcztcbiAgICAgICAgY29uc3QgeyBfZGFzaF9lcnJvciwgLi4ucmVzdFByb3BzIH0gPSBuZXdQcm9wcztcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGRpc3BhdGNoKChkaXNwYXRjaCwgZ2V0U3RhdGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IGdldFN0YXRlKCk7XG4gICAgICAgICAgICBjb25zdCB7IGdyYXBocyB9ID0gY3VycmVudFN0YXRlO1xuICAgICAgICAgICAgY29uc3Qgb2xkTGF5b3V0ID0gZ2V0Q29tcG9uZW50TGF5b3V0KHJlbmRlcmVkUGF0aC5jdXJyZW50LCBjdXJyZW50U3RhdGUpO1xuICAgICAgICAgICAgaWYgKCFvbGRMYXlvdXQpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgeyBwcm9wczogb2xkUHJvcHMgfSA9IG9sZExheW91dDtcbiAgICAgICAgICAgIGlmICghb2xkUHJvcHMpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgY2hhbmdlZFByb3BzID0gcGlja0J5KCh2YWwsIGtleSkgPT4gIWVxdWFscyh2YWwsIG9sZFByb3BzW2tleV0pLCByZXN0UHJvcHMpO1xuICAgICAgICAgICAgaWYgKF9kYXNoX2Vycm9yKSB7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2gob25FcnJvcih7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdmcm9udEVuZCcsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiBfZGFzaF9lcnJvclxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc0VtcHR5KGNoYW5nZWRQcm9wcykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJZGVudGlmeSB0aGUgbW9kaWZpZWQgcHJvcHMgdGhhdCBhcmUgcmVxdWlyZWQgZm9yIGNhbGxiYWNrc1xuICAgICAgICAgICAgY29uc3Qgd2F0Y2hlZEtleXMgPSBnZXRXYXRjaGVkS2V5cyhpZCwga2V5cyhjaGFuZ2VkUHJvcHMpLCBncmFwaHMpO1xuICAgICAgICAgICAgYmF0Y2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIE9ubHkgZGlzcGF0Y2ggY2hhbmdlcyB0byBEYXNoIGlmIGEgd2F0Y2hlZCBwcm9wIGNoYW5nZWRcbiAgICAgICAgICAgICAgICBpZiAod2F0Y2hlZEtleXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKG5vdGlmeU9ic2VydmVycyh7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzOiBwaWNrKHdhdGNoZWRLZXlzLCBjaGFuZ2VkUHJvcHMpXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQWx3YXlzIHVwZGF0ZSB0aGlzIGNvbXBvbmVudCdzIHByb3BzXG4gICAgICAgICAgICAgICAgZGlzcGF0Y2godXBkYXRlUHJvcHMoe1xuICAgICAgICAgICAgICAgICAgICBwcm9wczogY2hhbmdlZFByb3BzLFxuICAgICAgICAgICAgICAgICAgICBpdGVtcGF0aDogcmVuZGVyZWRQYXRoLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgIHJlbmRlclR5cGU6ICdpbnRlcm5hbCdcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBjb25zdCBjcmVhdGVDb250YWluZXIgPSB1c2VDYWxsYmFjaygoY29udGFpbmVyLCBjb250YWluZXJQYXRoLCBfY2hpbGROZXdSZW5kZXIpID0+IHtcbiAgICAgICAgaWYgKGlzU2ltcGxlQ29tcG9uZW50KHJlbmRlckNvbXBvbmVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiByZW5kZXJDb21wb25lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KERhc2hXcmFwcGVyLCB7IGtleTogY29udGFpbmVyPy5wcm9wcz8uaWRcbiAgICAgICAgICAgICAgICA/IHN0cmluZ2lmeUlkKGNvbnRhaW5lci5wcm9wcy5pZClcbiAgICAgICAgICAgICAgICA6IHN0cmluZ2lmeVBhdGgoY29udGFpbmVyUGF0aCksIF9kYXNocHJpdmF0ZV9lcnJvcjogX2Rhc2hwcml2YXRlX2Vycm9yLCBjb21wb25lbnRQYXRoOiBjb250YWluZXJQYXRoLCBfcGFzc2VkQ29tcG9uZW50OiBjb250YWluZXIsIF9uZXdSZW5kZXI6IF9jaGlsZE5ld1JlbmRlciB9KSk7XG4gICAgfSwgW10pO1xuICAgIGNvbnN0IHdyYXBDaGlsZHJlblByb3AgPSB1c2VDYWxsYmFjaygobm9kZSwgY2hpbGRyZW5QYXRoLCBfY2hpbGROZXdSZW5kZXIsIGFsbG93UmVmU2tpcCA9IGZhbHNlKSA9PiB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG5vZGUpKSB7XG4gICAgICAgICAgICBjb25zdCBwYXRoS2V5ID0gc3RyaW5naWZ5UGF0aChjaGlsZHJlblBhdGgpO1xuICAgICAgICAgICAgY29uc3QgcHJldkFycmF5ID0gYWxsb3dSZWZTa2lwXG4gICAgICAgICAgICAgICAgPyBwcmV2Q2hpbGRyZW5BcnJheXMuY3VycmVudFtwYXRoS2V5XVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgcHJldkNoaWxkcmVuQXJyYXlzLmN1cnJlbnRbcGF0aEtleV0gPSBub2RlO1xuICAgICAgICAgICAgcmV0dXJuIG5vZGUubWFwKChuLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGlzRHJ5Q29tcG9uZW50KG4pKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuY2hhbmdlZCA9IGFsbG93UmVmU2tpcCAmJiBwcmV2QXJyYXk/LltpXSA9PT0gbjtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUNvbnRhaW5lcihuLCBjb25jYXQoY29tcG9uZW50UGF0aCwgW1xuICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3BzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmNoaWxkcmVuUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlcbiAgICAgICAgICAgICAgICAgICAgXSksIHVuY2hhbmdlZCA/IDAgOiBfY2hpbGROZXdSZW5kZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNEcnlDb21wb25lbnQobm9kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjcmVhdGVDb250YWluZXIobm9kZSwgY29uY2F0KGNvbXBvbmVudFBhdGgsIFsncHJvcHMnLCAuLi5jaGlsZHJlblBhdGhdKSwgX2NoaWxkTmV3UmVuZGVyKTtcbiAgICB9LCBbY29tcG9uZW50UGF0aF0pO1xuICAgIGNvbnN0IGV4dHJhUHJvcHMgPSB7XG4gICAgICAgIHNldFByb3BzLFxuICAgICAgICAuLi5leHRyYXNcbiAgICB9O1xuICAgIGlmIChjaGVja1JlbmRlclR5cGVQcm9wKHJlbmRlckNvbXBvbmVudCkpIHtcbiAgICAgICAgZXh0cmFQcm9wc1snZGFzaFJlbmRlclR5cGUnXSA9IG5ld1JlbmRlci5jdXJyZW50XG4gICAgICAgICAgICA/ICdwYXJlbnQnXG4gICAgICAgICAgICA6IGNoYW5nZWRQcm9wc1xuICAgICAgICAgICAgICAgID8gcmVuZGVyVHlwZVxuICAgICAgICAgICAgICAgIDogJ3BhcmVudCc7XG4gICAgfVxuICAgIGNvbnN0IHNldEh5ZHJhdGVkUHJvcHMgPSAoY29tcG9uZW50LCBjb21wb25lbnRQcm9wcykgPT4ge1xuICAgICAgICAvLyBIeWRyYXRlIGNvbXBvbmVudHMgcHJvcHNcbiAgICAgICAgY29uc3QgY2hpbGRyZW5Qcm9wcyA9IHBhdGhPcihbXSwgWydjaGlsZHJlbl9wcm9wcycsIGNvbXBvbmVudD8ubmFtZXNwYWNlLCBjb21wb25lbnQ/LnR5cGVdLCBjb25maWcpO1xuICAgICAgICBsZXQgcHJvcHMgPSBtZXJnZVJpZ2h0KGRpc3NvYygnY2hpbGRyZW4nLCBjb21wb25lbnRQcm9wcyksIGV4dHJhUHJvcHMpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuUHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuUHJvcCA9IGNoaWxkcmVuUHJvcHNbaV07XG4gICAgICAgICAgICBsZXQgY2hpbGROZXdSZW5kZXIgPSAwO1xuICAgICAgICAgICAgaWYgKGNoaWxkcmVuUHJvcFxuICAgICAgICAgICAgICAgIC5zcGxpdCgnLicpWzBdXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoJ1tdJywgJycpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoJ3t9JywgJycpIGluIGNoYW5nZWRQcm9wcyB8fFxuICAgICAgICAgICAgICAgIG5ld1JlbmRlci5jdXJyZW50IHx8XG4gICAgICAgICAgICAgICAgIXJlbmRlckgpIHtcbiAgICAgICAgICAgICAgICBjaGlsZE5ld1JlbmRlciA9IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaGFuZGxlT2JqZWN0ID0gKG9iaiwgb3BhdGgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWFwT2JqSW5kZXhlZCgobm9kZSwgaykgPT4gd3JhcENoaWxkcmVuUHJvcChub2RlLCBbLi4ub3BhdGgsIGtdLCBjaGlsZE5ld1JlbmRlciksIG9iaik7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKGNoaWxkcmVuUHJvcC5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNoaWxkcmVuUGF0aCA9IGNoaWxkcmVuUHJvcC5zcGxpdCgnLicpO1xuICAgICAgICAgICAgICAgIGxldCBub2RlO1xuICAgICAgICAgICAgICAgIGxldCBub2RlVmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuUHJvcC5pbmNsdWRlcygnW10nKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmcm9udFBhdGggPSBbXSwgYmFja1BhdGggPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZvdW5kID0gZmFsc2UsIGhhc09iamVjdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAvLyBBdCBmaXJzdCB0aGUgY2hpbGRyZW5QYXRoIGlzIGFsd2F5cyBhIGxpc3Qgb2Ygc3RyaW5ncy5cbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5QYXRoLmZvckVhY2gocCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHAuaW5jbHVkZXMoJ1tdJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocC5pbmNsdWRlcygne30nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzT2JqZWN0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb250UGF0aC5wdXNoKHAucmVwbGFjZSgne30nLCAnJykucmVwbGFjZSgnW10nLCAnJykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbnRQYXRoLnB1c2gocC5yZXBsYWNlKCdbXScsICcnKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocC5pbmNsdWRlcygne30nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNPYmplY3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9udFBhdGgucHVzaChwLnJlcGxhY2UoJ3t9JywgJycpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb250UGF0aC5wdXNoKHApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwLmluY2x1ZGVzKCd7fScpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc09iamVjdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tQYXRoLnB1c2gocC5yZXBsYWNlKCd7fScsICcnKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrUGF0aC5wdXNoKHApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUgPSBwYXRoKGZyb250UGF0aCwgcHJvcHMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZSA9PT0gdW5kZWZpbmVkIHx8ICFub2RlPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpcnN0Tm9kZSA9IHBhdGgoYmFja1BhdGgsIG5vZGVbMF0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWZpcnN0Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbm9kZVZhbHVlID0gbm9kZS5tYXAoKGVsLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50UGF0aCA9IGNvbmNhdChmcm9udFBhdGgsIGNvbmNhdChbaV0sIGJhY2tQYXRoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGlzdFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc09iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiYWNrUGF0aC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdFZhbHVlID0gaGFuZGxlT2JqZWN0KHBhdGgoYmFja1BhdGgsIGVsKSwgZWxlbWVudFBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdFZhbHVlID0gaGFuZGxlT2JqZWN0KGVsLCBlbGVtZW50UGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdFZhbHVlID0gd3JhcENoaWxkcmVuUHJvcChwYXRoKGJhY2tQYXRoLCBlbCksIGVsZW1lbnRQYXRoLCBjaGlsZE5ld1JlbmRlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXNzb2NQYXRoKGJhY2tQYXRoLCBsaXN0VmFsdWUsIGVsKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuUGF0aCA9IGZyb250UGF0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlblByb3AuaW5jbHVkZXMoJ3t9JykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgc3VwcG9ydHMgb25lIGxldmVsIG9mIG5lc3RpbmcuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmcm9udCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGR5bmFtaWMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoYXNCYWNrID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYWNrUGF0aCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjaGlsZHJlblBhdGgubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXIgPSBjaGlsZHJlblBhdGhbal07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1ci5pbmNsdWRlcygne30nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljID0gY29uY2F0KGZyb250LCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXIucmVwbGFjZSgne30nLCAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqIDwgY2hpbGRyZW5QYXRoLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0JhY2sgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzQmFjaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja1BhdGgucHVzaChjdXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbnQucHVzaChjdXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHluVmFsdWUgPSBwYXRoKGR5bmFtaWMsIHByb3BzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkeW5WYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG9vIGR5bmFtaWMgZm9yIHByb3BlciB0cy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVWYWx1ZSA9IG1hcE9iakluZGV4ZWQoKGQsIGspID0+IHdyYXBDaGlsZHJlblByb3AoaGFzQmFjayA/IHBhdGgoYmFja1BhdGgsIGQpIDogZCwgaGFzQmFja1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGNvbmNhdChkeW5hbWljLCBjb25jYXQoW2tdLCBiYWNrUGF0aCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY29uY2F0KGR5bmFtaWMsIFtrXSksIGNoaWxkTmV3UmVuZGVyKSwgZHluVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuUGF0aCA9IGR5bmFtaWM7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlID0gcGF0aChjaGlsZHJlblBhdGgsIHByb3BzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVWYWx1ZSA9IHdyYXBDaGlsZHJlblByb3Aobm9kZSwgY2hpbGRyZW5QYXRoLCBjaGlsZE5ld1JlbmRlcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHJvcHMgPSBhc3NvY1BhdGgoY2hpbGRyZW5QYXRoLCBub2RlVmFsdWUsIHByb3BzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlblByb3AuaW5jbHVkZXMoJ3t9JykpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9wYXRoID0gY2hpbGRyZW5Qcm9wLnJlcGxhY2UoJ3t9JywgJycpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpc0FycmF5ID0gY2hpbGRyZW5Qcm9wLmluY2x1ZGVzKCdbXScpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNBcnJheSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3BhdGggPSBvcGF0aC5yZXBsYWNlKCdbXScsICcnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gcHJvcHNbb3BhdGhdO1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNBcnJheSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbm9kZS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhUGF0aCA9IGNvbmNhdChbb3BhdGhdLCBbal0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wcyA9IGFzc29jUGF0aChhUGF0aCwgaGFuZGxlT2JqZWN0KG5vZGVbal0sIGFQYXRoKSwgcHJvcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzID0gYXNzb2Mob3BhdGgsIGhhbmRsZU9iamVjdChub2RlLCBbb3BhdGhdKSwgcHJvcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gcHJvcHNbY2hpbGRyZW5Qcm9wXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHMgPSBhc3NvYyhjaGlsZHJlblByb3AsIHdyYXBDaGlsZHJlblByb3Aobm9kZSwgW2NoaWxkcmVuUHJvcF0sIGNoaWxkTmV3UmVuZGVyKSwgcHJvcHMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlKHByb3BzLmlkKSA9PT0gJ09iamVjdCcpIHtcbiAgICAgICAgICAgIC8vIFR1cm4gb2JqZWN0IGlkcyAoZm9yIHdpbGRjYXJkcykgaW50byB1bmlxdWUgc3RyaW5ncy5cbiAgICAgICAgICAgIC8vIEJlY2F1c2Ugb2YgdGhlIGBkaXNzb2NgIGFib3ZlIHdlJ3JlIG5vdCBtdXRhdGluZyB0aGUgbGF5b3V0LFxuICAgICAgICAgICAgLy8ganVzdCB0aGUgaWQgd2UgcGFzcyBvbiB0byB0aGUgcmVuZGVyZWQgY29tcG9uZW50XG4gICAgICAgICAgICBwcm9wcy5pZCA9IHN0cmluZ2lmeUlkKHByb3BzLmlkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvcHM7XG4gICAgfTtcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAoX25ld1JlbmRlcikge1xuICAgICAgICAgICAgLy8gRG9uJ3QgcmVzZXQgZGVzY2VuZGFudCBsYXlvdXQgaGFzaGVzIG9uIHRoZSBjb21wb25lbnQncyB2ZXJ5XG4gICAgICAgICAgICAvLyBmaXJzdCBmcmVzaCByZW5kZXI6IGNvbXBvbmVudHMgdGhhdCBzZXQgdGhlaXIgaW5pdGlhbCBzdGF0ZSBvblxuICAgICAgICAgICAgLy8gbW91bnQgKGVnLiBkYmMgVGFicyBwaWNraW5nIHRoZSBkZWZhdWx0IGFjdGl2ZSB0YWIpIHdvdWxkIGhhdmVcbiAgICAgICAgICAgIC8vIHRoYXQgc3RhdGUgd2lwZWQgYmVmb3JlIGl0IHRha2VzIGVmZmVjdC4gU3RhbGUgZGVzY2VuZGFudFxuICAgICAgICAgICAgLy8gaGFzaGVzIGFyZSBvbmx5IGEgY29uY2VybiBvbmNlIHRoZSBzdWJ0cmVlIGhhcyByZW5kZXJlZCBhdFxuICAgICAgICAgICAgLy8gbGVhc3Qgb25jZSwgc28gcmVzZXQgZnJvbSB0aGUgc2Vjb25kIGZyZXNoIHJlbmRlciBvbndhcmQuXG4gICAgICAgICAgICAvLyAoIzM5MjksIGtlZXBzICMzMzMwIGZpeGVkLilcbiAgICAgICAgICAgIGlmIChoYXNGcmVzaFJlbmRlcmVkLmN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaChyZXNldENvbXBvbmVudFN0YXRlKHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbXBhdGg6IGNvbXBvbmVudFBhdGhcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoYXNGcmVzaFJlbmRlcmVkLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfSwgW19uZXdSZW5kZXJdKTtcbiAgICBjb25zdCBoeWRyYXRlRnVuYyA9ICgpID0+IHtcbiAgICAgICAgaWYgKG5ld1JlbmRlci5jdXJyZW50KSB7XG4gICAgICAgICAgICByZW5kZXJDb21wb25lbnQgPSBfcGFzc2VkQ29tcG9uZW50O1xuICAgICAgICAgICAgcmVuZGVyQ29tcG9uZW50UHJvcHMgPSBfcGFzc2VkQ29tcG9uZW50Py5wcm9wcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJlbmRlckNvbXBvbmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZWxlbWVudCA9IFJlZ2lzdHJ5LnJlc29sdmUocmVuZGVyQ29tcG9uZW50KTtcbiAgICAgICAgY29uc3QgaHlkcmF0ZWRQcm9wcyA9IHNldEh5ZHJhdGVkUHJvcHMocmVuZGVyQ29tcG9uZW50LCByZW5kZXJDb21wb25lbnRQcm9wcyk7XG4gICAgICAgIGxldCBoeWRyYXRlZENoaWxkcmVuO1xuICAgICAgICBpZiAocmVuZGVyQ29tcG9uZW50UHJvcHMuY2hpbGRyZW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaHlkcmF0ZWRDaGlsZHJlbiA9IHdyYXBDaGlsZHJlblByb3AocmVuZGVyQ29tcG9uZW50UHJvcHMuY2hpbGRyZW4sIFsnY2hpbGRyZW4nXSwgIXJlbmRlckggfHwgbmV3UmVuZGVyLmN1cnJlbnQgfHwgJ2NoaWxkcmVuJyBpbiBjaGFuZ2VkUHJvcHNcbiAgICAgICAgICAgICAgICA/IHt9XG4gICAgICAgICAgICAgICAgOiAwLCAhcmVtb3VudGVkVGhpc1JlbmRlci5jdXJyZW50KTtcbiAgICAgICAgfVxuICAgICAgICBuZXdSZW5kZXIuY3VycmVudCA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gY29uZmlnLnByb3BzX2NoZWNrID8gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ2hlY2tlZENvbXBvbmVudCwgeyBlbGVtZW50OiBlbGVtZW50LCBwcm9wczogaHlkcmF0ZWRQcm9wcywgY29tcG9uZW50OiByZW5kZXJDb21wb25lbnQgfSwgY3JlYXRlRWxlbWVudChlbGVtZW50LCBoeWRyYXRlZFByb3BzLCBleHRyYVByb3BzLCBoeWRyYXRlZENoaWxkcmVuKSkpIDogKGNyZWF0ZUVsZW1lbnQoZWxlbWVudCwgaHlkcmF0ZWRQcm9wcywgZXh0cmFQcm9wcywgaHlkcmF0ZWRDaGlsZHJlbikpO1xuICAgIH07XG4gICAgbGV0IGh5ZHJhdGVkID0gbnVsbDtcbiAgICBpZiAocmVuZGVySCBpbiBtZW1vaXplZEtleXMuY3VycmVudCAmJiAhbmV3UmVuZGVyLmN1cnJlbnQpIHtcbiAgICAgICAgaHlkcmF0ZWQgPSBSZWFjdC5pc1ZhbGlkRWxlbWVudChtZW1vaXplZEtleXMuY3VycmVudFtyZW5kZXJIXSlcbiAgICAgICAgICAgID8gbWVtb2l6ZWRLZXlzLmN1cnJlbnRbcmVuZGVySF1cbiAgICAgICAgICAgIDogbnVsbDtcbiAgICB9XG4gICAgaWYgKCFoeWRyYXRlZCkge1xuICAgICAgICBoeWRyYXRlZCA9IGh5ZHJhdGVGdW5jKCk7XG4gICAgICAgIG1lbW9pemVkS2V5cy5jdXJyZW50ID0geyBbcmVuZGVySF06IGh5ZHJhdGVkIH07XG4gICAgfVxuICAgIHJldHVybiByZW5kZXJDb21wb25lbnQgPyAoUmVhY3QuY3JlYXRlRWxlbWVudChDb21wb25lbnRFcnJvckJvdW5kYXJ5LCB7IGNvbXBvbmVudFR5cGU6IHJlbmRlckNvbXBvbmVudC50eXBlLCBjb21wb25lbnRJZDogaXMoT2JqZWN0LCByZW5kZXJDb21wb25lbnRQcm9wcy5pZClcbiAgICAgICAgICAgID8gc3RyaW5naWZ5SWQocmVuZGVyQ29tcG9uZW50UHJvcHMuaWQpXG4gICAgICAgICAgICA6IHJlbmRlckNvbXBvbmVudFByb3BzLmlkLCBlcnJvcjogX2Rhc2hwcml2YXRlX2Vycm9yLCBkaXNwYXRjaDogZGlzcGF0Y2gsIGtleTogZnJlc2hSZW5kZXJzLmN1cnJlbnQgfSxcbiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChEYXNoQ29udGV4dFByb3ZpZGVyLCB7IGNvbXBvbmVudFBhdGg6IGNvbXBvbmVudFBhdGggfSwgUmVhY3QuaXNWYWxpZEVsZW1lbnQoaHlkcmF0ZWQpID8gaHlkcmF0ZWQgOiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIG51bGwpKSkpIDogKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgbnVsbCkpO1xufVxuZXhwb3J0IGRlZmF1bHQgRGFzaFdyYXBwZXI7XG4iLCJpbXBvcnQgUmVhY3QsIHsgdXNlU3RhdGUsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHBhdGggfSBmcm9tICdyYW1kYSc7XG5pbXBvcnQgeyBiYXRjaCwgdXNlRGlzcGF0Y2ggfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgRGFzaFdyYXBwZXIgZnJvbSAnLi9EYXNoV3JhcHBlcic7XG5pbXBvcnQgeyBhZGRDb21wb25lbnRUb0xheW91dCwgbm90aWZ5T2JzZXJ2ZXJzLCByZW1vdmVDb21wb25lbnQsIHVwZGF0ZVByb3BzIH0gZnJvbSAnLi4vYWN0aW9ucyc7XG4vKipcbiAqIEZvciByZW5kZXJpbmcgY29tcG9uZW50cyB0aGF0IGFyZSBvdXQgb2YgdGhlIHJlZ3VsYXIgbGF5b3V0IHRyZWUuXG4gKi9cbmZ1bmN0aW9uIEV4dGVybmFsV3JhcHBlcih7IGNvbXBvbmVudCwgY29tcG9uZW50UGF0aCwgdGVtcCA9IGZhbHNlIH0pIHtcbiAgICBjb25zdCBkaXNwYXRjaCA9IHVzZURpc3BhdGNoKCk7XG4gICAgY29uc3QgW2luc2VydGVkLCBzZXRJbnNlcnRlZF0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgLy8gR2l2ZSBlbXB0eSBwcm9wcyBmb3IgdGhlIGluc2VydGVkIGNvbXBvbmVudHMuXG4gICAgICAgIC8vIFRoZSBwcm9wcyB3aWxsIGNvbWUgZnJvbSB0aGUgcGFyZW50IHNvIHRoZXkgY2FuIGJlIHVwZGF0ZWQuXG4gICAgICAgIGRpc3BhdGNoKGFkZENvbXBvbmVudFRvTGF5b3V0KHtcbiAgICAgICAgICAgIGNvbXBvbmVudCxcbiAgICAgICAgICAgIGNvbXBvbmVudFBhdGhcbiAgICAgICAgfSkpO1xuICAgICAgICBzZXRJbnNlcnRlZCh0cnVlKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0ZW1wKSB7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2gocmVtb3ZlQ29tcG9uZW50KHsgY29tcG9uZW50UGF0aCB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfSwgW10pO1xuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBkaXNwYXRjaCgoX2Rpc3BhdGNoLCBnZXRTdGF0ZSkgPT4ge1xuICAgICAgICAgICAgLy8gVGhlIGhvc3Qgc3VidHJlZSBtYXkgaGF2ZSBiZWVuIHJlcGxhY2VkIChlZy4gYSBjYWxsYmFja1xuICAgICAgICAgICAgLy8gcmV0dXJuZWQgbmV3IGNoaWxkcmVuKSB3aGlsZSB0aGlzIHdyYXBwZXIgcmVjb25jaWxlZCBpbiBwbGFjZVxuICAgICAgICAgICAgLy8gcmF0aGVyIHRoYW4gcmVtb3VudGluZy4gSW4gdGhhdCBjYXNlIHRoZSBjb21wb25lbnQgaXMgZ29uZSBmcm9tXG4gICAgICAgICAgICAvLyB0aGUgbGF5b3V0IGF0IGBjb21wb25lbnRQYXRoYCwgc28gcmUtaW5zZXJ0IGl0IGluc3RlYWQgb2ZcbiAgICAgICAgICAgIC8vIHVwZGF0aW5nIGEgcGF0aCB0aGF0IG5vIGxvbmdlciBleGlzdHMuXG4gICAgICAgICAgICBjb25zdCBleGlzdHMgPSBwYXRoKGNvbXBvbmVudFBhdGgsIGdldFN0YXRlKCkubGF5b3V0KTtcbiAgICAgICAgICAgIGJhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXhpc3RzKSB7XG4gICAgICAgICAgICAgICAgICAgIF9kaXNwYXRjaCh1cGRhdGVQcm9wcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtcGF0aDogY29tcG9uZW50UGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzOiBjb21wb25lbnQucHJvcHNcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgX2Rpc3BhdGNoKGFkZENvbXBvbmVudFRvTGF5b3V0KHsgY29tcG9uZW50LCBjb21wb25lbnRQYXRoIH0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5wcm9wcy5pZCkge1xuICAgICAgICAgICAgICAgICAgICBfZGlzcGF0Y2gobm90aWZ5T2JzZXJ2ZXJzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBjb21wb25lbnQucHJvcHMuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wczogY29tcG9uZW50LnByb3BzXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSwgW2NvbXBvbmVudC5wcm9wc10pO1xuICAgIGlmICghaW5zZXJ0ZWQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8vIFJlbmRlciBhIHdyYXBwZXIgd2l0aCB0aGUgYWN0dWFsIHByb3BzLlxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KERhc2hXcmFwcGVyLCB7IGNvbXBvbmVudFBhdGg6IGNvbXBvbmVudFBhdGggfSk7XG59XG5leHBvcnQgZGVmYXVsdCBFeHRlcm5hbFdyYXBwZXI7XG4iLCJpbXBvcnQgeyBnZXRDb21wb25lbnRMYXlvdXQsIHN0cmluZ2lmeVBhdGgsIGNoZWNrRGFzaENoaWxkcmVuVXBkYXRlIH0gZnJvbSAnLi93cmFwcGluZyc7XG5pbXBvcnQgeyBwYXRoT3IgfSBmcm9tICdyYW1kYSc7XG5jb25zdCBwcmV2aW91c0hhc2hlcyA9IHt9O1xuY29uc3QgaXNGaXJzdExldmVsUHJvcHNDaGlsZCA9ICh1cGRhdGVkUGF0aCwgc3RyUGF0aCkgPT4ge1xuICAgIGNvbnN0IHVwZGF0ZWRTZWdtZW50cyA9IHVwZGF0ZWRQYXRoLnNwbGl0KCcsJyk7XG4gICAgY29uc3QgZnVsbFNlZ21lbnRzID0gc3RyUGF0aC5zcGxpdCgnLCcpO1xuICAgIC8vIENoZWNrIHRoYXQgc3RyUGF0aCBhY3R1YWxseSBzdGFydHMgd2l0aCB1cGRhdGVkUGF0aFxuICAgIGNvbnN0IHN0YXJ0c1dpdGhQYXRoID0gZnVsbFNlZ21lbnRzLmV2ZXJ5KChzZWcsIGkpID0+IHVwZGF0ZWRTZWdtZW50c1tpXSA9PT0gc2VnKTtcbiAgICBpZiAoIXN0YXJ0c1dpdGhQYXRoKVxuICAgICAgICByZXR1cm4gW2ZhbHNlLCBbXV07XG4gICAgLy8gR2V0IHRoZSByZW1haW5pbmcgcGF0aCBhZnRlciB0aGUgcHJlZml4XG4gICAgY29uc3QgcmVtYWluaW5nU2VnbWVudHMgPSB1cGRhdGVkU2VnbWVudHMuc2xpY2UoZnVsbFNlZ21lbnRzLmxlbmd0aCk7XG4gICAgY29uc3QgcHJvcHNDb3VudCA9IHJlbWFpbmluZ1NlZ21lbnRzLmZpbHRlcihzID0+IHMgPT09ICdwcm9wcycpLmxlbmd0aDtcbiAgICByZXR1cm4gW3Byb3BzQ291bnQgPCAyLCByZW1haW5pbmdTZWdtZW50c107XG59O1xuZnVuY3Rpb24gZGV0ZXJtaW5lQ2hhbmdlZFByb3BzKHN0YXRlLCBzdHJQYXRoKSB7XG4gICAgbGV0IGNvbWJpbmVkSGFzaCA9IDA7XG4gICAgbGV0IHJlbmRlclR5cGU7IC8vIERlZmF1bHQgcmVuZGVyIHR5cGUsIGFkanVzdCBhcyBuZWVkZWRcbiAgICBjb25zdCBjaGFuZ2VkUHJvcHMgPSB7fTtcbiAgICBPYmplY3QuZW50cmllcyhzdGF0ZS5sYXlvdXRIYXNoZXMpLmZvckVhY2goKFt1cGRhdGVkUGF0aCwgcGF0aEhhc2hdKSA9PiB7XG4gICAgICAgIGNvbnN0IFtkZXNjZW5kYW50LCByZW1haW5pbmdTZWdtZW50c10gPSBpc0ZpcnN0TGV2ZWxQcm9wc0NoaWxkKHVwZGF0ZWRQYXRoLCBzdHJQYXRoKTtcbiAgICAgICAgaWYgKGRlc2NlbmRhbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzSGFzaCA9IHBhdGhPcih7fSwgW3VwZGF0ZWRQYXRoXSwgcHJldmlvdXNIYXNoZXMpO1xuICAgICAgICAgICAgY29tYmluZWRIYXNoICs9IHBhdGhPcigwLCBbJ2hhc2gnXSwgcGF0aEhhc2gpO1xuICAgICAgICAgICAgaWYgKHByZXZpb3VzSGFzaCAhPT0gcGF0aEhhc2gpIHtcbiAgICAgICAgICAgICAgICBpZiAodXBkYXRlZFBhdGggIT09IHN0clBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihjaGFuZ2VkUHJvcHMsIHsgW3JlbWFpbmluZ1NlZ21lbnRzWzFdXTogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyVHlwZSA9ICdjb21wb25lbnRzJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oY2hhbmdlZFByb3BzLCBwYXRoT3Ioe30sIFsnY2hhbmdlZFByb3BzJ10sIHBhdGhIYXNoKSk7XG4gICAgICAgICAgICAgICAgICAgIHJlbmRlclR5cGUgPSBwYXRoT3Ioe30sIFsncmVuZGVyVHlwZSddLCBwYXRoSGFzaCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHByZXZpb3VzSGFzaGVzW3VwZGF0ZWRQYXRoXSA9IHBhdGhIYXNoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaGFzaDogY29tYmluZWRIYXNoLFxuICAgICAgICBjaGFuZ2VkUHJvcHMsXG4gICAgICAgIHJlbmRlclR5cGVcbiAgICB9O1xufVxuZXhwb3J0IGNvbnN0IHNlbGVjdERhc2hQcm9wcyA9IChjb21wb25lbnRQYXRoKSA9PiAoc3RhdGUpID0+IHtcbiAgICBjb25zdCBjID0gZ2V0Q29tcG9uZW50TGF5b3V0KGNvbXBvbmVudFBhdGgsIHN0YXRlKTtcbiAgICAvLyBMYXlvdXQgaGFzaGVzIHJlY29yZHMgdGhlIG51bWJlciBvZiB0aW1lcyBhIHBhdGggaGFzIGJlZW4gdXBkYXRlZC5cbiAgICAvLyBzdW0gd2l0aCB0aGUgcGFyZW50cyBoYXNoIChtYXRjaCB3aXRob3V0IHRoZSBsYXN0ICddJykgdG8gZ2V0IHRoZSByZWFsIGhhc2hcbiAgICAvLyBUaGVuIGl0IGNhbiBiZSBlYXNpbHkgY29tcGFyZWQgd2l0aG91dCBoYXZpbmcgdG8gY29tcGFyZSB0aGUgcHJvcHMuXG4gICAgY29uc3Qgc3RyUGF0aCA9IHN0cmluZ2lmeVBhdGgoY29tcG9uZW50UGF0aCk7XG4gICAgbGV0IGhhc2g7XG4gICAgaWYgKGNoZWNrRGFzaENoaWxkcmVuVXBkYXRlKGMpKSB7XG4gICAgICAgIGhhc2ggPSBkZXRlcm1pbmVDaGFuZ2VkUHJvcHMoc3RhdGUsIHN0clBhdGgpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaGFzaCA9IHN0YXRlLmxheW91dEhhc2hlc1tzdHJQYXRoXTtcbiAgICB9XG4gICAgbGV0IGggPSAwO1xuICAgIGxldCBjaGFuZ2VkUHJvcHMgPSB7fTtcbiAgICBsZXQgcmVuZGVyVHlwZSA9ICcnO1xuICAgIGlmIChoYXNoKSB7XG4gICAgICAgIGggPSBoYXNoWydoYXNoJ107XG4gICAgICAgIGNoYW5nZWRQcm9wcyA9IGhhc2hbJ2NoYW5nZWRQcm9wcyddO1xuICAgICAgICByZW5kZXJUeXBlID0gaGFzaFsncmVuZGVyVHlwZSddO1xuICAgIH1cbiAgICByZXR1cm4gW2MsIGM/LnByb3BzLCBoLCBjaGFuZ2VkUHJvcHMsIHJlbmRlclR5cGVdO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3REYXNoUHJvcHNFcXVhbGl0eUZuKFtfLCBfXywgaGFzaF0sIFtfX18sIF9fX18sIHByZXZpb3VzSGFzaF0pIHtcbiAgICAvLyBPbmx5IG5lZWQgdG8gY29tcGFyZSB0aGUgaGFzaCBhcyBhbnkgY2hhbmdlIGlzIHN1bW1lZCB1cFxuICAgIHJldHVybiBoYXNoID09PSBwcmV2aW91c0hhc2g7XG59XG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0Q29uZmlnKHN0YXRlKSB7XG4gICAgcmV0dXJuIHN0YXRlLmNvbmZpZztcbn1cbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBtZXJnZVJpZ2h0LCBwYXRoLCB0eXBlLCBoYXMsIGpvaW4sIHBhdGhPciB9IGZyb20gJ3JhbWRhJztcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbGVtZW50KGVsZW1lbnQsIHByb3BzLCBleHRyYVByb3BzLCBjaGlsZHJlbikge1xuICAgIGNvbnN0IGFsbFByb3BzID0gbWVyZ2VSaWdodChwcm9wcywgZXh0cmFQcm9wcyk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KGVsZW1lbnQsIGFsbFByb3BzLCAuLi5jaGlsZHJlbik7XG4gICAgfVxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KGVsZW1lbnQsIGFsbFByb3BzLCBjaGlsZHJlbik7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNEcnlDb21wb25lbnQob2JqKSB7XG4gICAgcmV0dXJuICh0eXBlKG9iaikgPT09ICdPYmplY3QnICYmXG4gICAgICAgIGhhcygndHlwZScsIG9iaikgJiZcbiAgICAgICAgaGFzKCduYW1lc3BhY2UnLCBvYmopICYmXG4gICAgICAgIGhhcygncHJvcHMnLCBvYmopKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUNvbXBvbmVudChjb21wb25lbnREZWZpbml0aW9uKSB7XG4gICAgaWYgKHR5cGUoY29tcG9uZW50RGVmaW5pdGlvbikgPT09ICdBcnJheScpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgY2hpbGRyZW4gcHJvcGVydHkgb2YgYSBjb21wb25lbnQgaXMgYSBsaXN0IG9mIGxpc3RzLCBpbnN0ZWFkICcgK1xuICAgICAgICAgICAgJ29mIGp1c3QgYSBsaXN0LiBUaGlzIGNhbiBzb21ldGltZXMgYmUgZHVlIHRvIGEgdHJhaWxpbmcgY29tbWEuICcgK1xuICAgICAgICAgICAgJ0NoZWNrIHRoZSBjb21wb25lbnQgdGhhdCBoYXMgdGhlIGZvbGxvd2luZyBjb250ZW50cyAnICtcbiAgICAgICAgICAgICdhbmQgcmVtb3ZlIG9uZSBvZiB0aGUgbGV2ZWxzIG9mIG5lc3Rpbmc6IFxcbicgK1xuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoY29tcG9uZW50RGVmaW5pdGlvbiwgbnVsbCwgMikpO1xuICAgIH1cbiAgICBpZiAodHlwZShjb21wb25lbnREZWZpbml0aW9uKSA9PT0gJ09iamVjdCcgJiZcbiAgICAgICAgIShoYXMoJ25hbWVzcGFjZScsIGNvbXBvbmVudERlZmluaXRpb24pICYmXG4gICAgICAgICAgICBoYXMoJ3R5cGUnLCBjb21wb25lbnREZWZpbml0aW9uKSAmJlxuICAgICAgICAgICAgaGFzKCdwcm9wcycsIGNvbXBvbmVudERlZmluaXRpb24pKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FuIG9iamVjdCB3YXMgcHJvdmlkZWQgYXMgYGNoaWxkcmVuYCBpbnN0ZWFkIG9mIGEgY29tcG9uZW50LCAnICtcbiAgICAgICAgICAgICdzdHJpbmcsIG9yIG51bWJlciAob3IgbGlzdCBvZiB0aG9zZSkuICcgK1xuICAgICAgICAgICAgJ0NoZWNrIHRoZSBjaGlsZHJlbiBwcm9wZXJ0eSB0aGF0IGxvb2tzIHNvbWV0aGluZyBsaWtlOlxcbicgK1xuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoY29tcG9uZW50RGVmaW5pdGlvbiwgbnVsbCwgMikpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdpZnlQYXRoKGxheW91dFBhdGgpIHtcbiAgICByZXR1cm4gam9pbignLCcsIGxheW91dFBhdGgpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbXBvbmVudExheW91dChjb21wb25lbnRQYXRoLCBzdGF0ZSkge1xuICAgIHJldHVybiBwYXRoKGNvbXBvbmVudFBhdGgsIHN0YXRlLmxheW91dCk7XG59XG5leHBvcnQgZnVuY3Rpb24gY2hlY2tSZW5kZXJUeXBlUHJvcChjb21wb25lbnREZWZpbml0aW9uKSB7XG4gICAgcmV0dXJuICgnZGFzaFJlbmRlclR5cGUnIGluXG4gICAgICAgIHBhdGhPcih7fSwgW2NvbXBvbmVudERlZmluaXRpb24/Lm5hbWVzcGFjZSwgY29tcG9uZW50RGVmaW5pdGlvbj8udHlwZV0sIHdpbmRvdykpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrRGFzaENoaWxkcmVuVXBkYXRlKGNvbXBvbmVudERlZmluaXRpb24pIHtcbiAgICByZXR1cm4gKCdkYXNoQ2hpbGRyZW5VcGRhdGUnIGluXG4gICAgICAgIHBhdGhPcih7fSwgW2NvbXBvbmVudERlZmluaXRpb24/Lm5hbWVzcGFjZSwgY29tcG9uZW50RGVmaW5pdGlvbj8udHlwZV0sIHdpbmRvdykpO1xufVxuIiwiaW1wb3J0IHtiYXRjaCwgY29ubmVjdH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IHtpbmNsdWRlcywgaXNFbXB0eX0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IFJlYWN0LCB7dXNlRWZmZWN0LCB1c2VSZWYsIHVzZVN0YXRlfSBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgR2xvYmFsRXJyb3JDb250YWluZXIgZnJvbSAnLi9jb21wb25lbnRzL2Vycm9yL0dsb2JhbEVycm9yQ29udGFpbmVyLnJlYWN0JztcbmltcG9ydCB7XG4gICAgZGlzcGF0Y2hFcnJvcixcbiAgICBoeWRyYXRlSW5pdGlhbE91dHB1dHMsXG4gICAgb25FcnJvcixcbiAgICBzZXRHcmFwaHMsXG4gICAgc2V0UGF0aHMsXG4gICAgc2V0TGF5b3V0XG59IGZyb20gJy4vYWN0aW9ucyc7XG5pbXBvcnQge2NvbXB1dGVQYXRoc30gZnJvbSAnLi9hY3Rpb25zL3BhdGhzJztcbmltcG9ydCB7Y29tcHV0ZUdyYXBoc30gZnJvbSAnLi9hY3Rpb25zL2RlcGVuZGVuY2llcyc7XG5pbXBvcnQgYXBpVGh1bmsgZnJvbSAnLi9hY3Rpb25zL2FwaSc7XG5pbXBvcnQge0V2ZW50RW1pdHRlcn0gZnJvbSAnLi9hY3Rpb25zL3V0aWxzJztcbmltcG9ydCB7YXBwbHlQZXJzaXN0ZW5jZX0gZnJvbSAnLi9wZXJzaXN0ZW5jZSc7XG5pbXBvcnQge2dldEFwcFN0YXRlfSBmcm9tICcuL3JlZHVjZXJzL2NvbnN0YW50cyc7XG5pbXBvcnQge1NUQVRVU30gZnJvbSAnLi9jb25zdGFudHMvY29uc3RhbnRzJztcbmltcG9ydCB3YWl0IGZyb20gJy4vdXRpbHMvd2FpdCc7XG5pbXBvcnQgaXNTaW1wbGVDb21wb25lbnQgZnJvbSAnLi9pc1NpbXBsZUNvbXBvbmVudCc7XG5pbXBvcnQgRGFzaFdyYXBwZXIgZnJvbSAnLi93cmFwcGVyL0Rhc2hXcmFwcGVyJztcblxuLyoqXG4gKiBGaXJlIG9mZiBBUEkgY2FsbHMgZm9yIGluaXRpYWxpemF0aW9uXG4gKiBAcGFyYW0geyp9IHByb3BzIHByb3BzXG4gKiBAcmV0dXJucyB7Kn0gY29tcG9uZW50XG4gKi9cbmNvbnN0IFVuY29ubmVjdGVkQ29udGFpbmVyID0gcHJvcHMgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgICAgYXBwTGlmZWN5Y2xlLFxuICAgICAgICBjb25maWcsXG4gICAgICAgIGRlcGVuZGVuY2llc1JlcXVlc3QsXG4gICAgICAgIGVycm9yLFxuICAgICAgICBsYXlvdXRSZXF1ZXN0LFxuICAgICAgICBsYXlvdXRcbiAgICB9ID0gcHJvcHM7XG5cbiAgICBjb25zdCBbZXJyb3JMb2FkaW5nLCBzZXRFcnJvckxvYWRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xuXG4gICAgY29uc3QgZXZlbnRzID0gdXNlUmVmKG51bGwpO1xuICAgIGlmICghZXZlbnRzLmN1cnJlbnQpIHtcbiAgICAgICAgZXZlbnRzLmN1cnJlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgfVxuICAgIGNvbnN0IHJlbmRlcmVkVHJlZSA9IHVzZVJlZihmYWxzZSk7XG5cbiAgICB1c2VFZmZlY3Qoc3RvcmVFZmZlY3QuYmluZChudWxsLCBwcm9wcywgZXZlbnRzLCBzZXRFcnJvckxvYWRpbmcpKTtcblxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmIChyZW5kZXJlZFRyZWUuY3VycmVudCkge1xuICAgICAgICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICByZW5kZXJlZFRyZWUuY3VycmVudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGF3YWl0IHdhaXQoMCk7XG4gICAgICAgICAgICAgICAgZXZlbnRzLmN1cnJlbnQuZW1pdCgncmVuZGVyZWQnKTtcbiAgICAgICAgICAgIH0pKCk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmIChjb25maWcuc2VydmVfbG9jYWxseSkge1xuICAgICAgICAgICAgd2luZG93Ll9kYXNoUGxvdGx5SlNVUkwgPSBgJHtjb25maWcucmVxdWVzdHNfcGF0aG5hbWVfcHJlZml4fV9kYXNoLWNvbXBvbmVudC1zdWl0ZXMvcGxvdGx5L3BhY2thZ2VfZGF0YS9wbG90bHkubWluLmpzYDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdpbmRvdy5fZGFzaFBsb3RseUpTVVJMID0gY29uZmlnLnBsb3RseWpzX3VybDtcbiAgICAgICAgfVxuICAgIH0sIFtdKTtcblxuICAgIGxldCBjb250ZW50O1xuICAgIGlmIChcbiAgICAgICAgbGF5b3V0UmVxdWVzdC5zdGF0dXMgJiZcbiAgICAgICAgIWluY2x1ZGVzKGxheW91dFJlcXVlc3Quc3RhdHVzLCBbU1RBVFVTLk9LLCAnbG9hZGluZyddKVxuICAgICkge1xuICAgICAgICBpZiAoY29uZmlnLnVpKSB7XG4gICAgICAgICAgICBjb250ZW50ID0gKFxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3tfX2h0bWw6IGxheW91dFJlcXVlc3QuY29udGVudH19XG4gICAgICAgICAgICAgICAgPjwvZGl2PlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRlbnQgPSA8ZGl2IGNsYXNzTmFtZT0nX2Rhc2gtZXJyb3InPkVycm9yIGxvYWRpbmcgbGF5b3V0PC9kaXY+O1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgICAgZXJyb3JMb2FkaW5nIHx8XG4gICAgICAgIChkZXBlbmRlbmNpZXNSZXF1ZXN0LnN0YXR1cyAmJlxuICAgICAgICAgICAgIWluY2x1ZGVzKGRlcGVuZGVuY2llc1JlcXVlc3Quc3RhdHVzLCBbU1RBVFVTLk9LLCAnbG9hZGluZyddKSlcbiAgICApIHtcbiAgICAgICAgaWYgKGNvbmZpZy51aSkge1xuICAgICAgICAgICAgY29udGVudCA9IChcbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7XG4gICAgICAgICAgICAgICAgICAgICAgICBfX2h0bWw6IGRlcGVuZGVuY2llc1JlcXVlc3QuY29udGVudFxuICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgID48L2Rpdj5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb250ZW50ID0gKFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdfZGFzaC1lcnJvcic+RXJyb3IgbG9hZGluZyBkZXBlbmRlbmNpZXM8L2Rpdj5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGFwcExpZmVjeWNsZSA9PT0gZ2V0QXBwU3RhdGUoJ0hZRFJBVEVEJykpIHtcbiAgICAgICAgcmVuZGVyZWRUcmVlLmN1cnJlbnQgPSB0cnVlO1xuXG4gICAgICAgIGNvbnRlbnQgPSAoXG4gICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgIHtBcnJheS5pc0FycmF5KGxheW91dC5jb21wb25lbnRzKSA/IChcbiAgICAgICAgICAgICAgICAgICAgbGF5b3V0LmNvbXBvbmVudHMubWFwKChjLCBpKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgaXNTaW1wbGVDb21wb25lbnQoYykgPyAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY1xuICAgICAgICAgICAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RGFzaFdyYXBwZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Rhc2hwcml2YXRlX2Vycm9yPXtlcnJvcn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50UGF0aD17Wydjb21wb25lbnRzJywgaV19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleT17aX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICAgICAgPERhc2hXcmFwcGVyXG4gICAgICAgICAgICAgICAgICAgICAgICBfZGFzaHByaXZhdGVfZXJyb3I9e2Vycm9yfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50UGF0aD17Wydjb21wb25lbnRzJ119XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDwvPlxuICAgICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRlbnQgPSA8ZGl2IGNsYXNzTmFtZT0nX2Rhc2gtbG9hZGluZyc+TG9hZGluZy4uLjwvZGl2PjtcbiAgICB9XG5cbiAgICByZXR1cm4gY29uZmlnICYmIGNvbmZpZy51aSA9PT0gdHJ1ZSA/IChcbiAgICAgICAgPEdsb2JhbEVycm9yQ29udGFpbmVyPntjb250ZW50fTwvR2xvYmFsRXJyb3JDb250YWluZXI+XG4gICAgKSA6IChcbiAgICAgICAgY29udGVudFxuICAgICk7XG59O1xuXG5mdW5jdGlvbiBzdG9yZUVmZmVjdChwcm9wcywgZXZlbnRzLCBzZXRFcnJvckxvYWRpbmcpIHtcbiAgICBjb25zdCB7XG4gICAgICAgIGFwcExpZmVjeWNsZSxcbiAgICAgICAgZGVwZW5kZW5jaWVzUmVxdWVzdCxcbiAgICAgICAgZGlzcGF0Y2gsXG4gICAgICAgIGVycm9yLFxuICAgICAgICBncmFwaHMsXG4gICAgICAgIGhvb2tzLFxuICAgICAgICBsYXlvdXQsXG4gICAgICAgIGxheW91dFJlcXVlc3QsXG4gICAgICAgIGNvbmZpZ1xuICAgIH0gPSBwcm9wcztcblxuICAgIGJhdGNoKCgpID0+IHtcbiAgICAgICAgaWYgKGlzRW1wdHkobGF5b3V0UmVxdWVzdCkpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaG9va3MubGF5b3V0X3ByZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIGhvb2tzLmxheW91dF9wcmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRpc3BhdGNoKGFwaVRodW5rKCdfZGFzaC1sYXlvdXQnLCAnR0VUJywgJ2xheW91dFJlcXVlc3QnKSk7XG4gICAgICAgIH0gZWxzZSBpZiAobGF5b3V0UmVxdWVzdC5zdGF0dXMgPT09IFNUQVRVUy5PSykge1xuICAgICAgICAgICAgaWYgKGlzRW1wdHkobGF5b3V0LmNvbXBvbmVudHMpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBob29rcy5sYXlvdXRfcG9zdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBob29rcy5sYXlvdXRfcG9zdChsYXlvdXRSZXF1ZXN0LmNvbnRlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBmaW5hbExheW91dCA9IGFwcGx5UGVyc2lzdGVuY2UoXG4gICAgICAgICAgICAgICAgICAgIGxheW91dFJlcXVlc3QuY29udGVudCxcbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoKFxuICAgICAgICAgICAgICAgICAgICBzZXRQYXRocyhcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVQYXRocyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbExheW91dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ2NvbXBvbmVudHMnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cy5jdXJyZW50XG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoKHNldExheW91dChmaW5hbExheW91dCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzRW1wdHkoZGVwZW5kZW5jaWVzUmVxdWVzdCkpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoKFxuICAgICAgICAgICAgICAgIGFwaVRodW5rKCdfZGFzaC1kZXBlbmRlbmNpZXMnLCAnR0VUJywgJ2RlcGVuZGVuY2llc1JlcXVlc3QnKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIGRlcGVuZGVuY2llc1JlcXVlc3Quc3RhdHVzID09PSBTVEFUVVMuT0sgJiZcbiAgICAgICAgICAgIChpc0VtcHR5KGdyYXBocykgfHwgZ3JhcGhzLnJlc2V0KVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGRpc3BhdGNoKFxuICAgICAgICAgICAgICAgIHNldEdyYXBocyhcbiAgICAgICAgICAgICAgICAgICAgY29tcHV0ZUdyYXBocyhcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY2llc1JlcXVlc3QuY29udGVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoRXJyb3IoZGlzcGF0Y2gpLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgLy8gZGVwZW5kZW5jaWVzUmVxdWVzdCBhbmQgaXRzIGNvbXB1dGVkIHN0b3Jlc1xuICAgICAgICAgICAgZGVwZW5kZW5jaWVzUmVxdWVzdC5zdGF0dXMgPT09IFNUQVRVUy5PSyAmJlxuICAgICAgICAgICAgIWlzRW1wdHkoZ3JhcGhzKSAmJlxuICAgICAgICAgICAgLy8gTGF5b3V0UmVxdWVzdCBhbmQgaXRzIGNvbXB1dGVkIHN0b3Jlc1xuICAgICAgICAgICAgbGF5b3V0UmVxdWVzdC5zdGF0dXMgPT09IFNUQVRVUy5PSyAmJlxuICAgICAgICAgICAgIWlzRW1wdHkobGF5b3V0LmNvbXBvbmVudHMpICYmXG4gICAgICAgICAgICAvLyBIYXNuJ3QgYWxyZWFkeSBoeWRyYXRlZFxuICAgICAgICAgICAgYXBwTGlmZWN5Y2xlID09PSBnZXRBcHBTdGF0ZSgnU1RBUlRFRCcpXG4gICAgICAgICkge1xuICAgICAgICAgICAgbGV0IGhhc0Vycm9yID0gZmFsc2U7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoKGh5ZHJhdGVJbml0aWFsT3V0cHV0cyhkaXNwYXRjaEVycm9yKGRpc3BhdGNoKSkpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgLy8gRGlzcGxheSB0aGlzIGVycm9yIGluIGRldnRvb2xzLCB1bmxlc3Mgd2UgaGF2ZSBlcnJvcnNcbiAgICAgICAgICAgICAgICAvLyBhbHJlYWR5LCBpbiB3aGljaCBjYXNlIHdlIGFzc3VtZSB0aGlzIG5ldyBvbmUgaXMgbW9vdFxuICAgICAgICAgICAgICAgIGlmICghZXJyb3IuZnJvbnRFbmQubGVuZ3RoICYmICFlcnJvci5iYWNrRW5kLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChvbkVycm9yKHt0eXBlOiAnYmFja0VuZCcsIGVycm9yOiBlcnJ9KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgc2V0RXJyb3JMb2FkaW5nKGhhc0Vycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG5VbmNvbm5lY3RlZENvbnRhaW5lci5wcm9wVHlwZXMgPSB7XG4gICAgYXBwTGlmZWN5Y2xlOiBQcm9wVHlwZXMub25lT2YoW1xuICAgICAgICBnZXRBcHBTdGF0ZSgnU1RBUlRFRCcpLFxuICAgICAgICBnZXRBcHBTdGF0ZSgnSFlEUkFURUQnKSxcbiAgICAgICAgZ2V0QXBwU3RhdGUoJ0RFU1RST1lFRCcpXG4gICAgXSksXG4gICAgZGlzcGF0Y2g6IFByb3BUeXBlcy5mdW5jLFxuICAgIGRlcGVuZGVuY2llc1JlcXVlc3Q6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgZ3JhcGhzOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIGhvb2tzOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIGxheW91dFJlcXVlc3Q6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgbGF5b3V0OiBQcm9wVHlwZXMuYW55LFxuICAgIGhpc3Rvcnk6IFByb3BUeXBlcy5hbnksXG4gICAgZXJyb3I6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgY29uZmlnOiBQcm9wVHlwZXMub2JqZWN0XG59O1xuXG5jb25zdCBDb250YWluZXIgPSBjb25uZWN0KFxuICAgIC8vIG1hcCBzdGF0ZSB0byBwcm9wc1xuICAgIHN0YXRlID0+ICh7XG4gICAgICAgIGFwcExpZmVjeWNsZTogc3RhdGUuYXBwTGlmZWN5Y2xlLFxuICAgICAgICBkZXBlbmRlbmNpZXNSZXF1ZXN0OiBzdGF0ZS5kZXBlbmRlbmNpZXNSZXF1ZXN0LFxuICAgICAgICBob29rczogc3RhdGUuaG9va3MsXG4gICAgICAgIGxheW91dFJlcXVlc3Q6IHN0YXRlLmxheW91dFJlcXVlc3QsXG4gICAgICAgIGxheW91dDogc3RhdGUubGF5b3V0LFxuICAgICAgICBncmFwaHM6IHN0YXRlLmdyYXBocyxcbiAgICAgICAgaGlzdG9yeTogc3RhdGUuaGlzdG9yeSxcbiAgICAgICAgZXJyb3I6IHN0YXRlLmVycm9yLFxuICAgICAgICBjb25maWc6IHN0YXRlLmNvbmZpZ1xuICAgIH0pLFxuICAgIGRpc3BhdGNoID0+ICh7ZGlzcGF0Y2h9KVxuKShVbmNvbm5lY3RlZENvbnRhaW5lcik7XG5cbmV4cG9ydCBkZWZhdWx0IENvbnRhaW5lcjtcbiIsImltcG9ydCB7Y29ubmVjdH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgQVBJQ29udHJvbGxlciBmcm9tICcuL0FQSUNvbnRyb2xsZXIucmVhY3QnO1xuaW1wb3J0IExvYWRpbmcgZnJvbSAnLi9jb21wb25lbnRzL2NvcmUvTG9hZGluZy5yZWFjdCc7XG5pbXBvcnQgVG9vbGJhciBmcm9tICcuL2NvbXBvbmVudHMvY29yZS9Ub29sYmFyLnJlYWN0JztcbmltcG9ydCBSZWxvYWRlciBmcm9tICcuL2NvbXBvbmVudHMvY29yZS9SZWxvYWRlci5yZWFjdCc7XG5pbXBvcnQgZ2V0Q29uZmlnRnJvbURPTSBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQge3NldEhvb2tzLCBzZXRDb25maWd9IGZyb20gJy4vYWN0aW9ucy9pbmRleCc7XG5pbXBvcnQge3R5cGUsIG1lbW9pemVXaXRoLCBpZGVudGl0eX0gZnJvbSAncmFtZGEnO1xuXG5jbGFzcyBVbmNvbm5lY3RlZEFwcENvbnRhaW5lciBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBwcm9wcy5ob29rcy5sYXlvdXRfcHJlICE9PSBudWxsIHx8XG4gICAgICAgICAgICBwcm9wcy5ob29rcy5sYXlvdXRfcG9zdCAhPT0gbnVsbCB8fFxuICAgICAgICAgICAgcHJvcHMuaG9va3MucmVxdWVzdF9wcmUgIT09IG51bGwgfHxcbiAgICAgICAgICAgIHByb3BzLmhvb2tzLnJlcXVlc3RfcG9zdCAhPT0gbnVsbCB8fFxuICAgICAgICAgICAgcHJvcHMuaG9va3MuY2FsbGJhY2tfcmVzb2x2ZWQgIT09IG51bGwgfHxcbiAgICAgICAgICAgIHByb3BzLmhvb2tzLnJlcXVlc3RfcmVmcmVzaF9qd3QgIT09IG51bGxcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBsZXQgaG9va3MgPSBwcm9wcy5ob29rcztcblxuICAgICAgICAgICAgaWYgKGhvb2tzLnJlcXVlc3RfcmVmcmVzaF9qd3QpIHtcbiAgICAgICAgICAgICAgICBob29rcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uaG9va3MsXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RfcmVmcmVzaF9qd3Q6IG1lbW9pemVXaXRoKFxuICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpdHksXG4gICAgICAgICAgICAgICAgICAgICAgICBob29rcy5yZXF1ZXN0X3JlZnJlc2hfand0XG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwcm9wcy5kaXNwYXRjaChzZXRIb29rcyhob29rcykpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCgpIHtcbiAgICAgICAgY29uc3Qge2Rpc3BhdGNofSA9IHRoaXMucHJvcHM7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGdldENvbmZpZ0Zyb21ET00oKTtcblxuICAgICAgICAvLyBwcmVzZXQgY29tbW9uIHJlcXVlc3QgcGFyYW1zIGluIHRoZSBjb25maWdcbiAgICAgICAgY29uZmlnLmZldGNoID0ge1xuICAgICAgICAgICAgY3JlZGVudGlhbHM6ICdzYW1lLW9yaWdpbicsXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgQWNjZXB0OiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGRpc3BhdGNoKHNldENvbmZpZyhjb25maWcpKTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGNvbnN0IHtjb25maWd9ID0gdGhpcy5wcm9wcztcbiAgICAgICAgaWYgKHR5cGUoY29uZmlnKSA9PT0gJ051bGwnKSB7XG4gICAgICAgICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9J19kYXNoLWxvYWRpbmcnPkxvYWRpbmcuLi48L2Rpdj47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qge3Nob3dfdW5kb19yZWRvfSA9IGNvbmZpZztcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxSZWFjdC5GcmFnbWVudD5cbiAgICAgICAgICAgICAgICB7c2hvd191bmRvX3JlZG8gPyA8VG9vbGJhciAvPiA6IG51bGx9XG4gICAgICAgICAgICAgICAgPEFQSUNvbnRyb2xsZXIgLz5cbiAgICAgICAgICAgICAgICA8TG9hZGluZyAvPlxuICAgICAgICAgICAgICAgIDxSZWxvYWRlciAvPlxuICAgICAgICAgICAgPC9SZWFjdC5GcmFnbWVudD5cbiAgICAgICAgKTtcbiAgICB9XG59XG5cblVuY29ubmVjdGVkQXBwQ29udGFpbmVyLnByb3BUeXBlcyA9IHtcbiAgICBob29rczogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBkaXNwYXRjaDogUHJvcFR5cGVzLmZ1bmMsXG4gICAgY29uZmlnOiBQcm9wVHlwZXMub2JqZWN0XG59O1xuXG5jb25zdCBBcHBDb250YWluZXIgPSBjb25uZWN0KFxuICAgIHN0YXRlID0+ICh7XG4gICAgICAgIGhpc3Rvcnk6IHN0YXRlLmhpc3RvcnksXG4gICAgICAgIGNvbmZpZzogc3RhdGUuY29uZmlnXG4gICAgfSksXG4gICAgZGlzcGF0Y2ggPT4gKHtkaXNwYXRjaH0pXG4pKFVuY29ubmVjdGVkQXBwQ29udGFpbmVyKTtcblxuZXhwb3J0IGRlZmF1bHQgQXBwQ29udGFpbmVyO1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nO1xuXG5pbXBvcnQgQXBwUHJvdmlkZXIgZnJvbSAnLi9BcHBQcm92aWRlci5yZWFjdCc7XG5cbmltcG9ydCAnLi9kYXNoQXBpJztcblxuY2xhc3MgRGFzaFJlbmRlcmVyIHtcbiAgICBjb25zdHJ1Y3Rvcihob29rcykge1xuICAgICAgICAvLyByZW5kZXIgRGFzaCBSZW5kZXJlciB1cG9uIGluaXRpYWxpc2luZyFcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlYWN0LWVudHJ5LXBvaW50Jyk7XG5cbiAgICAgICAgaWYgKFJlYWN0RE9NLmNyZWF0ZVJvb3QpIHtcbiAgICAgICAgICAgIGNvbnN0IHJvb3QgPSBSZWFjdERPTS5jcmVhdGVSb290KGNvbnRhaW5lcik7XG4gICAgICAgICAgICByb290LnJlbmRlcig8QXBwUHJvdmlkZXIgaG9va3M9e2hvb2tzfSAvPik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBSZWFjdERPTS5yZW5kZXIoPEFwcFByb3ZpZGVyIGhvb2tzPXtob29rc30gLz4sIGNvbnRhaW5lcik7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCB7RGFzaFJlbmRlcmVyfTtcbiIsImltcG9ydCB7bWVyZ2VEZWVwUmlnaHQsIG9uY2V9IGZyb20gJ3JhbWRhJztcbmltcG9ydCB7Z2V0Q1NSRkhlYWRlciwgaGFuZGxlQXN5bmNFcnJvciwgYWRkSHR0cEhlYWRlcnN9IGZyb20gJy4uL2FjdGlvbnMnO1xuaW1wb3J0IHt1cmxCYXNlfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7TUFYX0FVVEhfUkVUUklFU30gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHtKV1RfRVhQSVJFRF9NRVNTQUdFLCBTVEFUVVN9IGZyb20gJy4uL2NvbnN0YW50cy9jb25zdGFudHMnO1xuXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZSAqL1xuY29uc3QgbG9nV2FybmluZ09uY2UgPSBvbmNlKGNvbnNvbGUud2Fybik7XG5cbmZ1bmN0aW9uIEdFVChwYXRoLCBmZXRjaENvbmZpZywgX2JvZHksIGNvbmZpZykge1xuICAgIHJldHVybiBmZXRjaChcbiAgICAgICAgcGF0aCxcbiAgICAgICAgbWVyZ2VEZWVwUmlnaHQoZmV0Y2hDb25maWcsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgICBoZWFkZXJzOiBnZXRDU1JGSGVhZGVyKGNvbmZpZylcbiAgICAgICAgfSlcbiAgICApO1xufVxuXG5mdW5jdGlvbiBQT1NUKHBhdGgsIGZldGNoQ29uZmlnLCBib2R5ID0ge30sIGNvbmZpZykge1xuICAgIHJldHVybiBmZXRjaChcbiAgICAgICAgcGF0aCxcbiAgICAgICAgbWVyZ2VEZWVwUmlnaHQoZmV0Y2hDb25maWcsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgaGVhZGVyczogZ2V0Q1NSRkhlYWRlcihjb25maWcpLFxuICAgICAgICAgICAgYm9keTogYm9keSA/IEpTT04uc3RyaW5naWZ5KGJvZHkpIDogbnVsbFxuICAgICAgICB9KVxuICAgICk7XG59XG5cbmNvbnN0IHJlcXVlc3QgPSB7R0VULCBQT1NUfTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYXBpVGh1bmsoZW5kcG9pbnQsIG1ldGhvZCwgc3RvcmUsIGlkLCBib2R5KSB7XG4gICAgcmV0dXJuIGFzeW5jIChkaXNwYXRjaCwgZ2V0U3RhdGUpID0+IHtcbiAgICAgICAgbGV0IHtjb25maWcsIGhvb2tzfSA9IGdldFN0YXRlKCk7XG4gICAgICAgIGxldCBuZXdIZWFkZXJzID0gbnVsbDtcblxuICAgICAgICBjb25zdCB1cmwgPSBgJHt1cmxCYXNlKGNvbmZpZyl9JHtlbmRwb2ludH1gO1xuXG4gICAgICAgIGZ1bmN0aW9uIHNldENvbm5lY3Rpb25TdGF0dXMoY29ubmVjdGVkKSB7XG4gICAgICAgICAgICBpZiAoZ2V0U3RhdGUoKS5lcnJvci5iYWNrRW5kQ29ubmVjdGVkICE9PSBjb25uZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdTRVRfQ09OTkVDVElPTl9TVEFUVVMnLFxuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiBjb25uZWN0ZWRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgICAgIHR5cGU6IHN0b3JlLFxuICAgICAgICAgICAgcGF5bG9hZDoge2lkLCBzdGF0dXM6ICdsb2FkaW5nJ31cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCByZXM7XG4gICAgICAgICAgICBmb3IgKGxldCByZXRyeSA9IDA7IHJldHJ5IDw9IE1BWF9BVVRIX1JFVFJJRVM7IHJldHJ5KyspIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXMgPSBhd2FpdCByZXF1ZXN0W21ldGhvZF0oXG4gICAgICAgICAgICAgICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuZmV0Y2gsXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5LFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBmZXRjaCByZWplY3Rpb24gLSB0aGlzIG1lYW5zIHRoZSByZXF1ZXN0IGRpZG4ndCByZXR1cm4sXG4gICAgICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IGdldCBoZXJlIGZyb20gNDAwLzUwMCBlcnJvcnMsIG9ubHkgbmV0d29ya1xuICAgICAgICAgICAgICAgICAgICAvLyBlcnJvcnMgb3IgdW5yZXNwb25zaXZlIHNlcnZlcnMuXG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdmZXRjaCBlcnJvcicsIHJlcyk7XG4gICAgICAgICAgICAgICAgICAgIHNldENvbm5lY3Rpb25TdGF0dXMoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICByZXMuc3RhdHVzID09PSBTVEFUVVMuVU5BVVRIT1JJWkVEIHx8XG4gICAgICAgICAgICAgICAgICAgIHJlcy5zdGF0dXMgPT09IFNUQVRVUy5CQURfUkVRVUVTVFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaG9va3MucmVxdWVzdF9yZWZyZXNoX2p3dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IGF3YWl0IHJlcy50ZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYm9keS5pbmNsdWRlcyhKV1RfRVhQSVJFRF9NRVNTQUdFKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0p3dCA9IGF3YWl0IGhvb2tzLnJlcXVlc3RfcmVmcmVzaF9qd3QoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5mZXRjaC5oZWFkZXJzLkF1dGhvcml6YXRpb24uc3Vic3RyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0JlYXJlciAnLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Snd0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0hlYWRlcnMgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7bmV3Snd0fWBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcgPSBtZXJnZURlZXBSaWdodChjb25maWcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZldGNoOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogbmV3SGVhZGVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gcmVzLmhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnKTtcblxuICAgICAgICAgICAgaWYgKG5ld0hlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaChhZGRIdHRwSGVhZGVycyhuZXdIZWFkZXJzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXRDb25uZWN0aW9uU3RhdHVzKHRydWUpO1xuICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlICYmIGNvbnRlbnRUeXBlLmluZGV4T2YoJ2FwcGxpY2F0aW9uL2pzb24nKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzLmpzb24oKS50aGVuKGpzb24gPT4ge1xuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBzdG9yZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHJlcy5zdGF0dXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudDoganNvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGpzb247XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVzLnRleHQoKTtcbiAgICAgICAgICAgIGxvZ1dhcm5pbmdPbmNlKFxuICAgICAgICAgICAgICAgICdSZXNwb25zZSBpcyBtaXNzaW5nIGhlYWRlcjogY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBkaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogc3RvcmUsXG4gICAgICAgICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiByZXMuc3RhdHVzLFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9ICdFcnJvciBmcm9tIEFQSSBjYWxsOiAnICsgZW5kcG9pbnQ7XG4gICAgICAgICAgICBoYW5kbGVBc3luY0Vycm9yKGVyciwgbWVzc2FnZSwgZGlzcGF0Y2gpO1xuICAgICAgICB9XG4gICAgfTtcbn1cbiIsImNvbnN0IGFjdGlvbkxpc3QgPSB7XG4gICAgT05fUFJPUF9DSEFOR0U6IDEsXG4gICAgU0VUX1JFUVVFU1RfUVVFVUU6IDEsXG4gICAgU0VUX0dSQVBIUzogMSxcbiAgICBTRVRfUEFUSFM6IDEsXG4gICAgU0VUX0xBWU9VVDogMSxcbiAgICBTRVRfQVBQX0xJRkVDWUNMRTogMSxcbiAgICBTRVRfQ09ORklHOiAxLFxuICAgIEFERF9IVFRQX0hFQURFUlM6IDEsXG4gICAgT05fRVJST1I6IDEsXG4gICAgU0VUX0hPT0tTOiAxLFxuICAgIElOU0VSVF9DT01QT05FTlQ6IDEsXG4gICAgUkVNT1ZFX0NPTVBPTkVOVDogMSxcbiAgICBSRVNFVF9DT01QT05FTlRfU1RBVEU6IDFcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRBY3Rpb24gPSBhY3Rpb24gPT4ge1xuICAgIGlmIChhY3Rpb25MaXN0W2FjdGlvbl0pIHtcbiAgICAgICAgcmV0dXJuIGFjdGlvbjtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke2FjdGlvbn0gaXMgbm90IGRlZmluZWQuYCk7XG59O1xuXG5leHBvcnQgY29uc3QgTUFYX0FVVEhfUkVUUklFUyA9IDE7XG4iLCJpbXBvcnQge0RlcEdyYXBofSBmcm9tICdkZXBlbmRlbmN5LWdyYXBoJztcbmltcG9ydCBpc051bWVyaWMgZnJvbSAnZmFzdC1pc251bWVyaWMnO1xuaW1wb3J0IHtcbiAgICBhbGwsXG4gICAgYW55LFxuICAgIGFwLFxuICAgIGFzc29jLFxuICAgIGNvbmNhdCxcbiAgICBkaWZmZXJlbmNlLFxuICAgIGVxdWFscyxcbiAgICBldm9sdmUsXG4gICAgZmluZEluZGV4LFxuICAgIGZsYXR0ZW4sXG4gICAgZm9yRWFjaE9iakluZGV4ZWQsXG4gICAgaW5jbHVkZXMsXG4gICAgaW50ZXJzZWN0aW9uLFxuICAgIGlzRW1wdHksXG4gICAga2V5cyxcbiAgICBtYXAsXG4gICAgbWVyZ2VSaWdodCxcbiAgICBwYXRoLFxuICAgIHBsdWNrLFxuICAgIHByb3BzLFxuICAgIHN0YXJ0c1dpdGgsXG4gICAgdmFsdWVzLFxuICAgIHppcCxcbiAgICB6aXBPYmpcbn0gZnJvbSAncmFtZGEnO1xuXG5pbXBvcnQge1xuICAgIGNvbWJpbmVJZEFuZFByb3AsXG4gICAgZ2V0Q2FsbGJhY2tzQnlJbnB1dCxcbiAgICBnZXRQcmlvcml0eSxcbiAgICBJTkRJUkVDVCxcbiAgICBtZXJnZU1heCxcbiAgICBtYWtlUmVzb2x2ZWRDYWxsYmFjayxcbiAgICByZXNvbHZlRGVwcyxcbiAgICByZXNvbHZlUGFydGlhbERlcHNcbn0gZnJvbSAnLi9kZXBlbmRlbmNpZXNfdHMnO1xuaW1wb3J0IHtjb21wdXRlUGF0aHMsIGdldFBhdGh9IGZyb20gJy4vcGF0aHMnO1xuaW1wb3J0IHtpc0NhcnJpZWRPdmVyQnlQYXRjaCwgd2FzV3JpdHRlbkJ5UGF0Y2h9IGZyb20gJy4vcGF0Y2hBbmFseXNpcyc7XG5cbmltcG9ydCB7Y3Jhd2xMYXlvdXR9IGZyb20gJy4vdXRpbHMnO1xuXG5pbXBvcnQgUmVnaXN0cnkgZnJvbSAnLi4vcmVnaXN0cnknO1xuXG4vKlxuICogSWYgdGhpcyB1cGRhdGUgaXMgZm9yIG11bHRpcGxlIG91dHB1dHMsIHRoZW4gaXQgaGFzXG4gKiBzdGFydGluZyAmIHRyYWlsaW5nIGAuLmAgYW5kIGVhY2ggcHJvcElkIHBhaXIgaXMgc2VwYXJhdGVkXG4gKiBieSBgLi4uYCwgZS5nLlxuICogXCIuLm91dHB1dC0xLnZhbHVlLi4ub3V0cHV0LTIudmFsdWUuLi5vdXRwdXQtMy52YWx1ZS4uLm91dHB1dC00LnZhbHVlLi5cIlxuICovXG5leHBvcnQgY29uc3QgaXNNdWx0aU91dHB1dFByb3AgPSBpZEFuZFByb3AgPT4gaWRBbmRQcm9wLnN0YXJ0c1dpdGgoJy4uJyk7XG5cbmNvbnN0IEFMTCA9IHt3aWxkOiAnQUxMJywgbXVsdGk6IDF9O1xuY29uc3QgTUFUQ0ggPSB7d2lsZDogJ01BVENIJ307XG5jb25zdCBBTExTTUFMTEVSID0ge3dpbGQ6ICdBTExTTUFMTEVSJywgbXVsdGk6IDEsIGV4cGFuZDogMX07XG5jb25zdCB3aWxkY2FyZHMgPSB7QUxMLCBNQVRDSCwgQUxMU01BTExFUn07XG5jb25zdCBhbGxvd2VkV2lsZGNhcmRzID0ge1xuICAgIE91dHB1dDoge0FMTCwgTUFUQ0h9LFxuICAgIElucHV0OiB3aWxkY2FyZHMsXG4gICAgU3RhdGU6IHdpbGRjYXJkc1xufTtcbmNvbnN0IHdpbGRjYXJkVmFsVHlwZXMgPSBbJ3N0cmluZycsICdudW1iZXInLCAnYm9vbGVhbiddO1xuXG5jb25zdCBpZEludmFsaWRDaGFycyA9IFsnLicsICd7J107XG5cbi8qXG4gKiBJZiB0aGlzIElEIGlzIGEgd2lsZGNhcmQsIGl0IGlzIGEgc3RyaW5naWZpZWQgSlNPTiBvYmplY3RcbiAqIHRoZSBcIntcIiBjaGFyYWN0ZXIgaXMgZGlzYWxsb3dlZCBmcm9tIHJlZ3VsYXIgc3RyaW5nIElEc1xuICovXG5jb25zdCBpc1dpbGRjYXJkSWQgPSBpZFN0ciA9PiBpZFN0ci5zdGFydHNXaXRoKCd7Jyk7XG5cbi8qXG4gKiBUdXJuIHN0cmluZ2lmaWVkIHdpbGRjYXJkIElEcyBpbnRvIG9iamVjdHMuXG4gKiBXaWxkY2FyZHMgYXJlIGVuY29kZWQgYXMgc2luZ2xlLWl0ZW0gYXJyYXlzIGNvbnRhaW5pbmcgdGhlIHdpbGRjYXJkIG5hbWVcbiAqIGFzIGEgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBwYXJzZVdpbGRjYXJkSWQoaWRTdHIpIHtcbiAgICByZXR1cm4gbWFwKFxuICAgICAgICB2YWwgPT4gKEFycmF5LmlzQXJyYXkodmFsKSAmJiB3aWxkY2FyZHNbdmFsWzBdXSkgfHwgdmFsLFxuICAgICAgICBKU09OLnBhcnNlKGlkU3RyKVxuICAgICk7XG59XG5cbi8qXG4gKiBJZiB0aGlzIHVwZGF0ZSBpcyBmb3IgbXVsdGlwbGUgb3V0cHV0cywgdGhlbiBpdCBoYXNcbiAqIHN0YXJ0aW5nICYgdHJhaWxpbmcgYC4uYCBhbmQgZWFjaCBwcm9wSWQgcGFpciBpcyBzZXBhcmF0ZWRcbiAqIGJ5IGAuLi5gLCBlLmcuXG4gKiBcIi4ub3V0cHV0LTEudmFsdWUuLi5vdXRwdXQtMi52YWx1ZS4uLm91dHB1dC0zLnZhbHVlLi4ub3V0cHV0LTQudmFsdWUuLlwiXG4gKi9cbmZ1bmN0aW9uIHBhcnNlTXVsdGlwbGVPdXRwdXRzKG91dHB1dElkQW5kUHJvcCkge1xuICAgIHJldHVybiBvdXRwdXRJZEFuZFByb3Auc3Vic3RyKDIsIG91dHB1dElkQW5kUHJvcC5sZW5ndGggLSA0KS5zcGxpdCgnLi4uJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdElkQW5kUHJvcChpZEFuZFByb3ApIHtcbiAgICAvLyBzaW5jZSB3aWxkY2FyZCBpZHMgY2FuIGhhdmUgLiBpbiB0aGVtIGJ1dCBwcm9wcyBjYW4ndCxcbiAgICAvLyBsb29rIGZvciB0aGUgbGFzdCAuIGluIHRoZSBzdHJpbmcgYW5kIHNwbGl0IHRoZXJlXG4gICAgY29uc3QgZG90UG9zID0gaWRBbmRQcm9wLmxhc3RJbmRleE9mKCcuJyk7XG4gICAgY29uc3QgaWRTdHIgPSBpZEFuZFByb3Auc3Vic3RyKDAsIGRvdFBvcyk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IHBhcnNlSWZXaWxkY2FyZChpZFN0ciksXG4gICAgICAgIHByb3BlcnR5OiBpZEFuZFByb3Auc3Vic3RyKGRvdFBvcyArIDEpXG4gICAgfTtcbn1cblxuLypcbiAqIENoZWNrIGlmIHRoaXMgSUQgaXMgYSBzdHJpbmdpZmllZCBvYmplY3QsIGFuZCBpZiBzbyBwYXJzZSBpdCB0byB0aGF0IG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VJZldpbGRjYXJkKGlkU3RyKSB7XG4gICAgcmV0dXJuIGlzV2lsZGNhcmRJZChpZFN0cikgPyBwYXJzZVdpbGRjYXJkSWQoaWRTdHIpIDogaWRTdHI7XG59XG5cbi8qXG4gKiBKU09OLnN0cmluZ2lmeSAtIGZvciB0aGUgb2JqZWN0IGZvcm0gLSBidXQgZW5zdXJpbmcga2V5cyBhcmUgc29ydGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdpZnlJZChpZCkge1xuICAgIGlmICh0eXBlb2YgaWQgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBpZDtcbiAgICB9XG4gICAgY29uc3Qgc3RyaW5naWZ5VmFsID0gdiA9PiAodiAmJiB2LndpbGQpIHx8IEpTT04uc3RyaW5naWZ5KHYpO1xuICAgIGNvbnN0IHBhcnRzID0gT2JqZWN0LmtleXMoaWQpXG4gICAgICAgIC5zb3J0KClcbiAgICAgICAgLm1hcChrID0+IEpTT04uc3RyaW5naWZ5KGspICsgJzonICsgc3RyaW5naWZ5VmFsKGlkW2tdKSk7XG4gICAgcmV0dXJuICd7JyArIHBhcnRzLmpvaW4oJywnKSArICd9Jztcbn1cblxuLypcbiAqIGlkIGRpY3QgdmFsdWVzIGNhbiBiZSBudW1iZXJzLCBzdHJpbmdzLCBhbmQgYm9vbGVhbnMuXG4gKiBXZSBuZWVkIGEgZGVmaW5pdGUgb3JkZXJpbmcgdGhhdCB3aWxsIHdvcmsgYWNyb3NzIHR5cGVzLFxuICogZXZlbiBpZiBzYW5lIHVzZXJzIHdvdWxkIG5vdCBtaXggdHlwZXMuXG4gKiAtIG51bWVyaWMgc3RyaW5ncyBhcmUgdHJlYXRlZCBhcyBudW1iZXJzXG4gKiAtIGJvb2xlYW5zIGNvbWUgYWZ0ZXIgbnVtYmVycywgYmVmb3JlIHN0cmluZ3MuIGZhbHNlLCB0aGVuIHRydWUuXG4gKiAtIG5vbi1udW1lcmljIHN0cmluZ3MgY29tZSBsYXN0XG4gKi9cbmZ1bmN0aW9uIGlkVmFsU29ydChhLCBiKSB7XG4gICAgY29uc3QgYklzTnVtZXJpYyA9IGlzTnVtZXJpYyhiKTtcbiAgICBpZiAoaXNOdW1lcmljKGEpKSB7XG4gICAgICAgIGlmIChiSXNOdW1lcmljKSB7XG4gICAgICAgICAgICBjb25zdCBhTiA9IE51bWJlcihhKTtcbiAgICAgICAgICAgIGNvbnN0IGJOID0gTnVtYmVyKGIpO1xuICAgICAgICAgICAgcmV0dXJuIGFOID4gYk4gPyAxIDogYU4gPCBiTiA/IC0xIDogMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuICAgIGlmIChiSXNOdW1lcmljKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICBjb25zdCBhSXNCb29sID0gdHlwZW9mIGEgPT09ICdib29sZWFuJztcbiAgICBpZiAoYUlzQm9vbCAhPT0gKHR5cGVvZiBiID09PSAnYm9vbGVhbicpKSB7XG4gICAgICAgIHJldHVybiBhSXNCb29sID8gLTEgOiAxO1xuICAgIH1cbiAgICByZXR1cm4gYSA+IGIgPyAxIDogYSA8IGIgPyAtMSA6IDA7XG59XG5cbi8qXG4gKiBQcm92aWRlIGEgdmFsdWUga25vd24gdG8gYmUgYmVmb3JlIG9yIGFmdGVyIHYsIGFjY29yZGluZyB0byBpZFZhbFNvcnRcbiAqL1xuY29uc3QgdmFsQmVmb3JlID0gdiA9PiAoaXNOdW1lcmljKHYpID8gdiAtIDEgOiAwKTtcbmNvbnN0IHZhbEFmdGVyID0gdiA9PiAodHlwZW9mIHYgPT09ICdzdHJpbmcnID8gdiArICd6JyA6ICd6Jyk7XG5cbmZ1bmN0aW9uIGFkZE1hcChkZXBNYXAsIGlkLCBwcm9wLCBkZXBlbmRlbmN5KSB7XG4gICAgY29uc3QgaWRNYXAgPSAoZGVwTWFwW2lkXSA9IGRlcE1hcFtpZF0gfHwge30pO1xuICAgIGNvbnN0IGNhbGxiYWNrcyA9IChpZE1hcFtwcm9wXSA9IGlkTWFwW3Byb3BdIHx8IFtdKTtcbiAgICBjYWxsYmFja3MucHVzaChkZXBlbmRlbmN5KTtcbn1cblxuLy8gUGF0dGVybnMgYXJlIHN0b3JlZCBpbiBhIG5lc3RlZCBNYXAgc3RydWN0dXJlIHRvIGF2b2lkIHRoZSBvdmVyaGVhZCBvZlxuLy8gc3RyaW5naWZ5aW5nIGlkcyBmb3IgZXZlcnkgY2FsbGJhY2suXG5mdW5jdGlvbiBhZGRQYXR0ZXJuKHBhdHRlcm5zLCBpZFNwZWMsIHByb3AsIGRlcGVuZGVuY3kpIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaWRTcGVjKS5zb3J0KCk7XG4gICAgY29uc3Qga2V5U3RyID0ga2V5cy5qb2luKCcsJyk7XG4gICAgY29uc3QgdmFsdWVzID0gcHJvcHMoa2V5cywgaWRTcGVjKTtcbiAgICBjb25zdCB2YWx1ZXNLZXkgPSB2YWx1ZXNcbiAgICAgICAgLm1hcCh2ID0+XG4gICAgICAgICAgICB0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdiAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gdi53aWxkXG4gICAgICAgICAgICAgICAgICAgID8gdi53aWxkXG4gICAgICAgICAgICAgICAgICAgIDogSlNPTi5zdHJpbmdpZnkodilcbiAgICAgICAgICAgICAgICA6IFN0cmluZyh2KVxuICAgICAgICApXG4gICAgICAgIC5qb2luKCd8Jyk7XG5cbiAgICBpZiAoIXBhdHRlcm5zLmhhcyhrZXlTdHIpKSB7XG4gICAgICAgIHBhdHRlcm5zLnNldChrZXlTdHIsIG5ldyBNYXAoKSk7XG4gICAgfVxuICAgIGNvbnN0IHByb3BNYXAgPSBwYXR0ZXJucy5nZXQoa2V5U3RyKTtcbiAgICBpZiAoIXByb3BNYXAuaGFzKHByb3ApKSB7XG4gICAgICAgIHByb3BNYXAuc2V0KHByb3AsIG5ldyBNYXAoKSk7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlTWFwID0gcHJvcE1hcC5nZXQocHJvcCk7XG5cbiAgICBsZXQgdmFsTWF0Y2ggPSB2YWx1ZU1hcC5nZXQodmFsdWVzS2V5KTtcbiAgICBpZiAoIXZhbE1hdGNoKSB7XG4gICAgICAgIHZhbE1hdGNoID0ge2tleXMsIHZhbHVlcywgY2FsbGJhY2tzOiBbXSwgcGFydGlhbDogZmFsc2V9O1xuICAgICAgICB2YWx1ZU1hcC5zZXQodmFsdWVzS2V5LCB2YWxNYXRjaCk7XG4gICAgfVxuICAgIHZhbE1hdGNoLmNhbGxiYWNrcy5wdXNoKGRlcGVuZGVuY3kpO1xufVxuXG4vLyBBZGQgYSBwYXJ0aWFsIHBhdHRlcm4gLSBzdG9yZWQgd2l0aCBwYXJ0aWFsIGZsYWcgc28gbG9va3VwIGtub3dzIHRvIGRvXG4vLyBzdWJzZXQga2V5IG1hdGNoaW5nLlxuZnVuY3Rpb24gYWRkUGFydGlhbFBhdHRlcm4ocGF0dGVybnMsIGlkU3BlYywgcHJvcCwgZGVwZW5kZW5jeSkge1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhpZFNwZWMpLnNvcnQoKTtcbiAgICBjb25zdCBrZXlTdHIgPSBrZXlzLmpvaW4oJywnKTtcbiAgICBjb25zdCB2YWx1ZXMgPSBwcm9wcyhrZXlzLCBpZFNwZWMpO1xuICAgIGNvbnN0IHZhbHVlc0tleSA9IHZhbHVlc1xuICAgICAgICAubWFwKHYgPT5cbiAgICAgICAgICAgIHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiB2ICE9PSBudWxsXG4gICAgICAgICAgICAgICAgPyB2LndpbGRcbiAgICAgICAgICAgICAgICAgICAgPyB2LndpbGRcbiAgICAgICAgICAgICAgICAgICAgOiBKU09OLnN0cmluZ2lmeSh2KVxuICAgICAgICAgICAgICAgIDogU3RyaW5nKHYpXG4gICAgICAgIClcbiAgICAgICAgLmpvaW4oJ3wnKTtcblxuICAgIGlmICghcGF0dGVybnMuaGFzKGtleVN0cikpIHtcbiAgICAgICAgcGF0dGVybnMuc2V0KGtleVN0ciwgbmV3IE1hcCgpKTtcbiAgICB9XG4gICAgY29uc3QgcHJvcE1hcCA9IHBhdHRlcm5zLmdldChrZXlTdHIpO1xuICAgIGlmICghcHJvcE1hcC5oYXMocHJvcCkpIHtcbiAgICAgICAgcHJvcE1hcC5zZXQocHJvcCwgbmV3IE1hcCgpKTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWVNYXAgPSBwcm9wTWFwLmdldChwcm9wKTtcblxuICAgIGxldCB2YWxNYXRjaCA9IHZhbHVlTWFwLmdldCh2YWx1ZXNLZXkpO1xuICAgIGlmICghdmFsTWF0Y2gpIHtcbiAgICAgICAgdmFsTWF0Y2ggPSB7a2V5cywgdmFsdWVzLCBjYWxsYmFja3M6IFtdLCBwYXJ0aWFsOiB0cnVlfTtcbiAgICAgICAgdmFsdWVNYXAuc2V0KHZhbHVlc0tleSwgdmFsTWF0Y2gpO1xuICAgIH1cbiAgICB2YWxNYXRjaC5jYWxsYmFja3MucHVzaChkZXBlbmRlbmN5KTtcbn1cblxuLy8gQ29udmVydCB0aGUgbmVzdGVkIE1hcCBzdHJ1Y3R1cmUgb2YgcGF0dGVybnMgaW50byB0aGUgcGxhaW4gbmVzdGVkIG9iamVjdCBzdHJ1Y3R1cmVcbi8vIGV4cGVjdGVkIGJ5IHRoZSByZXN0IG9mIHRoZSBjb2RlLCB3aXRoIHN0cmluZ2lmaWVkIGlkIGtleXMuXG4vLyBUaGlzIGlzIG9ubHkgZG9uZSBvbmNlIHBlciBwYXR0ZXJuLCBhdCB0aGUgZW5kIG9mIGdyYXBoIGNvbnN0cnVjdGlvbixcbi8vIHRvIG1pbmltaXplIHRoZSBvdmVyaGVhZCBvZiBzdHJpbmdpZnlpbmcgaWRzLlxuZnVuY3Rpb24gb2ZmbG9hZFBhdHRlcm5zKHBhdHRlcm5zTWFwLCB0YXJnZXRNYXApIHtcbiAgICBmb3IgKGNvbnN0IFtrZXlTdHIsIHByb3BNYXBdIG9mIHBhdHRlcm5zTWFwLmVudHJpZXMoKSkge1xuICAgICAgICB0YXJnZXRNYXBba2V5U3RyXSA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IFtwcm9wLCB2YWx1ZU1hcF0gb2YgcHJvcE1hcC5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIHRhcmdldE1hcFtrZXlTdHJdW3Byb3BdID0gQXJyYXkuZnJvbSh2YWx1ZU1hcC52YWx1ZXMoKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldE1hcDtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVEZXBlbmRlbmNpZXMocGFyc2VkRGVwZW5kZW5jaWVzLCBkaXNwYXRjaEVycm9yKSB7XG4gICAgY29uc3Qgb3V0U3RycyA9IHt9O1xuICAgIGNvbnN0IG91dE9ianMgPSBbXTtcblxuICAgIHBhcnNlZERlcGVuZGVuY2llcy5mb3JFYWNoKGRlcCA9PiB7XG4gICAgICAgIGNvbnN0IHtpbnB1dHMsIG91dHB1dHMsIHN0YXRlfSA9IGRlcDtcbiAgICAgICAgbGV0IGhhc091dHB1dHMgPSB0cnVlO1xuICAgICAgICBpZiAob3V0cHV0cy5sZW5ndGggPT09IDEgJiYgIW91dHB1dHNbMF0uaWQgJiYgIW91dHB1dHNbMF0ucHJvcGVydHkpIHtcbiAgICAgICAgICAgIGhhc091dHB1dHMgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhlYWQgPVxuICAgICAgICAgICAgJ0luIHRoZSBjYWxsYmFjayBmb3Igb3V0cHV0KHMpOlxcbiAgJyArXG4gICAgICAgICAgICBvdXRwdXRzLm1hcChjb21iaW5lSWRBbmRQcm9wKS5qb2luKCdcXG4gICcpO1xuXG4gICAgICAgIGlmICghaW5wdXRzLmxlbmd0aCAmJiBkZXAucHJldmVudF9pbml0aWFsX2NhbGwpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoRXJyb3IoJ0EgY2FsbGJhY2sgaXMgbWlzc2luZyBJbnB1dHMnLCBbXG4gICAgICAgICAgICAgICAgaGVhZCxcbiAgICAgICAgICAgICAgICAndGhlcmUgYXJlIG5vIGBJbnB1dGAgZWxlbWVudHMuJyxcbiAgICAgICAgICAgICAgICAnV2l0aG91dCBgSW5wdXRgIGVsZW1lbnRzLCBpdCB3aWxsIG5ldmVyIGdldCBjYWxsZWQuJyxcbiAgICAgICAgICAgICAgICAnJyxcbiAgICAgICAgICAgICAgICAnU3Vic2NyaWJpbmcgdG8gYElucHV0YCBjb21wb25lbnRzIHdpbGwgY2F1c2UgdGhlJyxcbiAgICAgICAgICAgICAgICAnY2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW5ldmVyIHRoZWlyIHZhbHVlcyBjaGFuZ2UuJyxcbiAgICAgICAgICAgICAgICAnJyxcbiAgICAgICAgICAgICAgICAnSWYgeW91IHdhbnQgYSBjYWxsYmFjayB3aXRob3V0IGlucHV0cyB0aGF0IGZpcmVzIG9uIGluaXRpYWwgbG9hZCwnLFxuICAgICAgICAgICAgICAgICdzZXQgcHJldmVudF9pbml0aWFsX2NhbGw9RmFsc2UuJ1xuICAgICAgICAgICAgXSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzcGVjID0gW1xuICAgICAgICAgICAgW291dHB1dHMsICdPdXRwdXQnXSxcbiAgICAgICAgICAgIFtpbnB1dHMsICdJbnB1dCddLFxuICAgICAgICAgICAgW3N0YXRlLCAnU3RhdGUnXVxuICAgICAgICBdO1xuICAgICAgICBzcGVjLmZvckVhY2goKFthcmdzLCBjbHNdKSA9PiB7XG4gICAgICAgICAgICBpZiAoY2xzID09PSAnT3V0cHV0JyAmJiAhaGFzT3V0cHV0cykge1xuICAgICAgICAgICAgICAgIC8vIGp1c3QgYSBxdWlyayBvZiBob3cgd2UgcGFzcyAmIHBhcnNlIG91dHB1dHMgLSBpZiB5b3UgZG9uJ3RcbiAgICAgICAgICAgICAgICAvLyBwcm92aWRlIG9uZSwgaXQgbG9va3MgbGlrZSBhIHNpbmdsZSBibGFuayBvdXRwdXQuIFRoaXMgaXNcbiAgICAgICAgICAgICAgICAvLyBhY3R1YWxseSB1c2VmdWwgZm9yIGdyYWNlZnVsIGZhaWx1cmUsIHNvIHdlIHdvcmsgYXJvdW5kIGl0LlxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGFyZ3MpKSB7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2hFcnJvcihgQ2FsbGJhY2sgJHtjbHN9KHMpIG11c3QgYmUgYW4gQXJyYXlgLCBbXG4gICAgICAgICAgICAgICAgICAgIGhlYWQsXG4gICAgICAgICAgICAgICAgICAgIGBGb3IgJHtjbHN9KHMpIHdlIGZvdW5kOmAsXG4gICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGFyZ3MpLFxuICAgICAgICAgICAgICAgICAgICAnYnV0IHdlIGV4cGVjdGVkIGFuIEFycmF5LidcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFyZ3MuZm9yRWFjaCgoaWRQcm9wLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgdmFsaWRhdGVBcmcoaWRQcm9wLCBoZWFkLCBjbHMsIGksIGRpc3BhdGNoRXJyb3IpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChoYXNPdXRwdXRzKSB7XG4gICAgICAgICAgICBmaW5kRHVwbGljYXRlT3V0cHV0cyhcbiAgICAgICAgICAgICAgICBvdXRwdXRzLFxuICAgICAgICAgICAgICAgIGhlYWQsXG4gICAgICAgICAgICAgICAgZGlzcGF0Y2hFcnJvcixcbiAgICAgICAgICAgICAgICBvdXRTdHJzLFxuICAgICAgICAgICAgICAgIG91dE9ianNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBmaW5kTWlzbWF0Y2hlZFdpbGRjYXJkcyhcbiAgICAgICAgICAgICAgICBvdXRwdXRzLFxuICAgICAgICAgICAgICAgIGlucHV0cyxcbiAgICAgICAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICAgICAgICBoZWFkLFxuICAgICAgICAgICAgICAgIGRpc3BhdGNoRXJyb3JcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVBcmcoe2lkLCBwcm9wZXJ0eX0sIGhlYWQsIGNscywgaSwgZGlzcGF0Y2hFcnJvcikge1xuICAgIGlmICh0eXBlb2YgcHJvcGVydHkgIT09ICdzdHJpbmcnIHx8ICFwcm9wZXJ0eSkge1xuICAgICAgICBkaXNwYXRjaEVycm9yKCdDYWxsYmFjayBwcm9wZXJ0eSBlcnJvcicsIFtcbiAgICAgICAgICAgIGhlYWQsXG4gICAgICAgICAgICBgJHtjbHN9WyR7aX1dLnByb3BlcnR5ID0gJHtKU09OLnN0cmluZ2lmeShwcm9wZXJ0eSl9YCxcbiAgICAgICAgICAgICdidXQgd2UgZXhwZWN0ZWQgYHByb3BlcnR5YCB0byBiZSBhIG5vbi1lbXB0eSBzdHJpbmcuJ1xuICAgICAgICBdKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGlkID09PSAnb2JqZWN0Jykge1xuICAgICAgICBpZiAoaXNFbXB0eShpZCkpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoRXJyb3IoJ0NhbGxiYWNrIGl0ZW0gbWlzc2luZyBJRCcsIFtcbiAgICAgICAgICAgICAgICBoZWFkLFxuICAgICAgICAgICAgICAgIGAke2Nsc31bJHtpfV0uaWQgPSB7fWAsXG4gICAgICAgICAgICAgICAgJ0V2ZXJ5IGl0ZW0gbGlua2VkIHRvIGEgY2FsbGJhY2sgbmVlZHMgYW4gSUQnXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvckVhY2hPYmpJbmRleGVkKCh2LCBrKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWspIHtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaEVycm9yKCdDYWxsYmFjayB3aWxkY2FyZCBJRCBlcnJvcicsIFtcbiAgICAgICAgICAgICAgICAgICAgaGVhZCxcbiAgICAgICAgICAgICAgICAgICAgYCR7Y2xzfVske2l9XS5pZCBoYXMga2V5IFwiJHtrfVwiYCxcbiAgICAgICAgICAgICAgICAgICAgJ0tleXMgbXVzdCBiZSBub24tZW1wdHkgc3RyaW5ncy4nXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdi53aWxkKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFsbG93ZWRXaWxkY2FyZHNbY2xzXVt2LndpbGRdICE9PSB2KSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoRXJyb3IoJ0NhbGxiYWNrIHdpbGRjYXJkIElEIGVycm9yJywgW1xuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGAke2Nsc31bJHtpfV0uaWRbXCIke2t9XCJdID0gJHt2LndpbGR9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGBBbGxvd2VkIHdpbGRjYXJkcyBmb3IgJHtjbHN9cyBhcmU6YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleXMoYWxsb3dlZFdpbGRjYXJkc1tjbHNdKS5qb2luKCcsICcpXG4gICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWluY2x1ZGVzKHR5cGVvZiB2LCB3aWxkY2FyZFZhbFR5cGVzKSkge1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoRXJyb3IoJ0NhbGxiYWNrIHdpbGRjYXJkIElEIGVycm9yJywgW1xuICAgICAgICAgICAgICAgICAgICBoZWFkLFxuICAgICAgICAgICAgICAgICAgICBgJHtjbHN9WyR7aX1dLmlkW1wiJHtrfVwiXSA9ICR7SlNPTi5zdHJpbmdpZnkodil9YCxcbiAgICAgICAgICAgICAgICAgICAgJ1dpbGRjYXJkIGNhbGxiYWNrIElEIHZhbHVlcyBtdXN0IGJlIGVpdGhlciB3aWxkY2FyZHMnLFxuICAgICAgICAgICAgICAgICAgICAnb3IgY29uc3RhbnRzIG9mIG9uZSBvZiB0aGVzZSB0eXBlczonLFxuICAgICAgICAgICAgICAgICAgICB3aWxkY2FyZFZhbFR5cGVzLmpvaW4oJywgJylcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgaWQpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGlkID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAoIWlkKSB7XG4gICAgICAgICAgICBkaXNwYXRjaEVycm9yKCdDYWxsYmFjayBpdGVtIG1pc3NpbmcgSUQnLCBbXG4gICAgICAgICAgICAgICAgaGVhZCxcbiAgICAgICAgICAgICAgICBgJHtjbHN9WyR7aX1dLmlkID0gXCIke2lkfVwiYCxcbiAgICAgICAgICAgICAgICAnRXZlcnkgaXRlbSBsaW5rZWQgdG8gYSBjYWxsYmFjayBuZWVkcyBhbiBJRCdcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGludmFsaWRDaGFycyA9IGlkSW52YWxpZENoYXJzLmZpbHRlcihjID0+IGluY2x1ZGVzKGMsIGlkKSk7XG4gICAgICAgIGlmIChpbnZhbGlkQ2hhcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBkaXNwYXRjaEVycm9yKCdDYWxsYmFjayBpbnZhbGlkIElEIHN0cmluZycsIFtcbiAgICAgICAgICAgICAgICBoZWFkLFxuICAgICAgICAgICAgICAgIGAke2Nsc31bJHtpfV0uaWQgPSAnJHtpZH0nYCxcbiAgICAgICAgICAgICAgICBgY2hhcmFjdGVycyAnJHtpbnZhbGlkQ2hhcnMuam9pbihcIicsICdcIil9JyBhcmUgbm90IGFsbG93ZWQuYFxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBkaXNwYXRjaEVycm9yKCdDYWxsYmFjayBJRCB0eXBlIGVycm9yJywgW1xuICAgICAgICAgICAgaGVhZCxcbiAgICAgICAgICAgIGAke2Nsc31bJHtpfV0uaWQgPSAke0pTT04uc3RyaW5naWZ5KGlkKX1gLFxuICAgICAgICAgICAgJ0lEcyBtdXN0IGJlIHN0cmluZ3Mgb3Igd2lsZGNhcmQtY29tcGF0aWJsZSBvYmplY3RzLidcbiAgICAgICAgXSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBmaW5kRHVwbGljYXRlT3V0cHV0cyhvdXRwdXRzLCBoZWFkLCBkaXNwYXRjaEVycm9yLCBvdXRTdHJzLCBvdXRPYmpzKSB7XG4gICAgY29uc3QgbmV3T3V0cHV0U3RycyA9IHt9O1xuICAgIGNvbnN0IG5ld091dHB1dE9ianMgPSBbXTtcbiAgICBvdXRwdXRzLmZvckVhY2goKHtpZCwgcHJvcGVydHl9LCBpKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgaWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCBpZFByb3AgPSBjb21iaW5lSWRBbmRQcm9wKHtpZCwgcHJvcGVydHl9KTtcbiAgICAgICAgICAgIGlmIChuZXdPdXRwdXRTdHJzW2lkUHJvcF0pIHtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaEVycm9yKCdEdXBsaWNhdGUgY2FsbGJhY2sgT3V0cHV0cycsIFtcbiAgICAgICAgICAgICAgICAgICAgaGVhZCxcbiAgICAgICAgICAgICAgICAgICAgYE91dHB1dCAke2l9ICgke2lkUHJvcH0pIGlzIGFscmVhZHkgdXNlZCBieSB0aGlzIGNhbGxiYWNrLmBcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob3V0U3Ryc1tpZFByb3BdKSB7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2hFcnJvcignRHVwbGljYXRlIGNhbGxiYWNrIG91dHB1dHMnLCBbXG4gICAgICAgICAgICAgICAgICAgIGhlYWQsXG4gICAgICAgICAgICAgICAgICAgIGBPdXRwdXQgJHtpfSAoJHtpZFByb3B9KSBpcyBhbHJlYWR5IGluIHVzZS5gLFxuICAgICAgICAgICAgICAgICAgICAnVG8gcmVzb2x2ZSB0aGlzLCBzZXQgYGFsbG93X2R1cGxpY2F0ZT1UcnVlYCBvbicsXG4gICAgICAgICAgICAgICAgICAgICdkdXBsaWNhdGUgb3V0cHV0cywgb3IgY29tYmluZSB0aGUgb3V0cHV0cyBpbnRvJyxcbiAgICAgICAgICAgICAgICAgICAgJ29uZSBjYWxsYmFjayBmdW5jdGlvbiwgZGlzdGluZ3Vpc2hpbmcgdGhlIHRyaWdnZXInLFxuICAgICAgICAgICAgICAgICAgICAnYnkgdXNpbmcgYGRhc2guY2FsbGJhY2tfY29udGV4dGAgaWYgbmVjZXNzYXJ5LidcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbmV3T3V0cHV0U3Ryc1tpZFByb3BdID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGlkT2JqID0ge2lkLCBwcm9wZXJ0eX07XG4gICAgICAgICAgICBjb25zdCBzZWxmT3ZlcmxhcCA9IHdpbGRjYXJkT3ZlcmxhcChpZE9iaiwgbmV3T3V0cHV0T2Jqcyk7XG4gICAgICAgICAgICBjb25zdCBvdGhlck92ZXJsYXAgPSBzZWxmT3ZlcmxhcCB8fCB3aWxkY2FyZE92ZXJsYXAoaWRPYmosIG91dE9ianMpO1xuICAgICAgICAgICAgaWYgKHNlbGZPdmVybGFwIHx8IG90aGVyT3ZlcmxhcCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkUHJvcCA9IGNvbWJpbmVJZEFuZFByb3AoaWRPYmopO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkUHJvcDIgPSBjb21iaW5lSWRBbmRQcm9wKHNlbGZPdmVybGFwIHx8IG90aGVyT3ZlcmxhcCk7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2hFcnJvcignT3ZlcmxhcHBpbmcgd2lsZGNhcmQgY2FsbGJhY2sgb3V0cHV0cycsIFtcbiAgICAgICAgICAgICAgICAgICAgaGVhZCxcbiAgICAgICAgICAgICAgICAgICAgYE91dHB1dCAke2l9ICgke2lkUHJvcH0pYCxcbiAgICAgICAgICAgICAgICAgICAgYG92ZXJsYXBzIGFub3RoZXIgb3V0cHV0ICgke2lkUHJvcDJ9KWAsXG4gICAgICAgICAgICAgICAgICAgIGB1c2VkIGluICR7c2VsZk92ZXJsYXAgPyAndGhpcycgOiAnYSBkaWZmZXJlbnQnfSBjYWxsYmFjay5gXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG5ld091dHB1dE9ianMucHVzaChpZE9iaik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBrZXlzKG5ld091dHB1dFN0cnMpLmZvckVhY2goayA9PiB7XG4gICAgICAgIG91dFN0cnNba10gPSAxO1xuICAgIH0pO1xuICAgIG5ld091dHB1dE9ianMuZm9yRWFjaChpZE9iaiA9PiB7XG4gICAgICAgIG91dE9ianMucHVzaChpZE9iaik7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGNoZWNrSW5PdXRPdmVybGFwKG91dCwgaW5wdXRzKSB7XG4gICAgY29uc3Qge2lkOiBvdXRJZCwgcHJvcGVydHk6IG91dFByb3B9ID0gb3V0O1xuICAgIHJldHVybiBpbnB1dHMuc29tZShpbl8gPT4ge1xuICAgICAgICBjb25zdCB7aWQ6IGluSWQsIHByb3BlcnR5OiBpblByb3B9ID0gaW5fO1xuICAgICAgICBpZiAob3V0UHJvcCAhPT0gaW5Qcm9wIHx8IHR5cGVvZiBvdXRJZCAhPT0gdHlwZW9mIGluSWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG91dElkID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKG91dElkID09PSBpbklkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAod2lsZGNhcmRPdmVybGFwKGluXywgW291dF0pKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGZpbmRNaXNtYXRjaGVkV2lsZGNhcmRzKG91dHB1dHMsIGlucHV0cywgc3RhdGUsIGhlYWQsIGRpc3BhdGNoRXJyb3IpIHtcbiAgICBjb25zdCB7bWF0Y2hLZXlzOiBvdXQwTWF0Y2hLZXlzfSA9IGZpbmRXaWxkY2FyZEtleXMoXG4gICAgICAgIG91dHB1dHMubGVuZ3RoID8gb3V0cHV0c1swXS5pZCA6IHVuZGVmaW5lZFxuICAgICk7XG4gICAgb3V0cHV0cy5mb3JFYWNoKChvdXQsIGkpID0+IHtcbiAgICAgICAgaWYgKGkgJiYgIWVxdWFscyhmaW5kV2lsZGNhcmRLZXlzKG91dC5pZCkubWF0Y2hLZXlzLCBvdXQwTWF0Y2hLZXlzKSkge1xuICAgICAgICAgICAgZGlzcGF0Y2hFcnJvcignTWlzbWF0Y2hlZCBgTUFUQ0hgIHdpbGRjYXJkcyBhY3Jvc3MgYE91dHB1dGBzJywgW1xuICAgICAgICAgICAgICAgIGhlYWQsXG4gICAgICAgICAgICAgICAgYE91dHB1dCAke2l9ICgke2NvbWJpbmVJZEFuZFByb3Aob3V0KX0pYCxcbiAgICAgICAgICAgICAgICAnZG9lcyBub3QgaGF2ZSBNQVRDSCB3aWxkY2FyZHMgb24gdGhlIHNhbWUga2V5cyBhcycsXG4gICAgICAgICAgICAgICAgYE91dHB1dCAwICgke2NvbWJpbmVJZEFuZFByb3Aob3V0cHV0c1swXSl9KS5gLFxuICAgICAgICAgICAgICAgICdNQVRDSCB3aWxkY2FyZHMgbXVzdCBiZSBvbiB0aGUgc2FtZSBrZXlzIGZvciBhbGwgT3V0cHV0cy4nLFxuICAgICAgICAgICAgICAgICdBTEwgd2lsZGNhcmRzIG5lZWQgbm90IG1hdGNoLCBvbmx5IE1BVENILidcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgLy8gV2hlbiB0aGUgT3V0cHV0cyBkb24ndCBjYXJyeSBhbnkgTUFUQ0gga2V5cyAoZml4ZWQtaWQgb3V0cHV0cywgbm9cbiAgICAvLyBvdXRwdXRzLCBvciB3aWxkY2FyZCBvdXRwdXRzIHdpdGggb25seSBBTEwpLCB0aGUgSW5wdXRzL1N0YXRlIG1heSB1c2VcbiAgICAvLyBNQVRDSCBmcmVlbHkg4oCUIGVhY2ggZmlyaW5nIGlzIGlkZW50aWZpZWQgYnkgdGhlIHRyaWdnZXJpbmcgaW5wdXQnc1xuICAgIC8vIE1BVENIIHZhbHVlcy4gQUxMU01BTExFUiBzdGlsbCByZXF1aXJlcyBhIE1BVENIIHJlZmVyZW5jZSwgc28gdGhhdFxuICAgIC8vIGNhc2UgcmVtYWlucyBhbiBlcnJvci4gU2VlIGlzc3VlICMyNDYyLlxuICAgIGNvbnN0IG91dHB1dHNIYXZlTWF0Y2ggPSBvdXQwTWF0Y2hLZXlzLmxlbmd0aCA+IDA7XG4gICAgW1xuICAgICAgICBbaW5wdXRzLCAnSW5wdXQnXSxcbiAgICAgICAgW3N0YXRlLCAnU3RhdGUnXVxuICAgIF0uZm9yRWFjaCgoW2FyZ3MsIGNsc10pID0+IHtcbiAgICAgICAgYXJncy5mb3JFYWNoKChhcmcsIGkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHttYXRjaEtleXMsIGFsbHNtYWxsZXJLZXlzfSA9IGZpbmRXaWxkY2FyZEtleXMoYXJnLmlkKTtcbiAgICAgICAgICAgIGNvbnN0IGRpZmZLZXlzID0gb3V0cHV0c0hhdmVNYXRjaFxuICAgICAgICAgICAgICAgID8gbWF0Y2hLZXlzLmNvbmNhdChhbGxzbWFsbGVyS2V5cylcbiAgICAgICAgICAgICAgICA6IGFsbHNtYWxsZXJLZXlzO1xuICAgICAgICAgICAgY29uc3QgZGlmZiA9IGRpZmZlcmVuY2UoZGlmZktleXMsIG91dDBNYXRjaEtleXMpO1xuICAgICAgICAgICAgaWYgKGRpZmYubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZGlmZi5zb3J0KCk7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3V0RGVzYyA9IG91dHB1dHMubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgID8gYE91dHB1dCAwICgke2NvbWJpbmVJZEFuZFByb3Aob3V0cHV0c1swXSl9KWBcbiAgICAgICAgICAgICAgICAgICAgOiAndGhlIChhYnNlbnQpIE91dHB1dCc7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2hFcnJvcignYElucHV0YCAvIGBTdGF0ZWAgd2lsZGNhcmRzIG5vdCBpbiBgT3V0cHV0YHMnLCBbXG4gICAgICAgICAgICAgICAgICAgIGhlYWQsXG4gICAgICAgICAgICAgICAgICAgIGAke2Nsc30gJHtpfSAoJHtjb21iaW5lSWRBbmRQcm9wKGFyZyl9KWAsXG4gICAgICAgICAgICAgICAgICAgIGBoYXMgTUFUQ0ggb3IgQUxMU01BTExFUiBvbiBrZXkocykgJHtkaWZmLmpvaW4oJywgJyl9YCxcbiAgICAgICAgICAgICAgICAgICAgYHdoZXJlICR7b3V0RGVzY31gLFxuICAgICAgICAgICAgICAgICAgICAnZG9lcyBub3QgaGF2ZSBhIE1BVENIIHdpbGRjYXJkLiBJbnB1dHMgYW5kIFN0YXRlIGRvIG5vdCcsXG4gICAgICAgICAgICAgICAgICAgICduZWVkIGV2ZXJ5IE1BVENIIGZyb20gdGhlIE91dHB1dChzKSwgYnV0IEFMTFNNQUxMRVInLFxuICAgICAgICAgICAgICAgICAgICAncmVxdWlyZXMgYSBtYXRjaGluZyBNQVRDSCBpbiB0aGUgT3V0cHV0KHMpLCBhbmQgd2hlbicsXG4gICAgICAgICAgICAgICAgICAgICd0aGUgT3V0cHV0KHMpIGhhdmUgYW55IE1BVENILCBJbnB1dC9TdGF0ZSBNQVRDSCBrZXlzJyxcbiAgICAgICAgICAgICAgICAgICAgJ211c3QgYmUgYSBzdWJzZXQgb2YgdGhlbS4nXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuXG5jb25zdCBtYXRjaFdpbGRLZXlzID0gKFthLCBiXSkgPT4ge1xuICAgIGNvbnN0IGFXaWxkID0gYSAmJiBhLndpbGQ7XG4gICAgY29uc3QgYldpbGQgPSBiICYmIGIud2lsZDtcbiAgICBpZiAoYVdpbGQgJiYgYldpbGQpIHtcbiAgICAgICAgLy8gRXZlcnkgd2lsZGNhcmQgY29tYmluYXRpb24gb3ZlcmxhcHMgZXhjZXB0IE1BVENIPC0+QUxMU01BTExFUlxuICAgICAgICByZXR1cm4gIShcbiAgICAgICAgICAgIChhID09PSBNQVRDSCAmJiBiID09PSBBTExTTUFMTEVSKSB8fFxuICAgICAgICAgICAgKGEgPT09IEFMTFNNQUxMRVIgJiYgYiA9PT0gTUFUQ0gpXG4gICAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBhID09PSBiIHx8IGFXaWxkIHx8IGJXaWxkO1xufTtcblxuZnVuY3Rpb24gd2lsZGNhcmRPdmVybGFwKHtpZCwgcHJvcGVydHl9LCBvYmpzKSB7XG4gICAgY29uc3QgaWRLZXlzID0ga2V5cyhpZCkuc29ydCgpO1xuICAgIGNvbnN0IGlkVmFscyA9IHByb3BzKGlkS2V5cywgaWQpO1xuICAgIGZvciAoY29uc3Qgb2JqIG9mIG9ianMpIHtcbiAgICAgICAgY29uc3Qge2lkOiBpZDIsIHByb3BlcnR5OiBwcm9wZXJ0eTJ9ID0gb2JqO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBwcm9wZXJ0eTIgPT09IHByb3BlcnR5ICYmXG4gICAgICAgICAgICB0eXBlb2YgaWQyICE9PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgZXF1YWxzKGtleXMoaWQyKS5zb3J0KCksIGlkS2V5cykgJiZcbiAgICAgICAgICAgIGFsbChtYXRjaFdpbGRLZXlzLCB6aXAoaWRWYWxzLCBwcm9wcyhpZEtleXMsIGlkMikpKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBvYmo7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVDYWxsYmFja3NUb0xheW91dChzdGF0ZV8sIGRpc3BhdGNoRXJyb3IpIHtcbiAgICBjb25zdCB7Y29uZmlnLCBncmFwaHMsIGxheW91dDogbGF5b3V0XywgcGF0aHM6IHBhdGhzX30gPSBzdGF0ZV87XG4gICAgY29uc3QgdmFsaWRhdGVJZHMgPSAhY29uZmlnLnN1cHByZXNzX2NhbGxiYWNrX2V4Y2VwdGlvbnM7XG4gICAgbGV0IGxheW91dCwgcGF0aHM7XG4gICAgaWYgKHZhbGlkYXRlSWRzICYmIGNvbmZpZy52YWxpZGF0aW9uX2xheW91dCkge1xuICAgICAgICBsYXlvdXQgPSBjb25maWcudmFsaWRhdGlvbl9sYXlvdXQ7XG4gICAgICAgIHBhdGhzID0gY29tcHV0ZVBhdGhzKGxheW91dCwgW10sIG51bGwsIHBhdGhzXy5ldmVudHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxheW91dCA9IGxheW91dF87XG4gICAgICAgIHBhdGhzID0gcGF0aHNfO1xuICAgIH1cbiAgICBjb25zdCB7b3V0cHV0TWFwLCBpbnB1dE1hcCwgb3V0cHV0UGF0dGVybnMsIGlucHV0UGF0dGVybnN9ID0gZ3JhcGhzO1xuXG4gICAgZnVuY3Rpb24gdGFpbChjYWxsYmFja3MpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICdUaGlzIElEIHdhcyB1c2VkIGluIHRoZSBjYWxsYmFjayhzKSBmb3IgT3V0cHV0KHMpOlxcbiAgJyArXG4gICAgICAgICAgICBjYWxsYmFja3NcbiAgICAgICAgICAgICAgICAubWFwKCh7b3V0cHV0c30pID0+IG91dHB1dHMubWFwKGNvbWJpbmVJZEFuZFByb3ApLmpvaW4oJywgJykpXG4gICAgICAgICAgICAgICAgLmpvaW4oJ1xcbiAgJylcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtaXNzaW5nSWQoaWQsIGNscywgY2FsbGJhY2tzKSB7XG4gICAgICAgIGRpc3BhdGNoRXJyb3IoJ0lEIG5vdCBmb3VuZCBpbiBsYXlvdXQnLCBbXG4gICAgICAgICAgICBgQXR0ZW1wdGluZyB0byBjb25uZWN0IGEgY2FsbGJhY2sgJHtjbHN9IGl0ZW0gdG8gY29tcG9uZW50OmAsXG4gICAgICAgICAgICBgICBcIiR7c3RyaW5naWZ5SWQoaWQpfVwiYCxcbiAgICAgICAgICAgICdidXQgbm8gY29tcG9uZW50cyB3aXRoIHRoYXQgaWQgZXhpc3QgaW4gdGhlIGxheW91dC4nLFxuICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAnSWYgeW91IGFyZSBhc3NpZ25pbmcgY2FsbGJhY2tzIHRvIGNvbXBvbmVudHMgdGhhdCBhcmUnLFxuICAgICAgICAgICAgJ2dlbmVyYXRlZCBieSBvdGhlciBjYWxsYmFja3MgKGFuZCB0aGVyZWZvcmUgbm90IGluIHRoZScsXG4gICAgICAgICAgICAnaW5pdGlhbCBsYXlvdXQpLCB5b3UgY2FuIHN1cHByZXNzIHRoaXMgZXhjZXB0aW9uIGJ5IHNldHRpbmcnLFxuICAgICAgICAgICAgJ2BzdXBwcmVzc19jYWxsYmFja19leGNlcHRpb25zPVRydWVgLicsXG4gICAgICAgICAgICB0YWlsKGNhbGxiYWNrcylcbiAgICAgICAgXSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGVQcm9wKGlkLCBpZFBhdGgsIHJhd1Byb3AsIGNscywgY2FsbGJhY2tzKSB7XG4gICAgICAgIGNvbnN0IHByb3AgPSByYXdQcm9wLnNwbGl0KCdAJylbMF07XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHBhdGgoaWRQYXRoLCBsYXlvdXQpO1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gUmVnaXN0cnkucmVzb2x2ZShjb21wb25lbnQpO1xuXG4gICAgICAgIC8vIG5vdGU6IEZsb3cgY29tcG9uZW50cyBkbyBub3QgaGF2ZSBwcm9wVHlwZXMsIHNvIHdlIGNhbid0IHZhbGlkYXRlLlxuICAgICAgICBpZiAoZWxlbWVudCAmJiBlbGVtZW50LnByb3BUeXBlcyAmJiAhZWxlbWVudC5wcm9wVHlwZXNbcHJvcF0pIHtcbiAgICAgICAgICAgIC8vIGxvb2sgZm9yIHdpbGRjYXJkIHByb3BzIChpZSBkYXRhLSogZXRjKVxuICAgICAgICAgICAgZm9yIChjb25zdCBwcm9wTmFtZSBpbiBlbGVtZW50LnByb3BUeXBlcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3QgPSBwcm9wTmFtZS5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgcHJvcE5hbWUuY2hhckF0KGxhc3QpID09PSAnKicgJiZcbiAgICAgICAgICAgICAgICAgICAgcHJvcC5zdWJzdHIoMCwgbGFzdCkgPT09IHByb3BOYW1lLnN1YnN0cigwLCBsYXN0KVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qge3R5cGUsIG5hbWVzcGFjZX0gPSBjb21wb25lbnQ7XG4gICAgICAgICAgICBkaXNwYXRjaEVycm9yKCdJbnZhbGlkIHByb3AgZm9yIHRoaXMgY29tcG9uZW50JywgW1xuICAgICAgICAgICAgICAgIGBQcm9wZXJ0eSBcIiR7cHJvcH1cIiB3YXMgdXNlZCB3aXRoIGNvbXBvbmVudCBJRDpgLFxuICAgICAgICAgICAgICAgIGAgICR7SlNPTi5zdHJpbmdpZnkoaWQpfWAsXG4gICAgICAgICAgICAgICAgYGluIG9uZSBvZiB0aGUgJHtjbHN9IGl0ZW1zIG9mIGEgY2FsbGJhY2suYCxcbiAgICAgICAgICAgICAgICBgVGhpcyBJRCBpcyBhc3NpZ25lZCB0byBhICR7bmFtZXNwYWNlfS4ke3R5cGV9IGNvbXBvbmVudGAsXG4gICAgICAgICAgICAgICAgJ2luIHRoZSBsYXlvdXQsIHdoaWNoIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBwcm9wZXJ0eS4nLFxuICAgICAgICAgICAgICAgIHRhaWwoY2FsbGJhY2tzKVxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZUlkUGF0dGVyblByb3AoaWQsIHByb3BlcnR5LCBjbHMsIGNhbGxiYWNrcykge1xuICAgICAgICByZXNvbHZlRGVwcygpKHBhdGhzKSh7aWQsIHByb3BlcnR5fSkuZm9yRWFjaChkZXAgPT4ge1xuICAgICAgICAgICAgY29uc3Qge2lkOiBpZFJlc29sdmVkLCBwYXRoOiBpZFBhdGh9ID0gZGVwO1xuICAgICAgICAgICAgdmFsaWRhdGVQcm9wKGlkUmVzb2x2ZWQsIGlkUGF0aCwgcHJvcGVydHksIGNscywgY2FsbGJhY2tzKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgY2FsbGJhY2tJZHNDaGVja2VkRm9yU3RhdGUgPSB7fTtcblxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlU3RhdGUoY2FsbGJhY2spIHtcbiAgICAgICAgY29uc3Qge3N0YXRlLCBvdXRwdXR9ID0gY2FsbGJhY2s7XG5cbiAgICAgICAgLy8gZW5zdXJlIHdlIGRvbid0IGNoZWNrIHRoZSBzYW1lIGNhbGxiYWNrIGZvciBzdGF0ZSBtdWx0aXBsZSB0aW1lc1xuICAgICAgICBpZiAoY2FsbGJhY2tJZHNDaGVja2VkRm9yU3RhdGVbb3V0cHV0XSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNhbGxiYWNrSWRzQ2hlY2tlZEZvclN0YXRlW291dHB1dF0gPSAxO1xuXG4gICAgICAgIGNvbnN0IGNscyA9ICdTdGF0ZSc7XG5cbiAgICAgICAgc3RhdGUuZm9yRWFjaCgoe2lkLCBwcm9wZXJ0eX0pID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaWRQYXRoID0gZ2V0UGF0aChwYXRocywgaWQpO1xuICAgICAgICAgICAgICAgIGlmICghaWRQYXRoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0ZUlkcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWlzc2luZ0lkKGlkLCBjbHMsIFtjYWxsYmFja10pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVQcm9wKGlkLCBpZFBhdGgsIHByb3BlcnR5LCBjbHMsIFtjYWxsYmFja10pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIE9ubHkgdmFsaWRhdGUgcHJvcHMgZm9yIFN0YXRlIG9iamVjdCBpZHMgdGhhdCB3ZSBkb24ndCBuZWVkIHRvXG4gICAgICAgICAgICAvLyByZXNvbHZlIHRoZW0gdG8gc3BlY2lmaWMgaW5wdXRzIG9yIG91dHB1dHNcbiAgICAgICAgICAgIGVsc2UgaWYgKCFpbnRlcnNlY3Rpb24oW01BVENILCBBTExTTUFMTEVSXSwgdmFsdWVzKGlkKSkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdmFsaWRhdGVJZFBhdHRlcm5Qcm9wKGlkLCBwcm9wZXJ0eSwgY2xzLCBbY2FsbGJhY2tdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGVNYXAobWFwLCBjbHMsIGRvU3RhdGUpIHtcbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiBtYXApIHtcbiAgICAgICAgICAgIGNvbnN0IGlkUHJvcHMgPSBtYXBbaWRdO1xuICAgICAgICAgICAgY29uc3QgZmNiID0gZmxhdHRlbih2YWx1ZXMoaWRQcm9wcykpO1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9uYWwgPSBmY2IucmVkdWNlKChhY2MsIGNiKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGFjYyA9PT0gZmFsc2UgfHwgY2Iub3B0aW9uYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgZGVwcyA9IGNvbmNhdChjYi5vdXRwdXRzLCBjYi5pbnB1dHMsIGNiLnN0YXRlcykuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICBkZXAgPT4gZGVwLmlkID09PSBpZFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgIWRlcHMubGVuZ3RoIHx8XG4gICAgICAgICAgICAgICAgICAgIGFsbCgoe2FsbG93X29wdGlvbmFsfSkgPT4gYWxsb3dfb3B0aW9uYWwsIGRlcHMpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0sIHRydWUpO1xuICAgICAgICAgICAgaWYgKG9wdGlvbmFsKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpZFBhdGggPSBnZXRQYXRoKHBhdGhzLCBpZCk7XG4gICAgICAgICAgICBpZiAoIWlkUGF0aCkge1xuICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0ZUlkcykge1xuICAgICAgICAgICAgICAgICAgICBtaXNzaW5nSWQoaWQsIGNscywgZmNiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gaWRQcm9wcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYWxsYmFja3MgPSBpZFByb3BzW3Byb3BlcnR5XTtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVQcm9wKGlkLCBpZFBhdGgsIHByb3BlcnR5LCBjbHMsIGNhbGxiYWNrcyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkb1N0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJdCB3b3VsZCBiZSByZWR1bmRhbnQgdG8gY2hlY2sgc3RhdGUgb24gYm90aCBpbnB1dHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBvdXRwdXRzIC0gc28gb25seSBzZXQgZG9TdGF0ZSBmb3Igb3V0cHV0cy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcy5mb3JFYWNoKHZhbGlkYXRlU3RhdGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFsaWRhdGVNYXAob3V0cHV0TWFwLCAnT3V0cHV0JywgdHJ1ZSk7XG4gICAgdmFsaWRhdGVNYXAoaW5wdXRNYXAsICdJbnB1dCcpO1xuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGVQYXR0ZXJucyhwYXR0ZXJucywgY2xzLCBkb1N0YXRlKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5U3RyIGluIHBhdHRlcm5zKSB7XG4gICAgICAgICAgICBjb25zdCBrZXlQYXR0ZXJucyA9IHBhdHRlcm5zW2tleVN0cl07XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIGtleVBhdHRlcm5zKSB7XG4gICAgICAgICAgICAgICAga2V5UGF0dGVybnNbcHJvcGVydHldLmZvckVhY2goKHtrZXlzLCB2YWx1ZXMsIGNhbGxiYWNrc30pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaWQgPSB6aXBPYmooa2V5cywgdmFsdWVzKTtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVJZFBhdHRlcm5Qcm9wKGlkLCBwcm9wZXJ0eSwgY2xzLCBjYWxsYmFja3MpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZG9TdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLmZvckVhY2godmFsaWRhdGVTdGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhbGlkYXRlUGF0dGVybnMob3V0cHV0UGF0dGVybnMsICdPdXRwdXQnLCB0cnVlKTtcbiAgICB2YWxpZGF0ZVBhdHRlcm5zKGlucHV0UGF0dGVybnMsICdJbnB1dCcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZUdyYXBocyhkZXBlbmRlbmNpZXMsIGRpc3BhdGNoRXJyb3IsIGNvbmZpZykge1xuICAgIC8vIG11bHRpR3JhcGggaXMganVzdCBmb3IgZmluZGluZyBjaXJjdWxhciBkZXBzXG4gICAgY29uc3QgbXVsdGlHcmFwaCA9IG5ldyBEZXBHcmFwaCgpO1xuICAgIGNvbnN0IHN0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG5cbiAgICBjb25zdCB3aWxkY2FyZFBsYWNlaG9sZGVycyA9IHt9O1xuXG4gICAgY29uc3QgZml4SWRzID0gbWFwKGV2b2x2ZSh7aWQ6IHBhcnNlSWZXaWxkY2FyZH0pKTtcbiAgICBjb25zdCBwYXJzZWREZXBlbmRlbmNpZXMgPSBtYXAoZGVwID0+IHtcbiAgICAgICAgY29uc3Qge291dHB1dCwgbm9fb3V0cHV0LCBvdXRwdXRzX21ldGF9ID0gZGVwO1xuICAgICAgICBjb25zdCBvdXQgPSBldm9sdmUoe2lucHV0czogZml4SWRzLCBzdGF0ZTogZml4SWRzfSwgZGVwKTtcbiAgICAgICAgaWYgKG5vX291dHB1dCkge1xuICAgICAgICAgICAgLy8gTm8gb3V0cHV0IGNhc2VcbiAgICAgICAgICAgIG91dC5vdXRwdXRzID0gW107XG4gICAgICAgICAgICBvdXQubm9PdXRwdXQgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgb3V0cHV0U3RycyA9IGlzTXVsdGlPdXRwdXRQcm9wKG91dHB1dClcbiAgICAgICAgICAgICAgICA/IHBhcnNlTXVsdGlwbGVPdXRwdXRzKG91dHB1dClcbiAgICAgICAgICAgICAgICA6IFtvdXRwdXRdO1xuICAgICAgICAgICAgb3V0Lm91dHB1dHMgPSBvdXRwdXRTdHJzLm1hcCgob3V0aSwgaWR4KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gYXNzb2MoJ291dCcsIHRydWUsIHNwbGl0SWRBbmRQcm9wKG91dGkpKTtcbiAgICAgICAgICAgICAgICAvLyBBdHRhY2ggcGFydGlhbCBmbGFnIGZyb20gb3V0cHV0c19tZXRhIGlmIGF2YWlsYWJsZVxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0c19tZXRhICYmXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dHNfbWV0YVtpZHhdICYmXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dHNfbWV0YVtpZHhdLnBhcnRpYWxcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VkLnBhcnRpYWwgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VkO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH0sIGRlcGVuZGVuY2llcyk7XG5cbiAgICBsZXQgaGFzRXJyb3IgPSBmYWxzZTtcbiAgICBjb25zdCB3cmFwcGVkREUgPSAobWVzc2FnZSwgbGluZXMpID0+IHtcbiAgICAgICAgaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICBkaXNwYXRjaEVycm9yKG1lc3NhZ2UsIGxpbmVzKTtcbiAgICB9O1xuICAgIGlmIChjb25maWcudmFsaWRhdGVfY2FsbGJhY2tzKSB7XG4gICAgICAgIHZhbGlkYXRlRGVwZW5kZW5jaWVzKHBhcnNlZERlcGVuZGVuY2llcywgd3JhcHBlZERFKTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIEZvciByZWd1bGFyIGlkcywgb3V0cHV0TWFwIGFuZCBpbnB1dE1hcCBhcmU6XG4gICAgICogICB7W2lkXToge1twcm9wXTogW2NhbGxiYWNrLCAuLi5dfX1cbiAgICAgKiB3aGVyZSBjYWxsYmFja3MgYXJlIHRoZSBtYXRjaGluZyBzcGVjcyBmcm9tIHRoZSBvcmlnaW5hbFxuICAgICAqIGRlcGVuZGVuY2llc1JlcXVlc3QsIGJ1dCB3aXRoIG91dHB1dHMgcGFyc2VkIHRvIGxvb2sgbGlrZSBpbnB1dHMsXG4gICAgICogYW5kIGEgbGlzdCBtYXRjaEtleXMgYWRkZWQgaWYgdGhlIG91dHB1dHMgaGF2ZSBNQVRDSCB3aWxkY2FyZHMuXG4gICAgICogRm9yIG91dHB1dE1hcCB0aGVyZSBzaG91bGQgb25seSBldmVyIGJlIG9uZSBjYWxsYmFjayBwZXIgaWQvcHJvcFxuICAgICAqIGJ1dCBmb3IgaW5wdXRNYXAgdGhlcmUgbWF5IGJlIG1hbnkuXG4gICAgICpcbiAgICAgKiBGb3Igd2lsZGNhcmQgaWRzLCBvdXRwdXRQYXR0ZXJucyBhbmQgaW5wdXRQYXR0ZXJucyBhcmU6XG4gICAgICogICB7XG4gICAgICogICAgICAgW2tleXN0cl06IHtcbiAgICAgKiAgICAgICAgICAgW3Byb3BdOiBbXG4gICAgICogICAgICAgICAgICAgICB7a2V5czogWy4uLl0sIHZhbHVlczogWy4uLl0sIGNhbGxiYWNrczogW2NhbGxiYWNrLCAuLi5dfSxcbiAgICAgKiAgICAgICAgICAgICAgIHsuLi59XG4gICAgICogICAgICAgICAgIF1cbiAgICAgKiAgICAgICB9XG4gICAgICogICB9XG4gICAgICoga2V5c3RyIGlzIGEgc3RyaW5naWZpZWQgb3JkZXJlZCBsaXN0IG9mIGtleXMgaW4gdGhlIGlkXG4gICAgICoga2V5cyBpcyB0aGUgc2FtZSBvcmRlcmVkIGxpc3QgKGp1c3QgY29waWVkIGZvciBjb252ZW5pZW5jZSlcbiAgICAgKiB2YWx1ZXMgaXMgYW4gYXJyYXkgb2YgZXhwbGljaXQgb3Igd2lsZGNhcmQgdmFsdWVzIGZvciBlYWNoIGtleSBpbiBrZXlzXG4gICAgICovXG4gICAgY29uc3Qgb3V0cHV0TWFwID0ge307XG4gICAgY29uc3QgaW5wdXRNYXAgPSB7fTtcbiAgICBjb25zdCBvdXRwdXRQYXR0ZXJuTWFwID0gbmV3IE1hcCgpO1xuICAgIGNvbnN0IGlucHV0UGF0dGVybk1hcCA9IG5ldyBNYXAoKTtcbiAgICBjb25zdCBwYXJ0aWFsT3V0cHV0UGF0dGVybk1hcCA9IG5ldyBNYXAoKTtcbiAgICBjb25zdCBwYXJ0aWFsSW5wdXRQYXR0ZXJuTWFwID0gbmV3IE1hcCgpO1xuICAgIGxldCBvdXRwdXRQYXR0ZXJucyA9IHt9O1xuICAgIGxldCBpbnB1dFBhdHRlcm5zID0ge307XG4gICAgbGV0IHBhcnRpYWxPdXRwdXRQYXR0ZXJucyA9IHt9O1xuICAgIGxldCBwYXJ0aWFsSW5wdXRQYXR0ZXJucyA9IHt9O1xuXG4gICAgbGV0IGhhc1BhcnRpYWxPdXRwdXRQYXR0ZXJucyA9IGZhbHNlO1xuICAgIGxldCBoYXNQYXJ0aWFsSW5wdXRQYXR0ZXJucyA9IGZhbHNlO1xuXG4gICAgY29uc3QgZmluYWxHcmFwaHMgPSB7XG4gICAgICAgIE11bHRpR3JhcGg6IG11bHRpR3JhcGgsXG4gICAgICAgIG91dHB1dE1hcCxcbiAgICAgICAgaW5wdXRNYXAsXG4gICAgICAgIG91dHB1dFBhdHRlcm5zLFxuICAgICAgICBpbnB1dFBhdHRlcm5zLFxuICAgICAgICBwYXJ0aWFsT3V0cHV0UGF0dGVybnMsXG4gICAgICAgIHBhcnRpYWxJbnB1dFBhdHRlcm5zLFxuICAgICAgICBoYXNQYXJ0aWFsT3V0cHV0UGF0dGVybnMsXG4gICAgICAgIGhhc1BhcnRpYWxJbnB1dFBhdHRlcm5zLFxuICAgICAgICBjYWxsYmFja3M6IHBhcnNlZERlcGVuZGVuY2llc1xuICAgIH07XG5cbiAgICBpZiAoaGFzRXJyb3IpIHtcbiAgICAgICAgLy8gbGVhdmUgdGhlIGdyYXBocyBlbXB0eSBpZiB3ZSBmb3VuZCBhbiBlcnJvciwgc28gd2UgZG9uJ3QgdHJ5IHRvXG4gICAgICAgIC8vIGV4ZWN1dGUgdGhlIGJyb2tlbiBjYWxsYmFja3MuXG4gICAgICAgIHJldHVybiBmaW5hbEdyYXBocztcbiAgICB9XG5cbiAgICAvLyBidWlsZHMgdXAgd2lsZGNhcmRQbGFjZWhvbGRlcnMgd2l0aCBhbGwgdGhlIHdpbGRjYXJkIGtleXMgYW5kIHZhbHVlcyB1c2VkIGluIHRoZSBjYWxsYmFja3MsIHNvIHdlIGNhbiBnZW5lcmF0ZSB0aGUgZnVsbCBsaXN0IG9mIGlkcyB0aGF0IGVhY2ggY2FsbGJhY2sgZGVwZW5kcyBvbi5cbiAgICBwYXJzZWREZXBlbmRlbmNpZXMuZm9yRWFjaChkZXBlbmRlbmN5ID0+IHtcbiAgICAgICAgY29uc3Qge291dHB1dHMsIGlucHV0c30gPSBkZXBlbmRlbmN5O1xuXG4gICAgICAgIG91dHB1dHNcbiAgICAgICAgICAgIC5jb25jYXQoaW5wdXRzKVxuICAgICAgICAgICAgLmZpbHRlcihpdGVtID0+IHR5cGVvZiBpdGVtLmlkID09PSAnb2JqZWN0JylcbiAgICAgICAgICAgIC5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgIGZvckVhY2hPYmpJbmRleGVkKCh2YWwsIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbGRjYXJkUGxhY2Vob2xkZXJzW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbGRjYXJkUGxhY2Vob2xkZXJzW2tleV0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhhY3Q6IFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZDogMFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXlQbGFjZWhvbGRlcnMgPSB3aWxkY2FyZFBsYWNlaG9sZGVyc1trZXldO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsICYmIHZhbC53aWxkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsLmV4cGFuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVBsYWNlaG9sZGVycy5leHBhbmQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXlQbGFjZWhvbGRlcnMuZXhhY3QuaW5kZXhPZih2YWwpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5UGxhY2Vob2xkZXJzLmV4YWN0LnB1c2godmFsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIGl0ZW0uaWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBFZmZpY2llbnRseSBidWlsZCB3aWxkY2FyZFBsYWNlaG9sZGVycy52YWxzIGFycmF5c1xuICAgIGZvckVhY2hPYmpJbmRleGVkKGtleVBsYWNlaG9sZGVycyA9PiB7XG4gICAgICAgIGNvbnN0IHtleGFjdCwgZXhwYW5kfSA9IGtleVBsYWNlaG9sZGVycztcbiAgICAgICAgY29uc3QgdmFscyA9IGV4YWN0LnNsaWNlKCkuc29ydChpZFZhbFNvcnQpO1xuICAgICAgICBpZiAoZXhwYW5kKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4cGFuZDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGV4YWN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB2YWxzLnNwbGljZSgwLCAwLCBbdmFsQmVmb3JlKHZhbHNbMF0pXSk7XG4gICAgICAgICAgICAgICAgICAgIHZhbHMucHVzaCh2YWxBZnRlcih2YWxzW3ZhbHMubGVuZ3RoIC0gMV0pKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YWxzLnB1c2goaSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKCFleGFjdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIG9ubHkgTUFUQ0gvQUxMIC0gc3RpbGwgbmVlZCBhIHZhbHVlXG4gICAgICAgICAgICB2YWxzLnB1c2goMCk7XG4gICAgICAgIH1cbiAgICAgICAga2V5UGxhY2Vob2xkZXJzLnZhbHMgPSB2YWxzO1xuICAgIH0sIHdpbGRjYXJkUGxhY2Vob2xkZXJzKTtcblxuICAgIGZ1bmN0aW9uIG1ha2VBbGxJZHMoaWRTcGVjLCBvdXRJZEZpbmFsKSB7XG4gICAgICAgIGxldCBpZExpc3QgPSBbe31dO1xuICAgICAgICBmb3JFYWNoT2JqSW5kZXhlZCgodmFsLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRlc3RWYWxzID0gd2lsZGNhcmRQbGFjZWhvbGRlcnNba2V5XS52YWxzO1xuICAgICAgICAgICAgY29uc3Qgb3V0VmFsSW5kZXggPSB0ZXN0VmFscy5pbmRleE9mKG91dElkRmluYWxba2V5XSk7XG4gICAgICAgICAgICBsZXQgbmV3VmFscyA9IFt2YWxdO1xuICAgICAgICAgICAgaWYgKHZhbCAmJiB2YWwud2lsZCkge1xuICAgICAgICAgICAgICAgIGlmICh2YWwgPT09IEFMTFNNQUxMRVIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG91dFZhbEluZGV4ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3VmFscyA9IHRlc3RWYWxzLnNsaWNlKDAsIG91dFZhbEluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHNtYWxsZXIgaXRlbXMgLSBkZWxldGUgYWxsIG91dHB1dHMuXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdWYWxzID0gW107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBNQVRDSCBvciBBTExcbiAgICAgICAgICAgICAgICAgICAgLy8gTUFUQ0ggKmlzKiBBTEwgZm9yIG91dHB1dHMsIGllIHdlIGRvbid0IGFscmVhZHkgaGF2ZSBhXG4gICAgICAgICAgICAgICAgICAgIC8vIHZhbHVlIHNwZWNpZmllZCBpbiBgb3V0SWRGaW5hbGBcbiAgICAgICAgICAgICAgICAgICAgbmV3VmFscyA9XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRWYWxJbmRleCA9PT0gLTEgfHwgdmFsID09PSBBTExcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHRlc3RWYWxzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBbb3V0SWRGaW5hbFtrZXldXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyByZXBsaWNhdGVzIGV2ZXJ5dGhpbmcgaW4gaWRMaXN0IG9uY2UgZm9yIGVhY2ggaXRlbSBpblxuICAgICAgICAgICAgLy8gbmV3VmFscywgYXR0YWNoaW5nIGVhY2ggdmFsdWUgYXQga2V5LlxuICAgICAgICAgICAgaWRMaXN0ID0gYXAoYXAoW2Fzc29jKGtleSldLCBuZXdWYWxzKSwgaWRMaXN0KTtcbiAgICAgICAgfSwgaWRTcGVjKTtcbiAgICAgICAgcmV0dXJuIGlkTGlzdDtcbiAgICB9XG5cbiAgICAvKiBtdWx0aUdyYXBoIGlzIHVzZWQgb25seSBmb3IgdGVzdGluZyBjaXJjdWxhcml0eVxuICAgICAqXG4gICAgICogRWFjaCBjb21wb25lbnQrcHJvcGVydHkgdGhhdCBpcyB1c2VkIGFzIGFuIGlucHV0IG9yIG91dHB1dCBpcyBhZGRlZCBhcyBhIG5vZGVcbiAgICAgKiB0byBhIGRpcmVjdGVkIGdyYXBoIHdpdGggYSBkZXBlbmRlbmN5IGZyb20gZWFjaCBpbnB1dCB0byBlYWNoIG91dHB1dC4gVGhlXG4gICAgICogZnVuY3Rpb24gdHJpZ2dlckRlZmF1bHRTdGF0ZSBpbiBpbmRleC5qcyB0aGVuIGNoZWNrcyB0aGlzIGdyYXBoIGZvciBjaXJjdWxhcml0eS5cbiAgICAgKlxuICAgICAqIEluIG9yZGVyIHRvIGFsbG93IHRoZSBzYW1lIGNvbXBvbmVudCtwcm9wZXJ0eSB0byBiZSBib3RoIGFuIGlucHV0IGFuZCBvdXRwdXRcbiAgICAgKiBvZiB0aGUgc2FtZSBjYWxsYmFjaywgYSB0d28gcGFzcyBhcHByb2FjaCBpcyB1c2VkLlxuICAgICAqXG4gICAgICogSW4gdGhlIGZpcnN0IHBhc3MsIHRoZSBncmFwaCBpcyBidWlsdCB1cCBub3JtYWxseSB3aXRoIHRoZSBleGNlcHRpb24gdGhhdFxuICAgICAqIGluIGNhc2VzIHdoZXJlIGFuIG91dHB1dCBpcyBhbHNvIGFuIGlucHV0IHRvIHRoZSBzYW1lIGNhbGxiYWNrIGEgc3BlY2lhbFxuICAgICAqIFwib3V0cHV0XCIgbm9kZSBpcyBhZGRlZCBhbmQgdGhlIGRlcGVuZGVuY2llcyB0YXJnZXQgdGhpcyBvdXRwdXQgbm9kZSBpbnN0ZWFkLlxuICAgICAqIEZvciBleGFtcGxlLCBpZiBgc2xpZGVyLnZhbHVlYCBpcyBib3RoIGFuIGlucHV0IGFuZCBhbiBvdXRwdXQsIHRoZW4gdGhlIGEgbmV3XG4gICAgICogbm9kZSBgc2xpZGVyLnZhbHVlX19vdXRwdXRgIHdpbGwgYmUgYWRkZWQgd2l0aCBhIGRlcGVuZGVuY3kgZnJvbSBgc2xpZGVyLnZhbHVlYFxuICAgICAqIHRvIGBzbGlkZXIudmFsdWVfX291dHB1dGAuIFNwbGl0dGluZyB0aGUgaW5wdXQgYW5kIG91dHB1dCBpbnRvIHNlcGFyYXRlIG5vZGVzXG4gICAgICogcmVtb3ZlcyB0aGUgY2lyY3VsYXJpdHkuXG4gICAgICpcbiAgICAgKiBJbiBvcmRlciB0byBzdGlsbCBkZXRlY3Qgb3RoZXIgZm9ybXMgb2YgY2lyY3VsYXJpdHksIGl0IGlzIG5lY2Vzc2FyeSB0byBkbyBhXG4gICAgICogc2Vjb25kIHBhc3MgYW5kIGFkZCB0aGUgbmV3IG91dHB1dCBub2RlcyBhcyBhIGRlcGVuZGVuY3kgaW4gYW55ICpvdGhlciogY2FsbGJhY2tzXG4gICAgICogd2hlcmUgdGhlIG9yaWdpbmFsIG5vZGUgd2FzIGFuIGlucHV0LiBDb250aW51aW5nIHRoZSBleGFtcGxlLCBhbnkgb3RoZXIgY2FsbGJhY2tcbiAgICAgKiB0aGF0IGhhZCBgc2xpZGVyLnZhbHVlYCBhcyBhbiBpbnB1dCBkZXBlbmRlbmN5IGFsc28gbmVlZHMgdG8gaGF2ZVxuICAgICAqIGBzbGlkZXIudmFsdWVfX291dHB1dGAgYXMgYSBkZXBlbmRlbmN5LiBUbyBtYWtlIHRoaXMgZWZmaWNpZW50LCBhbGwgdGhlIGlucHV0c1xuICAgICAqIGFuZCBvdXRwdXRzIGZvciBlYWNoIGNhbGxiYWNrIGFyZSBzdG9yZWQgZHVyaW5nIHRoZSBmaXJzdCBwYXNzLlxuICAgICAqL1xuXG4gICAgY29uc3Qgb3V0cHV0VGFnID0gJ19fb3V0cHV0JztcbiAgICBjb25zdCBkdXBsaWNhdGVPdXRwdXRzID0gW107XG4gICAgY29uc3QgY2JJbiA9IFtdO1xuICAgIGNvbnN0IGNiT3V0ID0gW107XG5cbiAgICBmdW5jdGlvbiBhZGRJbnB1dFRvTXVsdGkoaW5JZFByb3AsIG91dElkUHJvcCwgZmlyc3RQYXNzID0gdHJ1ZSkge1xuICAgICAgICBpZiAoIWNvbmZpZy52YWxpZGF0ZV9jYWxsYmFja3MpIHJldHVybjtcbiAgICAgICAgbXVsdGlHcmFwaC5hZGROb2RlKGluSWRQcm9wKTtcbiAgICAgICAgbXVsdGlHcmFwaC5hZGREZXBlbmRlbmN5KGluSWRQcm9wLCBvdXRJZFByb3ApO1xuICAgICAgICAvLyBvbmx5IHN0b3JlIGNhbGxiYWNrIGlucHV0cyBhbmQgb3V0cHV0cyBkdXJpbmcgdGhlIGZpcnN0IHBhc3NcbiAgICAgICAgaWYgKGZpcnN0UGFzcykge1xuICAgICAgICAgICAgY2JJbltjYkluLmxlbmd0aCAtIDFdLnB1c2goaW5JZFByb3ApO1xuICAgICAgICAgICAgY2JPdXRbY2JPdXQubGVuZ3RoIC0gMV0ucHVzaChvdXRJZFByb3ApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcGFyc2VkRGVwZW5kZW5jaWVzLmZvckVhY2goZGVwZW5kZW5jeSA9PiB7XG4gICAgICAgIGNvbnN0IHtvdXRwdXRzLCBpbnB1dHN9ID0gZGVwZW5kZW5jeTtcblxuICAgICAgICAvLyBuZXcgY2FsbGJhY2ssIGFkZCBhbiBlbXB0eSBhcnJheSBmb3IgaXRzIGlucHV0cyBhbmQgb3V0cHV0c1xuICAgICAgICBjYkluLnB1c2goW10pO1xuICAgICAgICBjYk91dC5wdXNoKFtdKTtcblxuICAgICAgICBmdW5jdGlvbiBhZGRPdXRwdXRUb011bHRpKG91dElkRmluYWwsIG91dElkUHJvcCkge1xuICAgICAgICAgICAgaWYgKCFjb25maWcudmFsaWRhdGVfY2FsbGJhY2tzKSByZXR1cm47XG4gICAgICAgICAgICBtdWx0aUdyYXBoLmFkZE5vZGUob3V0SWRQcm9wKTtcbiAgICAgICAgICAgIGlucHV0cy5mb3JFYWNoKGluT2JqID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7aWQ6IGluSWQsIHByb3BlcnR5fSA9IGluT2JqO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaW5JZCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5JZExpc3QgPSBtYWtlQWxsSWRzKGluSWQsIG91dElkRmluYWwpO1xuICAgICAgICAgICAgICAgICAgICBpbklkTGlzdC5mb3JFYWNoKGlkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZElucHV0VG9NdWx0aShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21iaW5lSWRBbmRQcm9wKHtpZCwgcHJvcGVydHl9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRJZFByb3BcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZElucHV0VG9NdWx0aShjb21iaW5lSWRBbmRQcm9wKGluT2JqKSwgb3V0SWRQcm9wKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdlJ2xsIGNvbnRpbnVlIHRvIHVzZSBkZXAub3V0cHV0IGFzIGl0cyBpZCwgYnV0IGFkZCBvdXRwdXRzIGFzIHdlbGxcbiAgICAgICAgLy8gZm9yIGNvbnZlbmllbmNlIGFuZCBzeW1tZXRyeSB3aXRoIHRoZSBzdHJ1Y3R1cmUgb2YgaW5wdXRzIGFuZCBzdGF0ZS5cbiAgICAgICAgLy8gQWxzbyBjb2xsZWN0IE1BVENIIGtleXMgaW4gdGhlIG91dHB1dCAoYWxsIG91dHB1dHMgbXVzdCBzaGFyZSB0aGVzZSlcbiAgICAgICAgLy8gYW5kIEFMTCBrZXlzIGluIHRoZSBmaXJzdCBvdXRwdXQgKG5lZWQgbm90IGJlIHNoYXJlZCBidXQgd2UnbGwgdXNlXG4gICAgICAgIC8vIHRoZSBmaXJzdCBvdXRwdXQgZm9yIGNhbGN1bGF0aW9ucykgZm9yIGxhdGVyIGNvbnZlbmllbmNlLlxuICAgICAgICBjb25zdCB7bWF0Y2hLZXlzfSA9IGZpbmRXaWxkY2FyZEtleXMoXG4gICAgICAgICAgICBvdXRwdXRzLmxlbmd0aCA/IG91dHB1dHNbMF0uaWQgOiB1bmRlZmluZWRcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgZmlyc3RTaW5nbGVPdXRwdXQgPSBmaW5kSW5kZXgobyA9PiAhaXNNdWx0aVZhbHVlZChvKSwgb3V0cHV0cyk7XG4gICAgICAgIGNvbnN0IGZpbmFsRGVwZW5kZW5jeSA9IG1lcmdlUmlnaHQoXG4gICAgICAgICAgICB7bWF0Y2hLZXlzLCBmaXJzdFNpbmdsZU91dHB1dCwgb3V0cHV0c30sXG4gICAgICAgICAgICBkZXBlbmRlbmN5XG4gICAgICAgICk7XG5cbiAgICAgICAgb3V0cHV0cy5mb3JFYWNoKG91dElkUHJvcCA9PiB7XG4gICAgICAgICAgICBjb25zdCB7aWQ6IG91dElkLCBwcm9wZXJ0eSwgcGFydGlhbDogb3V0UGFydGlhbH0gPSBvdXRJZFByb3A7XG4gICAgICAgICAgICAvLyBjaGVjayBpZiB0aGlzIG91dHB1dCBpcyBhbHNvIGFuIGlucHV0IHRvIHRoZSBzYW1lIGNhbGxiYWNrXG4gICAgICAgICAgICBsZXQgYWxzb0lucHV0O1xuICAgICAgICAgICAgaWYgKGNvbmZpZy52YWxpZGF0ZV9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgICAgICBhbHNvSW5wdXQgPSBjaGVja0luT3V0T3ZlcmxhcChvdXRJZFByb3AsIGlucHV0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIG91dElkID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIGlmIChjb25maWcudmFsaWRhdGVfY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG91dElkTGlzdCA9IG1ha2VBbGxJZHMob3V0SWQsIHt9KTtcbiAgICAgICAgICAgICAgICAgICAgb3V0SWRMaXN0LmZvckVhY2goaWQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGVtcE91dElkUHJvcCA9IHtpZCwgcHJvcGVydHl9O1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG91dElkTmFtZSA9IGNvbWJpbmVJZEFuZFByb3AodGVtcE91dElkUHJvcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIG91dHB1dCBpcyBhbHNvIGFuIGlucHV0LCBhZGQgYG91dHB1dFRhZ2AgdG8gdGhlIG5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbHNvSW5wdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVPdXRwdXRzLnB1c2godGVtcE91dElkUHJvcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0SWROYW1lICs9IG91dHB1dFRhZztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZE91dHB1dFRvTXVsdGkoaWQsIG91dElkTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAob3V0UGFydGlhbCkge1xuICAgICAgICAgICAgICAgICAgICBhZGRQYXJ0aWFsUGF0dGVybihcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBhdHRlcm5NYXAsXG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxEZXBlbmRlbmN5XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGFkZFBhcnRpYWxQYXR0ZXJuKFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFydGlhbE91dHB1dFBhdHRlcm5NYXAsXG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxEZXBlbmRlbmN5XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGhhc1BhcnRpYWxPdXRwdXRQYXR0ZXJucyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkUGF0dGVybihcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBhdHRlcm5NYXAsXG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxEZXBlbmRlbmN5XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLnZhbGlkYXRlX2NhbGxiYWNrcykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3V0SWROYW1lID0gY29tYmluZUlkQW5kUHJvcChvdXRJZFByb3ApO1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIG91dHB1dCBpcyBhbHNvIGFuIGlucHV0LCBhZGQgYG91dHB1dFRhZ2AgdG8gdGhlIG5hbWVcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFsc29JbnB1dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZHVwbGljYXRlT3V0cHV0cy5wdXNoKG91dElkUHJvcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRJZE5hbWUgKz0gb3V0cHV0VGFnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGFkZE91dHB1dFRvTXVsdGkoe30sIG91dElkTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFkZE1hcChvdXRwdXRNYXAsIG91dElkLCBwcm9wZXJ0eSwgZmluYWxEZXBlbmRlbmN5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaW5wdXRzLmZvckVhY2goaW5wdXRPYmplY3QgPT4ge1xuICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICAgIGlkOiBpbklkLFxuICAgICAgICAgICAgICAgIHByb3BlcnR5OiBpblByb3AsXG4gICAgICAgICAgICAgICAgcGFydGlhbDogaW5QYXJ0aWFsXG4gICAgICAgICAgICB9ID0gaW5wdXRPYmplY3Q7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGluSWQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgaWYgKGluUGFydGlhbCkge1xuICAgICAgICAgICAgICAgICAgICBhZGRQYXJ0aWFsUGF0dGVybihcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0UGF0dGVybk1hcCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGluSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBpblByb3AsXG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbERlcGVuZGVuY3lcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgYWRkUGFydGlhbFBhdHRlcm4oXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aWFsSW5wdXRQYXR0ZXJuTWFwLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGluUHJvcCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsRGVwZW5kZW5jeVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBoYXNQYXJ0aWFsSW5wdXRQYXR0ZXJucyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkUGF0dGVybihpbnB1dFBhdHRlcm5NYXAsIGluSWQsIGluUHJvcCwgZmluYWxEZXBlbmRlbmN5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGFkZE1hcChpbnB1dE1hcCwgaW5JZCwgaW5Qcm9wLCBmaW5hbERlcGVuZGVuY3kpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICBvdXRwdXRQYXR0ZXJucyA9IG9mZmxvYWRQYXR0ZXJucyhvdXRwdXRQYXR0ZXJuTWFwLCBvdXRwdXRQYXR0ZXJucyk7XG4gICAgaW5wdXRQYXR0ZXJucyA9IG9mZmxvYWRQYXR0ZXJucyhpbnB1dFBhdHRlcm5NYXAsIGlucHV0UGF0dGVybnMpO1xuICAgIHBhcnRpYWxPdXRwdXRQYXR0ZXJucyA9IG9mZmxvYWRQYXR0ZXJucyhcbiAgICAgICAgcGFydGlhbE91dHB1dFBhdHRlcm5NYXAsXG4gICAgICAgIHBhcnRpYWxPdXRwdXRQYXR0ZXJuc1xuICAgICk7XG4gICAgcGFydGlhbElucHV0UGF0dGVybnMgPSBvZmZsb2FkUGF0dGVybnMoXG4gICAgICAgIHBhcnRpYWxJbnB1dFBhdHRlcm5NYXAsXG4gICAgICAgIHBhcnRpYWxJbnB1dFBhdHRlcm5zXG4gICAgKTtcbiAgICBmaW5hbEdyYXBocy5vdXRwdXRQYXR0ZXJucyA9IG91dHB1dFBhdHRlcm5zO1xuICAgIGZpbmFsR3JhcGhzLmlucHV0UGF0dGVybnMgPSBpbnB1dFBhdHRlcm5zO1xuICAgIGZpbmFsR3JhcGhzLnBhcnRpYWxPdXRwdXRQYXR0ZXJucyA9IHBhcnRpYWxPdXRwdXRQYXR0ZXJucztcbiAgICBmaW5hbEdyYXBocy5wYXJ0aWFsSW5wdXRQYXR0ZXJucyA9IHBhcnRpYWxJbnB1dFBhdHRlcm5zO1xuICAgIGZpbmFsR3JhcGhzLmhhc1BhcnRpYWxPdXRwdXRQYXR0ZXJucyA9IGhhc1BhcnRpYWxPdXRwdXRQYXR0ZXJucztcbiAgICBmaW5hbEdyYXBocy5oYXNQYXJ0aWFsSW5wdXRQYXR0ZXJucyA9IGhhc1BhcnRpYWxJbnB1dFBhdHRlcm5zO1xuXG4gICAgLy8gc2Vjb25kIHBhc3MgZm9yIGFkZGluZyBuZXcgb3V0cHV0IG5vZGVzIGFzIGRlcGVuZGVuY2llcyB3aGVyZSBuZWVkZWRcbiAgICBkdXBsaWNhdGVPdXRwdXRzLmZvckVhY2goZHVwZU91dElkUHJvcCA9PiB7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsTmFtZSA9IGNvbWJpbmVJZEFuZFByb3AoZHVwZU91dElkUHJvcCk7XG4gICAgICAgIGNvbnN0IG5ld05hbWUgPSBvcmlnaW5hbE5hbWUuY29uY2F0KG91dHB1dFRhZyk7XG4gICAgICAgIGZvciAodmFyIGNudCA9IDA7IGNudCA8IGNiSW4ubGVuZ3RoOyBjbnQrKykge1xuICAgICAgICAgICAgLy8gY2hlY2sgaWYgaW5wdXQgdG8gdGhlIGNhbGxiYWNrXG4gICAgICAgICAgICBpZiAoY2JJbltjbnRdLnNvbWUoaW5OYW1lID0+IGluTmFtZSA9PT0gb3JpZ2luYWxOYW1lKSkge1xuICAgICAgICAgICAgICAgIC8qIG1ha2Ugc3VyZSBpdCdzIG5vdCBhbHNvIGFuIG91dHB1dCBvZiB0aGUgY2FsbGJhY2tcbiAgICAgICAgICAgICAgICAgKiAodGhpcyB3aWxsIGJlIHRoZSBvcmlnaW5hbCBjYWxsYmFjaylcbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBpZiAoIWNiT3V0W2NudF0uc29tZShvdXROYW1lID0+IG91dE5hbWUgPT09IG5ld05hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNiT3V0W2NudF0uZm9yRWFjaChvdXROYW1lID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZElucHV0VG9NdWx0aShuZXdOYW1lLCBvdXROYW1lLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGVuZCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIGlmICghd2luZG93LmRhc2hfY29tcG9uZW50X2FwaSkge1xuICAgICAgICB3aW5kb3cuZGFzaF9jb21wb25lbnRfYXBpID0ge307XG4gICAgfVxuICAgIHdpbmRvdy5kYXNoX2NvbXBvbmVudF9hcGkuY2FsbGJhY2tHcmFwaFRpbWUgPSAoZW5kIC0gc3RhcnQpLnRvRml4ZWQoMik7XG5cbiAgICByZXR1cm4gZmluYWxHcmFwaHM7XG59XG5cbmZ1bmN0aW9uIGZpbmRXaWxkY2FyZEtleXMoaWQpIHtcbiAgICBjb25zdCBtYXRjaEtleXMgPSBbXTtcbiAgICBjb25zdCBhbGxzbWFsbGVyS2V5cyA9IFtdO1xuICAgIGlmICh0eXBlb2YgaWQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGZvckVhY2hPYmpJbmRleGVkKCh2YWwsIGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKHZhbCA9PT0gTUFUQ0gpIHtcbiAgICAgICAgICAgICAgICBtYXRjaEtleXMucHVzaChrZXkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWwgPT09IEFMTFNNQUxMRVIpIHtcbiAgICAgICAgICAgICAgICBhbGxzbWFsbGVyS2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIGlkKTtcbiAgICAgICAgbWF0Y2hLZXlzLnNvcnQoKTtcbiAgICAgICAgYWxsc21hbGxlcktleXMuc29ydCgpO1xuICAgIH1cbiAgICByZXR1cm4ge21hdGNoS2V5cywgYWxsc21hbGxlcktleXN9O1xufVxuXG4vKlxuICogRG8gdGhlIGdpdmVuIGlkIHZhbHVlcyBgdmFsc2AgbWF0Y2ggdGhlIHBhdHRlcm4gYHBhdHRlcm5WYWxzYD9cbiAqIGBrZXlzYCwgYHBhdHRlcm5WYWxzYCwgYW5kIGB2YWxzYCBhcmUgYWxsIGFycmF5cywgYW5kIHdlIGFscmVhZHkga25vdyB0aGF0XG4gKiB3ZSdyZSBvbmx5IGxvb2tpbmcgYXQgaWRzIHdpdGggdGhlIHNhbWUga2V5cyBhcyB0aGUgcGF0dGVybi5cbiAqXG4gKiBPcHRpb25hbGx5LCBpbmNsdWRlIGFub3RoZXIgcmVmZXJlbmNlIHNldCBvZiB0aGUgc2FtZSAtIHRvIGVuc3VyZSB0aGVcbiAqIGNvcnJlY3QgbWF0Y2hpbmcgb2YgTUFUQ0ggb3IgQUxMU01BTExFUiBiZXR3ZWVuIGlucHV0IGFuZCBvdXRwdXQgaXRlbXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpZE1hdGNoKFxuICAgIGtleXMsXG4gICAgdmFscyxcbiAgICBwYXR0ZXJuVmFscyxcbiAgICByZWZLZXlzLFxuICAgIHJlZlZhbHMsXG4gICAgcmVmUGF0dGVyblZhbHNcbikge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCB2YWwgPSB2YWxzW2ldO1xuICAgICAgICBjb25zdCBwYXR0ZXJuVmFsID0gcGF0dGVyblZhbHNbaV07XG4gICAgICAgIGlmIChwYXR0ZXJuVmFsLndpbGQpIHtcbiAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYSBzZWNvbmQgaWQsIGNvbXBhcmUgdGhlIHdpbGRjYXJkIHZhbHVlcy5cbiAgICAgICAgICAgIC8vIFdpdGhvdXQgYSBzZWNvbmQgaWQsIGFsbCB3aWxkY2FyZHMgcGFzcyBhdCB0aGlzIHN0YWdlLlxuICAgICAgICAgICAgaWYgKHJlZktleXMgJiYgcGF0dGVyblZhbCAhPT0gQUxMKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVmSW5kZXggPSByZWZLZXlzLmluZGV4T2Yoa2V5c1tpXSk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVmUGF0dGVyblZhbCA9IHJlZlBhdHRlcm5WYWxzW3JlZkluZGV4XTtcbiAgICAgICAgICAgICAgICAvLyBTYW5pdHkgY2hlY2suIFNob3VsZG4ndCBldmVyIGZhaWwgdGhpcywgaWYgdGhlIGJhY2sgZW5kXG4gICAgICAgICAgICAgICAgLy8gZGlkIGl0cyBqb2IgdmFsaWRhdGluZyBjYWxsYmFja3MuXG4gICAgICAgICAgICAgICAgLy8gWW91IGNhbid0IHJlc29sdmUgYW4gaW5wdXQgYWdhaW5zdCBhbiBpbnB1dCwgYmVjYXVzZVxuICAgICAgICAgICAgICAgIC8vIHR3byBBTExTTUFMTEVSJ3Mgd291bGRuJ3QgbWFrZSBzZW5zZSFcbiAgICAgICAgICAgICAgICBpZiAocGF0dGVyblZhbCA9PT0gQUxMU01BTExFUiAmJiByZWZQYXR0ZXJuVmFsID09PSBBTExTTUFMTEVSKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICdpbnZhbGlkIHdpbGRjYXJkIGlkIHBhaXI6ICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVyblZhbHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZktleXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZlBhdHRlcm5WYWxzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZWYWxzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBpZFZhbFNvcnQodmFsLCByZWZWYWxzW3JlZkluZGV4XSkgIT09XG4gICAgICAgICAgICAgICAgICAgIChwYXR0ZXJuVmFsID09PSBBTExTTUFMTEVSXG4gICAgICAgICAgICAgICAgICAgICAgICA/IC0xXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHJlZlBhdHRlcm5WYWwgPT09IEFMTFNNQUxMRVJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gMVxuICAgICAgICAgICAgICAgICAgICAgICAgOiAwKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHZhbCAhPT0gcGF0dGVyblZhbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuXG4vKlxuICogUGFydGlhbCBpZCBtYXRjaGluZzogY2hlY2sgaWYgdGhlIHBhdHRlcm4gKHdpdGggZmV3ZXIga2V5cykgbWF0Y2hlc1xuICogYSBjb21wb25lbnQgaWQgKHdpdGggbW9yZSBrZXlzKS4gT25seSBrZXlzIHByZXNlbnQgaW4gdGhlIHBhdHRlcm5cbiAqIGFyZSBjaGVja2VkOyBleHRyYSBrZXlzIGluIHRoZSBjb21wb25lbnQgaWQgYXJlIGlnbm9yZWQuXG4gKlxuICogYHBhdHRlcm5LZXlzYCBhbmQgYHBhdHRlcm5WYWxzYCBkZXNjcmliZSB0aGUgcGF0dGVybi5cbiAqIGBjb21wb25lbnRLZXlzYCBhbmQgYGNvbXBvbmVudFZhbHNgIGRlc2NyaWJlIHRoZSBhY3R1YWwgY29tcG9uZW50IGlkLlxuICogVGhlIGNvbXBvbmVudCBtdXN0IGhhdmUgYWxsIHRoZSBwYXR0ZXJuJ3Mga2V5cyAoc3VwZXJzZXQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFydGlhbElkTWF0Y2goXG4gICAgcGF0dGVybktleXMsXG4gICAgcGF0dGVyblZhbHMsXG4gICAgY29tcG9uZW50S2V5cyxcbiAgICBjb21wb25lbnRWYWxzLFxuICAgIHJlZktleXMsXG4gICAgcmVmVmFscyxcbiAgICByZWZQYXR0ZXJuVmFsc1xuKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXR0ZXJuS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBwYXR0ZXJuS2V5ID0gcGF0dGVybktleXNbaV07XG4gICAgICAgIGNvbnN0IHBhdHRlcm5WYWwgPSBwYXR0ZXJuVmFsc1tpXTtcbiAgICAgICAgLy8gRmluZCB0aGlzIGtleSBpbiB0aGUgY29tcG9uZW50XG4gICAgICAgIGNvbnN0IGNvbXBJbmRleCA9IGNvbXBvbmVudEtleXMuaW5kZXhPZihwYXR0ZXJuS2V5KTtcbiAgICAgICAgaWYgKGNvbXBJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIC8vIENvbXBvbmVudCBkb2Vzbid0IGhhdmUgdGhpcyBrZXkgLSBubyBtYXRjaFxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbCA9IGNvbXBvbmVudFZhbHNbY29tcEluZGV4XTtcbiAgICAgICAgaWYgKHBhdHRlcm5WYWwud2lsZCkge1xuICAgICAgICAgICAgaWYgKHJlZktleXMgJiYgcGF0dGVyblZhbCAhPT0gQUxMKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVmSW5kZXggPSByZWZLZXlzLmluZGV4T2YocGF0dGVybktleSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlZkluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcmVmUGF0dGVyblZhbCA9IHJlZlBhdHRlcm5WYWxzW3JlZkluZGV4XTtcbiAgICAgICAgICAgICAgICBpZiAocGF0dGVyblZhbCA9PT0gQUxMU01BTExFUiAmJiByZWZQYXR0ZXJuVmFsID09PSBBTExTTUFMTEVSKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICdpbnZhbGlkIHdpbGRjYXJkIGlkIHBhaXIgKHBhcnRpYWwpOiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm5LZXlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuVmFscyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50S2V5cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50VmFscyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmS2V5cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmUGF0dGVyblZhbHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZlZhbHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGlkVmFsU29ydCh2YWwsIHJlZlZhbHNbcmVmSW5kZXhdKSAhPT1cbiAgICAgICAgICAgICAgICAgICAgKHBhdHRlcm5WYWwgPT09IEFMTFNNQUxMRVJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gLTFcbiAgICAgICAgICAgICAgICAgICAgICAgIDogcmVmUGF0dGVyblZhbCA9PT0gQUxMU01BTExFUlxuICAgICAgICAgICAgICAgICAgICAgICAgPyAxXG4gICAgICAgICAgICAgICAgICAgICAgICA6IDApXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodmFsICE9PSBwYXR0ZXJuVmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbnlWYWxzKHBhdHRlcm5WYWxzLCB2YWxzKSB7XG4gICAgY29uc3QgbWF0Y2hlcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0dGVyblZhbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHBhdHRlcm5WYWxzW2ldID09PSBNQVRDSCkge1xuICAgICAgICAgICAgbWF0Y2hlcy5wdXNoKHZhbHNbaV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYXRjaGVzLmxlbmd0aCA/IEpTT04uc3RyaW5naWZ5KG1hdGNoZXMpIDogJyc7XG59XG5cbi8qXG4gKiBEb2VzIHRoaXMgaXRlbSAoaW5wdXQgLyBvdXRwdXQgLyBzdGF0ZSkgc3VwcG9ydCBtdWx0aXBsZSB2YWx1ZXM/XG4gKiBzdHJpbmcgSURzIGRvIG5vdDsgd2lsZGNhcmQgSURzIG9ubHkgZG8gaWYgdGhleSBjb250YWluIEFMTCBvciBBTExTTUFMTEVSLlxuICogUGFydGlhbCBwYXR0ZXJucyB3aXRoIG5vIHdpbGRjYXJkcyBhcmUgaW1wbGljaXRseSBtdWx0aS12YWx1ZWQgc2luY2UgdGhleVxuICogY2FuIG1hdGNoIG11bHRpcGxlIGNvbXBvbmVudHMgd2l0aCBkaWZmZXJlbnQga2V5IHNldHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc011bHRpVmFsdWVkKHtpZCwgcGFydGlhbCA9IGZhbHNlfSkge1xuICAgIGlmICh0eXBlb2YgaWQgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGFueSh2ID0+IHYubXVsdGksIHZhbHVlcyhpZCkpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvLyBwYXJ0aWFsIHdpdGggbm8gd2lsZGNhcmRzOiBpbXBsaWNpdGx5IG11bHRpLXZhbHVlZFxuICAgIGlmIChwYXJ0aWFsICYmICFhbnkodiA9PiB2ICYmIHYud2lsZCwgdmFsdWVzKGlkKSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuLypcbiAqIEZvciBhIGdpdmVuIG91dHB1dCBpZCBhbmQgcHJvcCwgZmluZCB0aGUgY2FsbGJhY2sgZ2VuZXJhdGluZyBpdC5cbiAqIElmIG5vIGNhbGxiYWNrIGlzIGZvdW5kLCByZXR1cm5zIGZhbHNlLlxuICogSWYgb25lIGlzIGZvdW5kLCByZXR1cm5zOlxuICoge1xuICogICAgIGNhbGxiYWNrOiB0aGUgY2FsbGJhY2sgc3BlYyB7b3V0cHV0cywgaW5wdXRzLCBzdGF0ZSBldGN9XG4gKiAgICAgYW55VmFsczogc3RyaW5naWZpZWQgbGlzdCBvZiByZXNvbHZlZCBNQVRDSCBrZXlzIHdlIG1hdGNoZWRcbiAqICAgICByZXNvbHZlZElkOiB0aGUgXCJvdXRwdXRzXCIgaWQgc3RyaW5nIHBsdXMgTUFUQ0ggdmFsdWVzIHdlIG1hdGNoZWRcbiAqICAgICBnZXRPdXRwdXRzOiBhY2Nlc3NvciBmdW5jdGlvbiB0byBnaXZlIGFsbCByZXNvbHZlZCBvdXRwdXRzIG9mIHRoaXNcbiAqICAgICAgICAgY2FsbGJhY2suIFRha2VzIGBwYXRoc2AgYXMgYXJndW1lbnQgdG8gYXBwbHkgd2hlbiB0aGUgY2FsbGJhY2sgaXNcbiAqICAgICAgICAgZGlzcGF0Y2hlZCwgaW4gY2FzZSBhIHByZXZpb3VzIGNhbGxiYWNrIGhhcyBhbHRlcmVkIHRoZSBsYXlvdXQuXG4gKiAgICAgICAgIFRoZSByZXN1bHQgaXMgYSBsaXN0IG9mIHtpZCAoc3RyaW5nIG9yIG9iamVjdCksIHByb3BlcnR5IChzdHJpbmcpfVxuICogICAgIGdldElucHV0czogc2FtZSBmb3IgaW5wdXRzXG4gKiAgICAgZ2V0U3RhdGU6IHNhbWUgZm9yIHN0YXRlXG4gKiAgICAgY2hhbmdlZFByb3BJZHM6IGFuIG9iamVjdCBvZiB7W2lkQW5kUHJvcF06IHZ9IHRyaWdnZXJpbmcgdGhpcyBjYWxsYmFja1xuICogICAgICAgICB2ID0gRElSRUNUICgyKTogdGhlIHByb3Agd2FzIGNoYW5nZWQgaW4gdGhlIGZyb250IGVuZCwgc28gZGVwZW5kZW50XG4gKiAgICAgICAgICAgICBjYWxsYmFja3MgKk1VU1QqIGJlIGV4ZWN1dGVkLlxuICogICAgICAgICB2ID0gSU5ESVJFQ1QgKDEpOiB0aGUgcHJvcCBpcyBleHBlY3RlZCB0byBiZSBjaGFuZ2VkIGJ5IGEgY2FsbGJhY2ssXG4gKiAgICAgICAgICAgICBidXQgaWYgdGhpcyBpcyBwcmV2ZW50ZWQsIGRlcGVuZGVudCBjYWxsYmFja3MgbWF5IGJlIHBydW5lZC5cbiAqICAgICBpbml0aWFsQ2FsbDogYm9vbGVhbiwgaWYgdHJ1ZSB3ZSBkb24ndCByZXF1aXJlIGFueSBjaGFuZ2VkUHJvcElkc1xuICogICAgICAgICB0byBrZWVwIHRoaXMgY2FsbGJhY2sgYXJvdW5kLCBhcyBpdCdzIHRoZSBpbml0aWFsIGNhbGwgdG8gcG9wdWxhdGVcbiAqICAgICAgICAgdGhpcyB2YWx1ZSBvbiBwYWdlIGxvYWQgb3IgY2hhbmdpbmcgcGFydCBvZiB0aGUgbGF5b3V0LlxuICogICAgICAgICBCeSBkZWZhdWx0IHRoaXMgaXMgdHJ1ZSBmb3IgY2FsbGJhY2tzIGdlbmVyYXRlZCBieVxuICogICAgICAgICBnZXRDYWxsYmFja0J5T3V0cHV0LCBmYWxzZSBmcm9tIGdldENhbGxiYWNrc0J5SW5wdXQuXG4gKiB9XG4gKi9cbmZ1bmN0aW9uIGdldENhbGxiYWNrQnlPdXRwdXQoZ3JhcGhzLCBwYXRocywgaWQsIHByb3ApIHtcbiAgICBsZXQgcmVzb2x2ZTtcbiAgICBsZXQgY2FsbGJhY2s7XG4gICAgbGV0IGFueVZhbHMgPSAnJztcbiAgICBpZiAodHlwZW9mIGlkID09PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBzdGFuZGFyZCBpZCB2ZXJzaW9uXG4gICAgICAgIGNvbnN0IGNhbGxiYWNrcyA9IChncmFwaHMub3V0cHV0TWFwW2lkXSB8fCB7fSlbcHJvcF07XG4gICAgICAgIGlmIChjYWxsYmFja3MpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2tzWzBdO1xuICAgICAgICAgICAgcmVzb2x2ZSA9IHJlc29sdmVEZXBzKCk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyB3aWxkY2FyZCB2ZXJzaW9uXG4gICAgICAgIGNvbnN0IF9rZXlzID0gT2JqZWN0LmtleXMoaWQpLnNvcnQoKTtcbiAgICAgICAgY29uc3QgdmFscyA9IHByb3BzKF9rZXlzLCBpZCk7XG4gICAgICAgIGNvbnN0IGtleVN0ciA9IF9rZXlzLmpvaW4oJywnKTtcbiAgICAgICAgY29uc3QgcGF0dGVybnMgPSAoZ3JhcGhzLm91dHB1dFBhdHRlcm5zW2tleVN0cl0gfHwge30pW3Byb3BdO1xuICAgICAgICBpZiAocGF0dGVybnMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0dGVybnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXR0ZXJuVmFscyA9IHBhdHRlcm5zW2ldLnZhbHVlcztcbiAgICAgICAgICAgICAgICBpZiAocGF0dGVybnNbaV0ucGFydGlhbCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aWFsSWRNYXRjaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuc1tpXS5rZXlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm5WYWxzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9rZXlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHNcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXR0ZXJuUmVmVmFscyA9IHByb3BzKHBhdHRlcm5zW2ldLmtleXMsIGlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gcGF0dGVybnNbaV0uY2FsbGJhY2tzWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSA9IHJlc29sdmVQYXJ0aWFsRGVwcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuc1tpXS5rZXlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm5SZWZWYWxzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm5WYWxzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9rZXlzXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYW55VmFscyA9IGdldEFueVZhbHMocGF0dGVyblZhbHMsIHBhdHRlcm5SZWZWYWxzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpZE1hdGNoKF9rZXlzLCB2YWxzLCBwYXR0ZXJuVmFscykpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBwYXR0ZXJuc1tpXS5jYWxsYmFja3NbMF07XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUgPSByZXNvbHZlRGVwcyhfa2V5cywgdmFscywgcGF0dGVyblZhbHMpO1xuICAgICAgICAgICAgICAgICAgICBhbnlWYWxzID0gZ2V0QW55VmFscyhwYXR0ZXJuVmFscywgdmFscyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBJZiBub3QgZm91bmQsIGFsc28gY2hlY2sgcGFydGlhbCBwYXR0ZXJucyB3aXRoIGZld2VyIGtleXNcbiAgICAgICAgaWYgKCFyZXNvbHZlICYmIGdyYXBocy5oYXNQYXJ0aWFsT3V0cHV0UGF0dGVybnMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcGF0S2V5U3RyIGluIGdyYXBocy5wYXJ0aWFsT3V0cHV0UGF0dGVybnMpIHtcbiAgICAgICAgICAgICAgICBpZiAocGF0S2V5U3RyID09PSBrZXlTdHIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHBhdEtleXMgPSBwYXRLZXlTdHIuc3BsaXQoJywnKTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhdEtleXMuZXZlcnkoayA9PiBfa2V5cy5pbmRleE9mKGspICE9PSAtMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHBhdFByb3BQYXR0ZXJucyA9XG4gICAgICAgICAgICAgICAgICAgIGdyYXBocy5wYXJ0aWFsT3V0cHV0UGF0dGVybnNbcGF0S2V5U3RyXVtwcm9wXTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhdFByb3BQYXR0ZXJucykge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRQcm9wUGF0dGVybnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGF0dGVyblZhbHMgPSBwYXRQcm9wUGF0dGVybnNbaV0udmFsdWVzO1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aWFsSWRNYXRjaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRQcm9wUGF0dGVybnNbaV0ua2V5cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuVmFscyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfa2V5cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxzXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGF0dGVyblJlZlZhbHMgPSBwcm9wcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRQcm9wUGF0dGVybnNbaV0ua2V5cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gcGF0UHJvcFBhdHRlcm5zW2ldLmNhbGxiYWNrc1swXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUgPSByZXNvbHZlUGFydGlhbERlcHMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0UHJvcFBhdHRlcm5zW2ldLmtleXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVyblJlZlZhbHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVyblZhbHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2tleXNcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbnlWYWxzID0gZ2V0QW55VmFscyhwYXR0ZXJuVmFscywgcGF0dGVyblJlZlZhbHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJlc29sdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlmICghcmVzb2x2ZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1ha2VSZXNvbHZlZENhbGxiYWNrKGNhbGxiYWNrLCByZXNvbHZlLCBhbnlWYWxzKTtcbn1cblxuZnVuY3Rpb24gYWRkUmVzb2x2ZWRGcm9tT3V0cHV0cyhjYWxsYmFjaywgb3V0UGF0dGVybiwgb3V0cywgbWF0Y2hlcykge1xuICAgIGNvbnN0IG91dDBLZXlzID0gT2JqZWN0LmtleXMob3V0UGF0dGVybi5pZCkuc29ydCgpO1xuICAgIGNvbnN0IG91dDBQYXR0ZXJuVmFscyA9IHByb3BzKG91dDBLZXlzLCBvdXRQYXR0ZXJuLmlkKTtcbiAgICBjb25zdCBmb3VuZENiSWRzID0ge307XG4gICAgb3V0cy5mb3JFYWNoKCh7aWQ6IG91dElkfSkgPT4ge1xuICAgICAgICBjb25zdCBvdXRWYWxzID0gcHJvcHMob3V0MEtleXMsIG91dElkKTtcbiAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSBtYWtlUmVzb2x2ZWRDYWxsYmFjayhcbiAgICAgICAgICAgIGNhbGxiYWNrLFxuICAgICAgICAgICAgcmVzb2x2ZURlcHMob3V0MEtleXMsIG91dFZhbHMsIG91dDBQYXR0ZXJuVmFscyksXG4gICAgICAgICAgICBnZXRBbnlWYWxzKG91dDBQYXR0ZXJuVmFscywgb3V0VmFscylcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qge3Jlc29sdmVkSWR9ID0gcmVzb2x2ZWQ7XG4gICAgICAgIGlmICghZm91bmRDYklkc1tyZXNvbHZlZElkXSkge1xuICAgICAgICAgICAgbWF0Y2hlcy5wdXNoKHJlc29sdmVkKTtcbiAgICAgICAgICAgIGZvdW5kQ2JJZHNbcmVzb2x2ZWRJZF0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRBbGxSZXNvbHZlZEZyb21PdXRwdXRzKFxuICAgIHJlc29sdmUsXG4gICAgcGF0aHMsXG4gICAgbWF0Y2hlcyxcbiAgICB0cmlnZ2VyQW55VmFscyA9ICcnXG4pIHtcbiAgICByZXR1cm4gY2FsbGJhY2sgPT4ge1xuICAgICAgICBjb25zdCB7bWF0Y2hLZXlzLCBmaXJzdFNpbmdsZU91dHB1dCwgb3V0cHV0c30gPSBjYWxsYmFjaztcbiAgICAgICAgaWYgKG1hdGNoS2V5cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IHNpbmdsZU91dFBhdHRlcm4gPSBvdXRwdXRzW2ZpcnN0U2luZ2xlT3V0cHV0XTtcbiAgICAgICAgICAgIGlmIChzaW5nbGVPdXRQYXR0ZXJuKSB7XG4gICAgICAgICAgICAgICAgYWRkUmVzb2x2ZWRGcm9tT3V0cHV0cyhcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgICAgICAgICAgICAgIHNpbmdsZU91dFBhdHRlcm4sXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocGF0aHMpKHNpbmdsZU91dFBhdHRlcm4pLFxuICAgICAgICAgICAgICAgICAgICBtYXRjaGVzXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICAgKiBJZiBldmVyeSBvdXRwdXQgaGFzIEFMTCB3ZSBuZWVkIHRvIHJlZHVjZSByZXNvbHZlZCBzZXRcbiAgICAgICAgICAgICAgICAgKiB0byBvbmUgaXRlbSBwZXIgY29tYmluYXRpb24gb2YgTUFUQ0ggdmFsdWVzLlxuICAgICAgICAgICAgICAgICAqIFRoYXQgd2lsbCBnaXZlIG9uZSByZXN1bHQgcGVyIGNhbGxiYWNrIGludm9jYXRpb24uXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgY29uc3QgYW55U2VlbiA9IHt9O1xuICAgICAgICAgICAgICAgIG91dHB1dHMuZm9yRWFjaChvdXRQYXR0ZXJuID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3V0U2V0ID0gcmVzb2x2ZShwYXRocykob3V0UGF0dGVybikuZmlsdGVyKGkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF0Y2hTdHIgPSBKU09OLnN0cmluZ2lmeShwcm9wcyhtYXRjaEtleXMsIGkuaWQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYW55U2VlblttYXRjaFN0cl0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnlTZWVuW21hdGNoU3RyXSA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBhZGRSZXNvbHZlZEZyb21PdXRwdXRzKFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRQYXR0ZXJuLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3V0U2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlc1xuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gT3V0cHV0cyBoYXZlIG5vIE1BVENIIGtleXMgKGZpeGVkLWlkIG91dHB1dHMgb3Igbm8gb3V0cHV0KS5cbiAgICAgICAgICAgIC8vIEZhbGwgYmFjayB0byB0aGUgdHJpZ2dlcmluZyBpbnB1dCdzIE1BVENIIHZhbHVlcyBzbyB0aGF0XG4gICAgICAgICAgICAvLyBzZXBhcmF0ZSBNQVRDSCB0cmlnZ2VycyBwcm9kdWNlIGRpc3RpbmN0IHJlc29sdmVkSWRzIGFuZFxuICAgICAgICAgICAgLy8gYXJlbid0IGRlZHVwbGljYXRlZCBpbnRvIGEgc2luZ2xlIGZpcmluZy4gU2VlIGlzc3VlICMyNDYyLlxuICAgICAgICAgICAgY29uc3QgY2IgPSBtYWtlUmVzb2x2ZWRDYWxsYmFjayhjYWxsYmFjaywgcmVzb2x2ZSwgdHJpZ2dlckFueVZhbHMpO1xuICAgICAgICAgICAgbWF0Y2hlcy5wdXNoKGNiKTtcbiAgICAgICAgfVxuICAgIH07XG59XG5cbi8qXG4gKiBGb3IgYSBnaXZlbiBpZCBhbmQgcHJvcCBmaW5kIGFsbCBjYWxsYmFja3MgaXQncyBhbiBpbnB1dCBvZi5cbiAqXG4gKiBSZXR1cm5zIGFuIGFycmF5IG9mIG9iamVjdHM6XG4gKiAgIHtjYWxsYmFjaywgcmVzb2x2ZWRJZCwgZ2V0T3V0cHV0cywgZ2V0SW5wdXRzLCBnZXRTdGF0ZX1cbiAqICAgU2VlIGdldENhbGxiYWNrQnlPdXRwdXQgZm9yIGRldGFpbHMuXG4gKlxuICogTm90ZSB0aGF0IGlmIHRoZSBvcmlnaW5hbCBpbnB1dCBjb250YWlucyBhbiBBTExTTUFMTEVSIHdpbGRjYXJkLFxuICogdGhlcmUgbWF5IGJlIG1hbnkgZW50cmllcyBmb3IgdGhlIHNhbWUgY2FsbGJhY2ssIGJ1dCBhbnkgZ2l2ZW4gb3V0cHV0XG4gKiAod2l0aCBhbiBNQVRDSCBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbnB1dCdzIEFMTFNNQUxMRVIpIHdpbGwgb25seSBhcHBlYXJcbiAqIGluIG9uZSBlbnRyeS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdhdGNoZWRLZXlzKGlkLCBuZXdQcm9wcywgZ3JhcGhzKSB7XG4gICAgaWYgKCEoaWQgJiYgZ3JhcGhzICYmIG5ld1Byb3BzLmxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnN0IGlucHV0cyA9IGdyYXBocy5pbnB1dE1hcFtpZF07XG4gICAgICAgIHJldHVybiBpbnB1dHMgPyBuZXdQcm9wcy5maWx0ZXIobmV3UHJvcCA9PiBpbnB1dHNbbmV3UHJvcF0pIDogW107XG4gICAgfVxuXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGlkKS5zb3J0KCk7XG4gICAgY29uc3QgdmFscyA9IHByb3BzKGtleXMsIGlkKTtcbiAgICBjb25zdCBrZXlTdHIgPSBrZXlzLmpvaW4oJywnKTtcbiAgICBjb25zdCBrZXlQYXR0ZXJucyA9IGdyYXBocy5pbnB1dFBhdHRlcm5zW2tleVN0cl07XG5cbiAgICBpZiAoIWtleVBhdHRlcm5zICYmICFncmFwaHMuaGFzUGFydGlhbElucHV0UGF0dGVybnMpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHJldHVybiBuZXdQcm9wcy5maWx0ZXIocHJvcCA9PiB7XG4gICAgICAgIC8vIENoZWNrIGV4YWN0IGtleVN0ciBwYXR0ZXJuc1xuICAgICAgICBpZiAoa2V5UGF0dGVybnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhdHRlcm5zID0ga2V5UGF0dGVybnNbcHJvcF07XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgcGF0dGVybnMgJiZcbiAgICAgICAgICAgICAgICBwYXR0ZXJucy5zb21lKHBhdHRlcm4gPT4gaWRNYXRjaChrZXlzLCB2YWxzLCBwYXR0ZXJuLnZhbHVlcykpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBDaGVjayBwYXJ0aWFsIHBhdHRlcm5zIHdob3NlIGtleXMgYXJlIGEgc3Vic2V0IG9mIHRoaXMgY29tcG9uZW50J3Mga2V5c1xuICAgICAgICBpZiAoIWdyYXBocy5oYXNQYXJ0aWFsSW5wdXRQYXR0ZXJucykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgcGF0S2V5U3RyIGluIGdyYXBocy5wYXJ0aWFsSW5wdXRQYXR0ZXJucykge1xuICAgICAgICAgICAgaWYgKHBhdEtleVN0ciA9PT0ga2V5U3RyKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBwYXRLZXlzID0gcGF0S2V5U3RyLnNwbGl0KCcsJyk7XG4gICAgICAgICAgICBpZiAoIXBhdEtleXMuZXZlcnkoayA9PiBrZXlzLmluZGV4T2YoaykgIT09IC0xKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcGF0UHJvcFBhdHRlcm5zID1cbiAgICAgICAgICAgICAgICBncmFwaHMucGFydGlhbElucHV0UGF0dGVybnNbcGF0S2V5U3RyXVtwcm9wXTtcbiAgICAgICAgICAgIGlmICghcGF0UHJvcFBhdHRlcm5zKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgcGF0UHJvcFBhdHRlcm5zLnNvbWUocGF0dGVybiA9PlxuICAgICAgICAgICAgICAgICAgICBwYXJ0aWFsSWRNYXRjaChwYXRLZXlzLCBwYXR0ZXJuLnZhbHVlcywga2V5cywgdmFscylcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG59XG5cbi8qXG4gKiBSZXR1cm4gYSBsaXN0IG9mIGFsbCBjYWxsYmFja3MgcmVmZXJlbmNpbmcgYSBjaHVuayBvZiB0aGUgbGF5b3V0LFxuICogZWl0aGVyIGFzIGlucHV0cyBvciBvdXRwdXRzLlxuICpcbiAqIG9wdHMub3V0cHV0c09ubHk6IGJvb2xlYW4sIHNldCB0cnVlIHdoZW4gY3Jhd2xpbmcgdGhlICp3aG9sZSogbGF5b3V0LFxuICogICBiZWNhdXNlIG91dHB1dHMgYXJlIGVub3VnaCB0byBnZXQgZXZlcnl0aGluZy5cbiAqIG9wdHMucmVtb3ZlZEFycmF5SW5wdXRzT25seTogYm9vbGVhbiwgc2V0IHRydWUgdG8gb25seSBsb29rIGZvciBpbnB1dHMgaW5cbiAqICAgd2lsZGNhcmQgYXJyYXlzIChBTEwgb3IgQUxMU01BTExFUiksIG5vIG91dHB1dHMuIFRoaXMgZ2V0cyB1c2VkIHRvIHRlbGxcbiAqICAgd2hlbiB0aGUgbmV3ICphYnNlbmNlKiBvZiBhIGdpdmVuIGNvbXBvbmVudCBzaG91bGQgdHJpZ2dlciBhIGNhbGxiYWNrLlxuICogb3B0cy5uZXdQYXRoczogcGF0aHMgb2JqZWN0IGFmdGVyIHRoZSBlZGl0IC0gdG8gYmUgdXNlZCB3aXRoXG4gKiAgIHJlbW92ZWRBcnJheUlucHV0c09ubHkgdG8gZGV0ZXJtaW5lIGlmIHRoZSBjYWxsYmFjayBzdGlsbCBoYXMgaXRzIG91dHB1dHNcbiAqIG9wdHMuY2h1bmtQYXRoOiBwYXRoIHRvIHRoZSBuZXcgY2h1bmsgLSB1c2VkIHRvIGRldGVybWluZSBpZiBhbnkgb3V0cHV0cyBhcmVcbiAqICAgb3V0c2lkZSBvZiB0aGlzIGNodW5rLCBiZWNhdXNlIHRoaXMgZGV0ZXJtaW5lcyB3aGV0aGVyIGlucHV0cyBpbnNpZGUgdGhlXG4gKiAgIGNodW5rIGNvdW50IGFzIGhhdmluZyBjaGFuZ2VkXG4gKiBvcHRzLnBhdGNoQW5hbHlzaXM6IHdoYXQgdGhlIGBQYXRjaCgpYCBvcGVyYXRpb25zIHRoYXQgcHJvZHVjZWQgdGhpcyBjaHVua1xuICogICBjaGFuZ2VkLiBPbmx5IHRoZSBjb21wb25lbnRzIHRoZSBwYXRjaCBjcmVhdGVkIGdldCB0aGVpciBpbml0aWFsIGNhbGxcbiAqICAgSXQgYWxzbyBhbGxvd3MgYW4gaW5wdXQgdGhlIHBhdGNoIHdyb3RlIGRpcmVjdGx5IHRvIGJ5cGFzcyB0aGUgY2h1bmtQYXRoXG4gKiAgIGRlZHVwLCB3aGVuIHRoYXQgaW5wdXQncyBvd24gY29tcG9uZW50IHdhcyBjYXJyaWVkIG92ZXIgKHNvXG4gKiAgIGl0cyBvd24gaW5pdGlhbCBjYWxsIHN0YXlzIHN1cHByZXNzZWQpIGJ1dCBkb3duc3RyZWFtIGNhbGxiYWNrcyBzdGlsbFxuICogICBuZWVkIHRvIHNlZSB0aGUgbmV3IHZhbHVlXG4gKiAgIEFic2VudCB3aGVuIHRoZSBjaHVuayBpcyBub3QgdGhlIHJlc3VsdCBvZiBhIHBhdGNoXG4gKlxuICogUmV0dXJucyBhbiBhcnJheSBvZiBvYmplY3RzOlxuICogICB7Y2FsbGJhY2ssIHJlc29sdmVkSWQsIGdldE91dHB1dHMsIGdldElucHV0cywgZ2V0U3RhdGUsIC4uLmV0Y31cbiAqICAgU2VlIGdldENhbGxiYWNrQnlPdXRwdXQgZm9yIGRldGFpbHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRVbmZpbHRlcmVkTGF5b3V0Q2FsbGJhY2tzKGdyYXBocywgcGF0aHMsIGxheW91dENodW5rLCBvcHRzKSB7XG4gICAgY29uc3Qge1xuICAgICAgICBvdXRwdXRzT25seSxcbiAgICAgICAgcmVtb3ZlZEFycmF5SW5wdXRzT25seSxcbiAgICAgICAgbmV3UGF0aHMsXG4gICAgICAgIGNodW5rUGF0aCxcbiAgICAgICAgcGF0Y2hBbmFseXNpc1xuICAgIH0gPSBvcHRzO1xuICAgIGNvbnN0IGZvdW5kQ2JJZHMgPSB7fTtcbiAgICBjb25zdCBjYWxsYmFja3MgPSBbXTtcblxuICAgIGZ1bmN0aW9uIGFkZENhbGxiYWNrKGNhbGxiYWNrKSB7XG4gICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgICAgY29uc3QgZm91bmRJbmRleCA9IGZvdW5kQ2JJZHNbY2FsbGJhY2sucmVzb2x2ZWRJZF07XG4gICAgICAgICAgICBpZiAoZm91bmRJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZm91bmRDYiA9IGNhbGxiYWNrc1tmb3VuZEluZGV4XTtcbiAgICAgICAgICAgICAgICBmb3VuZENiLmNoYW5nZWRQcm9wSWRzID0gbWVyZ2VNYXgoXG4gICAgICAgICAgICAgICAgICAgIGZvdW5kQ2IuY2hhbmdlZFByb3BJZHMsXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNoYW5nZWRQcm9wSWRzXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2suaW5pdGlhbENhbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgZm91bmRDYi5pbml0aWFsQ2FsbCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3VuZENiSWRzW2NhbGxiYWNrLnJlc29sdmVkSWRdID0gY2FsbGJhY2tzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBjYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZGRDYWxsYmFja0lmQXJyYXkoaWRTdHIpIHtcbiAgICAgICAgcmV0dXJuIGNiID0+XG4gICAgICAgICAgICBjYi5nZXRJbnB1dHMocGF0aHMpLnNvbWUoaW5pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoaW5pKSAmJlxuICAgICAgICAgICAgICAgICAgICBpbmkuc29tZShpbmlqID0+IHN0cmluZ2lmeUlkKGluaWouaWQpID09PSBpZFN0cilcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBjYWxsYmFjayBzaG91bGQgdHJpZ2dlciBldmVuIHdpdGggbm8gY2hhbmdlZFByb3BzLFxuICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGUgcHJvcHMgdGhhdCBjaGFuZ2VkIG5vIGxvbmdlciBleGlzdC5cbiAgICAgICAgICAgICAgICAgICAgLy8gV2UncmUga2luZCBvZiBhYnVzaW5nIHRoZSBgaW5pdGlhbENhbGxgIGZsYWcgaGVyZSwgaXQnc1xuICAgICAgICAgICAgICAgICAgICAvLyBtb3JlIGxpa2UgYSBcImZpbmFsIGNhbGxcIiBmb3IgdGhlIHJlbW92ZWQgaW5wdXRzLCBidXRcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBjYXNlIGlzIG5vdCBzdWJqZWN0IHRvIGBwcmV2ZW50X2luaXRpYWxfY2FsbGAuXG4gICAgICAgICAgICAgICAgICAgIGlmIChmbGF0dGVuKGNiLmdldE91dHB1dHMobmV3UGF0aHMpKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNiLmluaXRpYWxDYWxsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNiLmNoYW5nZWRQcm9wSWRzID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRDYWxsYmFjayhjYik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGhhbmRsZU9uZUlkKGlkLCBvdXRJZENhbGxiYWNrcywgaW5JZENhbGxiYWNrcykge1xuICAgICAgICBpZiAob3V0SWRDYWxsYmFja3MpIHtcbiAgICAgICAgICAgIC8vIFN1cHByZXNzIHRoZSBpbml0aWFsIGNhbGwgZm9yIGNvbXBvbmVudHMgYSBQYXRjaCBjYXJyaWVkIG92ZXJcbiAgICAgICAgICAgIC8vIFRoZSBwYXRjaCBpdHNlbGYgdGVsbHMgdXMgd2hpY2ggY29tcG9uZW50cyBpdCBjcmVhdGVkLCBpbmNsdWRpbmdcbiAgICAgICAgICAgIC8vIGNvbXBvbmVudHMgcmVidWlsdCB3aXRoIGFuIGlkIHRoYXQgd2FzIGFscmVhZHkgaW4gdXNlLFxuICAgICAgICAgICAgLy8gd2hvc2UgaW5pdGlhbCBjYWxsYmFja3MgbXVzdCBydW4gYWdhaW4gZXZlbiBpZiB0aGVpciBuZXcgZGVmYXVsdHNcbiAgICAgICAgICAgIC8vIGhhcHBlbiB0byBtYXRjaCB0aGUgdmFsdWVzIG9mIHRoZSBpbnN0YW5jZSB0aGV5IHJlcGxhY2VkLlxuICAgICAgICAgICAgLy8gSXQgZXhjbHVkZXMgdGhlIGNvbnRhaW5lcnMgYmV0d2VlbiB0aGUgcGF0Y2hlZCBwcm9wIGFuZCB0aGUgdmFsdWVcbiAgICAgICAgICAgIC8vIHRoYXQgY2hhbmdlZDogcmFtZGEncyBhc3NvY1BhdGggaGFzIHRvIHJlYnVpbGQgdGhvc2UsIGJ1dCB0aGVcbiAgICAgICAgICAgIC8vIHBhdGNoIGRpZCBub3QgY3JlYXRlIHRoZW0sIHNvIHRoZXkga2VlcCB0aGVpciBpbml0aWFsIGNhbGxcbiAgICAgICAgICAgIC8vIHN1cHByZXNzZWRcbiAgICAgICAgICAgIGNvbnN0IGlzQ2FycnlPdmVyID0gcGF0Y2hBbmFseXNpc1xuICAgICAgICAgICAgICAgID8gaXNDYXJyaWVkT3ZlckJ5UGF0Y2gocGF0Y2hBbmFseXNpcywgc3RyaW5naWZ5SWQoaWQpKVxuICAgICAgICAgICAgICAgIDogZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIG91dElkQ2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2IgPSBnZXRDYWxsYmFja0J5T3V0cHV0KGdyYXBocywgcGF0aHMsIGlkLCBwcm9wZXJ0eSk7XG4gICAgICAgICAgICAgICAgaWYgKGNiKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrcyBmb3VuZCBpbiB0aGUgbGF5b3V0IGJ5IG91dHB1dCBzaG91bGQgYWx3YXlzIHJ1blxuICAgICAgICAgICAgICAgICAgICAvLyB1bmxlc3Mgc3BlY2lmaWNhbGx5IHJlcXVlc3RlZCBub3QgdG8uXG4gICAgICAgICAgICAgICAgICAgIC8vIGllIHRoaXMgaXMgdGhlIGluaXRpYWwgY2FsbCBvZiB0aGlzIGNhbGxiYWNrIGV2ZW4gaWYgaXQnc1xuICAgICAgICAgICAgICAgICAgICAvLyBub3QgdGhlIHBhZ2UgaW5pdGlhbGl6YXRpb24gYnV0IGp1c3QgYSBuZXcgbGF5b3V0IGNodW5rXG4gICAgICAgICAgICAgICAgICAgIGlmICghY2IuY2FsbGJhY2sucHJldmVudF9pbml0aWFsX2NhbGwgJiYgIWlzQ2FycnlPdmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYi5pbml0aWFsQ2FsbCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRDYWxsYmFjayhjYik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFvdXRwdXRzT25seSAmJiBpbklkQ2FsbGJhY2tzKSB7XG4gICAgICAgICAgICBjb25zdCBpZFN0ciA9IHN0cmluZ2lmeUlkKGlkKTtcbiAgICAgICAgICAgIGNvbnN0IG1heWJlQWRkQ2FsbGJhY2sgPSByZW1vdmVkQXJyYXlJbnB1dHNPbmx5XG4gICAgICAgICAgICAgICAgPyBhZGRDYWxsYmFja0lmQXJyYXkoaWRTdHIpXG4gICAgICAgICAgICAgICAgOiBhZGRDYWxsYmFjaztcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gaW5JZENhbGxiYWNrcykge1xuICAgICAgICAgICAgICAgIC8vIEEgY2FsbGJhY2ssIHdob3NlIG91dHB1dHMgYXJlIGFsbCBpbnNpZGUgdGhlIGNodW5rLCBpc1xuICAgICAgICAgICAgICAgIC8vIG5vcm1hbGx5IGRyb3BwZWQgaGVyZSBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZVxuICAgICAgICAgICAgICAgIC8vIG91dHB1dCBoYW5kbGluZyBhYm92ZSBhbHJlYWR5IGNvdmVycyBpdFxuICAgICAgICAgICAgICAgIC8vIFRoYXQgYXNzdW1wdGlvbiBmYWlscyB3aGVuIHRoZSBwYXRjaFxuICAgICAgICAgICAgICAgIC8vIHdyb3RlIGEgbmV3IHZhbHVlIGRpcmVjdGx5IG9uIHRoaXMgaW5wdXQgd2l0aG91dFxuICAgICAgICAgICAgICAgIC8vIHJlY3JlYXRpbmcgdGhlIGlucHV0J3Mgb3duIGNvbXBvbmVudFxuICAgICAgICAgICAgICAgIC8vIFRoZSBvdXRwdXQgc2lkZSBzdGF5cyBzdXBwcmVzc2VkIGJlY2F1c2UgdGhlIG91dHB1dFxuICAgICAgICAgICAgICAgIC8vIGNvbXBvbmVudCB3YXMgY2FycmllZCBvdmVyLCBidXQgdGhpcyBpbnB1dCdzIHZhbHVlXG4gICAgICAgICAgICAgICAgLy8gZ2VudWluZWx5IGNoYW5nZWQsIHNvIHRoZSBjYWxsYmFjayBtdXN0IHN0aWxsIGJlIGFkZGVkXG4gICAgICAgICAgICAgICAgbGV0IGhhbmRsZVRoaXNDYWxsYmFjayA9IG1heWJlQWRkQ2FsbGJhY2s7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBjaHVua1BhdGggJiZcbiAgICAgICAgICAgICAgICAgICAgIXdhc1dyaXR0ZW5CeVBhdGNoKHBhdGNoQW5hbHlzaXMsIGlkU3RyLCBwcm9wZXJ0eSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlVGhpc0NhbGxiYWNrID0gY2IgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFhbGwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0c1dpdGgoY2h1bmtQYXRoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Y2soJ3BhdGgnLCBmbGF0dGVuKGNiLmdldE91dHB1dHMocGF0aHMpKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXliZUFkZENhbGxiYWNrKGNiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZ2V0Q2FsbGJhY2tzQnlJbnB1dChcbiAgICAgICAgICAgICAgICAgICAgZ3JhcGhzLFxuICAgICAgICAgICAgICAgICAgICBwYXRocyxcbiAgICAgICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LFxuICAgICAgICAgICAgICAgICAgICBJTkRJUkVDVFxuICAgICAgICAgICAgICAgICkuZm9yRWFjaChoYW5kbGVUaGlzQ2FsbGJhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgY3Jhd2xMYXlvdXQobGF5b3V0Q2h1bmssIGNoaWxkID0+IHtcbiAgICAgICAgY29uc3QgaWQgPSBjaGlsZC5wcm9wcyAmJiBjaGlsZC5wcm9wcy5pZDtcbiAgICAgICAgaWYgKGlkKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGlkID09PSAnc3RyaW5nJyAmJiAhcmVtb3ZlZEFycmF5SW5wdXRzT25seSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZU9uZUlkKGlkLCBncmFwaHMub3V0cHV0TWFwW2lkXSwgZ3JhcGhzLmlucHV0TWFwW2lkXSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IF9rZXlzID0gT2JqZWN0LmtleXMoaWQpLnNvcnQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXlTdHIgPSBfa2V5cy5qb2luKCcsJyk7XG4gICAgICAgICAgICAgICAgaGFuZGxlT25lSWQoXG4gICAgICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgICAgICAhcmVtb3ZlZEFycmF5SW5wdXRzT25seSAmJiBncmFwaHMub3V0cHV0UGF0dGVybnNba2V5U3RyXSxcbiAgICAgICAgICAgICAgICAgICAgZ3JhcGhzLmlucHV0UGF0dGVybnNba2V5U3RyXVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgLy8gQWxzbyBjaGVjayBwYXJ0aWFsIHBhdHRlcm5zIHdob3NlIGtleXMgYXJlIGEgc3Vic2V0IG9mXG4gICAgICAgICAgICAgICAgLy8gdGhpcyBjb21wb25lbnQncyBrZXlzXG4gICAgICAgICAgICAgICAgaWYgKGdyYXBocy5oYXNQYXJ0aWFsSW5wdXRQYXR0ZXJucykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHBhdEtleVN0ciBpbiBncmFwaHMucGFydGlhbElucHV0UGF0dGVybnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXRLZXlTdHIgPT09IGtleVN0cikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGF0S2V5cyA9IHBhdEtleVN0ci5zcGxpdCgnLCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXRLZXlzLmV2ZXJ5KGsgPT4gX2tleXMuaW5kZXhPZihrKSAhPT0gLTEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVPbmVJZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYXBocy5wYXJ0aWFsSW5wdXRQYXR0ZXJuc1twYXRLZXlTdHJdXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSAvLyBlbmQgaGFzUGFydGlhbElucHV0UGF0dGVybnMgZ3VhcmRcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICFyZW1vdmVkQXJyYXlJbnB1dHNPbmx5ICYmXG4gICAgICAgICAgICAgICAgICAgIGdyYXBocy5oYXNQYXJ0aWFsT3V0cHV0UGF0dGVybnNcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBwYXRLZXlTdHIgaW4gZ3JhcGhzLnBhcnRpYWxPdXRwdXRQYXR0ZXJucykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdEtleVN0ciA9PT0ga2V5U3RyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXRLZXlzID0gcGF0S2V5U3RyLnNwbGl0KCcsJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhdEtleXMuZXZlcnkoayA9PiBfa2V5cy5pbmRleE9mKGspICE9PSAtMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZU9uZUlkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYXBocy5wYXJ0aWFsT3V0cHV0UGF0dGVybnNbcGF0S2V5U3RyXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbWFwKFxuICAgICAgICBjYiA9PiAoe1xuICAgICAgICAgICAgLi4uY2IsXG4gICAgICAgICAgICBwcmlvcml0eTogZ2V0UHJpb3JpdHkoZ3JhcGhzLCBwYXRocywgY2IpXG4gICAgICAgIH0pLFxuICAgICAgICBjYWxsYmFja3NcbiAgICApO1xufVxuIiwiaW1wb3J0IHtvbmNlLCBwYXRofSBmcm9tICdyYW1kYSc7XG5pbXBvcnQge2NyZWF0ZUFjdGlvbn0gZnJvbSAncmVkdXgtYWN0aW9ucyc7XG5pbXBvcnQge2FkZFJlcXVlc3RlZENhbGxiYWNrc30gZnJvbSAnLi9jYWxsYmFja3MnO1xuaW1wb3J0IHtnZXRBcHBTdGF0ZX0gZnJvbSAnLi4vcmVkdWNlcnMvY29uc3RhbnRzJztcbmltcG9ydCB7Z2V0QWN0aW9ufSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQge3BhcnNlQ29va2llfSBmcm9tICdjb29raWUnO1xuaW1wb3J0IHt2YWxpZGF0ZUNhbGxiYWNrc1RvTGF5b3V0fSBmcm9tICcuL2RlcGVuZGVuY2llcyc7XG5pbXBvcnQge1xuICAgIGluY2x1ZGVPYnNlcnZlcnMsXG4gICAgZ2V0TGF5b3V0Q2FsbGJhY2tzLFxuICAgIG1ha2VSZXNvbHZlZENhbGxiYWNrLFxuICAgIHJlc29sdmVEZXBzXG59IGZyb20gJy4vZGVwZW5kZW5jaWVzX3RzJztcbmltcG9ydCB7Y29tcHV0ZVBhdGhzLCBnZXRQYXRofSBmcm9tICcuL3BhdGhzJztcbmltcG9ydCB7cmVjb3JkVWlFZGl0fSBmcm9tICcuLi9wZXJzaXN0ZW5jZSc7XG5cbmV4cG9ydCBjb25zdCBvbkVycm9yID0gY3JlYXRlQWN0aW9uKGdldEFjdGlvbignT05fRVJST1InKSk7XG5leHBvcnQgY29uc3Qgc2V0QXBwTGlmZWN5Y2xlID0gY3JlYXRlQWN0aW9uKGdldEFjdGlvbignU0VUX0FQUF9MSUZFQ1lDTEUnKSk7XG5leHBvcnQgY29uc3Qgc2V0Q29uZmlnID0gY3JlYXRlQWN0aW9uKGdldEFjdGlvbignU0VUX0NPTkZJRycpKTtcbmV4cG9ydCBjb25zdCBhZGRIdHRwSGVhZGVycyA9IGNyZWF0ZUFjdGlvbihnZXRBY3Rpb24oJ0FERF9IVFRQX0hFQURFUlMnKSk7XG5leHBvcnQgY29uc3Qgc2V0R3JhcGhzID0gY3JlYXRlQWN0aW9uKGdldEFjdGlvbignU0VUX0dSQVBIUycpKTtcbmV4cG9ydCBjb25zdCBzZXRIb29rcyA9IGNyZWF0ZUFjdGlvbihnZXRBY3Rpb24oJ1NFVF9IT09LUycpKTtcbmV4cG9ydCBjb25zdCBzZXRMYXlvdXQgPSBjcmVhdGVBY3Rpb24oZ2V0QWN0aW9uKCdTRVRfTEFZT1VUJykpO1xuZXhwb3J0IGNvbnN0IHNldFBhdGhzID0gY3JlYXRlQWN0aW9uKGdldEFjdGlvbignU0VUX1BBVEhTJykpO1xuZXhwb3J0IGNvbnN0IHNldFJlcXVlc3RRdWV1ZSA9IGNyZWF0ZUFjdGlvbihnZXRBY3Rpb24oJ1NFVF9SRVFVRVNUX1FVRVVFJykpO1xuZXhwb3J0IGNvbnN0IGluc2VydENvbXBvbmVudCA9IGNyZWF0ZUFjdGlvbihnZXRBY3Rpb24oJ0lOU0VSVF9DT01QT05FTlQnKSk7XG5leHBvcnQgY29uc3QgcmVtb3ZlQ29tcG9uZW50ID0gY3JlYXRlQWN0aW9uKGdldEFjdGlvbignUkVNT1ZFX0NPTVBPTkVOVCcpKTtcblxuZXhwb3J0IGNvbnN0IG9uUHJvcENoYW5nZSA9IGNyZWF0ZUFjdGlvbihnZXRBY3Rpb24oJ09OX1BST1BfQ0hBTkdFJykpO1xuZXhwb3J0IGNvbnN0IHJlc2V0Q29tcG9uZW50U3RhdGUgPSBjcmVhdGVBY3Rpb24oXG4gICAgZ2V0QWN0aW9uKCdSRVNFVF9DT01QT05FTlRfU1RBVEUnKVxuKTtcblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVByb3BzKHBheWxvYWQpIHtcbiAgICByZXR1cm4gKGRpc3BhdGNoLCBnZXRTdGF0ZSkgPT4ge1xuICAgICAgICBjb25zdCBjb21wb25lbnQgPSBwYXRoKHBheWxvYWQuaXRlbXBhdGgsIGdldFN0YXRlKCkubGF5b3V0KTtcbiAgICAgICAgLy8gVGhlIGNvbXBvbmVudCBtYXkgbm8gbG9uZ2VyIGV4aXN0IGF0IHRoaXMgcGF0aCAtIGVnLiBhblxuICAgICAgICAvLyBgRXh0ZXJuYWxXcmFwcGVyYCAoY29tcG9uZW50cyBhcyBwcm9wcykgd2hvc2UgaG9zdCBzdWJ0cmVlIHdhc1xuICAgICAgICAvLyByZXBsYWNlZCBieSBhIGNhbGxiYWNrLiBVcGRhdGluZyBwcm9wcyBvZiBhIGNvbXBvbmVudCB0aGF0IGlzbid0XG4gICAgICAgIC8vIGluIHRoZSBsYXlvdXQgaXMgYSBuby1vcCBhbmQgd291bGQgY3Jhc2ggYHJlY29yZFVpRWRpdGAuXG4gICAgICAgIGlmICghY29tcG9uZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVjb3JkVWlFZGl0KGNvbXBvbmVudCwgcGF5bG9hZC5wcm9wcywgZGlzcGF0Y2gpO1xuICAgICAgICBkaXNwYXRjaChvblByb3BDaGFuZ2UocGF5bG9hZCkpO1xuICAgIH07XG59XG5cbmV4cG9ydCBjb25zdCBhZGRDb21wb25lbnRUb0xheW91dCA9IHBheWxvYWQgPT4gKGRpc3BhdGNoLCBnZXRTdGF0ZSkgPT4ge1xuICAgIGNvbnN0IHtwYXRoc30gPSBnZXRTdGF0ZSgpO1xuICAgIGRpc3BhdGNoKGluc2VydENvbXBvbmVudChwYXlsb2FkKSk7XG4gICAgZGlzcGF0Y2goXG4gICAgICAgIHNldFBhdGhzKGNvbXB1dGVQYXRocyhwYXlsb2FkLmNvbXBvbmVudCwgcGF5bG9hZC5jb21wb25lbnRQYXRoLCBwYXRocykpXG4gICAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBkaXNwYXRjaEVycm9yID0gZGlzcGF0Y2ggPT4gKG1lc3NhZ2UsIGxpbmVzKSA9PlxuICAgIGRpc3BhdGNoKFxuICAgICAgICBvbkVycm9yKHtcbiAgICAgICAgICAgIHR5cGU6ICdiYWNrRW5kJyxcbiAgICAgICAgICAgIGVycm9yOiB7bWVzc2FnZSwgaHRtbDogbGluZXMuam9pbignXFxuJyl9XG4gICAgICAgIH0pXG4gICAgKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGh5ZHJhdGVJbml0aWFsT3V0cHV0cygpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGRpc3BhdGNoLCBnZXRTdGF0ZSkge1xuICAgICAgICB2YWxpZGF0ZUNhbGxiYWNrc1RvTGF5b3V0KGdldFN0YXRlKCksIGRpc3BhdGNoRXJyb3IoZGlzcGF0Y2gpKTtcbiAgICAgICAgdHJpZ2dlckRlZmF1bHRTdGF0ZShkaXNwYXRjaCwgZ2V0U3RhdGUpO1xuICAgICAgICBkaXNwYXRjaChzZXRBcHBMaWZlY3ljbGUoZ2V0QXBwU3RhdGUoJ0hZRFJBVEVEJykpKTtcbiAgICB9O1xufVxuXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZSAqL1xuY29uc3QgbG9nV2FybmluZ09uY2UgPSBvbmNlKGNvbnNvbGUud2Fybik7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDU1JGSGVhZGVyKGNvbmZpZykge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHRva2VuTmFtZSA9IChjb25maWcgJiYgY29uZmlnLmNzcmZfdG9rZW5fbmFtZSkgfHwgJ19jc3JmX3Rva2VuJztcbiAgICAgICAgY29uc3QgaGVhZGVyTmFtZSA9IChjb25maWcgJiYgY29uZmlnLmNzcmZfaGVhZGVyX25hbWUpIHx8ICdYLUNTUkZUb2tlbic7XG4gICAgICAgIGNvbnN0IGNvb2tpZXMgPSBwYXJzZUNvb2tpZShkb2N1bWVudC5jb29raWUpO1xuICAgICAgICBjb25zdCB0b2tlbiA9IGNvb2tpZXNbdG9rZW5OYW1lXTtcbiAgICAgICAgaWYgKCF0b2tlbikge1xuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7W2hlYWRlck5hbWVdOiB0b2tlbn07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dXYXJuaW5nT25jZShlKTtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbn1cblxuZnVuY3Rpb24gdHJpZ2dlckRlZmF1bHRTdGF0ZShkaXNwYXRjaCwgZ2V0U3RhdGUpIHtcbiAgICBjb25zdCB7Z3JhcGhzLCBwYXRocywgbGF5b3V0fSA9IGdldFN0YXRlKCk7XG5cbiAgICAvLyBvdmVyYWxsT3JkZXIgd2lsbCBhc3NlcnQgY2lyY3VsYXIgZGVwZW5kZW5jaWVzIGZvciBtdWx0aSBvdXRwdXQuXG4gICAgdHJ5IHtcbiAgICAgICAgZ3JhcGhzLk11bHRpR3JhcGgub3ZlcmFsbE9yZGVyKCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGRpc3BhdGNoKFxuICAgICAgICAgICAgb25FcnJvcih7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2JhY2tFbmQnLFxuICAgICAgICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdDaXJjdWxhciBEZXBlbmRlbmNpZXMnLFxuICAgICAgICAgICAgICAgICAgICBodG1sOiBlcnIudG9TdHJpbmcoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgbGF5b3V0Q2FsbGJhY2tzID0gZ2V0TGF5b3V0Q2FsbGJhY2tzKFxuICAgICAgICBncmFwaHMsXG4gICAgICAgIHBhdGhzLFxuICAgICAgICBsYXlvdXQuY29tcG9uZW50cyxcbiAgICAgICAge1xuICAgICAgICAgICAgb3V0cHV0c09ubHk6IHRydWVcbiAgICAgICAgfVxuICAgICk7XG5cbiAgICAvLyBBbHNvIGluY2x1ZGUgbm8tb3V0cHV0IGFuZCBuby1pbnB1dCBjYWxsYmFja3MgdGhhdCBzaG91bGQgZmlyZSBvbiBpbml0aWFsIGxvYWRcbiAgICBjb25zdCBzcGVjaWFsQ2FsbGJhY2tzID0gKGdyYXBocy5jYWxsYmFja3MgfHwgW10pLnJlZHVjZSgoYWNjLCBjYikgPT4ge1xuICAgICAgICBpZiAoY2IucHJldmVudF9pbml0aWFsX2NhbGwpIHtcbiAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc05vT3V0cHV0ID0gY2Iubm9PdXRwdXQ7XG4gICAgICAgIGNvbnN0IGlzTm9JbnB1dCA9ICFjYi5ub091dHB1dCAmJiBjYi5pbnB1dHMubGVuZ3RoID09PSAwO1xuXG4gICAgICAgIGlmICghaXNOb091dHB1dCAmJiAhaXNOb0lucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSBtYWtlUmVzb2x2ZWRDYWxsYmFjayhjYiwgcmVzb2x2ZURlcHMoKSwgJycpO1xuICAgICAgICByZXNvbHZlZC5pbml0aWFsQ2FsbCA9IHRydWU7XG5cbiAgICAgICAgaWYgKGlzTm9PdXRwdXQpIHtcbiAgICAgICAgICAgIC8vIE5vLW91dHB1dDogaW5jbHVkZSBpZiBubyBpbnB1dHMgb3IgYW55IGlucHV0IGlzIGluIGxheW91dFxuICAgICAgICAgICAgaWYgKGNiLmlucHV0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBhY2MucHVzaChyZXNvbHZlZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0cyA9IHJlc29sdmVkLmdldElucHV0cyhwYXRocyk7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBpbnB1dHMuc29tZShpbnAgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoaW5wKSA/IGlucC5sZW5ndGggPiAwIDogaW5wXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgYWNjLnB1c2gocmVzb2x2ZWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE5vLWlucHV0OiBpbmNsdWRlIGlmIGFueSBvdXRwdXQgaXMgaW4gbGF5b3V0XG4gICAgICAgICAgICBjb25zdCBvdXRwdXRzID0gcmVzb2x2ZWQuZ2V0T3V0cHV0cyhwYXRocyk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgb3V0cHV0cy5zb21lKG91dCA9PiAoQXJyYXkuaXNBcnJheShvdXQpID8gb3V0Lmxlbmd0aCA+IDAgOiBvdXQpKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgYWNjLnB1c2gocmVzb2x2ZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBbXSk7XG5cbiAgICBkaXNwYXRjaChhZGRSZXF1ZXN0ZWRDYWxsYmFja3MoWy4uLmxheW91dENhbGxiYWNrcywgLi4uc3BlY2lhbENhbGxiYWNrc10pKTtcbn1cblxuZXhwb3J0IGNvbnN0IHJlZG8gPSBtb3ZlSGlzdG9yeSgnUkVETycpO1xuZXhwb3J0IGNvbnN0IHVuZG8gPSBtb3ZlSGlzdG9yeSgnVU5ETycpO1xuZXhwb3J0IGNvbnN0IHJldmVydCA9IG1vdmVIaXN0b3J5KCdSRVZFUlQnKTtcblxuZnVuY3Rpb24gbW92ZUhpc3RvcnkoY2hhbmdlVHlwZSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZGlzcGF0Y2gsIGdldFN0YXRlKSB7XG4gICAgICAgIGNvbnN0IHtoaXN0b3J5LCBwYXRoc30gPSBnZXRTdGF0ZSgpO1xuICAgICAgICBkaXNwYXRjaChjcmVhdGVBY3Rpb24oY2hhbmdlVHlwZSkoKSk7XG4gICAgICAgIGNvbnN0IHtpZCwgcHJvcHN9ID1cbiAgICAgICAgICAgIChjaGFuZ2VUeXBlID09PSAnUkVETydcbiAgICAgICAgICAgICAgICA/IGhpc3RvcnkuZnV0dXJlWzBdXG4gICAgICAgICAgICAgICAgOiBoaXN0b3J5LnBhc3RbaGlzdG9yeS5wYXN0Lmxlbmd0aCAtIDFdKSB8fCB7fTtcbiAgICAgICAgaWYgKGlkKSB7XG4gICAgICAgICAgICAvLyBVcGRhdGUgcHJvcHNcbiAgICAgICAgICAgIGRpc3BhdGNoKFxuICAgICAgICAgICAgICAgIGNyZWF0ZUFjdGlvbignVU5ET19QUk9QX0NIQU5HRScpKHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbXBhdGg6IGdldFBhdGgocGF0aHMsIGlkKSxcbiAgICAgICAgICAgICAgICAgICAgcHJvcHNcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgZGlzcGF0Y2gobm90aWZ5T2JzZXJ2ZXJzKHtpZCwgcHJvcHN9KSk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbm90aWZ5T2JzZXJ2ZXJzKHtpZCwgcHJvcHN9KSB7XG4gICAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIChkaXNwYXRjaCwgZ2V0U3RhdGUpIHtcbiAgICAgICAgY29uc3Qge2dyYXBocywgcGF0aHN9ID0gZ2V0U3RhdGUoKTtcbiAgICAgICAgZGlzcGF0Y2goXG4gICAgICAgICAgICBhZGRSZXF1ZXN0ZWRDYWxsYmFja3MoaW5jbHVkZU9ic2VydmVycyhpZCwgcHJvcHMsIGdyYXBocywgcGF0aHMpKVxuICAgICAgICApO1xuICAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVBc3luY0Vycm9yKGVyciwgbWVzc2FnZSwgZGlzcGF0Y2gpIHtcbiAgICAvLyBIYW5kbGUgaHRtbCBlcnJvciByZXNwb25zZXNcbiAgICBpZiAoZXJyICYmIHR5cGVvZiBlcnIudGV4dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBlcnIudGV4dCgpLnRoZW4odGV4dCA9PiB7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IHttZXNzYWdlLCBodG1sOiB0ZXh0fTtcbiAgICAgICAgICAgIGRpc3BhdGNoKG9uRXJyb3Ioe3R5cGU6ICdiYWNrRW5kJywgZXJyb3J9KSk7XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIgOiB7bWVzc2FnZSwgaHRtbDogZXJyfTtcbiAgICAgICAgZGlzcGF0Y2gob25FcnJvcih7dHlwZTogJ2JhY2tFbmQnLCBlcnJvcn0pKTtcbiAgICB9XG59XG4iLCJpbXBvcnQge3BhdGh9IGZyb20gJ3JhbWRhJztcbmltcG9ydCB7aXNSZWFkeX0gZnJvbSAnQHBsb3RseS9kYXNoLWNvbXBvbmVudC1wbHVnaW5zJztcblxuaW1wb3J0IFJlZ2lzdHJ5IGZyb20gJy4uL3JlZ2lzdHJ5JztcbmltcG9ydCB7Z2V0UGF0aH0gZnJvbSAnLi9wYXRocyc7XG5pbXBvcnQge3N0cmluZ2lmeUlkfSBmcm9tICcuL2RlcGVuZGVuY2llcyc7XG5cbmV4cG9ydCBkZWZhdWx0IChsYXlvdXQsIHBhdGhzLCB0YXJnZXRzKSA9PiB7XG4gICAgaWYgKCF0YXJnZXRzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcblxuICAgIGNvbnN0IHtldmVudHN9ID0gcGF0aHM7XG4gICAgY29uc3QgcmVuZGVyZWQgPSBuZXcgUHJvbWlzZShyZXNvbHZlUmVuZGVyZWQgPT4ge1xuICAgICAgICBldmVudHMub25jZSgncmVuZGVyZWQnLCByZXNvbHZlUmVuZGVyZWQpO1xuICAgIH0pO1xuXG4gICAgdGFyZ2V0cy5mb3JFYWNoKGlkID0+IHtcbiAgICAgICAgY29uc3QgcGF0aE9mSWQgPSBnZXRQYXRoKHBhdGhzLCBpZCk7XG4gICAgICAgIGlmICghcGF0aE9mSWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHBhdGgocGF0aE9mSWQsIGxheW91dCk7XG4gICAgICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb21wb25lbnQgPSBSZWdpc3RyeS5yZXNvbHZlKHRhcmdldCk7XG4gICAgICAgIGNvbnN0IHJlYWR5ID0gaXNSZWFkeShjb21wb25lbnQpO1xuXG4gICAgICAgIGlmIChyZWFkeSAmJiB0eXBlb2YgcmVhZHkudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcHJvbWlzZXMucHVzaChcbiAgICAgICAgICAgICAgICBQcm9taXNlLnJhY2UoW1xuICAgICAgICAgICAgICAgICAgICByZWFkeSxcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyZWQudGhlbihcbiAgICAgICAgICAgICAgICAgICAgICAgICgpID0+IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHN0cmluZ2lmeUlkKGlkKSkgJiYgcmVhZHlcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcHJvbWlzZXMubGVuZ3RoID8gUHJvbWlzZS5hbGwocHJvbWlzZXMpIDogdHJ1ZTtcbn07XG4iLCJpbXBvcnQge1xuICAgIGNvbmNhdCxcbiAgICBmaWx0ZXIsXG4gICAgZmluZCxcbiAgICBmb3JFYWNoT2JqSW5kZXhlZCxcbiAgICBpbnNlcnQsXG4gICAgcHJvcEVxLFxuICAgIHByb3BzLFxuICAgIGluZGV4T2Zcbn0gZnJvbSAncmFtZGEnO1xuXG5pbXBvcnQge2NyYXdsTGF5b3V0fSBmcm9tICcuL3V0aWxzJztcblxuLypcbiAqIHN0YXRlLnBhdGhzIGhhcyBzdHJ1Y3R1cmU6XG4gKiB7XG4gKiAgIHN0cnM6IHtbaWRdOiBwYXRofSAvLyBmb3IgcmVndWxhciBzdHJpbmcgaWRzXG4gKiAgIG9ianM6IHtba2V5U3RyXTogW3t2YWx1ZXMsIHBhdGh9XX0gLy8gZm9yIHdpbGRjYXJkIGlkcywgaW4gbGF5b3V0IG9yZGVyXG4gKiAgIG9iakluZGV4OiB7W2tleVN0cl06IHtbdmFsdWVzS2V5XTogcGF0aH19IC8vIE8oMSkgZXhhY3QgbG9va3VwIGZvciBnZXRQYXRoXG4gKiB9XG4gKiBrZXlTdHI6IHNvcnRlZCBrZXlzIG9mIHRoZSBpZCwgam9pbmVkIHdpdGggJywnIGludG8gb25lIHN0cmluZ1xuICogdmFsdWVzOiBhcnJheSBvZiB2YWx1ZXMgaW4gdGhlIGlkLCBpbiBvcmRlciBvZiBrZXlzXG4gKiB2YWx1ZXNLZXk6IHRob3NlIHZhbHVlcyBzZXJpYWxpemVkLCBzbyBhbiBleGFjdCBpZCByZXNvbHZlcyB0byBpdHMgcGF0aFxuICogICB3aXRob3V0IGEgbGluZWFyIHNjYW4gb2YgZXZlcnkgY29tcG9uZW50IHRoYXQgc2hhcmVzIHRoZSBpZCdzIGtleSBzZXRcbiAqICAgKHdoYXQgbWFkZSByZXNvbHZpbmcgYW4gQUxML01BVENIIGNhbGxiYWNrIG92ZXIgTiBjb21wb25lbnRzIE8oTl4yKSlcbiAqXG4gKiBgb2Jqc2Agc3RheXMgYW4gb3JkZXJlZCBhcnJheSBiZWNhdXNlIHBhdHRlcm4gbWF0Y2hpbmcgKE1BVENIL0FMTFNNQUxMRVIpXG4gKiBhbmQgYGdldEFsbFBNQ0lkc2Agd2FsayBpdCBpbiBvcmRlcjsgYG9iakluZGV4YCBpcyB0aGUgZmFzdCBwYXRoIG9ubHkgZm9yXG4gKiBleGFjdCBsb29rdXBzLiBBIHBhdGhzIG9iamVjdCB0aGF0IHByZWRhdGVzIGBvYmpJbmRleGAgKGFuIGVtcHR5IGluaXRpYWxcbiAqIHN0YXRlLCBhIGhhbmQtYnVpbHQgdGVzdCBmaXh0dXJlKSBzaW1wbHkgaGFzIG5vbmUsIGFuZCBnZXRQYXRoIGZhbGxzIGJhY2tcbiAqIHRvIHRoZSBsaW5lYXIgc2NhbiAtIHNvIHRoZSB0d28gYXJlIGFsd2F5cyBrZXB0IGNvbnNpc3RlbnQgYnkgY29uc3RydWN0aW9uLlxuICovXG5cbmNvbnN0IHZhbHVlc0tleSA9IHZhbHVlcyA9PiBKU09OLnN0cmluZ2lmeSh2YWx1ZXMpO1xuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVBhdGhzKHN1YlRyZWUsIHN0YXJ0aW5nUGF0aCwgb2xkUGF0aHMsIGV2ZW50cykge1xuICAgIGNvbnN0IHtcbiAgICAgICAgc3Ryczogb2xkU3RycyxcbiAgICAgICAgb2Jqczogb2xkT2JqcyxcbiAgICAgICAgb2JqSW5kZXg6IG9sZE9iakluZGV4ID0ge31cbiAgICB9ID0gb2xkUGF0aHMgfHwge3N0cnM6IHt9LCBvYmpzOiB7fX07XG5cbiAgICBjb25zdCBkaWZmSGVhZCA9IHBhdGggPT4gc3RhcnRpbmdQYXRoLnNvbWUoKHYsIGkpID0+IHBhdGhbaV0gIT09IHYpO1xuXG4gICAgY29uc3Qgc3BMZW4gPSBzdGFydGluZ1BhdGgubGVuZ3RoO1xuICAgIC8vIGlmIHdlJ3JlIHVwZGF0aW5nIGEgc3VidHJlZSwgY2xlYXIgb3V0IGFsbCBvZiB0aGUgZXhpc3RpbmcgaXRlbXNcbiAgICBjb25zdCBzdHJzID0gc3BMZW4gPyBmaWx0ZXIoZGlmZkhlYWQsIG9sZFN0cnMpIDoge307XG4gICAgY29uc3Qgb2JqcyA9IHt9O1xuXG4gICAgLy8gb2JqSW5kZXggbWlycm9ycyBvYmpzIGFzIGEgdmFsdWVzS2V5LT5wYXRoIG1hcCBmb3IgTygxKSBnZXRQYXRoLiBGb3IgYVxuICAgIC8vIHN1YnRyZWUgdXBkYXRlIHdlIGtlZXAgdGhlIG9sZCBtYXBzIGFuZCBvbmx5IHRvdWNoIHRoZSBrZXlTdHJzIHdob3NlXG4gICAgLy8gZW50cmllcyBhY3R1YWxseSBjaGFuZ2UgKGNvcHktb24td3JpdGUpLCBzbyByZS1yZXNvbHZpbmcgb25lIHNtYWxsXG4gICAgLy8gY2h1bmsgZG9lc24ndCByZWJ1aWxkIHRoZSBpbmRleCBmb3IgZXZlcnkgdW5yZWxhdGVkIHdpbGRjYXJkIGNvbXBvbmVudC5cbiAgICBjb25zdCBvYmpJbmRleCA9IHNwTGVuID8gey4uLm9sZE9iakluZGV4fSA6IHt9O1xuICAgIGNvbnN0IHRvdWNoZWQgPSBuZXcgU2V0KCk7XG4gICAgY29uc3QgZWRpdE1hcCA9IGtleVN0ciA9PiB7XG4gICAgICAgIGlmICghdG91Y2hlZC5oYXMoa2V5U3RyKSkge1xuICAgICAgICAgICAgb2JqSW5kZXhba2V5U3RyXSA9IHsuLi4ob2JqSW5kZXhba2V5U3RyXSB8fCB7fSl9O1xuICAgICAgICAgICAgdG91Y2hlZC5hZGQoa2V5U3RyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqSW5kZXhba2V5U3RyXTtcbiAgICB9O1xuXG4gICAgaWYgKHNwTGVuKSB7XG4gICAgICAgIGZvckVhY2hPYmpJbmRleGVkKChvbGRWYWxQYXRocywgb2xkS2V5cykgPT4ge1xuICAgICAgICAgICAgY29uc3QgbmV3VmFscyA9IFtdO1xuICAgICAgICAgICAgb2xkVmFsUGF0aHMuZm9yRWFjaChlbnRyeSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGRpZmZIZWFkKGVudHJ5LnBhdGgpKSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld1ZhbHMucHVzaChlbnRyeSk7IC8vIG91dHNpZGUgdGhlIGNodW5rOiBjYXJyaWVkIG92ZXJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBpbnNpZGUgdGhlIGNodW5rIGJlaW5nIHJlcGxhY2VkOiBkcm9wIGl0LCB0aGUgY3Jhd2xcbiAgICAgICAgICAgICAgICAgICAgLy8gYmVsb3cgcmUtYWRkcyB3aGF0ZXZlciBpcyBzdGlsbCB0aGVyZVxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgZWRpdE1hcChvbGRLZXlzKVt2YWx1ZXNLZXkoZW50cnkudmFsdWVzKV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAobmV3VmFscy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBvYmpzW29sZEtleXNdID0gbmV3VmFscztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgb2xkT2Jqcyk7XG4gICAgfVxuXG4gICAgY3Jhd2xMYXlvdXQoc3ViVHJlZSwgKGNoaWxkLCBpdGVtcGF0aCkgPT4ge1xuICAgICAgICBjb25zdCBpZCA9IGNoaWxkLnByb3BzICYmIGNoaWxkLnByb3BzLmlkO1xuICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaWQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGlkKS5zb3J0KCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gcHJvcHMoa2V5cywgaWQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleVN0ciA9IGtleXMuam9pbignLCcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhdGhzID0gKG9ianNba2V5U3RyXSA9IG9ianNba2V5U3RyXSB8fCBbXSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2xkaWUgPSBvbGRPYmpzW2tleVN0cl0gfHwgW107XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IHt2YWx1ZXMsIHBhdGg6IGNvbmNhdChzdGFydGluZ1BhdGgsIGl0ZW1wYXRoKX07XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBpbmRleE9mKGl0ZW0sIG9sZGllKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhdGhzLnB1c2goaXRlbSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgb2Jqc1trZXlTdHJdID0gaW5zZXJ0KGluZGV4LCBpdGVtLCBwYXRocyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IG1hcCA9IGVkaXRNYXAoa2V5U3RyKTtcbiAgICAgICAgICAgICAgICBjb25zdCBrID0gdmFsdWVzS2V5KHZhbHVlcyk7XG4gICAgICAgICAgICAgICAgaWYgKCEoayBpbiBtYXApKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IG1hdGNoIHdpbnMsIG1hdGNoaW5nIHRoZSBvbGQgYGZpbmRgIHNlbWFudGljc1xuICAgICAgICAgICAgICAgICAgICBtYXBba10gPSBpdGVtLnBhdGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdHJzW2lkXSA9IGNvbmNhdChzdGFydGluZ1BhdGgsIGl0ZW1wYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gV2UgaW5jbHVkZSBhbiBldmVudCBlbWl0dGVyIGhlcmUgYmVjYXVzZSBpdCB3aWxsIGJlIHVzZWQgYWxvbmcgd2l0aFxuICAgIC8vIHBhdGhzIHRvIGRldGVybWluZSB3aGVuIHRoZSBhcHAgaXMgcmVhZHkgZm9yIGNhbGxiYWNrcy5cbiAgICByZXR1cm4ge3N0cnMsIG9ianMsIG9iakluZGV4LCBldmVudHM6IGV2ZW50cyB8fCBvbGRQYXRocy5ldmVudHN9O1xufVxuXG4vKlxuICogRmFzdCBwYXRoIGZvciBhIFBhdGNoIHRoYXQgb25seSBhcHBlbmRlZCBpdGVtcyB0byB0aGUgdGFpbCBvZiBhIGNoaWxkcmVuXG4gKiBsaXN0OiBpbnN0ZWFkIG9mIHJlLWNyYXdsaW5nIGV2ZXJ5IHByZS1leGlzdGluZyBjaGlsZCB0byByZWJ1aWxkIHRoZSB3aG9sZVxuICogaWQtPnBhdGggdGFibGUgKE8odG90YWwgY2hpbGRyZW4pKSwgY29tcHV0ZSBwYXRocyBvbmx5IGZvciBgbmV3SXRlbXNgXG4gKiAodGhlIHRhaWwgc2xpY2UgdGhlIHBhdGNoIGFkZGVkKSBhbmQgbGF5ZXIgdGhlbSBvbnRvIHRoZSBleGlzdGluZyB0YWJsZS5cbiAqIFRoZSBwcmUtZXhpc3RpbmcgZW50cmllcyBhcmUgdmFsaWQgYXMtaXMgYmVjYXVzZSBhbiBhcHBlbmQtb25seSBwYXRjaFxuICogbmV2ZXIgY2hhbmdlcyB0aGUgcG9zaXRpb24gb3IgaWRlbnRpdHkgb2YgdGhlIGl0ZW1zIHRoYXQgd2VyZSBhbHJlYWR5XG4gKiB0aGVyZSAoc2VlIGB0YWlsQXBwZW5kc2AgaW4gcGF0Y2hBbmFseXNpcy50cywgd2hpY2ggZ3VhcmFudGVlcyB0aGlzIGJlZm9yZVxuICogdGhpcyBmdW5jdGlvbiBpcyB1c2VkKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGVuZFBhdGhzKG5ld0l0ZW1zLCBzdGFydGluZ1BhdGgsIGFwcGVuZE9mZnNldCwgb2xkUGF0aHMpIHtcbiAgICBjb25zdCBzdHJzID0gey4uLm9sZFBhdGhzLnN0cnN9O1xuICAgIGNvbnN0IG9ianMgPSB7Li4ub2xkUGF0aHMub2Jqc307XG4gICAgY29uc3QgbmV3T2JqSXRlbXMgPSB7fTtcbiAgICAvLyBPbmx5IGV4dGVuZCB0aGUgaW5kZXggaWYgdGhlIG9sZCB0YWJsZSBhbHJlYWR5IGhhZCBvbmUgLSBvdGhlcndpc2VcbiAgICAvLyBpdCB3b3VsZCBiZSBpbmNvbXBsZXRlIChtaXNzaW5nIHRoZSBwcmUtZXhpc3RpbmcgZW50cmllcykgYW5kIGdldFBhdGhcbiAgICAvLyBtdXN0IGtlZXAgZmFsbGluZyBiYWNrIHRvIHRoZSBsaW5lYXIgc2NhbiBvbiBgb2Jqc2AuXG4gICAgY29uc3Qgb2JqSW5kZXggPSBvbGRQYXRocy5vYmpJbmRleCA/IHsuLi5vbGRQYXRocy5vYmpJbmRleH0gOiBudWxsO1xuXG4gICAgbmV3SXRlbXMuZm9yRWFjaCgoY2hpbGQsIGkpID0+IHtcbiAgICAgICAgY3Jhd2xMYXlvdXQoY2hpbGQsIChjLCBpdGVtcGF0aCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaWQgPSBjLnByb3BzICYmIGMucHJvcHMuaWQ7XG4gICAgICAgICAgICBpZiAoIWlkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZnVsbFBhdGggPSBjb25jYXQoc3RhcnRpbmdQYXRoLCBbYXBwZW5kT2Zmc2V0ICsgaV0pLmNvbmNhdChcbiAgICAgICAgICAgICAgICBpdGVtcGF0aFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaWQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGlkKS5zb3J0KCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gcHJvcHMoa2V5cywgaWQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleVN0ciA9IGtleXMuam9pbignLCcpO1xuICAgICAgICAgICAgICAgIChuZXdPYmpJdGVtc1trZXlTdHJdID0gbmV3T2JqSXRlbXNba2V5U3RyXSB8fCBbXSkucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlcyxcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogZnVsbFBhdGhcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc3Ryc1tpZF0gPSBmdWxsUGF0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBPYmplY3Qua2V5cyhuZXdPYmpJdGVtcykuZm9yRWFjaChrZXlTdHIgPT4ge1xuICAgICAgICBvYmpzW2tleVN0cl0gPSBjb25jYXQob2Jqc1trZXlTdHJdIHx8IFtdLCBuZXdPYmpJdGVtc1trZXlTdHJdKTtcbiAgICAgICAgaWYgKG9iakluZGV4KSB7XG4gICAgICAgICAgICBjb25zdCBtYXAgPSB7Li4uKG9iakluZGV4W2tleVN0cl0gfHwge30pfTtcbiAgICAgICAgICAgIG5ld09iakl0ZW1zW2tleVN0cl0uZm9yRWFjaCgoe3ZhbHVlcywgcGF0aDogcH0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBrID0gdmFsdWVzS2V5KHZhbHVlcyk7XG4gICAgICAgICAgICAgICAgaWYgKCEoayBpbiBtYXApKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hcFtrXSA9IHA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBvYmpJbmRleFtrZXlTdHJdID0gbWFwO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBzdHJzLFxuICAgICAgICBvYmpzLFxuICAgICAgICAuLi4ob2JqSW5kZXggPyB7b2JqSW5kZXh9IDoge30pLFxuICAgICAgICBldmVudHM6IG9sZFBhdGhzLmV2ZW50c1xuICAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYXRoKHBhdGhzLCBpZCkge1xuICAgIGlmICh0eXBlb2YgaWQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhpZCkuc29ydCgpO1xuICAgICAgICBjb25zdCBrZXlTdHIgPSBrZXlzLmpvaW4oJywnKTtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gcHJvcHMoa2V5cywgaWQpO1xuICAgICAgICAvLyBPKDEpIGV4YWN0IGxvb2t1cCB3aGVuIHRoZSB0YWJsZSBjYXJyaWVzIGFuIGluZGV4IChhbHdheXMsIG9uY2UgaXRcbiAgICAgICAgLy8gaGFzIGJlZW4gdGhyb3VnaCBjb21wdXRlUGF0aHMvYXBwZW5kUGF0aHMpLiBBIHByZXNlbnQgaW5kZXggaXNcbiAgICAgICAgLy8gY29tcGxldGUsIHNvIGEgbWlzcyBtZWFucyB0aGUgaWQgZ2VudWluZWx5IGlzbid0IG9uIHRoZSBwYWdlLlxuICAgICAgICBpZiAocGF0aHMub2JqSW5kZXgpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hcCA9IHBhdGhzLm9iakluZGV4W2tleVN0cl07XG4gICAgICAgICAgICByZXR1cm4gKG1hcCAmJiBtYXBbdmFsdWVzS2V5KHZhbHVlcyldKSB8fCBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBrZXlQYXRocyA9IHBhdGhzLm9ianNba2V5U3RyXTtcbiAgICAgICAgaWYgKCFrZXlQYXRocykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhdGhPYmogPSBmaW5kKHByb3BFcSh2YWx1ZXMsICd2YWx1ZXMnKSwga2V5UGF0aHMpO1xuICAgICAgICByZXR1cm4gcGF0aE9iaiAmJiBwYXRoT2JqLnBhdGg7XG4gICAgfVxuICAgIHJldHVybiBwYXRocy5zdHJzW2lkXTtcbn1cbiIsImltcG9ydCB7Y29uY2F0LCBoYXMsIHBhdGgsIHR5cGUsIGZpbmRJbmRleCwgaW5jbHVkZXMsIHNsaWNlfSBmcm9tICdyYW1kYSc7XG5cbi8qXG4gKiByZXF1ZXN0c19wYXRobmFtZV9wcmVmaXggaXMgdGhlIG5ldyBjb25maWcgcGFyYW1ldGVyIGludHJvZHVjZWQgaW5cbiAqIGRhc2g9PTAuMTguMC4gVGhlIHByZXZpb3VzIHZlcnNpb25zIGp1c3QgaGFkIHVybF9iYXNlX3BhdGhuYW1lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cmxCYXNlKGNvbmZpZykge1xuICAgIGNvbnN0IGhhc1VybEJhc2UgPSBoYXMoJ3VybF9iYXNlX3BhdGhuYW1lJywgY29uZmlnKTtcbiAgICBjb25zdCBoYXNSZXFQcmVmaXggPSBoYXMoJ3JlcXVlc3RzX3BhdGhuYW1lX3ByZWZpeCcsIGNvbmZpZyk7XG4gICAgaWYgKHR5cGUoY29uZmlnKSAhPT0gJ09iamVjdCcgfHwgKCFoYXNVcmxCYXNlICYmICFoYXNSZXFQcmVmaXgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBcbiAgICAgICAgICAgIFRyeWluZyB0byBtYWtlIGFuIEFQSSByZXF1ZXN0IGJ1dCBuZWl0aGVyXG4gICAgICAgICAgICBcInVybF9iYXNlX3BhdGhuYW1lXCIgbm9yIFwicmVxdWVzdHNfcGF0aG5hbWVfcHJlZml4XCJcbiAgICAgICAgICAgIGlzIGluIFxcYGNvbmZpZ1xcYC4gXFxgY29uZmlnXFxgIGlzOiBgLFxuICAgICAgICAgICAgY29uZmlnXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgYmFzZSA9IGhhc1JlcVByZWZpeFxuICAgICAgICA/IGNvbmZpZy5yZXF1ZXN0c19wYXRobmFtZV9wcmVmaXhcbiAgICAgICAgOiBjb25maWcudXJsX2Jhc2VfcGF0aG5hbWU7XG5cbiAgICByZXR1cm4gYmFzZS5jaGFyQXQoYmFzZS5sZW5ndGggLSAxKSA9PT0gJy8nID8gYmFzZSA6IGJhc2UgKyAnLyc7XG59XG5cbmNvbnN0IHByb3BzQ2hpbGRyZW4gPSBbJ3Byb3BzJywgJ2NoaWxkcmVuJ107XG5cbi8vIGNyYXdsIGEgbGF5b3V0IG9iamVjdCBvciBjaGlsZHJlbiBhcnJheSwgYXBwbHkgYSBmdW5jdGlvbiBvbiBldmVyeSBvYmplY3RcbmV4cG9ydCBjb25zdCBjcmF3bExheW91dCA9IChcbiAgICBvYmplY3QsXG4gICAgZnVuYyxcbiAgICBjdXJyZW50UGF0aCA9IFtdLFxuICAgIGV4dHJhUGF0aCA9IHVuZGVmaW5lZFxuKSA9PiB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqZWN0KSkge1xuICAgICAgICAvLyBjaGlsZHJlbiBhcnJheVxuICAgICAgICBvYmplY3QuZm9yRWFjaCgoY2hpbGQsIGkpID0+IHtcbiAgICAgICAgICAgIGlmIChleHRyYVBhdGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvYmpPZiA9IGZpbmRJbmRleChwID0+IGluY2x1ZGVzKCd7fScsIHApLCBleHRyYVBhdGgpO1xuICAgICAgICAgICAgICAgIGlmIChvYmpPZiAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZnJvbnQgPSBzbGljZSgwLCBvYmpPZiwgZXh0cmFQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFjayA9IHNsaWNlKG9iak9mLCBleHRyYVBhdGgubGVuZ3RoLCBleHRyYVBhdGgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZnJvbnQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjcmF3bExheW91dChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoKGZyb250LCBjaGlsZCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25jYXQoY3VycmVudFBhdGgsIGNvbmNhdChbaV0sIGZyb250KSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja1xuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhY2tQYXRoID0gYmFja1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAocCA9PiBwLnJlcGxhY2UoJ3t9JywgJycpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoZSA9PiBlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaGlsZE9iaixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZFBhdGggPSBjb25jYXQoW2ldLCBiYWNrUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmFja1BhdGgubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRPYmogPSBwYXRoKGJhY2tQYXRoLCBjaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkT2JqID0gY2hpbGQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBjaGlsZE9iaikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY2hpbGRPYmpba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmF3bExheW91dChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmNhdChjdXJyZW50UGF0aCwgY2hpbGRQYXRoLmNvbmNhdChba2V5XSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNyYXdsTGF5b3V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aChleHRyYVBhdGgsIGNoaWxkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25jYXQoY3VycmVudFBhdGgsIGNvbmNhdChbaV0sIGV4dHJhUGF0aCkpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjcmF3bExheW91dChjaGlsZCwgZnVuYywgY3VycmVudFBhdGguY29uY2F0KGkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh0eXBlKG9iamVjdCkgPT09ICdPYmplY3QnKSB7XG4gICAgICAgIGZ1bmMob2JqZWN0LCBjdXJyZW50UGF0aCk7XG5cbiAgICAgICAgLy8gSG90IHBhdGg6IGV2ZXJ5IGNvbXBvbmVudCBoaXRzIHRoaXMgb24gZXZlcnkgY3Jhd2wgKHBhdGggcmVjb21wdXRlLFxuICAgICAgICAvLyBjYWxsYmFjayBnYXRoZXIpLiBEaXJlY3QgYWNjZXNzIGF2b2lkcyByYW1kYSdzIGN1cnJpZWQgYHBhdGhgL1xuICAgICAgICAvLyBgcGF0aE9yYCBkaXNwYXRjaCAoYW5kIHRoZSBgX2lzUGxhY2Vob2xkZXJgIGNoZWNrcyB0aGV5IGRvKSBwZXIgbm9kZS5cbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBvYmplY3QucHJvcHMgJiYgb2JqZWN0LnByb3BzLmNoaWxkcmVuO1xuICAgICAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld1BhdGggPSBjdXJyZW50UGF0aC5jb25jYXQocHJvcHNDaGlsZHJlbik7XG4gICAgICAgICAgICBjcmF3bExheW91dChjaGlsZHJlbiwgZnVuYywgbmV3UGF0aCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjcCA9IHdpbmRvdy5fX2Rhc2hwcml2YXRlX2NoaWxkcmVuUHJvcHM7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuUHJvcHMgPVxuICAgICAgICAgICAgKGNwICYmIGNwW29iamVjdC5uYW1lc3BhY2VdICYmIGNwW29iamVjdC5uYW1lc3BhY2VdW29iamVjdC50eXBlXSkgfHxcbiAgICAgICAgICAgIFtdO1xuICAgICAgICBjaGlsZHJlblByb3BzLmZvckVhY2goY2hpbGRyZW5Qcm9wID0+IHtcbiAgICAgICAgICAgIGlmIChjaGlsZHJlblByb3AuaW5jbHVkZXMoJ1tdJykpIHtcbiAgICAgICAgICAgICAgICBsZXQgW2Zyb250UGF0aCwgYmFja1BhdGhdID0gY2hpbGRyZW5Qcm9wXG4gICAgICAgICAgICAgICAgICAgIC5zcGxpdCgnW10nKVxuICAgICAgICAgICAgICAgICAgICAubWFwKHAgPT4gcC5zcGxpdCgnLicpLmZpbHRlcihlID0+IGUpKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGZyb250ID0gY29uY2F0KFsncHJvcHMnXSwgZnJvbnRQYXRoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBiYXNlUGF0aCA9IGNvbmNhdChjdXJyZW50UGF0aCwgZnJvbnQpO1xuICAgICAgICAgICAgICAgIGNyYXdsTGF5b3V0KHBhdGgoZnJvbnQsIG9iamVjdCksIGZ1bmMsIGJhc2VQYXRoLCBiYWNrUGF0aCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlblByb3AuaW5jbHVkZXMoJ3t9JykpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3BhdGggPSBjaGlsZHJlblByb3Auc3BsaXQoJy4nKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZnJvbnRQYXRoID0gW107XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhY2tQYXRoID0gW107XG4gICAgICAgICAgICAgICAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3BhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1clBhdGggPSBvcGF0aFtpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQgJiYgY3VyUGF0aC5pbmNsdWRlcygne30nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9udFBhdGgucHVzaChjdXJQYXRoLnJlcGxhY2UoJ3t9JywgJycpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tQYXRoLnB1c2goY3VyUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbnRQYXRoLnB1c2goY3VyUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld1BhdGggPSBjb25jYXQoY3VycmVudFBhdGgsIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wcycsXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5mcm9udFBhdGhcbiAgICAgICAgICAgICAgICAgICAgXSk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb1ZhbHVlID0gcGF0aChbJ3Byb3BzJywgLi4uZnJvbnRQYXRoXSwgb2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9WYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IG9WYWx1ZVtrZXldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiYWNrUGF0aC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Jhd2xMYXlvdXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoKGJhY2tQYXRoLCB2YWx1ZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uY2F0KG5ld1BhdGgsIFtrZXksIC4uLmJhY2tQYXRoXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmF3bExheW91dCh2YWx1ZSwgZnVuYywgWy4uLm5ld1BhdGgsIGtleV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld1BhdGggPSBjb25jYXQoY3VycmVudFBhdGgsIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wcycsXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5jaGlsZHJlblByb3Auc3BsaXQoJy4nKVxuICAgICAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICAgICAgY3Jhd2xMYXlvdXQoXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoKFsncHJvcHMnLCAuLi5jaGlsZHJlblByb3Auc3BsaXQoJy4nKV0sIG9iamVjdCksXG4gICAgICAgICAgICAgICAgICAgICAgICBmdW5jLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGF0aFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufTtcblxuLy8gVGhlcmUgYXJlIHBhY2thZ2VzIGZvciB0aGlzIGJ1dCBpdCdzIHNpbXBsZSBlbm91Z2gsIEkganVzdFxuLy8gYWRhcHRlZCBpdCBmcm9tIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL211ZGdlLzU4MzAzODJcbmV4cG9ydCBjbGFzcyBFdmVudEVtaXR0ZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLl9ldiA9IHt9O1xuICAgIH1cbiAgICBvbihldmVudCwgbGlzdGVuZXIpIHtcbiAgICAgICAgY29uc3QgZXZlbnRzID0gKHRoaXMuX2V2W2V2ZW50XSA9IHRoaXMuX2V2W2V2ZW50XSB8fCBbXSk7XG4gICAgICAgIGV2ZW50cy5wdXNoKGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHRoaXMucmVtb3ZlTGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKTtcbiAgICB9XG4gICAgcmVtb3ZlTGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKSB7XG4gICAgICAgIGNvbnN0IGV2ZW50cyA9IHRoaXMuX2V2W2V2ZW50XTtcbiAgICAgICAgaWYgKGV2ZW50cykge1xuICAgICAgICAgICAgY29uc3QgaWR4ID0gZXZlbnRzLmluZGV4T2YobGlzdGVuZXIpO1xuICAgICAgICAgICAgaWYgKGlkeCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgZXZlbnRzLnNwbGljZShpZHgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGVtaXQoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgICAgICAgY29uc3QgZXZlbnRzID0gdGhpcy5fZXZbZXZlbnRdO1xuICAgICAgICBpZiAoZXZlbnRzKSB7XG4gICAgICAgICAgICBldmVudHMuZm9yRWFjaChsaXN0ZW5lciA9PiBsaXN0ZW5lci5hcHBseSh0aGlzLCBhcmdzKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgb25jZShldmVudCwgbGlzdGVuZXIpIHtcbiAgICAgICAgY29uc3QgcmVtb3ZlID0gdGhpcy5vbihldmVudCwgKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICAgIHJlbW92ZSgpO1xuICAgICAgICAgICAgbGlzdGVuZXIuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsIi8qXG4gKiBDb3BpZWQgb3V0IG9mIHByb3AtdHlwZXMgYW5kIG1vZGlmaWVkIC0gaW5zcGlyZWQgYnkgY2hlY2stcHJvcC10eXBlcywgYnV0XG4gKiBzaW1wbGlmaWVkIGFuZCB0d2Vha2VkIHRvIG91ciBuZWVkczogd2UgZG9uJ3QgbmVlZCB0aGUgTk9ERV9FTlYgY2hlY2ssXG4gKiB3ZSByZXBvcnQgYWxsIGVycm9ycywgbm90IGp1c3QgdGhlIGZpcnN0IG9uZSwgYW5kIHdlIGRvbid0IG5lZWQgdGhlIHRocm93aW5nXG4gKiB2YXJpYW50IGBhc3NlcnRQcm9wVHlwZXNgLlxuICovXG5pbXBvcnQgUmVhY3RQcm9wVHlwZXNTZWNyZXQgZnJvbSAncHJvcC10eXBlcy9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQnO1xuXG4vKipcbiAqIEFzc2VydCB0aGF0IHRoZSB2YWx1ZXMgbWF0Y2ggd2l0aCB0aGUgdHlwZSBzcGVjcy5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gdHlwZVNwZWNzIE1hcCBvZiBuYW1lIHRvIGEgUmVhY3RQcm9wVHlwZVxuICogQHBhcmFtIHtvYmplY3R9IHZhbHVlcyBSdW50aW1lIHZhbHVlcyB0aGF0IG5lZWQgdG8gYmUgdHlwZS1jaGVja2VkXG4gKiBAcGFyYW0ge3N0cmluZ30gbG9jYXRpb24gZS5nLiBcInByb3BcIiwgXCJjb250ZXh0XCIsIFwiY2hpbGQgY29udGV4dFwiXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tcG9uZW50TmFtZSBOYW1lIG9mIHRoZSBjb21wb25lbnQgZm9yIGVycm9yIG1lc3NhZ2VzLlxuICogQHBhcmFtIHs/RnVuY3Rpb259IGdldFN0YWNrIFJldHVybnMgdGhlIGNvbXBvbmVudCBzdGFjay5cbiAqIEByZXR1cm4ge3N0cmluZ30gQW55IGVycm9yIG1lc3NhZ2UgcmVzdWx0aW5nIGZyb20gY2hlY2tpbmcgdGhlIHR5cGVzXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNoZWNrUHJvcFR5cGVzKFxuICAgIHR5cGVTcGVjcyxcbiAgICB2YWx1ZXMsXG4gICAgbG9jYXRpb24sXG4gICAgY29tcG9uZW50TmFtZSxcbiAgICBnZXRTdGFjayA9IG51bGxcbikge1xuICAgIGNvbnN0IGVycm9ycyA9IFtdO1xuICAgIGZvciAoY29uc3QgdHlwZVNwZWNOYW1lIGluIHR5cGVTcGVjcykge1xuICAgICAgICBpZiAodHlwZVNwZWNzLmhhc093blByb3BlcnR5KHR5cGVTcGVjTmFtZSkpIHtcbiAgICAgICAgICAgIGxldCBlcnJvcjtcbiAgICAgICAgICAgIC8vIFByb3AgdHlwZSB2YWxpZGF0aW9uIG1heSB0aHJvdy4gSW4gY2FzZSB0aGV5IGRvLCB3ZSBkb24ndCB3YW50IHRvXG4gICAgICAgICAgICAvLyBmYWlsIHRoZSByZW5kZXIgcGhhc2Ugd2hlcmUgaXQgZGlkbid0IGZhaWwgYmVmb3JlLiBTbyB3ZSBsb2cgaXQuXG4gICAgICAgICAgICAvLyBBZnRlciB0aGVzZSBoYXZlIGJlZW4gY2xlYW5lZCB1cCwgd2UnbGwgbGV0IHRoZW0gdGhyb3cuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBhbiBpbnZhcmlhbnQgdGhhdCBnZXRzIGNhdWdodC4gSXQncyB0aGUgc2FtZVxuICAgICAgICAgICAgICAgIC8vIGJlaGF2aW9yIGFzIHdpdGhvdXQgdGhpcyBzdGF0ZW1lbnQgZXhjZXB0IHdpdGggYSBiZXR0ZXIgbWVzc2FnZS5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yID0gRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAoY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzogJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgdHlwZSBgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZVNwZWNOYW1lICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYCBpcyBpbnZhbGlkOyAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXQgbXVzdCBiZSBhIGZ1bmN0aW9uLCB1c3VhbGx5IGZyb20gdGhlIGBwcm9wLXR5cGVzYCBwYWNrYWdlLCBidXQgcmVjZWl2ZWQgYCcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2AuJ1xuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBlcnJvci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yID0gdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0oXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlU3BlY05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgUmVhY3RQcm9wVHlwZXNTZWNyZXRcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgICAgICAgIGVycm9yID0gZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXJyb3IgJiYgIShlcnJvciBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAoY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAnOiB0eXBlIHNwZWNpZmljYXRpb24gb2YgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiArXG4gICAgICAgICAgICAgICAgICAgICAgICAnIGAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVTcGVjTmFtZSArXG4gICAgICAgICAgICAgICAgICAgICAgICAnYCBpcyBpbnZhbGlkOyB0aGUgdHlwZSBjaGVja2VyICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2Z1bmN0aW9uIG11c3QgcmV0dXJuIGBudWxsYCBvciBhbiBgRXJyb3JgIGJ1dCByZXR1cm5lZCBhICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIGVycm9yICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcuICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1lvdSBtYXkgaGF2ZSBmb3Jnb3R0ZW4gdG8gcGFzcyBhbiBhcmd1bWVudCB0byB0aGUgdHlwZSBjaGVja2VyICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2NyZWF0b3IgKGFycmF5T2YsIGluc3RhbmNlT2YsIG9iamVjdE9mLCBvbmVPZiwgb25lT2ZUeXBlLCBhbmQgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnc2hhcGUgYWxsIHJlcXVpcmUgYW4gYXJndW1lbnQpLidcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICB2YXIgc3RhY2sgPSAoZ2V0U3RhY2sgJiYgZ2V0U3RhY2soKSkgfHwgJyc7XG5cbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgJ0ZhaWxlZCAnICsgbG9jYXRpb24gKyAnIHR5cGU6ICcgKyBlcnJvci5tZXNzYWdlICsgc3RhY2tcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBlcnJvcnMuam9pbignXFxuXFxuJyk7XG59XG4iLCJpbXBvcnQge2Nvbm5lY3R9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuXG5mdW5jdGlvbiBMb2FkaW5nKHByb3BzKSB7XG4gICAgaWYgKHByb3BzLmlzTG9hZGluZykge1xuICAgICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9J19kYXNoLWxvYWRpbmctY2FsbGJhY2snIC8+O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuTG9hZGluZy5wcm9wVHlwZXMgPSB7XG4gICAgaXNMb2FkaW5nOiBQcm9wVHlwZXMuYm9vbC5pc1JlcXVpcmVkXG59O1xuXG5leHBvcnQgZGVmYXVsdCBjb25uZWN0KHN0YXRlID0+ICh7XG4gICAgaXNMb2FkaW5nOiBzdGF0ZS5pc0xvYWRpbmdcbn0pKShMb2FkaW5nKTtcbiIsImltcG9ydCB7XG4gICAgY29tcGFyYXRvcixcbiAgICBlcXVhbHMsXG4gICAgZm9yRWFjaCxcbiAgICBoYXMsXG4gICAgaXNFbXB0eSxcbiAgICBsdCxcbiAgICBwYXRoLFxuICAgIHBhdGhPcixcbiAgICBzb3J0XG59IGZyb20gJ3JhbWRhJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHtjb25uZWN0fSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgYXBpVGh1bmsgZnJvbSAnLi4vLi4vYWN0aW9ucy9hcGknO1xuXG5jbGFzcyBSZWxvYWRlciBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgICBpZiAocHJvcHMuY29uZmlnLmhvdF9yZWxvYWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHtpbnRlcnZhbCwgbWF4X3JldHJ5fSA9IHByb3BzLmNvbmZpZy5ob3RfcmVsb2FkO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICBpbnRlcnZhbCxcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgaW50ZXJ2YWxJZDogbnVsbCxcbiAgICAgICAgICAgICAgICBwYWNrYWdlczogbnVsbCxcbiAgICAgICAgICAgICAgICBtYXhfcmV0cnlcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgICAgIGRpc2FibGVkOiB0cnVlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3JldHJ5ID0gMDtcbiAgICAgICAgdGhpcy5faGVhZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2hlYWQnKTtcbiAgICAgICAgdGhpcy5jbGVhckludGVydmFsID0gdGhpcy5jbGVhckludGVydmFsLmJpbmQodGhpcyk7XG4gICAgfVxuXG4gICAgY2xlYXJJbnRlcnZhbCgpIHtcbiAgICAgICAgd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5zdGF0ZS5pbnRlcnZhbElkKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7aW50ZXJ2YWxJZDogbnVsbH0pO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMocHJvcHMpIHtcbiAgICAgICAgLypcbiAgICAgICAgICogU2F2ZSB0aGUgbm9uLWxvYWRpbmcgcmVxdWVzdHMgaW4gdGhlIHN0YXRlIGluIG9yZGVyIHRvIGNvbXBhcmVcbiAgICAgICAgICogY3VycmVudCBoYXNoZXMgd2l0aCBwcmV2aW91cyBoYXNoZXMuXG4gICAgICAgICAqIE5vdGUgdGhhdCBpZiB0aGVyZSB3YXNuJ3QgYSBcImxvYWRpbmdcIiBzdGF0ZSBmb3IgdGhlIHJlcXVlc3RzLFxuICAgICAgICAgKiB0aGVuIHdlICBjb3VsZCBzaW1wbHkgY29tcGFyZSBgcHJvcHNgIHdpdGggYHByZXZQcm9wc2AgaW5cbiAgICAgICAgICogYGNvbXBvbmVudERpZFVwZGF0ZWAuXG4gICAgICAgICAqL1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICAhaXNFbXB0eShwcm9wcy5yZWxvYWRSZXF1ZXN0KSAmJlxuICAgICAgICAgICAgcHJvcHMucmVsb2FkUmVxdWVzdC5zdGF0dXMgIT09ICdsb2FkaW5nJ1xuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiB7cmVsb2FkUmVxdWVzdDogcHJvcHMucmVsb2FkUmVxdWVzdH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcywgcHJldlN0YXRlKSB7XG4gICAgICAgIGNvbnN0IHtyZWxvYWRSZXF1ZXN0fSA9IHRoaXMuc3RhdGU7XG4gICAgICAgIGNvbnN0IHtkaXNwYXRjaH0gPSB0aGlzLnByb3BzO1xuXG4gICAgICAgIC8vIEluIHRoZSBiZWdpbm5pbmcsIHJlbG9hZFJlcXVlc3Qgd29uJ3QgYmUgZGVmaW5lZFxuICAgICAgICBpZiAoIXJlbG9hZFJlcXVlc3QpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qXG4gICAgICAgICAqIFdoZW4gcmVsb2FkUmVxdWVzdCBpcyBmaXJzdCBkZWZpbmVkLCBwcmV2U3RhdGUgd29uJ3QgYmUgZGVmaW5lZFxuICAgICAgICAgKiBmb3Igb25lIHJlbmRlciBsb29wLlxuICAgICAgICAgKiBUaGUgZmlyc3QgcmVsb2FkUmVxdWVzdCBkZWZpbmVzIHRoZSBpbml0aWFsL2Jhc2VsaW5lIGhhc2ggLVxuICAgICAgICAgKiBpdCBkb2Vzbid0IHJlcXVpcmUgYSByZWxvYWRcbiAgICAgICAgICovXG4gICAgICAgIGlmICghaGFzKCdyZWxvYWRSZXF1ZXN0JywgcHJldlN0YXRlKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgcmVsb2FkUmVxdWVzdC5zdGF0dXMgPT09IDIwMCAmJlxuICAgICAgICAgICAgcGF0aChbJ2NvbnRlbnQnLCAncmVsb2FkSGFzaCddLCByZWxvYWRSZXF1ZXN0KSAhPT1cbiAgICAgICAgICAgICAgICBwYXRoKFsncmVsb2FkUmVxdWVzdCcsICdjb250ZW50JywgJ3JlbG9hZEhhc2gnXSwgcHJldlN0YXRlKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGZvciBDU1MgKCFjb250ZW50LmhhcmQpIG9yIG5ldyBwYWNrYWdlIGFzc2V0c1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHJlbG9hZFJlcXVlc3QuY29udGVudC5oYXJkIHx8XG4gICAgICAgICAgICAgICAgIWVxdWFscyhcbiAgICAgICAgICAgICAgICAgICAgcmVsb2FkUmVxdWVzdC5jb250ZW50LnBhY2thZ2VzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgcGF0aE9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgW10sXG4gICAgICAgICAgICAgICAgICAgICAgICBbJ3JlbG9hZFJlcXVlc3QnLCAnY29udGVudCcsICdwYWNrYWdlcyddLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJldlN0YXRlXG4gICAgICAgICAgICAgICAgICAgICkubGVuZ3RoXG4gICAgICAgICAgICAgICAgKSB8fFxuICAgICAgICAgICAgICAgICFlcXVhbHMoXG4gICAgICAgICAgICAgICAgICAgIHNvcnQoY29tcGFyYXRvcihsdCksIHJlbG9hZFJlcXVlc3QuY29udGVudC5wYWNrYWdlcyksXG4gICAgICAgICAgICAgICAgICAgIHNvcnQoXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJhdG9yKGx0KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhPcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ3JlbG9hZFJlcXVlc3QnLCAnY29udGVudCcsICdwYWNrYWdlcyddLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZTdGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgLy8gTG9vayBpZiBpdCB3YXMgYSBjc3MgZmlsZS5cbiAgICAgICAgICAgICAgICBsZXQgd2FzX2NzcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBhIG9mIHJlbG9hZFJlcXVlc3QuY29udGVudC5maWxlcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYS5pc19jc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdhc19jc3MgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZXNUb0Rpc2FibGUgPSBbXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VhcmNoIGZvciB0aGUgb2xkIGZpbGUgYnkgeHBhdGguXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpdCA9IGRvY3VtZW50LmV2YWx1YXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAvL2xpbmtbY29udGFpbnMoQGhyZWYsIFwiJHthLnVybH1cIildYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9oZWFkXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5vZGUgPSBpdC5pdGVyYXRlTmV4dCgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobm9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzVG9EaXNhYmxlLnB1c2gobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9IGl0Lml0ZXJhdGVOZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvckVhY2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9PiBuLnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCAnZGlzYWJsZWQnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2Rlc1RvRGlzYWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEubW9kaWZpZWQgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rLmhyZWYgPSBgJHthLnVybH0/bT0ke2EubW9kaWZpZWR9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rLnR5cGUgPSAndGV4dC9jc3MnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmsucmVsID0gJ3N0eWxlc2hlZXQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2hlYWQuYXBwZW5kQ2hpbGQobGluayk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRWxzZSB0aGUgZmlsZSB3YXMgZGVsZXRlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlJ3MgYW5vdGhlciBraW5kIG9mIGZpbGUgaGVyZSBkbyBhIGhhcmQgcmVsb2FkLlxuICAgICAgICAgICAgICAgICAgICAgICAgd2FzX2NzcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCF3YXNfY3NzKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEFzc2V0cyBmaWxlIGhhdmUgY2hhbmdlZFxuICAgICAgICAgICAgICAgICAgICAvLyBvciBhIGNvbXBvbmVudCBsaWIgaGFzIGJlZW4gYWRkZWQvcmVtb3ZlZCAtXG4gICAgICAgICAgICAgICAgICAgIC8vIE11c3QgZG8gYSBoYXJkIHJlbG9hZFxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBCYWNrZW5kIGNvZGUgY2hhbmdlZCAtIGNhbiBkbyBhIHNvZnQgcmVsb2FkIGluIHBsYWNlXG4gICAgICAgICAgICAgICAgZGlzcGF0Y2goe3R5cGU6ICdSRUxPQUQnfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICB0aGlzLnN0YXRlLmludGVydmFsSWQgIT09IG51bGwgJiZcbiAgICAgICAgICAgIHJlbG9hZFJlcXVlc3Quc3RhdHVzID09PSA1MDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fcmV0cnkgPiB0aGlzLnN0YXRlLm1heF9yZXRyeSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJJbnRlcnZhbCgpO1xuICAgICAgICAgICAgICAgIC8vIEludGVncmF0ZSB3aXRoIGRldiB0b29scyB1aT8hXG4gICAgICAgICAgICAgICAgd2luZG93LmFsZXJ0KFxuICAgICAgICAgICAgICAgICAgICBgSG90IHJlbG9hZGluZyBpcyBkaXNhYmxlZCBhZnRlciBmYWlsaW5nICR7dGhpcy5fcmV0cnl9IHRpbWVzLiBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdQbGVhc2UgY2hlY2sgeW91ciBhcHBsaWNhdGlvbiBmb3IgZXJyb3JzLCB0aGVuIHJlZnJlc2ggdGhlIHBhZ2UuJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9yZXRyeSsrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICAgIGNvbnN0IHtkaXNwYXRjaCwgcmVsb2FkUmVxdWVzdH0gPSB0aGlzLnByb3BzO1xuICAgICAgICBjb25zdCB7ZGlzYWJsZWQsIGludGVydmFsfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgIGlmICghZGlzYWJsZWQgJiYgIXRoaXMuc3RhdGUuaW50ZXJ2YWxJZCkge1xuICAgICAgICAgICAgY29uc3QgaW50ZXJ2YWxJZCA9IHdpbmRvdy5zZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gUHJldmVudCByZXF1ZXN0cyBmcm9tIHBpbGluZyB1cCAtIHJlbG9hZGluZyBjYW4gdGFrZVxuICAgICAgICAgICAgICAgIC8vIG1hbnkgc2Vjb25kcyAoMTAtMzApIGFuZCB0aGUgaW50ZXJ2YWwgaXMgM3MgYnkgZGVmYXVsdFxuICAgICAgICAgICAgICAgIGlmIChyZWxvYWRSZXF1ZXN0LnN0YXR1cyAhPT0gJ2xvYWRpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKGFwaVRodW5rKCdfcmVsb2FkLWhhc2gnLCAnR0VUJywgJ3JlbG9hZFJlcXVlc3QnKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgaW50ZXJ2YWwpO1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7aW50ZXJ2YWxJZH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5zdGF0ZS5kaXNhYmxlZCAmJiB0aGlzLnN0YXRlLmludGVydmFsSWQpIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJJbnRlcnZhbCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG5cblJlbG9hZGVyLmRlZmF1bHRQcm9wcyA9IHt9O1xuXG5SZWxvYWRlci5wcm9wVHlwZXMgPSB7XG4gICAgaWQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgY29uZmlnOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIHJlbG9hZFJlcXVlc3Q6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgZGlzcGF0Y2g6IFByb3BUeXBlcy5mdW5jLFxuICAgIGludGVydmFsOiBQcm9wVHlwZXMubnVtYmVyXG59O1xuXG5leHBvcnQgZGVmYXVsdCBjb25uZWN0KFxuICAgIHN0YXRlID0+ICh7XG4gICAgICAgIGNvbmZpZzogc3RhdGUuY29uZmlnLFxuICAgICAgICByZWxvYWRSZXF1ZXN0OiBzdGF0ZS5yZWxvYWRSZXF1ZXN0XG4gICAgfSksXG4gICAgZGlzcGF0Y2ggPT4gKHtkaXNwYXRjaH0pXG4pKFJlbG9hZGVyKTtcbiIsImltcG9ydCB7Y29ubmVjdH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQge3JlZG8sIHVuZG99IGZyb20gJy4uLy4uL2FjdGlvbnMvaW5kZXguanMnO1xuaW1wb3J0ICcuL1Rvb2xiYXIuY3NzJztcblxuZnVuY3Rpb24gVW5jb25uZWN0ZWRUb29sYmFyKHByb3BzKSB7XG4gICAgY29uc3Qge2Rpc3BhdGNoLCBoaXN0b3J5fSA9IHByb3BzO1xuXG4gICAgY29uc3QgdW5kb0xpbmsgPSAoXG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgICBrZXk9J3VuZG9MaW5rJ1xuICAgICAgICAgICAgY2xhc3NOYW1lPSdfZGFzaC11bmRvLXJlZG8tbGluaydcbiAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGRpc3BhdGNoKHVuZG8pfVxuICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nX2Rhc2gtaWNvbi11bmRvJz7ihro8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdfZGFzaC11bmRvLXJlZG8tbGFiZWwnPnVuZG88L2Rpdj5cbiAgICAgICAgPC9zcGFuPlxuICAgICk7XG5cbiAgICBjb25zdCByZWRvTGluayA9IChcbiAgICAgICAgPHNwYW5cbiAgICAgICAgICAgIGtleT0ncmVkb0xpbmsnXG4gICAgICAgICAgICBjbGFzc05hbWU9J19kYXNoLXVuZG8tcmVkby1saW5rJ1xuICAgICAgICAgICAgb25DbGljaz17KCkgPT4gZGlzcGF0Y2gocmVkbyl9XG4gICAgICAgID5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdfZGFzaC1pY29uLXJlZG8nPuKGuzwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J19kYXNoLXVuZG8tcmVkby1sYWJlbCc+cmVkbzwvZGl2PlxuICAgICAgICA8L3NwYW4+XG4gICAgKTtcblxuICAgIHJldHVybiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdfZGFzaC11bmRvLXJlZG8nPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICB7aGlzdG9yeS5wYXN0Lmxlbmd0aCA+IDAgPyB1bmRvTGluayA6IG51bGx9XG4gICAgICAgICAgICAgICAge2hpc3RvcnkuZnV0dXJlLmxlbmd0aCA+IDAgPyByZWRvTGluayA6IG51bGx9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgKTtcbn1cblxuVW5jb25uZWN0ZWRUb29sYmFyLnByb3BUeXBlcyA9IHtcbiAgICBoaXN0b3J5OiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIGRpc3BhdGNoOiBQcm9wVHlwZXMuZnVuY1xufTtcblxuY29uc3QgVG9vbGJhciA9IGNvbm5lY3QoXG4gICAgc3RhdGUgPT4gKHtcbiAgICAgICAgaGlzdG9yeTogc3RhdGUuaGlzdG9yeVxuICAgIH0pLFxuICAgIGRpc3BhdGNoID0+ICh7ZGlzcGF0Y2h9KVxuKShVbmNvbm5lY3RlZFRvb2xiYXIpO1xuXG5leHBvcnQgZGVmYXVsdCBUb29sYmFyO1xuIiwiaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50LCB1c2VTdGF0ZSwgdXNlTWVtbywgdXNlRWZmZWN0LCB1c2VSZWZ9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQge2Nvbm5lY3QsIHVzZVNlbGVjdG9yfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgQ3l0b3NjYXBlIGZyb20gJ2N5dG9zY2FwZSc7XG5pbXBvcnQgQ3l0b3NjYXBlQ29tcG9uZW50IGZyb20gJ3JlYWN0LWN5dG9zY2FwZWpzJztcbmltcG9ydCBkYWdyZSBmcm9tICdjeXRvc2NhcGUtZGFncmUnO1xuaW1wb3J0IGZjb3NlIGZyb20gJ2N5dG9zY2FwZS1mY29zZSc7XG5pbXBvcnQge0pTT05UcmVlfSBmcm9tICdyZWFjdC1qc29uLXRyZWUnO1xuaW1wb3J0IHtrZXlzLCBtZXJnZVJpZ2h0LCBvbWl0LCBwYXRoLCB2YWx1ZXN9IGZyb20gJ3JhbWRhJztcblxuaW1wb3J0IHtnZXRQYXRofSBmcm9tICcuLi8uLi8uLi9hY3Rpb25zL3BhdGhzJztcbmltcG9ydCB7c3RyaW5naWZ5SWR9IGZyb20gJy4uLy4uLy4uL2FjdGlvbnMvZGVwZW5kZW5jaWVzJztcbmltcG9ydCB7b25FcnJvcn0gZnJvbSAnLi4vLi4vLi4vYWN0aW9ucyc7XG5cbmltcG9ydCAnLi9DYWxsYmFja0dyYXBoQ29udGFpbmVyLmNzcyc7XG5pbXBvcnQgc3R5bGVzaGVldCBmcm9tICcuL0NhbGxiYWNrR3JhcGhDb250YWluZXJTdHlsZXNoZWV0JztcbmltcG9ydCB7XG4gICAgdXBkYXRlU2VsZWN0ZWROb2RlLFxuICAgIHVwZGF0ZUNoYW5nZWRQcm9wcyxcbiAgICB1cGRhdGVDYWxsYmFja1xufSBmcm9tICcuL0NhbGxiYWNrR3JhcGhFZmZlY3RzJztcblxuQ3l0b3NjYXBlLnVzZShkYWdyZSk7XG5DeXRvc2NhcGUudXNlKGZjb3NlKTtcblxuLypcbiAqIEdlbmVyYXRlcyBhbGwgdGhlIGVsZW1lbnRzIChub2RlcywgZWRnZXMpIGZvciB0aGUgZGVwZW5kZW5jeSBncmFwaC5cbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVFbGVtZW50cyhncmFwaHMsIHByb2ZpbGUsIGV4dHJhTGlua3MpIHtcbiAgICBjb25zdCBjb25zdW1lZCA9IFtdO1xuICAgIGNvbnN0IGVsZW1lbnRzID0gW107XG4gICAgY29uc3Qgc3RydWN0dXJlID0ge307XG5cbiAgICBmdW5jdGlvbiByZWNvcmROb2RlKGlkLCByYXdQcm9wZXJ0eSkge1xuICAgICAgICBjb25zdCBwcm9wZXJ0eSA9IHJhd1Byb3BlcnR5LnNwbGl0KCdAJylbMF07XG4gICAgICAgIGNvbnN0IGlkU3RyID0gc3RyaW5naWZ5SWQoaWQpO1xuICAgICAgICBjb25zdCBpZFR5cGUgPSB0eXBlb2YgaWQgPT09ICdvYmplY3QnID8gJ3dpbGRjYXJkJyA6ICdjb21wb25lbnQnO1xuXG4gICAgICAgIC8vIGRhZ3JlIGxheW91dCBoYXMgcHJvYmxlbXMgd2l0aCBlZyBgd2lkdGhgIHByb3BlcnR5IC0gc28gcHJlcGVuZCBhbiBYXG4gICAgICAgIGNvbnN0IHBhcmVudElkID0gaWRTdHI7XG4gICAgICAgIGNvbnN0IGNoaWxkSWQgPSBgJHtwYXJlbnRJZH0uWCR7cHJvcGVydHl9YDtcblxuICAgICAgICBpZiAoIWNvbnN1bWVkLmluY2x1ZGVzKHBhcmVudElkKSkge1xuICAgICAgICAgICAgY29uc3VtZWQucHVzaChwYXJlbnRJZCk7XG4gICAgICAgICAgICBlbGVtZW50cy5wdXNoKHtcbiAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBwYXJlbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGlkU3RyLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBpZFR5cGVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHN0cnVjdHVyZVtwYXJlbnRJZF0gPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghY29uc3VtZWQuaW5jbHVkZXMoY2hpbGRJZCkpIHtcbiAgICAgICAgICAgIGNvbnN1bWVkLnB1c2goY2hpbGRJZCk7XG4gICAgICAgICAgICBlbGVtZW50cy5wdXNoKHtcbiAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBjaGlsZElkLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogcHJvcGVydHksXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogcGFyZW50SWQsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdwcm9wZXJ0eSdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHN0cnVjdHVyZVtwYXJlbnRJZF0ucHVzaChjaGlsZElkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjaGlsZElkO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlY29yZEVkZ2Uoc291cmNlLCB0YXJnZXQsIHR5cGUpIHtcbiAgICAgICAgZWxlbWVudHMucHVzaCh7XG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICAgICAgICAgICAgdGFyZ2V0OiB0YXJnZXQsXG4gICAgICAgICAgICAgICAgdHlwZTogdHlwZVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAoZ3JhcGhzLmNhbGxiYWNrcyB8fCBbXSkucmVkdWNlKCh2aXNpYmxlSW5kZXgsIGNhbGxiYWNrKSA9PiB7XG4gICAgICAgIGlmIChjYWxsYmFjay5oaWRkZW4pIHtcbiAgICAgICAgICAgIHJldHVybiB2aXNpYmxlSW5kZXg7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjYiA9IGBfX2Rhc2hfY2FsbGJhY2tfXy4ke2NhbGxiYWNrLm91dHB1dH1gO1xuICAgICAgICBjb25zdCBjYlByb2ZpbGUgPSBwcm9maWxlLmNhbGxiYWNrc1tjYWxsYmFjay5vdXRwdXRdIHx8IHt9O1xuICAgICAgICBjb25zdCBjb3VudCA9IGNiUHJvZmlsZS5jb3VudCB8fCAwO1xuICAgICAgICBjb25zdCB0aW1lID0gY2JQcm9maWxlLnRvdGFsIHx8IDA7XG5cbiAgICAgICAgZWxlbWVudHMucHVzaCh7XG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgaWQ6IGNiLFxuICAgICAgICAgICAgICAgIGxhYmVsOiBgY2FsbGJhY2suJHt2aXNpYmxlSW5kZXh9YCxcbiAgICAgICAgICAgICAgICB0eXBlOiAnY2FsbGJhY2snLFxuICAgICAgICAgICAgICAgIG1vZGU6IGNhbGxiYWNrLmNsaWVudHNpZGVfZnVuY3Rpb24gPyAnY2xpZW50JyA6ICdzZXJ2ZXInLFxuICAgICAgICAgICAgICAgIGNvdW50OiBjb3VudCxcbiAgICAgICAgICAgICAgICB0aW1lOiBjb3VudCA+IDAgPyBNYXRoLnJvdW5kKHRpbWUgLyBjb3VudCkgOiAwLFxuICAgICAgICAgICAgICAgIGxvYWRpbmdTZXQ6IERhdGUubm93KCksXG4gICAgICAgICAgICAgICAgZXJyb3JTZXQ6IERhdGUubm93KClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgY2FsbGJhY2sub3V0cHV0cy5mb3JFYWNoKCh7aWQsIHByb3BlcnR5fSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgbm9kZUlkID0gcmVjb3JkTm9kZShpZCwgcHJvcGVydHkpO1xuICAgICAgICAgICAgcmVjb3JkRWRnZShjYiwgbm9kZUlkLCAnb3V0cHV0Jyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNhbGxiYWNrLmlucHV0cy5mb3JFYWNoKCh7aWQsIHByb3BlcnR5fSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgbm9kZUlkID0gcmVjb3JkTm9kZShpZCwgcHJvcGVydHkpO1xuICAgICAgICAgICAgcmVjb3JkRWRnZShub2RlSWQsIGNiLCAnaW5wdXQnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY2FsbGJhY2suc3RhdGUuZm9yRWFjaCgoe2lkLCBwcm9wZXJ0eX0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGVJZCA9IHJlY29yZE5vZGUoaWQsIHByb3BlcnR5KTtcbiAgICAgICAgICAgIHJlY29yZEVkZ2Uobm9kZUlkLCBjYiwgJ3N0YXRlJyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB2aXNpYmxlSW5kZXggKyAxO1xuICAgIH0sIDApO1xuXG4gICAgLy8gcHVsbCB0b2dldGhlciBwcm9wcyBpbiB0aGUgc2FtZSBjb21wb25lbnRcbiAgICBpZiAoZXh0cmFMaW5rcykge1xuICAgICAgICB2YWx1ZXMoc3RydWN0dXJlKS5mb3JFYWNoKGNoaWxkSWRzID0+IHtcbiAgICAgICAgICAgIGNoaWxkSWRzLmZvckVhY2goY2hpbGRGcm9tID0+IHtcbiAgICAgICAgICAgICAgICBjaGlsZElkcy5mb3JFYWNoKGNoaWxkVG8gPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRGcm9tICE9PSBjaGlsZFRvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRFZGdlKGNoaWxkRnJvbSwgY2hpbGRUbywgJ2hpZGRlbicpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVsZW1lbnRzO1xufVxuXG5mdW5jdGlvbiByZWR1Y2VTdGF0dXMoc3RhdHVzKSB7XG4gICAgaWYgKGtleXMoc3RhdHVzKS5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgcmV0dXJuIHN0YXR1cy5sYXRlc3Q7XG4gICAgfVxuICAgIHJldHVybiBzdGF0dXM7XG59XG5cbmZ1bmN0aW9uIGZsYXR0ZW5PdXRwdXRzKHJlcykge1xuICAgIGNvbnN0IG91dHB1dHMgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGlkU3RyIGluIHJlcykge1xuICAgICAgICBmb3IgKGNvbnN0IHByb3AgaW4gcmVzW2lkU3RyXSkge1xuICAgICAgICAgICAgb3V0cHV0c1tpZFN0ciArICcuJyArIHByb3BdID0gcmVzW2lkU3RyXVtwcm9wXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0cztcbn1cblxuZnVuY3Rpb24gZmxhdHRlbklucHV0cyhpbkFycmF5LCBmaW5hbCkge1xuICAgIChpbkFycmF5IHx8IFtdKS5mb3JFYWNoKGluSXRlbSA9PiB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGluSXRlbSkpIHtcbiAgICAgICAgICAgIGZsYXR0ZW5JbnB1dHMoaW5JdGVtLCBmaW5hbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB7aWQsIHByb3BlcnR5LCB2YWx1ZX0gPSBpbkl0ZW07XG4gICAgICAgICAgICBmaW5hbFtzdHJpbmdpZnlJZChpZCkgKyAnLicgKyBwcm9wZXJ0eV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBmaW5hbDtcbn1cblxuZnVuY3Rpb24gY2xlYW5PdXRwdXRJZChvdXRwdXRJZCkge1xuICAgIHJldHVybiBvdXRwdXRJZFxuICAgICAgICAucmVwbGFjZSgvKF5cXC5cXC58XFwuXFwuJCkvZywgJycpXG4gICAgICAgIC5zcGxpdCgnLi4uJylcbiAgICAgICAgLnJlZHVjZShcbiAgICAgICAgICAgIChhZ2csIG5leHQpID0+XG4gICAgICAgICAgICAgICAgYWdnLmNvbmNhdChcbiAgICAgICAgICAgICAgICAgICAgbmV4dC5yZXBsYWNlKC8oLipcXC4uKikoQC4rKSQvLCAoYSwgYikgPT4gYiArICcgKER1cGxpY2F0ZSknKVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICBbXVxuICAgICAgICApXG4gICAgICAgIC5qb2luKCcuLi4nKTtcbn1cblxuLy8gbGVuKCdfX2Rhc2hfY2FsbGJhY2tfXy4nKVxuY29uc3QgY2JQcmVmaXhMZW4gPSAxODtcblxuY29uc3QgZGFncmVMYXlvdXQgPSB7XG4gICAgbmFtZTogJ2RhZ3JlJyxcbiAgICBwYWRkaW5nOiAxMCxcbiAgICByYW5rZXI6ICd0aWdodC10cmVlJ1xufTtcblxuY29uc3QgZm9yY2VMYXlvdXQgPSB7bmFtZTogJ2Zjb3NlJywgcGFkZGluZzogMTAsIGFuaW1hdGU6IGZhbHNlfTtcblxuY29uc3QgbGF5b3V0cyA9IHtcbiAgICAndG9wLWRvd24nOiB7Li4uZGFncmVMYXlvdXQsIHNwYWNpbmdGYWN0b3I6IDAuOH0sXG4gICAgJ2xlZnQtcmlnaHQnOiB7Li4uZGFncmVMYXlvdXQsIG5vZGVTZXA6IDAsIHJhbmtTZXA6IDgwLCByYW5rRGlyOiAnTFInfSxcbiAgICBmb3JjZTogZm9yY2VMYXlvdXQsXG4gICAgJ2ZvcmNlLWxvb3NlJzogZm9yY2VMYXlvdXRcbn07XG5cbmZ1bmN0aW9uIENhbGxiYWNrR3JhcGgoKSB7XG4gICAgLy8gR3JhYiBpdGVtcyBmcm9tIHRoZSByZWR1eCBzdG9yZS5cbiAgICBjb25zdCBwYXRocyA9IHVzZVNlbGVjdG9yKHN0YXRlID0+IHN0YXRlLnBhdGhzKTtcbiAgICBjb25zdCBsYXlvdXQgPSB1c2VTZWxlY3RvcihzdGF0ZSA9PiBzdGF0ZS5sYXlvdXQpO1xuICAgIGNvbnN0IGdyYXBocyA9IHVzZVNlbGVjdG9yKHN0YXRlID0+IHN0YXRlLmdyYXBocyk7XG4gICAgY29uc3QgcHJvZmlsZSA9IHVzZVNlbGVjdG9yKHN0YXRlID0+IHN0YXRlLnByb2ZpbGUpO1xuICAgIGNvbnN0IGNoYW5nZWQgPSB1c2VTZWxlY3RvcihzdGF0ZSA9PiBzdGF0ZS5jaGFuZ2VkKTtcbiAgICBjb25zdCBsaWZlY3ljbGVTdGF0ZSA9IHVzZVNlbGVjdG9yKHN0YXRlID0+IHN0YXRlLmFwcExpZmVjeWNsZSk7XG5cbiAgICAvLyBLZWVwIHRyYWNrIG9mIGN5dG9zY2FwZSByZWZlcmVuY2UgYW5kIHVzZXIgc2VsZWN0ZWQgaXRlbXMuXG4gICAgY29uc3QgW3NlbGVjdGVkLCBzZXRTZWxlY3RlZF0gPSB1c2VTdGF0ZShudWxsKTtcbiAgICBjb25zdCBbY3l0b3NjYXBlLCBzZXRDeXRvc2NhcGVdID0gdXNlU3RhdGUobnVsbCk7XG5cbiAgICBjb25zdCB7Z3JhcGhMYXlvdXR9ID0gcHJvZmlsZTtcbiAgICBjb25zdCBjaG9zZW5UeXBlID0gZ3JhcGhMYXlvdXQ/Ll9jaG9zZW5UeXBlO1xuICAgIGNvbnN0IGxheW91dFNlbGVjdG9yID0gdXNlUmVmKG51bGwpO1xuICAgIGNvbnN0IFtsYXlvdXRUeXBlLCBzZXRMYXlvdXRUeXBlXSA9IHVzZVN0YXRlKGNob3NlblR5cGUgfHwgJ3RvcC1kb3duJyk7XG5cbiAgICAvLyBHZW5lcmF0ZSBhbmQgbWVtb2l6ZSB0aGUgZWxlbWVudHMuXG4gICAgY29uc3QgZWxlbWVudHMgPSB1c2VNZW1vKFxuICAgICAgICAoKSA9PiBnZW5lcmF0ZUVsZW1lbnRzKGdyYXBocywgcHJvZmlsZSwgbGF5b3V0VHlwZSA9PT0gJ2ZvcmNlJyksXG4gICAgICAgIFtncmFwaHMsIGxheW91dFR5cGVdXG4gICAgKTtcblxuICAgIC8vIEN1c3RvbSBob29rIHRvIG1ha2Ugc3VyZSBjeXRvc2NhcGUgaXMgbG9hZGVkLlxuICAgIGNvbnN0IHVzZUN5dG9zY2FwZUVmZmVjdCA9IChlZmZlY3QsIGNvbmRpdGlvbikgPT4ge1xuICAgICAgICB1c2VFZmZlY3QoXG4gICAgICAgICAgICAoKSA9PiAoY3l0b3NjYXBlICYmIGVmZmVjdChjeXRvc2NhcGUpKSB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgICBjb25kaXRpb25cbiAgICAgICAgKTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gZ2V0Q29tcG9uZW50KGlkKSB7XG4gICAgICAgIC8vIGZvciBub3cgaWdub3JlIHBhdHRlcm4tbWF0Y2hpbmcgSURzXG4gICAgICAgIC8vIHRvIGRvIGJldHRlciB3ZSBtYXkgbmVlZCB0byBzdG9yZSB0aGUgKmFjdHVhbCogSURzIHVzZWQgZm9yIGVhY2hcbiAgICAgICAgLy8gY2FsbGJhY2sgaW52b2NhdGlvbiwgc2luY2UgdGhleSBuZWVkIG5vdCBtYXRjaCB3aGF0J3Mgb24gdGhlIHBhZ2Ugbm93LlxuICAgICAgICBpZiAoaWQuY2hhckF0KDApID09PSAneycpIHtcbiAgICAgICAgICAgIGhhc1BhdHRlcm5zID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaWRQYXRoID0gZ2V0UGF0aChwYXRocywgaWQpO1xuICAgICAgICByZXR1cm4gaWRQYXRoID8gcGF0aChpZFBhdGgsIGxheW91dCkgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0UHJvcFZhbHVlKGRhdGEpIHtcbiAgICAgICAgY29uc3QgcGFyZW50ID0gZ2V0Q29tcG9uZW50KGRhdGEucGFyZW50KTtcbiAgICAgICAgcmV0dXJuIHBhcmVudCA/IHBhcmVudC5wcm9wc1tkYXRhLmxhYmVsXSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRQcmVzZXRMYXlvdXQoe2N5fSkge1xuICAgICAgICBjb25zdCBwb3NpdGlvbnMgPSB7fTtcbiAgICAgICAgY3kubm9kZXMoKS5lYWNoKG4gPT4ge1xuICAgICAgICAgICAgcG9zaXRpb25zW24uaWQoKV0gPSBuLnBvc2l0aW9uKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEhhY2shIFdlJ3JlIG11dGF0aW5nIHRoZSByZWR1eCBzdG9yZSBkaXJlY3RseSBoZXJlLCByYXRoZXIgdGhhblxuICAgICAgICAvLyBkaXNwYXRjaGluZyBhbiBhY3Rpb24sIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0aGlzIHRvIHRyaWdnZXIgYVxuICAgICAgICAvLyByZXJlbmRlciwgd2UganVzdCB3YW50IHRoZSBsYXlvdXQgdG8gcGVyc2lzdCB3aGVuIHRoZSBjYWxsYmFjayBncmFwaFxuICAgICAgICAvLyBpcyByZXJlbmRlcmVkIC0gZWl0aGVyIGJlY2F1c2UgdGhlcmUncyBuZXcgcHJvZmlsZSBpbmZvcm1hdGlvbiB0b1xuICAgICAgICAvLyBkaXNwbGF5IG9yIGJlY2F1c2UgdGhlIGdyYXBoIHdhcyBjbG9zZWQgYW5kIHJlb3BlbmVkLiBUaGUgbGF0dGVyIGlzXG4gICAgICAgIC8vIHRoZSByZWFzb24gd2UncmUgbm90IHVzaW5nIGNvbXBvbmVudCBzdGF0ZSB0byBzdG9yZSB0aGUgbGF5b3V0LlxuICAgICAgICBwcm9maWxlLmdyYXBoTGF5b3V0ID0ge1xuICAgICAgICAgICAgbmFtZTogJ3ByZXNldCcsXG4gICAgICAgICAgICBmaXQ6IGZhbHNlLFxuICAgICAgICAgICAgcG9zaXRpb25zLFxuICAgICAgICAgICAgem9vbTogY3kuem9vbSgpLFxuICAgICAgICAgICAgcGFuOiBjeS5wYW4oKSxcbiAgICAgICAgICAgIF9jaG9zZW5UeXBlOiBsYXlvdXRTZWxlY3Rvci5jdXJyZW50Py52YWx1ZVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIEFkZHMgY2FsbGJhY2tzIG9uY2UgY3ljdG9zY2FwZSBpcyBpbml0aWFsaXplZC5cbiAgICB1c2VDeXRvc2NhcGVFZmZlY3QoXG4gICAgICAgIGN5ID0+IHtcbiAgICAgICAgICAgIGN5dG9zY2FwZS5vbigndGFwJywgJ25vZGUnLCBlID0+IHNldFNlbGVjdGVkKGUudGFyZ2V0KSk7XG4gICAgICAgICAgICBjeXRvc2NhcGUub24oJ3RhcCcsIGUgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlLnRhcmdldCA9PT0gY3kpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0U2VsZWN0ZWQobnVsbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjeXRvc2NhcGUub24oJ3pvb20nLCBzZXRQcmVzZXRMYXlvdXQpO1xuICAgICAgICAgICAgY3l0b3NjYXBlLm9uKCdwYW4nLCBzZXRQcmVzZXRMYXlvdXQpO1xuICAgICAgICAgICAgY3l0b3NjYXBlLm5vZGVzKCkub24oJ3Bvc2l0aW9uJywgc2V0UHJlc2V0TGF5b3V0KTtcbiAgICAgICAgfSxcbiAgICAgICAgW2N5dG9zY2FwZV1cbiAgICApO1xuXG4gICAgLy8gU2V0IG5vZGUgY2xhc3NlcyBvbiBzZWxlY3RlZC5cbiAgICB1c2VDeXRvc2NhcGVFZmZlY3QoXG4gICAgICAgIGN5ID0+IHNlbGVjdGVkICYmIHVwZGF0ZVNlbGVjdGVkTm9kZShjeSwgc2VsZWN0ZWQuZGF0YSgpLmlkKSxcbiAgICAgICAgW3NlbGVjdGVkXVxuICAgICk7XG5cbiAgICAvLyBGbGFzaCBjbGFzc2VzIHdoZW4gcHJvcHMgY2hhbmdlLiBVc2VzIGNoYW5nZWQgYXMgYSB0cmlnZ2VyLiBBbHNvXG4gICAgLy8gZmxhc2ggYWxsIGlucHV0IGVkZ2VzIG9yaWdpbmF0aW5nIGZyb20gdGhpcyBub2RlIGFuZCBoaWdobGlnaHRcbiAgICAvLyB0aGUgc3VidHJlZSB0aGF0IGNvbnRhaW5zIHRoZSBzZWxlY3RlZCBub2RlLlxuICAgIHVzZUN5dG9zY2FwZUVmZmVjdChcbiAgICAgICAgY3kgPT4gY2hhbmdlZCAmJiB1cGRhdGVDaGFuZ2VkUHJvcHMoY3ksIGNoYW5nZWQuaWQsIGNoYW5nZWQucHJvcHMpLFxuICAgICAgICBbY2hhbmdlZF1cbiAgICApO1xuXG4gICAgLy8gVXBkYXRlIGNhbGxiYWNrcyBmcm9tIHByb2ZpbGluZyBpbmZvcm1hdGlvbi5cbiAgICB1c2VDeXRvc2NhcGVFZmZlY3QoXG4gICAgICAgIGN5ID0+XG4gICAgICAgICAgICBwcm9maWxlLnVwZGF0ZWQuZm9yRWFjaChjYiA9PlxuICAgICAgICAgICAgICAgIHVwZGF0ZUNhbGxiYWNrKGN5LCBjYiwgcHJvZmlsZS5jYWxsYmFja3NbY2JdKVxuICAgICAgICAgICAgKSxcbiAgICAgICAgW3Byb2ZpbGUudXBkYXRlZF1cbiAgICApO1xuXG4gICAgaWYgKGxpZmVjeWNsZVN0YXRlICE9PSAnSFlEUkFURUQnKSB7XG4gICAgICAgIC8vIElmIHdlIGdldCBoZXJlIHRvbyBlYXJseSAtIG1vc3QgbGlrZWx5IGR1cmluZyBob3QgcmVsb2FkaW5nIC0gdGhlblxuICAgICAgICAvLyB3ZSBuZWVkIHRvIGJhaWwgb3V0IGFuZCB3YWl0IGZvciB0aGUgZnVsbCBzdGF0ZSB0byBiZSBhdmFpbGFibGVcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdkYXNoLWNhbGxiYWNrLWRhZy0tY29udGFpbmVyJz5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1jYWxsYmFjay1kYWctLW1lc3NhZ2UnPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2PldhaXRpbmcgZm9yIGFwcCB0byBiZSByZWFkeS4uLjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRklYTUU6IE1vdmUgdG8gYSBuZXcgY29tcG9uZW50P1xuICAgIC8vIEdlbmVyYXRlIHRoZSBlbGVtZW50IGludHJvc3BlY3Rpb24gZGF0YS5cbiAgICBsZXQgZWxlbWVudE5hbWUgPSAnJztcbiAgICBsZXQgZWxlbWVudEluZm8gPSB7fTtcbiAgICBsZXQgaGFzUGF0dGVybnMgPSBmYWxzZTtcblxuICAgIGlmIChzZWxlY3RlZCkge1xuICAgICAgICBjb25zdCBkYXRhID0gc2VsZWN0ZWQuZGF0YSgpO1xuXG4gICAgICAgIHN3aXRjaCAoZGF0YS50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdjb21wb25lbnQnOiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdCA9IG9taXQoWydpZCddLCBnZXRDb21wb25lbnQoZGF0YS5pZCk/LnByb3BzKTtcbiAgICAgICAgICAgICAgICBlbGVtZW50SW5mbyA9IHJlc3Q7XG4gICAgICAgICAgICAgICAgZWxlbWVudE5hbWUgPSBkYXRhLmlkO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlICdwcm9wZXJ0eSc6IHtcbiAgICAgICAgICAgICAgICBlbGVtZW50TmFtZSA9IGRhdGEucGFyZW50O1xuICAgICAgICAgICAgICAgIGVsZW1lbnRJbmZvW2RhdGEubGFiZWxdID0gZ2V0UHJvcFZhbHVlKGRhdGEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBjYWxsYmFja1xuICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIGVsZW1lbnRJbmZvLnR5cGUgPSBkYXRhLm1vZGU7XG5cbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdWlkIGFuZCBzZXQgcHJvZmlsZS5cbiAgICAgICAgICAgICAgICBjb25zdCBjYWxsYmFja091dHB1dElkID0gZGF0YS5pZC5zbGljZShjYlByZWZpeExlbik7XG4gICAgICAgICAgICAgICAgZWxlbWVudE5hbWUgPSBjbGVhbk91dHB1dElkKGNhbGxiYWNrT3V0cHV0SWQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNiUHJvZmlsZSA9IHByb2ZpbGUuY2FsbGJhY2tzW2NhbGxiYWNrT3V0cHV0SWRdO1xuICAgICAgICAgICAgICAgIGlmIChjYlByb2ZpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICAgICAgICAgICAgY291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXR3b3JrLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLFxuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWwsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVcbiAgICAgICAgICAgICAgICAgICAgfSA9IGNiUHJvZmlsZTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhdmcgPSB2ID0+IE1hdGgucm91bmQodiAvIChjb3VudCB8fCAxKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudEluZm9bJ2NhbGwgY291bnQnXSA9IGNvdW50O1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50SW5mby5zdGF0dXMgPSByZWR1Y2VTdGF0dXMoc3RhdHVzKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0aW1pbmcgPSAoZWxlbWVudEluZm9bJ3RpbWUgKGF2ZyBtaWxsaXNlY29uZHMpJ10gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbDogYXZnKHRvdGFsKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGU6IGF2Zyhjb21wdXRlKVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEubW9kZSA9PT0gJ3NlcnZlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbWluZy5uZXR3b3JrID0gYXZnKG5ldHdvcmsudGltZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJbmZvWydkYXRhIHRyYW5zZmVyIChhdmcgYnl0ZXMpJ10gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWQ6IGF2ZyhuZXR3b3JrLmRvd25sb2FkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGxvYWQ6IGF2ZyhuZXR3b3JrLnVwbG9hZClcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcmVzb3VyY2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aW1pbmdbJ3VzZXI6ICcgKyBrZXldID0gYXZnKHJlc291cmNlc1trZXldKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJbmZvLm91dHB1dHMgPSBmbGF0dGVuT3V0cHV0cyhyZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50SW5mby5pbnB1dHMgPSBmbGF0dGVuSW5wdXRzKGlucHV0cywge30pO1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50SW5mby5zdGF0ZSA9IGZsYXR0ZW5JbnB1dHMoc3RhdGUsIHt9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50SW5mb1snY2FsbCBjb3VudCddID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjeUxheW91dCA9XG4gICAgICAgIGNob3NlblR5cGUgPT09IGxheW91dFR5cGVcbiAgICAgICAgICAgID8gZ3JhcGhMYXlvdXRcbiAgICAgICAgICAgIDogbWVyZ2VSaWdodChsYXlvdXRzW2xheW91dFR5cGVdLCB7cmVhZHk6IHNldFByZXNldExheW91dH0pO1xuXG4gICAgcmV0dXJuIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtY2FsbGJhY2stZGFnLS1jb250YWluZXInPlxuICAgICAgICAgICAgPEN5dG9zY2FwZUNvbXBvbmVudFxuICAgICAgICAgICAgICAgIHN0eWxlPXt7d2lkdGg6ICcxMDAlJywgaGVpZ2h0OiAnMTAwJSd9fVxuICAgICAgICAgICAgICAgIGN5PXtzZXRDeXRvc2NhcGV9XG4gICAgICAgICAgICAgICAgZWxlbWVudHM9e2VsZW1lbnRzfVxuICAgICAgICAgICAgICAgIGxheW91dD17Y3lMYXlvdXR9XG4gICAgICAgICAgICAgICAgc3R5bGVzaGVldD17c3R5bGVzaGVldH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICB7c2VsZWN0ZWQgPyAoXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtY2FsbGJhY2stZGFnLS1pbmZvJz5cbiAgICAgICAgICAgICAgICAgICAge2hhc1BhdHRlcm5zID8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmZvIGlzbid0IHN1cHBvcnRlZCBmb3IgcGF0dGVybi1tYXRjaGluZyBJRHMgYXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIHRpbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgICAgICAgICAgPEpTT05UcmVlXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhPXtlbGVtZW50SW5mb31cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lPSdzdW1tZXJmcnVpdCdcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsUmVuZGVyZXI9e19rZXlzID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2tleXMubGVuZ3RoID09PSAxID8gZWxlbWVudE5hbWUgOiBfa2V5c1swXVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SXRlbVN0cmluZz17KHR5cGUsIGRhdGEsIGl0ZW1UeXBlKSA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e2l0ZW1UeXBlfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRFeHBhbmROb2RlPXsoa2V5TmFtZSwgZGF0YSwgbGV2ZWwpID0+IGxldmVsIDwgMX1cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0nZGFzaC1jYWxsYmFjay1kYWctLWxheW91dFNlbGVjdG9yJ1xuICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtlID0+IHNldExheW91dFR5cGUoZS50YXJnZXQudmFsdWUpfVxuICAgICAgICAgICAgICAgIHZhbHVlPXtsYXlvdXRUeXBlfVxuICAgICAgICAgICAgICAgIHJlZj17bGF5b3V0U2VsZWN0b3J9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge2tleXMobGF5b3V0cykubWFwKGsgPT4gKFxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPXtrfSBrZXk9e2t9PlxuICAgICAgICAgICAgICAgICAgICAgICAge2t9XG4gICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICk7XG59XG5cbkNhbGxiYWNrR3JhcGgucHJvcFR5cGVzID0ge307XG5cbmNsYXNzIFVuY29ubmVjdGVkQ2FsbGJhY2tHcmFwaENvbnRhaW5lciBleHRlbmRzIENvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgICB0aGlzLnN0YXRlID0ge2hhc0Vycm9yOiBmYWxzZX07XG4gICAgfVxuXG4gICAgc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcihfKSB7XG4gICAgICAgIHJldHVybiB7aGFzRXJyb3I6IHRydWV9O1xuICAgIH1cblxuICAgIGNvbXBvbmVudERpZENhdGNoKGVycm9yLCBpbmZvKSB7XG4gICAgICAgIGNvbnN0IHtkaXNwYXRjaH0gPSB0aGlzLnByb3BzO1xuICAgICAgICBkaXNwYXRjaChcbiAgICAgICAgICAgIG9uRXJyb3Ioe1xuICAgICAgICAgICAgICAgIG15SUQ6IHRoaXMuc3RhdGUubXlJRCxcbiAgICAgICAgICAgICAgICB0eXBlOiAnZnJvbnRFbmQnLFxuICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgIGluZm9cbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS5oYXNFcnJvciA/IChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdkYXNoLWNhbGxiYWNrLWRhZy0tY29udGFpbmVyJz5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1jYWxsYmFjay1kYWctLW1lc3NhZ2UnPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2Pk9vcHMhIFRoZSBjYWxsYmFjayBncmFwaCB0aHJldyBhbiBlcnJvci48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5DaGVjayB0aGUgZXJyb3IgbGlzdCBmb3IgZGV0YWlscy48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICApIDogKFxuICAgICAgICAgICAgPENhbGxiYWNrR3JhcGggLz5cbiAgICAgICAgKTtcbiAgICB9XG59XG5cblVuY29ubmVjdGVkQ2FsbGJhY2tHcmFwaENvbnRhaW5lci5wcm9wVHlwZXMgPSB7XG4gICAgZGlzcGF0Y2g6IFByb3BUeXBlcy5mdW5jXG59O1xuXG5jb25zdCBDYWxsYmFja0dyYXBoQ29udGFpbmVyID0gY29ubmVjdChudWxsLCBkaXNwYXRjaCA9PiAoe2Rpc3BhdGNofSkpKFxuICAgIFVuY29ubmVjdGVkQ2FsbGJhY2tHcmFwaENvbnRhaW5lclxuKTtcblxuZXhwb3J0IHtDYWxsYmFja0dyYXBoQ29udGFpbmVyfTtcbiIsImNvbnN0IHN0eWxlc2hlZXQgPSBbXG4gICAge1xuICAgICAgICBzZWxlY3RvcjogJyonLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgJ2ZvbnQtc2l6ZSc6IDEyLFxuICAgICAgICAgICAgJ2ZvbnQtZmFtaWx5JzogJ1ZlcmRhbmEsIHNhbnMtc2VyaWYnXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAge1xuICAgICAgICBzZWxlY3RvcjogJ2VkZ2UnLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgd2lkdGg6IDIsXG4gICAgICAgICAgICAnbGluZS1jb2xvcic6ICcjODg4ODg4JyxcbiAgICAgICAgICAgICd0YXJnZXQtYXJyb3ctY29sb3InOiAnIzg4ODg4OCcsXG4gICAgICAgICAgICAndGFyZ2V0LWFycm93LXNoYXBlJzogJ3RyaWFuZ2xlJyxcbiAgICAgICAgICAgICd0YXJnZXQtYXJyb3ctZmlsbCc6ICdmaWxsZWQnLFxuICAgICAgICAgICAgJ2Fycm93LXNjYWxlJzogMSxcbiAgICAgICAgICAgICdjdXJ2ZS1zdHlsZSc6ICdiZXppZXInLFxuICAgICAgICAgICAgJ2NvbnRyb2wtcG9pbnQtc3RlcC1zaXplJzogNDAsXG4gICAgICAgICAgICAndHJhbnNpdGlvbi1wcm9wZXJ0eSc6ICdsaW5lLWNvbG9yLCB0YXJnZXQtYXJyb3ctY29sb3InLFxuICAgICAgICAgICAgJ3RyYW5zaXRpb24tZHVyYXRpb24nOiAnMC4yNXMnLFxuICAgICAgICAgICAgJ3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uJzogJ2Vhc2UtaW4tb3V0LXNpbmUnXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAge1xuICAgICAgICBzZWxlY3RvcjogJ2VkZ2VbdHlwZT1cImhpZGRlblwiXScsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICBkaXNwbGF5OiAnbm9uZSdcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICB7XG4gICAgICAgIHNlbGVjdG9yOiAnZWRnZVt0eXBlPVwib3V0cHV0XCJdJyxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgICdsaW5lLWNvbG9yJzogJyMwMDgwRDAnLFxuICAgICAgICAgICAgJ3RhcmdldC1hcnJvdy1jb2xvcic6ICcjMDA4MEQwJ1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHtcbiAgICAgICAgc2VsZWN0b3I6ICdlZGdlW3R5cGU9XCJzdGF0ZVwiXScsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAnbGluZS1zdHlsZSc6ICdkYXNoZWQnXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAge1xuICAgICAgICBzZWxlY3RvcjogJ25vZGUnLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgY29sb3I6ICcjMzMzMzMzJyxcbiAgICAgICAgICAgIHBhZGRpbmc6IDYsXG4gICAgICAgICAgICAndGV4dC12YWxpZ24nOiAnY2VudGVyJyxcbiAgICAgICAgICAgICd0ZXh0LWhhbGlnbic6ICdjZW50ZXInLFxuICAgICAgICAgICAgJ2JvcmRlci13aWR0aCc6IDIsXG4gICAgICAgICAgICAnYm9yZGVyLW9wYWNpdHknOiAwLFxuICAgICAgICAgICAgJ2JvcmRlci1zdHlsZSc6ICdzb2xpZCcsXG4gICAgICAgICAgICAnYm9yZGVyLWNvbG9yJzogJyM4ODg4ODgnLFxuICAgICAgICAgICAgJ3RyYW5zaXRpb24tcHJvcGVydHknOiAnYm9yZGVyLW9wYWNpdHknLFxuICAgICAgICAgICAgJ3RyYW5zaXRpb24tZHVyYXRpb24nOiAnMC4yNXMnLFxuICAgICAgICAgICAgJ3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uJzogJ2Vhc2UtaW4tb3V0LXNpbmUnXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAge1xuICAgICAgICBzZWxlY3RvcjogJ25vZGVbdHlwZT1cImNhbGxiYWNrXCJdJyxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgIHdpZHRoOiAzNSxcbiAgICAgICAgICAgIGhlaWdodDogMjUsXG4gICAgICAgICAgICBzaGFwZTogJ3JvdW5kLXJlY3RhbmdsZScsXG4gICAgICAgICAgICBsYWJlbDogZSA9PiBgJHtlLmRhdGEoKS5jb3VudH1cXG4ke2UuZGF0YSgpLnRpbWV9IG1zYCxcbiAgICAgICAgICAgICd0ZXh0LXdyYXAnOiAnd3JhcCcsXG4gICAgICAgICAgICAndGV4dC1qdXN0aWZpY2F0aW9uJzogJ2NlbnRlcidcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICB7XG4gICAgICAgIHNlbGVjdG9yOiAnbm9kZVt0eXBlPVwiY2FsbGJhY2tcIl1bbW9kZT1cImNsaWVudFwiXScsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICBjb2xvcjogJyMzMjMzMzAnLFxuICAgICAgICAgICAgJ2JhY2tncm91bmQtY29sb3InOiAnI0YwREI0RidcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICB7XG4gICAgICAgIHNlbGVjdG9yOiAnbm9kZVt0eXBlPVwiY2FsbGJhY2tcIl1bbW9kZT1cInNlcnZlclwiXScsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICBjb2xvcjogJyMzMjMzMzAnLFxuICAgICAgICAgICAgJ2JhY2tncm91bmQtY29sb3InOiAnIzAwQ0M5NidcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICB7XG4gICAgICAgIHNlbGVjdG9yOiAnbm9kZVt0eXBlPVwiY29tcG9uZW50XCJdLCBub2RlW3R5cGU9XCJ3aWxkY2FyZFwiXScsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICB3aWR0aDogJ2xhYmVsJyxcbiAgICAgICAgICAgIC8vIGhlaWdodDogJ2xhYmVsJyxcbiAgICAgICAgICAgIHNoYXBlOiAncmVjdGFuZ2xlJyxcbiAgICAgICAgICAgIGNvbnRlbnQ6IGUgPT4gZS5kYXRhKCkubGFiZWwucmVwbGFjZSgvXCIvZywgJycpLFxuICAgICAgICAgICAgJ3RleHQtdmFsaWduJzogJ3RvcCcsXG4gICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6ICcjQjlDMkNFJ1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHtcbiAgICAgICAgc2VsZWN0b3I6ICdub2RlW3R5cGU9XCJwcm9wZXJ0eVwiXScsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICB3aWR0aDogJ2xhYmVsJyxcbiAgICAgICAgICAgIGhlaWdodDogMjAsXG4gICAgICAgICAgICBzaGFwZTogJ3JlY3RhbmdsZScsXG4gICAgICAgICAgICBjb250ZW50OiAnZGF0YShsYWJlbCknLFxuICAgICAgICAgICAgY29sb3I6ICd3aGl0ZScsXG4gICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6ICcjMTA5REZGJ1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHtcbiAgICAgICAgc2VsZWN0b3I6ICcuc2VsZWN0ZWQtbm9kZScsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICBnaG9zdDogJ3llcycsXG4gICAgICAgICAgICAnZ2hvc3Qtb2Zmc2V0LXgnOiAyLFxuICAgICAgICAgICAgJ2dob3N0LW9mZnNldC15JzogMixcbiAgICAgICAgICAgICdnaG9zdC1vcGFjaXR5JzogMC4yNSxcbiAgICAgICAgICAgICdib3JkZXItb3BhY2l0eSc6IDFcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICB7XG4gICAgICAgIHNlbGVjdG9yOiAnLnByb3AtY2hhbmdlZCwgLmNhbGxiYWNrLWxvYWRpbmcnLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgJ2JvcmRlci1jb2xvcic6ICcjQ0M0M0I3JyxcbiAgICAgICAgICAgICdib3JkZXItd2lkdGgnOiAyLFxuICAgICAgICAgICAgJ2JvcmRlci1vcGFjaXR5JzogMVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIHtcbiAgICAgICAgc2VsZWN0b3I6ICcuY2FsbGJhY2stZXJyb3InLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgJ2JhY2tncm91bmQtY29sb3InOiAnI0UxMzMyRSdcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICB7XG4gICAgICAgIHNlbGVjdG9yOiAnLnRyaWdnZXJlZCcsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAnbGluZS1jb2xvcic6ICcjQ0M0M0I3JyxcbiAgICAgICAgICAgICd0YXJnZXQtYXJyb3ctY29sb3InOiAnI0NDNDNCNydcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICB7XG4gICAgICAgIHNlbGVjdG9yOiAnLmluYWN0aXZlJyxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgIG9wYWNpdHk6IDAuNVxuICAgICAgICB9XG4gICAgfVxuXTtcblxuZXhwb3J0IGRlZmF1bHQgc3R5bGVzaGVldDtcbiIsImltcG9ydCB7U1RBVFVTLCBTVEFUVVNNQVB9IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cy9jb25zdGFudHMnO1xuXG4vKipcbiAqIGdldEVkZ2VUeXBlc1xuICpcbiAqIEZpbmRzIGFsbCBlZGdlcyBjb25uZWN0ZWQgdG8gYSBub2RlIGFuZCBzcGxpdHMgdGhlbSBieSB0eXBlLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBub2RlIC0gQ3l0b3NjYXBlIG5vZGUuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSAtIE9iamVjdCBjb250YWluaW5nIHRoZSBlZGdlcywgc29ydGVkIGJ5IHR5cGUuXG4gKi9cbmZ1bmN0aW9uIGdldEVkZ2VUeXBlcyhub2RlKSB7XG4gICAgY29uc3QgZWxlbWVudHMgPSBub2RlLmNvbm5lY3RlZEVkZ2VzKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaW5wdXQ6IGVsZW1lbnRzLmZpbHRlcignW3R5cGUgPSBcImlucHV0XCJdJyksXG4gICAgICAgIHN0YXRlOiBlbGVtZW50cy5maWx0ZXIoJ1t0eXBlID0gXCJzdGF0ZVwiXScpLFxuICAgICAgICBvdXRwdXQ6IGVsZW1lbnRzLmZpbHRlcignW3R5cGUgPSBcIm91dHB1dFwiXScpXG4gICAgfTtcbn1cblxuLyoqXG4gKiB1cGRhdGVTZWxlY3RlZFxuICpcbiAqIFVwZGF0ZXMgdGhlIGNsYXNzZXMgb2YgdGhlIHNlbGVjdGVkIG5vZGUgYW5kIHJlY2VudGVycyB0aGUgdmlld3BvcnQuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGN5IC0gUmVmZXJlbmNlIHRvIHRoZSBjeXRvc2NhcGUgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge1N0cmluZ30gaWQgLSBUaGUgaWQgb2YgdGhlIHNlbGVjdGVkIG5vZGUuXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb259IC0gY2xlYW51cCBmdW5jdGlvbiwgZm9yIHVzZUVmZmVjdCBob29rXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTZWxlY3RlZE5vZGUoY3ksIGlkKSB7XG4gICAgZnVuY3Rpb24gYXNjZW5kKG5vZGUsIGNvbGxlY3Rpb24sIHZpc2l0ZWQgPSBuZXcgU2V0KCkpIHtcbiAgICAgICAgaWYgKHZpc2l0ZWQuaGFzKG5vZGUuaWQoKSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2aXNpdGVkLmFkZChub2RlLmlkKCkpO1xuICAgICAgICBjb25zdCB0eXBlID0gbm9kZS5kYXRhKCkudHlwZSA9PT0gJ2NhbGxiYWNrJyA/ICdpbnB1dCcgOiAnb3V0cHV0JztcbiAgICAgICAgY29uc3QgZWRnZXMgPSBnZXRFZGdlVHlwZXMobm9kZSlbdHlwZV07XG4gICAgICAgIGNvbnN0IHBhcmVudHMgPSBlZGdlcy5zb3VyY2VzKCk7XG4gICAgICAgIGNvbGxlY3Rpb24ubWVyZ2UoZWRnZXMpO1xuICAgICAgICBjb2xsZWN0aW9uLm1lcmdlKHBhcmVudHMpO1xuICAgICAgICBpZiAobm9kZS5kYXRhKCkudHlwZSA9PT0gJ3Byb3BlcnR5Jykge1xuICAgICAgICAgICAgY29sbGVjdGlvbi5tZXJnZShub2RlLmFuY2VzdG9ycygpKTtcbiAgICAgICAgfVxuICAgICAgICBwYXJlbnRzLmZvckVhY2gobm9kZSA9PiBhc2NlbmQobm9kZSwgY29sbGVjdGlvbiwgdmlzaXRlZCkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlc2NlbmQobm9kZSwgY29sbGVjdGlvbiwgdmlzaXRlZCA9IG5ldyBTZXQoKSkge1xuICAgICAgICBpZiAodmlzaXRlZC5oYXMobm9kZS5pZCgpKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZpc2l0ZWQuYWRkKG5vZGUuaWQoKSk7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBub2RlLmRhdGEoKS50eXBlID09PSAnY2FsbGJhY2snID8gJ291dHB1dCcgOiAnaW5wdXQnO1xuICAgICAgICBjb25zdCBlZGdlcyA9IGdldEVkZ2VUeXBlcyhub2RlKVt0eXBlXTtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBlZGdlcy50YXJnZXRzKCk7XG4gICAgICAgIGNvbGxlY3Rpb24ubWVyZ2UoZWRnZXMpO1xuICAgICAgICBjb2xsZWN0aW9uLm1lcmdlKGNoaWxkcmVuKTtcbiAgICAgICAgaWYgKG5vZGUuZGF0YSgpLnR5cGUgPT09ICdwcm9wZXJ0eScpIHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb24ubWVyZ2Uobm9kZS5hbmNlc3RvcnMoKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2hpbGRyZW4uZm9yRWFjaChub2RlID0+IGRlc2NlbmQobm9kZSwgY29sbGVjdGlvbiwgdmlzaXRlZCkpO1xuICAgIH1cblxuICAgIGlmIChpZCkge1xuICAgICAgICBjb25zdCBub2RlID0gY3kuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuXG4gICAgICAgIC8vIEhpZ2hsaWdodCB0aGUgc2VsZWN0ZWQgbm9kZS5cblxuICAgICAgICBub2RlLmFkZENsYXNzKCdzZWxlY3RlZC1ub2RlJyk7XG5cbiAgICAgICAgLy8gRmluZCB0aGUgc3VidHJlZSB0aGF0IHRoZSBub2RlIGJlbG9uZ3MgdG8uIEEgc3VidHJlZSBjb250YWluc1xuICAgICAgICAvLyBhbGwgYWxsIGFuY2VzdG9ycyBhbmQgZGVzY2VuZGFudHMgdGhhdCBhcmUgY29ubmVjdGVkIHZpYSBJbnB1dHNcbiAgICAgICAgLy8gb3IgT3V0cHV0cyAoYnV0IG5vdCBTdGF0ZSkuXG5cbiAgICAgICAgY29uc3Qgc3VidHJlZSA9IGN5LmNvbGxlY3Rpb24oKTtcbiAgICAgICAgc3VidHJlZS5tZXJnZShub2RlKTtcbiAgICAgICAgYXNjZW5kKG5vZGUsIHN1YnRyZWUpO1xuICAgICAgICBkZXNjZW5kKG5vZGUsIHN1YnRyZWUpO1xuXG4gICAgICAgIGNvbnN0IG90aGVyID0gc3VidHJlZS5hYnNvbHV0ZUNvbXBsZW1lbnQoKTtcbiAgICAgICAgb3RoZXIuYWRkQ2xhc3MoJ2luYWN0aXZlJyk7XG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIG5vZGUucmVtb3ZlQ2xhc3MoJ3NlbGVjdGVkLW5vZGUnKTtcbiAgICAgICAgICAgIG90aGVyLnJlbW92ZUNsYXNzKCdpbmFjdGl2ZScpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIHVwZGF0ZUNoYW5nZWRQcm9wXG4gKlxuICogRmxhc2hlcyBwcm9wZXJ0eSBub2RlcyB0aGF0IHVwZGF0ZWQgYW5kIGFueSBpbnB1dHMgdGhleSBhcmUgY29ubmVjdGVkIHRvLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBjeSAtIFJlZmVyZW5jZSB0byB0aGUgY3l0b3NjYXBlIGluc3RhbmNlLlxuICogQHBhcmFtIHtTdHJpbmd9IGlkIC0gVGhlIGNvbXBvbmVudCBpZCB3aGljaCB1cGRhdGVkLlxuICogQHBhcmFtIHtPYmplY3R9IHByb3BzIC0gVGhlIHByb3BzIHRoYXQgdXBkYXRlZC5cbiAqIEBwYXJhbSB7TnVtYmVyfSBmbGFzaFRpbWUgLSBUaGUgdGltZSB0byBmbGFzaCBjbGFzc2VzIGZvciBpbiBtcy5cbiAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVDaGFuZ2VkUHJvcHMoY3ksIGlkLCBwcm9wcywgZmxhc2hUaW1lID0gNTAwKSB7XG4gICAgT2JqZWN0LmtleXMocHJvcHMpLmZvckVhY2gocHJvcCA9PiB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBjeS5nZXRFbGVtZW50QnlJZChgJHtpZH0uJHtwcm9wfWApO1xuICAgICAgICBub2RlLmZsYXNoQ2xhc3MoJ3Byb3AtY2hhbmdlZCcsIGZsYXNoVGltZSk7XG4gICAgICAgIG5vZGUuZWRnZXNUbygnKicpXG4gICAgICAgICAgICAuZmlsdGVyKCdbdHlwZSA9IFwiaW5wdXRcIl0nKVxuICAgICAgICAgICAgLmZsYXNoQ2xhc3MoJ3RyaWdnZXJlZCcsIGZsYXNoVGltZSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogdXBkYXRlQ2FsbGJhY2tcbiAqXG4gKiBVcGRhdGVzIGEgY2FsbGJhY2sgbm9kZSB3aXRoIHByb2ZpbGluZyBpbmZvcm1hdGlvbiAoY2FsbCBjb3VudCwgYXZnIHRpbWUpXG4gKiBhbmQgYWRkcyBvciByZW1vdmVzIGNsYXNzZXMgYXMgbmVjZXNzYXJ5LiBDbGFzc2VzIGFyZSBhbHdheXMgYXNzZXJ0IGZvclxuICogYXQgbGVhc3QgZmxhc2hUaW1lIG1zIHNvIHRoYXQgdGhleSBjYW4gYmUgdmlzdWFsbHkgb2JzZXJ2ZWQuIFdoZW4gY2FsbGJhY2tzXG4gKiByZXNvbHZlLCBhbGwgb3V0cHV0IGVkZ2VzIGFyZSBmbGFzaGVkLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBjeSAtIFJlZmVyZW5jZSB0byB0aGUgY3l0b3NjYXBlIGluc3RhbmNlLlxuICogQHBhcmFtIHtTdHJpbmd9IGlkIC0gVGhlIGlkIG9mIHRoZSBjYWxsYmFjayAoaS5lLiwgaXQncyBvdXRwdXQgaWRlbnRpZmllcilcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9maWxlIC0gVGhlIGNhbGxiYWNrIHByb2ZpbGluZyBpbmZvcm1hdGlvbi5cbiAqIEBwYXJhbSB7TnVtYmVyfSBmbGFzaFRpbWUgLSBUaGUgdGltZSB0byBmbGFzaCBjbGFzc2VzIGZvciBpbiBtcy5cbiAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVDYWxsYmFjayhjeSwgaWQsIHByb2ZpbGUsIGZsYXNoVGltZSA9IDUwMCkge1xuICAgIGNvbnN0IG5vZGUgPSBjeS5nZXRFbGVtZW50QnlJZChgX19kYXNoX2NhbGxiYWNrX18uJHtpZH1gKTtcbiAgICBjb25zdCB7Y291bnQsIHRvdGFsLCBzdGF0dXN9ID0gcHJvZmlsZTtcbiAgICBjb25zdCB7bGF0ZXN0fSA9IHN0YXR1cztcblxuICAgIC8vIFVwZGF0ZSBkYXRhLlxuICAgIGNvbnN0IGF2Z1RpbWUgPSBjb3VudCA+IDAgPyB0b3RhbCAvIGNvdW50IDogMDtcbiAgICBub2RlLmRhdGEoJ2NvdW50JywgY291bnQpO1xuICAgIG5vZGUuZGF0YSgndGltZScsIE1hdGgucm91bmQoYXZnVGltZSkpO1xuXG4gICAgLy8gRWl0aGVyIGZsYXNoIHRoZSBjbGFzc2VzIE9SIG1haW50YWluIGl0IGZvciBsb25nIGNhbGxiYWNrcy5cbiAgICBpZiAobGF0ZXN0ID09PSAnbG9hZGluZycpIHtcbiAgICAgICAgbm9kZS5kYXRhKCdsb2FkaW5nU2V0JywgRGF0ZS5ub3coKSk7XG4gICAgICAgIG5vZGUuYWRkQ2xhc3MoJ2NhbGxiYWNrLWxvYWRpbmcnKTtcbiAgICB9IGVsc2UgaWYgKG5vZGUuaGFzQ2xhc3MoJ2NhbGxiYWNrLWxvYWRpbmcnKSkge1xuICAgICAgICBjb25zdCB0aW1lTGVmdCA9IG5vZGUuZGF0YSgnbG9hZGluZ1NldCcpICsgZmxhc2hUaW1lIC0gRGF0ZS5ub3coKTtcbiAgICAgICAgc2V0VGltZW91dChcbiAgICAgICAgICAgICgpID0+IG5vZGUucmVtb3ZlQ2xhc3MoJ2NhbGxiYWNrLWxvYWRpbmcnKSxcbiAgICAgICAgICAgIE1hdGgubWF4KHRpbWVMZWZ0LCAwKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgICAgbGF0ZXN0ICE9PSAnbG9hZGluZycgJiZcbiAgICAgICAgbGF0ZXN0ICE9PSBTVEFUVVNNQVBbU1RBVFVTLk9LXSAmJlxuICAgICAgICBsYXRlc3QgIT09IFNUQVRVU01BUFtTVEFUVVMuUFJFVkVOVF9VUERBVEVdXG4gICAgKSB7XG4gICAgICAgIG5vZGUuZGF0YSgnZXJyb3JTZXQnLCBEYXRlLm5vdygpKTtcbiAgICAgICAgbm9kZS5hZGRDbGFzcygnY2FsbGJhY2stZXJyb3InKTtcbiAgICB9IGVsc2UgaWYgKG5vZGUuaGFzQ2xhc3MoJ2NhbGxiYWNrLWVycm9yJykpIHtcbiAgICAgICAgY29uc3QgdGltZUxlZnQgPSBub2RlLmRhdGEoJ2Vycm9yU2V0JykgKyBmbGFzaFRpbWUgLSBEYXRlLm5vdygpO1xuICAgICAgICBzZXRUaW1lb3V0KFxuICAgICAgICAgICAgKCkgPT4gbm9kZS5yZW1vdmVDbGFzcygnY2FsbGJhY2stZXJyb3InKSxcbiAgICAgICAgICAgIE1hdGgubWF4KHRpbWVMZWZ0LCAwKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8vIEZJWE1FOiBUaGlzIHdpbGwgZmxhc2ggYnJhbmNoZXMgdGhhdCByZXR1cm4gbm9fdXBkYXRlISFcbiAgICAvLyBJZiB0aGUgY2FsbGJhY2sgcmVzb2x2ZWQgcHJvcGVybHksIGZsYXNoIHRoZSBvdXRwdXRzLlxuICAgIGlmIChsYXRlc3QgPT09IFNUQVRVU01BUFtTVEFUVVMuT0tdKSB7XG4gICAgICAgIG5vZGUuZWRnZXNUbygnKicpLmZsYXNoQ2xhc3MoJ3RyaWdnZXJlZCcsIGZsYXNoVGltZSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHtDb21wb25lbnR9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQge29uRXJyb3IsIHJldmVydH0gZnJvbSAnLi4vLi4vYWN0aW9ucyc7XG5cbmNsYXNzIENvbXBvbmVudEVycm9yQm91bmRhcnkgZXh0ZW5kcyBDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIG15SUQ6IHByb3BzLmNvbXBvbmVudElkLFxuICAgICAgICAgICAgb2xkQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBoYXNFcnJvcjogZmFsc2VcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKF8pIHtcbiAgICAgICAgcmV0dXJuIHtoYXNFcnJvcjogdHJ1ZX07XG4gICAgfVxuXG4gICAgY29tcG9uZW50RGlkQ2F0Y2goZXJyb3IsIGluZm8pIHtcbiAgICAgICAgY29uc3Qge2Rpc3BhdGNofSA9IHRoaXMucHJvcHM7XG4gICAgICAgIGRpc3BhdGNoKFxuICAgICAgICAgICAgb25FcnJvcih7XG4gICAgICAgICAgICAgICAgbXlJRDogdGhpcy5zdGF0ZS5teUlELFxuICAgICAgICAgICAgICAgIHR5cGU6ICdmcm9udEVuZCcsXG4gICAgICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICAgICAgaW5mb1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgICAgZGlzcGF0Y2gocmV2ZXJ0KTtcbiAgICB9XG5cbiAgICBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzLCBwcmV2U3RhdGUpIHtcbiAgICAgICAgY29uc3QgcHJldkNoaWxkcmVuID0gcHJldlByb3BzLmNoaWxkcmVuO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICAhdGhpcy5zdGF0ZS5oYXNFcnJvciAmJlxuICAgICAgICAgICAgcHJldkNoaWxkcmVuICE9PSBwcmV2U3RhdGUub2xkQ2hpbGRyZW4gJiZcbiAgICAgICAgICAgIHByZXZDaGlsZHJlbiAhPT0gdGhpcy5wcm9wcy5jaGlsZHJlblxuICAgICAgICApIHtcbiAgICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC9uby1kaWQtdXBkYXRlLXNldC1zdGF0ZSAqL1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgb2xkQ2hpbGRyZW46IHByZXZDaGlsZHJlblxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGNvbnN0IHtoYXNFcnJvciwgb2xkQ2hpbGRyZW59ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgcmV0dXJuIGhhc0Vycm9yID8gb2xkQ2hpbGRyZW4gOiB0aGlzLnByb3BzLmNoaWxkcmVuO1xuICAgIH1cbn1cblxuQ29tcG9uZW50RXJyb3JCb3VuZGFyeS5wcm9wVHlwZXMgPSB7XG4gICAgY2hpbGRyZW46IFByb3BUeXBlcy5vYmplY3QsXG4gICAgY29tcG9uZW50SWQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgZXJyb3I6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgZGlzcGF0Y2g6IFByb3BUeXBlcy5mdW5jXG59O1xuXG5leHBvcnQgZGVmYXVsdCBDb21wb25lbnRFcnJvckJvdW5kYXJ5O1xuIiwiaW1wb3J0IHtjb25uZWN0fSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgJy4vRnJvbnRFbmRFcnJvci5jc3MnO1xuaW1wb3J0IHtDb21wb25lbnQsIHVzZVJlZiwgdXNlU3RhdGUsIHVzZUVmZmVjdH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IENvbGxhcHNlSWNvbiBmcm9tICcuLi9pY29ucy9Db2xsYXBzZUljb24uc3ZnJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgJy4uL1BlcmN5LmNzcyc7XG5pbXBvcnQge3VybEJhc2V9IGZyb20gJy4uLy4uLy4uL2FjdGlvbnMvdXRpbHMnO1xuXG5pbXBvcnQgd2Vya3pldWdDc3MgZnJvbSAnLi4vd2Vya3pldWdjc3MnO1xuXG5jbGFzcyBGcm9udEVuZEVycm9yIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBjb2xsYXBzZWQ6IHRoaXMucHJvcHMuaXNMaXN0SXRlbVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgY29uc3Qge2UsIGluQWxlcnRzVHJheX0gPSB0aGlzLnByb3BzO1xuICAgICAgICBjb25zdCB7Y29sbGFwc2VkfSA9IHRoaXMuc3RhdGU7XG5cbiAgICAgICAgY29uc3QgY2FyZENsYXNzZXMgPVxuICAgICAgICAgICAgJ2Rhc2gtZXJyb3ItY2FyZF9fY29udGVudCcgK1xuICAgICAgICAgICAgKGluQWxlcnRzVHJheSA/ICcgZGFzaC1lcnJvci1jYXJkLS1hbGVydHMtdHJheScgOiAnJyk7XG5cbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8taW5saW5lLWNvbW1lbnRzICovXG4gICAgICAgIGNvbnN0IGVycm9ySGVhZGVyID0gKFxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0nZGFzaC1mZS1lcnJvci1pdGVtIHRlc3QtZGV2dG9vbHMtZXJyb3ItdG9nZ2xlJ1xuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHRoaXMuc2V0U3RhdGUoe2NvbGxhcHNlZDogIWNvbGxhcHNlZH0pfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0nZGFzaC1mZS1lcnJvci10b3BfX2dyb3VwJz5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSdkYXNoLWZlLWVycm9yX190aXRsZSc+XG4gICAgICAgICAgICAgICAgICAgICAgICB7ZS5lcnJvci5tZXNzYWdlIHx8ICdFcnJvcid9XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSdkYXNoLWZlLWVycm9yLXRvcF9fZ3JvdXAnPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9J2Rhc2gtZmUtZXJyb3JfX3RpbWVzdGFtcCBwZXJjeS1oaWRlJz5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtgJHtlLnRpbWVzdGFtcC50b0xvY2FsZVRpbWVTdHJpbmcoKX1gfVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0nZGFzaC1mZS1lcnJvcl9fdGltZXN0YW1wIHBlcmN5LXNob3cnPlxuICAgICAgICAgICAgICAgICAgICAgICAgey8qIFNwZWNpYWwgcGVyY3kgdGltZXN0YW1wIGZvciB2aXN1YWwgdGVzdGluZy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAqIEhpZGRlbiBkdXJpbmcgcmVndWxhciB1c2FnZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAqL31cbiAgICAgICAgICAgICAgICAgICAgICAgIDAwOjAwOjAwIFBNXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICA8Q29sbGFwc2VJY29uXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2BkYXNoLWZlLWVycm9yX19jb2xsYXBzZSAke1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlZCA/ICdkYXNoLWZlLWVycm9yX19jb2xsYXBzZS0tZmxpcHBlZCcgOiAnJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB0aGlzLnNldFN0YXRlKHtjb2xsYXBzZWQ6ICFjb2xsYXBzZWR9KX1cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2NhcmRDbGFzc2VzfT5cbiAgICAgICAgICAgICAgICB7ZXJyb3JIZWFkZXJ9XG4gICAgICAgICAgICAgICAgeyFjb2xsYXBzZWQgJiYgPEVycm9yQ29udGVudCBlcnJvcj17ZS5lcnJvcn0gLz59XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIEJhY2tlbmRFcnJvcih7ZXJyb3IsIGJhc2V9KSB7XG4gICAgY29uc3QgaWZyYW1lUmVmID0gdXNlUmVmKG51bGwpO1xuICAgIGNvbnN0IFtoZWlnaHQsIHNldEhlaWdodF0gPSB1c2VTdGF0ZSgnNTAwcHgnKTsgLy8gRGVmYXVsdCBoZWlnaHRcblxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGhhbmRsZU1lc3NhZ2UgPSBldmVudCA9PiB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgZXZlbnQuZGF0YSAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBldmVudC5kYXRhID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgICAgIGV2ZW50LmRhdGEudHlwZSA9PT0gJ0lGUkFNRV9IRUlHSFQnXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBzZXRIZWlnaHQoYCR7ZXZlbnQuZGF0YS5oZWlnaHR9cHhgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGhhbmRsZU1lc3NhZ2UpO1xuICAgICAgICByZXR1cm4gKCkgPT4gd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBoYW5kbGVNZXNzYWdlKTtcbiAgICB9LCBbXSk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8aWZyYW1lXG4gICAgICAgICAgICByZWY9e2lmcmFtZVJlZn1cbiAgICAgICAgICAgIHNyY0RvYz17ZXJyb3IuaHRtbFxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKFxuICAgICAgICAgICAgICAgICAgICAnPC9oZWFkPicsXG4gICAgICAgICAgICAgICAgICAgIGA8c3R5bGUgdHlwZT1cInRleHQvY3NzXCI+JHt3ZXJremV1Z0Nzc308L3N0eWxlPlxuICAgICAgICAgICAgICAgICAgICA8c2NyaXB0PlxuICBmdW5jdGlvbiBzZW5kSGVpZ2h0KCkge1xuICAgIGNvbnN0IGhlaWdodCA9IGRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0O1xuICAgIHdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2UoeyB0eXBlOiBcIklGUkFNRV9IRUlHSFRcIiwgaGVpZ2h0IH0sIFwiKlwiKTtcbiAgfVxuXG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwibG9hZFwiLCBzZW5kSGVpZ2h0KTtcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgc2VuZEhlaWdodCk7XG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgc2VuZEhlaWdodCk7XG48L3NjcmlwdD48L2hlYWQ+YFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgnPVwiP19fZGVidWdnZXJfXycsIGA9XCIke2Jhc2V9P19fZGVidWdnZXJfX2ApfVxuICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAvKlxuICAgICAgICAgICAgICAgICAqIDY3cHggb2YgcGFkZGluZyBhbmQgbWFyZ2luIGJldHdlZW4gdGhpc1xuICAgICAgICAgICAgICAgICAqIGlmcmFtZSBhbmQgdGhlIHBhcmVudCBjb250YWluZXIuXG4gICAgICAgICAgICAgICAgICogNjcgd2FzIGRldGVybWluZWQgbWFudWFsbHkgaW4gdGhlXG4gICAgICAgICAgICAgICAgICogYnJvd3NlcidzIGRldiB0b29scy5cbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICB3aWR0aDogJ2NhbGMoNjAwcHggLSA2N3B4KScsXG4gICAgICAgICAgICAgICAgYm9yZGVyOiAnbm9uZScsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBoZWlnaHRcbiAgICAgICAgICAgIH19XG4gICAgICAgIC8+XG4gICAgKTtcbn1cblxuY29uc3QgTUFYX01FU1NBR0VfTEVOR1RIID0gNDA7XG4vKiBlc2xpbnQtZGlzYWJsZSBuby1pbmxpbmUtY29tbWVudHMgKi9cbmZ1bmN0aW9uIFVuY29ubmVjdGVkRXJyb3JDb250ZW50KHtlcnJvciwgYmFzZX0pIHtcbiAgICAvLyBIZWxwZXIgdG8gZGV0ZWN0IGZ1bGwgSFRNTCBkb2N1bWVudFxuICAgIGNvbnN0IGlzRnVsbEh0bWxEb2MgPVxuICAgICAgICB0eXBlb2YgZXJyb3IuaHRtbCA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgZXJyb3IuaHRtbC50cmltKCkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCc8IWRvY3R5cGUnKTtcblxuICAgIC8vIEhlbHBlciB0byBkZXRlY3QgSFRNTCBmcmFnbWVudFxuICAgIGNvbnN0IGlzSHRtbEZyYWdtZW50ID1cbiAgICAgICAgdHlwZW9mIGVycm9yLmh0bWwgPT09ICdzdHJpbmcnICYmIGVycm9yLmh0bWwudHJpbSgpLnN0YXJ0c1dpdGgoJzwnKTtcblxuICAgIHJldHVybiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdlcnJvci1jb250YWluZXInPlxuICAgICAgICAgICAgey8qIEZyb250ZW5kIGVycm9yIG1lc3NhZ2UgKi99XG4gICAgICAgICAgICB7dHlwZW9mIGVycm9yLm1lc3NhZ2UgIT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICBlcnJvci5tZXNzYWdlLmxlbmd0aCA8IE1BWF9NRVNTQUdFX0xFTkdUSCA/IG51bGwgOiAoXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtZmUtZXJyb3JfX3N0Jz5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtZmUtZXJyb3JfX2luZm8gZGFzaC1mZS1lcnJvcl9fY3VydmVkJz5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtlcnJvci5tZXNzYWdlfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICl9XG5cbiAgICAgICAgICAgIHsvKiBGcm9udGVuZCBzdGFjayB0cmFjZSAqL31cbiAgICAgICAgICAgIHt0eXBlb2YgZXJyb3Iuc3RhY2sgIT09ICdzdHJpbmcnID8gbnVsbCA6IChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1mZS1lcnJvcl9fc3QnPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1mZS1lcnJvcl9faW5mbyc+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGV0YWlscz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3VtbWFyeT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVGhpcyBlcnJvciBvcmlnaW5hdGVkIGZyb20gdGhlIGJ1aWx0LWluXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKYXZhU2NyaXB0IGNvZGUgdGhhdCBydW5zIERhc2ggYXBwcy4gQ2xpY2tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHNlZSB0aGUgZnVsbCBzdGFjayB0cmFjZSBvciBvcGVuIHlvdXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyb3dzZXIncyBjb25zb2xlLilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3VtbWFyeT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ZXJyb3Iuc3RhY2suc3BsaXQoJ1xcbicpLm1hcCgobGluZSwgaSkgPT4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBrZXk9e2l9PntsaW5lfTwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGV0YWlscz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApfVxuXG4gICAgICAgICAgICB7LyogQmFja2VuZCBlcnJvcjogZnVsbCBIVE1MIGRvY3VtZW50ICovfVxuICAgICAgICAgICAge2lzRnVsbEh0bWxEb2MgPyAoXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtYmUtZXJyb3JfX3N0Jz5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtYmFja2VuZC1lcnJvcic+XG4gICAgICAgICAgICAgICAgICAgICAgICA8QmFja2VuZEVycm9yIGVycm9yPXtlcnJvcn0gYmFzZT17YmFzZX0gLz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApIDogaXNIdG1sRnJhZ21lbnQgPyAoXG4gICAgICAgICAgICAgICAgLy8gQmFja2VuZCBlcnJvcjogSFRNTCBmcmFnbWVudFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdkYXNoLWJlLWVycm9yX19zdHInPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9J2Rhc2gtYmFja2VuZC1lcnJvcidcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7X19odG1sOiBlcnJvci5odG1sfX1cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICkgOiB0eXBlb2YgZXJyb3IuaHRtbCA9PT0gJ3N0cmluZycgPyAoXG4gICAgICAgICAgICAgICAgLy8gQmFja2VuZCBlcnJvcjogcGxhaW4gdGV4dFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdkYXNoLWJlLWVycm9yX19zdHInPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1iYWNrZW5kLWVycm9yJz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwcmU+e2Vycm9yLmh0bWx9PC9wcmU+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgIDwvZGl2PlxuICAgICk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG5vLWlubGluZS1jb21tZW50cyAqL1xuXG5jb25zdCBlcnJvclByb3BUeXBlcyA9IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgbWVzc2FnZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAgIC8qIGZyb250LWVuZCBlcnJvciBtZXNzYWdlcyAqL1xuICAgIHN0YWNrOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gICAgLyogYmFja2VuZCBlcnJvciBtZXNzYWdlcyAqL1xuICAgIGh0bWw6IFByb3BUeXBlcy5zdHJpbmdcbn0pO1xuXG5VbmNvbm5lY3RlZEVycm9yQ29udGVudC5wcm9wVHlwZXMgPSB7XG4gICAgZXJyb3I6IGVycm9yUHJvcFR5cGVzLFxuICAgIGJhc2U6IFByb3BUeXBlcy5zdHJpbmdcbn07XG5cbmNvbnN0IEVycm9yQ29udGVudCA9IGNvbm5lY3Qoc3RhdGUgPT4gKHtiYXNlOiB1cmxCYXNlKHN0YXRlLmNvbmZpZyl9KSkoXG4gICAgVW5jb25uZWN0ZWRFcnJvckNvbnRlbnRcbik7XG5cbkZyb250RW5kRXJyb3IucHJvcFR5cGVzID0ge1xuICAgIGU6IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgICAgIHRpbWVzdGFtcDogUHJvcFR5cGVzLm9iamVjdCxcbiAgICAgICAgZXJyb3I6IGVycm9yUHJvcFR5cGVzXG4gICAgfSksXG4gICAgaW5BbGVydHNUcmF5OiBQcm9wVHlwZXMuYm9vbCxcbiAgICBpc0xpc3RJdGVtOiBQcm9wVHlwZXMuYm9vbFxufTtcblxuRnJvbnRFbmRFcnJvci5kZWZhdWx0UHJvcHMgPSB7XG4gICAgaW5BbGVydHNUcmF5OiBmYWxzZSxcbiAgICBpc0xpc3RJdGVtOiBmYWxzZVxufTtcblxuZXhwb3J0IHtGcm9udEVuZEVycm9yfTtcbiIsImltcG9ydCBSZWFjdCwge0NvbXBvbmVudH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0ICcuL0Zyb250RW5kRXJyb3IuY3NzJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQge0Zyb250RW5kRXJyb3J9IGZyb20gJy4vRnJvbnRFbmRFcnJvci5yZWFjdCc7XG5cbmNsYXNzIEZyb250RW5kRXJyb3JDb250YWluZXIgZXh0ZW5kcyBDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGNvbnN0IHtlcnJvcnMsIGNvbm5lY3RlZCwgY2xpY2tIYW5kbGVyfSA9IHRoaXMucHJvcHM7XG5cbiAgICAgICAgY29uc3QgaW5BbGVydHNUcmF5ID0gdGhpcy5wcm9wcy5pbkFsZXJ0c1RyYXk7XG4gICAgICAgIGxldCBjYXJkQ2xhc3NlcyA9ICdkYXNoLWVycm9yLWNhcmQgZGFzaC1lcnJvci1jYXJkLS1jb250YWluZXInO1xuXG4gICAgICAgIGNvbnN0IGVycm9yRWxlbWVudHMgPSBlcnJvcnMubWFwKChlcnJvciwgaSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIDxGcm9udEVuZEVycm9yIGU9e2Vycm9yfSBpc0xpc3RJdGVtPXt0cnVlfSBrZXk9e2l9IC8+O1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGluQWxlcnRzVHJheSkge1xuICAgICAgICAgICAgY2FyZENsYXNzZXMgKz0gJyBkYXNoLWVycm9yLWNhcmQtLWFsZXJ0cy10cmF5JztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2NhcmRDbGFzc2VzfT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1lcnJvci1jYXJkX190b3BiYXInPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1lcnJvci1jYXJkX19tZXNzYWdlJz5cbiAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yc1xuICAgICAgICAgICAgICAgICAgICAgICAge2Nvbm5lY3RlZCA/IG51bGwgOiAnXFx1MDBhMCDwn5qrIFNlcnZlciBVbmF2YWlsYWJsZSd9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9J2Rhc2gtZmUtZXJyb3JfX2ljb24teCdcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGNsaWNrSGFuZGxlcigpfVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICDDl1xuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1lcnJvci1jYXJkX19saXN0Jz57ZXJyb3JFbGVtZW50c308L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICApO1xuICAgIH1cbn1cblxuRnJvbnRFbmRFcnJvckNvbnRhaW5lci5wcm9wVHlwZXMgPSB7XG4gICAgaWQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgZXJyb3JzOiBQcm9wVHlwZXMuYXJyYXksXG4gICAgY29ubmVjdGVkOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBpbkFsZXJ0c1RyYXk6IFByb3BUeXBlcy5hbnlcbn07XG5cbkZyb250RW5kRXJyb3JDb250YWluZXIucHJvcFR5cGVzID0ge1xuICAgIGluQWxlcnRzVHJheTogUHJvcFR5cGVzLmFueVxufTtcblxuZXhwb3J0IHtGcm9udEVuZEVycm9yQ29udGFpbmVyfTtcbiIsImltcG9ydCB7Y29ubmVjdH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHtEZWJ1Z01lbnV9IGZyb20gJy4vbWVudS9EZWJ1Z01lbnUucmVhY3QnO1xuXG5jbGFzcyBVbmNvbm5lY3RlZEdsb2JhbEVycm9yQ29udGFpbmVyIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICBjb25zdCB7Y29uZmlnLCBlcnJvciwgY2hpbGRyZW59ID0gdGhpcy5wcm9wcztcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXYgaWQ9J19kYXNoLWdsb2JhbC1lcnJvci1jb250YWluZXInPlxuICAgICAgICAgICAgICAgIDxEZWJ1Z01lbnVcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnPXtjb25maWd9XG4gICAgICAgICAgICAgICAgICAgIGVycm9yPXtlcnJvcn1cbiAgICAgICAgICAgICAgICAgICAgaG90UmVsb2FkPXtCb29sZWFuKGNvbmZpZy5ob3RfcmVsb2FkKX1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9J19kYXNoLWFwcC1jb250ZW50Jz57Y2hpbGRyZW59PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9EZWJ1Z01lbnU+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKTtcbiAgICB9XG59XG5cblVuY29ubmVjdGVkR2xvYmFsRXJyb3JDb250YWluZXIucHJvcFR5cGVzID0ge1xuICAgIGNoaWxkcmVuOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIGNvbmZpZzogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBlcnJvcjogUHJvcFR5cGVzLm9iamVjdFxufTtcblxuY29uc3QgR2xvYmFsRXJyb3JDb250YWluZXIgPSBjb25uZWN0KHN0YXRlID0+ICh7XG4gICAgY29uZmlnOiBzdGF0ZS5jb25maWcsXG4gICAgZXJyb3I6IHN0YXRlLmVycm9yXG59KSkoVW5jb25uZWN0ZWRHbG9iYWxFcnJvckNvbnRhaW5lcik7XG5cbmV4cG9ydCBkZWZhdWx0IEdsb2JhbEVycm9yQ29udGFpbmVyO1xuIiwiaW1wb3J0IFJlYWN0LCB7dXNlRWZmZWN0LCB1c2VTdGF0ZX0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7Y29uY2F0fSBmcm9tICdyYW1kYSc7XG5pbXBvcnQge3VzZVNlbGVjdG9yfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5cbmltcG9ydCAnLi9EZWJ1Z01lbnUuY3NzJztcblxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICcuLi9pY29ucy9DaGVja0ljb24uc3ZnJztcbmltcG9ydCBDbG9ja0ljb24gZnJvbSAnLi4vaWNvbnMvQ2xvY2tJY29uLnN2Zyc7XG5pbXBvcnQgRXJyb3JJY29uIGZyb20gJy4uL2ljb25zL0Vycm9ySWNvbi5zdmcnO1xuaW1wb3J0IEdyYXBoSWNvbiBmcm9tICcuLi9pY29ucy9HcmFwaEljb24uc3ZnJztcbmltcG9ydCBPZmZJY29uIGZyb20gJy4uL2ljb25zL09mZkljb24uc3ZnJztcbmltcG9ydCBFeHBhbmQgZnJvbSAnLi4vaWNvbnMvRXhwYW5kLnN2Zyc7XG5pbXBvcnQge1ZlcnNpb25JbmZvfSBmcm9tICcuL1ZlcnNpb25JbmZvLnJlYWN0JztcbmltcG9ydCB7Q2FsbGJhY2tHcmFwaENvbnRhaW5lcn0gZnJvbSAnLi4vQ2FsbGJhY2tHcmFwaC9DYWxsYmFja0dyYXBoQ29udGFpbmVyLnJlYWN0JztcbmltcG9ydCB7RnJvbnRFbmRFcnJvckNvbnRhaW5lcn0gZnJvbSAnLi4vRnJvbnRFbmQvRnJvbnRFbmRFcnJvckNvbnRhaW5lci5yZWFjdCc7XG5pbXBvcnQgRXh0ZXJuYWxXcmFwcGVyIGZyb20gJy4uLy4uLy4uL3dyYXBwZXIvRXh0ZXJuYWxXcmFwcGVyJztcbmltcG9ydCBQbG90bHlDbG91ZCBmcm9tICcuL1Bsb3RseUNsb3VkJztcbmltcG9ydCB7RGV2dG9vbFByb3ZpZGVyLCB1c2VEZXZ0b29sfSBmcm9tICcuL0RldnRvb2xDb250ZXh0JztcblxuY29uc3QgY2xhc3NlcyA9IChiYXNlLCB2YXJpYW50LCB2YXJpYW50MikgPT5cbiAgICBgJHtiYXNlfSAke2Jhc2V9LS0ke3ZhcmlhbnR9YCArICh2YXJpYW50MiA/IGAgJHtiYXNlfS0tJHt2YXJpYW50Mn1gIDogJycpO1xuXG5jb25zdCBpc0NvbGxhcHNlZCA9ICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2Rhc2hfZGVidWdfbWVudV9jb2xsYXBzZWQnKSA9PT0gJ3RydWUnO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gSWYgbG9jYWxTdG9yYWdlIGlzIG5vdCBhdmFpbGFibGUsIGRlZmF1bHQgdG8gZmFsc2VcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn07XG5cbmNvbnN0IE1lbnVDb250ZW50ID0gKHtcbiAgICBob3RSZWxvYWQsXG4gICAgY29ubmVjdGVkLFxuICAgIHBvcHVwLFxuICAgIHRvZ2dsZUVycm9ycyxcbiAgICBlcnJDb3VudCxcbiAgICB0b2dnbGVDYWxsYmFja0dyYXBoLFxuICAgIGNvbmZpZ1xufSkgPT4ge1xuICAgIGNvbnN0IHJlYWR5ID0gdXNlU2VsZWN0b3Ioc3RhdGUgPT4gc3RhdGUuYXBwTGlmZWN5Y2xlID09PSAnSFlEUkFURUQnKTtcbiAgICBjb25zdCBfU3RhdHVzSWNvbiA9IGhvdFJlbG9hZFxuICAgICAgICA/IGNvbm5lY3RlZFxuICAgICAgICAgICAgPyBDaGVja0ljb25cbiAgICAgICAgICAgIDogT2ZmSWNvblxuICAgICAgICA6IENsb2NrSWNvbjtcblxuICAgIGNvbnN0IHN0YXR1cyA9IGhvdFJlbG9hZFxuICAgICAgICA/IGNvbm5lY3RlZFxuICAgICAgICAgICAgPyAnYXZhaWxhYmxlJ1xuICAgICAgICAgICAgOiAndW5hdmFpbGFibGUnXG4gICAgICAgIDogJ2NvbGQnO1xuXG4gICAgbGV0IGN1c3RvbSA9IG51bGw7XG4gICAgaWYgKGNvbmZpZy5kZXZfdG9vbHM/Lmxlbmd0aCAmJiByZWFkeSkge1xuICAgICAgICBjdXN0b20gPSBjb25maWcuZGV2X3Rvb2xzLnJlZHVjZShcbiAgICAgICAgICAgIChhY2MsIGRldnRvb2wsIGkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb21wID0gKFxuICAgICAgICAgICAgICAgICAgICA8RXh0ZXJuYWxXcmFwcGVyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQ9e2RldnRvb2x9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRQYXRoPXtbJ19fZGFzaF9kZXZ0b29scycsIGldfVxuICAgICAgICAgICAgICAgICAgICAgICAga2V5PXtkZXZ0b29sPy5wcm9wcz8uaWQgPyBkZXZ0b29sLnByb3BzLmlkIDogaX1cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmIChkZXZ0b29sLnBvc2l0aW9uID09PSAnbGVmdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgYWNjLmxlZnQucHVzaChjb21wKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhY2MucmlnaHQucHVzaChjb21wKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7bGVmdDogW10sIHJpZ2h0OiBbXX1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1kZWJ1Zy1tZW51X19jb250ZW50Jz5cbiAgICAgICAgICAgIHtjdXN0b20gJiYgPD57Y3VzdG9tLmxlZnR9PC8+fVxuICAgICAgICAgICAgeyFjb25maWcucGxvdGx5X2Nsb3VkX2luc3RhbGxlZCA/IDxQbG90bHlDbG91ZCAvPiA6IG51bGx9XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgb25DbGljaz17dG9nZ2xlRXJyb3JzfVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17XG4gICAgICAgICAgICAgICAgICAgIChwb3B1cCA9PSAnZXJyb3JzJ1xuICAgICAgICAgICAgICAgICAgICAgICAgPyAnZGFzaC1kZWJ1Zy1tZW51X19idXR0b24tLXNlbGVjdGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsKSArICcgZGFzaC1kZWJ1Zy1tZW51X19idXR0b24nXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlkPSdkYXNoLWRlYnVnLW1lbnVfX2Vycm9ycy1idXR0b24nXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPEVycm9ySWNvblxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9J2Rhc2gtZGVidWctbWVudV9faWNvbidcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg9ezE2fVxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9ezE2fVxuICAgICAgICAgICAgICAgICAgICBmaWxsPSdjdXJyZW50Q29sb3InXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICBFcnJvcnNcbiAgICAgICAgICAgICAgICB7ZXJyQ291bnQgPiAwID8gKFxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9J3Rlc3QtZGV2dG9vbHMtZXJyb3ItY291bnQgZGFzaC1kZWJ1Zy1tZW51X19lcnJvci1jb3VudCc+XG4gICAgICAgICAgICAgICAgICAgICAgICB7ZXJyQ291bnR9XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RvZ2dsZUNhbGxiYWNrR3JhcGh9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtcbiAgICAgICAgICAgICAgICAgICAgKHBvcHVwID09ICdjYWxsYmFja0dyYXBoJ1xuICAgICAgICAgICAgICAgICAgICAgICAgPyAnZGFzaC1kZWJ1Zy1tZW51X19idXR0b24tLXNlbGVjdGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiAnJykgKyAnIGRhc2gtZGVidWctbWVudV9fYnV0dG9uJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZD0nZGFzaC1kZWJ1Zy1tZW51X19jYWxsYmFjay1ncmFwaC1idXR0b24nXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPEdyYXBoSWNvblxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9J2Rhc2gtZGVidWctbWVudV9faWNvbidcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg9ezE2fVxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9ezE2fVxuICAgICAgICAgICAgICAgICAgICBmaWxsPSdjdXJyZW50Q29sb3InXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICBDYWxsYmFja3NcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtZGVidWctbWVudV9fZGl2aWRlcicgLz5cbiAgICAgICAgICAgIDxWZXJzaW9uSW5mbyBjb25maWc9e2NvbmZpZ30gLz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdkYXNoLWRlYnVnLW1lbnVfX2RpdmlkZXInIC8+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgZGFzaC1kZWJ1Zy1tZW51X19zdGF0dXMgZGFzaC1kZWJ1Zy1tZW51X19idXR0b24tLSR7c3RhdHVzfWB9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgU2VydmVyXG4gICAgICAgICAgICAgICAgPF9TdGF0dXNJY29uIGNsYXNzTmFtZT0nZGFzaC1kZWJ1Zy1tZW51X19pY29uJyAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB7Y3VzdG9tICYmIDw+e2N1c3RvbS5yaWdodH08Lz59XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPSdkYXNoLWRlYnVnLW1lbnVfX2RpdmlkZXInXG4gICAgICAgICAgICAgICAgc3R5bGU9e3ttYXJnaW5SaWdodDogMH19XG4gICAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cbiAgICApO1xufTtcblxuY29uc3QgRGVidWcgPSAoe2Vycm9yLCBob3RSZWxvYWQsIGNvbmZpZywgY2hpbGRyZW59KSA9PiB7XG4gICAgY29uc3Qge3BvcHVwLCBzZXRQb3B1cH0gPSB1c2VEZXZ0b29sKCk7XG4gICAgY29uc3QgW2NvbGxhcHNlZCwgc2V0Q29sbGFwc2VkXSA9IHVzZVN0YXRlKGlzQ29sbGFwc2VkKTtcblxuICAgIGNvbnN0IGVyckNvdW50ID0gZXJyb3IuZnJvbnRFbmQubGVuZ3RoICsgZXJyb3IuYmFja0VuZC5sZW5ndGg7XG4gICAgY29uc3QgY29ubmVjdGVkID0gZXJyb3IuYmFja0VuZENvbm5lY3RlZDtcblxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmIChlcnJDb3VudCA+IDAgJiYgcG9wdXAgPT0gbnVsbCkge1xuICAgICAgICAgICAgc2V0UG9wdXAoJ2Vycm9ycycpO1xuICAgICAgICB9XG4gICAgfSwgW2VyckNvdW50XSk7XG5cbiAgICBjb25zdCB0b2dnbGVFcnJvcnMgPSAoKSA9PiB7XG4gICAgICAgIHNldFBvcHVwKHBvcHVwID09ICdlcnJvcnMnID8gbnVsbCA6ICdlcnJvcnMnKTtcbiAgICB9O1xuXG4gICAgY29uc3QgdG9nZ2xlQ2FsbGJhY2tHcmFwaCA9ICgpID0+IHtcbiAgICAgICAgc2V0UG9wdXAocG9wdXAgPT0gJ2NhbGxiYWNrR3JhcGgnID8gbnVsbCA6ICdjYWxsYmFja0dyYXBoJyk7XG4gICAgfTtcblxuICAgIGNvbnN0IHRvZ2dsZUNvbGxhcHNlZCA9ICgpID0+IHtcbiAgICAgICAgc2V0Q29sbGFwc2VkKCFjb2xsYXBzZWQpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2Rhc2hfZGVidWdfbWVudV9jb2xsYXBzZWQnLCAhY29sbGFwc2VkKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gSWYgbG9jYWxTdG9yYWdlIGlzIG5vdCBhdmFpbGFibGUsIGRvIG5vdGhpbmdcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBlcnJvcnMgPSBjb25jYXQoZXJyb3IuZnJvbnRFbmQsIGVycm9yLmJhY2tFbmQpO1xuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKGVycm9ycy5sZW5ndGggJiYgcG9wdXAgIT09ICdlcnJvcnMnKSB7XG4gICAgICAgICAgICBzZXRQb3B1cCgnZXJyb3JzJyk7XG4gICAgICAgIH1cbiAgICB9LCBbZXJyb3JdKTtcblxuICAgIGNvbnN0IHBvcHVwQ29udGVudCA9IChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtZGVidWctbWVudV9fcG9wdXAnPlxuICAgICAgICAgICAge3BvcHVwID09ICdjYWxsYmFja0dyYXBoJyA/IDxDYWxsYmFja0dyYXBoQ29udGFpbmVyIC8+IDogdW5kZWZpbmVkfVxuICAgICAgICAgICAge3BvcHVwID09ICdlcnJvcnMnICYmIGVyckNvdW50ID4gMCA/IChcbiAgICAgICAgICAgICAgICA8RnJvbnRFbmRFcnJvckNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICBjbGlja0hhbmRsZXI9e3RvZ2dsZUVycm9yc31cbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzPXtlcnJvcnN9XG4gICAgICAgICAgICAgICAgICAgIGNvbm5lY3RlZD17ZXJyb3IuYmFja0VuZENvbm5lY3RlZH1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKSA6IHVuZGVmaW5lZH1cbiAgICAgICAgPC9kaXY+XG4gICAgKTtcblxuICAgIGNvbnN0IG1lbnVDb250ZW50ID0gY29sbGFwc2VkID8gdW5kZWZpbmVkIDogKFxuICAgICAgICA8TWVudUNvbnRlbnRcbiAgICAgICAgICAgIHBvcHVwPXtwb3B1cH1cbiAgICAgICAgICAgIGVyckNvdW50PXtlcnJDb3VudH1cbiAgICAgICAgICAgIHRvZ2dsZUVycm9ycz17dG9nZ2xlRXJyb3JzfVxuICAgICAgICAgICAgdG9nZ2xlQ2FsbGJhY2tHcmFwaD17dG9nZ2xlQ2FsbGJhY2tHcmFwaH1cbiAgICAgICAgICAgIGNvbmZpZz17Y29uZmlnfVxuICAgICAgICAgICAgaG90UmVsb2FkPXtob3RSZWxvYWR9XG4gICAgICAgICAgICBjb25uZWN0ZWQ9e2Nvbm5lY3RlZH1cbiAgICAgICAgLz5cbiAgICApO1xuXG4gICAgcmV0dXJuIChcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzZXMoXG4gICAgICAgICAgICAgICAgICAgICdkYXNoLWRlYnVnLW1lbnVfX291dGVyJyxcbiAgICAgICAgICAgICAgICAgICAgY29sbGFwc2VkID8gJ2NvbGxhcHNlZCcgOiAnZXhwYW5kZWQnXG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7cG9wdXBDb250ZW50fVxuICAgICAgICAgICAgICAgIHttZW51Q29udGVudH1cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RvZ2dsZUNvbGxhcHNlZH1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc2VzKFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2Rhc2gtZGVidWctbWVudV9fdG9nZ2xlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlZCA/ICdjb2xsYXBzZWQnIDogJ2V4cGFuZGVkJ1xuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPEV4cGFuZCAvPlxuICAgICAgICAgICAgICAgICAgICB7ZXJyQ291bnQgPiAwICYmIGNvbGxhcHNlZCA/IChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdkYXNoLWRlYnVnLW1lbnVfX2Vycm9yLWluZGljYXRvcicgLz5cbiAgICAgICAgICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIHtjaGlsZHJlbn1cbiAgICAgICAgPC9kaXY+XG4gICAgKTtcbn07XG5cbmNvbnN0IERlYnVnTWVudSA9ICh7Y2hpbGRyZW4sIC4uLnByb3BzfSkgPT4ge1xuICAgIHJldHVybiAoXG4gICAgICAgIDxEZXZ0b29sUHJvdmlkZXI+XG4gICAgICAgICAgICA8RGVidWcgey4uLnByb3BzfT57Y2hpbGRyZW59PC9EZWJ1Zz5cbiAgICAgICAgPC9EZXZ0b29sUHJvdmlkZXI+XG4gICAgKTtcbn07XG5cbkRlYnVnTWVudS5wcm9wVHlwZXMgPSB7XG4gICAgY2hpbGRyZW46IFByb3BUeXBlcy5vYmplY3QsXG4gICAgZXJyb3I6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgaG90UmVsb2FkOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBjb25maWc6IFByb3BUeXBlcy5vYmplY3Rcbn07XG5cbmV4cG9ydCB7RGVidWdNZW51fTtcbiIsImltcG9ydCBSZWFjdCwge3VzZUNvbnRleHQsIHVzZU1lbW8sIHVzZVN0YXRlfSBmcm9tICdyZWFjdCc7XG5cbmV4cG9ydCBjb25zdCBEZXZ0b29sQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQoe30pO1xuXG5leHBvcnQgY29uc3QgRGV2dG9vbFByb3ZpZGVyID0gKHtjaGlsZHJlbn0pID0+IHtcbiAgICBjb25zdCBbcG9wdXAsIHNldFBvcHVwXSA9IHVzZVN0YXRlKCcnKTtcblxuICAgIHJldHVybiAoXG4gICAgICAgIDxEZXZ0b29sQ29udGV4dC5Qcm92aWRlclxuICAgICAgICAgICAgdmFsdWU9e3tcbiAgICAgICAgICAgICAgICBwb3B1cCxcbiAgICAgICAgICAgICAgICBzZXRQb3B1cFxuICAgICAgICAgICAgfX1cbiAgICAgICAgPlxuICAgICAgICAgICAge2NoaWxkcmVufVxuICAgICAgICA8L0RldnRvb2xDb250ZXh0LlByb3ZpZGVyPlxuICAgICk7XG59O1xuXG5leHBvcnQgY29uc3QgdXNlRGV2dG9vbCA9ICgpID0+IHtcbiAgICByZXR1cm4gdXNlQ29udGV4dChEZXZ0b29sQ29udGV4dCk7XG59O1xuXG5leHBvcnQgY29uc3QgdXNlRGV2dG9vbE1lbnVCdXR0b25DbGFzc05hbWUgPSBwb3B1cE5hbWUgPT4ge1xuICAgIGNvbnN0IHtwb3B1cH0gPSB1c2VEZXZ0b29sKCk7XG5cbiAgICBjb25zdCBjbGFzc05hbWUgPSB1c2VNZW1vKCgpID0+IHtcbiAgICAgICAgY29uc3QgYmFzZSA9ICdkYXNoLWRlYnVnLW1lbnVfX2J1dHRvbic7XG4gICAgICAgIGlmIChwb3B1cCA9PT0gcG9wdXBOYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gYmFzZSArICcgZGFzaC1kZWJ1Zy1tZW51X19idXR0b24tLXNlbGVjdGVkJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYmFzZTtcbiAgICB9LCBbcG9wdXBdKTtcblxuICAgIHJldHVybiBjbGFzc05hbWU7XG59O1xuIiwiaW1wb3J0IFJlYWN0LCB7dXNlTWVtb30gZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQge3VzZURldnRvb2wsIHVzZURldnRvb2xNZW51QnV0dG9uQ2xhc3NOYW1lfSBmcm9tICcuL0RldnRvb2xDb250ZXh0JztcblxuaW1wb3J0ICcuL1Bsb3RseUNsb3VkLmNzcyc7XG5pbXBvcnQgQ2xvdWRTbGFzaEljb24gZnJvbSAnLi4vaWNvbnMvQ2xvdWRTbGFzaEljb24uc3ZnJztcblxuY29uc3QgQ0xPVURfUE9QVVAgPSAnY2xvdWQnO1xuXG5jb25zdCBQbG90bHlDbG91ZCA9ICgpID0+IHtcbiAgICBjb25zdCB7cG9wdXAsIHNldFBvcHVwfSA9IHVzZURldnRvb2woKTtcblxuICAgIGNvbnN0IGNsYXNzTmFtZSA9IHVzZURldnRvb2xNZW51QnV0dG9uQ2xhc3NOYW1lKENMT1VEX1BPUFVQKTtcblxuICAgIGNvbnN0IGlzT3BlbiA9IHVzZU1lbW8oKCkgPT4gcG9wdXAgPT09IENMT1VEX1BPUFVQLCBbcG9wdXBdKTtcblxuICAgIGNvbnN0IG9uQ2xpY2sgPSAoKSA9PiB7XG4gICAgICAgIGlmIChwb3B1cCA9PT0gQ0xPVURfUE9QVVApIHtcbiAgICAgICAgICAgIHNldFBvcHVwKCcnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNldFBvcHVwKENMT1VEX1BPUFVQKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvbkNvcHkgPSAoKSA9PiB7XG4gICAgICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KCdwaXAgaW5zdGFsbCBcImRhc2hbY2xvdWRdXCInKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIChcbiAgICAgICAgPD5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3NOYW1lPXtjbGFzc05hbWV9IG9uQ2xpY2s9e29uQ2xpY2t9PlxuICAgICAgICAgICAgICAgIDxDbG91ZFNsYXNoSWNvblxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9J2Rhc2gtZGVidWctbWVudV9faWNvbidcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg9ezE2fVxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9ezE2fVxuICAgICAgICAgICAgICAgICAgICBmaWxsPSdjdXJyZW50Q29sb3InXG4gICAgICAgICAgICAgICAgLz57JyAnfVxuICAgICAgICAgICAgICAgIFBsb3RseSBDbG91ZFxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB7aXNPcGVuID8gKFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdwbG90bHktY2xvdWQtbW9kYWwtb3ZlcmxheSc+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdwbG90bHktY2xvdWQtbW9kYWwtY29udGVudCc+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncGxvdGx5LWNsb3VkLW1vZGFsLWhlYWRlcic+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGtleT0nbW9kYWwtdGl0bGUnPlBsb3RseSBDbG91ZDwvaDM+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk9J21vZGFsLWNsb3NlJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9J3Bsb3RseS1jbG91ZC1tb2RhbC1jbG9zZSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0UG9wdXAoJycpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgw5dcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleT0nbW9kYWwtYm9keSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9J3Bsb3RseS1jbG91ZC1tb2RhbC1ib2R5J1xuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RhbGwgdGhlIGV4dGVuc2lvbiB0byBwdWJsaXNoIHRvIFBsb3RseVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbG91ZC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncGxvdGx5LWNsb3VkLWNvcHktaW5zdGFsbCc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnsncGlwIGluc3RhbGwgXCJkYXNoW2Nsb3VkXVwiJ308L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e29uQ29weX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0ncGxvdGx5LWNsb3VkLW1vZGFsLWJ1dHRvbidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29weVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICA8Lz5cbiAgICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgUGxvdGx5Q2xvdWQ7XG4iLCJpbXBvcnQgUmVhY3QsIHt1c2VFZmZlY3QsIHVzZVN0YXRlfSBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCAnLi9WZXJzaW9uSW5mby5jc3MnO1xuXG5jb25zdCBEQVlfSU5fTVMgPSA4NjQwMDAwMDtcblxuZnVuY3Rpb24gY29tcGFyZVZlcnNpb25zKHYxLCB2Mikge1xuICAgIC8vIFJlbW92ZSBhbnkgbm9uLW51bWVyaWMgY2hhcmFjdGVycyBmcm9tIHRoZSB2ZXJzaW9uIHN0cmluZ3NcbiAgICAvLyBhbmQgYW55dGhpbmcgYWZ0ZXIgdGhlbSAoZS5nLiAxLjIuMy1yYy4xIC0+IDEuMi4zLCAxLjIuMytidWlsZC4xIC0+IDEuMi4zKVxuICAgIHYxID0gdjEucmVwbGFjZSgvXFwuP1teMC05Ll0uKiQvLCAnJyk7XG4gICAgdjIgPSB2Mi5yZXBsYWNlKC9cXC4/W14wLTkuXS4qJC8sICcnKTtcblxuICAgIGNvbnN0IHYxUGFydHMgPSB2MS5zcGxpdCgnLicpLm1hcChOdW1iZXIpO1xuICAgIGNvbnN0IHYyUGFydHMgPSB2Mi5zcGxpdCgnLicpLm1hcChOdW1iZXIpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBNYXRoLm1heCh2MVBhcnRzLmxlbmd0aCwgdjJQYXJ0cy5sZW5ndGgpOyBpKyspIHtcbiAgICAgICAgY29uc3QgcGFydDEgPSB2MVBhcnRzW2ldIHx8IDA7XG4gICAgICAgIGNvbnN0IHBhcnQyID0gdjJQYXJ0c1tpXSB8fCAwO1xuXG4gICAgICAgIGlmIChwYXJ0MSA+IHBhcnQyKSByZXR1cm4gMTtcbiAgICAgICAgaWYgKHBhcnQxIDwgcGFydDIpIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVxdWVzdERhc2hWZXJzaW9uSW5mbyhjb25maWcpIHtcbiAgICBjb25zdCB7XG4gICAgICAgIGRhc2hfdmVyc2lvbjogY3VycmVudERhc2hWZXJzaW9uLFxuICAgICAgICBkYXNoX3ZlcnNpb25fdXJsOiBkYXNoVmVyc2lvblVybCxcbiAgICAgICAgcHl0aG9uX3ZlcnNpb246IHB5dGhvblZlcnNpb24sXG4gICAgICAgIGRka192ZXJzaW9uOiBkZGtWZXJzaW9uLFxuICAgICAgICBwbG90bHlfdmVyc2lvbjogcGxvdGx5VmVyc2lvblxuICAgIH0gPSBjb25maWc7XG4gICAgbGV0IGNhY2hlZFZlcnNpb25JbmZvLCBjYWNoZWROZXdEYXNoVmVyc2lvbkxpbmssIGxhc3RGZXRjaGVkO1xuICAgIHRyeSB7XG4gICAgICAgIGNhY2hlZFZlcnNpb25JbmZvID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2NhY2hlZE5ld0Rhc2hWZXJzaW9uJyk7XG4gICAgICAgIGNhY2hlZE5ld0Rhc2hWZXJzaW9uTGluayA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFxuICAgICAgICAgICAgJ2NhY2hlZE5ld0Rhc2hWZXJzaW9uTGluaydcbiAgICAgICAgKTtcbiAgICAgICAgbGFzdEZldGNoZWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbGFzdEZldGNoZWQnKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIElmIGxvY2FsU3RvcmFnZSBpcyBub3QgYXZhaWxhYmxlLCByZXR1cm4gYW4gZW1wdHkgb2JqZWN0XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgICBsYXN0RmV0Y2hlZCAmJlxuICAgICAgICBEYXRlLm5vdygpIC0gTnVtYmVyKGxhc3RGZXRjaGVkKSA8IERBWV9JTl9NUyAmJlxuICAgICAgICBjYWNoZWRWZXJzaW9uSW5mb1xuICAgICkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmVyc2lvbjogSlNPTi5wYXJzZShjYWNoZWRWZXJzaW9uSW5mbyksXG4gICAgICAgICAgICBsaW5rOiBjYWNoZWROZXdEYXNoVmVyc2lvbkxpbmtcbiAgICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHNob3VsZFJlcXVlc3REYXNoVmVyc2lvbihjb25maWcpKSB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7XG4gICAgICAgICAgICBkYXNoX3ZlcnNpb246IGN1cnJlbnREYXNoVmVyc2lvbixcbiAgICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiBweXRob25WZXJzaW9uLFxuICAgICAgICAgICAgZGRrX3ZlcnNpb246IGRka1ZlcnNpb24sXG4gICAgICAgICAgICBwbG90bHlfdmVyc2lvbjogcGxvdGx5VmVyc2lvblxuICAgICAgICB9KS50b1N0cmluZygpO1xuICAgICAgICByZXR1cm4gZmV0Y2goZGFzaFZlcnNpb25VcmwgKyAnPycgKyBxdWVyeVBhcmFtcywge21vZGU6ICdjb3JzJ30pXG4gICAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS5qc29uKCkpXG4gICAgICAgICAgICAudGhlbihib2R5ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoYm9keSAmJiBib2R5LnZlcnNpb24gJiYgYm9keS5saW5rKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2FjaGVkTmV3RGFzaFZlcnNpb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGJvZHkudmVyc2lvbilcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2FjaGVkTmV3RGFzaFZlcnNpb25MaW5rJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5LmxpbmtcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnbGFzdEZldGNoZWQnLCBEYXRlLm5vdygpKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIGVycm9ycyBpZiBsb2NhbFN0b3JhZ2UgaXMgbm90IGF2YWlsYWJsZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBib2R5O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgICAgICB9KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZFJlcXVlc3REYXNoVmVyc2lvbihjb25maWcpIHtcbiAgICAvLyBJZiB2ZXJzaW9uIGNoZWNrIGlzIGRpc2FibGVkLCByZXR1cm4gZmFsc2UgdG8gYXZvaWRcbiAgICAvLyBjaGVja2luZyBsb2NhbFN0b3JhZ2UgdW5uZWNlc3NhcmlseVxuICAgIGlmIChjb25maWcuZGlzYWJsZV92ZXJzaW9uX2NoZWNrKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgbGV0IHNob3dOb3RpZmljYXRpb25zLCBsYXN0RmV0Y2hlZDtcbiAgICB0cnkge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9ucyA9XG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnc2hvd05vdGlmaWNhdGlvbnMnKSAhPT0gJ2ZhbHNlJztcbiAgICAgICAgbGFzdEZldGNoZWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbGFzdEZldGNoZWQnKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIElmIGxvY2FsU3RvcmFnZSBpcyBub3QgYXZhaWxhYmxlLCByZXR1cm4gZmFsc2VcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgICBzaG93Tm90aWZpY2F0aW9ucyAmJlxuICAgICAgICAoIWxhc3RGZXRjaGVkIHx8IERhdGUubm93KCkgLSBOdW1iZXIobGFzdEZldGNoZWQpID4gREFZX0lOX01TKVxuICAgICk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFNob3dVcGdyYWRlTm90aWZpY2F0aW9uKFxuICAgIGN1cnJlbnREYXNoVmVyc2lvbixcbiAgICBuZXdEYXNoVmVyc2lvbixcbiAgICBjb25maWdcbikge1xuICAgIC8vIElmIHZlcnNpb24gY2hlY2sgaXMgZGlzYWJsZWQsIHJldHVybiBmYWxzZSB0byBhdm9pZFxuICAgIC8vIGNoZWNraW5nIGxvY2FsU3RvcmFnZSB1bm5lY2Vzc2FyaWx5XG4gICAgaWYgKGNvbmZpZy5kaXNhYmxlX3ZlcnNpb25fY2hlY2spIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBsZXQgc2hvd05vdGlmaWNhdGlvbnMsIGxhc3REaXNtaXNzZWQsIGxhc3REaXNtaXNzZWRWZXJzaW9uO1xuICAgIHRyeSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb25zID1cbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdzaG93Tm90aWZpY2F0aW9ucycpICE9PSAnZmFsc2UnO1xuICAgICAgICBsYXN0RGlzbWlzc2VkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2xhc3REaXNtaXNzZWQnKTtcbiAgICAgICAgbGFzdERpc21pc3NlZFZlcnNpb24gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbGFzdERpc21pc3NlZFZlcnNpb24nKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIElmIGxvY2FsU3RvcmFnZSBpcyBub3QgYXZhaWxhYmxlLCByZXR1cm4gZmFsc2VcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICAgIG5ld0Rhc2hWZXJzaW9uID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgY29tcGFyZVZlcnNpb25zKGN1cnJlbnREYXNoVmVyc2lvbiwgbmV3RGFzaFZlcnNpb24pID49IDAgfHxcbiAgICAgICAgIXNob3dOb3RpZmljYXRpb25zXG4gICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgICBsYXN0RGlzbWlzc2VkICYmXG4gICAgICAgIERhdGUubm93KCkgLSBOdW1iZXIobGFzdERpc21pc3NlZCkgPiBEQVlfSU5fTVNcbiAgICApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgICAgbGFzdERpc21pc3NlZFZlcnNpb24gJiZcbiAgICAgICAgIWxhc3REaXNtaXNzZWQgJiZcbiAgICAgICAgY29tcGFyZVZlcnNpb25zKGxhc3REaXNtaXNzZWRWZXJzaW9uLCBuZXdEYXNoVmVyc2lvbikgPCAwXG4gICAgKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAhbGFzdERpc21pc3NlZCAmJiAhbGFzdERpc21pc3NlZFZlcnNpb247XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgVmVyc2lvbkluZm8gPSAoe2NvbmZpZ30pID0+IHtcbiAgICBjb25zdCBbbmV3RGFzaFZlcnNpb24sIHNldE5ld0Rhc2hWZXJzaW9uXSA9IHVzZVN0YXRlKHVuZGVmaW5lZCk7XG4gICAgY29uc3QgW25ld0Rhc2hWZXJzaW9uTGluaywgc2V0TmV3RGFzaFZlcnNpb25MaW5rXSA9IHVzZVN0YXRlKHVuZGVmaW5lZCk7XG4gICAgY29uc3QgW3VwZ3JhZGVUb29sdGlwT3BlbmVkLCBzZXRVcGdyYWRlVG9vbHRpcE9wZW5lZF0gPSB1c2VTdGF0ZShmYWxzZSk7XG5cbiAgICBjb25zdCBzZXREb250U2hvd0FnYWluID0gKCkgPT4ge1xuICAgICAgICAvLyBTZXQgbG9jYWwgc3RvcmFnZSB0byByZWNvcmQgdGhlIGxhc3QgZGlzbWlzc2VkIG5vdGlmaWNhdGlvblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3Nob3dOb3RpZmljYXRpb25zJywgZmFsc2UpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBJZ25vcmUgZXJyb3JzIGlmIGxvY2FsU3RvcmFnZSBpcyBub3QgYXZhaWxhYmxlXG4gICAgICAgIH1cbiAgICAgICAgc2V0VXBncmFkZVRvb2x0aXBPcGVuZWQoZmFsc2UpO1xuICAgIH07XG5cbiAgICBjb25zdCBzZXRSZW1pbmRNZUxhdGVyID0gKCkgPT4ge1xuICAgICAgICAvLyBTZXQgbG9jYWwgc3RvcmFnZSB0byByZWNvcmQgdGhlIGxhc3QgZGlzbWlzc2VkIG5vdGlmaWNhdGlvblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2xhc3REaXNtaXNzZWQnLCBEYXRlLm5vdygpKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gSWdub3JlIGVycm9ycyBpZiBsb2NhbFN0b3JhZ2UgaXMgbm90IGF2YWlsYWJsZVxuICAgICAgICB9XG4gICAgICAgIHNldFVwZ3JhZGVUb29sdGlwT3BlbmVkKGZhbHNlKTtcbiAgICB9O1xuXG4gICAgY29uc3Qgc2V0U2tpcFRoaXNWZXJzaW9uID0gKCkgPT4ge1xuICAgICAgICAvLyBTZXQgbG9jYWwgc3RvcmFnZSB0byByZWNvcmQgdGhlIGxhc3QgZGlzbWlzc2VkIHZlcnNpb25cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdsYXN0RGlzbWlzc2VkVmVyc2lvbicsIG5ld0Rhc2hWZXJzaW9uKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gSWdub3JlIGVycm9ycyBpZiBsb2NhbFN0b3JhZ2UgaXMgbm90IGF2YWlsYWJsZVxuICAgICAgICB9XG4gICAgICAgIHNldFVwZ3JhZGVUb29sdGlwT3BlbmVkKGZhbHNlKTtcbiAgICB9O1xuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgcmVxdWVzdERhc2hWZXJzaW9uSW5mbyhjb25maWcpLnRoZW4oYm9keSA9PiB7XG4gICAgICAgICAgICBpZiAoYm9keSkge1xuICAgICAgICAgICAgICAgIHNldE5ld0Rhc2hWZXJzaW9uTGluayhib2R5LmxpbmspO1xuICAgICAgICAgICAgICAgIHNldE5ld0Rhc2hWZXJzaW9uKGJvZHkudmVyc2lvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0sIFtdKTtcblxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGhpZGVVcGdyYWRlVG9vbHRpcCA9IGUgPT4ge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHVwZ3JhZGVUb29sdGlwT3BlbmVkICYmXG4gICAgICAgICAgICAgICAgIWUudGFyZ2V0Lm1hdGNoZXMoXG4gICAgICAgICAgICAgICAgICAgICcuZGFzaC1kZWJ1Zy1tZW51X192ZXJzaW9uLCAuZGFzaC1kZWJ1Zy1tZW51X192ZXJzaW9uIConXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgc2V0VXBncmFkZVRvb2x0aXBPcGVuZWQoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvLyBDbG9zZSB0aGUgdXBncmFkZSB0b29sdGlwIGlmIHRoZSB1c2VyIGNsaWNrcyBvdXRzaWRlIG9mIGl0XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGlkZVVwZ3JhZGVUb29sdGlwKTtcblxuICAgICAgICByZXR1cm4gKCkgPT4gZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoaWRlVXBncmFkZVRvb2x0aXApO1xuICAgIH0sIFt1cGdyYWRlVG9vbHRpcE9wZW5lZF0pO1xuXG4gICAgcmV0dXJuIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtZGVidWctbWVudV9fdmVyc2lvbic+XG4gICAgICAgICAgICB7dXBncmFkZVRvb2x0aXBPcGVuZWQgPyAoXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtZGVidWctbWVudV9fdXBncmFkZS10b29sdGlwJz5cbiAgICAgICAgICAgICAgICAgICAge25ld0Rhc2hWZXJzaW9uTGluayA/IChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxhIHRhcmdldD0nX2JsYW5rJyBocmVmPXtuZXdEYXNoVmVyc2lvbkxpbmt9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWQgZGV0YWlsc1xuICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBvbkNsaWNrPXtzZXRTa2lwVGhpc1ZlcnNpb259PlxuICAgICAgICAgICAgICAgICAgICAgICAgU2tpcCB0aGlzIHZlcnNpb25cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gb25DbGljaz17c2V0UmVtaW5kTWVMYXRlcn0+XG4gICAgICAgICAgICAgICAgICAgICAgICBSZW1pbmQgbWUgdG9tb3Jyb3dcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gb25DbGljaz17c2V0RG9udFNob3dBZ2Fpbn0+XG4gICAgICAgICAgICAgICAgICAgICAgICBTaWxlbmNlIGFsbCB2ZXJzaW9uIG5vdGlmaWNhdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgIDxzcGFuPnZ7Y29uZmlnLmRhc2hfdmVyc2lvbn08L3NwYW4+XG4gICAgICAgICAgICB7c2hvdWxkU2hvd1VwZ3JhZGVOb3RpZmljYXRpb24oXG4gICAgICAgICAgICAgICAgY29uZmlnLmRhc2hfdmVyc2lvbixcbiAgICAgICAgICAgICAgICBuZXdEYXNoVmVyc2lvbixcbiAgICAgICAgICAgICAgICBjb25maWdcbiAgICAgICAgICAgICkgPyAoXG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9J2Rhc2gtZGVidWctbWVudV9fdXBncmFkZS1idXR0b24nXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRVcGdyYWRlVG9vbHRpcE9wZW5lZCghdXBncmFkZVRvb2x0aXBPcGVuZWQpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIERhc2ggdXBkYXRlIGF2YWlsYWJsZSAtIHZ7bmV3RGFzaFZlcnNpb259XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgPC9kaXY+XG4gICAgKTtcbn07XG4iLCIvLyBXZXJremV1ZyBjc3MgaW5jbHVkZWQgYXMgYSBzdHJpbmcsIGJlY2F1c2Ugd2Ugd2FudCB0byBpbmplY3Rcbi8vIGl0IGludG8gYW4gaWZyYW1lIHNyY0RvY1xuXG5leHBvcnQgZGVmYXVsdCBgXG5ib2R5IHtcbiAgICBtYXJnaW46IDBweDtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4udHJhY2ViYWNrIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgICBib3JkZXI6IDJweCBzb2xpZCAjZGZlOGYzO1xuICAgIGJvcmRlci1yYWRpdXM6IDBweCAwcHggNHB4IDRweDtcbiAgICBjb2xvcjogIzUwNjc4NDtcbn1cblxuaDIudHJhY2ViYWNrIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjNmNmZhO1xuICAgIGJvcmRlcjogMnB4IHNvbGlkICNkZmU4ZjM7XG4gICAgYm9yZGVyLWJvdHRvbTogMHB4O1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgYm9yZGVyLXJhZGl1czogNHB4IDRweCAwcHggMHB4O1xuICAgIGNvbG9yOiAjNTA2Nzg0O1xufVxuXG5oMi50cmFjZWJhY2sgZW0ge1xuICAgIGNvbG9yOiAjNTA2Nzg0O1xuICAgIGZvbnQtd2VpZ2h0OiAxMDA7XG59XG5cbi50cmFjZWJhY2sgcHJlLCAuZGVidWdnZXIgdGV4dGFyZWEge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNGM0Y2RkE7XG59XG5cbi5kZWJ1Z2dlciBoMSB7XG4gICAgY29sb3I6ICM1MDY3ODQ7XG4gICAgZm9udC1mYW1pbHk6IFJvYm90bztcbn1cblxuLmV4cGxhbmF0aW9uIHtcbiAgICBjb2xvcjogI0EyQjFDNjtcbn1cblxuLyogSGlkZSB0aGUgRG9uJ3QgUGFuaWMhIGZvb3RlciAqL1xuLmRlYnVnZ2VyIC5mb290ZXIge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbi8qIEhpZGUgYWxsIG9mIHRoZSBEYXNoIHRyYWNlYmFjayBzdHVmZiB0aGF0IGxlYWRzIHVwIHRvIHRoZSBjYWxsICovXG4ubGluZS5iZWZvcmUge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbmRpdi5kZWJ1Z2dlciB7XG4gICAgcGFkZGluZzogMHB4O1xufVxuXG4uZGVidWdnZXIgaDEge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbi5kZWJ1Z2dlciAuZXJyb3Jtc2cge1xuICAgIG1hcmdpbjogMDtcbiAgICBjb2xvcjogIzUwNjc4NDtcbiAgICBmb250LXNpemU6IDE2cHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2YzZjZmYTtcbiAgICBib3JkZXI6IDJweCBzb2xpZCAjZGZlOGYzO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgIHBhZGRpbmc6IDEwcHg7XG59XG5cbi5kZWJ1Z2dlciAucGFzdGVtZXNzYWdlIGlucHV0IHtcbiAgICBkaXNwbGF5OiBub25lO1xufVxuXG4uZGVidWdnZXIgLmV4cGxhbmF0aW9uIHtcbiAgICBkaXNwbGF5OiBub25lO1xufVxuXG4uZGVidWdnZXIgZGl2LnBsYWluIHtcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgYm9yZGVyLXdpZHRoOiAycHg7XG4gICAgY29sb3I6ICM1MDY3ODQ7XG59XG5cbi5wbGFpbiB7XG4gICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbn1cbi5wbGFpbiA+IGZvcm0gPiBwIHtcbiAgICBkaXNwbGF5OiBub25lO1xufVxuLnBsYWluIHByZSB7XG4gICAgcGFkZGluZzogMTVweCAhaW1wb3J0YW50O1xuICAgIG92ZXJmbG93LXg6IHNjcm9sbDtcbn1cblxuLmRlYnVnZ2VyIGRpdi50cmFjZWJhY2sgcHJlIHtcbiAgICBjdXJzb3I6IGRlZmF1bHQ7XG59XG5cbi5kZWJ1Z2dlciAudHJhY2ViYWNrIC5zb3VyY2UgcHJlLmxpbmUgaW1nIHtcbiAgICBkaXNwbGF5OiBub25lO1xufVxuYDtcbiIsImV4cG9ydCBjb25zdCBSRURJUkVDVF9VUklfUEFUSE5BTUUgPSAnL19vYXV0aDIvY2FsbGJhY2snO1xuZXhwb3J0IGNvbnN0IE9BVVRIX0NPT0tJRV9OQU1FID0gJ3Bsb3RseV9vYXV0aF90b2tlbic7XG5leHBvcnQgY29uc3QgSldUX0VYUElSRURfTUVTU0FHRSA9ICdKV1QgRXhwaXJlZCc7XG5cbmV4cG9ydCBjb25zdCBTVEFUVVMgPSB7XG4gICAgT0s6IDIwMCxcbiAgICBQUkVWRU5UX1VQREFURTogMjA0LFxuICAgIC8vIFdlIGFjY2VwdCBib3RoIDQwMCBhbmQgNDAxIGZvciBKV1QgdG9rZW4gZXhwaXJ5IHJlc3BvbnNlcy5cbiAgICAvLyBTb21lIHNlcnZlcnMgdXNlIGNvZGUgNDAwIGZvciBleHBpcmVkIHRva2VucywgYmVjYXVzZVxuICAgIC8vIHRoZXkgcmVzZXJ2ZSA0MDEgZm9yIGNhc2VzIHRoYXQgcmVxdWlyZSB1c2VyIGFjdGlvblxuICAgIEJBRF9SRVFVRVNUOiA0MDAsXG4gICAgVU5BVVRIT1JJWkVEOiA0MDEsXG4gICAgQ0xJRU5UU0lERV9FUlJPUjogJ0NMSUVOVFNJREVfRVJST1InLFxuICAgIE5PX1JFU1BPTlNFOiAnTk9fUkVTUE9OU0UnXG59O1xuXG5leHBvcnQgY29uc3QgU1RBVFVTTUFQID0ge1xuICAgIFtTVEFUVVMuT0tdOiAnU1VDQ0VTUycsXG4gICAgW1NUQVRVUy5QUkVWRU5UX1VQREFURV06ICdOT19VUERBVEUnXG59O1xuIiwiaW1wb3J0IHtoYXMsIGluY2x1ZGVzfSBmcm9tICdyYW1kYSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm9wVHlwZUVycm9ySGFuZGxlcihtZXNzYWdlLCBwcm9wcywgdHlwZSkge1xuICAgIC8qXG4gICAgICogcHJvcFR5cGUgZXJyb3IgbWVzc2FnZXMgYXJlIGNvbnN0cnVjdGVkIGluXG4gICAgICogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3Byb3AtdHlwZXMvYmxvYi92MTUuNy4yL2ZhY3RvcnlXaXRoVHlwZUNoZWNrZXJzLmpzXG4gICAgICogKFZlcnNpb24gMTUuNy4yKVxuICAgICAqXG4gICAgICogUGFyc2UgdGhlc2UgZXhjZXB0aW9uIG9iamVjdHMgdG8gcmVtb3ZlIEpTIHNvdXJjZSBjb2RlIGFuZCBpbXByb3ZlXG4gICAgICogdGhlIGNsYXJpdHkuXG4gICAgICpcbiAgICAgKiBJZiB3cm9uZyBwcm9wIHR5cGUgd2FzIHBhc3NlZCBpbiwgbWVzc2FnZSBsb29rcyBsaWtlOlxuICAgICAqXG4gICAgICogRXJyb3I6IFwiRmFpbGVkIGNvbXBvbmVudCBwcm9wIHR5cGU6IEludmFsaWQgY29tcG9uZW50IHByb3AgYGFuaW1hdGVgIG9mIHR5cGUgYG51bWJlcmAgc3VwcGxpZWQgdG8gYGZ1bmN0aW9uIEdyYXBoV2l0aERlZmF1bHRzKHByb3BzKSB7XG4gICAgICogICB2YXIgaWQgPSBwcm9wcy5pZCA/IHByb3BzLmlkIDogZ2VuZXJhdGVJZCgpO1xuICAgICAqICAgcmV0dXJuIHJlYWN0X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19fZGVmYXVsdC5hLmNyZWF0ZUVsZW1lbnQoUGxvdGx5R3JhcGgsIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgICAqICAgICBpZDogaWRcbiAgICAgKiAgIH0pKTtcbiAgICAgKiB9YCwgZXhwZWN0ZWQgYGJvb2xlYW5gLlwiXG4gICAgICpcbiAgICAgKlxuICAgICAqIElmIGEgcmVxdWlyZWQgcHJvcCB0eXBlIHdhcyBvbWl0dGVkLCBtZXNzYWdlIGxvb2tzIGxpa2U6XG4gICAgICpcbiAgICAgKiBcIkZhaWxlZCBjb21wb25lbnQgcHJvcCB0eXBlOiBUaGUgY29tcG9uZW50IHByb3AgYG9wdGlvbnNbMF0udmFsdWVgIGlzIG1hcmtlZCBhcyByZXF1aXJlZCBpbiBgZnVuY3Rpb24gQ2hlY2tsaXN0KHByb3BzKSB7XG4gICAgICogICAgdmFyIF90aGlzO1xuICAgICAqXG4gICAgICogICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENoZWNrbGlzdCk7XG4gICAgICpcbiAgICAgKiAgICAgX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfZ2V0UHJvdG90eXBlT2YoQ2hlY2tsaXN0KS5jYWxsKHRoaXMsIHByb3BzKSk7XG4gICAgICogICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAqICAgICAgIHZhbHVlczogcHJvcHMudmFsdWVzXG4gICAgICogICAgIH07XG4gICAgICogICAgIHJldHVybiBfdGhpcztcbiAgICAgKiAgIH1gLCBidXQgaXRzIHZhbHVlIGlzIGB1bmRlZmluZWRgLlwiXG4gICAgICpcbiAgICAgKi9cblxuICAgIGNvbnN0IG1lc3NhZ2VQYXJ0cyA9IG1lc3NhZ2Uuc3BsaXQoJ2AnKTtcbiAgICBsZXQgZXJyb3JNZXNzYWdlO1xuICAgIGlmIChpbmNsdWRlcygnaXMgbWFya2VkIGFzIHJlcXVpcmVkJywgbWVzc2FnZSkpIHtcbiAgICAgICAgY29uc3QgaW52YWxpZFByb3BQYXRoID0gbWVzc2FnZVBhcnRzWzFdO1xuICAgICAgICBlcnJvck1lc3NhZ2UgPSBgJHtpbnZhbGlkUHJvcFBhdGh9IGluICR7dHlwZX1gO1xuICAgICAgICBpZiAocHJvcHMuaWQpIHtcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZSArPSBgIHdpdGggSUQgXCIke3Byb3BzLmlkfVwiYDtcbiAgICAgICAgfVxuICAgICAgICBlcnJvck1lc3NhZ2UgKz0gJyBpcyByZXF1aXJlZCBidXQgaXQgd2FzIG5vdCBwcm92aWRlZC4nO1xuICAgIH0gZWxzZSBpZiAoaW5jbHVkZXMoJ0JhZCBvYmplY3QnLCBtZXNzYWdlKSkge1xuICAgICAgICAvKlxuICAgICAgICAgKiBIYW5kbGUgLmV4YWN0IGVycm9yc1xuICAgICAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcHJvcC10eXBlcy9ibG9iL3YxNS43LjIvZmFjdG9yeVdpdGhUeXBlQ2hlY2tlcnMuanMjTDQzOC1MNDQyXG4gICAgICAgICAqL1xuICAgICAgICBlcnJvck1lc3NhZ2UgPVxuICAgICAgICAgICAgbWVzc2FnZS5zcGxpdCgnc3VwcGxpZWQgdG8gJylbMF0gK1xuICAgICAgICAgICAgYHN1cHBsaWVkIHRvICR7dHlwZX1gICtcbiAgICAgICAgICAgICcuXFxuQmFkJyArXG4gICAgICAgICAgICBtZXNzYWdlLnNwbGl0KCcuXFxuQmFkJylbMV07XG4gICAgfSBlbHNlIGlmIChcbiAgICAgICAgaW5jbHVkZXMoJ0ludmFsaWQgJywgbWVzc2FnZSkgJiZcbiAgICAgICAgaW5jbHVkZXMoJyBzdXBwbGllZCB0byAnLCBtZXNzYWdlKVxuICAgICkge1xuICAgICAgICBjb25zdCBpbnZhbGlkUHJvcFBhdGggPSBtZXNzYWdlUGFydHNbMV07XG5cbiAgICAgICAgZXJyb3JNZXNzYWdlID0gYEludmFsaWQgYXJndW1lbnQgXFxgJHtpbnZhbGlkUHJvcFBhdGh9XFxgIHBhc3NlZCBpbnRvICR7dHlwZX1gO1xuICAgICAgICBpZiAocHJvcHMuaWQpIHtcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZSArPSBgIHdpdGggSUQgXCIke3Byb3BzLmlkfVwiYDtcbiAgICAgICAgfVxuICAgICAgICBlcnJvck1lc3NhZ2UgKz0gJy4nO1xuXG4gICAgICAgIC8qXG4gICAgICAgICAqIE5vdCBhbGwgZXJyb3IgbWVzc2FnZXMgaW5jbHVkZSB0aGUgZXhwZWN0ZWQgdmFsdWUuXG4gICAgICAgICAqIEluIHBhcnRpY3VsYXIsIG9uZU9mVHlwZS5cbiAgICAgICAgICogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3Byb3AtdHlwZXMvYmxvYi92MTUuNy4yL2ZhY3RvcnlXaXRoVHlwZUNoZWNrZXJzLmpzI0wzODhcbiAgICAgICAgICovXG4gICAgICAgIGlmIChpbmNsdWRlcygnLCBleHBlY3RlZCAnLCBtZXNzYWdlKSkge1xuICAgICAgICAgICAgY29uc3QgZXhwZWN0ZWRQcm9wVHlwZSA9IG1lc3NhZ2Uuc3BsaXQoJywgZXhwZWN0ZWQgJylbMV07XG4gICAgICAgICAgICBlcnJvck1lc3NhZ2UgKz0gYFxcbkV4cGVjdGVkICR7ZXhwZWN0ZWRQcm9wVHlwZX1gO1xuICAgICAgICB9XG5cbiAgICAgICAgLypcbiAgICAgICAgICogTm90IGFsbCBlcnJvciBtZXNzYWdlcyBpbmNsdWRlIHRoZSB0eXBlXG4gICAgICAgICAqIEluIHBhcnRpY3VsYXIsIG9uZU9mVHlwZS5cbiAgICAgICAgICogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3Byb3AtdHlwZXMvYmxvYi92MTUuNy4yL2ZhY3RvcnlXaXRoVHlwZUNoZWNrZXJzLmpzI0wzODhcbiAgICAgICAgICovXG4gICAgICAgIGlmIChpbmNsdWRlcygnIG9mIHR5cGUgYCcsIG1lc3NhZ2UpKSB7XG4gICAgICAgICAgICBjb25zdCBpbnZhbGlkUHJvcFR5cGVQcm92aWRlZCA9IG1lc3NhZ2VcbiAgICAgICAgICAgICAgICAuc3BsaXQoJyBvZiB0eXBlIGAnKVsxXVxuICAgICAgICAgICAgICAgIC5zcGxpdCgnYCcpWzBdO1xuICAgICAgICAgICAgZXJyb3JNZXNzYWdlICs9IGBcXG5XYXMgc3VwcGxpZWQgdHlwZSBcXGAke2ludmFsaWRQcm9wVHlwZVByb3ZpZGVkfVxcYC5gO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhcyhpbnZhbGlkUHJvcFBhdGgsIHByb3BzKSkge1xuICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAqIGludmFsaWRQcm9wUGF0aCBtYXkgYmUgbmVzdGVkIGxpa2UgYG9wdGlvbnNbMF0udmFsdWVgLlxuICAgICAgICAgICAgICogRm9yIG5vdywgd2Ugd29uJ3QgdHJ5IHRvIHVucGFjayB0aGVzZSBuZXN0ZWQgb3B0aW9uc1xuICAgICAgICAgICAgICogYnV0IHdlIGNvdWxkIGluIHRoZSBmdXR1cmUuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGNvbnN0IGpzb25TdXBwbGllZFZhbHVlID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAgICAgcHJvcHNbaW52YWxpZFByb3BQYXRoXSxcbiAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgIDJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoanNvblN1cHBsaWVkVmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5jbHVkZXMoJ1xcbicsIGpzb25TdXBwbGllZFZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgKz0gYFxcblZhbHVlIHByb3ZpZGVkOiBcXG4ke2pzb25TdXBwbGllZFZhbHVlfWA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlICs9IGBcXG5WYWx1ZSBwcm92aWRlZDogJHtqc29uU3VwcGxpZWRWYWx1ZX1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIC8qXG4gICAgICAgICAqIE5vdCBhd2FyZSBvZiBvdGhlciBwcm9wIHR5cGUgd2FybmluZyBtZXNzYWdlcy5cbiAgICAgICAgICogQnV0LCBpZiB0aGV5IGV4aXN0LCB0aGVuIGF0IGxlYXN0IHRocm93IHRoZSBkZWZhdWx0XG4gICAgICAgICAqIHJlYWN0IHByb3AgdHlwZXMgZXJyb3JcbiAgICAgICAgICovXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbn1cbiIsImltcG9ydCB7aW5jbHVkZXMsIHR5cGV9IGZyb20gJ3JhbWRhJztcblxuY29uc3QgU0lNUExFX0NPTVBPTkVOVF9UWVBFUyA9IFsnU3RyaW5nJywgJ051bWJlcicsICdOdWxsJywgJ0Jvb2xlYW4nXTtcblxuZXhwb3J0IGRlZmF1bHQgY29tcG9uZW50ID0+IGluY2x1ZGVzKHR5cGUoY29tcG9uZW50KSwgU0lNUExFX0NPTVBPTkVOVF9UWVBFUyk7XG4iLCIvKipcbiAqIEdlbmVyYWxpemVkIHBlcnNpc3RlbmNlIGZvciBjb21wb25lbnQgcHJvcHNcbiAqXG4gKiBXaGVuIHVzZXJzIGlucHV0IG5ldyBwcm9wIHZhbHVlcywgdGhleSBjYW4gYmUgc3RvcmVkIGFuZCByZWFwcGxpZWQgbGF0ZXIsXG4gKiB3aGVuIHRoZSBjb21wb25lbnQgaXMgcmVjcmVhdGVkIChjaGFuZ2luZyBgVGFiYCBmb3IgZXhhbXBsZSkgb3Igd2hlbiB0aGVcbiAqIHBhZ2UgaXMgcmVsb2FkZWQgKGRlcGVuZGluZyBvbiBgcGVyc2lzdGVuY2VfdHlwZWApLiBTdG9yYWdlIGlzIHRpZWQgdG9cbiAqIGNvbXBvbmVudCBJRCwgYW5kIHRoZSBwcm9wIHZhbHVlcyB3aWxsIG5vdCBiZSBzdG9yZWQgd2l0aCBjb21wb25lbnRzXG4gKiB3aXRob3V0IGFuIElELlxuICpcbiAqIFJlbmRlcmVyIGhhbmRsZXMgdGhlIG1lY2hhbmljcywgYnV0IGNvbXBvbmVudHMgbXVzdCBkZWZpbmUgYSBmZXcgcHJvcHM6XG4gKlxuICogLSBgcGVyc2lzdGVuY2VgOiBib29sZWFuLCBzdHJpbmcsIG9yIG51bWJlci4gRm9yIHNpbXBsZSB1c2FnZSwgc2V0IHRvIGB0cnVlYFxuICogICB0byBlbmFibGUgcGVyc2lzdGVuY2UsIG9taXQgb3Igc2V0IGBmYWxzZWAgdG8gZGlzYWJsZS4gRm9yIG1vcmUgY29tcGxleFxuICogICBzY2VuYXJpb3MsIHVzZSBhbnkgdHJ1dGh5IHZhbHVlLCBhbmQgY2hhbmdlIHRvIGEgKmRpZmZlcmVudCogdHJ1dGh5IHZhbHVlXG4gKiAgIHdoZW4geW91IHdhbnQgdGhlIHBlcnNpc3RlZCB2YWx1ZXMgY2xlYXJlZC4gKG1vZGVsZWQgb2ZmIGB1aXJldmlzaW9uYCBpbilcbiAqICAgcGxvdGx5LmpzXG4gKiAgIFR5cGljYWxseSBzaG91bGQgaGF2ZSBubyBkZWZhdWx0LCBidXQgdGhlIG90aGVyIHBlcnNpc3RlbmNlIHByb3BzIHNob3VsZFxuICogICBoYXZlIGRlZmF1bHRzLCBzbyBhbGwgYSB1c2VyIG5lZWRzIHRvIGRvIHRvIGVuYWJsZSBwZXJzaXN0ZW5jZSBpcyBzZXQgdGhpc1xuICogICBvbmUgcHJvcC5cbiAqXG4gKiAtIGBwZXJzaXN0ZWRfcHJvcHNgOiBhcnJheSBvZiBwcm9wIG5hbWVzIG9yIFwibmVzdGVkIHByb3AgSURzXCIgYWxsb3dlZCB0b1xuICogICBwZXJzaXN0LiBOb3JtYWxseSBzaG91bGQgZGVmYXVsdCB0byB0aGUgZnVsbCBsaXN0IG9mIHN1cHBvcnRlZCBwcm9wcyxcbiAqICAgc28gdGhleSBjYW4gYWxsIGJlIGVuYWJsZWQgYXQgb25jZS4gVGhlIG1haW4gZXhjZXB0aW9uIHRvIHRoaXMgaXMgaWZcbiAqICAgdGhlcmUncyBhIHByb3AgdGhhdCAqY2FuKiBiZSBwZXJzaXN0ZWQgYnV0IG1vc3QgdXNlcnMgd291bGRuJ3Qgd2FudCB0aGlzLlxuICogICBBIG5lc3RlZCBwcm9wIElEIGRlc2NyaWJlcyAqcGFydCogb2YgYSBwcm9wIHRvIHN0b3JlLiBJdCBtdXN0IGJlXG4gKiAgIFwiPHByb3BOYW1lPi48cGllY2U+XCIgd2hlcmUgcHJvcE5hbWUgaXMgdGhlIHByb3AgdGhhdCBoYXMgdGhpcyBpbmZvLCBhbmRcbiAqICAgcGllY2UgbWF5IG9yIG1heSBub3QgbWFwIHRvIHRoZSBleGFjdCBzdWJzdHJ1Y3R1cmUgYmVpbmcgc3RvcmVkIGJ1dCBpc1xuICogICBtZWFuaW5nZnVsIHRvIHRoZSB1c2VyLiBGb3IgZXhhbXBsZSwgaW4gYGRhc2hfdGFibGVgLCBgY29sdW1ucy5uYW1lYFxuICogICBzdG9yZXMgYGNvbHVtbnNbaV0ubmFtZWAgZm9yIGFsbCBjb2x1bW5zIGBpYC4gTmVzdGVkIHByb3BzIGFsc28gbmVlZFxuICogICBlbnRyaWVzIGluIGBwZXJzaXN0ZW5jZVRyYW5zZm9ybXNgIC0gc2VlIGJlbG93LlxuICpcbiAqIC0gYHBlcnNpc3RlbmNlX3R5cGVgOiBvbmUgb2YgXCJsb2NhbFwiLCBcInNlc3Npb25cIiwgb3IgXCJtZW1vcnlcIiwganVzdCBsaWtlXG4gKiAgIGBkY2MuU3RvcmVgLiBCdXQgdGhlIGRlZmF1bHQgaGVyZSBzaG91bGQgYmUgXCJsb2NhbFwiIGJlY2F1c2UgdGhlIG1haW4gdXNlXG4gKiAgIGNhc2UgaXMgdG8gbWFpbnRhaW4gc2V0dGluZ3MgYWNyb3NzIHJlbG9hZHMuXG4gKlxuICogSWYgYW55IGBwZXJzaXN0ZWRfcHJvcHNgIGFyZSBuZXN0ZWQgcHJvcCBJRHMsIHRoZSBjb21wb25lbnQgc2hvdWxkIGRlZmluZSBhXG4gKiBjbGFzcyBwcm9wZXJ0eSAobm90IGEgUmVhY3QgcHJvcCkgYHBlcnNpc3RlbmNlVHJhbnNmb3Jtc2AsIGFzIGFuIG9iamVjdDpcbiAqIHtcbiAqICAgW3Byb3BOYW1lXToge1xuICogICAgIFtwaWVjZV06IHtcbiAqICAgICAgIGV4dHJhY3Q6IHByb3BWYWx1ZSA9PiB2YWx1ZVRvU3RvcmUsXG4gKiAgICAgICBhcHBseTogKHN0b3JlZFZhbHVlLCBwcm9wVmFsdWUpID0+IG5ld1Byb3BWYWx1ZVxuICogICAgIH1cbiAqICAgfVxuICogfVxuICogLSBgZXh0cmFjdGAgdHVybnMgYSBwcm9wIHZhbHVlIGludG8gYSByZWR1Y2VkIHZhbHVlIHRvIHN0b3JlLlxuICogLSBgYXBwbHlgIHB1dHMgYW4gZXh0cmFjdGVkIHZhbHVlIGJhY2sgaW50byB0aGUgcHJvcC4gTWFrZSBzdXJlIHRoaXMgY3JlYXRlc1xuICogICBhIG5ldyBvYmplY3QgcmF0aGVyIHRoYW4gbXV0YXRpbmcgYHByb1ZhbHVlYCwgYW5kIHRoYXQgaWYgdGhlcmUgYXJlXG4gKiAgIG11bHRpcGxlIGBwaWVjZWAgZW50cmllcyBmb3Igb25lIGBwcm9wTmFtZWAsIHRoZWlyIGBhcHBseWAgZnVuY3Rpb25zXG4gKiAgIGNvbW11dGUgLSB3aGljaCBzaG91bGQgbm90IGJlIGFuIGlzc3VlIGlmIHRoZXkgZXh0cmFjdCBhbmQgYXBwbHlcbiAqICAgbm9uLWludGVyc2VjdGluZyBwYXJ0cyBvZiB0aGUgZnVsbCBwcm9wLlxuICogWW91IG9ubHkgbmVlZCB0byBkZWZpbmUgdGhlc2UgZm9yIHRoZSBwcm9wcyB0aGF0IG5lZWQgdGhlbS5cbiAqIEl0J3MgaW1wb3J0YW50IHRoYXQgYGV4dHJhY3RgIHB1bGxzIG91dCAqb25seSogdGhlIHJlbGV2YW50IHBpZWNlcyBvZiB0aGVcbiAqIHByb3AsIGJlY2F1c2UgcGVyc2lzdGVuY2UgaXMgb25seSBtYWludGFpbmVkIGlmIHRoZSBleHRyYWN0ZWQgdmFsdWUgb2YgdGhlXG4gKiBwcm9wIGJlZm9yZSBhcHBseWluZyBwZXJzaXN0ZW5jZSBpcyB0aGUgc2FtZSBhcyBpdCB3YXMgYmVmb3JlIHRoZSB1c2VyJ3NcbiAqIGNoYW5nZXMuXG4gKi9cblxuaW1wb3J0IHtcbiAgICBlcXVhbHMsXG4gICAgZmlsdGVyLFxuICAgIGZvckVhY2gsXG4gICAga2V5cyxcbiAgICBsZW5zUGF0aCxcbiAgICBtZXJnZVJpZ2h0LFxuICAgIHNldCxcbiAgICB0eXBlXG59IGZyb20gJ3JhbWRhJztcbmltcG9ydCB7Y3JlYXRlQWN0aW9ufSBmcm9tICdyZWR1eC1hY3Rpb25zJztcblxuaW1wb3J0IFJlZ2lzdHJ5IGZyb20gJy4vcmVnaXN0cnknO1xuaW1wb3J0IHtzdHJpbmdpZnlJZH0gZnJvbSAnLi9hY3Rpb25zL2RlcGVuZGVuY2llcyc7XG5pbXBvcnQge2lzVW50b3VjaGVkQnlQYXRjaH0gZnJvbSAnLi9hY3Rpb25zL3BhdGNoQW5hbHlzaXMnO1xuaW1wb3J0IHtpc0RyeUNvbXBvbmVudH0gZnJvbSAnLi93cmFwcGVyL3dyYXBwaW5nJztcblxuZXhwb3J0IGNvbnN0IHN0b3JlUHJlZml4ID0gJ19kYXNoX3BlcnNpc3RlbmNlLic7XG5cbmZ1bmN0aW9uIGVycihlKSB7XG4gICAgY29uc3QgZXJyb3IgPSB0eXBlb2YgZSA9PT0gJ3N0cmluZycgPyBuZXcgRXJyb3IoZSkgOiBlO1xuXG4gICAgcmV0dXJuIGNyZWF0ZUFjdGlvbignT05fRVJST1InKSh7XG4gICAgICAgIHR5cGU6ICdmcm9udEVuZCcsXG4gICAgICAgIGVycm9yXG4gICAgfSk7XG59XG5cbi8qXG4gKiBEb2VzIGEga2V5IGZpdCB0aGlzIHByZWZpeD8gTXVzdCBlaXRoZXIgYmUgYW4gZXhhY3QgbWF0Y2hcbiAqIG9yLCBpZiBhIHNlcGFyYXRvciBpcyBwcm92aWRlZCwgYSBzY29wZWQgbWF0Y2ggLSBleGFjdCBwcmVmaXhcbiAqIGZvbGxvd2VkIGJ5IHRoZSBzZXBhcmF0b3IgKHRoZW4gYW55dGhpbmcgZWxzZSlcbiAqL1xuZnVuY3Rpb24ga2V5UHJlZml4TWF0Y2gocHJlZml4LCBzZXBhcmF0b3IpIHtcbiAgICBjb25zdCBmdWxsU3RyID0gcHJlZml4ICsgc2VwYXJhdG9yO1xuICAgIGNvbnN0IGZ1bGxMZW4gPSBmdWxsU3RyLmxlbmd0aDtcbiAgICByZXR1cm4ga2V5ID0+IGtleSA9PT0gcHJlZml4IHx8IGtleS5zdWJzdHIoMCwgZnVsbExlbikgPT09IGZ1bGxTdHI7XG59XG5cbmNvbnN0IFVOREVGSU5FRCA9ICdVJztcbmNvbnN0IF9wYXJzZSA9IHZhbCA9PiAodmFsID09PSBVTkRFRklORUQgPyB1bmRlZmluZWQgOiBKU09OLnBhcnNlKHZhbCB8fCBudWxsKSk7XG5jb25zdCBfc3RyaW5naWZ5ID0gdmFsID0+ICh2YWwgPT09IHVuZGVmaW5lZCA/IFVOREVGSU5FRCA6IEpTT04uc3RyaW5naWZ5KHZhbCkpO1xuXG5jbGFzcyBXZWJTdG9yZSB7XG4gICAgY29uc3RydWN0b3IoYmFja0VuZCkge1xuICAgICAgICB0aGlzLl9uYW1lID0gYmFja0VuZDtcbiAgICAgICAgdGhpcy5fc3RvcmFnZSA9IHdpbmRvd1tiYWNrRW5kXTtcbiAgICB9XG5cbiAgICBoYXNJdGVtKGtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RvcmFnZS5nZXRJdGVtKHN0b3JlUHJlZml4ICsga2V5KSAhPT0gbnVsbDtcbiAgICB9XG5cbiAgICBnZXRJdGVtKGtleSkge1xuICAgICAgICAvLyBub3RlOiBfc3RvcmFnZS5nZXRJdGVtIHJldHVybnMgbnVsbCBvbiBtaXNzaW5nIGtleXNcbiAgICAgICAgLy8gYW5kIEpTT04ucGFyc2UobnVsbCkgcmV0dXJucyBudWxsIGFzIHdlbGxcbiAgICAgICAgcmV0dXJuIF9wYXJzZSh0aGlzLl9zdG9yYWdlLmdldEl0ZW0oc3RvcmVQcmVmaXggKyBrZXkpKTtcbiAgICB9XG5cbiAgICBfc2V0SXRlbShrZXksIHZhbHVlKSB7XG4gICAgICAgIC8vIHVucHJvdGVjdGVkIHZlcnNpb24gb2Ygc2V0SXRlbSwgZm9yIHVzZSBieSB0cnlHZXRXZWJTdG9yZVxuICAgICAgICB0aGlzLl9zdG9yYWdlLnNldEl0ZW0oc3RvcmVQcmVmaXggKyBrZXksIF9zdHJpbmdpZnkodmFsdWUpKTtcbiAgICB9XG4gICAgLypcbiAgICAgKiBJbiBhZGRpdGlvbiB0byB0aGUgcmVndWxhciBrZXktPnZhbHVlIHRvIHNldCwgc2V0SXRlbSB0YWtlc1xuICAgICAqIGRpc3BhdGNoIGFzIGEgcGFyYW1ldGVyLCBzbyBpdCBjYW4gcmVwb3J0IE9PTSB0byBkZXZ0b29sc1xuICAgICAqL1xuICAgIHNldEl0ZW0oa2V5LCB2YWx1ZSwgZGlzcGF0Y2gpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuX3NldEl0ZW0oa2V5LCB2YWx1ZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoKFxuICAgICAgICAgICAgICAgIGVycihcbiAgICAgICAgICAgICAgICAgICAgYCR7a2V5fSBmYWlsZWQgdG8gc2F2ZSBpbiAke3RoaXMuX25hbWV9LiBQZXJzaXN0ZWQgcHJvcHMgbWF5IGJlIGxvc3QuYFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvLyBUT0RPOiBhdCBzb21lIHBvaW50IHdlIG1heSB3YW50IHRvIGNvbnZlcnQgdGhpcyB0byBmYWxsIGJhY2tcbiAgICAgICAgICAgIC8vIG9uIG1lbW9yeSwgcHVsbGluZyBvdXQgYWxsIHBlcnNpc3RlbmNlIGtleXMgYW5kIHB1dHRpbmcgdGhlbVxuICAgICAgICAgICAgLy8gaW4gYSBNZW1TdG9yZSB0aGF0IGdldHMgdXNlZCBmcm9tIHRoZW4gb253YXJkLlxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVtb3ZlSXRlbShrZXkpIHtcbiAgICAgICAgdGhpcy5fc3RvcmFnZS5yZW1vdmVJdGVtKHN0b3JlUHJlZml4ICsga2V5KTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIGNsZWFyIG1hdGNoaW5nIGtleXMgbWF0Y2hpbmcgKG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgYSBkb3QgYW5kIG1vcmVcbiAgICAgKiBjaGFyYWN0ZXJzKSAtIG9yIGFsbCBrZXlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN0b3JlIGlmIG5vIHByZWZpeC5cbiAgICAgKi9cbiAgICBjbGVhcihrZXlQcmVmaXgpIHtcbiAgICAgICAgY29uc3QgZnVsbFByZWZpeCA9IHN0b3JlUHJlZml4ICsgKGtleVByZWZpeCB8fCAnJyk7XG4gICAgICAgIGNvbnN0IGtleU1hdGNoID0ga2V5UHJlZml4TWF0Y2goZnVsbFByZWZpeCwga2V5UHJlZml4ID8gJy4nIDogJycpO1xuICAgICAgICBjb25zdCBrZXlzVG9SZW1vdmUgPSBbXTtcbiAgICAgICAgLy8gMi1zdGVwIHByb2Nlc3MsIHNvIHdlIGRvbid0IGRlcGVuZCBvbiBhbnkgcGFydGljdWxhciBiZWhhdmlvciBvZlxuICAgICAgICAvLyBrZXkgb3JkZXIgd2hpbGUgcmVtb3Zpbmcgc29tZVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX3N0b3JhZ2UubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGZ1bGxLZXkgPSB0aGlzLl9zdG9yYWdlLmtleShpKTtcbiAgICAgICAgICAgIGlmIChrZXlNYXRjaChmdWxsS2V5KSkge1xuICAgICAgICAgICAgICAgIGtleXNUb1JlbW92ZS5wdXNoKGZ1bGxLZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvckVhY2goayA9PiB0aGlzLl9zdG9yYWdlLnJlbW92ZUl0ZW0oayksIGtleXNUb1JlbW92ZSk7XG4gICAgfVxufVxuXG5jbGFzcyBNZW1TdG9yZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX2RhdGEgPSB7fTtcbiAgICB9XG5cbiAgICBoYXNJdGVtKGtleSkge1xuICAgICAgICByZXR1cm4ga2V5IGluIHRoaXMuX2RhdGE7XG4gICAgfVxuXG4gICAgZ2V0SXRlbShrZXkpIHtcbiAgICAgICAgLy8gcnVuIHRoaXMgc3RvcmFnZSB0aHJvdWdoIEpTT04gdG9vIHNvIHdlIGtub3cgd2UgZ2V0IGEgZnJlc2ggb2JqZWN0XG4gICAgICAgIC8vIGVhY2ggcmV0cmlldmFsXG4gICAgICAgIHJldHVybiBfcGFyc2UodGhpcy5fZGF0YVtrZXldKTtcbiAgICB9XG5cbiAgICBzZXRJdGVtKGtleSwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5fZGF0YVtrZXldID0gX3N0cmluZ2lmeSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcmVtb3ZlSXRlbShrZXkpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuX2RhdGFba2V5XTtcbiAgICB9XG5cbiAgICBjbGVhcihrZXlQcmVmaXgpIHtcbiAgICAgICAgaWYgKGtleVByZWZpeCkge1xuICAgICAgICAgICAgZm9yRWFjaChcbiAgICAgICAgICAgICAgICBrZXkgPT4gZGVsZXRlIHRoaXMuX2RhdGFba2V5XSxcbiAgICAgICAgICAgICAgICBmaWx0ZXIoa2V5UHJlZml4TWF0Y2goa2V5UHJlZml4LCAnLicpLCBrZXlzKHRoaXMuX2RhdGEpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2RhdGEgPSB7fTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8gTWFrZSBhIHN0cmluZyAyXjE2IGNoYXJhY3RlcnMgbG9uZyAoKjIgYnl0ZXMvY2hhciA9IDEzMGtCKSwgdG8gdGVzdCBzdG9yYWdlLlxuLy8gVGhhdCBzaG91bGQgYmUgcGxlbnR5IGZvciBjb21tb24gcGVyc2lzdGVuY2UgdXNlIGNhc2VzLFxuLy8gd2l0aG91dCBnZXR0aW5nIGFueXdoZXJlIG5lYXIgdHlwaWNhbCBicm93c2VyIGxpbWl0c1xuY29uc3QgcG93ID0gMTY7XG5mdW5jdGlvbiBsb25nU3RyaW5nKCkge1xuICAgIGxldCBzID0gJ1NwYW0nO1xuICAgIGZvciAobGV0IGkgPSAyOyBpIDwgcG93OyBpKyspIHtcbiAgICAgICAgcyArPSBzO1xuICAgIH1cbiAgICByZXR1cm4gcztcbn1cblxuZXhwb3J0IGNvbnN0IHN0b3JlcyA9IHtcbiAgICBtZW1vcnk6IG5ldyBNZW1TdG9yZSgpXG4gICAgLy8gRGVmZXIgdGVzdGluZyAmIG1ha2luZyBsb2NhbC9zZXNzaW9uIHN0b3JlcyB1bnRpbCByZXF1ZXN0ZWQuXG4gICAgLy8gVGhhdCB3YXkgaWYgd2UgaGF2ZSBlcnJvcnMgaGVyZSB0aGV5IGNhbiBzaG93IHVwIGluIGRldnRvb2xzLlxufTtcblxuY29uc3QgYmFja0VuZHMgPSB7XG4gICAgbG9jYWw6ICdsb2NhbFN0b3JhZ2UnLFxuICAgIHNlc3Npb246ICdzZXNzaW9uU3RvcmFnZSdcbn07XG5cbmZ1bmN0aW9uIHRyeUdldFdlYlN0b3JlKGJhY2tFbmQsIGRpc3BhdGNoKSB7XG4gICAgY29uc3Qgc3RvcmUgPSBuZXcgV2ViU3RvcmUoYmFja0VuZCk7XG4gICAgY29uc3QgZmFsbGJhY2tTdG9yZSA9IHN0b3Jlcy5tZW1vcnk7XG4gICAgY29uc3Qgc3RvcmVUZXN0ID0gbG9uZ1N0cmluZygpO1xuICAgIGNvbnN0IHRlc3RLZXkgPSBzdG9yZVByZWZpeCArICd4LngnO1xuICAgIHRyeSB7XG4gICAgICAgIHN0b3JlLl9zZXRJdGVtKHRlc3RLZXksIHN0b3JlVGVzdCk7XG4gICAgICAgIGlmIChzdG9yZS5nZXRJdGVtKHRlc3RLZXkpICE9PSBzdG9yZVRlc3QpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoKFxuICAgICAgICAgICAgICAgIGVycihgJHtiYWNrRW5kfSBpbml0IGZhaWxlZCBzZXQvZ2V0LCBmYWxsaW5nIGJhY2sgdG8gbWVtb3J5YClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gZmFsbGJhY2tTdG9yZTtcbiAgICAgICAgfVxuICAgICAgICBzdG9yZS5yZW1vdmVJdGVtKHRlc3RLZXkpO1xuICAgICAgICByZXR1cm4gc3RvcmU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBkaXNwYXRjaChcbiAgICAgICAgICAgIGVycihgJHtiYWNrRW5kfSBpbml0IGZpcnN0IHRyeSBmYWlsZWQ7IGNsZWFyaW5nIGFuZCByZXRyeWluZ2ApXG4gICAgICAgICk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIHN0b3JlLmNsZWFyKCk7XG4gICAgICAgIHN0b3JlLl9zZXRJdGVtKHRlc3RLZXksIHN0b3JlVGVzdCk7XG4gICAgICAgIGlmIChzdG9yZS5nZXRJdGVtKHRlc3RLZXkpICE9PSBzdG9yZVRlc3QpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbm9wZScpO1xuICAgICAgICB9XG4gICAgICAgIHN0b3JlLnJlbW92ZUl0ZW0odGVzdEtleSk7XG4gICAgICAgIGRpc3BhdGNoKGVycihgJHtiYWNrRW5kfSBpbml0IHNldC9nZXQgc3VjY2VlZGVkIGFmdGVyIGNsZWFyaW5nIWApKTtcbiAgICAgICAgcmV0dXJuIHN0b3JlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgZGlzcGF0Y2goZXJyKGAke2JhY2tFbmR9IGluaXQgc3RpbGwgZmFpbGVkLCBmYWxsaW5nIGJhY2sgdG8gbWVtb3J5YCkpO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2tTdG9yZTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGdldFN0b3JlKHR5cGUsIGRpc3BhdGNoKSB7XG4gICAgaWYgKCFzdG9yZXNbdHlwZV0pIHtcbiAgICAgICAgc3RvcmVzW3R5cGVdID0gdHJ5R2V0V2ViU3RvcmUoYmFja0VuZHNbdHlwZV0sIGRpc3BhdGNoKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0b3Jlc1t0eXBlXTtcbn1cblxuY29uc3Qgbm9vcFRyYW5zZm9ybSA9IHtcbiAgICBleHRyYWN0OiBwcm9wVmFsdWUgPT4gcHJvcFZhbHVlLFxuICAgIGFwcGx5OiAoc3RvcmVkVmFsdWUsIF9wcm9wVmFsdWUpID0+IHN0b3JlZFZhbHVlXG59O1xuXG5jb25zdCBnZXRUcmFuc2Zvcm0gPSAoZWxlbWVudCwgcHJvcE5hbWUsIHByb3BQYXJ0KSA9PiB7XG4gICAgaWYgKFxuICAgICAgICBlbGVtZW50LnBlcnNpc3RlbmNlVHJhbnNmb3JtcyAmJlxuICAgICAgICBlbGVtZW50LnBlcnNpc3RlbmNlVHJhbnNmb3Jtc1twcm9wTmFtZV1cbiAgICApIHtcbiAgICAgICAgaWYgKHByb3BQYXJ0KSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5wZXJzaXN0ZW5jZVRyYW5zZm9ybXNbcHJvcE5hbWVdW3Byb3BQYXJ0XTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZWxlbWVudC5wZXJzaXN0ZW5jZVRyYW5zZm9ybXNbcHJvcE5hbWVdO1xuICAgIH1cbiAgICByZXR1cm4gbm9vcFRyYW5zZm9ybTtcbn07XG5cbmNvbnN0IGdldFZhbHNLZXkgPSAoaWQsIHBlcnNpc3RlZFByb3AsIHBlcnNpc3RlbmNlKSA9PlxuICAgIGAke3N0cmluZ2lmeUlkKGlkKX0uJHtwZXJzaXN0ZWRQcm9wfS4ke0pTT04uc3RyaW5naWZ5KHBlcnNpc3RlbmNlKX1gO1xuXG5jb25zdCBnZXRQcm9wcyA9IGxheW91dCA9PiB7XG4gICAgY29uc3Qge3Byb3BzLCB0eXBlLCBuYW1lc3BhY2V9ID0gbGF5b3V0O1xuICAgIGlmICghdHlwZSB8fCAhbmFtZXNwYWNlKSB7XG4gICAgICAgIC8vIG5vdCBhIHJlYWwgY29tcG9uZW50IC0ganVzdCBuZWVkIHRoZSBwcm9wcyBmb3IgcmVjdXJzaW9uXG4gICAgICAgIHJldHVybiB7cHJvcHN9O1xuICAgIH1cbiAgICBjb25zdCB7aWQsIHBlcnNpc3RlbmNlfSA9IHByb3BzO1xuXG4gICAgY29uc3QgZWxlbWVudCA9IFJlZ2lzdHJ5LnJlc29sdmUobGF5b3V0KTtcbiAgICBjb25zdCBnZXRWYWwgPSBwcm9wID0+XG4gICAgICAgIHByb3BzW3Byb3BdIHx8XG4gICAgICAgIChlbGVtZW50LmRlZmF1bHRQcm9wcyB8fCBlbGVtZW50LmRhc2hQZXJzaXN0ZW5jZSB8fCB7fSlbcHJvcF07XG4gICAgY29uc3QgcGVyc2lzdGVkX3Byb3BzID0gZ2V0VmFsKCdwZXJzaXN0ZWRfcHJvcHMnKTtcbiAgICBjb25zdCBwZXJzaXN0ZW5jZV90eXBlID0gZ2V0VmFsKCdwZXJzaXN0ZW5jZV90eXBlJyk7XG4gICAgY29uc3QgY2FuUGVyc2lzdCA9IGlkICYmIHBlcnNpc3RlZF9wcm9wcyAmJiBwZXJzaXN0ZW5jZV90eXBlO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgY2FuUGVyc2lzdCxcbiAgICAgICAgaWQsXG4gICAgICAgIHByb3BzLFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICBwZXJzaXN0ZW5jZSxcbiAgICAgICAgcGVyc2lzdGVkX3Byb3BzLFxuICAgICAgICBwZXJzaXN0ZW5jZV90eXBlXG4gICAgfTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiByZWNvcmRVaUVkaXQobGF5b3V0LCBuZXdQcm9wcywgZGlzcGF0Y2gpIHtcbiAgICBjb25zdCB7XG4gICAgICAgIGNhblBlcnNpc3QsXG4gICAgICAgIGlkLFxuICAgICAgICBwcm9wcyxcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgcGVyc2lzdGVuY2UsXG4gICAgICAgIHBlcnNpc3RlZF9wcm9wcyxcbiAgICAgICAgcGVyc2lzdGVuY2VfdHlwZVxuICAgIH0gPSBnZXRQcm9wcyhsYXlvdXQpO1xuXG4gICAgLy8gaWYgdGhlIFwicGVyc2lzdGVuY2VcIiBwcm9wZXJ0eSBpcyBjaGFuZ2VkIGFzIGEgY2FsbGJhY2sgb3V0cHV0LFxuICAgIC8vIHNraXAgdGhlIHBlcnNpc3RlbmNlIHN0b3JhZ2Ugb3ZlcndyaXRpbmcuXG4gICAgY29uc3QgaXNQZXJzaXN0ZW5jZU1pc21hdGNoID1cbiAgICAgICAgbmV3UHJvcHM/LnBlcnNpc3RlbmNlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgbmV3UHJvcHMucGVyc2lzdGVuY2UgIT09IHBlcnNpc3RlbmNlO1xuXG4gICAgaWYgKCFjYW5QZXJzaXN0IHx8ICFwZXJzaXN0ZW5jZSB8fCBpc1BlcnNpc3RlbmNlTWlzbWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvckVhY2gocGVyc2lzdGVkUHJvcCA9PiB7XG4gICAgICAgIGNvbnN0IFtwcm9wTmFtZSwgcHJvcFBhcnRdID0gcGVyc2lzdGVkUHJvcC5zcGxpdCgnLicpO1xuICAgICAgICBpZiAobmV3UHJvcHNbcHJvcE5hbWVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0b3JhZ2UgPSBnZXRTdG9yZShwZXJzaXN0ZW5jZV90eXBlLCBkaXNwYXRjaCk7XG4gICAgICAgICAgICBjb25zdCB7ZXh0cmFjdH0gPSBnZXRUcmFuc2Zvcm0oZWxlbWVudCwgcHJvcE5hbWUsIHByb3BQYXJ0KTtcblxuICAgICAgICAgICAgY29uc3QgdmFsc0tleSA9IGdldFZhbHNLZXkoaWQsIHBlcnNpc3RlZFByb3AsIHBlcnNpc3RlbmNlKTtcbiAgICAgICAgICAgIGxldCBvcmlnaW5hbFZhbCA9IGV4dHJhY3QocHJvcHNbcHJvcE5hbWVdKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld1ZhbCA9IGV4dHJhY3QobmV3UHJvcHNbcHJvcE5hbWVdKTtcblxuICAgICAgICAgICAgLy8gbWFpbmx5IGZvciBuZXN0ZWQgcHJvcHMgd2l0aCBtdWx0aXBsZSBwZXJzaXN0ZWQgcGFydHMsIGl0J3NcbiAgICAgICAgICAgIC8vIHBvc3NpYmxlIHRvIGhhdmUgdGhlIHNhbWUgdmFsdWUgYXMgYmVmb3JlIC0gc2hvdWxkIG5vdCBzdG9yZVxuICAgICAgICAgICAgLy8gaW4gdGhpcyBjYXNlLlxuICAgICAgICAgICAgaWYgKG9yaWdpbmFsVmFsICE9PSBuZXdWYWwpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RvcmFnZS5oYXNJdGVtKHZhbHNLZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsVmFsID0gc3RvcmFnZS5nZXRJdGVtKHZhbHNLZXkpWzFdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCB2YWxzID1cbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxWYWwgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBbbmV3VmFsXVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBbbmV3VmFsLCBvcmlnaW5hbFZhbF07XG4gICAgICAgICAgICAgICAgc3RvcmFnZS5zZXRJdGVtKHZhbHNLZXksIHZhbHMsIGRpc3BhdGNoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sIHBlcnNpc3RlZF9wcm9wcyk7XG59XG5cbi8qXG4gKiBVc2VkIGZvciBlbnRpcmUgbGF5b3V0cyAob24gbG9hZCkgb3IgcGFydGlhbCBsYXlvdXRzIChmcm9tIGNoaWxkcmVuXG4gKiBjYWxsYmFja3MpIHRvIGFwcGx5IHByZXZpb3VzbHktc3RvcmVkIFVJIGVkaXRzIHRvIGNvbXBvbmVudHNcbiAqXG4gKiBgcGF0Y2hBbmFseXNpc2AgKG9wdGlvbmFsKSBkZXNjcmliZXMgd2hhdCB0aGUgYFBhdGNoKClgIHRoYXQgcHJvZHVjZWQgdGhpc1xuICogbGF5b3V0IGNoYW5nZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5UGVyc2lzdGVuY2UobGF5b3V0LCBkaXNwYXRjaCwgcGF0Y2hBbmFseXNpcykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGxheW91dCkpIHtcbiAgICAgICAgcmV0dXJuIGxheW91dC5tYXAobGF5ID0+XG4gICAgICAgICAgICBpc0RyeUNvbXBvbmVudChsYXkpXG4gICAgICAgICAgICAgICAgPyBwZXJzaXN0ZW5jZU1vZHMobGF5LCBsYXksIFtdLCBkaXNwYXRjaCwgcGF0Y2hBbmFseXNpcylcbiAgICAgICAgICAgICAgICA6IGxheVxuICAgICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcGVyc2lzdGVuY2VNb2RzKGxheW91dCwgbGF5b3V0LCBbXSwgZGlzcGF0Y2gsIHBhdGNoQW5hbHlzaXMpO1xufVxuXG5jb25zdCBVTkRPID0gdHJ1ZTtcbmZ1bmN0aW9uIG1vZFByb3Aoa2V5LCBzdG9yYWdlLCBlbGVtZW50LCBwcm9wcywgcGVyc2lzdGVkUHJvcCwgdXBkYXRlLCB1bmRvKSB7XG4gICAgaWYgKHN0b3JhZ2UuaGFzSXRlbShrZXkpKSB7XG4gICAgICAgIGNvbnN0IFtuZXdWYWwsIG9yaWdpbmFsVmFsXSA9IHN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuICAgICAgICBjb25zdCBmcm9tVmFsID0gdW5kbyA/IG5ld1ZhbCA6IG9yaWdpbmFsVmFsO1xuICAgICAgICBjb25zdCB0b1ZhbCA9IHVuZG8gPyBvcmlnaW5hbFZhbCA6IG5ld1ZhbDtcbiAgICAgICAgY29uc3QgW3Byb3BOYW1lLCBwcm9wUGFydF0gPSBwZXJzaXN0ZWRQcm9wLnNwbGl0KCcuJyk7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IGdldFRyYW5zZm9ybShlbGVtZW50LCBwcm9wTmFtZSwgcHJvcFBhcnQpO1xuXG4gICAgICAgIGlmIChlcXVhbHMoZnJvbVZhbCwgdHJhbnNmb3JtLmV4dHJhY3QocHJvcHNbcHJvcE5hbWVdKSkpIHtcbiAgICAgICAgICAgIHVwZGF0ZVtwcm9wTmFtZV0gPSB0cmFuc2Zvcm0uYXBwbHkoXG4gICAgICAgICAgICAgICAgdG9WYWwsXG4gICAgICAgICAgICAgICAgcHJvcE5hbWUgaW4gdXBkYXRlID8gdXBkYXRlW3Byb3BOYW1lXSA6IHByb3BzW3Byb3BOYW1lXVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGNsZWFyIHRoaXMgc2F2ZWQgZWRpdCAtIHdlJ3ZlIHN0YXJ0ZWQgd2l0aCB0aGUgd3JvbmdcbiAgICAgICAgICAgIC8vIHZhbHVlIGZvciB0aGlzIHBlcnNpc3RlbmNlIElEXG4gICAgICAgICAgICBzdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gcGVyc2lzdGVuY2VNb2RzKGxheW91dCwgY29tcG9uZW50LCB0cmVlUGF0aCwgZGlzcGF0Y2gsIHBhdGNoQW5hbHlzaXMpIHtcbiAgICBjb25zdCB7XG4gICAgICAgIGNhblBlcnNpc3QsXG4gICAgICAgIGlkLFxuICAgICAgICBwcm9wcyxcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgcGVyc2lzdGVuY2UsXG4gICAgICAgIHBlcnNpc3RlZF9wcm9wcyxcbiAgICAgICAgcGVyc2lzdGVuY2VfdHlwZVxuICAgIH0gPSBnZXRQcm9wcyhjb21wb25lbnQpO1xuXG4gICAgbGV0IGxheW91dE91dCA9IGxheW91dDtcblxuICAgIC8vIFNraXAgdGhlIGNvbXBvbmVudHMgYSBQYXRjaCBjYXJyaWVkIG92ZXIgZnJvbSB0aGUgcHJldmlvdXMgbGF5b3V0XG4gICAgLy8gdW50b3VjaGVkLiBUaGUgcGF0Y2ggaXRzZWxmIHRlbGxzIHVzIHdoaWNoXG4gICAgLy8gY29tcG9uZW50cyBpdCBjcmVhdGVkIGFuZCB3aGljaCBwcm9wcyBpdCB3cm90ZVxuICAgIC8vIE5vdGUgdGhhdCBhIGNvbXBvbmVudCByZWJ1aWx0IHdpdGggYW4gaWQgdGhhdCB3YXMgYWxyZWFkeSBpbiB1c2UgaXNcbiAgICAvLyBub3QgY2FycmllZCBvdmVyLiBJdCBjb21lcyB3aXRoIHRoZSBzZXJ2ZXIncyBkZWZhdWx0IHZhbHVlLCBzbyBpdHNcbiAgICAvLyBwZXJzaXN0ZWQgZWRpdCBtdXN0IGJlIHJlc3RvcmVkXG4gICAgY29uc3QgY2FycmllZE92ZXIgPSBwYXRjaEFuYWx5c2lzXG4gICAgICAgID8gaXNVbnRvdWNoZWRCeVBhdGNoKHBhdGNoQW5hbHlzaXMsIGlkICYmIHN0cmluZ2lmeUlkKGlkKSlcbiAgICAgICAgOiBmYWxzZTtcblxuICAgIGlmIChjYW5QZXJzaXN0ICYmIHBlcnNpc3RlbmNlICYmICFjYXJyaWVkT3Zlcikge1xuICAgICAgICBjb25zdCBzdG9yYWdlID0gZ2V0U3RvcmUocGVyc2lzdGVuY2VfdHlwZSwgZGlzcGF0Y2gpO1xuICAgICAgICBjb25zdCB1cGRhdGUgPSB7fTtcbiAgICAgICAgZm9yRWFjaChcbiAgICAgICAgICAgIHBlcnNpc3RlZFByb3AgPT5cbiAgICAgICAgICAgICAgICBtb2RQcm9wKFxuICAgICAgICAgICAgICAgICAgICBnZXRWYWxzS2V5KGlkLCBwZXJzaXN0ZWRQcm9wLCBwZXJzaXN0ZW5jZSksXG4gICAgICAgICAgICAgICAgICAgIHN0b3JhZ2UsXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIHByb3BzLFxuICAgICAgICAgICAgICAgICAgICBwZXJzaXN0ZWRQcm9wLFxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgcGVyc2lzdGVkX3Byb3BzXG4gICAgICAgICk7XG5cbiAgICAgICAgZm9yIChjb25zdCBwcm9wTmFtZSBpbiB1cGRhdGUpIHtcbiAgICAgICAgICAgIGxheW91dE91dCA9IHNldChcbiAgICAgICAgICAgICAgICBsZW5zUGF0aCh0cmVlUGF0aC5jb25jYXQoJ3Byb3BzJywgcHJvcE5hbWUpKSxcbiAgICAgICAgICAgICAgICB1cGRhdGVbcHJvcE5hbWVdLFxuICAgICAgICAgICAgICAgIGxheW91dE91dFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHJlY3Vyc2UgaW53YXJkXG4gICAgY29uc3Qge2NoaWxkcmVufSA9IHByb3BzO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkge1xuICAgICAgICBjaGlsZHJlbi5mb3JFYWNoKChjaGlsZCwgaSkgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGUoY2hpbGQpID09PSAnT2JqZWN0JyAmJiBjaGlsZC5wcm9wcykge1xuICAgICAgICAgICAgICAgIGxheW91dE91dCA9IHBlcnNpc3RlbmNlTW9kcyhcbiAgICAgICAgICAgICAgICAgICAgbGF5b3V0T3V0LFxuICAgICAgICAgICAgICAgICAgICBjaGlsZCxcbiAgICAgICAgICAgICAgICAgICAgdHJlZVBhdGguY29uY2F0KCdwcm9wcycsICdjaGlsZHJlbicsIGkpLFxuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaCxcbiAgICAgICAgICAgICAgICAgICAgcGF0Y2hBbmFseXNpc1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodHlwZShjaGlsZHJlbikgPT09ICdPYmplY3QnICYmIGNoaWxkcmVuLnByb3BzKSB7XG4gICAgICAgIGxheW91dE91dCA9IHBlcnNpc3RlbmNlTW9kcyhcbiAgICAgICAgICAgIGxheW91dE91dCxcbiAgICAgICAgICAgIGNoaWxkcmVuLFxuICAgICAgICAgICAgdHJlZVBhdGguY29uY2F0KCdwcm9wcycsICdjaGlsZHJlbicpLFxuICAgICAgICAgICAgZGlzcGF0Y2gsXG4gICAgICAgICAgICBwYXRjaEFuYWx5c2lzXG4gICAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBsYXlvdXRPdXQ7XG59XG5cbi8qXG4gKiBXaGVuIHdlIHJlY2VpdmUgbmV3IGV4cGxpY2l0IHByb3BzIGZyb20gYSBjYWxsYmFjayxcbiAqIHRoZXNlIG92ZXJyaWRlIFVJLWRyaXZlbiBlZGl0cyBvZiB0aG9zZSBleGFjdCBwcm9wc1xuICogYnV0IG5vdCBmb3IgcHJvcHMgbmVzdGVkIGluc2lkZSBjaGlsZHJlblxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJ1bmVQZXJzaXN0ZW5jZShsYXlvdXQsIG5ld1Byb3BzLCBkaXNwYXRjaCkge1xuICAgIGNvbnN0IHtcbiAgICAgICAgY2FuUGVyc2lzdCxcbiAgICAgICAgaWQsXG4gICAgICAgIHByb3BzLFxuICAgICAgICBwZXJzaXN0ZW5jZSxcbiAgICAgICAgcGVyc2lzdGVkX3Byb3BzLFxuICAgICAgICBwZXJzaXN0ZW5jZV90eXBlLFxuICAgICAgICBlbGVtZW50XG4gICAgfSA9IGdldFByb3BzKGxheW91dCk7XG5cbiAgICBjb25zdCBnZXRGaW5hbCA9IChwcm9wTmFtZSwgcHJldlZhbCkgPT5cbiAgICAgICAgcHJvcE5hbWUgaW4gbmV3UHJvcHMgPyBuZXdQcm9wc1twcm9wTmFtZV0gOiBwcmV2VmFsO1xuICAgIGNvbnN0IGZpbmFsUGVyc2lzdGVuY2UgPSBnZXRGaW5hbCgncGVyc2lzdGVuY2UnLCBwZXJzaXN0ZW5jZSk7XG5cbiAgICBpZiAoIWNhblBlcnNpc3QgfHwgIShwZXJzaXN0ZW5jZSB8fCBmaW5hbFBlcnNpc3RlbmNlKSkge1xuICAgICAgICByZXR1cm4gbmV3UHJvcHM7XG4gICAgfVxuXG4gICAgY29uc3QgZmluYWxQZXJzaXN0ZW5jZVR5cGUgPSBnZXRGaW5hbCgncGVyc2lzdGVuY2VfdHlwZScsIHBlcnNpc3RlbmNlX3R5cGUpO1xuICAgIGNvbnN0IGZpbmFsUGVyc2lzdGVkUHJvcHMgPSBnZXRGaW5hbCgncGVyc2lzdGVkX3Byb3BzJywgcGVyc2lzdGVkX3Byb3BzKTtcbiAgICBjb25zdCBwZXJzaXN0ZW5jZUNoYW5nZWQgPVxuICAgICAgICBmaW5hbFBlcnNpc3RlbmNlICE9PSBwZXJzaXN0ZW5jZSB8fFxuICAgICAgICBmaW5hbFBlcnNpc3RlbmNlVHlwZSAhPT0gcGVyc2lzdGVuY2VfdHlwZSB8fFxuICAgICAgICBmaW5hbFBlcnNpc3RlZFByb3BzICE9PSBwZXJzaXN0ZWRfcHJvcHM7XG5cbiAgICBjb25zdCBub3RJbk5ld1Byb3BzID0gcGVyc2lzdGVkUHJvcCA9PlxuICAgICAgICAhKHBlcnNpc3RlZFByb3Auc3BsaXQoJy4nKVswXSBpbiBuZXdQcm9wcyk7XG5cbiAgICBjb25zdCB1cGRhdGUgPSB7fTtcblxuICAgIGxldCBkZXBlcnNpc3RlZFByb3BzID0gcHJvcHM7XG5cbiAgICBpZiAocGVyc2lzdGVuY2VDaGFuZ2VkICYmIHBlcnNpc3RlbmNlKSB7XG4gICAgICAgIC8vIGNsZWFyIHByZXZpb3VzbHktYXBwbGllZCBwZXJzaXN0ZW5jZVxuICAgICAgICBjb25zdCBzdG9yYWdlID0gZ2V0U3RvcmUocGVyc2lzdGVuY2VfdHlwZSwgZGlzcGF0Y2gpO1xuICAgICAgICBmb3JFYWNoKFxuICAgICAgICAgICAgcGVyc2lzdGVkUHJvcCA9PlxuICAgICAgICAgICAgICAgIG1vZFByb3AoXG4gICAgICAgICAgICAgICAgICAgIGdldFZhbHNLZXkoaWQsIHBlcnNpc3RlZFByb3AsIHBlcnNpc3RlbmNlKSxcbiAgICAgICAgICAgICAgICAgICAgc3RvcmFnZSxcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgICAgICAgICAgIHBlcnNpc3RlZFByb3AsXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgVU5ET1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICBmaWx0ZXIobm90SW5OZXdQcm9wcywgcGVyc2lzdGVkX3Byb3BzKVxuICAgICAgICApO1xuICAgICAgICBkZXBlcnNpc3RlZFByb3BzID0gbWVyZ2VSaWdodChwcm9wcywgdXBkYXRlKTtcbiAgICB9XG5cbiAgICBpZiAoZmluYWxQZXJzaXN0ZW5jZSAmJiBwZXJzaXN0ZW5jZUNoYW5nZWQpIHtcbiAgICAgICAgY29uc3QgZmluYWxTdG9yYWdlID0gZ2V0U3RvcmUoZmluYWxQZXJzaXN0ZW5jZVR5cGUsIGRpc3BhdGNoKTtcbiAgICAgICAgLy8gYXBwbHkgbmV3IHBlcnNpc3RlbmNlXG4gICAgICAgIGZvckVhY2goXG4gICAgICAgICAgICBwZXJzaXN0ZWRQcm9wID0+XG4gICAgICAgICAgICAgICAgbW9kUHJvcChcbiAgICAgICAgICAgICAgICAgICAgZ2V0VmFsc0tleShpZCwgcGVyc2lzdGVkUHJvcCwgZmluYWxQZXJzaXN0ZW5jZSksXG4gICAgICAgICAgICAgICAgICAgIGZpbmFsU3RvcmFnZSxcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgZGVwZXJzaXN0ZWRQcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgcGVyc2lzdGVkUHJvcCxcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGZpbHRlcihub3RJbk5ld1Byb3BzLCBmaW5hbFBlcnNpc3RlZFByb3BzKVxuICAgICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcGVyc2lzdGVuY2VDaGFuZ2VkID8gbWVyZ2VSaWdodChuZXdQcm9wcywgdXBkYXRlKSA6IG5ld1Byb3BzO1xufVxuIiwiLyoqXG4gKiBSZWFjdCBjb21wYXRpYmlsaXR5IHNoaW1cbiAqXG4gKiBQcm92aWRlcyBjb21wYXRpYmlsaXR5IGZvciBjb21wb25lbnQgcGFja2FnZXMgYnVuZGxlZCBhZ2FpbnN0IG90aGVyIFJlYWN0XG4gKiB2ZXJzaW9ucyB0aGFuIHRoZSBvbmUgbG9hZGVkIG9uIHRoZSBwYWdlOlxuICpcbiAqIDEuIFJlYWN0Q3VycmVudE93bmVyIHN0dWIgLSBSZWFjdCAxOSByZW1vdmVkXG4gKiAgICBfX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRCBidXQgbWFueSBjb21wb25lbnRcbiAqICAgIGxpYnJhcmllcyBidWlsdCBhZ2FpbnN0IFJlYWN0IDw9MTggc3RpbGwgYWNjZXNzIGl0IGF0IGxvYWQgdGltZS5cbiAqXG4gKiAyLiBMZWdhY3kgZWxlbWVudCBzeW1ib2wgLSBSZWFjdCAxOSBjaGFuZ2VkIHRoZSBlbGVtZW50ICQkdHlwZW9mIHN5bWJvbFxuICogICAgZnJvbSAncmVhY3QuZWxlbWVudCcgdG8gJ3JlYWN0LnRyYW5zaXRpb25hbC5lbGVtZW50JyBhbmQgdGhyb3dzXG4gKiAgICBlcnJvciAjNTI1IG9uIGVsZW1lbnRzIGNhcnJ5aW5nIHRoZSBvbGQgc3ltYm9sLiBMaWJyYXJpZXMgdGhhdFxuICogICAgcHJlLWJ1bmRsZWQgYSBSZWFjdCA8PTE4IGNvcHkgb2YgcmVhY3QvanN4LXJ1bnRpbWUgY3JlYXRlIHN1Y2hcbiAqICAgIGVsZW1lbnRzLiBUaGlzIHNoaW0gcnVucyBhZnRlciBSZWFjdCAod2hvc2Ugb3duIHN5bWJvbHMgYXJlIGFscmVhZHlcbiAqICAgIGNvbXB1dGVkKSBidXQgYmVmb3JlIGNvbXBvbmVudCBwYWNrYWdlcywgc28gcmVkaXJlY3RpbmdcbiAqICAgIFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKSB0byB0aGUgdHJhbnNpdGlvbmFsIHN5bWJvbCBtYWtlcyB0aG9zZVxuICogICAgYnVuZGxlZCBydW50aW1lcyBwcm9kdWNlIGVsZW1lbnRzIHRoZSBsb2FkZWQgUmVhY3QgMTkgYWNjZXB0cy5cbiAqXG4gKiAzLiBHbG9iYWwganN4LXJ1bnRpbWUgKHdpbmRvdy5SZWFjdEpTWFJ1bnRpbWUpIC0gY29tcG9uZW50cyBleHRlcm5hbGl6ZVxuICogICAgcmVhY3QvanN4LXJ1bnRpbWUgYW5kIHJlYWN0L2pzeC1kZXYtcnVudGltZSB0byB0aGlzIGdsb2JhbCwgc28gdGhlaXJcbiAqICAgIGVsZW1lbnRzIGFyZSBhbHdheXMgY3JlYXRlZCBieSB0aGUgUmVhY3QgdmVyc2lvbiBsb2FkZWQgb24gdGhlIHBhZ2UuXG4gKlxuICogVGhpcyBmaWxlIGlzIGxvYWRlZCBzdGFuZGFsb25lIHJpZ2h0IGFmdGVyIHJlYWN0L3JlYWN0LWRvbSwgYmVmb3JlIGFueVxuICogY29tcG9uZW50IHBhY2thZ2UuIEl0IGlzIGFsc28gaW1wb3J0ZWQgYXQgdGhlIHRvcCBvZiB0aGUgZGFzaC1yZW5kZXJlclxuICogYnVuZGxlLCBhbmQgdGhlIHdlYnBhY2sgY29uZmlncyAocmVuZGVyZXIsIGRjYywgaHRtbCwgdGFibGUpIGVtYmVkIGEgY29weVxuICogb2YgdGhlIGpzeCBmYWxsYmFjayBpbiB0aGVpciByZWFjdC9qc3gtcnVudGltZSBleHRlcm5hbCBzbyBidW5kbGVzIGJ1aWx0XG4gKiB3aXRoIHRoYXQgY29udmVudGlvbiBrZWVwIHdvcmtpbmcgb24gb2xkZXIgRGFzaCwgd2hpY2ggbmV2ZXIgZGVmaW5lc1xuICogd2luZG93LlJlYWN0SlNYUnVudGltZS4gSXQgbXVzdCBzdGF5IGlkZW1wb3RlbnQsIGFuZCB0aGUganN4IGltcGxlbWVudGF0aW9uXG4gKiBtdXN0IHN0YXkgaW4gc3luYyB3aXRoIHRoZSBmYWxsYmFjayBpbiB0aG9zZSBjb25maWdzLlxuICovXG4oZnVuY3Rpb24gKCkge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2Ygd2luZG93LlJlYWN0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIFJlYWN0ID0gd2luZG93LlJlYWN0O1xuXG4gICAgLy8gUHJvdmlkZSBSZWFjdEN1cnJlbnRPd25lciBzdHViIGZvciBSZWFjdCAxOVxuICAgIHZhciBpbnRlcm5hbHMgPSBSZWFjdC5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRDtcbiAgICBpZiAoIWludGVybmFscykge1xuICAgICAgICBSZWFjdC5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRCA9IHtcbiAgICAgICAgICAgIFJlYWN0Q3VycmVudE93bmVyOiB7Y3VycmVudDogbnVsbH0sXG4gICAgICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyOiB7Y3VycmVudDogbnVsbH0sXG4gICAgICAgICAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZzoge3RyYW5zaXRpb246IG51bGx9XG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmICghaW50ZXJuYWxzLlJlYWN0Q3VycmVudE93bmVyKSB7XG4gICAgICAgIGludGVybmFscy5SZWFjdEN1cnJlbnRPd25lciA9IHtjdXJyZW50OiBudWxsfTtcbiAgICB9XG5cbiAgICAvLyBSZWRpcmVjdCB0aGUgbGVnYWN5IGVsZW1lbnQgc3ltYm9sIGZvciBjb2RlIGxvYWRlZCBhZnRlciB0aGlzIHNoaW1cbiAgICB2YXIgcmVhY3RNYWpvciA9IHBhcnNlSW50KChSZWFjdC52ZXJzaW9uIHx8ICcnKS5zcGxpdCgnLicpWzBdLCAxMCk7XG4gICAgaWYgKFxuICAgICAgICByZWFjdE1ham9yID49IDE5ICYmXG4gICAgICAgIFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKSAhPT0gU3ltYm9sLmZvcigncmVhY3QudHJhbnNpdGlvbmFsLmVsZW1lbnQnKVxuICAgICkge1xuICAgICAgICB2YXIgZWxlbWVudFN5bWJvbCA9IFN5bWJvbC5mb3IoJ3JlYWN0LnRyYW5zaXRpb25hbC5lbGVtZW50Jyk7XG4gICAgICAgIHZhciBvcmlnaW5hbFN5bWJvbEZvciA9IFN5bWJvbC5mb3I7XG4gICAgICAgIFN5bWJvbC5mb3IgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBpZiAoa2V5ID09PSAncmVhY3QuZWxlbWVudCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudFN5bWJvbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbFN5bWJvbEZvci5hcHBseShTeW1ib2wsIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKHdpbmRvdy5SZWFjdEpTWFJ1bnRpbWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFByb3ZpZGUgYSBnbG9iYWwganN4LXJ1bnRpbWUgYmFja2VkIGJ5IHRoZSBsb2FkZWQgUmVhY3QncyBjcmVhdGVFbGVtZW50XG4gICAgLy8gc28gZWxlbWVudHMgYXJlIGNyZWF0ZWQgaW4gdGhlIGZvcm1hdCB0aGUgbG9hZGVkIFJlYWN0IGV4cGVjdHMuXG4gICAgZnVuY3Rpb24ganN4KHR5cGUsIGNvbmZpZywgbWF5YmVLZXkpIHtcbiAgICAgICAgdmFyIHByb3BzID0ge307XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IG51bGw7XG5cbiAgICAgICAgaWYgKGNvbmZpZyAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoY29uZmlnLmtleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcHJvcHMua2V5ID0gJycgKyBjb25maWcua2V5O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiBjb25maWcpIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsIHByb3BOYW1lKSAmJlxuICAgICAgICAgICAgICAgICAgICBwcm9wTmFtZSAhPT0gJ2tleScgJiZcbiAgICAgICAgICAgICAgICAgICAgcHJvcE5hbWUgIT09ICdfX3NlbGYnICYmXG4gICAgICAgICAgICAgICAgICAgIHByb3BOYW1lICE9PSAnX19zb3VyY2UnXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wTmFtZSA9PT0gJ2NoaWxkcmVuJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBjb25maWdbcHJvcE5hbWVdO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gY29uZmlnW3Byb3BOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEtleSBwYXNzZWQgYXMgdGhpcmQgYXJndW1lbnQgb3ZlcnJpZGVzIGNvbmZpZy5rZXlcbiAgICAgICAgaWYgKG1heWJlS2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHByb3BzLmtleSA9ICcnICsgbWF5YmVLZXk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hpbGRyZW4gIT09IG51bGwgJiYgY2hpbGRyZW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQuYXBwbHkoXG4gICAgICAgICAgICAgICAgICAgIFJlYWN0LFxuICAgICAgICAgICAgICAgICAgICBbdHlwZSwgcHJvcHNdLmNvbmNhdChjaGlsZHJlbilcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQodHlwZSwgcHJvcHMsIGNoaWxkcmVuKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudCh0eXBlLCBwcm9wcyk7XG4gICAgfVxuXG4gICAgd2luZG93LlJlYWN0SlNYUnVudGltZSA9IHtcbiAgICAgICAganN4OiBqc3gsXG4gICAgICAgIGpzeHM6IGpzeCwgLy8ganN4cyBpcyBqc3ggd2l0aCBzdGF0aWMgY2hpbGRyZW5cbiAgICAgICAganN4REVWOiBqc3gsIC8vIGpzeC1kZXYtcnVudGltZTsgZXh0cmEgZGV2LW9ubHkgYXJndW1lbnRzIGFyZSBpZ25vcmVkXG4gICAgICAgIEZyYWdtZW50OiBSZWFjdC5GcmFnbWVudFxuICAgIH07XG59KSgpO1xuIiwiaW1wb3J0IHthc3NvYywgYXNzb2NQYXRoLCBtZXJnZVJpZ2h0fSBmcm9tICdyYW1kYSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNyZWF0ZUFwaVJlZHVjZXIoc3RvcmUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gQXBpUmVkdWNlcihzdGF0ZSA9IHt9LCBhY3Rpb24pIHtcbiAgICAgICAgbGV0IG5ld1N0YXRlID0gc3RhdGU7XG4gICAgICAgIGlmIChhY3Rpb24udHlwZSA9PT0gc3RvcmUpIHtcbiAgICAgICAgICAgIGNvbnN0IHtpZCwgc3RhdHVzLCBjb250ZW50fSA9IGFjdGlvbi5wYXlsb2FkO1xuICAgICAgICAgICAgY29uc3QgbmV3UmVxdWVzdCA9IHtzdGF0dXMsIGNvbnRlbnR9O1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaWQpKSB7XG4gICAgICAgICAgICAgICAgbmV3U3RhdGUgPSBhc3NvY1BhdGgoaWQsIG5ld1JlcXVlc3QsIHN0YXRlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaWQpIHtcbiAgICAgICAgICAgICAgICBuZXdTdGF0ZSA9IGFzc29jKGlkLCBuZXdSZXF1ZXN0LCBzdGF0ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG5ld1N0YXRlID0gbWVyZ2VSaWdodChzdGF0ZSwgbmV3UmVxdWVzdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ld1N0YXRlO1xuICAgIH07XG59XG4iLCJpbXBvcnQge2dldEFjdGlvbn0gZnJvbSAnLi4vYWN0aW9ucy9jb25zdGFudHMnO1xuaW1wb3J0IHtnZXRBcHBTdGF0ZX0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG5mdW5jdGlvbiBhcHBMaWZlY3ljbGUoc3RhdGUgPSBnZXRBcHBTdGF0ZSgnU1RBUlRFRCcpLCBhY3Rpb24pIHtcbiAgICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgICAgIGNhc2UgZ2V0QWN0aW9uKCdTRVRfQVBQX0xJRkVDWUNMRScpOlxuICAgICAgICAgICAgcmV0dXJuIGdldEFwcFN0YXRlKGFjdGlvbi5wYXlsb2FkKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGFwcExpZmVjeWNsZTtcbiIsImNvbnN0IGluaXRpYWxDaGFuZ2UgPSB7XG4gICAgaWQ6IG51bGwsXG4gICAgcHJvcHM6IHt9XG59O1xuXG5mdW5jdGlvbiBjaGFuZ2VkKHN0YXRlID0gaW5pdGlhbENoYW5nZSkge1xuICAgIC8vIFRoaXMgaXMgZW1wdHkganVzdCB0byBpbml0aWFsaXplIHRoZSBzdG9yZS4gQ2hhbmdlc1xuICAgIC8vIGFyZSBhY3R1YWxseSByZWNvcmRlZCBpbiByZWR1Y2VyLmpzIHNvIHRoYXQgd2UgY2FuXG4gICAgLy8gcmVzb2x2ZSBwYXRocyB0byBpZC5cbiAgICByZXR1cm4gc3RhdGU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNoYW5nZWQ7XG4iLCJpbXBvcnQge2dldEFjdGlvbn0gZnJvbSAnLi4vYWN0aW9ucy9jb25zdGFudHMnO1xuaW1wb3J0IHttZXJnZURlZXBSaWdodH0gZnJvbSAncmFtZGEnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb25maWcoc3RhdGUgPSBudWxsLCBhY3Rpb24pIHtcbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGdldEFjdGlvbignU0VUX0NPTkZJRycpKSB7XG4gICAgICAgIC8vIFB1dCB0aGUgY29tcG9uZW50cyBjaGlsZHJlblByb3BzIGluIHdpbmRvd3MgZm9yIHNpZGUgdXNhZ2UuXG4gICAgICAgIHdpbmRvdy5fX2Rhc2hwcml2YXRlX2NoaWxkcmVuUHJvcHMgPSBtZXJnZURlZXBSaWdodChcbiAgICAgICAgICAgIHdpbmRvdy5fX2Rhc2hwcml2YXRlX2NoaWxkcmVuUHJvcHMgfHwge30sXG4gICAgICAgICAgICBhY3Rpb24ucGF5bG9hZC5jaGlsZHJlbl9wcm9wc1xuICAgICAgICApO1xuICAgICAgICByZXR1cm4gYWN0aW9uLnBheWxvYWQ7XG4gICAgfSBlbHNlIGlmIChhY3Rpb24udHlwZSA9PT0gZ2V0QWN0aW9uKCdBRERfSFRUUF9IRUFERVJTJykpIHtcbiAgICAgICAgcmV0dXJuIG1lcmdlRGVlcFJpZ2h0KHN0YXRlLCB7XG4gICAgICAgICAgICBmZXRjaDoge1xuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGFjdGlvbi5wYXlsb2FkXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gc3RhdGU7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gZ2V0QXBwU3RhdGUoc3RhdGUpIHtcbiAgICBjb25zdCBzdGF0ZUxpc3QgPSB7XG4gICAgICAgIFNUQVJURUQ6ICdTVEFSVEVEJyxcbiAgICAgICAgSFlEUkFURUQ6ICdIWURSQVRFRCcsXG4gICAgICAgIERFU1RST1lFRDogJ0RFU1RST1lFRCdcbiAgICB9O1xuICAgIGlmIChzdGF0ZUxpc3Rbc3RhdGVdKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZUxpc3Rbc3RhdGVdO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c3RhdGV9IGlzIG5vdCBhIHZhbGlkIGFwcCBzdGF0ZS5gKTtcbn1cbiIsImNvbnN0IGluaXRpYWxHcmFwaCA9IHt9O1xuXG5jb25zdCBncmFwaHMgPSAoc3RhdGUgPSBpbml0aWFsR3JhcGgsIGFjdGlvbikgPT4ge1xuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gJ1NFVF9HUkFQSFMnKSB7XG4gICAgICAgIHJldHVybiBhY3Rpb24ucGF5bG9hZDtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZ3JhcGhzO1xuIiwiaW1wb3J0IHttZXJnZVJpZ2h0fSBmcm9tICdyYW1kYSc7XG5cbmNvbnN0IGluaXRpYWxFcnJvciA9IHtcbiAgICBmcm9udEVuZDogW10sXG4gICAgYmFja0VuZDogW10sXG4gICAgYmFja0VuZENvbm5lY3RlZDogdHJ1ZVxufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZXJyb3Ioc3RhdGUgPSBpbml0aWFsRXJyb3IsIGFjdGlvbikge1xuICAgIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnT05fRVJST1InOiB7XG4gICAgICAgICAgICBjb25zdCB7ZnJvbnRFbmQsIGJhY2tFbmQsIGJhY2tFbmRDb25uZWN0ZWR9ID0gc3RhdGU7XG4gICAgICAgICAgICAvLyBsb2cgZXJyb3JzIHRvIHRoZSBjb25zb2xlIGZvciBzdGFjayB0cmFjaW5nIGFuZCBzbyB0aGV5J3JlXG4gICAgICAgICAgICAvLyBhdmFpbGFibGUgZXZlbiB3aXRoIGRlYnVnZ2luZyBvZmZcbiAgICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlICovXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGFjdGlvbi5wYXlsb2FkLmVycm9yKTtcblxuICAgICAgICAgICAgaWYgKGFjdGlvbi5wYXlsb2FkLnR5cGUgPT09ICdmcm9udEVuZCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBmcm9udEVuZDogW1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2VSaWdodChhY3Rpb24ucGF5bG9hZCwge3RpbWVzdGFtcDogbmV3IERhdGUoKX0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uZnJvbnRFbmRcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgYmFja0VuZCxcbiAgICAgICAgICAgICAgICAgICAgYmFja0VuZENvbm5lY3RlZFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5wYXlsb2FkLnR5cGUgPT09ICdiYWNrRW5kJykge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGZyb250RW5kLFxuICAgICAgICAgICAgICAgICAgICBiYWNrRW5kOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXJnZVJpZ2h0KGFjdGlvbi5wYXlsb2FkLCB7dGltZXN0YW1wOiBuZXcgRGF0ZSgpfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5iYWNrRW5kXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIGJhY2tFbmRDb25uZWN0ZWRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ1NFVF9DT05ORUNUSU9OX1NUQVRVUyc6IHtcbiAgICAgICAgICAgIHJldHVybiBtZXJnZVJpZ2h0KHN0YXRlLCB7YmFja0VuZENvbm5lY3RlZDogYWN0aW9uLnBheWxvYWR9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImNvbnN0IGluaXRpYWxIaXN0b3J5ID0ge1xuICAgIHBhc3Q6IFtdLFxuICAgIHByZXNlbnQ6IHt9LFxuICAgIGZ1dHVyZTogW11cbn07XG5cbmZ1bmN0aW9uIGhpc3Rvcnkoc3RhdGUgPSBpbml0aWFsSGlzdG9yeSwgYWN0aW9uKSB7XG4gICAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgICAgICBjYXNlICdVTkRPJzoge1xuICAgICAgICAgICAgY29uc3Qge3Bhc3QsIHByZXNlbnQsIGZ1dHVyZX0gPSBzdGF0ZTtcbiAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzID0gcGFzdFtwYXN0Lmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgY29uc3QgbmV3UGFzdCA9IHBhc3Quc2xpY2UoMCwgcGFzdC5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgcGFzdDogbmV3UGFzdCxcbiAgICAgICAgICAgICAgICBwcmVzZW50OiBwcmV2aW91cyxcbiAgICAgICAgICAgICAgICBmdXR1cmU6IFtwcmVzZW50LCAuLi5mdXR1cmVdXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAnUkVETyc6IHtcbiAgICAgICAgICAgIGNvbnN0IHtwYXN0LCBwcmVzZW50LCBmdXR1cmV9ID0gc3RhdGU7XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gZnV0dXJlWzBdO1xuICAgICAgICAgICAgY29uc3QgbmV3RnV0dXJlID0gZnV0dXJlLnNsaWNlKDEpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBwYXN0OiBbLi4ucGFzdCwgcHJlc2VudF0sXG4gICAgICAgICAgICAgICAgcHJlc2VudDogbmV4dCxcbiAgICAgICAgICAgICAgICBmdXR1cmU6IG5ld0Z1dHVyZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ1JFVkVSVCc6IHtcbiAgICAgICAgICAgIGNvbnN0IHtwYXN0LCBmdXR1cmV9ID0gc3RhdGU7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IHBhc3RbcGFzdC5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIGNvbnN0IG5ld1Bhc3QgPSBwYXN0LnNsaWNlKDAsIHBhc3QubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHBhc3Q6IG5ld1Bhc3QsXG4gICAgICAgICAgICAgICAgcHJlc2VudDogcHJldmlvdXMsXG4gICAgICAgICAgICAgICAgZnV0dXJlOiBbLi4uZnV0dXJlXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgaGlzdG9yeTtcbiIsImNvbnN0IGN1c3RvbUhvb2tzID0gKFxuICAgIHN0YXRlID0ge1xuICAgICAgICBsYXlvdXRfcHJlOiBudWxsLFxuICAgICAgICBsYXlvdXRfcG9zdDogbnVsbCxcbiAgICAgICAgcmVxdWVzdF9wcmU6IG51bGwsXG4gICAgICAgIHJlcXVlc3RfcG9zdDogbnVsbCxcbiAgICAgICAgY2FsbGJhY2tfcmVzb2x2ZWQ6IG51bGwsXG4gICAgICAgIHJlcXVlc3RfcmVmcmVzaF9qd3Q6IG51bGwsXG4gICAgICAgIGJlYXI6IGZhbHNlXG4gICAgfSxcbiAgICBhY3Rpb25cbikgPT4ge1xuICAgIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnU0VUX0hPT0tTJzpcbiAgICAgICAgICAgIHJldHVybiBhY3Rpb24ucGF5bG9hZDtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjdXN0b21Ib29rcztcbiIsImltcG9ydCB7XG4gICAgaW5jbHVkZXMsXG4gICAgbWVyZ2VSaWdodCxcbiAgICBhcHBlbmQsXG4gICAgdmlldyxcbiAgICBsZW5zUGF0aCxcbiAgICBhc3NvY1BhdGgsXG4gICAgZGlzc29jUGF0aFxufSBmcm9tICdyYW1kYSc7XG5cbmltcG9ydCB7Z2V0QWN0aW9ufSBmcm9tICcuLi9hY3Rpb25zL2NvbnN0YW50cyc7XG5cbmNvbnN0IGxheW91dCA9IChzdGF0ZSA9IHtjb21wb25lbnRzOiBbXX0sIGFjdGlvbikgPT4ge1xuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gZ2V0QWN0aW9uKCdTRVRfTEFZT1VUJykpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYWN0aW9uLnBheWxvYWQpKSB7XG4gICAgICAgICAgICBzdGF0ZS5jb21wb25lbnRzID0gWy4uLmFjdGlvbi5wYXlsb2FkXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXRlLmNvbXBvbmVudHMgPSB7Li4uYWN0aW9uLnBheWxvYWR9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIGluY2x1ZGVzKGFjdGlvbi50eXBlLCBbXG4gICAgICAgICAgICAnVU5ET19QUk9QX0NIQU5HRScsXG4gICAgICAgICAgICAnUkVET19QUk9QX0NIQU5HRScsXG4gICAgICAgICAgICBnZXRBY3Rpb24oJ09OX1BST1BfQ0hBTkdFJylcbiAgICAgICAgXSlcbiAgICApIHtcbiAgICAgICAgY29uc3QgcHJvcFBhdGggPSBhcHBlbmQoJ3Byb3BzJywgYWN0aW9uLnBheWxvYWQuaXRlbXBhdGgpO1xuICAgICAgICBjb25zdCBleGlzdGluZ1Byb3BzID0gdmlldyhsZW5zUGF0aChwcm9wUGF0aCksIHN0YXRlKTtcbiAgICAgICAgY29uc3QgbWVyZ2VkUHJvcHMgPSBtZXJnZVJpZ2h0KGV4aXN0aW5nUHJvcHMsIGFjdGlvbi5wYXlsb2FkLnByb3BzKTtcbiAgICAgICAgcmV0dXJuIGFzc29jUGF0aChwcm9wUGF0aCwgbWVyZ2VkUHJvcHMsIHN0YXRlKTtcbiAgICB9XG4gICAgLy8gQ3VzdG9tIGNvbXBvbmVudCByZW5kZXJlZCBvdXQgb2YgdHJlZS5cbiAgICBlbHNlIGlmIChhY3Rpb24udHlwZSA9PT0gZ2V0QWN0aW9uKCdJTlNFUlRfQ09NUE9ORU5UJykpIHtcbiAgICAgICAgY29uc3Qge2NvbXBvbmVudCwgY29tcG9uZW50UGF0aH0gPSBhY3Rpb24ucGF5bG9hZDtcbiAgICAgICAgcmV0dXJuIGFzc29jUGF0aChjb21wb25lbnRQYXRoLCBjb21wb25lbnQsIHN0YXRlKTtcbiAgICB9IGVsc2UgaWYgKGFjdGlvbi50eXBlID09PSBnZXRBY3Rpb24oJ1JFTU9WRV9DT01QT05FTlQnKSkge1xuICAgICAgICBjb25zdCB7Y29tcG9uZW50UGF0aH0gPSBhY3Rpb24ucGF5bG9hZDtcbiAgICAgICAgcmV0dXJuIGRpc3NvY1BhdGgoY29tcG9uZW50UGF0aCwgc3RhdGUpO1xuICAgIH1cblxuICAgIHJldHVybiBzdGF0ZTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGxheW91dDtcbiIsImltcG9ydCB7Z2V0QWN0aW9ufSBmcm9tICcuLi9hY3Rpb25zL2NvbnN0YW50cyc7XG5cbmNvbnN0IGluaXRpYWxQYXRocyA9IHtzdHJzOiB7fSwgb2Jqczoge30sIG9iakluZGV4OiB7fX07XG5cbmNvbnN0IHBhdGhzID0gKHN0YXRlID0gaW5pdGlhbFBhdGhzLCBhY3Rpb24pID0+IHtcbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGdldEFjdGlvbignU0VUX1BBVEhTJykpIHtcbiAgICAgICAgcmV0dXJuIGFjdGlvbi5wYXlsb2FkO1xuICAgIH1cbiAgICByZXR1cm4gc3RhdGU7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBwYXRocztcbiIsImltcG9ydCB7Y2xvbmV9IGZyb20gJ3JhbWRhJztcblxuaW1wb3J0IHtTVEFUVVNNQVB9IGZyb20gJy4uL2NvbnN0YW50cy9jb25zdGFudHMnO1xuXG5jb25zdCBkZWZhdWx0UHJvZmlsZSA9IHtcbiAgICBjb3VudDogMCxcbiAgICB0b3RhbDogMCxcbiAgICBjb21wdXRlOiAwLFxuICAgIG5ldHdvcms6IHtcbiAgICAgICAgdGltZTogMCxcbiAgICAgICAgdXBsb2FkOiAwLFxuICAgICAgICBkb3dubG9hZDogMFxuICAgIH0sXG4gICAgcmVzb3VyY2VzOiB7fSxcbiAgICBzdGF0dXM6IHtcbiAgICAgICAgbGF0ZXN0OiBudWxsXG4gICAgfSxcbiAgICByZXN1bHQ6IHt9XG59O1xuXG5jb25zdCBkZWZhdWx0U3RhdGUgPSB7XG4gICAgdXBkYXRlZDogW10sXG4gICAgcmVzb3VyY2VzOiB7fSxcbiAgICBjYWxsYmFja3M6IHt9LFxuICAgIGdyYXBoTGF5b3V0OiBudWxsXG59O1xuXG5jb25zdCBwcm9maWxlID0gKHN0YXRlID0gZGVmYXVsdFN0YXRlLCBhY3Rpb24pID0+IHtcbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09ICdVUERBVEVfUkVTT1VSQ0VfVVNBR0UnKSB7XG4gICAgICAgIC8vIEtlZXAgYSByZWNvcmQgb2YgdGhlIG1vc3QgcmVjZW50IGNoYW5nZS4gVGhpc1xuICAgICAgICAvLyBpcyBzdWJ0bHkgZGlmZmVyZW50IGZyb20gaGlzdG9yeS5wcmVzZW50IGJlY2F1c2VcbiAgICAgICAgLy8gaXQgd2F0Y2hlcyBhbGwgcHJvcHMsIG5vdCBqdXN0IGlucHV0cy5cbiAgICAgICAgY29uc3Qge2lkLCB1c2FnZSwgc3RhdHVzfSA9IGFjdGlvbi5wYXlsb2FkO1xuICAgICAgICBjb25zdCBzdGF0dXNNYXBwZWQgPSBTVEFUVVNNQVBbc3RhdHVzXSB8fCBzdGF0dXM7XG5cbiAgICAgICAgLy8gS2VlcCB0cmFjayBvZiB0aGUgY2FsbGJhY2sgdGhhdCBhY3R1YWxseSBjaGFuZ2VkLlxuICAgICAgICBjb25zdCBuZXdTdGF0ZSA9IHtcbiAgICAgICAgICAgIHVwZGF0ZWQ6IFtpZF0sXG4gICAgICAgICAgICByZXNvdXJjZXM6IHN0YXRlLnJlc291cmNlcyxcbiAgICAgICAgICAgIGNhbGxiYWNrczogc3RhdGUuY2FsbGJhY2tzLFxuICAgICAgICAgICAgLy8gZ3JhcGhMYXlvdXQgaXMgbmV2ZXIgcGFzc2VkIGluIHZpYSBhY3Rpb25zLCBiZWNhdXNlIHdlIGRvbid0XG4gICAgICAgICAgICAvLyB3YW50IGl0IHRvIHRyaWdnZXIgYSByZXJlbmRlciBvZiB0aGUgY2FsbGJhY2sgZ3JhcGguXG4gICAgICAgICAgICAvLyBTZWUgQ2FsbGJhY2tHcmFwaENvbnRhaW5lci5yZWFjdFxuICAgICAgICAgICAgZ3JhcGhMYXlvdXQ6IHN0YXRlLmdyYXBoTGF5b3V0XG4gICAgICAgIH07XG5cbiAgICAgICAgbmV3U3RhdGUuY2FsbGJhY2tzW2lkXSA9XG4gICAgICAgICAgICBuZXdTdGF0ZS5jYWxsYmFja3NbaWRdIHx8IGNsb25lKGRlZmF1bHRQcm9maWxlKTtcblxuICAgICAgICBjb25zdCBjYiA9IG5ld1N0YXRlLmNhbGxiYWNrc1tpZF07XG4gICAgICAgIGNvbnN0IGNiUmVzb3VyY2VzID0gY2IucmVzb3VyY2VzO1xuICAgICAgICBjb25zdCB0b3RhbFJlc291cmNlcyA9IG5ld1N0YXRlLnJlc291cmNlcztcblxuICAgICAgICAvLyBVcGRhdGUgcmVzb3VyY2UgdXNhZ2UgJiBwYXJhbXMuXG4gICAgICAgIGNiLmNvdW50ICs9IDE7XG4gICAgICAgIGNiLnN0YXR1cy5sYXRlc3QgPSBzdGF0dXNNYXBwZWQ7XG4gICAgICAgIGNiLnN0YXR1c1tzdGF0dXNNYXBwZWRdID0gKGNiLnN0YXR1c1tzdGF0dXNNYXBwZWRdIHx8IDApICsgMTtcbiAgICAgICAgY2IucmVzdWx0ID0gYWN0aW9uLnBheWxvYWQucmVzdWx0O1xuICAgICAgICBjYi5pbnB1dHMgPSBhY3Rpb24ucGF5bG9hZC5pbnB1dHM7XG4gICAgICAgIGNiLnN0YXRlID0gYWN0aW9uLnBheWxvYWQuc3RhdGU7XG5cbiAgICAgICAgaWYgKHVzYWdlKSB7XG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgX19kYXNoX2NsaWVudCxcbiAgICAgICAgICAgICAgICBfX2Rhc2hfc2VydmVyLFxuICAgICAgICAgICAgICAgIF9fZGFzaF91cGxvYWQsXG4gICAgICAgICAgICAgICAgX19kYXNoX2Rvd25sb2FkLFxuICAgICAgICAgICAgICAgIC4uLnVzZXJcbiAgICAgICAgICAgIH0gPSB1c2FnZTtcblxuICAgICAgICAgICAgY2IudG90YWwgKz0gX19kYXNoX2NsaWVudDtcbiAgICAgICAgICAgIGNiLmNvbXB1dGUgKz0gX19kYXNoX3NlcnZlcjtcbiAgICAgICAgICAgIGNiLm5ldHdvcmsudGltZSArPSBfX2Rhc2hfY2xpZW50IC0gX19kYXNoX3NlcnZlcjtcbiAgICAgICAgICAgIGNiLm5ldHdvcmsudXBsb2FkICs9IF9fZGFzaF91cGxvYWQ7XG4gICAgICAgICAgICBjYi5uZXR3b3JrLmRvd25sb2FkICs9IF9fZGFzaF9kb3dubG9hZDtcblxuICAgICAgICAgICAgZm9yIChjb25zdCByIGluIHVzZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAodXNlci5oYXNPd25Qcm9wZXJ0eShyKSkge1xuICAgICAgICAgICAgICAgICAgICBjYlJlc291cmNlc1tyXSA9IChjYlJlc291cmNlc1tyXSB8fCAwKSArIHVzZXJbcl07XG4gICAgICAgICAgICAgICAgICAgIHRvdGFsUmVzb3VyY2VzW3JdID0gKHRvdGFsUmVzb3VyY2VzW3JdIHx8IDApICsgdXNlcltyXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3U3RhdGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0YXRlO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgcHJvZmlsZTtcbiIsImltcG9ydCB7Zm9yRWFjaCwgaW5jbHVkZXMsIGlzRW1wdHksIGtleXMsIHBhdGgsIGFzc29jLCBwYXRoT3J9IGZyb20gJ3JhbWRhJztcbmltcG9ydCB7Y29tYmluZVJlZHVjZXJzfSBmcm9tICdyZWR1eCc7XG5cbmltcG9ydCB7Z2V0Q2FsbGJhY2tzQnlJbnB1dH0gZnJvbSAnLi4vYWN0aW9ucy9kZXBlbmRlbmNpZXNfdHMnO1xuXG5pbXBvcnQgY3JlYXRlQXBpUmVkdWNlciBmcm9tICcuL2FwaSc7XG5pbXBvcnQgYXBwTGlmZWN5Y2xlIGZyb20gJy4vYXBwTGlmZWN5Y2xlJztcbmltcG9ydCBjYWxsYmFja3MgZnJvbSAnLi9jYWxsYmFja3MnO1xuaW1wb3J0IGNvbmZpZyBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQgZ3JhcGhzIGZyb20gJy4vZGVwZW5kZW5jeUdyYXBoJztcbmltcG9ydCBlcnJvciBmcm9tICcuL2Vycm9yJztcbmltcG9ydCBoaXN0b3J5IGZyb20gJy4vaGlzdG9yeSc7XG5pbXBvcnQgaG9va3MgZnJvbSAnLi9ob29rcyc7XG5pbXBvcnQgcHJvZmlsZSBmcm9tICcuL3Byb2ZpbGUnO1xuaW1wb3J0IGNoYW5nZWQgZnJvbSAnLi9jaGFuZ2VkJztcbmltcG9ydCBpc0xvYWRpbmcgZnJvbSAnLi9pc0xvYWRpbmcnO1xuaW1wb3J0IGxheW91dCBmcm9tICcuL2xheW91dCc7XG5pbXBvcnQgcGF0aHMgZnJvbSAnLi9wYXRocyc7XG5pbXBvcnQgY2FsbGJhY2tKb2JzIGZyb20gJy4vY2FsbGJhY2tKb2JzJztcbmltcG9ydCBsb2FkaW5nIGZyb20gJy4vbG9hZGluZyc7XG5pbXBvcnQge3N0cmluZ2lmeVBhdGh9IGZyb20gJy4uL3dyYXBwZXIvd3JhcHBpbmcnO1xuXG5leHBvcnQgY29uc3QgYXBpUmVxdWVzdHMgPSBbXG4gICAgJ2RlcGVuZGVuY2llc1JlcXVlc3QnLFxuICAgICdsYXlvdXRSZXF1ZXN0JyxcbiAgICAncmVsb2FkUmVxdWVzdCcsXG4gICAgJ2xvZ2luUmVxdWVzdCdcbl07XG5cbmNvbnN0IGxheW91dEhhc2hlcyA9IChzdGF0ZSA9IHt9LCBhY3Rpb24pID0+IHtcbiAgICBpZiAoXG4gICAgICAgIGluY2x1ZGVzKGFjdGlvbi50eXBlLCBbXG4gICAgICAgICAgICAnVU5ET19QUk9QX0NIQU5HRScsXG4gICAgICAgICAgICAnUkVET19QUk9QX0NIQU5HRScsXG4gICAgICAgICAgICAnT05fUFJPUF9DSEFOR0UnXG4gICAgICAgIF0pXG4gICAgKSB7XG4gICAgICAgIC8vIExldCB1cyBjb21wYXJlIHRoZSBwYXRocyBzdW1zIHRvIGdldCB1cGRhdGVzIHdpdGhvdXQgdHJpZ2dlcmluZ1xuICAgICAgICAvLyByZW5kZXIgb24gdGhlIHBhcmVudCBjb250YWluZXJzLlxuICAgICAgICBjb25zdCBhY3Rpb25QYXRoID0gYWN0aW9uLnBheWxvYWQuaXRlbXBhdGg7XG4gICAgICAgIGNvbnN0IHN0clBhdGggPSBzdHJpbmdpZnlQYXRoKGFjdGlvblBhdGgpO1xuICAgICAgICBjb25zdCBwcmV2ID0gcGF0aE9yKDAsIFtzdHJQYXRoLCAnaGFzaCddLCBzdGF0ZSk7XG4gICAgICAgIHN0YXRlID0gYXNzb2MoXG4gICAgICAgICAgICBzdHJQYXRoLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGhhc2g6IHByZXYgKyAxLFxuICAgICAgICAgICAgICAgIGNoYW5nZWRQcm9wczogYWN0aW9uLnBheWxvYWQucHJvcHMsXG4gICAgICAgICAgICAgICAgcmVuZGVyVHlwZTogYWN0aW9uLnBheWxvYWQucmVuZGVyVHlwZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN0YXRlXG4gICAgICAgICk7XG4gICAgfSBlbHNlIGlmIChhY3Rpb24udHlwZSA9PT0gJ1JFU0VUX0NPTVBPTkVOVF9TVEFURScpIHtcbiAgICAgICAgY29uc3Qge2l0ZW1wYXRofSA9IGFjdGlvbi5wYXlsb2FkO1xuICAgICAgICBpZiAoaXRlbXBhdGgpIHtcbiAgICAgICAgICAgIGNvbnN0IHByZWZpeFN0ciA9IHN0cmluZ2lmeVBhdGgoaXRlbXBhdGgpO1xuICAgICAgICAgICAgLy8gUmVtb3ZlIGFsbCBoYXNoZXMgZm9yIGtleXMgc3RhcnRpbmcgd2l0aCBwcmVmaXhTdHJcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoc3RhdGUpLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgKFtrZXldKSA9PiAha2V5LnN0YXJ0c1dpdGgocHJlZml4U3RyKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlO1xufTtcblxuZnVuY3Rpb24gbWFpblJlZHVjZXIoKSB7XG4gICAgY29uc3QgcGFydHMgPSB7XG4gICAgICAgIGFwcExpZmVjeWNsZSxcbiAgICAgICAgY2FsbGJhY2tzLFxuICAgICAgICBjb25maWcsXG4gICAgICAgIGVycm9yLFxuICAgICAgICBncmFwaHMsXG4gICAgICAgIGhpc3RvcnksXG4gICAgICAgIGhvb2tzLFxuICAgICAgICBwcm9maWxlLFxuICAgICAgICBjaGFuZ2VkLFxuICAgICAgICBpc0xvYWRpbmcsXG4gICAgICAgIGxheW91dCxcbiAgICAgICAgcGF0aHMsXG4gICAgICAgIGxheW91dEhhc2hlcyxcbiAgICAgICAgbG9hZGluZ1xuICAgIH07XG4gICAgZm9yRWFjaChyID0+IHtcbiAgICAgICAgcGFydHNbcl0gPSBjcmVhdGVBcGlSZWR1Y2VyKHIpO1xuICAgIH0sIGFwaVJlcXVlc3RzKTtcblxuICAgIHBhcnRzLmNhbGxiYWNrSm9icyA9IGNhbGxiYWNrSm9icztcblxuICAgIHJldHVybiBjb21iaW5lUmVkdWNlcnMocGFydHMpO1xufVxuXG5mdW5jdGlvbiBnZXRJbnB1dEhpc3RvcnlTdGF0ZShwYXlsb2FkLCBzdGF0ZSwgcmVjb3JkQ2hhbmdlcykge1xuICAgIGNvbnN0IHtncmFwaHMsIHBhdGhzLCBsYXlvdXR9ID0gc3RhdGU7XG4gICAgY29uc3Qge2l0ZW1wYXRoLCBwcm9wc30gPSBwYXlsb2FkO1xuICAgIGNvbnN0IHJlZlByb3BzID0gcGF0aChpdGVtcGF0aC5jb25jYXQoWydwcm9wcyddKSwgbGF5b3V0KSB8fCB7fTtcbiAgICBjb25zdCB7aWR9ID0gcmVmUHJvcHM7XG5cbiAgICBsZXQgaGlzdG9yeUVudHJ5O1xuICAgIGlmIChpZCkge1xuICAgICAgICBpZiAocmVjb3JkQ2hhbmdlcykge1xuICAgICAgICAgICAgc3RhdGUuY2hhbmdlZCA9IHtpZCwgcHJvcHN9O1xuICAgICAgICB9XG5cbiAgICAgICAgaGlzdG9yeUVudHJ5ID0ge2lkLCBwcm9wczoge319O1xuICAgICAgICBrZXlzKHByb3BzKS5mb3JFYWNoKHByb3BLZXkgPT4ge1xuICAgICAgICAgICAgaWYgKGdldENhbGxiYWNrc0J5SW5wdXQoZ3JhcGhzLCBwYXRocywgaWQsIHByb3BLZXkpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGhpc3RvcnlFbnRyeS5wcm9wc1twcm9wS2V5XSA9IHJlZlByb3BzW3Byb3BLZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGhpc3RvcnlFbnRyeTtcbn1cblxuZnVuY3Rpb24gcmVjb3JkSGlzdG9yeShyZWR1Y2VyKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uKSB7XG4gICAgICAgIC8vIFJlY29yZCBpbml0aWFsIHN0YXRlXG4gICAgICAgIGNvbnN0IHt0eXBlLCBwYXlsb2FkfSA9IGFjdGlvbjtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdPTl9QUk9QX0NIQU5HRScpIHtcbiAgICAgICAgICAgIC8vIGhpc3RvcnkgcmVjb3JkcyBhbGwgcHJvcCBjaGFuZ2VzIHRoYXQgYXJlIGlucHV0cy5cbiAgICAgICAgICAgIGNvbnN0IGhpc3RvcnlFbnRyeSA9IGdldElucHV0SGlzdG9yeVN0YXRlKHBheWxvYWQsIHN0YXRlLCB0cnVlKTtcbiAgICAgICAgICAgIGlmIChoaXN0b3J5RW50cnkgJiYgIWlzRW1wdHkoaGlzdG9yeUVudHJ5LnByb3BzKSkge1xuICAgICAgICAgICAgICAgIHN0YXRlLmhpc3RvcnkucHJlc2VudCA9IGhpc3RvcnlFbnRyeTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5leHRTdGF0ZSA9IHJlZHVjZXIoc3RhdGUsIGFjdGlvbik7XG5cbiAgICAgICAgaWYgKHR5cGUgPT09ICdPTl9QUk9QX0NIQU5HRScgJiYgcGF5bG9hZC5zb3VyY2UgIT09ICdyZXNwb25zZScpIHtcbiAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgKiBpZiB0aGUgcHJvcCBjaGFuZ2UgaXMgYW4gaW5wdXQsIHRoZW5cbiAgICAgICAgICAgICAqIHJlY29yZCBpdCBzbyB0aGF0IGl0IGNhbiBiZSBwbGF5ZWQgYmFja1xuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBjb25zdCBoaXN0b3J5RW50cnkgPSBnZXRJbnB1dEhpc3RvcnlTdGF0ZShwYXlsb2FkLCBuZXh0U3RhdGUpO1xuICAgICAgICAgICAgaWYgKGhpc3RvcnlFbnRyeSAmJiAhaXNFbXB0eShoaXN0b3J5RW50cnkucHJvcHMpKSB7XG4gICAgICAgICAgICAgICAgbmV4dFN0YXRlLmhpc3RvcnkgPSB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3Q6IFsuLi5uZXh0U3RhdGUuaGlzdG9yeS5wYXN0LCBzdGF0ZS5oaXN0b3J5LnByZXNlbnRdLFxuICAgICAgICAgICAgICAgICAgICBwcmVzZW50OiBoaXN0b3J5RW50cnksXG4gICAgICAgICAgICAgICAgICAgIGZ1dHVyZTogW11cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5leHRTdGF0ZTtcbiAgICB9O1xufVxuXG5mdW5jdGlvbiByZWxvYWRlclJlZHVjZXIocmVkdWNlcikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbikge1xuICAgICAgICBjb25zdCB7aGlzdG9yeSwgY29uZmlnLCBob29rc30gPSBzdGF0ZSB8fCB7fTtcbiAgICAgICAgbGV0IG5ld1N0YXRlID0gc3RhdGU7XG4gICAgICAgIGlmIChhY3Rpb24udHlwZSA9PT0gJ1JFTE9BRCcpIHtcbiAgICAgICAgICAgIG5ld1N0YXRlID0ge2hpc3RvcnksIGNvbmZpZywgaG9va3N9O1xuICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi50eXBlID09PSAnU0VUX0NPTkZJRycpIHtcbiAgICAgICAgICAgIC8vIG5ldyBjb25maWcgYWxzbyByZWxvYWRzLCBhbmQgZXZlbiBjbGVhcnMgaGlzdG9yeSxcbiAgICAgICAgICAgIC8vIGluIGNhc2UgdGhlcmUncyBhIG5ldyB1c2VyIG9yIGV2ZW4gYSB0b3RhbGx5IGRpZmZlcmVudCBhcHAhXG4gICAgICAgICAgICAvLyBob29rcyBhcmUgc2V0IGF0IGFuIGV2ZW4gaGlnaGVyIGxldmVsIHRoYW4gY29uZmlnIHRob3VnaC5cbiAgICAgICAgICAgIG5ld1N0YXRlID0ge2hvb2tzfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVkdWNlcihuZXdTdGF0ZSwgYWN0aW9uKTtcbiAgICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVkdWNlcigpIHtcbiAgICByZXR1cm4gcmVsb2FkZXJSZWR1Y2VyKHJlY29yZEhpc3RvcnkobWFpblJlZHVjZXIoKSkpO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQge1xuICAgIHJlc29sdmU6IGNvbXBvbmVudCA9PiB7XG4gICAgICAgIGNvbnN0IHt0eXBlLCBuYW1lc3BhY2V9ID0gY29tcG9uZW50O1xuXG4gICAgICAgIGNvbnN0IG5zID0gd2luZG93W25hbWVzcGFjZV07XG5cbiAgICAgICAgaWYgKG5zKSB7XG4gICAgICAgICAgICBpZiAobnNbdHlwZV0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnNbdHlwZV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ29tcG9uZW50ICR7dHlwZX0gbm90IGZvdW5kIGluICR7bmFtZXNwYWNlfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke25hbWVzcGFjZX0gd2FzIG5vdCBmb3VuZC5gKTtcbiAgICB9XG59O1xuIiwiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiY29zZS1iYXNlXCIpKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtcImNvc2UtYmFzZVwiXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJjeXRvc2NhcGVGY29zZVwiXSA9IGZhY3RvcnkocmVxdWlyZShcImNvc2UtYmFzZVwiKSk7XG5cdGVsc2Vcblx0XHRyb290W1wiY3l0b3NjYXBlRmNvc2VcIl0gPSBmYWN0b3J5KHJvb3RbXCJjb3NlQmFzZVwiXSk7XG59KSh0aGlzLCBmdW5jdGlvbihfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX18xNDBfXykge1xucmV0dXJuIC8qKioqKiovICgoKSA9PiB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0XCJ1c2Ugc3RyaWN0XCI7XG4vKioqKioqLyBcdHZhciBfX3dlYnBhY2tfbW9kdWxlc19fID0gKHtcblxuLyoqKi8gNjU4OlxuLyoqKi8gKChtb2R1bGUpID0+IHtcblxuXG5cbi8vIFNpbXBsZSwgaW50ZXJuYWwgT2JqZWN0LmFzc2lnbigpIHBvbHlmaWxsIGZvciBvcHRpb25zIG9iamVjdHMgZXRjLlxuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5hc3NpZ24gIT0gbnVsbCA/IE9iamVjdC5hc3NpZ24uYmluZChPYmplY3QpIDogZnVuY3Rpb24gKHRndCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgc3JjcyA9IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBzcmNzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHNyY3MuZm9yRWFjaChmdW5jdGlvbiAoc3JjKSB7XG4gICAgT2JqZWN0LmtleXMoc3JjKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgICByZXR1cm4gdGd0W2tdID0gc3JjW2tdO1xuICAgIH0pO1xuICB9KTtcblxuICByZXR1cm4gdGd0O1xufTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDU0ODpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG5cbnZhciBfc2xpY2VkVG9BcnJheSA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gc2xpY2VJdGVyYXRvcihhcnIsIGkpIHsgdmFyIF9hcnIgPSBbXTsgdmFyIF9uID0gdHJ1ZTsgdmFyIF9kID0gZmFsc2U7IHZhciBfZSA9IHVuZGVmaW5lZDsgdHJ5IHsgZm9yICh2YXIgX2kgPSBhcnJbU3ltYm9sLml0ZXJhdG9yXSgpLCBfczsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkgeyBfYXJyLnB1c2goX3MudmFsdWUpOyBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7IH0gfSBjYXRjaCAoZXJyKSB7IF9kID0gdHJ1ZTsgX2UgPSBlcnI7IH0gZmluYWxseSB7IHRyeSB7IGlmICghX24gJiYgX2lbXCJyZXR1cm5cIl0pIF9pW1wicmV0dXJuXCJdKCk7IH0gZmluYWxseSB7IGlmIChfZCkgdGhyb3cgX2U7IH0gfSByZXR1cm4gX2FycjsgfSByZXR1cm4gZnVuY3Rpb24gKGFyciwgaSkgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7IHJldHVybiBhcnI7IH0gZWxzZSBpZiAoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChhcnIpKSB7IHJldHVybiBzbGljZUl0ZXJhdG9yKGFyciwgaSk7IH0gZWxzZSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlXCIpOyB9IH07IH0oKTtcblxuLypcbiAqIEF1eGlsaWFyeSBmdW5jdGlvbnNcbiAqL1xuXG52YXIgTGlua2VkTGlzdCA9IF9fd2VicGFja19yZXF1aXJlX18oMTQwKS5sYXlvdXRCYXNlLkxpbmtlZExpc3Q7XG5cbnZhciBhdXhpbGlhcnkgPSB7fTtcblxuLy8gZ2V0IHRoZSB0b3AgbW9zdCBub2Rlc1xuYXV4aWxpYXJ5LmdldFRvcE1vc3ROb2RlcyA9IGZ1bmN0aW9uIChub2Rlcykge1xuICB2YXIgbm9kZXNNYXAgPSB7fTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIG5vZGVzTWFwW25vZGVzW2ldLmlkKCldID0gdHJ1ZTtcbiAgfVxuICB2YXIgcm9vdHMgPSBub2Rlcy5maWx0ZXIoZnVuY3Rpb24gKGVsZSwgaSkge1xuICAgIGlmICh0eXBlb2YgZWxlID09PSBcIm51bWJlclwiKSB7XG4gICAgICBlbGUgPSBpO1xuICAgIH1cbiAgICB2YXIgcGFyZW50ID0gZWxlLnBhcmVudCgpWzBdO1xuICAgIHdoaWxlIChwYXJlbnQgIT0gbnVsbCkge1xuICAgICAgaWYgKG5vZGVzTWFwW3BhcmVudC5pZCgpXSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50KClbMF07XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9KTtcblxuICByZXR1cm4gcm9vdHM7XG59O1xuXG4vLyBmaW5kIGRpc2Nvbm5lY3RlZCBjb21wb25lbnRzIGFuZCBjcmVhdGUgZHVtbXkgbm9kZXMgdGhhdCBjb25uZWN0IHRoZW1cbmF1eGlsaWFyeS5jb25uZWN0Q29tcG9uZW50cyA9IGZ1bmN0aW9uIChjeSwgZWxlcywgdG9wTW9zdE5vZGVzLCBkdW1teU5vZGVzKSB7XG4gIHZhciBxdWV1ZSA9IG5ldyBMaW5rZWRMaXN0KCk7XG4gIHZhciB2aXNpdGVkID0gbmV3IFNldCgpO1xuICB2YXIgdmlzaXRlZFRvcE1vc3ROb2RlcyA9IFtdO1xuICB2YXIgY3VycmVudE5laWdoYm9yID0gdm9pZCAwO1xuICB2YXIgbWluRGVncmVlTm9kZSA9IHZvaWQgMDtcbiAgdmFyIG1pbkRlZ3JlZSA9IHZvaWQgMDtcblxuICB2YXIgaXNDb25uZWN0ZWQgPSBmYWxzZTtcbiAgdmFyIGNvdW50ID0gMTtcbiAgdmFyIG5vZGVzQ29ubmVjdGVkVG9EdW1teSA9IFtdO1xuICB2YXIgY29tcG9uZW50cyA9IFtdO1xuXG4gIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKCkge1xuICAgIHZhciBjbXB0ID0gY3kuY29sbGVjdGlvbigpO1xuICAgIGNvbXBvbmVudHMucHVzaChjbXB0KTtcblxuICAgIHZhciBjdXJyZW50Tm9kZSA9IHRvcE1vc3ROb2Rlc1swXTtcbiAgICB2YXIgY2hpbGRyZW5PZkN1cnJlbnROb2RlID0gY3kuY29sbGVjdGlvbigpO1xuICAgIGNoaWxkcmVuT2ZDdXJyZW50Tm9kZS5tZXJnZShjdXJyZW50Tm9kZSkubWVyZ2UoY3VycmVudE5vZGUuZGVzY2VuZGFudHMoKS5pbnRlcnNlY3Rpb24oZWxlcykpO1xuICAgIHZpc2l0ZWRUb3BNb3N0Tm9kZXMucHVzaChjdXJyZW50Tm9kZSk7XG5cbiAgICBjaGlsZHJlbk9mQ3VycmVudE5vZGUuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgcXVldWUucHVzaChub2RlKTtcbiAgICAgIHZpc2l0ZWQuYWRkKG5vZGUpO1xuICAgICAgY21wdC5tZXJnZShub2RlKTtcbiAgICB9KTtcblxuICAgIHZhciBfbG9vcDIgPSBmdW5jdGlvbiBfbG9vcDIoKSB7XG4gICAgICBjdXJyZW50Tm9kZSA9IHF1ZXVlLnNoaWZ0KCk7XG5cbiAgICAgIC8vIFRyYXZlcnNlIGFsbCBuZWlnaGJvcnMgb2YgdGhpcyBub2RlXG4gICAgICB2YXIgbmVpZ2hib3JOb2RlcyA9IGN5LmNvbGxlY3Rpb24oKTtcbiAgICAgIGN1cnJlbnROb2RlLm5laWdoYm9yaG9vZCgpLm5vZGVzKCkuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICBpZiAoZWxlcy5pbnRlcnNlY3Rpb24oY3VycmVudE5vZGUuZWRnZXNXaXRoKG5vZGUpKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgbmVpZ2hib3JOb2Rlcy5tZXJnZShub2RlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmVpZ2hib3JOb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgbmVpZ2hib3JOb2RlID0gbmVpZ2hib3JOb2Rlc1tpXTtcbiAgICAgICAgY3VycmVudE5laWdoYm9yID0gdG9wTW9zdE5vZGVzLmludGVyc2VjdGlvbihuZWlnaGJvck5vZGUudW5pb24obmVpZ2hib3JOb2RlLmFuY2VzdG9ycygpKSk7XG4gICAgICAgIGlmIChjdXJyZW50TmVpZ2hib3IgIT0gbnVsbCAmJiAhdmlzaXRlZC5oYXMoY3VycmVudE5laWdoYm9yWzBdKSkge1xuICAgICAgICAgIHZhciBjaGlsZHJlbk9mTmVpZ2hib3IgPSBjdXJyZW50TmVpZ2hib3IudW5pb24oY3VycmVudE5laWdoYm9yLmRlc2NlbmRhbnRzKCkpO1xuXG4gICAgICAgICAgY2hpbGRyZW5PZk5laWdoYm9yLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgIHF1ZXVlLnB1c2gobm9kZSk7XG4gICAgICAgICAgICB2aXNpdGVkLmFkZChub2RlKTtcbiAgICAgICAgICAgIGNtcHQubWVyZ2Uobm9kZSk7XG4gICAgICAgICAgICBpZiAodG9wTW9zdE5vZGVzLmhhcyhub2RlKSkge1xuICAgICAgICAgICAgICB2aXNpdGVkVG9wTW9zdE5vZGVzLnB1c2gobm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCAhPSAwKSB7XG4gICAgICBfbG9vcDIoKTtcbiAgICB9XG5cbiAgICBjbXB0LmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIGVsZXMuaW50ZXJzZWN0aW9uKG5vZGUuY29ubmVjdGVkRWRnZXMoKSkuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xuICAgICAgICAvLyBjb25uZWN0ZWRFZGdlcygpIHVzdWFsbHkgY2FjaGVkXG4gICAgICAgIGlmIChjbXB0LmhhcyhlLnNvdXJjZSgpKSAmJiBjbXB0LmhhcyhlLnRhcmdldCgpKSkge1xuICAgICAgICAgIC8vIGhhcygpIGlzIGNoZWFwXG4gICAgICAgICAgY21wdC5tZXJnZShlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpZiAodmlzaXRlZFRvcE1vc3ROb2Rlcy5sZW5ndGggPT0gdG9wTW9zdE5vZGVzLmxlbmd0aCkge1xuICAgICAgaXNDb25uZWN0ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmICghaXNDb25uZWN0ZWQgfHwgaXNDb25uZWN0ZWQgJiYgY291bnQgPiAxKSB7XG4gICAgICBtaW5EZWdyZWVOb2RlID0gdmlzaXRlZFRvcE1vc3ROb2Rlc1swXTtcbiAgICAgIG1pbkRlZ3JlZSA9IG1pbkRlZ3JlZU5vZGUuY29ubmVjdGVkRWRnZXMoKS5sZW5ndGg7XG4gICAgICB2aXNpdGVkVG9wTW9zdE5vZGVzLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUuY29ubmVjdGVkRWRnZXMoKS5sZW5ndGggPCBtaW5EZWdyZWUpIHtcbiAgICAgICAgICBtaW5EZWdyZWUgPSBub2RlLmNvbm5lY3RlZEVkZ2VzKCkubGVuZ3RoO1xuICAgICAgICAgIG1pbkRlZ3JlZU5vZGUgPSBub2RlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIG5vZGVzQ29ubmVjdGVkVG9EdW1teS5wdXNoKG1pbkRlZ3JlZU5vZGUuaWQoKSk7XG4gICAgICAvLyBUTyBETzogQ2hlY2sgZWZmaWNpZW5jeSBvZiB0aGlzIHBhcnRcbiAgICAgIHZhciB0ZW1wID0gY3kuY29sbGVjdGlvbigpO1xuICAgICAgdGVtcC5tZXJnZSh2aXNpdGVkVG9wTW9zdE5vZGVzWzBdKTtcbiAgICAgIHZpc2l0ZWRUb3BNb3N0Tm9kZXMuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICB0ZW1wLm1lcmdlKG5vZGUpO1xuICAgICAgfSk7XG4gICAgICB2aXNpdGVkVG9wTW9zdE5vZGVzID0gW107XG4gICAgICB0b3BNb3N0Tm9kZXMgPSB0b3BNb3N0Tm9kZXMuZGlmZmVyZW5jZSh0ZW1wKTtcbiAgICAgIGNvdW50Kys7XG4gICAgfVxuICB9O1xuXG4gIGRvIHtcbiAgICBfbG9vcCgpO1xuICB9IHdoaWxlICghaXNDb25uZWN0ZWQpO1xuXG4gIGlmIChkdW1teU5vZGVzKSB7XG4gICAgaWYgKG5vZGVzQ29ubmVjdGVkVG9EdW1teS5sZW5ndGggPiAwKSB7XG4gICAgICBkdW1teU5vZGVzLnNldCgnZHVtbXknICsgKGR1bW15Tm9kZXMuc2l6ZSArIDEpLCBub2Rlc0Nvbm5lY3RlZFRvRHVtbXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY29tcG9uZW50cztcbn07XG5cbi8vIHJlbG9jYXRlcyBjb21wb25lbnRSZXN1bHQgdG8gb3JpZ2luYWxDZW50ZXIgaWYgdGhlcmUgaXMgbm8gZml4ZWROb2RlQ29uc3RyYWludFxuYXV4aWxpYXJ5LnJlbG9jYXRlQ29tcG9uZW50ID0gZnVuY3Rpb24gKG9yaWdpbmFsQ2VudGVyLCBjb21wb25lbnRSZXN1bHQsIG9wdGlvbnMpIHtcbiAgaWYgKCFvcHRpb25zLmZpeGVkTm9kZUNvbnN0cmFpbnQpIHtcbiAgICB2YXIgbWluWENvb3JkID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICAgIHZhciBtYXhYQ29vcmQgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG4gICAgdmFyIG1pbllDb29yZCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgICB2YXIgbWF4WUNvb3JkID0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO1xuICAgIGlmIChvcHRpb25zLnF1YWxpdHkgPT0gXCJkcmFmdFwiKSB7XG4gICAgICAvLyBjYWxjdWxhdGUgY3VycmVudCBib3VuZGluZyBib3hcbiAgICAgIHZhciBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gdHJ1ZTtcbiAgICAgIHZhciBfZGlkSXRlcmF0b3JFcnJvciA9IGZhbHNlO1xuICAgICAgdmFyIF9pdGVyYXRvckVycm9yID0gdW5kZWZpbmVkO1xuXG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3IgPSBjb21wb25lbnRSZXN1bHQubm9kZUluZGV4ZXNbU3ltYm9sLml0ZXJhdG9yXSgpLCBfc3RlcDsgIShfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gKF9zdGVwID0gX2l0ZXJhdG9yLm5leHQoKSkuZG9uZSk7IF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlKSB7XG4gICAgICAgICAgdmFyIF9yZWYgPSBfc3RlcC52YWx1ZTtcblxuICAgICAgICAgIHZhciBfcmVmMiA9IF9zbGljZWRUb0FycmF5KF9yZWYsIDIpO1xuXG4gICAgICAgICAgdmFyIGtleSA9IF9yZWYyWzBdO1xuICAgICAgICAgIHZhciB2YWx1ZSA9IF9yZWYyWzFdO1xuXG4gICAgICAgICAgdmFyIGN5Tm9kZSA9IG9wdGlvbnMuY3kuZ2V0RWxlbWVudEJ5SWQoa2V5KTtcbiAgICAgICAgICBpZiAoY3lOb2RlKSB7XG4gICAgICAgICAgICB2YXIgbm9kZUJCID0gY3lOb2RlLmJvdW5kaW5nQm94KCk7XG4gICAgICAgICAgICB2YXIgbGVmdFggPSBjb21wb25lbnRSZXN1bHQueENvb3Jkc1t2YWx1ZV0gLSBub2RlQkIudyAvIDI7XG4gICAgICAgICAgICB2YXIgcmlnaHRYID0gY29tcG9uZW50UmVzdWx0LnhDb29yZHNbdmFsdWVdICsgbm9kZUJCLncgLyAyO1xuICAgICAgICAgICAgdmFyIHRvcFkgPSBjb21wb25lbnRSZXN1bHQueUNvb3Jkc1t2YWx1ZV0gLSBub2RlQkIuaCAvIDI7XG4gICAgICAgICAgICB2YXIgYm90dG9tWSA9IGNvbXBvbmVudFJlc3VsdC55Q29vcmRzW3ZhbHVlXSArIG5vZGVCQi5oIC8gMjtcblxuICAgICAgICAgICAgaWYgKGxlZnRYIDwgbWluWENvb3JkKSBtaW5YQ29vcmQgPSBsZWZ0WDtcbiAgICAgICAgICAgIGlmIChyaWdodFggPiBtYXhYQ29vcmQpIG1heFhDb29yZCA9IHJpZ2h0WDtcbiAgICAgICAgICAgIGlmICh0b3BZIDwgbWluWUNvb3JkKSBtaW5ZQ29vcmQgPSB0b3BZO1xuICAgICAgICAgICAgaWYgKGJvdHRvbVkgPiBtYXhZQ29vcmQpIG1heFlDb29yZCA9IGJvdHRvbVk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGZpbmQgZGlmZmVyZW5jZSBiZXR3ZWVuIGN1cnJlbnQgYW5kIG9yaWdpbmFsIGNlbnRlclxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIF9kaWRJdGVyYXRvckVycm9yID0gdHJ1ZTtcbiAgICAgICAgX2l0ZXJhdG9yRXJyb3IgPSBlcnI7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiAmJiBfaXRlcmF0b3IucmV0dXJuKSB7XG4gICAgICAgICAgICBfaXRlcmF0b3IucmV0dXJuKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGlmIChfZGlkSXRlcmF0b3JFcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciBkaWZmT25YID0gb3JpZ2luYWxDZW50ZXIueCAtIChtYXhYQ29vcmQgKyBtaW5YQ29vcmQpIC8gMjtcbiAgICAgIHZhciBkaWZmT25ZID0gb3JpZ2luYWxDZW50ZXIueSAtIChtYXhZQ29vcmQgKyBtaW5ZQ29vcmQpIC8gMjtcbiAgICAgIC8vIG1vdmUgY29tcG9uZW50IHRvIG9yaWdpbmFsIGNlbnRlclxuICAgICAgY29tcG9uZW50UmVzdWx0LnhDb29yZHMgPSBjb21wb25lbnRSZXN1bHQueENvb3Jkcy5tYXAoZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgcmV0dXJuIHggKyBkaWZmT25YO1xuICAgICAgfSk7XG4gICAgICBjb21wb25lbnRSZXN1bHQueUNvb3JkcyA9IGNvbXBvbmVudFJlc3VsdC55Q29vcmRzLm1hcChmdW5jdGlvbiAoeSkge1xuICAgICAgICByZXR1cm4geSArIGRpZmZPblk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gY2FsY3VsYXRlIGN1cnJlbnQgYm91bmRpbmcgYm94XG4gICAgICBPYmplY3Qua2V5cyhjb21wb25lbnRSZXN1bHQpLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgdmFyIG5vZGUgPSBjb21wb25lbnRSZXN1bHRbaXRlbV07XG4gICAgICAgIHZhciBsZWZ0WCA9IG5vZGUuZ2V0UmVjdCgpLng7XG4gICAgICAgIHZhciByaWdodFggPSBub2RlLmdldFJlY3QoKS54ICsgbm9kZS5nZXRSZWN0KCkud2lkdGg7XG4gICAgICAgIHZhciB0b3BZID0gbm9kZS5nZXRSZWN0KCkueTtcbiAgICAgICAgdmFyIGJvdHRvbVkgPSBub2RlLmdldFJlY3QoKS55ICsgbm9kZS5nZXRSZWN0KCkuaGVpZ2h0O1xuXG4gICAgICAgIGlmIChsZWZ0WCA8IG1pblhDb29yZCkgbWluWENvb3JkID0gbGVmdFg7XG4gICAgICAgIGlmIChyaWdodFggPiBtYXhYQ29vcmQpIG1heFhDb29yZCA9IHJpZ2h0WDtcbiAgICAgICAgaWYgKHRvcFkgPCBtaW5ZQ29vcmQpIG1pbllDb29yZCA9IHRvcFk7XG4gICAgICAgIGlmIChib3R0b21ZID4gbWF4WUNvb3JkKSBtYXhZQ29vcmQgPSBib3R0b21ZO1xuICAgICAgfSk7XG4gICAgICAvLyBmaW5kIGRpZmZlcmVuY2UgYmV0d2VlbiBjdXJyZW50IGFuZCBvcmlnaW5hbCBjZW50ZXJcbiAgICAgIHZhciBfZGlmZk9uWCA9IG9yaWdpbmFsQ2VudGVyLnggLSAobWF4WENvb3JkICsgbWluWENvb3JkKSAvIDI7XG4gICAgICB2YXIgX2RpZmZPblkgPSBvcmlnaW5hbENlbnRlci55IC0gKG1heFlDb29yZCArIG1pbllDb29yZCkgLyAyO1xuICAgICAgLy8gbW92ZSBjb21wb25lbnQgdG8gb3JpZ2luYWwgY2VudGVyXG4gICAgICBPYmplY3Qua2V5cyhjb21wb25lbnRSZXN1bHQpLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgdmFyIG5vZGUgPSBjb21wb25lbnRSZXN1bHRbaXRlbV07XG4gICAgICAgIG5vZGUuc2V0Q2VudGVyKG5vZGUuZ2V0Q2VudGVyWCgpICsgX2RpZmZPblgsIG5vZGUuZ2V0Q2VudGVyWSgpICsgX2RpZmZPblkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59O1xuXG5hdXhpbGlhcnkuY2FsY0JvdW5kaW5nQm94ID0gZnVuY3Rpb24gKHBhcmVudE5vZGUsIHhDb29yZHMsIHlDb29yZHMsIG5vZGVJbmRleGVzKSB7XG4gIC8vIGNhbGN1bGF0ZSBib3VuZHNcbiAgdmFyIGxlZnQgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbiAgdmFyIHJpZ2h0ID0gTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVI7XG4gIHZhciB0b3AgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbiAgdmFyIGJvdHRvbSA9IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSO1xuICB2YXIgbm9kZUxlZnQgPSB2b2lkIDA7XG4gIHZhciBub2RlUmlnaHQgPSB2b2lkIDA7XG4gIHZhciBub2RlVG9wID0gdm9pZCAwO1xuICB2YXIgbm9kZUJvdHRvbSA9IHZvaWQgMDtcblxuICB2YXIgbm9kZXMgPSBwYXJlbnROb2RlLmRlc2NlbmRhbnRzKCkubm90KFwiOnBhcmVudFwiKTtcbiAgdmFyIHMgPSBub2Rlcy5sZW5ndGg7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgczsgaSsrKSB7XG4gICAgdmFyIG5vZGUgPSBub2Rlc1tpXTtcblxuICAgIG5vZGVMZWZ0ID0geENvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZS5pZCgpKV0gLSBub2RlLndpZHRoKCkgLyAyO1xuICAgIG5vZGVSaWdodCA9IHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGUuaWQoKSldICsgbm9kZS53aWR0aCgpIC8gMjtcbiAgICBub2RlVG9wID0geUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZS5pZCgpKV0gLSBub2RlLmhlaWdodCgpIC8gMjtcbiAgICBub2RlQm90dG9tID0geUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZS5pZCgpKV0gKyBub2RlLmhlaWdodCgpIC8gMjtcblxuICAgIGlmIChsZWZ0ID4gbm9kZUxlZnQpIHtcbiAgICAgIGxlZnQgPSBub2RlTGVmdDtcbiAgICB9XG5cbiAgICBpZiAocmlnaHQgPCBub2RlUmlnaHQpIHtcbiAgICAgIHJpZ2h0ID0gbm9kZVJpZ2h0O1xuICAgIH1cblxuICAgIGlmICh0b3AgPiBub2RlVG9wKSB7XG4gICAgICB0b3AgPSBub2RlVG9wO1xuICAgIH1cblxuICAgIGlmIChib3R0b20gPCBub2RlQm90dG9tKSB7XG4gICAgICBib3R0b20gPSBub2RlQm90dG9tO1xuICAgIH1cbiAgfVxuXG4gIHZhciBib3VuZGluZ0JveCA9IHt9O1xuICBib3VuZGluZ0JveC50b3BMZWZ0WCA9IGxlZnQ7XG4gIGJvdW5kaW5nQm94LnRvcExlZnRZID0gdG9wO1xuICBib3VuZGluZ0JveC53aWR0aCA9IHJpZ2h0IC0gbGVmdDtcbiAgYm91bmRpbmdCb3guaGVpZ2h0ID0gYm90dG9tIC0gdG9wO1xuICByZXR1cm4gYm91bmRpbmdCb3g7XG59O1xuXG4vLyBUaGlzIGZ1bmN0aW9uIGZpbmRzIGFuZCByZXR1cm5zIHBhcmVudCBub2RlcyB3aG9zZSBhbGwgY2hpbGRyZW4gYXJlIGhpZGRlblxuYXV4aWxpYXJ5LmNhbGNQYXJlbnRzV2l0aG91dENoaWxkcmVuID0gZnVuY3Rpb24gKGN5LCBlbGVzKSB7XG4gIHZhciBwYXJlbnRzV2l0aG91dENoaWxkcmVuID0gY3kuY29sbGVjdGlvbigpO1xuICBlbGVzLm5vZGVzKCc6cGFyZW50JykuZm9yRWFjaChmdW5jdGlvbiAocGFyZW50KSB7XG4gICAgdmFyIGNoZWNrID0gZmFsc2U7XG4gICAgcGFyZW50LmNoaWxkcmVuKCkuZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgIGlmIChjaGlsZC5jc3MoJ2Rpc3BsYXknKSAhPSAnbm9uZScpIHtcbiAgICAgICAgY2hlY2sgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmICghY2hlY2spIHtcbiAgICAgIHBhcmVudHNXaXRob3V0Q2hpbGRyZW4ubWVyZ2UocGFyZW50KTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBwYXJlbnRzV2l0aG91dENoaWxkcmVuO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBhdXhpbGlhcnk7XG5cbi8qKiovIH0pLFxuXG4vKioqLyA4MTY6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxuXG4vKipcbiAgVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBwb3N0cHJvY2Vzc2luZyBwYXJ0IHRoYXQgYXBwbGllcyBDb1NFIGxheW91dCBvdmVyIHRoZSBzcGVjdHJhbCBsYXlvdXRcbiovXG5cbnZhciBhdXggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU0OCk7XG52YXIgQ29TRUxheW91dCA9IF9fd2VicGFja19yZXF1aXJlX18oMTQwKS5Db1NFTGF5b3V0O1xudmFyIENvU0VOb2RlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDApLkNvU0VOb2RlO1xudmFyIFBvaW50RCA9IF9fd2VicGFja19yZXF1aXJlX18oMTQwKS5sYXlvdXRCYXNlLlBvaW50RDtcbnZhciBEaW1lbnNpb25EID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDApLmxheW91dEJhc2UuRGltZW5zaW9uRDtcbnZhciBMYXlvdXRDb25zdGFudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0MCkubGF5b3V0QmFzZS5MYXlvdXRDb25zdGFudHM7XG52YXIgRkRMYXlvdXRDb25zdGFudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0MCkubGF5b3V0QmFzZS5GRExheW91dENvbnN0YW50cztcbnZhciBDb1NFQ29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDApLkNvU0VDb25zdGFudHM7XG5cbi8vIG1haW4gZnVuY3Rpb24gdGhhdCBjb3NlIGxheW91dCBpcyBwcm9jZXNzZWRcbnZhciBjb3NlTGF5b3V0ID0gZnVuY3Rpb24gY29zZUxheW91dChvcHRpb25zLCBzcGVjdHJhbFJlc3VsdCkge1xuXG4gIHZhciBjeSA9IG9wdGlvbnMuY3k7XG4gIHZhciBlbGVzID0gb3B0aW9ucy5lbGVzO1xuICB2YXIgbm9kZXMgPSBlbGVzLm5vZGVzKCk7XG4gIHZhciBlZGdlcyA9IGVsZXMuZWRnZXMoKTtcblxuICB2YXIgbm9kZUluZGV4ZXMgPSB2b2lkIDA7XG4gIHZhciB4Q29vcmRzID0gdm9pZCAwO1xuICB2YXIgeUNvb3JkcyA9IHZvaWQgMDtcbiAgdmFyIGlkVG9MTm9kZSA9IHt9O1xuXG4gIGlmIChvcHRpb25zLnJhbmRvbWl6ZSkge1xuICAgIG5vZGVJbmRleGVzID0gc3BlY3RyYWxSZXN1bHRbXCJub2RlSW5kZXhlc1wiXTtcbiAgICB4Q29vcmRzID0gc3BlY3RyYWxSZXN1bHRbXCJ4Q29vcmRzXCJdO1xuICAgIHlDb29yZHMgPSBzcGVjdHJhbFJlc3VsdFtcInlDb29yZHNcIl07XG4gIH1cblxuICB2YXIgaXNGbiA9IGZ1bmN0aW9uIGlzRm4oZm4pIHtcbiAgICByZXR1cm4gdHlwZW9mIGZuID09PSAnZnVuY3Rpb24nO1xuICB9O1xuXG4gIHZhciBvcHRGbiA9IGZ1bmN0aW9uIG9wdEZuKG9wdCwgZWxlKSB7XG4gICAgaWYgKGlzRm4ob3B0KSkge1xuICAgICAgcmV0dXJuIG9wdChlbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gb3B0O1xuICAgIH1cbiAgfTtcblxuICAvKioqKiBQb3N0cHJvY2Vzc2luZyBmdW5jdGlvbnMgKioqKi9cblxuICB2YXIgcGFyZW50c1dpdGhvdXRDaGlsZHJlbiA9IGF1eC5jYWxjUGFyZW50c1dpdGhvdXRDaGlsZHJlbihjeSwgZWxlcyk7XG5cbiAgLy8gdHJhbnNmZXIgY3l0b3NjYXBlIG5vZGVzIHRvIGNvc2Ugbm9kZXNcbiAgdmFyIHByb2Nlc3NDaGlsZHJlbkxpc3QgPSBmdW5jdGlvbiBwcm9jZXNzQ2hpbGRyZW5MaXN0KHBhcmVudCwgY2hpbGRyZW4sIGxheW91dCwgb3B0aW9ucykge1xuICAgIHZhciBzaXplID0gY2hpbGRyZW4ubGVuZ3RoO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgICB2YXIgdGhlQ2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICAgIHZhciBjaGlsZHJlbl9vZl9jaGlsZHJlbiA9IG51bGw7XG4gICAgICBpZiAodGhlQ2hpbGQuaW50ZXJzZWN0aW9uKHBhcmVudHNXaXRob3V0Q2hpbGRyZW4pLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgIGNoaWxkcmVuX29mX2NoaWxkcmVuID0gdGhlQ2hpbGQuY2hpbGRyZW4oKTtcbiAgICAgIH1cbiAgICAgIHZhciB0aGVOb2RlID0gdm9pZCAwO1xuXG4gICAgICB2YXIgZGltZW5zaW9ucyA9IHRoZUNoaWxkLmxheW91dERpbWVuc2lvbnMoe1xuICAgICAgICBub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHM6IG9wdGlvbnMubm9kZURpbWVuc2lvbnNJbmNsdWRlTGFiZWxzXG4gICAgICB9KTtcblxuICAgICAgaWYgKHRoZUNoaWxkLm91dGVyV2lkdGgoKSAhPSBudWxsICYmIHRoZUNoaWxkLm91dGVySGVpZ2h0KCkgIT0gbnVsbCkge1xuICAgICAgICBpZiAob3B0aW9ucy5yYW5kb21pemUpIHtcbiAgICAgICAgICBpZiAoIXRoZUNoaWxkLmlzUGFyZW50KCkpIHtcbiAgICAgICAgICAgIHRoZU5vZGUgPSBwYXJlbnQuYWRkKG5ldyBDb1NFTm9kZShsYXlvdXQuZ3JhcGhNYW5hZ2VyLCBuZXcgUG9pbnREKHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KHRoZUNoaWxkLmlkKCkpXSAtIGRpbWVuc2lvbnMudyAvIDIsIHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KHRoZUNoaWxkLmlkKCkpXSAtIGRpbWVuc2lvbnMuaCAvIDIpLCBuZXcgRGltZW5zaW9uRChwYXJzZUZsb2F0KGRpbWVuc2lvbnMudyksIHBhcnNlRmxvYXQoZGltZW5zaW9ucy5oKSkpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHBhcmVudEluZm8gPSBhdXguY2FsY0JvdW5kaW5nQm94KHRoZUNoaWxkLCB4Q29vcmRzLCB5Q29vcmRzLCBub2RlSW5kZXhlcyk7XG4gICAgICAgICAgICBpZiAodGhlQ2hpbGQuaW50ZXJzZWN0aW9uKHBhcmVudHNXaXRob3V0Q2hpbGRyZW4pLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgIHRoZU5vZGUgPSBwYXJlbnQuYWRkKG5ldyBDb1NFTm9kZShsYXlvdXQuZ3JhcGhNYW5hZ2VyLCBuZXcgUG9pbnREKHBhcmVudEluZm8udG9wTGVmdFgsIHBhcmVudEluZm8udG9wTGVmdFkpLCBuZXcgRGltZW5zaW9uRChwYXJlbnRJbmZvLndpZHRoLCBwYXJlbnRJbmZvLmhlaWdodCkpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIGZvciB0aGUgcGFyZW50c1dpdGhvdXRDaGlsZHJlblxuICAgICAgICAgICAgICB0aGVOb2RlID0gcGFyZW50LmFkZChuZXcgQ29TRU5vZGUobGF5b3V0LmdyYXBoTWFuYWdlciwgbmV3IFBvaW50RChwYXJlbnRJbmZvLnRvcExlZnRYLCBwYXJlbnRJbmZvLnRvcExlZnRZKSwgbmV3IERpbWVuc2lvbkQocGFyc2VGbG9hdChkaW1lbnNpb25zLncpLCBwYXJzZUZsb2F0KGRpbWVuc2lvbnMuaCkpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoZU5vZGUgPSBwYXJlbnQuYWRkKG5ldyBDb1NFTm9kZShsYXlvdXQuZ3JhcGhNYW5hZ2VyLCBuZXcgUG9pbnREKHRoZUNoaWxkLnBvc2l0aW9uKCd4JykgLSBkaW1lbnNpb25zLncgLyAyLCB0aGVDaGlsZC5wb3NpdGlvbigneScpIC0gZGltZW5zaW9ucy5oIC8gMiksIG5ldyBEaW1lbnNpb25EKHBhcnNlRmxvYXQoZGltZW5zaW9ucy53KSwgcGFyc2VGbG9hdChkaW1lbnNpb25zLmgpKSkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGVOb2RlID0gcGFyZW50LmFkZChuZXcgQ29TRU5vZGUodGhpcy5ncmFwaE1hbmFnZXIpKTtcbiAgICAgIH1cbiAgICAgIC8vIEF0dGFjaCBpZCB0byB0aGUgbGF5b3V0IG5vZGUgYW5kIHJlcHVsc2lvbiB2YWx1ZVxuICAgICAgdGhlTm9kZS5pZCA9IHRoZUNoaWxkLmRhdGEoXCJpZFwiKTtcbiAgICAgIHRoZU5vZGUubm9kZVJlcHVsc2lvbiA9IG9wdEZuKG9wdGlvbnMubm9kZVJlcHVsc2lvbiwgdGhlQ2hpbGQpO1xuICAgICAgLy8gQXR0YWNoIHRoZSBwYWRkaW5ncyBvZiBjeSBub2RlIHRvIGxheW91dCBub2RlXG4gICAgICB0aGVOb2RlLnBhZGRpbmdMZWZ0ID0gcGFyc2VJbnQodGhlQ2hpbGQuY3NzKCdwYWRkaW5nJykpO1xuICAgICAgdGhlTm9kZS5wYWRkaW5nVG9wID0gcGFyc2VJbnQodGhlQ2hpbGQuY3NzKCdwYWRkaW5nJykpO1xuICAgICAgdGhlTm9kZS5wYWRkaW5nUmlnaHQgPSBwYXJzZUludCh0aGVDaGlsZC5jc3MoJ3BhZGRpbmcnKSk7XG4gICAgICB0aGVOb2RlLnBhZGRpbmdCb3R0b20gPSBwYXJzZUludCh0aGVDaGlsZC5jc3MoJ3BhZGRpbmcnKSk7XG5cbiAgICAgIC8vQXR0YWNoIHRoZSBsYWJlbCBwcm9wZXJ0aWVzIHRvIGJvdGggY29tcG91bmQgYW5kIHNpbXBsZSBub2RlcyBpZiBsYWJlbHMgd2lsbCBiZSBpbmNsdWRlZCBpbiBub2RlIGRpbWVuc2lvbnNcbiAgICAgIC8vVGhlc2UgcHJvcGVydGllcyB3aWxsIGJlIHVzZWQgd2hpbGUgdXBkYXRpbmcgYm91bmRzIG9mIGNvbXBvdW5kcyBkdXJpbmcgaXRlcmF0aW9ucyBvciB0aWxpbmdcbiAgICAgIC8vYW5kIHdpbGwgYmUgdXNlZCBmb3Igc2ltcGxlIG5vZGVzIHdoaWxlIHRyYW5zZmVycmluZyBmaW5hbCBwb3NpdGlvbnMgdG8gY3l0b3NjYXBlXG4gICAgICBpZiAob3B0aW9ucy5ub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHMpIHtcbiAgICAgICAgdGhlTm9kZS5sYWJlbFdpZHRoID0gdGhlQ2hpbGQuYm91bmRpbmdCb3goeyBpbmNsdWRlTGFiZWxzOiB0cnVlLCBpbmNsdWRlTm9kZXM6IGZhbHNlLCBpbmNsdWRlT3ZlcmxheXM6IGZhbHNlIH0pLnc7XG4gICAgICAgIHRoZU5vZGUubGFiZWxIZWlnaHQgPSB0aGVDaGlsZC5ib3VuZGluZ0JveCh7IGluY2x1ZGVMYWJlbHM6IHRydWUsIGluY2x1ZGVOb2RlczogZmFsc2UsIGluY2x1ZGVPdmVybGF5czogZmFsc2UgfSkuaDtcbiAgICAgICAgdGhlTm9kZS5sYWJlbFBvc1ZlcnRpY2FsID0gdGhlQ2hpbGQuY3NzKFwidGV4dC12YWxpZ25cIik7XG4gICAgICAgIHRoZU5vZGUubGFiZWxQb3NIb3Jpem9udGFsID0gdGhlQ2hpbGQuY3NzKFwidGV4dC1oYWxpZ25cIik7XG4gICAgICB9XG5cbiAgICAgIC8vIE1hcCB0aGUgbGF5b3V0IG5vZGVcbiAgICAgIGlkVG9MTm9kZVt0aGVDaGlsZC5kYXRhKFwiaWRcIildID0gdGhlTm9kZTtcblxuICAgICAgaWYgKGlzTmFOKHRoZU5vZGUucmVjdC54KSkge1xuICAgICAgICB0aGVOb2RlLnJlY3QueCA9IDA7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc05hTih0aGVOb2RlLnJlY3QueSkpIHtcbiAgICAgICAgdGhlTm9kZS5yZWN0LnkgPSAwO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hpbGRyZW5fb2ZfY2hpbGRyZW4gIT0gbnVsbCAmJiBjaGlsZHJlbl9vZl9jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZhciB0aGVOZXdHcmFwaCA9IHZvaWQgMDtcbiAgICAgICAgdGhlTmV3R3JhcGggPSBsYXlvdXQuZ2V0R3JhcGhNYW5hZ2VyKCkuYWRkKGxheW91dC5uZXdHcmFwaCgpLCB0aGVOb2RlKTtcbiAgICAgICAgcHJvY2Vzc0NoaWxkcmVuTGlzdCh0aGVOZXdHcmFwaCwgY2hpbGRyZW5fb2ZfY2hpbGRyZW4sIGxheW91dCwgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8vIHRyYW5zZmVyIGN5dG9zY2FwZSBlZGdlcyB0byBjb3NlIGVkZ2VzXG4gIHZhciBwcm9jZXNzRWRnZXMgPSBmdW5jdGlvbiBwcm9jZXNzRWRnZXMobGF5b3V0LCBnbSwgZWRnZXMpIHtcbiAgICB2YXIgaWRlYWxMZW5ndGhUb3RhbCA9IDA7XG4gICAgdmFyIGVkZ2VDb3VudCA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlZGdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVkZ2UgPSBlZGdlc1tpXTtcbiAgICAgIHZhciBzb3VyY2VOb2RlID0gaWRUb0xOb2RlW2VkZ2UuZGF0YShcInNvdXJjZVwiKV07XG4gICAgICB2YXIgdGFyZ2V0Tm9kZSA9IGlkVG9MTm9kZVtlZGdlLmRhdGEoXCJ0YXJnZXRcIildO1xuICAgICAgaWYgKHNvdXJjZU5vZGUgJiYgdGFyZ2V0Tm9kZSAmJiBzb3VyY2VOb2RlICE9PSB0YXJnZXROb2RlICYmIHNvdXJjZU5vZGUuZ2V0RWRnZXNCZXR3ZWVuKHRhcmdldE5vZGUpLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgIHZhciBlMSA9IGdtLmFkZChsYXlvdXQubmV3RWRnZSgpLCBzb3VyY2VOb2RlLCB0YXJnZXROb2RlKTtcbiAgICAgICAgZTEuaWQgPSBlZGdlLmlkKCk7XG4gICAgICAgIGUxLmlkZWFsTGVuZ3RoID0gb3B0Rm4ob3B0aW9ucy5pZGVhbEVkZ2VMZW5ndGgsIGVkZ2UpO1xuICAgICAgICBlMS5lZGdlRWxhc3RpY2l0eSA9IG9wdEZuKG9wdGlvbnMuZWRnZUVsYXN0aWNpdHksIGVkZ2UpO1xuICAgICAgICBpZGVhbExlbmd0aFRvdGFsICs9IGUxLmlkZWFsTGVuZ3RoO1xuICAgICAgICBlZGdlQ291bnQrKztcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gd2UgbmVlZCB0byB1cGRhdGUgdGhlIGlkZWFsIGVkZ2UgbGVuZ3RoIGNvbnN0YW50IHdpdGggdGhlIGF2Zy4gaWRlYWwgbGVuZ3RoIHZhbHVlIGFmdGVyIHByb2Nlc3NpbmcgZWRnZXNcbiAgICAvLyBpbiBjYXNlIHRoZXJlIGlzIG5vIGVkZ2UsIHVzZSBvdGhlciBvcHRpb25zXG4gICAgaWYgKG9wdGlvbnMuaWRlYWxFZGdlTGVuZ3RoICE9IG51bGwpIHtcbiAgICAgIGlmIChlZGdlQ291bnQgPiAwKSBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfRURHRV9MRU5HVEggPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIID0gaWRlYWxMZW5ndGhUb3RhbCAvIGVkZ2VDb3VudDtlbHNlIGlmICghaXNGbihvcHRpb25zLmlkZWFsRWRnZUxlbmd0aCkpIC8vIGluIGNhc2UgdGhlcmUgaXMgbm8gZWRnZSwgYnV0IG9wdGlvbiBnaXZlcyBhIHZhbHVlIHRvIHVzZVxuICAgICAgICBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfRURHRV9MRU5HVEggPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIID0gb3B0aW9ucy5pZGVhbEVkZ2VMZW5ndGg7ZWxzZSAvLyBpbiBjYXNlIHRoZXJlIGlzIG5vIGVkZ2UgYW5kIHdlIGNhbm5vdCBnZXQgYSB2YWx1ZSBmcm9tIG9wdGlvbiAoYmVjYXVzZSBpdCdzIGEgZnVuY3Rpb24pXG4gICAgICAgIENvU0VDb25zdGFudHMuREVGQVVMVF9FREdFX0xFTkdUSCA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfRURHRV9MRU5HVEggPSA1MDtcbiAgICAgIC8vIHdlIG5lZWQgdG8gdXBkYXRlIHRoZXNlIGNvbnN0YW50IHZhbHVlcyBiYXNlZCBvbiB0aGUgaWRlYWwgZWRnZSBsZW5ndGggY29uc3RhbnRcbiAgICAgIENvU0VDb25zdGFudHMuTUlOX1JFUFVMU0lPTl9ESVNUID0gRkRMYXlvdXRDb25zdGFudHMuTUlOX1JFUFVMU0lPTl9ESVNUID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9FREdFX0xFTkdUSCAvIDEwLjA7XG4gICAgICBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfUkFESUFMX1NFUEFSQVRJT04gPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIO1xuICAgIH1cbiAgfTtcblxuICAvLyB0cmFuc2ZlciBjeXRvc2NhcGUgY29uc3RyYWludHMgdG8gY29zZSBsYXlvdXRcbiAgdmFyIHByb2Nlc3NDb25zdHJhaW50cyA9IGZ1bmN0aW9uIHByb2Nlc3NDb25zdHJhaW50cyhsYXlvdXQsIG9wdGlvbnMpIHtcbiAgICAvLyBnZXQgbm9kZXMgdG8gYmUgZml4ZWRcbiAgICBpZiAob3B0aW9ucy5maXhlZE5vZGVDb25zdHJhaW50KSB7XG4gICAgICBsYXlvdXQuY29uc3RyYWludHNbXCJmaXhlZE5vZGVDb25zdHJhaW50XCJdID0gb3B0aW9ucy5maXhlZE5vZGVDb25zdHJhaW50O1xuICAgIH1cbiAgICAvLyBnZXQgbm9kZXMgdG8gYmUgYWxpZ25lZFxuICAgIGlmIChvcHRpb25zLmFsaWdubWVudENvbnN0cmFpbnQpIHtcbiAgICAgIGxheW91dC5jb25zdHJhaW50c1tcImFsaWdubWVudENvbnN0cmFpbnRcIl0gPSBvcHRpb25zLmFsaWdubWVudENvbnN0cmFpbnQ7XG4gICAgfVxuICAgIC8vIGdldCBub2RlcyB0byBiZSByZWxhdGl2ZWx5IHBsYWNlZFxuICAgIGlmIChvcHRpb25zLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludCkge1xuICAgICAgbGF5b3V0LmNvbnN0cmFpbnRzW1wicmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50XCJdID0gb3B0aW9ucy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQ7XG4gICAgfVxuICB9O1xuXG4gIC8qKioqIEFwcGx5IHBvc3Rwcm9jZXNzaW5nICoqKiovXG4gIGlmIChvcHRpb25zLm5lc3RpbmdGYWN0b3IgIT0gbnVsbCkgQ29TRUNvbnN0YW50cy5QRVJfTEVWRUxfSURFQUxfRURHRV9MRU5HVEhfRkFDVE9SID0gRkRMYXlvdXRDb25zdGFudHMuUEVSX0xFVkVMX0lERUFMX0VER0VfTEVOR1RIX0ZBQ1RPUiA9IG9wdGlvbnMubmVzdGluZ0ZhY3RvcjtcbiAgaWYgKG9wdGlvbnMuZ3Jhdml0eSAhPSBudWxsKSBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfR1JBVklUWV9TVFJFTkdUSCA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfR1JBVklUWV9TVFJFTkdUSCA9IG9wdGlvbnMuZ3Jhdml0eTtcbiAgaWYgKG9wdGlvbnMubnVtSXRlciAhPSBudWxsKSBDb1NFQ29uc3RhbnRzLk1BWF9JVEVSQVRJT05TID0gRkRMYXlvdXRDb25zdGFudHMuTUFYX0lURVJBVElPTlMgPSBvcHRpb25zLm51bUl0ZXI7XG4gIGlmIChvcHRpb25zLmdyYXZpdHlSYW5nZSAhPSBudWxsKSBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfR1JBVklUWV9SQU5HRV9GQUNUT1IgPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0dSQVZJVFlfUkFOR0VfRkFDVE9SID0gb3B0aW9ucy5ncmF2aXR5UmFuZ2U7XG4gIGlmIChvcHRpb25zLmdyYXZpdHlDb21wb3VuZCAhPSBudWxsKSBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfQ09NUE9VTkRfR1JBVklUWV9TVFJFTkdUSCA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQ09NUE9VTkRfR1JBVklUWV9TVFJFTkdUSCA9IG9wdGlvbnMuZ3Jhdml0eUNvbXBvdW5kO1xuICBpZiAob3B0aW9ucy5ncmF2aXR5UmFuZ2VDb21wb3VuZCAhPSBudWxsKSBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfQ09NUE9VTkRfR1JBVklUWV9SQU5HRV9GQUNUT1IgPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0NPTVBPVU5EX0dSQVZJVFlfUkFOR0VfRkFDVE9SID0gb3B0aW9ucy5ncmF2aXR5UmFuZ2VDb21wb3VuZDtcbiAgaWYgKG9wdGlvbnMuaW5pdGlhbEVuZXJneU9uSW5jcmVtZW50YWwgIT0gbnVsbCkgQ29TRUNvbnN0YW50cy5ERUZBVUxUX0NPT0xJTkdfRkFDVE9SX0lOQ1JFTUVOVEFMID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9DT09MSU5HX0ZBQ1RPUl9JTkNSRU1FTlRBTCA9IG9wdGlvbnMuaW5pdGlhbEVuZXJneU9uSW5jcmVtZW50YWw7XG5cbiAgaWYgKG9wdGlvbnMudGlsaW5nQ29tcGFyZUJ5ICE9IG51bGwpIENvU0VDb25zdGFudHMuVElMSU5HX0NPTVBBUkVfQlkgPSBvcHRpb25zLnRpbGluZ0NvbXBhcmVCeTtcblxuICBpZiAob3B0aW9ucy5xdWFsaXR5ID09ICdwcm9vZicpIExheW91dENvbnN0YW50cy5RVUFMSVRZID0gMjtlbHNlIExheW91dENvbnN0YW50cy5RVUFMSVRZID0gMDtcblxuICBDb1NFQ29uc3RhbnRzLk5PREVfRElNRU5TSU9OU19JTkNMVURFX0xBQkVMUyA9IEZETGF5b3V0Q29uc3RhbnRzLk5PREVfRElNRU5TSU9OU19JTkNMVURFX0xBQkVMUyA9IExheW91dENvbnN0YW50cy5OT0RFX0RJTUVOU0lPTlNfSU5DTFVERV9MQUJFTFMgPSBvcHRpb25zLm5vZGVEaW1lbnNpb25zSW5jbHVkZUxhYmVscztcbiAgQ29TRUNvbnN0YW50cy5ERUZBVUxUX0lOQ1JFTUVOVEFMID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9JTkNSRU1FTlRBTCA9IExheW91dENvbnN0YW50cy5ERUZBVUxUX0lOQ1JFTUVOVEFMID0gIW9wdGlvbnMucmFuZG9taXplO1xuICBDb1NFQ29uc3RhbnRzLkFOSU1BVEUgPSBGRExheW91dENvbnN0YW50cy5BTklNQVRFID0gTGF5b3V0Q29uc3RhbnRzLkFOSU1BVEUgPSBvcHRpb25zLmFuaW1hdGU7XG4gIENvU0VDb25zdGFudHMuVElMRSA9IG9wdGlvbnMudGlsZTtcbiAgQ29TRUNvbnN0YW50cy5USUxJTkdfUEFERElOR19WRVJUSUNBTCA9IHR5cGVvZiBvcHRpb25zLnRpbGluZ1BhZGRpbmdWZXJ0aWNhbCA9PT0gJ2Z1bmN0aW9uJyA/IG9wdGlvbnMudGlsaW5nUGFkZGluZ1ZlcnRpY2FsLmNhbGwoKSA6IG9wdGlvbnMudGlsaW5nUGFkZGluZ1ZlcnRpY2FsO1xuICBDb1NFQ29uc3RhbnRzLlRJTElOR19QQURESU5HX0hPUklaT05UQUwgPSB0eXBlb2Ygb3B0aW9ucy50aWxpbmdQYWRkaW5nSG9yaXpvbnRhbCA9PT0gJ2Z1bmN0aW9uJyA/IG9wdGlvbnMudGlsaW5nUGFkZGluZ0hvcml6b250YWwuY2FsbCgpIDogb3B0aW9ucy50aWxpbmdQYWRkaW5nSG9yaXpvbnRhbDtcblxuICBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfSU5DUkVNRU5UQUwgPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0lOQ1JFTUVOVEFMID0gTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfSU5DUkVNRU5UQUwgPSB0cnVlO1xuICBDb1NFQ29uc3RhbnRzLlBVUkVfSU5DUkVNRU5UQUwgPSAhb3B0aW9ucy5yYW5kb21pemU7XG4gIExheW91dENvbnN0YW50cy5ERUZBVUxUX1VOSUZPUk1fTEVBRl9OT0RFX1NJWkVTID0gb3B0aW9ucy51bmlmb3JtTm9kZURpbWVuc2lvbnM7XG5cbiAgLy8gVGhpcyBwYXJ0IGlzIGZvciBkZWJ1Zy9kZW1vIHB1cnBvc2VcbiAgaWYgKG9wdGlvbnMuc3RlcCA9PSBcInRyYW5zZm9ybWVkXCIpIHtcbiAgICBDb1NFQ29uc3RhbnRzLlRSQU5TRk9STV9PTl9DT05TVFJBSU5UX0hBTkRMSU5HID0gdHJ1ZTtcbiAgICBDb1NFQ29uc3RhbnRzLkVORk9SQ0VfQ09OU1RSQUlOVFMgPSBmYWxzZTtcbiAgICBDb1NFQ29uc3RhbnRzLkFQUExZX0xBWU9VVCA9IGZhbHNlO1xuICB9XG4gIGlmIChvcHRpb25zLnN0ZXAgPT0gXCJlbmZvcmNlZFwiKSB7XG4gICAgQ29TRUNvbnN0YW50cy5UUkFOU0ZPUk1fT05fQ09OU1RSQUlOVF9IQU5ETElORyA9IGZhbHNlO1xuICAgIENvU0VDb25zdGFudHMuRU5GT1JDRV9DT05TVFJBSU5UUyA9IHRydWU7XG4gICAgQ29TRUNvbnN0YW50cy5BUFBMWV9MQVlPVVQgPSBmYWxzZTtcbiAgfVxuICBpZiAob3B0aW9ucy5zdGVwID09IFwiY29zZVwiKSB7XG4gICAgQ29TRUNvbnN0YW50cy5UUkFOU0ZPUk1fT05fQ09OU1RSQUlOVF9IQU5ETElORyA9IGZhbHNlO1xuICAgIENvU0VDb25zdGFudHMuRU5GT1JDRV9DT05TVFJBSU5UUyA9IGZhbHNlO1xuICAgIENvU0VDb25zdGFudHMuQVBQTFlfTEFZT1VUID0gdHJ1ZTtcbiAgfVxuICBpZiAob3B0aW9ucy5zdGVwID09IFwiYWxsXCIpIHtcbiAgICBpZiAob3B0aW9ucy5yYW5kb21pemUpIENvU0VDb25zdGFudHMuVFJBTlNGT1JNX09OX0NPTlNUUkFJTlRfSEFORExJTkcgPSB0cnVlO2Vsc2UgQ29TRUNvbnN0YW50cy5UUkFOU0ZPUk1fT05fQ09OU1RSQUlOVF9IQU5ETElORyA9IGZhbHNlO1xuICAgIENvU0VDb25zdGFudHMuRU5GT1JDRV9DT05TVFJBSU5UUyA9IHRydWU7XG4gICAgQ29TRUNvbnN0YW50cy5BUFBMWV9MQVlPVVQgPSB0cnVlO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuZml4ZWROb2RlQ29uc3RyYWludCB8fCBvcHRpb25zLmFsaWdubWVudENvbnN0cmFpbnQgfHwgb3B0aW9ucy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQpIHtcbiAgICBDb1NFQ29uc3RhbnRzLlRSRUVfUkVEVUNUSU9OX09OX0lOQ1JFTUVOVEFMID0gZmFsc2U7XG4gIH0gZWxzZSB7XG4gICAgQ29TRUNvbnN0YW50cy5UUkVFX1JFRFVDVElPTl9PTl9JTkNSRU1FTlRBTCA9IHRydWU7XG4gIH1cblxuICB2YXIgY29zZUxheW91dCA9IG5ldyBDb1NFTGF5b3V0KCk7XG4gIHZhciBnbSA9IGNvc2VMYXlvdXQubmV3R3JhcGhNYW5hZ2VyKCk7XG5cbiAgcHJvY2Vzc0NoaWxkcmVuTGlzdChnbS5hZGRSb290KCksIGF1eC5nZXRUb3BNb3N0Tm9kZXMobm9kZXMpLCBjb3NlTGF5b3V0LCBvcHRpb25zKTtcbiAgcHJvY2Vzc0VkZ2VzKGNvc2VMYXlvdXQsIGdtLCBlZGdlcyk7XG4gIHByb2Nlc3NDb25zdHJhaW50cyhjb3NlTGF5b3V0LCBvcHRpb25zKTtcblxuICBjb3NlTGF5b3V0LnJ1bkxheW91dCgpO1xuXG4gIHJldHVybiBpZFRvTE5vZGU7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHsgY29zZUxheW91dDogY29zZUxheW91dCB9O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gMjEyOlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cblxudmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuLyoqXG4gIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZmNvc2UgbGF5b3V0IGFsZ29yaXRobVxuKi9cblxudmFyIGFzc2lnbiA9IF9fd2VicGFja19yZXF1aXJlX18oNjU4KTtcbnZhciBhdXggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU0OCk7XG5cbnZhciBfcmVxdWlyZSA9IF9fd2VicGFja19yZXF1aXJlX18oNjU3KSxcbiAgICBzcGVjdHJhbExheW91dCA9IF9yZXF1aXJlLnNwZWN0cmFsTGF5b3V0O1xuXG52YXIgX3JlcXVpcmUyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MTYpLFxuICAgIGNvc2VMYXlvdXQgPSBfcmVxdWlyZTIuY29zZUxheW91dDtcblxudmFyIGRlZmF1bHRzID0gT2JqZWN0LmZyZWV6ZSh7XG5cbiAgLy8gJ2RyYWZ0JywgJ2RlZmF1bHQnIG9yICdwcm9vZicgXG4gIC8vIC0gJ2RyYWZ0JyBvbmx5IGFwcGxpZXMgc3BlY3RyYWwgbGF5b3V0IFxuICAvLyAtICdkZWZhdWx0JyBpbXByb3ZlcyB0aGUgcXVhbGl0eSB3aXRoIHN1YnNlcXVlbnQgQ29TRSBsYXlvdXQgKGZhc3QgY29vbGluZyByYXRlKVxuICAvLyAtICdwcm9vZicgaW1wcm92ZXMgdGhlIHF1YWxpdHkgd2l0aCBzdWJzZXF1ZW50IENvU0UgbGF5b3V0IChzbG93IGNvb2xpbmcgcmF0ZSkgXG4gIHF1YWxpdHk6IFwiZGVmYXVsdFwiLFxuICAvLyBVc2UgcmFuZG9tIG5vZGUgcG9zaXRpb25zIGF0IGJlZ2lubmluZyBvZiBsYXlvdXRcbiAgLy8gaWYgdGhpcyBpcyBzZXQgdG8gZmFsc2UsIHRoZW4gcXVhbGl0eSBvcHRpb24gbXVzdCBiZSBcInByb29mXCJcbiAgcmFuZG9taXplOiB0cnVlLFxuICAvLyBXaGV0aGVyIG9yIG5vdCB0byBhbmltYXRlIHRoZSBsYXlvdXRcbiAgYW5pbWF0ZTogdHJ1ZSxcbiAgLy8gRHVyYXRpb24gb2YgYW5pbWF0aW9uIGluIG1zLCBpZiBlbmFibGVkXG4gIGFuaW1hdGlvbkR1cmF0aW9uOiAxMDAwLFxuICAvLyBFYXNpbmcgb2YgYW5pbWF0aW9uLCBpZiBlbmFibGVkXG4gIGFuaW1hdGlvbkVhc2luZzogdW5kZWZpbmVkLFxuICAvLyBGaXQgdGhlIHZpZXdwb3J0IHRvIHRoZSByZXBvc2l0aW9uZWQgbm9kZXNcbiAgZml0OiB0cnVlLFxuICAvLyBQYWRkaW5nIGFyb3VuZCBsYXlvdXRcbiAgcGFkZGluZzogMzAsXG4gIC8vIFdoZXRoZXIgdG8gaW5jbHVkZSBsYWJlbHMgaW4gbm9kZSBkaW1lbnNpb25zLiBWYWxpZCBpbiBcInByb29mXCIgcXVhbGl0eVxuICBub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHM6IGZhbHNlLFxuICAvLyBXaGV0aGVyIG9yIG5vdCBzaW1wbGUgbm9kZXMgKG5vbi1jb21wb3VuZCBub2RlcykgYXJlIG9mIHVuaWZvcm0gZGltZW5zaW9uc1xuICB1bmlmb3JtTm9kZURpbWVuc2lvbnM6IGZhbHNlLFxuICAvLyBXaGV0aGVyIHRvIHBhY2sgZGlzY29ubmVjdGVkIGNvbXBvbmVudHMgLSB2YWxpZCBvbmx5IGlmIHJhbmRvbWl6ZTogdHJ1ZVxuICBwYWNrQ29tcG9uZW50czogdHJ1ZSxcbiAgLy8gTGF5b3V0IHN0ZXAgLSBhbGwsIHRyYW5zZm9ybWVkLCBlbmZvcmNlZCwgY29zZSAtIGZvciBkZWJ1ZyBwdXJwb3NlIG9ubHlcbiAgc3RlcDogXCJhbGxcIixcblxuICAvKiBzcGVjdHJhbCBsYXlvdXQgb3B0aW9ucyAqL1xuXG4gIC8vIEZhbHNlIGZvciByYW5kb20sIHRydWUgZm9yIGdyZWVkeVxuICBzYW1wbGluZ1R5cGU6IHRydWUsXG4gIC8vIFNhbXBsZSBzaXplIHRvIGNvbnN0cnVjdCBkaXN0YW5jZSBtYXRyaXhcbiAgc2FtcGxlU2l6ZTogMjUsXG4gIC8vIFNlcGFyYXRpb24gYW1vdW50IGJldHdlZW4gbm9kZXNcbiAgbm9kZVNlcGFyYXRpb246IDc1LFxuICAvLyBQb3dlciBpdGVyYXRpb24gdG9sZXJhbmNlXG4gIHBpVG9sOiAwLjAwMDAwMDEsXG5cbiAgLyogQ29TRSBsYXlvdXQgb3B0aW9ucyAqL1xuXG4gIC8vIE5vZGUgcmVwdWxzaW9uIChub24gb3ZlcmxhcHBpbmcpIG11bHRpcGxpZXJcbiAgbm9kZVJlcHVsc2lvbjogZnVuY3Rpb24gbm9kZVJlcHVsc2lvbihub2RlKSB7XG4gICAgcmV0dXJuIDQ1MDA7XG4gIH0sXG4gIC8vIElkZWFsIGVkZ2UgKG5vbiBuZXN0ZWQpIGxlbmd0aFxuICBpZGVhbEVkZ2VMZW5ndGg6IGZ1bmN0aW9uIGlkZWFsRWRnZUxlbmd0aChlZGdlKSB7XG4gICAgcmV0dXJuIDUwO1xuICB9LFxuICAvLyBEaXZpc29yIHRvIGNvbXB1dGUgZWRnZSBmb3JjZXNcbiAgZWRnZUVsYXN0aWNpdHk6IGZ1bmN0aW9uIGVkZ2VFbGFzdGljaXR5KGVkZ2UpIHtcbiAgICByZXR1cm4gMC40NTtcbiAgfSxcbiAgLy8gTmVzdGluZyBmYWN0b3IgKG11bHRpcGxpZXIpIHRvIGNvbXB1dGUgaWRlYWwgZWRnZSBsZW5ndGggZm9yIG5lc3RlZCBlZGdlc1xuICBuZXN0aW5nRmFjdG9yOiAwLjEsXG4gIC8vIEdyYXZpdHkgZm9yY2UgKGNvbnN0YW50KVxuICBncmF2aXR5OiAwLjI1LFxuICAvLyBNYXhpbXVtIG51bWJlciBvZiBpdGVyYXRpb25zIHRvIHBlcmZvcm1cbiAgbnVtSXRlcjogMjUwMCxcbiAgLy8gRm9yIGVuYWJsaW5nIHRpbGluZ1xuICB0aWxlOiB0cnVlLFxuICAvLyBUaGUgZnVuY3Rpb24gdGhhdCBzcGVjaWZpZXMgdGhlIGNyaXRlcmlhIGZvciBjb21wYXJpbmcgbm9kZXMgd2hpbGUgc29ydGluZyB0aGVtIGR1cmluZyB0aWxpbmcgb3BlcmF0aW9uLlxuICAvLyBUYWtlcyB0aGUgbm9kZSBpZCBhcyBhIHBhcmFtZXRlciBhbmQgdGhlIGRlZmF1bHQgdGlsaW5nIG9wZXJhdGlvbiBpcyBwZXJmb21lZCB3aGVuIHRoaXMgb3B0aW9uIGlzIG5vdCBzZXQuXG4gIHRpbGluZ0NvbXBhcmVCeTogdW5kZWZpbmVkLFxuICAvLyBSZXByZXNlbnRzIHRoZSBhbW91bnQgb2YgdGhlIHZlcnRpY2FsIHNwYWNlIHRvIHB1dCBiZXR3ZWVuIHRoZSB6ZXJvIGRlZ3JlZSBtZW1iZXJzIGR1cmluZyB0aGUgdGlsaW5nIG9wZXJhdGlvbihjYW4gYWxzbyBiZSBhIGZ1bmN0aW9uKVxuICB0aWxpbmdQYWRkaW5nVmVydGljYWw6IDEwLFxuICAvLyBSZXByZXNlbnRzIHRoZSBhbW91bnQgb2YgdGhlIGhvcml6b250YWwgc3BhY2UgdG8gcHV0IGJldHdlZW4gdGhlIHplcm8gZGVncmVlIG1lbWJlcnMgZHVyaW5nIHRoZSB0aWxpbmcgb3BlcmF0aW9uKGNhbiBhbHNvIGJlIGEgZnVuY3Rpb24pXG4gIHRpbGluZ1BhZGRpbmdIb3Jpem9udGFsOiAxMCxcbiAgLy8gR3Jhdml0eSByYW5nZSAoY29uc3RhbnQpIGZvciBjb21wb3VuZHNcbiAgZ3Jhdml0eVJhbmdlQ29tcG91bmQ6IDEuNSxcbiAgLy8gR3Jhdml0eSBmb3JjZSAoY29uc3RhbnQpIGZvciBjb21wb3VuZHNcbiAgZ3Jhdml0eUNvbXBvdW5kOiAxLjAsXG4gIC8vIEdyYXZpdHkgcmFuZ2UgKGNvbnN0YW50KVxuICBncmF2aXR5UmFuZ2U6IDMuOCxcbiAgLy8gSW5pdGlhbCBjb29saW5nIGZhY3RvciBmb3IgaW5jcmVtZW50YWwgbGF5b3V0ICBcbiAgaW5pdGlhbEVuZXJneU9uSW5jcmVtZW50YWw6IDAuMyxcblxuICAvKiBjb25zdHJhaW50IG9wdGlvbnMgKi9cblxuICAvLyBGaXggcmVxdWlyZWQgbm9kZXMgdG8gcHJlZGVmaW5lZCBwb3NpdGlvbnNcbiAgLy8gW3tub2RlSWQ6ICduMScsIHBvc2l0aW9uOiB7eDogMTAwLCB5OiAyMDB9LCB7Li4ufV1cbiAgZml4ZWROb2RlQ29uc3RyYWludDogdW5kZWZpbmVkLFxuICAvLyBBbGlnbiByZXF1aXJlZCBub2RlcyBpbiB2ZXJ0aWNhbC9ob3Jpem9udGFsIGRpcmVjdGlvblxuICAvLyB7dmVydGljYWw6IFtbJ24xJywgJ24yJyldLCBbJ24zJywgJ240J11dLCBob3Jpem9udGFsOiBbJ24yJywgJ240J119XG4gIGFsaWdubWVudENvbnN0cmFpbnQ6IHVuZGVmaW5lZCxcbiAgLy8gUGxhY2UgdHdvIG5vZGVzIHJlbGF0aXZlbHkgaW4gdmVydGljYWwvaG9yaXpvbnRhbCBkaXJlY3Rpb24gXG4gIC8vIFt7dG9wOiAnbjEnLCBib3R0b206ICduMicsIGdhcDogMTAwfSwge2xlZnQ6ICduMycsIHJpZ2h0OiAnbjQnLCBnYXA6IDc1fV1cbiAgcmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50OiB1bmRlZmluZWQsXG5cbiAgLyogbGF5b3V0IGV2ZW50IGNhbGxiYWNrcyAqL1xuICByZWFkeTogZnVuY3Rpb24gcmVhZHkoKSB7fSwgLy8gb24gbGF5b3V0cmVhZHlcbiAgc3RvcDogZnVuY3Rpb24gc3RvcCgpIHt9IC8vIG9uIGxheW91dHN0b3Bcbn0pO1xuXG52YXIgTGF5b3V0ID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBMYXlvdXQob3B0aW9ucykge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBMYXlvdXQpO1xuXG4gICAgdGhpcy5vcHRpb25zID0gYXNzaWduKHt9LCBkZWZhdWx0cywgb3B0aW9ucyk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoTGF5b3V0LCBbe1xuICAgIGtleTogJ3J1bicsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJ1bigpIHtcbiAgICAgIHZhciBsYXlvdXQgPSB0aGlzO1xuICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICB2YXIgY3kgPSBvcHRpb25zLmN5O1xuICAgICAgdmFyIGVsZXMgPSBvcHRpb25zLmVsZXM7XG5cbiAgICAgIHZhciBzcGVjdHJhbFJlc3VsdCA9IFtdO1xuICAgICAgdmFyIHhDb29yZHMgPSB2b2lkIDA7XG4gICAgICB2YXIgeUNvb3JkcyA9IHZvaWQgMDtcbiAgICAgIHZhciBjb3NlUmVzdWx0ID0gW107XG4gICAgICB2YXIgY29tcG9uZW50cyA9IHZvaWQgMDtcbiAgICAgIHZhciBjb21wb25lbnRDZW50ZXJzID0gW107XG5cbiAgICAgIC8vIGJhc2ljIHZhbGlkaXR5IGNoZWNrIGZvciBjb25zdHJhaW50IGlucHV0cyBcbiAgICAgIGlmIChvcHRpb25zLmZpeGVkTm9kZUNvbnN0cmFpbnQgJiYgKCFBcnJheS5pc0FycmF5KG9wdGlvbnMuZml4ZWROb2RlQ29uc3RyYWludCkgfHwgb3B0aW9ucy5maXhlZE5vZGVDb25zdHJhaW50Lmxlbmd0aCA9PSAwKSkge1xuICAgICAgICBvcHRpb25zLmZpeGVkTm9kZUNvbnN0cmFpbnQgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLmFsaWdubWVudENvbnN0cmFpbnQpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuYWxpZ25tZW50Q29uc3RyYWludC52ZXJ0aWNhbCAmJiAoIUFycmF5LmlzQXJyYXkob3B0aW9ucy5hbGlnbm1lbnRDb25zdHJhaW50LnZlcnRpY2FsKSB8fCBvcHRpb25zLmFsaWdubWVudENvbnN0cmFpbnQudmVydGljYWwubGVuZ3RoID09IDApKSB7XG4gICAgICAgICAgb3B0aW9ucy5hbGlnbm1lbnRDb25zdHJhaW50LnZlcnRpY2FsID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmFsaWdubWVudENvbnN0cmFpbnQuaG9yaXpvbnRhbCAmJiAoIUFycmF5LmlzQXJyYXkob3B0aW9ucy5hbGlnbm1lbnRDb25zdHJhaW50Lmhvcml6b250YWwpIHx8IG9wdGlvbnMuYWxpZ25tZW50Q29uc3RyYWludC5ob3Jpem9udGFsLmxlbmd0aCA9PSAwKSkge1xuICAgICAgICAgIG9wdGlvbnMuYWxpZ25tZW50Q29uc3RyYWludC5ob3Jpem9udGFsID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludCAmJiAoIUFycmF5LmlzQXJyYXkob3B0aW9ucy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQpIHx8IG9wdGlvbnMucmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50Lmxlbmd0aCA9PSAwKSkge1xuICAgICAgICBvcHRpb25zLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgLy8gaWYgYW55IGNvbnN0cmFpbnQgZXhpc3RzLCBzZXQgc29tZSBvcHRpb25zXG4gICAgICB2YXIgY29uc3RyYWludEV4aXN0ID0gb3B0aW9ucy5maXhlZE5vZGVDb25zdHJhaW50IHx8IG9wdGlvbnMuYWxpZ25tZW50Q29uc3RyYWludCB8fCBvcHRpb25zLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludDtcbiAgICAgIGlmIChjb25zdHJhaW50RXhpc3QpIHtcbiAgICAgICAgLy8gY29uc3RyYWludHMgd29yayB3aXRoIHRoZXNlIG9wdGlvbnNcbiAgICAgICAgb3B0aW9ucy50aWxlID0gZmFsc2U7XG4gICAgICAgIG9wdGlvbnMucGFja0NvbXBvbmVudHMgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gZGVjaWRlIGNvbXBvbmVudCBwYWNraW5nIGlzIGVuYWJsZWQgb3Igbm90XG4gICAgICB2YXIgbGF5VXRpbCA9IHZvaWQgMDtcbiAgICAgIHZhciBwYWNraW5nRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgaWYgKGN5LmxheW91dFV0aWxpdGllcyAmJiBvcHRpb25zLnBhY2tDb21wb25lbnRzKSB7XG4gICAgICAgIGxheVV0aWwgPSBjeS5sYXlvdXRVdGlsaXRpZXMoXCJnZXRcIik7XG4gICAgICAgIGlmICghbGF5VXRpbCkgbGF5VXRpbCA9IGN5LmxheW91dFV0aWxpdGllcygpO1xuICAgICAgICBwYWNraW5nRW5hYmxlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChlbGVzLm5vZGVzKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyBpZiBwYWNraW5nIGlzIG5vdCBlbmFibGVkLCBwZXJmb3JtIGxheW91dCBvbiB0aGUgd2hvbGUgZ3JhcGhcbiAgICAgICAgaWYgKCFwYWNraW5nRW5hYmxlZCkge1xuICAgICAgICAgIC8vIHN0b3JlIGNvbXBvbmVudCBjZW50ZXJcbiAgICAgICAgICB2YXIgYm91bmRpbmdCb3ggPSBvcHRpb25zLmVsZXMuYm91bmRpbmdCb3goKTtcbiAgICAgICAgICBjb21wb25lbnRDZW50ZXJzLnB1c2goeyB4OiBib3VuZGluZ0JveC54MSArIGJvdW5kaW5nQm94LncgLyAyLCB5OiBib3VuZGluZ0JveC55MSArIGJvdW5kaW5nQm94LmggLyAyIH0pO1xuICAgICAgICAgIC8vIGFwcGx5IHNwZWN0cmFsIGxheW91dFxuICAgICAgICAgIGlmIChvcHRpb25zLnJhbmRvbWl6ZSkge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHNwZWN0cmFsTGF5b3V0KG9wdGlvbnMpO1xuICAgICAgICAgICAgc3BlY3RyYWxSZXN1bHQucHVzaChyZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBhcHBseSBjb3NlIGxheW91dCBhcyBwb3N0cHJvY2Vzc2luZ1xuICAgICAgICAgIGlmIChvcHRpb25zLnF1YWxpdHkgPT0gXCJkZWZhdWx0XCIgfHwgb3B0aW9ucy5xdWFsaXR5ID09IFwicHJvb2ZcIikge1xuICAgICAgICAgICAgY29zZVJlc3VsdC5wdXNoKGNvc2VMYXlvdXQob3B0aW9ucywgc3BlY3RyYWxSZXN1bHRbMF0pKTtcbiAgICAgICAgICAgIGF1eC5yZWxvY2F0ZUNvbXBvbmVudChjb21wb25lbnRDZW50ZXJzWzBdLCBjb3NlUmVzdWx0WzBdLCBvcHRpb25zKTsgLy8gcmVsb2NhdGUgY2VudGVyIHRvIG9yaWdpbmFsIHBvc2l0aW9uXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGF1eC5yZWxvY2F0ZUNvbXBvbmVudChjb21wb25lbnRDZW50ZXJzWzBdLCBzcGVjdHJhbFJlc3VsdFswXSwgb3B0aW9ucyk7IC8vIHJlbG9jYXRlIGNlbnRlciB0byBvcmlnaW5hbCBwb3NpdGlvblxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBwYWNraW5nIGlzIGVuYWJsZWRcbiAgICAgICAgICB2YXIgdG9wTW9zdE5vZGVzID0gYXV4LmdldFRvcE1vc3ROb2RlcyhvcHRpb25zLmVsZXMubm9kZXMoKSk7XG4gICAgICAgICAgY29tcG9uZW50cyA9IGF1eC5jb25uZWN0Q29tcG9uZW50cyhjeSwgb3B0aW9ucy5lbGVzLCB0b3BNb3N0Tm9kZXMpO1xuICAgICAgICAgIC8vIHN0b3JlIGNvbXBvbmVudCBjZW50ZXJzXG4gICAgICAgICAgY29tcG9uZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChjb21wb25lbnQpIHtcbiAgICAgICAgICAgIHZhciBib3VuZGluZ0JveCA9IGNvbXBvbmVudC5ib3VuZGluZ0JveCgpO1xuICAgICAgICAgICAgY29tcG9uZW50Q2VudGVycy5wdXNoKHsgeDogYm91bmRpbmdCb3gueDEgKyBib3VuZGluZ0JveC53IC8gMiwgeTogYm91bmRpbmdCb3gueTEgKyBib3VuZGluZ0JveC5oIC8gMiB9KTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vc2VuZCBlYWNoIGNvbXBvbmVudCB0byBzcGVjdHJhbCBsYXlvdXQgaWYgcmFuZG9taXplZFxuICAgICAgICAgIGlmIChvcHRpb25zLnJhbmRvbWl6ZSkge1xuICAgICAgICAgICAgY29tcG9uZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChjb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgb3B0aW9ucy5lbGVzID0gY29tcG9uZW50O1xuICAgICAgICAgICAgICBzcGVjdHJhbFJlc3VsdC5wdXNoKHNwZWN0cmFsTGF5b3V0KG9wdGlvbnMpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChvcHRpb25zLnF1YWxpdHkgPT0gXCJkZWZhdWx0XCIgfHwgb3B0aW9ucy5xdWFsaXR5ID09IFwicHJvb2ZcIikge1xuICAgICAgICAgICAgdmFyIHRvQmVUaWxlZE5vZGVzID0gY3kuY29sbGVjdGlvbigpO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMudGlsZSkge1xuICAgICAgICAgICAgICAvLyBiZWhhdmUgbm9kZXMgdG8gYmUgdGlsZWQgYXMgb25lIGNvbXBvbmVudFxuICAgICAgICAgICAgICB2YXIgbm9kZUluZGV4ZXMgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICAgIHZhciBfeENvb3JkcyA9IFtdO1xuICAgICAgICAgICAgICB2YXIgX3lDb29yZHMgPSBbXTtcbiAgICAgICAgICAgICAgdmFyIGNvdW50ID0gMDtcbiAgICAgICAgICAgICAgdmFyIHRlbXBTcGVjdHJhbFJlc3VsdCA9IHsgbm9kZUluZGV4ZXM6IG5vZGVJbmRleGVzLCB4Q29vcmRzOiBfeENvb3JkcywgeUNvb3JkczogX3lDb29yZHMgfTtcbiAgICAgICAgICAgICAgdmFyIGluZGV4ZXNUb0JlRGVsZXRlZCA9IFtdO1xuICAgICAgICAgICAgICBjb21wb25lbnRzLmZvckVhY2goZnVuY3Rpb24gKGNvbXBvbmVudCwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50LmVkZ2VzKCkubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5ub2RlcygpLmZvckVhY2goZnVuY3Rpb24gKG5vZGUsIGkpIHtcbiAgICAgICAgICAgICAgICAgICAgdG9CZVRpbGVkTm9kZXMubWVyZ2UoY29tcG9uZW50Lm5vZGVzKClbaV0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW5vZGUuaXNQYXJlbnQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgIHRlbXBTcGVjdHJhbFJlc3VsdC5ub2RlSW5kZXhlcy5zZXQoY29tcG9uZW50Lm5vZGVzKClbaV0uaWQoKSwgY291bnQrKyk7XG4gICAgICAgICAgICAgICAgICAgICAgdGVtcFNwZWN0cmFsUmVzdWx0LnhDb29yZHMucHVzaChjb21wb25lbnQubm9kZXMoKVswXS5wb3NpdGlvbigpLngpO1xuICAgICAgICAgICAgICAgICAgICAgIHRlbXBTcGVjdHJhbFJlc3VsdC55Q29vcmRzLnB1c2goY29tcG9uZW50Lm5vZGVzKClbMF0ucG9zaXRpb24oKS55KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICBpbmRleGVzVG9CZURlbGV0ZWQucHVzaChpbmRleCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgaWYgKHRvQmVUaWxlZE5vZGVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICB2YXIgX2JvdW5kaW5nQm94ID0gdG9CZVRpbGVkTm9kZXMuYm91bmRpbmdCb3goKTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRDZW50ZXJzLnB1c2goeyB4OiBfYm91bmRpbmdCb3gueDEgKyBfYm91bmRpbmdCb3gudyAvIDIsIHk6IF9ib3VuZGluZ0JveC55MSArIF9ib3VuZGluZ0JveC5oIC8gMiB9KTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRzLnB1c2godG9CZVRpbGVkTm9kZXMpO1xuICAgICAgICAgICAgICAgIHNwZWN0cmFsUmVzdWx0LnB1c2godGVtcFNwZWN0cmFsUmVzdWx0KTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gaW5kZXhlc1RvQmVEZWxldGVkLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgICBjb21wb25lbnRzLnNwbGljZShpbmRleGVzVG9CZURlbGV0ZWRbaV0sIDEpO1xuICAgICAgICAgICAgICAgICAgc3BlY3RyYWxSZXN1bHQuc3BsaWNlKGluZGV4ZXNUb0JlRGVsZXRlZFtpXSwgMSk7XG4gICAgICAgICAgICAgICAgICBjb21wb25lbnRDZW50ZXJzLnNwbGljZShpbmRleGVzVG9CZURlbGV0ZWRbaV0sIDEpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbXBvbmVudHMuZm9yRWFjaChmdW5jdGlvbiAoY29tcG9uZW50LCBpbmRleCkge1xuICAgICAgICAgICAgICAvLyBzZW5kIGVhY2ggY29tcG9uZW50IHRvIGNvc2UgbGF5b3V0XG4gICAgICAgICAgICAgIG9wdGlvbnMuZWxlcyA9IGNvbXBvbmVudDtcbiAgICAgICAgICAgICAgY29zZVJlc3VsdC5wdXNoKGNvc2VMYXlvdXQob3B0aW9ucywgc3BlY3RyYWxSZXN1bHRbaW5kZXhdKSk7XG4gICAgICAgICAgICAgIGF1eC5yZWxvY2F0ZUNvbXBvbmVudChjb21wb25lbnRDZW50ZXJzW2luZGV4XSwgY29zZVJlc3VsdFtpbmRleF0sIG9wdGlvbnMpOyAvLyByZWxvY2F0ZSBjZW50ZXIgdG8gb3JpZ2luYWwgcG9zaXRpb25cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb21wb25lbnRzLmZvckVhY2goZnVuY3Rpb24gKGNvbXBvbmVudCwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgYXV4LnJlbG9jYXRlQ29tcG9uZW50KGNvbXBvbmVudENlbnRlcnNbaW5kZXhdLCBzcGVjdHJhbFJlc3VsdFtpbmRleF0sIG9wdGlvbnMpOyAvLyByZWxvY2F0ZSBjZW50ZXIgdG8gb3JpZ2luYWwgcG9zaXRpb25cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIHBhY2tpbmdcbiAgICAgICAgICB2YXIgY29tcG9uZW50c0V2YWx1YXRlZCA9IG5ldyBTZXQoKTtcbiAgICAgICAgICBpZiAoY29tcG9uZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICB2YXIgc3ViZ3JhcGhzID0gW107XG4gICAgICAgICAgICB2YXIgaGlkZGVuRWxlcyA9IGVsZXMuZmlsdGVyKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGVsZS5jc3MoJ2Rpc3BsYXknKSA9PSAnbm9uZSc7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbXBvbmVudHMuZm9yRWFjaChmdW5jdGlvbiAoY29tcG9uZW50LCBpbmRleCkge1xuICAgICAgICAgICAgICB2YXIgbm9kZUluZGV4ZXMgPSB2b2lkIDA7XG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLnF1YWxpdHkgPT0gXCJkcmFmdFwiKSB7XG4gICAgICAgICAgICAgICAgbm9kZUluZGV4ZXMgPSBzcGVjdHJhbFJlc3VsdFtpbmRleF0ubm9kZUluZGV4ZXM7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAoY29tcG9uZW50Lm5vZGVzKCkubm90KGhpZGRlbkVsZXMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB2YXIgc3ViZ3JhcGggPSB7fTtcbiAgICAgICAgICAgICAgICBzdWJncmFwaC5lZGdlcyA9IFtdO1xuICAgICAgICAgICAgICAgIHN1YmdyYXBoLm5vZGVzID0gW107XG4gICAgICAgICAgICAgICAgdmFyIG5vZGVJbmRleCA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQubm9kZXMoKS5ub3QoaGlkZGVuRWxlcykuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucXVhbGl0eSA9PSBcImRyYWZ0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlLmlzUGFyZW50KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICBub2RlSW5kZXggPSBub2RlSW5kZXhlcy5nZXQobm9kZS5pZCgpKTtcbiAgICAgICAgICAgICAgICAgICAgICBzdWJncmFwaC5ub2Rlcy5wdXNoKHsgeDogc3BlY3RyYWxSZXN1bHRbaW5kZXhdLnhDb29yZHNbbm9kZUluZGV4XSAtIG5vZGUuYm91bmRpbmdib3goKS53IC8gMiwgeTogc3BlY3RyYWxSZXN1bHRbaW5kZXhdLnlDb29yZHNbbm9kZUluZGV4XSAtIG5vZGUuYm91bmRpbmdib3goKS5oIC8gMiwgd2lkdGg6IG5vZGUuYm91bmRpbmdib3goKS53LCBoZWlnaHQ6IG5vZGUuYm91bmRpbmdib3goKS5oIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJlbnRJbmZvID0gYXV4LmNhbGNCb3VuZGluZ0JveChub2RlLCBzcGVjdHJhbFJlc3VsdFtpbmRleF0ueENvb3Jkcywgc3BlY3RyYWxSZXN1bHRbaW5kZXhdLnlDb29yZHMsIG5vZGVJbmRleGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICBzdWJncmFwaC5ub2Rlcy5wdXNoKHsgeDogcGFyZW50SW5mby50b3BMZWZ0WCwgeTogcGFyZW50SW5mby50b3BMZWZ0WSwgd2lkdGg6IHBhcmVudEluZm8ud2lkdGgsIGhlaWdodDogcGFyZW50SW5mby5oZWlnaHQgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb3NlUmVzdWx0W2luZGV4XVtub2RlLmlkKCldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgc3ViZ3JhcGgubm9kZXMucHVzaCh7IHg6IGNvc2VSZXN1bHRbaW5kZXhdW25vZGUuaWQoKV0uZ2V0TGVmdCgpLCB5OiBjb3NlUmVzdWx0W2luZGV4XVtub2RlLmlkKCldLmdldFRvcCgpLCB3aWR0aDogY29zZVJlc3VsdFtpbmRleF1bbm9kZS5pZCgpXS5nZXRXaWR0aCgpLCBoZWlnaHQ6IGNvc2VSZXN1bHRbaW5kZXhdW25vZGUuaWQoKV0uZ2V0SGVpZ2h0KCkgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuZWRnZXMoKS5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgc291cmNlID0gZWRnZS5zb3VyY2UoKTtcbiAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSBlZGdlLnRhcmdldCgpO1xuICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZS5jc3MoXCJkaXNwbGF5XCIpICE9IFwibm9uZVwiICYmIHRhcmdldC5jc3MoXCJkaXNwbGF5XCIpICE9IFwibm9uZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnF1YWxpdHkgPT0gXCJkcmFmdFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdmFyIHNvdXJjZU5vZGVJbmRleCA9IG5vZGVJbmRleGVzLmdldChzb3VyY2UuaWQoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgdmFyIHRhcmdldE5vZGVJbmRleCA9IG5vZGVJbmRleGVzLmdldCh0YXJnZXQuaWQoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgdmFyIHNvdXJjZUNlbnRlciA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXRDZW50ZXIgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlLmlzUGFyZW50KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJlbnRJbmZvID0gYXV4LmNhbGNCb3VuZGluZ0JveChzb3VyY2UsIHNwZWN0cmFsUmVzdWx0W2luZGV4XS54Q29vcmRzLCBzcGVjdHJhbFJlc3VsdFtpbmRleF0ueUNvb3Jkcywgbm9kZUluZGV4ZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlQ2VudGVyLnB1c2gocGFyZW50SW5mby50b3BMZWZ0WCArIHBhcmVudEluZm8ud2lkdGggLyAyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUNlbnRlci5wdXNoKHBhcmVudEluZm8udG9wTGVmdFkgKyBwYXJlbnRJbmZvLmhlaWdodCAvIDIpO1xuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VDZW50ZXIucHVzaChzcGVjdHJhbFJlc3VsdFtpbmRleF0ueENvb3Jkc1tzb3VyY2VOb2RlSW5kZXhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUNlbnRlci5wdXNoKHNwZWN0cmFsUmVzdWx0W2luZGV4XS55Q29vcmRzW3NvdXJjZU5vZGVJbmRleF0pO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LmlzUGFyZW50KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfcGFyZW50SW5mbyA9IGF1eC5jYWxjQm91bmRpbmdCb3godGFyZ2V0LCBzcGVjdHJhbFJlc3VsdFtpbmRleF0ueENvb3Jkcywgc3BlY3RyYWxSZXN1bHRbaW5kZXhdLnlDb29yZHMsIG5vZGVJbmRleGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldENlbnRlci5wdXNoKF9wYXJlbnRJbmZvLnRvcExlZnRYICsgX3BhcmVudEluZm8ud2lkdGggLyAyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldENlbnRlci5wdXNoKF9wYXJlbnRJbmZvLnRvcExlZnRZICsgX3BhcmVudEluZm8uaGVpZ2h0IC8gMik7XG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldENlbnRlci5wdXNoKHNwZWN0cmFsUmVzdWx0W2luZGV4XS54Q29vcmRzW3RhcmdldE5vZGVJbmRleF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Q2VudGVyLnB1c2goc3BlY3RyYWxSZXN1bHRbaW5kZXhdLnlDb29yZHNbdGFyZ2V0Tm9kZUluZGV4XSk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIHN1YmdyYXBoLmVkZ2VzLnB1c2goeyBzdGFydFg6IHNvdXJjZUNlbnRlclswXSwgc3RhcnRZOiBzb3VyY2VDZW50ZXJbMV0sIGVuZFg6IHRhcmdldENlbnRlclswXSwgZW5kWTogdGFyZ2V0Q2VudGVyWzFdIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChjb3NlUmVzdWx0W2luZGV4XVtzb3VyY2UuaWQoKV0gJiYgY29zZVJlc3VsdFtpbmRleF1bdGFyZ2V0LmlkKCldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdWJncmFwaC5lZGdlcy5wdXNoKHsgc3RhcnRYOiBjb3NlUmVzdWx0W2luZGV4XVtzb3VyY2UuaWQoKV0uZ2V0Q2VudGVyWCgpLCBzdGFydFk6IGNvc2VSZXN1bHRbaW5kZXhdW3NvdXJjZS5pZCgpXS5nZXRDZW50ZXJZKCksIGVuZFg6IGNvc2VSZXN1bHRbaW5kZXhdW3RhcmdldC5pZCgpXS5nZXRDZW50ZXJYKCksIGVuZFk6IGNvc2VSZXN1bHRbaW5kZXhdW3RhcmdldC5pZCgpXS5nZXRDZW50ZXJZKCkgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHN1YmdyYXBoLm5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgIHN1YmdyYXBocy5wdXNoKHN1YmdyYXBoKTtcbiAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHNFdmFsdWF0ZWQuYWRkKGluZGV4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdmFyIHNoaWZ0UmVzdWx0ID0gbGF5VXRpbC5wYWNrQ29tcG9uZW50cyhzdWJncmFwaHMsIG9wdGlvbnMucmFuZG9taXplKS5zaGlmdHM7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5xdWFsaXR5ID09IFwiZHJhZnRcIikge1xuICAgICAgICAgICAgICBzcGVjdHJhbFJlc3VsdC5mb3JFYWNoKGZ1bmN0aW9uIChyZXN1bHQsIGluZGV4KSB7XG4gICAgICAgICAgICAgICAgdmFyIG5ld1hDb29yZHMgPSByZXN1bHQueENvb3Jkcy5tYXAoZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB4ICsgc2hpZnRSZXN1bHRbaW5kZXhdLmR4O1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHZhciBuZXdZQ29vcmRzID0gcmVzdWx0LnlDb29yZHMubWFwKGZ1bmN0aW9uICh5KSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4geSArIHNoaWZ0UmVzdWx0W2luZGV4XS5keTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXN1bHQueENvb3JkcyA9IG5ld1hDb29yZHM7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnlDb29yZHMgPSBuZXdZQ29vcmRzO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZhciBfY291bnQgPSAwO1xuICAgICAgICAgICAgICBjb21wb25lbnRzRXZhbHVhdGVkLmZvckVhY2goZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoY29zZVJlc3VsdFtpbmRleF0pLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgIHZhciBub2RlUmVjdGFuZ2xlID0gY29zZVJlc3VsdFtpbmRleF1baXRlbV07XG4gICAgICAgICAgICAgICAgICBub2RlUmVjdGFuZ2xlLnNldENlbnRlcihub2RlUmVjdGFuZ2xlLmdldENlbnRlclgoKSArIHNoaWZ0UmVzdWx0W19jb3VudF0uZHgsIG5vZGVSZWN0YW5nbGUuZ2V0Q2VudGVyWSgpICsgc2hpZnRSZXN1bHRbX2NvdW50XS5keSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgX2NvdW50Kys7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBnZXQgZWFjaCBlbGVtZW50J3MgY2FsY3VsYXRlZCBwb3NpdGlvblxuICAgICAgdmFyIGdldFBvc2l0aW9ucyA9IGZ1bmN0aW9uIGdldFBvc2l0aW9ucyhlbGUsIGkpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMucXVhbGl0eSA9PSBcImRlZmF1bHRcIiB8fCBvcHRpb25zLnF1YWxpdHkgPT0gXCJwcm9vZlwiKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBlbGUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIGVsZSA9IGk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBwb3MgPSB2b2lkIDA7XG4gICAgICAgICAgdmFyIG5vZGUgPSB2b2lkIDA7XG4gICAgICAgICAgdmFyIHRoZUlkID0gZWxlLmRhdGEoJ2lkJyk7XG4gICAgICAgICAgY29zZVJlc3VsdC5mb3JFYWNoKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICh0aGVJZCBpbiByZXN1bHQpIHtcbiAgICAgICAgICAgICAgcG9zID0geyB4OiByZXN1bHRbdGhlSWRdLmdldFJlY3QoKS5nZXRDZW50ZXJYKCksIHk6IHJlc3VsdFt0aGVJZF0uZ2V0UmVjdCgpLmdldENlbnRlclkoKSB9O1xuICAgICAgICAgICAgICBub2RlID0gcmVzdWx0W3RoZUlkXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAob3B0aW9ucy5ub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHMpIHtcbiAgICAgICAgICAgIGlmIChub2RlLmxhYmVsV2lkdGgpIHtcbiAgICAgICAgICAgICAgaWYgKG5vZGUubGFiZWxQb3NIb3Jpem9udGFsID09IFwibGVmdFwiKSB7XG4gICAgICAgICAgICAgICAgcG9zLnggKz0gbm9kZS5sYWJlbFdpZHRoIC8gMjtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlLmxhYmVsUG9zSG9yaXpvbnRhbCA9PSBcInJpZ2h0XCIpIHtcbiAgICAgICAgICAgICAgICBwb3MueCAtPSBub2RlLmxhYmVsV2lkdGggLyAyO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobm9kZS5sYWJlbEhlaWdodCkge1xuICAgICAgICAgICAgICBpZiAobm9kZS5sYWJlbFBvc1ZlcnRpY2FsID09IFwidG9wXCIpIHtcbiAgICAgICAgICAgICAgICBwb3MueSArPSBub2RlLmxhYmVsSGVpZ2h0IC8gMjtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlLmxhYmVsUG9zVmVydGljYWwgPT0gXCJib3R0b21cIikge1xuICAgICAgICAgICAgICAgIHBvcy55IC09IG5vZGUubGFiZWxIZWlnaHQgLyAyO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwb3MgPT0gdW5kZWZpbmVkKSBwb3MgPSB7IHg6IGVsZS5wb3NpdGlvbihcInhcIiksIHk6IGVsZS5wb3NpdGlvbihcInlcIikgfTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogcG9zLngsXG4gICAgICAgICAgICB5OiBwb3MueVxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIF9wb3MgPSB2b2lkIDA7XG4gICAgICAgICAgc3BlY3RyYWxSZXN1bHQuZm9yRWFjaChmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgICAgICB2YXIgaW5kZXggPSByZXN1bHQubm9kZUluZGV4ZXMuZ2V0KGVsZS5pZCgpKTtcbiAgICAgICAgICAgIGlmIChpbmRleCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgX3BvcyA9IHsgeDogcmVzdWx0LnhDb29yZHNbaW5kZXhdLCB5OiByZXN1bHQueUNvb3Jkc1tpbmRleF0gfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoX3BvcyA9PSB1bmRlZmluZWQpIF9wb3MgPSB7IHg6IGVsZS5wb3NpdGlvbihcInhcIiksIHk6IGVsZS5wb3NpdGlvbihcInlcIikgfTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogX3Bvcy54LFxuICAgICAgICAgICAgeTogX3Bvcy55XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgLy8gcXVhbGl0eSA9IFwiZHJhZnRcIiBhbmQgcmFuZG9taXplID0gZmFsc2UgYXJlIGNvbnRyYWRpY3RpdmUgc28gaW4gdGhhdCBjYXNlIHBvc2l0aW9ucyBkb24ndCBjaGFuZ2VcbiAgICAgIGlmIChvcHRpb25zLnF1YWxpdHkgPT0gXCJkZWZhdWx0XCIgfHwgb3B0aW9ucy5xdWFsaXR5ID09IFwicHJvb2ZcIiB8fCBvcHRpb25zLnJhbmRvbWl6ZSkge1xuICAgICAgICAvLyB0cmFuc2ZlciBjYWxjdWxhdGVkIHBvc2l0aW9ucyB0byBub2RlcyAocG9zaXRpb25zIG9mIG9ubHkgc2ltcGxlIG5vZGVzIGFyZSBldmFsdWF0ZWQsIGNvbXBvdW5kcyBhcmUgcG9zaXRpb25lZCBhdXRvbWF0aWNhbGx5KVxuICAgICAgICB2YXIgcGFyZW50c1dpdGhvdXRDaGlsZHJlbiA9IGF1eC5jYWxjUGFyZW50c1dpdGhvdXRDaGlsZHJlbihjeSwgZWxlcyk7XG4gICAgICAgIHZhciBfaGlkZGVuRWxlcyA9IGVsZXMuZmlsdGVyKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgICByZXR1cm4gZWxlLmNzcygnZGlzcGxheScpID09ICdub25lJztcbiAgICAgICAgfSk7XG4gICAgICAgIG9wdGlvbnMuZWxlcyA9IGVsZXMubm90KF9oaWRkZW5FbGVzKTtcblxuICAgICAgICBlbGVzLm5vZGVzKCkubm90KFwiOnBhcmVudFwiKS5ub3QoX2hpZGRlbkVsZXMpLmxheW91dFBvc2l0aW9ucyhsYXlvdXQsIG9wdGlvbnMsIGdldFBvc2l0aW9ucyk7XG5cbiAgICAgICAgaWYgKHBhcmVudHNXaXRob3V0Q2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHBhcmVudHNXaXRob3V0Q2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgICAgICBlbGUucG9zaXRpb24oZ2V0UG9zaXRpb25zKGVsZSkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmxvZyhcIklmIHJhbmRvbWl6ZSBvcHRpb24gaXMgc2V0IHRvIGZhbHNlLCB0aGVuIHF1YWxpdHkgb3B0aW9uIG11c3QgYmUgJ2RlZmF1bHQnIG9yICdwcm9vZicuXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBMYXlvdXQ7XG59KCk7XG5cbm1vZHVsZS5leHBvcnRzID0gTGF5b3V0O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gNjU3OlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cblxuLyoqXG4gIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc3BlY3RyYWwgbGF5b3V0IHRoYXQgaXMgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIGZjb3NlIGxheW91dCBhbGdvcml0aG1cbiovXG5cbnZhciBhdXggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU0OCk7XG52YXIgTWF0cml4ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDApLmxheW91dEJhc2UuTWF0cml4O1xudmFyIFNWRCA9IF9fd2VicGFja19yZXF1aXJlX18oMTQwKS5sYXlvdXRCYXNlLlNWRDtcblxuLy8gbWFpbiBmdW5jdGlvbiB0aGF0IHNwZWN0cmFsIGxheW91dCBpcyBwcm9jZXNzZWRcbnZhciBzcGVjdHJhbExheW91dCA9IGZ1bmN0aW9uIHNwZWN0cmFsTGF5b3V0KG9wdGlvbnMpIHtcblxuICB2YXIgY3kgPSBvcHRpb25zLmN5O1xuICB2YXIgZWxlcyA9IG9wdGlvbnMuZWxlcztcbiAgdmFyIG5vZGVzID0gZWxlcy5ub2RlcygpO1xuICB2YXIgcGFyZW50Tm9kZXMgPSBlbGVzLm5vZGVzKFwiOnBhcmVudFwiKTtcblxuICB2YXIgZHVtbXlOb2RlcyA9IG5ldyBNYXAoKTsgLy8gbWFwIHRvIGtlZXAgZHVtbXkgbm9kZXMgYW5kIHRoZWlyIG5laWdoYm9yc1xuICB2YXIgbm9kZUluZGV4ZXMgPSBuZXcgTWFwKCk7IC8vIG1hcCB0byBrZWVwIGluZGV4ZXMgdG8gbm9kZXNcbiAgdmFyIHBhcmVudENoaWxkTWFwID0gbmV3IE1hcCgpOyAvLyBtYXBwaW5nIGJ0dy4gY29tcG91bmQgYW5kIGl0cyByZXByZXNlbnRhdGl2ZSBub2RlIFxuICB2YXIgYWxsTm9kZXNOZWlnaGJvcmhvb2QgPSBbXTsgLy8gYXJyYXkgdG8ga2VlcCBuZWlnaGJvcmhvb2Qgb2YgYWxsIG5vZGVzXG4gIHZhciB4Q29vcmRzID0gW107XG4gIHZhciB5Q29vcmRzID0gW107XG5cbiAgdmFyIHNhbXBsZXNDb2x1bW4gPSBbXTsgLy8gc2FtcGxlZCB2ZXJ0aWNlc1xuICB2YXIgbWluRGlzdGFuY2VzQ29sdW1uID0gW107XG4gIHZhciBDID0gW107IC8vIGNvbHVtbiBzYW1wbGluZyBtYXRyaXhcbiAgdmFyIFBISSA9IFtdOyAvLyBpbnRlcnNlY3Rpb24gb2YgY29sdW1uIGFuZCByb3cgc2FtcGxpbmcgbWF0cmljZXMgXG4gIHZhciBJTlYgPSBbXTsgLy8gaW52ZXJzZSBvZiBQSEkgXG5cbiAgdmFyIGZpcnN0U2FtcGxlID0gdm9pZCAwOyAvLyB0aGUgZmlyc3Qgc2FtcGxlZCBub2RlXG4gIHZhciBub2RlU2l6ZSA9IHZvaWQgMDtcblxuICB2YXIgaW5maW5pdHkgPSAxMDAwMDAwMDA7XG4gIHZhciBzbWFsbCA9IDAuMDAwMDAwMDAxO1xuXG4gIHZhciBwaVRvbCA9IG9wdGlvbnMucGlUb2w7XG4gIHZhciBzYW1wbGluZ1R5cGUgPSBvcHRpb25zLnNhbXBsaW5nVHlwZTsgLy8gZmFsc2UgZm9yIHJhbmRvbSwgdHJ1ZSBmb3IgZ3JlZWR5XG4gIHZhciBub2RlU2VwYXJhdGlvbiA9IG9wdGlvbnMubm9kZVNlcGFyYXRpb247XG4gIHZhciBzYW1wbGVTaXplID0gdm9pZCAwO1xuXG4gIC8qKioqIFNwZWN0cmFsLXByZXByb2Nlc3NpbmcgZnVuY3Rpb25zICoqKiovXG5cbiAgLyoqKiogU3BlY3RyYWwgbGF5b3V0IGZ1bmN0aW9ucyAqKioqL1xuXG4gIC8vIGRldGVybWluZSB3aGljaCBjb2x1bW5zIHRvIGJlIHNhbXBsZWRcbiAgdmFyIHJhbmRvbVNhbXBsZUNSID0gZnVuY3Rpb24gcmFuZG9tU2FtcGxlQ1IoKSB7XG4gICAgdmFyIHNhbXBsZSA9IDA7XG4gICAgdmFyIGNvdW50ID0gMDtcbiAgICB2YXIgZmxhZyA9IGZhbHNlO1xuXG4gICAgd2hpbGUgKGNvdW50IDwgc2FtcGxlU2l6ZSkge1xuICAgICAgc2FtcGxlID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogbm9kZVNpemUpO1xuXG4gICAgICBmbGFnID0gZmFsc2U7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgaWYgKHNhbXBsZXNDb2x1bW5baV0gPT0gc2FtcGxlKSB7XG4gICAgICAgICAgZmxhZyA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFmbGFnKSB7XG4gICAgICAgIHNhbXBsZXNDb2x1bW5bY291bnRdID0gc2FtcGxlO1xuICAgICAgICBjb3VudCsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8vIHRha2VzIHRoZSBpbmRleCBvZiB0aGUgbm9kZShwaXZvdCkgdG8gaW5pdGlhdGUgQkZTIGFzIGEgcGFyYW1ldGVyXG4gIHZhciBCRlMgPSBmdW5jdGlvbiBCRlMocGl2b3QsIGluZGV4LCBzYW1wbGluZ01ldGhvZCkge1xuICAgIHZhciBwYXRoID0gW107IC8vIHRoZSBmcm9udCBvZiB0aGUgcGF0aFxuICAgIHZhciBmcm9udCA9IDA7IC8vIHRoZSBiYWNrIG9mIHRoZSBwYXRoXG4gICAgdmFyIGJhY2sgPSAwO1xuICAgIHZhciBjdXJyZW50ID0gMDtcbiAgICB2YXIgdGVtcCA9IHZvaWQgMDtcbiAgICB2YXIgZGlzdGFuY2UgPSBbXTtcblxuICAgIHZhciBtYXhfZGlzdCA9IDA7IC8vIHRoZSBmdXJ0aGVzdCBub2RlIHRvIGJlIHJldHVybmVkXG4gICAgdmFyIG1heF9pbmQgPSAxO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlU2l6ZTsgaSsrKSB7XG4gICAgICBkaXN0YW5jZVtpXSA9IGluZmluaXR5O1xuICAgIH1cblxuICAgIHBhdGhbYmFja10gPSBwaXZvdDtcbiAgICBkaXN0YW5jZVtwaXZvdF0gPSAwO1xuXG4gICAgd2hpbGUgKGJhY2sgPj0gZnJvbnQpIHtcbiAgICAgIGN1cnJlbnQgPSBwYXRoW2Zyb250KytdO1xuICAgICAgdmFyIG5laWdoYm9ycyA9IGFsbE5vZGVzTmVpZ2hib3Job29kW2N1cnJlbnRdO1xuICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IG5laWdoYm9ycy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdGVtcCA9IG5vZGVJbmRleGVzLmdldChuZWlnaGJvcnNbX2ldKTtcbiAgICAgICAgaWYgKGRpc3RhbmNlW3RlbXBdID09IGluZmluaXR5KSB7XG4gICAgICAgICAgZGlzdGFuY2VbdGVtcF0gPSBkaXN0YW5jZVtjdXJyZW50XSArIDE7XG4gICAgICAgICAgcGF0aFsrK2JhY2tdID0gdGVtcDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgQ1tjdXJyZW50XVtpbmRleF0gPSBkaXN0YW5jZVtjdXJyZW50XSAqIG5vZGVTZXBhcmF0aW9uO1xuICAgIH1cblxuICAgIGlmIChzYW1wbGluZ01ldGhvZCkge1xuICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgbm9kZVNpemU7IF9pMisrKSB7XG4gICAgICAgIGlmIChDW19pMl1baW5kZXhdIDwgbWluRGlzdGFuY2VzQ29sdW1uW19pMl0pIG1pbkRpc3RhbmNlc0NvbHVtbltfaTJdID0gQ1tfaTJdW2luZGV4XTtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgX2kzID0gMDsgX2kzIDwgbm9kZVNpemU7IF9pMysrKSB7XG4gICAgICAgIGlmIChtaW5EaXN0YW5jZXNDb2x1bW5bX2kzXSA+IG1heF9kaXN0KSB7XG4gICAgICAgICAgbWF4X2Rpc3QgPSBtaW5EaXN0YW5jZXNDb2x1bW5bX2kzXTtcbiAgICAgICAgICBtYXhfaW5kID0gX2kzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYXhfaW5kO1xuICB9O1xuXG4gIC8vIGFwcGx5IEJGUyB0byBhbGwgbm9kZXMgb3Igc2VsZWN0ZWQgc2FtcGxlc1xuICB2YXIgYWxsQkZTID0gZnVuY3Rpb24gYWxsQkZTKHNhbXBsaW5nTWV0aG9kKSB7XG5cbiAgICB2YXIgc2FtcGxlID0gdm9pZCAwO1xuXG4gICAgaWYgKCFzYW1wbGluZ01ldGhvZCkge1xuICAgICAgcmFuZG9tU2FtcGxlQ1IoKTtcblxuICAgICAgLy8gY2FsbCBCRlNcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2FtcGxlU2l6ZTsgaSsrKSB7XG4gICAgICAgIEJGUyhzYW1wbGVzQ29sdW1uW2ldLCBpLCBzYW1wbGluZ01ldGhvZCwgZmFsc2UpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzYW1wbGUgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBub2RlU2l6ZSk7XG4gICAgICBmaXJzdFNhbXBsZSA9IHNhbXBsZTtcblxuICAgICAgZm9yICh2YXIgX2k0ID0gMDsgX2k0IDwgbm9kZVNpemU7IF9pNCsrKSB7XG4gICAgICAgIG1pbkRpc3RhbmNlc0NvbHVtbltfaTRdID0gaW5maW5pdHk7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIF9pNSA9IDA7IF9pNSA8IHNhbXBsZVNpemU7IF9pNSsrKSB7XG4gICAgICAgIHNhbXBsZXNDb2x1bW5bX2k1XSA9IHNhbXBsZTtcbiAgICAgICAgc2FtcGxlID0gQkZTKHNhbXBsZSwgX2k1LCBzYW1wbGluZ01ldGhvZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZm9ybSB0aGUgc3F1YXJlZCBkaXN0YW5jZXMgZm9yIENcbiAgICBmb3IgKHZhciBfaTYgPSAwOyBfaTYgPCBub2RlU2l6ZTsgX2k2KyspIHtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgc2FtcGxlU2l6ZTsgaisrKSB7XG4gICAgICAgIENbX2k2XVtqXSAqPSBDW19pNl1bal07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZm9ybSBQSElcbiAgICBmb3IgKHZhciBfaTcgPSAwOyBfaTcgPCBzYW1wbGVTaXplOyBfaTcrKykge1xuICAgICAgUEhJW19pN10gPSBbXTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBfaTggPSAwOyBfaTggPCBzYW1wbGVTaXplOyBfaTgrKykge1xuICAgICAgZm9yICh2YXIgX2ogPSAwOyBfaiA8IHNhbXBsZVNpemU7IF9qKyspIHtcbiAgICAgICAgUEhJW19pOF1bX2pdID0gQ1tzYW1wbGVzQ29sdW1uW19qXV1bX2k4XTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLy8gcGVyZm9ybSB0aGUgU1ZEIGFsZ29yaXRobSBhbmQgYXBwbHkgYSByZWd1bGFyaXphdGlvbiBzdGVwXG4gIHZhciBzYW1wbGUgPSBmdW5jdGlvbiBzYW1wbGUoKSB7XG5cbiAgICB2YXIgU1ZEUmVzdWx0ID0gU1ZELnN2ZChQSEkpO1xuXG4gICAgdmFyIGFfcSA9IFNWRFJlc3VsdC5TO1xuICAgIHZhciBhX3UgPSBTVkRSZXN1bHQuVTtcbiAgICB2YXIgYV92ID0gU1ZEUmVzdWx0LlY7XG5cbiAgICB2YXIgbWF4X3MgPSBhX3FbMF0gKiBhX3FbMF0gKiBhX3FbMF07XG5cbiAgICB2YXIgYV9TaWcgPSBbXTtcblxuICAgIC8vICByZWd1bGFyaXphdGlvblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2FtcGxlU2l6ZTsgaSsrKSB7XG4gICAgICBhX1NpZ1tpXSA9IFtdO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzYW1wbGVTaXplOyBqKyspIHtcbiAgICAgICAgYV9TaWdbaV1bal0gPSAwO1xuICAgICAgICBpZiAoaSA9PSBqKSB7XG4gICAgICAgICAgYV9TaWdbaV1bal0gPSBhX3FbaV0gLyAoYV9xW2ldICogYV9xW2ldICsgbWF4X3MgLyAoYV9xW2ldICogYV9xW2ldKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBJTlYgPSBNYXRyaXgubXVsdE1hdChNYXRyaXgubXVsdE1hdChhX3YsIGFfU2lnKSwgTWF0cml4LnRyYW5zcG9zZShhX3UpKTtcbiAgfTtcblxuICAvLyBjYWxjdWxhdGUgZmluYWwgY29vcmRpbmF0ZXMgXG4gIHZhciBwb3dlckl0ZXJhdGlvbiA9IGZ1bmN0aW9uIHBvd2VySXRlcmF0aW9uKCkge1xuICAgIC8vIHR3byBsYXJnZXN0IGVpZ2VudmFsdWVzXG4gICAgdmFyIHRoZXRhMSA9IHZvaWQgMDtcbiAgICB2YXIgdGhldGEyID0gdm9pZCAwO1xuXG4gICAgLy8gaW5pdGlhbCBndWVzc2VzIGZvciBlaWdlbnZlY3RvcnNcbiAgICB2YXIgWTEgPSBbXTtcbiAgICB2YXIgWTIgPSBbXTtcblxuICAgIHZhciBWMSA9IFtdO1xuICAgIHZhciBWMiA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlU2l6ZTsgaSsrKSB7XG4gICAgICBZMVtpXSA9IE1hdGgucmFuZG9tKCk7XG4gICAgICBZMltpXSA9IE1hdGgucmFuZG9tKCk7XG4gICAgfVxuXG4gICAgWTEgPSBNYXRyaXgubm9ybWFsaXplKFkxKTtcbiAgICBZMiA9IE1hdHJpeC5ub3JtYWxpemUoWTIpO1xuXG4gICAgdmFyIGNvdW50ID0gMDtcbiAgICAvLyB0byBrZWVwIHRyYWNrIG9mIHRoZSBpbXByb3ZlbWVudCByYXRpbyBpbiBwb3dlciBpdGVyYXRpb25cbiAgICB2YXIgY3VycmVudCA9IHNtYWxsO1xuICAgIHZhciBwcmV2aW91cyA9IHNtYWxsO1xuXG4gICAgdmFyIHRlbXAgPSB2b2lkIDA7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY291bnQrKztcblxuICAgICAgZm9yICh2YXIgX2k5ID0gMDsgX2k5IDwgbm9kZVNpemU7IF9pOSsrKSB7XG4gICAgICAgIFYxW19pOV0gPSBZMVtfaTldO1xuICAgICAgfVxuXG4gICAgICBZMSA9IE1hdHJpeC5tdWx0R2FtbWEoTWF0cml4Lm11bHRMKE1hdHJpeC5tdWx0R2FtbWEoVjEpLCBDLCBJTlYpKTtcbiAgICAgIHRoZXRhMSA9IE1hdHJpeC5kb3RQcm9kdWN0KFYxLCBZMSk7XG4gICAgICBZMSA9IE1hdHJpeC5ub3JtYWxpemUoWTEpO1xuXG4gICAgICBjdXJyZW50ID0gTWF0cml4LmRvdFByb2R1Y3QoVjEsIFkxKTtcblxuICAgICAgdGVtcCA9IE1hdGguYWJzKGN1cnJlbnQgLyBwcmV2aW91cyk7XG5cbiAgICAgIGlmICh0ZW1wIDw9IDEgKyBwaVRvbCAmJiB0ZW1wID49IDEpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHByZXZpb3VzID0gY3VycmVudDtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBfaTEwID0gMDsgX2kxMCA8IG5vZGVTaXplOyBfaTEwKyspIHtcbiAgICAgIFYxW19pMTBdID0gWTFbX2kxMF07XG4gICAgfVxuXG4gICAgY291bnQgPSAwO1xuICAgIHByZXZpb3VzID0gc21hbGw7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvdW50Kys7XG5cbiAgICAgIGZvciAodmFyIF9pMTEgPSAwOyBfaTExIDwgbm9kZVNpemU7IF9pMTErKykge1xuICAgICAgICBWMltfaTExXSA9IFkyW19pMTFdO1xuICAgICAgfVxuXG4gICAgICBWMiA9IE1hdHJpeC5taW51c09wKFYyLCBNYXRyaXgubXVsdENvbnMoVjEsIE1hdHJpeC5kb3RQcm9kdWN0KFYxLCBWMikpKTtcbiAgICAgIFkyID0gTWF0cml4Lm11bHRHYW1tYShNYXRyaXgubXVsdEwoTWF0cml4Lm11bHRHYW1tYShWMiksIEMsIElOVikpO1xuICAgICAgdGhldGEyID0gTWF0cml4LmRvdFByb2R1Y3QoVjIsIFkyKTtcbiAgICAgIFkyID0gTWF0cml4Lm5vcm1hbGl6ZShZMik7XG5cbiAgICAgIGN1cnJlbnQgPSBNYXRyaXguZG90UHJvZHVjdChWMiwgWTIpO1xuXG4gICAgICB0ZW1wID0gTWF0aC5hYnMoY3VycmVudCAvIHByZXZpb3VzKTtcblxuICAgICAgaWYgKHRlbXAgPD0gMSArIHBpVG9sICYmIHRlbXAgPj0gMSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgcHJldmlvdXMgPSBjdXJyZW50O1xuICAgIH1cblxuICAgIGZvciAodmFyIF9pMTIgPSAwOyBfaTEyIDwgbm9kZVNpemU7IF9pMTIrKykge1xuICAgICAgVjJbX2kxMl0gPSBZMltfaTEyXTtcbiAgICB9XG5cbiAgICAvLyB0aGV0YTEgbm93IGNvbnRhaW5zIGRvbWluYW50IGVpZ2VudmFsdWVcbiAgICAvLyB0aGV0YTIgbm93IGNvbnRhaW5zIHRoZSBzZWNvbmQtbGFyZ2VzdCBlaWdlbnZhbHVlXG4gICAgLy8gVjEgbm93IGNvbnRhaW5zIHRoZXRhMSdzIGVpZ2VudmVjdG9yXG4gICAgLy8gVjIgbm93IGNvbnRhaW5zIHRoZXRhMidzIGVpZ2VudmVjdG9yXG5cbiAgICAvL3BvcHVsYXRlIHRoZSB0d28gdmVjdG9yc1xuICAgIHhDb29yZHMgPSBNYXRyaXgubXVsdENvbnMoVjEsIE1hdGguc3FydChNYXRoLmFicyh0aGV0YTEpKSk7XG4gICAgeUNvb3JkcyA9IE1hdHJpeC5tdWx0Q29ucyhWMiwgTWF0aC5zcXJ0KE1hdGguYWJzKHRoZXRhMikpKTtcbiAgfTtcblxuICAvKioqKiBQcmVwYXJhdGlvbiBmb3Igc3BlY3RyYWwgbGF5b3V0IChQcmVwcm9jZXNzaW5nKSAqKioqL1xuXG4gIC8vIGNvbm5lY3QgZGlzY29ubmVjdGVkIGNvbXBvbmVudHMgKGZpcnN0IHRvcCBsZXZlbCwgdGhlbiBpbnNpZGUgb2YgZWFjaCBjb21wb3VuZCBub2RlKVxuICBhdXguY29ubmVjdENvbXBvbmVudHMoY3ksIGVsZXMsIGF1eC5nZXRUb3BNb3N0Tm9kZXMobm9kZXMpLCBkdW1teU5vZGVzKTtcblxuICBwYXJlbnROb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHtcbiAgICBhdXguY29ubmVjdENvbXBvbmVudHMoY3ksIGVsZXMsIGF1eC5nZXRUb3BNb3N0Tm9kZXMoZWxlLmRlc2NlbmRhbnRzKCkuaW50ZXJzZWN0aW9uKGVsZXMpKSwgZHVtbXlOb2Rlcyk7XG4gIH0pO1xuXG4gIC8vIGFzc2lnbiBpbmRleGVzIHRvIG5vZGVzIChmaXJzdCByZWFsLCB0aGVuIGR1bW15IG5vZGVzKVxuICB2YXIgaW5kZXggPSAwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKCFub2Rlc1tpXS5pc1BhcmVudCgpKSB7XG4gICAgICBub2RlSW5kZXhlcy5zZXQobm9kZXNbaV0uaWQoKSwgaW5kZXgrKyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlO1xuICB2YXIgX2RpZEl0ZXJhdG9yRXJyb3IgPSBmYWxzZTtcbiAgdmFyIF9pdGVyYXRvckVycm9yID0gdW5kZWZpbmVkO1xuXG4gIHRyeSB7XG4gICAgZm9yICh2YXIgX2l0ZXJhdG9yID0gZHVtbXlOb2Rlcy5rZXlzKClbU3ltYm9sLml0ZXJhdG9yXSgpLCBfc3RlcDsgIShfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gKF9zdGVwID0gX2l0ZXJhdG9yLm5leHQoKSkuZG9uZSk7IF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlKSB7XG4gICAgICB2YXIga2V5ID0gX3N0ZXAudmFsdWU7XG5cbiAgICAgIG5vZGVJbmRleGVzLnNldChrZXksIGluZGV4KyspO1xuICAgIH1cblxuICAgIC8vIGluc3RhbnRpYXRlIHRoZSBuZWlnaGJvcmhvb2QgbWF0cml4XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIF9kaWRJdGVyYXRvckVycm9yID0gdHJ1ZTtcbiAgICBfaXRlcmF0b3JFcnJvciA9IGVycjtcbiAgfSBmaW5hbGx5IHtcbiAgICB0cnkge1xuICAgICAgaWYgKCFfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uICYmIF9pdGVyYXRvci5yZXR1cm4pIHtcbiAgICAgICAgX2l0ZXJhdG9yLnJldHVybigpO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoX2RpZEl0ZXJhdG9yRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3I7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yICh2YXIgX2kxMyA9IDA7IF9pMTMgPCBub2RlSW5kZXhlcy5zaXplOyBfaTEzKyspIHtcbiAgICBhbGxOb2Rlc05laWdoYm9yaG9vZFtfaTEzXSA9IFtdO1xuICB9XG5cbiAgLy8gZm9ybSBhIHBhcmVudC1jaGlsZCBtYXAgdG8ga2VlcCByZXByZXNlbnRhdGl2ZSBub2RlIG9mIGVhY2ggY29tcG91bmQgbm9kZSAgXG4gIHBhcmVudE5vZGVzLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgIHZhciBjaGlsZHJlbiA9IGVsZS5jaGlsZHJlbigpLmludGVyc2VjdGlvbihlbGVzKTtcblxuICAgIC8vICAgICAgbGV0IHJhbmRvbSA9IDA7XG4gICAgd2hpbGUgKGNoaWxkcmVuLm5vZGVzKFwiOmNoaWxkbGVzc1wiKS5sZW5ndGggPT0gMCkge1xuICAgICAgLy8gICAgICAgIHJhbmRvbSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGNoaWxkcmVuLm5vZGVzKCkubGVuZ3RoKTsgLy8gaWYgYWxsIGNoaWxkcmVuIGFyZSBjb21wb3VuZCB0aGVuIHByb2NlZWQgcmFuZG9tbHlcbiAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4ubm9kZXMoKVswXS5jaGlsZHJlbigpLmludGVyc2VjdGlvbihlbGVzKTtcbiAgICB9XG4gICAgLy8gIHNlbGVjdCB0aGUgcmVwcmVzZW50YXRpdmUgbm9kZSAtIHdlIGNhbiBhcHBseSBkaWZmZXJlbnQgbWV0aG9kcyBoZXJlXG4gICAgLy8gICAgICByYW5kb20gPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjaGlsZHJlbi5ub2RlcyhcIjpjaGlsZGxlc3NcIikubGVuZ3RoKTtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciBtaW4gPSBjaGlsZHJlbi5ub2RlcyhcIjpjaGlsZGxlc3NcIilbMF0uY29ubmVjdGVkRWRnZXMoKS5sZW5ndGg7XG4gICAgY2hpbGRyZW4ubm9kZXMoXCI6Y2hpbGRsZXNzXCIpLmZvckVhY2goZnVuY3Rpb24gKGVsZTIsIGkpIHtcbiAgICAgIGlmIChlbGUyLmNvbm5lY3RlZEVkZ2VzKCkubGVuZ3RoIDwgbWluKSB7XG4gICAgICAgIG1pbiA9IGVsZTIuY29ubmVjdGVkRWRnZXMoKS5sZW5ndGg7XG4gICAgICAgIGluZGV4ID0gaTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBwYXJlbnRDaGlsZE1hcC5zZXQoZWxlLmlkKCksIGNoaWxkcmVuLm5vZGVzKFwiOmNoaWxkbGVzc1wiKVtpbmRleF0uaWQoKSk7XG4gIH0pO1xuXG4gIC8vIGFkZCBuZWlnaGJvcmhvb2QgcmVsYXRpb25zIChmaXJzdCByZWFsLCB0aGVuIGR1bW15IG5vZGVzKVxuICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHtcbiAgICB2YXIgZWxlSW5kZXggPSB2b2lkIDA7XG5cbiAgICBpZiAoZWxlLmlzUGFyZW50KCkpIGVsZUluZGV4ID0gbm9kZUluZGV4ZXMuZ2V0KHBhcmVudENoaWxkTWFwLmdldChlbGUuaWQoKSkpO2Vsc2UgZWxlSW5kZXggPSBub2RlSW5kZXhlcy5nZXQoZWxlLmlkKCkpO1xuXG4gICAgZWxlLm5laWdoYm9yaG9vZCgpLm5vZGVzKCkuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgaWYgKGVsZXMuaW50ZXJzZWN0aW9uKGVsZS5lZGdlc1dpdGgobm9kZSkpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKG5vZGUuaXNQYXJlbnQoKSkgYWxsTm9kZXNOZWlnaGJvcmhvb2RbZWxlSW5kZXhdLnB1c2gocGFyZW50Q2hpbGRNYXAuZ2V0KG5vZGUuaWQoKSkpO2Vsc2UgYWxsTm9kZXNOZWlnaGJvcmhvb2RbZWxlSW5kZXhdLnB1c2gobm9kZS5pZCgpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoX2tleSkge1xuICAgIHZhciBlbGVJbmRleCA9IG5vZGVJbmRleGVzLmdldChfa2V5KTtcbiAgICB2YXIgZGlzY29ubmVjdGVkSWQgPSB2b2lkIDA7XG4gICAgZHVtbXlOb2Rlcy5nZXQoX2tleSkuZm9yRWFjaChmdW5jdGlvbiAoaWQpIHtcbiAgICAgIGlmIChjeS5nZXRFbGVtZW50QnlJZChpZCkuaXNQYXJlbnQoKSkgZGlzY29ubmVjdGVkSWQgPSBwYXJlbnRDaGlsZE1hcC5nZXQoaWQpO2Vsc2UgZGlzY29ubmVjdGVkSWQgPSBpZDtcblxuICAgICAgYWxsTm9kZXNOZWlnaGJvcmhvb2RbZWxlSW5kZXhdLnB1c2goZGlzY29ubmVjdGVkSWQpO1xuICAgICAgYWxsTm9kZXNOZWlnaGJvcmhvb2Rbbm9kZUluZGV4ZXMuZ2V0KGRpc2Nvbm5lY3RlZElkKV0ucHVzaChfa2V5KTtcbiAgICB9KTtcbiAgfTtcblxuICB2YXIgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjIgPSB0cnVlO1xuICB2YXIgX2RpZEl0ZXJhdG9yRXJyb3IyID0gZmFsc2U7XG4gIHZhciBfaXRlcmF0b3JFcnJvcjIgPSB1bmRlZmluZWQ7XG5cbiAgdHJ5IHtcbiAgICBmb3IgKHZhciBfaXRlcmF0b3IyID0gZHVtbXlOb2Rlcy5rZXlzKClbU3ltYm9sLml0ZXJhdG9yXSgpLCBfc3RlcDI7ICEoX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjIgPSAoX3N0ZXAyID0gX2l0ZXJhdG9yMi5uZXh0KCkpLmRvbmUpOyBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMiA9IHRydWUpIHtcbiAgICAgIHZhciBfa2V5ID0gX3N0ZXAyLnZhbHVlO1xuXG4gICAgICBfbG9vcChfa2V5KTtcbiAgICB9XG5cbiAgICAvLyBub2RlU2l6ZSBub3cgb25seSBjb25zaWRlcnMgdGhlIHNpemUgb2YgdHJhbnNmb3JtZWQgZ3JhcGhcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgX2RpZEl0ZXJhdG9yRXJyb3IyID0gdHJ1ZTtcbiAgICBfaXRlcmF0b3JFcnJvcjIgPSBlcnI7XG4gIH0gZmluYWxseSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjIgJiYgX2l0ZXJhdG9yMi5yZXR1cm4pIHtcbiAgICAgICAgX2l0ZXJhdG9yMi5yZXR1cm4oKTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKF9kaWRJdGVyYXRvckVycm9yMikge1xuICAgICAgICB0aHJvdyBfaXRlcmF0b3JFcnJvcjI7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbm9kZVNpemUgPSBub2RlSW5kZXhlcy5zaXplO1xuXG4gIHZhciBzcGVjdHJhbFJlc3VsdCA9IHZvaWQgMDtcblxuICAvLyBJZiBudW1iZXIgb2Ygbm9kZXMgaW4gdHJhbnNmb3JtZWQgZ3JhcGggaXMgMSBvciAyLCBlaXRoZXIgU1ZEIG9yIHBvd2VySXRlcmF0aW9uIGNhdXNlcyBwcm9ibGVtXG4gIC8vIFNvIHNraXAgc3BlY3RyYWwgYW5kIGxheW91dCB0aGUgZ3JhcGggd2l0aCBjb3NlXG4gIGlmIChub2RlU2l6ZSA+IDIpIHtcbiAgICAvLyBpZiAjIG9mIG5vZGVzIGluIHRyYW5zZm9ybWVkIGdyYXBoIGlzIHNtYWxsZXIgdGhhbiBzYW1wbGUgc2l6ZSxcbiAgICAvLyB0aGVuIHVzZSAjIG9mIG5vZGVzIGFzIHNhbXBsZSBzaXplXG4gICAgc2FtcGxlU2l6ZSA9IG5vZGVTaXplIDwgb3B0aW9ucy5zYW1wbGVTaXplID8gbm9kZVNpemUgOiBvcHRpb25zLnNhbXBsZVNpemU7XG5cbiAgICAvLyBpbnN0YW50aWF0ZXMgdGhlIHBhcnRpYWwgbWF0cmljZXMgdGhhdCB3aWxsIGJlIHVzZWQgaW4gc3BlY3RyYWwgbGF5b3V0XG4gICAgZm9yICh2YXIgX2kxNCA9IDA7IF9pMTQgPCBub2RlU2l6ZTsgX2kxNCsrKSB7XG4gICAgICBDW19pMTRdID0gW107XG4gICAgfVxuICAgIGZvciAodmFyIF9pMTUgPSAwOyBfaTE1IDwgc2FtcGxlU2l6ZTsgX2kxNSsrKSB7XG4gICAgICBJTlZbX2kxNV0gPSBbXTtcbiAgICB9XG5cbiAgICAvKioqKiBBcHBseSBzcGVjdHJhbCBsYXlvdXQgKioqKi9cblxuICAgIGlmIChvcHRpb25zLnF1YWxpdHkgPT0gXCJkcmFmdFwiIHx8IG9wdGlvbnMuc3RlcCA9PSBcImFsbFwiKSB7XG4gICAgICBhbGxCRlMoc2FtcGxpbmdUeXBlKTtcbiAgICAgIHNhbXBsZSgpO1xuICAgICAgcG93ZXJJdGVyYXRpb24oKTtcblxuICAgICAgc3BlY3RyYWxSZXN1bHQgPSB7IG5vZGVJbmRleGVzOiBub2RlSW5kZXhlcywgeENvb3JkczogeENvb3JkcywgeUNvb3JkczogeUNvb3JkcyB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBub2RlSW5kZXhlcy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICAgIHhDb29yZHMucHVzaChjeS5nZXRFbGVtZW50QnlJZChrZXkpLnBvc2l0aW9uKFwieFwiKSk7XG4gICAgICAgIHlDb29yZHMucHVzaChjeS5nZXRFbGVtZW50QnlJZChrZXkpLnBvc2l0aW9uKFwieVwiKSk7XG4gICAgICB9KTtcbiAgICAgIHNwZWN0cmFsUmVzdWx0ID0geyBub2RlSW5kZXhlczogbm9kZUluZGV4ZXMsIHhDb29yZHM6IHhDb29yZHMsIHlDb29yZHM6IHlDb29yZHMgfTtcbiAgICB9XG4gICAgcmV0dXJuIHNwZWN0cmFsUmVzdWx0O1xuICB9IGVsc2Uge1xuICAgIHZhciBpdGVyYXRvciA9IG5vZGVJbmRleGVzLmtleXMoKTtcbiAgICB2YXIgZmlyc3ROb2RlID0gY3kuZ2V0RWxlbWVudEJ5SWQoaXRlcmF0b3IubmV4dCgpLnZhbHVlKTtcbiAgICB2YXIgZmlyc3ROb2RlUG9zID0gZmlyc3ROb2RlLnBvc2l0aW9uKCk7XG4gICAgdmFyIGZpcnN0Tm9kZVdpZHRoID0gZmlyc3ROb2RlLm91dGVyV2lkdGgoKTtcbiAgICB4Q29vcmRzLnB1c2goZmlyc3ROb2RlUG9zLngpO1xuICAgIHlDb29yZHMucHVzaChmaXJzdE5vZGVQb3MueSk7XG4gICAgaWYgKG5vZGVTaXplID09IDIpIHtcbiAgICAgIHZhciBzZWNvbmROb2RlID0gY3kuZ2V0RWxlbWVudEJ5SWQoaXRlcmF0b3IubmV4dCgpLnZhbHVlKTtcbiAgICAgIHZhciBzZWNvbmROb2RlV2lkdGggPSBzZWNvbmROb2RlLm91dGVyV2lkdGgoKTtcbiAgICAgIHhDb29yZHMucHVzaChmaXJzdE5vZGVQb3MueCArIGZpcnN0Tm9kZVdpZHRoIC8gMiArIHNlY29uZE5vZGVXaWR0aCAvIDIgKyBvcHRpb25zLmlkZWFsRWRnZUxlbmd0aCk7XG4gICAgICB5Q29vcmRzLnB1c2goZmlyc3ROb2RlUG9zLnkpO1xuICAgIH1cblxuICAgIHNwZWN0cmFsUmVzdWx0ID0geyBub2RlSW5kZXhlczogbm9kZUluZGV4ZXMsIHhDb29yZHM6IHhDb29yZHMsIHlDb29yZHM6IHlDb29yZHMgfTtcbiAgICByZXR1cm4gc3BlY3RyYWxSZXN1bHQ7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0geyBzcGVjdHJhbExheW91dDogc3BlY3RyYWxMYXlvdXQgfTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDU3OTpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG5cbnZhciBpbXBsID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMTIpO1xuXG4vLyByZWdpc3RlcnMgdGhlIGV4dGVuc2lvbiBvbiBhIGN5dG9zY2FwZSBsaWIgcmVmXG52YXIgcmVnaXN0ZXIgPSBmdW5jdGlvbiByZWdpc3RlcihjeXRvc2NhcGUpIHtcbiAgaWYgKCFjeXRvc2NhcGUpIHtcbiAgICByZXR1cm47XG4gIH0gLy8gY2FuJ3QgcmVnaXN0ZXIgaWYgY3l0b3NjYXBlIHVuc3BlY2lmaWVkXG5cbiAgY3l0b3NjYXBlKCdsYXlvdXQnLCAnZmNvc2UnLCBpbXBsKTsgLy8gcmVnaXN0ZXIgd2l0aCBjeXRvc2NhcGUuanNcbn07XG5cbmlmICh0eXBlb2YgY3l0b3NjYXBlICE9PSAndW5kZWZpbmVkJykge1xuICAvLyBleHBvc2UgdG8gZ2xvYmFsIGN5dG9zY2FwZSAoaS5lLiB3aW5kb3cuY3l0b3NjYXBlKVxuICByZWdpc3RlcihjeXRvc2NhcGUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlZ2lzdGVyO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gMTQwOlxuLyoqKi8gKChtb2R1bGUpID0+IHtcblxubW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX18xNDBfXztcblxuLyoqKi8gfSlcblxuLyoqKioqKi8gXHR9KTtcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuLyoqKioqKi8gXHRcbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi8gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuLyoqKioqKi8gXHRcdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuLyoqKioqKi8gXHRcdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuLyoqKioqKi8gXHRcdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovIFx0XG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqLyBcdFxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIFx0XG4vKioqKioqLyBcdC8vIHN0YXJ0dXBcbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdC8vIFRoaXMgZW50cnkgbW9kdWxlIGlzIHJlZmVyZW5jZWQgYnkgb3RoZXIgbW9kdWxlcyBzbyBpdCBjYW4ndCBiZSBpbmxpbmVkXG4vKioqKioqLyBcdHZhciBfX3dlYnBhY2tfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NzkpO1xuLyoqKioqKi8gXHRcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19leHBvcnRzX187XG4vKioqKioqLyB9KSgpXG47XG59KTsiLCJpbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuXG5jb25zdCB7IHN0cmluZywgYXJyYXksIG9iamVjdCwgbnVtYmVyLCBib29sLCBvbmVPZlR5cGUsIGFueSwgZnVuYyB9ID0gUHJvcFR5cGVzO1xuXG5leHBvcnQgY29uc3QgdHlwZXMgPSB7XG4gIC8qKlxuICAgKiBUaGUgYGlkYCBIVE1MIGF0dHJpYnV0ZSBvZiB0aGUgY29tcG9uZW50LlxuICAgKiAqL1xuICBpZDogc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBUaGUgYGNsYXNzYCBIVE1MIGF0dHJpYnV0ZSBvZiB0aGUgY29tcG9uZW50LiAgVXNlIHRoaXMgdG8gc2V0IHRoZSBkaW1lbnNpb25zIG9mXG4gICAqIHRoZSBncmFwaCB2aXN1YWxpc2F0aW9uIHZpYSBhIHN0eWxlIGJsb2NrIGluIHlvdXIgQ1NTIGZpbGUuXG4gICAqL1xuICBjbGFzc05hbWU6IHN0cmluZyxcblxuICAvKipcbiAgICogVGhlIGBzdHlsZWAgSFRNTCBhdHRyaWJ1dGUgb2YgdGhlIGNvbXBvbmVudC4gIFVzZSB0aGlzIHRvIHNldCB0aGUgZGltZW5zaW9ucyBvZlxuICAgKiB0aGUgZ3JhcGggdmlzdWFsaXNhdGlvbiBpZiB5b3UgZG8gbm90IHVzZSBzZXBhcmF0ZSBDU1MgZmlsZXMuXG4gICAqL1xuICBzdHlsZTogb25lT2ZUeXBlKFtzdHJpbmcsIG9iamVjdF0pLFxuXG4gIC8qKlxuICAgKiBUaGUgZmxhdCBsaXN0IG9mIEN5dG9zY2FwZSBlbGVtZW50cyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgZ3JhcGgsIGVhY2ggcmVwcmVzZW50ZWRcbiAgICogYXMgbm9uLXN0cmluZ2lmaWVkIEpTT04uICBFLmcuOlxuICAgKlxuICAgKiBgYGBcbiAgICogZWxlbWVudHM6IFtcbiAgICogICB7IGRhdGE6IHsgaWQ6ICdvbmUnLCBsYWJlbDogJ05vZGUgMScgfSwgcG9zaXRpb246IHsgeDogMCwgeTogMCB9IH0sXG4gICAqICAgeyBkYXRhOiB7IGlkOiAndHdvJywgbGFiZWw6ICdOb2RlIDInIH0sIHBvc2l0aW9uOiB7IHg6IDEwMCwgeTogMCB9IH0sXG4gICAqICAgeyBkYXRhOiB7IHNvdXJjZTogJ29uZScsIHRhcmdldDogJ3R3bycsIGxhYmVsOiAnRWRnZSBmcm9tIE5vZGUxIHRvIE5vZGUyJyB9IH1cbiAgICogXVxuICAgKiBgYGBcbiAgICpcbiAgICogU2VlIGh0dHA6Ly9qcy5jeXRvc2NhcGUub3JnLyNub3RhdGlvbi9lbGVtZW50cy1qc29uXG4gICAqICovXG4gIGVsZW1lbnRzOiBvbmVPZlR5cGUoW2FycmF5LCBhbnldKSxcblxuICAvKipcbiAgICogVGhlIEN5dG9zY2FwZSBzdHlsZXNoZWV0IGFzIG5vbi1zdHJpbmdpZmllZCBKU09OLiAgRS5nLjpcbiAgICpcbiAgICogYGBgXG4gICAqIHN0eWxlc2hlZXQ6IFtcbiAgICogICB7XG4gICAqICAgICAgc2VsZWN0b3I6ICdub2RlJyxcbiAgICogICAgICBzdHlsZToge1xuICAgKiAgICAgICAgJ3dpZHRoJzogMzAsXG4gICAqICAgICAgICAnaGVpZ2h0JzogMzAsXG4gICAqICAgICAgICAnc2hhcGUnOiAncmVjdGFuZ2xlJ1xuICAgKiAgICAgIH1cbiAgICogICB9XG4gICAqIF1cbiAgICogYGBgXG4gICAqXG4gICAqIFNlZSBodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jc3R5bGVcbiAgICovXG4gIHN0eWxlc2hlZXQ6IG9uZU9mVHlwZShbYXJyYXksIGFueV0pLFxuXG4gIC8qKlxuICAgKiBVc2UgYSBsYXlvdXQgdG8gYXV0b21hdGljYWxseSBwb3NpdGlvbiB0aGUgbm9kZXMgaW4gdGhlIGdyYXBoLiAgRS5nLlxuICAgKlxuICAgKiBgYGBcbiAgICogbGF5b3V0OiB7IG5hbWU6ICdyYW5kb20nIH1cbiAgICogYGBgXG4gICAqXG4gICAqIE4uYi4gdG8gdXNlIGFuIGV4dGVybmFsIGxheW91dCBleHRlbnNpb24sIHlvdSBtdXN0IHJlZ2lzdGVyIHRoZSBleHRlbnNpb25cbiAgICogcHJpb3IgdG8gcmVuZGVyaW5nIHRoaXMgY29tcG9uZW50LCBlLmcuOlxuICAgKlxuICAgKiBgYGBcbiAgICogaW1wb3J0IEN5dG9zY2FwZSBmcm9tICdjeXRvc2NhcGUnO1xuICAgKiBpbXBvcnQgQ09TRUJpbGtlbnQgZnJvbSAnY3l0b3NjYXBlLWNvc2UtYmlsa2VudCc7XG4gICAqIGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG4gICAqIGltcG9ydCBDeXRvc2NhcGVDb21wb25lbnQgZnJvbSAnY3l0b3NjYXBlLXJlYWN0anMnO1xuICAgKlxuICAgKiBDeXRvc2NhcGUudXNlKENPU0VCaWxrZW50KTtcbiAgICpcbiAgICogY2xhc3MgTXlBcHAgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgKiAgIHJlbmRlcigpIHtcbiAgICogICAgIGNvbnN0IGVsZW1lbnRzID0gW1xuICAgKiAgICAgICB7IGRhdGE6IHsgaWQ6ICdvbmUnLCBsYWJlbDogJ05vZGUgMScgfSwgcG9zaXRpb246IHsgeDogMCwgeTogMCB9IH0sXG4gICAqICAgICAgIHsgZGF0YTogeyBpZDogJ3R3bycsIGxhYmVsOiAnTm9kZSAyJyB9LCBwb3NpdGlvbjogeyB4OiAxMDAsIHk6IDAgfSB9LFxuICAgKiAgICAgICB7IGRhdGE6IHsgc291cmNlOiAnb25lJywgdGFyZ2V0OiAndHdvJywgbGFiZWw6ICdFZGdlIGZyb20gTm9kZTEgdG8gTm9kZTInIH0gfVxuICAgKiAgICAgXTtcbiAgICpcbiAgICogICAgIGNvbnN0IGxheW91dCA9IHsgbmFtZTogJ2Nvc2UtYmlsa2VudCcgfTtcbiAgICpcbiAgICogICAgIHJldHVybiA8Q3l0b3NjYXBlQ29tcG9uZW50IGVsZW1lbnRzPXtlbGVtZW50c30gbGF5b3V0PXtsYXlvdXR9PjtcbiAgICogICB9XG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIFNlZSBodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jbGF5b3V0c1xuICAgKi9cbiAgbGF5b3V0OiBvbmVPZlR5cGUoW29iamVjdCwgYW55XSksXG5cbiAgLyoqXG4gICAqIFRoZSBwYW5uaW5nIHBvc2l0aW9uIG9mIHRoZSBncmFwaC5cbiAgICpcbiAgICogU2VlIGh0dHA6Ly9qcy5jeXRvc2NhcGUub3JnLyNpbml0LW9wdHMvcGFuXG4gICAqL1xuICBwYW46IG9uZU9mVHlwZShbb2JqZWN0LCBhbnldKSxcblxuICAvKipcbiAgICogVGhlIHpvb20gbGV2ZWwgb2YgdGhlIGdyYXBoLlxuICAgKlxuICAgKiBTZWUgaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI2luaXQtb3B0cy96b29tXG4gICAqL1xuICB6b29tOiBudW1iZXIsXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBhbm5pbmcgcG9zaXRpb24gb2YgdGhlIGdyYXBoIGlzIG11dGFibGUgb3ZlcmFsbC5cbiAgICpcbiAgICogU2VlIGh0dHA6Ly9qcy5jeXRvc2NhcGUub3JnLyNpbml0LW9wdHMvcGFubmluZ0VuYWJsZWRcbiAgICovXG4gIHBhbm5pbmdFbmFibGVkOiBib29sLFxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBwYW5uaW5nIHBvc2l0aW9uIG9mIHRoZSBncmFwaCBpcyBtdXRhYmxlIGJ5IHVzZXIgZ2VzdHVyZXMgKGUuZy4gc3dpcGUpLlxuICAgKlxuICAgKiBTZWUgaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI2luaXQtb3B0cy91c2VyUGFubmluZ0VuYWJsZWRcbiAgICovXG4gIHVzZXJQYW5uaW5nRW5hYmxlZDogYm9vbCxcblxuICAvKipcbiAgICogVGhlIG1pbmltdW0gem9vbSBsZXZlbCBvZiB0aGUgZ3JhcGguXG4gICAqXG4gICAqIFNlZSBodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jaW5pdC1vcHRzL21pblpvb21cbiAgICovXG4gIG1pblpvb206IG51bWJlcixcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gem9vbSBsZXZlbCBvZiB0aGUgZ3JhcGguXG4gICAqXG4gICAqIFNlZSBodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jaW5pdC1vcHRzL21heFpvb21cbiAgICovXG4gIG1heFpvb206IG51bWJlcixcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgem9vbSBsZXZlbCBvZiB0aGUgZ3JhcGggaXMgbXV0YWJsZSBvdmVyYWxsLlxuICAgKlxuICAgKiBTZWUgaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI2luaXQtb3B0cy96b29taW5nRW5hYmxlZFxuICAgKi9cbiAgem9vbWluZ0VuYWJsZWQ6IGJvb2wsXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHpvb20gbGV2ZWwgb2YgdGhlIGdyYXBoIGlzIG11dGFibGUgYnkgdXNlciBnZXN0dXJlcyAoZS5nLiBwaW5jaC10by16b29tKS5cbiAgICpcbiAgICogU2VlIGh0dHA6Ly9qcy5jeXRvc2NhcGUub3JnLyNpbml0LW9wdHMvdXNlclpvb21pbmdFbmFibGVkXG4gICAqL1xuICB1c2VyWm9vbWluZ0VuYWJsZWQ6IGJvb2wsXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgc2hpZnQrY2xpY2stYW5kLWRyYWcgYm94IHNlbGVjdGlvbiBpcyBlbmFibGVkLlxuICAgKlxuICAgKiBTZWUgaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI2luaXQtb3B0cy9ib3hTZWxlY3Rpb25FbmFibGVkXG4gICAqL1xuICBib3hTZWxlY3Rpb25FbmFibGVkOiBib29sLFxuXG4gIC8qKlxuICAgKiBJZiB0cnVlLCBub2RlcyBhdXRvbWF0aWNhbGx5IGNhbiBub3QgYmUgZ3JhYmJlZCByZWdhcmRsZXNzIG9mIHdoZXRoZXJcbiAgICogZWFjaCBub2RlIGlzIG1hcmtlZCBhcyBncmFiYmFibGUuXG4gICAqXG4gICAqIFNlZSBodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jaW5pdC1vcHRzL2F1dG91bmdyYWJpZnlcbiAgICovXG4gIGF1dG91bmdyYWJpZnk6IGJvb2wsXG5cbiAgLyoqXG4gICAqIElmIHRydWUsIG5vZGVzIGNhbiBub3QgYmUgbW92ZWQgYXQgYWxsLlxuICAgKlxuICAgKiBTZWUgaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI2luaXQtb3B0cy9hdXRvbG9ja1xuICAgKi9cbiAgYXV0b2xvY2s6IGJvb2wsXG5cbiAgLyoqXG4gICAqIElmIHRydWUsIGVsZW1lbnRzIGhhdmUgaW1tdXRhYmxlIHNlbGVjdGlvbiBzdGF0ZS5cbiAgICpcbiAgICogU2VlIGh0dHA6Ly9qcy5jeXRvc2NhcGUub3JnLyNpbml0LW9wdHMvYXV0b3Vuc2VsZWN0aWZ5XG4gICAqL1xuICBhdXRvdW5zZWxlY3RpZnk6IGJvb2wsXG5cbiAgLyoqXG4gICAqIGBnZXQob2JqZWN0LCBrZXkpYFxuICAgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgYG9iamVjdGAgYXQgdGhlIGBrZXlgLCB3aGljaCBtYXkgYmUgYW4gaW50ZWdlclxuICAgKiBpbiB0aGUgY2FzZSBvZiBsaXN0cy9hcnJheXMgb3Igc3RyaW5ncyBpbiB0aGUgY2FzZSBvZiBtYXBzL29iamVjdHMuXG4gICAqL1xuICBnZXQ6IGZ1bmMsXG5cbiAgLyoqXG4gICAqIGB0b0pzb24ob2JqZWN0KWBcbiAgICogR2V0IHRoZSBkZWVwIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgYG9iamVjdGAgYXMgbm9uLXN0cmluZ2lmaWVkIEpTT04uXG4gICAqL1xuICB0b0pzb246IGZ1bmMsXG5cbiAgLyoqXG4gICAqIGRpZmYob2JqZWN0QSwgb2JqZWN0QilcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhlIHR3byBvYmplY3RzIGhhdmUgZXF1YWwgdmFsdWUuIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWZcbiAgICogYW5kIHdoZXJlIEN5dG9zY2FwZSBuZWVkcyB0byBiZSBwYXRjaGVkLlxuICAgKi9cbiAgZGlmZjogZnVuYyxcblxuICAvKipcbiAgICogZm9yRWFjaChsaXN0LCBpdGVyYXRvcilcbiAgICogQ2FsbCBgaXRlcmF0b3JgIG9uIGVhY2ggZWxlbWVudCBpbiB0aGUgYGxpc3RgLCBpbiBvcmRlci5cbiAgICovXG4gIGZvckVhY2g6IGZ1bmMsXG5cbiAgLyoqXG4gICAqIGN5KGN5UmVmKVxuICAgKiBUaGUgYGN5YCBwcm9wIGFsbG93cyBmb3IgZ2V0dGluZyBhIHJlZmVyZW5jZSB0byB0aGUgYGN5YCBDeXRvc2NhcGUgb2JqZWN0LCBlLmcuOlxuICAgKlxuICAgKiBgPEN5dG9zY2FwZUNvbXBvbmVudCBjeT17Y3kgPT4gKG15Q3lSZWYgPSBjeSl9IC8+YFxuICAgKi9cbiAgY3k6IGZ1bmMsXG5cbiAgLyoqXG4gICAqIGhlYWRsZXNzXG4gICAqIFRoZSBgaGVhZGxlc3NgIHByb3BlciBhbGxvd3MgZm9yIHNldHRpbmcgd2hldGhlciB0aGUgQ3l0b3NjYXBlIGluc3RhbmNlIGlzIGhlYWRsZXNzLCBpLmUuXG4gICAqIG5vdCByZW5kZXJlZC4gIFRoaXMgdmFsdWUgY2FuIG5vdCBiZSBjaGFuZ2VkIGFmdGVyIGluaXRpYWxpc2F0aW9uIG9mIHRoZSBjb21wb25lbnQuXG4gICAqL1xuICBoZWFkbGVzczogYm9vbCxcblxuICAvKipcbiAgICogc3R5bGVFbmFibGVkXG4gICAqIFRoZSBgc3R5bGVFbmFibGVkYCBmbGFnIGlzIHVzZWQgdG8gZW5hYmxlIHN0eWxlIGZ1bmN0aW9uYWxpdHkgaW4gYSBoZWFkbGVzcyBpbnN0YW5jZSAoaS5lLlxuICAgKiBgaGVhZGxlc3M6IHRydWUsIHN0eWxlRW5hYmxlZDogdHJ1ZWApLiAgRm9yIGEgcmVuZGVyZWQgaW5zdGFuY2UsIGRvIG5vdCBzZXQgdGhpcyB2YWx1ZS5cbiAgICovXG4gIHN0eWxlRW5hYmxlZDogYm9vbCxcblxuICAvKipcbiAgICogaGlkZUVkZ2VzT25WaWV3cG9ydFxuICAgKiBBIHJlbmRlcmluZyBoaW50IHRoYXQgc3BlY2lmaWVzLCBmb3IgcmVuZGVyZXJzIHdoaWNoIHN1cHBvcnQgdGhlIGhpbnQsIHdoZXRoZXIgZWRnZXMgc2hvdWxkXG4gICAqIGJlIGhpZGRlbiBkdXJpbmcgem9vbSBhbmQgcGFuIG9wZXJhdGlvbnMuXG4gICAqL1xuICBoaWRlRWRnZXNPblZpZXdwb3J0OiBib29sLFxuXG4gIC8qKlxuICAgKiB0ZXh0dXJlT25WaWV3cG9ydFxuICAgKiBBIHJlbmRlcmluZyBoaW50IHRoYXQgc3BlY2lmaWVzLCBmb3IgcmVuZGVyZXJzIHdoaWNoIHN1cHBvcnQgdGhlIGhpbnQsIHdoZXRoZXIgYSBwcmV2aWV3XG4gICAqIGJhc2VkIG9uIHRoZSBleGlzdGluZyBzY2VuZSBzaG91bGQgYmUgdXNlZCBpbiBwbGFjZSBvZiBidWlsZGluZyBhIG5ldyBzY2VuZS5cbiAgICovXG4gIHRleHR1cmVPblZpZXdwb3J0OiBib29sLFxuXG4gIC8qKlxuICAgKiBtb3Rpb25CbHVyXG4gICAqIEEgcmVuZGVyaW5nIGhpbnQgdGhhdCBzcGVjaWZpZXMsIGZvciByZW5kZXJlcnMgd2hpY2ggc3VwcG9ydCB0aGUgaGludCwgd2hldGhlciBhIG1vdGlvbiBibHVyXG4gICAqIGVmZmVjdCBzaG91bGQgYmUgYXBwbGllZC5cbiAgICovXG4gIG1vdGlvbkJsdXI6IGJvb2wsXG5cbiAgLyoqXG4gICAqIG1vdGlvbkJsdXJPcGFjaXR5XG4gICAqIEEgcmVuZGVyaW5nIGhpbnQgdGhhdCBzcGVjaWZpZXMsIGZvciByZW5kZXJlcnMgd2hpY2ggc3VwcG9ydCB0aGUgaGludCwgaG93IHN0cm9uZyB0aGUgbW90aW9uXG4gICAqIGJsdXIgZWZmZWN0IHNob3VsZCBiZS4gIFRoZSB2YWx1ZSByYW5nZXMgZnJvbSAwIHRvIDEsIHdpdGggbGFyZ2VyIHZhbHVlcyBpbmRpY2F0aW5nIGxhcmdlclxuICAgKiBzdHJlbmd0aC5cbiAgICovXG4gIG1vdGlvbkJsdXJPcGFjaXR5OiBudW1iZXIsXG5cbiAgLyoqXG4gICAqIHdoZWVsU2Vuc2l0aXZpdHlcbiAgICogQSByZW5kZXJpbmcgaGludCB0aGF0IHNwZWNpZmllcywgZm9yIHJlbmRlcmVycyB3aGljaCBzdXBwb3J0IHRoZSBoaW50LCBob3cgZmFzdCB3aGVlbCB6b29taW5nXG4gICAqIHNob3VsZCBiZS4gIFRoZSB2YWx1ZSBpcyBhIHBvc2l0aXZlIG11bHRpcGxpZXIuICBEbyBub3Qgc2V0IHRoaXMgdmFsdWUgdW5sZXNzIHlvdSBhcmUgdXNpbmdcbiAgICogdW5jb252ZW50aW9uYWwgaGFyZHdhcmUgYW5kIGNhbiBndWFyYW50ZWUgdGhhdCBhbGwgeW91ciB1c2VycyB3aWxsIHVzZSB0aGUgc2FtZSBoYXJkd2FyZS4gIFRoZVxuICAgKiBkZWZhdWx0IHZhbHVlIHdvcmtzIHdlbGwgZm9yIHN0YW5kYXJkIG1pY2Ugb24gY29tbW9uIG9wZXJhdGluZyBzeXN0ZW1zLiAgSWYgeW91IGNoYW5nZSB0aGlzXG4gICAqIHZhbHVlLCBpdCBpcyB2ZXJ5IGxpa2VseSB0aGF0IHlvdSB3aWxsIGNyZWF0ZSBhIGJhZCB1c2VyIGV4cGVyaWVuY2UgZm9yIG1hbnkgb3IgbW9zdCBvZiB5b3VyXG4gICAqIHVzZXJzLlxuICAgKi9cbiAgd2hlZWxTZW5zaXRpdml0eTogbnVtYmVyLFxuXG4gIC8qKlxuICAgKiBwaXhlbFJhdGlvXG4gICAqIEEgcmVuZGVyaW5nIGhpbnQgdGhhdCBzcGVjaWZpZXMsIGZvciByZW5kZXJlcnMgd2hpY2ggc3VwcG9ydCB0aGUgaGludCwgdGhlIHBpeGVsIHJhdGlvIHRoYXRcbiAgICogc2hvdWxkIGJlIHVzZWQuICBNYXkgYmUgJ2F1dG8nIG9yIGEgcG9zaXRpdmUgbnVtYmVyLlxuICAgKi9cbiAgcGl4ZWxSYXRpbzogb25lT2ZUeXBlKFtzdHJpbmcsIG9iamVjdF0pLFxufTtcbiIsImNvbnN0IGVpdGhlcklzTmlsID0gKGEsIGIpID0+IGEgPT0gbnVsbCB8fCBiID09IG51bGw7XG5cbmV4cG9ydCBjb25zdCBoYXNoRGlmZiA9IChhLCBiKSA9PiB7XG4gIHJldHVybiBlaXRoZXJJc05pbChhLCBiKSB8fCBhLmhhc2goKSAhPT0gYi5oYXNoKCk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2hhbGxvd09iakRpZmYgPSAoYSwgYikgPT4ge1xuICBpZiAoZWl0aGVySXNOaWwoYSwgYikgJiYgIShhID09IG51bGwgJiYgYiA9PSBudWxsKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGEgPT09IGIpIHtcbiAgICAvLyBjYW4ndCBkbyBhIGRpZmYgb24gdGhlIHNhbWUgb2JqXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gbm9uLW9iamVjdCB2YWx1ZXMgY2FuIGJlIGNvbXBhcmVkIHdpdGggdGhlIGVxdWFsaXR5IG9wZXJhdG9yXG4gIGlmICh0eXBlb2YgYSAhPT0gJ29iamVjdCcgfHwgdHlwZW9mIGIgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGEgIT09IGI7XG4gIH1cblxuICBjb25zdCBhS2V5cyA9IE9iamVjdC5rZXlzKGEpO1xuICBjb25zdCBiS2V5cyA9IE9iamVjdC5rZXlzKGIpO1xuICBjb25zdCBtaXNtYXRjaGVzID0gKGtleSkgPT4gYVtrZXldICE9PSBiW2tleV07XG5cbiAgaWYgKGFLZXlzLmxlbmd0aCAhPT0gYktleXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoYUtleXMuc29tZShtaXNtYXRjaGVzKSB8fCBiS2V5cy5zb21lKG1pc21hdGNoZXMpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59O1xuIiwiZXhwb3J0IGNvbnN0IGdldCA9IChvYmosIGtleSkgPT4gKG9iaiAhPSBudWxsID8gb2JqW2tleV0gOiBudWxsKTtcblxuZXhwb3J0IGNvbnN0IHRvSnNvbiA9IChvYmopID0+IG9iajtcblxuZXhwb3J0IGNvbnN0IGZvckVhY2ggPSAoYXJyLCBpdGVyYXRvcikgPT4gYXJyLmZvckVhY2goaXRlcmF0b3IpO1xuIiwiaW1wb3J0IHsgc2hhbGxvd09iakRpZmYgfSBmcm9tICcuL2RpZmYnO1xuaW1wb3J0IHsgZ2V0LCB0b0pzb24sIGZvckVhY2ggfSBmcm9tICcuL2pzb24nO1xuXG5leHBvcnQgY29uc3QgaWRlbnRpdHkgPSAoeCkgPT4geDtcblxuZXhwb3J0IGNvbnN0IGVsZW1lbnRzID0gW1xuICB7IGRhdGE6IHsgaWQ6ICdhJywgbGFiZWw6ICdFeGFtcGxlIG5vZGUgQScgfSB9LFxuICB7IGRhdGE6IHsgaWQ6ICdiJywgbGFiZWw6ICdFeGFtcGxlIG5vZGUgQicgfSB9LFxuICB7IGRhdGE6IHsgaWQ6ICdlJywgc291cmNlOiAnYScsIHRhcmdldDogJ2InIH0gfSxcbl07XG5cbmV4cG9ydCBjb25zdCBzdHlsZXNoZWV0ID0gW1xuICB7XG4gICAgc2VsZWN0b3I6ICdub2RlJyxcbiAgICBzdHlsZToge1xuICAgICAgbGFiZWw6ICdkYXRhKGxhYmVsKScsXG4gICAgfSxcbiAgfSxcbl07XG5cbmV4cG9ydCBjb25zdCB6b29tID0gMTtcblxuZXhwb3J0IGNvbnN0IHBhbiA9IHtcbiAgeDogMCxcbiAgeTogMCxcbn07XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0cyA9IHtcbiAgZGlmZjogc2hhbGxvd09iakRpZmYsXG4gIGdldCxcbiAgdG9Kc29uLFxuICBmb3JFYWNoLFxuICBlbGVtZW50cyxcbiAgc3R5bGVzaGVldCxcbiAgem9vbSxcbiAgcGFuLFxufTtcbiIsImltcG9ydCB7IGdldCBhcyBhdEtleSB9IGZyb20gJy4vanNvbic7XG5pbXBvcnQgeyBzaGFsbG93T2JqRGlmZiB9IGZyb20gJy4vZGlmZic7XG5cbmNvbnN0IGlzRGlmZkF0S2V5ID0gKGpzb24xLCBqc29uMiwgZGlmZiwga2V5KSA9PlxuICBkaWZmKGF0S2V5KGpzb24xLCBrZXkpLCBhdEtleShqc29uMiwga2V5KSk7XG5cbmV4cG9ydCBjb25zdCBwYXRjaCA9IChjeSwganNvbjEsIGpzb24yLCBkaWZmLCB0b0pzb24sIGdldCwgZm9yRWFjaCkgPT4ge1xuICBjeS5iYXRjaCgoKSA9PiB7XG4gICAgLy8gVGhlIHNoYWxsb3cgb2JqZWN0IGRpZmYoKSBtdXN0IGRlZmVyIHRvIHBhdGNoRWxlbWVudHMoKSBhcyBpdCBtdXN0IGNvbXBhcmUgdGhlXG4gICAgLy8gZWxlbWVudHMgYXMgYW4gdW5vcmRlcmVkIHNldC4gIEEgY3VzdG9tIGRpZmYoKSwgd2l0aCBJbW11dGFibGUgZm9yIGV4YW1wbGUsXG4gICAgLy8gY291bGQganVzdCB1c2UgYW4gZXF1YWxpdHkgY2hlY2sgKD09PSkuXG4gICAgaWYgKFxuICAgICAgZGlmZiA9PT0gc2hhbGxvd09iakRpZmYgfHxcbiAgICAgIGlzRGlmZkF0S2V5KGpzb24xLCBqc29uMiwgZGlmZiwgJ2VsZW1lbnRzJylcbiAgICApIHtcbiAgICAgIHBhdGNoRWxlbWVudHMoXG4gICAgICAgIGN5LFxuICAgICAgICBhdEtleShqc29uMSwgJ2VsZW1lbnRzJyksXG4gICAgICAgIGF0S2V5KGpzb24yLCAnZWxlbWVudHMnKSxcbiAgICAgICAgdG9Kc29uLFxuICAgICAgICBnZXQsXG4gICAgICAgIGZvckVhY2gsXG4gICAgICAgIGRpZmZcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGlzRGlmZkF0S2V5KGpzb24xLCBqc29uMiwgZGlmZiwgJ3N0eWxlc2hlZXQnKSkge1xuICAgICAgcGF0Y2hTdHlsZShcbiAgICAgICAgY3ksXG4gICAgICAgIGF0S2V5KGpzb24xLCAnc3R5bGVzaGVldCcpLFxuICAgICAgICBhdEtleShqc29uMiwgJ3N0eWxlc2hlZXQnKSxcbiAgICAgICAgdG9Kc29uXG4gICAgICApO1xuICAgIH1cblxuICAgIFtcbiAgICAgIC8vIHNpbXBsZSBrZXlzIHRoYXQgY2FuIGJlIHBhdGNoZWQgZGlyZWN0bHkgKGtleSBzYW1lIGFzIGZuIG5hbWUpXG4gICAgICAnem9vbScsXG4gICAgICAnbWluWm9vbScsXG4gICAgICAnbWF4Wm9vbScsXG4gICAgICAnem9vbWluZ0VuYWJsZWQnLFxuICAgICAgJ3VzZXJab29taW5nRW5hYmxlZCcsXG4gICAgICAncGFuJyxcbiAgICAgICdwYW5uaW5nRW5hYmxlZCcsXG4gICAgICAndXNlclBhbm5pbmdFbmFibGVkJyxcbiAgICAgICdib3hTZWxlY3Rpb25FbmFibGVkJyxcbiAgICAgICdhdXRvdW5ncmFiaWZ5JyxcbiAgICAgICdhdXRvbG9jaycsXG4gICAgICAnYXV0b3Vuc2VsZWN0aWZ5JyxcbiAgICBdLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgaWYgKGlzRGlmZkF0S2V5KGpzb24xLCBqc29uMiwgZGlmZiwga2V5KSkge1xuICAgICAgICBwYXRjaEpzb24oY3ksIGtleSwgYXRLZXkoanNvbjEsIGtleSksIGF0S2V5KGpzb24yLCBrZXkpLCB0b0pzb24pO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICBpZiAoaXNEaWZmQXRLZXkoanNvbjEsIGpzb24yLCBkaWZmLCAnbGF5b3V0JykpIHtcbiAgICBwYXRjaExheW91dChjeSwgYXRLZXkoanNvbjEsICdsYXlvdXQnKSwgYXRLZXkoanNvbjIsICdsYXlvdXQnKSwgdG9Kc29uKTtcbiAgfVxufTtcblxuY29uc3QgcGF0Y2hKc29uID0gKGN5LCBrZXksIHZhbDEsIHZhbDIsIHRvSnNvbikgPT4ge1xuICBjeVtrZXldKHRvSnNvbih2YWwyKSk7XG59O1xuXG5jb25zdCBwYXRjaExheW91dCA9IChjeSwgbGF5b3V0MSwgbGF5b3V0MiwgdG9Kc29uKSA9PiB7XG4gIGNvbnN0IGxheW91dE9wdHMgPSB0b0pzb24obGF5b3V0Mik7XG5cbiAgaWYgKGxheW91dE9wdHMgIT0gbnVsbCkge1xuICAgIGN5LmxheW91dChsYXlvdXRPcHRzKS5ydW4oKTtcbiAgfVxufTtcblxuY29uc3QgcGF0Y2hTdHlsZSA9IChjeSwgc3R5bGUxLCBzdHlsZTIsIHRvSnNvbikgPT4ge1xuICBjb25zdCBzdHlsZSA9IGN5LnN0eWxlKCk7XG5cbiAgaWYgKHN0eWxlID09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBzdHlsZS5mcm9tSnNvbih0b0pzb24oc3R5bGUyKSkudXBkYXRlKCk7XG59O1xuXG5jb25zdCBwYXRjaEVsZW1lbnRzID0gKGN5LCBlbGVzMSwgZWxlczIsIHRvSnNvbiwgZ2V0LCBmb3JFYWNoLCBkaWZmKSA9PiB7XG4gIGNvbnN0IHRvQWRkID0gW107XG4gIGNvbnN0IHRvUm0gPSBjeS5jb2xsZWN0aW9uKCk7XG4gIGNvbnN0IHRvUGF0Y2ggPSBbXTtcbiAgY29uc3QgZWxlczFNYXAgPSB7fTtcbiAgY29uc3QgZWxlczJNYXAgPSB7fTtcbiAgY29uc3QgZWxlczFIYXNJZCA9IChpZCkgPT4gZWxlczFNYXBbaWRdICE9IG51bGw7XG4gIGNvbnN0IGVsZXMySGFzSWQgPSAoaWQpID0+IGVsZXMyTWFwW2lkXSAhPSBudWxsO1xuICBjb25zdCBnZXRFbGUxID0gKGlkKSA9PiBlbGVzMU1hcFtpZF07XG4gIGNvbnN0IGdldElkID0gKGVsZSkgPT4gZ2V0KGdldChlbGUsICdkYXRhJyksICdpZCcpO1xuXG4gIGZvckVhY2goZWxlczIsIChlbGUyKSA9PiB7XG4gICAgY29uc3QgaWQgPSBnZXRJZChlbGUyKTtcblxuICAgIGVsZXMyTWFwW2lkXSA9IGVsZTI7XG4gIH0pO1xuXG4gIGlmIChlbGVzMSAhPSBudWxsKSB7XG4gICAgZm9yRWFjaChlbGVzMSwgKGVsZTEpID0+IHtcbiAgICAgIGNvbnN0IGlkID0gZ2V0SWQoZWxlMSk7XG5cbiAgICAgIGVsZXMxTWFwW2lkXSA9IGVsZTE7XG5cbiAgICAgIGlmICghZWxlczJIYXNJZChpZCkpIHtcbiAgICAgICAgdG9SbS5tZXJnZShjeS5nZXRFbGVtZW50QnlJZChpZCkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZm9yRWFjaChlbGVzMiwgKGVsZTIpID0+IHtcbiAgICBjb25zdCBpZCA9IGdldElkKGVsZTIpO1xuICAgIGNvbnN0IGVsZTEgPSBnZXRFbGUxKGlkKTtcblxuICAgIGlmIChlbGVzMUhhc0lkKGlkKSkge1xuICAgICAgdG9QYXRjaC5wdXNoKHsgZWxlMSwgZWxlMiB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdG9BZGQucHVzaCh0b0pzb24oZWxlMikpO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKHRvUm0ubGVuZ3RoID4gMCkge1xuICAgIGN5LnJlbW92ZSh0b1JtKTtcbiAgfVxuXG4gIGlmICh0b0FkZC5sZW5ndGggPiAwKSB7XG4gICAgY3kuYWRkKHRvQWRkKTtcbiAgfVxuXG4gIHRvUGF0Y2guZm9yRWFjaCgoeyBlbGUxLCBlbGUyIH0pID0+XG4gICAgcGF0Y2hFbGVtZW50KGN5LCBlbGUxLCBlbGUyLCB0b0pzb24sIGdldCwgZGlmZilcbiAgKTtcbn07XG5cbmNvbnN0IHBhdGNoRWxlbWVudCA9IChjeSwgZWxlMSwgZWxlMiwgdG9Kc29uLCBnZXQsIGRpZmYpID0+IHtcbiAgY29uc3QgaWQgPSBnZXQoZ2V0KGVsZTIsICdkYXRhJyksICdpZCcpO1xuICBjb25zdCBjeUVsZSA9IGN5LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgY29uc3QgcGF0Y2ggPSB7fTtcbiAgY29uc3QganNvbktleXMgPSBbXG4gICAgJ2RhdGEnLFxuICAgICdwb3NpdGlvbicsXG4gICAgJ3NlbGVjdGVkJyxcbiAgICAnc2VsZWN0YWJsZScsXG4gICAgJ2xvY2tlZCcsXG4gICAgJ2dyYWJiYWJsZScsXG4gICAgJ2NsYXNzZXMnLFxuICBdO1xuXG4gIGpzb25LZXlzLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGNvbnN0IGRhdGEyID0gZ2V0KGVsZTIsIGtleSk7XG5cbiAgICBpZiAoZGlmZihkYXRhMiwgZ2V0KGVsZTEsIGtleSkpKSB7XG4gICAgICBwYXRjaFtrZXldID0gdG9Kc29uKGRhdGEyKTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IHNjcmF0Y2gyID0gZ2V0KGVsZTIsICdzY3JhdGNoJyk7XG4gIGlmIChkaWZmKHNjcmF0Y2gyLCBnZXQoZWxlMSwgJ3NjcmF0Y2gnKSkpIHtcbiAgICBjeUVsZS5zY3JhdGNoKHRvSnNvbihzY3JhdGNoMikpO1xuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKHBhdGNoKS5sZW5ndGggPiAwKSB7XG4gICAgY3lFbGUuanNvbihwYXRjaCk7XG4gIH1cbn07XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdHlwZXMgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGRlZmF1bHRzIH0gZnJvbSAnLi9kZWZhdWx0cyc7XG5pbXBvcnQgQ3l0b3NjYXBlIGZyb20gJ2N5dG9zY2FwZSc7XG5pbXBvcnQgeyBwYXRjaCB9IGZyb20gJy4vcGF0Y2gnO1xuXG4vKipcbiAqIFRoZSBgQ3l0b3NjYXBlQ29tcG9uZW50YCBpcyBhIFJlYWN0IGNvbXBvbmVudCB0aGF0IGFsbG93cyBmb3IgdGhlIGRlY2xhcmF0aXZlIGNyZWF0aW9uXG4gKiBhbmQgbW9kaWZpY2F0aW9uIG9mIGEgQ3l0b3NjYXBlIGluc3RhbmNlLCBhIGdyYXBoIHZpc3VhbGlzYXRpb24uXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEN5dG9zY2FwZUNvbXBvbmVudCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHN0YXRpYyBnZXQgcHJvcFR5cGVzKCkge1xuICAgIHJldHVybiB0eXBlcztcbiAgfVxuXG4gIHN0YXRpYyBnZXQgZGVmYXVsdFByb3BzKCkge1xuICAgIHJldHVybiBkZWZhdWx0cztcbiAgfVxuXG4gIHN0YXRpYyBub3JtYWxpemVFbGVtZW50cyhlbGVtZW50cykge1xuICAgIGNvbnN0IGlzQXJyYXkgPSBlbGVtZW50cy5sZW5ndGggIT0gbnVsbDtcblxuICAgIGlmIChpc0FycmF5KSB7XG4gICAgICByZXR1cm4gZWxlbWVudHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCB7IG5vZGVzLCBlZGdlcyB9ID0gZWxlbWVudHM7XG5cbiAgICAgIGlmIChub2RlcyA9PSBudWxsKSB7XG4gICAgICAgIG5vZGVzID0gW107XG4gICAgICB9XG5cbiAgICAgIGlmIChlZGdlcyA9PSBudWxsKSB7XG4gICAgICAgIGVkZ2VzID0gW107XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBub2Rlcy5jb25jYXQoZWRnZXMpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuZGlzcGxheU5hbWUgPSAnQ3l0b3NjYXBlQ29tcG9uZW50JztcbiAgICB0aGlzLmNvbnRhaW5lclJlZiA9IFJlYWN0LmNyZWF0ZVJlZigpO1xuICB9XG5cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5jb250YWluZXJSZWYuY3VycmVudDtcblxuICAgIGNvbnN0IHtcbiAgICAgIGdsb2JhbCxcbiAgICAgIGhlYWRsZXNzLFxuICAgICAgc3R5bGVFbmFibGVkLFxuICAgICAgaGlkZUVkZ2VzT25WaWV3cG9ydCxcbiAgICAgIHRleHR1cmVPblZpZXdwb3J0LFxuICAgICAgbW90aW9uQmx1cixcbiAgICAgIG1vdGlvbkJsdXJPcGFjaXR5LFxuICAgICAgd2hlZWxTZW5zaXRpdml0eSxcbiAgICAgIHBpeGVsUmF0aW8sXG4gICAgfSA9IHRoaXMucHJvcHM7XG5cbiAgICBjb25zdCBjeSA9ICh0aGlzLl9jeSA9IG5ldyBDeXRvc2NhcGUoe1xuICAgICAgY29udGFpbmVyLFxuICAgICAgaGVhZGxlc3MsXG4gICAgICBzdHlsZUVuYWJsZWQsXG4gICAgICBoaWRlRWRnZXNPblZpZXdwb3J0LFxuICAgICAgdGV4dHVyZU9uVmlld3BvcnQsXG4gICAgICBtb3Rpb25CbHVyLFxuICAgICAgbW90aW9uQmx1ck9wYWNpdHksXG4gICAgICB3aGVlbFNlbnNpdGl2aXR5LFxuICAgICAgcGl4ZWxSYXRpbyxcbiAgICB9KSk7XG5cbiAgICBpZiAoZ2xvYmFsKSB7XG4gICAgICB3aW5kb3dbZ2xvYmFsXSA9IGN5O1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlQ3l0b3NjYXBlKG51bGwsIHRoaXMucHJvcHMpO1xuICB9XG5cbiAgdXBkYXRlQ3l0b3NjYXBlKHByZXZQcm9wcywgbmV3UHJvcHMpIHtcbiAgICBjb25zdCBjeSA9IHRoaXMuX2N5O1xuICAgIGNvbnN0IHsgZGlmZiwgdG9Kc29uLCBnZXQsIGZvckVhY2ggfSA9IG5ld1Byb3BzO1xuXG4gICAgcGF0Y2goY3ksIHByZXZQcm9wcywgbmV3UHJvcHMsIGRpZmYsIHRvSnNvbiwgZ2V0LCBmb3JFYWNoKTtcblxuICAgIGlmIChuZXdQcm9wcy5jeSAhPSBudWxsKSB7XG4gICAgICBuZXdQcm9wcy5jeShjeSk7XG4gICAgfVxuICB9XG5cbiAgY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcykge1xuICAgIHRoaXMudXBkYXRlQ3l0b3NjYXBlKHByZXZQcm9wcywgdGhpcy5wcm9wcyk7XG4gIH1cblxuICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICB0aGlzLl9jeS5kZXN0cm95KCk7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgY29uc3QgeyBpZCwgY2xhc3NOYW1lLCBzdHlsZSB9ID0gdGhpcy5wcm9wcztcblxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KCdkaXYnLCB7XG4gICAgICByZWY6IHRoaXMuY29udGFpbmVyUmVmLFxuICAgICAgaWQsXG4gICAgICBjbGFzc05hbWUsXG4gICAgICBzdHlsZSxcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuY29uc3QgQ29udGV4dEtleSA9IFN5bWJvbC5mb3IoYHJlYWN0LXJlZHV4LWNvbnRleHRgKTtcbmNvbnN0IGdUID0gdHlwZW9mIGdsb2JhbFRoaXMgIT09IFwidW5kZWZpbmVkXCIgPyBnbG9iYWxUaGlzIDpcbi8qIGZhbGwgYmFjayB0byBhIHBlci1tb2R1bGUgc2NvcGUgKHByZS04LjEgYmVoYXZpb3VyKSBpZiBgZ2xvYmFsVGhpc2AgaXMgbm90IGF2YWlsYWJsZSAqL1xue307XG5cbmZ1bmN0aW9uIGdldENvbnRleHQoKSB7XG4gIHZhciBfZ1QkQ29udGV4dEtleTtcblxuICBpZiAoIVJlYWN0LmNyZWF0ZUNvbnRleHQpIHJldHVybiB7fTtcbiAgY29uc3QgY29udGV4dE1hcCA9IChfZ1QkQ29udGV4dEtleSA9IGdUW0NvbnRleHRLZXldKSAhPSBudWxsID8gX2dUJENvbnRleHRLZXkgOiBnVFtDb250ZXh0S2V5XSA9IG5ldyBNYXAoKTtcbiAgbGV0IHJlYWxDb250ZXh0ID0gY29udGV4dE1hcC5nZXQoUmVhY3QuY3JlYXRlQ29udGV4dCk7XG5cbiAgaWYgKCFyZWFsQ29udGV4dCkge1xuICAgIHJlYWxDb250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICByZWFsQ29udGV4dC5kaXNwbGF5TmFtZSA9ICdSZWFjdFJlZHV4JztcbiAgICB9XG5cbiAgICBjb250ZXh0TWFwLnNldChSZWFjdC5jcmVhdGVDb250ZXh0LCByZWFsQ29udGV4dCk7XG4gIH1cblxuICByZXR1cm4gcmVhbENvbnRleHQ7XG59XG5cbmV4cG9ydCBjb25zdCBSZWFjdFJlZHV4Q29udGV4dCA9IC8qI19fUFVSRV9fKi9nZXRDb250ZXh0KCk7XG5leHBvcnQgZGVmYXVsdCBSZWFjdFJlZHV4Q29udGV4dDsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBSZWFjdFJlZHV4Q29udGV4dCB9IGZyb20gJy4vQ29udGV4dCc7XG5pbXBvcnQgeyBjcmVhdGVTdWJzY3JpcHRpb24gfSBmcm9tICcuLi91dGlscy9TdWJzY3JpcHRpb24nO1xuaW1wb3J0IHsgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCB9IGZyb20gJy4uL3V0aWxzL3VzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QnO1xuXG5mdW5jdGlvbiBQcm92aWRlcih7XG4gIHN0b3JlLFxuICBjb250ZXh0LFxuICBjaGlsZHJlbixcbiAgc2VydmVyU3RhdGUsXG4gIHN0YWJpbGl0eUNoZWNrID0gJ29uY2UnLFxuICBub29wQ2hlY2sgPSAnb25jZSdcbn0pIHtcbiAgY29uc3QgY29udGV4dFZhbHVlID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gY3JlYXRlU3Vic2NyaXB0aW9uKHN0b3JlKTtcbiAgICByZXR1cm4ge1xuICAgICAgc3RvcmUsXG4gICAgICBzdWJzY3JpcHRpb24sXG4gICAgICBnZXRTZXJ2ZXJTdGF0ZTogc2VydmVyU3RhdGUgPyAoKSA9PiBzZXJ2ZXJTdGF0ZSA6IHVuZGVmaW5lZCxcbiAgICAgIHN0YWJpbGl0eUNoZWNrLFxuICAgICAgbm9vcENoZWNrXG4gICAgfTtcbiAgfSwgW3N0b3JlLCBzZXJ2ZXJTdGF0ZSwgc3RhYmlsaXR5Q2hlY2ssIG5vb3BDaGVja10pO1xuICBjb25zdCBwcmV2aW91c1N0YXRlID0gUmVhY3QudXNlTWVtbygoKSA9PiBzdG9yZS5nZXRTdGF0ZSgpLCBbc3RvcmVdKTtcbiAgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgc3Vic2NyaXB0aW9uXG4gICAgfSA9IGNvbnRleHRWYWx1ZTtcbiAgICBzdWJzY3JpcHRpb24ub25TdGF0ZUNoYW5nZSA9IHN1YnNjcmlwdGlvbi5ub3RpZnlOZXN0ZWRTdWJzO1xuICAgIHN1YnNjcmlwdGlvbi50cnlTdWJzY3JpYmUoKTtcblxuICAgIGlmIChwcmV2aW91c1N0YXRlICE9PSBzdG9yZS5nZXRTdGF0ZSgpKSB7XG4gICAgICBzdWJzY3JpcHRpb24ubm90aWZ5TmVzdGVkU3VicygpO1xuICAgIH1cblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBzdWJzY3JpcHRpb24udHJ5VW5zdWJzY3JpYmUoKTtcbiAgICAgIHN1YnNjcmlwdGlvbi5vblN0YXRlQ2hhbmdlID0gdW5kZWZpbmVkO1xuICAgIH07XG4gIH0sIFtjb250ZXh0VmFsdWUsIHByZXZpb3VzU3RhdGVdKTtcbiAgY29uc3QgQ29udGV4dCA9IGNvbnRleHQgfHwgUmVhY3RSZWR1eENvbnRleHQ7IC8vIEB0cy1pZ25vcmUgJ0FueUFjdGlvbicgaXMgYXNzaWduYWJsZSB0byB0aGUgY29uc3RyYWludCBvZiB0eXBlICdBJywgYnV0ICdBJyBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhIGRpZmZlcmVudCBzdWJ0eXBlXG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogY29udGV4dFZhbHVlXG4gIH0sIGNoaWxkcmVuKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgUHJvdmlkZXI7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2VcIjtcbmNvbnN0IF9leGNsdWRlZCA9IFtcInJlYWN0UmVkdXhGb3J3YXJkZWRSZWZcIl07XG5cbi8qIGVzbGludC1kaXNhYmxlIHZhbGlkLWpzZG9jLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgKi9cbmltcG9ydCBob2lzdFN0YXRpY3MgZnJvbSAnaG9pc3Qtbm9uLXJlYWN0LXN0YXRpY3MnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgaXNWYWxpZEVsZW1lbnRUeXBlLCBpc0NvbnRleHRDb25zdW1lciB9IGZyb20gJ3JlYWN0LWlzJztcbmltcG9ydCBkZWZhdWx0U2VsZWN0b3JGYWN0b3J5IGZyb20gJy4uL2Nvbm5lY3Qvc2VsZWN0b3JGYWN0b3J5JztcbmltcG9ydCB7IG1hcERpc3BhdGNoVG9Qcm9wc0ZhY3RvcnkgfSBmcm9tICcuLi9jb25uZWN0L21hcERpc3BhdGNoVG9Qcm9wcyc7XG5pbXBvcnQgeyBtYXBTdGF0ZVRvUHJvcHNGYWN0b3J5IH0gZnJvbSAnLi4vY29ubmVjdC9tYXBTdGF0ZVRvUHJvcHMnO1xuaW1wb3J0IHsgbWVyZ2VQcm9wc0ZhY3RvcnkgfSBmcm9tICcuLi9jb25uZWN0L21lcmdlUHJvcHMnO1xuaW1wb3J0IHsgY3JlYXRlU3Vic2NyaXB0aW9uIH0gZnJvbSAnLi4vdXRpbHMvU3Vic2NyaXB0aW9uJztcbmltcG9ydCB7IHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QgfSBmcm9tICcuLi91dGlscy91c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0JztcbmltcG9ydCBzaGFsbG93RXF1YWwgZnJvbSAnLi4vdXRpbHMvc2hhbGxvd0VxdWFsJztcbmltcG9ydCB3YXJuaW5nIGZyb20gJy4uL3V0aWxzL3dhcm5pbmcnO1xuaW1wb3J0IHsgUmVhY3RSZWR1eENvbnRleHQgfSBmcm9tICcuL0NvbnRleHQnO1xuaW1wb3J0IHsgbm90SW5pdGlhbGl6ZWQgfSBmcm9tICcuLi91dGlscy91c2VTeW5jRXh0ZXJuYWxTdG9yZSc7XG5sZXQgdXNlU3luY0V4dGVybmFsU3RvcmUgPSBub3RJbml0aWFsaXplZDtcbmV4cG9ydCBjb25zdCBpbml0aWFsaXplQ29ubmVjdCA9IGZuID0+IHtcbiAgdXNlU3luY0V4dGVybmFsU3RvcmUgPSBmbjtcbn07IC8vIERlZmluZSBzb21lIGNvbnN0YW50IGFycmF5cyBqdXN0IHRvIGF2b2lkIHJlLWNyZWF0aW5nIHRoZXNlXG5cbmNvbnN0IEVNUFRZX0FSUkFZID0gW251bGwsIDBdO1xuY29uc3QgTk9fU1VCU0NSSVBUSU9OX0FSUkFZID0gW251bGwsIG51bGxdOyAvLyBBdHRlbXB0cyB0byBzdHJpbmdpZnkgd2hhdGV2ZXIgbm90LXJlYWxseS1hLWNvbXBvbmVudCB2YWx1ZSB3ZSB3ZXJlIGdpdmVuXG4vLyBmb3IgbG9nZ2luZyBpbiBhbiBlcnJvciBtZXNzYWdlXG5cbmNvbnN0IHN0cmluZ2lmeUNvbXBvbmVudCA9IENvbXAgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShDb21wKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIFN0cmluZyhDb21wKTtcbiAgfVxufTtcblxuLy8gVGhpcyBpcyBcImp1c3RcIiBhIGB1c2VMYXlvdXRFZmZlY3RgLCBidXQgd2l0aCB0d28gbW9kaWZpY2F0aW9uczpcbi8vIC0gd2UgbmVlZCB0byBmYWxsIGJhY2sgdG8gYHVzZUVmZmVjdGAgaW4gU1NSIHRvIGF2b2lkIGFubm95aW5nIHdhcm5pbmdzXG4vLyAtIHdlIGV4dHJhY3QgdGhpcyB0byBhIHNlcGFyYXRlIGZ1bmN0aW9uIHRvIGF2b2lkIGNsb3Npbmcgb3ZlciB2YWx1ZXNcbi8vICAgYW5kIGNhdXNpbmcgbWVtb3J5IGxlYWtzXG5mdW5jdGlvbiB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0V2l0aEFyZ3MoZWZmZWN0RnVuYywgZWZmZWN0QXJncywgZGVwZW5kZW5jaWVzKSB7XG4gIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QoKCkgPT4gZWZmZWN0RnVuYyguLi5lZmZlY3RBcmdzKSwgZGVwZW5kZW5jaWVzKTtcbn0gLy8gRWZmZWN0IGNhbGxiYWNrLCBleHRyYWN0ZWQ6IGFzc2lnbiB0aGUgbGF0ZXN0IHByb3BzIHZhbHVlcyB0byByZWZzIGZvciBsYXRlciB1c2FnZVxuXG5cbmZ1bmN0aW9uIGNhcHR1cmVXcmFwcGVyUHJvcHMobGFzdFdyYXBwZXJQcm9wcywgbGFzdENoaWxkUHJvcHMsIHJlbmRlcklzU2NoZWR1bGVkLCB3cmFwcGVyUHJvcHMsIC8vIGFjdHVhbENoaWxkUHJvcHM6IHVua25vd24sXG5jaGlsZFByb3BzRnJvbVN0b3JlVXBkYXRlLCBub3RpZnlOZXN0ZWRTdWJzKSB7XG4gIC8vIFdlIHdhbnQgdG8gY2FwdHVyZSB0aGUgd3JhcHBlciBwcm9wcyBhbmQgY2hpbGQgcHJvcHMgd2UgdXNlZCBmb3IgbGF0ZXIgY29tcGFyaXNvbnNcbiAgbGFzdFdyYXBwZXJQcm9wcy5jdXJyZW50ID0gd3JhcHBlclByb3BzO1xuICByZW5kZXJJc1NjaGVkdWxlZC5jdXJyZW50ID0gZmFsc2U7IC8vIElmIHRoZSByZW5kZXIgd2FzIGZyb20gYSBzdG9yZSB1cGRhdGUsIGNsZWFyIG91dCB0aGF0IHJlZmVyZW5jZSBhbmQgY2FzY2FkZSB0aGUgc3Vic2NyaWJlciB1cGRhdGVcblxuICBpZiAoY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZS5jdXJyZW50KSB7XG4gICAgY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZS5jdXJyZW50ID0gbnVsbDtcbiAgICBub3RpZnlOZXN0ZWRTdWJzKCk7XG4gIH1cbn0gLy8gRWZmZWN0IGNhbGxiYWNrLCBleHRyYWN0ZWQ6IHN1YnNjcmliZSB0byB0aGUgUmVkdXggc3RvcmUgb3IgbmVhcmVzdCBjb25uZWN0ZWQgYW5jZXN0b3IsXG4vLyBjaGVjayBmb3IgdXBkYXRlcyBhZnRlciBkaXNwYXRjaGVkIGFjdGlvbnMsIGFuZCB0cmlnZ2VyIHJlLXJlbmRlcnMuXG5cblxuZnVuY3Rpb24gc3Vic2NyaWJlVXBkYXRlcyhzaG91bGRIYW5kbGVTdGF0ZUNoYW5nZXMsIHN0b3JlLCBzdWJzY3JpcHRpb24sIGNoaWxkUHJvcHNTZWxlY3RvciwgbGFzdFdyYXBwZXJQcm9wcywgbGFzdENoaWxkUHJvcHMsIHJlbmRlcklzU2NoZWR1bGVkLCBpc01vdW50ZWQsIGNoaWxkUHJvcHNGcm9tU3RvcmVVcGRhdGUsIG5vdGlmeU5lc3RlZFN1YnMsIC8vIGZvcmNlQ29tcG9uZW50VXBkYXRlRGlzcGF0Y2g6IFJlYWN0LkRpc3BhdGNoPGFueT4sXG5hZGRpdGlvbmFsU3Vic2NyaWJlTGlzdGVuZXIpIHtcbiAgLy8gSWYgd2UncmUgbm90IHN1YnNjcmliZWQgdG8gdGhlIHN0b3JlLCBub3RoaW5nIHRvIGRvIGhlcmVcbiAgaWYgKCFzaG91bGRIYW5kbGVTdGF0ZUNoYW5nZXMpIHJldHVybiAoKSA9PiB7fTsgLy8gQ2FwdHVyZSB2YWx1ZXMgZm9yIGNoZWNraW5nIGlmIGFuZCB3aGVuIHRoaXMgY29tcG9uZW50IHVubW91bnRzXG5cbiAgbGV0IGRpZFVuc3Vic2NyaWJlID0gZmFsc2U7XG4gIGxldCBsYXN0VGhyb3duRXJyb3IgPSBudWxsOyAvLyBXZSdsbCBydW4gdGhpcyBjYWxsYmFjayBldmVyeSB0aW1lIGEgc3RvcmUgc3Vic2NyaXB0aW9uIHVwZGF0ZSBwcm9wYWdhdGVzIHRvIHRoaXMgY29tcG9uZW50XG5cbiAgY29uc3QgY2hlY2tGb3JVcGRhdGVzID0gKCkgPT4ge1xuICAgIGlmIChkaWRVbnN1YnNjcmliZSB8fCAhaXNNb3VudGVkLmN1cnJlbnQpIHtcbiAgICAgIC8vIERvbid0IHJ1biBzdGFsZSBsaXN0ZW5lcnMuXG4gICAgICAvLyBSZWR1eCBkb2Vzbid0IGd1YXJhbnRlZSB1bnN1YnNjcmlwdGlvbnMgaGFwcGVuIHVudGlsIG5leHQgZGlzcGF0Y2guXG4gICAgICByZXR1cm47XG4gICAgfSAvLyBUT0RPIFdlJ3JlIGN1cnJlbnRseSBjYWxsaW5nIGdldFN0YXRlIG91cnNlbHZlcyBoZXJlLCByYXRoZXIgdGhhbiBsZXR0aW5nIGB1U0VTYCBkbyBpdFxuXG5cbiAgICBjb25zdCBsYXRlc3RTdG9yZVN0YXRlID0gc3RvcmUuZ2V0U3RhdGUoKTtcbiAgICBsZXQgbmV3Q2hpbGRQcm9wcywgZXJyb3I7XG5cbiAgICB0cnkge1xuICAgICAgLy8gQWN0dWFsbHkgcnVuIHRoZSBzZWxlY3RvciB3aXRoIHRoZSBtb3N0IHJlY2VudCBzdG9yZSBzdGF0ZSBhbmQgd3JhcHBlciBwcm9wc1xuICAgICAgLy8gdG8gZGV0ZXJtaW5lIHdoYXQgdGhlIGNoaWxkIHByb3BzIHNob3VsZCBiZVxuICAgICAgbmV3Q2hpbGRQcm9wcyA9IGNoaWxkUHJvcHNTZWxlY3RvcihsYXRlc3RTdG9yZVN0YXRlLCBsYXN0V3JhcHBlclByb3BzLmN1cnJlbnQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9yID0gZTtcbiAgICAgIGxhc3RUaHJvd25FcnJvciA9IGU7XG4gICAgfVxuXG4gICAgaWYgKCFlcnJvcikge1xuICAgICAgbGFzdFRocm93bkVycm9yID0gbnVsbDtcbiAgICB9IC8vIElmIHRoZSBjaGlsZCBwcm9wcyBoYXZlbid0IGNoYW5nZWQsIG5vdGhpbmcgdG8gZG8gaGVyZSAtIGNhc2NhZGUgdGhlIHN1YnNjcmlwdGlvbiB1cGRhdGVcblxuXG4gICAgaWYgKG5ld0NoaWxkUHJvcHMgPT09IGxhc3RDaGlsZFByb3BzLmN1cnJlbnQpIHtcbiAgICAgIGlmICghcmVuZGVySXNTY2hlZHVsZWQuY3VycmVudCkge1xuICAgICAgICBub3RpZnlOZXN0ZWRTdWJzKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNhdmUgcmVmZXJlbmNlcyB0byB0aGUgbmV3IGNoaWxkIHByb3BzLiAgTm90ZSB0aGF0IHdlIHRyYWNrIHRoZSBcImNoaWxkIHByb3BzIGZyb20gc3RvcmUgdXBkYXRlXCJcbiAgICAgIC8vIGFzIGEgcmVmIGluc3RlYWQgb2YgYSB1c2VTdGF0ZS91c2VSZWR1Y2VyIGJlY2F1c2Ugd2UgbmVlZCBhIHdheSB0byBkZXRlcm1pbmUgaWYgdGhhdCB2YWx1ZSBoYXNcbiAgICAgIC8vIGJlZW4gcHJvY2Vzc2VkLiAgSWYgdGhpcyB3ZW50IGludG8gdXNlU3RhdGUvdXNlUmVkdWNlciwgd2UgY291bGRuJ3QgY2xlYXIgb3V0IHRoZSB2YWx1ZSB3aXRob3V0XG4gICAgICAvLyBmb3JjaW5nIGFub3RoZXIgcmUtcmVuZGVyLCB3aGljaCB3ZSBkb24ndCB3YW50LlxuICAgICAgbGFzdENoaWxkUHJvcHMuY3VycmVudCA9IG5ld0NoaWxkUHJvcHM7XG4gICAgICBjaGlsZFByb3BzRnJvbVN0b3JlVXBkYXRlLmN1cnJlbnQgPSBuZXdDaGlsZFByb3BzO1xuICAgICAgcmVuZGVySXNTY2hlZHVsZWQuY3VycmVudCA9IHRydWU7IC8vIFRPRE8gVGhpcyBpcyBoYWNreSBhbmQgbm90IGhvdyBgdVNFU2AgaXMgbWVhbnQgdG8gYmUgdXNlZFxuICAgICAgLy8gVHJpZ2dlciB0aGUgUmVhY3QgYHVzZVN5bmNFeHRlcm5hbFN0b3JlYCBzdWJzY3JpYmVyXG5cbiAgICAgIGFkZGl0aW9uYWxTdWJzY3JpYmVMaXN0ZW5lcigpO1xuICAgIH1cbiAgfTsgLy8gQWN0dWFsbHkgc3Vic2NyaWJlIHRvIHRoZSBuZWFyZXN0IGNvbm5lY3RlZCBhbmNlc3RvciAob3Igc3RvcmUpXG5cblxuICBzdWJzY3JpcHRpb24ub25TdGF0ZUNoYW5nZSA9IGNoZWNrRm9yVXBkYXRlcztcbiAgc3Vic2NyaXB0aW9uLnRyeVN1YnNjcmliZSgpOyAvLyBQdWxsIGRhdGEgZnJvbSB0aGUgc3RvcmUgYWZ0ZXIgZmlyc3QgcmVuZGVyIGluIGNhc2UgdGhlIHN0b3JlIGhhc1xuICAvLyBjaGFuZ2VkIHNpbmNlIHdlIGJlZ2FuLlxuXG4gIGNoZWNrRm9yVXBkYXRlcygpO1xuXG4gIGNvbnN0IHVuc3Vic2NyaWJlV3JhcHBlciA9ICgpID0+IHtcbiAgICBkaWRVbnN1YnNjcmliZSA9IHRydWU7XG4gICAgc3Vic2NyaXB0aW9uLnRyeVVuc3Vic2NyaWJlKCk7XG4gICAgc3Vic2NyaXB0aW9uLm9uU3RhdGVDaGFuZ2UgPSBudWxsO1xuXG4gICAgaWYgKGxhc3RUaHJvd25FcnJvcikge1xuICAgICAgLy8gSXQncyBwb3NzaWJsZSB0aGF0IHdlIGNhdWdodCBhbiBlcnJvciBkdWUgdG8gYSBiYWQgbWFwU3RhdGUgZnVuY3Rpb24sIGJ1dCB0aGVcbiAgICAgIC8vIHBhcmVudCByZS1yZW5kZXJlZCB3aXRob3V0IHRoaXMgY29tcG9uZW50IGFuZCB3ZSdyZSBhYm91dCB0byB1bm1vdW50LlxuICAgICAgLy8gVGhpcyBzaG91bGRuJ3QgaGFwcGVuIGFzIGxvbmcgYXMgd2UgZG8gdG9wLWRvd24gc3Vic2NyaXB0aW9ucyBjb3JyZWN0bHksIGJ1dFxuICAgICAgLy8gaWYgd2UgZXZlciBkbyB0aG9zZSB3cm9uZywgdGhpcyB0aHJvdyB3aWxsIHN1cmZhY2UgdGhlIGVycm9yIGluIG91ciB0ZXN0cy5cbiAgICAgIC8vIEluIHRoYXQgY2FzZSwgdGhyb3cgdGhlIGVycm9yIGZyb20gaGVyZSBzbyBpdCBkb2Vzbid0IGdldCBsb3N0LlxuICAgICAgdGhyb3cgbGFzdFRocm93bkVycm9yO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gdW5zdWJzY3JpYmVXcmFwcGVyO1xufSAvLyBSZWR1Y2VyIGluaXRpYWwgc3RhdGUgY3JlYXRpb24gZm9yIG91ciB1cGRhdGUgcmVkdWNlclxuXG5cbmNvbnN0IGluaXRTdGF0ZVVwZGF0ZXMgPSAoKSA9PiBFTVBUWV9BUlJBWTtcblxuZnVuY3Rpb24gc3RyaWN0RXF1YWwoYSwgYikge1xuICByZXR1cm4gYSA9PT0gYjtcbn1cbi8qKlxyXG4gKiBJbmZlcnMgdGhlIHR5cGUgb2YgcHJvcHMgdGhhdCBhIGNvbm5lY3RvciB3aWxsIGluamVjdCBpbnRvIGEgY29tcG9uZW50LlxyXG4gKi9cblxuXG5sZXQgaGFzV2FybmVkQWJvdXREZXByZWNhdGVkUHVyZU9wdGlvbiA9IGZhbHNlO1xuLyoqXHJcbiAqIENvbm5lY3RzIGEgUmVhY3QgY29tcG9uZW50IHRvIGEgUmVkdXggc3RvcmUuXHJcbiAqXHJcbiAqIC0gV2l0aG91dCBhcmd1bWVudHMsIGp1c3Qgd3JhcHMgdGhlIGNvbXBvbmVudCwgd2l0aG91dCBjaGFuZ2luZyB0aGUgYmVoYXZpb3IgLyBwcm9wc1xyXG4gKlxyXG4gKiAtIElmIDIgcGFyYW1zIGFyZSBwYXNzZWQgKDNyZCBwYXJhbSwgbWVyZ2VQcm9wcywgaXMgc2tpcHBlZCksIGRlZmF1bHQgYmVoYXZpb3JcclxuICogaXMgdG8gb3ZlcnJpZGUgb3duUHJvcHMgKGFzIHN0YXRlZCBpbiB0aGUgZG9jcyksIHNvIHdoYXQgcmVtYWlucyBpcyBldmVyeXRoaW5nIHRoYXQnc1xyXG4gKiBub3QgYSBzdGF0ZSBvciBkaXNwYXRjaCBwcm9wXHJcbiAqXHJcbiAqIC0gV2hlbiAzcmQgcGFyYW0gaXMgcGFzc2VkLCB3ZSBkb24ndCBrbm93IGlmIG93blByb3BzIHByb3BhZ2F0ZSBhbmQgd2hldGhlciB0aGV5XHJcbiAqIHNob3VsZCBiZSB2YWxpZCBjb21wb25lbnQgcHJvcHMsIGJlY2F1c2UgaXQgZGVwZW5kcyBvbiBtZXJnZVByb3BzIGltcGxlbWVudGF0aW9uLlxyXG4gKiBBcyBzdWNoLCBpdCBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGV4dGVuZCBvd25Qcm9wcyBpbnRlcmZhY2UgZnJvbSBzdGF0ZSBvclxyXG4gKiBkaXNwYXRjaCBwcm9wcyBvciBib3RoIHdoZW4gYXBwbGljYWJsZVxyXG4gKlxyXG4gKiBAcGFyYW0gbWFwU3RhdGVUb1Byb3BzIEEgZnVuY3Rpb24gdGhhdCBleHRyYWN0cyB2YWx1ZXMgZnJvbSBzdGF0ZVxyXG4gKiBAcGFyYW0gbWFwRGlzcGF0Y2hUb1Byb3BzIFNldHVwIGZvciBkaXNwYXRjaGluZyBhY3Rpb25zXHJcbiAqIEBwYXJhbSBtZXJnZVByb3BzIE9wdGlvbmFsIGNhbGxiYWNrIHRvIG1lcmdlIHN0YXRlIGFuZCBkaXNwYXRjaCBwcm9wcyB0b2dldGhlclxyXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciBjb25maWd1cmluZyB0aGUgY29ubmVjdGlvblxyXG4gKlxyXG4gKi9cblxuZnVuY3Rpb24gY29ubmVjdChtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcywgbWVyZ2VQcm9wcywge1xuICAvLyBUaGUgYHB1cmVgIG9wdGlvbiBoYXMgYmVlbiByZW1vdmVkLCBzbyBUUyBkb2Vzbid0IGxpa2UgdXMgZGVzdHJ1Y3R1cmluZyB0aGlzIHRvIGNoZWNrIGl0cyBleGlzdGVuY2UuXG4gIC8vIEB0cy1pZ25vcmVcbiAgcHVyZSxcbiAgYXJlU3RhdGVzRXF1YWwgPSBzdHJpY3RFcXVhbCxcbiAgYXJlT3duUHJvcHNFcXVhbCA9IHNoYWxsb3dFcXVhbCxcbiAgYXJlU3RhdGVQcm9wc0VxdWFsID0gc2hhbGxvd0VxdWFsLFxuICBhcmVNZXJnZWRQcm9wc0VxdWFsID0gc2hhbGxvd0VxdWFsLFxuICAvLyB1c2UgUmVhY3QncyBmb3J3YXJkUmVmIHRvIGV4cG9zZSBhIHJlZiBvZiB0aGUgd3JhcHBlZCBjb21wb25lbnRcbiAgZm9yd2FyZFJlZiA9IGZhbHNlLFxuICAvLyB0aGUgY29udGV4dCBjb25zdW1lciB0byB1c2VcbiAgY29udGV4dCA9IFJlYWN0UmVkdXhDb250ZXh0XG59ID0ge30pIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBpZiAocHVyZSAhPT0gdW5kZWZpbmVkICYmICFoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRQdXJlT3B0aW9uKSB7XG4gICAgICBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRQdXJlT3B0aW9uID0gdHJ1ZTtcbiAgICAgIHdhcm5pbmcoJ1RoZSBgcHVyZWAgb3B0aW9uIGhhcyBiZWVuIHJlbW92ZWQuIGBjb25uZWN0YCBpcyBub3cgYWx3YXlzIGEgXCJwdXJlL21lbW9pemVkXCIgY29tcG9uZW50Jyk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgQ29udGV4dCA9IGNvbnRleHQ7XG4gIGNvbnN0IGluaXRNYXBTdGF0ZVRvUHJvcHMgPSBtYXBTdGF0ZVRvUHJvcHNGYWN0b3J5KG1hcFN0YXRlVG9Qcm9wcyk7XG4gIGNvbnN0IGluaXRNYXBEaXNwYXRjaFRvUHJvcHMgPSBtYXBEaXNwYXRjaFRvUHJvcHNGYWN0b3J5KG1hcERpc3BhdGNoVG9Qcm9wcyk7XG4gIGNvbnN0IGluaXRNZXJnZVByb3BzID0gbWVyZ2VQcm9wc0ZhY3RvcnkobWVyZ2VQcm9wcyk7XG4gIGNvbnN0IHNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlcyA9IEJvb2xlYW4obWFwU3RhdGVUb1Byb3BzKTtcblxuICBjb25zdCB3cmFwV2l0aENvbm5lY3QgPSBXcmFwcGVkQ29tcG9uZW50ID0+IHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiAhaXNWYWxpZEVsZW1lbnRUeXBlKFdyYXBwZWRDb21wb25lbnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFlvdSBtdXN0IHBhc3MgYSBjb21wb25lbnQgdG8gdGhlIGZ1bmN0aW9uIHJldHVybmVkIGJ5IGNvbm5lY3QuIEluc3RlYWQgcmVjZWl2ZWQgJHtzdHJpbmdpZnlDb21wb25lbnQoV3JhcHBlZENvbXBvbmVudCl9YCk7XG4gICAgfVxuXG4gICAgY29uc3Qgd3JhcHBlZENvbXBvbmVudE5hbWUgPSBXcmFwcGVkQ29tcG9uZW50LmRpc3BsYXlOYW1lIHx8IFdyYXBwZWRDb21wb25lbnQubmFtZSB8fCAnQ29tcG9uZW50JztcbiAgICBjb25zdCBkaXNwbGF5TmFtZSA9IGBDb25uZWN0KCR7d3JhcHBlZENvbXBvbmVudE5hbWV9KWA7XG4gICAgY29uc3Qgc2VsZWN0b3JGYWN0b3J5T3B0aW9ucyA9IHtcbiAgICAgIHNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlcyxcbiAgICAgIGRpc3BsYXlOYW1lLFxuICAgICAgd3JhcHBlZENvbXBvbmVudE5hbWUsXG4gICAgICBXcmFwcGVkQ29tcG9uZW50LFxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgaW5pdE1hcFN0YXRlVG9Qcm9wcyxcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGluaXRNYXBEaXNwYXRjaFRvUHJvcHMsXG4gICAgICBpbml0TWVyZ2VQcm9wcyxcbiAgICAgIGFyZVN0YXRlc0VxdWFsLFxuICAgICAgYXJlU3RhdGVQcm9wc0VxdWFsLFxuICAgICAgYXJlT3duUHJvcHNFcXVhbCxcbiAgICAgIGFyZU1lcmdlZFByb3BzRXF1YWxcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gQ29ubmVjdEZ1bmN0aW9uKHByb3BzKSB7XG4gICAgICBjb25zdCBbcHJvcHNDb250ZXh0LCByZWFjdFJlZHV4Rm9yd2FyZGVkUmVmLCB3cmFwcGVyUHJvcHNdID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgICAgIC8vIERpc3Rpbmd1aXNoIGJldHdlZW4gYWN0dWFsIFwiZGF0YVwiIHByb3BzIHRoYXQgd2VyZSBwYXNzZWQgdG8gdGhlIHdyYXBwZXIgY29tcG9uZW50LFxuICAgICAgICAvLyBhbmQgdmFsdWVzIG5lZWRlZCB0byBjb250cm9sIGJlaGF2aW9yIChmb3J3YXJkZWQgcmVmcywgYWx0ZXJuYXRlIGNvbnRleHQgaW5zdGFuY2VzKS5cbiAgICAgICAgLy8gVG8gbWFpbnRhaW4gdGhlIHdyYXBwZXJQcm9wcyBvYmplY3QgcmVmZXJlbmNlLCBtZW1vaXplIHRoaXMgZGVzdHJ1Y3R1cmluZy5cbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHJlYWN0UmVkdXhGb3J3YXJkZWRSZWZcbiAgICAgICAgfSA9IHByb3BzLFxuICAgICAgICAgICAgICB3cmFwcGVyUHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShwcm9wcywgX2V4Y2x1ZGVkKTtcblxuICAgICAgICByZXR1cm4gW3Byb3BzLmNvbnRleHQsIHJlYWN0UmVkdXhGb3J3YXJkZWRSZWYsIHdyYXBwZXJQcm9wc107XG4gICAgICB9LCBbcHJvcHNdKTtcbiAgICAgIGNvbnN0IENvbnRleHRUb1VzZSA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgICAgICAvLyBVc2VycyBtYXkgb3B0aW9uYWxseSBwYXNzIGluIGEgY3VzdG9tIGNvbnRleHQgaW5zdGFuY2UgdG8gdXNlIGluc3RlYWQgb2Ygb3VyIFJlYWN0UmVkdXhDb250ZXh0LlxuICAgICAgICAvLyBNZW1vaXplIHRoZSBjaGVjayB0aGF0IGRldGVybWluZXMgd2hpY2ggY29udGV4dCBpbnN0YW5jZSB3ZSBzaG91bGQgdXNlLlxuICAgICAgICByZXR1cm4gcHJvcHNDb250ZXh0ICYmIHByb3BzQ29udGV4dC5Db25zdW1lciAmJiAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlzQ29udGV4dENvbnN1bWVyKCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChwcm9wc0NvbnRleHQuQ29uc3VtZXIsIG51bGwpKSA/IHByb3BzQ29udGV4dCA6IENvbnRleHQ7XG4gICAgICB9LCBbcHJvcHNDb250ZXh0LCBDb250ZXh0XSk7IC8vIFJldHJpZXZlIHRoZSBzdG9yZSBhbmQgYW5jZXN0b3Igc3Vic2NyaXB0aW9uIHZpYSBjb250ZXh0LCBpZiBhdmFpbGFibGVcblxuICAgICAgY29uc3QgY29udGV4dFZhbHVlID0gUmVhY3QudXNlQ29udGV4dChDb250ZXh0VG9Vc2UpOyAvLyBUaGUgc3RvcmUgX211c3RfIGV4aXN0IGFzIGVpdGhlciBhIHByb3Agb3IgaW4gY29udGV4dC5cbiAgICAgIC8vIFdlJ2xsIGNoZWNrIHRvIHNlZSBpZiBpdCBfbG9va3NfIGxpa2UgYSBSZWR1eCBzdG9yZSBmaXJzdC5cbiAgICAgIC8vIFRoaXMgYWxsb3dzIHVzIHRvIHBhc3MgdGhyb3VnaCBhIGBzdG9yZWAgcHJvcCB0aGF0IGlzIGp1c3QgYSBwbGFpbiB2YWx1ZS5cblxuICAgICAgY29uc3QgZGlkU3RvcmVDb21lRnJvbVByb3BzID0gQm9vbGVhbihwcm9wcy5zdG9yZSkgJiYgQm9vbGVhbihwcm9wcy5zdG9yZS5nZXRTdGF0ZSkgJiYgQm9vbGVhbihwcm9wcy5zdG9yZS5kaXNwYXRjaCk7XG4gICAgICBjb25zdCBkaWRTdG9yZUNvbWVGcm9tQ29udGV4dCA9IEJvb2xlYW4oY29udGV4dFZhbHVlKSAmJiBCb29sZWFuKGNvbnRleHRWYWx1ZS5zdG9yZSk7XG5cbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmICFkaWRTdG9yZUNvbWVGcm9tUHJvcHMgJiYgIWRpZFN0b3JlQ29tZUZyb21Db250ZXh0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgXCJzdG9yZVwiIGluIHRoZSBjb250ZXh0IG9mIGAgKyBgXCIke2Rpc3BsYXlOYW1lfVwiLiBFaXRoZXIgd3JhcCB0aGUgcm9vdCBjb21wb25lbnQgaW4gYSA8UHJvdmlkZXI+LCBgICsgYG9yIHBhc3MgYSBjdXN0b20gUmVhY3QgY29udGV4dCBwcm92aWRlciB0byA8UHJvdmlkZXI+IGFuZCB0aGUgY29ycmVzcG9uZGluZyBgICsgYFJlYWN0IGNvbnRleHQgY29uc3VtZXIgdG8gJHtkaXNwbGF5TmFtZX0gaW4gY29ubmVjdCBvcHRpb25zLmApO1xuICAgICAgfSAvLyBCYXNlZCBvbiB0aGUgcHJldmlvdXMgY2hlY2ssIG9uZSBvZiB0aGVzZSBtdXN0IGJlIHRydWVcblxuXG4gICAgICBjb25zdCBzdG9yZSA9IGRpZFN0b3JlQ29tZUZyb21Qcm9wcyA/IHByb3BzLnN0b3JlIDogY29udGV4dFZhbHVlLnN0b3JlO1xuICAgICAgY29uc3QgZ2V0U2VydmVyU3RhdGUgPSBkaWRTdG9yZUNvbWVGcm9tQ29udGV4dCA/IGNvbnRleHRWYWx1ZS5nZXRTZXJ2ZXJTdGF0ZSA6IHN0b3JlLmdldFN0YXRlO1xuICAgICAgY29uc3QgY2hpbGRQcm9wc1NlbGVjdG9yID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgICAgIC8vIFRoZSBjaGlsZCBwcm9wcyBzZWxlY3RvciBuZWVkcyB0aGUgc3RvcmUgcmVmZXJlbmNlIGFzIGFuIGlucHV0LlxuICAgICAgICAvLyBSZS1jcmVhdGUgdGhpcyBzZWxlY3RvciB3aGVuZXZlciB0aGUgc3RvcmUgY2hhbmdlcy5cbiAgICAgICAgcmV0dXJuIGRlZmF1bHRTZWxlY3RvckZhY3Rvcnkoc3RvcmUuZGlzcGF0Y2gsIHNlbGVjdG9yRmFjdG9yeU9wdGlvbnMpO1xuICAgICAgfSwgW3N0b3JlXSk7XG4gICAgICBjb25zdCBbc3Vic2NyaXB0aW9uLCBub3RpZnlOZXN0ZWRTdWJzXSA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgICAgICBpZiAoIXNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlcykgcmV0dXJuIE5PX1NVQlNDUklQVElPTl9BUlJBWTsgLy8gVGhpcyBTdWJzY3JpcHRpb24ncyBzb3VyY2Ugc2hvdWxkIG1hdGNoIHdoZXJlIHN0b3JlIGNhbWUgZnJvbTogcHJvcHMgdnMuIGNvbnRleHQuIEEgY29tcG9uZW50XG4gICAgICAgIC8vIGNvbm5lY3RlZCB0byB0aGUgc3RvcmUgdmlhIHByb3BzIHNob3VsZG4ndCB1c2Ugc3Vic2NyaXB0aW9uIGZyb20gY29udGV4dCwgb3IgdmljZSB2ZXJzYS5cblxuICAgICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSBjcmVhdGVTdWJzY3JpcHRpb24oc3RvcmUsIGRpZFN0b3JlQ29tZUZyb21Qcm9wcyA/IHVuZGVmaW5lZCA6IGNvbnRleHRWYWx1ZS5zdWJzY3JpcHRpb24pOyAvLyBgbm90aWZ5TmVzdGVkU3Vic2AgaXMgZHVwbGljYXRlZCB0byBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIGNvbXBvbmVudCBpcyB1bm1vdW50ZWQgaW5cbiAgICAgICAgLy8gdGhlIG1pZGRsZSBvZiB0aGUgbm90aWZpY2F0aW9uIGxvb3AsIHdoZXJlIGBzdWJzY3JpcHRpb25gIHdpbGwgdGhlbiBiZSBudWxsLiBUaGlzIGNhblxuICAgICAgICAvLyBwcm9iYWJseSBiZSBhdm9pZGVkIGlmIFN1YnNjcmlwdGlvbidzIGxpc3RlbmVycyBsb2dpYyBpcyBjaGFuZ2VkIHRvIG5vdCBjYWxsIGxpc3RlbmVyc1xuICAgICAgICAvLyB0aGF0IGhhdmUgYmVlbiB1bnN1YnNjcmliZWQgaW4gdGhlICBtaWRkbGUgb2YgdGhlIG5vdGlmaWNhdGlvbiBsb29wLlxuXG4gICAgICAgIGNvbnN0IG5vdGlmeU5lc3RlZFN1YnMgPSBzdWJzY3JpcHRpb24ubm90aWZ5TmVzdGVkU3Vicy5iaW5kKHN1YnNjcmlwdGlvbik7XG4gICAgICAgIHJldHVybiBbc3Vic2NyaXB0aW9uLCBub3RpZnlOZXN0ZWRTdWJzXTtcbiAgICAgIH0sIFtzdG9yZSwgZGlkU3RvcmVDb21lRnJvbVByb3BzLCBjb250ZXh0VmFsdWVdKTsgLy8gRGV0ZXJtaW5lIHdoYXQge3N0b3JlLCBzdWJzY3JpcHRpb259IHZhbHVlIHNob3VsZCBiZSBwdXQgaW50byBuZXN0ZWQgY29udGV4dCwgaWYgbmVjZXNzYXJ5LFxuICAgICAgLy8gYW5kIG1lbW9pemUgdGhhdCB2YWx1ZSB0byBhdm9pZCB1bm5lY2Vzc2FyeSBjb250ZXh0IHVwZGF0ZXMuXG5cbiAgICAgIGNvbnN0IG92ZXJyaWRkZW5Db250ZXh0VmFsdWUgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICAgICAgaWYgKGRpZFN0b3JlQ29tZUZyb21Qcm9wcykge1xuICAgICAgICAgIC8vIFRoaXMgY29tcG9uZW50IGlzIGRpcmVjdGx5IHN1YnNjcmliZWQgdG8gYSBzdG9yZSBmcm9tIHByb3BzLlxuICAgICAgICAgIC8vIFdlIGRvbid0IHdhbnQgZGVzY2VuZGFudHMgcmVhZGluZyBmcm9tIHRoaXMgc3RvcmUgLSBwYXNzIGRvd24gd2hhdGV2ZXJcbiAgICAgICAgICAvLyB0aGUgZXhpc3RpbmcgY29udGV4dCB2YWx1ZSBpcyBmcm9tIHRoZSBuZWFyZXN0IGNvbm5lY3RlZCBhbmNlc3Rvci5cbiAgICAgICAgICByZXR1cm4gY29udGV4dFZhbHVlO1xuICAgICAgICB9IC8vIE90aGVyd2lzZSwgcHV0IHRoaXMgY29tcG9uZW50J3Mgc3Vic2NyaXB0aW9uIGluc3RhbmNlIGludG8gY29udGV4dCwgc28gdGhhdFxuICAgICAgICAvLyBjb25uZWN0ZWQgZGVzY2VuZGFudHMgd29uJ3QgdXBkYXRlIHVudGlsIGFmdGVyIHRoaXMgY29tcG9uZW50IGlzIGRvbmVcblxuXG4gICAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgY29udGV4dFZhbHVlLCB7XG4gICAgICAgICAgc3Vic2NyaXB0aW9uXG4gICAgICAgIH0pO1xuICAgICAgfSwgW2RpZFN0b3JlQ29tZUZyb21Qcm9wcywgY29udGV4dFZhbHVlLCBzdWJzY3JpcHRpb25dKTsgLy8gU2V0IHVwIHJlZnMgdG8gY29vcmRpbmF0ZSB2YWx1ZXMgYmV0d2VlbiB0aGUgc3Vic2NyaXB0aW9uIGVmZmVjdCBhbmQgdGhlIHJlbmRlciBsb2dpY1xuXG4gICAgICBjb25zdCBsYXN0Q2hpbGRQcm9wcyA9IFJlYWN0LnVzZVJlZigpO1xuICAgICAgY29uc3QgbGFzdFdyYXBwZXJQcm9wcyA9IFJlYWN0LnVzZVJlZih3cmFwcGVyUHJvcHMpO1xuICAgICAgY29uc3QgY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZSA9IFJlYWN0LnVzZVJlZigpO1xuICAgICAgY29uc3QgcmVuZGVySXNTY2hlZHVsZWQgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICAgICAgY29uc3QgaXNQcm9jZXNzaW5nRGlzcGF0Y2ggPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICAgICAgY29uc3QgaXNNb3VudGVkID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcbiAgICAgIGNvbnN0IGxhdGVzdFN1YnNjcmlwdGlvbkNhbGxiYWNrRXJyb3IgPSBSZWFjdC51c2VSZWYoKTtcbiAgICAgIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpc01vdW50ZWQuY3VycmVudCA9IHRydWU7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgaXNNb3VudGVkLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgICAgfTtcbiAgICAgIH0sIFtdKTtcbiAgICAgIGNvbnN0IGFjdHVhbENoaWxkUHJvcHNTZWxlY3RvciA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgICAgICBjb25zdCBzZWxlY3RvciA9ICgpID0+IHtcbiAgICAgICAgICAvLyBUcmlja3kgbG9naWMgaGVyZTpcbiAgICAgICAgICAvLyAtIFRoaXMgcmVuZGVyIG1heSBoYXZlIGJlZW4gdHJpZ2dlcmVkIGJ5IGEgUmVkdXggc3RvcmUgdXBkYXRlIHRoYXQgcHJvZHVjZWQgbmV3IGNoaWxkIHByb3BzXG4gICAgICAgICAgLy8gLSBIb3dldmVyLCB3ZSBtYXkgaGF2ZSBnb3R0ZW4gbmV3IHdyYXBwZXIgcHJvcHMgYWZ0ZXIgdGhhdFxuICAgICAgICAgIC8vIElmIHdlIGhhdmUgbmV3IGNoaWxkIHByb3BzLCBhbmQgdGhlIHNhbWUgd3JhcHBlciBwcm9wcywgd2Uga25vdyB3ZSBzaG91bGQgdXNlIHRoZSBuZXcgY2hpbGQgcHJvcHMgYXMtaXMuXG4gICAgICAgICAgLy8gQnV0LCBpZiB3ZSBoYXZlIG5ldyB3cmFwcGVyIHByb3BzLCB0aG9zZSBtaWdodCBjaGFuZ2UgdGhlIGNoaWxkIHByb3BzLCBzbyB3ZSBoYXZlIHRvIHJlY2FsY3VsYXRlIHRoaW5ncy5cbiAgICAgICAgICAvLyBTbywgd2UnbGwgdXNlIHRoZSBjaGlsZCBwcm9wcyBmcm9tIHN0b3JlIHVwZGF0ZSBvbmx5IGlmIHRoZSB3cmFwcGVyIHByb3BzIGFyZSB0aGUgc2FtZSBhcyBsYXN0IHRpbWUuXG4gICAgICAgICAgaWYgKGNoaWxkUHJvcHNGcm9tU3RvcmVVcGRhdGUuY3VycmVudCAmJiB3cmFwcGVyUHJvcHMgPT09IGxhc3RXcmFwcGVyUHJvcHMuY3VycmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGNoaWxkUHJvcHNGcm9tU3RvcmVVcGRhdGUuY3VycmVudDtcbiAgICAgICAgICB9IC8vIFRPRE8gV2UncmUgcmVhZGluZyB0aGUgc3RvcmUgZGlyZWN0bHkgaW4gcmVuZGVyKCkgaGVyZS4gQmFkIGlkZWE/XG4gICAgICAgICAgLy8gVGhpcyB3aWxsIGxpa2VseSBjYXVzZSBCYWQgVGhpbmdzIChUTSkgdG8gaGFwcGVuIGluIENvbmN1cnJlbnQgTW9kZS5cbiAgICAgICAgICAvLyBOb3RlIHRoYXQgd2UgZG8gdGhpcyBiZWNhdXNlIG9uIHJlbmRlcnMgX25vdF8gY2F1c2VkIGJ5IHN0b3JlIHVwZGF0ZXMsIHdlIG5lZWQgdGhlIGxhdGVzdCBzdG9yZSBzdGF0ZVxuICAgICAgICAgIC8vIHRvIGRldGVybWluZSB3aGF0IHRoZSBjaGlsZCBwcm9wcyBzaG91bGQgYmUuXG5cblxuICAgICAgICAgIHJldHVybiBjaGlsZFByb3BzU2VsZWN0b3Ioc3RvcmUuZ2V0U3RhdGUoKSwgd3JhcHBlclByb3BzKTtcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gc2VsZWN0b3I7XG4gICAgICB9LCBbc3RvcmUsIHdyYXBwZXJQcm9wc10pOyAvLyBXZSBuZWVkIHRoaXMgdG8gZXhlY3V0ZSBzeW5jaHJvbm91c2x5IGV2ZXJ5IHRpbWUgd2UgcmUtcmVuZGVyLiBIb3dldmVyLCBSZWFjdCB3YXJuc1xuICAgICAgLy8gYWJvdXQgdXNlTGF5b3V0RWZmZWN0IGluIFNTUiwgc28gd2UgdHJ5IHRvIGRldGVjdCBlbnZpcm9ubWVudCBhbmQgZmFsbCBiYWNrIHRvXG4gICAgICAvLyBqdXN0IHVzZUVmZmVjdCBpbnN0ZWFkIHRvIGF2b2lkIHRoZSB3YXJuaW5nLCBzaW5jZSBuZWl0aGVyIHdpbGwgcnVuIGFueXdheS5cblxuICAgICAgY29uc3Qgc3Vic2NyaWJlRm9yUmVhY3QgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICAgICAgY29uc3Qgc3Vic2NyaWJlID0gcmVhY3RMaXN0ZW5lciA9PiB7XG4gICAgICAgICAgaWYgKCFzdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7fTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gc3Vic2NyaWJlVXBkYXRlcyhzaG91bGRIYW5kbGVTdGF0ZUNoYW5nZXMsIHN0b3JlLCBzdWJzY3JpcHRpb24sIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICBjaGlsZFByb3BzU2VsZWN0b3IsIGxhc3RXcmFwcGVyUHJvcHMsIGxhc3RDaGlsZFByb3BzLCByZW5kZXJJc1NjaGVkdWxlZCwgaXNNb3VudGVkLCBjaGlsZFByb3BzRnJvbVN0b3JlVXBkYXRlLCBub3RpZnlOZXN0ZWRTdWJzLCByZWFjdExpc3RlbmVyKTtcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gc3Vic2NyaWJlO1xuICAgICAgfSwgW3N1YnNjcmlwdGlvbl0pO1xuICAgICAgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdFdpdGhBcmdzKGNhcHR1cmVXcmFwcGVyUHJvcHMsIFtsYXN0V3JhcHBlclByb3BzLCBsYXN0Q2hpbGRQcm9wcywgcmVuZGVySXNTY2hlZHVsZWQsIHdyYXBwZXJQcm9wcywgY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZSwgbm90aWZ5TmVzdGVkU3Vic10pO1xuICAgICAgbGV0IGFjdHVhbENoaWxkUHJvcHM7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGFjdHVhbENoaWxkUHJvcHMgPSB1c2VTeW5jRXh0ZXJuYWxTdG9yZSggLy8gVE9ETyBXZSdyZSBwYXNzaW5nIHRocm91Z2ggYSBiaWcgd3JhcHBlciB0aGF0IGRvZXMgYSBidW5jaCBvZiBleHRyYSBzaWRlIGVmZmVjdHMgYmVzaWRlcyBzdWJzY3JpYmluZ1xuICAgICAgICBzdWJzY3JpYmVGb3JSZWFjdCwgLy8gVE9ETyBUaGlzIGlzIGluY3JlZGlibHkgaGFja3kuIFdlJ3ZlIGFscmVhZHkgcHJvY2Vzc2VkIHRoZSBzdG9yZSB1cGRhdGUgYW5kIGNhbGN1bGF0ZWQgbmV3IGNoaWxkIHByb3BzLFxuICAgICAgICAvLyBUT0RPIGFuZCB3ZSdyZSBqdXN0IHBhc3NpbmcgdGhhdCB0aHJvdWdoIHNvIGl0IHRyaWdnZXJzIGEgcmUtcmVuZGVyIGZvciB1cyByYXRoZXIgdGhhbiByZWx5aW5nIG9uIGB1U0VTYC5cbiAgICAgICAgYWN0dWFsQ2hpbGRQcm9wc1NlbGVjdG9yLCBnZXRTZXJ2ZXJTdGF0ZSA/ICgpID0+IGNoaWxkUHJvcHNTZWxlY3RvcihnZXRTZXJ2ZXJTdGF0ZSgpLCB3cmFwcGVyUHJvcHMpIDogYWN0dWFsQ2hpbGRQcm9wc1NlbGVjdG9yKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAobGF0ZXN0U3Vic2NyaXB0aW9uQ2FsbGJhY2tFcnJvci5jdXJyZW50KSB7XG4gICAgICAgICAgO1xuICAgICAgICAgIGVyci5tZXNzYWdlICs9IGBcXG5UaGUgZXJyb3IgbWF5IGJlIGNvcnJlbGF0ZWQgd2l0aCB0aGlzIHByZXZpb3VzIGVycm9yOlxcbiR7bGF0ZXN0U3Vic2NyaXB0aW9uQ2FsbGJhY2tFcnJvci5jdXJyZW50LnN0YWNrfVxcblxcbmA7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG5cbiAgICAgIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgICAgICBsYXRlc3RTdWJzY3JpcHRpb25DYWxsYmFja0Vycm9yLmN1cnJlbnQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGNoaWxkUHJvcHNGcm9tU3RvcmVVcGRhdGUuY3VycmVudCA9IHVuZGVmaW5lZDtcbiAgICAgICAgbGFzdENoaWxkUHJvcHMuY3VycmVudCA9IGFjdHVhbENoaWxkUHJvcHM7XG4gICAgICB9KTsgLy8gTm93IHRoYXQgYWxsIHRoYXQncyBkb25lLCB3ZSBjYW4gZmluYWxseSB0cnkgdG8gYWN0dWFsbHkgcmVuZGVyIHRoZSBjaGlsZCBjb21wb25lbnQuXG4gICAgICAvLyBXZSBtZW1vaXplIHRoZSBlbGVtZW50cyBmb3IgdGhlIHJlbmRlcmVkIGNoaWxkIGNvbXBvbmVudCBhcyBhbiBvcHRpbWl6YXRpb24uXG5cbiAgICAgIGNvbnN0IHJlbmRlcmVkV3JhcHBlZENvbXBvbmVudCA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIC8qI19fUFVSRV9fKi9cbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChXcmFwcGVkQ29tcG9uZW50LCBfZXh0ZW5kcyh7fSwgYWN0dWFsQ2hpbGRQcm9wcywge1xuICAgICAgICAgICAgcmVmOiByZWFjdFJlZHV4Rm9yd2FyZGVkUmVmXG4gICAgICAgICAgfSkpXG4gICAgICAgICk7XG4gICAgICB9LCBbcmVhY3RSZWR1eEZvcndhcmRlZFJlZiwgV3JhcHBlZENvbXBvbmVudCwgYWN0dWFsQ2hpbGRQcm9wc10pOyAvLyBJZiBSZWFjdCBzZWVzIHRoZSBleGFjdCBzYW1lIGVsZW1lbnQgcmVmZXJlbmNlIGFzIGxhc3QgdGltZSwgaXQgYmFpbHMgb3V0IG9mIHJlLXJlbmRlcmluZ1xuICAgICAgLy8gdGhhdCBjaGlsZCwgc2FtZSBhcyBpZiBpdCB3YXMgd3JhcHBlZCBpbiBSZWFjdC5tZW1vKCkgb3IgcmV0dXJuZWQgZmFsc2UgZnJvbSBzaG91bGRDb21wb25lbnRVcGRhdGUuXG5cbiAgICAgIGNvbnN0IHJlbmRlcmVkQ2hpbGQgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICAgICAgaWYgKHNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlcykge1xuICAgICAgICAgIC8vIElmIHRoaXMgY29tcG9uZW50IGlzIHN1YnNjcmliZWQgdG8gc3RvcmUgdXBkYXRlcywgd2UgbmVlZCB0byBwYXNzIGl0cyBvd25cbiAgICAgICAgICAvLyBzdWJzY3JpcHRpb24gaW5zdGFuY2UgZG93biB0byBvdXIgZGVzY2VuZGFudHMuIFRoYXQgbWVhbnMgcmVuZGVyaW5nIHRoZSBzYW1lXG4gICAgICAgICAgLy8gQ29udGV4dCBpbnN0YW5jZSwgYW5kIHB1dHRpbmcgYSBkaWZmZXJlbnQgdmFsdWUgaW50byB0aGUgY29udGV4dC5cbiAgICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29udGV4dFRvVXNlLlByb3ZpZGVyLCB7XG4gICAgICAgICAgICB2YWx1ZTogb3ZlcnJpZGRlbkNvbnRleHRWYWx1ZVxuICAgICAgICAgIH0sIHJlbmRlcmVkV3JhcHBlZENvbXBvbmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVuZGVyZWRXcmFwcGVkQ29tcG9uZW50O1xuICAgICAgfSwgW0NvbnRleHRUb1VzZSwgcmVuZGVyZWRXcmFwcGVkQ29tcG9uZW50LCBvdmVycmlkZGVuQ29udGV4dFZhbHVlXSk7XG4gICAgICByZXR1cm4gcmVuZGVyZWRDaGlsZDtcbiAgICB9XG5cbiAgICBjb25zdCBfQ29ubmVjdCA9IFJlYWN0Lm1lbW8oQ29ubmVjdEZ1bmN0aW9uKTtcblxuICAgIC8vIEFkZCBhIGhhY2t5IGNhc3QgdG8gZ2V0IHRoZSByaWdodCBvdXRwdXQgdHlwZVxuICAgIGNvbnN0IENvbm5lY3QgPSBfQ29ubmVjdDtcbiAgICBDb25uZWN0LldyYXBwZWRDb21wb25lbnQgPSBXcmFwcGVkQ29tcG9uZW50O1xuICAgIENvbm5lY3QuZGlzcGxheU5hbWUgPSBDb25uZWN0RnVuY3Rpb24uZGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTtcblxuICAgIGlmIChmb3J3YXJkUmVmKSB7XG4gICAgICBjb25zdCBfZm9yd2FyZGVkID0gUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiBmb3J3YXJkQ29ubmVjdFJlZihwcm9wcywgcmVmKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbm5lY3QsIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgICAgICAgIHJlYWN0UmVkdXhGb3J3YXJkZWRSZWY6IHJlZlxuICAgICAgICB9KSk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZm9yd2FyZGVkID0gX2ZvcndhcmRlZDtcbiAgICAgIGZvcndhcmRlZC5kaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lO1xuICAgICAgZm9yd2FyZGVkLldyYXBwZWRDb21wb25lbnQgPSBXcmFwcGVkQ29tcG9uZW50O1xuICAgICAgcmV0dXJuIGhvaXN0U3RhdGljcyhmb3J3YXJkZWQsIFdyYXBwZWRDb21wb25lbnQpO1xuICAgIH1cblxuICAgIHJldHVybiBob2lzdFN0YXRpY3MoQ29ubmVjdCwgV3JhcHBlZENvbXBvbmVudCk7XG4gIH07XG5cbiAgcmV0dXJuIHdyYXBXaXRoQ29ubmVjdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdDsiLCJleHBvcnQgZnVuY3Rpb24gY3JlYXRlSW52YWxpZEFyZ0ZhY3RvcnkoYXJnLCBuYW1lKSB7XG4gIHJldHVybiAoZGlzcGF0Y2gsIG9wdGlvbnMpID0+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdmFsdWUgb2YgdHlwZSAke3R5cGVvZiBhcmd9IGZvciAke25hbWV9IGFyZ3VtZW50IHdoZW4gY29ubmVjdGluZyBjb21wb25lbnQgJHtvcHRpb25zLndyYXBwZWRDb21wb25lbnROYW1lfS5gKTtcbiAgfTtcbn0iLCJpbXBvcnQgYmluZEFjdGlvbkNyZWF0b3JzIGZyb20gJy4uL3V0aWxzL2JpbmRBY3Rpb25DcmVhdG9ycyc7XG5pbXBvcnQgeyB3cmFwTWFwVG9Qcm9wc0NvbnN0YW50LCB3cmFwTWFwVG9Qcm9wc0Z1bmMgfSBmcm9tICcuL3dyYXBNYXBUb1Byb3BzJztcbmltcG9ydCB7IGNyZWF0ZUludmFsaWRBcmdGYWN0b3J5IH0gZnJvbSAnLi9pbnZhbGlkQXJnRmFjdG9yeSc7XG5leHBvcnQgZnVuY3Rpb24gbWFwRGlzcGF0Y2hUb1Byb3BzRmFjdG9yeShtYXBEaXNwYXRjaFRvUHJvcHMpIHtcbiAgcmV0dXJuIG1hcERpc3BhdGNoVG9Qcm9wcyAmJiB0eXBlb2YgbWFwRGlzcGF0Y2hUb1Byb3BzID09PSAnb2JqZWN0JyA/IHdyYXBNYXBUb1Byb3BzQ29uc3RhbnQoZGlzcGF0Y2ggPT4gLy8gQHRzLWlnbm9yZVxuICBiaW5kQWN0aW9uQ3JlYXRvcnMobWFwRGlzcGF0Y2hUb1Byb3BzLCBkaXNwYXRjaCkpIDogIW1hcERpc3BhdGNoVG9Qcm9wcyA/IHdyYXBNYXBUb1Byb3BzQ29uc3RhbnQoZGlzcGF0Y2ggPT4gKHtcbiAgICBkaXNwYXRjaFxuICB9KSkgOiB0eXBlb2YgbWFwRGlzcGF0Y2hUb1Byb3BzID09PSAnZnVuY3Rpb24nID8gLy8gQHRzLWlnbm9yZVxuICB3cmFwTWFwVG9Qcm9wc0Z1bmMobWFwRGlzcGF0Y2hUb1Byb3BzLCAnbWFwRGlzcGF0Y2hUb1Byb3BzJykgOiBjcmVhdGVJbnZhbGlkQXJnRmFjdG9yeShtYXBEaXNwYXRjaFRvUHJvcHMsICdtYXBEaXNwYXRjaFRvUHJvcHMnKTtcbn0iLCJpbXBvcnQgeyB3cmFwTWFwVG9Qcm9wc0NvbnN0YW50LCB3cmFwTWFwVG9Qcm9wc0Z1bmMgfSBmcm9tICcuL3dyYXBNYXBUb1Byb3BzJztcbmltcG9ydCB7IGNyZWF0ZUludmFsaWRBcmdGYWN0b3J5IH0gZnJvbSAnLi9pbnZhbGlkQXJnRmFjdG9yeSc7XG5leHBvcnQgZnVuY3Rpb24gbWFwU3RhdGVUb1Byb3BzRmFjdG9yeShtYXBTdGF0ZVRvUHJvcHMpIHtcbiAgcmV0dXJuICFtYXBTdGF0ZVRvUHJvcHMgPyB3cmFwTWFwVG9Qcm9wc0NvbnN0YW50KCgpID0+ICh7fSkpIDogdHlwZW9mIG1hcFN0YXRlVG9Qcm9wcyA9PT0gJ2Z1bmN0aW9uJyA/IC8vIEB0cy1pZ25vcmVcbiAgd3JhcE1hcFRvUHJvcHNGdW5jKG1hcFN0YXRlVG9Qcm9wcywgJ21hcFN0YXRlVG9Qcm9wcycpIDogY3JlYXRlSW52YWxpZEFyZ0ZhY3RvcnkobWFwU3RhdGVUb1Byb3BzLCAnbWFwU3RhdGVUb1Byb3BzJyk7XG59IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgdmVyaWZ5UGxhaW5PYmplY3QgZnJvbSAnLi4vdXRpbHMvdmVyaWZ5UGxhaW5PYmplY3QnO1xuaW1wb3J0IHsgY3JlYXRlSW52YWxpZEFyZ0ZhY3RvcnkgfSBmcm9tICcuL2ludmFsaWRBcmdGYWN0b3J5JztcbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0TWVyZ2VQcm9wcyhzdGF0ZVByb3BzLCBkaXNwYXRjaFByb3BzLCBvd25Qcm9wcykge1xuICAvLyBAdHMtaWdub3JlXG4gIHJldHVybiBfZXh0ZW5kcyh7fSwgb3duUHJvcHMsIHN0YXRlUHJvcHMsIGRpc3BhdGNoUHJvcHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHdyYXBNZXJnZVByb3BzRnVuYyhtZXJnZVByb3BzKSB7XG4gIHJldHVybiBmdW5jdGlvbiBpbml0TWVyZ2VQcm9wc1Byb3h5KGRpc3BhdGNoLCB7XG4gICAgZGlzcGxheU5hbWUsXG4gICAgYXJlTWVyZ2VkUHJvcHNFcXVhbFxuICB9KSB7XG4gICAgbGV0IGhhc1J1bk9uY2UgPSBmYWxzZTtcbiAgICBsZXQgbWVyZ2VkUHJvcHM7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIG1lcmdlUHJvcHNQcm94eShzdGF0ZVByb3BzLCBkaXNwYXRjaFByb3BzLCBvd25Qcm9wcykge1xuICAgICAgY29uc3QgbmV4dE1lcmdlZFByb3BzID0gbWVyZ2VQcm9wcyhzdGF0ZVByb3BzLCBkaXNwYXRjaFByb3BzLCBvd25Qcm9wcyk7XG5cbiAgICAgIGlmIChoYXNSdW5PbmNlKSB7XG4gICAgICAgIGlmICghYXJlTWVyZ2VkUHJvcHNFcXVhbChuZXh0TWVyZ2VkUHJvcHMsIG1lcmdlZFByb3BzKSkgbWVyZ2VkUHJvcHMgPSBuZXh0TWVyZ2VkUHJvcHM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoYXNSdW5PbmNlID0gdHJ1ZTtcbiAgICAgICAgbWVyZ2VkUHJvcHMgPSBuZXh0TWVyZ2VkUHJvcHM7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB2ZXJpZnlQbGFpbk9iamVjdChtZXJnZWRQcm9wcywgZGlzcGxheU5hbWUsICdtZXJnZVByb3BzJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBtZXJnZWRQcm9wcztcbiAgICB9O1xuICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlUHJvcHNGYWN0b3J5KG1lcmdlUHJvcHMpIHtcbiAgcmV0dXJuICFtZXJnZVByb3BzID8gKCkgPT4gZGVmYXVsdE1lcmdlUHJvcHMgOiB0eXBlb2YgbWVyZ2VQcm9wcyA9PT0gJ2Z1bmN0aW9uJyA/IHdyYXBNZXJnZVByb3BzRnVuYyhtZXJnZVByb3BzKSA6IGNyZWF0ZUludmFsaWRBcmdGYWN0b3J5KG1lcmdlUHJvcHMsICdtZXJnZVByb3BzJyk7XG59IiwiaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlXCI7XG5jb25zdCBfZXhjbHVkZWQgPSBbXCJpbml0TWFwU3RhdGVUb1Byb3BzXCIsIFwiaW5pdE1hcERpc3BhdGNoVG9Qcm9wc1wiLCBcImluaXRNZXJnZVByb3BzXCJdO1xuaW1wb3J0IHZlcmlmeVN1YnNlbGVjdG9ycyBmcm9tICcuL3ZlcmlmeVN1YnNlbGVjdG9ycyc7XG5leHBvcnQgZnVuY3Rpb24gcHVyZUZpbmFsUHJvcHNTZWxlY3RvckZhY3RvcnkobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMsIG1lcmdlUHJvcHMsIGRpc3BhdGNoLCB7XG4gIGFyZVN0YXRlc0VxdWFsLFxuICBhcmVPd25Qcm9wc0VxdWFsLFxuICBhcmVTdGF0ZVByb3BzRXF1YWxcbn0pIHtcbiAgbGV0IGhhc1J1bkF0TGVhc3RPbmNlID0gZmFsc2U7XG4gIGxldCBzdGF0ZTtcbiAgbGV0IG93blByb3BzO1xuICBsZXQgc3RhdGVQcm9wcztcbiAgbGV0IGRpc3BhdGNoUHJvcHM7XG4gIGxldCBtZXJnZWRQcm9wcztcblxuICBmdW5jdGlvbiBoYW5kbGVGaXJzdENhbGwoZmlyc3RTdGF0ZSwgZmlyc3RPd25Qcm9wcykge1xuICAgIHN0YXRlID0gZmlyc3RTdGF0ZTtcbiAgICBvd25Qcm9wcyA9IGZpcnN0T3duUHJvcHM7XG4gICAgc3RhdGVQcm9wcyA9IG1hcFN0YXRlVG9Qcm9wcyhzdGF0ZSwgb3duUHJvcHMpO1xuICAgIGRpc3BhdGNoUHJvcHMgPSBtYXBEaXNwYXRjaFRvUHJvcHMoZGlzcGF0Y2gsIG93blByb3BzKTtcbiAgICBtZXJnZWRQcm9wcyA9IG1lcmdlUHJvcHMoc3RhdGVQcm9wcywgZGlzcGF0Y2hQcm9wcywgb3duUHJvcHMpO1xuICAgIGhhc1J1bkF0TGVhc3RPbmNlID0gdHJ1ZTtcbiAgICByZXR1cm4gbWVyZ2VkUHJvcHM7XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVOZXdQcm9wc0FuZE5ld1N0YXRlKCkge1xuICAgIHN0YXRlUHJvcHMgPSBtYXBTdGF0ZVRvUHJvcHMoc3RhdGUsIG93blByb3BzKTtcbiAgICBpZiAobWFwRGlzcGF0Y2hUb1Byb3BzLmRlcGVuZHNPbk93blByb3BzKSBkaXNwYXRjaFByb3BzID0gbWFwRGlzcGF0Y2hUb1Byb3BzKGRpc3BhdGNoLCBvd25Qcm9wcyk7XG4gICAgbWVyZ2VkUHJvcHMgPSBtZXJnZVByb3BzKHN0YXRlUHJvcHMsIGRpc3BhdGNoUHJvcHMsIG93blByb3BzKTtcbiAgICByZXR1cm4gbWVyZ2VkUHJvcHM7XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVOZXdQcm9wcygpIHtcbiAgICBpZiAobWFwU3RhdGVUb1Byb3BzLmRlcGVuZHNPbk93blByb3BzKSBzdGF0ZVByb3BzID0gbWFwU3RhdGVUb1Byb3BzKHN0YXRlLCBvd25Qcm9wcyk7XG4gICAgaWYgKG1hcERpc3BhdGNoVG9Qcm9wcy5kZXBlbmRzT25Pd25Qcm9wcykgZGlzcGF0Y2hQcm9wcyA9IG1hcERpc3BhdGNoVG9Qcm9wcyhkaXNwYXRjaCwgb3duUHJvcHMpO1xuICAgIG1lcmdlZFByb3BzID0gbWVyZ2VQcm9wcyhzdGF0ZVByb3BzLCBkaXNwYXRjaFByb3BzLCBvd25Qcm9wcyk7XG4gICAgcmV0dXJuIG1lcmdlZFByb3BzO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlTmV3U3RhdGUoKSB7XG4gICAgY29uc3QgbmV4dFN0YXRlUHJvcHMgPSBtYXBTdGF0ZVRvUHJvcHMoc3RhdGUsIG93blByb3BzKTtcbiAgICBjb25zdCBzdGF0ZVByb3BzQ2hhbmdlZCA9ICFhcmVTdGF0ZVByb3BzRXF1YWwobmV4dFN0YXRlUHJvcHMsIHN0YXRlUHJvcHMpO1xuICAgIHN0YXRlUHJvcHMgPSBuZXh0U3RhdGVQcm9wcztcbiAgICBpZiAoc3RhdGVQcm9wc0NoYW5nZWQpIG1lcmdlZFByb3BzID0gbWVyZ2VQcm9wcyhzdGF0ZVByb3BzLCBkaXNwYXRjaFByb3BzLCBvd25Qcm9wcyk7XG4gICAgcmV0dXJuIG1lcmdlZFByb3BzO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlU3Vic2VxdWVudENhbGxzKG5leHRTdGF0ZSwgbmV4dE93blByb3BzKSB7XG4gICAgY29uc3QgcHJvcHNDaGFuZ2VkID0gIWFyZU93blByb3BzRXF1YWwobmV4dE93blByb3BzLCBvd25Qcm9wcyk7XG4gICAgY29uc3Qgc3RhdGVDaGFuZ2VkID0gIWFyZVN0YXRlc0VxdWFsKG5leHRTdGF0ZSwgc3RhdGUsIG5leHRPd25Qcm9wcywgb3duUHJvcHMpO1xuICAgIHN0YXRlID0gbmV4dFN0YXRlO1xuICAgIG93blByb3BzID0gbmV4dE93blByb3BzO1xuICAgIGlmIChwcm9wc0NoYW5nZWQgJiYgc3RhdGVDaGFuZ2VkKSByZXR1cm4gaGFuZGxlTmV3UHJvcHNBbmROZXdTdGF0ZSgpO1xuICAgIGlmIChwcm9wc0NoYW5nZWQpIHJldHVybiBoYW5kbGVOZXdQcm9wcygpO1xuICAgIGlmIChzdGF0ZUNoYW5nZWQpIHJldHVybiBoYW5kbGVOZXdTdGF0ZSgpO1xuICAgIHJldHVybiBtZXJnZWRQcm9wcztcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiBwdXJlRmluYWxQcm9wc1NlbGVjdG9yKG5leHRTdGF0ZSwgbmV4dE93blByb3BzKSB7XG4gICAgcmV0dXJuIGhhc1J1bkF0TGVhc3RPbmNlID8gaGFuZGxlU3Vic2VxdWVudENhbGxzKG5leHRTdGF0ZSwgbmV4dE93blByb3BzKSA6IGhhbmRsZUZpcnN0Q2FsbChuZXh0U3RhdGUsIG5leHRPd25Qcm9wcyk7XG4gIH07XG59XG4vLyBUT0RPOiBBZGQgbW9yZSBjb21tZW50c1xuLy8gVGhlIHNlbGVjdG9yIHJldHVybmVkIGJ5IHNlbGVjdG9yRmFjdG9yeSB3aWxsIG1lbW9pemUgaXRzIHJlc3VsdHMsXG4vLyBhbGxvd2luZyBjb25uZWN0J3Mgc2hvdWxkQ29tcG9uZW50VXBkYXRlIHRvIHJldHVybiBmYWxzZSBpZiBmaW5hbFxuLy8gcHJvcHMgaGF2ZSBub3QgY2hhbmdlZC5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGZpbmFsUHJvcHNTZWxlY3RvckZhY3RvcnkoZGlzcGF0Y2gsIF9yZWYpIHtcbiAgbGV0IHtcbiAgICBpbml0TWFwU3RhdGVUb1Byb3BzLFxuICAgIGluaXRNYXBEaXNwYXRjaFRvUHJvcHMsXG4gICAgaW5pdE1lcmdlUHJvcHNcbiAgfSA9IF9yZWYsXG4gICAgICBvcHRpb25zID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UoX3JlZiwgX2V4Y2x1ZGVkKTtcblxuICBjb25zdCBtYXBTdGF0ZVRvUHJvcHMgPSBpbml0TWFwU3RhdGVUb1Byb3BzKGRpc3BhdGNoLCBvcHRpb25zKTtcbiAgY29uc3QgbWFwRGlzcGF0Y2hUb1Byb3BzID0gaW5pdE1hcERpc3BhdGNoVG9Qcm9wcyhkaXNwYXRjaCwgb3B0aW9ucyk7XG4gIGNvbnN0IG1lcmdlUHJvcHMgPSBpbml0TWVyZ2VQcm9wcyhkaXNwYXRjaCwgb3B0aW9ucyk7XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB2ZXJpZnlTdWJzZWxlY3RvcnMobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMsIG1lcmdlUHJvcHMpO1xuICB9XG5cbiAgcmV0dXJuIHB1cmVGaW5hbFByb3BzU2VsZWN0b3JGYWN0b3J5KG1hcFN0YXRlVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzLCBtZXJnZVByb3BzLCBkaXNwYXRjaCwgb3B0aW9ucyk7XG59IiwiaW1wb3J0IHdhcm5pbmcgZnJvbSAnLi4vdXRpbHMvd2FybmluZyc7XG5cbmZ1bmN0aW9uIHZlcmlmeShzZWxlY3RvciwgbWV0aG9kTmFtZSkge1xuICBpZiAoIXNlbGVjdG9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIHZhbHVlIGZvciAke21ldGhvZE5hbWV9IGluIGNvbm5lY3QuYCk7XG4gIH0gZWxzZSBpZiAobWV0aG9kTmFtZSA9PT0gJ21hcFN0YXRlVG9Qcm9wcycgfHwgbWV0aG9kTmFtZSA9PT0gJ21hcERpc3BhdGNoVG9Qcm9wcycpIHtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZWxlY3RvciwgJ2RlcGVuZHNPbk93blByb3BzJykpIHtcbiAgICAgIHdhcm5pbmcoYFRoZSBzZWxlY3RvciBmb3IgJHttZXRob2ROYW1lfSBvZiBjb25uZWN0IGRpZCBub3Qgc3BlY2lmeSBhIHZhbHVlIGZvciBkZXBlbmRzT25Pd25Qcm9wcy5gKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmVyaWZ5U3Vic2VsZWN0b3JzKG1hcFN0YXRlVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzLCBtZXJnZVByb3BzKSB7XG4gIHZlcmlmeShtYXBTdGF0ZVRvUHJvcHMsICdtYXBTdGF0ZVRvUHJvcHMnKTtcbiAgdmVyaWZ5KG1hcERpc3BhdGNoVG9Qcm9wcywgJ21hcERpc3BhdGNoVG9Qcm9wcycpO1xuICB2ZXJpZnkobWVyZ2VQcm9wcywgJ21lcmdlUHJvcHMnKTtcbn0iLCJpbXBvcnQgdmVyaWZ5UGxhaW5PYmplY3QgZnJvbSAnLi4vdXRpbHMvdmVyaWZ5UGxhaW5PYmplY3QnO1xuZXhwb3J0IGZ1bmN0aW9uIHdyYXBNYXBUb1Byb3BzQ29uc3RhbnQoIC8vICogTm90ZTpcbi8vICBJdCBzZWVtcyB0aGF0IHRoZSBkaXNwYXRjaCBhcmd1bWVudFxuLy8gIGNvdWxkIGJlIGEgZGlzcGF0Y2ggZnVuY3Rpb24gaW4gc29tZSBjYXNlcyAoZXg6IHdoZW5NYXBEaXNwYXRjaFRvUHJvcHNJc01pc3NpbmcpXG4vLyAgYW5kIGEgc3RhdGUgb2JqZWN0IGluIHNvbWUgb3RoZXJzIChleDogd2hlbk1hcFN0YXRlVG9Qcm9wc0lzTWlzc2luZylcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuZ2V0Q29uc3RhbnQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGluaXRDb25zdGFudFNlbGVjdG9yKGRpc3BhdGNoKSB7XG4gICAgY29uc3QgY29uc3RhbnQgPSBnZXRDb25zdGFudChkaXNwYXRjaCk7XG5cbiAgICBmdW5jdGlvbiBjb25zdGFudFNlbGVjdG9yKCkge1xuICAgICAgcmV0dXJuIGNvbnN0YW50O1xuICAgIH1cblxuICAgIGNvbnN0YW50U2VsZWN0b3IuZGVwZW5kc09uT3duUHJvcHMgPSBmYWxzZTtcbiAgICByZXR1cm4gY29uc3RhbnRTZWxlY3RvcjtcbiAgfTtcbn0gLy8gZGVwZW5kc09uT3duUHJvcHMgaXMgdXNlZCBieSBjcmVhdGVNYXBUb1Byb3BzUHJveHkgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gcGFzcyBwcm9wcyBhcyBhcmdzXG4vLyB0byB0aGUgbWFwVG9Qcm9wcyBmdW5jdGlvbiBiZWluZyB3cmFwcGVkLiBJdCBpcyBhbHNvIHVzZWQgYnkgbWFrZVB1cmVQcm9wc1NlbGVjdG9yIHRvIGRldGVybWluZVxuLy8gd2hldGhlciBtYXBUb1Byb3BzIG5lZWRzIHRvIGJlIGludm9rZWQgd2hlbiBwcm9wcyBoYXZlIGNoYW5nZWQuXG4vL1xuLy8gQSBsZW5ndGggb2Ygb25lIHNpZ25hbHMgdGhhdCBtYXBUb1Byb3BzIGRvZXMgbm90IGRlcGVuZCBvbiBwcm9wcyBmcm9tIHRoZSBwYXJlbnQgY29tcG9uZW50LlxuLy8gQSBsZW5ndGggb2YgemVybyBpcyBhc3N1bWVkIHRvIG1lYW4gbWFwVG9Qcm9wcyBpcyBnZXR0aW5nIGFyZ3MgdmlhIGFyZ3VtZW50cyBvciAuLi5hcmdzIGFuZFxuLy8gdGhlcmVmb3JlIG5vdCByZXBvcnRpbmcgaXRzIGxlbmd0aCBhY2N1cmF0ZWx5Li5cbi8vIFRPRE8gQ2FuIHRoaXMgZ2V0IHB1bGxlZCBvdXQgc28gdGhhdCB3ZSBjYW4gc3Vic2NyaWJlIGRpcmVjdGx5IHRvIHRoZSBzdG9yZSBpZiB3ZSBkb24ndCBuZWVkIG93blByb3BzP1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVwZW5kc09uT3duUHJvcHMobWFwVG9Qcm9wcykge1xuICByZXR1cm4gbWFwVG9Qcm9wcy5kZXBlbmRzT25Pd25Qcm9wcyA/IEJvb2xlYW4obWFwVG9Qcm9wcy5kZXBlbmRzT25Pd25Qcm9wcykgOiBtYXBUb1Byb3BzLmxlbmd0aCAhPT0gMTtcbn0gLy8gVXNlZCBieSB3aGVuTWFwU3RhdGVUb1Byb3BzSXNGdW5jdGlvbiBhbmQgd2hlbk1hcERpc3BhdGNoVG9Qcm9wc0lzRnVuY3Rpb24sXG4vLyB0aGlzIGZ1bmN0aW9uIHdyYXBzIG1hcFRvUHJvcHMgaW4gYSBwcm94eSBmdW5jdGlvbiB3aGljaCBkb2VzIHNldmVyYWwgdGhpbmdzOlxuLy9cbi8vICAqIERldGVjdHMgd2hldGhlciB0aGUgbWFwVG9Qcm9wcyBmdW5jdGlvbiBiZWluZyBjYWxsZWQgZGVwZW5kcyBvbiBwcm9wcywgd2hpY2hcbi8vICAgIGlzIHVzZWQgYnkgc2VsZWN0b3JGYWN0b3J5IHRvIGRlY2lkZSBpZiBpdCBzaG91bGQgcmVpbnZva2Ugb24gcHJvcHMgY2hhbmdlcy5cbi8vXG4vLyAgKiBPbiBmaXJzdCBjYWxsLCBoYW5kbGVzIG1hcFRvUHJvcHMgaWYgcmV0dXJucyBhbm90aGVyIGZ1bmN0aW9uLCBhbmQgdHJlYXRzIHRoYXRcbi8vICAgIG5ldyBmdW5jdGlvbiBhcyB0aGUgdHJ1ZSBtYXBUb1Byb3BzIGZvciBzdWJzZXF1ZW50IGNhbGxzLlxuLy9cbi8vICAqIE9uIGZpcnN0IGNhbGwsIHZlcmlmaWVzIHRoZSBmaXJzdCByZXN1bHQgaXMgYSBwbGFpbiBvYmplY3QsIGluIG9yZGVyIHRvIHdhcm5cbi8vICAgIHRoZSBkZXZlbG9wZXIgdGhhdCB0aGVpciBtYXBUb1Byb3BzIGZ1bmN0aW9uIGlzIG5vdCByZXR1cm5pbmcgYSB2YWxpZCByZXN1bHQuXG4vL1xuXG5leHBvcnQgZnVuY3Rpb24gd3JhcE1hcFRvUHJvcHNGdW5jKG1hcFRvUHJvcHMsIG1ldGhvZE5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGluaXRQcm94eVNlbGVjdG9yKGRpc3BhdGNoLCB7XG4gICAgZGlzcGxheU5hbWVcbiAgfSkge1xuICAgIGNvbnN0IHByb3h5ID0gZnVuY3Rpb24gbWFwVG9Qcm9wc1Byb3h5KHN0YXRlT3JEaXNwYXRjaCwgb3duUHJvcHMpIHtcbiAgICAgIHJldHVybiBwcm94eS5kZXBlbmRzT25Pd25Qcm9wcyA/IHByb3h5Lm1hcFRvUHJvcHMoc3RhdGVPckRpc3BhdGNoLCBvd25Qcm9wcykgOiBwcm94eS5tYXBUb1Byb3BzKHN0YXRlT3JEaXNwYXRjaCwgdW5kZWZpbmVkKTtcbiAgICB9OyAvLyBhbGxvdyBkZXRlY3RGYWN0b3J5QW5kVmVyaWZ5IHRvIGdldCBvd25Qcm9wc1xuXG5cbiAgICBwcm94eS5kZXBlbmRzT25Pd25Qcm9wcyA9IHRydWU7XG5cbiAgICBwcm94eS5tYXBUb1Byb3BzID0gZnVuY3Rpb24gZGV0ZWN0RmFjdG9yeUFuZFZlcmlmeShzdGF0ZU9yRGlzcGF0Y2gsIG93blByb3BzKSB7XG4gICAgICBwcm94eS5tYXBUb1Byb3BzID0gbWFwVG9Qcm9wcztcbiAgICAgIHByb3h5LmRlcGVuZHNPbk93blByb3BzID0gZ2V0RGVwZW5kc09uT3duUHJvcHMobWFwVG9Qcm9wcyk7XG4gICAgICBsZXQgcHJvcHMgPSBwcm94eShzdGF0ZU9yRGlzcGF0Y2gsIG93blByb3BzKTtcblxuICAgICAgaWYgKHR5cGVvZiBwcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBwcm94eS5tYXBUb1Byb3BzID0gcHJvcHM7XG4gICAgICAgIHByb3h5LmRlcGVuZHNPbk93blByb3BzID0gZ2V0RGVwZW5kc09uT3duUHJvcHMocHJvcHMpO1xuICAgICAgICBwcm9wcyA9IHByb3h5KHN0YXRlT3JEaXNwYXRjaCwgb3duUHJvcHMpO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgdmVyaWZ5UGxhaW5PYmplY3QocHJvcHMsIGRpc3BsYXlOYW1lLCBtZXRob2ROYW1lKTtcbiAgICAgIHJldHVybiBwcm9wcztcbiAgICB9O1xuXG4gICAgcmV0dXJuIHByb3h5O1xuICB9O1xufSIsImltcG9ydCBQcm92aWRlciBmcm9tICcuL2NvbXBvbmVudHMvUHJvdmlkZXInO1xuaW1wb3J0IGNvbm5lY3QgZnJvbSAnLi9jb21wb25lbnRzL2Nvbm5lY3QnO1xuaW1wb3J0IHsgUmVhY3RSZWR1eENvbnRleHQgfSBmcm9tICcuL2NvbXBvbmVudHMvQ29udGV4dCc7XG5pbXBvcnQgeyB1c2VEaXNwYXRjaCwgY3JlYXRlRGlzcGF0Y2hIb29rIH0gZnJvbSAnLi9ob29rcy91c2VEaXNwYXRjaCc7XG5pbXBvcnQgeyB1c2VTZWxlY3RvciwgY3JlYXRlU2VsZWN0b3JIb29rIH0gZnJvbSAnLi9ob29rcy91c2VTZWxlY3Rvcic7XG5pbXBvcnQgeyB1c2VTdG9yZSwgY3JlYXRlU3RvcmVIb29rIH0gZnJvbSAnLi9ob29rcy91c2VTdG9yZSc7XG5pbXBvcnQgc2hhbGxvd0VxdWFsIGZyb20gJy4vdXRpbHMvc2hhbGxvd0VxdWFsJztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMnO1xuZXhwb3J0IHsgUHJvdmlkZXIsIFJlYWN0UmVkdXhDb250ZXh0LCBjb25uZWN0LCB1c2VEaXNwYXRjaCwgY3JlYXRlRGlzcGF0Y2hIb29rLCB1c2VTZWxlY3RvciwgY3JlYXRlU2VsZWN0b3JIb29rLCB1c2VTdG9yZSwgY3JlYXRlU3RvcmVIb29rLCBzaGFsbG93RXF1YWwgfTsiLCJpbXBvcnQgeyBSZWFjdFJlZHV4Q29udGV4dCB9IGZyb20gJy4uL2NvbXBvbmVudHMvQ29udGV4dCc7XG5pbXBvcnQgeyB1c2VTdG9yZSBhcyB1c2VEZWZhdWx0U3RvcmUsIGNyZWF0ZVN0b3JlSG9vayB9IGZyb20gJy4vdXNlU3RvcmUnO1xuLyoqXHJcbiAqIEhvb2sgZmFjdG9yeSwgd2hpY2ggY3JlYXRlcyBhIGB1c2VEaXNwYXRjaGAgaG9vayBib3VuZCB0byBhIGdpdmVuIGNvbnRleHQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhY3QuQ29udGV4dH0gW2NvbnRleHQ9UmVhY3RSZWR1eENvbnRleHRdIENvbnRleHQgcGFzc2VkIHRvIHlvdXIgYDxQcm92aWRlcj5gLlxyXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IEEgYHVzZURpc3BhdGNoYCBob29rIGJvdW5kIHRvIHRoZSBzcGVjaWZpZWQgY29udGV4dC5cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEaXNwYXRjaEhvb2soY29udGV4dCA9IFJlYWN0UmVkdXhDb250ZXh0KSB7XG4gIGNvbnN0IHVzZVN0b3JlID0gLy8gQHRzLWlnbm9yZVxuICBjb250ZXh0ID09PSBSZWFjdFJlZHV4Q29udGV4dCA/IHVzZURlZmF1bHRTdG9yZSA6IGNyZWF0ZVN0b3JlSG9vayhjb250ZXh0KTtcbiAgcmV0dXJuIGZ1bmN0aW9uIHVzZURpc3BhdGNoKCkge1xuICAgIGNvbnN0IHN0b3JlID0gdXNlU3RvcmUoKTsgLy8gQHRzLWlnbm9yZVxuXG4gICAgcmV0dXJuIHN0b3JlLmRpc3BhdGNoO1xuICB9O1xufVxuLyoqXHJcbiAqIEEgaG9vayB0byBhY2Nlc3MgdGhlIHJlZHV4IGBkaXNwYXRjaGAgZnVuY3Rpb24uXHJcbiAqXHJcbiAqIEByZXR1cm5zIHthbnl8ZnVuY3Rpb259IHJlZHV4IHN0b3JlJ3MgYGRpc3BhdGNoYCBmdW5jdGlvblxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKlxyXG4gKiBpbXBvcnQgUmVhY3QsIHsgdXNlQ2FsbGJhY2sgfSBmcm9tICdyZWFjdCdcclxuICogaW1wb3J0IHsgdXNlRGlzcGF0Y2ggfSBmcm9tICdyZWFjdC1yZWR1eCdcclxuICpcclxuICogZXhwb3J0IGNvbnN0IENvdW50ZXJDb21wb25lbnQgPSAoeyB2YWx1ZSB9KSA9PiB7XHJcbiAqICAgY29uc3QgZGlzcGF0Y2ggPSB1c2VEaXNwYXRjaCgpXHJcbiAqICAgY29uc3QgaW5jcmVhc2VDb3VudGVyID0gdXNlQ2FsbGJhY2soKCkgPT4gZGlzcGF0Y2goeyB0eXBlOiAnaW5jcmVhc2UtY291bnRlcicgfSksIFtdKVxyXG4gKiAgIHJldHVybiAoXHJcbiAqICAgICA8ZGl2PlxyXG4gKiAgICAgICA8c3Bhbj57dmFsdWV9PC9zcGFuPlxyXG4gKiAgICAgICA8YnV0dG9uIG9uQ2xpY2s9e2luY3JlYXNlQ291bnRlcn0+SW5jcmVhc2UgY291bnRlcjwvYnV0dG9uPlxyXG4gKiAgICAgPC9kaXY+XHJcbiAqICAgKVxyXG4gKiB9XHJcbiAqL1xuXG5leHBvcnQgY29uc3QgdXNlRGlzcGF0Y2ggPSAvKiNfX1BVUkVfXyovY3JlYXRlRGlzcGF0Y2hIb29rKCk7IiwiaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFJlYWN0UmVkdXhDb250ZXh0IH0gZnJvbSAnLi4vY29tcG9uZW50cy9Db250ZXh0JztcblxuLyoqXHJcbiAqIEhvb2sgZmFjdG9yeSwgd2hpY2ggY3JlYXRlcyBhIGB1c2VSZWR1eENvbnRleHRgIGhvb2sgYm91bmQgdG8gYSBnaXZlbiBjb250ZXh0LiBUaGlzIGlzIGEgbG93LWxldmVsXHJcbiAqIGhvb2sgdGhhdCB5b3Ugc2hvdWxkIHVzdWFsbHkgbm90IG5lZWQgdG8gY2FsbCBkaXJlY3RseS5cclxuICpcclxuICogQHBhcmFtIHtSZWFjdC5Db250ZXh0fSBbY29udGV4dD1SZWFjdFJlZHV4Q29udGV4dF0gQ29udGV4dCBwYXNzZWQgdG8geW91ciBgPFByb3ZpZGVyPmAuXHJcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSBgdXNlUmVkdXhDb250ZXh0YCBob29rIGJvdW5kIHRvIHRoZSBzcGVjaWZpZWQgY29udGV4dC5cclxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVkdXhDb250ZXh0SG9vayhjb250ZXh0ID0gUmVhY3RSZWR1eENvbnRleHQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHVzZVJlZHV4Q29udGV4dCgpIHtcbiAgICBjb25zdCBjb250ZXh0VmFsdWUgPSB1c2VDb250ZXh0KGNvbnRleHQpO1xuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgIWNvbnRleHRWYWx1ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgZmluZCByZWFjdC1yZWR1eCBjb250ZXh0IHZhbHVlOyBwbGVhc2UgZW5zdXJlIHRoZSBjb21wb25lbnQgaXMgd3JhcHBlZCBpbiBhIDxQcm92aWRlcj4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29udGV4dFZhbHVlO1xuICB9O1xufVxuLyoqXHJcbiAqIEEgaG9vayB0byBhY2Nlc3MgdGhlIHZhbHVlIG9mIHRoZSBgUmVhY3RSZWR1eENvbnRleHRgLiBUaGlzIGlzIGEgbG93LWxldmVsXHJcbiAqIGhvb2sgdGhhdCB5b3Ugc2hvdWxkIHVzdWFsbHkgbm90IG5lZWQgdG8gY2FsbCBkaXJlY3RseS5cclxuICpcclxuICogQHJldHVybnMge2FueX0gdGhlIHZhbHVlIG9mIHRoZSBgUmVhY3RSZWR1eENvbnRleHRgXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqXHJcbiAqIGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcclxuICogaW1wb3J0IHsgdXNlUmVkdXhDb250ZXh0IH0gZnJvbSAncmVhY3QtcmVkdXgnXHJcbiAqXHJcbiAqIGV4cG9ydCBjb25zdCBDb3VudGVyQ29tcG9uZW50ID0gKCkgPT4ge1xyXG4gKiAgIGNvbnN0IHsgc3RvcmUgfSA9IHVzZVJlZHV4Q29udGV4dCgpXHJcbiAqICAgcmV0dXJuIDxkaXY+e3N0b3JlLmdldFN0YXRlKCl9PC9kaXY+XHJcbiAqIH1cclxuICovXG5cbmV4cG9ydCBjb25zdCB1c2VSZWR1eENvbnRleHQgPSAvKiNfX1BVUkVfXyovY3JlYXRlUmVkdXhDb250ZXh0SG9vaygpOyIsImltcG9ydCB7IHVzZUNhbGxiYWNrLCB1c2VEZWJ1Z1ZhbHVlLCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjcmVhdGVSZWR1eENvbnRleHRIb29rLCB1c2VSZWR1eENvbnRleHQgYXMgdXNlRGVmYXVsdFJlZHV4Q29udGV4dCB9IGZyb20gJy4vdXNlUmVkdXhDb250ZXh0JztcbmltcG9ydCB7IFJlYWN0UmVkdXhDb250ZXh0IH0gZnJvbSAnLi4vY29tcG9uZW50cy9Db250ZXh0JztcbmltcG9ydCB7IG5vdEluaXRpYWxpemVkIH0gZnJvbSAnLi4vdXRpbHMvdXNlU3luY0V4dGVybmFsU3RvcmUnO1xubGV0IHVzZVN5bmNFeHRlcm5hbFN0b3JlV2l0aFNlbGVjdG9yID0gbm90SW5pdGlhbGl6ZWQ7XG5leHBvcnQgY29uc3QgaW5pdGlhbGl6ZVVzZVNlbGVjdG9yID0gZm4gPT4ge1xuICB1c2VTeW5jRXh0ZXJuYWxTdG9yZVdpdGhTZWxlY3RvciA9IGZuO1xufTtcblxuY29uc3QgcmVmRXF1YWxpdHkgPSAoYSwgYikgPT4gYSA9PT0gYjtcbi8qKlxyXG4gKiBIb29rIGZhY3RvcnksIHdoaWNoIGNyZWF0ZXMgYSBgdXNlU2VsZWN0b3JgIGhvb2sgYm91bmQgdG8gYSBnaXZlbiBjb250ZXh0LlxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWN0LkNvbnRleHR9IFtjb250ZXh0PVJlYWN0UmVkdXhDb250ZXh0XSBDb250ZXh0IHBhc3NlZCB0byB5b3VyIGA8UHJvdmlkZXI+YC5cclxuICogQHJldHVybnMge0Z1bmN0aW9ufSBBIGB1c2VTZWxlY3RvcmAgaG9vayBib3VuZCB0byB0aGUgc3BlY2lmaWVkIGNvbnRleHQuXHJcbiAqL1xuXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTZWxlY3Rvckhvb2soY29udGV4dCA9IFJlYWN0UmVkdXhDb250ZXh0KSB7XG4gIGNvbnN0IHVzZVJlZHV4Q29udGV4dCA9IGNvbnRleHQgPT09IFJlYWN0UmVkdXhDb250ZXh0ID8gdXNlRGVmYXVsdFJlZHV4Q29udGV4dCA6IGNyZWF0ZVJlZHV4Q29udGV4dEhvb2soY29udGV4dCk7XG4gIHJldHVybiBmdW5jdGlvbiB1c2VTZWxlY3RvcihzZWxlY3RvciwgZXF1YWxpdHlGbk9yT3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3Qge1xuICAgICAgZXF1YWxpdHlGbiA9IHJlZkVxdWFsaXR5LFxuICAgICAgc3RhYmlsaXR5Q2hlY2sgPSB1bmRlZmluZWQsXG4gICAgICBub29wQ2hlY2sgPSB1bmRlZmluZWRcbiAgICB9ID0gdHlwZW9mIGVxdWFsaXR5Rm5Pck9wdGlvbnMgPT09ICdmdW5jdGlvbicgPyB7XG4gICAgICBlcXVhbGl0eUZuOiBlcXVhbGl0eUZuT3JPcHRpb25zXG4gICAgfSA6IGVxdWFsaXR5Rm5Pck9wdGlvbnM7XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaWYgKCFzZWxlY3Rvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFlvdSBtdXN0IHBhc3MgYSBzZWxlY3RvciB0byB1c2VTZWxlY3RvcmApO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHNlbGVjdG9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWW91IG11c3QgcGFzcyBhIGZ1bmN0aW9uIGFzIGEgc2VsZWN0b3IgdG8gdXNlU2VsZWN0b3JgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBlcXVhbGl0eUZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWW91IG11c3QgcGFzcyBhIGZ1bmN0aW9uIGFzIGFuIGVxdWFsaXR5IGZ1bmN0aW9uIHRvIHVzZVNlbGVjdG9yYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qge1xuICAgICAgc3RvcmUsXG4gICAgICBzdWJzY3JpcHRpb24sXG4gICAgICBnZXRTZXJ2ZXJTdGF0ZSxcbiAgICAgIHN0YWJpbGl0eUNoZWNrOiBnbG9iYWxTdGFiaWxpdHlDaGVjayxcbiAgICAgIG5vb3BDaGVjazogZ2xvYmFsTm9vcENoZWNrXG4gICAgfSA9IHVzZVJlZHV4Q29udGV4dCgpO1xuICAgIGNvbnN0IGZpcnN0UnVuID0gdXNlUmVmKHRydWUpO1xuICAgIGNvbnN0IHdyYXBwZWRTZWxlY3RvciA9IHVzZUNhbGxiYWNrKHtcbiAgICAgIFtzZWxlY3Rvci5uYW1lXShzdGF0ZSkge1xuICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHNlbGVjdG9yKHN0YXRlKTtcblxuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgIGNvbnN0IGZpbmFsU3RhYmlsaXR5Q2hlY2sgPSB0eXBlb2Ygc3RhYmlsaXR5Q2hlY2sgPT09ICd1bmRlZmluZWQnID8gZ2xvYmFsU3RhYmlsaXR5Q2hlY2sgOiBzdGFiaWxpdHlDaGVjaztcblxuICAgICAgICAgIGlmIChmaW5hbFN0YWJpbGl0eUNoZWNrID09PSAnYWx3YXlzJyB8fCBmaW5hbFN0YWJpbGl0eUNoZWNrID09PSAnb25jZScgJiYgZmlyc3RSdW4uY3VycmVudCkge1xuICAgICAgICAgICAgY29uc3QgdG9Db21wYXJlID0gc2VsZWN0b3Ioc3RhdGUpO1xuXG4gICAgICAgICAgICBpZiAoIWVxdWFsaXR5Rm4oc2VsZWN0ZWQsIHRvQ29tcGFyZSkpIHtcbiAgICAgICAgICAgICAgbGV0IHN0YWNrID0gdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICA7XG4gICAgICAgICAgICAgICAgKHtcbiAgICAgICAgICAgICAgICAgIHN0YWNrXG4gICAgICAgICAgICAgICAgfSA9IGUpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdTZWxlY3RvciAnICsgKHNlbGVjdG9yLm5hbWUgfHwgJ3Vua25vd24nKSArICcgcmV0dXJuZWQgYSBkaWZmZXJlbnQgcmVzdWx0IHdoZW4gY2FsbGVkIHdpdGggdGhlIHNhbWUgcGFyYW1ldGVycy4gVGhpcyBjYW4gbGVhZCB0byB1bm5lY2Vzc2FyeSByZXJlbmRlcnMuJyArICdcXG5TZWxlY3RvcnMgdGhhdCByZXR1cm4gYSBuZXcgcmVmZXJlbmNlIChzdWNoIGFzIGFuIG9iamVjdCBvciBhbiBhcnJheSkgc2hvdWxkIGJlIG1lbW9pemVkOiBodHRwczovL3JlZHV4LmpzLm9yZy91c2FnZS9kZXJpdmluZy1kYXRhLXNlbGVjdG9ycyNvcHRpbWl6aW5nLXNlbGVjdG9ycy13aXRoLW1lbW9pemF0aW9uJywge1xuICAgICAgICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkLFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkMjogdG9Db21wYXJlLFxuICAgICAgICAgICAgICAgIHN0YWNrXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGZpbmFsTm9vcENoZWNrID0gdHlwZW9mIG5vb3BDaGVjayA9PT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWxOb29wQ2hlY2sgOiBub29wQ2hlY2s7XG5cbiAgICAgICAgICBpZiAoZmluYWxOb29wQ2hlY2sgPT09ICdhbHdheXMnIHx8IGZpbmFsTm9vcENoZWNrID09PSAnb25jZScgJiYgZmlyc3RSdW4uY3VycmVudCkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgaWYgKHNlbGVjdGVkID09PSBzdGF0ZSkge1xuICAgICAgICAgICAgICBsZXQgc3RhY2sgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIDtcbiAgICAgICAgICAgICAgICAoe1xuICAgICAgICAgICAgICAgICAgc3RhY2tcbiAgICAgICAgICAgICAgICB9ID0gZSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1NlbGVjdG9yICcgKyAoc2VsZWN0b3IubmFtZSB8fCAndW5rbm93bicpICsgJyByZXR1cm5lZCB0aGUgcm9vdCBzdGF0ZSB3aGVuIGNhbGxlZC4gVGhpcyBjYW4gbGVhZCB0byB1bm5lY2Vzc2FyeSByZXJlbmRlcnMuJyArICdcXG5TZWxlY3RvcnMgdGhhdCByZXR1cm4gdGhlIGVudGlyZSBzdGF0ZSBhcmUgYWxtb3N0IGNlcnRhaW5seSBhIG1pc3Rha2UsIGFzIHRoZXkgd2lsbCBjYXVzZSBhIHJlcmVuZGVyIHdoZW5ldmVyICphbnl0aGluZyogaW4gc3RhdGUgY2hhbmdlcy4nLCB7XG4gICAgICAgICAgICAgICAgc3RhY2tcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGZpcnN0UnVuLmN1cnJlbnQpIGZpcnN0UnVuLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzZWxlY3RlZDtcbiAgICAgIH1cblxuICAgIH1bc2VsZWN0b3IubmFtZV0sIFtzZWxlY3RvciwgZ2xvYmFsU3RhYmlsaXR5Q2hlY2ssIHN0YWJpbGl0eUNoZWNrXSk7XG4gICAgY29uc3Qgc2VsZWN0ZWRTdGF0ZSA9IHVzZVN5bmNFeHRlcm5hbFN0b3JlV2l0aFNlbGVjdG9yKHN1YnNjcmlwdGlvbi5hZGROZXN0ZWRTdWIsIHN0b3JlLmdldFN0YXRlLCBnZXRTZXJ2ZXJTdGF0ZSB8fCBzdG9yZS5nZXRTdGF0ZSwgd3JhcHBlZFNlbGVjdG9yLCBlcXVhbGl0eUZuKTtcbiAgICB1c2VEZWJ1Z1ZhbHVlKHNlbGVjdGVkU3RhdGUpO1xuICAgIHJldHVybiBzZWxlY3RlZFN0YXRlO1xuICB9O1xufVxuLyoqXHJcbiAqIEEgaG9vayB0byBhY2Nlc3MgdGhlIHJlZHV4IHN0b3JlJ3Mgc3RhdGUuIFRoaXMgaG9vayB0YWtlcyBhIHNlbGVjdG9yIGZ1bmN0aW9uXHJcbiAqIGFzIGFuIGFyZ3VtZW50LiBUaGUgc2VsZWN0b3IgaXMgY2FsbGVkIHdpdGggdGhlIHN0b3JlIHN0YXRlLlxyXG4gKlxyXG4gKiBUaGlzIGhvb2sgdGFrZXMgYW4gb3B0aW9uYWwgZXF1YWxpdHkgY29tcGFyaXNvbiBmdW5jdGlvbiBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlclxyXG4gKiB0aGF0IGFsbG93cyB5b3UgdG8gY3VzdG9taXplIHRoZSB3YXkgdGhlIHNlbGVjdGVkIHN0YXRlIGlzIGNvbXBhcmVkIHRvIGRldGVybWluZVxyXG4gKiB3aGV0aGVyIHRoZSBjb21wb25lbnQgbmVlZHMgdG8gYmUgcmUtcmVuZGVyZWQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNlbGVjdG9yIHRoZSBzZWxlY3RvciBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9uPX0gZXF1YWxpdHlGbiB0aGUgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGVxdWFsaXR5XHJcbiAqXHJcbiAqIEByZXR1cm5zIHthbnl9IHRoZSBzZWxlY3RlZCBzdGF0ZVxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKlxyXG4gKiBpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXHJcbiAqIGltcG9ydCB7IHVzZVNlbGVjdG9yIH0gZnJvbSAncmVhY3QtcmVkdXgnXHJcbiAqXHJcbiAqIGV4cG9ydCBjb25zdCBDb3VudGVyQ29tcG9uZW50ID0gKCkgPT4ge1xyXG4gKiAgIGNvbnN0IGNvdW50ZXIgPSB1c2VTZWxlY3RvcihzdGF0ZSA9PiBzdGF0ZS5jb3VudGVyKVxyXG4gKiAgIHJldHVybiA8ZGl2Pntjb3VudGVyfTwvZGl2PlxyXG4gKiB9XHJcbiAqL1xuXG5leHBvcnQgY29uc3QgdXNlU2VsZWN0b3IgPSAvKiNfX1BVUkVfXyovY3JlYXRlU2VsZWN0b3JIb29rKCk7IiwiaW1wb3J0IHsgUmVhY3RSZWR1eENvbnRleHQgfSBmcm9tICcuLi9jb21wb25lbnRzL0NvbnRleHQnO1xuaW1wb3J0IHsgdXNlUmVkdXhDb250ZXh0IGFzIHVzZURlZmF1bHRSZWR1eENvbnRleHQsIGNyZWF0ZVJlZHV4Q29udGV4dEhvb2sgfSBmcm9tICcuL3VzZVJlZHV4Q29udGV4dCc7XG4vKipcclxuICogSG9vayBmYWN0b3J5LCB3aGljaCBjcmVhdGVzIGEgYHVzZVN0b3JlYCBob29rIGJvdW5kIHRvIGEgZ2l2ZW4gY29udGV4dC5cclxuICpcclxuICogQHBhcmFtIHtSZWFjdC5Db250ZXh0fSBbY29udGV4dD1SZWFjdFJlZHV4Q29udGV4dF0gQ29udGV4dCBwYXNzZWQgdG8geW91ciBgPFByb3ZpZGVyPmAuXHJcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSBgdXNlU3RvcmVgIGhvb2sgYm91bmQgdG8gdGhlIHNwZWNpZmllZCBjb250ZXh0LlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN0b3JlSG9vayhjb250ZXh0ID0gUmVhY3RSZWR1eENvbnRleHQpIHtcbiAgY29uc3QgdXNlUmVkdXhDb250ZXh0ID0gLy8gQHRzLWlnbm9yZVxuICBjb250ZXh0ID09PSBSZWFjdFJlZHV4Q29udGV4dCA/IHVzZURlZmF1bHRSZWR1eENvbnRleHQgOiAvLyBAdHMtaWdub3JlXG4gIGNyZWF0ZVJlZHV4Q29udGV4dEhvb2soY29udGV4dCk7XG4gIHJldHVybiBmdW5jdGlvbiB1c2VTdG9yZSgpIHtcbiAgICBjb25zdCB7XG4gICAgICBzdG9yZVxuICAgIH0gPSB1c2VSZWR1eENvbnRleHQoKTsgLy8gQHRzLWlnbm9yZVxuXG4gICAgcmV0dXJuIHN0b3JlO1xuICB9O1xufVxuLyoqXHJcbiAqIEEgaG9vayB0byBhY2Nlc3MgdGhlIHJlZHV4IHN0b3JlLlxyXG4gKlxyXG4gKiBAcmV0dXJucyB7YW55fSB0aGUgcmVkdXggc3RvcmVcclxuICpcclxuICogQGV4YW1wbGVcclxuICpcclxuICogaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xyXG4gKiBpbXBvcnQgeyB1c2VTdG9yZSB9IGZyb20gJ3JlYWN0LXJlZHV4J1xyXG4gKlxyXG4gKiBleHBvcnQgY29uc3QgRXhhbXBsZUNvbXBvbmVudCA9ICgpID0+IHtcclxuICogICBjb25zdCBzdG9yZSA9IHVzZVN0b3JlKClcclxuICogICByZXR1cm4gPGRpdj57c3RvcmUuZ2V0U3RhdGUoKX08L2Rpdj5cclxuICogfVxyXG4gKi9cblxuZXhwb3J0IGNvbnN0IHVzZVN0b3JlID0gLyojX19QVVJFX18qL2NyZWF0ZVN0b3JlSG9vaygpOyIsIi8vIFRoZSBwcmltYXJ5IGVudHJ5IHBvaW50IGFzc3VtZXMgd2UncmUgd29ya2luZyB3aXRoIHN0YW5kYXJkIFJlYWN0RE9NL1JOLCBidXRcbi8vIG9sZGVyIHZlcnNpb25zIHRoYXQgZG8gbm90IGluY2x1ZGUgYHVzZVN5bmNFeHRlcm5hbFN0b3JlYCAoUmVhY3QgMTYuOSAtIDE3LngpLlxuLy8gQmVjYXVzZSBvZiB0aGF0LCB0aGUgdXNlU3luY0V4dGVybmFsU3RvcmUgY29tcGF0IHNoaW0gaXMgbmVlZGVkLlxuaW1wb3J0IHsgdXNlU3luY0V4dGVybmFsU3RvcmUgfSBmcm9tICd1c2Utc3luYy1leHRlcm5hbC1zdG9yZS9zaGltJztcbmltcG9ydCB7IHVzZVN5bmNFeHRlcm5hbFN0b3JlV2l0aFNlbGVjdG9yIH0gZnJvbSAndXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUvc2hpbS93aXRoLXNlbGVjdG9yJztcbmltcG9ydCB7IHVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzIGFzIGJhdGNoIH0gZnJvbSAnLi91dGlscy9yZWFjdEJhdGNoZWRVcGRhdGVzJztcbmltcG9ydCB7IHNldEJhdGNoIH0gZnJvbSAnLi91dGlscy9iYXRjaCc7XG5pbXBvcnQgeyBpbml0aWFsaXplVXNlU2VsZWN0b3IgfSBmcm9tICcuL2hvb2tzL3VzZVNlbGVjdG9yJztcbmltcG9ydCB7IGluaXRpYWxpemVDb25uZWN0IH0gZnJvbSAnLi9jb21wb25lbnRzL2Nvbm5lY3QnO1xuaW5pdGlhbGl6ZVVzZVNlbGVjdG9yKHVzZVN5bmNFeHRlcm5hbFN0b3JlV2l0aFNlbGVjdG9yKTtcbmluaXRpYWxpemVDb25uZWN0KHVzZVN5bmNFeHRlcm5hbFN0b3JlKTsgLy8gRW5hYmxlIGJhdGNoZWQgdXBkYXRlcyBpbiBvdXIgc3Vic2NyaXB0aW9ucyBmb3IgdXNlXG4vLyB3aXRoIHN0YW5kYXJkIFJlYWN0IHJlbmRlcmVycyAoUmVhY3RET00sIFJlYWN0IE5hdGl2ZSlcblxuc2V0QmF0Y2goYmF0Y2gpO1xuZXhwb3J0IHsgYmF0Y2ggfTtcbmV4cG9ydCAqIGZyb20gJy4vZXhwb3J0cyc7IiwiZXhwb3J0IHt9OyIsImltcG9ydCB7IGdldEJhdGNoIH0gZnJvbSAnLi9iYXRjaCc7IC8vIGVuY2Fwc3VsYXRlcyB0aGUgc3Vic2NyaXB0aW9uIGxvZ2ljIGZvciBjb25uZWN0aW5nIGEgY29tcG9uZW50IHRvIHRoZSByZWR1eCBzdG9yZSwgYXNcbi8vIHdlbGwgYXMgbmVzdGluZyBzdWJzY3JpcHRpb25zIG9mIGRlc2NlbmRhbnQgY29tcG9uZW50cywgc28gdGhhdCB3ZSBjYW4gZW5zdXJlIHRoZVxuLy8gYW5jZXN0b3IgY29tcG9uZW50cyByZS1yZW5kZXIgYmVmb3JlIGRlc2NlbmRhbnRzXG5cbmZ1bmN0aW9uIGNyZWF0ZUxpc3RlbmVyQ29sbGVjdGlvbigpIHtcbiAgY29uc3QgYmF0Y2ggPSBnZXRCYXRjaCgpO1xuICBsZXQgZmlyc3QgPSBudWxsO1xuICBsZXQgbGFzdCA9IG51bGw7XG4gIHJldHVybiB7XG4gICAgY2xlYXIoKSB7XG4gICAgICBmaXJzdCA9IG51bGw7XG4gICAgICBsYXN0ID0gbnVsbDtcbiAgICB9LFxuXG4gICAgbm90aWZ5KCkge1xuICAgICAgYmF0Y2goKCkgPT4ge1xuICAgICAgICBsZXQgbGlzdGVuZXIgPSBmaXJzdDtcblxuICAgICAgICB3aGlsZSAobGlzdGVuZXIpIHtcbiAgICAgICAgICBsaXN0ZW5lci5jYWxsYmFjaygpO1xuICAgICAgICAgIGxpc3RlbmVyID0gbGlzdGVuZXIubmV4dDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGdldCgpIHtcbiAgICAgIGxldCBsaXN0ZW5lcnMgPSBbXTtcbiAgICAgIGxldCBsaXN0ZW5lciA9IGZpcnN0O1xuXG4gICAgICB3aGlsZSAobGlzdGVuZXIpIHtcbiAgICAgICAgbGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgICAgICBsaXN0ZW5lciA9IGxpc3RlbmVyLm5leHQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBsaXN0ZW5lcnM7XG4gICAgfSxcblxuICAgIHN1YnNjcmliZShjYWxsYmFjaykge1xuICAgICAgbGV0IGlzU3Vic2NyaWJlZCA9IHRydWU7XG4gICAgICBsZXQgbGlzdGVuZXIgPSBsYXN0ID0ge1xuICAgICAgICBjYWxsYmFjayxcbiAgICAgICAgbmV4dDogbnVsbCxcbiAgICAgICAgcHJldjogbGFzdFxuICAgICAgfTtcblxuICAgICAgaWYgKGxpc3RlbmVyLnByZXYpIHtcbiAgICAgICAgbGlzdGVuZXIucHJldi5uZXh0ID0gbGlzdGVuZXI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaXJzdCA9IGxpc3RlbmVyO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZnVuY3Rpb24gdW5zdWJzY3JpYmUoKSB7XG4gICAgICAgIGlmICghaXNTdWJzY3JpYmVkIHx8IGZpcnN0ID09PSBudWxsKSByZXR1cm47XG4gICAgICAgIGlzU3Vic2NyaWJlZCA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChsaXN0ZW5lci5uZXh0KSB7XG4gICAgICAgICAgbGlzdGVuZXIubmV4dC5wcmV2ID0gbGlzdGVuZXIucHJldjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsYXN0ID0gbGlzdGVuZXIucHJldjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsaXN0ZW5lci5wcmV2KSB7XG4gICAgICAgICAgbGlzdGVuZXIucHJldi5uZXh0ID0gbGlzdGVuZXIubmV4dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaXJzdCA9IGxpc3RlbmVyLm5leHQ7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gIH07XG59XG5cbmNvbnN0IG51bGxMaXN0ZW5lcnMgPSB7XG4gIG5vdGlmeSgpIHt9LFxuXG4gIGdldDogKCkgPT4gW11cbn07XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU3Vic2NyaXB0aW9uKHN0b3JlLCBwYXJlbnRTdWIpIHtcbiAgbGV0IHVuc3Vic2NyaWJlO1xuICBsZXQgbGlzdGVuZXJzID0gbnVsbExpc3RlbmVyczsgLy8gUmVhc29ucyB0byBrZWVwIHRoZSBzdWJzY3JpcHRpb24gYWN0aXZlXG5cbiAgbGV0IHN1YnNjcmlwdGlvbnNBbW91bnQgPSAwOyAvLyBJcyB0aGlzIHNwZWNpZmljIHN1YnNjcmlwdGlvbiBzdWJzY3JpYmVkIChvciBvbmx5IG5lc3RlZCBvbmVzPylcblxuICBsZXQgc2VsZlN1YnNjcmliZWQgPSBmYWxzZTtcblxuICBmdW5jdGlvbiBhZGROZXN0ZWRTdWIobGlzdGVuZXIpIHtcbiAgICB0cnlTdWJzY3JpYmUoKTtcbiAgICBjb25zdCBjbGVhbnVwTGlzdGVuZXIgPSBsaXN0ZW5lcnMuc3Vic2NyaWJlKGxpc3RlbmVyKTsgLy8gY2xlYW51cCBuZXN0ZWQgc3ViXG5cbiAgICBsZXQgcmVtb3ZlZCA9IGZhbHNlO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBpZiAoIXJlbW92ZWQpIHtcbiAgICAgICAgcmVtb3ZlZCA9IHRydWU7XG4gICAgICAgIGNsZWFudXBMaXN0ZW5lcigpO1xuICAgICAgICB0cnlVbnN1YnNjcmliZSgpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBub3RpZnlOZXN0ZWRTdWJzKCkge1xuICAgIGxpc3RlbmVycy5ub3RpZnkoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZUNoYW5nZVdyYXBwZXIoKSB7XG4gICAgaWYgKHN1YnNjcmlwdGlvbi5vblN0YXRlQ2hhbmdlKSB7XG4gICAgICBzdWJzY3JpcHRpb24ub25TdGF0ZUNoYW5nZSgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGlzU3Vic2NyaWJlZCgpIHtcbiAgICByZXR1cm4gc2VsZlN1YnNjcmliZWQ7XG4gIH1cblxuICBmdW5jdGlvbiB0cnlTdWJzY3JpYmUoKSB7XG4gICAgc3Vic2NyaXB0aW9uc0Ftb3VudCsrO1xuXG4gICAgaWYgKCF1bnN1YnNjcmliZSkge1xuICAgICAgdW5zdWJzY3JpYmUgPSBwYXJlbnRTdWIgPyBwYXJlbnRTdWIuYWRkTmVzdGVkU3ViKGhhbmRsZUNoYW5nZVdyYXBwZXIpIDogc3RvcmUuc3Vic2NyaWJlKGhhbmRsZUNoYW5nZVdyYXBwZXIpO1xuICAgICAgbGlzdGVuZXJzID0gY3JlYXRlTGlzdGVuZXJDb2xsZWN0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdHJ5VW5zdWJzY3JpYmUoKSB7XG4gICAgc3Vic2NyaXB0aW9uc0Ftb3VudC0tO1xuXG4gICAgaWYgKHVuc3Vic2NyaWJlICYmIHN1YnNjcmlwdGlvbnNBbW91bnQgPT09IDApIHtcbiAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICB1bnN1YnNjcmliZSA9IHVuZGVmaW5lZDtcbiAgICAgIGxpc3RlbmVycy5jbGVhcigpO1xuICAgICAgbGlzdGVuZXJzID0gbnVsbExpc3RlbmVycztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB0cnlTdWJzY3JpYmVTZWxmKCkge1xuICAgIGlmICghc2VsZlN1YnNjcmliZWQpIHtcbiAgICAgIHNlbGZTdWJzY3JpYmVkID0gdHJ1ZTtcbiAgICAgIHRyeVN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHRyeVVuc3Vic2NyaWJlU2VsZigpIHtcbiAgICBpZiAoc2VsZlN1YnNjcmliZWQpIHtcbiAgICAgIHNlbGZTdWJzY3JpYmVkID0gZmFsc2U7XG4gICAgICB0cnlVbnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHN1YnNjcmlwdGlvbiA9IHtcbiAgICBhZGROZXN0ZWRTdWIsXG4gICAgbm90aWZ5TmVzdGVkU3VicyxcbiAgICBoYW5kbGVDaGFuZ2VXcmFwcGVyLFxuICAgIGlzU3Vic2NyaWJlZCxcbiAgICB0cnlTdWJzY3JpYmU6IHRyeVN1YnNjcmliZVNlbGYsXG4gICAgdHJ5VW5zdWJzY3JpYmU6IHRyeVVuc3Vic2NyaWJlU2VsZixcbiAgICBnZXRMaXN0ZW5lcnM6ICgpID0+IGxpc3RlbmVyc1xuICB9O1xuICByZXR1cm4gc3Vic2NyaXB0aW9uO1xufSIsIi8vIERlZmF1bHQgdG8gYSBkdW1teSBcImJhdGNoXCIgaW1wbGVtZW50YXRpb24gdGhhdCBqdXN0IHJ1bnMgdGhlIGNhbGxiYWNrXG5mdW5jdGlvbiBkZWZhdWx0Tm9vcEJhdGNoKGNhbGxiYWNrKSB7XG4gIGNhbGxiYWNrKCk7XG59XG5cbmxldCBiYXRjaCA9IGRlZmF1bHROb29wQmF0Y2g7IC8vIEFsbG93IGluamVjdGluZyBhbm90aGVyIGJhdGNoaW5nIGZ1bmN0aW9uIGxhdGVyXG5cbmV4cG9ydCBjb25zdCBzZXRCYXRjaCA9IG5ld0JhdGNoID0+IGJhdGNoID0gbmV3QmF0Y2g7IC8vIFN1cHBseSBhIGdldHRlciBqdXN0IHRvIHNraXAgZGVhbGluZyB3aXRoIEVTTSBiaW5kaW5nc1xuXG5leHBvcnQgY29uc3QgZ2V0QmF0Y2ggPSAoKSA9PiBiYXRjaDsiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBiaW5kQWN0aW9uQ3JlYXRvcnMoYWN0aW9uQ3JlYXRvcnMsIGRpc3BhdGNoKSB7XG4gIGNvbnN0IGJvdW5kQWN0aW9uQ3JlYXRvcnMgPSB7fTtcblxuICBmb3IgKGNvbnN0IGtleSBpbiBhY3Rpb25DcmVhdG9ycykge1xuICAgIGNvbnN0IGFjdGlvbkNyZWF0b3IgPSBhY3Rpb25DcmVhdG9yc1trZXldO1xuXG4gICAgaWYgKHR5cGVvZiBhY3Rpb25DcmVhdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBib3VuZEFjdGlvbkNyZWF0b3JzW2tleV0gPSAoLi4uYXJncykgPT4gZGlzcGF0Y2goYWN0aW9uQ3JlYXRvciguLi5hcmdzKSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJvdW5kQWN0aW9uQ3JlYXRvcnM7XG59IiwiLyoqXHJcbiAqIEBwYXJhbSB7YW55fSBvYmogVGhlIG9iamVjdCB0byBpbnNwZWN0LlxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgYXJndW1lbnQgYXBwZWFycyB0byBiZSBhIHBsYWluIG9iamVjdC5cclxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc1BsYWluT2JqZWN0KG9iaikge1xuICBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcgfHwgb2JqID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gIGxldCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopO1xuICBpZiAocHJvdG8gPT09IG51bGwpIHJldHVybiB0cnVlO1xuICBsZXQgYmFzZVByb3RvID0gcHJvdG87XG5cbiAgd2hpbGUgKE9iamVjdC5nZXRQcm90b3R5cGVPZihiYXNlUHJvdG8pICE9PSBudWxsKSB7XG4gICAgYmFzZVByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGJhc2VQcm90byk7XG4gIH1cblxuICByZXR1cm4gcHJvdG8gPT09IGJhc2VQcm90bztcbn0iLCJleHBvcnQgeyB1bnN0YWJsZV9iYXRjaGVkVXBkYXRlcyB9IGZyb20gJ3JlYWN0LWRvbSc7IiwiZnVuY3Rpb24gaXMoeCwgeSkge1xuICBpZiAoeCA9PT0geSkge1xuICAgIHJldHVybiB4ICE9PSAwIHx8IHkgIT09IDAgfHwgMSAvIHggPT09IDEgLyB5O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB4ICE9PSB4ICYmIHkgIT09IHk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc2hhbGxvd0VxdWFsKG9iakEsIG9iakIpIHtcbiAgaWYgKGlzKG9iakEsIG9iakIpKSByZXR1cm4gdHJ1ZTtcblxuICBpZiAodHlwZW9mIG9iakEgIT09ICdvYmplY3QnIHx8IG9iakEgPT09IG51bGwgfHwgdHlwZW9mIG9iakIgIT09ICdvYmplY3QnIHx8IG9iakIgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBrZXlzQSA9IE9iamVjdC5rZXlzKG9iakEpO1xuICBjb25zdCBrZXlzQiA9IE9iamVjdC5rZXlzKG9iakIpO1xuICBpZiAoa2V5c0EubGVuZ3RoICE9PSBrZXlzQi5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXNBLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqQiwga2V5c0FbaV0pIHx8ICFpcyhvYmpBW2tleXNBW2ldXSwgb2JqQltrZXlzQVtpXV0pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnOyAvLyBSZWFjdCBjdXJyZW50bHkgdGhyb3dzIGEgd2FybmluZyB3aGVuIHVzaW5nIHVzZUxheW91dEVmZmVjdCBvbiB0aGUgc2VydmVyLlxuLy8gVG8gZ2V0IGFyb3VuZCBpdCwgd2UgY2FuIGNvbmRpdGlvbmFsbHkgdXNlRWZmZWN0IG9uIHRoZSBzZXJ2ZXIgKG5vLW9wKSBhbmRcbi8vIHVzZUxheW91dEVmZmVjdCBpbiB0aGUgYnJvd3Nlci4gV2UgbmVlZCB1c2VMYXlvdXRFZmZlY3QgdG8gZW5zdXJlIHRoZSBzdG9yZVxuLy8gc3Vic2NyaXB0aW9uIGNhbGxiYWNrIGFsd2F5cyBoYXMgdGhlIHNlbGVjdG9yIGZyb20gdGhlIGxhdGVzdCByZW5kZXIgY29tbWl0XG4vLyBhdmFpbGFibGUsIG90aGVyd2lzZSBhIHN0b3JlIHVwZGF0ZSBtYXkgaGFwcGVuIGJldHdlZW4gcmVuZGVyIGFuZCB0aGUgZWZmZWN0LFxuLy8gd2hpY2ggbWF5IGNhdXNlIG1pc3NlZCB1cGRhdGVzOyB3ZSBhbHNvIG11c3QgZW5zdXJlIHRoZSBzdG9yZSBzdWJzY3JpcHRpb25cbi8vIGlzIGNyZWF0ZWQgc3luY2hyb25vdXNseSwgb3RoZXJ3aXNlIGEgc3RvcmUgdXBkYXRlIG1heSBvY2N1ciBiZWZvcmUgdGhlXG4vLyBzdWJzY3JpcHRpb24gaXMgY3JlYXRlZCBhbmQgYW4gaW5jb25zaXN0ZW50IHN0YXRlIG1heSBiZSBvYnNlcnZlZFxuLy8gTWF0Y2hlcyBsb2dpYyBpbiBSZWFjdCdzIGBzaGFyZWQvRXhlY3V0aW9uRW52aXJvbm1lbnRgIGZpbGVcblxuZXhwb3J0IGNvbnN0IGNhblVzZURPTSA9ICEhKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcpO1xuZXhwb3J0IGNvbnN0IHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QgPSBjYW5Vc2VET00gPyBSZWFjdC51c2VMYXlvdXRFZmZlY3QgOiBSZWFjdC51c2VFZmZlY3Q7IiwiZXhwb3J0IGNvbnN0IG5vdEluaXRpYWxpemVkID0gKCkgPT4ge1xuICB0aHJvdyBuZXcgRXJyb3IoJ3VTRVMgbm90IGluaXRpYWxpemVkIScpO1xufTsiLCJpbXBvcnQgaXNQbGFpbk9iamVjdCBmcm9tICcuL2lzUGxhaW5PYmplY3QnO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSAnLi93YXJuaW5nJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZlcmlmeVBsYWluT2JqZWN0KHZhbHVlLCBkaXNwbGF5TmFtZSwgbWV0aG9kTmFtZSkge1xuICBpZiAoIWlzUGxhaW5PYmplY3QodmFsdWUpKSB7XG4gICAgd2FybmluZyhgJHttZXRob2ROYW1lfSgpIGluICR7ZGlzcGxheU5hbWV9IG11c3QgcmV0dXJuIGEgcGxhaW4gb2JqZWN0LiBJbnN0ZWFkIHJlY2VpdmVkICR7dmFsdWV9LmApO1xuICB9XG59IiwiLyoqXHJcbiAqIFByaW50cyBhIHdhcm5pbmcgaW4gdGhlIGNvbnNvbGUgaWYgaXQgZXhpc3RzLlxyXG4gKlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBUaGUgd2FybmluZyBtZXNzYWdlLlxyXG4gKiBAcmV0dXJucyB7dm9pZH1cclxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB3YXJuaW5nKG1lc3NhZ2UpIHtcbiAgLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBjb25zb2xlLmVycm9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgfVxuICAvKiBlc2xpbnQtZW5hYmxlIG5vLWNvbnNvbGUgKi9cblxuXG4gIHRyeSB7XG4gICAgLy8gVGhpcyBlcnJvciB3YXMgdGhyb3duIGFzIGEgY29udmVuaWVuY2Ugc28gdGhhdCBpZiB5b3UgZW5hYmxlXG4gICAgLy8gXCJicmVhayBvbiBhbGwgZXhjZXB0aW9uc1wiIGluIHlvdXIgY29uc29sZSxcbiAgICAvLyBpdCB3b3VsZCBwYXVzZSB0aGUgZXhlY3V0aW9uIGF0IHRoaXMgbGluZS5cbiAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgLyogZXNsaW50LWRpc2FibGUgbm8tZW1wdHkgKi9cbiAgfSBjYXRjaCAoZSkge31cbiAgLyogZXNsaW50LWVuYWJsZSBuby1lbXB0eSAqL1xuXG59IiwiLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogcmVhY3QtaXMuZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgKGZ1bmN0aW9uKCkge1xuJ3VzZSBzdHJpY3QnO1xuXG4vLyBBVFRFTlRJT05cbi8vIFdoZW4gYWRkaW5nIG5ldyBzeW1ib2xzIHRvIHRoaXMgZmlsZSxcbi8vIFBsZWFzZSBjb25zaWRlciBhbHNvIGFkZGluZyB0byAncmVhY3QtZGV2dG9vbHMtc2hhcmVkL3NyYy9iYWNrZW5kL1JlYWN0U3ltYm9scydcbi8vIFRoZSBTeW1ib2wgdXNlZCB0byB0YWcgdGhlIFJlYWN0RWxlbWVudC1saWtlIHR5cGVzLlxudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKTtcbnZhciBSRUFDVF9QT1JUQUxfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnBvcnRhbCcpO1xudmFyIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5mcmFnbWVudCcpO1xudmFyIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdHJpY3RfbW9kZScpO1xudmFyIFJFQUNUX1BST0ZJTEVSX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wcm9maWxlcicpO1xudmFyIFJFQUNUX1BST1ZJREVSX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wcm92aWRlcicpO1xudmFyIFJFQUNUX0NPTlRFWFRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmNvbnRleHQnKTtcbnZhciBSRUFDVF9TRVJWRVJfQ09OVEVYVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc2VydmVyX2NvbnRleHQnKTtcbnZhciBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZm9yd2FyZF9yZWYnKTtcbnZhciBSRUFDVF9TVVNQRU5TRV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2UnKTtcbnZhciBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZV9saXN0Jyk7XG52YXIgUkVBQ1RfTUVNT19UWVBFID0gU3ltYm9sLmZvcigncmVhY3QubWVtbycpO1xudmFyIFJFQUNUX0xBWllfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmxhenknKTtcbnZhciBSRUFDVF9PRkZTQ1JFRU5fVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0Lm9mZnNjcmVlbicpO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG52YXIgZW5hYmxlU2NvcGVBUEkgPSBmYWxzZTsgLy8gRXhwZXJpbWVudGFsIENyZWF0ZSBFdmVudCBIYW5kbGUgQVBJLlxudmFyIGVuYWJsZUNhY2hlRWxlbWVudCA9IGZhbHNlO1xudmFyIGVuYWJsZVRyYW5zaXRpb25UcmFjaW5nID0gZmFsc2U7IC8vIE5vIGtub3duIGJ1Z3MsIGJ1dCBuZWVkcyBwZXJmb3JtYW5jZSB0ZXN0aW5nXG5cbnZhciBlbmFibGVMZWdhY3lIaWRkZW4gPSBmYWxzZTsgLy8gRW5hYmxlcyB1bnN0YWJsZV9hdm9pZFRoaXNGYWxsYmFjayBmZWF0dXJlIGluIEZpYmVyXG4vLyBzdHVmZi4gSW50ZW5kZWQgdG8gZW5hYmxlIFJlYWN0IGNvcmUgbWVtYmVycyB0byBtb3JlIGVhc2lseSBkZWJ1ZyBzY2hlZHVsaW5nXG4vLyBpc3N1ZXMgaW4gREVWIGJ1aWxkcy5cblxudmFyIGVuYWJsZURlYnVnVHJhY2luZyA9IGZhbHNlOyAvLyBUcmFjayB3aGljaCBGaWJlcihzKSBzY2hlZHVsZSByZW5kZXIgd29yay5cblxudmFyIFJFQUNUX01PRFVMRV9SRUZFUkVOQ0U7XG5cbntcbiAgUkVBQ1RfTU9EVUxFX1JFRkVSRU5DRSA9IFN5bWJvbC5mb3IoJ3JlYWN0Lm1vZHVsZS5yZWZlcmVuY2UnKTtcbn1cblxuZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpIHtcbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIE5vdGU6IHR5cGVvZiBtaWdodCBiZSBvdGhlciB0aGFuICdzeW1ib2wnIG9yICdudW1iZXInIChlLmcuIGlmIGl0J3MgYSBwb2x5ZmlsbCkuXG5cblxuICBpZiAodHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9QUk9GSUxFUl9UWVBFIHx8IGVuYWJsZURlYnVnVHJhY2luZyAgfHwgdHlwZSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSB8fCBlbmFibGVMZWdhY3lIaWRkZW4gIHx8IHR5cGUgPT09IFJFQUNUX09GRlNDUkVFTl9UWVBFIHx8IGVuYWJsZVNjb3BlQVBJICB8fCBlbmFibGVDYWNoZUVsZW1lbnQgIHx8IGVuYWJsZVRyYW5zaXRpb25UcmFjaW5nICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsKSB7XG4gICAgaWYgKHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9DT05URVhUX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSB8fCAvLyBUaGlzIG5lZWRzIHRvIGluY2x1ZGUgYWxsIHBvc3NpYmxlIG1vZHVsZSByZWZlcmVuY2Ugb2JqZWN0XG4gICAgLy8gdHlwZXMgc3VwcG9ydGVkIGJ5IGFueSBGbGlnaHQgY29uZmlndXJhdGlvbiBhbnl3aGVyZSBzaW5jZVxuICAgIC8vIHdlIGRvbid0IGtub3cgd2hpY2ggRmxpZ2h0IGJ1aWxkIHRoaXMgd2lsbCBlbmQgdXAgYmVpbmcgdXNlZFxuICAgIC8vIHdpdGguXG4gICAgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTU9EVUxFX1JFRkVSRU5DRSB8fCB0eXBlLmdldE1vZHVsZUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gdHlwZU9mKG9iamVjdCkge1xuICBpZiAodHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyICQkdHlwZW9mID0gb2JqZWN0LiQkdHlwZW9mO1xuXG4gICAgc3dpdGNoICgkJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgIHZhciB0eXBlID0gb2JqZWN0LnR5cGU7XG5cbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgY2FzZSBSRUFDVF9GUkFHTUVOVF9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfUFJPRklMRVJfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1NUUklDVF9NT0RFX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFOlxuICAgICAgICAgICAgcmV0dXJuIHR5cGU7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdmFyICQkdHlwZW9mVHlwZSA9IHR5cGUgJiYgdHlwZS4kJHR5cGVvZjtcblxuICAgICAgICAgICAgc3dpdGNoICgkJHR5cGVvZlR5cGUpIHtcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9TRVJWRVJfQ09OVEVYVF9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfUFJPVklERVJfVFlQRTpcbiAgICAgICAgICAgICAgICByZXR1cm4gJCR0eXBlb2ZUeXBlO1xuXG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuICQkdHlwZW9mO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgcmV0dXJuICQkdHlwZW9mO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG52YXIgQ29udGV4dENvbnN1bWVyID0gUkVBQ1RfQ09OVEVYVF9UWVBFO1xudmFyIENvbnRleHRQcm92aWRlciA9IFJFQUNUX1BST1ZJREVSX1RZUEU7XG52YXIgRWxlbWVudCA9IFJFQUNUX0VMRU1FTlRfVFlQRTtcbnZhciBGb3J3YXJkUmVmID0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTtcbnZhciBGcmFnbWVudCA9IFJFQUNUX0ZSQUdNRU5UX1RZUEU7XG52YXIgTGF6eSA9IFJFQUNUX0xBWllfVFlQRTtcbnZhciBNZW1vID0gUkVBQ1RfTUVNT19UWVBFO1xudmFyIFBvcnRhbCA9IFJFQUNUX1BPUlRBTF9UWVBFO1xudmFyIFByb2ZpbGVyID0gUkVBQ1RfUFJPRklMRVJfVFlQRTtcbnZhciBTdHJpY3RNb2RlID0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRTtcbnZhciBTdXNwZW5zZSA9IFJFQUNUX1NVU1BFTlNFX1RZUEU7XG52YXIgU3VzcGVuc2VMaXN0ID0gUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFO1xudmFyIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlID0gZmFsc2U7XG52YXIgaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNDb25jdXJyZW50TW9kZSA9IGZhbHNlOyAvLyBBc3luY01vZGUgc2hvdWxkIGJlIGRlcHJlY2F0ZWRcblxuZnVuY3Rpb24gaXNBc3luY01vZGUob2JqZWN0KSB7XG4gIHtcbiAgICBpZiAoIWhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlKSB7XG4gICAgICBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0FzeW5jTW9kZSA9IHRydWU7IC8vIFVzaW5nIGNvbnNvbGVbJ3dhcm4nXSB0byBldmFkZSBCYWJlbCBhbmQgRVNMaW50XG5cbiAgICAgIGNvbnNvbGVbJ3dhcm4nXSgnVGhlIFJlYWN0SXMuaXNBc3luY01vZGUoKSBhbGlhcyBoYXMgYmVlbiBkZXByZWNhdGVkLCAnICsgJ2FuZCB3aWxsIGJlIHJlbW92ZWQgaW4gUmVhY3QgMTgrLicpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGlzQ29uY3VycmVudE1vZGUob2JqZWN0KSB7XG4gIHtcbiAgICBpZiAoIWhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQ29uY3VycmVudE1vZGUpIHtcbiAgICAgIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQ29uY3VycmVudE1vZGUgPSB0cnVlOyAvLyBVc2luZyBjb25zb2xlWyd3YXJuJ10gdG8gZXZhZGUgQmFiZWwgYW5kIEVTTGludFxuXG4gICAgICBjb25zb2xlWyd3YXJuJ10oJ1RoZSBSZWFjdElzLmlzQ29uY3VycmVudE1vZGUoKSBhbGlhcyBoYXMgYmVlbiBkZXByZWNhdGVkLCAnICsgJ2FuZCB3aWxsIGJlIHJlbW92ZWQgaW4gUmVhY3QgMTgrLicpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGlzQ29udGV4dENvbnN1bWVyKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0NPTlRFWFRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzQ29udGV4dFByb3ZpZGVyKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1BST1ZJREVSX1RZUEU7XG59XG5mdW5jdGlvbiBpc0VsZW1lbnQob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QgIT09IG51bGwgJiYgb2JqZWN0LiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEU7XG59XG5mdW5jdGlvbiBpc0ZvcndhcmRSZWYob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRnJhZ21lbnQob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzTGF6eShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9MQVpZX1RZUEU7XG59XG5mdW5jdGlvbiBpc01lbW8ob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfTUVNT19UWVBFO1xufVxuZnVuY3Rpb24gaXNQb3J0YWwob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUE9SVEFMX1RZUEU7XG59XG5mdW5jdGlvbiBpc1Byb2ZpbGVyKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1BST0ZJTEVSX1RZUEU7XG59XG5mdW5jdGlvbiBpc1N0cmljdE1vZGUob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzU3VzcGVuc2Uob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfU1VTUEVOU0VfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzU3VzcGVuc2VMaXN0KG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTtcbn1cblxuZXhwb3J0cy5Db250ZXh0Q29uc3VtZXIgPSBDb250ZXh0Q29uc3VtZXI7XG5leHBvcnRzLkNvbnRleHRQcm92aWRlciA9IENvbnRleHRQcm92aWRlcjtcbmV4cG9ydHMuRWxlbWVudCA9IEVsZW1lbnQ7XG5leHBvcnRzLkZvcndhcmRSZWYgPSBGb3J3YXJkUmVmO1xuZXhwb3J0cy5GcmFnbWVudCA9IEZyYWdtZW50O1xuZXhwb3J0cy5MYXp5ID0gTGF6eTtcbmV4cG9ydHMuTWVtbyA9IE1lbW87XG5leHBvcnRzLlBvcnRhbCA9IFBvcnRhbDtcbmV4cG9ydHMuUHJvZmlsZXIgPSBQcm9maWxlcjtcbmV4cG9ydHMuU3RyaWN0TW9kZSA9IFN0cmljdE1vZGU7XG5leHBvcnRzLlN1c3BlbnNlID0gU3VzcGVuc2U7XG5leHBvcnRzLlN1c3BlbnNlTGlzdCA9IFN1c3BlbnNlTGlzdDtcbmV4cG9ydHMuaXNBc3luY01vZGUgPSBpc0FzeW5jTW9kZTtcbmV4cG9ydHMuaXNDb25jdXJyZW50TW9kZSA9IGlzQ29uY3VycmVudE1vZGU7XG5leHBvcnRzLmlzQ29udGV4dENvbnN1bWVyID0gaXNDb250ZXh0Q29uc3VtZXI7XG5leHBvcnRzLmlzQ29udGV4dFByb3ZpZGVyID0gaXNDb250ZXh0UHJvdmlkZXI7XG5leHBvcnRzLmlzRWxlbWVudCA9IGlzRWxlbWVudDtcbmV4cG9ydHMuaXNGb3J3YXJkUmVmID0gaXNGb3J3YXJkUmVmO1xuZXhwb3J0cy5pc0ZyYWdtZW50ID0gaXNGcmFnbWVudDtcbmV4cG9ydHMuaXNMYXp5ID0gaXNMYXp5O1xuZXhwb3J0cy5pc01lbW8gPSBpc01lbW87XG5leHBvcnRzLmlzUG9ydGFsID0gaXNQb3J0YWw7XG5leHBvcnRzLmlzUHJvZmlsZXIgPSBpc1Byb2ZpbGVyO1xuZXhwb3J0cy5pc1N0cmljdE1vZGUgPSBpc1N0cmljdE1vZGU7XG5leHBvcnRzLmlzU3VzcGVuc2UgPSBpc1N1c3BlbnNlO1xuZXhwb3J0cy5pc1N1c3BlbnNlTGlzdCA9IGlzU3VzcGVuc2VMaXN0O1xuZXhwb3J0cy5pc1ZhbGlkRWxlbWVudFR5cGUgPSBpc1ZhbGlkRWxlbWVudFR5cGU7XG5leHBvcnRzLnR5cGVPZiA9IHR5cGVPZjtcbiAgfSkoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1pcy5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1pcy5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdhcGF0aHknLFxuICBhdXRob3I6ICdqYW5uaWsgc2llYmVydCAoaHR0cHM6Ly9naXRodWIuY29tL2phbm5pa3MpJyxcbiAgYmFzZTAwOiAnIzAzMUExNicsXG4gIGJhc2UwMTogJyMwQjM0MkQnLFxuICBiYXNlMDI6ICcjMTg0RTQ1JyxcbiAgYmFzZTAzOiAnIzJCNjg1RScsXG4gIGJhc2UwNDogJyM1RjlDOTInLFxuICBiYXNlMDU6ICcjODFCNUFDJyxcbiAgYmFzZTA2OiAnI0E3Q0VDOCcsXG4gIGJhc2UwNzogJyNEMkU3RTQnLFxuICBiYXNlMDg6ICcjM0U5Njg4JyxcbiAgYmFzZTA5OiAnIzNFNzk5NicsXG4gIGJhc2UwQTogJyMzRTRDOTYnLFxuICBiYXNlMEI6ICcjODgzRTk2JyxcbiAgYmFzZTBDOiAnIzk2M0U0QycsXG4gIGJhc2UwRDogJyM5Njg4M0UnLFxuICBiYXNlMEU6ICcjNEM5NjNFJyxcbiAgYmFzZTBGOiAnIzNFOTY1Qidcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ2FzaGVzJyxcbiAgYXV0aG9yOiAnamFubmlrIHNpZWJlcnQgKGh0dHBzOi8vZ2l0aHViLmNvbS9qYW5uaWtzKScsXG4gIGJhc2UwMDogJyMxQzIwMjMnLFxuICBiYXNlMDE6ICcjMzkzRjQ1JyxcbiAgYmFzZTAyOiAnIzU2NUU2NScsXG4gIGJhc2UwMzogJyM3NDdDODQnLFxuICBiYXNlMDQ6ICcjQURCM0JBJyxcbiAgYmFzZTA1OiAnI0M3Q0NEMScsXG4gIGJhc2UwNjogJyNERkUyRTUnLFxuICBiYXNlMDc6ICcjRjNGNEY1JyxcbiAgYmFzZTA4OiAnI0M3QUU5NScsXG4gIGJhc2UwOTogJyNDN0M3OTUnLFxuICBiYXNlMEE6ICcjQUVDNzk1JyxcbiAgYmFzZTBCOiAnIzk1QzdBRScsXG4gIGJhc2UwQzogJyM5NUFFQzcnLFxuICBiYXNlMEQ6ICcjQUU5NUM3JyxcbiAgYmFzZTBFOiAnI0M3OTVBRScsXG4gIGJhc2UwRjogJyNDNzk1OTUnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdhdGVsaWVyIGR1bmUnLFxuICBhdXRob3I6ICdicmFtIGRlIGhhYW4gKGh0dHA6Ly9hdGVsaWVyYnJhbS5naXRodWIuaW8vc3ludGF4LWhpZ2hsaWdodGluZy9hdGVsaWVyLXNjaGVtZXMvZHVuZSknLFxuICBiYXNlMDA6ICcjMjAyMDFkJyxcbiAgYmFzZTAxOiAnIzI5MjgyNCcsXG4gIGJhc2UwMjogJyM2ZTZiNWUnLFxuICBiYXNlMDM6ICcjN2Q3YTY4JyxcbiAgYmFzZTA0OiAnIzk5OTU4MCcsXG4gIGJhc2UwNTogJyNhNmEyOGMnLFxuICBiYXNlMDY6ICcjZThlNGNmJyxcbiAgYmFzZTA3OiAnI2ZlZmJlYycsXG4gIGJhc2UwODogJyNkNzM3MzcnLFxuICBiYXNlMDk6ICcjYjY1NjExJyxcbiAgYmFzZTBBOiAnI2NmYjAxNycsXG4gIGJhc2UwQjogJyM2MGFjMzknLFxuICBiYXNlMEM6ICcjMWZhZDgzJyxcbiAgYmFzZTBEOiAnIzY2ODRlMScsXG4gIGJhc2UwRTogJyNiODU0ZDQnLFxuICBiYXNlMEY6ICcjZDQzNTUyJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnYXRlbGllciBmb3Jlc3QnLFxuICBhdXRob3I6ICdicmFtIGRlIGhhYW4gKGh0dHA6Ly9hdGVsaWVyYnJhbS5naXRodWIuaW8vc3ludGF4LWhpZ2hsaWdodGluZy9hdGVsaWVyLXNjaGVtZXMvZm9yZXN0KScsXG4gIGJhc2UwMDogJyMxYjE5MTgnLFxuICBiYXNlMDE6ICcjMmMyNDIxJyxcbiAgYmFzZTAyOiAnIzY4NjE1ZScsXG4gIGJhc2UwMzogJyM3NjZlNmInLFxuICBiYXNlMDQ6ICcjOWM5NDkxJyxcbiAgYmFzZTA1OiAnI2E4YTE5ZicsXG4gIGJhc2UwNjogJyNlNmUyZTAnLFxuICBiYXNlMDc6ICcjZjFlZmVlJyxcbiAgYmFzZTA4OiAnI2YyMmM0MCcsXG4gIGJhc2UwOTogJyNkZjUzMjAnLFxuICBiYXNlMEE6ICcjZDU5MTFhJyxcbiAgYmFzZTBCOiAnIzVhYjczOCcsXG4gIGJhc2UwQzogJyMwMGFkOWMnLFxuICBiYXNlMEQ6ICcjNDA3ZWU3JyxcbiAgYmFzZTBFOiAnIzY2NjZlYScsXG4gIGJhc2UwRjogJyNjMzNmZjMnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdhdGVsaWVyIGhlYXRoJyxcbiAgYXV0aG9yOiAnYnJhbSBkZSBoYWFuIChodHRwOi8vYXRlbGllcmJyYW0uZ2l0aHViLmlvL3N5bnRheC1oaWdobGlnaHRpbmcvYXRlbGllci1zY2hlbWVzL2hlYXRoKScsXG4gIGJhc2UwMDogJyMxYjE4MWInLFxuICBiYXNlMDE6ICcjMjkyMzI5JyxcbiAgYmFzZTAyOiAnIzY5NWQ2OScsXG4gIGJhc2UwMzogJyM3NzY5NzcnLFxuICBiYXNlMDQ6ICcjOWU4ZjllJyxcbiAgYmFzZTA1OiAnI2FiOWJhYicsXG4gIGJhc2UwNjogJyNkOGNhZDgnLFxuICBiYXNlMDc6ICcjZjdmM2Y3JyxcbiAgYmFzZTA4OiAnI2NhNDAyYicsXG4gIGJhc2UwOTogJyNhNjU5MjYnLFxuICBiYXNlMEE6ICcjYmI4YTM1JyxcbiAgYmFzZTBCOiAnIzM3OWEzNycsXG4gIGJhc2UwQzogJyMxNTkzOTMnLFxuICBiYXNlMEQ6ICcjNTE2YWVjJyxcbiAgYmFzZTBFOiAnIzdiNTljMCcsXG4gIGJhc2UwRjogJyNjYzMzY2MnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdhdGVsaWVyIGxha2VzaWRlJyxcbiAgYXV0aG9yOiAnYnJhbSBkZSBoYWFuIChodHRwOi8vYXRlbGllcmJyYW0uZ2l0aHViLmlvL3N5bnRheC1oaWdobGlnaHRpbmcvYXRlbGllci1zY2hlbWVzL2xha2VzaWRlLyknLFxuICBiYXNlMDA6ICcjMTYxYjFkJyxcbiAgYmFzZTAxOiAnIzFmMjkyZScsXG4gIGJhc2UwMjogJyM1MTZkN2InLFxuICBiYXNlMDM6ICcjNWE3YjhjJyxcbiAgYmFzZTA0OiAnIzcxOTVhOCcsXG4gIGJhc2UwNTogJyM3ZWEyYjQnLFxuICBiYXNlMDY6ICcjYzFlNGY2JyxcbiAgYmFzZTA3OiAnI2ViZjhmZicsXG4gIGJhc2UwODogJyNkMjJkNzInLFxuICBiYXNlMDk6ICcjOTM1YzI1JyxcbiAgYmFzZTBBOiAnIzhhOGEwZicsXG4gIGJhc2UwQjogJyM1NjhjM2InLFxuICBiYXNlMEM6ICcjMmQ4ZjZmJyxcbiAgYmFzZTBEOiAnIzI1N2ZhZCcsXG4gIGJhc2UwRTogJyM1ZDVkYjEnLFxuICBiYXNlMEY6ICcjYjcyZGQyJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnYXRlbGllciBzZWFzaWRlJyxcbiAgYXV0aG9yOiAnYnJhbSBkZSBoYWFuIChodHRwOi8vYXRlbGllcmJyYW0uZ2l0aHViLmlvL3N5bnRheC1oaWdobGlnaHRpbmcvYXRlbGllci1zY2hlbWVzL3NlYXNpZGUvKScsXG4gIGJhc2UwMDogJyMxMzE1MTMnLFxuICBiYXNlMDE6ICcjMjQyOTI0JyxcbiAgYmFzZTAyOiAnIzVlNmU1ZScsXG4gIGJhc2UwMzogJyM2ODdkNjgnLFxuICBiYXNlMDQ6ICcjODA5OTgwJyxcbiAgYmFzZTA1OiAnIzhjYTY4YycsXG4gIGJhc2UwNjogJyNjZmU4Y2YnLFxuICBiYXNlMDc6ICcjZjBmZmYwJyxcbiAgYmFzZTA4OiAnI2U2MTkzYycsXG4gIGJhc2UwOTogJyM4NzcxMWQnLFxuICBiYXNlMEE6ICcjYzNjMzIyJyxcbiAgYmFzZTBCOiAnIzI5YTMyOScsXG4gIGJhc2UwQzogJyMxOTk5YjMnLFxuICBiYXNlMEQ6ICcjM2Q2MmY1JyxcbiAgYmFzZTBFOiAnI2FkMmJlZScsXG4gIGJhc2UwRjogJyNlNjE5YzMnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdiZXNwaW4nLFxuICBhdXRob3I6ICdqYW4gdC4gc290dCcsXG4gIGJhc2UwMDogJyMyODIxMWMnLFxuICBiYXNlMDE6ICcjMzYzMTJlJyxcbiAgYmFzZTAyOiAnIzVlNWQ1YycsXG4gIGJhc2UwMzogJyM2NjY2NjYnLFxuICBiYXNlMDQ6ICcjNzk3OTc3JyxcbiAgYmFzZTA1OiAnIzhhODk4NicsXG4gIGJhc2UwNjogJyM5ZDliOTcnLFxuICBiYXNlMDc6ICcjYmFhZTllJyxcbiAgYmFzZTA4OiAnI2NmNmE0YycsXG4gIGJhc2UwOTogJyNjZjdkMzQnLFxuICBiYXNlMEE6ICcjZjllZTk4JyxcbiAgYmFzZTBCOiAnIzU0YmUwZCcsXG4gIGJhc2UwQzogJyNhZmM0ZGInLFxuICBiYXNlMEQ6ICcjNWVhNmVhJyxcbiAgYmFzZTBFOiAnIzliODU5ZCcsXG4gIGJhc2UwRjogJyM5MzcxMjEnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdicmV3ZXInLFxuICBhdXRob3I6ICd0aW1vdGjDqWUgcG9pc290IChodHRwOi8vZ2l0aHViLmNvbS90cG9pc290KScsXG4gIGJhc2UwMDogJyMwYzBkMGUnLFxuICBiYXNlMDE6ICcjMmUyZjMwJyxcbiAgYmFzZTAyOiAnIzUxNTI1MycsXG4gIGJhc2UwMzogJyM3Mzc0NzUnLFxuICBiYXNlMDQ6ICcjOTU5Njk3JyxcbiAgYmFzZTA1OiAnI2I3YjhiOScsXG4gIGJhc2UwNjogJyNkYWRiZGMnLFxuICBiYXNlMDc6ICcjZmNmZGZlJyxcbiAgYmFzZTA4OiAnI2UzMWExYycsXG4gIGJhc2UwOTogJyNlNjU1MGQnLFxuICBiYXNlMEE6ICcjZGNhMDYwJyxcbiAgYmFzZTBCOiAnIzMxYTM1NCcsXG4gIGJhc2UwQzogJyM4MGIxZDMnLFxuICBiYXNlMEQ6ICcjMzE4MmJkJyxcbiAgYmFzZTBFOiAnIzc1NmJiMScsXG4gIGJhc2UwRjogJyNiMTU5MjgnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdicmlnaHQnLFxuICBhdXRob3I6ICdjaHJpcyBrZW1wc29uIChodHRwOi8vY2hyaXNrZW1wc29uLmNvbSknLFxuICBiYXNlMDA6ICcjMDAwMDAwJyxcbiAgYmFzZTAxOiAnIzMwMzAzMCcsXG4gIGJhc2UwMjogJyM1MDUwNTAnLFxuICBiYXNlMDM6ICcjYjBiMGIwJyxcbiAgYmFzZTA0OiAnI2QwZDBkMCcsXG4gIGJhc2UwNTogJyNlMGUwZTAnLFxuICBiYXNlMDY6ICcjZjVmNWY1JyxcbiAgYmFzZTA3OiAnI2ZmZmZmZicsXG4gIGJhc2UwODogJyNmYjAxMjAnLFxuICBiYXNlMDk6ICcjZmM2ZDI0JyxcbiAgYmFzZTBBOiAnI2ZkYTMzMScsXG4gIGJhc2UwQjogJyNhMWM2NTknLFxuICBiYXNlMEM6ICcjNzZjN2I3JyxcbiAgYmFzZTBEOiAnIzZmYjNkMicsXG4gIGJhc2UwRTogJyNkMzgxYzMnLFxuICBiYXNlMEY6ICcjYmU2NDNjJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnY2hhbGsnLFxuICBhdXRob3I6ICdjaHJpcyBrZW1wc29uIChodHRwOi8vY2hyaXNrZW1wc29uLmNvbSknLFxuICBiYXNlMDA6ICcjMTUxNTE1JyxcbiAgYmFzZTAxOiAnIzIwMjAyMCcsXG4gIGJhc2UwMjogJyMzMDMwMzAnLFxuICBiYXNlMDM6ICcjNTA1MDUwJyxcbiAgYmFzZTA0OiAnI2IwYjBiMCcsXG4gIGJhc2UwNTogJyNkMGQwZDAnLFxuICBiYXNlMDY6ICcjZTBlMGUwJyxcbiAgYmFzZTA3OiAnI2Y1ZjVmNScsXG4gIGJhc2UwODogJyNmYjlmYjEnLFxuICBiYXNlMDk6ICcjZWRhOTg3JyxcbiAgYmFzZTBBOiAnI2RkYjI2ZicsXG4gIGJhc2UwQjogJyNhY2MyNjcnLFxuICBiYXNlMEM6ICcjMTJjZmMwJyxcbiAgYmFzZTBEOiAnIzZmYzJlZicsXG4gIGJhc2UwRTogJyNlMWEzZWUnLFxuICBiYXNlMEY6ICcjZGVhZjhmJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnY29kZXNjaG9vbCcsXG4gIGF1dGhvcjogJ2JyZXR0b2Y4NicsXG4gIGJhc2UwMDogJyMyMzJjMzEnLFxuICBiYXNlMDE6ICcjMWMzNjU3JyxcbiAgYmFzZTAyOiAnIzJhMzQzYScsXG4gIGJhc2UwMzogJyMzZjQ5NDQnLFxuICBiYXNlMDQ6ICcjODQ4OThjJyxcbiAgYmFzZTA1OiAnIzllYTdhNicsXG4gIGJhc2UwNjogJyNhN2NmYTMnLFxuICBiYXNlMDc6ICcjYjVkOGY2JyxcbiAgYmFzZTA4OiAnIzJhNTQ5MScsXG4gIGJhc2UwOTogJyM0MzgyMGQnLFxuICBiYXNlMEE6ICcjYTAzYjFlJyxcbiAgYmFzZTBCOiAnIzIzNzk4NicsXG4gIGJhc2UwQzogJyNiMDJmMzAnLFxuICBiYXNlMEQ6ICcjNDg0ZDc5JyxcbiAgYmFzZTBFOiAnI2M1OTgyMCcsXG4gIGJhc2UwRjogJyNjOTgzNDQnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdjb2xvcnMnLFxuICBhdXRob3I6ICdtcm1ycyAoaHR0cDovL2NscnMuY2MpJyxcbiAgYmFzZTAwOiAnIzExMTExMScsXG4gIGJhc2UwMTogJyMzMzMzMzMnLFxuICBiYXNlMDI6ICcjNTU1NTU1JyxcbiAgYmFzZTAzOiAnIzc3Nzc3NycsXG4gIGJhc2UwNDogJyM5OTk5OTknLFxuICBiYXNlMDU6ICcjYmJiYmJiJyxcbiAgYmFzZTA2OiAnI2RkZGRkZCcsXG4gIGJhc2UwNzogJyNmZmZmZmYnLFxuICBiYXNlMDg6ICcjZmY0MTM2JyxcbiAgYmFzZTA5OiAnI2ZmODUxYicsXG4gIGJhc2UwQTogJyNmZmRjMDAnLFxuICBiYXNlMEI6ICcjMmVjYzQwJyxcbiAgYmFzZTBDOiAnIzdmZGJmZicsXG4gIGJhc2UwRDogJyMwMDc0ZDknLFxuICBiYXNlMEU6ICcjYjEwZGM5JyxcbiAgYmFzZTBGOiAnIzg1MTQ0Yidcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ2RlZmF1bHQnLFxuICBhdXRob3I6ICdjaHJpcyBrZW1wc29uIChodHRwOi8vY2hyaXNrZW1wc29uLmNvbSknLFxuICBiYXNlMDA6ICcjMTgxODE4JyxcbiAgYmFzZTAxOiAnIzI4MjgyOCcsXG4gIGJhc2UwMjogJyMzODM4MzgnLFxuICBiYXNlMDM6ICcjNTg1ODU4JyxcbiAgYmFzZTA0OiAnI2I4YjhiOCcsXG4gIGJhc2UwNTogJyNkOGQ4ZDgnLFxuICBiYXNlMDY6ICcjZThlOGU4JyxcbiAgYmFzZTA3OiAnI2Y4ZjhmOCcsXG4gIGJhc2UwODogJyNhYjQ2NDInLFxuICBiYXNlMDk6ICcjZGM5NjU2JyxcbiAgYmFzZTBBOiAnI2Y3Y2E4OCcsXG4gIGJhc2UwQjogJyNhMWI1NmMnLFxuICBiYXNlMEM6ICcjODZjMWI5JyxcbiAgYmFzZTBEOiAnIzdjYWZjMicsXG4gIGJhc2UwRTogJyNiYThiYWYnLFxuICBiYXNlMEY6ICcjYTE2OTQ2J1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnZWlnaHRpZXMnLFxuICBhdXRob3I6ICdjaHJpcyBrZW1wc29uIChodHRwOi8vY2hyaXNrZW1wc29uLmNvbSknLFxuICBiYXNlMDA6ICcjMmQyZDJkJyxcbiAgYmFzZTAxOiAnIzM5MzkzOScsXG4gIGJhc2UwMjogJyM1MTUxNTEnLFxuICBiYXNlMDM6ICcjNzQ3MzY5JyxcbiAgYmFzZTA0OiAnI2EwOWY5MycsXG4gIGJhc2UwNTogJyNkM2QwYzgnLFxuICBiYXNlMDY6ICcjZThlNmRmJyxcbiAgYmFzZTA3OiAnI2YyZjBlYycsXG4gIGJhc2UwODogJyNmMjc3N2EnLFxuICBiYXNlMDk6ICcjZjk5MTU3JyxcbiAgYmFzZTBBOiAnI2ZmY2M2NicsXG4gIGJhc2UwQjogJyM5OWNjOTknLFxuICBiYXNlMEM6ICcjNjZjY2NjJyxcbiAgYmFzZTBEOiAnIzY2OTljYycsXG4gIGJhc2UwRTogJyNjYzk5Y2MnLFxuICBiYXNlMEY6ICcjZDI3YjUzJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnZW1iZXJzJyxcbiAgYXV0aG9yOiAnamFubmlrIHNpZWJlcnQgKGh0dHBzOi8vZ2l0aHViLmNvbS9qYW5uaWtzKScsXG4gIGJhc2UwMDogJyMxNjEzMEYnLFxuICBiYXNlMDE6ICcjMkMyNjIwJyxcbiAgYmFzZTAyOiAnIzQzM0IzMicsXG4gIGJhc2UwMzogJyM1QTUwNDcnLFxuICBiYXNlMDQ6ICcjOEE4MDc1JyxcbiAgYmFzZTA1OiAnI0EzOUE5MCcsXG4gIGJhc2UwNjogJyNCRUI2QUUnLFxuICBiYXNlMDc6ICcjREJENkQxJyxcbiAgYmFzZTA4OiAnIzgyNkQ1NycsXG4gIGJhc2UwOTogJyM4MjgyNTcnLFxuICBiYXNlMEE6ICcjNkQ4MjU3JyxcbiAgYmFzZTBCOiAnIzU3ODI2RCcsXG4gIGJhc2UwQzogJyM1NzZEODInLFxuICBiYXNlMEQ6ICcjNkQ1NzgyJyxcbiAgYmFzZTBFOiAnIzgyNTc2RCcsXG4gIGJhc2UwRjogJyM4MjU3NTcnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdmbGF0JyxcbiAgYXV0aG9yOiAnY2hyaXMga2VtcHNvbiAoaHR0cDovL2Nocmlza2VtcHNvbi5jb20pJyxcbiAgYmFzZTAwOiAnIzJDM0U1MCcsXG4gIGJhc2UwMTogJyMzNDQ5NUUnLFxuICBiYXNlMDI6ICcjN0Y4QzhEJyxcbiAgYmFzZTAzOiAnIzk1QTVBNicsXG4gIGJhc2UwNDogJyNCREMzQzcnLFxuICBiYXNlMDU6ICcjZTBlMGUwJyxcbiAgYmFzZTA2OiAnI2Y1ZjVmNScsXG4gIGJhc2UwNzogJyNFQ0YwRjEnLFxuICBiYXNlMDg6ICcjRTc0QzNDJyxcbiAgYmFzZTA5OiAnI0U2N0UyMicsXG4gIGJhc2UwQTogJyNGMUM0MEYnLFxuICBiYXNlMEI6ICcjMkVDQzcxJyxcbiAgYmFzZTBDOiAnIzFBQkM5QycsXG4gIGJhc2UwRDogJyMzNDk4REInLFxuICBiYXNlMEU6ICcjOUI1OUI2JyxcbiAgYmFzZTBGOiAnI2JlNjQzYydcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ2dvb2dsZScsXG4gIGF1dGhvcjogJ3NldGggd3JpZ2h0IChodHRwOi8vc2V0aGF3cmlnaHQuY29tKScsXG4gIGJhc2UwMDogJyMxZDFmMjEnLFxuICBiYXNlMDE6ICcjMjgyYTJlJyxcbiAgYmFzZTAyOiAnIzM3M2I0MScsXG4gIGJhc2UwMzogJyM5Njk4OTYnLFxuICBiYXNlMDQ6ICcjYjRiN2I0JyxcbiAgYmFzZTA1OiAnI2M1YzhjNicsXG4gIGJhc2UwNjogJyNlMGUwZTAnLFxuICBiYXNlMDc6ICcjZmZmZmZmJyxcbiAgYmFzZTA4OiAnI0NDMzQyQicsXG4gIGJhc2UwOTogJyNGOTZBMzgnLFxuICBiYXNlMEE6ICcjRkJBOTIyJyxcbiAgYmFzZTBCOiAnIzE5ODg0NCcsXG4gIGJhc2UwQzogJyMzOTcxRUQnLFxuICBiYXNlMEQ6ICcjMzk3MUVEJyxcbiAgYmFzZTBFOiAnI0EzNkFDNycsXG4gIGJhc2UwRjogJyMzOTcxRUQnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdncmF5c2NhbGUnLFxuICBhdXRob3I6ICdhbGV4YW5kcmUgZ2F2aW9saSAoaHR0cHM6Ly9naXRodWIuY29tL2FsZXh4Mi8pJyxcbiAgYmFzZTAwOiAnIzEwMTAxMCcsXG4gIGJhc2UwMTogJyMyNTI1MjUnLFxuICBiYXNlMDI6ICcjNDY0NjQ2JyxcbiAgYmFzZTAzOiAnIzUyNTI1MicsXG4gIGJhc2UwNDogJyNhYmFiYWInLFxuICBiYXNlMDU6ICcjYjliOWI5JyxcbiAgYmFzZTA2OiAnI2UzZTNlMycsXG4gIGJhc2UwNzogJyNmN2Y3ZjcnLFxuICBiYXNlMDg6ICcjN2M3YzdjJyxcbiAgYmFzZTA5OiAnIzk5OTk5OScsXG4gIGJhc2UwQTogJyNhMGEwYTAnLFxuICBiYXNlMEI6ICcjOGU4ZThlJyxcbiAgYmFzZTBDOiAnIzg2ODY4NicsXG4gIGJhc2UwRDogJyM2ODY4NjgnLFxuICBiYXNlMEU6ICcjNzQ3NDc0JyxcbiAgYmFzZTBGOiAnIzVlNWU1ZSdcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ2dyZWVuIHNjcmVlbicsXG4gIGF1dGhvcjogJ2NocmlzIGtlbXBzb24gKGh0dHA6Ly9jaHJpc2tlbXBzb24uY29tKScsXG4gIGJhc2UwMDogJyMwMDExMDAnLFxuICBiYXNlMDE6ICcjMDAzMzAwJyxcbiAgYmFzZTAyOiAnIzAwNTUwMCcsXG4gIGJhc2UwMzogJyMwMDc3MDAnLFxuICBiYXNlMDQ6ICcjMDA5OTAwJyxcbiAgYmFzZTA1OiAnIzAwYmIwMCcsXG4gIGJhc2UwNjogJyMwMGRkMDAnLFxuICBiYXNlMDc6ICcjMDBmZjAwJyxcbiAgYmFzZTA4OiAnIzAwNzcwMCcsXG4gIGJhc2UwOTogJyMwMDk5MDAnLFxuICBiYXNlMEE6ICcjMDA3NzAwJyxcbiAgYmFzZTBCOiAnIzAwYmIwMCcsXG4gIGJhc2UwQzogJyMwMDU1MDAnLFxuICBiYXNlMEQ6ICcjMDA5OTAwJyxcbiAgYmFzZTBFOiAnIzAwYmIwMCcsXG4gIGJhc2UwRjogJyMwMDU1MDAnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdoYXJtb25pYzE2JyxcbiAgYXV0aG9yOiAnamFubmlrIHNpZWJlcnQgKGh0dHBzOi8vZ2l0aHViLmNvbS9qYW5uaWtzKScsXG4gIGJhc2UwMDogJyMwYjFjMmMnLFxuICBiYXNlMDE6ICcjMjIzYjU0JyxcbiAgYmFzZTAyOiAnIzQwNWM3OScsXG4gIGJhc2UwMzogJyM2MjdlOTknLFxuICBiYXNlMDQ6ICcjYWFiY2NlJyxcbiAgYmFzZTA1OiAnI2NiZDZlMicsXG4gIGJhc2UwNjogJyNlNWViZjEnLFxuICBiYXNlMDc6ICcjZjdmOWZiJyxcbiAgYmFzZTA4OiAnI2JmOGI1NicsXG4gIGJhc2UwOTogJyNiZmJmNTYnLFxuICBiYXNlMEE6ICcjOGJiZjU2JyxcbiAgYmFzZTBCOiAnIzU2YmY4YicsXG4gIGJhc2UwQzogJyM1NjhiYmYnLFxuICBiYXNlMEQ6ICcjOGI1NmJmJyxcbiAgYmFzZTBFOiAnI2JmNTY4YicsXG4gIGJhc2UwRjogJyNiZjU2NTYnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdob3BzY290Y2gnLFxuICBhdXRob3I6ICdqYW4gdC4gc290dCcsXG4gIGJhc2UwMDogJyMzMjI5MzEnLFxuICBiYXNlMDE6ICcjNDMzYjQyJyxcbiAgYmFzZTAyOiAnIzVjNTQ1YicsXG4gIGJhc2UwMzogJyM3OTczNzknLFxuICBiYXNlMDQ6ICcjOTg5NDk4JyxcbiAgYmFzZTA1OiAnI2I5YjViOCcsXG4gIGJhc2UwNjogJyNkNWQzZDUnLFxuICBiYXNlMDc6ICcjZmZmZmZmJyxcbiAgYmFzZTA4OiAnI2RkNDY0YycsXG4gIGJhc2UwOTogJyNmZDhiMTknLFxuICBiYXNlMEE6ICcjZmRjYzU5JyxcbiAgYmFzZTBCOiAnIzhmYzEzZScsXG4gIGJhc2UwQzogJyMxNDliOTMnLFxuICBiYXNlMEQ6ICcjMTI5MGJmJyxcbiAgYmFzZTBFOiAnI2M4NWU3YycsXG4gIGJhc2UwRjogJyNiMzM1MDgnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmUob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmpbJ2RlZmF1bHQnXSA6IG9iajsgfVxuXG52YXIgX3RocmVlemVyb3R3b2ZvdXIgPSByZXF1aXJlKCcuL3RocmVlemVyb3R3b2ZvdXInKTtcblxuZXhwb3J0cy50aHJlZXplcm90d29mb3VyID0gX2ludGVyb3BSZXF1aXJlKF90aHJlZXplcm90d29mb3VyKTtcblxudmFyIF9hcGF0aHkgPSByZXF1aXJlKCcuL2FwYXRoeScpO1xuXG5leHBvcnRzLmFwYXRoeSA9IF9pbnRlcm9wUmVxdWlyZShfYXBhdGh5KTtcblxudmFyIF9hc2hlcyA9IHJlcXVpcmUoJy4vYXNoZXMnKTtcblxuZXhwb3J0cy5hc2hlcyA9IF9pbnRlcm9wUmVxdWlyZShfYXNoZXMpO1xuXG52YXIgX2F0ZWxpZXJEdW5lID0gcmVxdWlyZSgnLi9hdGVsaWVyLWR1bmUnKTtcblxuZXhwb3J0cy5hdGVsaWVyRHVuZSA9IF9pbnRlcm9wUmVxdWlyZShfYXRlbGllckR1bmUpO1xuXG52YXIgX2F0ZWxpZXJGb3Jlc3QgPSByZXF1aXJlKCcuL2F0ZWxpZXItZm9yZXN0Jyk7XG5cbmV4cG9ydHMuYXRlbGllckZvcmVzdCA9IF9pbnRlcm9wUmVxdWlyZShfYXRlbGllckZvcmVzdCk7XG5cbnZhciBfYXRlbGllckhlYXRoID0gcmVxdWlyZSgnLi9hdGVsaWVyLWhlYXRoJyk7XG5cbmV4cG9ydHMuYXRlbGllckhlYXRoID0gX2ludGVyb3BSZXF1aXJlKF9hdGVsaWVySGVhdGgpO1xuXG52YXIgX2F0ZWxpZXJMYWtlc2lkZSA9IHJlcXVpcmUoJy4vYXRlbGllci1sYWtlc2lkZScpO1xuXG5leHBvcnRzLmF0ZWxpZXJMYWtlc2lkZSA9IF9pbnRlcm9wUmVxdWlyZShfYXRlbGllckxha2VzaWRlKTtcblxudmFyIF9hdGVsaWVyU2Vhc2lkZSA9IHJlcXVpcmUoJy4vYXRlbGllci1zZWFzaWRlJyk7XG5cbmV4cG9ydHMuYXRlbGllclNlYXNpZGUgPSBfaW50ZXJvcFJlcXVpcmUoX2F0ZWxpZXJTZWFzaWRlKTtcblxudmFyIF9iZXNwaW4gPSByZXF1aXJlKCcuL2Jlc3BpbicpO1xuXG5leHBvcnRzLmJlc3BpbiA9IF9pbnRlcm9wUmVxdWlyZShfYmVzcGluKTtcblxudmFyIF9icmV3ZXIgPSByZXF1aXJlKCcuL2JyZXdlcicpO1xuXG5leHBvcnRzLmJyZXdlciA9IF9pbnRlcm9wUmVxdWlyZShfYnJld2VyKTtcblxudmFyIF9icmlnaHQgPSByZXF1aXJlKCcuL2JyaWdodCcpO1xuXG5leHBvcnRzLmJyaWdodCA9IF9pbnRlcm9wUmVxdWlyZShfYnJpZ2h0KTtcblxudmFyIF9jaGFsayA9IHJlcXVpcmUoJy4vY2hhbGsnKTtcblxuZXhwb3J0cy5jaGFsayA9IF9pbnRlcm9wUmVxdWlyZShfY2hhbGspO1xuXG52YXIgX2NvZGVzY2hvb2wgPSByZXF1aXJlKCcuL2NvZGVzY2hvb2wnKTtcblxuZXhwb3J0cy5jb2Rlc2Nob29sID0gX2ludGVyb3BSZXF1aXJlKF9jb2Rlc2Nob29sKTtcblxudmFyIF9jb2xvcnMgPSByZXF1aXJlKCcuL2NvbG9ycycpO1xuXG5leHBvcnRzLmNvbG9ycyA9IF9pbnRlcm9wUmVxdWlyZShfY29sb3JzKTtcblxudmFyIF9kZWZhdWx0ID0gcmVxdWlyZSgnLi9kZWZhdWx0Jyk7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IF9pbnRlcm9wUmVxdWlyZShfZGVmYXVsdCk7XG5cbnZhciBfZWlnaHRpZXMgPSByZXF1aXJlKCcuL2VpZ2h0aWVzJyk7XG5cbmV4cG9ydHMuZWlnaHRpZXMgPSBfaW50ZXJvcFJlcXVpcmUoX2VpZ2h0aWVzKTtcblxudmFyIF9lbWJlcnMgPSByZXF1aXJlKCcuL2VtYmVycycpO1xuXG5leHBvcnRzLmVtYmVycyA9IF9pbnRlcm9wUmVxdWlyZShfZW1iZXJzKTtcblxudmFyIF9mbGF0ID0gcmVxdWlyZSgnLi9mbGF0Jyk7XG5cbmV4cG9ydHMuZmxhdCA9IF9pbnRlcm9wUmVxdWlyZShfZmxhdCk7XG5cbnZhciBfZ29vZ2xlID0gcmVxdWlyZSgnLi9nb29nbGUnKTtcblxuZXhwb3J0cy5nb29nbGUgPSBfaW50ZXJvcFJlcXVpcmUoX2dvb2dsZSk7XG5cbnZhciBfZ3JheXNjYWxlID0gcmVxdWlyZSgnLi9ncmF5c2NhbGUnKTtcblxuZXhwb3J0cy5ncmF5c2NhbGUgPSBfaW50ZXJvcFJlcXVpcmUoX2dyYXlzY2FsZSk7XG5cbnZhciBfZ3JlZW5zY3JlZW4gPSByZXF1aXJlKCcuL2dyZWVuc2NyZWVuJyk7XG5cbmV4cG9ydHMuZ3JlZW5zY3JlZW4gPSBfaW50ZXJvcFJlcXVpcmUoX2dyZWVuc2NyZWVuKTtcblxudmFyIF9oYXJtb25pYyA9IHJlcXVpcmUoJy4vaGFybW9uaWMnKTtcblxuZXhwb3J0cy5oYXJtb25pYyA9IF9pbnRlcm9wUmVxdWlyZShfaGFybW9uaWMpO1xuXG52YXIgX2hvcHNjb3RjaCA9IHJlcXVpcmUoJy4vaG9wc2NvdGNoJyk7XG5cbmV4cG9ydHMuaG9wc2NvdGNoID0gX2ludGVyb3BSZXF1aXJlKF9ob3BzY290Y2gpO1xuXG52YXIgX2lzb3RvcGUgPSByZXF1aXJlKCcuL2lzb3RvcGUnKTtcblxuZXhwb3J0cy5pc290b3BlID0gX2ludGVyb3BSZXF1aXJlKF9pc290b3BlKTtcblxudmFyIF9tYXJyYWtlc2ggPSByZXF1aXJlKCcuL21hcnJha2VzaCcpO1xuXG5leHBvcnRzLm1hcnJha2VzaCA9IF9pbnRlcm9wUmVxdWlyZShfbWFycmFrZXNoKTtcblxudmFyIF9tb2NoYSA9IHJlcXVpcmUoJy4vbW9jaGEnKTtcblxuZXhwb3J0cy5tb2NoYSA9IF9pbnRlcm9wUmVxdWlyZShfbW9jaGEpO1xuXG52YXIgX21vbm9rYWkgPSByZXF1aXJlKCcuL21vbm9rYWknKTtcblxuZXhwb3J0cy5tb25va2FpID0gX2ludGVyb3BSZXF1aXJlKF9tb25va2FpKTtcblxudmFyIF9vY2VhbiA9IHJlcXVpcmUoJy4vb2NlYW4nKTtcblxuZXhwb3J0cy5vY2VhbiA9IF9pbnRlcm9wUmVxdWlyZShfb2NlYW4pO1xuXG52YXIgX3BhcmFpc28gPSByZXF1aXJlKCcuL3BhcmFpc28nKTtcblxuZXhwb3J0cy5wYXJhaXNvID0gX2ludGVyb3BSZXF1aXJlKF9wYXJhaXNvKTtcblxudmFyIF9wb3AgPSByZXF1aXJlKCcuL3BvcCcpO1xuXG5leHBvcnRzLnBvcCA9IF9pbnRlcm9wUmVxdWlyZShfcG9wKTtcblxudmFyIF9yYWlsc2Nhc3RzID0gcmVxdWlyZSgnLi9yYWlsc2Nhc3RzJyk7XG5cbmV4cG9ydHMucmFpbHNjYXN0cyA9IF9pbnRlcm9wUmVxdWlyZShfcmFpbHNjYXN0cyk7XG5cbnZhciBfc2hhcGVzaGlmdGVyID0gcmVxdWlyZSgnLi9zaGFwZXNoaWZ0ZXInKTtcblxuZXhwb3J0cy5zaGFwZXNoaWZ0ZXIgPSBfaW50ZXJvcFJlcXVpcmUoX3NoYXBlc2hpZnRlcik7XG5cbnZhciBfc29sYXJpemVkID0gcmVxdWlyZSgnLi9zb2xhcml6ZWQnKTtcblxuZXhwb3J0cy5zb2xhcml6ZWQgPSBfaW50ZXJvcFJlcXVpcmUoX3NvbGFyaXplZCk7XG5cbnZhciBfc3VtbWVyZnJ1aXQgPSByZXF1aXJlKCcuL3N1bW1lcmZydWl0Jyk7XG5cbmV4cG9ydHMuc3VtbWVyZnJ1aXQgPSBfaW50ZXJvcFJlcXVpcmUoX3N1bW1lcmZydWl0KTtcblxudmFyIF90b21vcnJvdyA9IHJlcXVpcmUoJy4vdG9tb3Jyb3cnKTtcblxuZXhwb3J0cy50b21vcnJvdyA9IF9pbnRlcm9wUmVxdWlyZShfdG9tb3Jyb3cpO1xuXG52YXIgX3R1YmUgPSByZXF1aXJlKCcuL3R1YmUnKTtcblxuZXhwb3J0cy50dWJlID0gX2ludGVyb3BSZXF1aXJlKF90dWJlKTtcblxudmFyIF90d2lsaWdodCA9IHJlcXVpcmUoJy4vdHdpbGlnaHQnKTtcblxuZXhwb3J0cy50d2lsaWdodCA9IF9pbnRlcm9wUmVxdWlyZShfdHdpbGlnaHQpOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnaXNvdG9wZScsXG4gIGF1dGhvcjogJ2phbiB0LiBzb3R0JyxcbiAgYmFzZTAwOiAnIzAwMDAwMCcsXG4gIGJhc2UwMTogJyM0MDQwNDAnLFxuICBiYXNlMDI6ICcjNjA2MDYwJyxcbiAgYmFzZTAzOiAnIzgwODA4MCcsXG4gIGJhc2UwNDogJyNjMGMwYzAnLFxuICBiYXNlMDU6ICcjZDBkMGQwJyxcbiAgYmFzZTA2OiAnI2UwZTBlMCcsXG4gIGJhc2UwNzogJyNmZmZmZmYnLFxuICBiYXNlMDg6ICcjZmYwMDAwJyxcbiAgYmFzZTA5OiAnI2ZmOTkwMCcsXG4gIGJhc2UwQTogJyNmZjAwOTknLFxuICBiYXNlMEI6ICcjMzNmZjAwJyxcbiAgYmFzZTBDOiAnIzAwZmZmZicsXG4gIGJhc2UwRDogJyMwMDY2ZmYnLFxuICBiYXNlMEU6ICcjY2MwMGZmJyxcbiAgYmFzZTBGOiAnIzMzMDBmZidcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ21hcnJha2VzaCcsXG4gIGF1dGhvcjogJ2FsZXhhbmRyZSBnYXZpb2xpIChodHRwOi8vZ2l0aHViLmNvbS9hbGV4eDIvKScsXG4gIGJhc2UwMDogJyMyMDE2MDInLFxuICBiYXNlMDE6ICcjMzAyZTAwJyxcbiAgYmFzZTAyOiAnIzVmNWIxNycsXG4gIGJhc2UwMzogJyM2YzY4MjMnLFxuICBiYXNlMDQ6ICcjODY4MTNiJyxcbiAgYmFzZTA1OiAnIzk0OGU0OCcsXG4gIGJhc2UwNjogJyNjY2MzN2EnLFxuICBiYXNlMDc6ICcjZmFmMGE1JyxcbiAgYmFzZTA4OiAnI2MzNTM1OScsXG4gIGJhc2UwOTogJyNiMzYxNDQnLFxuICBiYXNlMEE6ICcjYTg4MzM5JyxcbiAgYmFzZTBCOiAnIzE4OTc0ZScsXG4gIGJhc2UwQzogJyM3NWE3MzgnLFxuICBiYXNlMEQ6ICcjNDc3Y2ExJyxcbiAgYmFzZTBFOiAnIzg4NjhiMycsXG4gIGJhc2UwRjogJyNiMzU4OGUnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdtb2NoYScsXG4gIGF1dGhvcjogJ2NocmlzIGtlbXBzb24gKGh0dHA6Ly9jaHJpc2tlbXBzb24uY29tKScsXG4gIGJhc2UwMDogJyMzQjMyMjgnLFxuICBiYXNlMDE6ICcjNTM0NjM2JyxcbiAgYmFzZTAyOiAnIzY0NTI0MCcsXG4gIGJhc2UwMzogJyM3ZTcwNWEnLFxuICBiYXNlMDQ6ICcjYjhhZmFkJyxcbiAgYmFzZTA1OiAnI2QwYzhjNicsXG4gIGJhc2UwNjogJyNlOWUxZGQnLFxuICBiYXNlMDc6ICcjZjVlZWViJyxcbiAgYmFzZTA4OiAnI2NiNjA3NycsXG4gIGJhc2UwOTogJyNkMjhiNzEnLFxuICBiYXNlMEE6ICcjZjRiYzg3JyxcbiAgYmFzZTBCOiAnI2JlYjU1YicsXG4gIGJhc2UwQzogJyM3YmJkYTQnLFxuICBiYXNlMEQ6ICcjOGFiM2I1JyxcbiAgYmFzZTBFOiAnI2E4OWJiOScsXG4gIGJhc2UwRjogJyNiYjk1ODQnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdtb25va2FpJyxcbiAgYXV0aG9yOiAnd2ltZXIgaGF6ZW5iZXJnIChodHRwOi8vd3d3Lm1vbm9rYWkubmwpJyxcbiAgYmFzZTAwOiAnIzI3MjgyMicsXG4gIGJhc2UwMTogJyMzODM4MzAnLFxuICBiYXNlMDI6ICcjNDk0ODNlJyxcbiAgYmFzZTAzOiAnIzc1NzE1ZScsXG4gIGJhc2UwNDogJyNhNTlmODUnLFxuICBiYXNlMDU6ICcjZjhmOGYyJyxcbiAgYmFzZTA2OiAnI2Y1ZjRmMScsXG4gIGJhc2UwNzogJyNmOWY4ZjUnLFxuICBiYXNlMDg6ICcjZjkyNjcyJyxcbiAgYmFzZTA5OiAnI2ZkOTcxZicsXG4gIGJhc2UwQTogJyNmNGJmNzUnLFxuICBiYXNlMEI6ICcjYTZlMjJlJyxcbiAgYmFzZTBDOiAnI2ExZWZlNCcsXG4gIGJhc2UwRDogJyM2NmQ5ZWYnLFxuICBiYXNlMEU6ICcjYWU4MWZmJyxcbiAgYmFzZTBGOiAnI2NjNjYzMydcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ29jZWFuJyxcbiAgYXV0aG9yOiAnY2hyaXMga2VtcHNvbiAoaHR0cDovL2Nocmlza2VtcHNvbi5jb20pJyxcbiAgYmFzZTAwOiAnIzJiMzAzYicsXG4gIGJhc2UwMTogJyMzNDNkNDYnLFxuICBiYXNlMDI6ICcjNGY1YjY2JyxcbiAgYmFzZTAzOiAnIzY1NzM3ZScsXG4gIGJhc2UwNDogJyNhN2FkYmEnLFxuICBiYXNlMDU6ICcjYzBjNWNlJyxcbiAgYmFzZTA2OiAnI2RmZTFlOCcsXG4gIGJhc2UwNzogJyNlZmYxZjUnLFxuICBiYXNlMDg6ICcjYmY2MTZhJyxcbiAgYmFzZTA5OiAnI2QwODc3MCcsXG4gIGJhc2UwQTogJyNlYmNiOGInLFxuICBiYXNlMEI6ICcjYTNiZThjJyxcbiAgYmFzZTBDOiAnIzk2YjViNCcsXG4gIGJhc2UwRDogJyM4ZmExYjMnLFxuICBiYXNlMEU6ICcjYjQ4ZWFkJyxcbiAgYmFzZTBGOiAnI2FiNzk2Nydcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ3BhcmFpc28nLFxuICBhdXRob3I6ICdqYW4gdC4gc290dCcsXG4gIGJhc2UwMDogJyMyZjFlMmUnLFxuICBiYXNlMDE6ICcjNDEzMjNmJyxcbiAgYmFzZTAyOiAnIzRmNDI0YycsXG4gIGJhc2UwMzogJyM3NzZlNzEnLFxuICBiYXNlMDQ6ICcjOGQ4Njg3JyxcbiAgYmFzZTA1OiAnI2EzOWU5YicsXG4gIGJhc2UwNjogJyNiOWI2YjAnLFxuICBiYXNlMDc6ICcjZTdlOWRiJyxcbiAgYmFzZTA4OiAnI2VmNjE1NScsXG4gIGJhc2UwOTogJyNmOTliMTUnLFxuICBiYXNlMEE6ICcjZmVjNDE4JyxcbiAgYmFzZTBCOiAnIzQ4YjY4NScsXG4gIGJhc2UwQzogJyM1YmM0YmYnLFxuICBiYXNlMEQ6ICcjMDZiNmVmJyxcbiAgYmFzZTBFOiAnIzgxNWJhNCcsXG4gIGJhc2UwRjogJyNlOTZiYTgnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdwb3AnLFxuICBhdXRob3I6ICdjaHJpcyBrZW1wc29uIChodHRwOi8vY2hyaXNrZW1wc29uLmNvbSknLFxuICBiYXNlMDA6ICcjMDAwMDAwJyxcbiAgYmFzZTAxOiAnIzIwMjAyMCcsXG4gIGJhc2UwMjogJyMzMDMwMzAnLFxuICBiYXNlMDM6ICcjNTA1MDUwJyxcbiAgYmFzZTA0OiAnI2IwYjBiMCcsXG4gIGJhc2UwNTogJyNkMGQwZDAnLFxuICBiYXNlMDY6ICcjZTBlMGUwJyxcbiAgYmFzZTA3OiAnI2ZmZmZmZicsXG4gIGJhc2UwODogJyNlYjAwOGEnLFxuICBiYXNlMDk6ICcjZjI5MzMzJyxcbiAgYmFzZTBBOiAnI2Y4Y2ExMicsXG4gIGJhc2UwQjogJyMzN2IzNDknLFxuICBiYXNlMEM6ICcjMDBhYWJiJyxcbiAgYmFzZTBEOiAnIzBlNWE5NCcsXG4gIGJhc2UwRTogJyNiMzFlOGQnLFxuICBiYXNlMEY6ICcjN2EyZDAwJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAncmFpbHNjYXN0cycsXG4gIGF1dGhvcjogJ3J5YW4gYmF0ZXMgKGh0dHA6Ly9yYWlsc2Nhc3RzLmNvbSknLFxuICBiYXNlMDA6ICcjMmIyYjJiJyxcbiAgYmFzZTAxOiAnIzI3MjkzNScsXG4gIGJhc2UwMjogJyMzYTQwNTUnLFxuICBiYXNlMDM6ICcjNWE2NDdlJyxcbiAgYmFzZTA0OiAnI2Q0Y2ZjOScsXG4gIGJhc2UwNTogJyNlNmUxZGMnLFxuICBiYXNlMDY6ICcjZjRmMWVkJyxcbiAgYmFzZTA3OiAnI2Y5ZjdmMycsXG4gIGJhc2UwODogJyNkYTQ5MzknLFxuICBiYXNlMDk6ICcjY2M3ODMzJyxcbiAgYmFzZTBBOiAnI2ZmYzY2ZCcsXG4gIGJhc2UwQjogJyNhNWMyNjEnLFxuICBiYXNlMEM6ICcjNTE5ZjUwJyxcbiAgYmFzZTBEOiAnIzZkOWNiZScsXG4gIGJhc2UwRTogJyNiNmIzZWInLFxuICBiYXNlMEY6ICcjYmM5NDU4J1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnc2hhcGVzaGlmdGVyJyxcbiAgYXV0aG9yOiAndHlsZXIgYmVuemlnZXIgKGh0dHA6Ly90eWJlbnouY29tKScsXG4gIGJhc2UwMDogJyMwMDAwMDAnLFxuICBiYXNlMDE6ICcjMDQwNDA0JyxcbiAgYmFzZTAyOiAnIzEwMjAxNScsXG4gIGJhc2UwMzogJyMzNDM0MzQnLFxuICBiYXNlMDQ6ICcjNTU1NTU1JyxcbiAgYmFzZTA1OiAnI2FiYWJhYicsXG4gIGJhc2UwNjogJyNlMGUwZTAnLFxuICBiYXNlMDc6ICcjZjlmOWY5JyxcbiAgYmFzZTA4OiAnI2U5MmYyZicsXG4gIGJhc2UwOTogJyNlMDk0NDgnLFxuICBiYXNlMEE6ICcjZGRkZDEzJyxcbiAgYmFzZTBCOiAnIzBlZDgzOScsXG4gIGJhc2UwQzogJyMyM2VkZGEnLFxuICBiYXNlMEQ6ICcjM2I0OGUzJyxcbiAgYmFzZTBFOiAnI2Y5OTZlMicsXG4gIGJhc2UwRjogJyM2OTU0MmQnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdzb2xhcml6ZWQnLFxuICBhdXRob3I6ICdldGhhbiBzY2hvb25vdmVyIChodHRwOi8vZXRoYW5zY2hvb25vdmVyLmNvbS9zb2xhcml6ZWQpJyxcbiAgYmFzZTAwOiAnIzAwMmIzNicsXG4gIGJhc2UwMTogJyMwNzM2NDInLFxuICBiYXNlMDI6ICcjNTg2ZTc1JyxcbiAgYmFzZTAzOiAnIzY1N2I4MycsXG4gIGJhc2UwNDogJyM4Mzk0OTYnLFxuICBiYXNlMDU6ICcjOTNhMWExJyxcbiAgYmFzZTA2OiAnI2VlZThkNScsXG4gIGJhc2UwNzogJyNmZGY2ZTMnLFxuICBiYXNlMDg6ICcjZGMzMjJmJyxcbiAgYmFzZTA5OiAnI2NiNGIxNicsXG4gIGJhc2UwQTogJyNiNTg5MDAnLFxuICBiYXNlMEI6ICcjODU5OTAwJyxcbiAgYmFzZTBDOiAnIzJhYTE5OCcsXG4gIGJhc2UwRDogJyMyNjhiZDInLFxuICBiYXNlMEU6ICcjNmM3MWM0JyxcbiAgYmFzZTBGOiAnI2QzMzY4Midcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ3N1bW1lcmZydWl0JyxcbiAgYXV0aG9yOiAnY2hyaXN0b3BoZXIgY29ybGV5IChodHRwOi8vY3Njb3JsZXkuZ2l0aHViLmlvLyknLFxuICBiYXNlMDA6ICcjMTUxNTE1JyxcbiAgYmFzZTAxOiAnIzIwMjAyMCcsXG4gIGJhc2UwMjogJyMzMDMwMzAnLFxuICBiYXNlMDM6ICcjNTA1MDUwJyxcbiAgYmFzZTA0OiAnI0IwQjBCMCcsXG4gIGJhc2UwNTogJyNEMEQwRDAnLFxuICBiYXNlMDY6ICcjRTBFMEUwJyxcbiAgYmFzZTA3OiAnI0ZGRkZGRicsXG4gIGJhc2UwODogJyNGRjAwODYnLFxuICBiYXNlMDk6ICcjRkQ4OTAwJyxcbiAgYmFzZTBBOiAnI0FCQTgwMCcsXG4gIGJhc2UwQjogJyMwMEM5MTgnLFxuICBiYXNlMEM6ICcjMWZhYWFhJyxcbiAgYmFzZTBEOiAnIzM3NzdFNicsXG4gIGJhc2UwRTogJyNBRDAwQTEnLFxuICBiYXNlMEY6ICcjY2M2NjMzJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAndGhyZWV6ZXJvdHdvZm91cicsXG4gIGF1dGhvcjogJ2phbiB0LiBzb3R0IChodHRwOi8vZ2l0aHViLmNvbS9pZGxlYmVyZyknLFxuICBiYXNlMDA6ICcjMDkwMzAwJyxcbiAgYmFzZTAxOiAnIzNhMzQzMicsXG4gIGJhc2UwMjogJyM0YTQ1NDMnLFxuICBiYXNlMDM6ICcjNWM1ODU1JyxcbiAgYmFzZTA0OiAnIzgwN2Q3YycsXG4gIGJhc2UwNTogJyNhNWEyYTInLFxuICBiYXNlMDY6ICcjZDZkNWQ0JyxcbiAgYmFzZTA3OiAnI2Y3ZjdmNycsXG4gIGJhc2UwODogJyNkYjJkMjAnLFxuICBiYXNlMDk6ICcjZThiYmQwJyxcbiAgYmFzZTBBOiAnI2ZkZWQwMicsXG4gIGJhc2UwQjogJyMwMWEyNTInLFxuICBiYXNlMEM6ICcjYjVlNGY0JyxcbiAgYmFzZTBEOiAnIzAxYTBlNCcsXG4gIGJhc2UwRTogJyNhMTZhOTQnLFxuICBiYXNlMEY6ICcjY2RhYjUzJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAndG9tb3Jyb3cnLFxuICBhdXRob3I6ICdjaHJpcyBrZW1wc29uIChodHRwOi8vY2hyaXNrZW1wc29uLmNvbSknLFxuICBiYXNlMDA6ICcjMWQxZjIxJyxcbiAgYmFzZTAxOiAnIzI4MmEyZScsXG4gIGJhc2UwMjogJyMzNzNiNDEnLFxuICBiYXNlMDM6ICcjOTY5ODk2JyxcbiAgYmFzZTA0OiAnI2I0YjdiNCcsXG4gIGJhc2UwNTogJyNjNWM4YzYnLFxuICBiYXNlMDY6ICcjZTBlMGUwJyxcbiAgYmFzZTA3OiAnI2ZmZmZmZicsXG4gIGJhc2UwODogJyNjYzY2NjYnLFxuICBiYXNlMDk6ICcjZGU5MzVmJyxcbiAgYmFzZTBBOiAnI2YwYzY3NCcsXG4gIGJhc2UwQjogJyNiNWJkNjgnLFxuICBiYXNlMEM6ICcjOGFiZWI3JyxcbiAgYmFzZTBEOiAnIzgxYTJiZScsXG4gIGJhc2UwRTogJyNiMjk0YmInLFxuICBiYXNlMEY6ICcjYTM2ODVhJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnbG9uZG9uIHR1YmUnLFxuICBhdXRob3I6ICdqYW4gdC4gc290dCcsXG4gIGJhc2UwMDogJyMyMzFmMjAnLFxuICBiYXNlMDE6ICcjMWMzZjk1JyxcbiAgYmFzZTAyOiAnIzVhNTc1OCcsXG4gIGJhc2UwMzogJyM3MzcxNzEnLFxuICBiYXNlMDQ6ICcjOTU5Y2ExJyxcbiAgYmFzZTA1OiAnI2Q5ZDhkOCcsXG4gIGJhc2UwNjogJyNlN2U3ZTgnLFxuICBiYXNlMDc6ICcjZmZmZmZmJyxcbiAgYmFzZTA4OiAnI2VlMmUyNCcsXG4gIGJhc2UwOTogJyNmMzg2YTEnLFxuICBiYXNlMEE6ICcjZmZkMjA0JyxcbiAgYmFzZTBCOiAnIzAwODUzZScsXG4gIGJhc2UwQzogJyM4NWNlYmMnLFxuICBiYXNlMEQ6ICcjMDA5ZGRjJyxcbiAgYmFzZTBFOiAnIzk4MDA1ZCcsXG4gIGJhc2UwRjogJyNiMDYxMTAnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICd0d2lsaWdodCcsXG4gIGF1dGhvcjogJ2RhdmlkIGhhcnQgKGh0dHA6Ly9oYXJ0LWRldi5jb20pJyxcbiAgYmFzZTAwOiAnIzFlMWUxZScsXG4gIGJhc2UwMTogJyMzMjM1MzcnLFxuICBiYXNlMDI6ICcjNDY0YjUwJyxcbiAgYmFzZTAzOiAnIzVmNWE2MCcsXG4gIGJhc2UwNDogJyM4MzgxODQnLFxuICBiYXNlMDU6ICcjYTdhN2E3JyxcbiAgYmFzZTA2OiAnI2MzYzNjMycsXG4gIGJhc2UwNzogJyNmZmZmZmYnLFxuICBiYXNlMDg6ICcjY2Y2YTRjJyxcbiAgYmFzZTA5OiAnI2NkYTg2OScsXG4gIGJhc2UwQTogJyNmOWVlOTgnLFxuICBiYXNlMEI6ICcjOGY5ZDZhJyxcbiAgYmFzZTBDOiAnI2FmYzRkYicsXG4gIGJhc2UwRDogJyM3NTg3YTYnLFxuICBiYXNlMEU6ICcjOWI4NTlkJyxcbiAgYmFzZTBGOiAnIzliNzAzZidcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCdcclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG5cdFwiYWxpY2VibHVlXCI6IFsyNDAsIDI0OCwgMjU1XSxcclxuXHRcImFudGlxdWV3aGl0ZVwiOiBbMjUwLCAyMzUsIDIxNV0sXHJcblx0XCJhcXVhXCI6IFswLCAyNTUsIDI1NV0sXHJcblx0XCJhcXVhbWFyaW5lXCI6IFsxMjcsIDI1NSwgMjEyXSxcclxuXHRcImF6dXJlXCI6IFsyNDAsIDI1NSwgMjU1XSxcclxuXHRcImJlaWdlXCI6IFsyNDUsIDI0NSwgMjIwXSxcclxuXHRcImJpc3F1ZVwiOiBbMjU1LCAyMjgsIDE5Nl0sXHJcblx0XCJibGFja1wiOiBbMCwgMCwgMF0sXHJcblx0XCJibGFuY2hlZGFsbW9uZFwiOiBbMjU1LCAyMzUsIDIwNV0sXHJcblx0XCJibHVlXCI6IFswLCAwLCAyNTVdLFxyXG5cdFwiYmx1ZXZpb2xldFwiOiBbMTM4LCA0MywgMjI2XSxcclxuXHRcImJyb3duXCI6IFsxNjUsIDQyLCA0Ml0sXHJcblx0XCJidXJseXdvb2RcIjogWzIyMiwgMTg0LCAxMzVdLFxyXG5cdFwiY2FkZXRibHVlXCI6IFs5NSwgMTU4LCAxNjBdLFxyXG5cdFwiY2hhcnRyZXVzZVwiOiBbMTI3LCAyNTUsIDBdLFxyXG5cdFwiY2hvY29sYXRlXCI6IFsyMTAsIDEwNSwgMzBdLFxyXG5cdFwiY29yYWxcIjogWzI1NSwgMTI3LCA4MF0sXHJcblx0XCJjb3JuZmxvd2VyYmx1ZVwiOiBbMTAwLCAxNDksIDIzN10sXHJcblx0XCJjb3Juc2lsa1wiOiBbMjU1LCAyNDgsIDIyMF0sXHJcblx0XCJjcmltc29uXCI6IFsyMjAsIDIwLCA2MF0sXHJcblx0XCJjeWFuXCI6IFswLCAyNTUsIDI1NV0sXHJcblx0XCJkYXJrYmx1ZVwiOiBbMCwgMCwgMTM5XSxcclxuXHRcImRhcmtjeWFuXCI6IFswLCAxMzksIDEzOV0sXHJcblx0XCJkYXJrZ29sZGVucm9kXCI6IFsxODQsIDEzNCwgMTFdLFxyXG5cdFwiZGFya2dyYXlcIjogWzE2OSwgMTY5LCAxNjldLFxyXG5cdFwiZGFya2dyZWVuXCI6IFswLCAxMDAsIDBdLFxyXG5cdFwiZGFya2dyZXlcIjogWzE2OSwgMTY5LCAxNjldLFxyXG5cdFwiZGFya2toYWtpXCI6IFsxODksIDE4MywgMTA3XSxcclxuXHRcImRhcmttYWdlbnRhXCI6IFsxMzksIDAsIDEzOV0sXHJcblx0XCJkYXJrb2xpdmVncmVlblwiOiBbODUsIDEwNywgNDddLFxyXG5cdFwiZGFya29yYW5nZVwiOiBbMjU1LCAxNDAsIDBdLFxyXG5cdFwiZGFya29yY2hpZFwiOiBbMTUzLCA1MCwgMjA0XSxcclxuXHRcImRhcmtyZWRcIjogWzEzOSwgMCwgMF0sXHJcblx0XCJkYXJrc2FsbW9uXCI6IFsyMzMsIDE1MCwgMTIyXSxcclxuXHRcImRhcmtzZWFncmVlblwiOiBbMTQzLCAxODgsIDE0M10sXHJcblx0XCJkYXJrc2xhdGVibHVlXCI6IFs3MiwgNjEsIDEzOV0sXHJcblx0XCJkYXJrc2xhdGVncmF5XCI6IFs0NywgNzksIDc5XSxcclxuXHRcImRhcmtzbGF0ZWdyZXlcIjogWzQ3LCA3OSwgNzldLFxyXG5cdFwiZGFya3R1cnF1b2lzZVwiOiBbMCwgMjA2LCAyMDldLFxyXG5cdFwiZGFya3Zpb2xldFwiOiBbMTQ4LCAwLCAyMTFdLFxyXG5cdFwiZGVlcHBpbmtcIjogWzI1NSwgMjAsIDE0N10sXHJcblx0XCJkZWVwc2t5Ymx1ZVwiOiBbMCwgMTkxLCAyNTVdLFxyXG5cdFwiZGltZ3JheVwiOiBbMTA1LCAxMDUsIDEwNV0sXHJcblx0XCJkaW1ncmV5XCI6IFsxMDUsIDEwNSwgMTA1XSxcclxuXHRcImRvZGdlcmJsdWVcIjogWzMwLCAxNDQsIDI1NV0sXHJcblx0XCJmaXJlYnJpY2tcIjogWzE3OCwgMzQsIDM0XSxcclxuXHRcImZsb3JhbHdoaXRlXCI6IFsyNTUsIDI1MCwgMjQwXSxcclxuXHRcImZvcmVzdGdyZWVuXCI6IFszNCwgMTM5LCAzNF0sXHJcblx0XCJmdWNoc2lhXCI6IFsyNTUsIDAsIDI1NV0sXHJcblx0XCJnYWluc2Jvcm9cIjogWzIyMCwgMjIwLCAyMjBdLFxyXG5cdFwiZ2hvc3R3aGl0ZVwiOiBbMjQ4LCAyNDgsIDI1NV0sXHJcblx0XCJnb2xkXCI6IFsyNTUsIDIxNSwgMF0sXHJcblx0XCJnb2xkZW5yb2RcIjogWzIxOCwgMTY1LCAzMl0sXHJcblx0XCJncmF5XCI6IFsxMjgsIDEyOCwgMTI4XSxcclxuXHRcImdyZWVuXCI6IFswLCAxMjgsIDBdLFxyXG5cdFwiZ3JlZW55ZWxsb3dcIjogWzE3MywgMjU1LCA0N10sXHJcblx0XCJncmV5XCI6IFsxMjgsIDEyOCwgMTI4XSxcclxuXHRcImhvbmV5ZGV3XCI6IFsyNDAsIDI1NSwgMjQwXSxcclxuXHRcImhvdHBpbmtcIjogWzI1NSwgMTA1LCAxODBdLFxyXG5cdFwiaW5kaWFucmVkXCI6IFsyMDUsIDkyLCA5Ml0sXHJcblx0XCJpbmRpZ29cIjogWzc1LCAwLCAxMzBdLFxyXG5cdFwiaXZvcnlcIjogWzI1NSwgMjU1LCAyNDBdLFxyXG5cdFwia2hha2lcIjogWzI0MCwgMjMwLCAxNDBdLFxyXG5cdFwibGF2ZW5kZXJcIjogWzIzMCwgMjMwLCAyNTBdLFxyXG5cdFwibGF2ZW5kZXJibHVzaFwiOiBbMjU1LCAyNDAsIDI0NV0sXHJcblx0XCJsYXduZ3JlZW5cIjogWzEyNCwgMjUyLCAwXSxcclxuXHRcImxlbW9uY2hpZmZvblwiOiBbMjU1LCAyNTAsIDIwNV0sXHJcblx0XCJsaWdodGJsdWVcIjogWzE3MywgMjE2LCAyMzBdLFxyXG5cdFwibGlnaHRjb3JhbFwiOiBbMjQwLCAxMjgsIDEyOF0sXHJcblx0XCJsaWdodGN5YW5cIjogWzIyNCwgMjU1LCAyNTVdLFxyXG5cdFwibGlnaHRnb2xkZW5yb2R5ZWxsb3dcIjogWzI1MCwgMjUwLCAyMTBdLFxyXG5cdFwibGlnaHRncmF5XCI6IFsyMTEsIDIxMSwgMjExXSxcclxuXHRcImxpZ2h0Z3JlZW5cIjogWzE0NCwgMjM4LCAxNDRdLFxyXG5cdFwibGlnaHRncmV5XCI6IFsyMTEsIDIxMSwgMjExXSxcclxuXHRcImxpZ2h0cGlua1wiOiBbMjU1LCAxODIsIDE5M10sXHJcblx0XCJsaWdodHNhbG1vblwiOiBbMjU1LCAxNjAsIDEyMl0sXHJcblx0XCJsaWdodHNlYWdyZWVuXCI6IFszMiwgMTc4LCAxNzBdLFxyXG5cdFwibGlnaHRza3libHVlXCI6IFsxMzUsIDIwNiwgMjUwXSxcclxuXHRcImxpZ2h0c2xhdGVncmF5XCI6IFsxMTksIDEzNiwgMTUzXSxcclxuXHRcImxpZ2h0c2xhdGVncmV5XCI6IFsxMTksIDEzNiwgMTUzXSxcclxuXHRcImxpZ2h0c3RlZWxibHVlXCI6IFsxNzYsIDE5NiwgMjIyXSxcclxuXHRcImxpZ2h0eWVsbG93XCI6IFsyNTUsIDI1NSwgMjI0XSxcclxuXHRcImxpbWVcIjogWzAsIDI1NSwgMF0sXHJcblx0XCJsaW1lZ3JlZW5cIjogWzUwLCAyMDUsIDUwXSxcclxuXHRcImxpbmVuXCI6IFsyNTAsIDI0MCwgMjMwXSxcclxuXHRcIm1hZ2VudGFcIjogWzI1NSwgMCwgMjU1XSxcclxuXHRcIm1hcm9vblwiOiBbMTI4LCAwLCAwXSxcclxuXHRcIm1lZGl1bWFxdWFtYXJpbmVcIjogWzEwMiwgMjA1LCAxNzBdLFxyXG5cdFwibWVkaXVtYmx1ZVwiOiBbMCwgMCwgMjA1XSxcclxuXHRcIm1lZGl1bW9yY2hpZFwiOiBbMTg2LCA4NSwgMjExXSxcclxuXHRcIm1lZGl1bXB1cnBsZVwiOiBbMTQ3LCAxMTIsIDIxOV0sXHJcblx0XCJtZWRpdW1zZWFncmVlblwiOiBbNjAsIDE3OSwgMTEzXSxcclxuXHRcIm1lZGl1bXNsYXRlYmx1ZVwiOiBbMTIzLCAxMDQsIDIzOF0sXHJcblx0XCJtZWRpdW1zcHJpbmdncmVlblwiOiBbMCwgMjUwLCAxNTRdLFxyXG5cdFwibWVkaXVtdHVycXVvaXNlXCI6IFs3MiwgMjA5LCAyMDRdLFxyXG5cdFwibWVkaXVtdmlvbGV0cmVkXCI6IFsxOTksIDIxLCAxMzNdLFxyXG5cdFwibWlkbmlnaHRibHVlXCI6IFsyNSwgMjUsIDExMl0sXHJcblx0XCJtaW50Y3JlYW1cIjogWzI0NSwgMjU1LCAyNTBdLFxyXG5cdFwibWlzdHlyb3NlXCI6IFsyNTUsIDIyOCwgMjI1XSxcclxuXHRcIm1vY2Nhc2luXCI6IFsyNTUsIDIyOCwgMTgxXSxcclxuXHRcIm5hdmFqb3doaXRlXCI6IFsyNTUsIDIyMiwgMTczXSxcclxuXHRcIm5hdnlcIjogWzAsIDAsIDEyOF0sXHJcblx0XCJvbGRsYWNlXCI6IFsyNTMsIDI0NSwgMjMwXSxcclxuXHRcIm9saXZlXCI6IFsxMjgsIDEyOCwgMF0sXHJcblx0XCJvbGl2ZWRyYWJcIjogWzEwNywgMTQyLCAzNV0sXHJcblx0XCJvcmFuZ2VcIjogWzI1NSwgMTY1LCAwXSxcclxuXHRcIm9yYW5nZXJlZFwiOiBbMjU1LCA2OSwgMF0sXHJcblx0XCJvcmNoaWRcIjogWzIxOCwgMTEyLCAyMTRdLFxyXG5cdFwicGFsZWdvbGRlbnJvZFwiOiBbMjM4LCAyMzIsIDE3MF0sXHJcblx0XCJwYWxlZ3JlZW5cIjogWzE1MiwgMjUxLCAxNTJdLFxyXG5cdFwicGFsZXR1cnF1b2lzZVwiOiBbMTc1LCAyMzgsIDIzOF0sXHJcblx0XCJwYWxldmlvbGV0cmVkXCI6IFsyMTksIDExMiwgMTQ3XSxcclxuXHRcInBhcGF5YXdoaXBcIjogWzI1NSwgMjM5LCAyMTNdLFxyXG5cdFwicGVhY2hwdWZmXCI6IFsyNTUsIDIxOCwgMTg1XSxcclxuXHRcInBlcnVcIjogWzIwNSwgMTMzLCA2M10sXHJcblx0XCJwaW5rXCI6IFsyNTUsIDE5MiwgMjAzXSxcclxuXHRcInBsdW1cIjogWzIyMSwgMTYwLCAyMjFdLFxyXG5cdFwicG93ZGVyYmx1ZVwiOiBbMTc2LCAyMjQsIDIzMF0sXHJcblx0XCJwdXJwbGVcIjogWzEyOCwgMCwgMTI4XSxcclxuXHRcInJlYmVjY2FwdXJwbGVcIjogWzEwMiwgNTEsIDE1M10sXHJcblx0XCJyZWRcIjogWzI1NSwgMCwgMF0sXHJcblx0XCJyb3N5YnJvd25cIjogWzE4OCwgMTQzLCAxNDNdLFxyXG5cdFwicm95YWxibHVlXCI6IFs2NSwgMTA1LCAyMjVdLFxyXG5cdFwic2FkZGxlYnJvd25cIjogWzEzOSwgNjksIDE5XSxcclxuXHRcInNhbG1vblwiOiBbMjUwLCAxMjgsIDExNF0sXHJcblx0XCJzYW5keWJyb3duXCI6IFsyNDQsIDE2NCwgOTZdLFxyXG5cdFwic2VhZ3JlZW5cIjogWzQ2LCAxMzksIDg3XSxcclxuXHRcInNlYXNoZWxsXCI6IFsyNTUsIDI0NSwgMjM4XSxcclxuXHRcInNpZW5uYVwiOiBbMTYwLCA4MiwgNDVdLFxyXG5cdFwic2lsdmVyXCI6IFsxOTIsIDE5MiwgMTkyXSxcclxuXHRcInNreWJsdWVcIjogWzEzNSwgMjA2LCAyMzVdLFxyXG5cdFwic2xhdGVibHVlXCI6IFsxMDYsIDkwLCAyMDVdLFxyXG5cdFwic2xhdGVncmF5XCI6IFsxMTIsIDEyOCwgMTQ0XSxcclxuXHRcInNsYXRlZ3JleVwiOiBbMTEyLCAxMjgsIDE0NF0sXHJcblx0XCJzbm93XCI6IFsyNTUsIDI1MCwgMjUwXSxcclxuXHRcInNwcmluZ2dyZWVuXCI6IFswLCAyNTUsIDEyN10sXHJcblx0XCJzdGVlbGJsdWVcIjogWzcwLCAxMzAsIDE4MF0sXHJcblx0XCJ0YW5cIjogWzIxMCwgMTgwLCAxNDBdLFxyXG5cdFwidGVhbFwiOiBbMCwgMTI4LCAxMjhdLFxyXG5cdFwidGhpc3RsZVwiOiBbMjE2LCAxOTEsIDIxNl0sXHJcblx0XCJ0b21hdG9cIjogWzI1NSwgOTksIDcxXSxcclxuXHRcInR1cnF1b2lzZVwiOiBbNjQsIDIyNCwgMjA4XSxcclxuXHRcInZpb2xldFwiOiBbMjM4LCAxMzAsIDIzOF0sXHJcblx0XCJ3aGVhdFwiOiBbMjQ1LCAyMjIsIDE3OV0sXHJcblx0XCJ3aGl0ZVwiOiBbMjU1LCAyNTUsIDI1NV0sXHJcblx0XCJ3aGl0ZXNtb2tlXCI6IFsyNDUsIDI0NSwgMjQ1XSxcclxuXHRcInllbGxvd1wiOiBbMjU1LCAyNTUsIDBdLFxyXG5cdFwieWVsbG93Z3JlZW5cIjogWzE1NCwgMjA1LCA1MF1cclxufTtcclxuIiwiLyogTUlUIGxpY2Vuc2UgKi9cbnZhciBjb2xvck5hbWVzID0gcmVxdWlyZSgnY29sb3ItbmFtZScpO1xudmFyIHN3aXp6bGUgPSByZXF1aXJlKCdzaW1wbGUtc3dpenpsZScpO1xudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0Lmhhc093blByb3BlcnR5O1xuXG52YXIgcmV2ZXJzZU5hbWVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuLy8gY3JlYXRlIGEgbGlzdCBvZiByZXZlcnNlIGNvbG9yIG5hbWVzXG5mb3IgKHZhciBuYW1lIGluIGNvbG9yTmFtZXMpIHtcblx0aWYgKGhhc093blByb3BlcnR5LmNhbGwoY29sb3JOYW1lcywgbmFtZSkpIHtcblx0XHRyZXZlcnNlTmFtZXNbY29sb3JOYW1lc1tuYW1lXV0gPSBuYW1lO1xuXHR9XG59XG5cbnZhciBjcyA9IG1vZHVsZS5leHBvcnRzID0ge1xuXHR0bzoge30sXG5cdGdldDoge31cbn07XG5cbmNzLmdldCA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcblx0dmFyIHByZWZpeCA9IHN0cmluZy5zdWJzdHJpbmcoMCwgMykudG9Mb3dlckNhc2UoKTtcblx0dmFyIHZhbDtcblx0dmFyIG1vZGVsO1xuXHRzd2l0Y2ggKHByZWZpeCkge1xuXHRcdGNhc2UgJ2hzbCc6XG5cdFx0XHR2YWwgPSBjcy5nZXQuaHNsKHN0cmluZyk7XG5cdFx0XHRtb2RlbCA9ICdoc2wnO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAnaHdiJzpcblx0XHRcdHZhbCA9IGNzLmdldC5od2Ioc3RyaW5nKTtcblx0XHRcdG1vZGVsID0gJ2h3Yic7XG5cdFx0XHRicmVhaztcblx0XHRkZWZhdWx0OlxuXHRcdFx0dmFsID0gY3MuZ2V0LnJnYihzdHJpbmcpO1xuXHRcdFx0bW9kZWwgPSAncmdiJztcblx0XHRcdGJyZWFrO1xuXHR9XG5cblx0aWYgKCF2YWwpIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdHJldHVybiB7bW9kZWw6IG1vZGVsLCB2YWx1ZTogdmFsfTtcbn07XG5cbmNzLmdldC5yZ2IgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG5cdGlmICghc3RyaW5nKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHR2YXIgYWJiciA9IC9eIyhbYS1mMC05XXszLDR9KSQvaTtcblx0dmFyIGhleCA9IC9eIyhbYS1mMC05XXs2fSkoW2EtZjAtOV17Mn0pPyQvaTtcblx0dmFyIHJnYmEgPSAvXnJnYmE/XFwoXFxzKihbKy1dP1xcZCspKD89W1xccyxdKVxccyooPzosXFxzKik/KFsrLV0/XFxkKykoPz1bXFxzLF0pXFxzKig/OixcXHMqKT8oWystXT9cXGQrKVxccyooPzpbLHxcXC9dXFxzKihbKy1dP1tcXGRcXC5dKykoJT8pXFxzKik/XFwpJC87XG5cdHZhciBwZXIgPSAvXnJnYmE/XFwoXFxzKihbKy1dP1tcXGRcXC5dKylcXCVcXHMqLD9cXHMqKFsrLV0/W1xcZFxcLl0rKVxcJVxccyosP1xccyooWystXT9bXFxkXFwuXSspXFwlXFxzKig/OlssfFxcL11cXHMqKFsrLV0/W1xcZFxcLl0rKSglPylcXHMqKT9cXCkkLztcblx0dmFyIGtleXdvcmQgPSAvXihcXHcrKSQvO1xuXG5cdHZhciByZ2IgPSBbMCwgMCwgMCwgMV07XG5cdHZhciBtYXRjaDtcblx0dmFyIGk7XG5cdHZhciBoZXhBbHBoYTtcblxuXHRpZiAobWF0Y2ggPSBzdHJpbmcubWF0Y2goaGV4KSkge1xuXHRcdGhleEFscGhhID0gbWF0Y2hbMl07XG5cdFx0bWF0Y2ggPSBtYXRjaFsxXTtcblxuXHRcdGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHtcblx0XHRcdC8vIGh0dHBzOi8vanNwZXJmLmNvbS9zbGljZS12cy1zdWJzdHItdnMtc3Vic3RyaW5nLW1ldGhvZHMtbG9uZy1zdHJpbmcvMTlcblx0XHRcdHZhciBpMiA9IGkgKiAyO1xuXHRcdFx0cmdiW2ldID0gcGFyc2VJbnQobWF0Y2guc2xpY2UoaTIsIGkyICsgMiksIDE2KTtcblx0XHR9XG5cblx0XHRpZiAoaGV4QWxwaGEpIHtcblx0XHRcdHJnYlszXSA9IHBhcnNlSW50KGhleEFscGhhLCAxNikgLyAyNTU7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKG1hdGNoID0gc3RyaW5nLm1hdGNoKGFiYnIpKSB7XG5cdFx0bWF0Y2ggPSBtYXRjaFsxXTtcblx0XHRoZXhBbHBoYSA9IG1hdGNoWzNdO1xuXG5cdFx0Zm9yIChpID0gMDsgaSA8IDM7IGkrKykge1xuXHRcdFx0cmdiW2ldID0gcGFyc2VJbnQobWF0Y2hbaV0gKyBtYXRjaFtpXSwgMTYpO1xuXHRcdH1cblxuXHRcdGlmIChoZXhBbHBoYSkge1xuXHRcdFx0cmdiWzNdID0gcGFyc2VJbnQoaGV4QWxwaGEgKyBoZXhBbHBoYSwgMTYpIC8gMjU1O1xuXHRcdH1cblx0fSBlbHNlIGlmIChtYXRjaCA9IHN0cmluZy5tYXRjaChyZ2JhKSkge1xuXHRcdGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHtcblx0XHRcdHJnYltpXSA9IHBhcnNlSW50KG1hdGNoW2kgKyAxXSwgMCk7XG5cdFx0fVxuXG5cdFx0aWYgKG1hdGNoWzRdKSB7XG5cdFx0XHRpZiAobWF0Y2hbNV0pIHtcblx0XHRcdFx0cmdiWzNdID0gcGFyc2VGbG9hdChtYXRjaFs0XSkgKiAwLjAxO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmdiWzNdID0gcGFyc2VGbG9hdChtYXRjaFs0XSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9IGVsc2UgaWYgKG1hdGNoID0gc3RyaW5nLm1hdGNoKHBlcikpIHtcblx0XHRmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7XG5cdFx0XHRyZ2JbaV0gPSBNYXRoLnJvdW5kKHBhcnNlRmxvYXQobWF0Y2hbaSArIDFdKSAqIDIuNTUpO1xuXHRcdH1cblxuXHRcdGlmIChtYXRjaFs0XSkge1xuXHRcdFx0aWYgKG1hdGNoWzVdKSB7XG5cdFx0XHRcdHJnYlszXSA9IHBhcnNlRmxvYXQobWF0Y2hbNF0pICogMC4wMTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJnYlszXSA9IHBhcnNlRmxvYXQobWF0Y2hbNF0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fSBlbHNlIGlmIChtYXRjaCA9IHN0cmluZy5tYXRjaChrZXl3b3JkKSkge1xuXHRcdGlmIChtYXRjaFsxXSA9PT0gJ3RyYW5zcGFyZW50Jykge1xuXHRcdFx0cmV0dXJuIFswLCAwLCAwLCAwXTtcblx0XHR9XG5cblx0XHRpZiAoIWhhc093blByb3BlcnR5LmNhbGwoY29sb3JOYW1lcywgbWF0Y2hbMV0pKSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHRyZ2IgPSBjb2xvck5hbWVzW21hdGNoWzFdXTtcblx0XHRyZ2JbM10gPSAxO1xuXG5cdFx0cmV0dXJuIHJnYjtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHtcblx0XHRyZ2JbaV0gPSBjbGFtcChyZ2JbaV0sIDAsIDI1NSk7XG5cdH1cblx0cmdiWzNdID0gY2xhbXAocmdiWzNdLCAwLCAxKTtcblxuXHRyZXR1cm4gcmdiO1xufTtcblxuY3MuZ2V0LmhzbCA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcblx0aWYgKCFzdHJpbmcpIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdHZhciBoc2wgPSAvXmhzbGE/XFwoXFxzKihbKy1dPyg/OlxcZHswLDN9XFwuKT9cXGQrKSg/OmRlZyk/XFxzKiw/XFxzKihbKy1dP1tcXGRcXC5dKyklXFxzKiw/XFxzKihbKy1dP1tcXGRcXC5dKyklXFxzKig/OlssfFxcL11cXHMqKFsrLV0/KD89XFwuXFxkfFxcZCkoPzowfFsxLTldXFxkKik/KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KVxccyopP1xcKSQvO1xuXHR2YXIgbWF0Y2ggPSBzdHJpbmcubWF0Y2goaHNsKTtcblxuXHRpZiAobWF0Y2gpIHtcblx0XHR2YXIgYWxwaGEgPSBwYXJzZUZsb2F0KG1hdGNoWzRdKTtcblx0XHR2YXIgaCA9ICgocGFyc2VGbG9hdChtYXRjaFsxXSkgJSAzNjApICsgMzYwKSAlIDM2MDtcblx0XHR2YXIgcyA9IGNsYW1wKHBhcnNlRmxvYXQobWF0Y2hbMl0pLCAwLCAxMDApO1xuXHRcdHZhciBsID0gY2xhbXAocGFyc2VGbG9hdChtYXRjaFszXSksIDAsIDEwMCk7XG5cdFx0dmFyIGEgPSBjbGFtcChpc05hTihhbHBoYSkgPyAxIDogYWxwaGEsIDAsIDEpO1xuXG5cdFx0cmV0dXJuIFtoLCBzLCBsLCBhXTtcblx0fVxuXG5cdHJldHVybiBudWxsO1xufTtcblxuY3MuZ2V0Lmh3YiA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcblx0aWYgKCFzdHJpbmcpIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdHZhciBod2IgPSAvXmh3YlxcKFxccyooWystXT9cXGR7MCwzfSg/OlxcLlxcZCspPykoPzpkZWcpP1xccyosXFxzKihbKy1dP1tcXGRcXC5dKyklXFxzKixcXHMqKFsrLV0/W1xcZFxcLl0rKSVcXHMqKD86LFxccyooWystXT8oPz1cXC5cXGR8XFxkKSg/OjB8WzEtOV1cXGQqKT8oPzpcXC5cXGQqKT8oPzpbZUVdWystXT9cXGQrKT8pXFxzKik/XFwpJC87XG5cdHZhciBtYXRjaCA9IHN0cmluZy5tYXRjaChod2IpO1xuXG5cdGlmIChtYXRjaCkge1xuXHRcdHZhciBhbHBoYSA9IHBhcnNlRmxvYXQobWF0Y2hbNF0pO1xuXHRcdHZhciBoID0gKChwYXJzZUZsb2F0KG1hdGNoWzFdKSAlIDM2MCkgKyAzNjApICUgMzYwO1xuXHRcdHZhciB3ID0gY2xhbXAocGFyc2VGbG9hdChtYXRjaFsyXSksIDAsIDEwMCk7XG5cdFx0dmFyIGIgPSBjbGFtcChwYXJzZUZsb2F0KG1hdGNoWzNdKSwgMCwgMTAwKTtcblx0XHR2YXIgYSA9IGNsYW1wKGlzTmFOKGFscGhhKSA/IDEgOiBhbHBoYSwgMCwgMSk7XG5cdFx0cmV0dXJuIFtoLCB3LCBiLCBhXTtcblx0fVxuXG5cdHJldHVybiBudWxsO1xufTtcblxuY3MudG8uaGV4ID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgcmdiYSA9IHN3aXp6bGUoYXJndW1lbnRzKTtcblxuXHRyZXR1cm4gKFxuXHRcdCcjJyArXG5cdFx0aGV4RG91YmxlKHJnYmFbMF0pICtcblx0XHRoZXhEb3VibGUocmdiYVsxXSkgK1xuXHRcdGhleERvdWJsZShyZ2JhWzJdKSArXG5cdFx0KHJnYmFbM10gPCAxXG5cdFx0XHQ/IChoZXhEb3VibGUoTWF0aC5yb3VuZChyZ2JhWzNdICogMjU1KSkpXG5cdFx0XHQ6ICcnKVxuXHQpO1xufTtcblxuY3MudG8ucmdiID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgcmdiYSA9IHN3aXp6bGUoYXJndW1lbnRzKTtcblxuXHRyZXR1cm4gcmdiYS5sZW5ndGggPCA0IHx8IHJnYmFbM10gPT09IDFcblx0XHQ/ICdyZ2IoJyArIE1hdGgucm91bmQocmdiYVswXSkgKyAnLCAnICsgTWF0aC5yb3VuZChyZ2JhWzFdKSArICcsICcgKyBNYXRoLnJvdW5kKHJnYmFbMl0pICsgJyknXG5cdFx0OiAncmdiYSgnICsgTWF0aC5yb3VuZChyZ2JhWzBdKSArICcsICcgKyBNYXRoLnJvdW5kKHJnYmFbMV0pICsgJywgJyArIE1hdGgucm91bmQocmdiYVsyXSkgKyAnLCAnICsgcmdiYVszXSArICcpJztcbn07XG5cbmNzLnRvLnJnYi5wZXJjZW50ID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgcmdiYSA9IHN3aXp6bGUoYXJndW1lbnRzKTtcblxuXHR2YXIgciA9IE1hdGgucm91bmQocmdiYVswXSAvIDI1NSAqIDEwMCk7XG5cdHZhciBnID0gTWF0aC5yb3VuZChyZ2JhWzFdIC8gMjU1ICogMTAwKTtcblx0dmFyIGIgPSBNYXRoLnJvdW5kKHJnYmFbMl0gLyAyNTUgKiAxMDApO1xuXG5cdHJldHVybiByZ2JhLmxlbmd0aCA8IDQgfHwgcmdiYVszXSA9PT0gMVxuXHRcdD8gJ3JnYignICsgciArICclLCAnICsgZyArICclLCAnICsgYiArICclKSdcblx0XHQ6ICdyZ2JhKCcgKyByICsgJyUsICcgKyBnICsgJyUsICcgKyBiICsgJyUsICcgKyByZ2JhWzNdICsgJyknO1xufTtcblxuY3MudG8uaHNsID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgaHNsYSA9IHN3aXp6bGUoYXJndW1lbnRzKTtcblx0cmV0dXJuIGhzbGEubGVuZ3RoIDwgNCB8fCBoc2xhWzNdID09PSAxXG5cdFx0PyAnaHNsKCcgKyBoc2xhWzBdICsgJywgJyArIGhzbGFbMV0gKyAnJSwgJyArIGhzbGFbMl0gKyAnJSknXG5cdFx0OiAnaHNsYSgnICsgaHNsYVswXSArICcsICcgKyBoc2xhWzFdICsgJyUsICcgKyBoc2xhWzJdICsgJyUsICcgKyBoc2xhWzNdICsgJyknO1xufTtcblxuLy8gaHdiIGlzIGEgYml0IGRpZmZlcmVudCB0aGFuIHJnYihhKSAmIGhzbChhKSBzaW5jZSB0aGVyZSBpcyBubyBhbHBoYSBzcGVjaWZpYyBzeW50YXhcbi8vIChod2IgaGF2ZSBhbHBoYSBvcHRpb25hbCAmIDEgaXMgZGVmYXVsdCB2YWx1ZSlcbmNzLnRvLmh3YiA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIGh3YmEgPSBzd2l6emxlKGFyZ3VtZW50cyk7XG5cblx0dmFyIGEgPSAnJztcblx0aWYgKGh3YmEubGVuZ3RoID49IDQgJiYgaHdiYVszXSAhPT0gMSkge1xuXHRcdGEgPSAnLCAnICsgaHdiYVszXTtcblx0fVxuXG5cdHJldHVybiAnaHdiKCcgKyBod2JhWzBdICsgJywgJyArIGh3YmFbMV0gKyAnJSwgJyArIGh3YmFbMl0gKyAnJScgKyBhICsgJyknO1xufTtcblxuY3MudG8ua2V5d29yZCA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0cmV0dXJuIHJldmVyc2VOYW1lc1tyZ2Iuc2xpY2UoMCwgMyldO1xufTtcblxuLy8gaGVscGVyc1xuZnVuY3Rpb24gY2xhbXAobnVtLCBtaW4sIG1heCkge1xuXHRyZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgobWluLCBudW0pLCBtYXgpO1xufVxuXG5mdW5jdGlvbiBoZXhEb3VibGUobnVtKSB7XG5cdHZhciBzdHIgPSBNYXRoLnJvdW5kKG51bSkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7XG5cdHJldHVybiAoc3RyLmxlbmd0aCA8IDIpID8gJzAnICsgc3RyIDogc3RyO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY29sb3JTdHJpbmcgPSByZXF1aXJlKCdjb2xvci1zdHJpbmcnKTtcbnZhciBjb252ZXJ0ID0gcmVxdWlyZSgnY29sb3ItY29udmVydCcpO1xuXG52YXIgX3NsaWNlID0gW10uc2xpY2U7XG5cbnZhciBza2lwcGVkTW9kZWxzID0gW1xuXHQvLyB0byBiZSBob25lc3QsIEkgZG9uJ3QgcmVhbGx5IGZlZWwgbGlrZSBrZXl3b3JkIGJlbG9uZ3MgaW4gY29sb3IgY29udmVydCwgYnV0IGVoLlxuXHQna2V5d29yZCcsXG5cblx0Ly8gZ3JheSBjb25mbGljdHMgd2l0aCBzb21lIG1ldGhvZCBuYW1lcywgYW5kIGhhcyBpdHMgb3duIG1ldGhvZCBkZWZpbmVkLlxuXHQnZ3JheScsXG5cblx0Ly8gc2hvdWxkbid0IHJlYWxseSBiZSBpbiBjb2xvci1jb252ZXJ0IGVpdGhlci4uLlxuXHQnaGV4J1xuXTtcblxudmFyIGhhc2hlZE1vZGVsS2V5cyA9IHt9O1xuT2JqZWN0LmtleXMoY29udmVydCkuZm9yRWFjaChmdW5jdGlvbiAobW9kZWwpIHtcblx0aGFzaGVkTW9kZWxLZXlzW19zbGljZS5jYWxsKGNvbnZlcnRbbW9kZWxdLmxhYmVscykuc29ydCgpLmpvaW4oJycpXSA9IG1vZGVsO1xufSk7XG5cbnZhciBsaW1pdGVycyA9IHt9O1xuXG5mdW5jdGlvbiBDb2xvcihvYmosIG1vZGVsKSB7XG5cdGlmICghKHRoaXMgaW5zdGFuY2VvZiBDb2xvcikpIHtcblx0XHRyZXR1cm4gbmV3IENvbG9yKG9iaiwgbW9kZWwpO1xuXHR9XG5cblx0aWYgKG1vZGVsICYmIG1vZGVsIGluIHNraXBwZWRNb2RlbHMpIHtcblx0XHRtb2RlbCA9IG51bGw7XG5cdH1cblxuXHRpZiAobW9kZWwgJiYgIShtb2RlbCBpbiBjb252ZXJ0KSkge1xuXHRcdHRocm93IG5ldyBFcnJvcignVW5rbm93biBtb2RlbDogJyArIG1vZGVsKTtcblx0fVxuXG5cdHZhciBpO1xuXHR2YXIgY2hhbm5lbHM7XG5cblx0aWYgKG9iaiA9PSBudWxsKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZXEtbnVsbCxlcWVxZXFcblx0XHR0aGlzLm1vZGVsID0gJ3JnYic7XG5cdFx0dGhpcy5jb2xvciA9IFswLCAwLCAwXTtcblx0XHR0aGlzLnZhbHBoYSA9IDE7XG5cdH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgQ29sb3IpIHtcblx0XHR0aGlzLm1vZGVsID0gb2JqLm1vZGVsO1xuXHRcdHRoaXMuY29sb3IgPSBvYmouY29sb3Iuc2xpY2UoKTtcblx0XHR0aGlzLnZhbHBoYSA9IG9iai52YWxwaGE7XG5cdH0gZWxzZSBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHtcblx0XHR2YXIgcmVzdWx0ID0gY29sb3JTdHJpbmcuZ2V0KG9iaik7XG5cdFx0aWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gcGFyc2UgY29sb3IgZnJvbSBzdHJpbmc6ICcgKyBvYmopO1xuXHRcdH1cblxuXHRcdHRoaXMubW9kZWwgPSByZXN1bHQubW9kZWw7XG5cdFx0Y2hhbm5lbHMgPSBjb252ZXJ0W3RoaXMubW9kZWxdLmNoYW5uZWxzO1xuXHRcdHRoaXMuY29sb3IgPSByZXN1bHQudmFsdWUuc2xpY2UoMCwgY2hhbm5lbHMpO1xuXHRcdHRoaXMudmFscGhhID0gdHlwZW9mIHJlc3VsdC52YWx1ZVtjaGFubmVsc10gPT09ICdudW1iZXInID8gcmVzdWx0LnZhbHVlW2NoYW5uZWxzXSA6IDE7XG5cdH0gZWxzZSBpZiAob2JqLmxlbmd0aCkge1xuXHRcdHRoaXMubW9kZWwgPSBtb2RlbCB8fCAncmdiJztcblx0XHRjaGFubmVscyA9IGNvbnZlcnRbdGhpcy5tb2RlbF0uY2hhbm5lbHM7XG5cdFx0dmFyIG5ld0FyciA9IF9zbGljZS5jYWxsKG9iaiwgMCwgY2hhbm5lbHMpO1xuXHRcdHRoaXMuY29sb3IgPSB6ZXJvQXJyYXkobmV3QXJyLCBjaGFubmVscyk7XG5cdFx0dGhpcy52YWxwaGEgPSB0eXBlb2Ygb2JqW2NoYW5uZWxzXSA9PT0gJ251bWJlcicgPyBvYmpbY2hhbm5lbHNdIDogMTtcblx0fSBlbHNlIGlmICh0eXBlb2Ygb2JqID09PSAnbnVtYmVyJykge1xuXHRcdC8vIHRoaXMgaXMgYWx3YXlzIFJHQiAtIGNhbiBiZSBjb252ZXJ0ZWQgbGF0ZXIgb24uXG5cdFx0b2JqICY9IDB4RkZGRkZGO1xuXHRcdHRoaXMubW9kZWwgPSAncmdiJztcblx0XHR0aGlzLmNvbG9yID0gW1xuXHRcdFx0KG9iaiA+PiAxNikgJiAweEZGLFxuXHRcdFx0KG9iaiA+PiA4KSAmIDB4RkYsXG5cdFx0XHRvYmogJiAweEZGXG5cdFx0XTtcblx0XHR0aGlzLnZhbHBoYSA9IDE7XG5cdH0gZWxzZSB7XG5cdFx0dGhpcy52YWxwaGEgPSAxO1xuXG5cdFx0dmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuXHRcdGlmICgnYWxwaGEnIGluIG9iaikge1xuXHRcdFx0a2V5cy5zcGxpY2Uoa2V5cy5pbmRleE9mKCdhbHBoYScpLCAxKTtcblx0XHRcdHRoaXMudmFscGhhID0gdHlwZW9mIG9iai5hbHBoYSA9PT0gJ251bWJlcicgPyBvYmouYWxwaGEgOiAwO1xuXHRcdH1cblxuXHRcdHZhciBoYXNoZWRLZXlzID0ga2V5cy5zb3J0KCkuam9pbignJyk7XG5cdFx0aWYgKCEoaGFzaGVkS2V5cyBpbiBoYXNoZWRNb2RlbEtleXMpKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBwYXJzZSBjb2xvciBmcm9tIG9iamVjdDogJyArIEpTT04uc3RyaW5naWZ5KG9iaikpO1xuXHRcdH1cblxuXHRcdHRoaXMubW9kZWwgPSBoYXNoZWRNb2RlbEtleXNbaGFzaGVkS2V5c107XG5cblx0XHR2YXIgbGFiZWxzID0gY29udmVydFt0aGlzLm1vZGVsXS5sYWJlbHM7XG5cdFx0dmFyIGNvbG9yID0gW107XG5cdFx0Zm9yIChpID0gMDsgaSA8IGxhYmVscy5sZW5ndGg7IGkrKykge1xuXHRcdFx0Y29sb3IucHVzaChvYmpbbGFiZWxzW2ldXSk7XG5cdFx0fVxuXG5cdFx0dGhpcy5jb2xvciA9IHplcm9BcnJheShjb2xvcik7XG5cdH1cblxuXHQvLyBwZXJmb3JtIGxpbWl0YXRpb25zIChjbGFtcGluZywgZXRjLilcblx0aWYgKGxpbWl0ZXJzW3RoaXMubW9kZWxdKSB7XG5cdFx0Y2hhbm5lbHMgPSBjb252ZXJ0W3RoaXMubW9kZWxdLmNoYW5uZWxzO1xuXHRcdGZvciAoaSA9IDA7IGkgPCBjaGFubmVsczsgaSsrKSB7XG5cdFx0XHR2YXIgbGltaXQgPSBsaW1pdGVyc1t0aGlzLm1vZGVsXVtpXTtcblx0XHRcdGlmIChsaW1pdCkge1xuXHRcdFx0XHR0aGlzLmNvbG9yW2ldID0gbGltaXQodGhpcy5jb2xvcltpXSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0dGhpcy52YWxwaGEgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCB0aGlzLnZhbHBoYSkpO1xuXG5cdGlmIChPYmplY3QuZnJlZXplKSB7XG5cdFx0T2JqZWN0LmZyZWV6ZSh0aGlzKTtcblx0fVxufVxuXG5Db2xvci5wcm90b3R5cGUgPSB7XG5cdHRvU3RyaW5nOiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIHRoaXMuc3RyaW5nKCk7XG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIHRoaXNbdGhpcy5tb2RlbF0oKTtcblx0fSxcblxuXHRzdHJpbmc6IGZ1bmN0aW9uIChwbGFjZXMpIHtcblx0XHR2YXIgc2VsZiA9IHRoaXMubW9kZWwgaW4gY29sb3JTdHJpbmcudG8gPyB0aGlzIDogdGhpcy5yZ2IoKTtcblx0XHRzZWxmID0gc2VsZi5yb3VuZCh0eXBlb2YgcGxhY2VzID09PSAnbnVtYmVyJyA/IHBsYWNlcyA6IDEpO1xuXHRcdHZhciBhcmdzID0gc2VsZi52YWxwaGEgPT09IDEgPyBzZWxmLmNvbG9yIDogc2VsZi5jb2xvci5jb25jYXQodGhpcy52YWxwaGEpO1xuXHRcdHJldHVybiBjb2xvclN0cmluZy50b1tzZWxmLm1vZGVsXShhcmdzKTtcblx0fSxcblxuXHRwZXJjZW50U3RyaW5nOiBmdW5jdGlvbiAocGxhY2VzKSB7XG5cdFx0dmFyIHNlbGYgPSB0aGlzLnJnYigpLnJvdW5kKHR5cGVvZiBwbGFjZXMgPT09ICdudW1iZXInID8gcGxhY2VzIDogMSk7XG5cdFx0dmFyIGFyZ3MgPSBzZWxmLnZhbHBoYSA9PT0gMSA/IHNlbGYuY29sb3IgOiBzZWxmLmNvbG9yLmNvbmNhdCh0aGlzLnZhbHBoYSk7XG5cdFx0cmV0dXJuIGNvbG9yU3RyaW5nLnRvLnJnYi5wZXJjZW50KGFyZ3MpO1xuXHR9LFxuXG5cdGFycmF5OiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIHRoaXMudmFscGhhID09PSAxID8gdGhpcy5jb2xvci5zbGljZSgpIDogdGhpcy5jb2xvci5jb25jYXQodGhpcy52YWxwaGEpO1xuXHR9LFxuXG5cdG9iamVjdDogZnVuY3Rpb24gKCkge1xuXHRcdHZhciByZXN1bHQgPSB7fTtcblx0XHR2YXIgY2hhbm5lbHMgPSBjb252ZXJ0W3RoaXMubW9kZWxdLmNoYW5uZWxzO1xuXHRcdHZhciBsYWJlbHMgPSBjb252ZXJ0W3RoaXMubW9kZWxdLmxhYmVscztcblxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgY2hhbm5lbHM7IGkrKykge1xuXHRcdFx0cmVzdWx0W2xhYmVsc1tpXV0gPSB0aGlzLmNvbG9yW2ldO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLnZhbHBoYSAhPT0gMSkge1xuXHRcdFx0cmVzdWx0LmFscGhhID0gdGhpcy52YWxwaGE7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fSxcblxuXHR1bml0QXJyYXk6IGZ1bmN0aW9uICgpIHtcblx0XHR2YXIgcmdiID0gdGhpcy5yZ2IoKS5jb2xvcjtcblx0XHRyZ2JbMF0gLz0gMjU1O1xuXHRcdHJnYlsxXSAvPSAyNTU7XG5cdFx0cmdiWzJdIC89IDI1NTtcblxuXHRcdGlmICh0aGlzLnZhbHBoYSAhPT0gMSkge1xuXHRcdFx0cmdiLnB1c2godGhpcy52YWxwaGEpO1xuXHRcdH1cblxuXHRcdHJldHVybiByZ2I7XG5cdH0sXG5cblx0dW5pdE9iamVjdDogZnVuY3Rpb24gKCkge1xuXHRcdHZhciByZ2IgPSB0aGlzLnJnYigpLm9iamVjdCgpO1xuXHRcdHJnYi5yIC89IDI1NTtcblx0XHRyZ2IuZyAvPSAyNTU7XG5cdFx0cmdiLmIgLz0gMjU1O1xuXG5cdFx0aWYgKHRoaXMudmFscGhhICE9PSAxKSB7XG5cdFx0XHRyZ2IuYWxwaGEgPSB0aGlzLnZhbHBoYTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmdiO1xuXHR9LFxuXG5cdHJvdW5kOiBmdW5jdGlvbiAocGxhY2VzKSB7XG5cdFx0cGxhY2VzID0gTWF0aC5tYXgocGxhY2VzIHx8IDAsIDApO1xuXHRcdHJldHVybiBuZXcgQ29sb3IodGhpcy5jb2xvci5tYXAocm91bmRUb1BsYWNlKHBsYWNlcykpLmNvbmNhdCh0aGlzLnZhbHBoYSksIHRoaXMubW9kZWwpO1xuXHR9LFxuXG5cdGFscGhhOiBmdW5jdGlvbiAodmFsKSB7XG5cdFx0aWYgKGFyZ3VtZW50cy5sZW5ndGgpIHtcblx0XHRcdHJldHVybiBuZXcgQ29sb3IodGhpcy5jb2xvci5jb25jYXQoTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgdmFsKSkpLCB0aGlzLm1vZGVsKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy52YWxwaGE7XG5cdH0sXG5cblx0Ly8gcmdiXG5cdHJlZDogZ2V0c2V0KCdyZ2InLCAwLCBtYXhmbigyNTUpKSxcblx0Z3JlZW46IGdldHNldCgncmdiJywgMSwgbWF4Zm4oMjU1KSksXG5cdGJsdWU6IGdldHNldCgncmdiJywgMiwgbWF4Zm4oMjU1KSksXG5cblx0aHVlOiBnZXRzZXQoWydoc2wnLCAnaHN2JywgJ2hzbCcsICdod2InLCAnaGNnJ10sIDAsIGZ1bmN0aW9uICh2YWwpIHsgcmV0dXJuICgodmFsICUgMzYwKSArIDM2MCkgJSAzNjA7IH0pLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGJyYWNlLXN0eWxlXG5cblx0c2F0dXJhdGlvbmw6IGdldHNldCgnaHNsJywgMSwgbWF4Zm4oMTAwKSksXG5cdGxpZ2h0bmVzczogZ2V0c2V0KCdoc2wnLCAyLCBtYXhmbigxMDApKSxcblxuXHRzYXR1cmF0aW9udjogZ2V0c2V0KCdoc3YnLCAxLCBtYXhmbigxMDApKSxcblx0dmFsdWU6IGdldHNldCgnaHN2JywgMiwgbWF4Zm4oMTAwKSksXG5cblx0Y2hyb21hOiBnZXRzZXQoJ2hjZycsIDEsIG1heGZuKDEwMCkpLFxuXHRncmF5OiBnZXRzZXQoJ2hjZycsIDIsIG1heGZuKDEwMCkpLFxuXG5cdHdoaXRlOiBnZXRzZXQoJ2h3YicsIDEsIG1heGZuKDEwMCkpLFxuXHR3YmxhY2s6IGdldHNldCgnaHdiJywgMiwgbWF4Zm4oMTAwKSksXG5cblx0Y3lhbjogZ2V0c2V0KCdjbXlrJywgMCwgbWF4Zm4oMTAwKSksXG5cdG1hZ2VudGE6IGdldHNldCgnY215aycsIDEsIG1heGZuKDEwMCkpLFxuXHR5ZWxsb3c6IGdldHNldCgnY215aycsIDIsIG1heGZuKDEwMCkpLFxuXHRibGFjazogZ2V0c2V0KCdjbXlrJywgMywgbWF4Zm4oMTAwKSksXG5cblx0eDogZ2V0c2V0KCd4eXonLCAwLCBtYXhmbigxMDApKSxcblx0eTogZ2V0c2V0KCd4eXonLCAxLCBtYXhmbigxMDApKSxcblx0ejogZ2V0c2V0KCd4eXonLCAyLCBtYXhmbigxMDApKSxcblxuXHRsOiBnZXRzZXQoJ2xhYicsIDAsIG1heGZuKDEwMCkpLFxuXHRhOiBnZXRzZXQoJ2xhYicsIDEpLFxuXHRiOiBnZXRzZXQoJ2xhYicsIDIpLFxuXG5cdGtleXdvcmQ6IGZ1bmN0aW9uICh2YWwpIHtcblx0XHRpZiAoYXJndW1lbnRzLmxlbmd0aCkge1xuXHRcdFx0cmV0dXJuIG5ldyBDb2xvcih2YWwpO1xuXHRcdH1cblxuXHRcdHJldHVybiBjb252ZXJ0W3RoaXMubW9kZWxdLmtleXdvcmQodGhpcy5jb2xvcik7XG5cdH0sXG5cblx0aGV4OiBmdW5jdGlvbiAodmFsKSB7XG5cdFx0aWYgKGFyZ3VtZW50cy5sZW5ndGgpIHtcblx0XHRcdHJldHVybiBuZXcgQ29sb3IodmFsKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gY29sb3JTdHJpbmcudG8uaGV4KHRoaXMucmdiKCkucm91bmQoKS5jb2xvcik7XG5cdH0sXG5cblx0cmdiTnVtYmVyOiBmdW5jdGlvbiAoKSB7XG5cdFx0dmFyIHJnYiA9IHRoaXMucmdiKCkuY29sb3I7XG5cdFx0cmV0dXJuICgocmdiWzBdICYgMHhGRikgPDwgMTYpIHwgKChyZ2JbMV0gJiAweEZGKSA8PCA4KSB8IChyZ2JbMl0gJiAweEZGKTtcblx0fSxcblxuXHRsdW1pbm9zaXR5OiBmdW5jdGlvbiAoKSB7XG5cdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvV0NBRzIwLyNyZWxhdGl2ZWx1bWluYW5jZWRlZlxuXHRcdHZhciByZ2IgPSB0aGlzLnJnYigpLmNvbG9yO1xuXG5cdFx0dmFyIGx1bSA9IFtdO1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgcmdiLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgY2hhbiA9IHJnYltpXSAvIDI1NTtcblx0XHRcdGx1bVtpXSA9IChjaGFuIDw9IDAuMDM5MjgpID8gY2hhbiAvIDEyLjkyIDogTWF0aC5wb3coKChjaGFuICsgMC4wNTUpIC8gMS4wNTUpLCAyLjQpO1xuXHRcdH1cblxuXHRcdHJldHVybiAwLjIxMjYgKiBsdW1bMF0gKyAwLjcxNTIgKiBsdW1bMV0gKyAwLjA3MjIgKiBsdW1bMl07XG5cdH0sXG5cblx0Y29udHJhc3Q6IGZ1bmN0aW9uIChjb2xvcjIpIHtcblx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9XQ0FHMjAvI2NvbnRyYXN0LXJhdGlvZGVmXG5cdFx0dmFyIGx1bTEgPSB0aGlzLmx1bWlub3NpdHkoKTtcblx0XHR2YXIgbHVtMiA9IGNvbG9yMi5sdW1pbm9zaXR5KCk7XG5cblx0XHRpZiAobHVtMSA+IGx1bTIpIHtcblx0XHRcdHJldHVybiAobHVtMSArIDAuMDUpIC8gKGx1bTIgKyAwLjA1KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gKGx1bTIgKyAwLjA1KSAvIChsdW0xICsgMC4wNSk7XG5cdH0sXG5cblx0bGV2ZWw6IGZ1bmN0aW9uIChjb2xvcjIpIHtcblx0XHR2YXIgY29udHJhc3RSYXRpbyA9IHRoaXMuY29udHJhc3QoY29sb3IyKTtcblx0XHRpZiAoY29udHJhc3RSYXRpbyA+PSA3LjEpIHtcblx0XHRcdHJldHVybiAnQUFBJztcblx0XHR9XG5cblx0XHRyZXR1cm4gKGNvbnRyYXN0UmF0aW8gPj0gNC41KSA/ICdBQScgOiAnJztcblx0fSxcblxuXHRpc0Rhcms6IGZ1bmN0aW9uICgpIHtcblx0XHQvLyBZSVEgZXF1YXRpb24gZnJvbSBodHRwOi8vMjR3YXlzLm9yZy8yMDEwL2NhbGN1bGF0aW5nLWNvbG9yLWNvbnRyYXN0XG5cdFx0dmFyIHJnYiA9IHRoaXMucmdiKCkuY29sb3I7XG5cdFx0dmFyIHlpcSA9IChyZ2JbMF0gKiAyOTkgKyByZ2JbMV0gKiA1ODcgKyByZ2JbMl0gKiAxMTQpIC8gMTAwMDtcblx0XHRyZXR1cm4geWlxIDwgMTI4O1xuXHR9LFxuXG5cdGlzTGlnaHQ6IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gIXRoaXMuaXNEYXJrKCk7XG5cdH0sXG5cblx0bmVnYXRlOiBmdW5jdGlvbiAoKSB7XG5cdFx0dmFyIHJnYiA9IHRoaXMucmdiKCk7XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCAzOyBpKyspIHtcblx0XHRcdHJnYi5jb2xvcltpXSA9IDI1NSAtIHJnYi5jb2xvcltpXTtcblx0XHR9XG5cdFx0cmV0dXJuIHJnYjtcblx0fSxcblxuXHRsaWdodGVuOiBmdW5jdGlvbiAocmF0aW8pIHtcblx0XHR2YXIgaHNsID0gdGhpcy5oc2woKTtcblx0XHRoc2wuY29sb3JbMl0gKz0gaHNsLmNvbG9yWzJdICogcmF0aW87XG5cdFx0cmV0dXJuIGhzbDtcblx0fSxcblxuXHRkYXJrZW46IGZ1bmN0aW9uIChyYXRpbykge1xuXHRcdHZhciBoc2wgPSB0aGlzLmhzbCgpO1xuXHRcdGhzbC5jb2xvclsyXSAtPSBoc2wuY29sb3JbMl0gKiByYXRpbztcblx0XHRyZXR1cm4gaHNsO1xuXHR9LFxuXG5cdHNhdHVyYXRlOiBmdW5jdGlvbiAocmF0aW8pIHtcblx0XHR2YXIgaHNsID0gdGhpcy5oc2woKTtcblx0XHRoc2wuY29sb3JbMV0gKz0gaHNsLmNvbG9yWzFdICogcmF0aW87XG5cdFx0cmV0dXJuIGhzbDtcblx0fSxcblxuXHRkZXNhdHVyYXRlOiBmdW5jdGlvbiAocmF0aW8pIHtcblx0XHR2YXIgaHNsID0gdGhpcy5oc2woKTtcblx0XHRoc2wuY29sb3JbMV0gLT0gaHNsLmNvbG9yWzFdICogcmF0aW87XG5cdFx0cmV0dXJuIGhzbDtcblx0fSxcblxuXHR3aGl0ZW46IGZ1bmN0aW9uIChyYXRpbykge1xuXHRcdHZhciBod2IgPSB0aGlzLmh3YigpO1xuXHRcdGh3Yi5jb2xvclsxXSArPSBod2IuY29sb3JbMV0gKiByYXRpbztcblx0XHRyZXR1cm4gaHdiO1xuXHR9LFxuXG5cdGJsYWNrZW46IGZ1bmN0aW9uIChyYXRpbykge1xuXHRcdHZhciBod2IgPSB0aGlzLmh3YigpO1xuXHRcdGh3Yi5jb2xvclsyXSArPSBod2IuY29sb3JbMl0gKiByYXRpbztcblx0XHRyZXR1cm4gaHdiO1xuXHR9LFxuXG5cdGdyYXlzY2FsZTogZnVuY3Rpb24gKCkge1xuXHRcdC8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvR3JheXNjYWxlI0NvbnZlcnRpbmdfY29sb3JfdG9fZ3JheXNjYWxlXG5cdFx0dmFyIHJnYiA9IHRoaXMucmdiKCkuY29sb3I7XG5cdFx0dmFyIHZhbCA9IHJnYlswXSAqIDAuMyArIHJnYlsxXSAqIDAuNTkgKyByZ2JbMl0gKiAwLjExO1xuXHRcdHJldHVybiBDb2xvci5yZ2IodmFsLCB2YWwsIHZhbCk7XG5cdH0sXG5cblx0ZmFkZTogZnVuY3Rpb24gKHJhdGlvKSB7XG5cdFx0cmV0dXJuIHRoaXMuYWxwaGEodGhpcy52YWxwaGEgLSAodGhpcy52YWxwaGEgKiByYXRpbykpO1xuXHR9LFxuXG5cdG9wYXF1ZXI6IGZ1bmN0aW9uIChyYXRpbykge1xuXHRcdHJldHVybiB0aGlzLmFscGhhKHRoaXMudmFscGhhICsgKHRoaXMudmFscGhhICogcmF0aW8pKTtcblx0fSxcblxuXHRyb3RhdGU6IGZ1bmN0aW9uIChkZWdyZWVzKSB7XG5cdFx0dmFyIGhzbCA9IHRoaXMuaHNsKCk7XG5cdFx0dmFyIGh1ZSA9IGhzbC5jb2xvclswXTtcblx0XHRodWUgPSAoaHVlICsgZGVncmVlcykgJSAzNjA7XG5cdFx0aHVlID0gaHVlIDwgMCA/IDM2MCArIGh1ZSA6IGh1ZTtcblx0XHRoc2wuY29sb3JbMF0gPSBodWU7XG5cdFx0cmV0dXJuIGhzbDtcblx0fSxcblxuXHRtaXg6IGZ1bmN0aW9uIChtaXhpbkNvbG9yLCB3ZWlnaHQpIHtcblx0XHQvLyBwb3J0ZWQgZnJvbSBzYXNzIGltcGxlbWVudGF0aW9uIGluIENcblx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vc2Fzcy9saWJzYXNzL2Jsb2IvMGU2YjRhMjg1MDA5MjM1NmFhM2VjZTA3YzZiMjQ5ZjAyMjFjYWNlZC9mdW5jdGlvbnMuY3BwI0wyMDlcblx0XHRpZiAoIW1peGluQ29sb3IgfHwgIW1peGluQ29sb3IucmdiKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0FyZ3VtZW50IHRvIFwibWl4XCIgd2FzIG5vdCBhIENvbG9yIGluc3RhbmNlLCBidXQgcmF0aGVyIGFuIGluc3RhbmNlIG9mICcgKyB0eXBlb2YgbWl4aW5Db2xvcik7XG5cdFx0fVxuXHRcdHZhciBjb2xvcjEgPSBtaXhpbkNvbG9yLnJnYigpO1xuXHRcdHZhciBjb2xvcjIgPSB0aGlzLnJnYigpO1xuXHRcdHZhciBwID0gd2VpZ2h0ID09PSB1bmRlZmluZWQgPyAwLjUgOiB3ZWlnaHQ7XG5cblx0XHR2YXIgdyA9IDIgKiBwIC0gMTtcblx0XHR2YXIgYSA9IGNvbG9yMS5hbHBoYSgpIC0gY29sb3IyLmFscGhhKCk7XG5cblx0XHR2YXIgdzEgPSAoKCh3ICogYSA9PT0gLTEpID8gdyA6ICh3ICsgYSkgLyAoMSArIHcgKiBhKSkgKyAxKSAvIDIuMDtcblx0XHR2YXIgdzIgPSAxIC0gdzE7XG5cblx0XHRyZXR1cm4gQ29sb3IucmdiKFxuXHRcdFx0XHR3MSAqIGNvbG9yMS5yZWQoKSArIHcyICogY29sb3IyLnJlZCgpLFxuXHRcdFx0XHR3MSAqIGNvbG9yMS5ncmVlbigpICsgdzIgKiBjb2xvcjIuZ3JlZW4oKSxcblx0XHRcdFx0dzEgKiBjb2xvcjEuYmx1ZSgpICsgdzIgKiBjb2xvcjIuYmx1ZSgpLFxuXHRcdFx0XHRjb2xvcjEuYWxwaGEoKSAqIHAgKyBjb2xvcjIuYWxwaGEoKSAqICgxIC0gcCkpO1xuXHR9XG59O1xuXG4vLyBtb2RlbCBjb252ZXJzaW9uIG1ldGhvZHMgYW5kIHN0YXRpYyBjb25zdHJ1Y3RvcnNcbk9iamVjdC5rZXlzKGNvbnZlcnQpLmZvckVhY2goZnVuY3Rpb24gKG1vZGVsKSB7XG5cdGlmIChza2lwcGVkTW9kZWxzLmluZGV4T2YobW9kZWwpICE9PSAtMSkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdHZhciBjaGFubmVscyA9IGNvbnZlcnRbbW9kZWxdLmNoYW5uZWxzO1xuXG5cdC8vIGNvbnZlcnNpb24gbWV0aG9kc1xuXHRDb2xvci5wcm90b3R5cGVbbW9kZWxdID0gZnVuY3Rpb24gKCkge1xuXHRcdGlmICh0aGlzLm1vZGVsID09PSBtb2RlbCkge1xuXHRcdFx0cmV0dXJuIG5ldyBDb2xvcih0aGlzKTtcblx0XHR9XG5cblx0XHRpZiAoYXJndW1lbnRzLmxlbmd0aCkge1xuXHRcdFx0cmV0dXJuIG5ldyBDb2xvcihhcmd1bWVudHMsIG1vZGVsKTtcblx0XHR9XG5cblx0XHR2YXIgbmV3QWxwaGEgPSB0eXBlb2YgYXJndW1lbnRzW2NoYW5uZWxzXSA9PT0gJ251bWJlcicgPyBjaGFubmVscyA6IHRoaXMudmFscGhhO1xuXHRcdHJldHVybiBuZXcgQ29sb3IoYXNzZXJ0QXJyYXkoY29udmVydFt0aGlzLm1vZGVsXVttb2RlbF0ucmF3KHRoaXMuY29sb3IpKS5jb25jYXQobmV3QWxwaGEpLCBtb2RlbCk7XG5cdH07XG5cblx0Ly8gJ3N0YXRpYycgY29uc3RydWN0aW9uIG1ldGhvZHNcblx0Q29sb3JbbW9kZWxdID0gZnVuY3Rpb24gKGNvbG9yKSB7XG5cdFx0aWYgKHR5cGVvZiBjb2xvciA9PT0gJ251bWJlcicpIHtcblx0XHRcdGNvbG9yID0gemVyb0FycmF5KF9zbGljZS5jYWxsKGFyZ3VtZW50cyksIGNoYW5uZWxzKTtcblx0XHR9XG5cdFx0cmV0dXJuIG5ldyBDb2xvcihjb2xvciwgbW9kZWwpO1xuXHR9O1xufSk7XG5cbmZ1bmN0aW9uIHJvdW5kVG8obnVtLCBwbGFjZXMpIHtcblx0cmV0dXJuIE51bWJlcihudW0udG9GaXhlZChwbGFjZXMpKTtcbn1cblxuZnVuY3Rpb24gcm91bmRUb1BsYWNlKHBsYWNlcykge1xuXHRyZXR1cm4gZnVuY3Rpb24gKG51bSkge1xuXHRcdHJldHVybiByb3VuZFRvKG51bSwgcGxhY2VzKTtcblx0fTtcbn1cblxuZnVuY3Rpb24gZ2V0c2V0KG1vZGVsLCBjaGFubmVsLCBtb2RpZmllcikge1xuXHRtb2RlbCA9IEFycmF5LmlzQXJyYXkobW9kZWwpID8gbW9kZWwgOiBbbW9kZWxdO1xuXG5cdG1vZGVsLmZvckVhY2goZnVuY3Rpb24gKG0pIHtcblx0XHQobGltaXRlcnNbbV0gfHwgKGxpbWl0ZXJzW21dID0gW10pKVtjaGFubmVsXSA9IG1vZGlmaWVyO1xuXHR9KTtcblxuXHRtb2RlbCA9IG1vZGVsWzBdO1xuXG5cdHJldHVybiBmdW5jdGlvbiAodmFsKSB7XG5cdFx0dmFyIHJlc3VsdDtcblxuXHRcdGlmIChhcmd1bWVudHMubGVuZ3RoKSB7XG5cdFx0XHRpZiAobW9kaWZpZXIpIHtcblx0XHRcdFx0dmFsID0gbW9kaWZpZXIodmFsKTtcblx0XHRcdH1cblxuXHRcdFx0cmVzdWx0ID0gdGhpc1ttb2RlbF0oKTtcblx0XHRcdHJlc3VsdC5jb2xvcltjaGFubmVsXSA9IHZhbDtcblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fVxuXG5cdFx0cmVzdWx0ID0gdGhpc1ttb2RlbF0oKS5jb2xvcltjaGFubmVsXTtcblx0XHRpZiAobW9kaWZpZXIpIHtcblx0XHRcdHJlc3VsdCA9IG1vZGlmaWVyKHJlc3VsdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fTtcbn1cblxuZnVuY3Rpb24gbWF4Zm4obWF4KSB7XG5cdHJldHVybiBmdW5jdGlvbiAodikge1xuXHRcdHJldHVybiBNYXRoLm1heCgwLCBNYXRoLm1pbihtYXgsIHYpKTtcblx0fTtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0QXJyYXkodmFsKSB7XG5cdHJldHVybiBBcnJheS5pc0FycmF5KHZhbCkgPyB2YWwgOiBbdmFsXTtcbn1cblxuZnVuY3Rpb24gemVyb0FycmF5KGFyciwgbGVuZ3RoKSB7XG5cdGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcblx0XHRpZiAodHlwZW9mIGFycltpXSAhPT0gJ251bWJlcicpIHtcblx0XHRcdGFycltpXSA9IDA7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGFycjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBDb2xvcjtcbiIsIi8qIE1JVCBsaWNlbnNlICovXG52YXIgY3NzS2V5d29yZHMgPSByZXF1aXJlKCdjb2xvci1uYW1lJyk7XG5cbi8vIE5PVEU6IGNvbnZlcnNpb25zIHNob3VsZCBvbmx5IHJldHVybiBwcmltaXRpdmUgdmFsdWVzIChpLmUuIGFycmF5cywgb3Jcbi8vICAgICAgIHZhbHVlcyB0aGF0IGdpdmUgY29ycmVjdCBgdHlwZW9mYCByZXN1bHRzKS5cbi8vICAgICAgIGRvIG5vdCB1c2UgYm94IHZhbHVlcyB0eXBlcyAoaS5lLiBOdW1iZXIoKSwgU3RyaW5nKCksIGV0Yy4pXG5cbnZhciByZXZlcnNlS2V5d29yZHMgPSB7fTtcbmZvciAodmFyIGtleSBpbiBjc3NLZXl3b3Jkcykge1xuXHRpZiAoY3NzS2V5d29yZHMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuXHRcdHJldmVyc2VLZXl3b3Jkc1tjc3NLZXl3b3Jkc1trZXldXSA9IGtleTtcblx0fVxufVxuXG52YXIgY29udmVydCA9IG1vZHVsZS5leHBvcnRzID0ge1xuXHRyZ2I6IHtjaGFubmVsczogMywgbGFiZWxzOiAncmdiJ30sXG5cdGhzbDoge2NoYW5uZWxzOiAzLCBsYWJlbHM6ICdoc2wnfSxcblx0aHN2OiB7Y2hhbm5lbHM6IDMsIGxhYmVsczogJ2hzdid9LFxuXHRod2I6IHtjaGFubmVsczogMywgbGFiZWxzOiAnaHdiJ30sXG5cdGNteWs6IHtjaGFubmVsczogNCwgbGFiZWxzOiAnY215ayd9LFxuXHR4eXo6IHtjaGFubmVsczogMywgbGFiZWxzOiAneHl6J30sXG5cdGxhYjoge2NoYW5uZWxzOiAzLCBsYWJlbHM6ICdsYWInfSxcblx0bGNoOiB7Y2hhbm5lbHM6IDMsIGxhYmVsczogJ2xjaCd9LFxuXHRoZXg6IHtjaGFubmVsczogMSwgbGFiZWxzOiBbJ2hleCddfSxcblx0a2V5d29yZDoge2NoYW5uZWxzOiAxLCBsYWJlbHM6IFsna2V5d29yZCddfSxcblx0YW5zaTE2OiB7Y2hhbm5lbHM6IDEsIGxhYmVsczogWydhbnNpMTYnXX0sXG5cdGFuc2kyNTY6IHtjaGFubmVsczogMSwgbGFiZWxzOiBbJ2Fuc2kyNTYnXX0sXG5cdGhjZzoge2NoYW5uZWxzOiAzLCBsYWJlbHM6IFsnaCcsICdjJywgJ2cnXX0sXG5cdGFwcGxlOiB7Y2hhbm5lbHM6IDMsIGxhYmVsczogWydyMTYnLCAnZzE2JywgJ2IxNiddfSxcblx0Z3JheToge2NoYW5uZWxzOiAxLCBsYWJlbHM6IFsnZ3JheSddfVxufTtcblxuLy8gaGlkZSAuY2hhbm5lbHMgYW5kIC5sYWJlbHMgcHJvcGVydGllc1xuZm9yICh2YXIgbW9kZWwgaW4gY29udmVydCkge1xuXHRpZiAoY29udmVydC5oYXNPd25Qcm9wZXJ0eShtb2RlbCkpIHtcblx0XHRpZiAoISgnY2hhbm5lbHMnIGluIGNvbnZlcnRbbW9kZWxdKSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIGNoYW5uZWxzIHByb3BlcnR5OiAnICsgbW9kZWwpO1xuXHRcdH1cblxuXHRcdGlmICghKCdsYWJlbHMnIGluIGNvbnZlcnRbbW9kZWxdKSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIGNoYW5uZWwgbGFiZWxzIHByb3BlcnR5OiAnICsgbW9kZWwpO1xuXHRcdH1cblxuXHRcdGlmIChjb252ZXJ0W21vZGVsXS5sYWJlbHMubGVuZ3RoICE9PSBjb252ZXJ0W21vZGVsXS5jaGFubmVscykge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdjaGFubmVsIGFuZCBsYWJlbCBjb3VudHMgbWlzbWF0Y2g6ICcgKyBtb2RlbCk7XG5cdFx0fVxuXG5cdFx0dmFyIGNoYW5uZWxzID0gY29udmVydFttb2RlbF0uY2hhbm5lbHM7XG5cdFx0dmFyIGxhYmVscyA9IGNvbnZlcnRbbW9kZWxdLmxhYmVscztcblx0XHRkZWxldGUgY29udmVydFttb2RlbF0uY2hhbm5lbHM7XG5cdFx0ZGVsZXRlIGNvbnZlcnRbbW9kZWxdLmxhYmVscztcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udmVydFttb2RlbF0sICdjaGFubmVscycsIHt2YWx1ZTogY2hhbm5lbHN9KTtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udmVydFttb2RlbF0sICdsYWJlbHMnLCB7dmFsdWU6IGxhYmVsc30pO1xuXHR9XG59XG5cbmNvbnZlcnQucmdiLmhzbCA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0dmFyIHIgPSByZ2JbMF0gLyAyNTU7XG5cdHZhciBnID0gcmdiWzFdIC8gMjU1O1xuXHR2YXIgYiA9IHJnYlsyXSAvIDI1NTtcblx0dmFyIG1pbiA9IE1hdGgubWluKHIsIGcsIGIpO1xuXHR2YXIgbWF4ID0gTWF0aC5tYXgociwgZywgYik7XG5cdHZhciBkZWx0YSA9IG1heCAtIG1pbjtcblx0dmFyIGg7XG5cdHZhciBzO1xuXHR2YXIgbDtcblxuXHRpZiAobWF4ID09PSBtaW4pIHtcblx0XHRoID0gMDtcblx0fSBlbHNlIGlmIChyID09PSBtYXgpIHtcblx0XHRoID0gKGcgLSBiKSAvIGRlbHRhO1xuXHR9IGVsc2UgaWYgKGcgPT09IG1heCkge1xuXHRcdGggPSAyICsgKGIgLSByKSAvIGRlbHRhO1xuXHR9IGVsc2UgaWYgKGIgPT09IG1heCkge1xuXHRcdGggPSA0ICsgKHIgLSBnKSAvIGRlbHRhO1xuXHR9XG5cblx0aCA9IE1hdGgubWluKGggKiA2MCwgMzYwKTtcblxuXHRpZiAoaCA8IDApIHtcblx0XHRoICs9IDM2MDtcblx0fVxuXG5cdGwgPSAobWluICsgbWF4KSAvIDI7XG5cblx0aWYgKG1heCA9PT0gbWluKSB7XG5cdFx0cyA9IDA7XG5cdH0gZWxzZSBpZiAobCA8PSAwLjUpIHtcblx0XHRzID0gZGVsdGEgLyAobWF4ICsgbWluKTtcblx0fSBlbHNlIHtcblx0XHRzID0gZGVsdGEgLyAoMiAtIG1heCAtIG1pbik7XG5cdH1cblxuXHRyZXR1cm4gW2gsIHMgKiAxMDAsIGwgKiAxMDBdO1xufTtcblxuY29udmVydC5yZ2IuaHN2ID0gZnVuY3Rpb24gKHJnYikge1xuXHR2YXIgcmRpZjtcblx0dmFyIGdkaWY7XG5cdHZhciBiZGlmO1xuXHR2YXIgaDtcblx0dmFyIHM7XG5cblx0dmFyIHIgPSByZ2JbMF0gLyAyNTU7XG5cdHZhciBnID0gcmdiWzFdIC8gMjU1O1xuXHR2YXIgYiA9IHJnYlsyXSAvIDI1NTtcblx0dmFyIHYgPSBNYXRoLm1heChyLCBnLCBiKTtcblx0dmFyIGRpZmYgPSB2IC0gTWF0aC5taW4ociwgZywgYik7XG5cdHZhciBkaWZmYyA9IGZ1bmN0aW9uIChjKSB7XG5cdFx0cmV0dXJuICh2IC0gYykgLyA2IC8gZGlmZiArIDEgLyAyO1xuXHR9O1xuXG5cdGlmIChkaWZmID09PSAwKSB7XG5cdFx0aCA9IHMgPSAwO1xuXHR9IGVsc2Uge1xuXHRcdHMgPSBkaWZmIC8gdjtcblx0XHRyZGlmID0gZGlmZmMocik7XG5cdFx0Z2RpZiA9IGRpZmZjKGcpO1xuXHRcdGJkaWYgPSBkaWZmYyhiKTtcblxuXHRcdGlmIChyID09PSB2KSB7XG5cdFx0XHRoID0gYmRpZiAtIGdkaWY7XG5cdFx0fSBlbHNlIGlmIChnID09PSB2KSB7XG5cdFx0XHRoID0gKDEgLyAzKSArIHJkaWYgLSBiZGlmO1xuXHRcdH0gZWxzZSBpZiAoYiA9PT0gdikge1xuXHRcdFx0aCA9ICgyIC8gMykgKyBnZGlmIC0gcmRpZjtcblx0XHR9XG5cdFx0aWYgKGggPCAwKSB7XG5cdFx0XHRoICs9IDE7XG5cdFx0fSBlbHNlIGlmIChoID4gMSkge1xuXHRcdFx0aCAtPSAxO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBbXG5cdFx0aCAqIDM2MCxcblx0XHRzICogMTAwLFxuXHRcdHYgKiAxMDBcblx0XTtcbn07XG5cbmNvbnZlcnQucmdiLmh3YiA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0dmFyIHIgPSByZ2JbMF07XG5cdHZhciBnID0gcmdiWzFdO1xuXHR2YXIgYiA9IHJnYlsyXTtcblx0dmFyIGggPSBjb252ZXJ0LnJnYi5oc2wocmdiKVswXTtcblx0dmFyIHcgPSAxIC8gMjU1ICogTWF0aC5taW4ociwgTWF0aC5taW4oZywgYikpO1xuXG5cdGIgPSAxIC0gMSAvIDI1NSAqIE1hdGgubWF4KHIsIE1hdGgubWF4KGcsIGIpKTtcblxuXHRyZXR1cm4gW2gsIHcgKiAxMDAsIGIgKiAxMDBdO1xufTtcblxuY29udmVydC5yZ2IuY215ayA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0dmFyIHIgPSByZ2JbMF0gLyAyNTU7XG5cdHZhciBnID0gcmdiWzFdIC8gMjU1O1xuXHR2YXIgYiA9IHJnYlsyXSAvIDI1NTtcblx0dmFyIGM7XG5cdHZhciBtO1xuXHR2YXIgeTtcblx0dmFyIGs7XG5cblx0ayA9IE1hdGgubWluKDEgLSByLCAxIC0gZywgMSAtIGIpO1xuXHRjID0gKDEgLSByIC0gaykgLyAoMSAtIGspIHx8IDA7XG5cdG0gPSAoMSAtIGcgLSBrKSAvICgxIC0gaykgfHwgMDtcblx0eSA9ICgxIC0gYiAtIGspIC8gKDEgLSBrKSB8fCAwO1xuXG5cdHJldHVybiBbYyAqIDEwMCwgbSAqIDEwMCwgeSAqIDEwMCwgayAqIDEwMF07XG59O1xuXG4vKipcbiAqIFNlZSBodHRwczovL2VuLm0ud2lraXBlZGlhLm9yZy93aWtpL0V1Y2xpZGVhbl9kaXN0YW5jZSNTcXVhcmVkX0V1Y2xpZGVhbl9kaXN0YW5jZVxuICogKi9cbmZ1bmN0aW9uIGNvbXBhcmF0aXZlRGlzdGFuY2UoeCwgeSkge1xuXHRyZXR1cm4gKFxuXHRcdE1hdGgucG93KHhbMF0gLSB5WzBdLCAyKSArXG5cdFx0TWF0aC5wb3coeFsxXSAtIHlbMV0sIDIpICtcblx0XHRNYXRoLnBvdyh4WzJdIC0geVsyXSwgMilcblx0KTtcbn1cblxuY29udmVydC5yZ2Iua2V5d29yZCA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0dmFyIHJldmVyc2VkID0gcmV2ZXJzZUtleXdvcmRzW3JnYl07XG5cdGlmIChyZXZlcnNlZCkge1xuXHRcdHJldHVybiByZXZlcnNlZDtcblx0fVxuXG5cdHZhciBjdXJyZW50Q2xvc2VzdERpc3RhbmNlID0gSW5maW5pdHk7XG5cdHZhciBjdXJyZW50Q2xvc2VzdEtleXdvcmQ7XG5cblx0Zm9yICh2YXIga2V5d29yZCBpbiBjc3NLZXl3b3Jkcykge1xuXHRcdGlmIChjc3NLZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eShrZXl3b3JkKSkge1xuXHRcdFx0dmFyIHZhbHVlID0gY3NzS2V5d29yZHNba2V5d29yZF07XG5cblx0XHRcdC8vIENvbXB1dGUgY29tcGFyYXRpdmUgZGlzdGFuY2Vcblx0XHRcdHZhciBkaXN0YW5jZSA9IGNvbXBhcmF0aXZlRGlzdGFuY2UocmdiLCB2YWx1ZSk7XG5cblx0XHRcdC8vIENoZWNrIGlmIGl0cyBsZXNzLCBpZiBzbyBzZXQgYXMgY2xvc2VzdFxuXHRcdFx0aWYgKGRpc3RhbmNlIDwgY3VycmVudENsb3Nlc3REaXN0YW5jZSkge1xuXHRcdFx0XHRjdXJyZW50Q2xvc2VzdERpc3RhbmNlID0gZGlzdGFuY2U7XG5cdFx0XHRcdGN1cnJlbnRDbG9zZXN0S2V5d29yZCA9IGtleXdvcmQ7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGN1cnJlbnRDbG9zZXN0S2V5d29yZDtcbn07XG5cbmNvbnZlcnQua2V5d29yZC5yZ2IgPSBmdW5jdGlvbiAoa2V5d29yZCkge1xuXHRyZXR1cm4gY3NzS2V5d29yZHNba2V5d29yZF07XG59O1xuXG5jb252ZXJ0LnJnYi54eXogPSBmdW5jdGlvbiAocmdiKSB7XG5cdHZhciByID0gcmdiWzBdIC8gMjU1O1xuXHR2YXIgZyA9IHJnYlsxXSAvIDI1NTtcblx0dmFyIGIgPSByZ2JbMl0gLyAyNTU7XG5cblx0Ly8gYXNzdW1lIHNSR0Jcblx0ciA9IHIgPiAwLjA0MDQ1ID8gTWF0aC5wb3coKChyICsgMC4wNTUpIC8gMS4wNTUpLCAyLjQpIDogKHIgLyAxMi45Mik7XG5cdGcgPSBnID4gMC4wNDA0NSA/IE1hdGgucG93KCgoZyArIDAuMDU1KSAvIDEuMDU1KSwgMi40KSA6IChnIC8gMTIuOTIpO1xuXHRiID0gYiA+IDAuMDQwNDUgPyBNYXRoLnBvdygoKGIgKyAwLjA1NSkgLyAxLjA1NSksIDIuNCkgOiAoYiAvIDEyLjkyKTtcblxuXHR2YXIgeCA9IChyICogMC40MTI0KSArIChnICogMC4zNTc2KSArIChiICogMC4xODA1KTtcblx0dmFyIHkgPSAociAqIDAuMjEyNikgKyAoZyAqIDAuNzE1MikgKyAoYiAqIDAuMDcyMik7XG5cdHZhciB6ID0gKHIgKiAwLjAxOTMpICsgKGcgKiAwLjExOTIpICsgKGIgKiAwLjk1MDUpO1xuXG5cdHJldHVybiBbeCAqIDEwMCwgeSAqIDEwMCwgeiAqIDEwMF07XG59O1xuXG5jb252ZXJ0LnJnYi5sYWIgPSBmdW5jdGlvbiAocmdiKSB7XG5cdHZhciB4eXogPSBjb252ZXJ0LnJnYi54eXoocmdiKTtcblx0dmFyIHggPSB4eXpbMF07XG5cdHZhciB5ID0geHl6WzFdO1xuXHR2YXIgeiA9IHh5elsyXTtcblx0dmFyIGw7XG5cdHZhciBhO1xuXHR2YXIgYjtcblxuXHR4IC89IDk1LjA0Nztcblx0eSAvPSAxMDA7XG5cdHogLz0gMTA4Ljg4MztcblxuXHR4ID0geCA+IDAuMDA4ODU2ID8gTWF0aC5wb3coeCwgMSAvIDMpIDogKDcuNzg3ICogeCkgKyAoMTYgLyAxMTYpO1xuXHR5ID0geSA+IDAuMDA4ODU2ID8gTWF0aC5wb3coeSwgMSAvIDMpIDogKDcuNzg3ICogeSkgKyAoMTYgLyAxMTYpO1xuXHR6ID0geiA+IDAuMDA4ODU2ID8gTWF0aC5wb3coeiwgMSAvIDMpIDogKDcuNzg3ICogeikgKyAoMTYgLyAxMTYpO1xuXG5cdGwgPSAoMTE2ICogeSkgLSAxNjtcblx0YSA9IDUwMCAqICh4IC0geSk7XG5cdGIgPSAyMDAgKiAoeSAtIHopO1xuXG5cdHJldHVybiBbbCwgYSwgYl07XG59O1xuXG5jb252ZXJ0LmhzbC5yZ2IgPSBmdW5jdGlvbiAoaHNsKSB7XG5cdHZhciBoID0gaHNsWzBdIC8gMzYwO1xuXHR2YXIgcyA9IGhzbFsxXSAvIDEwMDtcblx0dmFyIGwgPSBoc2xbMl0gLyAxMDA7XG5cdHZhciB0MTtcblx0dmFyIHQyO1xuXHR2YXIgdDM7XG5cdHZhciByZ2I7XG5cdHZhciB2YWw7XG5cblx0aWYgKHMgPT09IDApIHtcblx0XHR2YWwgPSBsICogMjU1O1xuXHRcdHJldHVybiBbdmFsLCB2YWwsIHZhbF07XG5cdH1cblxuXHRpZiAobCA8IDAuNSkge1xuXHRcdHQyID0gbCAqICgxICsgcyk7XG5cdH0gZWxzZSB7XG5cdFx0dDIgPSBsICsgcyAtIGwgKiBzO1xuXHR9XG5cblx0dDEgPSAyICogbCAtIHQyO1xuXG5cdHJnYiA9IFswLCAwLCAwXTtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCAzOyBpKyspIHtcblx0XHR0MyA9IGggKyAxIC8gMyAqIC0oaSAtIDEpO1xuXHRcdGlmICh0MyA8IDApIHtcblx0XHRcdHQzKys7XG5cdFx0fVxuXHRcdGlmICh0MyA+IDEpIHtcblx0XHRcdHQzLS07XG5cdFx0fVxuXG5cdFx0aWYgKDYgKiB0MyA8IDEpIHtcblx0XHRcdHZhbCA9IHQxICsgKHQyIC0gdDEpICogNiAqIHQzO1xuXHRcdH0gZWxzZSBpZiAoMiAqIHQzIDwgMSkge1xuXHRcdFx0dmFsID0gdDI7XG5cdFx0fSBlbHNlIGlmICgzICogdDMgPCAyKSB7XG5cdFx0XHR2YWwgPSB0MSArICh0MiAtIHQxKSAqICgyIC8gMyAtIHQzKSAqIDY7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHZhbCA9IHQxO1xuXHRcdH1cblxuXHRcdHJnYltpXSA9IHZhbCAqIDI1NTtcblx0fVxuXG5cdHJldHVybiByZ2I7XG59O1xuXG5jb252ZXJ0LmhzbC5oc3YgPSBmdW5jdGlvbiAoaHNsKSB7XG5cdHZhciBoID0gaHNsWzBdO1xuXHR2YXIgcyA9IGhzbFsxXSAvIDEwMDtcblx0dmFyIGwgPSBoc2xbMl0gLyAxMDA7XG5cdHZhciBzbWluID0gcztcblx0dmFyIGxtaW4gPSBNYXRoLm1heChsLCAwLjAxKTtcblx0dmFyIHN2O1xuXHR2YXIgdjtcblxuXHRsICo9IDI7XG5cdHMgKj0gKGwgPD0gMSkgPyBsIDogMiAtIGw7XG5cdHNtaW4gKj0gbG1pbiA8PSAxID8gbG1pbiA6IDIgLSBsbWluO1xuXHR2ID0gKGwgKyBzKSAvIDI7XG5cdHN2ID0gbCA9PT0gMCA/ICgyICogc21pbikgLyAobG1pbiArIHNtaW4pIDogKDIgKiBzKSAvIChsICsgcyk7XG5cblx0cmV0dXJuIFtoLCBzdiAqIDEwMCwgdiAqIDEwMF07XG59O1xuXG5jb252ZXJ0Lmhzdi5yZ2IgPSBmdW5jdGlvbiAoaHN2KSB7XG5cdHZhciBoID0gaHN2WzBdIC8gNjA7XG5cdHZhciBzID0gaHN2WzFdIC8gMTAwO1xuXHR2YXIgdiA9IGhzdlsyXSAvIDEwMDtcblx0dmFyIGhpID0gTWF0aC5mbG9vcihoKSAlIDY7XG5cblx0dmFyIGYgPSBoIC0gTWF0aC5mbG9vcihoKTtcblx0dmFyIHAgPSAyNTUgKiB2ICogKDEgLSBzKTtcblx0dmFyIHEgPSAyNTUgKiB2ICogKDEgLSAocyAqIGYpKTtcblx0dmFyIHQgPSAyNTUgKiB2ICogKDEgLSAocyAqICgxIC0gZikpKTtcblx0diAqPSAyNTU7XG5cblx0c3dpdGNoIChoaSkge1xuXHRcdGNhc2UgMDpcblx0XHRcdHJldHVybiBbdiwgdCwgcF07XG5cdFx0Y2FzZSAxOlxuXHRcdFx0cmV0dXJuIFtxLCB2LCBwXTtcblx0XHRjYXNlIDI6XG5cdFx0XHRyZXR1cm4gW3AsIHYsIHRdO1xuXHRcdGNhc2UgMzpcblx0XHRcdHJldHVybiBbcCwgcSwgdl07XG5cdFx0Y2FzZSA0OlxuXHRcdFx0cmV0dXJuIFt0LCBwLCB2XTtcblx0XHRjYXNlIDU6XG5cdFx0XHRyZXR1cm4gW3YsIHAsIHFdO1xuXHR9XG59O1xuXG5jb252ZXJ0Lmhzdi5oc2wgPSBmdW5jdGlvbiAoaHN2KSB7XG5cdHZhciBoID0gaHN2WzBdO1xuXHR2YXIgcyA9IGhzdlsxXSAvIDEwMDtcblx0dmFyIHYgPSBoc3ZbMl0gLyAxMDA7XG5cdHZhciB2bWluID0gTWF0aC5tYXgodiwgMC4wMSk7XG5cdHZhciBsbWluO1xuXHR2YXIgc2w7XG5cdHZhciBsO1xuXG5cdGwgPSAoMiAtIHMpICogdjtcblx0bG1pbiA9ICgyIC0gcykgKiB2bWluO1xuXHRzbCA9IHMgKiB2bWluO1xuXHRzbCAvPSAobG1pbiA8PSAxKSA/IGxtaW4gOiAyIC0gbG1pbjtcblx0c2wgPSBzbCB8fCAwO1xuXHRsIC89IDI7XG5cblx0cmV0dXJuIFtoLCBzbCAqIDEwMCwgbCAqIDEwMF07XG59O1xuXG4vLyBodHRwOi8vZGV2LnczLm9yZy9jc3N3Zy9jc3MtY29sb3IvI2h3Yi10by1yZ2JcbmNvbnZlcnQuaHdiLnJnYiA9IGZ1bmN0aW9uIChod2IpIHtcblx0dmFyIGggPSBod2JbMF0gLyAzNjA7XG5cdHZhciB3aCA9IGh3YlsxXSAvIDEwMDtcblx0dmFyIGJsID0gaHdiWzJdIC8gMTAwO1xuXHR2YXIgcmF0aW8gPSB3aCArIGJsO1xuXHR2YXIgaTtcblx0dmFyIHY7XG5cdHZhciBmO1xuXHR2YXIgbjtcblxuXHQvLyB3aCArIGJsIGNhbnQgYmUgPiAxXG5cdGlmIChyYXRpbyA+IDEpIHtcblx0XHR3aCAvPSByYXRpbztcblx0XHRibCAvPSByYXRpbztcblx0fVxuXG5cdGkgPSBNYXRoLmZsb29yKDYgKiBoKTtcblx0diA9IDEgLSBibDtcblx0ZiA9IDYgKiBoIC0gaTtcblxuXHRpZiAoKGkgJiAweDAxKSAhPT0gMCkge1xuXHRcdGYgPSAxIC0gZjtcblx0fVxuXG5cdG4gPSB3aCArIGYgKiAodiAtIHdoKTsgLy8gbGluZWFyIGludGVycG9sYXRpb25cblxuXHR2YXIgcjtcblx0dmFyIGc7XG5cdHZhciBiO1xuXHRzd2l0Y2ggKGkpIHtcblx0XHRkZWZhdWx0OlxuXHRcdGNhc2UgNjpcblx0XHRjYXNlIDA6IHIgPSB2OyBnID0gbjsgYiA9IHdoOyBicmVhaztcblx0XHRjYXNlIDE6IHIgPSBuOyBnID0gdjsgYiA9IHdoOyBicmVhaztcblx0XHRjYXNlIDI6IHIgPSB3aDsgZyA9IHY7IGIgPSBuOyBicmVhaztcblx0XHRjYXNlIDM6IHIgPSB3aDsgZyA9IG47IGIgPSB2OyBicmVhaztcblx0XHRjYXNlIDQ6IHIgPSBuOyBnID0gd2g7IGIgPSB2OyBicmVhaztcblx0XHRjYXNlIDU6IHIgPSB2OyBnID0gd2g7IGIgPSBuOyBicmVhaztcblx0fVxuXG5cdHJldHVybiBbciAqIDI1NSwgZyAqIDI1NSwgYiAqIDI1NV07XG59O1xuXG5jb252ZXJ0LmNteWsucmdiID0gZnVuY3Rpb24gKGNteWspIHtcblx0dmFyIGMgPSBjbXlrWzBdIC8gMTAwO1xuXHR2YXIgbSA9IGNteWtbMV0gLyAxMDA7XG5cdHZhciB5ID0gY215a1syXSAvIDEwMDtcblx0dmFyIGsgPSBjbXlrWzNdIC8gMTAwO1xuXHR2YXIgcjtcblx0dmFyIGc7XG5cdHZhciBiO1xuXG5cdHIgPSAxIC0gTWF0aC5taW4oMSwgYyAqICgxIC0gaykgKyBrKTtcblx0ZyA9IDEgLSBNYXRoLm1pbigxLCBtICogKDEgLSBrKSArIGspO1xuXHRiID0gMSAtIE1hdGgubWluKDEsIHkgKiAoMSAtIGspICsgayk7XG5cblx0cmV0dXJuIFtyICogMjU1LCBnICogMjU1LCBiICogMjU1XTtcbn07XG5cbmNvbnZlcnQueHl6LnJnYiA9IGZ1bmN0aW9uICh4eXopIHtcblx0dmFyIHggPSB4eXpbMF0gLyAxMDA7XG5cdHZhciB5ID0geHl6WzFdIC8gMTAwO1xuXHR2YXIgeiA9IHh5elsyXSAvIDEwMDtcblx0dmFyIHI7XG5cdHZhciBnO1xuXHR2YXIgYjtcblxuXHRyID0gKHggKiAzLjI0MDYpICsgKHkgKiAtMS41MzcyKSArICh6ICogLTAuNDk4Nik7XG5cdGcgPSAoeCAqIC0wLjk2ODkpICsgKHkgKiAxLjg3NTgpICsgKHogKiAwLjA0MTUpO1xuXHRiID0gKHggKiAwLjA1NTcpICsgKHkgKiAtMC4yMDQwKSArICh6ICogMS4wNTcwKTtcblxuXHQvLyBhc3N1bWUgc1JHQlxuXHRyID0gciA+IDAuMDAzMTMwOFxuXHRcdD8gKCgxLjA1NSAqIE1hdGgucG93KHIsIDEuMCAvIDIuNCkpIC0gMC4wNTUpXG5cdFx0OiByICogMTIuOTI7XG5cblx0ZyA9IGcgPiAwLjAwMzEzMDhcblx0XHQ/ICgoMS4wNTUgKiBNYXRoLnBvdyhnLCAxLjAgLyAyLjQpKSAtIDAuMDU1KVxuXHRcdDogZyAqIDEyLjkyO1xuXG5cdGIgPSBiID4gMC4wMDMxMzA4XG5cdFx0PyAoKDEuMDU1ICogTWF0aC5wb3coYiwgMS4wIC8gMi40KSkgLSAwLjA1NSlcblx0XHQ6IGIgKiAxMi45MjtcblxuXHRyID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgciksIDEpO1xuXHRnID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgZyksIDEpO1xuXHRiID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgYiksIDEpO1xuXG5cdHJldHVybiBbciAqIDI1NSwgZyAqIDI1NSwgYiAqIDI1NV07XG59O1xuXG5jb252ZXJ0Lnh5ei5sYWIgPSBmdW5jdGlvbiAoeHl6KSB7XG5cdHZhciB4ID0geHl6WzBdO1xuXHR2YXIgeSA9IHh5elsxXTtcblx0dmFyIHogPSB4eXpbMl07XG5cdHZhciBsO1xuXHR2YXIgYTtcblx0dmFyIGI7XG5cblx0eCAvPSA5NS4wNDc7XG5cdHkgLz0gMTAwO1xuXHR6IC89IDEwOC44ODM7XG5cblx0eCA9IHggPiAwLjAwODg1NiA/IE1hdGgucG93KHgsIDEgLyAzKSA6ICg3Ljc4NyAqIHgpICsgKDE2IC8gMTE2KTtcblx0eSA9IHkgPiAwLjAwODg1NiA/IE1hdGgucG93KHksIDEgLyAzKSA6ICg3Ljc4NyAqIHkpICsgKDE2IC8gMTE2KTtcblx0eiA9IHogPiAwLjAwODg1NiA/IE1hdGgucG93KHosIDEgLyAzKSA6ICg3Ljc4NyAqIHopICsgKDE2IC8gMTE2KTtcblxuXHRsID0gKDExNiAqIHkpIC0gMTY7XG5cdGEgPSA1MDAgKiAoeCAtIHkpO1xuXHRiID0gMjAwICogKHkgLSB6KTtcblxuXHRyZXR1cm4gW2wsIGEsIGJdO1xufTtcblxuY29udmVydC5sYWIueHl6ID0gZnVuY3Rpb24gKGxhYikge1xuXHR2YXIgbCA9IGxhYlswXTtcblx0dmFyIGEgPSBsYWJbMV07XG5cdHZhciBiID0gbGFiWzJdO1xuXHR2YXIgeDtcblx0dmFyIHk7XG5cdHZhciB6O1xuXG5cdHkgPSAobCArIDE2KSAvIDExNjtcblx0eCA9IGEgLyA1MDAgKyB5O1xuXHR6ID0geSAtIGIgLyAyMDA7XG5cblx0dmFyIHkyID0gTWF0aC5wb3coeSwgMyk7XG5cdHZhciB4MiA9IE1hdGgucG93KHgsIDMpO1xuXHR2YXIgejIgPSBNYXRoLnBvdyh6LCAzKTtcblx0eSA9IHkyID4gMC4wMDg4NTYgPyB5MiA6ICh5IC0gMTYgLyAxMTYpIC8gNy43ODc7XG5cdHggPSB4MiA+IDAuMDA4ODU2ID8geDIgOiAoeCAtIDE2IC8gMTE2KSAvIDcuNzg3O1xuXHR6ID0gejIgPiAwLjAwODg1NiA/IHoyIDogKHogLSAxNiAvIDExNikgLyA3Ljc4NztcblxuXHR4ICo9IDk1LjA0Nztcblx0eSAqPSAxMDA7XG5cdHogKj0gMTA4Ljg4MztcblxuXHRyZXR1cm4gW3gsIHksIHpdO1xufTtcblxuY29udmVydC5sYWIubGNoID0gZnVuY3Rpb24gKGxhYikge1xuXHR2YXIgbCA9IGxhYlswXTtcblx0dmFyIGEgPSBsYWJbMV07XG5cdHZhciBiID0gbGFiWzJdO1xuXHR2YXIgaHI7XG5cdHZhciBoO1xuXHR2YXIgYztcblxuXHRociA9IE1hdGguYXRhbjIoYiwgYSk7XG5cdGggPSBociAqIDM2MCAvIDIgLyBNYXRoLlBJO1xuXG5cdGlmIChoIDwgMCkge1xuXHRcdGggKz0gMzYwO1xuXHR9XG5cblx0YyA9IE1hdGguc3FydChhICogYSArIGIgKiBiKTtcblxuXHRyZXR1cm4gW2wsIGMsIGhdO1xufTtcblxuY29udmVydC5sY2gubGFiID0gZnVuY3Rpb24gKGxjaCkge1xuXHR2YXIgbCA9IGxjaFswXTtcblx0dmFyIGMgPSBsY2hbMV07XG5cdHZhciBoID0gbGNoWzJdO1xuXHR2YXIgYTtcblx0dmFyIGI7XG5cdHZhciBocjtcblxuXHRociA9IGggLyAzNjAgKiAyICogTWF0aC5QSTtcblx0YSA9IGMgKiBNYXRoLmNvcyhocik7XG5cdGIgPSBjICogTWF0aC5zaW4oaHIpO1xuXG5cdHJldHVybiBbbCwgYSwgYl07XG59O1xuXG5jb252ZXJ0LnJnYi5hbnNpMTYgPSBmdW5jdGlvbiAoYXJncykge1xuXHR2YXIgciA9IGFyZ3NbMF07XG5cdHZhciBnID0gYXJnc1sxXTtcblx0dmFyIGIgPSBhcmdzWzJdO1xuXHR2YXIgdmFsdWUgPSAxIGluIGFyZ3VtZW50cyA/IGFyZ3VtZW50c1sxXSA6IGNvbnZlcnQucmdiLmhzdihhcmdzKVsyXTsgLy8gaHN2IC0+IGFuc2kxNiBvcHRpbWl6YXRpb25cblxuXHR2YWx1ZSA9IE1hdGgucm91bmQodmFsdWUgLyA1MCk7XG5cblx0aWYgKHZhbHVlID09PSAwKSB7XG5cdFx0cmV0dXJuIDMwO1xuXHR9XG5cblx0dmFyIGFuc2kgPSAzMFxuXHRcdCsgKChNYXRoLnJvdW5kKGIgLyAyNTUpIDw8IDIpXG5cdFx0fCAoTWF0aC5yb3VuZChnIC8gMjU1KSA8PCAxKVxuXHRcdHwgTWF0aC5yb3VuZChyIC8gMjU1KSk7XG5cblx0aWYgKHZhbHVlID09PSAyKSB7XG5cdFx0YW5zaSArPSA2MDtcblx0fVxuXG5cdHJldHVybiBhbnNpO1xufTtcblxuY29udmVydC5oc3YuYW5zaTE2ID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0Ly8gb3B0aW1pemF0aW9uIGhlcmU7IHdlIGFscmVhZHkga25vdyB0aGUgdmFsdWUgYW5kIGRvbid0IG5lZWQgdG8gZ2V0XG5cdC8vIGl0IGNvbnZlcnRlZCBmb3IgdXMuXG5cdHJldHVybiBjb252ZXJ0LnJnYi5hbnNpMTYoY29udmVydC5oc3YucmdiKGFyZ3MpLCBhcmdzWzJdKTtcbn07XG5cbmNvbnZlcnQucmdiLmFuc2kyNTYgPSBmdW5jdGlvbiAoYXJncykge1xuXHR2YXIgciA9IGFyZ3NbMF07XG5cdHZhciBnID0gYXJnc1sxXTtcblx0dmFyIGIgPSBhcmdzWzJdO1xuXG5cdC8vIHdlIHVzZSB0aGUgZXh0ZW5kZWQgZ3JleXNjYWxlIHBhbGV0dGUgaGVyZSwgd2l0aCB0aGUgZXhjZXB0aW9uIG9mXG5cdC8vIGJsYWNrIGFuZCB3aGl0ZS4gbm9ybWFsIHBhbGV0dGUgb25seSBoYXMgNCBncmV5c2NhbGUgc2hhZGVzLlxuXHRpZiAociA9PT0gZyAmJiBnID09PSBiKSB7XG5cdFx0aWYgKHIgPCA4KSB7XG5cdFx0XHRyZXR1cm4gMTY7XG5cdFx0fVxuXG5cdFx0aWYgKHIgPiAyNDgpIHtcblx0XHRcdHJldHVybiAyMzE7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIE1hdGgucm91bmQoKChyIC0gOCkgLyAyNDcpICogMjQpICsgMjMyO1xuXHR9XG5cblx0dmFyIGFuc2kgPSAxNlxuXHRcdCsgKDM2ICogTWF0aC5yb3VuZChyIC8gMjU1ICogNSkpXG5cdFx0KyAoNiAqIE1hdGgucm91bmQoZyAvIDI1NSAqIDUpKVxuXHRcdCsgTWF0aC5yb3VuZChiIC8gMjU1ICogNSk7XG5cblx0cmV0dXJuIGFuc2k7XG59O1xuXG5jb252ZXJ0LmFuc2kxNi5yZ2IgPSBmdW5jdGlvbiAoYXJncykge1xuXHR2YXIgY29sb3IgPSBhcmdzICUgMTA7XG5cblx0Ly8gaGFuZGxlIGdyZXlzY2FsZVxuXHRpZiAoY29sb3IgPT09IDAgfHwgY29sb3IgPT09IDcpIHtcblx0XHRpZiAoYXJncyA+IDUwKSB7XG5cdFx0XHRjb2xvciArPSAzLjU7XG5cdFx0fVxuXG5cdFx0Y29sb3IgPSBjb2xvciAvIDEwLjUgKiAyNTU7XG5cblx0XHRyZXR1cm4gW2NvbG9yLCBjb2xvciwgY29sb3JdO1xuXHR9XG5cblx0dmFyIG11bHQgPSAofn4oYXJncyA+IDUwKSArIDEpICogMC41O1xuXHR2YXIgciA9ICgoY29sb3IgJiAxKSAqIG11bHQpICogMjU1O1xuXHR2YXIgZyA9ICgoKGNvbG9yID4+IDEpICYgMSkgKiBtdWx0KSAqIDI1NTtcblx0dmFyIGIgPSAoKChjb2xvciA+PiAyKSAmIDEpICogbXVsdCkgKiAyNTU7XG5cblx0cmV0dXJuIFtyLCBnLCBiXTtcbn07XG5cbmNvbnZlcnQuYW5zaTI1Ni5yZ2IgPSBmdW5jdGlvbiAoYXJncykge1xuXHQvLyBoYW5kbGUgZ3JleXNjYWxlXG5cdGlmIChhcmdzID49IDIzMikge1xuXHRcdHZhciBjID0gKGFyZ3MgLSAyMzIpICogMTAgKyA4O1xuXHRcdHJldHVybiBbYywgYywgY107XG5cdH1cblxuXHRhcmdzIC09IDE2O1xuXG5cdHZhciByZW07XG5cdHZhciByID0gTWF0aC5mbG9vcihhcmdzIC8gMzYpIC8gNSAqIDI1NTtcblx0dmFyIGcgPSBNYXRoLmZsb29yKChyZW0gPSBhcmdzICUgMzYpIC8gNikgLyA1ICogMjU1O1xuXHR2YXIgYiA9IChyZW0gJSA2KSAvIDUgKiAyNTU7XG5cblx0cmV0dXJuIFtyLCBnLCBiXTtcbn07XG5cbmNvbnZlcnQucmdiLmhleCA9IGZ1bmN0aW9uIChhcmdzKSB7XG5cdHZhciBpbnRlZ2VyID0gKChNYXRoLnJvdW5kKGFyZ3NbMF0pICYgMHhGRikgPDwgMTYpXG5cdFx0KyAoKE1hdGgucm91bmQoYXJnc1sxXSkgJiAweEZGKSA8PCA4KVxuXHRcdCsgKE1hdGgucm91bmQoYXJnc1syXSkgJiAweEZGKTtcblxuXHR2YXIgc3RyaW5nID0gaW50ZWdlci50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcblx0cmV0dXJuICcwMDAwMDAnLnN1YnN0cmluZyhzdHJpbmcubGVuZ3RoKSArIHN0cmluZztcbn07XG5cbmNvbnZlcnQuaGV4LnJnYiA9IGZ1bmN0aW9uIChhcmdzKSB7XG5cdHZhciBtYXRjaCA9IGFyZ3MudG9TdHJpbmcoMTYpLm1hdGNoKC9bYS1mMC05XXs2fXxbYS1mMC05XXszfS9pKTtcblx0aWYgKCFtYXRjaCkge1xuXHRcdHJldHVybiBbMCwgMCwgMF07XG5cdH1cblxuXHR2YXIgY29sb3JTdHJpbmcgPSBtYXRjaFswXTtcblxuXHRpZiAobWF0Y2hbMF0ubGVuZ3RoID09PSAzKSB7XG5cdFx0Y29sb3JTdHJpbmcgPSBjb2xvclN0cmluZy5zcGxpdCgnJykubWFwKGZ1bmN0aW9uIChjaGFyKSB7XG5cdFx0XHRyZXR1cm4gY2hhciArIGNoYXI7XG5cdFx0fSkuam9pbignJyk7XG5cdH1cblxuXHR2YXIgaW50ZWdlciA9IHBhcnNlSW50KGNvbG9yU3RyaW5nLCAxNik7XG5cdHZhciByID0gKGludGVnZXIgPj4gMTYpICYgMHhGRjtcblx0dmFyIGcgPSAoaW50ZWdlciA+PiA4KSAmIDB4RkY7XG5cdHZhciBiID0gaW50ZWdlciAmIDB4RkY7XG5cblx0cmV0dXJuIFtyLCBnLCBiXTtcbn07XG5cbmNvbnZlcnQucmdiLmhjZyA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0dmFyIHIgPSByZ2JbMF0gLyAyNTU7XG5cdHZhciBnID0gcmdiWzFdIC8gMjU1O1xuXHR2YXIgYiA9IHJnYlsyXSAvIDI1NTtcblx0dmFyIG1heCA9IE1hdGgubWF4KE1hdGgubWF4KHIsIGcpLCBiKTtcblx0dmFyIG1pbiA9IE1hdGgubWluKE1hdGgubWluKHIsIGcpLCBiKTtcblx0dmFyIGNocm9tYSA9IChtYXggLSBtaW4pO1xuXHR2YXIgZ3JheXNjYWxlO1xuXHR2YXIgaHVlO1xuXG5cdGlmIChjaHJvbWEgPCAxKSB7XG5cdFx0Z3JheXNjYWxlID0gbWluIC8gKDEgLSBjaHJvbWEpO1xuXHR9IGVsc2Uge1xuXHRcdGdyYXlzY2FsZSA9IDA7XG5cdH1cblxuXHRpZiAoY2hyb21hIDw9IDApIHtcblx0XHRodWUgPSAwO1xuXHR9IGVsc2Vcblx0aWYgKG1heCA9PT0gcikge1xuXHRcdGh1ZSA9ICgoZyAtIGIpIC8gY2hyb21hKSAlIDY7XG5cdH0gZWxzZVxuXHRpZiAobWF4ID09PSBnKSB7XG5cdFx0aHVlID0gMiArIChiIC0gcikgLyBjaHJvbWE7XG5cdH0gZWxzZSB7XG5cdFx0aHVlID0gNCArIChyIC0gZykgLyBjaHJvbWEgKyA0O1xuXHR9XG5cblx0aHVlIC89IDY7XG5cdGh1ZSAlPSAxO1xuXG5cdHJldHVybiBbaHVlICogMzYwLCBjaHJvbWEgKiAxMDAsIGdyYXlzY2FsZSAqIDEwMF07XG59O1xuXG5jb252ZXJ0LmhzbC5oY2cgPSBmdW5jdGlvbiAoaHNsKSB7XG5cdHZhciBzID0gaHNsWzFdIC8gMTAwO1xuXHR2YXIgbCA9IGhzbFsyXSAvIDEwMDtcblx0dmFyIGMgPSAxO1xuXHR2YXIgZiA9IDA7XG5cblx0aWYgKGwgPCAwLjUpIHtcblx0XHRjID0gMi4wICogcyAqIGw7XG5cdH0gZWxzZSB7XG5cdFx0YyA9IDIuMCAqIHMgKiAoMS4wIC0gbCk7XG5cdH1cblxuXHRpZiAoYyA8IDEuMCkge1xuXHRcdGYgPSAobCAtIDAuNSAqIGMpIC8gKDEuMCAtIGMpO1xuXHR9XG5cblx0cmV0dXJuIFtoc2xbMF0sIGMgKiAxMDAsIGYgKiAxMDBdO1xufTtcblxuY29udmVydC5oc3YuaGNnID0gZnVuY3Rpb24gKGhzdikge1xuXHR2YXIgcyA9IGhzdlsxXSAvIDEwMDtcblx0dmFyIHYgPSBoc3ZbMl0gLyAxMDA7XG5cblx0dmFyIGMgPSBzICogdjtcblx0dmFyIGYgPSAwO1xuXG5cdGlmIChjIDwgMS4wKSB7XG5cdFx0ZiA9ICh2IC0gYykgLyAoMSAtIGMpO1xuXHR9XG5cblx0cmV0dXJuIFtoc3ZbMF0sIGMgKiAxMDAsIGYgKiAxMDBdO1xufTtcblxuY29udmVydC5oY2cucmdiID0gZnVuY3Rpb24gKGhjZykge1xuXHR2YXIgaCA9IGhjZ1swXSAvIDM2MDtcblx0dmFyIGMgPSBoY2dbMV0gLyAxMDA7XG5cdHZhciBnID0gaGNnWzJdIC8gMTAwO1xuXG5cdGlmIChjID09PSAwLjApIHtcblx0XHRyZXR1cm4gW2cgKiAyNTUsIGcgKiAyNTUsIGcgKiAyNTVdO1xuXHR9XG5cblx0dmFyIHB1cmUgPSBbMCwgMCwgMF07XG5cdHZhciBoaSA9IChoICUgMSkgKiA2O1xuXHR2YXIgdiA9IGhpICUgMTtcblx0dmFyIHcgPSAxIC0gdjtcblx0dmFyIG1nID0gMDtcblxuXHRzd2l0Y2ggKE1hdGguZmxvb3IoaGkpKSB7XG5cdFx0Y2FzZSAwOlxuXHRcdFx0cHVyZVswXSA9IDE7IHB1cmVbMV0gPSB2OyBwdXJlWzJdID0gMDsgYnJlYWs7XG5cdFx0Y2FzZSAxOlxuXHRcdFx0cHVyZVswXSA9IHc7IHB1cmVbMV0gPSAxOyBwdXJlWzJdID0gMDsgYnJlYWs7XG5cdFx0Y2FzZSAyOlxuXHRcdFx0cHVyZVswXSA9IDA7IHB1cmVbMV0gPSAxOyBwdXJlWzJdID0gdjsgYnJlYWs7XG5cdFx0Y2FzZSAzOlxuXHRcdFx0cHVyZVswXSA9IDA7IHB1cmVbMV0gPSB3OyBwdXJlWzJdID0gMTsgYnJlYWs7XG5cdFx0Y2FzZSA0OlxuXHRcdFx0cHVyZVswXSA9IHY7IHB1cmVbMV0gPSAwOyBwdXJlWzJdID0gMTsgYnJlYWs7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdHB1cmVbMF0gPSAxOyBwdXJlWzFdID0gMDsgcHVyZVsyXSA9IHc7XG5cdH1cblxuXHRtZyA9ICgxLjAgLSBjKSAqIGc7XG5cblx0cmV0dXJuIFtcblx0XHQoYyAqIHB1cmVbMF0gKyBtZykgKiAyNTUsXG5cdFx0KGMgKiBwdXJlWzFdICsgbWcpICogMjU1LFxuXHRcdChjICogcHVyZVsyXSArIG1nKSAqIDI1NVxuXHRdO1xufTtcblxuY29udmVydC5oY2cuaHN2ID0gZnVuY3Rpb24gKGhjZykge1xuXHR2YXIgYyA9IGhjZ1sxXSAvIDEwMDtcblx0dmFyIGcgPSBoY2dbMl0gLyAxMDA7XG5cblx0dmFyIHYgPSBjICsgZyAqICgxLjAgLSBjKTtcblx0dmFyIGYgPSAwO1xuXG5cdGlmICh2ID4gMC4wKSB7XG5cdFx0ZiA9IGMgLyB2O1xuXHR9XG5cblx0cmV0dXJuIFtoY2dbMF0sIGYgKiAxMDAsIHYgKiAxMDBdO1xufTtcblxuY29udmVydC5oY2cuaHNsID0gZnVuY3Rpb24gKGhjZykge1xuXHR2YXIgYyA9IGhjZ1sxXSAvIDEwMDtcblx0dmFyIGcgPSBoY2dbMl0gLyAxMDA7XG5cblx0dmFyIGwgPSBnICogKDEuMCAtIGMpICsgMC41ICogYztcblx0dmFyIHMgPSAwO1xuXG5cdGlmIChsID4gMC4wICYmIGwgPCAwLjUpIHtcblx0XHRzID0gYyAvICgyICogbCk7XG5cdH0gZWxzZVxuXHRpZiAobCA+PSAwLjUgJiYgbCA8IDEuMCkge1xuXHRcdHMgPSBjIC8gKDIgKiAoMSAtIGwpKTtcblx0fVxuXG5cdHJldHVybiBbaGNnWzBdLCBzICogMTAwLCBsICogMTAwXTtcbn07XG5cbmNvbnZlcnQuaGNnLmh3YiA9IGZ1bmN0aW9uIChoY2cpIHtcblx0dmFyIGMgPSBoY2dbMV0gLyAxMDA7XG5cdHZhciBnID0gaGNnWzJdIC8gMTAwO1xuXHR2YXIgdiA9IGMgKyBnICogKDEuMCAtIGMpO1xuXHRyZXR1cm4gW2hjZ1swXSwgKHYgLSBjKSAqIDEwMCwgKDEgLSB2KSAqIDEwMF07XG59O1xuXG5jb252ZXJ0Lmh3Yi5oY2cgPSBmdW5jdGlvbiAoaHdiKSB7XG5cdHZhciB3ID0gaHdiWzFdIC8gMTAwO1xuXHR2YXIgYiA9IGh3YlsyXSAvIDEwMDtcblx0dmFyIHYgPSAxIC0gYjtcblx0dmFyIGMgPSB2IC0gdztcblx0dmFyIGcgPSAwO1xuXG5cdGlmIChjIDwgMSkge1xuXHRcdGcgPSAodiAtIGMpIC8gKDEgLSBjKTtcblx0fVxuXG5cdHJldHVybiBbaHdiWzBdLCBjICogMTAwLCBnICogMTAwXTtcbn07XG5cbmNvbnZlcnQuYXBwbGUucmdiID0gZnVuY3Rpb24gKGFwcGxlKSB7XG5cdHJldHVybiBbKGFwcGxlWzBdIC8gNjU1MzUpICogMjU1LCAoYXBwbGVbMV0gLyA2NTUzNSkgKiAyNTUsIChhcHBsZVsyXSAvIDY1NTM1KSAqIDI1NV07XG59O1xuXG5jb252ZXJ0LnJnYi5hcHBsZSA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0cmV0dXJuIFsocmdiWzBdIC8gMjU1KSAqIDY1NTM1LCAocmdiWzFdIC8gMjU1KSAqIDY1NTM1LCAocmdiWzJdIC8gMjU1KSAqIDY1NTM1XTtcbn07XG5cbmNvbnZlcnQuZ3JheS5yZ2IgPSBmdW5jdGlvbiAoYXJncykge1xuXHRyZXR1cm4gW2FyZ3NbMF0gLyAxMDAgKiAyNTUsIGFyZ3NbMF0gLyAxMDAgKiAyNTUsIGFyZ3NbMF0gLyAxMDAgKiAyNTVdO1xufTtcblxuY29udmVydC5ncmF5LmhzbCA9IGNvbnZlcnQuZ3JheS5oc3YgPSBmdW5jdGlvbiAoYXJncykge1xuXHRyZXR1cm4gWzAsIDAsIGFyZ3NbMF1dO1xufTtcblxuY29udmVydC5ncmF5Lmh3YiA9IGZ1bmN0aW9uIChncmF5KSB7XG5cdHJldHVybiBbMCwgMTAwLCBncmF5WzBdXTtcbn07XG5cbmNvbnZlcnQuZ3JheS5jbXlrID0gZnVuY3Rpb24gKGdyYXkpIHtcblx0cmV0dXJuIFswLCAwLCAwLCBncmF5WzBdXTtcbn07XG5cbmNvbnZlcnQuZ3JheS5sYWIgPSBmdW5jdGlvbiAoZ3JheSkge1xuXHRyZXR1cm4gW2dyYXlbMF0sIDAsIDBdO1xufTtcblxuY29udmVydC5ncmF5LmhleCA9IGZ1bmN0aW9uIChncmF5KSB7XG5cdHZhciB2YWwgPSBNYXRoLnJvdW5kKGdyYXlbMF0gLyAxMDAgKiAyNTUpICYgMHhGRjtcblx0dmFyIGludGVnZXIgPSAodmFsIDw8IDE2KSArICh2YWwgPDwgOCkgKyB2YWw7XG5cblx0dmFyIHN0cmluZyA9IGludGVnZXIudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7XG5cdHJldHVybiAnMDAwMDAwJy5zdWJzdHJpbmcoc3RyaW5nLmxlbmd0aCkgKyBzdHJpbmc7XG59O1xuXG5jb252ZXJ0LnJnYi5ncmF5ID0gZnVuY3Rpb24gKHJnYikge1xuXHR2YXIgdmFsID0gKHJnYlswXSArIHJnYlsxXSArIHJnYlsyXSkgLyAzO1xuXHRyZXR1cm4gW3ZhbCAvIDI1NSAqIDEwMF07XG59O1xuIiwidmFyIGNvbnZlcnNpb25zID0gcmVxdWlyZSgnLi9jb252ZXJzaW9ucycpO1xudmFyIHJvdXRlID0gcmVxdWlyZSgnLi9yb3V0ZScpO1xuXG52YXIgY29udmVydCA9IHt9O1xuXG52YXIgbW9kZWxzID0gT2JqZWN0LmtleXMoY29udmVyc2lvbnMpO1xuXG5mdW5jdGlvbiB3cmFwUmF3KGZuKSB7XG5cdHZhciB3cmFwcGVkRm4gPSBmdW5jdGlvbiAoYXJncykge1xuXHRcdGlmIChhcmdzID09PSB1bmRlZmluZWQgfHwgYXJncyA9PT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIGFyZ3M7XG5cdFx0fVxuXG5cdFx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG5cdFx0XHRhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZm4oYXJncyk7XG5cdH07XG5cblx0Ly8gcHJlc2VydmUgLmNvbnZlcnNpb24gcHJvcGVydHkgaWYgdGhlcmUgaXMgb25lXG5cdGlmICgnY29udmVyc2lvbicgaW4gZm4pIHtcblx0XHR3cmFwcGVkRm4uY29udmVyc2lvbiA9IGZuLmNvbnZlcnNpb247XG5cdH1cblxuXHRyZXR1cm4gd3JhcHBlZEZuO1xufVxuXG5mdW5jdGlvbiB3cmFwUm91bmRlZChmbikge1xuXHR2YXIgd3JhcHBlZEZuID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0XHRpZiAoYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3MgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiBhcmdzO1xuXHRcdH1cblxuXHRcdGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuXHRcdFx0YXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG5cdFx0fVxuXG5cdFx0dmFyIHJlc3VsdCA9IGZuKGFyZ3MpO1xuXG5cdFx0Ly8gd2UncmUgYXNzdW1pbmcgdGhlIHJlc3VsdCBpcyBhbiBhcnJheSBoZXJlLlxuXHRcdC8vIHNlZSBub3RpY2UgaW4gY29udmVyc2lvbnMuanM7IGRvbid0IHVzZSBib3ggdHlwZXNcblx0XHQvLyBpbiBjb252ZXJzaW9uIGZ1bmN0aW9ucy5cblx0XHRpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcpIHtcblx0XHRcdGZvciAodmFyIGxlbiA9IHJlc3VsdC5sZW5ndGgsIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdFx0cmVzdWx0W2ldID0gTWF0aC5yb3VuZChyZXN1bHRbaV0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH07XG5cblx0Ly8gcHJlc2VydmUgLmNvbnZlcnNpb24gcHJvcGVydHkgaWYgdGhlcmUgaXMgb25lXG5cdGlmICgnY29udmVyc2lvbicgaW4gZm4pIHtcblx0XHR3cmFwcGVkRm4uY29udmVyc2lvbiA9IGZuLmNvbnZlcnNpb247XG5cdH1cblxuXHRyZXR1cm4gd3JhcHBlZEZuO1xufVxuXG5tb2RlbHMuZm9yRWFjaChmdW5jdGlvbiAoZnJvbU1vZGVsKSB7XG5cdGNvbnZlcnRbZnJvbU1vZGVsXSA9IHt9O1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb252ZXJ0W2Zyb21Nb2RlbF0sICdjaGFubmVscycsIHt2YWx1ZTogY29udmVyc2lvbnNbZnJvbU1vZGVsXS5jaGFubmVsc30pO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udmVydFtmcm9tTW9kZWxdLCAnbGFiZWxzJywge3ZhbHVlOiBjb252ZXJzaW9uc1tmcm9tTW9kZWxdLmxhYmVsc30pO1xuXG5cdHZhciByb3V0ZXMgPSByb3V0ZShmcm9tTW9kZWwpO1xuXHR2YXIgcm91dGVNb2RlbHMgPSBPYmplY3Qua2V5cyhyb3V0ZXMpO1xuXG5cdHJvdXRlTW9kZWxzLmZvckVhY2goZnVuY3Rpb24gKHRvTW9kZWwpIHtcblx0XHR2YXIgZm4gPSByb3V0ZXNbdG9Nb2RlbF07XG5cblx0XHRjb252ZXJ0W2Zyb21Nb2RlbF1bdG9Nb2RlbF0gPSB3cmFwUm91bmRlZChmbik7XG5cdFx0Y29udmVydFtmcm9tTW9kZWxdW3RvTW9kZWxdLnJhdyA9IHdyYXBSYXcoZm4pO1xuXHR9KTtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbnZlcnQ7XG4iLCJ2YXIgY29udmVyc2lvbnMgPSByZXF1aXJlKCcuL2NvbnZlcnNpb25zJyk7XG5cbi8qXG5cdHRoaXMgZnVuY3Rpb24gcm91dGVzIGEgbW9kZWwgdG8gYWxsIG90aGVyIG1vZGVscy5cblxuXHRhbGwgZnVuY3Rpb25zIHRoYXQgYXJlIHJvdXRlZCBoYXZlIGEgcHJvcGVydHkgYC5jb252ZXJzaW9uYCBhdHRhY2hlZFxuXHR0byB0aGUgcmV0dXJuZWQgc3ludGhldGljIGZ1bmN0aW9uLiBUaGlzIHByb3BlcnR5IGlzIGFuIGFycmF5XG5cdG9mIHN0cmluZ3MsIGVhY2ggd2l0aCB0aGUgc3RlcHMgaW4gYmV0d2VlbiB0aGUgJ2Zyb20nIGFuZCAndG8nXG5cdGNvbG9yIG1vZGVscyAoaW5jbHVzaXZlKS5cblxuXHRjb252ZXJzaW9ucyB0aGF0IGFyZSBub3QgcG9zc2libGUgc2ltcGx5IGFyZSBub3QgaW5jbHVkZWQuXG4qL1xuXG5mdW5jdGlvbiBidWlsZEdyYXBoKCkge1xuXHR2YXIgZ3JhcGggPSB7fTtcblx0Ly8gaHR0cHM6Ly9qc3BlcmYuY29tL29iamVjdC1rZXlzLXZzLWZvci1pbi13aXRoLWNsb3N1cmUvM1xuXHR2YXIgbW9kZWxzID0gT2JqZWN0LmtleXMoY29udmVyc2lvbnMpO1xuXG5cdGZvciAodmFyIGxlbiA9IG1vZGVscy5sZW5ndGgsIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0XHRncmFwaFttb2RlbHNbaV1dID0ge1xuXHRcdFx0Ly8gaHR0cDovL2pzcGVyZi5jb20vMS12cy1pbmZpbml0eVxuXHRcdFx0Ly8gbWljcm8tb3B0LCBidXQgdGhpcyBpcyBzaW1wbGUuXG5cdFx0XHRkaXN0YW5jZTogLTEsXG5cdFx0XHRwYXJlbnQ6IG51bGxcblx0XHR9O1xuXHR9XG5cblx0cmV0dXJuIGdyYXBoO1xufVxuXG4vLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CcmVhZHRoLWZpcnN0X3NlYXJjaFxuZnVuY3Rpb24gZGVyaXZlQkZTKGZyb21Nb2RlbCkge1xuXHR2YXIgZ3JhcGggPSBidWlsZEdyYXBoKCk7XG5cdHZhciBxdWV1ZSA9IFtmcm9tTW9kZWxdOyAvLyB1bnNoaWZ0IC0+IHF1ZXVlIC0+IHBvcFxuXG5cdGdyYXBoW2Zyb21Nb2RlbF0uZGlzdGFuY2UgPSAwO1xuXG5cdHdoaWxlIChxdWV1ZS5sZW5ndGgpIHtcblx0XHR2YXIgY3VycmVudCA9IHF1ZXVlLnBvcCgpO1xuXHRcdHZhciBhZGphY2VudHMgPSBPYmplY3Qua2V5cyhjb252ZXJzaW9uc1tjdXJyZW50XSk7XG5cblx0XHRmb3IgKHZhciBsZW4gPSBhZGphY2VudHMubGVuZ3RoLCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHR2YXIgYWRqYWNlbnQgPSBhZGphY2VudHNbaV07XG5cdFx0XHR2YXIgbm9kZSA9IGdyYXBoW2FkamFjZW50XTtcblxuXHRcdFx0aWYgKG5vZGUuZGlzdGFuY2UgPT09IC0xKSB7XG5cdFx0XHRcdG5vZGUuZGlzdGFuY2UgPSBncmFwaFtjdXJyZW50XS5kaXN0YW5jZSArIDE7XG5cdFx0XHRcdG5vZGUucGFyZW50ID0gY3VycmVudDtcblx0XHRcdFx0cXVldWUudW5zaGlmdChhZGphY2VudCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGdyYXBoO1xufVxuXG5mdW5jdGlvbiBsaW5rKGZyb20sIHRvKSB7XG5cdHJldHVybiBmdW5jdGlvbiAoYXJncykge1xuXHRcdHJldHVybiB0byhmcm9tKGFyZ3MpKTtcblx0fTtcbn1cblxuZnVuY3Rpb24gd3JhcENvbnZlcnNpb24odG9Nb2RlbCwgZ3JhcGgpIHtcblx0dmFyIHBhdGggPSBbZ3JhcGhbdG9Nb2RlbF0ucGFyZW50LCB0b01vZGVsXTtcblx0dmFyIGZuID0gY29udmVyc2lvbnNbZ3JhcGhbdG9Nb2RlbF0ucGFyZW50XVt0b01vZGVsXTtcblxuXHR2YXIgY3VyID0gZ3JhcGhbdG9Nb2RlbF0ucGFyZW50O1xuXHR3aGlsZSAoZ3JhcGhbY3VyXS5wYXJlbnQpIHtcblx0XHRwYXRoLnVuc2hpZnQoZ3JhcGhbY3VyXS5wYXJlbnQpO1xuXHRcdGZuID0gbGluayhjb252ZXJzaW9uc1tncmFwaFtjdXJdLnBhcmVudF1bY3VyXSwgZm4pO1xuXHRcdGN1ciA9IGdyYXBoW2N1cl0ucGFyZW50O1xuXHR9XG5cblx0Zm4uY29udmVyc2lvbiA9IHBhdGg7XG5cdHJldHVybiBmbjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZnJvbU1vZGVsKSB7XG5cdHZhciBncmFwaCA9IGRlcml2ZUJGUyhmcm9tTW9kZWwpO1xuXHR2YXIgY29udmVyc2lvbiA9IHt9O1xuXG5cdHZhciBtb2RlbHMgPSBPYmplY3Qua2V5cyhncmFwaCk7XG5cdGZvciAodmFyIGxlbiA9IG1vZGVscy5sZW5ndGgsIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0XHR2YXIgdG9Nb2RlbCA9IG1vZGVsc1tpXTtcblx0XHR2YXIgbm9kZSA9IGdyYXBoW3RvTW9kZWxdO1xuXG5cdFx0aWYgKG5vZGUucGFyZW50ID09PSBudWxsKSB7XG5cdFx0XHQvLyBubyBwb3NzaWJsZSBjb252ZXJzaW9uLCBvciB0aGlzIG5vZGUgaXMgdGhlIHNvdXJjZSBtb2RlbC5cblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGNvbnZlcnNpb25bdG9Nb2RlbF0gPSB3cmFwQ29udmVyc2lvbih0b01vZGVsLCBncmFwaCk7XG5cdH1cblxuXHRyZXR1cm4gY29udmVyc2lvbjtcbn07XG5cbiIsIid1c2Ugc3RyaWN0J1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblx0XCJhbGljZWJsdWVcIjogWzI0MCwgMjQ4LCAyNTVdLFxyXG5cdFwiYW50aXF1ZXdoaXRlXCI6IFsyNTAsIDIzNSwgMjE1XSxcclxuXHRcImFxdWFcIjogWzAsIDI1NSwgMjU1XSxcclxuXHRcImFxdWFtYXJpbmVcIjogWzEyNywgMjU1LCAyMTJdLFxyXG5cdFwiYXp1cmVcIjogWzI0MCwgMjU1LCAyNTVdLFxyXG5cdFwiYmVpZ2VcIjogWzI0NSwgMjQ1LCAyMjBdLFxyXG5cdFwiYmlzcXVlXCI6IFsyNTUsIDIyOCwgMTk2XSxcclxuXHRcImJsYWNrXCI6IFswLCAwLCAwXSxcclxuXHRcImJsYW5jaGVkYWxtb25kXCI6IFsyNTUsIDIzNSwgMjA1XSxcclxuXHRcImJsdWVcIjogWzAsIDAsIDI1NV0sXHJcblx0XCJibHVldmlvbGV0XCI6IFsxMzgsIDQzLCAyMjZdLFxyXG5cdFwiYnJvd25cIjogWzE2NSwgNDIsIDQyXSxcclxuXHRcImJ1cmx5d29vZFwiOiBbMjIyLCAxODQsIDEzNV0sXHJcblx0XCJjYWRldGJsdWVcIjogWzk1LCAxNTgsIDE2MF0sXHJcblx0XCJjaGFydHJldXNlXCI6IFsxMjcsIDI1NSwgMF0sXHJcblx0XCJjaG9jb2xhdGVcIjogWzIxMCwgMTA1LCAzMF0sXHJcblx0XCJjb3JhbFwiOiBbMjU1LCAxMjcsIDgwXSxcclxuXHRcImNvcm5mbG93ZXJibHVlXCI6IFsxMDAsIDE0OSwgMjM3XSxcclxuXHRcImNvcm5zaWxrXCI6IFsyNTUsIDI0OCwgMjIwXSxcclxuXHRcImNyaW1zb25cIjogWzIyMCwgMjAsIDYwXSxcclxuXHRcImN5YW5cIjogWzAsIDI1NSwgMjU1XSxcclxuXHRcImRhcmtibHVlXCI6IFswLCAwLCAxMzldLFxyXG5cdFwiZGFya2N5YW5cIjogWzAsIDEzOSwgMTM5XSxcclxuXHRcImRhcmtnb2xkZW5yb2RcIjogWzE4NCwgMTM0LCAxMV0sXHJcblx0XCJkYXJrZ3JheVwiOiBbMTY5LCAxNjksIDE2OV0sXHJcblx0XCJkYXJrZ3JlZW5cIjogWzAsIDEwMCwgMF0sXHJcblx0XCJkYXJrZ3JleVwiOiBbMTY5LCAxNjksIDE2OV0sXHJcblx0XCJkYXJra2hha2lcIjogWzE4OSwgMTgzLCAxMDddLFxyXG5cdFwiZGFya21hZ2VudGFcIjogWzEzOSwgMCwgMTM5XSxcclxuXHRcImRhcmtvbGl2ZWdyZWVuXCI6IFs4NSwgMTA3LCA0N10sXHJcblx0XCJkYXJrb3JhbmdlXCI6IFsyNTUsIDE0MCwgMF0sXHJcblx0XCJkYXJrb3JjaGlkXCI6IFsxNTMsIDUwLCAyMDRdLFxyXG5cdFwiZGFya3JlZFwiOiBbMTM5LCAwLCAwXSxcclxuXHRcImRhcmtzYWxtb25cIjogWzIzMywgMTUwLCAxMjJdLFxyXG5cdFwiZGFya3NlYWdyZWVuXCI6IFsxNDMsIDE4OCwgMTQzXSxcclxuXHRcImRhcmtzbGF0ZWJsdWVcIjogWzcyLCA2MSwgMTM5XSxcclxuXHRcImRhcmtzbGF0ZWdyYXlcIjogWzQ3LCA3OSwgNzldLFxyXG5cdFwiZGFya3NsYXRlZ3JleVwiOiBbNDcsIDc5LCA3OV0sXHJcblx0XCJkYXJrdHVycXVvaXNlXCI6IFswLCAyMDYsIDIwOV0sXHJcblx0XCJkYXJrdmlvbGV0XCI6IFsxNDgsIDAsIDIxMV0sXHJcblx0XCJkZWVwcGlua1wiOiBbMjU1LCAyMCwgMTQ3XSxcclxuXHRcImRlZXBza3libHVlXCI6IFswLCAxOTEsIDI1NV0sXHJcblx0XCJkaW1ncmF5XCI6IFsxMDUsIDEwNSwgMTA1XSxcclxuXHRcImRpbWdyZXlcIjogWzEwNSwgMTA1LCAxMDVdLFxyXG5cdFwiZG9kZ2VyYmx1ZVwiOiBbMzAsIDE0NCwgMjU1XSxcclxuXHRcImZpcmVicmlja1wiOiBbMTc4LCAzNCwgMzRdLFxyXG5cdFwiZmxvcmFsd2hpdGVcIjogWzI1NSwgMjUwLCAyNDBdLFxyXG5cdFwiZm9yZXN0Z3JlZW5cIjogWzM0LCAxMzksIDM0XSxcclxuXHRcImZ1Y2hzaWFcIjogWzI1NSwgMCwgMjU1XSxcclxuXHRcImdhaW5zYm9yb1wiOiBbMjIwLCAyMjAsIDIyMF0sXHJcblx0XCJnaG9zdHdoaXRlXCI6IFsyNDgsIDI0OCwgMjU1XSxcclxuXHRcImdvbGRcIjogWzI1NSwgMjE1LCAwXSxcclxuXHRcImdvbGRlbnJvZFwiOiBbMjE4LCAxNjUsIDMyXSxcclxuXHRcImdyYXlcIjogWzEyOCwgMTI4LCAxMjhdLFxyXG5cdFwiZ3JlZW5cIjogWzAsIDEyOCwgMF0sXHJcblx0XCJncmVlbnllbGxvd1wiOiBbMTczLCAyNTUsIDQ3XSxcclxuXHRcImdyZXlcIjogWzEyOCwgMTI4LCAxMjhdLFxyXG5cdFwiaG9uZXlkZXdcIjogWzI0MCwgMjU1LCAyNDBdLFxyXG5cdFwiaG90cGlua1wiOiBbMjU1LCAxMDUsIDE4MF0sXHJcblx0XCJpbmRpYW5yZWRcIjogWzIwNSwgOTIsIDkyXSxcclxuXHRcImluZGlnb1wiOiBbNzUsIDAsIDEzMF0sXHJcblx0XCJpdm9yeVwiOiBbMjU1LCAyNTUsIDI0MF0sXHJcblx0XCJraGFraVwiOiBbMjQwLCAyMzAsIDE0MF0sXHJcblx0XCJsYXZlbmRlclwiOiBbMjMwLCAyMzAsIDI1MF0sXHJcblx0XCJsYXZlbmRlcmJsdXNoXCI6IFsyNTUsIDI0MCwgMjQ1XSxcclxuXHRcImxhd25ncmVlblwiOiBbMTI0LCAyNTIsIDBdLFxyXG5cdFwibGVtb25jaGlmZm9uXCI6IFsyNTUsIDI1MCwgMjA1XSxcclxuXHRcImxpZ2h0Ymx1ZVwiOiBbMTczLCAyMTYsIDIzMF0sXHJcblx0XCJsaWdodGNvcmFsXCI6IFsyNDAsIDEyOCwgMTI4XSxcclxuXHRcImxpZ2h0Y3lhblwiOiBbMjI0LCAyNTUsIDI1NV0sXHJcblx0XCJsaWdodGdvbGRlbnJvZHllbGxvd1wiOiBbMjUwLCAyNTAsIDIxMF0sXHJcblx0XCJsaWdodGdyYXlcIjogWzIxMSwgMjExLCAyMTFdLFxyXG5cdFwibGlnaHRncmVlblwiOiBbMTQ0LCAyMzgsIDE0NF0sXHJcblx0XCJsaWdodGdyZXlcIjogWzIxMSwgMjExLCAyMTFdLFxyXG5cdFwibGlnaHRwaW5rXCI6IFsyNTUsIDE4MiwgMTkzXSxcclxuXHRcImxpZ2h0c2FsbW9uXCI6IFsyNTUsIDE2MCwgMTIyXSxcclxuXHRcImxpZ2h0c2VhZ3JlZW5cIjogWzMyLCAxNzgsIDE3MF0sXHJcblx0XCJsaWdodHNreWJsdWVcIjogWzEzNSwgMjA2LCAyNTBdLFxyXG5cdFwibGlnaHRzbGF0ZWdyYXlcIjogWzExOSwgMTM2LCAxNTNdLFxyXG5cdFwibGlnaHRzbGF0ZWdyZXlcIjogWzExOSwgMTM2LCAxNTNdLFxyXG5cdFwibGlnaHRzdGVlbGJsdWVcIjogWzE3NiwgMTk2LCAyMjJdLFxyXG5cdFwibGlnaHR5ZWxsb3dcIjogWzI1NSwgMjU1LCAyMjRdLFxyXG5cdFwibGltZVwiOiBbMCwgMjU1LCAwXSxcclxuXHRcImxpbWVncmVlblwiOiBbNTAsIDIwNSwgNTBdLFxyXG5cdFwibGluZW5cIjogWzI1MCwgMjQwLCAyMzBdLFxyXG5cdFwibWFnZW50YVwiOiBbMjU1LCAwLCAyNTVdLFxyXG5cdFwibWFyb29uXCI6IFsxMjgsIDAsIDBdLFxyXG5cdFwibWVkaXVtYXF1YW1hcmluZVwiOiBbMTAyLCAyMDUsIDE3MF0sXHJcblx0XCJtZWRpdW1ibHVlXCI6IFswLCAwLCAyMDVdLFxyXG5cdFwibWVkaXVtb3JjaGlkXCI6IFsxODYsIDg1LCAyMTFdLFxyXG5cdFwibWVkaXVtcHVycGxlXCI6IFsxNDcsIDExMiwgMjE5XSxcclxuXHRcIm1lZGl1bXNlYWdyZWVuXCI6IFs2MCwgMTc5LCAxMTNdLFxyXG5cdFwibWVkaXVtc2xhdGVibHVlXCI6IFsxMjMsIDEwNCwgMjM4XSxcclxuXHRcIm1lZGl1bXNwcmluZ2dyZWVuXCI6IFswLCAyNTAsIDE1NF0sXHJcblx0XCJtZWRpdW10dXJxdW9pc2VcIjogWzcyLCAyMDksIDIwNF0sXHJcblx0XCJtZWRpdW12aW9sZXRyZWRcIjogWzE5OSwgMjEsIDEzM10sXHJcblx0XCJtaWRuaWdodGJsdWVcIjogWzI1LCAyNSwgMTEyXSxcclxuXHRcIm1pbnRjcmVhbVwiOiBbMjQ1LCAyNTUsIDI1MF0sXHJcblx0XCJtaXN0eXJvc2VcIjogWzI1NSwgMjI4LCAyMjVdLFxyXG5cdFwibW9jY2FzaW5cIjogWzI1NSwgMjI4LCAxODFdLFxyXG5cdFwibmF2YWpvd2hpdGVcIjogWzI1NSwgMjIyLCAxNzNdLFxyXG5cdFwibmF2eVwiOiBbMCwgMCwgMTI4XSxcclxuXHRcIm9sZGxhY2VcIjogWzI1MywgMjQ1LCAyMzBdLFxyXG5cdFwib2xpdmVcIjogWzEyOCwgMTI4LCAwXSxcclxuXHRcIm9saXZlZHJhYlwiOiBbMTA3LCAxNDIsIDM1XSxcclxuXHRcIm9yYW5nZVwiOiBbMjU1LCAxNjUsIDBdLFxyXG5cdFwib3JhbmdlcmVkXCI6IFsyNTUsIDY5LCAwXSxcclxuXHRcIm9yY2hpZFwiOiBbMjE4LCAxMTIsIDIxNF0sXHJcblx0XCJwYWxlZ29sZGVucm9kXCI6IFsyMzgsIDIzMiwgMTcwXSxcclxuXHRcInBhbGVncmVlblwiOiBbMTUyLCAyNTEsIDE1Ml0sXHJcblx0XCJwYWxldHVycXVvaXNlXCI6IFsxNzUsIDIzOCwgMjM4XSxcclxuXHRcInBhbGV2aW9sZXRyZWRcIjogWzIxOSwgMTEyLCAxNDddLFxyXG5cdFwicGFwYXlhd2hpcFwiOiBbMjU1LCAyMzksIDIxM10sXHJcblx0XCJwZWFjaHB1ZmZcIjogWzI1NSwgMjE4LCAxODVdLFxyXG5cdFwicGVydVwiOiBbMjA1LCAxMzMsIDYzXSxcclxuXHRcInBpbmtcIjogWzI1NSwgMTkyLCAyMDNdLFxyXG5cdFwicGx1bVwiOiBbMjIxLCAxNjAsIDIyMV0sXHJcblx0XCJwb3dkZXJibHVlXCI6IFsxNzYsIDIyNCwgMjMwXSxcclxuXHRcInB1cnBsZVwiOiBbMTI4LCAwLCAxMjhdLFxyXG5cdFwicmViZWNjYXB1cnBsZVwiOiBbMTAyLCA1MSwgMTUzXSxcclxuXHRcInJlZFwiOiBbMjU1LCAwLCAwXSxcclxuXHRcInJvc3licm93blwiOiBbMTg4LCAxNDMsIDE0M10sXHJcblx0XCJyb3lhbGJsdWVcIjogWzY1LCAxMDUsIDIyNV0sXHJcblx0XCJzYWRkbGVicm93blwiOiBbMTM5LCA2OSwgMTldLFxyXG5cdFwic2FsbW9uXCI6IFsyNTAsIDEyOCwgMTE0XSxcclxuXHRcInNhbmR5YnJvd25cIjogWzI0NCwgMTY0LCA5Nl0sXHJcblx0XCJzZWFncmVlblwiOiBbNDYsIDEzOSwgODddLFxyXG5cdFwic2Vhc2hlbGxcIjogWzI1NSwgMjQ1LCAyMzhdLFxyXG5cdFwic2llbm5hXCI6IFsxNjAsIDgyLCA0NV0sXHJcblx0XCJzaWx2ZXJcIjogWzE5MiwgMTkyLCAxOTJdLFxyXG5cdFwic2t5Ymx1ZVwiOiBbMTM1LCAyMDYsIDIzNV0sXHJcblx0XCJzbGF0ZWJsdWVcIjogWzEwNiwgOTAsIDIwNV0sXHJcblx0XCJzbGF0ZWdyYXlcIjogWzExMiwgMTI4LCAxNDRdLFxyXG5cdFwic2xhdGVncmV5XCI6IFsxMTIsIDEyOCwgMTQ0XSxcclxuXHRcInNub3dcIjogWzI1NSwgMjUwLCAyNTBdLFxyXG5cdFwic3ByaW5nZ3JlZW5cIjogWzAsIDI1NSwgMTI3XSxcclxuXHRcInN0ZWVsYmx1ZVwiOiBbNzAsIDEzMCwgMTgwXSxcclxuXHRcInRhblwiOiBbMjEwLCAxODAsIDE0MF0sXHJcblx0XCJ0ZWFsXCI6IFswLCAxMjgsIDEyOF0sXHJcblx0XCJ0aGlzdGxlXCI6IFsyMTYsIDE5MSwgMjE2XSxcclxuXHRcInRvbWF0b1wiOiBbMjU1LCA5OSwgNzFdLFxyXG5cdFwidHVycXVvaXNlXCI6IFs2NCwgMjI0LCAyMDhdLFxyXG5cdFwidmlvbGV0XCI6IFsyMzgsIDEzMCwgMjM4XSxcclxuXHRcIndoZWF0XCI6IFsyNDUsIDIyMiwgMTc5XSxcclxuXHRcIndoaXRlXCI6IFsyNTUsIDI1NSwgMjU1XSxcclxuXHRcIndoaXRlc21va2VcIjogWzI0NSwgMjQ1LCAyNDVdLFxyXG5cdFwieWVsbG93XCI6IFsyNTUsIDI1NSwgMF0sXHJcblx0XCJ5ZWxsb3dncmVlblwiOiBbMTU0LCAyMDUsIDUwXVxyXG59O1xyXG4iLCIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCJsYXlvdXQtYmFzZVwiKSk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXCJsYXlvdXQtYmFzZVwiXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJjb3NlQmFzZVwiXSA9IGZhY3RvcnkocmVxdWlyZShcImxheW91dC1iYXNlXCIpKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJjb3NlQmFzZVwiXSA9IGZhY3Rvcnkocm9vdFtcImxheW91dEJhc2VcIl0pO1xufSkodGhpcywgZnVuY3Rpb24oX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fNTUxX18pIHtcbnJldHVybiAvKioqKioqLyAoKCkgPT4geyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdFwidXNlIHN0cmljdFwiO1xuLyoqKioqKi8gXHR2YXIgX193ZWJwYWNrX21vZHVsZXNfXyA9ICh7XG5cbi8qKiovIDQ1OlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cblxudmFyIGNvc2VCYXNlID0ge307XG5cbmNvc2VCYXNlLmxheW91dEJhc2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MSk7XG5jb3NlQmFzZS5Db1NFQ29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MDYpO1xuY29zZUJhc2UuQ29TRUVkZ2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc2Nyk7XG5jb3NlQmFzZS5Db1NFR3JhcGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg4MCk7XG5jb3NlQmFzZS5Db1NFR3JhcGhNYW5hZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NzgpO1xuY29zZUJhc2UuQ29TRUxheW91dCA9IF9fd2VicGFja19yZXF1aXJlX18oNzY1KTtcbmNvc2VCYXNlLkNvU0VOb2RlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5OTEpO1xuY29zZUJhc2UuQ29uc3RyYWludEhhbmRsZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkwMik7XG5cbm1vZHVsZS5leHBvcnRzID0gY29zZUJhc2U7XG5cbi8qKiovIH0pLFxuXG4vKioqLyA4MDY6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxuXG52YXIgRkRMYXlvdXRDb25zdGFudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MSkuRkRMYXlvdXRDb25zdGFudHM7XG5cbmZ1bmN0aW9uIENvU0VDb25zdGFudHMoKSB7fVxuXG4vL0NvU0VDb25zdGFudHMgaW5oZXJpdHMgc3RhdGljIHByb3BzIGluIEZETGF5b3V0Q29uc3RhbnRzXG5mb3IgKHZhciBwcm9wIGluIEZETGF5b3V0Q29uc3RhbnRzKSB7XG4gIENvU0VDb25zdGFudHNbcHJvcF0gPSBGRExheW91dENvbnN0YW50c1twcm9wXTtcbn1cblxuQ29TRUNvbnN0YW50cy5ERUZBVUxUX1VTRV9NVUxUSV9MRVZFTF9TQ0FMSU5HID0gZmFsc2U7XG5Db1NFQ29uc3RhbnRzLkRFRkFVTFRfUkFESUFMX1NFUEFSQVRJT04gPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIO1xuQ29TRUNvbnN0YW50cy5ERUZBVUxUX0NPTVBPTkVOVF9TRVBFUkFUSU9OID0gNjA7XG5Db1NFQ29uc3RhbnRzLlRJTEUgPSB0cnVlO1xuQ29TRUNvbnN0YW50cy5USUxJTkdfUEFERElOR19WRVJUSUNBTCA9IDEwO1xuQ29TRUNvbnN0YW50cy5USUxJTkdfUEFERElOR19IT1JJWk9OVEFMID0gMTA7XG5Db1NFQ29uc3RhbnRzLlRSQU5TRk9STV9PTl9DT05TVFJBSU5UX0hBTkRMSU5HID0gdHJ1ZTtcbkNvU0VDb25zdGFudHMuRU5GT1JDRV9DT05TVFJBSU5UUyA9IHRydWU7XG5Db1NFQ29uc3RhbnRzLkFQUExZX0xBWU9VVCA9IHRydWU7XG5Db1NFQ29uc3RhbnRzLlJFTEFYX01PVkVNRU5UX09OX0NPTlNUUkFJTlRTID0gdHJ1ZTtcbkNvU0VDb25zdGFudHMuVFJFRV9SRURVQ1RJT05fT05fSU5DUkVNRU5UQUwgPSB0cnVlOyAvLyB0aGlzIHNob3VsZCBiZSBzZXQgdG8gZmFsc2UgaWYgdGhlcmUgd2lsbCBiZSBhIGNvbnN0cmFpbnRcbi8vIFRoaXMgY29uc3RhbnQgaXMgZm9yIGRpZmZlcmVudGlhdGluZyB3aGV0aGVyIGFjdHVhbCBsYXlvdXQgYWxnb3JpdGhtIHRoYXQgdXNlcyBjb3NlLWJhc2Ugd2FudHMgdG8gYXBwbHkgb25seSBpbmNyZW1lbnRhbCBsYXlvdXQgb3IgXG4vLyBhbiBpbmNyZW1lbnRhbCBsYXlvdXQgb24gdG9wIG9mIGEgcmFuZG9taXplZCBsYXlvdXQuIElmIGl0IGlzIG9ubHkgaW5jcmVtZW50YWwgbGF5b3V0LCB0aGVuIHRoaXMgY29uc3RhbnQgc2hvdWxkIGJlIHRydWUuXG5Db1NFQ29uc3RhbnRzLlBVUkVfSU5DUkVNRU5UQUwgPSBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfSU5DUkVNRU5UQUw7XG5cbm1vZHVsZS5leHBvcnRzID0gQ29TRUNvbnN0YW50cztcblxuLyoqKi8gfSksXG5cbi8qKiovIDc2Nzpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG5cbnZhciBGRExheW91dEVkZ2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MSkuRkRMYXlvdXRFZGdlO1xuXG5mdW5jdGlvbiBDb1NFRWRnZShzb3VyY2UsIHRhcmdldCwgdkVkZ2UpIHtcbiAgRkRMYXlvdXRFZGdlLmNhbGwodGhpcywgc291cmNlLCB0YXJnZXQsIHZFZGdlKTtcbn1cblxuQ29TRUVkZ2UucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShGRExheW91dEVkZ2UucHJvdG90eXBlKTtcbmZvciAodmFyIHByb3AgaW4gRkRMYXlvdXRFZGdlKSB7XG4gIENvU0VFZGdlW3Byb3BdID0gRkRMYXlvdXRFZGdlW3Byb3BdO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IENvU0VFZGdlO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gODgwOlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cblxudmFyIExHcmFwaCA9IF9fd2VicGFja19yZXF1aXJlX18oNTUxKS5MR3JhcGg7XG5cbmZ1bmN0aW9uIENvU0VHcmFwaChwYXJlbnQsIGdyYXBoTWdyLCB2R3JhcGgpIHtcbiAgTEdyYXBoLmNhbGwodGhpcywgcGFyZW50LCBncmFwaE1nciwgdkdyYXBoKTtcbn1cblxuQ29TRUdyYXBoLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoTEdyYXBoLnByb3RvdHlwZSk7XG5mb3IgKHZhciBwcm9wIGluIExHcmFwaCkge1xuICBDb1NFR3JhcGhbcHJvcF0gPSBMR3JhcGhbcHJvcF07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQ29TRUdyYXBoO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gNTc4OlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cblxudmFyIExHcmFwaE1hbmFnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MSkuTEdyYXBoTWFuYWdlcjtcblxuZnVuY3Rpb24gQ29TRUdyYXBoTWFuYWdlcihsYXlvdXQpIHtcbiAgTEdyYXBoTWFuYWdlci5jYWxsKHRoaXMsIGxheW91dCk7XG59XG5cbkNvU0VHcmFwaE1hbmFnZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShMR3JhcGhNYW5hZ2VyLnByb3RvdHlwZSk7XG5mb3IgKHZhciBwcm9wIGluIExHcmFwaE1hbmFnZXIpIHtcbiAgQ29TRUdyYXBoTWFuYWdlcltwcm9wXSA9IExHcmFwaE1hbmFnZXJbcHJvcF07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQ29TRUdyYXBoTWFuYWdlcjtcblxuLyoqKi8gfSksXG5cbi8qKiovIDc2NTpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG5cbnZhciBGRExheW91dCA9IF9fd2VicGFja19yZXF1aXJlX18oNTUxKS5GRExheW91dDtcbnZhciBDb1NFR3JhcGhNYW5hZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NzgpO1xudmFyIENvU0VHcmFwaCA9IF9fd2VicGFja19yZXF1aXJlX18oODgwKTtcbnZhciBDb1NFTm9kZSA9IF9fd2VicGFja19yZXF1aXJlX18oOTkxKTtcbnZhciBDb1NFRWRnZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzY3KTtcbnZhciBDb1NFQ29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MDYpO1xudmFyIENvbnN0cmFpbnRIYW5kbGVyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5MDIpO1xudmFyIEZETGF5b3V0Q29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTEpLkZETGF5b3V0Q29uc3RhbnRzO1xudmFyIExheW91dENvbnN0YW50cyA9IF9fd2VicGFja19yZXF1aXJlX18oNTUxKS5MYXlvdXRDb25zdGFudHM7XG52YXIgUG9pbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MSkuUG9pbnQ7XG52YXIgUG9pbnREID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTEpLlBvaW50RDtcbnZhciBEaW1lbnNpb25EID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTEpLkRpbWVuc2lvbkQ7XG52YXIgTGF5b3V0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTEpLkxheW91dDtcbnZhciBJbnRlZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTEpLkludGVnZXI7XG52YXIgSUdlb21ldHJ5ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTEpLklHZW9tZXRyeTtcbnZhciBMR3JhcGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MSkuTEdyYXBoO1xudmFyIFRyYW5zZm9ybSA9IF9fd2VicGFja19yZXF1aXJlX18oNTUxKS5UcmFuc2Zvcm07XG52YXIgTGlua2VkTGlzdCA9IF9fd2VicGFja19yZXF1aXJlX18oNTUxKS5MaW5rZWRMaXN0O1xuXG5mdW5jdGlvbiBDb1NFTGF5b3V0KCkge1xuICBGRExheW91dC5jYWxsKHRoaXMpO1xuXG4gIHRoaXMudG9CZVRpbGVkID0ge307IC8vIE1lbW9yaXplIGlmIGEgbm9kZSBpcyB0byBiZSB0aWxlZCBvciBpcyB0aWxlZFxuICB0aGlzLmNvbnN0cmFpbnRzID0ge307IC8vIGtlZXAgbGF5b3V0IGNvbnN0cmFpbnRzXG59XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShGRExheW91dC5wcm90b3R5cGUpO1xuXG5mb3IgKHZhciBwcm9wIGluIEZETGF5b3V0KSB7XG4gIENvU0VMYXlvdXRbcHJvcF0gPSBGRExheW91dFtwcm9wXTtcbn1cblxuQ29TRUxheW91dC5wcm90b3R5cGUubmV3R3JhcGhNYW5hZ2VyID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZ20gPSBuZXcgQ29TRUdyYXBoTWFuYWdlcih0aGlzKTtcbiAgdGhpcy5ncmFwaE1hbmFnZXIgPSBnbTtcbiAgcmV0dXJuIGdtO1xufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUubmV3R3JhcGggPSBmdW5jdGlvbiAodkdyYXBoKSB7XG4gIHJldHVybiBuZXcgQ29TRUdyYXBoKG51bGwsIHRoaXMuZ3JhcGhNYW5hZ2VyLCB2R3JhcGgpO1xufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUubmV3Tm9kZSA9IGZ1bmN0aW9uICh2Tm9kZSkge1xuICByZXR1cm4gbmV3IENvU0VOb2RlKHRoaXMuZ3JhcGhNYW5hZ2VyLCB2Tm9kZSk7XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5uZXdFZGdlID0gZnVuY3Rpb24gKHZFZGdlKSB7XG4gIHJldHVybiBuZXcgQ29TRUVkZ2UobnVsbCwgbnVsbCwgdkVkZ2UpO1xufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUuaW5pdFBhcmFtZXRlcnMgPSBmdW5jdGlvbiAoKSB7XG4gIEZETGF5b3V0LnByb3RvdHlwZS5pbml0UGFyYW1ldGVycy5jYWxsKHRoaXMsIGFyZ3VtZW50cyk7XG4gIGlmICghdGhpcy5pc1N1YkxheW91dCkge1xuICAgIGlmIChDb1NFQ29uc3RhbnRzLkRFRkFVTFRfRURHRV9MRU5HVEggPCAxMCkge1xuICAgICAgdGhpcy5pZGVhbEVkZ2VMZW5ndGggPSAxMDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pZGVhbEVkZ2VMZW5ndGggPSBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfRURHRV9MRU5HVEg7XG4gICAgfVxuXG4gICAgdGhpcy51c2VTbWFydElkZWFsRWRnZUxlbmd0aENhbGN1bGF0aW9uID0gQ29TRUNvbnN0YW50cy5ERUZBVUxUX1VTRV9TTUFSVF9JREVBTF9FREdFX0xFTkdUSF9DQUxDVUxBVElPTjtcbiAgICB0aGlzLmdyYXZpdHlDb25zdGFudCA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfR1JBVklUWV9TVFJFTkdUSDtcbiAgICB0aGlzLmNvbXBvdW5kR3Jhdml0eUNvbnN0YW50ID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9DT01QT1VORF9HUkFWSVRZX1NUUkVOR1RIO1xuICAgIHRoaXMuZ3Jhdml0eVJhbmdlRmFjdG9yID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9HUkFWSVRZX1JBTkdFX0ZBQ1RPUjtcbiAgICB0aGlzLmNvbXBvdW5kR3Jhdml0eVJhbmdlRmFjdG9yID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9DT01QT1VORF9HUkFWSVRZX1JBTkdFX0ZBQ1RPUjtcblxuICAgIC8vIHZhcmlhYmxlcyBmb3IgdHJlZSByZWR1Y3Rpb24gc3VwcG9ydFxuICAgIHRoaXMucHJ1bmVkTm9kZXNBbGwgPSBbXTtcbiAgICB0aGlzLmdyb3dUcmVlSXRlcmF0aW9ucyA9IDA7XG4gICAgdGhpcy5hZnRlckdyb3d0aEl0ZXJhdGlvbnMgPSAwO1xuICAgIHRoaXMuaXNUcmVlR3Jvd2luZyA9IGZhbHNlO1xuICAgIHRoaXMuaXNHcm93dGhGaW5pc2hlZCA9IGZhbHNlO1xuICB9XG59O1xuXG4vLyBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIHNldCBDb1NFIHJlbGF0ZWQgcGFyYW1ldGVycyB1c2VkIGJ5IHNwcmluZyBlbWJlZGRlci5cbkNvU0VMYXlvdXQucHJvdG90eXBlLmluaXRTcHJpbmdFbWJlZGRlciA9IGZ1bmN0aW9uICgpIHtcbiAgRkRMYXlvdXQucHJvdG90eXBlLmluaXRTcHJpbmdFbWJlZGRlci5jYWxsKHRoaXMpO1xuXG4gIC8vIHZhcmlhYmxlcyBmb3IgY29vbGluZ1xuICB0aGlzLmNvb2xpbmdDeWNsZSA9IDA7XG4gIHRoaXMubWF4Q29vbGluZ0N5Y2xlID0gdGhpcy5tYXhJdGVyYXRpb25zIC8gRkRMYXlvdXRDb25zdGFudHMuQ09OVkVSR0VOQ0VfQ0hFQ0tfUEVSSU9EO1xuICB0aGlzLmZpbmFsVGVtcGVyYXR1cmUgPSAwLjA0O1xuICB0aGlzLmNvb2xpbmdBZGp1c3RlciA9IDE7XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5sYXlvdXQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBjcmVhdGVCZW5kc0FzTmVlZGVkID0gTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQ1JFQVRFX0JFTkRTX0FTX05FRURFRDtcbiAgaWYgKGNyZWF0ZUJlbmRzQXNOZWVkZWQpIHtcbiAgICB0aGlzLmNyZWF0ZUJlbmRwb2ludHMoKTtcbiAgICB0aGlzLmdyYXBoTWFuYWdlci5yZXNldEFsbEVkZ2VzKCk7XG4gIH1cblxuICB0aGlzLmxldmVsID0gMDtcbiAgcmV0dXJuIHRoaXMuY2xhc3NpY0xheW91dCgpO1xufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUuY2xhc3NpY0xheW91dCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5ub2Rlc1dpdGhHcmF2aXR5ID0gdGhpcy5jYWxjdWxhdGVOb2Rlc1RvQXBwbHlHcmF2aXRhdGlvblRvKCk7XG4gIHRoaXMuZ3JhcGhNYW5hZ2VyLnNldEFsbE5vZGVzVG9BcHBseUdyYXZpdGF0aW9uKHRoaXMubm9kZXNXaXRoR3Jhdml0eSk7XG4gIHRoaXMuY2FsY05vT2ZDaGlsZHJlbkZvckFsbE5vZGVzKCk7XG4gIHRoaXMuZ3JhcGhNYW5hZ2VyLmNhbGNMb3dlc3RDb21tb25BbmNlc3RvcnMoKTtcbiAgdGhpcy5ncmFwaE1hbmFnZXIuY2FsY0luY2x1c2lvblRyZWVEZXB0aHMoKTtcbiAgdGhpcy5ncmFwaE1hbmFnZXIuZ2V0Um9vdCgpLmNhbGNFc3RpbWF0ZWRTaXplKCk7XG4gIHRoaXMuY2FsY0lkZWFsRWRnZUxlbmd0aHMoKTtcblxuICBpZiAoIXRoaXMuaW5jcmVtZW50YWwpIHtcbiAgICB2YXIgZm9yZXN0ID0gdGhpcy5nZXRGbGF0Rm9yZXN0KCk7XG5cbiAgICAvLyBUaGUgZ3JhcGggYXNzb2NpYXRlZCB3aXRoIHRoaXMgbGF5b3V0IGlzIGZsYXQgYW5kIGEgZm9yZXN0XG4gICAgaWYgKGZvcmVzdC5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnBvc2l0aW9uTm9kZXNSYWRpYWxseShmb3Jlc3QpO1xuICAgIH1cbiAgICAvLyBUaGUgZ3JhcGggYXNzb2NpYXRlZCB3aXRoIHRoaXMgbGF5b3V0IGlzIG5vdCBmbGF0IG9yIGEgZm9yZXN0XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIFJlZHVjZSB0aGUgdHJlZXMgd2hlbiBpbmNyZW1lbnRhbCBtb2RlIGlzIG5vdCBlbmFibGVkIGFuZCBncmFwaCBpcyBub3QgYSBmb3Jlc3QgXG4gICAgICAgIHRoaXMucmVkdWNlVHJlZXMoKTtcbiAgICAgICAgLy8gVXBkYXRlIG5vZGVzIHRoYXQgZ3Jhdml0eSB3aWxsIGJlIGFwcGxpZWRcbiAgICAgICAgdGhpcy5ncmFwaE1hbmFnZXIucmVzZXRBbGxOb2Rlc1RvQXBwbHlHcmF2aXRhdGlvbigpO1xuICAgICAgICB2YXIgYWxsTm9kZXMgPSBuZXcgU2V0KHRoaXMuZ2V0QWxsTm9kZXMoKSk7XG4gICAgICAgIHZhciBpbnRlcnNlY3Rpb24gPSB0aGlzLm5vZGVzV2l0aEdyYXZpdHkuZmlsdGVyKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgcmV0dXJuIGFsbE5vZGVzLmhhcyh4KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZ3JhcGhNYW5hZ2VyLnNldEFsbE5vZGVzVG9BcHBseUdyYXZpdGF0aW9uKGludGVyc2VjdGlvbik7XG5cbiAgICAgICAgdGhpcy5wb3NpdGlvbk5vZGVzUmFuZG9tbHkoKTtcbiAgICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoQ29TRUNvbnN0YW50cy5UUkVFX1JFRFVDVElPTl9PTl9JTkNSRU1FTlRBTCkge1xuICAgICAgLy8gUmVkdWNlIHRoZSB0cmVlcyBpbiBpbmNyZW1lbnRhbCBtb2RlIGlmIG9ubHkgdGhpcyBjb25zdGFudCBpcyBzZXQgdG8gdHJ1ZSBcbiAgICAgIHRoaXMucmVkdWNlVHJlZXMoKTtcbiAgICAgIC8vIFVwZGF0ZSBub2RlcyB0aGF0IGdyYXZpdHkgd2lsbCBiZSBhcHBsaWVkXG4gICAgICB0aGlzLmdyYXBoTWFuYWdlci5yZXNldEFsbE5vZGVzVG9BcHBseUdyYXZpdGF0aW9uKCk7XG4gICAgICB2YXIgYWxsTm9kZXMgPSBuZXcgU2V0KHRoaXMuZ2V0QWxsTm9kZXMoKSk7XG4gICAgICB2YXIgaW50ZXJzZWN0aW9uID0gdGhpcy5ub2Rlc1dpdGhHcmF2aXR5LmZpbHRlcihmdW5jdGlvbiAoeCkge1xuICAgICAgICByZXR1cm4gYWxsTm9kZXMuaGFzKHgpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmdyYXBoTWFuYWdlci5zZXRBbGxOb2Rlc1RvQXBwbHlHcmF2aXRhdGlvbihpbnRlcnNlY3Rpb24pO1xuICAgIH1cbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyh0aGlzLmNvbnN0cmFpbnRzKS5sZW5ndGggPiAwKSB7XG4gICAgQ29uc3RyYWludEhhbmRsZXIuaGFuZGxlQ29uc3RyYWludHModGhpcyk7XG4gICAgdGhpcy5pbml0Q29uc3RyYWludFZhcmlhYmxlcygpO1xuICB9XG5cbiAgdGhpcy5pbml0U3ByaW5nRW1iZWRkZXIoKTtcbiAgaWYgKENvU0VDb25zdGFudHMuQVBQTFlfTEFZT1VUKSB7XG4gICAgdGhpcy5ydW5TcHJpbmdFbWJlZGRlcigpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS50aWNrID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLnRvdGFsSXRlcmF0aW9ucysrO1xuXG4gIGlmICh0aGlzLnRvdGFsSXRlcmF0aW9ucyA9PT0gdGhpcy5tYXhJdGVyYXRpb25zICYmICF0aGlzLmlzVHJlZUdyb3dpbmcgJiYgIXRoaXMuaXNHcm93dGhGaW5pc2hlZCkge1xuICAgIGlmICh0aGlzLnBydW5lZE5vZGVzQWxsLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuaXNUcmVlR3Jvd2luZyA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0aGlzLnRvdGFsSXRlcmF0aW9ucyAlIEZETGF5b3V0Q29uc3RhbnRzLkNPTlZFUkdFTkNFX0NIRUNLX1BFUklPRCA9PSAwICYmICF0aGlzLmlzVHJlZUdyb3dpbmcgJiYgIXRoaXMuaXNHcm93dGhGaW5pc2hlZCkge1xuICAgIGlmICh0aGlzLmlzQ29udmVyZ2VkKCkpIHtcbiAgICAgIGlmICh0aGlzLnBydW5lZE5vZGVzQWxsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5pc1RyZWVHcm93aW5nID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuY29vbGluZ0N5Y2xlKys7XG5cbiAgICBpZiAodGhpcy5sYXlvdXRRdWFsaXR5ID09IDApIHtcbiAgICAgIC8vIHF1YWxpdHkgLSBcImRyYWZ0XCJcbiAgICAgIHRoaXMuY29vbGluZ0FkanVzdGVyID0gdGhpcy5jb29saW5nQ3ljbGU7XG4gICAgfSBlbHNlIGlmICh0aGlzLmxheW91dFF1YWxpdHkgPT0gMSkge1xuICAgICAgLy8gcXVhbGl0eSAtIFwiZGVmYXVsdFwiXG4gICAgICB0aGlzLmNvb2xpbmdBZGp1c3RlciA9IHRoaXMuY29vbGluZ0N5Y2xlIC8gMztcbiAgICB9XG5cbiAgICAvLyBjb29saW5nIHNjaGVkdWxlIGlzIGJhc2VkIG9uIGh0dHA6Ly93d3cuYnRsdWtlLmNvbS9zaW1hbmYxLmh0bWwgLT4gY29vbGluZyBzY2hlZHVsZSAzXG4gICAgdGhpcy5jb29saW5nRmFjdG9yID0gTWF0aC5tYXgodGhpcy5pbml0aWFsQ29vbGluZ0ZhY3RvciAtIE1hdGgucG93KHRoaXMuY29vbGluZ0N5Y2xlLCBNYXRoLmxvZygxMDAgKiAodGhpcy5pbml0aWFsQ29vbGluZ0ZhY3RvciAtIHRoaXMuZmluYWxUZW1wZXJhdHVyZSkpIC8gTWF0aC5sb2codGhpcy5tYXhDb29saW5nQ3ljbGUpKSAvIDEwMCAqIHRoaXMuY29vbGluZ0FkanVzdGVyLCB0aGlzLmZpbmFsVGVtcGVyYXR1cmUpO1xuICAgIHRoaXMuYW5pbWF0aW9uUGVyaW9kID0gTWF0aC5jZWlsKHRoaXMuaW5pdGlhbEFuaW1hdGlvblBlcmlvZCAqIE1hdGguc3FydCh0aGlzLmNvb2xpbmdGYWN0b3IpKTtcbiAgfVxuICAvLyBPcGVyYXRpb25zIHdoaWxlIHRyZWUgaXMgZ3Jvd2luZyBhZ2FpbiBcbiAgaWYgKHRoaXMuaXNUcmVlR3Jvd2luZykge1xuICAgIGlmICh0aGlzLmdyb3dUcmVlSXRlcmF0aW9ucyAlIDEwID09IDApIHtcbiAgICAgIGlmICh0aGlzLnBydW5lZE5vZGVzQWxsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5ncmFwaE1hbmFnZXIudXBkYXRlQm91bmRzKCk7XG4gICAgICAgIHRoaXMudXBkYXRlR3JpZCgpO1xuICAgICAgICB0aGlzLmdyb3dUcmVlKHRoaXMucHJ1bmVkTm9kZXNBbGwpO1xuICAgICAgICAvLyBVcGRhdGUgbm9kZXMgdGhhdCBncmF2aXR5IHdpbGwgYmUgYXBwbGllZFxuICAgICAgICB0aGlzLmdyYXBoTWFuYWdlci5yZXNldEFsbE5vZGVzVG9BcHBseUdyYXZpdGF0aW9uKCk7XG4gICAgICAgIHZhciBhbGxOb2RlcyA9IG5ldyBTZXQodGhpcy5nZXRBbGxOb2RlcygpKTtcbiAgICAgICAgdmFyIGludGVyc2VjdGlvbiA9IHRoaXMubm9kZXNXaXRoR3Jhdml0eS5maWx0ZXIoZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICByZXR1cm4gYWxsTm9kZXMuaGFzKHgpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5ncmFwaE1hbmFnZXIuc2V0QWxsTm9kZXNUb0FwcGx5R3Jhdml0YXRpb24oaW50ZXJzZWN0aW9uKTtcblxuICAgICAgICB0aGlzLmdyYXBoTWFuYWdlci51cGRhdGVCb3VuZHMoKTtcbiAgICAgICAgdGhpcy51cGRhdGVHcmlkKCk7XG4gICAgICAgIGlmIChDb1NFQ29uc3RhbnRzLlBVUkVfSU5DUkVNRU5UQUwpIHRoaXMuY29vbGluZ0ZhY3RvciA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQ09PTElOR19GQUNUT1JfSU5DUkVNRU5UQUwgLyAyO2Vsc2UgdGhpcy5jb29saW5nRmFjdG9yID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9DT09MSU5HX0ZBQ1RPUl9JTkNSRU1FTlRBTDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaXNUcmVlR3Jvd2luZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzR3Jvd3RoRmluaXNoZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmdyb3dUcmVlSXRlcmF0aW9ucysrO1xuICB9XG4gIC8vIE9wZXJhdGlvbnMgYWZ0ZXIgZ3Jvd3RoIGlzIGZpbmlzaGVkXG4gIGlmICh0aGlzLmlzR3Jvd3RoRmluaXNoZWQpIHtcbiAgICBpZiAodGhpcy5pc0NvbnZlcmdlZCgpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYWZ0ZXJHcm93dGhJdGVyYXRpb25zICUgMTAgPT0gMCkge1xuICAgICAgdGhpcy5ncmFwaE1hbmFnZXIudXBkYXRlQm91bmRzKCk7XG4gICAgICB0aGlzLnVwZGF0ZUdyaWQoKTtcbiAgICB9XG4gICAgaWYgKENvU0VDb25zdGFudHMuUFVSRV9JTkNSRU1FTlRBTCkgdGhpcy5jb29saW5nRmFjdG9yID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9DT09MSU5HX0ZBQ1RPUl9JTkNSRU1FTlRBTCAvIDIgKiAoKDEwMCAtIHRoaXMuYWZ0ZXJHcm93dGhJdGVyYXRpb25zKSAvIDEwMCk7ZWxzZSB0aGlzLmNvb2xpbmdGYWN0b3IgPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0NPT0xJTkdfRkFDVE9SX0lOQ1JFTUVOVEFMICogKCgxMDAgLSB0aGlzLmFmdGVyR3Jvd3RoSXRlcmF0aW9ucykgLyAxMDApO1xuICAgIHRoaXMuYWZ0ZXJHcm93dGhJdGVyYXRpb25zKys7XG4gIH1cblxuICB2YXIgZ3JpZFVwZGF0ZUFsbG93ZWQgPSAhdGhpcy5pc1RyZWVHcm93aW5nICYmICF0aGlzLmlzR3Jvd3RoRmluaXNoZWQ7XG4gIHZhciBmb3JjZVRvTm9kZVN1cnJvdW5kaW5nVXBkYXRlID0gdGhpcy5ncm93VHJlZUl0ZXJhdGlvbnMgJSAxMCA9PSAxICYmIHRoaXMuaXNUcmVlR3Jvd2luZyB8fCB0aGlzLmFmdGVyR3Jvd3RoSXRlcmF0aW9ucyAlIDEwID09IDEgJiYgdGhpcy5pc0dyb3d0aEZpbmlzaGVkO1xuXG4gIHRoaXMudG90YWxEaXNwbGFjZW1lbnQgPSAwO1xuICB0aGlzLmdyYXBoTWFuYWdlci51cGRhdGVCb3VuZHMoKTtcbiAgdGhpcy5jYWxjU3ByaW5nRm9yY2VzKCk7XG4gIHRoaXMuY2FsY1JlcHVsc2lvbkZvcmNlcyhncmlkVXBkYXRlQWxsb3dlZCwgZm9yY2VUb05vZGVTdXJyb3VuZGluZ1VwZGF0ZSk7XG4gIHRoaXMuY2FsY0dyYXZpdGF0aW9uYWxGb3JjZXMoKTtcbiAgdGhpcy5tb3ZlTm9kZXMoKTtcbiAgdGhpcy5hbmltYXRlKCk7XG5cbiAgcmV0dXJuIGZhbHNlOyAvLyBMYXlvdXQgaXMgbm90IGVuZGVkIHlldCByZXR1cm4gZmFsc2Vcbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLmdldFBvc2l0aW9uc0RhdGEgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBhbGxOb2RlcyA9IHRoaXMuZ3JhcGhNYW5hZ2VyLmdldEFsbE5vZGVzKCk7XG4gIHZhciBwRGF0YSA9IHt9O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHJlY3QgPSBhbGxOb2Rlc1tpXS5yZWN0O1xuICAgIHZhciBpZCA9IGFsbE5vZGVzW2ldLmlkO1xuICAgIHBEYXRhW2lkXSA9IHtcbiAgICAgIGlkOiBpZCxcbiAgICAgIHg6IHJlY3QuZ2V0Q2VudGVyWCgpLFxuICAgICAgeTogcmVjdC5nZXRDZW50ZXJZKCksXG4gICAgICB3OiByZWN0LndpZHRoLFxuICAgICAgaDogcmVjdC5oZWlnaHRcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHBEYXRhO1xufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUucnVuU3ByaW5nRW1iZWRkZXIgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuaW5pdGlhbEFuaW1hdGlvblBlcmlvZCA9IDI1O1xuICB0aGlzLmFuaW1hdGlvblBlcmlvZCA9IHRoaXMuaW5pdGlhbEFuaW1hdGlvblBlcmlvZDtcbiAgdmFyIGxheW91dEVuZGVkID0gZmFsc2U7XG5cbiAgLy8gSWYgYW1pbmF0ZSBvcHRpb24gaXMgJ2R1cmluZycgc2lnbmFsIHRoYXQgbGF5b3V0IGlzIHN1cHBvc2VkIHRvIHN0YXJ0IGl0ZXJhdGluZ1xuICBpZiAoRkRMYXlvdXRDb25zdGFudHMuQU5JTUFURSA9PT0gJ2R1cmluZycpIHtcbiAgICB0aGlzLmVtaXQoJ2xheW91dHN0YXJ0ZWQnKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBJZiBhbWluYXRlIG9wdGlvbiBpcyAnZHVyaW5nJyB0aWNrKCkgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgb24gaW5kZXguanNcbiAgICB3aGlsZSAoIWxheW91dEVuZGVkKSB7XG4gICAgICBsYXlvdXRFbmRlZCA9IHRoaXMudGljaygpO1xuICAgIH1cblxuICAgIHRoaXMuZ3JhcGhNYW5hZ2VyLnVwZGF0ZUJvdW5kcygpO1xuICB9XG59O1xuXG4vLyBvdmVycmlkZXMgbW92ZU5vZGVzIG1ldGhvZCBpbiBGRExheW91dFxuQ29TRUxheW91dC5wcm90b3R5cGUubW92ZU5vZGVzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbE5vZGVzID0gdGhpcy5nZXRBbGxOb2RlcygpO1xuICB2YXIgbm9kZTtcblxuICAvLyBjYWxjdWxhdGUgZGlzcGxhY2VtZW50IGZvciBlYWNoIG5vZGUgXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgbm9kZSA9IGxOb2Rlc1tpXTtcbiAgICBub2RlLmNhbGN1bGF0ZURpc3BsYWNlbWVudCgpO1xuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKHRoaXMuY29uc3RyYWludHMpLmxlbmd0aCA+IDApIHtcbiAgICB0aGlzLnVwZGF0ZURpc3BsYWNlbWVudHMoKTtcbiAgfVxuXG4gIC8vIG1vdmUgZWFjaCBub2RlXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgbm9kZSA9IGxOb2Rlc1tpXTtcbiAgICBub2RlLm1vdmUoKTtcbiAgfVxufTtcblxuLy8gY29uc3RyYWludCByZWxhdGVkIG1ldGhvZHM6IGluaXRDb25zdHJhaW50VmFyaWFibGVzIGFuZCB1cGRhdGVEaXNwbGFjZW1lbnRzXG5cbi8vIGluaXRpYWxpemUgY29uc3RyYWludCByZWxhdGVkIHZhcmlhYmxlc1xuQ29TRUxheW91dC5wcm90b3R5cGUuaW5pdENvbnN0cmFpbnRWYXJpYWJsZXMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdGhpcy5pZFRvTm9kZU1hcCA9IG5ldyBNYXAoKTtcbiAgdGhpcy5maXhlZE5vZGVTZXQgPSBuZXcgU2V0KCk7XG5cbiAgdmFyIGFsbE5vZGVzID0gdGhpcy5ncmFwaE1hbmFnZXIuZ2V0QWxsTm9kZXMoKTtcblxuICAvLyBmaWxsIGlkVG9Ob2RlTWFwXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYWxsTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbm9kZSA9IGFsbE5vZGVzW2ldO1xuICAgIHRoaXMuaWRUb05vZGVNYXAuc2V0KG5vZGUuaWQsIG5vZGUpO1xuICB9XG5cbiAgLy8gY2FsY3VsYXRlIGZpeGVkIG5vZGUgd2VpZ2h0IGZvciBnaXZlbiBjb21wb3VuZCBub2RlXG4gIHZhciBjYWxjdWxhdGVDb21wb3VuZFdlaWdodCA9IGZ1bmN0aW9uIGNhbGN1bGF0ZUNvbXBvdW5kV2VpZ2h0KGNvbXBvdW5kTm9kZSkge1xuICAgIHZhciBub2RlcyA9IGNvbXBvdW5kTm9kZS5nZXRDaGlsZCgpLmdldE5vZGVzKCk7XG4gICAgdmFyIG5vZGU7XG4gICAgdmFyIGZpeGVkTm9kZVdlaWdodCA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgaWYgKG5vZGUuZ2V0Q2hpbGQoKSA9PSBudWxsKSB7XG4gICAgICAgIGlmIChzZWxmLmZpeGVkTm9kZVNldC5oYXMobm9kZS5pZCkpIHtcbiAgICAgICAgICBmaXhlZE5vZGVXZWlnaHQgKz0gMTAwO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaXhlZE5vZGVXZWlnaHQgKz0gY2FsY3VsYXRlQ29tcG91bmRXZWlnaHQobm9kZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmaXhlZE5vZGVXZWlnaHQ7XG4gIH07XG5cbiAgaWYgKHRoaXMuY29uc3RyYWludHMuZml4ZWROb2RlQ29uc3RyYWludCkge1xuICAgIC8vIGZpbGwgZml4ZWROb2RlU2V0XG4gICAgdGhpcy5jb25zdHJhaW50cy5maXhlZE5vZGVDb25zdHJhaW50LmZvckVhY2goZnVuY3Rpb24gKG5vZGVEYXRhKSB7XG4gICAgICBzZWxmLmZpeGVkTm9kZVNldC5hZGQobm9kZURhdGEubm9kZUlkKTtcbiAgICB9KTtcblxuICAgIC8vIGFzc2lnbiBmaXhlZCBub2RlIHdlaWdodHMgdG8gY29tcG91bmRzIGlmIHRoZXkgY29udGFpbiBmaXhlZCBub2Rlc1xuICAgIHZhciBhbGxOb2RlcyA9IHRoaXMuZ3JhcGhNYW5hZ2VyLmdldEFsbE5vZGVzKCk7XG4gICAgdmFyIG5vZGU7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBub2RlID0gYWxsTm9kZXNbaV07XG4gICAgICBpZiAobm9kZS5nZXRDaGlsZCgpICE9IG51bGwpIHtcbiAgICAgICAgdmFyIGZpeGVkTm9kZVdlaWdodCA9IGNhbGN1bGF0ZUNvbXBvdW5kV2VpZ2h0KG5vZGUpO1xuICAgICAgICBpZiAoZml4ZWROb2RlV2VpZ2h0ID4gMCkge1xuICAgICAgICAgIG5vZGUuZml4ZWROb2RlV2VpZ2h0ID0gZml4ZWROb2RlV2VpZ2h0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHRoaXMuY29uc3RyYWludHMucmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50KSB7XG4gICAgdmFyIG5vZGVUb0R1bW15Rm9yVmVydGljYWxBbGlnbm1lbnQgPSBuZXcgTWFwKCk7XG4gICAgdmFyIG5vZGVUb0R1bW15Rm9ySG9yaXpvbnRhbEFsaWdubWVudCA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLmR1bW15VG9Ob2RlRm9yVmVydGljYWxBbGlnbm1lbnQgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5kdW1teVRvTm9kZUZvckhvcml6b250YWxBbGlnbm1lbnQgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5maXhlZE5vZGVzT25Ib3Jpem9udGFsID0gbmV3IFNldCgpO1xuICAgIHRoaXMuZml4ZWROb2Rlc09uVmVydGljYWwgPSBuZXcgU2V0KCk7XG5cbiAgICAvLyBmaWxsIG1hcHMgYW5kIHNldHNcbiAgICB0aGlzLmZpeGVkTm9kZVNldC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgIHNlbGYuZml4ZWROb2Rlc09uSG9yaXpvbnRhbC5hZGQobm9kZUlkKTtcbiAgICAgIHNlbGYuZml4ZWROb2Rlc09uVmVydGljYWwuYWRkKG5vZGVJZCk7XG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5jb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50KSB7XG4gICAgICBpZiAodGhpcy5jb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50LnZlcnRpY2FsKSB7XG4gICAgICAgIHZhciB2ZXJ0aWNhbEFsaWdubWVudCA9IHRoaXMuY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludC52ZXJ0aWNhbDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2ZXJ0aWNhbEFsaWdubWVudC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHRoaXMuZHVtbXlUb05vZGVGb3JWZXJ0aWNhbEFsaWdubWVudC5zZXQoXCJkdW1teVwiICsgaSwgW10pO1xuICAgICAgICAgIHZlcnRpY2FsQWxpZ25tZW50W2ldLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgbm9kZVRvRHVtbXlGb3JWZXJ0aWNhbEFsaWdubWVudC5zZXQobm9kZUlkLCBcImR1bW15XCIgKyBpKTtcbiAgICAgICAgICAgIHNlbGYuZHVtbXlUb05vZGVGb3JWZXJ0aWNhbEFsaWdubWVudC5nZXQoXCJkdW1teVwiICsgaSkucHVzaChub2RlSWQpO1xuICAgICAgICAgICAgaWYgKHNlbGYuZml4ZWROb2RlU2V0Lmhhcyhub2RlSWQpKSB7XG4gICAgICAgICAgICAgIHNlbGYuZml4ZWROb2Rlc09uSG9yaXpvbnRhbC5hZGQoXCJkdW1teVwiICsgaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQuaG9yaXpvbnRhbCkge1xuICAgICAgICB2YXIgaG9yaXpvbnRhbEFsaWdubWVudCA9IHRoaXMuY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludC5ob3Jpem9udGFsO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhvcml6b250YWxBbGlnbm1lbnQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB0aGlzLmR1bW15VG9Ob2RlRm9ySG9yaXpvbnRhbEFsaWdubWVudC5zZXQoXCJkdW1teVwiICsgaSwgW10pO1xuICAgICAgICAgIGhvcml6b250YWxBbGlnbm1lbnRbaV0uZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICBub2RlVG9EdW1teUZvckhvcml6b250YWxBbGlnbm1lbnQuc2V0KG5vZGVJZCwgXCJkdW1teVwiICsgaSk7XG4gICAgICAgICAgICBzZWxmLmR1bW15VG9Ob2RlRm9ySG9yaXpvbnRhbEFsaWdubWVudC5nZXQoXCJkdW1teVwiICsgaSkucHVzaChub2RlSWQpO1xuICAgICAgICAgICAgaWYgKHNlbGYuZml4ZWROb2RlU2V0Lmhhcyhub2RlSWQpKSB7XG4gICAgICAgICAgICAgIHNlbGYuZml4ZWROb2Rlc09uVmVydGljYWwuYWRkKFwiZHVtbXlcIiArIGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKENvU0VDb25zdGFudHMuUkVMQVhfTU9WRU1FTlRfT05fQ09OU1RSQUlOVFMpIHtcblxuICAgICAgdGhpcy5zaHVmZmxlID0gZnVuY3Rpb24gKGFycmF5KSB7XG4gICAgICAgIHZhciBqLCB4LCBpO1xuICAgICAgICBmb3IgKGkgPSBhcnJheS5sZW5ndGggLSAxOyBpID49IDIgKiBhcnJheS5sZW5ndGggLyAzOyBpLS0pIHtcbiAgICAgICAgICBqID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKGkgKyAxKSk7XG4gICAgICAgICAgeCA9IGFycmF5W2ldO1xuICAgICAgICAgIGFycmF5W2ldID0gYXJyYXlbal07XG4gICAgICAgICAgYXJyYXlbal0gPSB4O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcnJheTtcbiAgICAgIH07XG5cbiAgICAgIHRoaXMubm9kZXNJblJlbGF0aXZlSG9yaXpvbnRhbCA9IFtdO1xuICAgICAgdGhpcy5ub2Rlc0luUmVsYXRpdmVWZXJ0aWNhbCA9IFtdO1xuICAgICAgdGhpcy5ub2RlVG9SZWxhdGl2ZUNvbnN0cmFpbnRNYXBIb3Jpem9udGFsID0gbmV3IE1hcCgpO1xuICAgICAgdGhpcy5ub2RlVG9SZWxhdGl2ZUNvbnN0cmFpbnRNYXBWZXJ0aWNhbCA9IG5ldyBNYXAoKTtcbiAgICAgIHRoaXMubm9kZVRvVGVtcFBvc2l0aW9uTWFwSG9yaXpvbnRhbCA9IG5ldyBNYXAoKTtcbiAgICAgIHRoaXMubm9kZVRvVGVtcFBvc2l0aW9uTWFwVmVydGljYWwgPSBuZXcgTWFwKCk7XG5cbiAgICAgIC8vIGZpbGwgYXJyYXlzIGFuZCBtYXBzXG4gICAgICB0aGlzLmNvbnN0cmFpbnRzLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludC5mb3JFYWNoKGZ1bmN0aW9uIChjb25zdHJhaW50KSB7XG4gICAgICAgIGlmIChjb25zdHJhaW50LmxlZnQpIHtcbiAgICAgICAgICB2YXIgbm9kZUlkTGVmdCA9IG5vZGVUb0R1bW15Rm9yVmVydGljYWxBbGlnbm1lbnQuaGFzKGNvbnN0cmFpbnQubGVmdCkgPyBub2RlVG9EdW1teUZvclZlcnRpY2FsQWxpZ25tZW50LmdldChjb25zdHJhaW50LmxlZnQpIDogY29uc3RyYWludC5sZWZ0O1xuICAgICAgICAgIHZhciBub2RlSWRSaWdodCA9IG5vZGVUb0R1bW15Rm9yVmVydGljYWxBbGlnbm1lbnQuaGFzKGNvbnN0cmFpbnQucmlnaHQpID8gbm9kZVRvRHVtbXlGb3JWZXJ0aWNhbEFsaWdubWVudC5nZXQoY29uc3RyYWludC5yaWdodCkgOiBjb25zdHJhaW50LnJpZ2h0O1xuXG4gICAgICAgICAgaWYgKCFzZWxmLm5vZGVzSW5SZWxhdGl2ZUhvcml6b250YWwuaW5jbHVkZXMobm9kZUlkTGVmdCkpIHtcbiAgICAgICAgICAgIHNlbGYubm9kZXNJblJlbGF0aXZlSG9yaXpvbnRhbC5wdXNoKG5vZGVJZExlZnQpO1xuICAgICAgICAgICAgc2VsZi5ub2RlVG9SZWxhdGl2ZUNvbnN0cmFpbnRNYXBIb3Jpem9udGFsLnNldChub2RlSWRMZWZ0LCBbXSk7XG4gICAgICAgICAgICBpZiAoc2VsZi5kdW1teVRvTm9kZUZvclZlcnRpY2FsQWxpZ25tZW50Lmhhcyhub2RlSWRMZWZ0KSkge1xuICAgICAgICAgICAgICBzZWxmLm5vZGVUb1RlbXBQb3NpdGlvbk1hcEhvcml6b250YWwuc2V0KG5vZGVJZExlZnQsIHNlbGYuaWRUb05vZGVNYXAuZ2V0KHNlbGYuZHVtbXlUb05vZGVGb3JWZXJ0aWNhbEFsaWdubWVudC5nZXQobm9kZUlkTGVmdClbMF0pLmdldENlbnRlclgoKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzZWxmLm5vZGVUb1RlbXBQb3NpdGlvbk1hcEhvcml6b250YWwuc2V0KG5vZGVJZExlZnQsIHNlbGYuaWRUb05vZGVNYXAuZ2V0KG5vZGVJZExlZnQpLmdldENlbnRlclgoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghc2VsZi5ub2Rlc0luUmVsYXRpdmVIb3Jpem9udGFsLmluY2x1ZGVzKG5vZGVJZFJpZ2h0KSkge1xuICAgICAgICAgICAgc2VsZi5ub2Rlc0luUmVsYXRpdmVIb3Jpem9udGFsLnB1c2gobm9kZUlkUmlnaHQpO1xuICAgICAgICAgICAgc2VsZi5ub2RlVG9SZWxhdGl2ZUNvbnN0cmFpbnRNYXBIb3Jpem9udGFsLnNldChub2RlSWRSaWdodCwgW10pO1xuICAgICAgICAgICAgaWYgKHNlbGYuZHVtbXlUb05vZGVGb3JWZXJ0aWNhbEFsaWdubWVudC5oYXMobm9kZUlkUmlnaHQpKSB7XG4gICAgICAgICAgICAgIHNlbGYubm9kZVRvVGVtcFBvc2l0aW9uTWFwSG9yaXpvbnRhbC5zZXQobm9kZUlkUmlnaHQsIHNlbGYuaWRUb05vZGVNYXAuZ2V0KHNlbGYuZHVtbXlUb05vZGVGb3JWZXJ0aWNhbEFsaWdubWVudC5nZXQobm9kZUlkUmlnaHQpWzBdKS5nZXRDZW50ZXJYKCkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc2VsZi5ub2RlVG9UZW1wUG9zaXRpb25NYXBIb3Jpem9udGFsLnNldChub2RlSWRSaWdodCwgc2VsZi5pZFRvTm9kZU1hcC5nZXQobm9kZUlkUmlnaHQpLmdldENlbnRlclgoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2VsZi5ub2RlVG9SZWxhdGl2ZUNvbnN0cmFpbnRNYXBIb3Jpem9udGFsLmdldChub2RlSWRMZWZ0KS5wdXNoKHsgcmlnaHQ6IG5vZGVJZFJpZ2h0LCBnYXA6IGNvbnN0cmFpbnQuZ2FwIH0pO1xuICAgICAgICAgIHNlbGYubm9kZVRvUmVsYXRpdmVDb25zdHJhaW50TWFwSG9yaXpvbnRhbC5nZXQobm9kZUlkUmlnaHQpLnB1c2goeyBsZWZ0OiBub2RlSWRMZWZ0LCBnYXA6IGNvbnN0cmFpbnQuZ2FwIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBub2RlSWRUb3AgPSBub2RlVG9EdW1teUZvckhvcml6b250YWxBbGlnbm1lbnQuaGFzKGNvbnN0cmFpbnQudG9wKSA/IG5vZGVUb0R1bW15Rm9ySG9yaXpvbnRhbEFsaWdubWVudC5nZXQoY29uc3RyYWludC50b3ApIDogY29uc3RyYWludC50b3A7XG4gICAgICAgICAgdmFyIG5vZGVJZEJvdHRvbSA9IG5vZGVUb0R1bW15Rm9ySG9yaXpvbnRhbEFsaWdubWVudC5oYXMoY29uc3RyYWludC5ib3R0b20pID8gbm9kZVRvRHVtbXlGb3JIb3Jpem9udGFsQWxpZ25tZW50LmdldChjb25zdHJhaW50LmJvdHRvbSkgOiBjb25zdHJhaW50LmJvdHRvbTtcblxuICAgICAgICAgIGlmICghc2VsZi5ub2Rlc0luUmVsYXRpdmVWZXJ0aWNhbC5pbmNsdWRlcyhub2RlSWRUb3ApKSB7XG4gICAgICAgICAgICBzZWxmLm5vZGVzSW5SZWxhdGl2ZVZlcnRpY2FsLnB1c2gobm9kZUlkVG9wKTtcbiAgICAgICAgICAgIHNlbGYubm9kZVRvUmVsYXRpdmVDb25zdHJhaW50TWFwVmVydGljYWwuc2V0KG5vZGVJZFRvcCwgW10pO1xuICAgICAgICAgICAgaWYgKHNlbGYuZHVtbXlUb05vZGVGb3JIb3Jpem9udGFsQWxpZ25tZW50Lmhhcyhub2RlSWRUb3ApKSB7XG4gICAgICAgICAgICAgIHNlbGYubm9kZVRvVGVtcFBvc2l0aW9uTWFwVmVydGljYWwuc2V0KG5vZGVJZFRvcCwgc2VsZi5pZFRvTm9kZU1hcC5nZXQoc2VsZi5kdW1teVRvTm9kZUZvckhvcml6b250YWxBbGlnbm1lbnQuZ2V0KG5vZGVJZFRvcClbMF0pLmdldENlbnRlclkoKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzZWxmLm5vZGVUb1RlbXBQb3NpdGlvbk1hcFZlcnRpY2FsLnNldChub2RlSWRUb3AsIHNlbGYuaWRUb05vZGVNYXAuZ2V0KG5vZGVJZFRvcCkuZ2V0Q2VudGVyWSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFzZWxmLm5vZGVzSW5SZWxhdGl2ZVZlcnRpY2FsLmluY2x1ZGVzKG5vZGVJZEJvdHRvbSkpIHtcbiAgICAgICAgICAgIHNlbGYubm9kZXNJblJlbGF0aXZlVmVydGljYWwucHVzaChub2RlSWRCb3R0b20pO1xuICAgICAgICAgICAgc2VsZi5ub2RlVG9SZWxhdGl2ZUNvbnN0cmFpbnRNYXBWZXJ0aWNhbC5zZXQobm9kZUlkQm90dG9tLCBbXSk7XG4gICAgICAgICAgICBpZiAoc2VsZi5kdW1teVRvTm9kZUZvckhvcml6b250YWxBbGlnbm1lbnQuaGFzKG5vZGVJZEJvdHRvbSkpIHtcbiAgICAgICAgICAgICAgc2VsZi5ub2RlVG9UZW1wUG9zaXRpb25NYXBWZXJ0aWNhbC5zZXQobm9kZUlkQm90dG9tLCBzZWxmLmlkVG9Ob2RlTWFwLmdldChzZWxmLmR1bW15VG9Ob2RlRm9ySG9yaXpvbnRhbEFsaWdubWVudC5nZXQobm9kZUlkQm90dG9tKVswXSkuZ2V0Q2VudGVyWSgpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNlbGYubm9kZVRvVGVtcFBvc2l0aW9uTWFwVmVydGljYWwuc2V0KG5vZGVJZEJvdHRvbSwgc2VsZi5pZFRvTm9kZU1hcC5nZXQobm9kZUlkQm90dG9tKS5nZXRDZW50ZXJZKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBzZWxmLm5vZGVUb1JlbGF0aXZlQ29uc3RyYWludE1hcFZlcnRpY2FsLmdldChub2RlSWRUb3ApLnB1c2goeyBib3R0b206IG5vZGVJZEJvdHRvbSwgZ2FwOiBjb25zdHJhaW50LmdhcCB9KTtcbiAgICAgICAgICBzZWxmLm5vZGVUb1JlbGF0aXZlQ29uc3RyYWludE1hcFZlcnRpY2FsLmdldChub2RlSWRCb3R0b20pLnB1c2goeyB0b3A6IG5vZGVJZFRvcCwgZ2FwOiBjb25zdHJhaW50LmdhcCB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBzdWJHcmFwaE9uSG9yaXpvbnRhbCA9IG5ldyBNYXAoKTsgLy8gc3ViZ3JhcGggZnJvbSB2ZXJ0aWNhbCBSUCBjb25zdHJhaW50c1xuICAgICAgdmFyIHN1YkdyYXBoT25WZXJ0aWNhbCA9IG5ldyBNYXAoKTsgLy8gc3ViZ3JhcGggZnJvbSB2ZXJ0aWNhbCBSUCBjb25zdHJhaW50c1xuXG4gICAgICAvLyBjb25zdHJ1Y3Qgc3ViZ3JhcGhzIGZyb20gcmVsYXRpdmUgcGxhY2VtZW50IGNvbnN0cmFpbnRzIFxuICAgICAgdGhpcy5jb25zdHJhaW50cy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQuZm9yRWFjaChmdW5jdGlvbiAoY29uc3RyYWludCkge1xuICAgICAgICBpZiAoY29uc3RyYWludC5sZWZ0KSB7XG4gICAgICAgICAgdmFyIGxlZnQgPSBub2RlVG9EdW1teUZvclZlcnRpY2FsQWxpZ25tZW50Lmhhcyhjb25zdHJhaW50LmxlZnQpID8gbm9kZVRvRHVtbXlGb3JWZXJ0aWNhbEFsaWdubWVudC5nZXQoY29uc3RyYWludC5sZWZ0KSA6IGNvbnN0cmFpbnQubGVmdDtcbiAgICAgICAgICB2YXIgcmlnaHQgPSBub2RlVG9EdW1teUZvclZlcnRpY2FsQWxpZ25tZW50Lmhhcyhjb25zdHJhaW50LnJpZ2h0KSA/IG5vZGVUb0R1bW15Rm9yVmVydGljYWxBbGlnbm1lbnQuZ2V0KGNvbnN0cmFpbnQucmlnaHQpIDogY29uc3RyYWludC5yaWdodDtcbiAgICAgICAgICBpZiAoc3ViR3JhcGhPbkhvcml6b250YWwuaGFzKGxlZnQpKSB7XG4gICAgICAgICAgICBzdWJHcmFwaE9uSG9yaXpvbnRhbC5nZXQobGVmdCkucHVzaChyaWdodCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN1YkdyYXBoT25Ib3Jpem9udGFsLnNldChsZWZ0LCBbcmlnaHRdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHN1YkdyYXBoT25Ib3Jpem9udGFsLmhhcyhyaWdodCkpIHtcbiAgICAgICAgICAgIHN1YkdyYXBoT25Ib3Jpem9udGFsLmdldChyaWdodCkucHVzaChsZWZ0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3ViR3JhcGhPbkhvcml6b250YWwuc2V0KHJpZ2h0LCBbbGVmdF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgdG9wID0gbm9kZVRvRHVtbXlGb3JIb3Jpem9udGFsQWxpZ25tZW50Lmhhcyhjb25zdHJhaW50LnRvcCkgPyBub2RlVG9EdW1teUZvckhvcml6b250YWxBbGlnbm1lbnQuZ2V0KGNvbnN0cmFpbnQudG9wKSA6IGNvbnN0cmFpbnQudG9wO1xuICAgICAgICAgIHZhciBib3R0b20gPSBub2RlVG9EdW1teUZvckhvcml6b250YWxBbGlnbm1lbnQuaGFzKGNvbnN0cmFpbnQuYm90dG9tKSA/IG5vZGVUb0R1bW15Rm9ySG9yaXpvbnRhbEFsaWdubWVudC5nZXQoY29uc3RyYWludC5ib3R0b20pIDogY29uc3RyYWludC5ib3R0b207XG4gICAgICAgICAgaWYgKHN1YkdyYXBoT25WZXJ0aWNhbC5oYXModG9wKSkge1xuICAgICAgICAgICAgc3ViR3JhcGhPblZlcnRpY2FsLmdldCh0b3ApLnB1c2goYm90dG9tKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3ViR3JhcGhPblZlcnRpY2FsLnNldCh0b3AsIFtib3R0b21dKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHN1YkdyYXBoT25WZXJ0aWNhbC5oYXMoYm90dG9tKSkge1xuICAgICAgICAgICAgc3ViR3JhcGhPblZlcnRpY2FsLmdldChib3R0b20pLnB1c2godG9wKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3ViR3JhcGhPblZlcnRpY2FsLnNldChib3R0b20sIFt0b3BdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBmdW5jdGlvbiB0byBjb25zdHJ1Y3QgY29tcG9uZW50cyBmcm9tIGEgZ2l2ZW4gZ3JhcGggXG4gICAgICAvLyBhbHNvIHJldHVybnMgYW4gYXJyYXkgdGhhdCBrZWVwcyB3aGV0aGVyIGVhY2ggY29tcG9uZW50IGNvbnRhaW5zIGZpeGVkIG5vZGVcbiAgICAgIHZhciBjb25zdHJ1Y3RDb21wb25lbnRzID0gZnVuY3Rpb24gY29uc3RydWN0Q29tcG9uZW50cyhncmFwaCwgZml4ZWROb2Rlcykge1xuICAgICAgICB2YXIgY29tcG9uZW50cyA9IFtdO1xuICAgICAgICB2YXIgaXNGaXhlZCA9IFtdO1xuICAgICAgICB2YXIgcXVldWUgPSBuZXcgTGlua2VkTGlzdCgpO1xuICAgICAgICB2YXIgdmlzaXRlZCA9IG5ldyBTZXQoKTtcbiAgICAgICAgdmFyIGNvdW50ID0gMDtcblxuICAgICAgICBncmFwaC5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICAgICAgaWYgKCF2aXNpdGVkLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICBjb21wb25lbnRzW2NvdW50XSA9IFtdO1xuICAgICAgICAgICAgaXNGaXhlZFtjb3VudF0gPSBmYWxzZTtcbiAgICAgICAgICAgIHZhciBjdXJyZW50Tm9kZSA9IGtleTtcbiAgICAgICAgICAgIHF1ZXVlLnB1c2goY3VycmVudE5vZGUpO1xuICAgICAgICAgICAgdmlzaXRlZC5hZGQoY3VycmVudE5vZGUpO1xuICAgICAgICAgICAgY29tcG9uZW50c1tjb3VudF0ucHVzaChjdXJyZW50Tm9kZSk7XG5cbiAgICAgICAgICAgIHdoaWxlIChxdWV1ZS5sZW5ndGggIT0gMCkge1xuICAgICAgICAgICAgICBjdXJyZW50Tm9kZSA9IHF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICAgIGlmIChmaXhlZE5vZGVzLmhhcyhjdXJyZW50Tm9kZSkpIHtcbiAgICAgICAgICAgICAgICBpc0ZpeGVkW2NvdW50XSA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdmFyIG5laWdoYm9ycyA9IGdyYXBoLmdldChjdXJyZW50Tm9kZSk7XG4gICAgICAgICAgICAgIG5laWdoYm9ycy5mb3JFYWNoKGZ1bmN0aW9uIChuZWlnaGJvcikge1xuICAgICAgICAgICAgICAgIGlmICghdmlzaXRlZC5oYXMobmVpZ2hib3IpKSB7XG4gICAgICAgICAgICAgICAgICBxdWV1ZS5wdXNoKG5laWdoYm9yKTtcbiAgICAgICAgICAgICAgICAgIHZpc2l0ZWQuYWRkKG5laWdoYm9yKTtcbiAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHNbY291bnRdLnB1c2gobmVpZ2hib3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb3VudCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHsgY29tcG9uZW50czogY29tcG9uZW50cywgaXNGaXhlZDogaXNGaXhlZCB9O1xuICAgICAgfTtcblxuICAgICAgdmFyIHJlc3VsdE9uSG9yaXpvbnRhbCA9IGNvbnN0cnVjdENvbXBvbmVudHMoc3ViR3JhcGhPbkhvcml6b250YWwsIHNlbGYuZml4ZWROb2Rlc09uSG9yaXpvbnRhbCk7XG4gICAgICB0aGlzLmNvbXBvbmVudHNPbkhvcml6b250YWwgPSByZXN1bHRPbkhvcml6b250YWwuY29tcG9uZW50cztcbiAgICAgIHRoaXMuZml4ZWRDb21wb25lbnRzT25Ib3Jpem9udGFsID0gcmVzdWx0T25Ib3Jpem9udGFsLmlzRml4ZWQ7XG4gICAgICB2YXIgcmVzdWx0T25WZXJ0aWNhbCA9IGNvbnN0cnVjdENvbXBvbmVudHMoc3ViR3JhcGhPblZlcnRpY2FsLCBzZWxmLmZpeGVkTm9kZXNPblZlcnRpY2FsKTtcbiAgICAgIHRoaXMuY29tcG9uZW50c09uVmVydGljYWwgPSByZXN1bHRPblZlcnRpY2FsLmNvbXBvbmVudHM7XG4gICAgICB0aGlzLmZpeGVkQ29tcG9uZW50c09uVmVydGljYWwgPSByZXN1bHRPblZlcnRpY2FsLmlzRml4ZWQ7XG4gICAgfVxuICB9XG59O1xuXG4vLyB1cGRhdGVzIG5vZGUgZGlzcGxhY2VtZW50cyBiYXNlZCBvbiBjb25zdHJhaW50c1xuQ29TRUxheW91dC5wcm90b3R5cGUudXBkYXRlRGlzcGxhY2VtZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBpZiAodGhpcy5jb25zdHJhaW50cy5maXhlZE5vZGVDb25zdHJhaW50KSB7XG4gICAgdGhpcy5jb25zdHJhaW50cy5maXhlZE5vZGVDb25zdHJhaW50LmZvckVhY2goZnVuY3Rpb24gKG5vZGVEYXRhKSB7XG4gICAgICB2YXIgZml4ZWROb2RlID0gc2VsZi5pZFRvTm9kZU1hcC5nZXQobm9kZURhdGEubm9kZUlkKTtcbiAgICAgIGZpeGVkTm9kZS5kaXNwbGFjZW1lbnRYID0gMDtcbiAgICAgIGZpeGVkTm9kZS5kaXNwbGFjZW1lbnRZID0gMDtcbiAgICB9KTtcbiAgfVxuXG4gIGlmICh0aGlzLmNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQpIHtcbiAgICBpZiAodGhpcy5jb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50LnZlcnRpY2FsKSB7XG4gICAgICB2YXIgYWxsVmVydGljYWxBbGlnbm1lbnRzID0gdGhpcy5jb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50LnZlcnRpY2FsO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbGxWZXJ0aWNhbEFsaWdubWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHRvdGFsRGlzcGxhY2VtZW50WCA9IDA7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgYWxsVmVydGljYWxBbGlnbm1lbnRzW2ldLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgaWYgKHRoaXMuZml4ZWROb2RlU2V0LmhhcyhhbGxWZXJ0aWNhbEFsaWdubWVudHNbaV1bal0pKSB7XG4gICAgICAgICAgICB0b3RhbERpc3BsYWNlbWVudFggPSAwO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRvdGFsRGlzcGxhY2VtZW50WCArPSB0aGlzLmlkVG9Ob2RlTWFwLmdldChhbGxWZXJ0aWNhbEFsaWdubWVudHNbaV1bal0pLmRpc3BsYWNlbWVudFg7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGF2ZXJhZ2VEaXNwbGFjZW1lbnRYID0gdG90YWxEaXNwbGFjZW1lbnRYIC8gYWxsVmVydGljYWxBbGlnbm1lbnRzW2ldLmxlbmd0aDtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBhbGxWZXJ0aWNhbEFsaWdubWVudHNbaV0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICB0aGlzLmlkVG9Ob2RlTWFwLmdldChhbGxWZXJ0aWNhbEFsaWdubWVudHNbaV1bal0pLmRpc3BsYWNlbWVudFggPSBhdmVyYWdlRGlzcGxhY2VtZW50WDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5jb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50Lmhvcml6b250YWwpIHtcbiAgICAgIHZhciBhbGxIb3Jpem9udGFsQWxpZ25tZW50cyA9IHRoaXMuY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludC5ob3Jpem9udGFsO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbGxIb3Jpem9udGFsQWxpZ25tZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgdG90YWxEaXNwbGFjZW1lbnRZID0gMDtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBhbGxIb3Jpem9udGFsQWxpZ25tZW50c1tpXS5sZW5ndGg7IGorKykge1xuICAgICAgICAgIGlmICh0aGlzLmZpeGVkTm9kZVNldC5oYXMoYWxsSG9yaXpvbnRhbEFsaWdubWVudHNbaV1bal0pKSB7XG4gICAgICAgICAgICB0b3RhbERpc3BsYWNlbWVudFkgPSAwO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRvdGFsRGlzcGxhY2VtZW50WSArPSB0aGlzLmlkVG9Ob2RlTWFwLmdldChhbGxIb3Jpem9udGFsQWxpZ25tZW50c1tpXVtqXSkuZGlzcGxhY2VtZW50WTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYXZlcmFnZURpc3BsYWNlbWVudFkgPSB0b3RhbERpc3BsYWNlbWVudFkgLyBhbGxIb3Jpem9udGFsQWxpZ25tZW50c1tpXS5sZW5ndGg7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgYWxsSG9yaXpvbnRhbEFsaWdubWVudHNbaV0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICB0aGlzLmlkVG9Ob2RlTWFwLmdldChhbGxIb3Jpem9udGFsQWxpZ25tZW50c1tpXVtqXSkuZGlzcGxhY2VtZW50WSA9IGF2ZXJhZ2VEaXNwbGFjZW1lbnRZO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHRoaXMuY29uc3RyYWludHMucmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50KSB7XG5cbiAgICBpZiAoQ29TRUNvbnN0YW50cy5SRUxBWF9NT1ZFTUVOVF9PTl9DT05TVFJBSU5UUykge1xuICAgICAgLy8gc2h1ZmZsZSBhcnJheSB0byByYW5kb21pemUgbm9kZSBwcm9jZXNzaW5nIG9yZGVyXG4gICAgICBpZiAodGhpcy50b3RhbEl0ZXJhdGlvbnMgJSAxMCA9PSAwKSB7XG4gICAgICAgIHRoaXMuc2h1ZmZsZSh0aGlzLm5vZGVzSW5SZWxhdGl2ZUhvcml6b250YWwpO1xuICAgICAgICB0aGlzLnNodWZmbGUodGhpcy5ub2Rlc0luUmVsYXRpdmVWZXJ0aWNhbCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubm9kZXNJblJlbGF0aXZlSG9yaXpvbnRhbC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgaWYgKCFzZWxmLmZpeGVkTm9kZXNPbkhvcml6b250YWwuaGFzKG5vZGVJZCkpIHtcbiAgICAgICAgICB2YXIgZGlzcGxhY2VtZW50ID0gMDtcbiAgICAgICAgICBpZiAoc2VsZi5kdW1teVRvTm9kZUZvclZlcnRpY2FsQWxpZ25tZW50Lmhhcyhub2RlSWQpKSB7XG4gICAgICAgICAgICBkaXNwbGFjZW1lbnQgPSBzZWxmLmlkVG9Ob2RlTWFwLmdldChzZWxmLmR1bW15VG9Ob2RlRm9yVmVydGljYWxBbGlnbm1lbnQuZ2V0KG5vZGVJZClbMF0pLmRpc3BsYWNlbWVudFg7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRpc3BsYWNlbWVudCA9IHNlbGYuaWRUb05vZGVNYXAuZ2V0KG5vZGVJZCkuZGlzcGxhY2VtZW50WDtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2VsZi5ub2RlVG9SZWxhdGl2ZUNvbnN0cmFpbnRNYXBIb3Jpem9udGFsLmdldChub2RlSWQpLmZvckVhY2goZnVuY3Rpb24gKGNvbnN0cmFpbnQpIHtcbiAgICAgICAgICAgIGlmIChjb25zdHJhaW50LnJpZ2h0KSB7XG4gICAgICAgICAgICAgIHZhciBkaWZmID0gc2VsZi5ub2RlVG9UZW1wUG9zaXRpb25NYXBIb3Jpem9udGFsLmdldChjb25zdHJhaW50LnJpZ2h0KSAtIHNlbGYubm9kZVRvVGVtcFBvc2l0aW9uTWFwSG9yaXpvbnRhbC5nZXQobm9kZUlkKSAtIGRpc3BsYWNlbWVudDtcbiAgICAgICAgICAgICAgaWYgKGRpZmYgPCBjb25zdHJhaW50LmdhcCkge1xuICAgICAgICAgICAgICAgIGRpc3BsYWNlbWVudCAtPSBjb25zdHJhaW50LmdhcCAtIGRpZmY7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZhciBkaWZmID0gc2VsZi5ub2RlVG9UZW1wUG9zaXRpb25NYXBIb3Jpem9udGFsLmdldChub2RlSWQpIC0gc2VsZi5ub2RlVG9UZW1wUG9zaXRpb25NYXBIb3Jpem9udGFsLmdldChjb25zdHJhaW50LmxlZnQpICsgZGlzcGxhY2VtZW50O1xuICAgICAgICAgICAgICBpZiAoZGlmZiA8IGNvbnN0cmFpbnQuZ2FwKSB7XG4gICAgICAgICAgICAgICAgZGlzcGxhY2VtZW50ICs9IGNvbnN0cmFpbnQuZ2FwIC0gZGlmZjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHNlbGYubm9kZVRvVGVtcFBvc2l0aW9uTWFwSG9yaXpvbnRhbC5zZXQobm9kZUlkLCBzZWxmLm5vZGVUb1RlbXBQb3NpdGlvbk1hcEhvcml6b250YWwuZ2V0KG5vZGVJZCkgKyBkaXNwbGFjZW1lbnQpO1xuICAgICAgICAgIGlmIChzZWxmLmR1bW15VG9Ob2RlRm9yVmVydGljYWxBbGlnbm1lbnQuaGFzKG5vZGVJZCkpIHtcbiAgICAgICAgICAgIHNlbGYuZHVtbXlUb05vZGVGb3JWZXJ0aWNhbEFsaWdubWVudC5nZXQobm9kZUlkKS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgICAgc2VsZi5pZFRvTm9kZU1hcC5nZXQobm9kZUlkKS5kaXNwbGFjZW1lbnRYID0gZGlzcGxhY2VtZW50O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlbGYuaWRUb05vZGVNYXAuZ2V0KG5vZGVJZCkuZGlzcGxhY2VtZW50WCA9IGRpc3BsYWNlbWVudDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLm5vZGVzSW5SZWxhdGl2ZVZlcnRpY2FsLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICBpZiAoIXNlbGYuZml4ZWROb2Rlc09uSG9yaXpvbnRhbC5oYXMobm9kZUlkKSkge1xuICAgICAgICAgIHZhciBkaXNwbGFjZW1lbnQgPSAwO1xuICAgICAgICAgIGlmIChzZWxmLmR1bW15VG9Ob2RlRm9ySG9yaXpvbnRhbEFsaWdubWVudC5oYXMobm9kZUlkKSkge1xuICAgICAgICAgICAgZGlzcGxhY2VtZW50ID0gc2VsZi5pZFRvTm9kZU1hcC5nZXQoc2VsZi5kdW1teVRvTm9kZUZvckhvcml6b250YWxBbGlnbm1lbnQuZ2V0KG5vZGVJZClbMF0pLmRpc3BsYWNlbWVudFk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRpc3BsYWNlbWVudCA9IHNlbGYuaWRUb05vZGVNYXAuZ2V0KG5vZGVJZCkuZGlzcGxhY2VtZW50WTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2VsZi5ub2RlVG9SZWxhdGl2ZUNvbnN0cmFpbnRNYXBWZXJ0aWNhbC5nZXQobm9kZUlkKS5mb3JFYWNoKGZ1bmN0aW9uIChjb25zdHJhaW50KSB7XG4gICAgICAgICAgICBpZiAoY29uc3RyYWludC5ib3R0b20pIHtcbiAgICAgICAgICAgICAgdmFyIGRpZmYgPSBzZWxmLm5vZGVUb1RlbXBQb3NpdGlvbk1hcFZlcnRpY2FsLmdldChjb25zdHJhaW50LmJvdHRvbSkgLSBzZWxmLm5vZGVUb1RlbXBQb3NpdGlvbk1hcFZlcnRpY2FsLmdldChub2RlSWQpIC0gZGlzcGxhY2VtZW50O1xuICAgICAgICAgICAgICBpZiAoZGlmZiA8IGNvbnN0cmFpbnQuZ2FwKSB7XG4gICAgICAgICAgICAgICAgZGlzcGxhY2VtZW50IC09IGNvbnN0cmFpbnQuZ2FwIC0gZGlmZjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdmFyIGRpZmYgPSBzZWxmLm5vZGVUb1RlbXBQb3NpdGlvbk1hcFZlcnRpY2FsLmdldChub2RlSWQpIC0gc2VsZi5ub2RlVG9UZW1wUG9zaXRpb25NYXBWZXJ0aWNhbC5nZXQoY29uc3RyYWludC50b3ApICsgZGlzcGxhY2VtZW50O1xuICAgICAgICAgICAgICBpZiAoZGlmZiA8IGNvbnN0cmFpbnQuZ2FwKSB7XG4gICAgICAgICAgICAgICAgZGlzcGxhY2VtZW50ICs9IGNvbnN0cmFpbnQuZ2FwIC0gZGlmZjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHNlbGYubm9kZVRvVGVtcFBvc2l0aW9uTWFwVmVydGljYWwuc2V0KG5vZGVJZCwgc2VsZi5ub2RlVG9UZW1wUG9zaXRpb25NYXBWZXJ0aWNhbC5nZXQobm9kZUlkKSArIGRpc3BsYWNlbWVudCk7XG4gICAgICAgICAgaWYgKHNlbGYuZHVtbXlUb05vZGVGb3JIb3Jpem9udGFsQWxpZ25tZW50Lmhhcyhub2RlSWQpKSB7XG4gICAgICAgICAgICBzZWxmLmR1bW15VG9Ob2RlRm9ySG9yaXpvbnRhbEFsaWdubWVudC5nZXQobm9kZUlkKS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgICAgc2VsZi5pZFRvTm9kZU1hcC5nZXQobm9kZUlkKS5kaXNwbGFjZW1lbnRZID0gZGlzcGxhY2VtZW50O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlbGYuaWRUb05vZGVNYXAuZ2V0KG5vZGVJZCkuZGlzcGxhY2VtZW50WSA9IGRpc3BsYWNlbWVudDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29tcG9uZW50c09uSG9yaXpvbnRhbC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRzT25Ib3Jpem9udGFsW2ldO1xuICAgICAgICBpZiAodGhpcy5maXhlZENvbXBvbmVudHNPbkhvcml6b250YWxbaV0pIHtcbiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNvbXBvbmVudC5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuZHVtbXlUb05vZGVGb3JWZXJ0aWNhbEFsaWdubWVudC5oYXMoY29tcG9uZW50W2pdKSkge1xuICAgICAgICAgICAgICB0aGlzLmR1bW15VG9Ob2RlRm9yVmVydGljYWxBbGlnbm1lbnQuZ2V0KGNvbXBvbmVudFtqXSkuZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5pZFRvTm9kZU1hcC5nZXQobm9kZUlkKS5kaXNwbGFjZW1lbnRYID0gMDtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmlkVG9Ob2RlTWFwLmdldChjb21wb25lbnRbal0pLmRpc3BsYWNlbWVudFggPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgc3VtID0gMDtcbiAgICAgICAgICB2YXIgY291bnQgPSAwO1xuICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY29tcG9uZW50Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kdW1teVRvTm9kZUZvclZlcnRpY2FsQWxpZ25tZW50Lmhhcyhjb21wb25lbnRbal0pKSB7XG4gICAgICAgICAgICAgIHZhciBhY3R1YWxOb2RlcyA9IHRoaXMuZHVtbXlUb05vZGVGb3JWZXJ0aWNhbEFsaWdubWVudC5nZXQoY29tcG9uZW50W2pdKTtcbiAgICAgICAgICAgICAgc3VtICs9IGFjdHVhbE5vZGVzLmxlbmd0aCAqIHRoaXMuaWRUb05vZGVNYXAuZ2V0KGFjdHVhbE5vZGVzWzBdKS5kaXNwbGFjZW1lbnRYO1xuICAgICAgICAgICAgICBjb3VudCArPSBhY3R1YWxOb2Rlcy5sZW5ndGg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzdW0gKz0gdGhpcy5pZFRvTm9kZU1hcC5nZXQoY29tcG9uZW50W2pdKS5kaXNwbGFjZW1lbnRYO1xuICAgICAgICAgICAgICBjb3VudCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgYXZlcmFnZURpc3BsYWNlbWVudCA9IHN1bSAvIGNvdW50O1xuICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY29tcG9uZW50Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kdW1teVRvTm9kZUZvclZlcnRpY2FsQWxpZ25tZW50Lmhhcyhjb21wb25lbnRbal0pKSB7XG4gICAgICAgICAgICAgIHRoaXMuZHVtbXlUb05vZGVGb3JWZXJ0aWNhbEFsaWdubWVudC5nZXQoY29tcG9uZW50W2pdKS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgICAgICBzZWxmLmlkVG9Ob2RlTWFwLmdldChub2RlSWQpLmRpc3BsYWNlbWVudFggPSBhdmVyYWdlRGlzcGxhY2VtZW50O1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuaWRUb05vZGVNYXAuZ2V0KGNvbXBvbmVudFtqXSkuZGlzcGxhY2VtZW50WCA9IGF2ZXJhZ2VEaXNwbGFjZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb21wb25lbnRzT25WZXJ0aWNhbC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRzT25WZXJ0aWNhbFtpXTtcbiAgICAgICAgaWYgKHRoaXMuZml4ZWRDb21wb25lbnRzT25WZXJ0aWNhbFtpXSkge1xuICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY29tcG9uZW50Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kdW1teVRvTm9kZUZvckhvcml6b250YWxBbGlnbm1lbnQuaGFzKGNvbXBvbmVudFtqXSkpIHtcbiAgICAgICAgICAgICAgdGhpcy5kdW1teVRvTm9kZUZvckhvcml6b250YWxBbGlnbm1lbnQuZ2V0KGNvbXBvbmVudFtqXSkuZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5pZFRvTm9kZU1hcC5nZXQobm9kZUlkKS5kaXNwbGFjZW1lbnRZID0gMDtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmlkVG9Ob2RlTWFwLmdldChjb21wb25lbnRbal0pLmRpc3BsYWNlbWVudFkgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgc3VtID0gMDtcbiAgICAgICAgICB2YXIgY291bnQgPSAwO1xuICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY29tcG9uZW50Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kdW1teVRvTm9kZUZvckhvcml6b250YWxBbGlnbm1lbnQuaGFzKGNvbXBvbmVudFtqXSkpIHtcbiAgICAgICAgICAgICAgdmFyIGFjdHVhbE5vZGVzID0gdGhpcy5kdW1teVRvTm9kZUZvckhvcml6b250YWxBbGlnbm1lbnQuZ2V0KGNvbXBvbmVudFtqXSk7XG4gICAgICAgICAgICAgIHN1bSArPSBhY3R1YWxOb2Rlcy5sZW5ndGggKiB0aGlzLmlkVG9Ob2RlTWFwLmdldChhY3R1YWxOb2Rlc1swXSkuZGlzcGxhY2VtZW50WTtcbiAgICAgICAgICAgICAgY291bnQgKz0gYWN0dWFsTm9kZXMubGVuZ3RoO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc3VtICs9IHRoaXMuaWRUb05vZGVNYXAuZ2V0KGNvbXBvbmVudFtqXSkuZGlzcGxhY2VtZW50WTtcbiAgICAgICAgICAgICAgY291bnQrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIGF2ZXJhZ2VEaXNwbGFjZW1lbnQgPSBzdW0gLyBjb3VudDtcbiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNvbXBvbmVudC5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuZHVtbXlUb05vZGVGb3JIb3Jpem9udGFsQWxpZ25tZW50Lmhhcyhjb21wb25lbnRbal0pKSB7XG4gICAgICAgICAgICAgIHRoaXMuZHVtbXlUb05vZGVGb3JIb3Jpem9udGFsQWxpZ25tZW50LmdldChjb21wb25lbnRbal0pLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgICAgIHNlbGYuaWRUb05vZGVNYXAuZ2V0KG5vZGVJZCkuZGlzcGxhY2VtZW50WSA9IGF2ZXJhZ2VEaXNwbGFjZW1lbnQ7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5pZFRvTm9kZU1hcC5nZXQoY29tcG9uZW50W2pdKS5kaXNwbGFjZW1lbnRZID0gYXZlcmFnZURpc3BsYWNlbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLmNhbGN1bGF0ZU5vZGVzVG9BcHBseUdyYXZpdGF0aW9uVG8gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBub2RlTGlzdCA9IFtdO1xuICB2YXIgZ3JhcGg7XG5cbiAgdmFyIGdyYXBocyA9IHRoaXMuZ3JhcGhNYW5hZ2VyLmdldEdyYXBocygpO1xuICB2YXIgc2l6ZSA9IGdyYXBocy5sZW5ndGg7XG4gIHZhciBpO1xuICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgZ3JhcGggPSBncmFwaHNbaV07XG5cbiAgICBncmFwaC51cGRhdGVDb25uZWN0ZWQoKTtcblxuICAgIGlmICghZ3JhcGguaXNDb25uZWN0ZWQpIHtcbiAgICAgIG5vZGVMaXN0ID0gbm9kZUxpc3QuY29uY2F0KGdyYXBoLmdldE5vZGVzKCkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBub2RlTGlzdDtcbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLmNyZWF0ZUJlbmRwb2ludHMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBlZGdlcyA9IFtdO1xuICBlZGdlcyA9IGVkZ2VzLmNvbmNhdCh0aGlzLmdyYXBoTWFuYWdlci5nZXRBbGxFZGdlcygpKTtcbiAgdmFyIHZpc2l0ZWQgPSBuZXcgU2V0KCk7XG4gIHZhciBpO1xuICBmb3IgKGkgPSAwOyBpIDwgZWRnZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZWRnZSA9IGVkZ2VzW2ldO1xuXG4gICAgaWYgKCF2aXNpdGVkLmhhcyhlZGdlKSkge1xuICAgICAgdmFyIHNvdXJjZSA9IGVkZ2UuZ2V0U291cmNlKCk7XG4gICAgICB2YXIgdGFyZ2V0ID0gZWRnZS5nZXRUYXJnZXQoKTtcblxuICAgICAgaWYgKHNvdXJjZSA9PSB0YXJnZXQpIHtcbiAgICAgICAgZWRnZS5nZXRCZW5kcG9pbnRzKCkucHVzaChuZXcgUG9pbnREKCkpO1xuICAgICAgICBlZGdlLmdldEJlbmRwb2ludHMoKS5wdXNoKG5ldyBQb2ludEQoKSk7XG4gICAgICAgIHRoaXMuY3JlYXRlRHVtbXlOb2Rlc0ZvckJlbmRwb2ludHMoZWRnZSk7XG4gICAgICAgIHZpc2l0ZWQuYWRkKGVkZ2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGVkZ2VMaXN0ID0gW107XG5cbiAgICAgICAgZWRnZUxpc3QgPSBlZGdlTGlzdC5jb25jYXQoc291cmNlLmdldEVkZ2VMaXN0VG9Ob2RlKHRhcmdldCkpO1xuICAgICAgICBlZGdlTGlzdCA9IGVkZ2VMaXN0LmNvbmNhdCh0YXJnZXQuZ2V0RWRnZUxpc3RUb05vZGUoc291cmNlKSk7XG5cbiAgICAgICAgaWYgKCF2aXNpdGVkLmhhcyhlZGdlTGlzdFswXSkpIHtcbiAgICAgICAgICBpZiAoZWRnZUxpc3QubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgdmFyIGs7XG4gICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgZWRnZUxpc3QubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgdmFyIG11bHRpRWRnZSA9IGVkZ2VMaXN0W2tdO1xuICAgICAgICAgICAgICBtdWx0aUVkZ2UuZ2V0QmVuZHBvaW50cygpLnB1c2gobmV3IFBvaW50RCgpKTtcbiAgICAgICAgICAgICAgdGhpcy5jcmVhdGVEdW1teU5vZGVzRm9yQmVuZHBvaW50cyhtdWx0aUVkZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBlZGdlTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICAgICAgICB2aXNpdGVkLmFkZChlZGdlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh2aXNpdGVkLnNpemUgPT0gZWRnZXMubGVuZ3RoKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLnBvc2l0aW9uTm9kZXNSYWRpYWxseSA9IGZ1bmN0aW9uIChmb3Jlc3QpIHtcbiAgLy8gV2UgdGlsZSB0aGUgdHJlZXMgdG8gYSBncmlkIHJvdyBieSByb3c7IGZpcnN0IHRyZWUgc3RhcnRzIGF0ICgwLDApXG4gIHZhciBjdXJyZW50U3RhcnRpbmdQb2ludCA9IG5ldyBQb2ludCgwLCAwKTtcbiAgdmFyIG51bWJlck9mQ29sdW1ucyA9IE1hdGguY2VpbChNYXRoLnNxcnQoZm9yZXN0Lmxlbmd0aCkpO1xuICB2YXIgaGVpZ2h0ID0gMDtcbiAgdmFyIGN1cnJlbnRZID0gMDtcbiAgdmFyIGN1cnJlbnRYID0gMDtcbiAgdmFyIHBvaW50ID0gbmV3IFBvaW50RCgwLCAwKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGZvcmVzdC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChpICUgbnVtYmVyT2ZDb2x1bW5zID09IDApIHtcbiAgICAgIC8vIFN0YXJ0IG9mIGEgbmV3IHJvdywgbWFrZSB0aGUgeCBjb29yZGluYXRlIDAsIGluY3JlbWVudCB0aGVcbiAgICAgIC8vIHkgY29vcmRpbmF0ZSB3aXRoIHRoZSBtYXggaGVpZ2h0IG9mIHRoZSBwcmV2aW91cyByb3dcbiAgICAgIGN1cnJlbnRYID0gMDtcbiAgICAgIGN1cnJlbnRZID0gaGVpZ2h0O1xuXG4gICAgICBpZiAoaSAhPSAwKSB7XG4gICAgICAgIGN1cnJlbnRZICs9IENvU0VDb25zdGFudHMuREVGQVVMVF9DT01QT05FTlRfU0VQRVJBVElPTjtcbiAgICAgIH1cblxuICAgICAgaGVpZ2h0ID0gMDtcbiAgICB9XG5cbiAgICB2YXIgdHJlZSA9IGZvcmVzdFtpXTtcblxuICAgIC8vIEZpbmQgdGhlIGNlbnRlciBvZiB0aGUgdHJlZVxuICAgIHZhciBjZW50ZXJOb2RlID0gTGF5b3V0LmZpbmRDZW50ZXJPZlRyZWUodHJlZSk7XG5cbiAgICAvLyBTZXQgdGhlIHN0YXJpbmcgcG9pbnQgb2YgdGhlIG5leHQgdHJlZVxuICAgIGN1cnJlbnRTdGFydGluZ1BvaW50LnggPSBjdXJyZW50WDtcbiAgICBjdXJyZW50U3RhcnRpbmdQb2ludC55ID0gY3VycmVudFk7XG5cbiAgICAvLyBEbyBhIHJhZGlhbCBsYXlvdXQgc3RhcnRpbmcgd2l0aCB0aGUgY2VudGVyXG4gICAgcG9pbnQgPSBDb1NFTGF5b3V0LnJhZGlhbExheW91dCh0cmVlLCBjZW50ZXJOb2RlLCBjdXJyZW50U3RhcnRpbmdQb2ludCk7XG5cbiAgICBpZiAocG9pbnQueSA+IGhlaWdodCkge1xuICAgICAgaGVpZ2h0ID0gTWF0aC5mbG9vcihwb2ludC55KTtcbiAgICB9XG5cbiAgICBjdXJyZW50WCA9IE1hdGguZmxvb3IocG9pbnQueCArIENvU0VDb25zdGFudHMuREVGQVVMVF9DT01QT05FTlRfU0VQRVJBVElPTik7XG4gIH1cblxuICB0aGlzLnRyYW5zZm9ybShuZXcgUG9pbnREKExheW91dENvbnN0YW50cy5XT1JMRF9DRU5URVJfWCAtIHBvaW50LnggLyAyLCBMYXlvdXRDb25zdGFudHMuV09STERfQ0VOVEVSX1kgLSBwb2ludC55IC8gMikpO1xufTtcblxuQ29TRUxheW91dC5yYWRpYWxMYXlvdXQgPSBmdW5jdGlvbiAodHJlZSwgY2VudGVyTm9kZSwgc3RhcnRpbmdQb2ludCkge1xuICB2YXIgcmFkaWFsU2VwID0gTWF0aC5tYXgodGhpcy5tYXhEaWFnb25hbEluVHJlZSh0cmVlKSwgQ29TRUNvbnN0YW50cy5ERUZBVUxUX1JBRElBTF9TRVBBUkFUSU9OKTtcbiAgQ29TRUxheW91dC5icmFuY2hSYWRpYWxMYXlvdXQoY2VudGVyTm9kZSwgbnVsbCwgMCwgMzU5LCAwLCByYWRpYWxTZXApO1xuICB2YXIgYm91bmRzID0gTEdyYXBoLmNhbGN1bGF0ZUJvdW5kcyh0cmVlKTtcblxuICB2YXIgdHJhbnNmb3JtID0gbmV3IFRyYW5zZm9ybSgpO1xuICB0cmFuc2Zvcm0uc2V0RGV2aWNlT3JnWChib3VuZHMuZ2V0TWluWCgpKTtcbiAgdHJhbnNmb3JtLnNldERldmljZU9yZ1koYm91bmRzLmdldE1pblkoKSk7XG4gIHRyYW5zZm9ybS5zZXRXb3JsZE9yZ1goc3RhcnRpbmdQb2ludC54KTtcbiAgdHJhbnNmb3JtLnNldFdvcmxkT3JnWShzdGFydGluZ1BvaW50LnkpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdHJlZS5sZW5ndGg7IGkrKykge1xuICAgIHZhciBub2RlID0gdHJlZVtpXTtcbiAgICBub2RlLnRyYW5zZm9ybSh0cmFuc2Zvcm0pO1xuICB9XG5cbiAgdmFyIGJvdHRvbVJpZ2h0ID0gbmV3IFBvaW50RChib3VuZHMuZ2V0TWF4WCgpLCBib3VuZHMuZ2V0TWF4WSgpKTtcblxuICByZXR1cm4gdHJhbnNmb3JtLmludmVyc2VUcmFuc2Zvcm1Qb2ludChib3R0b21SaWdodCk7XG59O1xuXG5Db1NFTGF5b3V0LmJyYW5jaFJhZGlhbExheW91dCA9IGZ1bmN0aW9uIChub2RlLCBwYXJlbnRPZk5vZGUsIHN0YXJ0QW5nbGUsIGVuZEFuZ2xlLCBkaXN0YW5jZSwgcmFkaWFsU2VwYXJhdGlvbikge1xuICAvLyBGaXJzdCwgcG9zaXRpb24gdGhpcyBub2RlIGJ5IGZpbmRpbmcgaXRzIGFuZ2xlLlxuICB2YXIgaGFsZkludGVydmFsID0gKGVuZEFuZ2xlIC0gc3RhcnRBbmdsZSArIDEpIC8gMjtcblxuICBpZiAoaGFsZkludGVydmFsIDwgMCkge1xuICAgIGhhbGZJbnRlcnZhbCArPSAxODA7XG4gIH1cblxuICB2YXIgbm9kZUFuZ2xlID0gKGhhbGZJbnRlcnZhbCArIHN0YXJ0QW5nbGUpICUgMzYwO1xuICB2YXIgdGV0YSA9IG5vZGVBbmdsZSAqIElHZW9tZXRyeS5UV09fUEkgLyAzNjA7XG5cbiAgLy8gTWFrZSBwb2xhciB0byBqYXZhIGNvcmRpbmF0ZSBjb252ZXJzaW9uLlxuICB2YXIgY29zX3RldGEgPSBNYXRoLmNvcyh0ZXRhKTtcbiAgdmFyIHhfID0gZGlzdGFuY2UgKiBNYXRoLmNvcyh0ZXRhKTtcbiAgdmFyIHlfID0gZGlzdGFuY2UgKiBNYXRoLnNpbih0ZXRhKTtcblxuICBub2RlLnNldENlbnRlcih4XywgeV8pO1xuXG4gIC8vIFRyYXZlcnNlIGFsbCBuZWlnaGJvcnMgb2YgdGhpcyBub2RlIGFuZCByZWN1cnNpdmVseSBjYWxsIHRoaXNcbiAgLy8gZnVuY3Rpb24uXG4gIHZhciBuZWlnaGJvckVkZ2VzID0gW107XG4gIG5laWdoYm9yRWRnZXMgPSBuZWlnaGJvckVkZ2VzLmNvbmNhdChub2RlLmdldEVkZ2VzKCkpO1xuICB2YXIgY2hpbGRDb3VudCA9IG5laWdoYm9yRWRnZXMubGVuZ3RoO1xuXG4gIGlmIChwYXJlbnRPZk5vZGUgIT0gbnVsbCkge1xuICAgIGNoaWxkQ291bnQtLTtcbiAgfVxuXG4gIHZhciBicmFuY2hDb3VudCA9IDA7XG5cbiAgdmFyIGluY0VkZ2VzQ291bnQgPSBuZWlnaGJvckVkZ2VzLmxlbmd0aDtcbiAgdmFyIHN0YXJ0SW5kZXg7XG5cbiAgdmFyIGVkZ2VzID0gbm9kZS5nZXRFZGdlc0JldHdlZW4ocGFyZW50T2ZOb2RlKTtcblxuICAvLyBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgZWRnZXMsIHBydW5lIHRoZW0gdW50aWwgdGhlcmUgcmVtYWlucyBvbmx5IG9uZVxuICAvLyBlZGdlLlxuICB3aGlsZSAoZWRnZXMubGVuZ3RoID4gMSkge1xuICAgIC8vbmVpZ2hib3JFZGdlcy5yZW1vdmUoZWRnZXMucmVtb3ZlKDApKTtcbiAgICB2YXIgdGVtcCA9IGVkZ2VzWzBdO1xuICAgIGVkZ2VzLnNwbGljZSgwLCAxKTtcbiAgICB2YXIgaW5kZXggPSBuZWlnaGJvckVkZ2VzLmluZGV4T2YodGVtcCk7XG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgIG5laWdoYm9yRWRnZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gICAgaW5jRWRnZXNDb3VudC0tO1xuICAgIGNoaWxkQ291bnQtLTtcbiAgfVxuXG4gIGlmIChwYXJlbnRPZk5vZGUgIT0gbnVsbCkge1xuICAgIC8vYXNzZXJ0IGVkZ2VzLmxlbmd0aCA9PSAxO1xuICAgIHN0YXJ0SW5kZXggPSAobmVpZ2hib3JFZGdlcy5pbmRleE9mKGVkZ2VzWzBdKSArIDEpICUgaW5jRWRnZXNDb3VudDtcbiAgfSBlbHNlIHtcbiAgICBzdGFydEluZGV4ID0gMDtcbiAgfVxuXG4gIHZhciBzdGVwQW5nbGUgPSBNYXRoLmFicyhlbmRBbmdsZSAtIHN0YXJ0QW5nbGUpIC8gY2hpbGRDb3VudDtcblxuICBmb3IgKHZhciBpID0gc3RhcnRJbmRleDsgYnJhbmNoQ291bnQgIT0gY2hpbGRDb3VudDsgaSA9ICsraSAlIGluY0VkZ2VzQ291bnQpIHtcbiAgICB2YXIgY3VycmVudE5laWdoYm9yID0gbmVpZ2hib3JFZGdlc1tpXS5nZXRPdGhlckVuZChub2RlKTtcblxuICAgIC8vIERvbid0IGJhY2sgdHJhdmVyc2UgdG8gcm9vdCBub2RlIGluIGN1cnJlbnQgdHJlZS5cbiAgICBpZiAoY3VycmVudE5laWdoYm9yID09IHBhcmVudE9mTm9kZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIGNoaWxkU3RhcnRBbmdsZSA9IChzdGFydEFuZ2xlICsgYnJhbmNoQ291bnQgKiBzdGVwQW5nbGUpICUgMzYwO1xuICAgIHZhciBjaGlsZEVuZEFuZ2xlID0gKGNoaWxkU3RhcnRBbmdsZSArIHN0ZXBBbmdsZSkgJSAzNjA7XG5cbiAgICBDb1NFTGF5b3V0LmJyYW5jaFJhZGlhbExheW91dChjdXJyZW50TmVpZ2hib3IsIG5vZGUsIGNoaWxkU3RhcnRBbmdsZSwgY2hpbGRFbmRBbmdsZSwgZGlzdGFuY2UgKyByYWRpYWxTZXBhcmF0aW9uLCByYWRpYWxTZXBhcmF0aW9uKTtcblxuICAgIGJyYW5jaENvdW50Kys7XG4gIH1cbn07XG5cbkNvU0VMYXlvdXQubWF4RGlhZ29uYWxJblRyZWUgPSBmdW5jdGlvbiAodHJlZSkge1xuICB2YXIgbWF4RGlhZ29uYWwgPSBJbnRlZ2VyLk1JTl9WQUxVRTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHRyZWUubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbm9kZSA9IHRyZWVbaV07XG4gICAgdmFyIGRpYWdvbmFsID0gbm9kZS5nZXREaWFnb25hbCgpO1xuXG4gICAgaWYgKGRpYWdvbmFsID4gbWF4RGlhZ29uYWwpIHtcbiAgICAgIG1heERpYWdvbmFsID0gZGlhZ29uYWw7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1heERpYWdvbmFsO1xufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUuY2FsY1JlcHVsc2lvblJhbmdlID0gZnVuY3Rpb24gKCkge1xuICAvLyBmb3JtdWxhIGlzIDIgeCAobGV2ZWwgKyAxKSB4IGlkZWFsRWRnZUxlbmd0aFxuICByZXR1cm4gMiAqICh0aGlzLmxldmVsICsgMSkgKiB0aGlzLmlkZWFsRWRnZUxlbmd0aDtcbn07XG5cbi8vIFRpbGluZyBtZXRob2RzXG5cbi8vIEdyb3VwIHplcm8gZGVncmVlIG1lbWJlcnMgd2hvc2UgcGFyZW50cyBhcmUgbm90IHRvIGJlIHRpbGVkLCBjcmVhdGUgZHVtbXkgcGFyZW50cyB3aGVyZSBuZWVkZWQgYW5kIGZpbGwgbWVtYmVyR3JvdXBzIGJ5IHRoZWlyIGR1bW1wIHBhcmVudCBpZCdzXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5ncm91cFplcm9EZWdyZWVNZW1iZXJzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIC8vIGFycmF5IG9mIFtwYXJlbnRfaWQgeCBvbmVEZWdyZWVOb2RlX2lkXVxuICB2YXIgdGVtcE1lbWJlckdyb3VwcyA9IHt9OyAvLyBBIHRlbXBvcmFyeSBtYXAgb2YgcGFyZW50IG5vZGUgYW5kIGl0cyB6ZXJvIGRlZ3JlZSBtZW1iZXJzXG4gIHRoaXMubWVtYmVyR3JvdXBzID0ge307IC8vIEEgbWFwIG9mIGR1bW15IHBhcmVudCBub2RlIGFuZCBpdHMgemVybyBkZWdyZWUgbWVtYmVycyB3aG9zZSBwYXJlbnRzIGFyZSBub3QgdG8gYmUgdGlsZWRcbiAgdGhpcy5pZFRvRHVtbXlOb2RlID0ge307IC8vIEEgbWFwIG9mIGlkIHRvIGR1bW15IG5vZGUgXG5cbiAgdmFyIHplcm9EZWdyZWUgPSBbXTsgLy8gTGlzdCBvZiB6ZXJvIGRlZ3JlZSBub2RlcyB3aG9zZSBwYXJlbnRzIGFyZSBub3QgdG8gYmUgdGlsZWRcbiAgdmFyIGFsbE5vZGVzID0gdGhpcy5ncmFwaE1hbmFnZXIuZ2V0QWxsTm9kZXMoKTtcblxuICAvLyBGaWxsIHplcm8gZGVncmVlIGxpc3RcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbGxOb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBub2RlID0gYWxsTm9kZXNbaV07XG4gICAgdmFyIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50KCk7XG4gICAgLy8gSWYgYSBub2RlIGhhcyB6ZXJvIGRlZ3JlZSBhbmQgaXRzIHBhcmVudCBpcyBub3QgdG8gYmUgdGlsZWQgaWYgZXhpc3RzIGFkZCB0aGF0IG5vZGUgdG8gemVyb0RlZ3JlcyBsaXN0XG4gICAgaWYgKHRoaXMuZ2V0Tm9kZURlZ3JlZVdpdGhDaGlsZHJlbihub2RlKSA9PT0gMCAmJiAocGFyZW50LmlkID09IHVuZGVmaW5lZCB8fCAhdGhpcy5nZXRUb0JlVGlsZWQocGFyZW50KSkpIHtcbiAgICAgIHplcm9EZWdyZWUucHVzaChub2RlKTtcbiAgICB9XG4gIH1cblxuICAvLyBDcmVhdGUgYSBtYXAgb2YgcGFyZW50IG5vZGUgYW5kIGl0cyB6ZXJvIGRlZ3JlZSBtZW1iZXJzXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgemVyb0RlZ3JlZS5sZW5ndGg7IGkrKykge1xuICAgIHZhciBub2RlID0gemVyb0RlZ3JlZVtpXTsgLy8gWmVybyBkZWdyZWUgbm9kZSBpdHNlbGZcbiAgICB2YXIgcF9pZCA9IG5vZGUuZ2V0UGFyZW50KCkuaWQ7IC8vIFBhcmVudCBpZFxuXG4gICAgaWYgKHR5cGVvZiB0ZW1wTWVtYmVyR3JvdXBzW3BfaWRdID09PSBcInVuZGVmaW5lZFwiKSB0ZW1wTWVtYmVyR3JvdXBzW3BfaWRdID0gW107XG5cbiAgICB0ZW1wTWVtYmVyR3JvdXBzW3BfaWRdID0gdGVtcE1lbWJlckdyb3Vwc1twX2lkXS5jb25jYXQobm9kZSk7IC8vIFB1c2ggbm9kZSB0byB0aGUgbGlzdCBiZWxvbmdzIHRvIGl0cyBwYXJlbnQgaW4gdGVtcE1lbWJlckdyb3Vwc1xuICB9XG5cbiAgLy8gSWYgdGhlcmUgYXJlIGF0IGxlYXN0IHR3byBub2RlcyBhdCBhIGxldmVsLCBjcmVhdGUgYSBkdW1teSBjb21wb3VuZCBmb3IgdGhlbVxuICBPYmplY3Qua2V5cyh0ZW1wTWVtYmVyR3JvdXBzKS5mb3JFYWNoKGZ1bmN0aW9uIChwX2lkKSB7XG4gICAgaWYgKHRlbXBNZW1iZXJHcm91cHNbcF9pZF0ubGVuZ3RoID4gMSkge1xuICAgICAgdmFyIGR1bW15Q29tcG91bmRJZCA9IFwiRHVtbXlDb21wb3VuZF9cIiArIHBfaWQ7IC8vIFRoZSBpZCBvZiBkdW1teSBjb21wb3VuZCB3aGljaCB3aWxsIGJlIGNyZWF0ZWQgc29vblxuICAgICAgc2VsZi5tZW1iZXJHcm91cHNbZHVtbXlDb21wb3VuZElkXSA9IHRlbXBNZW1iZXJHcm91cHNbcF9pZF07IC8vIEFkZCBkdW1teSBjb21wb3VuZCB0byBtZW1iZXJHcm91cHNcblxuICAgICAgdmFyIHBhcmVudCA9IHRlbXBNZW1iZXJHcm91cHNbcF9pZF1bMF0uZ2V0UGFyZW50KCk7IC8vIFRoZSBwYXJlbnQgb2YgemVybyBkZWdyZWUgbm9kZXMgd2lsbCBiZSB0aGUgcGFyZW50IG9mIG5ldyBkdW1teSBjb21wb3VuZFxuXG4gICAgICAvLyBDcmVhdGUgYSBkdW1teSBjb21wb3VuZCB3aXRoIGNhbGN1bGF0ZWQgaWRcbiAgICAgIHZhciBkdW1teUNvbXBvdW5kID0gbmV3IENvU0VOb2RlKHNlbGYuZ3JhcGhNYW5hZ2VyKTtcbiAgICAgIGR1bW15Q29tcG91bmQuaWQgPSBkdW1teUNvbXBvdW5kSWQ7XG4gICAgICBkdW1teUNvbXBvdW5kLnBhZGRpbmdMZWZ0ID0gcGFyZW50LnBhZGRpbmdMZWZ0IHx8IDA7XG4gICAgICBkdW1teUNvbXBvdW5kLnBhZGRpbmdSaWdodCA9IHBhcmVudC5wYWRkaW5nUmlnaHQgfHwgMDtcbiAgICAgIGR1bW15Q29tcG91bmQucGFkZGluZ0JvdHRvbSA9IHBhcmVudC5wYWRkaW5nQm90dG9tIHx8IDA7XG4gICAgICBkdW1teUNvbXBvdW5kLnBhZGRpbmdUb3AgPSBwYXJlbnQucGFkZGluZ1RvcCB8fCAwO1xuXG4gICAgICBzZWxmLmlkVG9EdW1teU5vZGVbZHVtbXlDb21wb3VuZElkXSA9IGR1bW15Q29tcG91bmQ7XG5cbiAgICAgIHZhciBkdW1teVBhcmVudEdyYXBoID0gc2VsZi5nZXRHcmFwaE1hbmFnZXIoKS5hZGQoc2VsZi5uZXdHcmFwaCgpLCBkdW1teUNvbXBvdW5kKTtcbiAgICAgIHZhciBwYXJlbnRHcmFwaCA9IHBhcmVudC5nZXRDaGlsZCgpO1xuXG4gICAgICAvLyBBZGQgZHVtbXkgY29tcG91bmQgdG8gcGFyZW50IHRoZSBncmFwaFxuICAgICAgcGFyZW50R3JhcGguYWRkKGR1bW15Q29tcG91bmQpO1xuXG4gICAgICAvLyBGb3IgZWFjaCB6ZXJvIGRlZ3JlZSBub2RlIGluIHRoaXMgbGV2ZWwgcmVtb3ZlIGl0IGZyb20gaXRzIHBhcmVudCBncmFwaCBhbmQgYWRkIGl0IHRvIHRoZSBncmFwaCBvZiBkdW1teSBwYXJlbnRcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGVtcE1lbWJlckdyb3Vwc1twX2lkXS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgbm9kZSA9IHRlbXBNZW1iZXJHcm91cHNbcF9pZF1baV07XG5cbiAgICAgICAgcGFyZW50R3JhcGgucmVtb3ZlKG5vZGUpO1xuICAgICAgICBkdW1teVBhcmVudEdyYXBoLmFkZChub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUuY2xlYXJDb21wb3VuZHMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBjaGlsZEdyYXBoTWFwID0ge307XG4gIHZhciBpZFRvTm9kZSA9IHt9O1xuXG4gIC8vIEdldCBjb21wb3VuZCBvcmRlcmluZyBieSBmaW5kaW5nIHRoZSBpbm5lciBvbmUgZmlyc3RcbiAgdGhpcy5wZXJmb3JtREZTT25Db21wb3VuZHMoKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29tcG91bmRPcmRlci5sZW5ndGg7IGkrKykge1xuXG4gICAgaWRUb05vZGVbdGhpcy5jb21wb3VuZE9yZGVyW2ldLmlkXSA9IHRoaXMuY29tcG91bmRPcmRlcltpXTtcbiAgICBjaGlsZEdyYXBoTWFwW3RoaXMuY29tcG91bmRPcmRlcltpXS5pZF0gPSBbXS5jb25jYXQodGhpcy5jb21wb3VuZE9yZGVyW2ldLmdldENoaWxkKCkuZ2V0Tm9kZXMoKSk7XG5cbiAgICAvLyBSZW1vdmUgY2hpbGRyZW4gb2YgY29tcG91bmRzXG4gICAgdGhpcy5ncmFwaE1hbmFnZXIucmVtb3ZlKHRoaXMuY29tcG91bmRPcmRlcltpXS5nZXRDaGlsZCgpKTtcbiAgICB0aGlzLmNvbXBvdW5kT3JkZXJbaV0uY2hpbGQgPSBudWxsO1xuICB9XG5cbiAgdGhpcy5ncmFwaE1hbmFnZXIucmVzZXRBbGxOb2RlcygpO1xuXG4gIC8vIFRpbGUgdGhlIHJlbW92ZWQgY2hpbGRyZW5cbiAgdGhpcy50aWxlQ29tcG91bmRNZW1iZXJzKGNoaWxkR3JhcGhNYXAsIGlkVG9Ob2RlKTtcbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLmNsZWFyWmVyb0RlZ3JlZU1lbWJlcnMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHRpbGVkWmVyb0RlZ3JlZVBhY2sgPSB0aGlzLnRpbGVkWmVyb0RlZ3JlZVBhY2sgPSBbXTtcblxuICBPYmplY3Qua2V5cyh0aGlzLm1lbWJlckdyb3VwcykuZm9yRWFjaChmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgY29tcG91bmROb2RlID0gc2VsZi5pZFRvRHVtbXlOb2RlW2lkXTsgLy8gR2V0IHRoZSBkdW1teSBjb21wb3VuZFxuXG4gICAgdGlsZWRaZXJvRGVncmVlUGFja1tpZF0gPSBzZWxmLnRpbGVOb2RlcyhzZWxmLm1lbWJlckdyb3Vwc1tpZF0sIGNvbXBvdW5kTm9kZS5wYWRkaW5nTGVmdCArIGNvbXBvdW5kTm9kZS5wYWRkaW5nUmlnaHQpO1xuXG4gICAgLy8gU2V0IHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBkdW1teSBjb21wb3VuZCBhcyBjYWxjdWxhdGVkXG4gICAgY29tcG91bmROb2RlLnJlY3Qud2lkdGggPSB0aWxlZFplcm9EZWdyZWVQYWNrW2lkXS53aWR0aDtcbiAgICBjb21wb3VuZE5vZGUucmVjdC5oZWlnaHQgPSB0aWxlZFplcm9EZWdyZWVQYWNrW2lkXS5oZWlnaHQ7XG4gICAgY29tcG91bmROb2RlLnNldENlbnRlcih0aWxlZFplcm9EZWdyZWVQYWNrW2lkXS5jZW50ZXJYLCB0aWxlZFplcm9EZWdyZWVQYWNrW2lkXS5jZW50ZXJZKTtcblxuICAgIC8vIGNvbXBvdW5kIGxlZnQgYW5kIHRvcCBtYXJnaW5ncyBmb3IgbGFiZWxzXG4gICAgLy8gd2hlbiBub2RlIGxhYmVscyBhcmUgaW5jbHVkZWQsIHRoZXNlIHZhbHVlcyBtYXkgYmUgc2V0IHRvIGRpZmZlcmVudCB2YWx1ZXMgYmVsb3cgYW5kIGFyZSB1c2VkIGluIHRpbGluZ1Bvc3RMYXlvdXQsXG4gICAgLy8gb3RoZXJ3aXNlIHRoZXkgc3RheSBhcyB6ZXJvXG4gICAgY29tcG91bmROb2RlLmxhYmVsTWFyZ2luTGVmdCA9IDA7XG4gICAgY29tcG91bmROb2RlLmxhYmVsTWFyZ2luVG9wID0gMDtcblxuICAgIC8vIFVwZGF0ZSBjb21wb3VuZCBib3VuZHMgY29uc2lkZXJpbmcgaXRzIGxhYmVsIHByb3BlcnRpZXMgYW5kIHNldCBsYWJlbCBtYXJnaW5zIGZvciBsZWZ0IGFuZCB0b3BcbiAgICBpZiAoQ29TRUNvbnN0YW50cy5OT0RFX0RJTUVOU0lPTlNfSU5DTFVERV9MQUJFTFMpIHtcblxuICAgICAgdmFyIHdpZHRoID0gY29tcG91bmROb2RlLnJlY3Qud2lkdGg7XG4gICAgICB2YXIgaGVpZ2h0ID0gY29tcG91bmROb2RlLnJlY3QuaGVpZ2h0O1xuXG4gICAgICBpZiAoY29tcG91bmROb2RlLmxhYmVsV2lkdGgpIHtcbiAgICAgICAgaWYgKGNvbXBvdW5kTm9kZS5sYWJlbFBvc0hvcml6b250YWwgPT0gXCJsZWZ0XCIpIHtcbiAgICAgICAgICBjb21wb3VuZE5vZGUucmVjdC54IC09IGNvbXBvdW5kTm9kZS5sYWJlbFdpZHRoO1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5zZXRXaWR0aCh3aWR0aCArIGNvbXBvdW5kTm9kZS5sYWJlbFdpZHRoKTtcbiAgICAgICAgICBjb21wb3VuZE5vZGUubGFiZWxNYXJnaW5MZWZ0ID0gY29tcG91bmROb2RlLmxhYmVsV2lkdGg7XG4gICAgICAgIH0gZWxzZSBpZiAoY29tcG91bmROb2RlLmxhYmVsUG9zSG9yaXpvbnRhbCA9PSBcImNlbnRlclwiICYmIGNvbXBvdW5kTm9kZS5sYWJlbFdpZHRoID4gd2lkdGgpIHtcbiAgICAgICAgICBjb21wb3VuZE5vZGUucmVjdC54IC09IChjb21wb3VuZE5vZGUubGFiZWxXaWR0aCAtIHdpZHRoKSAvIDI7XG4gICAgICAgICAgY29tcG91bmROb2RlLnNldFdpZHRoKGNvbXBvdW5kTm9kZS5sYWJlbFdpZHRoKTtcbiAgICAgICAgICBjb21wb3VuZE5vZGUubGFiZWxNYXJnaW5MZWZ0ID0gKGNvbXBvdW5kTm9kZS5sYWJlbFdpZHRoIC0gd2lkdGgpIC8gMjtcbiAgICAgICAgfSBlbHNlIGlmIChjb21wb3VuZE5vZGUubGFiZWxQb3NIb3Jpem9udGFsID09IFwicmlnaHRcIikge1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5zZXRXaWR0aCh3aWR0aCArIGNvbXBvdW5kTm9kZS5sYWJlbFdpZHRoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY29tcG91bmROb2RlLmxhYmVsSGVpZ2h0KSB7XG4gICAgICAgIGlmIChjb21wb3VuZE5vZGUubGFiZWxQb3NWZXJ0aWNhbCA9PSBcInRvcFwiKSB7XG4gICAgICAgICAgY29tcG91bmROb2RlLnJlY3QueSAtPSBjb21wb3VuZE5vZGUubGFiZWxIZWlnaHQ7XG4gICAgICAgICAgY29tcG91bmROb2RlLnNldEhlaWdodChoZWlnaHQgKyBjb21wb3VuZE5vZGUubGFiZWxIZWlnaHQpO1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5sYWJlbE1hcmdpblRvcCA9IGNvbXBvdW5kTm9kZS5sYWJlbEhlaWdodDtcbiAgICAgICAgfSBlbHNlIGlmIChjb21wb3VuZE5vZGUubGFiZWxQb3NWZXJ0aWNhbCA9PSBcImNlbnRlclwiICYmIGNvbXBvdW5kTm9kZS5sYWJlbEhlaWdodCA+IGhlaWdodCkge1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5yZWN0LnkgLT0gKGNvbXBvdW5kTm9kZS5sYWJlbEhlaWdodCAtIGhlaWdodCkgLyAyO1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5zZXRIZWlnaHQoY29tcG91bmROb2RlLmxhYmVsSGVpZ2h0KTtcbiAgICAgICAgICBjb21wb3VuZE5vZGUubGFiZWxNYXJnaW5Ub3AgPSAoY29tcG91bmROb2RlLmxhYmVsSGVpZ2h0IC0gaGVpZ2h0KSAvIDI7XG4gICAgICAgIH0gZWxzZSBpZiAoY29tcG91bmROb2RlLmxhYmVsUG9zVmVydGljYWwgPT0gXCJib3R0b21cIikge1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5zZXRIZWlnaHQoaGVpZ2h0ICsgY29tcG91bmROb2RlLmxhYmVsSGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSk7XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5yZXBvcHVsYXRlQ29tcG91bmRzID0gZnVuY3Rpb24gKCkge1xuICBmb3IgKHZhciBpID0gdGhpcy5jb21wb3VuZE9yZGVyLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgdmFyIGxDb21wb3VuZE5vZGUgPSB0aGlzLmNvbXBvdW5kT3JkZXJbaV07XG4gICAgdmFyIGlkID0gbENvbXBvdW5kTm9kZS5pZDtcbiAgICB2YXIgaG9yaXpvbnRhbE1hcmdpbiA9IGxDb21wb3VuZE5vZGUucGFkZGluZ0xlZnQ7XG4gICAgdmFyIHZlcnRpY2FsTWFyZ2luID0gbENvbXBvdW5kTm9kZS5wYWRkaW5nVG9wO1xuICAgIHZhciBsYWJlbE1hcmdpbkxlZnQgPSBsQ29tcG91bmROb2RlLmxhYmVsTWFyZ2luTGVmdDtcbiAgICB2YXIgbGFiZWxNYXJnaW5Ub3AgPSBsQ29tcG91bmROb2RlLmxhYmVsTWFyZ2luVG9wO1xuXG4gICAgdGhpcy5hZGp1c3RMb2NhdGlvbnModGhpcy50aWxlZE1lbWJlclBhY2tbaWRdLCBsQ29tcG91bmROb2RlLnJlY3QueCwgbENvbXBvdW5kTm9kZS5yZWN0LnksIGhvcml6b250YWxNYXJnaW4sIHZlcnRpY2FsTWFyZ2luLCBsYWJlbE1hcmdpbkxlZnQsIGxhYmVsTWFyZ2luVG9wKTtcbiAgfVxufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUucmVwb3B1bGF0ZVplcm9EZWdyZWVNZW1iZXJzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciB0aWxlZFBhY2sgPSB0aGlzLnRpbGVkWmVyb0RlZ3JlZVBhY2s7XG5cbiAgT2JqZWN0LmtleXModGlsZWRQYWNrKS5mb3JFYWNoKGZ1bmN0aW9uIChpZCkge1xuICAgIHZhciBjb21wb3VuZE5vZGUgPSBzZWxmLmlkVG9EdW1teU5vZGVbaWRdOyAvLyBHZXQgdGhlIGR1bW15IGNvbXBvdW5kIGJ5IGl0cyBpZFxuICAgIHZhciBob3Jpem9udGFsTWFyZ2luID0gY29tcG91bmROb2RlLnBhZGRpbmdMZWZ0O1xuICAgIHZhciB2ZXJ0aWNhbE1hcmdpbiA9IGNvbXBvdW5kTm9kZS5wYWRkaW5nVG9wO1xuICAgIHZhciBsYWJlbE1hcmdpbkxlZnQgPSBjb21wb3VuZE5vZGUubGFiZWxNYXJnaW5MZWZ0O1xuICAgIHZhciBsYWJlbE1hcmdpblRvcCA9IGNvbXBvdW5kTm9kZS5sYWJlbE1hcmdpblRvcDtcblxuICAgIC8vIEFkanVzdCB0aGUgcG9zaXRpb25zIG9mIG5vZGVzIHdydCBpdHMgY29tcG91bmRcbiAgICBzZWxmLmFkanVzdExvY2F0aW9ucyh0aWxlZFBhY2tbaWRdLCBjb21wb3VuZE5vZGUucmVjdC54LCBjb21wb3VuZE5vZGUucmVjdC55LCBob3Jpem9udGFsTWFyZ2luLCB2ZXJ0aWNhbE1hcmdpbiwgbGFiZWxNYXJnaW5MZWZ0LCBsYWJlbE1hcmdpblRvcCk7XG4gIH0pO1xufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUuZ2V0VG9CZVRpbGVkID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgdmFyIGlkID0gbm9kZS5pZDtcbiAgLy9maXJzdGx5IGNoZWNrIHRoZSBwcmV2aW91cyByZXN1bHRzXG4gIGlmICh0aGlzLnRvQmVUaWxlZFtpZF0gIT0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzLnRvQmVUaWxlZFtpZF07XG4gIH1cblxuICAvL29ubHkgY29tcG91bmQgbm9kZXMgYXJlIHRvIGJlIHRpbGVkXG4gIHZhciBjaGlsZEdyYXBoID0gbm9kZS5nZXRDaGlsZCgpO1xuICBpZiAoY2hpbGRHcmFwaCA9PSBudWxsKSB7XG4gICAgdGhpcy50b0JlVGlsZWRbaWRdID0gZmFsc2U7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGNoaWxkcmVuID0gY2hpbGRHcmFwaC5nZXROb2RlcygpOyAvLyBHZXQgdGhlIGNoaWxkcmVuIG5vZGVzXG5cbiAgLy9hIGNvbXBvdW5kIG5vZGUgaXMgbm90IHRvIGJlIHRpbGVkIGlmIGFsbCBvZiBpdHMgY29tcG91bmQgY2hpbGRyZW4gYXJlIG5vdCB0byBiZSB0aWxlZFxuICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHRoZUNoaWxkID0gY2hpbGRyZW5baV07XG5cbiAgICBpZiAodGhpcy5nZXROb2RlRGVncmVlKHRoZUNoaWxkKSA+IDApIHtcbiAgICAgIHRoaXMudG9CZVRpbGVkW2lkXSA9IGZhbHNlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vcGFzcyB0aGUgY2hpbGRyZW4gbm90IGhhdmluZyB0aGUgY29tcG91bmQgc3RydWN0dXJlXG4gICAgaWYgKHRoZUNoaWxkLmdldENoaWxkKCkgPT0gbnVsbCkge1xuICAgICAgdGhpcy50b0JlVGlsZWRbdGhlQ2hpbGQuaWRdID0gZmFsc2U7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuZ2V0VG9CZVRpbGVkKHRoZUNoaWxkKSkge1xuICAgICAgdGhpcy50b0JlVGlsZWRbaWRdID0gZmFsc2U7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHRoaXMudG9CZVRpbGVkW2lkXSA9IHRydWU7XG4gIHJldHVybiB0cnVlO1xufTtcblxuLy8gR2V0IGRlZ3JlZSBvZiBhIG5vZGUgZGVwZW5kaW5nIG9mIGl0cyBlZGdlcyBhbmQgaW5kZXBlbmRlbnQgb2YgaXRzIGNoaWxkcmVuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5nZXROb2RlRGVncmVlID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgdmFyIGlkID0gbm9kZS5pZDtcbiAgdmFyIGVkZ2VzID0gbm9kZS5nZXRFZGdlcygpO1xuICB2YXIgZGVncmVlID0gMDtcblxuICAvLyBGb3IgdGhlIGVkZ2VzIGNvbm5lY3RlZFxuICBmb3IgKHZhciBpID0gMDsgaSA8IGVkZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVkZ2UgPSBlZGdlc1tpXTtcbiAgICBpZiAoZWRnZS5nZXRTb3VyY2UoKS5pZCAhPT0gZWRnZS5nZXRUYXJnZXQoKS5pZCkge1xuICAgICAgZGVncmVlID0gZGVncmVlICsgMTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlZ3JlZTtcbn07XG5cbi8vIEdldCBkZWdyZWUgb2YgYSBub2RlIHdpdGggaXRzIGNoaWxkcmVuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5nZXROb2RlRGVncmVlV2l0aENoaWxkcmVuID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgdmFyIGRlZ3JlZSA9IHRoaXMuZ2V0Tm9kZURlZ3JlZShub2RlKTtcbiAgaWYgKG5vZGUuZ2V0Q2hpbGQoKSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGRlZ3JlZTtcbiAgfVxuICB2YXIgY2hpbGRyZW4gPSBub2RlLmdldENoaWxkKCkuZ2V0Tm9kZXMoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgIGRlZ3JlZSArPSB0aGlzLmdldE5vZGVEZWdyZWVXaXRoQ2hpbGRyZW4oY2hpbGQpO1xuICB9XG4gIHJldHVybiBkZWdyZWU7XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5wZXJmb3JtREZTT25Db21wb3VuZHMgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuY29tcG91bmRPcmRlciA9IFtdO1xuICB0aGlzLmZpbGxDb21wZXhPcmRlckJ5REZTKHRoaXMuZ3JhcGhNYW5hZ2VyLmdldFJvb3QoKS5nZXROb2RlcygpKTtcbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLmZpbGxDb21wZXhPcmRlckJ5REZTID0gZnVuY3Rpb24gKGNoaWxkcmVuKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICBpZiAoY2hpbGQuZ2V0Q2hpbGQoKSAhPSBudWxsKSB7XG4gICAgICB0aGlzLmZpbGxDb21wZXhPcmRlckJ5REZTKGNoaWxkLmdldENoaWxkKCkuZ2V0Tm9kZXMoKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmdldFRvQmVUaWxlZChjaGlsZCkpIHtcbiAgICAgIHRoaXMuY29tcG91bmRPcmRlci5wdXNoKGNoaWxkKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuKiBUaGlzIG1ldGhvZCBwbGFjZXMgZWFjaCB6ZXJvIGRlZ3JlZSBtZW1iZXIgd3J0IGdpdmVuICh4LHkpIGNvb3JkaW5hdGVzICh0b3AgbGVmdCkuXG4qL1xuQ29TRUxheW91dC5wcm90b3R5cGUuYWRqdXN0TG9jYXRpb25zID0gZnVuY3Rpb24gKG9yZ2FuaXphdGlvbiwgeCwgeSwgY29tcG91bmRIb3Jpem9udGFsTWFyZ2luLCBjb21wb3VuZFZlcnRpY2FsTWFyZ2luLCBjb21wb3VuZExhYmVsTWFyZ2luTGVmdCwgY29tcG91bmRMYWJlbE1hcmdpblRvcCkge1xuICB4ICs9IGNvbXBvdW5kSG9yaXpvbnRhbE1hcmdpbiArIGNvbXBvdW5kTGFiZWxNYXJnaW5MZWZ0O1xuICB5ICs9IGNvbXBvdW5kVmVydGljYWxNYXJnaW4gKyBjb21wb3VuZExhYmVsTWFyZ2luVG9wO1xuXG4gIHZhciBsZWZ0ID0geDtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IG9yZ2FuaXphdGlvbi5yb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHJvdyA9IG9yZ2FuaXphdGlvbi5yb3dzW2ldO1xuICAgIHggPSBsZWZ0O1xuICAgIHZhciBtYXhIZWlnaHQgPSAwO1xuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCByb3cubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBsbm9kZSA9IHJvd1tqXTtcblxuICAgICAgbG5vZGUucmVjdC54ID0geDsgLy8gKyBsbm9kZS5yZWN0LndpZHRoIC8gMjtcbiAgICAgIGxub2RlLnJlY3QueSA9IHk7IC8vICsgbG5vZGUucmVjdC5oZWlnaHQgLyAyO1xuXG4gICAgICB4ICs9IGxub2RlLnJlY3Qud2lkdGggKyBvcmdhbml6YXRpb24uaG9yaXpvbnRhbFBhZGRpbmc7XG5cbiAgICAgIGlmIChsbm9kZS5yZWN0LmhlaWdodCA+IG1heEhlaWdodCkgbWF4SGVpZ2h0ID0gbG5vZGUucmVjdC5oZWlnaHQ7XG4gICAgfVxuXG4gICAgeSArPSBtYXhIZWlnaHQgKyBvcmdhbml6YXRpb24udmVydGljYWxQYWRkaW5nO1xuICB9XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS50aWxlQ29tcG91bmRNZW1iZXJzID0gZnVuY3Rpb24gKGNoaWxkR3JhcGhNYXAsIGlkVG9Ob2RlKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdGhpcy50aWxlZE1lbWJlclBhY2sgPSBbXTtcblxuICBPYmplY3Qua2V5cyhjaGlsZEdyYXBoTWFwKS5mb3JFYWNoKGZ1bmN0aW9uIChpZCkge1xuICAgIC8vIEdldCB0aGUgY29tcG91bmQgbm9kZVxuICAgIHZhciBjb21wb3VuZE5vZGUgPSBpZFRvTm9kZVtpZF07XG5cbiAgICBzZWxmLnRpbGVkTWVtYmVyUGFja1tpZF0gPSBzZWxmLnRpbGVOb2RlcyhjaGlsZEdyYXBoTWFwW2lkXSwgY29tcG91bmROb2RlLnBhZGRpbmdMZWZ0ICsgY29tcG91bmROb2RlLnBhZGRpbmdSaWdodCk7XG5cbiAgICBjb21wb3VuZE5vZGUucmVjdC53aWR0aCA9IHNlbGYudGlsZWRNZW1iZXJQYWNrW2lkXS53aWR0aDtcbiAgICBjb21wb3VuZE5vZGUucmVjdC5oZWlnaHQgPSBzZWxmLnRpbGVkTWVtYmVyUGFja1tpZF0uaGVpZ2h0O1xuICAgIGNvbXBvdW5kTm9kZS5zZXRDZW50ZXIoc2VsZi50aWxlZE1lbWJlclBhY2tbaWRdLmNlbnRlclgsIHNlbGYudGlsZWRNZW1iZXJQYWNrW2lkXS5jZW50ZXJZKTtcblxuICAgIC8vIGNvbXBvdW5kIGxlZnQgYW5kIHRvcCBtYXJnaW5ncyBmb3IgbGFiZWxzXG4gICAgLy8gd2hlbiBub2RlIGxhYmVscyBhcmUgaW5jbHVkZWQsIHRoZXNlIHZhbHVlcyBtYXkgYmUgc2V0IHRvIGRpZmZlcmVudCB2YWx1ZXMgYmVsb3cgYW5kIGFyZSB1c2VkIGluIHRpbGluZ1Bvc3RMYXlvdXQsXG4gICAgLy8gb3RoZXJ3aXNlIHRoZXkgc3RheSBhcyB6ZXJvXG4gICAgY29tcG91bmROb2RlLmxhYmVsTWFyZ2luTGVmdCA9IDA7XG4gICAgY29tcG91bmROb2RlLmxhYmVsTWFyZ2luVG9wID0gMDtcblxuICAgIC8vIFVwZGF0ZSBjb21wb3VuZCBib3VuZHMgY29uc2lkZXJpbmcgaXRzIGxhYmVsIHByb3BlcnRpZXMgYW5kIHNldCBsYWJlbCBtYXJnaW5zIGZvciBsZWZ0IGFuZCB0b3BcbiAgICBpZiAoQ29TRUNvbnN0YW50cy5OT0RFX0RJTUVOU0lPTlNfSU5DTFVERV9MQUJFTFMpIHtcblxuICAgICAgdmFyIHdpZHRoID0gY29tcG91bmROb2RlLnJlY3Qud2lkdGg7XG4gICAgICB2YXIgaGVpZ2h0ID0gY29tcG91bmROb2RlLnJlY3QuaGVpZ2h0O1xuXG4gICAgICBpZiAoY29tcG91bmROb2RlLmxhYmVsV2lkdGgpIHtcbiAgICAgICAgaWYgKGNvbXBvdW5kTm9kZS5sYWJlbFBvc0hvcml6b250YWwgPT0gXCJsZWZ0XCIpIHtcbiAgICAgICAgICBjb21wb3VuZE5vZGUucmVjdC54IC09IGNvbXBvdW5kTm9kZS5sYWJlbFdpZHRoO1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5zZXRXaWR0aCh3aWR0aCArIGNvbXBvdW5kTm9kZS5sYWJlbFdpZHRoKTtcbiAgICAgICAgICBjb21wb3VuZE5vZGUubGFiZWxNYXJnaW5MZWZ0ID0gY29tcG91bmROb2RlLmxhYmVsV2lkdGg7XG4gICAgICAgIH0gZWxzZSBpZiAoY29tcG91bmROb2RlLmxhYmVsUG9zSG9yaXpvbnRhbCA9PSBcImNlbnRlclwiICYmIGNvbXBvdW5kTm9kZS5sYWJlbFdpZHRoID4gd2lkdGgpIHtcbiAgICAgICAgICBjb21wb3VuZE5vZGUucmVjdC54IC09IChjb21wb3VuZE5vZGUubGFiZWxXaWR0aCAtIHdpZHRoKSAvIDI7XG4gICAgICAgICAgY29tcG91bmROb2RlLnNldFdpZHRoKGNvbXBvdW5kTm9kZS5sYWJlbFdpZHRoKTtcbiAgICAgICAgICBjb21wb3VuZE5vZGUubGFiZWxNYXJnaW5MZWZ0ID0gKGNvbXBvdW5kTm9kZS5sYWJlbFdpZHRoIC0gd2lkdGgpIC8gMjtcbiAgICAgICAgfSBlbHNlIGlmIChjb21wb3VuZE5vZGUubGFiZWxQb3NIb3Jpem9udGFsID09IFwicmlnaHRcIikge1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5zZXRXaWR0aCh3aWR0aCArIGNvbXBvdW5kTm9kZS5sYWJlbFdpZHRoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY29tcG91bmROb2RlLmxhYmVsSGVpZ2h0KSB7XG4gICAgICAgIGlmIChjb21wb3VuZE5vZGUubGFiZWxQb3NWZXJ0aWNhbCA9PSBcInRvcFwiKSB7XG4gICAgICAgICAgY29tcG91bmROb2RlLnJlY3QueSAtPSBjb21wb3VuZE5vZGUubGFiZWxIZWlnaHQ7XG4gICAgICAgICAgY29tcG91bmROb2RlLnNldEhlaWdodChoZWlnaHQgKyBjb21wb3VuZE5vZGUubGFiZWxIZWlnaHQpO1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5sYWJlbE1hcmdpblRvcCA9IGNvbXBvdW5kTm9kZS5sYWJlbEhlaWdodDtcbiAgICAgICAgfSBlbHNlIGlmIChjb21wb3VuZE5vZGUubGFiZWxQb3NWZXJ0aWNhbCA9PSBcImNlbnRlclwiICYmIGNvbXBvdW5kTm9kZS5sYWJlbEhlaWdodCA+IGhlaWdodCkge1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5yZWN0LnkgLT0gKGNvbXBvdW5kTm9kZS5sYWJlbEhlaWdodCAtIGhlaWdodCkgLyAyO1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5zZXRIZWlnaHQoY29tcG91bmROb2RlLmxhYmVsSGVpZ2h0KTtcbiAgICAgICAgICBjb21wb3VuZE5vZGUubGFiZWxNYXJnaW5Ub3AgPSAoY29tcG91bmROb2RlLmxhYmVsSGVpZ2h0IC0gaGVpZ2h0KSAvIDI7XG4gICAgICAgIH0gZWxzZSBpZiAoY29tcG91bmROb2RlLmxhYmVsUG9zVmVydGljYWwgPT0gXCJib3R0b21cIikge1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5zZXRIZWlnaHQoaGVpZ2h0ICsgY29tcG91bmROb2RlLmxhYmVsSGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSk7XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS50aWxlTm9kZXMgPSBmdW5jdGlvbiAobm9kZXMsIG1pbldpZHRoKSB7XG4gIHZhciBob3Jpem9udGFsT3JnID0gdGhpcy50aWxlTm9kZXNCeUZhdm9yaW5nRGltKG5vZGVzLCBtaW5XaWR0aCwgdHJ1ZSk7XG4gIHZhciB2ZXJ0aWNhbE9yZyA9IHRoaXMudGlsZU5vZGVzQnlGYXZvcmluZ0RpbShub2RlcywgbWluV2lkdGgsIGZhbHNlKTtcblxuICB2YXIgaG9yaXpvbnRhbFJhdGlvID0gdGhpcy5nZXRPcmdSYXRpbyhob3Jpem9udGFsT3JnKTtcbiAgdmFyIHZlcnRpY2FsUmF0aW8gPSB0aGlzLmdldE9yZ1JhdGlvKHZlcnRpY2FsT3JnKTtcbiAgdmFyIGJlc3RPcmc7XG5cbiAgLy8gdGhlIGJlc3QgcmF0aW8gaXMgdGhlIG9uZSB0aGF0IGlzIGNsb3NlciB0byAxIHNpbmNlIHRoZSByYXRpb3MgYXJlIGFscmVhZHkgbm9ybWFsaXplZFxuICAvLyBhbmQgdGhlIGJlc3Qgb3JnYW5pemF0aW9uIGlzIHRoZSBvbmUgdGhhdCBoYXMgdGhlIGJlc3QgcmF0aW9cbiAgaWYgKHZlcnRpY2FsUmF0aW8gPCBob3Jpem9udGFsUmF0aW8pIHtcbiAgICBiZXN0T3JnID0gdmVydGljYWxPcmc7XG4gIH0gZWxzZSB7XG4gICAgYmVzdE9yZyA9IGhvcml6b250YWxPcmc7XG4gIH1cblxuICByZXR1cm4gYmVzdE9yZztcbn07XG5cbi8vIGdldCB0aGUgd2lkdGgvaGVpZ2h0IHJhdGlvIG9mIHRoZSBvcmdhbml6YXRpb24gdGhhdCBpcyBub3JtYWxpemVkIHNvIHRoYXQgaXQgd2lsbCBub3QgYmUgbGVzcyB0aGFuIDFcbkNvU0VMYXlvdXQucHJvdG90eXBlLmdldE9yZ1JhdGlvID0gZnVuY3Rpb24gKG9yZ2FuaXphdGlvbikge1xuICAvLyBnZXQgZGltZW5zaW9ucyBhbmQgY2FsY3VsYXRlIHRoZSBpbml0aWFsIHJhdGlvXG4gIHZhciB3aWR0aCA9IG9yZ2FuaXphdGlvbi53aWR0aDtcbiAgdmFyIGhlaWdodCA9IG9yZ2FuaXphdGlvbi5oZWlnaHQ7XG4gIHZhciByYXRpbyA9IHdpZHRoIC8gaGVpZ2h0O1xuXG4gIC8vIGlmIHRoZSBpbml0aWFsIHJhdGlvIGlzIGxlc3MgdGhlbiAxIHRoZW4gaW52ZXJzZSBpdFxuICBpZiAocmF0aW8gPCAxKSB7XG4gICAgcmF0aW8gPSAxIC8gcmF0aW87XG4gIH1cblxuICAvLyByZXR1cm4gdGhlIG5vcm1hbGl6ZWQgcmF0aW9cbiAgcmV0dXJuIHJhdGlvO1xufTtcblxuLypcbiAqIENhbGN1bGF0ZXMgdGhlIGlkZWFsIHdpZHRoIGZvciB0aGUgcm93cy4gVGhpcyBtZXRob2QgYXNzdW1lcyB0aGF0XG4gKiBlYWNoIG5vZGUgaGFzIHRoZSBzYW1lIHNpemVzIGFuZCBjYWxjdWxhdGVzIHRoZSBpZGVhbCByb3cgd2lkdGggdGhhdFxuICogYXBwcm94aW1hdGVzIGEgc3F1YXJlIHNoYXBlZCBjb21wbGV4IGFjY29yZGluZ2x5LiBIb3dldmVyLCBzaW5jZSBub2RlcyB3b3VsZFxuICogaGF2ZSBkaWZmZXJlbnQgc2l6ZXMgc29tZSByb3dzIHdvdWxkIGhhdmUgZGlmZmVyZW50IHNpemVzIGFuZCB0aGUgcmVzdWx0aW5nXG4gKiBzaGFwZSB3b3VsZCBub3QgYmUgYW4gZXhhY3Qgc3F1YXJlLlxuICovXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5jYWxjSWRlYWxSb3dXaWR0aCA9IGZ1bmN0aW9uIChtZW1iZXJzLCBmYXZvckhvcml6b250YWxEaW0pIHtcbiAgLy8gVG8gYXBwcm94aW1hdGUgYSBzcXVhcmUgc2hhcGVkIGNvbXBsZXggd2UgbmVlZCB0byBtYWtlIGNvbXBsZXggd2lkdGggZXF1YWwgdG8gY29tcGxleCBoZWlnaHQuXG4gIC8vIFRvIGFjaGlldmUgdGhpcyB3ZSBuZWVkIHRvIHNvbHZlIHRoZSBmb2xsb3dpbmcgZXF1YXRpb24gc3lzdGVtIGZvciBoYzpcbiAgLy8gKHggKyBieCkgKiBoYyAtIGJ4ID0gKHkgKyBieSkgKiB2YyAtIGJ5LCBoYyAqIHZjID0gblxuICAvLyB3aGVyZSB4IGlzIHRoZSBhdmFyYWdlIHdpZHRoIG9mIHRoZSBub2RlcywgeSBpcyB0aGUgYXZhcmFnZSBoZWlnaHQgb2Ygbm9kZXNcbiAgLy8gYnggYW5kIGJ5IGFyZSB0aGUgYnVmZmVyIHNpemVzIGluIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGRpbWVuc2lvbnMgYWNjb3JkaW5nbHksXG4gIC8vIGhjIGFuZCB2YyBhcmUgdGhlIG51bWJlciBvZiByb3dzIGluIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGRpbWVuc2lvbnNcbiAgLy8gbiBpcyBudW1iZXIgb2YgbWVtYmVycy5cblxuICB2YXIgdmVydGljYWxQYWRkaW5nID0gQ29TRUNvbnN0YW50cy5USUxJTkdfUEFERElOR19WRVJUSUNBTDtcbiAgdmFyIGhvcml6b250YWxQYWRkaW5nID0gQ29TRUNvbnN0YW50cy5USUxJTkdfUEFERElOR19IT1JJWk9OVEFMO1xuXG4gIC8vIG51bWJlciBvZiBtZW1iZXJzXG4gIHZhciBtZW1iZXJzU2l6ZSA9IG1lbWJlcnMubGVuZ3RoO1xuXG4gIC8vIHN1bSBvZiB0aGUgd2lkdGggb2YgYWxsIG1lbWJlcnNcbiAgdmFyIHRvdGFsV2lkdGggPSAwO1xuXG4gIC8vIHN1bSBvZiB0aGUgaGVpZ2h0IG9mIGFsbCBtZW1iZXJzXG4gIHZhciB0b3RhbEhlaWdodCA9IDA7XG5cbiAgdmFyIG1heFdpZHRoID0gMDtcblxuICAvLyB0cmF2ZXJzZSBhbGwgbWVtYmVycyB0byBjYWxjdWxhdGUgdG90YWwgd2lkdGggYW5kIHRvdGFsIGhlaWdodCBhbmQgZ2V0IHRoZSBtYXhpbXVtIG1lbWJlcnMgd2lkdGhcbiAgbWVtYmVycy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgdG90YWxXaWR0aCArPSBub2RlLmdldFdpZHRoKCk7XG4gICAgdG90YWxIZWlnaHQgKz0gbm9kZS5nZXRIZWlnaHQoKTtcblxuICAgIGlmIChub2RlLmdldFdpZHRoKCkgPiBtYXhXaWR0aCkge1xuICAgICAgbWF4V2lkdGggPSBub2RlLmdldFdpZHRoKCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBhdmVyYWdlIHdpZHRoIG9mIHRoZSBtZW1iZXJzXG4gIHZhciBhdmVyYWdlV2lkdGggPSB0b3RhbFdpZHRoIC8gbWVtYmVyc1NpemU7XG5cbiAgLy8gYXZlcmFnZSBoZWlnaHQgb2YgdGhlIG1lbWJlcnNcbiAgdmFyIGF2ZXJhZ2VIZWlnaHQgPSB0b3RhbEhlaWdodCAvIG1lbWJlcnNTaXplO1xuXG4gIC8vIHNvbHZpbmcgdGhlIGluaXRpYWwgZXF1YXRpb24gc3lzdGVtIGZvciB0aGUgaGMgeWllbGRzIHRoZSBmb2xsb3dpbmcgc2Vjb25kIGRlZ3JlZSBlcXVhdGlvbjpcbiAgLy8gaGNeMiAqICh4K2J4KSArIGhjICogKGJ5IC0gYngpIC0gbiAqICh5ICsgYnkpID0gMFxuXG4gIC8vIHRoZSBkZWx0YSB2YWx1ZSB0byBzb2x2ZSB0aGUgZXF1YXRpb24gYWJvdmUgZm9yIGhjXG4gIHZhciBkZWx0YSA9IE1hdGgucG93KHZlcnRpY2FsUGFkZGluZyAtIGhvcml6b250YWxQYWRkaW5nLCAyKSArIDQgKiAoYXZlcmFnZVdpZHRoICsgaG9yaXpvbnRhbFBhZGRpbmcpICogKGF2ZXJhZ2VIZWlnaHQgKyB2ZXJ0aWNhbFBhZGRpbmcpICogbWVtYmVyc1NpemU7XG5cbiAgLy8gc29sdmUgdGhlIGVxdWF0aW9uIHVzaW5nIGRlbHRhIHZhbHVlIHRvIGNhbGN1bGF0ZSB0aGUgaG9yaXpvbnRhbCBjb3VudFxuICAvLyB0aGF0IHJlcHJlc2VudHMgdGhlIG51bWJlciBvZiBub2RlcyBpbiBhbiBpZGVhbCByb3dcbiAgdmFyIGhvcml6b250YWxDb3VudERvdWJsZSA9IChob3Jpem9udGFsUGFkZGluZyAtIHZlcnRpY2FsUGFkZGluZyArIE1hdGguc3FydChkZWx0YSkpIC8gKDIgKiAoYXZlcmFnZVdpZHRoICsgaG9yaXpvbnRhbFBhZGRpbmcpKTtcbiAgLy8gcm91bmQgdGhlIGNhbGN1bGF0ZWQgaG9yaXpvbnRhbCBjb3VudCB1cCBvciBkb3duIGFjY29yZGluZyB0byB0aGUgZmF2b3JlZCBkaW1lbnNpb25cbiAgdmFyIGhvcml6b250YWxDb3VudDtcblxuICBpZiAoZmF2b3JIb3Jpem9udGFsRGltKSB7XG4gICAgaG9yaXpvbnRhbENvdW50ID0gTWF0aC5jZWlsKGhvcml6b250YWxDb3VudERvdWJsZSk7XG4gICAgLy8gaWYgaG9yaXpvbnRhbENvdW50IGNvdW50IGlzIG5vdCBhIGZsb2F0IHZhbHVlIHRoZW4gYm90aCBvZiByb3VuZGluZyB0byBmbG9vciBhbmQgY2VpbFxuICAgIC8vIHdpbGwgeWllbGQgdGhlIHNhbWUgdmFsdWVzLiBJbnN0ZWFkIG9mIHJlcGVhdGluZyB0aGUgc2FtZSBjYWxjdWxhdGlvbiB0cnkgZ29pbmcgdXBcbiAgICAvLyB3aGlsZSBmYXZvcmluZyBob3Jpem9udGFsIGRpbWVuc2lvbiBpbiBzdWNoIGNhc2VzXG4gICAgaWYgKGhvcml6b250YWxDb3VudCA9PSBob3Jpem9udGFsQ291bnREb3VibGUpIHtcbiAgICAgIGhvcml6b250YWxDb3VudCsrO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBob3Jpem9udGFsQ291bnQgPSBNYXRoLmZsb29yKGhvcml6b250YWxDb3VudERvdWJsZSk7XG4gIH1cblxuICAvLyBpZGVhbCB3aWR0aCB0byBiZSBjYWxjdWxhdGVkXG4gIHZhciBpZGVhbFdpZHRoID0gaG9yaXpvbnRhbENvdW50ICogKGF2ZXJhZ2VXaWR0aCArIGhvcml6b250YWxQYWRkaW5nKSAtIGhvcml6b250YWxQYWRkaW5nO1xuXG4gIC8vIGlmIG1heCB3aWR0aCBpcyBiaWdnZXIgdGhhbiBjYWxjdWxhdGVkIGlkZWFsIHdpZHRoIHJlc2V0IGlkZWFsIHdpZHRoIHRvIGl0XG4gIGlmIChtYXhXaWR0aCA+IGlkZWFsV2lkdGgpIHtcbiAgICBpZGVhbFdpZHRoID0gbWF4V2lkdGg7XG4gIH1cblxuICAvLyBhZGQgdGhlIGxlZnQtcmlnaHQgbWFyZ2lucyB0byB0aGUgaWRlYWwgcm93IHdpZHRoXG4gIGlkZWFsV2lkdGggKz0gaG9yaXpvbnRhbFBhZGRpbmcgKiAyO1xuXG4gIC8vIHJldHVybiB0aGUgaWRlYWwgcm93IHdpZHRoMVxuICByZXR1cm4gaWRlYWxXaWR0aDtcbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLnRpbGVOb2Rlc0J5RmF2b3JpbmdEaW0gPSBmdW5jdGlvbiAobm9kZXMsIG1pbldpZHRoLCBmYXZvckhvcml6b250YWxEaW0pIHtcbiAgdmFyIHZlcnRpY2FsUGFkZGluZyA9IENvU0VDb25zdGFudHMuVElMSU5HX1BBRERJTkdfVkVSVElDQUw7XG4gIHZhciBob3Jpem9udGFsUGFkZGluZyA9IENvU0VDb25zdGFudHMuVElMSU5HX1BBRERJTkdfSE9SSVpPTlRBTDtcbiAgdmFyIHRpbGluZ0NvbXBhcmVCeSA9IENvU0VDb25zdGFudHMuVElMSU5HX0NPTVBBUkVfQlk7XG4gIHZhciBvcmdhbml6YXRpb24gPSB7XG4gICAgcm93czogW10sXG4gICAgcm93V2lkdGg6IFtdLFxuICAgIHJvd0hlaWdodDogW10sXG4gICAgd2lkdGg6IDAsXG4gICAgaGVpZ2h0OiBtaW5XaWR0aCwgLy8gYXNzdW1lIG1pbkhlaWdodCBlcXVhbHMgdG8gbWluV2lkdGhcbiAgICB2ZXJ0aWNhbFBhZGRpbmc6IHZlcnRpY2FsUGFkZGluZyxcbiAgICBob3Jpem9udGFsUGFkZGluZzogaG9yaXpvbnRhbFBhZGRpbmcsXG4gICAgY2VudGVyWDogMCxcbiAgICBjZW50ZXJZOiAwXG4gIH07XG5cbiAgaWYgKHRpbGluZ0NvbXBhcmVCeSkge1xuICAgIG9yZ2FuaXphdGlvbi5pZGVhbFJvd1dpZHRoID0gdGhpcy5jYWxjSWRlYWxSb3dXaWR0aChub2RlcywgZmF2b3JIb3Jpem9udGFsRGltKTtcbiAgfVxuXG4gIHZhciBnZXROb2RlQXJlYSA9IGZ1bmN0aW9uIGdldE5vZGVBcmVhKG4pIHtcbiAgICByZXR1cm4gbi5yZWN0LndpZHRoICogbi5yZWN0LmhlaWdodDtcbiAgfTtcblxuICB2YXIgYXJlYUNvbXBhcmVGY24gPSBmdW5jdGlvbiBhcmVhQ29tcGFyZUZjbihuMSwgbjIpIHtcbiAgICByZXR1cm4gZ2V0Tm9kZUFyZWEobjIpIC0gZ2V0Tm9kZUFyZWEobjEpO1xuICB9O1xuXG4gIC8vIFNvcnQgdGhlIG5vZGVzIGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgdGhlaXIgYXJlYXNcbiAgbm9kZXMuc29ydChmdW5jdGlvbiAobjEsIG4yKSB7XG4gICAgdmFyIGNtcEJ5ID0gYXJlYUNvbXBhcmVGY247XG4gICAgaWYgKG9yZ2FuaXphdGlvbi5pZGVhbFJvd1dpZHRoKSB7XG4gICAgICBjbXBCeSA9IHRpbGluZ0NvbXBhcmVCeTtcbiAgICAgIHJldHVybiBjbXBCeShuMS5pZCwgbjIuaWQpO1xuICAgIH1cbiAgICByZXR1cm4gY21wQnkobjEsIG4yKTtcbiAgfSk7XG5cbiAgLy8gQ3JlYXRlIHRoZSBvcmdhbml6YXRpb24gLT4gY2FsY3VsYXRlIGNvbXBvdW5kIGNlbnRlclxuICB2YXIgc3VtQ2VudGVyWCA9IDA7XG4gIHZhciBzdW1DZW50ZXJZID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBsTm9kZSA9IG5vZGVzW2ldO1xuXG4gICAgc3VtQ2VudGVyWCArPSBsTm9kZS5nZXRDZW50ZXJYKCk7XG4gICAgc3VtQ2VudGVyWSArPSBsTm9kZS5nZXRDZW50ZXJZKCk7XG4gIH1cblxuICBvcmdhbml6YXRpb24uY2VudGVyWCA9IHN1bUNlbnRlclggLyBub2Rlcy5sZW5ndGg7XG4gIG9yZ2FuaXphdGlvbi5jZW50ZXJZID0gc3VtQ2VudGVyWSAvIG5vZGVzLmxlbmd0aDtcblxuICAvLyBDcmVhdGUgdGhlIG9yZ2FuaXphdGlvbiAtPiB0aWxlIG1lbWJlcnNcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBsTm9kZSA9IG5vZGVzW2ldO1xuXG4gICAgaWYgKG9yZ2FuaXphdGlvbi5yb3dzLmxlbmd0aCA9PSAwKSB7XG4gICAgICB0aGlzLmluc2VydE5vZGVUb1Jvdyhvcmdhbml6YXRpb24sIGxOb2RlLCAwLCBtaW5XaWR0aCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNhbkFkZEhvcml6b250YWwob3JnYW5pemF0aW9uLCBsTm9kZS5yZWN0LndpZHRoLCBsTm9kZS5yZWN0LmhlaWdodCkpIHtcbiAgICAgIHZhciByb3dJbmRleCA9IG9yZ2FuaXphdGlvbi5yb3dzLmxlbmd0aCAtIDE7XG4gICAgICBpZiAoIW9yZ2FuaXphdGlvbi5pZGVhbFJvd1dpZHRoKSB7XG4gICAgICAgIHJvd0luZGV4ID0gdGhpcy5nZXRTaG9ydGVzdFJvd0luZGV4KG9yZ2FuaXphdGlvbik7XG4gICAgICB9XG4gICAgICB0aGlzLmluc2VydE5vZGVUb1Jvdyhvcmdhbml6YXRpb24sIGxOb2RlLCByb3dJbmRleCwgbWluV2lkdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmluc2VydE5vZGVUb1Jvdyhvcmdhbml6YXRpb24sIGxOb2RlLCBvcmdhbml6YXRpb24ucm93cy5sZW5ndGgsIG1pbldpZHRoKTtcbiAgICB9XG5cbiAgICB0aGlzLnNoaWZ0VG9MYXN0Um93KG9yZ2FuaXphdGlvbik7XG4gIH1cblxuICByZXR1cm4gb3JnYW5pemF0aW9uO1xufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUuaW5zZXJ0Tm9kZVRvUm93ID0gZnVuY3Rpb24gKG9yZ2FuaXphdGlvbiwgbm9kZSwgcm93SW5kZXgsIG1pbldpZHRoKSB7XG4gIHZhciBtaW5Db21wb3VuZFNpemUgPSBtaW5XaWR0aDtcblxuICAvLyBBZGQgbmV3IHJvdyBpZiBuZWVkZWRcbiAgaWYgKHJvd0luZGV4ID09IG9yZ2FuaXphdGlvbi5yb3dzLmxlbmd0aCkge1xuICAgIHZhciBzZWNvbmREaW1lbnNpb24gPSBbXTtcblxuICAgIG9yZ2FuaXphdGlvbi5yb3dzLnB1c2goc2Vjb25kRGltZW5zaW9uKTtcbiAgICBvcmdhbml6YXRpb24ucm93V2lkdGgucHVzaChtaW5Db21wb3VuZFNpemUpO1xuICAgIG9yZ2FuaXphdGlvbi5yb3dIZWlnaHQucHVzaCgwKTtcbiAgfVxuXG4gIC8vIFVwZGF0ZSByb3cgd2lkdGhcbiAgdmFyIHcgPSBvcmdhbml6YXRpb24ucm93V2lkdGhbcm93SW5kZXhdICsgbm9kZS5yZWN0LndpZHRoO1xuXG4gIGlmIChvcmdhbml6YXRpb24ucm93c1tyb3dJbmRleF0ubGVuZ3RoID4gMCkge1xuICAgIHcgKz0gb3JnYW5pemF0aW9uLmhvcml6b250YWxQYWRkaW5nO1xuICB9XG5cbiAgb3JnYW5pemF0aW9uLnJvd1dpZHRoW3Jvd0luZGV4XSA9IHc7XG4gIC8vIFVwZGF0ZSBjb21wb3VuZCB3aWR0aFxuICBpZiAob3JnYW5pemF0aW9uLndpZHRoIDwgdykge1xuICAgIG9yZ2FuaXphdGlvbi53aWR0aCA9IHc7XG4gIH1cblxuICAvLyBVcGRhdGUgaGVpZ2h0XG4gIHZhciBoID0gbm9kZS5yZWN0LmhlaWdodDtcbiAgaWYgKHJvd0luZGV4ID4gMCkgaCArPSBvcmdhbml6YXRpb24udmVydGljYWxQYWRkaW5nO1xuXG4gIHZhciBleHRyYUhlaWdodCA9IDA7XG4gIGlmIChoID4gb3JnYW5pemF0aW9uLnJvd0hlaWdodFtyb3dJbmRleF0pIHtcbiAgICBleHRyYUhlaWdodCA9IG9yZ2FuaXphdGlvbi5yb3dIZWlnaHRbcm93SW5kZXhdO1xuICAgIG9yZ2FuaXphdGlvbi5yb3dIZWlnaHRbcm93SW5kZXhdID0gaDtcbiAgICBleHRyYUhlaWdodCA9IG9yZ2FuaXphdGlvbi5yb3dIZWlnaHRbcm93SW5kZXhdIC0gZXh0cmFIZWlnaHQ7XG4gIH1cblxuICBvcmdhbml6YXRpb24uaGVpZ2h0ICs9IGV4dHJhSGVpZ2h0O1xuXG4gIC8vIEluc2VydCBub2RlXG4gIG9yZ2FuaXphdGlvbi5yb3dzW3Jvd0luZGV4XS5wdXNoKG5vZGUpO1xufTtcblxuLy9TY2FucyB0aGUgcm93cyBvZiBhbiBvcmdhbml6YXRpb24gYW5kIHJldHVybnMgdGhlIG9uZSB3aXRoIHRoZSBtaW4gd2lkdGhcbkNvU0VMYXlvdXQucHJvdG90eXBlLmdldFNob3J0ZXN0Um93SW5kZXggPSBmdW5jdGlvbiAob3JnYW5pemF0aW9uKSB7XG4gIHZhciByID0gLTE7XG4gIHZhciBtaW4gPSBOdW1iZXIuTUFYX1ZBTFVFO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgb3JnYW5pemF0aW9uLnJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAob3JnYW5pemF0aW9uLnJvd1dpZHRoW2ldIDwgbWluKSB7XG4gICAgICByID0gaTtcbiAgICAgIG1pbiA9IG9yZ2FuaXphdGlvbi5yb3dXaWR0aFtpXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHI7XG59O1xuXG4vL1NjYW5zIHRoZSByb3dzIG9mIGFuIG9yZ2FuaXphdGlvbiBhbmQgcmV0dXJucyB0aGUgb25lIHdpdGggdGhlIG1heCB3aWR0aFxuQ29TRUxheW91dC5wcm90b3R5cGUuZ2V0TG9uZ2VzdFJvd0luZGV4ID0gZnVuY3Rpb24gKG9yZ2FuaXphdGlvbikge1xuICB2YXIgciA9IC0xO1xuICB2YXIgbWF4ID0gTnVtYmVyLk1JTl9WQUxVRTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IG9yZ2FuaXphdGlvbi5yb3dzLmxlbmd0aDsgaSsrKSB7XG5cbiAgICBpZiAob3JnYW5pemF0aW9uLnJvd1dpZHRoW2ldID4gbWF4KSB7XG4gICAgICByID0gaTtcbiAgICAgIG1heCA9IG9yZ2FuaXphdGlvbi5yb3dXaWR0aFtpXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcjtcbn07XG5cbi8qKlxuKiBUaGlzIG1ldGhvZCBjaGVja3Mgd2hldGhlciBhZGRpbmcgZXh0cmEgd2lkdGggdG8gdGhlIG9yZ2FuaXphdGlvbiB2aW9sYXRlc1xuKiB0aGUgYXNwZWN0IHJhdGlvKDEpIG9yIG5vdC5cbiovXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5jYW5BZGRIb3Jpem9udGFsID0gZnVuY3Rpb24gKG9yZ2FuaXphdGlvbiwgZXh0cmFXaWR0aCwgZXh0cmFIZWlnaHQpIHtcblxuICAvLyBpZiB0aGVyZSBpcyBhbiBpZGVhbCByb3cgd2lkdGggc3BlY2lmaWVkIHVzZSBpdCBpbnN0ZWFkIG9mIGNoZWNraW5nIHRoZSBhc3BlY3QgcmF0aW9cbiAgaWYgKG9yZ2FuaXphdGlvbi5pZGVhbFJvd1dpZHRoKSB7XG4gICAgdmFyIGxhc3RSb3dJbmRleCA9IG9yZ2FuaXphdGlvbi5yb3dzLmxlbmd0aCAtIDE7XG4gICAgdmFyIGxhc3RSb3dXaWR0aCA9IG9yZ2FuaXphdGlvbi5yb3dXaWR0aFtsYXN0Um93SW5kZXhdO1xuXG4gICAgLy8gY2hlY2sgYW5kIHJldHVybiBpZiBpZGVhbCByb3cgd2lkdGggd2lsbCBiZSBleGNlZWQgaWYgdGhlIG5vZGUgaXMgYWRkZWQgdG8gdGhlIHJvd1xuICAgIHJldHVybiBsYXN0Um93V2lkdGggKyBleHRyYVdpZHRoICsgb3JnYW5pemF0aW9uLmhvcml6b250YWxQYWRkaW5nIDw9IG9yZ2FuaXphdGlvbi5pZGVhbFJvd1dpZHRoO1xuICB9XG5cbiAgdmFyIHNyaSA9IHRoaXMuZ2V0U2hvcnRlc3RSb3dJbmRleChvcmdhbml6YXRpb24pO1xuXG4gIGlmIChzcmkgPCAwKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB2YXIgbWluID0gb3JnYW5pemF0aW9uLnJvd1dpZHRoW3NyaV07XG5cbiAgaWYgKG1pbiArIG9yZ2FuaXphdGlvbi5ob3Jpem9udGFsUGFkZGluZyArIGV4dHJhV2lkdGggPD0gb3JnYW5pemF0aW9uLndpZHRoKSByZXR1cm4gdHJ1ZTtcblxuICB2YXIgaERpZmYgPSAwO1xuXG4gIC8vIEFkZGluZyB0byBhbiBleGlzdGluZyByb3dcbiAgaWYgKG9yZ2FuaXphdGlvbi5yb3dIZWlnaHRbc3JpXSA8IGV4dHJhSGVpZ2h0KSB7XG4gICAgaWYgKHNyaSA+IDApIGhEaWZmID0gZXh0cmFIZWlnaHQgKyBvcmdhbml6YXRpb24udmVydGljYWxQYWRkaW5nIC0gb3JnYW5pemF0aW9uLnJvd0hlaWdodFtzcmldO1xuICB9XG5cbiAgdmFyIGFkZF90b19yb3dfcmF0aW87XG4gIGlmIChvcmdhbml6YXRpb24ud2lkdGggLSBtaW4gPj0gZXh0cmFXaWR0aCArIG9yZ2FuaXphdGlvbi5ob3Jpem9udGFsUGFkZGluZykge1xuICAgIGFkZF90b19yb3dfcmF0aW8gPSAob3JnYW5pemF0aW9uLmhlaWdodCArIGhEaWZmKSAvIChtaW4gKyBleHRyYVdpZHRoICsgb3JnYW5pemF0aW9uLmhvcml6b250YWxQYWRkaW5nKTtcbiAgfSBlbHNlIHtcbiAgICBhZGRfdG9fcm93X3JhdGlvID0gKG9yZ2FuaXphdGlvbi5oZWlnaHQgKyBoRGlmZikgLyBvcmdhbml6YXRpb24ud2lkdGg7XG4gIH1cblxuICAvLyBBZGRpbmcgYSBuZXcgcm93IGZvciB0aGlzIG5vZGVcbiAgaERpZmYgPSBleHRyYUhlaWdodCArIG9yZ2FuaXphdGlvbi52ZXJ0aWNhbFBhZGRpbmc7XG4gIHZhciBhZGRfbmV3X3Jvd19yYXRpbztcbiAgaWYgKG9yZ2FuaXphdGlvbi53aWR0aCA8IGV4dHJhV2lkdGgpIHtcbiAgICBhZGRfbmV3X3Jvd19yYXRpbyA9IChvcmdhbml6YXRpb24uaGVpZ2h0ICsgaERpZmYpIC8gZXh0cmFXaWR0aDtcbiAgfSBlbHNlIHtcbiAgICBhZGRfbmV3X3Jvd19yYXRpbyA9IChvcmdhbml6YXRpb24uaGVpZ2h0ICsgaERpZmYpIC8gb3JnYW5pemF0aW9uLndpZHRoO1xuICB9XG5cbiAgaWYgKGFkZF9uZXdfcm93X3JhdGlvIDwgMSkgYWRkX25ld19yb3dfcmF0aW8gPSAxIC8gYWRkX25ld19yb3dfcmF0aW87XG5cbiAgaWYgKGFkZF90b19yb3dfcmF0aW8gPCAxKSBhZGRfdG9fcm93X3JhdGlvID0gMSAvIGFkZF90b19yb3dfcmF0aW87XG5cbiAgcmV0dXJuIGFkZF90b19yb3dfcmF0aW8gPCBhZGRfbmV3X3Jvd19yYXRpbztcbn07XG5cbi8vSWYgbW92aW5nIHRoZSBsYXN0IG5vZGUgZnJvbSB0aGUgbG9uZ2VzdCByb3cgYW5kIGFkZGluZyBpdCB0byB0aGUgbGFzdFxuLy9yb3cgbWFrZXMgdGhlIGJvdW5kaW5nIGJveCBzbWFsbGVyLCBkbyBpdC5cbkNvU0VMYXlvdXQucHJvdG90eXBlLnNoaWZ0VG9MYXN0Um93ID0gZnVuY3Rpb24gKG9yZ2FuaXphdGlvbikge1xuICB2YXIgbG9uZ2VzdCA9IHRoaXMuZ2V0TG9uZ2VzdFJvd0luZGV4KG9yZ2FuaXphdGlvbik7XG4gIHZhciBsYXN0ID0gb3JnYW5pemF0aW9uLnJvd1dpZHRoLmxlbmd0aCAtIDE7XG4gIHZhciByb3cgPSBvcmdhbml6YXRpb24ucm93c1tsb25nZXN0XTtcbiAgdmFyIG5vZGUgPSByb3dbcm93Lmxlbmd0aCAtIDFdO1xuXG4gIHZhciBkaWZmID0gbm9kZS53aWR0aCArIG9yZ2FuaXphdGlvbi5ob3Jpem9udGFsUGFkZGluZztcblxuICAvLyBDaGVjayBpZiB0aGVyZSBpcyBlbm91Z2ggc3BhY2Ugb24gdGhlIGxhc3Qgcm93XG4gIGlmIChvcmdhbml6YXRpb24ud2lkdGggLSBvcmdhbml6YXRpb24ucm93V2lkdGhbbGFzdF0gPiBkaWZmICYmIGxvbmdlc3QgIT0gbGFzdCkge1xuICAgIC8vIFJlbW92ZSB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBsb25nZXN0IHJvd1xuICAgIHJvdy5zcGxpY2UoLTEsIDEpO1xuXG4gICAgLy8gUHVzaCBpdCB0byB0aGUgbGFzdCByb3dcbiAgICBvcmdhbml6YXRpb24ucm93c1tsYXN0XS5wdXNoKG5vZGUpO1xuXG4gICAgb3JnYW5pemF0aW9uLnJvd1dpZHRoW2xvbmdlc3RdID0gb3JnYW5pemF0aW9uLnJvd1dpZHRoW2xvbmdlc3RdIC0gZGlmZjtcbiAgICBvcmdhbml6YXRpb24ucm93V2lkdGhbbGFzdF0gPSBvcmdhbml6YXRpb24ucm93V2lkdGhbbGFzdF0gKyBkaWZmO1xuICAgIG9yZ2FuaXphdGlvbi53aWR0aCA9IG9yZ2FuaXphdGlvbi5yb3dXaWR0aFtpbnN0YW5jZS5nZXRMb25nZXN0Um93SW5kZXgob3JnYW5pemF0aW9uKV07XG5cbiAgICAvLyBVcGRhdGUgaGVpZ2h0cyBvZiB0aGUgb3JnYW5pemF0aW9uXG4gICAgdmFyIG1heEhlaWdodCA9IE51bWJlci5NSU5fVkFMVUU7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3cubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChyb3dbaV0uaGVpZ2h0ID4gbWF4SGVpZ2h0KSBtYXhIZWlnaHQgPSByb3dbaV0uaGVpZ2h0O1xuICAgIH1cbiAgICBpZiAobG9uZ2VzdCA+IDApIG1heEhlaWdodCArPSBvcmdhbml6YXRpb24udmVydGljYWxQYWRkaW5nO1xuXG4gICAgdmFyIHByZXZUb3RhbCA9IG9yZ2FuaXphdGlvbi5yb3dIZWlnaHRbbG9uZ2VzdF0gKyBvcmdhbml6YXRpb24ucm93SGVpZ2h0W2xhc3RdO1xuXG4gICAgb3JnYW5pemF0aW9uLnJvd0hlaWdodFtsb25nZXN0XSA9IG1heEhlaWdodDtcbiAgICBpZiAob3JnYW5pemF0aW9uLnJvd0hlaWdodFtsYXN0XSA8IG5vZGUuaGVpZ2h0ICsgb3JnYW5pemF0aW9uLnZlcnRpY2FsUGFkZGluZykgb3JnYW5pemF0aW9uLnJvd0hlaWdodFtsYXN0XSA9IG5vZGUuaGVpZ2h0ICsgb3JnYW5pemF0aW9uLnZlcnRpY2FsUGFkZGluZztcblxuICAgIHZhciBmaW5hbFRvdGFsID0gb3JnYW5pemF0aW9uLnJvd0hlaWdodFtsb25nZXN0XSArIG9yZ2FuaXphdGlvbi5yb3dIZWlnaHRbbGFzdF07XG4gICAgb3JnYW5pemF0aW9uLmhlaWdodCArPSBmaW5hbFRvdGFsIC0gcHJldlRvdGFsO1xuXG4gICAgdGhpcy5zaGlmdFRvTGFzdFJvdyhvcmdhbml6YXRpb24pO1xuICB9XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS50aWxpbmdQcmVMYXlvdXQgPSBmdW5jdGlvbiAoKSB7XG4gIGlmIChDb1NFQ29uc3RhbnRzLlRJTEUpIHtcbiAgICAvLyBGaW5kIHplcm8gZGVncmVlIG5vZGVzIGFuZCBjcmVhdGUgYSBjb21wb3VuZCBmb3IgZWFjaCBsZXZlbFxuICAgIHRoaXMuZ3JvdXBaZXJvRGVncmVlTWVtYmVycygpO1xuICAgIC8vIFRpbGUgYW5kIGNsZWFyIGNoaWxkcmVuIG9mIGVhY2ggY29tcG91bmRcbiAgICB0aGlzLmNsZWFyQ29tcG91bmRzKCk7XG4gICAgLy8gU2VwYXJhdGVseSB0aWxlIGFuZCBjbGVhciB6ZXJvIGRlZ3JlZSBub2RlcyBmb3IgZWFjaCBsZXZlbFxuICAgIHRoaXMuY2xlYXJaZXJvRGVncmVlTWVtYmVycygpO1xuICB9XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS50aWxpbmdQb3N0TGF5b3V0ID0gZnVuY3Rpb24gKCkge1xuICBpZiAoQ29TRUNvbnN0YW50cy5USUxFKSB7XG4gICAgdGhpcy5yZXBvcHVsYXRlWmVyb0RlZ3JlZU1lbWJlcnMoKTtcbiAgICB0aGlzLnJlcG9wdWxhdGVDb21wb3VuZHMoKTtcbiAgfVxufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNlY3Rpb246IFRyZWUgUmVkdWN0aW9uIG1ldGhvZHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBSZWR1Y2UgdHJlZXMgXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5yZWR1Y2VUcmVlcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHBydW5lZE5vZGVzQWxsID0gW107XG4gIHZhciBjb250YWluc0xlYWYgPSB0cnVlO1xuICB2YXIgbm9kZTtcblxuICB3aGlsZSAoY29udGFpbnNMZWFmKSB7XG4gICAgdmFyIGFsbE5vZGVzID0gdGhpcy5ncmFwaE1hbmFnZXIuZ2V0QWxsTm9kZXMoKTtcbiAgICB2YXIgcHJ1bmVkTm9kZXNJblN0ZXBUZW1wID0gW107XG4gICAgY29udGFpbnNMZWFmID0gZmFsc2U7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBub2RlID0gYWxsTm9kZXNbaV07XG4gICAgICBpZiAobm9kZS5nZXRFZGdlcygpLmxlbmd0aCA9PSAxICYmICFub2RlLmdldEVkZ2VzKClbMF0uaXNJbnRlckdyYXBoICYmIG5vZGUuZ2V0Q2hpbGQoKSA9PSBudWxsKSB7XG4gICAgICAgIGlmIChDb1NFQ29uc3RhbnRzLlBVUkVfSU5DUkVNRU5UQUwpIHtcbiAgICAgICAgICB2YXIgb3RoZXJFbmQgPSBub2RlLmdldEVkZ2VzKClbMF0uZ2V0T3RoZXJFbmQobm9kZSk7XG4gICAgICAgICAgdmFyIHJlbGF0aXZlUG9zaXRpb24gPSBuZXcgRGltZW5zaW9uRChub2RlLmdldENlbnRlclgoKSAtIG90aGVyRW5kLmdldENlbnRlclgoKSwgbm9kZS5nZXRDZW50ZXJZKCkgLSBvdGhlckVuZC5nZXRDZW50ZXJZKCkpO1xuICAgICAgICAgIHBydW5lZE5vZGVzSW5TdGVwVGVtcC5wdXNoKFtub2RlLCBub2RlLmdldEVkZ2VzKClbMF0sIG5vZGUuZ2V0T3duZXIoKSwgcmVsYXRpdmVQb3NpdGlvbl0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBydW5lZE5vZGVzSW5TdGVwVGVtcC5wdXNoKFtub2RlLCBub2RlLmdldEVkZ2VzKClbMF0sIG5vZGUuZ2V0T3duZXIoKV0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRhaW5zTGVhZiA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjb250YWluc0xlYWYgPT0gdHJ1ZSkge1xuICAgICAgdmFyIHBydW5lZE5vZGVzSW5TdGVwID0gW107XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHBydW5lZE5vZGVzSW5TdGVwVGVtcC5sZW5ndGg7IGorKykge1xuICAgICAgICBpZiAocHJ1bmVkTm9kZXNJblN0ZXBUZW1wW2pdWzBdLmdldEVkZ2VzKCkubGVuZ3RoID09IDEpIHtcbiAgICAgICAgICBwcnVuZWROb2Rlc0luU3RlcC5wdXNoKHBydW5lZE5vZGVzSW5TdGVwVGVtcFtqXSk7XG4gICAgICAgICAgcHJ1bmVkTm9kZXNJblN0ZXBUZW1wW2pdWzBdLmdldE93bmVyKCkucmVtb3ZlKHBydW5lZE5vZGVzSW5TdGVwVGVtcFtqXVswXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHBydW5lZE5vZGVzQWxsLnB1c2gocHJ1bmVkTm9kZXNJblN0ZXApO1xuICAgICAgdGhpcy5ncmFwaE1hbmFnZXIucmVzZXRBbGxOb2RlcygpO1xuICAgICAgdGhpcy5ncmFwaE1hbmFnZXIucmVzZXRBbGxFZGdlcygpO1xuICAgIH1cbiAgfVxuICB0aGlzLnBydW5lZE5vZGVzQWxsID0gcHJ1bmVkTm9kZXNBbGw7XG59O1xuXG4vLyBHcm93IHRyZWUgb25lIHN0ZXAgXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5ncm93VHJlZSA9IGZ1bmN0aW9uIChwcnVuZWROb2Rlc0FsbCkge1xuICB2YXIgbGVuZ3RoT2ZQcnVuZWROb2Rlc0luU3RlcCA9IHBydW5lZE5vZGVzQWxsLmxlbmd0aDtcbiAgdmFyIHBydW5lZE5vZGVzSW5TdGVwID0gcHJ1bmVkTm9kZXNBbGxbbGVuZ3RoT2ZQcnVuZWROb2Rlc0luU3RlcCAtIDFdO1xuXG4gIHZhciBub2RlRGF0YTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcnVuZWROb2Rlc0luU3RlcC5sZW5ndGg7IGkrKykge1xuICAgIG5vZGVEYXRhID0gcHJ1bmVkTm9kZXNJblN0ZXBbaV07XG5cbiAgICB0aGlzLmZpbmRQbGFjZWZvclBydW5lZE5vZGUobm9kZURhdGEpO1xuXG4gICAgbm9kZURhdGFbMl0uYWRkKG5vZGVEYXRhWzBdKTtcbiAgICBub2RlRGF0YVsyXS5hZGQobm9kZURhdGFbMV0sIG5vZGVEYXRhWzFdLnNvdXJjZSwgbm9kZURhdGFbMV0udGFyZ2V0KTtcbiAgfVxuXG4gIHBydW5lZE5vZGVzQWxsLnNwbGljZShwcnVuZWROb2Rlc0FsbC5sZW5ndGggLSAxLCAxKTtcbiAgdGhpcy5ncmFwaE1hbmFnZXIucmVzZXRBbGxOb2RlcygpO1xuICB0aGlzLmdyYXBoTWFuYWdlci5yZXNldEFsbEVkZ2VzKCk7XG59O1xuXG4vLyBGaW5kIGFuIGFwcHJvcHJpYXRlIHBvc2l0aW9uIHRvIHJlcGxhY2UgcHJ1bmVkIG5vZGUsIHRoaXMgbWV0aG9kIGNhbiBiZSBpbXByb3ZlZFxuQ29TRUxheW91dC5wcm90b3R5cGUuZmluZFBsYWNlZm9yUHJ1bmVkTm9kZSA9IGZ1bmN0aW9uIChub2RlRGF0YSkge1xuXG4gIHZhciBncmlkRm9yUHJ1bmVkTm9kZTtcbiAgdmFyIG5vZGVUb0Nvbm5lY3Q7XG4gIHZhciBwcnVuZWROb2RlID0gbm9kZURhdGFbMF07XG4gIGlmIChwcnVuZWROb2RlID09IG5vZGVEYXRhWzFdLnNvdXJjZSkge1xuICAgIG5vZGVUb0Nvbm5lY3QgPSBub2RlRGF0YVsxXS50YXJnZXQ7XG4gIH0gZWxzZSB7XG4gICAgbm9kZVRvQ29ubmVjdCA9IG5vZGVEYXRhWzFdLnNvdXJjZTtcbiAgfVxuXG4gIGlmIChDb1NFQ29uc3RhbnRzLlBVUkVfSU5DUkVNRU5UQUwpIHtcbiAgICBwcnVuZWROb2RlLnNldENlbnRlcihub2RlVG9Db25uZWN0LmdldENlbnRlclgoKSArIG5vZGVEYXRhWzNdLmdldFdpZHRoKCksIG5vZGVUb0Nvbm5lY3QuZ2V0Q2VudGVyWSgpICsgbm9kZURhdGFbM10uZ2V0SGVpZ2h0KCkpO1xuICB9IGVsc2Uge1xuICAgIHZhciBzdGFydEdyaWRYID0gbm9kZVRvQ29ubmVjdC5zdGFydFg7XG4gICAgdmFyIGZpbmlzaEdyaWRYID0gbm9kZVRvQ29ubmVjdC5maW5pc2hYO1xuICAgIHZhciBzdGFydEdyaWRZID0gbm9kZVRvQ29ubmVjdC5zdGFydFk7XG4gICAgdmFyIGZpbmlzaEdyaWRZID0gbm9kZVRvQ29ubmVjdC5maW5pc2hZO1xuXG4gICAgdmFyIHVwTm9kZUNvdW50ID0gMDtcbiAgICB2YXIgZG93bk5vZGVDb3VudCA9IDA7XG4gICAgdmFyIHJpZ2h0Tm9kZUNvdW50ID0gMDtcbiAgICB2YXIgbGVmdE5vZGVDb3VudCA9IDA7XG4gICAgdmFyIGNvbnRyb2xSZWdpb25zID0gW3VwTm9kZUNvdW50LCByaWdodE5vZGVDb3VudCwgZG93bk5vZGVDb3VudCwgbGVmdE5vZGVDb3VudF07XG5cbiAgICBpZiAoc3RhcnRHcmlkWSA+IDApIHtcbiAgICAgIGZvciAodmFyIGkgPSBzdGFydEdyaWRYOyBpIDw9IGZpbmlzaEdyaWRYOyBpKyspIHtcbiAgICAgICAgY29udHJvbFJlZ2lvbnNbMF0gKz0gdGhpcy5ncmlkW2ldW3N0YXJ0R3JpZFkgLSAxXS5sZW5ndGggKyB0aGlzLmdyaWRbaV1bc3RhcnRHcmlkWV0ubGVuZ3RoIC0gMTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZpbmlzaEdyaWRYIDwgdGhpcy5ncmlkLmxlbmd0aCAtIDEpIHtcbiAgICAgIGZvciAodmFyIGkgPSBzdGFydEdyaWRZOyBpIDw9IGZpbmlzaEdyaWRZOyBpKyspIHtcbiAgICAgICAgY29udHJvbFJlZ2lvbnNbMV0gKz0gdGhpcy5ncmlkW2ZpbmlzaEdyaWRYICsgMV1baV0ubGVuZ3RoICsgdGhpcy5ncmlkW2ZpbmlzaEdyaWRYXVtpXS5sZW5ndGggLSAxO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZmluaXNoR3JpZFkgPCB0aGlzLmdyaWRbMF0ubGVuZ3RoIC0gMSkge1xuICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0R3JpZFg7IGkgPD0gZmluaXNoR3JpZFg7IGkrKykge1xuICAgICAgICBjb250cm9sUmVnaW9uc1syXSArPSB0aGlzLmdyaWRbaV1bZmluaXNoR3JpZFkgKyAxXS5sZW5ndGggKyB0aGlzLmdyaWRbaV1bZmluaXNoR3JpZFldLmxlbmd0aCAtIDE7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzdGFydEdyaWRYID4gMCkge1xuICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0R3JpZFk7IGkgPD0gZmluaXNoR3JpZFk7IGkrKykge1xuICAgICAgICBjb250cm9sUmVnaW9uc1szXSArPSB0aGlzLmdyaWRbc3RhcnRHcmlkWCAtIDFdW2ldLmxlbmd0aCArIHRoaXMuZ3JpZFtzdGFydEdyaWRYXVtpXS5sZW5ndGggLSAxO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgbWluID0gSW50ZWdlci5NQVhfVkFMVUU7XG4gICAgdmFyIG1pbkNvdW50O1xuICAgIHZhciBtaW5JbmRleDtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNvbnRyb2xSZWdpb25zLmxlbmd0aDsgaisrKSB7XG4gICAgICBpZiAoY29udHJvbFJlZ2lvbnNbal0gPCBtaW4pIHtcbiAgICAgICAgbWluID0gY29udHJvbFJlZ2lvbnNbal07XG4gICAgICAgIG1pbkNvdW50ID0gMTtcbiAgICAgICAgbWluSW5kZXggPSBqO1xuICAgICAgfSBlbHNlIGlmIChjb250cm9sUmVnaW9uc1tqXSA9PSBtaW4pIHtcbiAgICAgICAgbWluQ291bnQrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobWluQ291bnQgPT0gMyAmJiBtaW4gPT0gMCkge1xuICAgICAgaWYgKGNvbnRyb2xSZWdpb25zWzBdID09IDAgJiYgY29udHJvbFJlZ2lvbnNbMV0gPT0gMCAmJiBjb250cm9sUmVnaW9uc1syXSA9PSAwKSB7XG4gICAgICAgIGdyaWRGb3JQcnVuZWROb2RlID0gMTtcbiAgICAgIH0gZWxzZSBpZiAoY29udHJvbFJlZ2lvbnNbMF0gPT0gMCAmJiBjb250cm9sUmVnaW9uc1sxXSA9PSAwICYmIGNvbnRyb2xSZWdpb25zWzNdID09IDApIHtcbiAgICAgICAgZ3JpZEZvclBydW5lZE5vZGUgPSAwO1xuICAgICAgfSBlbHNlIGlmIChjb250cm9sUmVnaW9uc1swXSA9PSAwICYmIGNvbnRyb2xSZWdpb25zWzJdID09IDAgJiYgY29udHJvbFJlZ2lvbnNbM10gPT0gMCkge1xuICAgICAgICBncmlkRm9yUHJ1bmVkTm9kZSA9IDM7XG4gICAgICB9IGVsc2UgaWYgKGNvbnRyb2xSZWdpb25zWzFdID09IDAgJiYgY29udHJvbFJlZ2lvbnNbMl0gPT0gMCAmJiBjb250cm9sUmVnaW9uc1szXSA9PSAwKSB7XG4gICAgICAgIGdyaWRGb3JQcnVuZWROb2RlID0gMjtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG1pbkNvdW50ID09IDIgJiYgbWluID09IDApIHtcbiAgICAgIHZhciByYW5kb20gPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAyKTtcbiAgICAgIGlmIChjb250cm9sUmVnaW9uc1swXSA9PSAwICYmIGNvbnRyb2xSZWdpb25zWzFdID09IDApIHtcbiAgICAgICAgO1xuICAgICAgICBpZiAocmFuZG9tID09IDApIHtcbiAgICAgICAgICBncmlkRm9yUHJ1bmVkTm9kZSA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZ3JpZEZvclBydW5lZE5vZGUgPSAxO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNvbnRyb2xSZWdpb25zWzBdID09IDAgJiYgY29udHJvbFJlZ2lvbnNbMl0gPT0gMCkge1xuICAgICAgICBpZiAocmFuZG9tID09IDApIHtcbiAgICAgICAgICBncmlkRm9yUHJ1bmVkTm9kZSA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZ3JpZEZvclBydW5lZE5vZGUgPSAyO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNvbnRyb2xSZWdpb25zWzBdID09IDAgJiYgY29udHJvbFJlZ2lvbnNbM10gPT0gMCkge1xuICAgICAgICBpZiAocmFuZG9tID09IDApIHtcbiAgICAgICAgICBncmlkRm9yUHJ1bmVkTm9kZSA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZ3JpZEZvclBydW5lZE5vZGUgPSAzO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNvbnRyb2xSZWdpb25zWzFdID09IDAgJiYgY29udHJvbFJlZ2lvbnNbMl0gPT0gMCkge1xuICAgICAgICBpZiAocmFuZG9tID09IDApIHtcbiAgICAgICAgICBncmlkRm9yUHJ1bmVkTm9kZSA9IDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZ3JpZEZvclBydW5lZE5vZGUgPSAyO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNvbnRyb2xSZWdpb25zWzFdID09IDAgJiYgY29udHJvbFJlZ2lvbnNbM10gPT0gMCkge1xuICAgICAgICBpZiAocmFuZG9tID09IDApIHtcbiAgICAgICAgICBncmlkRm9yUHJ1bmVkTm9kZSA9IDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZ3JpZEZvclBydW5lZE5vZGUgPSAzO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocmFuZG9tID09IDApIHtcbiAgICAgICAgICBncmlkRm9yUHJ1bmVkTm9kZSA9IDI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZ3JpZEZvclBydW5lZE5vZGUgPSAzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChtaW5Db3VudCA9PSA0ICYmIG1pbiA9PSAwKSB7XG4gICAgICB2YXIgcmFuZG9tID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogNCk7XG4gICAgICBncmlkRm9yUHJ1bmVkTm9kZSA9IHJhbmRvbTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ3JpZEZvclBydW5lZE5vZGUgPSBtaW5JbmRleDtcbiAgICB9XG5cbiAgICBpZiAoZ3JpZEZvclBydW5lZE5vZGUgPT0gMCkge1xuICAgICAgcHJ1bmVkTm9kZS5zZXRDZW50ZXIobm9kZVRvQ29ubmVjdC5nZXRDZW50ZXJYKCksIG5vZGVUb0Nvbm5lY3QuZ2V0Q2VudGVyWSgpIC0gbm9kZVRvQ29ubmVjdC5nZXRIZWlnaHQoKSAvIDIgLSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIIC0gcHJ1bmVkTm9kZS5nZXRIZWlnaHQoKSAvIDIpO1xuICAgIH0gZWxzZSBpZiAoZ3JpZEZvclBydW5lZE5vZGUgPT0gMSkge1xuICAgICAgcHJ1bmVkTm9kZS5zZXRDZW50ZXIobm9kZVRvQ29ubmVjdC5nZXRDZW50ZXJYKCkgKyBub2RlVG9Db25uZWN0LmdldFdpZHRoKCkgLyAyICsgRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9FREdFX0xFTkdUSCArIHBydW5lZE5vZGUuZ2V0V2lkdGgoKSAvIDIsIG5vZGVUb0Nvbm5lY3QuZ2V0Q2VudGVyWSgpKTtcbiAgICB9IGVsc2UgaWYgKGdyaWRGb3JQcnVuZWROb2RlID09IDIpIHtcbiAgICAgIHBydW5lZE5vZGUuc2V0Q2VudGVyKG5vZGVUb0Nvbm5lY3QuZ2V0Q2VudGVyWCgpLCBub2RlVG9Db25uZWN0LmdldENlbnRlclkoKSArIG5vZGVUb0Nvbm5lY3QuZ2V0SGVpZ2h0KCkgLyAyICsgRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9FREdFX0xFTkdUSCArIHBydW5lZE5vZGUuZ2V0SGVpZ2h0KCkgLyAyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJ1bmVkTm9kZS5zZXRDZW50ZXIobm9kZVRvQ29ubmVjdC5nZXRDZW50ZXJYKCkgLSBub2RlVG9Db25uZWN0LmdldFdpZHRoKCkgLyAyIC0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9FREdFX0xFTkdUSCAtIHBydW5lZE5vZGUuZ2V0V2lkdGgoKSAvIDIsIG5vZGVUb0Nvbm5lY3QuZ2V0Q2VudGVyWSgpKTtcbiAgICB9XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gQ29TRUxheW91dDtcblxuLyoqKi8gfSksXG5cbi8qKiovIDk5MTpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG5cbnZhciBGRExheW91dE5vZGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MSkuRkRMYXlvdXROb2RlO1xudmFyIElNYXRoID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTEpLklNYXRoO1xuXG5mdW5jdGlvbiBDb1NFTm9kZShnbSwgbG9jLCBzaXplLCB2Tm9kZSkge1xuICBGRExheW91dE5vZGUuY2FsbCh0aGlzLCBnbSwgbG9jLCBzaXplLCB2Tm9kZSk7XG59XG5cbkNvU0VOb2RlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRkRMYXlvdXROb2RlLnByb3RvdHlwZSk7XG5mb3IgKHZhciBwcm9wIGluIEZETGF5b3V0Tm9kZSkge1xuICBDb1NFTm9kZVtwcm9wXSA9IEZETGF5b3V0Tm9kZVtwcm9wXTtcbn1cblxuQ29TRU5vZGUucHJvdG90eXBlLmNhbGN1bGF0ZURpc3BsYWNlbWVudCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGxheW91dCA9IHRoaXMuZ3JhcGhNYW5hZ2VyLmdldExheW91dCgpO1xuICAvLyB0aGlzIGNoZWNrIGlzIGZvciBjb21wb3VuZCBub2RlcyB0aGF0IGNvbnRhaW4gZml4ZWQgbm9kZXNcbiAgaWYgKHRoaXMuZ2V0Q2hpbGQoKSAhPSBudWxsICYmIHRoaXMuZml4ZWROb2RlV2VpZ2h0KSB7XG4gICAgdGhpcy5kaXNwbGFjZW1lbnRYICs9IGxheW91dC5jb29saW5nRmFjdG9yICogKHRoaXMuc3ByaW5nRm9yY2VYICsgdGhpcy5yZXB1bHNpb25Gb3JjZVggKyB0aGlzLmdyYXZpdGF0aW9uRm9yY2VYKSAvIHRoaXMuZml4ZWROb2RlV2VpZ2h0O1xuICAgIHRoaXMuZGlzcGxhY2VtZW50WSArPSBsYXlvdXQuY29vbGluZ0ZhY3RvciAqICh0aGlzLnNwcmluZ0ZvcmNlWSArIHRoaXMucmVwdWxzaW9uRm9yY2VZICsgdGhpcy5ncmF2aXRhdGlvbkZvcmNlWSkgLyB0aGlzLmZpeGVkTm9kZVdlaWdodDtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmRpc3BsYWNlbWVudFggKz0gbGF5b3V0LmNvb2xpbmdGYWN0b3IgKiAodGhpcy5zcHJpbmdGb3JjZVggKyB0aGlzLnJlcHVsc2lvbkZvcmNlWCArIHRoaXMuZ3Jhdml0YXRpb25Gb3JjZVgpIC8gdGhpcy5ub09mQ2hpbGRyZW47XG4gICAgdGhpcy5kaXNwbGFjZW1lbnRZICs9IGxheW91dC5jb29saW5nRmFjdG9yICogKHRoaXMuc3ByaW5nRm9yY2VZICsgdGhpcy5yZXB1bHNpb25Gb3JjZVkgKyB0aGlzLmdyYXZpdGF0aW9uRm9yY2VZKSAvIHRoaXMubm9PZkNoaWxkcmVuO1xuICB9XG5cbiAgaWYgKE1hdGguYWJzKHRoaXMuZGlzcGxhY2VtZW50WCkgPiBsYXlvdXQuY29vbGluZ0ZhY3RvciAqIGxheW91dC5tYXhOb2RlRGlzcGxhY2VtZW50KSB7XG4gICAgdGhpcy5kaXNwbGFjZW1lbnRYID0gbGF5b3V0LmNvb2xpbmdGYWN0b3IgKiBsYXlvdXQubWF4Tm9kZURpc3BsYWNlbWVudCAqIElNYXRoLnNpZ24odGhpcy5kaXNwbGFjZW1lbnRYKTtcbiAgfVxuXG4gIGlmIChNYXRoLmFicyh0aGlzLmRpc3BsYWNlbWVudFkpID4gbGF5b3V0LmNvb2xpbmdGYWN0b3IgKiBsYXlvdXQubWF4Tm9kZURpc3BsYWNlbWVudCkge1xuICAgIHRoaXMuZGlzcGxhY2VtZW50WSA9IGxheW91dC5jb29saW5nRmFjdG9yICogbGF5b3V0Lm1heE5vZGVEaXNwbGFjZW1lbnQgKiBJTWF0aC5zaWduKHRoaXMuZGlzcGxhY2VtZW50WSk7XG4gIH1cblxuICAvLyBub24tZW1wdHkgY29tcG91bmQgbm9kZSwgcHJvcG9nYXRlIG1vdmVtZW50IHRvIGNoaWxkcmVuIGFzIHdlbGxcbiAgaWYgKHRoaXMuY2hpbGQgJiYgdGhpcy5jaGlsZC5nZXROb2RlcygpLmxlbmd0aCA+IDApIHtcbiAgICB0aGlzLnByb3BvZ2F0ZURpc3BsYWNlbWVudFRvQ2hpbGRyZW4odGhpcy5kaXNwbGFjZW1lbnRYLCB0aGlzLmRpc3BsYWNlbWVudFkpO1xuICB9XG59O1xuXG5Db1NFTm9kZS5wcm90b3R5cGUucHJvcG9nYXRlRGlzcGxhY2VtZW50VG9DaGlsZHJlbiA9IGZ1bmN0aW9uIChkWCwgZFkpIHtcbiAgdmFyIG5vZGVzID0gdGhpcy5nZXRDaGlsZCgpLmdldE5vZGVzKCk7XG4gIHZhciBub2RlO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgbm9kZSA9IG5vZGVzW2ldO1xuICAgIGlmIChub2RlLmdldENoaWxkKCkgPT0gbnVsbCkge1xuICAgICAgbm9kZS5kaXNwbGFjZW1lbnRYICs9IGRYO1xuICAgICAgbm9kZS5kaXNwbGFjZW1lbnRZICs9IGRZO1xuICAgIH0gZWxzZSB7XG4gICAgICBub2RlLnByb3BvZ2F0ZURpc3BsYWNlbWVudFRvQ2hpbGRyZW4oZFgsIGRZKTtcbiAgICB9XG4gIH1cbn07XG5cbkNvU0VOb2RlLnByb3RvdHlwZS5tb3ZlID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbGF5b3V0ID0gdGhpcy5ncmFwaE1hbmFnZXIuZ2V0TGF5b3V0KCk7XG5cbiAgLy8gYSBzaW1wbGUgbm9kZSBvciBhbiBlbXB0eSBjb21wb3VuZCBub2RlLCBtb3ZlIGl0XG4gIGlmICh0aGlzLmNoaWxkID09IG51bGwgfHwgdGhpcy5jaGlsZC5nZXROb2RlcygpLmxlbmd0aCA9PSAwKSB7XG4gICAgdGhpcy5tb3ZlQnkodGhpcy5kaXNwbGFjZW1lbnRYLCB0aGlzLmRpc3BsYWNlbWVudFkpO1xuXG4gICAgbGF5b3V0LnRvdGFsRGlzcGxhY2VtZW50ICs9IE1hdGguYWJzKHRoaXMuZGlzcGxhY2VtZW50WCkgKyBNYXRoLmFicyh0aGlzLmRpc3BsYWNlbWVudFkpO1xuICB9XG5cbiAgdGhpcy5zcHJpbmdGb3JjZVggPSAwO1xuICB0aGlzLnNwcmluZ0ZvcmNlWSA9IDA7XG4gIHRoaXMucmVwdWxzaW9uRm9yY2VYID0gMDtcbiAgdGhpcy5yZXB1bHNpb25Gb3JjZVkgPSAwO1xuICB0aGlzLmdyYXZpdGF0aW9uRm9yY2VYID0gMDtcbiAgdGhpcy5ncmF2aXRhdGlvbkZvcmNlWSA9IDA7XG4gIHRoaXMuZGlzcGxhY2VtZW50WCA9IDA7XG4gIHRoaXMuZGlzcGxhY2VtZW50WSA9IDA7XG59O1xuXG5Db1NFTm9kZS5wcm90b3R5cGUuc2V0UHJlZDEgPSBmdW5jdGlvbiAocHJlZDEpIHtcbiAgdGhpcy5wcmVkMSA9IHByZWQxO1xufTtcblxuQ29TRU5vZGUucHJvdG90eXBlLmdldFByZWQxID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gcHJlZDE7XG59O1xuXG5Db1NFTm9kZS5wcm90b3R5cGUuZ2V0UHJlZDIgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBwcmVkMjtcbn07XG5cbkNvU0VOb2RlLnByb3RvdHlwZS5zZXROZXh0ID0gZnVuY3Rpb24gKG5leHQpIHtcbiAgdGhpcy5uZXh0ID0gbmV4dDtcbn07XG5cbkNvU0VOb2RlLnByb3RvdHlwZS5nZXROZXh0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbmV4dDtcbn07XG5cbkNvU0VOb2RlLnByb3RvdHlwZS5zZXRQcm9jZXNzZWQgPSBmdW5jdGlvbiAocHJvY2Vzc2VkKSB7XG4gIHRoaXMucHJvY2Vzc2VkID0gcHJvY2Vzc2VkO1xufTtcblxuQ29TRU5vZGUucHJvdG90eXBlLmlzUHJvY2Vzc2VkID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gcHJvY2Vzc2VkO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBDb1NFTm9kZTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDkwMjpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG5cbmZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgeyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IEFycmF5KGFyci5sZW5ndGgpOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH0gZWxzZSB7IHJldHVybiBBcnJheS5mcm9tKGFycik7IH0gfVxuXG52YXIgQ29TRUNvbnN0YW50cyA9IF9fd2VicGFja19yZXF1aXJlX18oODA2KTtcbnZhciBMaW5rZWRMaXN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTEpLkxpbmtlZExpc3Q7XG52YXIgTWF0cml4ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTEpLk1hdHJpeDtcbnZhciBTVkQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MSkuU1ZEO1xuXG5mdW5jdGlvbiBDb25zdHJhaW50SGFuZGxlcigpIHt9XG5cbkNvbnN0cmFpbnRIYW5kbGVyLmhhbmRsZUNvbnN0cmFpbnRzID0gZnVuY3Rpb24gKGxheW91dCkge1xuICAvLyAgbGV0IGxheW91dCA9IHRoaXMuZ3JhcGhNYW5hZ2VyLmdldExheW91dCgpO1xuXG4gIC8vIGdldCBjb25zdHJhaW50cyBmcm9tIGxheW91dFxuICB2YXIgY29uc3RyYWludHMgPSB7fTtcbiAgY29uc3RyYWludHMuZml4ZWROb2RlQ29uc3RyYWludCA9IGxheW91dC5jb25zdHJhaW50cy5maXhlZE5vZGVDb25zdHJhaW50O1xuICBjb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50ID0gbGF5b3V0LmNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQ7XG4gIGNvbnN0cmFpbnRzLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludCA9IGxheW91dC5jb25zdHJhaW50cy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQ7XG5cbiAgdmFyIGlkVG9Ob2RlTWFwID0gbmV3IE1hcCgpO1xuICB2YXIgbm9kZUluZGV4ZXMgPSBuZXcgTWFwKCk7XG4gIHZhciB4Q29vcmRzID0gW107XG4gIHZhciB5Q29vcmRzID0gW107XG5cbiAgdmFyIGFsbE5vZGVzID0gbGF5b3V0LmdldEFsbE5vZGVzKCk7XG4gIHZhciBpbmRleCA9IDA7XG4gIC8vIGZpbGwgaW5kZXggbWFwIGFuZCBjb29yZGluYXRlc1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG5vZGUgPSBhbGxOb2Rlc1tpXTtcbiAgICBpZiAobm9kZS5nZXRDaGlsZCgpID09IG51bGwpIHtcbiAgICAgIG5vZGVJbmRleGVzLnNldChub2RlLmlkLCBpbmRleCsrKTtcbiAgICAgIHhDb29yZHMucHVzaChub2RlLmdldENlbnRlclgoKSk7XG4gICAgICB5Q29vcmRzLnB1c2gobm9kZS5nZXRDZW50ZXJZKCkpO1xuICAgICAgaWRUb05vZGVNYXAuc2V0KG5vZGUuaWQsIG5vZGUpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGlmIHRoZXJlIGV4aXN0cyByZWxhdGl2ZSBwbGFjZW1lbnQgY29uc3RyYWludCB3aXRob3V0IGdhcCB2YWx1ZSwgc2V0IGl0IHRvIGRlZmF1bHQgXG4gIGlmIChjb25zdHJhaW50cy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQpIHtcbiAgICBjb25zdHJhaW50cy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQuZm9yRWFjaChmdW5jdGlvbiAoY29uc3RyYWludCkge1xuICAgICAgaWYgKCFjb25zdHJhaW50LmdhcCAmJiBjb25zdHJhaW50LmdhcCAhPSAwKSB7XG4gICAgICAgIGlmIChjb25zdHJhaW50LmxlZnQpIHtcbiAgICAgICAgICBjb25zdHJhaW50LmdhcCA9IENvU0VDb25zdGFudHMuREVGQVVMVF9FREdFX0xFTkdUSCArIGlkVG9Ob2RlTWFwLmdldChjb25zdHJhaW50LmxlZnQpLmdldFdpZHRoKCkgLyAyICsgaWRUb05vZGVNYXAuZ2V0KGNvbnN0cmFpbnQucmlnaHQpLmdldFdpZHRoKCkgLyAyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0cmFpbnQuZ2FwID0gQ29TRUNvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIICsgaWRUb05vZGVNYXAuZ2V0KGNvbnN0cmFpbnQudG9wKS5nZXRIZWlnaHQoKSAvIDIgKyBpZFRvTm9kZU1hcC5nZXQoY29uc3RyYWludC5ib3R0b20pLmdldEhlaWdodCgpIC8gMjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyogYXV4aWxpYXJ5IGZ1bmN0aW9ucyAqL1xuXG4gIC8vIGNhbGN1bGF0ZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIHBvc2l0aW9uIG9iamVjdHNcbiAgdmFyIGNhbGN1bGF0ZVBvc2l0aW9uRGlmZiA9IGZ1bmN0aW9uIGNhbGN1bGF0ZVBvc2l0aW9uRGlmZihwb3MxLCBwb3MyKSB7XG4gICAgcmV0dXJuIHsgeDogcG9zMS54IC0gcG9zMi54LCB5OiBwb3MxLnkgLSBwb3MyLnkgfTtcbiAgfTtcblxuICAvLyBjYWxjdWxhdGUgYXZlcmFnZSBwb3NpdGlvbiBvZiB0aGUgbm9kZXNcbiAgdmFyIGNhbGN1bGF0ZUF2Z1Bvc2l0aW9uID0gZnVuY3Rpb24gY2FsY3VsYXRlQXZnUG9zaXRpb24obm9kZUlkU2V0KSB7XG4gICAgdmFyIHhQb3NTdW0gPSAwO1xuICAgIHZhciB5UG9zU3VtID0gMDtcbiAgICBub2RlSWRTZXQuZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICB4UG9zU3VtICs9IHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVJZCldO1xuICAgICAgeVBvc1N1bSArPSB5Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlSWQpXTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7IHg6IHhQb3NTdW0gLyBub2RlSWRTZXQuc2l6ZSwgeTogeVBvc1N1bSAvIG5vZGVJZFNldC5zaXplIH07XG4gIH07XG5cbiAgLy8gZmluZCBhbiBhcHByb3ByaWF0ZSBwb3NpdGlvbmluZyBmb3IgdGhlIG5vZGVzIGluIGEgZ2l2ZW4gZ3JhcGggYWNjb3JkaW5nIHRvIHJlbGF0aXZlIHBsYWNlbWVudCBjb25zdHJhaW50c1xuICAvLyB0aGlzIGZ1bmN0aW9uIGFsc28gdGFrZXMgdGhlIGZpeGVkIG5vZGVzIGFuZCBhbGlnbm1lbnQgY29uc3RyYWludHMgaW50byBhY2NvdW50XG4gIC8vIGdyYXBoOiBkYWcgdG8gYmUgZXZhbHVhdGVkLCBkaXJlY3Rpb246IFwiaG9yaXpvbnRhbFwiIG9yIFwidmVydGljYWxcIiwgXG4gIC8vIGZpeGVkTm9kZXM6IHNldCBvZiBmaXhlZCBub2RlcyB0byBjb25zaWRlciBkdXJpbmcgZXZhbHVhdGlvbiwgZHVtbXlQb3NpdGlvbnM6IGFwcHJvcHJpYXRlIGNvb3JkaW5hdGVzIG9mIHRoZSBkdW1teSBub2RlcyAgXG4gIHZhciBmaW5kQXBwcm9wcmlhdGVQb3NpdGlvbkZvclJlbGF0aXZlUGxhY2VtZW50ID0gZnVuY3Rpb24gZmluZEFwcHJvcHJpYXRlUG9zaXRpb25Gb3JSZWxhdGl2ZVBsYWNlbWVudChncmFwaCwgZGlyZWN0aW9uLCBmaXhlZE5vZGVzLCBkdW1teVBvc2l0aW9ucywgY29tcG9uZW50U291cmNlcykge1xuXG4gICAgLy8gZmluZCB1bmlvbiBvZiB0d28gc2V0c1xuICAgIGZ1bmN0aW9uIHNldFVuaW9uKHNldEEsIHNldEIpIHtcbiAgICAgIHZhciB1bmlvbiA9IG5ldyBTZXQoc2V0QSk7XG4gICAgICB2YXIgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IHRydWU7XG4gICAgICB2YXIgX2RpZEl0ZXJhdG9yRXJyb3IgPSBmYWxzZTtcbiAgICAgIHZhciBfaXRlcmF0b3JFcnJvciA9IHVuZGVmaW5lZDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yID0gc2V0QltTeW1ib2wuaXRlcmF0b3JdKCksIF9zdGVwOyAhKF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSAoX3N0ZXAgPSBfaXRlcmF0b3IubmV4dCgpKS5kb25lKTsgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IHRydWUpIHtcbiAgICAgICAgICB2YXIgZWxlbSA9IF9zdGVwLnZhbHVlO1xuXG4gICAgICAgICAgdW5pb24uYWRkKGVsZW0pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3IgPSB0cnVlO1xuICAgICAgICBfaXRlcmF0b3JFcnJvciA9IGVycjtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKCFfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uICYmIF9pdGVyYXRvci5yZXR1cm4pIHtcbiAgICAgICAgICAgIF9pdGVyYXRvci5yZXR1cm4oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgaWYgKF9kaWRJdGVyYXRvckVycm9yKSB7XG4gICAgICAgICAgICB0aHJvdyBfaXRlcmF0b3JFcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVuaW9uO1xuICAgIH1cblxuICAgIC8vIGZpbmQgaW5kZWdyZWUgY291bnQgZm9yIGVhY2ggbm9kZVxuICAgIHZhciBpbkRlZ3JlZXMgPSBuZXcgTWFwKCk7XG5cbiAgICBncmFwaC5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICBpbkRlZ3JlZXMuc2V0KGtleSwgMCk7XG4gICAgfSk7XG4gICAgZ3JhcGguZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbiAoYWRqYWNlbnQpIHtcbiAgICAgICAgaW5EZWdyZWVzLnNldChhZGphY2VudC5pZCwgaW5EZWdyZWVzLmdldChhZGphY2VudC5pZCkgKyAxKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdmFyIHBvc2l0aW9uTWFwID0gbmV3IE1hcCgpOyAvLyBrZWVwcyB0aGUgcG9zaXRpb24gZm9yIGVhY2ggbm9kZVxuICAgIHZhciBwYXN0TWFwID0gbmV3IE1hcCgpOyAvLyBrZWVwcyB0aGUgcHJlZGVjZXNzb3JzKHBhc3QpIG9mIGEgbm9kZVxuICAgIHZhciBxdWV1ZSA9IG5ldyBMaW5rZWRMaXN0KCk7XG4gICAgaW5EZWdyZWVzLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgIGlmICh2YWx1ZSA9PSAwKSB7XG4gICAgICAgIHF1ZXVlLnB1c2goa2V5KTtcbiAgICAgICAgaWYgKCFmaXhlZE5vZGVzKSB7XG4gICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBcImhvcml6b250YWxcIikge1xuICAgICAgICAgICAgcG9zaXRpb25NYXAuc2V0KGtleSwgbm9kZUluZGV4ZXMuaGFzKGtleSkgPyB4Q29vcmRzW25vZGVJbmRleGVzLmdldChrZXkpXSA6IGR1bW15UG9zaXRpb25zLmdldChrZXkpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcG9zaXRpb25NYXAuc2V0KGtleSwgbm9kZUluZGV4ZXMuaGFzKGtleSkgPyB5Q29vcmRzW25vZGVJbmRleGVzLmdldChrZXkpXSA6IGR1bW15UG9zaXRpb25zLmdldChrZXkpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBvc2l0aW9uTWFwLnNldChrZXksIE51bWJlci5ORUdBVElWRV9JTkZJTklUWSk7XG4gICAgICB9XG4gICAgICBpZiAoZml4ZWROb2Rlcykge1xuICAgICAgICBwYXN0TWFwLnNldChrZXksIG5ldyBTZXQoW2tleV0pKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIGFsaWduIHNvdXJjZXMgb2YgZWFjaCBjb21wb25lbnQgaW4gZW5mb3JjZW1lbnQgcGhhc2VcbiAgICBpZiAoZml4ZWROb2Rlcykge1xuICAgICAgY29tcG9uZW50U291cmNlcy5mb3JFYWNoKGZ1bmN0aW9uIChjb21wb25lbnQpIHtcbiAgICAgICAgdmFyIGZpeGVkSWRzID0gW107XG4gICAgICAgIGNvbXBvbmVudC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICBpZiAoZml4ZWROb2Rlcy5oYXMobm9kZUlkKSkge1xuICAgICAgICAgICAgZml4ZWRJZHMucHVzaChub2RlSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChmaXhlZElkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdmFyIHBvc2l0aW9uID0gMDtcbiAgICAgICAgICBmaXhlZElkcy5mb3JFYWNoKGZ1bmN0aW9uIChmaXhlZElkKSB7XG4gICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09IFwiaG9yaXpvbnRhbFwiKSB7XG4gICAgICAgICAgICAgIHBvc2l0aW9uTWFwLnNldChmaXhlZElkLCBub2RlSW5kZXhlcy5oYXMoZml4ZWRJZCkgPyB4Q29vcmRzW25vZGVJbmRleGVzLmdldChmaXhlZElkKV0gOiBkdW1teVBvc2l0aW9ucy5nZXQoZml4ZWRJZCkpO1xuICAgICAgICAgICAgICBwb3NpdGlvbiArPSBwb3NpdGlvbk1hcC5nZXQoZml4ZWRJZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwb3NpdGlvbk1hcC5zZXQoZml4ZWRJZCwgbm9kZUluZGV4ZXMuaGFzKGZpeGVkSWQpID8geUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQoZml4ZWRJZCldIDogZHVtbXlQb3NpdGlvbnMuZ2V0KGZpeGVkSWQpKTtcbiAgICAgICAgICAgICAgcG9zaXRpb24gKz0gcG9zaXRpb25NYXAuZ2V0KGZpeGVkSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb24gLyBmaXhlZElkcy5sZW5ndGg7XG4gICAgICAgICAgY29tcG9uZW50LmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgaWYgKCFmaXhlZE5vZGVzLmhhcyhub2RlSWQpKSB7XG4gICAgICAgICAgICAgIHBvc2l0aW9uTWFwLnNldChub2RlSWQsIHBvc2l0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgX3Bvc2l0aW9uID0gMDtcbiAgICAgICAgICBjb21wb25lbnQuZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09IFwiaG9yaXpvbnRhbFwiKSB7XG4gICAgICAgICAgICAgIF9wb3NpdGlvbiArPSBub2RlSW5kZXhlcy5oYXMobm9kZUlkKSA/IHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVJZCldIDogZHVtbXlQb3NpdGlvbnMuZ2V0KG5vZGVJZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBfcG9zaXRpb24gKz0gbm9kZUluZGV4ZXMuaGFzKG5vZGVJZCkgPyB5Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlSWQpXSA6IGR1bW15UG9zaXRpb25zLmdldChub2RlSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9wb3NpdGlvbiA9IF9wb3NpdGlvbiAvIGNvbXBvbmVudC5sZW5ndGg7XG4gICAgICAgICAgY29tcG9uZW50LmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgcG9zaXRpb25NYXAuc2V0KG5vZGVJZCwgX3Bvc2l0aW9uKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gY2FsY3VsYXRlIHBvc2l0aW9ucyBvZiB0aGUgbm9kZXNcblxuICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKCkge1xuICAgICAgdmFyIGN1cnJlbnROb2RlID0gcXVldWUuc2hpZnQoKTtcbiAgICAgIHZhciBuZWlnaGJvcnMgPSBncmFwaC5nZXQoY3VycmVudE5vZGUpO1xuICAgICAgbmVpZ2hib3JzLmZvckVhY2goZnVuY3Rpb24gKG5laWdoYm9yKSB7XG4gICAgICAgIGlmIChwb3NpdGlvbk1hcC5nZXQobmVpZ2hib3IuaWQpIDwgcG9zaXRpb25NYXAuZ2V0KGN1cnJlbnROb2RlKSArIG5laWdoYm9yLmdhcCkge1xuICAgICAgICAgIGlmIChmaXhlZE5vZGVzICYmIGZpeGVkTm9kZXMuaGFzKG5laWdoYm9yLmlkKSkge1xuICAgICAgICAgICAgdmFyIGZpeGVkUG9zaXRpb24gPSB2b2lkIDA7XG4gICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09IFwiaG9yaXpvbnRhbFwiKSB7XG4gICAgICAgICAgICAgIGZpeGVkUG9zaXRpb24gPSBub2RlSW5kZXhlcy5oYXMobmVpZ2hib3IuaWQpID8geENvb3Jkc1tub2RlSW5kZXhlcy5nZXQobmVpZ2hib3IuaWQpXSA6IGR1bW15UG9zaXRpb25zLmdldChuZWlnaGJvci5pZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBmaXhlZFBvc2l0aW9uID0gbm9kZUluZGV4ZXMuaGFzKG5laWdoYm9yLmlkKSA/IHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5laWdoYm9yLmlkKV0gOiBkdW1teVBvc2l0aW9ucy5nZXQobmVpZ2hib3IuaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG9zaXRpb25NYXAuc2V0KG5laWdoYm9yLmlkLCBmaXhlZFBvc2l0aW9uKTsgLy8gVE9ETzogbWF5IGRvIHVubmVjZXNzYXJ5IHdvcmtcbiAgICAgICAgICAgIGlmIChmaXhlZFBvc2l0aW9uIDwgcG9zaXRpb25NYXAuZ2V0KGN1cnJlbnROb2RlKSArIG5laWdoYm9yLmdhcCkge1xuICAgICAgICAgICAgICB2YXIgZGlmZiA9IHBvc2l0aW9uTWFwLmdldChjdXJyZW50Tm9kZSkgKyBuZWlnaGJvci5nYXAgLSBmaXhlZFBvc2l0aW9uO1xuICAgICAgICAgICAgICBwYXN0TWFwLmdldChjdXJyZW50Tm9kZSkuZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICAgICAgcG9zaXRpb25NYXAuc2V0KG5vZGVJZCwgcG9zaXRpb25NYXAuZ2V0KG5vZGVJZCkgLSBkaWZmKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBvc2l0aW9uTWFwLnNldChuZWlnaGJvci5pZCwgcG9zaXRpb25NYXAuZ2V0KGN1cnJlbnROb2RlKSArIG5laWdoYm9yLmdhcCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGluRGVncmVlcy5zZXQobmVpZ2hib3IuaWQsIGluRGVncmVlcy5nZXQobmVpZ2hib3IuaWQpIC0gMSk7XG4gICAgICAgIGlmIChpbkRlZ3JlZXMuZ2V0KG5laWdoYm9yLmlkKSA9PSAwKSB7XG4gICAgICAgICAgcXVldWUucHVzaChuZWlnaGJvci5pZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpeGVkTm9kZXMpIHtcbiAgICAgICAgICBwYXN0TWFwLnNldChuZWlnaGJvci5pZCwgc2V0VW5pb24ocGFzdE1hcC5nZXQoY3VycmVudE5vZGUpLCBwYXN0TWFwLmdldChuZWlnaGJvci5pZCkpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHdoaWxlIChxdWV1ZS5sZW5ndGggIT0gMCkge1xuICAgICAgX2xvb3AoKTtcbiAgICB9XG5cbiAgICAvLyByZWFkanVzdCBwb3NpdGlvbiBvZiB0aGUgbm9kZXMgYWZ0ZXIgZW5mb3JjZW1lbnRcbiAgICBpZiAoZml4ZWROb2Rlcykge1xuICAgICAgLy8gZmluZCBpbmRlZ3JlZSBjb3VudCBmb3IgZWFjaCBub2RlXG4gICAgICB2YXIgc2lua05vZGVzID0gbmV3IFNldCgpO1xuXG4gICAgICBncmFwaC5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPT0gMCkge1xuICAgICAgICAgIHNpbmtOb2Rlcy5hZGQoa2V5KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHZhciBfY29tcG9uZW50cyA9IFtdO1xuICAgICAgcGFzdE1hcC5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICAgIGlmIChzaW5rTm9kZXMuaGFzKGtleSkpIHtcbiAgICAgICAgICB2YXIgaXNGaXhlZENvbXBvbmVudCA9IGZhbHNlO1xuICAgICAgICAgIHZhciBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMiA9IHRydWU7XG4gICAgICAgICAgdmFyIF9kaWRJdGVyYXRvckVycm9yMiA9IGZhbHNlO1xuICAgICAgICAgIHZhciBfaXRlcmF0b3JFcnJvcjIgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yMiA9IHZhbHVlW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3N0ZXAyOyAhKF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24yID0gKF9zdGVwMiA9IF9pdGVyYXRvcjIubmV4dCgpKS5kb25lKTsgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjIgPSB0cnVlKSB7XG4gICAgICAgICAgICAgIHZhciBub2RlSWQgPSBfc3RlcDIudmFsdWU7XG5cbiAgICAgICAgICAgICAgaWYgKGZpeGVkTm9kZXMuaGFzKG5vZGVJZCkpIHtcbiAgICAgICAgICAgICAgICBpc0ZpeGVkQ29tcG9uZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3IyID0gdHJ1ZTtcbiAgICAgICAgICAgIF9pdGVyYXRvckVycm9yMiA9IGVycjtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgaWYgKCFfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMiAmJiBfaXRlcmF0b3IyLnJldHVybikge1xuICAgICAgICAgICAgICAgIF9pdGVyYXRvcjIucmV0dXJuKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgIGlmIChfZGlkSXRlcmF0b3JFcnJvcjIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBfaXRlcmF0b3JFcnJvcjI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIWlzRml4ZWRDb21wb25lbnQpIHtcbiAgICAgICAgICAgIHZhciBpc0V4aXN0ID0gZmFsc2U7XG4gICAgICAgICAgICB2YXIgZXhpc3RBdCA9IHZvaWQgMDtcbiAgICAgICAgICAgIF9jb21wb25lbnRzLmZvckVhY2goZnVuY3Rpb24gKGNvbXBvbmVudCwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5oYXMoW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheSh2YWx1ZSkpWzBdKSkge1xuICAgICAgICAgICAgICAgIGlzRXhpc3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGV4aXN0QXQgPSBpbmRleDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIWlzRXhpc3QpIHtcbiAgICAgICAgICAgICAgX2NvbXBvbmVudHMucHVzaChuZXcgU2V0KHZhbHVlKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgICAgICAgICBfY29tcG9uZW50c1tleGlzdEF0XS5hZGQoZWxlKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgX2NvbXBvbmVudHMuZm9yRWFjaChmdW5jdGlvbiAoY29tcG9uZW50LCBpbmRleCkge1xuICAgICAgICB2YXIgbWluQmVmb3JlID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICAgICAgICB2YXIgbWluQWZ0ZXIgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgICAgIHZhciBtYXhCZWZvcmUgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG4gICAgICAgIHZhciBtYXhBZnRlciA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTtcblxuICAgICAgICB2YXIgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjMgPSB0cnVlO1xuICAgICAgICB2YXIgX2RpZEl0ZXJhdG9yRXJyb3IzID0gZmFsc2U7XG4gICAgICAgIHZhciBfaXRlcmF0b3JFcnJvcjMgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3IzID0gY29tcG9uZW50W1N5bWJvbC5pdGVyYXRvcl0oKSwgX3N0ZXAzOyAhKF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24zID0gKF9zdGVwMyA9IF9pdGVyYXRvcjMubmV4dCgpKS5kb25lKTsgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjMgPSB0cnVlKSB7XG4gICAgICAgICAgICB2YXIgbm9kZUlkID0gX3N0ZXAzLnZhbHVlO1xuXG4gICAgICAgICAgICB2YXIgcG9zQmVmb3JlID0gdm9pZCAwO1xuICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBcImhvcml6b250YWxcIikge1xuICAgICAgICAgICAgICBwb3NCZWZvcmUgPSBub2RlSW5kZXhlcy5oYXMobm9kZUlkKSA/IHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVJZCldIDogZHVtbXlQb3NpdGlvbnMuZ2V0KG5vZGVJZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwb3NCZWZvcmUgPSBub2RlSW5kZXhlcy5oYXMobm9kZUlkKSA/IHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVJZCldIDogZHVtbXlQb3NpdGlvbnMuZ2V0KG5vZGVJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgcG9zQWZ0ZXIgPSBwb3NpdGlvbk1hcC5nZXQobm9kZUlkKTtcbiAgICAgICAgICAgIGlmIChwb3NCZWZvcmUgPCBtaW5CZWZvcmUpIHtcbiAgICAgICAgICAgICAgbWluQmVmb3JlID0gcG9zQmVmb3JlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBvc0JlZm9yZSA+IG1heEJlZm9yZSkge1xuICAgICAgICAgICAgICBtYXhCZWZvcmUgPSBwb3NCZWZvcmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocG9zQWZ0ZXIgPCBtaW5BZnRlcikge1xuICAgICAgICAgICAgICBtaW5BZnRlciA9IHBvc0FmdGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBvc0FmdGVyID4gbWF4QWZ0ZXIpIHtcbiAgICAgICAgICAgICAgbWF4QWZ0ZXIgPSBwb3NBZnRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yMyA9IHRydWU7XG4gICAgICAgICAgX2l0ZXJhdG9yRXJyb3IzID0gZXJyO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIV9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24zICYmIF9pdGVyYXRvcjMucmV0dXJuKSB7XG4gICAgICAgICAgICAgIF9pdGVyYXRvcjMucmV0dXJuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmIChfZGlkSXRlcmF0b3JFcnJvcjMpIHtcbiAgICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3IzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBkaWZmID0gKG1pbkJlZm9yZSArIG1heEJlZm9yZSkgLyAyIC0gKG1pbkFmdGVyICsgbWF4QWZ0ZXIpIC8gMjtcblxuICAgICAgICB2YXIgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjQgPSB0cnVlO1xuICAgICAgICB2YXIgX2RpZEl0ZXJhdG9yRXJyb3I0ID0gZmFsc2U7XG4gICAgICAgIHZhciBfaXRlcmF0b3JFcnJvcjQgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3I0ID0gY29tcG9uZW50W1N5bWJvbC5pdGVyYXRvcl0oKSwgX3N0ZXA0OyAhKF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb240ID0gKF9zdGVwNCA9IF9pdGVyYXRvcjQubmV4dCgpKS5kb25lKTsgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjQgPSB0cnVlKSB7XG4gICAgICAgICAgICB2YXIgX25vZGVJZCA9IF9zdGVwNC52YWx1ZTtcblxuICAgICAgICAgICAgcG9zaXRpb25NYXAuc2V0KF9ub2RlSWQsIHBvc2l0aW9uTWFwLmdldChfbm9kZUlkKSArIGRpZmYpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3I0ID0gdHJ1ZTtcbiAgICAgICAgICBfaXRlcmF0b3JFcnJvcjQgPSBlcnI7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjQgJiYgX2l0ZXJhdG9yNC5yZXR1cm4pIHtcbiAgICAgICAgICAgICAgX2l0ZXJhdG9yNC5yZXR1cm4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgaWYgKF9kaWRJdGVyYXRvckVycm9yNCkge1xuICAgICAgICAgICAgICB0aHJvdyBfaXRlcmF0b3JFcnJvcjQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcG9zaXRpb25NYXA7XG4gIH07XG5cbiAgLy8gZmluZCB0cmFuc2Zvcm1hdGlvbiBiYXNlZCBvbiByZWwuIHBsYWNlbWVudCBjb25zdHJhaW50cyBpZiB0aGVyZSBhcmUgYm90aCBhbGlnbm1lbnQgYW5kIHJlbC4gcGxhY2VtZW50IGNvbnN0cmFpbnRzXG4gIC8vIG9yIGlmIHRoZXJlIGFyZSBvbmx5IHJlbC4gcGxhY2VtZW50IGNvbnRyYWludHMgd2hlcmUgdGhlIGxhcmdlc3QgY29tcG9uZW50IGlzbid0IHN1ZmZpY2llbnRseSBsYXJnZVxuICB2YXIgYXBwbHlSZWZsZWN0aW9uRm9yUmVsYXRpdmVQbGFjZW1lbnQgPSBmdW5jdGlvbiBhcHBseVJlZmxlY3Rpb25Gb3JSZWxhdGl2ZVBsYWNlbWVudChyZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnRzKSB7XG4gICAgLy8gdmFyaWFibGVzIHRvIGNvdW50IHZvdGVzXG4gICAgdmFyIHJlZmxlY3RPblkgPSAwLFxuICAgICAgICBub3RSZWZsZWN0T25ZID0gMDtcbiAgICB2YXIgcmVmbGVjdE9uWCA9IDAsXG4gICAgICAgIG5vdFJlZmxlY3RPblggPSAwO1xuXG4gICAgcmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50cy5mb3JFYWNoKGZ1bmN0aW9uIChjb25zdHJhaW50KSB7XG4gICAgICBpZiAoY29uc3RyYWludC5sZWZ0KSB7XG4gICAgICAgIHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KGNvbnN0cmFpbnQubGVmdCldIC0geENvb3Jkc1tub2RlSW5kZXhlcy5nZXQoY29uc3RyYWludC5yaWdodCldID49IDAgPyByZWZsZWN0T25ZKysgOiBub3RSZWZsZWN0T25ZKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB5Q29vcmRzW25vZGVJbmRleGVzLmdldChjb25zdHJhaW50LnRvcCldIC0geUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQoY29uc3RyYWludC5ib3R0b20pXSA+PSAwID8gcmVmbGVjdE9uWCsrIDogbm90UmVmbGVjdE9uWCsrO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHJlZmxlY3RPblkgPiBub3RSZWZsZWN0T25ZICYmIHJlZmxlY3RPblggPiBub3RSZWZsZWN0T25YKSB7XG4gICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbm9kZUluZGV4ZXMuc2l6ZTsgX2krKykge1xuICAgICAgICB4Q29vcmRzW19pXSA9IC0xICogeENvb3Jkc1tfaV07XG4gICAgICAgIHlDb29yZHNbX2ldID0gLTEgKiB5Q29vcmRzW19pXTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHJlZmxlY3RPblkgPiBub3RSZWZsZWN0T25ZKSB7XG4gICAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBub2RlSW5kZXhlcy5zaXplOyBfaTIrKykge1xuICAgICAgICB4Q29vcmRzW19pMl0gPSAtMSAqIHhDb29yZHNbX2kyXTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHJlZmxlY3RPblggPiBub3RSZWZsZWN0T25YKSB7XG4gICAgICBmb3IgKHZhciBfaTMgPSAwOyBfaTMgPCBub2RlSW5kZXhlcy5zaXplOyBfaTMrKykge1xuICAgICAgICB5Q29vcmRzW19pM10gPSAtMSAqIHlDb29yZHNbX2kzXTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLy8gZmluZCB3ZWFrbHkgY29ubmVjdGVkIGNvbXBvbmVudHMgaW4gdW5kaXJlY3RlZCBncmFwaFxuICB2YXIgZmluZENvbXBvbmVudHMgPSBmdW5jdGlvbiBmaW5kQ29tcG9uZW50cyhncmFwaCkge1xuICAgIC8vIGZpbmQgd2Vha2x5IGNvbm5lY3RlZCBjb21wb25lbnRzIGluIGRhZ1xuICAgIHZhciBjb21wb25lbnRzID0gW107XG4gICAgdmFyIHF1ZXVlID0gbmV3IExpbmtlZExpc3QoKTtcbiAgICB2YXIgdmlzaXRlZCA9IG5ldyBTZXQoKTtcbiAgICB2YXIgY291bnQgPSAwO1xuXG4gICAgZ3JhcGguZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgaWYgKCF2aXNpdGVkLmhhcyhrZXkpKSB7XG4gICAgICAgIGNvbXBvbmVudHNbY291bnRdID0gW107XG4gICAgICAgIHZhciBfY3VycmVudE5vZGUgPSBrZXk7XG4gICAgICAgIHF1ZXVlLnB1c2goX2N1cnJlbnROb2RlKTtcbiAgICAgICAgdmlzaXRlZC5hZGQoX2N1cnJlbnROb2RlKTtcbiAgICAgICAgY29tcG9uZW50c1tjb3VudF0ucHVzaChfY3VycmVudE5vZGUpO1xuXG4gICAgICAgIHdoaWxlIChxdWV1ZS5sZW5ndGggIT0gMCkge1xuICAgICAgICAgIF9jdXJyZW50Tm9kZSA9IHF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgdmFyIG5laWdoYm9ycyA9IGdyYXBoLmdldChfY3VycmVudE5vZGUpO1xuICAgICAgICAgIG5laWdoYm9ycy5mb3JFYWNoKGZ1bmN0aW9uIChuZWlnaGJvcikge1xuICAgICAgICAgICAgaWYgKCF2aXNpdGVkLmhhcyhuZWlnaGJvci5pZCkpIHtcbiAgICAgICAgICAgICAgcXVldWUucHVzaChuZWlnaGJvci5pZCk7XG4gICAgICAgICAgICAgIHZpc2l0ZWQuYWRkKG5laWdoYm9yLmlkKTtcbiAgICAgICAgICAgICAgY29tcG9uZW50c1tjb3VudF0ucHVzaChuZWlnaGJvci5pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY291bnQrKztcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY29tcG9uZW50cztcbiAgfTtcblxuICAvLyByZXR1cm4gdW5kaXJlY3RlZCB2ZXJzaW9uIG9mIGdpdmVuIGRhZ1xuICB2YXIgZGFnVG9VbmRpcmVjdGVkID0gZnVuY3Rpb24gZGFnVG9VbmRpcmVjdGVkKGRhZykge1xuICAgIHZhciB1bmRpcmVjdGVkID0gbmV3IE1hcCgpO1xuXG4gICAgZGFnLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgIHVuZGlyZWN0ZWQuc2V0KGtleSwgW10pO1xuICAgIH0pO1xuXG4gICAgZGFnLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24gKGFkamFjZW50KSB7XG4gICAgICAgIHVuZGlyZWN0ZWQuZ2V0KGtleSkucHVzaChhZGphY2VudCk7XG4gICAgICAgIHVuZGlyZWN0ZWQuZ2V0KGFkamFjZW50LmlkKS5wdXNoKHsgaWQ6IGtleSwgZ2FwOiBhZGphY2VudC5nYXAsIGRpcmVjdGlvbjogYWRqYWNlbnQuZGlyZWN0aW9uIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdW5kaXJlY3RlZDtcbiAgfTtcblxuICAvLyByZXR1cm4gcmV2ZXJzZWQgKGRpcmVjdGlvbnMgaW52ZXJ0ZWQpIHZlcnNpb24gb2YgZ2l2ZW4gZGFnXG4gIHZhciBkYWdUb1JldmVyc2VkID0gZnVuY3Rpb24gZGFnVG9SZXZlcnNlZChkYWcpIHtcbiAgICB2YXIgcmV2ZXJzZWQgPSBuZXcgTWFwKCk7XG5cbiAgICBkYWcuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgcmV2ZXJzZWQuc2V0KGtleSwgW10pO1xuICAgIH0pO1xuXG4gICAgZGFnLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24gKGFkamFjZW50KSB7XG4gICAgICAgIHJldmVyc2VkLmdldChhZGphY2VudC5pZCkucHVzaCh7IGlkOiBrZXksIGdhcDogYWRqYWNlbnQuZ2FwLCBkaXJlY3Rpb246IGFkamFjZW50LmRpcmVjdGlvbiB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJldmVyc2VkO1xuICB9O1xuXG4gIC8qKioqICBhcHBseSB0cmFuc2Zvcm1hdGlvbiB0byB0aGUgaW5pdGlhbCBkcmFmdCBsYXlvdXQgdG8gYmV0dGVyIGFsaWduIHdpdGggY29uc3RyYWluZWQgbm9kZXMgKioqKi9cbiAgLy8gc29sdmUgdGhlIE9ydGhvZ29uYWwgUHJvY3J1c3RlYW4gUHJvYmxlbSB0byByb3RhdGUgYW5kL29yIHJlZmxlY3QgaW5pdGlhbCBkcmFmdCBsYXlvdXRcbiAgLy8gaGVyZSB3ZSBmb2xsb3cgdGhlIHNvbHV0aW9uIGluIENoYXB0ZXIgMjAuMiBvZiBCb3JnLCBJLiAmIEdyb2VuZW4sIFAuICgyMDA1KSBNb2Rlcm4gTXVsdGlkaW1lbnNpb25hbCBTY2FsaW5nOiBUaGVvcnkgYW5kIEFwcGxpY2F0aW9ucyBcblxuICAvKiBjb25zdHJ1Y3Qgc291cmNlIGFuZCB0YXJnZXQgY29uZmlndXJhdGlvbnMgKi9cblxuICB2YXIgdGFyZ2V0TWF0cml4ID0gW107IC8vIEEgLSB0YXJnZXQgY29uZmlndXJhdGlvblxuICB2YXIgc291cmNlTWF0cml4ID0gW107IC8vIEIgLSBzb3VyY2UgY29uZmlndXJhdGlvbiBcbiAgdmFyIHN0YW5kYXJkVHJhbnNmb3JtYXRpb24gPSBmYWxzZTsgLy8gZmFsc2UgZm9yIG5vIHRyYW5zZm9ybWF0aW9uLCB0cnVlIGZvciBzdGFuZGFydCAoUHJvY3J1c3RlcykgdHJhbnNmb3JtYXRpb24gKHJvdGF0aW9uIGFuZC9vciByZWZsZWN0aW9uKVxuICB2YXIgcmVmbGVjdGlvblR5cGUgPSBmYWxzZTsgLy8gZmFsc2UvdHJ1ZSBmb3IgcmVmbGVjdGlvbiBjaGVjaywgJ3JlZmxlY3RPblgnLCAncmVmbGVjdE9uWScgb3IgJ3JlZmxlY3RPbkJvdGgnIGZvciByZWZsZWN0aW9uIHR5cGUgaWYgbmVjZXNzYXJ5XG4gIHZhciBmaXhlZE5vZGVzID0gbmV3IFNldCgpO1xuICB2YXIgZGFnID0gbmV3IE1hcCgpOyAvLyBhZGphY2VuY3kgbGlzdCB0byBrZWVwIGRpcmVjdGVkIGFjeWNsaWMgZ3JhcGggKGRhZykgdGhhdCBjb25zaXN0cyBvZiByZWxhdGl2ZSBwbGFjZW1lbnQgY29uc3RyYWludHNcbiAgdmFyIGRhZ1VuZGlyZWN0ZWQgPSBuZXcgTWFwKCk7IC8vIHVuZGlyZWN0ZWQgdmVyc2lvbiBvZiB0aGUgZGFnXG4gIHZhciBjb21wb25lbnRzID0gW107IC8vIHdlYWtseSBjb25uZWN0ZWQgY29tcG9uZW50c1xuXG4gIC8vIGZpbGwgZml4ZWROb2RlcyBjb2xsZWN0aW9uIHRvIHVzZSBsYXRlclxuICBpZiAoY29uc3RyYWludHMuZml4ZWROb2RlQ29uc3RyYWludCkge1xuICAgIGNvbnN0cmFpbnRzLmZpeGVkTm9kZUNvbnN0cmFpbnQuZm9yRWFjaChmdW5jdGlvbiAobm9kZURhdGEpIHtcbiAgICAgIGZpeGVkTm9kZXMuYWRkKG5vZGVEYXRhLm5vZGVJZCk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBjb25zdHJ1Y3QgZGFnIGZyb20gcmVsYXRpdmUgcGxhY2VtZW50IGNvbnN0cmFpbnRzIFxuICBpZiAoY29uc3RyYWludHMucmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50KSB7XG4gICAgLy8gY29uc3RydWN0IGJvdGggZGlyZWN0ZWQgYW5kIHVuZGlyZWN0ZWQgdmVyc2lvbiBvZiB0aGUgZGFnXG4gICAgY29uc3RyYWludHMucmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50LmZvckVhY2goZnVuY3Rpb24gKGNvbnN0cmFpbnQpIHtcbiAgICAgIGlmIChjb25zdHJhaW50LmxlZnQpIHtcbiAgICAgICAgaWYgKGRhZy5oYXMoY29uc3RyYWludC5sZWZ0KSkge1xuICAgICAgICAgIGRhZy5nZXQoY29uc3RyYWludC5sZWZ0KS5wdXNoKHsgaWQ6IGNvbnN0cmFpbnQucmlnaHQsIGdhcDogY29uc3RyYWludC5nYXAsIGRpcmVjdGlvbjogXCJob3Jpem9udGFsXCIgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGFnLnNldChjb25zdHJhaW50LmxlZnQsIFt7IGlkOiBjb25zdHJhaW50LnJpZ2h0LCBnYXA6IGNvbnN0cmFpbnQuZ2FwLCBkaXJlY3Rpb246IFwiaG9yaXpvbnRhbFwiIH1dKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWRhZy5oYXMoY29uc3RyYWludC5yaWdodCkpIHtcbiAgICAgICAgICBkYWcuc2V0KGNvbnN0cmFpbnQucmlnaHQsIFtdKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGRhZy5oYXMoY29uc3RyYWludC50b3ApKSB7XG4gICAgICAgICAgZGFnLmdldChjb25zdHJhaW50LnRvcCkucHVzaCh7IGlkOiBjb25zdHJhaW50LmJvdHRvbSwgZ2FwOiBjb25zdHJhaW50LmdhcCwgZGlyZWN0aW9uOiBcInZlcnRpY2FsXCIgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGFnLnNldChjb25zdHJhaW50LnRvcCwgW3sgaWQ6IGNvbnN0cmFpbnQuYm90dG9tLCBnYXA6IGNvbnN0cmFpbnQuZ2FwLCBkaXJlY3Rpb246IFwidmVydGljYWxcIiB9XSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFkYWcuaGFzKGNvbnN0cmFpbnQuYm90dG9tKSkge1xuICAgICAgICAgIGRhZy5zZXQoY29uc3RyYWludC5ib3R0b20sIFtdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZGFnVW5kaXJlY3RlZCA9IGRhZ1RvVW5kaXJlY3RlZChkYWcpO1xuICAgIGNvbXBvbmVudHMgPSBmaW5kQ29tcG9uZW50cyhkYWdVbmRpcmVjdGVkKTtcbiAgfVxuXG4gIGlmIChDb1NFQ29uc3RhbnRzLlRSQU5TRk9STV9PTl9DT05TVFJBSU5UX0hBTkRMSU5HKSB7XG4gICAgLy8gZmlyc3QgY2hlY2sgZml4ZWQgbm9kZSBjb25zdHJhaW50XG4gICAgaWYgKGNvbnN0cmFpbnRzLmZpeGVkTm9kZUNvbnN0cmFpbnQgJiYgY29uc3RyYWludHMuZml4ZWROb2RlQ29uc3RyYWludC5sZW5ndGggPiAxKSB7XG4gICAgICBjb25zdHJhaW50cy5maXhlZE5vZGVDb25zdHJhaW50LmZvckVhY2goZnVuY3Rpb24gKG5vZGVEYXRhLCBpKSB7XG4gICAgICAgIHRhcmdldE1hdHJpeFtpXSA9IFtub2RlRGF0YS5wb3NpdGlvbi54LCBub2RlRGF0YS5wb3NpdGlvbi55XTtcbiAgICAgICAgc291cmNlTWF0cml4W2ldID0gW3hDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVEYXRhLm5vZGVJZCldLCB5Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlRGF0YS5ub2RlSWQpXV07XG4gICAgICB9KTtcbiAgICAgIHN0YW5kYXJkVHJhbnNmb3JtYXRpb24gPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludCkge1xuICAgICAgKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gdGhlbiBjaGVjayBhbGlnbm1lbnQgY29uc3RyYWludFxuICAgICAgICB2YXIgY291bnQgPSAwO1xuICAgICAgICBpZiAoY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludC52ZXJ0aWNhbCkge1xuICAgICAgICAgIHZhciB2ZXJ0aWNhbEFsaWduID0gY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludC52ZXJ0aWNhbDtcblxuICAgICAgICAgIHZhciBfbG9vcDIgPSBmdW5jdGlvbiBfbG9vcDIoX2k0KSB7XG4gICAgICAgICAgICB2YXIgYWxpZ25tZW50U2V0ID0gbmV3IFNldCgpO1xuICAgICAgICAgICAgdmVydGljYWxBbGlnbltfaTRdLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgICBhbGlnbm1lbnRTZXQuYWRkKG5vZGVJZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHZhciBpbnRlcnNlY3Rpb24gPSBuZXcgU2V0KFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoYWxpZ25tZW50U2V0KSkuZmlsdGVyKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICAgIHJldHVybiBmaXhlZE5vZGVzLmhhcyh4KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIHZhciB4UG9zID0gdm9pZCAwO1xuICAgICAgICAgICAgaWYgKGludGVyc2VjdGlvbi5zaXplID4gMCkgeFBvcyA9IHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KGludGVyc2VjdGlvbi52YWx1ZXMoKS5uZXh0KCkudmFsdWUpXTtlbHNlIHhQb3MgPSBjYWxjdWxhdGVBdmdQb3NpdGlvbihhbGlnbm1lbnRTZXQpLng7XG5cbiAgICAgICAgICAgIHZlcnRpY2FsQWxpZ25bX2k0XS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgICAgdGFyZ2V0TWF0cml4W2NvdW50XSA9IFt4UG9zLCB5Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlSWQpXV07XG4gICAgICAgICAgICAgIHNvdXJjZU1hdHJpeFtjb3VudF0gPSBbeENvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZUlkKV0sIHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVJZCldXTtcbiAgICAgICAgICAgICAgY291bnQrKztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBmb3IgKHZhciBfaTQgPSAwOyBfaTQgPCB2ZXJ0aWNhbEFsaWduLmxlbmd0aDsgX2k0KyspIHtcbiAgICAgICAgICAgIF9sb29wMihfaTQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdGFuZGFyZFRyYW5zZm9ybWF0aW9uID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludC5ob3Jpem9udGFsKSB7XG4gICAgICAgICAgdmFyIGhvcml6b250YWxBbGlnbiA9IGNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQuaG9yaXpvbnRhbDtcblxuICAgICAgICAgIHZhciBfbG9vcDMgPSBmdW5jdGlvbiBfbG9vcDMoX2k1KSB7XG4gICAgICAgICAgICB2YXIgYWxpZ25tZW50U2V0ID0gbmV3IFNldCgpO1xuICAgICAgICAgICAgaG9yaXpvbnRhbEFsaWduW19pNV0uZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICAgIGFsaWdubWVudFNldC5hZGQobm9kZUlkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdmFyIGludGVyc2VjdGlvbiA9IG5ldyBTZXQoW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShhbGlnbm1lbnRTZXQpKS5maWx0ZXIoZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZpeGVkTm9kZXMuaGFzKHgpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgdmFyIHlQb3MgPSB2b2lkIDA7XG4gICAgICAgICAgICBpZiAoaW50ZXJzZWN0aW9uLnNpemUgPiAwKSB5UG9zID0geENvb3Jkc1tub2RlSW5kZXhlcy5nZXQoaW50ZXJzZWN0aW9uLnZhbHVlcygpLm5leHQoKS52YWx1ZSldO2Vsc2UgeVBvcyA9IGNhbGN1bGF0ZUF2Z1Bvc2l0aW9uKGFsaWdubWVudFNldCkueTtcblxuICAgICAgICAgICAgaG9yaXpvbnRhbEFsaWduW19pNV0uZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICAgIHRhcmdldE1hdHJpeFtjb3VudF0gPSBbeENvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZUlkKV0sIHlQb3NdO1xuICAgICAgICAgICAgICBzb3VyY2VNYXRyaXhbY291bnRdID0gW3hDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVJZCldLCB5Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlSWQpXV07XG4gICAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgZm9yICh2YXIgX2k1ID0gMDsgX2k1IDwgaG9yaXpvbnRhbEFsaWduLmxlbmd0aDsgX2k1KyspIHtcbiAgICAgICAgICAgIF9sb29wMyhfaTUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdGFuZGFyZFRyYW5zZm9ybWF0aW9uID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uc3RyYWludHMucmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50KSB7XG4gICAgICAgICAgcmVmbGVjdGlvblR5cGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KSgpO1xuICAgIH0gZWxzZSBpZiAoY29uc3RyYWludHMucmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50KSB7XG4gICAgICAvLyBmaW5hbGx5IGNoZWNrIHJlbGF0aXZlIHBsYWNlbWVudCBjb25zdHJhaW50XG4gICAgICAvLyBmaW5kIGxhcmdlc3QgY29tcG9uZW50IGluIGRhZ1xuICAgICAgdmFyIGxhcmdlc3RDb21wb25lbnRTaXplID0gMDtcbiAgICAgIHZhciBsYXJnZXN0Q29tcG9uZW50SW5kZXggPSAwO1xuICAgICAgZm9yICh2YXIgX2k2ID0gMDsgX2k2IDwgY29tcG9uZW50cy5sZW5ndGg7IF9pNisrKSB7XG4gICAgICAgIGlmIChjb21wb25lbnRzW19pNl0ubGVuZ3RoID4gbGFyZ2VzdENvbXBvbmVudFNpemUpIHtcbiAgICAgICAgICBsYXJnZXN0Q29tcG9uZW50U2l6ZSA9IGNvbXBvbmVudHNbX2k2XS5sZW5ndGg7XG4gICAgICAgICAgbGFyZ2VzdENvbXBvbmVudEluZGV4ID0gX2k2O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBpZiBsYXJnZXN0IGNvbXBvbmVudCBpc24ndCBkb21pbmFudCwgdGhlbiB0YWtlIHRoZSB2b3RlcyBmb3IgcmVmbGVjdGlvblxuICAgICAgaWYgKGxhcmdlc3RDb21wb25lbnRTaXplIDwgZGFnVW5kaXJlY3RlZC5zaXplIC8gMikge1xuICAgICAgICBhcHBseVJlZmxlY3Rpb25Gb3JSZWxhdGl2ZVBsYWNlbWVudChjb25zdHJhaW50cy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQpO1xuICAgICAgICBzdGFuZGFyZFRyYW5zZm9ybWF0aW9uID0gZmFsc2U7XG4gICAgICAgIHJlZmxlY3Rpb25UeXBlID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB1c2UgbGFyZ2VzdCBjb21wb25lbnQgZm9yIHRyYW5zZm9ybWF0aW9uXG4gICAgICAgIC8vIGNvbnN0cnVjdCBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBzdWJncmFwaHMgaW4gdGhlIGxhcmdlc3QgY29tcG9uZW50XG4gICAgICAgIHZhciBzdWJHcmFwaE9uSG9yaXpvbnRhbCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdmFyIHN1YkdyYXBoT25WZXJ0aWNhbCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdmFyIGNvbnN0cmFpbnRzSW5sYXJnZXN0Q29tcG9uZW50ID0gW107XG5cbiAgICAgICAgY29tcG9uZW50c1tsYXJnZXN0Q29tcG9uZW50SW5kZXhdLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgIGRhZy5nZXQobm9kZUlkKS5mb3JFYWNoKGZ1bmN0aW9uIChhZGphY2VudCkge1xuICAgICAgICAgICAgaWYgKGFkamFjZW50LmRpcmVjdGlvbiA9PSBcImhvcml6b250YWxcIikge1xuICAgICAgICAgICAgICBpZiAoc3ViR3JhcGhPbkhvcml6b250YWwuaGFzKG5vZGVJZCkpIHtcbiAgICAgICAgICAgICAgICBzdWJHcmFwaE9uSG9yaXpvbnRhbC5nZXQobm9kZUlkKS5wdXNoKGFkamFjZW50KTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdWJHcmFwaE9uSG9yaXpvbnRhbC5zZXQobm9kZUlkLCBbYWRqYWNlbnRdKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoIXN1YkdyYXBoT25Ib3Jpem9udGFsLmhhcyhhZGphY2VudC5pZCkpIHtcbiAgICAgICAgICAgICAgICBzdWJHcmFwaE9uSG9yaXpvbnRhbC5zZXQoYWRqYWNlbnQuaWQsIFtdKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdHJhaW50c0lubGFyZ2VzdENvbXBvbmVudC5wdXNoKHsgbGVmdDogbm9kZUlkLCByaWdodDogYWRqYWNlbnQuaWQgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAoc3ViR3JhcGhPblZlcnRpY2FsLmhhcyhub2RlSWQpKSB7XG4gICAgICAgICAgICAgICAgc3ViR3JhcGhPblZlcnRpY2FsLmdldChub2RlSWQpLnB1c2goYWRqYWNlbnQpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHN1YkdyYXBoT25WZXJ0aWNhbC5zZXQobm9kZUlkLCBbYWRqYWNlbnRdKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoIXN1YkdyYXBoT25WZXJ0aWNhbC5oYXMoYWRqYWNlbnQuaWQpKSB7XG4gICAgICAgICAgICAgICAgc3ViR3JhcGhPblZlcnRpY2FsLnNldChhZGphY2VudC5pZCwgW10pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0cmFpbnRzSW5sYXJnZXN0Q29tcG9uZW50LnB1c2goeyB0b3A6IG5vZGVJZCwgYm90dG9tOiBhZGphY2VudC5pZCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXBwbHlSZWZsZWN0aW9uRm9yUmVsYXRpdmVQbGFjZW1lbnQoY29uc3RyYWludHNJbmxhcmdlc3RDb21wb25lbnQpO1xuICAgICAgICByZWZsZWN0aW9uVHlwZSA9IGZhbHNlO1xuXG4gICAgICAgIC8vIGNhbGN1bGF0ZSBhcHByb3ByaWF0ZSBwb3NpdGlvbmluZyBmb3Igc3ViZ3JhcGhzXG4gICAgICAgIHZhciBwb3NpdGlvbk1hcEhvcml6b250YWwgPSBmaW5kQXBwcm9wcmlhdGVQb3NpdGlvbkZvclJlbGF0aXZlUGxhY2VtZW50KHN1YkdyYXBoT25Ib3Jpem9udGFsLCBcImhvcml6b250YWxcIik7XG4gICAgICAgIHZhciBwb3NpdGlvbk1hcFZlcnRpY2FsID0gZmluZEFwcHJvcHJpYXRlUG9zaXRpb25Gb3JSZWxhdGl2ZVBsYWNlbWVudChzdWJHcmFwaE9uVmVydGljYWwsIFwidmVydGljYWxcIik7XG5cbiAgICAgICAgLy8gY29uc3RydWN0IHNvdXJjZSBhbmQgdGFyZ2V0IGNvbmZpZ3VyYXRpb25cbiAgICAgICAgY29tcG9uZW50c1tsYXJnZXN0Q29tcG9uZW50SW5kZXhdLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCwgaSkge1xuICAgICAgICAgIHNvdXJjZU1hdHJpeFtpXSA9IFt4Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlSWQpXSwgeUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZUlkKV1dO1xuICAgICAgICAgIHRhcmdldE1hdHJpeFtpXSA9IFtdO1xuICAgICAgICAgIGlmIChwb3NpdGlvbk1hcEhvcml6b250YWwuaGFzKG5vZGVJZCkpIHtcbiAgICAgICAgICAgIHRhcmdldE1hdHJpeFtpXVswXSA9IHBvc2l0aW9uTWFwSG9yaXpvbnRhbC5nZXQobm9kZUlkKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGFyZ2V0TWF0cml4W2ldWzBdID0geENvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZUlkKV07XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwb3NpdGlvbk1hcFZlcnRpY2FsLmhhcyhub2RlSWQpKSB7XG4gICAgICAgICAgICB0YXJnZXRNYXRyaXhbaV1bMV0gPSBwb3NpdGlvbk1hcFZlcnRpY2FsLmdldChub2RlSWQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXRNYXRyaXhbaV1bMV0gPSB5Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlSWQpXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHN0YW5kYXJkVHJhbnNmb3JtYXRpb24gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGlmIHRyYW5zZm9ybWF0aW9uIGlzIHJlcXVpcmVkLCB0aGVuIGNhbGN1bGF0ZSBhbmQgYXBwbHkgdHJhbnNmb3JtYXRpb24gbWF0cml4XG4gICAgaWYgKHN0YW5kYXJkVHJhbnNmb3JtYXRpb24pIHtcbiAgICAgIC8qIGNhbGN1bGF0ZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggKi9cbiAgICAgIHZhciB0cmFuc2Zvcm1hdGlvbk1hdHJpeCA9IHZvaWQgMDtcbiAgICAgIHZhciB0YXJnZXRNYXRyaXhUcmFuc3Bvc2UgPSBNYXRyaXgudHJhbnNwb3NlKHRhcmdldE1hdHJpeCk7IC8vIEEnXG4gICAgICB2YXIgc291cmNlTWF0cml4VHJhbnNwb3NlID0gTWF0cml4LnRyYW5zcG9zZShzb3VyY2VNYXRyaXgpOyAvLyBCJ1xuXG4gICAgICAvLyBjZW50cmFsaXplIHRyYW5zcG9zZSBtYXRyaWNlc1xuICAgICAgZm9yICh2YXIgX2k3ID0gMDsgX2k3IDwgdGFyZ2V0TWF0cml4VHJhbnNwb3NlLmxlbmd0aDsgX2k3KyspIHtcbiAgICAgICAgdGFyZ2V0TWF0cml4VHJhbnNwb3NlW19pN10gPSBNYXRyaXgubXVsdEdhbW1hKHRhcmdldE1hdHJpeFRyYW5zcG9zZVtfaTddKTtcbiAgICAgICAgc291cmNlTWF0cml4VHJhbnNwb3NlW19pN10gPSBNYXRyaXgubXVsdEdhbW1hKHNvdXJjZU1hdHJpeFRyYW5zcG9zZVtfaTddKTtcbiAgICAgIH1cblxuICAgICAgLy8gZG8gYWN0dWFsIGNhbGN1bGF0aW9uIGZvciB0cmFuc2Zvcm1hdGlvbiBtYXRyaXhcbiAgICAgIHZhciB0ZW1wTWF0cml4ID0gTWF0cml4Lm11bHRNYXQodGFyZ2V0TWF0cml4VHJhbnNwb3NlLCBNYXRyaXgudHJhbnNwb3NlKHNvdXJjZU1hdHJpeFRyYW5zcG9zZSkpOyAvLyB0ZW1wTWF0cml4ID0gQSdCXG4gICAgICB2YXIgU1ZEUmVzdWx0ID0gU1ZELnN2ZCh0ZW1wTWF0cml4KTsgLy8gU1ZEKEEnQikgPSBVU1YnLCBzdmQgZnVuY3Rpb24gcmV0dXJucyBVLCBTIGFuZCBWIFxuICAgICAgdHJhbnNmb3JtYXRpb25NYXRyaXggPSBNYXRyaXgubXVsdE1hdChTVkRSZXN1bHQuViwgTWF0cml4LnRyYW5zcG9zZShTVkRSZXN1bHQuVSkpOyAvLyB0cmFuc2Zvcm1hdGlvbk1hdHJpeCA9IFQgPSBWVSdcblxuICAgICAgLyogYXBwbHkgZm91bmQgdHJhbnNmb3JtYXRpb24gbWF0cml4IHRvIG9idGFpbiBmaW5hbCBkcmFmdCBsYXlvdXQgKi9cbiAgICAgIGZvciAodmFyIF9pOCA9IDA7IF9pOCA8IG5vZGVJbmRleGVzLnNpemU7IF9pOCsrKSB7XG4gICAgICAgIHZhciB0ZW1wMSA9IFt4Q29vcmRzW19pOF0sIHlDb29yZHNbX2k4XV07XG4gICAgICAgIHZhciB0ZW1wMiA9IFt0cmFuc2Zvcm1hdGlvbk1hdHJpeFswXVswXSwgdHJhbnNmb3JtYXRpb25NYXRyaXhbMV1bMF1dO1xuICAgICAgICB2YXIgdGVtcDMgPSBbdHJhbnNmb3JtYXRpb25NYXRyaXhbMF1bMV0sIHRyYW5zZm9ybWF0aW9uTWF0cml4WzFdWzFdXTtcbiAgICAgICAgeENvb3Jkc1tfaThdID0gTWF0cml4LmRvdFByb2R1Y3QodGVtcDEsIHRlbXAyKTtcbiAgICAgICAgeUNvb3Jkc1tfaThdID0gTWF0cml4LmRvdFByb2R1Y3QodGVtcDEsIHRlbXAzKTtcbiAgICAgIH1cblxuICAgICAgLy8gYXBwbGllZCBvbmx5IGJvdGggYWxpZ25tZW50IGFuZCByZWwuIHBsYWNlbWVudCBjb25zdHJhaW50cyBleGlzdFxuICAgICAgaWYgKHJlZmxlY3Rpb25UeXBlKSB7XG4gICAgICAgIGFwcGx5UmVmbGVjdGlvbkZvclJlbGF0aXZlUGxhY2VtZW50KGNvbnN0cmFpbnRzLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKENvU0VDb25zdGFudHMuRU5GT1JDRV9DT05TVFJBSU5UUykge1xuICAgIC8qKioqICBlbmZvcmNlIGNvbnN0cmFpbnRzIG9uIHRoZSB0cmFuc2Zvcm1lZCBkcmFmdCBsYXlvdXQgKioqKi9cblxuICAgIC8qIGZpcnN0IGVuZm9yY2UgZml4ZWQgbm9kZSBjb25zdHJhaW50ICovXG5cbiAgICBpZiAoY29uc3RyYWludHMuZml4ZWROb2RlQ29uc3RyYWludCAmJiBjb25zdHJhaW50cy5maXhlZE5vZGVDb25zdHJhaW50Lmxlbmd0aCA+IDApIHtcbiAgICAgIHZhciB0cmFuc2xhdGlvbkFtb3VudCA9IHsgeDogMCwgeTogMCB9O1xuICAgICAgY29uc3RyYWludHMuZml4ZWROb2RlQ29uc3RyYWludC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlRGF0YSwgaSkge1xuICAgICAgICB2YXIgcG9zSW5UaGVvcnkgPSB7IHg6IHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVEYXRhLm5vZGVJZCldLCB5OiB5Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlRGF0YS5ub2RlSWQpXSB9O1xuICAgICAgICB2YXIgcG9zRGVzaXJlZCA9IG5vZGVEYXRhLnBvc2l0aW9uO1xuICAgICAgICB2YXIgcG9zRGlmZiA9IGNhbGN1bGF0ZVBvc2l0aW9uRGlmZihwb3NEZXNpcmVkLCBwb3NJblRoZW9yeSk7XG4gICAgICAgIHRyYW5zbGF0aW9uQW1vdW50LnggKz0gcG9zRGlmZi54O1xuICAgICAgICB0cmFuc2xhdGlvbkFtb3VudC55ICs9IHBvc0RpZmYueTtcbiAgICAgIH0pO1xuICAgICAgdHJhbnNsYXRpb25BbW91bnQueCAvPSBjb25zdHJhaW50cy5maXhlZE5vZGVDb25zdHJhaW50Lmxlbmd0aDtcbiAgICAgIHRyYW5zbGF0aW9uQW1vdW50LnkgLz0gY29uc3RyYWludHMuZml4ZWROb2RlQ29uc3RyYWludC5sZW5ndGg7XG5cbiAgICAgIHhDb29yZHMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGkpIHtcbiAgICAgICAgeENvb3Jkc1tpXSArPSB0cmFuc2xhdGlvbkFtb3VudC54O1xuICAgICAgfSk7XG5cbiAgICAgIHlDb29yZHMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGkpIHtcbiAgICAgICAgeUNvb3Jkc1tpXSArPSB0cmFuc2xhdGlvbkFtb3VudC55O1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0cmFpbnRzLmZpeGVkTm9kZUNvbnN0cmFpbnQuZm9yRWFjaChmdW5jdGlvbiAobm9kZURhdGEpIHtcbiAgICAgICAgeENvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZURhdGEubm9kZUlkKV0gPSBub2RlRGF0YS5wb3NpdGlvbi54O1xuICAgICAgICB5Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlRGF0YS5ub2RlSWQpXSA9IG5vZGVEYXRhLnBvc2l0aW9uLnk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiB0aGVuIGVuZm9yY2UgYWxpZ25tZW50IGNvbnN0cmFpbnQgKi9cblxuICAgIGlmIChjb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50KSB7XG4gICAgICBpZiAoY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludC52ZXJ0aWNhbCkge1xuICAgICAgICB2YXIgeEFsaWduID0gY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludC52ZXJ0aWNhbDtcblxuICAgICAgICB2YXIgX2xvb3A0ID0gZnVuY3Rpb24gX2xvb3A0KF9pOSkge1xuICAgICAgICAgIHZhciBhbGlnbm1lbnRTZXQgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgeEFsaWduW19pOV0uZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICBhbGlnbm1lbnRTZXQuYWRkKG5vZGVJZCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdmFyIGludGVyc2VjdGlvbiA9IG5ldyBTZXQoW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShhbGlnbm1lbnRTZXQpKS5maWx0ZXIoZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgIHJldHVybiBmaXhlZE5vZGVzLmhhcyh4KTtcbiAgICAgICAgICB9KSk7XG4gICAgICAgICAgdmFyIHhQb3MgPSB2b2lkIDA7XG4gICAgICAgICAgaWYgKGludGVyc2VjdGlvbi5zaXplID4gMCkgeFBvcyA9IHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KGludGVyc2VjdGlvbi52YWx1ZXMoKS5uZXh0KCkudmFsdWUpXTtlbHNlIHhQb3MgPSBjYWxjdWxhdGVBdmdQb3NpdGlvbihhbGlnbm1lbnRTZXQpLng7XG5cbiAgICAgICAgICBhbGlnbm1lbnRTZXQuZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICBpZiAoIWZpeGVkTm9kZXMuaGFzKG5vZGVJZCkpIHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVJZCldID0geFBvcztcbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBmb3IgKHZhciBfaTkgPSAwOyBfaTkgPCB4QWxpZ24ubGVuZ3RoOyBfaTkrKykge1xuICAgICAgICAgIF9sb29wNChfaTkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludC5ob3Jpem9udGFsKSB7XG4gICAgICAgIHZhciB5QWxpZ24gPSBjb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50Lmhvcml6b250YWw7XG5cbiAgICAgICAgdmFyIF9sb29wNSA9IGZ1bmN0aW9uIF9sb29wNShfaTEwKSB7XG4gICAgICAgICAgdmFyIGFsaWdubWVudFNldCA9IG5ldyBTZXQoKTtcbiAgICAgICAgICB5QWxpZ25bX2kxMF0uZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICBhbGlnbm1lbnRTZXQuYWRkKG5vZGVJZCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdmFyIGludGVyc2VjdGlvbiA9IG5ldyBTZXQoW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShhbGlnbm1lbnRTZXQpKS5maWx0ZXIoZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgIHJldHVybiBmaXhlZE5vZGVzLmhhcyh4KTtcbiAgICAgICAgICB9KSk7XG4gICAgICAgICAgdmFyIHlQb3MgPSB2b2lkIDA7XG4gICAgICAgICAgaWYgKGludGVyc2VjdGlvbi5zaXplID4gMCkgeVBvcyA9IHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KGludGVyc2VjdGlvbi52YWx1ZXMoKS5uZXh0KCkudmFsdWUpXTtlbHNlIHlQb3MgPSBjYWxjdWxhdGVBdmdQb3NpdGlvbihhbGlnbm1lbnRTZXQpLnk7XG5cbiAgICAgICAgICBhbGlnbm1lbnRTZXQuZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICBpZiAoIWZpeGVkTm9kZXMuaGFzKG5vZGVJZCkpIHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVJZCldID0geVBvcztcbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBmb3IgKHZhciBfaTEwID0gMDsgX2kxMCA8IHlBbGlnbi5sZW5ndGg7IF9pMTArKykge1xuICAgICAgICAgIF9sb29wNShfaTEwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qIGZpbmFsbHkgZW5mb3JjZSByZWxhdGl2ZSBwbGFjZW1lbnQgY29uc3RyYWludCAqL1xuXG4gICAgaWYgKGNvbnN0cmFpbnRzLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludCkge1xuICAgICAgKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG5vZGVUb0R1bW15Rm9yVmVydGljYWxBbGlnbm1lbnQgPSBuZXcgTWFwKCk7XG4gICAgICAgIHZhciBub2RlVG9EdW1teUZvckhvcml6b250YWxBbGlnbm1lbnQgPSBuZXcgTWFwKCk7XG4gICAgICAgIHZhciBkdW1teVRvTm9kZUZvclZlcnRpY2FsQWxpZ25tZW50ID0gbmV3IE1hcCgpO1xuICAgICAgICB2YXIgZHVtbXlUb05vZGVGb3JIb3Jpem9udGFsQWxpZ25tZW50ID0gbmV3IE1hcCgpO1xuICAgICAgICB2YXIgZHVtbXlQb3NpdGlvbnNGb3JWZXJ0aWNhbEFsaWdubWVudCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdmFyIGR1bW15UG9zaXRpb25zRm9ySG9yaXpvbnRhbEFsaWdubWVudCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdmFyIGZpeGVkTm9kZXNPbkhvcml6b250YWwgPSBuZXcgU2V0KCk7XG4gICAgICAgIHZhciBmaXhlZE5vZGVzT25WZXJ0aWNhbCA9IG5ldyBTZXQoKTtcblxuICAgICAgICAvLyBmaWxsIG1hcHMgYW5kIHNldHMgICAgICBcbiAgICAgICAgZml4ZWROb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICBmaXhlZE5vZGVzT25Ib3Jpem9udGFsLmFkZChub2RlSWQpO1xuICAgICAgICAgIGZpeGVkTm9kZXNPblZlcnRpY2FsLmFkZChub2RlSWQpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludCkge1xuICAgICAgICAgIGlmIChjb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50LnZlcnRpY2FsKSB7XG4gICAgICAgICAgICB2YXIgdmVydGljYWxBbGlnbm1lbnQgPSBjb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50LnZlcnRpY2FsO1xuXG4gICAgICAgICAgICB2YXIgX2xvb3A2ID0gZnVuY3Rpb24gX2xvb3A2KF9pMTEpIHtcbiAgICAgICAgICAgICAgZHVtbXlUb05vZGVGb3JWZXJ0aWNhbEFsaWdubWVudC5zZXQoXCJkdW1teVwiICsgX2kxMSwgW10pO1xuICAgICAgICAgICAgICB2ZXJ0aWNhbEFsaWdubWVudFtfaTExXS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgICAgICBub2RlVG9EdW1teUZvclZlcnRpY2FsQWxpZ25tZW50LnNldChub2RlSWQsIFwiZHVtbXlcIiArIF9pMTEpO1xuICAgICAgICAgICAgICAgIGR1bW15VG9Ob2RlRm9yVmVydGljYWxBbGlnbm1lbnQuZ2V0KFwiZHVtbXlcIiArIF9pMTEpLnB1c2gobm9kZUlkKTtcbiAgICAgICAgICAgICAgICBpZiAoZml4ZWROb2Rlcy5oYXMobm9kZUlkKSkge1xuICAgICAgICAgICAgICAgICAgZml4ZWROb2Rlc09uSG9yaXpvbnRhbC5hZGQoXCJkdW1teVwiICsgX2kxMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgZHVtbXlQb3NpdGlvbnNGb3JWZXJ0aWNhbEFsaWdubWVudC5zZXQoXCJkdW1teVwiICsgX2kxMSwgeENvb3Jkc1tub2RlSW5kZXhlcy5nZXQodmVydGljYWxBbGlnbm1lbnRbX2kxMV1bMF0pXSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBmb3IgKHZhciBfaTExID0gMDsgX2kxMSA8IHZlcnRpY2FsQWxpZ25tZW50Lmxlbmd0aDsgX2kxMSsrKSB7XG4gICAgICAgICAgICAgIF9sb29wNihfaTExKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQuaG9yaXpvbnRhbCkge1xuICAgICAgICAgICAgdmFyIGhvcml6b250YWxBbGlnbm1lbnQgPSBjb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50Lmhvcml6b250YWw7XG5cbiAgICAgICAgICAgIHZhciBfbG9vcDcgPSBmdW5jdGlvbiBfbG9vcDcoX2kxMikge1xuICAgICAgICAgICAgICBkdW1teVRvTm9kZUZvckhvcml6b250YWxBbGlnbm1lbnQuc2V0KFwiZHVtbXlcIiArIF9pMTIsIFtdKTtcbiAgICAgICAgICAgICAgaG9yaXpvbnRhbEFsaWdubWVudFtfaTEyXS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgICAgICBub2RlVG9EdW1teUZvckhvcml6b250YWxBbGlnbm1lbnQuc2V0KG5vZGVJZCwgXCJkdW1teVwiICsgX2kxMik7XG4gICAgICAgICAgICAgICAgZHVtbXlUb05vZGVGb3JIb3Jpem9udGFsQWxpZ25tZW50LmdldChcImR1bW15XCIgKyBfaTEyKS5wdXNoKG5vZGVJZCk7XG4gICAgICAgICAgICAgICAgaWYgKGZpeGVkTm9kZXMuaGFzKG5vZGVJZCkpIHtcbiAgICAgICAgICAgICAgICAgIGZpeGVkTm9kZXNPblZlcnRpY2FsLmFkZChcImR1bW15XCIgKyBfaTEyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBkdW1teVBvc2l0aW9uc0Zvckhvcml6b250YWxBbGlnbm1lbnQuc2V0KFwiZHVtbXlcIiArIF9pMTIsIHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KGhvcml6b250YWxBbGlnbm1lbnRbX2kxMl1bMF0pXSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBmb3IgKHZhciBfaTEyID0gMDsgX2kxMiA8IGhvcml6b250YWxBbGlnbm1lbnQubGVuZ3RoOyBfaTEyKyspIHtcbiAgICAgICAgICAgICAgX2xvb3A3KF9pMTIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNvbnN0cnVjdCBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBkYWdzIChzdWJncmFwaHMpIGZyb20gb3ZlcmFsbCBkYWdcbiAgICAgICAgdmFyIGRhZ09uSG9yaXpvbnRhbCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdmFyIGRhZ09uVmVydGljYWwgPSBuZXcgTWFwKCk7XG5cbiAgICAgICAgdmFyIF9sb29wOCA9IGZ1bmN0aW9uIF9sb29wOChub2RlSWQpIHtcbiAgICAgICAgICBkYWcuZ2V0KG5vZGVJZCkuZm9yRWFjaChmdW5jdGlvbiAoYWRqYWNlbnQpIHtcbiAgICAgICAgICAgIHZhciBzb3VyY2VJZCA9IHZvaWQgMDtcbiAgICAgICAgICAgIHZhciB0YXJnZXROb2RlID0gdm9pZCAwO1xuICAgICAgICAgICAgaWYgKGFkamFjZW50W1wiZGlyZWN0aW9uXCJdID09IFwiaG9yaXpvbnRhbFwiKSB7XG4gICAgICAgICAgICAgIHNvdXJjZUlkID0gbm9kZVRvRHVtbXlGb3JWZXJ0aWNhbEFsaWdubWVudC5nZXQobm9kZUlkKSA/IG5vZGVUb0R1bW15Rm9yVmVydGljYWxBbGlnbm1lbnQuZ2V0KG5vZGVJZCkgOiBub2RlSWQ7XG4gICAgICAgICAgICAgIGlmIChub2RlVG9EdW1teUZvclZlcnRpY2FsQWxpZ25tZW50LmdldChhZGphY2VudC5pZCkpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXROb2RlID0geyBpZDogbm9kZVRvRHVtbXlGb3JWZXJ0aWNhbEFsaWdubWVudC5nZXQoYWRqYWNlbnQuaWQpLCBnYXA6IGFkamFjZW50LmdhcCwgZGlyZWN0aW9uOiBhZGphY2VudC5kaXJlY3Rpb24gfTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YXJnZXROb2RlID0gYWRqYWNlbnQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGRhZ09uSG9yaXpvbnRhbC5oYXMoc291cmNlSWQpKSB7XG4gICAgICAgICAgICAgICAgZGFnT25Ib3Jpem9udGFsLmdldChzb3VyY2VJZCkucHVzaCh0YXJnZXROb2RlKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkYWdPbkhvcml6b250YWwuc2V0KHNvdXJjZUlkLCBbdGFyZ2V0Tm9kZV0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICghZGFnT25Ib3Jpem9udGFsLmhhcyh0YXJnZXROb2RlLmlkKSkge1xuICAgICAgICAgICAgICAgIGRhZ09uSG9yaXpvbnRhbC5zZXQodGFyZ2V0Tm9kZS5pZCwgW10pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzb3VyY2VJZCA9IG5vZGVUb0R1bW15Rm9ySG9yaXpvbnRhbEFsaWdubWVudC5nZXQobm9kZUlkKSA/IG5vZGVUb0R1bW15Rm9ySG9yaXpvbnRhbEFsaWdubWVudC5nZXQobm9kZUlkKSA6IG5vZGVJZDtcbiAgICAgICAgICAgICAgaWYgKG5vZGVUb0R1bW15Rm9ySG9yaXpvbnRhbEFsaWdubWVudC5nZXQoYWRqYWNlbnQuaWQpKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0Tm9kZSA9IHsgaWQ6IG5vZGVUb0R1bW15Rm9ySG9yaXpvbnRhbEFsaWdubWVudC5nZXQoYWRqYWNlbnQuaWQpLCBnYXA6IGFkamFjZW50LmdhcCwgZGlyZWN0aW9uOiBhZGphY2VudC5kaXJlY3Rpb24gfTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YXJnZXROb2RlID0gYWRqYWNlbnQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGRhZ09uVmVydGljYWwuaGFzKHNvdXJjZUlkKSkge1xuICAgICAgICAgICAgICAgIGRhZ09uVmVydGljYWwuZ2V0KHNvdXJjZUlkKS5wdXNoKHRhcmdldE5vZGUpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRhZ09uVmVydGljYWwuc2V0KHNvdXJjZUlkLCBbdGFyZ2V0Tm9kZV0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICghZGFnT25WZXJ0aWNhbC5oYXModGFyZ2V0Tm9kZS5pZCkpIHtcbiAgICAgICAgICAgICAgICBkYWdPblZlcnRpY2FsLnNldCh0YXJnZXROb2RlLmlkLCBbXSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICB2YXIgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjUgPSB0cnVlO1xuICAgICAgICB2YXIgX2RpZEl0ZXJhdG9yRXJyb3I1ID0gZmFsc2U7XG4gICAgICAgIHZhciBfaXRlcmF0b3JFcnJvcjUgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3I1ID0gZGFnLmtleXMoKVtTeW1ib2wuaXRlcmF0b3JdKCksIF9zdGVwNTsgIShfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uNSA9IChfc3RlcDUgPSBfaXRlcmF0b3I1Lm5leHQoKSkuZG9uZSk7IF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb241ID0gdHJ1ZSkge1xuICAgICAgICAgICAgdmFyIG5vZGVJZCA9IF9zdGVwNS52YWx1ZTtcblxuICAgICAgICAgICAgX2xvb3A4KG5vZGVJZCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gZmluZCBzb3VyY2Ugbm9kZXMgb2YgZWFjaCBjb21wb25lbnQgaW4gaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgZGFnc1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBfZGlkSXRlcmF0b3JFcnJvcjUgPSB0cnVlO1xuICAgICAgICAgIF9pdGVyYXRvckVycm9yNSA9IGVycjtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCFfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uNSAmJiBfaXRlcmF0b3I1LnJldHVybikge1xuICAgICAgICAgICAgICBfaXRlcmF0b3I1LnJldHVybigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBpZiAoX2RpZEl0ZXJhdG9yRXJyb3I1KSB7XG4gICAgICAgICAgICAgIHRocm93IF9pdGVyYXRvckVycm9yNTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdW5kaXJlY3RlZE9uSG9yaXpvbnRhbCA9IGRhZ1RvVW5kaXJlY3RlZChkYWdPbkhvcml6b250YWwpO1xuICAgICAgICB2YXIgdW5kaXJlY3RlZE9uVmVydGljYWwgPSBkYWdUb1VuZGlyZWN0ZWQoZGFnT25WZXJ0aWNhbCk7XG4gICAgICAgIHZhciBjb21wb25lbnRzT25Ib3Jpem9udGFsID0gZmluZENvbXBvbmVudHModW5kaXJlY3RlZE9uSG9yaXpvbnRhbCk7XG4gICAgICAgIHZhciBjb21wb25lbnRzT25WZXJ0aWNhbCA9IGZpbmRDb21wb25lbnRzKHVuZGlyZWN0ZWRPblZlcnRpY2FsKTtcbiAgICAgICAgdmFyIHJldmVyc2VkRGFnT25Ib3Jpem9udGFsID0gZGFnVG9SZXZlcnNlZChkYWdPbkhvcml6b250YWwpO1xuICAgICAgICB2YXIgcmV2ZXJzZWREYWdPblZlcnRpY2FsID0gZGFnVG9SZXZlcnNlZChkYWdPblZlcnRpY2FsKTtcbiAgICAgICAgdmFyIGNvbXBvbmVudFNvdXJjZXNPbkhvcml6b250YWwgPSBbXTtcbiAgICAgICAgdmFyIGNvbXBvbmVudFNvdXJjZXNPblZlcnRpY2FsID0gW107XG5cbiAgICAgICAgY29tcG9uZW50c09uSG9yaXpvbnRhbC5mb3JFYWNoKGZ1bmN0aW9uIChjb21wb25lbnQsIGluZGV4KSB7XG4gICAgICAgICAgY29tcG9uZW50U291cmNlc09uSG9yaXpvbnRhbFtpbmRleF0gPSBbXTtcbiAgICAgICAgICBjb21wb25lbnQuZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICBpZiAocmV2ZXJzZWREYWdPbkhvcml6b250YWwuZ2V0KG5vZGVJZCkubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgY29tcG9uZW50U291cmNlc09uSG9yaXpvbnRhbFtpbmRleF0ucHVzaChub2RlSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb21wb25lbnRzT25WZXJ0aWNhbC5mb3JFYWNoKGZ1bmN0aW9uIChjb21wb25lbnQsIGluZGV4KSB7XG4gICAgICAgICAgY29tcG9uZW50U291cmNlc09uVmVydGljYWxbaW5kZXhdID0gW107XG4gICAgICAgICAgY29tcG9uZW50LmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgaWYgKHJldmVyc2VkRGFnT25WZXJ0aWNhbC5nZXQobm9kZUlkKS5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgICBjb21wb25lbnRTb3VyY2VzT25WZXJ0aWNhbFtpbmRleF0ucHVzaChub2RlSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBjYWxjdWxhdGUgYXBwcm9wcmlhdGUgcG9zaXRpb25pbmcgZm9yIHN1YmdyYXBoc1xuICAgICAgICB2YXIgcG9zaXRpb25NYXBIb3Jpem9udGFsID0gZmluZEFwcHJvcHJpYXRlUG9zaXRpb25Gb3JSZWxhdGl2ZVBsYWNlbWVudChkYWdPbkhvcml6b250YWwsIFwiaG9yaXpvbnRhbFwiLCBmaXhlZE5vZGVzT25Ib3Jpem9udGFsLCBkdW1teVBvc2l0aW9uc0ZvclZlcnRpY2FsQWxpZ25tZW50LCBjb21wb25lbnRTb3VyY2VzT25Ib3Jpem9udGFsKTtcbiAgICAgICAgdmFyIHBvc2l0aW9uTWFwVmVydGljYWwgPSBmaW5kQXBwcm9wcmlhdGVQb3NpdGlvbkZvclJlbGF0aXZlUGxhY2VtZW50KGRhZ09uVmVydGljYWwsIFwidmVydGljYWxcIiwgZml4ZWROb2Rlc09uVmVydGljYWwsIGR1bW15UG9zaXRpb25zRm9ySG9yaXpvbnRhbEFsaWdubWVudCwgY29tcG9uZW50U291cmNlc09uVmVydGljYWwpO1xuXG4gICAgICAgIC8vIHVwZGF0ZSBwb3NpdGlvbnMgb2YgdGhlIG5vZGVzIGJhc2VkIG9uIHJlbGF0aXZlIHBsYWNlbWVudCBjb25zdHJhaW50c1xuXG4gICAgICAgIHZhciBfbG9vcDkgPSBmdW5jdGlvbiBfbG9vcDkoa2V5KSB7XG4gICAgICAgICAgaWYgKGR1bW15VG9Ob2RlRm9yVmVydGljYWxBbGlnbm1lbnQuZ2V0KGtleSkpIHtcbiAgICAgICAgICAgIGR1bW15VG9Ob2RlRm9yVmVydGljYWxBbGlnbm1lbnQuZ2V0KGtleSkuZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICAgIHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVJZCldID0gcG9zaXRpb25NYXBIb3Jpem9udGFsLmdldChrZXkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KGtleSldID0gcG9zaXRpb25NYXBIb3Jpem9udGFsLmdldChrZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICB2YXIgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjYgPSB0cnVlO1xuICAgICAgICB2YXIgX2RpZEl0ZXJhdG9yRXJyb3I2ID0gZmFsc2U7XG4gICAgICAgIHZhciBfaXRlcmF0b3JFcnJvcjYgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3I2ID0gcG9zaXRpb25NYXBIb3Jpem9udGFsLmtleXMoKVtTeW1ib2wuaXRlcmF0b3JdKCksIF9zdGVwNjsgIShfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uNiA9IChfc3RlcDYgPSBfaXRlcmF0b3I2Lm5leHQoKSkuZG9uZSk7IF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb242ID0gdHJ1ZSkge1xuICAgICAgICAgICAgdmFyIGtleSA9IF9zdGVwNi52YWx1ZTtcblxuICAgICAgICAgICAgX2xvb3A5KGtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBfZGlkSXRlcmF0b3JFcnJvcjYgPSB0cnVlO1xuICAgICAgICAgIF9pdGVyYXRvckVycm9yNiA9IGVycjtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCFfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uNiAmJiBfaXRlcmF0b3I2LnJldHVybikge1xuICAgICAgICAgICAgICBfaXRlcmF0b3I2LnJldHVybigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBpZiAoX2RpZEl0ZXJhdG9yRXJyb3I2KSB7XG4gICAgICAgICAgICAgIHRocm93IF9pdGVyYXRvckVycm9yNjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgX2xvb3AxMCA9IGZ1bmN0aW9uIF9sb29wMTAoa2V5KSB7XG4gICAgICAgICAgaWYgKGR1bW15VG9Ob2RlRm9ySG9yaXpvbnRhbEFsaWdubWVudC5nZXQoa2V5KSkge1xuICAgICAgICAgICAgZHVtbXlUb05vZGVGb3JIb3Jpem9udGFsQWxpZ25tZW50LmdldChrZXkpLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgICB5Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlSWQpXSA9IHBvc2l0aW9uTWFwVmVydGljYWwuZ2V0KGtleSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgeUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQoa2V5KV0gPSBwb3NpdGlvbk1hcFZlcnRpY2FsLmdldChrZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICB2YXIgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjcgPSB0cnVlO1xuICAgICAgICB2YXIgX2RpZEl0ZXJhdG9yRXJyb3I3ID0gZmFsc2U7XG4gICAgICAgIHZhciBfaXRlcmF0b3JFcnJvcjcgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3I3ID0gcG9zaXRpb25NYXBWZXJ0aWNhbC5rZXlzKClbU3ltYm9sLml0ZXJhdG9yXSgpLCBfc3RlcDc7ICEoX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjcgPSAoX3N0ZXA3ID0gX2l0ZXJhdG9yNy5uZXh0KCkpLmRvbmUpOyBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uNyA9IHRydWUpIHtcbiAgICAgICAgICAgIHZhciBrZXkgPSBfc3RlcDcudmFsdWU7XG5cbiAgICAgICAgICAgIF9sb29wMTAoa2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yNyA9IHRydWU7XG4gICAgICAgICAgX2l0ZXJhdG9yRXJyb3I3ID0gZXJyO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIV9pdGVyYXRvck5vcm1hbENvbXBsZXRpb243ICYmIF9pdGVyYXRvcjcucmV0dXJuKSB7XG4gICAgICAgICAgICAgIF9pdGVyYXRvcjcucmV0dXJuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmIChfZGlkSXRlcmF0b3JFcnJvcjcpIHtcbiAgICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3I3O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSkoKTtcbiAgICB9XG4gIH1cblxuICAvLyBhc3NpZ24gbmV3IGNvb3JkaW5hdGVzIHRvIG5vZGVzIGFmdGVyIGNvbnN0cmFpbnQgaGFuZGxpbmdcbiAgZm9yICh2YXIgX2kxMyA9IDA7IF9pMTMgPCBhbGxOb2Rlcy5sZW5ndGg7IF9pMTMrKykge1xuICAgIHZhciBfbm9kZSA9IGFsbE5vZGVzW19pMTNdO1xuICAgIGlmIChfbm9kZS5nZXRDaGlsZCgpID09IG51bGwpIHtcbiAgICAgIF9ub2RlLnNldENlbnRlcih4Q29vcmRzW25vZGVJbmRleGVzLmdldChfbm9kZS5pZCldLCB5Q29vcmRzW25vZGVJbmRleGVzLmdldChfbm9kZS5pZCldKTtcbiAgICB9XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gQ29uc3RyYWludEhhbmRsZXI7XG5cbi8qKiovIH0pLFxuXG4vKioqLyA1NTE6XG4vKioqLyAoKG1vZHVsZSkgPT4ge1xuXG5tb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzU1MV9fO1xuXG4vKioqLyB9KVxuXG4vKioqKioqLyBcdH0pO1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG4vKioqKioqLyBcdFx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG4vKioqKioqLyBcdFx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG4vKioqKioqLyBcdFx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG4vKioqKioqLyBcdFx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuLyoqKioqKi8gXHRcdFx0ZXhwb3J0czoge31cbi8qKioqKiovIFx0XHR9O1xuLyoqKioqKi8gXHRcbi8qKioqKiovIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbi8qKioqKiovIFx0XHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcbi8qKioqKiovIFx0XG4vKioqKioqLyBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbi8qKioqKiovIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4vKioqKioqLyBcdH1cbi8qKioqKiovIFx0XG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gXHRcbi8qKioqKiovIFx0Ly8gc3RhcnR1cFxuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0Ly8gVGhpcyBlbnRyeSBtb2R1bGUgaXMgcmVmZXJlbmNlZCBieSBvdGhlciBtb2R1bGVzIHNvIGl0IGNhbid0IGJlIGlubGluZWRcbi8qKioqKiovIFx0dmFyIF9fd2VicGFja19leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ1KTtcbi8qKioqKiovIFx0XG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfZXhwb3J0c19fO1xuLyoqKioqKi8gfSkoKVxuO1xufSk7IiwiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYC5fZGFzaC11bmRvLXJlZG8ge1xuICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICBib3R0b206IDMwcHg7XG4gICAgbGVmdDogMzBweDtcbiAgICBmb250LXNpemU6IDIwcHg7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIHotaW5kZXg6IDk5OTk7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpO1xufVxuLl9kYXNoLXVuZG8tcmVkbyA+IGRpdiB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuLl9kYXNoLXVuZG8tcmVkby1saW5rIHtcbiAgICBjb2xvcjogIzAwNzRkOTtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgbWFyZ2luLWxlZnQ6IDEwcHg7XG4gICAgbWFyZ2luLXJpZ2h0OiAxMHB4O1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICBvcGFjaXR5OiAwLjI7XG59XG4uX2Rhc2gtdW5kby1yZWRvLWxpbms6aG92ZXIge1xuICAgIG9wYWNpdHk6IDE7XG59XG4uX2Rhc2gtdW5kby1yZWRvLWxpbmsgLl9kYXNoLWljb24tdW5kbyB7XG4gICAgZm9udC1zaXplOiAyMHB4O1xuICAgIHRyYW5zZm9ybTogcm90YXRlKDI3MGRlZyk7XG59XG4uX2Rhc2gtdW5kby1yZWRvLWxpbmsgLl9kYXNoLWljb24tcmVkbyB7XG4gICAgZm9udC1zaXplOiAyMHB4O1xuICAgIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTtcbn1cbi5fZGFzaC11bmRvLXJlZG8tbGluayAuX2Rhc2gtdW5kby1yZWRvLWxhYmVsIHtcbiAgICBmb250LXNpemU6IDE1cHg7XG59XG5gLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3NyYy9jb21wb25lbnRzL2NvcmUvVG9vbGJhci5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7SUFDSSxlQUFlO0lBQ2YsWUFBWTtJQUNaLFVBQVU7SUFDVixlQUFlO0lBQ2Ysa0JBQWtCO0lBQ2xCLGFBQWE7SUFDYiwwQ0FBMEM7QUFDOUM7QUFDQTtJQUNJLGtCQUFrQjtBQUN0QjtBQUNBO0lBQ0ksY0FBYztJQUNkLGVBQWU7SUFDZixpQkFBaUI7SUFDakIsa0JBQWtCO0lBQ2xCLHFCQUFxQjtJQUNyQixZQUFZO0FBQ2hCO0FBQ0E7SUFDSSxVQUFVO0FBQ2Q7QUFDQTtJQUNJLGVBQWU7SUFDZix5QkFBeUI7QUFDN0I7QUFDQTtJQUNJLGVBQWU7SUFDZix3QkFBd0I7QUFDNUI7QUFDQTtJQUNJLGVBQWU7QUFDbkJcIixcInNvdXJjZXNDb250ZW50XCI6W1wiLl9kYXNoLXVuZG8tcmVkbyB7XFxuICAgIHBvc2l0aW9uOiBmaXhlZDtcXG4gICAgYm90dG9tOiAzMHB4O1xcbiAgICBsZWZ0OiAzMHB4O1xcbiAgICBmb250LXNpemU6IDIwcHg7XFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gICAgei1pbmRleDogOTk5OTtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpO1xcbn1cXG4uX2Rhc2gtdW5kby1yZWRvID4gZGl2IHtcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcbn1cXG4uX2Rhc2gtdW5kby1yZWRvLWxpbmsge1xcbiAgICBjb2xvcjogIzAwNzRkOTtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbiAgICBtYXJnaW4tbGVmdDogMTBweDtcXG4gICAgbWFyZ2luLXJpZ2h0OiAxMHB4O1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAgIG9wYWNpdHk6IDAuMjtcXG59XFxuLl9kYXNoLXVuZG8tcmVkby1saW5rOmhvdmVyIHtcXG4gICAgb3BhY2l0eTogMTtcXG59XFxuLl9kYXNoLXVuZG8tcmVkby1saW5rIC5fZGFzaC1pY29uLXVuZG8ge1xcbiAgICBmb250LXNpemU6IDIwcHg7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDI3MGRlZyk7XFxufVxcbi5fZGFzaC11bmRvLXJlZG8tbGluayAuX2Rhc2gtaWNvbi1yZWRvIHtcXG4gICAgZm9udC1zaXplOiAyMHB4O1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZyk7XFxufVxcbi5fZGFzaC11bmRvLXJlZG8tbGluayAuX2Rhc2gtdW5kby1yZWRvLWxhYmVsIHtcXG4gICAgZm9udC1zaXplOiAxNXB4O1xcbn1cXG5cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIiwiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYC5kYXNoLWNhbGxiYWNrLWRhZy0tY29udGFpbmVyIHtcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgd2lkdGg6IDgwdnc7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGhlaWdodDogY2FsYygxMDB2aCAtIDc1cHgpO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAvKiBzaGFkb3ctMSAqL1xuICAgIGJveC1zaGFkb3c6IDBweCA2cHggMTZweCByZ2JhKDgwLCAxMDMsIDEzMiwgMC4xNjUpLFxuICAgICAgICAwcHggMnB4IDZweCByZ2JhKDgwLCAxMDMsIDEzMiwgMC4xMiksXG4gICAgICAgIDBweCAwcHggMXB4IHJnYmEoODAsIDEwMywgMTMyLCAwLjMyKTtcbn1cblxuLmRhc2gtY2FsbGJhY2stZGFnLS1pbmZvIHtcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHBhZGRpbmc6IDhweDtcbiAgICBib3R0b206IDE2cHg7XG4gICAgbGVmdDogMTZweDtcbiAgICBtYXgtd2lkdGg6IGNhbGMoMTAwJSAtIDMycHgpO1xuICAgIG1heC1oZWlnaHQ6IDUwJTtcbiAgICBvdmVyZmxvdzogYXV0bztcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTtcbiAgICBib3JkZXI6IDJweCBzb2xpZCAjY2NjO1xuICAgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBzYW5zLXNlcmlmO1xufVxuXG4uZGFzaC1jYWxsYmFjay1kYWctLW1lc3NhZ2Uge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBsaW5lLWhlaWdodDogMmVtO1xuICAgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBzYW5zLXNlcmlmO1xufVxuXG4uZGFzaC1jYWxsYmFjay1kYWctLWxheW91dFNlbGVjdG9yIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAzcHg7XG4gICAgcmlnaHQ6IDNweDtcbn1cbmAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvQ2FsbGJhY2tHcmFwaC9DYWxsYmFja0dyYXBoQ29udGFpbmVyLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtJQUNJLGtCQUFrQjtJQUNsQixXQUFXO0lBQ1gsa0JBQWtCO0lBQ2xCLDBCQUEwQjtJQUMxQixnQkFBZ0I7SUFDaEIsc0JBQXNCO0lBQ3RCLG1CQUFtQjtJQUNuQixxQkFBcUI7SUFDckIsYUFBYTtJQUNiOzs0Q0FFd0M7QUFDNUM7O0FBRUE7SUFDSSxrQkFBa0I7SUFDbEIsa0JBQWtCO0lBQ2xCLFlBQVk7SUFDWixZQUFZO0lBQ1osVUFBVTtJQUNWLDRCQUE0QjtJQUM1QixlQUFlO0lBQ2YsY0FBYztJQUNkLHNCQUFzQjtJQUN0QixvQ0FBb0M7SUFDcEMsc0JBQXNCO0lBQ3RCLGdDQUFnQztBQUNwQzs7QUFFQTtJQUNJLGFBQWE7SUFDYixzQkFBc0I7SUFDdEIsdUJBQXVCO0lBQ3ZCLG1CQUFtQjtJQUNuQixZQUFZO0lBQ1osZ0JBQWdCO0lBQ2hCLGdDQUFnQztBQUNwQzs7QUFFQTtJQUNJLGtCQUFrQjtJQUNsQixRQUFRO0lBQ1IsVUFBVTtBQUNkXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi5kYXNoLWNhbGxiYWNrLWRhZy0tY29udGFpbmVyIHtcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xcbiAgICB3aWR0aDogODB2dztcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgICBoZWlnaHQ6IGNhbGMoMTAwdmggLSA3NXB4KTtcXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgICAvKiBzaGFkb3ctMSAqL1xcbiAgICBib3gtc2hhZG93OiAwcHggNnB4IDE2cHggcmdiYSg4MCwgMTAzLCAxMzIsIDAuMTY1KSxcXG4gICAgICAgIDBweCAycHggNnB4IHJnYmEoODAsIDEwMywgMTMyLCAwLjEyKSxcXG4gICAgICAgIDBweCAwcHggMXB4IHJnYmEoODAsIDEwMywgMTMyLCAwLjMyKTtcXG59XFxuXFxuLmRhc2gtY2FsbGJhY2stZGFnLS1pbmZvIHtcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIHBhZGRpbmc6IDhweDtcXG4gICAgYm90dG9tOiAxNnB4O1xcbiAgICBsZWZ0OiAxNnB4O1xcbiAgICBtYXgtd2lkdGg6IGNhbGMoMTAwJSAtIDMycHgpO1xcbiAgICBtYXgtaGVpZ2h0OiA1MCU7XFxuICAgIG92ZXJmbG93OiBhdXRvO1xcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7XFxuICAgIGJvcmRlcjogMnB4IHNvbGlkICNjY2M7XFxuICAgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBzYW5zLXNlcmlmO1xcbn1cXG5cXG4uZGFzaC1jYWxsYmFjay1kYWctLW1lc3NhZ2Uge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgaGVpZ2h0OiAxMDAlO1xcbiAgICBsaW5lLWhlaWdodDogMmVtO1xcbiAgICBmb250LWZhbWlseTogVmVyZGFuYSwgc2Fucy1zZXJpZjtcXG59XFxuXFxuLmRhc2gtY2FsbGJhY2stZGFnLS1sYXlvdXRTZWxlY3RvciB7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgdG9wOiAzcHg7XFxuICAgIHJpZ2h0OiAzcHg7XFxufVxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgLmVycm9yLWNvbnRhaW5lciB7XG4gICAgcGFkZGluZzogMCAxMHB4O1xuICAgIGZvbnQtZmFtaWx5OiBDb3VyaWVyO1xufVxuXG4uZGFzaC1mZS1lcnJvcl9faWNvbi14IHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgcmlnaHQ6IDA7XG4gICAgdG9wOiAwO1xuICAgIGNvbG9yOiAjYjljMmNlO1xuICAgIGZvbnQtc2l6ZTogMjBweDtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi5kYXNoLWZlLWVycm9yX19pY29uLXg6aG92ZXIge1xuICAgIGNvbG9yOiAjYTFhOWI1O1xufVxuXG4uZGFzaC1mZS1lcnJvcnMge1xuICAgIG1pbi13aWR0aDogMzg2cHg7XG4gICAgbWF4LXdpZHRoOiA2NTBweDtcbiAgICBtYXgtaGVpZ2h0OiA0NTBweDtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG59XG5cbi5kYXNoLWZlLWVycm9yX19pY29uLWVycm9yIHtcbiAgICB3aWR0aDogMjBweDtcbiAgICBoZWlnaHQ6IDIwcHg7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIG1hcmdpbi1yaWdodDogMTZweDtcbn1cbi5kYXNoLWZlLWVycm9yX19pY29uLWNsb3NlIHtcbiAgICB3aWR0aDogMTBweDtcbiAgICBoZWlnaHQ6IDEwcHg7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHJpZ2h0OiAxMnB4O1xuICAgIHRvcDogMTJweDtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG59XG4uZGFzaC1mZS1lcnJvcl9faWNvbi1hcnJvdyB7XG4gICAgd2lkdGg6IDhweDtcbiAgICBoZWlnaHQ6IDI4cHg7XG4gICAgbWFyZ2luOiAwcHggOHB4O1xufVxuLmRhc2gtZmUtZXJyb3ItdG9wX19ncm91cDpmaXJzdC1jaGlsZCB7XG4gICAgLypcbiAgICAgKiA3NyUgaXMgdGhlIG1heGltdW0gc3BhY2UgYWxsb3dlZCBiYXNlZCBvZmYgb2YgdGhlIG90aGVyIGVsZW1lbnRzXG4gICAgICogaW4gdGhlIHRvcCBwYXJ0IG9mIHRoZSBlcnJvciBjb250YWluZXIgKHRpbWVzdGFtcCAmIGNvbGxhcHNlIGFycm93KS5cbiAgICAgKiB0aGlzIHdhcyBtYW51YWxseSBkZXRlcm1pbmVkICovXG4gICAgd2lkdGg6IDc3JTtcbn1cbi5kYXNoLWZlLWVycm9yLXRvcF9fZ3JvdXAge1xuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XG4uZGFzaC1mZS1lcnJvcl9fdGl0bGUge1xuICAgIHRleHQtYWxpZ246IGxlZnQ7XG4gICAgbWFyZ2luOiAwcHg7XG4gICAgbWFyZ2luLWxlZnQ6IDVweDtcbiAgICBwYWRkaW5nOiAwcHg7XG4gICAgZm9udC1zaXplOiAxMi42cHg7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBsaW5lLWhlaWdodDogMjBweDtcbn1cbi5kYXNoLWZlLWVycm9yX190aW1lc3RhbXAge1xuICAgIG1hcmdpbi1yaWdodDogMjBweDtcbn1cbi5kYXNoLWZlLWVycm9yX19jb2xsYXBzZS0tZmxpcHBlZCB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xuICAgIC1tcy10cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xuICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XG59XG5cbi5kYXNoLWZlLWVycm9yX19pbmZvX3RpdGxlIHtcbiAgICBtYXJnaW46IDA7XG4gICAgY29sb3I6ICM1MDY3ODQ7XG4gICAgZm9udC1zaXplOiAxNnB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmM2Y2ZmE7XG4gICAgYm9yZGVyOiAycHggc29saWQgI2RmZThmMztcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDRweDtcbiAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogNHB4O1xuICAgIHBhZGRpbmc6IDEwcHg7XG59XG5cbi5kYXNoLWZlLWVycm9yX19pbmZvIHtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZGZlOGYzO1xuICAgIG1hcmdpbjogMCAwIDFlbSAwO1xuICAgIHBhZGRpbmc6IDEwcHg7XG5cbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgICBib3JkZXI6IDJweCBzb2xpZCAjZGZlOGYzO1xuICAgIGNvbG9yOiAjNTA2Nzg0O1xuICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDtcbn1cblxuLmRhc2gtZmUtZXJyb3JfX2N1cnZlZCB7XG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xufVxuXG4uZGFzaC1mZS1lcnJvcl9fY3VydmVkLXRvcCB7XG4gICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogNHB4O1xuICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiA0cHg7XG4gICAgYm9yZGVyLWJvdHRvbS13aWR0aDogMHB4O1xufVxuXG4uZGFzaC1mZS1lcnJvcl9fY3VydmVkLWJvdHRvbSB7XG4gICAgYm9yZGVyLXJhZGl1cy1ib3R0b20tbGVmdDogNHB4O1xuICAgIGJvcmRlci1yYWRpdXMtYm90dG9tLXJpZ2h0OiA0cHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZWZlZjtcbn1cblxuLmRhc2gtYmUtZXJyb3JfX3N0IHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmRmM2Y0O1xuICAgIG1pbi13aWR0aDogMzg2cHg7XG4gICAgbWF4LXdpZHRoOiA2NTBweDtcbiAgICAvKiBpZnJhbWUgY29udGFpbmVyIGhhbmRsZXMgdGhlIHNjcm9sbGluZyAqL1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuXG4uZGFzaC1iZS1lcnJvcl9fc3RyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNmZhO1xuICAgIG1pbi13aWR0aDogMzg2cHg7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgb3ZlcmZsb3c6IGF1dG87XG4gICAgbGluZS1oZWlnaHQ6IDE3cHg7XG4gICAgbWFyZ2luLWJvdHRvbTogOHB4O1xufVxuXG4uZGFzaC1iYWNrZW5kLWVycm9yIHtcbiAgICBwYWRkaW5nOiA4cHg7XG59XG5cbi5kYXNoLWVycm9yLW1lbnUge1xuICAgIG1heC13aWR0aDogNTAlO1xuICAgIG1heC1oZWlnaHQ6IDYwJTtcbiAgICBkaXNwbGF5OiBjb250ZW50cztcbiAgICBmb250LWZhbWlseTogbW9ub3NwYWNlO1xuICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICBmb250LXZhcmlhbnQtbGlnYXR1cmVzOiBjb21tb24tbGlnYXR1cmVzO1xuICAgIGNvbG9yOiByZ2IoNTAsIDUwLCA1MCk7XG59XG5cbi5kYXNoLWVycm9yLWNhcmQge1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIC8qIHNoYWRvdy0xICovXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgIGFuaW1hdGlvbjogZGFzaC1lcnJvci1jYXJkLWFuaW1hdGlvbiAwLjVzO1xuICAgIHBhZGRpbmc6IDI0cHg7XG4gICAgdGV4dC1hbGlnbjogbGVmdDtcbiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICB3aWR0aDogMTAwJTtcbn1cbi5kYXNoLWVycm9yLWNhcmQtLWFsZXJ0cy10cmF5IHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAtMzAwcHg7XG4gICAgbGVmdDogLTFweDtcbiAgICBhbmltYXRpb246IG5vbmU7XG4gICAgYm94LXNoYWRvdzogbm9uZTtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZWNlY2VjO1xuICAgIGJvcmRlci1ib3R0b206IDA7XG4gICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMHB4O1xuICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwcHg7XG4gICAgd2lkdGg6IDQyMnB4O1xufVxuLmRhc2gtZXJyb3ItY2FyZC0tY29udGFpbmVyIHtcbiAgICBwYWRkaW5nOiAxNnB4O1xuICAgIHdpZHRoOiA2MDBweDtcbiAgICBtYXgtd2lkdGg6IDgwMHB4O1xuICAgIG1hcmdpbi1ib3R0b206IDRweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgICBvdmVyZmxvdzogYXV0bztcbiAgICBib3JkZXItcmFkaXVzOiA2cHg7XG4gICAgYm94LXNoYWRvdzogMHB4IDAuN3B4IDEuNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMDcpLFxuICAgICAgICAwcHggMS45cHggNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMDUpLFxuICAgICAgICAwcHggNC41cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjA1KTtcbn1cblxuLmRhc2gtZXJyb3ItY2FyZF9fdG9wYmFyIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDMycHg7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XG4gICAgZm9udC1zaXplOiAxNHB4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHBhZGRpbmctYm90dG9tOiAxNHB4O1xuICAgIGZvbnQtd2VpZ2h0OiA3MDA7XG59XG4uZGFzaC1lcnJvci1jYXJkX19tZXNzYWdlIHtcbiAgICBmb250LXNpemU6IDE0cHg7XG59XG5cbi5kYXNoLWVycm9yLWNhcmRfX21lc3NhZ2UgPiBzdHJvbmcge1xuICAgIGNvbG9yOiAjZmY0NTAwO1xufVxuXG4uZGFzaC1lcnJvci1jYXJkX19jb250ZW50IHtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xuICAgIGJvcmRlci1yYWRpdXM6IDJweDtcbiAgICBtYXJnaW4tYm90dG9tOiAxNXB4O1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICMwMDE4NjYxYTtcbiAgICBmb250LXNpemU6IDEyLjZweDtcbn1cblxuLmRhc2gtZmUtZXJyb3ItaXRlbSB7XG4gICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgICBib3JkZXItcmFkaXVzOiAycHg7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBwYWRkaW5nOiA4cHg7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG5Aa2V5ZnJhbWVzIGRhc2gtZXJyb3ItY2FyZC1hbmltYXRpb24ge1xuICAgIGZyb20ge1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMS4xKTtcbiAgICAgICAgLW1vei10cmFuc2Zvcm06IHNjYWxlKDEuMSk7XG4gICAgICAgIC1tcy10cmFuc2Zvcm06IHNjYWxlKDEuMSk7XG4gICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS4xKTtcbiAgICB9XG4gICAgdG8ge1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMSk7XG4gICAgICAgIC1tb3otdHJhbnNmb3JtOiBzY2FsZSgxKTtcbiAgICAgICAgLW1zLXRyYW5zZm9ybTogc2NhbGUoMSk7XG4gICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7XG4gICAgfVxufVxuYCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvY29tcG9uZW50cy9lcnJvci9Gcm9udEVuZC9Gcm9udEVuZEVycm9yLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtJQUNJLGVBQWU7SUFDZixvQkFBb0I7QUFDeEI7O0FBRUE7SUFDSSxrQkFBa0I7SUFDbEIsUUFBUTtJQUNSLE1BQU07SUFDTixjQUFjO0lBQ2QsZUFBZTtJQUNmLGVBQWU7QUFDbkI7O0FBRUE7SUFDSSxjQUFjO0FBQ2xCOztBQUVBO0lBQ0ksZ0JBQWdCO0lBQ2hCLGdCQUFnQjtJQUNoQixpQkFBaUI7SUFDakIscUJBQXFCO0FBQ3pCOztBQUVBO0lBQ0ksV0FBVztJQUNYLFlBQVk7SUFDWixxQkFBcUI7SUFDckIsa0JBQWtCO0FBQ3RCO0FBQ0E7SUFDSSxXQUFXO0lBQ1gsWUFBWTtJQUNaLGtCQUFrQjtJQUNsQixXQUFXO0lB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QkFBdUI7UUFDdkIsbUJBQW1CO0lBQ3ZCO0FBQ0pcIixcInNvdXJjZXNDb250ZW50XCI6W1wiLmVycm9yLWNvbnRhaW5lciB7XFxuICAgIHBhZGRpbmc6IDAgMTBweDtcXG4gICAgZm9udC1mYW1pbHk6IENvdXJpZXI7XFxufVxcblxcbi5kYXNoLWZlLWVycm9yX19pY29uLXgge1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIHJpZ2h0OiAwO1xcbiAgICB0b3A6IDA7XFxuICAgIGNvbG9yOiAjYjljMmNlO1xcbiAgICBmb250LXNpemU6IDIwcHg7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuXFxuLmRhc2gtZmUtZXJyb3JfX2ljb24teDpob3ZlciB7XFxuICAgIGNvbG9yOiAjYTFhOWI1O1xcbn1cXG5cXG4uZGFzaC1mZS1lcnJvcnMge1xcbiAgICBtaW4td2lkdGg6IDM4NnB4O1xcbiAgICBtYXgtd2lkdGg6IDY1MHB4O1xcbiAgICBtYXgtaGVpZ2h0OiA0NTBweDtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbn1cXG5cXG4uZGFzaC1mZS1lcnJvcl9faWNvbi1lcnJvciB7XFxuICAgIHdpZHRoOiAyMHB4O1xcbiAgICBoZWlnaHQ6IDIwcHg7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gICAgbWFyZ2luLXJpZ2h0OiAxNnB4O1xcbn1cXG4uZGFzaC1mZS1lcnJvcl9faWNvbi1jbG9zZSB7XFxuICAgIHdpZHRoOiAxMHB4O1xcbiAgICBoZWlnaHQ6IDEwcHg7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgcmlnaHQ6IDEycHg7XFxuICAgIHRvcDogMTJweDtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbn1cXG4uZGFzaC1mZS1lcnJvcl9faWNvbi1hcnJvdyB7XFxuICAgIHdpZHRoOiA4cHg7XFxuICAgIGhlaWdodDogMjhweDtcXG4gICAgbWFyZ2luOiAwcHggOHB4O1xcbn1cXG4uZGFzaC1mZS1lcnJvci10b3BfX2dyb3VwOmZpcnN0LWNoaWxkIHtcXG4gICAgLypcXG4gICAgICogNzclIGlzIHRoZSBtYXhpbXVtIHNwYWNlIGFsbG93ZWQgYmFzZWQgb2ZmIG9mIHRoZSBvdGhlciBlbGVtZW50c1xcbiAgICAgKiBpbiB0aGUgdG9wIHBhcnQgb2YgdGhlIGVycm9yIGNvbnRhaW5lciAodGltZXN0YW1wICYgY29sbGFwc2UgYXJyb3cpLlxcbiAgICAgKiB0aGlzIHdhcyBtYW51YWxseSBkZXRlcm1pbmVkICovXFxuICAgIHdpZHRoOiA3NyU7XFxufVxcbi5kYXNoLWZlLWVycm9yLXRvcF9fZ3JvdXAge1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG59XFxuLmRhc2gtZmUtZXJyb3JfX3RpdGxlIHtcXG4gICAgdGV4dC1hbGlnbjogbGVmdDtcXG4gICAgbWFyZ2luOiAwcHg7XFxuICAgIG1hcmdpbi1sZWZ0OiA1cHg7XFxuICAgIHBhZGRpbmc6IDBweDtcXG4gICAgZm9udC1zaXplOiAxMi42cHg7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XFxuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxuICAgIG92ZXJmbG93OiBoaWRkZW47XFxuICAgIGxpbmUtaGVpZ2h0OiAyMHB4O1xcbn1cXG4uZGFzaC1mZS1lcnJvcl9fdGltZXN0YW1wIHtcXG4gICAgbWFyZ2luLXJpZ2h0OiAyMHB4O1xcbn1cXG4uZGFzaC1mZS1lcnJvcl9fY29sbGFwc2UtLWZsaXBwZWQge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxuICAgIC1tcy10cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbn1cXG5cXG4uZGFzaC1mZS1lcnJvcl9faW5mb190aXRsZSB7XFxuICAgIG1hcmdpbjogMDtcXG4gICAgY29sb3I6ICM1MDY3ODQ7XFxuICAgIGZvbnQtc2l6ZTogMTZweDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2YzZjZmYTtcXG4gICAgYm9yZGVyOiAycHggc29saWQgI2RmZThmMztcXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogNHB4O1xcbiAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogNHB4O1xcbiAgICBwYWRkaW5nOiAxMHB4O1xcbn1cXG5cXG4uZGFzaC1mZS1lcnJvcl9faW5mbyB7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNkZmU4ZjM7XFxuICAgIG1hcmdpbjogMCAwIDFlbSAwO1xcbiAgICBwYWRkaW5nOiAxMHB4O1xcblxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXG4gICAgYm9yZGVyOiAycHggc29saWQgI2RmZThmMztcXG4gICAgY29sb3I6ICM1MDY3ODQ7XFxuICAgIG92ZXJmbG93OiBhdXRvO1xcbiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7XFxufVxcblxcbi5kYXNoLWZlLWVycm9yX19jdXJ2ZWQge1xcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XFxufVxcblxcbi5kYXNoLWZlLWVycm9yX19jdXJ2ZWQtdG9wIHtcXG4gICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogNHB4O1xcbiAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogNHB4O1xcbiAgICBib3JkZXItYm90dG9tLXdpZHRoOiAwcHg7XFxufVxcblxcbi5kYXNoLWZlLWVycm9yX19jdXJ2ZWQtYm90dG9tIHtcXG4gICAgYm9yZGVyLXJhZGl1cy1ib3R0b20tbGVmdDogNHB4O1xcbiAgICBib3JkZXItcmFkaXVzLWJvdHRvbS1yaWdodDogNHB4O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZlZmVmO1xcbn1cXG5cXG4uZGFzaC1iZS1lcnJvcl9fc3Qge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmRmM2Y0O1xcbiAgICBtaW4td2lkdGg6IDM4NnB4O1xcbiAgICBtYXgtd2lkdGg6IDY1MHB4O1xcbiAgICAvKiBpZnJhbWUgY29udGFpbmVyIGhhbmRsZXMgdGhlIHNjcm9sbGluZyAqL1xcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxufVxcblxcbi5kYXNoLWJlLWVycm9yX19zdHIge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNmZhO1xcbiAgICBtaW4td2lkdGg6IDM4NnB4O1xcbiAgICB3aWR0aDogMTAwJTtcXG4gICAgb3ZlcmZsb3c6IGF1dG87XFxuICAgIGxpbmUtaGVpZ2h0OiAxN3B4O1xcbiAgICBtYXJnaW4tYm90dG9tOiA4cHg7XFxufVxcblxcbi5kYXNoLWJhY2tlbmQtZXJyb3Ige1xcbiAgICBwYWRkaW5nOiA4cHg7XFxufVxcblxcbi5kYXNoLWVycm9yLW1lbnUge1xcbiAgICBtYXgtd2lkdGg6IDUwJTtcXG4gICAgbWF4LWhlaWdodDogNjAlO1xcbiAgICBkaXNwbGF5OiBjb250ZW50cztcXG4gICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTtcXG4gICAgZm9udC1zaXplOiAxNHB4O1xcbiAgICBmb250LXZhcmlhbnQtbGlnYXR1cmVzOiBjb21tb24tbGlnYXR1cmVzO1xcbiAgICBjb2xvcjogcmdiKDUwLCA1MCwgNTApO1xcbn1cXG5cXG4uZGFzaC1lcnJvci1jYXJkIHtcXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgICAvKiBzaGFkb3ctMSAqL1xcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XFxuICAgIGFuaW1hdGlvbjogZGFzaC1lcnJvci1jYXJkLWFuaW1hdGlvbiAwLjVzO1xcbiAgICBwYWRkaW5nOiAyNHB4O1xcbiAgICB0ZXh0LWFsaWduOiBsZWZ0O1xcbiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcXG4gICAgd2lkdGg6IDEwMCU7XFxufVxcbi5kYXNoLWVycm9yLWNhcmQtLWFsZXJ0cy10cmF5IHtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICB0b3A6IC0zMDBweDtcXG4gICAgbGVmdDogLTFweDtcXG4gICAgYW5pbWF0aW9uOiBub25lO1xcbiAgICBib3gtc2hhZG93OiBub25lO1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZWNlY2VjO1xcbiAgICBib3JkZXItYm90dG9tOiAwO1xcbiAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAwcHg7XFxuICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwcHg7XFxuICAgIHdpZHRoOiA0MjJweDtcXG59XFxuLmRhc2gtZXJyb3ItY2FyZC0tY29udGFpbmVyIHtcXG4gICAgcGFkZGluZzogMTZweDtcXG4gICAgd2lkdGg6IDYwMHB4O1xcbiAgICBtYXgtd2lkdGg6IDgwMHB4O1xcbiAgICBtYXJnaW4tYm90dG9tOiA0cHg7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xcbiAgICBvdmVyZmxvdzogYXV0bztcXG4gICAgYm9yZGVyLXJhZGl1czogNnB4O1xcbiAgICBib3gtc2hhZG93OiAwcHggMC43cHggMS40cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4wNyksXFxuICAgICAgICAwcHggMS45cHggNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMDUpLFxcbiAgICAgICAgMHB4IDQuNXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4wNSk7XFxufVxcblxcbi5kYXNoLWVycm9yLWNhcmRfX3RvcGJhciB7XFxuICAgIHdpZHRoOiAxMDAlO1xcbiAgICBoZWlnaHQ6IDMycHg7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDtcXG4gICAgZm9udC1zaXplOiAxNHB4O1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIHBhZGRpbmctYm90dG9tOiAxNHB4O1xcbiAgICBmb250LXdlaWdodDogNzAwO1xcbn1cXG4uZGFzaC1lcnJvci1jYXJkX19tZXNzYWdlIHtcXG4gICAgZm9udC1zaXplOiAxNHB4O1xcbn1cXG5cXG4uZGFzaC1lcnJvci1jYXJkX19tZXNzYWdlID4gc3Ryb25nIHtcXG4gICAgY29sb3I6ICNmZjQ1MDA7XFxufVxcblxcbi5kYXNoLWVycm9yLWNhcmRfX2NvbnRlbnQge1xcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXG4gICAgYm9yZGVyLXJhZGl1czogMnB4O1xcbiAgICBtYXJnaW4tYm90dG9tOiAxNXB4O1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjMDAxODY2MWE7XFxuICAgIGZvbnQtc2l6ZTogMTIuNnB4O1xcbn1cXG5cXG4uZGFzaC1mZS1lcnJvci1pdGVtIHtcXG4gICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcXG4gICAgYm9yZGVyLXJhZGl1czogMnB4O1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIHBhZGRpbmc6IDhweDtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbn1cXG5cXG5Aa2V5ZnJhbWVzIGRhc2gtZXJyb3ItY2FyZC1hbmltYXRpb24ge1xcbiAgICBmcm9tIHtcXG4gICAgICAgIG9wYWNpdHk6IDA7XFxuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMS4xKTtcXG4gICAgICAgIC1tb3otdHJhbnNmb3JtOiBzY2FsZSgxLjEpO1xcbiAgICAgICAgLW1zLXRyYW5zZm9ybTogc2NhbGUoMS4xKTtcXG4gICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS4xKTtcXG4gICAgfVxcbiAgICB0byB7XFxuICAgICAgICBvcGFjaXR5OiAxO1xcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEpO1xcbiAgICAgICAgLW1vei10cmFuc2Zvcm06IHNjYWxlKDEpO1xcbiAgICAgICAgLW1zLXRyYW5zZm9ybTogc2NhbGUoMSk7XFxuICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xcbiAgICB9XFxufVxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgLnBlcmN5LXNob3cge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbkBtZWRpYSBvbmx5IHBlcmN5IHtcbiAgICAucGVyY3ktaGlkZSB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuICAgIC5wZXJjeS1zaG93IHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxufVxuYCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvY29tcG9uZW50cy9lcnJvci9QZXJjeS5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7SUFDSSxhQUFhO0FBQ2pCOztBQUVBO0lBQ0k7UUFDSSxhQUFhO0lBQ2pCO0lBQ0E7UUFDSSxjQUFjO0lBQ2xCO0FBQ0pcIixcInNvdXJjZXNDb250ZW50XCI6W1wiLnBlcmN5LXNob3cge1xcbiAgICBkaXNwbGF5OiBub25lO1xcbn1cXG5cXG5AbWVkaWEgb25seSBwZXJjeSB7XFxuICAgIC5wZXJjeS1oaWRlIHtcXG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XFxuICAgIH1cXG4gICAgLnBlcmN5LXNob3cge1xcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XFxuICAgIH1cXG59XFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGAuZGFzaC1kZWJ1Zy1tZW51IHtcbiAgICB0cmFuc2l0aW9uOiAwLjNzO1xuICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICBib3R0b206IDM1cHg7XG4gICAgcmlnaHQ6IDM1cHg7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIHotaW5kZXg6IDEwMDAxO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICMxMTlkZmY7XG4gICAgYm9yZGVyLXJhZGl1czogMTAwJTtcbiAgICB3aWR0aDogNjRweDtcbiAgICBoZWlnaHQ6IDY0cHg7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xufVxuLmRhc2gtZGVidWctbWVudS0tb3BlbiB7XG4gICAgdHJhbnNmb3JtOiByb3RhdGUoLTE4MGRlZyk7XG59XG5cbi5kYXNoLWRlYnVnLW1lbnVfX291dGVyIGJ1dHRvbiB7XG4gICAgaGVpZ2h0OiBhdXRvO1xuICAgIHBhZGRpbmc6IDAgOHB4O1xuICAgIGxpbmUtaGVpZ2h0OiBub3JtYWw7XG4gICAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XG4gICAgZm9udC1zaXplOiAxNHB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDBweDtcbiAgICBsZXR0ZXItc3BhY2luZzogbm9ybWFsO1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgZ2FwOiA2cHg7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgIG91dGxpbmU6IG5vbmU7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuXG4uZGFzaC1kZWJ1Zy1tZW51X19wb3B1cCB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBib3R0b206IDEwMCU7XG4gICAgcmlnaHQ6IDA7XG4gICAgZ2FwOiA4cHg7XG4gICAgbWF4LWhlaWdodDogY2FsYygxMDB2aCAtIDc1cHgpO1xuICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XG59XG5cbi5kYXNoLWRlYnVnLW1lbnVfX3ZlcnNpb24tb3B0LW91dCB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICB3aWR0aDogNDI2cHg7XG4gICAgcGFkZGluZzogMTZweDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuICAgIGdhcDogOHB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDI0LCAxMDIsIDAuMSk7XG4gICAgYmFja2dyb3VuZDogI2ZmZjtcbiAgICBhbGlnbi1zZWxmOiBmbGV4LWVuZDtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgLyogU2hhZG93L1NtYWxsICovXG4gICAgYm94LXNoYWRvdzogMHB4IDAuN3B4IDEuNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMDcpLFxuICAgICAgICAwcHggMS45cHggNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMDUpLFxuICAgICAgICAwcHggNC41cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjA1KTtcbn1cblxuLmRhc2gtZGVidWctbWVudV9fdmVyc2lvbi1vcHQtb3V0X190ZXh0IHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG59XG5cbi5kYXNoLWRlYnVnLW1lbnVfX3ZlcnNpb24tb3B0LW91dF9fdGV4dCBhIHtcbiAgICBjb2xvcjogIzdmNGJjNDtcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG59XG5cbi5kYXNoLWRlYnVnLW1lbnVfX3ZlcnNpb24tb3B0LW91dF9fdGV4dCBzcGFuIHtcbiAgICBtYXJnaW4tcmlnaHQ6IDVweDtcbn1cblxuLmRhc2gtZGVidWctbWVudV9fdmVyc2lvbi1vcHQtb3V0IGJ1dHRvbiB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBoZWlnaHQ6IDI0cHg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgbGluZS1oZWlnaHQ6IDE4cHg7XG4gICAgcGFkZGluZzogMTZweCAxMnB4O1xufVxuXG4uZGFzaC1kZWJ1Zy1tZW51X192ZXJzaW9uLW9wdC1vdXRfX2J1dHRvbnMtY29udGFpbmVyIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGdhcDogOHB4O1xuICAgIGFsaWduLXNlbGY6IHN0cmV0Y2g7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgcGFkZGluZy10b3A6IDE2cHg7XG4gICAgbWFyZ2luLXRvcDogMTZweDtcbiAgICBib3JkZXItdG9wOiAxcHggc29saWQgcmdiYSgwLCAyNCwgMTAyLCAwLjEpO1xufVxuXG4uZGFzaC1kZWJ1Zy1tZW51X192ZXJzaW9uLW9wdC1vdXRfX2J1dHRvbi1wcmltYXJ5IHtcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgY29sb3I6ICNmZmY7XG4gICAgYmFja2dyb3VuZDogIzdmNGJjNDtcbn1cblxuLmRhc2gtZGVidWctbWVudV9fdmVyc2lvbi1vcHQtb3V0X19idXR0b24tc2Vjb25kYXJ5IHtcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDE2MSwgODksIDI1NSwgMC4wNSk7XG4gICAgY29sb3I6ICM3ZjRiYzQ7XG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxMzQsIDc0LCAyMTIsIDAuOCk7XG59XG5cbi5kYXNoLWRlYnVnLW1lbnU6aG92ZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICM3ZjRiYzQ7XG59XG5cbi5kYXNoLWRlYnVnLW1lbnVfX291dGVyIHtcbiAgICB0cmFuc2l0aW9uOiAwLjNzO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgcG9zaXRpb246IGZpeGVkO1xuICAgIGJvdHRvbTogLTFweDtcbiAgICByaWdodDogLTFweDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGNvbG9yOiBibGFjaztcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBzYW5zLXNlcmlmICFpbXBvcnRhbnQ7XG4gICAgZm9udC1zaXplOiAxNHB4O1xuICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICB6LWluZGV4OiAxMDAwMDtcbiAgICBib3JkZXItcmFkaXVzOiA1cHggMCAwIDA7XG4gICAgcGFkZGluZzogMTVweCAwO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmNWY2ZmE7XG4gICAgYm94LXNoYWRvdzogMHB4IDAuOHB4IDAuOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMDQpLFxuICAgICAgICAwcHggMi4zcHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMDMpO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMCwgMjQsIDEwMiwgMC4xKTtcbn1cbi5kYXNoLWRlYnVnLW1lbnVfX291dGVyLmRhc2gtZGVidWctbWVudV9fb3V0ZXItLWNvbGxhcHNlZCB7XG4gICAgbWF4LXdpZHRoOiA1MHB4O1xufVxuLmRhc2gtZGVidWctbWVudV9fb3V0ZXIuZGFzaC1kZWJ1Zy1tZW51X19vdXRlci0tZXhwYW5kZWQge1xuICAgIG1heC13aWR0aDogY2FsYygxMDB2dyAtIDUwcHgpO1xufVxuXG4uZGFzaC1kZWJ1Zy1tZW51X191cGdyYWRlLXRvb2x0aXAge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBib3R0b206IGNhbGMoMTAwJSArIDEycHgpO1xuICAgIHJpZ2h0OiAwO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgICBib3JkZXItcmFkaXVzOiA2cHg7XG4gICAgYm9yZGVyOiAxcHggc29saWQgIzAwMTg2NjFhO1xuICAgIHBhZGRpbmc6IDExcHg7XG4gICAgYm94LXNoYWRvdzogMHB4IDBweCAxNHB4IDVweCAjMDAwMDAwMTI7XG4gICAgei1pbmRleDogMTIwMDtcbn1cblxuLmRhc2gtZGVidWctbWVudV9fdG9nZ2xlIHtcbiAgICBjb2xvcjogIzdmNGJjNDtcbiAgICB0cmFuc2l0aW9uOiAwLjNzO1xufVxuLmRhc2gtZGVidWctbWVudV9fdG9nZ2xlLS1leHBhbmRlZCB7XG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcbn1cbi5kYXNoLWRlYnVnLW1lbnVfX2Vycm9yLWluZGljYXRvciB7XG4gICAgd2lkdGg6IDhweDtcbiAgICBoZWlnaHQ6IDhweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjREMzRTQyO1xuICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHJpZ2h0OiAzcHg7XG4gICAgdG9wOiAxM3B4O1xufVxuLmRhc2gtZGVidWctbWVudV9fc3RhdHVzIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgZ2FwOiA2cHg7XG59XG5cbi5kYXNoLWRlYnVnLW1lbnVfX2NvbnRlbnQge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7XG4gICAgbWFyZ2luLWxlZnQ6IDE1cHg7XG4gICAgdHJhbnNpdGlvbjogYWxsIDAuNXMgZWFzZTtcbiAgICBmbGV4LXNocmluazogMDtcbn1cblxuLmRhc2gtZGVidWctbWVudV9fdmVyc2lvbiB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbn1cblxuLmRhc2gtZGVidWctbWVudV9fZGl2aWRlciB7XG4gICAgd2lkdGg6IDEuNXB4O1xuICAgIGhlaWdodDogMjZweDtcbiAgICBtYXJnaW46IDBweCAxM3B4O1xuICAgIGJhY2tncm91bmQtY29sb3I6ICMwMDE1NTk0ZDtcbn1cblxuLmRhc2gtZGVidWctbWVudV9fYnV0dG9uIHtcbiAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICBib3gtc2hhZG93OiAwIDFweCAjZDNkYWU2O1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMnM7XG4gICAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIHNhbnMtc2VyaWYgIWltcG9ydGFudDtcbiAgICBjb2xvcjogIzdmNGJjNDtcbn1cblxuLmRhc2gtZGVidWctbWVudV9fYnV0dG9uLmRhc2gtZGVidWctbWVudV9fYnV0dG9uLS1zZWxlY3RlZCB7XG4gICAgY29sb3I6ICM3ZjRiYzQ7XG4gICAgYm94LXNoYWRvdzogMCAycHggIzdmNGJjNDtcbn1cbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbi0tc2VsZWN0ZWQ6aG92ZXIge1xuICAgIGNvbG9yOiAjNTgwNmM0O1xufVxuXG4uZGFzaC1kZWJ1Zy1hbGVydCB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGZvbnQtc2l6ZTogMTBweDtcbn1cblxuLmRhc2gtZGVidWctYWxlcnQtbGFiZWwge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgcG9zaXRpb246IGZpeGVkO1xuICAgIGJvdHRvbTogODFweDtcbiAgICByaWdodDogMjlweDtcbiAgICB6LWluZGV4OiAxMDAwMjtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgYm94LXNoYWRvdzogMHB4IDBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjI1KSxcbiAgICAgICAgMHB4IDFweCAzcHggcmdiYSgxNjIsIDE3NywgMTk4LCAwLjMyKTtcbiAgICBib3JkZXItcmFkaXVzOiAzMnB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xuICAgIHBhZGRpbmc6IDRweDtcbiAgICBjb2xvcjogcmdiKDUwLCA1MCwgNTApO1xufVxuXG4uZGFzaC1kZWJ1Zy1tZW51X19lcnJvci1jb3VudCB7XG4gICAgZm9udC1zaXplOiAxMnB4O1xuICAgIGNvbG9yOiAjZmZmO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNjNzNhM2E7XG4gICAgcGFkZGluZzogM3B4IDVweDtcbiAgICBib3JkZXItcmFkaXVzOiAzcHg7XG59XG5cbi5kYXNoLWRlYnVnLWRpc2Nvbm5lY3RlZCB7XG4gICAgZm9udC1zaXplOiAxNHB4O1xuICAgIG1hcmdpbi1sZWZ0OiAzcHg7XG59XG4uZGFzaC1kZWJ1Zy1tZW51X19pY29uIHtcbiAgICBjb2xvcjogIzljYTNhZjtcbn1cbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbjpob3ZlciAuZGFzaC1kZWJ1Zy1tZW51X19pY29uIHtcbiAgICBjb2xvcjogIzU4MDZjNDtcbn1cbmAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvbWVudS9EZWJ1Z01lbnUuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO0lBQ0ksZ0JBQWdCO0lBQ2hCLGVBQWU7SUFDZixZQUFZO0lBQ1osV0FBVztJQUNYLGFBQWE7SUFDYix1QkFBdUI7SUFDdkIsbUJBQW1CO0lBQ25CLGNBQWM7SUFDZCx5QkFBeUI7SUFDekIsbUJBQW1CO0lBQ25CLFdBQVc7SUFDWCxZQUFZO0lBQ1osZUFBZTtBQUNuQjtBQUNBO0lBQ0ksMEJBQTBCO0FBQzlCOztBQUVBO0lBQ0ksWUFBWTtJQUNaLGNBQWM7SUFDZCxtQkFBbUI7SUFDbkIsb0JBQW9CO0lBQ3BCLGVBQWU7SUFDZixrQkFBa0I7SUFDbEIsc0JBQXNCO0lBQ3RCLG1CQUFtQjtJQUNuQixRQUFRO0lBQ1IsZUFBZTtJQUNmLFlBQVk7SUFDWixnQkFBZ0I7SUFDaEIsYUFBYTtJQUNiLGFBQWE7SUFDYixtQkFBbUI7QUFDdkI7O0FBRUE7SUFDSSxhQUFhO0lBQ2Isc0JBQXNCO0lBQ3RCLGtCQUFrQjtJQUNsQixZQUFZO0lBQ1osUUFBUTtJQUNSLFFBQVE7SUFDUiw4QkFBOEI7SUFDOUIseUJBQXlCO0FBQzdCOztBQUVBO0lBQ0ksYUFBYTtJQUNiLFlBQVk7SUFDWixhQUFhO0lBQ2Isc0JBQXNCO0lBQ3RCLHVCQUF1QjtJQUN2QixRQUFRO0lBQ1Isa0JBQWtCO0lBQ2xCLHVDQUF1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XG4gICAgdHJhbnNpdGlvbjogMC4zcztcXG4gICAgcG9zaXRpb246IGZpeGVkO1xcbiAgICBib3R0b206IDM1cHg7XFxuICAgIHJpZ2h0OiAzNXB4O1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgei1pbmRleDogMTAwMDE7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICMxMTlkZmY7XFxuICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7XFxuICAgIHdpZHRoOiA2NHB4O1xcbiAgICBoZWlnaHQ6IDY0cHg7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuLmRhc2gtZGVidWctbWVudS0tb3BlbiB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKC0xODBkZWcpO1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1tZW51X19vdXRlciBidXR0b24ge1xcbiAgICBoZWlnaHQ6IGF1dG87XFxuICAgIHBhZGRpbmc6IDAgOHB4O1xcbiAgICBsaW5lLWhlaWdodDogbm9ybWFsO1xcbiAgICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG4gICAgZm9udC1zaXplOiAxNHB4O1xcbiAgICBib3JkZXItcmFkaXVzOiAwcHg7XFxuICAgIGxldHRlci1zcGFjaW5nOiBub3JtYWw7XFxuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxuICAgIGdhcDogNnB4O1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxuICAgIGJvcmRlcjogbm9uZTtcXG4gICAgYmFja2dyb3VuZDogbm9uZTtcXG4gICAgb3V0bGluZTogbm9uZTtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fcG9wdXAge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIGJvdHRvbTogMTAwJTtcXG4gICAgcmlnaHQ6IDA7XFxuICAgIGdhcDogOHB4O1xcbiAgICBtYXgtaGVpZ2h0OiBjYWxjKDEwMHZoIC0gNzVweCk7XFxuICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX3ZlcnNpb24tb3B0LW91dCB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIHdpZHRoOiA0MjZweDtcXG4gICAgcGFkZGluZzogMTZweDtcXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXG4gICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XFxuICAgIGdhcDogOHB4O1xcbiAgICBib3JkZXItcmFkaXVzOiA4cHg7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMCwgMjQsIDEwMiwgMC4xKTtcXG4gICAgYmFja2dyb3VuZDogI2ZmZjtcXG4gICAgYWxpZ24tc2VsZjogZmxleC1lbmQ7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gICAgLyogU2hhZG93L1NtYWxsICovXFxuICAgIGJveC1zaGFkb3c6IDBweCAwLjdweCAxLjRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjA3KSxcXG4gICAgICAgIDBweCAxLjlweCA0cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4wNSksXFxuICAgICAgICAwcHggNC41cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjA1KTtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fdmVyc2lvbi1vcHQtb3V0X190ZXh0IHtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1tZW51X192ZXJzaW9uLW9wdC1vdXRfX3RleHQgYSB7XFxuICAgIGNvbG9yOiAjN2Y0YmM0O1xcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX3ZlcnNpb24tb3B0LW91dF9fdGV4dCBzcGFuIHtcXG4gICAgbWFyZ2luLXJpZ2h0OiA1cHg7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX3ZlcnNpb24tb3B0LW91dCBidXR0b24ge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBoZWlnaHQ6IDI0cHg7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgbGluZS1oZWlnaHQ6IDE4cHg7XFxuICAgIHBhZGRpbmc6IDE2cHggMTJweDtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fdmVyc2lvbi1vcHQtb3V0X19idXR0b25zLWNvbnRhaW5lciB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGdhcDogOHB4O1xcbiAgICBhbGlnbi1zZWxmOiBzdHJldGNoO1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gICAgcGFkZGluZy10b3A6IDE2cHg7XFxuICAgIG1hcmdpbi10b3A6IDE2cHg7XFxuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCByZ2JhKDAsIDI0LCAxMDIsIDAuMSk7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX3ZlcnNpb24tb3B0LW91dF9fYnV0dG9uLXByaW1hcnkge1xcbiAgICBib3JkZXI6IG5vbmU7XFxuICAgIGNvbG9yOiAjZmZmO1xcbiAgICBiYWNrZ3JvdW5kOiAjN2Y0YmM0O1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1tZW51X192ZXJzaW9uLW9wdC1vdXRfX2J1dHRvbi1zZWNvbmRhcnkge1xcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDE2MSwgODksIDI1NSwgMC4wNSk7XFxuICAgIGNvbG9yOiAjN2Y0YmM0O1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDEzNCwgNzQsIDIxMiwgMC44KTtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudTpob3ZlciB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICM3ZjRiYzQ7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX291dGVyIHtcXG4gICAgdHJhbnNpdGlvbjogMC4zcztcXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gICAgcG9zaXRpb246IGZpeGVkO1xcbiAgICBib3R0b206IC0xcHg7XFxuICAgIHJpZ2h0OiAtMXB4O1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBjb2xvcjogYmxhY2s7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XFxuICAgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBzYW5zLXNlcmlmICFpbXBvcnRhbnQ7XFxuICAgIGZvbnQtc2l6ZTogMTRweDtcXG4gICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgei1pbmRleDogMTAwMDA7XFxuICAgIGJvcmRlci1yYWRpdXM6IDVweCAwIDAgMDtcXG4gICAgcGFkZGluZzogMTVweCAwO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNmZhO1xcbiAgICBib3gtc2hhZG93OiAwcHggMC44cHggMC44cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4wNCksXFxuICAgICAgICAwcHggMi4zcHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMDMpO1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDI0LCAxMDIsIDAuMSk7XFxufVxcbi5kYXNoLWRlYnVnLW1lbnVfX291dGVyLmRhc2gtZGVidWctbWVudV9fb3V0ZXItLWNvbGxhcHNlZCB7XFxuICAgIG1heC13aWR0aDogNTBweDtcXG59XFxuLmRhc2gtZGVidWctbWVudV9fb3V0ZXIuZGFzaC1kZWJ1Zy1tZW51X19vdXRlci0tZXhwYW5kZWQge1xcbiAgICBtYXgtd2lkdGg6IGNhbGMoMTAwdncgLSA1MHB4KTtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fdXBncmFkZS10b29sdGlwIHtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICBib3R0b206IGNhbGMoMTAwJSArIDEycHgpO1xcbiAgICByaWdodDogMDtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxuICAgIGJvcmRlci1yYWRpdXM6IDZweDtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgIzAwMTg2NjFhO1xcbiAgICBwYWRkaW5nOiAxMXB4O1xcbiAgICBib3gtc2hhZG93OiAwcHggMHB4IDE0cHggNXB4ICMwMDAwMDAxMjtcXG4gICAgei1pbmRleDogMTIwMDtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fdG9nZ2xlIHtcXG4gICAgY29sb3I6ICM3ZjRiYzQ7XFxuICAgIHRyYW5zaXRpb246IDAuM3M7XFxufVxcbi5kYXNoLWRlYnVnLW1lbnVfX3RvZ2dsZS0tZXhwYW5kZWQge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbn1cXG4uZGFzaC1kZWJ1Zy1tZW51X19lcnJvci1pbmRpY2F0b3Ige1xcbiAgICB3aWR0aDogOHB4O1xcbiAgICBoZWlnaHQ6IDhweDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0RDM0U0MjtcXG4gICAgYm9yZGVyLXJhZGl1czogMTAwJTtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICByaWdodDogM3B4O1xcbiAgICB0b3A6IDEzcHg7XFxufVxcbi5kYXNoLWRlYnVnLW1lbnVfX3N0YXR1cyB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIGdhcDogNnB4O1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1tZW51X19jb250ZW50IHtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7XFxuICAgIG1hcmdpbi1sZWZ0OiAxNXB4O1xcbiAgICB0cmFuc2l0aW9uOiBhbGwgMC41cyBlYXNlO1xcbiAgICBmbGV4LXNocmluazogMDtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fdmVyc2lvbiB7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fZGl2aWRlciB7XFxuICAgIHdpZHRoOiAxLjVweDtcXG4gICAgaGVpZ2h0OiAyNnB4O1xcbiAgICBtYXJnaW46IDBweCAxM3B4O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAxNTU5NGQ7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbiB7XFxuICAgIGJhY2tncm91bmQ6IG5vbmU7XFxuICAgIGJvcmRlcjogbm9uZTtcXG4gICAgYm94LXNoYWRvdzogMCAxcHggI2QzZGFlNjtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4ycztcXG4gICAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIHNhbnMtc2VyaWYgIWltcG9ydGFudDtcXG4gICAgY29sb3I6ICM3ZjRiYzQ7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbi0tc2VsZWN0ZWQge1xcbiAgICBjb2xvcjogIzdmNGJjNDtcXG4gICAgYm94LXNoYWRvdzogMCAycHggIzdmNGJjNDtcXG59XFxuLmRhc2gtZGVidWctbWVudV9fYnV0dG9uLmRhc2gtZGVidWctbWVudV9fYnV0dG9uLS1zZWxlY3RlZDpob3ZlciB7XFxuICAgIGNvbG9yOiAjNTgwNmM0O1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1hbGVydCB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIGZvbnQtc2l6ZTogMTBweDtcXG59XFxuXFxuLmRhc2gtZGVidWctYWxlcnQtbGFiZWwge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBwb3NpdGlvbjogZml4ZWQ7XFxuICAgIGJvdHRvbTogODFweDtcXG4gICAgcmlnaHQ6IDI5cHg7XFxuICAgIHotaW5kZXg6IDEwMDAyO1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxuICAgIGJveC1zaGFkb3c6IDBweCAwcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4yNSksXFxuICAgICAgICAwcHggMXB4IDNweCByZ2JhKDE2MiwgMTc3LCAxOTgsIDAuMzIpO1xcbiAgICBib3JkZXItcmFkaXVzOiAzMnB4O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXG4gICAgcGFkZGluZzogNHB4O1xcbiAgICBjb2xvcjogcmdiKDUwLCA1MCwgNTApO1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1tZW51X19lcnJvci1jb3VudCB7XFxuICAgIGZvbnQtc2l6ZTogMTJweDtcXG4gICAgY29sb3I6ICNmZmY7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNjNzNhM2E7XFxuICAgIHBhZGRpbmc6IDNweCA1cHg7XFxuICAgIGJvcmRlci1yYWRpdXM6IDNweDtcXG59XFxuXFxuLmRhc2gtZGVidWctZGlzY29ubmVjdGVkIHtcXG4gICAgZm9udC1zaXplOiAxNHB4O1xcbiAgICBtYXJnaW4tbGVmdDogM3B4O1xcbn1cXG4uZGFzaC1kZWJ1Zy1tZW51X19pY29uIHtcXG4gICAgY29sb3I6ICM5Y2EzYWY7XFxufVxcbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbjpob3ZlciAuZGFzaC1kZWJ1Zy1tZW51X19pY29uIHtcXG4gICAgY29sb3I6ICM1ODA2YzQ7XFxufVxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgLypcbiAgICBTYW1lIGFzIGluIHBsb3RseS1jbG91ZCBidXQgd2l0aG91dCB0aGUgcHVibGlzaFxuICAgIGluIHRoZSBuYW1lIHRvIGF2b2lkIGZ1dHVyZSBjb25mbGljdHMgaWYgY2hhbmdlZFxuICAgIHVwc3RyZWFtLlxuKi9cbi5wbG90bHktY2xvdWQtbW9kYWwtb3ZlcmxheSB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGJvdHRvbTogMTAwJTtcbiAgICBsZWZ0OiAtMXB4O1xuICAgIHotaW5kZXg6IDEwMDAwO1xufVxuXG4ucGxvdGx5LWNsb3VkLW1vZGFsLWNvbnRlbnQge1xuICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICB3aWR0aDogNTIycHg7XG4gICAgYmFja2dyb3VuZDogd2hpdGU7XG4gICAgYm9yZGVyOiAxcHggc29saWQgI2QxZDVkYjtcbiAgICBib3JkZXItcmFkaXVzOiA0cHggNHB4IDAgMDtcbiAgICBib3gtc2hhZG93OiAwIC00cHggNnB4IHJnYmEoMCwgMCwgMCwgMC4wOCk7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLnBsb3RseS1jbG91ZC1tb2RhbC1oZWFkZXIge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgcGFkZGluZzogMTZweCAyMHB4O1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZTVlNWU1O1xuICAgIGJhY2tncm91bmQ6ICNmOWZhZmI7XG59XG5cbi5wbG90bHktY2xvdWQtbW9kYWwtaGVhZGVyIGgzIHtcbiAgICBtYXJnaW46IDA7XG4gICAgY29sb3I6ICMzMzM7XG59XG5cbi5wbG90bHktY2xvdWQtbW9kYWwtY2xvc2Uge1xuICAgIGJhY2tncm91bmQ6IG5vbmU7XG4gICAgYm9yZGVyOiBub25lO1xuICAgIGZvbnQtc2l6ZTogMjRweDtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgY29sb3I6ICM2NjY7XG4gICAgcGFkZGluZzogMDtcbiAgICB3aWR0aDogMzBweDtcbiAgICBoZWlnaHQ6IDMwcHg7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xufVxuXG4ucGxvdGx5LWNsb3VkLW1vZGFsLWNsb3NlOmhvdmVyIHtcbiAgICBjb2xvcjogIzMzMztcbn1cblxuLnBsb3RseS1jbG91ZC1tb2RhbC1ib2R5IHtcbiAgICBwYWRkaW5nOiAyMHB4O1xuICAgIGNvbG9yOiBibGFjayAhaW1wb3J0YW50O1xuICAgIGZvbnQtd2VpZ2h0OiAxMDA7XG59XG5idXR0b24ucGxvdGx5LWNsb3VkLW1vZGFsLWJ1dHRvbiB7XG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBnYXA6IDZweDtcbiAgICBwYWRkaW5nOiA2cHggMTBweCAhaW1wb3J0YW50O1xuICAgIGJvcmRlci1yYWRpdXM6IDRweCAhaW1wb3J0YW50O1xuICAgIGZvbnQtc2l6ZTogMTJweCAhaW1wb3J0YW50O1xuICAgIGZvbnQtd2VpZ2h0OiA2MDAgIWltcG9ydGFudDtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gICAgYmFja2dyb3VuZDogIzhiNWNmNjtcbiAgICBjb2xvcjogd2hpdGU7XG4gICAgYm9yZGVyLWNvbG9yOiAjN2MzYWVkO1xufVxuXG4ucGxvdGx5LWNsb3VkLW1vZGFsLWJ1dHRvbjpkaXNhYmxlZCB7XG4gICAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbn1cbi5wbG90bHktY2xvdWQtY29weS1pbnN0YWxsIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgIGdhcDogMTBweDtcbiAgICBwYWRkaW5nOiA4cHggMTBweDtcbiAgICBiYWNrZ3JvdW5kOiAjZjlmYWZiO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICNlNWU3ZWI7XG4gICAgYm9yZGVyLXJhZGl1czogNnB4O1xuICAgIG1hcmdpbi10b3A6IDhweDtcbn1cbmAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvbWVudS9QbG90bHlDbG91ZC5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7Ozs7Q0FJQztBQUNEO0lBQ0ksa0JBQWtCO0lBQ2xCLFlBQVk7SUFDWixVQUFVO0lBQ1YsY0FBYztBQUNsQjs7QUFFQTtJQUNJLGtCQUFrQjtJQUNsQixZQUFZO0lBQ1osaUJBQWlCO0lBQ2pCLHlCQUF5QjtJQUN6QiwwQkFBMEI7SUFDMUIsMENBQTBDO0lBQzFDLGdCQUFnQjtBQUNwQjs7QUFFQTtJQUNJLGFBQWE7SUFDYiw4QkFBOEI7SUFDOUIsbUJBQW1CO0lBQ25CLGtCQUFrQjtJQUNsQixnQ0FBZ0M7SUFDaEMsbUJBQW1CO0FBQ3ZCOztBQUVBO0lBQ0ksU0FBUztJQUNULFdBQVc7QUFDZjs7QUFFQTtJQUNJLGdCQUFnQjtJQUNoQixZQUFZO0lBQ1osZUFBZTtJQUNmLGVBQWU7SUFDZixXQUFXO0lBQ1gsVUFBVTtJQUNWLFdBQVc7SUFDWCxZQUFZO0lBQ1osYUFBYTtJQUNiLG1CQUFtQjtJQUNuQix1QkFBdUI7QUFDM0I7O0FBRUE7SUFDSSxXQUFXO0FBQ2Y7O0FBRUE7SUFDSSxhQUFhO0lBQ2IsdUJBQXVCO0lBQ3ZCLGdCQUFnQjtBQUNwQjtBQUNBO0lBQ0ksb0JBQW9CO0lBQ3BCLG1CQUFtQjtJQUNuQixRQUFRO0lBQ1IsNEJBQTRCO0lBQzVCLDZCQUE2QjtJQUM3QiwwQkFBMEI7SUFDMUIsMkJBQTJCO0lBQzNCLGVBQWU7SUFDZiw2QkFBNkI7SUFDN0IsbUJBQW1CO0lBQ25CLFlBQVk7SUFDWixxQkFBcUI7QUFDekI7O0FBRUE7SUFDSSxtQkFBbUI7QUFDdkI7QUFDQTtJQUNJLGFBQWE7SUFDYixtQkFBbUI7SUFDbkIsOEJBQThCO0lBQzlCLFNBQVM7SUFDVCxpQkFBaUI7SUFDakIsbUJBQW1CO0lBQ25CLHlCQUF5QjtJQUN6QixrQkFBa0I7SUFDbEIsZUFBZTtBQUNuQlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCIvKlxcbiAgICBTYW1lIGFzIGluIHBsb3RseS1jbG91ZCBidXQgd2l0aG91dCB0aGUgcHVibGlzaFxcbiAgICBpbiB0aGUgbmFtZSB0byBhdm9pZCBmdXR1cmUgY29uZmxpY3RzIGlmIGNoYW5nZWRcXG4gICAgdXBzdHJlYW0uXFxuKi9cXG4ucGxvdGx5LWNsb3VkLW1vZGFsLW92ZXJsYXkge1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIGJvdHRvbTogMTAwJTtcXG4gICAgbGVmdDogLTFweDtcXG4gICAgei1pbmRleDogMTAwMDA7XFxufVxcblxcbi5wbG90bHktY2xvdWQtbW9kYWwtY29udGVudCB7XFxuICAgIGJvcmRlci1yYWRpdXM6IDhweDtcXG4gICAgd2lkdGg6IDUyMnB4O1xcbiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2QxZDVkYjtcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4IDRweCAwIDA7XFxuICAgIGJveC1zaGFkb3c6IDAgLTRweCA2cHggcmdiYSgwLCAwLCAwLCAwLjA4KTtcXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcXG59XFxuXFxuLnBsb3RseS1jbG91ZC1tb2RhbC1oZWFkZXIge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIHBhZGRpbmc6IDE2cHggMjBweDtcXG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlNWU1ZTU7XFxuICAgIGJhY2tncm91bmQ6ICNmOWZhZmI7XFxufVxcblxcbi5wbG90bHktY2xvdWQtbW9kYWwtaGVhZGVyIGgzIHtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBjb2xvcjogIzMzMztcXG59XFxuXFxuLnBsb3RseS1jbG91ZC1tb2RhbC1jbG9zZSB7XFxuICAgIGJhY2tncm91bmQ6IG5vbmU7XFxuICAgIGJvcmRlcjogbm9uZTtcXG4gICAgZm9udC1zaXplOiAyNHB4O1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxuICAgIGNvbG9yOiAjNjY2O1xcbiAgICBwYWRkaW5nOiAwO1xcbiAgICB3aWR0aDogMzBweDtcXG4gICAgaGVpZ2h0OiAzMHB4O1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG59XFxuXFxuLnBsb3RseS1jbG91ZC1tb2RhbC1jbG9zZTpob3ZlciB7XFxuICAgIGNvbG9yOiAjMzMzO1xcbn1cXG5cXG4ucGxvdGx5LWNsb3VkLW1vZGFsLWJvZHkge1xcbiAgICBwYWRkaW5nOiAyMHB4O1xcbiAgICBjb2xvcjogYmxhY2sgIWltcG9ydGFudDtcXG4gICAgZm9udC13ZWlnaHQ6IDEwMDtcXG59XFxuYnV0dG9uLnBsb3RseS1jbG91ZC1tb2RhbC1idXR0b24ge1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgZ2FwOiA2cHg7XFxuICAgIHBhZGRpbmc6IDZweCAxMHB4ICFpbXBvcnRhbnQ7XFxuICAgIGJvcmRlci1yYWRpdXM6IDRweCAhaW1wb3J0YW50O1xcbiAgICBmb250LXNpemU6IDEycHggIWltcG9ydGFudDtcXG4gICAgZm9udC13ZWlnaHQ6IDYwMCAhaW1wb3J0YW50O1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xcbiAgICBiYWNrZ3JvdW5kOiAjOGI1Y2Y2O1xcbiAgICBjb2xvcjogd2hpdGU7XFxuICAgIGJvcmRlci1jb2xvcjogIzdjM2FlZDtcXG59XFxuXFxuLnBsb3RseS1jbG91ZC1tb2RhbC1idXR0b246ZGlzYWJsZWQge1xcbiAgICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xcbn1cXG4ucGxvdGx5LWNsb3VkLWNvcHktaW5zdGFsbCB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcXG4gICAgZ2FwOiAxMHB4O1xcbiAgICBwYWRkaW5nOiA4cHggMTBweDtcXG4gICAgYmFja2dyb3VuZDogI2Y5ZmFmYjtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2U1ZTdlYjtcXG4gICAgYm9yZGVyLXJhZGl1czogNnB4O1xcbiAgICBtYXJnaW4tdG9wOiA4cHg7XFxufVxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgLmRhc2gtZGVidWctbWVudV9fdXBncmFkZS10b29sdGlwIGJ1dHRvbixcbi5kYXNoLWRlYnVnLW1lbnVfX3VwZ3JhZGUtdG9vbHRpcCBhIHtcbiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgcGFkZGluZzogMnB4IDVweDtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIGNvbG9yOiAjN2Y0YmM0O1xuICAgIGZvbnQtc2l6ZTogMTBwdDtcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIHNhbnMtc2VyaWYgIWltcG9ydGFudDtcbiAgICBmb250LXdlaWdodDogNTAwO1xuICAgIGxpbmUtaGVpZ2h0OiBub3JtYWw7XG59XG5cbi5kYXNoLWRlYnVnLW1lbnVfX3VwZ3JhZGUtdG9vbHRpcDphZnRlciB7XG4gICAgY29udGVudDogJyAnO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDEwMCU7XG4gICAgbGVmdDogNTAlO1xuICAgIG1hcmdpbi1sZWZ0OiAtNXB4O1xuICAgIGJvcmRlci13aWR0aDogMTBweDtcbiAgICBib3JkZXItc3R5bGU6IHNvbGlkO1xuICAgIGJvcmRlci1jb2xvcjogd2hpdGUgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7XG59XG5cbi5kYXNoLWRlYnVnLW1lbnVfX291dGVyIGJ1dHRvbi5kYXNoLWRlYnVnLW1lbnVfX3VwZ3JhZGUtYnV0dG9uIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjYTE1OWZmMGQ7XG4gICAgYm9yZGVyOiAxcHggc29saWQgIzg2NGFkNDMzO1xuICAgIGNvbG9yOiAjN2Y0YmM0O1xuICAgIG1hcmdpbi1sZWZ0OiAxMHB4O1xuICAgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBzYW5zLXNlcmlmICFpbXBvcnRhbnQ7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGhlaWdodDogMjBweDtcbiAgICBwYWRkaW5nOiAwcHggOHB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgICBmb250LXdlaWdodDogNTAwO1xufVxuXG4uZGFzaC1kZWJ1Zy1tZW51X191cGdyYWRlLWJ1dHRvbjpob3ZlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzg2NGFkNDMzO1xuICAgIGJvcmRlci1jb2xvcjogIzg2NGFkNDMzO1xuICAgIGNvbG9yOiAjN2Y0YmM0O1xufVxuYCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvY29tcG9uZW50cy9lcnJvci9tZW51L1ZlcnNpb25JbmZvLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTs7SUFFSSxpQkFBaUI7SUFDakIsWUFBWTtJQUNaLGdCQUFnQjtJQUNoQixtQkFBbUI7SUFDbkIsY0FBYztJQUNkLGVBQWU7SUFDZixxQkFBcUI7SUFDckIsZUFBZTtJQUNmLGFBQWE7SUFDYiwyQ0FBMkM7SUFDM0MsZ0JBQWdCO0lBQ2hCLG1CQUFtQjtBQUN2Qjs7QUFFQTtJQUNJLFlBQVk7SUFDWixrQkFBa0I7SUFDbEIsU0FBUztJQUNULFNBQVM7SUFDVCxpQkFBaUI7SUFDakIsa0JBQWtCO0lBQ2xCLG1CQUFtQjtJQUNuQix1REFBdUQ7QUFDM0Q7O0FBRUE7SUFDSSwyQkFBMkI7SUFDM0IsMkJBQTJCO0lBQzNCLGNBQWM7SUFDZCxpQkFBaUI7SUFDakIsMkNBQTJDO0lBQzNDLGVBQWU7SUFDZixZQUFZO0lBQ1osZ0JBQWdCO0lBQ2hCLGtCQUFrQjtJQUNsQixnQkFBZ0I7QUFDcEI7O0FBRUE7SUFDSSwyQkFBMkI7SUFDM0IsdUJBQXVCO0lBQ3ZCLGNBQWM7QUFDbEJcIixcInNvdXJjZXNDb250ZW50XCI6W1wiLmRhc2gtZGVidWctbWVudV9fdXBncmFkZS10b29sdGlwIGJ1dHRvbixcXG4uZGFzaC1kZWJ1Zy1tZW51X191cGdyYWRlLXRvb2x0aXAgYSB7XFxuICAgIGJhY2tncm91bmQ6IHdoaXRlO1xcbiAgICBib3JkZXI6IG5vbmU7XFxuICAgIHBhZGRpbmc6IDJweCA1cHg7XFxuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxuICAgIGNvbG9yOiAjN2Y0YmM0O1xcbiAgICBmb250LXNpemU6IDEwcHQ7XFxuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmb250LWZhbWlseTogVmVyZGFuYSwgc2Fucy1zZXJpZiAhaW1wb3J0YW50O1xcbiAgICBmb250LXdlaWdodDogNTAwO1xcbiAgICBsaW5lLWhlaWdodDogbm9ybWFsO1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1tZW51X191cGdyYWRlLXRvb2x0aXA6YWZ0ZXIge1xcbiAgICBjb250ZW50OiAnICc7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgdG9wOiAxMDAlO1xcbiAgICBsZWZ0OiA1MCU7XFxuICAgIG1hcmdpbi1sZWZ0OiAtNXB4O1xcbiAgICBib3JkZXItd2lkdGg6IDEwcHg7XFxuICAgIGJvcmRlci1zdHlsZTogc29saWQ7XFxuICAgIGJvcmRlci1jb2xvcjogd2hpdGUgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX291dGVyIGJ1dHRvbi5kYXNoLWRlYnVnLW1lbnVfX3VwZ3JhZGUtYnV0dG9uIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ExNTlmZjBkO1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjODY0YWQ0MzM7XFxuICAgIGNvbG9yOiAjN2Y0YmM0O1xcbiAgICBtYXJnaW4tbGVmdDogMTBweDtcXG4gICAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIHNhbnMtc2VyaWYgIWltcG9ydGFudDtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbiAgICBoZWlnaHQ6IDIwcHg7XFxuICAgIHBhZGRpbmc6IDBweCA4cHg7XFxuICAgIGJvcmRlci1yYWRpdXM6IDNweDtcXG4gICAgZm9udC13ZWlnaHQ6IDUwMDtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fdXBncmFkZS1idXR0b246aG92ZXIge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjODY0YWQ0MzM7XFxuICAgIGJvcmRlci1jb2xvcjogIzg2NGFkNDMzO1xcbiAgICBjb2xvcjogIzdmNGJjNDtcXG59XFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIlwidXNlIHN0cmljdFwiO1xuXG4vKlxuICBNSVQgTGljZW5zZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxuICBBdXRob3IgVG9iaWFzIEtvcHBlcnMgQHNva3JhXG4qL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoY3NzV2l0aE1hcHBpbmdUb1N0cmluZykge1xuICB2YXIgbGlzdCA9IFtdO1xuXG4gIC8vIHJldHVybiB0aGUgbGlzdCBvZiBtb2R1bGVzIGFzIGNzcyBzdHJpbmdcbiAgbGlzdC50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgdmFyIGNvbnRlbnQgPSBcIlwiO1xuICAgICAgdmFyIG5lZWRMYXllciA9IHR5cGVvZiBpdGVtWzVdICE9PSBcInVuZGVmaW5lZFwiO1xuICAgICAgaWYgKGl0ZW1bNF0pIHtcbiAgICAgICAgY29udGVudCArPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KGl0ZW1bNF0sIFwiKSB7XCIpO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW1bMl0pIHtcbiAgICAgICAgY29udGVudCArPSBcIkBtZWRpYSBcIi5jb25jYXQoaXRlbVsyXSwgXCIge1wiKTtcbiAgICAgIH1cbiAgICAgIGlmIChuZWVkTGF5ZXIpIHtcbiAgICAgICAgY29udGVudCArPSBcIkBsYXllclwiLmNvbmNhdChpdGVtWzVdLmxlbmd0aCA+IDAgPyBcIiBcIi5jb25jYXQoaXRlbVs1XSkgOiBcIlwiLCBcIiB7XCIpO1xuICAgICAgfVxuICAgICAgY29udGVudCArPSBjc3NXaXRoTWFwcGluZ1RvU3RyaW5nKGl0ZW0pO1xuICAgICAgaWYgKG5lZWRMYXllcikge1xuICAgICAgICBjb250ZW50ICs9IFwifVwiO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW1bMl0pIHtcbiAgICAgICAgY29udGVudCArPSBcIn1cIjtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtWzRdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29udGVudDtcbiAgICB9KS5qb2luKFwiXCIpO1xuICB9O1xuXG4gIC8vIGltcG9ydCBhIGxpc3Qgb2YgbW9kdWxlcyBpbnRvIHRoZSBsaXN0XG4gIGxpc3QuaSA9IGZ1bmN0aW9uIGkobW9kdWxlcywgbWVkaWEsIGRlZHVwZSwgc3VwcG9ydHMsIGxheWVyKSB7XG4gICAgaWYgKHR5cGVvZiBtb2R1bGVzID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBtb2R1bGVzID0gW1tudWxsLCBtb2R1bGVzLCB1bmRlZmluZWRdXTtcbiAgICB9XG4gICAgdmFyIGFscmVhZHlJbXBvcnRlZE1vZHVsZXMgPSB7fTtcbiAgICBpZiAoZGVkdXBlKSB7XG4gICAgICBmb3IgKHZhciBrID0gMDsgayA8IHRoaXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgdmFyIGlkID0gdGhpc1trXVswXTtcbiAgICAgICAgaWYgKGlkICE9IG51bGwpIHtcbiAgICAgICAgICBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2lkXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZm9yICh2YXIgX2sgPSAwOyBfayA8IG1vZHVsZXMubGVuZ3RoOyBfaysrKSB7XG4gICAgICB2YXIgaXRlbSA9IFtdLmNvbmNhdChtb2R1bGVzW19rXSk7XG4gICAgICBpZiAoZGVkdXBlICYmIGFscmVhZHlJbXBvcnRlZE1vZHVsZXNbaXRlbVswXV0pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGxheWVyICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaXRlbVs1XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIGl0ZW1bNV0gPSBsYXllcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAbGF5ZXJcIi5jb25jYXQoaXRlbVs1XS5sZW5ndGggPiAwID8gXCIgXCIuY29uY2F0KGl0ZW1bNV0pIDogXCJcIiwgXCIge1wiKS5jb25jYXQoaXRlbVsxXSwgXCJ9XCIpO1xuICAgICAgICAgIGl0ZW1bNV0gPSBsYXllcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG1lZGlhKSB7XG4gICAgICAgIGlmICghaXRlbVsyXSkge1xuICAgICAgICAgIGl0ZW1bMl0gPSBtZWRpYTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAbWVkaWEgXCIuY29uY2F0KGl0ZW1bMl0sIFwiIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzJdID0gbWVkaWE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzdXBwb3J0cykge1xuICAgICAgICBpZiAoIWl0ZW1bNF0pIHtcbiAgICAgICAgICBpdGVtWzRdID0gXCJcIi5jb25jYXQoc3VwcG9ydHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW1bMV0gPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KGl0ZW1bNF0sIFwiKSB7XCIpLmNvbmNhdChpdGVtWzFdLCBcIn1cIik7XG4gICAgICAgICAgaXRlbVs0XSA9IHN1cHBvcnRzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsaXN0LnB1c2goaXRlbSk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gbGlzdDtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgdmFyIGNvbnRlbnQgPSBpdGVtWzFdO1xuICB2YXIgY3NzTWFwcGluZyA9IGl0ZW1bM107XG4gIGlmICghY3NzTWFwcGluZykge1xuICAgIHJldHVybiBjb250ZW50O1xuICB9XG4gIGlmICh0eXBlb2YgYnRvYSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdmFyIGJhc2U2NCA9IGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KGNzc01hcHBpbmcpKSkpO1xuICAgIHZhciBkYXRhID0gXCJzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxcIi5jb25jYXQoYmFzZTY0KTtcbiAgICB2YXIgc291cmNlTWFwcGluZyA9IFwiLyojIFwiLmNvbmNhdChkYXRhLCBcIiAqL1wiKTtcbiAgICByZXR1cm4gW2NvbnRlbnRdLmNvbmNhdChbc291cmNlTWFwcGluZ10pLmpvaW4oXCJcXG5cIik7XG4gIH1cbiAgcmV0dXJuIFtjb250ZW50XS5qb2luKFwiXFxuXCIpO1xufTsiLCIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCJkYWdyZVwiKSk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXCJkYWdyZVwiXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJjeXRvc2NhcGVEYWdyZVwiXSA9IGZhY3RvcnkocmVxdWlyZShcImRhZ3JlXCIpKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJjeXRvc2NhcGVEYWdyZVwiXSA9IGZhY3Rvcnkocm9vdFtcImRhZ3JlXCJdKTtcbn0pKHRoaXMsIGZ1bmN0aW9uKF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzRfXykge1xucmV0dXJuIC8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0aTogbW9kdWxlSWQsXG4vKioqKioqLyBcdFx0XHRsOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubCA9IHRydWU7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4vKioqKioqLyBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4vKioqKioqLyBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4vKioqKioqLyBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuLyoqKioqKi8gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4vKioqKioqLyBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuLyoqKioqKi8gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4vKioqKioqLyBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4vKioqKioqLyBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbi8qKioqKiovIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuLyoqKioqKi8gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbi8qKioqKiovIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4vKioqKioqLyBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuLyoqKioqKi8gXHRcdHJldHVybiBucztcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuLyoqKioqKi8gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuLyoqKioqKi8gXHRcdHJldHVybiBnZXR0ZXI7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcbi8qKioqKiovXG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMCk7XG4vKioqKioqLyB9KVxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIChbXG4vKiAwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciBpbXBsID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTsgLy8gcmVnaXN0ZXJzIHRoZSBleHRlbnNpb24gb24gYSBjeXRvc2NhcGUgbGliIHJlZlxuXG5cbnZhciByZWdpc3RlciA9IGZ1bmN0aW9uIHJlZ2lzdGVyKGN5dG9zY2FwZSkge1xuICBpZiAoIWN5dG9zY2FwZSkge1xuICAgIHJldHVybjtcbiAgfSAvLyBjYW4ndCByZWdpc3RlciBpZiBjeXRvc2NhcGUgdW5zcGVjaWZpZWRcblxuXG4gIGN5dG9zY2FwZSgnbGF5b3V0JywgJ2RhZ3JlJywgaW1wbCk7IC8vIHJlZ2lzdGVyIHdpdGggY3l0b3NjYXBlLmpzXG59O1xuXG5pZiAodHlwZW9mIGN5dG9zY2FwZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgLy8gZXhwb3NlIHRvIGdsb2JhbCBjeXRvc2NhcGUgKGkuZS4gd2luZG93LmN5dG9zY2FwZSlcbiAgcmVnaXN0ZXIoY3l0b3NjYXBlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZWdpc3RlcjtcblxuLyoqKi8gfSksXG4vKiAxICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbmZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiKSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfTsgfSBlbHNlIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9OyB9IHJldHVybiBfdHlwZW9mKG9iaik7IH1cblxudmFyIGlzRnVuY3Rpb24gPSBmdW5jdGlvbiBpc0Z1bmN0aW9uKG8pIHtcbiAgcmV0dXJuIHR5cGVvZiBvID09PSAnZnVuY3Rpb24nO1xufTtcblxudmFyIGRlZmF1bHRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcblxudmFyIGFzc2lnbiA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7XG5cbnZhciBkYWdyZSA9IF9fd2VicGFja19yZXF1aXJlX18oNCk7IC8vIGNvbnN0cnVjdG9yXG4vLyBvcHRpb25zIDogb2JqZWN0IGNvbnRhaW5pbmcgbGF5b3V0IG9wdGlvbnNcblxuXG5mdW5jdGlvbiBEYWdyZUxheW91dChvcHRpb25zKSB7XG4gIHRoaXMub3B0aW9ucyA9IGFzc2lnbih7fSwgZGVmYXVsdHMsIG9wdGlvbnMpO1xufSAvLyBydW5zIHRoZSBsYXlvdXRcblxuXG5EYWdyZUxheW91dC5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgdmFyIGxheW91dCA9IHRoaXM7XG4gIHZhciBjeSA9IG9wdGlvbnMuY3k7IC8vIGN5IGlzIGF1dG9tYXRpY2FsbHkgcG9wdWxhdGVkIGZvciB1cyBpbiB0aGUgY29uc3RydWN0b3JcblxuICB2YXIgZWxlcyA9IG9wdGlvbnMuZWxlcztcblxuICB2YXIgZ2V0VmFsID0gZnVuY3Rpb24gZ2V0VmFsKGVsZSwgdmFsKSB7XG4gICAgcmV0dXJuIGlzRnVuY3Rpb24odmFsKSA/IHZhbC5hcHBseShlbGUsIFtlbGVdKSA6IHZhbDtcbiAgfTtcblxuICB2YXIgYmIgPSBvcHRpb25zLmJvdW5kaW5nQm94IHx8IHtcbiAgICB4MTogMCxcbiAgICB5MTogMCxcbiAgICB3OiBjeS53aWR0aCgpLFxuICAgIGg6IGN5LmhlaWdodCgpXG4gIH07XG5cbiAgaWYgKGJiLngyID09PSB1bmRlZmluZWQpIHtcbiAgICBiYi54MiA9IGJiLngxICsgYmIudztcbiAgfVxuXG4gIGlmIChiYi53ID09PSB1bmRlZmluZWQpIHtcbiAgICBiYi53ID0gYmIueDIgLSBiYi54MTtcbiAgfVxuXG4gIGlmIChiYi55MiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYmIueTIgPSBiYi55MSArIGJiLmg7XG4gIH1cblxuICBpZiAoYmIuaCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYmIuaCA9IGJiLnkyIC0gYmIueTE7XG4gIH1cblxuICB2YXIgZyA9IG5ldyBkYWdyZS5ncmFwaGxpYi5HcmFwaCh7XG4gICAgbXVsdGlncmFwaDogdHJ1ZSxcbiAgICBjb21wb3VuZDogdHJ1ZVxuICB9KTtcbiAgdmFyIGdPYmogPSB7fTtcblxuICB2YXIgc2V0R09iaiA9IGZ1bmN0aW9uIHNldEdPYmoobmFtZSwgdmFsKSB7XG4gICAgaWYgKHZhbCAhPSBudWxsKSB7XG4gICAgICBnT2JqW25hbWVdID0gdmFsO1xuICAgIH1cbiAgfTtcblxuICBzZXRHT2JqKCdub2Rlc2VwJywgb3B0aW9ucy5ub2RlU2VwKTtcbiAgc2V0R09iaignZWRnZXNlcCcsIG9wdGlvbnMuZWRnZVNlcCk7XG4gIHNldEdPYmooJ3JhbmtzZXAnLCBvcHRpb25zLnJhbmtTZXApO1xuICBzZXRHT2JqKCdyYW5rZGlyJywgb3B0aW9ucy5yYW5rRGlyKTtcbiAgc2V0R09iaignYWxpZ24nLCBvcHRpb25zLmFsaWduKTtcbiAgc2V0R09iaigncmFua2VyJywgb3B0aW9ucy5yYW5rZXIpO1xuICBzZXRHT2JqKCdhY3ljbGljZXInLCBvcHRpb25zLmFjeWNsaWNlcik7XG4gIGcuc2V0R3JhcGgoZ09iaik7XG4gIGcuc2V0RGVmYXVsdEVkZ2VMYWJlbChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9KTtcbiAgZy5zZXREZWZhdWx0Tm9kZUxhYmVsKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge307XG4gIH0pOyAvLyBhZGQgbm9kZXMgdG8gZGFncmVcblxuICB2YXIgbm9kZXMgPSBlbGVzLm5vZGVzKCk7XG5cbiAgaWYgKGlzRnVuY3Rpb24ob3B0aW9ucy5zb3J0KSkge1xuICAgIG5vZGVzID0gbm9kZXMuc29ydChvcHRpb25zLnNvcnQpO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBub2RlID0gbm9kZXNbaV07XG4gICAgdmFyIG5iYiA9IG5vZGUubGF5b3V0RGltZW5zaW9ucyhvcHRpb25zKTtcbiAgICBnLnNldE5vZGUobm9kZS5pZCgpLCB7XG4gICAgICB3aWR0aDogbmJiLncsXG4gICAgICBoZWlnaHQ6IG5iYi5oLFxuICAgICAgbmFtZTogbm9kZS5pZCgpXG4gICAgfSk7IC8vIGNvbnNvbGUubG9nKCBnLm5vZGUobm9kZS5pZCgpKSApO1xuICB9IC8vIHNldCBjb21wb3VuZCBwYXJlbnRzXG5cblxuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbm9kZXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgdmFyIF9ub2RlID0gbm9kZXNbX2ldO1xuXG4gICAgaWYgKF9ub2RlLmlzQ2hpbGQoKSkge1xuICAgICAgZy5zZXRQYXJlbnQoX25vZGUuaWQoKSwgX25vZGUucGFyZW50KCkuaWQoKSk7XG4gICAgfVxuICB9IC8vIGFkZCBlZGdlcyB0byBkYWdyZVxuXG5cbiAgdmFyIGVkZ2VzID0gZWxlcy5lZGdlcygpLnN0ZEZpbHRlcihmdW5jdGlvbiAoZWRnZSkge1xuICAgIHJldHVybiAhZWRnZS5zb3VyY2UoKS5pc1BhcmVudCgpICYmICFlZGdlLnRhcmdldCgpLmlzUGFyZW50KCk7IC8vIGRhZ3JlIGNhbid0IGhhbmRsZSBlZGdlcyBvbiBjb21wb3VuZCBub2Rlc1xuICB9KTtcblxuICBpZiAoaXNGdW5jdGlvbihvcHRpb25zLnNvcnQpKSB7XG4gICAgZWRnZXMgPSBlZGdlcy5zb3J0KG9wdGlvbnMuc29ydCk7XG4gIH1cblxuICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBlZGdlcy5sZW5ndGg7IF9pMisrKSB7XG4gICAgdmFyIGVkZ2UgPSBlZGdlc1tfaTJdO1xuICAgIGcuc2V0RWRnZShlZGdlLnNvdXJjZSgpLmlkKCksIGVkZ2UudGFyZ2V0KCkuaWQoKSwge1xuICAgICAgbWlubGVuOiBnZXRWYWwoZWRnZSwgb3B0aW9ucy5taW5MZW4pLFxuICAgICAgd2VpZ2h0OiBnZXRWYWwoZWRnZSwgb3B0aW9ucy5lZGdlV2VpZ2h0KSxcbiAgICAgIG5hbWU6IGVkZ2UuaWQoKVxuICAgIH0sIGVkZ2UuaWQoKSk7IC8vIGNvbnNvbGUubG9nKCBnLmVkZ2UoZWRnZS5zb3VyY2UoKS5pZCgpLCBlZGdlLnRhcmdldCgpLmlkKCksIGVkZ2UuaWQoKSkgKTtcbiAgfVxuXG4gIGRhZ3JlLmxheW91dChnKTtcbiAgdmFyIGdOb2RlSWRzID0gZy5ub2RlcygpO1xuXG4gIGZvciAodmFyIF9pMyA9IDA7IF9pMyA8IGdOb2RlSWRzLmxlbmd0aDsgX2kzKyspIHtcbiAgICB2YXIgaWQgPSBnTm9kZUlkc1tfaTNdO1xuICAgIHZhciBuID0gZy5ub2RlKGlkKTtcbiAgICBjeS5nZXRFbGVtZW50QnlJZChpZCkuc2NyYXRjaCgpLmRhZ3JlID0gbjtcbiAgfVxuXG4gIHZhciBkYWdyZUJCO1xuXG4gIGlmIChvcHRpb25zLmJvdW5kaW5nQm94KSB7XG4gICAgZGFncmVCQiA9IHtcbiAgICAgIHgxOiBJbmZpbml0eSxcbiAgICAgIHgyOiAtSW5maW5pdHksXG4gICAgICB5MTogSW5maW5pdHksXG4gICAgICB5MjogLUluZmluaXR5XG4gICAgfTtcbiAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICB2YXIgZE1vZGVsID0gbm9kZS5zY3JhdGNoKCkuZGFncmU7XG4gICAgICBkYWdyZUJCLngxID0gTWF0aC5taW4oZGFncmVCQi54MSwgZE1vZGVsLngpO1xuICAgICAgZGFncmVCQi54MiA9IE1hdGgubWF4KGRhZ3JlQkIueDIsIGRNb2RlbC54KTtcbiAgICAgIGRhZ3JlQkIueTEgPSBNYXRoLm1pbihkYWdyZUJCLnkxLCBkTW9kZWwueSk7XG4gICAgICBkYWdyZUJCLnkyID0gTWF0aC5tYXgoZGFncmVCQi55MiwgZE1vZGVsLnkpO1xuICAgIH0pO1xuICAgIGRhZ3JlQkIudyA9IGRhZ3JlQkIueDIgLSBkYWdyZUJCLngxO1xuICAgIGRhZ3JlQkIuaCA9IGRhZ3JlQkIueTIgLSBkYWdyZUJCLnkxO1xuICB9IGVsc2Uge1xuICAgIGRhZ3JlQkIgPSBiYjtcbiAgfVxuXG4gIHZhciBjb25zdHJhaW5Qb3MgPSBmdW5jdGlvbiBjb25zdHJhaW5Qb3MocCkge1xuICAgIGlmIChvcHRpb25zLmJvdW5kaW5nQm94KSB7XG4gICAgICB2YXIgeFBjdCA9IGRhZ3JlQkIudyA9PT0gMCA/IDAgOiAocC54IC0gZGFncmVCQi54MSkgLyBkYWdyZUJCLnc7XG4gICAgICB2YXIgeVBjdCA9IGRhZ3JlQkIuaCA9PT0gMCA/IDAgOiAocC55IC0gZGFncmVCQi55MSkgLyBkYWdyZUJCLmg7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4OiBiYi54MSArIHhQY3QgKiBiYi53LFxuICAgICAgICB5OiBiYi55MSArIHlQY3QgKiBiYi5oXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcDtcbiAgICB9XG4gIH07XG5cbiAgbm9kZXMubGF5b3V0UG9zaXRpb25zKGxheW91dCwgb3B0aW9ucywgZnVuY3Rpb24gKGVsZSkge1xuICAgIGVsZSA9IF90eXBlb2YoZWxlKSA9PT0gXCJvYmplY3RcIiA/IGVsZSA6IHRoaXM7XG4gICAgdmFyIGRNb2RlbCA9IGVsZS5zY3JhdGNoKCkuZGFncmU7XG4gICAgcmV0dXJuIGNvbnN0cmFpblBvcyh7XG4gICAgICB4OiBkTW9kZWwueCxcbiAgICAgIHk6IGRNb2RlbC55XG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gRGFncmVMYXlvdXQ7XG5cbi8qKiovIH0pLFxuLyogMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG52YXIgZGVmYXVsdHMgPSB7XG4gIC8vIGRhZ3JlIGFsZ28gb3B0aW9ucywgdXNlcyBkZWZhdWx0IHZhbHVlIG9uIHVuZGVmaW5lZFxuICBub2RlU2VwOiB1bmRlZmluZWQsXG4gIC8vIHRoZSBzZXBhcmF0aW9uIGJldHdlZW4gYWRqYWNlbnQgbm9kZXMgaW4gdGhlIHNhbWUgcmFua1xuICBlZGdlU2VwOiB1bmRlZmluZWQsXG4gIC8vIHRoZSBzZXBhcmF0aW9uIGJldHdlZW4gYWRqYWNlbnQgZWRnZXMgaW4gdGhlIHNhbWUgcmFua1xuICByYW5rU2VwOiB1bmRlZmluZWQsXG4gIC8vIHRoZSBzZXBhcmF0aW9uIGJldHdlZW4gYWRqYWNlbnQgbm9kZXMgaW4gdGhlIHNhbWUgcmFua1xuICByYW5rRGlyOiB1bmRlZmluZWQsXG4gIC8vICdUQicgZm9yIHRvcCB0byBib3R0b20gZmxvdywgJ0xSJyBmb3IgbGVmdCB0byByaWdodCxcbiAgYWxpZ246IHVuZGVmaW5lZCxcbiAgLy8gYWxpZ25tZW50IGZvciByYW5rIG5vZGVzLiBDYW4gYmUgJ1VMJywgJ1VSJywgJ0RMJywgb3IgJ0RSJywgd2hlcmUgVSA9IHVwLCBEID0gZG93biwgTCA9IGxlZnQsIGFuZCBSID0gcmlnaHRcbiAgYWN5Y2xpY2VyOiB1bmRlZmluZWQsXG4gIC8vIElmIHNldCB0byAnZ3JlZWR5JywgdXNlcyBhIGdyZWVkeSBoZXVyaXN0aWMgZm9yIGZpbmRpbmcgYSBmZWVkYmFjayBhcmMgc2V0IGZvciBhIGdyYXBoLlxuICAvLyBBIGZlZWRiYWNrIGFyYyBzZXQgaXMgYSBzZXQgb2YgZWRnZXMgdGhhdCBjYW4gYmUgcmVtb3ZlZCB0byBtYWtlIGEgZ3JhcGggYWN5Y2xpYy5cbiAgcmFua2VyOiB1bmRlZmluZWQsXG4gIC8vIFR5cGUgb2YgYWxnb3JpdGhtIHRvIGFzc2lnbnMgYSByYW5rIHRvIGVhY2ggbm9kZSBpbiB0aGUgaW5wdXQgZ3JhcGguXG4gIC8vIFBvc3NpYmxlIHZhbHVlczogbmV0d29yay1zaW1wbGV4LCB0aWdodC10cmVlIG9yIGxvbmdlc3QtcGF0aFxuICBtaW5MZW46IGZ1bmN0aW9uIG1pbkxlbihlZGdlKSB7XG4gICAgcmV0dXJuIDE7XG4gIH0sXG4gIC8vIG51bWJlciBvZiByYW5rcyB0byBrZWVwIGJldHdlZW4gdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IG9mIHRoZSBlZGdlXG4gIGVkZ2VXZWlnaHQ6IGZ1bmN0aW9uIGVkZ2VXZWlnaHQoZWRnZSkge1xuICAgIHJldHVybiAxO1xuICB9LFxuICAvLyBoaWdoZXIgd2VpZ2h0IGVkZ2VzIGFyZSBnZW5lcmFsbHkgbWFkZSBzaG9ydGVyIGFuZCBzdHJhaWdodGVyIHRoYW4gbG93ZXIgd2VpZ2h0IGVkZ2VzXG4gIC8vIGdlbmVyYWwgbGF5b3V0IG9wdGlvbnNcbiAgZml0OiB0cnVlLFxuICAvLyB3aGV0aGVyIHRvIGZpdCB0byB2aWV3cG9ydFxuICBwYWRkaW5nOiAzMCxcbiAgLy8gZml0IHBhZGRpbmdcbiAgc3BhY2luZ0ZhY3RvcjogdW5kZWZpbmVkLFxuICAvLyBBcHBsaWVzIGEgbXVsdGlwbGljYXRpdmUgZmFjdG9yICg+MCkgdG8gZXhwYW5kIG9yIGNvbXByZXNzIHRoZSBvdmVyYWxsIGFyZWEgdGhhdCB0aGUgbm9kZXMgdGFrZSB1cFxuICBub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHM6IGZhbHNlLFxuICAvLyB3aGV0aGVyIGxhYmVscyBzaG91bGQgYmUgaW5jbHVkZWQgaW4gZGV0ZXJtaW5pbmcgdGhlIHNwYWNlIHVzZWQgYnkgYSBub2RlXG4gIGFuaW1hdGU6IGZhbHNlLFxuICAvLyB3aGV0aGVyIHRvIHRyYW5zaXRpb24gdGhlIG5vZGUgcG9zaXRpb25zXG4gIGFuaW1hdGVGaWx0ZXI6IGZ1bmN0aW9uIGFuaW1hdGVGaWx0ZXIobm9kZSwgaSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICAvLyB3aGV0aGVyIHRvIGFuaW1hdGUgc3BlY2lmaWMgbm9kZXMgd2hlbiBhbmltYXRpb24gaXMgb247IG5vbi1hbmltYXRlZCBub2RlcyBpbW1lZGlhdGVseSBnbyB0byB0aGVpciBmaW5hbCBwb3NpdGlvbnNcbiAgYW5pbWF0aW9uRHVyYXRpb246IDUwMCxcbiAgLy8gZHVyYXRpb24gb2YgYW5pbWF0aW9uIGluIG1zIGlmIGVuYWJsZWRcbiAgYW5pbWF0aW9uRWFzaW5nOiB1bmRlZmluZWQsXG4gIC8vIGVhc2luZyBvZiBhbmltYXRpb24gaWYgZW5hYmxlZFxuICBib3VuZGluZ0JveDogdW5kZWZpbmVkLFxuICAvLyBjb25zdHJhaW4gbGF5b3V0IGJvdW5kczsgeyB4MSwgeTEsIHgyLCB5MiB9IG9yIHsgeDEsIHkxLCB3LCBoIH1cbiAgdHJhbnNmb3JtOiBmdW5jdGlvbiB0cmFuc2Zvcm0obm9kZSwgcG9zKSB7XG4gICAgcmV0dXJuIHBvcztcbiAgfSxcbiAgLy8gYSBmdW5jdGlvbiB0aGF0IGFwcGxpZXMgYSB0cmFuc2Zvcm0gdG8gdGhlIGZpbmFsIG5vZGUgcG9zaXRpb25cbiAgcmVhZHk6IGZ1bmN0aW9uIHJlYWR5KCkge30sXG4gIC8vIG9uIGxheW91dHJlYWR5XG4gIHNvcnQ6IHVuZGVmaW5lZCxcbiAgLy8gYSBzb3J0aW5nIGZ1bmN0aW9uIHRvIG9yZGVyIHRoZSBub2RlcyBhbmQgZWRnZXM7IGUuZy4gZnVuY3Rpb24oYSwgYil7IHJldHVybiBhLmRhdGEoJ3dlaWdodCcpIC0gYi5kYXRhKCd3ZWlnaHQnKSB9XG4gIC8vIGJlY2F1c2UgY3l0b3NjYXBlIGRhZ3JlIGNyZWF0ZXMgYSBkaXJlY3RlZCBncmFwaCwgYW5kIGRpcmVjdGVkIGdyYXBocyB1c2UgdGhlIG5vZGUgb3JkZXIgYXMgYSB0aWUgYnJlYWtlciB3aGVuXG4gIC8vIGRlZmluaW5nIHRoZSB0b3BvbG9neSBvZiBhIGdyYXBoLCB0aGlzIHNvcnQgZnVuY3Rpb24gY2FuIGhlbHAgZW5zdXJlIHRoZSBjb3JyZWN0IG9yZGVyIG9mIHRoZSBub2Rlcy9lZGdlcy5cbiAgLy8gdGhpcyBmZWF0dXJlIGlzIG1vc3QgdXNlZnVsIHdoZW4gYWRkaW5nIGFuZCByZW1vdmluZyB0aGUgc2FtZSBub2RlcyBhbmQgZWRnZXMgbXVsdGlwbGUgdGltZXMgaW4gYSBncmFwaC5cbiAgc3RvcDogZnVuY3Rpb24gc3RvcCgpIHt9IC8vIG9uIGxheW91dHN0b3BcblxufTtcbm1vZHVsZS5leHBvcnRzID0gZGVmYXVsdHM7XG5cbi8qKiovIH0pLFxuLyogMyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG4vLyBTaW1wbGUsIGludGVybmFsIE9iamVjdC5hc3NpZ24oKSBwb2x5ZmlsbCBmb3Igb3B0aW9ucyBvYmplY3RzIGV0Yy5cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmFzc2lnbiAhPSBudWxsID8gT2JqZWN0LmFzc2lnbi5iaW5kKE9iamVjdCkgOiBmdW5jdGlvbiAodGd0KSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBzcmNzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBzcmNzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHNyY3MuZm9yRWFjaChmdW5jdGlvbiAoc3JjKSB7XG4gICAgT2JqZWN0LmtleXMoc3JjKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgICByZXR1cm4gdGd0W2tdID0gc3JjW2tdO1xuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIHRndDtcbn07XG5cbi8qKiovIH0pLFxuLyogNCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzRfXztcblxuLyoqKi8gfSlcbi8qKioqKiovIF0pO1xufSk7IiwiLypcbkNvcHlyaWdodCAoYykgMjAxMi0yMDE0IENocmlzIFBldHRpdHRcblxuUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxub2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xudG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG5mdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuXG5UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG5BVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG5MSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuVEhFIFNPRlRXQVJFLlxuKi9cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdyYXBobGliOiByZXF1aXJlKFwiLi9saWIvZ3JhcGhsaWJcIiksXG5cbiAgbGF5b3V0OiByZXF1aXJlKFwiLi9saWIvbGF5b3V0XCIpLFxuICBkZWJ1ZzogcmVxdWlyZShcIi4vbGliL2RlYnVnXCIpLFxuICB1dGlsOiB7XG4gICAgdGltZTogcmVxdWlyZShcIi4vbGliL3V0aWxcIikudGltZSxcbiAgICBub3RpbWU6IHJlcXVpcmUoXCIuL2xpYi91dGlsXCIpLm5vdGltZVxuICB9LFxuICB2ZXJzaW9uOiByZXF1aXJlKFwiLi9saWIvdmVyc2lvblwiKVxufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuL2xvZGFzaFwiKTtcbnZhciBncmVlZHlGQVMgPSByZXF1aXJlKFwiLi9ncmVlZHktZmFzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgcnVuOiBydW4sXG4gIHVuZG86IHVuZG9cbn07XG5cbmZ1bmN0aW9uIHJ1bihnKSB7XG4gIHZhciBmYXMgPSAoZy5ncmFwaCgpLmFjeWNsaWNlciA9PT0gXCJncmVlZHlcIlxuICAgID8gZ3JlZWR5RkFTKGcsIHdlaWdodEZuKGcpKVxuICAgIDogZGZzRkFTKGcpKTtcbiAgXy5mb3JFYWNoKGZhcywgZnVuY3Rpb24oZSkge1xuICAgIHZhciBsYWJlbCA9IGcuZWRnZShlKTtcbiAgICBnLnJlbW92ZUVkZ2UoZSk7XG4gICAgbGFiZWwuZm9yd2FyZE5hbWUgPSBlLm5hbWU7XG4gICAgbGFiZWwucmV2ZXJzZWQgPSB0cnVlO1xuICAgIGcuc2V0RWRnZShlLncsIGUudiwgbGFiZWwsIF8udW5pcXVlSWQoXCJyZXZcIikpO1xuICB9KTtcblxuICBmdW5jdGlvbiB3ZWlnaHRGbihnKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGUpIHtcbiAgICAgIHJldHVybiBnLmVkZ2UoZSkud2VpZ2h0O1xuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gZGZzRkFTKGcpIHtcbiAgdmFyIGZhcyA9IFtdO1xuICB2YXIgc3RhY2sgPSB7fTtcbiAgdmFyIHZpc2l0ZWQgPSB7fTtcblxuICBmdW5jdGlvbiBkZnModikge1xuICAgIGlmIChfLmhhcyh2aXNpdGVkLCB2KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2aXNpdGVkW3ZdID0gdHJ1ZTtcbiAgICBzdGFja1t2XSA9IHRydWU7XG4gICAgXy5mb3JFYWNoKGcub3V0RWRnZXModiksIGZ1bmN0aW9uKGUpIHtcbiAgICAgIGlmIChfLmhhcyhzdGFjaywgZS53KSkge1xuICAgICAgICBmYXMucHVzaChlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRmcyhlLncpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGRlbGV0ZSBzdGFja1t2XTtcbiAgfVxuXG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGRmcyk7XG4gIHJldHVybiBmYXM7XG59XG5cbmZ1bmN0aW9uIHVuZG8oZykge1xuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIGxhYmVsID0gZy5lZGdlKGUpO1xuICAgIGlmIChsYWJlbC5yZXZlcnNlZCkge1xuICAgICAgZy5yZW1vdmVFZGdlKGUpO1xuXG4gICAgICB2YXIgZm9yd2FyZE5hbWUgPSBsYWJlbC5mb3J3YXJkTmFtZTtcbiAgICAgIGRlbGV0ZSBsYWJlbC5yZXZlcnNlZDtcbiAgICAgIGRlbGV0ZSBsYWJlbC5mb3J3YXJkTmFtZTtcbiAgICAgIGcuc2V0RWRnZShlLncsIGUudiwgbGFiZWwsIGZvcndhcmROYW1lKTtcbiAgICB9XG4gIH0pO1xufVxuIiwidmFyIF8gPSByZXF1aXJlKFwiLi9sb2Rhc2hcIik7XG52YXIgdXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gYWRkQm9yZGVyU2VnbWVudHM7XG5cbmZ1bmN0aW9uIGFkZEJvcmRlclNlZ21lbnRzKGcpIHtcbiAgZnVuY3Rpb24gZGZzKHYpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBnLmNoaWxkcmVuKHYpO1xuICAgIHZhciBub2RlID0gZy5ub2RlKHYpO1xuICAgIGlmIChjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgIF8uZm9yRWFjaChjaGlsZHJlbiwgZGZzKTtcbiAgICB9XG5cbiAgICBpZiAoXy5oYXMobm9kZSwgXCJtaW5SYW5rXCIpKSB7XG4gICAgICBub2RlLmJvcmRlckxlZnQgPSBbXTtcbiAgICAgIG5vZGUuYm9yZGVyUmlnaHQgPSBbXTtcbiAgICAgIGZvciAodmFyIHJhbmsgPSBub2RlLm1pblJhbmssIG1heFJhbmsgPSBub2RlLm1heFJhbmsgKyAxO1xuICAgICAgICByYW5rIDwgbWF4UmFuaztcbiAgICAgICAgKytyYW5rKSB7XG4gICAgICAgIGFkZEJvcmRlck5vZGUoZywgXCJib3JkZXJMZWZ0XCIsIFwiX2JsXCIsIHYsIG5vZGUsIHJhbmspO1xuICAgICAgICBhZGRCb3JkZXJOb2RlKGcsIFwiYm9yZGVyUmlnaHRcIiwgXCJfYnJcIiwgdiwgbm9kZSwgcmFuayk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgXy5mb3JFYWNoKGcuY2hpbGRyZW4oKSwgZGZzKTtcbn1cblxuZnVuY3Rpb24gYWRkQm9yZGVyTm9kZShnLCBwcm9wLCBwcmVmaXgsIHNnLCBzZ05vZGUsIHJhbmspIHtcbiAgdmFyIGxhYmVsID0geyB3aWR0aDogMCwgaGVpZ2h0OiAwLCByYW5rOiByYW5rLCBib3JkZXJUeXBlOiBwcm9wIH07XG4gIHZhciBwcmV2ID0gc2dOb2RlW3Byb3BdW3JhbmsgLSAxXTtcbiAgdmFyIGN1cnIgPSB1dGlsLmFkZER1bW15Tm9kZShnLCBcImJvcmRlclwiLCBsYWJlbCwgcHJlZml4KTtcbiAgc2dOb2RlW3Byb3BdW3JhbmtdID0gY3VycjtcbiAgZy5zZXRQYXJlbnQoY3Vyciwgc2cpO1xuICBpZiAocHJldikge1xuICAgIGcuc2V0RWRnZShwcmV2LCBjdXJyLCB7IHdlaWdodDogMSB9KTtcbiAgfVxufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfID0gcmVxdWlyZShcIi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgYWRqdXN0OiBhZGp1c3QsXG4gIHVuZG86IHVuZG9cbn07XG5cbmZ1bmN0aW9uIGFkanVzdChnKSB7XG4gIHZhciByYW5rRGlyID0gZy5ncmFwaCgpLnJhbmtkaXIudG9Mb3dlckNhc2UoKTtcbiAgaWYgKHJhbmtEaXIgPT09IFwibHJcIiB8fCByYW5rRGlyID09PSBcInJsXCIpIHtcbiAgICBzd2FwV2lkdGhIZWlnaHQoZyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdW5kbyhnKSB7XG4gIHZhciByYW5rRGlyID0gZy5ncmFwaCgpLnJhbmtkaXIudG9Mb3dlckNhc2UoKTtcbiAgaWYgKHJhbmtEaXIgPT09IFwiYnRcIiB8fCByYW5rRGlyID09PSBcInJsXCIpIHtcbiAgICByZXZlcnNlWShnKTtcbiAgfVxuXG4gIGlmIChyYW5rRGlyID09PSBcImxyXCIgfHwgcmFua0RpciA9PT0gXCJybFwiKSB7XG4gICAgc3dhcFhZKGcpO1xuICAgIHN3YXBXaWR0aEhlaWdodChnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzd2FwV2lkdGhIZWlnaHQoZykge1xuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7IHN3YXBXaWR0aEhlaWdodE9uZShnLm5vZGUodikpOyB9KTtcbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkgeyBzd2FwV2lkdGhIZWlnaHRPbmUoZy5lZGdlKGUpKTsgfSk7XG59XG5cbmZ1bmN0aW9uIHN3YXBXaWR0aEhlaWdodE9uZShhdHRycykge1xuICB2YXIgdyA9IGF0dHJzLndpZHRoO1xuICBhdHRycy53aWR0aCA9IGF0dHJzLmhlaWdodDtcbiAgYXR0cnMuaGVpZ2h0ID0gdztcbn1cblxuZnVuY3Rpb24gcmV2ZXJzZVkoZykge1xuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7IHJldmVyc2VZT25lKGcubm9kZSh2KSk7IH0pO1xuXG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZWRnZSA9IGcuZWRnZShlKTtcbiAgICBfLmZvckVhY2goZWRnZS5wb2ludHMsIHJldmVyc2VZT25lKTtcbiAgICBpZiAoXy5oYXMoZWRnZSwgXCJ5XCIpKSB7XG4gICAgICByZXZlcnNlWU9uZShlZGdlKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZXZlcnNlWU9uZShhdHRycykge1xuICBhdHRycy55ID0gLWF0dHJzLnk7XG59XG5cbmZ1bmN0aW9uIHN3YXBYWShnKSB7XG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHsgc3dhcFhZT25lKGcubm9kZSh2KSk7IH0pO1xuXG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZWRnZSA9IGcuZWRnZShlKTtcbiAgICBfLmZvckVhY2goZWRnZS5wb2ludHMsIHN3YXBYWU9uZSk7XG4gICAgaWYgKF8uaGFzKGVkZ2UsIFwieFwiKSkge1xuICAgICAgc3dhcFhZT25lKGVkZ2UpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHN3YXBYWU9uZShhdHRycykge1xuICB2YXIgeCA9IGF0dHJzLng7XG4gIGF0dHJzLnggPSBhdHRycy55O1xuICBhdHRycy55ID0geDtcbn1cbiIsIi8qXG4gKiBTaW1wbGUgZG91Ymx5IGxpbmtlZCBsaXN0IGltcGxlbWVudGF0aW9uIGRlcml2ZWQgZnJvbSBDb3JtZW4sIGV0IGFsLixcbiAqIFwiSW50cm9kdWN0aW9uIHRvIEFsZ29yaXRobXNcIi5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IExpc3Q7XG5cbmZ1bmN0aW9uIExpc3QoKSB7XG4gIHZhciBzZW50aW5lbCA9IHt9O1xuICBzZW50aW5lbC5fbmV4dCA9IHNlbnRpbmVsLl9wcmV2ID0gc2VudGluZWw7XG4gIHRoaXMuX3NlbnRpbmVsID0gc2VudGluZWw7XG59XG5cbkxpc3QucHJvdG90eXBlLmRlcXVldWUgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHNlbnRpbmVsID0gdGhpcy5fc2VudGluZWw7XG4gIHZhciBlbnRyeSA9IHNlbnRpbmVsLl9wcmV2O1xuICBpZiAoZW50cnkgIT09IHNlbnRpbmVsKSB7XG4gICAgdW5saW5rKGVudHJ5KTtcbiAgICByZXR1cm4gZW50cnk7XG4gIH1cbn07XG5cbkxpc3QucHJvdG90eXBlLmVucXVldWUgPSBmdW5jdGlvbihlbnRyeSkge1xuICB2YXIgc2VudGluZWwgPSB0aGlzLl9zZW50aW5lbDtcbiAgaWYgKGVudHJ5Ll9wcmV2ICYmIGVudHJ5Ll9uZXh0KSB7XG4gICAgdW5saW5rKGVudHJ5KTtcbiAgfVxuICBlbnRyeS5fbmV4dCA9IHNlbnRpbmVsLl9uZXh0O1xuICBzZW50aW5lbC5fbmV4dC5fcHJldiA9IGVudHJ5O1xuICBzZW50aW5lbC5fbmV4dCA9IGVudHJ5O1xuICBlbnRyeS5fcHJldiA9IHNlbnRpbmVsO1xufTtcblxuTGlzdC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHN0cnMgPSBbXTtcbiAgdmFyIHNlbnRpbmVsID0gdGhpcy5fc2VudGluZWw7XG4gIHZhciBjdXJyID0gc2VudGluZWwuX3ByZXY7XG4gIHdoaWxlIChjdXJyICE9PSBzZW50aW5lbCkge1xuICAgIHN0cnMucHVzaChKU09OLnN0cmluZ2lmeShjdXJyLCBmaWx0ZXJPdXRMaW5rcykpO1xuICAgIGN1cnIgPSBjdXJyLl9wcmV2O1xuICB9XG4gIHJldHVybiBcIltcIiArIHN0cnMuam9pbihcIiwgXCIpICsgXCJdXCI7XG59O1xuXG5mdW5jdGlvbiB1bmxpbmsoZW50cnkpIHtcbiAgZW50cnkuX3ByZXYuX25leHQgPSBlbnRyeS5fbmV4dDtcbiAgZW50cnkuX25leHQuX3ByZXYgPSBlbnRyeS5fcHJldjtcbiAgZGVsZXRlIGVudHJ5Ll9uZXh0O1xuICBkZWxldGUgZW50cnkuX3ByZXY7XG59XG5cbmZ1bmN0aW9uIGZpbHRlck91dExpbmtzKGssIHYpIHtcbiAgaWYgKGsgIT09IFwiX25leHRcIiAmJiBrICE9PSBcIl9wcmV2XCIpIHtcbiAgICByZXR1cm4gdjtcbiAgfVxufVxuIiwidmFyIF8gPSByZXF1aXJlKFwiLi9sb2Rhc2hcIik7XG52YXIgdXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG52YXIgR3JhcGggPSByZXF1aXJlKFwiLi9ncmFwaGxpYlwiKS5HcmFwaDtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGRlYnVnT3JkZXJpbmc6IGRlYnVnT3JkZXJpbmdcbn07XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5mdW5jdGlvbiBkZWJ1Z09yZGVyaW5nKGcpIHtcbiAgdmFyIGxheWVyTWF0cml4ID0gdXRpbC5idWlsZExheWVyTWF0cml4KGcpO1xuXG4gIHZhciBoID0gbmV3IEdyYXBoKHsgY29tcG91bmQ6IHRydWUsIG11bHRpZ3JhcGg6IHRydWUgfSkuc2V0R3JhcGgoe30pO1xuXG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICBoLnNldE5vZGUodiwgeyBsYWJlbDogdiB9KTtcbiAgICBoLnNldFBhcmVudCh2LCBcImxheWVyXCIgKyBnLm5vZGUodikucmFuayk7XG4gIH0pO1xuXG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICBoLnNldEVkZ2UoZS52LCBlLncsIHt9LCBlLm5hbWUpO1xuICB9KTtcblxuICBfLmZvckVhY2gobGF5ZXJNYXRyaXgsIGZ1bmN0aW9uKGxheWVyLCBpKSB7XG4gICAgdmFyIGxheWVyViA9IFwibGF5ZXJcIiArIGk7XG4gICAgaC5zZXROb2RlKGxheWVyViwgeyByYW5rOiBcInNhbWVcIiB9KTtcbiAgICBfLnJlZHVjZShsYXllciwgZnVuY3Rpb24odSwgdikge1xuICAgICAgaC5zZXRFZGdlKHUsIHYsIHsgc3R5bGU6IFwiaW52aXNcIiB9KTtcbiAgICAgIHJldHVybiB2O1xuICAgIH0pO1xuICB9KTtcblxuICByZXR1cm4gaDtcbn1cbiIsIi8qIGdsb2JhbCB3aW5kb3cgKi9cblxudmFyIGdyYXBobGliO1xuXG5pZiAodHlwZW9mIHJlcXVpcmUgPT09IFwiZnVuY3Rpb25cIikge1xuICB0cnkge1xuICAgIGdyYXBobGliID0gcmVxdWlyZShcImdyYXBobGliXCIpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gY29udGludWUgcmVnYXJkbGVzcyBvZiBlcnJvclxuICB9XG59XG5cbmlmICghZ3JhcGhsaWIpIHtcbiAgZ3JhcGhsaWIgPSB3aW5kb3cuZ3JhcGhsaWI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ3JhcGhsaWI7XG4iLCJ2YXIgXyA9IHJlcXVpcmUoXCIuL2xvZGFzaFwiKTtcbnZhciBHcmFwaCA9IHJlcXVpcmUoXCIuL2dyYXBobGliXCIpLkdyYXBoO1xudmFyIExpc3QgPSByZXF1aXJlKFwiLi9kYXRhL2xpc3RcIik7XG5cbi8qXG4gKiBBIGdyZWVkeSBoZXVyaXN0aWMgZm9yIGZpbmRpbmcgYSBmZWVkYmFjayBhcmMgc2V0IGZvciBhIGdyYXBoLiBBIGZlZWRiYWNrXG4gKiBhcmMgc2V0IGlzIGEgc2V0IG9mIGVkZ2VzIHRoYXQgY2FuIGJlIHJlbW92ZWQgdG8gbWFrZSBhIGdyYXBoIGFjeWNsaWMuXG4gKiBUaGUgYWxnb3JpdGhtIGNvbWVzIGZyb206IFAuIEVhZGVzLCBYLiBMaW4sIGFuZCBXLiBGLiBTbXl0aCwgXCJBIGZhc3QgYW5kXG4gKiBlZmZlY3RpdmUgaGV1cmlzdGljIGZvciB0aGUgZmVlZGJhY2sgYXJjIHNldCBwcm9ibGVtLlwiIFRoaXMgaW1wbGVtZW50YXRpb25cbiAqIGFkanVzdHMgdGhhdCBmcm9tIHRoZSBwYXBlciB0byBhbGxvdyBmb3Igd2VpZ2h0ZWQgZWRnZXMuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZ3JlZWR5RkFTO1xuXG52YXIgREVGQVVMVF9XRUlHSFRfRk4gPSBfLmNvbnN0YW50KDEpO1xuXG5mdW5jdGlvbiBncmVlZHlGQVMoZywgd2VpZ2h0Rm4pIHtcbiAgaWYgKGcubm9kZUNvdW50KCkgPD0gMSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICB2YXIgc3RhdGUgPSBidWlsZFN0YXRlKGcsIHdlaWdodEZuIHx8IERFRkFVTFRfV0VJR0hUX0ZOKTtcbiAgdmFyIHJlc3VsdHMgPSBkb0dyZWVkeUZBUyhzdGF0ZS5ncmFwaCwgc3RhdGUuYnVja2V0cywgc3RhdGUuemVyb0lkeCk7XG5cbiAgLy8gRXhwYW5kIG11bHRpLWVkZ2VzXG4gIHJldHVybiBfLmZsYXR0ZW4oXy5tYXAocmVzdWx0cywgZnVuY3Rpb24oZSkge1xuICAgIHJldHVybiBnLm91dEVkZ2VzKGUudiwgZS53KTtcbiAgfSksIHRydWUpO1xufVxuXG5mdW5jdGlvbiBkb0dyZWVkeUZBUyhnLCBidWNrZXRzLCB6ZXJvSWR4KSB7XG4gIHZhciByZXN1bHRzID0gW107XG4gIHZhciBzb3VyY2VzID0gYnVja2V0c1tidWNrZXRzLmxlbmd0aCAtIDFdO1xuICB2YXIgc2lua3MgPSBidWNrZXRzWzBdO1xuXG4gIHZhciBlbnRyeTtcbiAgd2hpbGUgKGcubm9kZUNvdW50KCkpIHtcbiAgICB3aGlsZSAoKGVudHJ5ID0gc2lua3MuZGVxdWV1ZSgpKSkgICB7IHJlbW92ZU5vZGUoZywgYnVja2V0cywgemVyb0lkeCwgZW50cnkpOyB9XG4gICAgd2hpbGUgKChlbnRyeSA9IHNvdXJjZXMuZGVxdWV1ZSgpKSkgeyByZW1vdmVOb2RlKGcsIGJ1Y2tldHMsIHplcm9JZHgsIGVudHJ5KTsgfVxuICAgIGlmIChnLm5vZGVDb3VudCgpKSB7XG4gICAgICBmb3IgKHZhciBpID0gYnVja2V0cy5sZW5ndGggLSAyOyBpID4gMDsgLS1pKSB7XG4gICAgICAgIGVudHJ5ID0gYnVja2V0c1tpXS5kZXF1ZXVlKCk7XG4gICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgIHJlc3VsdHMgPSByZXN1bHRzLmNvbmNhdChyZW1vdmVOb2RlKGcsIGJ1Y2tldHMsIHplcm9JZHgsIGVudHJ5LCB0cnVlKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0cztcbn1cblxuZnVuY3Rpb24gcmVtb3ZlTm9kZShnLCBidWNrZXRzLCB6ZXJvSWR4LCBlbnRyeSwgY29sbGVjdFByZWRlY2Vzc29ycykge1xuICB2YXIgcmVzdWx0cyA9IGNvbGxlY3RQcmVkZWNlc3NvcnMgPyBbXSA6IHVuZGVmaW5lZDtcblxuICBfLmZvckVhY2goZy5pbkVkZ2VzKGVudHJ5LnYpLCBmdW5jdGlvbihlZGdlKSB7XG4gICAgdmFyIHdlaWdodCA9IGcuZWRnZShlZGdlKTtcbiAgICB2YXIgdUVudHJ5ID0gZy5ub2RlKGVkZ2Uudik7XG5cbiAgICBpZiAoY29sbGVjdFByZWRlY2Vzc29ycykge1xuICAgICAgcmVzdWx0cy5wdXNoKHsgdjogZWRnZS52LCB3OiBlZGdlLncgfSk7XG4gICAgfVxuXG4gICAgdUVudHJ5Lm91dCAtPSB3ZWlnaHQ7XG4gICAgYXNzaWduQnVja2V0KGJ1Y2tldHMsIHplcm9JZHgsIHVFbnRyeSk7XG4gIH0pO1xuXG4gIF8uZm9yRWFjaChnLm91dEVkZ2VzKGVudHJ5LnYpLCBmdW5jdGlvbihlZGdlKSB7XG4gICAgdmFyIHdlaWdodCA9IGcuZWRnZShlZGdlKTtcbiAgICB2YXIgdyA9IGVkZ2UudztcbiAgICB2YXIgd0VudHJ5ID0gZy5ub2RlKHcpO1xuICAgIHdFbnRyeVtcImluXCJdIC09IHdlaWdodDtcbiAgICBhc3NpZ25CdWNrZXQoYnVja2V0cywgemVyb0lkeCwgd0VudHJ5KTtcbiAgfSk7XG5cbiAgZy5yZW1vdmVOb2RlKGVudHJ5LnYpO1xuXG4gIHJldHVybiByZXN1bHRzO1xufVxuXG5mdW5jdGlvbiBidWlsZFN0YXRlKGcsIHdlaWdodEZuKSB7XG4gIHZhciBmYXNHcmFwaCA9IG5ldyBHcmFwaCgpO1xuICB2YXIgbWF4SW4gPSAwO1xuICB2YXIgbWF4T3V0ID0gMDtcblxuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgZmFzR3JhcGguc2V0Tm9kZSh2LCB7IHY6IHYsIFwiaW5cIjogMCwgb3V0OiAwIH0pO1xuICB9KTtcblxuICAvLyBBZ2dyZWdhdGUgd2VpZ2h0cyBvbiBub2RlcywgYnV0IGFsc28gc3VtIHRoZSB3ZWlnaHRzIGFjcm9zcyBtdWx0aS1lZGdlc1xuICAvLyBpbnRvIGEgc2luZ2xlIGVkZ2UgZm9yIHRoZSBmYXNHcmFwaC5cbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBwcmV2V2VpZ2h0ID0gZmFzR3JhcGguZWRnZShlLnYsIGUudykgfHwgMDtcbiAgICB2YXIgd2VpZ2h0ID0gd2VpZ2h0Rm4oZSk7XG4gICAgdmFyIGVkZ2VXZWlnaHQgPSBwcmV2V2VpZ2h0ICsgd2VpZ2h0O1xuICAgIGZhc0dyYXBoLnNldEVkZ2UoZS52LCBlLncsIGVkZ2VXZWlnaHQpO1xuICAgIG1heE91dCA9IE1hdGgubWF4KG1heE91dCwgZmFzR3JhcGgubm9kZShlLnYpLm91dCArPSB3ZWlnaHQpO1xuICAgIG1heEluICA9IE1hdGgubWF4KG1heEluLCAgZmFzR3JhcGgubm9kZShlLncpW1wiaW5cIl0gICs9IHdlaWdodCk7XG4gIH0pO1xuXG4gIHZhciBidWNrZXRzID0gXy5yYW5nZShtYXhPdXQgKyBtYXhJbiArIDMpLm1hcChmdW5jdGlvbigpIHsgcmV0dXJuIG5ldyBMaXN0KCk7IH0pO1xuICB2YXIgemVyb0lkeCA9IG1heEluICsgMTtcblxuICBfLmZvckVhY2goZmFzR3JhcGgubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIGFzc2lnbkJ1Y2tldChidWNrZXRzLCB6ZXJvSWR4LCBmYXNHcmFwaC5ub2RlKHYpKTtcbiAgfSk7XG5cbiAgcmV0dXJuIHsgZ3JhcGg6IGZhc0dyYXBoLCBidWNrZXRzOiBidWNrZXRzLCB6ZXJvSWR4OiB6ZXJvSWR4IH07XG59XG5cbmZ1bmN0aW9uIGFzc2lnbkJ1Y2tldChidWNrZXRzLCB6ZXJvSWR4LCBlbnRyeSkge1xuICBpZiAoIWVudHJ5Lm91dCkge1xuICAgIGJ1Y2tldHNbMF0uZW5xdWV1ZShlbnRyeSk7XG4gIH0gZWxzZSBpZiAoIWVudHJ5W1wiaW5cIl0pIHtcbiAgICBidWNrZXRzW2J1Y2tldHMubGVuZ3RoIC0gMV0uZW5xdWV1ZShlbnRyeSk7XG4gIH0gZWxzZSB7XG4gICAgYnVja2V0c1tlbnRyeS5vdXQgLSBlbnRyeVtcImluXCJdICsgemVyb0lkeF0uZW5xdWV1ZShlbnRyeSk7XG4gIH1cbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuL2xvZGFzaFwiKTtcbnZhciBhY3ljbGljID0gcmVxdWlyZShcIi4vYWN5Y2xpY1wiKTtcbnZhciBub3JtYWxpemUgPSByZXF1aXJlKFwiLi9ub3JtYWxpemVcIik7XG52YXIgcmFuayA9IHJlcXVpcmUoXCIuL3JhbmtcIik7XG52YXIgbm9ybWFsaXplUmFua3MgPSByZXF1aXJlKFwiLi91dGlsXCIpLm5vcm1hbGl6ZVJhbmtzO1xudmFyIHBhcmVudER1bW15Q2hhaW5zID0gcmVxdWlyZShcIi4vcGFyZW50LWR1bW15LWNoYWluc1wiKTtcbnZhciByZW1vdmVFbXB0eVJhbmtzID0gcmVxdWlyZShcIi4vdXRpbFwiKS5yZW1vdmVFbXB0eVJhbmtzO1xudmFyIG5lc3RpbmdHcmFwaCA9IHJlcXVpcmUoXCIuL25lc3RpbmctZ3JhcGhcIik7XG52YXIgYWRkQm9yZGVyU2VnbWVudHMgPSByZXF1aXJlKFwiLi9hZGQtYm9yZGVyLXNlZ21lbnRzXCIpO1xudmFyIGNvb3JkaW5hdGVTeXN0ZW0gPSByZXF1aXJlKFwiLi9jb29yZGluYXRlLXN5c3RlbVwiKTtcbnZhciBvcmRlciA9IHJlcXVpcmUoXCIuL29yZGVyXCIpO1xudmFyIHBvc2l0aW9uID0gcmVxdWlyZShcIi4vcG9zaXRpb25cIik7XG52YXIgdXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG52YXIgR3JhcGggPSByZXF1aXJlKFwiLi9ncmFwaGxpYlwiKS5HcmFwaDtcblxubW9kdWxlLmV4cG9ydHMgPSBsYXlvdXQ7XG5cbmZ1bmN0aW9uIGxheW91dChnLCBvcHRzKSB7XG4gIHZhciB0aW1lID0gb3B0cyAmJiBvcHRzLmRlYnVnVGltaW5nID8gdXRpbC50aW1lIDogdXRpbC5ub3RpbWU7XG4gIHRpbWUoXCJsYXlvdXRcIiwgZnVuY3Rpb24oKSB7XG4gICAgdmFyIGxheW91dEdyYXBoID0gXG4gICAgICB0aW1lKFwiICBidWlsZExheW91dEdyYXBoXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gYnVpbGRMYXlvdXRHcmFwaChnKTsgfSk7XG4gICAgdGltZShcIiAgcnVuTGF5b3V0XCIsICAgICAgICBmdW5jdGlvbigpIHsgcnVuTGF5b3V0KGxheW91dEdyYXBoLCB0aW1lKTsgfSk7XG4gICAgdGltZShcIiAgdXBkYXRlSW5wdXRHcmFwaFwiLCBmdW5jdGlvbigpIHsgdXBkYXRlSW5wdXRHcmFwaChnLCBsYXlvdXRHcmFwaCk7IH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcnVuTGF5b3V0KGcsIHRpbWUpIHtcbiAgdGltZShcIiAgICBtYWtlU3BhY2VGb3JFZGdlTGFiZWxzXCIsIGZ1bmN0aW9uKCkgeyBtYWtlU3BhY2VGb3JFZGdlTGFiZWxzKGcpOyB9KTtcbiAgdGltZShcIiAgICByZW1vdmVTZWxmRWRnZXNcIiwgICAgICAgIGZ1bmN0aW9uKCkgeyByZW1vdmVTZWxmRWRnZXMoZyk7IH0pO1xuICB0aW1lKFwiICAgIGFjeWNsaWNcIiwgICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7IGFjeWNsaWMucnVuKGcpOyB9KTtcbiAgdGltZShcIiAgICBuZXN0aW5nR3JhcGgucnVuXCIsICAgICAgIGZ1bmN0aW9uKCkgeyBuZXN0aW5nR3JhcGgucnVuKGcpOyB9KTtcbiAgdGltZShcIiAgICByYW5rXCIsICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCkgeyByYW5rKHV0aWwuYXNOb25Db21wb3VuZEdyYXBoKGcpKTsgfSk7XG4gIHRpbWUoXCIgICAgaW5qZWN0RWRnZUxhYmVsUHJveGllc1wiLCBmdW5jdGlvbigpIHsgaW5qZWN0RWRnZUxhYmVsUHJveGllcyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgcmVtb3ZlRW1wdHlSYW5rc1wiLCAgICAgICBmdW5jdGlvbigpIHsgcmVtb3ZlRW1wdHlSYW5rcyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgbmVzdGluZ0dyYXBoLmNsZWFudXBcIiwgICBmdW5jdGlvbigpIHsgbmVzdGluZ0dyYXBoLmNsZWFudXAoZyk7IH0pO1xuICB0aW1lKFwiICAgIG5vcm1hbGl6ZVJhbmtzXCIsICAgICAgICAgZnVuY3Rpb24oKSB7IG5vcm1hbGl6ZVJhbmtzKGcpOyB9KTtcbiAgdGltZShcIiAgICBhc3NpZ25SYW5rTWluTWF4XCIsICAgICAgIGZ1bmN0aW9uKCkgeyBhc3NpZ25SYW5rTWluTWF4KGcpOyB9KTtcbiAgdGltZShcIiAgICByZW1vdmVFZGdlTGFiZWxQcm94aWVzXCIsIGZ1bmN0aW9uKCkgeyByZW1vdmVFZGdlTGFiZWxQcm94aWVzKGcpOyB9KTtcbiAgdGltZShcIiAgICBub3JtYWxpemUucnVuXCIsICAgICAgICAgIGZ1bmN0aW9uKCkgeyBub3JtYWxpemUucnVuKGcpOyB9KTtcbiAgdGltZShcIiAgICBwYXJlbnREdW1teUNoYWluc1wiLCAgICAgIGZ1bmN0aW9uKCkgeyBwYXJlbnREdW1teUNoYWlucyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgYWRkQm9yZGVyU2VnbWVudHNcIiwgICAgICBmdW5jdGlvbigpIHsgYWRkQm9yZGVyU2VnbWVudHMoZyk7IH0pO1xuICB0aW1lKFwiICAgIG9yZGVyXCIsICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7IG9yZGVyKGcpOyB9KTtcbiAgdGltZShcIiAgICBpbnNlcnRTZWxmRWRnZXNcIiwgICAgICAgIGZ1bmN0aW9uKCkgeyBpbnNlcnRTZWxmRWRnZXMoZyk7IH0pO1xuICB0aW1lKFwiICAgIGFkanVzdENvb3JkaW5hdGVTeXN0ZW1cIiwgZnVuY3Rpb24oKSB7IGNvb3JkaW5hdGVTeXN0ZW0uYWRqdXN0KGcpOyB9KTtcbiAgdGltZShcIiAgICBwb3NpdGlvblwiLCAgICAgICAgICAgICAgIGZ1bmN0aW9uKCkgeyBwb3NpdGlvbihnKTsgfSk7XG4gIHRpbWUoXCIgICAgcG9zaXRpb25TZWxmRWRnZXNcIiwgICAgICBmdW5jdGlvbigpIHsgcG9zaXRpb25TZWxmRWRnZXMoZyk7IH0pO1xuICB0aW1lKFwiICAgIHJlbW92ZUJvcmRlck5vZGVzXCIsICAgICAgZnVuY3Rpb24oKSB7IHJlbW92ZUJvcmRlck5vZGVzKGcpOyB9KTtcbiAgdGltZShcIiAgICBub3JtYWxpemUudW5kb1wiLCAgICAgICAgIGZ1bmN0aW9uKCkgeyBub3JtYWxpemUudW5kbyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgZml4dXBFZGdlTGFiZWxDb29yZHNcIiwgICBmdW5jdGlvbigpIHsgZml4dXBFZGdlTGFiZWxDb29yZHMoZyk7IH0pO1xuICB0aW1lKFwiICAgIHVuZG9Db29yZGluYXRlU3lzdGVtXCIsICAgZnVuY3Rpb24oKSB7IGNvb3JkaW5hdGVTeXN0ZW0udW5kbyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgdHJhbnNsYXRlR3JhcGhcIiwgICAgICAgICBmdW5jdGlvbigpIHsgdHJhbnNsYXRlR3JhcGgoZyk7IH0pO1xuICB0aW1lKFwiICAgIGFzc2lnbk5vZGVJbnRlcnNlY3RzXCIsICAgZnVuY3Rpb24oKSB7IGFzc2lnbk5vZGVJbnRlcnNlY3RzKGcpOyB9KTtcbiAgdGltZShcIiAgICByZXZlcnNlUG9pbnRzXCIsICAgICAgICAgIGZ1bmN0aW9uKCkgeyByZXZlcnNlUG9pbnRzRm9yUmV2ZXJzZWRFZGdlcyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgYWN5Y2xpYy51bmRvXCIsICAgICAgICAgICBmdW5jdGlvbigpIHsgYWN5Y2xpYy51bmRvKGcpOyB9KTtcbn1cblxuLypcbiAqIENvcGllcyBmaW5hbCBsYXlvdXQgaW5mb3JtYXRpb24gZnJvbSB0aGUgbGF5b3V0IGdyYXBoIGJhY2sgdG8gdGhlIGlucHV0XG4gKiBncmFwaC4gVGhpcyBwcm9jZXNzIG9ubHkgY29waWVzIHdoaXRlbGlzdGVkIGF0dHJpYnV0ZXMgZnJvbSB0aGUgbGF5b3V0IGdyYXBoXG4gKiB0byB0aGUgaW5wdXQgZ3JhcGgsIHNvIGl0IHNlcnZlcyBhcyBhIGdvb2QgcGxhY2UgdG8gZGV0ZXJtaW5lIHdoYXRcbiAqIGF0dHJpYnV0ZXMgY2FuIGluZmx1ZW5jZSBsYXlvdXQuXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZUlucHV0R3JhcGgoaW5wdXRHcmFwaCwgbGF5b3V0R3JhcGgpIHtcbiAgXy5mb3JFYWNoKGlucHV0R3JhcGgubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHZhciBpbnB1dExhYmVsID0gaW5wdXRHcmFwaC5ub2RlKHYpO1xuICAgIHZhciBsYXlvdXRMYWJlbCA9IGxheW91dEdyYXBoLm5vZGUodik7XG5cbiAgICBpZiAoaW5wdXRMYWJlbCkge1xuICAgICAgaW5wdXRMYWJlbC54ID0gbGF5b3V0TGFiZWwueDtcbiAgICAgIGlucHV0TGFiZWwueSA9IGxheW91dExhYmVsLnk7XG5cbiAgICAgIGlmIChsYXlvdXRHcmFwaC5jaGlsZHJlbih2KS5sZW5ndGgpIHtcbiAgICAgICAgaW5wdXRMYWJlbC53aWR0aCA9IGxheW91dExhYmVsLndpZHRoO1xuICAgICAgICBpbnB1dExhYmVsLmhlaWdodCA9IGxheW91dExhYmVsLmhlaWdodDtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIF8uZm9yRWFjaChpbnB1dEdyYXBoLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgaW5wdXRMYWJlbCA9IGlucHV0R3JhcGguZWRnZShlKTtcbiAgICB2YXIgbGF5b3V0TGFiZWwgPSBsYXlvdXRHcmFwaC5lZGdlKGUpO1xuXG4gICAgaW5wdXRMYWJlbC5wb2ludHMgPSBsYXlvdXRMYWJlbC5wb2ludHM7XG4gICAgaWYgKF8uaGFzKGxheW91dExhYmVsLCBcInhcIikpIHtcbiAgICAgIGlucHV0TGFiZWwueCA9IGxheW91dExhYmVsLng7XG4gICAgICBpbnB1dExhYmVsLnkgPSBsYXlvdXRMYWJlbC55O1xuICAgIH1cbiAgfSk7XG5cbiAgaW5wdXRHcmFwaC5ncmFwaCgpLndpZHRoID0gbGF5b3V0R3JhcGguZ3JhcGgoKS53aWR0aDtcbiAgaW5wdXRHcmFwaC5ncmFwaCgpLmhlaWdodCA9IGxheW91dEdyYXBoLmdyYXBoKCkuaGVpZ2h0O1xufVxuXG52YXIgZ3JhcGhOdW1BdHRycyA9IFtcIm5vZGVzZXBcIiwgXCJlZGdlc2VwXCIsIFwicmFua3NlcFwiLCBcIm1hcmdpbnhcIiwgXCJtYXJnaW55XCJdO1xudmFyIGdyYXBoRGVmYXVsdHMgPSB7IHJhbmtzZXA6IDUwLCBlZGdlc2VwOiAyMCwgbm9kZXNlcDogNTAsIHJhbmtkaXI6IFwidGJcIiB9O1xudmFyIGdyYXBoQXR0cnMgPSBbXCJhY3ljbGljZXJcIiwgXCJyYW5rZXJcIiwgXCJyYW5rZGlyXCIsIFwiYWxpZ25cIl07XG52YXIgbm9kZU51bUF0dHJzID0gW1wid2lkdGhcIiwgXCJoZWlnaHRcIl07XG52YXIgbm9kZURlZmF1bHRzID0geyB3aWR0aDogMCwgaGVpZ2h0OiAwIH07XG52YXIgZWRnZU51bUF0dHJzID0gW1wibWlubGVuXCIsIFwid2VpZ2h0XCIsIFwid2lkdGhcIiwgXCJoZWlnaHRcIiwgXCJsYWJlbG9mZnNldFwiXTtcbnZhciBlZGdlRGVmYXVsdHMgPSB7XG4gIG1pbmxlbjogMSwgd2VpZ2h0OiAxLCB3aWR0aDogMCwgaGVpZ2h0OiAwLFxuICBsYWJlbG9mZnNldDogMTAsIGxhYmVscG9zOiBcInJcIlxufTtcbnZhciBlZGdlQXR0cnMgPSBbXCJsYWJlbHBvc1wiXTtcblxuLypcbiAqIENvbnN0cnVjdHMgYSBuZXcgZ3JhcGggZnJvbSB0aGUgaW5wdXQgZ3JhcGgsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciBsYXlvdXQuXG4gKiBUaGlzIHByb2Nlc3MgY29waWVzIG9ubHkgd2hpdGVsaXN0ZWQgYXR0cmlidXRlcyBmcm9tIHRoZSBpbnB1dCBncmFwaCB0byB0aGVcbiAqIGxheW91dCBncmFwaC4gVGh1cyB0aGlzIGZ1bmN0aW9uIHNlcnZlcyBhcyBhIGdvb2QgcGxhY2UgdG8gZGV0ZXJtaW5lIHdoYXRcbiAqIGF0dHJpYnV0ZXMgY2FuIGluZmx1ZW5jZSBsYXlvdXQuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkTGF5b3V0R3JhcGgoaW5wdXRHcmFwaCkge1xuICB2YXIgZyA9IG5ldyBHcmFwaCh7IG11bHRpZ3JhcGg6IHRydWUsIGNvbXBvdW5kOiB0cnVlIH0pO1xuICB2YXIgZ3JhcGggPSBjYW5vbmljYWxpemUoaW5wdXRHcmFwaC5ncmFwaCgpKTtcblxuICBnLnNldEdyYXBoKF8ubWVyZ2Uoe30sXG4gICAgZ3JhcGhEZWZhdWx0cyxcbiAgICBzZWxlY3ROdW1iZXJBdHRycyhncmFwaCwgZ3JhcGhOdW1BdHRycyksXG4gICAgXy5waWNrKGdyYXBoLCBncmFwaEF0dHJzKSkpO1xuXG4gIF8uZm9yRWFjaChpbnB1dEdyYXBoLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgbm9kZSA9IGNhbm9uaWNhbGl6ZShpbnB1dEdyYXBoLm5vZGUodikpO1xuICAgIGcuc2V0Tm9kZSh2LCBfLmRlZmF1bHRzKHNlbGVjdE51bWJlckF0dHJzKG5vZGUsIG5vZGVOdW1BdHRycyksIG5vZGVEZWZhdWx0cykpO1xuICAgIGcuc2V0UGFyZW50KHYsIGlucHV0R3JhcGgucGFyZW50KHYpKTtcbiAgfSk7XG5cbiAgXy5mb3JFYWNoKGlucHV0R3JhcGguZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBlZGdlID0gY2Fub25pY2FsaXplKGlucHV0R3JhcGguZWRnZShlKSk7XG4gICAgZy5zZXRFZGdlKGUsIF8ubWVyZ2Uoe30sXG4gICAgICBlZGdlRGVmYXVsdHMsXG4gICAgICBzZWxlY3ROdW1iZXJBdHRycyhlZGdlLCBlZGdlTnVtQXR0cnMpLFxuICAgICAgXy5waWNrKGVkZ2UsIGVkZ2VBdHRycykpKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGc7XG59XG5cbi8qXG4gKiBUaGlzIGlkZWEgY29tZXMgZnJvbSB0aGUgR2Fuc25lciBwYXBlcjogdG8gYWNjb3VudCBmb3IgZWRnZSBsYWJlbHMgaW4gb3VyXG4gKiBsYXlvdXQgd2Ugc3BsaXQgZWFjaCByYW5rIGluIGhhbGYgYnkgZG91YmxpbmcgbWlubGVuIGFuZCBoYWx2aW5nIHJhbmtzZXAuXG4gKiBUaGVuIHdlIGNhbiBwbGFjZSBsYWJlbHMgYXQgdGhlc2UgbWlkLXBvaW50cyBiZXR3ZWVuIG5vZGVzLlxuICpcbiAqIFdlIGFsc28gYWRkIHNvbWUgbWluaW1hbCBwYWRkaW5nIHRvIHRoZSB3aWR0aCB0byBwdXNoIHRoZSBsYWJlbCBmb3IgdGhlIGVkZ2VcbiAqIGF3YXkgZnJvbSB0aGUgZWRnZSBpdHNlbGYgYSBiaXQuXG4gKi9cbmZ1bmN0aW9uIG1ha2VTcGFjZUZvckVkZ2VMYWJlbHMoZykge1xuICB2YXIgZ3JhcGggPSBnLmdyYXBoKCk7XG4gIGdyYXBoLnJhbmtzZXAgLz0gMjtcbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBlZGdlID0gZy5lZGdlKGUpO1xuICAgIGVkZ2UubWlubGVuICo9IDI7XG4gICAgaWYgKGVkZ2UubGFiZWxwb3MudG9Mb3dlckNhc2UoKSAhPT0gXCJjXCIpIHtcbiAgICAgIGlmIChncmFwaC5yYW5rZGlyID09PSBcIlRCXCIgfHwgZ3JhcGgucmFua2RpciA9PT0gXCJCVFwiKSB7XG4gICAgICAgIGVkZ2Uud2lkdGggKz0gZWRnZS5sYWJlbG9mZnNldDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVkZ2UuaGVpZ2h0ICs9IGVkZ2UubGFiZWxvZmZzZXQ7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cblxuLypcbiAqIENyZWF0ZXMgdGVtcG9yYXJ5IGR1bW15IG5vZGVzIHRoYXQgY2FwdHVyZSB0aGUgcmFuayBpbiB3aGljaCBlYWNoIGVkZ2Unc1xuICogbGFiZWwgaXMgZ29pbmcgdG8sIGlmIGl0IGhhcyBvbmUgb2Ygbm9uLXplcm8gd2lkdGggYW5kIGhlaWdodC4gV2UgZG8gdGhpc1xuICogc28gdGhhdCB3ZSBjYW4gc2FmZWx5IHJlbW92ZSBlbXB0eSByYW5rcyB3aGlsZSBwcmVzZXJ2aW5nIGJhbGFuY2UgZm9yIHRoZVxuICogbGFiZWwncyBwb3NpdGlvbi5cbiAqL1xuZnVuY3Rpb24gaW5qZWN0RWRnZUxhYmVsUHJveGllcyhnKSB7XG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZWRnZSA9IGcuZWRnZShlKTtcbiAgICBpZiAoZWRnZS53aWR0aCAmJiBlZGdlLmhlaWdodCkge1xuICAgICAgdmFyIHYgPSBnLm5vZGUoZS52KTtcbiAgICAgIHZhciB3ID0gZy5ub2RlKGUudyk7XG4gICAgICB2YXIgbGFiZWwgPSB7IHJhbms6ICh3LnJhbmsgLSB2LnJhbmspIC8gMiArIHYucmFuaywgZTogZSB9O1xuICAgICAgdXRpbC5hZGREdW1teU5vZGUoZywgXCJlZGdlLXByb3h5XCIsIGxhYmVsLCBcIl9lcFwiKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhc3NpZ25SYW5rTWluTWF4KGcpIHtcbiAgdmFyIG1heFJhbmsgPSAwO1xuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgdmFyIG5vZGUgPSBnLm5vZGUodik7XG4gICAgaWYgKG5vZGUuYm9yZGVyVG9wKSB7XG4gICAgICBub2RlLm1pblJhbmsgPSBnLm5vZGUobm9kZS5ib3JkZXJUb3ApLnJhbms7XG4gICAgICBub2RlLm1heFJhbmsgPSBnLm5vZGUobm9kZS5ib3JkZXJCb3R0b20pLnJhbms7XG4gICAgICBtYXhSYW5rID0gXy5tYXgobWF4UmFuaywgbm9kZS5tYXhSYW5rKTtcbiAgICB9XG4gIH0pO1xuICBnLmdyYXBoKCkubWF4UmFuayA9IG1heFJhbms7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUVkZ2VMYWJlbFByb3hpZXMoZykge1xuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgdmFyIG5vZGUgPSBnLm5vZGUodik7XG4gICAgaWYgKG5vZGUuZHVtbXkgPT09IFwiZWRnZS1wcm94eVwiKSB7XG4gICAgICBnLmVkZ2Uobm9kZS5lKS5sYWJlbFJhbmsgPSBub2RlLnJhbms7XG4gICAgICBnLnJlbW92ZU5vZGUodik7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gdHJhbnNsYXRlR3JhcGgoZykge1xuICB2YXIgbWluWCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgdmFyIG1heFggPSAwO1xuICB2YXIgbWluWSA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgdmFyIG1heFkgPSAwO1xuICB2YXIgZ3JhcGhMYWJlbCA9IGcuZ3JhcGgoKTtcbiAgdmFyIG1hcmdpblggPSBncmFwaExhYmVsLm1hcmdpbnggfHwgMDtcbiAgdmFyIG1hcmdpblkgPSBncmFwaExhYmVsLm1hcmdpbnkgfHwgMDtcblxuICBmdW5jdGlvbiBnZXRFeHRyZW1lcyhhdHRycykge1xuICAgIHZhciB4ID0gYXR0cnMueDtcbiAgICB2YXIgeSA9IGF0dHJzLnk7XG4gICAgdmFyIHcgPSBhdHRycy53aWR0aDtcbiAgICB2YXIgaCA9IGF0dHJzLmhlaWdodDtcbiAgICBtaW5YID0gTWF0aC5taW4obWluWCwgeCAtIHcgLyAyKTtcbiAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgeCArIHcgLyAyKTtcbiAgICBtaW5ZID0gTWF0aC5taW4obWluWSwgeSAtIGggLyAyKTtcbiAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgeSArIGggLyAyKTtcbiAgfVxuXG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHsgZ2V0RXh0cmVtZXMoZy5ub2RlKHYpKTsgfSk7XG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZWRnZSA9IGcuZWRnZShlKTtcbiAgICBpZiAoXy5oYXMoZWRnZSwgXCJ4XCIpKSB7XG4gICAgICBnZXRFeHRyZW1lcyhlZGdlKTtcbiAgICB9XG4gIH0pO1xuXG4gIG1pblggLT0gbWFyZ2luWDtcbiAgbWluWSAtPSBtYXJnaW5ZO1xuXG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgbm9kZSA9IGcubm9kZSh2KTtcbiAgICBub2RlLnggLT0gbWluWDtcbiAgICBub2RlLnkgLT0gbWluWTtcbiAgfSk7XG5cbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBlZGdlID0gZy5lZGdlKGUpO1xuICAgIF8uZm9yRWFjaChlZGdlLnBvaW50cywgZnVuY3Rpb24ocCkge1xuICAgICAgcC54IC09IG1pblg7XG4gICAgICBwLnkgLT0gbWluWTtcbiAgICB9KTtcbiAgICBpZiAoXy5oYXMoZWRnZSwgXCJ4XCIpKSB7IGVkZ2UueCAtPSBtaW5YOyB9XG4gICAgaWYgKF8uaGFzKGVkZ2UsIFwieVwiKSkgeyBlZGdlLnkgLT0gbWluWTsgfVxuICB9KTtcblxuICBncmFwaExhYmVsLndpZHRoID0gbWF4WCAtIG1pblggKyBtYXJnaW5YO1xuICBncmFwaExhYmVsLmhlaWdodCA9IG1heFkgLSBtaW5ZICsgbWFyZ2luWTtcbn1cblxuZnVuY3Rpb24gYXNzaWduTm9kZUludGVyc2VjdHMoZykge1xuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIGVkZ2UgPSBnLmVkZ2UoZSk7XG4gICAgdmFyIG5vZGVWID0gZy5ub2RlKGUudik7XG4gICAgdmFyIG5vZGVXID0gZy5ub2RlKGUudyk7XG4gICAgdmFyIHAxLCBwMjtcbiAgICBpZiAoIWVkZ2UucG9pbnRzKSB7XG4gICAgICBlZGdlLnBvaW50cyA9IFtdO1xuICAgICAgcDEgPSBub2RlVztcbiAgICAgIHAyID0gbm9kZVY7XG4gICAgfSBlbHNlIHtcbiAgICAgIHAxID0gZWRnZS5wb2ludHNbMF07XG4gICAgICBwMiA9IGVkZ2UucG9pbnRzW2VkZ2UucG9pbnRzLmxlbmd0aCAtIDFdO1xuICAgIH1cbiAgICBlZGdlLnBvaW50cy51bnNoaWZ0KHV0aWwuaW50ZXJzZWN0UmVjdChub2RlViwgcDEpKTtcbiAgICBlZGdlLnBvaW50cy5wdXNoKHV0aWwuaW50ZXJzZWN0UmVjdChub2RlVywgcDIpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGZpeHVwRWRnZUxhYmVsQ29vcmRzKGcpIHtcbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBlZGdlID0gZy5lZGdlKGUpO1xuICAgIGlmIChfLmhhcyhlZGdlLCBcInhcIikpIHtcbiAgICAgIGlmIChlZGdlLmxhYmVscG9zID09PSBcImxcIiB8fCBlZGdlLmxhYmVscG9zID09PSBcInJcIikge1xuICAgICAgICBlZGdlLndpZHRoIC09IGVkZ2UubGFiZWxvZmZzZXQ7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKGVkZ2UubGFiZWxwb3MpIHtcbiAgICAgIGNhc2UgXCJsXCI6IGVkZ2UueCAtPSBlZGdlLndpZHRoIC8gMiArIGVkZ2UubGFiZWxvZmZzZXQ7IGJyZWFrO1xuICAgICAgY2FzZSBcInJcIjogZWRnZS54ICs9IGVkZ2Uud2lkdGggLyAyICsgZWRnZS5sYWJlbG9mZnNldDsgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gcmV2ZXJzZVBvaW50c0ZvclJldmVyc2VkRWRnZXMoZykge1xuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIGVkZ2UgPSBnLmVkZ2UoZSk7XG4gICAgaWYgKGVkZ2UucmV2ZXJzZWQpIHtcbiAgICAgIGVkZ2UucG9pbnRzLnJldmVyc2UoKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZW1vdmVCb3JkZXJOb2RlcyhnKSB7XG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICBpZiAoZy5jaGlsZHJlbih2KS5sZW5ndGgpIHtcbiAgICAgIHZhciBub2RlID0gZy5ub2RlKHYpO1xuICAgICAgdmFyIHQgPSBnLm5vZGUobm9kZS5ib3JkZXJUb3ApO1xuICAgICAgdmFyIGIgPSBnLm5vZGUobm9kZS5ib3JkZXJCb3R0b20pO1xuICAgICAgdmFyIGwgPSBnLm5vZGUoXy5sYXN0KG5vZGUuYm9yZGVyTGVmdCkpO1xuICAgICAgdmFyIHIgPSBnLm5vZGUoXy5sYXN0KG5vZGUuYm9yZGVyUmlnaHQpKTtcblxuICAgICAgbm9kZS53aWR0aCA9IE1hdGguYWJzKHIueCAtIGwueCk7XG4gICAgICBub2RlLmhlaWdodCA9IE1hdGguYWJzKGIueSAtIHQueSk7XG4gICAgICBub2RlLnggPSBsLnggKyBub2RlLndpZHRoIC8gMjtcbiAgICAgIG5vZGUueSA9IHQueSArIG5vZGUuaGVpZ2h0IC8gMjtcbiAgICB9XG4gIH0pO1xuXG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICBpZiAoZy5ub2RlKHYpLmR1bW15ID09PSBcImJvcmRlclwiKSB7XG4gICAgICBnLnJlbW92ZU5vZGUodik7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlU2VsZkVkZ2VzKGcpIHtcbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIGlmIChlLnYgPT09IGUudykge1xuICAgICAgdmFyIG5vZGUgPSBnLm5vZGUoZS52KTtcbiAgICAgIGlmICghbm9kZS5zZWxmRWRnZXMpIHtcbiAgICAgICAgbm9kZS5zZWxmRWRnZXMgPSBbXTtcbiAgICAgIH1cbiAgICAgIG5vZGUuc2VsZkVkZ2VzLnB1c2goeyBlOiBlLCBsYWJlbDogZy5lZGdlKGUpIH0pO1xuICAgICAgZy5yZW1vdmVFZGdlKGUpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGluc2VydFNlbGZFZGdlcyhnKSB7XG4gIHZhciBsYXllcnMgPSB1dGlsLmJ1aWxkTGF5ZXJNYXRyaXgoZyk7XG4gIF8uZm9yRWFjaChsYXllcnMsIGZ1bmN0aW9uKGxheWVyKSB7XG4gICAgdmFyIG9yZGVyU2hpZnQgPSAwO1xuICAgIF8uZm9yRWFjaChsYXllciwgZnVuY3Rpb24odiwgaSkge1xuICAgICAgdmFyIG5vZGUgPSBnLm5vZGUodik7XG4gICAgICBub2RlLm9yZGVyID0gaSArIG9yZGVyU2hpZnQ7XG4gICAgICBfLmZvckVhY2gobm9kZS5zZWxmRWRnZXMsIGZ1bmN0aW9uKHNlbGZFZGdlKSB7XG4gICAgICAgIHV0aWwuYWRkRHVtbXlOb2RlKGcsIFwic2VsZmVkZ2VcIiwge1xuICAgICAgICAgIHdpZHRoOiBzZWxmRWRnZS5sYWJlbC53aWR0aCxcbiAgICAgICAgICBoZWlnaHQ6IHNlbGZFZGdlLmxhYmVsLmhlaWdodCxcbiAgICAgICAgICByYW5rOiBub2RlLnJhbmssXG4gICAgICAgICAgb3JkZXI6IGkgKyAoKytvcmRlclNoaWZ0KSxcbiAgICAgICAgICBlOiBzZWxmRWRnZS5lLFxuICAgICAgICAgIGxhYmVsOiBzZWxmRWRnZS5sYWJlbFxuICAgICAgICB9LCBcIl9zZVwiKTtcbiAgICAgIH0pO1xuICAgICAgZGVsZXRlIG5vZGUuc2VsZkVkZ2VzO1xuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcG9zaXRpb25TZWxmRWRnZXMoZykge1xuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgdmFyIG5vZGUgPSBnLm5vZGUodik7XG4gICAgaWYgKG5vZGUuZHVtbXkgPT09IFwic2VsZmVkZ2VcIikge1xuICAgICAgdmFyIHNlbGZOb2RlID0gZy5ub2RlKG5vZGUuZS52KTtcbiAgICAgIHZhciB4ID0gc2VsZk5vZGUueCArIHNlbGZOb2RlLndpZHRoIC8gMjtcbiAgICAgIHZhciB5ID0gc2VsZk5vZGUueTtcbiAgICAgIHZhciBkeCA9IG5vZGUueCAtIHg7XG4gICAgICB2YXIgZHkgPSBzZWxmTm9kZS5oZWlnaHQgLyAyO1xuICAgICAgZy5zZXRFZGdlKG5vZGUuZSwgbm9kZS5sYWJlbCk7XG4gICAgICBnLnJlbW92ZU5vZGUodik7XG4gICAgICBub2RlLmxhYmVsLnBvaW50cyA9IFtcbiAgICAgICAgeyB4OiB4ICsgMiAqIGR4IC8gMywgeTogeSAtIGR5IH0sXG4gICAgICAgIHsgeDogeCArIDUgKiBkeCAvIDYsIHk6IHkgLSBkeSB9LFxuICAgICAgICB7IHg6IHggKyAgICAgZHggICAgLCB5OiB5IH0sXG4gICAgICAgIHsgeDogeCArIDUgKiBkeCAvIDYsIHk6IHkgKyBkeSB9LFxuICAgICAgICB7IHg6IHggKyAyICogZHggLyAzLCB5OiB5ICsgZHkgfVxuICAgICAgXTtcbiAgICAgIG5vZGUubGFiZWwueCA9IG5vZGUueDtcbiAgICAgIG5vZGUubGFiZWwueSA9IG5vZGUueTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzZWxlY3ROdW1iZXJBdHRycyhvYmosIGF0dHJzKSB7XG4gIHJldHVybiBfLm1hcFZhbHVlcyhfLnBpY2sob2JqLCBhdHRycyksIE51bWJlcik7XG59XG5cbmZ1bmN0aW9uIGNhbm9uaWNhbGl6ZShhdHRycykge1xuICB2YXIgbmV3QXR0cnMgPSB7fTtcbiAgXy5mb3JFYWNoKGF0dHJzLCBmdW5jdGlvbih2LCBrKSB7XG4gICAgbmV3QXR0cnNbay50b0xvd2VyQ2FzZSgpXSA9IHY7XG4gIH0pO1xuICByZXR1cm4gbmV3QXR0cnM7XG59XG4iLCIvKiBnbG9iYWwgd2luZG93ICovXG5cbnZhciBsb2Rhc2g7XG5cbmlmICh0eXBlb2YgcmVxdWlyZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gIHRyeSB7XG4gICAgbG9kYXNoID0ge1xuICAgICAgY2xvbmVEZWVwOiByZXF1aXJlKFwibG9kYXNoL2Nsb25lRGVlcFwiKSxcbiAgICAgIGNvbnN0YW50OiByZXF1aXJlKFwibG9kYXNoL2NvbnN0YW50XCIpLFxuICAgICAgZGVmYXVsdHM6IHJlcXVpcmUoXCJsb2Rhc2gvZGVmYXVsdHNcIiksXG4gICAgICBlYWNoOiByZXF1aXJlKFwibG9kYXNoL2VhY2hcIiksXG4gICAgICBmaWx0ZXI6IHJlcXVpcmUoXCJsb2Rhc2gvZmlsdGVyXCIpLFxuICAgICAgZmluZDogcmVxdWlyZShcImxvZGFzaC9maW5kXCIpLFxuICAgICAgZmxhdHRlbjogcmVxdWlyZShcImxvZGFzaC9mbGF0dGVuXCIpLFxuICAgICAgZm9yRWFjaDogcmVxdWlyZShcImxvZGFzaC9mb3JFYWNoXCIpLFxuICAgICAgZm9ySW46IHJlcXVpcmUoXCJsb2Rhc2gvZm9ySW5cIiksXG4gICAgICBoYXM6ICByZXF1aXJlKFwibG9kYXNoL2hhc1wiKSxcbiAgICAgIGlzVW5kZWZpbmVkOiByZXF1aXJlKFwibG9kYXNoL2lzVW5kZWZpbmVkXCIpLFxuICAgICAgbGFzdDogcmVxdWlyZShcImxvZGFzaC9sYXN0XCIpLFxuICAgICAgbWFwOiByZXF1aXJlKFwibG9kYXNoL21hcFwiKSxcbiAgICAgIG1hcFZhbHVlczogcmVxdWlyZShcImxvZGFzaC9tYXBWYWx1ZXNcIiksXG4gICAgICBtYXg6IHJlcXVpcmUoXCJsb2Rhc2gvbWF4XCIpLFxuICAgICAgbWVyZ2U6IHJlcXVpcmUoXCJsb2Rhc2gvbWVyZ2VcIiksXG4gICAgICBtaW46IHJlcXVpcmUoXCJsb2Rhc2gvbWluXCIpLFxuICAgICAgbWluQnk6IHJlcXVpcmUoXCJsb2Rhc2gvbWluQnlcIiksXG4gICAgICBub3c6IHJlcXVpcmUoXCJsb2Rhc2gvbm93XCIpLFxuICAgICAgcGljazogcmVxdWlyZShcImxvZGFzaC9waWNrXCIpLFxuICAgICAgcmFuZ2U6IHJlcXVpcmUoXCJsb2Rhc2gvcmFuZ2VcIiksXG4gICAgICByZWR1Y2U6IHJlcXVpcmUoXCJsb2Rhc2gvcmVkdWNlXCIpLFxuICAgICAgc29ydEJ5OiByZXF1aXJlKFwibG9kYXNoL3NvcnRCeVwiKSxcbiAgICAgIHVuaXF1ZUlkOiByZXF1aXJlKFwibG9kYXNoL3VuaXF1ZUlkXCIpLFxuICAgICAgdmFsdWVzOiByZXF1aXJlKFwibG9kYXNoL3ZhbHVlc1wiKSxcbiAgICAgIHppcE9iamVjdDogcmVxdWlyZShcImxvZGFzaC96aXBPYmplY3RcIiksXG4gICAgfTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIGNvbnRpbnVlIHJlZ2FyZGxlc3Mgb2YgZXJyb3JcbiAgfVxufVxuXG5pZiAoIWxvZGFzaCkge1xuICBsb2Rhc2ggPSB3aW5kb3cuXztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsb2Rhc2g7XG4iLCJ2YXIgXyA9IHJlcXVpcmUoXCIuL2xvZGFzaFwiKTtcbnZhciB1dGlsID0gcmVxdWlyZShcIi4vdXRpbFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHJ1bjogcnVuLFxuICBjbGVhbnVwOiBjbGVhbnVwXG59O1xuXG4vKlxuICogQSBuZXN0aW5nIGdyYXBoIGNyZWF0ZXMgZHVtbXkgbm9kZXMgZm9yIHRoZSB0b3BzIGFuZCBib3R0b21zIG9mIHN1YmdyYXBocyxcbiAqIGFkZHMgYXBwcm9wcmlhdGUgZWRnZXMgdG8gZW5zdXJlIHRoYXQgYWxsIGNsdXN0ZXIgbm9kZXMgYXJlIHBsYWNlZCBiZXR3ZWVuXG4gKiB0aGVzZSBib3VuZHJpZXMsIGFuZCBlbnN1cmVzIHRoYXQgdGhlIGdyYXBoIGlzIGNvbm5lY3RlZC5cbiAqXG4gKiBJbiBhZGRpdGlvbiB3ZSBlbnN1cmUsIHRocm91Z2ggdGhlIHVzZSBvZiB0aGUgbWlubGVuIHByb3BlcnR5LCB0aGF0IG5vZGVzXG4gKiBhbmQgc3ViZ3JhcGggYm9yZGVyIG5vZGVzIHRvIG5vdCBlbmQgdXAgb24gdGhlIHNhbWUgcmFuay5cbiAqXG4gKiBQcmVjb25kaXRpb25zOlxuICpcbiAqICAgIDEuIElucHV0IGdyYXBoIGlzIGEgREFHXG4gKiAgICAyLiBOb2RlcyBpbiB0aGUgaW5wdXQgZ3JhcGggaGFzIGEgbWlubGVuIGF0dHJpYnV0ZVxuICpcbiAqIFBvc3Rjb25kaXRpb25zOlxuICpcbiAqICAgIDEuIElucHV0IGdyYXBoIGlzIGNvbm5lY3RlZC5cbiAqICAgIDIuIER1bW15IG5vZGVzIGFyZSBhZGRlZCBmb3IgdGhlIHRvcHMgYW5kIGJvdHRvbXMgb2Ygc3ViZ3JhcGhzLlxuICogICAgMy4gVGhlIG1pbmxlbiBhdHRyaWJ1dGUgZm9yIG5vZGVzIGlzIGFkanVzdGVkIHRvIGVuc3VyZSBub2RlcyBkbyBub3RcbiAqICAgICAgIGdldCBwbGFjZWQgb24gdGhlIHNhbWUgcmFuayBhcyBzdWJncmFwaCBib3JkZXIgbm9kZXMuXG4gKlxuICogVGhlIG5lc3RpbmcgZ3JhcGggaWRlYSBjb21lcyBmcm9tIFNhbmRlciwgXCJMYXlvdXQgb2YgQ29tcG91bmQgRGlyZWN0ZWRcbiAqIEdyYXBocy5cIlxuICovXG5mdW5jdGlvbiBydW4oZykge1xuICB2YXIgcm9vdCA9IHV0aWwuYWRkRHVtbXlOb2RlKGcsIFwicm9vdFwiLCB7fSwgXCJfcm9vdFwiKTtcbiAgdmFyIGRlcHRocyA9IHRyZWVEZXB0aHMoZyk7XG4gIHZhciBoZWlnaHQgPSBfLm1heChfLnZhbHVlcyhkZXB0aHMpKSAtIDE7IC8vIE5vdGU6IGRlcHRocyBpcyBhbiBPYmplY3Qgbm90IGFuIGFycmF5XG4gIHZhciBub2RlU2VwID0gMiAqIGhlaWdodCArIDE7XG5cbiAgZy5ncmFwaCgpLm5lc3RpbmdSb290ID0gcm9vdDtcblxuICAvLyBNdWx0aXBseSBtaW5sZW4gYnkgbm9kZVNlcCB0byBhbGlnbiBub2RlcyBvbiBub24tYm9yZGVyIHJhbmtzLlxuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7IGcuZWRnZShlKS5taW5sZW4gKj0gbm9kZVNlcDsgfSk7XG5cbiAgLy8gQ2FsY3VsYXRlIGEgd2VpZ2h0IHRoYXQgaXMgc3VmZmljaWVudCB0byBrZWVwIHN1YmdyYXBocyB2ZXJ0aWNhbGx5IGNvbXBhY3RcbiAgdmFyIHdlaWdodCA9IHN1bVdlaWdodHMoZykgKyAxO1xuXG4gIC8vIENyZWF0ZSBib3JkZXIgbm9kZXMgYW5kIGxpbmsgdGhlbSB1cFxuICBfLmZvckVhY2goZy5jaGlsZHJlbigpLCBmdW5jdGlvbihjaGlsZCkge1xuICAgIGRmcyhnLCByb290LCBub2RlU2VwLCB3ZWlnaHQsIGhlaWdodCwgZGVwdGhzLCBjaGlsZCk7XG4gIH0pO1xuXG4gIC8vIFNhdmUgdGhlIG11bHRpcGxpZXIgZm9yIG5vZGUgbGF5ZXJzIGZvciBsYXRlciByZW1vdmFsIG9mIGVtcHR5IGJvcmRlclxuICAvLyBsYXllcnMuXG4gIGcuZ3JhcGgoKS5ub2RlUmFua0ZhY3RvciA9IG5vZGVTZXA7XG59XG5cbmZ1bmN0aW9uIGRmcyhnLCByb290LCBub2RlU2VwLCB3ZWlnaHQsIGhlaWdodCwgZGVwdGhzLCB2KSB7XG4gIHZhciBjaGlsZHJlbiA9IGcuY2hpbGRyZW4odik7XG4gIGlmICghY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgaWYgKHYgIT09IHJvb3QpIHtcbiAgICAgIGcuc2V0RWRnZShyb290LCB2LCB7IHdlaWdodDogMCwgbWlubGVuOiBub2RlU2VwIH0pO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgdG9wID0gdXRpbC5hZGRCb3JkZXJOb2RlKGcsIFwiX2J0XCIpO1xuICB2YXIgYm90dG9tID0gdXRpbC5hZGRCb3JkZXJOb2RlKGcsIFwiX2JiXCIpO1xuICB2YXIgbGFiZWwgPSBnLm5vZGUodik7XG5cbiAgZy5zZXRQYXJlbnQodG9wLCB2KTtcbiAgbGFiZWwuYm9yZGVyVG9wID0gdG9wO1xuICBnLnNldFBhcmVudChib3R0b20sIHYpO1xuICBsYWJlbC5ib3JkZXJCb3R0b20gPSBib3R0b207XG5cbiAgXy5mb3JFYWNoKGNoaWxkcmVuLCBmdW5jdGlvbihjaGlsZCkge1xuICAgIGRmcyhnLCByb290LCBub2RlU2VwLCB3ZWlnaHQsIGhlaWdodCwgZGVwdGhzLCBjaGlsZCk7XG5cbiAgICB2YXIgY2hpbGROb2RlID0gZy5ub2RlKGNoaWxkKTtcbiAgICB2YXIgY2hpbGRUb3AgPSBjaGlsZE5vZGUuYm9yZGVyVG9wID8gY2hpbGROb2RlLmJvcmRlclRvcCA6IGNoaWxkO1xuICAgIHZhciBjaGlsZEJvdHRvbSA9IGNoaWxkTm9kZS5ib3JkZXJCb3R0b20gPyBjaGlsZE5vZGUuYm9yZGVyQm90dG9tIDogY2hpbGQ7XG4gICAgdmFyIHRoaXNXZWlnaHQgPSBjaGlsZE5vZGUuYm9yZGVyVG9wID8gd2VpZ2h0IDogMiAqIHdlaWdodDtcbiAgICB2YXIgbWlubGVuID0gY2hpbGRUb3AgIT09IGNoaWxkQm90dG9tID8gMSA6IGhlaWdodCAtIGRlcHRoc1t2XSArIDE7XG5cbiAgICBnLnNldEVkZ2UodG9wLCBjaGlsZFRvcCwge1xuICAgICAgd2VpZ2h0OiB0aGlzV2VpZ2h0LFxuICAgICAgbWlubGVuOiBtaW5sZW4sXG4gICAgICBuZXN0aW5nRWRnZTogdHJ1ZVxuICAgIH0pO1xuXG4gICAgZy5zZXRFZGdlKGNoaWxkQm90dG9tLCBib3R0b20sIHtcbiAgICAgIHdlaWdodDogdGhpc1dlaWdodCxcbiAgICAgIG1pbmxlbjogbWlubGVuLFxuICAgICAgbmVzdGluZ0VkZ2U6IHRydWVcbiAgICB9KTtcbiAgfSk7XG5cbiAgaWYgKCFnLnBhcmVudCh2KSkge1xuICAgIGcuc2V0RWRnZShyb290LCB0b3AsIHsgd2VpZ2h0OiAwLCBtaW5sZW46IGhlaWdodCArIGRlcHRoc1t2XSB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0cmVlRGVwdGhzKGcpIHtcbiAgdmFyIGRlcHRocyA9IHt9O1xuICBmdW5jdGlvbiBkZnModiwgZGVwdGgpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBnLmNoaWxkcmVuKHYpO1xuICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgIF8uZm9yRWFjaChjaGlsZHJlbiwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgICAgZGZzKGNoaWxkLCBkZXB0aCArIDEpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGRlcHRoc1t2XSA9IGRlcHRoO1xuICB9XG4gIF8uZm9yRWFjaChnLmNoaWxkcmVuKCksIGZ1bmN0aW9uKHYpIHsgZGZzKHYsIDEpOyB9KTtcbiAgcmV0dXJuIGRlcHRocztcbn1cblxuZnVuY3Rpb24gc3VtV2VpZ2h0cyhnKSB7XG4gIHJldHVybiBfLnJlZHVjZShnLmVkZ2VzKCksIGZ1bmN0aW9uKGFjYywgZSkge1xuICAgIHJldHVybiBhY2MgKyBnLmVkZ2UoZSkud2VpZ2h0O1xuICB9LCAwKTtcbn1cblxuZnVuY3Rpb24gY2xlYW51cChnKSB7XG4gIHZhciBncmFwaExhYmVsID0gZy5ncmFwaCgpO1xuICBnLnJlbW92ZU5vZGUoZ3JhcGhMYWJlbC5uZXN0aW5nUm9vdCk7XG4gIGRlbGV0ZSBncmFwaExhYmVsLm5lc3RpbmdSb290O1xuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIGVkZ2UgPSBnLmVkZ2UoZSk7XG4gICAgaWYgKGVkZ2UubmVzdGluZ0VkZ2UpIHtcbiAgICAgIGcucmVtb3ZlRWRnZShlKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfID0gcmVxdWlyZShcIi4vbG9kYXNoXCIpO1xudmFyIHV0aWwgPSByZXF1aXJlKFwiLi91dGlsXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgcnVuOiBydW4sXG4gIHVuZG86IHVuZG9cbn07XG5cbi8qXG4gKiBCcmVha3MgYW55IGxvbmcgZWRnZXMgaW4gdGhlIGdyYXBoIGludG8gc2hvcnQgc2VnbWVudHMgdGhhdCBzcGFuIDEgbGF5ZXJcbiAqIGVhY2guIFRoaXMgb3BlcmF0aW9uIGlzIHVuZG9hYmxlIHdpdGggdGhlIGRlbm9ybWFsaXplIGZ1bmN0aW9uLlxuICpcbiAqIFByZS1jb25kaXRpb25zOlxuICpcbiAqICAgIDEuIFRoZSBpbnB1dCBncmFwaCBpcyBhIERBRy5cbiAqICAgIDIuIEVhY2ggbm9kZSBpbiB0aGUgZ3JhcGggaGFzIGEgXCJyYW5rXCIgcHJvcGVydHkuXG4gKlxuICogUG9zdC1jb25kaXRpb246XG4gKlxuICogICAgMS4gQWxsIGVkZ2VzIGluIHRoZSBncmFwaCBoYXZlIGEgbGVuZ3RoIG9mIDEuXG4gKiAgICAyLiBEdW1teSBub2RlcyBhcmUgYWRkZWQgd2hlcmUgZWRnZXMgaGF2ZSBiZWVuIHNwbGl0IGludG8gc2VnbWVudHMuXG4gKiAgICAzLiBUaGUgZ3JhcGggaXMgYXVnbWVudGVkIHdpdGggYSBcImR1bW15Q2hhaW5zXCIgYXR0cmlidXRlIHdoaWNoIGNvbnRhaW5zXG4gKiAgICAgICB0aGUgZmlyc3QgZHVtbXkgaW4gZWFjaCBjaGFpbiBvZiBkdW1teSBub2RlcyBwcm9kdWNlZC5cbiAqL1xuZnVuY3Rpb24gcnVuKGcpIHtcbiAgZy5ncmFwaCgpLmR1bW15Q2hhaW5zID0gW107XG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGVkZ2UpIHsgbm9ybWFsaXplRWRnZShnLCBlZGdlKTsgfSk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUVkZ2UoZywgZSkge1xuICB2YXIgdiA9IGUudjtcbiAgdmFyIHZSYW5rID0gZy5ub2RlKHYpLnJhbms7XG4gIHZhciB3ID0gZS53O1xuICB2YXIgd1JhbmsgPSBnLm5vZGUodykucmFuaztcbiAgdmFyIG5hbWUgPSBlLm5hbWU7XG4gIHZhciBlZGdlTGFiZWwgPSBnLmVkZ2UoZSk7XG4gIHZhciBsYWJlbFJhbmsgPSBlZGdlTGFiZWwubGFiZWxSYW5rO1xuXG4gIGlmICh3UmFuayA9PT0gdlJhbmsgKyAxKSByZXR1cm47XG5cbiAgZy5yZW1vdmVFZGdlKGUpO1xuXG4gIHZhciBkdW1teSwgYXR0cnMsIGk7XG4gIGZvciAoaSA9IDAsICsrdlJhbms7IHZSYW5rIDwgd1Jhbms7ICsraSwgKyt2UmFuaykge1xuICAgIGVkZ2VMYWJlbC5wb2ludHMgPSBbXTtcbiAgICBhdHRycyA9IHtcbiAgICAgIHdpZHRoOiAwLCBoZWlnaHQ6IDAsXG4gICAgICBlZGdlTGFiZWw6IGVkZ2VMYWJlbCwgZWRnZU9iajogZSxcbiAgICAgIHJhbms6IHZSYW5rXG4gICAgfTtcbiAgICBkdW1teSA9IHV0aWwuYWRkRHVtbXlOb2RlKGcsIFwiZWRnZVwiLCBhdHRycywgXCJfZFwiKTtcbiAgICBpZiAodlJhbmsgPT09IGxhYmVsUmFuaykge1xuICAgICAgYXR0cnMud2lkdGggPSBlZGdlTGFiZWwud2lkdGg7XG4gICAgICBhdHRycy5oZWlnaHQgPSBlZGdlTGFiZWwuaGVpZ2h0O1xuICAgICAgYXR0cnMuZHVtbXkgPSBcImVkZ2UtbGFiZWxcIjtcbiAgICAgIGF0dHJzLmxhYmVscG9zID0gZWRnZUxhYmVsLmxhYmVscG9zO1xuICAgIH1cbiAgICBnLnNldEVkZ2UodiwgZHVtbXksIHsgd2VpZ2h0OiBlZGdlTGFiZWwud2VpZ2h0IH0sIG5hbWUpO1xuICAgIGlmIChpID09PSAwKSB7XG4gICAgICBnLmdyYXBoKCkuZHVtbXlDaGFpbnMucHVzaChkdW1teSk7XG4gICAgfVxuICAgIHYgPSBkdW1teTtcbiAgfVxuXG4gIGcuc2V0RWRnZSh2LCB3LCB7IHdlaWdodDogZWRnZUxhYmVsLndlaWdodCB9LCBuYW1lKTtcbn1cblxuZnVuY3Rpb24gdW5kbyhnKSB7XG4gIF8uZm9yRWFjaChnLmdyYXBoKCkuZHVtbXlDaGFpbnMsIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgbm9kZSA9IGcubm9kZSh2KTtcbiAgICB2YXIgb3JpZ0xhYmVsID0gbm9kZS5lZGdlTGFiZWw7XG4gICAgdmFyIHc7XG4gICAgZy5zZXRFZGdlKG5vZGUuZWRnZU9iaiwgb3JpZ0xhYmVsKTtcbiAgICB3aGlsZSAobm9kZS5kdW1teSkge1xuICAgICAgdyA9IGcuc3VjY2Vzc29ycyh2KVswXTtcbiAgICAgIGcucmVtb3ZlTm9kZSh2KTtcbiAgICAgIG9yaWdMYWJlbC5wb2ludHMucHVzaCh7IHg6IG5vZGUueCwgeTogbm9kZS55IH0pO1xuICAgICAgaWYgKG5vZGUuZHVtbXkgPT09IFwiZWRnZS1sYWJlbFwiKSB7XG4gICAgICAgIG9yaWdMYWJlbC54ID0gbm9kZS54O1xuICAgICAgICBvcmlnTGFiZWwueSA9IG5vZGUueTtcbiAgICAgICAgb3JpZ0xhYmVsLndpZHRoID0gbm9kZS53aWR0aDtcbiAgICAgICAgb3JpZ0xhYmVsLmhlaWdodCA9IG5vZGUuaGVpZ2h0O1xuICAgICAgfVxuICAgICAgdiA9IHc7XG4gICAgICBub2RlID0gZy5ub2RlKHYpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJ2YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gYWRkU3ViZ3JhcGhDb25zdHJhaW50cztcblxuZnVuY3Rpb24gYWRkU3ViZ3JhcGhDb25zdHJhaW50cyhnLCBjZywgdnMpIHtcbiAgdmFyIHByZXYgPSB7fSxcbiAgICByb290UHJldjtcblxuICBfLmZvckVhY2godnMsIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgY2hpbGQgPSBnLnBhcmVudCh2KSxcbiAgICAgIHBhcmVudCxcbiAgICAgIHByZXZDaGlsZDtcbiAgICB3aGlsZSAoY2hpbGQpIHtcbiAgICAgIHBhcmVudCA9IGcucGFyZW50KGNoaWxkKTtcbiAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgcHJldkNoaWxkID0gcHJldltwYXJlbnRdO1xuICAgICAgICBwcmV2W3BhcmVudF0gPSBjaGlsZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByZXZDaGlsZCA9IHJvb3RQcmV2O1xuICAgICAgICByb290UHJldiA9IGNoaWxkO1xuICAgICAgfVxuICAgICAgaWYgKHByZXZDaGlsZCAmJiBwcmV2Q2hpbGQgIT09IGNoaWxkKSB7XG4gICAgICAgIGNnLnNldEVkZ2UocHJldkNoaWxkLCBjaGlsZCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNoaWxkID0gcGFyZW50O1xuICAgIH1cbiAgfSk7XG5cbiAgLypcbiAgZnVuY3Rpb24gZGZzKHYpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSB2ID8gZy5jaGlsZHJlbih2KSA6IGcuY2hpbGRyZW4oKTtcbiAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICB2YXIgbWluID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxuICAgICAgICAgIHN1YmdyYXBocyA9IFtdO1xuICAgICAgXy5lYWNoKGNoaWxkcmVuLCBmdW5jdGlvbihjaGlsZCkge1xuICAgICAgICB2YXIgY2hpbGRNaW4gPSBkZnMoY2hpbGQpO1xuICAgICAgICBpZiAoZy5jaGlsZHJlbihjaGlsZCkubGVuZ3RoKSB7XG4gICAgICAgICAgc3ViZ3JhcGhzLnB1c2goeyB2OiBjaGlsZCwgb3JkZXI6IGNoaWxkTWluIH0pO1xuICAgICAgICB9XG4gICAgICAgIG1pbiA9IE1hdGgubWluKG1pbiwgY2hpbGRNaW4pO1xuICAgICAgfSk7XG4gICAgICBfLnJlZHVjZShfLnNvcnRCeShzdWJncmFwaHMsIFwib3JkZXJcIiksIGZ1bmN0aW9uKHByZXYsIGN1cnIpIHtcbiAgICAgICAgY2cuc2V0RWRnZShwcmV2LnYsIGN1cnIudik7XG4gICAgICAgIHJldHVybiBjdXJyO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gbWluO1xuICAgIH1cbiAgICByZXR1cm4gZy5ub2RlKHYpLm9yZGVyO1xuICB9XG4gIGRmcyh1bmRlZmluZWQpO1xuICAqL1xufVxuIiwidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJhcnljZW50ZXI7XG5cbmZ1bmN0aW9uIGJhcnljZW50ZXIoZywgbW92YWJsZSkge1xuICByZXR1cm4gXy5tYXAobW92YWJsZSwgZnVuY3Rpb24odikge1xuICAgIHZhciBpblYgPSBnLmluRWRnZXModik7XG4gICAgaWYgKCFpblYubGVuZ3RoKSB7XG4gICAgICByZXR1cm4geyB2OiB2IH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciByZXN1bHQgPSBfLnJlZHVjZShpblYsIGZ1bmN0aW9uKGFjYywgZSkge1xuICAgICAgICB2YXIgZWRnZSA9IGcuZWRnZShlKSxcbiAgICAgICAgICBub2RlVSA9IGcubm9kZShlLnYpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1bTogYWNjLnN1bSArIChlZGdlLndlaWdodCAqIG5vZGVVLm9yZGVyKSxcbiAgICAgICAgICB3ZWlnaHQ6IGFjYy53ZWlnaHQgKyBlZGdlLndlaWdodFxuICAgICAgICB9O1xuICAgICAgfSwgeyBzdW06IDAsIHdlaWdodDogMCB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdjogdixcbiAgICAgICAgYmFyeWNlbnRlcjogcmVzdWx0LnN1bSAvIHJlc3VsdC53ZWlnaHQsXG4gICAgICAgIHdlaWdodDogcmVzdWx0LndlaWdodFxuICAgICAgfTtcbiAgICB9XG4gIH0pO1xufVxuXG4iLCJ2YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG52YXIgR3JhcGggPSByZXF1aXJlKFwiLi4vZ3JhcGhsaWJcIikuR3JhcGg7XG5cbm1vZHVsZS5leHBvcnRzID0gYnVpbGRMYXllckdyYXBoO1xuXG4vKlxuICogQ29uc3RydWN0cyBhIGdyYXBoIHRoYXQgY2FuIGJlIHVzZWQgdG8gc29ydCBhIGxheWVyIG9mIG5vZGVzLiBUaGUgZ3JhcGggd2lsbFxuICogY29udGFpbiBhbGwgYmFzZSBhbmQgc3ViZ3JhcGggbm9kZXMgZnJvbSB0aGUgcmVxdWVzdCBsYXllciBpbiB0aGVpciBvcmlnaW5hbFxuICogaGllcmFyY2h5IGFuZCBhbnkgZWRnZXMgdGhhdCBhcmUgaW5jaWRlbnQgb24gdGhlc2Ugbm9kZXMgYW5kIGFyZSBvZiB0aGUgdHlwZVxuICogcmVxdWVzdGVkIGJ5IHRoZSBcInJlbGF0aW9uc2hpcFwiIHBhcmFtZXRlci5cbiAqXG4gKiBOb2RlcyBmcm9tIHRoZSByZXF1ZXN0ZWQgcmFuayB0aGF0IGRvIG5vdCBoYXZlIHBhcmVudHMgYXJlIGFzc2lnbmVkIGEgcm9vdFxuICogbm9kZSBpbiB0aGUgb3V0cHV0IGdyYXBoLCB3aGljaCBpcyBzZXQgaW4gdGhlIHJvb3QgZ3JhcGggYXR0cmlidXRlLiBUaGlzXG4gKiBtYWtlcyBpdCBlYXN5IHRvIHdhbGsgdGhlIGhpZXJhcmNoeSBvZiBtb3ZhYmxlIG5vZGVzIGR1cmluZyBvcmRlcmluZy5cbiAqXG4gKiBQcmUtY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBJbnB1dCBncmFwaCBpcyBhIERBR1xuICogICAgMi4gQmFzZSBub2RlcyBpbiB0aGUgaW5wdXQgZ3JhcGggaGF2ZSBhIHJhbmsgYXR0cmlidXRlXG4gKiAgICAzLiBTdWJncmFwaCBub2RlcyBpbiB0aGUgaW5wdXQgZ3JhcGggaGFzIG1pblJhbmsgYW5kIG1heFJhbmsgYXR0cmlidXRlc1xuICogICAgNC4gRWRnZXMgaGF2ZSBhbiBhc3NpZ25lZCB3ZWlnaHRcbiAqXG4gKiBQb3N0LWNvbmRpdGlvbnM6XG4gKlxuICogICAgMS4gT3V0cHV0IGdyYXBoIGhhcyBhbGwgbm9kZXMgaW4gdGhlIG1vdmFibGUgcmFuayB3aXRoIHByZXNlcnZlZFxuICogICAgICAgaGllcmFyY2h5LlxuICogICAgMi4gUm9vdCBub2RlcyBpbiB0aGUgbW92YWJsZSBsYXllciBhcmUgbWFkZSBjaGlsZHJlbiBvZiB0aGUgbm9kZVxuICogICAgICAgaW5kaWNhdGVkIGJ5IHRoZSByb290IGF0dHJpYnV0ZSBvZiB0aGUgZ3JhcGguXG4gKiAgICAzLiBOb24tbW92YWJsZSBub2RlcyBpbmNpZGVudCBvbiBtb3ZhYmxlIG5vZGVzLCBzZWxlY3RlZCBieSB0aGVcbiAqICAgICAgIHJlbGF0aW9uc2hpcCBwYXJhbWV0ZXIsIGFyZSBpbmNsdWRlZCBpbiB0aGUgZ3JhcGggKHdpdGhvdXQgaGllcmFyY2h5KS5cbiAqICAgIDQuIEVkZ2VzIGluY2lkZW50IG9uIG1vdmFibGUgbm9kZXMsIHNlbGVjdGVkIGJ5IHRoZSByZWxhdGlvbnNoaXBcbiAqICAgICAgIHBhcmFtZXRlciwgYXJlIGFkZGVkIHRvIHRoZSBvdXRwdXQgZ3JhcGguXG4gKiAgICA1LiBUaGUgd2VpZ2h0cyBmb3IgY29waWVkIGVkZ2VzIGFyZSBhZ2dyZWdhdGVkIGFzIG5lZWQsIHNpbmNlIHRoZSBvdXRwdXRcbiAqICAgICAgIGdyYXBoIGlzIG5vdCBhIG11bHRpLWdyYXBoLlxuICovXG5mdW5jdGlvbiBidWlsZExheWVyR3JhcGgoZywgcmFuaywgcmVsYXRpb25zaGlwKSB7XG4gIHZhciByb290ID0gY3JlYXRlUm9vdE5vZGUoZyksXG4gICAgcmVzdWx0ID0gbmV3IEdyYXBoKHsgY29tcG91bmQ6IHRydWUgfSkuc2V0R3JhcGgoeyByb290OiByb290IH0pXG4gICAgICAuc2V0RGVmYXVsdE5vZGVMYWJlbChmdW5jdGlvbih2KSB7IHJldHVybiBnLm5vZGUodik7IH0pO1xuXG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgbm9kZSA9IGcubm9kZSh2KSxcbiAgICAgIHBhcmVudCA9IGcucGFyZW50KHYpO1xuXG4gICAgaWYgKG5vZGUucmFuayA9PT0gcmFuayB8fCBub2RlLm1pblJhbmsgPD0gcmFuayAmJiByYW5rIDw9IG5vZGUubWF4UmFuaykge1xuICAgICAgcmVzdWx0LnNldE5vZGUodik7XG4gICAgICByZXN1bHQuc2V0UGFyZW50KHYsIHBhcmVudCB8fCByb290KTtcblxuICAgICAgLy8gVGhpcyBhc3N1bWVzIHdlIGhhdmUgb25seSBzaG9ydCBlZGdlcyFcbiAgICAgIF8uZm9yRWFjaChnW3JlbGF0aW9uc2hpcF0odiksIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgdmFyIHUgPSBlLnYgPT09IHYgPyBlLncgOiBlLnYsXG4gICAgICAgICAgZWRnZSA9IHJlc3VsdC5lZGdlKHUsIHYpLFxuICAgICAgICAgIHdlaWdodCA9ICFfLmlzVW5kZWZpbmVkKGVkZ2UpID8gZWRnZS53ZWlnaHQgOiAwO1xuICAgICAgICByZXN1bHQuc2V0RWRnZSh1LCB2LCB7IHdlaWdodDogZy5lZGdlKGUpLndlaWdodCArIHdlaWdodCB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoXy5oYXMobm9kZSwgXCJtaW5SYW5rXCIpKSB7XG4gICAgICAgIHJlc3VsdC5zZXROb2RlKHYsIHtcbiAgICAgICAgICBib3JkZXJMZWZ0OiBub2RlLmJvcmRlckxlZnRbcmFua10sXG4gICAgICAgICAgYm9yZGVyUmlnaHQ6IG5vZGUuYm9yZGVyUmlnaHRbcmFua11cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVSb290Tm9kZShnKSB7XG4gIHZhciB2O1xuICB3aGlsZSAoZy5oYXNOb2RlKCh2ID0gXy51bmlxdWVJZChcIl9yb290XCIpKSkpO1xuICByZXR1cm4gdjtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gY3Jvc3NDb3VudDtcblxuLypcbiAqIEEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIGxheWVyaW5nIChhbiBhcnJheSBvZiBsYXllcnMsIGVhY2ggd2l0aCBhbiBhcnJheSBvZlxuICogb3JkZXJlcmQgbm9kZXMpIGFuZCBhIGdyYXBoIGFuZCByZXR1cm5zIGEgd2VpZ2h0ZWQgY3Jvc3NpbmcgY291bnQuXG4gKlxuICogUHJlLWNvbmRpdGlvbnM6XG4gKlxuICogICAgMS4gSW5wdXQgZ3JhcGggbXVzdCBiZSBzaW1wbGUgKG5vdCBhIG11bHRpZ3JhcGgpLCBkaXJlY3RlZCwgYW5kIGluY2x1ZGVcbiAqICAgICAgIG9ubHkgc2ltcGxlIGVkZ2VzLlxuICogICAgMi4gRWRnZXMgaW4gdGhlIGlucHV0IGdyYXBoIG11c3QgaGF2ZSBhc3NpZ25lZCB3ZWlnaHRzLlxuICpcbiAqIFBvc3QtY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBUaGUgZ3JhcGggYW5kIGxheWVyaW5nIG1hdHJpeCBhcmUgbGVmdCB1bmNoYW5nZWQuXG4gKlxuICogVGhpcyBhbGdvcml0aG0gaXMgZGVyaXZlZCBmcm9tIEJhcnRoLCBldCBhbC4sIFwiQmlsYXllciBDcm9zcyBDb3VudGluZy5cIlxuICovXG5mdW5jdGlvbiBjcm9zc0NvdW50KGcsIGxheWVyaW5nKSB7XG4gIHZhciBjYyA9IDA7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgbGF5ZXJpbmcubGVuZ3RoOyArK2kpIHtcbiAgICBjYyArPSB0d29MYXllckNyb3NzQ291bnQoZywgbGF5ZXJpbmdbaS0xXSwgbGF5ZXJpbmdbaV0pO1xuICB9XG4gIHJldHVybiBjYztcbn1cblxuZnVuY3Rpb24gdHdvTGF5ZXJDcm9zc0NvdW50KGcsIG5vcnRoTGF5ZXIsIHNvdXRoTGF5ZXIpIHtcbiAgLy8gU29ydCBhbGwgb2YgdGhlIGVkZ2VzIGJldHdlZW4gdGhlIG5vcnRoIGFuZCBzb3V0aCBsYXllcnMgYnkgdGhlaXIgcG9zaXRpb25cbiAgLy8gaW4gdGhlIG5vcnRoIGxheWVyIGFuZCB0aGVuIHRoZSBzb3V0aC4gTWFwIHRoZXNlIGVkZ2VzIHRvIHRoZSBwb3NpdGlvbiBvZlxuICAvLyB0aGVpciBoZWFkIGluIHRoZSBzb3V0aCBsYXllci5cbiAgdmFyIHNvdXRoUG9zID0gXy56aXBPYmplY3Qoc291dGhMYXllcixcbiAgICBfLm1hcChzb3V0aExheWVyLCBmdW5jdGlvbiAodiwgaSkgeyByZXR1cm4gaTsgfSkpO1xuICB2YXIgc291dGhFbnRyaWVzID0gXy5mbGF0dGVuKF8ubWFwKG5vcnRoTGF5ZXIsIGZ1bmN0aW9uKHYpIHtcbiAgICByZXR1cm4gXy5zb3J0QnkoXy5tYXAoZy5vdXRFZGdlcyh2KSwgZnVuY3Rpb24oZSkge1xuICAgICAgcmV0dXJuIHsgcG9zOiBzb3V0aFBvc1tlLnddLCB3ZWlnaHQ6IGcuZWRnZShlKS53ZWlnaHQgfTtcbiAgICB9KSwgXCJwb3NcIik7XG4gIH0pLCB0cnVlKTtcblxuICAvLyBCdWlsZCB0aGUgYWNjdW11bGF0b3IgdHJlZVxuICB2YXIgZmlyc3RJbmRleCA9IDE7XG4gIHdoaWxlIChmaXJzdEluZGV4IDwgc291dGhMYXllci5sZW5ndGgpIGZpcnN0SW5kZXggPDw9IDE7XG4gIHZhciB0cmVlU2l6ZSA9IDIgKiBmaXJzdEluZGV4IC0gMTtcbiAgZmlyc3RJbmRleCAtPSAxO1xuICB2YXIgdHJlZSA9IF8ubWFwKG5ldyBBcnJheSh0cmVlU2l6ZSksIGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfSk7XG5cbiAgLy8gQ2FsY3VsYXRlIHRoZSB3ZWlnaHRlZCBjcm9zc2luZ3NcbiAgdmFyIGNjID0gMDtcbiAgXy5mb3JFYWNoKHNvdXRoRW50cmllcy5mb3JFYWNoKGZ1bmN0aW9uKGVudHJ5KSB7XG4gICAgdmFyIGluZGV4ID0gZW50cnkucG9zICsgZmlyc3RJbmRleDtcbiAgICB0cmVlW2luZGV4XSArPSBlbnRyeS53ZWlnaHQ7XG4gICAgdmFyIHdlaWdodFN1bSA9IDA7XG4gICAgd2hpbGUgKGluZGV4ID4gMCkge1xuICAgICAgaWYgKGluZGV4ICUgMikge1xuICAgICAgICB3ZWlnaHRTdW0gKz0gdHJlZVtpbmRleCArIDFdO1xuICAgICAgfVxuICAgICAgaW5kZXggPSAoaW5kZXggLSAxKSA+PiAxO1xuICAgICAgdHJlZVtpbmRleF0gKz0gZW50cnkud2VpZ2h0O1xuICAgIH1cbiAgICBjYyArPSBlbnRyeS53ZWlnaHQgKiB3ZWlnaHRTdW07XG4gIH0pKTtcblxuICByZXR1cm4gY2M7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xudmFyIGluaXRPcmRlciA9IHJlcXVpcmUoXCIuL2luaXQtb3JkZXJcIik7XG52YXIgY3Jvc3NDb3VudCA9IHJlcXVpcmUoXCIuL2Nyb3NzLWNvdW50XCIpO1xudmFyIHNvcnRTdWJncmFwaCA9IHJlcXVpcmUoXCIuL3NvcnQtc3ViZ3JhcGhcIik7XG52YXIgYnVpbGRMYXllckdyYXBoID0gcmVxdWlyZShcIi4vYnVpbGQtbGF5ZXItZ3JhcGhcIik7XG52YXIgYWRkU3ViZ3JhcGhDb25zdHJhaW50cyA9IHJlcXVpcmUoXCIuL2FkZC1zdWJncmFwaC1jb25zdHJhaW50c1wiKTtcbnZhciBHcmFwaCA9IHJlcXVpcmUoXCIuLi9ncmFwaGxpYlwiKS5HcmFwaDtcbnZhciB1dGlsID0gcmVxdWlyZShcIi4uL3V0aWxcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gb3JkZXI7XG5cbi8qXG4gKiBBcHBsaWVzIGhldXJpc3RpY3MgdG8gbWluaW1pemUgZWRnZSBjcm9zc2luZ3MgaW4gdGhlIGdyYXBoIGFuZCBzZXRzIHRoZSBiZXN0XG4gKiBvcmRlciBzb2x1dGlvbiBhcyBhbiBvcmRlciBhdHRyaWJ1dGUgb24gZWFjaCBub2RlLlxuICpcbiAqIFByZS1jb25kaXRpb25zOlxuICpcbiAqICAgIDEuIEdyYXBoIG11c3QgYmUgREFHXG4gKiAgICAyLiBHcmFwaCBub2RlcyBtdXN0IGJlIG9iamVjdHMgd2l0aCBhIFwicmFua1wiIGF0dHJpYnV0ZVxuICogICAgMy4gR3JhcGggZWRnZXMgbXVzdCBoYXZlIHRoZSBcIndlaWdodFwiIGF0dHJpYnV0ZVxuICpcbiAqIFBvc3QtY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBHcmFwaCBub2RlcyB3aWxsIGhhdmUgYW4gXCJvcmRlclwiIGF0dHJpYnV0ZSBiYXNlZCBvbiB0aGUgcmVzdWx0cyBvZiB0aGVcbiAqICAgICAgIGFsZ29yaXRobS5cbiAqL1xuZnVuY3Rpb24gb3JkZXIoZykge1xuICB2YXIgbWF4UmFuayA9IHV0aWwubWF4UmFuayhnKSxcbiAgICBkb3duTGF5ZXJHcmFwaHMgPSBidWlsZExheWVyR3JhcGhzKGcsIF8ucmFuZ2UoMSwgbWF4UmFuayArIDEpLCBcImluRWRnZXNcIiksXG4gICAgdXBMYXllckdyYXBocyA9IGJ1aWxkTGF5ZXJHcmFwaHMoZywgXy5yYW5nZShtYXhSYW5rIC0gMSwgLTEsIC0xKSwgXCJvdXRFZGdlc1wiKTtcblxuICB2YXIgbGF5ZXJpbmcgPSBpbml0T3JkZXIoZyk7XG4gIGFzc2lnbk9yZGVyKGcsIGxheWVyaW5nKTtcblxuICB2YXIgYmVzdENDID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxuICAgIGJlc3Q7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGxhc3RCZXN0ID0gMDsgbGFzdEJlc3QgPCA0OyArK2ksICsrbGFzdEJlc3QpIHtcbiAgICBzd2VlcExheWVyR3JhcGhzKGkgJSAyID8gZG93bkxheWVyR3JhcGhzIDogdXBMYXllckdyYXBocywgaSAlIDQgPj0gMik7XG5cbiAgICBsYXllcmluZyA9IHV0aWwuYnVpbGRMYXllck1hdHJpeChnKTtcbiAgICB2YXIgY2MgPSBjcm9zc0NvdW50KGcsIGxheWVyaW5nKTtcbiAgICBpZiAoY2MgPCBiZXN0Q0MpIHtcbiAgICAgIGxhc3RCZXN0ID0gMDtcbiAgICAgIGJlc3QgPSBfLmNsb25lRGVlcChsYXllcmluZyk7XG4gICAgICBiZXN0Q0MgPSBjYztcbiAgICB9XG4gIH1cblxuICBhc3NpZ25PcmRlcihnLCBiZXN0KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRMYXllckdyYXBocyhnLCByYW5rcywgcmVsYXRpb25zaGlwKSB7XG4gIHJldHVybiBfLm1hcChyYW5rcywgZnVuY3Rpb24ocmFuaykge1xuICAgIHJldHVybiBidWlsZExheWVyR3JhcGgoZywgcmFuaywgcmVsYXRpb25zaGlwKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHN3ZWVwTGF5ZXJHcmFwaHMobGF5ZXJHcmFwaHMsIGJpYXNSaWdodCkge1xuICB2YXIgY2cgPSBuZXcgR3JhcGgoKTtcbiAgXy5mb3JFYWNoKGxheWVyR3JhcGhzLCBmdW5jdGlvbihsZykge1xuICAgIHZhciByb290ID0gbGcuZ3JhcGgoKS5yb290O1xuICAgIHZhciBzb3J0ZWQgPSBzb3J0U3ViZ3JhcGgobGcsIHJvb3QsIGNnLCBiaWFzUmlnaHQpO1xuICAgIF8uZm9yRWFjaChzb3J0ZWQudnMsIGZ1bmN0aW9uKHYsIGkpIHtcbiAgICAgIGxnLm5vZGUodikub3JkZXIgPSBpO1xuICAgIH0pO1xuICAgIGFkZFN1YmdyYXBoQ29uc3RyYWludHMobGcsIGNnLCBzb3J0ZWQudnMpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gYXNzaWduT3JkZXIoZywgbGF5ZXJpbmcpIHtcbiAgXy5mb3JFYWNoKGxheWVyaW5nLCBmdW5jdGlvbihsYXllcikge1xuICAgIF8uZm9yRWFjaChsYXllciwgZnVuY3Rpb24odiwgaSkge1xuICAgICAgZy5ub2RlKHYpLm9yZGVyID0gaTtcbiAgICB9KTtcbiAgfSk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGluaXRPcmRlcjtcblxuLypcbiAqIEFzc2lnbnMgYW4gaW5pdGlhbCBvcmRlciB2YWx1ZSBmb3IgZWFjaCBub2RlIGJ5IHBlcmZvcm1pbmcgYSBERlMgc2VhcmNoXG4gKiBzdGFydGluZyBmcm9tIG5vZGVzIGluIHRoZSBmaXJzdCByYW5rLiBOb2RlcyBhcmUgYXNzaWduZWQgYW4gb3JkZXIgaW4gdGhlaXJcbiAqIHJhbmsgYXMgdGhleSBhcmUgZmlyc3QgdmlzaXRlZC5cbiAqXG4gKiBUaGlzIGFwcHJvYWNoIGNvbWVzIGZyb20gR2Fuc25lciwgZXQgYWwuLCBcIkEgVGVjaG5pcXVlIGZvciBEcmF3aW5nIERpcmVjdGVkXG4gKiBHcmFwaHMuXCJcbiAqXG4gKiBSZXR1cm5zIGEgbGF5ZXJpbmcgbWF0cml4IHdpdGggYW4gYXJyYXkgcGVyIGxheWVyIGFuZCBlYWNoIGxheWVyIHNvcnRlZCBieVxuICogdGhlIG9yZGVyIG9mIGl0cyBub2Rlcy5cbiAqL1xuZnVuY3Rpb24gaW5pdE9yZGVyKGcpIHtcbiAgdmFyIHZpc2l0ZWQgPSB7fTtcbiAgdmFyIHNpbXBsZU5vZGVzID0gXy5maWx0ZXIoZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgcmV0dXJuICFnLmNoaWxkcmVuKHYpLmxlbmd0aDtcbiAgfSk7XG4gIHZhciBtYXhSYW5rID0gXy5tYXgoXy5tYXAoc2ltcGxlTm9kZXMsIGZ1bmN0aW9uKHYpIHsgcmV0dXJuIGcubm9kZSh2KS5yYW5rOyB9KSk7XG4gIHZhciBsYXllcnMgPSBfLm1hcChfLnJhbmdlKG1heFJhbmsgKyAxKSwgZnVuY3Rpb24oKSB7IHJldHVybiBbXTsgfSk7XG5cbiAgZnVuY3Rpb24gZGZzKHYpIHtcbiAgICBpZiAoXy5oYXModmlzaXRlZCwgdikpIHJldHVybjtcbiAgICB2aXNpdGVkW3ZdID0gdHJ1ZTtcbiAgICB2YXIgbm9kZSA9IGcubm9kZSh2KTtcbiAgICBsYXllcnNbbm9kZS5yYW5rXS5wdXNoKHYpO1xuICAgIF8uZm9yRWFjaChnLnN1Y2Nlc3NvcnModiksIGRmcyk7XG4gIH1cblxuICB2YXIgb3JkZXJlZFZzID0gXy5zb3J0Qnkoc2ltcGxlTm9kZXMsIGZ1bmN0aW9uKHYpIHsgcmV0dXJuIGcubm9kZSh2KS5yYW5rOyB9KTtcbiAgXy5mb3JFYWNoKG9yZGVyZWRWcywgZGZzKTtcblxuICByZXR1cm4gbGF5ZXJzO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSByZXNvbHZlQ29uZmxpY3RzO1xuXG4vKlxuICogR2l2ZW4gYSBsaXN0IG9mIGVudHJpZXMgb2YgdGhlIGZvcm0ge3YsIGJhcnljZW50ZXIsIHdlaWdodH0gYW5kIGFcbiAqIGNvbnN0cmFpbnQgZ3JhcGggdGhpcyBmdW5jdGlvbiB3aWxsIHJlc29sdmUgYW55IGNvbmZsaWN0cyBiZXR3ZWVuIHRoZVxuICogY29uc3RyYWludCBncmFwaCBhbmQgdGhlIGJhcnljZW50ZXJzIGZvciB0aGUgZW50cmllcy4gSWYgdGhlIGJhcnljZW50ZXJzIGZvclxuICogYW4gZW50cnkgd291bGQgdmlvbGF0ZSBhIGNvbnN0cmFpbnQgaW4gdGhlIGNvbnN0cmFpbnQgZ3JhcGggdGhlbiB3ZSBjb2FsZXNjZVxuICogdGhlIG5vZGVzIGluIHRoZSBjb25mbGljdCBpbnRvIGEgbmV3IG5vZGUgdGhhdCByZXNwZWN0cyB0aGUgY29udHJhaW50IGFuZFxuICogYWdncmVnYXRlcyBiYXJ5Y2VudGVyIGFuZCB3ZWlnaHQgaW5mb3JtYXRpb24uXG4gKlxuICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiB0aGUgZGVzY3JpcHRpb24gaW4gRm9yc3RlciwgXCJBIEZhc3QgYW5kXG4gKiBTaW1wbGUgSHVlcmlzdGljIGZvciBDb25zdHJhaW5lZCBUd28tTGV2ZWwgQ3Jvc3NpbmcgUmVkdWN0aW9uLFwiIHRob3VnaHQgaXRcbiAqIGRpZmZlcnMgaW4gc29tZSBzcGVjaWZpYyBkZXRhaWxzLlxuICpcbiAqIFByZS1jb25kaXRpb25zOlxuICpcbiAqICAgIDEuIEVhY2ggZW50cnkgaGFzIHRoZSBmb3JtIHt2LCBiYXJ5Y2VudGVyLCB3ZWlnaHR9LCBvciBpZiB0aGUgbm9kZSBoYXNcbiAqICAgICAgIG5vIGJhcnljZW50ZXIsIHRoZW4ge3Z9LlxuICpcbiAqIFJldHVybnM6XG4gKlxuICogICAgQSBuZXcgbGlzdCBvZiBlbnRyaWVzIG9mIHRoZSBmb3JtIHt2cywgaSwgYmFyeWNlbnRlciwgd2VpZ2h0fS4gVGhlIGxpc3RcbiAqICAgIGB2c2AgbWF5IGVpdGhlciBiZSBhIHNpbmdsZXRvbiBvciBpdCBtYXkgYmUgYW4gYWdncmVnYXRpb24gb2Ygbm9kZXNcbiAqICAgIG9yZGVyZWQgc3VjaCB0aGF0IHRoZXkgZG8gbm90IHZpb2xhdGUgY29uc3RyYWludHMgZnJvbSB0aGUgY29uc3RyYWludFxuICogICAgZ3JhcGguIFRoZSBwcm9wZXJ0eSBgaWAgaXMgdGhlIGxvd2VzdCBvcmlnaW5hbCBpbmRleCBvZiBhbnkgb2YgdGhlXG4gKiAgICBlbGVtZW50cyBpbiBgdnNgLlxuICovXG5mdW5jdGlvbiByZXNvbHZlQ29uZmxpY3RzKGVudHJpZXMsIGNnKSB7XG4gIHZhciBtYXBwZWRFbnRyaWVzID0ge307XG4gIF8uZm9yRWFjaChlbnRyaWVzLCBmdW5jdGlvbihlbnRyeSwgaSkge1xuICAgIHZhciB0bXAgPSBtYXBwZWRFbnRyaWVzW2VudHJ5LnZdID0ge1xuICAgICAgaW5kZWdyZWU6IDAsXG4gICAgICBcImluXCI6IFtdLFxuICAgICAgb3V0OiBbXSxcbiAgICAgIHZzOiBbZW50cnkudl0sXG4gICAgICBpOiBpXG4gICAgfTtcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoZW50cnkuYmFyeWNlbnRlcikpIHtcbiAgICAgIHRtcC5iYXJ5Y2VudGVyID0gZW50cnkuYmFyeWNlbnRlcjtcbiAgICAgIHRtcC53ZWlnaHQgPSBlbnRyeS53ZWlnaHQ7XG4gICAgfVxuICB9KTtcblxuICBfLmZvckVhY2goY2cuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBlbnRyeVYgPSBtYXBwZWRFbnRyaWVzW2Uudl07XG4gICAgdmFyIGVudHJ5VyA9IG1hcHBlZEVudHJpZXNbZS53XTtcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoZW50cnlWKSAmJiAhXy5pc1VuZGVmaW5lZChlbnRyeVcpKSB7XG4gICAgICBlbnRyeVcuaW5kZWdyZWUrKztcbiAgICAgIGVudHJ5Vi5vdXQucHVzaChtYXBwZWRFbnRyaWVzW2Uud10pO1xuICAgIH1cbiAgfSk7XG5cbiAgdmFyIHNvdXJjZVNldCA9IF8uZmlsdGVyKG1hcHBlZEVudHJpZXMsIGZ1bmN0aW9uKGVudHJ5KSB7XG4gICAgcmV0dXJuICFlbnRyeS5pbmRlZ3JlZTtcbiAgfSk7XG5cbiAgcmV0dXJuIGRvUmVzb2x2ZUNvbmZsaWN0cyhzb3VyY2VTZXQpO1xufVxuXG5mdW5jdGlvbiBkb1Jlc29sdmVDb25mbGljdHMoc291cmNlU2V0KSB7XG4gIHZhciBlbnRyaWVzID0gW107XG5cbiAgZnVuY3Rpb24gaGFuZGxlSW4odkVudHJ5KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHVFbnRyeSkge1xuICAgICAgaWYgKHVFbnRyeS5tZXJnZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKF8uaXNVbmRlZmluZWQodUVudHJ5LmJhcnljZW50ZXIpIHx8XG4gICAgICAgICAgXy5pc1VuZGVmaW5lZCh2RW50cnkuYmFyeWNlbnRlcikgfHxcbiAgICAgICAgICB1RW50cnkuYmFyeWNlbnRlciA+PSB2RW50cnkuYmFyeWNlbnRlcikge1xuICAgICAgICBtZXJnZUVudHJpZXModkVudHJ5LCB1RW50cnkpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVPdXQodkVudHJ5KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHdFbnRyeSkge1xuICAgICAgd0VudHJ5W1wiaW5cIl0ucHVzaCh2RW50cnkpO1xuICAgICAgaWYgKC0td0VudHJ5LmluZGVncmVlID09PSAwKSB7XG4gICAgICAgIHNvdXJjZVNldC5wdXNoKHdFbnRyeSk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHdoaWxlIChzb3VyY2VTZXQubGVuZ3RoKSB7XG4gICAgdmFyIGVudHJ5ID0gc291cmNlU2V0LnBvcCgpO1xuICAgIGVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgXy5mb3JFYWNoKGVudHJ5W1wiaW5cIl0ucmV2ZXJzZSgpLCBoYW5kbGVJbihlbnRyeSkpO1xuICAgIF8uZm9yRWFjaChlbnRyeS5vdXQsIGhhbmRsZU91dChlbnRyeSkpO1xuICB9XG5cbiAgcmV0dXJuIF8ubWFwKF8uZmlsdGVyKGVudHJpZXMsIGZ1bmN0aW9uKGVudHJ5KSB7IHJldHVybiAhZW50cnkubWVyZ2VkOyB9KSxcbiAgICBmdW5jdGlvbihlbnRyeSkge1xuICAgICAgcmV0dXJuIF8ucGljayhlbnRyeSwgW1widnNcIiwgXCJpXCIsIFwiYmFyeWNlbnRlclwiLCBcIndlaWdodFwiXSk7XG4gICAgfSk7XG5cbn1cblxuZnVuY3Rpb24gbWVyZ2VFbnRyaWVzKHRhcmdldCwgc291cmNlKSB7XG4gIHZhciBzdW0gPSAwO1xuICB2YXIgd2VpZ2h0ID0gMDtcblxuICBpZiAodGFyZ2V0LndlaWdodCkge1xuICAgIHN1bSArPSB0YXJnZXQuYmFyeWNlbnRlciAqIHRhcmdldC53ZWlnaHQ7XG4gICAgd2VpZ2h0ICs9IHRhcmdldC53ZWlnaHQ7XG4gIH1cblxuICBpZiAoc291cmNlLndlaWdodCkge1xuICAgIHN1bSArPSBzb3VyY2UuYmFyeWNlbnRlciAqIHNvdXJjZS53ZWlnaHQ7XG4gICAgd2VpZ2h0ICs9IHNvdXJjZS53ZWlnaHQ7XG4gIH1cblxuICB0YXJnZXQudnMgPSBzb3VyY2UudnMuY29uY2F0KHRhcmdldC52cyk7XG4gIHRhcmdldC5iYXJ5Y2VudGVyID0gc3VtIC8gd2VpZ2h0O1xuICB0YXJnZXQud2VpZ2h0ID0gd2VpZ2h0O1xuICB0YXJnZXQuaSA9IE1hdGgubWluKHNvdXJjZS5pLCB0YXJnZXQuaSk7XG4gIHNvdXJjZS5tZXJnZWQgPSB0cnVlO1xufVxuIiwidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xudmFyIGJhcnljZW50ZXIgPSByZXF1aXJlKFwiLi9iYXJ5Y2VudGVyXCIpO1xudmFyIHJlc29sdmVDb25mbGljdHMgPSByZXF1aXJlKFwiLi9yZXNvbHZlLWNvbmZsaWN0c1wiKTtcbnZhciBzb3J0ID0gcmVxdWlyZShcIi4vc29ydFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBzb3J0U3ViZ3JhcGg7XG5cbmZ1bmN0aW9uIHNvcnRTdWJncmFwaChnLCB2LCBjZywgYmlhc1JpZ2h0KSB7XG4gIHZhciBtb3ZhYmxlID0gZy5jaGlsZHJlbih2KTtcbiAgdmFyIG5vZGUgPSBnLm5vZGUodik7XG4gIHZhciBibCA9IG5vZGUgPyBub2RlLmJvcmRlckxlZnQgOiB1bmRlZmluZWQ7XG4gIHZhciBiciA9IG5vZGUgPyBub2RlLmJvcmRlclJpZ2h0OiB1bmRlZmluZWQ7XG4gIHZhciBzdWJncmFwaHMgPSB7fTtcblxuICBpZiAoYmwpIHtcbiAgICBtb3ZhYmxlID0gXy5maWx0ZXIobW92YWJsZSwgZnVuY3Rpb24odykge1xuICAgICAgcmV0dXJuIHcgIT09IGJsICYmIHcgIT09IGJyO1xuICAgIH0pO1xuICB9XG5cbiAgdmFyIGJhcnljZW50ZXJzID0gYmFyeWNlbnRlcihnLCBtb3ZhYmxlKTtcbiAgXy5mb3JFYWNoKGJhcnljZW50ZXJzLCBmdW5jdGlvbihlbnRyeSkge1xuICAgIGlmIChnLmNoaWxkcmVuKGVudHJ5LnYpLmxlbmd0aCkge1xuICAgICAgdmFyIHN1YmdyYXBoUmVzdWx0ID0gc29ydFN1YmdyYXBoKGcsIGVudHJ5LnYsIGNnLCBiaWFzUmlnaHQpO1xuICAgICAgc3ViZ3JhcGhzW2VudHJ5LnZdID0gc3ViZ3JhcGhSZXN1bHQ7XG4gICAgICBpZiAoXy5oYXMoc3ViZ3JhcGhSZXN1bHQsIFwiYmFyeWNlbnRlclwiKSkge1xuICAgICAgICBtZXJnZUJhcnljZW50ZXJzKGVudHJ5LCBzdWJncmFwaFJlc3VsdCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICB2YXIgZW50cmllcyA9IHJlc29sdmVDb25mbGljdHMoYmFyeWNlbnRlcnMsIGNnKTtcbiAgZXhwYW5kU3ViZ3JhcGhzKGVudHJpZXMsIHN1YmdyYXBocyk7XG5cbiAgdmFyIHJlc3VsdCA9IHNvcnQoZW50cmllcywgYmlhc1JpZ2h0KTtcblxuICBpZiAoYmwpIHtcbiAgICByZXN1bHQudnMgPSBfLmZsYXR0ZW4oW2JsLCByZXN1bHQudnMsIGJyXSwgdHJ1ZSk7XG4gICAgaWYgKGcucHJlZGVjZXNzb3JzKGJsKS5sZW5ndGgpIHtcbiAgICAgIHZhciBibFByZWQgPSBnLm5vZGUoZy5wcmVkZWNlc3NvcnMoYmwpWzBdKSxcbiAgICAgICAgYnJQcmVkID0gZy5ub2RlKGcucHJlZGVjZXNzb3JzKGJyKVswXSk7XG4gICAgICBpZiAoIV8uaGFzKHJlc3VsdCwgXCJiYXJ5Y2VudGVyXCIpKSB7XG4gICAgICAgIHJlc3VsdC5iYXJ5Y2VudGVyID0gMDtcbiAgICAgICAgcmVzdWx0LndlaWdodCA9IDA7XG4gICAgICB9XG4gICAgICByZXN1bHQuYmFyeWNlbnRlciA9IChyZXN1bHQuYmFyeWNlbnRlciAqIHJlc3VsdC53ZWlnaHQgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxQcmVkLm9yZGVyICsgYnJQcmVkLm9yZGVyKSAvIChyZXN1bHQud2VpZ2h0ICsgMik7XG4gICAgICByZXN1bHQud2VpZ2h0ICs9IDI7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gZXhwYW5kU3ViZ3JhcGhzKGVudHJpZXMsIHN1YmdyYXBocykge1xuICBfLmZvckVhY2goZW50cmllcywgZnVuY3Rpb24oZW50cnkpIHtcbiAgICBlbnRyeS52cyA9IF8uZmxhdHRlbihlbnRyeS52cy5tYXAoZnVuY3Rpb24odikge1xuICAgICAgaWYgKHN1YmdyYXBoc1t2XSkge1xuICAgICAgICByZXR1cm4gc3ViZ3JhcGhzW3ZdLnZzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHY7XG4gICAgfSksIHRydWUpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VCYXJ5Y2VudGVycyh0YXJnZXQsIG90aGVyKSB7XG4gIGlmICghXy5pc1VuZGVmaW5lZCh0YXJnZXQuYmFyeWNlbnRlcikpIHtcbiAgICB0YXJnZXQuYmFyeWNlbnRlciA9ICh0YXJnZXQuYmFyeWNlbnRlciAqIHRhcmdldC53ZWlnaHQgK1xuICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyLmJhcnljZW50ZXIgKiBvdGhlci53ZWlnaHQpIC9cbiAgICAgICAgICAgICAgICAgICAgICAgICh0YXJnZXQud2VpZ2h0ICsgb3RoZXIud2VpZ2h0KTtcbiAgICB0YXJnZXQud2VpZ2h0ICs9IG90aGVyLndlaWdodDtcbiAgfSBlbHNlIHtcbiAgICB0YXJnZXQuYmFyeWNlbnRlciA9IG90aGVyLmJhcnljZW50ZXI7XG4gICAgdGFyZ2V0LndlaWdodCA9IG90aGVyLndlaWdodDtcbiAgfVxufVxuIiwidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xudmFyIHV0aWwgPSByZXF1aXJlKFwiLi4vdXRpbFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBzb3J0O1xuXG5mdW5jdGlvbiBzb3J0KGVudHJpZXMsIGJpYXNSaWdodCkge1xuICB2YXIgcGFydHMgPSB1dGlsLnBhcnRpdGlvbihlbnRyaWVzLCBmdW5jdGlvbihlbnRyeSkge1xuICAgIHJldHVybiBfLmhhcyhlbnRyeSwgXCJiYXJ5Y2VudGVyXCIpO1xuICB9KTtcbiAgdmFyIHNvcnRhYmxlID0gcGFydHMubGhzLFxuICAgIHVuc29ydGFibGUgPSBfLnNvcnRCeShwYXJ0cy5yaHMsIGZ1bmN0aW9uKGVudHJ5KSB7IHJldHVybiAtZW50cnkuaTsgfSksXG4gICAgdnMgPSBbXSxcbiAgICBzdW0gPSAwLFxuICAgIHdlaWdodCA9IDAsXG4gICAgdnNJbmRleCA9IDA7XG5cbiAgc29ydGFibGUuc29ydChjb21wYXJlV2l0aEJpYXMoISFiaWFzUmlnaHQpKTtcblxuICB2c0luZGV4ID0gY29uc3VtZVVuc29ydGFibGUodnMsIHVuc29ydGFibGUsIHZzSW5kZXgpO1xuXG4gIF8uZm9yRWFjaChzb3J0YWJsZSwgZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgdnNJbmRleCArPSBlbnRyeS52cy5sZW5ndGg7XG4gICAgdnMucHVzaChlbnRyeS52cyk7XG4gICAgc3VtICs9IGVudHJ5LmJhcnljZW50ZXIgKiBlbnRyeS53ZWlnaHQ7XG4gICAgd2VpZ2h0ICs9IGVudHJ5LndlaWdodDtcbiAgICB2c0luZGV4ID0gY29uc3VtZVVuc29ydGFibGUodnMsIHVuc29ydGFibGUsIHZzSW5kZXgpO1xuICB9KTtcblxuICB2YXIgcmVzdWx0ID0geyB2czogXy5mbGF0dGVuKHZzLCB0cnVlKSB9O1xuICBpZiAod2VpZ2h0KSB7XG4gICAgcmVzdWx0LmJhcnljZW50ZXIgPSBzdW0gLyB3ZWlnaHQ7XG4gICAgcmVzdWx0LndlaWdodCA9IHdlaWdodDtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBjb25zdW1lVW5zb3J0YWJsZSh2cywgdW5zb3J0YWJsZSwgaW5kZXgpIHtcbiAgdmFyIGxhc3Q7XG4gIHdoaWxlICh1bnNvcnRhYmxlLmxlbmd0aCAmJiAobGFzdCA9IF8ubGFzdCh1bnNvcnRhYmxlKSkuaSA8PSBpbmRleCkge1xuICAgIHVuc29ydGFibGUucG9wKCk7XG4gICAgdnMucHVzaChsYXN0LnZzKTtcbiAgICBpbmRleCsrO1xuICB9XG4gIHJldHVybiBpbmRleDtcbn1cblxuZnVuY3Rpb24gY29tcGFyZVdpdGhCaWFzKGJpYXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGVudHJ5ViwgZW50cnlXKSB7XG4gICAgaWYgKGVudHJ5Vi5iYXJ5Y2VudGVyIDwgZW50cnlXLmJhcnljZW50ZXIpIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9IGVsc2UgaWYgKGVudHJ5Vi5iYXJ5Y2VudGVyID4gZW50cnlXLmJhcnljZW50ZXIpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cblxuICAgIHJldHVybiAhYmlhcyA/IGVudHJ5Vi5pIC0gZW50cnlXLmkgOiBlbnRyeVcuaSAtIGVudHJ5Vi5pO1xuICB9O1xufVxuIiwidmFyIF8gPSByZXF1aXJlKFwiLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50RHVtbXlDaGFpbnM7XG5cbmZ1bmN0aW9uIHBhcmVudER1bW15Q2hhaW5zKGcpIHtcbiAgdmFyIHBvc3RvcmRlck51bXMgPSBwb3N0b3JkZXIoZyk7XG5cbiAgXy5mb3JFYWNoKGcuZ3JhcGgoKS5kdW1teUNoYWlucywgZnVuY3Rpb24odikge1xuICAgIHZhciBub2RlID0gZy5ub2RlKHYpO1xuICAgIHZhciBlZGdlT2JqID0gbm9kZS5lZGdlT2JqO1xuICAgIHZhciBwYXRoRGF0YSA9IGZpbmRQYXRoKGcsIHBvc3RvcmRlck51bXMsIGVkZ2VPYmoudiwgZWRnZU9iai53KTtcbiAgICB2YXIgcGF0aCA9IHBhdGhEYXRhLnBhdGg7XG4gICAgdmFyIGxjYSA9IHBhdGhEYXRhLmxjYTtcbiAgICB2YXIgcGF0aElkeCA9IDA7XG4gICAgdmFyIHBhdGhWID0gcGF0aFtwYXRoSWR4XTtcbiAgICB2YXIgYXNjZW5kaW5nID0gdHJ1ZTtcblxuICAgIHdoaWxlICh2ICE9PSBlZGdlT2JqLncpIHtcbiAgICAgIG5vZGUgPSBnLm5vZGUodik7XG5cbiAgICAgIGlmIChhc2NlbmRpbmcpIHtcbiAgICAgICAgd2hpbGUgKChwYXRoViA9IHBhdGhbcGF0aElkeF0pICE9PSBsY2EgJiZcbiAgICAgICAgICAgICAgIGcubm9kZShwYXRoVikubWF4UmFuayA8IG5vZGUucmFuaykge1xuICAgICAgICAgIHBhdGhJZHgrKztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXRoViA9PT0gbGNhKSB7XG4gICAgICAgICAgYXNjZW5kaW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFhc2NlbmRpbmcpIHtcbiAgICAgICAgd2hpbGUgKHBhdGhJZHggPCBwYXRoLmxlbmd0aCAtIDEgJiZcbiAgICAgICAgICAgICAgIGcubm9kZShwYXRoViA9IHBhdGhbcGF0aElkeCArIDFdKS5taW5SYW5rIDw9IG5vZGUucmFuaykge1xuICAgICAgICAgIHBhdGhJZHgrKztcbiAgICAgICAgfVxuICAgICAgICBwYXRoViA9IHBhdGhbcGF0aElkeF07XG4gICAgICB9XG5cbiAgICAgIGcuc2V0UGFyZW50KHYsIHBhdGhWKTtcbiAgICAgIHYgPSBnLnN1Y2Nlc3NvcnModilbMF07XG4gICAgfVxuICB9KTtcbn1cblxuLy8gRmluZCBhIHBhdGggZnJvbSB2IHRvIHcgdGhyb3VnaCB0aGUgbG93ZXN0IGNvbW1vbiBhbmNlc3RvciAoTENBKS4gUmV0dXJuIHRoZVxuLy8gZnVsbCBwYXRoIGFuZCB0aGUgTENBLlxuZnVuY3Rpb24gZmluZFBhdGgoZywgcG9zdG9yZGVyTnVtcywgdiwgdykge1xuICB2YXIgdlBhdGggPSBbXTtcbiAgdmFyIHdQYXRoID0gW107XG4gIHZhciBsb3cgPSBNYXRoLm1pbihwb3N0b3JkZXJOdW1zW3ZdLmxvdywgcG9zdG9yZGVyTnVtc1t3XS5sb3cpO1xuICB2YXIgbGltID0gTWF0aC5tYXgocG9zdG9yZGVyTnVtc1t2XS5saW0sIHBvc3RvcmRlck51bXNbd10ubGltKTtcbiAgdmFyIHBhcmVudDtcbiAgdmFyIGxjYTtcblxuICAvLyBUcmF2ZXJzZSB1cCBmcm9tIHYgdG8gZmluZCB0aGUgTENBXG4gIHBhcmVudCA9IHY7XG4gIGRvIHtcbiAgICBwYXJlbnQgPSBnLnBhcmVudChwYXJlbnQpO1xuICAgIHZQYXRoLnB1c2gocGFyZW50KTtcbiAgfSB3aGlsZSAocGFyZW50ICYmXG4gICAgICAgICAgIChwb3N0b3JkZXJOdW1zW3BhcmVudF0ubG93ID4gbG93IHx8IGxpbSA+IHBvc3RvcmRlck51bXNbcGFyZW50XS5saW0pKTtcbiAgbGNhID0gcGFyZW50O1xuXG4gIC8vIFRyYXZlcnNlIGZyb20gdyB0byBMQ0FcbiAgcGFyZW50ID0gdztcbiAgd2hpbGUgKChwYXJlbnQgPSBnLnBhcmVudChwYXJlbnQpKSAhPT0gbGNhKSB7XG4gICAgd1BhdGgucHVzaChwYXJlbnQpO1xuICB9XG5cbiAgcmV0dXJuIHsgcGF0aDogdlBhdGguY29uY2F0KHdQYXRoLnJldmVyc2UoKSksIGxjYTogbGNhIH07XG59XG5cbmZ1bmN0aW9uIHBvc3RvcmRlcihnKSB7XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgdmFyIGxpbSA9IDA7XG5cbiAgZnVuY3Rpb24gZGZzKHYpIHtcbiAgICB2YXIgbG93ID0gbGltO1xuICAgIF8uZm9yRWFjaChnLmNoaWxkcmVuKHYpLCBkZnMpO1xuICAgIHJlc3VsdFt2XSA9IHsgbG93OiBsb3csIGxpbTogbGltKysgfTtcbiAgfVxuICBfLmZvckVhY2goZy5jaGlsZHJlbigpLCBkZnMpO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xudmFyIEdyYXBoID0gcmVxdWlyZShcIi4uL2dyYXBobGliXCIpLkdyYXBoO1xudmFyIHV0aWwgPSByZXF1aXJlKFwiLi4vdXRpbFwiKTtcblxuLypcbiAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGNvb3JkaW5hdGUgYXNzaWdubWVudCBiYXNlZCBvbiBCcmFuZGVzIGFuZCBLw7ZwZiwgXCJGYXN0XG4gKiBhbmQgU2ltcGxlIEhvcml6b250YWwgQ29vcmRpbmF0ZSBBc3NpZ25tZW50LlwiXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHBvc2l0aW9uWDogcG9zaXRpb25YLFxuICBmaW5kVHlwZTFDb25mbGljdHM6IGZpbmRUeXBlMUNvbmZsaWN0cyxcbiAgZmluZFR5cGUyQ29uZmxpY3RzOiBmaW5kVHlwZTJDb25mbGljdHMsXG4gIGFkZENvbmZsaWN0OiBhZGRDb25mbGljdCxcbiAgaGFzQ29uZmxpY3Q6IGhhc0NvbmZsaWN0LFxuICB2ZXJ0aWNhbEFsaWdubWVudDogdmVydGljYWxBbGlnbm1lbnQsXG4gIGhvcml6b250YWxDb21wYWN0aW9uOiBob3Jpem9udGFsQ29tcGFjdGlvbixcbiAgYWxpZ25Db29yZGluYXRlczogYWxpZ25Db29yZGluYXRlcyxcbiAgZmluZFNtYWxsZXN0V2lkdGhBbGlnbm1lbnQ6IGZpbmRTbWFsbGVzdFdpZHRoQWxpZ25tZW50LFxuICBiYWxhbmNlOiBiYWxhbmNlXG59O1xuXG4vKlxuICogTWFya3MgYWxsIGVkZ2VzIGluIHRoZSBncmFwaCB3aXRoIGEgdHlwZS0xIGNvbmZsaWN0IHdpdGggdGhlIFwidHlwZTFDb25mbGljdFwiXG4gKiBwcm9wZXJ0eS4gQSB0eXBlLTEgY29uZmxpY3QgaXMgb25lIHdoZXJlIGEgbm9uLWlubmVyIHNlZ21lbnQgY3Jvc3NlcyBhblxuICogaW5uZXIgc2VnbWVudC4gQW4gaW5uZXIgc2VnbWVudCBpcyBhbiBlZGdlIHdpdGggYm90aCBpbmNpZGVudCBub2RlcyBtYXJrZWRcbiAqIHdpdGggdGhlIFwiZHVtbXlcIiBwcm9wZXJ0eS5cbiAqXG4gKiBUaGlzIGFsZ29yaXRobSBzY2FucyBsYXllciBieSBsYXllciwgc3RhcnRpbmcgd2l0aCB0aGUgc2Vjb25kLCBmb3IgdHlwZS0xXG4gKiBjb25mbGljdHMgYmV0d2VlbiB0aGUgY3VycmVudCBsYXllciBhbmQgdGhlIHByZXZpb3VzIGxheWVyLiBGb3IgZWFjaCBsYXllclxuICogaXQgc2NhbnMgdGhlIG5vZGVzIGZyb20gbGVmdCB0byByaWdodCB1bnRpbCBpdCByZWFjaGVzIG9uZSB0aGF0IGlzIGluY2lkZW50XG4gKiBvbiBhbiBpbm5lciBzZWdtZW50LiBJdCB0aGVuIHNjYW5zIHByZWRlY2Vzc29ycyB0byBkZXRlcm1pbmUgaWYgdGhleSBoYXZlXG4gKiBlZGdlcyB0aGF0IGNyb3NzIHRoYXQgaW5uZXIgc2VnbWVudC4gQXQgdGhlIGVuZCBhIGZpbmFsIHNjYW4gaXMgZG9uZSBmb3IgYWxsXG4gKiBub2RlcyBvbiB0aGUgY3VycmVudCByYW5rIHRvIHNlZSBpZiB0aGV5IGNyb3NzIHRoZSBsYXN0IHZpc2l0ZWQgaW5uZXJcbiAqIHNlZ21lbnQuXG4gKlxuICogVGhpcyBhbGdvcml0aG0gKHNhZmVseSkgYXNzdW1lcyB0aGF0IGEgZHVtbXkgbm9kZSB3aWxsIG9ubHkgYmUgaW5jaWRlbnQgb24gYVxuICogc2luZ2xlIG5vZGUgaW4gdGhlIGxheWVycyBiZWluZyBzY2FubmVkLlxuICovXG5mdW5jdGlvbiBmaW5kVHlwZTFDb25mbGljdHMoZywgbGF5ZXJpbmcpIHtcbiAgdmFyIGNvbmZsaWN0cyA9IHt9O1xuXG4gIGZ1bmN0aW9uIHZpc2l0TGF5ZXIocHJldkxheWVyLCBsYXllcikge1xuICAgIHZhclxuICAgICAgLy8gbGFzdCB2aXNpdGVkIG5vZGUgaW4gdGhlIHByZXZpb3VzIGxheWVyIHRoYXQgaXMgaW5jaWRlbnQgb24gYW4gaW5uZXJcbiAgICAgIC8vIHNlZ21lbnQuXG4gICAgICBrMCA9IDAsXG4gICAgICAvLyBUcmFja3MgdGhlIGxhc3Qgbm9kZSBpbiB0aGlzIGxheWVyIHNjYW5uZWQgZm9yIGNyb3NzaW5ncyB3aXRoIGEgdHlwZS0xXG4gICAgICAvLyBzZWdtZW50LlxuICAgICAgc2NhblBvcyA9IDAsXG4gICAgICBwcmV2TGF5ZXJMZW5ndGggPSBwcmV2TGF5ZXIubGVuZ3RoLFxuICAgICAgbGFzdE5vZGUgPSBfLmxhc3QobGF5ZXIpO1xuXG4gICAgXy5mb3JFYWNoKGxheWVyLCBmdW5jdGlvbih2LCBpKSB7XG4gICAgICB2YXIgdyA9IGZpbmRPdGhlcklubmVyU2VnbWVudE5vZGUoZywgdiksXG4gICAgICAgIGsxID0gdyA/IGcubm9kZSh3KS5vcmRlciA6IHByZXZMYXllckxlbmd0aDtcblxuICAgICAgaWYgKHcgfHwgdiA9PT0gbGFzdE5vZGUpIHtcbiAgICAgICAgXy5mb3JFYWNoKGxheWVyLnNsaWNlKHNjYW5Qb3MsIGkgKzEpLCBmdW5jdGlvbihzY2FuTm9kZSkge1xuICAgICAgICAgIF8uZm9yRWFjaChnLnByZWRlY2Vzc29ycyhzY2FuTm9kZSksIGZ1bmN0aW9uKHUpIHtcbiAgICAgICAgICAgIHZhciB1TGFiZWwgPSBnLm5vZGUodSksXG4gICAgICAgICAgICAgIHVQb3MgPSB1TGFiZWwub3JkZXI7XG4gICAgICAgICAgICBpZiAoKHVQb3MgPCBrMCB8fCBrMSA8IHVQb3MpICYmXG4gICAgICAgICAgICAgICAgISh1TGFiZWwuZHVtbXkgJiYgZy5ub2RlKHNjYW5Ob2RlKS5kdW1teSkpIHtcbiAgICAgICAgICAgICAgYWRkQ29uZmxpY3QoY29uZmxpY3RzLCB1LCBzY2FuTm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBzY2FuUG9zID0gaSArIDE7XG4gICAgICAgIGswID0gazE7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbGF5ZXI7XG4gIH1cblxuICBfLnJlZHVjZShsYXllcmluZywgdmlzaXRMYXllcik7XG4gIHJldHVybiBjb25mbGljdHM7XG59XG5cbmZ1bmN0aW9uIGZpbmRUeXBlMkNvbmZsaWN0cyhnLCBsYXllcmluZykge1xuICB2YXIgY29uZmxpY3RzID0ge307XG5cbiAgZnVuY3Rpb24gc2Nhbihzb3V0aCwgc291dGhQb3MsIHNvdXRoRW5kLCBwcmV2Tm9ydGhCb3JkZXIsIG5leHROb3J0aEJvcmRlcikge1xuICAgIHZhciB2O1xuICAgIF8uZm9yRWFjaChfLnJhbmdlKHNvdXRoUG9zLCBzb3V0aEVuZCksIGZ1bmN0aW9uKGkpIHtcbiAgICAgIHYgPSBzb3V0aFtpXTtcbiAgICAgIGlmIChnLm5vZGUodikuZHVtbXkpIHtcbiAgICAgICAgXy5mb3JFYWNoKGcucHJlZGVjZXNzb3JzKHYpLCBmdW5jdGlvbih1KSB7XG4gICAgICAgICAgdmFyIHVOb2RlID0gZy5ub2RlKHUpO1xuICAgICAgICAgIGlmICh1Tm9kZS5kdW1teSAmJlxuICAgICAgICAgICAgICAodU5vZGUub3JkZXIgPCBwcmV2Tm9ydGhCb3JkZXIgfHwgdU5vZGUub3JkZXIgPiBuZXh0Tm9ydGhCb3JkZXIpKSB7XG4gICAgICAgICAgICBhZGRDb25mbGljdChjb25mbGljdHMsIHUsIHYpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuXG4gIGZ1bmN0aW9uIHZpc2l0TGF5ZXIobm9ydGgsIHNvdXRoKSB7XG4gICAgdmFyIHByZXZOb3J0aFBvcyA9IC0xLFxuICAgICAgbmV4dE5vcnRoUG9zLFxuICAgICAgc291dGhQb3MgPSAwO1xuXG4gICAgXy5mb3JFYWNoKHNvdXRoLCBmdW5jdGlvbih2LCBzb3V0aExvb2thaGVhZCkge1xuICAgICAgaWYgKGcubm9kZSh2KS5kdW1teSA9PT0gXCJib3JkZXJcIikge1xuICAgICAgICB2YXIgcHJlZGVjZXNzb3JzID0gZy5wcmVkZWNlc3NvcnModik7XG4gICAgICAgIGlmIChwcmVkZWNlc3NvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgbmV4dE5vcnRoUG9zID0gZy5ub2RlKHByZWRlY2Vzc29yc1swXSkub3JkZXI7XG4gICAgICAgICAgc2Nhbihzb3V0aCwgc291dGhQb3MsIHNvdXRoTG9va2FoZWFkLCBwcmV2Tm9ydGhQb3MsIG5leHROb3J0aFBvcyk7XG4gICAgICAgICAgc291dGhQb3MgPSBzb3V0aExvb2thaGVhZDtcbiAgICAgICAgICBwcmV2Tm9ydGhQb3MgPSBuZXh0Tm9ydGhQb3M7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHNjYW4oc291dGgsIHNvdXRoUG9zLCBzb3V0aC5sZW5ndGgsIG5leHROb3J0aFBvcywgbm9ydGgubGVuZ3RoKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBzb3V0aDtcbiAgfVxuXG4gIF8ucmVkdWNlKGxheWVyaW5nLCB2aXNpdExheWVyKTtcbiAgcmV0dXJuIGNvbmZsaWN0cztcbn1cblxuZnVuY3Rpb24gZmluZE90aGVySW5uZXJTZWdtZW50Tm9kZShnLCB2KSB7XG4gIGlmIChnLm5vZGUodikuZHVtbXkpIHtcbiAgICByZXR1cm4gXy5maW5kKGcucHJlZGVjZXNzb3JzKHYpLCBmdW5jdGlvbih1KSB7XG4gICAgICByZXR1cm4gZy5ub2RlKHUpLmR1bW15O1xuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFkZENvbmZsaWN0KGNvbmZsaWN0cywgdiwgdykge1xuICBpZiAodiA+IHcpIHtcbiAgICB2YXIgdG1wID0gdjtcbiAgICB2ID0gdztcbiAgICB3ID0gdG1wO1xuICB9XG5cbiAgdmFyIGNvbmZsaWN0c1YgPSBjb25mbGljdHNbdl07XG4gIGlmICghY29uZmxpY3RzVikge1xuICAgIGNvbmZsaWN0c1t2XSA9IGNvbmZsaWN0c1YgPSB7fTtcbiAgfVxuICBjb25mbGljdHNWW3ddID0gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaGFzQ29uZmxpY3QoY29uZmxpY3RzLCB2LCB3KSB7XG4gIGlmICh2ID4gdykge1xuICAgIHZhciB0bXAgPSB2O1xuICAgIHYgPSB3O1xuICAgIHcgPSB0bXA7XG4gIH1cbiAgcmV0dXJuIF8uaGFzKGNvbmZsaWN0c1t2XSwgdyk7XG59XG5cbi8qXG4gKiBUcnkgdG8gYWxpZ24gbm9kZXMgaW50byB2ZXJ0aWNhbCBcImJsb2Nrc1wiIHdoZXJlIHBvc3NpYmxlLiBUaGlzIGFsZ29yaXRobVxuICogYXR0ZW1wdHMgdG8gYWxpZ24gYSBub2RlIHdpdGggb25lIG9mIGl0cyBtZWRpYW4gbmVpZ2hib3JzLiBJZiB0aGUgZWRnZVxuICogY29ubmVjdGluZyBhIG5laWdoYm9yIGlzIGEgdHlwZS0xIGNvbmZsaWN0IHRoZW4gd2UgaWdub3JlIHRoYXQgcG9zc2liaWxpdHkuXG4gKiBJZiBhIHByZXZpb3VzIG5vZGUgaGFzIGFscmVhZHkgZm9ybWVkIGEgYmxvY2sgd2l0aCBhIG5vZGUgYWZ0ZXIgdGhlIG5vZGVcbiAqIHdlJ3JlIHRyeWluZyB0byBmb3JtIGEgYmxvY2sgd2l0aCwgd2UgYWxzbyBpZ25vcmUgdGhhdCBwb3NzaWJpbGl0eSAtIG91clxuICogYmxvY2tzIHdvdWxkIGJlIHNwbGl0IGluIHRoYXQgc2NlbmFyaW8uXG4gKi9cbmZ1bmN0aW9uIHZlcnRpY2FsQWxpZ25tZW50KGcsIGxheWVyaW5nLCBjb25mbGljdHMsIG5laWdoYm9yRm4pIHtcbiAgdmFyIHJvb3QgPSB7fSxcbiAgICBhbGlnbiA9IHt9LFxuICAgIHBvcyA9IHt9O1xuXG4gIC8vIFdlIGNhY2hlIHRoZSBwb3NpdGlvbiBoZXJlIGJhc2VkIG9uIHRoZSBsYXllcmluZyBiZWNhdXNlIHRoZSBncmFwaCBhbmRcbiAgLy8gbGF5ZXJpbmcgbWF5IGJlIG91dCBvZiBzeW5jLiBUaGUgbGF5ZXJpbmcgbWF0cml4IGlzIG1hbmlwdWxhdGVkIHRvXG4gIC8vIGdlbmVyYXRlIGRpZmZlcmVudCBleHRyZW1lIGFsaWdubWVudHMuXG4gIF8uZm9yRWFjaChsYXllcmluZywgZnVuY3Rpb24obGF5ZXIpIHtcbiAgICBfLmZvckVhY2gobGF5ZXIsIGZ1bmN0aW9uKHYsIG9yZGVyKSB7XG4gICAgICByb290W3ZdID0gdjtcbiAgICAgIGFsaWduW3ZdID0gdjtcbiAgICAgIHBvc1t2XSA9IG9yZGVyO1xuICAgIH0pO1xuICB9KTtcblxuICBfLmZvckVhY2gobGF5ZXJpbmcsIGZ1bmN0aW9uKGxheWVyKSB7XG4gICAgdmFyIHByZXZJZHggPSAtMTtcbiAgICBfLmZvckVhY2gobGF5ZXIsIGZ1bmN0aW9uKHYpIHtcbiAgICAgIHZhciB3cyA9IG5laWdoYm9yRm4odik7XG4gICAgICBpZiAod3MubGVuZ3RoKSB7XG4gICAgICAgIHdzID0gXy5zb3J0Qnkod3MsIGZ1bmN0aW9uKHcpIHsgcmV0dXJuIHBvc1t3XTsgfSk7XG4gICAgICAgIHZhciBtcCA9ICh3cy5sZW5ndGggLSAxKSAvIDI7XG4gICAgICAgIGZvciAodmFyIGkgPSBNYXRoLmZsb29yKG1wKSwgaWwgPSBNYXRoLmNlaWwobXApOyBpIDw9IGlsOyArK2kpIHtcbiAgICAgICAgICB2YXIgdyA9IHdzW2ldO1xuICAgICAgICAgIGlmIChhbGlnblt2XSA9PT0gdiAmJlxuICAgICAgICAgICAgICBwcmV2SWR4IDwgcG9zW3ddICYmXG4gICAgICAgICAgICAgICFoYXNDb25mbGljdChjb25mbGljdHMsIHYsIHcpKSB7XG4gICAgICAgICAgICBhbGlnblt3XSA9IHY7XG4gICAgICAgICAgICBhbGlnblt2XSA9IHJvb3Rbdl0gPSByb290W3ddO1xuICAgICAgICAgICAgcHJldklkeCA9IHBvc1t3XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHsgcm9vdDogcm9vdCwgYWxpZ246IGFsaWduIH07XG59XG5cbmZ1bmN0aW9uIGhvcml6b250YWxDb21wYWN0aW9uKGcsIGxheWVyaW5nLCByb290LCBhbGlnbiwgcmV2ZXJzZVNlcCkge1xuICAvLyBUaGlzIHBvcnRpb24gb2YgdGhlIGFsZ29yaXRobSBkaWZmZXJzIGZyb20gQksgZHVlIHRvIGEgbnVtYmVyIG9mIHByb2JsZW1zLlxuICAvLyBJbnN0ZWFkIG9mIHRoZWlyIGFsZ29yaXRobSB3ZSBjb25zdHJ1Y3QgYSBuZXcgYmxvY2sgZ3JhcGggYW5kIGRvIHR3b1xuICAvLyBzd2VlcHMuIFRoZSBmaXJzdCBzd2VlcCBwbGFjZXMgYmxvY2tzIHdpdGggdGhlIHNtYWxsZXN0IHBvc3NpYmxlXG4gIC8vIGNvb3JkaW5hdGVzLiBUaGUgc2Vjb25kIHN3ZWVwIHJlbW92ZXMgdW51c2VkIHNwYWNlIGJ5IG1vdmluZyBibG9ja3MgdG8gdGhlXG4gIC8vIGdyZWF0ZXN0IGNvb3JkaW5hdGVzIHdpdGhvdXQgdmlvbGF0aW5nIHNlcGFyYXRpb24uXG4gIHZhciB4cyA9IHt9LFxuICAgIGJsb2NrRyA9IGJ1aWxkQmxvY2tHcmFwaChnLCBsYXllcmluZywgcm9vdCwgcmV2ZXJzZVNlcCksXG4gICAgYm9yZGVyVHlwZSA9IHJldmVyc2VTZXAgPyBcImJvcmRlckxlZnRcIiA6IFwiYm9yZGVyUmlnaHRcIjtcblxuICBmdW5jdGlvbiBpdGVyYXRlKHNldFhzRnVuYywgbmV4dE5vZGVzRnVuYykge1xuICAgIHZhciBzdGFjayA9IGJsb2NrRy5ub2RlcygpO1xuICAgIHZhciBlbGVtID0gc3RhY2sucG9wKCk7XG4gICAgdmFyIHZpc2l0ZWQgPSB7fTtcbiAgICB3aGlsZSAoZWxlbSkge1xuICAgICAgaWYgKHZpc2l0ZWRbZWxlbV0pIHtcbiAgICAgICAgc2V0WHNGdW5jKGVsZW0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmlzaXRlZFtlbGVtXSA9IHRydWU7XG4gICAgICAgIHN0YWNrLnB1c2goZWxlbSk7XG4gICAgICAgIHN0YWNrID0gc3RhY2suY29uY2F0KG5leHROb2Rlc0Z1bmMoZWxlbSkpO1xuICAgICAgfVxuXG4gICAgICBlbGVtID0gc3RhY2sucG9wKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gRmlyc3QgcGFzcywgYXNzaWduIHNtYWxsZXN0IGNvb3JkaW5hdGVzXG4gIGZ1bmN0aW9uIHBhc3MxKGVsZW0pIHtcbiAgICB4c1tlbGVtXSA9IGJsb2NrRy5pbkVkZ2VzKGVsZW0pLnJlZHVjZShmdW5jdGlvbihhY2MsIGUpIHtcbiAgICAgIHJldHVybiBNYXRoLm1heChhY2MsIHhzW2Uudl0gKyBibG9ja0cuZWRnZShlKSk7XG4gICAgfSwgMCk7XG4gIH1cblxuICAvLyBTZWNvbmQgcGFzcywgYXNzaWduIGdyZWF0ZXN0IGNvb3JkaW5hdGVzXG4gIGZ1bmN0aW9uIHBhc3MyKGVsZW0pIHtcbiAgICB2YXIgbWluID0gYmxvY2tHLm91dEVkZ2VzKGVsZW0pLnJlZHVjZShmdW5jdGlvbihhY2MsIGUpIHtcbiAgICAgIHJldHVybiBNYXRoLm1pbihhY2MsIHhzW2Uud10gLSBibG9ja0cuZWRnZShlKSk7XG4gICAgfSwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTtcblxuICAgIHZhciBub2RlID0gZy5ub2RlKGVsZW0pO1xuICAgIGlmIChtaW4gIT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSAmJiBub2RlLmJvcmRlclR5cGUgIT09IGJvcmRlclR5cGUpIHtcbiAgICAgIHhzW2VsZW1dID0gTWF0aC5tYXgoeHNbZWxlbV0sIG1pbik7XG4gICAgfVxuICB9XG5cbiAgaXRlcmF0ZShwYXNzMSwgYmxvY2tHLnByZWRlY2Vzc29ycy5iaW5kKGJsb2NrRykpO1xuICBpdGVyYXRlKHBhc3MyLCBibG9ja0cuc3VjY2Vzc29ycy5iaW5kKGJsb2NrRykpO1xuXG4gIC8vIEFzc2lnbiB4IGNvb3JkaW5hdGVzIHRvIGFsbCBub2Rlc1xuICBfLmZvckVhY2goYWxpZ24sIGZ1bmN0aW9uKHYpIHtcbiAgICB4c1t2XSA9IHhzW3Jvb3Rbdl1dO1xuICB9KTtcblxuICByZXR1cm4geHM7XG59XG5cblxuZnVuY3Rpb24gYnVpbGRCbG9ja0dyYXBoKGcsIGxheWVyaW5nLCByb290LCByZXZlcnNlU2VwKSB7XG4gIHZhciBibG9ja0dyYXBoID0gbmV3IEdyYXBoKCksXG4gICAgZ3JhcGhMYWJlbCA9IGcuZ3JhcGgoKSxcbiAgICBzZXBGbiA9IHNlcChncmFwaExhYmVsLm5vZGVzZXAsIGdyYXBoTGFiZWwuZWRnZXNlcCwgcmV2ZXJzZVNlcCk7XG5cbiAgXy5mb3JFYWNoKGxheWVyaW5nLCBmdW5jdGlvbihsYXllcikge1xuICAgIHZhciB1O1xuICAgIF8uZm9yRWFjaChsYXllciwgZnVuY3Rpb24odikge1xuICAgICAgdmFyIHZSb290ID0gcm9vdFt2XTtcbiAgICAgIGJsb2NrR3JhcGguc2V0Tm9kZSh2Um9vdCk7XG4gICAgICBpZiAodSkge1xuICAgICAgICB2YXIgdVJvb3QgPSByb290W3VdLFxuICAgICAgICAgIHByZXZNYXggPSBibG9ja0dyYXBoLmVkZ2UodVJvb3QsIHZSb290KTtcbiAgICAgICAgYmxvY2tHcmFwaC5zZXRFZGdlKHVSb290LCB2Um9vdCwgTWF0aC5tYXgoc2VwRm4oZywgdiwgdSksIHByZXZNYXggfHwgMCkpO1xuICAgICAgfVxuICAgICAgdSA9IHY7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiBibG9ja0dyYXBoO1xufVxuXG4vKlxuICogUmV0dXJucyB0aGUgYWxpZ25tZW50IHRoYXQgaGFzIHRoZSBzbWFsbGVzdCB3aWR0aCBvZiB0aGUgZ2l2ZW4gYWxpZ25tZW50cy5cbiAqL1xuZnVuY3Rpb24gZmluZFNtYWxsZXN0V2lkdGhBbGlnbm1lbnQoZywgeHNzKSB7XG4gIHJldHVybiBfLm1pbkJ5KF8udmFsdWVzKHhzcyksIGZ1bmN0aW9uICh4cykge1xuICAgIHZhciBtYXggPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG4gICAgdmFyIG1pbiA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcblxuICAgIF8uZm9ySW4oeHMsIGZ1bmN0aW9uICh4LCB2KSB7XG4gICAgICB2YXIgaGFsZldpZHRoID0gd2lkdGgoZywgdikgLyAyO1xuXG4gICAgICBtYXggPSBNYXRoLm1heCh4ICsgaGFsZldpZHRoLCBtYXgpO1xuICAgICAgbWluID0gTWF0aC5taW4oeCAtIGhhbGZXaWR0aCwgbWluKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBtYXggLSBtaW47XG4gIH0pO1xufVxuXG4vKlxuICogQWxpZ24gdGhlIGNvb3JkaW5hdGVzIG9mIGVhY2ggb2YgdGhlIGxheW91dCBhbGlnbm1lbnRzIHN1Y2ggdGhhdFxuICogbGVmdC1iaWFzZWQgYWxpZ25tZW50cyBoYXZlIHRoZWlyIG1pbmltdW0gY29vcmRpbmF0ZSBhdCB0aGUgc2FtZSBwb2ludCBhc1xuICogdGhlIG1pbmltdW0gY29vcmRpbmF0ZSBvZiB0aGUgc21hbGxlc3Qgd2lkdGggYWxpZ25tZW50IGFuZCByaWdodC1iaWFzZWRcbiAqIGFsaWdubWVudHMgaGF2ZSB0aGVpciBtYXhpbXVtIGNvb3JkaW5hdGUgYXQgdGhlIHNhbWUgcG9pbnQgYXMgdGhlIG1heGltdW1cbiAqIGNvb3JkaW5hdGUgb2YgdGhlIHNtYWxsZXN0IHdpZHRoIGFsaWdubWVudC5cbiAqL1xuZnVuY3Rpb24gYWxpZ25Db29yZGluYXRlcyh4c3MsIGFsaWduVG8pIHtcbiAgdmFyIGFsaWduVG9WYWxzID0gXy52YWx1ZXMoYWxpZ25UbyksXG4gICAgYWxpZ25Ub01pbiA9IF8ubWluKGFsaWduVG9WYWxzKSxcbiAgICBhbGlnblRvTWF4ID0gXy5tYXgoYWxpZ25Ub1ZhbHMpO1xuXG4gIF8uZm9yRWFjaChbXCJ1XCIsIFwiZFwiXSwgZnVuY3Rpb24odmVydCkge1xuICAgIF8uZm9yRWFjaChbXCJsXCIsIFwiclwiXSwgZnVuY3Rpb24oaG9yaXopIHtcbiAgICAgIHZhciBhbGlnbm1lbnQgPSB2ZXJ0ICsgaG9yaXosXG4gICAgICAgIHhzID0geHNzW2FsaWdubWVudF0sXG4gICAgICAgIGRlbHRhO1xuICAgICAgaWYgKHhzID09PSBhbGlnblRvKSByZXR1cm47XG5cbiAgICAgIHZhciB4c1ZhbHMgPSBfLnZhbHVlcyh4cyk7XG4gICAgICBkZWx0YSA9IGhvcml6ID09PSBcImxcIiA/IGFsaWduVG9NaW4gLSBfLm1pbih4c1ZhbHMpIDogYWxpZ25Ub01heCAtIF8ubWF4KHhzVmFscyk7XG5cbiAgICAgIGlmIChkZWx0YSkge1xuICAgICAgICB4c3NbYWxpZ25tZW50XSA9IF8ubWFwVmFsdWVzKHhzLCBmdW5jdGlvbih4KSB7IHJldHVybiB4ICsgZGVsdGE7IH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gYmFsYW5jZSh4c3MsIGFsaWduKSB7XG4gIHJldHVybiBfLm1hcFZhbHVlcyh4c3MudWwsIGZ1bmN0aW9uKGlnbm9yZSwgdikge1xuICAgIGlmIChhbGlnbikge1xuICAgICAgcmV0dXJuIHhzc1thbGlnbi50b0xvd2VyQ2FzZSgpXVt2XTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHhzID0gXy5zb3J0QnkoXy5tYXAoeHNzLCB2KSk7XG4gICAgICByZXR1cm4gKHhzWzFdICsgeHNbMl0pIC8gMjtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBwb3NpdGlvblgoZykge1xuICB2YXIgbGF5ZXJpbmcgPSB1dGlsLmJ1aWxkTGF5ZXJNYXRyaXgoZyk7XG4gIHZhciBjb25mbGljdHMgPSBfLm1lcmdlKFxuICAgIGZpbmRUeXBlMUNvbmZsaWN0cyhnLCBsYXllcmluZyksXG4gICAgZmluZFR5cGUyQ29uZmxpY3RzKGcsIGxheWVyaW5nKSk7XG5cbiAgdmFyIHhzcyA9IHt9O1xuICB2YXIgYWRqdXN0ZWRMYXllcmluZztcbiAgXy5mb3JFYWNoKFtcInVcIiwgXCJkXCJdLCBmdW5jdGlvbih2ZXJ0KSB7XG4gICAgYWRqdXN0ZWRMYXllcmluZyA9IHZlcnQgPT09IFwidVwiID8gbGF5ZXJpbmcgOiBfLnZhbHVlcyhsYXllcmluZykucmV2ZXJzZSgpO1xuICAgIF8uZm9yRWFjaChbXCJsXCIsIFwiclwiXSwgZnVuY3Rpb24oaG9yaXopIHtcbiAgICAgIGlmIChob3JpeiA9PT0gXCJyXCIpIHtcbiAgICAgICAgYWRqdXN0ZWRMYXllcmluZyA9IF8ubWFwKGFkanVzdGVkTGF5ZXJpbmcsIGZ1bmN0aW9uKGlubmVyKSB7XG4gICAgICAgICAgcmV0dXJuIF8udmFsdWVzKGlubmVyKS5yZXZlcnNlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB2YXIgbmVpZ2hib3JGbiA9ICh2ZXJ0ID09PSBcInVcIiA/IGcucHJlZGVjZXNzb3JzIDogZy5zdWNjZXNzb3JzKS5iaW5kKGcpO1xuICAgICAgdmFyIGFsaWduID0gdmVydGljYWxBbGlnbm1lbnQoZywgYWRqdXN0ZWRMYXllcmluZywgY29uZmxpY3RzLCBuZWlnaGJvckZuKTtcbiAgICAgIHZhciB4cyA9IGhvcml6b250YWxDb21wYWN0aW9uKGcsIGFkanVzdGVkTGF5ZXJpbmcsXG4gICAgICAgIGFsaWduLnJvb3QsIGFsaWduLmFsaWduLCBob3JpeiA9PT0gXCJyXCIpO1xuICAgICAgaWYgKGhvcml6ID09PSBcInJcIikge1xuICAgICAgICB4cyA9IF8ubWFwVmFsdWVzKHhzLCBmdW5jdGlvbih4KSB7IHJldHVybiAteDsgfSk7XG4gICAgICB9XG4gICAgICB4c3NbdmVydCArIGhvcml6XSA9IHhzO1xuICAgIH0pO1xuICB9KTtcblxuICB2YXIgc21hbGxlc3RXaWR0aCA9IGZpbmRTbWFsbGVzdFdpZHRoQWxpZ25tZW50KGcsIHhzcyk7XG4gIGFsaWduQ29vcmRpbmF0ZXMoeHNzLCBzbWFsbGVzdFdpZHRoKTtcbiAgcmV0dXJuIGJhbGFuY2UoeHNzLCBnLmdyYXBoKCkuYWxpZ24pO1xufVxuXG5mdW5jdGlvbiBzZXAobm9kZVNlcCwgZWRnZVNlcCwgcmV2ZXJzZVNlcCkge1xuICByZXR1cm4gZnVuY3Rpb24oZywgdiwgdykge1xuICAgIHZhciB2TGFiZWwgPSBnLm5vZGUodik7XG4gICAgdmFyIHdMYWJlbCA9IGcubm9kZSh3KTtcbiAgICB2YXIgc3VtID0gMDtcbiAgICB2YXIgZGVsdGE7XG5cbiAgICBzdW0gKz0gdkxhYmVsLndpZHRoIC8gMjtcbiAgICBpZiAoXy5oYXModkxhYmVsLCBcImxhYmVscG9zXCIpKSB7XG4gICAgICBzd2l0Y2ggKHZMYWJlbC5sYWJlbHBvcy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICBjYXNlIFwibFwiOiBkZWx0YSA9IC12TGFiZWwud2lkdGggLyAyOyBicmVhaztcbiAgICAgIGNhc2UgXCJyXCI6IGRlbHRhID0gdkxhYmVsLndpZHRoIC8gMjsgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkZWx0YSkge1xuICAgICAgc3VtICs9IHJldmVyc2VTZXAgPyBkZWx0YSA6IC1kZWx0YTtcbiAgICB9XG4gICAgZGVsdGEgPSAwO1xuXG4gICAgc3VtICs9ICh2TGFiZWwuZHVtbXkgPyBlZGdlU2VwIDogbm9kZVNlcCkgLyAyO1xuICAgIHN1bSArPSAod0xhYmVsLmR1bW15ID8gZWRnZVNlcCA6IG5vZGVTZXApIC8gMjtcblxuICAgIHN1bSArPSB3TGFiZWwud2lkdGggLyAyO1xuICAgIGlmIChfLmhhcyh3TGFiZWwsIFwibGFiZWxwb3NcIikpIHtcbiAgICAgIHN3aXRjaCAod0xhYmVsLmxhYmVscG9zLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIGNhc2UgXCJsXCI6IGRlbHRhID0gd0xhYmVsLndpZHRoIC8gMjsgYnJlYWs7XG4gICAgICBjYXNlIFwiclwiOiBkZWx0YSA9IC13TGFiZWwud2lkdGggLyAyOyBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRlbHRhKSB7XG4gICAgICBzdW0gKz0gcmV2ZXJzZVNlcCA/IGRlbHRhIDogLWRlbHRhO1xuICAgIH1cbiAgICBkZWx0YSA9IDA7XG5cbiAgICByZXR1cm4gc3VtO1xuICB9O1xufVxuXG5mdW5jdGlvbiB3aWR0aChnLCB2KSB7XG4gIHJldHVybiBnLm5vZGUodikud2lkdGg7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xudmFyIHV0aWwgPSByZXF1aXJlKFwiLi4vdXRpbFwiKTtcbnZhciBwb3NpdGlvblggPSByZXF1aXJlKFwiLi9ia1wiKS5wb3NpdGlvblg7XG5cbm1vZHVsZS5leHBvcnRzID0gcG9zaXRpb247XG5cbmZ1bmN0aW9uIHBvc2l0aW9uKGcpIHtcbiAgZyA9IHV0aWwuYXNOb25Db21wb3VuZEdyYXBoKGcpO1xuXG4gIHBvc2l0aW9uWShnKTtcbiAgXy5mb3JFYWNoKHBvc2l0aW9uWChnKSwgZnVuY3Rpb24oeCwgdikge1xuICAgIGcubm9kZSh2KS54ID0geDtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHBvc2l0aW9uWShnKSB7XG4gIHZhciBsYXllcmluZyA9IHV0aWwuYnVpbGRMYXllck1hdHJpeChnKTtcbiAgdmFyIHJhbmtTZXAgPSBnLmdyYXBoKCkucmFua3NlcDtcbiAgdmFyIHByZXZZID0gMDtcbiAgXy5mb3JFYWNoKGxheWVyaW5nLCBmdW5jdGlvbihsYXllcikge1xuICAgIHZhciBtYXhIZWlnaHQgPSBfLm1heChfLm1hcChsYXllciwgZnVuY3Rpb24odikgeyByZXR1cm4gZy5ub2RlKHYpLmhlaWdodDsgfSkpO1xuICAgIF8uZm9yRWFjaChsYXllciwgZnVuY3Rpb24odikge1xuICAgICAgZy5ub2RlKHYpLnkgPSBwcmV2WSArIG1heEhlaWdodCAvIDI7XG4gICAgfSk7XG4gICAgcHJldlkgKz0gbWF4SGVpZ2h0ICsgcmFua1NlcDtcbiAgfSk7XG59XG5cbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG52YXIgR3JhcGggPSByZXF1aXJlKFwiLi4vZ3JhcGhsaWJcIikuR3JhcGg7XG52YXIgc2xhY2sgPSByZXF1aXJlKFwiLi91dGlsXCIpLnNsYWNrO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZlYXNpYmxlVHJlZTtcblxuLypcbiAqIENvbnN0cnVjdHMgYSBzcGFubmluZyB0cmVlIHdpdGggdGlnaHQgZWRnZXMgYW5kIGFkanVzdGVkIHRoZSBpbnB1dCBub2RlJ3NcbiAqIHJhbmtzIHRvIGFjaGlldmUgdGhpcy4gQSB0aWdodCBlZGdlIGlzIG9uZSB0aGF0IGlzIGhhcyBhIGxlbmd0aCB0aGF0IG1hdGNoZXNcbiAqIGl0cyBcIm1pbmxlblwiIGF0dHJpYnV0ZS5cbiAqXG4gKiBUaGUgYmFzaWMgc3RydWN0dXJlIGZvciB0aGlzIGZ1bmN0aW9uIGlzIGRlcml2ZWQgZnJvbSBHYW5zbmVyLCBldCBhbC4sIFwiQVxuICogVGVjaG5pcXVlIGZvciBEcmF3aW5nIERpcmVjdGVkIEdyYXBocy5cIlxuICpcbiAqIFByZS1jb25kaXRpb25zOlxuICpcbiAqICAgIDEuIEdyYXBoIG11c3QgYmUgYSBEQUcuXG4gKiAgICAyLiBHcmFwaCBtdXN0IGJlIGNvbm5lY3RlZC5cbiAqICAgIDMuIEdyYXBoIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgbm9kZS5cbiAqICAgIDUuIEdyYXBoIG5vZGVzIG11c3QgaGF2ZSBiZWVuIHByZXZpb3VzbHkgYXNzaWduZWQgYSBcInJhbmtcIiBwcm9wZXJ0eSB0aGF0XG4gKiAgICAgICByZXNwZWN0cyB0aGUgXCJtaW5sZW5cIiBwcm9wZXJ0eSBvZiBpbmNpZGVudCBlZGdlcy5cbiAqICAgIDYuIEdyYXBoIGVkZ2VzIG11c3QgaGF2ZSBhIFwibWlubGVuXCIgcHJvcGVydHkuXG4gKlxuICogUG9zdC1jb25kaXRpb25zOlxuICpcbiAqICAgIC0gR3JhcGggbm9kZXMgd2lsbCBoYXZlIHRoZWlyIHJhbmsgYWRqdXN0ZWQgdG8gZW5zdXJlIHRoYXQgYWxsIGVkZ2VzIGFyZVxuICogICAgICB0aWdodC5cbiAqXG4gKiBSZXR1cm5zIGEgdHJlZSAodW5kaXJlY3RlZCBncmFwaCkgdGhhdCBpcyBjb25zdHJ1Y3RlZCB1c2luZyBvbmx5IFwidGlnaHRcIlxuICogZWRnZXMuXG4gKi9cbmZ1bmN0aW9uIGZlYXNpYmxlVHJlZShnKSB7XG4gIHZhciB0ID0gbmV3IEdyYXBoKHsgZGlyZWN0ZWQ6IGZhbHNlIH0pO1xuXG4gIC8vIENob29zZSBhcmJpdHJhcnkgbm9kZSBmcm9tIHdoaWNoIHRvIHN0YXJ0IG91ciB0cmVlXG4gIHZhciBzdGFydCA9IGcubm9kZXMoKVswXTtcbiAgdmFyIHNpemUgPSBnLm5vZGVDb3VudCgpO1xuICB0LnNldE5vZGUoc3RhcnQsIHt9KTtcblxuICB2YXIgZWRnZSwgZGVsdGE7XG4gIHdoaWxlICh0aWdodFRyZWUodCwgZykgPCBzaXplKSB7XG4gICAgZWRnZSA9IGZpbmRNaW5TbGFja0VkZ2UodCwgZyk7XG4gICAgZGVsdGEgPSB0Lmhhc05vZGUoZWRnZS52KSA/IHNsYWNrKGcsIGVkZ2UpIDogLXNsYWNrKGcsIGVkZ2UpO1xuICAgIHNoaWZ0UmFua3ModCwgZywgZGVsdGEpO1xuICB9XG5cbiAgcmV0dXJuIHQ7XG59XG5cbi8qXG4gKiBGaW5kcyBhIG1heGltYWwgdHJlZSBvZiB0aWdodCBlZGdlcyBhbmQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIG5vZGVzIGluIHRoZVxuICogdHJlZS5cbiAqL1xuZnVuY3Rpb24gdGlnaHRUcmVlKHQsIGcpIHtcbiAgZnVuY3Rpb24gZGZzKHYpIHtcbiAgICBfLmZvckVhY2goZy5ub2RlRWRnZXModiksIGZ1bmN0aW9uKGUpIHtcbiAgICAgIHZhciBlZGdlViA9IGUudixcbiAgICAgICAgdyA9ICh2ID09PSBlZGdlVikgPyBlLncgOiBlZGdlVjtcbiAgICAgIGlmICghdC5oYXNOb2RlKHcpICYmICFzbGFjayhnLCBlKSkge1xuICAgICAgICB0LnNldE5vZGUodywge30pO1xuICAgICAgICB0LnNldEVkZ2Uodiwgdywge30pO1xuICAgICAgICBkZnModyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBfLmZvckVhY2godC5ub2RlcygpLCBkZnMpO1xuICByZXR1cm4gdC5ub2RlQ291bnQoKTtcbn1cblxuLypcbiAqIEZpbmRzIHRoZSBlZGdlIHdpdGggdGhlIHNtYWxsZXN0IHNsYWNrIHRoYXQgaXMgaW5jaWRlbnQgb24gdHJlZSBhbmQgcmV0dXJuc1xuICogaXQuXG4gKi9cbmZ1bmN0aW9uIGZpbmRNaW5TbGFja0VkZ2UodCwgZykge1xuICByZXR1cm4gXy5taW5CeShnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICBpZiAodC5oYXNOb2RlKGUudikgIT09IHQuaGFzTm9kZShlLncpKSB7XG4gICAgICByZXR1cm4gc2xhY2soZywgZSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gc2hpZnRSYW5rcyh0LCBnLCBkZWx0YSkge1xuICBfLmZvckVhY2godC5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgZy5ub2RlKHYpLnJhbmsgKz0gZGVsdGE7XG4gIH0pO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciByYW5rVXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG52YXIgbG9uZ2VzdFBhdGggPSByYW5rVXRpbC5sb25nZXN0UGF0aDtcbnZhciBmZWFzaWJsZVRyZWUgPSByZXF1aXJlKFwiLi9mZWFzaWJsZS10cmVlXCIpO1xudmFyIG5ldHdvcmtTaW1wbGV4ID0gcmVxdWlyZShcIi4vbmV0d29yay1zaW1wbGV4XCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJhbms7XG5cbi8qXG4gKiBBc3NpZ25zIGEgcmFuayB0byBlYWNoIG5vZGUgaW4gdGhlIGlucHV0IGdyYXBoIHRoYXQgcmVzcGVjdHMgdGhlIFwibWlubGVuXCJcbiAqIGNvbnN0cmFpbnQgc3BlY2lmaWVkIG9uIGVkZ2VzIGJldHdlZW4gbm9kZXMuXG4gKlxuICogVGhpcyBiYXNpYyBzdHJ1Y3R1cmUgaXMgZGVyaXZlZCBmcm9tIEdhbnNuZXIsIGV0IGFsLiwgXCJBIFRlY2huaXF1ZSBmb3JcbiAqIERyYXdpbmcgRGlyZWN0ZWQgR3JhcGhzLlwiXG4gKlxuICogUHJlLWNvbmRpdGlvbnM6XG4gKlxuICogICAgMS4gR3JhcGggbXVzdCBiZSBhIGNvbm5lY3RlZCBEQUdcbiAqICAgIDIuIEdyYXBoIG5vZGVzIG11c3QgYmUgb2JqZWN0c1xuICogICAgMy4gR3JhcGggZWRnZXMgbXVzdCBoYXZlIFwid2VpZ2h0XCIgYW5kIFwibWlubGVuXCIgYXR0cmlidXRlc1xuICpcbiAqIFBvc3QtY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBHcmFwaCBub2RlcyB3aWxsIGhhdmUgYSBcInJhbmtcIiBhdHRyaWJ1dGUgYmFzZWQgb24gdGhlIHJlc3VsdHMgb2YgdGhlXG4gKiAgICAgICBhbGdvcml0aG0uIFJhbmtzIGNhbiBzdGFydCBhdCBhbnkgaW5kZXggKGluY2x1ZGluZyBuZWdhdGl2ZSksIHdlJ2xsXG4gKiAgICAgICBmaXggdGhlbSB1cCBsYXRlci5cbiAqL1xuZnVuY3Rpb24gcmFuayhnKSB7XG4gIHN3aXRjaChnLmdyYXBoKCkucmFua2VyKSB7XG4gIGNhc2UgXCJuZXR3b3JrLXNpbXBsZXhcIjogbmV0d29ya1NpbXBsZXhSYW5rZXIoZyk7IGJyZWFrO1xuICBjYXNlIFwidGlnaHQtdHJlZVwiOiB0aWdodFRyZWVSYW5rZXIoZyk7IGJyZWFrO1xuICBjYXNlIFwibG9uZ2VzdC1wYXRoXCI6IGxvbmdlc3RQYXRoUmFua2VyKGcpOyBicmVhaztcbiAgZGVmYXVsdDogbmV0d29ya1NpbXBsZXhSYW5rZXIoZyk7XG4gIH1cbn1cblxuLy8gQSBmYXN0IGFuZCBzaW1wbGUgcmFua2VyLCBidXQgcmVzdWx0cyBhcmUgZmFyIGZyb20gb3B0aW1hbC5cbnZhciBsb25nZXN0UGF0aFJhbmtlciA9IGxvbmdlc3RQYXRoO1xuXG5mdW5jdGlvbiB0aWdodFRyZWVSYW5rZXIoZykge1xuICBsb25nZXN0UGF0aChnKTtcbiAgZmVhc2libGVUcmVlKGcpO1xufVxuXG5mdW5jdGlvbiBuZXR3b3JrU2ltcGxleFJhbmtlcihnKSB7XG4gIG5ldHdvcmtTaW1wbGV4KGcpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcbnZhciBmZWFzaWJsZVRyZWUgPSByZXF1aXJlKFwiLi9mZWFzaWJsZS10cmVlXCIpO1xudmFyIHNsYWNrID0gcmVxdWlyZShcIi4vdXRpbFwiKS5zbGFjaztcbnZhciBpbml0UmFuayA9IHJlcXVpcmUoXCIuL3V0aWxcIikubG9uZ2VzdFBhdGg7XG52YXIgcHJlb3JkZXIgPSByZXF1aXJlKFwiLi4vZ3JhcGhsaWJcIikuYWxnLnByZW9yZGVyO1xudmFyIHBvc3RvcmRlciA9IHJlcXVpcmUoXCIuLi9ncmFwaGxpYlwiKS5hbGcucG9zdG9yZGVyO1xudmFyIHNpbXBsaWZ5ID0gcmVxdWlyZShcIi4uL3V0aWxcIikuc2ltcGxpZnk7XG5cbm1vZHVsZS5leHBvcnRzID0gbmV0d29ya1NpbXBsZXg7XG5cbi8vIEV4cG9zZSBzb21lIGludGVybmFscyBmb3IgdGVzdGluZyBwdXJwb3Nlc1xubmV0d29ya1NpbXBsZXguaW5pdExvd0xpbVZhbHVlcyA9IGluaXRMb3dMaW1WYWx1ZXM7XG5uZXR3b3JrU2ltcGxleC5pbml0Q3V0VmFsdWVzID0gaW5pdEN1dFZhbHVlcztcbm5ldHdvcmtTaW1wbGV4LmNhbGNDdXRWYWx1ZSA9IGNhbGNDdXRWYWx1ZTtcbm5ldHdvcmtTaW1wbGV4LmxlYXZlRWRnZSA9IGxlYXZlRWRnZTtcbm5ldHdvcmtTaW1wbGV4LmVudGVyRWRnZSA9IGVudGVyRWRnZTtcbm5ldHdvcmtTaW1wbGV4LmV4Y2hhbmdlRWRnZXMgPSBleGNoYW5nZUVkZ2VzO1xuXG4vKlxuICogVGhlIG5ldHdvcmsgc2ltcGxleCBhbGdvcml0aG0gYXNzaWducyByYW5rcyB0byBlYWNoIG5vZGUgaW4gdGhlIGlucHV0IGdyYXBoXG4gKiBhbmQgaXRlcmF0aXZlbHkgaW1wcm92ZXMgdGhlIHJhbmtpbmcgdG8gcmVkdWNlIHRoZSBsZW5ndGggb2YgZWRnZXMuXG4gKlxuICogUHJlY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBUaGUgaW5wdXQgZ3JhcGggbXVzdCBiZSBhIERBRy5cbiAqICAgIDIuIEFsbCBub2RlcyBpbiB0aGUgZ3JhcGggbXVzdCBoYXZlIGFuIG9iamVjdCB2YWx1ZS5cbiAqICAgIDMuIEFsbCBlZGdlcyBpbiB0aGUgZ3JhcGggbXVzdCBoYXZlIFwibWlubGVuXCIgYW5kIFwid2VpZ2h0XCIgYXR0cmlidXRlcy5cbiAqXG4gKiBQb3N0Y29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBBbGwgbm9kZXMgaW4gdGhlIGdyYXBoIHdpbGwgaGF2ZSBhbiBhc3NpZ25lZCBcInJhbmtcIiBhdHRyaWJ1dGUgdGhhdCBoYXNcbiAqICAgICAgIGJlZW4gb3B0aW1pemVkIGJ5IHRoZSBuZXR3b3JrIHNpbXBsZXggYWxnb3JpdGhtLiBSYW5rcyBzdGFydCBhdCAwLlxuICpcbiAqXG4gKiBBIHJvdWdoIHNrZXRjaCBvZiB0aGUgYWxnb3JpdGhtIGlzIGFzIGZvbGxvd3M6XG4gKlxuICogICAgMS4gQXNzaWduIGluaXRpYWwgcmFua3MgdG8gZWFjaCBub2RlLiBXZSB1c2UgdGhlIGxvbmdlc3QgcGF0aCBhbGdvcml0aG0sXG4gKiAgICAgICB3aGljaCBhc3NpZ25zIHJhbmtzIHRvIHRoZSBsb3dlc3QgcG9zaXRpb24gcG9zc2libGUuIEluIGdlbmVyYWwgdGhpc1xuICogICAgICAgbGVhZHMgdG8gdmVyeSB3aWRlIGJvdHRvbSByYW5rcyBhbmQgdW5uZWNlc3NhcmlseSBsb25nIGVkZ2VzLlxuICogICAgMi4gQ29uc3RydWN0IGEgZmVhc2libGUgdGlnaHQgdHJlZS4gQSB0aWdodCB0cmVlIGlzIG9uZSBzdWNoIHRoYXQgYWxsXG4gKiAgICAgICBlZGdlcyBpbiB0aGUgdHJlZSBoYXZlIG5vIHNsYWNrIChkaWZmZXJlbmNlIGJldHdlZW4gbGVuZ3RoIG9mIGVkZ2VcbiAqICAgICAgIGFuZCBtaW5sZW4gZm9yIHRoZSBlZGdlKS4gVGhpcyBieSBpdHNlbGYgZ3JlYXRseSBpbXByb3ZlcyB0aGUgYXNzaWduZWRcbiAqICAgICAgIHJhbmtpbmdzIGJ5IHNob3J0aW5nIGVkZ2VzLlxuICogICAgMy4gSXRlcmF0aXZlbHkgZmluZCBlZGdlcyB0aGF0IGhhdmUgbmVnYXRpdmUgY3V0IHZhbHVlcy4gR2VuZXJhbGx5IGFcbiAqICAgICAgIG5lZ2F0aXZlIGN1dCB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgZWRnZSBjb3VsZCBiZSByZW1vdmVkIGFuZCBhIG5ld1xuICogICAgICAgdHJlZSBlZGdlIGNvdWxkIGJlIGFkZGVkIHRvIHByb2R1Y2UgYSBtb3JlIGNvbXBhY3QgZ3JhcGguXG4gKlxuICogTXVjaCBvZiB0aGUgYWxnb3JpdGhtcyBoZXJlIGFyZSBkZXJpdmVkIGZyb20gR2Fuc25lciwgZXQgYWwuLCBcIkEgVGVjaG5pcXVlXG4gKiBmb3IgRHJhd2luZyBEaXJlY3RlZCBHcmFwaHMuXCIgVGhlIHN0cnVjdHVyZSBvZiB0aGUgZmlsZSByb3VnaGx5IGZvbGxvd3MgdGhlXG4gKiBzdHJ1Y3R1cmUgb2YgdGhlIG92ZXJhbGwgYWxnb3JpdGhtLlxuICovXG5mdW5jdGlvbiBuZXR3b3JrU2ltcGxleChnKSB7XG4gIGcgPSBzaW1wbGlmeShnKTtcbiAgaW5pdFJhbmsoZyk7XG4gIHZhciB0ID0gZmVhc2libGVUcmVlKGcpO1xuICBpbml0TG93TGltVmFsdWVzKHQpO1xuICBpbml0Q3V0VmFsdWVzKHQsIGcpO1xuXG4gIHZhciBlLCBmO1xuICB3aGlsZSAoKGUgPSBsZWF2ZUVkZ2UodCkpKSB7XG4gICAgZiA9IGVudGVyRWRnZSh0LCBnLCBlKTtcbiAgICBleGNoYW5nZUVkZ2VzKHQsIGcsIGUsIGYpO1xuICB9XG59XG5cbi8qXG4gKiBJbml0aWFsaXplcyBjdXQgdmFsdWVzIGZvciBhbGwgZWRnZXMgaW4gdGhlIHRyZWUuXG4gKi9cbmZ1bmN0aW9uIGluaXRDdXRWYWx1ZXModCwgZykge1xuICB2YXIgdnMgPSBwb3N0b3JkZXIodCwgdC5ub2RlcygpKTtcbiAgdnMgPSB2cy5zbGljZSgwLCB2cy5sZW5ndGggLSAxKTtcbiAgXy5mb3JFYWNoKHZzLCBmdW5jdGlvbih2KSB7XG4gICAgYXNzaWduQ3V0VmFsdWUodCwgZywgdik7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhc3NpZ25DdXRWYWx1ZSh0LCBnLCBjaGlsZCkge1xuICB2YXIgY2hpbGRMYWIgPSB0Lm5vZGUoY2hpbGQpO1xuICB2YXIgcGFyZW50ID0gY2hpbGRMYWIucGFyZW50O1xuICB0LmVkZ2UoY2hpbGQsIHBhcmVudCkuY3V0dmFsdWUgPSBjYWxjQ3V0VmFsdWUodCwgZywgY2hpbGQpO1xufVxuXG4vKlxuICogR2l2ZW4gdGhlIHRpZ2h0IHRyZWUsIGl0cyBncmFwaCwgYW5kIGEgY2hpbGQgaW4gdGhlIGdyYXBoIGNhbGN1bGF0ZSBhbmRcbiAqIHJldHVybiB0aGUgY3V0IHZhbHVlIGZvciB0aGUgZWRnZSBiZXR3ZWVuIHRoZSBjaGlsZCBhbmQgaXRzIHBhcmVudC5cbiAqL1xuZnVuY3Rpb24gY2FsY0N1dFZhbHVlKHQsIGcsIGNoaWxkKSB7XG4gIHZhciBjaGlsZExhYiA9IHQubm9kZShjaGlsZCk7XG4gIHZhciBwYXJlbnQgPSBjaGlsZExhYi5wYXJlbnQ7XG4gIC8vIFRydWUgaWYgdGhlIGNoaWxkIGlzIG9uIHRoZSB0YWlsIGVuZCBvZiB0aGUgZWRnZSBpbiB0aGUgZGlyZWN0ZWQgZ3JhcGhcbiAgdmFyIGNoaWxkSXNUYWlsID0gdHJ1ZTtcbiAgLy8gVGhlIGdyYXBoJ3MgdmlldyBvZiB0aGUgdHJlZSBlZGdlIHdlJ3JlIGluc3BlY3RpbmdcbiAgdmFyIGdyYXBoRWRnZSA9IGcuZWRnZShjaGlsZCwgcGFyZW50KTtcbiAgLy8gVGhlIGFjY3VtdWxhdGVkIGN1dCB2YWx1ZSBmb3IgdGhlIGVkZ2UgYmV0d2VlbiB0aGlzIG5vZGUgYW5kIGl0cyBwYXJlbnRcbiAgdmFyIGN1dFZhbHVlID0gMDtcblxuICBpZiAoIWdyYXBoRWRnZSkge1xuICAgIGNoaWxkSXNUYWlsID0gZmFsc2U7XG4gICAgZ3JhcGhFZGdlID0gZy5lZGdlKHBhcmVudCwgY2hpbGQpO1xuICB9XG5cbiAgY3V0VmFsdWUgPSBncmFwaEVkZ2Uud2VpZ2h0O1xuXG4gIF8uZm9yRWFjaChnLm5vZGVFZGdlcyhjaGlsZCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgaXNPdXRFZGdlID0gZS52ID09PSBjaGlsZCxcbiAgICAgIG90aGVyID0gaXNPdXRFZGdlID8gZS53IDogZS52O1xuXG4gICAgaWYgKG90aGVyICE9PSBwYXJlbnQpIHtcbiAgICAgIHZhciBwb2ludHNUb0hlYWQgPSBpc091dEVkZ2UgPT09IGNoaWxkSXNUYWlsLFxuICAgICAgICBvdGhlcldlaWdodCA9IGcuZWRnZShlKS53ZWlnaHQ7XG5cbiAgICAgIGN1dFZhbHVlICs9IHBvaW50c1RvSGVhZCA/IG90aGVyV2VpZ2h0IDogLW90aGVyV2VpZ2h0O1xuICAgICAgaWYgKGlzVHJlZUVkZ2UodCwgY2hpbGQsIG90aGVyKSkge1xuICAgICAgICB2YXIgb3RoZXJDdXRWYWx1ZSA9IHQuZWRnZShjaGlsZCwgb3RoZXIpLmN1dHZhbHVlO1xuICAgICAgICBjdXRWYWx1ZSArPSBwb2ludHNUb0hlYWQgPyAtb3RoZXJDdXRWYWx1ZSA6IG90aGVyQ3V0VmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gY3V0VmFsdWU7XG59XG5cbmZ1bmN0aW9uIGluaXRMb3dMaW1WYWx1ZXModHJlZSwgcm9vdCkge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICByb290ID0gdHJlZS5ub2RlcygpWzBdO1xuICB9XG4gIGRmc0Fzc2lnbkxvd0xpbSh0cmVlLCB7fSwgMSwgcm9vdCk7XG59XG5cbmZ1bmN0aW9uIGRmc0Fzc2lnbkxvd0xpbSh0cmVlLCB2aXNpdGVkLCBuZXh0TGltLCB2LCBwYXJlbnQpIHtcbiAgdmFyIGxvdyA9IG5leHRMaW07XG4gIHZhciBsYWJlbCA9IHRyZWUubm9kZSh2KTtcblxuICB2aXNpdGVkW3ZdID0gdHJ1ZTtcbiAgXy5mb3JFYWNoKHRyZWUubmVpZ2hib3JzKHYpLCBmdW5jdGlvbih3KSB7XG4gICAgaWYgKCFfLmhhcyh2aXNpdGVkLCB3KSkge1xuICAgICAgbmV4dExpbSA9IGRmc0Fzc2lnbkxvd0xpbSh0cmVlLCB2aXNpdGVkLCBuZXh0TGltLCB3LCB2KTtcbiAgICB9XG4gIH0pO1xuXG4gIGxhYmVsLmxvdyA9IGxvdztcbiAgbGFiZWwubGltID0gbmV4dExpbSsrO1xuICBpZiAocGFyZW50KSB7XG4gICAgbGFiZWwucGFyZW50ID0gcGFyZW50O1xuICB9IGVsc2Uge1xuICAgIC8vIFRPRE8gc2hvdWxkIGJlIGFibGUgdG8gcmVtb3ZlIHRoaXMgd2hlbiB3ZSBpbmNyZW1lbnRhbGx5IHVwZGF0ZSBsb3cgbGltXG4gICAgZGVsZXRlIGxhYmVsLnBhcmVudDtcbiAgfVxuXG4gIHJldHVybiBuZXh0TGltO1xufVxuXG5mdW5jdGlvbiBsZWF2ZUVkZ2UodHJlZSkge1xuICByZXR1cm4gXy5maW5kKHRyZWUuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHJldHVybiB0cmVlLmVkZ2UoZSkuY3V0dmFsdWUgPCAwO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZW50ZXJFZGdlKHQsIGcsIGVkZ2UpIHtcbiAgdmFyIHYgPSBlZGdlLnY7XG4gIHZhciB3ID0gZWRnZS53O1xuXG4gIC8vIEZvciB0aGUgcmVzdCBvZiB0aGlzIGZ1bmN0aW9uIHdlIGFzc3VtZSB0aGF0IHYgaXMgdGhlIHRhaWwgYW5kIHcgaXMgdGhlXG4gIC8vIGhlYWQsIHNvIGlmIHdlIGRvbid0IGhhdmUgdGhpcyBlZGdlIGluIHRoZSBncmFwaCB3ZSBzaG91bGQgZmxpcCBpdCB0b1xuICAvLyBtYXRjaCB0aGUgY29ycmVjdCBvcmllbnRhdGlvbi5cbiAgaWYgKCFnLmhhc0VkZ2UodiwgdykpIHtcbiAgICB2ID0gZWRnZS53O1xuICAgIHcgPSBlZGdlLnY7XG4gIH1cblxuICB2YXIgdkxhYmVsID0gdC5ub2RlKHYpO1xuICB2YXIgd0xhYmVsID0gdC5ub2RlKHcpO1xuICB2YXIgdGFpbExhYmVsID0gdkxhYmVsO1xuICB2YXIgZmxpcCA9IGZhbHNlO1xuXG4gIC8vIElmIHRoZSByb290IGlzIGluIHRoZSB0YWlsIG9mIHRoZSBlZGdlIHRoZW4gd2UgbmVlZCB0byBmbGlwIHRoZSBsb2dpYyB0aGF0XG4gIC8vIGNoZWNrcyBmb3IgdGhlIGhlYWQgYW5kIHRhaWwgbm9kZXMgaW4gdGhlIGNhbmRpZGF0ZXMgZnVuY3Rpb24gYmVsb3cuXG4gIGlmICh2TGFiZWwubGltID4gd0xhYmVsLmxpbSkge1xuICAgIHRhaWxMYWJlbCA9IHdMYWJlbDtcbiAgICBmbGlwID0gdHJ1ZTtcbiAgfVxuXG4gIHZhciBjYW5kaWRhdGVzID0gXy5maWx0ZXIoZy5lZGdlcygpLCBmdW5jdGlvbihlZGdlKSB7XG4gICAgcmV0dXJuIGZsaXAgPT09IGlzRGVzY2VuZGFudCh0LCB0Lm5vZGUoZWRnZS52KSwgdGFpbExhYmVsKSAmJlxuICAgICAgICAgICBmbGlwICE9PSBpc0Rlc2NlbmRhbnQodCwgdC5ub2RlKGVkZ2UudyksIHRhaWxMYWJlbCk7XG4gIH0pO1xuXG4gIHJldHVybiBfLm1pbkJ5KGNhbmRpZGF0ZXMsIGZ1bmN0aW9uKGVkZ2UpIHsgcmV0dXJuIHNsYWNrKGcsIGVkZ2UpOyB9KTtcbn1cblxuZnVuY3Rpb24gZXhjaGFuZ2VFZGdlcyh0LCBnLCBlLCBmKSB7XG4gIHZhciB2ID0gZS52O1xuICB2YXIgdyA9IGUudztcbiAgdC5yZW1vdmVFZGdlKHYsIHcpO1xuICB0LnNldEVkZ2UoZi52LCBmLncsIHt9KTtcbiAgaW5pdExvd0xpbVZhbHVlcyh0KTtcbiAgaW5pdEN1dFZhbHVlcyh0LCBnKTtcbiAgdXBkYXRlUmFua3ModCwgZyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVJhbmtzKHQsIGcpIHtcbiAgdmFyIHJvb3QgPSBfLmZpbmQodC5ub2RlcygpLCBmdW5jdGlvbih2KSB7IHJldHVybiAhZy5ub2RlKHYpLnBhcmVudDsgfSk7XG4gIHZhciB2cyA9IHByZW9yZGVyKHQsIHJvb3QpO1xuICB2cyA9IHZzLnNsaWNlKDEpO1xuICBfLmZvckVhY2godnMsIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgcGFyZW50ID0gdC5ub2RlKHYpLnBhcmVudCxcbiAgICAgIGVkZ2UgPSBnLmVkZ2UodiwgcGFyZW50KSxcbiAgICAgIGZsaXBwZWQgPSBmYWxzZTtcblxuICAgIGlmICghZWRnZSkge1xuICAgICAgZWRnZSA9IGcuZWRnZShwYXJlbnQsIHYpO1xuICAgICAgZmxpcHBlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgZy5ub2RlKHYpLnJhbmsgPSBnLm5vZGUocGFyZW50KS5yYW5rICsgKGZsaXBwZWQgPyBlZGdlLm1pbmxlbiA6IC1lZGdlLm1pbmxlbik7XG4gIH0pO1xufVxuXG4vKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBlZGdlIGlzIGluIHRoZSB0cmVlLlxuICovXG5mdW5jdGlvbiBpc1RyZWVFZGdlKHRyZWUsIHUsIHYpIHtcbiAgcmV0dXJuIHRyZWUuaGFzRWRnZSh1LCB2KTtcbn1cblxuLypcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIG5vZGUgaXMgZGVzY2VuZGFudCBvZiB0aGUgcm9vdCBub2RlIHBlciB0aGVcbiAqIGFzc2lnbmVkIGxvdyBhbmQgbGltIGF0dHJpYnV0ZXMgaW4gdGhlIHRyZWUuXG4gKi9cbmZ1bmN0aW9uIGlzRGVzY2VuZGFudCh0cmVlLCB2TGFiZWwsIHJvb3RMYWJlbCkge1xuICByZXR1cm4gcm9vdExhYmVsLmxvdyA8PSB2TGFiZWwubGltICYmIHZMYWJlbC5saW0gPD0gcm9vdExhYmVsLmxpbTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBsb25nZXN0UGF0aDogbG9uZ2VzdFBhdGgsXG4gIHNsYWNrOiBzbGFja1xufTtcblxuLypcbiAqIEluaXRpYWxpemVzIHJhbmtzIGZvciB0aGUgaW5wdXQgZ3JhcGggdXNpbmcgdGhlIGxvbmdlc3QgcGF0aCBhbGdvcml0aG0uIFRoaXNcbiAqIGFsZ29yaXRobSBzY2FsZXMgd2VsbCBhbmQgaXMgZmFzdCBpbiBwcmFjdGljZSwgaXQgeWllbGRzIHJhdGhlciBwb29yXG4gKiBzb2x1dGlvbnMuIE5vZGVzIGFyZSBwdXNoZWQgdG8gdGhlIGxvd2VzdCBsYXllciBwb3NzaWJsZSwgbGVhdmluZyB0aGUgYm90dG9tXG4gKiByYW5rcyB3aWRlIGFuZCBsZWF2aW5nIGVkZ2VzIGxvbmdlciB0aGFuIG5lY2Vzc2FyeS4gSG93ZXZlciwgZHVlIHRvIGl0c1xuICogc3BlZWQsIHRoaXMgYWxnb3JpdGhtIGlzIGdvb2QgZm9yIGdldHRpbmcgYW4gaW5pdGlhbCByYW5raW5nIHRoYXQgY2FuIGJlIGZlZFxuICogaW50byBvdGhlciBhbGdvcml0aG1zLlxuICpcbiAqIFRoaXMgYWxnb3JpdGhtIGRvZXMgbm90IG5vcm1hbGl6ZSBsYXllcnMgYmVjYXVzZSBpdCB3aWxsIGJlIHVzZWQgYnkgb3RoZXJcbiAqIGFsZ29yaXRobXMgaW4gbW9zdCBjYXNlcy4gSWYgdXNpbmcgdGhpcyBhbGdvcml0aG0gZGlyZWN0bHksIGJlIHN1cmUgdG9cbiAqIHJ1biBub3JtYWxpemUgYXQgdGhlIGVuZC5cbiAqXG4gKiBQcmUtY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBJbnB1dCBncmFwaCBpcyBhIERBRy5cbiAqICAgIDIuIElucHV0IGdyYXBoIG5vZGUgbGFiZWxzIGNhbiBiZSBhc3NpZ25lZCBwcm9wZXJ0aWVzLlxuICpcbiAqIFBvc3QtY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBFYWNoIG5vZGUgd2lsbCBiZSBhc3NpZ24gYW4gKHVubm9ybWFsaXplZCkgXCJyYW5rXCIgcHJvcGVydHkuXG4gKi9cbmZ1bmN0aW9uIGxvbmdlc3RQYXRoKGcpIHtcbiAgdmFyIHZpc2l0ZWQgPSB7fTtcblxuICBmdW5jdGlvbiBkZnModikge1xuICAgIHZhciBsYWJlbCA9IGcubm9kZSh2KTtcbiAgICBpZiAoXy5oYXModmlzaXRlZCwgdikpIHtcbiAgICAgIHJldHVybiBsYWJlbC5yYW5rO1xuICAgIH1cbiAgICB2aXNpdGVkW3ZdID0gdHJ1ZTtcblxuICAgIHZhciByYW5rID0gXy5taW4oXy5tYXAoZy5vdXRFZGdlcyh2KSwgZnVuY3Rpb24oZSkge1xuICAgICAgcmV0dXJuIGRmcyhlLncpIC0gZy5lZGdlKGUpLm1pbmxlbjtcbiAgICB9KSk7XG5cbiAgICBpZiAocmFuayA9PT0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIHx8IC8vIHJldHVybiB2YWx1ZSBvZiBfLm1hcChbXSkgZm9yIExvZGFzaCAzXG4gICAgICAgIHJhbmsgPT09IHVuZGVmaW5lZCB8fCAvLyByZXR1cm4gdmFsdWUgb2YgXy5tYXAoW10pIGZvciBMb2Rhc2ggNFxuICAgICAgICByYW5rID09PSBudWxsKSB7IC8vIHJldHVybiB2YWx1ZSBvZiBfLm1hcChbbnVsbF0pXG4gICAgICByYW5rID0gMDtcbiAgICB9XG5cbiAgICByZXR1cm4gKGxhYmVsLnJhbmsgPSByYW5rKTtcbiAgfVxuXG4gIF8uZm9yRWFjaChnLnNvdXJjZXMoKSwgZGZzKTtcbn1cblxuLypcbiAqIFJldHVybnMgdGhlIGFtb3VudCBvZiBzbGFjayBmb3IgdGhlIGdpdmVuIGVkZ2UuIFRoZSBzbGFjayBpcyBkZWZpbmVkIGFzIHRoZVxuICogZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBsZW5ndGggb2YgdGhlIGVkZ2UgYW5kIGl0cyBtaW5pbXVtIGxlbmd0aC5cbiAqL1xuZnVuY3Rpb24gc2xhY2soZywgZSkge1xuICByZXR1cm4gZy5ub2RlKGUudykucmFuayAtIGcubm9kZShlLnYpLnJhbmsgLSBnLmVkZ2UoZSkubWlubGVuO1xufVxuIiwiLyogZXNsaW50IFwibm8tY29uc29sZVwiOiBvZmYgKi9cblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfID0gcmVxdWlyZShcIi4vbG9kYXNoXCIpO1xudmFyIEdyYXBoID0gcmVxdWlyZShcIi4vZ3JhcGhsaWJcIikuR3JhcGg7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBhZGREdW1teU5vZGU6IGFkZER1bW15Tm9kZSxcbiAgc2ltcGxpZnk6IHNpbXBsaWZ5LFxuICBhc05vbkNvbXBvdW5kR3JhcGg6IGFzTm9uQ29tcG91bmRHcmFwaCxcbiAgc3VjY2Vzc29yV2VpZ2h0czogc3VjY2Vzc29yV2VpZ2h0cyxcbiAgcHJlZGVjZXNzb3JXZWlnaHRzOiBwcmVkZWNlc3NvcldlaWdodHMsXG4gIGludGVyc2VjdFJlY3Q6IGludGVyc2VjdFJlY3QsXG4gIGJ1aWxkTGF5ZXJNYXRyaXg6IGJ1aWxkTGF5ZXJNYXRyaXgsXG4gIG5vcm1hbGl6ZVJhbmtzOiBub3JtYWxpemVSYW5rcyxcbiAgcmVtb3ZlRW1wdHlSYW5rczogcmVtb3ZlRW1wdHlSYW5rcyxcbiAgYWRkQm9yZGVyTm9kZTogYWRkQm9yZGVyTm9kZSxcbiAgbWF4UmFuazogbWF4UmFuayxcbiAgcGFydGl0aW9uOiBwYXJ0aXRpb24sXG4gIHRpbWU6IHRpbWUsXG4gIG5vdGltZTogbm90aW1lXG59O1xuXG4vKlxuICogQWRkcyBhIGR1bW15IG5vZGUgdG8gdGhlIGdyYXBoIGFuZCByZXR1cm4gdi5cbiAqL1xuZnVuY3Rpb24gYWRkRHVtbXlOb2RlKGcsIHR5cGUsIGF0dHJzLCBuYW1lKSB7XG4gIHZhciB2O1xuICBkbyB7XG4gICAgdiA9IF8udW5pcXVlSWQobmFtZSk7XG4gIH0gd2hpbGUgKGcuaGFzTm9kZSh2KSk7XG5cbiAgYXR0cnMuZHVtbXkgPSB0eXBlO1xuICBnLnNldE5vZGUodiwgYXR0cnMpO1xuICByZXR1cm4gdjtcbn1cblxuLypcbiAqIFJldHVybnMgYSBuZXcgZ3JhcGggd2l0aCBvbmx5IHNpbXBsZSBlZGdlcy4gSGFuZGxlcyBhZ2dyZWdhdGlvbiBvZiBkYXRhXG4gKiBhc3NvY2lhdGVkIHdpdGggbXVsdGktZWRnZXMuXG4gKi9cbmZ1bmN0aW9uIHNpbXBsaWZ5KGcpIHtcbiAgdmFyIHNpbXBsaWZpZWQgPSBuZXcgR3JhcGgoKS5zZXRHcmFwaChnLmdyYXBoKCkpO1xuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7IHNpbXBsaWZpZWQuc2V0Tm9kZSh2LCBnLm5vZGUodikpOyB9KTtcbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBzaW1wbGVMYWJlbCA9IHNpbXBsaWZpZWQuZWRnZShlLnYsIGUudykgfHwgeyB3ZWlnaHQ6IDAsIG1pbmxlbjogMSB9O1xuICAgIHZhciBsYWJlbCA9IGcuZWRnZShlKTtcbiAgICBzaW1wbGlmaWVkLnNldEVkZ2UoZS52LCBlLncsIHtcbiAgICAgIHdlaWdodDogc2ltcGxlTGFiZWwud2VpZ2h0ICsgbGFiZWwud2VpZ2h0LFxuICAgICAgbWlubGVuOiBNYXRoLm1heChzaW1wbGVMYWJlbC5taW5sZW4sIGxhYmVsLm1pbmxlbilcbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiBzaW1wbGlmaWVkO1xufVxuXG5mdW5jdGlvbiBhc05vbkNvbXBvdW5kR3JhcGgoZykge1xuICB2YXIgc2ltcGxpZmllZCA9IG5ldyBHcmFwaCh7IG11bHRpZ3JhcGg6IGcuaXNNdWx0aWdyYXBoKCkgfSkuc2V0R3JhcGgoZy5ncmFwaCgpKTtcbiAgXy5mb3JFYWNoKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIGlmICghZy5jaGlsZHJlbih2KS5sZW5ndGgpIHtcbiAgICAgIHNpbXBsaWZpZWQuc2V0Tm9kZSh2LCBnLm5vZGUodikpO1xuICAgIH1cbiAgfSk7XG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICBzaW1wbGlmaWVkLnNldEVkZ2UoZSwgZy5lZGdlKGUpKTtcbiAgfSk7XG4gIHJldHVybiBzaW1wbGlmaWVkO1xufVxuXG5mdW5jdGlvbiBzdWNjZXNzb3JXZWlnaHRzKGcpIHtcbiAgdmFyIHdlaWdodE1hcCA9IF8ubWFwKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHZhciBzdWNzID0ge307XG4gICAgXy5mb3JFYWNoKGcub3V0RWRnZXModiksIGZ1bmN0aW9uKGUpIHtcbiAgICAgIHN1Y3NbZS53XSA9IChzdWNzW2Uud10gfHwgMCkgKyBnLmVkZ2UoZSkud2VpZ2h0O1xuICAgIH0pO1xuICAgIHJldHVybiBzdWNzO1xuICB9KTtcbiAgcmV0dXJuIF8uemlwT2JqZWN0KGcubm9kZXMoKSwgd2VpZ2h0TWFwKTtcbn1cblxuZnVuY3Rpb24gcHJlZGVjZXNzb3JXZWlnaHRzKGcpIHtcbiAgdmFyIHdlaWdodE1hcCA9IF8ubWFwKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHZhciBwcmVkcyA9IHt9O1xuICAgIF8uZm9yRWFjaChnLmluRWRnZXModiksIGZ1bmN0aW9uKGUpIHtcbiAgICAgIHByZWRzW2Uudl0gPSAocHJlZHNbZS52XSB8fCAwKSArIGcuZWRnZShlKS53ZWlnaHQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIHByZWRzO1xuICB9KTtcbiAgcmV0dXJuIF8uemlwT2JqZWN0KGcubm9kZXMoKSwgd2VpZ2h0TWFwKTtcbn1cblxuLypcbiAqIEZpbmRzIHdoZXJlIGEgbGluZSBzdGFydGluZyBhdCBwb2ludCAoe3gsIHl9KSB3b3VsZCBpbnRlcnNlY3QgYSByZWN0YW5nbGVcbiAqICh7eCwgeSwgd2lkdGgsIGhlaWdodH0pIGlmIGl0IHdlcmUgcG9pbnRpbmcgYXQgdGhlIHJlY3RhbmdsZSdzIGNlbnRlci5cbiAqL1xuZnVuY3Rpb24gaW50ZXJzZWN0UmVjdChyZWN0LCBwb2ludCkge1xuICB2YXIgeCA9IHJlY3QueDtcbiAgdmFyIHkgPSByZWN0Lnk7XG5cbiAgLy8gUmVjdGFuZ2xlIGludGVyc2VjdGlvbiBhbGdvcml0aG0gZnJvbTpcbiAgLy8gaHR0cDovL21hdGguc3RhY2tleGNoYW5nZS5jb20vcXVlc3Rpb25zLzEwODExMy9maW5kLWVkZ2UtYmV0d2Vlbi10d28tYm94ZXNcbiAgdmFyIGR4ID0gcG9pbnQueCAtIHg7XG4gIHZhciBkeSA9IHBvaW50LnkgLSB5O1xuICB2YXIgdyA9IHJlY3Qud2lkdGggLyAyO1xuICB2YXIgaCA9IHJlY3QuaGVpZ2h0IC8gMjtcblxuICBpZiAoIWR4ICYmICFkeSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCBwb3NzaWJsZSB0byBmaW5kIGludGVyc2VjdGlvbiBpbnNpZGUgb2YgdGhlIHJlY3RhbmdsZVwiKTtcbiAgfVxuXG4gIHZhciBzeCwgc3k7XG4gIGlmIChNYXRoLmFicyhkeSkgKiB3ID4gTWF0aC5hYnMoZHgpICogaCkge1xuICAgIC8vIEludGVyc2VjdGlvbiBpcyB0b3Agb3IgYm90dG9tIG9mIHJlY3QuXG4gICAgaWYgKGR5IDwgMCkge1xuICAgICAgaCA9IC1oO1xuICAgIH1cbiAgICBzeCA9IGggKiBkeCAvIGR5O1xuICAgIHN5ID0gaDtcbiAgfSBlbHNlIHtcbiAgICAvLyBJbnRlcnNlY3Rpb24gaXMgbGVmdCBvciByaWdodCBvZiByZWN0LlxuICAgIGlmIChkeCA8IDApIHtcbiAgICAgIHcgPSAtdztcbiAgICB9XG4gICAgc3ggPSB3O1xuICAgIHN5ID0gdyAqIGR5IC8gZHg7XG4gIH1cblxuICByZXR1cm4geyB4OiB4ICsgc3gsIHk6IHkgKyBzeSB9O1xufVxuXG4vKlxuICogR2l2ZW4gYSBEQUcgd2l0aCBlYWNoIG5vZGUgYXNzaWduZWQgXCJyYW5rXCIgYW5kIFwib3JkZXJcIiBwcm9wZXJ0aWVzLCB0aGlzXG4gKiBmdW5jdGlvbiB3aWxsIHByb2R1Y2UgYSBtYXRyaXggd2l0aCB0aGUgaWRzIG9mIGVhY2ggbm9kZS5cbiAqL1xuZnVuY3Rpb24gYnVpbGRMYXllck1hdHJpeChnKSB7XG4gIHZhciBsYXllcmluZyA9IF8ubWFwKF8ucmFuZ2UobWF4UmFuayhnKSArIDEpLCBmdW5jdGlvbigpIHsgcmV0dXJuIFtdOyB9KTtcbiAgXy5mb3JFYWNoKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHZhciBub2RlID0gZy5ub2RlKHYpO1xuICAgIHZhciByYW5rID0gbm9kZS5yYW5rO1xuICAgIGlmICghXy5pc1VuZGVmaW5lZChyYW5rKSkge1xuICAgICAgbGF5ZXJpbmdbcmFua11bbm9kZS5vcmRlcl0gPSB2O1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBsYXllcmluZztcbn1cblxuLypcbiAqIEFkanVzdHMgdGhlIHJhbmtzIGZvciBhbGwgbm9kZXMgaW4gdGhlIGdyYXBoIHN1Y2ggdGhhdCBhbGwgbm9kZXMgdiBoYXZlXG4gKiByYW5rKHYpID49IDAgYW5kIGF0IGxlYXN0IG9uZSBub2RlIHcgaGFzIHJhbmsodykgPSAwLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVSYW5rcyhnKSB7XG4gIHZhciBtaW4gPSBfLm1pbihfLm1hcChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHsgcmV0dXJuIGcubm9kZSh2KS5yYW5rOyB9KSk7XG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgbm9kZSA9IGcubm9kZSh2KTtcbiAgICBpZiAoXy5oYXMobm9kZSwgXCJyYW5rXCIpKSB7XG4gICAgICBub2RlLnJhbmsgLT0gbWluO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUVtcHR5UmFua3MoZykge1xuICAvLyBSYW5rcyBtYXkgbm90IHN0YXJ0IGF0IDAsIHNvIHdlIG5lZWQgdG8gb2Zmc2V0IHRoZW1cbiAgdmFyIG9mZnNldCA9IF8ubWluKF8ubWFwKGcubm9kZXMoKSwgZnVuY3Rpb24odikgeyByZXR1cm4gZy5ub2RlKHYpLnJhbms7IH0pKTtcblxuICB2YXIgbGF5ZXJzID0gW107XG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgcmFuayA9IGcubm9kZSh2KS5yYW5rIC0gb2Zmc2V0O1xuICAgIGlmICghbGF5ZXJzW3JhbmtdKSB7XG4gICAgICBsYXllcnNbcmFua10gPSBbXTtcbiAgICB9XG4gICAgbGF5ZXJzW3JhbmtdLnB1c2godik7XG4gIH0pO1xuXG4gIHZhciBkZWx0YSA9IDA7XG4gIHZhciBub2RlUmFua0ZhY3RvciA9IGcuZ3JhcGgoKS5ub2RlUmFua0ZhY3RvcjtcbiAgXy5mb3JFYWNoKGxheWVycywgZnVuY3Rpb24odnMsIGkpIHtcbiAgICBpZiAoXy5pc1VuZGVmaW5lZCh2cykgJiYgaSAlIG5vZGVSYW5rRmFjdG9yICE9PSAwKSB7XG4gICAgICAtLWRlbHRhO1xuICAgIH0gZWxzZSBpZiAoZGVsdGEpIHtcbiAgICAgIF8uZm9yRWFjaCh2cywgZnVuY3Rpb24odikgeyBnLm5vZGUodikucmFuayArPSBkZWx0YTsgfSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gYWRkQm9yZGVyTm9kZShnLCBwcmVmaXgsIHJhbmssIG9yZGVyKSB7XG4gIHZhciBub2RlID0ge1xuICAgIHdpZHRoOiAwLFxuICAgIGhlaWdodDogMFxuICB9O1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSA0KSB7XG4gICAgbm9kZS5yYW5rID0gcmFuaztcbiAgICBub2RlLm9yZGVyID0gb3JkZXI7XG4gIH1cbiAgcmV0dXJuIGFkZER1bW15Tm9kZShnLCBcImJvcmRlclwiLCBub2RlLCBwcmVmaXgpO1xufVxuXG5mdW5jdGlvbiBtYXhSYW5rKGcpIHtcbiAgcmV0dXJuIF8ubWF4KF8ubWFwKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHZhciByYW5rID0gZy5ub2RlKHYpLnJhbms7XG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHJhbmspKSB7XG4gICAgICByZXR1cm4gcmFuaztcbiAgICB9XG4gIH0pKTtcbn1cblxuLypcbiAqIFBhcnRpdGlvbiBhIGNvbGxlY3Rpb24gaW50byB0d28gZ3JvdXBzOiBgbGhzYCBhbmQgYHJoc2AuIElmIHRoZSBzdXBwbGllZFxuICogZnVuY3Rpb24gcmV0dXJucyB0cnVlIGZvciBhbiBlbnRyeSBpdCBnb2VzIGludG8gYGxoc2AuIE90aGVyd2lzZSBpdCBnb2VzXG4gKiBpbnRvIGByaHMuXG4gKi9cbmZ1bmN0aW9uIHBhcnRpdGlvbihjb2xsZWN0aW9uLCBmbikge1xuICB2YXIgcmVzdWx0ID0geyBsaHM6IFtdLCByaHM6IFtdIH07XG4gIF8uZm9yRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgIGlmIChmbih2YWx1ZSkpIHtcbiAgICAgIHJlc3VsdC5saHMucHVzaCh2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5yaHMucHVzaCh2YWx1ZSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLypcbiAqIFJldHVybnMgYSBuZXcgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZm5gIHdpdGggYSB0aW1lci4gVGhlIHdyYXBwZXIgbG9ncyB0aGVcbiAqIHRpbWUgaXQgdGFrZXMgdG8gZXhlY3V0ZSB0aGUgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIHRpbWUobmFtZSwgZm4pIHtcbiAgdmFyIHN0YXJ0ID0gXy5ub3coKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBjb25zb2xlLmxvZyhuYW1lICsgXCIgdGltZTogXCIgKyAoXy5ub3coKSAtIHN0YXJ0KSArIFwibXNcIik7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm90aW1lKG5hbWUsIGZuKSB7XG4gIHJldHVybiBmbigpO1xufVxuIiwibW9kdWxlLmV4cG9ydHMgPSBcIjAuOC41XCI7XG4iLCIvKipcbiAqIEEgc2ltcGxlIGRlcGVuZGVuY3kgZ3JhcGhcbiAqL1xuXG4vKipcbiAqIEhlbHBlciBmb3IgY3JlYXRpbmcgYSBUb3BvbG9naWNhbCBTb3J0IHVzaW5nIERlcHRoLUZpcnN0LVNlYXJjaCBvbiBhIHNldCBvZiBlZGdlcy5cbiAqXG4gKiBEZXRlY3RzIGN5Y2xlcyBhbmQgdGhyb3dzIGFuIEVycm9yIGlmIG9uZSBpcyBkZXRlY3RlZCAodW5sZXNzIHRoZSBcImNpcmN1bGFyXCJcbiAqIHBhcmFtZXRlciBpcyBcInRydWVcIiBpbiB3aGljaCBjYXNlIGl0IGlnbm9yZXMgdGhlbSkuXG4gKlxuICogQHBhcmFtIGVkZ2VzIFRoZSBzZXQgb2YgZWRnZXMgdG8gREZTIHRocm91Z2hcbiAqIEBwYXJhbSBsZWF2ZXNPbmx5IFdoZXRoZXIgdG8gb25seSByZXR1cm4gXCJsZWFmXCIgbm9kZXMgKG9uZXMgd2hvIGhhdmUgbm8gZWRnZXMpXG4gKiBAcGFyYW0gcmVzdWx0IEFuIGFycmF5IGluIHdoaWNoIHRoZSByZXN1bHRzIHdpbGwgYmUgcG9wdWxhdGVkXG4gKiBAcGFyYW0gY2lyY3VsYXIgQSBib29sZWFuIHRvIGFsbG93IGNpcmN1bGFyIGRlcGVuZGVuY2llc1xuICovXG5mdW5jdGlvbiBjcmVhdGVERlMoZWRnZXMsIGxlYXZlc09ubHksIHJlc3VsdCwgY2lyY3VsYXIpIHtcbiAgdmFyIHZpc2l0ZWQgPSB7fTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChzdGFydCkge1xuICAgIGlmICh2aXNpdGVkW3N0YXJ0XSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgaW5DdXJyZW50UGF0aCA9IHt9O1xuICAgIHZhciBjdXJyZW50UGF0aCA9IFtdO1xuICAgIHZhciB0b2RvID0gW107IC8vIHVzZWQgYXMgYSBzdGFja1xuICAgIHRvZG8ucHVzaCh7IG5vZGU6IHN0YXJ0LCBwcm9jZXNzZWQ6IGZhbHNlIH0pO1xuICAgIHdoaWxlICh0b2RvLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhciBjdXJyZW50ID0gdG9kb1t0b2RvLmxlbmd0aCAtIDFdOyAvLyBwZWVrIGF0IHRoZSB0b2RvIHN0YWNrXG4gICAgICB2YXIgcHJvY2Vzc2VkID0gY3VycmVudC5wcm9jZXNzZWQ7XG4gICAgICB2YXIgbm9kZSA9IGN1cnJlbnQubm9kZTtcbiAgICAgIGlmICghcHJvY2Vzc2VkKSB7XG4gICAgICAgIC8vIEhhdmVuJ3QgdmlzaXRlZCBlZGdlcyB5ZXQgKHZpc2l0aW5nIHBoYXNlKVxuICAgICAgICBpZiAodmlzaXRlZFtub2RlXSkge1xuICAgICAgICAgIHRvZG8ucG9wKCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSBpZiAoaW5DdXJyZW50UGF0aFtub2RlXSkge1xuICAgICAgICAgIC8vIEl0J3Mgbm90IGEgREFHXG4gICAgICAgICAgaWYgKGNpcmN1bGFyKSB7XG4gICAgICAgICAgICB0b2RvLnBvcCgpO1xuICAgICAgICAgICAgLy8gSWYgd2UncmUgdG9sZXJhdGluZyBjeWNsZXMsIGRvbid0IHJldmlzaXQgdGhlIG5vZGVcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjdXJyZW50UGF0aC5wdXNoKG5vZGUpO1xuICAgICAgICAgIHRocm93IG5ldyBEZXBHcmFwaEN5Y2xlRXJyb3IoY3VycmVudFBhdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5DdXJyZW50UGF0aFtub2RlXSA9IHRydWU7XG4gICAgICAgIGN1cnJlbnRQYXRoLnB1c2gobm9kZSk7XG4gICAgICAgIHZhciBub2RlRWRnZXMgPSBlZGdlc1tub2RlXTtcbiAgICAgICAgLy8gKHB1c2ggZWRnZXMgb250byB0aGUgdG9kbyBzdGFjayBpbiByZXZlcnNlIG9yZGVyIHRvIGJlIG9yZGVyLWNvbXBhdGlibGUgd2l0aCB0aGUgb2xkIERGUyBpbXBsZW1lbnRhdGlvbilcbiAgICAgICAgZm9yICh2YXIgaSA9IG5vZGVFZGdlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIHRvZG8ucHVzaCh7IG5vZGU6IG5vZGVFZGdlc1tpXSwgcHJvY2Vzc2VkOiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50LnByb2Nlc3NlZCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBIYXZlIHZpc2l0ZWQgZWRnZXMgKHN0YWNrIHVucm9sbGluZyBwaGFzZSlcbiAgICAgICAgdG9kby5wb3AoKTtcbiAgICAgICAgY3VycmVudFBhdGgucG9wKCk7XG4gICAgICAgIGluQ3VycmVudFBhdGhbbm9kZV0gPSBmYWxzZTtcbiAgICAgICAgdmlzaXRlZFtub2RlXSA9IHRydWU7XG4gICAgICAgIGlmICghbGVhdmVzT25seSB8fCBlZGdlc1tub2RlXS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXN1bHQucHVzaChub2RlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBTaW1wbGUgRGVwZW5kZW5jeSBHcmFwaFxuICovXG52YXIgRGVwR3JhcGggPSAoZXhwb3J0cy5EZXBHcmFwaCA9IGZ1bmN0aW9uIERlcEdyYXBoKG9wdHMpIHtcbiAgdGhpcy5ub2RlcyA9IHt9OyAvLyBOb2RlIC0+IE5vZGUvRGF0YSAodHJlYXRlZCBsaWtlIGEgU2V0KVxuICB0aGlzLm91dGdvaW5nRWRnZXMgPSB7fTsgLy8gTm9kZSAtPiBbRGVwZW5kZW5jeSBOb2RlXVxuICB0aGlzLmluY29taW5nRWRnZXMgPSB7fTsgLy8gTm9kZSAtPiBbRGVwZW5kYW50IE5vZGVdXG4gIHRoaXMuY2lyY3VsYXIgPSBvcHRzICYmICEhb3B0cy5jaXJjdWxhcjsgLy8gQWxsb3dzIGNpcmN1bGFyIGRlcHNcbn0pO1xuRGVwR3JhcGgucHJvdG90eXBlID0ge1xuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBub2RlcyBpbiB0aGUgZ3JhcGguXG4gICAqL1xuICBzaXplOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMubm9kZXMpLmxlbmd0aDtcbiAgfSxcbiAgLyoqXG4gICAqIEFkZCBhIG5vZGUgdG8gdGhlIGRlcGVuZGVuY3kgZ3JhcGguIElmIGEgbm9kZSBhbHJlYWR5IGV4aXN0cywgdGhpcyBtZXRob2Qgd2lsbCBkbyBub3RoaW5nLlxuICAgKi9cbiAgYWRkTm9kZTogZnVuY3Rpb24gKG5vZGUsIGRhdGEpIHtcbiAgICBpZiAoIXRoaXMuaGFzTm9kZShub2RlKSkge1xuICAgICAgLy8gQ2hlY2tpbmcgdGhlIGFyZ3VtZW50cyBsZW5ndGggYWxsb3dzIHRoZSB1c2VyIHRvIGFkZCBhIG5vZGUgd2l0aCB1bmRlZmluZWQgZGF0YVxuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgdGhpcy5ub2Rlc1tub2RlXSA9IGRhdGE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm5vZGVzW25vZGVdID0gbm9kZTtcbiAgICAgIH1cbiAgICAgIHRoaXMub3V0Z29pbmdFZGdlc1tub2RlXSA9IFtdO1xuICAgICAgdGhpcy5pbmNvbWluZ0VkZ2VzW25vZGVdID0gW107XG4gICAgfVxuICB9LFxuICAvKipcbiAgICogUmVtb3ZlIGEgbm9kZSBmcm9tIHRoZSBkZXBlbmRlbmN5IGdyYXBoLiBJZiBhIG5vZGUgZG9lcyBub3QgZXhpc3QsIHRoaXMgbWV0aG9kIHdpbGwgZG8gbm90aGluZy5cbiAgICovXG4gIHJlbW92ZU5vZGU6IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgaWYgKHRoaXMuaGFzTm9kZShub2RlKSkge1xuICAgICAgZGVsZXRlIHRoaXMubm9kZXNbbm9kZV07XG4gICAgICBkZWxldGUgdGhpcy5vdXRnb2luZ0VkZ2VzW25vZGVdO1xuICAgICAgZGVsZXRlIHRoaXMuaW5jb21pbmdFZGdlc1tub2RlXTtcbiAgICAgIFt0aGlzLmluY29taW5nRWRnZXMsIHRoaXMub3V0Z29pbmdFZGdlc10uZm9yRWFjaChmdW5jdGlvbiAoZWRnZUxpc3QpIHtcbiAgICAgICAgT2JqZWN0LmtleXMoZWRnZUxpc3QpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgIHZhciBpZHggPSBlZGdlTGlzdFtrZXldLmluZGV4T2Yobm9kZSk7XG4gICAgICAgICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgICAgICBlZGdlTGlzdFtrZXldLnNwbGljZShpZHgsIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgdGhpcyk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIG5vZGUgZXhpc3RzIGluIHRoZSBncmFwaFxuICAgKi9cbiAgaGFzTm9kZTogZnVuY3Rpb24gKG5vZGUpIHtcbiAgICByZXR1cm4gdGhpcy5ub2Rlcy5oYXNPd25Qcm9wZXJ0eShub2RlKTtcbiAgfSxcbiAgLyoqXG4gICAqIEdldCB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggYSBub2RlIG5hbWVcbiAgICovXG4gIGdldE5vZGVEYXRhOiBmdW5jdGlvbiAobm9kZSkge1xuICAgIGlmICh0aGlzLmhhc05vZGUobm9kZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLm5vZGVzW25vZGVdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlIGRvZXMgbm90IGV4aXN0OiBcIiArIG5vZGUpO1xuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIFNldCB0aGUgYXNzb2NpYXRlZCBkYXRhIGZvciBhIGdpdmVuIG5vZGUgbmFtZS4gSWYgdGhlIG5vZGUgZG9lcyBub3QgZXhpc3QsIHRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgYW4gZXJyb3JcbiAgICovXG4gIHNldE5vZGVEYXRhOiBmdW5jdGlvbiAobm9kZSwgZGF0YSkge1xuICAgIGlmICh0aGlzLmhhc05vZGUobm9kZSkpIHtcbiAgICAgIHRoaXMubm9kZXNbbm9kZV0gPSBkYXRhO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlIGRvZXMgbm90IGV4aXN0OiBcIiArIG5vZGUpO1xuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIEFkZCBhIGRlcGVuZGVuY3kgYmV0d2VlbiB0d28gbm9kZXMuIElmIGVpdGhlciBvZiB0aGUgbm9kZXMgZG9lcyBub3QgZXhpc3QsXG4gICAqIGFuIEVycm9yIHdpbGwgYmUgdGhyb3duLlxuICAgKi9cbiAgYWRkRGVwZW5kZW5jeTogZnVuY3Rpb24gKGZyb20sIHRvKSB7XG4gICAgaWYgKCF0aGlzLmhhc05vZGUoZnJvbSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vZGUgZG9lcyBub3QgZXhpc3Q6IFwiICsgZnJvbSk7XG4gICAgfVxuICAgIGlmICghdGhpcy5oYXNOb2RlKHRvKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm9kZSBkb2VzIG5vdCBleGlzdDogXCIgKyB0byk7XG4gICAgfVxuICAgIGlmICh0aGlzLm91dGdvaW5nRWRnZXNbZnJvbV0uaW5kZXhPZih0bykgPT09IC0xKSB7XG4gICAgICB0aGlzLm91dGdvaW5nRWRnZXNbZnJvbV0ucHVzaCh0byk7XG4gICAgfVxuICAgIGlmICh0aGlzLmluY29taW5nRWRnZXNbdG9dLmluZGV4T2YoZnJvbSkgPT09IC0xKSB7XG4gICAgICB0aGlzLmluY29taW5nRWRnZXNbdG9dLnB1c2goZnJvbSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICAvKipcbiAgICogUmVtb3ZlIGEgZGVwZW5kZW5jeSBiZXR3ZWVuIHR3byBub2Rlcy5cbiAgICovXG4gIHJlbW92ZURlcGVuZGVuY3k6IGZ1bmN0aW9uIChmcm9tLCB0bykge1xuICAgIHZhciBpZHg7XG4gICAgaWYgKHRoaXMuaGFzTm9kZShmcm9tKSkge1xuICAgICAgaWR4ID0gdGhpcy5vdXRnb2luZ0VkZ2VzW2Zyb21dLmluZGV4T2YodG8pO1xuICAgICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgIHRoaXMub3V0Z29pbmdFZGdlc1tmcm9tXS5zcGxpY2UoaWR4LCAxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5oYXNOb2RlKHRvKSkge1xuICAgICAgaWR4ID0gdGhpcy5pbmNvbWluZ0VkZ2VzW3RvXS5pbmRleE9mKGZyb20pO1xuICAgICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgIHRoaXMuaW5jb21pbmdFZGdlc1t0b10uc3BsaWNlKGlkeCwgMSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICAvKipcbiAgICogUmV0dXJuIGEgY2xvbmUgb2YgdGhlIGRlcGVuZGVuY3kgZ3JhcGguIElmIGFueSBjdXN0b20gZGF0YSBpcyBhdHRhY2hlZFxuICAgKiB0byB0aGUgbm9kZXMsIGl0IHdpbGwgb25seSBiZSBzaGFsbG93IGNvcGllZC5cbiAgICovXG4gIGNsb25lOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNvdXJjZSA9IHRoaXM7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBEZXBHcmFwaCgpO1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoc291cmNlLm5vZGVzKTtcbiAgICBrZXlzLmZvckVhY2goZnVuY3Rpb24gKG4pIHtcbiAgICAgIHJlc3VsdC5ub2Rlc1tuXSA9IHNvdXJjZS5ub2Rlc1tuXTtcbiAgICAgIHJlc3VsdC5vdXRnb2luZ0VkZ2VzW25dID0gc291cmNlLm91dGdvaW5nRWRnZXNbbl0uc2xpY2UoMCk7XG4gICAgICByZXN1bHQuaW5jb21pbmdFZGdlc1tuXSA9IHNvdXJjZS5pbmNvbWluZ0VkZ2VzW25dLnNsaWNlKDApO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0sXG4gIC8qKlxuICAgKiBHZXQgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZGlyZWN0IGRlcGVuZGVuY2llcyBvZiB0aGUgc3BlY2lmaWVkIG5vZGUuXG4gICAqXG4gICAqIFRocm93cyBhbiBFcnJvciBpZiB0aGUgc3BlY2lmaWVkIG5vZGUgZG9lcyBub3QgZXhpc3QuXG4gICAqL1xuICBkaXJlY3REZXBlbmRlbmNpZXNPZjogZnVuY3Rpb24gKG5vZGUpIHtcbiAgICBpZiAodGhpcy5oYXNOb2RlKG5vZGUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5vdXRnb2luZ0VkZ2VzW25vZGVdLnNsaWNlKDApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlIGRvZXMgbm90IGV4aXN0OiBcIiArIG5vZGUpO1xuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIEdldCBhbiBhcnJheSBjb250YWluaW5nIHRoZSBub2RlcyB0aGF0IGRpcmVjdGx5IGRlcGVuZCBvbiB0aGUgc3BlY2lmaWVkIG5vZGUuXG4gICAqXG4gICAqIFRocm93cyBhbiBFcnJvciBpZiB0aGUgc3BlY2lmaWVkIG5vZGUgZG9lcyBub3QgZXhpc3QuXG4gICAqL1xuICBkaXJlY3REZXBlbmRhbnRzT2Y6IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgaWYgKHRoaXMuaGFzTm9kZShub2RlKSkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5jb21pbmdFZGdlc1tub2RlXS5zbGljZSgwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm9kZSBkb2VzIG5vdCBleGlzdDogXCIgKyBub2RlKTtcbiAgICB9XG4gIH0sXG4gIC8qKlxuICAgKiBHZXQgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgbm9kZXMgdGhhdCB0aGUgc3BlY2lmaWVkIG5vZGUgZGVwZW5kcyBvbiAodHJhbnNpdGl2ZWx5KS5cbiAgICpcbiAgICogVGhyb3dzIGFuIEVycm9yIGlmIHRoZSBncmFwaCBoYXMgYSBjeWNsZSwgb3IgdGhlIHNwZWNpZmllZCBub2RlIGRvZXMgbm90IGV4aXN0LlxuICAgKlxuICAgKiBJZiBgbGVhdmVzT25seWAgaXMgdHJ1ZSwgb25seSBub2RlcyB0aGF0IGRvIG5vdCBkZXBlbmQgb24gYW55IG90aGVyIG5vZGVzIHdpbGwgYmUgcmV0dXJuZWRcbiAgICogaW4gdGhlIGFycmF5LlxuICAgKi9cbiAgZGVwZW5kZW5jaWVzT2Y6IGZ1bmN0aW9uIChub2RlLCBsZWF2ZXNPbmx5KSB7XG4gICAgaWYgKHRoaXMuaGFzTm9kZShub2RlKSkge1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgdmFyIERGUyA9IGNyZWF0ZURGUyhcbiAgICAgICAgdGhpcy5vdXRnb2luZ0VkZ2VzLFxuICAgICAgICBsZWF2ZXNPbmx5LFxuICAgICAgICByZXN1bHQsXG4gICAgICAgIHRoaXMuY2lyY3VsYXJcbiAgICAgICk7XG4gICAgICBERlMobm9kZSk7XG4gICAgICB2YXIgaWR4ID0gcmVzdWx0LmluZGV4T2Yobm9kZSk7XG4gICAgICBpZiAoaWR4ID49IDApIHtcbiAgICAgICAgcmVzdWx0LnNwbGljZShpZHgsIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm9kZSBkb2VzIG5vdCBleGlzdDogXCIgKyBub2RlKTtcbiAgICB9XG4gIH0sXG4gIC8qKlxuICAgKiBnZXQgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgbm9kZXMgdGhhdCBkZXBlbmQgb24gdGhlIHNwZWNpZmllZCBub2RlICh0cmFuc2l0aXZlbHkpLlxuICAgKlxuICAgKiBUaHJvd3MgYW4gRXJyb3IgaWYgdGhlIGdyYXBoIGhhcyBhIGN5Y2xlLCBvciB0aGUgc3BlY2lmaWVkIG5vZGUgZG9lcyBub3QgZXhpc3QuXG4gICAqXG4gICAqIElmIGBsZWF2ZXNPbmx5YCBpcyB0cnVlLCBvbmx5IG5vZGVzIHRoYXQgZG8gbm90IGhhdmUgYW55IGRlcGVuZGFudHMgd2lsbCBiZSByZXR1cm5lZCBpbiB0aGUgYXJyYXkuXG4gICAqL1xuICBkZXBlbmRhbnRzT2Y6IGZ1bmN0aW9uIChub2RlLCBsZWF2ZXNPbmx5KSB7XG4gICAgaWYgKHRoaXMuaGFzTm9kZShub2RlKSkge1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgdmFyIERGUyA9IGNyZWF0ZURGUyhcbiAgICAgICAgdGhpcy5pbmNvbWluZ0VkZ2VzLFxuICAgICAgICBsZWF2ZXNPbmx5LFxuICAgICAgICByZXN1bHQsXG4gICAgICAgIHRoaXMuY2lyY3VsYXJcbiAgICAgICk7XG4gICAgICBERlMobm9kZSk7XG4gICAgICB2YXIgaWR4ID0gcmVzdWx0LmluZGV4T2Yobm9kZSk7XG4gICAgICBpZiAoaWR4ID49IDApIHtcbiAgICAgICAgcmVzdWx0LnNwbGljZShpZHgsIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm9kZSBkb2VzIG5vdCBleGlzdDogXCIgKyBub2RlKTtcbiAgICB9XG4gIH0sXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3QgdGhlIG92ZXJhbGwgcHJvY2Vzc2luZyBvcmRlciBmb3IgdGhlIGRlcGVuZGVuY3kgZ3JhcGguXG4gICAqXG4gICAqIFRocm93cyBhbiBFcnJvciBpZiB0aGUgZ3JhcGggaGFzIGEgY3ljbGUuXG4gICAqXG4gICAqIElmIGBsZWF2ZXNPbmx5YCBpcyB0cnVlLCBvbmx5IG5vZGVzIHRoYXQgZG8gbm90IGRlcGVuZCBvbiBhbnkgb3RoZXIgbm9kZXMgd2lsbCBiZSByZXR1cm5lZC5cbiAgICovXG4gIG92ZXJhbGxPcmRlcjogZnVuY3Rpb24gKGxlYXZlc09ubHkpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXModGhpcy5ub2Rlcyk7XG4gICAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gcmVzdWx0OyAvLyBFbXB0eSBncmFwaFxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIXRoaXMuY2lyY3VsYXIpIHtcbiAgICAgICAgLy8gTG9vayBmb3IgY3ljbGVzIC0gd2UgcnVuIHRoZSBERlMgc3RhcnRpbmcgYXQgYWxsIHRoZSBub2RlcyBpbiBjYXNlIHRoZXJlXG4gICAgICAgIC8vIGFyZSBzZXZlcmFsIGRpc2Nvbm5lY3RlZCBzdWJncmFwaHMgaW5zaWRlIHRoaXMgZGVwZW5kZW5jeSBncmFwaC5cbiAgICAgICAgdmFyIEN5Y2xlREZTID0gY3JlYXRlREZTKHRoaXMub3V0Z29pbmdFZGdlcywgZmFsc2UsIFtdLCB0aGlzLmNpcmN1bGFyKTtcbiAgICAgICAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7XG4gICAgICAgICAgQ3ljbGVERlMobik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB2YXIgREZTID0gY3JlYXRlREZTKFxuICAgICAgICB0aGlzLm91dGdvaW5nRWRnZXMsXG4gICAgICAgIGxlYXZlc09ubHksXG4gICAgICAgIHJlc3VsdCxcbiAgICAgICAgdGhpcy5jaXJjdWxhclxuICAgICAgKTtcbiAgICAgIC8vIEZpbmQgYWxsIHBvdGVudGlhbCBzdGFydGluZyBwb2ludHMgKG5vZGVzIHdpdGggbm90aGluZyBkZXBlbmRpbmcgb24gdGhlbSkgYW5cbiAgICAgIC8vIHJ1biBhIERGUyBzdGFydGluZyBhdCB0aGVzZSBwb2ludHMgdG8gZ2V0IHRoZSBvcmRlclxuICAgICAga2V5c1xuICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgcmV0dXJuIHNlbGYuaW5jb21pbmdFZGdlc1tub2RlXS5sZW5ndGggPT09IDA7XG4gICAgICAgIH0pXG4gICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7XG4gICAgICAgICAgREZTKG4pO1xuICAgICAgICB9KTtcblxuICAgICAgLy8gSWYgd2UncmUgYWxsb3dpbmcgY3ljbGVzIC0gd2UgbmVlZCB0byBydW4gdGhlIERGUyBhZ2FpbnN0IGFueSByZW1haW5pbmdcbiAgICAgIC8vIG5vZGVzIHRoYXQgZGlkIG5vdCBlbmQgdXAgaW4gdGhlIGluaXRpYWwgcmVzdWx0IChhcyB0aGV5IGFyZSBwYXJ0IG9mIGFcbiAgICAgIC8vIHN1YmdyYXBoIHRoYXQgZG9lcyBub3QgaGF2ZSBhIGNsZWFyIHN0YXJ0aW5nIHBvaW50KVxuICAgICAgaWYgKHRoaXMuY2lyY3VsYXIpIHtcbiAgICAgICAga2V5c1xuICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQuaW5kZXhPZihub2RlKSA9PT0gLTE7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZm9yRWFjaChmdW5jdGlvbiAobikge1xuICAgICAgICAgICAgREZTKG4pO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIEdldCBhbiBhcnJheSBvZiBub2RlcyB0aGF0IGhhdmUgbm8gZGVwZW5kYW50cyAoaS5lLiBub3RoaW5nIGRlcGVuZHMgb24gdGhlbSkuXG4gICAqL1xuICBlbnRyeU5vZGVzOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLm5vZGVzKS5maWx0ZXIoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIHJldHVybiBzZWxmLmluY29taW5nRWRnZXNbbm9kZV0ubGVuZ3RoID09PSAwO1xuICAgIH0pO1xuICB9XG59O1xuXG4vLyBDcmVhdGUgc29tZSBhbGlhc2VzXG5EZXBHcmFwaC5wcm90b3R5cGUuZGlyZWN0RGVwZW5kZW50c09mID0gRGVwR3JhcGgucHJvdG90eXBlLmRpcmVjdERlcGVuZGFudHNPZjtcbkRlcEdyYXBoLnByb3RvdHlwZS5kZXBlbmRlbnRzT2YgPSBEZXBHcmFwaC5wcm90b3R5cGUuZGVwZW5kYW50c09mO1xuXG4vKipcbiAqIEN5Y2xlIGVycm9yLCBpbmNsdWRpbmcgdGhlIHBhdGggb2YgdGhlIGN5Y2xlLlxuICovXG52YXIgRGVwR3JhcGhDeWNsZUVycm9yID0gKGV4cG9ydHMuRGVwR3JhcGhDeWNsZUVycm9yID0gZnVuY3Rpb24gKGN5Y2xlUGF0aCkge1xuICB2YXIgbWVzc2FnZSA9IFwiRGVwZW5kZW5jeSBDeWNsZSBGb3VuZDogXCIgKyBjeWNsZVBhdGguam9pbihcIiAtPiBcIik7XG4gIHZhciBpbnN0YW5jZSA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgaW5zdGFuY2UuY3ljbGVQYXRoID0gY3ljbGVQYXRoO1xuICBPYmplY3Quc2V0UHJvdG90eXBlT2YoaW5zdGFuY2UsIE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKSk7XG4gIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKGluc3RhbmNlLCBEZXBHcmFwaEN5Y2xlRXJyb3IpO1xuICB9XG4gIHJldHVybiBpbnN0YW5jZTtcbn0pO1xuRGVwR3JhcGhDeWNsZUVycm9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlLCB7XG4gIGNvbnN0cnVjdG9yOiB7XG4gICAgdmFsdWU6IEVycm9yLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9XG59KTtcbk9iamVjdC5zZXRQcm90b3R5cGVPZihEZXBHcmFwaEN5Y2xlRXJyb3IsIEVycm9yKTtcbiIsIi8qKlxuICogaW5zcGlyZWQgYnkgaXMtbnVtYmVyIDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9pcy1udW1iZXI+XG4gKiBidXQgc2lnbmlmaWNhbnRseSBzaW1wbGlmaWVkIGFuZCBzcGVkIHVwIGJ5IGlnbm9yaW5nIG51bWJlciBhbmQgc3RyaW5nIGNvbnN0cnVjdG9yc1xuICogaWUgdGhlc2UgcmV0dXJuIGZhbHNlOlxuICogICBuZXcgTnVtYmVyKDEpXG4gKiAgIG5ldyBTdHJpbmcoJzEnKVxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGFsbEJsYW5rQ2hhckNvZGVzID0gcmVxdWlyZSgnaXMtc3RyaW5nLWJsYW5rJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obikge1xuICAgIHZhciB0eXBlID0gdHlwZW9mIG47XG4gICAgaWYodHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdmFyIG9yaWdpbmFsID0gbjtcbiAgICAgICAgbiA9ICtuO1xuICAgICAgICAvLyB3aGl0ZXNwYWNlIHN0cmluZ3MgY2FzdCB0byB6ZXJvIC0gZmlsdGVyIHRoZW0gb3V0XG4gICAgICAgIGlmKG49PT0wICYmIGFsbEJsYW5rQ2hhckNvZGVzKG9yaWdpbmFsKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBlbHNlIGlmKHR5cGUgIT09ICdudW1iZXInKSByZXR1cm4gZmFsc2U7XG5cbiAgICByZXR1cm4gbiAtIG4gPCAxO1xufTtcbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LCBDaHJpcyBQZXR0aXR0XG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4gKlxuICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4gKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqXG4gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uXG4gKiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVyIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuICogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXRcbiAqIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIiBBTkRcbiAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEXG4gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXG4gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFXG4gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTFxuICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1JcbiAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSXG4gKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLFxuICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0VcbiAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKi9cblxudmFyIGxpYiA9IHJlcXVpcmUoXCIuL2xpYlwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEdyYXBoOiBsaWIuR3JhcGgsXG4gIGpzb246IHJlcXVpcmUoXCIuL2xpYi9qc29uXCIpLFxuICBhbGc6IHJlcXVpcmUoXCIuL2xpYi9hbGdcIiksXG4gIHZlcnNpb246IGxpYi52ZXJzaW9uXG59O1xuIiwidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbXBvbmVudHM7XG5cbmZ1bmN0aW9uIGNvbXBvbmVudHMoZykge1xuICB2YXIgdmlzaXRlZCA9IHt9O1xuICB2YXIgY21wdHMgPSBbXTtcbiAgdmFyIGNtcHQ7XG5cbiAgZnVuY3Rpb24gZGZzKHYpIHtcbiAgICBpZiAoXy5oYXModmlzaXRlZCwgdikpIHJldHVybjtcbiAgICB2aXNpdGVkW3ZdID0gdHJ1ZTtcbiAgICBjbXB0LnB1c2godik7XG4gICAgXy5lYWNoKGcuc3VjY2Vzc29ycyh2KSwgZGZzKTtcbiAgICBfLmVhY2goZy5wcmVkZWNlc3NvcnModiksIGRmcyk7XG4gIH1cblxuICBfLmVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgY21wdCA9IFtdO1xuICAgIGRmcyh2KTtcbiAgICBpZiAoY21wdC5sZW5ndGgpIHtcbiAgICAgIGNtcHRzLnB1c2goY21wdCk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gY21wdHM7XG59XG4iLCJ2YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gZGZzO1xuXG4vKlxuICogQSBoZWxwZXIgdGhhdCBwcmVmb3JtcyBhIHByZS0gb3IgcG9zdC1vcmRlciB0cmF2ZXJzYWwgb24gdGhlIGlucHV0IGdyYXBoXG4gKiBhbmQgcmV0dXJucyB0aGUgbm9kZXMgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSB2aXNpdGVkLiBJZiB0aGUgZ3JhcGggaXNcbiAqIHVuZGlyZWN0ZWQgdGhlbiB0aGlzIGFsZ29yaXRobSB3aWxsIG5hdmlnYXRlIHVzaW5nIG5laWdoYm9ycy4gSWYgdGhlIGdyYXBoXG4gKiBpcyBkaXJlY3RlZCB0aGVuIHRoaXMgYWxnb3JpdGhtIHdpbGwgbmF2aWdhdGUgdXNpbmcgc3VjY2Vzc29ycy5cbiAqXG4gKiBPcmRlciBtdXN0IGJlIG9uZSBvZiBcInByZVwiIG9yIFwicG9zdFwiLlxuICovXG5mdW5jdGlvbiBkZnMoZywgdnMsIG9yZGVyKSB7XG4gIGlmICghXy5pc0FycmF5KHZzKSkge1xuICAgIHZzID0gW3ZzXTtcbiAgfVxuXG4gIHZhciBuYXZpZ2F0aW9uID0gKGcuaXNEaXJlY3RlZCgpID8gZy5zdWNjZXNzb3JzIDogZy5uZWlnaGJvcnMpLmJpbmQoZyk7XG5cbiAgdmFyIGFjYyA9IFtdO1xuICB2YXIgdmlzaXRlZCA9IHt9O1xuICBfLmVhY2godnMsIGZ1bmN0aW9uKHYpIHtcbiAgICBpZiAoIWcuaGFzTm9kZSh2KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiR3JhcGggZG9lcyBub3QgaGF2ZSBub2RlOiBcIiArIHYpO1xuICAgIH1cblxuICAgIGRvRGZzKGcsIHYsIG9yZGVyID09PSBcInBvc3RcIiwgdmlzaXRlZCwgbmF2aWdhdGlvbiwgYWNjKTtcbiAgfSk7XG4gIHJldHVybiBhY2M7XG59XG5cbmZ1bmN0aW9uIGRvRGZzKGcsIHYsIHBvc3RvcmRlciwgdmlzaXRlZCwgbmF2aWdhdGlvbiwgYWNjKSB7XG4gIGlmICghXy5oYXModmlzaXRlZCwgdikpIHtcbiAgICB2aXNpdGVkW3ZdID0gdHJ1ZTtcblxuICAgIGlmICghcG9zdG9yZGVyKSB7IGFjYy5wdXNoKHYpOyB9XG4gICAgXy5lYWNoKG5hdmlnYXRpb24odiksIGZ1bmN0aW9uKHcpIHtcbiAgICAgIGRvRGZzKGcsIHcsIHBvc3RvcmRlciwgdmlzaXRlZCwgbmF2aWdhdGlvbiwgYWNjKTtcbiAgICB9KTtcbiAgICBpZiAocG9zdG9yZGVyKSB7IGFjYy5wdXNoKHYpOyB9XG4gIH1cbn1cbiIsInZhciBkaWprc3RyYSA9IHJlcXVpcmUoXCIuL2RpamtzdHJhXCIpO1xudmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRpamtzdHJhQWxsO1xuXG5mdW5jdGlvbiBkaWprc3RyYUFsbChnLCB3ZWlnaHRGdW5jLCBlZGdlRnVuYykge1xuICByZXR1cm4gXy50cmFuc2Zvcm0oZy5ub2RlcygpLCBmdW5jdGlvbihhY2MsIHYpIHtcbiAgICBhY2Nbdl0gPSBkaWprc3RyYShnLCB2LCB3ZWlnaHRGdW5jLCBlZGdlRnVuYyk7XG4gIH0sIHt9KTtcbn1cbiIsInZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcbnZhciBQcmlvcml0eVF1ZXVlID0gcmVxdWlyZShcIi4uL2RhdGEvcHJpb3JpdHktcXVldWVcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gZGlqa3N0cmE7XG5cbnZhciBERUZBVUxUX1dFSUdIVF9GVU5DID0gXy5jb25zdGFudCgxKTtcblxuZnVuY3Rpb24gZGlqa3N0cmEoZywgc291cmNlLCB3ZWlnaHRGbiwgZWRnZUZuKSB7XG4gIHJldHVybiBydW5EaWprc3RyYShnLCBTdHJpbmcoc291cmNlKSxcbiAgICB3ZWlnaHRGbiB8fCBERUZBVUxUX1dFSUdIVF9GVU5DLFxuICAgIGVkZ2VGbiB8fCBmdW5jdGlvbih2KSB7IHJldHVybiBnLm91dEVkZ2VzKHYpOyB9KTtcbn1cblxuZnVuY3Rpb24gcnVuRGlqa3N0cmEoZywgc291cmNlLCB3ZWlnaHRGbiwgZWRnZUZuKSB7XG4gIHZhciByZXN1bHRzID0ge307XG4gIHZhciBwcSA9IG5ldyBQcmlvcml0eVF1ZXVlKCk7XG4gIHZhciB2LCB2RW50cnk7XG5cbiAgdmFyIHVwZGF0ZU5laWdoYm9ycyA9IGZ1bmN0aW9uKGVkZ2UpIHtcbiAgICB2YXIgdyA9IGVkZ2UudiAhPT0gdiA/IGVkZ2UudiA6IGVkZ2UudztcbiAgICB2YXIgd0VudHJ5ID0gcmVzdWx0c1t3XTtcbiAgICB2YXIgd2VpZ2h0ID0gd2VpZ2h0Rm4oZWRnZSk7XG4gICAgdmFyIGRpc3RhbmNlID0gdkVudHJ5LmRpc3RhbmNlICsgd2VpZ2h0O1xuXG4gICAgaWYgKHdlaWdodCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImRpamtzdHJhIGRvZXMgbm90IGFsbG93IG5lZ2F0aXZlIGVkZ2Ugd2VpZ2h0cy4gXCIgK1xuICAgICAgICAgICAgICAgICAgICAgIFwiQmFkIGVkZ2U6IFwiICsgZWRnZSArIFwiIFdlaWdodDogXCIgKyB3ZWlnaHQpO1xuICAgIH1cblxuICAgIGlmIChkaXN0YW5jZSA8IHdFbnRyeS5kaXN0YW5jZSkge1xuICAgICAgd0VudHJ5LmRpc3RhbmNlID0gZGlzdGFuY2U7XG4gICAgICB3RW50cnkucHJlZGVjZXNzb3IgPSB2O1xuICAgICAgcHEuZGVjcmVhc2UodywgZGlzdGFuY2UpO1xuICAgIH1cbiAgfTtcblxuICBnLm5vZGVzKCkuZm9yRWFjaChmdW5jdGlvbih2KSB7XG4gICAgdmFyIGRpc3RhbmNlID0gdiA9PT0gc291cmNlID8gMCA6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgICByZXN1bHRzW3ZdID0geyBkaXN0YW5jZTogZGlzdGFuY2UgfTtcbiAgICBwcS5hZGQodiwgZGlzdGFuY2UpO1xuICB9KTtcblxuICB3aGlsZSAocHEuc2l6ZSgpID4gMCkge1xuICAgIHYgPSBwcS5yZW1vdmVNaW4oKTtcbiAgICB2RW50cnkgPSByZXN1bHRzW3ZdO1xuICAgIGlmICh2RW50cnkuZGlzdGFuY2UgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgZWRnZUZuKHYpLmZvckVhY2godXBkYXRlTmVpZ2hib3JzKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHRzO1xufVxuIiwidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xudmFyIHRhcmphbiA9IHJlcXVpcmUoXCIuL3RhcmphblwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmaW5kQ3ljbGVzO1xuXG5mdW5jdGlvbiBmaW5kQ3ljbGVzKGcpIHtcbiAgcmV0dXJuIF8uZmlsdGVyKHRhcmphbihnKSwgZnVuY3Rpb24oY21wdCkge1xuICAgIHJldHVybiBjbXB0Lmxlbmd0aCA+IDEgfHwgKGNtcHQubGVuZ3RoID09PSAxICYmIGcuaGFzRWRnZShjbXB0WzBdLCBjbXB0WzBdKSk7XG4gIH0pO1xufVxuIiwidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZsb3lkV2Fyc2hhbGw7XG5cbnZhciBERUZBVUxUX1dFSUdIVF9GVU5DID0gXy5jb25zdGFudCgxKTtcblxuZnVuY3Rpb24gZmxveWRXYXJzaGFsbChnLCB3ZWlnaHRGbiwgZWRnZUZuKSB7XG4gIHJldHVybiBydW5GbG95ZFdhcnNoYWxsKGcsXG4gICAgd2VpZ2h0Rm4gfHwgREVGQVVMVF9XRUlHSFRfRlVOQyxcbiAgICBlZGdlRm4gfHwgZnVuY3Rpb24odikgeyByZXR1cm4gZy5vdXRFZGdlcyh2KTsgfSk7XG59XG5cbmZ1bmN0aW9uIHJ1bkZsb3lkV2Fyc2hhbGwoZywgd2VpZ2h0Rm4sIGVkZ2VGbikge1xuICB2YXIgcmVzdWx0cyA9IHt9O1xuICB2YXIgbm9kZXMgPSBnLm5vZGVzKCk7XG5cbiAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbih2KSB7XG4gICAgcmVzdWx0c1t2XSA9IHt9O1xuICAgIHJlc3VsdHNbdl1bdl0gPSB7IGRpc3RhbmNlOiAwIH07XG4gICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbih3KSB7XG4gICAgICBpZiAodiAhPT0gdykge1xuICAgICAgICByZXN1bHRzW3ZdW3ddID0geyBkaXN0YW5jZTogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIH07XG4gICAgICB9XG4gICAgfSk7XG4gICAgZWRnZUZuKHYpLmZvckVhY2goZnVuY3Rpb24oZWRnZSkge1xuICAgICAgdmFyIHcgPSBlZGdlLnYgPT09IHYgPyBlZGdlLncgOiBlZGdlLnY7XG4gICAgICB2YXIgZCA9IHdlaWdodEZuKGVkZ2UpO1xuICAgICAgcmVzdWx0c1t2XVt3XSA9IHsgZGlzdGFuY2U6IGQsIHByZWRlY2Vzc29yOiB2IH07XG4gICAgfSk7XG4gIH0pO1xuXG4gIG5vZGVzLmZvckVhY2goZnVuY3Rpb24oaykge1xuICAgIHZhciByb3dLID0gcmVzdWx0c1trXTtcbiAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKGkpIHtcbiAgICAgIHZhciByb3dJID0gcmVzdWx0c1tpXTtcbiAgICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24oaikge1xuICAgICAgICB2YXIgaWsgPSByb3dJW2tdO1xuICAgICAgICB2YXIga2ogPSByb3dLW2pdO1xuICAgICAgICB2YXIgaWogPSByb3dJW2pdO1xuICAgICAgICB2YXIgYWx0RGlzdGFuY2UgPSBpay5kaXN0YW5jZSArIGtqLmRpc3RhbmNlO1xuICAgICAgICBpZiAoYWx0RGlzdGFuY2UgPCBpai5kaXN0YW5jZSkge1xuICAgICAgICAgIGlqLmRpc3RhbmNlID0gYWx0RGlzdGFuY2U7XG4gICAgICAgICAgaWoucHJlZGVjZXNzb3IgPSBrai5wcmVkZWNlc3NvcjtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHRzO1xufVxuIiwibW9kdWxlLmV4cG9ydHMgPSB7XG4gIGNvbXBvbmVudHM6IHJlcXVpcmUoXCIuL2NvbXBvbmVudHNcIiksXG4gIGRpamtzdHJhOiByZXF1aXJlKFwiLi9kaWprc3RyYVwiKSxcbiAgZGlqa3N0cmFBbGw6IHJlcXVpcmUoXCIuL2RpamtzdHJhLWFsbFwiKSxcbiAgZmluZEN5Y2xlczogcmVxdWlyZShcIi4vZmluZC1jeWNsZXNcIiksXG4gIGZsb3lkV2Fyc2hhbGw6IHJlcXVpcmUoXCIuL2Zsb3lkLXdhcnNoYWxsXCIpLFxuICBpc0FjeWNsaWM6IHJlcXVpcmUoXCIuL2lzLWFjeWNsaWNcIiksXG4gIHBvc3RvcmRlcjogcmVxdWlyZShcIi4vcG9zdG9yZGVyXCIpLFxuICBwcmVvcmRlcjogcmVxdWlyZShcIi4vcHJlb3JkZXJcIiksXG4gIHByaW06IHJlcXVpcmUoXCIuL3ByaW1cIiksXG4gIHRhcmphbjogcmVxdWlyZShcIi4vdGFyamFuXCIpLFxuICB0b3Bzb3J0OiByZXF1aXJlKFwiLi90b3Bzb3J0XCIpXG59O1xuIiwidmFyIHRvcHNvcnQgPSByZXF1aXJlKFwiLi90b3Bzb3J0XCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQWN5Y2xpYztcblxuZnVuY3Rpb24gaXNBY3ljbGljKGcpIHtcbiAgdHJ5IHtcbiAgICB0b3Bzb3J0KGcpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKGUgaW5zdGFuY2VvZiB0b3Bzb3J0LkN5Y2xlRXhjZXB0aW9uKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRocm93IGU7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG4iLCJ2YXIgZGZzID0gcmVxdWlyZShcIi4vZGZzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBvc3RvcmRlcjtcblxuZnVuY3Rpb24gcG9zdG9yZGVyKGcsIHZzKSB7XG4gIHJldHVybiBkZnMoZywgdnMsIFwicG9zdFwiKTtcbn1cbiIsInZhciBkZnMgPSByZXF1aXJlKFwiLi9kZnNcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gcHJlb3JkZXI7XG5cbmZ1bmN0aW9uIHByZW9yZGVyKGcsIHZzKSB7XG4gIHJldHVybiBkZnMoZywgdnMsIFwicHJlXCIpO1xufVxuIiwidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xudmFyIEdyYXBoID0gcmVxdWlyZShcIi4uL2dyYXBoXCIpO1xudmFyIFByaW9yaXR5UXVldWUgPSByZXF1aXJlKFwiLi4vZGF0YS9wcmlvcml0eS1xdWV1ZVwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwcmltO1xuXG5mdW5jdGlvbiBwcmltKGcsIHdlaWdodEZ1bmMpIHtcbiAgdmFyIHJlc3VsdCA9IG5ldyBHcmFwaCgpO1xuICB2YXIgcGFyZW50cyA9IHt9O1xuICB2YXIgcHEgPSBuZXcgUHJpb3JpdHlRdWV1ZSgpO1xuICB2YXIgdjtcblxuICBmdW5jdGlvbiB1cGRhdGVOZWlnaGJvcnMoZWRnZSkge1xuICAgIHZhciB3ID0gZWRnZS52ID09PSB2ID8gZWRnZS53IDogZWRnZS52O1xuICAgIHZhciBwcmkgPSBwcS5wcmlvcml0eSh3KTtcbiAgICBpZiAocHJpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciBlZGdlV2VpZ2h0ID0gd2VpZ2h0RnVuYyhlZGdlKTtcbiAgICAgIGlmIChlZGdlV2VpZ2h0IDwgcHJpKSB7XG4gICAgICAgIHBhcmVudHNbd10gPSB2O1xuICAgICAgICBwcS5kZWNyZWFzZSh3LCBlZGdlV2VpZ2h0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoZy5ub2RlQ291bnQoKSA9PT0gMCkge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBfLmVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgcHEuYWRkKHYsIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7XG4gICAgcmVzdWx0LnNldE5vZGUodik7XG4gIH0pO1xuXG4gIC8vIFN0YXJ0IGZyb20gYW4gYXJiaXRyYXJ5IG5vZGVcbiAgcHEuZGVjcmVhc2UoZy5ub2RlcygpWzBdLCAwKTtcblxuICB2YXIgaW5pdCA9IGZhbHNlO1xuICB3aGlsZSAocHEuc2l6ZSgpID4gMCkge1xuICAgIHYgPSBwcS5yZW1vdmVNaW4oKTtcbiAgICBpZiAoXy5oYXMocGFyZW50cywgdikpIHtcbiAgICAgIHJlc3VsdC5zZXRFZGdlKHYsIHBhcmVudHNbdl0pO1xuICAgIH0gZWxzZSBpZiAoaW5pdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW5wdXQgZ3JhcGggaXMgbm90IGNvbm5lY3RlZDogXCIgKyBnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5pdCA9IHRydWU7XG4gICAgfVxuXG4gICAgZy5ub2RlRWRnZXModikuZm9yRWFjaCh1cGRhdGVOZWlnaGJvcnMpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiIsInZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSB0YXJqYW47XG5cbmZ1bmN0aW9uIHRhcmphbihnKSB7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBzdGFjayA9IFtdO1xuICB2YXIgdmlzaXRlZCA9IHt9OyAvLyBub2RlIGlkIC0+IHsgb25TdGFjaywgbG93bGluaywgaW5kZXggfVxuICB2YXIgcmVzdWx0cyA9IFtdO1xuXG4gIGZ1bmN0aW9uIGRmcyh2KSB7XG4gICAgdmFyIGVudHJ5ID0gdmlzaXRlZFt2XSA9IHtcbiAgICAgIG9uU3RhY2s6IHRydWUsXG4gICAgICBsb3dsaW5rOiBpbmRleCxcbiAgICAgIGluZGV4OiBpbmRleCsrXG4gICAgfTtcbiAgICBzdGFjay5wdXNoKHYpO1xuXG4gICAgZy5zdWNjZXNzb3JzKHYpLmZvckVhY2goZnVuY3Rpb24odykge1xuICAgICAgaWYgKCFfLmhhcyh2aXNpdGVkLCB3KSkge1xuICAgICAgICBkZnModyk7XG4gICAgICAgIGVudHJ5Lmxvd2xpbmsgPSBNYXRoLm1pbihlbnRyeS5sb3dsaW5rLCB2aXNpdGVkW3ddLmxvd2xpbmspO1xuICAgICAgfSBlbHNlIGlmICh2aXNpdGVkW3ddLm9uU3RhY2spIHtcbiAgICAgICAgZW50cnkubG93bGluayA9IE1hdGgubWluKGVudHJ5Lmxvd2xpbmssIHZpc2l0ZWRbd10uaW5kZXgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKGVudHJ5Lmxvd2xpbmsgPT09IGVudHJ5LmluZGV4KSB7XG4gICAgICB2YXIgY21wdCA9IFtdO1xuICAgICAgdmFyIHc7XG4gICAgICBkbyB7XG4gICAgICAgIHcgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgdmlzaXRlZFt3XS5vblN0YWNrID0gZmFsc2U7XG4gICAgICAgIGNtcHQucHVzaCh3KTtcbiAgICAgIH0gd2hpbGUgKHYgIT09IHcpO1xuICAgICAgcmVzdWx0cy5wdXNoKGNtcHQpO1xuICAgIH1cbiAgfVxuXG4gIGcubm9kZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHtcbiAgICBpZiAoIV8uaGFzKHZpc2l0ZWQsIHYpKSB7XG4gICAgICBkZnModik7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcmVzdWx0cztcbn1cbiIsInZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSB0b3Bzb3J0O1xudG9wc29ydC5DeWNsZUV4Y2VwdGlvbiA9IEN5Y2xlRXhjZXB0aW9uO1xuXG5mdW5jdGlvbiB0b3Bzb3J0KGcpIHtcbiAgdmFyIHZpc2l0ZWQgPSB7fTtcbiAgdmFyIHN0YWNrID0ge307XG4gIHZhciByZXN1bHRzID0gW107XG5cbiAgZnVuY3Rpb24gdmlzaXQobm9kZSkge1xuICAgIGlmIChfLmhhcyhzdGFjaywgbm9kZSkpIHtcbiAgICAgIHRocm93IG5ldyBDeWNsZUV4Y2VwdGlvbigpO1xuICAgIH1cblxuICAgIGlmICghXy5oYXModmlzaXRlZCwgbm9kZSkpIHtcbiAgICAgIHN0YWNrW25vZGVdID0gdHJ1ZTtcbiAgICAgIHZpc2l0ZWRbbm9kZV0gPSB0cnVlO1xuICAgICAgXy5lYWNoKGcucHJlZGVjZXNzb3JzKG5vZGUpLCB2aXNpdCk7XG4gICAgICBkZWxldGUgc3RhY2tbbm9kZV07XG4gICAgICByZXN1bHRzLnB1c2gobm9kZSk7XG4gICAgfVxuICB9XG5cbiAgXy5lYWNoKGcuc2lua3MoKSwgdmlzaXQpO1xuXG4gIGlmIChfLnNpemUodmlzaXRlZCkgIT09IGcubm9kZUNvdW50KCkpIHtcbiAgICB0aHJvdyBuZXcgQ3ljbGVFeGNlcHRpb24oKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHRzO1xufVxuXG5mdW5jdGlvbiBDeWNsZUV4Y2VwdGlvbigpIHt9XG5DeWNsZUV4Y2VwdGlvbi5wcm90b3R5cGUgPSBuZXcgRXJyb3IoKTsgLy8gbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBFcnJvciB0byBwYXNzIHRlc3RpbmciLCJ2YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gUHJpb3JpdHlRdWV1ZTtcblxuLyoqXG4gKiBBIG1pbi1wcmlvcml0eSBxdWV1ZSBkYXRhIHN0cnVjdHVyZS4gVGhpcyBhbGdvcml0aG0gaXMgZGVyaXZlZCBmcm9tIENvcm1lbixcbiAqIGV0IGFsLiwgXCJJbnRyb2R1Y3Rpb24gdG8gQWxnb3JpdGhtc1wiLiBUaGUgYmFzaWMgaWRlYSBvZiBhIG1pbi1wcmlvcml0eVxuICogcXVldWUgaXMgdGhhdCB5b3UgY2FuIGVmZmljaWVudGx5IChpbiBPKDEpIHRpbWUpIGdldCB0aGUgc21hbGxlc3Qga2V5IGluXG4gKiB0aGUgcXVldWUuIEFkZGluZyBhbmQgcmVtb3ZpbmcgZWxlbWVudHMgdGFrZXMgTyhsb2cgbikgdGltZS4gQSBrZXkgY2FuXG4gKiBoYXZlIGl0cyBwcmlvcml0eSBkZWNyZWFzZWQgaW4gTyhsb2cgbikgdGltZS5cbiAqL1xuZnVuY3Rpb24gUHJpb3JpdHlRdWV1ZSgpIHtcbiAgdGhpcy5fYXJyID0gW107XG4gIHRoaXMuX2tleUluZGljZXMgPSB7fTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHF1ZXVlLiBUYWtlcyBgTygxKWAgdGltZS5cbiAqL1xuUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5fYXJyLmxlbmd0aDtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUga2V5cyB0aGF0IGFyZSBpbiB0aGUgcXVldWUuIFRha2VzIGBPKG4pYCB0aW1lLlxuICovXG5Qcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLl9hcnIubWFwKGZ1bmN0aW9uKHgpIHsgcmV0dXJuIHgua2V5OyB9KTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBgdHJ1ZWAgaWYgKiprZXkqKiBpcyBpbiB0aGUgcXVldWUgYW5kIGBmYWxzZWAgaWYgbm90LlxuICovXG5Qcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbihrZXkpIHtcbiAgcmV0dXJuIF8uaGFzKHRoaXMuX2tleUluZGljZXMsIGtleSk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHByaW9yaXR5IGZvciAqKmtleSoqLiBJZiAqKmtleSoqIGlzIG5vdCBwcmVzZW50IGluIHRoZSBxdWV1ZVxuICogdGhlbiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYHVuZGVmaW5lZGAuIFRha2VzIGBPKDEpYCB0aW1lLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBrZXlcbiAqL1xuUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUucHJpb3JpdHkgPSBmdW5jdGlvbihrZXkpIHtcbiAgdmFyIGluZGV4ID0gdGhpcy5fa2V5SW5kaWNlc1trZXldO1xuICBpZiAoaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB0aGlzLl9hcnJbaW5kZXhdLnByaW9yaXR5O1xuICB9XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGtleSBmb3IgdGhlIG1pbmltdW0gZWxlbWVudCBpbiB0aGlzIHF1ZXVlLiBJZiB0aGUgcXVldWUgaXNcbiAqIGVtcHR5IHRoaXMgZnVuY3Rpb24gdGhyb3dzIGFuIEVycm9yLiBUYWtlcyBgTygxKWAgdGltZS5cbiAqL1xuUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUubWluID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLnNpemUoKSA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlF1ZXVlIHVuZGVyZmxvd1wiKTtcbiAgfVxuICByZXR1cm4gdGhpcy5fYXJyWzBdLmtleTtcbn07XG5cbi8qKlxuICogSW5zZXJ0cyBhIG5ldyBrZXkgaW50byB0aGUgcHJpb3JpdHkgcXVldWUuIElmIHRoZSBrZXkgYWxyZWFkeSBleGlzdHMgaW5cbiAqIHRoZSBxdWV1ZSB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYGZhbHNlYDsgb3RoZXJ3aXNlIGl0IHdpbGwgcmV0dXJuIGB0cnVlYC5cbiAqIFRha2VzIGBPKG4pYCB0aW1lLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBrZXkgdGhlIGtleSB0byBhZGRcbiAqIEBwYXJhbSB7TnVtYmVyfSBwcmlvcml0eSB0aGUgaW5pdGlhbCBwcmlvcml0eSBmb3IgdGhlIGtleVxuICovXG5Qcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbihrZXksIHByaW9yaXR5KSB7XG4gIHZhciBrZXlJbmRpY2VzID0gdGhpcy5fa2V5SW5kaWNlcztcbiAga2V5ID0gU3RyaW5nKGtleSk7XG4gIGlmICghXy5oYXMoa2V5SW5kaWNlcywga2V5KSkge1xuICAgIHZhciBhcnIgPSB0aGlzLl9hcnI7XG4gICAgdmFyIGluZGV4ID0gYXJyLmxlbmd0aDtcbiAgICBrZXlJbmRpY2VzW2tleV0gPSBpbmRleDtcbiAgICBhcnIucHVzaCh7a2V5OiBrZXksIHByaW9yaXR5OiBwcmlvcml0eX0pO1xuICAgIHRoaXMuX2RlY3JlYXNlKGluZGV4KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAqIFJlbW92ZXMgYW5kIHJldHVybnMgdGhlIHNtYWxsZXN0IGtleSBpbiB0aGUgcXVldWUuIFRha2VzIGBPKGxvZyBuKWAgdGltZS5cbiAqL1xuUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUucmVtb3ZlTWluID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuX3N3YXAoMCwgdGhpcy5fYXJyLmxlbmd0aCAtIDEpO1xuICB2YXIgbWluID0gdGhpcy5fYXJyLnBvcCgpO1xuICBkZWxldGUgdGhpcy5fa2V5SW5kaWNlc1ttaW4ua2V5XTtcbiAgdGhpcy5faGVhcGlmeSgwKTtcbiAgcmV0dXJuIG1pbi5rZXk7XG59O1xuXG4vKipcbiAqIERlY3JlYXNlcyB0aGUgcHJpb3JpdHkgZm9yICoqa2V5KiogdG8gKipwcmlvcml0eSoqLiBJZiB0aGUgbmV3IHByaW9yaXR5IGlzXG4gKiBncmVhdGVyIHRoYW4gdGhlIHByZXZpb3VzIHByaW9yaXR5LCB0aGlzIGZ1bmN0aW9uIHdpbGwgdGhyb3cgYW4gRXJyb3IuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGtleSB0aGUga2V5IGZvciB3aGljaCB0byByYWlzZSBwcmlvcml0eVxuICogQHBhcmFtIHtOdW1iZXJ9IHByaW9yaXR5IHRoZSBuZXcgcHJpb3JpdHkgZm9yIHRoZSBrZXlcbiAqL1xuUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUuZGVjcmVhc2UgPSBmdW5jdGlvbihrZXksIHByaW9yaXR5KSB7XG4gIHZhciBpbmRleCA9IHRoaXMuX2tleUluZGljZXNba2V5XTtcbiAgaWYgKHByaW9yaXR5ID4gdGhpcy5fYXJyW2luZGV4XS5wcmlvcml0eSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5ldyBwcmlvcml0eSBpcyBncmVhdGVyIHRoYW4gY3VycmVudCBwcmlvcml0eS4gXCIgK1xuICAgICAgICBcIktleTogXCIgKyBrZXkgKyBcIiBPbGQ6IFwiICsgdGhpcy5fYXJyW2luZGV4XS5wcmlvcml0eSArIFwiIE5ldzogXCIgKyBwcmlvcml0eSk7XG4gIH1cbiAgdGhpcy5fYXJyW2luZGV4XS5wcmlvcml0eSA9IHByaW9yaXR5O1xuICB0aGlzLl9kZWNyZWFzZShpbmRleCk7XG59O1xuXG5Qcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5faGVhcGlmeSA9IGZ1bmN0aW9uKGkpIHtcbiAgdmFyIGFyciA9IHRoaXMuX2FycjtcbiAgdmFyIGwgPSAyICogaTtcbiAgdmFyIHIgPSBsICsgMTtcbiAgdmFyIGxhcmdlc3QgPSBpO1xuICBpZiAobCA8IGFyci5sZW5ndGgpIHtcbiAgICBsYXJnZXN0ID0gYXJyW2xdLnByaW9yaXR5IDwgYXJyW2xhcmdlc3RdLnByaW9yaXR5ID8gbCA6IGxhcmdlc3Q7XG4gICAgaWYgKHIgPCBhcnIubGVuZ3RoKSB7XG4gICAgICBsYXJnZXN0ID0gYXJyW3JdLnByaW9yaXR5IDwgYXJyW2xhcmdlc3RdLnByaW9yaXR5ID8gciA6IGxhcmdlc3Q7XG4gICAgfVxuICAgIGlmIChsYXJnZXN0ICE9PSBpKSB7XG4gICAgICB0aGlzLl9zd2FwKGksIGxhcmdlc3QpO1xuICAgICAgdGhpcy5faGVhcGlmeShsYXJnZXN0KTtcbiAgICB9XG4gIH1cbn07XG5cblByaW9yaXR5UXVldWUucHJvdG90eXBlLl9kZWNyZWFzZSA9IGZ1bmN0aW9uKGluZGV4KSB7XG4gIHZhciBhcnIgPSB0aGlzLl9hcnI7XG4gIHZhciBwcmlvcml0eSA9IGFycltpbmRleF0ucHJpb3JpdHk7XG4gIHZhciBwYXJlbnQ7XG4gIHdoaWxlIChpbmRleCAhPT0gMCkge1xuICAgIHBhcmVudCA9IGluZGV4ID4+IDE7XG4gICAgaWYgKGFycltwYXJlbnRdLnByaW9yaXR5IDwgcHJpb3JpdHkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB0aGlzLl9zd2FwKGluZGV4LCBwYXJlbnQpO1xuICAgIGluZGV4ID0gcGFyZW50O1xuICB9XG59O1xuXG5Qcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5fc3dhcCA9IGZ1bmN0aW9uKGksIGopIHtcbiAgdmFyIGFyciA9IHRoaXMuX2FycjtcbiAgdmFyIGtleUluZGljZXMgPSB0aGlzLl9rZXlJbmRpY2VzO1xuICB2YXIgb3JpZ0FyckkgPSBhcnJbaV07XG4gIHZhciBvcmlnQXJySiA9IGFycltqXTtcbiAgYXJyW2ldID0gb3JpZ0Fycko7XG4gIGFycltqXSA9IG9yaWdBcnJJO1xuICBrZXlJbmRpY2VzW29yaWdBcnJKLmtleV0gPSBpO1xuICBrZXlJbmRpY2VzW29yaWdBcnJJLmtleV0gPSBqO1xufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuL2xvZGFzaFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBHcmFwaDtcblxudmFyIERFRkFVTFRfRURHRV9OQU1FID0gXCJcXHgwMFwiO1xudmFyIEdSQVBIX05PREUgPSBcIlxceDAwXCI7XG52YXIgRURHRV9LRVlfREVMSU0gPSBcIlxceDAxXCI7XG5cbi8vIEltcGxlbWVudGF0aW9uIG5vdGVzOlxuLy9cbi8vICAqIE5vZGUgaWQgcXVlcnkgZnVuY3Rpb25zIHNob3VsZCByZXR1cm4gc3RyaW5nIGlkcyBmb3IgdGhlIG5vZGVzXG4vLyAgKiBFZGdlIGlkIHF1ZXJ5IGZ1bmN0aW9ucyBzaG91bGQgcmV0dXJuIGFuIFwiZWRnZU9ialwiLCBlZGdlIG9iamVjdCwgdGhhdCBpc1xuLy8gICAgY29tcG9zZWQgb2YgZW5vdWdoIGluZm9ybWF0aW9uIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGFuIGVkZ2U6IHt2LCB3LCBuYW1lfS5cbi8vICAqIEludGVybmFsbHkgd2UgdXNlIGFuIFwiZWRnZUlkXCIsIGEgc3RyaW5naWZpZWQgZm9ybSBvZiB0aGUgZWRnZU9iaiwgdG9cbi8vICAgIHJlZmVyZW5jZSBlZGdlcy4gVGhpcyBpcyBiZWNhdXNlIHdlIG5lZWQgYSBwZXJmb3JtYW50IHdheSB0byBsb29rIHRoZXNlXG4vLyAgICBlZGdlcyB1cCBhbmQsIG9iamVjdCBwcm9wZXJ0aWVzLCB3aGljaCBoYXZlIHN0cmluZyBrZXlzLCBhcmUgdGhlIGNsb3Nlc3Rcbi8vICAgIHdlJ3JlIGdvaW5nIHRvIGdldCB0byBhIHBlcmZvcm1hbnQgaGFzaHRhYmxlIGluIEphdmFTY3JpcHQuXG5cbmZ1bmN0aW9uIEdyYXBoKG9wdHMpIHtcbiAgdGhpcy5faXNEaXJlY3RlZCA9IF8uaGFzKG9wdHMsIFwiZGlyZWN0ZWRcIikgPyBvcHRzLmRpcmVjdGVkIDogdHJ1ZTtcbiAgdGhpcy5faXNNdWx0aWdyYXBoID0gXy5oYXMob3B0cywgXCJtdWx0aWdyYXBoXCIpID8gb3B0cy5tdWx0aWdyYXBoIDogZmFsc2U7XG4gIHRoaXMuX2lzQ29tcG91bmQgPSBfLmhhcyhvcHRzLCBcImNvbXBvdW5kXCIpID8gb3B0cy5jb21wb3VuZCA6IGZhbHNlO1xuXG4gIC8vIExhYmVsIGZvciB0aGUgZ3JhcGggaXRzZWxmXG4gIHRoaXMuX2xhYmVsID0gdW5kZWZpbmVkO1xuXG4gIC8vIERlZmF1bHRzIHRvIGJlIHNldCB3aGVuIGNyZWF0aW5nIGEgbmV3IG5vZGVcbiAgdGhpcy5fZGVmYXVsdE5vZGVMYWJlbEZuID0gXy5jb25zdGFudCh1bmRlZmluZWQpO1xuXG4gIC8vIERlZmF1bHRzIHRvIGJlIHNldCB3aGVuIGNyZWF0aW5nIGEgbmV3IGVkZ2VcbiAgdGhpcy5fZGVmYXVsdEVkZ2VMYWJlbEZuID0gXy5jb25zdGFudCh1bmRlZmluZWQpO1xuXG4gIC8vIHYgLT4gbGFiZWxcbiAgdGhpcy5fbm9kZXMgPSB7fTtcblxuICBpZiAodGhpcy5faXNDb21wb3VuZCkge1xuICAgIC8vIHYgLT4gcGFyZW50XG4gICAgdGhpcy5fcGFyZW50ID0ge307XG5cbiAgICAvLyB2IC0+IGNoaWxkcmVuXG4gICAgdGhpcy5fY2hpbGRyZW4gPSB7fTtcbiAgICB0aGlzLl9jaGlsZHJlbltHUkFQSF9OT0RFXSA9IHt9O1xuICB9XG5cbiAgLy8gdiAtPiBlZGdlT2JqXG4gIHRoaXMuX2luID0ge307XG5cbiAgLy8gdSAtPiB2IC0+IE51bWJlclxuICB0aGlzLl9wcmVkcyA9IHt9O1xuXG4gIC8vIHYgLT4gZWRnZU9ialxuICB0aGlzLl9vdXQgPSB7fTtcblxuICAvLyB2IC0+IHcgLT4gTnVtYmVyXG4gIHRoaXMuX3N1Y3MgPSB7fTtcblxuICAvLyBlIC0+IGVkZ2VPYmpcbiAgdGhpcy5fZWRnZU9ianMgPSB7fTtcblxuICAvLyBlIC0+IGxhYmVsXG4gIHRoaXMuX2VkZ2VMYWJlbHMgPSB7fTtcbn1cblxuLyogTnVtYmVyIG9mIG5vZGVzIGluIHRoZSBncmFwaC4gU2hvdWxkIG9ubHkgYmUgY2hhbmdlZCBieSB0aGUgaW1wbGVtZW50YXRpb24uICovXG5HcmFwaC5wcm90b3R5cGUuX25vZGVDb3VudCA9IDA7XG5cbi8qIE51bWJlciBvZiBlZGdlcyBpbiB0aGUgZ3JhcGguIFNob3VsZCBvbmx5IGJlIGNoYW5nZWQgYnkgdGhlIGltcGxlbWVudGF0aW9uLiAqL1xuR3JhcGgucHJvdG90eXBlLl9lZGdlQ291bnQgPSAwO1xuXG5cbi8qID09PSBHcmFwaCBmdW5jdGlvbnMgPT09PT09PT09ICovXG5cbkdyYXBoLnByb3RvdHlwZS5pc0RpcmVjdGVkID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLl9pc0RpcmVjdGVkO1xufTtcblxuR3JhcGgucHJvdG90eXBlLmlzTXVsdGlncmFwaCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5faXNNdWx0aWdyYXBoO1xufTtcblxuR3JhcGgucHJvdG90eXBlLmlzQ29tcG91bmQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuX2lzQ29tcG91bmQ7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuc2V0R3JhcGggPSBmdW5jdGlvbihsYWJlbCkge1xuICB0aGlzLl9sYWJlbCA9IGxhYmVsO1xuICByZXR1cm4gdGhpcztcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5ncmFwaCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5fbGFiZWw7XG59O1xuXG5cbi8qID09PSBOb2RlIGZ1bmN0aW9ucyA9PT09PT09PT09ICovXG5cbkdyYXBoLnByb3RvdHlwZS5zZXREZWZhdWx0Tm9kZUxhYmVsID0gZnVuY3Rpb24obmV3RGVmYXVsdCkge1xuICBpZiAoIV8uaXNGdW5jdGlvbihuZXdEZWZhdWx0KSkge1xuICAgIG5ld0RlZmF1bHQgPSBfLmNvbnN0YW50KG5ld0RlZmF1bHQpO1xuICB9XG4gIHRoaXMuX2RlZmF1bHROb2RlTGFiZWxGbiA9IG5ld0RlZmF1bHQ7XG4gIHJldHVybiB0aGlzO1xufTtcblxuR3JhcGgucHJvdG90eXBlLm5vZGVDb3VudCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5fbm9kZUNvdW50O1xufTtcblxuR3JhcGgucHJvdG90eXBlLm5vZGVzID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBfLmtleXModGhpcy5fbm9kZXMpO1xufTtcblxuR3JhcGgucHJvdG90eXBlLnNvdXJjZXMgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICByZXR1cm4gXy5maWx0ZXIodGhpcy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgcmV0dXJuIF8uaXNFbXB0eShzZWxmLl9pblt2XSk7XG4gIH0pO1xufTtcblxuR3JhcGgucHJvdG90eXBlLnNpbmtzID0gZnVuY3Rpb24oKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgcmV0dXJuIF8uZmlsdGVyKHRoaXMubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHJldHVybiBfLmlzRW1wdHkoc2VsZi5fb3V0W3ZdKTtcbiAgfSk7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuc2V0Tm9kZXMgPSBmdW5jdGlvbih2cywgdmFsdWUpIHtcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgXy5lYWNoKHZzLCBmdW5jdGlvbih2KSB7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID4gMSkge1xuICAgICAgc2VsZi5zZXROb2RlKHYsIHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZi5zZXROb2RlKHYpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuR3JhcGgucHJvdG90eXBlLnNldE5vZGUgPSBmdW5jdGlvbih2LCB2YWx1ZSkge1xuICBpZiAoXy5oYXModGhpcy5fbm9kZXMsIHYpKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICB0aGlzLl9ub2Rlc1t2XSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHRoaXMuX25vZGVzW3ZdID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyB2YWx1ZSA6IHRoaXMuX2RlZmF1bHROb2RlTGFiZWxGbih2KTtcbiAgaWYgKHRoaXMuX2lzQ29tcG91bmQpIHtcbiAgICB0aGlzLl9wYXJlbnRbdl0gPSBHUkFQSF9OT0RFO1xuICAgIHRoaXMuX2NoaWxkcmVuW3ZdID0ge307XG4gICAgdGhpcy5fY2hpbGRyZW5bR1JBUEhfTk9ERV1bdl0gPSB0cnVlO1xuICB9XG4gIHRoaXMuX2luW3ZdID0ge307XG4gIHRoaXMuX3ByZWRzW3ZdID0ge307XG4gIHRoaXMuX291dFt2XSA9IHt9O1xuICB0aGlzLl9zdWNzW3ZdID0ge307XG4gICsrdGhpcy5fbm9kZUNvdW50O1xuICByZXR1cm4gdGhpcztcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5ub2RlID0gZnVuY3Rpb24odikge1xuICByZXR1cm4gdGhpcy5fbm9kZXNbdl07XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuaGFzTm9kZSA9IGZ1bmN0aW9uKHYpIHtcbiAgcmV0dXJuIF8uaGFzKHRoaXMuX25vZGVzLCB2KTtcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5yZW1vdmVOb2RlID0gIGZ1bmN0aW9uKHYpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBpZiAoXy5oYXModGhpcy5fbm9kZXMsIHYpKSB7XG4gICAgdmFyIHJlbW92ZUVkZ2UgPSBmdW5jdGlvbihlKSB7IHNlbGYucmVtb3ZlRWRnZShzZWxmLl9lZGdlT2Jqc1tlXSk7IH07XG4gICAgZGVsZXRlIHRoaXMuX25vZGVzW3ZdO1xuICAgIGlmICh0aGlzLl9pc0NvbXBvdW5kKSB7XG4gICAgICB0aGlzLl9yZW1vdmVGcm9tUGFyZW50c0NoaWxkTGlzdCh2KTtcbiAgICAgIGRlbGV0ZSB0aGlzLl9wYXJlbnRbdl07XG4gICAgICBfLmVhY2godGhpcy5jaGlsZHJlbih2KSwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgICAgc2VsZi5zZXRQYXJlbnQoY2hpbGQpO1xuICAgICAgfSk7XG4gICAgICBkZWxldGUgdGhpcy5fY2hpbGRyZW5bdl07XG4gICAgfVxuICAgIF8uZWFjaChfLmtleXModGhpcy5faW5bdl0pLCByZW1vdmVFZGdlKTtcbiAgICBkZWxldGUgdGhpcy5faW5bdl07XG4gICAgZGVsZXRlIHRoaXMuX3ByZWRzW3ZdO1xuICAgIF8uZWFjaChfLmtleXModGhpcy5fb3V0W3ZdKSwgcmVtb3ZlRWRnZSk7XG4gICAgZGVsZXRlIHRoaXMuX291dFt2XTtcbiAgICBkZWxldGUgdGhpcy5fc3Vjc1t2XTtcbiAgICAtLXRoaXMuX25vZGVDb3VudDtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5zZXRQYXJlbnQgPSBmdW5jdGlvbih2LCBwYXJlbnQpIHtcbiAgaWYgKCF0aGlzLl9pc0NvbXBvdW5kKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHNldCBwYXJlbnQgaW4gYSBub24tY29tcG91bmQgZ3JhcGhcIik7XG4gIH1cblxuICBpZiAoXy5pc1VuZGVmaW5lZChwYXJlbnQpKSB7XG4gICAgcGFyZW50ID0gR1JBUEhfTk9ERTtcbiAgfSBlbHNlIHtcbiAgICAvLyBDb2VyY2UgcGFyZW50IHRvIHN0cmluZ1xuICAgIHBhcmVudCArPSBcIlwiO1xuICAgIGZvciAodmFyIGFuY2VzdG9yID0gcGFyZW50O1xuICAgICAgIV8uaXNVbmRlZmluZWQoYW5jZXN0b3IpO1xuICAgICAgYW5jZXN0b3IgPSB0aGlzLnBhcmVudChhbmNlc3RvcikpIHtcbiAgICAgIGlmIChhbmNlc3RvciA9PT0gdikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTZXR0aW5nIFwiICsgcGFyZW50KyBcIiBhcyBwYXJlbnQgb2YgXCIgKyB2ICtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiIHdvdWxkIGNyZWF0ZSBhIGN5Y2xlXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc2V0Tm9kZShwYXJlbnQpO1xuICB9XG5cbiAgdGhpcy5zZXROb2RlKHYpO1xuICB0aGlzLl9yZW1vdmVGcm9tUGFyZW50c0NoaWxkTGlzdCh2KTtcbiAgdGhpcy5fcGFyZW50W3ZdID0gcGFyZW50O1xuICB0aGlzLl9jaGlsZHJlbltwYXJlbnRdW3ZdID0gdHJ1ZTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuX3JlbW92ZUZyb21QYXJlbnRzQ2hpbGRMaXN0ID0gZnVuY3Rpb24odikge1xuICBkZWxldGUgdGhpcy5fY2hpbGRyZW5bdGhpcy5fcGFyZW50W3ZdXVt2XTtcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5wYXJlbnQgPSBmdW5jdGlvbih2KSB7XG4gIGlmICh0aGlzLl9pc0NvbXBvdW5kKSB7XG4gICAgdmFyIHBhcmVudCA9IHRoaXMuX3BhcmVudFt2XTtcbiAgICBpZiAocGFyZW50ICE9PSBHUkFQSF9OT0RFKSB7XG4gICAgICByZXR1cm4gcGFyZW50O1xuICAgIH1cbiAgfVxufTtcblxuR3JhcGgucHJvdG90eXBlLmNoaWxkcmVuID0gZnVuY3Rpb24odikge1xuICBpZiAoXy5pc1VuZGVmaW5lZCh2KSkge1xuICAgIHYgPSBHUkFQSF9OT0RFO1xuICB9XG5cbiAgaWYgKHRoaXMuX2lzQ29tcG91bmQpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLl9jaGlsZHJlblt2XTtcbiAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgIHJldHVybiBfLmtleXMoY2hpbGRyZW4pO1xuICAgIH1cbiAgfSBlbHNlIGlmICh2ID09PSBHUkFQSF9OT0RFKSB7XG4gICAgcmV0dXJuIHRoaXMubm9kZXMoKTtcbiAgfSBlbHNlIGlmICh0aGlzLmhhc05vZGUodikpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbn07XG5cbkdyYXBoLnByb3RvdHlwZS5wcmVkZWNlc3NvcnMgPSBmdW5jdGlvbih2KSB7XG4gIHZhciBwcmVkc1YgPSB0aGlzLl9wcmVkc1t2XTtcbiAgaWYgKHByZWRzVikge1xuICAgIHJldHVybiBfLmtleXMocHJlZHNWKTtcbiAgfVxufTtcblxuR3JhcGgucHJvdG90eXBlLnN1Y2Nlc3NvcnMgPSBmdW5jdGlvbih2KSB7XG4gIHZhciBzdWNzViA9IHRoaXMuX3N1Y3Nbdl07XG4gIGlmIChzdWNzVikge1xuICAgIHJldHVybiBfLmtleXMoc3Vjc1YpO1xuICB9XG59O1xuXG5HcmFwaC5wcm90b3R5cGUubmVpZ2hib3JzID0gZnVuY3Rpb24odikge1xuICB2YXIgcHJlZHMgPSB0aGlzLnByZWRlY2Vzc29ycyh2KTtcbiAgaWYgKHByZWRzKSB7XG4gICAgcmV0dXJuIF8udW5pb24ocHJlZHMsIHRoaXMuc3VjY2Vzc29ycyh2KSk7XG4gIH1cbn07XG5cbkdyYXBoLnByb3RvdHlwZS5pc0xlYWYgPSBmdW5jdGlvbiAodikge1xuICB2YXIgbmVpZ2hib3JzO1xuICBpZiAodGhpcy5pc0RpcmVjdGVkKCkpIHtcbiAgICBuZWlnaGJvcnMgPSB0aGlzLnN1Y2Nlc3NvcnModik7XG4gIH0gZWxzZSB7XG4gICAgbmVpZ2hib3JzID0gdGhpcy5uZWlnaGJvcnModik7XG4gIH1cbiAgcmV0dXJuIG5laWdoYm9ycy5sZW5ndGggPT09IDA7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuZmlsdGVyTm9kZXMgPSBmdW5jdGlvbihmaWx0ZXIpIHtcbiAgdmFyIGNvcHkgPSBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih7XG4gICAgZGlyZWN0ZWQ6IHRoaXMuX2lzRGlyZWN0ZWQsXG4gICAgbXVsdGlncmFwaDogdGhpcy5faXNNdWx0aWdyYXBoLFxuICAgIGNvbXBvdW5kOiB0aGlzLl9pc0NvbXBvdW5kXG4gIH0pO1xuXG4gIGNvcHkuc2V0R3JhcGgodGhpcy5ncmFwaCgpKTtcblxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIF8uZWFjaCh0aGlzLl9ub2RlcywgZnVuY3Rpb24odmFsdWUsIHYpIHtcbiAgICBpZiAoZmlsdGVyKHYpKSB7XG4gICAgICBjb3B5LnNldE5vZGUodiwgdmFsdWUpO1xuICAgIH1cbiAgfSk7XG5cbiAgXy5lYWNoKHRoaXMuX2VkZ2VPYmpzLCBmdW5jdGlvbihlKSB7XG4gICAgaWYgKGNvcHkuaGFzTm9kZShlLnYpICYmIGNvcHkuaGFzTm9kZShlLncpKSB7XG4gICAgICBjb3B5LnNldEVkZ2UoZSwgc2VsZi5lZGdlKGUpKTtcbiAgICB9XG4gIH0pO1xuXG4gIHZhciBwYXJlbnRzID0ge307XG4gIGZ1bmN0aW9uIGZpbmRQYXJlbnQodikge1xuICAgIHZhciBwYXJlbnQgPSBzZWxmLnBhcmVudCh2KTtcbiAgICBpZiAocGFyZW50ID09PSB1bmRlZmluZWQgfHwgY29weS5oYXNOb2RlKHBhcmVudCkpIHtcbiAgICAgIHBhcmVudHNbdl0gPSBwYXJlbnQ7XG4gICAgICByZXR1cm4gcGFyZW50O1xuICAgIH0gZWxzZSBpZiAocGFyZW50IGluIHBhcmVudHMpIHtcbiAgICAgIHJldHVybiBwYXJlbnRzW3BhcmVudF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmaW5kUGFyZW50KHBhcmVudCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHRoaXMuX2lzQ29tcG91bmQpIHtcbiAgICBfLmVhY2goY29weS5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgICBjb3B5LnNldFBhcmVudCh2LCBmaW5kUGFyZW50KHYpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBjb3B5O1xufTtcblxuLyogPT09IEVkZ2UgZnVuY3Rpb25zID09PT09PT09PT0gKi9cblxuR3JhcGgucHJvdG90eXBlLnNldERlZmF1bHRFZGdlTGFiZWwgPSBmdW5jdGlvbihuZXdEZWZhdWx0KSB7XG4gIGlmICghXy5pc0Z1bmN0aW9uKG5ld0RlZmF1bHQpKSB7XG4gICAgbmV3RGVmYXVsdCA9IF8uY29uc3RhbnQobmV3RGVmYXVsdCk7XG4gIH1cbiAgdGhpcy5fZGVmYXVsdEVkZ2VMYWJlbEZuID0gbmV3RGVmYXVsdDtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuZWRnZUNvdW50ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLl9lZGdlQ291bnQ7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuZWRnZXMgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIF8udmFsdWVzKHRoaXMuX2VkZ2VPYmpzKTtcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5zZXRQYXRoID0gZnVuY3Rpb24odnMsIHZhbHVlKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gIF8ucmVkdWNlKHZzLCBmdW5jdGlvbih2LCB3KSB7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID4gMSkge1xuICAgICAgc2VsZi5zZXRFZGdlKHYsIHcsIHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZi5zZXRFZGdlKHYsIHcpO1xuICAgIH1cbiAgICByZXR1cm4gdztcbiAgfSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLypcbiAqIHNldEVkZ2UodiwgdywgW3ZhbHVlLCBbbmFtZV1dKVxuICogc2V0RWRnZSh7IHYsIHcsIFtuYW1lXSB9LCBbdmFsdWVdKVxuICovXG5HcmFwaC5wcm90b3R5cGUuc2V0RWRnZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgdiwgdywgbmFtZSwgdmFsdWU7XG4gIHZhciB2YWx1ZVNwZWNpZmllZCA9IGZhbHNlO1xuICB2YXIgYXJnMCA9IGFyZ3VtZW50c1swXTtcblxuICBpZiAodHlwZW9mIGFyZzAgPT09IFwib2JqZWN0XCIgJiYgYXJnMCAhPT0gbnVsbCAmJiBcInZcIiBpbiBhcmcwKSB7XG4gICAgdiA9IGFyZzAudjtcbiAgICB3ID0gYXJnMC53O1xuICAgIG5hbWUgPSBhcmcwLm5hbWU7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgIHZhbHVlID0gYXJndW1lbnRzWzFdO1xuICAgICAgdmFsdWVTcGVjaWZpZWQgPSB0cnVlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2ID0gYXJnMDtcbiAgICB3ID0gYXJndW1lbnRzWzFdO1xuICAgIG5hbWUgPSBhcmd1bWVudHNbM107XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7XG4gICAgICB2YWx1ZSA9IGFyZ3VtZW50c1syXTtcbiAgICAgIHZhbHVlU3BlY2lmaWVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICB2ID0gXCJcIiArIHY7XG4gIHcgPSBcIlwiICsgdztcbiAgaWYgKCFfLmlzVW5kZWZpbmVkKG5hbWUpKSB7XG4gICAgbmFtZSA9IFwiXCIgKyBuYW1lO1xuICB9XG5cbiAgdmFyIGUgPSBlZGdlQXJnc1RvSWQodGhpcy5faXNEaXJlY3RlZCwgdiwgdywgbmFtZSk7XG4gIGlmIChfLmhhcyh0aGlzLl9lZGdlTGFiZWxzLCBlKSkge1xuICAgIGlmICh2YWx1ZVNwZWNpZmllZCkge1xuICAgICAgdGhpcy5fZWRnZUxhYmVsc1tlXSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGlmICghXy5pc1VuZGVmaW5lZChuYW1lKSAmJiAhdGhpcy5faXNNdWx0aWdyYXBoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHNldCBhIG5hbWVkIGVkZ2Ugd2hlbiBpc011bHRpZ3JhcGggPSBmYWxzZVwiKTtcbiAgfVxuXG4gIC8vIEl0IGRpZG4ndCBleGlzdCwgc28gd2UgbmVlZCB0byBjcmVhdGUgaXQuXG4gIC8vIEZpcnN0IGVuc3VyZSB0aGUgbm9kZXMgZXhpc3QuXG4gIHRoaXMuc2V0Tm9kZSh2KTtcbiAgdGhpcy5zZXROb2RlKHcpO1xuXG4gIHRoaXMuX2VkZ2VMYWJlbHNbZV0gPSB2YWx1ZVNwZWNpZmllZCA/IHZhbHVlIDogdGhpcy5fZGVmYXVsdEVkZ2VMYWJlbEZuKHYsIHcsIG5hbWUpO1xuXG4gIHZhciBlZGdlT2JqID0gZWRnZUFyZ3NUb09iaih0aGlzLl9pc0RpcmVjdGVkLCB2LCB3LCBuYW1lKTtcbiAgLy8gRW5zdXJlIHdlIGFkZCB1bmRpcmVjdGVkIGVkZ2VzIGluIGEgY29uc2lzdGVudCB3YXkuXG4gIHYgPSBlZGdlT2JqLnY7XG4gIHcgPSBlZGdlT2JqLnc7XG5cbiAgT2JqZWN0LmZyZWV6ZShlZGdlT2JqKTtcbiAgdGhpcy5fZWRnZU9ianNbZV0gPSBlZGdlT2JqO1xuICBpbmNyZW1lbnRPckluaXRFbnRyeSh0aGlzLl9wcmVkc1t3XSwgdik7XG4gIGluY3JlbWVudE9ySW5pdEVudHJ5KHRoaXMuX3N1Y3Nbdl0sIHcpO1xuICB0aGlzLl9pblt3XVtlXSA9IGVkZ2VPYmo7XG4gIHRoaXMuX291dFt2XVtlXSA9IGVkZ2VPYmo7XG4gIHRoaXMuX2VkZ2VDb3VudCsrO1xuICByZXR1cm4gdGhpcztcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5lZGdlID0gZnVuY3Rpb24odiwgdywgbmFtZSkge1xuICB2YXIgZSA9IChhcmd1bWVudHMubGVuZ3RoID09PSAxXG4gICAgPyBlZGdlT2JqVG9JZCh0aGlzLl9pc0RpcmVjdGVkLCBhcmd1bWVudHNbMF0pXG4gICAgOiBlZGdlQXJnc1RvSWQodGhpcy5faXNEaXJlY3RlZCwgdiwgdywgbmFtZSkpO1xuICByZXR1cm4gdGhpcy5fZWRnZUxhYmVsc1tlXTtcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5oYXNFZGdlID0gZnVuY3Rpb24odiwgdywgbmFtZSkge1xuICB2YXIgZSA9IChhcmd1bWVudHMubGVuZ3RoID09PSAxXG4gICAgPyBlZGdlT2JqVG9JZCh0aGlzLl9pc0RpcmVjdGVkLCBhcmd1bWVudHNbMF0pXG4gICAgOiBlZGdlQXJnc1RvSWQodGhpcy5faXNEaXJlY3RlZCwgdiwgdywgbmFtZSkpO1xuICByZXR1cm4gXy5oYXModGhpcy5fZWRnZUxhYmVscywgZSk7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUucmVtb3ZlRWRnZSA9IGZ1bmN0aW9uKHYsIHcsIG5hbWUpIHtcbiAgdmFyIGUgPSAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMVxuICAgID8gZWRnZU9ialRvSWQodGhpcy5faXNEaXJlY3RlZCwgYXJndW1lbnRzWzBdKVxuICAgIDogZWRnZUFyZ3NUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsIHYsIHcsIG5hbWUpKTtcbiAgdmFyIGVkZ2UgPSB0aGlzLl9lZGdlT2Jqc1tlXTtcbiAgaWYgKGVkZ2UpIHtcbiAgICB2ID0gZWRnZS52O1xuICAgIHcgPSBlZGdlLnc7XG4gICAgZGVsZXRlIHRoaXMuX2VkZ2VMYWJlbHNbZV07XG4gICAgZGVsZXRlIHRoaXMuX2VkZ2VPYmpzW2VdO1xuICAgIGRlY3JlbWVudE9yUmVtb3ZlRW50cnkodGhpcy5fcHJlZHNbd10sIHYpO1xuICAgIGRlY3JlbWVudE9yUmVtb3ZlRW50cnkodGhpcy5fc3Vjc1t2XSwgdyk7XG4gICAgZGVsZXRlIHRoaXMuX2luW3ddW2VdO1xuICAgIGRlbGV0ZSB0aGlzLl9vdXRbdl1bZV07XG4gICAgdGhpcy5fZWRnZUNvdW50LS07XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuaW5FZGdlcyA9IGZ1bmN0aW9uKHYsIHUpIHtcbiAgdmFyIGluViA9IHRoaXMuX2luW3ZdO1xuICBpZiAoaW5WKSB7XG4gICAgdmFyIGVkZ2VzID0gXy52YWx1ZXMoaW5WKTtcbiAgICBpZiAoIXUpIHtcbiAgICAgIHJldHVybiBlZGdlcztcbiAgICB9XG4gICAgcmV0dXJuIF8uZmlsdGVyKGVkZ2VzLCBmdW5jdGlvbihlZGdlKSB7IHJldHVybiBlZGdlLnYgPT09IHU7IH0pO1xuICB9XG59O1xuXG5HcmFwaC5wcm90b3R5cGUub3V0RWRnZXMgPSBmdW5jdGlvbih2LCB3KSB7XG4gIHZhciBvdXRWID0gdGhpcy5fb3V0W3ZdO1xuICBpZiAob3V0Vikge1xuICAgIHZhciBlZGdlcyA9IF8udmFsdWVzKG91dFYpO1xuICAgIGlmICghdykge1xuICAgICAgcmV0dXJuIGVkZ2VzO1xuICAgIH1cbiAgICByZXR1cm4gXy5maWx0ZXIoZWRnZXMsIGZ1bmN0aW9uKGVkZ2UpIHsgcmV0dXJuIGVkZ2UudyA9PT0gdzsgfSk7XG4gIH1cbn07XG5cbkdyYXBoLnByb3RvdHlwZS5ub2RlRWRnZXMgPSBmdW5jdGlvbih2LCB3KSB7XG4gIHZhciBpbkVkZ2VzID0gdGhpcy5pbkVkZ2VzKHYsIHcpO1xuICBpZiAoaW5FZGdlcykge1xuICAgIHJldHVybiBpbkVkZ2VzLmNvbmNhdCh0aGlzLm91dEVkZ2VzKHYsIHcpKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gaW5jcmVtZW50T3JJbml0RW50cnkobWFwLCBrKSB7XG4gIGlmIChtYXBba10pIHtcbiAgICBtYXBba10rKztcbiAgfSBlbHNlIHtcbiAgICBtYXBba10gPSAxO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRlY3JlbWVudE9yUmVtb3ZlRW50cnkobWFwLCBrKSB7XG4gIGlmICghLS1tYXBba10pIHsgZGVsZXRlIG1hcFtrXTsgfVxufVxuXG5mdW5jdGlvbiBlZGdlQXJnc1RvSWQoaXNEaXJlY3RlZCwgdl8sIHdfLCBuYW1lKSB7XG4gIHZhciB2ID0gXCJcIiArIHZfO1xuICB2YXIgdyA9IFwiXCIgKyB3XztcbiAgaWYgKCFpc0RpcmVjdGVkICYmIHYgPiB3KSB7XG4gICAgdmFyIHRtcCA9IHY7XG4gICAgdiA9IHc7XG4gICAgdyA9IHRtcDtcbiAgfVxuICByZXR1cm4gdiArIEVER0VfS0VZX0RFTElNICsgdyArIEVER0VfS0VZX0RFTElNICtcbiAgICAgICAgICAgICAoXy5pc1VuZGVmaW5lZChuYW1lKSA/IERFRkFVTFRfRURHRV9OQU1FIDogbmFtZSk7XG59XG5cbmZ1bmN0aW9uIGVkZ2VBcmdzVG9PYmooaXNEaXJlY3RlZCwgdl8sIHdfLCBuYW1lKSB7XG4gIHZhciB2ID0gXCJcIiArIHZfO1xuICB2YXIgdyA9IFwiXCIgKyB3XztcbiAgaWYgKCFpc0RpcmVjdGVkICYmIHYgPiB3KSB7XG4gICAgdmFyIHRtcCA9IHY7XG4gICAgdiA9IHc7XG4gICAgdyA9IHRtcDtcbiAgfVxuICB2YXIgZWRnZU9iaiA9ICB7IHY6IHYsIHc6IHcgfTtcbiAgaWYgKG5hbWUpIHtcbiAgICBlZGdlT2JqLm5hbWUgPSBuYW1lO1xuICB9XG4gIHJldHVybiBlZGdlT2JqO1xufVxuXG5mdW5jdGlvbiBlZGdlT2JqVG9JZChpc0RpcmVjdGVkLCBlZGdlT2JqKSB7XG4gIHJldHVybiBlZGdlQXJnc1RvSWQoaXNEaXJlY3RlZCwgZWRnZU9iai52LCBlZGdlT2JqLncsIGVkZ2VPYmoubmFtZSk7XG59XG4iLCIvLyBJbmNsdWRlcyBvbmx5IHRoZSBcImNvcmVcIiBvZiBncmFwaGxpYlxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEdyYXBoOiByZXF1aXJlKFwiLi9ncmFwaFwiKSxcbiAgdmVyc2lvbjogcmVxdWlyZShcIi4vdmVyc2lvblwiKVxufTtcbiIsInZhciBfID0gcmVxdWlyZShcIi4vbG9kYXNoXCIpO1xudmFyIEdyYXBoID0gcmVxdWlyZShcIi4vZ3JhcGhcIik7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICB3cml0ZTogd3JpdGUsXG4gIHJlYWQ6IHJlYWRcbn07XG5cbmZ1bmN0aW9uIHdyaXRlKGcpIHtcbiAgdmFyIGpzb24gPSB7XG4gICAgb3B0aW9uczoge1xuICAgICAgZGlyZWN0ZWQ6IGcuaXNEaXJlY3RlZCgpLFxuICAgICAgbXVsdGlncmFwaDogZy5pc011bHRpZ3JhcGgoKSxcbiAgICAgIGNvbXBvdW5kOiBnLmlzQ29tcG91bmQoKVxuICAgIH0sXG4gICAgbm9kZXM6IHdyaXRlTm9kZXMoZyksXG4gICAgZWRnZXM6IHdyaXRlRWRnZXMoZylcbiAgfTtcbiAgaWYgKCFfLmlzVW5kZWZpbmVkKGcuZ3JhcGgoKSkpIHtcbiAgICBqc29uLnZhbHVlID0gXy5jbG9uZShnLmdyYXBoKCkpO1xuICB9XG4gIHJldHVybiBqc29uO1xufVxuXG5mdW5jdGlvbiB3cml0ZU5vZGVzKGcpIHtcbiAgcmV0dXJuIF8ubWFwKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHZhciBub2RlVmFsdWUgPSBnLm5vZGUodik7XG4gICAgdmFyIHBhcmVudCA9IGcucGFyZW50KHYpO1xuICAgIHZhciBub2RlID0geyB2OiB2IH07XG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKG5vZGVWYWx1ZSkpIHtcbiAgICAgIG5vZGUudmFsdWUgPSBub2RlVmFsdWU7XG4gICAgfVxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJlbnQpKSB7XG4gICAgICBub2RlLnBhcmVudCA9IHBhcmVudDtcbiAgICB9XG4gICAgcmV0dXJuIG5vZGU7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiB3cml0ZUVkZ2VzKGcpIHtcbiAgcmV0dXJuIF8ubWFwKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBlZGdlVmFsdWUgPSBnLmVkZ2UoZSk7XG4gICAgdmFyIGVkZ2UgPSB7IHY6IGUudiwgdzogZS53IH07XG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGUubmFtZSkpIHtcbiAgICAgIGVkZ2UubmFtZSA9IGUubmFtZTtcbiAgICB9XG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGVkZ2VWYWx1ZSkpIHtcbiAgICAgIGVkZ2UudmFsdWUgPSBlZGdlVmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBlZGdlO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVhZChqc29uKSB7XG4gIHZhciBnID0gbmV3IEdyYXBoKGpzb24ub3B0aW9ucykuc2V0R3JhcGgoanNvbi52YWx1ZSk7XG4gIF8uZWFjaChqc29uLm5vZGVzLCBmdW5jdGlvbihlbnRyeSkge1xuICAgIGcuc2V0Tm9kZShlbnRyeS52LCBlbnRyeS52YWx1ZSk7XG4gICAgaWYgKGVudHJ5LnBhcmVudCkge1xuICAgICAgZy5zZXRQYXJlbnQoZW50cnkudiwgZW50cnkucGFyZW50KTtcbiAgICB9XG4gIH0pO1xuICBfLmVhY2goanNvbi5lZGdlcywgZnVuY3Rpb24oZW50cnkpIHtcbiAgICBnLnNldEVkZ2UoeyB2OiBlbnRyeS52LCB3OiBlbnRyeS53LCBuYW1lOiBlbnRyeS5uYW1lIH0sIGVudHJ5LnZhbHVlKTtcbiAgfSk7XG4gIHJldHVybiBnO1xufVxuIiwiLyogZ2xvYmFsIHdpbmRvdyAqL1xuXG52YXIgbG9kYXNoO1xuXG5pZiAodHlwZW9mIHJlcXVpcmUgPT09IFwiZnVuY3Rpb25cIikge1xuICB0cnkge1xuICAgIGxvZGFzaCA9IHtcbiAgICAgIGNsb25lOiByZXF1aXJlKFwibG9kYXNoL2Nsb25lXCIpLFxuICAgICAgY29uc3RhbnQ6IHJlcXVpcmUoXCJsb2Rhc2gvY29uc3RhbnRcIiksXG4gICAgICBlYWNoOiByZXF1aXJlKFwibG9kYXNoL2VhY2hcIiksXG4gICAgICBmaWx0ZXI6IHJlcXVpcmUoXCJsb2Rhc2gvZmlsdGVyXCIpLFxuICAgICAgaGFzOiAgcmVxdWlyZShcImxvZGFzaC9oYXNcIiksXG4gICAgICBpc0FycmF5OiByZXF1aXJlKFwibG9kYXNoL2lzQXJyYXlcIiksXG4gICAgICBpc0VtcHR5OiByZXF1aXJlKFwibG9kYXNoL2lzRW1wdHlcIiksXG4gICAgICBpc0Z1bmN0aW9uOiByZXF1aXJlKFwibG9kYXNoL2lzRnVuY3Rpb25cIiksXG4gICAgICBpc1VuZGVmaW5lZDogcmVxdWlyZShcImxvZGFzaC9pc1VuZGVmaW5lZFwiKSxcbiAgICAgIGtleXM6IHJlcXVpcmUoXCJsb2Rhc2gva2V5c1wiKSxcbiAgICAgIG1hcDogcmVxdWlyZShcImxvZGFzaC9tYXBcIiksXG4gICAgICByZWR1Y2U6IHJlcXVpcmUoXCJsb2Rhc2gvcmVkdWNlXCIpLFxuICAgICAgc2l6ZTogcmVxdWlyZShcImxvZGFzaC9zaXplXCIpLFxuICAgICAgdHJhbnNmb3JtOiByZXF1aXJlKFwibG9kYXNoL3RyYW5zZm9ybVwiKSxcbiAgICAgIHVuaW9uOiByZXF1aXJlKFwibG9kYXNoL3VuaW9uXCIpLFxuICAgICAgdmFsdWVzOiByZXF1aXJlKFwibG9kYXNoL3ZhbHVlc1wiKVxuICAgIH07XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBjb250aW51ZSByZWdhcmRsZXNzIG9mIGVycm9yXG4gIH1cbn1cblxuaWYgKCFsb2Rhc2gpIHtcbiAgbG9kYXNoID0gd2luZG93Ll87XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbG9kYXNoO1xuIiwibW9kdWxlLmV4cG9ydHMgPSAnMi4xLjgnO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcmVhY3RJcyA9IHJlcXVpcmUoJ3JlYWN0LWlzJyk7XG5cbi8qKlxuICogQ29weXJpZ2h0IDIwMTUsIFlhaG9vISBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbnZhciBSRUFDVF9TVEFUSUNTID0ge1xuICBjaGlsZENvbnRleHRUeXBlczogdHJ1ZSxcbiAgY29udGV4dFR5cGU6IHRydWUsXG4gIGNvbnRleHRUeXBlczogdHJ1ZSxcbiAgZGVmYXVsdFByb3BzOiB0cnVlLFxuICBkaXNwbGF5TmFtZTogdHJ1ZSxcbiAgZ2V0RGVmYXVsdFByb3BzOiB0cnVlLFxuICBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3I6IHRydWUsXG4gIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wczogdHJ1ZSxcbiAgbWl4aW5zOiB0cnVlLFxuICBwcm9wVHlwZXM6IHRydWUsXG4gIHR5cGU6IHRydWVcbn07XG52YXIgS05PV05fU1RBVElDUyA9IHtcbiAgbmFtZTogdHJ1ZSxcbiAgbGVuZ3RoOiB0cnVlLFxuICBwcm90b3R5cGU6IHRydWUsXG4gIGNhbGxlcjogdHJ1ZSxcbiAgY2FsbGVlOiB0cnVlLFxuICBhcmd1bWVudHM6IHRydWUsXG4gIGFyaXR5OiB0cnVlXG59O1xudmFyIEZPUldBUkRfUkVGX1NUQVRJQ1MgPSB7XG4gICckJHR5cGVvZic6IHRydWUsXG4gIHJlbmRlcjogdHJ1ZSxcbiAgZGVmYXVsdFByb3BzOiB0cnVlLFxuICBkaXNwbGF5TmFtZTogdHJ1ZSxcbiAgcHJvcFR5cGVzOiB0cnVlXG59O1xudmFyIE1FTU9fU1RBVElDUyA9IHtcbiAgJyQkdHlwZW9mJzogdHJ1ZSxcbiAgY29tcGFyZTogdHJ1ZSxcbiAgZGVmYXVsdFByb3BzOiB0cnVlLFxuICBkaXNwbGF5TmFtZTogdHJ1ZSxcbiAgcHJvcFR5cGVzOiB0cnVlLFxuICB0eXBlOiB0cnVlXG59O1xudmFyIFRZUEVfU1RBVElDUyA9IHt9O1xuVFlQRV9TVEFUSUNTW3JlYWN0SXMuRm9yd2FyZFJlZl0gPSBGT1JXQVJEX1JFRl9TVEFUSUNTO1xuVFlQRV9TVEFUSUNTW3JlYWN0SXMuTWVtb10gPSBNRU1PX1NUQVRJQ1M7XG5cbmZ1bmN0aW9uIGdldFN0YXRpY3MoY29tcG9uZW50KSB7XG4gIC8vIFJlYWN0IHYxNi4xMSBhbmQgYmVsb3dcbiAgaWYgKHJlYWN0SXMuaXNNZW1vKGNvbXBvbmVudCkpIHtcbiAgICByZXR1cm4gTUVNT19TVEFUSUNTO1xuICB9IC8vIFJlYWN0IHYxNi4xMiBhbmQgYWJvdmVcblxuXG4gIHJldHVybiBUWVBFX1NUQVRJQ1NbY29tcG9uZW50WyckJHR5cGVvZiddXSB8fCBSRUFDVF9TVEFUSUNTO1xufVxuXG52YXIgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgZ2V0T3duUHJvcGVydHlOYW1lcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzO1xudmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbnZhciBnZXRQcm90b3R5cGVPZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcbnZhciBvYmplY3RQcm90b3R5cGUgPSBPYmplY3QucHJvdG90eXBlO1xuZnVuY3Rpb24gaG9pc3ROb25SZWFjdFN0YXRpY3ModGFyZ2V0Q29tcG9uZW50LCBzb3VyY2VDb21wb25lbnQsIGJsYWNrbGlzdCkge1xuICBpZiAodHlwZW9mIHNvdXJjZUNvbXBvbmVudCAhPT0gJ3N0cmluZycpIHtcbiAgICAvLyBkb24ndCBob2lzdCBvdmVyIHN0cmluZyAoaHRtbCkgY29tcG9uZW50c1xuICAgIGlmIChvYmplY3RQcm90b3R5cGUpIHtcbiAgICAgIHZhciBpbmhlcml0ZWRDb21wb25lbnQgPSBnZXRQcm90b3R5cGVPZihzb3VyY2VDb21wb25lbnQpO1xuXG4gICAgICBpZiAoaW5oZXJpdGVkQ29tcG9uZW50ICYmIGluaGVyaXRlZENvbXBvbmVudCAhPT0gb2JqZWN0UHJvdG90eXBlKSB7XG4gICAgICAgIGhvaXN0Tm9uUmVhY3RTdGF0aWNzKHRhcmdldENvbXBvbmVudCwgaW5oZXJpdGVkQ29tcG9uZW50LCBibGFja2xpc3QpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBrZXlzID0gZ2V0T3duUHJvcGVydHlOYW1lcyhzb3VyY2VDb21wb25lbnQpO1xuXG4gICAgaWYgKGdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAga2V5cyA9IGtleXMuY29uY2F0KGdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2VDb21wb25lbnQpKTtcbiAgICB9XG5cbiAgICB2YXIgdGFyZ2V0U3RhdGljcyA9IGdldFN0YXRpY3ModGFyZ2V0Q29tcG9uZW50KTtcbiAgICB2YXIgc291cmNlU3RhdGljcyA9IGdldFN0YXRpY3Moc291cmNlQ29tcG9uZW50KTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIGtleSA9IGtleXNbaV07XG5cbiAgICAgIGlmICghS05PV05fU1RBVElDU1trZXldICYmICEoYmxhY2tsaXN0ICYmIGJsYWNrbGlzdFtrZXldKSAmJiAhKHNvdXJjZVN0YXRpY3MgJiYgc291cmNlU3RhdGljc1trZXldKSAmJiAhKHRhcmdldFN0YXRpY3MgJiYgdGFyZ2V0U3RhdGljc1trZXldKSkge1xuICAgICAgICB2YXIgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2VDb21wb25lbnQsIGtleSk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBBdm9pZCBmYWlsdXJlcyBmcm9tIHJlYWQtb25seSBwcm9wZXJ0aWVzXG4gICAgICAgICAgZGVmaW5lUHJvcGVydHkodGFyZ2V0Q29tcG9uZW50LCBrZXksIGRlc2NyaXB0b3IpO1xuICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXRDb21wb25lbnQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaG9pc3ROb25SZWFjdFN0YXRpY3M7XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBVc2UgaW52YXJpYW50KCkgdG8gYXNzZXJ0IHN0YXRlIHdoaWNoIHlvdXIgcHJvZ3JhbSBhc3N1bWVzIHRvIGJlIHRydWUuXG4gKlxuICogUHJvdmlkZSBzcHJpbnRmLXN0eWxlIGZvcm1hdCAob25seSAlcyBpcyBzdXBwb3J0ZWQpIGFuZCBhcmd1bWVudHNcbiAqIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCBicm9rZSBhbmQgd2hhdCB5b3Ugd2VyZVxuICogZXhwZWN0aW5nLlxuICpcbiAqIFRoZSBpbnZhcmlhbnQgbWVzc2FnZSB3aWxsIGJlIHN0cmlwcGVkIGluIHByb2R1Y3Rpb24sIGJ1dCB0aGUgaW52YXJpYW50XG4gKiB3aWxsIHJlbWFpbiB0byBlbnN1cmUgbG9naWMgZG9lcyBub3QgZGlmZmVyIGluIHByb2R1Y3Rpb24uXG4gKi9cblxudmFyIGludmFyaWFudCA9IGZ1bmN0aW9uKGNvbmRpdGlvbiwgZm9ybWF0LCBhLCBiLCBjLCBkLCBlLCBmKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFyaWFudCByZXF1aXJlcyBhbiBlcnJvciBtZXNzYWdlIGFyZ3VtZW50Jyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFjb25kaXRpb24pIHtcbiAgICB2YXIgZXJyb3I7XG4gICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBlcnJvciA9IG5ldyBFcnJvcihcbiAgICAgICAgJ01pbmlmaWVkIGV4Y2VwdGlvbiBvY2N1cnJlZDsgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50ICcgK1xuICAgICAgICAnZm9yIHRoZSBmdWxsIGVycm9yIG1lc3NhZ2UgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy4nXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgYXJncyA9IFthLCBiLCBjLCBkLCBlLCBmXTtcbiAgICAgIHZhciBhcmdJbmRleCA9IDA7XG4gICAgICBlcnJvciA9IG5ldyBFcnJvcihcbiAgICAgICAgZm9ybWF0LnJlcGxhY2UoLyVzL2csIGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJnc1thcmdJbmRleCsrXTsgfSlcbiAgICAgICk7XG4gICAgICBlcnJvci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgIH1cblxuICAgIGVycm9yLmZyYW1lc1RvUG9wID0gMTsgLy8gd2UgZG9uJ3QgY2FyZSBhYm91dCBpbnZhcmlhbnQncyBvd24gZnJhbWVcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBpbnZhcmlhbnQ7XG4iLCIndXNlIHN0cmljdCc7XHJcblxyXG4vKipcclxuICogSXMgdGhpcyBzdHJpbmcgYWxsIHdoaXRlc3BhY2U/XHJcbiAqIFRoaXMgc29sdXRpb24ga2luZCBvZiBtYWtlcyBteSBicmFpbiBodXJ0LCBidXQgaXQncyBzaWduaWZpY2FudGx5IGZhc3RlclxyXG4gKiB0aGFuICFzdHIudHJpbSgpIG9yIGFueSBvdGhlciBzb2x1dGlvbiBJIGNvdWxkIGZpbmQuXHJcbiAqXHJcbiAqIHdoaXRlc3BhY2UgY29kZXMgZnJvbTogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9XaGl0ZXNwYWNlX2NoYXJhY3RlclxyXG4gKiBhbmQgdmVyaWZpZWQgd2l0aDpcclxuICpcclxuICogIGZvcih2YXIgaSA9IDA7IGkgPCA2NTUzNjsgaSsrKSB7XHJcbiAqICAgICAgdmFyIHMgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpO1xyXG4gKiAgICAgIGlmKCtzPT09MCAmJiAhcy50cmltKCkpIGNvbnNvbGUubG9nKGksIHMpO1xyXG4gKiAgfVxyXG4gKlxyXG4gKiB3aGljaCBjb3VudHMgYSBjb3VwbGUgb2YgdGhlc2UgYXMgKm5vdCogd2hpdGVzcGFjZSwgYnV0IGZpbmRzIG5vdGhpbmcgZWxzZVxyXG4gKiB0aGF0ICppcyogd2hpdGVzcGFjZS4gTm90ZSB0aGF0IGNoYXJDb2RlQXQgc3RvcHMgYXQgMTYgYml0cywgYnV0IGl0IGFwcGVhcnNcclxuICogdGhhdCB0aGVyZSBhcmUgbm8gd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGFib3ZlIHRoaXMsIGFuZCBjb2RlIHBvaW50cyBhYm92ZVxyXG4gKiB0aGlzIGRvIG5vdCBtYXAgb250byB3aGl0ZSBzcGFjZSBjaGFyYWN0ZXJzLlxyXG4gKi9cclxuXHJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oc3RyKXtcclxuICAgIHZhciBsID0gc3RyLmxlbmd0aCxcclxuICAgICAgICBhO1xyXG4gICAgZm9yKHZhciBpID0gMDsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgIGEgPSBzdHIuY2hhckNvZGVBdChpKTtcclxuICAgICAgICBpZigoYSA8IDkgfHwgYSA+IDEzKSAmJiAoYSAhPT0gMzIpICYmIChhICE9PSAxMzMpICYmIChhICE9PSAxNjApICYmXHJcbiAgICAgICAgICAgIChhICE9PSA1NzYwKSAmJiAoYSAhPT0gNjE1OCkgJiYgKGEgPCA4MTkyIHx8IGEgPiA4MjA1KSAmJlxyXG4gICAgICAgICAgICAoYSAhPT0gODIzMikgJiYgKGEgIT09IDgyMzMpICYmIChhICE9PSA4MjM5KSAmJiAoYSAhPT0gODI4NykgJiZcclxuICAgICAgICAgICAgKGEgIT09IDgyODgpICYmIChhICE9PSAxMjI4OCkgJiYgKGEgIT09IDY1Mjc5KSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG59XHJcbiIsIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcImxheW91dEJhc2VcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wibGF5b3V0QmFzZVwiXSA9IGZhY3RvcnkoKTtcbn0pKHRoaXMsIGZ1bmN0aW9uKCkge1xucmV0dXJuIC8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0aTogbW9kdWxlSWQsXG4vKioqKioqLyBcdFx0XHRsOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubCA9IHRydWU7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBpZGVudGl0eSBmdW5jdGlvbiBmb3IgY2FsbGluZyBoYXJtb255IGltcG9ydHMgd2l0aCB0aGUgY29ycmVjdCBjb250ZXh0XG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uaSA9IGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbi8qKioqKiovIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4vKioqKioqLyBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuLyoqKioqKi8gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuLyoqKioqKi8gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuLyoqKioqKi8gXHRcdFx0XHRnZXQ6IGdldHRlclxuLyoqKioqKi8gXHRcdFx0fSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4vKioqKioqLyBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbi8qKioqKiovIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4vKioqKioqLyBcdFx0cmV0dXJuIGdldHRlcjtcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDI4KTtcbi8qKioqKiovIH0pXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gKFtcbi8qIDAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuZnVuY3Rpb24gTGF5b3V0Q29uc3RhbnRzKCkge31cblxuLyoqXHJcbiAqIExheW91dCBRdWFsaXR5OiAwOmRyYWZ0LCAxOmRlZmF1bHQsIDI6cHJvb2ZcclxuICovXG5MYXlvdXRDb25zdGFudHMuUVVBTElUWSA9IDE7XG5cbi8qKlxyXG4gKiBEZWZhdWx0IHBhcmFtZXRlcnNcclxuICovXG5MYXlvdXRDb25zdGFudHMuREVGQVVMVF9DUkVBVEVfQkVORFNfQVNfTkVFREVEID0gZmFsc2U7XG5MYXlvdXRDb25zdGFudHMuREVGQVVMVF9JTkNSRU1FTlRBTCA9IGZhbHNlO1xuTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQU5JTUFUSU9OX09OX0xBWU9VVCA9IHRydWU7XG5MYXlvdXRDb25zdGFudHMuREVGQVVMVF9BTklNQVRJT05fRFVSSU5HX0xBWU9VVCA9IGZhbHNlO1xuTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQU5JTUFUSU9OX1BFUklPRCA9IDUwO1xuTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfVU5JRk9STV9MRUFGX05PREVfU0laRVMgPSBmYWxzZTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNlY3Rpb246IEdlbmVyYWwgb3RoZXIgY29uc3RhbnRzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLypcclxuICogTWFyZ2lucyBvZiBhIGdyYXBoIHRvIGJlIGFwcGxpZWQgb24gYm91ZGluZyByZWN0YW5nbGUgb2YgaXRzIGNvbnRlbnRzLiBXZVxyXG4gKiBhc3N1bWUgbWFyZ2lucyBvbiBhbGwgZm91ciBzaWRlcyB0byBiZSB1bmlmb3JtLlxyXG4gKi9cbkxheW91dENvbnN0YW50cy5ERUZBVUxUX0dSQVBIX01BUkdJTiA9IDE1O1xuXG4vKlxyXG4gKiBXaGV0aGVyIHRvIGNvbnNpZGVyIGxhYmVscyBpbiBub2RlIGRpbWVuc2lvbnMgb3Igbm90XHJcbiAqL1xuTGF5b3V0Q29uc3RhbnRzLk5PREVfRElNRU5TSU9OU19JTkNMVURFX0xBQkVMUyA9IGZhbHNlO1xuXG4vKlxyXG4gKiBEZWZhdWx0IGRpbWVuc2lvbiBvZiBhIG5vbi1jb21wb3VuZCBub2RlLlxyXG4gKi9cbkxheW91dENvbnN0YW50cy5TSU1QTEVfTk9ERV9TSVpFID0gNDA7XG5cbi8qXHJcbiAqIERlZmF1bHQgZGltZW5zaW9uIG9mIGEgbm9uLWNvbXBvdW5kIG5vZGUuXHJcbiAqL1xuTGF5b3V0Q29uc3RhbnRzLlNJTVBMRV9OT0RFX0hBTEZfU0laRSA9IExheW91dENvbnN0YW50cy5TSU1QTEVfTk9ERV9TSVpFIC8gMjtcblxuLypcclxuICogRW1wdHkgY29tcG91bmQgbm9kZSBzaXplLiBXaGVuIGEgY29tcG91bmQgbm9kZSBpcyBlbXB0eSwgaXRzIGJvdGhcclxuICogZGltZW5zaW9ucyBzaG91bGQgYmUgb2YgdGhpcyB2YWx1ZS5cclxuICovXG5MYXlvdXRDb25zdGFudHMuRU1QVFlfQ09NUE9VTkRfTk9ERV9TSVpFID0gNDA7XG5cbi8qXHJcbiAqIE1pbmltdW0gbGVuZ3RoIHRoYXQgYW4gZWRnZSBzaG91bGQgdGFrZSBkdXJpbmcgbGF5b3V0XHJcbiAqL1xuTGF5b3V0Q29uc3RhbnRzLk1JTl9FREdFX0xFTkdUSCA9IDE7XG5cbi8qXHJcbiAqIFdvcmxkIGJvdW5kYXJpZXMgdGhhdCBsYXlvdXQgb3BlcmF0ZXMgb25cclxuICovXG5MYXlvdXRDb25zdGFudHMuV09STERfQk9VTkRBUlkgPSAxMDAwMDAwO1xuXG4vKlxyXG4gKiBXb3JsZCBib3VuZGFyaWVzIHRoYXQgcmFuZG9tIHBvc2l0aW9uaW5nIGNhbiBiZSBwZXJmb3JtZWQgd2l0aFxyXG4gKi9cbkxheW91dENvbnN0YW50cy5JTklUSUFMX1dPUkxEX0JPVU5EQVJZID0gTGF5b3V0Q29uc3RhbnRzLldPUkxEX0JPVU5EQVJZIC8gMTAwMDtcblxuLypcclxuICogQ29vcmRpbmF0ZXMgb2YgdGhlIHdvcmxkIGNlbnRlclxyXG4gKi9cbkxheW91dENvbnN0YW50cy5XT1JMRF9DRU5URVJfWCA9IDEyMDA7XG5MYXlvdXRDb25zdGFudHMuV09STERfQ0VOVEVSX1kgPSA5MDA7XG5cbm1vZHVsZS5leHBvcnRzID0gTGF5b3V0Q29uc3RhbnRzO1xuXG4vKioqLyB9KSxcbi8qIDEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIExHcmFwaE9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMik7XG52YXIgSUdlb21ldHJ5ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4KTtcbnZhciBJTWF0aCA9IF9fd2VicGFja19yZXF1aXJlX18oOSk7XG5cbmZ1bmN0aW9uIExFZGdlKHNvdXJjZSwgdGFyZ2V0LCB2RWRnZSkge1xuICBMR3JhcGhPYmplY3QuY2FsbCh0aGlzLCB2RWRnZSk7XG5cbiAgdGhpcy5pc092ZXJsYXBpbmdTb3VyY2VBbmRUYXJnZXQgPSBmYWxzZTtcbiAgdGhpcy52R3JhcGhPYmplY3QgPSB2RWRnZTtcbiAgdGhpcy5iZW5kcG9pbnRzID0gW107XG4gIHRoaXMuc291cmNlID0gc291cmNlO1xuICB0aGlzLnRhcmdldCA9IHRhcmdldDtcbn1cblxuTEVkZ2UucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShMR3JhcGhPYmplY3QucHJvdG90eXBlKTtcblxuZm9yICh2YXIgcHJvcCBpbiBMR3JhcGhPYmplY3QpIHtcbiAgTEVkZ2VbcHJvcF0gPSBMR3JhcGhPYmplY3RbcHJvcF07XG59XG5cbkxFZGdlLnByb3RvdHlwZS5nZXRTb3VyY2UgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnNvdXJjZTtcbn07XG5cbkxFZGdlLnByb3RvdHlwZS5nZXRUYXJnZXQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnRhcmdldDtcbn07XG5cbkxFZGdlLnByb3RvdHlwZS5pc0ludGVyR3JhcGggPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmlzSW50ZXJHcmFwaDtcbn07XG5cbkxFZGdlLnByb3RvdHlwZS5nZXRMZW5ndGggPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmxlbmd0aDtcbn07XG5cbkxFZGdlLnByb3RvdHlwZS5pc092ZXJsYXBpbmdTb3VyY2VBbmRUYXJnZXQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmlzT3ZlcmxhcGluZ1NvdXJjZUFuZFRhcmdldDtcbn07XG5cbkxFZGdlLnByb3RvdHlwZS5nZXRCZW5kcG9pbnRzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5iZW5kcG9pbnRzO1xufTtcblxuTEVkZ2UucHJvdG90eXBlLmdldExjYSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubGNhO1xufTtcblxuTEVkZ2UucHJvdG90eXBlLmdldFNvdXJjZUluTGNhID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5zb3VyY2VJbkxjYTtcbn07XG5cbkxFZGdlLnByb3RvdHlwZS5nZXRUYXJnZXRJbkxjYSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMudGFyZ2V0SW5MY2E7XG59O1xuXG5MRWRnZS5wcm90b3R5cGUuZ2V0T3RoZXJFbmQgPSBmdW5jdGlvbiAobm9kZSkge1xuICBpZiAodGhpcy5zb3VyY2UgPT09IG5vZGUpIHtcbiAgICByZXR1cm4gdGhpcy50YXJnZXQ7XG4gIH0gZWxzZSBpZiAodGhpcy50YXJnZXQgPT09IG5vZGUpIHtcbiAgICByZXR1cm4gdGhpcy5zb3VyY2U7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgXCJOb2RlIGlzIG5vdCBpbmNpZGVudCB3aXRoIHRoaXMgZWRnZVwiO1xuICB9XG59O1xuXG5MRWRnZS5wcm90b3R5cGUuZ2V0T3RoZXJFbmRJbkdyYXBoID0gZnVuY3Rpb24gKG5vZGUsIGdyYXBoKSB7XG4gIHZhciBvdGhlckVuZCA9IHRoaXMuZ2V0T3RoZXJFbmQobm9kZSk7XG4gIHZhciByb290ID0gZ3JhcGguZ2V0R3JhcGhNYW5hZ2VyKCkuZ2V0Um9vdCgpO1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgaWYgKG90aGVyRW5kLmdldE93bmVyKCkgPT0gZ3JhcGgpIHtcbiAgICAgIHJldHVybiBvdGhlckVuZDtcbiAgICB9XG5cbiAgICBpZiAob3RoZXJFbmQuZ2V0T3duZXIoKSA9PSByb290KSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBvdGhlckVuZCA9IG90aGVyRW5kLmdldE93bmVyKCkuZ2V0UGFyZW50KCk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn07XG5cbkxFZGdlLnByb3RvdHlwZS51cGRhdGVMZW5ndGggPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBjbGlwUG9pbnRDb29yZGluYXRlcyA9IG5ldyBBcnJheSg0KTtcblxuICB0aGlzLmlzT3ZlcmxhcGluZ1NvdXJjZUFuZFRhcmdldCA9IElHZW9tZXRyeS5nZXRJbnRlcnNlY3Rpb24odGhpcy50YXJnZXQuZ2V0UmVjdCgpLCB0aGlzLnNvdXJjZS5nZXRSZWN0KCksIGNsaXBQb2ludENvb3JkaW5hdGVzKTtcblxuICBpZiAoIXRoaXMuaXNPdmVybGFwaW5nU291cmNlQW5kVGFyZ2V0KSB7XG4gICAgdGhpcy5sZW5ndGhYID0gY2xpcFBvaW50Q29vcmRpbmF0ZXNbMF0gLSBjbGlwUG9pbnRDb29yZGluYXRlc1syXTtcbiAgICB0aGlzLmxlbmd0aFkgPSBjbGlwUG9pbnRDb29yZGluYXRlc1sxXSAtIGNsaXBQb2ludENvb3JkaW5hdGVzWzNdO1xuXG4gICAgaWYgKE1hdGguYWJzKHRoaXMubGVuZ3RoWCkgPCAxLjApIHtcbiAgICAgIHRoaXMubGVuZ3RoWCA9IElNYXRoLnNpZ24odGhpcy5sZW5ndGhYKTtcbiAgICB9XG5cbiAgICBpZiAoTWF0aC5hYnModGhpcy5sZW5ndGhZKSA8IDEuMCkge1xuICAgICAgdGhpcy5sZW5ndGhZID0gSU1hdGguc2lnbih0aGlzLmxlbmd0aFkpO1xuICAgIH1cblxuICAgIHRoaXMubGVuZ3RoID0gTWF0aC5zcXJ0KHRoaXMubGVuZ3RoWCAqIHRoaXMubGVuZ3RoWCArIHRoaXMubGVuZ3RoWSAqIHRoaXMubGVuZ3RoWSk7XG4gIH1cbn07XG5cbkxFZGdlLnByb3RvdHlwZS51cGRhdGVMZW5ndGhTaW1wbGUgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMubGVuZ3RoWCA9IHRoaXMudGFyZ2V0LmdldENlbnRlclgoKSAtIHRoaXMuc291cmNlLmdldENlbnRlclgoKTtcbiAgdGhpcy5sZW5ndGhZID0gdGhpcy50YXJnZXQuZ2V0Q2VudGVyWSgpIC0gdGhpcy5zb3VyY2UuZ2V0Q2VudGVyWSgpO1xuXG4gIGlmIChNYXRoLmFicyh0aGlzLmxlbmd0aFgpIDwgMS4wKSB7XG4gICAgdGhpcy5sZW5ndGhYID0gSU1hdGguc2lnbih0aGlzLmxlbmd0aFgpO1xuICB9XG5cbiAgaWYgKE1hdGguYWJzKHRoaXMubGVuZ3RoWSkgPCAxLjApIHtcbiAgICB0aGlzLmxlbmd0aFkgPSBJTWF0aC5zaWduKHRoaXMubGVuZ3RoWSk7XG4gIH1cblxuICB0aGlzLmxlbmd0aCA9IE1hdGguc3FydCh0aGlzLmxlbmd0aFggKiB0aGlzLmxlbmd0aFggKyB0aGlzLmxlbmd0aFkgKiB0aGlzLmxlbmd0aFkpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBMRWRnZTtcblxuLyoqKi8gfSksXG4vKiAyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbmZ1bmN0aW9uIExHcmFwaE9iamVjdCh2R3JhcGhPYmplY3QpIHtcbiAgdGhpcy52R3JhcGhPYmplY3QgPSB2R3JhcGhPYmplY3Q7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gTEdyYXBoT2JqZWN0O1xuXG4vKioqLyB9KSxcbi8qIDMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIExHcmFwaE9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMik7XG52YXIgSW50ZWdlciA9IF9fd2VicGFja19yZXF1aXJlX18oMTApO1xudmFyIFJlY3RhbmdsZUQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzKTtcbnZhciBMYXlvdXRDb25zdGFudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xudmFyIFJhbmRvbVNlZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2KTtcbnZhciBQb2ludEQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpO1xuXG5mdW5jdGlvbiBMTm9kZShnbSwgbG9jLCBzaXplLCB2Tm9kZSkge1xuICAvL0FsdGVybmF0aXZlIGNvbnN0cnVjdG9yIDEgOiBMTm9kZShMR3JhcGhNYW5hZ2VyIGdtLCBQb2ludCBsb2MsIERpbWVuc2lvbiBzaXplLCBPYmplY3Qgdk5vZGUpXG4gIGlmIChzaXplID09IG51bGwgJiYgdk5vZGUgPT0gbnVsbCkge1xuICAgIHZOb2RlID0gbG9jO1xuICB9XG5cbiAgTEdyYXBoT2JqZWN0LmNhbGwodGhpcywgdk5vZGUpO1xuXG4gIC8vQWx0ZXJuYXRpdmUgY29uc3RydWN0b3IgMiA6IExOb2RlKExheW91dCBsYXlvdXQsIE9iamVjdCB2Tm9kZSlcbiAgaWYgKGdtLmdyYXBoTWFuYWdlciAhPSBudWxsKSBnbSA9IGdtLmdyYXBoTWFuYWdlcjtcblxuICB0aGlzLmVzdGltYXRlZFNpemUgPSBJbnRlZ2VyLk1JTl9WQUxVRTtcbiAgdGhpcy5pbmNsdXNpb25UcmVlRGVwdGggPSBJbnRlZ2VyLk1BWF9WQUxVRTtcbiAgdGhpcy52R3JhcGhPYmplY3QgPSB2Tm9kZTtcbiAgdGhpcy5lZGdlcyA9IFtdO1xuICB0aGlzLmdyYXBoTWFuYWdlciA9IGdtO1xuXG4gIGlmIChzaXplICE9IG51bGwgJiYgbG9jICE9IG51bGwpIHRoaXMucmVjdCA9IG5ldyBSZWN0YW5nbGVEKGxvYy54LCBsb2MueSwgc2l6ZS53aWR0aCwgc2l6ZS5oZWlnaHQpO2Vsc2UgdGhpcy5yZWN0ID0gbmV3IFJlY3RhbmdsZUQoKTtcbn1cblxuTE5vZGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShMR3JhcGhPYmplY3QucHJvdG90eXBlKTtcbmZvciAodmFyIHByb3AgaW4gTEdyYXBoT2JqZWN0KSB7XG4gIExOb2RlW3Byb3BdID0gTEdyYXBoT2JqZWN0W3Byb3BdO1xufVxuXG5MTm9kZS5wcm90b3R5cGUuZ2V0RWRnZXMgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmVkZ2VzO1xufTtcblxuTE5vZGUucHJvdG90eXBlLmdldENoaWxkID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5jaGlsZDtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5nZXRPd25lciA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gIGlmICh0aGlzLm93bmVyICE9IG51bGwpIHtcbiAgLy8gICAgaWYgKCEodGhpcy5vd25lciA9PSBudWxsIHx8IHRoaXMub3duZXIuZ2V0Tm9kZXMoKS5pbmRleE9mKHRoaXMpID4gLTEpKSB7XG4gIC8vICAgICAgdGhyb3cgXCJhc3NlcnQgZmFpbGVkXCI7XG4gIC8vICAgIH1cbiAgLy8gIH1cblxuICByZXR1cm4gdGhpcy5vd25lcjtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5nZXRXaWR0aCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMucmVjdC53aWR0aDtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5zZXRXaWR0aCA9IGZ1bmN0aW9uICh3aWR0aCkge1xuICB0aGlzLnJlY3Qud2lkdGggPSB3aWR0aDtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5nZXRIZWlnaHQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnJlY3QuaGVpZ2h0O1xufTtcblxuTE5vZGUucHJvdG90eXBlLnNldEhlaWdodCA9IGZ1bmN0aW9uIChoZWlnaHQpIHtcbiAgdGhpcy5yZWN0LmhlaWdodCA9IGhlaWdodDtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5nZXRDZW50ZXJYID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5yZWN0LnggKyB0aGlzLnJlY3Qud2lkdGggLyAyO1xufTtcblxuTE5vZGUucHJvdG90eXBlLmdldENlbnRlclkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnJlY3QueSArIHRoaXMucmVjdC5oZWlnaHQgLyAyO1xufTtcblxuTE5vZGUucHJvdG90eXBlLmdldENlbnRlciA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIG5ldyBQb2ludEQodGhpcy5yZWN0LnggKyB0aGlzLnJlY3Qud2lkdGggLyAyLCB0aGlzLnJlY3QueSArIHRoaXMucmVjdC5oZWlnaHQgLyAyKTtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5nZXRMb2NhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIG5ldyBQb2ludEQodGhpcy5yZWN0LngsIHRoaXMucmVjdC55KTtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5nZXRSZWN0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5yZWN0O1xufTtcblxuTE5vZGUucHJvdG90eXBlLmdldERpYWdvbmFsID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gTWF0aC5zcXJ0KHRoaXMucmVjdC53aWR0aCAqIHRoaXMucmVjdC53aWR0aCArIHRoaXMucmVjdC5oZWlnaHQgKiB0aGlzLnJlY3QuaGVpZ2h0KTtcbn07XG5cbi8qKlxuICogVGhpcyBtZXRob2QgcmV0dXJucyBoYWxmIHRoZSBkaWFnb25hbCBsZW5ndGggb2YgdGhpcyBub2RlLlxuICovXG5MTm9kZS5wcm90b3R5cGUuZ2V0SGFsZlRoZURpYWdvbmFsID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gTWF0aC5zcXJ0KHRoaXMucmVjdC5oZWlnaHQgKiB0aGlzLnJlY3QuaGVpZ2h0ICsgdGhpcy5yZWN0LndpZHRoICogdGhpcy5yZWN0LndpZHRoKSAvIDI7XG59O1xuXG5MTm9kZS5wcm90b3R5cGUuc2V0UmVjdCA9IGZ1bmN0aW9uICh1cHBlckxlZnQsIGRpbWVuc2lvbikge1xuICB0aGlzLnJlY3QueCA9IHVwcGVyTGVmdC54O1xuICB0aGlzLnJlY3QueSA9IHVwcGVyTGVmdC55O1xuICB0aGlzLnJlY3Qud2lkdGggPSBkaW1lbnNpb24ud2lkdGg7XG4gIHRoaXMucmVjdC5oZWlnaHQgPSBkaW1lbnNpb24uaGVpZ2h0O1xufTtcblxuTE5vZGUucHJvdG90eXBlLnNldENlbnRlciA9IGZ1bmN0aW9uIChjeCwgY3kpIHtcbiAgdGhpcy5yZWN0LnggPSBjeCAtIHRoaXMucmVjdC53aWR0aCAvIDI7XG4gIHRoaXMucmVjdC55ID0gY3kgLSB0aGlzLnJlY3QuaGVpZ2h0IC8gMjtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5zZXRMb2NhdGlvbiA9IGZ1bmN0aW9uICh4LCB5KSB7XG4gIHRoaXMucmVjdC54ID0geDtcbiAgdGhpcy5yZWN0LnkgPSB5O1xufTtcblxuTE5vZGUucHJvdG90eXBlLm1vdmVCeSA9IGZ1bmN0aW9uIChkeCwgZHkpIHtcbiAgdGhpcy5yZWN0LnggKz0gZHg7XG4gIHRoaXMucmVjdC55ICs9IGR5O1xufTtcblxuTE5vZGUucHJvdG90eXBlLmdldEVkZ2VMaXN0VG9Ob2RlID0gZnVuY3Rpb24gKHRvKSB7XG4gIHZhciBlZGdlTGlzdCA9IFtdO1xuICB2YXIgZWRnZTtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gIHNlbGYuZWRnZXMuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuXG4gICAgaWYgKGVkZ2UudGFyZ2V0ID09IHRvKSB7XG4gICAgICBpZiAoZWRnZS5zb3VyY2UgIT0gc2VsZikgdGhyb3cgXCJJbmNvcnJlY3QgZWRnZSBzb3VyY2UhXCI7XG5cbiAgICAgIGVkZ2VMaXN0LnB1c2goZWRnZSk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gZWRnZUxpc3Q7XG59O1xuXG5MTm9kZS5wcm90b3R5cGUuZ2V0RWRnZXNCZXR3ZWVuID0gZnVuY3Rpb24gKG90aGVyKSB7XG4gIHZhciBlZGdlTGlzdCA9IFtdO1xuICB2YXIgZWRnZTtcblxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHNlbGYuZWRnZXMuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuXG4gICAgaWYgKCEoZWRnZS5zb3VyY2UgPT0gc2VsZiB8fCBlZGdlLnRhcmdldCA9PSBzZWxmKSkgdGhyb3cgXCJJbmNvcnJlY3QgZWRnZSBzb3VyY2UgYW5kL29yIHRhcmdldFwiO1xuXG4gICAgaWYgKGVkZ2UudGFyZ2V0ID09IG90aGVyIHx8IGVkZ2Uuc291cmNlID09IG90aGVyKSB7XG4gICAgICBlZGdlTGlzdC5wdXNoKGVkZ2UpO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGVkZ2VMaXN0O1xufTtcblxuTE5vZGUucHJvdG90eXBlLmdldE5laWdoYm9yc0xpc3QgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBuZWlnaGJvcnMgPSBuZXcgU2V0KCk7XG5cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBzZWxmLmVkZ2VzLmZvckVhY2goZnVuY3Rpb24gKGVkZ2UpIHtcblxuICAgIGlmIChlZGdlLnNvdXJjZSA9PSBzZWxmKSB7XG4gICAgICBuZWlnaGJvcnMuYWRkKGVkZ2UudGFyZ2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGVkZ2UudGFyZ2V0ICE9IHNlbGYpIHtcbiAgICAgICAgdGhyb3cgXCJJbmNvcnJlY3QgaW5jaWRlbmN5IVwiO1xuICAgICAgfVxuXG4gICAgICBuZWlnaGJvcnMuYWRkKGVkZ2Uuc291cmNlKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBuZWlnaGJvcnM7XG59O1xuXG5MTm9kZS5wcm90b3R5cGUud2l0aENoaWxkcmVuID0gZnVuY3Rpb24gKCkge1xuICB2YXIgd2l0aE5laWdoYm9yc0xpc3QgPSBuZXcgU2V0KCk7XG4gIHZhciBjaGlsZE5vZGU7XG4gIHZhciBjaGlsZHJlbjtcblxuICB3aXRoTmVpZ2hib3JzTGlzdC5hZGQodGhpcyk7XG5cbiAgaWYgKHRoaXMuY2hpbGQgIT0gbnVsbCkge1xuICAgIHZhciBub2RlcyA9IHRoaXMuY2hpbGQuZ2V0Tm9kZXMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjaGlsZE5vZGUgPSBub2Rlc1tpXTtcbiAgICAgIGNoaWxkcmVuID0gY2hpbGROb2RlLndpdGhDaGlsZHJlbigpO1xuICAgICAgY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICB3aXRoTmVpZ2hib3JzTGlzdC5hZGQobm9kZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gd2l0aE5laWdoYm9yc0xpc3Q7XG59O1xuXG5MTm9kZS5wcm90b3R5cGUuZ2V0Tm9PZkNoaWxkcmVuID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbm9PZkNoaWxkcmVuID0gMDtcbiAgdmFyIGNoaWxkTm9kZTtcblxuICBpZiAodGhpcy5jaGlsZCA9PSBudWxsKSB7XG4gICAgbm9PZkNoaWxkcmVuID0gMTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbm9kZXMgPSB0aGlzLmNoaWxkLmdldE5vZGVzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY2hpbGROb2RlID0gbm9kZXNbaV07XG5cbiAgICAgIG5vT2ZDaGlsZHJlbiArPSBjaGlsZE5vZGUuZ2V0Tm9PZkNoaWxkcmVuKCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKG5vT2ZDaGlsZHJlbiA9PSAwKSB7XG4gICAgbm9PZkNoaWxkcmVuID0gMTtcbiAgfVxuICByZXR1cm4gbm9PZkNoaWxkcmVuO1xufTtcblxuTE5vZGUucHJvdG90eXBlLmdldEVzdGltYXRlZFNpemUgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLmVzdGltYXRlZFNpemUgPT0gSW50ZWdlci5NSU5fVkFMVUUpIHtcbiAgICB0aHJvdyBcImFzc2VydCBmYWlsZWRcIjtcbiAgfVxuICByZXR1cm4gdGhpcy5lc3RpbWF0ZWRTaXplO1xufTtcblxuTE5vZGUucHJvdG90eXBlLmNhbGNFc3RpbWF0ZWRTaXplID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5jaGlsZCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHRoaXMuZXN0aW1hdGVkU2l6ZSA9ICh0aGlzLnJlY3Qud2lkdGggKyB0aGlzLnJlY3QuaGVpZ2h0KSAvIDI7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5lc3RpbWF0ZWRTaXplID0gdGhpcy5jaGlsZC5jYWxjRXN0aW1hdGVkU2l6ZSgpO1xuICAgIHRoaXMucmVjdC53aWR0aCA9IHRoaXMuZXN0aW1hdGVkU2l6ZTtcbiAgICB0aGlzLnJlY3QuaGVpZ2h0ID0gdGhpcy5lc3RpbWF0ZWRTaXplO1xuXG4gICAgcmV0dXJuIHRoaXMuZXN0aW1hdGVkU2l6ZTtcbiAgfVxufTtcblxuTE5vZGUucHJvdG90eXBlLnNjYXR0ZXIgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciByYW5kb21DZW50ZXJYO1xuICB2YXIgcmFuZG9tQ2VudGVyWTtcblxuICB2YXIgbWluWCA9IC1MYXlvdXRDb25zdGFudHMuSU5JVElBTF9XT1JMRF9CT1VOREFSWTtcbiAgdmFyIG1heFggPSBMYXlvdXRDb25zdGFudHMuSU5JVElBTF9XT1JMRF9CT1VOREFSWTtcbiAgcmFuZG9tQ2VudGVyWCA9IExheW91dENvbnN0YW50cy5XT1JMRF9DRU5URVJfWCArIFJhbmRvbVNlZWQubmV4dERvdWJsZSgpICogKG1heFggLSBtaW5YKSArIG1pblg7XG5cbiAgdmFyIG1pblkgPSAtTGF5b3V0Q29uc3RhbnRzLklOSVRJQUxfV09STERfQk9VTkRBUlk7XG4gIHZhciBtYXhZID0gTGF5b3V0Q29uc3RhbnRzLklOSVRJQUxfV09STERfQk9VTkRBUlk7XG4gIHJhbmRvbUNlbnRlclkgPSBMYXlvdXRDb25zdGFudHMuV09STERfQ0VOVEVSX1kgKyBSYW5kb21TZWVkLm5leHREb3VibGUoKSAqIChtYXhZIC0gbWluWSkgKyBtaW5ZO1xuXG4gIHRoaXMucmVjdC54ID0gcmFuZG9tQ2VudGVyWDtcbiAgdGhpcy5yZWN0LnkgPSByYW5kb21DZW50ZXJZO1xufTtcblxuTE5vZGUucHJvdG90eXBlLnVwZGF0ZUJvdW5kcyA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuZ2V0Q2hpbGQoKSA9PSBudWxsKSB7XG4gICAgdGhyb3cgXCJhc3NlcnQgZmFpbGVkXCI7XG4gIH1cbiAgaWYgKHRoaXMuZ2V0Q2hpbGQoKS5nZXROb2RlcygpLmxlbmd0aCAhPSAwKSB7XG4gICAgLy8gd3JhcCB0aGUgY2hpbGRyZW4gbm9kZXMgYnkgcmUtYXJyYW5naW5nIHRoZSBib3VuZGFyaWVzXG4gICAgdmFyIGNoaWxkR3JhcGggPSB0aGlzLmdldENoaWxkKCk7XG4gICAgY2hpbGRHcmFwaC51cGRhdGVCb3VuZHModHJ1ZSk7XG5cbiAgICB0aGlzLnJlY3QueCA9IGNoaWxkR3JhcGguZ2V0TGVmdCgpO1xuICAgIHRoaXMucmVjdC55ID0gY2hpbGRHcmFwaC5nZXRUb3AoKTtcblxuICAgIHRoaXMuc2V0V2lkdGgoY2hpbGRHcmFwaC5nZXRSaWdodCgpIC0gY2hpbGRHcmFwaC5nZXRMZWZ0KCkpO1xuICAgIHRoaXMuc2V0SGVpZ2h0KGNoaWxkR3JhcGguZ2V0Qm90dG9tKCkgLSBjaGlsZEdyYXBoLmdldFRvcCgpKTtcblxuICAgIC8vIFVwZGF0ZSBjb21wb3VuZCBib3VuZHMgY29uc2lkZXJpbmcgaXRzIGxhYmVsIHByb3BlcnRpZXMgICAgXG4gICAgaWYgKExheW91dENvbnN0YW50cy5OT0RFX0RJTUVOU0lPTlNfSU5DTFVERV9MQUJFTFMpIHtcblxuICAgICAgdmFyIHdpZHRoID0gY2hpbGRHcmFwaC5nZXRSaWdodCgpIC0gY2hpbGRHcmFwaC5nZXRMZWZ0KCk7XG4gICAgICB2YXIgaGVpZ2h0ID0gY2hpbGRHcmFwaC5nZXRCb3R0b20oKSAtIGNoaWxkR3JhcGguZ2V0VG9wKCk7XG5cbiAgICAgIGlmICh0aGlzLmxhYmVsV2lkdGgpIHtcbiAgICAgICAgaWYgKHRoaXMubGFiZWxQb3NIb3Jpem9udGFsID09IFwibGVmdFwiKSB7XG4gICAgICAgICAgdGhpcy5yZWN0LnggLT0gdGhpcy5sYWJlbFdpZHRoO1xuICAgICAgICAgIHRoaXMuc2V0V2lkdGgod2lkdGggKyB0aGlzLmxhYmVsV2lkdGgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubGFiZWxQb3NIb3Jpem9udGFsID09IFwiY2VudGVyXCIgJiYgdGhpcy5sYWJlbFdpZHRoID4gd2lkdGgpIHtcbiAgICAgICAgICB0aGlzLnJlY3QueCAtPSAodGhpcy5sYWJlbFdpZHRoIC0gd2lkdGgpIC8gMjtcbiAgICAgICAgICB0aGlzLnNldFdpZHRoKHRoaXMubGFiZWxXaWR0aCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5sYWJlbFBvc0hvcml6b250YWwgPT0gXCJyaWdodFwiKSB7XG4gICAgICAgICAgdGhpcy5zZXRXaWR0aCh3aWR0aCArIHRoaXMubGFiZWxXaWR0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMubGFiZWxIZWlnaHQpIHtcbiAgICAgICAgaWYgKHRoaXMubGFiZWxQb3NWZXJ0aWNhbCA9PSBcInRvcFwiKSB7XG4gICAgICAgICAgdGhpcy5yZWN0LnkgLT0gdGhpcy5sYWJlbEhlaWdodDtcbiAgICAgICAgICB0aGlzLnNldEhlaWdodChoZWlnaHQgKyB0aGlzLmxhYmVsSGVpZ2h0KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxhYmVsUG9zVmVydGljYWwgPT0gXCJjZW50ZXJcIiAmJiB0aGlzLmxhYmVsSGVpZ2h0ID4gaGVpZ2h0KSB7XG4gICAgICAgICAgdGhpcy5yZWN0LnkgLT0gKHRoaXMubGFiZWxIZWlnaHQgLSBoZWlnaHQpIC8gMjtcbiAgICAgICAgICB0aGlzLnNldEhlaWdodCh0aGlzLmxhYmVsSGVpZ2h0KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxhYmVsUG9zVmVydGljYWwgPT0gXCJib3R0b21cIikge1xuICAgICAgICAgIHRoaXMuc2V0SGVpZ2h0KGhlaWdodCArIHRoaXMubGFiZWxIZWlnaHQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG5MTm9kZS5wcm90b3R5cGUuZ2V0SW5jbHVzaW9uVHJlZURlcHRoID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5pbmNsdXNpb25UcmVlRGVwdGggPT0gSW50ZWdlci5NQVhfVkFMVUUpIHtcbiAgICB0aHJvdyBcImFzc2VydCBmYWlsZWRcIjtcbiAgfVxuICByZXR1cm4gdGhpcy5pbmNsdXNpb25UcmVlRGVwdGg7XG59O1xuXG5MTm9kZS5wcm90b3R5cGUudHJhbnNmb3JtID0gZnVuY3Rpb24gKHRyYW5zKSB7XG4gIHZhciBsZWZ0ID0gdGhpcy5yZWN0Lng7XG5cbiAgaWYgKGxlZnQgPiBMYXlvdXRDb25zdGFudHMuV09STERfQk9VTkRBUlkpIHtcbiAgICBsZWZ0ID0gTGF5b3V0Q29uc3RhbnRzLldPUkxEX0JPVU5EQVJZO1xuICB9IGVsc2UgaWYgKGxlZnQgPCAtTGF5b3V0Q29uc3RhbnRzLldPUkxEX0JPVU5EQVJZKSB7XG4gICAgbGVmdCA9IC1MYXlvdXRDb25zdGFudHMuV09STERfQk9VTkRBUlk7XG4gIH1cblxuICB2YXIgdG9wID0gdGhpcy5yZWN0Lnk7XG5cbiAgaWYgKHRvcCA+IExheW91dENvbnN0YW50cy5XT1JMRF9CT1VOREFSWSkge1xuICAgIHRvcCA9IExheW91dENvbnN0YW50cy5XT1JMRF9CT1VOREFSWTtcbiAgfSBlbHNlIGlmICh0b3AgPCAtTGF5b3V0Q29uc3RhbnRzLldPUkxEX0JPVU5EQVJZKSB7XG4gICAgdG9wID0gLUxheW91dENvbnN0YW50cy5XT1JMRF9CT1VOREFSWTtcbiAgfVxuXG4gIHZhciBsZWZ0VG9wID0gbmV3IFBvaW50RChsZWZ0LCB0b3ApO1xuICB2YXIgdkxlZnRUb3AgPSB0cmFucy5pbnZlcnNlVHJhbnNmb3JtUG9pbnQobGVmdFRvcCk7XG5cbiAgdGhpcy5zZXRMb2NhdGlvbih2TGVmdFRvcC54LCB2TGVmdFRvcC55KTtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5nZXRMZWZ0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5yZWN0Lng7XG59O1xuXG5MTm9kZS5wcm90b3R5cGUuZ2V0UmlnaHQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnJlY3QueCArIHRoaXMucmVjdC53aWR0aDtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5nZXRUb3AgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnJlY3QueTtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5nZXRCb3R0b20gPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnJlY3QueSArIHRoaXMucmVjdC5oZWlnaHQ7XG59O1xuXG5MTm9kZS5wcm90b3R5cGUuZ2V0UGFyZW50ID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5vd25lciA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gdGhpcy5vd25lci5nZXRQYXJlbnQoKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gTE5vZGU7XG5cbi8qKiovIH0pLFxuLyogNCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgTGF5b3V0Q29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxuZnVuY3Rpb24gRkRMYXlvdXRDb25zdGFudHMoKSB7fVxuXG4vL0ZETGF5b3V0Q29uc3RhbnRzIGluaGVyaXRzIHN0YXRpYyBwcm9wcyBpbiBMYXlvdXRDb25zdGFudHNcbmZvciAodmFyIHByb3AgaW4gTGF5b3V0Q29uc3RhbnRzKSB7XG4gIEZETGF5b3V0Q29uc3RhbnRzW3Byb3BdID0gTGF5b3V0Q29uc3RhbnRzW3Byb3BdO1xufVxuXG5GRExheW91dENvbnN0YW50cy5NQVhfSVRFUkFUSU9OUyA9IDI1MDA7XG5cbkZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfRURHRV9MRU5HVEggPSA1MDtcbkZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfU1BSSU5HX1NUUkVOR1RIID0gMC40NTtcbkZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfUkVQVUxTSU9OX1NUUkVOR1RIID0gNDUwMC4wO1xuRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9HUkFWSVRZX1NUUkVOR1RIID0gMC40O1xuRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9DT01QT1VORF9HUkFWSVRZX1NUUkVOR1RIID0gMS4wO1xuRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9HUkFWSVRZX1JBTkdFX0ZBQ1RPUiA9IDMuODtcbkZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQ09NUE9VTkRfR1JBVklUWV9SQU5HRV9GQUNUT1IgPSAxLjU7XG5GRExheW91dENvbnN0YW50cy5ERUZBVUxUX1VTRV9TTUFSVF9JREVBTF9FREdFX0xFTkdUSF9DQUxDVUxBVElPTiA9IHRydWU7XG5GRExheW91dENvbnN0YW50cy5ERUZBVUxUX1VTRV9TTUFSVF9SRVBVTFNJT05fUkFOR0VfQ0FMQ1VMQVRJT04gPSB0cnVlO1xuRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9DT09MSU5HX0ZBQ1RPUl9JTkNSRU1FTlRBTCA9IDAuMztcbkZETGF5b3V0Q29uc3RhbnRzLkNPT0xJTkdfQURBUFRBVElPTl9GQUNUT1IgPSAwLjMzO1xuRkRMYXlvdXRDb25zdGFudHMuQURBUFRBVElPTl9MT1dFUl9OT0RFX0xJTUlUID0gMTAwMDtcbkZETGF5b3V0Q29uc3RhbnRzLkFEQVBUQVRJT05fVVBQRVJfTk9ERV9MSU1JVCA9IDUwMDA7XG5GRExheW91dENvbnN0YW50cy5NQVhfTk9ERV9ESVNQTEFDRU1FTlRfSU5DUkVNRU5UQUwgPSAxMDAuMDtcbkZETGF5b3V0Q29uc3RhbnRzLk1BWF9OT0RFX0RJU1BMQUNFTUVOVCA9IEZETGF5b3V0Q29uc3RhbnRzLk1BWF9OT0RFX0RJU1BMQUNFTUVOVF9JTkNSRU1FTlRBTCAqIDM7XG5GRExheW91dENvbnN0YW50cy5NSU5fUkVQVUxTSU9OX0RJU1QgPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIIC8gMTAuMDtcbkZETGF5b3V0Q29uc3RhbnRzLkNPTlZFUkdFTkNFX0NIRUNLX1BFUklPRCA9IDEwMDtcbkZETGF5b3V0Q29uc3RhbnRzLlBFUl9MRVZFTF9JREVBTF9FREdFX0xFTkdUSF9GQUNUT1IgPSAwLjE7XG5GRExheW91dENvbnN0YW50cy5NSU5fRURHRV9MRU5HVEggPSAxO1xuRkRMYXlvdXRDb25zdGFudHMuR1JJRF9DQUxDVUxBVElPTl9DSEVDS19QRVJJT0QgPSAxMDtcblxubW9kdWxlLmV4cG9ydHMgPSBGRExheW91dENvbnN0YW50cztcblxuLyoqKi8gfSksXG4vKiA1ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbmZ1bmN0aW9uIFBvaW50RCh4LCB5KSB7XG4gIGlmICh4ID09IG51bGwgJiYgeSA9PSBudWxsKSB7XG4gICAgdGhpcy54ID0gMDtcbiAgICB0aGlzLnkgPSAwO1xuICB9IGVsc2Uge1xuICAgIHRoaXMueCA9IHg7XG4gICAgdGhpcy55ID0geTtcbiAgfVxufVxuXG5Qb2ludEQucHJvdG90eXBlLmdldFggPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLng7XG59O1xuXG5Qb2ludEQucHJvdG90eXBlLmdldFkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnk7XG59O1xuXG5Qb2ludEQucHJvdG90eXBlLnNldFggPSBmdW5jdGlvbiAoeCkge1xuICB0aGlzLnggPSB4O1xufTtcblxuUG9pbnRELnByb3RvdHlwZS5zZXRZID0gZnVuY3Rpb24gKHkpIHtcbiAgdGhpcy55ID0geTtcbn07XG5cblBvaW50RC5wcm90b3R5cGUuZ2V0RGlmZmVyZW5jZSA9IGZ1bmN0aW9uIChwdCkge1xuICByZXR1cm4gbmV3IERpbWVuc2lvbkQodGhpcy54IC0gcHQueCwgdGhpcy55IC0gcHQueSk7XG59O1xuXG5Qb2ludEQucHJvdG90eXBlLmdldENvcHkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBuZXcgUG9pbnREKHRoaXMueCwgdGhpcy55KTtcbn07XG5cblBvaW50RC5wcm90b3R5cGUudHJhbnNsYXRlID0gZnVuY3Rpb24gKGRpbSkge1xuICB0aGlzLnggKz0gZGltLndpZHRoO1xuICB0aGlzLnkgKz0gZGltLmhlaWdodDtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFBvaW50RDtcblxuLyoqKi8gfSksXG4vKiA2ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBMR3JhcGhPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xudmFyIEludGVnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKTtcbnZhciBMYXlvdXRDb25zdGFudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xudmFyIExHcmFwaE1hbmFnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpO1xudmFyIExOb2RlID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTtcbnZhciBMRWRnZSA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG52YXIgUmVjdGFuZ2xlRCA9IF9fd2VicGFja19yZXF1aXJlX18oMTMpO1xudmFyIFBvaW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMik7XG52YXIgTGlua2VkTGlzdCA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpO1xuXG5mdW5jdGlvbiBMR3JhcGgocGFyZW50LCBvYmoyLCB2R3JhcGgpIHtcbiAgTEdyYXBoT2JqZWN0LmNhbGwodGhpcywgdkdyYXBoKTtcbiAgdGhpcy5lc3RpbWF0ZWRTaXplID0gSW50ZWdlci5NSU5fVkFMVUU7XG4gIHRoaXMubWFyZ2luID0gTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfR1JBUEhfTUFSR0lOO1xuICB0aGlzLmVkZ2VzID0gW107XG4gIHRoaXMubm9kZXMgPSBbXTtcbiAgdGhpcy5pc0Nvbm5lY3RlZCA9IGZhbHNlO1xuICB0aGlzLnBhcmVudCA9IHBhcmVudDtcblxuICBpZiAob2JqMiAhPSBudWxsICYmIG9iajIgaW5zdGFuY2VvZiBMR3JhcGhNYW5hZ2VyKSB7XG4gICAgdGhpcy5ncmFwaE1hbmFnZXIgPSBvYmoyO1xuICB9IGVsc2UgaWYgKG9iajIgIT0gbnVsbCAmJiBvYmoyIGluc3RhbmNlb2YgTGF5b3V0KSB7XG4gICAgdGhpcy5ncmFwaE1hbmFnZXIgPSBvYmoyLmdyYXBoTWFuYWdlcjtcbiAgfVxufVxuXG5MR3JhcGgucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShMR3JhcGhPYmplY3QucHJvdG90eXBlKTtcbmZvciAodmFyIHByb3AgaW4gTEdyYXBoT2JqZWN0KSB7XG4gIExHcmFwaFtwcm9wXSA9IExHcmFwaE9iamVjdFtwcm9wXTtcbn1cblxuTEdyYXBoLnByb3RvdHlwZS5nZXROb2RlcyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubm9kZXM7XG59O1xuXG5MR3JhcGgucHJvdG90eXBlLmdldEVkZ2VzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5lZGdlcztcbn07XG5cbkxHcmFwaC5wcm90b3R5cGUuZ2V0R3JhcGhNYW5hZ2VyID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5ncmFwaE1hbmFnZXI7XG59O1xuXG5MR3JhcGgucHJvdG90eXBlLmdldFBhcmVudCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMucGFyZW50O1xufTtcblxuTEdyYXBoLnByb3RvdHlwZS5nZXRMZWZ0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5sZWZ0O1xufTtcblxuTEdyYXBoLnByb3RvdHlwZS5nZXRSaWdodCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMucmlnaHQ7XG59O1xuXG5MR3JhcGgucHJvdG90eXBlLmdldFRvcCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMudG9wO1xufTtcblxuTEdyYXBoLnByb3RvdHlwZS5nZXRCb3R0b20gPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmJvdHRvbTtcbn07XG5cbkxHcmFwaC5wcm90b3R5cGUuaXNDb25uZWN0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmlzQ29ubmVjdGVkO1xufTtcblxuTEdyYXBoLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAob2JqMSwgc291cmNlTm9kZSwgdGFyZ2V0Tm9kZSkge1xuICBpZiAoc291cmNlTm9kZSA9PSBudWxsICYmIHRhcmdldE5vZGUgPT0gbnVsbCkge1xuICAgIHZhciBuZXdOb2RlID0gb2JqMTtcbiAgICBpZiAodGhpcy5ncmFwaE1hbmFnZXIgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgXCJHcmFwaCBoYXMgbm8gZ3JhcGggbWdyIVwiO1xuICAgIH1cbiAgICBpZiAodGhpcy5nZXROb2RlcygpLmluZGV4T2YobmV3Tm9kZSkgPiAtMSkge1xuICAgICAgdGhyb3cgXCJOb2RlIGFscmVhZHkgaW4gZ3JhcGghXCI7XG4gICAgfVxuICAgIG5ld05vZGUub3duZXIgPSB0aGlzO1xuICAgIHRoaXMuZ2V0Tm9kZXMoKS5wdXNoKG5ld05vZGUpO1xuXG4gICAgcmV0dXJuIG5ld05vZGU7XG4gIH0gZWxzZSB7XG4gICAgdmFyIG5ld0VkZ2UgPSBvYmoxO1xuICAgIGlmICghKHRoaXMuZ2V0Tm9kZXMoKS5pbmRleE9mKHNvdXJjZU5vZGUpID4gLTEgJiYgdGhpcy5nZXROb2RlcygpLmluZGV4T2YodGFyZ2V0Tm9kZSkgPiAtMSkpIHtcbiAgICAgIHRocm93IFwiU291cmNlIG9yIHRhcmdldCBub3QgaW4gZ3JhcGghXCI7XG4gICAgfVxuXG4gICAgaWYgKCEoc291cmNlTm9kZS5vd25lciA9PSB0YXJnZXROb2RlLm93bmVyICYmIHNvdXJjZU5vZGUub3duZXIgPT0gdGhpcykpIHtcbiAgICAgIHRocm93IFwiQm90aCBvd25lcnMgbXVzdCBiZSB0aGlzIGdyYXBoIVwiO1xuICAgIH1cblxuICAgIGlmIChzb3VyY2VOb2RlLm93bmVyICE9IHRhcmdldE5vZGUub3duZXIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIHNldCBzb3VyY2UgYW5kIHRhcmdldFxuICAgIG5ld0VkZ2Uuc291cmNlID0gc291cmNlTm9kZTtcbiAgICBuZXdFZGdlLnRhcmdldCA9IHRhcmdldE5vZGU7XG5cbiAgICAvLyBzZXQgYXMgaW50cmEtZ3JhcGggZWRnZVxuICAgIG5ld0VkZ2UuaXNJbnRlckdyYXBoID0gZmFsc2U7XG5cbiAgICAvLyBhZGQgdG8gZ3JhcGggZWRnZSBsaXN0XG4gICAgdGhpcy5nZXRFZGdlcygpLnB1c2gobmV3RWRnZSk7XG5cbiAgICAvLyBhZGQgdG8gaW5jaWRlbmN5IGxpc3RzXG4gICAgc291cmNlTm9kZS5lZGdlcy5wdXNoKG5ld0VkZ2UpO1xuXG4gICAgaWYgKHRhcmdldE5vZGUgIT0gc291cmNlTm9kZSkge1xuICAgICAgdGFyZ2V0Tm9kZS5lZGdlcy5wdXNoKG5ld0VkZ2UpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXdFZGdlO1xuICB9XG59O1xuXG5MR3JhcGgucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChvYmopIHtcbiAgdmFyIG5vZGUgPSBvYmo7XG4gIGlmIChvYmogaW5zdGFuY2VvZiBMTm9kZSkge1xuICAgIGlmIChub2RlID09IG51bGwpIHtcbiAgICAgIHRocm93IFwiTm9kZSBpcyBudWxsIVwiO1xuICAgIH1cbiAgICBpZiAoIShub2RlLm93bmVyICE9IG51bGwgJiYgbm9kZS5vd25lciA9PSB0aGlzKSkge1xuICAgICAgdGhyb3cgXCJPd25lciBncmFwaCBpcyBpbnZhbGlkIVwiO1xuICAgIH1cbiAgICBpZiAodGhpcy5ncmFwaE1hbmFnZXIgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgXCJPd25lciBncmFwaCBtYW5hZ2VyIGlzIGludmFsaWQhXCI7XG4gICAgfVxuICAgIC8vIHJlbW92ZSBpbmNpZGVudCBlZGdlcyBmaXJzdCAobWFrZSBhIGNvcHkgdG8gZG8gaXQgc2FmZWx5KVxuICAgIHZhciBlZGdlc1RvQmVSZW1vdmVkID0gbm9kZS5lZGdlcy5zbGljZSgpO1xuICAgIHZhciBlZGdlO1xuICAgIHZhciBzID0gZWRnZXNUb0JlUmVtb3ZlZC5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzOyBpKyspIHtcbiAgICAgIGVkZ2UgPSBlZGdlc1RvQmVSZW1vdmVkW2ldO1xuXG4gICAgICBpZiAoZWRnZS5pc0ludGVyR3JhcGgpIHtcbiAgICAgICAgdGhpcy5ncmFwaE1hbmFnZXIucmVtb3ZlKGVkZ2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWRnZS5zb3VyY2Uub3duZXIucmVtb3ZlKGVkZ2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIG5vdyB0aGUgbm9kZSBpdHNlbGZcbiAgICB2YXIgaW5kZXggPSB0aGlzLm5vZGVzLmluZGV4T2Yobm9kZSk7XG4gICAgaWYgKGluZGV4ID09IC0xKSB7XG4gICAgICB0aHJvdyBcIk5vZGUgbm90IGluIG93bmVyIG5vZGUgbGlzdCFcIjtcbiAgICB9XG5cbiAgICB0aGlzLm5vZGVzLnNwbGljZShpbmRleCwgMSk7XG4gIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgTEVkZ2UpIHtcbiAgICB2YXIgZWRnZSA9IG9iajtcbiAgICBpZiAoZWRnZSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBcIkVkZ2UgaXMgbnVsbCFcIjtcbiAgICB9XG4gICAgaWYgKCEoZWRnZS5zb3VyY2UgIT0gbnVsbCAmJiBlZGdlLnRhcmdldCAhPSBudWxsKSkge1xuICAgICAgdGhyb3cgXCJTb3VyY2UgYW5kL29yIHRhcmdldCBpcyBudWxsIVwiO1xuICAgIH1cbiAgICBpZiAoIShlZGdlLnNvdXJjZS5vd25lciAhPSBudWxsICYmIGVkZ2UudGFyZ2V0Lm93bmVyICE9IG51bGwgJiYgZWRnZS5zb3VyY2Uub3duZXIgPT0gdGhpcyAmJiBlZGdlLnRhcmdldC5vd25lciA9PSB0aGlzKSkge1xuICAgICAgdGhyb3cgXCJTb3VyY2UgYW5kL29yIHRhcmdldCBvd25lciBpcyBpbnZhbGlkIVwiO1xuICAgIH1cblxuICAgIHZhciBzb3VyY2VJbmRleCA9IGVkZ2Uuc291cmNlLmVkZ2VzLmluZGV4T2YoZWRnZSk7XG4gICAgdmFyIHRhcmdldEluZGV4ID0gZWRnZS50YXJnZXQuZWRnZXMuaW5kZXhPZihlZGdlKTtcbiAgICBpZiAoIShzb3VyY2VJbmRleCA+IC0xICYmIHRhcmdldEluZGV4ID4gLTEpKSB7XG4gICAgICB0aHJvdyBcIlNvdXJjZSBhbmQvb3IgdGFyZ2V0IGRvZXNuJ3Qga25vdyB0aGlzIGVkZ2UhXCI7XG4gICAgfVxuXG4gICAgZWRnZS5zb3VyY2UuZWRnZXMuc3BsaWNlKHNvdXJjZUluZGV4LCAxKTtcblxuICAgIGlmIChlZGdlLnRhcmdldCAhPSBlZGdlLnNvdXJjZSkge1xuICAgICAgZWRnZS50YXJnZXQuZWRnZXMuc3BsaWNlKHRhcmdldEluZGV4LCAxKTtcbiAgICB9XG5cbiAgICB2YXIgaW5kZXggPSBlZGdlLnNvdXJjZS5vd25lci5nZXRFZGdlcygpLmluZGV4T2YoZWRnZSk7XG4gICAgaWYgKGluZGV4ID09IC0xKSB7XG4gICAgICB0aHJvdyBcIk5vdCBpbiBvd25lcidzIGVkZ2UgbGlzdCFcIjtcbiAgICB9XG5cbiAgICBlZGdlLnNvdXJjZS5vd25lci5nZXRFZGdlcygpLnNwbGljZShpbmRleCwgMSk7XG4gIH1cbn07XG5cbkxHcmFwaC5wcm90b3R5cGUudXBkYXRlTGVmdFRvcCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHRvcCA9IEludGVnZXIuTUFYX1ZBTFVFO1xuICB2YXIgbGVmdCA9IEludGVnZXIuTUFYX1ZBTFVFO1xuICB2YXIgbm9kZVRvcDtcbiAgdmFyIG5vZGVMZWZ0O1xuICB2YXIgbWFyZ2luO1xuXG4gIHZhciBub2RlcyA9IHRoaXMuZ2V0Tm9kZXMoKTtcbiAgdmFyIHMgPSBub2Rlcy5sZW5ndGg7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzOyBpKyspIHtcbiAgICB2YXIgbE5vZGUgPSBub2Rlc1tpXTtcbiAgICBub2RlVG9wID0gbE5vZGUuZ2V0VG9wKCk7XG4gICAgbm9kZUxlZnQgPSBsTm9kZS5nZXRMZWZ0KCk7XG5cbiAgICBpZiAodG9wID4gbm9kZVRvcCkge1xuICAgICAgdG9wID0gbm9kZVRvcDtcbiAgICB9XG5cbiAgICBpZiAobGVmdCA+IG5vZGVMZWZ0KSB7XG4gICAgICBsZWZ0ID0gbm9kZUxlZnQ7XG4gICAgfVxuICB9XG5cbiAgLy8gRG8gd2UgaGF2ZSBhbnkgbm9kZXMgaW4gdGhpcyBncmFwaD9cbiAgaWYgKHRvcCA9PSBJbnRlZ2VyLk1BWF9WQUxVRSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKG5vZGVzWzBdLmdldFBhcmVudCgpLnBhZGRpbmdMZWZ0ICE9IHVuZGVmaW5lZCkge1xuICAgIG1hcmdpbiA9IG5vZGVzWzBdLmdldFBhcmVudCgpLnBhZGRpbmdMZWZ0O1xuICB9IGVsc2Uge1xuICAgIG1hcmdpbiA9IHRoaXMubWFyZ2luO1xuICB9XG5cbiAgdGhpcy5sZWZ0ID0gbGVmdCAtIG1hcmdpbjtcbiAgdGhpcy50b3AgPSB0b3AgLSBtYXJnaW47XG5cbiAgLy8gQXBwbHkgdGhlIG1hcmdpbnMgYW5kIHJldHVybiB0aGUgcmVzdWx0XG4gIHJldHVybiBuZXcgUG9pbnQodGhpcy5sZWZ0LCB0aGlzLnRvcCk7XG59O1xuXG5MR3JhcGgucHJvdG90eXBlLnVwZGF0ZUJvdW5kcyA9IGZ1bmN0aW9uIChyZWN1cnNpdmUpIHtcbiAgLy8gY2FsY3VsYXRlIGJvdW5kc1xuICB2YXIgbGVmdCA9IEludGVnZXIuTUFYX1ZBTFVFO1xuICB2YXIgcmlnaHQgPSAtSW50ZWdlci5NQVhfVkFMVUU7XG4gIHZhciB0b3AgPSBJbnRlZ2VyLk1BWF9WQUxVRTtcbiAgdmFyIGJvdHRvbSA9IC1JbnRlZ2VyLk1BWF9WQUxVRTtcbiAgdmFyIG5vZGVMZWZ0O1xuICB2YXIgbm9kZVJpZ2h0O1xuICB2YXIgbm9kZVRvcDtcbiAgdmFyIG5vZGVCb3R0b207XG4gIHZhciBtYXJnaW47XG5cbiAgdmFyIG5vZGVzID0gdGhpcy5ub2RlcztcbiAgdmFyIHMgPSBub2Rlcy5sZW5ndGg7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgczsgaSsrKSB7XG4gICAgdmFyIGxOb2RlID0gbm9kZXNbaV07XG5cbiAgICBpZiAocmVjdXJzaXZlICYmIGxOb2RlLmNoaWxkICE9IG51bGwpIHtcbiAgICAgIGxOb2RlLnVwZGF0ZUJvdW5kcygpO1xuICAgIH1cbiAgICBub2RlTGVmdCA9IGxOb2RlLmdldExlZnQoKTtcbiAgICBub2RlUmlnaHQgPSBsTm9kZS5nZXRSaWdodCgpO1xuICAgIG5vZGVUb3AgPSBsTm9kZS5nZXRUb3AoKTtcbiAgICBub2RlQm90dG9tID0gbE5vZGUuZ2V0Qm90dG9tKCk7XG5cbiAgICBpZiAobGVmdCA+IG5vZGVMZWZ0KSB7XG4gICAgICBsZWZ0ID0gbm9kZUxlZnQ7XG4gICAgfVxuXG4gICAgaWYgKHJpZ2h0IDwgbm9kZVJpZ2h0KSB7XG4gICAgICByaWdodCA9IG5vZGVSaWdodDtcbiAgICB9XG5cbiAgICBpZiAodG9wID4gbm9kZVRvcCkge1xuICAgICAgdG9wID0gbm9kZVRvcDtcbiAgICB9XG5cbiAgICBpZiAoYm90dG9tIDwgbm9kZUJvdHRvbSkge1xuICAgICAgYm90dG9tID0gbm9kZUJvdHRvbTtcbiAgICB9XG4gIH1cblxuICB2YXIgYm91bmRpbmdSZWN0ID0gbmV3IFJlY3RhbmdsZUQobGVmdCwgdG9wLCByaWdodCAtIGxlZnQsIGJvdHRvbSAtIHRvcCk7XG4gIGlmIChsZWZ0ID09IEludGVnZXIuTUFYX1ZBTFVFKSB7XG4gICAgdGhpcy5sZWZ0ID0gdGhpcy5wYXJlbnQuZ2V0TGVmdCgpO1xuICAgIHRoaXMucmlnaHQgPSB0aGlzLnBhcmVudC5nZXRSaWdodCgpO1xuICAgIHRoaXMudG9wID0gdGhpcy5wYXJlbnQuZ2V0VG9wKCk7XG4gICAgdGhpcy5ib3R0b20gPSB0aGlzLnBhcmVudC5nZXRCb3R0b20oKTtcbiAgfVxuXG4gIGlmIChub2Rlc1swXS5nZXRQYXJlbnQoKS5wYWRkaW5nTGVmdCAhPSB1bmRlZmluZWQpIHtcbiAgICBtYXJnaW4gPSBub2Rlc1swXS5nZXRQYXJlbnQoKS5wYWRkaW5nTGVmdDtcbiAgfSBlbHNlIHtcbiAgICBtYXJnaW4gPSB0aGlzLm1hcmdpbjtcbiAgfVxuXG4gIHRoaXMubGVmdCA9IGJvdW5kaW5nUmVjdC54IC0gbWFyZ2luO1xuICB0aGlzLnJpZ2h0ID0gYm91bmRpbmdSZWN0LnggKyBib3VuZGluZ1JlY3Qud2lkdGggKyBtYXJnaW47XG4gIHRoaXMudG9wID0gYm91bmRpbmdSZWN0LnkgLSBtYXJnaW47XG4gIHRoaXMuYm90dG9tID0gYm91bmRpbmdSZWN0LnkgKyBib3VuZGluZ1JlY3QuaGVpZ2h0ICsgbWFyZ2luO1xufTtcblxuTEdyYXBoLmNhbGN1bGF0ZUJvdW5kcyA9IGZ1bmN0aW9uIChub2Rlcykge1xuICB2YXIgbGVmdCA9IEludGVnZXIuTUFYX1ZBTFVFO1xuICB2YXIgcmlnaHQgPSAtSW50ZWdlci5NQVhfVkFMVUU7XG4gIHZhciB0b3AgPSBJbnRlZ2VyLk1BWF9WQUxVRTtcbiAgdmFyIGJvdHRvbSA9IC1JbnRlZ2VyLk1BWF9WQUxVRTtcbiAgdmFyIG5vZGVMZWZ0O1xuICB2YXIgbm9kZVJpZ2h0O1xuICB2YXIgbm9kZVRvcDtcbiAgdmFyIG5vZGVCb3R0b207XG5cbiAgdmFyIHMgPSBub2Rlcy5sZW5ndGg7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzOyBpKyspIHtcbiAgICB2YXIgbE5vZGUgPSBub2Rlc1tpXTtcbiAgICBub2RlTGVmdCA9IGxOb2RlLmdldExlZnQoKTtcbiAgICBub2RlUmlnaHQgPSBsTm9kZS5nZXRSaWdodCgpO1xuICAgIG5vZGVUb3AgPSBsTm9kZS5nZXRUb3AoKTtcbiAgICBub2RlQm90dG9tID0gbE5vZGUuZ2V0Qm90dG9tKCk7XG5cbiAgICBpZiAobGVmdCA+IG5vZGVMZWZ0KSB7XG4gICAgICBsZWZ0ID0gbm9kZUxlZnQ7XG4gICAgfVxuXG4gICAgaWYgKHJpZ2h0IDwgbm9kZVJpZ2h0KSB7XG4gICAgICByaWdodCA9IG5vZGVSaWdodDtcbiAgICB9XG5cbiAgICBpZiAodG9wID4gbm9kZVRvcCkge1xuICAgICAgdG9wID0gbm9kZVRvcDtcbiAgICB9XG5cbiAgICBpZiAoYm90dG9tIDwgbm9kZUJvdHRvbSkge1xuICAgICAgYm90dG9tID0gbm9kZUJvdHRvbTtcbiAgICB9XG4gIH1cblxuICB2YXIgYm91bmRpbmdSZWN0ID0gbmV3IFJlY3RhbmdsZUQobGVmdCwgdG9wLCByaWdodCAtIGxlZnQsIGJvdHRvbSAtIHRvcCk7XG5cbiAgcmV0dXJuIGJvdW5kaW5nUmVjdDtcbn07XG5cbkxHcmFwaC5wcm90b3R5cGUuZ2V0SW5jbHVzaW9uVHJlZURlcHRoID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcyA9PSB0aGlzLmdyYXBoTWFuYWdlci5nZXRSb290KCkpIHtcbiAgICByZXR1cm4gMTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnQuZ2V0SW5jbHVzaW9uVHJlZURlcHRoKCk7XG4gIH1cbn07XG5cbkxHcmFwaC5wcm90b3R5cGUuZ2V0RXN0aW1hdGVkU2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuZXN0aW1hdGVkU2l6ZSA9PSBJbnRlZ2VyLk1JTl9WQUxVRSkge1xuICAgIHRocm93IFwiYXNzZXJ0IGZhaWxlZFwiO1xuICB9XG4gIHJldHVybiB0aGlzLmVzdGltYXRlZFNpemU7XG59O1xuXG5MR3JhcGgucHJvdG90eXBlLmNhbGNFc3RpbWF0ZWRTaXplID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2l6ZSA9IDA7XG4gIHZhciBub2RlcyA9IHRoaXMubm9kZXM7XG4gIHZhciBzID0gbm9kZXMubGVuZ3RoO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgczsgaSsrKSB7XG4gICAgdmFyIGxOb2RlID0gbm9kZXNbaV07XG4gICAgc2l6ZSArPSBsTm9kZS5jYWxjRXN0aW1hdGVkU2l6ZSgpO1xuICB9XG5cbiAgaWYgKHNpemUgPT0gMCkge1xuICAgIHRoaXMuZXN0aW1hdGVkU2l6ZSA9IExheW91dENvbnN0YW50cy5FTVBUWV9DT01QT1VORF9OT0RFX1NJWkU7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5lc3RpbWF0ZWRTaXplID0gc2l6ZSAvIE1hdGguc3FydCh0aGlzLm5vZGVzLmxlbmd0aCk7XG4gIH1cblxuICByZXR1cm4gdGhpcy5lc3RpbWF0ZWRTaXplO1xufTtcblxuTEdyYXBoLnByb3RvdHlwZS51cGRhdGVDb25uZWN0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgaWYgKHRoaXMubm9kZXMubGVuZ3RoID09IDApIHtcbiAgICB0aGlzLmlzQ29ubmVjdGVkID0gdHJ1ZTtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgcXVldWUgPSBuZXcgTGlua2VkTGlzdCgpO1xuICB2YXIgdmlzaXRlZCA9IG5ldyBTZXQoKTtcbiAgdmFyIGN1cnJlbnROb2RlID0gdGhpcy5ub2Rlc1swXTtcbiAgdmFyIG5laWdoYm9yRWRnZXM7XG4gIHZhciBjdXJyZW50TmVpZ2hib3I7XG4gIHZhciBjaGlsZHJlbk9mTm9kZSA9IGN1cnJlbnROb2RlLndpdGhDaGlsZHJlbigpO1xuICBjaGlsZHJlbk9mTm9kZS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgcXVldWUucHVzaChub2RlKTtcbiAgICB2aXNpdGVkLmFkZChub2RlKTtcbiAgfSk7XG5cbiAgd2hpbGUgKHF1ZXVlLmxlbmd0aCAhPT0gMCkge1xuICAgIGN1cnJlbnROb2RlID0gcXVldWUuc2hpZnQoKTtcblxuICAgIC8vIFRyYXZlcnNlIGFsbCBuZWlnaGJvcnMgb2YgdGhpcyBub2RlXG4gICAgbmVpZ2hib3JFZGdlcyA9IGN1cnJlbnROb2RlLmdldEVkZ2VzKCk7XG4gICAgdmFyIHNpemUgPSBuZWlnaGJvckVkZ2VzLmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7IGkrKykge1xuICAgICAgdmFyIG5laWdoYm9yRWRnZSA9IG5laWdoYm9yRWRnZXNbaV07XG4gICAgICBjdXJyZW50TmVpZ2hib3IgPSBuZWlnaGJvckVkZ2UuZ2V0T3RoZXJFbmRJbkdyYXBoKGN1cnJlbnROb2RlLCB0aGlzKTtcblxuICAgICAgLy8gQWRkIHVudmlzaXRlZCBuZWlnaGJvcnMgdG8gdGhlIGxpc3QgdG8gdmlzaXRcbiAgICAgIGlmIChjdXJyZW50TmVpZ2hib3IgIT0gbnVsbCAmJiAhdmlzaXRlZC5oYXMoY3VycmVudE5laWdoYm9yKSkge1xuICAgICAgICB2YXIgY2hpbGRyZW5PZk5laWdoYm9yID0gY3VycmVudE5laWdoYm9yLndpdGhDaGlsZHJlbigpO1xuXG4gICAgICAgIGNoaWxkcmVuT2ZOZWlnaGJvci5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgcXVldWUucHVzaChub2RlKTtcbiAgICAgICAgICB2aXNpdGVkLmFkZChub2RlKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdGhpcy5pc0Nvbm5lY3RlZCA9IGZhbHNlO1xuXG4gIGlmICh2aXNpdGVkLnNpemUgPj0gdGhpcy5ub2Rlcy5sZW5ndGgpIHtcbiAgICB2YXIgbm9PZlZpc2l0ZWRJblRoaXNHcmFwaCA9IDA7XG5cbiAgICB2aXNpdGVkLmZvckVhY2goZnVuY3Rpb24gKHZpc2l0ZWROb2RlKSB7XG4gICAgICBpZiAodmlzaXRlZE5vZGUub3duZXIgPT0gc2VsZikge1xuICAgICAgICBub09mVmlzaXRlZEluVGhpc0dyYXBoKys7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAobm9PZlZpc2l0ZWRJblRoaXNHcmFwaCA9PSB0aGlzLm5vZGVzLmxlbmd0aCkge1xuICAgICAgdGhpcy5pc0Nvbm5lY3RlZCA9IHRydWU7XG4gICAgfVxuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IExHcmFwaDtcblxuLyoqKi8gfSksXG4vKiA3ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBMR3JhcGg7XG52YXIgTEVkZ2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuXG5mdW5jdGlvbiBMR3JhcGhNYW5hZ2VyKGxheW91dCkge1xuICBMR3JhcGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpOyAvLyBJdCBtYXkgYmUgYmV0dGVyIHRvIGluaXRpbGl6ZSB0aGlzIG91dCBvZiB0aGlzIGZ1bmN0aW9uIGJ1dCBpdCBnaXZlcyBhbiBlcnJvciAoUmlnaHQtaGFuZCBzaWRlIG9mICdpbnN0YW5jZW9mJyBpcyBub3QgY2FsbGFibGUpIG5vdy5cbiAgdGhpcy5sYXlvdXQgPSBsYXlvdXQ7XG5cbiAgdGhpcy5ncmFwaHMgPSBbXTtcbiAgdGhpcy5lZGdlcyA9IFtdO1xufVxuXG5MR3JhcGhNYW5hZ2VyLnByb3RvdHlwZS5hZGRSb290ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbmdyYXBoID0gdGhpcy5sYXlvdXQubmV3R3JhcGgoKTtcbiAgdmFyIG5ub2RlID0gdGhpcy5sYXlvdXQubmV3Tm9kZShudWxsKTtcbiAgdmFyIHJvb3QgPSB0aGlzLmFkZChuZ3JhcGgsIG5ub2RlKTtcbiAgdGhpcy5zZXRSb290R3JhcGgocm9vdCk7XG4gIHJldHVybiB0aGlzLnJvb3RHcmFwaDtcbn07XG5cbkxHcmFwaE1hbmFnZXIucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChuZXdHcmFwaCwgcGFyZW50Tm9kZSwgbmV3RWRnZSwgc291cmNlTm9kZSwgdGFyZ2V0Tm9kZSkge1xuICAvL3RoZXJlIGFyZSBqdXN0IDIgcGFyYW1ldGVycyBhcmUgcGFzc2VkIHRoZW4gaXQgYWRkcyBhbiBMR3JhcGggZWxzZSBpdCBhZGRzIGFuIExFZGdlXG4gIGlmIChuZXdFZGdlID09IG51bGwgJiYgc291cmNlTm9kZSA9PSBudWxsICYmIHRhcmdldE5vZGUgPT0gbnVsbCkge1xuICAgIGlmIChuZXdHcmFwaCA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBcIkdyYXBoIGlzIG51bGwhXCI7XG4gICAgfVxuICAgIGlmIChwYXJlbnROb2RlID09IG51bGwpIHtcbiAgICAgIHRocm93IFwiUGFyZW50IG5vZGUgaXMgbnVsbCFcIjtcbiAgICB9XG4gICAgaWYgKHRoaXMuZ3JhcGhzLmluZGV4T2YobmV3R3JhcGgpID4gLTEpIHtcbiAgICAgIHRocm93IFwiR3JhcGggYWxyZWFkeSBpbiB0aGlzIGdyYXBoIG1nciFcIjtcbiAgICB9XG5cbiAgICB0aGlzLmdyYXBocy5wdXNoKG5ld0dyYXBoKTtcblxuICAgIGlmIChuZXdHcmFwaC5wYXJlbnQgIT0gbnVsbCkge1xuICAgICAgdGhyb3cgXCJBbHJlYWR5IGhhcyBhIHBhcmVudCFcIjtcbiAgICB9XG4gICAgaWYgKHBhcmVudE5vZGUuY2hpbGQgIT0gbnVsbCkge1xuICAgICAgdGhyb3cgXCJBbHJlYWR5IGhhcyBhIGNoaWxkIVwiO1xuICAgIH1cblxuICAgIG5ld0dyYXBoLnBhcmVudCA9IHBhcmVudE5vZGU7XG4gICAgcGFyZW50Tm9kZS5jaGlsZCA9IG5ld0dyYXBoO1xuXG4gICAgcmV0dXJuIG5ld0dyYXBoO1xuICB9IGVsc2Uge1xuICAgIC8vY2hhbmdlIHRoZSBvcmRlciBvZiB0aGUgcGFyYW1ldGVyc1xuICAgIHRhcmdldE5vZGUgPSBuZXdFZGdlO1xuICAgIHNvdXJjZU5vZGUgPSBwYXJlbnROb2RlO1xuICAgIG5ld0VkZ2UgPSBuZXdHcmFwaDtcbiAgICB2YXIgc291cmNlR3JhcGggPSBzb3VyY2VOb2RlLmdldE93bmVyKCk7XG4gICAgdmFyIHRhcmdldEdyYXBoID0gdGFyZ2V0Tm9kZS5nZXRPd25lcigpO1xuXG4gICAgaWYgKCEoc291cmNlR3JhcGggIT0gbnVsbCAmJiBzb3VyY2VHcmFwaC5nZXRHcmFwaE1hbmFnZXIoKSA9PSB0aGlzKSkge1xuICAgICAgdGhyb3cgXCJTb3VyY2Ugbm90IGluIHRoaXMgZ3JhcGggbWdyIVwiO1xuICAgIH1cbiAgICBpZiAoISh0YXJnZXRHcmFwaCAhPSBudWxsICYmIHRhcmdldEdyYXBoLmdldEdyYXBoTWFuYWdlcigpID09IHRoaXMpKSB7XG4gICAgICB0aHJvdyBcIlRhcmdldCBub3QgaW4gdGhpcyBncmFwaCBtZ3IhXCI7XG4gICAgfVxuXG4gICAgaWYgKHNvdXJjZUdyYXBoID09IHRhcmdldEdyYXBoKSB7XG4gICAgICBuZXdFZGdlLmlzSW50ZXJHcmFwaCA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHNvdXJjZUdyYXBoLmFkZChuZXdFZGdlLCBzb3VyY2VOb2RlLCB0YXJnZXROb2RlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3RWRnZS5pc0ludGVyR3JhcGggPSB0cnVlO1xuXG4gICAgICAvLyBzZXQgc291cmNlIGFuZCB0YXJnZXRcbiAgICAgIG5ld0VkZ2Uuc291cmNlID0gc291cmNlTm9kZTtcbiAgICAgIG5ld0VkZ2UudGFyZ2V0ID0gdGFyZ2V0Tm9kZTtcblxuICAgICAgLy8gYWRkIGVkZ2UgdG8gaW50ZXItZ3JhcGggZWRnZSBsaXN0XG4gICAgICBpZiAodGhpcy5lZGdlcy5pbmRleE9mKG5ld0VkZ2UpID4gLTEpIHtcbiAgICAgICAgdGhyb3cgXCJFZGdlIGFscmVhZHkgaW4gaW50ZXItZ3JhcGggZWRnZSBsaXN0IVwiO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmVkZ2VzLnB1c2gobmV3RWRnZSk7XG5cbiAgICAgIC8vIGFkZCBlZGdlIHRvIHNvdXJjZSBhbmQgdGFyZ2V0IGluY2lkZW5jeSBsaXN0c1xuICAgICAgaWYgKCEobmV3RWRnZS5zb3VyY2UgIT0gbnVsbCAmJiBuZXdFZGdlLnRhcmdldCAhPSBudWxsKSkge1xuICAgICAgICB0aHJvdyBcIkVkZ2Ugc291cmNlIGFuZC9vciB0YXJnZXQgaXMgbnVsbCFcIjtcbiAgICAgIH1cblxuICAgICAgaWYgKCEobmV3RWRnZS5zb3VyY2UuZWRnZXMuaW5kZXhPZihuZXdFZGdlKSA9PSAtMSAmJiBuZXdFZGdlLnRhcmdldC5lZGdlcy5pbmRleE9mKG5ld0VkZ2UpID09IC0xKSkge1xuICAgICAgICB0aHJvdyBcIkVkZ2UgYWxyZWFkeSBpbiBzb3VyY2UgYW5kL29yIHRhcmdldCBpbmNpZGVuY3kgbGlzdCFcIjtcbiAgICAgIH1cblxuICAgICAgbmV3RWRnZS5zb3VyY2UuZWRnZXMucHVzaChuZXdFZGdlKTtcbiAgICAgIG5ld0VkZ2UudGFyZ2V0LmVkZ2VzLnB1c2gobmV3RWRnZSk7XG5cbiAgICAgIHJldHVybiBuZXdFZGdlO1xuICAgIH1cbiAgfVxufTtcblxuTEdyYXBoTWFuYWdlci5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKGxPYmopIHtcbiAgaWYgKGxPYmogaW5zdGFuY2VvZiBMR3JhcGgpIHtcbiAgICB2YXIgZ3JhcGggPSBsT2JqO1xuICAgIGlmIChncmFwaC5nZXRHcmFwaE1hbmFnZXIoKSAhPSB0aGlzKSB7XG4gICAgICB0aHJvdyBcIkdyYXBoIG5vdCBpbiB0aGlzIGdyYXBoIG1nclwiO1xuICAgIH1cbiAgICBpZiAoIShncmFwaCA9PSB0aGlzLnJvb3RHcmFwaCB8fCBncmFwaC5wYXJlbnQgIT0gbnVsbCAmJiBncmFwaC5wYXJlbnQuZ3JhcGhNYW5hZ2VyID09IHRoaXMpKSB7XG4gICAgICB0aHJvdyBcIkludmFsaWQgcGFyZW50IG5vZGUhXCI7XG4gICAgfVxuXG4gICAgLy8gZmlyc3QgdGhlIGVkZ2VzIChtYWtlIGEgY29weSB0byBkbyBpdCBzYWZlbHkpXG4gICAgdmFyIGVkZ2VzVG9CZVJlbW92ZWQgPSBbXTtcblxuICAgIGVkZ2VzVG9CZVJlbW92ZWQgPSBlZGdlc1RvQmVSZW1vdmVkLmNvbmNhdChncmFwaC5nZXRFZGdlcygpKTtcblxuICAgIHZhciBlZGdlO1xuICAgIHZhciBzID0gZWRnZXNUb0JlUmVtb3ZlZC5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzOyBpKyspIHtcbiAgICAgIGVkZ2UgPSBlZGdlc1RvQmVSZW1vdmVkW2ldO1xuICAgICAgZ3JhcGgucmVtb3ZlKGVkZ2UpO1xuICAgIH1cblxuICAgIC8vIHRoZW4gdGhlIG5vZGVzIChtYWtlIGEgY29weSB0byBkbyBpdCBzYWZlbHkpXG4gICAgdmFyIG5vZGVzVG9CZVJlbW92ZWQgPSBbXTtcblxuICAgIG5vZGVzVG9CZVJlbW92ZWQgPSBub2Rlc1RvQmVSZW1vdmVkLmNvbmNhdChncmFwaC5nZXROb2RlcygpKTtcblxuICAgIHZhciBub2RlO1xuICAgIHMgPSBub2Rlc1RvQmVSZW1vdmVkLmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHM7IGkrKykge1xuICAgICAgbm9kZSA9IG5vZGVzVG9CZVJlbW92ZWRbaV07XG4gICAgICBncmFwaC5yZW1vdmUobm9kZSk7XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgaWYgZ3JhcGggaXMgdGhlIHJvb3RcbiAgICBpZiAoZ3JhcGggPT0gdGhpcy5yb290R3JhcGgpIHtcbiAgICAgIHRoaXMuc2V0Um9vdEdyYXBoKG51bGwpO1xuICAgIH1cblxuICAgIC8vIG5vdyByZW1vdmUgdGhlIGdyYXBoIGl0c2VsZlxuICAgIHZhciBpbmRleCA9IHRoaXMuZ3JhcGhzLmluZGV4T2YoZ3JhcGgpO1xuICAgIHRoaXMuZ3JhcGhzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAvLyBhbHNvIHJlc2V0IHRoZSBwYXJlbnQgb2YgdGhlIGdyYXBoXG4gICAgZ3JhcGgucGFyZW50ID0gbnVsbDtcbiAgfSBlbHNlIGlmIChsT2JqIGluc3RhbmNlb2YgTEVkZ2UpIHtcbiAgICBlZGdlID0gbE9iajtcbiAgICBpZiAoZWRnZSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBcIkVkZ2UgaXMgbnVsbCFcIjtcbiAgICB9XG4gICAgaWYgKCFlZGdlLmlzSW50ZXJHcmFwaCkge1xuICAgICAgdGhyb3cgXCJOb3QgYW4gaW50ZXItZ3JhcGggZWRnZSFcIjtcbiAgICB9XG4gICAgaWYgKCEoZWRnZS5zb3VyY2UgIT0gbnVsbCAmJiBlZGdlLnRhcmdldCAhPSBudWxsKSkge1xuICAgICAgdGhyb3cgXCJTb3VyY2UgYW5kL29yIHRhcmdldCBpcyBudWxsIVwiO1xuICAgIH1cblxuICAgIC8vIHJlbW92ZSBlZGdlIGZyb20gc291cmNlIGFuZCB0YXJnZXQgbm9kZXMnIGluY2lkZW5jeSBsaXN0c1xuXG4gICAgaWYgKCEoZWRnZS5zb3VyY2UuZWRnZXMuaW5kZXhPZihlZGdlKSAhPSAtMSAmJiBlZGdlLnRhcmdldC5lZGdlcy5pbmRleE9mKGVkZ2UpICE9IC0xKSkge1xuICAgICAgdGhyb3cgXCJTb3VyY2UgYW5kL29yIHRhcmdldCBkb2Vzbid0IGtub3cgdGhpcyBlZGdlIVwiO1xuICAgIH1cblxuICAgIHZhciBpbmRleCA9IGVkZ2Uuc291cmNlLmVkZ2VzLmluZGV4T2YoZWRnZSk7XG4gICAgZWRnZS5zb3VyY2UuZWRnZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICBpbmRleCA9IGVkZ2UudGFyZ2V0LmVkZ2VzLmluZGV4T2YoZWRnZSk7XG4gICAgZWRnZS50YXJnZXQuZWRnZXMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgIC8vIHJlbW92ZSBlZGdlIGZyb20gb3duZXIgZ3JhcGggbWFuYWdlcidzIGludGVyLWdyYXBoIGVkZ2UgbGlzdFxuXG4gICAgaWYgKCEoZWRnZS5zb3VyY2Uub3duZXIgIT0gbnVsbCAmJiBlZGdlLnNvdXJjZS5vd25lci5nZXRHcmFwaE1hbmFnZXIoKSAhPSBudWxsKSkge1xuICAgICAgdGhyb3cgXCJFZGdlIG93bmVyIGdyYXBoIG9yIG93bmVyIGdyYXBoIG1hbmFnZXIgaXMgbnVsbCFcIjtcbiAgICB9XG4gICAgaWYgKGVkZ2Uuc291cmNlLm93bmVyLmdldEdyYXBoTWFuYWdlcigpLmVkZ2VzLmluZGV4T2YoZWRnZSkgPT0gLTEpIHtcbiAgICAgIHRocm93IFwiTm90IGluIG93bmVyIGdyYXBoIG1hbmFnZXIncyBlZGdlIGxpc3QhXCI7XG4gICAgfVxuXG4gICAgdmFyIGluZGV4ID0gZWRnZS5zb3VyY2Uub3duZXIuZ2V0R3JhcGhNYW5hZ2VyKCkuZWRnZXMuaW5kZXhPZihlZGdlKTtcbiAgICBlZGdlLnNvdXJjZS5vd25lci5nZXRHcmFwaE1hbmFnZXIoKS5lZGdlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICB9XG59O1xuXG5MR3JhcGhNYW5hZ2VyLnByb3RvdHlwZS51cGRhdGVCb3VuZHMgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMucm9vdEdyYXBoLnVwZGF0ZUJvdW5kcyh0cnVlKTtcbn07XG5cbkxHcmFwaE1hbmFnZXIucHJvdG90eXBlLmdldEdyYXBocyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuZ3JhcGhzO1xufTtcblxuTEdyYXBoTWFuYWdlci5wcm90b3R5cGUuZ2V0QWxsTm9kZXMgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLmFsbE5vZGVzID09IG51bGwpIHtcbiAgICB2YXIgbm9kZUxpc3QgPSBbXTtcbiAgICB2YXIgZ3JhcGhzID0gdGhpcy5nZXRHcmFwaHMoKTtcbiAgICB2YXIgcyA9IGdyYXBocy5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzOyBpKyspIHtcbiAgICAgIG5vZGVMaXN0ID0gbm9kZUxpc3QuY29uY2F0KGdyYXBoc1tpXS5nZXROb2RlcygpKTtcbiAgICB9XG4gICAgdGhpcy5hbGxOb2RlcyA9IG5vZGVMaXN0O1xuICB9XG4gIHJldHVybiB0aGlzLmFsbE5vZGVzO1xufTtcblxuTEdyYXBoTWFuYWdlci5wcm90b3R5cGUucmVzZXRBbGxOb2RlcyA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5hbGxOb2RlcyA9IG51bGw7XG59O1xuXG5MR3JhcGhNYW5hZ2VyLnByb3RvdHlwZS5yZXNldEFsbEVkZ2VzID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmFsbEVkZ2VzID0gbnVsbDtcbn07XG5cbkxHcmFwaE1hbmFnZXIucHJvdG90eXBlLnJlc2V0QWxsTm9kZXNUb0FwcGx5R3Jhdml0YXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuYWxsTm9kZXNUb0FwcGx5R3Jhdml0YXRpb24gPSBudWxsO1xufTtcblxuTEdyYXBoTWFuYWdlci5wcm90b3R5cGUuZ2V0QWxsRWRnZXMgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLmFsbEVkZ2VzID09IG51bGwpIHtcbiAgICB2YXIgZWRnZUxpc3QgPSBbXTtcbiAgICB2YXIgZ3JhcGhzID0gdGhpcy5nZXRHcmFwaHMoKTtcbiAgICB2YXIgcyA9IGdyYXBocy5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBncmFwaHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGVkZ2VMaXN0ID0gZWRnZUxpc3QuY29uY2F0KGdyYXBoc1tpXS5nZXRFZGdlcygpKTtcbiAgICB9XG5cbiAgICBlZGdlTGlzdCA9IGVkZ2VMaXN0LmNvbmNhdCh0aGlzLmVkZ2VzKTtcblxuICAgIHRoaXMuYWxsRWRnZXMgPSBlZGdlTGlzdDtcbiAgfVxuICByZXR1cm4gdGhpcy5hbGxFZGdlcztcbn07XG5cbkxHcmFwaE1hbmFnZXIucHJvdG90eXBlLmdldEFsbE5vZGVzVG9BcHBseUdyYXZpdGF0aW9uID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5hbGxOb2Rlc1RvQXBwbHlHcmF2aXRhdGlvbjtcbn07XG5cbkxHcmFwaE1hbmFnZXIucHJvdG90eXBlLnNldEFsbE5vZGVzVG9BcHBseUdyYXZpdGF0aW9uID0gZnVuY3Rpb24gKG5vZGVMaXN0KSB7XG4gIGlmICh0aGlzLmFsbE5vZGVzVG9BcHBseUdyYXZpdGF0aW9uICE9IG51bGwpIHtcbiAgICB0aHJvdyBcImFzc2VydCBmYWlsZWRcIjtcbiAgfVxuXG4gIHRoaXMuYWxsTm9kZXNUb0FwcGx5R3Jhdml0YXRpb24gPSBub2RlTGlzdDtcbn07XG5cbkxHcmFwaE1hbmFnZXIucHJvdG90eXBlLmdldFJvb3QgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnJvb3RHcmFwaDtcbn07XG5cbkxHcmFwaE1hbmFnZXIucHJvdG90eXBlLnNldFJvb3RHcmFwaCA9IGZ1bmN0aW9uIChncmFwaCkge1xuICBpZiAoZ3JhcGguZ2V0R3JhcGhNYW5hZ2VyKCkgIT0gdGhpcykge1xuICAgIHRocm93IFwiUm9vdCBub3QgaW4gdGhpcyBncmFwaCBtZ3IhXCI7XG4gIH1cblxuICB0aGlzLnJvb3RHcmFwaCA9IGdyYXBoO1xuICAvLyByb290IGdyYXBoIG11c3QgaGF2ZSBhIHJvb3Qgbm9kZSBhc3NvY2lhdGVkIHdpdGggaXQgZm9yIGNvbnZlbmllbmNlXG4gIGlmIChncmFwaC5wYXJlbnQgPT0gbnVsbCkge1xuICAgIGdyYXBoLnBhcmVudCA9IHRoaXMubGF5b3V0Lm5ld05vZGUoXCJSb290IG5vZGVcIik7XG4gIH1cbn07XG5cbkxHcmFwaE1hbmFnZXIucHJvdG90eXBlLmdldExheW91dCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubGF5b3V0O1xufTtcblxuTEdyYXBoTWFuYWdlci5wcm90b3R5cGUuaXNPbmVBbmNlc3Rvck9mT3RoZXIgPSBmdW5jdGlvbiAoZmlyc3ROb2RlLCBzZWNvbmROb2RlKSB7XG4gIGlmICghKGZpcnN0Tm9kZSAhPSBudWxsICYmIHNlY29uZE5vZGUgIT0gbnVsbCkpIHtcbiAgICB0aHJvdyBcImFzc2VydCBmYWlsZWRcIjtcbiAgfVxuXG4gIGlmIChmaXJzdE5vZGUgPT0gc2Vjb25kTm9kZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8vIElzIHNlY29uZCBub2RlIGFuIGFuY2VzdG9yIG9mIHRoZSBmaXJzdCBvbmU/XG4gIHZhciBvd25lckdyYXBoID0gZmlyc3ROb2RlLmdldE93bmVyKCk7XG4gIHZhciBwYXJlbnROb2RlO1xuXG4gIGRvIHtcbiAgICBwYXJlbnROb2RlID0gb3duZXJHcmFwaC5nZXRQYXJlbnQoKTtcblxuICAgIGlmIChwYXJlbnROb2RlID09IG51bGwpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChwYXJlbnROb2RlID09IHNlY29uZE5vZGUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIG93bmVyR3JhcGggPSBwYXJlbnROb2RlLmdldE93bmVyKCk7XG4gICAgaWYgKG93bmVyR3JhcGggPT0gbnVsbCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9IHdoaWxlICh0cnVlKTtcbiAgLy8gSXMgZmlyc3Qgbm9kZSBhbiBhbmNlc3RvciBvZiB0aGUgc2Vjb25kIG9uZT9cbiAgb3duZXJHcmFwaCA9IHNlY29uZE5vZGUuZ2V0T3duZXIoKTtcblxuICBkbyB7XG4gICAgcGFyZW50Tm9kZSA9IG93bmVyR3JhcGguZ2V0UGFyZW50KCk7XG5cbiAgICBpZiAocGFyZW50Tm9kZSA9PSBudWxsKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAocGFyZW50Tm9kZSA9PSBmaXJzdE5vZGUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIG93bmVyR3JhcGggPSBwYXJlbnROb2RlLmdldE93bmVyKCk7XG4gICAgaWYgKG93bmVyR3JhcGggPT0gbnVsbCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9IHdoaWxlICh0cnVlKTtcblxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5MR3JhcGhNYW5hZ2VyLnByb3RvdHlwZS5jYWxjTG93ZXN0Q29tbW9uQW5jZXN0b3JzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZWRnZTtcbiAgdmFyIHNvdXJjZU5vZGU7XG4gIHZhciB0YXJnZXROb2RlO1xuICB2YXIgc291cmNlQW5jZXN0b3JHcmFwaDtcbiAgdmFyIHRhcmdldEFuY2VzdG9yR3JhcGg7XG5cbiAgdmFyIGVkZ2VzID0gdGhpcy5nZXRBbGxFZGdlcygpO1xuICB2YXIgcyA9IGVkZ2VzLmxlbmd0aDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzOyBpKyspIHtcbiAgICBlZGdlID0gZWRnZXNbaV07XG5cbiAgICBzb3VyY2VOb2RlID0gZWRnZS5zb3VyY2U7XG4gICAgdGFyZ2V0Tm9kZSA9IGVkZ2UudGFyZ2V0O1xuICAgIGVkZ2UubGNhID0gbnVsbDtcbiAgICBlZGdlLnNvdXJjZUluTGNhID0gc291cmNlTm9kZTtcbiAgICBlZGdlLnRhcmdldEluTGNhID0gdGFyZ2V0Tm9kZTtcblxuICAgIGlmIChzb3VyY2VOb2RlID09IHRhcmdldE5vZGUpIHtcbiAgICAgIGVkZ2UubGNhID0gc291cmNlTm9kZS5nZXRPd25lcigpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgc291cmNlQW5jZXN0b3JHcmFwaCA9IHNvdXJjZU5vZGUuZ2V0T3duZXIoKTtcblxuICAgIHdoaWxlIChlZGdlLmxjYSA9PSBudWxsKSB7XG4gICAgICBlZGdlLnRhcmdldEluTGNhID0gdGFyZ2V0Tm9kZTtcbiAgICAgIHRhcmdldEFuY2VzdG9yR3JhcGggPSB0YXJnZXROb2RlLmdldE93bmVyKCk7XG5cbiAgICAgIHdoaWxlIChlZGdlLmxjYSA9PSBudWxsKSB7XG4gICAgICAgIGlmICh0YXJnZXRBbmNlc3RvckdyYXBoID09IHNvdXJjZUFuY2VzdG9yR3JhcGgpIHtcbiAgICAgICAgICBlZGdlLmxjYSA9IHRhcmdldEFuY2VzdG9yR3JhcGg7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFyZ2V0QW5jZXN0b3JHcmFwaCA9PSB0aGlzLnJvb3RHcmFwaCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVkZ2UubGNhICE9IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBcImFzc2VydCBmYWlsZWRcIjtcbiAgICAgICAgfVxuICAgICAgICBlZGdlLnRhcmdldEluTGNhID0gdGFyZ2V0QW5jZXN0b3JHcmFwaC5nZXRQYXJlbnQoKTtcbiAgICAgICAgdGFyZ2V0QW5jZXN0b3JHcmFwaCA9IGVkZ2UudGFyZ2V0SW5MY2EuZ2V0T3duZXIoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNvdXJjZUFuY2VzdG9yR3JhcGggPT0gdGhpcy5yb290R3JhcGgpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmIChlZGdlLmxjYSA9PSBudWxsKSB7XG4gICAgICAgIGVkZ2Uuc291cmNlSW5MY2EgPSBzb3VyY2VBbmNlc3RvckdyYXBoLmdldFBhcmVudCgpO1xuICAgICAgICBzb3VyY2VBbmNlc3RvckdyYXBoID0gZWRnZS5zb3VyY2VJbkxjYS5nZXRPd25lcigpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlZGdlLmxjYSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBcImFzc2VydCBmYWlsZWRcIjtcbiAgICB9XG4gIH1cbn07XG5cbkxHcmFwaE1hbmFnZXIucHJvdG90eXBlLmNhbGNMb3dlc3RDb21tb25BbmNlc3RvciA9IGZ1bmN0aW9uIChmaXJzdE5vZGUsIHNlY29uZE5vZGUpIHtcbiAgaWYgKGZpcnN0Tm9kZSA9PSBzZWNvbmROb2RlKSB7XG4gICAgcmV0dXJuIGZpcnN0Tm9kZS5nZXRPd25lcigpO1xuICB9XG4gIHZhciBmaXJzdE93bmVyR3JhcGggPSBmaXJzdE5vZGUuZ2V0T3duZXIoKTtcblxuICBkbyB7XG4gICAgaWYgKGZpcnN0T3duZXJHcmFwaCA9PSBudWxsKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgdmFyIHNlY29uZE93bmVyR3JhcGggPSBzZWNvbmROb2RlLmdldE93bmVyKCk7XG5cbiAgICBkbyB7XG4gICAgICBpZiAoc2Vjb25kT3duZXJHcmFwaCA9PSBudWxsKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2Vjb25kT3duZXJHcmFwaCA9PSBmaXJzdE93bmVyR3JhcGgpIHtcbiAgICAgICAgcmV0dXJuIHNlY29uZE93bmVyR3JhcGg7XG4gICAgICB9XG4gICAgICBzZWNvbmRPd25lckdyYXBoID0gc2Vjb25kT3duZXJHcmFwaC5nZXRQYXJlbnQoKS5nZXRPd25lcigpO1xuICAgIH0gd2hpbGUgKHRydWUpO1xuXG4gICAgZmlyc3RPd25lckdyYXBoID0gZmlyc3RPd25lckdyYXBoLmdldFBhcmVudCgpLmdldE93bmVyKCk7XG4gIH0gd2hpbGUgKHRydWUpO1xuXG4gIHJldHVybiBmaXJzdE93bmVyR3JhcGg7XG59O1xuXG5MR3JhcGhNYW5hZ2VyLnByb3RvdHlwZS5jYWxjSW5jbHVzaW9uVHJlZURlcHRocyA9IGZ1bmN0aW9uIChncmFwaCwgZGVwdGgpIHtcbiAgaWYgKGdyYXBoID09IG51bGwgJiYgZGVwdGggPT0gbnVsbCkge1xuICAgIGdyYXBoID0gdGhpcy5yb290R3JhcGg7XG4gICAgZGVwdGggPSAxO1xuICB9XG4gIHZhciBub2RlO1xuXG4gIHZhciBub2RlcyA9IGdyYXBoLmdldE5vZGVzKCk7XG4gIHZhciBzID0gbm9kZXMubGVuZ3RoO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHM7IGkrKykge1xuICAgIG5vZGUgPSBub2Rlc1tpXTtcbiAgICBub2RlLmluY2x1c2lvblRyZWVEZXB0aCA9IGRlcHRoO1xuXG4gICAgaWYgKG5vZGUuY2hpbGQgIT0gbnVsbCkge1xuICAgICAgdGhpcy5jYWxjSW5jbHVzaW9uVHJlZURlcHRocyhub2RlLmNoaWxkLCBkZXB0aCArIDEpO1xuICAgIH1cbiAgfVxufTtcblxuTEdyYXBoTWFuYWdlci5wcm90b3R5cGUuaW5jbHVkZXNJbnZhbGlkRWRnZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGVkZ2U7XG4gIHZhciBlZGdlc1RvUmVtb3ZlID0gW107XG5cbiAgdmFyIHMgPSB0aGlzLmVkZ2VzLmxlbmd0aDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzOyBpKyspIHtcbiAgICBlZGdlID0gdGhpcy5lZGdlc1tpXTtcblxuICAgIGlmICh0aGlzLmlzT25lQW5jZXN0b3JPZk90aGVyKGVkZ2Uuc291cmNlLCBlZGdlLnRhcmdldCkpIHtcbiAgICAgIGVkZ2VzVG9SZW1vdmUucHVzaChlZGdlKTtcbiAgICB9XG4gIH1cblxuICAvLyBSZW1vdmUgaW52YWxpZCBlZGdlcyBmcm9tIGdyYXBoIG1hbmFnZXJcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlZGdlc1RvUmVtb3ZlLmxlbmd0aDsgaSsrKSB7XG4gICAgdGhpcy5yZW1vdmUoZWRnZXNUb1JlbW92ZVtpXSk7XG4gIH1cblxuICAvLyBJbnZhbGlkIGVkZ2VzIGFyZSBjbGVhcmVkLCBzbyByZXR1cm4gZmFsc2VcbiAgcmV0dXJuIGZhbHNlO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBMR3JhcGhNYW5hZ2VyO1xuXG4vKioqLyB9KSxcbi8qIDggKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuLyoqXG4gKiBUaGlzIGNsYXNzIG1haW50YWlucyBhIGxpc3Qgb2Ygc3RhdGljIGdlb21ldHJ5IHJlbGF0ZWQgdXRpbGl0eSBtZXRob2RzLlxuICpcbiAqXG4gKiBDb3B5cmlnaHQ6IGktVmlzIFJlc2VhcmNoIEdyb3VwLCBCaWxrZW50IFVuaXZlcnNpdHksIDIwMDcgLSBwcmVzZW50XG4gKi9cblxudmFyIFBvaW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMik7XG5cbmZ1bmN0aW9uIElHZW9tZXRyeSgpIHt9XG5cbi8qKlxuICogVGhpcyBtZXRob2QgY2FsY3VsYXRlcyAqaGFsZiogdGhlIGFtb3VudCBpbiB4IGFuZCB5IGRpcmVjdGlvbnMgb2YgdGhlIHR3b1xuICogaW5wdXQgcmVjdGFuZ2xlcyBuZWVkZWQgdG8gc2VwYXJhdGUgdGhlbSBrZWVwaW5nIHRoZWlyIHJlc3BlY3RpdmVcbiAqIHBvc2l0aW9uaW5nLCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGluIHRoZSBpbnB1dCBhcnJheS4gQW4gaW5wdXRcbiAqIHNlcGFyYXRpb24gYnVmZmVyIGFkZGVkIHRvIHRoZSBhbW91bnQgaW4gYm90aCBkaXJlY3Rpb25zLiBXZSBhc3N1bWUgdGhhdFxuICogdGhlIHR3byByZWN0YW5nbGVzIGRvIGludGVyc2VjdC5cbiAqL1xuSUdlb21ldHJ5LmNhbGNTZXBhcmF0aW9uQW1vdW50ID0gZnVuY3Rpb24gKHJlY3RBLCByZWN0Qiwgb3ZlcmxhcEFtb3VudCwgc2VwYXJhdGlvbkJ1ZmZlcikge1xuICBpZiAoIXJlY3RBLmludGVyc2VjdHMocmVjdEIpKSB7XG4gICAgdGhyb3cgXCJhc3NlcnQgZmFpbGVkXCI7XG4gIH1cblxuICB2YXIgZGlyZWN0aW9ucyA9IG5ldyBBcnJheSgyKTtcblxuICB0aGlzLmRlY2lkZURpcmVjdGlvbnNGb3JPdmVybGFwcGluZ05vZGVzKHJlY3RBLCByZWN0QiwgZGlyZWN0aW9ucyk7XG5cbiAgb3ZlcmxhcEFtb3VudFswXSA9IE1hdGgubWluKHJlY3RBLmdldFJpZ2h0KCksIHJlY3RCLmdldFJpZ2h0KCkpIC0gTWF0aC5tYXgocmVjdEEueCwgcmVjdEIueCk7XG4gIG92ZXJsYXBBbW91bnRbMV0gPSBNYXRoLm1pbihyZWN0QS5nZXRCb3R0b20oKSwgcmVjdEIuZ2V0Qm90dG9tKCkpIC0gTWF0aC5tYXgocmVjdEEueSwgcmVjdEIueSk7XG5cbiAgLy8gdXBkYXRlIHRoZSBvdmVybGFwcGluZyBhbW91bnRzIGZvciB0aGUgZm9sbG93aW5nIGNhc2VzOlxuICBpZiAocmVjdEEuZ2V0WCgpIDw9IHJlY3RCLmdldFgoKSAmJiByZWN0QS5nZXRSaWdodCgpID49IHJlY3RCLmdldFJpZ2h0KCkpIHtcbiAgICAvKiBDYXNlIHguMTpcbiAgICAqXG4gICAgKiByZWN0QVxuICAgICogXHR8ICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgKiBcdHwgICAgICAgIF9fX19fX19fXyAgICAgIHxcbiAgICAqIFx0fCAgICAgICAgfCAgICAgICB8ICAgICAgfFxuICAgICogXHR8X19fX19fX198X19fX19fX3xfX19fX198XG4gICAgKiBcdFx0XHQgfCAgICAgICB8XG4gICAgKiAgICAgICAgICAgfCAgICAgICB8XG4gICAgKiAgICAgICAgcmVjdEJcbiAgICAqL1xuICAgIG92ZXJsYXBBbW91bnRbMF0gKz0gTWF0aC5taW4ocmVjdEIuZ2V0WCgpIC0gcmVjdEEuZ2V0WCgpLCByZWN0QS5nZXRSaWdodCgpIC0gcmVjdEIuZ2V0UmlnaHQoKSk7XG4gIH0gZWxzZSBpZiAocmVjdEIuZ2V0WCgpIDw9IHJlY3RBLmdldFgoKSAmJiByZWN0Qi5nZXRSaWdodCgpID49IHJlY3RBLmdldFJpZ2h0KCkpIHtcbiAgICAvKiBDYXNlIHguMjpcbiAgICAqXG4gICAgKiByZWN0QlxuICAgICogXHR8ICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgKiBcdHwgICAgICAgIF9fX19fX19fXyAgICAgIHxcbiAgICAqIFx0fCAgICAgICAgfCAgICAgICB8ICAgICAgfFxuICAgICogXHR8X19fX19fX198X19fX19fX3xfX19fX198XG4gICAgKiBcdFx0XHQgfCAgICAgICB8XG4gICAgKiAgICAgICAgICAgfCAgICAgICB8XG4gICAgKiAgICAgICAgcmVjdEFcbiAgICAqL1xuICAgIG92ZXJsYXBBbW91bnRbMF0gKz0gTWF0aC5taW4ocmVjdEEuZ2V0WCgpIC0gcmVjdEIuZ2V0WCgpLCByZWN0Qi5nZXRSaWdodCgpIC0gcmVjdEEuZ2V0UmlnaHQoKSk7XG4gIH1cbiAgaWYgKHJlY3RBLmdldFkoKSA8PSByZWN0Qi5nZXRZKCkgJiYgcmVjdEEuZ2V0Qm90dG9tKCkgPj0gcmVjdEIuZ2V0Qm90dG9tKCkpIHtcbiAgICAvKiBDYXNlIHkuMTpcbiAgICAgKiAgICAgICAgICBfX19fX19fXyByZWN0QVxuICAgICAqICAgICAgICAgfFxuICAgICAqICAgICAgICAgfFxuICAgICAqICAgX19fX19ffF9fX18gIHJlY3RCXG4gICAgICogICAgICAgICB8ICAgIHxcbiAgICAgKiAgICAgICAgIHwgICAgfFxuICAgICAqICAgX19fX19ffF9fX198XG4gICAgICogICAgICAgICB8XG4gICAgICogICAgICAgICB8XG4gICAgICogICAgICAgICB8X19fX19fX19cbiAgICAgKlxuICAgICAqL1xuICAgIG92ZXJsYXBBbW91bnRbMV0gKz0gTWF0aC5taW4ocmVjdEIuZ2V0WSgpIC0gcmVjdEEuZ2V0WSgpLCByZWN0QS5nZXRCb3R0b20oKSAtIHJlY3RCLmdldEJvdHRvbSgpKTtcbiAgfSBlbHNlIGlmIChyZWN0Qi5nZXRZKCkgPD0gcmVjdEEuZ2V0WSgpICYmIHJlY3RCLmdldEJvdHRvbSgpID49IHJlY3RBLmdldEJvdHRvbSgpKSB7XG4gICAgLyogQ2FzZSB5LjI6XG4gICAgKiAgICAgICAgICBfX19fX19fXyByZWN0QlxuICAgICogICAgICAgICB8XG4gICAgKiAgICAgICAgIHxcbiAgICAqICAgX19fX19ffF9fX18gIHJlY3RBXG4gICAgKiAgICAgICAgIHwgICAgfFxuICAgICogICAgICAgICB8ICAgIHxcbiAgICAqICAgX19fX19ffF9fX198XG4gICAgKiAgICAgICAgIHxcbiAgICAqICAgICAgICAgfFxuICAgICogICAgICAgICB8X19fX19fX19cbiAgICAqXG4gICAgKi9cbiAgICBvdmVybGFwQW1vdW50WzFdICs9IE1hdGgubWluKHJlY3RBLmdldFkoKSAtIHJlY3RCLmdldFkoKSwgcmVjdEIuZ2V0Qm90dG9tKCkgLSByZWN0QS5nZXRCb3R0b20oKSk7XG4gIH1cblxuICAvLyBmaW5kIHNsb3BlIG9mIHRoZSBsaW5lIHBhc3NlcyB0d28gY2VudGVyc1xuICB2YXIgc2xvcGUgPSBNYXRoLmFicygocmVjdEIuZ2V0Q2VudGVyWSgpIC0gcmVjdEEuZ2V0Q2VudGVyWSgpKSAvIChyZWN0Qi5nZXRDZW50ZXJYKCkgLSByZWN0QS5nZXRDZW50ZXJYKCkpKTtcbiAgLy8gaWYgY2VudGVycyBhcmUgb3ZlcmxhcHBlZFxuICBpZiAocmVjdEIuZ2V0Q2VudGVyWSgpID09PSByZWN0QS5nZXRDZW50ZXJZKCkgJiYgcmVjdEIuZ2V0Q2VudGVyWCgpID09PSByZWN0QS5nZXRDZW50ZXJYKCkpIHtcbiAgICAvLyBhc3N1bWUgdGhlIHNsb3BlIGlzIDEgKDQ1IGRlZ3JlZSlcbiAgICBzbG9wZSA9IDEuMDtcbiAgfVxuXG4gIHZhciBtb3ZlQnlZID0gc2xvcGUgKiBvdmVybGFwQW1vdW50WzBdO1xuICB2YXIgbW92ZUJ5WCA9IG92ZXJsYXBBbW91bnRbMV0gLyBzbG9wZTtcbiAgaWYgKG92ZXJsYXBBbW91bnRbMF0gPCBtb3ZlQnlYKSB7XG4gICAgbW92ZUJ5WCA9IG92ZXJsYXBBbW91bnRbMF07XG4gIH0gZWxzZSB7XG4gICAgbW92ZUJ5WSA9IG92ZXJsYXBBbW91bnRbMV07XG4gIH1cbiAgLy8gcmV0dXJuIGhhbGYgdGhlIGFtb3VudCBzbyB0aGF0IGlmIGVhY2ggcmVjdGFuZ2xlIGlzIG1vdmVkIGJ5IHRoZXNlXG4gIC8vIGFtb3VudHMgaW4gb3Bwb3NpdGUgZGlyZWN0aW9ucywgb3ZlcmxhcCB3aWxsIGJlIHJlc29sdmVkXG4gIG92ZXJsYXBBbW91bnRbMF0gPSAtMSAqIGRpcmVjdGlvbnNbMF0gKiAobW92ZUJ5WCAvIDIgKyBzZXBhcmF0aW9uQnVmZmVyKTtcbiAgb3ZlcmxhcEFtb3VudFsxXSA9IC0xICogZGlyZWN0aW9uc1sxXSAqIChtb3ZlQnlZIC8gMiArIHNlcGFyYXRpb25CdWZmZXIpO1xufTtcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBkZWNpZGVzIHRoZSBzZXBhcmF0aW9uIGRpcmVjdGlvbiBvZiBvdmVybGFwcGluZyBub2Rlc1xuICpcbiAqIGlmIGRpcmVjdGlvbnNbMF0gPSAtMSwgdGhlbiByZWN0QSBnb2VzIGxlZnRcbiAqIGlmIGRpcmVjdGlvbnNbMF0gPSAxLCAgdGhlbiByZWN0QSBnb2VzIHJpZ2h0XG4gKiBpZiBkaXJlY3Rpb25zWzFdID0gLTEsIHRoZW4gcmVjdEEgZ29lcyB1cFxuICogaWYgZGlyZWN0aW9uc1sxXSA9IDEsICB0aGVuIHJlY3RBIGdvZXMgZG93blxuICovXG5JR2VvbWV0cnkuZGVjaWRlRGlyZWN0aW9uc0Zvck92ZXJsYXBwaW5nTm9kZXMgPSBmdW5jdGlvbiAocmVjdEEsIHJlY3RCLCBkaXJlY3Rpb25zKSB7XG4gIGlmIChyZWN0QS5nZXRDZW50ZXJYKCkgPCByZWN0Qi5nZXRDZW50ZXJYKCkpIHtcbiAgICBkaXJlY3Rpb25zWzBdID0gLTE7XG4gIH0gZWxzZSB7XG4gICAgZGlyZWN0aW9uc1swXSA9IDE7XG4gIH1cblxuICBpZiAocmVjdEEuZ2V0Q2VudGVyWSgpIDwgcmVjdEIuZ2V0Q2VudGVyWSgpKSB7XG4gICAgZGlyZWN0aW9uc1sxXSA9IC0xO1xuICB9IGVsc2Uge1xuICAgIGRpcmVjdGlvbnNbMV0gPSAxO1xuICB9XG59O1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGNhbGN1bGF0ZXMgdGhlIGludGVyc2VjdGlvbiAoY2xpcHBpbmcpIHBvaW50cyBvZiB0aGUgdHdvXG4gKiBpbnB1dCByZWN0YW5nbGVzIHdpdGggbGluZSBzZWdtZW50IGRlZmluZWQgYnkgdGhlIGNlbnRlcnMgb2YgdGhlc2UgdHdvXG4gKiByZWN0YW5nbGVzLiBUaGUgY2xpcHBpbmcgcG9pbnRzIGFyZSBzYXZlZCBpbiB0aGUgaW5wdXQgZG91YmxlIGFycmF5IGFuZFxuICogd2hldGhlciBvciBub3QgdGhlIHR3byByZWN0YW5nbGVzIG92ZXJsYXAgaXMgcmV0dXJuZWQuXG4gKi9cbklHZW9tZXRyeS5nZXRJbnRlcnNlY3Rpb24yID0gZnVuY3Rpb24gKHJlY3RBLCByZWN0QiwgcmVzdWx0KSB7XG4gIC8vcmVzdWx0WzAtMV0gd2lsbCBjb250YWluIGNsaXBQb2ludCBvZiByZWN0QSwgcmVzdWx0WzItM10gd2lsbCBjb250YWluIGNsaXBQb2ludCBvZiByZWN0QlxuICB2YXIgcDF4ID0gcmVjdEEuZ2V0Q2VudGVyWCgpO1xuICB2YXIgcDF5ID0gcmVjdEEuZ2V0Q2VudGVyWSgpO1xuICB2YXIgcDJ4ID0gcmVjdEIuZ2V0Q2VudGVyWCgpO1xuICB2YXIgcDJ5ID0gcmVjdEIuZ2V0Q2VudGVyWSgpO1xuXG4gIC8vaWYgdHdvIHJlY3RhbmdsZXMgaW50ZXJzZWN0LCB0aGVuIGNsaXBwaW5nIHBvaW50cyBhcmUgY2VudGVyc1xuICBpZiAocmVjdEEuaW50ZXJzZWN0cyhyZWN0QikpIHtcbiAgICByZXN1bHRbMF0gPSBwMXg7XG4gICAgcmVzdWx0WzFdID0gcDF5O1xuICAgIHJlc3VsdFsyXSA9IHAyeDtcbiAgICByZXN1bHRbM10gPSBwMnk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLy92YXJpYWJsZXMgZm9yIHJlY3RBXG4gIHZhciB0b3BMZWZ0QXggPSByZWN0QS5nZXRYKCk7XG4gIHZhciB0b3BMZWZ0QXkgPSByZWN0QS5nZXRZKCk7XG4gIHZhciB0b3BSaWdodEF4ID0gcmVjdEEuZ2V0UmlnaHQoKTtcbiAgdmFyIGJvdHRvbUxlZnRBeCA9IHJlY3RBLmdldFgoKTtcbiAgdmFyIGJvdHRvbUxlZnRBeSA9IHJlY3RBLmdldEJvdHRvbSgpO1xuICB2YXIgYm90dG9tUmlnaHRBeCA9IHJlY3RBLmdldFJpZ2h0KCk7XG4gIHZhciBoYWxmV2lkdGhBID0gcmVjdEEuZ2V0V2lkdGhIYWxmKCk7XG4gIHZhciBoYWxmSGVpZ2h0QSA9IHJlY3RBLmdldEhlaWdodEhhbGYoKTtcbiAgLy92YXJpYWJsZXMgZm9yIHJlY3RCXG4gIHZhciB0b3BMZWZ0QnggPSByZWN0Qi5nZXRYKCk7XG4gIHZhciB0b3BMZWZ0QnkgPSByZWN0Qi5nZXRZKCk7XG4gIHZhciB0b3BSaWdodEJ4ID0gcmVjdEIuZ2V0UmlnaHQoKTtcbiAgdmFyIGJvdHRvbUxlZnRCeCA9IHJlY3RCLmdldFgoKTtcbiAgdmFyIGJvdHRvbUxlZnRCeSA9IHJlY3RCLmdldEJvdHRvbSgpO1xuICB2YXIgYm90dG9tUmlnaHRCeCA9IHJlY3RCLmdldFJpZ2h0KCk7XG4gIHZhciBoYWxmV2lkdGhCID0gcmVjdEIuZ2V0V2lkdGhIYWxmKCk7XG4gIHZhciBoYWxmSGVpZ2h0QiA9IHJlY3RCLmdldEhlaWdodEhhbGYoKTtcblxuICAvL2ZsYWcgd2hldGhlciBjbGlwcGluZyBwb2ludHMgYXJlIGZvdW5kXG4gIHZhciBjbGlwUG9pbnRBRm91bmQgPSBmYWxzZTtcbiAgdmFyIGNsaXBQb2ludEJGb3VuZCA9IGZhbHNlO1xuXG4gIC8vIGxpbmUgaXMgdmVydGljYWxcbiAgaWYgKHAxeCA9PT0gcDJ4KSB7XG4gICAgaWYgKHAxeSA+IHAyeSkge1xuICAgICAgcmVzdWx0WzBdID0gcDF4O1xuICAgICAgcmVzdWx0WzFdID0gdG9wTGVmdEF5O1xuICAgICAgcmVzdWx0WzJdID0gcDJ4O1xuICAgICAgcmVzdWx0WzNdID0gYm90dG9tTGVmdEJ5O1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSBpZiAocDF5IDwgcDJ5KSB7XG4gICAgICByZXN1bHRbMF0gPSBwMXg7XG4gICAgICByZXN1bHRbMV0gPSBib3R0b21MZWZ0QXk7XG4gICAgICByZXN1bHRbMl0gPSBwMng7XG4gICAgICByZXN1bHRbM10gPSB0b3BMZWZ0Qnk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vbm90IGxpbmUsIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuICAvLyBsaW5lIGlzIGhvcml6b250YWxcbiAgZWxzZSBpZiAocDF5ID09PSBwMnkpIHtcbiAgICAgIGlmIChwMXggPiBwMngpIHtcbiAgICAgICAgcmVzdWx0WzBdID0gdG9wTGVmdEF4O1xuICAgICAgICByZXN1bHRbMV0gPSBwMXk7XG4gICAgICAgIHJlc3VsdFsyXSA9IHRvcFJpZ2h0Qng7XG4gICAgICAgIHJlc3VsdFszXSA9IHAyeTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSBlbHNlIGlmIChwMXggPCBwMngpIHtcbiAgICAgICAgcmVzdWx0WzBdID0gdG9wUmlnaHRBeDtcbiAgICAgICAgcmVzdWx0WzFdID0gcDF5O1xuICAgICAgICByZXN1bHRbMl0gPSB0b3BMZWZ0Qng7XG4gICAgICAgIHJlc3VsdFszXSA9IHAyeTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy9ub3QgdmFsaWQgbGluZSwgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vc2xvcGVzIG9mIHJlY3RBJ3MgYW5kIHJlY3RCJ3MgZGlhZ29uYWxzXG4gICAgICB2YXIgc2xvcGVBID0gcmVjdEEuaGVpZ2h0IC8gcmVjdEEud2lkdGg7XG4gICAgICB2YXIgc2xvcGVCID0gcmVjdEIuaGVpZ2h0IC8gcmVjdEIud2lkdGg7XG5cbiAgICAgIC8vc2xvcGUgb2YgbGluZSBiZXR3ZWVuIGNlbnRlciBvZiByZWN0QSBhbmQgY2VudGVyIG9mIHJlY3RCXG4gICAgICB2YXIgc2xvcGVQcmltZSA9IChwMnkgLSBwMXkpIC8gKHAyeCAtIHAxeCk7XG4gICAgICB2YXIgY2FyZGluYWxEaXJlY3Rpb25BID0gdm9pZCAwO1xuICAgICAgdmFyIGNhcmRpbmFsRGlyZWN0aW9uQiA9IHZvaWQgMDtcbiAgICAgIHZhciB0ZW1wUG9pbnRBeCA9IHZvaWQgMDtcbiAgICAgIHZhciB0ZW1wUG9pbnRBeSA9IHZvaWQgMDtcbiAgICAgIHZhciB0ZW1wUG9pbnRCeCA9IHZvaWQgMDtcbiAgICAgIHZhciB0ZW1wUG9pbnRCeSA9IHZvaWQgMDtcblxuICAgICAgLy9kZXRlcm1pbmUgd2hldGhlciBjbGlwcGluZyBwb2ludCBpcyB0aGUgY29ybmVyIG9mIG5vZGVBXG4gICAgICBpZiAoLXNsb3BlQSA9PT0gc2xvcGVQcmltZSkge1xuICAgICAgICBpZiAocDF4ID4gcDJ4KSB7XG4gICAgICAgICAgcmVzdWx0WzBdID0gYm90dG9tTGVmdEF4O1xuICAgICAgICAgIHJlc3VsdFsxXSA9IGJvdHRvbUxlZnRBeTtcbiAgICAgICAgICBjbGlwUG9pbnRBRm91bmQgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdFswXSA9IHRvcFJpZ2h0QXg7XG4gICAgICAgICAgcmVzdWx0WzFdID0gdG9wTGVmdEF5O1xuICAgICAgICAgIGNsaXBQb2ludEFGb3VuZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc2xvcGVBID09PSBzbG9wZVByaW1lKSB7XG4gICAgICAgIGlmIChwMXggPiBwMngpIHtcbiAgICAgICAgICByZXN1bHRbMF0gPSB0b3BMZWZ0QXg7XG4gICAgICAgICAgcmVzdWx0WzFdID0gdG9wTGVmdEF5O1xuICAgICAgICAgIGNsaXBQb2ludEFGb3VuZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0WzBdID0gYm90dG9tUmlnaHRBeDtcbiAgICAgICAgICByZXN1bHRbMV0gPSBib3R0b21MZWZ0QXk7XG4gICAgICAgICAgY2xpcFBvaW50QUZvdW5kID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvL2RldGVybWluZSB3aGV0aGVyIGNsaXBwaW5nIHBvaW50IGlzIHRoZSBjb3JuZXIgb2Ygbm9kZUJcbiAgICAgIGlmICgtc2xvcGVCID09PSBzbG9wZVByaW1lKSB7XG4gICAgICAgIGlmIChwMnggPiBwMXgpIHtcbiAgICAgICAgICByZXN1bHRbMl0gPSBib3R0b21MZWZ0Qng7XG4gICAgICAgICAgcmVzdWx0WzNdID0gYm90dG9tTGVmdEJ5O1xuICAgICAgICAgIGNsaXBQb2ludEJGb3VuZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0WzJdID0gdG9wUmlnaHRCeDtcbiAgICAgICAgICByZXN1bHRbM10gPSB0b3BMZWZ0Qnk7XG4gICAgICAgICAgY2xpcFBvaW50QkZvdW5kID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzbG9wZUIgPT09IHNsb3BlUHJpbWUpIHtcbiAgICAgICAgaWYgKHAyeCA+IHAxeCkge1xuICAgICAgICAgIHJlc3VsdFsyXSA9IHRvcExlZnRCeDtcbiAgICAgICAgICByZXN1bHRbM10gPSB0b3BMZWZ0Qnk7XG4gICAgICAgICAgY2xpcFBvaW50QkZvdW5kID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHRbMl0gPSBib3R0b21SaWdodEJ4O1xuICAgICAgICAgIHJlc3VsdFszXSA9IGJvdHRvbUxlZnRCeTtcbiAgICAgICAgICBjbGlwUG9pbnRCRm91bmQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vaWYgYm90aCBjbGlwcGluZyBwb2ludHMgYXJlIGNvcm5lcnNcbiAgICAgIGlmIChjbGlwUG9pbnRBRm91bmQgJiYgY2xpcFBvaW50QkZvdW5kKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy9kZXRlcm1pbmUgQ2FyZGluYWwgRGlyZWN0aW9uIG9mIHJlY3RhbmdsZXNcbiAgICAgIGlmIChwMXggPiBwMngpIHtcbiAgICAgICAgaWYgKHAxeSA+IHAyeSkge1xuICAgICAgICAgIGNhcmRpbmFsRGlyZWN0aW9uQSA9IHRoaXMuZ2V0Q2FyZGluYWxEaXJlY3Rpb24oc2xvcGVBLCBzbG9wZVByaW1lLCA0KTtcbiAgICAgICAgICBjYXJkaW5hbERpcmVjdGlvbkIgPSB0aGlzLmdldENhcmRpbmFsRGlyZWN0aW9uKHNsb3BlQiwgc2xvcGVQcmltZSwgMik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2FyZGluYWxEaXJlY3Rpb25BID0gdGhpcy5nZXRDYXJkaW5hbERpcmVjdGlvbigtc2xvcGVBLCBzbG9wZVByaW1lLCAzKTtcbiAgICAgICAgICBjYXJkaW5hbERpcmVjdGlvbkIgPSB0aGlzLmdldENhcmRpbmFsRGlyZWN0aW9uKC1zbG9wZUIsIHNsb3BlUHJpbWUsIDEpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocDF5ID4gcDJ5KSB7XG4gICAgICAgICAgY2FyZGluYWxEaXJlY3Rpb25BID0gdGhpcy5nZXRDYXJkaW5hbERpcmVjdGlvbigtc2xvcGVBLCBzbG9wZVByaW1lLCAxKTtcbiAgICAgICAgICBjYXJkaW5hbERpcmVjdGlvbkIgPSB0aGlzLmdldENhcmRpbmFsRGlyZWN0aW9uKC1zbG9wZUIsIHNsb3BlUHJpbWUsIDMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhcmRpbmFsRGlyZWN0aW9uQSA9IHRoaXMuZ2V0Q2FyZGluYWxEaXJlY3Rpb24oc2xvcGVBLCBzbG9wZVByaW1lLCAyKTtcbiAgICAgICAgICBjYXJkaW5hbERpcmVjdGlvbkIgPSB0aGlzLmdldENhcmRpbmFsRGlyZWN0aW9uKHNsb3BlQiwgc2xvcGVQcmltZSwgNCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vY2FsY3VsYXRlIGNsaXBwaW5nIFBvaW50IGlmIGl0IGlzIG5vdCBmb3VuZCBiZWZvcmVcbiAgICAgIGlmICghY2xpcFBvaW50QUZvdW5kKSB7XG4gICAgICAgIHN3aXRjaCAoY2FyZGluYWxEaXJlY3Rpb25BKSB7XG4gICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgdGVtcFBvaW50QXkgPSB0b3BMZWZ0QXk7XG4gICAgICAgICAgICB0ZW1wUG9pbnRBeCA9IHAxeCArIC1oYWxmSGVpZ2h0QSAvIHNsb3BlUHJpbWU7XG4gICAgICAgICAgICByZXN1bHRbMF0gPSB0ZW1wUG9pbnRBeDtcbiAgICAgICAgICAgIHJlc3VsdFsxXSA9IHRlbXBQb2ludEF5O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgdGVtcFBvaW50QXggPSBib3R0b21SaWdodEF4O1xuICAgICAgICAgICAgdGVtcFBvaW50QXkgPSBwMXkgKyBoYWxmV2lkdGhBICogc2xvcGVQcmltZTtcbiAgICAgICAgICAgIHJlc3VsdFswXSA9IHRlbXBQb2ludEF4O1xuICAgICAgICAgICAgcmVzdWx0WzFdID0gdGVtcFBvaW50QXk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICB0ZW1wUG9pbnRBeSA9IGJvdHRvbUxlZnRBeTtcbiAgICAgICAgICAgIHRlbXBQb2ludEF4ID0gcDF4ICsgaGFsZkhlaWdodEEgLyBzbG9wZVByaW1lO1xuICAgICAgICAgICAgcmVzdWx0WzBdID0gdGVtcFBvaW50QXg7XG4gICAgICAgICAgICByZXN1bHRbMV0gPSB0ZW1wUG9pbnRBeTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIHRlbXBQb2ludEF4ID0gYm90dG9tTGVmdEF4O1xuICAgICAgICAgICAgdGVtcFBvaW50QXkgPSBwMXkgKyAtaGFsZldpZHRoQSAqIHNsb3BlUHJpbWU7XG4gICAgICAgICAgICByZXN1bHRbMF0gPSB0ZW1wUG9pbnRBeDtcbiAgICAgICAgICAgIHJlc3VsdFsxXSA9IHRlbXBQb2ludEF5O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghY2xpcFBvaW50QkZvdW5kKSB7XG4gICAgICAgIHN3aXRjaCAoY2FyZGluYWxEaXJlY3Rpb25CKSB7XG4gICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgdGVtcFBvaW50QnkgPSB0b3BMZWZ0Qnk7XG4gICAgICAgICAgICB0ZW1wUG9pbnRCeCA9IHAyeCArIC1oYWxmSGVpZ2h0QiAvIHNsb3BlUHJpbWU7XG4gICAgICAgICAgICByZXN1bHRbMl0gPSB0ZW1wUG9pbnRCeDtcbiAgICAgICAgICAgIHJlc3VsdFszXSA9IHRlbXBQb2ludEJ5O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgdGVtcFBvaW50QnggPSBib3R0b21SaWdodEJ4O1xuICAgICAgICAgICAgdGVtcFBvaW50QnkgPSBwMnkgKyBoYWxmV2lkdGhCICogc2xvcGVQcmltZTtcbiAgICAgICAgICAgIHJlc3VsdFsyXSA9IHRlbXBQb2ludEJ4O1xuICAgICAgICAgICAgcmVzdWx0WzNdID0gdGVtcFBvaW50Qnk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICB0ZW1wUG9pbnRCeSA9IGJvdHRvbUxlZnRCeTtcbiAgICAgICAgICAgIHRlbXBQb2ludEJ4ID0gcDJ4ICsgaGFsZkhlaWdodEIgLyBzbG9wZVByaW1lO1xuICAgICAgICAgICAgcmVzdWx0WzJdID0gdGVtcFBvaW50Qng7XG4gICAgICAgICAgICByZXN1bHRbM10gPSB0ZW1wUG9pbnRCeTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIHRlbXBQb2ludEJ4ID0gYm90dG9tTGVmdEJ4O1xuICAgICAgICAgICAgdGVtcFBvaW50QnkgPSBwMnkgKyAtaGFsZldpZHRoQiAqIHNsb3BlUHJpbWU7XG4gICAgICAgICAgICByZXN1bHRbMl0gPSB0ZW1wUG9pbnRCeDtcbiAgICAgICAgICAgIHJlc3VsdFszXSA9IHRlbXBQb2ludEJ5O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogVGhpcyBtZXRob2QgcmV0dXJucyBpbiB3aGljaCBjYXJkaW5hbCBkaXJlY3Rpb24gZG9lcyBpbnB1dCBwb2ludCBzdGF5c1xuICogMTogTm9ydGhcbiAqIDI6IEVhc3RcbiAqIDM6IFNvdXRoXG4gKiA0OiBXZXN0XG4gKi9cbklHZW9tZXRyeS5nZXRDYXJkaW5hbERpcmVjdGlvbiA9IGZ1bmN0aW9uIChzbG9wZSwgc2xvcGVQcmltZSwgbGluZSkge1xuICBpZiAoc2xvcGUgPiBzbG9wZVByaW1lKSB7XG4gICAgcmV0dXJuIGxpbmU7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIDEgKyBsaW5lICUgNDtcbiAgfVxufTtcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBjYWxjdWxhdGVzIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIHR3byBsaW5lcyBkZWZpbmVkIGJ5XG4gKiBwb2ludCBwYWlycyAoczEsczIpIGFuZCAoZjEsZjIpLlxuICovXG5JR2VvbWV0cnkuZ2V0SW50ZXJzZWN0aW9uID0gZnVuY3Rpb24gKHMxLCBzMiwgZjEsIGYyKSB7XG4gIGlmIChmMiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SW50ZXJzZWN0aW9uMihzMSwgczIsIGYxKTtcbiAgfVxuXG4gIHZhciB4MSA9IHMxLng7XG4gIHZhciB5MSA9IHMxLnk7XG4gIHZhciB4MiA9IHMyLng7XG4gIHZhciB5MiA9IHMyLnk7XG4gIHZhciB4MyA9IGYxLng7XG4gIHZhciB5MyA9IGYxLnk7XG4gIHZhciB4NCA9IGYyLng7XG4gIHZhciB5NCA9IGYyLnk7XG4gIHZhciB4ID0gdm9pZCAwLFxuICAgICAgeSA9IHZvaWQgMDsgLy8gaW50ZXJzZWN0aW9uIHBvaW50XG4gIHZhciBhMSA9IHZvaWQgMCxcbiAgICAgIGEyID0gdm9pZCAwLFxuICAgICAgYjEgPSB2b2lkIDAsXG4gICAgICBiMiA9IHZvaWQgMCxcbiAgICAgIGMxID0gdm9pZCAwLFxuICAgICAgYzIgPSB2b2lkIDA7IC8vIGNvZWZmaWNpZW50cyBvZiBsaW5lIGVxbnMuXG4gIHZhciBkZW5vbSA9IHZvaWQgMDtcblxuICBhMSA9IHkyIC0geTE7XG4gIGIxID0geDEgLSB4MjtcbiAgYzEgPSB4MiAqIHkxIC0geDEgKiB5MjsgLy8geyBhMSp4ICsgYjEqeSArIGMxID0gMCBpcyBsaW5lIDEgfVxuXG4gIGEyID0geTQgLSB5MztcbiAgYjIgPSB4MyAtIHg0O1xuICBjMiA9IHg0ICogeTMgLSB4MyAqIHk0OyAvLyB7IGEyKnggKyBiMip5ICsgYzIgPSAwIGlzIGxpbmUgMiB9XG5cbiAgZGVub20gPSBhMSAqIGIyIC0gYTIgKiBiMTtcblxuICBpZiAoZGVub20gPT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHggPSAoYjEgKiBjMiAtIGIyICogYzEpIC8gZGVub207XG4gIHkgPSAoYTIgKiBjMSAtIGExICogYzIpIC8gZGVub207XG5cbiAgcmV0dXJuIG5ldyBQb2ludCh4LCB5KTtcbn07XG5cbi8qKlxuICogVGhpcyBtZXRob2QgZmluZHMgYW5kIHJldHVybnMgdGhlIGFuZ2xlIG9mIHRoZSB2ZWN0b3IgZnJvbSB0aGUgKyB4LWF4aXNcbiAqIGluIGNsb2Nrd2lzZSBkaXJlY3Rpb24gKGNvbXBhdGlibGUgdy8gSmF2YSBjb29yZGluYXRlIHN5c3RlbSEpLlxuICovXG5JR2VvbWV0cnkuYW5nbGVPZlZlY3RvciA9IGZ1bmN0aW9uIChDeCwgQ3ksIE54LCBOeSkge1xuICB2YXIgQ19hbmdsZSA9IHZvaWQgMDtcblxuICBpZiAoQ3ggIT09IE54KSB7XG4gICAgQ19hbmdsZSA9IE1hdGguYXRhbigoTnkgLSBDeSkgLyAoTnggLSBDeCkpO1xuXG4gICAgaWYgKE54IDwgQ3gpIHtcbiAgICAgIENfYW5nbGUgKz0gTWF0aC5QSTtcbiAgICB9IGVsc2UgaWYgKE55IDwgQ3kpIHtcbiAgICAgIENfYW5nbGUgKz0gdGhpcy5UV09fUEk7XG4gICAgfVxuICB9IGVsc2UgaWYgKE55IDwgQ3kpIHtcbiAgICBDX2FuZ2xlID0gdGhpcy5PTkVfQU5EX0hBTEZfUEk7IC8vIDI3MCBkZWdyZWVzXG4gIH0gZWxzZSB7XG4gICAgQ19hbmdsZSA9IHRoaXMuSEFMRl9QSTsgLy8gOTAgZGVncmVlc1xuICB9XG5cbiAgcmV0dXJuIENfYW5nbGU7XG59O1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGNoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiB0d28gbGluZSBzZWdtZW50cyAob25lIHdpdGggcG9pbnRcbiAqIHAxIGFuZCBwMiwgdGhlIG90aGVyIHdpdGggcG9pbnQgcDMgYW5kIHA0KSBpbnRlcnNlY3QgYXQgYSBwb2ludCBvdGhlclxuICogdGhhbiB0aGVzZSBwb2ludHMuXG4gKi9cbklHZW9tZXRyeS5kb0ludGVyc2VjdCA9IGZ1bmN0aW9uIChwMSwgcDIsIHAzLCBwNCkge1xuICB2YXIgYSA9IHAxLng7XG4gIHZhciBiID0gcDEueTtcbiAgdmFyIGMgPSBwMi54O1xuICB2YXIgZCA9IHAyLnk7XG4gIHZhciBwID0gcDMueDtcbiAgdmFyIHEgPSBwMy55O1xuICB2YXIgciA9IHA0Lng7XG4gIHZhciBzID0gcDQueTtcbiAgdmFyIGRldCA9IChjIC0gYSkgKiAocyAtIHEpIC0gKHIgLSBwKSAqIChkIC0gYik7XG5cbiAgaWYgKGRldCA9PT0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbGFtYmRhID0gKChzIC0gcSkgKiAociAtIGEpICsgKHAgLSByKSAqIChzIC0gYikpIC8gZGV0O1xuICAgIHZhciBnYW1tYSA9ICgoYiAtIGQpICogKHIgLSBhKSArIChjIC0gYSkgKiAocyAtIGIpKSAvIGRldDtcbiAgICByZXR1cm4gMCA8IGxhbWJkYSAmJiBsYW1iZGEgPCAxICYmIDAgPCBnYW1tYSAmJiBnYW1tYSA8IDE7XG4gIH1cbn07XG5cbi8qKlxuICogVGhpcyBtZXRob2QgY2hlY2tzIGFuZCBjYWxjdWxhdGVzIHRoZSBpbnRlcnNlY3Rpb24gb2YgXG4gKiBhIGxpbmUgc2VnbWVudCBhbmQgYSBjaXJjbGUuXG4gKi9cbklHZW9tZXRyeS5maW5kQ2lyY2xlTGluZUludGVyc2VjdGlvbnMgPSBmdW5jdGlvbiAoRXgsIEV5LCBMeCwgTHksIEN4LCBDeSwgcikge1xuXG4gIC8vIEUgaXMgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSByYXksXG4gIC8vIEwgaXMgdGhlIGVuZCBwb2ludCBvZiB0aGUgcmF5LFxuICAvLyBDIGlzIHRoZSBjZW50ZXIgb2Ygc3BoZXJlIHlvdSdyZSB0ZXN0aW5nIGFnYWluc3RcbiAgLy8gciBpcyB0aGUgcmFkaXVzIG9mIHRoYXQgc3BoZXJlXG5cbiAgLy8gQ29tcHV0ZTpcbiAgLy8gZCA9IEwgLSBFICggRGlyZWN0aW9uIHZlY3RvciBvZiByYXksIGZyb20gc3RhcnQgdG8gZW5kIClcbiAgLy8gZiA9IEUgLSBDICggVmVjdG9yIGZyb20gY2VudGVyIHNwaGVyZSB0byByYXkgc3RhcnQgKVxuXG4gIC8vIFRoZW4gdGhlIGludGVyc2VjdGlvbiBpcyBmb3VuZCBieS4uXG4gIC8vIFAgPSBFICsgdCAqIGRcbiAgLy8gVGhpcyBpcyBhIHBhcmFtZXRyaWMgZXF1YXRpb246XG4gIC8vIFB4ID0gRXggKyB0ZHhcbiAgLy8gUHkgPSBFeSArIHRkeVxuXG4gIC8vIGdldCBhLCBiLCBjIHZhbHVlc1xuICB2YXIgYSA9IChMeCAtIEV4KSAqIChMeCAtIEV4KSArIChMeSAtIEV5KSAqIChMeSAtIEV5KTtcbiAgdmFyIGIgPSAyICogKChFeCAtIEN4KSAqIChMeCAtIEV4KSArIChFeSAtIEN5KSAqIChMeSAtIEV5KSk7XG4gIHZhciBjID0gKEV4IC0gQ3gpICogKEV4IC0gQ3gpICsgKEV5IC0gQ3kpICogKEV5IC0gQ3kpIC0gciAqIHI7XG5cbiAgLy8gZ2V0IGRpc2NyaW1pbmFudFxuICB2YXIgZGlzYyA9IGIgKiBiIC0gNCAqIGEgKiBjO1xuICBpZiAoZGlzYyA+PSAwKSB7XG4gICAgLy8gaW5zZXJ0IGludG8gcXVhZHJhdGljIGZvcm11bGFcbiAgICB2YXIgdDEgPSAoLWIgKyBNYXRoLnNxcnQoYiAqIGIgLSA0ICogYSAqIGMpKSAvICgyICogYSk7XG4gICAgdmFyIHQyID0gKC1iIC0gTWF0aC5zcXJ0KGIgKiBiIC0gNCAqIGEgKiBjKSkgLyAoMiAqIGEpO1xuICAgIHZhciBpbnRlcnNlY3Rpb25zID0gbnVsbDtcbiAgICBpZiAodDEgPj0gMCAmJiB0MSA8PSAxKSB7XG4gICAgICAvLyB0MSBpcyB0aGUgaW50ZXJzZWN0aW9uLCBhbmQgaXQncyBjbG9zZXIgdGhhbiB0MlxuICAgICAgLy8gKHNpbmNlIHQxIHVzZXMgLWIgLSBkaXNjcmltaW5hbnQpXG4gICAgICAvLyBJbXBhbGUsIFBva2VcbiAgICAgIHJldHVybiBbdDFdO1xuICAgIH1cblxuICAgIC8vIGhlcmUgdDEgZGlkbid0IGludGVyc2VjdCBzbyB3ZSBhcmUgZWl0aGVyIHN0YXJ0ZWRcbiAgICAvLyBpbnNpZGUgdGhlIHNwaGVyZSBvciBjb21wbGV0ZWx5IHBhc3QgaXRcbiAgICBpZiAodDIgPj0gMCAmJiB0MiA8PSAxKSB7XG4gICAgICAvLyBFeGl0V291bmRcbiAgICAgIHJldHVybiBbdDJdO1xuICAgIH1cblxuICAgIHJldHVybiBpbnRlcnNlY3Rpb25zO1xuICB9IGVsc2UgcmV0dXJuIG51bGw7XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU2VjdGlvbjogQ2xhc3MgQ29uc3RhbnRzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLyoqXG4gKiBTb21lIHVzZWZ1bCBwcmUtY2FsY3VsYXRlZCBjb25zdGFudHNcbiAqL1xuSUdlb21ldHJ5LkhBTEZfUEkgPSAwLjUgKiBNYXRoLlBJO1xuSUdlb21ldHJ5Lk9ORV9BTkRfSEFMRl9QSSA9IDEuNSAqIE1hdGguUEk7XG5JR2VvbWV0cnkuVFdPX1BJID0gMi4wICogTWF0aC5QSTtcbklHZW9tZXRyeS5USFJFRV9QSSA9IDMuMCAqIE1hdGguUEk7XG5cbm1vZHVsZS5leHBvcnRzID0gSUdlb21ldHJ5O1xuXG4vKioqLyB9KSxcbi8qIDkgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuZnVuY3Rpb24gSU1hdGgoKSB7fVxuXG4vKipcbiAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHNpZ24gb2YgdGhlIGlucHV0IHZhbHVlLlxuICovXG5JTWF0aC5zaWduID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA+IDApIHtcbiAgICByZXR1cm4gMTtcbiAgfSBlbHNlIGlmICh2YWx1ZSA8IDApIHtcbiAgICByZXR1cm4gLTE7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbn07XG5cbklNYXRoLmZsb29yID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA8IDAgPyBNYXRoLmNlaWwodmFsdWUpIDogTWF0aC5mbG9vcih2YWx1ZSk7XG59O1xuXG5JTWF0aC5jZWlsID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA8IDAgPyBNYXRoLmZsb29yKHZhbHVlKSA6IE1hdGguY2VpbCh2YWx1ZSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IElNYXRoO1xuXG4vKioqLyB9KSxcbi8qIDEwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbmZ1bmN0aW9uIEludGVnZXIoKSB7fVxuXG5JbnRlZ2VyLk1BWF9WQUxVRSA9IDIxNDc0ODM2NDc7XG5JbnRlZ2VyLk1JTl9WQUxVRSA9IC0yMTQ3NDgzNjQ4O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEludGVnZXI7XG5cbi8qKiovIH0pLFxuLyogMTEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIG5vZGVGcm9tID0gZnVuY3Rpb24gbm9kZUZyb20odmFsdWUpIHtcbiAgcmV0dXJuIHsgdmFsdWU6IHZhbHVlLCBuZXh0OiBudWxsLCBwcmV2OiBudWxsIH07XG59O1xuXG52YXIgYWRkID0gZnVuY3Rpb24gYWRkKHByZXYsIG5vZGUsIG5leHQsIGxpc3QpIHtcbiAgaWYgKHByZXYgIT09IG51bGwpIHtcbiAgICBwcmV2Lm5leHQgPSBub2RlO1xuICB9IGVsc2Uge1xuICAgIGxpc3QuaGVhZCA9IG5vZGU7XG4gIH1cblxuICBpZiAobmV4dCAhPT0gbnVsbCkge1xuICAgIG5leHQucHJldiA9IG5vZGU7XG4gIH0gZWxzZSB7XG4gICAgbGlzdC50YWlsID0gbm9kZTtcbiAgfVxuXG4gIG5vZGUucHJldiA9IHByZXY7XG4gIG5vZGUubmV4dCA9IG5leHQ7XG5cbiAgbGlzdC5sZW5ndGgrKztcblxuICByZXR1cm4gbm9kZTtcbn07XG5cbnZhciBfcmVtb3ZlID0gZnVuY3Rpb24gX3JlbW92ZShub2RlLCBsaXN0KSB7XG4gIHZhciBwcmV2ID0gbm9kZS5wcmV2LFxuICAgICAgbmV4dCA9IG5vZGUubmV4dDtcblxuXG4gIGlmIChwcmV2ICE9PSBudWxsKSB7XG4gICAgcHJldi5uZXh0ID0gbmV4dDtcbiAgfSBlbHNlIHtcbiAgICBsaXN0LmhlYWQgPSBuZXh0O1xuICB9XG5cbiAgaWYgKG5leHQgIT09IG51bGwpIHtcbiAgICBuZXh0LnByZXYgPSBwcmV2O1xuICB9IGVsc2Uge1xuICAgIGxpc3QudGFpbCA9IHByZXY7XG4gIH1cblxuICBub2RlLnByZXYgPSBub2RlLm5leHQgPSBudWxsO1xuXG4gIGxpc3QubGVuZ3RoLS07XG5cbiAgcmV0dXJuIG5vZGU7XG59O1xuXG52YXIgTGlua2VkTGlzdCA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gTGlua2VkTGlzdCh2YWxzKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBMaW5rZWRMaXN0KTtcblxuICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgICB0aGlzLmhlYWQgPSBudWxsO1xuICAgIHRoaXMudGFpbCA9IG51bGw7XG5cbiAgICBpZiAodmFscyAhPSBudWxsKSB7XG4gICAgICB2YWxzLmZvckVhY2goZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzLnB1c2godik7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoTGlua2VkTGlzdCwgW3tcbiAgICBrZXk6IFwic2l6ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzaXplKCkge1xuICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpbnNlcnRCZWZvcmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW5zZXJ0QmVmb3JlKHZhbCwgb3RoZXJOb2RlKSB7XG4gICAgICByZXR1cm4gYWRkKG90aGVyTm9kZS5wcmV2LCBub2RlRnJvbSh2YWwpLCBvdGhlck5vZGUsIHRoaXMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpbnNlcnRBZnRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbnNlcnRBZnRlcih2YWwsIG90aGVyTm9kZSkge1xuICAgICAgcmV0dXJuIGFkZChvdGhlck5vZGUsIG5vZGVGcm9tKHZhbCksIG90aGVyTm9kZS5uZXh0LCB0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaW5zZXJ0Tm9kZUJlZm9yZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbnNlcnROb2RlQmVmb3JlKG5ld05vZGUsIG90aGVyTm9kZSkge1xuICAgICAgcmV0dXJuIGFkZChvdGhlck5vZGUucHJldiwgbmV3Tm9kZSwgb3RoZXJOb2RlLCB0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaW5zZXJ0Tm9kZUFmdGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGluc2VydE5vZGVBZnRlcihuZXdOb2RlLCBvdGhlck5vZGUpIHtcbiAgICAgIHJldHVybiBhZGQob3RoZXJOb2RlLCBuZXdOb2RlLCBvdGhlck5vZGUubmV4dCwgdGhpcyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInB1c2hcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcHVzaCh2YWwpIHtcbiAgICAgIHJldHVybiBhZGQodGhpcy50YWlsLCBub2RlRnJvbSh2YWwpLCBudWxsLCB0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidW5zaGlmdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1bnNoaWZ0KHZhbCkge1xuICAgICAgcmV0dXJuIGFkZChudWxsLCBub2RlRnJvbSh2YWwpLCB0aGlzLmhlYWQsIHRoaXMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW1vdmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlKG5vZGUpIHtcbiAgICAgIHJldHVybiBfcmVtb3ZlKG5vZGUsIHRoaXMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwb3BcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcG9wKCkge1xuICAgICAgcmV0dXJuIF9yZW1vdmUodGhpcy50YWlsLCB0aGlzKS52YWx1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicG9wTm9kZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwb3BOb2RlKCkge1xuICAgICAgcmV0dXJuIF9yZW1vdmUodGhpcy50YWlsLCB0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2hpZnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2hpZnQoKSB7XG4gICAgICByZXR1cm4gX3JlbW92ZSh0aGlzLmhlYWQsIHRoaXMpLnZhbHVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzaGlmdE5vZGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2hpZnROb2RlKCkge1xuICAgICAgcmV0dXJuIF9yZW1vdmUodGhpcy5oZWFkLCB0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0X29iamVjdF9hdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRfb2JqZWN0X2F0KGluZGV4KSB7XG4gICAgICBpZiAoaW5kZXggPD0gdGhpcy5sZW5ndGgoKSkge1xuICAgICAgICB2YXIgaSA9IDE7XG4gICAgICAgIHZhciBjdXJyZW50ID0gdGhpcy5oZWFkO1xuICAgICAgICB3aGlsZSAoaSA8IGluZGV4KSB7XG4gICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQudmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldF9vYmplY3RfYXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0X29iamVjdF9hdChpbmRleCwgdmFsdWUpIHtcbiAgICAgIGlmIChpbmRleCA8PSB0aGlzLmxlbmd0aCgpKSB7XG4gICAgICAgIHZhciBpID0gMTtcbiAgICAgICAgdmFyIGN1cnJlbnQgPSB0aGlzLmhlYWQ7XG4gICAgICAgIHdoaWxlIChpIDwgaW5kZXgpIHtcbiAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0O1xuICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50LnZhbHVlID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIExpbmtlZExpc3Q7XG59KCk7XG5cbm1vZHVsZS5leHBvcnRzID0gTGlua2VkTGlzdDtcblxuLyoqKi8gfSksXG4vKiAxMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG4vKlxyXG4gKlRoaXMgY2xhc3MgaXMgdGhlIGphdmFzY3JpcHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFBvaW50LmphdmEgY2xhc3MgaW4gamRrXHJcbiAqL1xuZnVuY3Rpb24gUG9pbnQoeCwgeSwgcCkge1xuICB0aGlzLnggPSBudWxsO1xuICB0aGlzLnkgPSBudWxsO1xuICBpZiAoeCA9PSBudWxsICYmIHkgPT0gbnVsbCAmJiBwID09IG51bGwpIHtcbiAgICB0aGlzLnggPSAwO1xuICAgIHRoaXMueSA9IDA7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHggPT0gJ251bWJlcicgJiYgdHlwZW9mIHkgPT0gJ251bWJlcicgJiYgcCA9PSBudWxsKSB7XG4gICAgdGhpcy54ID0geDtcbiAgICB0aGlzLnkgPSB5O1xuICB9IGVsc2UgaWYgKHguY29uc3RydWN0b3IubmFtZSA9PSAnUG9pbnQnICYmIHkgPT0gbnVsbCAmJiBwID09IG51bGwpIHtcbiAgICBwID0geDtcbiAgICB0aGlzLnggPSBwLng7XG4gICAgdGhpcy55ID0gcC55O1xuICB9XG59XG5cblBvaW50LnByb3RvdHlwZS5nZXRYID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy54O1xufTtcblxuUG9pbnQucHJvdG90eXBlLmdldFkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZ2V0TG9jYXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBuZXcgUG9pbnQodGhpcy54LCB0aGlzLnkpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLnNldExvY2F0aW9uID0gZnVuY3Rpb24gKHgsIHksIHApIHtcbiAgaWYgKHguY29uc3RydWN0b3IubmFtZSA9PSAnUG9pbnQnICYmIHkgPT0gbnVsbCAmJiBwID09IG51bGwpIHtcbiAgICBwID0geDtcbiAgICB0aGlzLnNldExvY2F0aW9uKHAueCwgcC55KTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgeCA9PSAnbnVtYmVyJyAmJiB0eXBlb2YgeSA9PSAnbnVtYmVyJyAmJiBwID09IG51bGwpIHtcbiAgICAvL2lmIGJvdGggcGFyYW1ldGVycyBhcmUgaW50ZWdlciBqdXN0IG1vdmUgKHgseSkgbG9jYXRpb25cbiAgICBpZiAocGFyc2VJbnQoeCkgPT0geCAmJiBwYXJzZUludCh5KSA9PSB5KSB7XG4gICAgICB0aGlzLm1vdmUoeCwgeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMueCA9IE1hdGguZmxvb3IoeCArIDAuNSk7XG4gICAgICB0aGlzLnkgPSBNYXRoLmZsb29yKHkgKyAwLjUpO1xuICAgIH1cbiAgfVxufTtcblxuUG9pbnQucHJvdG90eXBlLm1vdmUgPSBmdW5jdGlvbiAoeCwgeSkge1xuICB0aGlzLnggPSB4O1xuICB0aGlzLnkgPSB5O1xufTtcblxuUG9pbnQucHJvdG90eXBlLnRyYW5zbGF0ZSA9IGZ1bmN0aW9uIChkeCwgZHkpIHtcbiAgdGhpcy54ICs9IGR4O1xuICB0aGlzLnkgKz0gZHk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gKG9iaikge1xuICBpZiAob2JqLmNvbnN0cnVjdG9yLm5hbWUgPT0gXCJQb2ludFwiKSB7XG4gICAgdmFyIHB0ID0gb2JqO1xuICAgIHJldHVybiB0aGlzLnggPT0gcHQueCAmJiB0aGlzLnkgPT0gcHQueTtcbiAgfVxuICByZXR1cm4gdGhpcyA9PSBvYmo7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBuZXcgUG9pbnQoKS5jb25zdHJ1Y3Rvci5uYW1lICsgXCJbeD1cIiArIHRoaXMueCArIFwiLHk9XCIgKyB0aGlzLnkgKyBcIl1cIjtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUG9pbnQ7XG5cbi8qKiovIH0pLFxuLyogMTMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuZnVuY3Rpb24gUmVjdGFuZ2xlRCh4LCB5LCB3aWR0aCwgaGVpZ2h0KSB7XG4gIHRoaXMueCA9IDA7XG4gIHRoaXMueSA9IDA7XG4gIHRoaXMud2lkdGggPSAwO1xuICB0aGlzLmhlaWdodCA9IDA7XG5cbiAgaWYgKHggIT0gbnVsbCAmJiB5ICE9IG51bGwgJiYgd2lkdGggIT0gbnVsbCAmJiBoZWlnaHQgIT0gbnVsbCkge1xuICAgIHRoaXMueCA9IHg7XG4gICAgdGhpcy55ID0geTtcbiAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gIH1cbn1cblxuUmVjdGFuZ2xlRC5wcm90b3R5cGUuZ2V0WCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMueDtcbn07XG5cblJlY3RhbmdsZUQucHJvdG90eXBlLnNldFggPSBmdW5jdGlvbiAoeCkge1xuICB0aGlzLnggPSB4O1xufTtcblxuUmVjdGFuZ2xlRC5wcm90b3R5cGUuZ2V0WSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMueTtcbn07XG5cblJlY3RhbmdsZUQucHJvdG90eXBlLnNldFkgPSBmdW5jdGlvbiAoeSkge1xuICB0aGlzLnkgPSB5O1xufTtcblxuUmVjdGFuZ2xlRC5wcm90b3R5cGUuZ2V0V2lkdGggPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLndpZHRoO1xufTtcblxuUmVjdGFuZ2xlRC5wcm90b3R5cGUuc2V0V2lkdGggPSBmdW5jdGlvbiAod2lkdGgpIHtcbiAgdGhpcy53aWR0aCA9IHdpZHRoO1xufTtcblxuUmVjdGFuZ2xlRC5wcm90b3R5cGUuZ2V0SGVpZ2h0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5oZWlnaHQ7XG59O1xuXG5SZWN0YW5nbGVELnByb3RvdHlwZS5zZXRIZWlnaHQgPSBmdW5jdGlvbiAoaGVpZ2h0KSB7XG4gIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xufTtcblxuUmVjdGFuZ2xlRC5wcm90b3R5cGUuZ2V0UmlnaHQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnggKyB0aGlzLndpZHRoO1xufTtcblxuUmVjdGFuZ2xlRC5wcm90b3R5cGUuZ2V0Qm90dG9tID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy55ICsgdGhpcy5oZWlnaHQ7XG59O1xuXG5SZWN0YW5nbGVELnByb3RvdHlwZS5pbnRlcnNlY3RzID0gZnVuY3Rpb24gKGEpIHtcbiAgaWYgKHRoaXMuZ2V0UmlnaHQoKSA8IGEueCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0aGlzLmdldEJvdHRvbSgpIDwgYS55KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGEuZ2V0UmlnaHQoKSA8IHRoaXMueCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChhLmdldEJvdHRvbSgpIDwgdGhpcy55KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5SZWN0YW5nbGVELnByb3RvdHlwZS5nZXRDZW50ZXJYID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy54ICsgdGhpcy53aWR0aCAvIDI7XG59O1xuXG5SZWN0YW5nbGVELnByb3RvdHlwZS5nZXRNaW5YID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5nZXRYKCk7XG59O1xuXG5SZWN0YW5nbGVELnByb3RvdHlwZS5nZXRNYXhYID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5nZXRYKCkgKyB0aGlzLndpZHRoO1xufTtcblxuUmVjdGFuZ2xlRC5wcm90b3R5cGUuZ2V0Q2VudGVyWSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMueSArIHRoaXMuaGVpZ2h0IC8gMjtcbn07XG5cblJlY3RhbmdsZUQucHJvdG90eXBlLmdldE1pblkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmdldFkoKTtcbn07XG5cblJlY3RhbmdsZUQucHJvdG90eXBlLmdldE1heFkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmdldFkoKSArIHRoaXMuaGVpZ2h0O1xufTtcblxuUmVjdGFuZ2xlRC5wcm90b3R5cGUuZ2V0V2lkdGhIYWxmID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy53aWR0aCAvIDI7XG59O1xuXG5SZWN0YW5nbGVELnByb3RvdHlwZS5nZXRIZWlnaHRIYWxmID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5oZWlnaHQgLyAyO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWN0YW5nbGVEO1xuXG4vKioqLyB9KSxcbi8qIDE0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBfdHlwZW9mID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTtcblxuZnVuY3Rpb24gVW5pcXVlSURHZW5lcmV0b3IoKSB7fVxuXG5VbmlxdWVJREdlbmVyZXRvci5sYXN0SUQgPSAwO1xuXG5VbmlxdWVJREdlbmVyZXRvci5jcmVhdGVJRCA9IGZ1bmN0aW9uIChvYmopIHtcbiAgaWYgKFVuaXF1ZUlER2VuZXJldG9yLmlzUHJpbWl0aXZlKG9iaikpIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG4gIGlmIChvYmoudW5pcXVlSUQgIT0gbnVsbCkge1xuICAgIHJldHVybiBvYmoudW5pcXVlSUQ7XG4gIH1cbiAgb2JqLnVuaXF1ZUlEID0gVW5pcXVlSURHZW5lcmV0b3IuZ2V0U3RyaW5nKCk7XG4gIFVuaXF1ZUlER2VuZXJldG9yLmxhc3RJRCsrO1xuICByZXR1cm4gb2JqLnVuaXF1ZUlEO1xufTtcblxuVW5pcXVlSURHZW5lcmV0b3IuZ2V0U3RyaW5nID0gZnVuY3Rpb24gKGlkKSB7XG4gIGlmIChpZCA9PSBudWxsKSBpZCA9IFVuaXF1ZUlER2VuZXJldG9yLmxhc3RJRDtcbiAgcmV0dXJuIFwiT2JqZWN0I1wiICsgaWQgKyBcIlwiO1xufTtcblxuVW5pcXVlSURHZW5lcmV0b3IuaXNQcmltaXRpdmUgPSBmdW5jdGlvbiAoYXJnKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIGFyZyA9PT0gXCJ1bmRlZmluZWRcIiA/IFwidW5kZWZpbmVkXCIgOiBfdHlwZW9mKGFyZyk7XG4gIHJldHVybiBhcmcgPT0gbnVsbCB8fCB0eXBlICE9IFwib2JqZWN0XCIgJiYgdHlwZSAhPSBcImZ1bmN0aW9uXCI7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFVuaXF1ZUlER2VuZXJldG9yO1xuXG4vKioqLyB9KSxcbi8qIDE1ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbmZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgeyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IEFycmF5KGFyci5sZW5ndGgpOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH0gZWxzZSB7IHJldHVybiBBcnJheS5mcm9tKGFycik7IH0gfVxuXG52YXIgTGF5b3V0Q29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcbnZhciBMR3JhcGhNYW5hZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KTtcbnZhciBMTm9kZSA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7XG52YXIgTEVkZ2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xudmFyIExHcmFwaCA9IF9fd2VicGFja19yZXF1aXJlX18oNik7XG52YXIgUG9pbnREID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTtcbnZhciBUcmFuc2Zvcm0gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3KTtcbnZhciBFbWl0dGVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygyOSk7XG5cbmZ1bmN0aW9uIExheW91dChpc1JlbW90ZVVzZSkge1xuICBFbWl0dGVyLmNhbGwodGhpcyk7XG5cbiAgLy9MYXlvdXQgUXVhbGl0eTogMDpkcmFmdCwgMTpkZWZhdWx0LCAyOnByb29mXG4gIHRoaXMubGF5b3V0UXVhbGl0eSA9IExheW91dENvbnN0YW50cy5RVUFMSVRZO1xuICAvL1doZXRoZXIgbGF5b3V0IHNob3VsZCBjcmVhdGUgYmVuZHBvaW50cyBhcyBuZWVkZWQgb3Igbm90XG4gIHRoaXMuY3JlYXRlQmVuZHNBc05lZWRlZCA9IExheW91dENvbnN0YW50cy5ERUZBVUxUX0NSRUFURV9CRU5EU19BU19ORUVERUQ7XG4gIC8vV2hldGhlciBsYXlvdXQgc2hvdWxkIGJlIGluY3JlbWVudGFsIG9yIG5vdFxuICB0aGlzLmluY3JlbWVudGFsID0gTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfSU5DUkVNRU5UQUw7XG4gIC8vV2hldGhlciB3ZSBhbmltYXRlIGZyb20gYmVmb3JlIHRvIGFmdGVyIGxheW91dCBub2RlIHBvc2l0aW9uc1xuICB0aGlzLmFuaW1hdGlvbk9uTGF5b3V0ID0gTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQU5JTUFUSU9OX09OX0xBWU9VVDtcbiAgLy9XaGV0aGVyIHdlIGFuaW1hdGUgdGhlIGxheW91dCBwcm9jZXNzIG9yIG5vdFxuICB0aGlzLmFuaW1hdGlvbkR1cmluZ0xheW91dCA9IExheW91dENvbnN0YW50cy5ERUZBVUxUX0FOSU1BVElPTl9EVVJJTkdfTEFZT1VUO1xuICAvL051bWJlciBpdGVyYXRpb25zIHRoYXQgc2hvdWxkIGJlIGRvbmUgYmV0d2VlbiB0d28gc3VjY2Vzc2l2ZSBhbmltYXRpb25zXG4gIHRoaXMuYW5pbWF0aW9uUGVyaW9kID0gTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQU5JTUFUSU9OX1BFUklPRDtcbiAgLyoqXHJcbiAgICogV2hldGhlciBvciBub3QgbGVhZiBub2RlcyAobm9uLWNvbXBvdW5kIG5vZGVzKSBhcmUgb2YgdW5pZm9ybSBzaXplcy4gV2hlblxyXG4gICAqIHRoZXkgYXJlLCBib3RoIHNwcmluZyBhbmQgcmVwdWxzaW9uIGZvcmNlcyBiZXR3ZWVuIHR3byBsZWFmIG5vZGVzIGNhbiBiZVxyXG4gICAqIGNhbGN1bGF0ZWQgd2l0aG91dCB0aGUgZXhwZW5zaXZlIGNsaXBwaW5nIHBvaW50IGNhbGN1bGF0aW9ucywgcmVzdWx0aW5nXHJcbiAgICogaW4gbWFqb3Igc3BlZWQtdXAuXHJcbiAgICovXG4gIHRoaXMudW5pZm9ybUxlYWZOb2RlU2l6ZXMgPSBMYXlvdXRDb25zdGFudHMuREVGQVVMVF9VTklGT1JNX0xFQUZfTk9ERV9TSVpFUztcbiAgLyoqXHJcbiAgICogVGhpcyBpcyB1c2VkIGZvciBjcmVhdGlvbiBvZiBiZW5kcG9pbnRzIGJ5IHVzaW5nIGR1bW15IG5vZGVzIGFuZCBlZGdlcy5cclxuICAgKiBNYXBzIGFuIExFZGdlIHRvIGl0cyBkdW1teSBiZW5kcG9pbnQgcGF0aC5cclxuICAgKi9cbiAgdGhpcy5lZGdlVG9EdW1teU5vZGVzID0gbmV3IE1hcCgpO1xuICB0aGlzLmdyYXBoTWFuYWdlciA9IG5ldyBMR3JhcGhNYW5hZ2VyKHRoaXMpO1xuICB0aGlzLmlzTGF5b3V0RmluaXNoZWQgPSBmYWxzZTtcbiAgdGhpcy5pc1N1YkxheW91dCA9IGZhbHNlO1xuICB0aGlzLmlzUmVtb3RlVXNlID0gZmFsc2U7XG5cbiAgaWYgKGlzUmVtb3RlVXNlICE9IG51bGwpIHtcbiAgICB0aGlzLmlzUmVtb3RlVXNlID0gaXNSZW1vdGVVc2U7XG4gIH1cbn1cblxuTGF5b3V0LlJBTkRPTV9TRUVEID0gMTtcblxuTGF5b3V0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRW1pdHRlci5wcm90b3R5cGUpO1xuXG5MYXlvdXQucHJvdG90eXBlLmdldEdyYXBoTWFuYWdlciA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuZ3JhcGhNYW5hZ2VyO1xufTtcblxuTGF5b3V0LnByb3RvdHlwZS5nZXRBbGxOb2RlcyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuZ3JhcGhNYW5hZ2VyLmdldEFsbE5vZGVzKCk7XG59O1xuXG5MYXlvdXQucHJvdG90eXBlLmdldEFsbEVkZ2VzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5ncmFwaE1hbmFnZXIuZ2V0QWxsRWRnZXMoKTtcbn07XG5cbkxheW91dC5wcm90b3R5cGUuZ2V0QWxsTm9kZXNUb0FwcGx5R3Jhdml0YXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmdyYXBoTWFuYWdlci5nZXRBbGxOb2Rlc1RvQXBwbHlHcmF2aXRhdGlvbigpO1xufTtcblxuTGF5b3V0LnByb3RvdHlwZS5uZXdHcmFwaE1hbmFnZXIgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBnbSA9IG5ldyBMR3JhcGhNYW5hZ2VyKHRoaXMpO1xuICB0aGlzLmdyYXBoTWFuYWdlciA9IGdtO1xuICByZXR1cm4gZ207XG59O1xuXG5MYXlvdXQucHJvdG90eXBlLm5ld0dyYXBoID0gZnVuY3Rpb24gKHZHcmFwaCkge1xuICByZXR1cm4gbmV3IExHcmFwaChudWxsLCB0aGlzLmdyYXBoTWFuYWdlciwgdkdyYXBoKTtcbn07XG5cbkxheW91dC5wcm90b3R5cGUubmV3Tm9kZSA9IGZ1bmN0aW9uICh2Tm9kZSkge1xuICByZXR1cm4gbmV3IExOb2RlKHRoaXMuZ3JhcGhNYW5hZ2VyLCB2Tm9kZSk7XG59O1xuXG5MYXlvdXQucHJvdG90eXBlLm5ld0VkZ2UgPSBmdW5jdGlvbiAodkVkZ2UpIHtcbiAgcmV0dXJuIG5ldyBMRWRnZShudWxsLCBudWxsLCB2RWRnZSk7XG59O1xuXG5MYXlvdXQucHJvdG90eXBlLmNoZWNrTGF5b3V0U3VjY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuZ3JhcGhNYW5hZ2VyLmdldFJvb3QoKSA9PSBudWxsIHx8IHRoaXMuZ3JhcGhNYW5hZ2VyLmdldFJvb3QoKS5nZXROb2RlcygpLmxlbmd0aCA9PSAwIHx8IHRoaXMuZ3JhcGhNYW5hZ2VyLmluY2x1ZGVzSW52YWxpZEVkZ2UoKTtcbn07XG5cbkxheW91dC5wcm90b3R5cGUucnVuTGF5b3V0ID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmlzTGF5b3V0RmluaXNoZWQgPSBmYWxzZTtcblxuICBpZiAodGhpcy50aWxpbmdQcmVMYXlvdXQpIHtcbiAgICB0aGlzLnRpbGluZ1ByZUxheW91dCgpO1xuICB9XG5cbiAgdGhpcy5pbml0UGFyYW1ldGVycygpO1xuICB2YXIgaXNMYXlvdXRTdWNjZXNzZnVsbDtcblxuICBpZiAodGhpcy5jaGVja0xheW91dFN1Y2Nlc3MoKSkge1xuICAgIGlzTGF5b3V0U3VjY2Vzc2Z1bGwgPSBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICBpc0xheW91dFN1Y2Nlc3NmdWxsID0gdGhpcy5sYXlvdXQoKTtcbiAgfVxuXG4gIGlmIChMYXlvdXRDb25zdGFudHMuQU5JTUFURSA9PT0gJ2R1cmluZycpIHtcbiAgICAvLyBJZiB0aGlzIGlzIGEgJ2R1cmluZycgbGF5b3V0IGFuaW1hdGlvbi4gTGF5b3V0IGlzIG5vdCBmaW5pc2hlZCB5ZXQuIFxuICAgIC8vIFdlIG5lZWQgdG8gcGVyZm9ybSB0aGVzZSBpbiBpbmRleC5qcyB3aGVuIGxheW91dCBpcyByZWFsbHkgZmluaXNoZWQuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGlzTGF5b3V0U3VjY2Vzc2Z1bGwpIHtcbiAgICBpZiAoIXRoaXMuaXNTdWJMYXlvdXQpIHtcbiAgICAgIHRoaXMuZG9Qb3N0TGF5b3V0KCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHRoaXMudGlsaW5nUG9zdExheW91dCkge1xuICAgIHRoaXMudGlsaW5nUG9zdExheW91dCgpO1xuICB9XG5cbiAgdGhpcy5pc0xheW91dEZpbmlzaGVkID0gdHJ1ZTtcblxuICByZXR1cm4gaXNMYXlvdXRTdWNjZXNzZnVsbDtcbn07XG5cbi8qKlxyXG4gKiBUaGlzIG1ldGhvZCBwZXJmb3JtcyB0aGUgb3BlcmF0aW9ucyByZXF1aXJlZCBhZnRlciBsYXlvdXQuXHJcbiAqL1xuTGF5b3V0LnByb3RvdHlwZS5kb1Bvc3RMYXlvdXQgPSBmdW5jdGlvbiAoKSB7XG4gIC8vYXNzZXJ0ICFpc1N1YkxheW91dCA6IFwiU2hvdWxkIG5vdCBiZSBjYWxsZWQgb24gc3ViLWxheW91dCFcIjtcbiAgLy8gUHJvcGFnYXRlIGdlb21ldHJpYyBjaGFuZ2VzIHRvIHYtbGV2ZWwgb2JqZWN0c1xuICBpZiAoIXRoaXMuaW5jcmVtZW50YWwpIHtcbiAgICB0aGlzLnRyYW5zZm9ybSgpO1xuICB9XG4gIHRoaXMudXBkYXRlKCk7XG59O1xuXG4vKipcclxuICogVGhpcyBtZXRob2QgdXBkYXRlcyB0aGUgZ2VvbWV0cnkgb2YgdGhlIHRhcmdldCBncmFwaCBhY2NvcmRpbmcgdG9cclxuICogY2FsY3VsYXRlZCBsYXlvdXQuXHJcbiAqL1xuTGF5b3V0LnByb3RvdHlwZS51cGRhdGUyID0gZnVuY3Rpb24gKCkge1xuICAvLyB1cGRhdGUgYmVuZCBwb2ludHNcbiAgaWYgKHRoaXMuY3JlYXRlQmVuZHNBc05lZWRlZCkge1xuICAgIHRoaXMuY3JlYXRlQmVuZHBvaW50c0Zyb21EdW1teU5vZGVzKCk7XG5cbiAgICAvLyByZXNldCBhbGwgZWRnZXMsIHNpbmNlIHRoZSB0b3BvbG9neSBoYXMgY2hhbmdlZFxuICAgIHRoaXMuZ3JhcGhNYW5hZ2VyLnJlc2V0QWxsRWRnZXMoKTtcbiAgfVxuXG4gIC8vIHBlcmZvcm0gZWRnZSwgbm9kZSBhbmQgcm9vdCB1cGRhdGVzIGlmIGxheW91dCBpcyBub3QgY2FsbGVkXG4gIC8vIHJlbW90ZWx5XG4gIGlmICghdGhpcy5pc1JlbW90ZVVzZSkge1xuICAgIC8vIHVwZGF0ZSBhbGwgZWRnZXNcbiAgICB2YXIgZWRnZTtcbiAgICB2YXIgYWxsRWRnZXMgPSB0aGlzLmdyYXBoTWFuYWdlci5nZXRBbGxFZGdlcygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYWxsRWRnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGVkZ2UgPSBhbGxFZGdlc1tpXTtcbiAgICAgIC8vICAgICAgdGhpcy51cGRhdGUoZWRnZSk7XG4gICAgfVxuXG4gICAgLy8gcmVjdXJzaXZlbHkgdXBkYXRlIG5vZGVzXG4gICAgdmFyIG5vZGU7XG4gICAgdmFyIG5vZGVzID0gdGhpcy5ncmFwaE1hbmFnZXIuZ2V0Um9vdCgpLmdldE5vZGVzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgLy8gICAgICB0aGlzLnVwZGF0ZShub2RlKTtcbiAgICB9XG5cbiAgICAvLyB1cGRhdGUgcm9vdCBncmFwaFxuICAgIHRoaXMudXBkYXRlKHRoaXMuZ3JhcGhNYW5hZ2VyLmdldFJvb3QoKSk7XG4gIH1cbn07XG5cbkxheW91dC5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKG9iaikge1xuICBpZiAob2JqID09IG51bGwpIHtcbiAgICB0aGlzLnVwZGF0ZTIoKTtcbiAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBMTm9kZSkge1xuICAgIHZhciBub2RlID0gb2JqO1xuICAgIGlmIChub2RlLmdldENoaWxkKCkgIT0gbnVsbCkge1xuICAgICAgLy8gc2luY2Ugbm9kZSBpcyBjb21wb3VuZCwgcmVjdXJzaXZlbHkgdXBkYXRlIGNoaWxkIG5vZGVzXG4gICAgICB2YXIgbm9kZXMgPSBub2RlLmdldENoaWxkKCkuZ2V0Tm9kZXMoKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdXBkYXRlKG5vZGVzW2ldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBpZiB0aGUgbC1sZXZlbCBub2RlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHYtbGV2ZWwgZ3JhcGggb2JqZWN0LFxuICAgIC8vIHRoZW4gaXQgaXMgYXNzdW1lZCB0aGF0IHRoZSB2LWxldmVsIG5vZGUgaW1wbGVtZW50cyB0aGVcbiAgICAvLyBpbnRlcmZhY2UgVXBkYXRhYmxlLlxuICAgIGlmIChub2RlLnZHcmFwaE9iamVjdCAhPSBudWxsKSB7XG4gICAgICAvLyBjYXN0IHRvIFVwZGF0YWJsZSB3aXRob3V0IGFueSB0eXBlIGNoZWNrXG4gICAgICB2YXIgdk5vZGUgPSBub2RlLnZHcmFwaE9iamVjdDtcblxuICAgICAgLy8gY2FsbCB0aGUgdXBkYXRlIG1ldGhvZCBvZiB0aGUgaW50ZXJmYWNlXG4gICAgICB2Tm9kZS51cGRhdGUobm9kZSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIExFZGdlKSB7XG4gICAgdmFyIGVkZ2UgPSBvYmo7XG4gICAgLy8gaWYgdGhlIGwtbGV2ZWwgZWRnZSBpcyBhc3NvY2lhdGVkIHdpdGggYSB2LWxldmVsIGdyYXBoIG9iamVjdCxcbiAgICAvLyB0aGVuIGl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgdi1sZXZlbCBlZGdlIGltcGxlbWVudHMgdGhlXG4gICAgLy8gaW50ZXJmYWNlIFVwZGF0YWJsZS5cblxuICAgIGlmIChlZGdlLnZHcmFwaE9iamVjdCAhPSBudWxsKSB7XG4gICAgICAvLyBjYXN0IHRvIFVwZGF0YWJsZSB3aXRob3V0IGFueSB0eXBlIGNoZWNrXG4gICAgICB2YXIgdkVkZ2UgPSBlZGdlLnZHcmFwaE9iamVjdDtcblxuICAgICAgLy8gY2FsbCB0aGUgdXBkYXRlIG1ldGhvZCBvZiB0aGUgaW50ZXJmYWNlXG4gICAgICB2RWRnZS51cGRhdGUoZWRnZSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIExHcmFwaCkge1xuICAgIHZhciBncmFwaCA9IG9iajtcbiAgICAvLyBpZiB0aGUgbC1sZXZlbCBncmFwaCBpcyBhc3NvY2lhdGVkIHdpdGggYSB2LWxldmVsIGdyYXBoIG9iamVjdCxcbiAgICAvLyB0aGVuIGl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgdi1sZXZlbCBvYmplY3QgaW1wbGVtZW50cyB0aGVcbiAgICAvLyBpbnRlcmZhY2UgVXBkYXRhYmxlLlxuXG4gICAgaWYgKGdyYXBoLnZHcmFwaE9iamVjdCAhPSBudWxsKSB7XG4gICAgICAvLyBjYXN0IHRvIFVwZGF0YWJsZSB3aXRob3V0IGFueSB0eXBlIGNoZWNrXG4gICAgICB2YXIgdkdyYXBoID0gZ3JhcGgudkdyYXBoT2JqZWN0O1xuXG4gICAgICAvLyBjYWxsIHRoZSB1cGRhdGUgbWV0aG9kIG9mIHRoZSBpbnRlcmZhY2VcbiAgICAgIHZHcmFwaC51cGRhdGUoZ3JhcGgpO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXHJcbiAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gc2V0IGFsbCBsYXlvdXQgcGFyYW1ldGVycyB0byBkZWZhdWx0IHZhbHVlc1xyXG4gKiBkZXRlcm1pbmVkIGF0IGNvbXBpbGUgdGltZS5cclxuICovXG5MYXlvdXQucHJvdG90eXBlLmluaXRQYXJhbWV0ZXJzID0gZnVuY3Rpb24gKCkge1xuICBpZiAoIXRoaXMuaXNTdWJMYXlvdXQpIHtcbiAgICB0aGlzLmxheW91dFF1YWxpdHkgPSBMYXlvdXRDb25zdGFudHMuUVVBTElUWTtcbiAgICB0aGlzLmFuaW1hdGlvbkR1cmluZ0xheW91dCA9IExheW91dENvbnN0YW50cy5ERUZBVUxUX0FOSU1BVElPTl9EVVJJTkdfTEFZT1VUO1xuICAgIHRoaXMuYW5pbWF0aW9uUGVyaW9kID0gTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQU5JTUFUSU9OX1BFUklPRDtcbiAgICB0aGlzLmFuaW1hdGlvbk9uTGF5b3V0ID0gTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQU5JTUFUSU9OX09OX0xBWU9VVDtcbiAgICB0aGlzLmluY3JlbWVudGFsID0gTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfSU5DUkVNRU5UQUw7XG4gICAgdGhpcy5jcmVhdGVCZW5kc0FzTmVlZGVkID0gTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQ1JFQVRFX0JFTkRTX0FTX05FRURFRDtcbiAgICB0aGlzLnVuaWZvcm1MZWFmTm9kZVNpemVzID0gTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfVU5JRk9STV9MRUFGX05PREVfU0laRVM7XG4gIH1cblxuICBpZiAodGhpcy5hbmltYXRpb25EdXJpbmdMYXlvdXQpIHtcbiAgICB0aGlzLmFuaW1hdGlvbk9uTGF5b3V0ID0gZmFsc2U7XG4gIH1cbn07XG5cbkxheW91dC5wcm90b3R5cGUudHJhbnNmb3JtID0gZnVuY3Rpb24gKG5ld0xlZnRUb3ApIHtcbiAgaWYgKG5ld0xlZnRUb3AgPT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpcy50cmFuc2Zvcm0obmV3IFBvaW50RCgwLCAwKSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gY3JlYXRlIGEgdHJhbnNmb3JtYXRpb24gb2JqZWN0IChmcm9tIEVjbGlwc2UgdG8gbGF5b3V0KS4gV2hlbiBhblxuICAgIC8vIGludmVyc2UgdHJhbnNmb3JtIGlzIGFwcGxpZWQsIHdlIGdldCB1cHBlci1sZWZ0IGNvb3JkaW5hdGUgb2YgdGhlXG4gICAgLy8gZHJhd2luZyBvciB0aGUgcm9vdCBncmFwaCBhdCBnaXZlbiBpbnB1dCBjb29yZGluYXRlIChzb21lIG1hcmdpbnNcbiAgICAvLyBhbHJlYWR5IGluY2x1ZGVkIGluIGNhbGN1bGF0aW9uIG9mIGxlZnQtdG9wKS5cblxuICAgIHZhciB0cmFucyA9IG5ldyBUcmFuc2Zvcm0oKTtcbiAgICB2YXIgbGVmdFRvcCA9IHRoaXMuZ3JhcGhNYW5hZ2VyLmdldFJvb3QoKS51cGRhdGVMZWZ0VG9wKCk7XG5cbiAgICBpZiAobGVmdFRvcCAhPSBudWxsKSB7XG4gICAgICB0cmFucy5zZXRXb3JsZE9yZ1gobmV3TGVmdFRvcC54KTtcbiAgICAgIHRyYW5zLnNldFdvcmxkT3JnWShuZXdMZWZ0VG9wLnkpO1xuXG4gICAgICB0cmFucy5zZXREZXZpY2VPcmdYKGxlZnRUb3AueCk7XG4gICAgICB0cmFucy5zZXREZXZpY2VPcmdZKGxlZnRUb3AueSk7XG5cbiAgICAgIHZhciBub2RlcyA9IHRoaXMuZ2V0QWxsTm9kZXMoKTtcbiAgICAgIHZhciBub2RlO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgICAgbm9kZS50cmFuc2Zvcm0odHJhbnMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuTGF5b3V0LnByb3RvdHlwZS5wb3NpdGlvbk5vZGVzUmFuZG9tbHkgPSBmdW5jdGlvbiAoZ3JhcGgpIHtcblxuICBpZiAoZ3JhcGggPT0gdW5kZWZpbmVkKSB7XG4gICAgLy9hc3NlcnQgIXRoaXMuaW5jcmVtZW50YWw7XG4gICAgdGhpcy5wb3NpdGlvbk5vZGVzUmFuZG9tbHkodGhpcy5nZXRHcmFwaE1hbmFnZXIoKS5nZXRSb290KCkpO1xuICAgIHRoaXMuZ2V0R3JhcGhNYW5hZ2VyKCkuZ2V0Um9vdCgpLnVwZGF0ZUJvdW5kcyh0cnVlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbE5vZGU7XG4gICAgdmFyIGNoaWxkR3JhcGg7XG5cbiAgICB2YXIgbm9kZXMgPSBncmFwaC5nZXROb2RlcygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxOb2RlID0gbm9kZXNbaV07XG4gICAgICBjaGlsZEdyYXBoID0gbE5vZGUuZ2V0Q2hpbGQoKTtcblxuICAgICAgaWYgKGNoaWxkR3JhcGggPT0gbnVsbCkge1xuICAgICAgICBsTm9kZS5zY2F0dGVyKCk7XG4gICAgICB9IGVsc2UgaWYgKGNoaWxkR3JhcGguZ2V0Tm9kZXMoKS5sZW5ndGggPT0gMCkge1xuICAgICAgICBsTm9kZS5zY2F0dGVyKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBvc2l0aW9uTm9kZXNSYW5kb21seShjaGlsZEdyYXBoKTtcbiAgICAgICAgbE5vZGUudXBkYXRlQm91bmRzKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG4vKipcclxuICogVGhpcyBtZXRob2QgcmV0dXJucyBhIGxpc3Qgb2YgdHJlZXMgd2hlcmUgZWFjaCB0cmVlIGlzIHJlcHJlc2VudGVkIGFzIGFcclxuICogbGlzdCBvZiBsLW5vZGVzLiBUaGUgbWV0aG9kIHJldHVybnMgYSBsaXN0IG9mIHNpemUgMCB3aGVuOlxyXG4gKiAtIFRoZSBncmFwaCBpcyBub3QgZmxhdCBvclxyXG4gKiAtIE9uZSBvZiB0aGUgY29tcG9uZW50KHMpIG9mIHRoZSBncmFwaCBpcyBub3QgYSB0cmVlLlxyXG4gKi9cbkxheW91dC5wcm90b3R5cGUuZ2V0RmxhdEZvcmVzdCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGZsYXRGb3Jlc3QgPSBbXTtcbiAgdmFyIGlzRm9yZXN0ID0gdHJ1ZTtcblxuICAvLyBRdWljayByZWZlcmVuY2UgZm9yIGFsbCBub2RlcyBpbiB0aGUgZ3JhcGggbWFuYWdlciBhc3NvY2lhdGVkIHdpdGhcbiAgLy8gdGhpcyBsYXlvdXQuIFRoZSBsaXN0IHNob3VsZCBub3QgYmUgY2hhbmdlZC5cbiAgdmFyIGFsbE5vZGVzID0gdGhpcy5ncmFwaE1hbmFnZXIuZ2V0Um9vdCgpLmdldE5vZGVzKCk7XG5cbiAgLy8gRmlyc3QgYmUgc3VyZSB0aGF0IHRoZSBncmFwaCBpcyBmbGF0XG4gIHZhciBpc0ZsYXQgPSB0cnVlO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYWxsTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoYWxsTm9kZXNbaV0uZ2V0Q2hpbGQoKSAhPSBudWxsKSB7XG4gICAgICBpc0ZsYXQgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvLyBSZXR1cm4gZW1wdHkgZm9yZXN0IGlmIHRoZSBncmFwaCBpcyBub3QgZmxhdC5cbiAgaWYgKCFpc0ZsYXQpIHtcbiAgICByZXR1cm4gZmxhdEZvcmVzdDtcbiAgfVxuXG4gIC8vIFJ1biBCRlMgZm9yIGVhY2ggY29tcG9uZW50IG9mIHRoZSBncmFwaC5cblxuICB2YXIgdmlzaXRlZCA9IG5ldyBTZXQoKTtcbiAgdmFyIHRvQmVWaXNpdGVkID0gW107XG4gIHZhciBwYXJlbnRzID0gbmV3IE1hcCgpO1xuICB2YXIgdW5Qcm9jZXNzZWROb2RlcyA9IFtdO1xuXG4gIHVuUHJvY2Vzc2VkTm9kZXMgPSB1blByb2Nlc3NlZE5vZGVzLmNvbmNhdChhbGxOb2Rlcyk7XG5cbiAgLy8gRWFjaCBpdGVyYXRpb24gb2YgdGhpcyBsb29wIGZpbmRzIGEgY29tcG9uZW50IG9mIHRoZSBncmFwaCBhbmRcbiAgLy8gZGVjaWRlcyB3aGV0aGVyIGl0IGlzIGEgdHJlZSBvciBub3QuIElmIGl0IGlzIGEgdHJlZSwgYWRkcyBpdCB0byB0aGVcbiAgLy8gZm9yZXN0IGFuZCBjb250aW51ZWQgd2l0aCB0aGUgbmV4dCBjb21wb25lbnQuXG5cbiAgd2hpbGUgKHVuUHJvY2Vzc2VkTm9kZXMubGVuZ3RoID4gMCAmJiBpc0ZvcmVzdCkge1xuICAgIHRvQmVWaXNpdGVkLnB1c2godW5Qcm9jZXNzZWROb2Rlc1swXSk7XG5cbiAgICAvLyBTdGFydCB0aGUgQkZTLiBFYWNoIGl0ZXJhdGlvbiBvZiB0aGlzIGxvb3AgdmlzaXRzIGEgbm9kZSBpbiBhXG4gICAgLy8gQkZTIG1hbm5lci5cbiAgICB3aGlsZSAodG9CZVZpc2l0ZWQubGVuZ3RoID4gMCAmJiBpc0ZvcmVzdCkge1xuICAgICAgLy9wb29sIG9wZXJhdGlvblxuICAgICAgdmFyIGN1cnJlbnROb2RlID0gdG9CZVZpc2l0ZWRbMF07XG4gICAgICB0b0JlVmlzaXRlZC5zcGxpY2UoMCwgMSk7XG4gICAgICB2aXNpdGVkLmFkZChjdXJyZW50Tm9kZSk7XG5cbiAgICAgIC8vIFRyYXZlcnNlIGFsbCBuZWlnaGJvcnMgb2YgdGhpcyBub2RlXG4gICAgICB2YXIgbmVpZ2hib3JFZGdlcyA9IGN1cnJlbnROb2RlLmdldEVkZ2VzKCk7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmVpZ2hib3JFZGdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY3VycmVudE5laWdoYm9yID0gbmVpZ2hib3JFZGdlc1tpXS5nZXRPdGhlckVuZChjdXJyZW50Tm9kZSk7XG5cbiAgICAgICAgLy8gSWYgQkZTIGlzIG5vdCBncm93aW5nIGZyb20gdGhpcyBuZWlnaGJvci5cbiAgICAgICAgaWYgKHBhcmVudHMuZ2V0KGN1cnJlbnROb2RlKSAhPSBjdXJyZW50TmVpZ2hib3IpIHtcbiAgICAgICAgICAvLyBXZSBoYXZlbid0IHByZXZpb3VzbHkgdmlzaXRlZCB0aGlzIG5laWdoYm9yLlxuICAgICAgICAgIGlmICghdmlzaXRlZC5oYXMoY3VycmVudE5laWdoYm9yKSkge1xuICAgICAgICAgICAgdG9CZVZpc2l0ZWQucHVzaChjdXJyZW50TmVpZ2hib3IpO1xuICAgICAgICAgICAgcGFyZW50cy5zZXQoY3VycmVudE5laWdoYm9yLCBjdXJyZW50Tm9kZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFNpbmNlIHdlIGhhdmUgcHJldmlvdXNseSB2aXNpdGVkIHRoaXMgbmVpZ2hib3IgYW5kXG4gICAgICAgICAgLy8gdGhpcyBuZWlnaGJvciBpcyBub3QgcGFyZW50IG9mIGN1cnJlbnROb2RlLCBnaXZlblxuICAgICAgICAgIC8vIGdyYXBoIGNvbnRhaW5zIGEgY29tcG9uZW50IHRoYXQgaXMgbm90IHRyZWUsIGhlbmNlXG4gICAgICAgICAgLy8gaXQgaXMgbm90IGEgZm9yZXN0LlxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICBpc0ZvcmVzdCA9IGZhbHNlO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoZSBncmFwaCBjb250YWlucyBhIGNvbXBvbmVudCB0aGF0IGlzIG5vdCBhIHRyZWUuIEVtcHR5XG4gICAgLy8gcHJldmlvdXNseSBmb3VuZCB0cmVlcy4gVGhlIG1ldGhvZCB3aWxsIGVuZC5cbiAgICBpZiAoIWlzRm9yZXN0KSB7XG4gICAgICBmbGF0Rm9yZXN0ID0gW107XG4gICAgfVxuICAgIC8vIFNhdmUgY3VycmVudGx5IHZpc2l0ZWQgbm9kZXMgYXMgYSB0cmVlIGluIG91ciBmb3Jlc3QuIFJlc2V0XG4gICAgLy8gdmlzaXRlZCBhbmQgcGFyZW50cyBsaXN0cy4gQ29udGludWUgd2l0aCB0aGUgbmV4dCBjb21wb25lbnQgb2ZcbiAgICAvLyB0aGUgZ3JhcGgsIGlmIGFueS5cbiAgICBlbHNlIHtcbiAgICAgICAgdmFyIHRlbXAgPSBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHZpc2l0ZWQpKTtcbiAgICAgICAgZmxhdEZvcmVzdC5wdXNoKHRlbXApO1xuICAgICAgICAvL2ZsYXRGb3Jlc3QgPSBmbGF0Rm9yZXN0LmNvbmNhdCh0ZW1wKTtcbiAgICAgICAgLy91blByb2Nlc3NlZE5vZGVzLnJlbW92ZUFsbCh2aXNpdGVkKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZW1wLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIHZhbHVlID0gdGVtcFtpXTtcbiAgICAgICAgICB2YXIgaW5kZXggPSB1blByb2Nlc3NlZE5vZGVzLmluZGV4T2YodmFsdWUpO1xuICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICB1blByb2Nlc3NlZE5vZGVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZpc2l0ZWQgPSBuZXcgU2V0KCk7XG4gICAgICAgIHBhcmVudHMgPSBuZXcgTWFwKCk7XG4gICAgICB9XG4gIH1cblxuICByZXR1cm4gZmxhdEZvcmVzdDtcbn07XG5cbi8qKlxyXG4gKiBUaGlzIG1ldGhvZCBjcmVhdGVzIGR1bW15IG5vZGVzIChhbiBsLWxldmVsIG5vZGUgd2l0aCBtaW5pbWFsIGRpbWVuc2lvbnMpXHJcbiAqIGZvciB0aGUgZ2l2ZW4gZWRnZSAob25lIHBlciBiZW5kcG9pbnQpLiBUaGUgZXhpc3RpbmcgbC1sZXZlbCBzdHJ1Y3R1cmVcclxuICogaXMgdXBkYXRlZCBhY2NvcmRpbmdseS5cclxuICovXG5MYXlvdXQucHJvdG90eXBlLmNyZWF0ZUR1bW15Tm9kZXNGb3JCZW5kcG9pbnRzID0gZnVuY3Rpb24gKGVkZ2UpIHtcbiAgdmFyIGR1bW15Tm9kZXMgPSBbXTtcbiAgdmFyIHByZXYgPSBlZGdlLnNvdXJjZTtcblxuICB2YXIgZ3JhcGggPSB0aGlzLmdyYXBoTWFuYWdlci5jYWxjTG93ZXN0Q29tbW9uQW5jZXN0b3IoZWRnZS5zb3VyY2UsIGVkZ2UudGFyZ2V0KTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGVkZ2UuYmVuZHBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgIC8vIGNyZWF0ZSBuZXcgZHVtbXkgbm9kZVxuICAgIHZhciBkdW1teU5vZGUgPSB0aGlzLm5ld05vZGUobnVsbCk7XG4gICAgZHVtbXlOb2RlLnNldFJlY3QobmV3IFBvaW50KDAsIDApLCBuZXcgRGltZW5zaW9uKDEsIDEpKTtcblxuICAgIGdyYXBoLmFkZChkdW1teU5vZGUpO1xuXG4gICAgLy8gY3JlYXRlIG5ldyBkdW1teSBlZGdlIGJldHdlZW4gcHJldiBhbmQgZHVtbXkgbm9kZVxuICAgIHZhciBkdW1teUVkZ2UgPSB0aGlzLm5ld0VkZ2UobnVsbCk7XG4gICAgdGhpcy5ncmFwaE1hbmFnZXIuYWRkKGR1bW15RWRnZSwgcHJldiwgZHVtbXlOb2RlKTtcblxuICAgIGR1bW15Tm9kZXMuYWRkKGR1bW15Tm9kZSk7XG4gICAgcHJldiA9IGR1bW15Tm9kZTtcbiAgfVxuXG4gIHZhciBkdW1teUVkZ2UgPSB0aGlzLm5ld0VkZ2UobnVsbCk7XG4gIHRoaXMuZ3JhcGhNYW5hZ2VyLmFkZChkdW1teUVkZ2UsIHByZXYsIGVkZ2UudGFyZ2V0KTtcblxuICB0aGlzLmVkZ2VUb0R1bW15Tm9kZXMuc2V0KGVkZ2UsIGR1bW15Tm9kZXMpO1xuXG4gIC8vIHJlbW92ZSByZWFsIGVkZ2UgZnJvbSBncmFwaCBtYW5hZ2VyIGlmIGl0IGlzIGludGVyLWdyYXBoXG4gIGlmIChlZGdlLmlzSW50ZXJHcmFwaCgpKSB7XG4gICAgdGhpcy5ncmFwaE1hbmFnZXIucmVtb3ZlKGVkZ2UpO1xuICB9XG4gIC8vIGVsc2UsIHJlbW92ZSB0aGUgZWRnZSBmcm9tIHRoZSBjdXJyZW50IGdyYXBoXG4gIGVsc2Uge1xuICAgICAgZ3JhcGgucmVtb3ZlKGVkZ2UpO1xuICAgIH1cblxuICByZXR1cm4gZHVtbXlOb2Rlcztcbn07XG5cbi8qKlxyXG4gKiBUaGlzIG1ldGhvZCBjcmVhdGVzIGJlbmRwb2ludHMgZm9yIGVkZ2VzIGZyb20gdGhlIGR1bW15IG5vZGVzXHJcbiAqIGF0IGwtbGV2ZWwuXHJcbiAqL1xuTGF5b3V0LnByb3RvdHlwZS5jcmVhdGVCZW5kcG9pbnRzRnJvbUR1bW15Tm9kZXMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBlZGdlcyA9IFtdO1xuICBlZGdlcyA9IGVkZ2VzLmNvbmNhdCh0aGlzLmdyYXBoTWFuYWdlci5nZXRBbGxFZGdlcygpKTtcbiAgZWRnZXMgPSBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHRoaXMuZWRnZVRvRHVtbXlOb2Rlcy5rZXlzKCkpKS5jb25jYXQoZWRnZXMpO1xuXG4gIGZvciAodmFyIGsgPSAwOyBrIDwgZWRnZXMubGVuZ3RoOyBrKyspIHtcbiAgICB2YXIgbEVkZ2UgPSBlZGdlc1trXTtcblxuICAgIGlmIChsRWRnZS5iZW5kcG9pbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhciBwYXRoID0gdGhpcy5lZGdlVG9EdW1teU5vZGVzLmdldChsRWRnZSk7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZHVtbXlOb2RlID0gcGF0aFtpXTtcbiAgICAgICAgdmFyIHAgPSBuZXcgUG9pbnREKGR1bW15Tm9kZS5nZXRDZW50ZXJYKCksIGR1bW15Tm9kZS5nZXRDZW50ZXJZKCkpO1xuXG4gICAgICAgIC8vIHVwZGF0ZSBiZW5kcG9pbnQncyBsb2NhdGlvbiBhY2NvcmRpbmcgdG8gZHVtbXkgbm9kZVxuICAgICAgICB2YXIgZWJwID0gbEVkZ2UuYmVuZHBvaW50cy5nZXQoaSk7XG4gICAgICAgIGVicC54ID0gcC54O1xuICAgICAgICBlYnAueSA9IHAueTtcblxuICAgICAgICAvLyByZW1vdmUgdGhlIGR1bW15IG5vZGUsIGR1bW15IGVkZ2VzIGluY2lkZW50IHdpdGggdGhpc1xuICAgICAgICAvLyBkdW1teSBub2RlIGlzIGFsc28gcmVtb3ZlZCAod2l0aGluIHRoZSByZW1vdmUgbWV0aG9kKVxuICAgICAgICBkdW1teU5vZGUuZ2V0T3duZXIoKS5yZW1vdmUoZHVtbXlOb2RlKTtcbiAgICAgIH1cblxuICAgICAgLy8gYWRkIHRoZSByZWFsIGVkZ2UgdG8gZ3JhcGhcbiAgICAgIHRoaXMuZ3JhcGhNYW5hZ2VyLmFkZChsRWRnZSwgbEVkZ2Uuc291cmNlLCBsRWRnZS50YXJnZXQpO1xuICAgIH1cbiAgfVxufTtcblxuTGF5b3V0LnRyYW5zZm9ybSA9IGZ1bmN0aW9uIChzbGlkZXJWYWx1ZSwgZGVmYXVsdFZhbHVlLCBtaW5EaXYsIG1heE11bCkge1xuICBpZiAobWluRGl2ICE9IHVuZGVmaW5lZCAmJiBtYXhNdWwgIT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIHZhbHVlID0gZGVmYXVsdFZhbHVlO1xuXG4gICAgaWYgKHNsaWRlclZhbHVlIDw9IDUwKSB7XG4gICAgICB2YXIgbWluVmFsdWUgPSBkZWZhdWx0VmFsdWUgLyBtaW5EaXY7XG4gICAgICB2YWx1ZSAtPSAoZGVmYXVsdFZhbHVlIC0gbWluVmFsdWUpIC8gNTAgKiAoNTAgLSBzbGlkZXJWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBtYXhWYWx1ZSA9IGRlZmF1bHRWYWx1ZSAqIG1heE11bDtcbiAgICAgIHZhbHVlICs9IChtYXhWYWx1ZSAtIGRlZmF1bHRWYWx1ZSkgLyA1MCAqIChzbGlkZXJWYWx1ZSAtIDUwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGEsIGI7XG5cbiAgICBpZiAoc2xpZGVyVmFsdWUgPD0gNTApIHtcbiAgICAgIGEgPSA5LjAgKiBkZWZhdWx0VmFsdWUgLyA1MDAuMDtcbiAgICAgIGIgPSBkZWZhdWx0VmFsdWUgLyAxMC4wO1xuICAgIH0gZWxzZSB7XG4gICAgICBhID0gOS4wICogZGVmYXVsdFZhbHVlIC8gNTAuMDtcbiAgICAgIGIgPSAtOCAqIGRlZmF1bHRWYWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gYSAqIHNsaWRlclZhbHVlICsgYjtcbiAgfVxufTtcblxuLyoqXHJcbiAqIFRoaXMgbWV0aG9kIGZpbmRzIGFuZCByZXR1cm5zIHRoZSBjZW50ZXIgb2YgdGhlIGdpdmVuIG5vZGVzLCBhc3N1bWluZ1xyXG4gKiB0aGF0IHRoZSBnaXZlbiBub2RlcyBmb3JtIGEgdHJlZSBpbiB0aGVtc2VsdmVzLlxyXG4gKi9cbkxheW91dC5maW5kQ2VudGVyT2ZUcmVlID0gZnVuY3Rpb24gKG5vZGVzKSB7XG4gIHZhciBsaXN0ID0gW107XG4gIGxpc3QgPSBsaXN0LmNvbmNhdChub2Rlcyk7XG5cbiAgdmFyIHJlbW92ZWROb2RlcyA9IFtdO1xuICB2YXIgcmVtYWluaW5nRGVncmVlcyA9IG5ldyBNYXAoKTtcbiAgdmFyIGZvdW5kQ2VudGVyID0gZmFsc2U7XG4gIHZhciBjZW50ZXJOb2RlID0gbnVsbDtcblxuICBpZiAobGlzdC5sZW5ndGggPT0gMSB8fCBsaXN0Lmxlbmd0aCA9PSAyKSB7XG4gICAgZm91bmRDZW50ZXIgPSB0cnVlO1xuICAgIGNlbnRlck5vZGUgPSBsaXN0WzBdO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG5vZGUgPSBsaXN0W2ldO1xuICAgIHZhciBkZWdyZWUgPSBub2RlLmdldE5laWdoYm9yc0xpc3QoKS5zaXplO1xuICAgIHJlbWFpbmluZ0RlZ3JlZXMuc2V0KG5vZGUsIG5vZGUuZ2V0TmVpZ2hib3JzTGlzdCgpLnNpemUpO1xuXG4gICAgaWYgKGRlZ3JlZSA9PSAxKSB7XG4gICAgICByZW1vdmVkTm9kZXMucHVzaChub2RlKTtcbiAgICB9XG4gIH1cblxuICB2YXIgdGVtcExpc3QgPSBbXTtcbiAgdGVtcExpc3QgPSB0ZW1wTGlzdC5jb25jYXQocmVtb3ZlZE5vZGVzKTtcblxuICB3aGlsZSAoIWZvdW5kQ2VudGVyKSB7XG4gICAgdmFyIHRlbXBMaXN0MiA9IFtdO1xuICAgIHRlbXBMaXN0MiA9IHRlbXBMaXN0Mi5jb25jYXQodGVtcExpc3QpO1xuICAgIHRlbXBMaXN0ID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBub2RlID0gbGlzdFtpXTtcblxuICAgICAgdmFyIGluZGV4ID0gbGlzdC5pbmRleE9mKG5vZGUpO1xuICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgbGlzdC5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfVxuXG4gICAgICB2YXIgbmVpZ2hib3VycyA9IG5vZGUuZ2V0TmVpZ2hib3JzTGlzdCgpO1xuXG4gICAgICBuZWlnaGJvdXJzLmZvckVhY2goZnVuY3Rpb24gKG5laWdoYm91cikge1xuICAgICAgICBpZiAocmVtb3ZlZE5vZGVzLmluZGV4T2YobmVpZ2hib3VyKSA8IDApIHtcbiAgICAgICAgICB2YXIgb3RoZXJEZWdyZWUgPSByZW1haW5pbmdEZWdyZWVzLmdldChuZWlnaGJvdXIpO1xuICAgICAgICAgIHZhciBuZXdEZWdyZWUgPSBvdGhlckRlZ3JlZSAtIDE7XG5cbiAgICAgICAgICBpZiAobmV3RGVncmVlID09IDEpIHtcbiAgICAgICAgICAgIHRlbXBMaXN0LnB1c2gobmVpZ2hib3VyKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZW1haW5pbmdEZWdyZWVzLnNldChuZWlnaGJvdXIsIG5ld0RlZ3JlZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlbW92ZWROb2RlcyA9IHJlbW92ZWROb2Rlcy5jb25jYXQodGVtcExpc3QpO1xuXG4gICAgaWYgKGxpc3QubGVuZ3RoID09IDEgfHwgbGlzdC5sZW5ndGggPT0gMikge1xuICAgICAgZm91bmRDZW50ZXIgPSB0cnVlO1xuICAgICAgY2VudGVyTm9kZSA9IGxpc3RbMF07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNlbnRlck5vZGU7XG59O1xuXG4vKipcclxuICogRHVyaW5nIHRoZSBjb2Fyc2VuaW5nIHByb2Nlc3MsIHRoaXMgbGF5b3V0IG1heSBiZSByZWZlcmVuY2VkIGJ5IHR3byBncmFwaCBtYW5hZ2Vyc1xyXG4gKiB0aGlzIHNldHRlciBmdW5jdGlvbiBncmFudHMgYWNjZXNzIHRvIGNoYW5nZSB0aGUgY3VycmVudGx5IGJlaW5nIHVzZWQgZ3JhcGggbWFuYWdlclxyXG4gKi9cbkxheW91dC5wcm90b3R5cGUuc2V0R3JhcGhNYW5hZ2VyID0gZnVuY3Rpb24gKGdtKSB7XG4gIHRoaXMuZ3JhcGhNYW5hZ2VyID0gZ207XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IExheW91dDtcblxuLyoqKi8gfSksXG4vKiAxNiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5mdW5jdGlvbiBSYW5kb21TZWVkKCkge31cbi8vIGFkYXB0ZWQgZnJvbTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE5MzAzNzI1XG5SYW5kb21TZWVkLnNlZWQgPSAxO1xuUmFuZG9tU2VlZC54ID0gMDtcblxuUmFuZG9tU2VlZC5uZXh0RG91YmxlID0gZnVuY3Rpb24gKCkge1xuICBSYW5kb21TZWVkLnggPSBNYXRoLnNpbihSYW5kb21TZWVkLnNlZWQrKykgKiAxMDAwMDtcbiAgcmV0dXJuIFJhbmRvbVNlZWQueCAtIE1hdGguZmxvb3IoUmFuZG9tU2VlZC54KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmFuZG9tU2VlZDtcblxuLyoqKi8gfSksXG4vKiAxNyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgUG9pbnREID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTtcblxuZnVuY3Rpb24gVHJhbnNmb3JtKHgsIHkpIHtcbiAgdGhpcy5sd29ybGRPcmdYID0gMC4wO1xuICB0aGlzLmx3b3JsZE9yZ1kgPSAwLjA7XG4gIHRoaXMubGRldmljZU9yZ1ggPSAwLjA7XG4gIHRoaXMubGRldmljZU9yZ1kgPSAwLjA7XG4gIHRoaXMubHdvcmxkRXh0WCA9IDEuMDtcbiAgdGhpcy5sd29ybGRFeHRZID0gMS4wO1xuICB0aGlzLmxkZXZpY2VFeHRYID0gMS4wO1xuICB0aGlzLmxkZXZpY2VFeHRZID0gMS4wO1xufVxuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLmdldFdvcmxkT3JnWCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubHdvcmxkT3JnWDtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuc2V0V29ybGRPcmdYID0gZnVuY3Rpb24gKHdveCkge1xuICB0aGlzLmx3b3JsZE9yZ1ggPSB3b3g7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLmdldFdvcmxkT3JnWSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubHdvcmxkT3JnWTtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuc2V0V29ybGRPcmdZID0gZnVuY3Rpb24gKHdveSkge1xuICB0aGlzLmx3b3JsZE9yZ1kgPSB3b3k7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLmdldFdvcmxkRXh0WCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubHdvcmxkRXh0WDtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuc2V0V29ybGRFeHRYID0gZnVuY3Rpb24gKHdleCkge1xuICB0aGlzLmx3b3JsZEV4dFggPSB3ZXg7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLmdldFdvcmxkRXh0WSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubHdvcmxkRXh0WTtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuc2V0V29ybGRFeHRZID0gZnVuY3Rpb24gKHdleSkge1xuICB0aGlzLmx3b3JsZEV4dFkgPSB3ZXk7XG59O1xuXG4vKiBEZXZpY2UgcmVsYXRlZCAqL1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLmdldERldmljZU9yZ1ggPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmxkZXZpY2VPcmdYO1xufTtcblxuVHJhbnNmb3JtLnByb3RvdHlwZS5zZXREZXZpY2VPcmdYID0gZnVuY3Rpb24gKGRveCkge1xuICB0aGlzLmxkZXZpY2VPcmdYID0gZG94O1xufTtcblxuVHJhbnNmb3JtLnByb3RvdHlwZS5nZXREZXZpY2VPcmdZID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5sZGV2aWNlT3JnWTtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuc2V0RGV2aWNlT3JnWSA9IGZ1bmN0aW9uIChkb3kpIHtcbiAgdGhpcy5sZGV2aWNlT3JnWSA9IGRveTtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuZ2V0RGV2aWNlRXh0WCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubGRldmljZUV4dFg7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLnNldERldmljZUV4dFggPSBmdW5jdGlvbiAoZGV4KSB7XG4gIHRoaXMubGRldmljZUV4dFggPSBkZXg7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLmdldERldmljZUV4dFkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmxkZXZpY2VFeHRZO1xufTtcblxuVHJhbnNmb3JtLnByb3RvdHlwZS5zZXREZXZpY2VFeHRZID0gZnVuY3Rpb24gKGRleSkge1xuICB0aGlzLmxkZXZpY2VFeHRZID0gZGV5O1xufTtcblxuVHJhbnNmb3JtLnByb3RvdHlwZS50cmFuc2Zvcm1YID0gZnVuY3Rpb24gKHgpIHtcbiAgdmFyIHhEZXZpY2UgPSAwLjA7XG4gIHZhciB3b3JsZEV4dFggPSB0aGlzLmx3b3JsZEV4dFg7XG4gIGlmICh3b3JsZEV4dFggIT0gMC4wKSB7XG4gICAgeERldmljZSA9IHRoaXMubGRldmljZU9yZ1ggKyAoeCAtIHRoaXMubHdvcmxkT3JnWCkgKiB0aGlzLmxkZXZpY2VFeHRYIC8gd29ybGRFeHRYO1xuICB9XG5cbiAgcmV0dXJuIHhEZXZpY2U7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLnRyYW5zZm9ybVkgPSBmdW5jdGlvbiAoeSkge1xuICB2YXIgeURldmljZSA9IDAuMDtcbiAgdmFyIHdvcmxkRXh0WSA9IHRoaXMubHdvcmxkRXh0WTtcbiAgaWYgKHdvcmxkRXh0WSAhPSAwLjApIHtcbiAgICB5RGV2aWNlID0gdGhpcy5sZGV2aWNlT3JnWSArICh5IC0gdGhpcy5sd29ybGRPcmdZKSAqIHRoaXMubGRldmljZUV4dFkgLyB3b3JsZEV4dFk7XG4gIH1cblxuICByZXR1cm4geURldmljZTtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuaW52ZXJzZVRyYW5zZm9ybVggPSBmdW5jdGlvbiAoeCkge1xuICB2YXIgeFdvcmxkID0gMC4wO1xuICB2YXIgZGV2aWNlRXh0WCA9IHRoaXMubGRldmljZUV4dFg7XG4gIGlmIChkZXZpY2VFeHRYICE9IDAuMCkge1xuICAgIHhXb3JsZCA9IHRoaXMubHdvcmxkT3JnWCArICh4IC0gdGhpcy5sZGV2aWNlT3JnWCkgKiB0aGlzLmx3b3JsZEV4dFggLyBkZXZpY2VFeHRYO1xuICB9XG5cbiAgcmV0dXJuIHhXb3JsZDtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuaW52ZXJzZVRyYW5zZm9ybVkgPSBmdW5jdGlvbiAoeSkge1xuICB2YXIgeVdvcmxkID0gMC4wO1xuICB2YXIgZGV2aWNlRXh0WSA9IHRoaXMubGRldmljZUV4dFk7XG4gIGlmIChkZXZpY2VFeHRZICE9IDAuMCkge1xuICAgIHlXb3JsZCA9IHRoaXMubHdvcmxkT3JnWSArICh5IC0gdGhpcy5sZGV2aWNlT3JnWSkgKiB0aGlzLmx3b3JsZEV4dFkgLyBkZXZpY2VFeHRZO1xuICB9XG4gIHJldHVybiB5V29ybGQ7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLmludmVyc2VUcmFuc2Zvcm1Qb2ludCA9IGZ1bmN0aW9uIChpblBvaW50KSB7XG4gIHZhciBvdXRQb2ludCA9IG5ldyBQb2ludEQodGhpcy5pbnZlcnNlVHJhbnNmb3JtWChpblBvaW50LngpLCB0aGlzLmludmVyc2VUcmFuc2Zvcm1ZKGluUG9pbnQueSkpO1xuICByZXR1cm4gb3V0UG9pbnQ7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFRyYW5zZm9ybTtcblxuLyoqKi8gfSksXG4vKiAxOCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5mdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBBcnJheShhcnIubGVuZ3RoKTsgaSA8IGFyci5sZW5ndGg7IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9IGVsc2UgeyByZXR1cm4gQXJyYXkuZnJvbShhcnIpOyB9IH1cblxudmFyIExheW91dCA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpO1xudmFyIEZETGF5b3V0Q29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcbnZhciBMYXlvdXRDb25zdGFudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xudmFyIElHZW9tZXRyeSA9IF9fd2VicGFja19yZXF1aXJlX18oOCk7XG52YXIgSU1hdGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpO1xuXG5mdW5jdGlvbiBGRExheW91dCgpIHtcbiAgTGF5b3V0LmNhbGwodGhpcyk7XG5cbiAgdGhpcy51c2VTbWFydElkZWFsRWRnZUxlbmd0aENhbGN1bGF0aW9uID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9VU0VfU01BUlRfSURFQUxfRURHRV9MRU5HVEhfQ0FMQ1VMQVRJT047XG4gIHRoaXMuZ3Jhdml0eUNvbnN0YW50ID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9HUkFWSVRZX1NUUkVOR1RIO1xuICB0aGlzLmNvbXBvdW5kR3Jhdml0eUNvbnN0YW50ID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9DT01QT1VORF9HUkFWSVRZX1NUUkVOR1RIO1xuICB0aGlzLmdyYXZpdHlSYW5nZUZhY3RvciA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfR1JBVklUWV9SQU5HRV9GQUNUT1I7XG4gIHRoaXMuY29tcG91bmRHcmF2aXR5UmFuZ2VGYWN0b3IgPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0NPTVBPVU5EX0dSQVZJVFlfUkFOR0VfRkFDVE9SO1xuICB0aGlzLmRpc3BsYWNlbWVudFRocmVzaG9sZFBlck5vZGUgPSAzLjAgKiBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIIC8gMTAwO1xuICB0aGlzLmNvb2xpbmdGYWN0b3IgPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0NPT0xJTkdfRkFDVE9SX0lOQ1JFTUVOVEFMO1xuICB0aGlzLmluaXRpYWxDb29saW5nRmFjdG9yID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9DT09MSU5HX0ZBQ1RPUl9JTkNSRU1FTlRBTDtcbiAgdGhpcy50b3RhbERpc3BsYWNlbWVudCA9IDAuMDtcbiAgdGhpcy5vbGRUb3RhbERpc3BsYWNlbWVudCA9IDAuMDtcbiAgdGhpcy5tYXhJdGVyYXRpb25zID0gRkRMYXlvdXRDb25zdGFudHMuTUFYX0lURVJBVElPTlM7XG59XG5cbkZETGF5b3V0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoTGF5b3V0LnByb3RvdHlwZSk7XG5cbmZvciAodmFyIHByb3AgaW4gTGF5b3V0KSB7XG4gIEZETGF5b3V0W3Byb3BdID0gTGF5b3V0W3Byb3BdO1xufVxuXG5GRExheW91dC5wcm90b3R5cGUuaW5pdFBhcmFtZXRlcnMgPSBmdW5jdGlvbiAoKSB7XG4gIExheW91dC5wcm90b3R5cGUuaW5pdFBhcmFtZXRlcnMuY2FsbCh0aGlzLCBhcmd1bWVudHMpO1xuXG4gIHRoaXMudG90YWxJdGVyYXRpb25zID0gMDtcbiAgdGhpcy5ub3RBbmltYXRlZEl0ZXJhdGlvbnMgPSAwO1xuXG4gIHRoaXMudXNlRlJHcmlkVmFyaWFudCA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfVVNFX1NNQVJUX1JFUFVMU0lPTl9SQU5HRV9DQUxDVUxBVElPTjtcblxuICB0aGlzLmdyaWQgPSBbXTtcbn07XG5cbkZETGF5b3V0LnByb3RvdHlwZS5jYWxjSWRlYWxFZGdlTGVuZ3RocyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGVkZ2U7XG4gIHZhciBvcmlnaW5hbElkZWFsTGVuZ3RoO1xuICB2YXIgbGNhRGVwdGg7XG4gIHZhciBzb3VyY2U7XG4gIHZhciB0YXJnZXQ7XG4gIHZhciBzaXplT2ZTb3VyY2VJbkxjYTtcbiAgdmFyIHNpemVPZlRhcmdldEluTGNhO1xuXG4gIHZhciBhbGxFZGdlcyA9IHRoaXMuZ2V0R3JhcGhNYW5hZ2VyKCkuZ2V0QWxsRWRnZXMoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbGxFZGdlcy5sZW5ndGg7IGkrKykge1xuICAgIGVkZ2UgPSBhbGxFZGdlc1tpXTtcblxuICAgIG9yaWdpbmFsSWRlYWxMZW5ndGggPSBlZGdlLmlkZWFsTGVuZ3RoO1xuXG4gICAgaWYgKGVkZ2UuaXNJbnRlckdyYXBoKSB7XG4gICAgICBzb3VyY2UgPSBlZGdlLmdldFNvdXJjZSgpO1xuICAgICAgdGFyZ2V0ID0gZWRnZS5nZXRUYXJnZXQoKTtcblxuICAgICAgc2l6ZU9mU291cmNlSW5MY2EgPSBlZGdlLmdldFNvdXJjZUluTGNhKCkuZ2V0RXN0aW1hdGVkU2l6ZSgpO1xuICAgICAgc2l6ZU9mVGFyZ2V0SW5MY2EgPSBlZGdlLmdldFRhcmdldEluTGNhKCkuZ2V0RXN0aW1hdGVkU2l6ZSgpO1xuXG4gICAgICBpZiAodGhpcy51c2VTbWFydElkZWFsRWRnZUxlbmd0aENhbGN1bGF0aW9uKSB7XG4gICAgICAgIGVkZ2UuaWRlYWxMZW5ndGggKz0gc2l6ZU9mU291cmNlSW5MY2EgKyBzaXplT2ZUYXJnZXRJbkxjYSAtIDIgKiBMYXlvdXRDb25zdGFudHMuU0lNUExFX05PREVfU0laRTtcbiAgICAgIH1cblxuICAgICAgbGNhRGVwdGggPSBlZGdlLmdldExjYSgpLmdldEluY2x1c2lvblRyZWVEZXB0aCgpO1xuXG4gICAgICBlZGdlLmlkZWFsTGVuZ3RoICs9IG9yaWdpbmFsSWRlYWxMZW5ndGggKiBGRExheW91dENvbnN0YW50cy5QRVJfTEVWRUxfSURFQUxfRURHRV9MRU5HVEhfRkFDVE9SICogKHNvdXJjZS5nZXRJbmNsdXNpb25UcmVlRGVwdGgoKSArIHRhcmdldC5nZXRJbmNsdXNpb25UcmVlRGVwdGgoKSAtIDIgKiBsY2FEZXB0aCk7XG4gICAgfVxuICB9XG59O1xuXG5GRExheW91dC5wcm90b3R5cGUuaW5pdFNwcmluZ0VtYmVkZGVyID0gZnVuY3Rpb24gKCkge1xuXG4gIHZhciBzID0gdGhpcy5nZXRBbGxOb2RlcygpLmxlbmd0aDtcbiAgaWYgKHRoaXMuaW5jcmVtZW50YWwpIHtcbiAgICBpZiAocyA+IEZETGF5b3V0Q29uc3RhbnRzLkFEQVBUQVRJT05fTE9XRVJfTk9ERV9MSU1JVCkge1xuICAgICAgdGhpcy5jb29saW5nRmFjdG9yID0gTWF0aC5tYXgodGhpcy5jb29saW5nRmFjdG9yICogRkRMYXlvdXRDb25zdGFudHMuQ09PTElOR19BREFQVEFUSU9OX0ZBQ1RPUiwgdGhpcy5jb29saW5nRmFjdG9yIC0gKHMgLSBGRExheW91dENvbnN0YW50cy5BREFQVEFUSU9OX0xPV0VSX05PREVfTElNSVQpIC8gKEZETGF5b3V0Q29uc3RhbnRzLkFEQVBUQVRJT05fVVBQRVJfTk9ERV9MSU1JVCAtIEZETGF5b3V0Q29uc3RhbnRzLkFEQVBUQVRJT05fTE9XRVJfTk9ERV9MSU1JVCkgKiB0aGlzLmNvb2xpbmdGYWN0b3IgKiAoMSAtIEZETGF5b3V0Q29uc3RhbnRzLkNPT0xJTkdfQURBUFRBVElPTl9GQUNUT1IpKTtcbiAgICB9XG4gICAgdGhpcy5tYXhOb2RlRGlzcGxhY2VtZW50ID0gRkRMYXlvdXRDb25zdGFudHMuTUFYX05PREVfRElTUExBQ0VNRU5UX0lOQ1JFTUVOVEFMO1xuICB9IGVsc2Uge1xuICAgIGlmIChzID4gRkRMYXlvdXRDb25zdGFudHMuQURBUFRBVElPTl9MT1dFUl9OT0RFX0xJTUlUKSB7XG4gICAgICB0aGlzLmNvb2xpbmdGYWN0b3IgPSBNYXRoLm1heChGRExheW91dENvbnN0YW50cy5DT09MSU5HX0FEQVBUQVRJT05fRkFDVE9SLCAxLjAgLSAocyAtIEZETGF5b3V0Q29uc3RhbnRzLkFEQVBUQVRJT05fTE9XRVJfTk9ERV9MSU1JVCkgLyAoRkRMYXlvdXRDb25zdGFudHMuQURBUFRBVElPTl9VUFBFUl9OT0RFX0xJTUlUIC0gRkRMYXlvdXRDb25zdGFudHMuQURBUFRBVElPTl9MT1dFUl9OT0RFX0xJTUlUKSAqICgxIC0gRkRMYXlvdXRDb25zdGFudHMuQ09PTElOR19BREFQVEFUSU9OX0ZBQ1RPUikpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvb2xpbmdGYWN0b3IgPSAxLjA7XG4gICAgfVxuICAgIHRoaXMuaW5pdGlhbENvb2xpbmdGYWN0b3IgPSB0aGlzLmNvb2xpbmdGYWN0b3I7XG4gICAgdGhpcy5tYXhOb2RlRGlzcGxhY2VtZW50ID0gRkRMYXlvdXRDb25zdGFudHMuTUFYX05PREVfRElTUExBQ0VNRU5UO1xuICB9XG5cbiAgdGhpcy5tYXhJdGVyYXRpb25zID0gTWF0aC5tYXgodGhpcy5nZXRBbGxOb2RlcygpLmxlbmd0aCAqIDUsIHRoaXMubWF4SXRlcmF0aW9ucyk7XG5cbiAgLy8gUmVhc3NpZ24gdGhpcyBhdHRyaWJ1dGUgYnkgdXNpbmcgbmV3IGNvbnN0YW50IHZhbHVlXG4gIHRoaXMuZGlzcGxhY2VtZW50VGhyZXNob2xkUGVyTm9kZSA9IDMuMCAqIEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfRURHRV9MRU5HVEggLyAxMDA7XG4gIHRoaXMudG90YWxEaXNwbGFjZW1lbnRUaHJlc2hvbGQgPSB0aGlzLmRpc3BsYWNlbWVudFRocmVzaG9sZFBlck5vZGUgKiB0aGlzLmdldEFsbE5vZGVzKCkubGVuZ3RoO1xuXG4gIHRoaXMucmVwdWxzaW9uUmFuZ2UgPSB0aGlzLmNhbGNSZXB1bHNpb25SYW5nZSgpO1xufTtcblxuRkRMYXlvdXQucHJvdG90eXBlLmNhbGNTcHJpbmdGb3JjZXMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBsRWRnZXMgPSB0aGlzLmdldEFsbEVkZ2VzKCk7XG4gIHZhciBlZGdlO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbEVkZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgZWRnZSA9IGxFZGdlc1tpXTtcblxuICAgIHRoaXMuY2FsY1NwcmluZ0ZvcmNlKGVkZ2UsIGVkZ2UuaWRlYWxMZW5ndGgpO1xuICB9XG59O1xuXG5GRExheW91dC5wcm90b3R5cGUuY2FsY1JlcHVsc2lvbkZvcmNlcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGdyaWRVcGRhdGVBbGxvd2VkID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB0cnVlO1xuICB2YXIgZm9yY2VUb05vZGVTdXJyb3VuZGluZ1VwZGF0ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG5cbiAgdmFyIGksIGo7XG4gIHZhciBub2RlQSwgbm9kZUI7XG4gIHZhciBsTm9kZXMgPSB0aGlzLmdldEFsbE5vZGVzKCk7XG4gIHZhciBwcm9jZXNzZWROb2RlU2V0O1xuXG4gIGlmICh0aGlzLnVzZUZSR3JpZFZhcmlhbnQpIHtcbiAgICBpZiAodGhpcy50b3RhbEl0ZXJhdGlvbnMgJSBGRExheW91dENvbnN0YW50cy5HUklEX0NBTENVTEFUSU9OX0NIRUNLX1BFUklPRCA9PSAxICYmIGdyaWRVcGRhdGVBbGxvd2VkKSB7XG4gICAgICB0aGlzLnVwZGF0ZUdyaWQoKTtcbiAgICB9XG5cbiAgICBwcm9jZXNzZWROb2RlU2V0ID0gbmV3IFNldCgpO1xuXG4gICAgLy8gY2FsY3VsYXRlIHJlcHVsc2lvbiBmb3JjZXMgYmV0d2VlbiBlYWNoIG5vZGVzIGFuZCBpdHMgc3Vycm91bmRpbmdcbiAgICBmb3IgKGkgPSAwOyBpIDwgbE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBub2RlQSA9IGxOb2Rlc1tpXTtcbiAgICAgIHRoaXMuY2FsY3VsYXRlUmVwdWxzaW9uRm9yY2VPZkFOb2RlKG5vZGVBLCBwcm9jZXNzZWROb2RlU2V0LCBncmlkVXBkYXRlQWxsb3dlZCwgZm9yY2VUb05vZGVTdXJyb3VuZGluZ1VwZGF0ZSk7XG4gICAgICBwcm9jZXNzZWROb2RlU2V0LmFkZChub2RlQSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAoaSA9IDA7IGkgPCBsTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG5vZGVBID0gbE5vZGVzW2ldO1xuXG4gICAgICBmb3IgKGogPSBpICsgMTsgaiA8IGxOb2Rlcy5sZW5ndGg7IGorKykge1xuICAgICAgICBub2RlQiA9IGxOb2Rlc1tqXTtcblxuICAgICAgICAvLyBJZiBib3RoIG5vZGVzIGFyZSBub3QgbWVtYmVycyBvZiB0aGUgc2FtZSBncmFwaCwgc2tpcC5cbiAgICAgICAgaWYgKG5vZGVBLmdldE93bmVyKCkgIT0gbm9kZUIuZ2V0T3duZXIoKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jYWxjUmVwdWxzaW9uRm9yY2Uobm9kZUEsIG5vZGVCKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbkZETGF5b3V0LnByb3RvdHlwZS5jYWxjR3Jhdml0YXRpb25hbEZvcmNlcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIG5vZGU7XG4gIHZhciBsTm9kZXMgPSB0aGlzLmdldEFsbE5vZGVzVG9BcHBseUdyYXZpdGF0aW9uKCk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICBub2RlID0gbE5vZGVzW2ldO1xuICAgIHRoaXMuY2FsY0dyYXZpdGF0aW9uYWxGb3JjZShub2RlKTtcbiAgfVxufTtcblxuRkRMYXlvdXQucHJvdG90eXBlLm1vdmVOb2RlcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGxOb2RlcyA9IHRoaXMuZ2V0QWxsTm9kZXMoKTtcbiAgdmFyIG5vZGU7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICBub2RlID0gbE5vZGVzW2ldO1xuICAgIG5vZGUubW92ZSgpO1xuICB9XG59O1xuXG5GRExheW91dC5wcm90b3R5cGUuY2FsY1NwcmluZ0ZvcmNlID0gZnVuY3Rpb24gKGVkZ2UsIGlkZWFsTGVuZ3RoKSB7XG4gIHZhciBzb3VyY2VOb2RlID0gZWRnZS5nZXRTb3VyY2UoKTtcbiAgdmFyIHRhcmdldE5vZGUgPSBlZGdlLmdldFRhcmdldCgpO1xuXG4gIHZhciBsZW5ndGg7XG4gIHZhciBzcHJpbmdGb3JjZTtcbiAgdmFyIHNwcmluZ0ZvcmNlWDtcbiAgdmFyIHNwcmluZ0ZvcmNlWTtcblxuICAvLyBVcGRhdGUgZWRnZSBsZW5ndGhcbiAgaWYgKHRoaXMudW5pZm9ybUxlYWZOb2RlU2l6ZXMgJiYgc291cmNlTm9kZS5nZXRDaGlsZCgpID09IG51bGwgJiYgdGFyZ2V0Tm9kZS5nZXRDaGlsZCgpID09IG51bGwpIHtcbiAgICBlZGdlLnVwZGF0ZUxlbmd0aFNpbXBsZSgpO1xuICB9IGVsc2Uge1xuICAgIGVkZ2UudXBkYXRlTGVuZ3RoKCk7XG5cbiAgICBpZiAoZWRnZS5pc092ZXJsYXBpbmdTb3VyY2VBbmRUYXJnZXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBsZW5ndGggPSBlZGdlLmdldExlbmd0aCgpO1xuXG4gIGlmIChsZW5ndGggPT0gMCkgcmV0dXJuO1xuXG4gIC8vIENhbGN1bGF0ZSBzcHJpbmcgZm9yY2VzXG4gIHNwcmluZ0ZvcmNlID0gZWRnZS5lZGdlRWxhc3RpY2l0eSAqIChsZW5ndGggLSBpZGVhbExlbmd0aCk7XG5cbiAgLy8gUHJvamVjdCBmb3JjZSBvbnRvIHggYW5kIHkgYXhlc1xuICBzcHJpbmdGb3JjZVggPSBzcHJpbmdGb3JjZSAqIChlZGdlLmxlbmd0aFggLyBsZW5ndGgpO1xuICBzcHJpbmdGb3JjZVkgPSBzcHJpbmdGb3JjZSAqIChlZGdlLmxlbmd0aFkgLyBsZW5ndGgpO1xuXG4gIC8vIEFwcGx5IGZvcmNlcyBvbiB0aGUgZW5kIG5vZGVzXG4gIHNvdXJjZU5vZGUuc3ByaW5nRm9yY2VYICs9IHNwcmluZ0ZvcmNlWDtcbiAgc291cmNlTm9kZS5zcHJpbmdGb3JjZVkgKz0gc3ByaW5nRm9yY2VZO1xuICB0YXJnZXROb2RlLnNwcmluZ0ZvcmNlWCAtPSBzcHJpbmdGb3JjZVg7XG4gIHRhcmdldE5vZGUuc3ByaW5nRm9yY2VZIC09IHNwcmluZ0ZvcmNlWTtcbn07XG5cbkZETGF5b3V0LnByb3RvdHlwZS5jYWxjUmVwdWxzaW9uRm9yY2UgPSBmdW5jdGlvbiAobm9kZUEsIG5vZGVCKSB7XG4gIHZhciByZWN0QSA9IG5vZGVBLmdldFJlY3QoKTtcbiAgdmFyIHJlY3RCID0gbm9kZUIuZ2V0UmVjdCgpO1xuICB2YXIgb3ZlcmxhcEFtb3VudCA9IG5ldyBBcnJheSgyKTtcbiAgdmFyIGNsaXBQb2ludHMgPSBuZXcgQXJyYXkoNCk7XG4gIHZhciBkaXN0YW5jZVg7XG4gIHZhciBkaXN0YW5jZVk7XG4gIHZhciBkaXN0YW5jZVNxdWFyZWQ7XG4gIHZhciBkaXN0YW5jZTtcbiAgdmFyIHJlcHVsc2lvbkZvcmNlO1xuICB2YXIgcmVwdWxzaW9uRm9yY2VYO1xuICB2YXIgcmVwdWxzaW9uRm9yY2VZO1xuXG4gIGlmIChyZWN0QS5pbnRlcnNlY3RzKHJlY3RCKSkgLy8gdHdvIG5vZGVzIG92ZXJsYXBcbiAgICB7XG4gICAgICAvLyBjYWxjdWxhdGUgc2VwYXJhdGlvbiBhbW91bnQgaW4geCBhbmQgeSBkaXJlY3Rpb25zXG4gICAgICBJR2VvbWV0cnkuY2FsY1NlcGFyYXRpb25BbW91bnQocmVjdEEsIHJlY3RCLCBvdmVybGFwQW1vdW50LCBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIIC8gMi4wKTtcblxuICAgICAgcmVwdWxzaW9uRm9yY2VYID0gMiAqIG92ZXJsYXBBbW91bnRbMF07XG4gICAgICByZXB1bHNpb25Gb3JjZVkgPSAyICogb3ZlcmxhcEFtb3VudFsxXTtcblxuICAgICAgdmFyIGNoaWxkcmVuQ29uc3RhbnQgPSBub2RlQS5ub09mQ2hpbGRyZW4gKiBub2RlQi5ub09mQ2hpbGRyZW4gLyAobm9kZUEubm9PZkNoaWxkcmVuICsgbm9kZUIubm9PZkNoaWxkcmVuKTtcblxuICAgICAgLy8gQXBwbHkgZm9yY2VzIG9uIHRoZSB0d28gbm9kZXNcbiAgICAgIG5vZGVBLnJlcHVsc2lvbkZvcmNlWCAtPSBjaGlsZHJlbkNvbnN0YW50ICogcmVwdWxzaW9uRm9yY2VYO1xuICAgICAgbm9kZUEucmVwdWxzaW9uRm9yY2VZIC09IGNoaWxkcmVuQ29uc3RhbnQgKiByZXB1bHNpb25Gb3JjZVk7XG4gICAgICBub2RlQi5yZXB1bHNpb25Gb3JjZVggKz0gY2hpbGRyZW5Db25zdGFudCAqIHJlcHVsc2lvbkZvcmNlWDtcbiAgICAgIG5vZGVCLnJlcHVsc2lvbkZvcmNlWSArPSBjaGlsZHJlbkNvbnN0YW50ICogcmVwdWxzaW9uRm9yY2VZO1xuICAgIH0gZWxzZSAvLyBubyBvdmVybGFwXG4gICAge1xuICAgICAgLy8gY2FsY3VsYXRlIGRpc3RhbmNlXG5cbiAgICAgIGlmICh0aGlzLnVuaWZvcm1MZWFmTm9kZVNpemVzICYmIG5vZGVBLmdldENoaWxkKCkgPT0gbnVsbCAmJiBub2RlQi5nZXRDaGlsZCgpID09IG51bGwpIC8vIHNpbXBseSBiYXNlIHJlcHVsc2lvbiBvbiBkaXN0YW5jZSBvZiBub2RlIGNlbnRlcnNcbiAgICAgICAge1xuICAgICAgICAgIGRpc3RhbmNlWCA9IHJlY3RCLmdldENlbnRlclgoKSAtIHJlY3RBLmdldENlbnRlclgoKTtcbiAgICAgICAgICBkaXN0YW5jZVkgPSByZWN0Qi5nZXRDZW50ZXJZKCkgLSByZWN0QS5nZXRDZW50ZXJZKCk7XG4gICAgICAgIH0gZWxzZSAvLyB1c2UgY2xpcHBpbmcgcG9pbnRzXG4gICAgICAgIHtcbiAgICAgICAgICBJR2VvbWV0cnkuZ2V0SW50ZXJzZWN0aW9uKHJlY3RBLCByZWN0QiwgY2xpcFBvaW50cyk7XG5cbiAgICAgICAgICBkaXN0YW5jZVggPSBjbGlwUG9pbnRzWzJdIC0gY2xpcFBvaW50c1swXTtcbiAgICAgICAgICBkaXN0YW5jZVkgPSBjbGlwUG9pbnRzWzNdIC0gY2xpcFBvaW50c1sxXTtcbiAgICAgICAgfVxuXG4gICAgICAvLyBObyByZXB1bHNpb24gcmFuZ2UuIEZSIGdyaWQgdmFyaWFudCBzaG91bGQgdGFrZSBjYXJlIG9mIHRoaXMuXG4gICAgICBpZiAoTWF0aC5hYnMoZGlzdGFuY2VYKSA8IEZETGF5b3V0Q29uc3RhbnRzLk1JTl9SRVBVTFNJT05fRElTVCkge1xuICAgICAgICBkaXN0YW5jZVggPSBJTWF0aC5zaWduKGRpc3RhbmNlWCkgKiBGRExheW91dENvbnN0YW50cy5NSU5fUkVQVUxTSU9OX0RJU1Q7XG4gICAgICB9XG5cbiAgICAgIGlmIChNYXRoLmFicyhkaXN0YW5jZVkpIDwgRkRMYXlvdXRDb25zdGFudHMuTUlOX1JFUFVMU0lPTl9ESVNUKSB7XG4gICAgICAgIGRpc3RhbmNlWSA9IElNYXRoLnNpZ24oZGlzdGFuY2VZKSAqIEZETGF5b3V0Q29uc3RhbnRzLk1JTl9SRVBVTFNJT05fRElTVDtcbiAgICAgIH1cblxuICAgICAgZGlzdGFuY2VTcXVhcmVkID0gZGlzdGFuY2VYICogZGlzdGFuY2VYICsgZGlzdGFuY2VZICogZGlzdGFuY2VZO1xuICAgICAgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZGlzdGFuY2VTcXVhcmVkKTtcblxuICAgICAgLy8gSGVyZSB3ZSB1c2UgaGFsZiBvZiB0aGUgbm9kZXMnIHJlcHVsc2lvbiB2YWx1ZXMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICAgIHJlcHVsc2lvbkZvcmNlID0gKG5vZGVBLm5vZGVSZXB1bHNpb24gLyAyICsgbm9kZUIubm9kZVJlcHVsc2lvbiAvIDIpICogbm9kZUEubm9PZkNoaWxkcmVuICogbm9kZUIubm9PZkNoaWxkcmVuIC8gZGlzdGFuY2VTcXVhcmVkO1xuXG4gICAgICAvLyBQcm9qZWN0IGZvcmNlIG9udG8geCBhbmQgeSBheGVzXG4gICAgICByZXB1bHNpb25Gb3JjZVggPSByZXB1bHNpb25Gb3JjZSAqIGRpc3RhbmNlWCAvIGRpc3RhbmNlO1xuICAgICAgcmVwdWxzaW9uRm9yY2VZID0gcmVwdWxzaW9uRm9yY2UgKiBkaXN0YW5jZVkgLyBkaXN0YW5jZTtcblxuICAgICAgLy8gQXBwbHkgZm9yY2VzIG9uIHRoZSB0d28gbm9kZXMgICAgXG4gICAgICBub2RlQS5yZXB1bHNpb25Gb3JjZVggLT0gcmVwdWxzaW9uRm9yY2VYO1xuICAgICAgbm9kZUEucmVwdWxzaW9uRm9yY2VZIC09IHJlcHVsc2lvbkZvcmNlWTtcbiAgICAgIG5vZGVCLnJlcHVsc2lvbkZvcmNlWCArPSByZXB1bHNpb25Gb3JjZVg7XG4gICAgICBub2RlQi5yZXB1bHNpb25Gb3JjZVkgKz0gcmVwdWxzaW9uRm9yY2VZO1xuICAgIH1cbn07XG5cbkZETGF5b3V0LnByb3RvdHlwZS5jYWxjR3Jhdml0YXRpb25hbEZvcmNlID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgdmFyIG93bmVyR3JhcGg7XG4gIHZhciBvd25lckNlbnRlclg7XG4gIHZhciBvd25lckNlbnRlclk7XG4gIHZhciBkaXN0YW5jZVg7XG4gIHZhciBkaXN0YW5jZVk7XG4gIHZhciBhYnNEaXN0YW5jZVg7XG4gIHZhciBhYnNEaXN0YW5jZVk7XG4gIHZhciBlc3RpbWF0ZWRTaXplO1xuICBvd25lckdyYXBoID0gbm9kZS5nZXRPd25lcigpO1xuXG4gIG93bmVyQ2VudGVyWCA9IChvd25lckdyYXBoLmdldFJpZ2h0KCkgKyBvd25lckdyYXBoLmdldExlZnQoKSkgLyAyO1xuICBvd25lckNlbnRlclkgPSAob3duZXJHcmFwaC5nZXRUb3AoKSArIG93bmVyR3JhcGguZ2V0Qm90dG9tKCkpIC8gMjtcbiAgZGlzdGFuY2VYID0gbm9kZS5nZXRDZW50ZXJYKCkgLSBvd25lckNlbnRlclg7XG4gIGRpc3RhbmNlWSA9IG5vZGUuZ2V0Q2VudGVyWSgpIC0gb3duZXJDZW50ZXJZO1xuICBhYnNEaXN0YW5jZVggPSBNYXRoLmFicyhkaXN0YW5jZVgpICsgbm9kZS5nZXRXaWR0aCgpIC8gMjtcbiAgYWJzRGlzdGFuY2VZID0gTWF0aC5hYnMoZGlzdGFuY2VZKSArIG5vZGUuZ2V0SGVpZ2h0KCkgLyAyO1xuXG4gIGlmIChub2RlLmdldE93bmVyKCkgPT0gdGhpcy5ncmFwaE1hbmFnZXIuZ2V0Um9vdCgpKSAvLyBpbiB0aGUgcm9vdCBncmFwaFxuICAgIHtcbiAgICAgIGVzdGltYXRlZFNpemUgPSBvd25lckdyYXBoLmdldEVzdGltYXRlZFNpemUoKSAqIHRoaXMuZ3Jhdml0eVJhbmdlRmFjdG9yO1xuXG4gICAgICBpZiAoYWJzRGlzdGFuY2VYID4gZXN0aW1hdGVkU2l6ZSB8fCBhYnNEaXN0YW5jZVkgPiBlc3RpbWF0ZWRTaXplKSB7XG4gICAgICAgIG5vZGUuZ3Jhdml0YXRpb25Gb3JjZVggPSAtdGhpcy5ncmF2aXR5Q29uc3RhbnQgKiBkaXN0YW5jZVg7XG4gICAgICAgIG5vZGUuZ3Jhdml0YXRpb25Gb3JjZVkgPSAtdGhpcy5ncmF2aXR5Q29uc3RhbnQgKiBkaXN0YW5jZVk7XG4gICAgICB9XG4gICAgfSBlbHNlIC8vIGluc2lkZSBhIGNvbXBvdW5kXG4gICAge1xuICAgICAgZXN0aW1hdGVkU2l6ZSA9IG93bmVyR3JhcGguZ2V0RXN0aW1hdGVkU2l6ZSgpICogdGhpcy5jb21wb3VuZEdyYXZpdHlSYW5nZUZhY3RvcjtcblxuICAgICAgaWYgKGFic0Rpc3RhbmNlWCA+IGVzdGltYXRlZFNpemUgfHwgYWJzRGlzdGFuY2VZID4gZXN0aW1hdGVkU2l6ZSkge1xuICAgICAgICBub2RlLmdyYXZpdGF0aW9uRm9yY2VYID0gLXRoaXMuZ3Jhdml0eUNvbnN0YW50ICogZGlzdGFuY2VYICogdGhpcy5jb21wb3VuZEdyYXZpdHlDb25zdGFudDtcbiAgICAgICAgbm9kZS5ncmF2aXRhdGlvbkZvcmNlWSA9IC10aGlzLmdyYXZpdHlDb25zdGFudCAqIGRpc3RhbmNlWSAqIHRoaXMuY29tcG91bmRHcmF2aXR5Q29uc3RhbnQ7XG4gICAgICB9XG4gICAgfVxufTtcblxuRkRMYXlvdXQucHJvdG90eXBlLmlzQ29udmVyZ2VkID0gZnVuY3Rpb24gKCkge1xuICB2YXIgY29udmVyZ2VkO1xuICB2YXIgb3NjaWxhdGluZyA9IGZhbHNlO1xuXG4gIGlmICh0aGlzLnRvdGFsSXRlcmF0aW9ucyA+IHRoaXMubWF4SXRlcmF0aW9ucyAvIDMpIHtcbiAgICBvc2NpbGF0aW5nID0gTWF0aC5hYnModGhpcy50b3RhbERpc3BsYWNlbWVudCAtIHRoaXMub2xkVG90YWxEaXNwbGFjZW1lbnQpIDwgMjtcbiAgfVxuXG4gIGNvbnZlcmdlZCA9IHRoaXMudG90YWxEaXNwbGFjZW1lbnQgPCB0aGlzLnRvdGFsRGlzcGxhY2VtZW50VGhyZXNob2xkO1xuXG4gIHRoaXMub2xkVG90YWxEaXNwbGFjZW1lbnQgPSB0aGlzLnRvdGFsRGlzcGxhY2VtZW50O1xuXG4gIHJldHVybiBjb252ZXJnZWQgfHwgb3NjaWxhdGluZztcbn07XG5cbkZETGF5b3V0LnByb3RvdHlwZS5hbmltYXRlID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5hbmltYXRpb25EdXJpbmdMYXlvdXQgJiYgIXRoaXMuaXNTdWJMYXlvdXQpIHtcbiAgICBpZiAodGhpcy5ub3RBbmltYXRlZEl0ZXJhdGlvbnMgPT0gdGhpcy5hbmltYXRpb25QZXJpb2QpIHtcbiAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgICB0aGlzLm5vdEFuaW1hdGVkSXRlcmF0aW9ucyA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubm90QW5pbWF0ZWRJdGVyYXRpb25zKys7XG4gICAgfVxuICB9XG59O1xuXG4vL1RoaXMgbWV0aG9kIGNhbGN1bGF0ZXMgdGhlIG51bWJlciBvZiBjaGlsZHJlbiAod2VpZ2h0KSBmb3IgYWxsIG5vZGVzXG5GRExheW91dC5wcm90b3R5cGUuY2FsY05vT2ZDaGlsZHJlbkZvckFsbE5vZGVzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbm9kZTtcbiAgdmFyIGFsbE5vZGVzID0gdGhpcy5ncmFwaE1hbmFnZXIuZ2V0QWxsTm9kZXMoKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgbm9kZSA9IGFsbE5vZGVzW2ldO1xuICAgIG5vZGUubm9PZkNoaWxkcmVuID0gbm9kZS5nZXROb09mQ2hpbGRyZW4oKTtcbiAgfVxufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNlY3Rpb246IEZSLUdyaWQgVmFyaWFudCBSZXB1bHNpb24gRm9yY2UgQ2FsY3VsYXRpb25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbkZETGF5b3V0LnByb3RvdHlwZS5jYWxjR3JpZCA9IGZ1bmN0aW9uIChncmFwaCkge1xuXG4gIHZhciBzaXplWCA9IDA7XG4gIHZhciBzaXplWSA9IDA7XG5cbiAgc2l6ZVggPSBwYXJzZUludChNYXRoLmNlaWwoKGdyYXBoLmdldFJpZ2h0KCkgLSBncmFwaC5nZXRMZWZ0KCkpIC8gdGhpcy5yZXB1bHNpb25SYW5nZSkpO1xuICBzaXplWSA9IHBhcnNlSW50KE1hdGguY2VpbCgoZ3JhcGguZ2V0Qm90dG9tKCkgLSBncmFwaC5nZXRUb3AoKSkgLyB0aGlzLnJlcHVsc2lvblJhbmdlKSk7XG5cbiAgdmFyIGdyaWQgPSBuZXcgQXJyYXkoc2l6ZVgpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZVg7IGkrKykge1xuICAgIGdyaWRbaV0gPSBuZXcgQXJyYXkoc2l6ZVkpO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplWDsgaSsrKSB7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBzaXplWTsgaisrKSB7XG4gICAgICBncmlkW2ldW2pdID0gbmV3IEFycmF5KCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGdyaWQ7XG59O1xuXG5GRExheW91dC5wcm90b3R5cGUuYWRkTm9kZVRvR3JpZCA9IGZ1bmN0aW9uICh2LCBsZWZ0LCB0b3ApIHtcblxuICB2YXIgc3RhcnRYID0gMDtcbiAgdmFyIGZpbmlzaFggPSAwO1xuICB2YXIgc3RhcnRZID0gMDtcbiAgdmFyIGZpbmlzaFkgPSAwO1xuXG4gIHN0YXJ0WCA9IHBhcnNlSW50KE1hdGguZmxvb3IoKHYuZ2V0UmVjdCgpLnggLSBsZWZ0KSAvIHRoaXMucmVwdWxzaW9uUmFuZ2UpKTtcbiAgZmluaXNoWCA9IHBhcnNlSW50KE1hdGguZmxvb3IoKHYuZ2V0UmVjdCgpLndpZHRoICsgdi5nZXRSZWN0KCkueCAtIGxlZnQpIC8gdGhpcy5yZXB1bHNpb25SYW5nZSkpO1xuICBzdGFydFkgPSBwYXJzZUludChNYXRoLmZsb29yKCh2LmdldFJlY3QoKS55IC0gdG9wKSAvIHRoaXMucmVwdWxzaW9uUmFuZ2UpKTtcbiAgZmluaXNoWSA9IHBhcnNlSW50KE1hdGguZmxvb3IoKHYuZ2V0UmVjdCgpLmhlaWdodCArIHYuZ2V0UmVjdCgpLnkgLSB0b3ApIC8gdGhpcy5yZXB1bHNpb25SYW5nZSkpO1xuXG4gIGZvciAodmFyIGkgPSBzdGFydFg7IGkgPD0gZmluaXNoWDsgaSsrKSB7XG4gICAgZm9yICh2YXIgaiA9IHN0YXJ0WTsgaiA8PSBmaW5pc2hZOyBqKyspIHtcbiAgICAgIHRoaXMuZ3JpZFtpXVtqXS5wdXNoKHYpO1xuICAgICAgdi5zZXRHcmlkQ29vcmRpbmF0ZXMoc3RhcnRYLCBmaW5pc2hYLCBzdGFydFksIGZpbmlzaFkpO1xuICAgIH1cbiAgfVxufTtcblxuRkRMYXlvdXQucHJvdG90eXBlLnVwZGF0ZUdyaWQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBpO1xuICB2YXIgbm9kZUE7XG4gIHZhciBsTm9kZXMgPSB0aGlzLmdldEFsbE5vZGVzKCk7XG5cbiAgdGhpcy5ncmlkID0gdGhpcy5jYWxjR3JpZCh0aGlzLmdyYXBoTWFuYWdlci5nZXRSb290KCkpO1xuXG4gIC8vIHB1dCBhbGwgbm9kZXMgdG8gcHJvcGVyIGdyaWQgY2VsbHNcbiAgZm9yIChpID0gMDsgaSA8IGxOb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIG5vZGVBID0gbE5vZGVzW2ldO1xuICAgIHRoaXMuYWRkTm9kZVRvR3JpZChub2RlQSwgdGhpcy5ncmFwaE1hbmFnZXIuZ2V0Um9vdCgpLmdldExlZnQoKSwgdGhpcy5ncmFwaE1hbmFnZXIuZ2V0Um9vdCgpLmdldFRvcCgpKTtcbiAgfVxufTtcblxuRkRMYXlvdXQucHJvdG90eXBlLmNhbGN1bGF0ZVJlcHVsc2lvbkZvcmNlT2ZBTm9kZSA9IGZ1bmN0aW9uIChub2RlQSwgcHJvY2Vzc2VkTm9kZVNldCwgZ3JpZFVwZGF0ZUFsbG93ZWQsIGZvcmNlVG9Ob2RlU3Vycm91bmRpbmdVcGRhdGUpIHtcblxuICBpZiAodGhpcy50b3RhbEl0ZXJhdGlvbnMgJSBGRExheW91dENvbnN0YW50cy5HUklEX0NBTENVTEFUSU9OX0NIRUNLX1BFUklPRCA9PSAxICYmIGdyaWRVcGRhdGVBbGxvd2VkIHx8IGZvcmNlVG9Ob2RlU3Vycm91bmRpbmdVcGRhdGUpIHtcbiAgICB2YXIgc3Vycm91bmRpbmcgPSBuZXcgU2V0KCk7XG4gICAgbm9kZUEuc3Vycm91bmRpbmcgPSBuZXcgQXJyYXkoKTtcbiAgICB2YXIgbm9kZUI7XG4gICAgdmFyIGdyaWQgPSB0aGlzLmdyaWQ7XG5cbiAgICBmb3IgKHZhciBpID0gbm9kZUEuc3RhcnRYIC0gMTsgaSA8IG5vZGVBLmZpbmlzaFggKyAyOyBpKyspIHtcbiAgICAgIGZvciAodmFyIGogPSBub2RlQS5zdGFydFkgLSAxOyBqIDwgbm9kZUEuZmluaXNoWSArIDI7IGorKykge1xuICAgICAgICBpZiAoIShpIDwgMCB8fCBqIDwgMCB8fCBpID49IGdyaWQubGVuZ3RoIHx8IGogPj0gZ3JpZFswXS5sZW5ndGgpKSB7XG4gICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBncmlkW2ldW2pdLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICBub2RlQiA9IGdyaWRbaV1bal1ba107XG5cbiAgICAgICAgICAgIC8vIElmIGJvdGggbm9kZXMgYXJlIG5vdCBtZW1iZXJzIG9mIHRoZSBzYW1lIGdyYXBoLCBcbiAgICAgICAgICAgIC8vIG9yIGJvdGggbm9kZXMgYXJlIHRoZSBzYW1lLCBza2lwLlxuICAgICAgICAgICAgaWYgKG5vZGVBLmdldE93bmVyKCkgIT0gbm9kZUIuZ2V0T3duZXIoKSB8fCBub2RlQSA9PSBub2RlQikge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIHJlcHVsc2lvbiBmb3JjZSBiZXR3ZWVuXG4gICAgICAgICAgICAvLyBub2RlQSBhbmQgbm9kZUIgaGFzIGFscmVhZHkgYmVlbiBjYWxjdWxhdGVkXG4gICAgICAgICAgICBpZiAoIXByb2Nlc3NlZE5vZGVTZXQuaGFzKG5vZGVCKSAmJiAhc3Vycm91bmRpbmcuaGFzKG5vZGVCKSkge1xuICAgICAgICAgICAgICB2YXIgZGlzdGFuY2VYID0gTWF0aC5hYnMobm9kZUEuZ2V0Q2VudGVyWCgpIC0gbm9kZUIuZ2V0Q2VudGVyWCgpKSAtIChub2RlQS5nZXRXaWR0aCgpIC8gMiArIG5vZGVCLmdldFdpZHRoKCkgLyAyKTtcbiAgICAgICAgICAgICAgdmFyIGRpc3RhbmNlWSA9IE1hdGguYWJzKG5vZGVBLmdldENlbnRlclkoKSAtIG5vZGVCLmdldENlbnRlclkoKSkgLSAobm9kZUEuZ2V0SGVpZ2h0KCkgLyAyICsgbm9kZUIuZ2V0SGVpZ2h0KCkgLyAyKTtcblxuICAgICAgICAgICAgICAvLyBpZiB0aGUgZGlzdGFuY2UgYmV0d2VlbiBub2RlQSBhbmQgbm9kZUIgXG4gICAgICAgICAgICAgIC8vIGlzIGxlc3MgdGhlbiBjYWxjdWxhdGlvbiByYW5nZVxuICAgICAgICAgICAgICBpZiAoZGlzdGFuY2VYIDw9IHRoaXMucmVwdWxzaW9uUmFuZ2UgJiYgZGlzdGFuY2VZIDw9IHRoaXMucmVwdWxzaW9uUmFuZ2UpIHtcbiAgICAgICAgICAgICAgICAvL3RoZW4gYWRkIG5vZGVCIHRvIHN1cnJvdW5kaW5nIG9mIG5vZGVBXG4gICAgICAgICAgICAgICAgc3Vycm91bmRpbmcuYWRkKG5vZGVCKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIG5vZGVBLnN1cnJvdW5kaW5nID0gW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShzdXJyb3VuZGluZykpO1xuICB9XG4gIGZvciAoaSA9IDA7IGkgPCBub2RlQS5zdXJyb3VuZGluZy5sZW5ndGg7IGkrKykge1xuICAgIHRoaXMuY2FsY1JlcHVsc2lvbkZvcmNlKG5vZGVBLCBub2RlQS5zdXJyb3VuZGluZ1tpXSk7XG4gIH1cbn07XG5cbkZETGF5b3V0LnByb3RvdHlwZS5jYWxjUmVwdWxzaW9uUmFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAwLjA7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEZETGF5b3V0O1xuXG4vKioqLyB9KSxcbi8qIDE5ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBMRWRnZSA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG52YXIgRkRMYXlvdXRDb25zdGFudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpO1xuXG5mdW5jdGlvbiBGRExheW91dEVkZ2Uoc291cmNlLCB0YXJnZXQsIHZFZGdlKSB7XG4gIExFZGdlLmNhbGwodGhpcywgc291cmNlLCB0YXJnZXQsIHZFZGdlKTtcblxuICAvLyBJZGVhbCBsZW5ndGggYW5kIGVsYXN0aWNpdHkgdmFsdWUgZm9yIHRoaXMgZWRnZVxuICB0aGlzLmlkZWFsTGVuZ3RoID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9FREdFX0xFTkdUSDtcbiAgdGhpcy5lZGdlRWxhc3RpY2l0eSA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfU1BSSU5HX1NUUkVOR1RIO1xufVxuXG5GRExheW91dEVkZ2UucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShMRWRnZS5wcm90b3R5cGUpO1xuXG5mb3IgKHZhciBwcm9wIGluIExFZGdlKSB7XG4gIEZETGF5b3V0RWRnZVtwcm9wXSA9IExFZGdlW3Byb3BdO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEZETGF5b3V0RWRnZTtcblxuLyoqKi8gfSksXG4vKiAyMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgTE5vZGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpO1xudmFyIEZETGF5b3V0Q29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcblxuZnVuY3Rpb24gRkRMYXlvdXROb2RlKGdtLCBsb2MsIHNpemUsIHZOb2RlKSB7XG4gIC8vIGFsdGVybmF0aXZlIGNvbnN0cnVjdG9yIGlzIGhhbmRsZWQgaW5zaWRlIExOb2RlXG4gIExOb2RlLmNhbGwodGhpcywgZ20sIGxvYywgc2l6ZSwgdk5vZGUpO1xuXG4gIC8vIFJlcHVsc2lvbiB2YWx1ZSBvZiB0aGlzIG5vZGVcbiAgdGhpcy5ub2RlUmVwdWxzaW9uID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9SRVBVTFNJT05fU1RSRU5HVEg7XG5cbiAgLy9TcHJpbmcsIHJlcHVsc2lvbiBhbmQgZ3Jhdml0YXRpb25hbCBmb3JjZXMgYWN0aW5nIG9uIHRoaXMgbm9kZVxuICB0aGlzLnNwcmluZ0ZvcmNlWCA9IDA7XG4gIHRoaXMuc3ByaW5nRm9yY2VZID0gMDtcbiAgdGhpcy5yZXB1bHNpb25Gb3JjZVggPSAwO1xuICB0aGlzLnJlcHVsc2lvbkZvcmNlWSA9IDA7XG4gIHRoaXMuZ3Jhdml0YXRpb25Gb3JjZVggPSAwO1xuICB0aGlzLmdyYXZpdGF0aW9uRm9yY2VZID0gMDtcbiAgLy9BbW91bnQgYnkgd2hpY2ggdGhpcyBub2RlIGlzIHRvIGJlIG1vdmVkIGluIHRoaXMgaXRlcmF0aW9uXG4gIHRoaXMuZGlzcGxhY2VtZW50WCA9IDA7XG4gIHRoaXMuZGlzcGxhY2VtZW50WSA9IDA7XG5cbiAgLy9TdGFydCBhbmQgZmluaXNoIGdyaWQgY29vcmRpbmF0ZXMgdGhhdCB0aGlzIG5vZGUgaXMgZmFsbGVuIGludG9cbiAgdGhpcy5zdGFydFggPSAwO1xuICB0aGlzLmZpbmlzaFggPSAwO1xuICB0aGlzLnN0YXJ0WSA9IDA7XG4gIHRoaXMuZmluaXNoWSA9IDA7XG5cbiAgLy9HZW9tZXRyaWMgbmVpZ2hib3JzIG9mIHRoaXMgbm9kZVxuICB0aGlzLnN1cnJvdW5kaW5nID0gW107XG59XG5cbkZETGF5b3V0Tm9kZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKExOb2RlLnByb3RvdHlwZSk7XG5cbmZvciAodmFyIHByb3AgaW4gTE5vZGUpIHtcbiAgRkRMYXlvdXROb2RlW3Byb3BdID0gTE5vZGVbcHJvcF07XG59XG5cbkZETGF5b3V0Tm9kZS5wcm90b3R5cGUuc2V0R3JpZENvb3JkaW5hdGVzID0gZnVuY3Rpb24gKF9zdGFydFgsIF9maW5pc2hYLCBfc3RhcnRZLCBfZmluaXNoWSkge1xuICB0aGlzLnN0YXJ0WCA9IF9zdGFydFg7XG4gIHRoaXMuZmluaXNoWCA9IF9maW5pc2hYO1xuICB0aGlzLnN0YXJ0WSA9IF9zdGFydFk7XG4gIHRoaXMuZmluaXNoWSA9IF9maW5pc2hZO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBGRExheW91dE5vZGU7XG5cbi8qKiovIH0pLFxuLyogMjEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuZnVuY3Rpb24gRGltZW5zaW9uRCh3aWR0aCwgaGVpZ2h0KSB7XG4gIHRoaXMud2lkdGggPSAwO1xuICB0aGlzLmhlaWdodCA9IDA7XG4gIGlmICh3aWR0aCAhPT0gbnVsbCAmJiBoZWlnaHQgIT09IG51bGwpIHtcbiAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gIH1cbn1cblxuRGltZW5zaW9uRC5wcm90b3R5cGUuZ2V0V2lkdGggPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLndpZHRoO1xufTtcblxuRGltZW5zaW9uRC5wcm90b3R5cGUuc2V0V2lkdGggPSBmdW5jdGlvbiAod2lkdGgpIHtcbiAgdGhpcy53aWR0aCA9IHdpZHRoO1xufTtcblxuRGltZW5zaW9uRC5wcm90b3R5cGUuZ2V0SGVpZ2h0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5oZWlnaHQ7XG59O1xuXG5EaW1lbnNpb25ELnByb3RvdHlwZS5zZXRIZWlnaHQgPSBmdW5jdGlvbiAoaGVpZ2h0KSB7XG4gIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBEaW1lbnNpb25EO1xuXG4vKioqLyB9KSxcbi8qIDIyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBVbmlxdWVJREdlbmVyZXRvciA9IF9fd2VicGFja19yZXF1aXJlX18oMTQpO1xuXG5mdW5jdGlvbiBIYXNoTWFwKCkge1xuICB0aGlzLm1hcCA9IHt9O1xuICB0aGlzLmtleXMgPSBbXTtcbn1cblxuSGFzaE1hcC5wcm90b3R5cGUucHV0ID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgdmFyIHRoZUlkID0gVW5pcXVlSURHZW5lcmV0b3IuY3JlYXRlSUQoa2V5KTtcbiAgaWYgKCF0aGlzLmNvbnRhaW5zKHRoZUlkKSkge1xuICAgIHRoaXMubWFwW3RoZUlkXSA9IHZhbHVlO1xuICAgIHRoaXMua2V5cy5wdXNoKGtleSk7XG4gIH1cbn07XG5cbkhhc2hNYXAucHJvdG90eXBlLmNvbnRhaW5zID0gZnVuY3Rpb24gKGtleSkge1xuICB2YXIgdGhlSWQgPSBVbmlxdWVJREdlbmVyZXRvci5jcmVhdGVJRChrZXkpO1xuICByZXR1cm4gdGhpcy5tYXBba2V5XSAhPSBudWxsO1xufTtcblxuSGFzaE1hcC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKGtleSkge1xuICB2YXIgdGhlSWQgPSBVbmlxdWVJREdlbmVyZXRvci5jcmVhdGVJRChrZXkpO1xuICByZXR1cm4gdGhpcy5tYXBbdGhlSWRdO1xufTtcblxuSGFzaE1hcC5wcm90b3R5cGUua2V5U2V0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5rZXlzO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBIYXNoTWFwO1xuXG4vKioqLyB9KSxcbi8qIDIzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBVbmlxdWVJREdlbmVyZXRvciA9IF9fd2VicGFja19yZXF1aXJlX18oMTQpO1xuXG5mdW5jdGlvbiBIYXNoU2V0KCkge1xuICB0aGlzLnNldCA9IHt9O1xufVxuO1xuXG5IYXNoU2V0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAob2JqKSB7XG4gIHZhciB0aGVJZCA9IFVuaXF1ZUlER2VuZXJldG9yLmNyZWF0ZUlEKG9iaik7XG4gIGlmICghdGhpcy5jb250YWlucyh0aGVJZCkpIHRoaXMuc2V0W3RoZUlkXSA9IG9iajtcbn07XG5cbkhhc2hTZXQucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChvYmopIHtcbiAgZGVsZXRlIHRoaXMuc2V0W1VuaXF1ZUlER2VuZXJldG9yLmNyZWF0ZUlEKG9iaildO1xufTtcblxuSGFzaFNldC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuc2V0ID0ge307XG59O1xuXG5IYXNoU2V0LnByb3RvdHlwZS5jb250YWlucyA9IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIHRoaXMuc2V0W1VuaXF1ZUlER2VuZXJldG9yLmNyZWF0ZUlEKG9iaildID09IG9iajtcbn07XG5cbkhhc2hTZXQucHJvdG90eXBlLmlzRW1wdHkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnNpemUoKSA9PT0gMDtcbn07XG5cbkhhc2hTZXQucHJvdG90eXBlLnNpemUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLnNldCkubGVuZ3RoO1xufTtcblxuLy9jb25jYXRzIHRoaXMuc2V0IHRvIHRoZSBnaXZlbiBsaXN0XG5IYXNoU2V0LnByb3RvdHlwZS5hZGRBbGxUbyA9IGZ1bmN0aW9uIChsaXN0KSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXModGhpcy5zZXQpO1xuICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICBsaXN0LnB1c2godGhpcy5zZXRba2V5c1tpXV0pO1xuICB9XG59O1xuXG5IYXNoU2V0LnByb3RvdHlwZS5zaXplID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5zZXQpLmxlbmd0aDtcbn07XG5cbkhhc2hTZXQucHJvdG90eXBlLmFkZEFsbCA9IGZ1bmN0aW9uIChsaXN0KSB7XG4gIHZhciBzID0gbGlzdC5sZW5ndGg7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgczsgaSsrKSB7XG4gICAgdmFyIHYgPSBsaXN0W2ldO1xuICAgIHRoaXMuYWRkKHYpO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEhhc2hTZXQ7XG5cbi8qKiovIH0pLFxuLyogMjQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuLy8gU29tZSBtYXRyaXggKDFkIGFuZCAyZCBhcnJheSkgb3BlcmF0aW9uc1xuZnVuY3Rpb24gTWF0cml4KCkge31cblxuLyoqXG4gKiBtYXRyaXggbXVsdGlwbGljYXRpb25cbiAqIGFycmF5MSwgYXJyYXkyIGFuZCByZXN1bHQgYXJlIDJkIGFycmF5c1xuICovXG5NYXRyaXgubXVsdE1hdCA9IGZ1bmN0aW9uIChhcnJheTEsIGFycmF5Mikge1xuICB2YXIgcmVzdWx0ID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheTEubGVuZ3RoOyBpKyspIHtcbiAgICByZXN1bHRbaV0gPSBbXTtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGFycmF5MlswXS5sZW5ndGg7IGorKykge1xuICAgICAgcmVzdWx0W2ldW2pdID0gMDtcbiAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgYXJyYXkxWzBdLmxlbmd0aDsgaysrKSB7XG4gICAgICAgIHJlc3VsdFtpXVtqXSArPSBhcnJheTFbaV1ba10gKiBhcnJheTJba11bal07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIG1hdHJpeCB0cmFuc3Bvc2VcbiAqIGFycmF5IGFuZCByZXN1bHQgYXJlIDJkIGFycmF5c1xuICovXG5NYXRyaXgudHJhbnNwb3NlID0gZnVuY3Rpb24gKGFycmF5KSB7XG4gIHZhciByZXN1bHQgPSBbXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5WzBdLmxlbmd0aDsgaSsrKSB7XG4gICAgcmVzdWx0W2ldID0gW107XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBhcnJheS5sZW5ndGg7IGorKykge1xuICAgICAgcmVzdWx0W2ldW2pdID0gYXJyYXlbal1baV07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogbXVsdGlwbHkgYXJyYXkgd2l0aCBjb25zdGFudFxuICogYXJyYXkgYW5kIHJlc3VsdCBhcmUgMWQgYXJyYXlzXG4gKi9cbk1hdHJpeC5tdWx0Q29ucyA9IGZ1bmN0aW9uIChhcnJheSwgY29uc3RhbnQpIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICByZXN1bHRbaV0gPSBhcnJheVtpXSAqIGNvbnN0YW50O1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogc3Vic3RyYWN0IHR3byBhcnJheXNcbiAqIGFycmF5MSwgYXJyYXkyIGFuZCByZXN1bHQgYXJlIDFkIGFycmF5c1xuICovXG5NYXRyaXgubWludXNPcCA9IGZ1bmN0aW9uIChhcnJheTEsIGFycmF5Mikge1xuICB2YXIgcmVzdWx0ID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheTEubGVuZ3RoOyBpKyspIHtcbiAgICByZXN1bHRbaV0gPSBhcnJheTFbaV0gLSBhcnJheTJbaV07XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBkb3QgcHJvZHVjdCBvZiB0d28gYXJyYXlzIHdpdGggc2FtZSBzaXplXG4gKiBhcnJheTEgYW5kIGFycmF5MiBhcmUgMWQgYXJyYXlzXG4gKi9cbk1hdHJpeC5kb3RQcm9kdWN0ID0gZnVuY3Rpb24gKGFycmF5MSwgYXJyYXkyKSB7XG4gIHZhciBwcm9kdWN0ID0gMDtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5MS5sZW5ndGg7IGkrKykge1xuICAgIHByb2R1Y3QgKz0gYXJyYXkxW2ldICogYXJyYXkyW2ldO1xuICB9XG5cbiAgcmV0dXJuIHByb2R1Y3Q7XG59O1xuXG4vKipcbiAqIG1hZ25pdHVkZSBvZiBhbiBhcnJheVxuICogYXJyYXkgaXMgMWQgYXJyYXlcbiAqL1xuTWF0cml4Lm1hZyA9IGZ1bmN0aW9uIChhcnJheSkge1xuICByZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZG90UHJvZHVjdChhcnJheSwgYXJyYXkpKTtcbn07XG5cbi8qKlxuICogbm9ybWFsaXphdGlvbiBvZiBhbiBhcnJheVxuICogYXJyYXkgYW5kIHJlc3VsdCBhcmUgMWQgYXJyYXlcbiAqL1xuTWF0cml4Lm5vcm1hbGl6ZSA9IGZ1bmN0aW9uIChhcnJheSkge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBtYWduaXR1ZGUgPSB0aGlzLm1hZyhhcnJheSk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgIHJlc3VsdFtpXSA9IGFycmF5W2ldIC8gbWFnbml0dWRlO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogbXVsdGlwbHkgYW4gYXJyYXkgd2l0aCBjZW50ZXJpbmcgbWF0cml4XG4gKiBhcnJheSBhbmQgcmVzdWx0IGFyZSAxZCBhcnJheVxuICovXG5NYXRyaXgubXVsdEdhbW1hID0gZnVuY3Rpb24gKGFycmF5KSB7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIHN1bSA9IDA7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgIHN1bSArPSBhcnJheVtpXTtcbiAgfVxuXG4gIHN1bSAqPSAtMSAvIGFycmF5Lmxlbmd0aDtcblxuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJyYXkubGVuZ3RoOyBfaSsrKSB7XG4gICAgcmVzdWx0W19pXSA9IHN1bSArIGFycmF5W19pXTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBhIHNwZWNpYWwgbWF0cml4IG11bHRpcGxpY2F0aW9uXG4gKiByZXN1bHQgPSAwLjUgKiBDICogSU5WICogQ15UICogYXJyYXlcbiAqIGFycmF5IGFuZCByZXN1bHQgYXJlIDFkLCBDIGFuZCBJTlYgYXJlIDJkIGFycmF5c1xuICovXG5NYXRyaXgubXVsdEwgPSBmdW5jdGlvbiAoYXJyYXksIEMsIElOVikge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciB0ZW1wMSA9IFtdO1xuICB2YXIgdGVtcDIgPSBbXTtcblxuICAvLyBtdWx0aXBseSBieSBDXlRcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBDWzBdLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHN1bSA9IDA7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBDLmxlbmd0aDsgaisrKSB7XG4gICAgICBzdW0gKz0gLTAuNSAqIENbal1baV0gKiBhcnJheVtqXTtcbiAgICB9XG4gICAgdGVtcDFbaV0gPSBzdW07XG4gIH1cbiAgLy8gbXVsdGlwbHkgdGhlIHJlc3VsdCBieSBJTlZcbiAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgSU5WLmxlbmd0aDsgX2kyKyspIHtcbiAgICB2YXIgX3N1bSA9IDA7XG4gICAgZm9yICh2YXIgX2ogPSAwOyBfaiA8IElOVi5sZW5ndGg7IF9qKyspIHtcbiAgICAgIF9zdW0gKz0gSU5WW19pMl1bX2pdICogdGVtcDFbX2pdO1xuICAgIH1cbiAgICB0ZW1wMltfaTJdID0gX3N1bTtcbiAgfVxuICAvLyBtdWx0aXBseSB0aGUgcmVzdWx0IGJ5IENcbiAgZm9yICh2YXIgX2kzID0gMDsgX2kzIDwgQy5sZW5ndGg7IF9pMysrKSB7XG4gICAgdmFyIF9zdW0yID0gMDtcbiAgICBmb3IgKHZhciBfajIgPSAwOyBfajIgPCBDWzBdLmxlbmd0aDsgX2oyKyspIHtcbiAgICAgIF9zdW0yICs9IENbX2kzXVtfajJdICogdGVtcDJbX2oyXTtcbiAgICB9XG4gICAgcmVzdWx0W19pM10gPSBfc3VtMjtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1hdHJpeDtcblxuLyoqKi8gfSksXG4vKiAyNSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgX2NyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSgpO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG4vKipcbiAqIEEgY2xhc3NpYyBRdWlja3NvcnQgYWxnb3JpdGhtIHdpdGggSG9hcmUncyBwYXJ0aXRpb25cbiAqIC0gV29ya3MgYWxzbyBvbiBMaW5rZWRMaXN0IG9iamVjdHNcbiAqXG4gKiBDb3B5cmlnaHQ6IGktVmlzIFJlc2VhcmNoIEdyb3VwLCBCaWxrZW50IFVuaXZlcnNpdHksIDIwMDcgLSBwcmVzZW50XG4gKi9cblxudmFyIExpbmtlZExpc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExKTtcblxudmFyIFF1aWNrc29ydCA9IGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBRdWlja3NvcnQoQSwgY29tcGFyZUZ1bmN0aW9uKSB7XG4gICAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBRdWlja3NvcnQpO1xuXG4gICAgICAgIGlmIChjb21wYXJlRnVuY3Rpb24gIT09IG51bGwgfHwgY29tcGFyZUZ1bmN0aW9uICE9PSB1bmRlZmluZWQpIHRoaXMuY29tcGFyZUZ1bmN0aW9uID0gdGhpcy5fZGVmYXVsdENvbXBhcmVGdW5jdGlvbjtcblxuICAgICAgICB2YXIgbGVuZ3RoID0gdm9pZCAwO1xuICAgICAgICBpZiAoQSBpbnN0YW5jZW9mIExpbmtlZExpc3QpIGxlbmd0aCA9IEEuc2l6ZSgpO2Vsc2UgbGVuZ3RoID0gQS5sZW5ndGg7XG5cbiAgICAgICAgdGhpcy5fcXVpY2tzb3J0KEEsIDAsIGxlbmd0aCAtIDEpO1xuICAgIH1cblxuICAgIF9jcmVhdGVDbGFzcyhRdWlja3NvcnQsIFt7XG4gICAgICAgIGtleTogJ19xdWlja3NvcnQnLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gX3F1aWNrc29ydChBLCBwLCByKSB7XG4gICAgICAgICAgICBpZiAocCA8IHIpIHtcbiAgICAgICAgICAgICAgICB2YXIgcSA9IHRoaXMuX3BhcnRpdGlvbihBLCBwLCByKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9xdWlja3NvcnQoQSwgcCwgcSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fcXVpY2tzb3J0KEEsIHEgKyAxLCByKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sIHtcbiAgICAgICAga2V5OiAnX3BhcnRpdGlvbicsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBfcGFydGl0aW9uKEEsIHAsIHIpIHtcbiAgICAgICAgICAgIHZhciB4ID0gdGhpcy5fZ2V0KEEsIHApO1xuICAgICAgICAgICAgdmFyIGkgPSBwO1xuICAgICAgICAgICAgdmFyIGogPSByO1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICB3aGlsZSAodGhpcy5jb21wYXJlRnVuY3Rpb24oeCwgdGhpcy5fZ2V0KEEsIGopKSkge1xuICAgICAgICAgICAgICAgICAgICBqLS07XG4gICAgICAgICAgICAgICAgfXdoaWxlICh0aGlzLmNvbXBhcmVGdW5jdGlvbih0aGlzLl9nZXQoQSwgaSksIHgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICB9aWYgKGkgPCBqKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3N3YXAoQSwgaSwgaik7XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgai0tO1xuICAgICAgICAgICAgICAgIH0gZWxzZSByZXR1cm4gajtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sIHtcbiAgICAgICAga2V5OiAnX2dldCcsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBfZ2V0KG9iamVjdCwgaW5kZXgpIHtcbiAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBMaW5rZWRMaXN0KSByZXR1cm4gb2JqZWN0LmdldF9vYmplY3RfYXQoaW5kZXgpO2Vsc2UgcmV0dXJuIG9iamVjdFtpbmRleF07XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGtleTogJ19zZXQnLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gX3NldChvYmplY3QsIGluZGV4LCB2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIExpbmtlZExpc3QpIG9iamVjdC5zZXRfb2JqZWN0X2F0KGluZGV4LCB2YWx1ZSk7ZWxzZSBvYmplY3RbaW5kZXhdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGtleTogJ19zd2FwJyxcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9zd2FwKEEsIGksIGopIHtcbiAgICAgICAgICAgIHZhciB0ZW1wID0gdGhpcy5fZ2V0KEEsIGkpO1xuICAgICAgICAgICAgdGhpcy5fc2V0KEEsIGksIHRoaXMuX2dldChBLCBqKSk7XG4gICAgICAgICAgICB0aGlzLl9zZXQoQSwgaiwgdGVtcCk7XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGtleTogJ19kZWZhdWx0Q29tcGFyZUZ1bmN0aW9uJyxcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9kZWZhdWx0Q29tcGFyZUZ1bmN0aW9uKGEsIGIpIHtcbiAgICAgICAgICAgIHJldHVybiBiID4gYTtcbiAgICAgICAgfVxuICAgIH1dKTtcblxuICAgIHJldHVybiBRdWlja3NvcnQ7XG59KCk7XG5cbm1vZHVsZS5leHBvcnRzID0gUXVpY2tzb3J0O1xuXG4vKioqLyB9KSxcbi8qIDI2ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbi8vIFNpbmd1bGFyIFZhbHVlIERlY29tcG9zaXRpb24gaW1wbGVtZW50YXRpb25cbmZ1bmN0aW9uIFNWRCgpIHt9O1xuXG4vKiBCZWxvdyBzaW5ndWxhciB2YWx1ZSBkZWNvbXBvc2l0aW9uIChzdmQpIGNvZGUgaW5jbHVkaW5nIGh5cG90IGZ1bmN0aW9uIGlzIGFkb3B0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vZHJhZ29uZmx5LWFpL0phbWFKU1xuICAgU29tZSBjaGFuZ2VzIGFyZSBhcHBsaWVkIHRvIG1ha2UgdGhlIGNvZGUgY29tcGF0aWJsZSB3aXRoIHRoZSBmY29zZSBjb2RlIGFuZCB0byBtYWtlIGl0IGluZGVwZW5kZW50IGZyb20gSmFtYS5cbiAgIElucHV0IG1hdHJpeCBpcyBjaGFuZ2VkIHRvIGEgMkQgYXJyYXkgaW5zdGVhZCBvZiBKYW1hIG1hdHJpeC4gTWF0cml4IGRpbWVuc2lvbnMgYXJlIHRha2VuIGFjY29yZGluZyB0byAyRCBhcnJheSBpbnN0ZWFkIG9mIHVzaW5nIEphbWEgZnVuY3Rpb25zLlxuICAgQW4gb2JqZWN0IHRoYXQgaW5jbHVkZXMgc2luZ3VsYXIgdmFsdWUgY29tcG9uZW50cyBpcyBjcmVhdGVkIGZvciByZXR1cm4uIFxuICAgVGhlIHR5cGVzIG9mIGlucHV0IHBhcmFtZXRlcnMgb2YgdGhlIGh5cG90IGZ1bmN0aW9uIGFyZSByZW1vdmVkLiBcbiAgIGxldCBpcyB1c2VkIGluc3RlYWQgb2YgdmFyIGZvciB0aGUgdmFyaWFibGUgaW5pdGlhbGl6YXRpb24uXG4qL1xuLypcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNFxuICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL1xuXG4gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT05cblxuICAgMS4gRGVmaW5pdGlvbnMuXG5cbiAgICAgIFwiTGljZW5zZVwiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbixcbiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LlxuXG4gICAgICBcIkxpY2Vuc29yXCIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5XG4gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuXG5cbiAgICAgIFwiTGVnYWwgRW50aXR5XCIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbFxuICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vblxuICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbixcbiAgICAgIFwiY29udHJvbFwiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlXG4gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvclxuICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlXG4gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LlxuXG4gICAgICBcIllvdVwiIChvciBcIllvdXJcIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eVxuICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS5cblxuICAgICAgXCJTb3VyY2VcIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucyxcbiAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb25cbiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuXG5cbiAgICAgIFwiT2JqZWN0XCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWxcbiAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXRcbiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbixcbiAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy5cblxuICAgICAgXCJXb3JrXCIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvclxuICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYVxuICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrXG4gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLlxuXG4gICAgICBcIkRlcml2YXRpdmUgV29ya3NcIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3RcbiAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGVcbiAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnNcbiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzXG4gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW5cbiAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZixcbiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuXG5cbiAgICAgIFwiQ29udHJpYnV0aW9uXCIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmdcbiAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnNcbiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseVxuICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lclxuICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mXG4gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgXCJzdWJtaXR0ZWRcIlxuICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudFxuICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG9cbiAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsXG4gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZVxuICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0XG4gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZVxuICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgXCJOb3QgYSBDb250cmlidXRpb24uXCJcblxuICAgICAgXCJDb250cmlidXRvclwiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eVxuICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kXG4gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay5cblxuICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mXG4gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsXG4gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZVxuICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsXG4gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGVcbiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uXG5cbiAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZlxuICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLFxuICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGVcbiAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLFxuICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssXG4gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZVxuICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXJcbiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocylcbiAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91XG4gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYVxuICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29ya1xuICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3RcbiAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXNcbiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZVxuICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLlxuXG4gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZVxuICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0XG4gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdVxuICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG5cbiAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yXG4gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmRcblxuICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlc1xuICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZFxuXG4gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3NcbiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kXG4gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yayxcbiAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mXG4gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZFxuXG4gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSBcIk5PVElDRVwiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0c1xuICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3RcbiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWRcbiAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3RcbiAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmVcbiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZFxuICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3JcbiAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvcixcbiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kXG4gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzXG4gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZFxuICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uXG4gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGVcbiAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWRcbiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWRcbiAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuXG5cbiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZFxuICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvclxuICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsXG4gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGhcbiAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuXG5cbiAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSxcbiAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29ya1xuICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2ZcbiAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLlxuICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeVxuICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWRcbiAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy5cblxuICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZVxuICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLFxuICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlXG4gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS5cblxuICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yXG4gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoXG4gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yXG4gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9uc1xuICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQVxuICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlXG4gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnlcbiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS5cblxuICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksXG4gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSxcbiAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5XG4gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZVxuICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLFxuICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhXG4gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlXG4gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsXG4gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbFxuICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvclxuICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLlxuXG4gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nXG4gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLFxuICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSxcbiAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzXG4gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seVxuICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGZcbiAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSxcbiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eVxuICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvblxuICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuXG5cbiAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OU1xuXG4gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuXG5cbiAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nXG4gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyBcInt9XCJcbiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlXG4gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZVxuICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhXG4gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlXG4gICAgICBzYW1lIFwicHJpbnRlZCBwYWdlXCIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llclxuICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLlxuXG4gICBDb3B5cmlnaHQge3l5eXl9IHtuYW1lIG9mIGNvcHlyaWdodCBvd25lcn1cblxuICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuXG5TVkQuc3ZkID0gZnVuY3Rpb24gKEEpIHtcbiAgdGhpcy5VID0gbnVsbDtcbiAgdGhpcy5WID0gbnVsbDtcbiAgdGhpcy5zID0gbnVsbDtcbiAgdGhpcy5tID0gMDtcbiAgdGhpcy5uID0gMDtcbiAgdGhpcy5tID0gQS5sZW5ndGg7XG4gIHRoaXMubiA9IEFbMF0ubGVuZ3RoO1xuICB2YXIgbnUgPSBNYXRoLm1pbih0aGlzLm0sIHRoaXMubik7XG4gIHRoaXMucyA9IGZ1bmN0aW9uIChzKSB7XG4gICAgdmFyIGEgPSBbXTtcbiAgICB3aGlsZSAocy0tID4gMCkge1xuICAgICAgYS5wdXNoKDApO1xuICAgIH1yZXR1cm4gYTtcbiAgfShNYXRoLm1pbih0aGlzLm0gKyAxLCB0aGlzLm4pKTtcbiAgdGhpcy5VID0gZnVuY3Rpb24gKGRpbXMpIHtcbiAgICB2YXIgYWxsb2NhdGUgPSBmdW5jdGlvbiBhbGxvY2F0ZShkaW1zKSB7XG4gICAgICBpZiAoZGltcy5sZW5ndGggPT0gMCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBhcnJheSA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpbXNbMF07IGkrKykge1xuICAgICAgICAgIGFycmF5LnB1c2goYWxsb2NhdGUoZGltcy5zbGljZSgxKSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcnJheTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBhbGxvY2F0ZShkaW1zKTtcbiAgfShbdGhpcy5tLCBudV0pO1xuICB0aGlzLlYgPSBmdW5jdGlvbiAoZGltcykge1xuICAgIHZhciBhbGxvY2F0ZSA9IGZ1bmN0aW9uIGFsbG9jYXRlKGRpbXMpIHtcbiAgICAgIGlmIChkaW1zLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGFycmF5ID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGltc1swXTsgaSsrKSB7XG4gICAgICAgICAgYXJyYXkucHVzaChhbGxvY2F0ZShkaW1zLnNsaWNlKDEpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFycmF5O1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIGFsbG9jYXRlKGRpbXMpO1xuICB9KFt0aGlzLm4sIHRoaXMubl0pO1xuICB2YXIgZSA9IGZ1bmN0aW9uIChzKSB7XG4gICAgdmFyIGEgPSBbXTtcbiAgICB3aGlsZSAocy0tID4gMCkge1xuICAgICAgYS5wdXNoKDApO1xuICAgIH1yZXR1cm4gYTtcbiAgfSh0aGlzLm4pO1xuICB2YXIgd29yayA9IGZ1bmN0aW9uIChzKSB7XG4gICAgdmFyIGEgPSBbXTtcbiAgICB3aGlsZSAocy0tID4gMCkge1xuICAgICAgYS5wdXNoKDApO1xuICAgIH1yZXR1cm4gYTtcbiAgfSh0aGlzLm0pO1xuICB2YXIgd2FudHUgPSB0cnVlO1xuICB2YXIgd2FudHYgPSB0cnVlO1xuICB2YXIgbmN0ID0gTWF0aC5taW4odGhpcy5tIC0gMSwgdGhpcy5uKTtcbiAgdmFyIG5ydCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHRoaXMubiAtIDIsIHRoaXMubSkpO1xuICBmb3IgKHZhciBrID0gMDsgayA8IE1hdGgubWF4KG5jdCwgbnJ0KTsgaysrKSB7XG4gICAgaWYgKGsgPCBuY3QpIHtcbiAgICAgIHRoaXMuc1trXSA9IDA7XG4gICAgICBmb3IgKHZhciBpID0gazsgaSA8IHRoaXMubTsgaSsrKSB7XG4gICAgICAgIHRoaXMuc1trXSA9IFNWRC5oeXBvdCh0aGlzLnNba10sIEFbaV1ba10pO1xuICAgICAgfVxuICAgICAgO1xuICAgICAgaWYgKHRoaXMuc1trXSAhPT0gMC4wKSB7XG4gICAgICAgIGlmIChBW2tdW2tdIDwgMC4wKSB7XG4gICAgICAgICAgdGhpcy5zW2tdID0gLXRoaXMuc1trXTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKHZhciBfaSA9IGs7IF9pIDwgdGhpcy5tOyBfaSsrKSB7XG4gICAgICAgICAgQVtfaV1ba10gLz0gdGhpcy5zW2tdO1xuICAgICAgICB9XG4gICAgICAgIDtcbiAgICAgICAgQVtrXVtrXSArPSAxLjA7XG4gICAgICB9XG4gICAgICB0aGlzLnNba10gPSAtdGhpcy5zW2tdO1xuICAgIH1cbiAgICBmb3IgKHZhciBqID0gayArIDE7IGogPCB0aGlzLm47IGorKykge1xuICAgICAgaWYgKGZ1bmN0aW9uIChsaHMsIHJocykge1xuICAgICAgICByZXR1cm4gbGhzICYmIHJocztcbiAgICAgIH0oayA8IG5jdCwgdGhpcy5zW2tdICE9PSAwLjApKSB7XG4gICAgICAgIHZhciB0ID0gMDtcbiAgICAgICAgZm9yICh2YXIgX2kyID0gazsgX2kyIDwgdGhpcy5tOyBfaTIrKykge1xuICAgICAgICAgIHQgKz0gQVtfaTJdW2tdICogQVtfaTJdW2pdO1xuICAgICAgICB9XG4gICAgICAgIDtcbiAgICAgICAgdCA9IC10IC8gQVtrXVtrXTtcbiAgICAgICAgZm9yICh2YXIgX2kzID0gazsgX2kzIDwgdGhpcy5tOyBfaTMrKykge1xuICAgICAgICAgIEFbX2kzXVtqXSArPSB0ICogQVtfaTNdW2tdO1xuICAgICAgICB9XG4gICAgICAgIDtcbiAgICAgIH1cbiAgICAgIGVbal0gPSBBW2tdW2pdO1xuICAgIH1cbiAgICA7XG4gICAgaWYgKGZ1bmN0aW9uIChsaHMsIHJocykge1xuICAgICAgcmV0dXJuIGxocyAmJiByaHM7XG4gICAgfSh3YW50dSwgayA8IG5jdCkpIHtcbiAgICAgIGZvciAodmFyIF9pNCA9IGs7IF9pNCA8IHRoaXMubTsgX2k0KyspIHtcbiAgICAgICAgdGhpcy5VW19pNF1ba10gPSBBW19pNF1ba107XG4gICAgICB9XG4gICAgICA7XG4gICAgfVxuICAgIGlmIChrIDwgbnJ0KSB7XG4gICAgICBlW2tdID0gMDtcbiAgICAgIGZvciAodmFyIF9pNSA9IGsgKyAxOyBfaTUgPCB0aGlzLm47IF9pNSsrKSB7XG4gICAgICAgIGVba10gPSBTVkQuaHlwb3QoZVtrXSwgZVtfaTVdKTtcbiAgICAgIH1cbiAgICAgIDtcbiAgICAgIGlmIChlW2tdICE9PSAwLjApIHtcbiAgICAgICAgaWYgKGVbayArIDFdIDwgMC4wKSB7XG4gICAgICAgICAgZVtrXSA9IC1lW2tdO1xuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIF9pNiA9IGsgKyAxOyBfaTYgPCB0aGlzLm47IF9pNisrKSB7XG4gICAgICAgICAgZVtfaTZdIC89IGVba107XG4gICAgICAgIH1cbiAgICAgICAgO1xuICAgICAgICBlW2sgKyAxXSArPSAxLjA7XG4gICAgICB9XG4gICAgICBlW2tdID0gLWVba107XG4gICAgICBpZiAoZnVuY3Rpb24gKGxocywgcmhzKSB7XG4gICAgICAgIHJldHVybiBsaHMgJiYgcmhzO1xuICAgICAgfShrICsgMSA8IHRoaXMubSwgZVtrXSAhPT0gMC4wKSkge1xuICAgICAgICBmb3IgKHZhciBfaTcgPSBrICsgMTsgX2k3IDwgdGhpcy5tOyBfaTcrKykge1xuICAgICAgICAgIHdvcmtbX2k3XSA9IDAuMDtcbiAgICAgICAgfVxuICAgICAgICA7XG4gICAgICAgIGZvciAodmFyIF9qID0gayArIDE7IF9qIDwgdGhpcy5uOyBfaisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgX2k4ID0gayArIDE7IF9pOCA8IHRoaXMubTsgX2k4KyspIHtcbiAgICAgICAgICAgIHdvcmtbX2k4XSArPSBlW19qXSAqIEFbX2k4XVtfal07XG4gICAgICAgICAgfVxuICAgICAgICAgIDtcbiAgICAgICAgfVxuICAgICAgICA7XG4gICAgICAgIGZvciAodmFyIF9qMiA9IGsgKyAxOyBfajIgPCB0aGlzLm47IF9qMisrKSB7XG4gICAgICAgICAgdmFyIF90ID0gLWVbX2oyXSAvIGVbayArIDFdO1xuICAgICAgICAgIGZvciAodmFyIF9pOSA9IGsgKyAxOyBfaTkgPCB0aGlzLm07IF9pOSsrKSB7XG4gICAgICAgICAgICBBW19pOV1bX2oyXSArPSBfdCAqIHdvcmtbX2k5XTtcbiAgICAgICAgICB9XG4gICAgICAgICAgO1xuICAgICAgICB9XG4gICAgICAgIDtcbiAgICAgIH1cbiAgICAgIGlmICh3YW50dikge1xuICAgICAgICBmb3IgKHZhciBfaTEwID0gayArIDE7IF9pMTAgPCB0aGlzLm47IF9pMTArKykge1xuICAgICAgICAgIHRoaXMuVltfaTEwXVtrXSA9IGVbX2kxMF07XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9O1xuICB2YXIgcCA9IE1hdGgubWluKHRoaXMubiwgdGhpcy5tICsgMSk7XG4gIGlmIChuY3QgPCB0aGlzLm4pIHtcbiAgICB0aGlzLnNbbmN0XSA9IEFbbmN0XVtuY3RdO1xuICB9XG4gIGlmICh0aGlzLm0gPCBwKSB7XG4gICAgdGhpcy5zW3AgLSAxXSA9IDAuMDtcbiAgfVxuICBpZiAobnJ0ICsgMSA8IHApIHtcbiAgICBlW25ydF0gPSBBW25ydF1bcCAtIDFdO1xuICB9XG4gIGVbcCAtIDFdID0gMC4wO1xuICBpZiAod2FudHUpIHtcbiAgICBmb3IgKHZhciBfajMgPSBuY3Q7IF9qMyA8IG51OyBfajMrKykge1xuICAgICAgZm9yICh2YXIgX2kxMSA9IDA7IF9pMTEgPCB0aGlzLm07IF9pMTErKykge1xuICAgICAgICB0aGlzLlVbX2kxMV1bX2ozXSA9IDAuMDtcbiAgICAgIH1cbiAgICAgIDtcbiAgICAgIHRoaXMuVVtfajNdW19qM10gPSAxLjA7XG4gICAgfTtcbiAgICBmb3IgKHZhciBfayA9IG5jdCAtIDE7IF9rID49IDA7IF9rLS0pIHtcbiAgICAgIGlmICh0aGlzLnNbX2tdICE9PSAwLjApIHtcbiAgICAgICAgZm9yICh2YXIgX2o0ID0gX2sgKyAxOyBfajQgPCBudTsgX2o0KyspIHtcbiAgICAgICAgICB2YXIgX3QyID0gMDtcbiAgICAgICAgICBmb3IgKHZhciBfaTEyID0gX2s7IF9pMTIgPCB0aGlzLm07IF9pMTIrKykge1xuICAgICAgICAgICAgX3QyICs9IHRoaXMuVVtfaTEyXVtfa10gKiB0aGlzLlVbX2kxMl1bX2o0XTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIF90MiA9IC1fdDIgLyB0aGlzLlVbX2tdW19rXTtcbiAgICAgICAgICBmb3IgKHZhciBfaTEzID0gX2s7IF9pMTMgPCB0aGlzLm07IF9pMTMrKykge1xuICAgICAgICAgICAgdGhpcy5VW19pMTNdW19qNF0gKz0gX3QyICogdGhpcy5VW19pMTNdW19rXTtcbiAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgICAgICBmb3IgKHZhciBfaTE0ID0gX2s7IF9pMTQgPCB0aGlzLm07IF9pMTQrKykge1xuICAgICAgICAgIHRoaXMuVVtfaTE0XVtfa10gPSAtdGhpcy5VW19pMTRdW19rXTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5VW19rXVtfa10gPSAxLjAgKyB0aGlzLlVbX2tdW19rXTtcbiAgICAgICAgZm9yICh2YXIgX2kxNSA9IDA7IF9pMTUgPCBfayAtIDE7IF9pMTUrKykge1xuICAgICAgICAgIHRoaXMuVVtfaTE1XVtfa10gPSAwLjA7XG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKHZhciBfaTE2ID0gMDsgX2kxNiA8IHRoaXMubTsgX2kxNisrKSB7XG4gICAgICAgICAgdGhpcy5VW19pMTZdW19rXSA9IDAuMDtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5VW19rXVtfa10gPSAxLjA7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuICBpZiAod2FudHYpIHtcbiAgICBmb3IgKHZhciBfazIgPSB0aGlzLm4gLSAxOyBfazIgPj0gMDsgX2syLS0pIHtcbiAgICAgIGlmIChmdW5jdGlvbiAobGhzLCByaHMpIHtcbiAgICAgICAgcmV0dXJuIGxocyAmJiByaHM7XG4gICAgICB9KF9rMiA8IG5ydCwgZVtfazJdICE9PSAwLjApKSB7XG4gICAgICAgIGZvciAodmFyIF9qNSA9IF9rMiArIDE7IF9qNSA8IG51OyBfajUrKykge1xuICAgICAgICAgIHZhciBfdDMgPSAwO1xuICAgICAgICAgIGZvciAodmFyIF9pMTcgPSBfazIgKyAxOyBfaTE3IDwgdGhpcy5uOyBfaTE3KyspIHtcbiAgICAgICAgICAgIF90MyArPSB0aGlzLlZbX2kxN11bX2syXSAqIHRoaXMuVltfaTE3XVtfajVdO1xuICAgICAgICAgIH07XG4gICAgICAgICAgX3QzID0gLV90MyAvIHRoaXMuVltfazIgKyAxXVtfazJdO1xuICAgICAgICAgIGZvciAodmFyIF9pMTggPSBfazIgKyAxOyBfaTE4IDwgdGhpcy5uOyBfaTE4KyspIHtcbiAgICAgICAgICAgIHRoaXMuVltfaTE4XVtfajVdICs9IF90MyAqIHRoaXMuVltfaTE4XVtfazJdO1xuICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBfaTE5ID0gMDsgX2kxOSA8IHRoaXMubjsgX2kxOSsrKSB7XG4gICAgICAgIHRoaXMuVltfaTE5XVtfazJdID0gMC4wO1xuICAgICAgfTtcbiAgICAgIHRoaXMuVltfazJdW19rMl0gPSAxLjA7XG4gICAgfTtcbiAgfVxuICB2YXIgcHAgPSBwIC0gMTtcbiAgdmFyIGl0ZXIgPSAwO1xuICB2YXIgZXBzID0gTWF0aC5wb3coMi4wLCAtNTIuMCk7XG4gIHZhciB0aW55ID0gTWF0aC5wb3coMi4wLCAtOTY2LjApO1xuICB3aGlsZSAocCA+IDApIHtcbiAgICB2YXIgX2szID0gdm9pZCAwO1xuICAgIHZhciBrYXNlID0gdm9pZCAwO1xuICAgIGZvciAoX2szID0gcCAtIDI7IF9rMyA+PSAtMTsgX2szLS0pIHtcbiAgICAgIGlmIChfazMgPT09IC0xKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKE1hdGguYWJzKGVbX2szXSkgPD0gdGlueSArIGVwcyAqIChNYXRoLmFicyh0aGlzLnNbX2szXSkgKyBNYXRoLmFicyh0aGlzLnNbX2szICsgMV0pKSkge1xuICAgICAgICBlW19rM10gPSAwLjA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH07XG4gICAgaWYgKF9rMyA9PT0gcCAtIDIpIHtcbiAgICAgIGthc2UgPSA0O1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIga3MgPSB2b2lkIDA7XG4gICAgICBmb3IgKGtzID0gcCAtIDE7IGtzID49IF9rMzsga3MtLSkge1xuICAgICAgICBpZiAoa3MgPT09IF9rMykge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHZhciBfdDQgPSAoa3MgIT09IHAgPyBNYXRoLmFicyhlW2tzXSkgOiAwLjApICsgKGtzICE9PSBfazMgKyAxID8gTWF0aC5hYnMoZVtrcyAtIDFdKSA6IDAuMCk7XG4gICAgICAgIGlmIChNYXRoLmFicyh0aGlzLnNba3NdKSA8PSB0aW55ICsgZXBzICogX3Q0KSB7XG4gICAgICAgICAgdGhpcy5zW2tzXSA9IDAuMDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGlmIChrcyA9PT0gX2szKSB7XG4gICAgICAgIGthc2UgPSAzO1xuICAgICAgfSBlbHNlIGlmIChrcyA9PT0gcCAtIDEpIHtcbiAgICAgICAga2FzZSA9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBrYXNlID0gMjtcbiAgICAgICAgX2szID0ga3M7XG4gICAgICB9XG4gICAgfVxuICAgIF9rMysrO1xuICAgIHN3aXRjaCAoa2FzZSkge1xuICAgICAgY2FzZSAxOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGYgPSBlW3AgLSAyXTtcbiAgICAgICAgICBlW3AgLSAyXSA9IDAuMDtcbiAgICAgICAgICBmb3IgKHZhciBfajYgPSBwIC0gMjsgX2o2ID49IF9rMzsgX2o2LS0pIHtcbiAgICAgICAgICAgIHZhciBfdDUgPSBTVkQuaHlwb3QodGhpcy5zW19qNl0sIGYpO1xuICAgICAgICAgICAgdmFyIGNzID0gdGhpcy5zW19qNl0gLyBfdDU7XG4gICAgICAgICAgICB2YXIgc24gPSBmIC8gX3Q1O1xuICAgICAgICAgICAgdGhpcy5zW19qNl0gPSBfdDU7XG4gICAgICAgICAgICBpZiAoX2o2ICE9PSBfazMpIHtcbiAgICAgICAgICAgICAgZiA9IC1zbiAqIGVbX2o2IC0gMV07XG4gICAgICAgICAgICAgIGVbX2o2IC0gMV0gPSBjcyAqIGVbX2o2IC0gMV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAod2FudHYpIHtcbiAgICAgICAgICAgICAgZm9yICh2YXIgX2kyMCA9IDA7IF9pMjAgPCB0aGlzLm47IF9pMjArKykge1xuICAgICAgICAgICAgICAgIF90NSA9IGNzICogdGhpcy5WW19pMjBdW19qNl0gKyBzbiAqIHRoaXMuVltfaTIwXVtwIC0gMV07XG4gICAgICAgICAgICAgICAgdGhpcy5WW19pMjBdW3AgLSAxXSA9IC1zbiAqIHRoaXMuVltfaTIwXVtfajZdICsgY3MgKiB0aGlzLlZbX2kyMF1bcCAtIDFdO1xuICAgICAgICAgICAgICAgIHRoaXMuVltfaTIwXVtfajZdID0gX3Q1O1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIF9mID0gZVtfazMgLSAxXTtcbiAgICAgICAgICBlW19rMyAtIDFdID0gMC4wO1xuICAgICAgICAgIGZvciAodmFyIF9qNyA9IF9rMzsgX2o3IDwgcDsgX2o3KyspIHtcbiAgICAgICAgICAgIHZhciBfdDYgPSBTVkQuaHlwb3QodGhpcy5zW19qN10sIF9mKTtcbiAgICAgICAgICAgIHZhciBfY3MgPSB0aGlzLnNbX2o3XSAvIF90NjtcbiAgICAgICAgICAgIHZhciBfc24gPSBfZiAvIF90NjtcbiAgICAgICAgICAgIHRoaXMuc1tfajddID0gX3Q2O1xuICAgICAgICAgICAgX2YgPSAtX3NuICogZVtfajddO1xuICAgICAgICAgICAgZVtfajddID0gX2NzICogZVtfajddO1xuICAgICAgICAgICAgaWYgKHdhbnR1KSB7XG4gICAgICAgICAgICAgIGZvciAodmFyIF9pMjEgPSAwOyBfaTIxIDwgdGhpcy5tOyBfaTIxKyspIHtcbiAgICAgICAgICAgICAgICBfdDYgPSBfY3MgKiB0aGlzLlVbX2kyMV1bX2o3XSArIF9zbiAqIHRoaXMuVVtfaTIxXVtfazMgLSAxXTtcbiAgICAgICAgICAgICAgICB0aGlzLlVbX2kyMV1bX2szIC0gMV0gPSAtX3NuICogdGhpcy5VW19pMjFdW19qN10gKyBfY3MgKiB0aGlzLlVbX2kyMV1bX2szIC0gMV07XG4gICAgICAgICAgICAgICAgdGhpcy5VW19pMjFdW19qN10gPSBfdDY7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgc2NhbGUgPSBNYXRoLm1heChNYXRoLm1heChNYXRoLm1heChNYXRoLm1heChNYXRoLmFicyh0aGlzLnNbcCAtIDFdKSwgTWF0aC5hYnModGhpcy5zW3AgLSAyXSkpLCBNYXRoLmFicyhlW3AgLSAyXSkpLCBNYXRoLmFicyh0aGlzLnNbX2szXSkpLCBNYXRoLmFicyhlW19rM10pKTtcbiAgICAgICAgICB2YXIgc3AgPSB0aGlzLnNbcCAtIDFdIC8gc2NhbGU7XG4gICAgICAgICAgdmFyIHNwbTEgPSB0aGlzLnNbcCAtIDJdIC8gc2NhbGU7XG4gICAgICAgICAgdmFyIGVwbTEgPSBlW3AgLSAyXSAvIHNjYWxlO1xuICAgICAgICAgIHZhciBzayA9IHRoaXMuc1tfazNdIC8gc2NhbGU7XG4gICAgICAgICAgdmFyIGVrID0gZVtfazNdIC8gc2NhbGU7XG4gICAgICAgICAgdmFyIGIgPSAoKHNwbTEgKyBzcCkgKiAoc3BtMSAtIHNwKSArIGVwbTEgKiBlcG0xKSAvIDIuMDtcbiAgICAgICAgICB2YXIgYyA9IHNwICogZXBtMSAqIChzcCAqIGVwbTEpO1xuICAgICAgICAgIHZhciBzaGlmdCA9IDAuMDtcbiAgICAgICAgICBpZiAoZnVuY3Rpb24gKGxocywgcmhzKSB7XG4gICAgICAgICAgICByZXR1cm4gbGhzIHx8IHJocztcbiAgICAgICAgICB9KGIgIT09IDAuMCwgYyAhPT0gMC4wKSkge1xuICAgICAgICAgICAgc2hpZnQgPSBNYXRoLnNxcnQoYiAqIGIgKyBjKTtcbiAgICAgICAgICAgIGlmIChiIDwgMC4wKSB7XG4gICAgICAgICAgICAgIHNoaWZ0ID0gLXNoaWZ0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2hpZnQgPSBjIC8gKGIgKyBzaGlmdCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBfZjIgPSAoc2sgKyBzcCkgKiAoc2sgLSBzcCkgKyBzaGlmdDtcbiAgICAgICAgICB2YXIgZyA9IHNrICogZWs7XG4gICAgICAgICAgZm9yICh2YXIgX2o4ID0gX2szOyBfajggPCBwIC0gMTsgX2o4KyspIHtcbiAgICAgICAgICAgIHZhciBfdDcgPSBTVkQuaHlwb3QoX2YyLCBnKTtcbiAgICAgICAgICAgIHZhciBfY3MyID0gX2YyIC8gX3Q3O1xuICAgICAgICAgICAgdmFyIF9zbjIgPSBnIC8gX3Q3O1xuICAgICAgICAgICAgaWYgKF9qOCAhPT0gX2szKSB7XG4gICAgICAgICAgICAgIGVbX2o4IC0gMV0gPSBfdDc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfZjIgPSBfY3MyICogdGhpcy5zW19qOF0gKyBfc24yICogZVtfajhdO1xuICAgICAgICAgICAgZVtfajhdID0gX2NzMiAqIGVbX2o4XSAtIF9zbjIgKiB0aGlzLnNbX2o4XTtcbiAgICAgICAgICAgIGcgPSBfc24yICogdGhpcy5zW19qOCArIDFdO1xuICAgICAgICAgICAgdGhpcy5zW19qOCArIDFdID0gX2NzMiAqIHRoaXMuc1tfajggKyAxXTtcbiAgICAgICAgICAgIGlmICh3YW50dikge1xuICAgICAgICAgICAgICBmb3IgKHZhciBfaTIyID0gMDsgX2kyMiA8IHRoaXMubjsgX2kyMisrKSB7XG4gICAgICAgICAgICAgICAgX3Q3ID0gX2NzMiAqIHRoaXMuVltfaTIyXVtfajhdICsgX3NuMiAqIHRoaXMuVltfaTIyXVtfajggKyAxXTtcbiAgICAgICAgICAgICAgICB0aGlzLlZbX2kyMl1bX2o4ICsgMV0gPSAtX3NuMiAqIHRoaXMuVltfaTIyXVtfajhdICsgX2NzMiAqIHRoaXMuVltfaTIyXVtfajggKyAxXTtcbiAgICAgICAgICAgICAgICB0aGlzLlZbX2kyMl1bX2o4XSA9IF90NztcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF90NyA9IFNWRC5oeXBvdChfZjIsIGcpO1xuICAgICAgICAgICAgX2NzMiA9IF9mMiAvIF90NztcbiAgICAgICAgICAgIF9zbjIgPSBnIC8gX3Q3O1xuICAgICAgICAgICAgdGhpcy5zW19qOF0gPSBfdDc7XG4gICAgICAgICAgICBfZjIgPSBfY3MyICogZVtfajhdICsgX3NuMiAqIHRoaXMuc1tfajggKyAxXTtcbiAgICAgICAgICAgIHRoaXMuc1tfajggKyAxXSA9IC1fc24yICogZVtfajhdICsgX2NzMiAqIHRoaXMuc1tfajggKyAxXTtcbiAgICAgICAgICAgIGcgPSBfc24yICogZVtfajggKyAxXTtcbiAgICAgICAgICAgIGVbX2o4ICsgMV0gPSBfY3MyICogZVtfajggKyAxXTtcbiAgICAgICAgICAgIGlmICh3YW50dSAmJiBfajggPCB0aGlzLm0gLSAxKSB7XG4gICAgICAgICAgICAgIGZvciAodmFyIF9pMjMgPSAwOyBfaTIzIDwgdGhpcy5tOyBfaTIzKyspIHtcbiAgICAgICAgICAgICAgICBfdDcgPSBfY3MyICogdGhpcy5VW19pMjNdW19qOF0gKyBfc24yICogdGhpcy5VW19pMjNdW19qOCArIDFdO1xuICAgICAgICAgICAgICAgIHRoaXMuVVtfaTIzXVtfajggKyAxXSA9IC1fc24yICogdGhpcy5VW19pMjNdW19qOF0gKyBfY3MyICogdGhpcy5VW19pMjNdW19qOCArIDFdO1xuICAgICAgICAgICAgICAgIHRoaXMuVVtfaTIzXVtfajhdID0gX3Q3O1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgZVtwIC0gMl0gPSBfZjI7XG4gICAgICAgICAgaXRlciA9IGl0ZXIgKyAxO1xuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNDpcbiAgICAgICAge1xuICAgICAgICAgIGlmICh0aGlzLnNbX2szXSA8PSAwLjApIHtcbiAgICAgICAgICAgIHRoaXMuc1tfazNdID0gdGhpcy5zW19rM10gPCAwLjAgPyAtdGhpcy5zW19rM10gOiAwLjA7XG4gICAgICAgICAgICBpZiAod2FudHYpIHtcbiAgICAgICAgICAgICAgZm9yICh2YXIgX2kyNCA9IDA7IF9pMjQgPD0gcHA7IF9pMjQrKykge1xuICAgICAgICAgICAgICAgIHRoaXMuVltfaTI0XVtfazNdID0gLXRoaXMuVltfaTI0XVtfazNdO1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB3aGlsZSAoX2szIDwgcHApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNbX2szXSA+PSB0aGlzLnNbX2szICsgMV0pIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgX3Q4ID0gdGhpcy5zW19rM107XG4gICAgICAgICAgICB0aGlzLnNbX2szXSA9IHRoaXMuc1tfazMgKyAxXTtcbiAgICAgICAgICAgIHRoaXMuc1tfazMgKyAxXSA9IF90ODtcbiAgICAgICAgICAgIGlmICh3YW50diAmJiBfazMgPCB0aGlzLm4gLSAxKSB7XG4gICAgICAgICAgICAgIGZvciAodmFyIF9pMjUgPSAwOyBfaTI1IDwgdGhpcy5uOyBfaTI1KyspIHtcbiAgICAgICAgICAgICAgICBfdDggPSB0aGlzLlZbX2kyNV1bX2szICsgMV07XG4gICAgICAgICAgICAgICAgdGhpcy5WW19pMjVdW19rMyArIDFdID0gdGhpcy5WW19pMjVdW19rM107XG4gICAgICAgICAgICAgICAgdGhpcy5WW19pMjVdW19rM10gPSBfdDg7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAod2FudHUgJiYgX2szIDwgdGhpcy5tIC0gMSkge1xuICAgICAgICAgICAgICBmb3IgKHZhciBfaTI2ID0gMDsgX2kyNiA8IHRoaXMubTsgX2kyNisrKSB7XG4gICAgICAgICAgICAgICAgX3Q4ID0gdGhpcy5VW19pMjZdW19rMyArIDFdO1xuICAgICAgICAgICAgICAgIHRoaXMuVVtfaTI2XVtfazMgKyAxXSA9IHRoaXMuVVtfaTI2XVtfazNdO1xuICAgICAgICAgICAgICAgIHRoaXMuVVtfaTI2XVtfazNdID0gX3Q4O1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX2szKys7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBpdGVyID0gMDtcbiAgICAgICAgICBwLS07XG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfTtcbiAgdmFyIHJlc3VsdCA9IHsgVTogdGhpcy5VLCBWOiB0aGlzLlYsIFM6IHRoaXMucyB9O1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLy8gc3FydChhXjIgKyBiXjIpIHdpdGhvdXQgdW5kZXIvb3ZlcmZsb3cuXG5TVkQuaHlwb3QgPSBmdW5jdGlvbiAoYSwgYikge1xuICB2YXIgciA9IHZvaWQgMDtcbiAgaWYgKE1hdGguYWJzKGEpID4gTWF0aC5hYnMoYikpIHtcbiAgICByID0gYiAvIGE7XG4gICAgciA9IE1hdGguYWJzKGEpICogTWF0aC5zcXJ0KDEgKyByICogcik7XG4gIH0gZWxzZSBpZiAoYiAhPSAwKSB7XG4gICAgciA9IGEgLyBiO1xuICAgIHIgPSBNYXRoLmFicyhiKSAqIE1hdGguc3FydCgxICsgciAqIHIpO1xuICB9IGVsc2Uge1xuICAgIHIgPSAwLjA7XG4gIH1cbiAgcmV0dXJuIHI7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNWRDtcblxuLyoqKi8gfSksXG4vKiAyNyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgX2NyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSgpO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG4vKipcbiAqICAgTmVlZGxlbWFuLVd1bnNjaCBhbGdvcml0aG0gaXMgYW4gcHJvY2VkdXJlIHRvIGNvbXB1dGUgdGhlIG9wdGltYWwgZ2xvYmFsIGFsaWdubWVudCBvZiB0d28gc3RyaW5nXG4gKiAgIHNlcXVlbmNlcyBieSBTLkIuTmVlZGxlbWFuIGFuZCBDLkQuV3Vuc2NoICgxOTcwKS5cbiAqXG4gKiAgIEFzaWRlIGZyb20gdGhlIGlucHV0cywgeW91IGNhbiBhc3NpZ24gdGhlIHNjb3JlcyBmb3IsXG4gKiAgIC0gTWF0Y2g6IFRoZSB0d28gY2hhcmFjdGVycyBhdCB0aGUgY3VycmVudCBpbmRleCBhcmUgc2FtZS5cbiAqICAgLSBNaXNtYXRjaDogVGhlIHR3byBjaGFyYWN0ZXJzIGF0IHRoZSBjdXJyZW50IGluZGV4IGFyZSBkaWZmZXJlbnQuXG4gKiAgIC0gSW5zZXJ0aW9uL0RlbGV0aW9uKGdhcHMpOiBUaGUgYmVzdCBhbGlnbm1lbnQgaW52b2x2ZXMgb25lIGxldHRlciBhbGlnbmluZyB0byBhIGdhcCBpbiB0aGUgb3RoZXIgc3RyaW5nLlxuICovXG5cbnZhciBOZWVkbGVtYW5XdW5zY2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTmVlZGxlbWFuV3Vuc2NoKHNlcXVlbmNlMSwgc2VxdWVuY2UyKSB7XG4gICAgICAgIHZhciBtYXRjaF9zY29yZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogMTtcbiAgICAgICAgdmFyIG1pc21hdGNoX3BlbmFsdHkgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IC0xO1xuICAgICAgICB2YXIgZ2FwX3BlbmFsdHkgPSBhcmd1bWVudHMubGVuZ3RoID4gNCAmJiBhcmd1bWVudHNbNF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s0XSA6IC0xO1xuXG4gICAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBOZWVkbGVtYW5XdW5zY2gpO1xuXG4gICAgICAgIHRoaXMuc2VxdWVuY2UxID0gc2VxdWVuY2UxO1xuICAgICAgICB0aGlzLnNlcXVlbmNlMiA9IHNlcXVlbmNlMjtcbiAgICAgICAgdGhpcy5tYXRjaF9zY29yZSA9IG1hdGNoX3Njb3JlO1xuICAgICAgICB0aGlzLm1pc21hdGNoX3BlbmFsdHkgPSBtaXNtYXRjaF9wZW5hbHR5O1xuICAgICAgICB0aGlzLmdhcF9wZW5hbHR5ID0gZ2FwX3BlbmFsdHk7XG5cbiAgICAgICAgLy8gSnVzdCB0aGUgcmVtb3ZlIHJlZHVuZGFuY3lcbiAgICAgICAgdGhpcy5pTWF4ID0gc2VxdWVuY2UxLmxlbmd0aCArIDE7XG4gICAgICAgIHRoaXMuak1heCA9IHNlcXVlbmNlMi5sZW5ndGggKyAxO1xuXG4gICAgICAgIC8vIEdyaWQgbWF0cml4IG9mIHNjb3Jlc1xuICAgICAgICB0aGlzLmdyaWQgPSBuZXcgQXJyYXkodGhpcy5pTWF4KTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmlNYXg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5ncmlkW2ldID0gbmV3IEFycmF5KHRoaXMuak1heCk7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdGhpcy5qTWF4OyBqKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdyaWRbaV1bal0gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJhY2ViYWNrIG1hdHJpeCAoMkQgYXJyYXksIGVhY2ggY2VsbCBpcyBhbiBhcnJheSBvZiBib29sZWFuIHZhbHVlcyBmb3IgW2BEaWFnYCwgYFVwYCwgYExlZnRgXSBwb3NpdGlvbnMpXG4gICAgICAgIHRoaXMudHJhY2ViYWNrR3JpZCA9IG5ldyBBcnJheSh0aGlzLmlNYXgpO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgdGhpcy5pTWF4OyBfaSsrKSB7XG4gICAgICAgICAgICB0aGlzLnRyYWNlYmFja0dyaWRbX2ldID0gbmV3IEFycmF5KHRoaXMuak1heCk7XG5cbiAgICAgICAgICAgIGZvciAodmFyIF9qID0gMDsgX2ogPCB0aGlzLmpNYXg7IF9qKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyYWNlYmFja0dyaWRbX2ldW19qXSA9IFtudWxsLCBudWxsLCBudWxsXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSBhbGlnbmVkIHNlcXVlbmNlcyAocmV0dXJuIG11bHRpcGxlIHBvc3NpYmlsaXRpZXMpXG4gICAgICAgIHRoaXMuYWxpZ25tZW50cyA9IFtdO1xuXG4gICAgICAgIC8vIEZpbmFsIGFsaWdubWVudCBzY29yZVxuICAgICAgICB0aGlzLnNjb3JlID0gLTE7XG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIHNjb3JlcyBhbmQgdHJhY2ViYWNrc1xuICAgICAgICB0aGlzLmNvbXB1dGVHcmlkcygpO1xuICAgIH1cblxuICAgIF9jcmVhdGVDbGFzcyhOZWVkbGVtYW5XdW5zY2gsIFt7XG4gICAgICAgIGtleTogXCJnZXRTY29yZVwiLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0U2NvcmUoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zY29yZTtcbiAgICAgICAgfVxuICAgIH0sIHtcbiAgICAgICAga2V5OiBcImdldEFsaWdubWVudHNcIixcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldEFsaWdubWVudHMoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hbGlnbm1lbnRzO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWFpbiBkeW5hbWljIHByb2dyYW1taW5nIHByb2NlZHVyZVxuXG4gICAgfSwge1xuICAgICAgICBrZXk6IFwiY29tcHV0ZUdyaWRzXCIsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wdXRlR3JpZHMoKSB7XG4gICAgICAgICAgICAvLyBGaWxsIGluIHRoZSBmaXJzdCByb3dcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAxOyBqIDwgdGhpcy5qTWF4OyBqKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdyaWRbMF1bal0gPSB0aGlzLmdyaWRbMF1baiAtIDFdICsgdGhpcy5nYXBfcGVuYWx0eTtcbiAgICAgICAgICAgICAgICB0aGlzLnRyYWNlYmFja0dyaWRbMF1bal0gPSBbZmFsc2UsIGZhbHNlLCB0cnVlXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRmlsbCBpbiB0aGUgZmlyc3QgY29sdW1uXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IHRoaXMuaU1heDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkW2ldWzBdID0gdGhpcy5ncmlkW2kgLSAxXVswXSArIHRoaXMuZ2FwX3BlbmFsdHk7XG4gICAgICAgICAgICAgICAgdGhpcy50cmFjZWJhY2tHcmlkW2ldWzBdID0gW2ZhbHNlLCB0cnVlLCBmYWxzZV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEZpbGwgdGhlIHJlc3Qgb2YgdGhlIGdyaWRcbiAgICAgICAgICAgIGZvciAodmFyIF9pMiA9IDE7IF9pMiA8IHRoaXMuaU1heDsgX2kyKyspIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBfajIgPSAxOyBfajIgPCB0aGlzLmpNYXg7IF9qMisrKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEZpbmQgdGhlIG1heCBzY29yZShzKSBhbW9uZyBbYERpYWdgLCBgVXBgLCBgTGVmdGBdXG4gICAgICAgICAgICAgICAgICAgIHZhciBkaWFnID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZXF1ZW5jZTFbX2kyIC0gMV0gPT09IHRoaXMuc2VxdWVuY2UyW19qMiAtIDFdKSBkaWFnID0gdGhpcy5ncmlkW19pMiAtIDFdW19qMiAtIDFdICsgdGhpcy5tYXRjaF9zY29yZTtlbHNlIGRpYWcgPSB0aGlzLmdyaWRbX2kyIC0gMV1bX2oyIC0gMV0gKyB0aGlzLm1pc21hdGNoX3BlbmFsdHk7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIHVwID0gdGhpcy5ncmlkW19pMiAtIDFdW19qMl0gKyB0aGlzLmdhcF9wZW5hbHR5O1xuICAgICAgICAgICAgICAgICAgICB2YXIgbGVmdCA9IHRoaXMuZ3JpZFtfaTJdW19qMiAtIDFdICsgdGhpcy5nYXBfcGVuYWx0eTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBleGlzdHMgbXVsdGlwbGUgbWF4IHZhbHVlcywgY2FwdHVyZSB0aGVtIGZvciBtdWx0aXBsZSBwYXRoc1xuICAgICAgICAgICAgICAgICAgICB2YXIgbWF4T2YgPSBbZGlhZywgdXAsIGxlZnRdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5kaWNlcyA9IHRoaXMuYXJyYXlBbGxNYXhJbmRleGVzKG1heE9mKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgR3JpZHNcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ncmlkW19pMl1bX2oyXSA9IG1heE9mW2luZGljZXNbMF1dO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYWNlYmFja0dyaWRbX2kyXVtfajJdID0gW2luZGljZXMuaW5jbHVkZXMoMCksIGluZGljZXMuaW5jbHVkZXMoMSksIGluZGljZXMuaW5jbHVkZXMoMildO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVXBkYXRlIGFsaWdubWVudCBzY29yZVxuICAgICAgICAgICAgdGhpcy5zY29yZSA9IHRoaXMuZ3JpZFt0aGlzLmlNYXggLSAxXVt0aGlzLmpNYXggLSAxXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldHMgYWxsIHBvc3NpYmxlIHZhbGlkIHNlcXVlbmNlIGNvbWJpbmF0aW9uc1xuXG4gICAgfSwge1xuICAgICAgICBrZXk6IFwiYWxpZ25tZW50VHJhY2ViYWNrXCIsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBhbGlnbm1lbnRUcmFjZWJhY2soKSB7XG4gICAgICAgICAgICB2YXIgaW5Qcm9jZXNzQWxpZ25tZW50cyA9IFtdO1xuXG4gICAgICAgICAgICBpblByb2Nlc3NBbGlnbm1lbnRzLnB1c2goeyBwb3M6IFt0aGlzLnNlcXVlbmNlMS5sZW5ndGgsIHRoaXMuc2VxdWVuY2UyLmxlbmd0aF0sXG4gICAgICAgICAgICAgICAgc2VxMTogXCJcIixcbiAgICAgICAgICAgICAgICBzZXEyOiBcIlwiXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgd2hpbGUgKGluUHJvY2Vzc0FsaWdubWVudHNbMF0pIHtcbiAgICAgICAgICAgICAgICB2YXIgY3VycmVudCA9IGluUHJvY2Vzc0FsaWdubWVudHNbMF07XG4gICAgICAgICAgICAgICAgdmFyIGRpcmVjdGlvbnMgPSB0aGlzLnRyYWNlYmFja0dyaWRbY3VycmVudC5wb3NbMF1dW2N1cnJlbnQucG9zWzFdXTtcblxuICAgICAgICAgICAgICAgIGlmIChkaXJlY3Rpb25zWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgIGluUHJvY2Vzc0FsaWdubWVudHMucHVzaCh7IHBvczogW2N1cnJlbnQucG9zWzBdIC0gMSwgY3VycmVudC5wb3NbMV0gLSAxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcTE6IHRoaXMuc2VxdWVuY2UxW2N1cnJlbnQucG9zWzBdIC0gMV0gKyBjdXJyZW50LnNlcTEsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXEyOiB0aGlzLnNlcXVlbmNlMltjdXJyZW50LnBvc1sxXSAtIDFdICsgY3VycmVudC5zZXEyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZGlyZWN0aW9uc1sxXSkge1xuICAgICAgICAgICAgICAgICAgICBpblByb2Nlc3NBbGlnbm1lbnRzLnB1c2goeyBwb3M6IFtjdXJyZW50LnBvc1swXSAtIDEsIGN1cnJlbnQucG9zWzFdXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcTE6IHRoaXMuc2VxdWVuY2UxW2N1cnJlbnQucG9zWzBdIC0gMV0gKyBjdXJyZW50LnNlcTEsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXEyOiAnLScgKyBjdXJyZW50LnNlcTJcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChkaXJlY3Rpb25zWzJdKSB7XG4gICAgICAgICAgICAgICAgICAgIGluUHJvY2Vzc0FsaWdubWVudHMucHVzaCh7IHBvczogW2N1cnJlbnQucG9zWzBdLCBjdXJyZW50LnBvc1sxXSAtIDFdLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VxMTogJy0nICsgY3VycmVudC5zZXExLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VxMjogdGhpcy5zZXF1ZW5jZTJbY3VycmVudC5wb3NbMV0gLSAxXSArIGN1cnJlbnQuc2VxMlxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudC5wb3NbMF0gPT09IDAgJiYgY3VycmVudC5wb3NbMV0gPT09IDApIHRoaXMuYWxpZ25tZW50cy5wdXNoKHsgc2VxdWVuY2UxOiBjdXJyZW50LnNlcTEsXG4gICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlMjogY3VycmVudC5zZXEyXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpblByb2Nlc3NBbGlnbm1lbnRzLnNoaWZ0KCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFsaWdubWVudHM7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIZWxwZXIgRnVuY3Rpb25zXG5cbiAgICB9LCB7XG4gICAgICAgIGtleTogXCJnZXRBbGxJbmRleGVzXCIsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRBbGxJbmRleGVzKGFyciwgdmFsKSB7XG4gICAgICAgICAgICB2YXIgaW5kZXhlcyA9IFtdLFxuICAgICAgICAgICAgICAgIGkgPSAtMTtcbiAgICAgICAgICAgIHdoaWxlICgoaSA9IGFyci5pbmRleE9mKHZhbCwgaSArIDEpKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBpbmRleGVzLnB1c2goaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaW5kZXhlcztcbiAgICAgICAgfVxuICAgIH0sIHtcbiAgICAgICAga2V5OiBcImFycmF5QWxsTWF4SW5kZXhlc1wiLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gYXJyYXlBbGxNYXhJbmRleGVzKGFycmF5KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRBbGxJbmRleGVzKGFycmF5LCBNYXRoLm1heC5hcHBseShudWxsLCBhcnJheSkpO1xuICAgICAgICB9XG4gICAgfV0pO1xuXG4gICAgcmV0dXJuIE5lZWRsZW1hbld1bnNjaDtcbn0oKTtcblxubW9kdWxlLmV4cG9ydHMgPSBOZWVkbGVtYW5XdW5zY2g7XG5cbi8qKiovIH0pLFxuLyogMjggKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIGxheW91dEJhc2UgPSBmdW5jdGlvbiBsYXlvdXRCYXNlKCkge1xuICByZXR1cm47XG59O1xuXG5sYXlvdXRCYXNlLkZETGF5b3V0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOCk7XG5sYXlvdXRCYXNlLkZETGF5b3V0Q29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcbmxheW91dEJhc2UuRkRMYXlvdXRFZGdlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOSk7XG5sYXlvdXRCYXNlLkZETGF5b3V0Tm9kZSA9IF9fd2VicGFja19yZXF1aXJlX18oMjApO1xubGF5b3V0QmFzZS5EaW1lbnNpb25EID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMSk7XG5sYXlvdXRCYXNlLkhhc2hNYXAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIyKTtcbmxheW91dEJhc2UuSGFzaFNldCA9IF9fd2VicGFja19yZXF1aXJlX18oMjMpO1xubGF5b3V0QmFzZS5JR2VvbWV0cnkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgpO1xubGF5b3V0QmFzZS5JTWF0aCA9IF9fd2VicGFja19yZXF1aXJlX18oOSk7XG5sYXlvdXRCYXNlLkludGVnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKTtcbmxheW91dEJhc2UuUG9pbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyKTtcbmxheW91dEJhc2UuUG9pbnREID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTtcbmxheW91dEJhc2UuUmFuZG9tU2VlZCA9IF9fd2VicGFja19yZXF1aXJlX18oMTYpO1xubGF5b3V0QmFzZS5SZWN0YW5nbGVEID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMyk7XG5sYXlvdXRCYXNlLlRyYW5zZm9ybSA9IF9fd2VicGFja19yZXF1aXJlX18oMTcpO1xubGF5b3V0QmFzZS5VbmlxdWVJREdlbmVyZXRvciA9IF9fd2VicGFja19yZXF1aXJlX18oMTQpO1xubGF5b3V0QmFzZS5RdWlja3NvcnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI1KTtcbmxheW91dEJhc2UuTGlua2VkTGlzdCA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpO1xubGF5b3V0QmFzZS5MR3JhcGhPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xubGF5b3V0QmFzZS5MR3JhcGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpO1xubGF5b3V0QmFzZS5MRWRnZSA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5sYXlvdXRCYXNlLkxHcmFwaE1hbmFnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpO1xubGF5b3V0QmFzZS5MTm9kZSA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7XG5sYXlvdXRCYXNlLkxheW91dCA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpO1xubGF5b3V0QmFzZS5MYXlvdXRDb25zdGFudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xubGF5b3V0QmFzZS5OZWVkbGVtYW5XdW5zY2ggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI3KTtcbmxheW91dEJhc2UuTWF0cml4ID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNCk7XG5sYXlvdXRCYXNlLlNWRCA9IF9fd2VicGFja19yZXF1aXJlX18oMjYpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGxheW91dEJhc2U7XG5cbi8qKiovIH0pLFxuLyogMjkgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuZnVuY3Rpb24gRW1pdHRlcigpIHtcbiAgdGhpcy5saXN0ZW5lcnMgPSBbXTtcbn1cblxudmFyIHAgPSBFbWl0dGVyLnByb3RvdHlwZTtcblxucC5hZGRMaXN0ZW5lciA9IGZ1bmN0aW9uIChldmVudCwgY2FsbGJhY2spIHtcbiAgdGhpcy5saXN0ZW5lcnMucHVzaCh7XG4gICAgZXZlbnQ6IGV2ZW50LFxuICAgIGNhbGxiYWNrOiBjYWxsYmFja1xuICB9KTtcbn07XG5cbnAucmVtb3ZlTGlzdGVuZXIgPSBmdW5jdGlvbiAoZXZlbnQsIGNhbGxiYWNrKSB7XG4gIGZvciAodmFyIGkgPSB0aGlzLmxpc3RlbmVycy5sZW5ndGg7IGkgPj0gMDsgaS0tKSB7XG4gICAgdmFyIGwgPSB0aGlzLmxpc3RlbmVyc1tpXTtcblxuICAgIGlmIChsLmV2ZW50ID09PSBldmVudCAmJiBsLmNhbGxiYWNrID09PSBjYWxsYmFjaykge1xuICAgICAgdGhpcy5saXN0ZW5lcnMuc3BsaWNlKGksIDEpO1xuICAgIH1cbiAgfVxufTtcblxucC5lbWl0ID0gZnVuY3Rpb24gKGV2ZW50LCBkYXRhKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5saXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbCA9IHRoaXMubGlzdGVuZXJzW2ldO1xuXG4gICAgaWYgKGV2ZW50ID09PSBsLmV2ZW50KSB7XG4gICAgICBsLmNhbGxiYWNrKGRhdGEpO1xuICAgIH1cbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBFbWl0dGVyO1xuXG4vKioqLyB9KVxuLyoqKioqKi8gXSk7XG59KTsiLCIvKipcbiAqIGxvZGFzaCAoQ3VzdG9tIEJ1aWxkKSA8aHR0cHM6Ly9sb2Rhc2guY29tLz5cbiAqIEJ1aWxkOiBgbG9kYXNoIG1vZHVsYXJpemUgZXhwb3J0cz1cIm5wbVwiIC1vIC4vYFxuICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMgPGh0dHBzOi8vanF1ZXJ5Lm9yZy8+XG4gKiBSZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+XG4gKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPlxuICogQ29weXJpZ2h0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4gKi9cblxuLyoqIFVzZWQgYXMgdGhlIGBUeXBlRXJyb3JgIG1lc3NhZ2UgZm9yIFwiRnVuY3Rpb25zXCIgbWV0aG9kcy4gKi9cbnZhciBGVU5DX0VSUk9SX1RFWFQgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbic7XG5cbi8qKiBVc2VkIGFzIHRoZSBpbnRlcm5hbCBhcmd1bWVudCBwbGFjZWhvbGRlci4gKi9cbnZhciBQTEFDRUhPTERFUiA9ICdfX2xvZGFzaF9wbGFjZWhvbGRlcl9fJztcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgZnVuY3Rpb24gbWV0YWRhdGEuICovXG52YXIgQklORF9GTEFHID0gMSxcbiAgICBCSU5EX0tFWV9GTEFHID0gMixcbiAgICBDVVJSWV9CT1VORF9GTEFHID0gNCxcbiAgICBDVVJSWV9GTEFHID0gOCxcbiAgICBDVVJSWV9SSUdIVF9GTEFHID0gMTYsXG4gICAgUEFSVElBTF9GTEFHID0gMzIsXG4gICAgUEFSVElBTF9SSUdIVF9GTEFHID0gNjQsXG4gICAgQVJZX0ZMQUcgPSAxMjgsXG4gICAgUkVBUkdfRkxBRyA9IDI1NixcbiAgICBGTElQX0ZMQUcgPSA1MTI7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIElORklOSVRZID0gMSAvIDAsXG4gICAgTUFYX1NBRkVfSU5URUdFUiA9IDkwMDcxOTkyNTQ3NDA5OTEsXG4gICAgTUFYX0lOVEVHRVIgPSAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOCxcbiAgICBOQU4gPSAwIC8gMDtcblxuLyoqIFVzZWQgdG8gYXNzb2NpYXRlIHdyYXAgbWV0aG9kcyB3aXRoIHRoZWlyIGJpdCBmbGFncy4gKi9cbnZhciB3cmFwRmxhZ3MgPSBbXG4gIFsnYXJ5JywgQVJZX0ZMQUddLFxuICBbJ2JpbmQnLCBCSU5EX0ZMQUddLFxuICBbJ2JpbmRLZXknLCBCSU5EX0tFWV9GTEFHXSxcbiAgWydjdXJyeScsIENVUlJZX0ZMQUddLFxuICBbJ2N1cnJ5UmlnaHQnLCBDVVJSWV9SSUdIVF9GTEFHXSxcbiAgWydmbGlwJywgRkxJUF9GTEFHXSxcbiAgWydwYXJ0aWFsJywgUEFSVElBTF9GTEFHXSxcbiAgWydwYXJ0aWFsUmlnaHQnLCBQQVJUSUFMX1JJR0hUX0ZMQUddLFxuICBbJ3JlYXJnJywgUkVBUkdfRkxBR11cbl07XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBmdW5jVGFnID0gJ1tvYmplY3QgRnVuY3Rpb25dJyxcbiAgICBnZW5UYWcgPSAnW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0nLFxuICAgIHN5bWJvbFRhZyA9ICdbb2JqZWN0IFN5bWJvbF0nO1xuXG4vKipcbiAqIFVzZWQgdG8gbWF0Y2ggYFJlZ0V4cGBcbiAqIFtzeW50YXggY2hhcmFjdGVyc10oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcGF0dGVybnMpLlxuICovXG52YXIgcmVSZWdFeHBDaGFyID0gL1tcXFxcXiQuKis/KClbXFxde318XS9nO1xuXG4vKiogVXNlZCB0byBtYXRjaCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLiAqL1xudmFyIHJlVHJpbSA9IC9eXFxzK3xcXHMrJC9nO1xuXG4vKiogVXNlZCB0byBtYXRjaCB3cmFwIGRldGFpbCBjb21tZW50cy4gKi9cbnZhciByZVdyYXBDb21tZW50ID0gL1xceyg/OlxcblxcL1xcKiBcXFt3cmFwcGVkIHdpdGggLitcXF0gXFwqXFwvKT9cXG4/LyxcbiAgICByZVdyYXBEZXRhaWxzID0gL1xce1xcblxcL1xcKiBcXFt3cmFwcGVkIHdpdGggKC4rKVxcXSBcXCovLFxuICAgIHJlU3BsaXREZXRhaWxzID0gLyw/ICYgLztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJhZCBzaWduZWQgaGV4YWRlY2ltYWwgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzQmFkSGV4ID0gL15bLStdMHhbMC05YS1mXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBiaW5hcnkgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzQmluYXJ5ID0gL14wYlswMV0rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgaG9zdCBjb25zdHJ1Y3RvcnMgKFNhZmFyaSkuICovXG52YXIgcmVJc0hvc3RDdG9yID0gL15cXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXF0kLztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG9jdGFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc09jdGFsID0gL14wb1swLTddKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IHVuc2lnbmVkIGludGVnZXIgdmFsdWVzLiAqL1xudmFyIHJlSXNVaW50ID0gL14oPzowfFsxLTldXFxkKikkLztcblxuLyoqIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHdpdGhvdXQgYSBkZXBlbmRlbmN5IG9uIGByb290YC4gKi9cbnZhciBmcmVlUGFyc2VJbnQgPSBwYXJzZUludDtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBnbG9iYWxgIGZyb20gTm9kZS5qcy4gKi9cbnZhciBmcmVlR2xvYmFsID0gdHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWwgJiYgZ2xvYmFsLk9iamVjdCA9PT0gT2JqZWN0ICYmIGdsb2JhbDtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBzZWxmYC4gKi9cbnZhciBmcmVlU2VsZiA9IHR5cGVvZiBzZWxmID09ICdvYmplY3QnICYmIHNlbGYgJiYgc2VsZi5PYmplY3QgPT09IE9iamVjdCAmJiBzZWxmO1xuXG4vKiogVXNlZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4gKi9cbnZhciByb290ID0gZnJlZUdsb2JhbCB8fCBmcmVlU2VsZiB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG4vKipcbiAqIEEgZmFzdGVyIGFsdGVybmF0aXZlIHRvIGBGdW5jdGlvbiNhcHBseWAsIHRoaXMgZnVuY3Rpb24gaW52b2tlcyBgZnVuY2BcbiAqIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIGB0aGlzQXJnYCBhbmQgdGhlIGFyZ3VtZW50cyBvZiBgYXJnc2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGludm9rZS5cbiAqIEBwYXJhbSB7Kn0gdGhpc0FyZyBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBgZnVuY2Agd2l0aC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYGZ1bmNgLlxuICovXG5mdW5jdGlvbiBhcHBseShmdW5jLCB0aGlzQXJnLCBhcmdzKSB7XG4gIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICBjYXNlIDA6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZyk7XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0pO1xuICAgIGNhc2UgMjogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICBjYXNlIDM6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gIH1cbiAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyk7XG59XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmZvckVhY2hgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICovXG5mdW5jdGlvbiBhcnJheUVhY2goYXJyYXksIGl0ZXJhdGVlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgaWYgKGl0ZXJhdGVlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSA9PT0gZmFsc2UpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmluY2x1ZGVzYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAqIHNwZWNpZnlpbmcgYW4gaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0geyp9IHRhcmdldCBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdGFyZ2V0YCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBhcnJheUluY2x1ZGVzKGFycmF5LCB2YWx1ZSkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwO1xuICByZXR1cm4gISFsZW5ndGggJiYgYmFzZUluZGV4T2YoYXJyYXksIHZhbHVlLCAwKSA+IC0xO1xufVxuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZpbmRJbmRleGAgYW5kIGBfLmZpbmRMYXN0SW5kZXhgIHdpdGhvdXRcbiAqIHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUZpbmRJbmRleChhcnJheSwgcHJlZGljYXRlLCBmcm9tSW5kZXgsIGZyb21SaWdodCkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgaW5kZXggPSBmcm9tSW5kZXggKyAoZnJvbVJpZ2h0ID8gMSA6IC0xKTtcblxuICB3aGlsZSAoKGZyb21SaWdodCA/IGluZGV4LS0gOiArK2luZGV4IDwgbGVuZ3RoKSkge1xuICAgIGlmIChwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pbmRleE9mYCB3aXRob3V0IGBmcm9tSW5kZXhgIGJvdW5kcyBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgaWYgKHZhbHVlICE9PSB2YWx1ZSkge1xuICAgIHJldHVybiBiYXNlRmluZEluZGV4KGFycmF5LCBiYXNlSXNOYU4sIGZyb21JbmRleCk7XG4gIH1cbiAgdmFyIGluZGV4ID0gZnJvbUluZGV4IC0gMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGlmIChhcnJheVtpbmRleF0gPT09IHZhbHVlKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc05hTmAgd2l0aG91dCBzdXBwb3J0IGZvciBudW1iZXIgb2JqZWN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgTmFOYCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNOYU4odmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBudW1iZXIgb2YgYHBsYWNlaG9sZGVyYCBvY2N1cnJlbmNlcyBpbiBgYXJyYXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0gcGxhY2Vob2xkZXIgVGhlIHBsYWNlaG9sZGVyIHRvIHNlYXJjaCBmb3IuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBwbGFjZWhvbGRlciBjb3VudC5cbiAqL1xuZnVuY3Rpb24gY291bnRIb2xkZXJzKGFycmF5LCBwbGFjZWhvbGRlcikge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgcmVzdWx0ID0gMDtcblxuICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICBpZiAoYXJyYXlbbGVuZ3RoXSA9PT0gcGxhY2Vob2xkZXIpIHtcbiAgICAgIHJlc3VsdCsrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHZhbHVlIGF0IGBrZXlgIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBnZXRWYWx1ZShvYmplY3QsIGtleSkge1xuICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3Rba2V5XTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIGhvc3Qgb2JqZWN0IGluIElFIDwgOS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGhvc3Qgb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzSG9zdE9iamVjdCh2YWx1ZSkge1xuICAvLyBNYW55IGhvc3Qgb2JqZWN0cyBhcmUgYE9iamVjdGAgb2JqZWN0cyB0aGF0IGNhbiBjb2VyY2UgdG8gc3RyaW5nc1xuICAvLyBkZXNwaXRlIGhhdmluZyBpbXByb3Blcmx5IGRlZmluZWQgYHRvU3RyaW5nYCBtZXRob2RzLlxuICB2YXIgcmVzdWx0ID0gZmFsc2U7XG4gIGlmICh2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZS50b1N0cmluZyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9ICEhKHZhbHVlICsgJycpO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBSZXBsYWNlcyBhbGwgYHBsYWNlaG9sZGVyYCBlbGVtZW50cyBpbiBgYXJyYXlgIHdpdGggYW4gaW50ZXJuYWwgcGxhY2Vob2xkZXJcbiAqIGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIHRoZWlyIGluZGV4ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gKiBAcGFyYW0geyp9IHBsYWNlaG9sZGVyIFRoZSBwbGFjZWhvbGRlciB0byByZXBsYWNlLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAqL1xuZnVuY3Rpb24gcmVwbGFjZUhvbGRlcnMoYXJyYXksIHBsYWNlaG9sZGVyKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgcmVzSW5kZXggPSAwLFxuICAgICAgcmVzdWx0ID0gW107XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgaWYgKHZhbHVlID09PSBwbGFjZWhvbGRlciB8fCB2YWx1ZSA9PT0gUExBQ0VIT0xERVIpIHtcbiAgICAgIGFycmF5W2luZGV4XSA9IFBMQUNFSE9MREVSO1xuICAgICAgcmVzdWx0W3Jlc0luZGV4KytdID0gaW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBmdW5jUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGUsXG4gICAgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBkZXRlY3Qgb3ZlcnJlYWNoaW5nIGNvcmUtanMgc2hpbXMuICovXG52YXIgY29yZUpzRGF0YSA9IHJvb3RbJ19fY29yZS1qc19zaGFyZWRfXyddO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgbWV0aG9kcyBtYXNxdWVyYWRpbmcgYXMgbmF0aXZlLiAqL1xudmFyIG1hc2tTcmNLZXkgPSAoZnVuY3Rpb24oKSB7XG4gIHZhciB1aWQgPSAvW14uXSskLy5leGVjKGNvcmVKc0RhdGEgJiYgY29yZUpzRGF0YS5rZXlzICYmIGNvcmVKc0RhdGEua2V5cy5JRV9QUk9UTyB8fCAnJyk7XG4gIHJldHVybiB1aWQgPyAoJ1N5bWJvbChzcmMpXzEuJyArIHVpZCkgOiAnJztcbn0oKSk7XG5cbi8qKiBVc2VkIHRvIHJlc29sdmUgdGhlIGRlY29tcGlsZWQgc291cmNlIG9mIGZ1bmN0aW9ucy4gKi9cbnZhciBmdW5jVG9TdHJpbmcgPSBmdW5jUHJvdG8udG9TdHJpbmc7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBvYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgaWYgYSBtZXRob2QgaXMgbmF0aXZlLiAqL1xudmFyIHJlSXNOYXRpdmUgPSBSZWdFeHAoJ14nICtcbiAgZnVuY1RvU3RyaW5nLmNhbGwoaGFzT3duUHJvcGVydHkpLnJlcGxhY2UocmVSZWdFeHBDaGFyLCAnXFxcXCQmJylcbiAgLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFxcXFwoKXwgZm9yIC4rPyg/PVxcXFxcXF0pL2csICckMS4qPycpICsgJyQnXG4pO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RDcmVhdGUgPSBPYmplY3QuY3JlYXRlO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlTWF4ID0gTWF0aC5tYXgsXG4gICAgbmF0aXZlTWluID0gTWF0aC5taW47XG5cbi8qIFVzZWQgdG8gc2V0IGB0b1N0cmluZ2AgbWV0aG9kcy4gKi9cbnZhciBkZWZpbmVQcm9wZXJ0eSA9IChmdW5jdGlvbigpIHtcbiAgdmFyIGZ1bmMgPSBnZXROYXRpdmUoT2JqZWN0LCAnZGVmaW5lUHJvcGVydHknKSxcbiAgICAgIG5hbWUgPSBnZXROYXRpdmUubmFtZTtcblxuICByZXR1cm4gKG5hbWUgJiYgbmFtZS5sZW5ndGggPiAyKSA/IGZ1bmMgOiB1bmRlZmluZWQ7XG59KCkpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmNyZWF0ZWAgd2l0aG91dCBzdXBwb3J0IGZvciBhc3NpZ25pbmdcbiAqIHByb3BlcnRpZXMgdG8gdGhlIGNyZWF0ZWQgb2JqZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvdG90eXBlIFRoZSBvYmplY3QgdG8gaW5oZXJpdCBmcm9tLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gYmFzZUNyZWF0ZShwcm90bykge1xuICByZXR1cm4gaXNPYmplY3QocHJvdG8pID8gb2JqZWN0Q3JlYXRlKHByb3RvKSA6IHt9O1xufVxuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTmF0aXZlYCB3aXRob3V0IGJhZCBzaGltIGNoZWNrcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG5hdGl2ZSBmdW5jdGlvbixcbiAqICBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc05hdGl2ZSh2YWx1ZSkge1xuICBpZiAoIWlzT2JqZWN0KHZhbHVlKSB8fCBpc01hc2tlZCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHBhdHRlcm4gPSAoaXNGdW5jdGlvbih2YWx1ZSkgfHwgaXNIb3N0T2JqZWN0KHZhbHVlKSkgPyByZUlzTmF0aXZlIDogcmVJc0hvc3RDdG9yO1xuICByZXR1cm4gcGF0dGVybi50ZXN0KHRvU291cmNlKHZhbHVlKSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSB0aGF0IGlzIHRoZSBjb21wb3NpdGlvbiBvZiBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMsXG4gKiBwbGFjZWhvbGRlcnMsIGFuZCBwcm92aWRlZCBhcmd1bWVudHMgaW50byBhIHNpbmdsZSBhcnJheSBvZiBhcmd1bWVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgVGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7QXJyYXl9IHBhcnRpYWxzIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZC5cbiAqIEBwYXJhbSB7QXJyYXl9IGhvbGRlcnMgVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAqIEBwYXJhbXMge2Jvb2xlYW59IFtpc0N1cnJpZWRdIFNwZWNpZnkgY29tcG9zaW5nIGZvciBhIGN1cnJpZWQgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21wb3NlZCBhcmd1bWVudHMuXG4gKi9cbmZ1bmN0aW9uIGNvbXBvc2VBcmdzKGFyZ3MsIHBhcnRpYWxzLCBob2xkZXJzLCBpc0N1cnJpZWQpIHtcbiAgdmFyIGFyZ3NJbmRleCA9IC0xLFxuICAgICAgYXJnc0xlbmd0aCA9IGFyZ3MubGVuZ3RoLFxuICAgICAgaG9sZGVyc0xlbmd0aCA9IGhvbGRlcnMubGVuZ3RoLFxuICAgICAgbGVmdEluZGV4ID0gLTEsXG4gICAgICBsZWZ0TGVuZ3RoID0gcGFydGlhbHMubGVuZ3RoLFxuICAgICAgcmFuZ2VMZW5ndGggPSBuYXRpdmVNYXgoYXJnc0xlbmd0aCAtIGhvbGRlcnNMZW5ndGgsIDApLFxuICAgICAgcmVzdWx0ID0gQXJyYXkobGVmdExlbmd0aCArIHJhbmdlTGVuZ3RoKSxcbiAgICAgIGlzVW5jdXJyaWVkID0gIWlzQ3VycmllZDtcblxuICB3aGlsZSAoKytsZWZ0SW5kZXggPCBsZWZ0TGVuZ3RoKSB7XG4gICAgcmVzdWx0W2xlZnRJbmRleF0gPSBwYXJ0aWFsc1tsZWZ0SW5kZXhdO1xuICB9XG4gIHdoaWxlICgrK2FyZ3NJbmRleCA8IGhvbGRlcnNMZW5ndGgpIHtcbiAgICBpZiAoaXNVbmN1cnJpZWQgfHwgYXJnc0luZGV4IDwgYXJnc0xlbmd0aCkge1xuICAgICAgcmVzdWx0W2hvbGRlcnNbYXJnc0luZGV4XV0gPSBhcmdzW2FyZ3NJbmRleF07XG4gICAgfVxuICB9XG4gIHdoaWxlIChyYW5nZUxlbmd0aC0tKSB7XG4gICAgcmVzdWx0W2xlZnRJbmRleCsrXSA9IGFyZ3NbYXJnc0luZGV4KytdO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlIGBjb21wb3NlQXJnc2AgZXhjZXB0IHRoYXQgdGhlIGFyZ3VtZW50cyBjb21wb3NpdGlvblxuICogaXMgdGFpbG9yZWQgZm9yIGBfLnBhcnRpYWxSaWdodGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgVGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7QXJyYXl9IHBhcnRpYWxzIFRoZSBhcmd1bWVudHMgdG8gYXBwZW5kIHRvIHRob3NlIHByb3ZpZGVkLlxuICogQHBhcmFtIHtBcnJheX0gaG9sZGVycyBUaGUgYHBhcnRpYWxzYCBwbGFjZWhvbGRlciBpbmRleGVzLlxuICogQHBhcmFtcyB7Ym9vbGVhbn0gW2lzQ3VycmllZF0gU3BlY2lmeSBjb21wb3NpbmcgZm9yIGEgY3VycmllZCBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGNvbXBvc2VkIGFyZ3VtZW50cy5cbiAqL1xuZnVuY3Rpb24gY29tcG9zZUFyZ3NSaWdodChhcmdzLCBwYXJ0aWFscywgaG9sZGVycywgaXNDdXJyaWVkKSB7XG4gIHZhciBhcmdzSW5kZXggPSAtMSxcbiAgICAgIGFyZ3NMZW5ndGggPSBhcmdzLmxlbmd0aCxcbiAgICAgIGhvbGRlcnNJbmRleCA9IC0xLFxuICAgICAgaG9sZGVyc0xlbmd0aCA9IGhvbGRlcnMubGVuZ3RoLFxuICAgICAgcmlnaHRJbmRleCA9IC0xLFxuICAgICAgcmlnaHRMZW5ndGggPSBwYXJ0aWFscy5sZW5ndGgsXG4gICAgICByYW5nZUxlbmd0aCA9IG5hdGl2ZU1heChhcmdzTGVuZ3RoIC0gaG9sZGVyc0xlbmd0aCwgMCksXG4gICAgICByZXN1bHQgPSBBcnJheShyYW5nZUxlbmd0aCArIHJpZ2h0TGVuZ3RoKSxcbiAgICAgIGlzVW5jdXJyaWVkID0gIWlzQ3VycmllZDtcblxuICB3aGlsZSAoKythcmdzSW5kZXggPCByYW5nZUxlbmd0aCkge1xuICAgIHJlc3VsdFthcmdzSW5kZXhdID0gYXJnc1thcmdzSW5kZXhdO1xuICB9XG4gIHZhciBvZmZzZXQgPSBhcmdzSW5kZXg7XG4gIHdoaWxlICgrK3JpZ2h0SW5kZXggPCByaWdodExlbmd0aCkge1xuICAgIHJlc3VsdFtvZmZzZXQgKyByaWdodEluZGV4XSA9IHBhcnRpYWxzW3JpZ2h0SW5kZXhdO1xuICB9XG4gIHdoaWxlICgrK2hvbGRlcnNJbmRleCA8IGhvbGRlcnNMZW5ndGgpIHtcbiAgICBpZiAoaXNVbmN1cnJpZWQgfHwgYXJnc0luZGV4IDwgYXJnc0xlbmd0aCkge1xuICAgICAgcmVzdWx0W29mZnNldCArIGhvbGRlcnNbaG9sZGVyc0luZGV4XV0gPSBhcmdzW2FyZ3NJbmRleCsrXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiBgc291cmNlYCB0byBgYXJyYXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBzb3VyY2UgVGhlIGFycmF5IHRvIGNvcHkgdmFsdWVzIGZyb20uXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXk9W11dIFRoZSBhcnJheSB0byBjb3B5IHZhbHVlcyB0by5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICovXG5mdW5jdGlvbiBjb3B5QXJyYXkoc291cmNlLCBhcnJheSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IHNvdXJjZS5sZW5ndGg7XG5cbiAgYXJyYXkgfHwgKGFycmF5ID0gQXJyYXkobGVuZ3RoKSk7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgYXJyYXlbaW5kZXhdID0gc291cmNlW2luZGV4XTtcbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIHRvIGludm9rZSBpdCB3aXRoIHRoZSBvcHRpb25hbCBgdGhpc2BcbiAqIGJpbmRpbmcgb2YgYHRoaXNBcmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVCaW5kKGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcpIHtcbiAgdmFyIGlzQmluZCA9IGJpdG1hc2sgJiBCSU5EX0ZMQUcsXG4gICAgICBDdG9yID0gY3JlYXRlQ3RvcihmdW5jKTtcblxuICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgIHZhciBmbiA9ICh0aGlzICYmIHRoaXMgIT09IHJvb3QgJiYgdGhpcyBpbnN0YW5jZW9mIHdyYXBwZXIpID8gQ3RvciA6IGZ1bmM7XG4gICAgcmV0dXJuIGZuLmFwcGx5KGlzQmluZCA/IHRoaXNBcmcgOiB0aGlzLCBhcmd1bWVudHMpO1xuICB9XG4gIHJldHVybiB3cmFwcGVyO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHByb2R1Y2VzIGFuIGluc3RhbmNlIG9mIGBDdG9yYCByZWdhcmRsZXNzIG9mXG4gKiB3aGV0aGVyIGl0IHdhcyBpbnZva2VkIGFzIHBhcnQgb2YgYSBgbmV3YCBleHByZXNzaW9uIG9yIGJ5IGBjYWxsYCBvciBgYXBwbHlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBDdG9yIFRoZSBjb25zdHJ1Y3RvciB0byB3cmFwLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ3RvcihDdG9yKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAvLyBVc2UgYSBgc3dpdGNoYCBzdGF0ZW1lbnQgdG8gd29yayB3aXRoIGNsYXNzIGNvbnN0cnVjdG9ycy4gU2VlXG4gICAgLy8gaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1mdW5jdGlvbi1vYmplY3RzLWNhbGwtdGhpc2FyZ3VtZW50LWFyZ3VtZW50c2xpc3RcbiAgICAvLyBmb3IgbW9yZSBkZXRhaWxzLlxuICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICAgIGNhc2UgMDogcmV0dXJuIG5ldyBDdG9yO1xuICAgICAgY2FzZSAxOiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSk7XG4gICAgICBjYXNlIDI6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICAgIGNhc2UgMzogcmV0dXJuIG5ldyBDdG9yKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgICAgY2FzZSA0OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7XG4gICAgICBjYXNlIDU6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdLCBhcmdzWzRdKTtcbiAgICAgIGNhc2UgNjogcmV0dXJuIG5ldyBDdG9yKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10sIGFyZ3NbNF0sIGFyZ3NbNV0pO1xuICAgICAgY2FzZSA3OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSwgYXJnc1s1XSwgYXJnc1s2XSk7XG4gICAgfVxuICAgIHZhciB0aGlzQmluZGluZyA9IGJhc2VDcmVhdGUoQ3Rvci5wcm90b3R5cGUpLFxuICAgICAgICByZXN1bHQgPSBDdG9yLmFwcGx5KHRoaXNCaW5kaW5nLCBhcmdzKTtcblxuICAgIC8vIE1pbWljIHRoZSBjb25zdHJ1Y3RvcidzIGByZXR1cm5gIGJlaGF2aW9yLlxuICAgIC8vIFNlZSBodHRwczovL2VzNS5naXRodWIuaW8vI3gxMy4yLjIgZm9yIG1vcmUgZGV0YWlscy5cbiAgICByZXR1cm4gaXNPYmplY3QocmVzdWx0KSA/IHJlc3VsdCA6IHRoaXNCaW5kaW5nO1xuICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCB0byBlbmFibGUgY3VycnlpbmcuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICogQHBhcmFtIHtudW1iZXJ9IGFyaXR5IFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVDdXJyeShmdW5jLCBiaXRtYXNrLCBhcml0eSkge1xuICB2YXIgQ3RvciA9IGNyZWF0ZUN0b3IoZnVuYyk7XG5cbiAgZnVuY3Rpb24gd3JhcHBlcigpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICAgICAgYXJncyA9IEFycmF5KGxlbmd0aCksXG4gICAgICAgIGluZGV4ID0gbGVuZ3RoLFxuICAgICAgICBwbGFjZWhvbGRlciA9IGdldEhvbGRlcih3cmFwcGVyKTtcblxuICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICBhcmdzW2luZGV4XSA9IGFyZ3VtZW50c1tpbmRleF07XG4gICAgfVxuICAgIHZhciBob2xkZXJzID0gKGxlbmd0aCA8IDMgJiYgYXJnc1swXSAhPT0gcGxhY2Vob2xkZXIgJiYgYXJnc1tsZW5ndGggLSAxXSAhPT0gcGxhY2Vob2xkZXIpXG4gICAgICA/IFtdXG4gICAgICA6IHJlcGxhY2VIb2xkZXJzKGFyZ3MsIHBsYWNlaG9sZGVyKTtcblxuICAgIGxlbmd0aCAtPSBob2xkZXJzLmxlbmd0aDtcbiAgICBpZiAobGVuZ3RoIDwgYXJpdHkpIHtcbiAgICAgIHJldHVybiBjcmVhdGVSZWN1cnJ5KFxuICAgICAgICBmdW5jLCBiaXRtYXNrLCBjcmVhdGVIeWJyaWQsIHdyYXBwZXIucGxhY2Vob2xkZXIsIHVuZGVmaW5lZCxcbiAgICAgICAgYXJncywgaG9sZGVycywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFyaXR5IC0gbGVuZ3RoKTtcbiAgICB9XG4gICAgdmFyIGZuID0gKHRoaXMgJiYgdGhpcyAhPT0gcm9vdCAmJiB0aGlzIGluc3RhbmNlb2Ygd3JhcHBlcikgPyBDdG9yIDogZnVuYztcbiAgICByZXR1cm4gYXBwbHkoZm4sIHRoaXMsIGFyZ3MpO1xuICB9XG4gIHJldHVybiB3cmFwcGVyO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCB0byBpbnZva2UgaXQgd2l0aCBvcHRpb25hbCBgdGhpc2BcbiAqIGJpbmRpbmcgb2YgYHRoaXNBcmdgLCBwYXJ0aWFsIGFwcGxpY2F0aW9uLCBhbmQgY3VycnlpbmcuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb258c3RyaW5nfSBmdW5jIFRoZSBmdW5jdGlvbiBvciBtZXRob2QgbmFtZSB0byB3cmFwLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gKiBAcGFyYW0ge0FycmF5fSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZCB0b1xuICogIHRoZSBuZXcgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge0FycmF5fSBbaG9sZGVyc10gVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAqIEBwYXJhbSB7QXJyYXl9IFtwYXJ0aWFsc1JpZ2h0XSBUaGUgYXJndW1lbnRzIHRvIGFwcGVuZCB0byB0aG9zZSBwcm92aWRlZFxuICogIHRvIHRoZSBuZXcgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge0FycmF5fSBbaG9sZGVyc1JpZ2h0XSBUaGUgYHBhcnRpYWxzUmlnaHRgIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJnUG9zXSBUaGUgYXJndW1lbnQgcG9zaXRpb25zIG9mIHRoZSBuZXcgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge251bWJlcn0gW2FyeV0gVGhlIGFyaXR5IGNhcCBvZiBgZnVuY2AuXG4gKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5XSBUaGUgYXJpdHkgb2YgYGZ1bmNgLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlSHlicmlkKGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIHBhcnRpYWxzLCBob2xkZXJzLCBwYXJ0aWFsc1JpZ2h0LCBob2xkZXJzUmlnaHQsIGFyZ1BvcywgYXJ5LCBhcml0eSkge1xuICB2YXIgaXNBcnkgPSBiaXRtYXNrICYgQVJZX0ZMQUcsXG4gICAgICBpc0JpbmQgPSBiaXRtYXNrICYgQklORF9GTEFHLFxuICAgICAgaXNCaW5kS2V5ID0gYml0bWFzayAmIEJJTkRfS0VZX0ZMQUcsXG4gICAgICBpc0N1cnJpZWQgPSBiaXRtYXNrICYgKENVUlJZX0ZMQUcgfCBDVVJSWV9SSUdIVF9GTEFHKSxcbiAgICAgIGlzRmxpcCA9IGJpdG1hc2sgJiBGTElQX0ZMQUcsXG4gICAgICBDdG9yID0gaXNCaW5kS2V5ID8gdW5kZWZpbmVkIDogY3JlYXRlQ3RvcihmdW5jKTtcblxuICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLFxuICAgICAgICBhcmdzID0gQXJyYXkobGVuZ3RoKSxcbiAgICAgICAgaW5kZXggPSBsZW5ndGg7XG5cbiAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgYXJnc1tpbmRleF0gPSBhcmd1bWVudHNbaW5kZXhdO1xuICAgIH1cbiAgICBpZiAoaXNDdXJyaWVkKSB7XG4gICAgICB2YXIgcGxhY2Vob2xkZXIgPSBnZXRIb2xkZXIod3JhcHBlciksXG4gICAgICAgICAgaG9sZGVyc0NvdW50ID0gY291bnRIb2xkZXJzKGFyZ3MsIHBsYWNlaG9sZGVyKTtcbiAgICB9XG4gICAgaWYgKHBhcnRpYWxzKSB7XG4gICAgICBhcmdzID0gY29tcG9zZUFyZ3MoYXJncywgcGFydGlhbHMsIGhvbGRlcnMsIGlzQ3VycmllZCk7XG4gICAgfVxuICAgIGlmIChwYXJ0aWFsc1JpZ2h0KSB7XG4gICAgICBhcmdzID0gY29tcG9zZUFyZ3NSaWdodChhcmdzLCBwYXJ0aWFsc1JpZ2h0LCBob2xkZXJzUmlnaHQsIGlzQ3VycmllZCk7XG4gICAgfVxuICAgIGxlbmd0aCAtPSBob2xkZXJzQ291bnQ7XG4gICAgaWYgKGlzQ3VycmllZCAmJiBsZW5ndGggPCBhcml0eSkge1xuICAgICAgdmFyIG5ld0hvbGRlcnMgPSByZXBsYWNlSG9sZGVycyhhcmdzLCBwbGFjZWhvbGRlcik7XG4gICAgICByZXR1cm4gY3JlYXRlUmVjdXJyeShcbiAgICAgICAgZnVuYywgYml0bWFzaywgY3JlYXRlSHlicmlkLCB3cmFwcGVyLnBsYWNlaG9sZGVyLCB0aGlzQXJnLFxuICAgICAgICBhcmdzLCBuZXdIb2xkZXJzLCBhcmdQb3MsIGFyeSwgYXJpdHkgLSBsZW5ndGhcbiAgICAgICk7XG4gICAgfVxuICAgIHZhciB0aGlzQmluZGluZyA9IGlzQmluZCA/IHRoaXNBcmcgOiB0aGlzLFxuICAgICAgICBmbiA9IGlzQmluZEtleSA/IHRoaXNCaW5kaW5nW2Z1bmNdIDogZnVuYztcblxuICAgIGxlbmd0aCA9IGFyZ3MubGVuZ3RoO1xuICAgIGlmIChhcmdQb3MpIHtcbiAgICAgIGFyZ3MgPSByZW9yZGVyKGFyZ3MsIGFyZ1Bvcyk7XG4gICAgfSBlbHNlIGlmIChpc0ZsaXAgJiYgbGVuZ3RoID4gMSkge1xuICAgICAgYXJncy5yZXZlcnNlKCk7XG4gICAgfVxuICAgIGlmIChpc0FyeSAmJiBhcnkgPCBsZW5ndGgpIHtcbiAgICAgIGFyZ3MubGVuZ3RoID0gYXJ5O1xuICAgIH1cbiAgICBpZiAodGhpcyAmJiB0aGlzICE9PSByb290ICYmIHRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyKSB7XG4gICAgICBmbiA9IEN0b3IgfHwgY3JlYXRlQ3Rvcihmbik7XG4gICAgfVxuICAgIHJldHVybiBmbi5hcHBseSh0aGlzQmluZGluZywgYXJncyk7XG4gIH1cbiAgcmV0dXJuIHdyYXBwZXI7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIHRvIGludm9rZSBpdCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZ1xuICogb2YgYHRoaXNBcmdgIGFuZCBgcGFydGlhbHNgIHByZXBlbmRlZCB0byB0aGUgYXJndW1lbnRzIGl0IHJlY2VpdmVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAqIEBwYXJhbSB7Kn0gdGhpc0FyZyBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICogQHBhcmFtIHtBcnJheX0gcGFydGlhbHMgVGhlIGFyZ3VtZW50cyB0byBwcmVwZW5kIHRvIHRob3NlIHByb3ZpZGVkIHRvXG4gKiAgdGhlIG5ldyBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVBhcnRpYWwoZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMpIHtcbiAgdmFyIGlzQmluZCA9IGJpdG1hc2sgJiBCSU5EX0ZMQUcsXG4gICAgICBDdG9yID0gY3JlYXRlQ3RvcihmdW5jKTtcblxuICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgIHZhciBhcmdzSW5kZXggPSAtMSxcbiAgICAgICAgYXJnc0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsXG4gICAgICAgIGxlZnRJbmRleCA9IC0xLFxuICAgICAgICBsZWZ0TGVuZ3RoID0gcGFydGlhbHMubGVuZ3RoLFxuICAgICAgICBhcmdzID0gQXJyYXkobGVmdExlbmd0aCArIGFyZ3NMZW5ndGgpLFxuICAgICAgICBmbiA9ICh0aGlzICYmIHRoaXMgIT09IHJvb3QgJiYgdGhpcyBpbnN0YW5jZW9mIHdyYXBwZXIpID8gQ3RvciA6IGZ1bmM7XG5cbiAgICB3aGlsZSAoKytsZWZ0SW5kZXggPCBsZWZ0TGVuZ3RoKSB7XG4gICAgICBhcmdzW2xlZnRJbmRleF0gPSBwYXJ0aWFsc1tsZWZ0SW5kZXhdO1xuICAgIH1cbiAgICB3aGlsZSAoYXJnc0xlbmd0aC0tKSB7XG4gICAgICBhcmdzW2xlZnRJbmRleCsrXSA9IGFyZ3VtZW50c1srK2FyZ3NJbmRleF07XG4gICAgfVxuICAgIHJldHVybiBhcHBseShmbiwgaXNCaW5kID8gdGhpc0FyZyA6IHRoaXMsIGFyZ3MpO1xuICB9XG4gIHJldHVybiB3cmFwcGVyO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCB0byBjb250aW51ZSBjdXJyeWluZy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB3cmFwRnVuYyBUaGUgZnVuY3Rpb24gdG8gY3JlYXRlIHRoZSBgZnVuY2Agd3JhcHBlci5cbiAqIEBwYXJhbSB7Kn0gcGxhY2Vob2xkZXIgVGhlIHBsYWNlaG9sZGVyIHZhbHVlLlxuICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAqIEBwYXJhbSB7QXJyYXl9IFtwYXJ0aWFsc10gVGhlIGFyZ3VtZW50cyB0byBwcmVwZW5kIHRvIHRob3NlIHByb3ZpZGVkIHRvXG4gKiAgdGhlIG5ldyBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7QXJyYXl9IFtob2xkZXJzXSBUaGUgYHBhcnRpYWxzYCBwbGFjZWhvbGRlciBpbmRleGVzLlxuICogQHBhcmFtIHtBcnJheX0gW2FyZ1Bvc10gVGhlIGFyZ3VtZW50IHBvc2l0aW9ucyBvZiB0aGUgbmV3IGZ1bmN0aW9uLlxuICogQHBhcmFtIHtudW1iZXJ9IFthcnldIFRoZSBhcml0eSBjYXAgb2YgYGZ1bmNgLlxuICogQHBhcmFtIHtudW1iZXJ9IFthcml0eV0gVGhlIGFyaXR5IG9mIGBmdW5jYC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVJlY3VycnkoZnVuYywgYml0bWFzaywgd3JhcEZ1bmMsIHBsYWNlaG9sZGVyLCB0aGlzQXJnLCBwYXJ0aWFscywgaG9sZGVycywgYXJnUG9zLCBhcnksIGFyaXR5KSB7XG4gIHZhciBpc0N1cnJ5ID0gYml0bWFzayAmIENVUlJZX0ZMQUcsXG4gICAgICBuZXdIb2xkZXJzID0gaXNDdXJyeSA/IGhvbGRlcnMgOiB1bmRlZmluZWQsXG4gICAgICBuZXdIb2xkZXJzUmlnaHQgPSBpc0N1cnJ5ID8gdW5kZWZpbmVkIDogaG9sZGVycyxcbiAgICAgIG5ld1BhcnRpYWxzID0gaXNDdXJyeSA/IHBhcnRpYWxzIDogdW5kZWZpbmVkLFxuICAgICAgbmV3UGFydGlhbHNSaWdodCA9IGlzQ3VycnkgPyB1bmRlZmluZWQgOiBwYXJ0aWFscztcblxuICBiaXRtYXNrIHw9IChpc0N1cnJ5ID8gUEFSVElBTF9GTEFHIDogUEFSVElBTF9SSUdIVF9GTEFHKTtcbiAgYml0bWFzayAmPSB+KGlzQ3VycnkgPyBQQVJUSUFMX1JJR0hUX0ZMQUcgOiBQQVJUSUFMX0ZMQUcpO1xuXG4gIGlmICghKGJpdG1hc2sgJiBDVVJSWV9CT1VORF9GTEFHKSkge1xuICAgIGJpdG1hc2sgJj0gfihCSU5EX0ZMQUcgfCBCSU5EX0tFWV9GTEFHKTtcbiAgfVxuXG4gIHZhciByZXN1bHQgPSB3cmFwRnVuYyhmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBuZXdQYXJ0aWFscywgbmV3SG9sZGVycywgbmV3UGFydGlhbHNSaWdodCwgbmV3SG9sZGVyc1JpZ2h0LCBhcmdQb3MsIGFyeSwgYXJpdHkpO1xuICByZXN1bHQucGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlcjtcbiAgcmV0dXJuIHNldFdyYXBUb1N0cmluZyhyZXN1bHQsIGZ1bmMsIGJpdG1hc2spO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGVpdGhlciBjdXJyaWVzIG9yIGludm9rZXMgYGZ1bmNgIHdpdGggb3B0aW9uYWxcbiAqIGB0aGlzYCBiaW5kaW5nIGFuZCBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb258c3RyaW5nfSBmdW5jIFRoZSBmdW5jdGlvbiBvciBtZXRob2QgbmFtZSB0byB3cmFwLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuXG4gKiAgVGhlIGJpdG1hc2sgbWF5IGJlIGNvbXBvc2VkIG9mIHRoZSBmb2xsb3dpbmcgZmxhZ3M6XG4gKiAgICAgMSAtIGBfLmJpbmRgXG4gKiAgICAgMiAtIGBfLmJpbmRLZXlgXG4gKiAgICAgNCAtIGBfLmN1cnJ5YCBvciBgXy5jdXJyeVJpZ2h0YCBvZiBhIGJvdW5kIGZ1bmN0aW9uXG4gKiAgICAgOCAtIGBfLmN1cnJ5YFxuICogICAgMTYgLSBgXy5jdXJyeVJpZ2h0YFxuICogICAgMzIgLSBgXy5wYXJ0aWFsYFxuICogICAgNjQgLSBgXy5wYXJ0aWFsUmlnaHRgXG4gKiAgIDEyOCAtIGBfLnJlYXJnYFxuICogICAyNTYgLSBgXy5hcnlgXG4gKiAgIDUxMiAtIGBfLmZsaXBgXG4gKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICogQHBhcmFtIHtBcnJheX0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIGJlIHBhcnRpYWxseSBhcHBsaWVkLlxuICogQHBhcmFtIHtBcnJheX0gW2hvbGRlcnNdIFRoZSBgcGFydGlhbHNgIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJnUG9zXSBUaGUgYXJndW1lbnQgcG9zaXRpb25zIG9mIHRoZSBuZXcgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge251bWJlcn0gW2FyeV0gVGhlIGFyaXR5IGNhcCBvZiBgZnVuY2AuXG4gKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5XSBUaGUgYXJpdHkgb2YgYGZ1bmNgLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlV3JhcChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscywgaG9sZGVycywgYXJnUG9zLCBhcnksIGFyaXR5KSB7XG4gIHZhciBpc0JpbmRLZXkgPSBiaXRtYXNrICYgQklORF9LRVlfRkxBRztcbiAgaWYgKCFpc0JpbmRLZXkgJiYgdHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgfVxuICB2YXIgbGVuZ3RoID0gcGFydGlhbHMgPyBwYXJ0aWFscy5sZW5ndGggOiAwO1xuICBpZiAoIWxlbmd0aCkge1xuICAgIGJpdG1hc2sgJj0gfihQQVJUSUFMX0ZMQUcgfCBQQVJUSUFMX1JJR0hUX0ZMQUcpO1xuICAgIHBhcnRpYWxzID0gaG9sZGVycyA9IHVuZGVmaW5lZDtcbiAgfVxuICBhcnkgPSBhcnkgPT09IHVuZGVmaW5lZCA/IGFyeSA6IG5hdGl2ZU1heCh0b0ludGVnZXIoYXJ5KSwgMCk7XG4gIGFyaXR5ID0gYXJpdHkgPT09IHVuZGVmaW5lZCA/IGFyaXR5IDogdG9JbnRlZ2VyKGFyaXR5KTtcbiAgbGVuZ3RoIC09IGhvbGRlcnMgPyBob2xkZXJzLmxlbmd0aCA6IDA7XG5cbiAgaWYgKGJpdG1hc2sgJiBQQVJUSUFMX1JJR0hUX0ZMQUcpIHtcbiAgICB2YXIgcGFydGlhbHNSaWdodCA9IHBhcnRpYWxzLFxuICAgICAgICBob2xkZXJzUmlnaHQgPSBob2xkZXJzO1xuXG4gICAgcGFydGlhbHMgPSBob2xkZXJzID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgdmFyIG5ld0RhdGEgPSBbXG4gICAgZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMsIGhvbGRlcnMsIHBhcnRpYWxzUmlnaHQsIGhvbGRlcnNSaWdodCxcbiAgICBhcmdQb3MsIGFyeSwgYXJpdHlcbiAgXTtcblxuICBmdW5jID0gbmV3RGF0YVswXTtcbiAgYml0bWFzayA9IG5ld0RhdGFbMV07XG4gIHRoaXNBcmcgPSBuZXdEYXRhWzJdO1xuICBwYXJ0aWFscyA9IG5ld0RhdGFbM107XG4gIGhvbGRlcnMgPSBuZXdEYXRhWzRdO1xuICBhcml0eSA9IG5ld0RhdGFbOV0gPSBuZXdEYXRhWzldID09IG51bGxcbiAgICA/IChpc0JpbmRLZXkgPyAwIDogZnVuYy5sZW5ndGgpXG4gICAgOiBuYXRpdmVNYXgobmV3RGF0YVs5XSAtIGxlbmd0aCwgMCk7XG5cbiAgaWYgKCFhcml0eSAmJiBiaXRtYXNrICYgKENVUlJZX0ZMQUcgfCBDVVJSWV9SSUdIVF9GTEFHKSkge1xuICAgIGJpdG1hc2sgJj0gfihDVVJSWV9GTEFHIHwgQ1VSUllfUklHSFRfRkxBRyk7XG4gIH1cbiAgaWYgKCFiaXRtYXNrIHx8IGJpdG1hc2sgPT0gQklORF9GTEFHKSB7XG4gICAgdmFyIHJlc3VsdCA9IGNyZWF0ZUJpbmQoZnVuYywgYml0bWFzaywgdGhpc0FyZyk7XG4gIH0gZWxzZSBpZiAoYml0bWFzayA9PSBDVVJSWV9GTEFHIHx8IGJpdG1hc2sgPT0gQ1VSUllfUklHSFRfRkxBRykge1xuICAgIHJlc3VsdCA9IGNyZWF0ZUN1cnJ5KGZ1bmMsIGJpdG1hc2ssIGFyaXR5KTtcbiAgfSBlbHNlIGlmICgoYml0bWFzayA9PSBQQVJUSUFMX0ZMQUcgfHwgYml0bWFzayA9PSAoQklORF9GTEFHIHwgUEFSVElBTF9GTEFHKSkgJiYgIWhvbGRlcnMubGVuZ3RoKSB7XG4gICAgcmVzdWx0ID0gY3JlYXRlUGFydGlhbChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscyk7XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0ID0gY3JlYXRlSHlicmlkLmFwcGx5KHVuZGVmaW5lZCwgbmV3RGF0YSk7XG4gIH1cbiAgcmV0dXJuIHNldFdyYXBUb1N0cmluZyhyZXN1bHQsIGZ1bmMsIGJpdG1hc2spO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGFyZ3VtZW50IHBsYWNlaG9sZGVyIHZhbHVlIGZvciBgZnVuY2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcGxhY2Vob2xkZXIgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGdldEhvbGRlcihmdW5jKSB7XG4gIHZhciBvYmplY3QgPSBmdW5jO1xuICByZXR1cm4gb2JqZWN0LnBsYWNlaG9sZGVyO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIG5hdGl2ZSBmdW5jdGlvbiBhdCBga2V5YCBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBtZXRob2QgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGZ1bmN0aW9uIGlmIGl0J3MgbmF0aXZlLCBlbHNlIGB1bmRlZmluZWRgLlxuICovXG5mdW5jdGlvbiBnZXROYXRpdmUob2JqZWN0LCBrZXkpIHtcbiAgdmFyIHZhbHVlID0gZ2V0VmFsdWUob2JqZWN0LCBrZXkpO1xuICByZXR1cm4gYmFzZUlzTmF0aXZlKHZhbHVlKSA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEV4dHJhY3RzIHdyYXBwZXIgZGV0YWlscyBmcm9tIHRoZSBgc291cmNlYCBib2R5IGNvbW1lbnQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgVGhlIHNvdXJjZSB0byBpbnNwZWN0LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB3cmFwcGVyIGRldGFpbHMuXG4gKi9cbmZ1bmN0aW9uIGdldFdyYXBEZXRhaWxzKHNvdXJjZSkge1xuICB2YXIgbWF0Y2ggPSBzb3VyY2UubWF0Y2gocmVXcmFwRGV0YWlscyk7XG4gIHJldHVybiBtYXRjaCA/IG1hdGNoWzFdLnNwbGl0KHJlU3BsaXREZXRhaWxzKSA6IFtdO1xufVxuXG4vKipcbiAqIEluc2VydHMgd3JhcHBlciBgZGV0YWlsc2AgaW4gYSBjb21tZW50IGF0IHRoZSB0b3Agb2YgdGhlIGBzb3VyY2VgIGJvZHkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgVGhlIHNvdXJjZSB0byBtb2RpZnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IGRldGFpbHMgVGhlIGRldGFpbHMgdG8gaW5zZXJ0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgbW9kaWZpZWQgc291cmNlLlxuICovXG5mdW5jdGlvbiBpbnNlcnRXcmFwRGV0YWlscyhzb3VyY2UsIGRldGFpbHMpIHtcbiAgdmFyIGxlbmd0aCA9IGRldGFpbHMubGVuZ3RoLFxuICAgICAgbGFzdEluZGV4ID0gbGVuZ3RoIC0gMTtcblxuICBkZXRhaWxzW2xhc3RJbmRleF0gPSAobGVuZ3RoID4gMSA/ICcmICcgOiAnJykgKyBkZXRhaWxzW2xhc3RJbmRleF07XG4gIGRldGFpbHMgPSBkZXRhaWxzLmpvaW4obGVuZ3RoID4gMiA/ICcsICcgOiAnICcpO1xuICByZXR1cm4gc291cmNlLnJlcGxhY2UocmVXcmFwQ29tbWVudCwgJ3tcXG4vKiBbd3JhcHBlZCB3aXRoICcgKyBkZXRhaWxzICsgJ10gKi9cXG4nKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGFycmF5LWxpa2UgaW5kZXguXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGg9TUFYX1NBRkVfSU5URUdFUl0gVGhlIHVwcGVyIGJvdW5kcyBvZiBhIHZhbGlkIGluZGV4LlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBpbmRleCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0luZGV4KHZhbHVlLCBsZW5ndGgpIHtcbiAgbGVuZ3RoID0gbGVuZ3RoID09IG51bGwgPyBNQVhfU0FGRV9JTlRFR0VSIDogbGVuZ3RoO1xuICByZXR1cm4gISFsZW5ndGggJiZcbiAgICAodHlwZW9mIHZhbHVlID09ICdudW1iZXInIHx8IHJlSXNVaW50LnRlc3QodmFsdWUpKSAmJlxuICAgICh2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDwgbGVuZ3RoKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYGZ1bmNgIGhhcyBpdHMgc291cmNlIG1hc2tlZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGZ1bmNgIGlzIG1hc2tlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc01hc2tlZChmdW5jKSB7XG4gIHJldHVybiAhIW1hc2tTcmNLZXkgJiYgKG1hc2tTcmNLZXkgaW4gZnVuYyk7XG59XG5cbi8qKlxuICogUmVvcmRlciBgYXJyYXlgIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIGluZGV4ZXMgd2hlcmUgdGhlIGVsZW1lbnQgYXRcbiAqIHRoZSBmaXJzdCBpbmRleCBpcyBhc3NpZ25lZCBhcyB0aGUgZmlyc3QgZWxlbWVudCwgdGhlIGVsZW1lbnQgYXRcbiAqIHRoZSBzZWNvbmQgaW5kZXggaXMgYXNzaWduZWQgYXMgdGhlIHNlY29uZCBlbGVtZW50LCBhbmQgc28gb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byByZW9yZGVyLlxuICogQHBhcmFtIHtBcnJheX0gaW5kZXhlcyBUaGUgYXJyYW5nZWQgYXJyYXkgaW5kZXhlcy5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICovXG5mdW5jdGlvbiByZW9yZGVyKGFycmF5LCBpbmRleGVzKSB7XG4gIHZhciBhcnJMZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICBsZW5ndGggPSBuYXRpdmVNaW4oaW5kZXhlcy5sZW5ndGgsIGFyckxlbmd0aCksXG4gICAgICBvbGRBcnJheSA9IGNvcHlBcnJheShhcnJheSk7XG5cbiAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgdmFyIGluZGV4ID0gaW5kZXhlc1tsZW5ndGhdO1xuICAgIGFycmF5W2xlbmd0aF0gPSBpc0luZGV4KGluZGV4LCBhcnJMZW5ndGgpID8gb2xkQXJyYXlbaW5kZXhdIDogdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBhcnJheTtcbn1cblxuLyoqXG4gKiBTZXRzIHRoZSBgdG9TdHJpbmdgIG1ldGhvZCBvZiBgd3JhcHBlcmAgdG8gbWltaWMgdGhlIHNvdXJjZSBvZiBgcmVmZXJlbmNlYFxuICogd2l0aCB3cmFwcGVyIGRldGFpbHMgaW4gYSBjb21tZW50IGF0IHRoZSB0b3Agb2YgdGhlIHNvdXJjZSBib2R5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB3cmFwcGVyIFRoZSBmdW5jdGlvbiB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSByZWZlcmVuY2UgVGhlIHJlZmVyZW5jZSBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYHdyYXBwZXJgLlxuICovXG52YXIgc2V0V3JhcFRvU3RyaW5nID0gIWRlZmluZVByb3BlcnR5ID8gaWRlbnRpdHkgOiBmdW5jdGlvbih3cmFwcGVyLCByZWZlcmVuY2UsIGJpdG1hc2spIHtcbiAgdmFyIHNvdXJjZSA9IChyZWZlcmVuY2UgKyAnJyk7XG4gIHJldHVybiBkZWZpbmVQcm9wZXJ0eSh3cmFwcGVyLCAndG9TdHJpbmcnLCB7XG4gICAgJ2NvbmZpZ3VyYWJsZSc6IHRydWUsXG4gICAgJ2VudW1lcmFibGUnOiBmYWxzZSxcbiAgICAndmFsdWUnOiBjb25zdGFudChpbnNlcnRXcmFwRGV0YWlscyhzb3VyY2UsIHVwZGF0ZVdyYXBEZXRhaWxzKGdldFdyYXBEZXRhaWxzKHNvdXJjZSksIGJpdG1hc2spKSlcbiAgfSk7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGBmdW5jYCB0byBpdHMgc291cmNlIGNvZGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHByb2Nlc3MuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzb3VyY2UgY29kZS5cbiAqL1xuZnVuY3Rpb24gdG9Tb3VyY2UoZnVuYykge1xuICBpZiAoZnVuYyAhPSBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBmdW5jVG9TdHJpbmcuY2FsbChmdW5jKTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gKGZ1bmMgKyAnJyk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbi8qKlxuICogVXBkYXRlcyB3cmFwcGVyIGBkZXRhaWxzYCBiYXNlZCBvbiBgYml0bWFza2AgZmxhZ3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm5zIHtBcnJheX0gZGV0YWlscyBUaGUgZGV0YWlscyB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBkZXRhaWxzYC5cbiAqL1xuZnVuY3Rpb24gdXBkYXRlV3JhcERldGFpbHMoZGV0YWlscywgYml0bWFzaykge1xuICBhcnJheUVhY2god3JhcEZsYWdzLCBmdW5jdGlvbihwYWlyKSB7XG4gICAgdmFyIHZhbHVlID0gJ18uJyArIHBhaXJbMF07XG4gICAgaWYgKChiaXRtYXNrICYgcGFpclsxXSkgJiYgIWFycmF5SW5jbHVkZXMoZGV0YWlscywgdmFsdWUpKSB7XG4gICAgICBkZXRhaWxzLnB1c2godmFsdWUpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBkZXRhaWxzLnNvcnQoKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIGFyZ3VtZW50cyBvZiBgZnVuY2AgYW5kIGVpdGhlciBpbnZva2VzXG4gKiBgZnVuY2AgcmV0dXJuaW5nIGl0cyByZXN1bHQsIGlmIGF0IGxlYXN0IGBhcml0eWAgbnVtYmVyIG9mIGFyZ3VtZW50cyBoYXZlXG4gKiBiZWVuIHByb3ZpZGVkLCBvciByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIHRoZSByZW1haW5pbmcgYGZ1bmNgXG4gKiBhcmd1bWVudHMsIGFuZCBzbyBvbi4gVGhlIGFyaXR5IG9mIGBmdW5jYCBtYXkgYmUgc3BlY2lmaWVkIGlmIGBmdW5jLmxlbmd0aGBcbiAqIGlzIG5vdCBzdWZmaWNpZW50LlxuICpcbiAqIFRoZSBgXy5jdXJyeS5wbGFjZWhvbGRlcmAgdmFsdWUsIHdoaWNoIGRlZmF1bHRzIHRvIGBfYCBpbiBtb25vbGl0aGljIGJ1aWxkcyxcbiAqIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgZG9lc24ndCBzZXQgdGhlIFwibGVuZ3RoXCIgcHJvcGVydHkgb2YgY3VycmllZCBmdW5jdGlvbnMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjAuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjdXJyeS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHk9ZnVuYy5sZW5ndGhdIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY3VycmllZCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIGFiYyA9IGZ1bmN0aW9uKGEsIGIsIGMpIHtcbiAqICAgcmV0dXJuIFthLCBiLCBjXTtcbiAqIH07XG4gKlxuICogdmFyIGN1cnJpZWQgPSBfLmN1cnJ5KGFiYyk7XG4gKlxuICogY3VycmllZCgxKSgyKSgzKTtcbiAqIC8vID0+IFsxLCAyLCAzXVxuICpcbiAqIGN1cnJpZWQoMSwgMikoMyk7XG4gKiAvLyA9PiBbMSwgMiwgM11cbiAqXG4gKiBjdXJyaWVkKDEsIDIsIDMpO1xuICogLy8gPT4gWzEsIDIsIDNdXG4gKlxuICogLy8gQ3VycmllZCB3aXRoIHBsYWNlaG9sZGVycy5cbiAqIGN1cnJpZWQoMSkoXywgMykoMik7XG4gKiAvLyA9PiBbMSwgMiwgM11cbiAqL1xuZnVuY3Rpb24gY3VycnkoZnVuYywgYXJpdHksIGd1YXJkKSB7XG4gIGFyaXR5ID0gZ3VhcmQgPyB1bmRlZmluZWQgOiBhcml0eTtcbiAgdmFyIHJlc3VsdCA9IGNyZWF0ZVdyYXAoZnVuYywgQ1VSUllfRkxBRywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFyaXR5KTtcbiAgcmVzdWx0LnBsYWNlaG9sZGVyID0gY3VycnkucGxhY2Vob2xkZXI7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBGdW5jdGlvbmAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgZnVuY3Rpb24sIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0Z1bmN0aW9uKF8pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNGdW5jdGlvbigvYWJjLyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKSB7XG4gIC8vIFRoZSB1c2Ugb2YgYE9iamVjdCN0b1N0cmluZ2AgYXZvaWRzIGlzc3VlcyB3aXRoIHRoZSBgdHlwZW9mYCBvcGVyYXRvclxuICAvLyBpbiBTYWZhcmkgOC05IHdoaWNoIHJldHVybnMgJ29iamVjdCcgZm9yIHR5cGVkIGFycmF5IGFuZCBvdGhlciBjb25zdHJ1Y3RvcnMuXG4gIHZhciB0YWcgPSBpc09iamVjdCh2YWx1ZSkgPyBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA6ICcnO1xuICByZXR1cm4gdGFnID09IGZ1bmNUYWcgfHwgdGFnID09IGdlblRhZztcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyB0aGVcbiAqIFtsYW5ndWFnZSB0eXBlXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcylcbiAqIG9mIGBPYmplY3RgLiAoZS5nLiBhcnJheXMsIGZ1bmN0aW9ucywgb2JqZWN0cywgcmVnZXhlcywgYG5ldyBOdW1iZXIoMClgLCBhbmQgYG5ldyBTdHJpbmcoJycpYClcbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdCh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoXy5ub29wKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiAhIXZhbHVlICYmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJyk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3ltYm9sYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3ltYm9sLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNTeW1ib2woU3ltYm9sLml0ZXJhdG9yKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzU3ltYm9sKCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N5bWJvbCcgfHxcbiAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA9PSBzeW1ib2xUYWcpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBmaW5pdGUgbnVtYmVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4xMi4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBudW1iZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9GaW5pdGUoMy4yKTtcbiAqIC8vID0+IDMuMlxuICpcbiAqIF8udG9GaW5pdGUoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiA1ZS0zMjRcbiAqXG4gKiBfLnRvRmluaXRlKEluZmluaXR5KTtcbiAqIC8vID0+IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4XG4gKlxuICogXy50b0Zpbml0ZSgnMy4yJyk7XG4gKiAvLyA9PiAzLjJcbiAqL1xuZnVuY3Rpb24gdG9GaW5pdGUodmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogMDtcbiAgfVxuICB2YWx1ZSA9IHRvTnVtYmVyKHZhbHVlKTtcbiAgaWYgKHZhbHVlID09PSBJTkZJTklUWSB8fCB2YWx1ZSA9PT0gLUlORklOSVRZKSB7XG4gICAgdmFyIHNpZ24gPSAodmFsdWUgPCAwID8gLTEgOiAxKTtcbiAgICByZXR1cm4gc2lnbiAqIE1BWF9JTlRFR0VSO1xuICB9XG4gIHJldHVybiB2YWx1ZSA9PT0gdmFsdWUgPyB2YWx1ZSA6IDA7XG59XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhbiBpbnRlZ2VyLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gKiBbYFRvSW50ZWdlcmBdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy10b2ludGVnZXIpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIGludGVnZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9JbnRlZ2VyKDMuMik7XG4gKiAvLyA9PiAzXG4gKlxuICogXy50b0ludGVnZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiAwXG4gKlxuICogXy50b0ludGVnZXIoSW5maW5pdHkpO1xuICogLy8gPT4gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDhcbiAqXG4gKiBfLnRvSW50ZWdlcignMy4yJyk7XG4gKiAvLyA9PiAzXG4gKi9cbmZ1bmN0aW9uIHRvSW50ZWdlcih2YWx1ZSkge1xuICB2YXIgcmVzdWx0ID0gdG9GaW5pdGUodmFsdWUpLFxuICAgICAgcmVtYWluZGVyID0gcmVzdWx0ICUgMTtcblxuICByZXR1cm4gcmVzdWx0ID09PSByZXN1bHQgPyAocmVtYWluZGVyID8gcmVzdWx0IC0gcmVtYWluZGVyIDogcmVzdWx0KSA6IDA7XG59XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIG51bWJlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG51bWJlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b051bWJlcigzLjIpO1xuICogLy8gPT4gMy4yXG4gKlxuICogXy50b051bWJlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDVlLTMyNFxuICpcbiAqIF8udG9OdW1iZXIoSW5maW5pdHkpO1xuICogLy8gPT4gSW5maW5pdHlcbiAqXG4gKiBfLnRvTnVtYmVyKCczLjInKTtcbiAqIC8vID0+IDMuMlxuICovXG5mdW5jdGlvbiB0b051bWJlcih2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gTkFOO1xuICB9XG4gIGlmIChpc09iamVjdCh2YWx1ZSkpIHtcbiAgICB2YXIgb3RoZXIgPSB0eXBlb2YgdmFsdWUudmFsdWVPZiA9PSAnZnVuY3Rpb24nID8gdmFsdWUudmFsdWVPZigpIDogdmFsdWU7XG4gICAgdmFsdWUgPSBpc09iamVjdChvdGhlcikgPyAob3RoZXIgKyAnJykgOiBvdGhlcjtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiArdmFsdWU7XG4gIH1cbiAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKHJlVHJpbSwgJycpO1xuICB2YXIgaXNCaW5hcnkgPSByZUlzQmluYXJ5LnRlc3QodmFsdWUpO1xuICByZXR1cm4gKGlzQmluYXJ5IHx8IHJlSXNPY3RhbC50ZXN0KHZhbHVlKSlcbiAgICA/IGZyZWVQYXJzZUludCh2YWx1ZS5zbGljZSgyKSwgaXNCaW5hcnkgPyAyIDogOClcbiAgICA6IChyZUlzQmFkSGV4LnRlc3QodmFsdWUpID8gTkFOIDogK3ZhbHVlKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGB2YWx1ZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjQuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHJldHVybiBmcm9tIHRoZSBuZXcgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb25zdGFudCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdHMgPSBfLnRpbWVzKDIsIF8uY29uc3RhbnQoeyAnYSc6IDEgfSkpO1xuICpcbiAqIGNvbnNvbGUubG9nKG9iamVjdHMpO1xuICogLy8gPT4gW3sgJ2EnOiAxIH0sIHsgJ2EnOiAxIH1dXG4gKlxuICogY29uc29sZS5sb2cob2JqZWN0c1swXSA9PT0gb2JqZWN0c1sxXSk7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGNvbnN0YW50KHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG59XG5cbi8qKlxuICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgZmlyc3QgYXJndW1lbnQgaXQgcmVjZWl2ZXMuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgQW55IHZhbHVlLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgYHZhbHVlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxIH07XG4gKlxuICogY29uc29sZS5sb2coXy5pZGVudGl0eShvYmplY3QpID09PSBvYmplY3QpO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBpZGVudGl0eSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWU7XG59XG5cbi8vIEFzc2lnbiBkZWZhdWx0IHBsYWNlaG9sZGVycy5cbmN1cnJ5LnBsYWNlaG9sZGVyID0ge307XG5cbm1vZHVsZS5leHBvcnRzID0gY3Vycnk7XG4iLCJ2YXIgZ2V0TmF0aXZlID0gcmVxdWlyZSgnLi9fZ2V0TmF0aXZlJyksXG4gICAgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIERhdGFWaWV3ID0gZ2V0TmF0aXZlKHJvb3QsICdEYXRhVmlldycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERhdGFWaWV3O1xuIiwidmFyIGhhc2hDbGVhciA9IHJlcXVpcmUoJy4vX2hhc2hDbGVhcicpLFxuICAgIGhhc2hEZWxldGUgPSByZXF1aXJlKCcuL19oYXNoRGVsZXRlJyksXG4gICAgaGFzaEdldCA9IHJlcXVpcmUoJy4vX2hhc2hHZXQnKSxcbiAgICBoYXNoSGFzID0gcmVxdWlyZSgnLi9faGFzaEhhcycpLFxuICAgIGhhc2hTZXQgPSByZXF1aXJlKCcuL19oYXNoU2V0Jyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGhhc2ggb2JqZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBIYXNoKGVudHJpZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgdGhpcy5jbGVhcigpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gIH1cbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYEhhc2hgLlxuSGFzaC5wcm90b3R5cGUuY2xlYXIgPSBoYXNoQ2xlYXI7XG5IYXNoLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBoYXNoRGVsZXRlO1xuSGFzaC5wcm90b3R5cGUuZ2V0ID0gaGFzaEdldDtcbkhhc2gucHJvdG90eXBlLmhhcyA9IGhhc2hIYXM7XG5IYXNoLnByb3RvdHlwZS5zZXQgPSBoYXNoU2V0O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEhhc2g7XG4iLCJ2YXIgbGlzdENhY2hlQ2xlYXIgPSByZXF1aXJlKCcuL19saXN0Q2FjaGVDbGVhcicpLFxuICAgIGxpc3RDYWNoZURlbGV0ZSA9IHJlcXVpcmUoJy4vX2xpc3RDYWNoZURlbGV0ZScpLFxuICAgIGxpc3RDYWNoZUdldCA9IHJlcXVpcmUoJy4vX2xpc3RDYWNoZUdldCcpLFxuICAgIGxpc3RDYWNoZUhhcyA9IHJlcXVpcmUoJy4vX2xpc3RDYWNoZUhhcycpLFxuICAgIGxpc3RDYWNoZVNldCA9IHJlcXVpcmUoJy4vX2xpc3RDYWNoZVNldCcpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gbGlzdCBjYWNoZSBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gKi9cbmZ1bmN0aW9uIExpc3RDYWNoZShlbnRyaWVzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gZW50cmllcyA9PSBudWxsID8gMCA6IGVudHJpZXMubGVuZ3RoO1xuXG4gIHRoaXMuY2xlYXIoKTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xuICB9XG59XG5cbi8vIEFkZCBtZXRob2RzIHRvIGBMaXN0Q2FjaGVgLlxuTGlzdENhY2hlLnByb3RvdHlwZS5jbGVhciA9IGxpc3RDYWNoZUNsZWFyO1xuTGlzdENhY2hlLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBsaXN0Q2FjaGVEZWxldGU7XG5MaXN0Q2FjaGUucHJvdG90eXBlLmdldCA9IGxpc3RDYWNoZUdldDtcbkxpc3RDYWNoZS5wcm90b3R5cGUuaGFzID0gbGlzdENhY2hlSGFzO1xuTGlzdENhY2hlLnByb3RvdHlwZS5zZXQgPSBsaXN0Q2FjaGVTZXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gTGlzdENhY2hlO1xuIiwidmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJy4vX2dldE5hdGl2ZScpLFxuICAgIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbnZhciBNYXAgPSBnZXROYXRpdmUocm9vdCwgJ01hcCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1hcDtcbiIsInZhciBtYXBDYWNoZUNsZWFyID0gcmVxdWlyZSgnLi9fbWFwQ2FjaGVDbGVhcicpLFxuICAgIG1hcENhY2hlRGVsZXRlID0gcmVxdWlyZSgnLi9fbWFwQ2FjaGVEZWxldGUnKSxcbiAgICBtYXBDYWNoZUdldCA9IHJlcXVpcmUoJy4vX21hcENhY2hlR2V0JyksXG4gICAgbWFwQ2FjaGVIYXMgPSByZXF1aXJlKCcuL19tYXBDYWNoZUhhcycpLFxuICAgIG1hcENhY2hlU2V0ID0gcmVxdWlyZSgnLi9fbWFwQ2FjaGVTZXQnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbWFwIGNhY2hlIG9iamVjdCB0byBzdG9yZSBrZXktdmFsdWUgcGFpcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gKi9cbmZ1bmN0aW9uIE1hcENhY2hlKGVudHJpZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgdGhpcy5jbGVhcigpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gIH1cbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYE1hcENhY2hlYC5cbk1hcENhY2hlLnByb3RvdHlwZS5jbGVhciA9IG1hcENhY2hlQ2xlYXI7XG5NYXBDYWNoZS5wcm90b3R5cGVbJ2RlbGV0ZSddID0gbWFwQ2FjaGVEZWxldGU7XG5NYXBDYWNoZS5wcm90b3R5cGUuZ2V0ID0gbWFwQ2FjaGVHZXQ7XG5NYXBDYWNoZS5wcm90b3R5cGUuaGFzID0gbWFwQ2FjaGVIYXM7XG5NYXBDYWNoZS5wcm90b3R5cGUuc2V0ID0gbWFwQ2FjaGVTZXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gTWFwQ2FjaGU7XG4iLCJ2YXIgZ2V0TmF0aXZlID0gcmVxdWlyZSgnLi9fZ2V0TmF0aXZlJyksXG4gICAgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIFByb21pc2UgPSBnZXROYXRpdmUocm9vdCwgJ1Byb21pc2UnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBQcm9taXNlO1xuIiwidmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJy4vX2dldE5hdGl2ZScpLFxuICAgIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbnZhciBTZXQgPSBnZXROYXRpdmUocm9vdCwgJ1NldCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNldDtcbiIsInZhciBNYXBDYWNoZSA9IHJlcXVpcmUoJy4vX01hcENhY2hlJyksXG4gICAgc2V0Q2FjaGVBZGQgPSByZXF1aXJlKCcuL19zZXRDYWNoZUFkZCcpLFxuICAgIHNldENhY2hlSGFzID0gcmVxdWlyZSgnLi9fc2V0Q2FjaGVIYXMnKTtcblxuLyoqXG4gKlxuICogQ3JlYXRlcyBhbiBhcnJheSBjYWNoZSBvYmplY3QgdG8gc3RvcmUgdW5pcXVlIHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBTZXRDYWNoZSh2YWx1ZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSB2YWx1ZXMgPT0gbnVsbCA/IDAgOiB2YWx1ZXMubGVuZ3RoO1xuXG4gIHRoaXMuX19kYXRhX18gPSBuZXcgTWFwQ2FjaGU7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdGhpcy5hZGQodmFsdWVzW2luZGV4XSk7XG4gIH1cbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYFNldENhY2hlYC5cblNldENhY2hlLnByb3RvdHlwZS5hZGQgPSBTZXRDYWNoZS5wcm90b3R5cGUucHVzaCA9IHNldENhY2hlQWRkO1xuU2V0Q2FjaGUucHJvdG90eXBlLmhhcyA9IHNldENhY2hlSGFzO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNldENhY2hlO1xuIiwidmFyIExpc3RDYWNoZSA9IHJlcXVpcmUoJy4vX0xpc3RDYWNoZScpLFxuICAgIHN0YWNrQ2xlYXIgPSByZXF1aXJlKCcuL19zdGFja0NsZWFyJyksXG4gICAgc3RhY2tEZWxldGUgPSByZXF1aXJlKCcuL19zdGFja0RlbGV0ZScpLFxuICAgIHN0YWNrR2V0ID0gcmVxdWlyZSgnLi9fc3RhY2tHZXQnKSxcbiAgICBzdGFja0hhcyA9IHJlcXVpcmUoJy4vX3N0YWNrSGFzJyksXG4gICAgc3RhY2tTZXQgPSByZXF1aXJlKCcuL19zdGFja1NldCcpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBzdGFjayBjYWNoZSBvYmplY3QgdG8gc3RvcmUga2V5LXZhbHVlIHBhaXJzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBTdGFjayhlbnRyaWVzKSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyA9IG5ldyBMaXN0Q2FjaGUoZW50cmllcyk7XG4gIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTtcbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYFN0YWNrYC5cblN0YWNrLnByb3RvdHlwZS5jbGVhciA9IHN0YWNrQ2xlYXI7XG5TdGFjay5wcm90b3R5cGVbJ2RlbGV0ZSddID0gc3RhY2tEZWxldGU7XG5TdGFjay5wcm90b3R5cGUuZ2V0ID0gc3RhY2tHZXQ7XG5TdGFjay5wcm90b3R5cGUuaGFzID0gc3RhY2tIYXM7XG5TdGFjay5wcm90b3R5cGUuc2V0ID0gc3RhY2tTZXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gU3RhY2s7XG4iLCJ2YXIgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgU3ltYm9sID0gcm9vdC5TeW1ib2w7XG5cbm1vZHVsZS5leHBvcnRzID0gU3ltYm9sO1xuIiwidmFyIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIFVpbnQ4QXJyYXkgPSByb290LlVpbnQ4QXJyYXk7XG5cbm1vZHVsZS5leHBvcnRzID0gVWludDhBcnJheTtcbiIsInZhciBnZXROYXRpdmUgPSByZXF1aXJlKCcuL19nZXROYXRpdmUnKSxcbiAgICByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG52YXIgV2Vha01hcCA9IGdldE5hdGl2ZShyb290LCAnV2Vha01hcCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFdlYWtNYXA7XG4iLCIvKipcbiAqIEEgZmFzdGVyIGFsdGVybmF0aXZlIHRvIGBGdW5jdGlvbiNhcHBseWAsIHRoaXMgZnVuY3Rpb24gaW52b2tlcyBgZnVuY2BcbiAqIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIGB0aGlzQXJnYCBhbmQgdGhlIGFyZ3VtZW50cyBvZiBgYXJnc2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGludm9rZS5cbiAqIEBwYXJhbSB7Kn0gdGhpc0FyZyBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBgZnVuY2Agd2l0aC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYGZ1bmNgLlxuICovXG5mdW5jdGlvbiBhcHBseShmdW5jLCB0aGlzQXJnLCBhcmdzKSB7XG4gIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICBjYXNlIDA6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZyk7XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0pO1xuICAgIGNhc2UgMjogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICBjYXNlIDM6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gIH1cbiAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXBwbHk7XG4iLCIvKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5mb3JFYWNoYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAqL1xuZnVuY3Rpb24gYXJyYXlFYWNoKGFycmF5LCBpdGVyYXRlZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgaWYgKGl0ZXJhdGVlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSA9PT0gZmFsc2UpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlFYWNoO1xuIiwiLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uZmlsdGVyYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmlsdGVyZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGFycmF5RmlsdGVyKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCxcbiAgICAgIHJlc0luZGV4ID0gMCxcbiAgICAgIHJlc3VsdCA9IFtdO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4LCBhcnJheSkpIHtcbiAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFycmF5RmlsdGVyO1xuIiwidmFyIGJhc2VJbmRleE9mID0gcmVxdWlyZSgnLi9fYmFzZUluZGV4T2YnKTtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uaW5jbHVkZXNgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICogc3BlY2lmeWluZyBhbiBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0gdGFyZ2V0IFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB0YXJnZXRgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGFycmF5SW5jbHVkZXMoYXJyYXksIHZhbHVlKSB7XG4gIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgcmV0dXJuICEhbGVuZ3RoICYmIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgMCkgPiAtMTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcnJheUluY2x1ZGVzO1xuIiwiLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2UgYGFycmF5SW5jbHVkZXNgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYSBjb21wYXJhdG9yLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSB0YXJnZXQgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb21wYXJhdG9yIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHRhcmdldGAgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYXJyYXlJbmNsdWRlc1dpdGgoYXJyYXksIHZhbHVlLCBjb21wYXJhdG9yKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBpZiAoY29tcGFyYXRvcih2YWx1ZSwgYXJyYXlbaW5kZXhdKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcnJheUluY2x1ZGVzV2l0aDtcbiIsInZhciBiYXNlVGltZXMgPSByZXF1aXJlKCcuL19iYXNlVGltZXMnKSxcbiAgICBpc0FyZ3VtZW50cyA9IHJlcXVpcmUoJy4vaXNBcmd1bWVudHMnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNCdWZmZXIgPSByZXF1aXJlKCcuL2lzQnVmZmVyJyksXG4gICAgaXNJbmRleCA9IHJlcXVpcmUoJy4vX2lzSW5kZXgnKSxcbiAgICBpc1R5cGVkQXJyYXkgPSByZXF1aXJlKCcuL2lzVHlwZWRBcnJheScpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgdGhlIGFycmF5LWxpa2UgYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGluaGVyaXRlZCBTcGVjaWZ5IHJldHVybmluZyBpbmhlcml0ZWQgcHJvcGVydHkgbmFtZXMuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICovXG5mdW5jdGlvbiBhcnJheUxpa2VLZXlzKHZhbHVlLCBpbmhlcml0ZWQpIHtcbiAgdmFyIGlzQXJyID0gaXNBcnJheSh2YWx1ZSksXG4gICAgICBpc0FyZyA9ICFpc0FyciAmJiBpc0FyZ3VtZW50cyh2YWx1ZSksXG4gICAgICBpc0J1ZmYgPSAhaXNBcnIgJiYgIWlzQXJnICYmIGlzQnVmZmVyKHZhbHVlKSxcbiAgICAgIGlzVHlwZSA9ICFpc0FyciAmJiAhaXNBcmcgJiYgIWlzQnVmZiAmJiBpc1R5cGVkQXJyYXkodmFsdWUpLFxuICAgICAgc2tpcEluZGV4ZXMgPSBpc0FyciB8fCBpc0FyZyB8fCBpc0J1ZmYgfHwgaXNUeXBlLFxuICAgICAgcmVzdWx0ID0gc2tpcEluZGV4ZXMgPyBiYXNlVGltZXModmFsdWUubGVuZ3RoLCBTdHJpbmcpIDogW10sXG4gICAgICBsZW5ndGggPSByZXN1bHQubGVuZ3RoO1xuXG4gIGZvciAodmFyIGtleSBpbiB2YWx1ZSkge1xuICAgIGlmICgoaW5oZXJpdGVkIHx8IGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGtleSkpICYmXG4gICAgICAgICEoc2tpcEluZGV4ZXMgJiYgKFxuICAgICAgICAgICAvLyBTYWZhcmkgOSBoYXMgZW51bWVyYWJsZSBgYXJndW1lbnRzLmxlbmd0aGAgaW4gc3RyaWN0IG1vZGUuXG4gICAgICAgICAgIGtleSA9PSAnbGVuZ3RoJyB8fFxuICAgICAgICAgICAvLyBOb2RlLmpzIDAuMTAgaGFzIGVudW1lcmFibGUgbm9uLWluZGV4IHByb3BlcnRpZXMgb24gYnVmZmVycy5cbiAgICAgICAgICAgKGlzQnVmZiAmJiAoa2V5ID09ICdvZmZzZXQnIHx8IGtleSA9PSAncGFyZW50JykpIHx8XG4gICAgICAgICAgIC8vIFBoYW50b21KUyAyIGhhcyBlbnVtZXJhYmxlIG5vbi1pbmRleCBwcm9wZXJ0aWVzIG9uIHR5cGVkIGFycmF5cy5cbiAgICAgICAgICAgKGlzVHlwZSAmJiAoa2V5ID09ICdidWZmZXInIHx8IGtleSA9PSAnYnl0ZUxlbmd0aCcgfHwga2V5ID09ICdieXRlT2Zmc2V0JykpIHx8XG4gICAgICAgICAgIC8vIFNraXAgaW5kZXggcHJvcGVydGllcy5cbiAgICAgICAgICAgaXNJbmRleChrZXksIGxlbmd0aClcbiAgICAgICAgKSkpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlMaWtlS2V5cztcbiIsIi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLm1hcGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlXG4gKiBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBhcnJheU1hcChhcnJheSwgaXRlcmF0ZWUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCxcbiAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICByZXN1bHRbaW5kZXhdID0gaXRlcmF0ZWUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlNYXA7XG4iLCIvKipcbiAqIEFwcGVuZHMgdGhlIGVsZW1lbnRzIG9mIGB2YWx1ZXNgIHRvIGBhcnJheWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byBhcHBlbmQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAqL1xuZnVuY3Rpb24gYXJyYXlQdXNoKGFycmF5LCB2YWx1ZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSB2YWx1ZXMubGVuZ3RoLFxuICAgICAgb2Zmc2V0ID0gYXJyYXkubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgYXJyYXlbb2Zmc2V0ICsgaW5kZXhdID0gdmFsdWVzW2luZGV4XTtcbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlQdXNoO1xuIiwiLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ucmVkdWNlYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGluaXRpYWwgdmFsdWUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpbml0QWNjdW1dIFNwZWNpZnkgdXNpbmcgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYGFycmF5YCBhc1xuICogIHRoZSBpbml0aWFsIHZhbHVlLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICovXG5mdW5jdGlvbiBhcnJheVJlZHVjZShhcnJheSwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0pIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICBpZiAoaW5pdEFjY3VtICYmIGxlbmd0aCkge1xuICAgIGFjY3VtdWxhdG9yID0gYXJyYXlbKytpbmRleF07XG4gIH1cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBhY2N1bXVsYXRvciA9IGl0ZXJhdGVlKGFjY3VtdWxhdG9yLCBhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSk7XG4gIH1cbiAgcmV0dXJuIGFjY3VtdWxhdG9yO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFycmF5UmVkdWNlO1xuIiwiLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uc29tZWAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlXG4gKiBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbnkgZWxlbWVudCBwYXNzZXMgdGhlIHByZWRpY2F0ZSBjaGVjayxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGFycmF5U29tZShhcnJheSwgcHJlZGljYXRlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBpZiAocHJlZGljYXRlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcnJheVNvbWU7XG4iLCJ2YXIgYmFzZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fYmFzZVByb3BlcnR5Jyk7XG5cbi8qKlxuICogR2V0cyB0aGUgc2l6ZSBvZiBhbiBBU0NJSSBgc3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdHJpbmcgc2l6ZS5cbiAqL1xudmFyIGFzY2lpU2l6ZSA9IGJhc2VQcm9wZXJ0eSgnbGVuZ3RoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gYXNjaWlTaXplO1xuIiwidmFyIGJhc2VBc3NpZ25WYWx1ZSA9IHJlcXVpcmUoJy4vX2Jhc2VBc3NpZ25WYWx1ZScpLFxuICAgIGVxID0gcmVxdWlyZSgnLi9lcScpO1xuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgYXNzaWduVmFsdWVgIGV4Y2VwdCB0aGF0IGl0IGRvZXNuJ3QgYXNzaWduXG4gKiBgdW5kZWZpbmVkYCB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAqL1xuZnVuY3Rpb24gYXNzaWduTWVyZ2VWYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgaWYgKCh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmICFlcShvYmplY3Rba2V5XSwgdmFsdWUpKSB8fFxuICAgICAgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkpIHtcbiAgICBiYXNlQXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFzc2lnbk1lcmdlVmFsdWU7XG4iLCJ2YXIgYmFzZUFzc2lnblZhbHVlID0gcmVxdWlyZSgnLi9fYmFzZUFzc2lnblZhbHVlJyksXG4gICAgZXEgPSByZXF1aXJlKCcuL2VxJyk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQXNzaWducyBgdmFsdWVgIHRvIGBrZXlgIG9mIGBvYmplY3RgIGlmIHRoZSBleGlzdGluZyB2YWx1ZSBpcyBub3QgZXF1aXZhbGVudFxuICogdXNpbmcgW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gYXNzaWduLlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYXNzaWduLlxuICovXG5mdW5jdGlvbiBhc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgdmFyIG9ialZhbHVlID0gb2JqZWN0W2tleV07XG4gIGlmICghKGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpICYmIGVxKG9ialZhbHVlLCB2YWx1ZSkpIHx8XG4gICAgICAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhKGtleSBpbiBvYmplY3QpKSkge1xuICAgIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXNzaWduVmFsdWU7XG4iLCJ2YXIgZXEgPSByZXF1aXJlKCcuL2VxJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGBrZXlgIGlzIGZvdW5kIGluIGBhcnJheWAgb2Yga2V5LXZhbHVlIHBhaXJzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0ga2V5IFRoZSBrZXkgdG8gc2VhcmNoIGZvci5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gKi9cbmZ1bmN0aW9uIGFzc29jSW5kZXhPZihhcnJheSwga2V5KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG4gIHdoaWxlIChsZW5ndGgtLSkge1xuICAgIGlmIChlcShhcnJheVtsZW5ndGhdWzBdLCBrZXkpKSB7XG4gICAgICByZXR1cm4gbGVuZ3RoO1xuICAgIH1cbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXNzb2NJbmRleE9mO1xuIiwidmFyIGNvcHlPYmplY3QgPSByZXF1aXJlKCcuL19jb3B5T2JqZWN0JyksXG4gICAga2V5cyA9IHJlcXVpcmUoJy4va2V5cycpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmFzc2lnbmAgd2l0aG91dCBzdXBwb3J0IGZvciBtdWx0aXBsZSBzb3VyY2VzXG4gKiBvciBgY3VzdG9taXplcmAgZnVuY3Rpb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gYmFzZUFzc2lnbihvYmplY3QsIHNvdXJjZSkge1xuICByZXR1cm4gb2JqZWN0ICYmIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzKHNvdXJjZSksIG9iamVjdCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUFzc2lnbjtcbiIsInZhciBjb3B5T2JqZWN0ID0gcmVxdWlyZSgnLi9fY29weU9iamVjdCcpLFxuICAgIGtleXNJbiA9IHJlcXVpcmUoJy4va2V5c0luJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uYXNzaWduSW5gIHdpdGhvdXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc291cmNlc1xuICogb3IgYGN1c3RvbWl6ZXJgIGZ1bmN0aW9ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VBc3NpZ25JbihvYmplY3QsIHNvdXJjZSkge1xuICByZXR1cm4gb2JqZWN0ICYmIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzSW4oc291cmNlKSwgb2JqZWN0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlQXNzaWduSW47XG4iLCJ2YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuL19kZWZpbmVQcm9wZXJ0eScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBhc3NpZ25WYWx1ZWAgYW5kIGBhc3NpZ25NZXJnZVZhbHVlYCB3aXRob3V0XG4gKiB2YWx1ZSBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAqL1xuZnVuY3Rpb24gYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICBpZiAoa2V5ID09ICdfX3Byb3RvX18nICYmIGRlZmluZVByb3BlcnR5KSB7XG4gICAgZGVmaW5lUHJvcGVydHkob2JqZWN0LCBrZXksIHtcbiAgICAgICdjb25maWd1cmFibGUnOiB0cnVlLFxuICAgICAgJ2VudW1lcmFibGUnOiB0cnVlLFxuICAgICAgJ3ZhbHVlJzogdmFsdWUsXG4gICAgICAnd3JpdGFibGUnOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VBc3NpZ25WYWx1ZTtcbiIsInZhciBTdGFjayA9IHJlcXVpcmUoJy4vX1N0YWNrJyksXG4gICAgYXJyYXlFYWNoID0gcmVxdWlyZSgnLi9fYXJyYXlFYWNoJyksXG4gICAgYXNzaWduVmFsdWUgPSByZXF1aXJlKCcuL19hc3NpZ25WYWx1ZScpLFxuICAgIGJhc2VBc3NpZ24gPSByZXF1aXJlKCcuL19iYXNlQXNzaWduJyksXG4gICAgYmFzZUFzc2lnbkluID0gcmVxdWlyZSgnLi9fYmFzZUFzc2lnbkluJyksXG4gICAgY2xvbmVCdWZmZXIgPSByZXF1aXJlKCcuL19jbG9uZUJ1ZmZlcicpLFxuICAgIGNvcHlBcnJheSA9IHJlcXVpcmUoJy4vX2NvcHlBcnJheScpLFxuICAgIGNvcHlTeW1ib2xzID0gcmVxdWlyZSgnLi9fY29weVN5bWJvbHMnKSxcbiAgICBjb3B5U3ltYm9sc0luID0gcmVxdWlyZSgnLi9fY29weVN5bWJvbHNJbicpLFxuICAgIGdldEFsbEtleXMgPSByZXF1aXJlKCcuL19nZXRBbGxLZXlzJyksXG4gICAgZ2V0QWxsS2V5c0luID0gcmVxdWlyZSgnLi9fZ2V0QWxsS2V5c0luJyksXG4gICAgZ2V0VGFnID0gcmVxdWlyZSgnLi9fZ2V0VGFnJyksXG4gICAgaW5pdENsb25lQXJyYXkgPSByZXF1aXJlKCcuL19pbml0Q2xvbmVBcnJheScpLFxuICAgIGluaXRDbG9uZUJ5VGFnID0gcmVxdWlyZSgnLi9faW5pdENsb25lQnlUYWcnKSxcbiAgICBpbml0Q2xvbmVPYmplY3QgPSByZXF1aXJlKCcuL19pbml0Q2xvbmVPYmplY3QnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNCdWZmZXIgPSByZXF1aXJlKCcuL2lzQnVmZmVyJyksXG4gICAgaXNNYXAgPSByZXF1aXJlKCcuL2lzTWFwJyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0JyksXG4gICAgaXNTZXQgPSByZXF1aXJlKCcuL2lzU2V0JyksXG4gICAga2V5cyA9IHJlcXVpcmUoJy4va2V5cycpLFxuICAgIGtleXNJbiA9IHJlcXVpcmUoJy4va2V5c0luJyk7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIGNsb25pbmcuICovXG52YXIgQ0xPTkVfREVFUF9GTEFHID0gMSxcbiAgICBDTE9ORV9GTEFUX0ZMQUcgPSAyLFxuICAgIENMT05FX1NZTUJPTFNfRkxBRyA9IDQ7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBhcmdzVGFnID0gJ1tvYmplY3QgQXJndW1lbnRzXScsXG4gICAgYXJyYXlUYWcgPSAnW29iamVjdCBBcnJheV0nLFxuICAgIGJvb2xUYWcgPSAnW29iamVjdCBCb29sZWFuXScsXG4gICAgZGF0ZVRhZyA9ICdbb2JqZWN0IERhdGVdJyxcbiAgICBlcnJvclRhZyA9ICdbb2JqZWN0IEVycm9yXScsXG4gICAgZnVuY1RhZyA9ICdbb2JqZWN0IEZ1bmN0aW9uXScsXG4gICAgZ2VuVGFnID0gJ1tvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dJyxcbiAgICBtYXBUYWcgPSAnW29iamVjdCBNYXBdJyxcbiAgICBudW1iZXJUYWcgPSAnW29iamVjdCBOdW1iZXJdJyxcbiAgICBvYmplY3RUYWcgPSAnW29iamVjdCBPYmplY3RdJyxcbiAgICByZWdleHBUYWcgPSAnW29iamVjdCBSZWdFeHBdJyxcbiAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJyxcbiAgICBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJyxcbiAgICBzeW1ib2xUYWcgPSAnW29iamVjdCBTeW1ib2xdJyxcbiAgICB3ZWFrTWFwVGFnID0gJ1tvYmplY3QgV2Vha01hcF0nO1xuXG52YXIgYXJyYXlCdWZmZXJUYWcgPSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nLFxuICAgIGRhdGFWaWV3VGFnID0gJ1tvYmplY3QgRGF0YVZpZXddJyxcbiAgICBmbG9hdDMyVGFnID0gJ1tvYmplY3QgRmxvYXQzMkFycmF5XScsXG4gICAgZmxvYXQ2NFRhZyA9ICdbb2JqZWN0IEZsb2F0NjRBcnJheV0nLFxuICAgIGludDhUYWcgPSAnW29iamVjdCBJbnQ4QXJyYXldJyxcbiAgICBpbnQxNlRhZyA9ICdbb2JqZWN0IEludDE2QXJyYXldJyxcbiAgICBpbnQzMlRhZyA9ICdbb2JqZWN0IEludDMyQXJyYXldJyxcbiAgICB1aW50OFRhZyA9ICdbb2JqZWN0IFVpbnQ4QXJyYXldJyxcbiAgICB1aW50OENsYW1wZWRUYWcgPSAnW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0nLFxuICAgIHVpbnQxNlRhZyA9ICdbb2JqZWN0IFVpbnQxNkFycmF5XScsXG4gICAgdWludDMyVGFnID0gJ1tvYmplY3QgVWludDMyQXJyYXldJztcblxuLyoqIFVzZWQgdG8gaWRlbnRpZnkgYHRvU3RyaW5nVGFnYCB2YWx1ZXMgc3VwcG9ydGVkIGJ5IGBfLmNsb25lYC4gKi9cbnZhciBjbG9uZWFibGVUYWdzID0ge307XG5jbG9uZWFibGVUYWdzW2FyZ3NUYWddID0gY2xvbmVhYmxlVGFnc1thcnJheVRhZ10gPVxuY2xvbmVhYmxlVGFnc1thcnJheUJ1ZmZlclRhZ10gPSBjbG9uZWFibGVUYWdzW2RhdGFWaWV3VGFnXSA9XG5jbG9uZWFibGVUYWdzW2Jvb2xUYWddID0gY2xvbmVhYmxlVGFnc1tkYXRlVGFnXSA9XG5jbG9uZWFibGVUYWdzW2Zsb2F0MzJUYWddID0gY2xvbmVhYmxlVGFnc1tmbG9hdDY0VGFnXSA9XG5jbG9uZWFibGVUYWdzW2ludDhUYWddID0gY2xvbmVhYmxlVGFnc1tpbnQxNlRhZ10gPVxuY2xvbmVhYmxlVGFnc1tpbnQzMlRhZ10gPSBjbG9uZWFibGVUYWdzW21hcFRhZ10gPVxuY2xvbmVhYmxlVGFnc1tudW1iZXJUYWddID0gY2xvbmVhYmxlVGFnc1tvYmplY3RUYWddID1cbmNsb25lYWJsZVRhZ3NbcmVnZXhwVGFnXSA9IGNsb25lYWJsZVRhZ3Nbc2V0VGFnXSA9XG5jbG9uZWFibGVUYWdzW3N0cmluZ1RhZ10gPSBjbG9uZWFibGVUYWdzW3N5bWJvbFRhZ10gPVxuY2xvbmVhYmxlVGFnc1t1aW50OFRhZ10gPSBjbG9uZWFibGVUYWdzW3VpbnQ4Q2xhbXBlZFRhZ10gPVxuY2xvbmVhYmxlVGFnc1t1aW50MTZUYWddID0gY2xvbmVhYmxlVGFnc1t1aW50MzJUYWddID0gdHJ1ZTtcbmNsb25lYWJsZVRhZ3NbZXJyb3JUYWddID0gY2xvbmVhYmxlVGFnc1tmdW5jVGFnXSA9XG5jbG9uZWFibGVUYWdzW3dlYWtNYXBUYWddID0gZmFsc2U7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY2xvbmVgIGFuZCBgXy5jbG9uZURlZXBgIHdoaWNoIHRyYWNrc1xuICogdHJhdmVyc2VkIG9iamVjdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNsb25lLlxuICogQHBhcmFtIHtib29sZWFufSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLlxuICogIDEgLSBEZWVwIGNsb25lXG4gKiAgMiAtIEZsYXR0ZW4gaW5oZXJpdGVkIHByb3BlcnRpZXNcbiAqICA0IC0gQ2xvbmUgc3ltYm9sc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY2xvbmluZy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBba2V5XSBUaGUga2V5IG9mIGB2YWx1ZWAuXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIHBhcmVudCBvYmplY3Qgb2YgYHZhbHVlYC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cyBhbmQgdGhlaXIgY2xvbmUgY291bnRlcnBhcnRzLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGNsb25lZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYmFzZUNsb25lKHZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBrZXksIG9iamVjdCwgc3RhY2spIHtcbiAgdmFyIHJlc3VsdCxcbiAgICAgIGlzRGVlcCA9IGJpdG1hc2sgJiBDTE9ORV9ERUVQX0ZMQUcsXG4gICAgICBpc0ZsYXQgPSBiaXRtYXNrICYgQ0xPTkVfRkxBVF9GTEFHLFxuICAgICAgaXNGdWxsID0gYml0bWFzayAmIENMT05FX1NZTUJPTFNfRkxBRztcblxuICBpZiAoY3VzdG9taXplcikge1xuICAgIHJlc3VsdCA9IG9iamVjdCA/IGN1c3RvbWl6ZXIodmFsdWUsIGtleSwgb2JqZWN0LCBzdGFjaykgOiBjdXN0b21pemVyKHZhbHVlKTtcbiAgfVxuICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHZhciBpc0FyciA9IGlzQXJyYXkodmFsdWUpO1xuICBpZiAoaXNBcnIpIHtcbiAgICByZXN1bHQgPSBpbml0Q2xvbmVBcnJheSh2YWx1ZSk7XG4gICAgaWYgKCFpc0RlZXApIHtcbiAgICAgIHJldHVybiBjb3B5QXJyYXkodmFsdWUsIHJlc3VsdCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciB0YWcgPSBnZXRUYWcodmFsdWUpLFxuICAgICAgICBpc0Z1bmMgPSB0YWcgPT0gZnVuY1RhZyB8fCB0YWcgPT0gZ2VuVGFnO1xuXG4gICAgaWYgKGlzQnVmZmVyKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGNsb25lQnVmZmVyKHZhbHVlLCBpc0RlZXApO1xuICAgIH1cbiAgICBpZiAodGFnID09IG9iamVjdFRhZyB8fCB0YWcgPT0gYXJnc1RhZyB8fCAoaXNGdW5jICYmICFvYmplY3QpKSB7XG4gICAgICByZXN1bHQgPSAoaXNGbGF0IHx8IGlzRnVuYykgPyB7fSA6IGluaXRDbG9uZU9iamVjdCh2YWx1ZSk7XG4gICAgICBpZiAoIWlzRGVlcCkge1xuICAgICAgICByZXR1cm4gaXNGbGF0XG4gICAgICAgICAgPyBjb3B5U3ltYm9sc0luKHZhbHVlLCBiYXNlQXNzaWduSW4ocmVzdWx0LCB2YWx1ZSkpXG4gICAgICAgICAgOiBjb3B5U3ltYm9scyh2YWx1ZSwgYmFzZUFzc2lnbihyZXN1bHQsIHZhbHVlKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghY2xvbmVhYmxlVGFnc1t0YWddKSB7XG4gICAgICAgIHJldHVybiBvYmplY3QgPyB2YWx1ZSA6IHt9O1xuICAgICAgfVxuICAgICAgcmVzdWx0ID0gaW5pdENsb25lQnlUYWcodmFsdWUsIHRhZywgaXNEZWVwKTtcbiAgICB9XG4gIH1cbiAgLy8gQ2hlY2sgZm9yIGNpcmN1bGFyIHJlZmVyZW5jZXMgYW5kIHJldHVybiBpdHMgY29ycmVzcG9uZGluZyBjbG9uZS5cbiAgc3RhY2sgfHwgKHN0YWNrID0gbmV3IFN0YWNrKTtcbiAgdmFyIHN0YWNrZWQgPSBzdGFjay5nZXQodmFsdWUpO1xuICBpZiAoc3RhY2tlZCkge1xuICAgIHJldHVybiBzdGFja2VkO1xuICB9XG4gIHN0YWNrLnNldCh2YWx1ZSwgcmVzdWx0KTtcblxuICBpZiAoaXNTZXQodmFsdWUpKSB7XG4gICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbihzdWJWYWx1ZSkge1xuICAgICAgcmVzdWx0LmFkZChiYXNlQ2xvbmUoc3ViVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN1YlZhbHVlLCB2YWx1ZSwgc3RhY2spKTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChpc01hcCh2YWx1ZSkpIHtcbiAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHN1YlZhbHVlLCBrZXkpIHtcbiAgICAgIHJlc3VsdC5zZXQoa2V5LCBiYXNlQ2xvbmUoc3ViVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGtleSwgdmFsdWUsIHN0YWNrKSk7XG4gICAgfSk7XG4gIH1cblxuICB2YXIga2V5c0Z1bmMgPSBpc0Z1bGxcbiAgICA/IChpc0ZsYXQgPyBnZXRBbGxLZXlzSW4gOiBnZXRBbGxLZXlzKVxuICAgIDogKGlzRmxhdCA/IGtleXNJbiA6IGtleXMpO1xuXG4gIHZhciBwcm9wcyA9IGlzQXJyID8gdW5kZWZpbmVkIDoga2V5c0Z1bmModmFsdWUpO1xuICBhcnJheUVhY2gocHJvcHMgfHwgdmFsdWUsIGZ1bmN0aW9uKHN1YlZhbHVlLCBrZXkpIHtcbiAgICBpZiAocHJvcHMpIHtcbiAgICAgIGtleSA9IHN1YlZhbHVlO1xuICAgICAgc3ViVmFsdWUgPSB2YWx1ZVtrZXldO1xuICAgIH1cbiAgICAvLyBSZWN1cnNpdmVseSBwb3B1bGF0ZSBjbG9uZSAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgIGFzc2lnblZhbHVlKHJlc3VsdCwga2V5LCBiYXNlQ2xvbmUoc3ViVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGtleSwgdmFsdWUsIHN0YWNrKSk7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VDbG9uZTtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0Q3JlYXRlID0gT2JqZWN0LmNyZWF0ZTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jcmVhdGVgIHdpdGhvdXQgc3VwcG9ydCBmb3IgYXNzaWduaW5nXG4gKiBwcm9wZXJ0aWVzIHRvIHRoZSBjcmVhdGVkIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHByb3RvIFRoZSBvYmplY3QgdG8gaW5oZXJpdCBmcm9tLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAqL1xudmFyIGJhc2VDcmVhdGUgPSAoZnVuY3Rpb24oKSB7XG4gIGZ1bmN0aW9uIG9iamVjdCgpIHt9XG4gIHJldHVybiBmdW5jdGlvbihwcm90bykge1xuICAgIGlmICghaXNPYmplY3QocHJvdG8pKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGlmIChvYmplY3RDcmVhdGUpIHtcbiAgICAgIHJldHVybiBvYmplY3RDcmVhdGUocHJvdG8pO1xuICAgIH1cbiAgICBvYmplY3QucHJvdG90eXBlID0gcHJvdG87XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBvYmplY3Q7XG4gICAgb2JqZWN0LnByb3RvdHlwZSA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufSgpKTtcblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlQ3JlYXRlO1xuIiwidmFyIGJhc2VGb3JPd24gPSByZXF1aXJlKCcuL19iYXNlRm9yT3duJyksXG4gICAgY3JlYXRlQmFzZUVhY2ggPSByZXF1aXJlKCcuL19jcmVhdGVCYXNlRWFjaCcpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZvckVhY2hgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheXxPYmplY3R9IFJldHVybnMgYGNvbGxlY3Rpb25gLlxuICovXG52YXIgYmFzZUVhY2ggPSBjcmVhdGVCYXNlRWFjaChiYXNlRm9yT3duKTtcblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlRWFjaDtcbiIsInZhciBpc1N5bWJvbCA9IHJlcXVpcmUoJy4vaXNTeW1ib2wnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2RzIGxpa2UgYF8ubWF4YCBhbmQgYF8ubWluYCB3aGljaCBhY2NlcHRzIGFcbiAqIGBjb21wYXJhdG9yYCB0byBkZXRlcm1pbmUgdGhlIGV4dHJlbXVtIHZhbHVlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBhcmF0b3IgVGhlIGNvbXBhcmF0b3IgdXNlZCB0byBjb21wYXJlIHZhbHVlcy5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBleHRyZW11bSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYmFzZUV4dHJlbXVtKGFycmF5LCBpdGVyYXRlZSwgY29tcGFyYXRvcikge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgY3VycmVudCA9IGl0ZXJhdGVlKHZhbHVlKTtcblxuICAgIGlmIChjdXJyZW50ICE9IG51bGwgJiYgKGNvbXB1dGVkID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IChjdXJyZW50ID09PSBjdXJyZW50ICYmICFpc1N5bWJvbChjdXJyZW50KSlcbiAgICAgICAgICA6IGNvbXBhcmF0b3IoY3VycmVudCwgY29tcHV0ZWQpXG4gICAgICAgICkpIHtcbiAgICAgIHZhciBjb21wdXRlZCA9IGN1cnJlbnQsXG4gICAgICAgICAgcmVzdWx0ID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUV4dHJlbXVtO1xuIiwidmFyIGJhc2VFYWNoID0gcmVxdWlyZSgnLi9fYmFzZUVhY2gnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5maWx0ZXJgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmaWx0ZXJlZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYmFzZUZpbHRlcihjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBiYXNlRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VGaWx0ZXI7XG4iLCIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZpbmRJbmRleGAgYW5kIGBfLmZpbmRMYXN0SW5kZXhgIHdpdGhvdXRcbiAqIHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUZpbmRJbmRleChhcnJheSwgcHJlZGljYXRlLCBmcm9tSW5kZXgsIGZyb21SaWdodCkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgaW5kZXggPSBmcm9tSW5kZXggKyAoZnJvbVJpZ2h0ID8gMSA6IC0xKTtcblxuICB3aGlsZSAoKGZyb21SaWdodCA/IGluZGV4LS0gOiArK2luZGV4IDwgbGVuZ3RoKSkge1xuICAgIGlmIChwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlRmluZEluZGV4O1xuIiwidmFyIGFycmF5UHVzaCA9IHJlcXVpcmUoJy4vX2FycmF5UHVzaCcpLFxuICAgIGlzRmxhdHRlbmFibGUgPSByZXF1aXJlKCcuL19pc0ZsYXR0ZW5hYmxlJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZmxhdHRlbmAgd2l0aCBzdXBwb3J0IGZvciByZXN0cmljdGluZyBmbGF0dGVuaW5nLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmxhdHRlbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBkZXB0aCBUaGUgbWF4aW11bSByZWN1cnNpb24gZGVwdGguXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwcmVkaWNhdGU9aXNGbGF0dGVuYWJsZV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzU3RyaWN0XSBSZXN0cmljdCB0byB2YWx1ZXMgdGhhdCBwYXNzIGBwcmVkaWNhdGVgIGNoZWNrcy5cbiAqIEBwYXJhbSB7QXJyYXl9IFtyZXN1bHQ9W11dIFRoZSBpbml0aWFsIHJlc3VsdCB2YWx1ZS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYmFzZUZsYXR0ZW4oYXJyYXksIGRlcHRoLCBwcmVkaWNhdGUsIGlzU3RyaWN0LCByZXN1bHQpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgcHJlZGljYXRlIHx8IChwcmVkaWNhdGUgPSBpc0ZsYXR0ZW5hYmxlKTtcbiAgcmVzdWx0IHx8IChyZXN1bHQgPSBbXSk7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgaWYgKGRlcHRoID4gMCAmJiBwcmVkaWNhdGUodmFsdWUpKSB7XG4gICAgICBpZiAoZGVwdGggPiAxKSB7XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGZsYXR0ZW4gYXJyYXlzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAgIGJhc2VGbGF0dGVuKHZhbHVlLCBkZXB0aCAtIDEsIHByZWRpY2F0ZSwgaXNTdHJpY3QsIHJlc3VsdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhcnJheVB1c2gocmVzdWx0LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghaXNTdHJpY3QpIHtcbiAgICAgIHJlc3VsdFtyZXN1bHQubGVuZ3RoXSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VGbGF0dGVuO1xuIiwidmFyIGNyZWF0ZUJhc2VGb3IgPSByZXF1aXJlKCcuL19jcmVhdGVCYXNlRm9yJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGJhc2VGb3JPd25gIHdoaWNoIGl0ZXJhdGVzIG92ZXIgYG9iamVjdGBcbiAqIHByb3BlcnRpZXMgcmV0dXJuZWQgYnkgYGtleXNGdW5jYCBhbmQgaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBlYWNoIHByb3BlcnR5LlxuICogSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0IGl0ZXJhdGlvbiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGtleXNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIGtleXMgb2YgYG9iamVjdGAuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICovXG52YXIgYmFzZUZvciA9IGNyZWF0ZUJhc2VGb3IoKTtcblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlRm9yO1xuIiwidmFyIGJhc2VGb3IgPSByZXF1aXJlKCcuL19iYXNlRm9yJyksXG4gICAga2V5cyA9IHJlcXVpcmUoJy4va2V5cycpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZvck93bmAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VGb3JPd24ob2JqZWN0LCBpdGVyYXRlZSkge1xuICByZXR1cm4gb2JqZWN0ICYmIGJhc2VGb3Iob2JqZWN0LCBpdGVyYXRlZSwga2V5cyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUZvck93bjtcbiIsInZhciBjYXN0UGF0aCA9IHJlcXVpcmUoJy4vX2Nhc3RQYXRoJyksXG4gICAgdG9LZXkgPSByZXF1aXJlKCcuL190b0tleScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmdldGAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWZhdWx0IHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYmFzZUdldChvYmplY3QsIHBhdGgpIHtcbiAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG5cbiAgdmFyIGluZGV4ID0gMCxcbiAgICAgIGxlbmd0aCA9IHBhdGgubGVuZ3RoO1xuXG4gIHdoaWxlIChvYmplY3QgIT0gbnVsbCAmJiBpbmRleCA8IGxlbmd0aCkge1xuICAgIG9iamVjdCA9IG9iamVjdFt0b0tleShwYXRoW2luZGV4KytdKV07XG4gIH1cbiAgcmV0dXJuIChpbmRleCAmJiBpbmRleCA9PSBsZW5ndGgpID8gb2JqZWN0IDogdW5kZWZpbmVkO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VHZXQ7XG4iLCJ2YXIgYXJyYXlQdXNoID0gcmVxdWlyZSgnLi9fYXJyYXlQdXNoJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBnZXRBbGxLZXlzYCBhbmQgYGdldEFsbEtleXNJbmAgd2hpY2ggdXNlc1xuICogYGtleXNGdW5jYCBhbmQgYHN5bWJvbHNGdW5jYCB0byBnZXQgdGhlIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgYW5kXG4gKiBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBrZXlzIG9mIGBvYmplY3RgLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gc3ltYm9sc0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUgc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VHZXRBbGxLZXlzKG9iamVjdCwga2V5c0Z1bmMsIHN5bWJvbHNGdW5jKSB7XG4gIHZhciByZXN1bHQgPSBrZXlzRnVuYyhvYmplY3QpO1xuICByZXR1cm4gaXNBcnJheShvYmplY3QpID8gcmVzdWx0IDogYXJyYXlQdXNoKHJlc3VsdCwgc3ltYm9sc0Z1bmMob2JqZWN0KSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUdldEFsbEtleXM7XG4iLCJ2YXIgU3ltYm9sID0gcmVxdWlyZSgnLi9fU3ltYm9sJyksXG4gICAgZ2V0UmF3VGFnID0gcmVxdWlyZSgnLi9fZ2V0UmF3VGFnJyksXG4gICAgb2JqZWN0VG9TdHJpbmcgPSByZXF1aXJlKCcuL19vYmplY3RUb1N0cmluZycpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgbnVsbFRhZyA9ICdbb2JqZWN0IE51bGxdJyxcbiAgICB1bmRlZmluZWRUYWcgPSAnW29iamVjdCBVbmRlZmluZWRdJztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgc3ltVG9TdHJpbmdUYWcgPSBTeW1ib2wgPyBTeW1ib2wudG9TdHJpbmdUYWcgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGdldFRhZ2Agd2l0aG91dCBmYWxsYmFja3MgZm9yIGJ1Z2d5IGVudmlyb25tZW50cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBgdG9TdHJpbmdUYWdgLlxuICovXG5mdW5jdGlvbiBiYXNlR2V0VGFnKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWRUYWcgOiBudWxsVGFnO1xuICB9XG4gIHJldHVybiAoc3ltVG9TdHJpbmdUYWcgJiYgc3ltVG9TdHJpbmdUYWcgaW4gT2JqZWN0KHZhbHVlKSlcbiAgICA/IGdldFJhd1RhZyh2YWx1ZSlcbiAgICA6IG9iamVjdFRvU3RyaW5nKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlR2V0VGFnO1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5ndGAgd2hpY2ggZG9lc24ndCBjb2VyY2UgYXJndW1lbnRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGdyZWF0ZXIgdGhhbiBgb3RoZXJgLFxuICogIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUd0KHZhbHVlLCBvdGhlcikge1xuICByZXR1cm4gdmFsdWUgPiBvdGhlcjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlR3Q7XG4iLCIvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmhhc2Agd2l0aG91dCBzdXBwb3J0IGZvciBkZWVwIHBhdGhzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBrZXkgVGhlIGtleSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUhhcyhvYmplY3QsIGtleSkge1xuICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYgaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUhhcztcbiIsIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaGFzSW5gIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30ga2V5IFRoZSBrZXkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VIYXNJbihvYmplY3QsIGtleSkge1xuICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYga2V5IGluIE9iamVjdChvYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VIYXNJbjtcbiIsInZhciBiYXNlRmluZEluZGV4ID0gcmVxdWlyZSgnLi9fYmFzZUZpbmRJbmRleCcpLFxuICAgIGJhc2VJc05hTiA9IHJlcXVpcmUoJy4vX2Jhc2VJc05hTicpLFxuICAgIHN0cmljdEluZGV4T2YgPSByZXF1aXJlKCcuL19zdHJpY3RJbmRleE9mJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaW5kZXhPZmAgd2l0aG91dCBgZnJvbUluZGV4YCBib3VuZHMgY2hlY2tzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gdmFsdWVcbiAgICA/IHN0cmljdEluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpXG4gICAgOiBiYXNlRmluZEluZGV4KGFycmF5LCBiYXNlSXNOYU4sIGZyb21JbmRleCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUluZGV4T2Y7XG4iLCJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYXJnc1RhZyA9ICdbb2JqZWN0IEFyZ3VtZW50c10nO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzQXJndW1lbnRzYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBgYXJndW1lbnRzYCBvYmplY3QsXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc0FyZ3VtZW50cyh2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBhcmdzVGFnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJc0FyZ3VtZW50cztcbiIsInZhciBiYXNlSXNFcXVhbERlZXAgPSByZXF1aXJlKCcuL19iYXNlSXNFcXVhbERlZXAnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzRXF1YWxgIHdoaWNoIHN1cHBvcnRzIHBhcnRpYWwgY29tcGFyaXNvbnNcbiAqIGFuZCB0cmFja3MgdHJhdmVyc2VkIG9iamVjdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHtib29sZWFufSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLlxuICogIDEgLSBVbm9yZGVyZWQgY29tcGFyaXNvblxuICogIDIgLSBQYXJ0aWFsIGNvbXBhcmlzb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBgdmFsdWVgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNFcXVhbCh2YWx1ZSwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKSB7XG4gIGlmICh2YWx1ZSA9PT0gb3RoZXIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAodmFsdWUgPT0gbnVsbCB8fCBvdGhlciA9PSBudWxsIHx8ICghaXNPYmplY3RMaWtlKHZhbHVlKSAmJiAhaXNPYmplY3RMaWtlKG90aGVyKSkpIHtcbiAgICByZXR1cm4gdmFsdWUgIT09IHZhbHVlICYmIG90aGVyICE9PSBvdGhlcjtcbiAgfVxuICByZXR1cm4gYmFzZUlzRXF1YWxEZWVwKHZhbHVlLCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgYmFzZUlzRXF1YWwsIHN0YWNrKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNFcXVhbDtcbiIsInZhciBTdGFjayA9IHJlcXVpcmUoJy4vX1N0YWNrJyksXG4gICAgZXF1YWxBcnJheXMgPSByZXF1aXJlKCcuL19lcXVhbEFycmF5cycpLFxuICAgIGVxdWFsQnlUYWcgPSByZXF1aXJlKCcuL19lcXVhbEJ5VGFnJyksXG4gICAgZXF1YWxPYmplY3RzID0gcmVxdWlyZSgnLi9fZXF1YWxPYmplY3RzJyksXG4gICAgZ2V0VGFnID0gcmVxdWlyZSgnLi9fZ2V0VGFnJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIGlzQnVmZmVyID0gcmVxdWlyZSgnLi9pc0J1ZmZlcicpLFxuICAgIGlzVHlwZWRBcnJheSA9IHJlcXVpcmUoJy4vaXNUeXBlZEFycmF5Jyk7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIHZhbHVlIGNvbXBhcmlzb25zLiAqL1xudmFyIENPTVBBUkVfUEFSVElBTF9GTEFHID0gMTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJyxcbiAgICBhcnJheVRhZyA9ICdbb2JqZWN0IEFycmF5XScsXG4gICAgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XSc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbGAgZm9yIGFycmF5cyBhbmQgb2JqZWN0cyB3aGljaCBwZXJmb3Jtc1xuICogZGVlcCBjb21wYXJpc29ucyBhbmQgdHJhY2tzIHRyYXZlcnNlZCBvYmplY3RzIGVuYWJsaW5nIG9iamVjdHMgd2l0aCBjaXJjdWxhclxuICogcmVmZXJlbmNlcyB0byBiZSBjb21wYXJlZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIGBvYmplY3RgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9iamVjdHMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzRXF1YWxEZWVwKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgdmFyIG9iaklzQXJyID0gaXNBcnJheShvYmplY3QpLFxuICAgICAgb3RoSXNBcnIgPSBpc0FycmF5KG90aGVyKSxcbiAgICAgIG9ialRhZyA9IG9iaklzQXJyID8gYXJyYXlUYWcgOiBnZXRUYWcob2JqZWN0KSxcbiAgICAgIG90aFRhZyA9IG90aElzQXJyID8gYXJyYXlUYWcgOiBnZXRUYWcob3RoZXIpO1xuXG4gIG9ialRhZyA9IG9ialRhZyA9PSBhcmdzVGFnID8gb2JqZWN0VGFnIDogb2JqVGFnO1xuICBvdGhUYWcgPSBvdGhUYWcgPT0gYXJnc1RhZyA/IG9iamVjdFRhZyA6IG90aFRhZztcblxuICB2YXIgb2JqSXNPYmogPSBvYmpUYWcgPT0gb2JqZWN0VGFnLFxuICAgICAgb3RoSXNPYmogPSBvdGhUYWcgPT0gb2JqZWN0VGFnLFxuICAgICAgaXNTYW1lVGFnID0gb2JqVGFnID09IG90aFRhZztcblxuICBpZiAoaXNTYW1lVGFnICYmIGlzQnVmZmVyKG9iamVjdCkpIHtcbiAgICBpZiAoIWlzQnVmZmVyKG90aGVyKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBvYmpJc0FyciA9IHRydWU7XG4gICAgb2JqSXNPYmogPSBmYWxzZTtcbiAgfVxuICBpZiAoaXNTYW1lVGFnICYmICFvYmpJc09iaikge1xuICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgcmV0dXJuIChvYmpJc0FyciB8fCBpc1R5cGVkQXJyYXkob2JqZWN0KSlcbiAgICAgID8gZXF1YWxBcnJheXMob2JqZWN0LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaylcbiAgICAgIDogZXF1YWxCeVRhZyhvYmplY3QsIG90aGVyLCBvYmpUYWcsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spO1xuICB9XG4gIGlmICghKGJpdG1hc2sgJiBDT01QQVJFX1BBUlRJQUxfRkxBRykpIHtcbiAgICB2YXIgb2JqSXNXcmFwcGVkID0gb2JqSXNPYmogJiYgaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsICdfX3dyYXBwZWRfXycpLFxuICAgICAgICBvdGhJc1dyYXBwZWQgPSBvdGhJc09iaiAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG90aGVyLCAnX193cmFwcGVkX18nKTtcblxuICAgIGlmIChvYmpJc1dyYXBwZWQgfHwgb3RoSXNXcmFwcGVkKSB7XG4gICAgICB2YXIgb2JqVW53cmFwcGVkID0gb2JqSXNXcmFwcGVkID8gb2JqZWN0LnZhbHVlKCkgOiBvYmplY3QsXG4gICAgICAgICAgb3RoVW53cmFwcGVkID0gb3RoSXNXcmFwcGVkID8gb3RoZXIudmFsdWUoKSA6IG90aGVyO1xuXG4gICAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICAgICAgcmV0dXJuIGVxdWFsRnVuYyhvYmpVbndyYXBwZWQsIG90aFVud3JhcHBlZCwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spO1xuICAgIH1cbiAgfVxuICBpZiAoIWlzU2FtZVRhZykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICByZXR1cm4gZXF1YWxPYmplY3RzKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJc0VxdWFsRGVlcDtcbiIsInZhciBnZXRUYWcgPSByZXF1aXJlKCcuL19nZXRUYWcnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgbWFwVGFnID0gJ1tvYmplY3QgTWFwXSc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNNYXBgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbWFwLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc01hcCh2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBnZXRUYWcodmFsdWUpID09IG1hcFRhZztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNNYXA7XG4iLCJ2YXIgU3RhY2sgPSByZXF1aXJlKCcuL19TdGFjaycpLFxuICAgIGJhc2VJc0VxdWFsID0gcmVxdWlyZSgnLi9fYmFzZUlzRXF1YWwnKTtcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgdmFsdWUgY29tcGFyaXNvbnMuICovXG52YXIgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgPSAxLFxuICAgIENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcgPSAyO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTWF0Y2hgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICogQHBhcmFtIHtBcnJheX0gbWF0Y2hEYXRhIFRoZSBwcm9wZXJ0eSBuYW1lcywgdmFsdWVzLCBhbmQgY29tcGFyZSBmbGFncyB0byBtYXRjaC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBvYmplY3RgIGlzIGEgbWF0Y2gsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzTWF0Y2gob2JqZWN0LCBzb3VyY2UsIG1hdGNoRGF0YSwgY3VzdG9taXplcikge1xuICB2YXIgaW5kZXggPSBtYXRjaERhdGEubGVuZ3RoLFxuICAgICAgbGVuZ3RoID0gaW5kZXgsXG4gICAgICBub0N1c3RvbWl6ZXIgPSAhY3VzdG9taXplcjtcblxuICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICByZXR1cm4gIWxlbmd0aDtcbiAgfVxuICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcbiAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICB2YXIgZGF0YSA9IG1hdGNoRGF0YVtpbmRleF07XG4gICAgaWYgKChub0N1c3RvbWl6ZXIgJiYgZGF0YVsyXSlcbiAgICAgICAgICA/IGRhdGFbMV0gIT09IG9iamVjdFtkYXRhWzBdXVxuICAgICAgICAgIDogIShkYXRhWzBdIGluIG9iamVjdClcbiAgICAgICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgZGF0YSA9IG1hdGNoRGF0YVtpbmRleF07XG4gICAgdmFyIGtleSA9IGRhdGFbMF0sXG4gICAgICAgIG9ialZhbHVlID0gb2JqZWN0W2tleV0sXG4gICAgICAgIHNyY1ZhbHVlID0gZGF0YVsxXTtcblxuICAgIGlmIChub0N1c3RvbWl6ZXIgJiYgZGF0YVsyXSkge1xuICAgICAgaWYgKG9ialZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBzdGFjayA9IG5ldyBTdGFjaztcbiAgICAgIGlmIChjdXN0b21pemVyKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QsIHNvdXJjZSwgc3RhY2spO1xuICAgICAgfVxuICAgICAgaWYgKCEocmVzdWx0ID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gYmFzZUlzRXF1YWwoc3JjVmFsdWUsIG9ialZhbHVlLCBDT01QQVJFX1BBUlRJQUxfRkxBRyB8IENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcsIGN1c3RvbWl6ZXIsIHN0YWNrKVxuICAgICAgICAgICAgOiByZXN1bHRcbiAgICAgICAgICApKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUlzTWF0Y2g7XG4iLCIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTmFOYCB3aXRob3V0IHN1cHBvcnQgZm9yIG51bWJlciBvYmplY3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGBOYU5gLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc05hTih2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT09IHZhbHVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJc05hTjtcbiIsInZhciBpc0Z1bmN0aW9uID0gcmVxdWlyZSgnLi9pc0Z1bmN0aW9uJyksXG4gICAgaXNNYXNrZWQgPSByZXF1aXJlKCcuL19pc01hc2tlZCcpLFxuICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpLFxuICAgIHRvU291cmNlID0gcmVxdWlyZSgnLi9fdG9Tb3VyY2UnKTtcblxuLyoqXG4gKiBVc2VkIHRvIG1hdGNoIGBSZWdFeHBgXG4gKiBbc3ludGF4IGNoYXJhY3RlcnNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXBhdHRlcm5zKS5cbiAqL1xudmFyIHJlUmVnRXhwQ2hhciA9IC9bXFxcXF4kLiorPygpW1xcXXt9fF0vZztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGhvc3QgY29uc3RydWN0b3JzIChTYWZhcmkpLiAqL1xudmFyIHJlSXNIb3N0Q3RvciA9IC9eXFxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXFxdJC87XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBmdW5jUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGUsXG4gICAgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG52YXIgZnVuY1RvU3RyaW5nID0gZnVuY1Byb3RvLnRvU3RyaW5nO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKiogVXNlZCB0byBkZXRlY3QgaWYgYSBtZXRob2QgaXMgbmF0aXZlLiAqL1xudmFyIHJlSXNOYXRpdmUgPSBSZWdFeHAoJ14nICtcbiAgZnVuY1RvU3RyaW5nLmNhbGwoaGFzT3duUHJvcGVydHkpLnJlcGxhY2UocmVSZWdFeHBDaGFyLCAnXFxcXCQmJylcbiAgLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFxcXFwoKXwgZm9yIC4rPyg/PVxcXFxcXF0pL2csICckMS4qPycpICsgJyQnXG4pO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTmF0aXZlYCB3aXRob3V0IGJhZCBzaGltIGNoZWNrcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG5hdGl2ZSBmdW5jdGlvbixcbiAqICBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc05hdGl2ZSh2YWx1ZSkge1xuICBpZiAoIWlzT2JqZWN0KHZhbHVlKSB8fCBpc01hc2tlZCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHBhdHRlcm4gPSBpc0Z1bmN0aW9uKHZhbHVlKSA/IHJlSXNOYXRpdmUgOiByZUlzSG9zdEN0b3I7XG4gIHJldHVybiBwYXR0ZXJuLnRlc3QodG9Tb3VyY2UodmFsdWUpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNOYXRpdmU7XG4iLCJ2YXIgZ2V0VGFnID0gcmVxdWlyZSgnLi9fZ2V0VGFnJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIHNldFRhZyA9ICdbb2JqZWN0IFNldF0nO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzU2V0YCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHNldCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNTZXQodmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgZ2V0VGFnKHZhbHVlKSA9PSBzZXRUYWc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUlzU2V0O1xuIiwidmFyIGJhc2VHZXRUYWcgPSByZXF1aXJlKCcuL19iYXNlR2V0VGFnJyksXG4gICAgaXNMZW5ndGggPSByZXF1aXJlKCcuL2lzTGVuZ3RoJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJyxcbiAgICBhcnJheVRhZyA9ICdbb2JqZWN0IEFycmF5XScsXG4gICAgYm9vbFRhZyA9ICdbb2JqZWN0IEJvb2xlYW5dJyxcbiAgICBkYXRlVGFnID0gJ1tvYmplY3QgRGF0ZV0nLFxuICAgIGVycm9yVGFnID0gJ1tvYmplY3QgRXJyb3JdJyxcbiAgICBmdW5jVGFnID0gJ1tvYmplY3QgRnVuY3Rpb25dJyxcbiAgICBtYXBUYWcgPSAnW29iamVjdCBNYXBdJyxcbiAgICBudW1iZXJUYWcgPSAnW29iamVjdCBOdW1iZXJdJyxcbiAgICBvYmplY3RUYWcgPSAnW29iamVjdCBPYmplY3RdJyxcbiAgICByZWdleHBUYWcgPSAnW29iamVjdCBSZWdFeHBdJyxcbiAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJyxcbiAgICBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJyxcbiAgICB3ZWFrTWFwVGFnID0gJ1tvYmplY3QgV2Vha01hcF0nO1xuXG52YXIgYXJyYXlCdWZmZXJUYWcgPSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nLFxuICAgIGRhdGFWaWV3VGFnID0gJ1tvYmplY3QgRGF0YVZpZXddJyxcbiAgICBmbG9hdDMyVGFnID0gJ1tvYmplY3QgRmxvYXQzMkFycmF5XScsXG4gICAgZmxvYXQ2NFRhZyA9ICdbb2JqZWN0IEZsb2F0NjRBcnJheV0nLFxuICAgIGludDhUYWcgPSAnW29iamVjdCBJbnQ4QXJyYXldJyxcbiAgICBpbnQxNlRhZyA9ICdbb2JqZWN0IEludDE2QXJyYXldJyxcbiAgICBpbnQzMlRhZyA9ICdbb2JqZWN0IEludDMyQXJyYXldJyxcbiAgICB1aW50OFRhZyA9ICdbb2JqZWN0IFVpbnQ4QXJyYXldJyxcbiAgICB1aW50OENsYW1wZWRUYWcgPSAnW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0nLFxuICAgIHVpbnQxNlRhZyA9ICdbb2JqZWN0IFVpbnQxNkFycmF5XScsXG4gICAgdWludDMyVGFnID0gJ1tvYmplY3QgVWludDMyQXJyYXldJztcblxuLyoqIFVzZWQgdG8gaWRlbnRpZnkgYHRvU3RyaW5nVGFnYCB2YWx1ZXMgb2YgdHlwZWQgYXJyYXlzLiAqL1xudmFyIHR5cGVkQXJyYXlUYWdzID0ge307XG50eXBlZEFycmF5VGFnc1tmbG9hdDMyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Zsb2F0NjRUYWddID1cbnR5cGVkQXJyYXlUYWdzW2ludDhUYWddID0gdHlwZWRBcnJheVRhZ3NbaW50MTZUYWddID1cbnR5cGVkQXJyYXlUYWdzW2ludDMyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW3VpbnQ4VGFnXSA9XG50eXBlZEFycmF5VGFnc1t1aW50OENsYW1wZWRUYWddID0gdHlwZWRBcnJheVRhZ3NbdWludDE2VGFnXSA9XG50eXBlZEFycmF5VGFnc1t1aW50MzJUYWddID0gdHJ1ZTtcbnR5cGVkQXJyYXlUYWdzW2FyZ3NUYWddID0gdHlwZWRBcnJheVRhZ3NbYXJyYXlUYWddID1cbnR5cGVkQXJyYXlUYWdzW2FycmF5QnVmZmVyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Jvb2xUYWddID1cbnR5cGVkQXJyYXlUYWdzW2RhdGFWaWV3VGFnXSA9IHR5cGVkQXJyYXlUYWdzW2RhdGVUYWddID1cbnR5cGVkQXJyYXlUYWdzW2Vycm9yVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Z1bmNUYWddID1cbnR5cGVkQXJyYXlUYWdzW21hcFRhZ10gPSB0eXBlZEFycmF5VGFnc1tudW1iZXJUYWddID1cbnR5cGVkQXJyYXlUYWdzW29iamVjdFRhZ10gPSB0eXBlZEFycmF5VGFnc1tyZWdleHBUYWddID1cbnR5cGVkQXJyYXlUYWdzW3NldFRhZ10gPSB0eXBlZEFycmF5VGFnc1tzdHJpbmdUYWddID1cbnR5cGVkQXJyYXlUYWdzW3dlYWtNYXBUYWddID0gZmFsc2U7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNUeXBlZEFycmF5YCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHR5cGVkIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc1R5cGVkQXJyYXkodmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiZcbiAgICBpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpICYmICEhdHlwZWRBcnJheVRhZ3NbYmFzZUdldFRhZyh2YWx1ZSldO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJc1R5cGVkQXJyYXk7XG4iLCJ2YXIgYmFzZU1hdGNoZXMgPSByZXF1aXJlKCcuL19iYXNlTWF0Y2hlcycpLFxuICAgIGJhc2VNYXRjaGVzUHJvcGVydHkgPSByZXF1aXJlKCcuL19iYXNlTWF0Y2hlc1Byb3BlcnR5JyksXG4gICAgaWRlbnRpdHkgPSByZXF1aXJlKCcuL2lkZW50aXR5JyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIHByb3BlcnR5ID0gcmVxdWlyZSgnLi9wcm9wZXJ0eScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLml0ZXJhdGVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSBbdmFsdWU9Xy5pZGVudGl0eV0gVGhlIHZhbHVlIHRvIGNvbnZlcnQgdG8gYW4gaXRlcmF0ZWUuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGl0ZXJhdGVlLlxuICovXG5mdW5jdGlvbiBiYXNlSXRlcmF0ZWUodmFsdWUpIHtcbiAgLy8gRG9uJ3Qgc3RvcmUgdGhlIGB0eXBlb2ZgIHJlc3VsdCBpbiBhIHZhcmlhYmxlIHRvIGF2b2lkIGEgSklUIGJ1ZyBpbiBTYWZhcmkgOS5cbiAgLy8gU2VlIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTYwMzQgZm9yIG1vcmUgZGV0YWlscy5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGlkZW50aXR5O1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gaXNBcnJheSh2YWx1ZSlcbiAgICAgID8gYmFzZU1hdGNoZXNQcm9wZXJ0eSh2YWx1ZVswXSwgdmFsdWVbMV0pXG4gICAgICA6IGJhc2VNYXRjaGVzKHZhbHVlKTtcbiAgfVxuICByZXR1cm4gcHJvcGVydHkodmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJdGVyYXRlZTtcbiIsInZhciBpc1Byb3RvdHlwZSA9IHJlcXVpcmUoJy4vX2lzUHJvdG90eXBlJyksXG4gICAgbmF0aXZlS2V5cyA9IHJlcXVpcmUoJy4vX25hdGl2ZUtleXMnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5rZXlzYCB3aGljaCBkb2Vzbid0IHRyZWF0IHNwYXJzZSBhcnJheXMgYXMgZGVuc2UuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VLZXlzKG9iamVjdCkge1xuICBpZiAoIWlzUHJvdG90eXBlKG9iamVjdCkpIHtcbiAgICByZXR1cm4gbmF0aXZlS2V5cyhvYmplY3QpO1xuICB9XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgZm9yICh2YXIga2V5IGluIE9iamVjdChvYmplY3QpKSB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpICYmIGtleSAhPSAnY29uc3RydWN0b3InKSB7XG4gICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VLZXlzO1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpLFxuICAgIGlzUHJvdG90eXBlID0gcmVxdWlyZSgnLi9faXNQcm90b3R5cGUnKSxcbiAgICBuYXRpdmVLZXlzSW4gPSByZXF1aXJlKCcuL19uYXRpdmVLZXlzSW4nKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5rZXlzSW5gIHdoaWNoIGRvZXNuJ3QgdHJlYXQgc3BhcnNlIGFycmF5cyBhcyBkZW5zZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gYmFzZUtleXNJbihvYmplY3QpIHtcbiAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7XG4gICAgcmV0dXJuIG5hdGl2ZUtleXNJbihvYmplY3QpO1xuICB9XG4gIHZhciBpc1Byb3RvID0gaXNQcm90b3R5cGUob2JqZWN0KSxcbiAgICAgIHJlc3VsdCA9IFtdO1xuXG4gIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcbiAgICBpZiAoIShrZXkgPT0gJ2NvbnN0cnVjdG9yJyAmJiAoaXNQcm90byB8fCAhaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpKSkge1xuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlS2V5c0luO1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5sdGAgd2hpY2ggZG9lc24ndCBjb2VyY2UgYXJndW1lbnRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGxlc3MgdGhhbiBgb3RoZXJgLFxuICogIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUx0KHZhbHVlLCBvdGhlcikge1xuICByZXR1cm4gdmFsdWUgPCBvdGhlcjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlTHQ7XG4iLCJ2YXIgYmFzZUVhY2ggPSByZXF1aXJlKCcuL19iYXNlRWFjaCcpLFxuICAgIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm1hcGAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBiYXNlTWFwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgcmVzdWx0ID0gaXNBcnJheUxpa2UoY29sbGVjdGlvbikgPyBBcnJheShjb2xsZWN0aW9uLmxlbmd0aCkgOiBbXTtcblxuICBiYXNlRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSB7XG4gICAgcmVzdWx0WysraW5kZXhdID0gaXRlcmF0ZWUodmFsdWUsIGtleSwgY29sbGVjdGlvbik7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VNYXA7XG4iLCJ2YXIgYmFzZUlzTWF0Y2ggPSByZXF1aXJlKCcuL19iYXNlSXNNYXRjaCcpLFxuICAgIGdldE1hdGNoRGF0YSA9IHJlcXVpcmUoJy4vX2dldE1hdGNoRGF0YScpLFxuICAgIG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlID0gcmVxdWlyZSgnLi9fbWF0Y2hlc1N0cmljdENvbXBhcmFibGUnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tYXRjaGVzYCB3aGljaCBkb2Vzbid0IGNsb25lIGBzb3VyY2VgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gYmFzZU1hdGNoZXMoc291cmNlKSB7XG4gIHZhciBtYXRjaERhdGEgPSBnZXRNYXRjaERhdGEoc291cmNlKTtcbiAgaWYgKG1hdGNoRGF0YS5sZW5ndGggPT0gMSAmJiBtYXRjaERhdGFbMF1bMl0pIHtcbiAgICByZXR1cm4gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUobWF0Y2hEYXRhWzBdWzBdLCBtYXRjaERhdGFbMF1bMV0pO1xuICB9XG4gIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICByZXR1cm4gb2JqZWN0ID09PSBzb3VyY2UgfHwgYmFzZUlzTWF0Y2gob2JqZWN0LCBzb3VyY2UsIG1hdGNoRGF0YSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZU1hdGNoZXM7XG4iLCJ2YXIgYmFzZUlzRXF1YWwgPSByZXF1aXJlKCcuL19iYXNlSXNFcXVhbCcpLFxuICAgIGdldCA9IHJlcXVpcmUoJy4vZ2V0JyksXG4gICAgaGFzSW4gPSByZXF1aXJlKCcuL2hhc0luJyksXG4gICAgaXNLZXkgPSByZXF1aXJlKCcuL19pc0tleScpLFxuICAgIGlzU3RyaWN0Q29tcGFyYWJsZSA9IHJlcXVpcmUoJy4vX2lzU3RyaWN0Q29tcGFyYWJsZScpLFxuICAgIG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlID0gcmVxdWlyZSgnLi9fbWF0Y2hlc1N0cmljdENvbXBhcmFibGUnKSxcbiAgICB0b0tleSA9IHJlcXVpcmUoJy4vX3RvS2V5Jyk7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIHZhbHVlIGNvbXBhcmlzb25zLiAqL1xudmFyIENPTVBBUkVfUEFSVElBTF9GTEFHID0gMSxcbiAgICBDT01QQVJFX1VOT1JERVJFRF9GTEFHID0gMjtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tYXRjaGVzUHJvcGVydHlgIHdoaWNoIGRvZXNuJ3QgY2xvbmUgYHNyY1ZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEBwYXJhbSB7Kn0gc3JjVmFsdWUgVGhlIHZhbHVlIHRvIG1hdGNoLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gYmFzZU1hdGNoZXNQcm9wZXJ0eShwYXRoLCBzcmNWYWx1ZSkge1xuICBpZiAoaXNLZXkocGF0aCkgJiYgaXNTdHJpY3RDb21wYXJhYmxlKHNyY1ZhbHVlKSkge1xuICAgIHJldHVybiBtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZSh0b0tleShwYXRoKSwgc3JjVmFsdWUpO1xuICB9XG4gIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICB2YXIgb2JqVmFsdWUgPSBnZXQob2JqZWN0LCBwYXRoKTtcbiAgICByZXR1cm4gKG9ialZhbHVlID09PSB1bmRlZmluZWQgJiYgb2JqVmFsdWUgPT09IHNyY1ZhbHVlKVxuICAgICAgPyBoYXNJbihvYmplY3QsIHBhdGgpXG4gICAgICA6IGJhc2VJc0VxdWFsKHNyY1ZhbHVlLCBvYmpWYWx1ZSwgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgfCBDT01QQVJFX1VOT1JERVJFRF9GTEFHKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlTWF0Y2hlc1Byb3BlcnR5O1xuIiwidmFyIFN0YWNrID0gcmVxdWlyZSgnLi9fU3RhY2snKSxcbiAgICBhc3NpZ25NZXJnZVZhbHVlID0gcmVxdWlyZSgnLi9fYXNzaWduTWVyZ2VWYWx1ZScpLFxuICAgIGJhc2VGb3IgPSByZXF1aXJlKCcuL19iYXNlRm9yJyksXG4gICAgYmFzZU1lcmdlRGVlcCA9IHJlcXVpcmUoJy4vX2Jhc2VNZXJnZURlZXAnKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKSxcbiAgICBrZXlzSW4gPSByZXF1aXJlKCcuL2tleXNJbicpLFxuICAgIHNhZmVHZXQgPSByZXF1aXJlKCcuL19zYWZlR2V0Jyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWVyZ2VgIHdpdGhvdXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc291cmNlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBzcmNJbmRleCBUaGUgaW5kZXggb2YgYHNvdXJjZWAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBtZXJnZWQgdmFsdWVzLlxuICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBzb3VyY2UgdmFsdWVzIGFuZCB0aGVpciBtZXJnZWRcbiAqICBjb3VudGVycGFydHMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VNZXJnZShvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIsIHN0YWNrKSB7XG4gIGlmIChvYmplY3QgPT09IHNvdXJjZSkge1xuICAgIHJldHVybjtcbiAgfVxuICBiYXNlRm9yKHNvdXJjZSwgZnVuY3Rpb24oc3JjVmFsdWUsIGtleSkge1xuICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgaWYgKGlzT2JqZWN0KHNyY1ZhbHVlKSkge1xuICAgICAgYmFzZU1lcmdlRGVlcChvYmplY3QsIHNvdXJjZSwga2V5LCBzcmNJbmRleCwgYmFzZU1lcmdlLCBjdXN0b21pemVyLCBzdGFjayk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdmFyIG5ld1ZhbHVlID0gY3VzdG9taXplclxuICAgICAgICA/IGN1c3RvbWl6ZXIoc2FmZUdldChvYmplY3QsIGtleSksIHNyY1ZhbHVlLCAoa2V5ICsgJycpLCBvYmplY3QsIHNvdXJjZSwgc3RhY2spXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICBpZiAobmV3VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBuZXdWYWx1ZSA9IHNyY1ZhbHVlO1xuICAgICAgfVxuICAgICAgYXNzaWduTWVyZ2VWYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgIH1cbiAgfSwga2V5c0luKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlTWVyZ2U7XG4iLCJ2YXIgYXNzaWduTWVyZ2VWYWx1ZSA9IHJlcXVpcmUoJy4vX2Fzc2lnbk1lcmdlVmFsdWUnKSxcbiAgICBjbG9uZUJ1ZmZlciA9IHJlcXVpcmUoJy4vX2Nsb25lQnVmZmVyJyksXG4gICAgY2xvbmVUeXBlZEFycmF5ID0gcmVxdWlyZSgnLi9fY2xvbmVUeXBlZEFycmF5JyksXG4gICAgY29weUFycmF5ID0gcmVxdWlyZSgnLi9fY29weUFycmF5JyksXG4gICAgaW5pdENsb25lT2JqZWN0ID0gcmVxdWlyZSgnLi9faW5pdENsb25lT2JqZWN0JyksXG4gICAgaXNBcmd1bWVudHMgPSByZXF1aXJlKCcuL2lzQXJndW1lbnRzJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIGlzQXJyYXlMaWtlT2JqZWN0ID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZU9iamVjdCcpLFxuICAgIGlzQnVmZmVyID0gcmVxdWlyZSgnLi9pc0J1ZmZlcicpLFxuICAgIGlzRnVuY3Rpb24gPSByZXF1aXJlKCcuL2lzRnVuY3Rpb24nKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKSxcbiAgICBpc1BsYWluT2JqZWN0ID0gcmVxdWlyZSgnLi9pc1BsYWluT2JqZWN0JyksXG4gICAgaXNUeXBlZEFycmF5ID0gcmVxdWlyZSgnLi9pc1R5cGVkQXJyYXknKSxcbiAgICBzYWZlR2V0ID0gcmVxdWlyZSgnLi9fc2FmZUdldCcpLFxuICAgIHRvUGxhaW5PYmplY3QgPSByZXF1aXJlKCcuL3RvUGxhaW5PYmplY3QnKTtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VNZXJnZWAgZm9yIGFycmF5cyBhbmQgb2JqZWN0cyB3aGljaCBwZXJmb3Jtc1xuICogZGVlcCBtZXJnZXMgYW5kIHRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cyBlbmFibGluZyBvYmplY3RzIHdpdGggY2lyY3VsYXJcbiAqIHJlZmVyZW5jZXMgdG8gYmUgbWVyZ2VkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBtZXJnZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBzcmNJbmRleCBUaGUgaW5kZXggb2YgYHNvdXJjZWAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBtZXJnZUZ1bmMgVGhlIGZ1bmN0aW9uIHRvIG1lcmdlIHZhbHVlcy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGFzc2lnbmVkIHZhbHVlcy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgc291cmNlIHZhbHVlcyBhbmQgdGhlaXIgbWVyZ2VkXG4gKiAgY291bnRlcnBhcnRzLlxuICovXG5mdW5jdGlvbiBiYXNlTWVyZ2VEZWVwKG9iamVjdCwgc291cmNlLCBrZXksIHNyY0luZGV4LCBtZXJnZUZ1bmMsIGN1c3RvbWl6ZXIsIHN0YWNrKSB7XG4gIHZhciBvYmpWYWx1ZSA9IHNhZmVHZXQob2JqZWN0LCBrZXkpLFxuICAgICAgc3JjVmFsdWUgPSBzYWZlR2V0KHNvdXJjZSwga2V5KSxcbiAgICAgIHN0YWNrZWQgPSBzdGFjay5nZXQoc3JjVmFsdWUpO1xuXG4gIGlmIChzdGFja2VkKSB7XG4gICAgYXNzaWduTWVyZ2VWYWx1ZShvYmplY3QsIGtleSwgc3RhY2tlZCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXJcbiAgICA/IGN1c3RvbWl6ZXIob2JqVmFsdWUsIHNyY1ZhbHVlLCAoa2V5ICsgJycpLCBvYmplY3QsIHNvdXJjZSwgc3RhY2spXG4gICAgOiB1bmRlZmluZWQ7XG5cbiAgdmFyIGlzQ29tbW9uID0gbmV3VmFsdWUgPT09IHVuZGVmaW5lZDtcblxuICBpZiAoaXNDb21tb24pIHtcbiAgICB2YXIgaXNBcnIgPSBpc0FycmF5KHNyY1ZhbHVlKSxcbiAgICAgICAgaXNCdWZmID0gIWlzQXJyICYmIGlzQnVmZmVyKHNyY1ZhbHVlKSxcbiAgICAgICAgaXNUeXBlZCA9ICFpc0FyciAmJiAhaXNCdWZmICYmIGlzVHlwZWRBcnJheShzcmNWYWx1ZSk7XG5cbiAgICBuZXdWYWx1ZSA9IHNyY1ZhbHVlO1xuICAgIGlmIChpc0FyciB8fCBpc0J1ZmYgfHwgaXNUeXBlZCkge1xuICAgICAgaWYgKGlzQXJyYXkob2JqVmFsdWUpKSB7XG4gICAgICAgIG5ld1ZhbHVlID0gb2JqVmFsdWU7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChpc0FycmF5TGlrZU9iamVjdChvYmpWYWx1ZSkpIHtcbiAgICAgICAgbmV3VmFsdWUgPSBjb3B5QXJyYXkob2JqVmFsdWUpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoaXNCdWZmKSB7XG4gICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICAgIG5ld1ZhbHVlID0gY2xvbmVCdWZmZXIoc3JjVmFsdWUsIHRydWUpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoaXNUeXBlZCkge1xuICAgICAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgICAgICBuZXdWYWx1ZSA9IGNsb25lVHlwZWRBcnJheShzcmNWYWx1ZSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgbmV3VmFsdWUgPSBbXTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoaXNQbGFpbk9iamVjdChzcmNWYWx1ZSkgfHwgaXNBcmd1bWVudHMoc3JjVmFsdWUpKSB7XG4gICAgICBuZXdWYWx1ZSA9IG9ialZhbHVlO1xuICAgICAgaWYgKGlzQXJndW1lbnRzKG9ialZhbHVlKSkge1xuICAgICAgICBuZXdWYWx1ZSA9IHRvUGxhaW5PYmplY3Qob2JqVmFsdWUpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoIWlzT2JqZWN0KG9ialZhbHVlKSB8fCBpc0Z1bmN0aW9uKG9ialZhbHVlKSkge1xuICAgICAgICBuZXdWYWx1ZSA9IGluaXRDbG9uZU9iamVjdChzcmNWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgaWYgKGlzQ29tbW9uKSB7XG4gICAgLy8gUmVjdXJzaXZlbHkgbWVyZ2Ugb2JqZWN0cyBhbmQgYXJyYXlzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgc3RhY2suc2V0KHNyY1ZhbHVlLCBuZXdWYWx1ZSk7XG4gICAgbWVyZ2VGdW5jKG5ld1ZhbHVlLCBzcmNWYWx1ZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIsIHN0YWNrKTtcbiAgICBzdGFja1snZGVsZXRlJ10oc3JjVmFsdWUpO1xuICB9XG4gIGFzc2lnbk1lcmdlVmFsdWUob2JqZWN0LCBrZXksIG5ld1ZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlTWVyZ2VEZWVwO1xuIiwidmFyIGFycmF5TWFwID0gcmVxdWlyZSgnLi9fYXJyYXlNYXAnKSxcbiAgICBiYXNlR2V0ID0gcmVxdWlyZSgnLi9fYmFzZUdldCcpLFxuICAgIGJhc2VJdGVyYXRlZSA9IHJlcXVpcmUoJy4vX2Jhc2VJdGVyYXRlZScpLFxuICAgIGJhc2VNYXAgPSByZXF1aXJlKCcuL19iYXNlTWFwJyksXG4gICAgYmFzZVNvcnRCeSA9IHJlcXVpcmUoJy4vX2Jhc2VTb3J0QnknKSxcbiAgICBiYXNlVW5hcnkgPSByZXF1aXJlKCcuL19iYXNlVW5hcnknKSxcbiAgICBjb21wYXJlTXVsdGlwbGUgPSByZXF1aXJlKCcuL19jb21wYXJlTXVsdGlwbGUnKSxcbiAgICBpZGVudGl0eSA9IHJlcXVpcmUoJy4vaWRlbnRpdHknKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5Jyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ub3JkZXJCeWAgd2l0aG91dCBwYXJhbSBndWFyZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb25bXXxPYmplY3RbXXxzdHJpbmdbXX0gaXRlcmF0ZWVzIFRoZSBpdGVyYXRlZXMgdG8gc29ydCBieS5cbiAqIEBwYXJhbSB7c3RyaW5nW119IG9yZGVycyBUaGUgc29ydCBvcmRlcnMgb2YgYGl0ZXJhdGVlc2AuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBzb3J0ZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGJhc2VPcmRlckJ5KGNvbGxlY3Rpb24sIGl0ZXJhdGVlcywgb3JkZXJzKSB7XG4gIGlmIChpdGVyYXRlZXMubGVuZ3RoKSB7XG4gICAgaXRlcmF0ZWVzID0gYXJyYXlNYXAoaXRlcmF0ZWVzLCBmdW5jdGlvbihpdGVyYXRlZSkge1xuICAgICAgaWYgKGlzQXJyYXkoaXRlcmF0ZWUpKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgIHJldHVybiBiYXNlR2V0KHZhbHVlLCBpdGVyYXRlZS5sZW5ndGggPT09IDEgPyBpdGVyYXRlZVswXSA6IGl0ZXJhdGVlKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpdGVyYXRlZTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBpdGVyYXRlZXMgPSBbaWRlbnRpdHldO1xuICB9XG5cbiAgdmFyIGluZGV4ID0gLTE7XG4gIGl0ZXJhdGVlcyA9IGFycmF5TWFwKGl0ZXJhdGVlcywgYmFzZVVuYXJ5KGJhc2VJdGVyYXRlZSkpO1xuXG4gIHZhciByZXN1bHQgPSBiYXNlTWFwKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHtcbiAgICB2YXIgY3JpdGVyaWEgPSBhcnJheU1hcChpdGVyYXRlZXMsIGZ1bmN0aW9uKGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gaXRlcmF0ZWUodmFsdWUpO1xuICAgIH0pO1xuICAgIHJldHVybiB7ICdjcml0ZXJpYSc6IGNyaXRlcmlhLCAnaW5kZXgnOiArK2luZGV4LCAndmFsdWUnOiB2YWx1ZSB9O1xuICB9KTtcblxuICByZXR1cm4gYmFzZVNvcnRCeShyZXN1bHQsIGZ1bmN0aW9uKG9iamVjdCwgb3RoZXIpIHtcbiAgICByZXR1cm4gY29tcGFyZU11bHRpcGxlKG9iamVjdCwgb3RoZXIsIG9yZGVycyk7XG4gIH0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VPcmRlckJ5O1xuIiwidmFyIGJhc2VQaWNrQnkgPSByZXF1aXJlKCcuL19iYXNlUGlja0J5JyksXG4gICAgaGFzSW4gPSByZXF1aXJlKCcuL2hhc0luJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucGlja2Agd2l0aG91dCBzdXBwb3J0IGZvciBpbmRpdmlkdWFsXG4gKiBwcm9wZXJ0eSBpZGVudGlmaWVycy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAqIEBwYXJhbSB7c3RyaW5nW119IHBhdGhzIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gYmFzZVBpY2sob2JqZWN0LCBwYXRocykge1xuICByZXR1cm4gYmFzZVBpY2tCeShvYmplY3QsIHBhdGhzLCBmdW5jdGlvbih2YWx1ZSwgcGF0aCkge1xuICAgIHJldHVybiBoYXNJbihvYmplY3QsIHBhdGgpO1xuICB9KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlUGljaztcbiIsInZhciBiYXNlR2V0ID0gcmVxdWlyZSgnLi9fYmFzZUdldCcpLFxuICAgIGJhc2VTZXQgPSByZXF1aXJlKCcuL19iYXNlU2V0JyksXG4gICAgY2FzdFBhdGggPSByZXF1aXJlKCcuL19jYXN0UGF0aCcpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mICBgXy5waWNrQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAqIEBwYXJhbSB7c3RyaW5nW119IHBhdGhzIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBwcm9wZXJ0eS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGJhc2VQaWNrQnkob2JqZWN0LCBwYXRocywgcHJlZGljYXRlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gcGF0aHMubGVuZ3RoLFxuICAgICAgcmVzdWx0ID0ge307XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgcGF0aCA9IHBhdGhzW2luZGV4XSxcbiAgICAgICAgdmFsdWUgPSBiYXNlR2V0KG9iamVjdCwgcGF0aCk7XG5cbiAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBwYXRoKSkge1xuICAgICAgYmFzZVNldChyZXN1bHQsIGNhc3RQYXRoKHBhdGgsIG9iamVjdCksIHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlUGlja0J5O1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5wcm9wZXJ0eWAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWVwIHBhdGhzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlUHJvcGVydHkoa2V5KSB7XG4gIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3Rba2V5XTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlUHJvcGVydHk7XG4iLCJ2YXIgYmFzZUdldCA9IHJlcXVpcmUoJy4vX2Jhc2VHZXQnKTtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VQcm9wZXJ0eWAgd2hpY2ggc3VwcG9ydHMgZGVlcCBwYXRocy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlUHJvcGVydHlEZWVwKHBhdGgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIHJldHVybiBiYXNlR2V0KG9iamVjdCwgcGF0aCk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVByb3BlcnR5RGVlcDtcbiIsIi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVDZWlsID0gTWF0aC5jZWlsLFxuICAgIG5hdGl2ZU1heCA9IE1hdGgubWF4O1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJhbmdlYCBhbmQgYF8ucmFuZ2VSaWdodGAgd2hpY2ggZG9lc24ndFxuICogY29lcmNlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuXG4gKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhlIHJhbmdlLlxuICogQHBhcmFtIHtudW1iZXJ9IHN0ZXAgVGhlIHZhbHVlIHRvIGluY3JlbWVudCBvciBkZWNyZW1lbnQgYnkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZ2Ugb2YgbnVtYmVycy5cbiAqL1xuZnVuY3Rpb24gYmFzZVJhbmdlKHN0YXJ0LCBlbmQsIHN0ZXAsIGZyb21SaWdodCkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IG5hdGl2ZU1heChuYXRpdmVDZWlsKChlbmQgLSBzdGFydCkgLyAoc3RlcCB8fCAxKSksIDApLFxuICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcblxuICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICByZXN1bHRbZnJvbVJpZ2h0ID8gbGVuZ3RoIDogKytpbmRleF0gPSBzdGFydDtcbiAgICBzdGFydCArPSBzdGVwO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVJhbmdlO1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yZWR1Y2VgIGFuZCBgXy5yZWR1Y2VSaWdodGAsIHdpdGhvdXQgc3VwcG9ydFxuICogZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMsIHdoaWNoIGl0ZXJhdGVzIG92ZXIgYGNvbGxlY3Rpb25gIHVzaW5nIGBlYWNoRnVuY2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0geyp9IGFjY3VtdWxhdG9yIFRoZSBpbml0aWFsIHZhbHVlLlxuICogQHBhcmFtIHtib29sZWFufSBpbml0QWNjdW0gU3BlY2lmeSB1c2luZyB0aGUgZmlyc3Qgb3IgbGFzdCBlbGVtZW50IG9mXG4gKiAgYGNvbGxlY3Rpb25gIGFzIHRoZSBpbml0aWFsIHZhbHVlLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZWFjaEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGl0ZXJhdGUgb3ZlciBgY29sbGVjdGlvbmAuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGJhc2VSZWR1Y2UoY29sbGVjdGlvbiwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0sIGVhY2hGdW5jKSB7XG4gIGVhY2hGdW5jKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikge1xuICAgIGFjY3VtdWxhdG9yID0gaW5pdEFjY3VtXG4gICAgICA/IChpbml0QWNjdW0gPSBmYWxzZSwgdmFsdWUpXG4gICAgICA6IGl0ZXJhdGVlKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pO1xuICB9KTtcbiAgcmV0dXJuIGFjY3VtdWxhdG9yO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VSZWR1Y2U7XG4iLCJ2YXIgaWRlbnRpdHkgPSByZXF1aXJlKCcuL2lkZW50aXR5JyksXG4gICAgb3ZlclJlc3QgPSByZXF1aXJlKCcuL19vdmVyUmVzdCcpLFxuICAgIHNldFRvU3RyaW5nID0gcmVxdWlyZSgnLi9fc2V0VG9TdHJpbmcnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yZXN0YCB3aGljaCBkb2Vzbid0IHZhbGlkYXRlIG9yIGNvZXJjZSBhcmd1bWVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFwcGx5IGEgcmVzdCBwYXJhbWV0ZXIgdG8uXG4gKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PWZ1bmMubGVuZ3RoLTFdIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcmVzdCBwYXJhbWV0ZXIuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gYmFzZVJlc3QoZnVuYywgc3RhcnQpIHtcbiAgcmV0dXJuIHNldFRvU3RyaW5nKG92ZXJSZXN0KGZ1bmMsIHN0YXJ0LCBpZGVudGl0eSksIGZ1bmMgKyAnJyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVJlc3Q7XG4iLCJ2YXIgYXNzaWduVmFsdWUgPSByZXF1aXJlKCcuL19hc3NpZ25WYWx1ZScpLFxuICAgIGNhc3RQYXRoID0gcmVxdWlyZSgnLi9fY2FzdFBhdGgnKSxcbiAgICBpc0luZGV4ID0gcmVxdWlyZSgnLi9faXNJbmRleCcpLFxuICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpLFxuICAgIHRvS2V5ID0gcmVxdWlyZSgnLi9fdG9LZXknKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zZXRgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIHBhdGggY3JlYXRpb24uXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICovXG5mdW5jdGlvbiBiYXNlU2V0KG9iamVjdCwgcGF0aCwgdmFsdWUsIGN1c3RvbWl6ZXIpIHtcbiAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfVxuICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcblxuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IHBhdGgubGVuZ3RoLFxuICAgICAgbGFzdEluZGV4ID0gbGVuZ3RoIC0gMSxcbiAgICAgIG5lc3RlZCA9IG9iamVjdDtcblxuICB3aGlsZSAobmVzdGVkICE9IG51bGwgJiYgKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBrZXkgPSB0b0tleShwYXRoW2luZGV4XSksXG4gICAgICAgIG5ld1ZhbHVlID0gdmFsdWU7XG5cbiAgICBpZiAoa2V5ID09PSAnX19wcm90b19fJyB8fCBrZXkgPT09ICdjb25zdHJ1Y3RvcicgfHwga2V5ID09PSAncHJvdG90eXBlJykge1xuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9XG5cbiAgICBpZiAoaW5kZXggIT0gbGFzdEluZGV4KSB7XG4gICAgICB2YXIgb2JqVmFsdWUgPSBuZXN0ZWRba2V5XTtcbiAgICAgIG5ld1ZhbHVlID0gY3VzdG9taXplciA/IGN1c3RvbWl6ZXIob2JqVmFsdWUsIGtleSwgbmVzdGVkKSA6IHVuZGVmaW5lZDtcbiAgICAgIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5ld1ZhbHVlID0gaXNPYmplY3Qob2JqVmFsdWUpXG4gICAgICAgICAgPyBvYmpWYWx1ZVxuICAgICAgICAgIDogKGlzSW5kZXgocGF0aFtpbmRleCArIDFdKSA/IFtdIDoge30pO1xuICAgICAgfVxuICAgIH1cbiAgICBhc3NpZ25WYWx1ZShuZXN0ZWQsIGtleSwgbmV3VmFsdWUpO1xuICAgIG5lc3RlZCA9IG5lc3RlZFtrZXldO1xuICB9XG4gIHJldHVybiBvYmplY3Q7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVNldDtcbiIsInZhciBjb25zdGFudCA9IHJlcXVpcmUoJy4vY29uc3RhbnQnKSxcbiAgICBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX2RlZmluZVByb3BlcnR5JyksXG4gICAgaWRlbnRpdHkgPSByZXF1aXJlKCcuL2lkZW50aXR5Jyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYHNldFRvU3RyaW5nYCB3aXRob3V0IHN1cHBvcnQgZm9yIGhvdCBsb29wIHNob3J0aW5nLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdHJpbmcgVGhlIGB0b1N0cmluZ2AgcmVzdWx0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBmdW5jYC5cbiAqL1xudmFyIGJhc2VTZXRUb1N0cmluZyA9ICFkZWZpbmVQcm9wZXJ0eSA/IGlkZW50aXR5IDogZnVuY3Rpb24oZnVuYywgc3RyaW5nKSB7XG4gIHJldHVybiBkZWZpbmVQcm9wZXJ0eShmdW5jLCAndG9TdHJpbmcnLCB7XG4gICAgJ2NvbmZpZ3VyYWJsZSc6IHRydWUsXG4gICAgJ2VudW1lcmFibGUnOiBmYWxzZSxcbiAgICAndmFsdWUnOiBjb25zdGFudChzdHJpbmcpLFxuICAgICd3cml0YWJsZSc6IHRydWVcbiAgfSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VTZXRUb1N0cmluZztcbiIsIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc29ydEJ5YCB3aGljaCB1c2VzIGBjb21wYXJlcmAgdG8gZGVmaW5lIHRoZVxuICogc29ydCBvcmRlciBvZiBgYXJyYXlgIGFuZCByZXBsYWNlcyBjcml0ZXJpYSBvYmplY3RzIHdpdGggdGhlaXIgY29ycmVzcG9uZGluZ1xuICogdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc29ydC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBhcmVyIFRoZSBmdW5jdGlvbiB0byBkZWZpbmUgc29ydCBvcmRlci5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICovXG5mdW5jdGlvbiBiYXNlU29ydEJ5KGFycmF5LCBjb21wYXJlcikge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gIGFycmF5LnNvcnQoY29tcGFyZXIpO1xuICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICBhcnJheVtsZW5ndGhdID0gYXJyYXlbbGVuZ3RoXS52YWx1ZTtcbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVNvcnRCeTtcbiIsIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udGltZXNgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kc1xuICogb3IgbWF4IGFycmF5IGxlbmd0aCBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gaW52b2tlIGBpdGVyYXRlZWAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiByZXN1bHRzLlxuICovXG5mdW5jdGlvbiBiYXNlVGltZXMobiwgaXRlcmF0ZWUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICByZXN1bHQgPSBBcnJheShuKTtcblxuICB3aGlsZSAoKytpbmRleCA8IG4pIHtcbiAgICByZXN1bHRbaW5kZXhdID0gaXRlcmF0ZWUoaW5kZXgpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVRpbWVzO1xuIiwidmFyIFN5bWJvbCA9IHJlcXVpcmUoJy4vX1N5bWJvbCcpLFxuICAgIGFycmF5TWFwID0gcmVxdWlyZSgnLi9fYXJyYXlNYXAnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNTeW1ib2wgPSByZXF1aXJlKCcuL2lzU3ltYm9sJyk7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIElORklOSVRZID0gMSAvIDA7XG5cbi8qKiBVc2VkIHRvIGNvbnZlcnQgc3ltYm9scyB0byBwcmltaXRpdmVzIGFuZCBzdHJpbmdzLiAqL1xudmFyIHN5bWJvbFByb3RvID0gU3ltYm9sID8gU3ltYm9sLnByb3RvdHlwZSA6IHVuZGVmaW5lZCxcbiAgICBzeW1ib2xUb1N0cmluZyA9IHN5bWJvbFByb3RvID8gc3ltYm9sUHJvdG8udG9TdHJpbmcgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udG9TdHJpbmdgIHdoaWNoIGRvZXNuJ3QgY29udmVydCBudWxsaXNoXG4gKiB2YWx1ZXMgdG8gZW1wdHkgc3RyaW5ncy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gYmFzZVRvU3RyaW5nKHZhbHVlKSB7XG4gIC8vIEV4aXQgZWFybHkgZm9yIHN0cmluZ3MgdG8gYXZvaWQgYSBwZXJmb3JtYW5jZSBoaXQgaW4gc29tZSBlbnZpcm9ubWVudHMuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgLy8gUmVjdXJzaXZlbHkgY29udmVydCB2YWx1ZXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICByZXR1cm4gYXJyYXlNYXAodmFsdWUsIGJhc2VUb1N0cmluZykgKyAnJztcbiAgfVxuICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgcmV0dXJuIHN5bWJvbFRvU3RyaW5nID8gc3ltYm9sVG9TdHJpbmcuY2FsbCh2YWx1ZSkgOiAnJztcbiAgfVxuICB2YXIgcmVzdWx0ID0gKHZhbHVlICsgJycpO1xuICByZXR1cm4gKHJlc3VsdCA9PSAnMCcgJiYgKDEgLyB2YWx1ZSkgPT0gLUlORklOSVRZKSA/ICctMCcgOiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVRvU3RyaW5nO1xuIiwidmFyIHRyaW1tZWRFbmRJbmRleCA9IHJlcXVpcmUoJy4vX3RyaW1tZWRFbmRJbmRleCcpO1xuXG4vKiogVXNlZCB0byBtYXRjaCBsZWFkaW5nIHdoaXRlc3BhY2UuICovXG52YXIgcmVUcmltU3RhcnQgPSAvXlxccysvO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnRyaW1gLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gdHJpbS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHRyaW1tZWQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBiYXNlVHJpbShzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZ1xuICAgID8gc3RyaW5nLnNsaWNlKDAsIHRyaW1tZWRFbmRJbmRleChzdHJpbmcpICsgMSkucmVwbGFjZShyZVRyaW1TdGFydCwgJycpXG4gICAgOiBzdHJpbmc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVRyaW07XG4iLCIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnVuYXJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yIHN0b3JpbmcgbWV0YWRhdGEuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNhcCBhcmd1bWVudHMgZm9yLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY2FwcGVkIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlVW5hcnkoZnVuYykge1xuICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gZnVuYyh2YWx1ZSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVVuYXJ5O1xuIiwidmFyIFNldENhY2hlID0gcmVxdWlyZSgnLi9fU2V0Q2FjaGUnKSxcbiAgICBhcnJheUluY2x1ZGVzID0gcmVxdWlyZSgnLi9fYXJyYXlJbmNsdWRlcycpLFxuICAgIGFycmF5SW5jbHVkZXNXaXRoID0gcmVxdWlyZSgnLi9fYXJyYXlJbmNsdWRlc1dpdGgnKSxcbiAgICBjYWNoZUhhcyA9IHJlcXVpcmUoJy4vX2NhY2hlSGFzJyksXG4gICAgY3JlYXRlU2V0ID0gcmVxdWlyZSgnLi9fY3JlYXRlU2V0JyksXG4gICAgc2V0VG9BcnJheSA9IHJlcXVpcmUoJy4vX3NldFRvQXJyYXknKTtcblxuLyoqIFVzZWQgYXMgdGhlIHNpemUgdG8gZW5hYmxlIGxhcmdlIGFycmF5IG9wdGltaXphdGlvbnMuICovXG52YXIgTEFSR0VfQVJSQVlfU0laRSA9IDIwMDtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy51bmlxQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYmFzZVVuaXEoYXJyYXksIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgaW5jbHVkZXMgPSBhcnJheUluY2x1ZGVzLFxuICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgaXNDb21tb24gPSB0cnVlLFxuICAgICAgcmVzdWx0ID0gW10sXG4gICAgICBzZWVuID0gcmVzdWx0O1xuXG4gIGlmIChjb21wYXJhdG9yKSB7XG4gICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICBpbmNsdWRlcyA9IGFycmF5SW5jbHVkZXNXaXRoO1xuICB9XG4gIGVsc2UgaWYgKGxlbmd0aCA+PSBMQVJHRV9BUlJBWV9TSVpFKSB7XG4gICAgdmFyIHNldCA9IGl0ZXJhdGVlID8gbnVsbCA6IGNyZWF0ZVNldChhcnJheSk7XG4gICAgaWYgKHNldCkge1xuICAgICAgcmV0dXJuIHNldFRvQXJyYXkoc2V0KTtcbiAgICB9XG4gICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICBpbmNsdWRlcyA9IGNhY2hlSGFzO1xuICAgIHNlZW4gPSBuZXcgU2V0Q2FjaGU7XG4gIH1cbiAgZWxzZSB7XG4gICAgc2VlbiA9IGl0ZXJhdGVlID8gW10gOiByZXN1bHQ7XG4gIH1cbiAgb3V0ZXI6XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlID8gaXRlcmF0ZWUodmFsdWUpIDogdmFsdWU7XG5cbiAgICB2YWx1ZSA9IChjb21wYXJhdG9yIHx8IHZhbHVlICE9PSAwKSA/IHZhbHVlIDogMDtcbiAgICBpZiAoaXNDb21tb24gJiYgY29tcHV0ZWQgPT09IGNvbXB1dGVkKSB7XG4gICAgICB2YXIgc2VlbkluZGV4ID0gc2Vlbi5sZW5ndGg7XG4gICAgICB3aGlsZSAoc2VlbkluZGV4LS0pIHtcbiAgICAgICAgaWYgKHNlZW5bc2VlbkluZGV4XSA9PT0gY29tcHV0ZWQpIHtcbiAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGl0ZXJhdGVlKSB7XG4gICAgICAgIHNlZW4ucHVzaChjb21wdXRlZCk7XG4gICAgICB9XG4gICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKCFpbmNsdWRlcyhzZWVuLCBjb21wdXRlZCwgY29tcGFyYXRvcikpIHtcbiAgICAgIGlmIChzZWVuICE9PSByZXN1bHQpIHtcbiAgICAgICAgc2Vlbi5wdXNoKGNvbXB1dGVkKTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlVW5pcTtcbiIsInZhciBhcnJheU1hcCA9IHJlcXVpcmUoJy4vX2FycmF5TWFwJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udmFsdWVzYCBhbmQgYF8udmFsdWVzSW5gIHdoaWNoIGNyZWF0ZXMgYW5cbiAqIGFycmF5IG9mIGBvYmplY3RgIHByb3BlcnR5IHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm9wZXJ0eSBuYW1lc1xuICogb2YgYHByb3BzYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IG5hbWVzIHRvIGdldCB2YWx1ZXMgZm9yLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBiYXNlVmFsdWVzKG9iamVjdCwgcHJvcHMpIHtcbiAgcmV0dXJuIGFycmF5TWFwKHByb3BzLCBmdW5jdGlvbihrZXkpIHtcbiAgICByZXR1cm4gb2JqZWN0W2tleV07XG4gIH0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VWYWx1ZXM7XG4iLCIvKipcbiAqIFRoaXMgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy56aXBPYmplY3RgIHdoaWNoIGFzc2lnbnMgdmFsdWVzIHVzaW5nIGBhc3NpZ25GdW5jYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IGlkZW50aWZpZXJzLlxuICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSBwcm9wZXJ0eSB2YWx1ZXMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBhc3NpZ25GdW5jIFRoZSBmdW5jdGlvbiB0byBhc3NpZ24gdmFsdWVzLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gYmFzZVppcE9iamVjdChwcm9wcywgdmFsdWVzLCBhc3NpZ25GdW5jKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoLFxuICAgICAgdmFsc0xlbmd0aCA9IHZhbHVlcy5sZW5ndGgsXG4gICAgICByZXN1bHQgPSB7fTtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciB2YWx1ZSA9IGluZGV4IDwgdmFsc0xlbmd0aCA/IHZhbHVlc1tpbmRleF0gOiB1bmRlZmluZWQ7XG4gICAgYXNzaWduRnVuYyhyZXN1bHQsIHByb3BzW2luZGV4XSwgdmFsdWUpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVppcE9iamVjdDtcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGEgYGNhY2hlYCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gY2FjaGUgVGhlIGNhY2hlIHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGNhY2hlSGFzKGNhY2hlLCBrZXkpIHtcbiAgcmV0dXJuIGNhY2hlLmhhcyhrZXkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNhY2hlSGFzO1xuIiwidmFyIGlkZW50aXR5ID0gcmVxdWlyZSgnLi9pZGVudGl0eScpO1xuXG4vKipcbiAqIENhc3RzIGB2YWx1ZWAgdG8gYGlkZW50aXR5YCBpZiBpdCdzIG5vdCBhIGZ1bmN0aW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGNhc3QgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNhc3RGdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdmdW5jdGlvbicgPyB2YWx1ZSA6IGlkZW50aXR5O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNhc3RGdW5jdGlvbjtcbiIsInZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNLZXkgPSByZXF1aXJlKCcuL19pc0tleScpLFxuICAgIHN0cmluZ1RvUGF0aCA9IHJlcXVpcmUoJy4vX3N0cmluZ1RvUGF0aCcpLFxuICAgIHRvU3RyaW5nID0gcmVxdWlyZSgnLi90b1N0cmluZycpO1xuXG4vKipcbiAqIENhc3RzIGB2YWx1ZWAgdG8gYSBwYXRoIGFycmF5IGlmIGl0J3Mgbm90IG9uZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5IGtleXMgb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNhc3QgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gY2FzdFBhdGgodmFsdWUsIG9iamVjdCkge1xuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIGlzS2V5KHZhbHVlLCBvYmplY3QpID8gW3ZhbHVlXSA6IHN0cmluZ1RvUGF0aCh0b1N0cmluZyh2YWx1ZSkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNhc3RQYXRoO1xuIiwidmFyIFVpbnQ4QXJyYXkgPSByZXF1aXJlKCcuL19VaW50OEFycmF5Jyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNsb25lIG9mIGBhcnJheUJ1ZmZlcmAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXlCdWZmZXJ9IGFycmF5QnVmZmVyIFRoZSBhcnJheSBidWZmZXIgdG8gY2xvbmUuXG4gKiBAcmV0dXJucyB7QXJyYXlCdWZmZXJ9IFJldHVybnMgdGhlIGNsb25lZCBhcnJheSBidWZmZXIuXG4gKi9cbmZ1bmN0aW9uIGNsb25lQXJyYXlCdWZmZXIoYXJyYXlCdWZmZXIpIHtcbiAgdmFyIHJlc3VsdCA9IG5ldyBhcnJheUJ1ZmZlci5jb25zdHJ1Y3RvcihhcnJheUJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgbmV3IFVpbnQ4QXJyYXkocmVzdWx0KS5zZXQobmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjbG9uZUFycmF5QnVmZmVyO1xuIiwidmFyIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZXhwb3J0c2AuICovXG52YXIgZnJlZUV4cG9ydHMgPSB0eXBlb2YgZXhwb3J0cyA9PSAnb2JqZWN0JyAmJiBleHBvcnRzICYmICFleHBvcnRzLm5vZGVUeXBlICYmIGV4cG9ydHM7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgbW9kdWxlYC4gKi9cbnZhciBmcmVlTW9kdWxlID0gZnJlZUV4cG9ydHMgJiYgdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUgJiYgIW1vZHVsZS5ub2RlVHlwZSAmJiBtb2R1bGU7XG5cbi8qKiBEZXRlY3QgdGhlIHBvcHVsYXIgQ29tbW9uSlMgZXh0ZW5zaW9uIGBtb2R1bGUuZXhwb3J0c2AuICovXG52YXIgbW9kdWxlRXhwb3J0cyA9IGZyZWVNb2R1bGUgJiYgZnJlZU1vZHVsZS5leHBvcnRzID09PSBmcmVlRXhwb3J0cztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgQnVmZmVyID0gbW9kdWxlRXhwb3J0cyA/IHJvb3QuQnVmZmVyIDogdW5kZWZpbmVkLFxuICAgIGFsbG9jVW5zYWZlID0gQnVmZmVyID8gQnVmZmVyLmFsbG9jVW5zYWZlIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjbG9uZSBvZiAgYGJ1ZmZlcmAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QnVmZmVyfSBidWZmZXIgVGhlIGJ1ZmZlciB0byBjbG9uZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRGVlcF0gU3BlY2lmeSBhIGRlZXAgY2xvbmUuXG4gKiBAcmV0dXJucyB7QnVmZmVyfSBSZXR1cm5zIHRoZSBjbG9uZWQgYnVmZmVyLlxuICovXG5mdW5jdGlvbiBjbG9uZUJ1ZmZlcihidWZmZXIsIGlzRGVlcCkge1xuICBpZiAoaXNEZWVwKSB7XG4gICAgcmV0dXJuIGJ1ZmZlci5zbGljZSgpO1xuICB9XG4gIHZhciBsZW5ndGggPSBidWZmZXIubGVuZ3RoLFxuICAgICAgcmVzdWx0ID0gYWxsb2NVbnNhZmUgPyBhbGxvY1Vuc2FmZShsZW5ndGgpIDogbmV3IGJ1ZmZlci5jb25zdHJ1Y3RvcihsZW5ndGgpO1xuXG4gIGJ1ZmZlci5jb3B5KHJlc3VsdCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2xvbmVCdWZmZXI7XG4iLCJ2YXIgY2xvbmVBcnJheUJ1ZmZlciA9IHJlcXVpcmUoJy4vX2Nsb25lQXJyYXlCdWZmZXInKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgY2xvbmUgb2YgYGRhdGFWaWV3YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGRhdGFWaWV3IFRoZSBkYXRhIHZpZXcgdG8gY2xvbmUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIGRhdGEgdmlldy5cbiAqL1xuZnVuY3Rpb24gY2xvbmVEYXRhVmlldyhkYXRhVmlldywgaXNEZWVwKSB7XG4gIHZhciBidWZmZXIgPSBpc0RlZXAgPyBjbG9uZUFycmF5QnVmZmVyKGRhdGFWaWV3LmJ1ZmZlcikgOiBkYXRhVmlldy5idWZmZXI7XG4gIHJldHVybiBuZXcgZGF0YVZpZXcuY29uc3RydWN0b3IoYnVmZmVyLCBkYXRhVmlldy5ieXRlT2Zmc2V0LCBkYXRhVmlldy5ieXRlTGVuZ3RoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjbG9uZURhdGFWaWV3O1xuIiwiLyoqIFVzZWQgdG8gbWF0Y2ggYFJlZ0V4cGAgZmxhZ3MgZnJvbSB0aGVpciBjb2VyY2VkIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVGbGFncyA9IC9cXHcqJC87XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNsb25lIG9mIGByZWdleHBgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gcmVnZXhwIFRoZSByZWdleHAgdG8gY2xvbmUuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgcmVnZXhwLlxuICovXG5mdW5jdGlvbiBjbG9uZVJlZ0V4cChyZWdleHApIHtcbiAgdmFyIHJlc3VsdCA9IG5ldyByZWdleHAuY29uc3RydWN0b3IocmVnZXhwLnNvdXJjZSwgcmVGbGFncy5leGVjKHJlZ2V4cCkpO1xuICByZXN1bHQubGFzdEluZGV4ID0gcmVnZXhwLmxhc3RJbmRleDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjbG9uZVJlZ0V4cDtcbiIsInZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19TeW1ib2wnKTtcblxuLyoqIFVzZWQgdG8gY29udmVydCBzeW1ib2xzIHRvIHByaW1pdGl2ZXMgYW5kIHN0cmluZ3MuICovXG52YXIgc3ltYm9sUHJvdG8gPSBTeW1ib2wgPyBTeW1ib2wucHJvdG90eXBlIDogdW5kZWZpbmVkLFxuICAgIHN5bWJvbFZhbHVlT2YgPSBzeW1ib2xQcm90byA/IHN5bWJvbFByb3RvLnZhbHVlT2YgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNsb25lIG9mIHRoZSBgc3ltYm9sYCBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzeW1ib2wgVGhlIHN5bWJvbCBvYmplY3QgdG8gY2xvbmUuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgc3ltYm9sIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gY2xvbmVTeW1ib2woc3ltYm9sKSB7XG4gIHJldHVybiBzeW1ib2xWYWx1ZU9mID8gT2JqZWN0KHN5bWJvbFZhbHVlT2YuY2FsbChzeW1ib2wpKSA6IHt9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNsb25lU3ltYm9sO1xuIiwidmFyIGNsb25lQXJyYXlCdWZmZXIgPSByZXF1aXJlKCcuL19jbG9uZUFycmF5QnVmZmVyJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNsb25lIG9mIGB0eXBlZEFycmF5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHR5cGVkQXJyYXkgVGhlIHR5cGVkIGFycmF5IHRvIGNsb25lLlxuICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCB0eXBlZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gY2xvbmVUeXBlZEFycmF5KHR5cGVkQXJyYXksIGlzRGVlcCkge1xuICB2YXIgYnVmZmVyID0gaXNEZWVwID8gY2xvbmVBcnJheUJ1ZmZlcih0eXBlZEFycmF5LmJ1ZmZlcikgOiB0eXBlZEFycmF5LmJ1ZmZlcjtcbiAgcmV0dXJuIG5ldyB0eXBlZEFycmF5LmNvbnN0cnVjdG9yKGJ1ZmZlciwgdHlwZWRBcnJheS5ieXRlT2Zmc2V0LCB0eXBlZEFycmF5Lmxlbmd0aCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2xvbmVUeXBlZEFycmF5O1xuIiwidmFyIGlzU3ltYm9sID0gcmVxdWlyZSgnLi9pc1N5bWJvbCcpO1xuXG4vKipcbiAqIENvbXBhcmVzIHZhbHVlcyB0byBzb3J0IHRoZW0gaW4gYXNjZW5kaW5nIG9yZGVyLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHNvcnQgb3JkZXIgaW5kaWNhdG9yIGZvciBgdmFsdWVgLlxuICovXG5mdW5jdGlvbiBjb21wYXJlQXNjZW5kaW5nKHZhbHVlLCBvdGhlcikge1xuICBpZiAodmFsdWUgIT09IG90aGVyKSB7XG4gICAgdmFyIHZhbElzRGVmaW5lZCA9IHZhbHVlICE9PSB1bmRlZmluZWQsXG4gICAgICAgIHZhbElzTnVsbCA9IHZhbHVlID09PSBudWxsLFxuICAgICAgICB2YWxJc1JlZmxleGl2ZSA9IHZhbHVlID09PSB2YWx1ZSxcbiAgICAgICAgdmFsSXNTeW1ib2wgPSBpc1N5bWJvbCh2YWx1ZSk7XG5cbiAgICB2YXIgb3RoSXNEZWZpbmVkID0gb3RoZXIgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgb3RoSXNOdWxsID0gb3RoZXIgPT09IG51bGwsXG4gICAgICAgIG90aElzUmVmbGV4aXZlID0gb3RoZXIgPT09IG90aGVyLFxuICAgICAgICBvdGhJc1N5bWJvbCA9IGlzU3ltYm9sKG90aGVyKTtcblxuICAgIGlmICgoIW90aElzTnVsbCAmJiAhb3RoSXNTeW1ib2wgJiYgIXZhbElzU3ltYm9sICYmIHZhbHVlID4gb3RoZXIpIHx8XG4gICAgICAgICh2YWxJc1N5bWJvbCAmJiBvdGhJc0RlZmluZWQgJiYgb3RoSXNSZWZsZXhpdmUgJiYgIW90aElzTnVsbCAmJiAhb3RoSXNTeW1ib2wpIHx8XG4gICAgICAgICh2YWxJc051bGwgJiYgb3RoSXNEZWZpbmVkICYmIG90aElzUmVmbGV4aXZlKSB8fFxuICAgICAgICAoIXZhbElzRGVmaW5lZCAmJiBvdGhJc1JlZmxleGl2ZSkgfHxcbiAgICAgICAgIXZhbElzUmVmbGV4aXZlKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgaWYgKCghdmFsSXNOdWxsICYmICF2YWxJc1N5bWJvbCAmJiAhb3RoSXNTeW1ib2wgJiYgdmFsdWUgPCBvdGhlcikgfHxcbiAgICAgICAgKG90aElzU3ltYm9sICYmIHZhbElzRGVmaW5lZCAmJiB2YWxJc1JlZmxleGl2ZSAmJiAhdmFsSXNOdWxsICYmICF2YWxJc1N5bWJvbCkgfHxcbiAgICAgICAgKG90aElzTnVsbCAmJiB2YWxJc0RlZmluZWQgJiYgdmFsSXNSZWZsZXhpdmUpIHx8XG4gICAgICAgICghb3RoSXNEZWZpbmVkICYmIHZhbElzUmVmbGV4aXZlKSB8fFxuICAgICAgICAhb3RoSXNSZWZsZXhpdmUpIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29tcGFyZUFzY2VuZGluZztcbiIsInZhciBjb21wYXJlQXNjZW5kaW5nID0gcmVxdWlyZSgnLi9fY29tcGFyZUFzY2VuZGluZycpO1xuXG4vKipcbiAqIFVzZWQgYnkgYF8ub3JkZXJCeWAgdG8gY29tcGFyZSBtdWx0aXBsZSBwcm9wZXJ0aWVzIG9mIGEgdmFsdWUgdG8gYW5vdGhlclxuICogYW5kIHN0YWJsZSBzb3J0IHRoZW0uXG4gKlxuICogSWYgYG9yZGVyc2AgaXMgdW5zcGVjaWZpZWQsIGFsbCB2YWx1ZXMgYXJlIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIuIE90aGVyd2lzZSxcbiAqIHNwZWNpZnkgYW4gb3JkZXIgb2YgXCJkZXNjXCIgZm9yIGRlc2NlbmRpbmcgb3IgXCJhc2NcIiBmb3IgYXNjZW5kaW5nIHNvcnQgb3JkZXJcbiAqIG9mIGNvcnJlc3BvbmRpbmcgdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge2Jvb2xlYW5bXXxzdHJpbmdbXX0gb3JkZXJzIFRoZSBvcmRlciB0byBzb3J0IGJ5IGZvciBlYWNoIHByb3BlcnR5LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc29ydCBvcmRlciBpbmRpY2F0b3IgZm9yIGBvYmplY3RgLlxuICovXG5mdW5jdGlvbiBjb21wYXJlTXVsdGlwbGUob2JqZWN0LCBvdGhlciwgb3JkZXJzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgb2JqQ3JpdGVyaWEgPSBvYmplY3QuY3JpdGVyaWEsXG4gICAgICBvdGhDcml0ZXJpYSA9IG90aGVyLmNyaXRlcmlhLFxuICAgICAgbGVuZ3RoID0gb2JqQ3JpdGVyaWEubGVuZ3RoLFxuICAgICAgb3JkZXJzTGVuZ3RoID0gb3JkZXJzLmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciByZXN1bHQgPSBjb21wYXJlQXNjZW5kaW5nKG9iakNyaXRlcmlhW2luZGV4XSwgb3RoQ3JpdGVyaWFbaW5kZXhdKTtcbiAgICBpZiAocmVzdWx0KSB7XG4gICAgICBpZiAoaW5kZXggPj0gb3JkZXJzTGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICB2YXIgb3JkZXIgPSBvcmRlcnNbaW5kZXhdO1xuICAgICAgcmV0dXJuIHJlc3VsdCAqIChvcmRlciA9PSAnZGVzYycgPyAtMSA6IDEpO1xuICAgIH1cbiAgfVxuICAvLyBGaXhlcyBhbiBgQXJyYXkjc29ydGAgYnVnIGluIHRoZSBKUyBlbmdpbmUgZW1iZWRkZWQgaW4gQWRvYmUgYXBwbGljYXRpb25zXG4gIC8vIHRoYXQgY2F1c2VzIGl0LCB1bmRlciBjZXJ0YWluIGNpcmN1bXN0YW5jZXMsIHRvIHByb3ZpZGUgdGhlIHNhbWUgdmFsdWUgZm9yXG4gIC8vIGBvYmplY3RgIGFuZCBgb3RoZXJgLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2phc2hrZW5hcy91bmRlcnNjb3JlL3B1bGwvMTI0N1xuICAvLyBmb3IgbW9yZSBkZXRhaWxzLlxuICAvL1xuICAvLyBUaGlzIGFsc28gZW5zdXJlcyBhIHN0YWJsZSBzb3J0IGluIFY4IGFuZCBvdGhlciBlbmdpbmVzLlxuICAvLyBTZWUgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9OTAgZm9yIG1vcmUgZGV0YWlscy5cbiAgcmV0dXJuIG9iamVjdC5pbmRleCAtIG90aGVyLmluZGV4O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbXBhcmVNdWx0aXBsZTtcbiIsIi8qKlxuICogQ29waWVzIHRoZSB2YWx1ZXMgb2YgYHNvdXJjZWAgdG8gYGFycmF5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gc291cmNlIFRoZSBhcnJheSB0byBjb3B5IHZhbHVlcyBmcm9tLlxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5PVtdXSBUaGUgYXJyYXkgdG8gY29weSB2YWx1ZXMgdG8uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAqL1xuZnVuY3Rpb24gY29weUFycmF5KHNvdXJjZSwgYXJyYXkpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBzb3VyY2UubGVuZ3RoO1xuXG4gIGFycmF5IHx8IChhcnJheSA9IEFycmF5KGxlbmd0aCkpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGFycmF5W2luZGV4XSA9IHNvdXJjZVtpbmRleF07XG4gIH1cbiAgcmV0dXJuIGFycmF5O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvcHlBcnJheTtcbiIsInZhciBhc3NpZ25WYWx1ZSA9IHJlcXVpcmUoJy4vX2Fzc2lnblZhbHVlJyksXG4gICAgYmFzZUFzc2lnblZhbHVlID0gcmVxdWlyZSgnLi9fYmFzZUFzc2lnblZhbHVlJyk7XG5cbi8qKlxuICogQ29waWVzIHByb3BlcnRpZXMgb2YgYHNvdXJjZWAgdG8gYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgZnJvbS5cbiAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBpZGVudGlmaWVycyB0byBjb3B5LlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3Q9e31dIFRoZSBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIHRvLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29waWVkIHZhbHVlcy5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGNvcHlPYmplY3Qoc291cmNlLCBwcm9wcywgb2JqZWN0LCBjdXN0b21pemVyKSB7XG4gIHZhciBpc05ldyA9ICFvYmplY3Q7XG4gIG9iamVjdCB8fCAob2JqZWN0ID0ge30pO1xuXG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGtleSA9IHByb3BzW2luZGV4XTtcblxuICAgIHZhciBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXJcbiAgICAgID8gY3VzdG9taXplcihvYmplY3Rba2V5XSwgc291cmNlW2tleV0sIGtleSwgb2JqZWN0LCBzb3VyY2UpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBuZXdWYWx1ZSA9IHNvdXJjZVtrZXldO1xuICAgIH1cbiAgICBpZiAoaXNOZXcpIHtcbiAgICAgIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb2JqZWN0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvcHlPYmplY3Q7XG4iLCJ2YXIgY29weU9iamVjdCA9IHJlcXVpcmUoJy4vX2NvcHlPYmplY3QnKSxcbiAgICBnZXRTeW1ib2xzID0gcmVxdWlyZSgnLi9fZ2V0U3ltYm9scycpO1xuXG4vKipcbiAqIENvcGllcyBvd24gc3ltYm9scyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyBmcm9tLlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3Q9e31dIFRoZSBvYmplY3QgdG8gY29weSBzeW1ib2xzIHRvLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gY29weVN5bWJvbHMoc291cmNlLCBvYmplY3QpIHtcbiAgcmV0dXJuIGNvcHlPYmplY3Qoc291cmNlLCBnZXRTeW1ib2xzKHNvdXJjZSksIG9iamVjdCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29weVN5bWJvbHM7XG4iLCJ2YXIgY29weU9iamVjdCA9IHJlcXVpcmUoJy4vX2NvcHlPYmplY3QnKSxcbiAgICBnZXRTeW1ib2xzSW4gPSByZXF1aXJlKCcuL19nZXRTeW1ib2xzSW4nKTtcblxuLyoqXG4gKiBDb3BpZXMgb3duIGFuZCBpbmhlcml0ZWQgc3ltYm9scyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyBmcm9tLlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3Q9e31dIFRoZSBvYmplY3QgdG8gY29weSBzeW1ib2xzIHRvLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gY29weVN5bWJvbHNJbihzb3VyY2UsIG9iamVjdCkge1xuICByZXR1cm4gY29weU9iamVjdChzb3VyY2UsIGdldFN5bWJvbHNJbihzb3VyY2UpLCBvYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvcHlTeW1ib2xzSW47XG4iLCJ2YXIgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG92ZXJyZWFjaGluZyBjb3JlLWpzIHNoaW1zLiAqL1xudmFyIGNvcmVKc0RhdGEgPSByb290WydfX2NvcmUtanNfc2hhcmVkX18nXTtcblxubW9kdWxlLmV4cG9ydHMgPSBjb3JlSnNEYXRhO1xuIiwidmFyIGJhc2VSZXN0ID0gcmVxdWlyZSgnLi9fYmFzZVJlc3QnKSxcbiAgICBpc0l0ZXJhdGVlQ2FsbCA9IHJlcXVpcmUoJy4vX2lzSXRlcmF0ZWVDYWxsJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uYXNzaWduYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gYXNzaWduZXIgVGhlIGZ1bmN0aW9uIHRvIGFzc2lnbiB2YWx1ZXMuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhc3NpZ25lciBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQXNzaWduZXIoYXNzaWduZXIpIHtcbiAgcmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCwgc291cmNlcykge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBzb3VyY2VzLmxlbmd0aCxcbiAgICAgICAgY3VzdG9taXplciA9IGxlbmd0aCA+IDEgPyBzb3VyY2VzW2xlbmd0aCAtIDFdIDogdW5kZWZpbmVkLFxuICAgICAgICBndWFyZCA9IGxlbmd0aCA+IDIgPyBzb3VyY2VzWzJdIDogdW5kZWZpbmVkO1xuXG4gICAgY3VzdG9taXplciA9IChhc3NpZ25lci5sZW5ndGggPiAzICYmIHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicpXG4gICAgICA/IChsZW5ndGgtLSwgY3VzdG9taXplcilcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKGd1YXJkICYmIGlzSXRlcmF0ZWVDYWxsKHNvdXJjZXNbMF0sIHNvdXJjZXNbMV0sIGd1YXJkKSkge1xuICAgICAgY3VzdG9taXplciA9IGxlbmd0aCA8IDMgPyB1bmRlZmluZWQgOiBjdXN0b21pemVyO1xuICAgICAgbGVuZ3RoID0gMTtcbiAgICB9XG4gICAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7XG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIHZhciBzb3VyY2UgPSBzb3VyY2VzW2luZGV4XTtcbiAgICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgYXNzaWduZXIob2JqZWN0LCBzb3VyY2UsIGluZGV4LCBjdXN0b21pemVyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlQXNzaWduZXI7XG4iLCJ2YXIgaXNBcnJheUxpa2UgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGBiYXNlRWFjaGAgb3IgYGJhc2VFYWNoUmlnaHRgIGZ1bmN0aW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlYWNoRnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGEgY29sbGVjdGlvbi5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYmFzZSBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQmFzZUVhY2goZWFjaEZ1bmMsIGZyb21SaWdodCkge1xuICByZXR1cm4gZnVuY3Rpb24oY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gY29sbGVjdGlvbjtcbiAgICB9XG4gICAgaWYgKCFpc0FycmF5TGlrZShjb2xsZWN0aW9uKSkge1xuICAgICAgcmV0dXJuIGVhY2hGdW5jKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKTtcbiAgICB9XG4gICAgdmFyIGxlbmd0aCA9IGNvbGxlY3Rpb24ubGVuZ3RoLFxuICAgICAgICBpbmRleCA9IGZyb21SaWdodCA/IGxlbmd0aCA6IC0xLFxuICAgICAgICBpdGVyYWJsZSA9IE9iamVjdChjb2xsZWN0aW9uKTtcblxuICAgIHdoaWxlICgoZnJvbVJpZ2h0ID8gaW5kZXgtLSA6ICsraW5kZXggPCBsZW5ndGgpKSB7XG4gICAgICBpZiAoaXRlcmF0ZWUoaXRlcmFibGVbaW5kZXhdLCBpbmRleCwgaXRlcmFibGUpID09PSBmYWxzZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvbGxlY3Rpb247XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlQmFzZUVhY2g7XG4iLCIvKipcbiAqIENyZWF0ZXMgYSBiYXNlIGZ1bmN0aW9uIGZvciBtZXRob2RzIGxpa2UgYF8uZm9ySW5gIGFuZCBgXy5mb3JPd25gLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJhc2UgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUJhc2VGb3IoZnJvbVJpZ2h0KSB7XG4gIHJldHVybiBmdW5jdGlvbihvYmplY3QsIGl0ZXJhdGVlLCBrZXlzRnVuYykge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBpdGVyYWJsZSA9IE9iamVjdChvYmplY3QpLFxuICAgICAgICBwcm9wcyA9IGtleXNGdW5jKG9iamVjdCksXG4gICAgICAgIGxlbmd0aCA9IHByb3BzLmxlbmd0aDtcblxuICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgdmFyIGtleSA9IHByb3BzW2Zyb21SaWdodCA/IGxlbmd0aCA6ICsraW5kZXhdO1xuICAgICAgaWYgKGl0ZXJhdGVlKGl0ZXJhYmxlW2tleV0sIGtleSwgaXRlcmFibGUpID09PSBmYWxzZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVCYXNlRm9yO1xuIiwidmFyIGJhc2VJdGVyYXRlZSA9IHJlcXVpcmUoJy4vX2Jhc2VJdGVyYXRlZScpLFxuICAgIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZScpLFxuICAgIGtleXMgPSByZXF1aXJlKCcuL2tleXMnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgYF8uZmluZGAgb3IgYF8uZmluZExhc3RgIGZ1bmN0aW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmaW5kSW5kZXhGdW5jIFRoZSBmdW5jdGlvbiB0byBmaW5kIHRoZSBjb2xsZWN0aW9uIGluZGV4LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZmluZCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlRmluZChmaW5kSW5kZXhGdW5jKSB7XG4gIHJldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGZyb21JbmRleCkge1xuICAgIHZhciBpdGVyYWJsZSA9IE9iamVjdChjb2xsZWN0aW9uKTtcbiAgICBpZiAoIWlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKSB7XG4gICAgICB2YXIgaXRlcmF0ZWUgPSBiYXNlSXRlcmF0ZWUocHJlZGljYXRlLCAzKTtcbiAgICAgIGNvbGxlY3Rpb24gPSBrZXlzKGNvbGxlY3Rpb24pO1xuICAgICAgcHJlZGljYXRlID0gZnVuY3Rpb24oa2V5KSB7IHJldHVybiBpdGVyYXRlZShpdGVyYWJsZVtrZXldLCBrZXksIGl0ZXJhYmxlKTsgfTtcbiAgICB9XG4gICAgdmFyIGluZGV4ID0gZmluZEluZGV4RnVuYyhjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGZyb21JbmRleCk7XG4gICAgcmV0dXJuIGluZGV4ID4gLTEgPyBpdGVyYWJsZVtpdGVyYXRlZSA/IGNvbGxlY3Rpb25baW5kZXhdIDogaW5kZXhdIDogdW5kZWZpbmVkO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZUZpbmQ7XG4iLCJ2YXIgYmFzZVJhbmdlID0gcmVxdWlyZSgnLi9fYmFzZVJhbmdlJyksXG4gICAgaXNJdGVyYXRlZUNhbGwgPSByZXF1aXJlKCcuL19pc0l0ZXJhdGVlQ2FsbCcpLFxuICAgIHRvRmluaXRlID0gcmVxdWlyZSgnLi90b0Zpbml0ZScpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBgXy5yYW5nZWAgb3IgYF8ucmFuZ2VSaWdodGAgZnVuY3Rpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcmFuZ2UgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVJhbmdlKGZyb21SaWdodCkge1xuICByZXR1cm4gZnVuY3Rpb24oc3RhcnQsIGVuZCwgc3RlcCkge1xuICAgIGlmIChzdGVwICYmIHR5cGVvZiBzdGVwICE9ICdudW1iZXInICYmIGlzSXRlcmF0ZWVDYWxsKHN0YXJ0LCBlbmQsIHN0ZXApKSB7XG4gICAgICBlbmQgPSBzdGVwID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvLyBFbnN1cmUgdGhlIHNpZ24gb2YgYC0wYCBpcyBwcmVzZXJ2ZWQuXG4gICAgc3RhcnQgPSB0b0Zpbml0ZShzdGFydCk7XG4gICAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbmQgPSBzdGFydDtcbiAgICAgIHN0YXJ0ID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgZW5kID0gdG9GaW5pdGUoZW5kKTtcbiAgICB9XG4gICAgc3RlcCA9IHN0ZXAgPT09IHVuZGVmaW5lZCA/IChzdGFydCA8IGVuZCA/IDEgOiAtMSkgOiB0b0Zpbml0ZShzdGVwKTtcbiAgICByZXR1cm4gYmFzZVJhbmdlKHN0YXJ0LCBlbmQsIHN0ZXAsIGZyb21SaWdodCk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlUmFuZ2U7XG4iLCJ2YXIgU2V0ID0gcmVxdWlyZSgnLi9fU2V0JyksXG4gICAgbm9vcCA9IHJlcXVpcmUoJy4vbm9vcCcpLFxuICAgIHNldFRvQXJyYXkgPSByZXF1aXJlKCcuL19zZXRUb0FycmF5Jyk7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIElORklOSVRZID0gMSAvIDA7XG5cbi8qKlxuICogQ3JlYXRlcyBhIHNldCBvYmplY3Qgb2YgYHZhbHVlc2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIGFkZCB0byB0aGUgc2V0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IHNldC5cbiAqL1xudmFyIGNyZWF0ZVNldCA9ICEoU2V0ICYmICgxIC8gc2V0VG9BcnJheShuZXcgU2V0KFssLTBdKSlbMV0pID09IElORklOSVRZKSA/IG5vb3AgOiBmdW5jdGlvbih2YWx1ZXMpIHtcbiAgcmV0dXJuIG5ldyBTZXQodmFsdWVzKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlU2V0O1xuIiwidmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJy4vX2dldE5hdGl2ZScpO1xuXG52YXIgZGVmaW5lUHJvcGVydHkgPSAoZnVuY3Rpb24oKSB7XG4gIHRyeSB7XG4gICAgdmFyIGZ1bmMgPSBnZXROYXRpdmUoT2JqZWN0LCAnZGVmaW5lUHJvcGVydHknKTtcbiAgICBmdW5jKHt9LCAnJywge30pO1xuICAgIHJldHVybiBmdW5jO1xuICB9IGNhdGNoIChlKSB7fVxufSgpKTtcblxubW9kdWxlLmV4cG9ydHMgPSBkZWZpbmVQcm9wZXJ0eTtcbiIsInZhciBTZXRDYWNoZSA9IHJlcXVpcmUoJy4vX1NldENhY2hlJyksXG4gICAgYXJyYXlTb21lID0gcmVxdWlyZSgnLi9fYXJyYXlTb21lJyksXG4gICAgY2FjaGVIYXMgPSByZXF1aXJlKCcuL19jYWNoZUhhcycpO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciB2YWx1ZSBjb21wYXJpc29ucy4gKi9cbnZhciBDT01QQVJFX1BBUlRJQUxfRkxBRyA9IDEsXG4gICAgQ09NUEFSRV9VTk9SREVSRURfRkxBRyA9IDI7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbERlZXBgIGZvciBhcnJheXMgd2l0aCBzdXBwb3J0IGZvclxuICogcGFydGlhbCBkZWVwIGNvbXBhcmlzb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7QXJyYXl9IG90aGVyIFRoZSBvdGhlciBhcnJheSB0byBjb21wYXJlLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhY2sgVHJhY2tzIHRyYXZlcnNlZCBgYXJyYXlgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGFycmF5cyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBlcXVhbEFycmF5cyhhcnJheSwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgdmFyIGlzUGFydGlhbCA9IGJpdG1hc2sgJiBDT01QQVJFX1BBUlRJQUxfRkxBRyxcbiAgICAgIGFyckxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgIG90aExlbmd0aCA9IG90aGVyLmxlbmd0aDtcblxuICBpZiAoYXJyTGVuZ3RoICE9IG90aExlbmd0aCAmJiAhKGlzUGFydGlhbCAmJiBvdGhMZW5ndGggPiBhcnJMZW5ndGgpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIENoZWNrIHRoYXQgY3ljbGljIHZhbHVlcyBhcmUgZXF1YWwuXG4gIHZhciBhcnJTdGFja2VkID0gc3RhY2suZ2V0KGFycmF5KTtcbiAgdmFyIG90aFN0YWNrZWQgPSBzdGFjay5nZXQob3RoZXIpO1xuICBpZiAoYXJyU3RhY2tlZCAmJiBvdGhTdGFja2VkKSB7XG4gICAgcmV0dXJuIGFyclN0YWNrZWQgPT0gb3RoZXIgJiYgb3RoU3RhY2tlZCA9PSBhcnJheTtcbiAgfVxuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIHJlc3VsdCA9IHRydWUsXG4gICAgICBzZWVuID0gKGJpdG1hc2sgJiBDT01QQVJFX1VOT1JERVJFRF9GTEFHKSA/IG5ldyBTZXRDYWNoZSA6IHVuZGVmaW5lZDtcblxuICBzdGFjay5zZXQoYXJyYXksIG90aGVyKTtcbiAgc3RhY2suc2V0KG90aGVyLCBhcnJheSk7XG5cbiAgLy8gSWdub3JlIG5vbi1pbmRleCBwcm9wZXJ0aWVzLlxuICB3aGlsZSAoKytpbmRleCA8IGFyckxlbmd0aCkge1xuICAgIHZhciBhcnJWYWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgb3RoVmFsdWUgPSBvdGhlcltpbmRleF07XG5cbiAgICBpZiAoY3VzdG9taXplcikge1xuICAgICAgdmFyIGNvbXBhcmVkID0gaXNQYXJ0aWFsXG4gICAgICAgID8gY3VzdG9taXplcihvdGhWYWx1ZSwgYXJyVmFsdWUsIGluZGV4LCBvdGhlciwgYXJyYXksIHN0YWNrKVxuICAgICAgICA6IGN1c3RvbWl6ZXIoYXJyVmFsdWUsIG90aFZhbHVlLCBpbmRleCwgYXJyYXksIG90aGVyLCBzdGFjayk7XG4gICAgfVxuICAgIGlmIChjb21wYXJlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoY29tcGFyZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICAvLyBSZWN1cnNpdmVseSBjb21wYXJlIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgIGlmIChzZWVuKSB7XG4gICAgICBpZiAoIWFycmF5U29tZShvdGhlciwgZnVuY3Rpb24ob3RoVmFsdWUsIG90aEluZGV4KSB7XG4gICAgICAgICAgICBpZiAoIWNhY2hlSGFzKHNlZW4sIG90aEluZGV4KSAmJlxuICAgICAgICAgICAgICAgIChhcnJWYWx1ZSA9PT0gb3RoVmFsdWUgfHwgZXF1YWxGdW5jKGFyclZhbHVlLCBvdGhWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spKSkge1xuICAgICAgICAgICAgICByZXR1cm4gc2Vlbi5wdXNoKG90aEluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSkge1xuICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghKFxuICAgICAgICAgIGFyclZhbHVlID09PSBvdGhWYWx1ZSB8fFxuICAgICAgICAgICAgZXF1YWxGdW5jKGFyclZhbHVlLCBvdGhWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spXG4gICAgICAgICkpIHtcbiAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHN0YWNrWydkZWxldGUnXShhcnJheSk7XG4gIHN0YWNrWydkZWxldGUnXShvdGhlcik7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXF1YWxBcnJheXM7XG4iLCJ2YXIgU3ltYm9sID0gcmVxdWlyZSgnLi9fU3ltYm9sJyksXG4gICAgVWludDhBcnJheSA9IHJlcXVpcmUoJy4vX1VpbnQ4QXJyYXknKSxcbiAgICBlcSA9IHJlcXVpcmUoJy4vZXEnKSxcbiAgICBlcXVhbEFycmF5cyA9IHJlcXVpcmUoJy4vX2VxdWFsQXJyYXlzJyksXG4gICAgbWFwVG9BcnJheSA9IHJlcXVpcmUoJy4vX21hcFRvQXJyYXknKSxcbiAgICBzZXRUb0FycmF5ID0gcmVxdWlyZSgnLi9fc2V0VG9BcnJheScpO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciB2YWx1ZSBjb21wYXJpc29ucy4gKi9cbnZhciBDT01QQVJFX1BBUlRJQUxfRkxBRyA9IDEsXG4gICAgQ09NUEFSRV9VTk9SREVSRURfRkxBRyA9IDI7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBib29sVGFnID0gJ1tvYmplY3QgQm9vbGVhbl0nLFxuICAgIGRhdGVUYWcgPSAnW29iamVjdCBEYXRlXScsXG4gICAgZXJyb3JUYWcgPSAnW29iamVjdCBFcnJvcl0nLFxuICAgIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nLFxuICAgIG51bWJlclRhZyA9ICdbb2JqZWN0IE51bWJlcl0nLFxuICAgIHJlZ2V4cFRhZyA9ICdbb2JqZWN0IFJlZ0V4cF0nLFxuICAgIHNldFRhZyA9ICdbb2JqZWN0IFNldF0nLFxuICAgIHN0cmluZ1RhZyA9ICdbb2JqZWN0IFN0cmluZ10nLFxuICAgIHN5bWJvbFRhZyA9ICdbb2JqZWN0IFN5bWJvbF0nO1xuXG52YXIgYXJyYXlCdWZmZXJUYWcgPSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nLFxuICAgIGRhdGFWaWV3VGFnID0gJ1tvYmplY3QgRGF0YVZpZXddJztcblxuLyoqIFVzZWQgdG8gY29udmVydCBzeW1ib2xzIHRvIHByaW1pdGl2ZXMgYW5kIHN0cmluZ3MuICovXG52YXIgc3ltYm9sUHJvdG8gPSBTeW1ib2wgPyBTeW1ib2wucHJvdG90eXBlIDogdW5kZWZpbmVkLFxuICAgIHN5bWJvbFZhbHVlT2YgPSBzeW1ib2xQcm90byA/IHN5bWJvbFByb3RvLnZhbHVlT2YgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbERlZXBgIGZvciBjb21wYXJpbmcgb2JqZWN0cyBvZlxuICogdGhlIHNhbWUgYHRvU3RyaW5nVGFnYC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBmdW5jdGlvbiBvbmx5IHN1cHBvcnRzIGNvbXBhcmluZyB2YWx1ZXMgd2l0aCB0YWdzIG9mXG4gKiBgQm9vbGVhbmAsIGBEYXRlYCwgYEVycm9yYCwgYE51bWJlcmAsIGBSZWdFeHBgLCBvciBgU3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZyBUaGUgYHRvU3RyaW5nVGFnYCBvZiB0aGUgb2JqZWN0cyB0byBjb21wYXJlLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhY2sgVHJhY2tzIHRyYXZlcnNlZCBgb2JqZWN0YCBhbmQgYG90aGVyYCBvYmplY3RzLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGVxdWFsQnlUYWcob2JqZWN0LCBvdGhlciwgdGFnLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKSB7XG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSBkYXRhVmlld1RhZzpcbiAgICAgIGlmICgob2JqZWN0LmJ5dGVMZW5ndGggIT0gb3RoZXIuYnl0ZUxlbmd0aCkgfHxcbiAgICAgICAgICAob2JqZWN0LmJ5dGVPZmZzZXQgIT0gb3RoZXIuYnl0ZU9mZnNldCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgb2JqZWN0ID0gb2JqZWN0LmJ1ZmZlcjtcbiAgICAgIG90aGVyID0gb3RoZXIuYnVmZmVyO1xuXG4gICAgY2FzZSBhcnJheUJ1ZmZlclRhZzpcbiAgICAgIGlmICgob2JqZWN0LmJ5dGVMZW5ndGggIT0gb3RoZXIuYnl0ZUxlbmd0aCkgfHxcbiAgICAgICAgICAhZXF1YWxGdW5jKG5ldyBVaW50OEFycmF5KG9iamVjdCksIG5ldyBVaW50OEFycmF5KG90aGVyKSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICBjYXNlIGJvb2xUYWc6XG4gICAgY2FzZSBkYXRlVGFnOlxuICAgIGNhc2UgbnVtYmVyVGFnOlxuICAgICAgLy8gQ29lcmNlIGJvb2xlYW5zIHRvIGAxYCBvciBgMGAgYW5kIGRhdGVzIHRvIG1pbGxpc2Vjb25kcy5cbiAgICAgIC8vIEludmFsaWQgZGF0ZXMgYXJlIGNvZXJjZWQgdG8gYE5hTmAuXG4gICAgICByZXR1cm4gZXEoK29iamVjdCwgK290aGVyKTtcblxuICAgIGNhc2UgZXJyb3JUYWc6XG4gICAgICByZXR1cm4gb2JqZWN0Lm5hbWUgPT0gb3RoZXIubmFtZSAmJiBvYmplY3QubWVzc2FnZSA9PSBvdGhlci5tZXNzYWdlO1xuXG4gICAgY2FzZSByZWdleHBUYWc6XG4gICAgY2FzZSBzdHJpbmdUYWc6XG4gICAgICAvLyBDb2VyY2UgcmVnZXhlcyB0byBzdHJpbmdzIGFuZCB0cmVhdCBzdHJpbmdzLCBwcmltaXRpdmVzIGFuZCBvYmplY3RzLFxuICAgICAgLy8gYXMgZXF1YWwuIFNlZSBodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcmVnZXhwLnByb3RvdHlwZS50b3N0cmluZ1xuICAgICAgLy8gZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgIHJldHVybiBvYmplY3QgPT0gKG90aGVyICsgJycpO1xuXG4gICAgY2FzZSBtYXBUYWc6XG4gICAgICB2YXIgY29udmVydCA9IG1hcFRvQXJyYXk7XG5cbiAgICBjYXNlIHNldFRhZzpcbiAgICAgIHZhciBpc1BhcnRpYWwgPSBiaXRtYXNrICYgQ09NUEFSRV9QQVJUSUFMX0ZMQUc7XG4gICAgICBjb252ZXJ0IHx8IChjb252ZXJ0ID0gc2V0VG9BcnJheSk7XG5cbiAgICAgIGlmIChvYmplY3Quc2l6ZSAhPSBvdGhlci5zaXplICYmICFpc1BhcnRpYWwpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgLy8gQXNzdW1lIGN5Y2xpYyB2YWx1ZXMgYXJlIGVxdWFsLlxuICAgICAgdmFyIHN0YWNrZWQgPSBzdGFjay5nZXQob2JqZWN0KTtcbiAgICAgIGlmIChzdGFja2VkKSB7XG4gICAgICAgIHJldHVybiBzdGFja2VkID09IG90aGVyO1xuICAgICAgfVxuICAgICAgYml0bWFzayB8PSBDT01QQVJFX1VOT1JERVJFRF9GTEFHO1xuXG4gICAgICAvLyBSZWN1cnNpdmVseSBjb21wYXJlIG9iamVjdHMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgIHN0YWNrLnNldChvYmplY3QsIG90aGVyKTtcbiAgICAgIHZhciByZXN1bHQgPSBlcXVhbEFycmF5cyhjb252ZXJ0KG9iamVjdCksIGNvbnZlcnQob3RoZXIpLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKTtcbiAgICAgIHN0YWNrWydkZWxldGUnXShvYmplY3QpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcblxuICAgIGNhc2Ugc3ltYm9sVGFnOlxuICAgICAgaWYgKHN5bWJvbFZhbHVlT2YpIHtcbiAgICAgICAgcmV0dXJuIHN5bWJvbFZhbHVlT2YuY2FsbChvYmplY3QpID09IHN5bWJvbFZhbHVlT2YuY2FsbChvdGhlcik7XG4gICAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGVxdWFsQnlUYWc7XG4iLCJ2YXIgZ2V0QWxsS2V5cyA9IHJlcXVpcmUoJy4vX2dldEFsbEtleXMnKTtcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgdmFsdWUgY29tcGFyaXNvbnMuICovXG52YXIgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgPSAxO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUlzRXF1YWxEZWVwYCBmb3Igb2JqZWN0cyB3aXRoIHN1cHBvcnQgZm9yXG4gKiBwYXJ0aWFsIGRlZXAgY29tcGFyaXNvbnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHtPYmplY3R9IG90aGVyIFRoZSBvdGhlciBvYmplY3QgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGJhc2VJc0VxdWFsYCBmb3IgbW9yZSBkZXRhaWxzLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY3VzdG9taXplciBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLlxuICogQHBhcmFtIHtPYmplY3R9IHN0YWNrIFRyYWNrcyB0cmF2ZXJzZWQgYG9iamVjdGAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgb2JqZWN0cyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBlcXVhbE9iamVjdHMob2JqZWN0LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaykge1xuICB2YXIgaXNQYXJ0aWFsID0gYml0bWFzayAmIENPTVBBUkVfUEFSVElBTF9GTEFHLFxuICAgICAgb2JqUHJvcHMgPSBnZXRBbGxLZXlzKG9iamVjdCksXG4gICAgICBvYmpMZW5ndGggPSBvYmpQcm9wcy5sZW5ndGgsXG4gICAgICBvdGhQcm9wcyA9IGdldEFsbEtleXMob3RoZXIpLFxuICAgICAgb3RoTGVuZ3RoID0gb3RoUHJvcHMubGVuZ3RoO1xuXG4gIGlmIChvYmpMZW5ndGggIT0gb3RoTGVuZ3RoICYmICFpc1BhcnRpYWwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIGluZGV4ID0gb2JqTGVuZ3RoO1xuICB3aGlsZSAoaW5kZXgtLSkge1xuICAgIHZhciBrZXkgPSBvYmpQcm9wc1tpbmRleF07XG4gICAgaWYgKCEoaXNQYXJ0aWFsID8ga2V5IGluIG90aGVyIDogaGFzT3duUHJvcGVydHkuY2FsbChvdGhlciwga2V5KSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgLy8gQ2hlY2sgdGhhdCBjeWNsaWMgdmFsdWVzIGFyZSBlcXVhbC5cbiAgdmFyIG9ialN0YWNrZWQgPSBzdGFjay5nZXQob2JqZWN0KTtcbiAgdmFyIG90aFN0YWNrZWQgPSBzdGFjay5nZXQob3RoZXIpO1xuICBpZiAob2JqU3RhY2tlZCAmJiBvdGhTdGFja2VkKSB7XG4gICAgcmV0dXJuIG9ialN0YWNrZWQgPT0gb3RoZXIgJiYgb3RoU3RhY2tlZCA9PSBvYmplY3Q7XG4gIH1cbiAgdmFyIHJlc3VsdCA9IHRydWU7XG4gIHN0YWNrLnNldChvYmplY3QsIG90aGVyKTtcbiAgc3RhY2suc2V0KG90aGVyLCBvYmplY3QpO1xuXG4gIHZhciBza2lwQ3RvciA9IGlzUGFydGlhbDtcbiAgd2hpbGUgKCsraW5kZXggPCBvYmpMZW5ndGgpIHtcbiAgICBrZXkgPSBvYmpQcm9wc1tpbmRleF07XG4gICAgdmFyIG9ialZhbHVlID0gb2JqZWN0W2tleV0sXG4gICAgICAgIG90aFZhbHVlID0gb3RoZXJba2V5XTtcblxuICAgIGlmIChjdXN0b21pemVyKSB7XG4gICAgICB2YXIgY29tcGFyZWQgPSBpc1BhcnRpYWxcbiAgICAgICAgPyBjdXN0b21pemVyKG90aFZhbHVlLCBvYmpWYWx1ZSwga2V5LCBvdGhlciwgb2JqZWN0LCBzdGFjaylcbiAgICAgICAgOiBjdXN0b21pemVyKG9ialZhbHVlLCBvdGhWYWx1ZSwga2V5LCBvYmplY3QsIG90aGVyLCBzdGFjayk7XG4gICAgfVxuICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbXBhcmUgb2JqZWN0cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgIGlmICghKGNvbXBhcmVkID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IChvYmpWYWx1ZSA9PT0gb3RoVmFsdWUgfHwgZXF1YWxGdW5jKG9ialZhbHVlLCBvdGhWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spKVxuICAgICAgICAgIDogY29tcGFyZWRcbiAgICAgICAgKSkge1xuICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgc2tpcEN0b3IgfHwgKHNraXBDdG9yID0ga2V5ID09ICdjb25zdHJ1Y3RvcicpO1xuICB9XG4gIGlmIChyZXN1bHQgJiYgIXNraXBDdG9yKSB7XG4gICAgdmFyIG9iakN0b3IgPSBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICAgIG90aEN0b3IgPSBvdGhlci5jb25zdHJ1Y3RvcjtcblxuICAgIC8vIE5vbiBgT2JqZWN0YCBvYmplY3QgaW5zdGFuY2VzIHdpdGggZGlmZmVyZW50IGNvbnN0cnVjdG9ycyBhcmUgbm90IGVxdWFsLlxuICAgIGlmIChvYmpDdG9yICE9IG90aEN0b3IgJiZcbiAgICAgICAgKCdjb25zdHJ1Y3RvcicgaW4gb2JqZWN0ICYmICdjb25zdHJ1Y3RvcicgaW4gb3RoZXIpICYmXG4gICAgICAgICEodHlwZW9mIG9iakN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBvYmpDdG9yIGluc3RhbmNlb2Ygb2JqQ3RvciAmJlxuICAgICAgICAgIHR5cGVvZiBvdGhDdG9yID09ICdmdW5jdGlvbicgJiYgb3RoQ3RvciBpbnN0YW5jZW9mIG90aEN0b3IpKSB7XG4gICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgc3RhY2tbJ2RlbGV0ZSddKG9iamVjdCk7XG4gIHN0YWNrWydkZWxldGUnXShvdGhlcik7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXF1YWxPYmplY3RzO1xuIiwidmFyIGZsYXR0ZW4gPSByZXF1aXJlKCcuL2ZsYXR0ZW4nKSxcbiAgICBvdmVyUmVzdCA9IHJlcXVpcmUoJy4vX292ZXJSZXN0JyksXG4gICAgc2V0VG9TdHJpbmcgPSByZXF1aXJlKCcuL19zZXRUb1N0cmluZycpO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZVJlc3RgIHdoaWNoIGZsYXR0ZW5zIHRoZSByZXN0IGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGZsYXRSZXN0KGZ1bmMpIHtcbiAgcmV0dXJuIHNldFRvU3RyaW5nKG92ZXJSZXN0KGZ1bmMsIHVuZGVmaW5lZCwgZmxhdHRlbiksIGZ1bmMgKyAnJyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZmxhdFJlc3Q7XG4iLCIvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGdsb2JhbGAgZnJvbSBOb2RlLmpzLiAqL1xudmFyIGZyZWVHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbCAmJiBnbG9iYWwuT2JqZWN0ID09PSBPYmplY3QgJiYgZ2xvYmFsO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZyZWVHbG9iYWw7XG4iLCJ2YXIgYmFzZUdldEFsbEtleXMgPSByZXF1aXJlKCcuL19iYXNlR2V0QWxsS2V5cycpLFxuICAgIGdldFN5bWJvbHMgPSByZXF1aXJlKCcuL19nZXRTeW1ib2xzJyksXG4gICAga2V5cyA9IHJlcXVpcmUoJy4va2V5cycpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2Ygb3duIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMuXG4gKi9cbmZ1bmN0aW9uIGdldEFsbEtleXMob2JqZWN0KSB7XG4gIHJldHVybiBiYXNlR2V0QWxsS2V5cyhvYmplY3QsIGtleXMsIGdldFN5bWJvbHMpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEFsbEtleXM7XG4iLCJ2YXIgYmFzZUdldEFsbEtleXMgPSByZXF1aXJlKCcuL19iYXNlR2V0QWxsS2V5cycpLFxuICAgIGdldFN5bWJvbHNJbiA9IHJlcXVpcmUoJy4vX2dldFN5bWJvbHNJbicpLFxuICAgIGtleXNJbiA9IHJlcXVpcmUoJy4va2V5c0luJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIGFuZFxuICogc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scy5cbiAqL1xuZnVuY3Rpb24gZ2V0QWxsS2V5c0luKG9iamVjdCkge1xuICByZXR1cm4gYmFzZUdldEFsbEtleXMob2JqZWN0LCBrZXlzSW4sIGdldFN5bWJvbHNJbik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QWxsS2V5c0luO1xuIiwidmFyIGlzS2V5YWJsZSA9IHJlcXVpcmUoJy4vX2lzS2V5YWJsZScpO1xuXG4vKipcbiAqIEdldHMgdGhlIGRhdGEgZm9yIGBtYXBgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gbWFwIFRoZSBtYXAgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSByZWZlcmVuY2Uga2V5LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1hcCBkYXRhLlxuICovXG5mdW5jdGlvbiBnZXRNYXBEYXRhKG1hcCwga2V5KSB7XG4gIHZhciBkYXRhID0gbWFwLl9fZGF0YV9fO1xuICByZXR1cm4gaXNLZXlhYmxlKGtleSlcbiAgICA/IGRhdGFbdHlwZW9mIGtleSA9PSAnc3RyaW5nJyA/ICdzdHJpbmcnIDogJ2hhc2gnXVxuICAgIDogZGF0YS5tYXA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0TWFwRGF0YTtcbiIsInZhciBpc1N0cmljdENvbXBhcmFibGUgPSByZXF1aXJlKCcuL19pc1N0cmljdENvbXBhcmFibGUnKSxcbiAgICBrZXlzID0gcmVxdWlyZSgnLi9rZXlzJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgcHJvcGVydHkgbmFtZXMsIHZhbHVlcywgYW5kIGNvbXBhcmUgZmxhZ3Mgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbWF0Y2ggZGF0YSBvZiBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gZ2V0TWF0Y2hEYXRhKG9iamVjdCkge1xuICB2YXIgcmVzdWx0ID0ga2V5cyhvYmplY3QpLFxuICAgICAgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDtcblxuICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICB2YXIga2V5ID0gcmVzdWx0W2xlbmd0aF0sXG4gICAgICAgIHZhbHVlID0gb2JqZWN0W2tleV07XG5cbiAgICByZXN1bHRbbGVuZ3RoXSA9IFtrZXksIHZhbHVlLCBpc1N0cmljdENvbXBhcmFibGUodmFsdWUpXTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldE1hdGNoRGF0YTtcbiIsInZhciBiYXNlSXNOYXRpdmUgPSByZXF1aXJlKCcuL19iYXNlSXNOYXRpdmUnKSxcbiAgICBnZXRWYWx1ZSA9IHJlcXVpcmUoJy4vX2dldFZhbHVlJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgbmF0aXZlIGZ1bmN0aW9uIGF0IGBrZXlgIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIG1ldGhvZCB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZnVuY3Rpb24gaWYgaXQncyBuYXRpdmUsIGVsc2UgYHVuZGVmaW5lZGAuXG4gKi9cbmZ1bmN0aW9uIGdldE5hdGl2ZShvYmplY3QsIGtleSkge1xuICB2YXIgdmFsdWUgPSBnZXRWYWx1ZShvYmplY3QsIGtleSk7XG4gIHJldHVybiBiYXNlSXNOYXRpdmUodmFsdWUpID8gdmFsdWUgOiB1bmRlZmluZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0TmF0aXZlO1xuIiwidmFyIG92ZXJBcmcgPSByZXF1aXJlKCcuL19vdmVyQXJnJyk7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIGdldFByb3RvdHlwZSA9IG92ZXJBcmcoT2JqZWN0LmdldFByb3RvdHlwZU9mLCBPYmplY3QpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFByb3RvdHlwZTtcbiIsInZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19TeW1ib2wnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG5hdGl2ZU9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHN5bVRvU3RyaW5nVGFnID0gU3ltYm9sID8gU3ltYm9sLnRvU3RyaW5nVGFnIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUdldFRhZ2Agd2hpY2ggaWdub3JlcyBgU3ltYm9sLnRvU3RyaW5nVGFnYCB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcmF3IGB0b1N0cmluZ1RhZ2AuXG4gKi9cbmZ1bmN0aW9uIGdldFJhd1RhZyh2YWx1ZSkge1xuICB2YXIgaXNPd24gPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBzeW1Ub1N0cmluZ1RhZyksXG4gICAgICB0YWcgPSB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ107XG5cbiAgdHJ5IHtcbiAgICB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ10gPSB1bmRlZmluZWQ7XG4gICAgdmFyIHVubWFza2VkID0gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge31cblxuICB2YXIgcmVzdWx0ID0gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIGlmICh1bm1hc2tlZCkge1xuICAgIGlmIChpc093bikge1xuICAgICAgdmFsdWVbc3ltVG9TdHJpbmdUYWddID0gdGFnO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgdmFsdWVbc3ltVG9TdHJpbmdUYWddO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFJhd1RhZztcbiIsInZhciBhcnJheUZpbHRlciA9IHJlcXVpcmUoJy4vX2FycmF5RmlsdGVyJyksXG4gICAgc3R1YkFycmF5ID0gcmVxdWlyZSgnLi9zdHViQXJyYXknKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgcHJvcGVydHlJc0VudW1lcmFibGUgPSBvYmplY3RQcm90by5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZUdldFN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBlbnVtZXJhYmxlIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2Ygc3ltYm9scy5cbiAqL1xudmFyIGdldFN5bWJvbHMgPSAhbmF0aXZlR2V0U3ltYm9scyA/IHN0dWJBcnJheSA6IGZ1bmN0aW9uKG9iamVjdCkge1xuICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7XG4gIHJldHVybiBhcnJheUZpbHRlcihuYXRpdmVHZXRTeW1ib2xzKG9iamVjdCksIGZ1bmN0aW9uKHN5bWJvbCkge1xuICAgIHJldHVybiBwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKG9iamVjdCwgc3ltYm9sKTtcbiAgfSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFN5bWJvbHM7XG4iLCJ2YXIgYXJyYXlQdXNoID0gcmVxdWlyZSgnLi9fYXJyYXlQdXNoJyksXG4gICAgZ2V0UHJvdG90eXBlID0gcmVxdWlyZSgnLi9fZ2V0UHJvdG90eXBlJyksXG4gICAgZ2V0U3ltYm9scyA9IHJlcXVpcmUoJy4vX2dldFN5bWJvbHMnKSxcbiAgICBzdHViQXJyYXkgPSByZXF1aXJlKCcuL3N0dWJBcnJheScpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlR2V0U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHN5bWJvbHMuXG4gKi9cbnZhciBnZXRTeW1ib2xzSW4gPSAhbmF0aXZlR2V0U3ltYm9scyA/IHN0dWJBcnJheSA6IGZ1bmN0aW9uKG9iamVjdCkge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHdoaWxlIChvYmplY3QpIHtcbiAgICBhcnJheVB1c2gocmVzdWx0LCBnZXRTeW1ib2xzKG9iamVjdCkpO1xuICAgIG9iamVjdCA9IGdldFByb3RvdHlwZShvYmplY3QpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFN5bWJvbHNJbjtcbiIsInZhciBEYXRhVmlldyA9IHJlcXVpcmUoJy4vX0RhdGFWaWV3JyksXG4gICAgTWFwID0gcmVxdWlyZSgnLi9fTWFwJyksXG4gICAgUHJvbWlzZSA9IHJlcXVpcmUoJy4vX1Byb21pc2UnKSxcbiAgICBTZXQgPSByZXF1aXJlKCcuL19TZXQnKSxcbiAgICBXZWFrTWFwID0gcmVxdWlyZSgnLi9fV2Vha01hcCcpLFxuICAgIGJhc2VHZXRUYWcgPSByZXF1aXJlKCcuL19iYXNlR2V0VGFnJyksXG4gICAgdG9Tb3VyY2UgPSByZXF1aXJlKCcuL190b1NvdXJjZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXG4gICAgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XScsXG4gICAgcHJvbWlzZVRhZyA9ICdbb2JqZWN0IFByb21pc2VdJyxcbiAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJyxcbiAgICB3ZWFrTWFwVGFnID0gJ1tvYmplY3QgV2Vha01hcF0nO1xuXG52YXIgZGF0YVZpZXdUYWcgPSAnW29iamVjdCBEYXRhVmlld10nO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgbWFwcywgc2V0cywgYW5kIHdlYWttYXBzLiAqL1xudmFyIGRhdGFWaWV3Q3RvclN0cmluZyA9IHRvU291cmNlKERhdGFWaWV3KSxcbiAgICBtYXBDdG9yU3RyaW5nID0gdG9Tb3VyY2UoTWFwKSxcbiAgICBwcm9taXNlQ3RvclN0cmluZyA9IHRvU291cmNlKFByb21pc2UpLFxuICAgIHNldEN0b3JTdHJpbmcgPSB0b1NvdXJjZShTZXQpLFxuICAgIHdlYWtNYXBDdG9yU3RyaW5nID0gdG9Tb3VyY2UoV2Vha01hcCk7XG5cbi8qKlxuICogR2V0cyB0aGUgYHRvU3RyaW5nVGFnYCBvZiBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGB0b1N0cmluZ1RhZ2AuXG4gKi9cbnZhciBnZXRUYWcgPSBiYXNlR2V0VGFnO1xuXG4vLyBGYWxsYmFjayBmb3IgZGF0YSB2aWV3cywgbWFwcywgc2V0cywgYW5kIHdlYWsgbWFwcyBpbiBJRSAxMSBhbmQgcHJvbWlzZXMgaW4gTm9kZS5qcyA8IDYuXG5pZiAoKERhdGFWaWV3ICYmIGdldFRhZyhuZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDEpKSkgIT0gZGF0YVZpZXdUYWcpIHx8XG4gICAgKE1hcCAmJiBnZXRUYWcobmV3IE1hcCkgIT0gbWFwVGFnKSB8fFxuICAgIChQcm9taXNlICYmIGdldFRhZyhQcm9taXNlLnJlc29sdmUoKSkgIT0gcHJvbWlzZVRhZykgfHxcbiAgICAoU2V0ICYmIGdldFRhZyhuZXcgU2V0KSAhPSBzZXRUYWcpIHx8XG4gICAgKFdlYWtNYXAgJiYgZ2V0VGFnKG5ldyBXZWFrTWFwKSAhPSB3ZWFrTWFwVGFnKSkge1xuICBnZXRUYWcgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHZhciByZXN1bHQgPSBiYXNlR2V0VGFnKHZhbHVlKSxcbiAgICAgICAgQ3RvciA9IHJlc3VsdCA9PSBvYmplY3RUYWcgPyB2YWx1ZS5jb25zdHJ1Y3RvciA6IHVuZGVmaW5lZCxcbiAgICAgICAgY3RvclN0cmluZyA9IEN0b3IgPyB0b1NvdXJjZShDdG9yKSA6ICcnO1xuXG4gICAgaWYgKGN0b3JTdHJpbmcpIHtcbiAgICAgIHN3aXRjaCAoY3RvclN0cmluZykge1xuICAgICAgICBjYXNlIGRhdGFWaWV3Q3RvclN0cmluZzogcmV0dXJuIGRhdGFWaWV3VGFnO1xuICAgICAgICBjYXNlIG1hcEN0b3JTdHJpbmc6IHJldHVybiBtYXBUYWc7XG4gICAgICAgIGNhc2UgcHJvbWlzZUN0b3JTdHJpbmc6IHJldHVybiBwcm9taXNlVGFnO1xuICAgICAgICBjYXNlIHNldEN0b3JTdHJpbmc6IHJldHVybiBzZXRUYWc7XG4gICAgICAgIGNhc2Ugd2Vha01hcEN0b3JTdHJpbmc6IHJldHVybiB3ZWFrTWFwVGFnO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFRhZztcbiIsIi8qKlxuICogR2V0cyB0aGUgdmFsdWUgYXQgYGtleWAgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGdldFZhbHVlKG9iamVjdCwga2V5KSB7XG4gIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFtrZXldO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFZhbHVlO1xuIiwidmFyIGNhc3RQYXRoID0gcmVxdWlyZSgnLi9fY2FzdFBhdGgnKSxcbiAgICBpc0FyZ3VtZW50cyA9IHJlcXVpcmUoJy4vaXNBcmd1bWVudHMnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNJbmRleCA9IHJlcXVpcmUoJy4vX2lzSW5kZXgnKSxcbiAgICBpc0xlbmd0aCA9IHJlcXVpcmUoJy4vaXNMZW5ndGgnKSxcbiAgICB0b0tleSA9IHJlcXVpcmUoJy4vX3RvS2V5Jyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGBwYXRoYCBleGlzdHMgb24gYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHRvIGNoZWNrLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaGFzRnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2sgcHJvcGVydGllcy5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgcGF0aGAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGhhc1BhdGgob2JqZWN0LCBwYXRoLCBoYXNGdW5jKSB7XG4gIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuXG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGgsXG4gICAgICByZXN1bHQgPSBmYWxzZTtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBrZXkgPSB0b0tleShwYXRoW2luZGV4XSk7XG4gICAgaWYgKCEocmVzdWx0ID0gb2JqZWN0ICE9IG51bGwgJiYgaGFzRnVuYyhvYmplY3QsIGtleSkpKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgb2JqZWN0ID0gb2JqZWN0W2tleV07XG4gIH1cbiAgaWYgKHJlc3VsdCB8fCArK2luZGV4ICE9IGxlbmd0aCkge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgbGVuZ3RoID0gb2JqZWN0ID09IG51bGwgPyAwIDogb2JqZWN0Lmxlbmd0aDtcbiAgcmV0dXJuICEhbGVuZ3RoICYmIGlzTGVuZ3RoKGxlbmd0aCkgJiYgaXNJbmRleChrZXksIGxlbmd0aCkgJiZcbiAgICAoaXNBcnJheShvYmplY3QpIHx8IGlzQXJndW1lbnRzKG9iamVjdCkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc1BhdGg7XG4iLCIvKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgY2hhcmFjdGVyIGNsYXNzZXMuICovXG52YXIgcnNBc3RyYWxSYW5nZSA9ICdcXFxcdWQ4MDAtXFxcXHVkZmZmJyxcbiAgICByc0NvbWJvTWFya3NSYW5nZSA9ICdcXFxcdTAzMDAtXFxcXHUwMzZmJyxcbiAgICByZUNvbWJvSGFsZk1hcmtzUmFuZ2UgPSAnXFxcXHVmZTIwLVxcXFx1ZmUyZicsXG4gICAgcnNDb21ib1N5bWJvbHNSYW5nZSA9ICdcXFxcdTIwZDAtXFxcXHUyMGZmJyxcbiAgICByc0NvbWJvUmFuZ2UgPSByc0NvbWJvTWFya3NSYW5nZSArIHJlQ29tYm9IYWxmTWFya3NSYW5nZSArIHJzQ29tYm9TeW1ib2xzUmFuZ2UsXG4gICAgcnNWYXJSYW5nZSA9ICdcXFxcdWZlMGVcXFxcdWZlMGYnO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgY2FwdHVyZSBncm91cHMuICovXG52YXIgcnNaV0ogPSAnXFxcXHUyMDBkJztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IHN0cmluZ3Mgd2l0aCBbemVyby13aWR0aCBqb2luZXJzIG9yIGNvZGUgcG9pbnRzIGZyb20gdGhlIGFzdHJhbCBwbGFuZXNdKGh0dHA6Ly9lZXYuZWUvYmxvZy8yMDE1LzA5LzEyL2RhcmstY29ybmVycy1vZi11bmljb2RlLykuICovXG52YXIgcmVIYXNVbmljb2RlID0gUmVnRXhwKCdbJyArIHJzWldKICsgcnNBc3RyYWxSYW5nZSAgKyByc0NvbWJvUmFuZ2UgKyByc1ZhclJhbmdlICsgJ10nKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHN0cmluZ2AgY29udGFpbnMgVW5pY29kZSBzeW1ib2xzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhIHN5bWJvbCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBoYXNVbmljb2RlKHN0cmluZykge1xuICByZXR1cm4gcmVIYXNVbmljb2RlLnRlc3Qoc3RyaW5nKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNVbmljb2RlO1xuIiwidmFyIG5hdGl2ZUNyZWF0ZSA9IHJlcXVpcmUoJy4vX25hdGl2ZUNyZWF0ZScpO1xuXG4vKipcbiAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIGhhc2guXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGNsZWFyXG4gKiBAbWVtYmVyT2YgSGFzaFxuICovXG5mdW5jdGlvbiBoYXNoQ2xlYXIoKSB7XG4gIHRoaXMuX19kYXRhX18gPSBuYXRpdmVDcmVhdGUgPyBuYXRpdmVDcmVhdGUobnVsbCkgOiB7fTtcbiAgdGhpcy5zaXplID0gMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNoQ2xlYXI7XG4iLCIvKipcbiAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBoYXNoLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBkZWxldGVcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKiBAcGFyYW0ge09iamVjdH0gaGFzaCBUaGUgaGFzaCB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaGFzaERlbGV0ZShrZXkpIHtcbiAgdmFyIHJlc3VsdCA9IHRoaXMuaGFzKGtleSkgJiYgZGVsZXRlIHRoaXMuX19kYXRhX19ba2V5XTtcbiAgdGhpcy5zaXplIC09IHJlc3VsdCA/IDEgOiAwO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc2hEZWxldGU7XG4iLCJ2YXIgbmF0aXZlQ3JlYXRlID0gcmVxdWlyZSgnLi9fbmF0aXZlQ3JlYXRlJyk7XG5cbi8qKiBVc2VkIHRvIHN0YW5kLWluIGZvciBgdW5kZWZpbmVkYCBoYXNoIHZhbHVlcy4gKi9cbnZhciBIQVNIX1VOREVGSU5FRCA9ICdfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBHZXRzIHRoZSBoYXNoIHZhbHVlIGZvciBga2V5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZ2V0XG4gKiBAbWVtYmVyT2YgSGFzaFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGhhc2hHZXQoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgaWYgKG5hdGl2ZUNyZWF0ZSkge1xuICAgIHZhciByZXN1bHQgPSBkYXRhW2tleV07XG4gICAgcmV0dXJuIHJlc3VsdCA9PT0gSEFTSF9VTkRFRklORUQgPyB1bmRlZmluZWQgOiByZXN1bHQ7XG4gIH1cbiAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KSA/IGRhdGFba2V5XSA6IHVuZGVmaW5lZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNoR2V0O1xuIiwidmFyIG5hdGl2ZUNyZWF0ZSA9IHJlcXVpcmUoJy4vX25hdGl2ZUNyZWF0ZScpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIGhhc2ggdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgSGFzaFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGhhc2hIYXMoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgcmV0dXJuIG5hdGl2ZUNyZWF0ZSA/IChkYXRhW2tleV0gIT09IHVuZGVmaW5lZCkgOiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzaEhhcztcbiIsInZhciBuYXRpdmVDcmVhdGUgPSByZXF1aXJlKCcuL19uYXRpdmVDcmVhdGUnKTtcblxuLyoqIFVzZWQgdG8gc3RhbmQtaW4gZm9yIGB1bmRlZmluZWRgIGhhc2ggdmFsdWVzLiAqL1xudmFyIEhBU0hfVU5ERUZJTkVEID0gJ19fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18nO1xuXG4vKipcbiAqIFNldHMgdGhlIGhhc2ggYGtleWAgdG8gYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgc2V0XG4gKiBAbWVtYmVyT2YgSGFzaFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBoYXNoIGluc3RhbmNlLlxuICovXG5mdW5jdGlvbiBoYXNoU2V0KGtleSwgdmFsdWUpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICB0aGlzLnNpemUgKz0gdGhpcy5oYXMoa2V5KSA/IDAgOiAxO1xuICBkYXRhW2tleV0gPSAobmF0aXZlQ3JlYXRlICYmIHZhbHVlID09PSB1bmRlZmluZWQpID8gSEFTSF9VTkRFRklORUQgOiB2YWx1ZTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzaFNldDtcbiIsIi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgYW4gYXJyYXkgY2xvbmUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjbG9uZS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgaW5pdGlhbGl6ZWQgY2xvbmUuXG4gKi9cbmZ1bmN0aW9uIGluaXRDbG9uZUFycmF5KGFycmF5KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICByZXN1bHQgPSBuZXcgYXJyYXkuY29uc3RydWN0b3IobGVuZ3RoKTtcblxuICAvLyBBZGQgcHJvcGVydGllcyBhc3NpZ25lZCBieSBgUmVnRXhwI2V4ZWNgLlxuICBpZiAobGVuZ3RoICYmIHR5cGVvZiBhcnJheVswXSA9PSAnc3RyaW5nJyAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGFycmF5LCAnaW5kZXgnKSkge1xuICAgIHJlc3VsdC5pbmRleCA9IGFycmF5LmluZGV4O1xuICAgIHJlc3VsdC5pbnB1dCA9IGFycmF5LmlucHV0O1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaW5pdENsb25lQXJyYXk7XG4iLCJ2YXIgY2xvbmVBcnJheUJ1ZmZlciA9IHJlcXVpcmUoJy4vX2Nsb25lQXJyYXlCdWZmZXInKSxcbiAgICBjbG9uZURhdGFWaWV3ID0gcmVxdWlyZSgnLi9fY2xvbmVEYXRhVmlldycpLFxuICAgIGNsb25lUmVnRXhwID0gcmVxdWlyZSgnLi9fY2xvbmVSZWdFeHAnKSxcbiAgICBjbG9uZVN5bWJvbCA9IHJlcXVpcmUoJy4vX2Nsb25lU3ltYm9sJyksXG4gICAgY2xvbmVUeXBlZEFycmF5ID0gcmVxdWlyZSgnLi9fY2xvbmVUeXBlZEFycmF5Jyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBib29sVGFnID0gJ1tvYmplY3QgQm9vbGVhbl0nLFxuICAgIGRhdGVUYWcgPSAnW29iamVjdCBEYXRlXScsXG4gICAgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXG4gICAgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXScsXG4gICAgcmVnZXhwVGFnID0gJ1tvYmplY3QgUmVnRXhwXScsXG4gICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XScsXG4gICAgc3RyaW5nVGFnID0gJ1tvYmplY3QgU3RyaW5nXScsXG4gICAgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXSc7XG5cbnZhciBhcnJheUJ1ZmZlclRhZyA9ICdbb2JqZWN0IEFycmF5QnVmZmVyXScsXG4gICAgZGF0YVZpZXdUYWcgPSAnW29iamVjdCBEYXRhVmlld10nLFxuICAgIGZsb2F0MzJUYWcgPSAnW29iamVjdCBGbG9hdDMyQXJyYXldJyxcbiAgICBmbG9hdDY0VGFnID0gJ1tvYmplY3QgRmxvYXQ2NEFycmF5XScsXG4gICAgaW50OFRhZyA9ICdbb2JqZWN0IEludDhBcnJheV0nLFxuICAgIGludDE2VGFnID0gJ1tvYmplY3QgSW50MTZBcnJheV0nLFxuICAgIGludDMyVGFnID0gJ1tvYmplY3QgSW50MzJBcnJheV0nLFxuICAgIHVpbnQ4VGFnID0gJ1tvYmplY3QgVWludDhBcnJheV0nLFxuICAgIHVpbnQ4Q2xhbXBlZFRhZyA9ICdbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XScsXG4gICAgdWludDE2VGFnID0gJ1tvYmplY3QgVWludDE2QXJyYXldJyxcbiAgICB1aW50MzJUYWcgPSAnW29iamVjdCBVaW50MzJBcnJheV0nO1xuXG4vKipcbiAqIEluaXRpYWxpemVzIGFuIG9iamVjdCBjbG9uZSBiYXNlZCBvbiBpdHMgYHRvU3RyaW5nVGFnYC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBmdW5jdGlvbiBvbmx5IHN1cHBvcnRzIGNsb25pbmcgdmFsdWVzIHdpdGggdGFncyBvZlxuICogYEJvb2xlYW5gLCBgRGF0ZWAsIGBFcnJvcmAsIGBNYXBgLCBgTnVtYmVyYCwgYFJlZ0V4cGAsIGBTZXRgLCBvciBgU3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNsb25lLlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZyBUaGUgYHRvU3RyaW5nVGFnYCBvZiB0aGUgb2JqZWN0IHRvIGNsb25lLlxuICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGluaXRpYWxpemVkIGNsb25lLlxuICovXG5mdW5jdGlvbiBpbml0Q2xvbmVCeVRhZyhvYmplY3QsIHRhZywgaXNEZWVwKSB7XG4gIHZhciBDdG9yID0gb2JqZWN0LmNvbnN0cnVjdG9yO1xuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgYXJyYXlCdWZmZXJUYWc6XG4gICAgICByZXR1cm4gY2xvbmVBcnJheUJ1ZmZlcihvYmplY3QpO1xuXG4gICAgY2FzZSBib29sVGFnOlxuICAgIGNhc2UgZGF0ZVRhZzpcbiAgICAgIHJldHVybiBuZXcgQ3Rvcigrb2JqZWN0KTtcblxuICAgIGNhc2UgZGF0YVZpZXdUYWc6XG4gICAgICByZXR1cm4gY2xvbmVEYXRhVmlldyhvYmplY3QsIGlzRGVlcCk7XG5cbiAgICBjYXNlIGZsb2F0MzJUYWc6IGNhc2UgZmxvYXQ2NFRhZzpcbiAgICBjYXNlIGludDhUYWc6IGNhc2UgaW50MTZUYWc6IGNhc2UgaW50MzJUYWc6XG4gICAgY2FzZSB1aW50OFRhZzogY2FzZSB1aW50OENsYW1wZWRUYWc6IGNhc2UgdWludDE2VGFnOiBjYXNlIHVpbnQzMlRhZzpcbiAgICAgIHJldHVybiBjbG9uZVR5cGVkQXJyYXkob2JqZWN0LCBpc0RlZXApO1xuXG4gICAgY2FzZSBtYXBUYWc6XG4gICAgICByZXR1cm4gbmV3IEN0b3I7XG5cbiAgICBjYXNlIG51bWJlclRhZzpcbiAgICBjYXNlIHN0cmluZ1RhZzpcbiAgICAgIHJldHVybiBuZXcgQ3RvcihvYmplY3QpO1xuXG4gICAgY2FzZSByZWdleHBUYWc6XG4gICAgICByZXR1cm4gY2xvbmVSZWdFeHAob2JqZWN0KTtcblxuICAgIGNhc2Ugc2V0VGFnOlxuICAgICAgcmV0dXJuIG5ldyBDdG9yO1xuXG4gICAgY2FzZSBzeW1ib2xUYWc6XG4gICAgICByZXR1cm4gY2xvbmVTeW1ib2wob2JqZWN0KTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGluaXRDbG9uZUJ5VGFnO1xuIiwidmFyIGJhc2VDcmVhdGUgPSByZXF1aXJlKCcuL19iYXNlQ3JlYXRlJyksXG4gICAgZ2V0UHJvdG90eXBlID0gcmVxdWlyZSgnLi9fZ2V0UHJvdG90eXBlJyksXG4gICAgaXNQcm90b3R5cGUgPSByZXF1aXJlKCcuL19pc1Byb3RvdHlwZScpO1xuXG4vKipcbiAqIEluaXRpYWxpemVzIGFuIG9iamVjdCBjbG9uZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNsb25lLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgaW5pdGlhbGl6ZWQgY2xvbmUuXG4gKi9cbmZ1bmN0aW9uIGluaXRDbG9uZU9iamVjdChvYmplY3QpIHtcbiAgcmV0dXJuICh0eXBlb2Ygb2JqZWN0LmNvbnN0cnVjdG9yID09ICdmdW5jdGlvbicgJiYgIWlzUHJvdG90eXBlKG9iamVjdCkpXG4gICAgPyBiYXNlQ3JlYXRlKGdldFByb3RvdHlwZShvYmplY3QpKVxuICAgIDoge307XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaW5pdENsb25lT2JqZWN0O1xuIiwidmFyIFN5bWJvbCA9IHJlcXVpcmUoJy4vX1N5bWJvbCcpLFxuICAgIGlzQXJndW1lbnRzID0gcmVxdWlyZSgnLi9pc0FyZ3VtZW50cycpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgc3ByZWFkYWJsZVN5bWJvbCA9IFN5bWJvbCA/IFN5bWJvbC5pc0NvbmNhdFNwcmVhZGFibGUgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBmbGF0dGVuYWJsZSBgYXJndW1lbnRzYCBvYmplY3Qgb3IgYXJyYXkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZmxhdHRlbmFibGUsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNGbGF0dGVuYWJsZSh2YWx1ZSkge1xuICByZXR1cm4gaXNBcnJheSh2YWx1ZSkgfHwgaXNBcmd1bWVudHModmFsdWUpIHx8XG4gICAgISEoc3ByZWFkYWJsZVN5bWJvbCAmJiB2YWx1ZSAmJiB2YWx1ZVtzcHJlYWRhYmxlU3ltYm9sXSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNGbGF0dGVuYWJsZTtcbiIsIi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIE1BWF9TQUZFX0lOVEVHRVIgPSA5MDA3MTk5MjU0NzQwOTkxO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgdW5zaWduZWQgaW50ZWdlciB2YWx1ZXMuICovXG52YXIgcmVJc1VpbnQgPSAvXig/OjB8WzEtOV1cXGQqKSQvO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgYXJyYXktbGlrZSBpbmRleC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcGFyYW0ge251bWJlcn0gW2xlbmd0aD1NQVhfU0FGRV9JTlRFR0VSXSBUaGUgdXBwZXIgYm91bmRzIG9mIGEgdmFsaWQgaW5kZXguXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGluZGV4LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzSW5kZXgodmFsdWUsIGxlbmd0aCkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgbGVuZ3RoID0gbGVuZ3RoID09IG51bGwgPyBNQVhfU0FGRV9JTlRFR0VSIDogbGVuZ3RoO1xuXG4gIHJldHVybiAhIWxlbmd0aCAmJlxuICAgICh0eXBlID09ICdudW1iZXInIHx8XG4gICAgICAodHlwZSAhPSAnc3ltYm9sJyAmJiByZUlzVWludC50ZXN0KHZhbHVlKSkpICYmXG4gICAgICAgICh2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDwgbGVuZ3RoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0luZGV4O1xuIiwidmFyIGVxID0gcmVxdWlyZSgnLi9lcScpLFxuICAgIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZScpLFxuICAgIGlzSW5kZXggPSByZXF1aXJlKCcuL19pc0luZGV4JyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0Jyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBhcmd1bWVudHMgYXJlIGZyb20gYW4gaXRlcmF0ZWUgY2FsbC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIHZhbHVlIGFyZ3VtZW50LlxuICogQHBhcmFtIHsqfSBpbmRleCBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIGluZGV4IG9yIGtleSBhcmd1bWVudC5cbiAqIEBwYXJhbSB7Kn0gb2JqZWN0IFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgb2JqZWN0IGFyZ3VtZW50LlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBhcmd1bWVudHMgYXJlIGZyb20gYW4gaXRlcmF0ZWUgY2FsbCxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzSXRlcmF0ZWVDYWxsKHZhbHVlLCBpbmRleCwgb2JqZWN0KSB7XG4gIGlmICghaXNPYmplY3Qob2JqZWN0KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgdHlwZSA9IHR5cGVvZiBpbmRleDtcbiAgaWYgKHR5cGUgPT0gJ251bWJlcidcbiAgICAgICAgPyAoaXNBcnJheUxpa2Uob2JqZWN0KSAmJiBpc0luZGV4KGluZGV4LCBvYmplY3QubGVuZ3RoKSlcbiAgICAgICAgOiAodHlwZSA9PSAnc3RyaW5nJyAmJiBpbmRleCBpbiBvYmplY3QpXG4gICAgICApIHtcbiAgICByZXR1cm4gZXEob2JqZWN0W2luZGV4XSwgdmFsdWUpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0l0ZXJhdGVlQ2FsbDtcbiIsInZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNTeW1ib2wgPSByZXF1aXJlKCcuL2lzU3ltYm9sJyk7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIHByb3BlcnR5IG5hbWVzIHdpdGhpbiBwcm9wZXJ0eSBwYXRocy4gKi9cbnZhciByZUlzRGVlcFByb3AgPSAvXFwufFxcWyg/OlteW1xcXV0qfChbXCInXSkoPzooPyFcXDEpW15cXFxcXXxcXFxcLikqP1xcMSlcXF0vLFxuICAgIHJlSXNQbGFpblByb3AgPSAvXlxcdyokLztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHByb3BlcnR5IG5hbWUgYW5kIG5vdCBhIHByb3BlcnR5IHBhdGguXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkga2V5cyBvbi5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcHJvcGVydHkgbmFtZSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0tleSh2YWx1ZSwgb2JqZWN0KSB7XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgaWYgKHR5cGUgPT0gJ251bWJlcicgfHwgdHlwZSA9PSAnc3ltYm9sJyB8fCB0eXBlID09ICdib29sZWFuJyB8fFxuICAgICAgdmFsdWUgPT0gbnVsbCB8fCBpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gcmVJc1BsYWluUHJvcC50ZXN0KHZhbHVlKSB8fCAhcmVJc0RlZXBQcm9wLnRlc3QodmFsdWUpIHx8XG4gICAgKG9iamVjdCAhPSBudWxsICYmIHZhbHVlIGluIE9iamVjdChvYmplY3QpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0tleTtcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgc3VpdGFibGUgZm9yIHVzZSBhcyB1bmlxdWUgb2JqZWN0IGtleS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0tleWFibGUodmFsdWUpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiAodHlwZSA9PSAnc3RyaW5nJyB8fCB0eXBlID09ICdudW1iZXInIHx8IHR5cGUgPT0gJ3N5bWJvbCcgfHwgdHlwZSA9PSAnYm9vbGVhbicpXG4gICAgPyAodmFsdWUgIT09ICdfX3Byb3RvX18nKVxuICAgIDogKHZhbHVlID09PSBudWxsKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0tleWFibGU7XG4iLCJ2YXIgY29yZUpzRGF0YSA9IHJlcXVpcmUoJy4vX2NvcmVKc0RhdGEnKTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG1ldGhvZHMgbWFzcXVlcmFkaW5nIGFzIG5hdGl2ZS4gKi9cbnZhciBtYXNrU3JjS2V5ID0gKGZ1bmN0aW9uKCkge1xuICB2YXIgdWlkID0gL1teLl0rJC8uZXhlYyhjb3JlSnNEYXRhICYmIGNvcmVKc0RhdGEua2V5cyAmJiBjb3JlSnNEYXRhLmtleXMuSUVfUFJPVE8gfHwgJycpO1xuICByZXR1cm4gdWlkID8gKCdTeW1ib2woc3JjKV8xLicgKyB1aWQpIDogJyc7XG59KCkpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgZnVuY2AgaGFzIGl0cyBzb3VyY2UgbWFza2VkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgZnVuY2AgaXMgbWFza2VkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzTWFza2VkKGZ1bmMpIHtcbiAgcmV0dXJuICEhbWFza1NyY0tleSAmJiAobWFza1NyY0tleSBpbiBmdW5jKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc01hc2tlZDtcbiIsIi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGEgcHJvdG90eXBlIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHByb3RvdHlwZSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc1Byb3RvdHlwZSh2YWx1ZSkge1xuICB2YXIgQ3RvciA9IHZhbHVlICYmIHZhbHVlLmNvbnN0cnVjdG9yLFxuICAgICAgcHJvdG8gPSAodHlwZW9mIEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBDdG9yLnByb3RvdHlwZSkgfHwgb2JqZWN0UHJvdG87XG5cbiAgcmV0dXJuIHZhbHVlID09PSBwcm90bztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1Byb3RvdHlwZTtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSBmb3Igc3RyaWN0IGVxdWFsaXR5IGNvbXBhcmlzb25zLCBpLmUuIGA9PT1gLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlmIHN1aXRhYmxlIGZvciBzdHJpY3RcbiAqICBlcXVhbGl0eSBjb21wYXJpc29ucywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc1N0cmljdENvbXBhcmFibGUodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZSAmJiAhaXNPYmplY3QodmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzU3RyaWN0Q29tcGFyYWJsZTtcbiIsIi8qKlxuICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgbGlzdCBjYWNoZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgY2xlYXJcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlQ2xlYXIoKSB7XG4gIHRoaXMuX19kYXRhX18gPSBbXTtcbiAgdGhpcy5zaXplID0gMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsaXN0Q2FjaGVDbGVhcjtcbiIsInZhciBhc3NvY0luZGV4T2YgPSByZXF1aXJlKCcuL19hc3NvY0luZGV4T2YnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIGFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGU7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHNwbGljZSA9IGFycmF5UHJvdG8uc3BsaWNlO1xuXG4vKipcbiAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBsaXN0IGNhY2hlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBkZWxldGVcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVEZWxldGUoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgaWYgKGluZGV4IDwgMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgbGFzdEluZGV4ID0gZGF0YS5sZW5ndGggLSAxO1xuICBpZiAoaW5kZXggPT0gbGFzdEluZGV4KSB7XG4gICAgZGF0YS5wb3AoKTtcbiAgfSBlbHNlIHtcbiAgICBzcGxpY2UuY2FsbChkYXRhLCBpbmRleCwgMSk7XG4gIH1cbiAgLS10aGlzLnNpemU7XG4gIHJldHVybiB0cnVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxpc3RDYWNoZURlbGV0ZTtcbiIsInZhciBhc3NvY0luZGV4T2YgPSByZXF1aXJlKCcuL19hc3NvY0luZGV4T2YnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBsaXN0IGNhY2hlIHZhbHVlIGZvciBga2V5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZ2V0XG4gKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlR2V0KGtleSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG4gIHJldHVybiBpbmRleCA8IDAgPyB1bmRlZmluZWQgOiBkYXRhW2luZGV4XVsxXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsaXN0Q2FjaGVHZXQ7XG4iLCJ2YXIgYXNzb2NJbmRleE9mID0gcmVxdWlyZSgnLi9fYXNzb2NJbmRleE9mJyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgbGlzdCBjYWNoZSB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBoYXNcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVIYXMoa2V5KSB7XG4gIHJldHVybiBhc3NvY0luZGV4T2YodGhpcy5fX2RhdGFfXywga2V5KSA+IC0xO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxpc3RDYWNoZUhhcztcbiIsInZhciBhc3NvY0luZGV4T2YgPSByZXF1aXJlKCcuL19hc3NvY0luZGV4T2YnKTtcblxuLyoqXG4gKiBTZXRzIHRoZSBsaXN0IGNhY2hlIGBrZXlgIHRvIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIHNldFxuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBsaXN0IGNhY2hlIGluc3RhbmNlLlxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVTZXQoa2V5LCB2YWx1ZSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG4gIGlmIChpbmRleCA8IDApIHtcbiAgICArK3RoaXMuc2l6ZTtcbiAgICBkYXRhLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgfSBlbHNlIHtcbiAgICBkYXRhW2luZGV4XVsxXSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiB0aGlzO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxpc3RDYWNoZVNldDtcbiIsInZhciBIYXNoID0gcmVxdWlyZSgnLi9fSGFzaCcpLFxuICAgIExpc3RDYWNoZSA9IHJlcXVpcmUoJy4vX0xpc3RDYWNoZScpLFxuICAgIE1hcCA9IHJlcXVpcmUoJy4vX01hcCcpO1xuXG4vKipcbiAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIG1hcC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgY2xlYXJcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICovXG5mdW5jdGlvbiBtYXBDYWNoZUNsZWFyKCkge1xuICB0aGlzLnNpemUgPSAwO1xuICB0aGlzLl9fZGF0YV9fID0ge1xuICAgICdoYXNoJzogbmV3IEhhc2gsXG4gICAgJ21hcCc6IG5ldyAoTWFwIHx8IExpc3RDYWNoZSksXG4gICAgJ3N0cmluZyc6IG5ldyBIYXNoXG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwQ2FjaGVDbGVhcjtcbiIsInZhciBnZXRNYXBEYXRhID0gcmVxdWlyZSgnLi9fZ2V0TWFwRGF0YScpO1xuXG4vKipcbiAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBtYXAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGRlbGV0ZVxuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVEZWxldGUoa2V5KSB7XG4gIHZhciByZXN1bHQgPSBnZXRNYXBEYXRhKHRoaXMsIGtleSlbJ2RlbGV0ZSddKGtleSk7XG4gIHRoaXMuc2l6ZSAtPSByZXN1bHQgPyAxIDogMDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXBDYWNoZURlbGV0ZTtcbiIsInZhciBnZXRNYXBEYXRhID0gcmVxdWlyZSgnLi9fZ2V0TWFwRGF0YScpO1xuXG4vKipcbiAqIEdldHMgdGhlIG1hcCB2YWx1ZSBmb3IgYGtleWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGdldFxuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVHZXQoa2V5KSB7XG4gIHJldHVybiBnZXRNYXBEYXRhKHRoaXMsIGtleSkuZ2V0KGtleSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwQ2FjaGVHZXQ7XG4iLCJ2YXIgZ2V0TWFwRGF0YSA9IHJlcXVpcmUoJy4vX2dldE1hcERhdGEnKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBtYXAgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBtYXBDYWNoZUhhcyhrZXkpIHtcbiAgcmV0dXJuIGdldE1hcERhdGEodGhpcywga2V5KS5oYXMoa2V5KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXBDYWNoZUhhcztcbiIsInZhciBnZXRNYXBEYXRhID0gcmVxdWlyZSgnLi9fZ2V0TWFwRGF0YScpO1xuXG4vKipcbiAqIFNldHMgdGhlIG1hcCBga2V5YCB0byBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBzZXRcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBtYXAgY2FjaGUgaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlU2V0KGtleSwgdmFsdWUpIHtcbiAgdmFyIGRhdGEgPSBnZXRNYXBEYXRhKHRoaXMsIGtleSksXG4gICAgICBzaXplID0gZGF0YS5zaXplO1xuXG4gIGRhdGEuc2V0KGtleSwgdmFsdWUpO1xuICB0aGlzLnNpemUgKz0gZGF0YS5zaXplID09IHNpemUgPyAwIDogMTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwQ2FjaGVTZXQ7XG4iLCIvKipcbiAqIENvbnZlcnRzIGBtYXBgIHRvIGl0cyBrZXktdmFsdWUgcGFpcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBtYXAgVGhlIG1hcCB0byBjb252ZXJ0LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBrZXktdmFsdWUgcGFpcnMuXG4gKi9cbmZ1bmN0aW9uIG1hcFRvQXJyYXkobWFwKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgcmVzdWx0ID0gQXJyYXkobWFwLnNpemUpO1xuXG4gIG1hcC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICByZXN1bHRbKytpbmRleF0gPSBba2V5LCB2YWx1ZV07XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1hcFRvQXJyYXk7XG4iLCIvKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgbWF0Y2hlc1Byb3BlcnR5YCBmb3Igc291cmNlIHZhbHVlcyBzdWl0YWJsZVxuICogZm9yIHN0cmljdCBlcXVhbGl0eSBjb21wYXJpc29ucywgaS5lLiBgPT09YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcGFyYW0geyp9IHNyY1ZhbHVlIFRoZSB2YWx1ZSB0byBtYXRjaC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlKGtleSwgc3JjVmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0W2tleV0gPT09IHNyY1ZhbHVlICYmXG4gICAgICAoc3JjVmFsdWUgIT09IHVuZGVmaW5lZCB8fCAoa2V5IGluIE9iamVjdChvYmplY3QpKSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWF0Y2hlc1N0cmljdENvbXBhcmFibGU7XG4iLCJ2YXIgbWVtb2l6ZSA9IHJlcXVpcmUoJy4vbWVtb2l6ZScpO1xuXG4vKiogVXNlZCBhcyB0aGUgbWF4aW11bSBtZW1vaXplIGNhY2hlIHNpemUuICovXG52YXIgTUFYX01FTU9JWkVfU0laRSA9IDUwMDtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ubWVtb2l6ZWAgd2hpY2ggY2xlYXJzIHRoZSBtZW1vaXplZCBmdW5jdGlvbidzXG4gKiBjYWNoZSB3aGVuIGl0IGV4Y2VlZHMgYE1BWF9NRU1PSVpFX1NJWkVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBoYXZlIGl0cyBvdXRwdXQgbWVtb2l6ZWQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBtZW1vaXplZCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gbWVtb2l6ZUNhcHBlZChmdW5jKSB7XG4gIHZhciByZXN1bHQgPSBtZW1vaXplKGZ1bmMsIGZ1bmN0aW9uKGtleSkge1xuICAgIGlmIChjYWNoZS5zaXplID09PSBNQVhfTUVNT0laRV9TSVpFKSB7XG4gICAgICBjYWNoZS5jbGVhcigpO1xuICAgIH1cbiAgICByZXR1cm4ga2V5O1xuICB9KTtcblxuICB2YXIgY2FjaGUgPSByZXN1bHQuY2FjaGU7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWVtb2l6ZUNhcHBlZDtcbiIsInZhciBnZXROYXRpdmUgPSByZXF1aXJlKCcuL19nZXROYXRpdmUnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIG5hdGl2ZUNyZWF0ZSA9IGdldE5hdGl2ZShPYmplY3QsICdjcmVhdGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBuYXRpdmVDcmVhdGU7XG4iLCJ2YXIgb3ZlckFyZyA9IHJlcXVpcmUoJy4vX292ZXJBcmcnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZUtleXMgPSBvdmVyQXJnKE9iamVjdC5rZXlzLCBPYmplY3QpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5hdGl2ZUtleXM7XG4iLCIvKipcbiAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZVxuICogW2BPYmplY3Qua2V5c2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5rZXlzKVxuICogZXhjZXB0IHRoYXQgaXQgaW5jbHVkZXMgaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydGllcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gbmF0aXZlS2V5c0luKG9iamVjdCkge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIGlmIChvYmplY3QgIT0gbnVsbCkge1xuICAgIGZvciAodmFyIGtleSBpbiBPYmplY3Qob2JqZWN0KSkge1xuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuYXRpdmVLZXlzSW47XG4iLCJ2YXIgZnJlZUdsb2JhbCA9IHJlcXVpcmUoJy4vX2ZyZWVHbG9iYWwnKTtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBleHBvcnRzYC4gKi9cbnZhciBmcmVlRXhwb3J0cyA9IHR5cGVvZiBleHBvcnRzID09ICdvYmplY3QnICYmIGV4cG9ydHMgJiYgIWV4cG9ydHMubm9kZVR5cGUgJiYgZXhwb3J0cztcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBtb2R1bGVgLiAqL1xudmFyIGZyZWVNb2R1bGUgPSBmcmVlRXhwb3J0cyAmJiB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZSAmJiAhbW9kdWxlLm5vZGVUeXBlICYmIG1vZHVsZTtcblxuLyoqIERldGVjdCB0aGUgcG9wdWxhciBDb21tb25KUyBleHRlbnNpb24gYG1vZHVsZS5leHBvcnRzYC4gKi9cbnZhciBtb2R1bGVFeHBvcnRzID0gZnJlZU1vZHVsZSAmJiBmcmVlTW9kdWxlLmV4cG9ydHMgPT09IGZyZWVFeHBvcnRzO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYHByb2Nlc3NgIGZyb20gTm9kZS5qcy4gKi9cbnZhciBmcmVlUHJvY2VzcyA9IG1vZHVsZUV4cG9ydHMgJiYgZnJlZUdsb2JhbC5wcm9jZXNzO1xuXG4vKiogVXNlZCB0byBhY2Nlc3MgZmFzdGVyIE5vZGUuanMgaGVscGVycy4gKi9cbnZhciBub2RlVXRpbCA9IChmdW5jdGlvbigpIHtcbiAgdHJ5IHtcbiAgICAvLyBVc2UgYHV0aWwudHlwZXNgIGZvciBOb2RlLmpzIDEwKy5cbiAgICB2YXIgdHlwZXMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUucmVxdWlyZSAmJiBmcmVlTW9kdWxlLnJlcXVpcmUoJ3V0aWwnKS50eXBlcztcblxuICAgIGlmICh0eXBlcykge1xuICAgICAgcmV0dXJuIHR5cGVzO1xuICAgIH1cblxuICAgIC8vIExlZ2FjeSBgcHJvY2Vzcy5iaW5kaW5nKCd1dGlsJylgIGZvciBOb2RlLmpzIDwgMTAuXG4gICAgcmV0dXJuIGZyZWVQcm9jZXNzICYmIGZyZWVQcm9jZXNzLmJpbmRpbmcgJiYgZnJlZVByb2Nlc3MuYmluZGluZygndXRpbCcpO1xuICB9IGNhdGNoIChlKSB7fVxufSgpKTtcblxubW9kdWxlLmV4cG9ydHMgPSBub2RlVXRpbDtcbiIsIi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBuYXRpdmVPYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcgdXNpbmcgYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG9iamVjdFRvU3RyaW5nO1xuIiwiLyoqXG4gKiBDcmVhdGVzIGEgdW5hcnkgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGl0cyBhcmd1bWVudCB0cmFuc2Zvcm1lZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHRyYW5zZm9ybSBUaGUgYXJndW1lbnQgdHJhbnNmb3JtLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIG92ZXJBcmcoZnVuYywgdHJhbnNmb3JtKSB7XG4gIHJldHVybiBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gZnVuYyh0cmFuc2Zvcm0oYXJnKSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gb3ZlckFyZztcbiIsInZhciBhcHBseSA9IHJlcXVpcmUoJy4vX2FwcGx5Jyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVNYXggPSBNYXRoLm1heDtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VSZXN0YCB3aGljaCB0cmFuc2Zvcm1zIHRoZSByZXN0IGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD1mdW5jLmxlbmd0aC0xXSBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHJlc3QgcGFyYW1ldGVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gdHJhbnNmb3JtIFRoZSByZXN0IGFycmF5IHRyYW5zZm9ybS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBvdmVyUmVzdChmdW5jLCBzdGFydCwgdHJhbnNmb3JtKSB7XG4gIHN0YXJ0ID0gbmF0aXZlTWF4KHN0YXJ0ID09PSB1bmRlZmluZWQgPyAoZnVuYy5sZW5ndGggLSAxKSA6IHN0YXJ0LCAwKTtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBhcmdzID0gYXJndW1lbnRzLFxuICAgICAgICBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBuYXRpdmVNYXgoYXJncy5sZW5ndGggLSBzdGFydCwgMCksXG4gICAgICAgIGFycmF5ID0gQXJyYXkobGVuZ3RoKTtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBhcnJheVtpbmRleF0gPSBhcmdzW3N0YXJ0ICsgaW5kZXhdO1xuICAgIH1cbiAgICBpbmRleCA9IC0xO1xuICAgIHZhciBvdGhlckFyZ3MgPSBBcnJheShzdGFydCArIDEpO1xuICAgIHdoaWxlICgrK2luZGV4IDwgc3RhcnQpIHtcbiAgICAgIG90aGVyQXJnc1tpbmRleF0gPSBhcmdzW2luZGV4XTtcbiAgICB9XG4gICAgb3RoZXJBcmdzW3N0YXJ0XSA9IHRyYW5zZm9ybShhcnJheSk7XG4gICAgcmV0dXJuIGFwcGx5KGZ1bmMsIHRoaXMsIG90aGVyQXJncyk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gb3ZlclJlc3Q7XG4iLCJ2YXIgZnJlZUdsb2JhbCA9IHJlcXVpcmUoJy4vX2ZyZWVHbG9iYWwnKTtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBzZWxmYC4gKi9cbnZhciBmcmVlU2VsZiA9IHR5cGVvZiBzZWxmID09ICdvYmplY3QnICYmIHNlbGYgJiYgc2VsZi5PYmplY3QgPT09IE9iamVjdCAmJiBzZWxmO1xuXG4vKiogVXNlZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4gKi9cbnZhciByb290ID0gZnJlZUdsb2JhbCB8fCBmcmVlU2VsZiB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJvb3Q7XG4iLCIvKipcbiAqIEdldHMgdGhlIHZhbHVlIGF0IGBrZXlgLCB1bmxlc3MgYGtleWAgaXMgXCJfX3Byb3RvX19cIiBvciBcImNvbnN0cnVjdG9yXCIuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBzYWZlR2V0KG9iamVjdCwga2V5KSB7XG4gIGlmIChrZXkgPT09ICdjb25zdHJ1Y3RvcicgJiYgdHlwZW9mIG9iamVjdFtrZXldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGtleSA9PSAnX19wcm90b19fJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHJldHVybiBvYmplY3Rba2V5XTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzYWZlR2V0O1xuIiwiLyoqIFVzZWQgdG8gc3RhbmQtaW4gZm9yIGB1bmRlZmluZWRgIGhhc2ggdmFsdWVzLiAqL1xudmFyIEhBU0hfVU5ERUZJTkVEID0gJ19fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18nO1xuXG4vKipcbiAqIEFkZHMgYHZhbHVlYCB0byB0aGUgYXJyYXkgY2FjaGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGFkZFxuICogQG1lbWJlck9mIFNldENhY2hlXG4gKiBAYWxpYXMgcHVzaFxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2FjaGUuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjYWNoZSBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gc2V0Q2FjaGVBZGQodmFsdWUpIHtcbiAgdGhpcy5fX2RhdGFfXy5zZXQodmFsdWUsIEhBU0hfVU5ERUZJTkVEKTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2V0Q2FjaGVBZGQ7XG4iLCIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGluIHRoZSBhcnJheSBjYWNoZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgU2V0Q2FjaGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBzZXRDYWNoZUhhcyh2YWx1ZSkge1xuICByZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNldENhY2hlSGFzO1xuIiwiLyoqXG4gKiBDb252ZXJ0cyBgc2V0YCB0byBhbiBhcnJheSBvZiBpdHMgdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gc2V0IFRoZSBzZXQgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBzZXRUb0FycmF5KHNldCkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIHJlc3VsdCA9IEFycmF5KHNldC5zaXplKTtcblxuICBzZXQuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJlc3VsdFsrK2luZGV4XSA9IHZhbHVlO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzZXRUb0FycmF5O1xuIiwidmFyIGJhc2VTZXRUb1N0cmluZyA9IHJlcXVpcmUoJy4vX2Jhc2VTZXRUb1N0cmluZycpLFxuICAgIHNob3J0T3V0ID0gcmVxdWlyZSgnLi9fc2hvcnRPdXQnKTtcblxuLyoqXG4gKiBTZXRzIHRoZSBgdG9TdHJpbmdgIG1ldGhvZCBvZiBgZnVuY2AgdG8gcmV0dXJuIGBzdHJpbmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdHJpbmcgVGhlIGB0b1N0cmluZ2AgcmVzdWx0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBmdW5jYC5cbiAqL1xudmFyIHNldFRvU3RyaW5nID0gc2hvcnRPdXQoYmFzZVNldFRvU3RyaW5nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBzZXRUb1N0cmluZztcbiIsIi8qKiBVc2VkIHRvIGRldGVjdCBob3QgZnVuY3Rpb25zIGJ5IG51bWJlciBvZiBjYWxscyB3aXRoaW4gYSBzcGFuIG9mIG1pbGxpc2Vjb25kcy4gKi9cbnZhciBIT1RfQ09VTlQgPSA4MDAsXG4gICAgSE9UX1NQQU4gPSAxNjtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZU5vdyA9IERhdGUubm93O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0J2xsIHNob3J0IG91dCBhbmQgaW52b2tlIGBpZGVudGl0eWAgaW5zdGVhZFxuICogb2YgYGZ1bmNgIHdoZW4gaXQncyBjYWxsZWQgYEhPVF9DT1VOVGAgb3IgbW9yZSB0aW1lcyBpbiBgSE9UX1NQQU5gXG4gKiBtaWxsaXNlY29uZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc2hvcnRhYmxlIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBzaG9ydE91dChmdW5jKSB7XG4gIHZhciBjb3VudCA9IDAsXG4gICAgICBsYXN0Q2FsbGVkID0gMDtcblxuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0YW1wID0gbmF0aXZlTm93KCksXG4gICAgICAgIHJlbWFpbmluZyA9IEhPVF9TUEFOIC0gKHN0YW1wIC0gbGFzdENhbGxlZCk7XG5cbiAgICBsYXN0Q2FsbGVkID0gc3RhbXA7XG4gICAgaWYgKHJlbWFpbmluZyA+IDApIHtcbiAgICAgIGlmICgrK2NvdW50ID49IEhPVF9DT1VOVCkge1xuICAgICAgICByZXR1cm4gYXJndW1lbnRzWzBdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb3VudCA9IDA7XG4gICAgfVxuICAgIHJldHVybiBmdW5jLmFwcGx5KHVuZGVmaW5lZCwgYXJndW1lbnRzKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzaG9ydE91dDtcbiIsInZhciBMaXN0Q2FjaGUgPSByZXF1aXJlKCcuL19MaXN0Q2FjaGUnKTtcblxuLyoqXG4gKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBzdGFjay5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgY2xlYXJcbiAqIEBtZW1iZXJPZiBTdGFja1xuICovXG5mdW5jdGlvbiBzdGFja0NsZWFyKCkge1xuICB0aGlzLl9fZGF0YV9fID0gbmV3IExpc3RDYWNoZTtcbiAgdGhpcy5zaXplID0gMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdGFja0NsZWFyO1xuIiwiLyoqXG4gKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgc3RhY2suXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGRlbGV0ZVxuICogQG1lbWJlck9mIFN0YWNrXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gc3RhY2tEZWxldGUoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgIHJlc3VsdCA9IGRhdGFbJ2RlbGV0ZSddKGtleSk7XG5cbiAgdGhpcy5zaXplID0gZGF0YS5zaXplO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0YWNrRGVsZXRlO1xuIiwiLyoqXG4gKiBHZXRzIHRoZSBzdGFjayB2YWx1ZSBmb3IgYGtleWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGdldFxuICogQG1lbWJlck9mIFN0YWNrXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gc3RhY2tHZXQoa2V5KSB7XG4gIHJldHVybiB0aGlzLl9fZGF0YV9fLmdldChrZXkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0YWNrR2V0O1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYSBzdGFjayB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBoYXNcbiAqIEBtZW1iZXJPZiBTdGFja1xuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIHN0YWNrSGFzKGtleSkge1xuICByZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXMoa2V5KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdGFja0hhcztcbiIsInZhciBMaXN0Q2FjaGUgPSByZXF1aXJlKCcuL19MaXN0Q2FjaGUnKSxcbiAgICBNYXAgPSByZXF1aXJlKCcuL19NYXAnKSxcbiAgICBNYXBDYWNoZSA9IHJlcXVpcmUoJy4vX01hcENhY2hlJyk7XG5cbi8qKiBVc2VkIGFzIHRoZSBzaXplIHRvIGVuYWJsZSBsYXJnZSBhcnJheSBvcHRpbWl6YXRpb25zLiAqL1xudmFyIExBUkdFX0FSUkFZX1NJWkUgPSAyMDA7XG5cbi8qKlxuICogU2V0cyB0aGUgc3RhY2sgYGtleWAgdG8gYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgc2V0XG4gKiBAbWVtYmVyT2YgU3RhY2tcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgc3RhY2sgY2FjaGUgaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIHN0YWNrU2V0KGtleSwgdmFsdWUpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICBpZiAoZGF0YSBpbnN0YW5jZW9mIExpc3RDYWNoZSkge1xuICAgIHZhciBwYWlycyA9IGRhdGEuX19kYXRhX187XG4gICAgaWYgKCFNYXAgfHwgKHBhaXJzLmxlbmd0aCA8IExBUkdFX0FSUkFZX1NJWkUgLSAxKSkge1xuICAgICAgcGFpcnMucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgICAgdGhpcy5zaXplID0gKytkYXRhLnNpemU7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGF0YSA9IHRoaXMuX19kYXRhX18gPSBuZXcgTWFwQ2FjaGUocGFpcnMpO1xuICB9XG4gIGRhdGEuc2V0KGtleSwgdmFsdWUpO1xuICB0aGlzLnNpemUgPSBkYXRhLnNpemU7XG4gIHJldHVybiB0aGlzO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0YWNrU2V0O1xuIiwiLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uaW5kZXhPZmAgd2hpY2ggcGVyZm9ybXMgc3RyaWN0IGVxdWFsaXR5XG4gKiBjb21wYXJpc29ucyBvZiB2YWx1ZXMsIGkuZS4gYD09PWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAqL1xuZnVuY3Rpb24gc3RyaWN0SW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleCkge1xuICB2YXIgaW5kZXggPSBmcm9tSW5kZXggLSAxLFxuICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgaWYgKGFycmF5W2luZGV4XSA9PT0gdmFsdWUpIHtcbiAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0cmljdEluZGV4T2Y7XG4iLCJ2YXIgYXNjaWlTaXplID0gcmVxdWlyZSgnLi9fYXNjaWlTaXplJyksXG4gICAgaGFzVW5pY29kZSA9IHJlcXVpcmUoJy4vX2hhc1VuaWNvZGUnKSxcbiAgICB1bmljb2RlU2l6ZSA9IHJlcXVpcmUoJy4vX3VuaWNvZGVTaXplJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgaW4gYHN0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3RyaW5nIHNpemUuXG4gKi9cbmZ1bmN0aW9uIHN0cmluZ1NpemUoc3RyaW5nKSB7XG4gIHJldHVybiBoYXNVbmljb2RlKHN0cmluZylcbiAgICA/IHVuaWNvZGVTaXplKHN0cmluZylcbiAgICA6IGFzY2lpU2l6ZShzdHJpbmcpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0cmluZ1NpemU7XG4iLCJ2YXIgbWVtb2l6ZUNhcHBlZCA9IHJlcXVpcmUoJy4vX21lbW9pemVDYXBwZWQnKTtcblxuLyoqIFVzZWQgdG8gbWF0Y2ggcHJvcGVydHkgbmFtZXMgd2l0aGluIHByb3BlcnR5IHBhdGhzLiAqL1xudmFyIHJlUHJvcE5hbWUgPSAvW14uW1xcXV0rfFxcWyg/OigtP1xcZCsoPzpcXC5cXGQrKT8pfChbXCInXSkoKD86KD8hXFwyKVteXFxcXF18XFxcXC4pKj8pXFwyKVxcXXwoPz0oPzpcXC58XFxbXFxdKSg/OlxcLnxcXFtcXF18JCkpL2c7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIGJhY2tzbGFzaGVzIGluIHByb3BlcnR5IHBhdGhzLiAqL1xudmFyIHJlRXNjYXBlQ2hhciA9IC9cXFxcKFxcXFwpPy9nO1xuXG4vKipcbiAqIENvbnZlcnRzIGBzdHJpbmdgIHRvIGEgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHByb3BlcnR5IHBhdGggYXJyYXkuXG4gKi9cbnZhciBzdHJpbmdUb1BhdGggPSBtZW1vaXplQ2FwcGVkKGZ1bmN0aW9uKHN0cmluZykge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIGlmIChzdHJpbmcuY2hhckNvZGVBdCgwKSA9PT0gNDYgLyogLiAqLykge1xuICAgIHJlc3VsdC5wdXNoKCcnKTtcbiAgfVxuICBzdHJpbmcucmVwbGFjZShyZVByb3BOYW1lLCBmdW5jdGlvbihtYXRjaCwgbnVtYmVyLCBxdW90ZSwgc3ViU3RyaW5nKSB7XG4gICAgcmVzdWx0LnB1c2gocXVvdGUgPyBzdWJTdHJpbmcucmVwbGFjZShyZUVzY2FwZUNoYXIsICckMScpIDogKG51bWJlciB8fCBtYXRjaCkpO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHN0cmluZ1RvUGF0aDtcbiIsInZhciBpc1N5bWJvbCA9IHJlcXVpcmUoJy4vaXNTeW1ib2wnKTtcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgSU5GSU5JVFkgPSAxIC8gMDtcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc3RyaW5nIGtleSBpZiBpdCdzIG5vdCBhIHN0cmluZyBvciBzeW1ib2wuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7c3RyaW5nfHN5bWJvbH0gUmV0dXJucyB0aGUga2V5LlxuICovXG5mdW5jdGlvbiB0b0tleSh2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8IGlzU3ltYm9sKHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICB2YXIgcmVzdWx0ID0gKHZhbHVlICsgJycpO1xuICByZXR1cm4gKHJlc3VsdCA9PSAnMCcgJiYgKDEgLyB2YWx1ZSkgPT0gLUlORklOSVRZKSA/ICctMCcgOiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdG9LZXk7XG4iLCIvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgZnVuY1Byb3RvID0gRnVuY3Rpb24ucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG52YXIgZnVuY1RvU3RyaW5nID0gZnVuY1Byb3RvLnRvU3RyaW5nO1xuXG4vKipcbiAqIENvbnZlcnRzIGBmdW5jYCB0byBpdHMgc291cmNlIGNvZGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzb3VyY2UgY29kZS5cbiAqL1xuZnVuY3Rpb24gdG9Tb3VyY2UoZnVuYykge1xuICBpZiAoZnVuYyAhPSBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBmdW5jVG9TdHJpbmcuY2FsbChmdW5jKTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gKGZ1bmMgKyAnJyk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdG9Tb3VyY2U7XG4iLCIvKiogVXNlZCB0byBtYXRjaCBhIHNpbmdsZSB3aGl0ZXNwYWNlIGNoYXJhY3Rlci4gKi9cbnZhciByZVdoaXRlc3BhY2UgPSAvXFxzLztcblxuLyoqXG4gKiBVc2VkIGJ5IGBfLnRyaW1gIGFuZCBgXy50cmltRW5kYCB0byBnZXQgdGhlIGluZGV4IG9mIHRoZSBsYXN0IG5vbi13aGl0ZXNwYWNlXG4gKiBjaGFyYWN0ZXIgb2YgYHN0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLlxuICovXG5mdW5jdGlvbiB0cmltbWVkRW5kSW5kZXgoc3RyaW5nKSB7XG4gIHZhciBpbmRleCA9IHN0cmluZy5sZW5ndGg7XG5cbiAgd2hpbGUgKGluZGV4LS0gJiYgcmVXaGl0ZXNwYWNlLnRlc3Qoc3RyaW5nLmNoYXJBdChpbmRleCkpKSB7fVxuICByZXR1cm4gaW5kZXg7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdHJpbW1lZEVuZEluZGV4O1xuIiwiLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIGNoYXJhY3RlciBjbGFzc2VzLiAqL1xudmFyIHJzQXN0cmFsUmFuZ2UgPSAnXFxcXHVkODAwLVxcXFx1ZGZmZicsXG4gICAgcnNDb21ib01hcmtzUmFuZ2UgPSAnXFxcXHUwMzAwLVxcXFx1MDM2ZicsXG4gICAgcmVDb21ib0hhbGZNYXJrc1JhbmdlID0gJ1xcXFx1ZmUyMC1cXFxcdWZlMmYnLFxuICAgIHJzQ29tYm9TeW1ib2xzUmFuZ2UgPSAnXFxcXHUyMGQwLVxcXFx1MjBmZicsXG4gICAgcnNDb21ib1JhbmdlID0gcnNDb21ib01hcmtzUmFuZ2UgKyByZUNvbWJvSGFsZk1hcmtzUmFuZ2UgKyByc0NvbWJvU3ltYm9sc1JhbmdlLFxuICAgIHJzVmFyUmFuZ2UgPSAnXFxcXHVmZTBlXFxcXHVmZTBmJztcblxuLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIGNhcHR1cmUgZ3JvdXBzLiAqL1xudmFyIHJzQXN0cmFsID0gJ1snICsgcnNBc3RyYWxSYW5nZSArICddJyxcbiAgICByc0NvbWJvID0gJ1snICsgcnNDb21ib1JhbmdlICsgJ10nLFxuICAgIHJzRml0eiA9ICdcXFxcdWQ4M2NbXFxcXHVkZmZiLVxcXFx1ZGZmZl0nLFxuICAgIHJzTW9kaWZpZXIgPSAnKD86JyArIHJzQ29tYm8gKyAnfCcgKyByc0ZpdHogKyAnKScsXG4gICAgcnNOb25Bc3RyYWwgPSAnW14nICsgcnNBc3RyYWxSYW5nZSArICddJyxcbiAgICByc1JlZ2lvbmFsID0gJyg/OlxcXFx1ZDgzY1tcXFxcdWRkZTYtXFxcXHVkZGZmXSl7Mn0nLFxuICAgIHJzU3VyclBhaXIgPSAnW1xcXFx1ZDgwMC1cXFxcdWRiZmZdW1xcXFx1ZGMwMC1cXFxcdWRmZmZdJyxcbiAgICByc1pXSiA9ICdcXFxcdTIwMGQnO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgcmVnZXhlcy4gKi9cbnZhciByZU9wdE1vZCA9IHJzTW9kaWZpZXIgKyAnPycsXG4gICAgcnNPcHRWYXIgPSAnWycgKyByc1ZhclJhbmdlICsgJ10/JyxcbiAgICByc09wdEpvaW4gPSAnKD86JyArIHJzWldKICsgJyg/OicgKyBbcnNOb25Bc3RyYWwsIHJzUmVnaW9uYWwsIHJzU3VyclBhaXJdLmpvaW4oJ3wnKSArICcpJyArIHJzT3B0VmFyICsgcmVPcHRNb2QgKyAnKSonLFxuICAgIHJzU2VxID0gcnNPcHRWYXIgKyByZU9wdE1vZCArIHJzT3B0Sm9pbixcbiAgICByc1N5bWJvbCA9ICcoPzonICsgW3JzTm9uQXN0cmFsICsgcnNDb21ibyArICc/JywgcnNDb21ibywgcnNSZWdpb25hbCwgcnNTdXJyUGFpciwgcnNBc3RyYWxdLmpvaW4oJ3wnKSArICcpJztcblxuLyoqIFVzZWQgdG8gbWF0Y2ggW3N0cmluZyBzeW1ib2xzXShodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvamF2YXNjcmlwdC11bmljb2RlKS4gKi9cbnZhciByZVVuaWNvZGUgPSBSZWdFeHAocnNGaXR6ICsgJyg/PScgKyByc0ZpdHogKyAnKXwnICsgcnNTeW1ib2wgKyByc1NlcSwgJ2cnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBzaXplIG9mIGEgVW5pY29kZSBgc3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdHJpbmcgc2l6ZS5cbiAqL1xuZnVuY3Rpb24gdW5pY29kZVNpemUoc3RyaW5nKSB7XG4gIHZhciByZXN1bHQgPSByZVVuaWNvZGUubGFzdEluZGV4ID0gMDtcbiAgd2hpbGUgKHJlVW5pY29kZS50ZXN0KHN0cmluZykpIHtcbiAgICArK3Jlc3VsdDtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHVuaWNvZGVTaXplO1xuIiwidmFyIGJhc2VDbG9uZSA9IHJlcXVpcmUoJy4vX2Jhc2VDbG9uZScpO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciBjbG9uaW5nLiAqL1xudmFyIENMT05FX1NZTUJPTFNfRkxBRyA9IDQ7XG5cbi8qKlxuICogQ3JlYXRlcyBhIHNoYWxsb3cgY2xvbmUgb2YgYHZhbHVlYC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvbiB0aGVcbiAqIFtzdHJ1Y3R1cmVkIGNsb25lIGFsZ29yaXRobV0oaHR0cHM6Ly9tZG4uaW8vU3RydWN0dXJlZF9jbG9uZV9hbGdvcml0aG0pXG4gKiBhbmQgc3VwcG9ydHMgY2xvbmluZyBhcnJheXMsIGFycmF5IGJ1ZmZlcnMsIGJvb2xlYW5zLCBkYXRlIG9iamVjdHMsIG1hcHMsXG4gKiBudW1iZXJzLCBgT2JqZWN0YCBvYmplY3RzLCByZWdleGVzLCBzZXRzLCBzdHJpbmdzLCBzeW1ib2xzLCBhbmQgdHlwZWRcbiAqIGFycmF5cy4gVGhlIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb2YgYGFyZ3VtZW50c2Agb2JqZWN0cyBhcmUgY2xvbmVkXG4gKiBhcyBwbGFpbiBvYmplY3RzLiBBbiBlbXB0eSBvYmplY3QgaXMgcmV0dXJuZWQgZm9yIHVuY2xvbmVhYmxlIHZhbHVlcyBzdWNoXG4gKiBhcyBlcnJvciBvYmplY3RzLCBmdW5jdGlvbnMsIERPTSBub2RlcywgYW5kIFdlYWtNYXBzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjbG9uZS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBjbG9uZWQgdmFsdWUuXG4gKiBAc2VlIF8uY2xvbmVEZWVwXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3RzID0gW3sgJ2EnOiAxIH0sIHsgJ2InOiAyIH1dO1xuICpcbiAqIHZhciBzaGFsbG93ID0gXy5jbG9uZShvYmplY3RzKTtcbiAqIGNvbnNvbGUubG9nKHNoYWxsb3dbMF0gPT09IG9iamVjdHNbMF0pO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBjbG9uZSh2YWx1ZSkge1xuICByZXR1cm4gYmFzZUNsb25lKHZhbHVlLCBDTE9ORV9TWU1CT0xTX0ZMQUcpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNsb25lO1xuIiwidmFyIGJhc2VDbG9uZSA9IHJlcXVpcmUoJy4vX2Jhc2VDbG9uZScpO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciBjbG9uaW5nLiAqL1xudmFyIENMT05FX0RFRVBfRkxBRyA9IDEsXG4gICAgQ0xPTkVfU1lNQk9MU19GTEFHID0gNDtcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmNsb25lYCBleGNlcHQgdGhhdCBpdCByZWN1cnNpdmVseSBjbG9uZXMgYHZhbHVlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDEuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcmVjdXJzaXZlbHkgY2xvbmUuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZGVlcCBjbG9uZWQgdmFsdWUuXG4gKiBAc2VlIF8uY2xvbmVcbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdHMgPSBbeyAnYSc6IDEgfSwgeyAnYic6IDIgfV07XG4gKlxuICogdmFyIGRlZXAgPSBfLmNsb25lRGVlcChvYmplY3RzKTtcbiAqIGNvbnNvbGUubG9nKGRlZXBbMF0gPT09IG9iamVjdHNbMF0pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gY2xvbmVEZWVwKHZhbHVlKSB7XG4gIHJldHVybiBiYXNlQ2xvbmUodmFsdWUsIENMT05FX0RFRVBfRkxBRyB8IENMT05FX1NZTUJPTFNfRkxBRyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2xvbmVEZWVwO1xuIiwiLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGB2YWx1ZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjQuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHJldHVybiBmcm9tIHRoZSBuZXcgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb25zdGFudCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdHMgPSBfLnRpbWVzKDIsIF8uY29uc3RhbnQoeyAnYSc6IDEgfSkpO1xuICpcbiAqIGNvbnNvbGUubG9nKG9iamVjdHMpO1xuICogLy8gPT4gW3sgJ2EnOiAxIH0sIHsgJ2EnOiAxIH1dXG4gKlxuICogY29uc29sZS5sb2cob2JqZWN0c1swXSA9PT0gb2JqZWN0c1sxXSk7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGNvbnN0YW50KHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29uc3RhbnQ7XG4iLCJ2YXIgYmFzZVJlc3QgPSByZXF1aXJlKCcuL19iYXNlUmVzdCcpLFxuICAgIGVxID0gcmVxdWlyZSgnLi9lcScpLFxuICAgIGlzSXRlcmF0ZWVDYWxsID0gcmVxdWlyZSgnLi9faXNJdGVyYXRlZUNhbGwnKSxcbiAgICBrZXlzSW4gPSByZXF1aXJlKCcuL2tleXNJbicpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIEFzc2lnbnMgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBvZiBzb3VyY2VcbiAqIG9iamVjdHMgdG8gdGhlIGRlc3RpbmF0aW9uIG9iamVjdCBmb3IgYWxsIGRlc3RpbmF0aW9uIHByb3BlcnRpZXMgdGhhdFxuICogcmVzb2x2ZSB0byBgdW5kZWZpbmVkYC4gU291cmNlIG9iamVjdHMgYXJlIGFwcGxpZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0LlxuICogT25jZSBhIHByb3BlcnR5IGlzIHNldCwgYWRkaXRpb25hbCB2YWx1ZXMgb2YgdGhlIHNhbWUgcHJvcGVydHkgYXJlIGlnbm9yZWQuXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICogQHBhcmFtIHsuLi5PYmplY3R9IFtzb3VyY2VzXSBUaGUgc291cmNlIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICogQHNlZSBfLmRlZmF1bHRzRGVlcFxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmRlZmF1bHRzKHsgJ2EnOiAxIH0sIHsgJ2InOiAyIH0sIHsgJ2EnOiAzIH0pO1xuICogLy8gPT4geyAnYSc6IDEsICdiJzogMiB9XG4gKi9cbnZhciBkZWZhdWx0cyA9IGJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCwgc291cmNlcykge1xuICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcblxuICB2YXIgaW5kZXggPSAtMTtcbiAgdmFyIGxlbmd0aCA9IHNvdXJjZXMubGVuZ3RoO1xuICB2YXIgZ3VhcmQgPSBsZW5ndGggPiAyID8gc291cmNlc1syXSA6IHVuZGVmaW5lZDtcblxuICBpZiAoZ3VhcmQgJiYgaXNJdGVyYXRlZUNhbGwoc291cmNlc1swXSwgc291cmNlc1sxXSwgZ3VhcmQpKSB7XG4gICAgbGVuZ3RoID0gMTtcbiAgfVxuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHNvdXJjZSA9IHNvdXJjZXNbaW5kZXhdO1xuICAgIHZhciBwcm9wcyA9IGtleXNJbihzb3VyY2UpO1xuICAgIHZhciBwcm9wc0luZGV4ID0gLTE7XG4gICAgdmFyIHByb3BzTGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsrcHJvcHNJbmRleCA8IHByb3BzTGVuZ3RoKSB7XG4gICAgICB2YXIga2V5ID0gcHJvcHNbcHJvcHNJbmRleF07XG4gICAgICB2YXIgdmFsdWUgPSBvYmplY3Rba2V5XTtcblxuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAoZXEodmFsdWUsIG9iamVjdFByb3RvW2tleV0pICYmICFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkpIHtcbiAgICAgICAgb2JqZWN0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2JqZWN0O1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZGVmYXVsdHM7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZm9yRWFjaCcpO1xuIiwiLyoqXG4gKiBQZXJmb3JtcyBhXG4gKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICogY29tcGFyaXNvbiBiZXR3ZWVuIHR3byB2YWx1ZXMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgYXJlIGVxdWl2YWxlbnQuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxIH07XG4gKiB2YXIgb3RoZXIgPSB7ICdhJzogMSB9O1xuICpcbiAqIF8uZXEob2JqZWN0LCBvYmplY3QpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uZXEob2JqZWN0LCBvdGhlcik7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uZXEoJ2EnLCAnYScpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uZXEoJ2EnLCBPYmplY3QoJ2EnKSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uZXEoTmFOLCBOYU4pO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBlcSh2YWx1ZSwgb3RoZXIpIHtcbiAgcmV0dXJuIHZhbHVlID09PSBvdGhlciB8fCAodmFsdWUgIT09IHZhbHVlICYmIG90aGVyICE9PSBvdGhlcik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXE7XG4iLCJ2YXIgYXJyYXlGaWx0ZXIgPSByZXF1aXJlKCcuL19hcnJheUZpbHRlcicpLFxuICAgIGJhc2VGaWx0ZXIgPSByZXF1aXJlKCcuL19iYXNlRmlsdGVyJyksXG4gICAgYmFzZUl0ZXJhdGVlID0gcmVxdWlyZSgnLi9fYmFzZUl0ZXJhdGVlJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpO1xuXG4vKipcbiAqIEl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gLCByZXR1cm5pbmcgYW4gYXJyYXkgb2YgYWxsIGVsZW1lbnRzXG4gKiBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoIHRocmVlXG4gKiBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAqXG4gKiAqKk5vdGU6KiogVW5saWtlIGBfLnJlbW92ZWAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZpbHRlcmVkIGFycmF5LlxuICogQHNlZSBfLnJlamVjdFxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgdXNlcnMgPSBbXG4gKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9LFxuICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAqIF07XG4gKlxuICogXy5maWx0ZXIodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuICFvLmFjdGl2ZTsgfSk7XG4gKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnXVxuICpcbiAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLmZpbHRlcih1c2VycywgeyAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0pO1xuICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICpcbiAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8uZmlsdGVyKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnXVxuICpcbiAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5maWx0ZXIodXNlcnMsICdhY3RpdmUnKTtcbiAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5J11cbiAqXG4gKiAvLyBDb21iaW5pbmcgc2V2ZXJhbCBwcmVkaWNhdGVzIHVzaW5nIGBfLm92ZXJFdmVyeWAgb3IgYF8ub3ZlclNvbWVgLlxuICogXy5maWx0ZXIodXNlcnMsIF8ub3ZlclNvbWUoW3sgJ2FnZSc6IDM2IH0sIFsnYWdlJywgNDBdXSkpO1xuICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJywgJ2Jhcm5leSddXG4gKi9cbmZ1bmN0aW9uIGZpbHRlcihjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlGaWx0ZXIgOiBiYXNlRmlsdGVyO1xuICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBiYXNlSXRlcmF0ZWUocHJlZGljYXRlLCAzKSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZmlsdGVyO1xuIiwidmFyIGNyZWF0ZUZpbmQgPSByZXF1aXJlKCcuL19jcmVhdGVGaW5kJyksXG4gICAgZmluZEluZGV4ID0gcmVxdWlyZSgnLi9maW5kSW5kZXgnKTtcblxuLyoqXG4gKiBJdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYCwgcmV0dXJuaW5nIHRoZSBmaXJzdCBlbGVtZW50XG4gKiBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoIHRocmVlXG4gKiBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXRjaGVkIGVsZW1lbnQsIGVsc2UgYHVuZGVmaW5lZGAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciB1c2VycyA9IFtcbiAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9LFxuICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWdlJzogNDAsICdhY3RpdmUnOiBmYWxzZSB9LFxuICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWdlJzogMSwgICdhY3RpdmUnOiB0cnVlIH1cbiAqIF07XG4gKlxuICogXy5maW5kKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLmFnZSA8IDQwOyB9KTtcbiAqIC8vID0+IG9iamVjdCBmb3IgJ2Jhcm5leSdcbiAqXG4gKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5maW5kKHVzZXJzLCB7ICdhZ2UnOiAxLCAnYWN0aXZlJzogdHJ1ZSB9KTtcbiAqIC8vID0+IG9iamVjdCBmb3IgJ3BlYmJsZXMnXG4gKlxuICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5maW5kKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gKiAvLyA9PiBvYmplY3QgZm9yICdmcmVkJ1xuICpcbiAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5maW5kKHVzZXJzLCAnYWN0aXZlJyk7XG4gKiAvLyA9PiBvYmplY3QgZm9yICdiYXJuZXknXG4gKi9cbnZhciBmaW5kID0gY3JlYXRlRmluZChmaW5kSW5kZXgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZpbmQ7XG4iLCJ2YXIgYmFzZUZpbmRJbmRleCA9IHJlcXVpcmUoJy4vX2Jhc2VGaW5kSW5kZXgnKSxcbiAgICBiYXNlSXRlcmF0ZWUgPSByZXF1aXJlKCcuL19iYXNlSXRlcmF0ZWUnKSxcbiAgICB0b0ludGVnZXIgPSByZXF1aXJlKCcuL3RvSW50ZWdlcicpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlTWF4ID0gTWF0aC5tYXg7XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5maW5kYCBleGNlcHQgdGhhdCBpdCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3RcbiAqIGVsZW1lbnQgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yIGluc3RlYWQgb2YgdGhlIGVsZW1lbnQgaXRzZWxmLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMS4xLjBcbiAqIEBjYXRlZ29yeSBBcnJheVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD0wXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZm91bmQgZWxlbWVudCwgZWxzZSBgLTFgLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgdXNlcnMgPSBbXG4gKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhY3RpdmUnOiBmYWxzZSB9LFxuICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IHRydWUgfVxuICogXTtcbiAqXG4gKiBfLmZpbmRJbmRleCh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby51c2VyID09ICdiYXJuZXknOyB9KTtcbiAqIC8vID0+IDBcbiAqXG4gKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5maW5kSW5kZXgodXNlcnMsIHsgJ3VzZXInOiAnZnJlZCcsICdhY3RpdmUnOiBmYWxzZSB9KTtcbiAqIC8vID0+IDFcbiAqXG4gKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLmZpbmRJbmRleCh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICogLy8gPT4gMFxuICpcbiAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5maW5kSW5kZXgodXNlcnMsICdhY3RpdmUnKTtcbiAqIC8vID0+IDJcbiAqL1xuZnVuY3Rpb24gZmluZEluZGV4KGFycmF5LCBwcmVkaWNhdGUsIGZyb21JbmRleCkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gIGlmICghbGVuZ3RoKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIHZhciBpbmRleCA9IGZyb21JbmRleCA9PSBudWxsID8gMCA6IHRvSW50ZWdlcihmcm9tSW5kZXgpO1xuICBpZiAoaW5kZXggPCAwKSB7XG4gICAgaW5kZXggPSBuYXRpdmVNYXgobGVuZ3RoICsgaW5kZXgsIDApO1xuICB9XG4gIHJldHVybiBiYXNlRmluZEluZGV4KGFycmF5LCBiYXNlSXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgaW5kZXgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZpbmRJbmRleDtcbiIsInZhciBiYXNlRmxhdHRlbiA9IHJlcXVpcmUoJy4vX2Jhc2VGbGF0dGVuJyk7XG5cbi8qKlxuICogRmxhdHRlbnMgYGFycmF5YCBhIHNpbmdsZSBsZXZlbCBkZWVwLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBBcnJheVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZsYXR0ZW4uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uZmxhdHRlbihbMSwgWzIsIFszLCBbNF1dLCA1XV0pO1xuICogLy8gPT4gWzEsIDIsIFszLCBbNF1dLCA1XVxuICovXG5mdW5jdGlvbiBmbGF0dGVuKGFycmF5KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgcmV0dXJuIGxlbmd0aCA/IGJhc2VGbGF0dGVuKGFycmF5LCAxKSA6IFtdO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZsYXR0ZW47XG4iLCJ2YXIgYXJyYXlFYWNoID0gcmVxdWlyZSgnLi9fYXJyYXlFYWNoJyksXG4gICAgYmFzZUVhY2ggPSByZXF1aXJlKCcuL19iYXNlRWFjaCcpLFxuICAgIGNhc3RGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2Nhc3RGdW5jdGlvbicpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKTtcblxuLyoqXG4gKiBJdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYCBhbmQgaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBlYWNoIGVsZW1lbnQuXG4gKiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICogSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0IGl0ZXJhdGlvbiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLlxuICpcbiAqICoqTm90ZToqKiBBcyB3aXRoIG90aGVyIFwiQ29sbGVjdGlvbnNcIiBtZXRob2RzLCBvYmplY3RzIHdpdGggYSBcImxlbmd0aFwiXG4gKiBwcm9wZXJ0eSBhcmUgaXRlcmF0ZWQgbGlrZSBhcnJheXMuIFRvIGF2b2lkIHRoaXMgYmVoYXZpb3IgdXNlIGBfLmZvckluYFxuICogb3IgYF8uZm9yT3duYCBmb3Igb2JqZWN0IGl0ZXJhdGlvbi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAYWxpYXMgZWFjaFxuICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fE9iamVjdH0gUmV0dXJucyBgY29sbGVjdGlvbmAuXG4gKiBAc2VlIF8uZm9yRWFjaFJpZ2h0XG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uZm9yRWFjaChbMSwgMl0sIGZ1bmN0aW9uKHZhbHVlKSB7XG4gKiAgIGNvbnNvbGUubG9nKHZhbHVlKTtcbiAqIH0pO1xuICogLy8gPT4gTG9ncyBgMWAgdGhlbiBgMmAuXG4gKlxuICogXy5mb3JFYWNoKHsgJ2EnOiAxLCAnYic6IDIgfSwgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICogICBjb25zb2xlLmxvZyhrZXkpO1xuICogfSk7XG4gKiAvLyA9PiBMb2dzICdhJyB0aGVuICdiJyAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKS5cbiAqL1xuZnVuY3Rpb24gZm9yRWFjaChjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheUVhY2ggOiBiYXNlRWFjaDtcbiAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgY2FzdEZ1bmN0aW9uKGl0ZXJhdGVlKSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZm9yRWFjaDtcbiIsInZhciBiYXNlRm9yID0gcmVxdWlyZSgnLi9fYmFzZUZvcicpLFxuICAgIGNhc3RGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2Nhc3RGdW5jdGlvbicpLFxuICAgIGtleXNJbiA9IHJlcXVpcmUoJy4va2V5c0luJyk7XG5cbi8qKlxuICogSXRlcmF0ZXMgb3ZlciBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIGFuXG4gKiBvYmplY3QgYW5kIGludm9rZXMgYGl0ZXJhdGVlYCBmb3IgZWFjaCBwcm9wZXJ0eS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWRcbiAqIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGtleSwgb2JqZWN0KS4gSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0XG4gKiBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMy4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICogQHNlZSBfLmZvckluUmlnaHRcbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogICB0aGlzLmIgPSAyO1xuICogfVxuICpcbiAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gKlxuICogXy5mb3JJbihuZXcgRm9vLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gKiAgIGNvbnNvbGUubG9nKGtleSk7XG4gKiB9KTtcbiAqIC8vID0+IExvZ3MgJ2EnLCAnYicsIHRoZW4gJ2MnIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpLlxuICovXG5mdW5jdGlvbiBmb3JJbihvYmplY3QsIGl0ZXJhdGVlKSB7XG4gIHJldHVybiBvYmplY3QgPT0gbnVsbFxuICAgID8gb2JqZWN0XG4gICAgOiBiYXNlRm9yKG9iamVjdCwgY2FzdEZ1bmN0aW9uKGl0ZXJhdGVlKSwga2V5c0luKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmb3JJbjtcbiIsInZhciBiYXNlR2V0ID0gcmVxdWlyZSgnLi9fYmFzZUdldCcpO1xuXG4vKipcbiAqIEdldHMgdGhlIHZhbHVlIGF0IGBwYXRoYCBvZiBgb2JqZWN0YC4gSWYgdGhlIHJlc29sdmVkIHZhbHVlIGlzXG4gKiBgdW5kZWZpbmVkYCwgdGhlIGBkZWZhdWx0VmFsdWVgIGlzIHJldHVybmVkIGluIGl0cyBwbGFjZS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuNy4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHBhcmFtIHsqfSBbZGVmYXVsdFZhbHVlXSBUaGUgdmFsdWUgcmV0dXJuZWQgZm9yIGB1bmRlZmluZWRgIHJlc29sdmVkIHZhbHVlcy5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiAzIH0gfV0gfTtcbiAqXG4gKiBfLmdldChvYmplY3QsICdhWzBdLmIuYycpO1xuICogLy8gPT4gM1xuICpcbiAqIF8uZ2V0KG9iamVjdCwgWydhJywgJzAnLCAnYicsICdjJ10pO1xuICogLy8gPT4gM1xuICpcbiAqIF8uZ2V0KG9iamVjdCwgJ2EuYi5jJywgJ2RlZmF1bHQnKTtcbiAqIC8vID0+ICdkZWZhdWx0J1xuICovXG5mdW5jdGlvbiBnZXQob2JqZWN0LCBwYXRoLCBkZWZhdWx0VmFsdWUpIHtcbiAgdmFyIHJlc3VsdCA9IG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogYmFzZUdldChvYmplY3QsIHBhdGgpO1xuICByZXR1cm4gcmVzdWx0ID09PSB1bmRlZmluZWQgPyBkZWZhdWx0VmFsdWUgOiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0O1xuIiwidmFyIGJhc2VIYXMgPSByZXF1aXJlKCcuL19iYXNlSGFzJyksXG4gICAgaGFzUGF0aCA9IHJlcXVpcmUoJy4vX2hhc1BhdGgnKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHBhdGhgIGlzIGEgZGlyZWN0IHByb3BlcnR5IG9mIGBvYmplY3RgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBwYXRoYCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiB7ICdiJzogMiB9IH07XG4gKiB2YXIgb3RoZXIgPSBfLmNyZWF0ZSh7ICdhJzogXy5jcmVhdGUoeyAnYic6IDIgfSkgfSk7XG4gKlxuICogXy5oYXMob2JqZWN0LCAnYScpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaGFzKG9iamVjdCwgJ2EuYicpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaGFzKG9iamVjdCwgWydhJywgJ2InXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5oYXMob3RoZXIsICdhJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBoYXMob2JqZWN0LCBwYXRoKSB7XG4gIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBoYXNQYXRoKG9iamVjdCwgcGF0aCwgYmFzZUhhcyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzO1xuIiwidmFyIGJhc2VIYXNJbiA9IHJlcXVpcmUoJy4vX2Jhc2VIYXNJbicpLFxuICAgIGhhc1BhdGggPSByZXF1aXJlKCcuL19oYXNQYXRoJyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGBwYXRoYCBpcyBhIGRpcmVjdCBvciBpbmhlcml0ZWQgcHJvcGVydHkgb2YgYG9iamVjdGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHBhdGhgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0gXy5jcmVhdGUoeyAnYSc6IF8uY3JlYXRlKHsgJ2InOiAyIH0pIH0pO1xuICpcbiAqIF8uaGFzSW4ob2JqZWN0LCAnYScpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaGFzSW4ob2JqZWN0LCAnYS5iJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5oYXNJbihvYmplY3QsIFsnYScsICdiJ10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaGFzSW4ob2JqZWN0LCAnYicpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaGFzSW4ob2JqZWN0LCBwYXRoKSB7XG4gIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBoYXNQYXRoKG9iamVjdCwgcGF0aCwgYmFzZUhhc0luKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNJbjtcbiIsIi8qKlxuICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgZmlyc3QgYXJndW1lbnQgaXQgcmVjZWl2ZXMuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgQW55IHZhbHVlLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgYHZhbHVlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxIH07XG4gKlxuICogY29uc29sZS5sb2coXy5pZGVudGl0eShvYmplY3QpID09PSBvYmplY3QpO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBpZGVudGl0eSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaWRlbnRpdHk7XG4iLCJ2YXIgYmFzZUlzQXJndW1lbnRzID0gcmVxdWlyZSgnLi9fYmFzZUlzQXJndW1lbnRzJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgcHJvcGVydHlJc0VudW1lcmFibGUgPSBvYmplY3RQcm90by5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBsaWtlbHkgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGBhcmd1bWVudHNgIG9iamVjdCxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcmd1bWVudHMoZnVuY3Rpb24oKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FyZ3VtZW50cyhbMSwgMiwgM10pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzQXJndW1lbnRzID0gYmFzZUlzQXJndW1lbnRzKGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID8gYmFzZUlzQXJndW1lbnRzIDogZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgJ2NhbGxlZScpICYmXG4gICAgIXByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodmFsdWUsICdjYWxsZWUnKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gaXNBcmd1bWVudHM7XG4iLCIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYW4gYEFycmF5YCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FycmF5KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5KGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXkoJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXkoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcblxubW9kdWxlLmV4cG9ydHMgPSBpc0FycmF5O1xuIiwidmFyIGlzRnVuY3Rpb24gPSByZXF1aXJlKCcuL2lzRnVuY3Rpb24nKSxcbiAgICBpc0xlbmd0aCA9IHJlcXVpcmUoJy4vaXNMZW5ndGgnKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhcnJheS1saWtlLiBBIHZhbHVlIGlzIGNvbnNpZGVyZWQgYXJyYXktbGlrZSBpZiBpdCdzXG4gKiBub3QgYSBmdW5jdGlvbiBhbmQgaGFzIGEgYHZhbHVlLmxlbmd0aGAgdGhhdCdzIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIG9yXG4gKiBlcXVhbCB0byBgMGAgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byBgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFycmF5LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FycmF5TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZSgnYWJjJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheUxpa2UodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgaXNMZW5ndGgodmFsdWUubGVuZ3RoKSAmJiAhaXNGdW5jdGlvbih2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNBcnJheUxpa2U7XG4iLCJ2YXIgaXNBcnJheUxpa2UgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmlzQXJyYXlMaWtlYCBleGNlcHQgdGhhdCBpdCBhbHNvIGNoZWNrcyBpZiBgdmFsdWVgXG4gKiBpcyBhbiBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXktbGlrZSBvYmplY3QsXG4gKiAgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZU9iamVjdChkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5TGlrZU9iamVjdChfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheUxpa2VPYmplY3QodmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgaXNBcnJheUxpa2UodmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQXJyYXlMaWtlT2JqZWN0O1xuIiwidmFyIHJvb3QgPSByZXF1aXJlKCcuL19yb290JyksXG4gICAgc3R1YkZhbHNlID0gcmVxdWlyZSgnLi9zdHViRmFsc2UnKTtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBleHBvcnRzYC4gKi9cbnZhciBmcmVlRXhwb3J0cyA9IHR5cGVvZiBleHBvcnRzID09ICdvYmplY3QnICYmIGV4cG9ydHMgJiYgIWV4cG9ydHMubm9kZVR5cGUgJiYgZXhwb3J0cztcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBtb2R1bGVgLiAqL1xudmFyIGZyZWVNb2R1bGUgPSBmcmVlRXhwb3J0cyAmJiB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZSAmJiAhbW9kdWxlLm5vZGVUeXBlICYmIG1vZHVsZTtcblxuLyoqIERldGVjdCB0aGUgcG9wdWxhciBDb21tb25KUyBleHRlbnNpb24gYG1vZHVsZS5leHBvcnRzYC4gKi9cbnZhciBtb2R1bGVFeHBvcnRzID0gZnJlZU1vZHVsZSAmJiBmcmVlTW9kdWxlLmV4cG9ydHMgPT09IGZyZWVFeHBvcnRzO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBCdWZmZXIgPSBtb2R1bGVFeHBvcnRzID8gcm9vdC5CdWZmZXIgOiB1bmRlZmluZWQ7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVJc0J1ZmZlciA9IEJ1ZmZlciA/IEJ1ZmZlci5pc0J1ZmZlciA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIGJ1ZmZlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMy4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGJ1ZmZlciwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQnVmZmVyKG5ldyBCdWZmZXIoMikpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNCdWZmZXIobmV3IFVpbnQ4QXJyYXkoMikpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzQnVmZmVyID0gbmF0aXZlSXNCdWZmZXIgfHwgc3R1YkZhbHNlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQnVmZmVyO1xuIiwidmFyIGJhc2VLZXlzID0gcmVxdWlyZSgnLi9fYmFzZUtleXMnKSxcbiAgICBnZXRUYWcgPSByZXF1aXJlKCcuL19nZXRUYWcnKSxcbiAgICBpc0FyZ3VtZW50cyA9IHJlcXVpcmUoJy4vaXNBcmd1bWVudHMnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNBcnJheUxpa2UgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlJyksXG4gICAgaXNCdWZmZXIgPSByZXF1aXJlKCcuL2lzQnVmZmVyJyksXG4gICAgaXNQcm90b3R5cGUgPSByZXF1aXJlKCcuL19pc1Byb3RvdHlwZScpLFxuICAgIGlzVHlwZWRBcnJheSA9IHJlcXVpcmUoJy4vaXNUeXBlZEFycmF5Jyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBtYXBUYWcgPSAnW29iamVjdCBNYXBdJyxcbiAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhbiBlbXB0eSBvYmplY3QsIGNvbGxlY3Rpb24sIG1hcCwgb3Igc2V0LlxuICpcbiAqIE9iamVjdHMgYXJlIGNvbnNpZGVyZWQgZW1wdHkgaWYgdGhleSBoYXZlIG5vIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZFxuICogcHJvcGVydGllcy5cbiAqXG4gKiBBcnJheS1saWtlIHZhbHVlcyBzdWNoIGFzIGBhcmd1bWVudHNgIG9iamVjdHMsIGFycmF5cywgYnVmZmVycywgc3RyaW5ncywgb3JcbiAqIGpRdWVyeS1saWtlIGNvbGxlY3Rpb25zIGFyZSBjb25zaWRlcmVkIGVtcHR5IGlmIHRoZXkgaGF2ZSBhIGBsZW5ndGhgIG9mIGAwYC5cbiAqIFNpbWlsYXJseSwgbWFwcyBhbmQgc2V0cyBhcmUgY29uc2lkZXJlZCBlbXB0eSBpZiB0aGV5IGhhdmUgYSBgc2l6ZWAgb2YgYDBgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGVtcHR5LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNFbXB0eShudWxsKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzRW1wdHkodHJ1ZSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0VtcHR5KDEpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNFbXB0eShbMSwgMiwgM10pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzRW1wdHkoeyAnYSc6IDEgfSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0VtcHR5KHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKGlzQXJyYXlMaWtlKHZhbHVlKSAmJlxuICAgICAgKGlzQXJyYXkodmFsdWUpIHx8IHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUuc3BsaWNlID09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgaXNCdWZmZXIodmFsdWUpIHx8IGlzVHlwZWRBcnJheSh2YWx1ZSkgfHwgaXNBcmd1bWVudHModmFsdWUpKSkge1xuICAgIHJldHVybiAhdmFsdWUubGVuZ3RoO1xuICB9XG4gIHZhciB0YWcgPSBnZXRUYWcodmFsdWUpO1xuICBpZiAodGFnID09IG1hcFRhZyB8fCB0YWcgPT0gc2V0VGFnKSB7XG4gICAgcmV0dXJuICF2YWx1ZS5zaXplO1xuICB9XG4gIGlmIChpc1Byb3RvdHlwZSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gIWJhc2VLZXlzKHZhbHVlKS5sZW5ndGg7XG4gIH1cbiAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGtleSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNFbXB0eTtcbiIsInZhciBiYXNlR2V0VGFnID0gcmVxdWlyZSgnLi9fYmFzZUdldFRhZycpLFxuICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYXN5bmNUYWcgPSAnW29iamVjdCBBc3luY0Z1bmN0aW9uXScsXG4gICAgZnVuY1RhZyA9ICdbb2JqZWN0IEZ1bmN0aW9uXScsXG4gICAgZ2VuVGFnID0gJ1tvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dJyxcbiAgICBwcm94eVRhZyA9ICdbb2JqZWN0IFByb3h5XSc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBGdW5jdGlvbmAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgZnVuY3Rpb24sIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0Z1bmN0aW9uKF8pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNGdW5jdGlvbigvYWJjLyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKSB7XG4gIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIFRoZSB1c2Ugb2YgYE9iamVjdCN0b1N0cmluZ2AgYXZvaWRzIGlzc3VlcyB3aXRoIHRoZSBgdHlwZW9mYCBvcGVyYXRvclxuICAvLyBpbiBTYWZhcmkgOSB3aGljaCByZXR1cm5zICdvYmplY3QnIGZvciB0eXBlZCBhcnJheXMgYW5kIG90aGVyIGNvbnN0cnVjdG9ycy5cbiAgdmFyIHRhZyA9IGJhc2VHZXRUYWcodmFsdWUpO1xuICByZXR1cm4gdGFnID09IGZ1bmNUYWcgfHwgdGFnID09IGdlblRhZyB8fCB0YWcgPT0gYXN5bmNUYWcgfHwgdGFnID09IHByb3h5VGFnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzRnVuY3Rpb247XG4iLCIvKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBNQVhfU0FGRV9JTlRFR0VSID0gOTAwNzE5OTI1NDc0MDk5MTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGFycmF5LWxpa2UgbGVuZ3RoLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gKiBbYFRvTGVuZ3RoYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9sZW5ndGgpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgbGVuZ3RoLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNMZW5ndGgoMyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0xlbmd0aChOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0xlbmd0aChJbmZpbml0eSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNMZW5ndGgoJzMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzTGVuZ3RoKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiZcbiAgICB2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDw9IE1BWF9TQUZFX0lOVEVHRVI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNMZW5ndGg7XG4iLCJ2YXIgYmFzZUlzTWFwID0gcmVxdWlyZSgnLi9fYmFzZUlzTWFwJyksXG4gICAgYmFzZVVuYXJ5ID0gcmVxdWlyZSgnLi9fYmFzZVVuYXJ5JyksXG4gICAgbm9kZVV0aWwgPSByZXF1aXJlKCcuL19ub2RlVXRpbCcpO1xuXG4vKiBOb2RlLmpzIGhlbHBlciByZWZlcmVuY2VzLiAqL1xudmFyIG5vZGVJc01hcCA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzTWFwO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgTWFwYCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjMuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBtYXAsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc01hcChuZXcgTWFwKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzTWFwKG5ldyBXZWFrTWFwKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc01hcCA9IG5vZGVJc01hcCA/IGJhc2VVbmFyeShub2RlSXNNYXApIDogYmFzZUlzTWFwO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzTWFwO1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyB0aGVcbiAqIFtsYW5ndWFnZSB0eXBlXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcylcbiAqIG9mIGBPYmplY3RgLiAoZS5nLiBhcnJheXMsIGZ1bmN0aW9ucywgb2JqZWN0cywgcmVnZXhlcywgYG5ldyBOdW1iZXIoMClgLCBhbmQgYG5ldyBTdHJpbmcoJycpYClcbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdCh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoXy5ub29wKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNPYmplY3Q7XG4iLCIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc09iamVjdExpa2U7XG4iLCJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBnZXRQcm90b3R5cGUgPSByZXF1aXJlKCcuL19nZXRQcm90b3R5cGUnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XSc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBmdW5jUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGUsXG4gICAgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG52YXIgZnVuY1RvU3RyaW5nID0gZnVuY1Byb3RvLnRvU3RyaW5nO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKiogVXNlZCB0byBpbmZlciB0aGUgYE9iamVjdGAgY29uc3RydWN0b3IuICovXG52YXIgb2JqZWN0Q3RvclN0cmluZyA9IGZ1bmNUb1N0cmluZy5jYWxsKE9iamVjdCk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmplY3QsIHRoYXQgaXMsIGFuIG9iamVjdCBjcmVhdGVkIGJ5IHRoZVxuICogYE9iamVjdGAgY29uc3RydWN0b3Igb3Igb25lIHdpdGggYSBgW1tQcm90b3R5cGVdXWAgb2YgYG51bGxgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC44LjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcGxhaW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIEZvbygpIHtcbiAqICAgdGhpcy5hID0gMTtcbiAqIH1cbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QobmV3IEZvbyk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QoeyAneCc6IDAsICd5JzogMCB9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QoT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgaWYgKCFpc09iamVjdExpa2UodmFsdWUpIHx8IGJhc2VHZXRUYWcodmFsdWUpICE9IG9iamVjdFRhZykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgcHJvdG8gPSBnZXRQcm90b3R5cGUodmFsdWUpO1xuICBpZiAocHJvdG8gPT09IG51bGwpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB2YXIgQ3RvciA9IGhhc093blByb3BlcnR5LmNhbGwocHJvdG8sICdjb25zdHJ1Y3RvcicpICYmIHByb3RvLmNvbnN0cnVjdG9yO1xuICByZXR1cm4gdHlwZW9mIEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBDdG9yIGluc3RhbmNlb2YgQ3RvciAmJlxuICAgIGZ1bmNUb1N0cmluZy5jYWxsKEN0b3IpID09IG9iamVjdEN0b3JTdHJpbmc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNQbGFpbk9iamVjdDtcbiIsInZhciBiYXNlSXNTZXQgPSByZXF1aXJlKCcuL19iYXNlSXNTZXQnKSxcbiAgICBiYXNlVW5hcnkgPSByZXF1aXJlKCcuL19iYXNlVW5hcnknKSxcbiAgICBub2RlVXRpbCA9IHJlcXVpcmUoJy4vX25vZGVVdGlsJyk7XG5cbi8qIE5vZGUuanMgaGVscGVyIHJlZmVyZW5jZXMuICovXG52YXIgbm9kZUlzU2V0ID0gbm9kZVV0aWwgJiYgbm9kZVV0aWwuaXNTZXQ7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTZXRgIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMy4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHNldCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzU2V0KG5ldyBTZXQpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNTZXQobmV3IFdlYWtTZXQpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzU2V0ID0gbm9kZUlzU2V0ID8gYmFzZVVuYXJ5KG5vZGVJc1NldCkgOiBiYXNlSXNTZXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNTZXQ7XG4iLCJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIHN0cmluZ1RhZyA9ICdbb2JqZWN0IFN0cmluZ10nO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3RyaW5nYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3RyaW5nLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNTdHJpbmcoJ2FiYycpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNTdHJpbmcoMSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1N0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8XG4gICAgKCFpc0FycmF5KHZhbHVlKSAmJiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IHN0cmluZ1RhZyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNTdHJpbmc7XG4iLCJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXSc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTeW1ib2xgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzeW1ib2wsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1N5bWJvbChTeW1ib2wuaXRlcmF0b3IpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNTeW1ib2woJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTeW1ib2wodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3ltYm9sJyB8fFxuICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IHN5bWJvbFRhZyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNTeW1ib2w7XG4iLCJ2YXIgYmFzZUlzVHlwZWRBcnJheSA9IHJlcXVpcmUoJy4vX2Jhc2VJc1R5cGVkQXJyYXknKSxcbiAgICBiYXNlVW5hcnkgPSByZXF1aXJlKCcuL19iYXNlVW5hcnknKSxcbiAgICBub2RlVXRpbCA9IHJlcXVpcmUoJy4vX25vZGVVdGlsJyk7XG5cbi8qIE5vZGUuanMgaGVscGVyIHJlZmVyZW5jZXMuICovXG52YXIgbm9kZUlzVHlwZWRBcnJheSA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzVHlwZWRBcnJheTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgdHlwZWQgYXJyYXkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB0eXBlZCBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzVHlwZWRBcnJheShuZXcgVWludDhBcnJheSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1R5cGVkQXJyYXkoW10pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzVHlwZWRBcnJheSA9IG5vZGVJc1R5cGVkQXJyYXkgPyBiYXNlVW5hcnkobm9kZUlzVHlwZWRBcnJheSkgOiBiYXNlSXNUeXBlZEFycmF5O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzVHlwZWRBcnJheTtcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYHVuZGVmaW5lZGAuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYHVuZGVmaW5lZGAsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1VuZGVmaW5lZCh2b2lkIDApO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNVbmRlZmluZWQobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1VuZGVmaW5lZCh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1VuZGVmaW5lZDtcbiIsInZhciBhcnJheUxpa2VLZXlzID0gcmVxdWlyZSgnLi9fYXJyYXlMaWtlS2V5cycpLFxuICAgIGJhc2VLZXlzID0gcmVxdWlyZSgnLi9fYmFzZUtleXMnKSxcbiAgICBpc0FycmF5TGlrZSA9IHJlcXVpcmUoJy4vaXNBcnJheUxpa2UnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiBgb2JqZWN0YC5cbiAqXG4gKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy4gU2VlIHRoZVxuICogW0VTIHNwZWNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5rZXlzKVxuICogZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYSA9IDE7XG4gKiAgIHRoaXMuYiA9IDI7XG4gKiB9XG4gKlxuICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAqXG4gKiBfLmtleXMobmV3IEZvbyk7XG4gKiAvLyA9PiBbJ2EnLCAnYiddIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gKlxuICogXy5rZXlzKCdoaScpO1xuICogLy8gPT4gWycwJywgJzEnXVxuICovXG5mdW5jdGlvbiBrZXlzKG9iamVjdCkge1xuICByZXR1cm4gaXNBcnJheUxpa2Uob2JqZWN0KSA/IGFycmF5TGlrZUtleXMob2JqZWN0KSA6IGJhc2VLZXlzKG9iamVjdCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ga2V5cztcbiIsInZhciBhcnJheUxpa2VLZXlzID0gcmVxdWlyZSgnLi9fYXJyYXlMaWtlS2V5cycpLFxuICAgIGJhc2VLZXlzSW4gPSByZXF1aXJlKCcuL19iYXNlS2V5c0luJyksXG4gICAgaXNBcnJheUxpa2UgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiBgb2JqZWN0YC5cbiAqXG4gKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuMC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYSA9IDE7XG4gKiAgIHRoaXMuYiA9IDI7XG4gKiB9XG4gKlxuICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAqXG4gKiBfLmtleXNJbihuZXcgRm9vKTtcbiAqIC8vID0+IFsnYScsICdiJywgJ2MnXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICovXG5mdW5jdGlvbiBrZXlzSW4ob2JqZWN0KSB7XG4gIHJldHVybiBpc0FycmF5TGlrZShvYmplY3QpID8gYXJyYXlMaWtlS2V5cyhvYmplY3QsIHRydWUpIDogYmFzZUtleXNJbihvYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGtleXNJbjtcbiIsIi8qKlxuICogR2V0cyB0aGUgbGFzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbGFzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8ubGFzdChbMSwgMiwgM10pO1xuICogLy8gPT4gM1xuICovXG5mdW5jdGlvbiBsYXN0KGFycmF5KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgcmV0dXJuIGxlbmd0aCA/IGFycmF5W2xlbmd0aCAtIDFdIDogdW5kZWZpbmVkO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxhc3Q7XG4iLCJ2YXIgYXJyYXlNYXAgPSByZXF1aXJlKCcuL19hcnJheU1hcCcpLFxuICAgIGJhc2VJdGVyYXRlZSA9IHJlcXVpcmUoJy4vX2Jhc2VJdGVyYXRlZScpLFxuICAgIGJhc2VNYXAgPSByZXF1aXJlKCcuL19iYXNlTWFwJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdmFsdWVzIGJ5IHJ1bm5pbmcgZWFjaCBlbGVtZW50IGluIGBjb2xsZWN0aW9uYCB0aHJ1XG4gKiBgaXRlcmF0ZWVgLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czpcbiAqICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAqXG4gKiBNYW55IGxvZGFzaCBtZXRob2RzIGFyZSBndWFyZGVkIHRvIHdvcmsgYXMgaXRlcmF0ZWVzIGZvciBtZXRob2RzIGxpa2VcbiAqIGBfLmV2ZXJ5YCwgYF8uZmlsdGVyYCwgYF8ubWFwYCwgYF8ubWFwVmFsdWVzYCwgYF8ucmVqZWN0YCwgYW5kIGBfLnNvbWVgLlxuICpcbiAqIFRoZSBndWFyZGVkIG1ldGhvZHMgYXJlOlxuICogYGFyeWAsIGBjaHVua2AsIGBjdXJyeWAsIGBjdXJyeVJpZ2h0YCwgYGRyb3BgLCBgZHJvcFJpZ2h0YCwgYGV2ZXJ5YCxcbiAqIGBmaWxsYCwgYGludmVydGAsIGBwYXJzZUludGAsIGByYW5kb21gLCBgcmFuZ2VgLCBgcmFuZ2VSaWdodGAsIGByZXBlYXRgLFxuICogYHNhbXBsZVNpemVgLCBgc2xpY2VgLCBgc29tZWAsIGBzb3J0QnlgLCBgc3BsaXRgLCBgdGFrZWAsIGB0YWtlUmlnaHRgLFxuICogYHRlbXBsYXRlYCwgYHRyaW1gLCBgdHJpbUVuZGAsIGB0cmltU3RhcnRgLCBhbmQgYHdvcmRzYFxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IG1hcHBlZCBhcnJheS5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gc3F1YXJlKG4pIHtcbiAqICAgcmV0dXJuIG4gKiBuO1xuICogfVxuICpcbiAqIF8ubWFwKFs0LCA4XSwgc3F1YXJlKTtcbiAqIC8vID0+IFsxNiwgNjRdXG4gKlxuICogXy5tYXAoeyAnYSc6IDQsICdiJzogOCB9LCBzcXVhcmUpO1xuICogLy8gPT4gWzE2LCA2NF0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAqXG4gKiB2YXIgdXNlcnMgPSBbXG4gKiAgIHsgJ3VzZXInOiAnYmFybmV5JyB9LFxuICogICB7ICd1c2VyJzogJ2ZyZWQnIH1cbiAqIF07XG4gKlxuICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLm1hcCh1c2VycywgJ3VzZXInKTtcbiAqIC8vID0+IFsnYmFybmV5JywgJ2ZyZWQnXVxuICovXG5mdW5jdGlvbiBtYXAoY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlNYXAgOiBiYXNlTWFwO1xuICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBiYXNlSXRlcmF0ZWUoaXRlcmF0ZWUsIDMpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXA7XG4iLCJ2YXIgYmFzZUFzc2lnblZhbHVlID0gcmVxdWlyZSgnLi9fYmFzZUFzc2lnblZhbHVlJyksXG4gICAgYmFzZUZvck93biA9IHJlcXVpcmUoJy4vX2Jhc2VGb3JPd24nKSxcbiAgICBiYXNlSXRlcmF0ZWUgPSByZXF1aXJlKCcuL19iYXNlSXRlcmF0ZWUnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIG9iamVjdCB3aXRoIHRoZSBzYW1lIGtleXMgYXMgYG9iamVjdGAgYW5kIHZhbHVlcyBnZW5lcmF0ZWRcbiAqIGJ5IHJ1bm5pbmcgZWFjaCBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydHkgb2YgYG9iamVjdGAgdGhydVxuICogYGl0ZXJhdGVlYC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6XG4gKiAodmFsdWUsIGtleSwgb2JqZWN0KS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDIuNC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIG9iamVjdC5cbiAqIEBzZWUgXy5tYXBLZXlzXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciB1c2VycyA9IHtcbiAqICAgJ2ZyZWQnOiAgICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWdlJzogNDAgfSxcbiAqICAgJ3BlYmJsZXMnOiB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWdlJzogMSB9XG4gKiB9O1xuICpcbiAqIF8ubWFwVmFsdWVzKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLmFnZTsgfSk7XG4gKiAvLyA9PiB7ICdmcmVkJzogNDAsICdwZWJibGVzJzogMSB9IChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gKlxuICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLm1hcFZhbHVlcyh1c2VycywgJ2FnZScpO1xuICogLy8gPT4geyAnZnJlZCc6IDQwLCAncGViYmxlcyc6IDEgfSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICovXG5mdW5jdGlvbiBtYXBWYWx1ZXMob2JqZWN0LCBpdGVyYXRlZSkge1xuICB2YXIgcmVzdWx0ID0ge307XG4gIGl0ZXJhdGVlID0gYmFzZUl0ZXJhdGVlKGl0ZXJhdGVlLCAzKTtcblxuICBiYXNlRm9yT3duKG9iamVjdCwgZnVuY3Rpb24odmFsdWUsIGtleSwgb2JqZWN0KSB7XG4gICAgYmFzZUFzc2lnblZhbHVlKHJlc3VsdCwga2V5LCBpdGVyYXRlZSh2YWx1ZSwga2V5LCBvYmplY3QpKTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwVmFsdWVzO1xuIiwidmFyIGJhc2VFeHRyZW11bSA9IHJlcXVpcmUoJy4vX2Jhc2VFeHRyZW11bScpLFxuICAgIGJhc2VHdCA9IHJlcXVpcmUoJy4vX2Jhc2VHdCcpLFxuICAgIGlkZW50aXR5ID0gcmVxdWlyZSgnLi9pZGVudGl0eScpO1xuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBtYXhpbXVtIHZhbHVlIG9mIGBhcnJheWAuIElmIGBhcnJheWAgaXMgZW1wdHkgb3IgZmFsc2V5LFxuICogYHVuZGVmaW5lZGAgaXMgcmV0dXJuZWQuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IE1hdGhcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWF4aW11bSB2YWx1ZS5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5tYXgoWzQsIDIsIDgsIDZdKTtcbiAqIC8vID0+IDhcbiAqXG4gKiBfLm1heChbXSk7XG4gKiAvLyA9PiB1bmRlZmluZWRcbiAqL1xuZnVuY3Rpb24gbWF4KGFycmF5KSB7XG4gIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgID8gYmFzZUV4dHJlbXVtKGFycmF5LCBpZGVudGl0eSwgYmFzZUd0KVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1heDtcbiIsInZhciBNYXBDYWNoZSA9IHJlcXVpcmUoJy4vX01hcENhY2hlJyk7XG5cbi8qKiBFcnJvciBtZXNzYWdlIGNvbnN0YW50cy4gKi9cbnZhciBGVU5DX0VSUk9SX1RFWFQgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbic7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgbWVtb2l6ZXMgdGhlIHJlc3VsdCBvZiBgZnVuY2AuIElmIGByZXNvbHZlcmAgaXNcbiAqIHByb3ZpZGVkLCBpdCBkZXRlcm1pbmVzIHRoZSBjYWNoZSBrZXkgZm9yIHN0b3JpbmcgdGhlIHJlc3VsdCBiYXNlZCBvbiB0aGVcbiAqIGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24uIEJ5IGRlZmF1bHQsIHRoZSBmaXJzdCBhcmd1bWVudFxuICogcHJvdmlkZWQgdG8gdGhlIG1lbW9pemVkIGZ1bmN0aW9uIGlzIHVzZWQgYXMgdGhlIG1hcCBjYWNoZSBrZXkuIFRoZSBgZnVuY2BcbiAqIGlzIGludm9rZWQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgdGhlIG1lbW9pemVkIGZ1bmN0aW9uLlxuICpcbiAqICoqTm90ZToqKiBUaGUgY2FjaGUgaXMgZXhwb3NlZCBhcyB0aGUgYGNhY2hlYCBwcm9wZXJ0eSBvbiB0aGUgbWVtb2l6ZWRcbiAqIGZ1bmN0aW9uLiBJdHMgY3JlYXRpb24gbWF5IGJlIGN1c3RvbWl6ZWQgYnkgcmVwbGFjaW5nIHRoZSBgXy5tZW1vaXplLkNhY2hlYFxuICogY29uc3RydWN0b3Igd2l0aCBvbmUgd2hvc2UgaW5zdGFuY2VzIGltcGxlbWVudCB0aGVcbiAqIFtgTWFwYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcHJvcGVydGllcy1vZi10aGUtbWFwLXByb3RvdHlwZS1vYmplY3QpXG4gKiBtZXRob2QgaW50ZXJmYWNlIG9mIGBjbGVhcmAsIGBkZWxldGVgLCBgZ2V0YCwgYGhhc2AsIGFuZCBgc2V0YC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGhhdmUgaXRzIG91dHB1dCBtZW1vaXplZC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtyZXNvbHZlcl0gVGhlIGZ1bmN0aW9uIHRvIHJlc29sdmUgdGhlIGNhY2hlIGtleS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG1lbW9pemVkIGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogMiB9O1xuICogdmFyIG90aGVyID0geyAnYyc6IDMsICdkJzogNCB9O1xuICpcbiAqIHZhciB2YWx1ZXMgPSBfLm1lbW9pemUoXy52YWx1ZXMpO1xuICogdmFsdWVzKG9iamVjdCk7XG4gKiAvLyA9PiBbMSwgMl1cbiAqXG4gKiB2YWx1ZXMob3RoZXIpO1xuICogLy8gPT4gWzMsIDRdXG4gKlxuICogb2JqZWN0LmEgPSAyO1xuICogdmFsdWVzKG9iamVjdCk7XG4gKiAvLyA9PiBbMSwgMl1cbiAqXG4gKiAvLyBNb2RpZnkgdGhlIHJlc3VsdCBjYWNoZS5cbiAqIHZhbHVlcy5jYWNoZS5zZXQob2JqZWN0LCBbJ2EnLCAnYiddKTtcbiAqIHZhbHVlcyhvYmplY3QpO1xuICogLy8gPT4gWydhJywgJ2InXVxuICpcbiAqIC8vIFJlcGxhY2UgYF8ubWVtb2l6ZS5DYWNoZWAuXG4gKiBfLm1lbW9pemUuQ2FjaGUgPSBXZWFrTWFwO1xuICovXG5mdW5jdGlvbiBtZW1vaXplKGZ1bmMsIHJlc29sdmVyKSB7XG4gIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nIHx8IChyZXNvbHZlciAhPSBudWxsICYmIHR5cGVvZiByZXNvbHZlciAhPSAnZnVuY3Rpb24nKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgfVxuICB2YXIgbWVtb2l6ZWQgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAga2V5ID0gcmVzb2x2ZXIgPyByZXNvbHZlci5hcHBseSh0aGlzLCBhcmdzKSA6IGFyZ3NbMF0sXG4gICAgICAgIGNhY2hlID0gbWVtb2l6ZWQuY2FjaGU7XG5cbiAgICBpZiAoY2FjaGUuaGFzKGtleSkpIHtcbiAgICAgIHJldHVybiBjYWNoZS5nZXQoa2V5KTtcbiAgICB9XG4gICAgdmFyIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpcywgYXJncyk7XG4gICAgbWVtb2l6ZWQuY2FjaGUgPSBjYWNoZS5zZXQoa2V5LCByZXN1bHQpIHx8IGNhY2hlO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIG1lbW9pemVkLmNhY2hlID0gbmV3IChtZW1vaXplLkNhY2hlIHx8IE1hcENhY2hlKTtcbiAgcmV0dXJuIG1lbW9pemVkO1xufVxuXG4vLyBFeHBvc2UgYE1hcENhY2hlYC5cbm1lbW9pemUuQ2FjaGUgPSBNYXBDYWNoZTtcblxubW9kdWxlLmV4cG9ydHMgPSBtZW1vaXplO1xuIiwidmFyIGJhc2VNZXJnZSA9IHJlcXVpcmUoJy4vX2Jhc2VNZXJnZScpLFxuICAgIGNyZWF0ZUFzc2lnbmVyID0gcmVxdWlyZSgnLi9fY3JlYXRlQXNzaWduZXInKTtcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmFzc2lnbmAgZXhjZXB0IHRoYXQgaXQgcmVjdXJzaXZlbHkgbWVyZ2VzIG93biBhbmRcbiAqIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIHNvdXJjZSBvYmplY3RzIGludG8gdGhlXG4gKiBkZXN0aW5hdGlvbiBvYmplY3QuIFNvdXJjZSBwcm9wZXJ0aWVzIHRoYXQgcmVzb2x2ZSB0byBgdW5kZWZpbmVkYCBhcmVcbiAqIHNraXBwZWQgaWYgYSBkZXN0aW5hdGlvbiB2YWx1ZSBleGlzdHMuIEFycmF5IGFuZCBwbGFpbiBvYmplY3QgcHJvcGVydGllc1xuICogYXJlIG1lcmdlZCByZWN1cnNpdmVseS4gT3RoZXIgb2JqZWN0cyBhbmQgdmFsdWUgdHlwZXMgYXJlIG92ZXJyaWRkZW4gYnlcbiAqIGFzc2lnbm1lbnQuIFNvdXJjZSBvYmplY3RzIGFyZSBhcHBsaWVkIGZyb20gbGVmdCB0byByaWdodC4gU3Vic2VxdWVudFxuICogc291cmNlcyBvdmVyd3JpdGUgcHJvcGVydHkgYXNzaWdubWVudHMgb2YgcHJldmlvdXMgc291cmNlcy5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuNS4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gKiBAcGFyYW0gey4uLk9iamVjdH0gW3NvdXJjZXNdIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7XG4gKiAgICdhJzogW3sgJ2InOiAyIH0sIHsgJ2QnOiA0IH1dXG4gKiB9O1xuICpcbiAqIHZhciBvdGhlciA9IHtcbiAqICAgJ2EnOiBbeyAnYyc6IDMgfSwgeyAnZSc6IDUgfV1cbiAqIH07XG4gKlxuICogXy5tZXJnZShvYmplY3QsIG90aGVyKTtcbiAqIC8vID0+IHsgJ2EnOiBbeyAnYic6IDIsICdjJzogMyB9LCB7ICdkJzogNCwgJ2UnOiA1IH1dIH1cbiAqL1xudmFyIG1lcmdlID0gY3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4KSB7XG4gIGJhc2VNZXJnZShvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgpO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gbWVyZ2U7XG4iLCJ2YXIgYmFzZUV4dHJlbXVtID0gcmVxdWlyZSgnLi9fYmFzZUV4dHJlbXVtJyksXG4gICAgYmFzZUx0ID0gcmVxdWlyZSgnLi9fYmFzZUx0JyksXG4gICAgaWRlbnRpdHkgPSByZXF1aXJlKCcuL2lkZW50aXR5Jyk7XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIG1pbmltdW0gdmFsdWUgb2YgYGFycmF5YC4gSWYgYGFycmF5YCBpcyBlbXB0eSBvciBmYWxzZXksXG4gKiBgdW5kZWZpbmVkYCBpcyByZXR1cm5lZC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgTWF0aFxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtaW5pbXVtIHZhbHVlLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLm1pbihbNCwgMiwgOCwgNl0pO1xuICogLy8gPT4gMlxuICpcbiAqIF8ubWluKFtdKTtcbiAqIC8vID0+IHVuZGVmaW5lZFxuICovXG5mdW5jdGlvbiBtaW4oYXJyYXkpIHtcbiAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgPyBiYXNlRXh0cmVtdW0oYXJyYXksIGlkZW50aXR5LCBiYXNlTHQpXG4gICAgOiB1bmRlZmluZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWluO1xuIiwidmFyIGJhc2VFeHRyZW11bSA9IHJlcXVpcmUoJy4vX2Jhc2VFeHRyZW11bScpLFxuICAgIGJhc2VJdGVyYXRlZSA9IHJlcXVpcmUoJy4vX2Jhc2VJdGVyYXRlZScpLFxuICAgIGJhc2VMdCA9IHJlcXVpcmUoJy4vX2Jhc2VMdCcpO1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ubWluYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2ggaXNcbiAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBpbiBgYXJyYXlgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb24gYnkgd2hpY2hcbiAqIHRoZSB2YWx1ZSBpcyByYW5rZWQuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBNYXRoXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1pbmltdW0gdmFsdWUuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3RzID0gW3sgJ24nOiAxIH0sIHsgJ24nOiAyIH1dO1xuICpcbiAqIF8ubWluQnkob2JqZWN0cywgZnVuY3Rpb24obykgeyByZXR1cm4gby5uOyB9KTtcbiAqIC8vID0+IHsgJ24nOiAxIH1cbiAqXG4gKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8ubWluQnkob2JqZWN0cywgJ24nKTtcbiAqIC8vID0+IHsgJ24nOiAxIH1cbiAqL1xuZnVuY3Rpb24gbWluQnkoYXJyYXksIGl0ZXJhdGVlKSB7XG4gIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgID8gYmFzZUV4dHJlbXVtKGFycmF5LCBiYXNlSXRlcmF0ZWUoaXRlcmF0ZWUsIDIpLCBiYXNlTHQpXG4gICAgOiB1bmRlZmluZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWluQnk7XG4iLCIvKipcbiAqIFRoaXMgbWV0aG9kIHJldHVybnMgYHVuZGVmaW5lZGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjMuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBleGFtcGxlXG4gKlxuICogXy50aW1lcygyLCBfLm5vb3ApO1xuICogLy8gPT4gW3VuZGVmaW5lZCwgdW5kZWZpbmVkXVxuICovXG5mdW5jdGlvbiBub29wKCkge1xuICAvLyBObyBvcGVyYXRpb24gcGVyZm9ybWVkLlxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5vb3A7XG4iLCJ2YXIgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSB0aW1lc3RhbXAgb2YgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhhdCBoYXZlIGVsYXBzZWQgc2luY2VcbiAqIHRoZSBVbml4IGVwb2NoICgxIEphbnVhcnkgMTk3MCAwMDowMDowMCBVVEMpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMi40LjBcbiAqIEBjYXRlZ29yeSBEYXRlXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSB0aW1lc3RhbXAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uZGVmZXIoZnVuY3Rpb24oc3RhbXApIHtcbiAqICAgY29uc29sZS5sb2coXy5ub3coKSAtIHN0YW1wKTtcbiAqIH0sIF8ubm93KCkpO1xuICogLy8gPT4gTG9ncyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpdCB0b29rIGZvciB0aGUgZGVmZXJyZWQgaW52b2NhdGlvbi5cbiAqL1xudmFyIG5vdyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gcm9vdC5EYXRlLm5vdygpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBub3c7XG4iLCJ2YXIgYmFzZVBpY2sgPSByZXF1aXJlKCcuL19iYXNlUGljaycpLFxuICAgIGZsYXRSZXN0ID0gcmVxdWlyZSgnLi9fZmxhdFJlc3QnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiB0aGUgcGlja2VkIGBvYmplY3RgIHByb3BlcnRpZXMuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAqIEBwYXJhbSB7Li4uKHN0cmluZ3xzdHJpbmdbXSl9IFtwYXRoc10gVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogJzInLCAnYyc6IDMgfTtcbiAqXG4gKiBfLnBpY2sob2JqZWN0LCBbJ2EnLCAnYyddKTtcbiAqIC8vID0+IHsgJ2EnOiAxLCAnYyc6IDMgfVxuICovXG52YXIgcGljayA9IGZsYXRSZXN0KGZ1bmN0aW9uKG9iamVjdCwgcGF0aHMpIHtcbiAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8ge30gOiBiYXNlUGljayhvYmplY3QsIHBhdGhzKTtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBpY2s7XG4iLCJ2YXIgYmFzZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fYmFzZVByb3BlcnR5JyksXG4gICAgYmFzZVByb3BlcnR5RGVlcCA9IHJlcXVpcmUoJy4vX2Jhc2VQcm9wZXJ0eURlZXAnKSxcbiAgICBpc0tleSA9IHJlcXVpcmUoJy4vX2lzS2V5JyksXG4gICAgdG9LZXkgPSByZXF1aXJlKCcuL190b0tleScpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIHZhbHVlIGF0IGBwYXRoYCBvZiBhIGdpdmVuIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDIuNC4wXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0cyA9IFtcbiAqICAgeyAnYSc6IHsgJ2InOiAyIH0gfSxcbiAqICAgeyAnYSc6IHsgJ2InOiAxIH0gfVxuICogXTtcbiAqXG4gKiBfLm1hcChvYmplY3RzLCBfLnByb3BlcnR5KCdhLmInKSk7XG4gKiAvLyA9PiBbMiwgMV1cbiAqXG4gKiBfLm1hcChfLnNvcnRCeShvYmplY3RzLCBfLnByb3BlcnR5KFsnYScsICdiJ10pKSwgJ2EuYicpO1xuICogLy8gPT4gWzEsIDJdXG4gKi9cbmZ1bmN0aW9uIHByb3BlcnR5KHBhdGgpIHtcbiAgcmV0dXJuIGlzS2V5KHBhdGgpID8gYmFzZVByb3BlcnR5KHRvS2V5KHBhdGgpKSA6IGJhc2VQcm9wZXJ0eURlZXAocGF0aCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcHJvcGVydHk7XG4iLCJ2YXIgY3JlYXRlUmFuZ2UgPSByZXF1aXJlKCcuL19jcmVhdGVSYW5nZScpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgbnVtYmVycyAocG9zaXRpdmUgYW5kL29yIG5lZ2F0aXZlKSBwcm9ncmVzc2luZyBmcm9tXG4gKiBgc3RhcnRgIHVwIHRvLCBidXQgbm90IGluY2x1ZGluZywgYGVuZGAuIEEgc3RlcCBvZiBgLTFgIGlzIHVzZWQgaWYgYSBuZWdhdGl2ZVxuICogYHN0YXJ0YCBpcyBzcGVjaWZpZWQgd2l0aG91dCBhbiBgZW5kYCBvciBgc3RlcGAuIElmIGBlbmRgIGlzIG5vdCBzcGVjaWZpZWQsXG4gKiBpdCdzIHNldCB0byBgc3RhcnRgIHdpdGggYHN0YXJ0YCB0aGVuIHNldCB0byBgMGAuXG4gKlxuICogKipOb3RlOioqIEphdmFTY3JpcHQgZm9sbG93cyB0aGUgSUVFRS03NTQgc3RhbmRhcmQgZm9yIHJlc29sdmluZ1xuICogZmxvYXRpbmctcG9pbnQgdmFsdWVzIHdoaWNoIGNhbiBwcm9kdWNlIHVuZXhwZWN0ZWQgcmVzdWx0cy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlLlxuICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSByYW5nZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3RlcD0xXSBUaGUgdmFsdWUgdG8gaW5jcmVtZW50IG9yIGRlY3JlbWVudCBieS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZ2Ugb2YgbnVtYmVycy5cbiAqIEBzZWUgXy5pblJhbmdlLCBfLnJhbmdlUmlnaHRcbiAqIEBleGFtcGxlXG4gKlxuICogXy5yYW5nZSg0KTtcbiAqIC8vID0+IFswLCAxLCAyLCAzXVxuICpcbiAqIF8ucmFuZ2UoLTQpO1xuICogLy8gPT4gWzAsIC0xLCAtMiwgLTNdXG4gKlxuICogXy5yYW5nZSgxLCA1KTtcbiAqIC8vID0+IFsxLCAyLCAzLCA0XVxuICpcbiAqIF8ucmFuZ2UoMCwgMjAsIDUpO1xuICogLy8gPT4gWzAsIDUsIDEwLCAxNV1cbiAqXG4gKiBfLnJhbmdlKDAsIC00LCAtMSk7XG4gKiAvLyA9PiBbMCwgLTEsIC0yLCAtM11cbiAqXG4gKiBfLnJhbmdlKDEsIDQsIDApO1xuICogLy8gPT4gWzEsIDEsIDFdXG4gKlxuICogXy5yYW5nZSgwKTtcbiAqIC8vID0+IFtdXG4gKi9cbnZhciByYW5nZSA9IGNyZWF0ZVJhbmdlKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gcmFuZ2U7XG4iLCJ2YXIgYXJyYXlSZWR1Y2UgPSByZXF1aXJlKCcuL19hcnJheVJlZHVjZScpLFxuICAgIGJhc2VFYWNoID0gcmVxdWlyZSgnLi9fYmFzZUVhY2gnKSxcbiAgICBiYXNlSXRlcmF0ZWUgPSByZXF1aXJlKCcuL19iYXNlSXRlcmF0ZWUnKSxcbiAgICBiYXNlUmVkdWNlID0gcmVxdWlyZSgnLi9fYmFzZVJlZHVjZScpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKTtcblxuLyoqXG4gKiBSZWR1Y2VzIGBjb2xsZWN0aW9uYCB0byBhIHZhbHVlIHdoaWNoIGlzIHRoZSBhY2N1bXVsYXRlZCByZXN1bHQgb2YgcnVubmluZ1xuICogZWFjaCBlbGVtZW50IGluIGBjb2xsZWN0aW9uYCB0aHJ1IGBpdGVyYXRlZWAsIHdoZXJlIGVhY2ggc3VjY2Vzc2l2ZVxuICogaW52b2NhdGlvbiBpcyBzdXBwbGllZCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBwcmV2aW91cy4gSWYgYGFjY3VtdWxhdG9yYFxuICogaXMgbm90IGdpdmVuLCB0aGUgZmlyc3QgZWxlbWVudCBvZiBgY29sbGVjdGlvbmAgaXMgdXNlZCBhcyB0aGUgaW5pdGlhbFxuICogdmFsdWUuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggZm91ciBhcmd1bWVudHM6XG4gKiAoYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICpcbiAqIE1hbnkgbG9kYXNoIG1ldGhvZHMgYXJlIGd1YXJkZWQgdG8gd29yayBhcyBpdGVyYXRlZXMgZm9yIG1ldGhvZHMgbGlrZVxuICogYF8ucmVkdWNlYCwgYF8ucmVkdWNlUmlnaHRgLCBhbmQgYF8udHJhbnNmb3JtYC5cbiAqXG4gKiBUaGUgZ3VhcmRlZCBtZXRob2RzIGFyZTpcbiAqIGBhc3NpZ25gLCBgZGVmYXVsdHNgLCBgZGVmYXVsdHNEZWVwYCwgYGluY2x1ZGVzYCwgYG1lcmdlYCwgYG9yZGVyQnlgLFxuICogYW5kIGBzb3J0QnlgXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIFRoZSBpbml0aWFsIHZhbHVlLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICogQHNlZSBfLnJlZHVjZVJpZ2h0XG4gKiBAZXhhbXBsZVxuICpcbiAqIF8ucmVkdWNlKFsxLCAyXSwgZnVuY3Rpb24oc3VtLCBuKSB7XG4gKiAgIHJldHVybiBzdW0gKyBuO1xuICogfSwgMCk7XG4gKiAvLyA9PiAzXG4gKlxuICogXy5yZWR1Y2UoeyAnYSc6IDEsICdiJzogMiwgJ2MnOiAxIH0sIGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICogICAocmVzdWx0W3ZhbHVlXSB8fCAocmVzdWx0W3ZhbHVlXSA9IFtdKSkucHVzaChrZXkpO1xuICogICByZXR1cm4gcmVzdWx0O1xuICogfSwge30pO1xuICogLy8gPT4geyAnMSc6IFsnYScsICdjJ10sICcyJzogWydiJ10gfSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICovXG5mdW5jdGlvbiByZWR1Y2UoY29sbGVjdGlvbiwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5UmVkdWNlIDogYmFzZVJlZHVjZSxcbiAgICAgIGluaXRBY2N1bSA9IGFyZ3VtZW50cy5sZW5ndGggPCAzO1xuXG4gIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGJhc2VJdGVyYXRlZShpdGVyYXRlZSwgNCksIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0sIGJhc2VFYWNoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZWR1Y2U7XG4iLCJ2YXIgYmFzZUtleXMgPSByZXF1aXJlKCcuL19iYXNlS2V5cycpLFxuICAgIGdldFRhZyA9IHJlcXVpcmUoJy4vX2dldFRhZycpLFxuICAgIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZScpLFxuICAgIGlzU3RyaW5nID0gcmVxdWlyZSgnLi9pc1N0cmluZycpLFxuICAgIHN0cmluZ1NpemUgPSByZXF1aXJlKCcuL19zdHJpbmdTaXplJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBtYXBUYWcgPSAnW29iamVjdCBNYXBdJyxcbiAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJztcblxuLyoqXG4gKiBHZXRzIHRoZSBzaXplIG9mIGBjb2xsZWN0aW9uYCBieSByZXR1cm5pbmcgaXRzIGxlbmd0aCBmb3IgYXJyYXktbGlrZVxuICogdmFsdWVzIG9yIHRoZSBudW1iZXIgb2Ygb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgZm9yIG9iamVjdHMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpbnNwZWN0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29sbGVjdGlvbiBzaXplLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnNpemUoWzEsIDIsIDNdKTtcbiAqIC8vID0+IDNcbiAqXG4gKiBfLnNpemUoeyAnYSc6IDEsICdiJzogMiB9KTtcbiAqIC8vID0+IDJcbiAqXG4gKiBfLnNpemUoJ3BlYmJsZXMnKTtcbiAqIC8vID0+IDdcbiAqL1xuZnVuY3Rpb24gc2l6ZShjb2xsZWN0aW9uKSB7XG4gIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBpZiAoaXNBcnJheUxpa2UoY29sbGVjdGlvbikpIHtcbiAgICByZXR1cm4gaXNTdHJpbmcoY29sbGVjdGlvbikgPyBzdHJpbmdTaXplKGNvbGxlY3Rpb24pIDogY29sbGVjdGlvbi5sZW5ndGg7XG4gIH1cbiAgdmFyIHRhZyA9IGdldFRhZyhjb2xsZWN0aW9uKTtcbiAgaWYgKHRhZyA9PSBtYXBUYWcgfHwgdGFnID09IHNldFRhZykge1xuICAgIHJldHVybiBjb2xsZWN0aW9uLnNpemU7XG4gIH1cbiAgcmV0dXJuIGJhc2VLZXlzKGNvbGxlY3Rpb24pLmxlbmd0aDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzaXplO1xuIiwidmFyIGJhc2VGbGF0dGVuID0gcmVxdWlyZSgnLi9fYmFzZUZsYXR0ZW4nKSxcbiAgICBiYXNlT3JkZXJCeSA9IHJlcXVpcmUoJy4vX2Jhc2VPcmRlckJ5JyksXG4gICAgYmFzZVJlc3QgPSByZXF1aXJlKCcuL19iYXNlUmVzdCcpLFxuICAgIGlzSXRlcmF0ZWVDYWxsID0gcmVxdWlyZSgnLi9faXNJdGVyYXRlZUNhbGwnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIGVsZW1lbnRzLCBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyIGJ5IHRoZSByZXN1bHRzIG9mXG4gKiBydW5uaW5nIGVhY2ggZWxlbWVudCBpbiBhIGNvbGxlY3Rpb24gdGhydSBlYWNoIGl0ZXJhdGVlLiBUaGlzIG1ldGhvZFxuICogcGVyZm9ybXMgYSBzdGFibGUgc29ydCwgdGhhdCBpcywgaXQgcHJlc2VydmVzIHRoZSBvcmlnaW5hbCBzb3J0IG9yZGVyIG9mXG4gKiBlcXVhbCBlbGVtZW50cy4gVGhlIGl0ZXJhdGVlcyBhcmUgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHsuLi4oRnVuY3Rpb258RnVuY3Rpb25bXSl9IFtpdGVyYXRlZXM9W18uaWRlbnRpdHldXVxuICogIFRoZSBpdGVyYXRlZXMgdG8gc29ydCBieS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNvcnRlZCBhcnJheS5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIHVzZXJzID0gW1xuICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0OCB9LFxuICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiB9LFxuICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiAzMCB9LFxuICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNCB9XG4gKiBdO1xuICpcbiAqIF8uc29ydEJ5KHVzZXJzLCBbZnVuY3Rpb24obykgeyByZXR1cm4gby51c2VyOyB9XSk7XG4gKiAvLyA9PiBvYmplY3RzIGZvciBbWydiYXJuZXknLCAzNl0sIFsnYmFybmV5JywgMzRdLCBbJ2ZyZWQnLCA0OF0sIFsnZnJlZCcsIDMwXV1cbiAqXG4gKiBfLnNvcnRCeSh1c2VycywgWyd1c2VyJywgJ2FnZSddKTtcbiAqIC8vID0+IG9iamVjdHMgZm9yIFtbJ2Jhcm5leScsIDM0XSwgWydiYXJuZXknLCAzNl0sIFsnZnJlZCcsIDMwXSwgWydmcmVkJywgNDhdXVxuICovXG52YXIgc29ydEJ5ID0gYmFzZVJlc3QoZnVuY3Rpb24oY29sbGVjdGlvbiwgaXRlcmF0ZWVzKSB7XG4gIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgdmFyIGxlbmd0aCA9IGl0ZXJhdGVlcy5sZW5ndGg7XG4gIGlmIChsZW5ndGggPiAxICYmIGlzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24sIGl0ZXJhdGVlc1swXSwgaXRlcmF0ZWVzWzFdKSkge1xuICAgIGl0ZXJhdGVlcyA9IFtdO1xuICB9IGVsc2UgaWYgKGxlbmd0aCA+IDIgJiYgaXNJdGVyYXRlZUNhbGwoaXRlcmF0ZWVzWzBdLCBpdGVyYXRlZXNbMV0sIGl0ZXJhdGVlc1syXSkpIHtcbiAgICBpdGVyYXRlZXMgPSBbaXRlcmF0ZWVzWzBdXTtcbiAgfVxuICByZXR1cm4gYmFzZU9yZGVyQnkoY29sbGVjdGlvbiwgYmFzZUZsYXR0ZW4oaXRlcmF0ZWVzLCAxKSwgW10pO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gc29ydEJ5O1xuIiwiLyoqXG4gKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGVtcHR5IGFycmF5LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4xMy4wXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZW1wdHkgYXJyYXkuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBhcnJheXMgPSBfLnRpbWVzKDIsIF8uc3R1YkFycmF5KTtcbiAqXG4gKiBjb25zb2xlLmxvZyhhcnJheXMpO1xuICogLy8gPT4gW1tdLCBbXV1cbiAqXG4gKiBjb25zb2xlLmxvZyhhcnJheXNbMF0gPT09IGFycmF5c1sxXSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBzdHViQXJyYXkoKSB7XG4gIHJldHVybiBbXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdHViQXJyYXk7XG4iLCIvKipcbiAqIFRoaXMgbWV0aG9kIHJldHVybnMgYGZhbHNlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMTMuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udGltZXMoMiwgXy5zdHViRmFsc2UpO1xuICogLy8gPT4gW2ZhbHNlLCBmYWxzZV1cbiAqL1xuZnVuY3Rpb24gc3R1YkZhbHNlKCkge1xuICByZXR1cm4gZmFsc2U7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3R1YkZhbHNlO1xuIiwidmFyIHRvTnVtYmVyID0gcmVxdWlyZSgnLi90b051bWJlcicpO1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBJTkZJTklUWSA9IDEgLyAwLFxuICAgIE1BWF9JTlRFR0VSID0gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDg7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIGZpbml0ZSBudW1iZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjEyLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIG51bWJlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b0Zpbml0ZSgzLjIpO1xuICogLy8gPT4gMy4yXG4gKlxuICogXy50b0Zpbml0ZShOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDVlLTMyNFxuICpcbiAqIF8udG9GaW5pdGUoSW5maW5pdHkpO1xuICogLy8gPT4gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDhcbiAqXG4gKiBfLnRvRmluaXRlKCczLjInKTtcbiAqIC8vID0+IDMuMlxuICovXG5mdW5jdGlvbiB0b0Zpbml0ZSh2YWx1ZSkge1xuICBpZiAoIXZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiAwO1xuICB9XG4gIHZhbHVlID0gdG9OdW1iZXIodmFsdWUpO1xuICBpZiAodmFsdWUgPT09IElORklOSVRZIHx8IHZhbHVlID09PSAtSU5GSU5JVFkpIHtcbiAgICB2YXIgc2lnbiA9ICh2YWx1ZSA8IDAgPyAtMSA6IDEpO1xuICAgIHJldHVybiBzaWduICogTUFYX0lOVEVHRVI7XG4gIH1cbiAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZSA/IHZhbHVlIDogMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b0Zpbml0ZTtcbiIsInZhciB0b0Zpbml0ZSA9IHJlcXVpcmUoJy4vdG9GaW5pdGUnKTtcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGFuIGludGVnZXIuXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGxvb3NlbHkgYmFzZWQgb25cbiAqIFtgVG9JbnRlZ2VyYF0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRvaW50ZWdlcikuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgaW50ZWdlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b0ludGVnZXIoMy4yKTtcbiAqIC8vID0+IDNcbiAqXG4gKiBfLnRvSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDBcbiAqXG4gKiBfLnRvSW50ZWdlcihJbmZpbml0eSk7XG4gKiAvLyA9PiAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOFxuICpcbiAqIF8udG9JbnRlZ2VyKCczLjInKTtcbiAqIC8vID0+IDNcbiAqL1xuZnVuY3Rpb24gdG9JbnRlZ2VyKHZhbHVlKSB7XG4gIHZhciByZXN1bHQgPSB0b0Zpbml0ZSh2YWx1ZSksXG4gICAgICByZW1haW5kZXIgPSByZXN1bHQgJSAxO1xuXG4gIHJldHVybiByZXN1bHQgPT09IHJlc3VsdCA/IChyZW1haW5kZXIgPyByZXN1bHQgLSByZW1haW5kZXIgOiByZXN1bHQpIDogMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b0ludGVnZXI7XG4iLCJ2YXIgYmFzZVRyaW0gPSByZXF1aXJlKCcuL19iYXNlVHJpbScpLFxuICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpLFxuICAgIGlzU3ltYm9sID0gcmVxdWlyZSgnLi9pc1N5bWJvbCcpO1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBOQU4gPSAwIC8gMDtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJhZCBzaWduZWQgaGV4YWRlY2ltYWwgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzQmFkSGV4ID0gL15bLStdMHhbMC05YS1mXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBiaW5hcnkgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzQmluYXJ5ID0gL14wYlswMV0rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3Qgb2N0YWwgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzT2N0YWwgPSAvXjBvWzAtN10rJC9pO1xuXG4vKiogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgd2l0aG91dCBhIGRlcGVuZGVuY3kgb24gYHJvb3RgLiAqL1xudmFyIGZyZWVQYXJzZUludCA9IHBhcnNlSW50O1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBudW1iZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBudW1iZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9OdW1iZXIoMy4yKTtcbiAqIC8vID0+IDMuMlxuICpcbiAqIF8udG9OdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiA1ZS0zMjRcbiAqXG4gKiBfLnRvTnVtYmVyKEluZmluaXR5KTtcbiAqIC8vID0+IEluZmluaXR5XG4gKlxuICogXy50b051bWJlcignMy4yJyk7XG4gKiAvLyA9PiAzLjJcbiAqL1xuZnVuY3Rpb24gdG9OdW1iZXIodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgcmV0dXJuIE5BTjtcbiAgfVxuICBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgdmFyIG90aGVyID0gdHlwZW9mIHZhbHVlLnZhbHVlT2YgPT0gJ2Z1bmN0aW9uJyA/IHZhbHVlLnZhbHVlT2YoKSA6IHZhbHVlO1xuICAgIHZhbHVlID0gaXNPYmplY3Qob3RoZXIpID8gKG90aGVyICsgJycpIDogb3RoZXI7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogK3ZhbHVlO1xuICB9XG4gIHZhbHVlID0gYmFzZVRyaW0odmFsdWUpO1xuICB2YXIgaXNCaW5hcnkgPSByZUlzQmluYXJ5LnRlc3QodmFsdWUpO1xuICByZXR1cm4gKGlzQmluYXJ5IHx8IHJlSXNPY3RhbC50ZXN0KHZhbHVlKSlcbiAgICA/IGZyZWVQYXJzZUludCh2YWx1ZS5zbGljZSgyKSwgaXNCaW5hcnkgPyAyIDogOClcbiAgICA6IChyZUlzQmFkSGV4LnRlc3QodmFsdWUpID8gTkFOIDogK3ZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b051bWJlcjtcbiIsInZhciBjb3B5T2JqZWN0ID0gcmVxdWlyZSgnLi9fY29weU9iamVjdCcpLFxuICAgIGtleXNJbiA9IHJlcXVpcmUoJy4va2V5c0luJyk7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIHBsYWluIG9iamVjdCBmbGF0dGVuaW5nIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZ1xuICoga2V5ZWQgcHJvcGVydGllcyBvZiBgdmFsdWVgIHRvIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBwbGFpbiBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgcGxhaW4gb2JqZWN0LlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYiA9IDI7XG4gKiB9XG4gKlxuICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAqXG4gKiBfLmFzc2lnbih7ICdhJzogMSB9LCBuZXcgRm9vKTtcbiAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICpcbiAqIF8uYXNzaWduKHsgJ2EnOiAxIH0sIF8udG9QbGFpbk9iamVjdChuZXcgRm9vKSk7XG4gKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDMgfVxuICovXG5mdW5jdGlvbiB0b1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiBjb3B5T2JqZWN0KHZhbHVlLCBrZXlzSW4odmFsdWUpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b1BsYWluT2JqZWN0O1xuIiwidmFyIGJhc2VUb1N0cmluZyA9IHJlcXVpcmUoJy4vX2Jhc2VUb1N0cmluZycpO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcuIEFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCBmb3IgYG51bGxgXG4gKiBhbmQgYHVuZGVmaW5lZGAgdmFsdWVzLiBUaGUgc2lnbiBvZiBgLTBgIGlzIHByZXNlcnZlZC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9TdHJpbmcobnVsbCk7XG4gKiAvLyA9PiAnJ1xuICpcbiAqIF8udG9TdHJpbmcoLTApO1xuICogLy8gPT4gJy0wJ1xuICpcbiAqIF8udG9TdHJpbmcoWzEsIDIsIDNdKTtcbiAqIC8vID0+ICcxLDIsMydcbiAqL1xuZnVuY3Rpb24gdG9TdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09IG51bGwgPyAnJyA6IGJhc2VUb1N0cmluZyh2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdG9TdHJpbmc7XG4iLCJ2YXIgYXJyYXlFYWNoID0gcmVxdWlyZSgnLi9fYXJyYXlFYWNoJyksXG4gICAgYmFzZUNyZWF0ZSA9IHJlcXVpcmUoJy4vX2Jhc2VDcmVhdGUnKSxcbiAgICBiYXNlRm9yT3duID0gcmVxdWlyZSgnLi9fYmFzZUZvck93bicpLFxuICAgIGJhc2VJdGVyYXRlZSA9IHJlcXVpcmUoJy4vX2Jhc2VJdGVyYXRlZScpLFxuICAgIGdldFByb3RvdHlwZSA9IHJlcXVpcmUoJy4vX2dldFByb3RvdHlwZScpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBpc0J1ZmZlciA9IHJlcXVpcmUoJy4vaXNCdWZmZXInKSxcbiAgICBpc0Z1bmN0aW9uID0gcmVxdWlyZSgnLi9pc0Z1bmN0aW9uJyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0JyksXG4gICAgaXNUeXBlZEFycmF5ID0gcmVxdWlyZSgnLi9pc1R5cGVkQXJyYXknKTtcblxuLyoqXG4gKiBBbiBhbHRlcm5hdGl2ZSB0byBgXy5yZWR1Y2VgOyB0aGlzIG1ldGhvZCB0cmFuc2Zvcm1zIGBvYmplY3RgIHRvIGEgbmV3XG4gKiBgYWNjdW11bGF0b3JgIG9iamVjdCB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgZWFjaCBvZiBpdHMgb3duXG4gKiBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIHRocnUgYGl0ZXJhdGVlYCwgd2l0aCBlYWNoIGludm9jYXRpb25cbiAqIHBvdGVudGlhbGx5IG11dGF0aW5nIHRoZSBgYWNjdW11bGF0b3JgIG9iamVjdC4gSWYgYGFjY3VtdWxhdG9yYCBpcyBub3RcbiAqIHByb3ZpZGVkLCBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgc2FtZSBgW1tQcm90b3R5cGVdXWAgd2lsbCBiZSB1c2VkLiBUaGVcbiAqIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBmb3VyIGFyZ3VtZW50czogKGFjY3VtdWxhdG9yLCB2YWx1ZSwga2V5LCBvYmplY3QpLlxuICogSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0IGl0ZXJhdGlvbiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMS4zLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7Kn0gW2FjY3VtdWxhdG9yXSBUaGUgY3VzdG9tIGFjY3VtdWxhdG9yIHZhbHVlLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRyYW5zZm9ybShbMiwgMywgNF0sIGZ1bmN0aW9uKHJlc3VsdCwgbikge1xuICogICByZXN1bHQucHVzaChuICo9IG4pO1xuICogICByZXR1cm4gbiAlIDIgPT0gMDtcbiAqIH0sIFtdKTtcbiAqIC8vID0+IFs0LCA5XVxuICpcbiAqIF8udHJhbnNmb3JtKHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMSB9LCBmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAqICAgKHJlc3VsdFt2YWx1ZV0gfHwgKHJlc3VsdFt2YWx1ZV0gPSBbXSkpLnB1c2goa2V5KTtcbiAqIH0sIHt9KTtcbiAqIC8vID0+IHsgJzEnOiBbJ2EnLCAnYyddLCAnMic6IFsnYiddIH1cbiAqL1xuZnVuY3Rpb24gdHJhbnNmb3JtKG9iamVjdCwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gIHZhciBpc0FyciA9IGlzQXJyYXkob2JqZWN0KSxcbiAgICAgIGlzQXJyTGlrZSA9IGlzQXJyIHx8IGlzQnVmZmVyKG9iamVjdCkgfHwgaXNUeXBlZEFycmF5KG9iamVjdCk7XG5cbiAgaXRlcmF0ZWUgPSBiYXNlSXRlcmF0ZWUoaXRlcmF0ZWUsIDQpO1xuICBpZiAoYWNjdW11bGF0b3IgPT0gbnVsbCkge1xuICAgIHZhciBDdG9yID0gb2JqZWN0ICYmIG9iamVjdC5jb25zdHJ1Y3RvcjtcbiAgICBpZiAoaXNBcnJMaWtlKSB7XG4gICAgICBhY2N1bXVsYXRvciA9IGlzQXJyID8gbmV3IEN0b3IgOiBbXTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNPYmplY3Qob2JqZWN0KSkge1xuICAgICAgYWNjdW11bGF0b3IgPSBpc0Z1bmN0aW9uKEN0b3IpID8gYmFzZUNyZWF0ZShnZXRQcm90b3R5cGUob2JqZWN0KSkgOiB7fTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBhY2N1bXVsYXRvciA9IHt9O1xuICAgIH1cbiAgfVxuICAoaXNBcnJMaWtlID8gYXJyYXlFYWNoIDogYmFzZUZvck93bikob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIG9iamVjdCkge1xuICAgIHJldHVybiBpdGVyYXRlZShhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4LCBvYmplY3QpO1xuICB9KTtcbiAgcmV0dXJuIGFjY3VtdWxhdG9yO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRyYW5zZm9ybTtcbiIsInZhciBiYXNlRmxhdHRlbiA9IHJlcXVpcmUoJy4vX2Jhc2VGbGF0dGVuJyksXG4gICAgYmFzZVJlc3QgPSByZXF1aXJlKCcuL19iYXNlUmVzdCcpLFxuICAgIGJhc2VVbmlxID0gcmVxdWlyZSgnLi9fYmFzZVVuaXEnKSxcbiAgICBpc0FycmF5TGlrZU9iamVjdCA9IHJlcXVpcmUoJy4vaXNBcnJheUxpa2VPYmplY3QnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHVuaXF1ZSB2YWx1ZXMsIGluIG9yZGVyLCBmcm9tIGFsbCBnaXZlbiBhcnJheXMgdXNpbmdcbiAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21iaW5lZCB2YWx1ZXMuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udW5pb24oWzJdLCBbMSwgMl0pO1xuICogLy8gPT4gWzIsIDFdXG4gKi9cbnZhciB1bmlvbiA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICByZXR1cm4gYmFzZVVuaXEoYmFzZUZsYXR0ZW4oYXJyYXlzLCAxLCBpc0FycmF5TGlrZU9iamVjdCwgdHJ1ZSkpO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gdW5pb247XG4iLCJ2YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuL3RvU3RyaW5nJyk7XG5cbi8qKiBVc2VkIHRvIGdlbmVyYXRlIHVuaXF1ZSBJRHMuICovXG52YXIgaWRDb3VudGVyID0gMDtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSB1bmlxdWUgSUQuIElmIGBwcmVmaXhgIGlzIGdpdmVuLCB0aGUgSUQgaXMgYXBwZW5kZWQgdG8gaXQuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7c3RyaW5nfSBbcHJlZml4PScnXSBUaGUgdmFsdWUgdG8gcHJlZml4IHRoZSBJRCB3aXRoLlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdW5pcXVlIElELlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnVuaXF1ZUlkKCdjb250YWN0XycpO1xuICogLy8gPT4gJ2NvbnRhY3RfMTA0J1xuICpcbiAqIF8udW5pcXVlSWQoKTtcbiAqIC8vID0+ICcxMDUnXG4gKi9cbmZ1bmN0aW9uIHVuaXF1ZUlkKHByZWZpeCkge1xuICB2YXIgaWQgPSArK2lkQ291bnRlcjtcbiAgcmV0dXJuIHRvU3RyaW5nKHByZWZpeCkgKyBpZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB1bmlxdWVJZDtcbiIsInZhciBiYXNlVmFsdWVzID0gcmVxdWlyZSgnLi9fYmFzZVZhbHVlcycpLFxuICAgIGtleXMgPSByZXF1aXJlKCcuL2tleXMnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydHkgdmFsdWVzIG9mIGBvYmplY3RgLlxuICpcbiAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYSA9IDE7XG4gKiAgIHRoaXMuYiA9IDI7XG4gKiB9XG4gKlxuICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAqXG4gKiBfLnZhbHVlcyhuZXcgRm9vKTtcbiAqIC8vID0+IFsxLCAyXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICpcbiAqIF8udmFsdWVzKCdoaScpO1xuICogLy8gPT4gWydoJywgJ2knXVxuICovXG5mdW5jdGlvbiB2YWx1ZXMob2JqZWN0KSB7XG4gIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IFtdIDogYmFzZVZhbHVlcyhvYmplY3QsIGtleXMob2JqZWN0KSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdmFsdWVzO1xuIiwidmFyIGFzc2lnblZhbHVlID0gcmVxdWlyZSgnLi9fYXNzaWduVmFsdWUnKSxcbiAgICBiYXNlWmlwT2JqZWN0ID0gcmVxdWlyZSgnLi9fYmFzZVppcE9iamVjdCcpO1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZnJvbVBhaXJzYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIHR3byBhcnJheXMsXG4gKiBvbmUgb2YgcHJvcGVydHkgaWRlbnRpZmllcnMgYW5kIG9uZSBvZiBjb3JyZXNwb25kaW5nIHZhbHVlcy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuNC4wXG4gKiBAY2F0ZWdvcnkgQXJyYXlcbiAqIEBwYXJhbSB7QXJyYXl9IFtwcm9wcz1bXV0gVGhlIHByb3BlcnR5IGlkZW50aWZpZXJzLlxuICogQHBhcmFtIHtBcnJheX0gW3ZhbHVlcz1bXV0gVGhlIHByb3BlcnR5IHZhbHVlcy5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uemlwT2JqZWN0KFsnYScsICdiJ10sIFsxLCAyXSk7XG4gKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH1cbiAqL1xuZnVuY3Rpb24gemlwT2JqZWN0KHByb3BzLCB2YWx1ZXMpIHtcbiAgcmV0dXJuIGJhc2VaaXBPYmplY3QocHJvcHMgfHwgW10sIHZhbHVlcyB8fCBbXSwgYXNzaWduVmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHppcE9iamVjdDtcbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSAnU0VDUkVUX0RPX05PVF9QQVNTX1RISVNfT1JfWU9VX1dJTExfQkVfRklSRUQnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0UHJvcFR5cGVzU2VjcmV0O1xuIiwiZXhwb3J0IGZ1bmN0aW9uIHl1djJyZ2IoeXV2KSB7XG4gIHZhciB5ID0geXV2WzBdLFxuICAgICAgdSA9IHl1dlsxXSxcbiAgICAgIHYgPSB5dXZbMl07XG4gIHZhciByLCBnLCBiO1xuICByID0geSAqIDEgKyB1ICogMCArIHYgKiAxLjEzOTgzO1xuICBnID0geSAqIDEgKyB1ICogLTAuMzk0NjUgKyB2ICogLTAuNTgwNjtcbiAgYiA9IHkgKiAxICsgdSAqIDIuMDIzMTEgKyB2ICogMDtcbiAgciA9IE1hdGgubWluKE1hdGgubWF4KDAsIHIpLCAxKTtcbiAgZyA9IE1hdGgubWluKE1hdGgubWF4KDAsIGcpLCAxKTtcbiAgYiA9IE1hdGgubWluKE1hdGgubWF4KDAsIGIpLCAxKTtcbiAgcmV0dXJuIFtyICogMjU1LCBnICogMjU1LCBiICogMjU1XTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZ2IyeXV2KHJnYikge1xuICB2YXIgciA9IHJnYlswXSAvIDI1NSxcbiAgICAgIGcgPSByZ2JbMV0gLyAyNTUsXG4gICAgICBiID0gcmdiWzJdIC8gMjU1O1xuICB2YXIgeSA9IHIgKiAwLjI5OSArIGcgKiAwLjU4NyArIGIgKiAwLjExNDtcbiAgdmFyIHUgPSByICogLTAuMTQ3MTMgKyBnICogLTAuMjg4ODYgKyBiICogMC40MzY7XG4gIHZhciB2ID0gciAqIDAuNjE1ICsgZyAqIC0wLjUxNDk5ICsgYiAqIC0wLjEwMDAxO1xuICByZXR1cm4gW3ksIHUsIHZdO1xufSIsImltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZlwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXlcIjtcblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuaW1wb3J0ICogYXMgYmFzZTE2IGZyb20gJ2Jhc2UxNic7XG5pbXBvcnQgQ29sb3IgZnJvbSAnY29sb3InO1xuaW1wb3J0IGN1cnJ5IGZyb20gJ2xvZGFzaC5jdXJyeSc7XG5pbXBvcnQgeyB5dXYycmdiLCByZ2IyeXV2IH0gZnJvbSAnLi9jb2xvckNvbnZlcnRlcnMnO1xudmFyIERFRkFVTFRfQkFTRTE2ID0gYmFzZTE2LmRlZmF1bHQ7XG52YXIgQkFTRTE2X0tFWVMgPSBPYmplY3Qua2V5cyhERUZBVUxUX0JBU0UxNik7IC8vIHdlIG5lZWQgYSBjb3JyZWN0aW5nIGZhY3Rvciwgc28gdGhhdCBhIGRhcmssIGJ1dCBub3QgYmxhY2sgYmFja2dyb3VuZCBjb2xvclxuLy8gY29udmVydHMgdG8gYnJpZ2h0IGVub3VnaCBpbnZlcnNlZCBjb2xvclxuXG52YXIgZmxpcCA9IGZ1bmN0aW9uIGZsaXAoeCkge1xuICByZXR1cm4geCA8IDAuMjUgPyAxIDogeCA8IDAuNSA/IDAuOSAtIHggOiAxLjEgLSB4O1xufTtcblxudmFyIGludmVydENvbG9yID0gZnVuY3Rpb24gaW52ZXJ0Q29sb3IoaGV4U3RyaW5nKSB7XG4gIHZhciBjb2xvciA9IENvbG9yKGhleFN0cmluZyk7XG5cbiAgdmFyIF9yZ2IyeXV2ID0gcmdiMnl1dihjb2xvci5hcnJheSgpKSxcbiAgICAgIF9yZ2IyeXV2MiA9IF9zbGljZWRUb0FycmF5KF9yZ2IyeXV2LCAzKSxcbiAgICAgIHkgPSBfcmdiMnl1djJbMF0sXG4gICAgICB1ID0gX3JnYjJ5dXYyWzFdLFxuICAgICAgdiA9IF9yZ2IyeXV2MlsyXTtcblxuICB2YXIgZmxpcHBlZFl1diA9IFtmbGlwKHkpLCB1LCB2XTtcbiAgdmFyIHJnYiA9IHl1djJyZ2IoZmxpcHBlZFl1dik7XG4gIHJldHVybiBDb2xvci5yZ2IocmdiKS5oZXgoKTtcbn07XG5cbnZhciBtZXJnZXIgPSBmdW5jdGlvbiBtZXJnZXIoc3R5bGluZykge1xuICByZXR1cm4gZnVuY3Rpb24gKHByZXZTdHlsaW5nKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNsYXNzTmFtZTogW3ByZXZTdHlsaW5nLmNsYXNzTmFtZSwgc3R5bGluZy5jbGFzc05hbWVdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJyksXG4gICAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcmV2U3R5bGluZy5zdHlsZSB8fCB7fSksIHN0eWxpbmcuc3R5bGUgfHwge30pXG4gICAgfTtcbiAgfTtcbn07XG5cbnZhciBtZXJnZVN0eWxpbmcgPSBmdW5jdGlvbiBtZXJnZVN0eWxpbmcoY3VzdG9tU3R5bGluZywgZGVmYXVsdFN0eWxpbmcpIHtcbiAgaWYgKGN1c3RvbVN0eWxpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBkZWZhdWx0U3R5bGluZztcbiAgfVxuXG4gIGlmIChkZWZhdWx0U3R5bGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGN1c3RvbVN0eWxpbmc7XG4gIH1cblxuICB2YXIgY3VzdG9tVHlwZSA9IF90eXBlb2YoY3VzdG9tU3R5bGluZyk7XG5cbiAgdmFyIGRlZmF1bHRUeXBlID0gX3R5cGVvZihkZWZhdWx0U3R5bGluZyk7XG5cbiAgc3dpdGNoIChjdXN0b21UeXBlKSB7XG4gICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIHN3aXRjaCAoZGVmYXVsdFR5cGUpIHtcbiAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICByZXR1cm4gW2RlZmF1bHRTdHlsaW5nLCBjdXN0b21TdHlsaW5nXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuXG4gICAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgICAgcmV0dXJuIG1lcmdlcih7XG4gICAgICAgICAgICBjbGFzc05hbWU6IGN1c3RvbVN0eWxpbmcsXG4gICAgICAgICAgICBzdHlsZTogZGVmYXVsdFN0eWxpbmdcbiAgICAgICAgICB9KTtcblxuICAgICAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChzdHlsaW5nKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgICAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbWVyZ2VyKHtcbiAgICAgICAgICAgICAgY2xhc3NOYW1lOiBjdXN0b21TdHlsaW5nXG4gICAgICAgICAgICB9KShkZWZhdWx0U3R5bGluZy5hcHBseSh2b2lkIDAsIFtzdHlsaW5nXS5jb25jYXQoYXJncykpKTtcbiAgICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICBzd2l0Y2ggKGRlZmF1bHRUeXBlKSB7XG4gICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgcmV0dXJuIG1lcmdlcih7XG4gICAgICAgICAgICBjbGFzc05hbWU6IGRlZmF1bHRTdHlsaW5nLFxuICAgICAgICAgICAgc3R5bGU6IGN1c3RvbVN0eWxpbmdcbiAgICAgICAgICB9KTtcblxuICAgICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGRlZmF1bHRTdHlsaW5nKSwgY3VzdG9tU3R5bGluZyk7XG5cbiAgICAgICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoc3R5bGluZykge1xuICAgICAgICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4yID4gMSA/IF9sZW4yIC0gMSA6IDApLCBfa2V5MiA9IDE7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgICAgICAgICAgYXJnc1tfa2V5MiAtIDFdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG1lcmdlcih7XG4gICAgICAgICAgICAgIHN0eWxlOiBjdXN0b21TdHlsaW5nXG4gICAgICAgICAgICB9KShkZWZhdWx0U3R5bGluZy5hcHBseSh2b2lkIDAsIFtzdHlsaW5nXS5jb25jYXQoYXJncykpKTtcbiAgICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgIHN3aXRjaCAoZGVmYXVsdFR5cGUpIHtcbiAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHN0eWxpbmcpIHtcbiAgICAgICAgICAgIGZvciAodmFyIF9sZW4zID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMyA+IDEgPyBfbGVuMyAtIDEgOiAwKSwgX2tleTMgPSAxOyBfa2V5MyA8IF9sZW4zOyBfa2V5MysrKSB7XG4gICAgICAgICAgICAgIGFyZ3NbX2tleTMgLSAxXSA9IGFyZ3VtZW50c1tfa2V5M107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBjdXN0b21TdHlsaW5nLmFwcGx5KHZvaWQgMCwgW21lcmdlcihzdHlsaW5nKSh7XG4gICAgICAgICAgICAgIGNsYXNzTmFtZTogZGVmYXVsdFN0eWxpbmdcbiAgICAgICAgICAgIH0pXS5jb25jYXQoYXJncykpO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHN0eWxpbmcpIHtcbiAgICAgICAgICAgIGZvciAodmFyIF9sZW40ID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuNCA+IDEgPyBfbGVuNCAtIDEgOiAwKSwgX2tleTQgPSAxOyBfa2V5NCA8IF9sZW40OyBfa2V5NCsrKSB7XG4gICAgICAgICAgICAgIGFyZ3NbX2tleTQgLSAxXSA9IGFyZ3VtZW50c1tfa2V5NF07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBjdXN0b21TdHlsaW5nLmFwcGx5KHZvaWQgMCwgW21lcmdlcihzdHlsaW5nKSh7XG4gICAgICAgICAgICAgIHN0eWxlOiBkZWZhdWx0U3R5bGluZ1xuICAgICAgICAgICAgfSldLmNvbmNhdChhcmdzKSk7XG4gICAgICAgICAgfTtcblxuICAgICAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChzdHlsaW5nKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBfbGVuNSA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjUgPiAxID8gX2xlbjUgLSAxIDogMCksIF9rZXk1ID0gMTsgX2tleTUgPCBfbGVuNTsgX2tleTUrKykge1xuICAgICAgICAgICAgICBhcmdzW19rZXk1IC0gMV0gPSBhcmd1bWVudHNbX2tleTVdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gY3VzdG9tU3R5bGluZy5hcHBseSh2b2lkIDAsIFtkZWZhdWx0U3R5bGluZy5hcHBseSh2b2lkIDAsIFtzdHlsaW5nXS5jb25jYXQoYXJncykpXS5jb25jYXQoYXJncykpO1xuICAgICAgICAgIH07XG4gICAgICB9XG5cbiAgfVxufTtcblxudmFyIG1lcmdlU3R5bGluZ3MgPSBmdW5jdGlvbiBtZXJnZVN0eWxpbmdzKGN1c3RvbVN0eWxpbmdzLCBkZWZhdWx0U3R5bGluZ3MpIHtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhkZWZhdWx0U3R5bGluZ3MpO1xuXG4gIGZvciAodmFyIGtleSBpbiBjdXN0b21TdHlsaW5ncykge1xuICAgIGlmIChrZXlzLmluZGV4T2Yoa2V5KSA9PT0gLTEpIGtleXMucHVzaChrZXkpO1xuICB9XG5cbiAgcmV0dXJuIGtleXMucmVkdWNlKGZ1bmN0aW9uIChtZXJnZWRTdHlsaW5nLCBrZXkpIHtcbiAgICByZXR1cm4gbWVyZ2VkU3R5bGluZ1trZXldID0gbWVyZ2VTdHlsaW5nKGN1c3RvbVN0eWxpbmdzW2tleV0sIGRlZmF1bHRTdHlsaW5nc1trZXldKSwgbWVyZ2VkU3R5bGluZztcbiAgfSwge30pO1xufTtcblxudmFyIGdldFN0eWxpbmdCeUtleXMgPSBmdW5jdGlvbiBnZXRTdHlsaW5nQnlLZXlzKG1lcmdlZFN0eWxpbmcsIGtleXMpIHtcbiAgZm9yICh2YXIgX2xlbjYgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW42ID4gMiA/IF9sZW42IC0gMiA6IDApLCBfa2V5NiA9IDI7IF9rZXk2IDwgX2xlbjY7IF9rZXk2KyspIHtcbiAgICBhcmdzW19rZXk2IC0gMl0gPSBhcmd1bWVudHNbX2tleTZdO1xuICB9XG5cbiAgaWYgKGtleXMgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbWVyZ2VkU3R5bGluZztcbiAgfVxuXG4gIGlmICghQXJyYXkuaXNBcnJheShrZXlzKSkge1xuICAgIGtleXMgPSBba2V5c107XG4gIH1cblxuICB2YXIgc3R5bGVzID0ga2V5cy5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBtZXJnZWRTdHlsaW5nW2tleV07XG4gIH0pLmZpbHRlcihCb29sZWFuKTtcbiAgdmFyIHByb3BzID0gc3R5bGVzLnJlZHVjZShmdW5jdGlvbiAob2JqLCBzKSB7XG4gICAgaWYgKHR5cGVvZiBzID09PSAnc3RyaW5nJykge1xuICAgICAgb2JqLmNsYXNzTmFtZSA9IFtvYmouY2xhc3NOYW1lLCBzXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuICAgIH0gZWxzZSBpZiAoX3R5cGVvZihzKSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIG9iai5zdHlsZSA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgb2JqLnN0eWxlKSwgcyk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgb2JqID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBvYmopLCBzLmFwcGx5KHZvaWQgMCwgW29ial0uY29uY2F0KGFyZ3MpKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iajtcbiAgfSwge1xuICAgIGNsYXNzTmFtZTogJycsXG4gICAgc3R5bGU6IHt9XG4gIH0pO1xuXG4gIGlmICghcHJvcHMuY2xhc3NOYW1lKSB7XG4gICAgZGVsZXRlIHByb3BzLmNsYXNzTmFtZTtcbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyhwcm9wcy5zdHlsZSkubGVuZ3RoID09PSAwKSB7XG4gICAgZGVsZXRlIHByb3BzLnN0eWxlO1xuICB9XG5cbiAgcmV0dXJuIHByb3BzO1xufTtcblxuZXhwb3J0IHZhciBpbnZlcnRCYXNlMTZUaGVtZSA9IGZ1bmN0aW9uIGludmVydEJhc2UxNlRoZW1lKGJhc2UxNlRoZW1lKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhiYXNlMTZUaGVtZSkucmVkdWNlKGZ1bmN0aW9uICh0LCBrZXkpIHtcbiAgICByZXR1cm4gdFtrZXldID0gL15iYXNlLy50ZXN0KGtleSkgPyBpbnZlcnRDb2xvcihiYXNlMTZUaGVtZVtrZXldKSA6IGtleSA9PT0gJ3NjaGVtZScgPyBiYXNlMTZUaGVtZVtrZXldICsgJzppbnZlcnRlZCcgOiBiYXNlMTZUaGVtZVtrZXldLCB0O1xuICB9LCB7fSk7XG59O1xuZXhwb3J0IHZhciBjcmVhdGVTdHlsaW5nID0gY3VycnkoZnVuY3Rpb24gKGdldFN0eWxpbmdGcm9tQmFzZTE2KSB7XG4gIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgdmFyIHRoZW1lT3JTdHlsaW5nID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcbiAgdmFyIF9vcHRpb25zJGRlZmF1bHRCYXNlID0gb3B0aW9ucy5kZWZhdWx0QmFzZTE2LFxuICAgICAgZGVmYXVsdEJhc2UxNiA9IF9vcHRpb25zJGRlZmF1bHRCYXNlID09PSB2b2lkIDAgPyBERUZBVUxUX0JBU0UxNiA6IF9vcHRpb25zJGRlZmF1bHRCYXNlLFxuICAgICAgX29wdGlvbnMkYmFzZTE2VGhlbWVzID0gb3B0aW9ucy5iYXNlMTZUaGVtZXMsXG4gICAgICBiYXNlMTZUaGVtZXMgPSBfb3B0aW9ucyRiYXNlMTZUaGVtZXMgPT09IHZvaWQgMCA/IG51bGwgOiBfb3B0aW9ucyRiYXNlMTZUaGVtZXM7XG4gIHZhciBiYXNlMTZUaGVtZSA9IGdldEJhc2UxNlRoZW1lKHRoZW1lT3JTdHlsaW5nLCBiYXNlMTZUaGVtZXMpO1xuXG4gIGlmIChiYXNlMTZUaGVtZSkge1xuICAgIHRoZW1lT3JTdHlsaW5nID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBiYXNlMTZUaGVtZSksIHRoZW1lT3JTdHlsaW5nKTtcbiAgfVxuXG4gIHZhciB0aGVtZSA9IEJBU0UxNl9LRVlTLnJlZHVjZShmdW5jdGlvbiAodCwga2V5KSB7XG4gICAgcmV0dXJuIHRba2V5XSA9IHRoZW1lT3JTdHlsaW5nW2tleV0gfHwgZGVmYXVsdEJhc2UxNltrZXldLCB0O1xuICB9LCB7fSk7XG4gIHZhciBjdXN0b21TdHlsaW5nID0gT2JqZWN0LmtleXModGhlbWVPclN0eWxpbmcpLnJlZHVjZShmdW5jdGlvbiAocywga2V5KSB7XG4gICAgcmV0dXJuIEJBU0UxNl9LRVlTLmluZGV4T2Yoa2V5KSA9PT0gLTEgPyAoc1trZXldID0gdGhlbWVPclN0eWxpbmdba2V5XSwgcykgOiBzO1xuICB9LCB7fSk7XG4gIHZhciBkZWZhdWx0U3R5bGluZyA9IGdldFN0eWxpbmdGcm9tQmFzZTE2KHRoZW1lKTtcbiAgdmFyIG1lcmdlZFN0eWxpbmcgPSBtZXJnZVN0eWxpbmdzKGN1c3RvbVN0eWxpbmcsIGRlZmF1bHRTdHlsaW5nKTtcblxuICBmb3IgKHZhciBfbGVuNyA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjcgPiAzID8gX2xlbjcgLSAzIDogMCksIF9rZXk3ID0gMzsgX2tleTcgPCBfbGVuNzsgX2tleTcrKykge1xuICAgIGFyZ3NbX2tleTcgLSAzXSA9IGFyZ3VtZW50c1tfa2V5N107XG4gIH1cblxuICByZXR1cm4gY3VycnkoZ2V0U3R5bGluZ0J5S2V5cywgMikuYXBwbHkodm9pZCAwLCBbbWVyZ2VkU3R5bGluZ10uY29uY2F0KGFyZ3MpKTtcbn0sIDMpO1xuXG52YXIgaXNTdHlsaW5nQ29uZmlnID0gZnVuY3Rpb24gaXNTdHlsaW5nQ29uZmlnKHRoZW1lKSB7XG4gIHJldHVybiAhIXRoZW1lLmV4dGVuZDtcbn07XG5cbmV4cG9ydCB2YXIgZ2V0QmFzZTE2VGhlbWUgPSBmdW5jdGlvbiBnZXRCYXNlMTZUaGVtZSh0aGVtZSwgYmFzZTE2VGhlbWVzKSB7XG4gIGlmICh0aGVtZSAmJiBpc1N0eWxpbmdDb25maWcodGhlbWUpICYmIHRoZW1lLmV4dGVuZCkge1xuICAgIHRoZW1lID0gdGhlbWUuZXh0ZW5kO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0aGVtZSA9PT0gJ3N0cmluZycpIHtcbiAgICB2YXIgX3RoZW1lJHNwbGl0ID0gdGhlbWUuc3BsaXQoJzonKSxcbiAgICAgICAgX3RoZW1lJHNwbGl0MiA9IF9zbGljZWRUb0FycmF5KF90aGVtZSRzcGxpdCwgMiksXG4gICAgICAgIF90aGVtZU5hbWUgPSBfdGhlbWUkc3BsaXQyWzBdLFxuICAgICAgICBtb2RpZmllciA9IF90aGVtZSRzcGxpdDJbMV07XG5cbiAgICBpZiAoYmFzZTE2VGhlbWVzKSB7XG4gICAgICB0aGVtZSA9IGJhc2UxNlRoZW1lc1tfdGhlbWVOYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhlbWUgPSBiYXNlMTZbX3RoZW1lTmFtZV07XG4gICAgfVxuXG4gICAgaWYgKG1vZGlmaWVyID09PSAnaW52ZXJ0ZWQnKSB7XG4gICAgICB0aGVtZSA9IGludmVydEJhc2UxNlRoZW1lKHRoZW1lKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhlbWUgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoZW1lLCAnYmFzZTAwJykgPyB0aGVtZSA6IHVuZGVmaW5lZDtcbn07XG5leHBvcnQgdmFyIGludmVydFRoZW1lID0gZnVuY3Rpb24gaW52ZXJ0VGhlbWUodGhlbWUpIHtcbiAgaWYgKHR5cGVvZiB0aGVtZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gXCJcIi5jb25jYXQodGhlbWUsIFwiOmludmVydGVkXCIpO1xuICB9XG5cbiAgaWYgKHRoZW1lICYmIGlzU3R5bGluZ0NvbmZpZyh0aGVtZSkgJiYgdGhlbWUuZXh0ZW5kKSB7XG4gICAgaWYgKHR5cGVvZiB0aGVtZS5leHRlbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCB0aGVtZSksIHt9LCB7XG4gICAgICAgIGV4dGVuZDogXCJcIi5jb25jYXQodGhlbWUuZXh0ZW5kLCBcIjppbnZlcnRlZFwiKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgdGhlbWUpLCB7fSwge1xuICAgICAgZXh0ZW5kOiBpbnZlcnRCYXNlMTZUaGVtZSh0aGVtZS5leHRlbmQpXG4gICAgfSk7XG4gIH1cblxuICBpZiAodGhlbWUpIHtcbiAgICByZXR1cm4gaW52ZXJ0QmFzZTE2VGhlbWUodGhlbWUpO1xuICB9XG5cbiAgcmV0dXJuIHRoZW1lO1xufTtcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMnOyIsIi8qKiBAbGljZW5zZSBSZWFjdCB2MTYuMTMuMVxuICogcmVhY3QtaXMuZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cblxuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIChmdW5jdGlvbigpIHtcbid1c2Ugc3RyaWN0JztcblxuLy8gVGhlIFN5bWJvbCB1c2VkIHRvIHRhZyB0aGUgUmVhY3RFbGVtZW50LWxpa2UgdHlwZXMuIElmIHRoZXJlIGlzIG5vIG5hdGl2ZSBTeW1ib2xcbi8vIG5vciBwb2x5ZmlsbCwgdGhlbiBhIHBsYWluIG51bWJlciBpcyB1c2VkIGZvciBwZXJmb3JtYW5jZS5cbnZhciBoYXNTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5mb3I7XG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpIDogMHhlYWM3O1xudmFyIFJFQUNUX1BPUlRBTF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QucG9ydGFsJykgOiAweGVhY2E7XG52YXIgUkVBQ1RfRlJBR01FTlRfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmZyYWdtZW50JykgOiAweGVhY2I7XG52YXIgUkVBQ1RfU1RSSUNUX01PREVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnN0cmljdF9tb2RlJykgOiAweGVhY2M7XG52YXIgUkVBQ1RfUFJPRklMRVJfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnByb2ZpbGVyJykgOiAweGVhZDI7XG52YXIgUkVBQ1RfUFJPVklERVJfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnByb3ZpZGVyJykgOiAweGVhY2Q7XG52YXIgUkVBQ1RfQ09OVEVYVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuY29udGV4dCcpIDogMHhlYWNlOyAvLyBUT0RPOiBXZSBkb24ndCB1c2UgQXN5bmNNb2RlIG9yIENvbmN1cnJlbnRNb2RlIGFueW1vcmUuIFRoZXkgd2VyZSB0ZW1wb3Jhcnlcbi8vICh1bnN0YWJsZSkgQVBJcyB0aGF0IGhhdmUgYmVlbiByZW1vdmVkLiBDYW4gd2UgcmVtb3ZlIHRoZSBzeW1ib2xzP1xuXG52YXIgUkVBQ1RfQVNZTkNfTU9ERV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuYXN5bmNfbW9kZScpIDogMHhlYWNmO1xudmFyIFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuY29uY3VycmVudF9tb2RlJykgOiAweGVhY2Y7XG52YXIgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmZvcndhcmRfcmVmJykgOiAweGVhZDA7XG52YXIgUkVBQ1RfU1VTUEVOU0VfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlJykgOiAweGVhZDE7XG52YXIgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2VfbGlzdCcpIDogMHhlYWQ4O1xudmFyIFJFQUNUX01FTU9fVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0Lm1lbW8nKSA6IDB4ZWFkMztcbnZhciBSRUFDVF9MQVpZX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5sYXp5JykgOiAweGVhZDQ7XG52YXIgUkVBQ1RfQkxPQ0tfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmJsb2NrJykgOiAweGVhZDk7XG52YXIgUkVBQ1RfRlVOREFNRU5UQUxfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmZ1bmRhbWVudGFsJykgOiAweGVhZDU7XG52YXIgUkVBQ1RfUkVTUE9OREVSX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5yZXNwb25kZXInKSA6IDB4ZWFkNjtcbnZhciBSRUFDVF9TQ09QRV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3Quc2NvcGUnKSA6IDB4ZWFkNztcblxuZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJyB8fCAvLyBOb3RlOiBpdHMgdHlwZW9mIG1pZ2h0IGJlIG90aGVyIHRoYW4gJ3N5bWJvbCcgb3IgJ251bWJlcicgaWYgaXQncyBhIHBvbHlmaWxsLlxuICB0eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1BST0ZJTEVSX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCAmJiAodHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9QUk9WSURFUl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NPTlRFWFRfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZVTkRBTUVOVEFMX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfUkVTUE9OREVSX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfU0NPUEVfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9CTE9DS19UWVBFKTtcbn1cblxuZnVuY3Rpb24gdHlwZU9mKG9iamVjdCkge1xuICBpZiAodHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyICQkdHlwZW9mID0gb2JqZWN0LiQkdHlwZW9mO1xuXG4gICAgc3dpdGNoICgkJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgIHZhciB0eXBlID0gb2JqZWN0LnR5cGU7XG5cbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgY2FzZSBSRUFDVF9BU1lOQ19NT0RFX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX0ZSQUdNRU5UX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9QUk9GSUxFUl9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICAgICAgICByZXR1cm4gdHlwZTtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB2YXIgJCR0eXBlb2ZUeXBlID0gdHlwZSAmJiB0eXBlLiQkdHlwZW9mO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKCQkdHlwZW9mVHlwZSkge1xuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfUFJPVklERVJfVFlQRTpcbiAgICAgICAgICAgICAgICByZXR1cm4gJCR0eXBlb2ZUeXBlO1xuXG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuICQkdHlwZW9mO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgcmV0dXJuICQkdHlwZW9mO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59IC8vIEFzeW5jTW9kZSBpcyBkZXByZWNhdGVkIGFsb25nIHdpdGggaXNBc3luY01vZGVcblxudmFyIEFzeW5jTW9kZSA9IFJFQUNUX0FTWU5DX01PREVfVFlQRTtcbnZhciBDb25jdXJyZW50TW9kZSA9IFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFO1xudmFyIENvbnRleHRDb25zdW1lciA9IFJFQUNUX0NPTlRFWFRfVFlQRTtcbnZhciBDb250ZXh0UHJvdmlkZXIgPSBSRUFDVF9QUk9WSURFUl9UWVBFO1xudmFyIEVsZW1lbnQgPSBSRUFDVF9FTEVNRU5UX1RZUEU7XG52YXIgRm9yd2FyZFJlZiA9IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU7XG52YXIgRnJhZ21lbnQgPSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xudmFyIExhenkgPSBSRUFDVF9MQVpZX1RZUEU7XG52YXIgTWVtbyA9IFJFQUNUX01FTU9fVFlQRTtcbnZhciBQb3J0YWwgPSBSRUFDVF9QT1JUQUxfVFlQRTtcbnZhciBQcm9maWxlciA9IFJFQUNUX1BST0ZJTEVSX1RZUEU7XG52YXIgU3RyaWN0TW9kZSA9IFJFQUNUX1NUUklDVF9NT0RFX1RZUEU7XG52YXIgU3VzcGVuc2UgPSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xudmFyIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlID0gZmFsc2U7IC8vIEFzeW5jTW9kZSBzaG91bGQgYmUgZGVwcmVjYXRlZFxuXG5mdW5jdGlvbiBpc0FzeW5jTW9kZShvYmplY3QpIHtcbiAge1xuICAgIGlmICghaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNBc3luY01vZGUpIHtcbiAgICAgIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlID0gdHJ1ZTsgLy8gVXNpbmcgY29uc29sZVsnd2FybiddIHRvIGV2YWRlIEJhYmVsIGFuZCBFU0xpbnRcblxuICAgICAgY29uc29sZVsnd2FybiddKCdUaGUgUmVhY3RJcy5pc0FzeW5jTW9kZSgpIGFsaWFzIGhhcyBiZWVuIGRlcHJlY2F0ZWQsICcgKyAnYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBSZWFjdCAxNysuIFVwZGF0ZSB5b3VyIGNvZGUgdG8gdXNlICcgKyAnUmVhY3RJcy5pc0NvbmN1cnJlbnRNb2RlKCkgaW5zdGVhZC4gSXQgaGFzIHRoZSBleGFjdCBzYW1lIEFQSS4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaXNDb25jdXJyZW50TW9kZShvYmplY3QpIHx8IHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9BU1lOQ19NT0RFX1RZUEU7XG59XG5mdW5jdGlvbiBpc0NvbmN1cnJlbnRNb2RlKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFO1xufVxuZnVuY3Rpb24gaXNDb250ZXh0Q29uc3VtZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNDb250ZXh0UHJvdmlkZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRWxlbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCAmJiBvYmplY3QuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRm9yd2FyZFJlZihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFO1xufVxuZnVuY3Rpb24gaXNGcmFnbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNMYXp5KG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0xBWllfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzTWVtbyhvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9NRU1PX1RZUEU7XG59XG5mdW5jdGlvbiBpc1BvcnRhbChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9QT1JUQUxfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzUHJvZmlsZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUFJPRklMRVJfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzU3RyaWN0TW9kZShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFO1xufVxuZnVuY3Rpb24gaXNTdXNwZW5zZShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xufVxuXG5leHBvcnRzLkFzeW5jTW9kZSA9IEFzeW5jTW9kZTtcbmV4cG9ydHMuQ29uY3VycmVudE1vZGUgPSBDb25jdXJyZW50TW9kZTtcbmV4cG9ydHMuQ29udGV4dENvbnN1bWVyID0gQ29udGV4dENvbnN1bWVyO1xuZXhwb3J0cy5Db250ZXh0UHJvdmlkZXIgPSBDb250ZXh0UHJvdmlkZXI7XG5leHBvcnRzLkVsZW1lbnQgPSBFbGVtZW50O1xuZXhwb3J0cy5Gb3J3YXJkUmVmID0gRm9yd2FyZFJlZjtcbmV4cG9ydHMuRnJhZ21lbnQgPSBGcmFnbWVudDtcbmV4cG9ydHMuTGF6eSA9IExhenk7XG5leHBvcnRzLk1lbW8gPSBNZW1vO1xuZXhwb3J0cy5Qb3J0YWwgPSBQb3J0YWw7XG5leHBvcnRzLlByb2ZpbGVyID0gUHJvZmlsZXI7XG5leHBvcnRzLlN0cmljdE1vZGUgPSBTdHJpY3RNb2RlO1xuZXhwb3J0cy5TdXNwZW5zZSA9IFN1c3BlbnNlO1xuZXhwb3J0cy5pc0FzeW5jTW9kZSA9IGlzQXN5bmNNb2RlO1xuZXhwb3J0cy5pc0NvbmN1cnJlbnRNb2RlID0gaXNDb25jdXJyZW50TW9kZTtcbmV4cG9ydHMuaXNDb250ZXh0Q29uc3VtZXIgPSBpc0NvbnRleHRDb25zdW1lcjtcbmV4cG9ydHMuaXNDb250ZXh0UHJvdmlkZXIgPSBpc0NvbnRleHRQcm92aWRlcjtcbmV4cG9ydHMuaXNFbGVtZW50ID0gaXNFbGVtZW50O1xuZXhwb3J0cy5pc0ZvcndhcmRSZWYgPSBpc0ZvcndhcmRSZWY7XG5leHBvcnRzLmlzRnJhZ21lbnQgPSBpc0ZyYWdtZW50O1xuZXhwb3J0cy5pc0xhenkgPSBpc0xhenk7XG5leHBvcnRzLmlzTWVtbyA9IGlzTWVtbztcbmV4cG9ydHMuaXNQb3J0YWwgPSBpc1BvcnRhbDtcbmV4cG9ydHMuaXNQcm9maWxlciA9IGlzUHJvZmlsZXI7XG5leHBvcnRzLmlzU3RyaWN0TW9kZSA9IGlzU3RyaWN0TW9kZTtcbmV4cG9ydHMuaXNTdXNwZW5zZSA9IGlzU3VzcGVuc2U7XG5leHBvcnRzLmlzVmFsaWRFbGVtZW50VHlwZSA9IGlzVmFsaWRFbGVtZW50VHlwZTtcbmV4cG9ydHMudHlwZU9mID0gdHlwZU9mO1xuICB9KSgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWlzLnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWlzLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiO1xuaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXNzZXJ0VGhpc0luaXRpYWxpemVkXCI7XG5pbXBvcnQgX2luaGVyaXRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzXCI7XG5pbXBvcnQgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4gZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVyblwiO1xuaW1wb3J0IF9nZXRQcm90b3R5cGVPZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9nZXRQcm90b3R5cGVPZlwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiO1xuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTsgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7IHRyeSB7IEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgSlNPTkFycm93IGZyb20gJy4vSlNPTkFycm93JztcblxudmFyIEl0ZW1SYW5nZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoSXRlbVJhbmdlLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKEl0ZW1SYW5nZSk7XG5cbiAgZnVuY3Rpb24gSXRlbVJhbmdlKHByb3BzKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEl0ZW1SYW5nZSk7XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHByb3BzKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJoYW5kbGVDbGlja1wiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGV4cGFuZGVkOiAhX3RoaXMuc3RhdGUuZXhwYW5kZWRcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICBleHBhbmRlZDogZmFsc2VcbiAgICB9O1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhJdGVtUmFuZ2UsIFt7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIHN0eWxpbmcgPSBfdGhpcyRwcm9wcy5zdHlsaW5nLFxuICAgICAgICAgIGZyb20gPSBfdGhpcyRwcm9wcy5mcm9tLFxuICAgICAgICAgIHRvID0gX3RoaXMkcHJvcHMudG8sXG4gICAgICAgICAgcmVuZGVyQ2hpbGROb2RlcyA9IF90aGlzJHByb3BzLnJlbmRlckNoaWxkTm9kZXMsXG4gICAgICAgICAgbm9kZVR5cGUgPSBfdGhpcyRwcm9wcy5ub2RlVHlwZTtcbiAgICAgIHJldHVybiB0aGlzLnN0YXRlLmV4cGFuZGVkID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgc3R5bGluZygnaXRlbVJhbmdlJywgdGhpcy5zdGF0ZS5leHBhbmRlZCksIHJlbmRlckNoaWxkTm9kZXModGhpcy5wcm9wcywgZnJvbSwgdG8pKSA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHt9LCBzdHlsaW5nKCdpdGVtUmFuZ2UnLCB0aGlzLnN0YXRlLmV4cGFuZGVkKSwge1xuICAgICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZUNsaWNrXG4gICAgICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSlNPTkFycm93LCB7XG4gICAgICAgIG5vZGVUeXBlOiBub2RlVHlwZSxcbiAgICAgICAgc3R5bGluZzogc3R5bGluZyxcbiAgICAgICAgZXhwYW5kZWQ6IGZhbHNlLFxuICAgICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZUNsaWNrLFxuICAgICAgICBhcnJvd1N0eWxlOiBcImRvdWJsZVwiXG4gICAgICB9KSwgXCJcIi5jb25jYXQoZnJvbSwgXCIgLi4uIFwiKS5jb25jYXQodG8pKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gSXRlbVJhbmdlO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5fZGVmaW5lUHJvcGVydHkoSXRlbVJhbmdlLCBcInByb3BUeXBlc1wiLCB7XG4gIHN0eWxpbmc6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIGZyb206IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgdG86IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgcmVuZGVyQ2hpbGROb2RlczogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgbm9kZVR5cGU6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZFxufSk7XG5cbmV4cG9ydCB7IEl0ZW1SYW5nZSBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJkYXRhXCJdO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgSlNPTk5lc3RlZE5vZGUgZnJvbSAnLi9KU09OTmVzdGVkTm9kZSc7XG5cbi8vIFJldHVybnMgdGhlIFwibiBJdGVtc1wiIHN0cmluZyBmb3IgdGhpcyBub2RlLFxuLy8gZ2VuZXJhdGluZyBhbmQgY2FjaGluZyBpdCBpZiBpdCBoYXNuJ3QgYmVlbiBjcmVhdGVkIHlldC5cbmZ1bmN0aW9uIGNyZWF0ZUl0ZW1TdHJpbmcoZGF0YSkge1xuICByZXR1cm4gXCJcIi5jb25jYXQoZGF0YS5sZW5ndGgsIFwiIFwiKS5jb25jYXQoZGF0YS5sZW5ndGggIT09IDEgPyAnaXRlbXMnIDogJ2l0ZW0nKTtcbn1cblxuLy8gQ29uZmlndXJlcyA8SlNPTk5lc3RlZE5vZGU+IHRvIHJlbmRlciBhbiBBcnJheVxudmFyIEpTT05BcnJheU5vZGUgPSBmdW5jdGlvbiBKU09OQXJyYXlOb2RlKF9yZWYpIHtcbiAgdmFyIGRhdGEgPSBfcmVmLmRhdGEsXG4gICAgICBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmLCBfZXhjbHVkZWQpO1xuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChKU09OTmVzdGVkTm9kZSwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgZGF0YTogZGF0YSxcbiAgICBub2RlVHlwZTogXCJBcnJheVwiLFxuICAgIG5vZGVUeXBlSW5kaWNhdG9yOiBcIltdXCIsXG4gICAgY3JlYXRlSXRlbVN0cmluZzogY3JlYXRlSXRlbVN0cmluZyxcbiAgICBleHBhbmRhYmxlOiBkYXRhLmxlbmd0aCA+IDBcbiAgfSkpO1xufTtcblxuSlNPTkFycmF5Tm9kZS5wcm9wVHlwZXMgPSB7XG4gIGRhdGE6IFByb3BUeXBlcy5hcnJheVxufTtcbmV4cG9ydCBkZWZhdWx0IEpTT05BcnJheU5vZGU7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIjtcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuXG52YXIgSlNPTkFycm93ID0gZnVuY3Rpb24gSlNPTkFycm93KF9yZWYpIHtcbiAgdmFyIHN0eWxpbmcgPSBfcmVmLnN0eWxpbmcsXG4gICAgICBhcnJvd1N0eWxlID0gX3JlZi5hcnJvd1N0eWxlLFxuICAgICAgZXhwYW5kZWQgPSBfcmVmLmV4cGFuZGVkLFxuICAgICAgbm9kZVR5cGUgPSBfcmVmLm5vZGVUeXBlLFxuICAgICAgb25DbGljayA9IF9yZWYub25DbGljaztcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHt9LCBzdHlsaW5nKCdhcnJvd0NvbnRhaW5lcicsIGFycm93U3R5bGUpLCB7XG4gICAgb25DbGljazogb25DbGlja1xuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgc3R5bGluZyhbJ2Fycm93JywgJ2Fycm93U2lnbiddLCBub2RlVHlwZSwgZXhwYW5kZWQsIGFycm93U3R5bGUpLCBcIlxcdTI1QjZcIiwgYXJyb3dTdHlsZSA9PT0gJ2RvdWJsZScgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgc3R5bGluZyhbJ2Fycm93U2lnbicsICdhcnJvd1NpZ25Jbm5lciddKSwgXCJcXHUyNUI2XCIpKSk7XG59O1xuXG5KU09OQXJyb3cucHJvcFR5cGVzID0ge1xuICBzdHlsaW5nOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBhcnJvd1N0eWxlOiBQcm9wVHlwZXMub25lT2YoWydzaW5nbGUnLCAnZG91YmxlJ10pLFxuICBleHBhbmRlZDogUHJvcFR5cGVzLmJvb2wuaXNSZXF1aXJlZCxcbiAgbm9kZVR5cGU6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgb25DbGljazogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZFxufTtcbkpTT05BcnJvdy5kZWZhdWx0UHJvcHMgPSB7XG4gIGFycm93U3R5bGU6ICdzaW5nbGUnXG59O1xuZXhwb3J0IGRlZmF1bHQgSlNPTkFycm93OyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCI7XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKG8sIGFsbG93QXJyYXlMaWtlKSB7IHZhciBpdCA9IHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdIHx8IG9bXCJAQGl0ZXJhdG9yXCJdOyBpZiAoIWl0KSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChpdCA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvKSkgfHwgYWxsb3dBcnJheUxpa2UgJiYgbyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHsgaWYgKGl0KSBvID0gaXQ7IHZhciBpID0gMDsgdmFyIEYgPSBmdW5jdGlvbiBGKCkge307IHJldHVybiB7IHM6IEYsIG46IGZ1bmN0aW9uIG4oKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH0sIGU6IGZ1bmN0aW9uIGUoX2UpIHsgdGhyb3cgX2U7IH0sIGY6IEYgfTsgfSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gdmFyIG5vcm1hbENvbXBsZXRpb24gPSB0cnVlLCBkaWRFcnIgPSBmYWxzZSwgZXJyOyByZXR1cm4geyBzOiBmdW5jdGlvbiBzKCkgeyBpdCA9IGl0LmNhbGwobyk7IH0sIG46IGZ1bmN0aW9uIG4oKSB7IHZhciBzdGVwID0gaXQubmV4dCgpOyBub3JtYWxDb21wbGV0aW9uID0gc3RlcC5kb25lOyByZXR1cm4gc3RlcDsgfSwgZTogZnVuY3Rpb24gZShfZTIpIHsgZGlkRXJyID0gdHJ1ZTsgZXJyID0gX2UyOyB9LCBmOiBmdW5jdGlvbiBmKCkgeyB0cnkgeyBpZiAoIW5vcm1hbENvbXBsZXRpb24gJiYgaXQucmV0dXJuICE9IG51bGwpIGl0LnJldHVybigpOyB9IGZpbmFsbHkgeyBpZiAoZGlkRXJyKSB0aHJvdyBlcnI7IH0gfSB9OyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBKU09OTmVzdGVkTm9kZSBmcm9tICcuL0pTT05OZXN0ZWROb2RlJztcblxuLy8gUmV0dXJucyB0aGUgXCJuIEl0ZW1zXCIgc3RyaW5nIGZvciB0aGlzIG5vZGUsXG4vLyBnZW5lcmF0aW5nIGFuZCBjYWNoaW5nIGl0IGlmIGl0IGhhc24ndCBiZWVuIGNyZWF0ZWQgeWV0LlxuZnVuY3Rpb24gY3JlYXRlSXRlbVN0cmluZyhkYXRhLCBsaW1pdCkge1xuICB2YXIgY291bnQgPSAwO1xuICB2YXIgaGFzTW9yZSA9IGZhbHNlO1xuXG4gIGlmIChOdW1iZXIuaXNTYWZlSW50ZWdlcihkYXRhLnNpemUpKSB7XG4gICAgY291bnQgPSBkYXRhLnNpemU7XG4gIH0gZWxzZSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgdmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGRhdGEpLFxuICAgICAgICBfc3RlcDtcblxuICAgIHRyeSB7XG4gICAgICBmb3IgKF9pdGVyYXRvci5zKCk7ICEoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lOykge1xuICAgICAgICB2YXIgZW50cnkgPSBfc3RlcC52YWx1ZTtcblxuICAgICAgICBpZiAobGltaXQgJiYgY291bnQgKyAxID4gbGltaXQpIHtcbiAgICAgICAgICBoYXNNb3JlID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvdW50ICs9IDE7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBfaXRlcmF0b3IuZShlcnIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBfaXRlcmF0b3IuZigpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBcIlwiLmNvbmNhdChoYXNNb3JlID8gJz4nIDogJycpLmNvbmNhdChjb3VudCwgXCIgXCIpLmNvbmNhdChjb3VudCAhPT0gMSA/ICdlbnRyaWVzJyA6ICdlbnRyeScpO1xufVxuXG4vLyBDb25maWd1cmVzIDxKU09OTmVzdGVkTm9kZT4gdG8gcmVuZGVyIGFuIGl0ZXJhYmxlXG52YXIgSlNPTkl0ZXJhYmxlTm9kZSA9IGZ1bmN0aW9uIEpTT05JdGVyYWJsZU5vZGUoX3JlZikge1xuICB2YXIgcHJvcHMgPSBfZXh0ZW5kcyh7fSwgX3JlZik7XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05OZXN0ZWROb2RlLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICBub2RlVHlwZTogXCJJdGVyYWJsZVwiLFxuICAgIG5vZGVUeXBlSW5kaWNhdG9yOiBcIigpXCIsXG4gICAgY3JlYXRlSXRlbVN0cmluZzogY3JlYXRlSXRlbVN0cmluZ1xuICB9KSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBKU09OSXRlcmFibGVOb2RlOyIsImltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2Fzc2VydFRoaXNJbml0aWFsaXplZFwiO1xuaW1wb3J0IF9pbmhlcml0cyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiO1xuaW1wb3J0IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm5cIjtcbmltcG9ydCBfZ2V0UHJvdG90eXBlT2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZ2V0UHJvdG90eXBlT2ZcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9Db25zdW1hYmxlQXJyYXlcIjtcbmltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCI7XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBKU09OQXJyb3cgZnJvbSAnLi9KU09OQXJyb3cnO1xuaW1wb3J0IGdldENvbGxlY3Rpb25FbnRyaWVzIGZyb20gJy4vZ2V0Q29sbGVjdGlvbkVudHJpZXMnO1xuaW1wb3J0IEpTT05Ob2RlIGZyb20gJy4vSlNPTk5vZGUnO1xuaW1wb3J0IEl0ZW1SYW5nZSBmcm9tICcuL0l0ZW1SYW5nZSc7XG5cbmZ1bmN0aW9uIGlzUmFuZ2UocmFuZ2VPckVudHJ5KSB7XG4gIHJldHVybiByYW5nZU9yRW50cnkudG8gIT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gcmVuZGVyQ2hpbGROb2Rlcyhwcm9wcywgZnJvbSwgdG8pIHtcbiAgdmFyIG5vZGVUeXBlID0gcHJvcHMubm9kZVR5cGUsXG4gICAgICBkYXRhID0gcHJvcHMuZGF0YSxcbiAgICAgIGNvbGxlY3Rpb25MaW1pdCA9IHByb3BzLmNvbGxlY3Rpb25MaW1pdCxcbiAgICAgIGNpcmN1bGFyQ2FjaGUgPSBwcm9wcy5jaXJjdWxhckNhY2hlLFxuICAgICAga2V5UGF0aCA9IHByb3BzLmtleVBhdGgsXG4gICAgICBwb3N0cHJvY2Vzc1ZhbHVlID0gcHJvcHMucG9zdHByb2Nlc3NWYWx1ZSxcbiAgICAgIHNvcnRPYmplY3RLZXlzID0gcHJvcHMuc29ydE9iamVjdEtleXM7XG4gIHZhciBjaGlsZE5vZGVzID0gW107XG4gIGdldENvbGxlY3Rpb25FbnRyaWVzKG5vZGVUeXBlLCBkYXRhLCBzb3J0T2JqZWN0S2V5cywgY29sbGVjdGlvbkxpbWl0LCBmcm9tLCB0bykuZm9yRWFjaChmdW5jdGlvbiAoZW50cnkpIHtcbiAgICBpZiAoaXNSYW5nZShlbnRyeSkpIHtcbiAgICAgIGNoaWxkTm9kZXMucHVzaCggLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSXRlbVJhbmdlLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICAgICAga2V5OiBcIkl0ZW1SYW5nZS0tXCIuY29uY2F0KGVudHJ5LmZyb20sIFwiLVwiKS5jb25jYXQoZW50cnkudG8pLFxuICAgICAgICBmcm9tOiBlbnRyeS5mcm9tLFxuICAgICAgICB0bzogZW50cnkudG8sXG4gICAgICAgIHJlbmRlckNoaWxkTm9kZXM6IHJlbmRlckNoaWxkTm9kZXNcbiAgICAgIH0pKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBrZXkgPSBlbnRyeS5rZXksXG4gICAgICAgICAgdmFsdWUgPSBlbnRyeS52YWx1ZTtcbiAgICAgIHZhciBpc0NpcmN1bGFyID0gY2lyY3VsYXJDYWNoZS5pbmRleE9mKHZhbHVlKSAhPT0gLTE7XG4gICAgICBjaGlsZE5vZGVzLnB1c2goIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05Ob2RlLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICAgICAgcG9zdHByb2Nlc3NWYWx1ZTogcG9zdHByb2Nlc3NWYWx1ZSxcbiAgICAgICAgY29sbGVjdGlvbkxpbWl0OiBjb2xsZWN0aW9uTGltaXQsXG4gICAgICAgIGtleTogXCJOb2RlLS1cIi5jb25jYXQoa2V5KSxcbiAgICAgICAga2V5UGF0aDogW2tleV0uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShrZXlQYXRoKSksXG4gICAgICAgIHZhbHVlOiBwb3N0cHJvY2Vzc1ZhbHVlKHZhbHVlKSxcbiAgICAgICAgY2lyY3VsYXJDYWNoZTogW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShjaXJjdWxhckNhY2hlKSwgW3ZhbHVlXSksXG4gICAgICAgIGlzQ2lyY3VsYXI6IGlzQ2lyY3VsYXIsXG4gICAgICAgIGhpZGVSb290OiBmYWxzZVxuICAgICAgfSkpKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gY2hpbGROb2Rlcztcbn1cblxuZnVuY3Rpb24gZ2V0U3RhdGVGcm9tUHJvcHMocHJvcHMpIHtcbiAgLy8gY2FsY3VsYXRlIGluZGl2aWR1YWwgbm9kZSBleHBhbnNpb24gaWYgbmVjZXNzYXJ5XG4gIHZhciBleHBhbmRlZCA9ICFwcm9wcy5pc0NpcmN1bGFyID8gcHJvcHMuc2hvdWxkRXhwYW5kTm9kZShwcm9wcy5rZXlQYXRoLCBwcm9wcy5kYXRhLCBwcm9wcy5sZXZlbCkgOiBmYWxzZTtcbiAgcmV0dXJuIHtcbiAgICBleHBhbmRlZDogZXhwYW5kZWRcbiAgfTtcbn1cblxudmFyIEpTT05OZXN0ZWROb2RlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhKU09OTmVzdGVkTm9kZSwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihKU09OTmVzdGVkTm9kZSk7XG5cbiAgZnVuY3Rpb24gSlNPTk5lc3RlZE5vZGUocHJvcHMpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgSlNPTk5lc3RlZE5vZGUpO1xuXG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBwcm9wcyk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiaGFuZGxlQ2xpY2tcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKF90aGlzLnByb3BzLmV4cGFuZGFibGUpIHtcbiAgICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGV4cGFuZGVkOiAhX3RoaXMuc3RhdGUuZXhwYW5kZWRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBfdGhpcy5zdGF0ZSA9IGdldFN0YXRlRnJvbVByb3BzKHByb3BzKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoSlNPTk5lc3RlZE5vZGUsIFt7XG4gICAga2V5OiBcIlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcykge1xuICAgICAgdmFyIG5leHRTdGF0ZSA9IGdldFN0YXRlRnJvbVByb3BzKG5leHRQcm9wcyk7XG5cbiAgICAgIGlmIChnZXRTdGF0ZUZyb21Qcm9wcyh0aGlzLnByb3BzKS5leHBhbmRlZCAhPT0gbmV4dFN0YXRlLmV4cGFuZGVkKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUobmV4dFN0YXRlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2hvdWxkQ29tcG9uZW50VXBkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNob3VsZENvbXBvbmVudFVwZGF0ZShuZXh0UHJvcHMsIG5leHRTdGF0ZSkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHJldHVybiAhIU9iamVjdC5rZXlzKG5leHRQcm9wcykuZmluZChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHJldHVybiBrZXkgIT09ICdjaXJjdWxhckNhY2hlJyAmJiAoa2V5ID09PSAna2V5UGF0aCcgPyBuZXh0UHJvcHNba2V5XS5qb2luKCcvJykgIT09IF90aGlzMi5wcm9wc1trZXldLmpvaW4oJy8nKSA6IG5leHRQcm9wc1trZXldICE9PSBfdGhpczIucHJvcHNba2V5XSk7XG4gICAgICB9KSB8fCBuZXh0U3RhdGUuZXhwYW5kZWQgIT09IHRoaXMuc3RhdGUuZXhwYW5kZWQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIGdldEl0ZW1TdHJpbmcgPSBfdGhpcyRwcm9wcy5nZXRJdGVtU3RyaW5nLFxuICAgICAgICAgIG5vZGVUeXBlSW5kaWNhdG9yID0gX3RoaXMkcHJvcHMubm9kZVR5cGVJbmRpY2F0b3IsXG4gICAgICAgICAgbm9kZVR5cGUgPSBfdGhpcyRwcm9wcy5ub2RlVHlwZSxcbiAgICAgICAgICBkYXRhID0gX3RoaXMkcHJvcHMuZGF0YSxcbiAgICAgICAgICBoaWRlUm9vdCA9IF90aGlzJHByb3BzLmhpZGVSb290LFxuICAgICAgICAgIGNyZWF0ZUl0ZW1TdHJpbmcgPSBfdGhpcyRwcm9wcy5jcmVhdGVJdGVtU3RyaW5nLFxuICAgICAgICAgIHN0eWxpbmcgPSBfdGhpcyRwcm9wcy5zdHlsaW5nLFxuICAgICAgICAgIGNvbGxlY3Rpb25MaW1pdCA9IF90aGlzJHByb3BzLmNvbGxlY3Rpb25MaW1pdCxcbiAgICAgICAgICBrZXlQYXRoID0gX3RoaXMkcHJvcHMua2V5UGF0aCxcbiAgICAgICAgICBsYWJlbFJlbmRlcmVyID0gX3RoaXMkcHJvcHMubGFiZWxSZW5kZXJlcixcbiAgICAgICAgICBleHBhbmRhYmxlID0gX3RoaXMkcHJvcHMuZXhwYW5kYWJsZTtcbiAgICAgIHZhciBleHBhbmRlZCA9IHRoaXMuc3RhdGUuZXhwYW5kZWQ7XG4gICAgICB2YXIgcmVuZGVyZWRDaGlsZHJlbiA9IGV4cGFuZGVkIHx8IGhpZGVSb290ICYmIHRoaXMucHJvcHMubGV2ZWwgPT09IDAgPyByZW5kZXJDaGlsZE5vZGVzKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgdGhpcy5wcm9wcyksIHt9LCB7XG4gICAgICAgIGxldmVsOiB0aGlzLnByb3BzLmxldmVsICsgMVxuICAgICAgfSkpIDogbnVsbDtcbiAgICAgIHZhciBpdGVtVHlwZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBzdHlsaW5nKCduZXN0ZWROb2RlSXRlbVR5cGUnLCBleHBhbmRlZCksIG5vZGVUeXBlSW5kaWNhdG9yKTtcbiAgICAgIHZhciByZW5kZXJlZEl0ZW1TdHJpbmcgPSBnZXRJdGVtU3RyaW5nKG5vZGVUeXBlLCBkYXRhLCBpdGVtVHlwZSwgY3JlYXRlSXRlbVN0cmluZyhkYXRhLCBjb2xsZWN0aW9uTGltaXQpLCBrZXlQYXRoKTtcbiAgICAgIHZhciBzdHlsaW5nQXJncyA9IFtrZXlQYXRoLCBub2RlVHlwZSwgZXhwYW5kZWQsIGV4cGFuZGFibGVdO1xuICAgICAgcmV0dXJuIGhpZGVSb290ID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCBzdHlsaW5nLmFwcGx5KHZvaWQgMCwgWydyb290Tm9kZSddLmNvbmNhdChzdHlsaW5nQXJncykpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInVsXCIsIHN0eWxpbmcuYXBwbHkodm9pZCAwLCBbJ3Jvb3ROb2RlQ2hpbGRyZW4nXS5jb25jYXQoc3R5bGluZ0FyZ3MpKSwgcmVuZGVyZWRDaGlsZHJlbikpIDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCBzdHlsaW5nLmFwcGx5KHZvaWQgMCwgWyduZXN0ZWROb2RlJ10uY29uY2F0KHN0eWxpbmdBcmdzKSksIGV4cGFuZGFibGUgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSlNPTkFycm93LCB7XG4gICAgICAgIHN0eWxpbmc6IHN0eWxpbmcsXG4gICAgICAgIG5vZGVUeXBlOiBub2RlVHlwZSxcbiAgICAgICAgZXhwYW5kZWQ6IGV4cGFuZGVkLFxuICAgICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZUNsaWNrXG4gICAgICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiLCBfZXh0ZW5kcyh7fSwgc3R5bGluZy5hcHBseSh2b2lkIDAsIFtbJ2xhYmVsJywgJ25lc3RlZE5vZGVMYWJlbCddXS5jb25jYXQoc3R5bGluZ0FyZ3MpKSwge1xuICAgICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZUNsaWNrXG4gICAgICB9KSwgbGFiZWxSZW5kZXJlci5hcHBseSh2b2lkIDAsIHN0eWxpbmdBcmdzKSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBfZXh0ZW5kcyh7fSwgc3R5bGluZy5hcHBseSh2b2lkIDAsIFsnbmVzdGVkTm9kZUl0ZW1TdHJpbmcnXS5jb25jYXQoc3R5bGluZ0FyZ3MpKSwge1xuICAgICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZUNsaWNrXG4gICAgICB9KSwgcmVuZGVyZWRJdGVtU3RyaW5nKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCBzdHlsaW5nLmFwcGx5KHZvaWQgMCwgWyduZXN0ZWROb2RlQ2hpbGRyZW4nXS5jb25jYXQoc3R5bGluZ0FyZ3MpKSwgcmVuZGVyZWRDaGlsZHJlbikpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBKU09OTmVzdGVkTm9kZTtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxuX2RlZmluZVByb3BlcnR5KEpTT05OZXN0ZWROb2RlLCBcInByb3BUeXBlc1wiLCB7XG4gIGdldEl0ZW1TdHJpbmc6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIG5vZGVUeXBlSW5kaWNhdG9yOiBQcm9wVHlwZXMuYW55LFxuICBub2RlVHlwZTogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICBkYXRhOiBQcm9wVHlwZXMuYW55LFxuICBoaWRlUm9vdDogUHJvcFR5cGVzLmJvb2wuaXNSZXF1aXJlZCxcbiAgY3JlYXRlSXRlbVN0cmluZzogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgc3R5bGluZzogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgY29sbGVjdGlvbkxpbWl0OiBQcm9wVHlwZXMubnVtYmVyLFxuICBrZXlQYXRoOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMubnVtYmVyXSkpLmlzUmVxdWlyZWQsXG4gIGxhYmVsUmVuZGVyZXI6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIHNob3VsZEV4cGFuZE5vZGU6IFByb3BUeXBlcy5mdW5jLFxuICBsZXZlbDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICBzb3J0T2JqZWN0S2V5czogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmZ1bmMsIFByb3BUeXBlcy5ib29sXSksXG4gIGlzQ2lyY3VsYXI6IFByb3BUeXBlcy5ib29sLFxuICBleHBhbmRhYmxlOiBQcm9wVHlwZXMuYm9vbFxufSk7XG5cbl9kZWZpbmVQcm9wZXJ0eShKU09OTmVzdGVkTm9kZSwgXCJkZWZhdWx0UHJvcHNcIiwge1xuICBkYXRhOiBbXSxcbiAgY2lyY3VsYXJDYWNoZTogW10sXG4gIGxldmVsOiAwLFxuICBleHBhbmRhYmxlOiB0cnVlXG59KTtcblxuZXhwb3J0IHsgSlNPTk5lc3RlZE5vZGUgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wiZ2V0SXRlbVN0cmluZ1wiLCBcImtleVBhdGhcIiwgXCJsYWJlbFJlbmRlcmVyXCIsIFwic3R5bGluZ1wiLCBcInZhbHVlXCIsIFwidmFsdWVSZW5kZXJlclwiLCBcImlzQ3VzdG9tTm9kZVwiXTtcblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgb2JqVHlwZSBmcm9tICcuL29ialR5cGUnO1xuaW1wb3J0IEpTT05PYmplY3ROb2RlIGZyb20gJy4vSlNPTk9iamVjdE5vZGUnO1xuaW1wb3J0IEpTT05BcnJheU5vZGUgZnJvbSAnLi9KU09OQXJyYXlOb2RlJztcbmltcG9ydCBKU09OSXRlcmFibGVOb2RlIGZyb20gJy4vSlNPTkl0ZXJhYmxlTm9kZSc7XG5pbXBvcnQgSlNPTlZhbHVlTm9kZSBmcm9tICcuL0pTT05WYWx1ZU5vZGUnO1xuXG52YXIgSlNPTk5vZGUgPSBmdW5jdGlvbiBKU09OTm9kZShfcmVmKSB7XG4gIHZhciBnZXRJdGVtU3RyaW5nID0gX3JlZi5nZXRJdGVtU3RyaW5nLFxuICAgICAga2V5UGF0aCA9IF9yZWYua2V5UGF0aCxcbiAgICAgIGxhYmVsUmVuZGVyZXIgPSBfcmVmLmxhYmVsUmVuZGVyZXIsXG4gICAgICBzdHlsaW5nID0gX3JlZi5zdHlsaW5nLFxuICAgICAgdmFsdWUgPSBfcmVmLnZhbHVlLFxuICAgICAgdmFsdWVSZW5kZXJlciA9IF9yZWYudmFsdWVSZW5kZXJlcixcbiAgICAgIGlzQ3VzdG9tTm9kZSA9IF9yZWYuaXNDdXN0b21Ob2RlLFxuICAgICAgcmVzdCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmLCBfZXhjbHVkZWQpO1xuXG4gIHZhciBub2RlVHlwZSA9IGlzQ3VzdG9tTm9kZSh2YWx1ZSkgPyAnQ3VzdG9tJyA6IG9ialR5cGUodmFsdWUpO1xuICB2YXIgc2ltcGxlTm9kZVByb3BzID0ge1xuICAgIGdldEl0ZW1TdHJpbmc6IGdldEl0ZW1TdHJpbmcsXG4gICAga2V5OiBrZXlQYXRoWzBdLFxuICAgIGtleVBhdGg6IGtleVBhdGgsXG4gICAgbGFiZWxSZW5kZXJlcjogbGFiZWxSZW5kZXJlcixcbiAgICBub2RlVHlwZTogbm9kZVR5cGUsXG4gICAgc3R5bGluZzogc3R5bGluZyxcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgdmFsdWVSZW5kZXJlcjogdmFsdWVSZW5kZXJlclxuICB9O1xuXG4gIHZhciBuZXN0ZWROb2RlUHJvcHMgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcmVzdCksIHNpbXBsZU5vZGVQcm9wcyksIHt9LCB7XG4gICAgZGF0YTogdmFsdWUsXG4gICAgaXNDdXN0b21Ob2RlOiBpc0N1c3RvbU5vZGVcbiAgfSk7XG5cbiAgc3dpdGNoIChub2RlVHlwZSkge1xuICAgIGNhc2UgJ09iamVjdCc6XG4gICAgY2FzZSAnRXJyb3InOlxuICAgIGNhc2UgJ1dlYWtNYXAnOlxuICAgIGNhc2UgJ1dlYWtTZXQnOlxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05PYmplY3ROb2RlLCBuZXN0ZWROb2RlUHJvcHMpO1xuXG4gICAgY2FzZSAnQXJyYXknOlxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05BcnJheU5vZGUsIG5lc3RlZE5vZGVQcm9wcyk7XG5cbiAgICBjYXNlICdJdGVyYWJsZSc6XG4gICAgY2FzZSAnTWFwJzpcbiAgICBjYXNlICdTZXQnOlxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05JdGVyYWJsZU5vZGUsIG5lc3RlZE5vZGVQcm9wcyk7XG5cbiAgICBjYXNlICdTdHJpbmcnOlxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05WYWx1ZU5vZGUsIF9leHRlbmRzKHt9LCBzaW1wbGVOb2RlUHJvcHMsIHtcbiAgICAgICAgdmFsdWVHZXR0ZXI6IGZ1bmN0aW9uIHZhbHVlR2V0dGVyKHJhdykge1xuICAgICAgICAgIHJldHVybiBcIlxcXCJcIi5jb25jYXQocmF3LCBcIlxcXCJcIik7XG4gICAgICAgIH1cbiAgICAgIH0pKTtcblxuICAgIGNhc2UgJ051bWJlcic6XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSlNPTlZhbHVlTm9kZSwgc2ltcGxlTm9kZVByb3BzKTtcblxuICAgIGNhc2UgJ0Jvb2xlYW4nOlxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05WYWx1ZU5vZGUsIF9leHRlbmRzKHt9LCBzaW1wbGVOb2RlUHJvcHMsIHtcbiAgICAgICAgdmFsdWVHZXR0ZXI6IGZ1bmN0aW9uIHZhbHVlR2V0dGVyKHJhdykge1xuICAgICAgICAgIHJldHVybiByYXcgPyAndHJ1ZScgOiAnZmFsc2UnO1xuICAgICAgICB9XG4gICAgICB9KSk7XG5cbiAgICBjYXNlICdEYXRlJzpcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChKU09OVmFsdWVOb2RlLCBfZXh0ZW5kcyh7fSwgc2ltcGxlTm9kZVByb3BzLCB7XG4gICAgICAgIHZhbHVlR2V0dGVyOiBmdW5jdGlvbiB2YWx1ZUdldHRlcihyYXcpIHtcbiAgICAgICAgICByZXR1cm4gcmF3LnRvSVNPU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgIH0pKTtcblxuICAgIGNhc2UgJ051bGwnOlxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05WYWx1ZU5vZGUsIF9leHRlbmRzKHt9LCBzaW1wbGVOb2RlUHJvcHMsIHtcbiAgICAgICAgdmFsdWVHZXR0ZXI6IGZ1bmN0aW9uIHZhbHVlR2V0dGVyKCkge1xuICAgICAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgICAgIH1cbiAgICAgIH0pKTtcblxuICAgIGNhc2UgJ1VuZGVmaW5lZCc6XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSlNPTlZhbHVlTm9kZSwgX2V4dGVuZHMoe30sIHNpbXBsZU5vZGVQcm9wcywge1xuICAgICAgICB2YWx1ZUdldHRlcjogZnVuY3Rpb24gdmFsdWVHZXR0ZXIoKSB7XG4gICAgICAgICAgcmV0dXJuICd1bmRlZmluZWQnO1xuICAgICAgICB9XG4gICAgICB9KSk7XG5cbiAgICBjYXNlICdGdW5jdGlvbic6XG4gICAgY2FzZSAnU3ltYm9sJzpcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChKU09OVmFsdWVOb2RlLCBfZXh0ZW5kcyh7fSwgc2ltcGxlTm9kZVByb3BzLCB7XG4gICAgICAgIHZhbHVlR2V0dGVyOiBmdW5jdGlvbiB2YWx1ZUdldHRlcihyYXcpIHtcbiAgICAgICAgICByZXR1cm4gcmF3LnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgIH0pKTtcblxuICAgIGNhc2UgJ0N1c3RvbSc6XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSlNPTlZhbHVlTm9kZSwgc2ltcGxlTm9kZVByb3BzKTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSlNPTlZhbHVlTm9kZSwgX2V4dGVuZHMoe30sIHNpbXBsZU5vZGVQcm9wcywge1xuICAgICAgICB2YWx1ZUdldHRlcjogZnVuY3Rpb24gdmFsdWVHZXR0ZXIoKSB7XG4gICAgICAgICAgcmV0dXJuIFwiPFwiLmNvbmNhdChub2RlVHlwZSwgXCI+XCIpO1xuICAgICAgICB9XG4gICAgICB9KSk7XG4gIH1cbn07XG5cbkpTT05Ob2RlLnByb3BUeXBlcyA9IHtcbiAgZ2V0SXRlbVN0cmluZzogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAga2V5UGF0aDogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLm51bWJlcl0pLmlzUmVxdWlyZWQpLmlzUmVxdWlyZWQsXG4gIGxhYmVsUmVuZGVyZXI6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIHN0eWxpbmc6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIHZhbHVlOiBQcm9wVHlwZXMuYW55LFxuICB2YWx1ZVJlbmRlcmVyOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBpc0N1c3RvbU5vZGU6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWRcbn07XG5leHBvcnQgZGVmYXVsdCBKU09OTm9kZTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xudmFyIF9leGNsdWRlZCA9IFtcImRhdGFcIl07XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBKU09OTmVzdGVkTm9kZSBmcm9tICcuL0pTT05OZXN0ZWROb2RlJztcblxuLy8gUmV0dXJucyB0aGUgXCJuIEl0ZW1zXCIgc3RyaW5nIGZvciB0aGlzIG5vZGUsXG4vLyBnZW5lcmF0aW5nIGFuZCBjYWNoaW5nIGl0IGlmIGl0IGhhc24ndCBiZWVuIGNyZWF0ZWQgeWV0LlxuZnVuY3Rpb24gY3JlYXRlSXRlbVN0cmluZyhkYXRhKSB7XG4gIHZhciBsZW4gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhkYXRhKS5sZW5ndGg7XG4gIHJldHVybiBcIlwiLmNvbmNhdChsZW4sIFwiIFwiKS5jb25jYXQobGVuICE9PSAxID8gJ2tleXMnIDogJ2tleScpO1xufVxuXG4vLyBDb25maWd1cmVzIDxKU09OTmVzdGVkTm9kZT4gdG8gcmVuZGVyIGFuIE9iamVjdFxudmFyIEpTT05PYmplY3ROb2RlID0gZnVuY3Rpb24gSlNPTk9iamVjdE5vZGUoX3JlZikge1xuICB2YXIgZGF0YSA9IF9yZWYuZGF0YSxcbiAgICAgIHByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWYsIF9leGNsdWRlZCk7XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05OZXN0ZWROb2RlLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICBkYXRhOiBkYXRhLFxuICAgIG5vZGVUeXBlOiBcIk9iamVjdFwiLFxuICAgIG5vZGVUeXBlSW5kaWNhdG9yOiBwcm9wcy5ub2RlVHlwZSA9PT0gJ0Vycm9yJyA/ICdFcnJvcigpJyA6ICd7fScsXG4gICAgY3JlYXRlSXRlbVN0cmluZzogY3JlYXRlSXRlbVN0cmluZyxcbiAgICBleHBhbmRhYmxlOiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhkYXRhKS5sZW5ndGggPiAwXG4gIH0pKTtcbn07XG5cbkpTT05PYmplY3ROb2RlLnByb3BUeXBlcyA9IHtcbiAgZGF0YTogUHJvcFR5cGVzLm9iamVjdCxcbiAgbm9kZVR5cGU6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZFxufTtcbmV4cG9ydCBkZWZhdWx0IEpTT05PYmplY3ROb2RlOyIsImltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9Db25zdW1hYmxlQXJyYXlcIjtcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuXG52YXIgSlNPTlZhbHVlTm9kZSA9IGZ1bmN0aW9uIEpTT05WYWx1ZU5vZGUoX3JlZikge1xuICB2YXIgbm9kZVR5cGUgPSBfcmVmLm5vZGVUeXBlLFxuICAgICAgc3R5bGluZyA9IF9yZWYuc3R5bGluZyxcbiAgICAgIGxhYmVsUmVuZGVyZXIgPSBfcmVmLmxhYmVsUmVuZGVyZXIsXG4gICAgICBrZXlQYXRoID0gX3JlZi5rZXlQYXRoLFxuICAgICAgdmFsdWVSZW5kZXJlciA9IF9yZWYudmFsdWVSZW5kZXJlcixcbiAgICAgIHZhbHVlID0gX3JlZi52YWx1ZSxcbiAgICAgIF9yZWYkdmFsdWVHZXR0ZXIgPSBfcmVmLnZhbHVlR2V0dGVyLFxuICAgICAgdmFsdWVHZXR0ZXIgPSBfcmVmJHZhbHVlR2V0dGVyID09PSB2b2lkIDAgPyBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH0gOiBfcmVmJHZhbHVlR2V0dGVyO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCBzdHlsaW5nKCd2YWx1ZScsIG5vZGVUeXBlLCBrZXlQYXRoKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiLCBzdHlsaW5nKFsnbGFiZWwnLCAndmFsdWVMYWJlbCddLCBub2RlVHlwZSwga2V5UGF0aCksIGxhYmVsUmVuZGVyZXIoa2V5UGF0aCwgbm9kZVR5cGUsIGZhbHNlLCBmYWxzZSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgc3R5bGluZygndmFsdWVUZXh0Jywgbm9kZVR5cGUsIGtleVBhdGgpLCB2YWx1ZVJlbmRlcmVyLmFwcGx5KHZvaWQgMCwgW3ZhbHVlR2V0dGVyKHZhbHVlKSwgdmFsdWVdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoa2V5UGF0aCkpKSkpO1xufTtcblxuSlNPTlZhbHVlTm9kZS5wcm9wVHlwZXMgPSB7XG4gIG5vZGVUeXBlOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gIHN0eWxpbmc6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIGxhYmVsUmVuZGVyZXI6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIGtleVBhdGg6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5udW1iZXJdKS5pc1JlcXVpcmVkKS5pc1JlcXVpcmVkLFxuICB2YWx1ZVJlbmRlcmVyOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICB2YWx1ZTogUHJvcFR5cGVzLmFueSxcbiAgdmFsdWVHZXR0ZXI6IFByb3BUeXBlcy5mdW5jXG59O1xuZXhwb3J0IGRlZmF1bHQgSlNPTlZhbHVlTm9kZTsiLCJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCI7XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmltcG9ydCB7IGNyZWF0ZVN0eWxpbmcgfSBmcm9tICdyZWFjdC1iYXNlMTYtc3R5bGluZyc7XG5pbXBvcnQgc29sYXJpemVkIGZyb20gJy4vdGhlbWVzL3NvbGFyaXplZCc7XG5cbnZhciBjb2xvck1hcCA9IGZ1bmN0aW9uIGNvbG9yTWFwKHRoZW1lKSB7XG4gIHJldHVybiB7XG4gICAgQkFDS0dST1VORF9DT0xPUjogdGhlbWUuYmFzZTAwLFxuICAgIFRFWFRfQ09MT1I6IHRoZW1lLmJhc2UwNyxcbiAgICBTVFJJTkdfQ09MT1I6IHRoZW1lLmJhc2UwQixcbiAgICBEQVRFX0NPTE9SOiB0aGVtZS5iYXNlMEIsXG4gICAgTlVNQkVSX0NPTE9SOiB0aGVtZS5iYXNlMDksXG4gICAgQk9PTEVBTl9DT0xPUjogdGhlbWUuYmFzZTA5LFxuICAgIE5VTExfQ09MT1I6IHRoZW1lLmJhc2UwOCxcbiAgICBVTkRFRklORURfQ09MT1I6IHRoZW1lLmJhc2UwOCxcbiAgICBGVU5DVElPTl9DT0xPUjogdGhlbWUuYmFzZTA4LFxuICAgIFNZTUJPTF9DT0xPUjogdGhlbWUuYmFzZTA4LFxuICAgIExBQkVMX0NPTE9SOiB0aGVtZS5iYXNlMEQsXG4gICAgQVJST1dfQ09MT1I6IHRoZW1lLmJhc2UwRCxcbiAgICBJVEVNX1NUUklOR19DT0xPUjogdGhlbWUuYmFzZTBCLFxuICAgIElURU1fU1RSSU5HX0VYUEFOREVEX0NPTE9SOiB0aGVtZS5iYXNlMDNcbiAgfTtcbn07XG5cbnZhciB2YWx1ZUNvbG9yTWFwID0gZnVuY3Rpb24gdmFsdWVDb2xvck1hcChjb2xvcnMpIHtcbiAgcmV0dXJuIHtcbiAgICBTdHJpbmc6IGNvbG9ycy5TVFJJTkdfQ09MT1IsXG4gICAgRGF0ZTogY29sb3JzLkRBVEVfQ09MT1IsXG4gICAgTnVtYmVyOiBjb2xvcnMuTlVNQkVSX0NPTE9SLFxuICAgIEJvb2xlYW46IGNvbG9ycy5CT09MRUFOX0NPTE9SLFxuICAgIE51bGw6IGNvbG9ycy5OVUxMX0NPTE9SLFxuICAgIFVuZGVmaW5lZDogY29sb3JzLlVOREVGSU5FRF9DT0xPUixcbiAgICBGdW5jdGlvbjogY29sb3JzLkZVTkNUSU9OX0NPTE9SLFxuICAgIFN5bWJvbDogY29sb3JzLlNZTUJPTF9DT0xPUlxuICB9O1xufTtcblxudmFyIGdldERlZmF1bHRUaGVtZVN0eWxpbmcgPSBmdW5jdGlvbiBnZXREZWZhdWx0VGhlbWVTdHlsaW5nKHRoZW1lKSB7XG4gIHZhciBjb2xvcnMgPSBjb2xvck1hcCh0aGVtZSk7XG4gIHJldHVybiB7XG4gICAgdHJlZToge1xuICAgICAgYm9yZGVyOiAwLFxuICAgICAgcGFkZGluZzogMCxcbiAgICAgIG1hcmdpblRvcDogJzAuNWVtJyxcbiAgICAgIG1hcmdpbkJvdHRvbTogJzAuNWVtJyxcbiAgICAgIG1hcmdpbkxlZnQ6ICcwLjEyNWVtJyxcbiAgICAgIG1hcmdpblJpZ2h0OiAwLFxuICAgICAgbGlzdFN0eWxlOiAnbm9uZScsXG4gICAgICBNb3pVc2VyU2VsZWN0OiAnbm9uZScsXG4gICAgICBXZWJraXRVc2VyU2VsZWN0OiAnbm9uZScsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IGNvbG9ycy5CQUNLR1JPVU5EX0NPTE9SXG4gICAgfSxcbiAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUoX3JlZiwgbm9kZVR5cGUsIGtleVBhdGgpIHtcbiAgICAgIHZhciBzdHlsZSA9IF9yZWYuc3R5bGU7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdHlsZSksIHt9LCB7XG4gICAgICAgICAgcGFkZGluZ1RvcDogJzAuMjVlbScsXG4gICAgICAgICAgcGFkZGluZ1JpZ2h0OiAwLFxuICAgICAgICAgIG1hcmdpbkxlZnQ6ICcwLjg3NWVtJyxcbiAgICAgICAgICBXZWJraXRVc2VyU2VsZWN0OiAndGV4dCcsXG4gICAgICAgICAgTW96VXNlclNlbGVjdDogJ3RleHQnLFxuICAgICAgICAgIHdvcmRXcmFwOiAnYnJlYWstd29yZCcsXG4gICAgICAgICAgcGFkZGluZ0xlZnQ6IGtleVBhdGgubGVuZ3RoID4gMSA/ICcyLjEyNWVtJyA6ICcxLjI1ZW0nLFxuICAgICAgICAgIHRleHRJbmRlbnQ6ICctMC41ZW0nLFxuICAgICAgICAgIHdvcmRCcmVhazogJ2JyZWFrLWFsbCdcbiAgICAgICAgfSlcbiAgICAgIH07XG4gICAgfSxcbiAgICBsYWJlbDoge1xuICAgICAgZGlzcGxheTogJ2lubGluZS1ibG9jaycsXG4gICAgICBjb2xvcjogY29sb3JzLkxBQkVMX0NPTE9SXG4gICAgfSxcbiAgICB2YWx1ZUxhYmVsOiB7XG4gICAgICBtYXJnaW46ICcwIDAuNWVtIDAgMCdcbiAgICB9LFxuICAgIHZhbHVlVGV4dDogZnVuY3Rpb24gdmFsdWVUZXh0KF9yZWYyLCBub2RlVHlwZSkge1xuICAgICAgdmFyIHN0eWxlID0gX3JlZjIuc3R5bGU7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdHlsZSksIHt9LCB7XG4gICAgICAgICAgY29sb3I6IHZhbHVlQ29sb3JNYXAoY29sb3JzKVtub2RlVHlwZV1cbiAgICAgICAgfSlcbiAgICAgIH07XG4gICAgfSxcbiAgICBpdGVtUmFuZ2U6IGZ1bmN0aW9uIGl0ZW1SYW5nZShzdHlsaW5nLCBleHBhbmRlZCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICBwYWRkaW5nVG9wOiBleHBhbmRlZCA/IDAgOiAnMC4yNWVtJyxcbiAgICAgICAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICAgICAgICBjb2xvcjogY29sb3JzLkxBQkVMX0NPTE9SXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSxcbiAgICBhcnJvdzogZnVuY3Rpb24gYXJyb3coX3JlZjMsIG5vZGVUeXBlLCBleHBhbmRlZCkge1xuICAgICAgdmFyIHN0eWxlID0gX3JlZjMuc3R5bGU7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdHlsZSksIHt9LCB7XG4gICAgICAgICAgbWFyZ2luTGVmdDogMCxcbiAgICAgICAgICB0cmFuc2l0aW9uOiAnMTUwbXMnLFxuICAgICAgICAgIFdlYmtpdFRyYW5zaXRpb246ICcxNTBtcycsXG4gICAgICAgICAgTW96VHJhbnNpdGlvbjogJzE1MG1zJyxcbiAgICAgICAgICBXZWJraXRUcmFuc2Zvcm06IGV4cGFuZGVkID8gJ3JvdGF0ZVooOTBkZWcpJyA6ICdyb3RhdGVaKDBkZWcpJyxcbiAgICAgICAgICBNb3pUcmFuc2Zvcm06IGV4cGFuZGVkID8gJ3JvdGF0ZVooOTBkZWcpJyA6ICdyb3RhdGVaKDBkZWcpJyxcbiAgICAgICAgICB0cmFuc2Zvcm06IGV4cGFuZGVkID8gJ3JvdGF0ZVooOTBkZWcpJyA6ICdyb3RhdGVaKDBkZWcpJyxcbiAgICAgICAgICB0cmFuc2Zvcm1PcmlnaW46ICc0NSUgNTAlJyxcbiAgICAgICAgICBXZWJraXRUcmFuc2Zvcm1PcmlnaW46ICc0NSUgNTAlJyxcbiAgICAgICAgICBNb3pUcmFuc2Zvcm1PcmlnaW46ICc0NSUgNTAlJyxcbiAgICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgICAgICBsaW5lSGVpZ2h0OiAnMS4xZW0nLFxuICAgICAgICAgIGZvbnRTaXplOiAnMC43NWVtJ1xuICAgICAgICB9KVxuICAgICAgfTtcbiAgICB9LFxuICAgIGFycm93Q29udGFpbmVyOiBmdW5jdGlvbiBhcnJvd0NvbnRhaW5lcihfcmVmNCwgYXJyb3dTdHlsZSkge1xuICAgICAgdmFyIHN0eWxlID0gX3JlZjQuc3R5bGU7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdHlsZSksIHt9LCB7XG4gICAgICAgICAgZGlzcGxheTogJ2lubGluZS1ibG9jaycsXG4gICAgICAgICAgcGFkZGluZ1JpZ2h0OiAnMC41ZW0nLFxuICAgICAgICAgIHBhZGRpbmdMZWZ0OiBhcnJvd1N0eWxlID09PSAnZG91YmxlJyA/ICcxZW0nIDogMCxcbiAgICAgICAgICBjdXJzb3I6ICdwb2ludGVyJ1xuICAgICAgICB9KVxuICAgICAgfTtcbiAgICB9LFxuICAgIGFycm93U2lnbjoge1xuICAgICAgY29sb3I6IGNvbG9ycy5BUlJPV19DT0xPUlxuICAgIH0sXG4gICAgYXJyb3dTaWduSW5uZXI6IHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgdG9wOiAwLFxuICAgICAgbGVmdDogJy0wLjRlbSdcbiAgICB9LFxuICAgIG5lc3RlZE5vZGU6IGZ1bmN0aW9uIG5lc3RlZE5vZGUoX3JlZjUsIGtleVBhdGgsIG5vZGVUeXBlLCBleHBhbmRlZCwgZXhwYW5kYWJsZSkge1xuICAgICAgdmFyIHN0eWxlID0gX3JlZjUuc3R5bGU7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdHlsZSksIHt9LCB7XG4gICAgICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICAgICAgcGFkZGluZ1RvcDogJzAuMjVlbScsXG4gICAgICAgICAgbWFyZ2luTGVmdDoga2V5UGF0aC5sZW5ndGggPiAxID8gJzAuODc1ZW0nIDogMCxcbiAgICAgICAgICBwYWRkaW5nTGVmdDogIWV4cGFuZGFibGUgPyAnMS4xMjVlbScgOiAwXG4gICAgICAgIH0pXG4gICAgICB9O1xuICAgIH0sXG4gICAgcm9vdE5vZGU6IHtcbiAgICAgIHBhZGRpbmc6IDAsXG4gICAgICBtYXJnaW46IDBcbiAgICB9LFxuICAgIG5lc3RlZE5vZGVMYWJlbDogZnVuY3Rpb24gbmVzdGVkTm9kZUxhYmVsKF9yZWY2LCBrZXlQYXRoLCBub2RlVHlwZSwgZXhwYW5kZWQsIGV4cGFuZGFibGUpIHtcbiAgICAgIHZhciBzdHlsZSA9IF9yZWY2LnN0eWxlO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3R5bGUpLCB7fSwge1xuICAgICAgICAgIG1hcmdpbjogMCxcbiAgICAgICAgICBwYWRkaW5nOiAwLFxuICAgICAgICAgIFdlYmtpdFVzZXJTZWxlY3Q6IGV4cGFuZGFibGUgPyAnaW5oZXJpdCcgOiAndGV4dCcsXG4gICAgICAgICAgTW96VXNlclNlbGVjdDogZXhwYW5kYWJsZSA/ICdpbmhlcml0JyA6ICd0ZXh0JyxcbiAgICAgICAgICBjdXJzb3I6IGV4cGFuZGFibGUgPyAncG9pbnRlcicgOiAnZGVmYXVsdCdcbiAgICAgICAgfSlcbiAgICAgIH07XG4gICAgfSxcbiAgICBuZXN0ZWROb2RlSXRlbVN0cmluZzogZnVuY3Rpb24gbmVzdGVkTm9kZUl0ZW1TdHJpbmcoX3JlZjcsIGtleVBhdGgsIG5vZGVUeXBlLCBleHBhbmRlZCkge1xuICAgICAgdmFyIHN0eWxlID0gX3JlZjcuc3R5bGU7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdHlsZSksIHt9LCB7XG4gICAgICAgICAgcGFkZGluZ0xlZnQ6ICcwLjVlbScsXG4gICAgICAgICAgY3Vyc29yOiAnZGVmYXVsdCcsXG4gICAgICAgICAgY29sb3I6IGV4cGFuZGVkID8gY29sb3JzLklURU1fU1RSSU5HX0VYUEFOREVEX0NPTE9SIDogY29sb3JzLklURU1fU1RSSU5HX0NPTE9SXG4gICAgICAgIH0pXG4gICAgICB9O1xuICAgIH0sXG4gICAgbmVzdGVkTm9kZUl0ZW1UeXBlOiB7XG4gICAgICBtYXJnaW5MZWZ0OiAnMC4zZW0nLFxuICAgICAgbWFyZ2luUmlnaHQ6ICcwLjNlbSdcbiAgICB9LFxuICAgIG5lc3RlZE5vZGVDaGlsZHJlbjogZnVuY3Rpb24gbmVzdGVkTm9kZUNoaWxkcmVuKF9yZWY4LCBub2RlVHlwZSwgZXhwYW5kZWQpIHtcbiAgICAgIHZhciBzdHlsZSA9IF9yZWY4LnN0eWxlO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3R5bGUpLCB7fSwge1xuICAgICAgICAgIHBhZGRpbmc6IDAsXG4gICAgICAgICAgbWFyZ2luOiAwLFxuICAgICAgICAgIGxpc3RTdHlsZTogJ25vbmUnLFxuICAgICAgICAgIGRpc3BsYXk6IGV4cGFuZGVkID8gJ2Jsb2NrJyA6ICdub25lJ1xuICAgICAgICB9KVxuICAgICAgfTtcbiAgICB9LFxuICAgIHJvb3ROb2RlQ2hpbGRyZW46IHtcbiAgICAgIHBhZGRpbmc6IDAsXG4gICAgICBtYXJnaW46IDAsXG4gICAgICBsaXN0U3R5bGU6ICdub25lJ1xuICAgIH1cbiAgfTtcbn07XG5cbnZhciBjcmVhdGVTdHlsaW5nRnJvbVRoZW1lID0gY3JlYXRlU3R5bGluZyhnZXREZWZhdWx0VGhlbWVTdHlsaW5nLCB7XG4gIGRlZmF1bHRCYXNlMTY6IHNvbGFyaXplZFxufSk7XG5leHBvcnQgZGVmYXVsdCBjcmVhdGVTdHlsaW5nRnJvbVRoZW1lOyIsImltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9Db25zdW1hYmxlQXJyYXlcIjtcblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobywgYWxsb3dBcnJheUxpa2UpIHsgdmFyIGl0ID0gdHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl0gfHwgb1tcIkBAaXRlcmF0b3JcIl07IGlmICghaXQpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKGl0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgeyBpZiAoaXQpIG8gPSBpdDsgdmFyIGkgPSAwOyB2YXIgRiA9IGZ1bmN0aW9uIEYoKSB7fTsgcmV0dXJuIHsgczogRiwgbjogZnVuY3Rpb24gbigpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfSwgZTogZnVuY3Rpb24gZShfZSkgeyB0aHJvdyBfZTsgfSwgZjogRiB9OyB9IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSB2YXIgbm9ybWFsQ29tcGxldGlvbiA9IHRydWUsIGRpZEVyciA9IGZhbHNlLCBlcnI7IHJldHVybiB7IHM6IGZ1bmN0aW9uIHMoKSB7IGl0ID0gaXQuY2FsbChvKTsgfSwgbjogZnVuY3Rpb24gbigpIHsgdmFyIHN0ZXAgPSBpdC5uZXh0KCk7IG5vcm1hbENvbXBsZXRpb24gPSBzdGVwLmRvbmU7IHJldHVybiBzdGVwOyB9LCBlOiBmdW5jdGlvbiBlKF9lMikgeyBkaWRFcnIgPSB0cnVlOyBlcnIgPSBfZTI7IH0sIGY6IGZ1bmN0aW9uIGYoKSB7IHRyeSB7IGlmICghbm9ybWFsQ29tcGxldGlvbiAmJiBpdC5yZXR1cm4gIT0gbnVsbCkgaXQucmV0dXJuKCk7IH0gZmluYWxseSB7IGlmIChkaWRFcnIpIHRocm93IGVycjsgfSB9IH07IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG5mdW5jdGlvbiBnZXRMZW5ndGgodHlwZSwgY29sbGVjdGlvbikge1xuICBpZiAodHlwZSA9PT0gJ09iamVjdCcpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhjb2xsZWN0aW9uKS5sZW5ndGg7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ0FycmF5Jykge1xuICAgIHJldHVybiBjb2xsZWN0aW9uLmxlbmd0aDtcbiAgfVxuXG4gIHJldHVybiBJbmZpbml0eTtcbn1cblxuZnVuY3Rpb24gaXNJdGVyYWJsZU1hcChjb2xsZWN0aW9uKSB7XG4gIHJldHVybiB0eXBlb2YgY29sbGVjdGlvbi5zZXQgPT09ICdmdW5jdGlvbic7XG59XG5cbmZ1bmN0aW9uIGdldEVudHJpZXModHlwZSwgY29sbGVjdGlvbiwgc29ydE9iamVjdEtleXMpIHtcbiAgdmFyIGZyb20gPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IDA7XG4gIHZhciB0byA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ICYmIGFyZ3VtZW50c1s0XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzRdIDogSW5maW5pdHk7XG4gIHZhciByZXM7XG5cbiAgaWYgKHR5cGUgPT09ICdPYmplY3QnKSB7XG4gICAgdmFyIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhjb2xsZWN0aW9uKTtcblxuICAgIGlmIChzb3J0T2JqZWN0S2V5cykge1xuICAgICAga2V5cy5zb3J0KHNvcnRPYmplY3RLZXlzID09PSB0cnVlID8gdW5kZWZpbmVkIDogc29ydE9iamVjdEtleXMpO1xuICAgIH1cblxuICAgIGtleXMgPSBrZXlzLnNsaWNlKGZyb20sIHRvICsgMSk7XG4gICAgcmVzID0ge1xuICAgICAgZW50cmllczoga2V5cy5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgIHZhbHVlOiBjb2xsZWN0aW9uW2tleV1cbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgfTtcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnQXJyYXknKSB7XG4gICAgcmVzID0ge1xuICAgICAgZW50cmllczogY29sbGVjdGlvbi5zbGljZShmcm9tLCB0byArIDEpLm1hcChmdW5jdGlvbiAodmFsLCBpZHgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBrZXk6IGlkeCArIGZyb20sXG4gICAgICAgICAgdmFsdWU6IHZhbFxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHZhciBpZHggPSAwO1xuICAgIHZhciBlbnRyaWVzID0gW107XG4gICAgdmFyIGRvbmUgPSB0cnVlO1xuICAgIHZhciBpc01hcCA9IGlzSXRlcmFibGVNYXAoY29sbGVjdGlvbik7XG5cbiAgICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoY29sbGVjdGlvbiksXG4gICAgICAgIF9zdGVwO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7XG4gICAgICAgIHZhciBpdGVtID0gX3N0ZXAudmFsdWU7XG5cbiAgICAgICAgaWYgKGlkeCA+IHRvKSB7XG4gICAgICAgICAgZG9uZSA9IGZhbHNlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZyb20gPD0gaWR4KSB7XG4gICAgICAgICAgaWYgKGlzTWFwICYmIEFycmF5LmlzQXJyYXkoaXRlbSkpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaXRlbVswXSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGl0ZW1bMF0gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgIGVudHJpZXMucHVzaCh7XG4gICAgICAgICAgICAgICAga2V5OiBpdGVtWzBdLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBpdGVtWzFdXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZW50cmllcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBrZXk6IFwiW2VudHJ5IFwiLmNvbmNhdChpZHgsIFwiXVwiKSxcbiAgICAgICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICAgICAgJ1trZXldJzogaXRlbVswXSxcbiAgICAgICAgICAgICAgICAgICdbdmFsdWVdJzogaXRlbVsxXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVudHJpZXMucHVzaCh7XG4gICAgICAgICAgICAgIGtleTogaWR4LFxuICAgICAgICAgICAgICB2YWx1ZTogaXRlbVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWR4Kys7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBfaXRlcmF0b3IuZShlcnIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBfaXRlcmF0b3IuZigpO1xuICAgIH1cblxuICAgIHJlcyA9IHtcbiAgICAgIGhhc01vcmU6ICFkb25lLFxuICAgICAgZW50cmllczogZW50cmllc1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gcmVzO1xufVxuXG5mdW5jdGlvbiBnZXRSYW5nZXMoZnJvbSwgdG8sIGxpbWl0KSB7XG4gIHZhciByYW5nZXMgPSBbXTtcblxuICB3aGlsZSAodG8gLSBmcm9tID4gbGltaXQgKiBsaW1pdCkge1xuICAgIGxpbWl0ID0gbGltaXQgKiBsaW1pdDtcbiAgfVxuXG4gIGZvciAodmFyIGkgPSBmcm9tOyBpIDw9IHRvOyBpICs9IGxpbWl0KSB7XG4gICAgcmFuZ2VzLnB1c2goe1xuICAgICAgZnJvbTogaSxcbiAgICAgIHRvOiBNYXRoLm1pbih0bywgaSArIGxpbWl0IC0gMSlcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiByYW5nZXM7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldENvbGxlY3Rpb25FbnRyaWVzKHR5cGUsIGNvbGxlY3Rpb24sIHNvcnRPYmplY3RLZXlzLCBsaW1pdCkge1xuICB2YXIgZnJvbSA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ICYmIGFyZ3VtZW50c1s0XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzRdIDogMDtcbiAgdmFyIHRvID0gYXJndW1lbnRzLmxlbmd0aCA+IDUgJiYgYXJndW1lbnRzWzVdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNV0gOiBJbmZpbml0eTtcbiAgdmFyIGdldEVudHJpZXNCb3VuZCA9IGdldEVudHJpZXMuYmluZChudWxsLCB0eXBlLCBjb2xsZWN0aW9uLCBzb3J0T2JqZWN0S2V5cyk7XG5cbiAgaWYgKCFsaW1pdCkge1xuICAgIHJldHVybiBnZXRFbnRyaWVzQm91bmQoKS5lbnRyaWVzO1xuICB9XG5cbiAgdmFyIGlzU3Vic2V0ID0gdG8gPCBJbmZpbml0eTtcbiAgdmFyIGxlbmd0aCA9IE1hdGgubWluKHRvIC0gZnJvbSwgZ2V0TGVuZ3RoKHR5cGUsIGNvbGxlY3Rpb24pKTtcblxuICBpZiAodHlwZSAhPT0gJ0l0ZXJhYmxlJykge1xuICAgIGlmIChsZW5ndGggPD0gbGltaXQgfHwgbGltaXQgPCA3KSB7XG4gICAgICByZXR1cm4gZ2V0RW50cmllc0JvdW5kKGZyb20sIHRvKS5lbnRyaWVzO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAobGVuZ3RoIDw9IGxpbWl0ICYmICFpc1N1YnNldCkge1xuICAgICAgcmV0dXJuIGdldEVudHJpZXNCb3VuZChmcm9tLCB0bykuZW50cmllcztcbiAgICB9XG4gIH1cblxuICB2YXIgbGltaXRlZEVudHJpZXM7XG5cbiAgaWYgKHR5cGUgPT09ICdJdGVyYWJsZScpIHtcbiAgICB2YXIgX2dldEVudHJpZXNCb3VuZCA9IGdldEVudHJpZXNCb3VuZChmcm9tLCBmcm9tICsgbGltaXQgLSAxKSxcbiAgICAgICAgaGFzTW9yZSA9IF9nZXRFbnRyaWVzQm91bmQuaGFzTW9yZSxcbiAgICAgICAgZW50cmllcyA9IF9nZXRFbnRyaWVzQm91bmQuZW50cmllcztcblxuICAgIGxpbWl0ZWRFbnRyaWVzID0gaGFzTW9yZSA/IFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoZW50cmllcyksIF90b0NvbnN1bWFibGVBcnJheShnZXRSYW5nZXMoZnJvbSArIGxpbWl0LCBmcm9tICsgMiAqIGxpbWl0IC0gMSwgbGltaXQpKSkgOiBlbnRyaWVzO1xuICB9IGVsc2Uge1xuICAgIGxpbWl0ZWRFbnRyaWVzID0gaXNTdWJzZXQgPyBnZXRSYW5nZXMoZnJvbSwgdG8sIGxpbWl0KSA6IFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoZ2V0RW50cmllc0JvdW5kKDAsIGxpbWl0IC0gNSkuZW50cmllcyksIF90b0NvbnN1bWFibGVBcnJheShnZXRSYW5nZXMobGltaXQgLSA0LCBsZW5ndGggLSA1LCBsaW1pdCkpLCBfdG9Db25zdW1hYmxlQXJyYXkoZ2V0RW50cmllc0JvdW5kKGxlbmd0aCAtIDQsIGxlbmd0aCAtIDEpLmVudHJpZXMpKTtcbiAgfVxuXG4gIHJldHVybiBsaW1pdGVkRW50cmllcztcbn0iLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xuaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9pbmhlcml0cyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiO1xuaW1wb3J0IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm5cIjtcbmltcG9ydCBfZ2V0UHJvdG90eXBlT2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZ2V0UHJvdG90eXBlT2ZcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5XCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wiZGF0YVwiLCBcImtleVBhdGhcIiwgXCJwb3N0cHJvY2Vzc1ZhbHVlXCIsIFwiaGlkZVJvb3RcIiwgXCJ0aGVtZVwiLCBcImludmVydFRoZW1lXCJdO1xuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTsgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7IHRyeSB7IEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuLy8gRVM2ICsgaW5saW5lIHN0eWxlIHBvcnQgb2YgSlNPTlZpZXdlciBodHRwczovL2JpdGJ1Y2tldC5vcmcvZGF2ZXZlZGRlci9yZWFjdC1qc29uLXZpZXdlci9cbi8vIGFsbCBjcmVkaXRzIGFuZCBvcmlnaW5hbCBjb2RlIHRvIHRoZSBhdXRob3Jcbi8vIERhdmUgVmVkZGVyIDx2ZWRkZXJtYXRpY0BnbWFpbC5jb20+IGh0dHA6Ly93d3cuZXNraW1vc3B5LmNvbS9cbi8vIHBvcnQgYnkgRGFuaWVsZSBaYW5ub3R0aSBodHRwOi8vd3d3LmdpdGh1Yi5jb20vZHphbm5vdHRpIDxkemFubm90dGlAbWUuY29tPlxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgSlNPTk5vZGUgZnJvbSAnLi9KU09OTm9kZSc7XG5pbXBvcnQgY3JlYXRlU3R5bGluZ0Zyb21UaGVtZSBmcm9tICcuL2NyZWF0ZVN0eWxpbmdGcm9tVGhlbWUnO1xuaW1wb3J0IHsgaW52ZXJ0VGhlbWUgfSBmcm9tICdyZWFjdC1iYXNlMTYtc3R5bGluZyc7XG5cbnZhciBpZGVudGl0eSA9IGZ1bmN0aW9uIGlkZW50aXR5KHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZTtcbn07XG5cbnZhciBleHBhbmRSb290Tm9kZSA9IGZ1bmN0aW9uIGV4cGFuZFJvb3ROb2RlKGtleVBhdGgsIGRhdGEsIGxldmVsKSB7XG4gIHJldHVybiBsZXZlbCA9PT0gMDtcbn07XG5cbnZhciBkZWZhdWx0SXRlbVN0cmluZyA9IGZ1bmN0aW9uIGRlZmF1bHRJdGVtU3RyaW5nKHR5cGUsIGRhdGEsIGl0ZW1UeXBlLCBpdGVtU3RyaW5nKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgaXRlbVR5cGUsIFwiIFwiLCBpdGVtU3RyaW5nKTtcbn07XG5cbnZhciBkZWZhdWx0TGFiZWxSZW5kZXJlciA9IGZ1bmN0aW9uIGRlZmF1bHRMYWJlbFJlbmRlcmVyKF9yZWYpIHtcbiAgdmFyIF9yZWYyID0gX3NsaWNlZFRvQXJyYXkoX3JlZiwgMSksXG4gICAgICBsYWJlbCA9IF9yZWYyWzBdO1xuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgbGFiZWwsIFwiOlwiKTtcbn07XG5cbnZhciBub0N1c3RvbU5vZGUgPSBmdW5jdGlvbiBub0N1c3RvbU5vZGUoKSB7XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbmZ1bmN0aW9uIGNoZWNrTGVnYWN5VGhlbWluZyh0aGVtZSwgcHJvcHMpIHtcbiAgdmFyIGRlcHJlY2F0ZWRTdHlsaW5nTWV0aG9kc01hcCA9IHtcbiAgICBnZXRBcnJvd1N0eWxlOiAnYXJyb3cnLFxuICAgIGdldExpc3RTdHlsZTogJ25lc3RlZE5vZGVDaGlsZHJlbicsXG4gICAgZ2V0SXRlbVN0cmluZ1N0eWxlOiAnbmVzdGVkTm9kZUl0ZW1TdHJpbmcnLFxuICAgIGdldExhYmVsU3R5bGU6ICdsYWJlbCcsXG4gICAgZ2V0VmFsdWVTdHlsZTogJ3ZhbHVlVGV4dCdcbiAgfTtcbiAgdmFyIGRlcHJlY2F0ZWRTdHlsaW5nTWV0aG9kcyA9IE9iamVjdC5rZXlzKGRlcHJlY2F0ZWRTdHlsaW5nTWV0aG9kc01hcCkuZmlsdGVyKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgcmV0dXJuIHByb3BzW25hbWVdO1xuICB9KTtcblxuICBpZiAoZGVwcmVjYXRlZFN0eWxpbmdNZXRob2RzLmxlbmd0aCA+IDApIHtcbiAgICBpZiAodHlwZW9mIHRoZW1lID09PSAnc3RyaW5nJykge1xuICAgICAgdGhlbWUgPSB7XG4gICAgICAgIGV4dGVuZDogdGhlbWVcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoZW1lID0gX29iamVjdFNwcmVhZCh7fSwgdGhlbWUpO1xuICAgIH1cblxuICAgIGRlcHJlY2F0ZWRTdHlsaW5nTWV0aG9kcy5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS5lcnJvcihcIlN0eWxpbmcgbWV0aG9kIFxcXCJcIi5jb25jYXQobmFtZSwgXCJcXFwiIGlzIGRlcHJlY2F0ZWQsIHVzZSBcXFwidGhlbWVcXFwiIHByb3BlcnR5IGluc3RlYWRcIikpO1xuXG4gICAgICB0aGVtZVtkZXByZWNhdGVkU3R5bGluZ01ldGhvZHNNYXBbbmFtZV1dID0gZnVuY3Rpb24gKF9yZWYzKSB7XG4gICAgICAgIHZhciBzdHlsZSA9IF9yZWYzLnN0eWxlO1xuXG4gICAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3R5bGUpLCBwcm9wc1tuYW1lXS5hcHBseShwcm9wcywgYXJncykpXG4gICAgICAgIH07XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHRoZW1lO1xufVxuXG5mdW5jdGlvbiBnZXRTdGF0ZUZyb21Qcm9wcyhwcm9wcykge1xuICB2YXIgdGhlbWUgPSBjaGVja0xlZ2FjeVRoZW1pbmcocHJvcHMudGhlbWUsIHByb3BzKTtcblxuICBpZiAocHJvcHMuaW52ZXJ0VGhlbWUpIHtcbiAgICB0aGVtZSA9IGludmVydFRoZW1lKHRoZW1lKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc3R5bGluZzogY3JlYXRlU3R5bGluZ0Zyb21UaGVtZSh0aGVtZSlcbiAgfTtcbn1cblxuZXhwb3J0IHZhciBKU09OVHJlZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoSlNPTlRyZWUsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoSlNPTlRyZWUpO1xuXG4gIGZ1bmN0aW9uIEpTT05UcmVlKHByb3BzKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEpTT05UcmVlKTtcblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgcHJvcHMpO1xuICAgIF90aGlzLnN0YXRlID0gZ2V0U3RhdGVGcm9tUHJvcHMocHJvcHMpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhKU09OVHJlZSwgW3tcbiAgICBrZXk6IFwiVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgaWYgKFsndGhlbWUnLCAnaW52ZXJ0VGhlbWUnXS5maW5kKGZ1bmN0aW9uIChrKSB7XG4gICAgICAgIHJldHVybiBuZXh0UHJvcHNba10gIT09IF90aGlzMi5wcm9wc1trXTtcbiAgICAgIH0pKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoZ2V0U3RhdGVGcm9tUHJvcHMobmV4dFByb3BzKSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNob3VsZENvbXBvbmVudFVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzaG91bGRDb21wb25lbnRVcGRhdGUobmV4dFByb3BzKSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgcmV0dXJuICEhT2JqZWN0LmtleXMobmV4dFByb3BzKS5maW5kKGZ1bmN0aW9uIChrKSB7XG4gICAgICAgIHJldHVybiBrID09PSAna2V5UGF0aCcgPyBuZXh0UHJvcHNba10uam9pbignLycpICE9PSBfdGhpczMucHJvcHNba10uam9pbignLycpIDogbmV4dFByb3BzW2tdICE9PSBfdGhpczMucHJvcHNba107XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgdmFsdWUgPSBfdGhpcyRwcm9wcy5kYXRhLFxuICAgICAgICAgIGtleVBhdGggPSBfdGhpcyRwcm9wcy5rZXlQYXRoLFxuICAgICAgICAgIHBvc3Rwcm9jZXNzVmFsdWUgPSBfdGhpcyRwcm9wcy5wb3N0cHJvY2Vzc1ZhbHVlLFxuICAgICAgICAgIGhpZGVSb290ID0gX3RoaXMkcHJvcHMuaGlkZVJvb3QsXG4gICAgICAgICAgdGhlbWUgPSBfdGhpcyRwcm9wcy50aGVtZSxcbiAgICAgICAgICBfID0gX3RoaXMkcHJvcHMuaW52ZXJ0VGhlbWUsXG4gICAgICAgICAgcmVzdCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfdGhpcyRwcm9wcywgX2V4Y2x1ZGVkKTtcblxuICAgICAgdmFyIHN0eWxpbmcgPSB0aGlzLnN0YXRlLnN0eWxpbmc7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCBzdHlsaW5nKCd0cmVlJyksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05Ob2RlLCBfZXh0ZW5kcyh7fSwgX29iamVjdFNwcmVhZCh7XG4gICAgICAgIHBvc3Rwcm9jZXNzVmFsdWU6IHBvc3Rwcm9jZXNzVmFsdWUsXG4gICAgICAgIGhpZGVSb290OiBoaWRlUm9vdCxcbiAgICAgICAgc3R5bGluZzogc3R5bGluZ1xuICAgICAgfSwgcmVzdCksIHtcbiAgICAgICAga2V5UGF0aDogaGlkZVJvb3QgPyBbXSA6IGtleVBhdGgsXG4gICAgICAgIHZhbHVlOiBwb3N0cHJvY2Vzc1ZhbHVlKHZhbHVlKVxuICAgICAgfSkpKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gSlNPTlRyZWU7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbl9kZWZpbmVQcm9wZXJ0eShKU09OVHJlZSwgXCJwcm9wVHlwZXNcIiwge1xuICBkYXRhOiBQcm9wVHlwZXMuYW55LFxuICBoaWRlUm9vdDogUHJvcFR5cGVzLmJvb2wsXG4gIHRoZW1lOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMub2JqZWN0LCBQcm9wVHlwZXMuc3RyaW5nXSksXG4gIGludmVydFRoZW1lOiBQcm9wVHlwZXMuYm9vbCxcbiAga2V5UGF0aDogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLm51bWJlcl0pKSxcbiAgcG9zdHByb2Nlc3NWYWx1ZTogUHJvcFR5cGVzLmZ1bmMsXG4gIHNvcnRPYmplY3RLZXlzOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuZnVuYywgUHJvcFR5cGVzLmJvb2xdKVxufSk7XG5cbl9kZWZpbmVQcm9wZXJ0eShKU09OVHJlZSwgXCJkZWZhdWx0UHJvcHNcIiwge1xuICBzaG91bGRFeHBhbmROb2RlOiBleHBhbmRSb290Tm9kZSxcbiAgaGlkZVJvb3Q6IGZhbHNlLFxuICBrZXlQYXRoOiBbJ3Jvb3QnXSxcbiAgZ2V0SXRlbVN0cmluZzogZGVmYXVsdEl0ZW1TdHJpbmcsXG4gIGxhYmVsUmVuZGVyZXI6IGRlZmF1bHRMYWJlbFJlbmRlcmVyLFxuICB2YWx1ZVJlbmRlcmVyOiBpZGVudGl0eSxcbiAgcG9zdHByb2Nlc3NWYWx1ZTogaWRlbnRpdHksXG4gIGlzQ3VzdG9tTm9kZTogbm9DdXN0b21Ob2RlLFxuICBjb2xsZWN0aW9uTGltaXQ6IDUwLFxuICBpbnZlcnRUaGVtZTogdHJ1ZVxufSk7IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gb2JqVHlwZShvYmopIHtcbiAgdmFyIHR5cGUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKS5zbGljZSg4LCAtMSk7XG5cbiAgaWYgKHR5cGUgPT09ICdPYmplY3QnICYmIHR5cGVvZiBvYmpbU3ltYm9sLml0ZXJhdG9yXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiAnSXRlcmFibGUnO1xuICB9XG5cbiAgaWYgKHR5cGUgPT09ICdDdXN0b20nICYmIG9iai5jb25zdHJ1Y3RvciAhPT0gT2JqZWN0ICYmIG9iaiBpbnN0YW5jZW9mIE9iamVjdCkge1xuICAgIC8vIEZvciBwcm9qZWN0cyBpbXBsZW1lbnRpbmcgb2JqZWN0cyBvdmVycmlkaW5nIGAucHJvdG90eXBlW1N5bWJvbC50b1N0cmluZ1RhZ11gXG4gICAgcmV0dXJuICdPYmplY3QnO1xuICB9XG5cbiAgcmV0dXJuIHR5cGU7XG59IiwiZXhwb3J0IGRlZmF1bHQge1xuICBzY2hlbWU6ICdzb2xhcml6ZWQnLFxuICBhdXRob3I6ICdldGhhbiBzY2hvb25vdmVyIChodHRwOi8vZXRoYW5zY2hvb25vdmVyLmNvbS9zb2xhcml6ZWQpJyxcbiAgYmFzZTAwOiAnIzAwMmIzNicsXG4gIGJhc2UwMTogJyMwNzM2NDInLFxuICBiYXNlMDI6ICcjNTg2ZTc1JyxcbiAgYmFzZTAzOiAnIzY1N2I4MycsXG4gIGJhc2UwNDogJyM4Mzk0OTYnLFxuICBiYXNlMDU6ICcjOTNhMWExJyxcbiAgYmFzZTA2OiAnI2VlZThkNScsXG4gIGJhc2UwNzogJyNmZGY2ZTMnLFxuICBiYXNlMDg6ICcjZGMzMjJmJyxcbiAgYmFzZTA5OiAnI2NiNGIxNicsXG4gIGJhc2UwQTogJyNiNTg5MDAnLFxuICBiYXNlMEI6ICcjODU5OTAwJyxcbiAgYmFzZTBDOiAnIzJhYTE5OCcsXG4gIGJhc2UwRDogJyMyNjhiZDInLFxuICBiYXNlMEU6ICcjNmM3MWM0JyxcbiAgYmFzZTBGOiAnI2QzMzY4Midcbn07IiwiaW1wb3J0IGludmFyaWFudCBmcm9tICdpbnZhcmlhbnQnO1xuaW1wb3J0IGlzRnVuY3Rpb24gZnJvbSAnLi91dGlscy9pc0Z1bmN0aW9uJztcbmltcG9ydCBpZGVudGl0eSBmcm9tICcuL3V0aWxzL2lkZW50aXR5JztcbmltcG9ydCBpc051bGwgZnJvbSAnLi91dGlscy9pc051bGwnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY3JlYXRlQWN0aW9uKHR5cGUsIHBheWxvYWRDcmVhdG9yLCBtZXRhQ3JlYXRvcikge1xuICBpZiAocGF5bG9hZENyZWF0b3IgPT09IHZvaWQgMCkge1xuICAgIHBheWxvYWRDcmVhdG9yID0gaWRlbnRpdHk7XG4gIH1cblxuICBpbnZhcmlhbnQoaXNGdW5jdGlvbihwYXlsb2FkQ3JlYXRvcikgfHwgaXNOdWxsKHBheWxvYWRDcmVhdG9yKSwgJ0V4cGVjdGVkIHBheWxvYWRDcmVhdG9yIHRvIGJlIGEgZnVuY3Rpb24sIHVuZGVmaW5lZCBvciBudWxsJyk7XG4gIHZhciBmaW5hbFBheWxvYWRDcmVhdG9yID0gaXNOdWxsKHBheWxvYWRDcmVhdG9yKSB8fCBwYXlsb2FkQ3JlYXRvciA9PT0gaWRlbnRpdHkgPyBpZGVudGl0eSA6IGZ1bmN0aW9uIChoZWFkKSB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGhlYWQgaW5zdGFuY2VvZiBFcnJvciA/IGhlYWQgOiBwYXlsb2FkQ3JlYXRvci5hcHBseSh2b2lkIDAsIFtoZWFkXS5jb25jYXQoYXJncykpO1xuICB9O1xuICB2YXIgaGFzTWV0YSA9IGlzRnVuY3Rpb24obWV0YUNyZWF0b3IpO1xuICB2YXIgdHlwZVN0cmluZyA9IHR5cGUudG9TdHJpbmcoKTtcblxuICB2YXIgYWN0aW9uQ3JlYXRvciA9IGZ1bmN0aW9uIGFjdGlvbkNyZWF0b3IoKSB7XG4gICAgdmFyIHBheWxvYWQgPSBmaW5hbFBheWxvYWRDcmVhdG9yLmFwcGx5KHZvaWQgMCwgYXJndW1lbnRzKTtcbiAgICB2YXIgYWN0aW9uID0ge1xuICAgICAgdHlwZTogdHlwZVxuICAgIH07XG5cbiAgICBpZiAocGF5bG9hZCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBhY3Rpb24uZXJyb3IgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChwYXlsb2FkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFjdGlvbi5wYXlsb2FkID0gcGF5bG9hZDtcbiAgICB9XG5cbiAgICBpZiAoaGFzTWV0YSkge1xuICAgICAgYWN0aW9uLm1ldGEgPSBtZXRhQ3JlYXRvci5hcHBseSh2b2lkIDAsIGFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjdGlvbjtcbiAgfTtcblxuICBhY3Rpb25DcmVhdG9yLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0eXBlU3RyaW5nO1xuICB9O1xuXG4gIHJldHVybiBhY3Rpb25DcmVhdG9yO1xufSIsImV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiAodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlO1xufSk7IiwiZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uICh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO1xufSk7IiwiZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uICh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT09IG51bGw7XG59KTsiLCIvKiogQSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgYSBwb3RlbnRpYWwgXCJleHRyYSBhcmd1bWVudFwiIHZhbHVlIHRvIGJlIGluamVjdGVkIGxhdGVyLFxyXG4gKiBhbmQgcmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGUgdGh1bmsgbWlkZGxld2FyZSB0aGF0IHVzZXMgdGhhdCB2YWx1ZVxyXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVRodW5rTWlkZGxld2FyZShleHRyYUFyZ3VtZW50KSB7XG4gIC8vIFN0YW5kYXJkIFJlZHV4IG1pZGRsZXdhcmUgZGVmaW5pdGlvbiBwYXR0ZXJuOlxuICAvLyBTZWU6IGh0dHBzOi8vcmVkdXguanMub3JnL3R1dG9yaWFscy9mdW5kYW1lbnRhbHMvcGFydC00LXN0b3JlI3dyaXRpbmctY3VzdG9tLW1pZGRsZXdhcmVcbiAgdmFyIG1pZGRsZXdhcmUgPSBmdW5jdGlvbiBtaWRkbGV3YXJlKF9yZWYpIHtcbiAgICB2YXIgZGlzcGF0Y2ggPSBfcmVmLmRpc3BhdGNoLFxuICAgICAgICBnZXRTdGF0ZSA9IF9yZWYuZ2V0U3RhdGU7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChuZXh0KSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGFjdGlvbikge1xuICAgICAgICAvLyBUaGUgdGh1bmsgbWlkZGxld2FyZSBsb29rcyBmb3IgYW55IGZ1bmN0aW9ucyB0aGF0IHdlcmUgcGFzc2VkIHRvIGBzdG9yZS5kaXNwYXRjaGAuXG4gICAgICAgIC8vIElmIHRoaXMgXCJhY3Rpb25cIiBpcyByZWFsbHkgYSBmdW5jdGlvbiwgY2FsbCBpdCBhbmQgcmV0dXJuIHRoZSByZXN1bHQuXG4gICAgICAgIGlmICh0eXBlb2YgYWN0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgLy8gSW5qZWN0IHRoZSBzdG9yZSdzIGBkaXNwYXRjaGAgYW5kIGBnZXRTdGF0ZWAgbWV0aG9kcywgYXMgd2VsbCBhcyBhbnkgXCJleHRyYSBhcmdcIlxuICAgICAgICAgIHJldHVybiBhY3Rpb24oZGlzcGF0Y2gsIGdldFN0YXRlLCBleHRyYUFyZ3VtZW50KTtcbiAgICAgICAgfSAvLyBPdGhlcndpc2UsIHBhc3MgdGhlIGFjdGlvbiBkb3duIHRoZSBtaWRkbGV3YXJlIGNoYWluIGFzIHVzdWFsXG5cblxuICAgICAgICByZXR1cm4gbmV4dChhY3Rpb24pO1xuICAgICAgfTtcbiAgICB9O1xuICB9O1xuXG4gIHJldHVybiBtaWRkbGV3YXJlO1xufVxuXG52YXIgdGh1bmsgPSBjcmVhdGVUaHVua01pZGRsZXdhcmUoKTsgLy8gQXR0YWNoIHRoZSBmYWN0b3J5IGZ1bmN0aW9uIHNvIHVzZXJzIGNhbiBjcmVhdGUgYSBjdXN0b21pemVkIHZlcnNpb25cbi8vIHdpdGggd2hhdGV2ZXIgXCJleHRyYSBhcmdcIiB0aGV5IHdhbnQgdG8gaW5qZWN0IGludG8gdGhlaXIgdGh1bmtzXG5cbnRodW5rLndpdGhFeHRyYUFyZ3VtZW50ID0gY3JlYXRlVGh1bmtNaWRkbGV3YXJlO1xuZXhwb3J0IGRlZmF1bHQgdGh1bms7IiwiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSAnQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMic7XG5cbi8qKlxuICogQWRhcHRlZCBmcm9tIFJlYWN0OiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvYmxvYi9tYXN0ZXIvcGFja2FnZXMvc2hhcmVkL2Zvcm1hdFByb2RFcnJvck1lc3NhZ2UuanNcbiAqXG4gKiBEbyBub3QgcmVxdWlyZSB0aGlzIG1vZHVsZSBkaXJlY3RseSEgVXNlIG5vcm1hbCB0aHJvdyBlcnJvciBjYWxscy4gVGhlc2UgbWVzc2FnZXMgd2lsbCBiZSByZXBsYWNlZCB3aXRoIGVycm9yIGNvZGVzXG4gKiBkdXJpbmcgYnVpbGQuXG4gKiBAcGFyYW0ge251bWJlcn0gY29kZVxuICovXG5mdW5jdGlvbiBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKGNvZGUpIHtcbiAgcmV0dXJuIFwiTWluaWZpZWQgUmVkdXggZXJyb3IgI1wiICsgY29kZSArIFwiOyB2aXNpdCBodHRwczovL3JlZHV4LmpzLm9yZy9FcnJvcnM/Y29kZT1cIiArIGNvZGUgKyBcIiBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciBcIiArICd1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzLiAnO1xufVxuXG4vLyBJbmxpbmVkIHZlcnNpb24gb2YgdGhlIGBzeW1ib2wtb2JzZXJ2YWJsZWAgcG9seWZpbGxcbnZhciAkJG9ic2VydmFibGUgPSAoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wub2JzZXJ2YWJsZSB8fCAnQEBvYnNlcnZhYmxlJztcbn0pKCk7XG5cbi8qKlxuICogVGhlc2UgYXJlIHByaXZhdGUgYWN0aW9uIHR5cGVzIHJlc2VydmVkIGJ5IFJlZHV4LlxuICogRm9yIGFueSB1bmtub3duIGFjdGlvbnMsIHlvdSBtdXN0IHJldHVybiB0aGUgY3VycmVudCBzdGF0ZS5cbiAqIElmIHRoZSBjdXJyZW50IHN0YXRlIGlzIHVuZGVmaW5lZCwgeW91IG11c3QgcmV0dXJuIHRoZSBpbml0aWFsIHN0YXRlLlxuICogRG8gbm90IHJlZmVyZW5jZSB0aGVzZSBhY3Rpb24gdHlwZXMgZGlyZWN0bHkgaW4geW91ciBjb2RlLlxuICovXG52YXIgcmFuZG9tU3RyaW5nID0gZnVuY3Rpb24gcmFuZG9tU3RyaW5nKCkge1xuICByZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDcpLnNwbGl0KCcnKS5qb2luKCcuJyk7XG59O1xuXG52YXIgQWN0aW9uVHlwZXMgPSB7XG4gIElOSVQ6IFwiQEByZWR1eC9JTklUXCIgKyByYW5kb21TdHJpbmcoKSxcbiAgUkVQTEFDRTogXCJAQHJlZHV4L1JFUExBQ0VcIiArIHJhbmRvbVN0cmluZygpLFxuICBQUk9CRV9VTktOT1dOX0FDVElPTjogZnVuY3Rpb24gUFJPQkVfVU5LTk9XTl9BQ1RJT04oKSB7XG4gICAgcmV0dXJuIFwiQEByZWR1eC9QUk9CRV9VTktOT1dOX0FDVElPTlwiICsgcmFuZG9tU3RyaW5nKCk7XG4gIH1cbn07XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IG9iaiBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgYXJndW1lbnQgYXBwZWFycyB0byBiZSBhIHBsYWluIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdChvYmopIHtcbiAgaWYgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnIHx8IG9iaiA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICB2YXIgcHJvdG8gPSBvYmo7XG5cbiAgd2hpbGUgKE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90bykgIT09IG51bGwpIHtcbiAgICBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90byk7XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaikgPT09IHByb3RvO1xufVxuXG4vLyBJbmxpbmVkIC8gc2hvcnRlbmVkIHZlcnNpb24gb2YgYGtpbmRPZmAgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9raW5kLW9mXG5mdW5jdGlvbiBtaW5pS2luZE9mKHZhbCkge1xuICBpZiAodmFsID09PSB2b2lkIDApIHJldHVybiAndW5kZWZpbmVkJztcbiAgaWYgKHZhbCA9PT0gbnVsbCkgcmV0dXJuICdudWxsJztcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsO1xuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICBjYXNlICdzeW1ib2wnOlxuICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgICB9XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSByZXR1cm4gJ2FycmF5JztcbiAgaWYgKGlzRGF0ZSh2YWwpKSByZXR1cm4gJ2RhdGUnO1xuICBpZiAoaXNFcnJvcih2YWwpKSByZXR1cm4gJ2Vycm9yJztcbiAgdmFyIGNvbnN0cnVjdG9yTmFtZSA9IGN0b3JOYW1lKHZhbCk7XG5cbiAgc3dpdGNoIChjb25zdHJ1Y3Rvck5hbWUpIHtcbiAgICBjYXNlICdTeW1ib2wnOlxuICAgIGNhc2UgJ1Byb21pc2UnOlxuICAgIGNhc2UgJ1dlYWtNYXAnOlxuICAgIGNhc2UgJ1dlYWtTZXQnOlxuICAgIGNhc2UgJ01hcCc6XG4gICAgY2FzZSAnU2V0JzpcbiAgICAgIHJldHVybiBjb25zdHJ1Y3Rvck5hbWU7XG4gIH0gLy8gb3RoZXJcblxuXG4gIHJldHVybiB0eXBlLnNsaWNlKDgsIC0xKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xccy9nLCAnJyk7XG59XG5cbmZ1bmN0aW9uIGN0b3JOYW1lKHZhbCkge1xuICByZXR1cm4gdHlwZW9mIHZhbC5jb25zdHJ1Y3RvciA9PT0gJ2Z1bmN0aW9uJyA/IHZhbC5jb25zdHJ1Y3Rvci5uYW1lIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gaXNFcnJvcih2YWwpIHtcbiAgcmV0dXJuIHZhbCBpbnN0YW5jZW9mIEVycm9yIHx8IHR5cGVvZiB2YWwubWVzc2FnZSA9PT0gJ3N0cmluZycgJiYgdmFsLmNvbnN0cnVjdG9yICYmIHR5cGVvZiB2YWwuY29uc3RydWN0b3Iuc3RhY2tUcmFjZUxpbWl0ID09PSAnbnVtYmVyJztcbn1cblxuZnVuY3Rpb24gaXNEYXRlKHZhbCkge1xuICBpZiAodmFsIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIHRydWU7XG4gIHJldHVybiB0eXBlb2YgdmFsLnRvRGF0ZVN0cmluZyA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdmFsLmdldERhdGUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHZhbC5zZXREYXRlID09PSAnZnVuY3Rpb24nO1xufVxuXG5mdW5jdGlvbiBraW5kT2YodmFsKSB7XG4gIHZhciB0eXBlT2ZWYWwgPSB0eXBlb2YgdmFsO1xuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgdHlwZU9mVmFsID0gbWluaUtpbmRPZih2YWwpO1xuICB9XG5cbiAgcmV0dXJuIHR5cGVPZlZhbDtcbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZFxuICpcbiAqICoqV2UgcmVjb21tZW5kIHVzaW5nIHRoZSBgY29uZmlndXJlU3RvcmVgIG1ldGhvZFxuICogb2YgdGhlIGBAcmVkdXhqcy90b29sa2l0YCBwYWNrYWdlKiosIHdoaWNoIHJlcGxhY2VzIGBjcmVhdGVTdG9yZWAuXG4gKlxuICogUmVkdXggVG9vbGtpdCBpcyBvdXIgcmVjb21tZW5kZWQgYXBwcm9hY2ggZm9yIHdyaXRpbmcgUmVkdXggbG9naWMgdG9kYXksXG4gKiBpbmNsdWRpbmcgc3RvcmUgc2V0dXAsIHJlZHVjZXJzLCBkYXRhIGZldGNoaW5nLCBhbmQgbW9yZS5cbiAqXG4gKiAqKkZvciBtb3JlIGRldGFpbHMsIHBsZWFzZSByZWFkIHRoaXMgUmVkdXggZG9jcyBwYWdlOioqXG4gKiAqKmh0dHBzOi8vcmVkdXguanMub3JnL2ludHJvZHVjdGlvbi93aHktcnRrLWlzLXJlZHV4LXRvZGF5KipcbiAqXG4gKiBgY29uZmlndXJlU3RvcmVgIGZyb20gUmVkdXggVG9vbGtpdCBpcyBhbiBpbXByb3ZlZCB2ZXJzaW9uIG9mIGBjcmVhdGVTdG9yZWAgdGhhdFxuICogc2ltcGxpZmllcyBzZXR1cCBhbmQgaGVscHMgYXZvaWQgY29tbW9uIGJ1Z3MuXG4gKlxuICogWW91IHNob3VsZCBub3QgYmUgdXNpbmcgdGhlIGByZWR1eGAgY29yZSBwYWNrYWdlIGJ5IGl0c2VsZiB0b2RheSwgZXhjZXB0IGZvciBsZWFybmluZyBwdXJwb3Nlcy5cbiAqIFRoZSBgY3JlYXRlU3RvcmVgIG1ldGhvZCBmcm9tIHRoZSBjb3JlIGByZWR1eGAgcGFja2FnZSB3aWxsIG5vdCBiZSByZW1vdmVkLCBidXQgd2UgZW5jb3VyYWdlXG4gKiBhbGwgdXNlcnMgdG8gbWlncmF0ZSB0byB1c2luZyBSZWR1eCBUb29sa2l0IGZvciBhbGwgUmVkdXggY29kZS5cbiAqXG4gKiBJZiB5b3Ugd2FudCB0byB1c2UgYGNyZWF0ZVN0b3JlYCB3aXRob3V0IHRoaXMgdmlzdWFsIGRlcHJlY2F0aW9uIHdhcm5pbmcsIHVzZVxuICogdGhlIGBsZWdhY3lfY3JlYXRlU3RvcmVgIGltcG9ydCBpbnN0ZWFkOlxuICpcbiAqIGBpbXBvcnQgeyBsZWdhY3lfY3JlYXRlU3RvcmUgYXMgY3JlYXRlU3RvcmV9IGZyb20gJ3JlZHV4J2BcbiAqXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlU3RvcmUocmVkdWNlciwgcHJlbG9hZGVkU3RhdGUsIGVuaGFuY2VyKSB7XG4gIHZhciBfcmVmMjtcblxuICBpZiAodHlwZW9mIHByZWxvYWRlZFN0YXRlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBlbmhhbmNlciA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgZW5oYW5jZXIgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGFyZ3VtZW50c1szXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDApIDogJ0l0IGxvb2tzIGxpa2UgeW91IGFyZSBwYXNzaW5nIHNldmVyYWwgc3RvcmUgZW5oYW5jZXJzIHRvICcgKyAnY3JlYXRlU3RvcmUoKS4gVGhpcyBpcyBub3Qgc3VwcG9ydGVkLiBJbnN0ZWFkLCBjb21wb3NlIHRoZW0gJyArICd0b2dldGhlciB0byBhIHNpbmdsZSBmdW5jdGlvbi4gU2VlIGh0dHBzOi8vcmVkdXguanMub3JnL3R1dG9yaWFscy9mdW5kYW1lbnRhbHMvcGFydC00LXN0b3JlI2NyZWF0aW5nLWEtc3RvcmUtd2l0aC1lbmhhbmNlcnMgZm9yIGFuIGV4YW1wbGUuJyk7XG4gIH1cblxuICBpZiAodHlwZW9mIHByZWxvYWRlZFN0YXRlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBlbmhhbmNlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBlbmhhbmNlciA9IHByZWxvYWRlZFN0YXRlO1xuICAgIHByZWxvYWRlZFN0YXRlID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBlbmhhbmNlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAodHlwZW9mIGVuaGFuY2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxKSA6IFwiRXhwZWN0ZWQgdGhlIGVuaGFuY2VyIHRvIGJlIGEgZnVuY3Rpb24uIEluc3RlYWQsIHJlY2VpdmVkOiAnXCIgKyBraW5kT2YoZW5oYW5jZXIpICsgXCInXCIpO1xuICAgIH1cblxuICAgIHJldHVybiBlbmhhbmNlcihjcmVhdGVTdG9yZSkocmVkdWNlciwgcHJlbG9hZGVkU3RhdGUpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiByZWR1Y2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMikgOiBcIkV4cGVjdGVkIHRoZSByb290IHJlZHVjZXIgdG8gYmUgYSBmdW5jdGlvbi4gSW5zdGVhZCwgcmVjZWl2ZWQ6ICdcIiArIGtpbmRPZihyZWR1Y2VyKSArIFwiJ1wiKTtcbiAgfVxuXG4gIHZhciBjdXJyZW50UmVkdWNlciA9IHJlZHVjZXI7XG4gIHZhciBjdXJyZW50U3RhdGUgPSBwcmVsb2FkZWRTdGF0ZTtcbiAgdmFyIGN1cnJlbnRMaXN0ZW5lcnMgPSBbXTtcbiAgdmFyIG5leHRMaXN0ZW5lcnMgPSBjdXJyZW50TGlzdGVuZXJzO1xuICB2YXIgaXNEaXNwYXRjaGluZyA9IGZhbHNlO1xuICAvKipcbiAgICogVGhpcyBtYWtlcyBhIHNoYWxsb3cgY29weSBvZiBjdXJyZW50TGlzdGVuZXJzIHNvIHdlIGNhbiB1c2VcbiAgICogbmV4dExpc3RlbmVycyBhcyBhIHRlbXBvcmFyeSBsaXN0IHdoaWxlIGRpc3BhdGNoaW5nLlxuICAgKlxuICAgKiBUaGlzIHByZXZlbnRzIGFueSBidWdzIGFyb3VuZCBjb25zdW1lcnMgY2FsbGluZ1xuICAgKiBzdWJzY3JpYmUvdW5zdWJzY3JpYmUgaW4gdGhlIG1pZGRsZSBvZiBhIGRpc3BhdGNoLlxuICAgKi9cblxuICBmdW5jdGlvbiBlbnN1cmVDYW5NdXRhdGVOZXh0TGlzdGVuZXJzKCkge1xuICAgIGlmIChuZXh0TGlzdGVuZXJzID09PSBjdXJyZW50TGlzdGVuZXJzKSB7XG4gICAgICBuZXh0TGlzdGVuZXJzID0gY3VycmVudExpc3RlbmVycy5zbGljZSgpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogUmVhZHMgdGhlIHN0YXRlIHRyZWUgbWFuYWdlZCBieSB0aGUgc3RvcmUuXG4gICAqXG4gICAqIEByZXR1cm5zIHthbnl9IFRoZSBjdXJyZW50IHN0YXRlIHRyZWUgb2YgeW91ciBhcHBsaWNhdGlvbi5cbiAgICovXG5cblxuICBmdW5jdGlvbiBnZXRTdGF0ZSgpIHtcbiAgICBpZiAoaXNEaXNwYXRjaGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMykgOiAnWW91IG1heSBub3QgY2FsbCBzdG9yZS5nZXRTdGF0ZSgpIHdoaWxlIHRoZSByZWR1Y2VyIGlzIGV4ZWN1dGluZy4gJyArICdUaGUgcmVkdWNlciBoYXMgYWxyZWFkeSByZWNlaXZlZCB0aGUgc3RhdGUgYXMgYW4gYXJndW1lbnQuICcgKyAnUGFzcyBpdCBkb3duIGZyb20gdGhlIHRvcCByZWR1Y2VyIGluc3RlYWQgb2YgcmVhZGluZyBpdCBmcm9tIHRoZSBzdG9yZS4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY3VycmVudFN0YXRlO1xuICB9XG4gIC8qKlxuICAgKiBBZGRzIGEgY2hhbmdlIGxpc3RlbmVyLiBJdCB3aWxsIGJlIGNhbGxlZCBhbnkgdGltZSBhbiBhY3Rpb24gaXMgZGlzcGF0Y2hlZCxcbiAgICogYW5kIHNvbWUgcGFydCBvZiB0aGUgc3RhdGUgdHJlZSBtYXkgcG90ZW50aWFsbHkgaGF2ZSBjaGFuZ2VkLiBZb3UgbWF5IHRoZW5cbiAgICogY2FsbCBgZ2V0U3RhdGUoKWAgdG8gcmVhZCB0aGUgY3VycmVudCBzdGF0ZSB0cmVlIGluc2lkZSB0aGUgY2FsbGJhY2suXG4gICAqXG4gICAqIFlvdSBtYXkgY2FsbCBgZGlzcGF0Y2goKWAgZnJvbSBhIGNoYW5nZSBsaXN0ZW5lciwgd2l0aCB0aGUgZm9sbG93aW5nXG4gICAqIGNhdmVhdHM6XG4gICAqXG4gICAqIDEuIFRoZSBzdWJzY3JpcHRpb25zIGFyZSBzbmFwc2hvdHRlZCBqdXN0IGJlZm9yZSBldmVyeSBgZGlzcGF0Y2goKWAgY2FsbC5cbiAgICogSWYgeW91IHN1YnNjcmliZSBvciB1bnN1YnNjcmliZSB3aGlsZSB0aGUgbGlzdGVuZXJzIGFyZSBiZWluZyBpbnZva2VkLCB0aGlzXG4gICAqIHdpbGwgbm90IGhhdmUgYW55IGVmZmVjdCBvbiB0aGUgYGRpc3BhdGNoKClgIHRoYXQgaXMgY3VycmVudGx5IGluIHByb2dyZXNzLlxuICAgKiBIb3dldmVyLCB0aGUgbmV4dCBgZGlzcGF0Y2goKWAgY2FsbCwgd2hldGhlciBuZXN0ZWQgb3Igbm90LCB3aWxsIHVzZSBhIG1vcmVcbiAgICogcmVjZW50IHNuYXBzaG90IG9mIHRoZSBzdWJzY3JpcHRpb24gbGlzdC5cbiAgICpcbiAgICogMi4gVGhlIGxpc3RlbmVyIHNob3VsZCBub3QgZXhwZWN0IHRvIHNlZSBhbGwgc3RhdGUgY2hhbmdlcywgYXMgdGhlIHN0YXRlXG4gICAqIG1pZ2h0IGhhdmUgYmVlbiB1cGRhdGVkIG11bHRpcGxlIHRpbWVzIGR1cmluZyBhIG5lc3RlZCBgZGlzcGF0Y2goKWAgYmVmb3JlXG4gICAqIHRoZSBsaXN0ZW5lciBpcyBjYWxsZWQuIEl0IGlzLCBob3dldmVyLCBndWFyYW50ZWVkIHRoYXQgYWxsIHN1YnNjcmliZXJzXG4gICAqIHJlZ2lzdGVyZWQgYmVmb3JlIHRoZSBgZGlzcGF0Y2goKWAgc3RhcnRlZCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBsYXRlc3RcbiAgICogc3RhdGUgYnkgdGhlIHRpbWUgaXQgZXhpdHMuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIEEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCBvbiBldmVyeSBkaXNwYXRjaC5cbiAgICogQHJldHVybnMge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIHRvIHJlbW92ZSB0aGlzIGNoYW5nZSBsaXN0ZW5lci5cbiAgICovXG5cblxuICBmdW5jdGlvbiBzdWJzY3JpYmUobGlzdGVuZXIpIHtcbiAgICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg0KSA6IFwiRXhwZWN0ZWQgdGhlIGxpc3RlbmVyIHRvIGJlIGEgZnVuY3Rpb24uIEluc3RlYWQsIHJlY2VpdmVkOiAnXCIgKyBraW5kT2YobGlzdGVuZXIpICsgXCInXCIpO1xuICAgIH1cblxuICAgIGlmIChpc0Rpc3BhdGNoaW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg1KSA6ICdZb3UgbWF5IG5vdCBjYWxsIHN0b3JlLnN1YnNjcmliZSgpIHdoaWxlIHRoZSByZWR1Y2VyIGlzIGV4ZWN1dGluZy4gJyArICdJZiB5b3Ugd291bGQgbGlrZSB0byBiZSBub3RpZmllZCBhZnRlciB0aGUgc3RvcmUgaGFzIGJlZW4gdXBkYXRlZCwgc3Vic2NyaWJlIGZyb20gYSAnICsgJ2NvbXBvbmVudCBhbmQgaW52b2tlIHN0b3JlLmdldFN0YXRlKCkgaW4gdGhlIGNhbGxiYWNrIHRvIGFjY2VzcyB0aGUgbGF0ZXN0IHN0YXRlLiAnICsgJ1NlZSBodHRwczovL3JlZHV4LmpzLm9yZy9hcGkvc3RvcmUjc3Vic2NyaWJlbGlzdGVuZXIgZm9yIG1vcmUgZGV0YWlscy4nKTtcbiAgICB9XG5cbiAgICB2YXIgaXNTdWJzY3JpYmVkID0gdHJ1ZTtcbiAgICBlbnN1cmVDYW5NdXRhdGVOZXh0TGlzdGVuZXJzKCk7XG4gICAgbmV4dExpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gdW5zdWJzY3JpYmUoKSB7XG4gICAgICBpZiAoIWlzU3Vic2NyaWJlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0Rpc3BhdGNoaW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDYpIDogJ1lvdSBtYXkgbm90IHVuc3Vic2NyaWJlIGZyb20gYSBzdG9yZSBsaXN0ZW5lciB3aGlsZSB0aGUgcmVkdWNlciBpcyBleGVjdXRpbmcuICcgKyAnU2VlIGh0dHBzOi8vcmVkdXguanMub3JnL2FwaS9zdG9yZSNzdWJzY3JpYmVsaXN0ZW5lciBmb3IgbW9yZSBkZXRhaWxzLicpO1xuICAgICAgfVxuXG4gICAgICBpc1N1YnNjcmliZWQgPSBmYWxzZTtcbiAgICAgIGVuc3VyZUNhbk11dGF0ZU5leHRMaXN0ZW5lcnMoKTtcbiAgICAgIHZhciBpbmRleCA9IG5leHRMaXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG4gICAgICBuZXh0TGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICBjdXJyZW50TGlzdGVuZXJzID0gbnVsbDtcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBEaXNwYXRjaGVzIGFuIGFjdGlvbi4gSXQgaXMgdGhlIG9ubHkgd2F5IHRvIHRyaWdnZXIgYSBzdGF0ZSBjaGFuZ2UuXG4gICAqXG4gICAqIFRoZSBgcmVkdWNlcmAgZnVuY3Rpb24sIHVzZWQgdG8gY3JlYXRlIHRoZSBzdG9yZSwgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGVcbiAgICogY3VycmVudCBzdGF0ZSB0cmVlIGFuZCB0aGUgZ2l2ZW4gYGFjdGlvbmAuIEl0cyByZXR1cm4gdmFsdWUgd2lsbFxuICAgKiBiZSBjb25zaWRlcmVkIHRoZSAqKm5leHQqKiBzdGF0ZSBvZiB0aGUgdHJlZSwgYW5kIHRoZSBjaGFuZ2UgbGlzdGVuZXJzXG4gICAqIHdpbGwgYmUgbm90aWZpZWQuXG4gICAqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9ubHkgc3VwcG9ydHMgcGxhaW4gb2JqZWN0IGFjdGlvbnMuIElmIHlvdSB3YW50IHRvXG4gICAqIGRpc3BhdGNoIGEgUHJvbWlzZSwgYW4gT2JzZXJ2YWJsZSwgYSB0aHVuaywgb3Igc29tZXRoaW5nIGVsc2UsIHlvdSBuZWVkIHRvXG4gICAqIHdyYXAgeW91ciBzdG9yZSBjcmVhdGluZyBmdW5jdGlvbiBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIG1pZGRsZXdhcmUuIEZvclxuICAgKiBleGFtcGxlLCBzZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBgcmVkdXgtdGh1bmtgIHBhY2thZ2UuIEV2ZW4gdGhlXG4gICAqIG1pZGRsZXdhcmUgd2lsbCBldmVudHVhbGx5IGRpc3BhdGNoIHBsYWluIG9iamVjdCBhY3Rpb25zIHVzaW5nIHRoaXMgbWV0aG9kLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gYWN0aW9uIEEgcGxhaW4gb2JqZWN0IHJlcHJlc2VudGluZyDigJx3aGF0IGNoYW5nZWTigJ0uIEl0IGlzXG4gICAqIGEgZ29vZCBpZGVhIHRvIGtlZXAgYWN0aW9ucyBzZXJpYWxpemFibGUgc28geW91IGNhbiByZWNvcmQgYW5kIHJlcGxheSB1c2VyXG4gICAqIHNlc3Npb25zLCBvciB1c2UgdGhlIHRpbWUgdHJhdmVsbGluZyBgcmVkdXgtZGV2dG9vbHNgLiBBbiBhY3Rpb24gbXVzdCBoYXZlXG4gICAqIGEgYHR5cGVgIHByb3BlcnR5IHdoaWNoIG1heSBub3QgYmUgYHVuZGVmaW5lZGAuIEl0IGlzIGEgZ29vZCBpZGVhIHRvIHVzZVxuICAgKiBzdHJpbmcgY29uc3RhbnRzIGZvciBhY3Rpb24gdHlwZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IEZvciBjb252ZW5pZW5jZSwgdGhlIHNhbWUgYWN0aW9uIG9iamVjdCB5b3UgZGlzcGF0Y2hlZC5cbiAgICpcbiAgICogTm90ZSB0aGF0LCBpZiB5b3UgdXNlIGEgY3VzdG9tIG1pZGRsZXdhcmUsIGl0IG1heSB3cmFwIGBkaXNwYXRjaCgpYCB0b1xuICAgKiByZXR1cm4gc29tZXRoaW5nIGVsc2UgKGZvciBleGFtcGxlLCBhIFByb21pc2UgeW91IGNhbiBhd2FpdCkuXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gZGlzcGF0Y2goYWN0aW9uKSB7XG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KGFjdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDcpIDogXCJBY3Rpb25zIG11c3QgYmUgcGxhaW4gb2JqZWN0cy4gSW5zdGVhZCwgdGhlIGFjdHVhbCB0eXBlIHdhczogJ1wiICsga2luZE9mKGFjdGlvbikgKyBcIicuIFlvdSBtYXkgbmVlZCB0byBhZGQgbWlkZGxld2FyZSB0byB5b3VyIHN0b3JlIHNldHVwIHRvIGhhbmRsZSBkaXNwYXRjaGluZyBvdGhlciB2YWx1ZXMsIHN1Y2ggYXMgJ3JlZHV4LXRodW5rJyB0byBoYW5kbGUgZGlzcGF0Y2hpbmcgZnVuY3Rpb25zLiBTZWUgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvdHV0b3JpYWxzL2Z1bmRhbWVudGFscy9wYXJ0LTQtc3RvcmUjbWlkZGxld2FyZSBhbmQgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvdHV0b3JpYWxzL2Z1bmRhbWVudGFscy9wYXJ0LTYtYXN5bmMtbG9naWMjdXNpbmctdGhlLXJlZHV4LXRodW5rLW1pZGRsZXdhcmUgZm9yIGV4YW1wbGVzLlwiKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGFjdGlvbi50eXBlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoOCkgOiAnQWN0aW9ucyBtYXkgbm90IGhhdmUgYW4gdW5kZWZpbmVkIFwidHlwZVwiIHByb3BlcnR5LiBZb3UgbWF5IGhhdmUgbWlzc3BlbGxlZCBhbiBhY3Rpb24gdHlwZSBzdHJpbmcgY29uc3RhbnQuJyk7XG4gICAgfVxuXG4gICAgaWYgKGlzRGlzcGF0Y2hpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDkpIDogJ1JlZHVjZXJzIG1heSBub3QgZGlzcGF0Y2ggYWN0aW9ucy4nKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgaXNEaXNwYXRjaGluZyA9IHRydWU7XG4gICAgICBjdXJyZW50U3RhdGUgPSBjdXJyZW50UmVkdWNlcihjdXJyZW50U3RhdGUsIGFjdGlvbik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlzRGlzcGF0Y2hpbmcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgbGlzdGVuZXJzID0gY3VycmVudExpc3RlbmVycyA9IG5leHRMaXN0ZW5lcnM7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGxpc3RlbmVyID0gbGlzdGVuZXJzW2ldO1xuICAgICAgbGlzdGVuZXIoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWN0aW9uO1xuICB9XG4gIC8qKlxuICAgKiBSZXBsYWNlcyB0aGUgcmVkdWNlciBjdXJyZW50bHkgdXNlZCBieSB0aGUgc3RvcmUgdG8gY2FsY3VsYXRlIHRoZSBzdGF0ZS5cbiAgICpcbiAgICogWW91IG1pZ2h0IG5lZWQgdGhpcyBpZiB5b3VyIGFwcCBpbXBsZW1lbnRzIGNvZGUgc3BsaXR0aW5nIGFuZCB5b3Ugd2FudCB0b1xuICAgKiBsb2FkIHNvbWUgb2YgdGhlIHJlZHVjZXJzIGR5bmFtaWNhbGx5LiBZb3UgbWlnaHQgYWxzbyBuZWVkIHRoaXMgaWYgeW91XG4gICAqIGltcGxlbWVudCBhIGhvdCByZWxvYWRpbmcgbWVjaGFuaXNtIGZvciBSZWR1eC5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbmV4dFJlZHVjZXIgVGhlIHJlZHVjZXIgZm9yIHRoZSBzdG9yZSB0byB1c2UgaW5zdGVhZC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gcmVwbGFjZVJlZHVjZXIobmV4dFJlZHVjZXIpIHtcbiAgICBpZiAodHlwZW9mIG5leHRSZWR1Y2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxMCkgOiBcIkV4cGVjdGVkIHRoZSBuZXh0UmVkdWNlciB0byBiZSBhIGZ1bmN0aW9uLiBJbnN0ZWFkLCByZWNlaXZlZDogJ1wiICsga2luZE9mKG5leHRSZWR1Y2VyKSk7XG4gICAgfVxuXG4gICAgY3VycmVudFJlZHVjZXIgPSBuZXh0UmVkdWNlcjsgLy8gVGhpcyBhY3Rpb24gaGFzIGEgc2ltaWxpYXIgZWZmZWN0IHRvIEFjdGlvblR5cGVzLklOSVQuXG4gICAgLy8gQW55IHJlZHVjZXJzIHRoYXQgZXhpc3RlZCBpbiBib3RoIHRoZSBuZXcgYW5kIG9sZCByb290UmVkdWNlclxuICAgIC8vIHdpbGwgcmVjZWl2ZSB0aGUgcHJldmlvdXMgc3RhdGUuIFRoaXMgZWZmZWN0aXZlbHkgcG9wdWxhdGVzXG4gICAgLy8gdGhlIG5ldyBzdGF0ZSB0cmVlIHdpdGggYW55IHJlbGV2YW50IGRhdGEgZnJvbSB0aGUgb2xkIG9uZS5cblxuICAgIGRpc3BhdGNoKHtcbiAgICAgIHR5cGU6IEFjdGlvblR5cGVzLlJFUExBQ0VcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogSW50ZXJvcGVyYWJpbGl0eSBwb2ludCBmb3Igb2JzZXJ2YWJsZS9yZWFjdGl2ZSBsaWJyYXJpZXMuXG4gICAqIEByZXR1cm5zIHtvYnNlcnZhYmxlfSBBIG1pbmltYWwgb2JzZXJ2YWJsZSBvZiBzdGF0ZSBjaGFuZ2VzLlxuICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBvYnNlcnZhYmxlIHByb3Bvc2FsOlxuICAgKiBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1vYnNlcnZhYmxlXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gb2JzZXJ2YWJsZSgpIHtcbiAgICB2YXIgX3JlZjtcblxuICAgIHZhciBvdXRlclN1YnNjcmliZSA9IHN1YnNjcmliZTtcbiAgICByZXR1cm4gX3JlZiA9IHtcbiAgICAgIC8qKlxuICAgICAgICogVGhlIG1pbmltYWwgb2JzZXJ2YWJsZSBzdWJzY3JpcHRpb24gbWV0aG9kLlxuICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9ic2VydmVyIEFueSBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCBhcyBhbiBvYnNlcnZlci5cbiAgICAgICAqIFRoZSBvYnNlcnZlciBvYmplY3Qgc2hvdWxkIGhhdmUgYSBgbmV4dGAgbWV0aG9kLlxuICAgICAgICogQHJldHVybnMge3N1YnNjcmlwdGlvbn0gQW4gb2JqZWN0IHdpdGggYW4gYHVuc3Vic2NyaWJlYCBtZXRob2QgdGhhdCBjYW5cbiAgICAgICAqIGJlIHVzZWQgdG8gdW5zdWJzY3JpYmUgdGhlIG9ic2VydmFibGUgZnJvbSB0aGUgc3RvcmUsIGFuZCBwcmV2ZW50IGZ1cnRoZXJcbiAgICAgICAqIGVtaXNzaW9uIG9mIHZhbHVlcyBmcm9tIHRoZSBvYnNlcnZhYmxlLlxuICAgICAgICovXG4gICAgICBzdWJzY3JpYmU6IGZ1bmN0aW9uIHN1YnNjcmliZShvYnNlcnZlcikge1xuICAgICAgICBpZiAodHlwZW9mIG9ic2VydmVyICE9PSAnb2JqZWN0JyB8fCBvYnNlcnZlciA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDExKSA6IFwiRXhwZWN0ZWQgdGhlIG9ic2VydmVyIHRvIGJlIGFuIG9iamVjdC4gSW5zdGVhZCwgcmVjZWl2ZWQ6ICdcIiArIGtpbmRPZihvYnNlcnZlcikgKyBcIidcIik7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBvYnNlcnZlU3RhdGUoKSB7XG4gICAgICAgICAgaWYgKG9ic2VydmVyLm5leHQpIHtcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQoZ2V0U3RhdGUoKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgb2JzZXJ2ZVN0YXRlKCk7XG4gICAgICAgIHZhciB1bnN1YnNjcmliZSA9IG91dGVyU3Vic2NyaWJlKG9ic2VydmVTdGF0ZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdW5zdWJzY3JpYmU6IHVuc3Vic2NyaWJlXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSwgX3JlZlskJG9ic2VydmFibGVdID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSwgX3JlZjtcbiAgfSAvLyBXaGVuIGEgc3RvcmUgaXMgY3JlYXRlZCwgYW4gXCJJTklUXCIgYWN0aW9uIGlzIGRpc3BhdGNoZWQgc28gdGhhdCBldmVyeVxuICAvLyByZWR1Y2VyIHJldHVybnMgdGhlaXIgaW5pdGlhbCBzdGF0ZS4gVGhpcyBlZmZlY3RpdmVseSBwb3B1bGF0ZXNcbiAgLy8gdGhlIGluaXRpYWwgc3RhdGUgdHJlZS5cblxuXG4gIGRpc3BhdGNoKHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5JTklUXG4gIH0pO1xuICByZXR1cm4gX3JlZjIgPSB7XG4gICAgZGlzcGF0Y2g6IGRpc3BhdGNoLFxuICAgIHN1YnNjcmliZTogc3Vic2NyaWJlLFxuICAgIGdldFN0YXRlOiBnZXRTdGF0ZSxcbiAgICByZXBsYWNlUmVkdWNlcjogcmVwbGFjZVJlZHVjZXJcbiAgfSwgX3JlZjJbJCRvYnNlcnZhYmxlXSA9IG9ic2VydmFibGUsIF9yZWYyO1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgUmVkdXggc3RvcmUgdGhhdCBob2xkcyB0aGUgc3RhdGUgdHJlZS5cbiAqXG4gKiAqKldlIHJlY29tbWVuZCB1c2luZyBgY29uZmlndXJlU3RvcmVgIGZyb20gdGhlXG4gKiBgQHJlZHV4anMvdG9vbGtpdGAgcGFja2FnZSoqLCB3aGljaCByZXBsYWNlcyBgY3JlYXRlU3RvcmVgOlxuICogKipodHRwczovL3JlZHV4LmpzLm9yZy9pbnRyb2R1Y3Rpb24vd2h5LXJ0ay1pcy1yZWR1eC10b2RheSoqXG4gKlxuICogVGhlIG9ubHkgd2F5IHRvIGNoYW5nZSB0aGUgZGF0YSBpbiB0aGUgc3RvcmUgaXMgdG8gY2FsbCBgZGlzcGF0Y2goKWAgb24gaXQuXG4gKlxuICogVGhlcmUgc2hvdWxkIG9ubHkgYmUgYSBzaW5nbGUgc3RvcmUgaW4geW91ciBhcHAuIFRvIHNwZWNpZnkgaG93IGRpZmZlcmVudFxuICogcGFydHMgb2YgdGhlIHN0YXRlIHRyZWUgcmVzcG9uZCB0byBhY3Rpb25zLCB5b3UgbWF5IGNvbWJpbmUgc2V2ZXJhbCByZWR1Y2Vyc1xuICogaW50byBhIHNpbmdsZSByZWR1Y2VyIGZ1bmN0aW9uIGJ5IHVzaW5nIGBjb21iaW5lUmVkdWNlcnNgLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHJlZHVjZXIgQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIG5leHQgc3RhdGUgdHJlZSwgZ2l2ZW5cbiAqIHRoZSBjdXJyZW50IHN0YXRlIHRyZWUgYW5kIHRoZSBhY3Rpb24gdG8gaGFuZGxlLlxuICpcbiAqIEBwYXJhbSB7YW55fSBbcHJlbG9hZGVkU3RhdGVdIFRoZSBpbml0aWFsIHN0YXRlLiBZb3UgbWF5IG9wdGlvbmFsbHkgc3BlY2lmeSBpdFxuICogdG8gaHlkcmF0ZSB0aGUgc3RhdGUgZnJvbSB0aGUgc2VydmVyIGluIHVuaXZlcnNhbCBhcHBzLCBvciB0byByZXN0b3JlIGFcbiAqIHByZXZpb3VzbHkgc2VyaWFsaXplZCB1c2VyIHNlc3Npb24uXG4gKiBJZiB5b3UgdXNlIGBjb21iaW5lUmVkdWNlcnNgIHRvIHByb2R1Y2UgdGhlIHJvb3QgcmVkdWNlciBmdW5jdGlvbiwgdGhpcyBtdXN0IGJlXG4gKiBhbiBvYmplY3Qgd2l0aCB0aGUgc2FtZSBzaGFwZSBhcyBgY29tYmluZVJlZHVjZXJzYCBrZXlzLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtlbmhhbmNlcl0gVGhlIHN0b3JlIGVuaGFuY2VyLiBZb3UgbWF5IG9wdGlvbmFsbHkgc3BlY2lmeSBpdFxuICogdG8gZW5oYW5jZSB0aGUgc3RvcmUgd2l0aCB0aGlyZC1wYXJ0eSBjYXBhYmlsaXRpZXMgc3VjaCBhcyBtaWRkbGV3YXJlLFxuICogdGltZSB0cmF2ZWwsIHBlcnNpc3RlbmNlLCBldGMuIFRoZSBvbmx5IHN0b3JlIGVuaGFuY2VyIHRoYXQgc2hpcHMgd2l0aCBSZWR1eFxuICogaXMgYGFwcGx5TWlkZGxld2FyZSgpYC5cbiAqXG4gKiBAcmV0dXJucyB7U3RvcmV9IEEgUmVkdXggc3RvcmUgdGhhdCBsZXRzIHlvdSByZWFkIHRoZSBzdGF0ZSwgZGlzcGF0Y2ggYWN0aW9uc1xuICogYW5kIHN1YnNjcmliZSB0byBjaGFuZ2VzLlxuICovXG5cbnZhciBsZWdhY3lfY3JlYXRlU3RvcmUgPSBjcmVhdGVTdG9yZTtcblxuLyoqXG4gKiBQcmludHMgYSB3YXJuaW5nIGluIHRoZSBjb25zb2xlIGlmIGl0IGV4aXN0cy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBUaGUgd2FybmluZyBtZXNzYWdlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHdhcm5pbmcobWVzc2FnZSkge1xuICAvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG4gIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNvbnNvbGUuZXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICB9XG4gIC8qIGVzbGludC1lbmFibGUgbm8tY29uc29sZSAqL1xuXG5cbiAgdHJ5IHtcbiAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IGlmIHlvdSBlbmFibGVcbiAgICAvLyBcImJyZWFrIG9uIGFsbCBleGNlcHRpb25zXCIgaW4geW91ciBjb25zb2xlLFxuICAgIC8vIGl0IHdvdWxkIHBhdXNlIHRoZSBleGVjdXRpb24gYXQgdGhpcyBsaW5lLlxuICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgfSBjYXRjaCAoZSkge30gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1lbXB0eVxuXG59XG5cbmZ1bmN0aW9uIGdldFVuZXhwZWN0ZWRTdGF0ZVNoYXBlV2FybmluZ01lc3NhZ2UoaW5wdXRTdGF0ZSwgcmVkdWNlcnMsIGFjdGlvbiwgdW5leHBlY3RlZEtleUNhY2hlKSB7XG4gIHZhciByZWR1Y2VyS2V5cyA9IE9iamVjdC5rZXlzKHJlZHVjZXJzKTtcbiAgdmFyIGFyZ3VtZW50TmFtZSA9IGFjdGlvbiAmJiBhY3Rpb24udHlwZSA9PT0gQWN0aW9uVHlwZXMuSU5JVCA/ICdwcmVsb2FkZWRTdGF0ZSBhcmd1bWVudCBwYXNzZWQgdG8gY3JlYXRlU3RvcmUnIDogJ3ByZXZpb3VzIHN0YXRlIHJlY2VpdmVkIGJ5IHRoZSByZWR1Y2VyJztcblxuICBpZiAocmVkdWNlcktleXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuICdTdG9yZSBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgcmVkdWNlci4gTWFrZSBzdXJlIHRoZSBhcmd1bWVudCBwYXNzZWQgJyArICd0byBjb21iaW5lUmVkdWNlcnMgaXMgYW4gb2JqZWN0IHdob3NlIHZhbHVlcyBhcmUgcmVkdWNlcnMuJztcbiAgfVxuXG4gIGlmICghaXNQbGFpbk9iamVjdChpbnB1dFN0YXRlKSkge1xuICAgIHJldHVybiBcIlRoZSBcIiArIGFyZ3VtZW50TmFtZSArIFwiIGhhcyB1bmV4cGVjdGVkIHR5cGUgb2YgXFxcIlwiICsga2luZE9mKGlucHV0U3RhdGUpICsgXCJcXFwiLiBFeHBlY3RlZCBhcmd1bWVudCB0byBiZSBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIFwiICsgKFwia2V5czogXFxcIlwiICsgcmVkdWNlcktleXMuam9pbignXCIsIFwiJykgKyBcIlxcXCJcIik7XG4gIH1cblxuICB2YXIgdW5leHBlY3RlZEtleXMgPSBPYmplY3Qua2V5cyhpbnB1dFN0YXRlKS5maWx0ZXIoZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiAhcmVkdWNlcnMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAhdW5leHBlY3RlZEtleUNhY2hlW2tleV07XG4gIH0pO1xuICB1bmV4cGVjdGVkS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICB1bmV4cGVjdGVkS2V5Q2FjaGVba2V5XSA9IHRydWU7XG4gIH0pO1xuICBpZiAoYWN0aW9uICYmIGFjdGlvbi50eXBlID09PSBBY3Rpb25UeXBlcy5SRVBMQUNFKSByZXR1cm47XG5cbiAgaWYgKHVuZXhwZWN0ZWRLZXlzLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gXCJVbmV4cGVjdGVkIFwiICsgKHVuZXhwZWN0ZWRLZXlzLmxlbmd0aCA+IDEgPyAna2V5cycgOiAna2V5JykgKyBcIiBcIiArIChcIlxcXCJcIiArIHVuZXhwZWN0ZWRLZXlzLmpvaW4oJ1wiLCBcIicpICsgXCJcXFwiIGZvdW5kIGluIFwiICsgYXJndW1lbnROYW1lICsgXCIuIFwiKSArIFwiRXhwZWN0ZWQgdG8gZmluZCBvbmUgb2YgdGhlIGtub3duIHJlZHVjZXIga2V5cyBpbnN0ZWFkOiBcIiArIChcIlxcXCJcIiArIHJlZHVjZXJLZXlzLmpvaW4oJ1wiLCBcIicpICsgXCJcXFwiLiBVbmV4cGVjdGVkIGtleXMgd2lsbCBiZSBpZ25vcmVkLlwiKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlcnRSZWR1Y2VyU2hhcGUocmVkdWNlcnMpIHtcbiAgT2JqZWN0LmtleXMocmVkdWNlcnMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciByZWR1Y2VyID0gcmVkdWNlcnNba2V5XTtcbiAgICB2YXIgaW5pdGlhbFN0YXRlID0gcmVkdWNlcih1bmRlZmluZWQsIHtcbiAgICAgIHR5cGU6IEFjdGlvblR5cGVzLklOSVRcbiAgICB9KTtcblxuICAgIGlmICh0eXBlb2YgaW5pdGlhbFN0YXRlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTIpIDogXCJUaGUgc2xpY2UgcmVkdWNlciBmb3Iga2V5IFxcXCJcIiArIGtleSArIFwiXFxcIiByZXR1cm5lZCB1bmRlZmluZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uLiBcIiArIFwiSWYgdGhlIHN0YXRlIHBhc3NlZCB0byB0aGUgcmVkdWNlciBpcyB1bmRlZmluZWQsIHlvdSBtdXN0IFwiICsgXCJleHBsaWNpdGx5IHJldHVybiB0aGUgaW5pdGlhbCBzdGF0ZS4gVGhlIGluaXRpYWwgc3RhdGUgbWF5IFwiICsgXCJub3QgYmUgdW5kZWZpbmVkLiBJZiB5b3UgZG9uJ3Qgd2FudCB0byBzZXQgYSB2YWx1ZSBmb3IgdGhpcyByZWR1Y2VyLCBcIiArIFwieW91IGNhbiB1c2UgbnVsbCBpbnN0ZWFkIG9mIHVuZGVmaW5lZC5cIik7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiByZWR1Y2VyKHVuZGVmaW5lZCwge1xuICAgICAgdHlwZTogQWN0aW9uVHlwZXMuUFJPQkVfVU5LTk9XTl9BQ1RJT04oKVxuICAgIH0pID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTMpIDogXCJUaGUgc2xpY2UgcmVkdWNlciBmb3Iga2V5IFxcXCJcIiArIGtleSArIFwiXFxcIiByZXR1cm5lZCB1bmRlZmluZWQgd2hlbiBwcm9iZWQgd2l0aCBhIHJhbmRvbSB0eXBlLiBcIiArIChcIkRvbid0IHRyeSB0byBoYW5kbGUgJ1wiICsgQWN0aW9uVHlwZXMuSU5JVCArIFwiJyBvciBvdGhlciBhY3Rpb25zIGluIFxcXCJyZWR1eC8qXFxcIiBcIikgKyBcIm5hbWVzcGFjZS4gVGhleSBhcmUgY29uc2lkZXJlZCBwcml2YXRlLiBJbnN0ZWFkLCB5b3UgbXVzdCByZXR1cm4gdGhlIFwiICsgXCJjdXJyZW50IHN0YXRlIGZvciBhbnkgdW5rbm93biBhY3Rpb25zLCB1bmxlc3MgaXQgaXMgdW5kZWZpbmVkLCBcIiArIFwiaW4gd2hpY2ggY2FzZSB5b3UgbXVzdCByZXR1cm4gdGhlIGluaXRpYWwgc3RhdGUsIHJlZ2FyZGxlc3Mgb2YgdGhlIFwiICsgXCJhY3Rpb24gdHlwZS4gVGhlIGluaXRpYWwgc3RhdGUgbWF5IG5vdCBiZSB1bmRlZmluZWQsIGJ1dCBjYW4gYmUgbnVsbC5cIik7XG4gICAgfVxuICB9KTtcbn1cbi8qKlxuICogVHVybnMgYW4gb2JqZWN0IHdob3NlIHZhbHVlcyBhcmUgZGlmZmVyZW50IHJlZHVjZXIgZnVuY3Rpb25zLCBpbnRvIGEgc2luZ2xlXG4gKiByZWR1Y2VyIGZ1bmN0aW9uLiBJdCB3aWxsIGNhbGwgZXZlcnkgY2hpbGQgcmVkdWNlciwgYW5kIGdhdGhlciB0aGVpciByZXN1bHRzXG4gKiBpbnRvIGEgc2luZ2xlIHN0YXRlIG9iamVjdCwgd2hvc2Uga2V5cyBjb3JyZXNwb25kIHRvIHRoZSBrZXlzIG9mIHRoZSBwYXNzZWRcbiAqIHJlZHVjZXIgZnVuY3Rpb25zLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSByZWR1Y2VycyBBbiBvYmplY3Qgd2hvc2UgdmFsdWVzIGNvcnJlc3BvbmQgdG8gZGlmZmVyZW50XG4gKiByZWR1Y2VyIGZ1bmN0aW9ucyB0aGF0IG5lZWQgdG8gYmUgY29tYmluZWQgaW50byBvbmUuIE9uZSBoYW5keSB3YXkgdG8gb2J0YWluXG4gKiBpdCBpcyB0byB1c2UgRVM2IGBpbXBvcnQgKiBhcyByZWR1Y2Vyc2Agc3ludGF4LiBUaGUgcmVkdWNlcnMgbWF5IG5ldmVyIHJldHVyblxuICogdW5kZWZpbmVkIGZvciBhbnkgYWN0aW9uLiBJbnN0ZWFkLCB0aGV5IHNob3VsZCByZXR1cm4gdGhlaXIgaW5pdGlhbCBzdGF0ZVxuICogaWYgdGhlIHN0YXRlIHBhc3NlZCB0byB0aGVtIHdhcyB1bmRlZmluZWQsIGFuZCB0aGUgY3VycmVudCBzdGF0ZSBmb3IgYW55XG4gKiB1bnJlY29nbml6ZWQgYWN0aW9uLlxuICpcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSByZWR1Y2VyIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBldmVyeSByZWR1Y2VyIGluc2lkZSB0aGVcbiAqIHBhc3NlZCBvYmplY3QsIGFuZCBidWlsZHMgYSBzdGF0ZSBvYmplY3Qgd2l0aCB0aGUgc2FtZSBzaGFwZS5cbiAqL1xuXG5cbmZ1bmN0aW9uIGNvbWJpbmVSZWR1Y2VycyhyZWR1Y2Vycykge1xuICB2YXIgcmVkdWNlcktleXMgPSBPYmplY3Qua2V5cyhyZWR1Y2Vycyk7XG4gIHZhciBmaW5hbFJlZHVjZXJzID0ge307XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByZWR1Y2VyS2V5cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBrZXkgPSByZWR1Y2VyS2V5c1tpXTtcblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAodHlwZW9mIHJlZHVjZXJzW2tleV0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHdhcm5pbmcoXCJObyByZWR1Y2VyIHByb3ZpZGVkIGZvciBrZXkgXFxcIlwiICsga2V5ICsgXCJcXFwiXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcmVkdWNlcnNba2V5XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZmluYWxSZWR1Y2Vyc1trZXldID0gcmVkdWNlcnNba2V5XTtcbiAgICB9XG4gIH1cblxuICB2YXIgZmluYWxSZWR1Y2VyS2V5cyA9IE9iamVjdC5rZXlzKGZpbmFsUmVkdWNlcnMpOyAvLyBUaGlzIGlzIHVzZWQgdG8gbWFrZSBzdXJlIHdlIGRvbid0IHdhcm4gYWJvdXQgdGhlIHNhbWVcbiAgLy8ga2V5cyBtdWx0aXBsZSB0aW1lcy5cblxuICB2YXIgdW5leHBlY3RlZEtleUNhY2hlO1xuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgdW5leHBlY3RlZEtleUNhY2hlID0ge307XG4gIH1cblxuICB2YXIgc2hhcGVBc3NlcnRpb25FcnJvcjtcblxuICB0cnkge1xuICAgIGFzc2VydFJlZHVjZXJTaGFwZShmaW5hbFJlZHVjZXJzKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHNoYXBlQXNzZXJ0aW9uRXJyb3IgPSBlO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIGNvbWJpbmF0aW9uKHN0YXRlLCBhY3Rpb24pIHtcbiAgICBpZiAoc3RhdGUgPT09IHZvaWQgMCkge1xuICAgICAgc3RhdGUgPSB7fTtcbiAgICB9XG5cbiAgICBpZiAoc2hhcGVBc3NlcnRpb25FcnJvcikge1xuICAgICAgdGhyb3cgc2hhcGVBc3NlcnRpb25FcnJvcjtcbiAgICB9XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIHdhcm5pbmdNZXNzYWdlID0gZ2V0VW5leHBlY3RlZFN0YXRlU2hhcGVXYXJuaW5nTWVzc2FnZShzdGF0ZSwgZmluYWxSZWR1Y2VycywgYWN0aW9uLCB1bmV4cGVjdGVkS2V5Q2FjaGUpO1xuXG4gICAgICBpZiAod2FybmluZ01lc3NhZ2UpIHtcbiAgICAgICAgd2FybmluZyh3YXJuaW5nTWVzc2FnZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGhhc0NoYW5nZWQgPSBmYWxzZTtcbiAgICB2YXIgbmV4dFN0YXRlID0ge307XG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgZmluYWxSZWR1Y2VyS2V5cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBfa2V5ID0gZmluYWxSZWR1Y2VyS2V5c1tfaV07XG4gICAgICB2YXIgcmVkdWNlciA9IGZpbmFsUmVkdWNlcnNbX2tleV07XG4gICAgICB2YXIgcHJldmlvdXNTdGF0ZUZvcktleSA9IHN0YXRlW19rZXldO1xuICAgICAgdmFyIG5leHRTdGF0ZUZvcktleSA9IHJlZHVjZXIocHJldmlvdXNTdGF0ZUZvcktleSwgYWN0aW9uKTtcblxuICAgICAgaWYgKHR5cGVvZiBuZXh0U3RhdGVGb3JLZXkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHZhciBhY3Rpb25UeXBlID0gYWN0aW9uICYmIGFjdGlvbi50eXBlO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxNCkgOiBcIldoZW4gY2FsbGVkIHdpdGggYW4gYWN0aW9uIG9mIHR5cGUgXCIgKyAoYWN0aW9uVHlwZSA/IFwiXFxcIlwiICsgU3RyaW5nKGFjdGlvblR5cGUpICsgXCJcXFwiXCIgOiAnKHVua25vd24gdHlwZSknKSArIFwiLCB0aGUgc2xpY2UgcmVkdWNlciBmb3Iga2V5IFxcXCJcIiArIF9rZXkgKyBcIlxcXCIgcmV0dXJuZWQgdW5kZWZpbmVkLiBcIiArIFwiVG8gaWdub3JlIGFuIGFjdGlvbiwgeW91IG11c3QgZXhwbGljaXRseSByZXR1cm4gdGhlIHByZXZpb3VzIHN0YXRlLiBcIiArIFwiSWYgeW91IHdhbnQgdGhpcyByZWR1Y2VyIHRvIGhvbGQgbm8gdmFsdWUsIHlvdSBjYW4gcmV0dXJuIG51bGwgaW5zdGVhZCBvZiB1bmRlZmluZWQuXCIpO1xuICAgICAgfVxuXG4gICAgICBuZXh0U3RhdGVbX2tleV0gPSBuZXh0U3RhdGVGb3JLZXk7XG4gICAgICBoYXNDaGFuZ2VkID0gaGFzQ2hhbmdlZCB8fCBuZXh0U3RhdGVGb3JLZXkgIT09IHByZXZpb3VzU3RhdGVGb3JLZXk7XG4gICAgfVxuXG4gICAgaGFzQ2hhbmdlZCA9IGhhc0NoYW5nZWQgfHwgZmluYWxSZWR1Y2VyS2V5cy5sZW5ndGggIT09IE9iamVjdC5rZXlzKHN0YXRlKS5sZW5ndGg7XG4gICAgcmV0dXJuIGhhc0NoYW5nZWQgPyBuZXh0U3RhdGUgOiBzdGF0ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYmluZEFjdGlvbkNyZWF0b3IoYWN0aW9uQ3JlYXRvciwgZGlzcGF0Y2gpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZGlzcGF0Y2goYWN0aW9uQ3JlYXRvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfTtcbn1cbi8qKlxuICogVHVybnMgYW4gb2JqZWN0IHdob3NlIHZhbHVlcyBhcmUgYWN0aW9uIGNyZWF0b3JzLCBpbnRvIGFuIG9iamVjdCB3aXRoIHRoZVxuICogc2FtZSBrZXlzLCBidXQgd2l0aCBldmVyeSBmdW5jdGlvbiB3cmFwcGVkIGludG8gYSBgZGlzcGF0Y2hgIGNhbGwgc28gdGhleVxuICogbWF5IGJlIGludm9rZWQgZGlyZWN0bHkuIFRoaXMgaXMganVzdCBhIGNvbnZlbmllbmNlIG1ldGhvZCwgYXMgeW91IGNhbiBjYWxsXG4gKiBgc3RvcmUuZGlzcGF0Y2goTXlBY3Rpb25DcmVhdG9ycy5kb1NvbWV0aGluZygpKWAgeW91cnNlbGYganVzdCBmaW5lLlxuICpcbiAqIEZvciBjb252ZW5pZW5jZSwgeW91IGNhbiBhbHNvIHBhc3MgYW4gYWN0aW9uIGNyZWF0b3IgYXMgdGhlIGZpcnN0IGFyZ3VtZW50LFxuICogYW5kIGdldCBhIGRpc3BhdGNoIHdyYXBwZWQgZnVuY3Rpb24gaW4gcmV0dXJuLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fSBhY3Rpb25DcmVhdG9ycyBBbiBvYmplY3Qgd2hvc2UgdmFsdWVzIGFyZSBhY3Rpb25cbiAqIGNyZWF0b3IgZnVuY3Rpb25zLiBPbmUgaGFuZHkgd2F5IHRvIG9idGFpbiBpdCBpcyB0byB1c2UgRVM2IGBpbXBvcnQgKiBhc2BcbiAqIHN5bnRheC4gWW91IG1heSBhbHNvIHBhc3MgYSBzaW5nbGUgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZGlzcGF0Y2ggVGhlIGBkaXNwYXRjaGAgZnVuY3Rpb24gYXZhaWxhYmxlIG9uIHlvdXIgUmVkdXhcbiAqIHN0b3JlLlxuICpcbiAqIEByZXR1cm5zIHtGdW5jdGlvbnxPYmplY3R9IFRoZSBvYmplY3QgbWltaWNraW5nIHRoZSBvcmlnaW5hbCBvYmplY3QsIGJ1dCB3aXRoXG4gKiBldmVyeSBhY3Rpb24gY3JlYXRvciB3cmFwcGVkIGludG8gdGhlIGBkaXNwYXRjaGAgY2FsbC4gSWYgeW91IHBhc3NlZCBhXG4gKiBmdW5jdGlvbiBhcyBgYWN0aW9uQ3JlYXRvcnNgLCB0aGUgcmV0dXJuIHZhbHVlIHdpbGwgYWxzbyBiZSBhIHNpbmdsZVxuICogZnVuY3Rpb24uXG4gKi9cblxuXG5mdW5jdGlvbiBiaW5kQWN0aW9uQ3JlYXRvcnMoYWN0aW9uQ3JlYXRvcnMsIGRpc3BhdGNoKSB7XG4gIGlmICh0eXBlb2YgYWN0aW9uQ3JlYXRvcnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gYmluZEFjdGlvbkNyZWF0b3IoYWN0aW9uQ3JlYXRvcnMsIGRpc3BhdGNoKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgYWN0aW9uQ3JlYXRvcnMgIT09ICdvYmplY3QnIHx8IGFjdGlvbkNyZWF0b3JzID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTYpIDogXCJiaW5kQWN0aW9uQ3JlYXRvcnMgZXhwZWN0ZWQgYW4gb2JqZWN0IG9yIGEgZnVuY3Rpb24sIGJ1dCBpbnN0ZWFkIHJlY2VpdmVkOiAnXCIgKyBraW5kT2YoYWN0aW9uQ3JlYXRvcnMpICsgXCInLiBcIiArIFwiRGlkIHlvdSB3cml0ZSBcXFwiaW1wb3J0IEFjdGlvbkNyZWF0b3JzIGZyb21cXFwiIGluc3RlYWQgb2YgXFxcImltcG9ydCAqIGFzIEFjdGlvbkNyZWF0b3JzIGZyb21cXFwiP1wiKTtcbiAgfVxuXG4gIHZhciBib3VuZEFjdGlvbkNyZWF0b3JzID0ge307XG5cbiAgZm9yICh2YXIga2V5IGluIGFjdGlvbkNyZWF0b3JzKSB7XG4gICAgdmFyIGFjdGlvbkNyZWF0b3IgPSBhY3Rpb25DcmVhdG9yc1trZXldO1xuXG4gICAgaWYgKHR5cGVvZiBhY3Rpb25DcmVhdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBib3VuZEFjdGlvbkNyZWF0b3JzW2tleV0gPSBiaW5kQWN0aW9uQ3JlYXRvcihhY3Rpb25DcmVhdG9yLCBkaXNwYXRjaCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJvdW5kQWN0aW9uQ3JlYXRvcnM7XG59XG5cbi8qKlxuICogQ29tcG9zZXMgc2luZ2xlLWFyZ3VtZW50IGZ1bmN0aW9ucyBmcm9tIHJpZ2h0IHRvIGxlZnQuIFRoZSByaWdodG1vc3RcbiAqIGZ1bmN0aW9uIGNhbiB0YWtlIG11bHRpcGxlIGFyZ3VtZW50cyBhcyBpdCBwcm92aWRlcyB0aGUgc2lnbmF0dXJlIGZvclxuICogdGhlIHJlc3VsdGluZyBjb21wb3NpdGUgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHsuLi5GdW5jdGlvbn0gZnVuY3MgVGhlIGZ1bmN0aW9ucyB0byBjb21wb3NlLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIG9idGFpbmVkIGJ5IGNvbXBvc2luZyB0aGUgYXJndW1lbnQgZnVuY3Rpb25zXG4gKiBmcm9tIHJpZ2h0IHRvIGxlZnQuIEZvciBleGFtcGxlLCBjb21wb3NlKGYsIGcsIGgpIGlzIGlkZW50aWNhbCB0byBkb2luZ1xuICogKC4uLmFyZ3MpID0+IGYoZyhoKC4uLmFyZ3MpKSkuXG4gKi9cbmZ1bmN0aW9uIGNvbXBvc2UoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBmdW5jcyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBmdW5jc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIGlmIChmdW5jcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGFyZykge1xuICAgICAgcmV0dXJuIGFyZztcbiAgICB9O1xuICB9XG5cbiAgaWYgKGZ1bmNzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBmdW5jc1swXTtcbiAgfVxuXG4gIHJldHVybiBmdW5jcy5yZWR1Y2UoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGEoYi5hcHBseSh2b2lkIDAsIGFyZ3VtZW50cykpO1xuICAgIH07XG4gIH0pO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBzdG9yZSBlbmhhbmNlciB0aGF0IGFwcGxpZXMgbWlkZGxld2FyZSB0byB0aGUgZGlzcGF0Y2ggbWV0aG9kXG4gKiBvZiB0aGUgUmVkdXggc3RvcmUuIFRoaXMgaXMgaGFuZHkgZm9yIGEgdmFyaWV0eSBvZiB0YXNrcywgc3VjaCBhcyBleHByZXNzaW5nXG4gKiBhc3luY2hyb25vdXMgYWN0aW9ucyBpbiBhIGNvbmNpc2UgbWFubmVyLCBvciBsb2dnaW5nIGV2ZXJ5IGFjdGlvbiBwYXlsb2FkLlxuICpcbiAqIFNlZSBgcmVkdXgtdGh1bmtgIHBhY2thZ2UgYXMgYW4gZXhhbXBsZSBvZiB0aGUgUmVkdXggbWlkZGxld2FyZS5cbiAqXG4gKiBCZWNhdXNlIG1pZGRsZXdhcmUgaXMgcG90ZW50aWFsbHkgYXN5bmNocm9ub3VzLCB0aGlzIHNob3VsZCBiZSB0aGUgZmlyc3RcbiAqIHN0b3JlIGVuaGFuY2VyIGluIHRoZSBjb21wb3NpdGlvbiBjaGFpbi5cbiAqXG4gKiBOb3RlIHRoYXQgZWFjaCBtaWRkbGV3YXJlIHdpbGwgYmUgZ2l2ZW4gdGhlIGBkaXNwYXRjaGAgYW5kIGBnZXRTdGF0ZWAgZnVuY3Rpb25zXG4gKiBhcyBuYW1lZCBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIHsuLi5GdW5jdGlvbn0gbWlkZGxld2FyZXMgVGhlIG1pZGRsZXdhcmUgY2hhaW4gdG8gYmUgYXBwbGllZC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSBzdG9yZSBlbmhhbmNlciBhcHBseWluZyB0aGUgbWlkZGxld2FyZS5cbiAqL1xuXG5mdW5jdGlvbiBhcHBseU1pZGRsZXdhcmUoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBtaWRkbGV3YXJlcyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBtaWRkbGV3YXJlc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoY3JlYXRlU3RvcmUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHN0b3JlID0gY3JlYXRlU3RvcmUuYXBwbHkodm9pZCAwLCBhcmd1bWVudHMpO1xuXG4gICAgICB2YXIgX2Rpc3BhdGNoID0gZnVuY3Rpb24gZGlzcGF0Y2goKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE1KSA6ICdEaXNwYXRjaGluZyB3aGlsZSBjb25zdHJ1Y3RpbmcgeW91ciBtaWRkbGV3YXJlIGlzIG5vdCBhbGxvd2VkLiAnICsgJ090aGVyIG1pZGRsZXdhcmUgd291bGQgbm90IGJlIGFwcGxpZWQgdG8gdGhpcyBkaXNwYXRjaC4nKTtcbiAgICAgIH07XG5cbiAgICAgIHZhciBtaWRkbGV3YXJlQVBJID0ge1xuICAgICAgICBnZXRTdGF0ZTogc3RvcmUuZ2V0U3RhdGUsXG4gICAgICAgIGRpc3BhdGNoOiBmdW5jdGlvbiBkaXNwYXRjaCgpIHtcbiAgICAgICAgICByZXR1cm4gX2Rpc3BhdGNoLmFwcGx5KHZvaWQgMCwgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHZhciBjaGFpbiA9IG1pZGRsZXdhcmVzLm1hcChmdW5jdGlvbiAobWlkZGxld2FyZSkge1xuICAgICAgICByZXR1cm4gbWlkZGxld2FyZShtaWRkbGV3YXJlQVBJKTtcbiAgICAgIH0pO1xuICAgICAgX2Rpc3BhdGNoID0gY29tcG9zZS5hcHBseSh2b2lkIDAsIGNoYWluKShzdG9yZS5kaXNwYXRjaCk7XG4gICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdG9yZSksIHt9LCB7XG4gICAgICAgIGRpc3BhdGNoOiBfZGlzcGF0Y2hcbiAgICAgIH0pO1xuICAgIH07XG4gIH07XG59XG5cbmV4cG9ydCB7IEFjdGlvblR5cGVzIGFzIF9fRE9fTk9UX1VTRV9fQWN0aW9uVHlwZXMsIGFwcGx5TWlkZGxld2FyZSwgYmluZEFjdGlvbkNyZWF0b3JzLCBjb21iaW5lUmVkdWNlcnMsIGNvbXBvc2UsIGNyZWF0ZVN0b3JlLCBsZWdhY3lfY3JlYXRlU3RvcmUgfTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGlzQXJyYXlpc2ggPSByZXF1aXJlKCdpcy1hcnJheWlzaCcpO1xuXG52YXIgY29uY2F0ID0gQXJyYXkucHJvdG90eXBlLmNvbmNhdDtcbnZhciBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcblxudmFyIHN3aXp6bGUgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHN3aXp6bGUoYXJncykge1xuXHR2YXIgcmVzdWx0cyA9IFtdO1xuXG5cdGZvciAodmFyIGkgPSAwLCBsZW4gPSBhcmdzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0dmFyIGFyZyA9IGFyZ3NbaV07XG5cblx0XHRpZiAoaXNBcnJheWlzaChhcmcpKSB7XG5cdFx0XHQvLyBodHRwOi8vanNwZXJmLmNvbS9qYXZhc2NyaXB0LWFycmF5LWNvbmNhdC12cy1wdXNoLzk4XG5cdFx0XHRyZXN1bHRzID0gY29uY2F0LmNhbGwocmVzdWx0cywgc2xpY2UuY2FsbChhcmcpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmVzdWx0cy5wdXNoKGFyZyk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHJlc3VsdHM7XG59O1xuXG5zd2l6emxlLndyYXAgPSBmdW5jdGlvbiAoZm4pIHtcblx0cmV0dXJuIGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gZm4oc3dpenpsZShhcmd1bWVudHMpKTtcblx0fTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzQXJyYXlpc2gob2JqKSB7XG5cdGlmICghb2JqIHx8IHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0cmV0dXJuIG9iaiBpbnN0YW5jZW9mIEFycmF5IHx8IEFycmF5LmlzQXJyYXkob2JqKSB8fFxuXHRcdChvYmoubGVuZ3RoID49IDAgJiYgKG9iai5zcGxpY2UgaW5zdGFuY2VvZiBGdW5jdGlvbiB8fFxuXHRcdFx0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCAob2JqLmxlbmd0aCAtIDEpKSAmJiBvYmouY29uc3RydWN0b3IubmFtZSAhPT0gJ1N0cmluZycpKSk7XG59O1xuIiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL1Rvb2xiYXIuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9Ub29sYmFyLmNzc1wiO1xuICAgICAgIGV4cG9ydCBkZWZhdWx0IGNvbnRlbnQgJiYgY29udGVudC5sb2NhbHMgPyBjb250ZW50LmxvY2FscyA6IHVuZGVmaW5lZDtcbiIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9DYWxsYmFja0dyYXBoQ29udGFpbmVyLmNzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xuXG4gICAgICBvcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xuICAgIFxub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vQ2FsbGJhY2tHcmFwaENvbnRhaW5lci5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vRnJvbnRFbmRFcnJvci5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcblxuICAgICAgb3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbiAgICBcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL0Zyb250RW5kRXJyb3IuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL1BlcmN5LmNzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xuXG4gICAgICBvcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xuICAgIFxub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vUGVyY3kuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL0RlYnVnTWVudS5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcblxuICAgICAgb3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbiAgICBcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL0RlYnVnTWVudS5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vUGxvdGx5Q2xvdWQuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9QbG90bHlDbG91ZC5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vVmVyc2lvbkluZm8uY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9WZXJzaW9uSW5mby5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIHN0eWxlc0luRE9NID0gW107XG5mdW5jdGlvbiBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKSB7XG4gIHZhciByZXN1bHQgPSAtMTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHlsZXNJbkRPTS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChzdHlsZXNJbkRPTVtpXS5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSB7XG4gICAgICByZXN1bHQgPSBpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBtb2R1bGVzVG9Eb20obGlzdCwgb3B0aW9ucykge1xuICB2YXIgaWRDb3VudE1hcCA9IHt9O1xuICB2YXIgaWRlbnRpZmllcnMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGl0ZW0gPSBsaXN0W2ldO1xuICAgIHZhciBpZCA9IG9wdGlvbnMuYmFzZSA/IGl0ZW1bMF0gKyBvcHRpb25zLmJhc2UgOiBpdGVtWzBdO1xuICAgIHZhciBjb3VudCA9IGlkQ291bnRNYXBbaWRdIHx8IDA7XG4gICAgdmFyIGlkZW50aWZpZXIgPSBcIlwiLmNvbmNhdChpZCwgXCIgXCIpLmNvbmNhdChjb3VudCk7XG4gICAgaWRDb3VudE1hcFtpZF0gPSBjb3VudCArIDE7XG4gICAgdmFyIGluZGV4QnlJZGVudGlmaWVyID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoaWRlbnRpZmllcik7XG4gICAgdmFyIG9iaiA9IHtcbiAgICAgIGNzczogaXRlbVsxXSxcbiAgICAgIG1lZGlhOiBpdGVtWzJdLFxuICAgICAgc291cmNlTWFwOiBpdGVtWzNdLFxuICAgICAgc3VwcG9ydHM6IGl0ZW1bNF0sXG4gICAgICBsYXllcjogaXRlbVs1XVxuICAgIH07XG4gICAgaWYgKGluZGV4QnlJZGVudGlmaWVyICE9PSAtMSkge1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhCeUlkZW50aWZpZXJdLnJlZmVyZW5jZXMrKztcbiAgICAgIHN0eWxlc0luRE9NW2luZGV4QnlJZGVudGlmaWVyXS51cGRhdGVyKG9iaik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB1cGRhdGVyID0gYWRkRWxlbWVudFN0eWxlKG9iaiwgb3B0aW9ucyk7XG4gICAgICBvcHRpb25zLmJ5SW5kZXggPSBpO1xuICAgICAgc3R5bGVzSW5ET00uc3BsaWNlKGksIDAsIHtcbiAgICAgICAgaWRlbnRpZmllcjogaWRlbnRpZmllcixcbiAgICAgICAgdXBkYXRlcjogdXBkYXRlcixcbiAgICAgICAgcmVmZXJlbmNlczogMVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlkZW50aWZpZXJzLnB1c2goaWRlbnRpZmllcik7XG4gIH1cbiAgcmV0dXJuIGlkZW50aWZpZXJzO1xufVxuZnVuY3Rpb24gYWRkRWxlbWVudFN0eWxlKG9iaiwgb3B0aW9ucykge1xuICB2YXIgYXBpID0gb3B0aW9ucy5kb21BUEkob3B0aW9ucyk7XG4gIGFwaS51cGRhdGUob2JqKTtcbiAgdmFyIHVwZGF0ZXIgPSBmdW5jdGlvbiB1cGRhdGVyKG5ld09iaikge1xuICAgIGlmIChuZXdPYmopIHtcbiAgICAgIGlmIChuZXdPYmouY3NzID09PSBvYmouY3NzICYmIG5ld09iai5tZWRpYSA9PT0gb2JqLm1lZGlhICYmIG5ld09iai5zb3VyY2VNYXAgPT09IG9iai5zb3VyY2VNYXAgJiYgbmV3T2JqLnN1cHBvcnRzID09PSBvYmouc3VwcG9ydHMgJiYgbmV3T2JqLmxheWVyID09PSBvYmoubGF5ZXIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYXBpLnVwZGF0ZShvYmogPSBuZXdPYmopO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcGkucmVtb3ZlKCk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gdXBkYXRlcjtcbn1cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGxpc3QsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIGxpc3QgPSBsaXN0IHx8IFtdO1xuICB2YXIgbGFzdElkZW50aWZpZXJzID0gbW9kdWxlc1RvRG9tKGxpc3QsIG9wdGlvbnMpO1xuICByZXR1cm4gZnVuY3Rpb24gdXBkYXRlKG5ld0xpc3QpIHtcbiAgICBuZXdMaXN0ID0gbmV3TGlzdCB8fCBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxhc3RJZGVudGlmaWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGlkZW50aWZpZXIgPSBsYXN0SWRlbnRpZmllcnNbaV07XG4gICAgICB2YXIgaW5kZXggPSBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKTtcbiAgICAgIHN0eWxlc0luRE9NW2luZGV4XS5yZWZlcmVuY2VzLS07XG4gICAgfVxuICAgIHZhciBuZXdMYXN0SWRlbnRpZmllcnMgPSBtb2R1bGVzVG9Eb20obmV3TGlzdCwgb3B0aW9ucyk7XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGxhc3RJZGVudGlmaWVycy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBfaWRlbnRpZmllciA9IGxhc3RJZGVudGlmaWVyc1tfaV07XG4gICAgICB2YXIgX2luZGV4ID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoX2lkZW50aWZpZXIpO1xuICAgICAgaWYgKHN0eWxlc0luRE9NW19pbmRleF0ucmVmZXJlbmNlcyA9PT0gMCkge1xuICAgICAgICBzdHlsZXNJbkRPTVtfaW5kZXhdLnVwZGF0ZXIoKTtcbiAgICAgICAgc3R5bGVzSW5ET00uc3BsaWNlKF9pbmRleCwgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIGxhc3RJZGVudGlmaWVycyA9IG5ld0xhc3RJZGVudGlmaWVycztcbiAgfTtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBtZW1vID0ge307XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gZ2V0VGFyZ2V0KHRhcmdldCkge1xuICBpZiAodHlwZW9mIG1lbW9bdGFyZ2V0XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHZhciBzdHlsZVRhcmdldCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGFyZ2V0KTtcblxuICAgIC8vIFNwZWNpYWwgY2FzZSB0byByZXR1cm4gaGVhZCBvZiBpZnJhbWUgaW5zdGVhZCBvZiBpZnJhbWUgaXRzZWxmXG4gICAgaWYgKHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCAmJiBzdHlsZVRhcmdldCBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gVGhpcyB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiBpZiBhY2Nlc3MgdG8gaWZyYW1lIGlzIGJsb2NrZWRcbiAgICAgICAgLy8gZHVlIHRvIGNyb3NzLW9yaWdpbiByZXN0cmljdGlvbnNcbiAgICAgICAgc3R5bGVUYXJnZXQgPSBzdHlsZVRhcmdldC5jb250ZW50RG9jdW1lbnQuaGVhZDtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHRcbiAgICAgICAgc3R5bGVUYXJnZXQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBtZW1vW3RhcmdldF0gPSBzdHlsZVRhcmdldDtcbiAgfVxuICByZXR1cm4gbWVtb1t0YXJnZXRdO1xufVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGluc2VydEJ5U2VsZWN0b3IoaW5zZXJ0LCBzdHlsZSkge1xuICB2YXIgdGFyZ2V0ID0gZ2V0VGFyZ2V0KGluc2VydCk7XG4gIGlmICghdGFyZ2V0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGRuJ3QgZmluZCBhIHN0eWxlIHRhcmdldC4gVGhpcyBwcm9iYWJseSBtZWFucyB0aGF0IHRoZSB2YWx1ZSBmb3IgdGhlICdpbnNlcnQnIHBhcmFtZXRlciBpcyBpbnZhbGlkLlwiKTtcbiAgfVxuICB0YXJnZXQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBpbnNlcnRCeVNlbGVjdG9yOyIsIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGluc2VydFN0eWxlRWxlbWVudChvcHRpb25zKSB7XG4gIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuICBvcHRpb25zLnNldEF0dHJpYnV0ZXMoZWxlbWVudCwgb3B0aW9ucy5hdHRyaWJ1dGVzKTtcbiAgb3B0aW9ucy5pbnNlcnQoZWxlbWVudCwgb3B0aW9ucy5vcHRpb25zKTtcbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGluc2VydFN0eWxlRWxlbWVudDsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBzZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMoc3R5bGVFbGVtZW50KSB7XG4gIHZhciBub25jZSA9IHR5cGVvZiBfX3dlYnBhY2tfbm9uY2VfXyAhPT0gXCJ1bmRlZmluZWRcIiA/IF9fd2VicGFja19ub25jZV9fIDogbnVsbDtcbiAgaWYgKG5vbmNlKSB7XG4gICAgc3R5bGVFbGVtZW50LnNldEF0dHJpYnV0ZShcIm5vbmNlXCIsIG5vbmNlKTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBzZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXM7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gYXBwbHkoc3R5bGVFbGVtZW50LCBvcHRpb25zLCBvYmopIHtcbiAgdmFyIGNzcyA9IFwiXCI7XG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChvYmouc3VwcG9ydHMsIFwiKSB7XCIpO1xuICB9XG4gIGlmIChvYmoubWVkaWEpIHtcbiAgICBjc3MgKz0gXCJAbWVkaWEgXCIuY29uY2F0KG9iai5tZWRpYSwgXCIge1wiKTtcbiAgfVxuICB2YXIgbmVlZExheWVyID0gdHlwZW9mIG9iai5sYXllciAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgaWYgKG5lZWRMYXllcikge1xuICAgIGNzcyArPSBcIkBsYXllclwiLmNvbmNhdChvYmoubGF5ZXIubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChvYmoubGF5ZXIpIDogXCJcIiwgXCIge1wiKTtcbiAgfVxuICBjc3MgKz0gb2JqLmNzcztcbiAgaWYgKG5lZWRMYXllcikge1xuICAgIGNzcyArPSBcIn1cIjtcbiAgfVxuICBpZiAob2JqLm1lZGlhKSB7XG4gICAgY3NzICs9IFwifVwiO1xuICB9XG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJ9XCI7XG4gIH1cbiAgdmFyIHNvdXJjZU1hcCA9IG9iai5zb3VyY2VNYXA7XG4gIGlmIChzb3VyY2VNYXAgJiYgdHlwZW9mIGJ0b2EgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBjc3MgKz0gXCJcXG4vKiMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LFwiLmNvbmNhdChidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShzb3VyY2VNYXApKSkpLCBcIiAqL1wiKTtcbiAgfVxuXG4gIC8vIEZvciBvbGQgSUVcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICAqL1xuICBvcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtKGNzcywgc3R5bGVFbGVtZW50LCBvcHRpb25zLm9wdGlvbnMpO1xufVxuZnVuY3Rpb24gcmVtb3ZlU3R5bGVFbGVtZW50KHN0eWxlRWxlbWVudCkge1xuICAvLyBpc3RhbmJ1bCBpZ25vcmUgaWZcbiAgaWYgKHN0eWxlRWxlbWVudC5wYXJlbnROb2RlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHN0eWxlRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudCk7XG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gZG9tQVBJKG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJldHVybiB7XG4gICAgICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZSgpIHt9LFxuICAgICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7fVxuICAgIH07XG4gIH1cbiAgdmFyIHN0eWxlRWxlbWVudCA9IG9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMpO1xuICByZXR1cm4ge1xuICAgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKG9iaikge1xuICAgICAgYXBwbHkoc3R5bGVFbGVtZW50LCBvcHRpb25zLCBvYmopO1xuICAgIH0sXG4gICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7XG4gICAgICByZW1vdmVTdHlsZUVsZW1lbnQoc3R5bGVFbGVtZW50KTtcbiAgICB9XG4gIH07XG59XG5tb2R1bGUuZXhwb3J0cyA9IGRvbUFQSTsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBzdHlsZVRhZ1RyYW5zZm9ybShjc3MsIHN0eWxlRWxlbWVudCkge1xuICBpZiAoc3R5bGVFbGVtZW50LnN0eWxlU2hlZXQpIHtcbiAgICBzdHlsZUVsZW1lbnQuc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzO1xuICB9IGVsc2Uge1xuICAgIHdoaWxlIChzdHlsZUVsZW1lbnQuZmlyc3RDaGlsZCkge1xuICAgICAgc3R5bGVFbGVtZW50LnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudC5maXJzdENoaWxkKTtcbiAgICB9XG4gICAgc3R5bGVFbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcykpO1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHN0eWxlVGFnVHJhbnNmb3JtOyIsIi8qKlxuICogQGxpY2Vuc2UgUmVhY3RcbiAqIHVzZS1zeW5jLWV4dGVybmFsLXN0b3JlLXNoaW0uZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIE1ldGEgUGxhdGZvcm1zLCBJbmMuIGFuZCBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cblwidXNlIHN0cmljdFwiO1xuXCJwcm9kdWN0aW9uXCIgIT09IHByb2Nlc3MuZW52Lk5PREVfRU5WICYmXG4gIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gaXMoeCwgeSkge1xuICAgICAgcmV0dXJuICh4ID09PSB5ICYmICgwICE9PSB4IHx8IDEgLyB4ID09PSAxIC8geSkpIHx8ICh4ICE9PSB4ICYmIHkgIT09IHkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiB1c2VTeW5jRXh0ZXJuYWxTdG9yZSQyKHN1YnNjcmliZSwgZ2V0U25hcHNob3QpIHtcbiAgICAgIGRpZFdhcm5PbGQxOEFscGhhIHx8XG4gICAgICAgIHZvaWQgMCA9PT0gUmVhY3Quc3RhcnRUcmFuc2l0aW9uIHx8XG4gICAgICAgICgoZGlkV2Fybk9sZDE4QWxwaGEgPSAhMCksXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJZb3UgYXJlIHVzaW5nIGFuIG91dGRhdGVkLCBwcmUtcmVsZWFzZSBhbHBoYSBvZiBSZWFjdCAxOCB0aGF0IGRvZXMgbm90IHN1cHBvcnQgdXNlU3luY0V4dGVybmFsU3RvcmUuIFRoZSB1c2Utc3luYy1leHRlcm5hbC1zdG9yZSBzaGltIHdpbGwgbm90IHdvcmsgY29ycmVjdGx5LiBVcGdyYWRlIHRvIGEgbmV3ZXIgcHJlLXJlbGVhc2UuXCJcbiAgICAgICAgKSk7XG4gICAgICB2YXIgdmFsdWUgPSBnZXRTbmFwc2hvdCgpO1xuICAgICAgaWYgKCFkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdCkge1xuICAgICAgICB2YXIgY2FjaGVkVmFsdWUgPSBnZXRTbmFwc2hvdCgpO1xuICAgICAgICBvYmplY3RJcyh2YWx1ZSwgY2FjaGVkVmFsdWUpIHx8XG4gICAgICAgICAgKGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBcIlRoZSByZXN1bHQgb2YgZ2V0U25hcHNob3Qgc2hvdWxkIGJlIGNhY2hlZCB0byBhdm9pZCBhbiBpbmZpbml0ZSBsb29wXCJcbiAgICAgICAgICApLFxuICAgICAgICAgIChkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdCA9ICEwKSk7XG4gICAgICB9XG4gICAgICBjYWNoZWRWYWx1ZSA9IHVzZVN0YXRlKHtcbiAgICAgICAgaW5zdDogeyB2YWx1ZTogdmFsdWUsIGdldFNuYXBzaG90OiBnZXRTbmFwc2hvdCB9XG4gICAgICB9KTtcbiAgICAgIHZhciBpbnN0ID0gY2FjaGVkVmFsdWVbMF0uaW5zdCxcbiAgICAgICAgZm9yY2VVcGRhdGUgPSBjYWNoZWRWYWx1ZVsxXTtcbiAgICAgIHVzZUxheW91dEVmZmVjdChcbiAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGluc3QudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICBpbnN0LmdldFNuYXBzaG90ID0gZ2V0U25hcHNob3Q7XG4gICAgICAgICAgY2hlY2tJZlNuYXBzaG90Q2hhbmdlZChpbnN0KSAmJiBmb3JjZVVwZGF0ZSh7IGluc3Q6IGluc3QgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIFtzdWJzY3JpYmUsIHZhbHVlLCBnZXRTbmFwc2hvdF1cbiAgICAgICk7XG4gICAgICB1c2VFZmZlY3QoXG4gICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjaGVja0lmU25hcHNob3RDaGFuZ2VkKGluc3QpICYmIGZvcmNlVXBkYXRlKHsgaW5zdDogaW5zdCB9KTtcbiAgICAgICAgICByZXR1cm4gc3Vic2NyaWJlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNoZWNrSWZTbmFwc2hvdENoYW5nZWQoaW5zdCkgJiYgZm9yY2VVcGRhdGUoeyBpbnN0OiBpbnN0IH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBbc3Vic2NyaWJlXVxuICAgICAgKTtcbiAgICAgIHVzZURlYnVnVmFsdWUodmFsdWUpO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjaGVja0lmU25hcHNob3RDaGFuZ2VkKGluc3QpIHtcbiAgICAgIHZhciBsYXRlc3RHZXRTbmFwc2hvdCA9IGluc3QuZ2V0U25hcHNob3Q7XG4gICAgICBpbnN0ID0gaW5zdC52YWx1ZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciBuZXh0VmFsdWUgPSBsYXRlc3RHZXRTbmFwc2hvdCgpO1xuICAgICAgICByZXR1cm4gIW9iamVjdElzKGluc3QsIG5leHRWYWx1ZSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm4gITA7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVzZVN5bmNFeHRlcm5hbFN0b3JlJDEoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCkge1xuICAgICAgcmV0dXJuIGdldFNuYXBzaG90KCk7XG4gICAgfVxuICAgIFwidW5kZWZpbmVkXCIgIT09IHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gJiZcbiAgICAgIFwiZnVuY3Rpb25cIiA9PT1cbiAgICAgICAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQgJiZcbiAgICAgIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQoRXJyb3IoKSk7XG4gICAgdmFyIFJlYWN0ID0gcmVxdWlyZShcInJlYWN0XCIpLFxuICAgICAgb2JqZWN0SXMgPSBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBPYmplY3QuaXMgPyBPYmplY3QuaXMgOiBpcyxcbiAgICAgIHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUsXG4gICAgICB1c2VFZmZlY3QgPSBSZWFjdC51c2VFZmZlY3QsXG4gICAgICB1c2VMYXlvdXRFZmZlY3QgPSBSZWFjdC51c2VMYXlvdXRFZmZlY3QsXG4gICAgICB1c2VEZWJ1Z1ZhbHVlID0gUmVhY3QudXNlRGVidWdWYWx1ZSxcbiAgICAgIGRpZFdhcm5PbGQxOEFscGhhID0gITEsXG4gICAgICBkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdCA9ICExLFxuICAgICAgc2hpbSA9XG4gICAgICAgIFwidW5kZWZpbmVkXCIgPT09IHR5cGVvZiB3aW5kb3cgfHxcbiAgICAgICAgXCJ1bmRlZmluZWRcIiA9PT0gdHlwZW9mIHdpbmRvdy5kb2N1bWVudCB8fFxuICAgICAgICBcInVuZGVmaW5lZFwiID09PSB0eXBlb2Ygd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnRcbiAgICAgICAgICA/IHVzZVN5bmNFeHRlcm5hbFN0b3JlJDFcbiAgICAgICAgICA6IHVzZVN5bmNFeHRlcm5hbFN0b3JlJDI7XG4gICAgZXhwb3J0cy51c2VTeW5jRXh0ZXJuYWxTdG9yZSA9XG4gICAgICB2b2lkIDAgIT09IFJlYWN0LnVzZVN5bmNFeHRlcm5hbFN0b3JlID8gUmVhY3QudXNlU3luY0V4dGVybmFsU3RvcmUgOiBzaGltO1xuICAgIFwidW5kZWZpbmVkXCIgIT09IHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gJiZcbiAgICAgIFwiZnVuY3Rpb25cIiA9PT1cbiAgICAgICAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RvcCAmJlxuICAgICAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdG9wKEVycm9yKCkpO1xuICB9KSgpO1xuIiwiLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUtc2hpbS93aXRoLXNlbGVjdG9yLmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5cInVzZSBzdHJpY3RcIjtcblwicHJvZHVjdGlvblwiICE9PSBwcm9jZXNzLmVudi5OT0RFX0VOViAmJlxuICAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIGlzKHgsIHkpIHtcbiAgICAgIHJldHVybiAoeCA9PT0geSAmJiAoMCAhPT0geCB8fCAxIC8geCA9PT0gMSAvIHkpKSB8fCAoeCAhPT0geCAmJiB5ICE9PSB5KTtcbiAgICB9XG4gICAgXCJ1bmRlZmluZWRcIiAhPT0gdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAmJlxuICAgICAgXCJmdW5jdGlvblwiID09PVxuICAgICAgICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdGFydCAmJlxuICAgICAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdGFydChFcnJvcigpKTtcbiAgICB2YXIgUmVhY3QgPSByZXF1aXJlKFwicmVhY3RcIiksXG4gICAgICBzaGltID0gcmVxdWlyZShcInVzZS1zeW5jLWV4dGVybmFsLXN0b3JlL3NoaW1cIiksXG4gICAgICBvYmplY3RJcyA9IFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIE9iamVjdC5pcyA/IE9iamVjdC5pcyA6IGlzLFxuICAgICAgdXNlU3luY0V4dGVybmFsU3RvcmUgPSBzaGltLnVzZVN5bmNFeHRlcm5hbFN0b3JlLFxuICAgICAgdXNlUmVmID0gUmVhY3QudXNlUmVmLFxuICAgICAgdXNlRWZmZWN0ID0gUmVhY3QudXNlRWZmZWN0LFxuICAgICAgdXNlTWVtbyA9IFJlYWN0LnVzZU1lbW8sXG4gICAgICB1c2VEZWJ1Z1ZhbHVlID0gUmVhY3QudXNlRGVidWdWYWx1ZTtcbiAgICBleHBvcnRzLnVzZVN5bmNFeHRlcm5hbFN0b3JlV2l0aFNlbGVjdG9yID0gZnVuY3Rpb24gKFxuICAgICAgc3Vic2NyaWJlLFxuICAgICAgZ2V0U25hcHNob3QsXG4gICAgICBnZXRTZXJ2ZXJTbmFwc2hvdCxcbiAgICAgIHNlbGVjdG9yLFxuICAgICAgaXNFcXVhbFxuICAgICkge1xuICAgICAgdmFyIGluc3RSZWYgPSB1c2VSZWYobnVsbCk7XG4gICAgICBpZiAobnVsbCA9PT0gaW5zdFJlZi5jdXJyZW50KSB7XG4gICAgICAgIHZhciBpbnN0ID0geyBoYXNWYWx1ZTogITEsIHZhbHVlOiBudWxsIH07XG4gICAgICAgIGluc3RSZWYuY3VycmVudCA9IGluc3Q7XG4gICAgICB9IGVsc2UgaW5zdCA9IGluc3RSZWYuY3VycmVudDtcbiAgICAgIGluc3RSZWYgPSB1c2VNZW1vKFxuICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgZnVuY3Rpb24gbWVtb2l6ZWRTZWxlY3RvcihuZXh0U25hcHNob3QpIHtcbiAgICAgICAgICAgIGlmICghaGFzTWVtbykge1xuICAgICAgICAgICAgICBoYXNNZW1vID0gITA7XG4gICAgICAgICAgICAgIG1lbW9pemVkU25hcHNob3QgPSBuZXh0U25hcHNob3Q7XG4gICAgICAgICAgICAgIG5leHRTbmFwc2hvdCA9IHNlbGVjdG9yKG5leHRTbmFwc2hvdCk7XG4gICAgICAgICAgICAgIGlmICh2b2lkIDAgIT09IGlzRXF1YWwgJiYgaW5zdC5oYXNWYWx1ZSkge1xuICAgICAgICAgICAgICAgIHZhciBjdXJyZW50U2VsZWN0aW9uID0gaW5zdC52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAoaXNFcXVhbChjdXJyZW50U2VsZWN0aW9uLCBuZXh0U25hcHNob3QpKVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIChtZW1vaXplZFNlbGVjdGlvbiA9IGN1cnJlbnRTZWxlY3Rpb24pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiAobWVtb2l6ZWRTZWxlY3Rpb24gPSBuZXh0U25hcHNob3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VycmVudFNlbGVjdGlvbiA9IG1lbW9pemVkU2VsZWN0aW9uO1xuICAgICAgICAgICAgaWYgKG9iamVjdElzKG1lbW9pemVkU25hcHNob3QsIG5leHRTbmFwc2hvdCkpXG4gICAgICAgICAgICAgIHJldHVybiBjdXJyZW50U2VsZWN0aW9uO1xuICAgICAgICAgICAgdmFyIG5leHRTZWxlY3Rpb24gPSBzZWxlY3RvcihuZXh0U25hcHNob3QpO1xuICAgICAgICAgICAgaWYgKHZvaWQgMCAhPT0gaXNFcXVhbCAmJiBpc0VxdWFsKGN1cnJlbnRTZWxlY3Rpb24sIG5leHRTZWxlY3Rpb24pKVxuICAgICAgICAgICAgICByZXR1cm4gKG1lbW9pemVkU25hcHNob3QgPSBuZXh0U25hcHNob3QpLCBjdXJyZW50U2VsZWN0aW9uO1xuICAgICAgICAgICAgbWVtb2l6ZWRTbmFwc2hvdCA9IG5leHRTbmFwc2hvdDtcbiAgICAgICAgICAgIHJldHVybiAobWVtb2l6ZWRTZWxlY3Rpb24gPSBuZXh0U2VsZWN0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIGhhc01lbW8gPSAhMSxcbiAgICAgICAgICAgIG1lbW9pemVkU25hcHNob3QsXG4gICAgICAgICAgICBtZW1vaXplZFNlbGVjdGlvbixcbiAgICAgICAgICAgIG1heWJlR2V0U2VydmVyU25hcHNob3QgPVxuICAgICAgICAgICAgICB2b2lkIDAgPT09IGdldFNlcnZlclNuYXBzaG90ID8gbnVsbCA6IGdldFNlcnZlclNuYXBzaG90O1xuICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBtZW1vaXplZFNlbGVjdG9yKGdldFNuYXBzaG90KCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG51bGwgPT09IG1heWJlR2V0U2VydmVyU25hcHNob3RcbiAgICAgICAgICAgICAgPyB2b2lkIDBcbiAgICAgICAgICAgICAgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gbWVtb2l6ZWRTZWxlY3RvcihtYXliZUdldFNlcnZlclNuYXBzaG90KCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICBdO1xuICAgICAgICB9LFxuICAgICAgICBbZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90LCBzZWxlY3RvciwgaXNFcXVhbF1cbiAgICAgICk7XG4gICAgICB2YXIgdmFsdWUgPSB1c2VTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGluc3RSZWZbMF0sIGluc3RSZWZbMV0pO1xuICAgICAgdXNlRWZmZWN0KFxuICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaW5zdC5oYXNWYWx1ZSA9ICEwO1xuICAgICAgICAgIGluc3QudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgW3ZhbHVlXVxuICAgICAgKTtcbiAgICAgIHVzZURlYnVnVmFsdWUodmFsdWUpO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG4gICAgXCJ1bmRlZmluZWRcIiAhPT0gdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAmJlxuICAgICAgXCJmdW5jdGlvblwiID09PVxuICAgICAgICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdG9wICYmXG4gICAgICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0b3AoRXJyb3IoKSk7XG4gIH0pKCk7XG4iLCIndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vY2pzL3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlLXNoaW0ucHJvZHVjdGlvbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9janMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUtc2hpbS5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2Nqcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS1zaGltL3dpdGgtc2VsZWN0b3IucHJvZHVjdGlvbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9janMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUtc2hpbS93aXRoLXNlbGVjdG9yLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHdpbmRvd1tcIlByb3BUeXBlc1wiXTsiLCJtb2R1bGUuZXhwb3J0cyA9IHdpbmRvd1tcIlJlYWN0XCJdOyIsIm1vZHVsZS5leHBvcnRzID0gd2luZG93W1wiUmVhY3RET01cIl07IiwiZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkociwgYSkge1xuICAobnVsbCA9PSBhIHx8IGEgPiByLmxlbmd0aCkgJiYgKGEgPSByLmxlbmd0aCk7XG4gIGZvciAodmFyIGUgPSAwLCBuID0gQXJyYXkoYSk7IGUgPCBhOyBlKyspIG5bZV0gPSByW2VdO1xuICByZXR1cm4gbjtcbn1cbmV4cG9ydCB7IF9hcnJheUxpa2VUb0FycmF5IGFzIGRlZmF1bHQgfTsiLCJmdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMocikge1xuICBpZiAoQXJyYXkuaXNBcnJheShyKSkgcmV0dXJuIHI7XG59XG5leHBvcnQgeyBfYXJyYXlXaXRoSG9sZXMgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBhcnJheUxpa2VUb0FycmF5IGZyb20gXCIuL2FycmF5TGlrZVRvQXJyYXkuanNcIjtcbmZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhyKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHIpKSByZXR1cm4gYXJyYXlMaWtlVG9BcnJheShyKTtcbn1cbmV4cG9ydCB7IF9hcnJheVdpdGhvdXRIb2xlcyBhcyBkZWZhdWx0IH07IiwiZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChlKSB7XG4gIGlmICh2b2lkIDAgPT09IGUpIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtcbiAgcmV0dXJuIGU7XG59XG5leHBvcnQgeyBfYXNzZXJ0VGhpc0luaXRpYWxpemVkIGFzIGRlZmF1bHQgfTsiLCJmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soYSwgbikge1xuICBpZiAoIShhIGluc3RhbmNlb2YgbikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG59XG5leHBvcnQgeyBfY2xhc3NDYWxsQ2hlY2sgYXMgZGVmYXVsdCB9OyIsImltcG9ydCB0b1Byb3BlcnR5S2V5IGZyb20gXCIuL3RvUHJvcGVydHlLZXkuanNcIjtcbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKGUsIHIpIHtcbiAgZm9yICh2YXIgdCA9IDA7IHQgPCByLmxlbmd0aDsgdCsrKSB7XG4gICAgdmFyIG8gPSByW3RdO1xuICAgIG8uZW51bWVyYWJsZSA9IG8uZW51bWVyYWJsZSB8fCAhMSwgby5jb25maWd1cmFibGUgPSAhMCwgXCJ2YWx1ZVwiIGluIG8gJiYgKG8ud3JpdGFibGUgPSAhMCksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCB0b1Byb3BlcnR5S2V5KG8ua2V5KSwgbyk7XG4gIH1cbn1cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhlLCByLCB0KSB7XG4gIHJldHVybiByICYmIF9kZWZpbmVQcm9wZXJ0aWVzKGUucHJvdG90eXBlLCByKSwgdCAmJiBfZGVmaW5lUHJvcGVydGllcyhlLCB0KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwicHJvdG90eXBlXCIsIHtcbiAgICB3cml0YWJsZTogITFcbiAgfSksIGU7XG59XG5leHBvcnQgeyBfY3JlYXRlQ2xhc3MgYXMgZGVmYXVsdCB9OyIsImltcG9ydCB0b1Byb3BlcnR5S2V5IGZyb20gXCIuL3RvUHJvcGVydHlLZXkuanNcIjtcbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShlLCByLCB0KSB7XG4gIHJldHVybiAociA9IHRvUHJvcGVydHlLZXkocikpIGluIGUgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgciwge1xuICAgIHZhbHVlOiB0LFxuICAgIGVudW1lcmFibGU6ICEwLFxuICAgIGNvbmZpZ3VyYWJsZTogITAsXG4gICAgd3JpdGFibGU6ICEwXG4gIH0pIDogZVtyXSA9IHQsIGU7XG59XG5leHBvcnQgeyBfZGVmaW5lUHJvcGVydHkgYXMgZGVmYXVsdCB9OyIsImZ1bmN0aW9uIF9leHRlbmRzKCkge1xuICByZXR1cm4gX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAobikge1xuICAgIGZvciAodmFyIGUgPSAxOyBlIDwgYXJndW1lbnRzLmxlbmd0aDsgZSsrKSB7XG4gICAgICB2YXIgdCA9IGFyZ3VtZW50c1tlXTtcbiAgICAgIGZvciAodmFyIHIgaW4gdCkgKHt9KS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIHIpICYmIChuW3JdID0gdFtyXSk7XG4gICAgfVxuICAgIHJldHVybiBuO1xuICB9LCBfZXh0ZW5kcy5hcHBseShudWxsLCBhcmd1bWVudHMpO1xufVxuZXhwb3J0IHsgX2V4dGVuZHMgYXMgZGVmYXVsdCB9OyIsImZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZih0KSB7XG4gIHJldHVybiBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4gdC5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKHQpO1xuICB9LCBfZ2V0UHJvdG90eXBlT2YodCk7XG59XG5leHBvcnQgeyBfZ2V0UHJvdG90eXBlT2YgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBzZXRQcm90b3R5cGVPZiBmcm9tIFwiLi9zZXRQcm90b3R5cGVPZi5qc1wiO1xuZnVuY3Rpb24gX2luaGVyaXRzKHQsIGUpIHtcbiAgaWYgKFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgZSAmJiBudWxsICE9PSBlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7XG4gIHQucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShlICYmIGUucHJvdG90eXBlLCB7XG4gICAgY29uc3RydWN0b3I6IHtcbiAgICAgIHZhbHVlOiB0LFxuICAgICAgd3JpdGFibGU6ICEwLFxuICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgIH1cbiAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcInByb3RvdHlwZVwiLCB7XG4gICAgd3JpdGFibGU6ICExXG4gIH0pLCBlICYmIHNldFByb3RvdHlwZU9mKHQsIGUpO1xufVxuZXhwb3J0IHsgX2luaGVyaXRzIGFzIGRlZmF1bHQgfTsiLCJmdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KHIpIHtcbiAgaWYgKFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIFN5bWJvbCAmJiBudWxsICE9IHJbU3ltYm9sLml0ZXJhdG9yXSB8fCBudWxsICE9IHJbXCJAQGl0ZXJhdG9yXCJdKSByZXR1cm4gQXJyYXkuZnJvbShyKTtcbn1cbmV4cG9ydCB7IF9pdGVyYWJsZVRvQXJyYXkgYXMgZGVmYXVsdCB9OyIsImZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdChyLCBsKSB7XG4gIHZhciB0ID0gbnVsbCA9PSByID8gbnVsbCA6IFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIFN5bWJvbCAmJiByW1N5bWJvbC5pdGVyYXRvcl0gfHwgcltcIkBAaXRlcmF0b3JcIl07XG4gIGlmIChudWxsICE9IHQpIHtcbiAgICB2YXIgZSxcbiAgICAgIG4sXG4gICAgICBpLFxuICAgICAgdSxcbiAgICAgIGEgPSBbXSxcbiAgICAgIGYgPSAhMCxcbiAgICAgIG8gPSAhMTtcbiAgICB0cnkge1xuICAgICAgaWYgKGkgPSAodCA9IHQuY2FsbChyKSkubmV4dCwgMCA9PT0gbCkge1xuICAgICAgICBpZiAoT2JqZWN0KHQpICE9PSB0KSByZXR1cm47XG4gICAgICAgIGYgPSAhMTtcbiAgICAgIH0gZWxzZSBmb3IgKDsgIShmID0gKGUgPSBpLmNhbGwodCkpLmRvbmUpICYmIChhLnB1c2goZS52YWx1ZSksIGEubGVuZ3RoICE9PSBsKTsgZiA9ICEwKTtcbiAgICB9IGNhdGNoIChyKSB7XG4gICAgICBvID0gITAsIG4gPSByO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIWYgJiYgbnVsbCAhPSB0W1wicmV0dXJuXCJdICYmICh1ID0gdFtcInJldHVyblwiXSgpLCBPYmplY3QodSkgIT09IHUpKSByZXR1cm47XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAobykgdGhyb3cgbjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGE7XG4gIH1cbn1cbmV4cG9ydCB7IF9pdGVyYWJsZVRvQXJyYXlMaW1pdCBhcyBkZWZhdWx0IH07IiwiZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTtcbn1cbmV4cG9ydCB7IF9ub25JdGVyYWJsZVJlc3QgYXMgZGVmYXVsdCB9OyIsImZ1bmN0aW9uIF9ub25JdGVyYWJsZVNwcmVhZCgpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG59XG5leHBvcnQgeyBfbm9uSXRlcmFibGVTcHJlYWQgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBkZWZpbmVQcm9wZXJ0eSBmcm9tIFwiLi9kZWZpbmVQcm9wZXJ0eS5qc1wiO1xuZnVuY3Rpb24gb3duS2V5cyhlLCByKSB7XG4gIHZhciB0ID0gT2JqZWN0LmtleXMoZSk7XG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgdmFyIG8gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpO1xuICAgIHIgJiYgKG8gPSBvLmZpbHRlcihmdW5jdGlvbiAocikge1xuICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgcikuZW51bWVyYWJsZTtcbiAgICB9KSksIHQucHVzaC5hcHBseSh0LCBvKTtcbiAgfVxuICByZXR1cm4gdDtcbn1cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQyKGUpIHtcbiAgZm9yICh2YXIgciA9IDE7IHIgPCBhcmd1bWVudHMubGVuZ3RoOyByKyspIHtcbiAgICB2YXIgdCA9IG51bGwgIT0gYXJndW1lbnRzW3JdID8gYXJndW1lbnRzW3JdIDoge307XG4gICAgciAlIDIgPyBvd25LZXlzKE9iamVjdCh0KSwgITApLmZvckVhY2goZnVuY3Rpb24gKHIpIHtcbiAgICAgIGRlZmluZVByb3BlcnR5KGUsIHIsIHRbcl0pO1xuICAgIH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh0KSkgOiBvd25LZXlzKE9iamVjdCh0KSkuZm9yRWFjaChmdW5jdGlvbiAocikge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHIsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCwgcikpO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBlO1xufVxuZXhwb3J0IHsgX29iamVjdFNwcmVhZDIgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBvYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlIGZyb20gXCIuL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UuanNcIjtcbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhlLCB0KSB7XG4gIGlmIChudWxsID09IGUpIHJldHVybiB7fTtcbiAgdmFyIG8sXG4gICAgcixcbiAgICBpID0gb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShlLCB0KTtcbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICB2YXIgbiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7XG4gICAgZm9yIChyID0gMDsgciA8IG4ubGVuZ3RoOyByKyspIG8gPSBuW3JdLCAtMSA9PT0gdC5pbmRleE9mKG8pICYmIHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgbykgJiYgKGlbb10gPSBlW29dKTtcbiAgfVxuICByZXR1cm4gaTtcbn1cbmV4cG9ydCB7IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBhcyBkZWZhdWx0IH07IiwiZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UociwgZSkge1xuICBpZiAobnVsbCA9PSByKSByZXR1cm4ge307XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIG4gaW4gcikgaWYgKHt9Lmhhc093blByb3BlcnR5LmNhbGwociwgbikpIHtcbiAgICBpZiAoLTEgIT09IGUuaW5kZXhPZihuKSkgY29udGludWU7XG4gICAgdFtuXSA9IHJbbl07XG4gIH1cbiAgcmV0dXJuIHQ7XG59XG5leHBvcnQgeyBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZSBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IF90eXBlb2YgZnJvbSBcIi4vdHlwZW9mLmpzXCI7XG5pbXBvcnQgYXNzZXJ0VGhpc0luaXRpYWxpemVkIGZyb20gXCIuL2Fzc2VydFRoaXNJbml0aWFsaXplZC5qc1wiO1xuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odCwgZSkge1xuICBpZiAoZSAmJiAoXCJvYmplY3RcIiA9PSBfdHlwZW9mKGUpIHx8IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgZSkpIHJldHVybiBlO1xuICBpZiAodm9pZCAwICE9PSBlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRGVyaXZlZCBjb25zdHJ1Y3RvcnMgbWF5IG9ubHkgcmV0dXJuIG9iamVjdCBvciB1bmRlZmluZWRcIik7XG4gIHJldHVybiBhc3NlcnRUaGlzSW5pdGlhbGl6ZWQodCk7XG59XG5leHBvcnQgeyBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiBhcyBkZWZhdWx0IH07IiwiZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKHQsIGUpIHtcbiAgcmV0dXJuIF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZi5iaW5kKCkgOiBmdW5jdGlvbiAodCwgZSkge1xuICAgIHJldHVybiB0Ll9fcHJvdG9fXyA9IGUsIHQ7XG4gIH0sIF9zZXRQcm90b3R5cGVPZih0LCBlKTtcbn1cbmV4cG9ydCB7IF9zZXRQcm90b3R5cGVPZiBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IGFycmF5V2l0aEhvbGVzIGZyb20gXCIuL2FycmF5V2l0aEhvbGVzLmpzXCI7XG5pbXBvcnQgaXRlcmFibGVUb0FycmF5TGltaXQgZnJvbSBcIi4vaXRlcmFibGVUb0FycmF5TGltaXQuanNcIjtcbmltcG9ydCB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSBmcm9tIFwiLi91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheS5qc1wiO1xuaW1wb3J0IG5vbkl0ZXJhYmxlUmVzdCBmcm9tIFwiLi9ub25JdGVyYWJsZVJlc3QuanNcIjtcbmZ1bmN0aW9uIF9zbGljZWRUb0FycmF5KHIsIGUpIHtcbiAgcmV0dXJuIGFycmF5V2l0aEhvbGVzKHIpIHx8IGl0ZXJhYmxlVG9BcnJheUxpbWl0KHIsIGUpIHx8IHVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KHIsIGUpIHx8IG5vbkl0ZXJhYmxlUmVzdCgpO1xufVxuZXhwb3J0IHsgX3NsaWNlZFRvQXJyYXkgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBhcnJheVdpdGhvdXRIb2xlcyBmcm9tIFwiLi9hcnJheVdpdGhvdXRIb2xlcy5qc1wiO1xuaW1wb3J0IGl0ZXJhYmxlVG9BcnJheSBmcm9tIFwiLi9pdGVyYWJsZVRvQXJyYXkuanNcIjtcbmltcG9ydCB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSBmcm9tIFwiLi91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheS5qc1wiO1xuaW1wb3J0IG5vbkl0ZXJhYmxlU3ByZWFkIGZyb20gXCIuL25vbkl0ZXJhYmxlU3ByZWFkLmpzXCI7XG5mdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkocikge1xuICByZXR1cm4gYXJyYXlXaXRob3V0SG9sZXMocikgfHwgaXRlcmFibGVUb0FycmF5KHIpIHx8IHVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KHIpIHx8IG5vbkl0ZXJhYmxlU3ByZWFkKCk7XG59XG5leHBvcnQgeyBfdG9Db25zdW1hYmxlQXJyYXkgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBfdHlwZW9mIGZyb20gXCIuL3R5cGVvZi5qc1wiO1xuZnVuY3Rpb24gdG9QcmltaXRpdmUodCwgcikge1xuICBpZiAoXCJvYmplY3RcIiAhPSBfdHlwZW9mKHQpIHx8ICF0KSByZXR1cm4gdDtcbiAgdmFyIGUgPSB0W1N5bWJvbC50b1ByaW1pdGl2ZV07XG4gIGlmICh2b2lkIDAgIT09IGUpIHtcbiAgICB2YXIgaSA9IGUuY2FsbCh0LCByIHx8IFwiZGVmYXVsdFwiKTtcbiAgICBpZiAoXCJvYmplY3RcIiAhPSBfdHlwZW9mKGkpKSByZXR1cm4gaTtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS5cIik7XG4gIH1cbiAgcmV0dXJuIChcInN0cmluZ1wiID09PSByID8gU3RyaW5nIDogTnVtYmVyKSh0KTtcbn1cbmV4cG9ydCB7IHRvUHJpbWl0aXZlIGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiLi90eXBlb2YuanNcIjtcbmltcG9ydCB0b1ByaW1pdGl2ZSBmcm9tIFwiLi90b1ByaW1pdGl2ZS5qc1wiO1xuZnVuY3Rpb24gdG9Qcm9wZXJ0eUtleSh0KSB7XG4gIHZhciBpID0gdG9QcmltaXRpdmUodCwgXCJzdHJpbmdcIik7XG4gIHJldHVybiBcInN5bWJvbFwiID09IF90eXBlb2YoaSkgPyBpIDogaSArIFwiXCI7XG59XG5leHBvcnQgeyB0b1Byb3BlcnR5S2V5IGFzIGRlZmF1bHQgfTsiLCJmdW5jdGlvbiBfdHlwZW9mKG8pIHtcbiAgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiO1xuXG4gIHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG8pIHtcbiAgICByZXR1cm4gdHlwZW9mIG87XG4gIH0gOiBmdW5jdGlvbiAobykge1xuICAgIHJldHVybiBvICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG8uY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvO1xuICB9LCBfdHlwZW9mKG8pO1xufVxuZXhwb3J0IHsgX3R5cGVvZiBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IGFycmF5TGlrZVRvQXJyYXkgZnJvbSBcIi4vYXJyYXlMaWtlVG9BcnJheS5qc1wiO1xuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KHIsIGEpIHtcbiAgaWYgKHIpIHtcbiAgICBpZiAoXCJzdHJpbmdcIiA9PSB0eXBlb2YgcikgcmV0dXJuIGFycmF5TGlrZVRvQXJyYXkociwgYSk7XG4gICAgdmFyIHQgPSB7fS50b1N0cmluZy5jYWxsKHIpLnNsaWNlKDgsIC0xKTtcbiAgICByZXR1cm4gXCJPYmplY3RcIiA9PT0gdCAmJiByLmNvbnN0cnVjdG9yICYmICh0ID0gci5jb25zdHJ1Y3Rvci5uYW1lKSwgXCJNYXBcIiA9PT0gdCB8fCBcIlNldFwiID09PSB0ID8gQXJyYXkuZnJvbShyKSA6IFwiQXJndW1lbnRzXCIgPT09IHQgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QodCkgPyBhcnJheUxpa2VUb0FycmF5KHIsIGEpIDogdm9pZCAwO1xuICB9XG59XG5leHBvcnQgeyBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkgYXMgZGVmYXVsdCB9OyIsIi8qKlxuICogUmVnRXhwIHRvIG1hdGNoIGNvb2tpZS1uYW1lIGluIFJGQyA2MjY1IHNlYyA0LjEuMVxuICogVGhpcyByZWZlcnMgb3V0IHRvIHRoZSBvYnNvbGV0ZWQgZGVmaW5pdGlvbiBvZiB0b2tlbiBpbiBSRkMgMjYxNiBzZWMgMi4yXG4gKiB3aGljaCBoYXMgYmVlbiByZXBsYWNlZCBieSB0aGUgdG9rZW4gZGVmaW5pdGlvbiBpbiBSRkMgNzIzMCBhcHBlbmRpeCBCLlxuICpcbiAqIGNvb2tpZS1uYW1lICAgICAgID0gdG9rZW5cbiAqIHRva2VuICAgICAgICAgICAgID0gMSp0Y2hhclxuICogdGNoYXIgICAgICAgICAgICAgPSBcIiFcIiAvIFwiI1wiIC8gXCIkXCIgLyBcIiVcIiAvIFwiJlwiIC8gXCInXCIgL1xuICogICAgICAgICAgICAgICAgICAgICBcIipcIiAvIFwiK1wiIC8gXCItXCIgLyBcIi5cIiAvIFwiXlwiIC8gXCJfXCIgL1xuICogICAgICAgICAgICAgICAgICAgICBcImBcIiAvIFwifFwiIC8gXCJ+XCIgLyBESUdJVCAvIEFMUEhBXG4gKlxuICogTm90ZTogQWxsb3dpbmcgbW9yZSBjaGFyYWN0ZXJzIC0gaHR0cHM6Ly9naXRodWIuY29tL2pzaHR0cC9jb29raWUvaXNzdWVzLzE5MVxuICogQWxsb3cgc2FtZSByYW5nZSBhcyBjb29raWUgdmFsdWUsIGV4Y2VwdCBgPWAsIHdoaWNoIGRlbGltaXRzIGVuZCBvZiBuYW1lLlxuICovXG5jb25zdCBjb29raWVOYW1lUmVnRXhwID0gL15bXFx1MDAyMS1cXHUwMDNBXFx1MDAzQ1xcdTAwM0UtXFx1MDA3RV0rJC87XG5cbi8qKlxuICogUmVnRXhwIHRvIG1hdGNoIGNvb2tpZS12YWx1ZSBpbiBSRkMgNjI2NSBzZWMgNC4xLjFcbiAqXG4gKiBjb29raWUtdmFsdWUgICAgICA9ICpjb29raWUtb2N0ZXQgLyAoIERRVU9URSAqY29va2llLW9jdGV0IERRVU9URSApXG4gKiBjb29raWUtb2N0ZXQgICAgICA9ICV4MjEgLyAleDIzLTJCIC8gJXgyRC0zQSAvICV4M0MtNUIgLyAleDVELTdFXG4gKiAgICAgICAgICAgICAgICAgICAgIDsgVVMtQVNDSUkgY2hhcmFjdGVycyBleGNsdWRpbmcgQ1RMcyxcbiAqICAgICAgICAgICAgICAgICAgICAgOyB3aGl0ZXNwYWNlIERRVU9URSwgY29tbWEsIHNlbWljb2xvbixcbiAqICAgICAgICAgICAgICAgICAgICAgOyBhbmQgYmFja3NsYXNoXG4gKlxuICogQWxsb3dpbmcgbW9yZSBjaGFyYWN0ZXJzOiBodHRwczovL2dpdGh1Yi5jb20vanNodHRwL2Nvb2tpZS9pc3N1ZXMvMTkxXG4gKiBDb21tYSwgYmFja3NsYXNoLCBhbmQgRFFVT1RFIGFyZSBub3QgcGFydCBvZiB0aGUgcGFyc2luZyBhbGdvcml0aG0uXG4gKi9cbmNvbnN0IGNvb2tpZVZhbHVlUmVnRXhwID0gL15bXFx1MDAyMS1cXHUwMDNBXFx1MDAzQy1cXHUwMDdFXSokLztcblxuLyoqXG4gKiBSZWdFeHAgdG8gbWF0Y2ggZG9tYWluLXZhbHVlIGluIFJGQyA2MjY1IHNlYyA0LjEuMVxuICpcbiAqIGRvbWFpbi12YWx1ZSAgICAgID0gPHN1YmRvbWFpbj5cbiAqICAgICAgICAgICAgICAgICAgICAgOyBkZWZpbmVkIGluIFtSRkMxMDM0XSwgU2VjdGlvbiAzLjUsIGFzXG4gKiAgICAgICAgICAgICAgICAgICAgIDsgZW5oYW5jZWQgYnkgW1JGQzExMjNdLCBTZWN0aW9uIDIuMVxuICogPHN1YmRvbWFpbj4gICAgICAgPSA8bGFiZWw+IHwgPHN1YmRvbWFpbj4gXCIuXCIgPGxhYmVsPlxuICogPGxhYmVsPiAgICAgICAgICAgPSA8bGV0LWRpZz4gWyBbIDxsZGgtc3RyPiBdIDxsZXQtZGlnPiBdXG4gKiAgICAgICAgICAgICAgICAgICAgIExhYmVscyBtdXN0IGJlIDYzIGNoYXJhY3RlcnMgb3IgbGVzcy5cbiAqICAgICAgICAgICAgICAgICAgICAgJ2xldC1kaWcnIG5vdCAnbGV0dGVyJyBpbiB0aGUgZmlyc3QgY2hhciwgcGVyIFJGQzExMjNcbiAqIDxsZGgtc3RyPiAgICAgICAgID0gPGxldC1kaWctaHlwPiB8IDxsZXQtZGlnLWh5cD4gPGxkaC1zdHI+XG4gKiA8bGV0LWRpZy1oeXA+ICAgICA9IDxsZXQtZGlnPiB8IFwiLVwiXG4gKiA8bGV0LWRpZz4gICAgICAgICA9IDxsZXR0ZXI+IHwgPGRpZ2l0PlxuICogPGxldHRlcj4gICAgICAgICAgPSBhbnkgb25lIG9mIHRoZSA1MiBhbHBoYWJldGljIGNoYXJhY3RlcnMgQSB0aHJvdWdoIFogaW5cbiAqICAgICAgICAgICAgICAgICAgICAgdXBwZXIgY2FzZSBhbmQgYSB0aHJvdWdoIHogaW4gbG93ZXIgY2FzZVxuICogPGRpZ2l0PiAgICAgICAgICAgPSBhbnkgb25lIG9mIHRoZSB0ZW4gZGlnaXRzIDAgdGhyb3VnaCA5XG4gKlxuICogS2VlcCBzdXBwb3J0IGZvciBsZWFkaW5nIGRvdDogaHR0cHM6Ly9naXRodWIuY29tL2pzaHR0cC9jb29raWUvaXNzdWVzLzE3M1xuICpcbiAqID4gKE5vdGUgdGhhdCBhIGxlYWRpbmcgJXgyRSAoXCIuXCIpLCBpZiBwcmVzZW50LCBpcyBpZ25vcmVkIGV2ZW4gdGhvdWdoIHRoYXRcbiAqIGNoYXJhY3RlciBpcyBub3QgcGVybWl0dGVkLCBidXQgYSB0cmFpbGluZyAleDJFIChcIi5cIiksIGlmIHByZXNlbnQsIHdpbGxcbiAqIGNhdXNlIHRoZSB1c2VyIGFnZW50IHRvIGlnbm9yZSB0aGUgYXR0cmlidXRlLilcbiAqL1xuY29uc3QgZG9tYWluVmFsdWVSZWdFeHAgPVxuICAvXihbLl0/W2EtejAtOV0oW2EtejAtOS1dezAsNjF9W2EtejAtOV0pPykoWy5dW2EtejAtOV0oW2EtejAtOS1dezAsNjF9W2EtejAtOV0pPykqJC9pO1xuXG4vKipcbiAqIFJlZ0V4cCB0byBtYXRjaCBwYXRoLXZhbHVlIGluIFJGQyA2MjY1IHNlYyA0LjEuMVxuICpcbiAqIHBhdGgtdmFsdWUgICAgICAgID0gPGFueSBDSEFSIGV4Y2VwdCBDVExzIG9yIFwiO1wiPlxuICogQ0hBUiAgICAgICAgICAgICAgPSAleDAxLTdGXG4gKiAgICAgICAgICAgICAgICAgICAgIDsgZGVmaW5lZCBpbiBSRkMgNTIzNCBhcHBlbmRpeCBCLjFcbiAqL1xuY29uc3QgcGF0aFZhbHVlUmVnRXhwID0gL15bXFx1MDAyMC1cXHUwMDNBXFx1MDAzRC1cXHUwMDdFXSokLztcblxuLyoqXG4gKiBSZWdFeHAgdG8gbWF0Y2ggbWF4LWFnZS12YWx1ZSBpbiBSRkMgNjI2NSBzZWMgNS42LjJcbiAqL1xuY29uc3QgbWF4QWdlUmVnRXhwID0gL14tP1xcZCskLztcblxuLyoqXG4gKiBSZWdFeHAgdG8gbWF0Y2ggUkZDIDYyNjUgY29va2llLW9jdGV0IHZhbHVlcyAod2l0aG91dCAlIHRvIHByZXNlcnZlIHJvdW5kdHJpcCkgdGhhdCBuZWVkIG5vIFVSTCBlbmNvZGluZy5cbiAqL1xuY29uc3QgY29va2llT2N0ZXRSZWdFeHAgPSAvXlshIyQmJygpKitcXC0uXFwvMC05Ojw9Pj9AQS1aW1xcXVxcXl9gYS16e3x9fl0qJC87XG5cbmNvbnN0IE51bGxPYmplY3QgPSAvKiBAX19QVVJFX18gKi8gKCgpID0+IHtcbiAgY29uc3QgQyA9IGZ1bmN0aW9uICgpIHt9O1xuICBDLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHJldHVybiBDO1xufSkoKSBhcyB1bmtub3duIGFzIHsgbmV3ICgpOiBhbnkgfTtcblxuLyoqXG4gKiBQYXJzZSBvcHRpb25zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgYSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCB0byBkZWNvZGUgYSBbY29va2llLXZhbHVlXShodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzYyNjUjc2VjdGlvbi00LjEuMSkuXG4gICAqIFNpbmNlIHRoZSB2YWx1ZSBvZiBhIGNvb2tpZSBoYXMgYSBsaW1pdGVkIGNoYXJhY3RlciBzZXQgKGFuZCBtdXN0IGJlIGEgc2ltcGxlIHN0cmluZyksIHRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZGVjb2RlXG4gICAqIGEgcHJldmlvdXNseS1lbmNvZGVkIGNvb2tpZSB2YWx1ZSBpbnRvIGEgSmF2YVNjcmlwdCBzdHJpbmcuXG4gICAqXG4gICAqIFRoZSBkZWZhdWx0IGZ1bmN0aW9uIGlzIHRoZSBnbG9iYWwgYGRlY29kZVVSSUNvbXBvbmVudGAsIHdyYXBwZWQgaW4gYSBgdHJ5Li5jYXRjaGAuIElmIGFuIGVycm9yXG4gICAqIGlzIHRocm93biBpdCB3aWxsIHJldHVybiB0aGUgY29va2llJ3Mgb3JpZ2luYWwgdmFsdWUuIElmIHlvdSBwcm92aWRlIHlvdXIgb3duIGVuY29kZS9kZWNvZGVcbiAgICogc2NoZW1lIHlvdSBtdXN0IGVuc3VyZSBlcnJvcnMgYXJlIGFwcHJvcHJpYXRlbHkgaGFuZGxlZC4gQ3VzdG9tIGRlY29kZSBmdW5jdGlvbnMgY2FuIHJldHVybiBgdW5kZWZpbmVkYCxcbiAgICogd2hpY2ggd2lsbCBza2lwIHRoZSBjb29raWUgZHVyaW5nIGBwYXJzZWAgYW5kIHRyeSBhZ2FpbiB3aXRoIGEgZnV0dXJlIGNvb2tpZSBvZiB0aGUgc2FtZSBuYW1lLlxuICAgKlxuICAgKiBAZGVmYXVsdCBkZWNvZGVcbiAgICovXG4gIGRlY29kZT86IChzdHI6IHN0cmluZykgPT4gc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIENvb2tpZXMgb2JqZWN0LlxuICovXG5leHBvcnQgdHlwZSBDb29raWVzID0gUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPjtcblxuLyoqXG4gKiBQYXJzZSBhIGBDb29raWVgIGhlYWRlci5cbiAqXG4gKiBQYXJzZSB0aGUgZ2l2ZW4gY29va2llIGhlYWRlciBzdHJpbmcgaW50byBhbiBvYmplY3RcbiAqIFRoZSBvYmplY3QgaGFzIHRoZSB2YXJpb3VzIGNvb2tpZXMgYXMga2V5cyhuYW1lcykgPT4gdmFsdWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNvb2tpZShzdHI6IHN0cmluZywgb3B0aW9ucz86IFBhcnNlT3B0aW9ucyk6IENvb2tpZXMge1xuICBjb25zdCBvYmo6IENvb2tpZXMgPSBuZXcgTnVsbE9iamVjdCgpO1xuICBjb25zdCBsZW4gPSBzdHIubGVuZ3RoO1xuICAvLyBSRkMgNjI2NSBzZWMgNC4xLjEsIFJGQyAyNjE2IDIuMiBkZWZpbmVzIGEgY29va2llIG5hbWUgY29uc2lzdHMgb2Ygb25lIGNoYXIgbWluaW11bSwgcGx1cyAnPScuXG4gIGlmIChsZW4gPCAyKSByZXR1cm4gb2JqO1xuXG4gIGNvbnN0IGRlYyA9IG9wdGlvbnM/LmRlY29kZSB8fCBkZWNvZGU7XG4gIGxldCBpbmRleCA9IDA7XG5cbiAgZG8ge1xuICAgIGNvbnN0IGVxSWR4ID0gZXFJbmRleChzdHIsIGluZGV4LCBsZW4pO1xuICAgIGlmIChlcUlkeCA9PT0gbGVuKSBicmVhazsgLy8gTm8gbW9yZSBjb29raWUgcGFpcnMuXG5cbiAgICBjb25zdCBlbmRJZHggPSBlbmRJbmRleChzdHIsIGluZGV4LCBsZW4pO1xuXG4gICAgaWYgKGVxSWR4ID4gZW5kSWR4KSB7XG4gICAgICAvLyBiYWNrdHJhY2sgb24gcHJpb3Igc2VtaWNvbG9uXG4gICAgICBpbmRleCA9IHN0ci5sYXN0SW5kZXhPZihcIjtcIiwgZXFJZHggLSAxKSArIDE7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBrZXkgPSB2YWx1ZVNsaWNlKHN0ciwgaW5kZXgsIGVxSWR4KTtcblxuICAgIC8vIG9ubHkgYXNzaWduIG9uY2VcbiAgICBpZiAob2JqW2tleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgb2JqW2tleV0gPSBkZWModmFsdWVTbGljZShzdHIsIGVxSWR4ICsgMSwgZW5kSWR4KSk7XG4gICAgfVxuXG4gICAgaW5kZXggPSBlbmRJZHggKyAxO1xuICB9IHdoaWxlIChpbmRleCA8IGxlbik7XG5cbiAgcmV0dXJuIG9iajtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdHJpbmdpZnlPcHRpb25zIHtcbiAgLyoqXG4gICAqIFNwZWNpZmllcyBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGVuY29kZSBhIFtjb29raWUtdmFsdWVdKGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjNjI2NSNzZWN0aW9uLTQuMS4xKS5cbiAgICogU2luY2UgdmFsdWUgb2YgYSBjb29raWUgaGFzIGEgbGltaXRlZCBjaGFyYWN0ZXIgc2V0IChhbmQgbXVzdCBiZSBhIHNpbXBsZSBzdHJpbmcpLCB0aGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGVuY29kZVxuICAgKiBhIHZhbHVlIGludG8gYSBzdHJpbmcgc3VpdGVkIGZvciBhIGNvb2tpZSdzIHZhbHVlLCBhbmQgc2hvdWxkIG1pcnJvciBgZGVjb2RlYCB3aGVuIHBhcnNpbmcuXG4gICAqIFRoZSBkZWZhdWx0IGZ1bmN0aW9uIHByZXNlcnZlcyByb3VuZHRyaXAtc2FmZSBjb29raWUtb2N0ZXQgdmFsdWVzIGFuZCB1c2VzIGBlbmNvZGVVUklDb21wb25lbnRgIG90aGVyd2lzZS5cbiAgICovXG4gIGVuY29kZT86IChzdHI6IHN0cmluZykgPT4gc3RyaW5nO1xufVxuXG4vKipcbiAqIFN0cmluZ2lmaWVzIGFuIG9iamVjdCBpbnRvIGFuIEhUVFAgYENvb2tpZWAgaGVhZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5naWZ5Q29va2llKFxuICBjb29raWU6IENvb2tpZXMsXG4gIG9wdGlvbnM/OiBTdHJpbmdpZnlPcHRpb25zLFxuKTogc3RyaW5nIHtcbiAgY29uc3QgZW5jID0gb3B0aW9ucz8uZW5jb2RlIHx8IGRlZmF1bHRFbmNvZGU7XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhjb29raWUpO1xuICBsZXQgc3RyID0gXCJcIjtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBuYW1lID0ga2V5c1tpXTtcbiAgICBjb25zdCB2YWwgPSBjb29raWVbbmFtZV07XG4gICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcblxuICAgIGlmICghY29va2llTmFtZVJlZ0V4cC50ZXN0KG5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBjb29raWUgbmFtZSBpcyBpbnZhbGlkOiAke25hbWV9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSBlbmModmFsKTtcblxuICAgIGlmICghY29va2llVmFsdWVSZWdFeHAudGVzdCh2YWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYGNvb2tpZSB2YWwgaXMgaW52YWxpZDogJHt2YWx9YCk7XG4gICAgfVxuXG4gICAgaWYgKHN0cikgc3RyICs9IFwiOyBcIjtcbiAgICBzdHIgKz0gbmFtZSArIFwiPVwiICsgdmFsdWU7XG4gIH1cblxuICByZXR1cm4gc3RyO1xufVxuXG4vKipcbiAqIFNldC1Db29raWUgb2JqZWN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNldENvb2tpZSB7XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIGNvb2tpZS5cbiAgICovXG4gIG5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgc3RyaW5nIHRvIGJlIHRoZSB2YWx1ZSBmb3IgdGhlIGNvb2tpZS5cbiAgICovXG4gIHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIGBudW1iZXJgIChpbiBzZWNvbmRzKSB0byBiZSB0aGUgdmFsdWUgZm9yIHRoZSBbYE1heC1BZ2VgIGBTZXQtQ29va2llYCBhdHRyaWJ1dGVdKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2MjY1I3NlY3Rpb24tNS4yLjIpLlxuICAgKlxuICAgKiBUaGUgW2Nvb2tpZSBzdG9yYWdlIG1vZGVsIHNwZWNpZmljYXRpb25dKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2MjY1I3NlY3Rpb24tNS4zKSBzdGF0ZXMgdGhhdCBpZiBib3RoIGBleHBpcmVzYCBhbmRcbiAgICogYG1heEFnZWAgYXJlIHNldCwgdGhlbiBgbWF4QWdlYCB0YWtlcyBwcmVjZWRlbmNlLCBidXQgaXQgaXMgcG9zc2libGUgbm90IGFsbCBjbGllbnRzIGJ5IG9iZXkgdGhpcyxcbiAgICogc28gaWYgYm90aCBhcmUgc2V0LCB0aGV5IHNob3VsZCBwb2ludCB0byB0aGUgc2FtZSBkYXRlIGFuZCB0aW1lLlxuICAgKi9cbiAgbWF4QWdlPzogbnVtYmVyO1xuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBgRGF0ZWAgb2JqZWN0IHRvIGJlIHRoZSB2YWx1ZSBmb3IgdGhlIFtgRXhwaXJlc2AgYFNldC1Db29raWVgIGF0dHJpYnV0ZV0oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzYyNjUjc2VjdGlvbi01LjIuMSkuXG4gICAqIFdoZW4gbm8gZXhwaXJhdGlvbiBpcyBzZXQsIGNsaWVudHMgY29uc2lkZXIgdGhpcyBhIFwibm9uLXBlcnNpc3RlbnQgY29va2llXCIgYW5kIGRlbGV0ZSBpdCB3aGVuIHRoZSBjdXJyZW50IHNlc3Npb24gaXMgb3Zlci5cbiAgICpcbiAgICogVGhlIFtjb29raWUgc3RvcmFnZSBtb2RlbCBzcGVjaWZpY2F0aW9uXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjI2NSNzZWN0aW9uLTUuMykgc3RhdGVzIHRoYXQgaWYgYm90aCBgZXhwaXJlc2AgYW5kXG4gICAqIGBtYXhBZ2VgIGFyZSBzZXQsIHRoZW4gYG1heEFnZWAgdGFrZXMgcHJlY2VkZW5jZSwgYnV0IGl0IGlzIHBvc3NpYmxlIG5vdCBhbGwgY2xpZW50cyBieSBvYmV5IHRoaXMsXG4gICAqIHNvIGlmIGJvdGggYXJlIHNldCwgdGhleSBzaG91bGQgcG9pbnQgdG8gdGhlIHNhbWUgZGF0ZSBhbmQgdGltZS5cbiAgICovXG4gIGV4cGlyZXM/OiBEYXRlO1xuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSB2YWx1ZSBmb3IgdGhlIFtgRG9tYWluYCBgU2V0LUNvb2tpZWAgYXR0cmlidXRlXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjI2NSNzZWN0aW9uLTUuMi4zKS5cbiAgICogV2hlbiBubyBkb21haW4gaXMgc2V0LCBjbGllbnRzIGNvbnNpZGVyIHRoZSBjb29raWUgdG8gYXBwbHkgdG8gdGhlIGN1cnJlbnQgZG9tYWluIG9ubHkuXG4gICAqL1xuICBkb21haW4/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIHZhbHVlIGZvciB0aGUgW2BQYXRoYCBgU2V0LUNvb2tpZWAgYXR0cmlidXRlXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjI2NSNzZWN0aW9uLTUuMi40KS5cbiAgICogV2hlbiBubyBwYXRoIGlzIHNldCwgdGhlIHBhdGggaXMgY29uc2lkZXJlZCB0aGUgW1wiZGVmYXVsdCBwYXRoXCJdKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2MjY1I3NlY3Rpb24tNS4xLjQpLlxuICAgKi9cbiAgcGF0aD86IHN0cmluZztcbiAgLyoqXG4gICAqIEVuYWJsZXMgdGhlIFtgSHR0cE9ubHlgIGBTZXQtQ29va2llYCBhdHRyaWJ1dGVdKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2MjY1I3NlY3Rpb24tNS4yLjYpLlxuICAgKiBXaGVuIGVuYWJsZWQsIGNsaWVudHMgd2lsbCBub3QgYWxsb3cgY2xpZW50LXNpZGUgSmF2YVNjcmlwdCB0byBzZWUgdGhlIGNvb2tpZSBpbiBgZG9jdW1lbnQuY29va2llYC5cbiAgICovXG4gIGh0dHBPbmx5PzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEVuYWJsZXMgdGhlIFtgU2VjdXJlYCBgU2V0LUNvb2tpZWAgYXR0cmlidXRlXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjI2NSNzZWN0aW9uLTUuMi41KS5cbiAgICogV2hlbiBlbmFibGVkLCBjbGllbnRzIHdpbGwgb25seSBzZW5kIHRoZSBjb29raWUgYmFjayBpZiB0aGUgYnJvd3NlciBoYXMgYW4gSFRUUFMgY29ubmVjdGlvbi5cbiAgICovXG4gIHNlY3VyZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBFbmFibGVzIHRoZSBbYFBhcnRpdGlvbmVkYCBgU2V0LUNvb2tpZWAgYXR0cmlidXRlXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtY3V0bGVyLWh0dHBiaXMtcGFydGl0aW9uZWQtY29va2llcy8pLlxuICAgKiBXaGVuIGVuYWJsZWQsIGNsaWVudHMgd2lsbCBvbmx5IHNlbmQgdGhlIGNvb2tpZSBiYWNrIHdoZW4gdGhlIGN1cnJlbnQgZG9tYWluIF9hbmRfIHRvcC1sZXZlbCBkb21haW4gbWF0Y2hlcy5cbiAgICpcbiAgICogVGhpcyBpcyBhbiBhdHRyaWJ1dGUgdGhhdCBoYXMgbm90IHlldCBiZWVuIGZ1bGx5IHN0YW5kYXJkaXplZCwgYW5kIG1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS5cbiAgICogVGhpcyBhbHNvIG1lYW5zIGNsaWVudHMgbWF5IGlnbm9yZSB0aGlzIGF0dHJpYnV0ZSB1bnRpbCB0aGV5IHVuZGVyc3RhbmQgaXQuIE1vcmUgaW5mb3JtYXRpb25cbiAgICogYWJvdXQgY2FuIGJlIGZvdW5kIGluIFt0aGUgcHJvcG9zYWxdKGh0dHBzOi8vZ2l0aHViLmNvbS9wcml2YWN5Y2cvQ0hJUFMpLlxuICAgKi9cbiAgcGFydGl0aW9uZWQ/OiBib29sZWFuO1xuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSB2YWx1ZSBmb3IgdGhlIFtgUHJpb3JpdHlgIGBTZXQtQ29va2llYCBhdHRyaWJ1dGVdKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9kcmFmdC13ZXN0LWNvb2tpZS1wcmlvcml0eS0wMCNzZWN0aW9uLTQuMSkuXG4gICAqXG4gICAqIC0gYCdsb3cnYCB3aWxsIHNldCB0aGUgYFByaW9yaXR5YCBhdHRyaWJ1dGUgdG8gYExvd2AuXG4gICAqIC0gYCdtZWRpdW0nYCB3aWxsIHNldCB0aGUgYFByaW9yaXR5YCBhdHRyaWJ1dGUgdG8gYE1lZGl1bWAsIHRoZSBkZWZhdWx0IHByaW9yaXR5IHdoZW4gbm90IHNldC5cbiAgICogLSBgJ2hpZ2gnYCB3aWxsIHNldCB0aGUgYFByaW9yaXR5YCBhdHRyaWJ1dGUgdG8gYEhpZ2hgLlxuICAgKlxuICAgKiBNb3JlIGluZm9ybWF0aW9uIGFib3V0IHByaW9yaXR5IGxldmVscyBjYW4gYmUgZm91bmQgaW4gW3RoZSBzcGVjaWZpY2F0aW9uXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtd2VzdC1jb29raWUtcHJpb3JpdHktMDAjc2VjdGlvbi00LjEpLlxuICAgKi9cbiAgcHJpb3JpdHk/OiBcImxvd1wiIHwgXCJtZWRpdW1cIiB8IFwiaGlnaFwiO1xuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSB2YWx1ZSBmb3IgdGhlIFtgU2FtZVNpdGVgIGBTZXQtQ29va2llYCBhdHRyaWJ1dGVdKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9kcmFmdC1pZXRmLWh0dHBiaXMtcmZjNjI2NWJpcy0wOSNzZWN0aW9uLTUuNC43KS5cbiAgICpcbiAgICogLSBgdHJ1ZWAgd2lsbCBzZXQgdGhlIGBTYW1lU2l0ZWAgYXR0cmlidXRlIHRvIGBTdHJpY3RgIGZvciBzdHJpY3Qgc2FtZSBzaXRlIGVuZm9yY2VtZW50LlxuICAgKiAtIGAnbGF4J2Agd2lsbCBzZXQgdGhlIGBTYW1lU2l0ZWAgYXR0cmlidXRlIHRvIGBMYXhgIGZvciBsYXggc2FtZSBzaXRlIGVuZm9yY2VtZW50LlxuICAgKiAtIGAnbm9uZSdgIHdpbGwgc2V0IHRoZSBgU2FtZVNpdGVgIGF0dHJpYnV0ZSB0byBgTm9uZWAgZm9yIGFuIGV4cGxpY2l0IGNyb3NzLXNpdGUgY29va2llLlxuICAgKiAtIGAnc3RyaWN0J2Agd2lsbCBzZXQgdGhlIGBTYW1lU2l0ZWAgYXR0cmlidXRlIHRvIGBTdHJpY3RgIGZvciBzdHJpY3Qgc2FtZSBzaXRlIGVuZm9yY2VtZW50LlxuICAgKlxuICAgKiBNb3JlIGluZm9ybWF0aW9uIGFib3V0IGVuZm9yY2VtZW50IGxldmVscyBjYW4gYmUgZm91bmQgaW4gW3RoZSBzcGVjaWZpY2F0aW9uXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtaWV0Zi1odHRwYmlzLXJmYzYyNjViaXMtMDkjc2VjdGlvbi01LjQuNykuXG4gICAqL1xuICBzYW1lU2l0ZT86IGJvb2xlYW4gfCBcImxheFwiIHwgXCJzdHJpY3RcIiB8IFwibm9uZVwiO1xufVxuXG4vKipcbiAqIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkgc2VyaWFsaXplIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCB0eXBlIFNlcmlhbGl6ZU9wdGlvbnMgPSBTdHJpbmdpZnlPcHRpb25zICZcbiAgT21pdDxTZXRDb29raWUsIFwibmFtZVwiIHwgXCJ2YWx1ZVwiPjtcblxuLyoqXG4gKiBTZXJpYWxpemUgZGF0YSBpbnRvIGEgY29va2llIGhlYWRlci5cbiAqXG4gKiBTZXJpYWxpemUgYSBuYW1lIHZhbHVlIHBhaXIgaW50byBhIGNvb2tpZSBzdHJpbmcgc3VpdGFibGUgZm9yXG4gKiBodHRwIGhlYWRlcnMuIEFuIG9wdGlvbmFsIG9wdGlvbnMgb2JqZWN0IHNwZWNpZmllcyBjb29raWUgcGFyYW1ldGVycy5cbiAqXG4gKiBzdHJpbmdpZnlTZXRDb29raWUoeyBuYW1lOiAnZm9vJywgdmFsdWU6ICdiYXInLCBodHRwT25seTogdHJ1ZSB9KVxuICogICA9PiBcImZvbz1iYXI7IEh0dHBPbmx5XCJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ2lmeVNldENvb2tpZShcbiAgY29va2llOiBTZXRDb29raWUsXG4gIG9wdGlvbnM/OiBTdHJpbmdpZnlPcHRpb25zLFxuKTogc3RyaW5nIHtcbiAgY29uc3QgZW5jID0gb3B0aW9ucz8uZW5jb2RlIHx8IGRlZmF1bHRFbmNvZGU7XG5cbiAgaWYgKCFjb29raWVOYW1lUmVnRXhwLnRlc3QoY29va2llLm5hbWUpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgYXJndW1lbnQgbmFtZSBpcyBpbnZhbGlkOiAke2Nvb2tpZS5uYW1lfWApO1xuICB9XG5cbiAgY29uc3QgdmFsdWUgPSBjb29raWUudmFsdWUgPT0gbnVsbCA/IFwiXCIgOiBlbmMoY29va2llLnZhbHVlKTtcblxuICBpZiAoIWNvb2tpZVZhbHVlUmVnRXhwLnRlc3QodmFsdWUpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgYXJndW1lbnQgdmFsIGlzIGludmFsaWQ6ICR7Y29va2llLnZhbHVlfWApO1xuICB9XG5cbiAgbGV0IHN0ciA9IGNvb2tpZS5uYW1lICsgXCI9XCIgKyB2YWx1ZTtcblxuICBpZiAoY29va2llLm1heEFnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGNvb2tpZS5tYXhBZ2UpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBvcHRpb24gbWF4QWdlIGlzIGludmFsaWQ6ICR7Y29va2llLm1heEFnZX1gKTtcbiAgICB9XG5cbiAgICBzdHIgKz0gXCI7IE1heC1BZ2U9XCIgKyBjb29raWUubWF4QWdlO1xuICB9XG5cbiAgaWYgKGNvb2tpZS5kb21haW4pIHtcbiAgICBpZiAoIWRvbWFpblZhbHVlUmVnRXhwLnRlc3QoY29va2llLmRvbWFpbikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYG9wdGlvbiBkb21haW4gaXMgaW52YWxpZDogJHtjb29raWUuZG9tYWlufWApO1xuICAgIH1cblxuICAgIHN0ciArPSBcIjsgRG9tYWluPVwiICsgY29va2llLmRvbWFpbjtcbiAgfVxuXG4gIGlmIChjb29raWUucGF0aCkge1xuICAgIGlmICghcGF0aFZhbHVlUmVnRXhwLnRlc3QoY29va2llLnBhdGgpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBvcHRpb24gcGF0aCBpcyBpbnZhbGlkOiAke2Nvb2tpZS5wYXRofWApO1xuICAgIH1cblxuICAgIHN0ciArPSBcIjsgUGF0aD1cIiArIGNvb2tpZS5wYXRoO1xuICB9XG5cbiAgaWYgKGNvb2tpZS5leHBpcmVzKSB7XG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoY29va2llLmV4cGlyZXMudmFsdWVPZigpKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgb3B0aW9uIGV4cGlyZXMgaXMgaW52YWxpZDogJHtjb29raWUuZXhwaXJlc31gKTtcbiAgICB9XG5cbiAgICBzdHIgKz0gXCI7IEV4cGlyZXM9XCIgKyBjb29raWUuZXhwaXJlcy50b1VUQ1N0cmluZygpO1xuICB9XG5cbiAgaWYgKGNvb2tpZS5odHRwT25seSkge1xuICAgIHN0ciArPSBcIjsgSHR0cE9ubHlcIjtcbiAgfVxuXG4gIGlmIChjb29raWUuc2VjdXJlKSB7XG4gICAgc3RyICs9IFwiOyBTZWN1cmVcIjtcbiAgfVxuXG4gIGlmIChjb29raWUucGFydGl0aW9uZWQpIHtcbiAgICBzdHIgKz0gXCI7IFBhcnRpdGlvbmVkXCI7XG4gIH1cblxuICBpZiAoY29va2llLnByaW9yaXR5KSB7XG4gICAgY29uc3QgcHJpb3JpdHkgPVxuICAgICAgdHlwZW9mIGNvb2tpZS5wcmlvcml0eSA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IGNvb2tpZS5wcmlvcml0eS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIHN3aXRjaCAocHJpb3JpdHkpIHtcbiAgICAgIGNhc2UgXCJsb3dcIjpcbiAgICAgICAgc3RyICs9IFwiOyBQcmlvcml0eT1Mb3dcIjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwibWVkaXVtXCI6XG4gICAgICAgIHN0ciArPSBcIjsgUHJpb3JpdHk9TWVkaXVtXCI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImhpZ2hcIjpcbiAgICAgICAgc3RyICs9IFwiOyBQcmlvcml0eT1IaWdoXCI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgb3B0aW9uIHByaW9yaXR5IGlzIGludmFsaWQ6ICR7Y29va2llLnByaW9yaXR5fWApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb29raWUuc2FtZVNpdGUpIHtcbiAgICBjb25zdCBzYW1lU2l0ZSA9XG4gICAgICB0eXBlb2YgY29va2llLnNhbWVTaXRlID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gY29va2llLnNhbWVTaXRlLnRvTG93ZXJDYXNlKClcbiAgICAgICAgOiBjb29raWUuc2FtZVNpdGU7XG4gICAgc3dpdGNoIChzYW1lU2l0ZSkge1xuICAgICAgY2FzZSB0cnVlOlxuICAgICAgY2FzZSBcInN0cmljdFwiOlxuICAgICAgICBzdHIgKz0gXCI7IFNhbWVTaXRlPVN0cmljdFwiO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJsYXhcIjpcbiAgICAgICAgc3RyICs9IFwiOyBTYW1lU2l0ZT1MYXhcIjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwibm9uZVwiOlxuICAgICAgICBzdHIgKz0gXCI7IFNhbWVTaXRlPU5vbmVcIjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBvcHRpb24gc2FtZVNpdGUgaXMgaW52YWxpZDogJHtjb29raWUuc2FtZVNpdGV9YCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN0cjtcbn1cblxuLyoqXG4gKiBEZXNlcmlhbGl6ZSBhIGBTZXQtQ29va2llYCBoZWFkZXIgaW50byBhbiBvYmplY3QuXG4gKlxuICogcGFyc2VTZXRDb29raWUoJ2Zvbz1iYXI7IEh0dHBPbmx5JylcbiAqICAgPT4geyBuYW1lOiAnZm9vJywgdmFsdWU6ICdiYXInLCBodHRwT25seTogdHJ1ZSB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNldENvb2tpZShzdHI6IHN0cmluZywgb3B0aW9ucz86IFBhcnNlT3B0aW9ucyk6IFNldENvb2tpZSB7XG4gIGNvbnN0IGRlYyA9IG9wdGlvbnM/LmRlY29kZSB8fCBkZWNvZGU7XG4gIGNvbnN0IGxlbiA9IHN0ci5sZW5ndGg7XG4gIGNvbnN0IGVuZElkeCA9IGVuZEluZGV4KHN0ciwgMCwgbGVuKTtcbiAgbGV0IGVxSWR4ID0gZXFJbmRleChzdHIsIDAsIGxlbik7XG4gIGNvbnN0IHNldENvb2tpZTogU2V0Q29va2llID1cbiAgICBlcUlkeCA8IGVuZElkeFxuICAgICAgPyB7XG4gICAgICAgICAgbmFtZTogdmFsdWVTbGljZShzdHIsIDAsIGVxSWR4KSxcbiAgICAgICAgICB2YWx1ZTogZGVjKHZhbHVlU2xpY2Uoc3RyLCBlcUlkeCArIDEsIGVuZElkeCkpLFxuICAgICAgICB9XG4gICAgICA6IHsgbmFtZTogXCJcIiwgdmFsdWU6IGRlYyh2YWx1ZVNsaWNlKHN0ciwgMCwgZW5kSWR4KSkgfTtcblxuICBsZXQgaW5kZXggPSBlbmRJZHggKyAxO1xuICB3aGlsZSAoaW5kZXggPCBsZW4pIHtcbiAgICBjb25zdCBlbmRJZHggPSBlbmRJbmRleChzdHIsIGluZGV4LCBsZW4pO1xuICAgIGlmIChlcUlkeCA8IGluZGV4KSBlcUlkeCA9IGVxSW5kZXgoc3RyLCBpbmRleCwgbGVuKTtcblxuICAgIGNvbnN0IGF0dHIgPVxuICAgICAgZXFJZHggPCBlbmRJZHhcbiAgICAgICAgPyB2YWx1ZVNsaWNlKHN0ciwgaW5kZXgsIGVxSWR4KVxuICAgICAgICA6IHZhbHVlU2xpY2Uoc3RyLCBpbmRleCwgZW5kSWR4KTtcbiAgICBjb25zdCB2YWwgPSBlcUlkeCA8IGVuZElkeCA/IHZhbHVlU2xpY2Uoc3RyLCBlcUlkeCArIDEsIGVuZElkeCkgOiB1bmRlZmluZWQ7XG5cbiAgICBzd2l0Y2ggKGF0dHIudG9Mb3dlckNhc2UoKSkge1xuICAgICAgY2FzZSBcImh0dHBvbmx5XCI6XG4gICAgICAgIHNldENvb2tpZS5odHRwT25seSA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInNlY3VyZVwiOlxuICAgICAgICBzZXRDb29raWUuc2VjdXJlID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwicGFydGl0aW9uZWRcIjpcbiAgICAgICAgc2V0Q29va2llLnBhcnRpdGlvbmVkID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiZG9tYWluXCI6XG4gICAgICAgIHNldENvb2tpZS5kb21haW4gPSB2YWw7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInBhdGhcIjpcbiAgICAgICAgc2V0Q29va2llLnBhdGggPSB2YWw7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIm1heC1hZ2VcIjpcbiAgICAgICAgaWYgKHZhbCAmJiBtYXhBZ2VSZWdFeHAudGVzdCh2YWwpKSBzZXRDb29raWUubWF4QWdlID0gTnVtYmVyKHZhbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImV4cGlyZXNcIjpcbiAgICAgICAgaWYgKCF2YWwpIGJyZWFrO1xuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUodmFsKTtcbiAgICAgICAgaWYgKE51bWJlci5pc0Zpbml0ZShkYXRlLnZhbHVlT2YoKSkpIHNldENvb2tpZS5leHBpcmVzID0gZGF0ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwicHJpb3JpdHlcIjpcbiAgICAgICAgaWYgKCF2YWwpIGJyZWFrO1xuICAgICAgICBjb25zdCBwcmlvcml0eSA9IHZhbC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgcHJpb3JpdHkgPT09IFwibG93XCIgfHxcbiAgICAgICAgICBwcmlvcml0eSA9PT0gXCJtZWRpdW1cIiB8fFxuICAgICAgICAgIHByaW9yaXR5ID09PSBcImhpZ2hcIlxuICAgICAgICApIHtcbiAgICAgICAgICBzZXRDb29raWUucHJpb3JpdHkgPSBwcmlvcml0eTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJzYW1lc2l0ZVwiOlxuICAgICAgICBpZiAoIXZhbCkgYnJlYWs7XG4gICAgICAgIGNvbnN0IHNhbWVTaXRlID0gdmFsLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBzYW1lU2l0ZSA9PT0gXCJsYXhcIiB8fFxuICAgICAgICAgIHNhbWVTaXRlID09PSBcInN0cmljdFwiIHx8XG4gICAgICAgICAgc2FtZVNpdGUgPT09IFwibm9uZVwiXG4gICAgICAgICkge1xuICAgICAgICAgIHNldENvb2tpZS5zYW1lU2l0ZSA9IHNhbWVTaXRlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGluZGV4ID0gZW5kSWR4ICsgMTtcbiAgfVxuXG4gIHJldHVybiBzZXRDb29raWU7XG59XG5cbi8qKlxuICogRmluZCB0aGUgbmV4dCBgO2AgY2hhcmFjdGVyLCBvciByZXR1cm4gYGxlbmAuXG4gKi9cbmZ1bmN0aW9uIGVuZEluZGV4KHN0cjogc3RyaW5nLCBtaW46IG51bWJlciwgbGVuOiBudW1iZXIpIHtcbiAgY29uc3QgaW5kZXggPSBzdHIuaW5kZXhPZihcIjtcIiwgbWluKTtcbiAgcmV0dXJuIGluZGV4ID09PSAtMSA/IGxlbiA6IGluZGV4O1xufVxuXG4vKipcbiAqIEZpbmQgdGhlIG5leHQgYD1gIGNoYXJhY3Rlciwgb3IgcmV0dXJuIGBsZW5gLlxuICovXG5mdW5jdGlvbiBlcUluZGV4KHN0cjogc3RyaW5nLCBtaW46IG51bWJlciwgbGVuOiBudW1iZXIpIHtcbiAgY29uc3QgaW5kZXggPSBzdHIuaW5kZXhPZihcIj1cIiwgbWluKTtcbiAgcmV0dXJuIGluZGV4ID09PSAtMSA/IGxlbiA6IGluZGV4O1xufVxuXG4vKipcbiAqIFNsaWNlIG91dCBhIHZhbHVlIGJldHdlZW4gc3RhcnRQb2QgdG8gbWF4LlxuICovXG5mdW5jdGlvbiB2YWx1ZVNsaWNlKHN0cjogc3RyaW5nLCBtaW46IG51bWJlciwgbWF4OiBudW1iZXIpIHtcbiAgaWYgKG1pbiA9PT0gbWF4KSByZXR1cm4gXCJcIjtcbiAgbGV0IHN0YXJ0ID0gbWluO1xuICBsZXQgZW5kID0gbWF4O1xuXG4gIGRvIHtcbiAgICBjb25zdCBjb2RlID0gc3RyLmNoYXJDb2RlQXQoc3RhcnQpO1xuICAgIGlmIChjb2RlICE9PSAzMiAvKiAgICovICYmIGNvZGUgIT09IDkgLyogXFx0ICovKSBicmVhaztcbiAgfSB3aGlsZSAoKytzdGFydCA8IGVuZCk7XG5cbiAgd2hpbGUgKGVuZCA+IHN0YXJ0KSB7XG4gICAgY29uc3QgY29kZSA9IHN0ci5jaGFyQ29kZUF0KGVuZCAtIDEpO1xuICAgIGlmIChjb2RlICE9PSAzMiAvKiAgICovICYmIGNvZGUgIT09IDkgLyogXFx0ICovKSBicmVhaztcbiAgICBlbmQtLTtcbiAgfVxuXG4gIHJldHVybiBzdHIuc2xpY2Uoc3RhcnQsIGVuZCk7XG59XG5cbi8qKlxuICogVVJMLWRlY29kZSBzdHJpbmcgdmFsdWUuIE9wdGltaXplZCB0byBza2lwIG5hdGl2ZSBjYWxsIHdoZW4gbm8gJS5cbiAqL1xuZnVuY3Rpb24gZGVjb2RlKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKHN0ci5pbmRleE9mKFwiJVwiKSA9PT0gLTEpIHJldHVybiBzdHI7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHN0cik7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG59XG5cbi8qKlxuICogVVJMLWVuY29kZSBzdHJpbmcgdmFsdWUuIE9wdGltaXplZCB0byBza2lwIG5hdGl2ZSBjYWxsIGZvciByb3VuZHRyaXAtc2FmZSBjb29raWUtb2N0ZXQgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBkZWZhdWx0RW5jb2RlKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvb2tpZU9jdGV0UmVnRXhwLnRlc3Qoc3RyKSA/IHN0ciA6IGVuY29kZVVSSUNvbXBvbmVudChzdHIpO1xufVxuIiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9kaXNwYXRjaGFibGUgZnJvbSBcIi4vaW50ZXJuYWwvX2Rpc3BhdGNoYWJsZS5qc1wiO1xuaW1wb3J0IF94YWxsIGZyb20gXCIuL2ludGVybmFsL194YWxsLmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyBgdHJ1ZWAgaWYgYWxsIGVsZW1lbnRzIG9mIHRoZSBsaXN0IG1hdGNoIHRoZSBwcmVkaWNhdGUsIGBmYWxzZWAgaWZcbiAqIHRoZXJlIGFyZSBhbnkgdGhhdCBkb24ndC5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgYWxsYCBtZXRob2Qgb2YgdGhlIHNlY29uZCBhcmd1bWVudCwgaWYgcHJlc2VudC5cbiAqXG4gKiBBY3RzIGFzIGEgdHJhbnNkdWNlciBpZiBhIHRyYW5zZm9ybWVyIGlzIGdpdmVuIGluIGxpc3QgcG9zaXRpb24uXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyAoYSAtPiBCb29sZWFuKSAtPiBbYV0gLT4gQm9vbGVhblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIHByZWRpY2F0ZSBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGFycmF5IHRvIGNvbnNpZGVyLlxuICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIHRoZSBwcmVkaWNhdGUgaXMgc2F0aXNmaWVkIGJ5IGV2ZXJ5IGVsZW1lbnQsIGBmYWxzZWBcbiAqICAgICAgICAgb3RoZXJ3aXNlLlxuICogQHNlZSBSLmFueSwgUi5ub25lLCBSLnRyYW5zZHVjZVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IGVxdWFsczMgPSBSLmVxdWFscygzKTtcbiAqICAgICAgUi5hbGwoZXF1YWxzMykoWzMsIDMsIDMsIDNdKTsgLy89PiB0cnVlXG4gKiAgICAgIFIuYWxsKGVxdWFsczMpKFszLCAzLCAxLCAzXSk7IC8vPT4gZmFsc2VcbiAqL1xudmFyIGFsbCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKCAvKiNfX1BVUkVfXyovX2Rpc3BhdGNoYWJsZShbJ2FsbCddLCBfeGFsbCwgZnVuY3Rpb24gYWxsKGZuLCBsaXN0KSB7XG4gIHZhciBpZHggPSAwO1xuICB3aGlsZSAoaWR4IDwgbGlzdC5sZW5ndGgpIHtcbiAgICBpZiAoIWZuKGxpc3RbaWR4XSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59KSk7XG5leHBvcnQgZGVmYXVsdCBhbGw7IiwiaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5MS5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGFsd2F5cyByZXR1cm5zIHRoZSBnaXZlbiB2YWx1ZS4gTm90ZSB0aGF0IGZvclxuICogbm9uLXByaW1pdGl2ZXMgdGhlIHZhbHVlIHJldHVybmVkIGlzIGEgcmVmZXJlbmNlIHRvIHRoZSBvcmlnaW5hbCB2YWx1ZS5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGtub3duIGFzIGBjb25zdGAsIGBjb25zdGFudGAsIG9yIGBLYCAoZm9yIEsgY29tYmluYXRvcikgaW5cbiAqIG90aGVyIGxhbmd1YWdlcyBhbmQgbGlicmFyaWVzLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnIGEgLT4gKCogLT4gYSlcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB3cmFwIGluIGEgZnVuY3Rpb25cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIEZ1bmN0aW9uIDo6ICogLT4gdmFsLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IHQgPSBSLmFsd2F5cygnVGVlJyk7XG4gKiAgICAgIHQoKTsgLy89PiAnVGVlJ1xuICovXG52YXIgYWx3YXlzID0gLyojX19QVVJFX18qL19jdXJyeTEoZnVuY3Rpb24gYWx3YXlzKHZhbCkge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB2YWw7XG4gIH07XG59KTtcbmV4cG9ydCBkZWZhdWx0IGFsd2F5czsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX2Rpc3BhdGNoYWJsZSBmcm9tIFwiLi9pbnRlcm5hbC9fZGlzcGF0Y2hhYmxlLmpzXCI7XG5pbXBvcnQgX3hhbnkgZnJvbSBcIi4vaW50ZXJuYWwvX3hhbnkuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlIGVsZW1lbnRzIG9mIHRoZSBsaXN0IG1hdGNoIHRoZSBwcmVkaWNhdGUsXG4gKiBgZmFsc2VgIG90aGVyd2lzZS5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgYW55YCBtZXRob2Qgb2YgdGhlIHNlY29uZCBhcmd1bWVudCwgaWYgcHJlc2VudC5cbiAqXG4gKiBBY3RzIGFzIGEgdHJhbnNkdWNlciBpZiBhIHRyYW5zZm9ybWVyIGlzIGdpdmVuIGluIGxpc3QgcG9zaXRpb24uXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyAoYSAtPiBCb29sZWFuKSAtPiBbYV0gLT4gQm9vbGVhblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIHByZWRpY2F0ZSBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGFycmF5IHRvIGNvbnNpZGVyLlxuICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIHRoZSBwcmVkaWNhdGUgaXMgc2F0aXNmaWVkIGJ5IGF0IGxlYXN0IG9uZSBlbGVtZW50LCBgZmFsc2VgXG4gKiAgICAgICAgIG90aGVyd2lzZS5cbiAqIEBzZWUgUi5hbGwsIFIubm9uZSwgUi50cmFuc2R1Y2VcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBsZXNzVGhhbjAgPSBSLmZsaXAoUi5sdCkoMCk7XG4gKiAgICAgIGNvbnN0IGxlc3NUaGFuMiA9IFIuZmxpcChSLmx0KSgyKTtcbiAqICAgICAgUi5hbnkobGVzc1RoYW4wKShbMSwgMl0pOyAvLz0+IGZhbHNlXG4gKiAgICAgIFIuYW55KGxlc3NUaGFuMikoWzEsIDJdKTsgLy89PiB0cnVlXG4gKi9cbnZhciBhbnkgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MiggLyojX19QVVJFX18qL19kaXNwYXRjaGFibGUoWydhbnknXSwgX3hhbnksIGZ1bmN0aW9uIGFueShmbiwgbGlzdCkge1xuICB2YXIgaWR4ID0gMDtcbiAgd2hpbGUgKGlkeCA8IGxpc3QubGVuZ3RoKSB7XG4gICAgaWYgKGZuKGxpc3RbaWR4XSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZHggKz0gMTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59KSk7XG5leHBvcnQgZGVmYXVsdCBhbnk7IiwiaW1wb3J0IF9jb25jYXQgZnJvbSBcIi4vaW50ZXJuYWwvX2NvbmNhdC5qc1wiO1xuaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9yZWR1Y2UgZnJvbSBcIi4vaW50ZXJuYWwvX3JlZHVjZS5qc1wiO1xuaW1wb3J0IG1hcCBmcm9tIFwiLi9tYXAuanNcIjtcblxuLyoqXG4gKiBhcCBhcHBsaWVzIGEgbGlzdCBvZiBmdW5jdGlvbnMgdG8gYSBsaXN0IG9mIHZhbHVlcy5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgYXBgIG1ldGhvZCBvZiB0aGUgZmlyc3QgYXJndW1lbnQsIGlmIHByZXNlbnQuIEFsc29cbiAqIHRyZWF0cyBjdXJyaWVkIGZ1bmN0aW9ucyBhcyBhcHBsaWNhdGl2ZXMuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMy4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBzaWcgW2EgLT4gYl0gLT4gW2FdIC0+IFtiXVxuICogQHNpZyBBcHBseSBmID0+IGYgKGEgLT4gYikgLT4gZiBhIC0+IGYgYlxuICogQHNpZyAociAtPiBhIC0+IGIpIC0+IChyIC0+IGEpIC0+IChyIC0+IGIpXG4gKiBAcGFyYW0geyp9IGFwcGx5RlxuICogQHBhcmFtIHsqfSBhcHBseVhcbiAqIEByZXR1cm4geyp9XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5hcChbUi5tdWx0aXBseSgyKSwgUi5hZGQoMyldLCBbMSwyLDNdKTsgLy89PiBbMiwgNCwgNiwgNCwgNSwgNl1cbiAqICAgICAgUi5hcChbUi5jb25jYXQoJ3Rhc3R5ICcpLCBSLnRvVXBwZXJdLCBbJ3BpenphJywgJ3NhbGFkJ10pOyAvLz0+IFtcInRhc3R5IHBpenphXCIsIFwidGFzdHkgc2FsYWRcIiwgXCJQSVpaQVwiLCBcIlNBTEFEXCJdXG4gKlxuICogICAgICAvLyBSLmFwIGNhbiBhbHNvIGJlIHVzZWQgYXMgUyBjb21iaW5hdG9yXG4gKiAgICAgIC8vIHdoZW4gb25seSB0d28gZnVuY3Rpb25zIGFyZSBwYXNzZWRcbiAqICAgICAgUi5hcChSLmNvbmNhdCwgUi50b1VwcGVyKSgnUmFtZGEnKSAvLz0+ICdSYW1kYVJBTURBJ1xuICogQHN5bWIgUi5hcChbZiwgZ10sIFthLCBiXSkgPSBbZihhKSwgZihiKSwgZyhhKSwgZyhiKV1cbiAqL1xudmFyIGFwID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gYXAoYXBwbHlGLCBhcHBseVgpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcHBseVhbJ2ZhbnRhc3ktbGFuZC9hcCddID09PSAnZnVuY3Rpb24nID8gYXBwbHlYWydmYW50YXN5LWxhbmQvYXAnXShhcHBseUYpIDogdHlwZW9mIGFwcGx5Ri5hcCA9PT0gJ2Z1bmN0aW9uJyA/IGFwcGx5Ri5hcChhcHBseVgpIDogdHlwZW9mIGFwcGx5RiA9PT0gJ2Z1bmN0aW9uJyA/IGZ1bmN0aW9uICh4KSB7XG4gICAgcmV0dXJuIGFwcGx5Rih4KShhcHBseVgoeCkpO1xuICB9IDogX3JlZHVjZShmdW5jdGlvbiAoYWNjLCBmKSB7XG4gICAgcmV0dXJuIF9jb25jYXQoYWNjLCBtYXAoZiwgYXBwbHlYKSk7XG4gIH0sIFtdLCBhcHBseUYpO1xufSk7XG5leHBvcnQgZGVmYXVsdCBhcDsiLCJpbXBvcnQgX2NvbmNhdCBmcm9tIFwiLi9pbnRlcm5hbC9fY29uY2F0LmpzXCI7XG5pbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyBhIG5ldyBsaXN0IGNvbnRhaW5pbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiBsaXN0LCBmb2xsb3dlZCBieVxuICogdGhlIGdpdmVuIGVsZW1lbnQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBhIC0+IFthXSAtPiBbYV1cbiAqIEBwYXJhbSB7Kn0gZWwgVGhlIGVsZW1lbnQgdG8gYWRkIHRvIHRoZSBlbmQgb2YgdGhlIG5ldyBsaXN0LlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgbGlzdCBvZiBlbGVtZW50cyB0byBhZGQgYSBuZXcgaXRlbSB0by5cbiAqICAgICAgICBsaXN0LlxuICogQHJldHVybiB7QXJyYXl9IEEgbmV3IGxpc3QgY29udGFpbmluZyB0aGUgZWxlbWVudHMgb2YgdGhlIG9sZCBsaXN0IGZvbGxvd2VkIGJ5IGBlbGAuXG4gKiBAc2VlIFIucHJlcGVuZFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuYXBwZW5kKCd0ZXN0cycsIFsnd3JpdGUnLCAnbW9yZSddKTsgLy89PiBbJ3dyaXRlJywgJ21vcmUnLCAndGVzdHMnXVxuICogICAgICBSLmFwcGVuZCgndGVzdHMnLCBbXSk7IC8vPT4gWyd0ZXN0cyddXG4gKiAgICAgIFIuYXBwZW5kKFsndGVzdHMnXSwgWyd3cml0ZScsICdtb3JlJ10pOyAvLz0+IFsnd3JpdGUnLCAnbW9yZScsIFsndGVzdHMnXV1cbiAqL1xudmFyIGFwcGVuZCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIGFwcGVuZChlbCwgbGlzdCkge1xuICByZXR1cm4gX2NvbmNhdChsaXN0LCBbZWxdKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgYXBwZW5kOyIsImltcG9ydCBfY3VycnkzIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTMuanNcIjtcbmltcG9ydCBhc3NvY1BhdGggZnJvbSBcIi4vYXNzb2NQYXRoLmpzXCI7XG5cbi8qKlxuICogTWFrZXMgYSBzaGFsbG93IGNsb25lIG9mIGFuIG9iamVjdCwgc2V0dGluZyBvciBvdmVycmlkaW5nIHRoZSBzcGVjaWZpZWRcbiAqIHByb3BlcnR5IHdpdGggdGhlIGdpdmVuIHZhbHVlLiBOb3RlIHRoYXQgdGhpcyBjb3BpZXMgYW5kIGZsYXR0ZW5zIHByb3RvdHlwZVxuICogcHJvcGVydGllcyBvbnRvIHRoZSBuZXcgb2JqZWN0IGFzIHdlbGwuIEFsbCBub24tcHJpbWl0aXZlIHByb3BlcnRpZXMgYXJlXG4gKiBjb3BpZWQgYnkgcmVmZXJlbmNlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjguMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHR5cGVkZWZuIElkeCA9IFN0cmluZyB8IEludFxuICogQHNpZyBJZHggLT4gYSAtPiB7azogdn0gLT4ge2s6IHZ9XG4gKiBAcGFyYW0ge1N0cmluZ3xOdW1iZXJ9IHByb3AgVGhlIHByb3BlcnR5IG5hbWUgdG8gc2V0XG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgbmV3IHZhbHVlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gY2xvbmVcbiAqIEByZXR1cm4ge09iamVjdH0gQSBuZXcgb2JqZWN0IGVxdWl2YWxlbnQgdG8gdGhlIG9yaWdpbmFsIGV4Y2VwdCBmb3IgdGhlIGNoYW5nZWQgcHJvcGVydHkuXG4gKiBAc2VlIFIuZGlzc29jLCBSLnBpY2tcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmFzc29jKCdjJywgMywge2E6IDEsIGI6IDJ9KTsgLy89PiB7YTogMSwgYjogMiwgYzogM31cbiAqL1xudmFyIGFzc29jID0gLyojX19QVVJFX18qL19jdXJyeTMoZnVuY3Rpb24gYXNzb2MocHJvcCwgdmFsLCBvYmopIHtcbiAgcmV0dXJuIGFzc29jUGF0aChbcHJvcF0sIHZhbCwgb2JqKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgYXNzb2M7IiwiaW1wb3J0IF9jdXJyeTMgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5My5qc1wiO1xuaW1wb3J0IF9oYXMgZnJvbSBcIi4vaW50ZXJuYWwvX2hhcy5qc1wiO1xuaW1wb3J0IF9pc0ludGVnZXIgZnJvbSBcIi4vaW50ZXJuYWwvX2lzSW50ZWdlci5qc1wiO1xuaW1wb3J0IF9hc3NvYyBmcm9tIFwiLi9pbnRlcm5hbC9fYXNzb2MuanNcIjtcbmltcG9ydCBpc05pbCBmcm9tIFwiLi9pc05pbC5qc1wiO1xuXG4vKipcbiAqIE1ha2VzIGEgc2hhbGxvdyBjbG9uZSBvZiBhbiBvYmplY3QsIHNldHRpbmcgb3Igb3ZlcnJpZGluZyB0aGUgbm9kZXMgcmVxdWlyZWRcbiAqIHRvIGNyZWF0ZSB0aGUgZ2l2ZW4gcGF0aCwgYW5kIHBsYWNpbmcgdGhlIHNwZWNpZmljIHZhbHVlIGF0IHRoZSB0YWlsIGVuZCBvZlxuICogdGhhdCBwYXRoLiBOb3RlIHRoYXQgdGhpcyBjb3BpZXMgYW5kIGZsYXR0ZW5zIHByb3RvdHlwZSBwcm9wZXJ0aWVzIG9udG8gdGhlXG4gKiBuZXcgb2JqZWN0IGFzIHdlbGwuIEFsbCBub24tcHJpbWl0aXZlIHByb3BlcnRpZXMgYXJlIGNvcGllZCBieSByZWZlcmVuY2UuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuOC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAdHlwZWRlZm4gSWR4ID0gU3RyaW5nIHwgSW50IHwgU3ltYm9sXG4gKiBAc2lnIFtJZHhdIC0+IGEgLT4ge2F9IC0+IHthfVxuICogQHBhcmFtIHtBcnJheX0gcGF0aCB0aGUgcGF0aCB0byBzZXRcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSBuZXcgdmFsdWVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBjbG9uZVxuICogQHJldHVybiB7T2JqZWN0fSBBIG5ldyBvYmplY3QgZXF1aXZhbGVudCB0byB0aGUgb3JpZ2luYWwgZXhjZXB0IGFsb25nIHRoZSBzcGVjaWZpZWQgcGF0aC5cbiAqIEBzZWUgUi5kaXNzb2NQYXRoXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5hc3NvY1BhdGgoWydhJywgJ2InLCAnYyddLCA0Miwge2E6IHtiOiB7YzogMH19fSk7IC8vPT4ge2E6IHtiOiB7YzogNDJ9fX1cbiAqXG4gKiAgICAgIC8vIEFueSBtaXNzaW5nIG9yIG5vbi1vYmplY3Qga2V5cyBpbiBwYXRoIHdpbGwgYmUgb3ZlcnJpZGRlblxuICogICAgICBSLmFzc29jUGF0aChbJ2EnLCAnYicsICdjJ10sIDQyLCB7YTogNX0pOyAvLz0+IHthOiB7Yjoge2M6IDQyfX19XG4gKi9cbnZhciBhc3NvY1BhdGggPSAvKiNfX1BVUkVfXyovX2N1cnJ5MyhmdW5jdGlvbiBhc3NvY1BhdGgocGF0aCwgdmFsLCBvYmopIHtcbiAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuICB2YXIgaWR4ID0gcGF0aFswXTtcbiAgaWYgKHBhdGgubGVuZ3RoID4gMSkge1xuICAgIHZhciBuZXh0T2JqID0gIWlzTmlsKG9iaikgJiYgX2hhcyhpZHgsIG9iaikgJiYgdHlwZW9mIG9ialtpZHhdID09PSAnb2JqZWN0JyA/IG9ialtpZHhdIDogX2lzSW50ZWdlcihwYXRoWzFdKSA/IFtdIDoge307XG4gICAgdmFsID0gYXNzb2NQYXRoKEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHBhdGgsIDEpLCB2YWwsIG5leHRPYmopO1xuICB9XG4gIHJldHVybiBfYXNzb2MoaWR4LCB2YWwsIG9iaik7XG59KTtcbmV4cG9ydCBkZWZhdWx0IGFzc29jUGF0aDsiLCJpbXBvcnQgX2FyaXR5IGZyb20gXCIuL2ludGVybmFsL19hcml0eS5qc1wiO1xuaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGlzIGJvdW5kIHRvIGEgY29udGV4dC5cbiAqIE5vdGU6IGBSLmJpbmRgIGRvZXMgbm90IHByb3ZpZGUgdGhlIGFkZGl0aW9uYWwgYXJndW1lbnQtYmluZGluZyBjYXBhYmlsaXRpZXMgb2ZcbiAqIFtGdW5jdGlvbi5wcm90b3R5cGUuYmluZF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRnVuY3Rpb24vYmluZCkuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuNi4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcgKCogLT4gKikgLT4geyp9IC0+ICgqIC0+ICopXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gYmluZCB0byBjb250ZXh0XG4gKiBAcGFyYW0ge09iamVjdH0gdGhpc09iaiBUaGUgY29udGV4dCB0byBiaW5kIGBmbmAgdG9cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIHRoYXQgd2lsbCBleGVjdXRlIGluIHRoZSBjb250ZXh0IG9mIGB0aGlzT2JqYC5cbiAqIEBzZWUgUi5wYXJ0aWFsXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgbG9nID0gUi5iaW5kKGNvbnNvbGUubG9nLCBjb25zb2xlKTtcbiAqICAgICAgUi5waXBlKFIuYXNzb2MoJ2EnLCAyKSwgUi50YXAobG9nKSwgUi5hc3NvYygnYScsIDMpKSh7YTogMX0pOyAvLz0+IHthOiAzfVxuICogICAgICAvLyBsb2dzIHthOiAyfVxuICogQHN5bWIgUi5iaW5kKGYsIG8pKGEsIGIpID0gZi5jYWxsKG8sIGEsIGIpXG4gKi9cbnZhciBiaW5kID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gYmluZChmbiwgdGhpc09iaikge1xuICByZXR1cm4gX2FyaXR5KGZuLmxlbmd0aCwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBmbi5hcHBseSh0aGlzT2JqLCBhcmd1bWVudHMpO1xuICB9KTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgYmluZDsiLCJpbXBvcnQgX2Nsb25lIGZyb20gXCIuL2ludGVybmFsL19jbG9uZS5qc1wiO1xuaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5MS5qc1wiO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBkZWVwIGNvcHkgb2YgdGhlIHNvdXJjZSB0aGF0IGNhbiBiZSB1c2VkIGluIHBsYWNlIG9mIHRoZSBzb3VyY2VcbiAqIG9iamVjdCB3aXRob3V0IHJldGFpbmluZyBhbnkgcmVmZXJlbmNlcyB0byBpdC5cbiAqIFRoZSBzb3VyY2Ugb2JqZWN0IG1heSBjb250YWluIChuZXN0ZWQpIGBBcnJheWBzIGFuZCBgT2JqZWN0YHMsXG4gKiBgTnVtYmVyYHMsIGBTdHJpbmdgcywgYEJvb2xlYW5gcyBhbmQgYERhdGVgcy5cbiAqIGBGdW5jdGlvbmBzIGFyZSBhc3NpZ25lZCBieSByZWZlcmVuY2UgcmF0aGVyIHRoYW4gY29waWVkLlxuICpcbiAqIERpc3BhdGNoZXMgdG8gYSBgY2xvbmVgIG1ldGhvZCBpZiBwcmVzZW50LlxuICpcbiAqIE5vdGUgdGhhdCBpZiB0aGUgc291cmNlIG9iamVjdCBoYXMgbXVsdGlwbGUgbm9kZXMgdGhhdCBzaGFyZSBhIHJlZmVyZW5jZSxcbiAqIHRoZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBoYXZlIHRoZSBzYW1lIHN0cnVjdHVyZSwgYnV0IHRoZSByZWZlcmVuY2VzIHdpbGxcbiAqIGJlIHBvaW50ZWQgdG8gdGhlIGxvY2F0aW9uIHdpdGhpbiB0aGUgY2xvbmVkIHZhbHVlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyB7Kn0gLT4geyp9XG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSBvYmplY3Qgb3IgYXJyYXkgdG8gY2xvbmVcbiAqIEByZXR1cm4geyp9IEEgZGVlcGx5IGNsb25lZCBjb3B5IG9mIGB2YWxgXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3Qgb2JqZWN0cyA9IFt7fSwge30sIHt9XTtcbiAqICAgICAgY29uc3Qgb2JqZWN0c0Nsb25lID0gUi5jbG9uZShvYmplY3RzKTtcbiAqICAgICAgb2JqZWN0cyA9PT0gb2JqZWN0c0Nsb25lOyAvLz0+IGZhbHNlXG4gKiAgICAgIG9iamVjdHNbMF0gPT09IG9iamVjdHNDbG9uZVswXTsgLy89PiBmYWxzZVxuICovXG52YXIgY2xvbmUgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MShmdW5jdGlvbiBjbG9uZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUuY2xvbmUgPT09ICdmdW5jdGlvbicgPyB2YWx1ZS5jbG9uZSgpIDogX2Nsb25lKHZhbHVlLCB0cnVlKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgY2xvbmU7IiwiaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5MS5qc1wiO1xuXG4vKipcbiAqIE1ha2VzIGEgY29tcGFyYXRvciBmdW5jdGlvbiBvdXQgb2YgYSBmdW5jdGlvbiB0aGF0IHJlcG9ydHMgd2hldGhlciB0aGUgZmlyc3RcbiAqIGVsZW1lbnQgaXMgbGVzcyB0aGFuIHRoZSBzZWNvbmQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBzaWcgKChhLCBiKSAtPiBCb29sZWFuKSAtPiAoKGEsIGIpIC0+IE51bWJlcilcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWQgQSBwcmVkaWNhdGUgZnVuY3Rpb24gb2YgYXJpdHkgdHdvIHdoaWNoIHdpbGwgcmV0dXJuIGB0cnVlYCBpZiB0aGUgZmlyc3QgYXJndW1lbnRcbiAqIGlzIGxlc3MgdGhhbiB0aGUgc2Vjb25kLCBgZmFsc2VgIG90aGVyd2lzZVxuICogQHJldHVybiB7RnVuY3Rpb259IEEgRnVuY3Rpb24gOjogYSAtPiBiIC0+IEludCB0aGF0IHJldHVybnMgYC0xYCBpZiBhIDwgYiwgYDFgIGlmIGIgPCBhLCBvdGhlcndpc2UgYDBgXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgYnlBZ2UgPSBSLmNvbXBhcmF0b3IoKGEsIGIpID0+IGEuYWdlIDwgYi5hZ2UpO1xuICogICAgICBjb25zdCBwZW9wbGUgPSBbXG4gKiAgICAgICAgeyBuYW1lOiAnRW1tYScsIGFnZTogNzAgfSxcbiAqICAgICAgICB7IG5hbWU6ICdQZXRlcicsIGFnZTogNzggfSxcbiAqICAgICAgICB7IG5hbWU6ICdNaWtoYWlsJywgYWdlOiA2MiB9LFxuICogICAgICBdO1xuICogICAgICBjb25zdCBwZW9wbGVCeUluY3JlYXNpbmdBZ2UgPSBSLnNvcnQoYnlBZ2UsIHBlb3BsZSk7XG4gKiAgICAgICAgLy89PiBbeyBuYW1lOiAnTWlraGFpbCcsIGFnZTogNjIgfSx7IG5hbWU6ICdFbW1hJywgYWdlOiA3MCB9LCB7IG5hbWU6ICdQZXRlcicsIGFnZTogNzggfV1cbiAqL1xudmFyIGNvbXBhcmF0b3IgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MShmdW5jdGlvbiBjb21wYXJhdG9yKHByZWQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIHByZWQoYSwgYikgPyAtMSA6IHByZWQoYiwgYSkgPyAxIDogMDtcbiAgfTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgY29tcGFyYXRvcjsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX2lzQXJyYXkgZnJvbSBcIi4vaW50ZXJuYWwvX2lzQXJyYXkuanNcIjtcbmltcG9ydCBfaXNGdW5jdGlvbiBmcm9tIFwiLi9pbnRlcm5hbC9faXNGdW5jdGlvbi5qc1wiO1xuaW1wb3J0IF9pc1N0cmluZyBmcm9tIFwiLi9pbnRlcm5hbC9faXNTdHJpbmcuanNcIjtcbmltcG9ydCB0b1N0cmluZyBmcm9tIFwiLi90b1N0cmluZy5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBjb25jYXRlbmF0aW5nIHRoZSBnaXZlbiBsaXN0cyBvciBzdHJpbmdzLlxuICpcbiAqIE5vdGU6IGBSLmNvbmNhdGAgZXhwZWN0cyBib3RoIGFyZ3VtZW50cyB0byBiZSBvZiB0aGUgc2FtZSB0eXBlLFxuICogdW5saWtlIHRoZSBuYXRpdmUgYEFycmF5LnByb3RvdHlwZS5jb25jYXRgIG1ldGhvZC4gSXQgd2lsbCB0aHJvd1xuICogYW4gZXJyb3IgaWYgeW91IGBjb25jYXRgIGFuIEFycmF5IHdpdGggYSBub24tQXJyYXkgdmFsdWUuXG4gKlxuICogRGlzcGF0Y2hlcyB0byB0aGUgYGNvbmNhdGAgbWV0aG9kIG9mIHRoZSBmaXJzdCBhcmd1bWVudCwgaWYgcHJlc2VudC5cbiAqIENhbiBhbHNvIGNvbmNhdGVuYXRlIHR3byBtZW1iZXJzIG9mIGEgW2ZhbnRhc3ktbGFuZFxuICogY29tcGF0aWJsZSBzZW1pZ3JvdXBdKGh0dHBzOi8vZ2l0aHViLmNvbS9mYW50YXN5bGFuZC9mYW50YXN5LWxhbmQjc2VtaWdyb3VwKS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIFthXSAtPiBbYV0gLT4gW2FdXG4gKiBAc2lnIFN0cmluZyAtPiBTdHJpbmcgLT4gU3RyaW5nXG4gKiBAcGFyYW0ge0FycmF5fFN0cmluZ30gZmlyc3RMaXN0IFRoZSBmaXJzdCBsaXN0XG4gKiBAcGFyYW0ge0FycmF5fFN0cmluZ30gc2Vjb25kTGlzdCBUaGUgc2Vjb25kIGxpc3RcbiAqIEByZXR1cm4ge0FycmF5fFN0cmluZ30gQSBsaXN0IGNvbnNpc3Rpbmcgb2YgdGhlIGVsZW1lbnRzIG9mIGBmaXJzdExpc3RgIGZvbGxvd2VkIGJ5IHRoZSBlbGVtZW50cyBvZlxuICogYHNlY29uZExpc3RgLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmNvbmNhdCgnQUJDJywgJ0RFRicpOyAvLyAnQUJDREVGJ1xuICogICAgICBSLmNvbmNhdChbNCwgNSwgNl0sIFsxLCAyLCAzXSk7IC8vPT4gWzQsIDUsIDYsIDEsIDIsIDNdXG4gKiAgICAgIFIuY29uY2F0KFtdLCBbXSk7IC8vPT4gW11cbiAqL1xudmFyIGNvbmNhdCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIGNvbmNhdChhLCBiKSB7XG4gIGlmIChfaXNBcnJheShhKSkge1xuICAgIGlmIChfaXNBcnJheShiKSkge1xuICAgICAgcmV0dXJuIGEuY29uY2F0KGIpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHRvU3RyaW5nKGIpICsgJyBpcyBub3QgYW4gYXJyYXknKTtcbiAgfVxuICBpZiAoX2lzU3RyaW5nKGEpKSB7XG4gICAgaWYgKF9pc1N0cmluZyhiKSkge1xuICAgICAgcmV0dXJuIGEgKyBiO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHRvU3RyaW5nKGIpICsgJyBpcyBub3QgYSBzdHJpbmcnKTtcbiAgfVxuICBpZiAoYSAhPSBudWxsICYmIF9pc0Z1bmN0aW9uKGFbJ2ZhbnRhc3ktbGFuZC9jb25jYXQnXSkpIHtcbiAgICByZXR1cm4gYVsnZmFudGFzeS1sYW5kL2NvbmNhdCddKGIpO1xuICB9XG4gIGlmIChhICE9IG51bGwgJiYgX2lzRnVuY3Rpb24oYS5jb25jYXQpKSB7XG4gICAgcmV0dXJuIGEuY29uY2F0KGIpO1xuICB9XG4gIHRocm93IG5ldyBUeXBlRXJyb3IodG9TdHJpbmcoYSkgKyAnIGRvZXMgbm90IGhhdmUgYSBtZXRob2QgbmFtZWQgXCJjb25jYXRcIiBvciBcImZhbnRhc3ktbGFuZC9jb25jYXRcIicpO1xufSk7XG5leHBvcnQgZGVmYXVsdCBjb25jYXQ7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9tYXAgZnJvbSBcIi4vaW50ZXJuYWwvX21hcC5qc1wiO1xuaW1wb3J0IGN1cnJ5TiBmcm9tIFwiLi9jdXJyeU4uanNcIjtcbmltcG9ydCBtYXggZnJvbSBcIi4vbWF4LmpzXCI7XG5pbXBvcnQgcGx1Y2sgZnJvbSBcIi4vcGx1Y2suanNcIjtcbmltcG9ydCByZWR1Y2UgZnJvbSBcIi4vcmVkdWNlLmpzXCI7XG5cbi8qKlxuICogQWNjZXB0cyBhIGNvbnZlcmdpbmcgZnVuY3Rpb24gYW5kIGEgbGlzdCBvZiBicmFuY2hpbmcgZnVuY3Rpb25zIGFuZCByZXR1cm5zXG4gKiBhIG5ldyBmdW5jdGlvbi4gVGhlIGFyaXR5IG9mIHRoZSBuZXcgZnVuY3Rpb24gaXMgdGhlIHNhbWUgYXMgdGhlIGFyaXR5IG9mXG4gKiB0aGUgbG9uZ2VzdCBicmFuY2hpbmcgZnVuY3Rpb24uIFdoZW4gaW52b2tlZCwgdGhpcyBuZXcgZnVuY3Rpb24gaXMgYXBwbGllZFxuICogdG8gc29tZSBhcmd1bWVudHMsIGFuZCBlYWNoIGJyYW5jaGluZyBmdW5jdGlvbiBpcyBhcHBsaWVkIHRvIHRob3NlIHNhbWVcbiAqIGFyZ3VtZW50cy4gVGhlIHJlc3VsdHMgb2YgZWFjaCBicmFuY2hpbmcgZnVuY3Rpb24gYXJlIHBhc3NlZCBhcyBhcmd1bWVudHNcbiAqIHRvIHRoZSBjb252ZXJnaW5nIGZ1bmN0aW9uIHRvIHByb2R1Y2UgdGhlIHJldHVybiB2YWx1ZS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC40LjJcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyAoKHgxLCB4MiwgLi4uKSAtPiB6KSAtPiBbKChhLCBiLCAuLi4pIC0+IHgxKSwgKChhLCBiLCAuLi4pIC0+IHgyKSwgLi4uXSAtPiAoYSAtPiBiIC0+IC4uLiAtPiB6KVxuICogQHBhcmFtIHtGdW5jdGlvbn0gYWZ0ZXIgQSBmdW5jdGlvbi4gYGFmdGVyYCB3aWxsIGJlIGludm9rZWQgd2l0aCB0aGUgcmV0dXJuIHZhbHVlcyBvZlxuICogICAgICAgIGBmbjFgIGFuZCBgZm4yYCBhcyBpdHMgYXJndW1lbnRzLlxuICogQHBhcmFtIHtBcnJheX0gZnVuY3Rpb25zIEEgbGlzdCBvZiBmdW5jdGlvbnMuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBuZXcgZnVuY3Rpb24uXG4gKiBAc2VlIFIudXNlV2l0aFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IGF2ZXJhZ2UgPSBSLmNvbnZlcmdlKFIuZGl2aWRlLCBbUi5zdW0sIFIubGVuZ3RoXSlcbiAqICAgICAgYXZlcmFnZShbMSwgMiwgMywgNCwgNSwgNiwgN10pIC8vPT4gNFxuICpcbiAqICAgICAgY29uc3Qgc3RyYW5nZUNvbmNhdCA9IFIuY29udmVyZ2UoUi5jb25jYXQsIFtSLnRvVXBwZXIsIFIudG9Mb3dlcl0pXG4gKiAgICAgIHN0cmFuZ2VDb25jYXQoXCJZb2RlbFwiKSAvLz0+IFwiWU9ERUx5b2RlbFwiXG4gKlxuICogQHN5bWIgUi5jb252ZXJnZShmLCBbZywgaF0pKGEsIGIpID0gZihnKGEsIGIpLCBoKGEsIGIpKVxuICovXG52YXIgY29udmVyZ2UgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiBjb252ZXJnZShhZnRlciwgZm5zKSB7XG4gIHJldHVybiBjdXJyeU4ocmVkdWNlKG1heCwgMCwgcGx1Y2soJ2xlbmd0aCcsIGZucykpLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgdmFyIGNvbnRleHQgPSB0aGlzO1xuICAgIHJldHVybiBhZnRlci5hcHBseShjb250ZXh0LCBfbWFwKGZ1bmN0aW9uIChmbikge1xuICAgICAgcmV0dXJuIGZuLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgIH0sIGZucykpO1xuICB9KTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgY29udmVyZ2U7IiwiaW1wb3J0IF9hcml0eSBmcm9tIFwiLi9pbnRlcm5hbC9fYXJpdHkuanNcIjtcbmltcG9ydCBfY3VycnkxIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTEuanNcIjtcbmltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfY3VycnlOIGZyb20gXCIuL2ludGVybmFsL19jdXJyeU4uanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgY3VycmllZCBlcXVpdmFsZW50IG9mIHRoZSBwcm92aWRlZCBmdW5jdGlvbiwgd2l0aCB0aGUgc3BlY2lmaWVkXG4gKiBhcml0eS4gVGhlIGN1cnJpZWQgZnVuY3Rpb24gaGFzIHR3byB1bnVzdWFsIGNhcGFiaWxpdGllcy4gRmlyc3QsIGl0c1xuICogYXJndW1lbnRzIG5lZWRuJ3QgYmUgcHJvdmlkZWQgb25lIGF0IGEgdGltZS4gSWYgYGdgIGlzIGBSLmN1cnJ5TigzLCBmKWAsIHRoZVxuICogZm9sbG93aW5nIGFyZSBlcXVpdmFsZW50OlxuICpcbiAqICAgLSBgZygxKSgyKSgzKWBcbiAqICAgLSBgZygxKSgyLCAzKWBcbiAqICAgLSBgZygxLCAyKSgzKWBcbiAqICAgLSBgZygxLCAyLCAzKWBcbiAqXG4gKiBTZWNvbmRseSwgdGhlIHNwZWNpYWwgcGxhY2Vob2xkZXIgdmFsdWUgW2BSLl9fYF0oI19fKSBtYXkgYmUgdXNlZCB0byBzcGVjaWZ5XG4gKiBcImdhcHNcIiwgYWxsb3dpbmcgcGFydGlhbCBhcHBsaWNhdGlvbiBvZiBhbnkgY29tYmluYXRpb24gb2YgYXJndW1lbnRzLFxuICogcmVnYXJkbGVzcyBvZiB0aGVpciBwb3NpdGlvbnMuIElmIGBnYCBpcyBhcyBhYm92ZSBhbmQgYF9gIGlzIFtgUi5fX2BdKCNfXyksXG4gKiB0aGUgZm9sbG93aW5nIGFyZSBlcXVpdmFsZW50OlxuICpcbiAqICAgLSBgZygxLCAyLCAzKWBcbiAqICAgLSBgZyhfLCAyLCAzKSgxKWBcbiAqICAgLSBgZyhfLCBfLCAzKSgxKSgyKWBcbiAqICAgLSBgZyhfLCBfLCAzKSgxLCAyKWBcbiAqICAgLSBgZyhfLCAyKSgxKSgzKWBcbiAqICAgLSBgZyhfLCAyKSgxLCAzKWBcbiAqICAgLSBgZyhfLCAyKShfLCAzKSgxKWBcbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC41LjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyBOdW1iZXIgLT4gKCogLT4gYSkgLT4gKCogLT4gYSlcbiAqIEBwYXJhbSB7TnVtYmVyfSBsZW5ndGggVGhlIGFyaXR5IGZvciB0aGUgcmV0dXJuZWQgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gY3VycnkuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBuZXcsIGN1cnJpZWQgZnVuY3Rpb24uXG4gKiBAc2VlIFIuY3VycnlcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBzdW1BcmdzID0gKC4uLmFyZ3MpID0+IFIuc3VtKGFyZ3MpO1xuICpcbiAqICAgICAgY29uc3QgY3VycmllZEFkZEZvdXJOdW1iZXJzID0gUi5jdXJyeU4oNCwgc3VtQXJncyk7XG4gKiAgICAgIGNvbnN0IGYgPSBjdXJyaWVkQWRkRm91ck51bWJlcnMoMSwgMik7XG4gKiAgICAgIGNvbnN0IGcgPSBmKDMpO1xuICogICAgICBnKDQpOyAvLz0+IDEwXG4gKi9cbnZhciBjdXJyeU4gPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiBjdXJyeU4obGVuZ3RoLCBmbikge1xuICBpZiAobGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIF9jdXJyeTEoZm4pO1xuICB9XG4gIHJldHVybiBfYXJpdHkobGVuZ3RoLCBfY3VycnlOKGxlbmd0aCwgW10sIGZuKSk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IGN1cnJ5TjsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgc2Vjb25kIGFyZ3VtZW50IGlmIGl0IGlzIG5vdCBgbnVsbGAsIGB1bmRlZmluZWRgIG9yIGBOYU5gO1xuICogb3RoZXJ3aXNlIHRoZSBmaXJzdCBhcmd1bWVudCBpcyByZXR1cm5lZC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xMC4wXG4gKiBAY2F0ZWdvcnkgTG9naWNcbiAqIEBzaWcgYSAtPiBiIC0+IGEgfCBiXG4gKiBAcGFyYW0ge2F9IGRlZmF1bHQgVGhlIGRlZmF1bHQgdmFsdWUuXG4gKiBAcGFyYW0ge2J9IHZhbCBgdmFsYCB3aWxsIGJlIHJldHVybmVkIGluc3RlYWQgb2YgYGRlZmF1bHRgIHVubGVzcyBgdmFsYCBpcyBgbnVsbGAsIGB1bmRlZmluZWRgIG9yIGBOYU5gLlxuICogQHJldHVybiB7Kn0gVGhlIHNlY29uZCB2YWx1ZSBpZiBpdCBpcyBub3QgYG51bGxgLCBgdW5kZWZpbmVkYCBvciBgTmFOYCwgb3RoZXJ3aXNlIHRoZSBkZWZhdWx0IHZhbHVlXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgZGVmYXVsdFRvNDIgPSBSLmRlZmF1bHRUbyg0Mik7XG4gKlxuICogICAgICBkZWZhdWx0VG80MihudWxsKTsgIC8vPT4gNDJcbiAqICAgICAgZGVmYXVsdFRvNDIodW5kZWZpbmVkKTsgIC8vPT4gNDJcbiAqICAgICAgZGVmYXVsdFRvNDIoZmFsc2UpOyAgLy89PiBmYWxzZVxuICogICAgICBkZWZhdWx0VG80MignUmFtZGEnKTsgIC8vPT4gJ1JhbWRhJ1xuICogICAgICAvLyBwYXJzZUludCgnc3RyaW5nJykgcmVzdWx0cyBpbiBOYU5cbiAqICAgICAgZGVmYXVsdFRvNDIocGFyc2VJbnQoJ3N0cmluZycpKTsgLy89PiA0MlxuICovXG52YXIgZGVmYXVsdFRvID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gZGVmYXVsdFRvKGQsIHYpIHtcbiAgcmV0dXJuIHYgPT0gbnVsbCB8fCB2ICE9PSB2ID8gZCA6IHY7XG59KTtcbmV4cG9ydCBkZWZhdWx0IGRlZmF1bHRUbzsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX1NldCBmcm9tIFwiLi9pbnRlcm5hbC9fU2V0LmpzXCI7XG5cbi8qKlxuICogRmluZHMgdGhlIHNldCAoaS5lLiBubyBkdXBsaWNhdGVzKSBvZiBhbGwgZWxlbWVudHMgaW4gdGhlIGZpcnN0IGxpc3Qgbm90XG4gKiBjb250YWluZWQgaW4gdGhlIHNlY29uZCBsaXN0LiBPYmplY3RzIGFuZCBBcnJheXMgYXJlIGNvbXBhcmVkIGluIHRlcm1zIG9mXG4gKiB2YWx1ZSBlcXVhbGl0eSwgbm90IHJlZmVyZW5jZSBlcXVhbGl0eS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBSZWxhdGlvblxuICogQHNpZyBbKl0gLT4gWypdIC0+IFsqXVxuICogQHBhcmFtIHtBcnJheX0gbGlzdDEgVGhlIGZpcnN0IGxpc3QuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0MiBUaGUgc2Vjb25kIGxpc3QuXG4gKiBAcmV0dXJuIHtBcnJheX0gVGhlIGVsZW1lbnRzIGluIGBsaXN0MWAgdGhhdCBhcmUgbm90IGluIGBsaXN0MmAuXG4gKiBAc2VlIFIuZGlmZmVyZW5jZVdpdGgsIFIuc3ltbWV0cmljRGlmZmVyZW5jZSwgUi5zeW1tZXRyaWNEaWZmZXJlbmNlV2l0aCwgUi53aXRob3V0XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5kaWZmZXJlbmNlKFsxLDIsMyw0XSwgWzcsNiw1LDQsM10pOyAvLz0+IFsxLDJdXG4gKiAgICAgIFIuZGlmZmVyZW5jZShbNyw2LDUsNCwzXSwgWzEsMiwzLDRdKTsgLy89PiBbNyw2LDVdXG4gKiAgICAgIFIuZGlmZmVyZW5jZShbe2E6IDF9LCB7YjogMn1dLCBbe2E6IDF9LCB7YzogM31dKSAvLz0+IFt7YjogMn1dXG4gKi9cbnZhciBkaWZmZXJlbmNlID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gZGlmZmVyZW5jZShmaXJzdCwgc2Vjb25kKSB7XG4gIHZhciBvdXQgPSBbXTtcbiAgdmFyIGlkeCA9IDA7XG4gIHZhciBmaXJzdExlbiA9IGZpcnN0Lmxlbmd0aDtcbiAgdmFyIHNlY29uZExlbiA9IHNlY29uZC5sZW5ndGg7XG4gIHZhciB0b0ZpbHRlck91dCA9IG5ldyBfU2V0KCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc2Vjb25kTGVuOyBpICs9IDEpIHtcbiAgICB0b0ZpbHRlck91dC5hZGQoc2Vjb25kW2ldKTtcbiAgfVxuICB3aGlsZSAoaWR4IDwgZmlyc3RMZW4pIHtcbiAgICBpZiAodG9GaWx0ZXJPdXQuYWRkKGZpcnN0W2lkeF0pKSB7XG4gICAgICBvdXRbb3V0Lmxlbmd0aF0gPSBmaXJzdFtpZHhdO1xuICAgIH1cbiAgICBpZHggKz0gMTtcbiAgfVxuICByZXR1cm4gb3V0O1xufSk7XG5leHBvcnQgZGVmYXVsdCBkaWZmZXJlbmNlOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBkaXNzb2NQYXRoIGZyb20gXCIuL2Rpc3NvY1BhdGguanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IG9iamVjdCB0aGF0IGRvZXMgbm90IGNvbnRhaW4gYSBgcHJvcGAgcHJvcGVydHkuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTAuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyBTdHJpbmcgLT4ge2s6IHZ9IC0+IHtrOiB2fVxuICogQHBhcmFtIHtTdHJpbmd9IHByb3AgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGRpc3NvY2lhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBjbG9uZVxuICogQHJldHVybiB7T2JqZWN0fSBBIG5ldyBvYmplY3QgZXF1aXZhbGVudCB0byB0aGUgb3JpZ2luYWwgYnV0IHdpdGhvdXQgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eVxuICogQHNlZSBSLmFzc29jLCBSLm9taXRcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmRpc3NvYygnYicsIHthOiAxLCBiOiAyLCBjOiAzfSk7IC8vPT4ge2E6IDEsIGM6IDN9XG4gKi9cbnZhciBkaXNzb2MgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiBkaXNzb2MocHJvcCwgb2JqKSB7XG4gIHJldHVybiBkaXNzb2NQYXRoKFtwcm9wXSwgb2JqKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgZGlzc29jOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfZGlzc29jIGZyb20gXCIuL2ludGVybmFsL19kaXNzb2MuanNcIjtcbmltcG9ydCBfaXNJbnRlZ2VyIGZyb20gXCIuL2ludGVybmFsL19pc0ludGVnZXIuanNcIjtcbmltcG9ydCBfaXNBcnJheSBmcm9tIFwiLi9pbnRlcm5hbC9faXNBcnJheS5qc1wiO1xuaW1wb3J0IGFzc29jIGZyb20gXCIuL2Fzc29jLmpzXCI7XG5cbi8qKlxuICogTWFrZXMgYSBzaGFsbG93IGNsb25lIG9mIGFuIG9iamVjdC4gTm90ZSB0aGF0IHRoaXMgY29waWVzIGFuZCBmbGF0dGVuc1xuICogcHJvdG90eXBlIHByb3BlcnRpZXMgb250byB0aGUgbmV3IG9iamVjdCBhcyB3ZWxsLiBBbGwgbm9uLXByaW1pdGl2ZVxuICogcHJvcGVydGllcyBhcmUgY29waWVkIGJ5IHJlZmVyZW5jZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtTdHJpbmd8SW50ZWdlcn0gcHJvcCBUaGUgcHJvcCBvcGVyYXRpbmdcbiAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fSBvYmogVGhlIG9iamVjdCB0byBjbG9uZVxuICogQHJldHVybiB7T2JqZWN0fEFycmF5fSBBIG5ldyBvYmplY3QgZXF1aXZhbGVudCB0byB0aGUgb3JpZ2luYWwuXG4gKi9cbmZ1bmN0aW9uIF9zaGFsbG93Q2xvbmVPYmplY3QocHJvcCwgb2JqKSB7XG4gIGlmIChfaXNJbnRlZ2VyKHByb3ApICYmIF9pc0FycmF5KG9iaikpIHtcbiAgICByZXR1cm4gW10uY29uY2F0KG9iaik7XG4gIH1cbiAgdmFyIHJlc3VsdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIG9iaikge1xuICAgIHJlc3VsdFtwXSA9IG9ialtwXTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIE1ha2VzIGEgc2hhbGxvdyBjbG9uZSBvZiBhbiBvYmplY3QsIG9taXR0aW5nIHRoZSBwcm9wZXJ0eSBhdCB0aGUgZ2l2ZW4gcGF0aC5cbiAqIE5vdGUgdGhhdCB0aGlzIGNvcGllcyBhbmQgZmxhdHRlbnMgcHJvdG90eXBlIHByb3BlcnRpZXMgb250byB0aGUgbmV3IG9iamVjdFxuICogYXMgd2VsbC4gQWxsIG5vbi1wcmltaXRpdmUgcHJvcGVydGllcyBhcmUgY29waWVkIGJ5IHJlZmVyZW5jZS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xMS4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAdHlwZWRlZm4gSWR4ID0gU3RyaW5nIHwgSW50IHwgU3ltYm9sXG4gKiBAc2lnIFtJZHhdIC0+IHtrOiB2fSAtPiB7azogdn1cbiAqIEBwYXJhbSB7QXJyYXl9IHBhdGggVGhlIHBhdGggdG8gdGhlIHZhbHVlIHRvIG9taXRcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBjbG9uZVxuICogQHJldHVybiB7T2JqZWN0fSBBIG5ldyBvYmplY3Qgd2l0aG91dCB0aGUgcHJvcGVydHkgYXQgcGF0aFxuICogQHNlZSBSLmFzc29jUGF0aFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuZGlzc29jUGF0aChbJ2EnLCAnYicsICdjJ10sIHthOiB7Yjoge2M6IDQyfX19KTsgLy89PiB7YToge2I6IHt9fX1cbiAqL1xudmFyIGRpc3NvY1BhdGggPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiBkaXNzb2NQYXRoKHBhdGgsIG9iaikge1xuICBpZiAob2JqID09IG51bGwpIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG4gIHN3aXRjaCAocGF0aC5sZW5ndGgpIHtcbiAgICBjYXNlIDA6XG4gICAgICByZXR1cm4gb2JqO1xuICAgIGNhc2UgMTpcbiAgICAgIHJldHVybiBfZGlzc29jKHBhdGhbMF0sIG9iaik7XG4gICAgZGVmYXVsdDpcbiAgICAgIHZhciBoZWFkID0gcGF0aFswXTtcbiAgICAgIHZhciB0YWlsID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwocGF0aCwgMSk7XG4gICAgICBpZiAob2JqW2hlYWRdID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIF9zaGFsbG93Q2xvbmVPYmplY3QoaGVhZCwgb2JqKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBhc3NvYyhoZWFkLCBkaXNzb2NQYXRoKHRhaWwsIG9ialtoZWFkXSksIG9iaik7XG4gICAgICB9XG4gIH1cbn0pO1xuZXhwb3J0IGRlZmF1bHQgZGlzc29jUGF0aDsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5pbXBvcnQgX2lzQXJndW1lbnRzIGZyb20gXCIuL2ludGVybmFsL19pc0FyZ3VtZW50cy5qc1wiO1xuaW1wb3J0IF9pc0FycmF5IGZyb20gXCIuL2ludGVybmFsL19pc0FycmF5LmpzXCI7XG5pbXBvcnQgX2lzT2JqZWN0IGZyb20gXCIuL2ludGVybmFsL19pc09iamVjdC5qc1wiO1xuaW1wb3J0IF9pc1N0cmluZyBmcm9tIFwiLi9pbnRlcm5hbC9faXNTdHJpbmcuanNcIjtcbmltcG9ydCBfaXNUeXBlZEFycmF5IGZyb20gXCIuL2ludGVybmFsL19pc1R5cGVkQXJyYXkuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBlbXB0eSB2YWx1ZSBvZiBpdHMgYXJndW1lbnQncyB0eXBlLiBSYW1kYSBkZWZpbmVzIHRoZSBlbXB0eVxuICogdmFsdWUgb2YgQXJyYXkgKGBbXWApLCBPYmplY3QgKGB7fWApLCBTdHJpbmcgKGAnJ2ApLFxuICogVHlwZWRBcnJheSAoYFVpbnQ4QXJyYXkgW11gLCBgRmxvYXQzMkFycmF5IFtdYCwgZXRjKSwgYW5kIEFyZ3VtZW50cy4gT3RoZXJcbiAqIHR5cGVzIGFyZSBzdXBwb3J0ZWQgaWYgdGhleSBkZWZpbmUgYDxUeXBlPi5lbXB0eWAsXG4gKiBgPFR5cGU+LnByb3RvdHlwZS5lbXB0eWAgb3IgaW1wbGVtZW50IHRoZVxuICogW0ZhbnRhc3lMYW5kIE1vbm9pZCBzcGVjXShodHRwczovL2dpdGh1Yi5jb20vZmFudGFzeWxhbmQvZmFudGFzeS1sYW5kI21vbm9pZCkuXG4gKlxuICogRGlzcGF0Y2hlcyB0byB0aGUgYGVtcHR5YCBtZXRob2Qgb2YgdGhlIGZpcnN0IGFyZ3VtZW50LCBpZiBwcmVzZW50LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjMuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnIGEgLT4gYVxuICogQHBhcmFtIHsqfSB4XG4gKiBAcmV0dXJuIHsqfVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuZW1wdHkoSnVzdCg0MikpOyAgICAgICAgICAgICAgIC8vPT4gTm90aGluZygpXG4gKiAgICAgIFIuZW1wdHkoWzEsIDIsIDNdKTsgICAgICAgICAgICAgIC8vPT4gW11cbiAqICAgICAgUi5lbXB0eSgndW5pY29ybnMnKTsgICAgICAgICAgICAgLy89PiAnJ1xuICogICAgICBSLmVtcHR5KHt4OiAxLCB5OiAyfSk7ICAgICAgICAgICAvLz0+IHt9XG4gKiAgICAgIFIuZW1wdHkoVWludDhBcnJheS5mcm9tKCcxMjMnKSk7IC8vPT4gVWludDhBcnJheSBbXVxuICovXG52YXIgZW1wdHkgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MShmdW5jdGlvbiBlbXB0eSh4KSB7XG4gIHJldHVybiB4ICE9IG51bGwgJiYgdHlwZW9mIHhbJ2ZhbnRhc3ktbGFuZC9lbXB0eSddID09PSAnZnVuY3Rpb24nID8geFsnZmFudGFzeS1sYW5kL2VtcHR5J10oKSA6IHggIT0gbnVsbCAmJiB4LmNvbnN0cnVjdG9yICE9IG51bGwgJiYgdHlwZW9mIHguY29uc3RydWN0b3JbJ2ZhbnRhc3ktbGFuZC9lbXB0eSddID09PSAnZnVuY3Rpb24nID8geC5jb25zdHJ1Y3RvclsnZmFudGFzeS1sYW5kL2VtcHR5J10oKSA6IHggIT0gbnVsbCAmJiB0eXBlb2YgeC5lbXB0eSA9PT0gJ2Z1bmN0aW9uJyA/IHguZW1wdHkoKSA6IHggIT0gbnVsbCAmJiB4LmNvbnN0cnVjdG9yICE9IG51bGwgJiYgdHlwZW9mIHguY29uc3RydWN0b3IuZW1wdHkgPT09ICdmdW5jdGlvbicgPyB4LmNvbnN0cnVjdG9yLmVtcHR5KCkgOiBfaXNBcnJheSh4KSA/IFtdIDogX2lzU3RyaW5nKHgpID8gJycgOiBfaXNPYmplY3QoeCkgPyB7fSA6IF9pc0FyZ3VtZW50cyh4KSA/IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzO1xuICB9KCkgOiBfaXNUeXBlZEFycmF5KHgpID8geC5jb25zdHJ1Y3Rvci5mcm9tKCcnKSA6IHZvaWQgMCAvLyBlbHNlXG4gIDtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBlbXB0eTsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX2VxdWFscyBmcm9tIFwiLi9pbnRlcm5hbC9fZXF1YWxzLmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyBgdHJ1ZWAgaWYgaXRzIGFyZ3VtZW50cyBhcmUgZXF1aXZhbGVudCwgYGZhbHNlYCBvdGhlcndpc2UuIEhhbmRsZXNcbiAqIGN5Y2xpY2FsIGRhdGEgc3RydWN0dXJlcy5cbiAqXG4gKiBEaXNwYXRjaGVzIHN5bW1ldHJpY2FsbHkgdG8gdGhlIGBlcXVhbHNgIG1ldGhvZHMgb2YgYm90aCBhcmd1bWVudHMsIGlmXG4gKiBwcmVzZW50LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE1LjBcbiAqIEBjYXRlZ29yeSBSZWxhdGlvblxuICogQHNpZyBhIC0+IGIgLT4gQm9vbGVhblxuICogQHBhcmFtIHsqfSBhXG4gKiBAcGFyYW0geyp9IGJcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5lcXVhbHMoMSwgMSk7IC8vPT4gdHJ1ZVxuICogICAgICBSLmVxdWFscygxLCAnMScpOyAvLz0+IGZhbHNlXG4gKiAgICAgIFIuZXF1YWxzKFsxLCAyLCAzXSwgWzEsIDIsIDNdKTsgLy89PiB0cnVlXG4gKlxuICogICAgICBjb25zdCBhID0ge307IGEudiA9IGE7XG4gKiAgICAgIGNvbnN0IGIgPSB7fTsgYi52ID0gYjtcbiAqICAgICAgUi5lcXVhbHMoYSwgYik7IC8vPT4gdHJ1ZVxuICovXG52YXIgZXF1YWxzID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gZXF1YWxzKGEsIGIpIHtcbiAgcmV0dXJuIF9lcXVhbHMoYSwgYiwgW10sIFtdKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgZXF1YWxzOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfaXNBcnJheSBmcm9tIFwiLi9pbnRlcm5hbC9faXNBcnJheS5qc1wiO1xuaW1wb3J0IF9pc09iamVjdCBmcm9tIFwiLi9pbnRlcm5hbC9faXNPYmplY3QuanNcIjtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IG9iamVjdCBieSByZWN1cnNpdmVseSBldm9sdmluZyBhIHNoYWxsb3cgY29weSBvZiBgb2JqZWN0YCxcbiAqIGFjY29yZGluZyB0byB0aGUgYHRyYW5zZm9ybWF0aW9uYCBmdW5jdGlvbnMuIEFsbCBub24tcHJpbWl0aXZlIHByb3BlcnRpZXNcbiAqIGFyZSBjb3BpZWQgYnkgcmVmZXJlbmNlLlxuICpcbiAqIEEgYHRyYW5zZm9ybWF0aW9uYCBmdW5jdGlvbiB3aWxsIG5vdCBiZSBpbnZva2VkIGlmIGl0cyBjb3JyZXNwb25kaW5nIGtleVxuICogZG9lcyBub3QgZXhpc3QgaW4gdGhlIGV2b2x2ZWQgb2JqZWN0LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjkuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyB7azogKHYgLT4gdil9IC0+IHtrOiB2fSAtPiB7azogdn1cbiAqIEBwYXJhbSB7T2JqZWN0fSB0cmFuc2Zvcm1hdGlvbnMgVGhlIG9iamVjdCBzcGVjaWZ5aW5nIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9ucyB0byBhcHBseVxuICogICAgICAgIHRvIHRoZSBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gYmUgdHJhbnNmb3JtZWQuXG4gKiBAcmV0dXJuIHtPYmplY3R9IFRoZSB0cmFuc2Zvcm1lZCBvYmplY3QuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgdG9tYXRvID0ge2ZpcnN0TmFtZTogJyAgVG9tYXRvICcsIGRhdGE6IHtlbGFwc2VkOiAxMDAsIHJlbWFpbmluZzogMTQwMH0sIGlkOjEyM307XG4gKiAgICAgIGNvbnN0IHRyYW5zZm9ybWF0aW9ucyA9IHtcbiAqICAgICAgICBmaXJzdE5hbWU6IFIudHJpbSxcbiAqICAgICAgICBsYXN0TmFtZTogUi50cmltLCAvLyBXaWxsIG5vdCBnZXQgaW52b2tlZC5cbiAqICAgICAgICBkYXRhOiB7ZWxhcHNlZDogUi5hZGQoMSksIHJlbWFpbmluZzogUi5hZGQoLTEpfVxuICogICAgICB9O1xuICogICAgICBSLmV2b2x2ZSh0cmFuc2Zvcm1hdGlvbnMsIHRvbWF0byk7IC8vPT4ge2ZpcnN0TmFtZTogJ1RvbWF0bycsIGRhdGE6IHtlbGFwc2VkOiAxMDEsIHJlbWFpbmluZzogMTM5OX0sIGlkOjEyM31cbiAqL1xudmFyIGV2b2x2ZSA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIGV2b2x2ZSh0cmFuc2Zvcm1hdGlvbnMsIG9iamVjdCkge1xuICBpZiAoIV9pc09iamVjdChvYmplY3QpICYmICFfaXNBcnJheShvYmplY3QpKSB7XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfVxuICB2YXIgcmVzdWx0ID0gb2JqZWN0IGluc3RhbmNlb2YgQXJyYXkgPyBbXSA6IHt9O1xuICB2YXIgdHJhbnNmb3JtYXRpb24sIGtleSwgdHlwZTtcbiAgZm9yIChrZXkgaW4gb2JqZWN0KSB7XG4gICAgdHJhbnNmb3JtYXRpb24gPSB0cmFuc2Zvcm1hdGlvbnNba2V5XTtcbiAgICB0eXBlID0gdHlwZW9mIHRyYW5zZm9ybWF0aW9uO1xuICAgIHJlc3VsdFtrZXldID0gdHlwZSA9PT0gJ2Z1bmN0aW9uJyA/IHRyYW5zZm9ybWF0aW9uKG9iamVjdFtrZXldKSA6IHRyYW5zZm9ybWF0aW9uICYmIHR5cGUgPT09ICdvYmplY3QnID8gZXZvbHZlKHRyYW5zZm9ybWF0aW9uLCBvYmplY3Rba2V5XSkgOiBvYmplY3Rba2V5XTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufSk7XG5leHBvcnQgZGVmYXVsdCBldm9sdmU7IiwiaW1wb3J0IF9hcnJheVJlZHVjZSBmcm9tIFwiLi9pbnRlcm5hbC9fYXJyYXlSZWR1Y2UuanNcIjtcbmltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfZGlzcGF0Y2hhYmxlIGZyb20gXCIuL2ludGVybmFsL19kaXNwYXRjaGFibGUuanNcIjtcbmltcG9ydCBfZmlsdGVyIGZyb20gXCIuL2ludGVybmFsL19maWx0ZXIuanNcIjtcbmltcG9ydCBfaXNPYmplY3QgZnJvbSBcIi4vaW50ZXJuYWwvX2lzT2JqZWN0LmpzXCI7XG5pbXBvcnQgX3hmaWx0ZXIgZnJvbSBcIi4vaW50ZXJuYWwvX3hmaWx0ZXIuanNcIjtcbmltcG9ydCBrZXlzIGZyb20gXCIuL2tleXMuanNcIjtcblxuLyoqXG4gKiBUYWtlcyBhIHByZWRpY2F0ZSBhbmQgYSBgRmlsdGVyYWJsZWAsIGFuZCByZXR1cm5zIGEgbmV3IGZpbHRlcmFibGUgb2YgdGhlXG4gKiBzYW1lIHR5cGUgY29udGFpbmluZyB0aGUgbWVtYmVycyBvZiB0aGUgZ2l2ZW4gZmlsdGVyYWJsZSB3aGljaCBzYXRpc2Z5IHRoZVxuICogZ2l2ZW4gcHJlZGljYXRlLiBGaWx0ZXJhYmxlIG9iamVjdHMgaW5jbHVkZSBwbGFpbiBvYmplY3RzIG9yIGFueSBvYmplY3RcbiAqIHRoYXQgaGFzIGEgZmlsdGVyIG1ldGhvZCBzdWNoIGFzIGBBcnJheWAuXG4gKlxuICogRGlzcGF0Y2hlcyB0byB0aGUgYGZpbHRlcmAgbWV0aG9kIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQsIGlmIHByZXNlbnQuXG4gKlxuICogQWN0cyBhcyBhIHRyYW5zZHVjZXIgaWYgYSB0cmFuc2Zvcm1lciBpcyBnaXZlbiBpbiBsaXN0IHBvc2l0aW9uLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcgRmlsdGVyYWJsZSBmID0+IChhIC0+IEJvb2xlYW4pIC0+IGYgYSAtPiBmIGFcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRcbiAqIEBwYXJhbSB7QXJyYXl9IGZpbHRlcmFibGVcbiAqIEByZXR1cm4ge0FycmF5fSBGaWx0ZXJhYmxlXG4gKiBAc2VlIFIucmVqZWN0LCBSLnRyYW5zZHVjZSwgUi5hZGRJbmRleFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IGlzRXZlbiA9IG4gPT4gbiAlIDIgPT09IDA7XG4gKlxuICogICAgICBSLmZpbHRlcihpc0V2ZW4sIFsxLCAyLCAzLCA0XSk7IC8vPT4gWzIsIDRdXG4gKlxuICogICAgICBSLmZpbHRlcihpc0V2ZW4sIHthOiAxLCBiOiAyLCBjOiAzLCBkOiA0fSk7IC8vPT4ge2I6IDIsIGQ6IDR9XG4gKi9cbnZhciBmaWx0ZXIgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MiggLyojX19QVVJFX18qL19kaXNwYXRjaGFibGUoWydmYW50YXN5LWxhbmQvZmlsdGVyJywgJ2ZpbHRlciddLCBfeGZpbHRlciwgZnVuY3Rpb24gKHByZWQsIGZpbHRlcmFibGUpIHtcbiAgcmV0dXJuIF9pc09iamVjdChmaWx0ZXJhYmxlKSA/IF9hcnJheVJlZHVjZShmdW5jdGlvbiAoYWNjLCBrZXkpIHtcbiAgICBpZiAocHJlZChmaWx0ZXJhYmxlW2tleV0pKSB7XG4gICAgICBhY2Nba2V5XSA9IGZpbHRlcmFibGVba2V5XTtcbiAgICB9XG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30sIGtleXMoZmlsdGVyYWJsZSkpIDpcbiAgLy8gZWxzZVxuICBfZmlsdGVyKHByZWQsIGZpbHRlcmFibGUpO1xufSkpO1xuZXhwb3J0IGRlZmF1bHQgZmlsdGVyOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfZGlzcGF0Y2hhYmxlIGZyb20gXCIuL2ludGVybmFsL19kaXNwYXRjaGFibGUuanNcIjtcbmltcG9ydCBfeGZpbmQgZnJvbSBcIi4vaW50ZXJuYWwvX3hmaW5kLmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgbGlzdCB3aGljaCBtYXRjaGVzIHRoZSBwcmVkaWNhdGUsIG9yXG4gKiBgdW5kZWZpbmVkYCBpZiBubyBlbGVtZW50IG1hdGNoZXMuXG4gKlxuICogRGlzcGF0Y2hlcyB0byB0aGUgYGZpbmRgIG1ldGhvZCBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50LCBpZiBwcmVzZW50LlxuICpcbiAqIEFjdHMgYXMgYSB0cmFuc2R1Y2VyIGlmIGEgdHJhbnNmb3JtZXIgaXMgZ2l2ZW4gaW4gbGlzdCBwb3NpdGlvbi5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIChhIC0+IEJvb2xlYW4pIC0+IFthXSAtPiBhIHwgdW5kZWZpbmVkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgcHJlZGljYXRlIGZ1bmN0aW9uIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBlbGVtZW50IGlzIHRoZVxuICogICAgICAgIGRlc2lyZWQgb25lLlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgYXJyYXkgdG8gY29uc2lkZXIuXG4gKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBlbGVtZW50IGZvdW5kLCBvciBgdW5kZWZpbmVkYC5cbiAqIEBzZWUgUi50cmFuc2R1Y2VcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCB4cyA9IFt7YTogMX0sIHthOiAyfSwge2E6IDN9XTtcbiAqICAgICAgUi5maW5kKFIucHJvcEVxKDIsICdhJykpKHhzKTsgLy89PiB7YTogMn1cbiAqICAgICAgUi5maW5kKFIucHJvcEVxKDQsICdhJykpKHhzKTsgLy89PiB1bmRlZmluZWRcbiAqL1xudmFyIGZpbmQgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MiggLyojX19QVVJFX18qL19kaXNwYXRjaGFibGUoWydmaW5kJ10sIF94ZmluZCwgZnVuY3Rpb24gZmluZChmbiwgbGlzdCkge1xuICB2YXIgaWR4ID0gMDtcbiAgdmFyIGxlbiA9IGxpc3QubGVuZ3RoO1xuICB3aGlsZSAoaWR4IDwgbGVuKSB7XG4gICAgaWYgKGZuKGxpc3RbaWR4XSkpIHtcbiAgICAgIHJldHVybiBsaXN0W2lkeF07XG4gICAgfVxuICAgIGlkeCArPSAxO1xuICB9XG59KSk7XG5leHBvcnQgZGVmYXVsdCBmaW5kOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfZGlzcGF0Y2hhYmxlIGZyb20gXCIuL2ludGVybmFsL19kaXNwYXRjaGFibGUuanNcIjtcbmltcG9ydCBfeGZpbmRJbmRleCBmcm9tIFwiLi9pbnRlcm5hbC9feGZpbmRJbmRleC5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBsaXN0IHdoaWNoIG1hdGNoZXMgdGhlXG4gKiBwcmVkaWNhdGUsIG9yIGAtMWAgaWYgbm8gZWxlbWVudCBtYXRjaGVzLlxuICpcbiAqIEFjdHMgYXMgYSB0cmFuc2R1Y2VyIGlmIGEgdHJhbnNmb3JtZXIgaXMgZ2l2ZW4gaW4gbGlzdCBwb3NpdGlvbi5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjFcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIChhIC0+IEJvb2xlYW4pIC0+IFthXSAtPiBOdW1iZXJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBwcmVkaWNhdGUgZnVuY3Rpb24gdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGVsZW1lbnQgaXMgdGhlXG4gKiBkZXNpcmVkIG9uZS5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGFycmF5IHRvIGNvbnNpZGVyLlxuICogQHJldHVybiB7TnVtYmVyfSBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgZm91bmQsIG9yIGAtMWAuXG4gKiBAc2VlIFIudHJhbnNkdWNlLCBSLmluZGV4T2ZcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCB4cyA9IFt7YTogMX0sIHthOiAyfSwge2E6IDN9XTtcbiAqICAgICAgUi5maW5kSW5kZXgoUi5wcm9wRXEoMiwgJ2EnKSkoeHMpOyAvLz0+IDFcbiAqICAgICAgUi5maW5kSW5kZXgoUi5wcm9wRXEoNCwgJ2EnKSkoeHMpOyAvLz0+IC0xXG4gKi9cbnZhciBmaW5kSW5kZXggPSAvKiNfX1BVUkVfXyovX2N1cnJ5MiggLyojX19QVVJFX18qL19kaXNwYXRjaGFibGUoW10sIF94ZmluZEluZGV4LCBmdW5jdGlvbiBmaW5kSW5kZXgoZm4sIGxpc3QpIHtcbiAgdmFyIGlkeCA9IDA7XG4gIHZhciBsZW4gPSBsaXN0Lmxlbmd0aDtcbiAgd2hpbGUgKGlkeCA8IGxlbikge1xuICAgIGlmIChmbihsaXN0W2lkeF0pKSB7XG4gICAgICByZXR1cm4gaWR4O1xuICAgIH1cbiAgICBpZHggKz0gMTtcbiAgfVxuICByZXR1cm4gLTE7XG59KSk7XG5leHBvcnQgZGVmYXVsdCBmaW5kSW5kZXg7IiwiaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5MS5qc1wiO1xuaW1wb3J0IF9tYWtlRmxhdCBmcm9tIFwiLi9pbnRlcm5hbC9fbWFrZUZsYXQuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IGxpc3QgYnkgcHVsbGluZyBldmVyeSBpdGVtIG91dCBvZiBpdCAoYW5kIGFsbCBpdHMgc3ViLWFycmF5cylcbiAqIGFuZCBwdXR0aW5nIHRoZW0gaW4gYSBuZXcgYXJyYXksIGRlcHRoLWZpcnN0LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgW2FdIC0+IFtiXVxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgYXJyYXkgdG8gY29uc2lkZXIuXG4gKiBAcmV0dXJuIHtBcnJheX0gVGhlIGZsYXR0ZW5lZCBsaXN0LlxuICogQHNlZSBSLnVubmVzdFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuZmxhdHRlbihbMSwgMiwgWzMsIDRdLCA1LCBbNiwgWzcsIDgsIFs5LCBbMTAsIDExXSwgMTJdXV1dKTtcbiAqICAgICAgLy89PiBbMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMl1cbiAqL1xudmFyIGZsYXR0ZW4gPSAvKiNfX1BVUkVfXyovX2N1cnJ5MSggLyojX19QVVJFX18qL19tYWtlRmxhdCh0cnVlKSk7XG5leHBvcnQgZGVmYXVsdCBmbGF0dGVuOyIsImltcG9ydCBfY2hlY2tGb3JNZXRob2QgZnJvbSBcIi4vaW50ZXJuYWwvX2NoZWNrRm9yTWV0aG9kLmpzXCI7XG5pbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5cbi8qKlxuICogSXRlcmF0ZSBvdmVyIGFuIGlucHV0IGBsaXN0YCwgY2FsbGluZyBhIHByb3ZpZGVkIGZ1bmN0aW9uIGBmbmAgZm9yIGVhY2hcbiAqIGVsZW1lbnQgaW4gdGhlIGxpc3QuXG4gKlxuICogYGZuYCByZWNlaXZlcyBvbmUgYXJndW1lbnQ6ICoodmFsdWUpKi5cbiAqXG4gKiBOb3RlOiBgUi5mb3JFYWNoYCBkb2VzIG5vdCBza2lwIGRlbGV0ZWQgb3IgdW5hc3NpZ25lZCBpbmRpY2VzIChzcGFyc2VcbiAqIGFycmF5cyksIHVubGlrZSB0aGUgbmF0aXZlIGBBcnJheS5wcm90b3R5cGUuZm9yRWFjaGAgbWV0aG9kLiBGb3IgbW9yZVxuICogZGV0YWlscyBvbiB0aGlzIGJlaGF2aW9yLCBzZWU6XG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9mb3JFYWNoI0Rlc2NyaXB0aW9uXG4gKlxuICogQWxzbyBub3RlIHRoYXQsIHVubGlrZSBgQXJyYXkucHJvdG90eXBlLmZvckVhY2hgLCBSYW1kYSdzIGBmb3JFYWNoYCByZXR1cm5zXG4gKiB0aGUgb3JpZ2luYWwgYXJyYXkuIEluIHNvbWUgbGlicmFyaWVzIHRoaXMgZnVuY3Rpb24gaXMgbmFtZWQgYGVhY2hgLlxuICpcbiAqIERpc3BhdGNoZXMgdG8gdGhlIGBmb3JFYWNoYCBtZXRob2Qgb2YgdGhlIHNlY29uZCBhcmd1bWVudCwgaWYgcHJlc2VudC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjFcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIChhIC0+ICopIC0+IFthXSAtPiBbYV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBpbnZva2UuIFJlY2VpdmVzIG9uZSBhcmd1bWVudCwgYHZhbHVlYC5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGxpc3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHJldHVybiB7QXJyYXl9IFRoZSBvcmlnaW5hbCBsaXN0LlxuICogQHNlZSBSLmFkZEluZGV4XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgcHJpbnRYUGx1c0ZpdmUgPSB4ID0+IGNvbnNvbGUubG9nKHggKyA1KTtcbiAqICAgICAgUi5mb3JFYWNoKHByaW50WFBsdXNGaXZlLCBbMSwgMiwgM10pOyAvLz0+IFsxLCAyLCAzXVxuICogICAgICAvLyBsb2dzIDZcbiAqICAgICAgLy8gbG9ncyA3XG4gKiAgICAgIC8vIGxvZ3MgOFxuICogQHN5bWIgUi5mb3JFYWNoKGYsIFthLCBiLCBjXSkgPSBbYSwgYiwgY11cbiAqL1xudmFyIGZvckVhY2ggPSAvKiNfX1BVUkVfXyovX2N1cnJ5MiggLyojX19QVVJFX18qL19jaGVja0Zvck1ldGhvZCgnZm9yRWFjaCcsIGZ1bmN0aW9uIGZvckVhY2goZm4sIGxpc3QpIHtcbiAgdmFyIGxlbiA9IGxpc3QubGVuZ3RoO1xuICB2YXIgaWR4ID0gMDtcbiAgd2hpbGUgKGlkeCA8IGxlbikge1xuICAgIGZuKGxpc3RbaWR4XSk7XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIGxpc3Q7XG59KSk7XG5leHBvcnQgZGVmYXVsdCBmb3JFYWNoOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBrZXlzIGZyb20gXCIuL2tleXMuanNcIjtcblxuLyoqXG4gKiBJdGVyYXRlIG92ZXIgYW4gaW5wdXQgYG9iamVjdGAsIGNhbGxpbmcgYSBwcm92aWRlZCBmdW5jdGlvbiBgZm5gIGZvciBlYWNoXG4gKiBrZXkgYW5kIHZhbHVlIGluIHRoZSBvYmplY3QuXG4gKlxuICogYGZuYCByZWNlaXZlcyB0aHJlZSBhcmd1bWVudDogKih2YWx1ZSwga2V5LCBvYmopKi5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4yMy4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnICgoYSwgU3RyaW5nLCBTdHJNYXAgYSkgLT4gQW55KSAtPiBTdHJNYXAgYSAtPiBTdHJNYXAgYVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIGludm9rZS4gUmVjZWl2ZXMgdGhyZWUgYXJndW1lbnQsIGB2YWx1ZWAsIGBrZXlgLCBgb2JqYC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBvcmlnaW5hbCBvYmplY3QuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgcHJpbnRLZXlDb25jYXRWYWx1ZSA9ICh2YWx1ZSwga2V5KSA9PiBjb25zb2xlLmxvZyhrZXkgKyAnOicgKyB2YWx1ZSk7XG4gKiAgICAgIFIuZm9yRWFjaE9iakluZGV4ZWQocHJpbnRLZXlDb25jYXRWYWx1ZSwge3g6IDEsIHk6IDJ9KTsgLy89PiB7eDogMSwgeTogMn1cbiAqICAgICAgLy8gbG9ncyB4OjFcbiAqICAgICAgLy8gbG9ncyB5OjJcbiAqIEBzeW1iIFIuZm9yRWFjaE9iakluZGV4ZWQoZiwge3g6IGEsIHk6IGJ9KSA9IHt4OiBhLCB5OiBifVxuICovXG52YXIgZm9yRWFjaE9iakluZGV4ZWQgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiBmb3JFYWNoT2JqSW5kZXhlZChmbiwgb2JqKSB7XG4gIHZhciBrZXlMaXN0ID0ga2V5cyhvYmopO1xuICB2YXIgaWR4ID0gMDtcbiAgd2hpbGUgKGlkeCA8IGtleUxpc3QubGVuZ3RoKSB7XG4gICAgdmFyIGtleSA9IGtleUxpc3RbaWR4XTtcbiAgICBmbihvYmpba2V5XSwga2V5LCBvYmopO1xuICAgIGlkeCArPSAxO1xuICB9XG4gIHJldHVybiBvYmo7XG59KTtcbmV4cG9ydCBkZWZhdWx0IGZvckVhY2hPYmpJbmRleGVkOyIsImltcG9ydCBfY2hlY2tGb3JNZXRob2QgZnJvbSBcIi4vaW50ZXJuYWwvX2NoZWNrRm9yTWV0aG9kLmpzXCI7XG5pbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgcmVkdWNlQnkgZnJvbSBcIi4vcmVkdWNlQnkuanNcIjtcblxuLyoqXG4gKiBTcGxpdHMgYSBsaXN0IGludG8gc3ViLWxpc3RzIHN0b3JlZCBpbiBhbiBvYmplY3QsIGJhc2VkIG9uIHRoZSByZXN1bHQgb2ZcbiAqIGNhbGxpbmcgYSBrZXktcmV0dXJuaW5nIGZ1bmN0aW9uIG9uIGVhY2ggZWxlbWVudCwgYW5kIGdyb3VwaW5nIHRoZVxuICogcmVzdWx0cyBhY2NvcmRpbmcgdG8gdmFsdWVzIHJldHVybmVkLlxuICpcbiAqIERpc3BhdGNoZXMgdG8gdGhlIGBncm91cEJ5YCBtZXRob2Qgb2YgdGhlIHNlY29uZCBhcmd1bWVudCwgaWYgcHJlc2VudC5cbiAqXG4gKiBBY3RzIGFzIGEgdHJhbnNkdWNlciBpZiBhIHRyYW5zZm9ybWVyIGlzIGdpdmVuIGluIGxpc3QgcG9zaXRpb24uXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHR5cGVkZWZuIElkeCA9IFN0cmluZyB8IEludCB8IFN5bWJvbFxuICogQHNpZyBJZHggYSA9PiAoYiAtPiBhKSAtPiBbYl0gLT4ge2E6IFtiXX1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIEZ1bmN0aW9uIDo6IGEgLT4gSWR4XG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBhcnJheSB0byBncm91cFxuICogQHJldHVybiB7T2JqZWN0fSBBbiBvYmplY3Qgd2l0aCB0aGUgb3V0cHV0IG9mIGBmbmAgZm9yIGtleXMsIG1hcHBlZCB0byBhcnJheXMgb2YgZWxlbWVudHNcbiAqICAgICAgICAgdGhhdCBwcm9kdWNlZCB0aGF0IGtleSB3aGVuIHBhc3NlZCB0byBgZm5gLlxuICogQHNlZSBSLnJlZHVjZUJ5LCBSLnRyYW5zZHVjZSwgUi5pbmRleEJ5LCBSLmNvbGxlY3RCeVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IGJ5R3JhZGUgPSBSLmdyb3VwQnkoZnVuY3Rpb24oc3R1ZGVudCkge1xuICogICAgICAgIGNvbnN0IHNjb3JlID0gc3R1ZGVudC5zY29yZTtcbiAqICAgICAgICByZXR1cm4gc2NvcmUgPCA2NSA/ICdGJyA6XG4gKiAgICAgICAgICAgICAgIHNjb3JlIDwgNzAgPyAnRCcgOlxuICogICAgICAgICAgICAgICBzY29yZSA8IDgwID8gJ0MnIDpcbiAqICAgICAgICAgICAgICAgc2NvcmUgPCA5MCA/ICdCJyA6ICdBJztcbiAqICAgICAgfSk7XG4gKiAgICAgIGNvbnN0IHN0dWRlbnRzID0gW3tuYW1lOiAnQWJieScsIHNjb3JlOiA4NH0sXG4gKiAgICAgICAgICAgICAgICAgICAgICB7bmFtZTogJ0VkZHknLCBzY29yZTogNTh9LFxuICogICAgICAgICAgICAgICAgICAgICAgLy8gLi4uXG4gKiAgICAgICAgICAgICAgICAgICAgICB7bmFtZTogJ0phY2snLCBzY29yZTogNjl9XTtcbiAqICAgICAgYnlHcmFkZShzdHVkZW50cyk7XG4gKiAgICAgIC8vIHtcbiAqICAgICAgLy8gICAnQSc6IFt7bmFtZTogJ0RpYW5uZScsIHNjb3JlOiA5OX1dLFxuICogICAgICAvLyAgICdCJzogW3tuYW1lOiAnQWJieScsIHNjb3JlOiA4NH1dXG4gKiAgICAgIC8vICAgLy8gLi4uLFxuICogICAgICAvLyAgICdGJzogW3tuYW1lOiAnRWRkeScsIHNjb3JlOiA1OH1dXG4gKiAgICAgIC8vIH1cbiAqL1xudmFyIGdyb3VwQnkgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MiggLyojX19QVVJFX18qL19jaGVja0Zvck1ldGhvZCgnZ3JvdXBCeScsIC8qI19fUFVSRV9fKi9yZWR1Y2VCeShmdW5jdGlvbiAoYWNjLCBpdGVtKSB7XG4gIGFjYy5wdXNoKGl0ZW0pO1xuICByZXR1cm4gYWNjO1xufSwgW10pKSk7XG5leHBvcnQgZGVmYXVsdCBncm91cEJ5OyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBoYXNQYXRoIGZyb20gXCIuL2hhc1BhdGguanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IGFuIG9iamVjdCBoYXMgYW4gb3duIHByb3BlcnR5IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuNy4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnIHMgLT4ge3M6IHh9IC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBjaGVjayBmb3IuXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJuIHtCb29sZWFufSBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBleGlzdHMuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgaGFzTmFtZSA9IFIuaGFzKCduYW1lJyk7XG4gKiAgICAgIGhhc05hbWUoe25hbWU6ICdhbGljZSd9KTsgICAvLz0+IHRydWVcbiAqICAgICAgaGFzTmFtZSh7bmFtZTogJ2JvYid9KTsgICAgIC8vPT4gdHJ1ZVxuICogICAgICBoYXNOYW1lKHt9KTsgICAgICAgICAgICAgICAgLy89PiBmYWxzZVxuICpcbiAqICAgICAgY29uc3QgcG9pbnQgPSB7eDogMCwgeTogMH07XG4gKiAgICAgIGNvbnN0IHBvaW50SGFzID0gUi5oYXMoUi5fXywgcG9pbnQpO1xuICogICAgICBwb2ludEhhcygneCcpOyAgLy89PiB0cnVlXG4gKiAgICAgIHBvaW50SGFzKCd5Jyk7ICAvLz0+IHRydWVcbiAqICAgICAgcG9pbnRIYXMoJ3onKTsgIC8vPT4gZmFsc2VcbiAqL1xudmFyIGhhcyA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIGhhcyhwcm9wLCBvYmopIHtcbiAgcmV0dXJuIGhhc1BhdGgoW3Byb3BdLCBvYmopO1xufSk7XG5leHBvcnQgZGVmYXVsdCBoYXM7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9oYXMgZnJvbSBcIi4vaW50ZXJuYWwvX2hhcy5qc1wiO1xuaW1wb3J0IGlzTmlsIGZyb20gXCIuL2lzTmlsLmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCBhIHBhdGggZXhpc3RzIGluIGFuIG9iamVjdC4gT25seSB0aGUgb2JqZWN0J3NcbiAqIG93biBwcm9wZXJ0aWVzIGFyZSBjaGVja2VkLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjI2LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEB0eXBlZGVmbiBJZHggPSBTdHJpbmcgfCBJbnQgfCBTeW1ib2xcbiAqIEBzaWcgW0lkeF0gLT4ge2F9IC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7QXJyYXl9IHBhdGggVGhlIHBhdGggdG8gdXNlLlxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIGNoZWNrIHRoZSBwYXRoIGluLlxuICogQHJldHVybiB7Qm9vbGVhbn0gV2hldGhlciB0aGUgcGF0aCBleGlzdHMuXG4gKiBAc2VlIFIuaGFzXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5oYXNQYXRoKFsnYScsICdiJ10sIHthOiB7YjogMn19KTsgICAgICAgICAvLyA9PiB0cnVlXG4gKiAgICAgIFIuaGFzUGF0aChbJ2EnLCAnYiddLCB7YToge2I6IHVuZGVmaW5lZH19KTsgLy8gPT4gdHJ1ZVxuICogICAgICBSLmhhc1BhdGgoWydhJywgJ2InXSwge2E6IHtjOiAyfX0pOyAgICAgICAgIC8vID0+IGZhbHNlXG4gKiAgICAgIFIuaGFzUGF0aChbJ2EnLCAnYiddLCB7fSk7ICAgICAgICAgICAgICAgICAgLy8gPT4gZmFsc2VcbiAqL1xudmFyIGhhc1BhdGggPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiBoYXNQYXRoKF9wYXRoLCBvYmopIHtcbiAgaWYgKF9wYXRoLmxlbmd0aCA9PT0gMCB8fCBpc05pbChvYmopKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciB2YWwgPSBvYmo7XG4gIHZhciBpZHggPSAwO1xuICB3aGlsZSAoaWR4IDwgX3BhdGgubGVuZ3RoKSB7XG4gICAgaWYgKCFpc05pbCh2YWwpICYmIF9oYXMoX3BhdGhbaWR4XSwgdmFsKSkge1xuICAgICAgdmFsID0gdmFsW19wYXRoW2lkeF1dO1xuICAgICAgaWR4ICs9IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59KTtcbmV4cG9ydCBkZWZhdWx0IGhhc1BhdGg7IiwiaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5MS5qc1wiO1xuaW1wb3J0IF9pZGVudGl0eSBmcm9tIFwiLi9pbnRlcm5hbC9faWRlbnRpdHkuanNcIjtcblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHRoYXQgZG9lcyBub3RoaW5nIGJ1dCByZXR1cm4gdGhlIHBhcmFtZXRlciBzdXBwbGllZCB0byBpdC4gR29vZFxuICogYXMgYSBkZWZhdWx0IG9yIHBsYWNlaG9sZGVyIGZ1bmN0aW9uLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnIGEgLT4gYVxuICogQHBhcmFtIHsqfSB4IFRoZSB2YWx1ZSB0byByZXR1cm4uXG4gKiBAcmV0dXJuIHsqfSBUaGUgaW5wdXQgdmFsdWUsIGB4YC5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmlkZW50aXR5KDEpOyAvLz0+IDFcbiAqXG4gKiAgICAgIGNvbnN0IG9iaiA9IHt9O1xuICogICAgICBSLmlkZW50aXR5KG9iaikgPT09IG9iajsgLy89PiB0cnVlXG4gKiBAc3ltYiBSLmlkZW50aXR5KGEpID0gYVxuICovXG52YXIgaWRlbnRpdHkgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MShfaWRlbnRpdHkpO1xuZXhwb3J0IGRlZmF1bHQgaWRlbnRpdHk7IiwiaW1wb3J0IF9pbmNsdWRlcyBmcm9tIFwiLi9pbnRlcm5hbC9faW5jbHVkZXMuanNcIjtcbmltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgc3BlY2lmaWVkIHZhbHVlIGlzIGVxdWFsLCBpbiBbYFIuZXF1YWxzYF0oI2VxdWFscylcbiAqIHRlcm1zLCB0byBhdCBsZWFzdCBvbmUgZWxlbWVudCBvZiB0aGUgZ2l2ZW4gbGlzdDsgYGZhbHNlYCBvdGhlcndpc2UuXG4gKiBBbHNvIHdvcmtzIHdpdGggc3RyaW5ncy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4yNi4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBhIC0+IFthXSAtPiBCb29sZWFuXG4gKiBAcGFyYW0ge09iamVjdH0gYSBUaGUgaXRlbSB0byBjb21wYXJlIGFnYWluc3QuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBhcnJheSB0byBjb25zaWRlci5cbiAqIEByZXR1cm4ge0Jvb2xlYW59IGB0cnVlYCBpZiBhbiBlcXVpdmFsZW50IGl0ZW0gaXMgaW4gdGhlIGxpc3QsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICogQHNlZSBSLmFueVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuaW5jbHVkZXMoMywgWzEsIDIsIDNdKTsgLy89PiB0cnVlXG4gKiAgICAgIFIuaW5jbHVkZXMoNCwgWzEsIDIsIDNdKTsgLy89PiBmYWxzZVxuICogICAgICBSLmluY2x1ZGVzKHsgbmFtZTogJ0ZyZWQnIH0sIFt7IG5hbWU6ICdGcmVkJyB9XSk7IC8vPT4gdHJ1ZVxuICogICAgICBSLmluY2x1ZGVzKFs0Ml0sIFtbNDJdXSk7IC8vPT4gdHJ1ZVxuICogICAgICBSLmluY2x1ZGVzKCdiYScsICdiYW5hbmEnKTsgLy89PnRydWVcbiAqL1xudmFyIGluY2x1ZGVzID0gLyojX19QVVJFX18qL19jdXJyeTIoX2luY2x1ZGVzKTtcbmV4cG9ydCBkZWZhdWx0IGluY2x1ZGVzOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfaW5kZXhPZiBmcm9tIFwiLi9pbnRlcm5hbC9faW5kZXhPZi5qc1wiO1xuaW1wb3J0IF9pc0FycmF5IGZyb20gXCIuL2ludGVybmFsL19pc0FycmF5LmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgYW4gaXRlbSBpbiBhbiBhcnJheSwgb3IgLTFcbiAqIGlmIHRoZSBpdGVtIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgYXJyYXkuIFtgUi5lcXVhbHNgXSgjZXF1YWxzKSBpcyB1c2VkIHRvXG4gKiBkZXRlcm1pbmUgZXF1YWxpdHkuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBhIC0+IFthXSAtPiBOdW1iZXJcbiAqIEBwYXJhbSB7Kn0gdGFyZ2V0IFRoZSBpdGVtIHRvIGZpbmQuXG4gKiBAcGFyYW0ge0FycmF5fSB4cyBUaGUgYXJyYXkgdG8gc2VhcmNoIGluLlxuICogQHJldHVybiB7TnVtYmVyfSB0aGUgaW5kZXggb2YgdGhlIHRhcmdldCwgb3IgLTEgaWYgdGhlIHRhcmdldCBpcyBub3QgZm91bmQuXG4gKiBAc2VlIFIubGFzdEluZGV4T2YsIFIuZmluZEluZGV4XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5pbmRleE9mKDMsIFsxLDIsMyw0XSk7IC8vPT4gMlxuICogICAgICBSLmluZGV4T2YoMTAsIFsxLDIsMyw0XSk7IC8vPT4gLTFcbiAqL1xudmFyIGluZGV4T2YgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiBpbmRleE9mKHRhcmdldCwgeHMpIHtcbiAgcmV0dXJuIHR5cGVvZiB4cy5pbmRleE9mID09PSAnZnVuY3Rpb24nICYmICFfaXNBcnJheSh4cykgPyB4cy5pbmRleE9mKHRhcmdldCkgOiBfaW5kZXhPZih4cywgdGFyZ2V0LCAwKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgaW5kZXhPZjsiLCJpbXBvcnQgX2N1cnJ5MyBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkzLmpzXCI7XG5cbi8qKlxuICogSW5zZXJ0cyB0aGUgc3VwcGxpZWQgZWxlbWVudCBpbnRvIHRoZSBsaXN0LCBhdCB0aGUgc3BlY2lmaWVkIGBpbmRleGAuIF9Ob3RlIHRoYXRcblxuICogdGhpcyBpcyBub3QgZGVzdHJ1Y3RpdmVfOiBpdCByZXR1cm5zIGEgY29weSBvZiB0aGUgbGlzdCB3aXRoIHRoZSBjaGFuZ2VzLlxuICogPHNtYWxsPk5vIGxpc3RzIGhhdmUgYmVlbiBoYXJtZWQgaW4gdGhlIGFwcGxpY2F0aW9uIG9mIHRoaXMgZnVuY3Rpb24uPC9zbWFsbD5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4yLjJcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIE51bWJlciAtPiBhIC0+IFthXSAtPiBbYV1cbiAqIEBwYXJhbSB7TnVtYmVyfSBpbmRleCBUaGUgcG9zaXRpb24gdG8gaW5zZXJ0IHRoZSBlbGVtZW50XG4gKiBAcGFyYW0geyp9IGVsdCBUaGUgZWxlbWVudCB0byBpbnNlcnQgaW50byB0aGUgQXJyYXlcbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGxpc3QgdG8gaW5zZXJ0IGludG9cbiAqIEByZXR1cm4ge0FycmF5fSBBIG5ldyBBcnJheSB3aXRoIGBlbHRgIGluc2VydGVkIGF0IGBpbmRleGAuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5pbnNlcnQoMiwgJ3gnLCBbMSwyLDMsNF0pOyAvLz0+IFsxLDIsJ3gnLDMsNF1cbiAqL1xudmFyIGluc2VydCA9IC8qI19fUFVSRV9fKi9fY3VycnkzKGZ1bmN0aW9uIGluc2VydChpZHgsIGVsdCwgbGlzdCkge1xuICBpZHggPSBpZHggPCBsaXN0Lmxlbmd0aCAmJiBpZHggPj0gMCA/IGlkeCA6IGxpc3QubGVuZ3RoO1xuICB2YXIgcmVzdWx0ID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobGlzdCwgMCk7XG4gIHJlc3VsdC5zcGxpY2UoaWR4LCAwLCBlbHQpO1xuICByZXR1cm4gcmVzdWx0O1xufSk7XG5leHBvcnQgZGVmYXVsdCBpbnNlcnQ7IiwiaW1wb3J0IF9pbmNsdWRlcyBmcm9tIFwiLi9faW5jbHVkZXMuanNcIjtcbnZhciBfU2V0ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gX1NldCgpIHtcbiAgICAvKiBnbG9iYWxzIFNldCAqL1xuICAgIHRoaXMuX25hdGl2ZVNldCA9IHR5cGVvZiBTZXQgPT09ICdmdW5jdGlvbicgPyBuZXcgU2V0KCkgOiBudWxsO1xuICAgIHRoaXMuX2l0ZW1zID0ge307XG4gIH1cbiAgLy8gdW50aWwgd2UgZmlndXJlIG91dCB3aHkganNkb2MgY2hva2VzIG9uIHRoaXNcbiAgLy8gQHBhcmFtIGl0ZW0gVGhlIGl0ZW0gdG8gYWRkIHRvIHRoZSBTZXRcbiAgLy8gQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgdGhlIGl0ZW0gZGlkIG5vdCBleGlzdCBwcmlvciwgb3RoZXJ3aXNlIGZhbHNlXG4gIC8vXG4gIF9TZXQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgcmV0dXJuICFoYXNPckFkZChpdGVtLCB0cnVlLCB0aGlzKTtcbiAgfTtcblxuICAvL1xuICAvLyBAcGFyYW0gaXRlbSBUaGUgaXRlbSB0byBjaGVjayBmb3IgZXhpc3RlbmNlIGluIHRoZSBTZXRcbiAgLy8gQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgdGhlIGl0ZW0gZXhpc3RzIGluIHRoZSBTZXQsIG90aGVyd2lzZSBmYWxzZVxuICAvL1xuICBfU2V0LnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAoaXRlbSkge1xuICAgIHJldHVybiBoYXNPckFkZChpdGVtLCBmYWxzZSwgdGhpcyk7XG4gIH07XG5cbiAgLy9cbiAgLy8gQ29tYmluZXMgdGhlIGxvZ2ljIGZvciBjaGVja2luZyB3aGV0aGVyIGFuIGl0ZW0gaXMgYSBtZW1iZXIgb2YgdGhlIHNldCBhbmRcbiAgLy8gZm9yIGFkZGluZyBhIG5ldyBpdGVtIHRvIHRoZSBzZXQuXG4gIC8vXG4gIC8vIEBwYXJhbSBpdGVtICAgICAgIFRoZSBpdGVtIHRvIGNoZWNrIG9yIGFkZCB0byB0aGUgU2V0IGluc3RhbmNlLlxuICAvLyBAcGFyYW0gc2hvdWxkQWRkICBJZiB0cnVlLCB0aGUgaXRlbSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBzZXQgaWYgaXQgZG9lc24ndFxuICAvLyAgICAgICAgICAgICAgICAgICBhbHJlYWR5IGV4aXN0LlxuICAvLyBAcGFyYW0gc2V0ICAgICAgICBUaGUgc2V0IGluc3RhbmNlIHRvIGNoZWNrIG9yIGFkZCB0by5cbiAgLy8gQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgaXRlbSBhbHJlYWR5IGV4aXN0ZWQsIG90aGVyd2lzZSBmYWxzZS5cbiAgLy9cbiAgcmV0dXJuIF9TZXQ7XG59KCk7XG5mdW5jdGlvbiBoYXNPckFkZChpdGVtLCBzaG91bGRBZGQsIHNldCkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiBpdGVtO1xuICB2YXIgcHJldlNpemUsIG5ld1NpemU7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIC8vIGRpc3Rpbmd1aXNoIGJldHdlZW4gKzAgYW5kIC0wXG4gICAgICBpZiAoaXRlbSA9PT0gMCAmJiAxIC8gaXRlbSA9PT0gLUluZmluaXR5KSB7XG4gICAgICAgIGlmIChzZXQuX2l0ZW1zWyctMCddKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHNob3VsZEFkZCkge1xuICAgICAgICAgICAgc2V0Ll9pdGVtc1snLTAnXSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gdGhlc2UgdHlwZXMgY2FuIGFsbCB1dGlsaXNlIHRoZSBuYXRpdmUgU2V0XG4gICAgICBpZiAoc2V0Ll9uYXRpdmVTZXQgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKHNob3VsZEFkZCkge1xuICAgICAgICAgIHByZXZTaXplID0gc2V0Ll9uYXRpdmVTZXQuc2l6ZTtcbiAgICAgICAgICBzZXQuX25hdGl2ZVNldC5hZGQoaXRlbSk7XG4gICAgICAgICAgbmV3U2l6ZSA9IHNldC5fbmF0aXZlU2V0LnNpemU7XG4gICAgICAgICAgcmV0dXJuIG5ld1NpemUgPT09IHByZXZTaXplO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBzZXQuX25hdGl2ZVNldC5oYXMoaXRlbSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghKHR5cGUgaW4gc2V0Ll9pdGVtcykpIHtcbiAgICAgICAgICBpZiAoc2hvdWxkQWRkKSB7XG4gICAgICAgICAgICBzZXQuX2l0ZW1zW3R5cGVdID0ge307XG4gICAgICAgICAgICBzZXQuX2l0ZW1zW3R5cGVdW2l0ZW1dID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKGl0ZW0gaW4gc2V0Ll9pdGVtc1t0eXBlXSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChzaG91bGRBZGQpIHtcbiAgICAgICAgICAgIHNldC5faXRlbXNbdHlwZV1baXRlbV0gPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIC8vIHNldC5faXRlbXNbJ2Jvb2xlYW4nXSBob2xkcyBhIHR3byBlbGVtZW50IGFycmF5XG4gICAgICAvLyByZXByZXNlbnRpbmcgWyBmYWxzZUV4aXN0cywgdHJ1ZUV4aXN0cyBdXG4gICAgICBpZiAodHlwZSBpbiBzZXQuX2l0ZW1zKSB7XG4gICAgICAgIHZhciBiSWR4ID0gaXRlbSA/IDEgOiAwO1xuICAgICAgICBpZiAoc2V0Ll9pdGVtc1t0eXBlXVtiSWR4XSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChzaG91bGRBZGQpIHtcbiAgICAgICAgICAgIHNldC5faXRlbXNbdHlwZV1bYklkeF0gPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChzaG91bGRBZGQpIHtcbiAgICAgICAgICBzZXQuX2l0ZW1zW3R5cGVdID0gaXRlbSA/IFtmYWxzZSwgdHJ1ZV0gOiBbdHJ1ZSwgZmFsc2VdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICAvLyBjb21wYXJlIGZ1bmN0aW9ucyBmb3IgcmVmZXJlbmNlIGVxdWFsaXR5XG4gICAgICBpZiAoc2V0Ll9uYXRpdmVTZXQgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKHNob3VsZEFkZCkge1xuICAgICAgICAgIHByZXZTaXplID0gc2V0Ll9uYXRpdmVTZXQuc2l6ZTtcbiAgICAgICAgICBzZXQuX25hdGl2ZVNldC5hZGQoaXRlbSk7XG4gICAgICAgICAgbmV3U2l6ZSA9IHNldC5fbmF0aXZlU2V0LnNpemU7XG4gICAgICAgICAgcmV0dXJuIG5ld1NpemUgPT09IHByZXZTaXplO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBzZXQuX25hdGl2ZVNldC5oYXMoaXRlbSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghKHR5cGUgaW4gc2V0Ll9pdGVtcykpIHtcbiAgICAgICAgICBpZiAoc2hvdWxkQWRkKSB7XG4gICAgICAgICAgICBzZXQuX2l0ZW1zW3R5cGVdID0gW2l0ZW1dO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFfaW5jbHVkZXMoaXRlbSwgc2V0Ll9pdGVtc1t0eXBlXSkpIHtcbiAgICAgICAgICBpZiAoc2hvdWxkQWRkKSB7XG4gICAgICAgICAgICBzZXQuX2l0ZW1zW3R5cGVdLnB1c2goaXRlbSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgaWYgKHNldC5faXRlbXNbdHlwZV0pIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoc2hvdWxkQWRkKSB7XG4gICAgICAgICAgc2V0Ll9pdGVtc1t0eXBlXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICBpZiAoaXRlbSA9PT0gbnVsbCkge1xuICAgICAgICBpZiAoIXNldC5faXRlbXNbJ251bGwnXSkge1xuICAgICAgICAgIGlmIChzaG91bGRBZGQpIHtcbiAgICAgICAgICAgIHNldC5faXRlbXNbJ251bGwnXSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIHJlZHVjZSB0aGUgc2VhcmNoIHNpemUgb2YgaGV0ZXJvZ2VuZW91cyBzZXRzIGJ5IGNyZWF0aW5nIGJ1Y2tldHNcbiAgICAgIC8vIGZvciBlYWNoIHR5cGUuXG4gICAgICB0eXBlID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGl0ZW0pO1xuICAgICAgaWYgKCEodHlwZSBpbiBzZXQuX2l0ZW1zKSkge1xuICAgICAgICBpZiAoc2hvdWxkQWRkKSB7XG4gICAgICAgICAgc2V0Ll9pdGVtc1t0eXBlXSA9IFtpdGVtXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICAvLyBzY2FuIHRocm91Z2ggYWxsIHByZXZpb3VzbHkgYXBwbGllZCBpdGVtc1xuICAgICAgaWYgKCFfaW5jbHVkZXMoaXRlbSwgc2V0Ll9pdGVtc1t0eXBlXSkpIHtcbiAgICAgICAgaWYgKHNob3VsZEFkZCkge1xuICAgICAgICAgIHNldC5faXRlbXNbdHlwZV0ucHVzaChpdGVtKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG4vLyBBIHNpbXBsZSBTZXQgdHlwZSB0aGF0IGhvbm91cnMgUi5lcXVhbHMgc2VtYW50aWNzXG5leHBvcnQgZGVmYXVsdCBfU2V0OyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9hcml0eShuLCBmbikge1xuICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xuICBzd2l0Y2ggKG4pIHtcbiAgICBjYXNlIDA6XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgY2FzZSAxOlxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhMCkge1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhMCwgYTEpIHtcbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9O1xuICAgIGNhc2UgMzpcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoYTAsIGExLCBhMikge1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgY2FzZSA0OlxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhMCwgYTEsIGEyLCBhMykge1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgY2FzZSA1OlxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhMCwgYTEsIGEyLCBhMywgYTQpIHtcbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9O1xuICAgIGNhc2UgNjpcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSkge1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgY2FzZSA3OlxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNikge1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgY2FzZSA4OlxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcpIHtcbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9O1xuICAgIGNhc2UgOTpcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCkge1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgY2FzZSAxMDpcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTkpIHtcbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9O1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZpcnN0IGFyZ3VtZW50IHRvIF9hcml0eSBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIgbm8gZ3JlYXRlciB0aGFuIHRlbicpO1xuICB9XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2FycmF5RnJvbUl0ZXJhdG9yKGl0ZXIpIHtcbiAgdmFyIGxpc3QgPSBbXTtcbiAgdmFyIG5leHQ7XG4gIHdoaWxlICghKG5leHQgPSBpdGVyLm5leHQoKSkuZG9uZSkge1xuICAgIGxpc3QucHVzaChuZXh0LnZhbHVlKTtcbiAgfVxuICByZXR1cm4gbGlzdDtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfYXJyYXlSZWR1Y2UocmVkdWNlciwgYWNjLCBsaXN0KSB7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBsZW5ndGggPSBsaXN0Lmxlbmd0aDtcbiAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgYWNjID0gcmVkdWNlcihhY2MsIGxpc3RbaW5kZXhdKTtcbiAgICBpbmRleCArPSAxO1xuICB9XG4gIHJldHVybiBhY2M7XG59IiwiaW1wb3J0IF9pc0FycmF5IGZyb20gXCIuL19pc0FycmF5LmpzXCI7XG5pbXBvcnQgX2lzSW50ZWdlciBmcm9tIFwiLi9faXNJbnRlZ2VyLmpzXCI7XG5cbi8qKlxuICogTWFrZXMgYSBzaGFsbG93IGNsb25lIG9mIGFuIG9iamVjdCwgc2V0dGluZyBvciBvdmVycmlkaW5nIHRoZSBzcGVjaWZpZWRcbiAqIHByb3BlcnR5IHdpdGggdGhlIGdpdmVuIHZhbHVlLiBOb3RlIHRoYXQgdGhpcyBjb3BpZXMgYW5kIGZsYXR0ZW5zIHByb3RvdHlwZVxuICogcHJvcGVydGllcyBvbnRvIHRoZSBuZXcgb2JqZWN0IGFzIHdlbGwuIEFsbCBub24tcHJpbWl0aXZlIHByb3BlcnRpZXMgYXJlXG4gKiBjb3BpZWQgYnkgcmVmZXJlbmNlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1N0cmluZ3xOdW1iZXJ9IHByb3AgVGhlIHByb3BlcnR5IG5hbWUgdG8gc2V0XG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgbmV3IHZhbHVlXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheX0gb2JqIFRoZSBvYmplY3QgdG8gY2xvbmVcbiAqIEByZXR1cm4ge09iamVjdHxBcnJheX0gQSBuZXcgb2JqZWN0IGVxdWl2YWxlbnQgdG8gdGhlIG9yaWdpbmFsIGV4Y2VwdCBmb3IgdGhlIGNoYW5nZWQgcHJvcGVydHkuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9hc3NvYyhwcm9wLCB2YWwsIG9iaikge1xuICBpZiAoX2lzSW50ZWdlcihwcm9wKSAmJiBfaXNBcnJheShvYmopKSB7XG4gICAgdmFyIGFyciA9IFtdLmNvbmNhdChvYmopO1xuICAgIGFycltwcm9wXSA9IHZhbDtcbiAgICByZXR1cm4gYXJyO1xuICB9XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBvYmopIHtcbiAgICByZXN1bHRbcF0gPSBvYmpbcF07XG4gIH1cbiAgcmVzdWx0W3Byb3BdID0gdmFsO1xuICByZXR1cm4gcmVzdWx0O1xufSIsImltcG9ydCBfaXNBcnJheSBmcm9tIFwiLi9faXNBcnJheS5qc1wiO1xuXG4vKipcbiAqIFRoaXMgY2hlY2tzIHdoZXRoZXIgYSBmdW5jdGlvbiBoYXMgYSBbbWV0aG9kbmFtZV0gZnVuY3Rpb24uIElmIGl0IGlzbid0IGFuXG4gKiBhcnJheSBpdCB3aWxsIGV4ZWN1dGUgdGhhdCBmdW5jdGlvbiBvdGhlcndpc2UgaXQgd2lsbCBkZWZhdWx0IHRvIHRoZSByYW1kYVxuICogaW1wbGVtZW50YXRpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIHJhbWRhIGltcGxlbWVudGF0aW9uXG4gKiBAcGFyYW0ge1N0cmluZ30gbWV0aG9kbmFtZSBwcm9wZXJ0eSB0byBjaGVjayBmb3IgYSBjdXN0b20gaW1wbGVtZW50YXRpb25cbiAqIEByZXR1cm4ge09iamVjdH0gV2hhdGV2ZXIgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgbWV0aG9kIGlzLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfY2hlY2tGb3JNZXRob2QobWV0aG9kbmFtZSwgZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gZm4oKTtcbiAgICB9XG4gICAgdmFyIG9iaiA9IGFyZ3VtZW50c1tsZW5ndGggLSAxXTtcbiAgICByZXR1cm4gX2lzQXJyYXkob2JqKSB8fCB0eXBlb2Ygb2JqW21ldGhvZG5hbWVdICE9PSAnZnVuY3Rpb24nID8gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IG9ialttZXRob2RuYW1lXS5hcHBseShvYmosIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCwgbGVuZ3RoIC0gMSkpO1xuICB9O1xufSIsImltcG9ydCBfY2xvbmVSZWdFeHAgZnJvbSBcIi4vX2Nsb25lUmVnRXhwLmpzXCI7XG5pbXBvcnQgdHlwZSBmcm9tIFwiLi4vdHlwZS5qc1wiO1xuXG4vKipcbiAqIENvcGllcyBhbiBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGJlIGNvcGllZFxuICogQHBhcmFtIHtCb29sZWFufSBkZWVwIFdoZXRoZXIgb3Igbm90IHRvIHBlcmZvcm0gZGVlcCBjbG9uaW5nLlxuICogQHJldHVybiB7Kn0gVGhlIGNvcGllZCB2YWx1ZS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2Nsb25lKHZhbHVlLCBkZWVwLCBtYXApIHtcbiAgbWFwIHx8IChtYXAgPSBuZXcgX09iamVjdE1hcCgpKTtcblxuICAvLyB0aGlzIGF2b2lkcyB0aGUgc2xvd2VyIHN3aXRjaCB3aXRoIGEgcXVpY2sgaWYgZGVjaXNpb24gcmVtb3Zpbmcgc29tZSBtaWxsaXNlY29uZHMgaW4gZWFjaCBydW4uXG4gIGlmIChfaXNQcmltaXRpdmUodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHZhciBjb3B5ID0gZnVuY3Rpb24gY29weShjb3BpZWRWYWx1ZSkge1xuICAgIC8vIENoZWNrIGZvciBjaXJjdWxhciBhbmQgc2FtZSByZWZlcmVuY2VzIG9uIHRoZSBvYmplY3QgZ3JhcGggYW5kIHJldHVybiBpdHMgY29ycmVzcG9uZGluZyBjbG9uZS5cbiAgICB2YXIgY2FjaGVkQ29weSA9IG1hcC5nZXQodmFsdWUpO1xuICAgIGlmIChjYWNoZWRDb3B5KSB7XG4gICAgICByZXR1cm4gY2FjaGVkQ29weTtcbiAgICB9XG4gICAgbWFwLnNldCh2YWx1ZSwgY29waWVkVmFsdWUpO1xuICAgIGZvciAodmFyIGtleSBpbiB2YWx1ZSkge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwga2V5KSkge1xuICAgICAgICBjb3BpZWRWYWx1ZVtrZXldID0gZGVlcCA/IF9jbG9uZSh2YWx1ZVtrZXldLCB0cnVlLCBtYXApIDogdmFsdWVba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvcGllZFZhbHVlO1xuICB9O1xuICBzd2l0Y2ggKHR5cGUodmFsdWUpKSB7XG4gICAgY2FzZSAnT2JqZWN0JzpcbiAgICAgIHJldHVybiBjb3B5KE9iamVjdC5jcmVhdGUoT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKSkpO1xuICAgIGNhc2UgJ0FycmF5JzpcbiAgICAgIHJldHVybiBjb3B5KEFycmF5KHZhbHVlLmxlbmd0aCkpO1xuICAgIGNhc2UgJ0RhdGUnOlxuICAgICAgcmV0dXJuIG5ldyBEYXRlKHZhbHVlLnZhbHVlT2YoKSk7XG4gICAgY2FzZSAnUmVnRXhwJzpcbiAgICAgIHJldHVybiBfY2xvbmVSZWdFeHAodmFsdWUpO1xuICAgIGNhc2UgJ0ludDhBcnJheSc6XG4gICAgY2FzZSAnVWludDhBcnJheSc6XG4gICAgY2FzZSAnVWludDhDbGFtcGVkQXJyYXknOlxuICAgIGNhc2UgJ0ludDE2QXJyYXknOlxuICAgIGNhc2UgJ1VpbnQxNkFycmF5JzpcbiAgICBjYXNlICdJbnQzMkFycmF5JzpcbiAgICBjYXNlICdVaW50MzJBcnJheSc6XG4gICAgY2FzZSAnRmxvYXQzMkFycmF5JzpcbiAgICBjYXNlICdGbG9hdDY0QXJyYXknOlxuICAgIGNhc2UgJ0JpZ0ludDY0QXJyYXknOlxuICAgIGNhc2UgJ0JpZ1VpbnQ2NEFycmF5JzpcbiAgICAgIHJldHVybiB2YWx1ZS5zbGljZSgpO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cbmZ1bmN0aW9uIF9pc1ByaW1pdGl2ZShwYXJhbSkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiBwYXJhbTtcbiAgcmV0dXJuIHBhcmFtID09IG51bGwgfHwgdHlwZSAhPSAnb2JqZWN0JyAmJiB0eXBlICE9ICdmdW5jdGlvbic7XG59XG52YXIgX09iamVjdE1hcCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIF9PYmplY3RNYXAoKSB7XG4gICAgdGhpcy5tYXAgPSB7fTtcbiAgICB0aGlzLmxlbmd0aCA9IDA7XG4gIH1cbiAgX09iamVjdE1hcC5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICB2YXIgaGFzaGVkS2V5ID0gdGhpcy5oYXNoKGtleSk7XG4gICAgdmFyIGJ1Y2tldCA9IHRoaXMubWFwW2hhc2hlZEtleV07XG4gICAgaWYgKCFidWNrZXQpIHtcbiAgICAgIHRoaXMubWFwW2hhc2hlZEtleV0gPSBidWNrZXQgPSBbXTtcbiAgICB9XG4gICAgYnVja2V0LnB1c2goW2tleSwgdmFsdWVdKTtcbiAgICB0aGlzLmxlbmd0aCArPSAxO1xuICB9O1xuICBfT2JqZWN0TWFwLnByb3RvdHlwZS5oYXNoID0gZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciBoYXNoZWRLZXkgPSBbXTtcbiAgICBmb3IgKHZhciB2YWx1ZSBpbiBrZXkpIHtcbiAgICAgIGhhc2hlZEtleS5wdXNoKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChrZXlbdmFsdWVdKSk7XG4gICAgfVxuICAgIHJldHVybiBoYXNoZWRLZXkuam9pbigpO1xuICB9O1xuICBfT2JqZWN0TWFwLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgLyoqXG4gICAgICogZGVwZW5kaW5nIG9uIHRoZSBudW1iZXIgb2Ygb2JqZWN0cyB0byBiZSBjbG9uZWQgaXMgZmFzdGVyIHRvIGp1c3QgaXRlcmF0ZSBvdmVyIHRoZSBpdGVtcyBpbiB0aGUgbWFwIGp1c3QgYmVjYXVzZSB0aGUgaGFzaCBmdW5jdGlvbiBpcyBzbyBjb3N0bHksXG4gICAgICogb24gbXkgdGVzdHMgdGhpcyBudW1iZXIgaXMgMTgwLCBhbnl0aGluZyBhYm92ZSB0aGF0IHVzaW5nIHRoZSBoYXNoIGZ1bmN0aW9uIGlzIGZhc3Rlci5cbiAgICAgKi9cbiAgICBpZiAodGhpcy5sZW5ndGggPD0gMTgwKSB7XG4gICAgICBmb3IgKHZhciBwIGluIHRoaXMubWFwKSB7XG4gICAgICAgIHZhciBidWNrZXQgPSB0aGlzLm1hcFtwXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBidWNrZXQubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICB2YXIgZWxlbWVudCA9IGJ1Y2tldFtpXTtcbiAgICAgICAgICBpZiAoZWxlbWVudFswXSA9PT0ga2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudFsxXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGhhc2hlZEtleSA9IHRoaXMuaGFzaChrZXkpO1xuICAgIHZhciBidWNrZXQgPSB0aGlzLm1hcFtoYXNoZWRLZXldO1xuICAgIGlmICghYnVja2V0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnVja2V0Lmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICB2YXIgZWxlbWVudCA9IGJ1Y2tldFtpXTtcbiAgICAgIGlmIChlbGVtZW50WzBdID09PSBrZXkpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnRbMV07XG4gICAgICB9XG4gICAgfVxuICB9O1xuICByZXR1cm4gX09iamVjdE1hcDtcbn0oKTsiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfY2xvbmVSZWdFeHAocGF0dGVybikge1xuICByZXR1cm4gbmV3IFJlZ0V4cChwYXR0ZXJuLnNvdXJjZSwgcGF0dGVybi5mbGFncyA/IHBhdHRlcm4uZmxhZ3MgOiAocGF0dGVybi5nbG9iYWwgPyAnZycgOiAnJykgKyAocGF0dGVybi5pZ25vcmVDYXNlID8gJ2knIDogJycpICsgKHBhdHRlcm4ubXVsdGlsaW5lID8gJ20nIDogJycpICsgKHBhdHRlcm4uc3RpY2t5ID8gJ3knIDogJycpICsgKHBhdHRlcm4udW5pY29kZSA/ICd1JyA6ICcnKSArIChwYXR0ZXJuLmRvdEFsbCA/ICdzJyA6ICcnKSk7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2NvbXBsZW1lbnQoZikge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAhZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufSIsIi8qKlxuICogUHJpdmF0ZSBgY29uY2F0YCBmdW5jdGlvbiB0byBtZXJnZSB0d28gYXJyYXktbGlrZSBvYmplY3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fEFyZ3VtZW50c30gW3NldDE9W11dIEFuIGFycmF5LWxpa2Ugb2JqZWN0LlxuICogQHBhcmFtIHtBcnJheXxBcmd1bWVudHN9IFtzZXQyPVtdXSBBbiBhcnJheS1saWtlIG9iamVjdC5cbiAqIEByZXR1cm4ge0FycmF5fSBBIG5ldywgbWVyZ2VkIGFycmF5LlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIF9jb25jYXQoWzQsIDUsIDZdLCBbMSwgMiwgM10pOyAvLz0+IFs0LCA1LCA2LCAxLCAyLCAzXVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfY29uY2F0KHNldDEsIHNldDIpIHtcbiAgc2V0MSA9IHNldDEgfHwgW107XG4gIHNldDIgPSBzZXQyIHx8IFtdO1xuICB2YXIgaWR4O1xuICB2YXIgbGVuMSA9IHNldDEubGVuZ3RoO1xuICB2YXIgbGVuMiA9IHNldDIubGVuZ3RoO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIGlkeCA9IDA7XG4gIHdoaWxlIChpZHggPCBsZW4xKSB7XG4gICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGhdID0gc2V0MVtpZHhdO1xuICAgIGlkeCArPSAxO1xuICB9XG4gIGlkeCA9IDA7XG4gIHdoaWxlIChpZHggPCBsZW4yKSB7XG4gICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGhdID0gc2V0MltpZHhdO1xuICAgIGlkeCArPSAxO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59IiwiaW1wb3J0IF9pc0FycmF5TGlrZSBmcm9tIFwiLi9faXNBcnJheUxpa2UuanNcIjtcbnZhciBzeW1JdGVyYXRvciA9IHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnID8gU3ltYm9sLml0ZXJhdG9yIDogJ0BAaXRlcmF0b3InO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2NyZWF0ZVJlZHVjZShhcnJheVJlZHVjZSwgbWV0aG9kUmVkdWNlLCBpdGVyYWJsZVJlZHVjZSkge1xuICByZXR1cm4gZnVuY3Rpb24gX3JlZHVjZSh4ZiwgYWNjLCBsaXN0KSB7XG4gICAgaWYgKF9pc0FycmF5TGlrZShsaXN0KSkge1xuICAgICAgcmV0dXJuIGFycmF5UmVkdWNlKHhmLCBhY2MsIGxpc3QpO1xuICAgIH1cbiAgICBpZiAobGlzdCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGxpc3RbJ2ZhbnRhc3ktbGFuZC9yZWR1Y2UnXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIG1ldGhvZFJlZHVjZSh4ZiwgYWNjLCBsaXN0LCAnZmFudGFzeS1sYW5kL3JlZHVjZScpO1xuICAgIH1cbiAgICBpZiAobGlzdFtzeW1JdGVyYXRvcl0gIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGl0ZXJhYmxlUmVkdWNlKHhmLCBhY2MsIGxpc3Rbc3ltSXRlcmF0b3JdKCkpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGxpc3QubmV4dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGl0ZXJhYmxlUmVkdWNlKHhmLCBhY2MsIGxpc3QpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGxpc3QucmVkdWNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gbWV0aG9kUmVkdWNlKHhmLCBhY2MsIGxpc3QsICdyZWR1Y2UnKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncmVkdWNlOiBsaXN0IG11c3QgYmUgYXJyYXkgb3IgaXRlcmFibGUnKTtcbiAgfTtcbn0iLCJpbXBvcnQgX2lzUGxhY2Vob2xkZXIgZnJvbSBcIi4vX2lzUGxhY2Vob2xkZXIuanNcIjtcblxuLyoqXG4gKiBPcHRpbWl6ZWQgaW50ZXJuYWwgb25lLWFyaXR5IGN1cnJ5IGZ1bmN0aW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBjdXJyeS5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBUaGUgY3VycmllZCBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2N1cnJ5MShmbikge1xuICByZXR1cm4gZnVuY3Rpb24gZjEoYSkge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwIHx8IF9pc1BsYWNlaG9sZGVyKGEpKSB7XG4gICAgICByZXR1cm4gZjE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cbiAgfTtcbn0iLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9fY3VycnkxLmpzXCI7XG5pbXBvcnQgX2lzUGxhY2Vob2xkZXIgZnJvbSBcIi4vX2lzUGxhY2Vob2xkZXIuanNcIjtcblxuLyoqXG4gKiBPcHRpbWl6ZWQgaW50ZXJuYWwgdHdvLWFyaXR5IGN1cnJ5IGZ1bmN0aW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBjdXJyeS5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBUaGUgY3VycmllZCBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2N1cnJ5Mihmbikge1xuICByZXR1cm4gZnVuY3Rpb24gZjIoYSwgYikge1xuICAgIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICByZXR1cm4gZjI7XG4gICAgICBjYXNlIDE6XG4gICAgICAgIHJldHVybiBfaXNQbGFjZWhvbGRlcihhKSA/IGYyIDogX2N1cnJ5MShmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICByZXR1cm4gZm4oYSwgX2IpO1xuICAgICAgICB9KTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBfaXNQbGFjZWhvbGRlcihhKSAmJiBfaXNQbGFjZWhvbGRlcihiKSA/IGYyIDogX2lzUGxhY2Vob2xkZXIoYSkgPyBfY3VycnkxKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgIHJldHVybiBmbihfYSwgYik7XG4gICAgICAgIH0pIDogX2lzUGxhY2Vob2xkZXIoYikgPyBfY3VycnkxKGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgIHJldHVybiBmbihhLCBfYik7XG4gICAgICAgIH0pIDogZm4oYSwgYik7XG4gICAgfVxuICB9O1xufSIsImltcG9ydCBfY3VycnkxIGZyb20gXCIuL19jdXJyeTEuanNcIjtcbmltcG9ydCBfY3VycnkyIGZyb20gXCIuL19jdXJyeTIuanNcIjtcbmltcG9ydCBfaXNQbGFjZWhvbGRlciBmcm9tIFwiLi9faXNQbGFjZWhvbGRlci5qc1wiO1xuXG4vKipcbiAqIE9wdGltaXplZCBpbnRlcm5hbCB0aHJlZS1hcml0eSBjdXJyeSBmdW5jdGlvbi5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gY3VycnkuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gVGhlIGN1cnJpZWQgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9jdXJyeTMoZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGYzKGEsIGIsIGMpIHtcbiAgICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgIGNhc2UgMDpcbiAgICAgICAgcmV0dXJuIGYzO1xuICAgICAgY2FzZSAxOlxuICAgICAgICByZXR1cm4gX2lzUGxhY2Vob2xkZXIoYSkgPyBmMyA6IF9jdXJyeTIoZnVuY3Rpb24gKF9iLCBfYykge1xuICAgICAgICAgIHJldHVybiBmbihhLCBfYiwgX2MpO1xuICAgICAgICB9KTtcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgcmV0dXJuIF9pc1BsYWNlaG9sZGVyKGEpICYmIF9pc1BsYWNlaG9sZGVyKGIpID8gZjMgOiBfaXNQbGFjZWhvbGRlcihhKSA/IF9jdXJyeTIoZnVuY3Rpb24gKF9hLCBfYykge1xuICAgICAgICAgIHJldHVybiBmbihfYSwgYiwgX2MpO1xuICAgICAgICB9KSA6IF9pc1BsYWNlaG9sZGVyKGIpID8gX2N1cnJ5MihmdW5jdGlvbiAoX2IsIF9jKSB7XG4gICAgICAgICAgcmV0dXJuIGZuKGEsIF9iLCBfYyk7XG4gICAgICAgIH0pIDogX2N1cnJ5MShmdW5jdGlvbiAoX2MpIHtcbiAgICAgICAgICByZXR1cm4gZm4oYSwgYiwgX2MpO1xuICAgICAgICB9KTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBfaXNQbGFjZWhvbGRlcihhKSAmJiBfaXNQbGFjZWhvbGRlcihiKSAmJiBfaXNQbGFjZWhvbGRlcihjKSA/IGYzIDogX2lzUGxhY2Vob2xkZXIoYSkgJiYgX2lzUGxhY2Vob2xkZXIoYikgPyBfY3VycnkyKGZ1bmN0aW9uIChfYSwgX2IpIHtcbiAgICAgICAgICByZXR1cm4gZm4oX2EsIF9iLCBjKTtcbiAgICAgICAgfSkgOiBfaXNQbGFjZWhvbGRlcihhKSAmJiBfaXNQbGFjZWhvbGRlcihjKSA/IF9jdXJyeTIoZnVuY3Rpb24gKF9hLCBfYykge1xuICAgICAgICAgIHJldHVybiBmbihfYSwgYiwgX2MpO1xuICAgICAgICB9KSA6IF9pc1BsYWNlaG9sZGVyKGIpICYmIF9pc1BsYWNlaG9sZGVyKGMpID8gX2N1cnJ5MihmdW5jdGlvbiAoX2IsIF9jKSB7XG4gICAgICAgICAgcmV0dXJuIGZuKGEsIF9iLCBfYyk7XG4gICAgICAgIH0pIDogX2lzUGxhY2Vob2xkZXIoYSkgPyBfY3VycnkxKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgIHJldHVybiBmbihfYSwgYiwgYyk7XG4gICAgICAgIH0pIDogX2lzUGxhY2Vob2xkZXIoYikgPyBfY3VycnkxKGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgIHJldHVybiBmbihhLCBfYiwgYyk7XG4gICAgICAgIH0pIDogX2lzUGxhY2Vob2xkZXIoYykgPyBfY3VycnkxKGZ1bmN0aW9uIChfYykge1xuICAgICAgICAgIHJldHVybiBmbihhLCBiLCBfYyk7XG4gICAgICAgIH0pIDogZm4oYSwgYiwgYyk7XG4gICAgfVxuICB9O1xufSIsImltcG9ydCBfYXJpdHkgZnJvbSBcIi4vX2FyaXR5LmpzXCI7XG5pbXBvcnQgX2lzUGxhY2Vob2xkZXIgZnJvbSBcIi4vX2lzUGxhY2Vob2xkZXIuanNcIjtcblxuLyoqXG4gKiBJbnRlcm5hbCBjdXJyeU4gZnVuY3Rpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtOdW1iZXJ9IGxlbmd0aCBUaGUgYXJpdHkgb2YgdGhlIGN1cnJpZWQgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge0FycmF5fSByZWNlaXZlZCBBbiBhcnJheSBvZiBhcmd1bWVudHMgcmVjZWl2ZWQgdGh1cyBmYXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gY3VycnkuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gVGhlIGN1cnJpZWQgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9jdXJyeU4obGVuZ3RoLCByZWNlaXZlZCwgZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY29tYmluZWQgPSBbXTtcbiAgICB2YXIgYXJnc0lkeCA9IDA7XG4gICAgdmFyIGxlZnQgPSBsZW5ndGg7XG4gICAgdmFyIGNvbWJpbmVkSWR4ID0gMDtcbiAgICB2YXIgaGFzUGxhY2Vob2xkZXIgPSBmYWxzZTtcbiAgICB3aGlsZSAoY29tYmluZWRJZHggPCByZWNlaXZlZC5sZW5ndGggfHwgYXJnc0lkeCA8IGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgIHZhciByZXN1bHQ7XG4gICAgICBpZiAoY29tYmluZWRJZHggPCByZWNlaXZlZC5sZW5ndGggJiYgKCFfaXNQbGFjZWhvbGRlcihyZWNlaXZlZFtjb21iaW5lZElkeF0pIHx8IGFyZ3NJZHggPj0gYXJndW1lbnRzLmxlbmd0aCkpIHtcbiAgICAgICAgcmVzdWx0ID0gcmVjZWl2ZWRbY29tYmluZWRJZHhdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gYXJndW1lbnRzW2FyZ3NJZHhdO1xuICAgICAgICBhcmdzSWR4ICs9IDE7XG4gICAgICB9XG4gICAgICBjb21iaW5lZFtjb21iaW5lZElkeF0gPSByZXN1bHQ7XG4gICAgICBpZiAoIV9pc1BsYWNlaG9sZGVyKHJlc3VsdCkpIHtcbiAgICAgICAgbGVmdCAtPSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaGFzUGxhY2Vob2xkZXIgPSB0cnVlO1xuICAgICAgfVxuICAgICAgY29tYmluZWRJZHggKz0gMTtcbiAgICB9XG4gICAgcmV0dXJuICFoYXNQbGFjZWhvbGRlciAmJiBsZWZ0IDw9IDAgPyBmbi5hcHBseSh0aGlzLCBjb21iaW5lZCkgOiBfYXJpdHkoTWF0aC5tYXgoMCwgbGVmdCksIF9jdXJyeU4obGVuZ3RoLCBjb21iaW5lZCwgZm4pKTtcbiAgfTtcbn0iLCJpbXBvcnQgX2lzQXJyYXkgZnJvbSBcIi4vX2lzQXJyYXkuanNcIjtcbmltcG9ydCBfaXNUcmFuc2Zvcm1lciBmcm9tIFwiLi9faXNUcmFuc2Zvcm1lci5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGRpc3BhdGNoZXMgd2l0aCBkaWZmZXJlbnQgc3RyYXRlZ2llcyBiYXNlZCBvbiB0aGVcbiAqIG9iamVjdCBpbiBsaXN0IHBvc2l0aW9uIChsYXN0IGFyZ3VtZW50KS4gSWYgaXQgaXMgYW4gYXJyYXksIGV4ZWN1dGVzIFtmbl0uXG4gKiBPdGhlcndpc2UsIGlmIGl0IGhhcyBhIGZ1bmN0aW9uIHdpdGggb25lIG9mIHRoZSBnaXZlbiBtZXRob2QgbmFtZXMsIGl0IHdpbGxcbiAqIGV4ZWN1dGUgdGhhdCBmdW5jdGlvbiAoZnVuY3RvciBjYXNlKS4gT3RoZXJ3aXNlLCBpZiBpdCBpcyBhIHRyYW5zZm9ybWVyLFxuICogdXNlcyB0cmFuc2R1Y2VyIGNyZWF0ZWQgYnkgW3RyYW5zZHVjZXJDcmVhdG9yXSB0byByZXR1cm4gYSBuZXcgdHJhbnNmb3JtZXJcbiAqICh0cmFuc2R1Y2VyIGNhc2UpLlxuICogT3RoZXJ3aXNlLCBpdCB3aWxsIGRlZmF1bHQgdG8gZXhlY3V0aW5nIFtmbl0uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IG1ldGhvZE5hbWVzIHByb3BlcnRpZXMgdG8gY2hlY2sgZm9yIGEgY3VzdG9tIGltcGxlbWVudGF0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0cmFuc2R1Y2VyQ3JlYXRvciB0cmFuc2R1Y2VyIGZhY3RvcnkgaWYgb2JqZWN0IGlzIHRyYW5zZm9ybWVyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBkZWZhdWx0IHJhbWRhIGltcGxlbWVudGF0aW9uXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBmdW5jdGlvbiB0aGF0IGRpc3BhdGNoZXMgb24gb2JqZWN0IGluIGxpc3QgcG9zaXRpb25cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2Rpc3BhdGNoYWJsZShtZXRob2ROYW1lcywgdHJhbnNkdWNlckNyZWF0b3IsIGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmbigpO1xuICAgIH1cbiAgICB2YXIgb2JqID0gYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXTtcbiAgICBpZiAoIV9pc0FycmF5KG9iaikpIHtcbiAgICAgIHZhciBpZHggPSAwO1xuICAgICAgd2hpbGUgKGlkeCA8IG1ldGhvZE5hbWVzLmxlbmd0aCkge1xuICAgICAgICBpZiAodHlwZW9mIG9ialttZXRob2ROYW1lc1tpZHhdXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiBvYmpbbWV0aG9kTmFtZXNbaWR4XV0uYXBwbHkob2JqLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDAsIC0xKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWR4ICs9IDE7XG4gICAgICB9XG4gICAgICBpZiAoX2lzVHJhbnNmb3JtZXIob2JqKSkge1xuICAgICAgICB2YXIgdHJhbnNkdWNlciA9IHRyYW5zZHVjZXJDcmVhdG9yLmFwcGx5KG51bGwsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCwgLTEpKTtcbiAgICAgICAgcmV0dXJuIHRyYW5zZHVjZXIob2JqKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59IiwiaW1wb3J0IF9pc0ludGVnZXIgZnJvbSBcIi4vX2lzSW50ZWdlci5qc1wiO1xuaW1wb3J0IF9pc0FycmF5IGZyb20gXCIuL19pc0FycmF5LmpzXCI7XG5pbXBvcnQgcmVtb3ZlIGZyb20gXCIuLi9yZW1vdmUuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IG9iamVjdCB0aGF0IGRvZXMgbm90IGNvbnRhaW4gYSBgcHJvcGAgcHJvcGVydHkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0gcHJvcCBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gZGlzc29jaWF0ZVxuICogQHBhcmFtIHtPYmplY3R8QXJyYXl9IG9iaiBUaGUgb2JqZWN0IHRvIGNsb25lXG4gKiBAcmV0dXJuIHtPYmplY3R9IEEgbmV3IG9iamVjdCBlcXVpdmFsZW50IHRvIHRoZSBvcmlnaW5hbCBidXQgd2l0aG91dCB0aGUgc3BlY2lmaWVkIHByb3BlcnR5XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9kaXNzb2MocHJvcCwgb2JqKSB7XG4gIGlmIChvYmogPT0gbnVsbCkge1xuICAgIHJldHVybiBvYmo7XG4gIH1cbiAgaWYgKF9pc0ludGVnZXIocHJvcCkgJiYgX2lzQXJyYXkob2JqKSkge1xuICAgIHJldHVybiByZW1vdmUocHJvcCwgMSwgb2JqKTtcbiAgfVxuICB2YXIgcmVzdWx0ID0ge307XG4gIGZvciAodmFyIHAgaW4gb2JqKSB7XG4gICAgcmVzdWx0W3BdID0gb2JqW3BdO1xuICB9XG4gIGRlbGV0ZSByZXN1bHRbcHJvcF07XG4gIHJldHVybiByZXN1bHQ7XG59IiwiaW1wb3J0IF9hcnJheUZyb21JdGVyYXRvciBmcm9tIFwiLi9fYXJyYXlGcm9tSXRlcmF0b3IuanNcIjtcbmltcG9ydCBfaW5jbHVkZXNXaXRoIGZyb20gXCIuL19pbmNsdWRlc1dpdGguanNcIjtcbmltcG9ydCBfZnVuY3Rpb25OYW1lIGZyb20gXCIuL19mdW5jdGlvbk5hbWUuanNcIjtcbmltcG9ydCBfaGFzIGZyb20gXCIuL19oYXMuanNcIjtcbmltcG9ydCBfb2JqZWN0SXMgZnJvbSBcIi4vX29iamVjdElzLmpzXCI7XG5pbXBvcnQga2V5cyBmcm9tIFwiLi4va2V5cy5qc1wiO1xuaW1wb3J0IHR5cGUgZnJvbSBcIi4uL3R5cGUuanNcIjtcblxuLyoqXG4gKiBwcml2YXRlIF91bmlxQ29udGVudEVxdWFscyBmdW5jdGlvbi5cbiAqIFRoYXQgZnVuY3Rpb24gaXMgY2hlY2tpbmcgZXF1YWxpdHkgb2YgMiBpdGVyYXRvciBjb250ZW50cyB3aXRoIDIgYXNzdW1wdGlvbnNcbiAqIC0gaXRlcmF0b3JzIGxlbmd0aHMgYXJlIHRoZSBzYW1lXG4gKiAtIGl0ZXJhdG9ycyB2YWx1ZXMgYXJlIHVuaXF1ZVxuICpcbiAqIGZhbHNlLXBvc2l0aXZlIHJlc3VsdCB3aWxsIGJlIHJldHVybmVkIGZvciBjb21wYXJpc29uIG9mLCBlLmcuXG4gKiAtIFsxLDIsM10gYW5kIFsxLDIsMyw0XVxuICogLSBbMSwxLDFdIGFuZCBbMSwyLDNdXG4gKiAqL1xuXG5mdW5jdGlvbiBfdW5pcUNvbnRlbnRFcXVhbHMoYUl0ZXJhdG9yLCBiSXRlcmF0b3IsIHN0YWNrQSwgc3RhY2tCKSB7XG4gIHZhciBhID0gX2FycmF5RnJvbUl0ZXJhdG9yKGFJdGVyYXRvcik7XG4gIHZhciBiID0gX2FycmF5RnJvbUl0ZXJhdG9yKGJJdGVyYXRvcik7XG4gIGZ1bmN0aW9uIGVxKF9hLCBfYikge1xuICAgIHJldHVybiBfZXF1YWxzKF9hLCBfYiwgc3RhY2tBLnNsaWNlKCksIHN0YWNrQi5zbGljZSgpKTtcbiAgfVxuXG4gIC8vIGlmICphKiBhcnJheSBjb250YWlucyBhbnkgZWxlbWVudCB0aGF0IGlzIG5vdCBpbmNsdWRlZCBpbiAqYipcbiAgcmV0dXJuICFfaW5jbHVkZXNXaXRoKGZ1bmN0aW9uIChiLCBhSXRlbSkge1xuICAgIHJldHVybiAhX2luY2x1ZGVzV2l0aChlcSwgYUl0ZW0sIGIpO1xuICB9LCBiLCBhKTtcbn1cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9lcXVhbHMoYSwgYiwgc3RhY2tBLCBzdGFja0IpIHtcbiAgaWYgKF9vYmplY3RJcyhhLCBiKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHZhciB0eXBlQSA9IHR5cGUoYSk7XG4gIGlmICh0eXBlQSAhPT0gdHlwZShiKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAodHlwZW9mIGFbJ2ZhbnRhc3ktbGFuZC9lcXVhbHMnXSA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgYlsnZmFudGFzeS1sYW5kL2VxdWFscyddID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBhWydmYW50YXN5LWxhbmQvZXF1YWxzJ10gPT09ICdmdW5jdGlvbicgJiYgYVsnZmFudGFzeS1sYW5kL2VxdWFscyddKGIpICYmIHR5cGVvZiBiWydmYW50YXN5LWxhbmQvZXF1YWxzJ10gPT09ICdmdW5jdGlvbicgJiYgYlsnZmFudGFzeS1sYW5kL2VxdWFscyddKGEpO1xuICB9XG4gIGlmICh0eXBlb2YgYS5lcXVhbHMgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGIuZXF1YWxzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBhLmVxdWFscyA9PT0gJ2Z1bmN0aW9uJyAmJiBhLmVxdWFscyhiKSAmJiB0eXBlb2YgYi5lcXVhbHMgPT09ICdmdW5jdGlvbicgJiYgYi5lcXVhbHMoYSk7XG4gIH1cbiAgc3dpdGNoICh0eXBlQSkge1xuICAgIGNhc2UgJ0FyZ3VtZW50cyc6XG4gICAgY2FzZSAnQXJyYXknOlxuICAgIGNhc2UgJ09iamVjdCc6XG4gICAgICBpZiAodHlwZW9mIGEuY29uc3RydWN0b3IgPT09ICdmdW5jdGlvbicgJiYgX2Z1bmN0aW9uTmFtZShhLmNvbnN0cnVjdG9yKSA9PT0gJ1Byb21pc2UnKSB7XG4gICAgICAgIHJldHVybiBhID09PSBiO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnQm9vbGVhbic6XG4gICAgY2FzZSAnTnVtYmVyJzpcbiAgICBjYXNlICdTdHJpbmcnOlxuICAgICAgaWYgKCEodHlwZW9mIGEgPT09IHR5cGVvZiBiICYmIF9vYmplY3RJcyhhLnZhbHVlT2YoKSwgYi52YWx1ZU9mKCkpKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdEYXRlJzpcbiAgICAgIGlmICghX29iamVjdElzKGEudmFsdWVPZigpLCBiLnZhbHVlT2YoKSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnRXJyb3InOlxuICAgICAgcmV0dXJuIGEubmFtZSA9PT0gYi5uYW1lICYmIGEubWVzc2FnZSA9PT0gYi5tZXNzYWdlO1xuICAgIGNhc2UgJ1JlZ0V4cCc6XG4gICAgICBpZiAoIShhLnNvdXJjZSA9PT0gYi5zb3VyY2UgJiYgYS5nbG9iYWwgPT09IGIuZ2xvYmFsICYmIGEuaWdub3JlQ2FzZSA9PT0gYi5pZ25vcmVDYXNlICYmIGEubXVsdGlsaW5lID09PSBiLm11bHRpbGluZSAmJiBhLnN0aWNreSA9PT0gYi5zdGlja3kgJiYgYS51bmljb2RlID09PSBiLnVuaWNvZGUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICB9XG4gIHZhciBpZHggPSBzdGFja0EubGVuZ3RoIC0gMTtcbiAgd2hpbGUgKGlkeCA+PSAwKSB7XG4gICAgaWYgKHN0YWNrQVtpZHhdID09PSBhKSB7XG4gICAgICByZXR1cm4gc3RhY2tCW2lkeF0gPT09IGI7XG4gICAgfVxuICAgIGlkeCAtPSAxO1xuICB9XG4gIHN3aXRjaCAodHlwZUEpIHtcbiAgICBjYXNlICdNYXAnOlxuICAgICAgaWYgKGEuc2l6ZSAhPT0gYi5zaXplKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBfdW5pcUNvbnRlbnRFcXVhbHMoYS5lbnRyaWVzKCksIGIuZW50cmllcygpLCBzdGFja0EuY29uY2F0KFthXSksIHN0YWNrQi5jb25jYXQoW2JdKSk7XG4gICAgY2FzZSAnU2V0JzpcbiAgICAgIGlmIChhLnNpemUgIT09IGIuc2l6ZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gX3VuaXFDb250ZW50RXF1YWxzKGEudmFsdWVzKCksIGIudmFsdWVzKCksIHN0YWNrQS5jb25jYXQoW2FdKSwgc3RhY2tCLmNvbmNhdChbYl0pKTtcbiAgICBjYXNlICdBcmd1bWVudHMnOlxuICAgIGNhc2UgJ0FycmF5JzpcbiAgICBjYXNlICdPYmplY3QnOlxuICAgIGNhc2UgJ0Jvb2xlYW4nOlxuICAgIGNhc2UgJ051bWJlcic6XG4gICAgY2FzZSAnU3RyaW5nJzpcbiAgICBjYXNlICdEYXRlJzpcbiAgICBjYXNlICdFcnJvcic6XG4gICAgY2FzZSAnUmVnRXhwJzpcbiAgICBjYXNlICdJbnQ4QXJyYXknOlxuICAgIGNhc2UgJ1VpbnQ4QXJyYXknOlxuICAgIGNhc2UgJ1VpbnQ4Q2xhbXBlZEFycmF5JzpcbiAgICBjYXNlICdJbnQxNkFycmF5JzpcbiAgICBjYXNlICdVaW50MTZBcnJheSc6XG4gICAgY2FzZSAnSW50MzJBcnJheSc6XG4gICAgY2FzZSAnVWludDMyQXJyYXknOlxuICAgIGNhc2UgJ0Zsb2F0MzJBcnJheSc6XG4gICAgY2FzZSAnRmxvYXQ2NEFycmF5JzpcbiAgICBjYXNlICdBcnJheUJ1ZmZlcic6XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgLy8gVmFsdWVzIG9mIG90aGVyIHR5cGVzIGFyZSBvbmx5IGVxdWFsIGlmIGlkZW50aWNhbC5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIga2V5c0EgPSBrZXlzKGEpO1xuICBpZiAoa2V5c0EubGVuZ3RoICE9PSBrZXlzKGIpLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgZXh0ZW5kZWRTdGFja0EgPSBzdGFja0EuY29uY2F0KFthXSk7XG4gIHZhciBleHRlbmRlZFN0YWNrQiA9IHN0YWNrQi5jb25jYXQoW2JdKTtcbiAgaWR4ID0ga2V5c0EubGVuZ3RoIC0gMTtcbiAgd2hpbGUgKGlkeCA+PSAwKSB7XG4gICAgdmFyIGtleSA9IGtleXNBW2lkeF07XG4gICAgaWYgKCEoX2hhcyhrZXksIGIpICYmIF9lcXVhbHMoYltrZXldLCBhW2tleV0sIGV4dGVuZGVkU3RhY2tBLCBleHRlbmRlZFN0YWNrQikpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlkeCAtPSAxO1xuICB9XG4gIHJldHVybiB0cnVlO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9maWx0ZXIoZm4sIGxpc3QpIHtcbiAgdmFyIGlkeCA9IDA7XG4gIHZhciBsZW4gPSBsaXN0Lmxlbmd0aDtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB3aGlsZSAoaWR4IDwgbGVuKSB7XG4gICAgaWYgKGZuKGxpc3RbaWR4XSkpIHtcbiAgICAgIHJlc3VsdFtyZXN1bHQubGVuZ3RoXSA9IGxpc3RbaWR4XTtcbiAgICB9XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfZnVuY3Rpb25OYW1lKGYpIHtcbiAgLy8gU3RyaW5nKHggPT4geCkgZXZhbHVhdGVzIHRvIFwieCA9PiB4XCIsIHNvIHRoZSBwYXR0ZXJuIG1heSBub3QgbWF0Y2guXG4gIHZhciBtYXRjaCA9IFN0cmluZyhmKS5tYXRjaCgvXmZ1bmN0aW9uIChcXHcqKS8pO1xuICByZXR1cm4gbWF0Y2ggPT0gbnVsbCA/ICcnIDogbWF0Y2hbMV07XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2hhcyhwcm9wLCBvYmopIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9pZGVudGl0eSh4KSB7XG4gIHJldHVybiB4O1xufSIsImltcG9ydCBfaW5kZXhPZiBmcm9tIFwiLi9faW5kZXhPZi5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2luY2x1ZGVzKGEsIGxpc3QpIHtcbiAgcmV0dXJuIF9pbmRleE9mKGxpc3QsIGEsIDApID49IDA7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2luY2x1ZGVzV2l0aChwcmVkLCB4LCBsaXN0KSB7XG4gIHZhciBpZHggPSAwO1xuICB2YXIgbGVuID0gbGlzdC5sZW5ndGg7XG4gIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICBpZiAocHJlZCh4LCBsaXN0W2lkeF0pKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufSIsImltcG9ydCBlcXVhbHMgZnJvbSBcIi4uL2VxdWFscy5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2luZGV4T2YobGlzdCwgYSwgaWR4KSB7XG4gIHZhciBpbmYsIGl0ZW07XG4gIC8vIEFycmF5LnByb3RvdHlwZS5pbmRleE9mIGRvZXNuJ3QgZXhpc3QgYmVsb3cgSUU5XG4gIGlmICh0eXBlb2YgbGlzdC5pbmRleE9mID09PSAnZnVuY3Rpb24nKSB7XG4gICAgc3dpdGNoICh0eXBlb2YgYSkge1xuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgaWYgKGEgPT09IDApIHtcbiAgICAgICAgICAvLyBtYW51YWxseSBjcmF3bCB0aGUgbGlzdCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuICswIGFuZCAtMFxuICAgICAgICAgIGluZiA9IDEgLyBhO1xuICAgICAgICAgIHdoaWxlIChpZHggPCBsaXN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgaXRlbSA9IGxpc3RbaWR4XTtcbiAgICAgICAgICAgIGlmIChpdGVtID09PSAwICYmIDEgLyBpdGVtID09PSBpbmYpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGlkeDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlkeCArPSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH0gZWxzZSBpZiAoYSAhPT0gYSkge1xuICAgICAgICAgIC8vIE5hTlxuICAgICAgICAgIHdoaWxlIChpZHggPCBsaXN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgaXRlbSA9IGxpc3RbaWR4XTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ251bWJlcicgJiYgaXRlbSAhPT0gaXRlbSkge1xuICAgICAgICAgICAgICByZXR1cm4gaWR4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWR4ICs9IDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICAvLyBub24temVybyBudW1iZXJzIGNhbiB1dGlsaXNlIFNldFxuICAgICAgICByZXR1cm4gbGlzdC5pbmRleE9mKGEsIGlkeCk7XG5cbiAgICAgIC8vIGFsbCB0aGVzZSB0eXBlcyBjYW4gdXRpbGlzZSBTZXRcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICAgIHJldHVybiBsaXN0LmluZGV4T2YoYSwgaWR4KTtcbiAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgIGlmIChhID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gbnVsbCBjYW4gdXRpbGlzZSBTZXRcbiAgICAgICAgICByZXR1cm4gbGlzdC5pbmRleE9mKGEsIGlkeCk7XG4gICAgICAgIH1cbiAgICB9XG4gIH1cbiAgLy8gYW55dGhpbmcgZWxzZSBub3QgY292ZXJlZCBhYm92ZSwgZGVmZXIgdG8gUi5lcXVhbHNcbiAgd2hpbGUgKGlkeCA8IGxpc3QubGVuZ3RoKSB7XG4gICAgaWYgKGVxdWFscyhsaXN0W2lkeF0sIGEpKSB7XG4gICAgICByZXR1cm4gaWR4O1xuICAgIH1cbiAgICBpZHggKz0gMTtcbiAgfVxuICByZXR1cm4gLTE7XG59IiwiaW1wb3J0IF9oYXMgZnJvbSBcIi4vX2hhcy5qc1wiO1xudmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciBfaXNBcmd1bWVudHMgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbChhcmd1bWVudHMpID09PSAnW29iamVjdCBBcmd1bWVudHNdJyA/IGZ1bmN0aW9uIF9pc0FyZ3VtZW50cyh4KSB7XG4gICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoeCkgPT09ICdbb2JqZWN0IEFyZ3VtZW50c10nO1xuICB9IDogZnVuY3Rpb24gX2lzQXJndW1lbnRzKHgpIHtcbiAgICByZXR1cm4gX2hhcygnY2FsbGVlJywgeCk7XG4gIH07XG59KCk7XG5leHBvcnQgZGVmYXVsdCBfaXNBcmd1bWVudHM7IiwiLyoqXG4gKiBUZXN0cyB3aGV0aGVyIG9yIG5vdCBhbiBvYmplY3QgaXMgYW4gYXJyYXkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSBvYmplY3QgdG8gdGVzdC5cbiAqIEByZXR1cm4ge0Jvb2xlYW59IGB0cnVlYCBpZiBgdmFsYCBpcyBhbiBhcnJheSwgYGZhbHNlYCBvdGhlcndpc2UuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgX2lzQXJyYXkoW10pOyAvLz0+IHRydWVcbiAqICAgICAgX2lzQXJyYXkobnVsbCk7IC8vPT4gZmFsc2VcbiAqICAgICAgX2lzQXJyYXkoe30pOyAvLz0+IGZhbHNlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gX2lzQXJyYXkodmFsKSB7XG4gIHJldHVybiB2YWwgIT0gbnVsbCAmJiB2YWwubGVuZ3RoID49IDAgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IEFycmF5XSc7XG59OyIsImltcG9ydCBfY3VycnkxIGZyb20gXCIuL19jdXJyeTEuanNcIjtcbmltcG9ydCBfaXNBcnJheSBmcm9tIFwiLi9faXNBcnJheS5qc1wiO1xuaW1wb3J0IF9pc1N0cmluZyBmcm9tIFwiLi9faXNTdHJpbmcuanNcIjtcblxuLyoqXG4gKiBUZXN0cyB3aGV0aGVyIG9yIG5vdCBhbiBvYmplY3QgaXMgc2ltaWxhciB0byBhbiBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNhdGVnb3J5IFR5cGVcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnICogLT4gQm9vbGVhblxuICogQHBhcmFtIHsqfSB4IFRoZSBvYmplY3QgdG8gdGVzdC5cbiAqIEByZXR1cm4ge0Jvb2xlYW59IGB0cnVlYCBpZiBgeGAgaGFzIGEgbnVtZXJpYyBsZW5ndGggcHJvcGVydHkgYW5kIGV4dHJlbWUgaW5kaWNlcyBkZWZpbmVkOyBgZmFsc2VgIG90aGVyd2lzZS5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBfaXNBcnJheUxpa2UoW10pOyAvLz0+IHRydWVcbiAqICAgICAgX2lzQXJyYXlMaWtlKHRydWUpOyAvLz0+IGZhbHNlXG4gKiAgICAgIF9pc0FycmF5TGlrZSh7fSk7IC8vPT4gZmFsc2VcbiAqICAgICAgX2lzQXJyYXlMaWtlKHtsZW5ndGg6IDEwfSk7IC8vPT4gZmFsc2VcbiAqICAgICAgX2lzQXJyYXlMaWtlKHswOiAnemVybycsIDk6ICduaW5lJywgbGVuZ3RoOiAxMH0pOyAvLz0+IHRydWVcbiAqICAgICAgX2lzQXJyYXlMaWtlKHtub2RlVHlwZTogMSwgbGVuZ3RoOiAxfSkgLy8gPT4gZmFsc2VcbiAqL1xudmFyIF9pc0FycmF5TGlrZSA9IC8qI19fUFVSRV9fKi9fY3VycnkxKGZ1bmN0aW9uIGlzQXJyYXlMaWtlKHgpIHtcbiAgaWYgKF9pc0FycmF5KHgpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKCF4KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh0eXBlb2YgeCAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKF9pc1N0cmluZyh4KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoeC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoeC5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHguaGFzT3duUHJvcGVydHkoMCkgJiYgeC5oYXNPd25Qcm9wZXJ0eSh4Lmxlbmd0aCAtIDEpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgX2lzQXJyYXlMaWtlOyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9pc0Z1bmN0aW9uKHgpIHtcbiAgdmFyIHR5cGUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoeCk7XG4gIHJldHVybiB0eXBlID09PSAnW29iamVjdCBGdW5jdGlvbl0nIHx8IHR5cGUgPT09ICdbb2JqZWN0IEFzeW5jRnVuY3Rpb25dJyB8fCB0eXBlID09PSAnW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0nIHx8IHR5cGUgPT09ICdbb2JqZWN0IEFzeW5jR2VuZXJhdG9yRnVuY3Rpb25dJztcbn0iLCIvKipcbiAqIERldGVybWluZSBpZiB0aGUgcGFzc2VkIGFyZ3VtZW50IGlzIGFuIGludGVnZXIuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gblxuICogQGNhdGVnb3J5IFR5cGVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmV4cG9ydCBkZWZhdWx0IE51bWJlci5pc0ludGVnZXIgfHwgZnVuY3Rpb24gX2lzSW50ZWdlcihuKSB7XG4gIHJldHVybiBuIDw8IDAgPT09IG47XG59OyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9pc09iamVjdCh4KSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoeCkgPT09ICdbb2JqZWN0IE9iamVjdF0nO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9pc1BsYWNlaG9sZGVyKGEpIHtcbiAgcmV0dXJuIGEgIT0gbnVsbCAmJiB0eXBlb2YgYSA9PT0gJ29iamVjdCcgJiYgYVsnQEBmdW5jdGlvbmFsL3BsYWNlaG9sZGVyJ10gPT09IHRydWU7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2lzU3RyaW5nKHgpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh4KSA9PT0gJ1tvYmplY3QgU3RyaW5nXSc7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2lzVHJhbnNmb3JtZXIob2JqKSB7XG4gIHJldHVybiBvYmogIT0gbnVsbCAmJiB0eXBlb2Ygb2JqWydAQHRyYW5zZHVjZXIvc3RlcCddID09PSAnZnVuY3Rpb24nO1xufSIsIi8qKlxuICogVGVzdHMgd2hldGhlciBvciBub3QgYW4gb2JqZWN0IGlzIGEgdHlwZWQgYXJyYXkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSBvYmplY3QgdG8gdGVzdC5cbiAqIEByZXR1cm4ge0Jvb2xlYW59IGB0cnVlYCBpZiBgdmFsYCBpcyBhIHR5cGVkIGFycmF5LCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBfaXNUeXBlZEFycmF5KG5ldyBVaW50OEFycmF5KFtdKSk7IC8vPT4gdHJ1ZVxuICogICAgICBfaXNUeXBlZEFycmF5KG5ldyBGbG9hdDMyQXJyYXkoW10pKTsgLy89PiB0cnVlXG4gKiAgICAgIF9pc1R5cGVkQXJyYXkoW10pOyAvLz0+IGZhbHNlXG4gKiAgICAgIF9pc1R5cGVkQXJyYXkobnVsbCk7IC8vPT4gZmFsc2VcbiAqICAgICAgX2lzVHlwZWRBcnJheSh7fSk7IC8vPT4gZmFsc2VcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2lzVHlwZWRBcnJheSh2YWwpIHtcbiAgdmFyIHR5cGUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsKTtcbiAgcmV0dXJuIHR5cGUgPT09ICdbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XScgfHwgdHlwZSA9PT0gJ1tvYmplY3QgSW50OEFycmF5XScgfHwgdHlwZSA9PT0gJ1tvYmplY3QgVWludDhBcnJheV0nIHx8IHR5cGUgPT09ICdbb2JqZWN0IEludDE2QXJyYXldJyB8fCB0eXBlID09PSAnW29iamVjdCBVaW50MTZBcnJheV0nIHx8IHR5cGUgPT09ICdbb2JqZWN0IEludDMyQXJyYXldJyB8fCB0eXBlID09PSAnW29iamVjdCBVaW50MzJBcnJheV0nIHx8IHR5cGUgPT09ICdbb2JqZWN0IEZsb2F0MzJBcnJheV0nIHx8IHR5cGUgPT09ICdbb2JqZWN0IEZsb2F0NjRBcnJheV0nIHx8IHR5cGUgPT09ICdbb2JqZWN0IEJpZ0ludDY0QXJyYXldJyB8fCB0eXBlID09PSAnW29iamVjdCBCaWdVaW50NjRBcnJheV0nO1xufSIsImltcG9ydCBfaXNBcnJheUxpa2UgZnJvbSBcIi4vX2lzQXJyYXlMaWtlLmpzXCI7XG5cbi8qKlxuICogYF9tYWtlRmxhdGAgaXMgYSBoZWxwZXIgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgb25lLWxldmVsIG9yIGZ1bGx5IHJlY3Vyc2l2ZVxuICogZnVuY3Rpb24gYmFzZWQgb24gdGhlIGZsYWcgcGFzc2VkIGluLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9tYWtlRmxhdChyZWN1cnNpdmUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGZsYXR0KGxpc3QpIHtcbiAgICB2YXIgdmFsdWUsIGpsZW4sIGo7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIHZhciBpZHggPSAwO1xuICAgIHZhciBpbGVuID0gbGlzdC5sZW5ndGg7XG4gICAgd2hpbGUgKGlkeCA8IGlsZW4pIHtcbiAgICAgIGlmIChfaXNBcnJheUxpa2UobGlzdFtpZHhdKSkge1xuICAgICAgICB2YWx1ZSA9IHJlY3Vyc2l2ZSA/IGZsYXR0KGxpc3RbaWR4XSkgOiBsaXN0W2lkeF07XG4gICAgICAgIGogPSAwO1xuICAgICAgICBqbGVuID0gdmFsdWUubGVuZ3RoO1xuICAgICAgICB3aGlsZSAoaiA8IGpsZW4pIHtcbiAgICAgICAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aF0gPSB2YWx1ZVtqXTtcbiAgICAgICAgICBqICs9IDE7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdFtyZXN1bHQubGVuZ3RoXSA9IGxpc3RbaWR4XTtcbiAgICAgIH1cbiAgICAgIGlkeCArPSAxO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9tYXAoZm4sIGZ1bmN0b3IpIHtcbiAgdmFyIGlkeCA9IDA7XG4gIHZhciBsZW4gPSBmdW5jdG9yLmxlbmd0aDtcbiAgdmFyIHJlc3VsdCA9IEFycmF5KGxlbik7XG4gIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICByZXN1bHRbaWR4XSA9IGZuKGZ1bmN0b3JbaWR4XSk7XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn0iLCJpbXBvcnQgX2lzU3RyaW5nIGZyb20gXCIuL19pc1N0cmluZy5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX250aChvZmZzZXQsIGxpc3QpIHtcbiAgdmFyIGlkeCA9IG9mZnNldCA8IDAgPyBsaXN0Lmxlbmd0aCArIG9mZnNldCA6IG9mZnNldDtcbiAgcmV0dXJuIF9pc1N0cmluZyhsaXN0KSA/IGxpc3QuY2hhckF0KGlkeCkgOiBsaXN0W2lkeF07XG59IiwiaW1wb3J0IF9oYXMgZnJvbSBcIi4vX2hhcy5qc1wiO1xuXG4vLyBCYXNlZCBvbiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvYXNzaWduXG5mdW5jdGlvbiBfb2JqZWN0QXNzaWduKHRhcmdldCkge1xuICBpZiAodGFyZ2V0ID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3QnKTtcbiAgfVxuICB2YXIgb3V0cHV0ID0gT2JqZWN0KHRhcmdldCk7XG4gIHZhciBpZHggPSAxO1xuICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgd2hpbGUgKGlkeCA8IGxlbmd0aCkge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaWR4XTtcbiAgICBpZiAoc291cmNlICE9IG51bGwpIHtcbiAgICAgIGZvciAodmFyIG5leHRLZXkgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChfaGFzKG5leHRLZXksIHNvdXJjZSkpIHtcbiAgICAgICAgICBvdXRwdXRbbmV4dEtleV0gPSBzb3VyY2VbbmV4dEtleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIG91dHB1dDtcbn1cbmV4cG9ydCBkZWZhdWx0IHR5cGVvZiBPYmplY3QuYXNzaWduID09PSAnZnVuY3Rpb24nID8gT2JqZWN0LmFzc2lnbiA6IF9vYmplY3RBc3NpZ247IiwiLy8gQmFzZWQgb24gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2lzXG5mdW5jdGlvbiBfb2JqZWN0SXMoYSwgYikge1xuICAvLyBTYW1lVmFsdWUgYWxnb3JpdGhtXG4gIGlmIChhID09PSBiKSB7XG4gICAgLy8gU3RlcHMgMS01LCA3LTEwXG4gICAgLy8gU3RlcHMgNi5iLTYuZTogKzAgIT0gLTBcbiAgICByZXR1cm4gYSAhPT0gMCB8fCAxIC8gYSA9PT0gMSAvIGI7XG4gIH0gZWxzZSB7XG4gICAgLy8gU3RlcCA2LmE6IE5hTiA9PSBOYU5cbiAgICByZXR1cm4gYSAhPT0gYSAmJiBiICE9PSBiO1xuICB9XG59XG5leHBvcnQgZGVmYXVsdCB0eXBlb2YgT2JqZWN0LmlzID09PSAnZnVuY3Rpb24nID8gT2JqZWN0LmlzIDogX29iamVjdElzOyIsImltcG9ydCBfaXNJbnRlZ2VyIGZyb20gXCIuL19pc0ludGVnZXIuanNcIjtcbmltcG9ydCBfbnRoIGZyb20gXCIuL19udGguanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9wYXRoKHBhdGhBciwgb2JqKSB7XG4gIHZhciB2YWwgPSBvYmo7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aEFyLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgaWYgKHZhbCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB2YXIgcCA9IHBhdGhBcltpXTtcbiAgICBpZiAoX2lzSW50ZWdlcihwKSkge1xuICAgICAgdmFsID0gX250aChwLCB2YWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWwgPSB2YWxbcF07XG4gICAgfVxuICB9XG4gIHJldHVybiB2YWw7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3F1b3RlKHMpIHtcbiAgdmFyIGVzY2FwZWQgPSBzLnJlcGxhY2UoL1xcXFwvZywgJ1xcXFxcXFxcJykucmVwbGFjZSgvW1xcYl0vZywgJ1xcXFxiJykgLy8gXFxiIG1hdGNoZXMgd29yZCBib3VuZGFyeTsgW1xcYl0gbWF0Y2hlcyBiYWNrc3BhY2VcbiAgLnJlcGxhY2UoL1xcZi9nLCAnXFxcXGYnKS5yZXBsYWNlKC9cXG4vZywgJ1xcXFxuJykucmVwbGFjZSgvXFxyL2csICdcXFxccicpLnJlcGxhY2UoL1xcdC9nLCAnXFxcXHQnKS5yZXBsYWNlKC9cXHYvZywgJ1xcXFx2JykucmVwbGFjZSgvXFwwL2csICdcXFxcMCcpO1xuICByZXR1cm4gJ1wiJyArIGVzY2FwZWQucmVwbGFjZSgvXCIvZywgJ1xcXFxcIicpICsgJ1wiJztcbn0iLCJpbXBvcnQgX2FycmF5UmVkdWNlIGZyb20gXCIuL19hcnJheVJlZHVjZS5qc1wiO1xuaW1wb3J0IF9jcmVhdGVSZWR1Y2UgZnJvbSBcIi4vX2NyZWF0ZVJlZHVjZS5qc1wiO1xuZnVuY3Rpb24gX2l0ZXJhYmxlUmVkdWNlKHJlZHVjZXIsIGFjYywgaXRlcikge1xuICB2YXIgc3RlcCA9IGl0ZXIubmV4dCgpO1xuICB3aGlsZSAoIXN0ZXAuZG9uZSkge1xuICAgIGFjYyA9IHJlZHVjZXIoYWNjLCBzdGVwLnZhbHVlKTtcbiAgICBzdGVwID0gaXRlci5uZXh0KCk7XG4gIH1cbiAgcmV0dXJuIGFjYztcbn1cbmZ1bmN0aW9uIF9tZXRob2RSZWR1Y2UocmVkdWNlciwgYWNjLCBvYmosIG1ldGhvZE5hbWUpIHtcbiAgcmV0dXJuIG9ialttZXRob2ROYW1lXShyZWR1Y2VyLCBhY2MpO1xufVxudmFyIF9yZWR1Y2UgPSAvKiNfX1BVUkVfXyovX2NyZWF0ZVJlZHVjZShfYXJyYXlSZWR1Y2UsIF9tZXRob2RSZWR1Y2UsIF9pdGVyYWJsZVJlZHVjZSk7XG5leHBvcnQgZGVmYXVsdCBfcmVkdWNlOyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9yZWR1Y2VkKHgpIHtcbiAgcmV0dXJuIHggJiYgeFsnQEB0cmFuc2R1Y2VyL3JlZHVjZWQnXSA/IHggOiB7XG4gICAgJ0BAdHJhbnNkdWNlci92YWx1ZSc6IHgsXG4gICAgJ0BAdHJhbnNkdWNlci9yZWR1Y2VkJzogdHJ1ZVxuICB9O1xufSIsIi8qKlxuICogUG9seWZpbGwgZnJvbSA8aHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRGF0ZS90b0lTT1N0cmluZz4uXG4gKi9cbnZhciBwYWQgPSBmdW5jdGlvbiBwYWQobikge1xuICByZXR1cm4gKG4gPCAxMCA/ICcwJyA6ICcnKSArIG47XG59O1xudmFyIF90b0lTT1N0cmluZyA9IHR5cGVvZiBEYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZyA9PT0gJ2Z1bmN0aW9uJyA/IGZ1bmN0aW9uIF90b0lTT1N0cmluZyhkKSB7XG4gIHJldHVybiBkLnRvSVNPU3RyaW5nKCk7XG59IDogZnVuY3Rpb24gX3RvSVNPU3RyaW5nKGQpIHtcbiAgcmV0dXJuIGQuZ2V0VVRDRnVsbFllYXIoKSArICctJyArIHBhZChkLmdldFVUQ01vbnRoKCkgKyAxKSArICctJyArIHBhZChkLmdldFVUQ0RhdGUoKSkgKyAnVCcgKyBwYWQoZC5nZXRVVENIb3VycygpKSArICc6JyArIHBhZChkLmdldFVUQ01pbnV0ZXMoKSkgKyAnOicgKyBwYWQoZC5nZXRVVENTZWNvbmRzKCkpICsgJy4nICsgKGQuZ2V0VVRDTWlsbGlzZWNvbmRzKCkgLyAxMDAwKS50b0ZpeGVkKDMpLnNsaWNlKDIsIDUpICsgJ1onO1xufTtcbmV4cG9ydCBkZWZhdWx0IF90b0lTT1N0cmluZzsiLCJpbXBvcnQgX2luY2x1ZGVzIGZyb20gXCIuL19pbmNsdWRlcy5qc1wiO1xuaW1wb3J0IF9tYXAgZnJvbSBcIi4vX21hcC5qc1wiO1xuaW1wb3J0IF9xdW90ZSBmcm9tIFwiLi9fcXVvdGUuanNcIjtcbmltcG9ydCBfdG9JU09TdHJpbmcgZnJvbSBcIi4vX3RvSVNPU3RyaW5nLmpzXCI7XG5pbXBvcnQga2V5cyBmcm9tIFwiLi4va2V5cy5qc1wiO1xuaW1wb3J0IHJlamVjdCBmcm9tIFwiLi4vcmVqZWN0LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfdG9TdHJpbmcoeCwgc2Vlbikge1xuICB2YXIgcmVjdXIgPSBmdW5jdGlvbiByZWN1cih5KSB7XG4gICAgdmFyIHhzID0gc2Vlbi5jb25jYXQoW3hdKTtcbiAgICByZXR1cm4gX2luY2x1ZGVzKHksIHhzKSA/ICc8Q2lyY3VsYXI+JyA6IF90b1N0cmluZyh5LCB4cyk7XG4gIH07XG5cbiAgLy8gIG1hcFBhaXJzIDo6IChPYmplY3QsIFtTdHJpbmddKSAtPiBbU3RyaW5nXVxuICB2YXIgbWFwUGFpcnMgPSBmdW5jdGlvbiAob2JqLCBrZXlzKSB7XG4gICAgcmV0dXJuIF9tYXAoZnVuY3Rpb24gKGspIHtcbiAgICAgIHJldHVybiBfcXVvdGUoaykgKyAnOiAnICsgcmVjdXIob2JqW2tdKTtcbiAgICB9LCBrZXlzLnNsaWNlKCkuc29ydCgpKTtcbiAgfTtcbiAgc3dpdGNoIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoeCkpIHtcbiAgICBjYXNlICdbb2JqZWN0IEFyZ3VtZW50c10nOlxuICAgICAgcmV0dXJuICcoZnVuY3Rpb24oKSB7IHJldHVybiBhcmd1bWVudHM7IH0oJyArIF9tYXAocmVjdXIsIHgpLmpvaW4oJywgJykgKyAnKSknO1xuICAgIGNhc2UgJ1tvYmplY3QgQXJyYXldJzpcbiAgICAgIHJldHVybiAnWycgKyBfbWFwKHJlY3VyLCB4KS5jb25jYXQobWFwUGFpcnMoeCwgcmVqZWN0KGZ1bmN0aW9uIChrKSB7XG4gICAgICAgIHJldHVybiAvXlxcZCskLy50ZXN0KGspO1xuICAgICAgfSwga2V5cyh4KSkpKS5qb2luKCcsICcpICsgJ10nO1xuICAgIGNhc2UgJ1tvYmplY3QgQm9vbGVhbl0nOlxuICAgICAgcmV0dXJuIHR5cGVvZiB4ID09PSAnb2JqZWN0JyA/ICduZXcgQm9vbGVhbignICsgcmVjdXIoeC52YWx1ZU9mKCkpICsgJyknIDogeC50b1N0cmluZygpO1xuICAgIGNhc2UgJ1tvYmplY3QgRGF0ZV0nOlxuICAgICAgcmV0dXJuICduZXcgRGF0ZSgnICsgKGlzTmFOKHgudmFsdWVPZigpKSA/IHJlY3VyKE5hTikgOiBfcXVvdGUoX3RvSVNPU3RyaW5nKHgpKSkgKyAnKSc7XG4gICAgY2FzZSAnW29iamVjdCBNYXBdJzpcbiAgICAgIHJldHVybiAnbmV3IE1hcCgnICsgcmVjdXIoQXJyYXkuZnJvbSh4KSkgKyAnKSc7XG4gICAgY2FzZSAnW29iamVjdCBOdWxsXSc6XG4gICAgICByZXR1cm4gJ251bGwnO1xuICAgIGNhc2UgJ1tvYmplY3QgTnVtYmVyXSc6XG4gICAgICByZXR1cm4gdHlwZW9mIHggPT09ICdvYmplY3QnID8gJ25ldyBOdW1iZXIoJyArIHJlY3VyKHgudmFsdWVPZigpKSArICcpJyA6IDEgLyB4ID09PSAtSW5maW5pdHkgPyAnLTAnIDogeC50b1N0cmluZygxMCk7XG4gICAgY2FzZSAnW29iamVjdCBTZXRdJzpcbiAgICAgIHJldHVybiAnbmV3IFNldCgnICsgcmVjdXIoQXJyYXkuZnJvbSh4KS5zb3J0KCkpICsgJyknO1xuICAgIGNhc2UgJ1tvYmplY3QgU3RyaW5nXSc6XG4gICAgICByZXR1cm4gdHlwZW9mIHggPT09ICdvYmplY3QnID8gJ25ldyBTdHJpbmcoJyArIHJlY3VyKHgudmFsdWVPZigpKSArICcpJyA6IF9xdW90ZSh4KTtcbiAgICBjYXNlICdbb2JqZWN0IFVuZGVmaW5lZF0nOlxuICAgICAgcmV0dXJuICd1bmRlZmluZWQnO1xuICAgIGRlZmF1bHQ6XG4gICAgICBpZiAodHlwZW9mIHgudG9TdHJpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdmFyIHJlcHIgPSB4LnRvU3RyaW5nKCk7XG4gICAgICAgIGlmIChyZXByICE9PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgICAgICAgIHJldHVybiByZXByO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gJ3snICsgbWFwUGFpcnMoeCwga2V5cyh4KSkuam9pbignLCAnKSArICd9JztcbiAgfVxufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF94QXJyYXlSZWR1Y2UoeGYsIGFjYywgbGlzdCkge1xuICB2YXIgaWR4ID0gMDtcbiAgdmFyIGxlbiA9IGxpc3QubGVuZ3RoO1xuICB3aGlsZSAoaWR4IDwgbGVuKSB7XG4gICAgYWNjID0geGZbJ0BAdHJhbnNkdWNlci9zdGVwJ10oYWNjLCBsaXN0W2lkeF0pO1xuICAgIGlmIChhY2MgJiYgYWNjWydAQHRyYW5zZHVjZXIvcmVkdWNlZCddKSB7XG4gICAgICBhY2MgPSBhY2NbJ0BAdHJhbnNkdWNlci92YWx1ZSddO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlkeCArPSAxO1xuICB9XG4gIHJldHVybiB4ZlsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddKGFjYyk7XG59IiwiaW1wb3J0IF9jcmVhdGVSZWR1Y2UgZnJvbSBcIi4vX2NyZWF0ZVJlZHVjZS5qc1wiO1xuaW1wb3J0IF94QXJyYXlSZWR1Y2UgZnJvbSBcIi4vX3hBcnJheVJlZHVjZS5qc1wiO1xuaW1wb3J0IGJpbmQgZnJvbSBcIi4uL2JpbmQuanNcIjtcbmZ1bmN0aW9uIF94SXRlcmFibGVSZWR1Y2UoeGYsIGFjYywgaXRlcikge1xuICB2YXIgc3RlcCA9IGl0ZXIubmV4dCgpO1xuICB3aGlsZSAoIXN0ZXAuZG9uZSkge1xuICAgIGFjYyA9IHhmWydAQHRyYW5zZHVjZXIvc3RlcCddKGFjYywgc3RlcC52YWx1ZSk7XG4gICAgaWYgKGFjYyAmJiBhY2NbJ0BAdHJhbnNkdWNlci9yZWR1Y2VkJ10pIHtcbiAgICAgIGFjYyA9IGFjY1snQEB0cmFuc2R1Y2VyL3ZhbHVlJ107XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgc3RlcCA9IGl0ZXIubmV4dCgpO1xuICB9XG4gIHJldHVybiB4ZlsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddKGFjYyk7XG59XG5mdW5jdGlvbiBfeE1ldGhvZFJlZHVjZSh4ZiwgYWNjLCBvYmosIG1ldGhvZE5hbWUpIHtcbiAgcmV0dXJuIHhmWydAQHRyYW5zZHVjZXIvcmVzdWx0J10ob2JqW21ldGhvZE5hbWVdKGJpbmQoeGZbJ0BAdHJhbnNkdWNlci9zdGVwJ10sIHhmKSwgYWNjKSk7XG59XG52YXIgX3hSZWR1Y2UgPSAvKiNfX1BVUkVfXyovX2NyZWF0ZVJlZHVjZShfeEFycmF5UmVkdWNlLCBfeE1ldGhvZFJlZHVjZSwgX3hJdGVyYWJsZVJlZHVjZSk7XG5leHBvcnQgZGVmYXVsdCBfeFJlZHVjZTsiLCJpbXBvcnQgX3JlZHVjZWQgZnJvbSBcIi4vX3JlZHVjZWQuanNcIjtcbmltcG9ydCBfeGZCYXNlIGZyb20gXCIuL194ZkJhc2UuanNcIjtcbnZhciBYQWxsID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gWEFsbChmLCB4Zikge1xuICAgIHRoaXMueGYgPSB4ZjtcbiAgICB0aGlzLmYgPSBmO1xuICAgIHRoaXMuYWxsID0gdHJ1ZTtcbiAgfVxuICBYQWxsLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL2luaXQnXSA9IF94ZkJhc2UuaW5pdDtcbiAgWEFsbC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXSA9IGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICBpZiAodGhpcy5hbGwpIHtcbiAgICAgIHJlc3VsdCA9IHRoaXMueGZbJ0BAdHJhbnNkdWNlci9zdGVwJ10ocmVzdWx0LCB0cnVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMueGZbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXShyZXN1bHQpO1xuICB9O1xuICBYQWxsLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3N0ZXAnXSA9IGZ1bmN0aW9uIChyZXN1bHQsIGlucHV0KSB7XG4gICAgaWYgKCF0aGlzLmYoaW5wdXQpKSB7XG4gICAgICB0aGlzLmFsbCA9IGZhbHNlO1xuICAgICAgcmVzdWx0ID0gX3JlZHVjZWQodGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIGZhbHNlKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIHJldHVybiBYQWxsO1xufSgpO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3hhbGwoZikge1xuICByZXR1cm4gZnVuY3Rpb24gKHhmKSB7XG4gICAgcmV0dXJuIG5ldyBYQWxsKGYsIHhmKTtcbiAgfTtcbn0iLCJpbXBvcnQgX3JlZHVjZWQgZnJvbSBcIi4vX3JlZHVjZWQuanNcIjtcbmltcG9ydCBfeGZCYXNlIGZyb20gXCIuL194ZkJhc2UuanNcIjtcbnZhciBYQW55ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gWEFueShmLCB4Zikge1xuICAgIHRoaXMueGYgPSB4ZjtcbiAgICB0aGlzLmYgPSBmO1xuICAgIHRoaXMuYW55ID0gZmFsc2U7XG4gIH1cbiAgWEFueS5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9pbml0J10gPSBfeGZCYXNlLmluaXQ7XG4gIFhBbnkucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvcmVzdWx0J10gPSBmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgaWYgKCF0aGlzLmFueSkge1xuICAgICAgcmVzdWx0ID0gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIGZhbHNlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMueGZbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXShyZXN1bHQpO1xuICB9O1xuICBYQW55LnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3N0ZXAnXSA9IGZ1bmN0aW9uIChyZXN1bHQsIGlucHV0KSB7XG4gICAgaWYgKHRoaXMuZihpbnB1dCkpIHtcbiAgICAgIHRoaXMuYW55ID0gdHJ1ZTtcbiAgICAgIHJlc3VsdCA9IF9yZWR1Y2VkKHRoaXMueGZbJ0BAdHJhbnNkdWNlci9zdGVwJ10ocmVzdWx0LCB0cnVlKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIHJldHVybiBYQW55O1xufSgpO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3hhbnkoZikge1xuICByZXR1cm4gZnVuY3Rpb24gKHhmKSB7XG4gICAgcmV0dXJuIG5ldyBYQW55KGYsIHhmKTtcbiAgfTtcbn0iLCJleHBvcnQgZGVmYXVsdCB7XG4gIGluaXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL2luaXQnXSgpO1xuICB9LFxuICByZXN1bHQ6IGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICByZXR1cm4gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddKHJlc3VsdCk7XG4gIH1cbn07IiwiaW1wb3J0IF94ZkJhc2UgZnJvbSBcIi4vX3hmQmFzZS5qc1wiO1xudmFyIFhGaWx0ZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBYRmlsdGVyKGYsIHhmKSB7XG4gICAgdGhpcy54ZiA9IHhmO1xuICAgIHRoaXMuZiA9IGY7XG4gIH1cbiAgWEZpbHRlci5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9pbml0J10gPSBfeGZCYXNlLmluaXQ7XG4gIFhGaWx0ZXIucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvcmVzdWx0J10gPSBfeGZCYXNlLnJlc3VsdDtcbiAgWEZpbHRlci5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9zdGVwJ10gPSBmdW5jdGlvbiAocmVzdWx0LCBpbnB1dCkge1xuICAgIHJldHVybiB0aGlzLmYoaW5wdXQpID8gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIGlucHV0KSA6IHJlc3VsdDtcbiAgfTtcbiAgcmV0dXJuIFhGaWx0ZXI7XG59KCk7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfeGZpbHRlcihmKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoeGYpIHtcbiAgICByZXR1cm4gbmV3IFhGaWx0ZXIoZiwgeGYpO1xuICB9O1xufSIsImltcG9ydCBfcmVkdWNlZCBmcm9tIFwiLi9fcmVkdWNlZC5qc1wiO1xuaW1wb3J0IF94ZkJhc2UgZnJvbSBcIi4vX3hmQmFzZS5qc1wiO1xudmFyIFhGaW5kID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gWEZpbmQoZiwgeGYpIHtcbiAgICB0aGlzLnhmID0geGY7XG4gICAgdGhpcy5mID0gZjtcbiAgICB0aGlzLmZvdW5kID0gZmFsc2U7XG4gIH1cbiAgWEZpbmQucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvaW5pdCddID0gX3hmQmFzZS5pbml0O1xuICBYRmluZC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXSA9IGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICBpZiAoIXRoaXMuZm91bmQpIHtcbiAgICAgIHJlc3VsdCA9IHRoaXMueGZbJ0BAdHJhbnNkdWNlci9zdGVwJ10ocmVzdWx0LCB2b2lkIDApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddKHJlc3VsdCk7XG4gIH07XG4gIFhGaW5kLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3N0ZXAnXSA9IGZ1bmN0aW9uIChyZXN1bHQsIGlucHV0KSB7XG4gICAgaWYgKHRoaXMuZihpbnB1dCkpIHtcbiAgICAgIHRoaXMuZm91bmQgPSB0cnVlO1xuICAgICAgcmVzdWx0ID0gX3JlZHVjZWQodGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIGlucHV0KSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIHJldHVybiBYRmluZDtcbn0oKTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF94ZmluZChmKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoeGYpIHtcbiAgICByZXR1cm4gbmV3IFhGaW5kKGYsIHhmKTtcbiAgfTtcbn0iLCJpbXBvcnQgX3JlZHVjZWQgZnJvbSBcIi4vX3JlZHVjZWQuanNcIjtcbmltcG9ydCBfeGZCYXNlIGZyb20gXCIuL194ZkJhc2UuanNcIjtcbnZhciBYRmluZEluZGV4ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gWEZpbmRJbmRleChmLCB4Zikge1xuICAgIHRoaXMueGYgPSB4ZjtcbiAgICB0aGlzLmYgPSBmO1xuICAgIHRoaXMuaWR4ID0gLTE7XG4gICAgdGhpcy5mb3VuZCA9IGZhbHNlO1xuICB9XG4gIFhGaW5kSW5kZXgucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvaW5pdCddID0gX3hmQmFzZS5pbml0O1xuICBYRmluZEluZGV4LnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddID0gZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgIGlmICghdGhpcy5mb3VuZCkge1xuICAgICAgcmVzdWx0ID0gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIC0xKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMueGZbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXShyZXN1bHQpO1xuICB9O1xuICBYRmluZEluZGV4LnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3N0ZXAnXSA9IGZ1bmN0aW9uIChyZXN1bHQsIGlucHV0KSB7XG4gICAgdGhpcy5pZHggKz0gMTtcbiAgICBpZiAodGhpcy5mKGlucHV0KSkge1xuICAgICAgdGhpcy5mb3VuZCA9IHRydWU7XG4gICAgICByZXN1bHQgPSBfcmVkdWNlZCh0aGlzLnhmWydAQHRyYW5zZHVjZXIvc3RlcCddKHJlc3VsdCwgdGhpcy5pZHgpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgcmV0dXJuIFhGaW5kSW5kZXg7XG59KCk7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfeGZpbmRJbmRleChmKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoeGYpIHtcbiAgICByZXR1cm4gbmV3IFhGaW5kSW5kZXgoZiwgeGYpO1xuICB9O1xufSIsImltcG9ydCBfeGZCYXNlIGZyb20gXCIuL194ZkJhc2UuanNcIjtcbnZhciBYTWFwID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gWE1hcChmLCB4Zikge1xuICAgIHRoaXMueGYgPSB4ZjtcbiAgICB0aGlzLmYgPSBmO1xuICB9XG4gIFhNYXAucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvaW5pdCddID0gX3hmQmFzZS5pbml0O1xuICBYTWFwLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddID0gX3hmQmFzZS5yZXN1bHQ7XG4gIFhNYXAucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvc3RlcCddID0gZnVuY3Rpb24gKHJlc3VsdCwgaW5wdXQpIHtcbiAgICByZXR1cm4gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIHRoaXMuZihpbnB1dCkpO1xuICB9O1xuICByZXR1cm4gWE1hcDtcbn0oKTtcbnZhciBfeG1hcCA9IGZ1bmN0aW9uIF94bWFwKGYpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh4Zikge1xuICAgIHJldHVybiBuZXcgWE1hcChmLCB4Zik7XG4gIH07XG59O1xuZXhwb3J0IGRlZmF1bHQgX3htYXA7IiwiaW1wb3J0IF9jbG9uZSBmcm9tIFwiLi9fY2xvbmUuanNcIjtcbmltcG9ydCBfaGFzIGZyb20gXCIuL19oYXMuanNcIjtcbmltcG9ydCBfeGZCYXNlIGZyb20gXCIuL194ZkJhc2UuanNcIjtcbnZhciBYUmVkdWNlQnkgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBYUmVkdWNlQnkodmFsdWVGbiwgdmFsdWVBY2MsIGtleUZuLCB4Zikge1xuICAgIHRoaXMudmFsdWVGbiA9IHZhbHVlRm47XG4gICAgdGhpcy52YWx1ZUFjYyA9IHZhbHVlQWNjO1xuICAgIHRoaXMua2V5Rm4gPSBrZXlGbjtcbiAgICB0aGlzLnhmID0geGY7XG4gICAgdGhpcy5pbnB1dHMgPSB7fTtcbiAgfVxuICBYUmVkdWNlQnkucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvaW5pdCddID0gX3hmQmFzZS5pbml0O1xuICBYUmVkdWNlQnkucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvcmVzdWx0J10gPSBmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgdmFyIGtleTtcbiAgICBmb3IgKGtleSBpbiB0aGlzLmlucHV0cykge1xuICAgICAgaWYgKF9oYXMoa2V5LCB0aGlzLmlucHV0cykpIHtcbiAgICAgICAgcmVzdWx0ID0gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIHRoaXMuaW5wdXRzW2tleV0pO1xuICAgICAgICBpZiAocmVzdWx0WydAQHRyYW5zZHVjZXIvcmVkdWNlZCddKSB7XG4gICAgICAgICAgcmVzdWx0ID0gcmVzdWx0WydAQHRyYW5zZHVjZXIvdmFsdWUnXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmlucHV0cyA9IG51bGw7XG4gICAgcmV0dXJuIHRoaXMueGZbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXShyZXN1bHQpO1xuICB9O1xuICBYUmVkdWNlQnkucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvc3RlcCddID0gZnVuY3Rpb24gKHJlc3VsdCwgaW5wdXQpIHtcbiAgICB2YXIga2V5ID0gdGhpcy5rZXlGbihpbnB1dCk7XG4gICAgdGhpcy5pbnB1dHNba2V5XSA9IHRoaXMuaW5wdXRzW2tleV0gfHwgW2tleSwgX2Nsb25lKHRoaXMudmFsdWVBY2MsIGZhbHNlKV07XG4gICAgdGhpcy5pbnB1dHNba2V5XVsxXSA9IHRoaXMudmFsdWVGbih0aGlzLmlucHV0c1trZXldWzFdLCBpbnB1dCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgcmV0dXJuIFhSZWR1Y2VCeTtcbn0oKTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF94cmVkdWNlQnkodmFsdWVGbiwgdmFsdWVBY2MsIGtleUZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoeGYpIHtcbiAgICByZXR1cm4gbmV3IFhSZWR1Y2VCeSh2YWx1ZUZuLCB2YWx1ZUFjYywga2V5Rm4sIHhmKTtcbiAgfTtcbn0iLCJpbXBvcnQgX3JlZHVjZWQgZnJvbSBcIi4vX3JlZHVjZWQuanNcIjtcbmltcG9ydCBfeGZCYXNlIGZyb20gXCIuL194ZkJhc2UuanNcIjtcbnZhciBYVGFrZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFhUYWtlKG4sIHhmKSB7XG4gICAgdGhpcy54ZiA9IHhmO1xuICAgIHRoaXMubiA9IG47XG4gICAgdGhpcy5pID0gMDtcbiAgfVxuICBYVGFrZS5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9pbml0J10gPSBfeGZCYXNlLmluaXQ7XG4gIFhUYWtlLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddID0gX3hmQmFzZS5yZXN1bHQ7XG4gIFhUYWtlLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3N0ZXAnXSA9IGZ1bmN0aW9uIChyZXN1bHQsIGlucHV0KSB7XG4gICAgdGhpcy5pICs9IDE7XG4gICAgdmFyIHJldCA9IHRoaXMubiA9PT0gMCA/IHJlc3VsdCA6IHRoaXMueGZbJ0BAdHJhbnNkdWNlci9zdGVwJ10ocmVzdWx0LCBpbnB1dCk7XG4gICAgcmV0dXJuIHRoaXMubiA+PSAwICYmIHRoaXMuaSA+PSB0aGlzLm4gPyBfcmVkdWNlZChyZXQpIDogcmV0O1xuICB9O1xuICByZXR1cm4gWFRha2U7XG59KCk7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfeHRha2Uobikge1xuICByZXR1cm4gZnVuY3Rpb24gKHhmKSB7XG4gICAgcmV0dXJuIG5ldyBYVGFrZShuLCB4Zik7XG4gIH07XG59IiwiaW1wb3J0IF9TZXQgZnJvbSBcIi4vX1NldC5qc1wiO1xuaW1wb3J0IF94ZkJhc2UgZnJvbSBcIi4vX3hmQmFzZS5qc1wiO1xudmFyIFhVbmlxQnkgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBYVW5pcUJ5KGYsIHhmKSB7XG4gICAgdGhpcy54ZiA9IHhmO1xuICAgIHRoaXMuZiA9IGY7XG4gICAgdGhpcy5zZXQgPSBuZXcgX1NldCgpO1xuICB9XG4gIFhVbmlxQnkucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvaW5pdCddID0gX3hmQmFzZS5pbml0O1xuICBYVW5pcUJ5LnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddID0gX3hmQmFzZS5yZXN1bHQ7XG4gIFhVbmlxQnkucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvc3RlcCddID0gZnVuY3Rpb24gKHJlc3VsdCwgaW5wdXQpIHtcbiAgICByZXR1cm4gdGhpcy5zZXQuYWRkKHRoaXMuZihpbnB1dCkpID8gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIGlucHV0KSA6IHJlc3VsdDtcbiAgfTtcbiAgcmV0dXJuIFhVbmlxQnk7XG59KCk7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfeHVuaXFCeShmKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoeGYpIHtcbiAgICByZXR1cm4gbmV3IFhVbmlxQnkoZiwgeGYpO1xuICB9O1xufSIsInZhciBYV3JhcCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFhXcmFwKGZuKSB7XG4gICAgdGhpcy5mID0gZm47XG4gIH1cbiAgWFdyYXAucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvaW5pdCddID0gZnVuY3Rpb24gKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW5pdCBub3QgaW1wbGVtZW50ZWQgb24gWFdyYXAnKTtcbiAgfTtcbiAgWFdyYXAucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvcmVzdWx0J10gPSBmdW5jdGlvbiAoYWNjKSB7XG4gICAgcmV0dXJuIGFjYztcbiAgfTtcbiAgWFdyYXAucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvc3RlcCddID0gZnVuY3Rpb24gKGFjYywgeCkge1xuICAgIHJldHVybiB0aGlzLmYoYWNjLCB4KTtcbiAgfTtcbiAgcmV0dXJuIFhXcmFwO1xufSgpO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3h3cmFwKGZuKSB7XG4gIHJldHVybiBuZXcgWFdyYXAoZm4pO1xufSIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfZmlsdGVyIGZyb20gXCIuL2ludGVybmFsL19maWx0ZXIuanNcIjtcbmltcG9ydCBfU2V0IGZyb20gXCIuL2ludGVybmFsL19TZXQuanNcIjtcbmltcG9ydCB1bmlxIGZyb20gXCIuL3VuaXEuanNcIjtcblxuLyoqXG4gKiBDb21iaW5lcyB0d28gbGlzdHMgaW50byBhIHNldCAoaS5lLiBubyBkdXBsaWNhdGVzKSBjb21wb3NlZCBvZiB0aG9zZVxuICogZWxlbWVudHMgY29tbW9uIHRvIGJvdGggbGlzdHMuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgUmVsYXRpb25cbiAqIEBzaWcgWypdIC0+IFsqXSAtPiBbKl1cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QxIFRoZSBmaXJzdCBsaXN0LlxuICogQHBhcmFtIHtBcnJheX0gbGlzdDIgVGhlIHNlY29uZCBsaXN0LlxuICogQHJldHVybiB7QXJyYXl9IFRoZSBsaXN0IG9mIGVsZW1lbnRzIGZvdW5kIGluIGJvdGggYGxpc3QxYCBhbmQgYGxpc3QyYC5cbiAqIEBzZWUgUi5pbm5lckpvaW5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmludGVyc2VjdGlvbihbMSwyLDMsNF0sIFs3LDYsNSw0LDNdKTsgLy89PiBbNCwgM11cbiAqL1xudmFyIGludGVyc2VjdGlvbiA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIGludGVyc2VjdGlvbihsaXN0MSwgbGlzdDIpIHtcbiAgdmFyIHRvS2VlcCA9IG5ldyBfU2V0KCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdDEubGVuZ3RoOyBpICs9IDEpIHtcbiAgICB0b0tlZXAuYWRkKGxpc3QxW2ldKTtcbiAgfVxuICByZXR1cm4gdW5pcShfZmlsdGVyKHRvS2VlcC5oYXMuYmluZCh0b0tlZXApLCBsaXN0MikpO1xufSk7XG5leHBvcnQgZGVmYXVsdCBpbnRlcnNlY3Rpb247IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9pc0Z1bmN0aW9uIGZyb20gXCIuL2ludGVybmFsL19pc0Z1bmN0aW9uLmpzXCI7XG5pbXBvcnQgY3VycnlOIGZyb20gXCIuL2N1cnJ5Ti5qc1wiO1xuaW1wb3J0IHRvU3RyaW5nIGZyb20gXCIuL3RvU3RyaW5nLmpzXCI7XG5cbi8qKlxuICogR2l2ZW4gYW4gYGFyaXR5YCAoTnVtYmVyKSBhbmQgYSBgbmFtZWAgKFN0cmluZykgdGhlIGBpbnZva2VyYCBmdW5jdGlvblxuICogcmV0dXJucyBhIGN1cnJpZWQgZnVuY3Rpb24gdGhhdCB0YWtlcyBgYXJpdHlgIGFyZ3VtZW50cyBhbmQgYSBgY29udGV4dGBcbiAqIG9iamVjdC4gSXQgd2lsbCBcImludm9rZVwiIHRoZSBgbmFtZWAnZCBmdW5jdGlvbiAoYSBtZXRob2QpIG9uIHRoZSBgY29udGV4dGBcbiAqIG9iamVjdC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyBOdW1iZXIgLT4gU3RyaW5nIC0+IChhIC0+IGIgLT4gLi4uIC0+IG4gLT4gT2JqZWN0IC0+ICopXG4gKiBAcGFyYW0ge051bWJlcn0gYXJpdHkgTnVtYmVyIG9mIGFyZ3VtZW50cyB0aGUgcmV0dXJuZWQgZnVuY3Rpb24gc2hvdWxkIHRha2VcbiAqICAgICAgICBiZWZvcmUgdGhlIHRhcmdldCBvYmplY3QuXG4gKiBAcGFyYW0ge1N0cmluZ30gbWV0aG9kIE5hbWUgb2YgYW55IG9mIHRoZSB0YXJnZXQgb2JqZWN0J3MgbWV0aG9kcyB0byBjYWxsLlxuICogQHJldHVybiB7RnVuY3Rpb259IEEgbmV3IGN1cnJpZWQgZnVuY3Rpb24uXG4gKiBAc2VlIFIuY29uc3RydWN0XG4gKiBAZXhhbXBsZVxuICogICAgICAvLyBBIGZ1bmN0aW9uIHdpdGggbm8gYXJndW1lbnRzXG4gKiAgICAgIGNvbnN0IGFzSnNvbiA9IGludm9rZXIoMCwgXCJqc29uXCIpXG4gKiAgICAgIC8vIEp1c3QgbGlrZSBjYWxsaW5nIC50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuanNvbigpKVxuICogICAgICBmZXRjaChcImh0dHA6Ly9leGFtcGxlLmNvbS9pbmRleC5qc29uXCIpLnRoZW4oYXNKc29uKVxuICpcbiAqICAgICAgLy8gQSBmdW5jdGlvbiB3aXRoIG9uZSBhcmd1bWVudFxuICogICAgICBjb25zdCBzbGljZUZyb20gPSBpbnZva2VyKDEsICdzbGljZScpO1xuICogICAgICBzbGljZUZyb20oNiwgJ2FiY2RlZmdoaWprbG0nKTsgLy89PiAnZ2hpamtsbSdcbiAqXG4gKiAgICAgIC8vIEEgZnVuY3Rpb24gd2l0aCB0d28gYXJndW1lbnRzXG4gKiAgICAgIGNvbnN0IHNsaWNlRnJvbTYgPSBpbnZva2VyKDIsICdzbGljZScpKDYpO1xuICogICAgICBzbGljZUZyb202KDgsICdhYmNkZWZnaGlqa2xtJyk7IC8vPT4gJ2doJ1xuICpcbiAqICAgICAgLy8gTk9URTogWW91IGNhbid0IHNpbXBseSBwYXNzIHNvbWUgb2YgdGhlIGFyZ3VtZW50cyB0byB0aGUgaW5pdGlhbCBpbnZva2VyIGZ1bmN0aW9uLlxuICogICAgICBjb25zdCBmaXJzdENyZWRpdENhcmRTZWN0aW9uID0gaW52b2tlcigyLCBcInNsaWNlXCIsIDAsIDQpXG4gKiAgICAgIGZpcnN0Q3JlZGl0Q2FyZFNlY3Rpb24oXCI0MjQyIDQyNDIgNDI0MiA0MjQyXCIpIC8vID0+IEZ1bmN0aW9uPC4uLj5cbiAqXG4gKiAgICAgIC8vIFNpbmNlIGludm9rZXIgcmV0dXJucyBhIGN1cnJpZWQgZnVuY3Rpb24sIHlvdSBtYXkgcGFydGlhbGx5IGFwcGx5IGl0IHRvIGNyZWF0ZSB0aGUgZnVuY3Rpb24geW91IG5lZWQuXG4gKiAgICAgIGNvbnN0IGZpcnN0Q3JlZGl0Q2FyZFNlY3Rpb24gPSBpbnZva2VyKDIsIFwic2xpY2VcIikoMCwgNClcbiAqICAgICAgZmlyc3RDcmVkaXRDYXJkU2VjdGlvbihcIjQyNDIgNDI0MiA0MjQyIDQyNDJcIikgLy8gPT4gXCI0MjQyXCJcbiAqXG4gKiBAc3ltYiBSLmludm9rZXIoMCwgJ21ldGhvZCcpKG8pID0gb1snbWV0aG9kJ10oKVxuICogQHN5bWIgUi5pbnZva2VyKDEsICdtZXRob2QnKShhLCBvKSA9IG9bJ21ldGhvZCddKGEpXG4gKiBAc3ltYiBSLmludm9rZXIoMiwgJ21ldGhvZCcpKGEsIGIsIG8pID0gb1snbWV0aG9kJ10oYSwgYilcbiAqL1xudmFyIGludm9rZXIgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiBpbnZva2VyKGFyaXR5LCBtZXRob2QpIHtcbiAgcmV0dXJuIGN1cnJ5Tihhcml0eSArIDEsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdGFyZ2V0ID0gYXJndW1lbnRzW2FyaXR5XTtcbiAgICBpZiAodGFyZ2V0ICE9IG51bGwgJiYgX2lzRnVuY3Rpb24odGFyZ2V0W21ldGhvZF0pKSB7XG4gICAgICByZXR1cm4gdGFyZ2V0W21ldGhvZF0uYXBwbHkodGFyZ2V0LCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDAsIGFyaXR5KSk7XG4gICAgfVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IodG9TdHJpbmcodGFyZ2V0KSArICcgZG9lcyBub3QgaGF2ZSBhIG1ldGhvZCBuYW1lZCBcIicgKyBtZXRob2QgKyAnXCInKTtcbiAgfSk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IGludm9rZXI7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuXG4vKipcbiAqIFNlZSBpZiBhbiBvYmplY3QgKGkuZS4gYHZhbGApIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBzdXBwbGllZCBjb25zdHJ1Y3Rvci4gVGhpc1xuICogZnVuY3Rpb24gd2lsbCBjaGVjayB1cCB0aGUgaW5oZXJpdGFuY2UgY2hhaW4sIGlmIGFueS5cbiAqIElmIGB2YWxgIHdhcyBjcmVhdGVkIHVzaW5nIGBPYmplY3QuY3JlYXRlYCwgYFIuaXMoT2JqZWN0LCB2YWwpID09PSB0cnVlYC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4zLjBcbiAqIEBjYXRlZ29yeSBUeXBlXG4gKiBAc2lnICgqIC0+IHsqfSkgLT4gYSAtPiBCb29sZWFuXG4gKiBAcGFyYW0ge09iamVjdH0gY3RvciBBIGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmlzKE9iamVjdCwge30pOyAvLz0+IHRydWVcbiAqICAgICAgUi5pcyhOdW1iZXIsIDEpOyAvLz0+IHRydWVcbiAqICAgICAgUi5pcyhPYmplY3QsIDEpOyAvLz0+IGZhbHNlXG4gKiAgICAgIFIuaXMoU3RyaW5nLCAncycpOyAvLz0+IHRydWVcbiAqICAgICAgUi5pcyhTdHJpbmcsIG5ldyBTdHJpbmcoJycpKTsgLy89PiB0cnVlXG4gKiAgICAgIFIuaXMoT2JqZWN0LCBuZXcgU3RyaW5nKCcnKSk7IC8vPT4gdHJ1ZVxuICogICAgICBSLmlzKE9iamVjdCwgJ3MnKTsgLy89PiBmYWxzZVxuICogICAgICBSLmlzKE51bWJlciwge30pOyAvLz0+IGZhbHNlXG4gKi9cbnZhciBpcyA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIGlzKEN0b3IsIHZhbCkge1xuICByZXR1cm4gdmFsIGluc3RhbmNlb2YgQ3RvciB8fCB2YWwgIT0gbnVsbCAmJiAodmFsLmNvbnN0cnVjdG9yID09PSBDdG9yIHx8IEN0b3IubmFtZSA9PT0gJ09iamVjdCcgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcpO1xufSk7XG5leHBvcnQgZGVmYXVsdCBpczsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5pbXBvcnQgZW1wdHkgZnJvbSBcIi4vZW1wdHkuanNcIjtcbmltcG9ydCBlcXVhbHMgZnJvbSBcIi4vZXF1YWxzLmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGdpdmVuIHZhbHVlIGlzIGl0cyB0eXBlJ3MgZW1wdHkgdmFsdWU7IGBmYWxzZWBcbiAqIG90aGVyd2lzZS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMb2dpY1xuICogQHNpZyBhIC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7Kn0geFxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBzZWUgUi5lbXB0eSwgUi5pc05vdEVtcHR5XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5pc0VtcHR5KFsxLCAyLCAzXSk7ICAgICAgICAgICAvLz0+IGZhbHNlXG4gKiAgICAgIFIuaXNFbXB0eShbXSk7ICAgICAgICAgICAgICAgICAgLy89PiB0cnVlXG4gKiAgICAgIFIuaXNFbXB0eSgnJyk7ICAgICAgICAgICAgICAgICAgLy89PiB0cnVlXG4gKiAgICAgIFIuaXNFbXB0eShudWxsKTsgICAgICAgICAgICAgICAgLy89PiBmYWxzZVxuICogICAgICBSLmlzRW1wdHkoe30pOyAgICAgICAgICAgICAgICAgIC8vPT4gdHJ1ZVxuICogICAgICBSLmlzRW1wdHkoe2xlbmd0aDogMH0pOyAgICAgICAgIC8vPT4gZmFsc2VcbiAqICAgICAgUi5pc0VtcHR5KFVpbnQ4QXJyYXkuZnJvbSgnJykpOyAvLz0+IHRydWVcbiAqL1xudmFyIGlzRW1wdHkgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MShmdW5jdGlvbiBpc0VtcHR5KHgpIHtcbiAgcmV0dXJuIHggIT0gbnVsbCAmJiBlcXVhbHMoeCwgZW1wdHkoeCkpO1xufSk7XG5leHBvcnQgZGVmYXVsdCBpc0VtcHR5OyIsImltcG9ydCBfY3VycnkxIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTEuanNcIjtcblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGlucHV0IHZhbHVlIGlzIGBudWxsYCBvciBgdW5kZWZpbmVkYC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC45LjBcbiAqIEBjYXRlZ29yeSBUeXBlXG4gKiBAc2lnICogLT4gQm9vbGVhblxuICogQHBhcmFtIHsqfSB4IFRoZSB2YWx1ZSB0byB0ZXN0LlxuICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIGB4YCBpcyBgdW5kZWZpbmVkYCBvciBgbnVsbGAsIG90aGVyd2lzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuaXNOaWwobnVsbCk7IC8vPT4gdHJ1ZVxuICogICAgICBSLmlzTmlsKHVuZGVmaW5lZCk7IC8vPT4gdHJ1ZVxuICogICAgICBSLmlzTmlsKDApOyAvLz0+IGZhbHNlXG4gKiAgICAgIFIuaXNOaWwoW10pOyAvLz0+IGZhbHNlXG4gKi9cbnZhciBpc05pbCA9IC8qI19fUFVSRV9fKi9fY3VycnkxKGZ1bmN0aW9uIGlzTmlsKHgpIHtcbiAgcmV0dXJuIHggPT0gbnVsbDtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgaXNOaWw7IiwiaW1wb3J0IGludm9rZXIgZnJvbSBcIi4vaW52b2tlci5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgYSBzdHJpbmcgbWFkZSBieSBpbnNlcnRpbmcgdGhlIGBzZXBhcmF0b3JgIGJldHdlZW4gZWFjaCBlbGVtZW50IGFuZFxuICogY29uY2F0ZW5hdGluZyBhbGwgdGhlIGVsZW1lbnRzIGludG8gYSBzaW5nbGUgc3RyaW5nLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgU3RyaW5nIC0+IFthXSAtPiBTdHJpbmdcbiAqIEBwYXJhbSB7TnVtYmVyfFN0cmluZ30gc2VwYXJhdG9yIFRoZSBzdHJpbmcgdXNlZCB0byBzZXBhcmF0ZSB0aGUgZWxlbWVudHMuXG4gKiBAcGFyYW0ge0FycmF5fSB4cyBUaGUgZWxlbWVudHMgdG8gam9pbiBpbnRvIGEgc3RyaW5nLlxuICogQHJldHVybiB7U3RyaW5nfSBzdHIgVGhlIHN0cmluZyBtYWRlIGJ5IGNvbmNhdGVuYXRpbmcgYHhzYCB3aXRoIGBzZXBhcmF0b3JgLlxuICogQHNlZSBSLnNwbGl0XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3Qgc3BhY2VyID0gUi5qb2luKCcgJyk7XG4gKiAgICAgIHNwYWNlcihbJ2EnLCAyLCAzLjRdKTsgICAvLz0+ICdhIDIgMy40J1xuICogICAgICBSLmpvaW4oJ3wnLCBbMSwgMiwgM10pOyAgICAvLz0+ICcxfDJ8MydcbiAqL1xudmFyIGpvaW4gPSAvKiNfX1BVUkVfXyovaW52b2tlcigxLCAnam9pbicpO1xuZXhwb3J0IGRlZmF1bHQgam9pbjsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5pbXBvcnQgY29udmVyZ2UgZnJvbSBcIi4vY29udmVyZ2UuanNcIjtcblxuLyoqXG4gKiBqdXh0IGFwcGxpZXMgYSBsaXN0IG9mIGZ1bmN0aW9ucyB0byBhIGxpc3Qgb2YgdmFsdWVzLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE5LjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyBbKGEsIGIsIC4uLiwgbSkgLT4gbl0gLT4gKChhLCBiLCAuLi4sIG0pIC0+IFtuXSlcbiAqIEBwYXJhbSB7QXJyYXl9IGZucyBBbiBhcnJheSBvZiBmdW5jdGlvbnNcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIGxpc3Qgb2YgdmFsdWVzIGFmdGVyIGFwcGx5aW5nIGVhY2ggb2YgdGhlIG9yaWdpbmFsIGBmbnNgIHRvIGl0cyBwYXJhbWV0ZXJzLlxuICogQHNlZSBSLmFwcGx5U3BlY1xuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IGdldFJhbmdlID0gUi5qdXh0KFtNYXRoLm1pbiwgTWF0aC5tYXhdKTtcbiAqICAgICAgZ2V0UmFuZ2UoMywgNCwgOSwgLTMpOyAvLz0+IFstMywgOV1cbiAqIEBzeW1iIFIuanV4dChbZiwgZywgaF0pKGEsIGIpID0gW2YoYSwgYiksIGcoYSwgYiksIGgoYSwgYildXG4gKi9cbnZhciBqdXh0ID0gLyojX19QVVJFX18qL19jdXJyeTEoZnVuY3Rpb24ganV4dChmbnMpIHtcbiAgcmV0dXJuIGNvbnZlcmdlKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTtcbiAgfSwgZm5zKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQganV4dDsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5pbXBvcnQgX2hhcyBmcm9tIFwiLi9pbnRlcm5hbC9faGFzLmpzXCI7XG5pbXBvcnQgX2lzQXJndW1lbnRzIGZyb20gXCIuL2ludGVybmFsL19pc0FyZ3VtZW50cy5qc1wiO1xuXG4vLyBjb3ZlciBJRSA8IDkga2V5cyBpc3N1ZXNcbnZhciBoYXNFbnVtQnVnID0gISAvKiNfX1BVUkVfXyove1xuICB0b1N0cmluZzogbnVsbFxufS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgndG9TdHJpbmcnKTtcbnZhciBub25FbnVtZXJhYmxlUHJvcHMgPSBbJ2NvbnN0cnVjdG9yJywgJ3ZhbHVlT2YnLCAnaXNQcm90b3R5cGVPZicsICd0b1N0cmluZycsICdwcm9wZXJ0eUlzRW51bWVyYWJsZScsICdoYXNPd25Qcm9wZXJ0eScsICd0b0xvY2FsZVN0cmluZyddO1xuLy8gU2FmYXJpIGJ1Z1xudmFyIGhhc0FyZ3NFbnVtQnVnID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIHJldHVybiBhcmd1bWVudHMucHJvcGVydHlJc0VudW1lcmFibGUoJ2xlbmd0aCcpO1xufSgpO1xudmFyIGNvbnRhaW5zID0gZnVuY3Rpb24gY29udGFpbnMobGlzdCwgaXRlbSkge1xuICB2YXIgaWR4ID0gMDtcbiAgd2hpbGUgKGlkeCA8IGxpc3QubGVuZ3RoKSB7XG4gICAgaWYgKGxpc3RbaWR4XSA9PT0gaXRlbSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlkeCArPSAxO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhIGxpc3QgY29udGFpbmluZyB0aGUgbmFtZXMgb2YgYWxsIHRoZSBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIG9mXG4gKiB0aGUgc3VwcGxpZWQgb2JqZWN0LlxuICogTm90ZSB0aGF0IHRoZSBvcmRlciBvZiB0aGUgb3V0cHV0IGFycmF5IGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIGNvbnNpc3RlbnRcbiAqIGFjcm9zcyBkaWZmZXJlbnQgSlMgcGxhdGZvcm1zLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyB7azogdn0gLT4gW2tdXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gZXh0cmFjdCBwcm9wZXJ0aWVzIGZyb21cbiAqIEByZXR1cm4ge0FycmF5fSBBbiBhcnJheSBvZiB0aGUgb2JqZWN0J3Mgb3duIHByb3BlcnRpZXMuXG4gKiBAc2VlIFIua2V5c0luLCBSLnZhbHVlcywgUi50b1BhaXJzXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5rZXlzKHthOiAxLCBiOiAyLCBjOiAzfSk7IC8vPT4gWydhJywgJ2InLCAnYyddXG4gKi9cbnZhciBrZXlzID0gdHlwZW9mIE9iamVjdC5rZXlzID09PSAnZnVuY3Rpb24nICYmICFoYXNBcmdzRW51bUJ1ZyA/IC8qI19fUFVSRV9fKi9fY3VycnkxKGZ1bmN0aW9uIGtleXMob2JqKSB7XG4gIHJldHVybiBPYmplY3Qob2JqKSAhPT0gb2JqID8gW10gOiBPYmplY3Qua2V5cyhvYmopO1xufSkgOiAvKiNfX1BVUkVfXyovX2N1cnJ5MShmdW5jdGlvbiBrZXlzKG9iaikge1xuICBpZiAoT2JqZWN0KG9iaikgIT09IG9iaikge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICB2YXIgcHJvcCwgbklkeDtcbiAgdmFyIGtzID0gW107XG4gIHZhciBjaGVja0FyZ3NMZW5ndGggPSBoYXNBcmdzRW51bUJ1ZyAmJiBfaXNBcmd1bWVudHMob2JqKTtcbiAgZm9yIChwcm9wIGluIG9iaikge1xuICAgIGlmIChfaGFzKHByb3AsIG9iaikgJiYgKCFjaGVja0FyZ3NMZW5ndGggfHwgcHJvcCAhPT0gJ2xlbmd0aCcpKSB7XG4gICAgICBrc1trcy5sZW5ndGhdID0gcHJvcDtcbiAgICB9XG4gIH1cbiAgaWYgKGhhc0VudW1CdWcpIHtcbiAgICBuSWR4ID0gbm9uRW51bWVyYWJsZVByb3BzLmxlbmd0aCAtIDE7XG4gICAgd2hpbGUgKG5JZHggPj0gMCkge1xuICAgICAgcHJvcCA9IG5vbkVudW1lcmFibGVQcm9wc1tuSWR4XTtcbiAgICAgIGlmIChfaGFzKHByb3AsIG9iaikgJiYgIWNvbnRhaW5zKGtzLCBwcm9wKSkge1xuICAgICAgICBrc1trcy5sZW5ndGhdID0gcHJvcDtcbiAgICAgIH1cbiAgICAgIG5JZHggLT0gMTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGtzO1xufSk7XG5leHBvcnQgZGVmYXVsdCBrZXlzOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBtYXAgZnJvbSBcIi4vbWFwLmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyBhIGxlbnMgZm9yIHRoZSBnaXZlbiBnZXR0ZXIgYW5kIHNldHRlciBmdW5jdGlvbnMuIFRoZSBnZXR0ZXIgXCJnZXRzXCJcbiAqIHRoZSB2YWx1ZSBvZiB0aGUgZm9jdXM7IHRoZSBzZXR0ZXIgXCJzZXRzXCIgdGhlIHZhbHVlIG9mIHRoZSBmb2N1cy4gVGhlIHNldHRlclxuICogc2hvdWxkIG5vdCBtdXRhdGUgdGhlIGRhdGEgc3RydWN0dXJlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjguMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHR5cGVkZWZuIExlbnMgcyBhID0gRnVuY3RvciBmID0+IChhIC0+IGYgYSkgLT4gcyAtPiBmIHNcbiAqIEBzaWcgKHMgLT4gYSkgLT4gKChhLCBzKSAtPiBzKSAtPiBMZW5zIHMgYVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZ2V0dGVyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZXR0ZXJcbiAqIEByZXR1cm4ge0xlbnN9XG4gKiBAc2VlIFIudmlldywgUi5zZXQsIFIub3ZlciwgUi5sZW5zSW5kZXgsIFIubGVuc1Byb3BcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCB4TGVucyA9IFIubGVucyhSLnByb3AoJ3gnKSwgUi5hc3NvYygneCcpKTtcbiAqXG4gKiAgICAgIFIudmlldyh4TGVucywge3g6IDEsIHk6IDJ9KTsgICAgICAgICAgICAvLz0+IDFcbiAqICAgICAgUi5zZXQoeExlbnMsIDQsIHt4OiAxLCB5OiAyfSk7ICAgICAgICAgIC8vPT4ge3g6IDQsIHk6IDJ9XG4gKiAgICAgIFIub3Zlcih4TGVucywgUi5uZWdhdGUsIHt4OiAxLCB5OiAyfSk7ICAvLz0+IHt4OiAtMSwgeTogMn1cbiAqL1xudmFyIGxlbnMgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiBsZW5zKGdldHRlciwgc2V0dGVyKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodG9GdW5jdG9yRm4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgcmV0dXJuIG1hcChmdW5jdGlvbiAoZm9jdXMpIHtcbiAgICAgICAgcmV0dXJuIHNldHRlcihmb2N1cywgdGFyZ2V0KTtcbiAgICAgIH0sIHRvRnVuY3RvckZuKGdldHRlcih0YXJnZXQpKSk7XG4gICAgfTtcbiAgfTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgbGVuczsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5pbXBvcnQgYXNzb2NQYXRoIGZyb20gXCIuL2Fzc29jUGF0aC5qc1wiO1xuaW1wb3J0IGxlbnMgZnJvbSBcIi4vbGVucy5qc1wiO1xuaW1wb3J0IF9wYXRoIGZyb20gXCIuL2ludGVybmFsL19wYXRoLmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyBhIGxlbnMgd2hvc2UgZm9jdXMgaXMgdGhlIHNwZWNpZmllZCBwYXRoLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE5LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEB0eXBlZGVmbiBJZHggPSBTdHJpbmcgfCBJbnQgfCBTeW1ib2xcbiAqIEB0eXBlZGVmbiBMZW5zIHMgYSA9IEZ1bmN0b3IgZiA9PiAoYSAtPiBmIGEpIC0+IHMgLT4gZiBzXG4gKiBAc2lnIFtJZHhdIC0+IExlbnMgcyBhXG4gKiBAcGFyYW0ge0FycmF5fSBwYXRoIFRoZSBwYXRoIHRvIHVzZS5cbiAqIEByZXR1cm4ge0xlbnN9XG4gKiBAc2VlIFIudmlldywgUi5zZXQsIFIub3ZlclxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IHhIZWFkWUxlbnMgPSBSLmxlbnNQYXRoKFsneCcsIDAsICd5J10pO1xuICpcbiAqICAgICAgUi52aWV3KHhIZWFkWUxlbnMsIHt4OiBbe3k6IDIsIHo6IDN9LCB7eTogNCwgejogNX1dfSk7XG4gKiAgICAgIC8vPT4gMlxuICogICAgICBSLnNldCh4SGVhZFlMZW5zLCAxLCB7eDogW3t5OiAyLCB6OiAzfSwge3k6IDQsIHo6IDV9XX0pO1xuICogICAgICAvLz0+IHt4OiBbe3k6IDEsIHo6IDN9LCB7eTogNCwgejogNX1dfVxuICogICAgICBSLm92ZXIoeEhlYWRZTGVucywgUi5uZWdhdGUsIHt4OiBbe3k6IDIsIHo6IDN9LCB7eTogNCwgejogNX1dfSk7XG4gKiAgICAgIC8vPT4ge3g6IFt7eTogLTIsIHo6IDN9LCB7eTogNCwgejogNX1dfVxuICovXG5cbnZhciBsZW5zUGF0aCA9IC8qI19fUFVSRV9fKi9fY3VycnkxKGZ1bmN0aW9uIGxlbnNQYXRoKHApIHtcbiAgcmV0dXJuIGxlbnMoZnVuY3Rpb24gKHZhbCkge1xuICAgIHJldHVybiBfcGF0aChwLCB2YWwpO1xuICB9LCBhc3NvY1BhdGgocCkpO1xufSk7XG5leHBvcnQgZGVmYXVsdCBsZW5zUGF0aDsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGxlc3MgdGhhbiB0aGUgc2Vjb25kOyBgZmFsc2VgXG4gKiBvdGhlcndpc2UuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgUmVsYXRpb25cbiAqIEBzaWcgT3JkIGEgPT4gYSAtPiBhIC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7Kn0gYVxuICogQHBhcmFtIHsqfSBiXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQHNlZSBSLmd0XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5sdCgyLCAxKTsgLy89PiBmYWxzZVxuICogICAgICBSLmx0KDIsIDIpOyAvLz0+IGZhbHNlXG4gKiAgICAgIFIubHQoMiwgMyk7IC8vPT4gdHJ1ZVxuICogICAgICBSLmx0KCdhJywgJ3onKTsgLy89PiB0cnVlXG4gKiAgICAgIFIubHQoJ3onLCAnYScpOyAvLz0+IGZhbHNlXG4gKi9cbnZhciBsdCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIGx0KGEsIGIpIHtcbiAgcmV0dXJuIGEgPCBiO1xufSk7XG5leHBvcnQgZGVmYXVsdCBsdDsiLCJpbXBvcnQgX2FycmF5UmVkdWNlIGZyb20gXCIuL2ludGVybmFsL19hcnJheVJlZHVjZS5qc1wiO1xuaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9kaXNwYXRjaGFibGUgZnJvbSBcIi4vaW50ZXJuYWwvX2Rpc3BhdGNoYWJsZS5qc1wiO1xuaW1wb3J0IF9tYXAgZnJvbSBcIi4vaW50ZXJuYWwvX21hcC5qc1wiO1xuaW1wb3J0IF94bWFwIGZyb20gXCIuL2ludGVybmFsL194bWFwLmpzXCI7XG5pbXBvcnQgY3VycnlOIGZyb20gXCIuL2N1cnJ5Ti5qc1wiO1xuaW1wb3J0IGtleXMgZnJvbSBcIi4va2V5cy5qc1wiO1xuXG4vKipcbiAqIFRha2VzIGEgZnVuY3Rpb24gYW5kXG4gKiBhIFtmdW5jdG9yXShodHRwczovL2dpdGh1Yi5jb20vZmFudGFzeWxhbmQvZmFudGFzeS1sYW5kI2Z1bmN0b3IpLFxuICogYXBwbGllcyB0aGUgZnVuY3Rpb24gdG8gZWFjaCBvZiB0aGUgZnVuY3RvcidzIHZhbHVlcywgYW5kIHJldHVybnNcbiAqIGEgZnVuY3RvciBvZiB0aGUgc2FtZSBzaGFwZS5cbiAqXG4gKiBSYW1kYSBwcm92aWRlcyBzdWl0YWJsZSBgbWFwYCBpbXBsZW1lbnRhdGlvbnMgZm9yIGBBcnJheWAgYW5kIGBPYmplY3RgLFxuICogc28gdGhpcyBmdW5jdGlvbiBtYXkgYmUgYXBwbGllZCB0byBgWzEsIDIsIDNdYCBvciBge3g6IDEsIHk6IDIsIHo6IDN9YC5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgbWFwYCBtZXRob2Qgb2YgdGhlIHNlY29uZCBhcmd1bWVudCwgaWYgcHJlc2VudC5cbiAqXG4gKiBBY3RzIGFzIGEgdHJhbnNkdWNlciBpZiBhIHRyYW5zZm9ybWVyIGlzIGdpdmVuIGluIGxpc3QgcG9zaXRpb24uXG4gKlxuICogQWxzbyB0cmVhdHMgZnVuY3Rpb25zIGFzIGZ1bmN0b3JzIGFuZCB3aWxsIGNvbXBvc2UgdGhlbSB0b2dldGhlci5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIEZ1bmN0b3IgZiA9PiAoYSAtPiBiKSAtPiBmIGEgLT4gZiBiXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uIGV2ZXJ5IGVsZW1lbnQgb2YgdGhlIGlucHV0IGBsaXN0YC5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGxpc3QgdG8gYmUgaXRlcmF0ZWQgb3Zlci5cbiAqIEByZXR1cm4ge0FycmF5fSBUaGUgbmV3IGxpc3QuXG4gKiBAc2VlIFIudHJhbnNkdWNlLCBSLmFkZEluZGV4LCBSLnBsdWNrLCBSLnByb2plY3RcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBkb3VibGUgPSB4ID0+IHggKiAyO1xuICpcbiAqICAgICAgUi5tYXAoZG91YmxlLCBbMSwgMiwgM10pOyAvLz0+IFsyLCA0LCA2XVxuICpcbiAqICAgICAgUi5tYXAoZG91YmxlLCB7eDogMSwgeTogMiwgejogM30pOyAvLz0+IHt4OiAyLCB5OiA0LCB6OiA2fVxuICogQHN5bWIgUi5tYXAoZiwgW2EsIGJdKSA9IFtmKGEpLCBmKGIpXVxuICogQHN5bWIgUi5tYXAoZiwgeyB4OiBhLCB5OiBiIH0pID0geyB4OiBmKGEpLCB5OiBmKGIpIH1cbiAqIEBzeW1iIFIubWFwKGYsIGZ1bmN0b3JfbykgPSBmdW5jdG9yX28ubWFwKGYpXG4gKi9cbnZhciBtYXAgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MiggLyojX19QVVJFX18qL19kaXNwYXRjaGFibGUoWydmYW50YXN5LWxhbmQvbWFwJywgJ21hcCddLCBfeG1hcCwgZnVuY3Rpb24gbWFwKGZuLCBmdW5jdG9yKSB7XG4gIHN3aXRjaCAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGZ1bmN0b3IpKSB7XG4gICAgY2FzZSAnW29iamVjdCBGdW5jdGlvbl0nOlxuICAgICAgcmV0dXJuIGN1cnJ5TihmdW5jdG9yLmxlbmd0aCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZm4uY2FsbCh0aGlzLCBmdW5jdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICAgICAgfSk7XG4gICAgY2FzZSAnW29iamVjdCBPYmplY3RdJzpcbiAgICAgIHJldHVybiBfYXJyYXlSZWR1Y2UoZnVuY3Rpb24gKGFjYywga2V5KSB7XG4gICAgICAgIGFjY1trZXldID0gZm4oZnVuY3RvcltrZXldKTtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sIHt9LCBrZXlzKGZ1bmN0b3IpKTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIF9tYXAoZm4sIGZ1bmN0b3IpO1xuICB9XG59KSk7XG5leHBvcnQgZGVmYXVsdCBtYXA7IiwiaW1wb3J0IF9hcnJheVJlZHVjZSBmcm9tIFwiLi9pbnRlcm5hbC9fYXJyYXlSZWR1Y2UuanNcIjtcbmltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBrZXlzIGZyb20gXCIuL2tleXMuanNcIjtcblxuLyoqXG4gKiBBbiBPYmplY3Qtc3BlY2lmaWMgdmVyc2lvbiBvZiBbYG1hcGBdKCNtYXApLiBUaGUgZnVuY3Rpb24gaXMgYXBwbGllZCB0byB0aHJlZVxuICogYXJndW1lbnRzOiAqKHZhbHVlLCBrZXksIG9iaikqLiBJZiBvbmx5IHRoZSB2YWx1ZSBpcyBzaWduaWZpY2FudCwgdXNlXG4gKiBbYG1hcGBdKCNtYXApIGluc3RlYWQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuOS4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnICgoKiwgU3RyaW5nLCBPYmplY3QpIC0+ICopIC0+IE9iamVjdCAtPiBPYmplY3RcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAc2VlIFIubWFwXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgeHl6ID0geyB4OiAxLCB5OiAyLCB6OiAzIH07XG4gKiAgICAgIGNvbnN0IHByZXBlbmRLZXlBbmREb3VibGUgPSAobnVtLCBrZXksIG9iaikgPT4ga2V5ICsgKG51bSAqIDIpO1xuICpcbiAqICAgICAgUi5tYXBPYmpJbmRleGVkKHByZXBlbmRLZXlBbmREb3VibGUsIHh5eik7IC8vPT4geyB4OiAneDInLCB5OiAneTQnLCB6OiAnejYnIH1cbiAqL1xudmFyIG1hcE9iakluZGV4ZWQgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiBtYXBPYmpJbmRleGVkKGZuLCBvYmopIHtcbiAgcmV0dXJuIF9hcnJheVJlZHVjZShmdW5jdGlvbiAoYWNjLCBrZXkpIHtcbiAgICBhY2Nba2V5XSA9IGZuKG9ialtrZXldLCBrZXksIG9iaik7XG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30sIGtleXMob2JqKSk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IG1hcE9iakluZGV4ZWQ7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IHRvU3RyaW5nIGZyb20gXCIuL3RvU3RyaW5nLmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbGFyZ2VyIG9mIGl0cyB0d28gYXJndW1lbnRzLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IFJlbGF0aW9uXG4gKiBAc2lnIE9yZCBhID0+IGEgLT4gYSAtPiBhXG4gKiBAcGFyYW0geyp9IGFcbiAqIEBwYXJhbSB7Kn0gYlxuICogQHJldHVybiB7Kn1cbiAqIEBzZWUgUi5tYXhCeSwgUi5taW5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLm1heCg3ODksIDEyMyk7IC8vPT4gNzg5XG4gKiAgICAgIFIubWF4KCdhJywgJ2InKTsgLy89PiAnYidcbiAqL1xudmFyIG1heCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIG1heChhLCBiKSB7XG4gIGlmIChhID09PSBiKSB7XG4gICAgcmV0dXJuIGI7XG4gIH1cbiAgZnVuY3Rpb24gc2FmZU1heCh4LCB5KSB7XG4gICAgaWYgKHggPiB5ICE9PSB5ID4geCkge1xuICAgICAgcmV0dXJuIHkgPiB4ID8geSA6IHg7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgdmFyIG1heEJ5VmFsdWUgPSBzYWZlTWF4KGEsIGIpO1xuICBpZiAobWF4QnlWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG1heEJ5VmFsdWU7XG4gIH1cbiAgdmFyIG1heEJ5VHlwZSA9IHNhZmVNYXgodHlwZW9mIGEsIHR5cGVvZiBiKTtcbiAgaWYgKG1heEJ5VHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG1heEJ5VHlwZSA9PT0gdHlwZW9mIGEgPyBhIDogYjtcbiAgfVxuICB2YXIgc3RyaW5nQSA9IHRvU3RyaW5nKGEpO1xuICB2YXIgbWF4QnlTdHJpbmdWYWx1ZSA9IHNhZmVNYXgoc3RyaW5nQSwgdG9TdHJpbmcoYikpO1xuICBpZiAobWF4QnlTdHJpbmdWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG1heEJ5U3RyaW5nVmFsdWUgPT09IHN0cmluZ0EgPyBhIDogYjtcbiAgfVxuICByZXR1cm4gYjtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgbWF4OyIsImltcG9ydCBfYXJpdHkgZnJvbSBcIi4vaW50ZXJuYWwvX2FyaXR5LmpzXCI7XG5pbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX2hhcyBmcm9tIFwiLi9pbnRlcm5hbC9faGFzLmpzXCI7XG5cbi8qKlxuICogVGFrZXMgYSBzdHJpbmctcmV0dXJuaW5nIGZ1bmN0aW9uIGBrZXlHZW5gIGFuZCBhIGZ1bmN0aW9uIGBmbmAgYW5kIHJldHVybnNcbiAqIGEgbmV3IGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBjYWNoZWQgcmVzdWx0cyBmb3Igc3Vic2VxdWVudFxuICogY2FsbHMgd2l0aCB0aGUgc2FtZSBhcmd1bWVudHMuXG4gKlxuICogV2hlbiB0aGUgZnVuY3Rpb24gaXMgaW52b2tlZCwgYGtleUdlbmAgaXMgYXBwbGllZCB0byB0aGUgc2FtZSBhcmd1bWVudHNcbiAqIGFuZCBpdHMgcmVzdWx0IGJlY29tZXMgdGhlIGNhY2hlIGtleS4gSWYgdGhlIGNhY2hlIGNvbnRhaW5zIHNvbWV0aGluZ1xuICogdW5kZXIgdGhhdCBrZXksIHRoZSBmdW5jdGlvbiBzaW1wbHkgcmV0dXJucyBpdCBhbmQgZG9lcyBub3QgaW52b2tlIGBmbmAgYXQgYWxsLlxuICpcbiAqIE90aGVyd2lzZSBgZm5gIGlzIGFwcGxpZWQgdG8gdGhlIHNhbWUgYXJndW1lbnRzIGFuZCBpdHMgcmV0dXJuIHZhbHVlXG4gKiBpcyBjYWNoZWQgdW5kZXIgdGhhdCBrZXkgYW5kIHJldHVybmVkIGJ5IHRoZSBmdW5jdGlvbi5cbiAqXG4gKiBDYXJlIG11c3QgYmUgdGFrZW4gd2hlbiBpbXBsZW1lbnRpbmcgYGtleUdlbmAgdG8gYXZvaWQga2V5IGNvbGxpc2lvbixcbiAqIG9yIGlmIHRyYWNraW5nIHJlZmVyZW5jZXMsIG1lbW9yeSBsZWFrcyBhbmQgbXV0YXRpbmcgYXJndW1lbnRzLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjI0LjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyAoKi4uLiAtPiBTdHJpbmcpIC0+ICgqLi4uIC0+IGEpIC0+ICgqLi4uIC0+IGEpXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlHZW4gVGhlIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIHRoZSBjYWNoZSBrZXkuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gbWVtb2l6ZS5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBNZW1vaXplZCB2ZXJzaW9uIG9mIGBmbmAuXG4gKiBAZXhhbXBsZVxuICogICAgICBjb25zdCB3aXRoQWdlID0gbWVtb2l6ZVdpdGgobyA9PiBgJHtvLmJpcnRofS8ke28uZGVhdGh9YCwgKHtiaXJ0aCwgZGVhdGh9KSA9PiB7XG4gKiAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eICBeXl5eXl5eXl5eXl5eXl5eXl5eXl5cbiAqICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgIGtleUdlbiAgICAgICAgICAgICAgICAgICAgICAgIGZuXG4gKiAgICAgICAgY29uc29sZS5sb2coYGNvbXB1dGluZyBhZ2UgZm9yICR7YmlydGh9LyR7ZGVhdGh9YCk7XG4gKiAgICAgICAgcmV0dXJuICh7YmlydGgsIGRlYXRoLCBhZ2U6IGRlYXRoIC0gYmlydGh9KTtcbiAqICAgICAgfSk7XG4gKlxuICogICAgICB3aXRoQWdlKHtiaXJ0aDogMTkyMSwgZGVhdGg6IDE5OTl9KTtcbiAqICAgICAgLy89PiBMT0c6IGNvbXB1dGluZyBhZ2UgZm9yIDE5MjEvMTk5OVxuICogICAgICAvLz0+IHtiaXJ0aDogMTkyMSwgZGVhdGg6IDE5OTksIGFnZTogNzh9IChyZXR1cm5lZCBmcm9tIGZuKVxuICpcbiAqICAgICAgd2l0aEFnZSh7YmlydGg6IDE5MjEsIGRlYXRoOiAxOTk5fSk7XG4gKiAgICAgIC8vPT4ge2JpcnRoOiAxOTIxLCBkZWF0aDogMTk5OSwgYWdlOiA3OH0gKHJldHVybmVkIGZyb20gY2FjaGUpXG4gKi9cbnZhciBtZW1vaXplV2l0aCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIG1lbW9pemVXaXRoKGtleUdlbiwgZm4pIHtcbiAgdmFyIGNhY2hlID0ge307XG4gIHJldHVybiBfYXJpdHkoZm4ubGVuZ3RoLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGtleSA9IGtleUdlbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmICghX2hhcyhrZXksIGNhY2hlKSkge1xuICAgICAgY2FjaGVba2V5XSA9IGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuICAgIHJldHVybiBjYWNoZVtrZXldO1xuICB9KTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgbWVtb2l6ZVdpdGg7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IG1lcmdlRGVlcFdpdGhLZXkgZnJvbSBcIi4vbWVyZ2VEZWVwV2l0aEtleS5qc1wiO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgb2JqZWN0IHdpdGggdGhlIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBmaXJzdCBvYmplY3QgbWVyZ2VkIHdpdGhcbiAqIHRoZSBvd24gcHJvcGVydGllcyBvZiB0aGUgc2Vjb25kIG9iamVjdC4gSWYgYSBrZXkgZXhpc3RzIGluIGJvdGggb2JqZWN0czpcbiAqIC0gYW5kIGJvdGggdmFsdWVzIGFyZSBvYmplY3RzLCB0aGUgdHdvIHZhbHVlcyB3aWxsIGJlIHJlY3Vyc2l2ZWx5IG1lcmdlZFxuICogLSBvdGhlcndpc2UgdGhlIHZhbHVlIGZyb20gdGhlIHNlY29uZCBvYmplY3Qgd2lsbCBiZSB1c2VkLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjI0LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcge2F9IC0+IHthfSAtPiB7YX1cbiAqIEBwYXJhbSB7T2JqZWN0fSBsT2JqXG4gKiBAcGFyYW0ge09iamVjdH0gck9ialxuICogQHJldHVybiB7T2JqZWN0fVxuICogQHNlZSBSLm1lcmdlLCBSLm1lcmdlRGVlcExlZnQsIFIubWVyZ2VEZWVwV2l0aCwgUi5tZXJnZURlZXBXaXRoS2V5XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5tZXJnZURlZXBSaWdodCh7IG5hbWU6ICdmcmVkJywgYWdlOiAxMCwgY29udGFjdDogeyBlbWFpbDogJ21vb0BleGFtcGxlLmNvbScgfX0sXG4gKiAgICAgICAgICAgICAgICAgICAgICAgeyBhZ2U6IDQwLCBjb250YWN0OiB7IGVtYWlsOiAnYmFhQGV4YW1wbGUuY29tJyB9fSk7XG4gKiAgICAgIC8vPT4geyBuYW1lOiAnZnJlZCcsIGFnZTogNDAsIGNvbnRhY3Q6IHsgZW1haWw6ICdiYWFAZXhhbXBsZS5jb20nIH19XG4gKi9cbnZhciBtZXJnZURlZXBSaWdodCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIG1lcmdlRGVlcFJpZ2h0KGxPYmosIHJPYmopIHtcbiAgcmV0dXJuIG1lcmdlRGVlcFdpdGhLZXkoZnVuY3Rpb24gKGssIGxWYWwsIHJWYWwpIHtcbiAgICByZXR1cm4gclZhbDtcbiAgfSwgbE9iaiwgck9iaik7XG59KTtcbmV4cG9ydCBkZWZhdWx0IG1lcmdlRGVlcFJpZ2h0OyIsImltcG9ydCBfY3VycnkzIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTMuanNcIjtcbmltcG9ydCBfaXNPYmplY3QgZnJvbSBcIi4vaW50ZXJuYWwvX2lzT2JqZWN0LmpzXCI7XG5pbXBvcnQgbWVyZ2VXaXRoS2V5IGZyb20gXCIuL21lcmdlV2l0aEtleS5qc1wiO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgb2JqZWN0IHdpdGggdGhlIG93biBwcm9wZXJ0aWVzIG9mIHRoZSB0d28gcHJvdmlkZWQgb2JqZWN0cy5cbiAqIElmIGEga2V5IGV4aXN0cyBpbiBib3RoIG9iamVjdHM6XG4gKiAtIGFuZCBib3RoIGFzc29jaWF0ZWQgdmFsdWVzIGFyZSBhbHNvIG9iamVjdHMgdGhlbiB0aGUgdmFsdWVzIHdpbGwgYmVcbiAqICAgcmVjdXJzaXZlbHkgbWVyZ2VkLlxuICogLSBvdGhlcndpc2UgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIGlzIGFwcGxpZWQgdG8gdGhlIGtleSBhbmQgYXNzb2NpYXRlZCB2YWx1ZXNcbiAqICAgdXNpbmcgdGhlIHJlc3VsdGluZyB2YWx1ZSBhcyB0aGUgbmV3IHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5LlxuICogSWYgYSBrZXkgb25seSBleGlzdHMgaW4gb25lIG9iamVjdCwgdGhlIHZhbHVlIHdpbGwgYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXlcbiAqIG9mIHRoZSByZXN1bHRpbmcgb2JqZWN0LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjI0LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcgKChTdHJpbmcsIGEsIGEpIC0+IGEpIC0+IHthfSAtPiB7YX0gLT4ge2F9XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHBhcmFtIHtPYmplY3R9IGxPYmpcbiAqIEBwYXJhbSB7T2JqZWN0fSByT2JqXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAc2VlIFIubWVyZ2VXaXRoS2V5LCBSLm1lcmdlRGVlcFdpdGhcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBsZXQgY29uY2F0VmFsdWVzID0gKGssIGwsIHIpID0+IGsgPT0gJ3ZhbHVlcycgPyBSLmNvbmNhdChsLCByKSA6IHJcbiAqICAgICAgUi5tZXJnZURlZXBXaXRoS2V5KGNvbmNhdFZhbHVlcyxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgIHsgYTogdHJ1ZSwgYzogeyB0aGluZzogJ2ZvbycsIHZhbHVlczogWzEwLCAyMF0gfX0sXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICB7IGI6IHRydWUsIGM6IHsgdGhpbmc6ICdiYXInLCB2YWx1ZXM6IFsxNSwgMzVdIH19KTtcbiAqICAgICAgLy89PiB7IGE6IHRydWUsIGI6IHRydWUsIGM6IHsgdGhpbmc6ICdiYXInLCB2YWx1ZXM6IFsxMCwgMjAsIDE1LCAzNV0gfX1cbiAqL1xudmFyIG1lcmdlRGVlcFdpdGhLZXkgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MyhmdW5jdGlvbiBtZXJnZURlZXBXaXRoS2V5KGZuLCBsT2JqLCByT2JqKSB7XG4gIHJldHVybiBtZXJnZVdpdGhLZXkoZnVuY3Rpb24gKGssIGxWYWwsIHJWYWwpIHtcbiAgICBpZiAoX2lzT2JqZWN0KGxWYWwpICYmIF9pc09iamVjdChyVmFsKSkge1xuICAgICAgcmV0dXJuIG1lcmdlRGVlcFdpdGhLZXkoZm4sIGxWYWwsIHJWYWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZm4oaywgbFZhbCwgclZhbCk7XG4gICAgfVxuICB9LCBsT2JqLCByT2JqKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgbWVyZ2VEZWVwV2l0aEtleTsiLCJpbXBvcnQgX29iamVjdEFzc2lnbiBmcm9tIFwiLi9pbnRlcm5hbC9fb2JqZWN0QXNzaWduLmpzXCI7XG5pbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5cbi8qKlxuICogQ3JlYXRlIGEgbmV3IG9iamVjdCB3aXRoIHRoZSBvd24gcHJvcGVydGllcyBvZiB0aGUgZmlyc3Qgb2JqZWN0IG1lcmdlZCB3aXRoXG4gKiB0aGUgb3duIHByb3BlcnRpZXMgb2YgdGhlIHNlY29uZCBvYmplY3QuIElmIGEga2V5IGV4aXN0cyBpbiBib3RoIG9iamVjdHMsXG4gKiB0aGUgdmFsdWUgZnJvbSB0aGUgZmlyc3Qgb2JqZWN0IHdpbGwgYmUgdXNlZC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4yNi4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnIHtrOiB2fSAtPiB7azogdn0gLT4ge2s6IHZ9XG4gKiBAcGFyYW0ge09iamVjdH0gbFxuICogQHBhcmFtIHtPYmplY3R9IHJcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBzZWUgUi5tZXJnZVJpZ2h0LCBSLm1lcmdlRGVlcExlZnQsIFIubWVyZ2VXaXRoLCBSLm1lcmdlV2l0aEtleVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIubWVyZ2VMZWZ0KHsgJ2FnZSc6IDQwIH0sIHsgJ25hbWUnOiAnZnJlZCcsICdhZ2UnOiAxMCB9KTtcbiAqICAgICAgLy89PiB7ICduYW1lJzogJ2ZyZWQnLCAnYWdlJzogNDAgfVxuICpcbiAqICAgICAgY29uc3QgcmVzZXRUb0RlZmF1bHQgPSBSLm1lcmdlTGVmdCh7eDogMH0pO1xuICogICAgICByZXNldFRvRGVmYXVsdCh7eDogNSwgeTogMn0pOyAvLz0+IHt4OiAwLCB5OiAyfVxuICogQHN5bWIgUi5tZXJnZUxlZnQoYSwgYikgPSB7Li4uYiwgLi4uYX1cbiAqL1xudmFyIG1lcmdlTGVmdCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIG1lcmdlTGVmdChsLCByKSB7XG4gIHJldHVybiBfb2JqZWN0QXNzaWduKHt9LCByLCBsKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgbWVyZ2VMZWZ0OyIsImltcG9ydCBfb2JqZWN0QXNzaWduIGZyb20gXCIuL2ludGVybmFsL19vYmplY3RBc3NpZ24uanNcIjtcbmltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcblxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgb2JqZWN0IHdpdGggdGhlIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBmaXJzdCBvYmplY3QgbWVyZ2VkIHdpdGhcbiAqIHRoZSBvd24gcHJvcGVydGllcyBvZiB0aGUgc2Vjb25kIG9iamVjdC4gSWYgYSBrZXkgZXhpc3RzIGluIGJvdGggb2JqZWN0cyxcbiAqIHRoZSB2YWx1ZSBmcm9tIHRoZSBzZWNvbmQgb2JqZWN0IHdpbGwgYmUgdXNlZC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4yNi4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnIHtrOiB2fSAtPiB7azogdn0gLT4ge2s6IHZ9XG4gKiBAcGFyYW0ge09iamVjdH0gbFxuICogQHBhcmFtIHtPYmplY3R9IHJcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBzZWUgUi5tZXJnZUxlZnQsIFIubWVyZ2VEZWVwUmlnaHQsIFIubWVyZ2VXaXRoLCBSLm1lcmdlV2l0aEtleVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIubWVyZ2VSaWdodCh7ICduYW1lJzogJ2ZyZWQnLCAnYWdlJzogMTAgfSwgeyAnYWdlJzogNDAgfSk7XG4gKiAgICAgIC8vPT4geyAnbmFtZSc6ICdmcmVkJywgJ2FnZSc6IDQwIH1cbiAqXG4gKiAgICAgIGNvbnN0IHdpdGhEZWZhdWx0cyA9IFIubWVyZ2VSaWdodCh7eDogMCwgeTogMH0pO1xuICogICAgICB3aXRoRGVmYXVsdHMoe3k6IDJ9KTsgLy89PiB7eDogMCwgeTogMn1cbiAqIEBzeW1iIFIubWVyZ2VSaWdodChhLCBiKSA9IHsuLi5hLCAuLi5ifVxuICovXG52YXIgbWVyZ2VSaWdodCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIG1lcmdlUmlnaHQobCwgcikge1xuICByZXR1cm4gX29iamVjdEFzc2lnbih7fSwgbCwgcik7XG59KTtcbmV4cG9ydCBkZWZhdWx0IG1lcmdlUmlnaHQ7IiwiaW1wb3J0IF9jdXJyeTMgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5My5qc1wiO1xuaW1wb3J0IG1lcmdlV2l0aEtleSBmcm9tIFwiLi9tZXJnZVdpdGhLZXkuanNcIjtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IG9iamVjdCB3aXRoIHRoZSBvd24gcHJvcGVydGllcyBvZiB0aGUgdHdvIHByb3ZpZGVkIG9iamVjdHMuIElmXG4gKiBhIGtleSBleGlzdHMgaW4gYm90aCBvYmplY3RzLCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gaXMgYXBwbGllZCB0byB0aGUgdmFsdWVzXG4gKiBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSBpbiBlYWNoIG9iamVjdCwgd2l0aCB0aGUgcmVzdWx0IGJlaW5nIHVzZWQgYXMgdGhlXG4gKiB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSBpbiB0aGUgcmV0dXJuZWQgb2JqZWN0LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE5LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcgKChhLCBhKSAtPiBhKSAtPiB7YX0gLT4ge2F9IC0+IHthfVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEBwYXJhbSB7T2JqZWN0fSBsXG4gKiBAcGFyYW0ge09iamVjdH0gclxuICogQHJldHVybiB7T2JqZWN0fVxuICogQHNlZSBSLm1lcmdlRGVlcFdpdGgsIFIubWVyZ2UsIFIubWVyZ2VXaXRoS2V5XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5tZXJnZVdpdGgoUi5jb25jYXQsXG4gKiAgICAgICAgICAgICAgICAgIHsgYTogdHJ1ZSwgdmFsdWVzOiBbMTAsIDIwXSB9LFxuICogICAgICAgICAgICAgICAgICB7IGI6IHRydWUsIHZhbHVlczogWzE1LCAzNV0gfSk7XG4gKiAgICAgIC8vPT4geyBhOiB0cnVlLCBiOiB0cnVlLCB2YWx1ZXM6IFsxMCwgMjAsIDE1LCAzNV0gfVxuICovXG52YXIgbWVyZ2VXaXRoID0gLyojX19QVVJFX18qL19jdXJyeTMoZnVuY3Rpb24gbWVyZ2VXaXRoKGZuLCBsLCByKSB7XG4gIHJldHVybiBtZXJnZVdpdGhLZXkoZnVuY3Rpb24gKF8sIF9sLCBfcikge1xuICAgIHJldHVybiBmbihfbCwgX3IpO1xuICB9LCBsLCByKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgbWVyZ2VXaXRoOyIsImltcG9ydCBfY3VycnkzIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTMuanNcIjtcbmltcG9ydCBfaGFzIGZyb20gXCIuL2ludGVybmFsL19oYXMuanNcIjtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IG9iamVjdCB3aXRoIHRoZSBvd24gcHJvcGVydGllcyBvZiB0aGUgdHdvIHByb3ZpZGVkIG9iamVjdHMuIElmXG4gKiBhIGtleSBleGlzdHMgaW4gYm90aCBvYmplY3RzLCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gaXMgYXBwbGllZCB0byB0aGUga2V5XG4gKiBhbmQgdGhlIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSBpbiBlYWNoIG9iamVjdCwgd2l0aCB0aGUgcmVzdWx0IGJlaW5nXG4gKiB1c2VkIGFzIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSBpbiB0aGUgcmV0dXJuZWQgb2JqZWN0LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE5LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcgKChTdHJpbmcsIGEsIGEpIC0+IGEpIC0+IHthfSAtPiB7YX0gLT4ge2F9XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHBhcmFtIHtPYmplY3R9IGxcbiAqIEBwYXJhbSB7T2JqZWN0fSByXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAc2VlIFIubWVyZ2VEZWVwV2l0aEtleSwgUi5tZXJnZSwgUi5tZXJnZVdpdGhcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBsZXQgY29uY2F0VmFsdWVzID0gKGssIGwsIHIpID0+IGsgPT0gJ3ZhbHVlcycgPyBSLmNvbmNhdChsLCByKSA6IHJcbiAqICAgICAgUi5tZXJnZVdpdGhLZXkoY29uY2F0VmFsdWVzLFxuICogICAgICAgICAgICAgICAgICAgICB7IGE6IHRydWUsIHRoaW5nOiAnZm9vJywgdmFsdWVzOiBbMTAsIDIwXSB9LFxuICogICAgICAgICAgICAgICAgICAgICB7IGI6IHRydWUsIHRoaW5nOiAnYmFyJywgdmFsdWVzOiBbMTUsIDM1XSB9KTtcbiAqICAgICAgLy89PiB7IGE6IHRydWUsIGI6IHRydWUsIHRoaW5nOiAnYmFyJywgdmFsdWVzOiBbMTAsIDIwLCAxNSwgMzVdIH1cbiAqIEBzeW1iIFIubWVyZ2VXaXRoS2V5KGYsIHsgeDogMSwgeTogMiB9LCB7IHk6IDUsIHo6IDMgfSkgPSB7IHg6IDEsIHk6IGYoJ3knLCAyLCA1KSwgejogMyB9XG4gKi9cbnZhciBtZXJnZVdpdGhLZXkgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MyhmdW5jdGlvbiBtZXJnZVdpdGhLZXkoZm4sIGwsIHIpIHtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICB2YXIgaztcbiAgbCA9IGwgfHwge307XG4gIHIgPSByIHx8IHt9O1xuICBmb3IgKGsgaW4gbCkge1xuICAgIGlmIChfaGFzKGssIGwpKSB7XG4gICAgICByZXN1bHRba10gPSBfaGFzKGssIHIpID8gZm4oaywgbFtrXSwgcltrXSkgOiBsW2tdO1xuICAgIH1cbiAgfVxuICBmb3IgKGsgaW4gcikge1xuICAgIGlmIChfaGFzKGssIHIpICYmICFfaGFzKGssIHJlc3VsdCkpIHtcbiAgICAgIHJlc3VsdFtrXSA9IHJba107XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59KTtcbmV4cG9ydCBkZWZhdWx0IG1lcmdlV2l0aEtleTsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyBhIHBhcnRpYWwgY29weSBvZiBhbiBvYmplY3Qgb21pdHRpbmcgdGhlIGtleXMgc3BlY2lmaWVkLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyBbU3RyaW5nXSAtPiB7U3RyaW5nOiAqfSAtPiB7U3RyaW5nOiAqfVxuICogQHBhcmFtIHtBcnJheX0gbmFtZXMgYW4gYXJyYXkgb2YgU3RyaW5nIHByb3BlcnR5IG5hbWVzIHRvIG9taXQgZnJvbSB0aGUgbmV3IG9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIGNvcHkgZnJvbVxuICogQHJldHVybiB7T2JqZWN0fSBBIG5ldyBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIGZyb20gYG5hbWVzYCBub3Qgb24gaXQuXG4gKiBAc2VlIFIucGlja1xuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIub21pdChbJ2EnLCAnZCddLCB7YTogMSwgYjogMiwgYzogMywgZDogNH0pOyAvLz0+IHtiOiAyLCBjOiAzfVxuICovXG52YXIgb21pdCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIG9taXQobmFtZXMsIG9iaikge1xuICB2YXIgcmVzdWx0ID0ge307XG4gIHZhciBpbmRleCA9IHt9O1xuICB2YXIgaWR4ID0gMDtcbiAgdmFyIGxlbiA9IG5hbWVzLmxlbmd0aDtcbiAgd2hpbGUgKGlkeCA8IGxlbikge1xuICAgIGluZGV4W25hbWVzW2lkeF1dID0gMTtcbiAgICBpZHggKz0gMTtcbiAgfVxuICBmb3IgKHZhciBwcm9wIGluIG9iaikge1xuICAgIGlmICghaW5kZXguaGFzT3duUHJvcGVydHkocHJvcCkpIHtcbiAgICAgIHJlc3VsdFtwcm9wXSA9IG9ialtwcm9wXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgb21pdDsiLCJpbXBvcnQgX2FyaXR5IGZyb20gXCIuL2ludGVybmFsL19hcml0eS5qc1wiO1xuaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5MS5qc1wiO1xuXG4vKipcbiAqIEFjY2VwdHMgYSBmdW5jdGlvbiBgZm5gIGFuZCByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBndWFyZHMgaW52b2NhdGlvbiBvZlxuICogYGZuYCBzdWNoIHRoYXQgYGZuYCBjYW4gb25seSBldmVyIGJlIGNhbGxlZCBvbmNlLCBubyBtYXR0ZXIgaG93IG1hbnkgdGltZXNcbiAqIHRoZSByZXR1cm5lZCBmdW5jdGlvbiBpcyBpbnZva2VkLiBUaGUgZmlyc3QgdmFsdWUgY2FsY3VsYXRlZCBpcyByZXR1cm5lZCBpblxuICogc3Vic2VxdWVudCBpbnZvY2F0aW9ucy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyAoYS4uLiAtPiBiKSAtPiAoYS4uLiAtPiBiKVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIHdyYXAgaW4gYSBjYWxsLW9ubHktb25jZSB3cmFwcGVyLlxuICogQHJldHVybiB7RnVuY3Rpb259IFRoZSB3cmFwcGVkIGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IGFkZE9uZU9uY2UgPSBSLm9uY2UoeCA9PiB4ICsgMSk7XG4gKiAgICAgIGFkZE9uZU9uY2UoMTApOyAvLz0+IDExXG4gKiAgICAgIGFkZE9uZU9uY2UoYWRkT25lT25jZSg1MCkpOyAvLz0+IDExXG4gKi9cbnZhciBvbmNlID0gLyojX19QVVJFX18qL19jdXJyeTEoZnVuY3Rpb24gb25jZShmbikge1xuICB2YXIgY2FsbGVkID0gZmFsc2U7XG4gIHZhciByZXN1bHQ7XG4gIHJldHVybiBfYXJpdHkoZm4ubGVuZ3RoLCBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGNhbGxlZCkge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgY2FsbGVkID0gdHJ1ZTtcbiAgICByZXN1bHQgPSBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0pO1xufSk7XG5leHBvcnQgZGVmYXVsdCBvbmNlOyIsImltcG9ydCBfY3VycnkzIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTMuanNcIjtcblxuLy8gYElkZW50aXR5YCBpcyBhIGZ1bmN0b3IgdGhhdCBob2xkcyBhIHNpbmdsZSB2YWx1ZSwgd2hlcmUgYG1hcGAgc2ltcGx5XG4vLyB0cmFuc2Zvcm1zIHRoZSBoZWxkIHZhbHVlIHdpdGggdGhlIHByb3ZpZGVkIGZ1bmN0aW9uLlxudmFyIElkZW50aXR5ID0gZnVuY3Rpb24gKHgpIHtcbiAgcmV0dXJuIHtcbiAgICB2YWx1ZTogeCxcbiAgICBtYXA6IGZ1bmN0aW9uIChmKSB7XG4gICAgICByZXR1cm4gSWRlbnRpdHkoZih4KSk7XG4gICAgfVxuICB9O1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgXCJzZXR0aW5nXCIgdGhlIHBvcnRpb24gb2YgdGhlIGdpdmVuIGRhdGEgc3RydWN0dXJlXG4gKiBmb2N1c2VkIGJ5IHRoZSBnaXZlbiBsZW5zIHRvIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgdGhlIGdpdmVuIGZ1bmN0aW9uIHRvXG4gKiB0aGUgZm9jdXNlZCB2YWx1ZS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xNi4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAdHlwZWRlZm4gTGVucyBzIGEgPSBGdW5jdG9yIGYgPT4gKGEgLT4gZiBhKSAtPiBzIC0+IGYgc1xuICogQHNpZyBMZW5zIHMgYSAtPiAoYSAtPiBhKSAtPiBzIC0+IHNcbiAqIEBwYXJhbSB7TGVuc30gbGVuc1xuICogQHBhcmFtIHsqfSB2XG4gKiBAcGFyYW0geyp9IHhcbiAqIEByZXR1cm4geyp9XG4gKiBAc2VlIFIudmlldywgUi5zZXQsIFIubGVucywgUi5sZW5zSW5kZXgsIFIubGVuc1Byb3AsIFIubGVuc1BhdGhcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBoZWFkTGVucyA9IFIubGVuc0luZGV4KDApO1xuICpcbiAqICAgICAgUi5vdmVyKGhlYWRMZW5zLCBSLnRvVXBwZXIsIFsnZm9vJywgJ2JhcicsICdiYXonXSk7IC8vPT4gWydGT08nLCAnYmFyJywgJ2JheiddXG4gKi9cbnZhciBvdmVyID0gLyojX19QVVJFX18qL19jdXJyeTMoZnVuY3Rpb24gb3ZlcihsZW5zLCBmLCB4KSB7XG4gIC8vIFRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgZ2V0dGVyIGZ1bmN0aW9uIGlzIGZpcnN0IHRyYW5zZm9ybWVkIHdpdGggYGZgLFxuICAvLyB0aGVuIHNldCBhcyB0aGUgdmFsdWUgb2YgYW4gYElkZW50aXR5YC4gVGhpcyBpcyB0aGVuIG1hcHBlZCBvdmVyIHdpdGggdGhlXG4gIC8vIHNldHRlciBmdW5jdGlvbiBvZiB0aGUgbGVucy5cbiAgcmV0dXJuIGxlbnMoZnVuY3Rpb24gKHkpIHtcbiAgICByZXR1cm4gSWRlbnRpdHkoZih5KSk7XG4gIH0pKHgpLnZhbHVlO1xufSk7XG5leHBvcnQgZGVmYXVsdCBvdmVyOyIsImltcG9ydCBmaWx0ZXIgZnJvbSBcIi4vZmlsdGVyLmpzXCI7XG5pbXBvcnQganV4dCBmcm9tIFwiLi9qdXh0LmpzXCI7XG5pbXBvcnQgcmVqZWN0IGZyb20gXCIuL3JlamVjdC5qc1wiO1xuXG4vKipcbiAqIFRha2VzIGEgcHJlZGljYXRlIGFuZCBhIGxpc3Qgb3Igb3RoZXIgYEZpbHRlcmFibGVgIG9iamVjdCBhbmQgcmV0dXJucyB0aGVcbiAqIHBhaXIgb2YgZmlsdGVyYWJsZSBvYmplY3RzIG9mIHRoZSBzYW1lIHR5cGUgb2YgZWxlbWVudHMgd2hpY2ggZG8gYW5kIGRvIG5vdFxuICogc2F0aXNmeSwgdGhlIHByZWRpY2F0ZSwgcmVzcGVjdGl2ZWx5LiBGaWx0ZXJhYmxlIG9iamVjdHMgaW5jbHVkZSBwbGFpbiBvYmplY3RzIG9yIGFueSBvYmplY3RcbiAqIHRoYXQgaGFzIGEgZmlsdGVyIG1ldGhvZCBzdWNoIGFzIGBBcnJheWAuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS40XG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBGaWx0ZXJhYmxlIGYgPT4gKGEgLT4gQm9vbGVhbikgLT4gZiBhIC0+IFtmIGEsIGYgYV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWQgQSBwcmVkaWNhdGUgdG8gZGV0ZXJtaW5lIHdoaWNoIHNpZGUgdGhlIGVsZW1lbnQgYmVsb25ncyB0by5cbiAqIEBwYXJhbSB7QXJyYXl9IGZpbHRlcmFibGUgdGhlIGxpc3QgKG9yIG90aGVyIGZpbHRlcmFibGUpIHRvIHBhcnRpdGlvbi5cbiAqIEByZXR1cm4ge0FycmF5fSBBbiBhcnJheSwgY29udGFpbmluZyBmaXJzdCB0aGUgc3Vic2V0IG9mIGVsZW1lbnRzIHRoYXQgc2F0aXNmeSB0aGVcbiAqICAgICAgICAgcHJlZGljYXRlLCBhbmQgc2Vjb25kIHRoZSBzdWJzZXQgb2YgZWxlbWVudHMgdGhhdCBkbyBub3Qgc2F0aXNmeS5cbiAqIEBzZWUgUi5maWx0ZXIsIFIucmVqZWN0XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5wYXJ0aXRpb24oUi5pbmNsdWRlcygncycpLCBbJ3NzcycsICd0dHQnLCAnZm9vJywgJ2JhcnMnXSk7XG4gKiAgICAgIC8vID0+IFsgWyAnc3NzJywgJ2JhcnMnIF0sICBbICd0dHQnLCAnZm9vJyBdIF1cbiAqXG4gKiAgICAgIFIucGFydGl0aW9uKFIuaW5jbHVkZXMoJ3MnKSwgeyBhOiAnc3NzJywgYjogJ3R0dCcsIGZvbzogJ2JhcnMnIH0pO1xuICogICAgICAvLyA9PiBbIHsgYTogJ3NzcycsIGZvbzogJ2JhcnMnIH0sIHsgYjogJ3R0dCcgfSAgXVxuICovXG52YXIgcGFydGl0aW9uID0gLyojX19QVVJFX18qL2p1eHQoW2ZpbHRlciwgcmVqZWN0XSk7XG5leHBvcnQgZGVmYXVsdCBwYXJ0aXRpb247IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9wYXRoIGZyb20gXCIuL2ludGVybmFsL19wYXRoLmpzXCI7XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSB2YWx1ZSBhdCBhIGdpdmVuIHBhdGguIFRoZSBub2RlcyBvZiB0aGUgcGF0aCBjYW4gYmUgYXJiaXRyYXJ5IHN0cmluZ3Mgb3Igbm9uLW5lZ2F0aXZlIGludGVnZXJzLlxuICogRm9yIGFueXRoaW5nIGVsc2UsIHRoZSB2YWx1ZSBpcyB1bnNwZWNpZmllZC4gSW50ZWdlciBwYXRocyBhcmUgbWVhbnQgdG8gaW5kZXggYXJyYXlzLCBzdHJpbmdzIGFyZSBtZWFudCBmb3Igb2JqZWN0cy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4yLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEB0eXBlZGVmbiBJZHggPSBTdHJpbmcgfCBJbnQgfCBTeW1ib2xcbiAqIEBzaWcgW0lkeF0gLT4ge2F9IC0+IGEgfCBVbmRlZmluZWRcbiAqIEBzaWcgSWR4ID0gU3RyaW5nIHwgTm9uTmVnYXRpdmVJbnRcbiAqIEBwYXJhbSB7QXJyYXl9IHBhdGggVGhlIHBhdGggdG8gdXNlLlxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IG9yIGFycmF5IHRvIHJldHJpZXZlIHRoZSBuZXN0ZWQgcHJvcGVydHkgZnJvbS5cbiAqIEByZXR1cm4geyp9IFRoZSBkYXRhIGF0IGBwYXRoYC5cbiAqIEBzZWUgUi5wcm9wLCBSLm50aCwgUi5hc3NvY1BhdGgsIFIuZGlzc29jUGF0aFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIucGF0aChbJ2EnLCAnYiddLCB7YToge2I6IDJ9fSk7IC8vPT4gMlxuICogICAgICBSLnBhdGgoWydhJywgJ2InXSwge2M6IHtiOiAyfX0pOyAvLz0+IHVuZGVmaW5lZFxuICogICAgICBSLnBhdGgoWydhJywgJ2InLCAwXSwge2E6IHtiOiBbMSwgMiwgM119fSk7IC8vPT4gMVxuICogICAgICBSLnBhdGgoWydhJywgJ2InLCAtMl0sIHthOiB7YjogWzEsIDIsIDNdfX0pOyAvLz0+IDJcbiAqICAgICAgUi5wYXRoKFsyXSwgeycyJzogMn0pOyAvLz0+IDJcbiAqICAgICAgUi5wYXRoKFstMl0sIHsnLTInOiAnYSd9KTsgLy89PiB1bmRlZmluZWRcbiAqL1xuXG52YXIgcGF0aCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKF9wYXRoKTtcbmV4cG9ydCBkZWZhdWx0IHBhdGg7IiwiaW1wb3J0IF9jdXJyeTMgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5My5qc1wiO1xuaW1wb3J0IF9wYXRoIGZyb20gXCIuL2ludGVybmFsL19wYXRoLmpzXCI7XG5pbXBvcnQgZGVmYXVsdFRvIGZyb20gXCIuL2RlZmF1bHRUby5qc1wiO1xuXG4vKipcbiAqIElmIHRoZSBnaXZlbiwgbm9uLW51bGwgb2JqZWN0IGhhcyBhIHZhbHVlIGF0IHRoZSBnaXZlbiBwYXRoLCByZXR1cm5zIHRoZVxuICogdmFsdWUgYXQgdGhhdCBwYXRoLiBPdGhlcndpc2UgcmV0dXJucyB0aGUgcHJvdmlkZWQgZGVmYXVsdCB2YWx1ZS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xOC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAdHlwZWRlZm4gSWR4ID0gU3RyaW5nIHwgSW50IHwgU3ltYm9sXG4gKiBAc2lnIGEgLT4gW0lkeF0gLT4ge2F9IC0+IGFcbiAqIEBwYXJhbSB7Kn0gZCBUaGUgZGVmYXVsdCB2YWx1ZS5cbiAqIEBwYXJhbSB7QXJyYXl9IHAgVGhlIHBhdGggdG8gdXNlLlxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIHJldHJpZXZlIHRoZSBuZXN0ZWQgcHJvcGVydHkgZnJvbS5cbiAqIEByZXR1cm4geyp9IFRoZSBkYXRhIGF0IGBwYXRoYCBvZiB0aGUgc3VwcGxpZWQgb2JqZWN0IG9yIHRoZSBkZWZhdWx0IHZhbHVlLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIucGF0aE9yKCdOL0EnLCBbJ2EnLCAnYiddLCB7YToge2I6IDJ9fSk7IC8vPT4gMlxuICogICAgICBSLnBhdGhPcignTi9BJywgWydhJywgJ2InXSwge2M6IHtiOiAyfX0pOyAvLz0+IFwiTi9BXCJcbiAqL1xudmFyIHBhdGhPciA9IC8qI19fUFVSRV9fKi9fY3VycnkzKGZ1bmN0aW9uIHBhdGhPcihkLCBwLCBvYmopIHtcbiAgcmV0dXJuIGRlZmF1bHRUbyhkLCBfcGF0aChwLCBvYmopKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgcGF0aE9yOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgcGFydGlhbCBjb3B5IG9mIGFuIG9iamVjdCBjb250YWluaW5nIG9ubHkgdGhlIGtleXMgc3BlY2lmaWVkLiBJZlxuICogdGhlIGtleSBkb2VzIG5vdCBleGlzdCwgdGhlIHByb3BlcnR5IGlzIGlnbm9yZWQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnIFtrXSAtPiB7azogdn0gLT4ge2s6IHZ9XG4gKiBAcGFyYW0ge0FycmF5fSBuYW1lcyBhbiBhcnJheSBvZiBTdHJpbmcgcHJvcGVydHkgbmFtZXMgdG8gY29weSBvbnRvIGEgbmV3IG9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIGNvcHkgZnJvbVxuICogQHJldHVybiB7T2JqZWN0fSBBIG5ldyBvYmplY3Qgd2l0aCBvbmx5IHByb3BlcnRpZXMgZnJvbSBgbmFtZXNgIG9uIGl0LlxuICogQHNlZSBSLm9taXQsIFIucHJvcHNcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnBpY2soWydhJywgJ2QnXSwge2E6IDEsIGI6IDIsIGM6IDMsIGQ6IDR9KTsgLy89PiB7YTogMSwgZDogNH1cbiAqICAgICAgUi5waWNrKFsnYScsICdlJywgJ2YnXSwge2E6IDEsIGI6IDIsIGM6IDMsIGQ6IDR9KTsgLy89PiB7YTogMX1cbiAqL1xudmFyIHBpY2sgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiBwaWNrKG5hbWVzLCBvYmopIHtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICB2YXIgaWR4ID0gMDtcbiAgd2hpbGUgKGlkeCA8IG5hbWVzLmxlbmd0aCkge1xuICAgIGlmIChuYW1lc1tpZHhdIGluIG9iaikge1xuICAgICAgcmVzdWx0W25hbWVzW2lkeF1dID0gb2JqW25hbWVzW2lkeF1dO1xuICAgIH1cbiAgICBpZHggKz0gMTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufSk7XG5leHBvcnQgZGVmYXVsdCBwaWNrOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgcGFydGlhbCBjb3B5IG9mIGFuIG9iamVjdCBjb250YWluaW5nIG9ubHkgdGhlIGtleXMgdGhhdCBzYXRpc2Z5XG4gKiB0aGUgc3VwcGxpZWQgcHJlZGljYXRlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjguMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyAoKHYsIGspIC0+IEJvb2xlYW4pIC0+IHtrOiB2fSAtPiB7azogdn1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWQgQSBwcmVkaWNhdGUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IGEga2V5XG4gKiAgICAgICAgc2hvdWxkIGJlIGluY2x1ZGVkIG9uIHRoZSBvdXRwdXQgb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIGNvcHkgZnJvbVxuICogQHJldHVybiB7T2JqZWN0fSBBIG5ldyBvYmplY3Qgd2l0aCBvbmx5IHByb3BlcnRpZXMgdGhhdCBzYXRpc2Z5IGBwcmVkYFxuICogICAgICAgICBvbiBpdC5cbiAqIEBzZWUgUi5waWNrLCBSLmZpbHRlclxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IGlzVXBwZXJDYXNlID0gKHZhbCwga2V5KSA9PiBrZXkudG9VcHBlckNhc2UoKSA9PT0ga2V5O1xuICogICAgICBSLnBpY2tCeShpc1VwcGVyQ2FzZSwge2E6IDEsIGI6IDIsIEE6IDMsIEI6IDR9KTsgLy89PiB7QTogMywgQjogNH1cbiAqL1xudmFyIHBpY2tCeSA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIHBpY2tCeSh0ZXN0LCBvYmopIHtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICBmb3IgKHZhciBwcm9wIGluIG9iaikge1xuICAgIGlmICh0ZXN0KG9ialtwcm9wXSwgcHJvcCwgb2JqKSkge1xuICAgICAgcmVzdWx0W3Byb3BdID0gb2JqW3Byb3BdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufSk7XG5leHBvcnQgZGVmYXVsdCBwaWNrQnk7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IG1hcCBmcm9tIFwiLi9tYXAuanNcIjtcbmltcG9ydCBwcm9wIGZyb20gXCIuL3Byb3AuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IGxpc3QgYnkgcGx1Y2tpbmcgdGhlIHNhbWUgbmFtZWQgcHJvcGVydHkgb2ZmIGFsbCBvYmplY3RzIGluXG4gKiB0aGUgbGlzdCBzdXBwbGllZC5cbiAqXG4gKiBgcGx1Y2tgIHdpbGwgd29yayBvblxuICogYW55IFtmdW5jdG9yXShodHRwczovL2dpdGh1Yi5jb20vZmFudGFzeWxhbmQvZmFudGFzeS1sYW5kI2Z1bmN0b3IpIGluXG4gKiBhZGRpdGlvbiB0byBhcnJheXMsIGFzIGl0IGlzIGVxdWl2YWxlbnQgdG8gYFIubWFwKFIucHJvcChrKSwgZilgLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgRnVuY3RvciBmID0+IGsgLT4gZiB7azogdn0gLT4gZiB2XG4gKiBAcGFyYW0ge051bWJlcnxTdHJpbmd9IGtleSBUaGUga2V5IG5hbWUgdG8gcGx1Y2sgb2ZmIG9mIGVhY2ggb2JqZWN0LlxuICogQHBhcmFtIHtBcnJheX0gZiBUaGUgYXJyYXkgb3IgZnVuY3RvciB0byBjb25zaWRlci5cbiAqIEByZXR1cm4ge0FycmF5fSBUaGUgbGlzdCBvZiB2YWx1ZXMgZm9yIHRoZSBnaXZlbiBrZXkuXG4gKiBAc2VlIFIucHJvamVjdCwgUi5wcm9wLCBSLnByb3BzXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgdmFyIGdldEFnZXMgPSBSLnBsdWNrKCdhZ2UnKTtcbiAqICAgICAgZ2V0QWdlcyhbe25hbWU6ICdmcmVkJywgYWdlOiAyOX0sIHtuYW1lOiAnd2lsbWEnLCBhZ2U6IDI3fV0pOyAvLz0+IFsyOSwgMjddXG4gKlxuICogICAgICBSLnBsdWNrKDAsIFtbMSwgMl0sIFszLCA0XV0pOyAgICAgICAgICAgICAgIC8vPT4gWzEsIDNdXG4gKiAgICAgIFIucGx1Y2soJ3ZhbCcsIHthOiB7dmFsOiAzfSwgYjoge3ZhbDogNX19KTsgLy89PiB7YTogMywgYjogNX1cbiAqIEBzeW1iIFIucGx1Y2soJ3gnLCBbe3g6IDEsIHk6IDJ9LCB7eDogMywgeTogNH0sIHt4OiA1LCB5OiA2fV0pID0gWzEsIDMsIDVdXG4gKiBAc3ltYiBSLnBsdWNrKDAsIFtbMSwgMl0sIFszLCA0XSwgWzUsIDZdXSkgPSBbMSwgMywgNV1cbiAqL1xudmFyIHBsdWNrID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gcGx1Y2socCwgbGlzdCkge1xuICByZXR1cm4gbWFwKHByb3AocCksIGxpc3QpO1xufSk7XG5leHBvcnQgZGVmYXVsdCBwbHVjazsiLCJpbXBvcnQgX2NvbmNhdCBmcm9tIFwiLi9pbnRlcm5hbC9fY29uY2F0LmpzXCI7XG5pbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyBhIG5ldyBsaXN0IHdpdGggdGhlIGdpdmVuIGVsZW1lbnQgYXQgdGhlIGZyb250LCBmb2xsb3dlZCBieSB0aGVcbiAqIGNvbnRlbnRzIG9mIHRoZSBsaXN0LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgYSAtPiBbYV0gLT4gW2FdXG4gKiBAcGFyYW0geyp9IGVsIFRoZSBpdGVtIHRvIGFkZCB0byB0aGUgaGVhZCBvZiB0aGUgb3V0cHV0IGxpc3QuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBhcnJheSB0byBhZGQgdG8gdGhlIHRhaWwgb2YgdGhlIG91dHB1dCBsaXN0LlxuICogQHJldHVybiB7QXJyYXl9IEEgbmV3IGFycmF5LlxuICogQHNlZSBSLmFwcGVuZFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIucHJlcGVuZCgnZmVlJywgWydmaScsICdmbycsICdmdW0nXSk7IC8vPT4gWydmZWUnLCAnZmknLCAnZm8nLCAnZnVtJ11cbiAqL1xudmFyIHByZXBlbmQgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiBwcmVwZW5kKGVsLCBsaXN0KSB7XG4gIHJldHVybiBfY29uY2F0KFtlbF0sIGxpc3QpO1xufSk7XG5leHBvcnQgZGVmYXVsdCBwcmVwZW5kOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfaXNJbnRlZ2VyIGZyb20gXCIuL2ludGVybmFsL19pc0ludGVnZXIuanNcIjtcbmltcG9ydCBfbnRoIGZyb20gXCIuL2ludGVybmFsL19udGguanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCB3aGVuIHN1cHBsaWVkIGFuIG9iamVjdCByZXR1cm5zIHRoZSBpbmRpY2F0ZWRcbiAqIHByb3BlcnR5IG9mIHRoYXQgb2JqZWN0LCBpZiBpdCBleGlzdHMuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAdHlwZWRlZm4gSWR4ID0gU3RyaW5nIHwgSW50IHwgU3ltYm9sXG4gKiBAc2lnIElkeCAtPiB7czogYX0gLT4gYSB8IFVuZGVmaW5lZFxuICogQHBhcmFtIHtTdHJpbmd8TnVtYmVyfSBwIFRoZSBwcm9wZXJ0eSBuYW1lIG9yIGFycmF5IGluZGV4XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gcXVlcnlcbiAqIEByZXR1cm4geyp9IFRoZSB2YWx1ZSBhdCBgb2JqLnBgLlxuICogQHNlZSBSLnBhdGgsIFIucHJvcHMsIFIucGx1Y2ssIFIucHJvamVjdCwgUi5udGhcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnByb3AoJ3gnLCB7eDogMTAwfSk7IC8vPT4gMTAwXG4gKiAgICAgIFIucHJvcCgneCcsIHt9KTsgLy89PiB1bmRlZmluZWRcbiAqICAgICAgUi5wcm9wKDAsIFsxMDBdKTsgLy89PiAxMDBcbiAqICAgICAgUi5jb21wb3NlKFIuaW5jLCBSLnByb3AoJ3gnKSkoeyB4OiAzIH0pIC8vPT4gNFxuICovXG5cbnZhciBwcm9wID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gcHJvcChwLCBvYmopIHtcbiAgaWYgKG9iaiA9PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHJldHVybiBfaXNJbnRlZ2VyKHApID8gX250aChwLCBvYmopIDogb2JqW3BdO1xufSk7XG5leHBvcnQgZGVmYXVsdCBwcm9wOyIsImltcG9ydCBfY3VycnkzIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTMuanNcIjtcbmltcG9ydCBwcm9wIGZyb20gXCIuL3Byb3AuanNcIjtcbmltcG9ydCBlcXVhbHMgZnJvbSBcIi4vZXF1YWxzLmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHNwZWNpZmllZCBvYmplY3QgcHJvcGVydHkgaXMgZXF1YWwsIGluXG4gKiBbYFIuZXF1YWxzYF0oI2VxdWFscykgdGVybXMsIHRvIHRoZSBnaXZlbiB2YWx1ZTsgYGZhbHNlYCBvdGhlcndpc2UuXG4gKiBZb3UgY2FuIHRlc3QgbXVsdGlwbGUgcHJvcGVydGllcyB3aXRoIFtgUi53aGVyZUVxYF0oI3doZXJlRXEpLFxuICogYW5kIHRlc3QgbmVzdGVkIHBhdGggcHJvcGVydHkgd2l0aCBbYFIucGF0aEVxYF0oI3BhdGhFcSkuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgUmVsYXRpb25cbiAqIEBzaWcgYSAtPiBTdHJpbmcgLT4gT2JqZWN0IC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byBjb21wYXJlIHRoZSBwcm9wZXJ0eSB3aXRoXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgc3BlY2lmaWVkIG9iamVjdCBwcm9wZXJ0eSdzIGtleVxuICogQHBhcmFtIHsqfSBvYmogVGhlIG9iamVjdCB0byBjaGVjayB0aGUgcHJvcGVydHkgaW5cbiAqIEByZXR1cm4ge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgdmFsdWUgZXF1YWxzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHByb3BlcnR5LFxuICogICAgICAgICBgZmFsc2VgIG90aGVyd2lzZS5cbiAqIEBzZWUgUi53aGVyZUVxLCBSLnBhdGhFcSwgUi5wcm9wU2F0aXNmaWVzLCBSLmVxdWFsc1xuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IGFiYnkgPSB7bmFtZTogJ0FiYnknLCBhZ2U6IDcsIGhhaXI6ICdibG9uZCd9O1xuICogICAgICBjb25zdCBmcmVkID0ge25hbWU6ICdGcmVkJywgYWdlOiAxMiwgaGFpcjogJ2Jyb3duJ307XG4gKiAgICAgIGNvbnN0IHJ1c3R5ID0ge25hbWU6ICdSdXN0eScsIGFnZTogMTAsIGhhaXI6ICdicm93bid9O1xuICogICAgICBjb25zdCBhbG9pcyA9IHtuYW1lOiAnQWxvaXMnLCBhZ2U6IDE1LCBkaXNwb3NpdGlvbjogJ3N1cmx5J307XG4gKiAgICAgIGNvbnN0IGtpZHMgPSBbYWJieSwgZnJlZCwgcnVzdHksIGFsb2lzXTtcbiAqICAgICAgY29uc3QgaGFzQnJvd25IYWlyID0gUi5wcm9wRXEoJ2Jyb3duJywgJ2hhaXInKTtcbiAqICAgICAgUi5maWx0ZXIoaGFzQnJvd25IYWlyLCBraWRzKTsgLy89PiBbZnJlZCwgcnVzdHldXG4gKi9cbnZhciBwcm9wRXEgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MyhmdW5jdGlvbiBwcm9wRXEodmFsLCBuYW1lLCBvYmopIHtcbiAgcmV0dXJuIGVxdWFscyh2YWwsIHByb3AobmFtZSwgb2JqKSk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IHByb3BFcTsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgcHJvcCBmcm9tIFwiLi9wcm9wLmpzXCI7XG5cbi8qKlxuICogQWN0cyBhcyBtdWx0aXBsZSBgcHJvcGA6IGFycmF5IG9mIGtleXMgaW4sIGFycmF5IG9mIHZhbHVlcyBvdXQuIFByZXNlcnZlc1xuICogb3JkZXIuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnIFtrXSAtPiB7azogdn0gLT4gW3ZdXG4gKiBAcGFyYW0ge0FycmF5fSBwcyBUaGUgcHJvcGVydHkgbmFtZXMgdG8gZmV0Y2hcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBxdWVyeVxuICogQHJldHVybiB7QXJyYXl9IFRoZSBjb3JyZXNwb25kaW5nIHZhbHVlcyBvciBwYXJ0aWFsbHkgYXBwbGllZCBmdW5jdGlvbi5cbiAqIEBzZWUgUi5wcm9wLCBSLnBsdWNrLCBSLnByb2plY3RcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnByb3BzKFsneCcsICd5J10sIHt4OiAxLCB5OiAyfSk7IC8vPT4gWzEsIDJdXG4gKiAgICAgIFIucHJvcHMoWydjJywgJ2EnLCAnYiddLCB7YjogMiwgYTogMX0pOyAvLz0+IFt1bmRlZmluZWQsIDEsIDJdXG4gKlxuICogICAgICBjb25zdCBmdWxsTmFtZSA9IFIuY29tcG9zZShSLmpvaW4oJyAnKSwgUi5wcm9wcyhbJ2ZpcnN0JywgJ2xhc3QnXSkpO1xuICogICAgICBmdWxsTmFtZSh7bGFzdDogJ0J1bGxldC1Ub290aCcsIGFnZTogMzMsIGZpcnN0OiAnVG9ueSd9KTsgLy89PiAnVG9ueSBCdWxsZXQtVG9vdGgnXG4gKi9cbnZhciBwcm9wcyA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIHByb3BzKHBzLCBvYmopIHtcbiAgcmV0dXJuIHBzLm1hcChmdW5jdGlvbiAocCkge1xuICAgIHJldHVybiBwcm9wKHAsIG9iaik7XG4gIH0pO1xufSk7XG5leHBvcnQgZGVmYXVsdCBwcm9wczsiLCJpbXBvcnQgX2N1cnJ5MyBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkzLmpzXCI7XG5pbXBvcnQgX3hSZWR1Y2UgZnJvbSBcIi4vaW50ZXJuYWwvX3hSZWR1Y2UuanNcIjtcbmltcG9ydCBfeHdyYXAgZnJvbSBcIi4vaW50ZXJuYWwvX3h3cmFwLmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyBhIHNpbmdsZSBpdGVtIGJ5IGl0ZXJhdGluZyB0aHJvdWdoIHRoZSBsaXN0LCBzdWNjZXNzaXZlbHkgY2FsbGluZ1xuICogdGhlIGl0ZXJhdG9yIGZ1bmN0aW9uIGFuZCBwYXNzaW5nIGl0IGFuIGFjY3VtdWxhdG9yIHZhbHVlIGFuZCB0aGUgY3VycmVudFxuICogdmFsdWUgZnJvbSB0aGUgYXJyYXksIGFuZCB0aGVuIHBhc3NpbmcgdGhlIHJlc3VsdCB0byB0aGUgbmV4dCBjYWxsLlxuICpcbiAqIFRoZSBpdGVyYXRvciBmdW5jdGlvbiByZWNlaXZlcyB0d28gdmFsdWVzOiAqKGFjYywgdmFsdWUpKi4gSXQgbWF5IHVzZVxuICogW2BSLnJlZHVjZWRgXSgjcmVkdWNlZCkgdG8gc2hvcnRjdXQgdGhlIGl0ZXJhdGlvbi5cbiAqXG4gKiBUaGUgYXJndW1lbnRzJyBvcmRlciBvZiBbYHJlZHVjZVJpZ2h0YF0oI3JlZHVjZVJpZ2h0KSdzIGl0ZXJhdG9yIGZ1bmN0aW9uXG4gKiBpcyAqKHZhbHVlLCBhY2MpKi5cbiAqXG4gKiBOb3RlOiBgUi5yZWR1Y2VgIGRvZXMgbm90IHNraXAgZGVsZXRlZCBvciB1bmFzc2lnbmVkIGluZGljZXMgKHNwYXJzZVxuICogYXJyYXlzKSwgdW5saWtlIHRoZSBuYXRpdmUgYEFycmF5LnByb3RvdHlwZS5yZWR1Y2VgIG1ldGhvZC4gRm9yIG1vcmUgZGV0YWlsc1xuICogb24gdGhpcyBiZWhhdmlvciwgc2VlOlxuICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvcmVkdWNlI0Rlc2NyaXB0aW9uXG4gKlxuICogQmUgY2F1dGlvdXMgb2YgbXV0YXRpbmcgYW5kIHJldHVybmluZyB0aGUgYWNjdW11bGF0b3IuIElmIHlvdSByZXVzZSBpdCBhY3Jvc3NcbiAqIGludm9jYXRpb25zLCBpdCB3aWxsIGNvbnRpbnVlIHRvIGFjY3VtdWxhdGUgb250byB0aGUgc2FtZSB2YWx1ZS4gVGhlIGdlbmVyYWxcbiAqIHJlY29tbWVuZGF0aW9uIGlzIHRvIGFsd2F5cyByZXR1cm4gYSBuZXcgdmFsdWUuIElmIHlvdSBjYW4ndCBkbyBzbyBmb3JcbiAqIHBlcmZvcm1hbmNlIHJlYXNvbnMsIHRoZW4gYmUgc3VyZSB0byByZWluaXRpYWxpemUgdGhlIGFjY3VtdWxhdG9yIG9uIGVhY2hcbiAqIGludm9jYXRpb24uXG4gKlxuICogRGlzcGF0Y2hlcyB0byB0aGUgYHJlZHVjZWAgbWV0aG9kIG9mIHRoZSB0aGlyZCBhcmd1bWVudCwgaWYgcHJlc2VudC4gV2hlblxuICogZG9pbmcgc28sIGl0IGlzIHVwIHRvIHRoZSB1c2VyIHRvIGhhbmRsZSB0aGUgW2BSLnJlZHVjZWRgXSgjcmVkdWNlZClcbiAqIHNob3J0Y3V0aW5nLCBhcyB0aGlzIGlzIG5vdCBpbXBsZW1lbnRlZCBieSBgcmVkdWNlYC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnICgoYSwgYikgLT4gYSkgLT4gYSAtPiBbYl0gLT4gYVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGl0ZXJhdG9yIGZ1bmN0aW9uLiBSZWNlaXZlcyB0d28gdmFsdWVzLCB0aGUgYWNjdW11bGF0b3IgYW5kIHRoZVxuICogICAgICAgIGN1cnJlbnQgZWxlbWVudCBmcm9tIHRoZSBhcnJheS5cbiAqIEBwYXJhbSB7Kn0gYWNjIFRoZSBhY2N1bXVsYXRvciB2YWx1ZS5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGxpc3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHJldHVybiB7Kn0gVGhlIGZpbmFsLCBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAqIEBzZWUgUi5yZWR1Y2VkLCBSLmFkZEluZGV4LCBSLnJlZHVjZVJpZ2h0XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5yZWR1Y2UoUi5zdWJ0cmFjdCwgMCwgWzEsIDIsIDMsIDRdKSAvLyA9PiAoKCgoMCAtIDEpIC0gMikgLSAzKSAtIDQpID0gLTEwXG4gKiAgICAgIC8vICAgICAgICAgIC0gICAgICAgICAgICAgICAtMTBcbiAqICAgICAgLy8gICAgICAgICAvIFxcICAgICAgICAgICAgICAvIFxcXG4gKiAgICAgIC8vICAgICAgICAtICAgNCAgICAgICAgICAgLTYgICA0XG4gKiAgICAgIC8vICAgICAgIC8gXFwgICAgICAgICAgICAgIC8gXFxcbiAqICAgICAgLy8gICAgICAtICAgMyAgID09PiAgICAgLTMgICAzXG4gKiAgICAgIC8vICAgICAvIFxcICAgICAgICAgICAgICAvIFxcXG4gKiAgICAgIC8vICAgIC0gICAyICAgICAgICAgICAtMSAgIDJcbiAqICAgICAgLy8gICAvIFxcICAgICAgICAgICAgICAvIFxcXG4gKiAgICAgIC8vICAwICAgMSAgICAgICAgICAgIDAgICAxXG4gKlxuICogQHN5bWIgUi5yZWR1Y2UoZiwgYSwgW2IsIGMsIGRdKSA9IGYoZihmKGEsIGIpLCBjKSwgZClcbiAqL1xudmFyIHJlZHVjZSA9IC8qI19fUFVSRV9fKi9fY3VycnkzKGZ1bmN0aW9uICh4ZiwgYWNjLCBsaXN0KSB7XG4gIHJldHVybiBfeFJlZHVjZSh0eXBlb2YgeGYgPT09ICdmdW5jdGlvbicgPyBfeHdyYXAoeGYpIDogeGYsIGFjYywgbGlzdCk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IHJlZHVjZTsiLCJpbXBvcnQgX2Nsb25lIGZyb20gXCIuL2ludGVybmFsL19jbG9uZS5qc1wiO1xuaW1wb3J0IF9jdXJyeU4gZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Ti5qc1wiO1xuaW1wb3J0IF9kaXNwYXRjaGFibGUgZnJvbSBcIi4vaW50ZXJuYWwvX2Rpc3BhdGNoYWJsZS5qc1wiO1xuaW1wb3J0IF9oYXMgZnJvbSBcIi4vaW50ZXJuYWwvX2hhcy5qc1wiO1xuaW1wb3J0IF9yZWR1Y2VkIGZyb20gXCIuL2ludGVybmFsL19yZWR1Y2VkLmpzXCI7XG5pbXBvcnQgX3hSZWR1Y2UgZnJvbSBcIi4vaW50ZXJuYWwvX3hSZWR1Y2UuanNcIjtcbmltcG9ydCBfeHJlZHVjZUJ5IGZyb20gXCIuL2ludGVybmFsL194cmVkdWNlQnkuanNcIjtcbmltcG9ydCBfeHdyYXAgZnJvbSBcIi4vaW50ZXJuYWwvX3h3cmFwLmpzXCI7XG5cbi8qKlxuICogR3JvdXBzIHRoZSBlbGVtZW50cyBvZiB0aGUgbGlzdCBhY2NvcmRpbmcgdG8gdGhlIHJlc3VsdCBvZiBjYWxsaW5nXG4gKiB0aGUgU3RyaW5nLXJldHVybmluZyBmdW5jdGlvbiBga2V5Rm5gIG9uIGVhY2ggZWxlbWVudCBhbmQgcmVkdWNlcyB0aGUgZWxlbWVudHNcbiAqIG9mIGVhY2ggZ3JvdXAgdG8gYSBzaW5nbGUgdmFsdWUgdmlhIHRoZSByZWR1Y2VyIGZ1bmN0aW9uIGB2YWx1ZUZuYC5cbiAqXG4gKiBUaGUgdmFsdWUgZnVuY3Rpb24gcmVjZWl2ZXMgdHdvIHZhbHVlczogKihhY2MsIHZhbHVlKSouIEl0IG1heSB1c2VcbiAqIFtgUi5yZWR1Y2VkYF0oI3JlZHVjZWQpIHRvIHNob3J0IGNpcmN1aXQgdGhlIGl0ZXJhdGlvbi5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGJhc2ljYWxseSBhIG1vcmUgZ2VuZXJhbCBbYGdyb3VwQnlgXSgjZ3JvdXBCeSkgZnVuY3Rpb24uXG4gKlxuICogQWN0cyBhcyBhIHRyYW5zZHVjZXIgaWYgYSB0cmFuc2Zvcm1lciBpcyBnaXZlbiBpbiBsaXN0IHBvc2l0aW9uLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjIwLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnICgoYSwgYikgLT4gYSkgLT4gYSAtPiAoYiAtPiBTdHJpbmcpIC0+IFtiXSAtPiB7U3RyaW5nOiBhfVxuICogQHBhcmFtIHtGdW5jdGlvbn0gdmFsdWVGbiBUaGUgZnVuY3Rpb24gdGhhdCByZWR1Y2VzIHRoZSBlbGVtZW50cyBvZiBlYWNoIGdyb3VwIHRvIGEgc2luZ2xlXG4gKiAgICAgICAgdmFsdWUuIFJlY2VpdmVzIHR3byB2YWx1ZXMsIGFjY3VtdWxhdG9yIGZvciBhIHBhcnRpY3VsYXIgZ3JvdXAgYW5kIHRoZSBjdXJyZW50IGVsZW1lbnQuXG4gKiBAcGFyYW0geyp9IGFjYyBUaGUgKGluaXRpYWwpIGFjY3VtdWxhdG9yIHZhbHVlIGZvciBlYWNoIGdyb3VwLlxuICogQHBhcmFtIHtGdW5jdGlvbn0ga2V5Rm4gVGhlIGZ1bmN0aW9uIHRoYXQgbWFwcyB0aGUgbGlzdCdzIGVsZW1lbnQgaW50byBhIGtleS5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGFycmF5IHRvIGdyb3VwLlxuICogQHJldHVybiB7T2JqZWN0fSBBbiBvYmplY3Qgd2l0aCB0aGUgb3V0cHV0IG9mIGBrZXlGbmAgZm9yIGtleXMsIG1hcHBlZCB0byB0aGUgb3V0cHV0IG9mXG4gKiAgICAgICAgIGB2YWx1ZUZuYCBmb3IgZWxlbWVudHMgd2hpY2ggcHJvZHVjZWQgdGhhdCBrZXkgd2hlbiBwYXNzZWQgdG8gYGtleUZuYC5cbiAqIEBzZWUgUi5ncm91cEJ5LCBSLnJlZHVjZSwgUi5yZWR1Y2VkXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgZ3JvdXBOYW1lcyA9IChhY2MsIHtuYW1lfSkgPT4gYWNjLmNvbmNhdChuYW1lKVxuICogICAgICBjb25zdCB0b0dyYWRlID0gKHtzY29yZX0pID0+XG4gKiAgICAgICAgc2NvcmUgPCA2NSA/ICdGJyA6XG4gKiAgICAgICAgc2NvcmUgPCA3MCA/ICdEJyA6XG4gKiAgICAgICAgc2NvcmUgPCA4MCA/ICdDJyA6XG4gKiAgICAgICAgc2NvcmUgPCA5MCA/ICdCJyA6ICdBJ1xuICpcbiAqICAgICAgdmFyIHN0dWRlbnRzID0gW1xuICogICAgICAgIHtuYW1lOiAnQWJieScsIHNjb3JlOiA4M30sXG4gKiAgICAgICAge25hbWU6ICdCYXJ0Jywgc2NvcmU6IDYyfSxcbiAqICAgICAgICB7bmFtZTogJ0N1cnQnLCBzY29yZTogODh9LFxuICogICAgICAgIHtuYW1lOiAnRG9yYScsIHNjb3JlOiA5Mn0sXG4gKiAgICAgIF1cbiAqXG4gKiAgICAgIHJlZHVjZUJ5KGdyb3VwTmFtZXMsIFtdLCB0b0dyYWRlLCBzdHVkZW50cylcbiAqICAgICAgLy89PiB7XCJBXCI6IFtcIkRvcmFcIl0sIFwiQlwiOiBbXCJBYmJ5XCIsIFwiQ3VydFwiXSwgXCJGXCI6IFtcIkJhcnRcIl19XG4gKi9cbnZhciByZWR1Y2VCeSA9IC8qI19fUFVSRV9fKi9fY3VycnlOKDQsIFtdLCAvKiNfX1BVUkVfXyovX2Rpc3BhdGNoYWJsZShbXSwgX3hyZWR1Y2VCeSwgZnVuY3Rpb24gcmVkdWNlQnkodmFsdWVGbiwgdmFsdWVBY2MsIGtleUZuLCBsaXN0KSB7XG4gIHZhciB4ZiA9IF94d3JhcChmdW5jdGlvbiAoYWNjLCBlbHQpIHtcbiAgICB2YXIga2V5ID0ga2V5Rm4oZWx0KTtcbiAgICB2YXIgdmFsdWUgPSB2YWx1ZUZuKF9oYXMoa2V5LCBhY2MpID8gYWNjW2tleV0gOiBfY2xvbmUodmFsdWVBY2MsIGZhbHNlKSwgZWx0KTtcbiAgICBpZiAodmFsdWUgJiYgdmFsdWVbJ0BAdHJhbnNkdWNlci9yZWR1Y2VkJ10pIHtcbiAgICAgIHJldHVybiBfcmVkdWNlZChhY2MpO1xuICAgIH1cbiAgICBhY2Nba2V5XSA9IHZhbHVlO1xuICAgIHJldHVybiBhY2M7XG4gIH0pO1xuICByZXR1cm4gX3hSZWR1Y2UoeGYsIHt9LCBsaXN0KTtcbn0pKTtcbmV4cG9ydCBkZWZhdWx0IHJlZHVjZUJ5OyIsImltcG9ydCBfY29tcGxlbWVudCBmcm9tIFwiLi9pbnRlcm5hbC9fY29tcGxlbWVudC5qc1wiO1xuaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IGZpbHRlciBmcm9tIFwiLi9maWx0ZXIuanNcIjtcblxuLyoqXG4gKiBUaGUgY29tcGxlbWVudCBvZiBbYGZpbHRlcmBdKCNmaWx0ZXIpLlxuICpcbiAqIEFjdHMgYXMgYSB0cmFuc2R1Y2VyIGlmIGEgdHJhbnNmb3JtZXIgaXMgZ2l2ZW4gaW4gbGlzdCBwb3NpdGlvbi4gRmlsdGVyYWJsZVxuICogb2JqZWN0cyBpbmNsdWRlIHBsYWluIG9iamVjdHMgb3IgYW55IG9iamVjdCB0aGF0IGhhcyBhIGZpbHRlciBtZXRob2Qgc3VjaFxuICogYXMgYEFycmF5YC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIEZpbHRlcmFibGUgZiA9PiAoYSAtPiBCb29sZWFuKSAtPiBmIGEgLT4gZiBhXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkXG4gKiBAcGFyYW0ge0FycmF5fSBmaWx0ZXJhYmxlXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqIEBzZWUgUi5maWx0ZXIsIFIudHJhbnNkdWNlLCBSLmFkZEluZGV4XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgaXNPZGQgPSAobikgPT4gbiAlIDIgIT09IDA7XG4gKlxuICogICAgICBSLnJlamVjdChpc09kZCwgWzEsIDIsIDMsIDRdKTsgLy89PiBbMiwgNF1cbiAqXG4gKiAgICAgIFIucmVqZWN0KGlzT2RkLCB7YTogMSwgYjogMiwgYzogMywgZDogNH0pOyAvLz0+IHtiOiAyLCBkOiA0fVxuICovXG52YXIgcmVqZWN0ID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gcmVqZWN0KHByZWQsIGZpbHRlcmFibGUpIHtcbiAgcmV0dXJuIGZpbHRlcihfY29tcGxlbWVudChwcmVkKSwgZmlsdGVyYWJsZSk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IHJlamVjdDsiLCJpbXBvcnQgX2N1cnJ5MyBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkzLmpzXCI7XG5cbi8qKlxuICogUmVtb3ZlcyB0aGUgc3ViLWxpc3Qgb2YgYGxpc3RgIHN0YXJ0aW5nIGF0IGluZGV4IGBzdGFydGAgYW5kIGNvbnRhaW5pbmdcbiAqIGBjb3VudGAgZWxlbWVudHMuIF9Ob3RlIHRoYXQgdGhpcyBpcyBub3QgZGVzdHJ1Y3RpdmVfOiBpdCByZXR1cm5zIGEgY29weSBvZlxuICogdGhlIGxpc3Qgd2l0aCB0aGUgY2hhbmdlcy5cbiAqIDxzbWFsbD5ObyBsaXN0cyBoYXZlIGJlZW4gaGFybWVkIGluIHRoZSBhcHBsaWNhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uLjwvc21hbGw+XG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMi4yXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBOdW1iZXIgLT4gTnVtYmVyIC0+IFthXSAtPiBbYV1cbiAqIEBwYXJhbSB7TnVtYmVyfSBzdGFydCBUaGUgcG9zaXRpb24gdG8gc3RhcnQgcmVtb3ZpbmcgZWxlbWVudHNcbiAqIEBwYXJhbSB7TnVtYmVyfSBjb3VudCBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHJlbW92ZVxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgbGlzdCB0byByZW1vdmUgZnJvbVxuICogQHJldHVybiB7QXJyYXl9IEEgbmV3IEFycmF5IHdpdGggYGNvdW50YCBlbGVtZW50cyBmcm9tIGBzdGFydGAgcmVtb3ZlZC5cbiAqIEBzZWUgUi53aXRob3V0XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5yZW1vdmUoMiwgMywgWzEsMiwzLDQsNSw2LDcsOF0pOyAvLz0+IFsxLDIsNiw3LDhdXG4gKi9cbnZhciByZW1vdmUgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MyhmdW5jdGlvbiByZW1vdmUoc3RhcnQsIGNvdW50LCBsaXN0KSB7XG4gIHZhciByZXN1bHQgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChsaXN0LCAwKTtcbiAgcmVzdWx0LnNwbGljZShzdGFydCwgY291bnQpO1xuICByZXR1cm4gcmVzdWx0O1xufSk7XG5leHBvcnQgZGVmYXVsdCByZW1vdmU7IiwiaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5MS5qc1wiO1xuaW1wb3J0IF9pc1N0cmluZyBmcm9tIFwiLi9pbnRlcm5hbC9faXNTdHJpbmcuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IGxpc3Qgb3Igc3RyaW5nIHdpdGggdGhlIGVsZW1lbnRzIG9yIGNoYXJhY3RlcnMgaW4gcmV2ZXJzZVxuICogb3JkZXIuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBbYV0gLT4gW2FdXG4gKiBAc2lnIFN0cmluZyAtPiBTdHJpbmdcbiAqIEBwYXJhbSB7QXJyYXl8U3RyaW5nfSBsaXN0XG4gKiBAcmV0dXJuIHtBcnJheXxTdHJpbmd9XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5yZXZlcnNlKFsxLCAyLCAzXSk7ICAvLz0+IFszLCAyLCAxXVxuICogICAgICBSLnJldmVyc2UoWzEsIDJdKTsgICAgIC8vPT4gWzIsIDFdXG4gKiAgICAgIFIucmV2ZXJzZShbMV0pOyAgICAgICAgLy89PiBbMV1cbiAqICAgICAgUi5yZXZlcnNlKFtdKTsgICAgICAgICAvLz0+IFtdXG4gKlxuICogICAgICBSLnJldmVyc2UoJ2FiYycpOyAgICAgIC8vPT4gJ2NiYSdcbiAqICAgICAgUi5yZXZlcnNlKCdhYicpOyAgICAgICAvLz0+ICdiYSdcbiAqICAgICAgUi5yZXZlcnNlKCdhJyk7ICAgICAgICAvLz0+ICdhJ1xuICogICAgICBSLnJldmVyc2UoJycpOyAgICAgICAgIC8vPT4gJydcbiAqL1xudmFyIHJldmVyc2UgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MShmdW5jdGlvbiByZXZlcnNlKGxpc3QpIHtcbiAgcmV0dXJuIF9pc1N0cmluZyhsaXN0KSA/IGxpc3Quc3BsaXQoJycpLnJldmVyc2UoKS5qb2luKCcnKSA6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGxpc3QsIDApLnJldmVyc2UoKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgcmV2ZXJzZTsiLCJpbXBvcnQgX2N1cnJ5MyBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkzLmpzXCI7XG5pbXBvcnQgYWx3YXlzIGZyb20gXCIuL2Fsd2F5cy5qc1wiO1xuaW1wb3J0IG92ZXIgZnJvbSBcIi4vb3Zlci5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBcInNldHRpbmdcIiB0aGUgcG9ydGlvbiBvZiB0aGUgZ2l2ZW4gZGF0YSBzdHJ1Y3R1cmVcbiAqIGZvY3VzZWQgYnkgdGhlIGdpdmVuIGxlbnMgdG8gdGhlIGdpdmVuIHZhbHVlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE2LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEB0eXBlZGVmbiBMZW5zIHMgYSA9IEZ1bmN0b3IgZiA9PiAoYSAtPiBmIGEpIC0+IHMgLT4gZiBzXG4gKiBAc2lnIExlbnMgcyBhIC0+IGEgLT4gcyAtPiBzXG4gKiBAcGFyYW0ge0xlbnN9IGxlbnNcbiAqIEBwYXJhbSB7Kn0gdlxuICogQHBhcmFtIHsqfSB4XG4gKiBAcmV0dXJuIHsqfVxuICogQHNlZSBSLnZpZXcsIFIub3ZlciwgUi5sZW5zLCBSLmxlbnNJbmRleCwgUi5sZW5zUHJvcCwgUi5sZW5zUGF0aFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IHhMZW5zID0gUi5sZW5zUHJvcCgneCcpO1xuICpcbiAqICAgICAgUi5zZXQoeExlbnMsIDQsIHt4OiAxLCB5OiAyfSk7ICAvLz0+IHt4OiA0LCB5OiAyfVxuICogICAgICBSLnNldCh4TGVucywgOCwge3g6IDEsIHk6IDJ9KTsgIC8vPT4ge3g6IDgsIHk6IDJ9XG4gKi9cbnZhciBzZXQgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MyhmdW5jdGlvbiBzZXQobGVucywgdiwgeCkge1xuICByZXR1cm4gb3ZlcihsZW5zLCBhbHdheXModiksIHgpO1xufSk7XG5leHBvcnQgZGVmYXVsdCBzZXQ7IiwiaW1wb3J0IF9jaGVja0Zvck1ldGhvZCBmcm9tIFwiLi9pbnRlcm5hbC9fY2hlY2tGb3JNZXRob2QuanNcIjtcbmltcG9ydCBfY3VycnkzIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTMuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBlbGVtZW50cyBvZiB0aGUgZ2l2ZW4gbGlzdCBvciBzdHJpbmcgKG9yIG9iamVjdCB3aXRoIGEgYHNsaWNlYFxuICogbWV0aG9kKSBmcm9tIGBmcm9tSW5kZXhgIChpbmNsdXNpdmUpIHRvIGB0b0luZGV4YCAoZXhjbHVzaXZlKS5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgc2xpY2VgIG1ldGhvZCBvZiB0aGUgdGhpcmQgYXJndW1lbnQsIGlmIHByZXNlbnQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS40XG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBOdW1iZXIgLT4gTnVtYmVyIC0+IFthXSAtPiBbYV1cbiAqIEBzaWcgTnVtYmVyIC0+IE51bWJlciAtPiBTdHJpbmcgLT4gU3RyaW5nXG4gKiBAcGFyYW0ge051bWJlcn0gZnJvbUluZGV4IFRoZSBzdGFydCBpbmRleCAoaW5jbHVzaXZlKS5cbiAqIEBwYXJhbSB7TnVtYmVyfSB0b0luZGV4IFRoZSBlbmQgaW5kZXggKGV4Y2x1c2l2ZSkuXG4gKiBAcGFyYW0geyp9IGxpc3RcbiAqIEByZXR1cm4geyp9XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5zbGljZSgxLCAzLCBbJ2EnLCAnYicsICdjJywgJ2QnXSk7ICAgICAgICAvLz0+IFsnYicsICdjJ11cbiAqICAgICAgUi5zbGljZSgxLCBJbmZpbml0eSwgWydhJywgJ2InLCAnYycsICdkJ10pOyAvLz0+IFsnYicsICdjJywgJ2QnXVxuICogICAgICBSLnNsaWNlKDAsIC0xLCBbJ2EnLCAnYicsICdjJywgJ2QnXSk7ICAgICAgIC8vPT4gWydhJywgJ2InLCAnYyddXG4gKiAgICAgIFIuc2xpY2UoLTMsIC0xLCBbJ2EnLCAnYicsICdjJywgJ2QnXSk7ICAgICAgLy89PiBbJ2InLCAnYyddXG4gKiAgICAgIFIuc2xpY2UoMCwgMywgJ3JhbWRhJyk7ICAgICAgICAgICAgICAgICAgICAgLy89PiAncmFtJ1xuICovXG52YXIgc2xpY2UgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MyggLyojX19QVVJFX18qL19jaGVja0Zvck1ldGhvZCgnc2xpY2UnLCBmdW5jdGlvbiBzbGljZShmcm9tSW5kZXgsIHRvSW5kZXgsIGxpc3QpIHtcbiAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGxpc3QsIGZyb21JbmRleCwgdG9JbmRleCk7XG59KSk7XG5leHBvcnQgZGVmYXVsdCBzbGljZTsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyBhIGNvcHkgb2YgdGhlIGxpc3QsIHNvcnRlZCBhY2NvcmRpbmcgdG8gdGhlIGNvbXBhcmF0b3IgZnVuY3Rpb24sXG4gKiB3aGljaCBzaG91bGQgYWNjZXB0IHR3byB2YWx1ZXMgYXQgYSB0aW1lIGFuZCByZXR1cm4gYSBuZWdhdGl2ZSBudW1iZXIgaWYgdGhlXG4gKiBmaXJzdCB2YWx1ZSBpcyBzbWFsbGVyLCBhIHBvc2l0aXZlIG51bWJlciBpZiBpdCdzIGxhcmdlciwgYW5kIHplcm8gaWYgdGhleVxuICogYXJlIGVxdWFsLiBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgaXMgYSAqKmNvcHkqKiBvZiB0aGUgbGlzdC4gSXQgZG9lcyBub3RcbiAqIG1vZGlmeSB0aGUgb3JpZ2luYWwuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyAoKGEsIGEpIC0+IE51bWJlcikgLT4gW2FdIC0+IFthXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY29tcGFyYXRvciBBIHNvcnRpbmcgZnVuY3Rpb24gOjogYSAtPiBiIC0+IEludFxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgbGlzdCB0byBzb3J0XG4gKiBAcmV0dXJuIHtBcnJheX0gYSBuZXcgYXJyYXkgd2l0aCBpdHMgZWxlbWVudHMgc29ydGVkIGJ5IHRoZSBjb21wYXJhdG9yIGZ1bmN0aW9uLlxuICogQHNlZSBSLmFzY2VuZCwgUi5kZXNjZW5kXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgZGlmZiA9IGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuIGEgLSBiOyB9O1xuICogICAgICBSLnNvcnQoZGlmZiwgWzQsMiw3LDVdKTsgLy89PiBbMiwgNCwgNSwgN11cbiAqL1xudmFyIHNvcnQgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiBzb3J0KGNvbXBhcmF0b3IsIGxpc3QpIHtcbiAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGxpc3QsIDApLnNvcnQoY29tcGFyYXRvcik7XG59KTtcbmV4cG9ydCBkZWZhdWx0IHNvcnQ7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IGVxdWFscyBmcm9tIFwiLi9lcXVhbHMuanNcIjtcbmltcG9ydCB0YWtlIGZyb20gXCIuL3Rha2UuanNcIjtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBsaXN0IHN0YXJ0cyB3aXRoIHRoZSBwcm92aWRlZCBzdWJsaXN0LlxuICpcbiAqIFNpbWlsYXJseSwgY2hlY2tzIGlmIGEgc3RyaW5nIHN0YXJ0cyB3aXRoIHRoZSBwcm92aWRlZCBzdWJzdHJpbmcuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMjQuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgW2FdIC0+IFthXSAtPiBCb29sZWFuXG4gKiBAc2lnIFN0cmluZyAtPiBTdHJpbmcgLT4gQm9vbGVhblxuICogQHBhcmFtIHsqfSBwcmVmaXhcbiAqIEBwYXJhbSB7Kn0gbGlzdFxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBzZWUgUi5lbmRzV2l0aFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuc3RhcnRzV2l0aCgnYScsICdhYmMnKSAgICAgICAgICAgICAgICAvLz0+IHRydWVcbiAqICAgICAgUi5zdGFydHNXaXRoKCdiJywgJ2FiYycpICAgICAgICAgICAgICAgIC8vPT4gZmFsc2VcbiAqICAgICAgUi5zdGFydHNXaXRoKFsnYSddLCBbJ2EnLCAnYicsICdjJ10pICAgIC8vPT4gdHJ1ZVxuICogICAgICBSLnN0YXJ0c1dpdGgoWydiJ10sIFsnYScsICdiJywgJ2MnXSkgICAgLy89PiBmYWxzZVxuICovXG52YXIgc3RhcnRzV2l0aCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIChwcmVmaXgsIGxpc3QpIHtcbiAgcmV0dXJuIGVxdWFscyh0YWtlKHByZWZpeC5sZW5ndGgsIGxpc3QpLCBwcmVmaXgpO1xufSk7XG5leHBvcnQgZGVmYXVsdCBzdGFydHNXaXRoOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfZGlzcGF0Y2hhYmxlIGZyb20gXCIuL2ludGVybmFsL19kaXNwYXRjaGFibGUuanNcIjtcbmltcG9ydCBfeHRha2UgZnJvbSBcIi4vaW50ZXJuYWwvX3h0YWtlLmpzXCI7XG5pbXBvcnQgc2xpY2UgZnJvbSBcIi4vc2xpY2UuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBmaXJzdCBgbmAgZWxlbWVudHMgb2YgdGhlIGdpdmVuIGxpc3QsIHN0cmluZywgb3JcbiAqIHRyYW5zZHVjZXIvdHJhbnNmb3JtZXIgKG9yIG9iamVjdCB3aXRoIGEgYHRha2VgIG1ldGhvZCkuXG4gKlxuICogRGlzcGF0Y2hlcyB0byB0aGUgYHRha2VgIG1ldGhvZCBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50LCBpZiBwcmVzZW50LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgTnVtYmVyIC0+IFthXSAtPiBbYV1cbiAqIEBzaWcgTnVtYmVyIC0+IFN0cmluZyAtPiBTdHJpbmdcbiAqIEBwYXJhbSB7TnVtYmVyfSBuXG4gKiBAcGFyYW0geyp9IGxpc3RcbiAqIEByZXR1cm4geyp9XG4gKiBAc2VlIFIuZHJvcFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIudGFrZSgxLCBbJ2ZvbycsICdiYXInLCAnYmF6J10pOyAvLz0+IFsnZm9vJ11cbiAqICAgICAgUi50YWtlKDIsIFsnZm9vJywgJ2JhcicsICdiYXonXSk7IC8vPT4gWydmb28nLCAnYmFyJ11cbiAqICAgICAgUi50YWtlKDMsIFsnZm9vJywgJ2JhcicsICdiYXonXSk7IC8vPT4gWydmb28nLCAnYmFyJywgJ2JheiddXG4gKiAgICAgIFIudGFrZSg0LCBbJ2ZvbycsICdiYXInLCAnYmF6J10pOyAvLz0+IFsnZm9vJywgJ2JhcicsICdiYXonXVxuICogICAgICBSLnRha2UoMywgJ3JhbWRhJyk7ICAgICAgICAgICAgICAgLy89PiAncmFtJ1xuICpcbiAqICAgICAgY29uc3QgcGVyc29ubmVsID0gW1xuICogICAgICAgICdEYXZlIEJydWJlY2snLFxuICogICAgICAgICdQYXVsIERlc21vbmQnLFxuICogICAgICAgICdFdWdlbmUgV3JpZ2h0JyxcbiAqICAgICAgICAnSm9lIE1vcmVsbG8nLFxuICogICAgICAgICdHZXJyeSBNdWxsaWdhbicsXG4gKiAgICAgICAgJ0JvYiBCYXRlcycsXG4gKiAgICAgICAgJ0pvZSBEb2RnZScsXG4gKiAgICAgICAgJ1JvbiBDcm90dHknXG4gKiAgICAgIF07XG4gKlxuICogICAgICBjb25zdCB0YWtlRml2ZSA9IFIudGFrZSg1KTtcbiAqICAgICAgdGFrZUZpdmUocGVyc29ubmVsKTtcbiAqICAgICAgLy89PiBbJ0RhdmUgQnJ1YmVjaycsICdQYXVsIERlc21vbmQnLCAnRXVnZW5lIFdyaWdodCcsICdKb2UgTW9yZWxsbycsICdHZXJyeSBNdWxsaWdhbiddXG4gKiBAc3ltYiBSLnRha2UoLTEsIFthLCBiXSkgPSBbYSwgYl1cbiAqIEBzeW1iIFIudGFrZSgwLCBbYSwgYl0pID0gW11cbiAqIEBzeW1iIFIudGFrZSgxLCBbYSwgYl0pID0gW2FdXG4gKiBAc3ltYiBSLnRha2UoMiwgW2EsIGJdKSA9IFthLCBiXVxuICovXG52YXIgdGFrZSA9IC8qI19fUFVSRV9fKi9fY3VycnkyKCAvKiNfX1BVUkVfXyovX2Rpc3BhdGNoYWJsZShbJ3Rha2UnXSwgX3h0YWtlLCBmdW5jdGlvbiB0YWtlKG4sIHhzKSB7XG4gIHJldHVybiBzbGljZSgwLCBuIDwgMCA/IEluZmluaXR5IDogbiwgeHMpO1xufSkpO1xuZXhwb3J0IGRlZmF1bHQgdGFrZTsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5pbXBvcnQgX2hhcyBmcm9tIFwiLi9pbnRlcm5hbC9faGFzLmpzXCI7XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IGludG8gYW4gYXJyYXkgb2Yga2V5LCB2YWx1ZSBhcnJheXMuIE9ubHkgdGhlIG9iamVjdCdzXG4gKiBvd24gcHJvcGVydGllcyBhcmUgdXNlZC5cbiAqIE5vdGUgdGhhdCB0aGUgb3JkZXIgb2YgdGhlIG91dHB1dCBhcnJheSBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBjb25zaXN0ZW50XG4gKiBhY3Jvc3MgZGlmZmVyZW50IEpTIHBsYXRmb3Jtcy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC40LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcge1N0cmluZzogKn0gLT4gW1tTdHJpbmcsKl1dXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gZXh0cmFjdCBmcm9tXG4gKiBAcmV0dXJuIHtBcnJheX0gQW4gYXJyYXkgb2Yga2V5LCB2YWx1ZSBhcnJheXMgZnJvbSB0aGUgb2JqZWN0J3Mgb3duIHByb3BlcnRpZXMuXG4gKiBAc2VlIFIuZnJvbVBhaXJzLCBSLmtleXMsIFIudmFsdWVzXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi50b1BhaXJzKHthOiAxLCBiOiAyLCBjOiAzfSk7IC8vPT4gW1snYScsIDFdLCBbJ2InLCAyXSwgWydjJywgM11dXG4gKi9cbnZhciB0b1BhaXJzID0gLyojX19QVVJFX18qL19jdXJyeTEoZnVuY3Rpb24gdG9QYWlycyhvYmopIHtcbiAgdmFyIHBhaXJzID0gW107XG4gIGZvciAodmFyIHByb3AgaW4gb2JqKSB7XG4gICAgaWYgKF9oYXMocHJvcCwgb2JqKSkge1xuICAgICAgcGFpcnNbcGFpcnMubGVuZ3RoXSA9IFtwcm9wLCBvYmpbcHJvcF1dO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcGFpcnM7XG59KTtcbmV4cG9ydCBkZWZhdWx0IHRvUGFpcnM7IiwiaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5MS5qc1wiO1xuaW1wb3J0IF90b1N0cmluZyBmcm9tIFwiLi9pbnRlcm5hbC9fdG9TdHJpbmcuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIHZhbHVlLiBgZXZhbGAnaW5nIHRoZSBvdXRwdXRcbiAqIHNob3VsZCByZXN1bHQgaW4gYSB2YWx1ZSBlcXVpdmFsZW50IHRvIHRoZSBpbnB1dCB2YWx1ZS4gTWFueSBvZiB0aGUgYnVpbHQtaW5cbiAqIGB0b1N0cmluZ2AgbWV0aG9kcyBkbyBub3Qgc2F0aXNmeSB0aGlzIHJlcXVpcmVtZW50LlxuICpcbiAqIElmIHRoZSBnaXZlbiB2YWx1ZSBpcyBhbiBgW29iamVjdCBPYmplY3RdYCB3aXRoIGEgYHRvU3RyaW5nYCBtZXRob2Qgb3RoZXJcbiAqIHRoYW4gYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgLCB0aGlzIG1ldGhvZCBpcyBpbnZva2VkIHdpdGggbm8gYXJndW1lbnRzXG4gKiB0byBwcm9kdWNlIHRoZSByZXR1cm4gdmFsdWUuIFRoaXMgbWVhbnMgdXNlci1kZWZpbmVkIGNvbnN0cnVjdG9yIGZ1bmN0aW9uc1xuICogY2FuIHByb3ZpZGUgYSBzdWl0YWJsZSBgdG9TdHJpbmdgIG1ldGhvZC4gRm9yIGV4YW1wbGU6XG4gKlxuICogICAgIGZ1bmN0aW9uIFBvaW50KHgsIHkpIHtcbiAqICAgICAgIHRoaXMueCA9IHg7XG4gKiAgICAgICB0aGlzLnkgPSB5O1xuICogICAgIH1cbiAqXG4gKiAgICAgUG9pbnQucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gKiAgICAgICByZXR1cm4gJ25ldyBQb2ludCgnICsgdGhpcy54ICsgJywgJyArIHRoaXMueSArICcpJztcbiAqICAgICB9O1xuICpcbiAqICAgICBSLnRvU3RyaW5nKG5ldyBQb2ludCgxLCAyKSk7IC8vPT4gJ25ldyBQb2ludCgxLCAyKSdcbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xNC4wXG4gKiBAY2F0ZWdvcnkgU3RyaW5nXG4gKiBAc2lnICogLT4gU3RyaW5nXG4gKiBAcGFyYW0geyp9IHZhbFxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIudG9TdHJpbmcoNDIpOyAvLz0+ICc0MidcbiAqICAgICAgUi50b1N0cmluZygnYWJjJyk7IC8vPT4gJ1wiYWJjXCInXG4gKiAgICAgIFIudG9TdHJpbmcoWzEsIDIsIDNdKTsgLy89PiAnWzEsIDIsIDNdJ1xuICogICAgICBSLnRvU3RyaW5nKHtmb286IDEsIGJhcjogMiwgYmF6OiAzfSk7IC8vPT4gJ3tcImJhclwiOiAyLCBcImJhelwiOiAzLCBcImZvb1wiOiAxfSdcbiAqICAgICAgUi50b1N0cmluZyhuZXcgRGF0ZSgnMjAwMS0wMi0wM1QwNDowNTowNlonKSk7IC8vPT4gJ25ldyBEYXRlKFwiMjAwMS0wMi0wM1QwNDowNTowNi4wMDBaXCIpJ1xuICovXG52YXIgdG9TdHJpbmcgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MShmdW5jdGlvbiB0b1N0cmluZyh2YWwpIHtcbiAgcmV0dXJuIF90b1N0cmluZyh2YWwsIFtdKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgdG9TdHJpbmc7IiwiaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5MS5qc1wiO1xuXG4vKipcbiAqIEdpdmVzIGEgc2luZ2xlLXdvcmQgc3RyaW5nIGRlc2NyaXB0aW9uIG9mIHRoZSAobmF0aXZlKSB0eXBlIG9mIGEgdmFsdWUsXG4gKiByZXR1cm5pbmcgc3VjaCBhbnN3ZXJzIGFzICdPYmplY3QnLCAnTnVtYmVyJywgJ0FycmF5Jywgb3IgJ051bGwnLiBEb2VzIG5vdFxuICogYXR0ZW1wdCB0byBkaXN0aW5ndWlzaCB1c2VyIE9iamVjdCB0eXBlcyBhbnkgZnVydGhlciwgcmVwb3J0aW5nIHRoZW0gYWxsIGFzXG4gKiAnT2JqZWN0Jy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC44LjBcbiAqIEBjYXRlZ29yeSBUeXBlXG4gKiBAc2lnICogLT4gU3RyaW5nXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIudHlwZSh7fSk7IC8vPT4gXCJPYmplY3RcIlxuICogICAgICBSLnR5cGUoMSk7IC8vPT4gXCJOdW1iZXJcIlxuICogICAgICBSLnR5cGUoZmFsc2UpOyAvLz0+IFwiQm9vbGVhblwiXG4gKiAgICAgIFIudHlwZSgncycpOyAvLz0+IFwiU3RyaW5nXCJcbiAqICAgICAgUi50eXBlKG51bGwpOyAvLz0+IFwiTnVsbFwiXG4gKiAgICAgIFIudHlwZShbXSk7IC8vPT4gXCJBcnJheVwiXG4gKiAgICAgIFIudHlwZSgvW0Etel0vKTsgLy89PiBcIlJlZ0V4cFwiXG4gKiAgICAgIFIudHlwZSgoKSA9PiB7fSk7IC8vPT4gXCJGdW5jdGlvblwiXG4gKiAgICAgIFIudHlwZShhc3luYyAoKSA9PiB7fSk7IC8vPT4gXCJBc3luY0Z1bmN0aW9uXCJcbiAqICAgICAgUi50eXBlKHVuZGVmaW5lZCk7IC8vPT4gXCJVbmRlZmluZWRcIlxuICogICAgICBSLnR5cGUoQmlnSW50KDEyMykpOyAvLz0+IFwiQmlnSW50XCJcbiAqL1xudmFyIHR5cGUgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MShmdW5jdGlvbiB0eXBlKHZhbCkge1xuICByZXR1cm4gdmFsID09PSBudWxsID8gJ051bGwnIDogdmFsID09PSB1bmRlZmluZWQgPyAnVW5kZWZpbmVkJyA6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWwpLnNsaWNlKDgsIC0xKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgdHlwZTsiLCJpbXBvcnQgaWRlbnRpdHkgZnJvbSBcIi4vaWRlbnRpdHkuanNcIjtcbmltcG9ydCB1bmlxQnkgZnJvbSBcIi4vdW5pcUJ5LmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyBhIG5ldyBsaXN0IGNvbnRhaW5pbmcgb25seSBvbmUgY29weSBvZiBlYWNoIGVsZW1lbnQgaW4gdGhlIG9yaWdpbmFsXG4gKiBsaXN0LiBbYFIuZXF1YWxzYF0oI2VxdWFscykgaXMgdXNlZCB0byBkZXRlcm1pbmUgZXF1YWxpdHkuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBbYV0gLT4gW2FdXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBhcnJheSB0byBjb25zaWRlci5cbiAqIEByZXR1cm4ge0FycmF5fSBUaGUgbGlzdCBvZiB1bmlxdWUgaXRlbXMuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi51bmlxKFsxLCAxLCAyLCAxXSk7IC8vPT4gWzEsIDJdXG4gKiAgICAgIFIudW5pcShbMSwgJzEnXSk7ICAgICAvLz0+IFsxLCAnMSddXG4gKiAgICAgIFIudW5pcShbWzQyXSwgWzQyXV0pOyAvLz0+IFtbNDJdXVxuICovXG52YXIgdW5pcSA9IC8qI19fUFVSRV9fKi91bmlxQnkoaWRlbnRpdHkpO1xuZXhwb3J0IGRlZmF1bHQgdW5pcTsiLCJpbXBvcnQgX1NldCBmcm9tIFwiLi9pbnRlcm5hbC9fU2V0LmpzXCI7XG5pbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX2Rpc3BhdGNoYWJsZSBmcm9tIFwiLi9pbnRlcm5hbC9fZGlzcGF0Y2hhYmxlLmpzXCI7XG5pbXBvcnQgX3h1bmlxQnkgZnJvbSBcIi4vaW50ZXJuYWwvX3h1bmlxQnkuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IGxpc3QgY29udGFpbmluZyBvbmx5IG9uZSBjb3B5IG9mIGVhY2ggZWxlbWVudCBpbiB0aGUgb3JpZ2luYWxcbiAqIGxpc3QsIGJhc2VkIHVwb24gdGhlIHZhbHVlIHJldHVybmVkIGJ5IGFwcGx5aW5nIHRoZSBzdXBwbGllZCBmdW5jdGlvbiB0b1xuICogZWFjaCBsaXN0IGVsZW1lbnQuIFByZWZlcnMgdGhlIGZpcnN0IGl0ZW0gaWYgdGhlIHN1cHBsaWVkIGZ1bmN0aW9uIHByb2R1Y2VzXG4gKiB0aGUgc2FtZSB2YWx1ZSBvbiB0d28gaXRlbXMuIFtgUi5lcXVhbHNgXSgjZXF1YWxzKSBpcyB1c2VkIGZvciBjb21wYXJpc29uLlxuICpcbiAqIEFjdHMgYXMgYSB0cmFuc2R1Y2VyIGlmIGEgdHJhbnNmb3JtZXIgaXMgZ2l2ZW4gaW4gbGlzdCBwb3NpdGlvbi5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xNi4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyAoYSAtPiBiKSAtPiBbYV0gLT4gW2FdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBBIGZ1bmN0aW9uIHVzZWQgdG8gcHJvZHVjZSBhIHZhbHVlIHRvIHVzZSBkdXJpbmcgY29tcGFyaXNvbnMuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBhcnJheSB0byBjb25zaWRlci5cbiAqIEByZXR1cm4ge0FycmF5fSBUaGUgbGlzdCBvZiB1bmlxdWUgaXRlbXMuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi51bmlxQnkoTWF0aC5hYnMsIFstMSwgLTUsIDIsIDEwLCAxLCAyXSk7IC8vPT4gWy0xLCAtNSwgMiwgMTBdXG4gKi9cbnZhciB1bmlxQnkgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MiggLyojX19QVVJFX18qL19kaXNwYXRjaGFibGUoW10sIF94dW5pcUJ5LCBmdW5jdGlvbiAoZm4sIGxpc3QpIHtcbiAgdmFyIHNldCA9IG5ldyBfU2V0KCk7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGlkeCA9IDA7XG4gIHZhciBhcHBsaWVkSXRlbSwgaXRlbTtcbiAgd2hpbGUgKGlkeCA8IGxpc3QubGVuZ3RoKSB7XG4gICAgaXRlbSA9IGxpc3RbaWR4XTtcbiAgICBhcHBsaWVkSXRlbSA9IGZuKGl0ZW0pO1xuICAgIGlmIChzZXQuYWRkKGFwcGxpZWRJdGVtKSkge1xuICAgICAgcmVzdWx0LnB1c2goaXRlbSk7XG4gICAgfVxuICAgIGlkeCArPSAxO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59KSk7XG5leHBvcnQgZGVmYXVsdCB1bmlxQnk7IiwiaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5MS5qc1wiO1xuaW1wb3J0IGtleXMgZnJvbSBcIi4va2V5cy5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCB0aGUgZW51bWVyYWJsZSBvd24gcHJvcGVydGllcyBvZiB0aGUgc3VwcGxpZWQgb2JqZWN0LlxuICogTm90ZSB0aGF0IHRoZSBvcmRlciBvZiB0aGUgb3V0cHV0IGFycmF5IGlzIG5vdCBndWFyYW50ZWVkIGFjcm9zcyBkaWZmZXJlbnRcbiAqIEpTIHBsYXRmb3Jtcy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcge2s6IHZ9IC0+IFt2XVxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIGV4dHJhY3QgdmFsdWVzIGZyb21cbiAqIEByZXR1cm4ge0FycmF5fSBBbiBhcnJheSBvZiB0aGUgdmFsdWVzIG9mIHRoZSBvYmplY3QncyBvd24gcHJvcGVydGllcy5cbiAqIEBzZWUgUi52YWx1ZXNJbiwgUi5rZXlzLCBSLnRvUGFpcnNcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnZhbHVlcyh7YTogMSwgYjogMiwgYzogM30pOyAvLz0+IFsxLCAyLCAzXVxuICovXG52YXIgdmFsdWVzID0gLyojX19QVVJFX18qL19jdXJyeTEoZnVuY3Rpb24gdmFsdWVzKG9iaikge1xuICB2YXIgcHJvcHMgPSBrZXlzKG9iaik7XG4gIHZhciBsZW4gPSBwcm9wcy5sZW5ndGg7XG4gIHZhciB2YWxzID0gW107XG4gIHZhciBpZHggPSAwO1xuICB3aGlsZSAoaWR4IDwgbGVuKSB7XG4gICAgdmFsc1tpZHhdID0gb2JqW3Byb3BzW2lkeF1dO1xuICAgIGlkeCArPSAxO1xuICB9XG4gIHJldHVybiB2YWxzO1xufSk7XG5leHBvcnQgZGVmYXVsdCB2YWx1ZXM7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuXG4vLyBgQ29uc3RgIGlzIGEgZnVuY3RvciB0aGF0IGVmZmVjdGl2ZWx5IGlnbm9yZXMgdGhlIGZ1bmN0aW9uIGdpdmVuIHRvIGBtYXBgLlxudmFyIENvbnN0ID0gZnVuY3Rpb24gKHgpIHtcbiAgcmV0dXJuIHtcbiAgICB2YWx1ZTogeCxcbiAgICAnZmFudGFzeS1sYW5kL21hcCc6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhIFwidmlld1wiIG9mIHRoZSBnaXZlbiBkYXRhIHN0cnVjdHVyZSwgZGV0ZXJtaW5lZCBieSB0aGUgZ2l2ZW4gbGVucy5cbiAqIFRoZSBsZW5zJ3MgZm9jdXMgZGV0ZXJtaW5lcyB3aGljaCBwb3J0aW9uIG9mIHRoZSBkYXRhIHN0cnVjdHVyZSBpcyB2aXNpYmxlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE2LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEB0eXBlZGVmbiBMZW5zIHMgYSA9IEZ1bmN0b3IgZiA9PiAoYSAtPiBmIGEpIC0+IHMgLT4gZiBzXG4gKiBAc2lnIExlbnMgcyBhIC0+IHMgLT4gYVxuICogQHBhcmFtIHtMZW5zfSBsZW5zXG4gKiBAcGFyYW0geyp9IHhcbiAqIEByZXR1cm4geyp9XG4gKiBAc2VlIFIuc2V0LCBSLm92ZXIsIFIubGVucywgUi5sZW5zSW5kZXgsIFIubGVuc1Byb3AsIFIubGVuc1BhdGhcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCB4TGVucyA9IFIubGVuc1Byb3AoJ3gnKTtcbiAqXG4gKiAgICAgIFIudmlldyh4TGVucywge3g6IDEsIHk6IDJ9KTsgIC8vPT4gMVxuICogICAgICBSLnZpZXcoeExlbnMsIHt4OiA0LCB5OiAyfSk7ICAvLz0+IDRcbiAqL1xudmFyIHZpZXcgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiB2aWV3KGxlbnMsIHgpIHtcbiAgLy8gVXNpbmcgYENvbnN0YCBlZmZlY3RpdmVseSBpZ25vcmVzIHRoZSBzZXR0ZXIgZnVuY3Rpb24gb2YgdGhlIGBsZW5zYCxcbiAgLy8gbGVhdmluZyB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIGdldHRlciBmdW5jdGlvbiB1bm1vZGlmaWVkLlxuICByZXR1cm4gbGVucyhDb25zdCkoeCkudmFsdWU7XG59KTtcbmV4cG9ydCBkZWZhdWx0IHZpZXc7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgbGlzdCBvdXQgb2YgdGhlIHR3byBzdXBwbGllZCBieSBwYWlyaW5nIHVwIGVxdWFsbHktcG9zaXRpb25lZFxuICogaXRlbXMgZnJvbSBib3RoIGxpc3RzLiBUaGUgcmV0dXJuZWQgbGlzdCBpcyB0cnVuY2F0ZWQgdG8gdGhlIGxlbmd0aCBvZiB0aGVcbiAqIHNob3J0ZXIgb2YgdGhlIHR3byBpbnB1dCBsaXN0cy5cbiAqIE5vdGU6IGB6aXBgIGlzIGVxdWl2YWxlbnQgdG8gYHppcFdpdGgoZnVuY3Rpb24oYSwgYikgeyByZXR1cm4gW2EsIGJdIH0pYC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIFthXSAtPiBbYl0gLT4gW1thLGJdXVxuICogQHBhcmFtIHtBcnJheX0gbGlzdDEgVGhlIGZpcnN0IGFycmF5IHRvIGNvbnNpZGVyLlxuICogQHBhcmFtIHtBcnJheX0gbGlzdDIgVGhlIHNlY29uZCBhcnJheSB0byBjb25zaWRlci5cbiAqIEByZXR1cm4ge0FycmF5fSBUaGUgbGlzdCBtYWRlIGJ5IHBhaXJpbmcgdXAgc2FtZS1pbmRleGVkIGVsZW1lbnRzIG9mIGBsaXN0MWAgYW5kIGBsaXN0MmAuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi56aXAoWzEsIDIsIDNdLCBbJ2EnLCAnYicsICdjJ10pOyAvLz0+IFtbMSwgJ2EnXSwgWzIsICdiJ10sIFszLCAnYyddXVxuICogQHN5bWIgUi56aXAoW2EsIGIsIGNdLCBbZCwgZSwgZl0pID0gW1thLCBkXSwgW2IsIGVdLCBbYywgZl1dXG4gKi9cbnZhciB6aXAgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiB6aXAoYSwgYikge1xuICB2YXIgbGVuID0gTWF0aC5taW4oYS5sZW5ndGgsIGIubGVuZ3RoKTtcbiAgdmFyIHJ2ID0gQXJyYXkobGVuKTtcbiAgdmFyIGlkeCA9IDA7XG4gIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICBydltpZHhdID0gW2FbaWR4XSwgYltpZHhdXTtcbiAgICBpZHggKz0gMTtcbiAgfVxuICByZXR1cm4gcnY7XG59KTtcbmV4cG9ydCBkZWZhdWx0IHppcDsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBvYmplY3Qgb3V0IG9mIGEgbGlzdCBvZiBrZXlzIGFuZCBhIGxpc3Qgb2YgdmFsdWVzLlxuICogS2V5L3ZhbHVlIHBhaXJpbmcgaXMgdHJ1bmNhdGVkIHRvIHRoZSBsZW5ndGggb2YgdGhlIHNob3J0ZXIgb2YgdGhlIHR3byBsaXN0cy5cbiAqIE5vdGU6IGB6aXBPYmpgIGlzIGVxdWl2YWxlbnQgdG8gYHBpcGUoemlwLCBmcm9tUGFpcnMpYC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4zLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIFtTdHJpbmddIC0+IFsqXSAtPiB7U3RyaW5nOiAqfVxuICogQHBhcmFtIHtBcnJheX0ga2V5cyBUaGUgYXJyYXkgdGhhdCB3aWxsIGJlIHByb3BlcnRpZXMgb24gdGhlIG91dHB1dCBvYmplY3QuXG4gKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIGxpc3Qgb2YgdmFsdWVzIG9uIHRoZSBvdXRwdXQgb2JqZWN0LlxuICogQHJldHVybiB7T2JqZWN0fSBUaGUgb2JqZWN0IG1hZGUgYnkgcGFpcmluZyB1cCBzYW1lLWluZGV4ZWQgZWxlbWVudHMgb2YgYGtleXNgIGFuZCBgdmFsdWVzYC5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnppcE9iaihbJ2EnLCAnYicsICdjJ10sIFsxLCAyLCAzXSk7IC8vPT4ge2E6IDEsIGI6IDIsIGM6IDN9XG4gKi9cbnZhciB6aXBPYmogPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiB6aXBPYmooa2V5cywgdmFsdWVzKSB7XG4gIHZhciBpZHggPSAwO1xuICB2YXIgbGVuID0gTWF0aC5taW4oa2V5cy5sZW5ndGgsIHZhbHVlcy5sZW5ndGgpO1xuICB2YXIgb3V0ID0ge307XG4gIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICBvdXRba2V5c1tpZHhdXSA9IHZhbHVlc1tpZHhdO1xuICAgIGlkeCArPSAxO1xuICB9XG4gIHJldHVybiBvdXQ7XG59KTtcbmV4cG9ydCBkZWZhdWx0IHppcE9iajsiLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDI2LCBUaGUgQ3l0b3NjYXBlIENvbnNvcnRpdW0uXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZlxuICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUg4oCcU29mdHdhcmXigJ0pLCB0byBkZWFsIGluXG4gKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvXG4gKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllc1xuICogb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvXG4gKiBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4gKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCDigJxBUyBJU+KAnSwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICogU09GVFdBUkUuXG4gKi9cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkociwgYSkge1xuICAobnVsbCA9PSBhIHx8IGEgPiByLmxlbmd0aCkgJiYgKGEgPSByLmxlbmd0aCk7XG4gIGZvciAodmFyIGUgPSAwLCBuID0gQXJyYXkoYSk7IGUgPCBhOyBlKyspIG5bZV0gPSByW2VdO1xuICByZXR1cm4gbjtcbn1cbmZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhyKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHIpKSByZXR1cm4gcjtcbn1cbmZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhyKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHIpKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkocik7XG59XG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soYSwgbikge1xuICBpZiAoIShhIGluc3RhbmNlb2YgbikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG59XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyhlLCByKSB7XG4gIGZvciAodmFyIHQgPSAwOyB0IDwgci5sZW5ndGg7IHQrKykge1xuICAgIHZhciBvID0gclt0XTtcbiAgICBvLmVudW1lcmFibGUgPSBvLmVudW1lcmFibGUgfHwgZmFsc2UsIG8uY29uZmlndXJhYmxlID0gdHJ1ZSwgXCJ2YWx1ZVwiIGluIG8gJiYgKG8ud3JpdGFibGUgPSB0cnVlKSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIF90b1Byb3BlcnR5S2V5KG8ua2V5KSwgbyk7XG4gIH1cbn1cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhlLCByLCB0KSB7XG4gIHJldHVybiByICYmIF9kZWZpbmVQcm9wZXJ0aWVzKGUucHJvdG90eXBlLCByKSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwicHJvdG90eXBlXCIsIHtcbiAgICB3cml0YWJsZTogZmFsc2VcbiAgfSksIGU7XG59XG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihyLCBlKSB7XG4gIHZhciB0ID0gXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2YgU3ltYm9sICYmIHJbU3ltYm9sLml0ZXJhdG9yXSB8fCByW1wiQEBpdGVyYXRvclwiXTtcbiAgaWYgKCF0KSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocikgfHwgKHQgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkocikpIHx8IGUpIHtcbiAgICAgIHQgJiYgKHIgPSB0KTtcbiAgICAgIHZhciBuID0gMCxcbiAgICAgICAgRiA9IGZ1bmN0aW9uICgpIHt9O1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgczogRixcbiAgICAgICAgbjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBuID49IHIubGVuZ3RoID8ge1xuICAgICAgICAgICAgZG9uZTogdHJ1ZVxuICAgICAgICAgIH0gOiB7XG4gICAgICAgICAgICBkb25lOiBmYWxzZSxcbiAgICAgICAgICAgIHZhbHVlOiByW24rK11cbiAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBlOiBmdW5jdGlvbiAocikge1xuICAgICAgICAgIHRocm93IHI7XG4gICAgICAgIH0sXG4gICAgICAgIGY6IEZcbiAgICAgIH07XG4gICAgfVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTtcbiAgfVxuICB2YXIgbyxcbiAgICBhID0gdHJ1ZSxcbiAgICB1ID0gZmFsc2U7XG4gIHJldHVybiB7XG4gICAgczogZnVuY3Rpb24gKCkge1xuICAgICAgdCA9IHQuY2FsbChyKTtcbiAgICB9LFxuICAgIG46IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciByID0gdC5uZXh0KCk7XG4gICAgICByZXR1cm4gYSA9IHIuZG9uZSwgcjtcbiAgICB9LFxuICAgIGU6IGZ1bmN0aW9uIChyKSB7XG4gICAgICB1ID0gdHJ1ZSwgbyA9IHI7XG4gICAgfSxcbiAgICBmOiBmdW5jdGlvbiAoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhIHx8IG51bGwgPT0gdC5yZXR1cm4gfHwgdC5yZXR1cm4oKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmICh1KSB0aHJvdyBvO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eSQxKGUsIHIsIHQpIHtcbiAgcmV0dXJuIChyID0gX3RvUHJvcGVydHlLZXkocikpIGluIGUgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgciwge1xuICAgIHZhbHVlOiB0LFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIHdyaXRhYmxlOiB0cnVlXG4gIH0pIDogZVtyXSA9IHQsIGU7XG59XG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KHIpIHtcbiAgaWYgKFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIFN5bWJvbCAmJiBudWxsICE9IHJbU3ltYm9sLml0ZXJhdG9yXSB8fCBudWxsICE9IHJbXCJAQGl0ZXJhdG9yXCJdKSByZXR1cm4gQXJyYXkuZnJvbShyKTtcbn1cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdChyLCBsKSB7XG4gIHZhciB0ID0gbnVsbCA9PSByID8gbnVsbCA6IFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIFN5bWJvbCAmJiByW1N5bWJvbC5pdGVyYXRvcl0gfHwgcltcIkBAaXRlcmF0b3JcIl07XG4gIGlmIChudWxsICE9IHQpIHtcbiAgICB2YXIgZSxcbiAgICAgIG4sXG4gICAgICBpLFxuICAgICAgdSxcbiAgICAgIGEgPSBbXSxcbiAgICAgIGYgPSB0cnVlLFxuICAgICAgbyA9IGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICBpZiAoaSA9ICh0ID0gdC5jYWxsKHIpKS5uZXh0LCAwID09PSBsKSB7XG4gICAgICAgIGlmIChPYmplY3QodCkgIT09IHQpIHJldHVybjtcbiAgICAgICAgZiA9ICExO1xuICAgICAgfSBlbHNlIGZvciAoOyAhKGYgPSAoZSA9IGkuY2FsbCh0KSkuZG9uZSkgJiYgKGEucHVzaChlLnZhbHVlKSwgYS5sZW5ndGggIT09IGwpOyBmID0gITApO1xuICAgIH0gY2F0Y2ggKHIpIHtcbiAgICAgIG8gPSB0cnVlLCBuID0gcjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFmICYmIG51bGwgIT0gdC5yZXR1cm4gJiYgKHUgPSB0LnJldHVybigpLCBPYmplY3QodSkgIT09IHUpKSByZXR1cm47XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAobykgdGhyb3cgbjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGE7XG4gIH1cbn1cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG59XG5mdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpO1xufVxuZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkociwgZSkge1xuICByZXR1cm4gX2FycmF5V2l0aEhvbGVzKHIpIHx8IF9pdGVyYWJsZVRvQXJyYXlMaW1pdChyLCBlKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkociwgZSkgfHwgX25vbkl0ZXJhYmxlUmVzdCgpO1xufVxuZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KHIpIHtcbiAgcmV0dXJuIF9hcnJheVdpdGhvdXRIb2xlcyhyKSB8fCBfaXRlcmFibGVUb0FycmF5KHIpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShyKSB8fCBfbm9uSXRlcmFibGVTcHJlYWQoKTtcbn1cbmZ1bmN0aW9uIF90b1ByaW1pdGl2ZSh0LCByKSB7XG4gIGlmIChcIm9iamVjdFwiICE9IHR5cGVvZiB0IHx8ICF0KSByZXR1cm4gdDtcbiAgdmFyIGUgPSB0W1N5bWJvbC50b1ByaW1pdGl2ZV07XG4gIGlmICh2b2lkIDAgIT09IGUpIHtcbiAgICB2YXIgaSA9IGUuY2FsbCh0LCByKTtcbiAgICBpZiAoXCJvYmplY3RcIiAhPSB0eXBlb2YgaSkgcmV0dXJuIGk7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuXCIpO1xuICB9XG4gIHJldHVybiAoU3RyaW5nICkodCk7XG59XG5mdW5jdGlvbiBfdG9Qcm9wZXJ0eUtleSh0KSB7XG4gIHZhciBpID0gX3RvUHJpbWl0aXZlKHQsIFwic3RyaW5nXCIpO1xuICByZXR1cm4gXCJzeW1ib2xcIiA9PSB0eXBlb2YgaSA/IGkgOiBpICsgXCJcIjtcbn1cbmZ1bmN0aW9uIF90eXBlb2Yobykge1xuICBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7XG5cbiAgcmV0dXJuIF90eXBlb2YgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBcInN5bWJvbFwiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAobykge1xuICAgIHJldHVybiB0eXBlb2YgbztcbiAgfSA6IGZ1bmN0aW9uIChvKSB7XG4gICAgcmV0dXJuIG8gJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgby5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG8gIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG87XG4gIH0sIF90eXBlb2Yobyk7XG59XG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkociwgYSkge1xuICBpZiAocikge1xuICAgIGlmIChcInN0cmluZ1wiID09IHR5cGVvZiByKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkociwgYSk7XG4gICAgdmFyIHQgPSB7fS50b1N0cmluZy5jYWxsKHIpLnNsaWNlKDgsIC0xKTtcbiAgICByZXR1cm4gXCJPYmplY3RcIiA9PT0gdCAmJiByLmNvbnN0cnVjdG9yICYmICh0ID0gci5jb25zdHJ1Y3Rvci5uYW1lKSwgXCJNYXBcIiA9PT0gdCB8fCBcIlNldFwiID09PSB0ID8gQXJyYXkuZnJvbShyKSA6IFwiQXJndW1lbnRzXCIgPT09IHQgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QodCkgPyBfYXJyYXlMaWtlVG9BcnJheShyLCBhKSA6IHZvaWQgMDtcbiAgfVxufVxuXG52YXIgX3dpbmRvdyA9IHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnID8gbnVsbCA6IHdpbmRvdzsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuXG52YXIgbmF2aWdhdG9yID0gX3dpbmRvdyA/IF93aW5kb3cubmF2aWdhdG9yIDogbnVsbDtcbl93aW5kb3cgPyBfd2luZG93LmRvY3VtZW50IDogbnVsbDtcbnZhciB0eXBlb2ZzdHIgPSBfdHlwZW9mKCcnKTtcbnZhciB0eXBlb2ZvYmogPSBfdHlwZW9mKHt9KTtcbnZhciB0eXBlb2ZmbiA9IF90eXBlb2YoZnVuY3Rpb24gKCkge30pO1xudmFyIHR5cGVvZmh0bWxlbGUgPSB0eXBlb2YgSFRNTEVsZW1lbnQgPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZihIVE1MRWxlbWVudCk7XG52YXIgaW5zdGFuY2VTdHIgPSBmdW5jdGlvbiBpbnN0YW5jZVN0cihvYmopIHtcbiAgcmV0dXJuIG9iaiAmJiBvYmouaW5zdGFuY2VTdHJpbmcgJiYgZm4kNihvYmouaW5zdGFuY2VTdHJpbmcpID8gb2JqLmluc3RhbmNlU3RyaW5nKCkgOiBudWxsO1xufTtcblxudmFyIHN0cmluZyA9IGZ1bmN0aW9uIHN0cmluZyhvYmopIHtcbiAgcmV0dXJuIG9iaiAhPSBudWxsICYmIF90eXBlb2Yob2JqKSA9PSB0eXBlb2ZzdHI7XG59O1xudmFyIGZuJDYgPSBmdW5jdGlvbiBmbihvYmopIHtcbiAgcmV0dXJuIG9iaiAhPSBudWxsICYmIF90eXBlb2Yob2JqKSA9PT0gdHlwZW9mZm47XG59O1xudmFyIGFycmF5ID0gZnVuY3Rpb24gYXJyYXkob2JqKSB7XG4gIHJldHVybiAhZWxlbWVudE9yQ29sbGVjdGlvbihvYmopICYmIChBcnJheS5pc0FycmF5ID8gQXJyYXkuaXNBcnJheShvYmopIDogb2JqICE9IG51bGwgJiYgb2JqIGluc3RhbmNlb2YgQXJyYXkpO1xufTtcbnZhciBwbGFpbk9iamVjdCA9IGZ1bmN0aW9uIHBsYWluT2JqZWN0KG9iaikge1xuICByZXR1cm4gb2JqICE9IG51bGwgJiYgX3R5cGVvZihvYmopID09PSB0eXBlb2ZvYmogJiYgIWFycmF5KG9iaikgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBPYmplY3Q7XG59O1xudmFyIG9iamVjdCA9IGZ1bmN0aW9uIG9iamVjdChvYmopIHtcbiAgcmV0dXJuIG9iaiAhPSBudWxsICYmIF90eXBlb2Yob2JqKSA9PT0gdHlwZW9mb2JqO1xufTtcbnZhciBudW1iZXIkMSA9IGZ1bmN0aW9uIG51bWJlcihvYmopIHtcbiAgcmV0dXJuIG9iaiAhPSBudWxsICYmIF90eXBlb2Yob2JqKSA9PT0gX3R5cGVvZigxKSAmJiAhaXNOYU4ob2JqKTtcbn07XG52YXIgaW50ZWdlciA9IGZ1bmN0aW9uIGludGVnZXIob2JqKSB7XG4gIHJldHVybiBudW1iZXIkMShvYmopICYmIE1hdGguZmxvb3Iob2JqKSA9PT0gb2JqO1xufTtcbnZhciBodG1sRWxlbWVudCA9IGZ1bmN0aW9uIGh0bWxFbGVtZW50KG9iaikge1xuICBpZiAoJ3VuZGVmaW5lZCcgPT09IHR5cGVvZmh0bWxlbGUpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBudWxsICE9IG9iaiAmJiBvYmogaW5zdGFuY2VvZiBIVE1MRWxlbWVudDtcbiAgfVxufTtcbnZhciBlbGVtZW50T3JDb2xsZWN0aW9uID0gZnVuY3Rpb24gZWxlbWVudE9yQ29sbGVjdGlvbihvYmopIHtcbiAgcmV0dXJuIGVsZW1lbnQob2JqKSB8fCBjb2xsZWN0aW9uKG9iaik7XG59O1xudmFyIGVsZW1lbnQgPSBmdW5jdGlvbiBlbGVtZW50KG9iaikge1xuICByZXR1cm4gaW5zdGFuY2VTdHIob2JqKSA9PT0gJ2NvbGxlY3Rpb24nICYmIG9iai5fcHJpdmF0ZS5zaW5nbGU7XG59O1xudmFyIGNvbGxlY3Rpb24gPSBmdW5jdGlvbiBjb2xsZWN0aW9uKG9iaikge1xuICByZXR1cm4gaW5zdGFuY2VTdHIob2JqKSA9PT0gJ2NvbGxlY3Rpb24nICYmICFvYmouX3ByaXZhdGUuc2luZ2xlO1xufTtcbnZhciBjb3JlID0gZnVuY3Rpb24gY29yZShvYmopIHtcbiAgcmV0dXJuIGluc3RhbmNlU3RyKG9iaikgPT09ICdjb3JlJztcbn07XG52YXIgc3R5bGVzaGVldCA9IGZ1bmN0aW9uIHN0eWxlc2hlZXQob2JqKSB7XG4gIHJldHVybiBpbnN0YW5jZVN0cihvYmopID09PSAnc3R5bGVzaGVldCc7XG59O1xudmFyIGV2ZW50ID0gZnVuY3Rpb24gZXZlbnQob2JqKSB7XG4gIHJldHVybiBpbnN0YW5jZVN0cihvYmopID09PSAnZXZlbnQnO1xufTtcbnZhciBlbXB0eVN0cmluZyA9IGZ1bmN0aW9uIGVtcHR5U3RyaW5nKG9iaikge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQgfHwgb2JqID09PSBudWxsKSB7XG4gICAgLy8gbnVsbCBpcyBlbXB0eVxuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2UgaWYgKG9iaiA9PT0gJycgfHwgb2JqLm1hdGNoKC9eXFxzKyQvKSkge1xuICAgIHJldHVybiB0cnVlOyAvLyBlbXB0eSBzdHJpbmcgaXMgZW1wdHlcbiAgfVxuICByZXR1cm4gZmFsc2U7IC8vIG90aGVyd2lzZSwgd2UgZG9uJ3Qga25vdyB3aGF0IHdlJ3ZlIGdvdFxufTtcbnZhciBkb21FbGVtZW50ID0gZnVuY3Rpb24gZG9tRWxlbWVudChvYmopIHtcbiAgaWYgKHR5cGVvZiBIVE1MRWxlbWVudCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZmFsc2U7IC8vIHdlJ3JlIG5vdCBpbiBhIGJyb3dzZXIgc28gaXQgZG9lc24ndCBtYXR0ZXJcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gb2JqIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQ7XG4gIH1cbn07XG52YXIgYm91bmRpbmdCb3ggPSBmdW5jdGlvbiBib3VuZGluZ0JveChvYmopIHtcbiAgcmV0dXJuIHBsYWluT2JqZWN0KG9iaikgJiYgbnVtYmVyJDEob2JqLngxKSAmJiBudW1iZXIkMShvYmoueDIpICYmIG51bWJlciQxKG9iai55MSkgJiYgbnVtYmVyJDEob2JqLnkyKTtcbn07XG52YXIgcHJvbWlzZSA9IGZ1bmN0aW9uIHByb21pc2Uob2JqKSB7XG4gIHJldHVybiBvYmplY3Qob2JqKSAmJiBmbiQ2KG9iai50aGVuKTtcbn07XG52YXIgbXMgPSBmdW5jdGlvbiBtcygpIHtcbiAgcmV0dXJuIG5hdmlnYXRvciAmJiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9tc2llfHRyaWRlbnR8ZWRnZS9pKTtcbn07IC8vIHByb2JhYmx5IGEgYmV0dGVyIHdheSB0byBkZXRlY3QgdGhpcy4uLlxuXG52YXIgbWVtb2l6ZSA9IGZ1bmN0aW9uIG1lbW9pemUoZm4sIGtleUZuKSB7XG4gIGlmICgha2V5Rm4pIHtcbiAgICBrZXlGbiA9IGZ1bmN0aW9uIGtleUZuKCkge1xuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGFyZ3VtZW50c1swXTtcbiAgICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gJ3VuZGVmaW5lZCc7XG4gICAgICB9XG4gICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJncy5qb2luKCckJyk7XG4gICAgfTtcbiAgfVxuICB2YXIgX21lbW9pemVkRm4gPSBmdW5jdGlvbiBtZW1vaXplZEZuKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICB2YXIgcmV0O1xuICAgIHZhciBrID0ga2V5Rm4uYXBwbHkoc2VsZiwgYXJncyk7XG4gICAgdmFyIGNhY2hlID0gX21lbW9pemVkRm4uY2FjaGU7XG4gICAgaWYgKCEocmV0ID0gY2FjaGVba10pKSB7XG4gICAgICByZXQgPSBjYWNoZVtrXSA9IGZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9O1xuICBfbWVtb2l6ZWRGbi5jYWNoZSA9IHt9O1xuICByZXR1cm4gX21lbW9pemVkRm47XG59O1xuXG52YXIgY2FtZWwyZGFzaCA9IG1lbW9pemUoZnVuY3Rpb24gKHN0cikge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbQS1aXSkvZywgZnVuY3Rpb24gKHYpIHtcbiAgICByZXR1cm4gJy0nICsgdi50b0xvd2VyQ2FzZSgpO1xuICB9KTtcbn0pO1xudmFyIGRhc2gyY2FtZWwgPSBtZW1vaXplKGZ1bmN0aW9uIChzdHIpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oLVxcdykvZywgZnVuY3Rpb24gKHYpIHtcbiAgICByZXR1cm4gdlsxXS50b1VwcGVyQ2FzZSgpO1xuICB9KTtcbn0pO1xudmFyIHByZXBlbmRDYW1lbCA9IG1lbW9pemUoZnVuY3Rpb24gKHByZWZpeCwgc3RyKSB7XG4gIHJldHVybiBwcmVmaXggKyBzdHJbMF0udG9VcHBlckNhc2UoKSArIHN0ci5zdWJzdHJpbmcoMSk7XG59LCBmdW5jdGlvbiAocHJlZml4LCBzdHIpIHtcbiAgcmV0dXJuIHByZWZpeCArICckJyArIHN0cjtcbn0pO1xudmFyIGNhcGl0YWxpemUgPSBmdW5jdGlvbiBjYXBpdGFsaXplKHN0cikge1xuICBpZiAoZW1wdHlTdHJpbmcoc3RyKSkge1xuICAgIHJldHVybiBzdHI7XG4gIH1cbiAgcmV0dXJuIHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zdWJzdHJpbmcoMSk7XG59O1xudmFyIGVuZHNXaXRoID0gZnVuY3Rpb24gZW5kc1dpdGgoc3RyaW5nLCBzdWZmaXgpIHtcbiAgcmV0dXJuIHN0cmluZy5zbGljZSgtMSAqIHN1ZmZpeC5sZW5ndGgpID09PSBzdWZmaXg7XG59O1xuXG52YXIgbnVtYmVyID0gJyg/OlstK10/KD86KD86XFxcXGQrfFxcXFxkKlxcXFwuXFxcXGQrKSg/OltFZV1bKy1dP1xcXFxkKyk/KSknO1xudmFyIHJnYmEgPSAncmdiW2FdP1xcXFwoKCcgKyBudW1iZXIgKyAnWyVdPylcXFxccyosXFxcXHMqKCcgKyBudW1iZXIgKyAnWyVdPylcXFxccyosXFxcXHMqKCcgKyBudW1iZXIgKyAnWyVdPykoPzpcXFxccyosXFxcXHMqKCcgKyBudW1iZXIgKyAnKSk/XFxcXCknO1xudmFyIHJnYmFOb0JhY2tSZWZzID0gJ3JnYlthXT9cXFxcKCg/OicgKyBudW1iZXIgKyAnWyVdPylcXFxccyosXFxcXHMqKD86JyArIG51bWJlciArICdbJV0/KVxcXFxzKixcXFxccyooPzonICsgbnVtYmVyICsgJ1slXT8pKD86XFxcXHMqLFxcXFxzKig/OicgKyBudW1iZXIgKyAnKSk/XFxcXCknO1xudmFyIGhzbGEgPSAnaHNsW2FdP1xcXFwoKCcgKyBudW1iZXIgKyAnKVxcXFxzKixcXFxccyooJyArIG51bWJlciArICdbJV0pXFxcXHMqLFxcXFxzKignICsgbnVtYmVyICsgJ1slXSkoPzpcXFxccyosXFxcXHMqKCcgKyBudW1iZXIgKyAnKSk/XFxcXCknO1xudmFyIGhzbGFOb0JhY2tSZWZzID0gJ2hzbFthXT9cXFxcKCg/OicgKyBudW1iZXIgKyAnKVxcXFxzKixcXFxccyooPzonICsgbnVtYmVyICsgJ1slXSlcXFxccyosXFxcXHMqKD86JyArIG51bWJlciArICdbJV0pKD86XFxcXHMqLFxcXFxzKig/OicgKyBudW1iZXIgKyAnKSk/XFxcXCknO1xudmFyIGhleDMgPSAnXFxcXCNbMC05YS1mQS1GXXszfSc7XG52YXIgaGV4NiA9ICdcXFxcI1swLTlhLWZBLUZdezZ9JztcblxudmFyIGFzY2VuZGluZyA9IGZ1bmN0aW9uIGFzY2VuZGluZyhhLCBiKSB7XG4gIGlmIChhIDwgYikge1xuICAgIHJldHVybiAtMTtcbiAgfSBlbHNlIGlmIChhID4gYikge1xuICAgIHJldHVybiAxO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAwO1xuICB9XG59O1xudmFyIGRlc2NlbmRpbmcgPSBmdW5jdGlvbiBkZXNjZW5kaW5nKGEsIGIpIHtcbiAgcmV0dXJuIC0xICogYXNjZW5kaW5nKGEsIGIpO1xufTtcblxudmFyIGV4dGVuZCA9IE9iamVjdC5hc3NpZ24gIT0gbnVsbCA/IE9iamVjdC5hc3NpZ24uYmluZChPYmplY3QpIDogZnVuY3Rpb24gKHRndCkge1xuICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG9iaiA9IGFyZ3NbaV07XG4gICAgaWYgKG9iaiA9PSBudWxsKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwga2V5cy5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIGsgPSBrZXlzW2pdO1xuICAgICAgdGd0W2tdID0gb2JqW2tdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGd0O1xufTtcblxuLy8gZ2V0IFtyLCBnLCBiXSBmcm9tICNhYmMgb3IgI2FhYmJjY1xudmFyIGhleDJ0dXBsZSA9IGZ1bmN0aW9uIGhleDJ0dXBsZShoZXgpIHtcbiAgaWYgKCEoaGV4Lmxlbmd0aCA9PT0gNCB8fCBoZXgubGVuZ3RoID09PSA3KSB8fCBoZXhbMF0gIT09ICcjJykge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgc2hvcnRIZXggPSBoZXgubGVuZ3RoID09PSA0O1xuICB2YXIgciwgZywgYjtcbiAgdmFyIGJhc2UgPSAxNjtcbiAgaWYgKHNob3J0SGV4KSB7XG4gICAgciA9IHBhcnNlSW50KGhleFsxXSArIGhleFsxXSwgYmFzZSk7XG4gICAgZyA9IHBhcnNlSW50KGhleFsyXSArIGhleFsyXSwgYmFzZSk7XG4gICAgYiA9IHBhcnNlSW50KGhleFszXSArIGhleFszXSwgYmFzZSk7XG4gIH0gZWxzZSB7XG4gICAgciA9IHBhcnNlSW50KGhleFsxXSArIGhleFsyXSwgYmFzZSk7XG4gICAgZyA9IHBhcnNlSW50KGhleFszXSArIGhleFs0XSwgYmFzZSk7XG4gICAgYiA9IHBhcnNlSW50KGhleFs1XSArIGhleFs2XSwgYmFzZSk7XG4gIH1cbiAgcmV0dXJuIFtyLCBnLCBiXTtcbn07XG5cbi8vIGdldCBbciwgZywgYiwgYV0gZnJvbSBoc2woMCwgMCwgMCkgb3IgaHNsYSgwLCAwLCAwLCAwKVxudmFyIGhzbDJ0dXBsZSA9IGZ1bmN0aW9uIGhzbDJ0dXBsZShoc2wpIHtcbiAgdmFyIHJldDtcbiAgdmFyIGgsIHMsIGwsIGEsIHIsIGcsIGI7XG4gIGZ1bmN0aW9uIGh1ZTJyZ2IocCwgcSwgdCkge1xuICAgIGlmICh0IDwgMCkgdCArPSAxO1xuICAgIGlmICh0ID4gMSkgdCAtPSAxO1xuICAgIGlmICh0IDwgMSAvIDYpIHJldHVybiBwICsgKHEgLSBwKSAqIDYgKiB0O1xuICAgIGlmICh0IDwgMSAvIDIpIHJldHVybiBxO1xuICAgIGlmICh0IDwgMiAvIDMpIHJldHVybiBwICsgKHEgLSBwKSAqICgyIC8gMyAtIHQpICogNjtcbiAgICByZXR1cm4gcDtcbiAgfVxuICB2YXIgbSA9IG5ldyBSZWdFeHAoJ14nICsgaHNsYSArICckJykuZXhlYyhoc2wpO1xuICBpZiAobSkge1xuICAgIC8vIGdldCBodWVcbiAgICBoID0gcGFyc2VJbnQobVsxXSk7XG4gICAgaWYgKGggPCAwKSB7XG4gICAgICBoID0gKDM2MCAtIC0xICogaCAlIDM2MCkgJSAzNjA7XG4gICAgfSBlbHNlIGlmIChoID4gMzYwKSB7XG4gICAgICBoID0gaCAlIDM2MDtcbiAgICB9XG4gICAgaCAvPSAzNjA7IC8vIG5vcm1hbGlzZSBvbiBbMCwgMV1cblxuICAgIHMgPSBwYXJzZUZsb2F0KG1bMl0pO1xuICAgIGlmIChzIDwgMCB8fCBzID4gMTAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBzYXR1cmF0aW9uIGlzIFswLCAxMDBdXG4gICAgcyA9IHMgLyAxMDA7IC8vIG5vcm1hbGlzZSBvbiBbMCwgMV1cblxuICAgIGwgPSBwYXJzZUZsb2F0KG1bM10pO1xuICAgIGlmIChsIDwgMCB8fCBsID4gMTAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBsaWdodG5lc3MgaXMgWzAsIDEwMF1cbiAgICBsID0gbCAvIDEwMDsgLy8gbm9ybWFsaXNlIG9uIFswLCAxXVxuXG4gICAgYSA9IG1bNF07XG4gICAgaWYgKGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYSA9IHBhcnNlRmxvYXQoYSk7XG4gICAgICBpZiAoYSA8IDAgfHwgYSA+IDEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyBhbHBoYSBpcyBbMCwgMV1cbiAgICB9XG5cbiAgICAvLyBub3csIGNvbnZlcnQgdG8gcmdiXG4gICAgLy8gY29kZSBmcm9tIGh0dHA6Ly9tamlqYWNrc29uLmNvbS8yMDA4LzAyL3JnYi10by1oc2wtYW5kLXJnYi10by1oc3YtY29sb3ItbW9kZWwtY29udmVyc2lvbi1hbGdvcml0aG1zLWluLWphdmFzY3JpcHRcbiAgICBpZiAocyA9PT0gMCkge1xuICAgICAgciA9IGcgPSBiID0gTWF0aC5yb3VuZChsICogMjU1KTsgLy8gYWNocm9tYXRpY1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgcSA9IGwgPCAwLjUgPyBsICogKDEgKyBzKSA6IGwgKyBzIC0gbCAqIHM7XG4gICAgICB2YXIgcCA9IDIgKiBsIC0gcTtcbiAgICAgIHIgPSBNYXRoLnJvdW5kKDI1NSAqIGh1ZTJyZ2IocCwgcSwgaCArIDEgLyAzKSk7XG4gICAgICBnID0gTWF0aC5yb3VuZCgyNTUgKiBodWUycmdiKHAsIHEsIGgpKTtcbiAgICAgIGIgPSBNYXRoLnJvdW5kKDI1NSAqIGh1ZTJyZ2IocCwgcSwgaCAtIDEgLyAzKSk7XG4gICAgfVxuICAgIHJldCA9IFtyLCBnLCBiLCBhXTtcbiAgfVxuICByZXR1cm4gcmV0O1xufTtcblxuLy8gZ2V0IFtyLCBnLCBiLCBhXSBmcm9tIHJnYigwLCAwLCAwKSBvciByZ2JhKDAsIDAsIDAsIDApXG52YXIgcmdiMnR1cGxlID0gZnVuY3Rpb24gcmdiMnR1cGxlKHJnYikge1xuICB2YXIgcmV0O1xuICB2YXIgbSA9IG5ldyBSZWdFeHAoJ14nICsgcmdiYSArICckJykuZXhlYyhyZ2IpO1xuICBpZiAobSkge1xuICAgIHJldCA9IFtdO1xuICAgIHZhciBpc1BjdCA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDw9IDM7IGkrKykge1xuICAgICAgdmFyIGNoYW5uZWwgPSBtW2ldO1xuICAgICAgaWYgKGNoYW5uZWxbY2hhbm5lbC5sZW5ndGggLSAxXSA9PT0gJyUnKSB7XG4gICAgICAgIGlzUGN0W2ldID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNoYW5uZWwgPSBwYXJzZUZsb2F0KGNoYW5uZWwpO1xuICAgICAgaWYgKGlzUGN0W2ldKSB7XG4gICAgICAgIGNoYW5uZWwgPSBjaGFubmVsIC8gMTAwICogMjU1OyAvLyBub3JtYWxpc2UgdG8gWzAsIDI1NV1cbiAgICAgIH1cbiAgICAgIGlmIChjaGFubmVsIDwgMCB8fCBjaGFubmVsID4gMjU1KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gaW52YWxpZCBjaGFubmVsIHZhbHVlXG5cbiAgICAgIHJldC5wdXNoKE1hdGguZmxvb3IoY2hhbm5lbCkpO1xuICAgIH1cbiAgICB2YXIgYXRMZWFzdE9uZUlzUGN0ID0gaXNQY3RbMV0gfHwgaXNQY3RbMl0gfHwgaXNQY3RbM107XG4gICAgdmFyIGFsbEFyZVBjdCA9IGlzUGN0WzFdICYmIGlzUGN0WzJdICYmIGlzUGN0WzNdO1xuICAgIGlmIChhdExlYXN0T25lSXNQY3QgJiYgIWFsbEFyZVBjdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gbXVzdCBhbGwgYmUgcGVyY2VudCB2YWx1ZXMgaWYgb25lIGlzXG5cbiAgICB2YXIgYWxwaGEgPSBtWzRdO1xuICAgIGlmIChhbHBoYSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhbHBoYSA9IHBhcnNlRmxvYXQoYWxwaGEpO1xuICAgICAgaWYgKGFscGhhIDwgMCB8fCBhbHBoYSA+IDEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyBpbnZhbGlkIGFscGhhIHZhbHVlXG5cbiAgICAgIHJldC5wdXNoKGFscGhhKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJldDtcbn07XG52YXIgY29sb3JuYW1lMnR1cGxlID0gZnVuY3Rpb24gY29sb3JuYW1lMnR1cGxlKGNvbG9yKSB7XG4gIHJldHVybiBjb2xvcnNbY29sb3IudG9Mb3dlckNhc2UoKV07XG59O1xudmFyIGNvbG9yMnR1cGxlID0gZnVuY3Rpb24gY29sb3IydHVwbGUoY29sb3IpIHtcbiAgcmV0dXJuIChhcnJheShjb2xvcikgPyBjb2xvciA6IG51bGwpIHx8IGNvbG9ybmFtZTJ0dXBsZShjb2xvcikgfHwgaGV4MnR1cGxlKGNvbG9yKSB8fCByZ2IydHVwbGUoY29sb3IpIHx8IGhzbDJ0dXBsZShjb2xvcik7XG59O1xudmFyIGNvbG9ycyA9IHtcbiAgLy8gc3BlY2lhbCBjb2xvdXIgbmFtZXNcbiAgdHJhbnNwYXJlbnQ6IFswLCAwLCAwLCAwXSxcbiAgLy8gTkIgYWxwaGEgPT09IDBcblxuICAvLyByZWd1bGFyIGNvbG91cnNcbiAgYWxpY2VibHVlOiBbMjQwLCAyNDgsIDI1NV0sXG4gIGFudGlxdWV3aGl0ZTogWzI1MCwgMjM1LCAyMTVdLFxuICBhcXVhOiBbMCwgMjU1LCAyNTVdLFxuICBhcXVhbWFyaW5lOiBbMTI3LCAyNTUsIDIxMl0sXG4gIGF6dXJlOiBbMjQwLCAyNTUsIDI1NV0sXG4gIGJlaWdlOiBbMjQ1LCAyNDUsIDIyMF0sXG4gIGJpc3F1ZTogWzI1NSwgMjI4LCAxOTZdLFxuICBibGFjazogWzAsIDAsIDBdLFxuICBibGFuY2hlZGFsbW9uZDogWzI1NSwgMjM1LCAyMDVdLFxuICBibHVlOiBbMCwgMCwgMjU1XSxcbiAgYmx1ZXZpb2xldDogWzEzOCwgNDMsIDIyNl0sXG4gIGJyb3duOiBbMTY1LCA0MiwgNDJdLFxuICBidXJseXdvb2Q6IFsyMjIsIDE4NCwgMTM1XSxcbiAgY2FkZXRibHVlOiBbOTUsIDE1OCwgMTYwXSxcbiAgY2hhcnRyZXVzZTogWzEyNywgMjU1LCAwXSxcbiAgY2hvY29sYXRlOiBbMjEwLCAxMDUsIDMwXSxcbiAgY29yYWw6IFsyNTUsIDEyNywgODBdLFxuICBjb3JuZmxvd2VyYmx1ZTogWzEwMCwgMTQ5LCAyMzddLFxuICBjb3Juc2lsazogWzI1NSwgMjQ4LCAyMjBdLFxuICBjcmltc29uOiBbMjIwLCAyMCwgNjBdLFxuICBjeWFuOiBbMCwgMjU1LCAyNTVdLFxuICBkYXJrYmx1ZTogWzAsIDAsIDEzOV0sXG4gIGRhcmtjeWFuOiBbMCwgMTM5LCAxMzldLFxuICBkYXJrZ29sZGVucm9kOiBbMTg0LCAxMzQsIDExXSxcbiAgZGFya2dyYXk6IFsxNjksIDE2OSwgMTY5XSxcbiAgZGFya2dyZWVuOiBbMCwgMTAwLCAwXSxcbiAgZGFya2dyZXk6IFsxNjksIDE2OSwgMTY5XSxcbiAgZGFya2toYWtpOiBbMTg5LCAxODMsIDEwN10sXG4gIGRhcmttYWdlbnRhOiBbMTM5LCAwLCAxMzldLFxuICBkYXJrb2xpdmVncmVlbjogWzg1LCAxMDcsIDQ3XSxcbiAgZGFya29yYW5nZTogWzI1NSwgMTQwLCAwXSxcbiAgZGFya29yY2hpZDogWzE1MywgNTAsIDIwNF0sXG4gIGRhcmtyZWQ6IFsxMzksIDAsIDBdLFxuICBkYXJrc2FsbW9uOiBbMjMzLCAxNTAsIDEyMl0sXG4gIGRhcmtzZWFncmVlbjogWzE0MywgMTg4LCAxNDNdLFxuICBkYXJrc2xhdGVibHVlOiBbNzIsIDYxLCAxMzldLFxuICBkYXJrc2xhdGVncmF5OiBbNDcsIDc5LCA3OV0sXG4gIGRhcmtzbGF0ZWdyZXk6IFs0NywgNzksIDc5XSxcbiAgZGFya3R1cnF1b2lzZTogWzAsIDIwNiwgMjA5XSxcbiAgZGFya3Zpb2xldDogWzE0OCwgMCwgMjExXSxcbiAgZGVlcHBpbms6IFsyNTUsIDIwLCAxNDddLFxuICBkZWVwc2t5Ymx1ZTogWzAsIDE5MSwgMjU1XSxcbiAgZGltZ3JheTogWzEwNSwgMTA1LCAxMDVdLFxuICBkaW1ncmV5OiBbMTA1LCAxMDUsIDEwNV0sXG4gIGRvZGdlcmJsdWU6IFszMCwgMTQ0LCAyNTVdLFxuICBmaXJlYnJpY2s6IFsxNzgsIDM0LCAzNF0sXG4gIGZsb3JhbHdoaXRlOiBbMjU1LCAyNTAsIDI0MF0sXG4gIGZvcmVzdGdyZWVuOiBbMzQsIDEzOSwgMzRdLFxuICBmdWNoc2lhOiBbMjU1LCAwLCAyNTVdLFxuICBnYWluc2Jvcm86IFsyMjAsIDIyMCwgMjIwXSxcbiAgZ2hvc3R3aGl0ZTogWzI0OCwgMjQ4LCAyNTVdLFxuICBnb2xkOiBbMjU1LCAyMTUsIDBdLFxuICBnb2xkZW5yb2Q6IFsyMTgsIDE2NSwgMzJdLFxuICBncmF5OiBbMTI4LCAxMjgsIDEyOF0sXG4gIGdyZXk6IFsxMjgsIDEyOCwgMTI4XSxcbiAgZ3JlZW46IFswLCAxMjgsIDBdLFxuICBncmVlbnllbGxvdzogWzE3MywgMjU1LCA0N10sXG4gIGhvbmV5ZGV3OiBbMjQwLCAyNTUsIDI0MF0sXG4gIGhvdHBpbms6IFsyNTUsIDEwNSwgMTgwXSxcbiAgaW5kaWFucmVkOiBbMjA1LCA5MiwgOTJdLFxuICBpbmRpZ286IFs3NSwgMCwgMTMwXSxcbiAgaXZvcnk6IFsyNTUsIDI1NSwgMjQwXSxcbiAga2hha2k6IFsyNDAsIDIzMCwgMTQwXSxcbiAgbGF2ZW5kZXI6IFsyMzAsIDIzMCwgMjUwXSxcbiAgbGF2ZW5kZXJibHVzaDogWzI1NSwgMjQwLCAyNDVdLFxuICBsYXduZ3JlZW46IFsxMjQsIDI1MiwgMF0sXG4gIGxlbW9uY2hpZmZvbjogWzI1NSwgMjUwLCAyMDVdLFxuICBsaWdodGJsdWU6IFsxNzMsIDIxNiwgMjMwXSxcbiAgbGlnaHRjb3JhbDogWzI0MCwgMTI4LCAxMjhdLFxuICBsaWdodGN5YW46IFsyMjQsIDI1NSwgMjU1XSxcbiAgbGlnaHRnb2xkZW5yb2R5ZWxsb3c6IFsyNTAsIDI1MCwgMjEwXSxcbiAgbGlnaHRncmF5OiBbMjExLCAyMTEsIDIxMV0sXG4gIGxpZ2h0Z3JlZW46IFsxNDQsIDIzOCwgMTQ0XSxcbiAgbGlnaHRncmV5OiBbMjExLCAyMTEsIDIxMV0sXG4gIGxpZ2h0cGluazogWzI1NSwgMTgyLCAxOTNdLFxuICBsaWdodHNhbG1vbjogWzI1NSwgMTYwLCAxMjJdLFxuICBsaWdodHNlYWdyZWVuOiBbMzIsIDE3OCwgMTcwXSxcbiAgbGlnaHRza3libHVlOiBbMTM1LCAyMDYsIDI1MF0sXG4gIGxpZ2h0c2xhdGVncmF5OiBbMTE5LCAxMzYsIDE1M10sXG4gIGxpZ2h0c2xhdGVncmV5OiBbMTE5LCAxMzYsIDE1M10sXG4gIGxpZ2h0c3RlZWxibHVlOiBbMTc2LCAxOTYsIDIyMl0sXG4gIGxpZ2h0eWVsbG93OiBbMjU1LCAyNTUsIDIyNF0sXG4gIGxpbWU6IFswLCAyNTUsIDBdLFxuICBsaW1lZ3JlZW46IFs1MCwgMjA1LCA1MF0sXG4gIGxpbmVuOiBbMjUwLCAyNDAsIDIzMF0sXG4gIG1hZ2VudGE6IFsyNTUsIDAsIDI1NV0sXG4gIG1hcm9vbjogWzEyOCwgMCwgMF0sXG4gIG1lZGl1bWFxdWFtYXJpbmU6IFsxMDIsIDIwNSwgMTcwXSxcbiAgbWVkaXVtYmx1ZTogWzAsIDAsIDIwNV0sXG4gIG1lZGl1bW9yY2hpZDogWzE4NiwgODUsIDIxMV0sXG4gIG1lZGl1bXB1cnBsZTogWzE0NywgMTEyLCAyMTldLFxuICBtZWRpdW1zZWFncmVlbjogWzYwLCAxNzksIDExM10sXG4gIG1lZGl1bXNsYXRlYmx1ZTogWzEyMywgMTA0LCAyMzhdLFxuICBtZWRpdW1zcHJpbmdncmVlbjogWzAsIDI1MCwgMTU0XSxcbiAgbWVkaXVtdHVycXVvaXNlOiBbNzIsIDIwOSwgMjA0XSxcbiAgbWVkaXVtdmlvbGV0cmVkOiBbMTk5LCAyMSwgMTMzXSxcbiAgbWlkbmlnaHRibHVlOiBbMjUsIDI1LCAxMTJdLFxuICBtaW50Y3JlYW06IFsyNDUsIDI1NSwgMjUwXSxcbiAgbWlzdHlyb3NlOiBbMjU1LCAyMjgsIDIyNV0sXG4gIG1vY2Nhc2luOiBbMjU1LCAyMjgsIDE4MV0sXG4gIG5hdmFqb3doaXRlOiBbMjU1LCAyMjIsIDE3M10sXG4gIG5hdnk6IFswLCAwLCAxMjhdLFxuICBvbGRsYWNlOiBbMjUzLCAyNDUsIDIzMF0sXG4gIG9saXZlOiBbMTI4LCAxMjgsIDBdLFxuICBvbGl2ZWRyYWI6IFsxMDcsIDE0MiwgMzVdLFxuICBvcmFuZ2U6IFsyNTUsIDE2NSwgMF0sXG4gIG9yYW5nZXJlZDogWzI1NSwgNjksIDBdLFxuICBvcmNoaWQ6IFsyMTgsIDExMiwgMjE0XSxcbiAgcGFsZWdvbGRlbnJvZDogWzIzOCwgMjMyLCAxNzBdLFxuICBwYWxlZ3JlZW46IFsxNTIsIDI1MSwgMTUyXSxcbiAgcGFsZXR1cnF1b2lzZTogWzE3NSwgMjM4LCAyMzhdLFxuICBwYWxldmlvbGV0cmVkOiBbMjE5LCAxMTIsIDE0N10sXG4gIHBhcGF5YXdoaXA6IFsyNTUsIDIzOSwgMjEzXSxcbiAgcGVhY2hwdWZmOiBbMjU1LCAyMTgsIDE4NV0sXG4gIHBlcnU6IFsyMDUsIDEzMywgNjNdLFxuICBwaW5rOiBbMjU1LCAxOTIsIDIwM10sXG4gIHBsdW06IFsyMjEsIDE2MCwgMjIxXSxcbiAgcG93ZGVyYmx1ZTogWzE3NiwgMjI0LCAyMzBdLFxuICBwdXJwbGU6IFsxMjgsIDAsIDEyOF0sXG4gIHJlZDogWzI1NSwgMCwgMF0sXG4gIHJvc3licm93bjogWzE4OCwgMTQzLCAxNDNdLFxuICByb3lhbGJsdWU6IFs2NSwgMTA1LCAyMjVdLFxuICBzYWRkbGVicm93bjogWzEzOSwgNjksIDE5XSxcbiAgc2FsbW9uOiBbMjUwLCAxMjgsIDExNF0sXG4gIHNhbmR5YnJvd246IFsyNDQsIDE2NCwgOTZdLFxuICBzZWFncmVlbjogWzQ2LCAxMzksIDg3XSxcbiAgc2Vhc2hlbGw6IFsyNTUsIDI0NSwgMjM4XSxcbiAgc2llbm5hOiBbMTYwLCA4MiwgNDVdLFxuICBzaWx2ZXI6IFsxOTIsIDE5MiwgMTkyXSxcbiAgc2t5Ymx1ZTogWzEzNSwgMjA2LCAyMzVdLFxuICBzbGF0ZWJsdWU6IFsxMDYsIDkwLCAyMDVdLFxuICBzbGF0ZWdyYXk6IFsxMTIsIDEyOCwgMTQ0XSxcbiAgc2xhdGVncmV5OiBbMTEyLCAxMjgsIDE0NF0sXG4gIHNub3c6IFsyNTUsIDI1MCwgMjUwXSxcbiAgc3ByaW5nZ3JlZW46IFswLCAyNTUsIDEyN10sXG4gIHN0ZWVsYmx1ZTogWzcwLCAxMzAsIDE4MF0sXG4gIHRhbjogWzIxMCwgMTgwLCAxNDBdLFxuICB0ZWFsOiBbMCwgMTI4LCAxMjhdLFxuICB0aGlzdGxlOiBbMjE2LCAxOTEsIDIxNl0sXG4gIHRvbWF0bzogWzI1NSwgOTksIDcxXSxcbiAgdHVycXVvaXNlOiBbNjQsIDIyNCwgMjA4XSxcbiAgdmlvbGV0OiBbMjM4LCAxMzAsIDIzOF0sXG4gIHdoZWF0OiBbMjQ1LCAyMjIsIDE3OV0sXG4gIHdoaXRlOiBbMjU1LCAyNTUsIDI1NV0sXG4gIHdoaXRlc21va2U6IFsyNDUsIDI0NSwgMjQ1XSxcbiAgeWVsbG93OiBbMjU1LCAyNTUsIDBdLFxuICB5ZWxsb3dncmVlbjogWzE1NCwgMjA1LCA1MF1cbn07XG5cbi8vIHNldHMgdGhlIHZhbHVlIGluIGEgbWFwIChtYXAgbWF5IG5vdCBiZSBidWlsdClcbnZhciBzZXRNYXAgPSBmdW5jdGlvbiBzZXRNYXAob3B0aW9ucykge1xuICB2YXIgb2JqID0gb3B0aW9ucy5tYXA7XG4gIHZhciBrZXlzID0gb3B0aW9ucy5rZXlzO1xuICB2YXIgbCA9IGtleXMubGVuZ3RoO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGw7IGkrKykge1xuICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgIGlmIChwbGFpbk9iamVjdChrZXkpKSB7XG4gICAgICB0aHJvdyBFcnJvcignVHJpZWQgdG8gc2V0IG1hcCB3aXRoIG9iamVjdCBrZXknKTtcbiAgICB9XG4gICAgaWYgKGkgPCBrZXlzLmxlbmd0aCAtIDEpIHtcbiAgICAgIC8vIGV4dGVuZCB0aGUgbWFwIGlmIG5lY2Vzc2FyeVxuICAgICAgaWYgKG9ialtrZXldID09IG51bGwpIHtcbiAgICAgICAgb2JqW2tleV0gPSB7fTtcbiAgICAgIH1cbiAgICAgIG9iaiA9IG9ialtrZXldO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBzZXQgdGhlIHZhbHVlXG4gICAgICBvYmpba2V5XSA9IG9wdGlvbnMudmFsdWU7XG4gICAgfVxuICB9XG59O1xuXG4vLyBnZXRzIHRoZSB2YWx1ZSBpbiBhIG1hcCBldmVuIGlmIGl0J3Mgbm90IGJ1aWx0IGluIHBsYWNlc1xudmFyIGdldE1hcCA9IGZ1bmN0aW9uIGdldE1hcChvcHRpb25zKSB7XG4gIHZhciBvYmogPSBvcHRpb25zLm1hcDtcbiAgdmFyIGtleXMgPSBvcHRpb25zLmtleXM7XG4gIHZhciBsID0ga2V5cy5sZW5ndGg7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7XG4gICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgaWYgKHBsYWluT2JqZWN0KGtleSkpIHtcbiAgICAgIHRocm93IEVycm9yKCdUcmllZCB0byBnZXQgbWFwIHdpdGggb2JqZWN0IGtleScpO1xuICAgIH1cbiAgICBvYmogPSBvYmpba2V5XTtcbiAgICBpZiAob2JqID09IG51bGwpIHtcbiAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuICB9XG4gIHJldHVybiBvYmo7XG59O1xuXG52YXIgY29tbW9uanNHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWxUaGlzIDogdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB7fTtcblxuZnVuY3Rpb24gZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMgKHgpIHtcblx0cmV0dXJuIHggJiYgeC5fX2VzTW9kdWxlICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCAnZGVmYXVsdCcpID8geFsnZGVmYXVsdCddIDogeDtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyB0aGVcbiAqIFtsYW5ndWFnZSB0eXBlXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcylcbiAqIG9mIGBPYmplY3RgLiAoZS5nLiBhcnJheXMsIGZ1bmN0aW9ucywgb2JqZWN0cywgcmVnZXhlcywgYG5ldyBOdW1iZXIoMClgLCBhbmQgYG5ldyBTdHJpbmcoJycpYClcbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdCh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoXy5ub29wKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuXG52YXIgaXNPYmplY3RfMTtcbnZhciBoYXNSZXF1aXJlZElzT2JqZWN0O1xuXG5mdW5jdGlvbiByZXF1aXJlSXNPYmplY3QgKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRJc09iamVjdCkgcmV0dXJuIGlzT2JqZWN0XzE7XG5cdGhhc1JlcXVpcmVkSXNPYmplY3QgPSAxO1xuXHRmdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuXHQgIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuXHQgIHJldHVybiB2YWx1ZSAhPSBudWxsICYmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJyk7XG5cdH1cblxuXHRpc09iamVjdF8xID0gaXNPYmplY3Q7XG5cdHJldHVybiBpc09iamVjdF8xO1xufVxuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGdsb2JhbGAgZnJvbSBOb2RlLmpzLiAqL1xuXG52YXIgX2ZyZWVHbG9iYWw7XG52YXIgaGFzUmVxdWlyZWRfZnJlZUdsb2JhbDtcblxuZnVuY3Rpb24gcmVxdWlyZV9mcmVlR2xvYmFsICgpIHtcblx0aWYgKGhhc1JlcXVpcmVkX2ZyZWVHbG9iYWwpIHJldHVybiBfZnJlZUdsb2JhbDtcblx0aGFzUmVxdWlyZWRfZnJlZUdsb2JhbCA9IDE7XG5cdHZhciBmcmVlR2xvYmFsID0gdHlwZW9mIGNvbW1vbmpzR2xvYmFsID09ICdvYmplY3QnICYmIGNvbW1vbmpzR2xvYmFsICYmIGNvbW1vbmpzR2xvYmFsLk9iamVjdCA9PT0gT2JqZWN0ICYmIGNvbW1vbmpzR2xvYmFsO1xuXG5cdF9mcmVlR2xvYmFsID0gZnJlZUdsb2JhbDtcblx0cmV0dXJuIF9mcmVlR2xvYmFsO1xufVxuXG52YXIgX3Jvb3Q7XG52YXIgaGFzUmVxdWlyZWRfcm9vdDtcblxuZnVuY3Rpb24gcmVxdWlyZV9yb290ICgpIHtcblx0aWYgKGhhc1JlcXVpcmVkX3Jvb3QpIHJldHVybiBfcm9vdDtcblx0aGFzUmVxdWlyZWRfcm9vdCA9IDE7XG5cdHZhciBmcmVlR2xvYmFsID0gcmVxdWlyZV9mcmVlR2xvYmFsKCk7XG5cblx0LyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBzZWxmYC4gKi9cblx0dmFyIGZyZWVTZWxmID0gdHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZiAmJiBzZWxmLk9iamVjdCA9PT0gT2JqZWN0ICYmIHNlbGY7XG5cblx0LyoqIFVzZWQgYXMgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBvYmplY3QuICovXG5cdHZhciByb290ID0gZnJlZUdsb2JhbCB8fCBmcmVlU2VsZiB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG5cdF9yb290ID0gcm9vdDtcblx0cmV0dXJuIF9yb290O1xufVxuXG52YXIgbm93XzE7XG52YXIgaGFzUmVxdWlyZWROb3c7XG5cbmZ1bmN0aW9uIHJlcXVpcmVOb3cgKCkge1xuXHRpZiAoaGFzUmVxdWlyZWROb3cpIHJldHVybiBub3dfMTtcblx0aGFzUmVxdWlyZWROb3cgPSAxO1xuXHR2YXIgcm9vdCA9IHJlcXVpcmVfcm9vdCgpO1xuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSB0aW1lc3RhbXAgb2YgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhhdCBoYXZlIGVsYXBzZWQgc2luY2Vcblx0ICogdGhlIFVuaXggZXBvY2ggKDEgSmFudWFyeSAxOTcwIDAwOjAwOjAwIFVUQykuXG5cdCAqXG5cdCAqIEBzdGF0aWNcblx0ICogQG1lbWJlck9mIF9cblx0ICogQHNpbmNlIDIuNC4wXG5cdCAqIEBjYXRlZ29yeSBEYXRlXG5cdCAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHRpbWVzdGFtcC5cblx0ICogQGV4YW1wbGVcblx0ICpcblx0ICogXy5kZWZlcihmdW5jdGlvbihzdGFtcCkge1xuXHQgKiAgIGNvbnNvbGUubG9nKF8ubm93KCkgLSBzdGFtcCk7XG5cdCAqIH0sIF8ubm93KCkpO1xuXHQgKiAvLyA9PiBMb2dzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGl0IHRvb2sgZm9yIHRoZSBkZWZlcnJlZCBpbnZvY2F0aW9uLlxuXHQgKi9cblx0dmFyIG5vdyA9IGZ1bmN0aW9uKCkge1xuXHQgIHJldHVybiByb290LkRhdGUubm93KCk7XG5cdH07XG5cblx0bm93XzEgPSBub3c7XG5cdHJldHVybiBub3dfMTtcbn1cblxuLyoqIFVzZWQgdG8gbWF0Y2ggYSBzaW5nbGUgd2hpdGVzcGFjZSBjaGFyYWN0ZXIuICovXG5cbnZhciBfdHJpbW1lZEVuZEluZGV4O1xudmFyIGhhc1JlcXVpcmVkX3RyaW1tZWRFbmRJbmRleDtcblxuZnVuY3Rpb24gcmVxdWlyZV90cmltbWVkRW5kSW5kZXggKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRfdHJpbW1lZEVuZEluZGV4KSByZXR1cm4gX3RyaW1tZWRFbmRJbmRleDtcblx0aGFzUmVxdWlyZWRfdHJpbW1lZEVuZEluZGV4ID0gMTtcblx0dmFyIHJlV2hpdGVzcGFjZSA9IC9cXHMvO1xuXG5cdC8qKlxuXHQgKiBVc2VkIGJ5IGBfLnRyaW1gIGFuZCBgXy50cmltRW5kYCB0byBnZXQgdGhlIGluZGV4IG9mIHRoZSBsYXN0IG5vbi13aGl0ZXNwYWNlXG5cdCAqIGNoYXJhY3RlciBvZiBgc3RyaW5nYC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG5cdCAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlci5cblx0ICovXG5cdGZ1bmN0aW9uIHRyaW1tZWRFbmRJbmRleChzdHJpbmcpIHtcblx0ICB2YXIgaW5kZXggPSBzdHJpbmcubGVuZ3RoO1xuXG5cdCAgd2hpbGUgKGluZGV4LS0gJiYgcmVXaGl0ZXNwYWNlLnRlc3Qoc3RyaW5nLmNoYXJBdChpbmRleCkpKSB7fVxuXHQgIHJldHVybiBpbmRleDtcblx0fVxuXG5cdF90cmltbWVkRW5kSW5kZXggPSB0cmltbWVkRW5kSW5kZXg7XG5cdHJldHVybiBfdHJpbW1lZEVuZEluZGV4O1xufVxuXG52YXIgX2Jhc2VUcmltO1xudmFyIGhhc1JlcXVpcmVkX2Jhc2VUcmltO1xuXG5mdW5jdGlvbiByZXF1aXJlX2Jhc2VUcmltICgpIHtcblx0aWYgKGhhc1JlcXVpcmVkX2Jhc2VUcmltKSByZXR1cm4gX2Jhc2VUcmltO1xuXHRoYXNSZXF1aXJlZF9iYXNlVHJpbSA9IDE7XG5cdHZhciB0cmltbWVkRW5kSW5kZXggPSByZXF1aXJlX3RyaW1tZWRFbmRJbmRleCgpO1xuXG5cdC8qKiBVc2VkIHRvIG1hdGNoIGxlYWRpbmcgd2hpdGVzcGFjZS4gKi9cblx0dmFyIHJlVHJpbVN0YXJ0ID0gL15cXHMrLztcblxuXHQvKipcblx0ICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udHJpbWAuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byB0cmltLlxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB0cmltbWVkIHN0cmluZy5cblx0ICovXG5cdGZ1bmN0aW9uIGJhc2VUcmltKHN0cmluZykge1xuXHQgIHJldHVybiBzdHJpbmdcblx0ICAgID8gc3RyaW5nLnNsaWNlKDAsIHRyaW1tZWRFbmRJbmRleChzdHJpbmcpICsgMSkucmVwbGFjZShyZVRyaW1TdGFydCwgJycpXG5cdCAgICA6IHN0cmluZztcblx0fVxuXG5cdF9iYXNlVHJpbSA9IGJhc2VUcmltO1xuXHRyZXR1cm4gX2Jhc2VUcmltO1xufVxuXG52YXIgX1N5bWJvbDtcbnZhciBoYXNSZXF1aXJlZF9TeW1ib2w7XG5cbmZ1bmN0aW9uIHJlcXVpcmVfU3ltYm9sICgpIHtcblx0aWYgKGhhc1JlcXVpcmVkX1N5bWJvbCkgcmV0dXJuIF9TeW1ib2w7XG5cdGhhc1JlcXVpcmVkX1N5bWJvbCA9IDE7XG5cdHZhciByb290ID0gcmVxdWlyZV9yb290KCk7XG5cblx0LyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG5cdHZhciBTeW1ib2wgPSByb290LlN5bWJvbDtcblxuXHRfU3ltYm9sID0gU3ltYm9sO1xuXHRyZXR1cm4gX1N5bWJvbDtcbn1cblxudmFyIF9nZXRSYXdUYWc7XG52YXIgaGFzUmVxdWlyZWRfZ2V0UmF3VGFnO1xuXG5mdW5jdGlvbiByZXF1aXJlX2dldFJhd1RhZyAoKSB7XG5cdGlmIChoYXNSZXF1aXJlZF9nZXRSYXdUYWcpIHJldHVybiBfZ2V0UmF3VGFnO1xuXHRoYXNSZXF1aXJlZF9nZXRSYXdUYWcgPSAxO1xuXHR2YXIgU3ltYm9sID0gcmVxdWlyZV9TeW1ib2woKTtcblxuXHQvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG5cdHZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cblx0LyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG5cdHZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG5cdC8qKlxuXHQgKiBVc2VkIHRvIHJlc29sdmUgdGhlXG5cdCAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuXHQgKiBvZiB2YWx1ZXMuXG5cdCAqL1xuXHR2YXIgbmF0aXZlT2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuXHQvKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cblx0dmFyIHN5bVRvU3RyaW5nVGFnID0gU3ltYm9sID8gU3ltYm9sLnRvU3RyaW5nVGFnIDogdW5kZWZpbmVkO1xuXG5cdC8qKlxuXHQgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VHZXRUYWdgIHdoaWNoIGlnbm9yZXMgYFN5bWJvbC50b1N0cmluZ1RhZ2AgdmFsdWVzLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cblx0ICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcmF3IGB0b1N0cmluZ1RhZ2AuXG5cdCAqL1xuXHRmdW5jdGlvbiBnZXRSYXdUYWcodmFsdWUpIHtcblx0ICB2YXIgaXNPd24gPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBzeW1Ub1N0cmluZ1RhZyksXG5cdCAgICAgIHRhZyA9IHZhbHVlW3N5bVRvU3RyaW5nVGFnXTtcblxuXHQgIHRyeSB7XG5cdCAgICB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ10gPSB1bmRlZmluZWQ7XG5cdCAgICB2YXIgdW5tYXNrZWQgPSB0cnVlO1xuXHQgIH0gY2F0Y2ggKGUpIHt9XG5cblx0ICB2YXIgcmVzdWx0ID0gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG5cdCAgaWYgKHVubWFza2VkKSB7XG5cdCAgICBpZiAoaXNPd24pIHtcblx0ICAgICAgdmFsdWVbc3ltVG9TdHJpbmdUYWddID0gdGFnO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgZGVsZXRlIHZhbHVlW3N5bVRvU3RyaW5nVGFnXTtcblx0ICAgIH1cblx0ICB9XG5cdCAgcmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdF9nZXRSYXdUYWcgPSBnZXRSYXdUYWc7XG5cdHJldHVybiBfZ2V0UmF3VGFnO1xufVxuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG5cbnZhciBfb2JqZWN0VG9TdHJpbmc7XG52YXIgaGFzUmVxdWlyZWRfb2JqZWN0VG9TdHJpbmc7XG5cbmZ1bmN0aW9uIHJlcXVpcmVfb2JqZWN0VG9TdHJpbmcgKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRfb2JqZWN0VG9TdHJpbmcpIHJldHVybiBfb2JqZWN0VG9TdHJpbmc7XG5cdGhhc1JlcXVpcmVkX29iamVjdFRvU3RyaW5nID0gMTtcblx0dmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuXHQvKipcblx0ICogVXNlZCB0byByZXNvbHZlIHRoZVxuXHQgKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcblx0ICogb2YgdmFsdWVzLlxuXHQgKi9cblx0dmFyIG5hdGl2ZU9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcgdXNpbmcgYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLlxuXHQgKi9cblx0ZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcodmFsdWUpIHtcblx0ICByZXR1cm4gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG5cdH1cblxuXHRfb2JqZWN0VG9TdHJpbmcgPSBvYmplY3RUb1N0cmluZztcblx0cmV0dXJuIF9vYmplY3RUb1N0cmluZztcbn1cblxudmFyIF9iYXNlR2V0VGFnO1xudmFyIGhhc1JlcXVpcmVkX2Jhc2VHZXRUYWc7XG5cbmZ1bmN0aW9uIHJlcXVpcmVfYmFzZUdldFRhZyAoKSB7XG5cdGlmIChoYXNSZXF1aXJlZF9iYXNlR2V0VGFnKSByZXR1cm4gX2Jhc2VHZXRUYWc7XG5cdGhhc1JlcXVpcmVkX2Jhc2VHZXRUYWcgPSAxO1xuXHR2YXIgU3ltYm9sID0gcmVxdWlyZV9TeW1ib2woKSxcblx0ICAgIGdldFJhd1RhZyA9IHJlcXVpcmVfZ2V0UmF3VGFnKCksXG5cdCAgICBvYmplY3RUb1N0cmluZyA9IHJlcXVpcmVfb2JqZWN0VG9TdHJpbmcoKTtcblxuXHQvKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG5cdHZhciBudWxsVGFnID0gJ1tvYmplY3QgTnVsbF0nLFxuXHQgICAgdW5kZWZpbmVkVGFnID0gJ1tvYmplY3QgVW5kZWZpbmVkXSc7XG5cblx0LyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG5cdHZhciBzeW1Ub1N0cmluZ1RhZyA9IFN5bWJvbCA/IFN5bWJvbC50b1N0cmluZ1RhZyA6IHVuZGVmaW5lZDtcblxuXHQvKipcblx0ICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGdldFRhZ2Agd2l0aG91dCBmYWxsYmFja3MgZm9yIGJ1Z2d5IGVudmlyb25tZW50cy5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGB0b1N0cmluZ1RhZ2AuXG5cdCAqL1xuXHRmdW5jdGlvbiBiYXNlR2V0VGFnKHZhbHVlKSB7XG5cdCAgaWYgKHZhbHVlID09IG51bGwpIHtcblx0ICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkVGFnIDogbnVsbFRhZztcblx0ICB9XG5cdCAgcmV0dXJuIChzeW1Ub1N0cmluZ1RhZyAmJiBzeW1Ub1N0cmluZ1RhZyBpbiBPYmplY3QodmFsdWUpKVxuXHQgICAgPyBnZXRSYXdUYWcodmFsdWUpXG5cdCAgICA6IG9iamVjdFRvU3RyaW5nKHZhbHVlKTtcblx0fVxuXG5cdF9iYXNlR2V0VGFnID0gYmFzZUdldFRhZztcblx0cmV0dXJuIF9iYXNlR2V0VGFnO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuXG52YXIgaXNPYmplY3RMaWtlXzE7XG52YXIgaGFzUmVxdWlyZWRJc09iamVjdExpa2U7XG5cbmZ1bmN0aW9uIHJlcXVpcmVJc09iamVjdExpa2UgKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRJc09iamVjdExpa2UpIHJldHVybiBpc09iamVjdExpa2VfMTtcblx0aGFzUmVxdWlyZWRJc09iamVjdExpa2UgPSAxO1xuXHRmdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcblx0ICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCc7XG5cdH1cblxuXHRpc09iamVjdExpa2VfMSA9IGlzT2JqZWN0TGlrZTtcblx0cmV0dXJuIGlzT2JqZWN0TGlrZV8xO1xufVxuXG52YXIgaXNTeW1ib2xfMTtcbnZhciBoYXNSZXF1aXJlZElzU3ltYm9sO1xuXG5mdW5jdGlvbiByZXF1aXJlSXNTeW1ib2wgKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRJc1N5bWJvbCkgcmV0dXJuIGlzU3ltYm9sXzE7XG5cdGhhc1JlcXVpcmVkSXNTeW1ib2wgPSAxO1xuXHR2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmVfYmFzZUdldFRhZygpLFxuXHQgICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZUlzT2JqZWN0TGlrZSgpO1xuXG5cdC8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cblx0dmFyIHN5bWJvbFRhZyA9ICdbb2JqZWN0IFN5bWJvbF0nO1xuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN5bWJvbGAgcHJpbWl0aXZlIG9yIG9iamVjdC5cblx0ICpcblx0ICogQHN0YXRpY1xuXHQgKiBAbWVtYmVyT2YgX1xuXHQgKiBAc2luY2UgNC4wLjBcblx0ICogQGNhdGVnb3J5IExhbmdcblx0ICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG5cdCAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3ltYm9sLCBlbHNlIGBmYWxzZWAuXG5cdCAqIEBleGFtcGxlXG5cdCAqXG5cdCAqIF8uaXNTeW1ib2woU3ltYm9sLml0ZXJhdG9yKTtcblx0ICogLy8gPT4gdHJ1ZVxuXHQgKlxuXHQgKiBfLmlzU3ltYm9sKCdhYmMnKTtcblx0ICogLy8gPT4gZmFsc2Vcblx0ICovXG5cdGZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7XG5cdCAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3ltYm9sJyB8fFxuXHQgICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gc3ltYm9sVGFnKTtcblx0fVxuXG5cdGlzU3ltYm9sXzEgPSBpc1N5bWJvbDtcblx0cmV0dXJuIGlzU3ltYm9sXzE7XG59XG5cbnZhciB0b051bWJlcl8xO1xudmFyIGhhc1JlcXVpcmVkVG9OdW1iZXI7XG5cbmZ1bmN0aW9uIHJlcXVpcmVUb051bWJlciAoKSB7XG5cdGlmIChoYXNSZXF1aXJlZFRvTnVtYmVyKSByZXR1cm4gdG9OdW1iZXJfMTtcblx0aGFzUmVxdWlyZWRUb051bWJlciA9IDE7XG5cdHZhciBiYXNlVHJpbSA9IHJlcXVpcmVfYmFzZVRyaW0oKSxcblx0ICAgIGlzT2JqZWN0ID0gcmVxdWlyZUlzT2JqZWN0KCksXG5cdCAgICBpc1N5bWJvbCA9IHJlcXVpcmVJc1N5bWJvbCgpO1xuXG5cdC8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xuXHR2YXIgTkFOID0gMCAvIDA7XG5cblx0LyoqIFVzZWQgdG8gZGV0ZWN0IGJhZCBzaWduZWQgaGV4YWRlY2ltYWwgc3RyaW5nIHZhbHVlcy4gKi9cblx0dmFyIHJlSXNCYWRIZXggPSAvXlstK10weFswLTlhLWZdKyQvaTtcblxuXHQvKiogVXNlZCB0byBkZXRlY3QgYmluYXJ5IHN0cmluZyB2YWx1ZXMuICovXG5cdHZhciByZUlzQmluYXJ5ID0gL14wYlswMV0rJC9pO1xuXG5cdC8qKiBVc2VkIHRvIGRldGVjdCBvY3RhbCBzdHJpbmcgdmFsdWVzLiAqL1xuXHR2YXIgcmVJc09jdGFsID0gL14wb1swLTddKyQvaTtcblxuXHQvKiogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgd2l0aG91dCBhIGRlcGVuZGVuY3kgb24gYHJvb3RgLiAqL1xuXHR2YXIgZnJlZVBhcnNlSW50ID0gcGFyc2VJbnQ7XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBudW1iZXIuXG5cdCAqXG5cdCAqIEBzdGF0aWNcblx0ICogQG1lbWJlck9mIF9cblx0ICogQHNpbmNlIDQuMC4wXG5cdCAqIEBjYXRlZ29yeSBMYW5nXG5cdCAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG5cdCAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG51bWJlci5cblx0ICogQGV4YW1wbGVcblx0ICpcblx0ICogXy50b051bWJlcigzLjIpO1xuXHQgKiAvLyA9PiAzLjJcblx0ICpcblx0ICogXy50b051bWJlcihOdW1iZXIuTUlOX1ZBTFVFKTtcblx0ICogLy8gPT4gNWUtMzI0XG5cdCAqXG5cdCAqIF8udG9OdW1iZXIoSW5maW5pdHkpO1xuXHQgKiAvLyA9PiBJbmZpbml0eVxuXHQgKlxuXHQgKiBfLnRvTnVtYmVyKCczLjInKTtcblx0ICogLy8gPT4gMy4yXG5cdCAqL1xuXHRmdW5jdGlvbiB0b051bWJlcih2YWx1ZSkge1xuXHQgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicpIHtcblx0ICAgIHJldHVybiB2YWx1ZTtcblx0ICB9XG5cdCAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuXHQgICAgcmV0dXJuIE5BTjtcblx0ICB9XG5cdCAgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuXHQgICAgdmFyIG90aGVyID0gdHlwZW9mIHZhbHVlLnZhbHVlT2YgPT0gJ2Z1bmN0aW9uJyA/IHZhbHVlLnZhbHVlT2YoKSA6IHZhbHVlO1xuXHQgICAgdmFsdWUgPSBpc09iamVjdChvdGhlcikgPyAob3RoZXIgKyAnJykgOiBvdGhlcjtcblx0ICB9XG5cdCAgaWYgKHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykge1xuXHQgICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiArdmFsdWU7XG5cdCAgfVxuXHQgIHZhbHVlID0gYmFzZVRyaW0odmFsdWUpO1xuXHQgIHZhciBpc0JpbmFyeSA9IHJlSXNCaW5hcnkudGVzdCh2YWx1ZSk7XG5cdCAgcmV0dXJuIChpc0JpbmFyeSB8fCByZUlzT2N0YWwudGVzdCh2YWx1ZSkpXG5cdCAgICA/IGZyZWVQYXJzZUludCh2YWx1ZS5zbGljZSgyKSwgaXNCaW5hcnkgPyAyIDogOClcblx0ICAgIDogKHJlSXNCYWRIZXgudGVzdCh2YWx1ZSkgPyBOQU4gOiArdmFsdWUpO1xuXHR9XG5cblx0dG9OdW1iZXJfMSA9IHRvTnVtYmVyO1xuXHRyZXR1cm4gdG9OdW1iZXJfMTtcbn1cblxudmFyIGRlYm91bmNlXzE7XG52YXIgaGFzUmVxdWlyZWREZWJvdW5jZTtcblxuZnVuY3Rpb24gcmVxdWlyZURlYm91bmNlICgpIHtcblx0aWYgKGhhc1JlcXVpcmVkRGVib3VuY2UpIHJldHVybiBkZWJvdW5jZV8xO1xuXHRoYXNSZXF1aXJlZERlYm91bmNlID0gMTtcblx0dmFyIGlzT2JqZWN0ID0gcmVxdWlyZUlzT2JqZWN0KCksXG5cdCAgICBub3cgPSByZXF1aXJlTm93KCksXG5cdCAgICB0b051bWJlciA9IHJlcXVpcmVUb051bWJlcigpO1xuXG5cdC8qKiBFcnJvciBtZXNzYWdlIGNvbnN0YW50cy4gKi9cblx0dmFyIEZVTkNfRVJST1JfVEVYVCA9ICdFeHBlY3RlZCBhIGZ1bmN0aW9uJztcblxuXHQvKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG5cdHZhciBuYXRpdmVNYXggPSBNYXRoLm1heCxcblx0ICAgIG5hdGl2ZU1pbiA9IE1hdGgubWluO1xuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgZGVib3VuY2VkIGZ1bmN0aW9uIHRoYXQgZGVsYXlzIGludm9raW5nIGBmdW5jYCB1bnRpbCBhZnRlciBgd2FpdGBcblx0ICogbWlsbGlzZWNvbmRzIGhhdmUgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gd2FzXG5cdCAqIGludm9rZWQuIFRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gY29tZXMgd2l0aCBhIGBjYW5jZWxgIG1ldGhvZCB0byBjYW5jZWxcblx0ICogZGVsYXllZCBgZnVuY2AgaW52b2NhdGlvbnMgYW5kIGEgYGZsdXNoYCBtZXRob2QgdG8gaW1tZWRpYXRlbHkgaW52b2tlIHRoZW0uXG5cdCAqIFByb3ZpZGUgYG9wdGlvbnNgIHRvIGluZGljYXRlIHdoZXRoZXIgYGZ1bmNgIHNob3VsZCBiZSBpbnZva2VkIG9uIHRoZVxuXHQgKiBsZWFkaW5nIGFuZC9vciB0cmFpbGluZyBlZGdlIG9mIHRoZSBgd2FpdGAgdGltZW91dC4gVGhlIGBmdW5jYCBpcyBpbnZva2VkXG5cdCAqIHdpdGggdGhlIGxhc3QgYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24uIFN1YnNlcXVlbnRcblx0ICogY2FsbHMgdG8gdGhlIGRlYm91bmNlZCBmdW5jdGlvbiByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBgZnVuY2Bcblx0ICogaW52b2NhdGlvbi5cblx0ICpcblx0ICogKipOb3RlOioqIElmIGBsZWFkaW5nYCBhbmQgYHRyYWlsaW5nYCBvcHRpb25zIGFyZSBgdHJ1ZWAsIGBmdW5jYCBpc1xuXHQgKiBpbnZva2VkIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0IG9ubHkgaWYgdGhlIGRlYm91bmNlZCBmdW5jdGlvblxuXHQgKiBpcyBpbnZva2VkIG1vcmUgdGhhbiBvbmNlIGR1cmluZyB0aGUgYHdhaXRgIHRpbWVvdXQuXG5cdCAqXG5cdCAqIElmIGB3YWl0YCBpcyBgMGAgYW5kIGBsZWFkaW5nYCBpcyBgZmFsc2VgLCBgZnVuY2AgaW52b2NhdGlvbiBpcyBkZWZlcnJlZFxuXHQgKiB1bnRpbCB0byB0aGUgbmV4dCB0aWNrLCBzaW1pbGFyIHRvIGBzZXRUaW1lb3V0YCB3aXRoIGEgdGltZW91dCBvZiBgMGAuXG5cdCAqXG5cdCAqIFNlZSBbRGF2aWQgQ29yYmFjaG8ncyBhcnRpY2xlXShodHRwczovL2Nzcy10cmlja3MuY29tL2RlYm91bmNpbmctdGhyb3R0bGluZy1leHBsYWluZWQtZXhhbXBsZXMvKVxuXHQgKiBmb3IgZGV0YWlscyBvdmVyIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGBfLmRlYm91bmNlYCBhbmQgYF8udGhyb3R0bGVgLlxuXHQgKlxuXHQgKiBAc3RhdGljXG5cdCAqIEBtZW1iZXJPZiBfXG5cdCAqIEBzaW5jZSAwLjEuMFxuXHQgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVib3VuY2UuXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbd2FpdD0wXSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheS5cblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBUaGUgb3B0aW9ucyBvYmplY3QuXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubGVhZGluZz1mYWxzZV1cblx0ICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cblx0ICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm1heFdhaXRdXG5cdCAqICBUaGUgbWF4aW11bSB0aW1lIGBmdW5jYCBpcyBhbGxvd2VkIHRvIGJlIGRlbGF5ZWQgYmVmb3JlIGl0J3MgaW52b2tlZC5cblx0ICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50cmFpbGluZz10cnVlXVxuXHQgKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cblx0ICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZGVib3VuY2VkIGZ1bmN0aW9uLlxuXHQgKiBAZXhhbXBsZVxuXHQgKlxuXHQgKiAvLyBBdm9pZCBjb3N0bHkgY2FsY3VsYXRpb25zIHdoaWxlIHRoZSB3aW5kb3cgc2l6ZSBpcyBpbiBmbHV4LlxuXHQgKiBqUXVlcnkod2luZG93KS5vbigncmVzaXplJywgXy5kZWJvdW5jZShjYWxjdWxhdGVMYXlvdXQsIDE1MCkpO1xuXHQgKlxuXHQgKiAvLyBJbnZva2UgYHNlbmRNYWlsYCB3aGVuIGNsaWNrZWQsIGRlYm91bmNpbmcgc3Vic2VxdWVudCBjYWxscy5cblx0ICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIF8uZGVib3VuY2Uoc2VuZE1haWwsIDMwMCwge1xuXHQgKiAgICdsZWFkaW5nJzogdHJ1ZSxcblx0ICogICAndHJhaWxpbmcnOiBmYWxzZVxuXHQgKiB9KSk7XG5cdCAqXG5cdCAqIC8vIEVuc3VyZSBgYmF0Y2hMb2dgIGlzIGludm9rZWQgb25jZSBhZnRlciAxIHNlY29uZCBvZiBkZWJvdW5jZWQgY2FsbHMuXG5cdCAqIHZhciBkZWJvdW5jZWQgPSBfLmRlYm91bmNlKGJhdGNoTG9nLCAyNTAsIHsgJ21heFdhaXQnOiAxMDAwIH0pO1xuXHQgKiB2YXIgc291cmNlID0gbmV3IEV2ZW50U291cmNlKCcvc3RyZWFtJyk7XG5cdCAqIGpRdWVyeShzb3VyY2UpLm9uKCdtZXNzYWdlJywgZGVib3VuY2VkKTtcblx0ICpcblx0ICogLy8gQ2FuY2VsIHRoZSB0cmFpbGluZyBkZWJvdW5jZWQgaW52b2NhdGlvbi5cblx0ICogalF1ZXJ5KHdpbmRvdykub24oJ3BvcHN0YXRlJywgZGVib3VuY2VkLmNhbmNlbCk7XG5cdCAqL1xuXHRmdW5jdGlvbiBkZWJvdW5jZShmdW5jLCB3YWl0LCBvcHRpb25zKSB7XG5cdCAgdmFyIGxhc3RBcmdzLFxuXHQgICAgICBsYXN0VGhpcyxcblx0ICAgICAgbWF4V2FpdCxcblx0ICAgICAgcmVzdWx0LFxuXHQgICAgICB0aW1lcklkLFxuXHQgICAgICBsYXN0Q2FsbFRpbWUsXG5cdCAgICAgIGxhc3RJbnZva2VUaW1lID0gMCxcblx0ICAgICAgbGVhZGluZyA9IGZhbHNlLFxuXHQgICAgICBtYXhpbmcgPSBmYWxzZSxcblx0ICAgICAgdHJhaWxpbmcgPSB0cnVlO1xuXG5cdCAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcblx0ICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcblx0ICB9XG5cdCAgd2FpdCA9IHRvTnVtYmVyKHdhaXQpIHx8IDA7XG5cdCAgaWYgKGlzT2JqZWN0KG9wdGlvbnMpKSB7XG5cdCAgICBsZWFkaW5nID0gISFvcHRpb25zLmxlYWRpbmc7XG5cdCAgICBtYXhpbmcgPSAnbWF4V2FpdCcgaW4gb3B0aW9ucztcblx0ICAgIG1heFdhaXQgPSBtYXhpbmcgPyBuYXRpdmVNYXgodG9OdW1iZXIob3B0aW9ucy5tYXhXYWl0KSB8fCAwLCB3YWl0KSA6IG1heFdhaXQ7XG5cdCAgICB0cmFpbGluZyA9ICd0cmFpbGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy50cmFpbGluZyA6IHRyYWlsaW5nO1xuXHQgIH1cblxuXHQgIGZ1bmN0aW9uIGludm9rZUZ1bmModGltZSkge1xuXHQgICAgdmFyIGFyZ3MgPSBsYXN0QXJncyxcblx0ICAgICAgICB0aGlzQXJnID0gbGFzdFRoaXM7XG5cblx0ICAgIGxhc3RBcmdzID0gbGFzdFRoaXMgPSB1bmRlZmluZWQ7XG5cdCAgICBsYXN0SW52b2tlVGltZSA9IHRpbWU7XG5cdCAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xuXHQgICAgcmV0dXJuIHJlc3VsdDtcblx0ICB9XG5cblx0ICBmdW5jdGlvbiBsZWFkaW5nRWRnZSh0aW1lKSB7XG5cdCAgICAvLyBSZXNldCBhbnkgYG1heFdhaXRgIHRpbWVyLlxuXHQgICAgbGFzdEludm9rZVRpbWUgPSB0aW1lO1xuXHQgICAgLy8gU3RhcnQgdGhlIHRpbWVyIGZvciB0aGUgdHJhaWxpbmcgZWRnZS5cblx0ICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG5cdCAgICAvLyBJbnZva2UgdGhlIGxlYWRpbmcgZWRnZS5cblx0ICAgIHJldHVybiBsZWFkaW5nID8gaW52b2tlRnVuYyh0aW1lKSA6IHJlc3VsdDtcblx0ICB9XG5cblx0ICBmdW5jdGlvbiByZW1haW5pbmdXYWl0KHRpbWUpIHtcblx0ICAgIHZhciB0aW1lU2luY2VMYXN0Q2FsbCA9IHRpbWUgLSBsYXN0Q2FsbFRpbWUsXG5cdCAgICAgICAgdGltZVNpbmNlTGFzdEludm9rZSA9IHRpbWUgLSBsYXN0SW52b2tlVGltZSxcblx0ICAgICAgICB0aW1lV2FpdGluZyA9IHdhaXQgLSB0aW1lU2luY2VMYXN0Q2FsbDtcblxuXHQgICAgcmV0dXJuIG1heGluZ1xuXHQgICAgICA/IG5hdGl2ZU1pbih0aW1lV2FpdGluZywgbWF4V2FpdCAtIHRpbWVTaW5jZUxhc3RJbnZva2UpXG5cdCAgICAgIDogdGltZVdhaXRpbmc7XG5cdCAgfVxuXG5cdCAgZnVuY3Rpb24gc2hvdWxkSW52b2tlKHRpbWUpIHtcblx0ICAgIHZhciB0aW1lU2luY2VMYXN0Q2FsbCA9IHRpbWUgLSBsYXN0Q2FsbFRpbWUsXG5cdCAgICAgICAgdGltZVNpbmNlTGFzdEludm9rZSA9IHRpbWUgLSBsYXN0SW52b2tlVGltZTtcblxuXHQgICAgLy8gRWl0aGVyIHRoaXMgaXMgdGhlIGZpcnN0IGNhbGwsIGFjdGl2aXR5IGhhcyBzdG9wcGVkIGFuZCB3ZSdyZSBhdCB0aGVcblx0ICAgIC8vIHRyYWlsaW5nIGVkZ2UsIHRoZSBzeXN0ZW0gdGltZSBoYXMgZ29uZSBiYWNrd2FyZHMgYW5kIHdlJ3JlIHRyZWF0aW5nXG5cdCAgICAvLyBpdCBhcyB0aGUgdHJhaWxpbmcgZWRnZSwgb3Igd2UndmUgaGl0IHRoZSBgbWF4V2FpdGAgbGltaXQuXG5cdCAgICByZXR1cm4gKGxhc3RDYWxsVGltZSA9PT0gdW5kZWZpbmVkIHx8ICh0aW1lU2luY2VMYXN0Q2FsbCA+PSB3YWl0KSB8fFxuXHQgICAgICAodGltZVNpbmNlTGFzdENhbGwgPCAwKSB8fCAobWF4aW5nICYmIHRpbWVTaW5jZUxhc3RJbnZva2UgPj0gbWF4V2FpdCkpO1xuXHQgIH1cblxuXHQgIGZ1bmN0aW9uIHRpbWVyRXhwaXJlZCgpIHtcblx0ICAgIHZhciB0aW1lID0gbm93KCk7XG5cdCAgICBpZiAoc2hvdWxkSW52b2tlKHRpbWUpKSB7XG5cdCAgICAgIHJldHVybiB0cmFpbGluZ0VkZ2UodGltZSk7XG5cdCAgICB9XG5cdCAgICAvLyBSZXN0YXJ0IHRoZSB0aW1lci5cblx0ICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgcmVtYWluaW5nV2FpdCh0aW1lKSk7XG5cdCAgfVxuXG5cdCAgZnVuY3Rpb24gdHJhaWxpbmdFZGdlKHRpbWUpIHtcblx0ICAgIHRpbWVySWQgPSB1bmRlZmluZWQ7XG5cblx0ICAgIC8vIE9ubHkgaW52b2tlIGlmIHdlIGhhdmUgYGxhc3RBcmdzYCB3aGljaCBtZWFucyBgZnVuY2AgaGFzIGJlZW5cblx0ICAgIC8vIGRlYm91bmNlZCBhdCBsZWFzdCBvbmNlLlxuXHQgICAgaWYgKHRyYWlsaW5nICYmIGxhc3RBcmdzKSB7XG5cdCAgICAgIHJldHVybiBpbnZva2VGdW5jKHRpbWUpO1xuXHQgICAgfVxuXHQgICAgbGFzdEFyZ3MgPSBsYXN0VGhpcyA9IHVuZGVmaW5lZDtcblx0ICAgIHJldHVybiByZXN1bHQ7XG5cdCAgfVxuXG5cdCAgZnVuY3Rpb24gY2FuY2VsKCkge1xuXHQgICAgaWYgKHRpbWVySWQgIT09IHVuZGVmaW5lZCkge1xuXHQgICAgICBjbGVhclRpbWVvdXQodGltZXJJZCk7XG5cdCAgICB9XG5cdCAgICBsYXN0SW52b2tlVGltZSA9IDA7XG5cdCAgICBsYXN0QXJncyA9IGxhc3RDYWxsVGltZSA9IGxhc3RUaGlzID0gdGltZXJJZCA9IHVuZGVmaW5lZDtcblx0ICB9XG5cblx0ICBmdW5jdGlvbiBmbHVzaCgpIHtcblx0ICAgIHJldHVybiB0aW1lcklkID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiB0cmFpbGluZ0VkZ2Uobm93KCkpO1xuXHQgIH1cblxuXHQgIGZ1bmN0aW9uIGRlYm91bmNlZCgpIHtcblx0ICAgIHZhciB0aW1lID0gbm93KCksXG5cdCAgICAgICAgaXNJbnZva2luZyA9IHNob3VsZEludm9rZSh0aW1lKTtcblxuXHQgICAgbGFzdEFyZ3MgPSBhcmd1bWVudHM7XG5cdCAgICBsYXN0VGhpcyA9IHRoaXM7XG5cdCAgICBsYXN0Q2FsbFRpbWUgPSB0aW1lO1xuXG5cdCAgICBpZiAoaXNJbnZva2luZykge1xuXHQgICAgICBpZiAodGltZXJJZCA9PT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgcmV0dXJuIGxlYWRpbmdFZGdlKGxhc3RDYWxsVGltZSk7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKG1heGluZykge1xuXHQgICAgICAgIC8vIEhhbmRsZSBpbnZvY2F0aW9ucyBpbiBhIHRpZ2h0IGxvb3AuXG5cdCAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVySWQpO1xuXHQgICAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG5cdCAgICAgICAgcmV0dXJuIGludm9rZUZ1bmMobGFzdENhbGxUaW1lKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgaWYgKHRpbWVySWQgPT09IHVuZGVmaW5lZCkge1xuXHQgICAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIHJlc3VsdDtcblx0ICB9XG5cdCAgZGVib3VuY2VkLmNhbmNlbCA9IGNhbmNlbDtcblx0ICBkZWJvdW5jZWQuZmx1c2ggPSBmbHVzaDtcblx0ICByZXR1cm4gZGVib3VuY2VkO1xuXHR9XG5cblx0ZGVib3VuY2VfMSA9IGRlYm91bmNlO1xuXHRyZXR1cm4gZGVib3VuY2VfMTtcbn1cblxudmFyIGRlYm91bmNlRXhwb3J0cyA9IHJlcXVpcmVEZWJvdW5jZSgpO1xudmFyIGRlYm91bmNlID0gLypAX19QVVJFX18qL2dldERlZmF1bHRFeHBvcnRGcm9tQ2pzKGRlYm91bmNlRXhwb3J0cyk7XG5cbnZhciBwZXJmb3JtYW5jZSQxID0gX3dpbmRvdyA/IF93aW5kb3cucGVyZm9ybWFuY2UgOiBudWxsO1xudmFyIHBub3cgPSBwZXJmb3JtYW5jZSQxICYmIHBlcmZvcm1hbmNlJDEubm93ID8gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gcGVyZm9ybWFuY2UkMS5ub3coKTtcbn0gOiBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBEYXRlLm5vdygpO1xufTtcbnZhciByYWYgPSBmdW5jdGlvbiAoKSB7XG4gIGlmIChfd2luZG93KSB7XG4gICAgaWYgKF93aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgIF93aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZuKTtcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChfd2luZG93Lm1velJlcXVlc3RBbmltYXRpb25GcmFtZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChmbikge1xuICAgICAgICBfd2luZG93Lm1velJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7XG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoX3dpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgX3dpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZm4pO1xuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKF93aW5kb3cubXNSZXF1ZXN0QW5pbWF0aW9uRnJhbWUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgX3dpbmRvdy5tc1JlcXVlc3RBbmltYXRpb25GcmFtZShmbik7XG4gICAgICB9O1xuICAgIH1cbiAgfVxuICByZXR1cm4gZnVuY3Rpb24gKGZuKSB7XG4gICAgaWYgKGZuKSB7XG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZm4ocG5vdygpKTtcbiAgICAgIH0sIDEwMDAgLyA2MCk7XG4gICAgfVxuICB9O1xufSgpO1xudmFyIHJlcXVlc3RBbmltYXRpb25GcmFtZSA9IGZ1bmN0aW9uIHJlcXVlc3RBbmltYXRpb25GcmFtZShmbikge1xuICByZXR1cm4gcmFmKGZuKTtcbn07XG52YXIgcGVyZm9ybWFuY2VOb3cgPSBwbm93O1xuXG52YXIgREVGQVVMVF9IQVNIX1NFRUQgPSA5MjYxO1xudmFyIEsgPSA2NTU5OTsgLy8gMzcgYWxzbyB3b3JrcyBwcmV0dHkgd2VsbFxudmFyIERFRkFVTFRfSEFTSF9TRUVEX0FMVCA9IDUzODE7XG52YXIgaGFzaEl0ZXJhYmxlSW50cyA9IGZ1bmN0aW9uIGhhc2hJdGVyYWJsZUludHMoaXRlcmF0b3IpIHtcbiAgdmFyIHNlZWQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IERFRkFVTFRfSEFTSF9TRUVEO1xuICAvLyBzZGJtL3N0cmluZy1oYXNoXG4gIHZhciBoYXNoID0gc2VlZDtcbiAgdmFyIGVudHJ5O1xuICBmb3IgKDs7KSB7XG4gICAgZW50cnkgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgaWYgKGVudHJ5LmRvbmUpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBoYXNoID0gaGFzaCAqIEsgKyBlbnRyeS52YWx1ZSB8IDA7XG4gIH1cbiAgcmV0dXJuIGhhc2g7XG59O1xudmFyIGhhc2hJbnQgPSBmdW5jdGlvbiBoYXNoSW50KG51bSkge1xuICB2YXIgc2VlZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogREVGQVVMVF9IQVNIX1NFRUQ7XG4gIC8vIHNkYm0vc3RyaW5nLWhhc2hcbiAgcmV0dXJuIHNlZWQgKiBLICsgbnVtIHwgMDtcbn07XG52YXIgaGFzaEludEFsdCA9IGZ1bmN0aW9uIGhhc2hJbnRBbHQobnVtKSB7XG4gIHZhciBzZWVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBERUZBVUxUX0hBU0hfU0VFRF9BTFQ7XG4gIC8vIGRqYjIvc3RyaW5nLWhhc2hcbiAgcmV0dXJuIChzZWVkIDw8IDUpICsgc2VlZCArIG51bSB8IDA7XG59O1xudmFyIGNvbWJpbmVIYXNoZXMgPSBmdW5jdGlvbiBjb21iaW5lSGFzaGVzKGhhc2gxLCBoYXNoMikge1xuICByZXR1cm4gaGFzaDEgKiAweDIwMDAwMCArIGhhc2gyO1xufTtcbnZhciBjb21iaW5lSGFzaGVzQXJyYXkgPSBmdW5jdGlvbiBjb21iaW5lSGFzaGVzQXJyYXkoaGFzaGVzKSB7XG4gIHJldHVybiBoYXNoZXNbMF0gKiAweDIwMDAwMCArIGhhc2hlc1sxXTtcbn07XG52YXIgaGFzaEFycmF5cyA9IGZ1bmN0aW9uIGhhc2hBcnJheXMoaGFzaGVzMSwgaGFzaGVzMikge1xuICByZXR1cm4gW2hhc2hJbnQoaGFzaGVzMVswXSwgaGFzaGVzMlswXSksIGhhc2hJbnRBbHQoaGFzaGVzMVsxXSwgaGFzaGVzMlsxXSldO1xufTtcbnZhciBoYXNoSW50c0FycmF5ID0gZnVuY3Rpb24gaGFzaEludHNBcnJheShpbnRzLCBzZWVkKSB7XG4gIHZhciBlbnRyeSA9IHtcbiAgICB2YWx1ZTogMCxcbiAgICBkb25lOiBmYWxzZVxuICB9O1xuICB2YXIgaSA9IDA7XG4gIHZhciBsZW5ndGggPSBpbnRzLmxlbmd0aDtcbiAgdmFyIGl0ZXJhdG9yID0ge1xuICAgIG5leHQ6IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICBpZiAoaSA8IGxlbmd0aCkge1xuICAgICAgICBlbnRyeS52YWx1ZSA9IGludHNbaSsrXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVudHJ5LmRvbmUgPSB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVudHJ5O1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGhhc2hJdGVyYWJsZUludHMoaXRlcmF0b3IsIHNlZWQpO1xufTtcbnZhciBoYXNoU3RyaW5nID0gZnVuY3Rpb24gaGFzaFN0cmluZyhzdHIsIHNlZWQpIHtcbiAgdmFyIGVudHJ5ID0ge1xuICAgIHZhbHVlOiAwLFxuICAgIGRvbmU6IGZhbHNlXG4gIH07XG4gIHZhciBpID0gMDtcbiAgdmFyIGxlbmd0aCA9IHN0ci5sZW5ndGg7XG4gIHZhciBpdGVyYXRvciA9IHtcbiAgICBuZXh0OiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgaWYgKGkgPCBsZW5ndGgpIHtcbiAgICAgICAgZW50cnkudmFsdWUgPSBzdHIuY2hhckNvZGVBdChpKyspO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW50cnkuZG9uZSA9IHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZW50cnk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gaGFzaEl0ZXJhYmxlSW50cyhpdGVyYXRvciwgc2VlZCk7XG59O1xudmFyIGhhc2hTdHJpbmdzID0gZnVuY3Rpb24gaGFzaFN0cmluZ3MoKSB7XG4gIHJldHVybiBoYXNoU3RyaW5nc0FycmF5KGFyZ3VtZW50cyk7XG59O1xudmFyIGhhc2hTdHJpbmdzQXJyYXkgPSBmdW5jdGlvbiBoYXNoU3RyaW5nc0FycmF5KHN0cnMpIHtcbiAgdmFyIGhhc2g7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3Rycy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzdHIgPSBzdHJzW2ldO1xuICAgIGlmIChpID09PSAwKSB7XG4gICAgICBoYXNoID0gaGFzaFN0cmluZyhzdHIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBoYXNoID0gaGFzaFN0cmluZyhzdHIsIGhhc2gpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaGFzaDtcbn07XG5cbmZ1bmN0aW9uIHJvdGF0ZVBvaW50KHgsIHksIGNlbnRlclgsIGNlbnRlclksIGFuZ2xlRGVncmVlcykge1xuICB2YXIgYW5nbGVSYWRpYW5zID0gYW5nbGVEZWdyZWVzICogTWF0aC5QSSAvIDE4MDtcbiAgdmFyIHJvdGF0ZWRYID0gTWF0aC5jb3MoYW5nbGVSYWRpYW5zKSAqICh4IC0gY2VudGVyWCkgLSBNYXRoLnNpbihhbmdsZVJhZGlhbnMpICogKHkgLSBjZW50ZXJZKSArIGNlbnRlclg7XG4gIHZhciByb3RhdGVkWSA9IE1hdGguc2luKGFuZ2xlUmFkaWFucykgKiAoeCAtIGNlbnRlclgpICsgTWF0aC5jb3MoYW5nbGVSYWRpYW5zKSAqICh5IC0gY2VudGVyWSkgKyBjZW50ZXJZO1xuICByZXR1cm4ge1xuICAgIHg6IHJvdGF0ZWRYLFxuICAgIHk6IHJvdGF0ZWRZXG4gIH07XG59XG52YXIgbW92ZVBvaW50QnlCb3hBc3BlY3QgPSBmdW5jdGlvbiBtb3ZlUG9pbnRCeUJveEFzcGVjdCh4LCB5LCBib3hYLCBib3hZLCBza2V3WCwgc2tld1kpIHtcbiAgcmV0dXJuIHtcbiAgICB4OiAoeCAtIGJveFgpICogc2tld1ggKyBib3hYLFxuICAgIHk6ICh5IC0gYm94WSkgKiBza2V3WSArIGJveFlcbiAgfTtcbn07XG5mdW5jdGlvbiByb3RhdGVQb3NBbmRTa2V3QnlCb3gocG9zLCBib3gsIGFuZ2xlRGVncmVlcykge1xuICBpZiAoYW5nbGVEZWdyZWVzID09PSAwKSByZXR1cm4gcG9zO1xuICB2YXIgY2VudGVyWCA9IChib3gueDEgKyBib3gueDIpIC8gMjtcbiAgdmFyIGNlbnRlclkgPSAoYm94LnkxICsgYm94LnkyKSAvIDI7XG4gIHZhciBza2V3WCA9IGJveC53IC8gYm94Lmg7XG4gIHZhciBza2V3WSA9IDEgLyBza2V3WDtcbiAgdmFyIHJvdGF0ZWQgPSByb3RhdGVQb2ludChwb3MueCwgcG9zLnksIGNlbnRlclgsIGNlbnRlclksIGFuZ2xlRGVncmVlcyk7XG4gIHZhciBza2V3ZWQgPSBtb3ZlUG9pbnRCeUJveEFzcGVjdChyb3RhdGVkLngsIHJvdGF0ZWQueSwgY2VudGVyWCwgY2VudGVyWSwgc2tld1gsIHNrZXdZKTtcbiAgcmV0dXJuIHtcbiAgICB4OiBza2V3ZWQueCxcbiAgICB5OiBza2V3ZWQueVxuICB9O1xufVxuXG52YXIgd2FybmluZ3NFbmFibGVkID0gdHJ1ZTtcbnZhciB3YXJuU3VwcG9ydGVkID0gY29uc29sZS53YXJuICE9IG51bGw7XG52YXIgdHJhY2VTdXBwb3J0ZWQgPSBjb25zb2xlLnRyYWNlICE9IG51bGw7XG52YXIgTUFYX0lOVCQxID0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIgfHwgOTAwNzE5OTI1NDc0MDk5MTtcbnZhciB0cnVlaWZ5ID0gZnVuY3Rpb24gdHJ1ZWlmeSgpIHtcbiAgcmV0dXJuIHRydWU7XG59O1xudmFyIGZhbHNpZnkgPSBmdW5jdGlvbiBmYWxzaWZ5KCkge1xuICByZXR1cm4gZmFsc2U7XG59O1xudmFyIHplcm9pZnkgPSBmdW5jdGlvbiB6ZXJvaWZ5KCkge1xuICByZXR1cm4gMDtcbn07XG52YXIgbm9vcCQxID0gZnVuY3Rpb24gbm9vcCgpIHt9O1xudmFyIGVycm9yID0gZnVuY3Rpb24gZXJyb3IobXNnKSB7XG4gIHRocm93IG5ldyBFcnJvcihtc2cpO1xufTtcbnZhciB3YXJuaW5ncyA9IGZ1bmN0aW9uIHdhcm5pbmdzKGVuYWJsZWQpIHtcbiAgaWYgKGVuYWJsZWQgIT09IHVuZGVmaW5lZCkge1xuICAgIHdhcm5pbmdzRW5hYmxlZCA9ICEhZW5hYmxlZDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gd2FybmluZ3NFbmFibGVkO1xuICB9XG59O1xudmFyIHdhcm4gPSBmdW5jdGlvbiB3YXJuKG1zZykge1xuICBpZiAoIXdhcm5pbmdzKCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHdhcm5TdXBwb3J0ZWQpIHtcbiAgICBjb25zb2xlLndhcm4obXNnKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmxvZyhtc2cpO1xuICAgIGlmICh0cmFjZVN1cHBvcnRlZCkge1xuICAgICAgY29uc29sZS50cmFjZSgpO1xuICAgIH1cbiAgfVxufTtcbnZhciBjbG9uZSA9IGZ1bmN0aW9uIGNsb25lKG9iaikge1xuICByZXR1cm4gZXh0ZW5kKHt9LCBvYmopO1xufTtcblxuLy8gZ2V0cyBhIHNoYWxsb3cgY29weSBvZiB0aGUgYXJndW1lbnRcbnZhciBjb3B5ID0gZnVuY3Rpb24gY29weShvYmopIHtcbiAgaWYgKG9iaiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuICBpZiAoYXJyYXkob2JqKSkge1xuICAgIHJldHVybiBvYmouc2xpY2UoKTtcbiAgfSBlbHNlIGlmIChwbGFpbk9iamVjdChvYmopKSB7XG4gICAgcmV0dXJuIGNsb25lKG9iaik7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxufTtcbnZhciBjb3B5QXJyYXkgPSBmdW5jdGlvbiBjb3B5QXJyYXkoYXJyKSB7XG4gIHJldHVybiBhcnIuc2xpY2UoKTtcbn07XG52YXIgdXVpZCA9IGZ1bmN0aW9uIHV1aWQoYSwgYiAvKiBwbGFjZWhvbGRlcnMgKi8pIHtcbiAgZm9yIChcbiAgLy8gbG9vcCA6KVxuICBiID0gYSA9ICcnO1xuICAvLyBiIC0gcmVzdWx0ICwgYSAtIG51bWVyaWMgbGV0aWFibGVcbiAgYSsrIDwgMzY7XG4gIC8vXG4gIGIgKz0gYSAqIDUxICYgNTIgLy8gaWYgXCJhXCIgaXMgbm90IDkgb3IgMTQgb3IgMTkgb3IgMjRcbiAgP1xuICAvLyAgcmV0dXJuIGEgcmFuZG9tIG51bWJlciBvciA0XG4gIChhIF4gMTUgLy8gaWYgXCJhXCIgaXMgbm90IDE1XG4gID9cbiAgLy8gZ2VuZXJhdGUgYSByYW5kb20gbnVtYmVyIGZyb20gMCB0byAxNVxuICA4IF4gTWF0aC5yYW5kb20oKSAqIChhIF4gMjAgPyAxNiA6IDQpIC8vIHVubGVzcyBcImFcIiBpcyAyMCwgaW4gd2hpY2ggY2FzZSBhIHJhbmRvbSBudW1iZXIgZnJvbSA4IHRvIDExXG4gIDogNCAvLyAgb3RoZXJ3aXNlIDRcbiAgKS50b1N0cmluZygxNikgOiAnLScgLy8gIGluIG90aGVyIGNhc2VzIChpZiBcImFcIiBpcyA5LDE0LDE5LDI0KSBpbnNlcnQgXCItXCJcbiAgKTtcbiAgcmV0dXJuIGI7XG59O1xudmFyIF9zdGF0aWNFbXB0eU9iamVjdCA9IHt9O1xudmFyIHN0YXRpY0VtcHR5T2JqZWN0ID0gZnVuY3Rpb24gc3RhdGljRW1wdHlPYmplY3QoKSB7XG4gIHJldHVybiBfc3RhdGljRW1wdHlPYmplY3Q7XG59O1xudmFyIGRlZmF1bHRzJGcgPSBmdW5jdGlvbiBkZWZhdWx0cyhfZGVmYXVsdHMpIHtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhfZGVmYXVsdHMpO1xuICByZXR1cm4gZnVuY3Rpb24gKG9wdHMpIHtcbiAgICB2YXIgZmlsbGVkT3B0cyA9IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgICB2YXIgb3B0VmFsID0gb3B0cyA9PSBudWxsID8gdW5kZWZpbmVkIDogb3B0c1trZXldO1xuICAgICAgZmlsbGVkT3B0c1trZXldID0gb3B0VmFsID09PSB1bmRlZmluZWQgPyBfZGVmYXVsdHNba2V5XSA6IG9wdFZhbDtcbiAgICB9XG4gICAgcmV0dXJuIGZpbGxlZE9wdHM7XG4gIH07XG59O1xudmFyIHJlbW92ZUZyb21BcnJheSA9IGZ1bmN0aW9uIHJlbW92ZUZyb21BcnJheShhcnIsIGVsZSwgb25lQ29weSkge1xuICBmb3IgKHZhciBpID0gYXJyLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgaWYgKGFycltpXSA9PT0gZWxlKSB7XG4gICAgICBhcnIuc3BsaWNlKGksIDEpO1xuICAgIH1cbiAgfVxufTtcbnZhciBjbGVhckFycmF5ID0gZnVuY3Rpb24gY2xlYXJBcnJheShhcnIpIHtcbiAgYXJyLnNwbGljZSgwLCBhcnIubGVuZ3RoKTtcbn07XG52YXIgcHVzaCA9IGZ1bmN0aW9uIHB1c2goYXJyLCBvdGhlckFycikge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG90aGVyQXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVsID0gb3RoZXJBcnJbaV07XG4gICAgYXJyLnB1c2goZWwpO1xuICB9XG59O1xudmFyIGdldFByZWZpeGVkUHJvcGVydHkgPSBmdW5jdGlvbiBnZXRQcmVmaXhlZFByb3BlcnR5KG9iaiwgcHJvcE5hbWUsIHByZWZpeCkge1xuICBpZiAocHJlZml4KSB7XG4gICAgcHJvcE5hbWUgPSBwcmVwZW5kQ2FtZWwocHJlZml4LCBwcm9wTmFtZSk7IC8vIGUuZy4gKGxhYmVsV2lkdGgsIHNvdXJjZSkgPT4gc291cmNlTGFiZWxXaWR0aFxuICB9XG4gIHJldHVybiBvYmpbcHJvcE5hbWVdO1xufTtcbnZhciBzZXRQcmVmaXhlZFByb3BlcnR5ID0gZnVuY3Rpb24gc2V0UHJlZml4ZWRQcm9wZXJ0eShvYmosIHByb3BOYW1lLCBwcmVmaXgsIHZhbHVlKSB7XG4gIGlmIChwcmVmaXgpIHtcbiAgICBwcm9wTmFtZSA9IHByZXBlbmRDYW1lbChwcmVmaXgsIHByb3BOYW1lKTsgLy8gZS5nLiAobGFiZWxXaWR0aCwgc291cmNlKSA9PiBzb3VyY2VMYWJlbFdpZHRoXG4gIH1cbiAgb2JqW3Byb3BOYW1lXSA9IHZhbHVlO1xufTtcblxuLyogZ2xvYmFsIE1hcCAqL1xudmFyIE9iamVjdE1hcCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIE9iamVjdE1hcCgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgT2JqZWN0TWFwKTtcbiAgICB0aGlzLl9vYmogPSB7fTtcbiAgfVxuICByZXR1cm4gX2NyZWF0ZUNsYXNzKE9iamVjdE1hcCwgW3tcbiAgICBrZXk6IFwic2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldChrZXksIHZhbCkge1xuICAgICAgdGhpcy5fb2JqW2tleV0gPSB2YWw7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZGVsZXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9kZWxldGUoa2V5KSB7XG4gICAgICB0aGlzLl9vYmpba2V5XSA9IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjbGVhclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjbGVhcigpIHtcbiAgICAgIHRoaXMuX29iaiA9IHt9O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJoYXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFzKGtleSkge1xuICAgICAgcmV0dXJuIHRoaXMuX29ialtrZXldICE9PSB1bmRlZmluZWQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5fb2JqW2tleV07XG4gICAgfVxuICB9XSk7XG59KCk7XG52YXIgTWFwJDEgPSB0eXBlb2YgTWFwICE9PSAndW5kZWZpbmVkJyA/IE1hcCA6IE9iamVjdE1hcDtcblxuLyogZ2xvYmFsIFNldCAqL1xuXG52YXIgdW5kZWYgPSBcInVuZGVmaW5lZFwiIDtcbnZhciBPYmplY3RTZXQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBPYmplY3RTZXQoYXJyYXlPck9iamVjdFNldCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBPYmplY3RTZXQpO1xuICAgIHRoaXMuX29iaiA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGhpcy5zaXplID0gMDtcbiAgICBpZiAoYXJyYXlPck9iamVjdFNldCAhPSBudWxsKSB7XG4gICAgICB2YXIgYXJyO1xuICAgICAgaWYgKGFycmF5T3JPYmplY3RTZXQuaW5zdGFuY2VTdHJpbmcgIT0gbnVsbCAmJiBhcnJheU9yT2JqZWN0U2V0Lmluc3RhbmNlU3RyaW5nKCkgPT09IHRoaXMuaW5zdGFuY2VTdHJpbmcoKSkge1xuICAgICAgICBhcnIgPSBhcnJheU9yT2JqZWN0U2V0LnRvQXJyYXkoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFyciA9IGFycmF5T3JPYmplY3RTZXQ7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLmFkZChhcnJbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gX2NyZWF0ZUNsYXNzKE9iamVjdFNldCwgW3tcbiAgICBrZXk6IFwiaW5zdGFuY2VTdHJpbmdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW5zdGFuY2VTdHJpbmcoKSB7XG4gICAgICByZXR1cm4gJ3NldCc7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImFkZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGQodmFsKSB7XG4gICAgICB2YXIgbyA9IHRoaXMuX29iajtcbiAgICAgIGlmIChvW3ZhbF0gIT09IDEpIHtcbiAgICAgICAgb1t2YWxdID0gMTtcbiAgICAgICAgdGhpcy5zaXplKys7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImRlbGV0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfZGVsZXRlKHZhbCkge1xuICAgICAgdmFyIG8gPSB0aGlzLl9vYmo7XG4gICAgICBpZiAob1t2YWxdID09PSAxKSB7XG4gICAgICAgIG9bdmFsXSA9IDA7XG4gICAgICAgIHRoaXMuc2l6ZS0tO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjbGVhclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjbGVhcigpIHtcbiAgICAgIHRoaXMuX29iaiA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImhhc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYXModmFsKSB7XG4gICAgICByZXR1cm4gdGhpcy5fb2JqW3ZhbF0gPT09IDE7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInRvQXJyYXlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9BcnJheSgpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5fb2JqKS5maWx0ZXIoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICByZXR1cm4gX3RoaXMuaGFzKGtleSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZm9yRWFjaFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmb3JFYWNoKGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgICByZXR1cm4gdGhpcy50b0FycmF5KCkuZm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZyk7XG4gICAgfVxuICB9XSk7XG59KCk7XG52YXIgU2V0JDEgPSAodHlwZW9mIFNldCA9PT0gXCJ1bmRlZmluZWRcIiA/IFwidW5kZWZpbmVkXCIgOiBfdHlwZW9mKFNldCkpICE9PSB1bmRlZiA/IFNldCA6IE9iamVjdFNldDtcblxuLy8gcmVwcmVzZW50cyBhIG5vZGUgb3IgYW4gZWRnZVxudmFyIEVsZW1lbnQgPSBmdW5jdGlvbiBFbGVtZW50KGN5LCBwYXJhbXMpIHtcbiAgdmFyIHJlc3RvcmUgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHRydWU7XG4gIGlmIChjeSA9PT0gdW5kZWZpbmVkIHx8IHBhcmFtcyA9PT0gdW5kZWZpbmVkIHx8ICFjb3JlKGN5KSkge1xuICAgIGVycm9yKCdBbiBlbGVtZW50IG11c3QgaGF2ZSBhIGNvcmUgcmVmZXJlbmNlIGFuZCBwYXJhbWV0ZXJzIHNldCcpO1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgZ3JvdXAgPSBwYXJhbXMuZ3JvdXA7XG5cbiAgLy8gdHJ5IHRvIGF1dG9tYXRpY2FsbHkgaW5mZXIgdGhlIGdyb3VwIGlmIHVuc3BlY2lmaWVkXG4gIGlmIChncm91cCA9PSBudWxsKSB7XG4gICAgaWYgKHBhcmFtcy5kYXRhICYmIHBhcmFtcy5kYXRhLnNvdXJjZSAhPSBudWxsICYmIHBhcmFtcy5kYXRhLnRhcmdldCAhPSBudWxsKSB7XG4gICAgICBncm91cCA9ICdlZGdlcyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdyb3VwID0gJ25vZGVzJztcbiAgICB9XG4gIH1cblxuICAvLyB2YWxpZGF0ZSBncm91cFxuICBpZiAoZ3JvdXAgIT09ICdub2RlcycgJiYgZ3JvdXAgIT09ICdlZGdlcycpIHtcbiAgICBlcnJvcignQW4gZWxlbWVudCBtdXN0IGJlIG9mIHR5cGUgYG5vZGVzYCBvciBgZWRnZXNgOyB5b3Ugc3BlY2lmaWVkIGAnICsgZ3JvdXAgKyAnYCcpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIG1ha2UgdGhlIGVsZW1lbnQgYXJyYXktbGlrZSwganVzdCBsaWtlIGEgY29sbGVjdGlvblxuICB0aGlzLmxlbmd0aCA9IDE7XG4gIHRoaXNbMF0gPSB0aGlzO1xuXG4gIC8vIE5PVEU6IHdoZW4gc29tZXRoaW5nIGlzIGFkZGVkIGhlcmUsIGFkZCBhbHNvIHRvIGVsZS5qc29uKClcbiAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZSA9IHtcbiAgICBjeTogY3ksXG4gICAgc2luZ2xlOiB0cnVlLFxuICAgIC8vIGluZGljYXRlcyB0aGlzIGlzIGFuIGVsZW1lbnRcbiAgICBkYXRhOiBwYXJhbXMuZGF0YSB8fCB7fSxcbiAgICAvLyBkYXRhIG9iamVjdFxuICAgIHBvc2l0aW9uOiBwYXJhbXMucG9zaXRpb24gfHwge1xuICAgICAgeDogMCxcbiAgICAgIHk6IDBcbiAgICB9LFxuICAgIC8vICh4LCB5KSBwb3NpdGlvbiBwYWlyXG4gICAgYXV0b1dpZHRoOiB1bmRlZmluZWQsXG4gICAgLy8gd2lkdGggYW5kIGhlaWdodCBvZiBub2RlcyBjYWxjdWxhdGVkIGJ5IHRoZSByZW5kZXJlciB3aGVuIHNldCB0byBzcGVjaWFsICdhdXRvJyB2YWx1ZVxuICAgIGF1dG9IZWlnaHQ6IHVuZGVmaW5lZCxcbiAgICBhdXRvUGFkZGluZzogdW5kZWZpbmVkLFxuICAgIGNvbXBvdW5kQm91bmRzQ2xlYW46IGZhbHNlLFxuICAgIC8vIHdoZXRoZXIgdGhlIGNvbXBvdW5kIGRpbWVuc2lvbnMgbmVlZCB0byBiZSByZWNhbGN1bGF0ZWQgdGhlIG5leHQgdGltZSBkaW1lbnNpb25zIGFyZSByZWFkXG4gICAgbGlzdGVuZXJzOiBbXSxcbiAgICAvLyBhcnJheSBvZiBib3VuZCBsaXN0ZW5lcnNcbiAgICBncm91cDogZ3JvdXAsXG4gICAgLy8gc3RyaW5nOyAnbm9kZXMnIG9yICdlZGdlcydcbiAgICBzdHlsZToge30sXG4gICAgLy8gcHJvcGVydGllcyBhcyBzZXQgYnkgdGhlIHN0eWxlXG4gICAgcnN0eWxlOiB7fSxcbiAgICAvLyBwcm9wZXJ0aWVzIGZvciBzdHlsZSBzZW50IGZyb20gdGhlIHJlbmRlcmVyIHRvIHRoZSBjb3JlXG4gICAgc3R5bGVDeHRzOiBbXSxcbiAgICAvLyBhcHBsaWVkIHN0eWxlIGNvbnRleHRzIGZyb20gdGhlIHN0eWxlclxuICAgIHN0eWxlS2V5czoge30sXG4gICAgLy8gcGVyLWdyb3VwIGtleXMgb2Ygc3R5bGUgcHJvcGVydHkgdmFsdWVzXG4gICAgcmVtb3ZlZDogdHJ1ZSxcbiAgICAvLyB3aGV0aGVyIGl0J3MgaW5zaWRlIHRoZSB2aXM7IHRydWUgaWYgcmVtb3ZlZCAoc2V0IHRydWUgaGVyZSBzaW5jZSB3ZSBjYWxsIHJlc3RvcmUpXG4gICAgc2VsZWN0ZWQ6IHBhcmFtcy5zZWxlY3RlZCA/IHRydWUgOiBmYWxzZSxcbiAgICAvLyB3aGV0aGVyIGl0J3Mgc2VsZWN0ZWRcbiAgICBzZWxlY3RhYmxlOiBwYXJhbXMuc2VsZWN0YWJsZSA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IHBhcmFtcy5zZWxlY3RhYmxlID8gdHJ1ZSA6IGZhbHNlLFxuICAgIC8vIHdoZXRoZXIgaXQncyBzZWxlY3RhYmxlXG4gICAgbG9ja2VkOiBwYXJhbXMubG9ja2VkID8gdHJ1ZSA6IGZhbHNlLFxuICAgIC8vIHdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgbG9ja2VkIChjYW5ub3QgYmUgbW92ZWQpXG4gICAgZ3JhYmJlZDogZmFsc2UsXG4gICAgLy8gd2hldGhlciB0aGUgZWxlbWVudCBpcyBncmFiYmVkIGJ5IHRoZSBtb3VzZTsgcmVuZGVyZXIgc2V0cyB0aGlzIHByaXZhdGVseVxuICAgIGdyYWJiYWJsZTogcGFyYW1zLmdyYWJiYWJsZSA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IHBhcmFtcy5ncmFiYmFibGUgPyB0cnVlIDogZmFsc2UsXG4gICAgLy8gd2hldGhlciB0aGUgZWxlbWVudCBjYW4gYmUgZ3JhYmJlZFxuICAgIHBhbm5hYmxlOiBwYXJhbXMucGFubmFibGUgPT09IHVuZGVmaW5lZCA/IGdyb3VwID09PSAnZWRnZXMnID8gdHJ1ZSA6IGZhbHNlIDogcGFyYW1zLnBhbm5hYmxlID8gdHJ1ZSA6IGZhbHNlLFxuICAgIC8vIHdoZXRoZXIgdGhlIGVsZW1lbnQgaGFzIHBhc3N0aHJvdWdoIHBhbm5pbmcgZW5hYmxlZFxuICAgIGFjdGl2ZTogZmFsc2UsXG4gICAgLy8gd2hldGhlciB0aGUgZWxlbWVudCBpcyBhY3RpdmUgZnJvbSB1c2VyIGludGVyYWN0aW9uXG4gICAgY2xhc3NlczogbmV3IFNldCQxKCksXG4gICAgLy8gbWFwICggY2xhc3NOYW1lID0+IHRydWUgKVxuICAgIGFuaW1hdGlvbjoge1xuICAgICAgLy8gb2JqZWN0IGZvciBjdXJyZW50bHktcnVubmluZyBhbmltYXRpb25zXG4gICAgICBjdXJyZW50OiBbXSxcbiAgICAgIHF1ZXVlOiBbXVxuICAgIH0sXG4gICAgcnNjcmF0Y2g6IHt9LFxuICAgIC8vIG9iamVjdCBpbiB3aGljaCB0aGUgcmVuZGVyZXIgY2FuIHN0b3JlIGluZm9ybWF0aW9uXG4gICAgc2NyYXRjaDogcGFyYW1zLnNjcmF0Y2ggfHwge30sXG4gICAgLy8gc2NyYXRjaCBvYmplY3RzXG4gICAgZWRnZXM6IFtdLFxuICAgIC8vIGFycmF5IG9mIGNvbm5lY3RlZCBlZGdlc1xuICAgIGNoaWxkcmVuOiBbXSxcbiAgICAvLyBhcnJheSBvZiBjaGlsZHJlblxuICAgIHBhcmVudDogcGFyYW1zLnBhcmVudCAmJiBwYXJhbXMucGFyZW50LmlzTm9kZSgpID8gcGFyYW1zLnBhcmVudCA6IG51bGwsXG4gICAgLy8gcGFyZW50IHJlZlxuICAgIHRyYXZlcnNhbENhY2hlOiB7fSxcbiAgICAvLyBjYWNoZSBvZiBvdXRwdXQgb2YgdHJhdmVyc2FsIGZ1bmN0aW9uc1xuICAgIGJhY2tncm91bmRpbmc6IGZhbHNlLFxuICAgIC8vIHdoZXRoZXIgYmFja2dyb3VuZCBpbWFnZXMgYXJlIGxvYWRpbmdcbiAgICBiYkNhY2hlOiBudWxsLFxuICAgIC8vIGNhY2hlIG9mIHRoZSBjdXJyZW50IGJvdW5kaW5nIGJveFxuICAgIGJiQ2FjaGVTaGlmdDoge1xuICAgICAgeDogMCxcbiAgICAgIHk6IDBcbiAgICB9LFxuICAgIC8vIHNoaWZ0IGFwcGxpZWQgdG8gY2FjaGVkIGJiIHRvIGJlIGFwcGxpZWQgb24gbmV4dCBnZXRcbiAgICBib2R5Qm91bmRzOiBudWxsLFxuICAgIC8vIGJvdW5kcyBjYWNoZSBvZiBlbGVtZW50IGJvZHksIHcvbyBvdmVybGF5XG4gICAgb3ZlcmxheUJvdW5kczogbnVsbCxcbiAgICAvLyBib3VuZHMgY2FjaGUgb2YgZWxlbWVudCBib2R5LCBpbmNsdWRpbmcgb3ZlcmxheVxuICAgIGxhYmVsQm91bmRzOiB7XG4gICAgICAvLyBib3VuZHMgY2FjaGUgb2YgbGFiZWxzXG4gICAgICBhbGw6IG51bGwsXG4gICAgICBzb3VyY2U6IG51bGwsXG4gICAgICB0YXJnZXQ6IG51bGwsXG4gICAgICBtYWluOiBudWxsXG4gICAgfSxcbiAgICBhcnJvd0JvdW5kczoge1xuICAgICAgLy8gYm91bmRzIGNhY2hlIG9mIGVkZ2UgYXJyb3dzXG4gICAgICBzb3VyY2U6IG51bGwsXG4gICAgICB0YXJnZXQ6IG51bGwsXG4gICAgICAnbWlkLXNvdXJjZSc6IG51bGwsXG4gICAgICAnbWlkLXRhcmdldCc6IG51bGxcbiAgICB9XG4gIH07XG4gIGlmIChfcC5wb3NpdGlvbi54ID09IG51bGwpIHtcbiAgICBfcC5wb3NpdGlvbi54ID0gMDtcbiAgfVxuICBpZiAoX3AucG9zaXRpb24ueSA9PSBudWxsKSB7XG4gICAgX3AucG9zaXRpb24ueSA9IDA7XG4gIH1cblxuICAvLyByZW5kZXJlZFBvc2l0aW9uIG92ZXJyaWRlcyBpZiBzcGVjaWZpZWRcbiAgaWYgKHBhcmFtcy5yZW5kZXJlZFBvc2l0aW9uKSB7XG4gICAgdmFyIHJwb3MgPSBwYXJhbXMucmVuZGVyZWRQb3NpdGlvbjtcbiAgICB2YXIgcGFuID0gY3kucGFuKCk7XG4gICAgdmFyIHpvb20gPSBjeS56b29tKCk7XG4gICAgX3AucG9zaXRpb24gPSB7XG4gICAgICB4OiAocnBvcy54IC0gcGFuLngpIC8gem9vbSxcbiAgICAgIHk6IChycG9zLnkgLSBwYW4ueSkgLyB6b29tXG4gICAgfTtcbiAgfVxuICB2YXIgY2xhc3NlcyA9IFtdO1xuICBpZiAoYXJyYXkocGFyYW1zLmNsYXNzZXMpKSB7XG4gICAgY2xhc3NlcyA9IHBhcmFtcy5jbGFzc2VzO1xuICB9IGVsc2UgaWYgKHN0cmluZyhwYXJhbXMuY2xhc3NlcykpIHtcbiAgICBjbGFzc2VzID0gcGFyYW1zLmNsYXNzZXMuc3BsaXQoL1xccysvKTtcbiAgfVxuICBmb3IgKHZhciBpID0gMCwgbCA9IGNsYXNzZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgdmFyIGNscyA9IGNsYXNzZXNbaV07XG4gICAgaWYgKCFjbHMgfHwgY2xzID09PSAnJykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIF9wLmNsYXNzZXMuYWRkKGNscyk7XG4gIH1cbiAgdGhpcy5jcmVhdGVFbWl0dGVyKCk7XG4gIGlmIChyZXN0b3JlID09PSB1bmRlZmluZWQgfHwgcmVzdG9yZSkge1xuICAgIHRoaXMucmVzdG9yZSgpO1xuICB9XG4gIHZhciBieXBhc3MgPSBwYXJhbXMuc3R5bGUgfHwgcGFyYW1zLmNzcztcbiAgaWYgKGJ5cGFzcykge1xuICAgIHdhcm4oJ1NldHRpbmcgYSBgc3R5bGVgIGJ5cGFzcyBhdCBlbGVtZW50IGNyZWF0aW9uIHNob3VsZCBiZSBkb25lIG9ubHkgd2hlbiBhYnNvbHV0ZWx5IG5lY2Vzc2FyeS4gIFRyeSB0byB1c2UgdGhlIHN0eWxlc2hlZXQgaW5zdGVhZC4nKTtcbiAgICB0aGlzLnN0eWxlKGJ5cGFzcyk7XG4gIH1cbn07XG5cbnZhciBkZWZpbmVTZWFyY2ggPSBmdW5jdGlvbiBkZWZpbmVTZWFyY2gocGFyYW1zKSB7XG4gIHBhcmFtcyA9IHtcbiAgICBiZnM6IHBhcmFtcy5iZnMgfHwgIXBhcmFtcy5kZnMsXG4gICAgZGZzOiBwYXJhbXMuZGZzIHx8ICFwYXJhbXMuYmZzXG4gIH07XG5cbiAgLy8gZnJvbSBwc2V1ZG9jb2RlIG9uIHdpa2lwZWRpYVxuICByZXR1cm4gZnVuY3Rpb24gc2VhcmNoRm4ocm9vdHMsIGZuLCBkaXJlY3RlZCkge1xuICAgIHZhciBvcHRpb25zO1xuICAgIGlmIChwbGFpbk9iamVjdChyb290cykgJiYgIWVsZW1lbnRPckNvbGxlY3Rpb24ocm9vdHMpKSB7XG4gICAgICBvcHRpb25zID0gcm9vdHM7XG4gICAgICByb290cyA9IG9wdGlvbnMucm9vdHMgfHwgb3B0aW9ucy5yb290O1xuICAgICAgZm4gPSBvcHRpb25zLnZpc2l0O1xuICAgICAgZGlyZWN0ZWQgPSBvcHRpb25zLmRpcmVjdGVkO1xuICAgIH1cbiAgICBkaXJlY3RlZCA9IGFyZ3VtZW50cy5sZW5ndGggPT09IDIgJiYgIWZuJDYoZm4pID8gZm4gOiBkaXJlY3RlZDtcbiAgICBmbiA9IGZuJDYoZm4pID8gZm4gOiBmdW5jdGlvbiAoKSB7fTtcbiAgICB2YXIgY3kgPSB0aGlzLl9wcml2YXRlLmN5O1xuICAgIHZhciB2ID0gcm9vdHMgPSBzdHJpbmcocm9vdHMpID8gdGhpcy5maWx0ZXIocm9vdHMpIDogcm9vdHM7XG4gICAgdmFyIFEgPSBbXTtcbiAgICB2YXIgY29ubmVjdGVkTm9kZXMgPSBbXTtcbiAgICB2YXIgY29ubmVjdGVkQnkgPSB7fTtcbiAgICB2YXIgaWQyZGVwdGggPSB7fTtcbiAgICB2YXIgViA9IHt9O1xuICAgIHZhciBqID0gMDtcbiAgICB2YXIgZm91bmQ7XG4gICAgdmFyIF90aGlzJGJ5R3JvdXAgPSB0aGlzLmJ5R3JvdXAoKSxcbiAgICAgIG5vZGVzID0gX3RoaXMkYnlHcm91cC5ub2RlcyxcbiAgICAgIGVkZ2VzID0gX3RoaXMkYnlHcm91cC5lZGdlcztcblxuICAgIC8vIGVucXVldWUgdlxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdi5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHZpID0gdltpXTtcbiAgICAgIHZhciB2aUlkID0gdmkuaWQoKTtcbiAgICAgIGlmICh2aS5pc05vZGUoKSkge1xuICAgICAgICBRLnVuc2hpZnQodmkpO1xuICAgICAgICBpZiAocGFyYW1zLmJmcykge1xuICAgICAgICAgIFZbdmlJZF0gPSB0cnVlO1xuICAgICAgICAgIGNvbm5lY3RlZE5vZGVzLnB1c2godmkpO1xuICAgICAgICB9XG4gICAgICAgIGlkMmRlcHRoW3ZpSWRdID0gMDtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoKSB7XG4gICAgICAgIHZhciB2ID0gcGFyYW1zLmJmcyA/IFEuc2hpZnQoKSA6IFEucG9wKCk7XG4gICAgICAgIHZhciB2SWQgPSB2LmlkKCk7XG4gICAgICAgIGlmIChwYXJhbXMuZGZzKSB7XG4gICAgICAgICAgaWYgKFZbdklkXSkge1xuICAgICAgICAgICAgcmV0dXJuIDA7IC8vIGNvbnRpbnVlXG4gICAgICAgICAgfVxuICAgICAgICAgIFZbdklkXSA9IHRydWU7XG4gICAgICAgICAgY29ubmVjdGVkTm9kZXMucHVzaCh2KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGVwdGggPSBpZDJkZXB0aFt2SWRdO1xuICAgICAgICB2YXIgcHJldkVkZ2UgPSBjb25uZWN0ZWRCeVt2SWRdO1xuICAgICAgICB2YXIgc3JjID0gcHJldkVkZ2UgIT0gbnVsbCA/IHByZXZFZGdlLnNvdXJjZSgpIDogbnVsbDtcbiAgICAgICAgdmFyIHRndCA9IHByZXZFZGdlICE9IG51bGwgPyBwcmV2RWRnZS50YXJnZXQoKSA6IG51bGw7XG4gICAgICAgIHZhciBwcmV2Tm9kZSA9IHByZXZFZGdlID09IG51bGwgPyB1bmRlZmluZWQgOiB2LnNhbWUoc3JjKSA/IHRndFswXSA6IHNyY1swXTtcbiAgICAgICAgdmFyIHJldDtcbiAgICAgICAgcmV0ID0gZm4odiwgcHJldkVkZ2UsIHByZXZOb2RlLCBqKyssIGRlcHRoKTtcbiAgICAgICAgaWYgKHJldCA9PT0gdHJ1ZSkge1xuICAgICAgICAgIGZvdW5kID0gdjtcbiAgICAgICAgICByZXR1cm4gMTsgLy8gYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmV0ID09PSBmYWxzZSkge1xuICAgICAgICAgIHJldHVybiAxOyAvLyBicmVha1xuICAgICAgICB9XG4gICAgICAgIHZhciB2d0VkZ2VzID0gdi5jb25uZWN0ZWRFZGdlcygpLmZpbHRlcihmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIHJldHVybiAoIWRpcmVjdGVkIHx8IGUuc291cmNlKCkuc2FtZSh2KSkgJiYgZWRnZXMuaGFzKGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgdndFZGdlcy5sZW5ndGg7IF9pMisrKSB7XG4gICAgICAgICAgdmFyIGUgPSB2d0VkZ2VzW19pMl07XG4gICAgICAgICAgdmFyIHcgPSBlLmNvbm5lY3RlZE5vZGVzKCkuZmlsdGVyKGZ1bmN0aW9uIChuKSB7XG4gICAgICAgICAgICByZXR1cm4gIW4uc2FtZSh2KSAmJiBub2Rlcy5oYXMobik7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdmFyIHdJZCA9IHcuaWQoKTtcbiAgICAgICAgICBpZiAody5sZW5ndGggIT09IDAgJiYgIVZbd0lkXSkge1xuICAgICAgICAgICAgdyA9IHdbMF07XG4gICAgICAgICAgICBRLnB1c2godyk7XG4gICAgICAgICAgICBpZiAocGFyYW1zLmJmcykge1xuICAgICAgICAgICAgICBWW3dJZF0gPSB0cnVlO1xuICAgICAgICAgICAgICBjb25uZWN0ZWROb2Rlcy5wdXNoKHcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29ubmVjdGVkQnlbd0lkXSA9IGU7XG4gICAgICAgICAgICBpZDJkZXB0aFt3SWRdID0gaWQyZGVwdGhbdklkXSArIDE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgX3JldDtcbiAgICB3aGlsZSAoUS5sZW5ndGggIT09IDApIHtcbiAgICAgIF9yZXQgPSBfbG9vcCgpO1xuICAgICAgaWYgKF9yZXQgPT09IDApIGNvbnRpbnVlO1xuICAgICAgaWYgKF9yZXQgPT09IDEpIGJyZWFrO1xuICAgIH1cbiAgICB2YXIgY29ubmVjdGVkRWxlcyA9IGN5LmNvbGxlY3Rpb24oKTtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgY29ubmVjdGVkTm9kZXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgbm9kZSA9IGNvbm5lY3RlZE5vZGVzW19pXTtcbiAgICAgIHZhciBlZGdlID0gY29ubmVjdGVkQnlbbm9kZS5pZCgpXTtcbiAgICAgIGlmIChlZGdlICE9IG51bGwpIHtcbiAgICAgICAgY29ubmVjdGVkRWxlcy5wdXNoKGVkZ2UpO1xuICAgICAgfVxuICAgICAgY29ubmVjdGVkRWxlcy5wdXNoKG5vZGUpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcGF0aDogY3kuY29sbGVjdGlvbihjb25uZWN0ZWRFbGVzKSxcbiAgICAgIGZvdW5kOiBjeS5jb2xsZWN0aW9uKGZvdW5kKVxuICAgIH07XG4gIH07XG59O1xuXG4vLyBzZWFyY2gsIHNwYW5uaW5nIHRyZWVzLCBldGNcbnZhciBlbGVzZm4kdiA9IHtcbiAgYnJlYWR0aEZpcnN0U2VhcmNoOiBkZWZpbmVTZWFyY2goe1xuICAgIGJmczogdHJ1ZVxuICB9KSxcbiAgZGVwdGhGaXJzdFNlYXJjaDogZGVmaW5lU2VhcmNoKHtcbiAgICBkZnM6IHRydWVcbiAgfSlcbn07XG5cbi8vIG5pY2UsIHNob3J0IG1hdGhlbWF0aWNhbCBhbGlhc1xuZWxlc2ZuJHYuYmZzID0gZWxlc2ZuJHYuYnJlYWR0aEZpcnN0U2VhcmNoO1xuZWxlc2ZuJHYuZGZzID0gZWxlc2ZuJHYuZGVwdGhGaXJzdFNlYXJjaDtcblxudmFyIGhlYXAkMiA9IHtleHBvcnRzOiB7fX07XG5cbnZhciBoZWFwJDEgPSBoZWFwJDIuZXhwb3J0cztcblxudmFyIGhhc1JlcXVpcmVkSGVhcCQxO1xuXG5mdW5jdGlvbiByZXF1aXJlSGVhcCQxICgpIHtcblx0aWYgKGhhc1JlcXVpcmVkSGVhcCQxKSByZXR1cm4gaGVhcCQyLmV4cG9ydHM7XG5cdGhhc1JlcXVpcmVkSGVhcCQxID0gMTtcblx0KGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMkMSkge1xuXHRcdC8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS44LjBcblx0XHQoZnVuY3Rpb24oKSB7XG5cdFx0ICB2YXIgSGVhcCwgZGVmYXVsdENtcCwgZmxvb3IsIGhlYXBpZnksIGhlYXBwb3AsIGhlYXBwdXNoLCBoZWFwcHVzaHBvcCwgaGVhcHJlcGxhY2UsIGluc29ydCwgbWluLCBubGFyZ2VzdCwgbnNtYWxsZXN0LCB1cGRhdGVJdGVtLCBfc2lmdGRvd24sIF9zaWZ0dXA7XG5cblx0XHQgIGZsb29yID0gTWF0aC5mbG9vciwgbWluID0gTWF0aC5taW47XG5cblxuXHRcdCAgLypcblx0XHQgIERlZmF1bHQgY29tcGFyaXNvbiBmdW5jdGlvbiB0byBiZSB1c2VkXG5cdFx0ICAgKi9cblxuXHRcdCAgZGVmYXVsdENtcCA9IGZ1bmN0aW9uKHgsIHkpIHtcblx0XHQgICAgaWYgKHggPCB5KSB7XG5cdFx0ICAgICAgcmV0dXJuIC0xO1xuXHRcdCAgICB9XG5cdFx0ICAgIGlmICh4ID4geSkge1xuXHRcdCAgICAgIHJldHVybiAxO1xuXHRcdCAgICB9XG5cdFx0ICAgIHJldHVybiAwO1xuXHRcdCAgfTtcblxuXG5cdFx0ICAvKlxuXHRcdCAgSW5zZXJ0IGl0ZW0geCBpbiBsaXN0IGEsIGFuZCBrZWVwIGl0IHNvcnRlZCBhc3N1bWluZyBhIGlzIHNvcnRlZC5cblx0XHQgIFxuXHRcdCAgSWYgeCBpcyBhbHJlYWR5IGluIGEsIGluc2VydCBpdCB0byB0aGUgcmlnaHQgb2YgdGhlIHJpZ2h0bW9zdCB4LlxuXHRcdCAgXG5cdFx0ICBPcHRpb25hbCBhcmdzIGxvIChkZWZhdWx0IDApIGFuZCBoaSAoZGVmYXVsdCBhLmxlbmd0aCkgYm91bmQgdGhlIHNsaWNlXG5cdFx0ICBvZiBhIHRvIGJlIHNlYXJjaGVkLlxuXHRcdCAgICovXG5cblx0XHQgIGluc29ydCA9IGZ1bmN0aW9uKGEsIHgsIGxvLCBoaSwgY21wKSB7XG5cdFx0ICAgIHZhciBtaWQ7XG5cdFx0ICAgIGlmIChsbyA9PSBudWxsKSB7XG5cdFx0ICAgICAgbG8gPSAwO1xuXHRcdCAgICB9XG5cdFx0ICAgIGlmIChjbXAgPT0gbnVsbCkge1xuXHRcdCAgICAgIGNtcCA9IGRlZmF1bHRDbXA7XG5cdFx0ICAgIH1cblx0XHQgICAgaWYgKGxvIDwgMCkge1xuXHRcdCAgICAgIHRocm93IG5ldyBFcnJvcignbG8gbXVzdCBiZSBub24tbmVnYXRpdmUnKTtcblx0XHQgICAgfVxuXHRcdCAgICBpZiAoaGkgPT0gbnVsbCkge1xuXHRcdCAgICAgIGhpID0gYS5sZW5ndGg7XG5cdFx0ICAgIH1cblx0XHQgICAgd2hpbGUgKGxvIDwgaGkpIHtcblx0XHQgICAgICBtaWQgPSBmbG9vcigobG8gKyBoaSkgLyAyKTtcblx0XHQgICAgICBpZiAoY21wKHgsIGFbbWlkXSkgPCAwKSB7XG5cdFx0ICAgICAgICBoaSA9IG1pZDtcblx0XHQgICAgICB9IGVsc2Uge1xuXHRcdCAgICAgICAgbG8gPSBtaWQgKyAxO1xuXHRcdCAgICAgIH1cblx0XHQgICAgfVxuXHRcdCAgICByZXR1cm4gKFtdLnNwbGljZS5hcHBseShhLCBbbG8sIGxvIC0gbG9dLmNvbmNhdCh4KSksIHgpO1xuXHRcdCAgfTtcblxuXG5cdFx0ICAvKlxuXHRcdCAgUHVzaCBpdGVtIG9udG8gaGVhcCwgbWFpbnRhaW5pbmcgdGhlIGhlYXAgaW52YXJpYW50LlxuXHRcdCAgICovXG5cblx0XHQgIGhlYXBwdXNoID0gZnVuY3Rpb24oYXJyYXksIGl0ZW0sIGNtcCkge1xuXHRcdCAgICBpZiAoY21wID09IG51bGwpIHtcblx0XHQgICAgICBjbXAgPSBkZWZhdWx0Q21wO1xuXHRcdCAgICB9XG5cdFx0ICAgIGFycmF5LnB1c2goaXRlbSk7XG5cdFx0ICAgIHJldHVybiBfc2lmdGRvd24oYXJyYXksIDAsIGFycmF5Lmxlbmd0aCAtIDEsIGNtcCk7XG5cdFx0ICB9O1xuXG5cblx0XHQgIC8qXG5cdFx0ICBQb3AgdGhlIHNtYWxsZXN0IGl0ZW0gb2ZmIHRoZSBoZWFwLCBtYWludGFpbmluZyB0aGUgaGVhcCBpbnZhcmlhbnQuXG5cdFx0ICAgKi9cblxuXHRcdCAgaGVhcHBvcCA9IGZ1bmN0aW9uKGFycmF5LCBjbXApIHtcblx0XHQgICAgdmFyIGxhc3RlbHQsIHJldHVybml0ZW07XG5cdFx0ICAgIGlmIChjbXAgPT0gbnVsbCkge1xuXHRcdCAgICAgIGNtcCA9IGRlZmF1bHRDbXA7XG5cdFx0ICAgIH1cblx0XHQgICAgbGFzdGVsdCA9IGFycmF5LnBvcCgpO1xuXHRcdCAgICBpZiAoYXJyYXkubGVuZ3RoKSB7XG5cdFx0ICAgICAgcmV0dXJuaXRlbSA9IGFycmF5WzBdO1xuXHRcdCAgICAgIGFycmF5WzBdID0gbGFzdGVsdDtcblx0XHQgICAgICBfc2lmdHVwKGFycmF5LCAwLCBjbXApO1xuXHRcdCAgICB9IGVsc2Uge1xuXHRcdCAgICAgIHJldHVybml0ZW0gPSBsYXN0ZWx0O1xuXHRcdCAgICB9XG5cdFx0ICAgIHJldHVybiByZXR1cm5pdGVtO1xuXHRcdCAgfTtcblxuXG5cdFx0ICAvKlxuXHRcdCAgUG9wIGFuZCByZXR1cm4gdGhlIGN1cnJlbnQgc21hbGxlc3QgdmFsdWUsIGFuZCBhZGQgdGhlIG5ldyBpdGVtLlxuXHRcdCAgXG5cdFx0ICBUaGlzIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gaGVhcHBvcCgpIGZvbGxvd2VkIGJ5IGhlYXBwdXNoKCksIGFuZCBjYW4gYmVcblx0XHQgIG1vcmUgYXBwcm9wcmlhdGUgd2hlbiB1c2luZyBhIGZpeGVkIHNpemUgaGVhcC4gTm90ZSB0aGF0IHRoZSB2YWx1ZVxuXHRcdCAgcmV0dXJuZWQgbWF5IGJlIGxhcmdlciB0aGFuIGl0ZW0hIFRoYXQgY29uc3RyYWlucyByZWFzb25hYmxlIHVzZSBvZlxuXHRcdCAgdGhpcyByb3V0aW5lIHVubGVzcyB3cml0dGVuIGFzIHBhcnQgb2YgYSBjb25kaXRpb25hbCByZXBsYWNlbWVudDpcblx0XHQgICAgICBpZiBpdGVtID4gYXJyYXlbMF1cblx0XHQgICAgICAgIGl0ZW0gPSBoZWFwcmVwbGFjZShhcnJheSwgaXRlbSlcblx0XHQgICAqL1xuXG5cdFx0ICBoZWFwcmVwbGFjZSA9IGZ1bmN0aW9uKGFycmF5LCBpdGVtLCBjbXApIHtcblx0XHQgICAgdmFyIHJldHVybml0ZW07XG5cdFx0ICAgIGlmIChjbXAgPT0gbnVsbCkge1xuXHRcdCAgICAgIGNtcCA9IGRlZmF1bHRDbXA7XG5cdFx0ICAgIH1cblx0XHQgICAgcmV0dXJuaXRlbSA9IGFycmF5WzBdO1xuXHRcdCAgICBhcnJheVswXSA9IGl0ZW07XG5cdFx0ICAgIF9zaWZ0dXAoYXJyYXksIDAsIGNtcCk7XG5cdFx0ICAgIHJldHVybiByZXR1cm5pdGVtO1xuXHRcdCAgfTtcblxuXG5cdFx0ICAvKlxuXHRcdCAgRmFzdCB2ZXJzaW9uIG9mIGEgaGVhcHB1c2ggZm9sbG93ZWQgYnkgYSBoZWFwcG9wLlxuXHRcdCAgICovXG5cblx0XHQgIGhlYXBwdXNocG9wID0gZnVuY3Rpb24oYXJyYXksIGl0ZW0sIGNtcCkge1xuXHRcdCAgICB2YXIgX3JlZjtcblx0XHQgICAgaWYgKGNtcCA9PSBudWxsKSB7XG5cdFx0ICAgICAgY21wID0gZGVmYXVsdENtcDtcblx0XHQgICAgfVxuXHRcdCAgICBpZiAoYXJyYXkubGVuZ3RoICYmIGNtcChhcnJheVswXSwgaXRlbSkgPCAwKSB7XG5cdFx0ICAgICAgX3JlZiA9IFthcnJheVswXSwgaXRlbV0sIGl0ZW0gPSBfcmVmWzBdLCBhcnJheVswXSA9IF9yZWZbMV07XG5cdFx0ICAgICAgX3NpZnR1cChhcnJheSwgMCwgY21wKTtcblx0XHQgICAgfVxuXHRcdCAgICByZXR1cm4gaXRlbTtcblx0XHQgIH07XG5cblxuXHRcdCAgLypcblx0XHQgIFRyYW5zZm9ybSBsaXN0IGludG8gYSBoZWFwLCBpbi1wbGFjZSwgaW4gTyhhcnJheS5sZW5ndGgpIHRpbWUuXG5cdFx0ICAgKi9cblxuXHRcdCAgaGVhcGlmeSA9IGZ1bmN0aW9uKGFycmF5LCBjbXApIHtcblx0XHQgICAgdmFyIGksIF9pLCBfbGVuLCBfcmVmMSwgX3Jlc3VsdHMsIF9yZXN1bHRzMTtcblx0XHQgICAgaWYgKGNtcCA9PSBudWxsKSB7XG5cdFx0ICAgICAgY21wID0gZGVmYXVsdENtcDtcblx0XHQgICAgfVxuXHRcdCAgICBfcmVmMSA9IChmdW5jdGlvbigpIHtcblx0XHQgICAgICBfcmVzdWx0czEgPSBbXTtcblx0XHQgICAgICBmb3IgKHZhciBfaiA9IDAsIF9yZWYgPSBmbG9vcihhcnJheS5sZW5ndGggLyAyKTsgMCA8PSBfcmVmID8gX2ogPCBfcmVmIDogX2ogPiBfcmVmOyAwIDw9IF9yZWYgPyBfaisrIDogX2otLSl7IF9yZXN1bHRzMS5wdXNoKF9qKTsgfVxuXHRcdCAgICAgIHJldHVybiBfcmVzdWx0czE7XG5cdFx0ICAgIH0pLmFwcGx5KHRoaXMpLnJldmVyc2UoKTtcblx0XHQgICAgX3Jlc3VsdHMgPSBbXTtcblx0XHQgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBfcmVmMS5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykge1xuXHRcdCAgICAgIGkgPSBfcmVmMVtfaV07XG5cdFx0ICAgICAgX3Jlc3VsdHMucHVzaChfc2lmdHVwKGFycmF5LCBpLCBjbXApKTtcblx0XHQgICAgfVxuXHRcdCAgICByZXR1cm4gX3Jlc3VsdHM7XG5cdFx0ICB9O1xuXG5cblx0XHQgIC8qXG5cdFx0ICBVcGRhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBnaXZlbiBpdGVtIGluIHRoZSBoZWFwLlxuXHRcdCAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGV2ZXJ5IHRpbWUgdGhlIGl0ZW0gaXMgYmVpbmcgbW9kaWZpZWQuXG5cdFx0ICAgKi9cblxuXHRcdCAgdXBkYXRlSXRlbSA9IGZ1bmN0aW9uKGFycmF5LCBpdGVtLCBjbXApIHtcblx0XHQgICAgdmFyIHBvcztcblx0XHQgICAgaWYgKGNtcCA9PSBudWxsKSB7XG5cdFx0ICAgICAgY21wID0gZGVmYXVsdENtcDtcblx0XHQgICAgfVxuXHRcdCAgICBwb3MgPSBhcnJheS5pbmRleE9mKGl0ZW0pO1xuXHRcdCAgICBpZiAocG9zID09PSAtMSkge1xuXHRcdCAgICAgIHJldHVybjtcblx0XHQgICAgfVxuXHRcdCAgICBfc2lmdGRvd24oYXJyYXksIDAsIHBvcywgY21wKTtcblx0XHQgICAgcmV0dXJuIF9zaWZ0dXAoYXJyYXksIHBvcywgY21wKTtcblx0XHQgIH07XG5cblxuXHRcdCAgLypcblx0XHQgIEZpbmQgdGhlIG4gbGFyZ2VzdCBlbGVtZW50cyBpbiBhIGRhdGFzZXQuXG5cdFx0ICAgKi9cblxuXHRcdCAgbmxhcmdlc3QgPSBmdW5jdGlvbihhcnJheSwgbiwgY21wKSB7XG5cdFx0ICAgIHZhciBlbGVtLCByZXN1bHQsIF9pLCBfbGVuLCBfcmVmO1xuXHRcdCAgICBpZiAoY21wID09IG51bGwpIHtcblx0XHQgICAgICBjbXAgPSBkZWZhdWx0Q21wO1xuXHRcdCAgICB9XG5cdFx0ICAgIHJlc3VsdCA9IGFycmF5LnNsaWNlKDAsIG4pO1xuXHRcdCAgICBpZiAoIXJlc3VsdC5sZW5ndGgpIHtcblx0XHQgICAgICByZXR1cm4gcmVzdWx0O1xuXHRcdCAgICB9XG5cdFx0ICAgIGhlYXBpZnkocmVzdWx0LCBjbXApO1xuXHRcdCAgICBfcmVmID0gYXJyYXkuc2xpY2Uobik7XG5cdFx0ICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZi5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykge1xuXHRcdCAgICAgIGVsZW0gPSBfcmVmW19pXTtcblx0XHQgICAgICBoZWFwcHVzaHBvcChyZXN1bHQsIGVsZW0sIGNtcCk7XG5cdFx0ICAgIH1cblx0XHQgICAgcmV0dXJuIHJlc3VsdC5zb3J0KGNtcCkucmV2ZXJzZSgpO1xuXHRcdCAgfTtcblxuXG5cdFx0ICAvKlxuXHRcdCAgRmluZCB0aGUgbiBzbWFsbGVzdCBlbGVtZW50cyBpbiBhIGRhdGFzZXQuXG5cdFx0ICAgKi9cblxuXHRcdCAgbnNtYWxsZXN0ID0gZnVuY3Rpb24oYXJyYXksIG4sIGNtcCkge1xuXHRcdCAgICB2YXIgZWxlbSwgbG9zLCByZXN1bHQsIF9pLCBfaiwgX2xlbiwgX3JlZiwgX3JlZjEsIF9yZXN1bHRzO1xuXHRcdCAgICBpZiAoY21wID09IG51bGwpIHtcblx0XHQgICAgICBjbXAgPSBkZWZhdWx0Q21wO1xuXHRcdCAgICB9XG5cdFx0ICAgIGlmIChuICogMTAgPD0gYXJyYXkubGVuZ3RoKSB7XG5cdFx0ICAgICAgcmVzdWx0ID0gYXJyYXkuc2xpY2UoMCwgbikuc29ydChjbXApO1xuXHRcdCAgICAgIGlmICghcmVzdWx0Lmxlbmd0aCkge1xuXHRcdCAgICAgICAgcmV0dXJuIHJlc3VsdDtcblx0XHQgICAgICB9XG5cdFx0ICAgICAgbG9zID0gcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXTtcblx0XHQgICAgICBfcmVmID0gYXJyYXkuc2xpY2Uobik7XG5cdFx0ICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBfcmVmLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7XG5cdFx0ICAgICAgICBlbGVtID0gX3JlZltfaV07XG5cdFx0ICAgICAgICBpZiAoY21wKGVsZW0sIGxvcykgPCAwKSB7XG5cdFx0ICAgICAgICAgIGluc29ydChyZXN1bHQsIGVsZW0sIDAsIG51bGwsIGNtcCk7XG5cdFx0ICAgICAgICAgIHJlc3VsdC5wb3AoKTtcblx0XHQgICAgICAgICAgbG9zID0gcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXTtcblx0XHQgICAgICAgIH1cblx0XHQgICAgICB9XG5cdFx0ICAgICAgcmV0dXJuIHJlc3VsdDtcblx0XHQgICAgfVxuXHRcdCAgICBoZWFwaWZ5KGFycmF5LCBjbXApO1xuXHRcdCAgICBfcmVzdWx0cyA9IFtdO1xuXHRcdCAgICBmb3IgKF9qID0gMCwgX3JlZjEgPSBtaW4obiwgYXJyYXkubGVuZ3RoKTsgMCA8PSBfcmVmMSA/IF9qIDwgX3JlZjEgOiBfaiA+IF9yZWYxOyAwIDw9IF9yZWYxID8gKytfaiA6IC0tX2opIHtcblx0XHQgICAgICBfcmVzdWx0cy5wdXNoKGhlYXBwb3AoYXJyYXksIGNtcCkpO1xuXHRcdCAgICB9XG5cdFx0ICAgIHJldHVybiBfcmVzdWx0cztcblx0XHQgIH07XG5cblx0XHQgIF9zaWZ0ZG93biA9IGZ1bmN0aW9uKGFycmF5LCBzdGFydHBvcywgcG9zLCBjbXApIHtcblx0XHQgICAgdmFyIG5ld2l0ZW0sIHBhcmVudCwgcGFyZW50cG9zO1xuXHRcdCAgICBpZiAoY21wID09IG51bGwpIHtcblx0XHQgICAgICBjbXAgPSBkZWZhdWx0Q21wO1xuXHRcdCAgICB9XG5cdFx0ICAgIG5ld2l0ZW0gPSBhcnJheVtwb3NdO1xuXHRcdCAgICB3aGlsZSAocG9zID4gc3RhcnRwb3MpIHtcblx0XHQgICAgICBwYXJlbnRwb3MgPSAocG9zIC0gMSkgPj4gMTtcblx0XHQgICAgICBwYXJlbnQgPSBhcnJheVtwYXJlbnRwb3NdO1xuXHRcdCAgICAgIGlmIChjbXAobmV3aXRlbSwgcGFyZW50KSA8IDApIHtcblx0XHQgICAgICAgIGFycmF5W3Bvc10gPSBwYXJlbnQ7XG5cdFx0ICAgICAgICBwb3MgPSBwYXJlbnRwb3M7XG5cdFx0ICAgICAgICBjb250aW51ZTtcblx0XHQgICAgICB9XG5cdFx0ICAgICAgYnJlYWs7XG5cdFx0ICAgIH1cblx0XHQgICAgcmV0dXJuIGFycmF5W3Bvc10gPSBuZXdpdGVtO1xuXHRcdCAgfTtcblxuXHRcdCAgX3NpZnR1cCA9IGZ1bmN0aW9uKGFycmF5LCBwb3MsIGNtcCkge1xuXHRcdCAgICB2YXIgY2hpbGRwb3MsIGVuZHBvcywgbmV3aXRlbSwgcmlnaHRwb3MsIHN0YXJ0cG9zO1xuXHRcdCAgICBpZiAoY21wID09IG51bGwpIHtcblx0XHQgICAgICBjbXAgPSBkZWZhdWx0Q21wO1xuXHRcdCAgICB9XG5cdFx0ICAgIGVuZHBvcyA9IGFycmF5Lmxlbmd0aDtcblx0XHQgICAgc3RhcnRwb3MgPSBwb3M7XG5cdFx0ICAgIG5ld2l0ZW0gPSBhcnJheVtwb3NdO1xuXHRcdCAgICBjaGlsZHBvcyA9IDIgKiBwb3MgKyAxO1xuXHRcdCAgICB3aGlsZSAoY2hpbGRwb3MgPCBlbmRwb3MpIHtcblx0XHQgICAgICByaWdodHBvcyA9IGNoaWxkcG9zICsgMTtcblx0XHQgICAgICBpZiAocmlnaHRwb3MgPCBlbmRwb3MgJiYgIShjbXAoYXJyYXlbY2hpbGRwb3NdLCBhcnJheVtyaWdodHBvc10pIDwgMCkpIHtcblx0XHQgICAgICAgIGNoaWxkcG9zID0gcmlnaHRwb3M7XG5cdFx0ICAgICAgfVxuXHRcdCAgICAgIGFycmF5W3Bvc10gPSBhcnJheVtjaGlsZHBvc107XG5cdFx0ICAgICAgcG9zID0gY2hpbGRwb3M7XG5cdFx0ICAgICAgY2hpbGRwb3MgPSAyICogcG9zICsgMTtcblx0XHQgICAgfVxuXHRcdCAgICBhcnJheVtwb3NdID0gbmV3aXRlbTtcblx0XHQgICAgcmV0dXJuIF9zaWZ0ZG93bihhcnJheSwgc3RhcnRwb3MsIHBvcywgY21wKTtcblx0XHQgIH07XG5cblx0XHQgIEhlYXAgPSAoZnVuY3Rpb24oKSB7XG5cdFx0ICAgIEhlYXAucHVzaCA9IGhlYXBwdXNoO1xuXG5cdFx0ICAgIEhlYXAucG9wID0gaGVhcHBvcDtcblxuXHRcdCAgICBIZWFwLnJlcGxhY2UgPSBoZWFwcmVwbGFjZTtcblxuXHRcdCAgICBIZWFwLnB1c2hwb3AgPSBoZWFwcHVzaHBvcDtcblxuXHRcdCAgICBIZWFwLmhlYXBpZnkgPSBoZWFwaWZ5O1xuXG5cdFx0ICAgIEhlYXAudXBkYXRlSXRlbSA9IHVwZGF0ZUl0ZW07XG5cblx0XHQgICAgSGVhcC5ubGFyZ2VzdCA9IG5sYXJnZXN0O1xuXG5cdFx0ICAgIEhlYXAubnNtYWxsZXN0ID0gbnNtYWxsZXN0O1xuXG5cdFx0ICAgIGZ1bmN0aW9uIEhlYXAoY21wKSB7XG5cdFx0ICAgICAgdGhpcy5jbXAgPSBjbXAgIT0gbnVsbCA/IGNtcCA6IGRlZmF1bHRDbXA7XG5cdFx0ICAgICAgdGhpcy5ub2RlcyA9IFtdO1xuXHRcdCAgICB9XG5cblx0XHQgICAgSGVhcC5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uKHgpIHtcblx0XHQgICAgICByZXR1cm4gaGVhcHB1c2godGhpcy5ub2RlcywgeCwgdGhpcy5jbXApO1xuXHRcdCAgICB9O1xuXG5cdFx0ICAgIEhlYXAucHJvdG90eXBlLnBvcCA9IGZ1bmN0aW9uKCkge1xuXHRcdCAgICAgIHJldHVybiBoZWFwcG9wKHRoaXMubm9kZXMsIHRoaXMuY21wKTtcblx0XHQgICAgfTtcblxuXHRcdCAgICBIZWFwLnByb3RvdHlwZS5wZWVrID0gZnVuY3Rpb24oKSB7XG5cdFx0ICAgICAgcmV0dXJuIHRoaXMubm9kZXNbMF07XG5cdFx0ICAgIH07XG5cblx0XHQgICAgSGVhcC5wcm90b3R5cGUuY29udGFpbnMgPSBmdW5jdGlvbih4KSB7XG5cdFx0ICAgICAgcmV0dXJuIHRoaXMubm9kZXMuaW5kZXhPZih4KSAhPT0gLTE7XG5cdFx0ICAgIH07XG5cblx0XHQgICAgSGVhcC5wcm90b3R5cGUucmVwbGFjZSA9IGZ1bmN0aW9uKHgpIHtcblx0XHQgICAgICByZXR1cm4gaGVhcHJlcGxhY2UodGhpcy5ub2RlcywgeCwgdGhpcy5jbXApO1xuXHRcdCAgICB9O1xuXG5cdFx0ICAgIEhlYXAucHJvdG90eXBlLnB1c2hwb3AgPSBmdW5jdGlvbih4KSB7XG5cdFx0ICAgICAgcmV0dXJuIGhlYXBwdXNocG9wKHRoaXMubm9kZXMsIHgsIHRoaXMuY21wKTtcblx0XHQgICAgfTtcblxuXHRcdCAgICBIZWFwLnByb3RvdHlwZS5oZWFwaWZ5ID0gZnVuY3Rpb24oKSB7XG5cdFx0ICAgICAgcmV0dXJuIGhlYXBpZnkodGhpcy5ub2RlcywgdGhpcy5jbXApO1xuXHRcdCAgICB9O1xuXG5cdFx0ICAgIEhlYXAucHJvdG90eXBlLnVwZGF0ZUl0ZW0gPSBmdW5jdGlvbih4KSB7XG5cdFx0ICAgICAgcmV0dXJuIHVwZGF0ZUl0ZW0odGhpcy5ub2RlcywgeCwgdGhpcy5jbXApO1xuXHRcdCAgICB9O1xuXG5cdFx0ICAgIEhlYXAucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24oKSB7XG5cdFx0ICAgICAgcmV0dXJuIHRoaXMubm9kZXMgPSBbXTtcblx0XHQgICAgfTtcblxuXHRcdCAgICBIZWFwLnByb3RvdHlwZS5lbXB0eSA9IGZ1bmN0aW9uKCkge1xuXHRcdCAgICAgIHJldHVybiB0aGlzLm5vZGVzLmxlbmd0aCA9PT0gMDtcblx0XHQgICAgfTtcblxuXHRcdCAgICBIZWFwLnByb3RvdHlwZS5zaXplID0gZnVuY3Rpb24oKSB7XG5cdFx0ICAgICAgcmV0dXJuIHRoaXMubm9kZXMubGVuZ3RoO1xuXHRcdCAgICB9O1xuXG5cdFx0ICAgIEhlYXAucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24oKSB7XG5cdFx0ICAgICAgdmFyIGhlYXA7XG5cdFx0ICAgICAgaGVhcCA9IG5ldyBIZWFwKCk7XG5cdFx0ICAgICAgaGVhcC5ub2RlcyA9IHRoaXMubm9kZXMuc2xpY2UoMCk7XG5cdFx0ICAgICAgcmV0dXJuIGhlYXA7XG5cdFx0ICAgIH07XG5cblx0XHQgICAgSGVhcC5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uKCkge1xuXHRcdCAgICAgIHJldHVybiB0aGlzLm5vZGVzLnNsaWNlKDApO1xuXHRcdCAgICB9O1xuXG5cdFx0ICAgIEhlYXAucHJvdG90eXBlLmluc2VydCA9IEhlYXAucHJvdG90eXBlLnB1c2g7XG5cblx0XHQgICAgSGVhcC5wcm90b3R5cGUudG9wID0gSGVhcC5wcm90b3R5cGUucGVlaztcblxuXHRcdCAgICBIZWFwLnByb3RvdHlwZS5mcm9udCA9IEhlYXAucHJvdG90eXBlLnBlZWs7XG5cblx0XHQgICAgSGVhcC5wcm90b3R5cGUuaGFzID0gSGVhcC5wcm90b3R5cGUuY29udGFpbnM7XG5cblx0XHQgICAgSGVhcC5wcm90b3R5cGUuY29weSA9IEhlYXAucHJvdG90eXBlLmNsb25lO1xuXG5cdFx0ICAgIHJldHVybiBIZWFwO1xuXG5cdFx0ICB9KSgpO1xuXG5cdFx0ICAoZnVuY3Rpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRcdCAgICB7XG5cdFx0ICAgICAgcmV0dXJuIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRcdCAgICB9XG5cdFx0ICB9KSh0aGlzLCBmdW5jdGlvbigpIHtcblx0XHQgICAgcmV0dXJuIEhlYXA7XG5cdFx0ICB9KTtcblxuXHRcdH0pLmNhbGwoaGVhcCQxKTsgXG5cdH0gKGhlYXAkMikpO1xuXHRyZXR1cm4gaGVhcCQyLmV4cG9ydHM7XG59XG5cbnZhciBoZWFwO1xudmFyIGhhc1JlcXVpcmVkSGVhcDtcblxuZnVuY3Rpb24gcmVxdWlyZUhlYXAgKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRIZWFwKSByZXR1cm4gaGVhcDtcblx0aGFzUmVxdWlyZWRIZWFwID0gMTtcblx0aGVhcCA9IHJlcXVpcmVIZWFwJDEoKTtcblx0cmV0dXJuIGhlYXA7XG59XG5cbnZhciBoZWFwRXhwb3J0cyA9IHJlcXVpcmVIZWFwKCk7XG52YXIgSGVhcCA9IC8qQF9fUFVSRV9fKi9nZXREZWZhdWx0RXhwb3J0RnJvbUNqcyhoZWFwRXhwb3J0cyk7XG5cbnZhciBkaWprc3RyYURlZmF1bHRzID0gZGVmYXVsdHMkZyh7XG4gIHJvb3Q6IG51bGwsXG4gIHdlaWdodDogZnVuY3Rpb24gd2VpZ2h0KGVkZ2UpIHtcbiAgICByZXR1cm4gMTtcbiAgfSxcbiAgZGlyZWN0ZWQ6IGZhbHNlXG59KTtcbnZhciBlbGVzZm4kdSA9IHtcbiAgZGlqa3N0cmE6IGZ1bmN0aW9uIGRpamtzdHJhKG9wdGlvbnMpIHtcbiAgICBpZiAoIXBsYWluT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgIG9wdGlvbnMgPSB7XG4gICAgICAgIHJvb3Q6IGFyZ3NbMF0sXG4gICAgICAgIHdlaWdodDogYXJnc1sxXSxcbiAgICAgICAgZGlyZWN0ZWQ6IGFyZ3NbMl1cbiAgICAgIH07XG4gICAgfVxuICAgIHZhciBfZGlqa3N0cmFEZWZhdWx0cyA9IGRpamtzdHJhRGVmYXVsdHMob3B0aW9ucyksXG4gICAgICByb290ID0gX2RpamtzdHJhRGVmYXVsdHMucm9vdCxcbiAgICAgIHdlaWdodCA9IF9kaWprc3RyYURlZmF1bHRzLndlaWdodCxcbiAgICAgIGRpcmVjdGVkID0gX2RpamtzdHJhRGVmYXVsdHMuZGlyZWN0ZWQ7XG4gICAgdmFyIGVsZXMgPSB0aGlzO1xuICAgIHZhciB3ZWlnaHRGbiA9IHdlaWdodDtcbiAgICB2YXIgc291cmNlID0gc3RyaW5nKHJvb3QpID8gdGhpcy5maWx0ZXIocm9vdClbMF0gOiByb290WzBdO1xuICAgIHZhciBkaXN0ID0ge307XG4gICAgdmFyIHByZXYgPSB7fTtcbiAgICB2YXIga25vd25EaXN0ID0ge307XG4gICAgdmFyIF90aGlzJGJ5R3JvdXAgPSB0aGlzLmJ5R3JvdXAoKSxcbiAgICAgIG5vZGVzID0gX3RoaXMkYnlHcm91cC5ub2RlcyxcbiAgICAgIGVkZ2VzID0gX3RoaXMkYnlHcm91cC5lZGdlcztcbiAgICBlZGdlcy51bm1lcmdlQnkoZnVuY3Rpb24gKGVsZSkge1xuICAgICAgcmV0dXJuIGVsZS5pc0xvb3AoKTtcbiAgICB9KTtcbiAgICB2YXIgZ2V0RGlzdCA9IGZ1bmN0aW9uIGdldERpc3Qobm9kZSkge1xuICAgICAgcmV0dXJuIGRpc3Rbbm9kZS5pZCgpXTtcbiAgICB9O1xuICAgIHZhciBzZXREaXN0ID0gZnVuY3Rpb24gc2V0RGlzdChub2RlLCBkKSB7XG4gICAgICBkaXN0W25vZGUuaWQoKV0gPSBkO1xuICAgICAgUS51cGRhdGVJdGVtKG5vZGUpO1xuICAgIH07XG4gICAgdmFyIFEgPSBuZXcgSGVhcChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGdldERpc3QoYSkgLSBnZXREaXN0KGIpO1xuICAgIH0pO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBub2RlID0gbm9kZXNbaV07XG4gICAgICBkaXN0W25vZGUuaWQoKV0gPSBub2RlLnNhbWUoc291cmNlKSA/IDAgOiBJbmZpbml0eTtcbiAgICAgIFEucHVzaChub2RlKTtcbiAgICB9XG4gICAgdmFyIGRpc3RCZXR3ZWVuID0gZnVuY3Rpb24gZGlzdEJldHdlZW4odSwgdikge1xuICAgICAgdmFyIHV2cyA9IChkaXJlY3RlZCA/IHUuZWRnZXNUbyh2KSA6IHUuZWRnZXNXaXRoKHYpKS5pbnRlcnNlY3QoZWRnZXMpO1xuICAgICAgdmFyIHNtYWxsZXN0RGlzdGFuY2UgPSBJbmZpbml0eTtcbiAgICAgIHZhciBzbWFsbGVzdEVkZ2U7XG4gICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgdXZzLmxlbmd0aDsgX2krKykge1xuICAgICAgICB2YXIgZWRnZSA9IHV2c1tfaV07XG4gICAgICAgIHZhciBfd2VpZ2h0ID0gd2VpZ2h0Rm4oZWRnZSk7XG4gICAgICAgIGlmIChfd2VpZ2h0IDwgc21hbGxlc3REaXN0YW5jZSB8fCAhc21hbGxlc3RFZGdlKSB7XG4gICAgICAgICAgc21hbGxlc3REaXN0YW5jZSA9IF93ZWlnaHQ7XG4gICAgICAgICAgc21hbGxlc3RFZGdlID0gZWRnZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZWRnZTogc21hbGxlc3RFZGdlLFxuICAgICAgICBkaXN0OiBzbWFsbGVzdERpc3RhbmNlXG4gICAgICB9O1xuICAgIH07XG4gICAgd2hpbGUgKFEuc2l6ZSgpID4gMCkge1xuICAgICAgdmFyIHUgPSBRLnBvcCgpO1xuICAgICAgdmFyIHNtYWxsZXRzRGlzdCA9IGdldERpc3QodSk7XG4gICAgICB2YXIgdWlkID0gdS5pZCgpO1xuICAgICAga25vd25EaXN0W3VpZF0gPSBzbWFsbGV0c0Rpc3Q7XG4gICAgICBpZiAoc21hbGxldHNEaXN0ID09PSBJbmZpbml0eSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBuZWlnaGJvcnMgPSB1Lm5laWdoYm9yaG9vZCgpLmludGVyc2VjdChub2Rlcyk7XG4gICAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBuZWlnaGJvcnMubGVuZ3RoOyBfaTIrKykge1xuICAgICAgICB2YXIgdiA9IG5laWdoYm9yc1tfaTJdO1xuICAgICAgICB2YXIgdmlkID0gdi5pZCgpO1xuICAgICAgICB2YXIgdkRpc3QgPSBkaXN0QmV0d2Vlbih1LCB2KTtcbiAgICAgICAgdmFyIGFsdCA9IHNtYWxsZXRzRGlzdCArIHZEaXN0LmRpc3Q7XG4gICAgICAgIGlmIChhbHQgPCBnZXREaXN0KHYpKSB7XG4gICAgICAgICAgc2V0RGlzdCh2LCBhbHQpO1xuICAgICAgICAgIHByZXZbdmlkXSA9IHtcbiAgICAgICAgICAgIG5vZGU6IHUsXG4gICAgICAgICAgICBlZGdlOiB2RGlzdC5lZGdlXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBmb3JcbiAgICB9IC8vIHdoaWxlXG5cbiAgICByZXR1cm4ge1xuICAgICAgZGlzdGFuY2VUbzogZnVuY3Rpb24gZGlzdGFuY2VUbyhub2RlKSB7XG4gICAgICAgIHZhciB0YXJnZXQgPSBzdHJpbmcobm9kZSkgPyBub2Rlcy5maWx0ZXIobm9kZSlbMF0gOiBub2RlWzBdO1xuICAgICAgICByZXR1cm4ga25vd25EaXN0W3RhcmdldC5pZCgpXTtcbiAgICAgIH0sXG4gICAgICBwYXRoVG86IGZ1bmN0aW9uIHBhdGhUbyhub2RlKSB7XG4gICAgICAgIHZhciB0YXJnZXQgPSBzdHJpbmcobm9kZSkgPyBub2Rlcy5maWx0ZXIobm9kZSlbMF0gOiBub2RlWzBdO1xuICAgICAgICB2YXIgUyA9IFtdO1xuICAgICAgICB2YXIgdSA9IHRhcmdldDtcbiAgICAgICAgdmFyIHVpZCA9IHUuaWQoKTtcbiAgICAgICAgaWYgKHRhcmdldC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgUy51bnNoaWZ0KHRhcmdldCk7XG4gICAgICAgICAgd2hpbGUgKHByZXZbdWlkXSkge1xuICAgICAgICAgICAgdmFyIHAgPSBwcmV2W3VpZF07XG4gICAgICAgICAgICBTLnVuc2hpZnQocC5lZGdlKTtcbiAgICAgICAgICAgIFMudW5zaGlmdChwLm5vZGUpO1xuICAgICAgICAgICAgdSA9IHAubm9kZTtcbiAgICAgICAgICAgIHVpZCA9IHUuaWQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVsZXMuc3Bhd24oUyk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufTtcblxudmFyIGVsZXNmbiR0ID0ge1xuICAvLyBrcnVza2FsJ3MgYWxnb3JpdGhtIChmaW5kcyBtaW4gc3Bhbm5pbmcgdHJlZSwgYXNzdW1pbmcgdW5kaXJlY3RlZCBncmFwaClcbiAgLy8gaW1wbGVtZW50ZWQgZnJvbSBwc2V1ZG9jb2RlIGZyb20gd2lraXBlZGlhXG4gIGtydXNrYWw6IGZ1bmN0aW9uIGtydXNrYWwod2VpZ2h0Rm4pIHtcbiAgICB3ZWlnaHRGbiA9IHdlaWdodEZuIHx8IGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9O1xuICAgIHZhciBfdGhpcyRieUdyb3VwID0gdGhpcy5ieUdyb3VwKCksXG4gICAgICBub2RlcyA9IF90aGlzJGJ5R3JvdXAubm9kZXMsXG4gICAgICBlZGdlcyA9IF90aGlzJGJ5R3JvdXAuZWRnZXM7XG4gICAgdmFyIG51bU5vZGVzID0gbm9kZXMubGVuZ3RoO1xuICAgIHZhciBmb3Jlc3QgPSBuZXcgQXJyYXkobnVtTm9kZXMpO1xuICAgIHZhciBBID0gbm9kZXM7IC8vIGFzc3VtZXMgYnlHcm91cCgpIGNyZWF0ZXMgbmV3IGNvbGxlY3Rpb25zIHRoYXQgY2FuIGJlIHNhZmVseSBtdXRhdGVkXG5cbiAgICB2YXIgZmluZFNldEluZGV4ID0gZnVuY3Rpb24gZmluZFNldEluZGV4KGVsZSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmb3Jlc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVsZXMgPSBmb3Jlc3RbaV07XG4gICAgICAgIGlmIChlbGVzLmhhcyhlbGUpKSB7XG4gICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gc3RhcnQgd2l0aCBvbmUgZm9yZXN0IHBlciBub2RlXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1Ob2RlczsgaSsrKSB7XG4gICAgICBmb3Jlc3RbaV0gPSB0aGlzLnNwYXduKG5vZGVzW2ldKTtcbiAgICB9XG4gICAgdmFyIFMgPSBlZGdlcy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gd2VpZ2h0Rm4oYSkgLSB3ZWlnaHRGbihiKTtcbiAgICB9KTtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgUy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBlZGdlID0gU1tfaV07XG4gICAgICB2YXIgdSA9IGVkZ2Uuc291cmNlKClbMF07XG4gICAgICB2YXIgdiA9IGVkZ2UudGFyZ2V0KClbMF07XG4gICAgICB2YXIgc2V0VUluZGV4ID0gZmluZFNldEluZGV4KHUpO1xuICAgICAgdmFyIHNldFZJbmRleCA9IGZpbmRTZXRJbmRleCh2KTtcbiAgICAgIHZhciBzZXRVID0gZm9yZXN0W3NldFVJbmRleF07XG4gICAgICB2YXIgc2V0ViA9IGZvcmVzdFtzZXRWSW5kZXhdO1xuICAgICAgaWYgKHNldFVJbmRleCAhPT0gc2V0VkluZGV4KSB7XG4gICAgICAgIEEubWVyZ2UoZWRnZSk7XG5cbiAgICAgICAgLy8gY29tYmluZSBmb3Jlc3RzIGZvciB1IGFuZCB2XG4gICAgICAgIHNldFUubWVyZ2Uoc2V0Vik7XG4gICAgICAgIGZvcmVzdC5zcGxpY2Uoc2V0VkluZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIEE7XG4gIH1cbn07XG5cbnZhciBhU3RhckRlZmF1bHRzID0gZGVmYXVsdHMkZyh7XG4gIHJvb3Q6IG51bGwsXG4gIGdvYWw6IG51bGwsXG4gIHdlaWdodDogZnVuY3Rpb24gd2VpZ2h0KGVkZ2UpIHtcbiAgICByZXR1cm4gMTtcbiAgfSxcbiAgaGV1cmlzdGljOiBmdW5jdGlvbiBoZXVyaXN0aWMoZWRnZSkge1xuICAgIHJldHVybiAwO1xuICB9LFxuICBkaXJlY3RlZDogZmFsc2Vcbn0pO1xudmFyIGVsZXNmbiRzID0ge1xuICAvLyBJbXBsZW1lbnRlZCBmcm9tIHBzZXVkb2NvZGUgZnJvbSB3aWtpcGVkaWFcbiAgYVN0YXI6IGZ1bmN0aW9uIGFTdGFyKG9wdGlvbnMpIHtcbiAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gICAgdmFyIF9hU3RhckRlZmF1bHRzID0gYVN0YXJEZWZhdWx0cyhvcHRpb25zKSxcbiAgICAgIHJvb3QgPSBfYVN0YXJEZWZhdWx0cy5yb290LFxuICAgICAgZ29hbCA9IF9hU3RhckRlZmF1bHRzLmdvYWwsXG4gICAgICBoZXVyaXN0aWMgPSBfYVN0YXJEZWZhdWx0cy5oZXVyaXN0aWMsXG4gICAgICBkaXJlY3RlZCA9IF9hU3RhckRlZmF1bHRzLmRpcmVjdGVkLFxuICAgICAgd2VpZ2h0ID0gX2FTdGFyRGVmYXVsdHMud2VpZ2h0O1xuICAgIHJvb3QgPSBjeS5jb2xsZWN0aW9uKHJvb3QpWzBdO1xuICAgIGdvYWwgPSBjeS5jb2xsZWN0aW9uKGdvYWwpWzBdO1xuICAgIHZhciBzaWQgPSByb290LmlkKCk7XG4gICAgdmFyIHRpZCA9IGdvYWwuaWQoKTtcbiAgICB2YXIgZ1Njb3JlID0ge307XG4gICAgdmFyIGZTY29yZSA9IHt9O1xuICAgIHZhciBjbG9zZWRTZXRJZHMgPSB7fTtcbiAgICB2YXIgb3BlblNldCA9IG5ldyBIZWFwKGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gZlNjb3JlW2EuaWQoKV0gLSBmU2NvcmVbYi5pZCgpXTtcbiAgICB9KTtcbiAgICB2YXIgb3BlblNldElkcyA9IG5ldyBTZXQkMSgpO1xuICAgIHZhciBjYW1lRnJvbSA9IHt9O1xuICAgIHZhciBjYW1lRnJvbUVkZ2UgPSB7fTtcbiAgICB2YXIgYWRkVG9PcGVuU2V0ID0gZnVuY3Rpb24gYWRkVG9PcGVuU2V0KGVsZSwgaWQpIHtcbiAgICAgIG9wZW5TZXQucHVzaChlbGUpO1xuICAgICAgb3BlblNldElkcy5hZGQoaWQpO1xuICAgIH07XG4gICAgdmFyIGNNaW4sIGNNaW5JZDtcbiAgICB2YXIgcG9wRnJvbU9wZW5TZXQgPSBmdW5jdGlvbiBwb3BGcm9tT3BlblNldCgpIHtcbiAgICAgIGNNaW4gPSBvcGVuU2V0LnBvcCgpO1xuICAgICAgY01pbklkID0gY01pbi5pZCgpO1xuICAgICAgb3BlblNldElkc1tcImRlbGV0ZVwiXShjTWluSWQpO1xuICAgIH07XG4gICAgdmFyIGlzSW5PcGVuU2V0ID0gZnVuY3Rpb24gaXNJbk9wZW5TZXQoaWQpIHtcbiAgICAgIHJldHVybiBvcGVuU2V0SWRzLmhhcyhpZCk7XG4gICAgfTtcbiAgICBhZGRUb09wZW5TZXQocm9vdCwgc2lkKTtcbiAgICBnU2NvcmVbc2lkXSA9IDA7XG4gICAgZlNjb3JlW3NpZF0gPSBoZXVyaXN0aWMocm9vdCk7XG5cbiAgICAvLyBDb3VudGVyXG4gICAgdmFyIHN0ZXBzID0gMDtcblxuICAgIC8vIE1haW4gbG9vcFxuICAgIHdoaWxlIChvcGVuU2V0LnNpemUoKSA+IDApIHtcbiAgICAgIHBvcEZyb21PcGVuU2V0KCk7XG4gICAgICBzdGVwcysrO1xuXG4gICAgICAvLyBJZiB3ZSd2ZSBmb3VuZCBvdXIgZ29hbCwgdGhlbiB3ZSBhcmUgZG9uZVxuICAgICAgaWYgKGNNaW5JZCA9PT0gdGlkKSB7XG4gICAgICAgIHZhciBwYXRoID0gW107XG4gICAgICAgIHZhciBwYXRoTm9kZSA9IGdvYWw7XG4gICAgICAgIHZhciBwYXRoTm9kZUlkID0gdGlkO1xuICAgICAgICB2YXIgcGF0aEVkZ2UgPSBjYW1lRnJvbUVkZ2VbcGF0aE5vZGVJZF07XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICBwYXRoLnVuc2hpZnQocGF0aE5vZGUpO1xuICAgICAgICAgIGlmIChwYXRoRWRnZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBwYXRoLnVuc2hpZnQocGF0aEVkZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwYXRoTm9kZSA9IGNhbWVGcm9tW3BhdGhOb2RlSWRdO1xuICAgICAgICAgIGlmIChwYXRoTm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgcGF0aE5vZGVJZCA9IHBhdGhOb2RlLmlkKCk7XG4gICAgICAgICAgcGF0aEVkZ2UgPSBjYW1lRnJvbUVkZ2VbcGF0aE5vZGVJZF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBmb3VuZDogdHJ1ZSxcbiAgICAgICAgICBkaXN0YW5jZTogZ1Njb3JlW2NNaW5JZF0sXG4gICAgICAgICAgcGF0aDogdGhpcy5zcGF3bihwYXRoKSxcbiAgICAgICAgICBzdGVwczogc3RlcHNcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIGNNaW4gdG8gcHJvY2Vzc2VkIG5vZGVzXG4gICAgICBjbG9zZWRTZXRJZHNbY01pbklkXSA9IHRydWU7XG5cbiAgICAgIC8vIFVwZGF0ZSBzY29yZXMgZm9yIG5laWdoYm9ycyBvZiBjTWluXG4gICAgICAvLyBUYWtlIGludG8gYWNjb3VudCBpZiBncmFwaCBpcyBkaXJlY3RlZCBvciBub3RcbiAgICAgIHZhciB2d0VkZ2VzID0gY01pbi5fcHJpdmF0ZS5lZGdlcztcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdndFZGdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZSA9IHZ3RWRnZXNbaV07XG5cbiAgICAgICAgLy8gZWRnZSBtdXN0IGJlIGluIHNldCBvZiBjYWxsaW5nIGVsZXNcbiAgICAgICAgaWYgKCF0aGlzLmhhc0VsZW1lbnRXaXRoSWQoZS5pZCgpKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY01pbiBtdXN0IGJlIHRoZSBzb3VyY2Ugb2YgZWRnZSBpZiBkaXJlY3RlZFxuICAgICAgICBpZiAoZGlyZWN0ZWQgJiYgZS5kYXRhKCdzb3VyY2UnKSAhPT0gY01pbklkKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHdTcmMgPSBlLnNvdXJjZSgpO1xuICAgICAgICB2YXIgd1RndCA9IGUudGFyZ2V0KCk7XG4gICAgICAgIHZhciB3ID0gd1NyYy5pZCgpICE9PSBjTWluSWQgPyB3U3JjIDogd1RndDtcbiAgICAgICAgdmFyIHdpZCA9IHcuaWQoKTtcblxuICAgICAgICAvLyBub2RlIG11c3QgYmUgaW4gc2V0IG9mIGNhbGxpbmcgZWxlc1xuICAgICAgICBpZiAoIXRoaXMuaGFzRWxlbWVudFdpdGhJZCh3aWQpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiBub2RlIGlzIGluIGNsb3NlZFNldCwgaWdub3JlIGl0XG4gICAgICAgIGlmIChjbG9zZWRTZXRJZHNbd2lkXSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTmV3IHRlbnRhdGl2ZSBzY29yZSBmb3Igbm9kZSB3XG4gICAgICAgIHZhciB0ZW1wU2NvcmUgPSBnU2NvcmVbY01pbklkXSArIHdlaWdodChlKTtcblxuICAgICAgICAvLyBVcGRhdGUgZ1Njb3JlIGZvciBub2RlIHcgaWY6XG4gICAgICAgIC8vICAgdyBub3QgcHJlc2VudCBpbiBvcGVuU2V0XG4gICAgICAgIC8vIE9SXG4gICAgICAgIC8vICAgdGVudGF0aXZlIGdTY29yZSBpcyBsZXNzIHRoYW4gcHJldmlvdXMgdmFsdWVcblxuICAgICAgICAvLyB3IG5vdCBpbiBvcGVuU2V0XG4gICAgICAgIGlmICghaXNJbk9wZW5TZXQod2lkKSkge1xuICAgICAgICAgIGdTY29yZVt3aWRdID0gdGVtcFNjb3JlO1xuICAgICAgICAgIGZTY29yZVt3aWRdID0gdGVtcFNjb3JlICsgaGV1cmlzdGljKHcpO1xuICAgICAgICAgIGFkZFRvT3BlblNldCh3LCB3aWQpO1xuICAgICAgICAgIGNhbWVGcm9tW3dpZF0gPSBjTWluO1xuICAgICAgICAgIGNhbWVGcm9tRWRnZVt3aWRdID0gZTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHcgYWxyZWFkeSBpbiBvcGVuU2V0LCBidXQgd2l0aCBncmVhdGVyIGdTY29yZVxuICAgICAgICBpZiAodGVtcFNjb3JlIDwgZ1Njb3JlW3dpZF0pIHtcbiAgICAgICAgICBnU2NvcmVbd2lkXSA9IHRlbXBTY29yZTtcbiAgICAgICAgICBmU2NvcmVbd2lkXSA9IHRlbXBTY29yZSArIGhldXJpc3RpYyh3KTtcblxuICAgICAgICAgIC8vIHRoZSBoZWFwIGlzIG9yZGVyZWQgYnkgZlNjb3JlLCBzbyBpdCBtdXN0IGJlIHJlc29ydGVkIGZvciB0aGUgbmV3IHZhbHVlXG4gICAgICAgICAgb3BlblNldC51cGRhdGVJdGVtKHcpO1xuICAgICAgICAgIGNhbWVGcm9tW3dpZF0gPSBjTWluO1xuICAgICAgICAgIGNhbWVGcm9tRWRnZVt3aWRdID0gZTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBFbmQgb2YgbmVpZ2hib3JzIHVwZGF0ZVxuICAgIH0gLy8gRW5kIG9mIG1haW4gbG9vcFxuXG4gICAgLy8gSWYgd2UndmUgcmVhY2hlZCBoZXJlLCB0aGVuIHdlJ3ZlIG5vdCByZWFjaGVkIG91ciBnb2FsXG4gICAgcmV0dXJuIHtcbiAgICAgIGZvdW5kOiBmYWxzZSxcbiAgICAgIGRpc3RhbmNlOiB1bmRlZmluZWQsXG4gICAgICBwYXRoOiB1bmRlZmluZWQsXG4gICAgICBzdGVwczogc3RlcHNcbiAgICB9O1xuICB9XG59OyAvLyBlbGVzZm5cblxudmFyIGZsb3lkV2Fyc2hhbGxEZWZhdWx0cyA9IGRlZmF1bHRzJGcoe1xuICB3ZWlnaHQ6IGZ1bmN0aW9uIHdlaWdodChlZGdlKSB7XG4gICAgcmV0dXJuIDE7XG4gIH0sXG4gIGRpcmVjdGVkOiBmYWxzZVxufSk7XG52YXIgZWxlc2ZuJHIgPSB7XG4gIC8vIEltcGxlbWVudGVkIGZyb20gcHNldWRvY29kZSBmcm9tIHdpa2lwZWRpYVxuICBmbG95ZFdhcnNoYWxsOiBmdW5jdGlvbiBmbG95ZFdhcnNoYWxsKG9wdGlvbnMpIHtcbiAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gICAgdmFyIF9mbG95ZFdhcnNoYWxsRGVmYXVsdCA9IGZsb3lkV2Fyc2hhbGxEZWZhdWx0cyhvcHRpb25zKSxcbiAgICAgIHdlaWdodCA9IF9mbG95ZFdhcnNoYWxsRGVmYXVsdC53ZWlnaHQsXG4gICAgICBkaXJlY3RlZCA9IF9mbG95ZFdhcnNoYWxsRGVmYXVsdC5kaXJlY3RlZDtcbiAgICB2YXIgd2VpZ2h0Rm4gPSB3ZWlnaHQ7XG4gICAgdmFyIF90aGlzJGJ5R3JvdXAgPSB0aGlzLmJ5R3JvdXAoKSxcbiAgICAgIG5vZGVzID0gX3RoaXMkYnlHcm91cC5ub2RlcyxcbiAgICAgIGVkZ2VzID0gX3RoaXMkYnlHcm91cC5lZGdlcztcbiAgICB2YXIgTiA9IG5vZGVzLmxlbmd0aDtcbiAgICB2YXIgTnNxID0gTiAqIE47XG4gICAgdmFyIGluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mKG5vZGUpIHtcbiAgICAgIHJldHVybiBub2Rlcy5pbmRleE9mKG5vZGUpO1xuICAgIH07XG4gICAgdmFyIGF0SW5kZXggPSBmdW5jdGlvbiBhdEluZGV4KGkpIHtcbiAgICAgIHJldHVybiBub2Rlc1tpXTtcbiAgICB9O1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBkaXN0YW5jZSBtYXRyaXhcbiAgICB2YXIgZGlzdCA9IG5ldyBBcnJheShOc3EpO1xuICAgIGZvciAodmFyIG4gPSAwOyBuIDwgTnNxOyBuKyspIHtcbiAgICAgIHZhciBqID0gbiAlIE47XG4gICAgICB2YXIgaSA9IChuIC0gaikgLyBOO1xuICAgICAgaWYgKGkgPT09IGopIHtcbiAgICAgICAgZGlzdFtuXSA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkaXN0W25dID0gSW5maW5pdHk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBtYXRyaXggdXNlZCBmb3IgcGF0aCByZWNvbnN0cnVjdGlvblxuICAgIC8vIEluaXRpYWxpemUgZGlzdGFuY2UgbWF0cml4XG4gICAgdmFyIG5leHQgPSBuZXcgQXJyYXkoTnNxKTtcbiAgICB2YXIgZWRnZU5leHQgPSBuZXcgQXJyYXkoTnNxKTtcblxuICAgIC8vIFByb2Nlc3MgZWRnZXNcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgZWRnZXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgZWRnZSA9IGVkZ2VzW19pXTtcbiAgICAgIHZhciBzcmMgPSBlZGdlLnNvdXJjZSgpWzBdO1xuICAgICAgdmFyIHRndCA9IGVkZ2UudGFyZ2V0KClbMF07XG4gICAgICBpZiAoc3JjID09PSB0Z3QpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9IC8vIGV4Y2x1ZGUgbG9vcHNcblxuICAgICAgdmFyIHMgPSBpbmRleE9mKHNyYyk7XG4gICAgICB2YXIgdCA9IGluZGV4T2YodGd0KTtcbiAgICAgIHZhciBzdCA9IHMgKiBOICsgdDsgLy8gc291cmNlIHRvIHRhcmdldCBpbmRleFxuICAgICAgdmFyIF93ZWlnaHQgPSB3ZWlnaHRGbihlZGdlKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgYWxyZWFkeSBwcm9jZXNzIGFub3RoZXIgZWRnZSBiZXR3ZWVuIHNhbWUgMiBub2Rlc1xuICAgICAgaWYgKGRpc3Rbc3RdID4gX3dlaWdodCkge1xuICAgICAgICBkaXN0W3N0XSA9IF93ZWlnaHQ7XG4gICAgICAgIG5leHRbc3RdID0gdDtcbiAgICAgICAgZWRnZU5leHRbc3RdID0gZWRnZTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgdW5kaXJlY3RlZCBncmFwaCwgcHJvY2VzcyAncmV2ZXJzZWQnIGVkZ2VcbiAgICAgIGlmICghZGlyZWN0ZWQpIHtcbiAgICAgICAgdmFyIHRzID0gdCAqIE4gKyBzOyAvLyB0YXJnZXQgdG8gc291cmNlIGluZGV4XG5cbiAgICAgICAgaWYgKCFkaXJlY3RlZCAmJiBkaXN0W3RzXSA+IF93ZWlnaHQpIHtcbiAgICAgICAgICBkaXN0W3RzXSA9IF93ZWlnaHQ7XG4gICAgICAgICAgbmV4dFt0c10gPSBzO1xuICAgICAgICAgIGVkZ2VOZXh0W3RzXSA9IGVkZ2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBNYWluIGxvb3BcbiAgICBmb3IgKHZhciBrID0gMDsgayA8IE47IGsrKykge1xuICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgTjsgX2kyKyspIHtcbiAgICAgICAgdmFyIGlrID0gX2kyICogTiArIGs7XG4gICAgICAgIGZvciAodmFyIF9qID0gMDsgX2ogPCBOOyBfaisrKSB7XG4gICAgICAgICAgdmFyIGlqID0gX2kyICogTiArIF9qO1xuICAgICAgICAgIHZhciBraiA9IGsgKiBOICsgX2o7XG4gICAgICAgICAgaWYgKGRpc3RbaWtdICsgZGlzdFtral0gPCBkaXN0W2lqXSkge1xuICAgICAgICAgICAgZGlzdFtpal0gPSBkaXN0W2lrXSArIGRpc3Rba2pdO1xuICAgICAgICAgICAgbmV4dFtpal0gPSBuZXh0W2lrXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIGdldEFyZ0VsZSA9IGZ1bmN0aW9uIGdldEFyZ0VsZShlbGUpIHtcbiAgICAgIHJldHVybiAoc3RyaW5nKGVsZSkgPyBjeS5maWx0ZXIoZWxlKSA6IGVsZSlbMF07XG4gICAgfTtcbiAgICB2YXIgaW5kZXhPZkFyZ0VsZSA9IGZ1bmN0aW9uIGluZGV4T2ZBcmdFbGUoZWxlKSB7XG4gICAgICByZXR1cm4gaW5kZXhPZihnZXRBcmdFbGUoZWxlKSk7XG4gICAgfTtcbiAgICB2YXIgcmVzID0ge1xuICAgICAgZGlzdGFuY2U6IGZ1bmN0aW9uIGRpc3RhbmNlKGZyb20sIHRvKSB7XG4gICAgICAgIHZhciBpID0gaW5kZXhPZkFyZ0VsZShmcm9tKTtcbiAgICAgICAgdmFyIGogPSBpbmRleE9mQXJnRWxlKHRvKTtcbiAgICAgICAgcmV0dXJuIGRpc3RbaSAqIE4gKyBqXTtcbiAgICAgIH0sXG4gICAgICBwYXRoOiBmdW5jdGlvbiBwYXRoKGZyb20sIHRvKSB7XG4gICAgICAgIHZhciBpID0gaW5kZXhPZkFyZ0VsZShmcm9tKTtcbiAgICAgICAgdmFyIGogPSBpbmRleE9mQXJnRWxlKHRvKTtcbiAgICAgICAgdmFyIGZyb21Ob2RlID0gYXRJbmRleChpKTtcbiAgICAgICAgaWYgKGkgPT09IGopIHtcbiAgICAgICAgICByZXR1cm4gZnJvbU5vZGUuY29sbGVjdGlvbigpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuZXh0W2kgKiBOICsgal0gPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBjeS5jb2xsZWN0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBhdGggPSBjeS5jb2xsZWN0aW9uKCk7XG4gICAgICAgIHZhciBwcmV2ID0gaTtcbiAgICAgICAgdmFyIGVkZ2U7XG4gICAgICAgIHBhdGgubWVyZ2UoZnJvbU5vZGUpO1xuICAgICAgICB3aGlsZSAoaSAhPT0gaikge1xuICAgICAgICAgIHByZXYgPSBpO1xuICAgICAgICAgIGkgPSBuZXh0W2kgKiBOICsgal07XG4gICAgICAgICAgZWRnZSA9IGVkZ2VOZXh0W3ByZXYgKiBOICsgaV07XG4gICAgICAgICAgcGF0aC5tZXJnZShlZGdlKTtcbiAgICAgICAgICBwYXRoLm1lcmdlKGF0SW5kZXgoaSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXRoO1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIHJlcztcbiAgfSAvLyBmbG95ZFdhcnNoYWxsXG59OyAvLyBlbGVzZm5cblxudmFyIGJlbGxtYW5Gb3JkRGVmYXVsdHMgPSBkZWZhdWx0cyRnKHtcbiAgd2VpZ2h0OiBmdW5jdGlvbiB3ZWlnaHQoZWRnZSkge1xuICAgIHJldHVybiAxO1xuICB9LFxuICBkaXJlY3RlZDogZmFsc2UsXG4gIHJvb3Q6IG51bGxcbn0pO1xudmFyIGVsZXNmbiRxID0ge1xuICAvLyBJbXBsZW1lbnRlZCBmcm9tIHBzZXVkb2NvZGUgZnJvbSB3aWtpcGVkaWFcbiAgYmVsbG1hbkZvcmQ6IGZ1bmN0aW9uIGJlbGxtYW5Gb3JkKG9wdGlvbnMpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIHZhciBfYmVsbG1hbkZvcmREZWZhdWx0cyA9IGJlbGxtYW5Gb3JkRGVmYXVsdHMob3B0aW9ucyksXG4gICAgICB3ZWlnaHQgPSBfYmVsbG1hbkZvcmREZWZhdWx0cy53ZWlnaHQsXG4gICAgICBkaXJlY3RlZCA9IF9iZWxsbWFuRm9yZERlZmF1bHRzLmRpcmVjdGVkLFxuICAgICAgcm9vdCA9IF9iZWxsbWFuRm9yZERlZmF1bHRzLnJvb3Q7XG4gICAgdmFyIHdlaWdodEZuID0gd2VpZ2h0O1xuICAgIHZhciBlbGVzID0gdGhpcztcbiAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gICAgdmFyIF90aGlzJGJ5R3JvdXAgPSB0aGlzLmJ5R3JvdXAoKSxcbiAgICAgIGVkZ2VzID0gX3RoaXMkYnlHcm91cC5lZGdlcyxcbiAgICAgIG5vZGVzID0gX3RoaXMkYnlHcm91cC5ub2RlcztcbiAgICB2YXIgbnVtTm9kZXMgPSBub2Rlcy5sZW5ndGg7XG4gICAgdmFyIGluZm9NYXAgPSBuZXcgTWFwJDEoKTtcbiAgICB2YXIgaGFzTmVnYXRpdmVXZWlnaHRDeWNsZSA9IGZhbHNlO1xuICAgIHZhciBuZWdhdGl2ZVdlaWdodEN5Y2xlcyA9IFtdO1xuICAgIHJvb3QgPSBjeS5jb2xsZWN0aW9uKHJvb3QpWzBdOyAvLyBpbiBjYXNlIHNlbGVjdG9yIHBhc3NlZFxuXG4gICAgZWRnZXMudW5tZXJnZUJ5KGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICByZXR1cm4gZWRnZS5pc0xvb3AoKTtcbiAgICB9KTtcbiAgICB2YXIgbnVtRWRnZXMgPSBlZGdlcy5sZW5ndGg7XG4gICAgdmFyIGdldEluZm8gPSBmdW5jdGlvbiBnZXRJbmZvKG5vZGUpIHtcbiAgICAgIHZhciBvYmogPSBpbmZvTWFwLmdldChub2RlLmlkKCkpO1xuICAgICAgaWYgKCFvYmopIHtcbiAgICAgICAgb2JqID0ge307XG4gICAgICAgIGluZm9NYXAuc2V0KG5vZGUuaWQoKSwgb2JqKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmo7XG4gICAgfTtcbiAgICB2YXIgZ2V0Tm9kZUZyb21UbyA9IGZ1bmN0aW9uIGdldE5vZGVGcm9tVG8odG8pIHtcbiAgICAgIHJldHVybiAoc3RyaW5nKHRvKSA/IGN5LiQodG8pIDogdG8pWzBdO1xuICAgIH07XG4gICAgdmFyIGRpc3RhbmNlVG8gPSBmdW5jdGlvbiBkaXN0YW5jZVRvKHRvKSB7XG4gICAgICByZXR1cm4gZ2V0SW5mbyhnZXROb2RlRnJvbVRvKHRvKSkuZGlzdDtcbiAgICB9O1xuICAgIHZhciBwYXRoVG8gPSBmdW5jdGlvbiBwYXRoVG8odG8pIHtcbiAgICAgIHZhciB0aGlzU3RhcnQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHJvb3Q7XG4gICAgICB2YXIgZW5kID0gZ2V0Tm9kZUZyb21Ubyh0byk7XG4gICAgICB2YXIgcGF0aCA9IFtdO1xuICAgICAgdmFyIG5vZGUgPSBlbmQ7XG4gICAgICBmb3IgKDs7KSB7XG4gICAgICAgIGlmIChub2RlID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMuc3Bhd24oKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgX2dldEluZm8gPSBnZXRJbmZvKG5vZGUpLFxuICAgICAgICAgIGVkZ2UgPSBfZ2V0SW5mby5lZGdlLFxuICAgICAgICAgIHByZWQgPSBfZ2V0SW5mby5wcmVkO1xuICAgICAgICBwYXRoLnVuc2hpZnQobm9kZVswXSk7XG4gICAgICAgIGlmIChub2RlLnNhbWUodGhpc1N0YXJ0KSAmJiBwYXRoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWRnZSAhPSBudWxsKSB7XG4gICAgICAgICAgcGF0aC51bnNoaWZ0KGVkZ2UpO1xuICAgICAgICB9XG4gICAgICAgIG5vZGUgPSBwcmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVsZXMuc3Bhd24ocGF0aCk7XG4gICAgfTtcblxuICAgIC8vIEluaXRpYWxpemF0aW9ucyB7IGRpc3QsIHByZWQsIGVkZ2UgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtTm9kZXM7IGkrKykge1xuICAgICAgdmFyIG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgIHZhciBpbmZvID0gZ2V0SW5mbyhub2RlKTtcbiAgICAgIGlmIChub2RlLnNhbWUocm9vdCkpIHtcbiAgICAgICAgaW5mby5kaXN0ID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluZm8uZGlzdCA9IEluZmluaXR5O1xuICAgICAgfVxuICAgICAgaW5mby5wcmVkID0gbnVsbDtcbiAgICAgIGluZm8uZWRnZSA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gRWRnZXMgcmVsYXhhdGlvblxuICAgIHZhciByZXBsYWNlZEVkZ2UgPSBmYWxzZTtcbiAgICB2YXIgY2hlY2tGb3JFZGdlUmVwbGFjZW1lbnQgPSBmdW5jdGlvbiBjaGVja0ZvckVkZ2VSZXBsYWNlbWVudChub2RlMSwgbm9kZTIsIGVkZ2UsIGluZm8xLCBpbmZvMiwgd2VpZ2h0KSB7XG4gICAgICB2YXIgZGlzdCA9IGluZm8xLmRpc3QgKyB3ZWlnaHQ7XG4gICAgICBpZiAoZGlzdCA8IGluZm8yLmRpc3QgJiYgIWVkZ2Uuc2FtZShpbmZvMS5lZGdlKSkge1xuICAgICAgICBpbmZvMi5kaXN0ID0gZGlzdDtcbiAgICAgICAgaW5mbzIucHJlZCA9IG5vZGUxO1xuICAgICAgICBpbmZvMi5lZGdlID0gZWRnZTtcbiAgICAgICAgcmVwbGFjZWRFZGdlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGZvciAodmFyIF9pID0gMTsgX2kgPCBudW1Ob2RlczsgX2krKykge1xuICAgICAgcmVwbGFjZWRFZGdlID0gZmFsc2U7XG4gICAgICBmb3IgKHZhciBlID0gMDsgZSA8IG51bUVkZ2VzOyBlKyspIHtcbiAgICAgICAgdmFyIGVkZ2UgPSBlZGdlc1tlXTtcbiAgICAgICAgdmFyIHNyYyA9IGVkZ2Uuc291cmNlKCk7XG4gICAgICAgIHZhciB0Z3QgPSBlZGdlLnRhcmdldCgpO1xuICAgICAgICB2YXIgX3dlaWdodCA9IHdlaWdodEZuKGVkZ2UpO1xuICAgICAgICB2YXIgc3JjSW5mbyA9IGdldEluZm8oc3JjKTtcbiAgICAgICAgdmFyIHRndEluZm8gPSBnZXRJbmZvKHRndCk7XG4gICAgICAgIGNoZWNrRm9yRWRnZVJlcGxhY2VtZW50KHNyYywgdGd0LCBlZGdlLCBzcmNJbmZvLCB0Z3RJbmZvLCBfd2VpZ2h0KTtcblxuICAgICAgICAvLyBJZiB1bmRpcmVjdGVkIGdyYXBoLCB3ZSBuZWVkIHRvIHRha2UgaW50byBhY2NvdW50IHRoZSAncmV2ZXJzZScgZWRnZVxuICAgICAgICBpZiAoIWRpcmVjdGVkKSB7XG4gICAgICAgICAgY2hlY2tGb3JFZGdlUmVwbGFjZW1lbnQodGd0LCBzcmMsIGVkZ2UsIHRndEluZm8sIHNyY0luZm8sIF93ZWlnaHQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIXJlcGxhY2VkRWRnZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJlcGxhY2VkRWRnZSkge1xuICAgICAgLy8gQ2hlY2sgZm9yIG5lZ2F0aXZlIHdlaWdodCBjeWNsZXNcbiAgICAgIHZhciBuZWdhdGl2ZVdlaWdodEN5Y2xlSWRzID0gW107XG4gICAgICBmb3IgKHZhciBfZSA9IDA7IF9lIDwgbnVtRWRnZXM7IF9lKyspIHtcbiAgICAgICAgdmFyIF9lZGdlID0gZWRnZXNbX2VdO1xuICAgICAgICB2YXIgX3NyYyA9IF9lZGdlLnNvdXJjZSgpO1xuICAgICAgICB2YXIgX3RndCA9IF9lZGdlLnRhcmdldCgpO1xuICAgICAgICB2YXIgX3dlaWdodDIgPSB3ZWlnaHRGbihfZWRnZSk7XG4gICAgICAgIHZhciBzcmNEaXN0ID0gZ2V0SW5mbyhfc3JjKS5kaXN0O1xuICAgICAgICB2YXIgdGd0RGlzdCA9IGdldEluZm8oX3RndCkuZGlzdDtcbiAgICAgICAgaWYgKHNyY0Rpc3QgKyBfd2VpZ2h0MiA8IHRndERpc3QgfHwgIWRpcmVjdGVkICYmIHRndERpc3QgKyBfd2VpZ2h0MiA8IHNyY0Rpc3QpIHtcbiAgICAgICAgICBpZiAoIWhhc05lZ2F0aXZlV2VpZ2h0Q3ljbGUpIHtcbiAgICAgICAgICAgIHdhcm4oJ0dyYXBoIGNvbnRhaW5zIGEgbmVnYXRpdmUgd2VpZ2h0IGN5Y2xlIGZvciBCZWxsbWFuLUZvcmQnKTtcbiAgICAgICAgICAgIGhhc05lZ2F0aXZlV2VpZ2h0Q3ljbGUgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAob3B0aW9ucy5maW5kTmVnYXRpdmVXZWlnaHRDeWNsZXMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICB2YXIgbmVnYXRpdmVOb2RlcyA9IFtdO1xuICAgICAgICAgICAgaWYgKHNyY0Rpc3QgKyBfd2VpZ2h0MiA8IHRndERpc3QpIHtcbiAgICAgICAgICAgICAgbmVnYXRpdmVOb2Rlcy5wdXNoKF9zcmMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFkaXJlY3RlZCAmJiB0Z3REaXN0ICsgX3dlaWdodDIgPCBzcmNEaXN0KSB7XG4gICAgICAgICAgICAgIG5lZ2F0aXZlTm9kZXMucHVzaChfdGd0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBudW1OZWdhdGl2ZU5vZGVzID0gbmVnYXRpdmVOb2Rlcy5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IG51bU5lZ2F0aXZlTm9kZXM7IG4rKykge1xuICAgICAgICAgICAgICB2YXIgc3RhcnQgPSBuZWdhdGl2ZU5vZGVzW25dO1xuICAgICAgICAgICAgICB2YXIgY3ljbGUgPSBbc3RhcnRdO1xuICAgICAgICAgICAgICBjeWNsZS5wdXNoKGdldEluZm8oc3RhcnQpLmVkZ2UpO1xuICAgICAgICAgICAgICB2YXIgX25vZGUgPSBnZXRJbmZvKHN0YXJ0KS5wcmVkO1xuICAgICAgICAgICAgICB3aGlsZSAoY3ljbGUuaW5kZXhPZihfbm9kZSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgY3ljbGUucHVzaChfbm9kZSk7XG4gICAgICAgICAgICAgICAgY3ljbGUucHVzaChnZXRJbmZvKF9ub2RlKS5lZGdlKTtcbiAgICAgICAgICAgICAgICBfbm9kZSA9IGdldEluZm8oX25vZGUpLnByZWQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY3ljbGUgPSBjeWNsZS5zbGljZShjeWNsZS5pbmRleE9mKF9ub2RlKSk7XG4gICAgICAgICAgICAgIHZhciBzbWFsbGVzdElkID0gY3ljbGVbMF0uaWQoKTtcbiAgICAgICAgICAgICAgdmFyIHNtYWxsZXN0SW5kZXggPSAwO1xuICAgICAgICAgICAgICBmb3IgKHZhciBjID0gMjsgYyA8IGN5Y2xlLmxlbmd0aDsgYyArPSAyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGN5Y2xlW2NdLmlkKCkgPCBzbWFsbGVzdElkKSB7XG4gICAgICAgICAgICAgICAgICBzbWFsbGVzdElkID0gY3ljbGVbY10uaWQoKTtcbiAgICAgICAgICAgICAgICAgIHNtYWxsZXN0SW5kZXggPSBjO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjeWNsZSA9IGN5Y2xlLnNsaWNlKHNtYWxsZXN0SW5kZXgpLmNvbmNhdChjeWNsZS5zbGljZSgwLCBzbWFsbGVzdEluZGV4KSk7XG4gICAgICAgICAgICAgIGN5Y2xlLnB1c2goY3ljbGVbMF0pO1xuICAgICAgICAgICAgICB2YXIgY3ljbGVJZCA9IGN5Y2xlLm1hcChmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZWwuaWQoKTtcbiAgICAgICAgICAgICAgfSkuam9pbihcIixcIik7XG4gICAgICAgICAgICAgIGlmIChuZWdhdGl2ZVdlaWdodEN5Y2xlSWRzLmluZGV4T2YoY3ljbGVJZCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgbmVnYXRpdmVXZWlnaHRDeWNsZXMucHVzaChlbGVzLnNwYXduKGN5Y2xlKSk7XG4gICAgICAgICAgICAgICAgbmVnYXRpdmVXZWlnaHRDeWNsZUlkcy5wdXNoKGN5Y2xlSWQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgZGlzdGFuY2VUbzogZGlzdGFuY2VUbyxcbiAgICAgIHBhdGhUbzogcGF0aFRvLFxuICAgICAgaGFzTmVnYXRpdmVXZWlnaHRDeWNsZTogaGFzTmVnYXRpdmVXZWlnaHRDeWNsZSxcbiAgICAgIG5lZ2F0aXZlV2VpZ2h0Q3ljbGVzOiBuZWdhdGl2ZVdlaWdodEN5Y2xlc1xuICAgIH07XG4gIH0gLy8gYmVsbG1hbkZvcmRcbn07IC8vIGVsZXNmblxuXG52YXIgc3FydDIgPSBNYXRoLnNxcnQoMik7XG5cbi8vIEZ1bmN0aW9uIHdoaWNoIGNvbGFwc2VzIDIgKG1ldGEpIG5vZGVzIGludG8gb25lXG4vLyBVcGRhdGVzIHRoZSByZW1haW5pbmcgZWRnZSBsaXN0c1xuLy8gUmVjZWl2ZXMgYXMgYSBwYXJhbWF0ZXIgdGhlIGVkZ2Ugd2hpY2ggY2F1c2VzIHRoZSBjb2xsYXBzZVxudmFyIGNvbGxhcHNlID0gZnVuY3Rpb24gY29sbGFwc2UoZWRnZUluZGV4LCBub2RlTWFwLCByZW1haW5pbmdFZGdlcykge1xuICBpZiAocmVtYWluaW5nRWRnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgZXJyb3IoXCJLYXJnZXItU3RlaW4gbXVzdCBiZSBydW4gb24gYSBjb25uZWN0ZWQgKHN1YilncmFwaFwiKTtcbiAgfVxuICB2YXIgZWRnZUluZm8gPSByZW1haW5pbmdFZGdlc1tlZGdlSW5kZXhdO1xuICB2YXIgc291cmNlSW4gPSBlZGdlSW5mb1sxXTtcbiAgdmFyIHRhcmdldEluID0gZWRnZUluZm9bMl07XG4gIHZhciBwYXJ0aXRpb24xID0gbm9kZU1hcFtzb3VyY2VJbl07XG4gIHZhciBwYXJ0aXRpb24yID0gbm9kZU1hcFt0YXJnZXRJbl07XG4gIHZhciBuZXdFZGdlcyA9IHJlbWFpbmluZ0VkZ2VzOyAvLyByZS11c2UgYXJyYXlcblxuICAvLyBEZWxldGUgYWxsIGVkZ2VzIGJldHdlZW4gcGFydGl0aW9uMSBhbmQgcGFydGl0aW9uMlxuICBmb3IgKHZhciBpID0gbmV3RWRnZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICB2YXIgZWRnZSA9IG5ld0VkZ2VzW2ldO1xuICAgIHZhciBzcmMgPSBlZGdlWzFdO1xuICAgIHZhciB0Z3QgPSBlZGdlWzJdO1xuICAgIGlmIChub2RlTWFwW3NyY10gPT09IHBhcnRpdGlvbjEgJiYgbm9kZU1hcFt0Z3RdID09PSBwYXJ0aXRpb24yIHx8IG5vZGVNYXBbc3JjXSA9PT0gcGFydGl0aW9uMiAmJiBub2RlTWFwW3RndF0gPT09IHBhcnRpdGlvbjEpIHtcbiAgICAgIG5ld0VkZ2VzLnNwbGljZShpLCAxKTtcbiAgICB9XG4gIH1cblxuICAvLyBBbGwgZWRnZXMgcG9pbnRpbmcgdG8gcGFydGl0aW9uMiBzaG91bGQgbm93IHBvaW50IHRvIHBhcnRpdGlvbjFcbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IG5ld0VkZ2VzLmxlbmd0aDsgX2krKykge1xuICAgIHZhciBfZWRnZSA9IG5ld0VkZ2VzW19pXTtcbiAgICBpZiAoX2VkZ2VbMV0gPT09IHBhcnRpdGlvbjIpIHtcbiAgICAgIC8vIENoZWNrIHNvdXJjZVxuICAgICAgbmV3RWRnZXNbX2ldID0gX2VkZ2Uuc2xpY2UoKTsgLy8gY29weVxuICAgICAgbmV3RWRnZXNbX2ldWzFdID0gcGFydGl0aW9uMTtcbiAgICB9IGVsc2UgaWYgKF9lZGdlWzJdID09PSBwYXJ0aXRpb24yKSB7XG4gICAgICAvLyBDaGVjayB0YXJnZXRcbiAgICAgIG5ld0VkZ2VzW19pXSA9IF9lZGdlLnNsaWNlKCk7IC8vIGNvcHlcbiAgICAgIG5ld0VkZ2VzW19pXVsyXSA9IHBhcnRpdGlvbjE7XG4gICAgfVxuICB9XG5cbiAgLy8gTW92ZSBhbGwgbm9kZXMgZnJvbSBwYXJ0aXRpb24yIHRvIHBhcnRpdGlvbjFcbiAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgbm9kZU1hcC5sZW5ndGg7IF9pMisrKSB7XG4gICAgaWYgKG5vZGVNYXBbX2kyXSA9PT0gcGFydGl0aW9uMikge1xuICAgICAgbm9kZU1hcFtfaTJdID0gcGFydGl0aW9uMTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5ld0VkZ2VzO1xufTtcblxuLy8gQ29udHJhY3RzIGEgZ3JhcGggdW50aWwgd2UgcmVhY2ggYSBjZXJ0YWluIG51bWJlciBvZiBtZXRhIG5vZGVzXG52YXIgY29udHJhY3RVbnRpbCA9IGZ1bmN0aW9uIGNvbnRyYWN0VW50aWwobWV0YU5vZGVNYXAsIHJlbWFpbmluZ0VkZ2VzLCBzaXplLCBzaXplTGltaXQpIHtcbiAgd2hpbGUgKHNpemUgPiBzaXplTGltaXQpIHtcbiAgICAvLyBDaG9vc2UgYW4gZWRnZSByYW5kb21seVxuICAgIHZhciBlZGdlSW5kZXggPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiByZW1haW5pbmdFZGdlcy5sZW5ndGgpO1xuXG4gICAgLy8gQ29sbGFwc2UgZ3JhcGggYmFzZWQgb24gZWRnZVxuICAgIHJlbWFpbmluZ0VkZ2VzID0gY29sbGFwc2UoZWRnZUluZGV4LCBtZXRhTm9kZU1hcCwgcmVtYWluaW5nRWRnZXMpO1xuICAgIHNpemUtLTtcbiAgfVxuICByZXR1cm4gcmVtYWluaW5nRWRnZXM7XG59O1xudmFyIGVsZXNmbiRwID0ge1xuICAvLyBDb21wdXRlcyB0aGUgbWluaW11bSBjdXQgb2YgYW4gdW5kaXJlY3RlZCBncmFwaFxuICAvLyBSZXR1cm5zIHRoZSBjb3JyZWN0IGFuc3dlciB3aXRoIGhpZ2ggcHJvYmFiaWxpdHlcbiAga2FyZ2VyU3RlaW46IGZ1bmN0aW9uIGthcmdlclN0ZWluKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgdmFyIF90aGlzJGJ5R3JvdXAgPSB0aGlzLmJ5R3JvdXAoKSxcbiAgICAgIG5vZGVzID0gX3RoaXMkYnlHcm91cC5ub2RlcyxcbiAgICAgIGVkZ2VzID0gX3RoaXMkYnlHcm91cC5lZGdlcztcbiAgICBlZGdlcy51bm1lcmdlQnkoZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICAgIHJldHVybiBlZGdlLmlzTG9vcCgpO1xuICAgIH0pO1xuICAgIHZhciBudW1Ob2RlcyA9IG5vZGVzLmxlbmd0aDtcbiAgICB2YXIgbnVtRWRnZXMgPSBlZGdlcy5sZW5ndGg7XG4gICAgdmFyIG51bUl0ZXIgPSBNYXRoLmNlaWwoTWF0aC5wb3coTWF0aC5sb2cobnVtTm9kZXMpIC8gTWF0aC5MTjIsIDIpKTtcbiAgICB2YXIgc3RvcFNpemUgPSBNYXRoLmZsb29yKG51bU5vZGVzIC8gc3FydDIpO1xuICAgIGlmIChudW1Ob2RlcyA8IDIpIHtcbiAgICAgIGVycm9yKCdBdCBsZWFzdCAyIG5vZGVzIGFyZSByZXF1aXJlZCBmb3IgS2FyZ2VyLVN0ZWluIGFsZ29yaXRobScpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBOb3cgc3RvcmUgZWRnZSBkZXN0aW5hdGlvbiBhcyBpbmRleGVzXG4gICAgLy8gRm9ybWF0IGZvciBlYWNoIGVkZ2UgKGVkZ2UgaW5kZXgsIHNvdXJjZSBub2RlIGluZGV4LCB0YXJnZXQgbm9kZSBpbmRleClcbiAgICB2YXIgZWRnZUluZGV4ZXMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bUVkZ2VzOyBpKyspIHtcbiAgICAgIHZhciBlID0gZWRnZXNbaV07XG4gICAgICBlZGdlSW5kZXhlcy5wdXNoKFtpLCBub2Rlcy5pbmRleE9mKGUuc291cmNlKCkpLCBub2Rlcy5pbmRleE9mKGUudGFyZ2V0KCkpXSk7XG4gICAgfVxuXG4gICAgLy8gV2Ugd2lsbCBzdG9yZSB0aGUgYmVzdCBjdXQgZm91bmQgaGVyZVxuICAgIHZhciBtaW5DdXRTaXplID0gSW5maW5pdHk7XG4gICAgdmFyIG1pbkN1dEVkZ2VJbmRleGVzID0gW107XG4gICAgdmFyIG1pbkN1dE5vZGVNYXAgPSBuZXcgQXJyYXkobnVtTm9kZXMpO1xuXG4gICAgLy8gSW5pdGlhbCBtZXRhIG5vZGUgcGFydGl0aW9uXG4gICAgdmFyIG1ldGFOb2RlTWFwID0gbmV3IEFycmF5KG51bU5vZGVzKTtcbiAgICB2YXIgbWV0YU5vZGVNYXAyID0gbmV3IEFycmF5KG51bU5vZGVzKTtcbiAgICB2YXIgY29weU5vZGVzTWFwID0gZnVuY3Rpb24gY29weU5vZGVzTWFwKGZyb20sIHRvKSB7XG4gICAgICBmb3IgKHZhciBfaTMgPSAwOyBfaTMgPCBudW1Ob2RlczsgX2kzKyspIHtcbiAgICAgICAgdG9bX2kzXSA9IGZyb21bX2kzXTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gTWFpbiBsb29wXG4gICAgZm9yICh2YXIgaXRlciA9IDA7IGl0ZXIgPD0gbnVtSXRlcjsgaXRlcisrKSB7XG4gICAgICAvLyBSZXNldCBtZXRhIG5vZGUgcGFydGl0aW9uXG4gICAgICBmb3IgKHZhciBfaTQgPSAwOyBfaTQgPCBudW1Ob2RlczsgX2k0KyspIHtcbiAgICAgICAgbWV0YU5vZGVNYXBbX2k0XSA9IF9pNDtcbiAgICAgIH1cblxuICAgICAgLy8gQ29udHJhY3QgdW50aWwgc3RvcCBwb2ludCAoc3RvcFNpemUgbm9kZXMpXG4gICAgICB2YXIgZWRnZXNTdGF0ZSA9IGNvbnRyYWN0VW50aWwobWV0YU5vZGVNYXAsIGVkZ2VJbmRleGVzLnNsaWNlKCksIG51bU5vZGVzLCBzdG9wU2l6ZSk7XG4gICAgICB2YXIgZWRnZXNTdGF0ZTIgPSBlZGdlc1N0YXRlLnNsaWNlKCk7IC8vIGNvcHlcblxuICAgICAgLy8gQ3JlYXRlIGEgY29weSBvZiB0aGUgY29sYXBzZWQgbm9kZXMgc3RhdGVcbiAgICAgIGNvcHlOb2Rlc01hcChtZXRhTm9kZU1hcCwgbWV0YU5vZGVNYXAyKTtcblxuICAgICAgLy8gUnVuIDIgaXRlcmF0aW9ucyBzdGFydGluZyBpbiB0aGUgc3RvcCBzdGF0ZVxuICAgICAgdmFyIHJlczEgPSBjb250cmFjdFVudGlsKG1ldGFOb2RlTWFwLCBlZGdlc1N0YXRlLCBzdG9wU2l6ZSwgMik7XG4gICAgICB2YXIgcmVzMiA9IGNvbnRyYWN0VW50aWwobWV0YU5vZGVNYXAyLCBlZGdlc1N0YXRlMiwgc3RvcFNpemUsIDIpO1xuXG4gICAgICAvLyBJcyBhbnkgb2YgdGhlIDIgcmVzdWx0cyB0aGUgYmVzdCBjdXQgc28gZmFyP1xuICAgICAgaWYgKHJlczEubGVuZ3RoIDw9IHJlczIubGVuZ3RoICYmIHJlczEubGVuZ3RoIDwgbWluQ3V0U2l6ZSkge1xuICAgICAgICBtaW5DdXRTaXplID0gcmVzMS5sZW5ndGg7XG4gICAgICAgIG1pbkN1dEVkZ2VJbmRleGVzID0gcmVzMTtcbiAgICAgICAgY29weU5vZGVzTWFwKG1ldGFOb2RlTWFwLCBtaW5DdXROb2RlTWFwKTtcbiAgICAgIH0gZWxzZSBpZiAocmVzMi5sZW5ndGggPD0gcmVzMS5sZW5ndGggJiYgcmVzMi5sZW5ndGggPCBtaW5DdXRTaXplKSB7XG4gICAgICAgIG1pbkN1dFNpemUgPSByZXMyLmxlbmd0aDtcbiAgICAgICAgbWluQ3V0RWRnZUluZGV4ZXMgPSByZXMyO1xuICAgICAgICBjb3B5Tm9kZXNNYXAobWV0YU5vZGVNYXAyLCBtaW5DdXROb2RlTWFwKTtcbiAgICAgIH1cbiAgICB9IC8vIGVuZCBvZiBtYWluIGxvb3BcblxuICAgIC8vIENvbnN0cnVjdCByZXN1bHRcbiAgICB2YXIgY3V0ID0gdGhpcy5zcGF3bihtaW5DdXRFZGdlSW5kZXhlcy5tYXAoZnVuY3Rpb24gKGUpIHtcbiAgICAgIHJldHVybiBlZGdlc1tlWzBdXTtcbiAgICB9KSk7XG4gICAgdmFyIHBhcnRpdGlvbjEgPSB0aGlzLnNwYXduKCk7XG4gICAgdmFyIHBhcnRpdGlvbjIgPSB0aGlzLnNwYXduKCk7XG5cbiAgICAvLyB0cmF2ZXJzZSBtZXRhTm9kZU1hcCBmb3IgYmVzdCBjdXRcbiAgICB2YXIgd2l0bmVzc05vZGVQYXJ0aXRpb24gPSBtaW5DdXROb2RlTWFwWzBdO1xuICAgIGZvciAodmFyIF9pNSA9IDA7IF9pNSA8IG1pbkN1dE5vZGVNYXAubGVuZ3RoOyBfaTUrKykge1xuICAgICAgdmFyIHBhcnRpdGlvbklkID0gbWluQ3V0Tm9kZU1hcFtfaTVdO1xuICAgICAgdmFyIG5vZGUgPSBub2Rlc1tfaTVdO1xuICAgICAgaWYgKHBhcnRpdGlvbklkID09PSB3aXRuZXNzTm9kZVBhcnRpdGlvbikge1xuICAgICAgICBwYXJ0aXRpb24xLm1lcmdlKG5vZGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFydGl0aW9uMi5tZXJnZShub2RlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjb25zdHJ1Y3QgY29tcG9uZW50cyBjb3JyZXNwb25kaW5nIHRvIGVhY2ggZGlzam9pbnQgc3Vic2V0IG9mIG5vZGVzXG4gICAgdmFyIGNvbnN0cnVjdENvbXBvbmVudCA9IGZ1bmN0aW9uIGNvbnN0cnVjdENvbXBvbmVudChzdWJzZXQpIHtcbiAgICAgIHZhciBjb21wb25lbnQgPSBfdGhpcy5zcGF3bigpO1xuICAgICAgc3Vic2V0LmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgY29tcG9uZW50Lm1lcmdlKG5vZGUpO1xuICAgICAgICBub2RlLmNvbm5lY3RlZEVkZ2VzKCkuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgICAgIC8vIGVuc3VyZSBlZGdlIGlzIHdpdGhpbiBjYWxsaW5nIGNvbGxlY3Rpb24gYW5kIGVkZ2UgaXMgbm90IGluIGN1dFxuICAgICAgICAgIGlmIChfdGhpcy5jb250YWlucyhlZGdlKSAmJiAhY3V0LmNvbnRhaW5zKGVkZ2UpKSB7XG4gICAgICAgICAgICBjb21wb25lbnQubWVyZ2UoZWRnZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgICB9O1xuICAgIHZhciBjb21wb25lbnRzID0gW2NvbnN0cnVjdENvbXBvbmVudChwYXJ0aXRpb24xKSwgY29uc3RydWN0Q29tcG9uZW50KHBhcnRpdGlvbjIpXTtcbiAgICB2YXIgcmV0ID0ge1xuICAgICAgY3V0OiBjdXQsXG4gICAgICBjb21wb25lbnRzOiBjb21wb25lbnRzLFxuICAgICAgLy8gbi5iLiBwYXJ0aXRpb25zIGFyZSBpbmNsdWRlZCB0byBiZSBjb21wYXRpYmxlIHdpdGggdGhlIG9sZCBhcGkgc3BlY1xuICAgICAgLy8gKGNvdWxkIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgbWFqb3IgdmVyc2lvbilcbiAgICAgIHBhcnRpdGlvbjE6IHBhcnRpdGlvbjEsXG4gICAgICBwYXJ0aXRpb24yOiBwYXJ0aXRpb24yXG4gICAgfTtcbiAgICByZXR1cm4gcmV0O1xuICB9XG59OyAvLyBlbGVzZm5cblxudmFyIF9NYXRoJGh5cG90O1xudmFyIGNvcHlQb3NpdGlvbiA9IGZ1bmN0aW9uIGNvcHlQb3NpdGlvbihwKSB7XG4gIHJldHVybiB7XG4gICAgeDogcC54LFxuICAgIHk6IHAueVxuICB9O1xufTtcbnZhciBtb2RlbFRvUmVuZGVyZWRQb3NpdGlvbiQxID0gZnVuY3Rpb24gbW9kZWxUb1JlbmRlcmVkUG9zaXRpb24ocCwgem9vbSwgcGFuKSB7XG4gIHJldHVybiB7XG4gICAgeDogcC54ICogem9vbSArIHBhbi54LFxuICAgIHk6IHAueSAqIHpvb20gKyBwYW4ueVxuICB9O1xufTtcbnZhciByZW5kZXJlZFRvTW9kZWxQb3NpdGlvbiA9IGZ1bmN0aW9uIHJlbmRlcmVkVG9Nb2RlbFBvc2l0aW9uKHAsIHpvb20sIHBhbikge1xuICByZXR1cm4ge1xuICAgIHg6IChwLnggLSBwYW4ueCkgLyB6b29tLFxuICAgIHk6IChwLnkgLSBwYW4ueSkgLyB6b29tXG4gIH07XG59O1xudmFyIGFycmF5MnBvaW50ID0gZnVuY3Rpb24gYXJyYXkycG9pbnQoYXJyKSB7XG4gIHJldHVybiB7XG4gICAgeDogYXJyWzBdLFxuICAgIHk6IGFyclsxXVxuICB9O1xufTtcbnZhciBtaW4gPSBmdW5jdGlvbiBtaW4oYXJyKSB7XG4gIHZhciBiZWdpbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMDtcbiAgdmFyIGVuZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogYXJyLmxlbmd0aDtcbiAgdmFyIG1pbiA9IEluZmluaXR5O1xuICBmb3IgKHZhciBpID0gYmVnaW47IGkgPCBlbmQ7IGkrKykge1xuICAgIHZhciB2YWwgPSBhcnJbaV07XG4gICAgaWYgKGlzRmluaXRlKHZhbCkpIHtcbiAgICAgIG1pbiA9IE1hdGgubWluKHZhbCwgbWluKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1pbjtcbn07XG52YXIgbWF4ID0gZnVuY3Rpb24gbWF4KGFycikge1xuICB2YXIgYmVnaW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IDA7XG4gIHZhciBlbmQgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGFyci5sZW5ndGg7XG4gIHZhciBtYXggPSAtSW5maW5pdHk7XG4gIGZvciAodmFyIGkgPSBiZWdpbjsgaSA8IGVuZDsgaSsrKSB7XG4gICAgdmFyIHZhbCA9IGFycltpXTtcbiAgICBpZiAoaXNGaW5pdGUodmFsKSkge1xuICAgICAgbWF4ID0gTWF0aC5tYXgodmFsLCBtYXgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbWF4O1xufTtcbnZhciBtZWFuID0gZnVuY3Rpb24gbWVhbihhcnIpIHtcbiAgdmFyIGJlZ2luID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAwO1xuICB2YXIgZW5kID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBhcnIubGVuZ3RoO1xuICB2YXIgdG90YWwgPSAwO1xuICB2YXIgbiA9IDA7XG4gIGZvciAodmFyIGkgPSBiZWdpbjsgaSA8IGVuZDsgaSsrKSB7XG4gICAgdmFyIHZhbCA9IGFycltpXTtcbiAgICBpZiAoaXNGaW5pdGUodmFsKSkge1xuICAgICAgdG90YWwgKz0gdmFsO1xuICAgICAgbisrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdG90YWwgLyBuO1xufTtcbnZhciBtZWRpYW4gPSBmdW5jdGlvbiBtZWRpYW4oYXJyKSB7XG4gIHZhciBiZWdpbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMDtcbiAgdmFyIGVuZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogYXJyLmxlbmd0aDtcbiAgdmFyIGNvcHkgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IHRydWU7XG4gIHZhciBzb3J0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgYXJndW1lbnRzWzRdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNF0gOiB0cnVlO1xuICB2YXIgaW5jbHVkZUhvbGVzID0gYXJndW1lbnRzLmxlbmd0aCA+IDUgJiYgYXJndW1lbnRzWzVdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNV0gOiB0cnVlO1xuICBpZiAoY29weSkge1xuICAgIGFyciA9IGFyci5zbGljZShiZWdpbiwgZW5kKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoZW5kIDwgYXJyLmxlbmd0aCkge1xuICAgICAgYXJyLnNwbGljZShlbmQsIGFyci5sZW5ndGggLSBlbmQpO1xuICAgIH1cbiAgICBpZiAoYmVnaW4gPiAwKSB7XG4gICAgICBhcnIuc3BsaWNlKDAsIGJlZ2luKTtcbiAgICB9XG4gIH1cblxuICAvLyBhbGwgbm9uIGZpbml0ZSAoZS5nLiBJbmZpbml0eSwgTmFOKSBlbGVtZW50cyBtdXN0IGJlIC1JbmZpbml0eSBzbyB0aGV5IGdvIHRvIHRoZSBzdGFydFxuICB2YXIgb2ZmID0gMDsgLy8gb2Zmc2V0IGZyb20gbm9uLWZpbml0ZSB2YWx1ZXNcbiAgZm9yICh2YXIgaSA9IGFyci5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIHZhciB2ID0gYXJyW2ldO1xuICAgIGlmIChpbmNsdWRlSG9sZXMpIHtcbiAgICAgIGlmICghaXNGaW5pdGUodikpIHtcbiAgICAgICAgYXJyW2ldID0gLUluZmluaXR5O1xuICAgICAgICBvZmYrKztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8ganVzdCByZW1vdmUgaXQgaWYgd2UgZG9uJ3Qgd2FudCB0byBjb25zaWRlciBob2xlc1xuICAgICAgYXJyLnNwbGljZShpLCAxKTtcbiAgICB9XG4gIH1cbiAgaWYgKHNvcnQpIHtcbiAgICBhcnIuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGEgLSBiO1xuICAgIH0pOyAvLyByZXF1aXJlcyBjb3B5ID0gdHJ1ZSBpZiB5b3UgZG9uJ3Qgd2FudCB0byBjaGFuZ2UgdGhlIG9yaWdcbiAgfVxuICB2YXIgbGVuID0gYXJyLmxlbmd0aDtcbiAgdmFyIG1pZCA9IE1hdGguZmxvb3IobGVuIC8gMik7XG4gIGlmIChsZW4gJSAyICE9PSAwKSB7XG4gICAgcmV0dXJuIGFyclttaWQgKyAxICsgb2ZmXTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gKGFyclttaWQgLSAxICsgb2ZmXSArIGFyclttaWQgKyBvZmZdKSAvIDI7XG4gIH1cbn07XG5cbi8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0dyZWF0ZXN0X2NvbW1vbl9kaXZpc29yI0V1Y2xpZGVhbl9hbGdvcml0aG1cbnZhciBfZ2NkID0gZnVuY3Rpb24gZ2NkKGEsIGIpIHtcbiAgaWYgKGIgPT09IDApIHtcbiAgICByZXR1cm4gYTtcbiAgfVxuICByZXR1cm4gX2djZChiLCBhICUgYik7XG59O1xudmFyIGdjZE11bHRpcGxlWmVyb0lmTm9uSW50ID0gZnVuY3Rpb24gZ2NkTXVsdGlwbGVaZXJvSWZOb25JbnQoYXJyKSB7XG4gIHZhciBvdXQgPSBhcnJbMF07XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKCFpbnRlZ2VyKGFycltpXSkpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH0gZWxzZSBpZiAoaSA+IDApIHtcbiAgICAgIG91dCA9IF9nY2Qob3V0LCBhcnJbaV0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0O1xufTtcbnZhciBkZWcycmFkID0gZnVuY3Rpb24gZGVnMnJhZChkZWcpIHtcbiAgcmV0dXJuIE1hdGguUEkgKiBkZWcgLyAxODA7XG59O1xudmFyIGdldEFuZ2xlRnJvbURpc3AgPSBmdW5jdGlvbiBnZXRBbmdsZUZyb21EaXNwKGRpc3BYLCBkaXNwWSkge1xuICByZXR1cm4gTWF0aC5hdGFuMihkaXNwWSwgZGlzcFgpIC0gTWF0aC5QSSAvIDI7XG59O1xudmFyIGxvZzIgPSBNYXRoLmxvZzIgfHwgZnVuY3Rpb24gKG4pIHtcbiAgcmV0dXJuIE1hdGgubG9nKG4pIC8gTWF0aC5sb2coMik7XG59O1xudmFyIHNpZ251bSA9IGZ1bmN0aW9uIHNpZ251bSh4KSB7XG4gIGlmICh4ID4gMCkge1xuICAgIHJldHVybiAxO1xuICB9IGVsc2UgaWYgKHggPCAwKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAwO1xuICB9XG59O1xudmFyIGRpc3QgPSBmdW5jdGlvbiBkaXN0KHAxLCBwMikge1xuICByZXR1cm4gTWF0aC5zcXJ0KHNxZGlzdChwMSwgcDIpKTtcbn07XG52YXIgc3FkaXN0ID0gZnVuY3Rpb24gc3FkaXN0KHAxLCBwMikge1xuICB2YXIgZHggPSBwMi54IC0gcDEueDtcbiAgdmFyIGR5ID0gcDIueSAtIHAxLnk7XG4gIHJldHVybiBkeCAqIGR4ICsgZHkgKiBkeTtcbn07XG52YXIgaW5QbGFjZVN1bU5vcm1hbGl6ZSA9IGZ1bmN0aW9uIGluUGxhY2VTdW1Ob3JtYWxpemUodikge1xuICB2YXIgbGVuZ3RoID0gdi5sZW5ndGg7XG5cbiAgLy8gRmlyc3QsIGdldCBzdW0gb2YgYWxsIGVsZW1lbnRzXG4gIHZhciB0b3RhbCA9IDA7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICB0b3RhbCArPSB2W2ldO1xuICB9XG5cbiAgLy8gTm93LCBkaXZpZGUgZWFjaCBieSB0aGUgc3VtIG9mIGFsbCBlbGVtZW50c1xuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbGVuZ3RoOyBfaSsrKSB7XG4gICAgdltfaV0gPSB2W19pXSAvIHRvdGFsO1xuICB9XG4gIHJldHVybiB2O1xufTtcblxuLy8gZnJvbSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0LDqXppZXJfY3VydmUjUXVhZHJhdGljX2N1cnZlc1xudmFyIHFiZXppZXJBdCA9IGZ1bmN0aW9uIHFiZXppZXJBdChwMCwgcDEsIHAyLCB0KSB7XG4gIHJldHVybiAoMSAtIHQpICogKDEgLSB0KSAqIHAwICsgMiAqICgxIC0gdCkgKiB0ICogcDEgKyB0ICogdCAqIHAyO1xufTtcbnZhciBxYmV6aWVyUHRBdCA9IGZ1bmN0aW9uIHFiZXppZXJQdEF0KHAwLCBwMSwgcDIsIHQpIHtcbiAgcmV0dXJuIHtcbiAgICB4OiBxYmV6aWVyQXQocDAueCwgcDEueCwgcDIueCwgdCksXG4gICAgeTogcWJlemllckF0KHAwLnksIHAxLnksIHAyLnksIHQpXG4gIH07XG59O1xudmFyIGxpbmVBdCA9IGZ1bmN0aW9uIGxpbmVBdChwMCwgcDEsIHQsIGQpIHtcbiAgdmFyIHZlYyA9IHtcbiAgICB4OiBwMS54IC0gcDAueCxcbiAgICB5OiBwMS55IC0gcDAueVxuICB9O1xuICB2YXIgdmVjRGlzdCA9IGRpc3QocDAsIHAxKTtcbiAgdmFyIG5vcm1WZWMgPSB7XG4gICAgeDogdmVjLnggLyB2ZWNEaXN0LFxuICAgIHk6IHZlYy55IC8gdmVjRGlzdFxuICB9O1xuICB0ID0gdCA9PSBudWxsID8gMCA6IHQ7XG4gIGQgPSBkICE9IG51bGwgPyBkIDogdCAqIHZlY0Rpc3Q7XG4gIHJldHVybiB7XG4gICAgeDogcDAueCArIG5vcm1WZWMueCAqIGQsXG4gICAgeTogcDAueSArIG5vcm1WZWMueSAqIGRcbiAgfTtcbn07XG52YXIgYm91bmQgPSBmdW5jdGlvbiBib3VuZChtaW4sIHZhbCwgbWF4KSB7XG4gIHJldHVybiBNYXRoLm1heChtaW4sIE1hdGgubWluKG1heCwgdmFsKSk7XG59O1xuXG4vLyBtYWtlcyBhIGZ1bGwgYmIgKHgxLCB5MSwgeDIsIHkyLCB3LCBoKSBmcm9tIGltcGxpY2l0IHBhcmFtc1xudmFyIG1ha2VCb3VuZGluZ0JveCA9IGZ1bmN0aW9uIG1ha2VCb3VuZGluZ0JveChiYikge1xuICBpZiAoYmIgPT0gbnVsbCkge1xuICAgIHJldHVybiB7XG4gICAgICB4MTogSW5maW5pdHksXG4gICAgICB5MTogSW5maW5pdHksXG4gICAgICB4MjogLUluZmluaXR5LFxuICAgICAgeTI6IC1JbmZpbml0eSxcbiAgICAgIHc6IDAsXG4gICAgICBoOiAwXG4gICAgfTtcbiAgfSBlbHNlIGlmIChiYi54MSAhPSBudWxsICYmIGJiLnkxICE9IG51bGwpIHtcbiAgICBpZiAoYmIueDIgIT0gbnVsbCAmJiBiYi55MiAhPSBudWxsICYmIGJiLngyID49IGJiLngxICYmIGJiLnkyID49IGJiLnkxKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4MTogYmIueDEsXG4gICAgICAgIHkxOiBiYi55MSxcbiAgICAgICAgeDI6IGJiLngyLFxuICAgICAgICB5MjogYmIueTIsXG4gICAgICAgIHc6IGJiLngyIC0gYmIueDEsXG4gICAgICAgIGg6IGJiLnkyIC0gYmIueTFcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChiYi53ICE9IG51bGwgJiYgYmIuaCAhPSBudWxsICYmIGJiLncgPj0gMCAmJiBiYi5oID49IDApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHgxOiBiYi54MSxcbiAgICAgICAgeTE6IGJiLnkxLFxuICAgICAgICB4MjogYmIueDEgKyBiYi53LFxuICAgICAgICB5MjogYmIueTEgKyBiYi5oLFxuICAgICAgICB3OiBiYi53LFxuICAgICAgICBoOiBiYi5oXG4gICAgICB9O1xuICAgIH1cbiAgfVxufTtcbnZhciBjb3B5Qm91bmRpbmdCb3ggPSBmdW5jdGlvbiBjb3B5Qm91bmRpbmdCb3goYmIpIHtcbiAgcmV0dXJuIHtcbiAgICB4MTogYmIueDEsXG4gICAgeDI6IGJiLngyLFxuICAgIHc6IGJiLncsXG4gICAgeTE6IGJiLnkxLFxuICAgIHkyOiBiYi55MixcbiAgICBoOiBiYi5oXG4gIH07XG59O1xudmFyIGNsZWFyQm91bmRpbmdCb3ggPSBmdW5jdGlvbiBjbGVhckJvdW5kaW5nQm94KGJiKSB7XG4gIGJiLngxID0gSW5maW5pdHk7XG4gIGJiLnkxID0gSW5maW5pdHk7XG4gIGJiLngyID0gLUluZmluaXR5O1xuICBiYi55MiA9IC1JbmZpbml0eTtcbiAgYmIudyA9IDA7XG4gIGJiLmggPSAwO1xufTtcbnZhciB1cGRhdGVCb3VuZGluZ0JveCA9IGZ1bmN0aW9uIHVwZGF0ZUJvdW5kaW5nQm94KGJiMSwgYmIyKSB7XG4gIC8vIHVwZGF0ZSBiYjEgd2l0aCBiYjIgYm91bmRzXG5cbiAgYmIxLngxID0gTWF0aC5taW4oYmIxLngxLCBiYjIueDEpO1xuICBiYjEueDIgPSBNYXRoLm1heChiYjEueDIsIGJiMi54Mik7XG4gIGJiMS53ID0gYmIxLngyIC0gYmIxLngxO1xuICBiYjEueTEgPSBNYXRoLm1pbihiYjEueTEsIGJiMi55MSk7XG4gIGJiMS55MiA9IE1hdGgubWF4KGJiMS55MiwgYmIyLnkyKTtcbiAgYmIxLmggPSBiYjEueTIgLSBiYjEueTE7XG59O1xudmFyIGV4cGFuZEJvdW5kaW5nQm94QnlQb2ludCA9IGZ1bmN0aW9uIGV4cGFuZEJvdW5kaW5nQm94QnlQb2ludChiYiwgeCwgeSkge1xuICBiYi54MSA9IE1hdGgubWluKGJiLngxLCB4KTtcbiAgYmIueDIgPSBNYXRoLm1heChiYi54MiwgeCk7XG4gIGJiLncgPSBiYi54MiAtIGJiLngxO1xuICBiYi55MSA9IE1hdGgubWluKGJiLnkxLCB5KTtcbiAgYmIueTIgPSBNYXRoLm1heChiYi55MiwgeSk7XG4gIGJiLmggPSBiYi55MiAtIGJiLnkxO1xufTtcbnZhciBleHBhbmRCb3VuZGluZ0JveCA9IGZ1bmN0aW9uIGV4cGFuZEJvdW5kaW5nQm94KGJiKSB7XG4gIHZhciBwYWRkaW5nID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAwO1xuICBiYi54MSAtPSBwYWRkaW5nO1xuICBiYi54MiArPSBwYWRkaW5nO1xuICBiYi55MSAtPSBwYWRkaW5nO1xuICBiYi55MiArPSBwYWRkaW5nO1xuICBiYi53ID0gYmIueDIgLSBiYi54MTtcbiAgYmIuaCA9IGJiLnkyIC0gYmIueTE7XG4gIHJldHVybiBiYjtcbn07XG52YXIgZXhwYW5kQm91bmRpbmdCb3hTaWRlcyA9IGZ1bmN0aW9uIGV4cGFuZEJvdW5kaW5nQm94U2lkZXMoYmIpIHtcbiAgdmFyIHBhZGRpbmcgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IFswXTtcbiAgdmFyIHRvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdDtcbiAgaWYgKHBhZGRpbmcubGVuZ3RoID09PSAxKSB7XG4gICAgdG9wID0gcmlnaHQgPSBib3R0b20gPSBsZWZ0ID0gcGFkZGluZ1swXTtcbiAgfSBlbHNlIGlmIChwYWRkaW5nLmxlbmd0aCA9PT0gMikge1xuICAgIHRvcCA9IGJvdHRvbSA9IHBhZGRpbmdbMF07XG4gICAgbGVmdCA9IHJpZ2h0ID0gcGFkZGluZ1sxXTtcbiAgfSBlbHNlIGlmIChwYWRkaW5nLmxlbmd0aCA9PT0gNCkge1xuICAgIHZhciBfcGFkZGluZyA9IF9zbGljZWRUb0FycmF5KHBhZGRpbmcsIDQpO1xuICAgIHRvcCA9IF9wYWRkaW5nWzBdO1xuICAgIHJpZ2h0ID0gX3BhZGRpbmdbMV07XG4gICAgYm90dG9tID0gX3BhZGRpbmdbMl07XG4gICAgbGVmdCA9IF9wYWRkaW5nWzNdO1xuICB9XG4gIGJiLngxIC09IGxlZnQ7XG4gIGJiLngyICs9IHJpZ2h0O1xuICBiYi55MSAtPSB0b3A7XG4gIGJiLnkyICs9IGJvdHRvbTtcbiAgYmIudyA9IGJiLngyIC0gYmIueDE7XG4gIGJiLmggPSBiYi55MiAtIGJiLnkxO1xuICByZXR1cm4gYmI7XG59O1xuXG4vLyBhc3NpZ24gdGhlIHZhbHVlcyBvZiBiYjIgaW50byBiYjFcbnZhciBhc3NpZ25Cb3VuZGluZ0JveCA9IGZ1bmN0aW9uIGFzc2lnbkJvdW5kaW5nQm94KGJiMSwgYmIyKSB7XG4gIGJiMS54MSA9IGJiMi54MTtcbiAgYmIxLnkxID0gYmIyLnkxO1xuICBiYjEueDIgPSBiYjIueDI7XG4gIGJiMS55MiA9IGJiMi55MjtcbiAgYmIxLncgPSBiYjEueDIgLSBiYjEueDE7XG4gIGJiMS5oID0gYmIxLnkyIC0gYmIxLnkxO1xufTtcbnZhciBib3VuZGluZ0JveGVzSW50ZXJzZWN0ID0gZnVuY3Rpb24gYm91bmRpbmdCb3hlc0ludGVyc2VjdChiYjEsIGJiMikge1xuICAvLyBjYXNlOiBvbmUgYmIgdG8gcmlnaHQgb2Ygb3RoZXJcbiAgaWYgKGJiMS54MSA+IGJiMi54Mikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoYmIyLngxID4gYmIxLngyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gY2FzZTogb25lIGJiIHRvIGxlZnQgb2Ygb3RoZXJcbiAgaWYgKGJiMS54MiA8IGJiMi54MSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoYmIyLngyIDwgYmIxLngxKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gY2FzZTogb25lIGJiIGFib3ZlIG90aGVyXG4gIGlmIChiYjEueTIgPCBiYjIueTEpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGJiMi55MiA8IGJiMS55MSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIGNhc2U6IG9uZSBiYiBiZWxvdyBvdGhlclxuICBpZiAoYmIxLnkxID4gYmIyLnkyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChiYjIueTEgPiBiYjEueTIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBvdGhlcndpc2UsIG11c3QgaGF2ZSBzb21lIG92ZXJsYXBcbiAgcmV0dXJuIHRydWU7XG59O1xudmFyIGluQm91bmRpbmdCb3ggPSBmdW5jdGlvbiBpbkJvdW5kaW5nQm94KGJiLCB4LCB5KSB7XG4gIHJldHVybiBiYi54MSA8PSB4ICYmIHggPD0gYmIueDIgJiYgYmIueTEgPD0geSAmJiB5IDw9IGJiLnkyO1xufTtcbnZhciBwb2ludEluQm91bmRpbmdCb3ggPSBmdW5jdGlvbiBwb2ludEluQm91bmRpbmdCb3goYmIsIHB0KSB7XG4gIHJldHVybiBpbkJvdW5kaW5nQm94KGJiLCBwdC54LCBwdC55KTtcbn07XG52YXIgYm91bmRpbmdCb3hJbkJvdW5kaW5nQm94ID0gZnVuY3Rpb24gYm91bmRpbmdCb3hJbkJvdW5kaW5nQm94KGJiMSwgYmIyKSB7XG4gIHJldHVybiBpbkJvdW5kaW5nQm94KGJiMSwgYmIyLngxLCBiYjIueTEpICYmIGluQm91bmRpbmdCb3goYmIxLCBiYjIueDIsIGJiMi55Mik7XG59O1xudmFyIGh5cG90ID0gKF9NYXRoJGh5cG90ID0gTWF0aC5oeXBvdCkgIT09IG51bGwgJiYgX01hdGgkaHlwb3QgIT09IHZvaWQgMCA/IF9NYXRoJGh5cG90IDogZnVuY3Rpb24gKHgsIHkpIHtcbiAgcmV0dXJuIE1hdGguc3FydCh4ICogeCArIHkgKiB5KTtcbn07XG5mdW5jdGlvbiBpbmZsYXRlUG9seWdvbihwb2x5Z29uLCBkKSB7XG4gIGlmIChwb2x5Z29uLmxlbmd0aCA8IDMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05lZWQgYXQgbGVhc3QgMyB2ZXJ0aWNlcycpO1xuICB9XG4gIC8vIEhlbHBlcnNcbiAgdmFyIGFkZCA9IGZ1bmN0aW9uIGFkZChhLCBiKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IGEueCArIGIueCxcbiAgICAgIHk6IGEueSArIGIueVxuICAgIH07XG4gIH07XG4gIHZhciBzdWIgPSBmdW5jdGlvbiBzdWIoYSwgYikge1xuICAgIHJldHVybiB7XG4gICAgICB4OiBhLnggLSBiLngsXG4gICAgICB5OiBhLnkgLSBiLnlcbiAgICB9O1xuICB9O1xuICB2YXIgc2NhbGUgPSBmdW5jdGlvbiBzY2FsZSh2LCBzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IHYueCAqIHMsXG4gICAgICB5OiB2LnkgKiBzXG4gICAgfTtcbiAgfTtcbiAgdmFyIGNyb3NzID0gZnVuY3Rpb24gY3Jvc3ModSwgdikge1xuICAgIHJldHVybiB1LnggKiB2LnkgLSB1LnkgKiB2Lng7XG4gIH07XG4gIHZhciBub3JtYWxpemUgPSBmdW5jdGlvbiBub3JtYWxpemUodikge1xuICAgIHZhciBsZW4gPSBoeXBvdCh2LngsIHYueSk7XG4gICAgcmV0dXJuIGxlbiA9PT0gMCA/IHtcbiAgICAgIHg6IDAsXG4gICAgICB5OiAwXG4gICAgfSA6IHtcbiAgICAgIHg6IHYueCAvIGxlbixcbiAgICAgIHk6IHYueSAvIGxlblxuICAgIH07XG4gIH07XG4gIC8vIFNpZ25lZCBhcmVhIChwb3NpdGl2ZSA9IENDVylcbiAgdmFyIHNpZ25lZEFyZWEgPSBmdW5jdGlvbiBzaWduZWRBcmVhKHB0cykge1xuICAgIHZhciBBID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHB0cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHAgPSBwdHNbaV0sXG4gICAgICAgIHEgPSBwdHNbKGkgKyAxKSAlIHB0cy5sZW5ndGhdO1xuICAgICAgQSArPSBwLnggKiBxLnkgLSBxLnggKiBwLnk7XG4gICAgfVxuICAgIHJldHVybiBBIC8gMjtcbiAgfTtcbiAgLy8gTGluZeKAk2xpbmUgaW50ZXJzZWN0aW9uIChpbmZpbml0ZSBsaW5lcylcbiAgdmFyIGludGVyc2VjdExpbmVzID0gZnVuY3Rpb24gaW50ZXJzZWN0TGluZXMocDEsIHAyLCBwMywgcDQpIHtcbiAgICB2YXIgciA9IHN1YihwMiwgcDEpO1xuICAgIHZhciBzID0gc3ViKHA0LCBwMyk7XG4gICAgdmFyIGRlbm9tID0gY3Jvc3Mociwgcyk7XG4gICAgaWYgKE1hdGguYWJzKGRlbm9tKSA8IDFlLTkpIHtcbiAgICAgIC8vIFBhcmFsbGVsIG9yIG5lYXJseSBzbyDigJQgZmFsbGJhY2sgdG8gbWlkcG9pbnRcbiAgICAgIHJldHVybiBhZGQocDEsIHNjYWxlKHIsIDAuNSkpO1xuICAgIH1cbiAgICB2YXIgdCA9IGNyb3NzKHN1YihwMywgcDEpLCBzKSAvIGRlbm9tO1xuICAgIHJldHVybiBhZGQocDEsIHNjYWxlKHIsIHQpKTtcbiAgfTtcblxuICAvLyBNYWtlIGEgc2hhbGxvdyBjb3B5IGFuZCBlbmZvcmNlIENDV1xuICB2YXIgcHRzID0gcG9seWdvbi5tYXAoZnVuY3Rpb24gKHApIHtcbiAgICByZXR1cm4ge1xuICAgICAgeDogcC54LFxuICAgICAgeTogcC55XG4gICAgfTtcbiAgfSk7XG4gIGlmIChzaWduZWRBcmVhKHB0cykgPCAwKSBwdHMucmV2ZXJzZSgpO1xuICB2YXIgbiA9IHB0cy5sZW5ndGg7XG4gIC8vIENvbXB1dGUgb3V0d2FyZCBub3JtYWxzIGZvciBlYWNoIGVkZ2VcbiAgdmFyIG5vcm1hbHMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICB2YXIgcCA9IHB0c1tpXSxcbiAgICAgIHEgPSBwdHNbKGkgKyAxKSAlIG5dO1xuICAgIHZhciBlZGdlID0gc3ViKHEsIHApO1xuICAgIC8vIEZvciBDQ1cgcG9seWdvbiwgaW53YXJkIG5vcm1hbCA9ICgtZWRnZS55LCBlZGdlLngpXG4gICAgLy8gc28gb3V0d2FyZCBub3JtYWwgPSAoZWRnZS55LCAtZWRnZS54KVxuICAgIHZhciBvdXQgPSBub3JtYWxpemUoe1xuICAgICAgeDogZWRnZS55LFxuICAgICAgeTogLWVkZ2UueFxuICAgIH0pO1xuICAgIG5vcm1hbHMucHVzaChvdXQpO1xuICB9XG5cbiAgLy8gQnVpbGQgb2Zmc2V0IGVkZ2VzXG4gIHZhciBvZmZzZXRFZGdlcyA9IG5vcm1hbHMubWFwKGZ1bmN0aW9uIChucm0sIGkpIHtcbiAgICB2YXIgcDEgPSBhZGQocHRzW2ldLCBzY2FsZShucm0sIGQpKTtcbiAgICB2YXIgcDIgPSBhZGQocHRzWyhpICsgMSkgJSBuXSwgc2NhbGUobnJtLCBkKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHAxOiBwMSxcbiAgICAgIHAyOiBwMlxuICAgIH07XG4gIH0pO1xuXG4gIC8vIEludGVyc2VjdCBjb25zZWN1dGl2ZSBvZmZzZXQgZWRnZXNcbiAgdmFyIGluZmxhdGVkID0gW107XG4gIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IG47IF9pMisrKSB7XG4gICAgdmFyIHByZXZFZGdlID0gb2Zmc2V0RWRnZXNbKF9pMiAtIDEgKyBuKSAlIG5dO1xuICAgIHZhciBjdXJyRWRnZSA9IG9mZnNldEVkZ2VzW19pMl07XG4gICAgdmFyIGlwID0gaW50ZXJzZWN0TGluZXMocHJldkVkZ2UucDEsIHByZXZFZGdlLnAyLCBjdXJyRWRnZS5wMSwgY3VyckVkZ2UucDIpO1xuICAgIGluZmxhdGVkLnB1c2goaXApO1xuICB9XG4gIHJldHVybiBpbmZsYXRlZDtcbn1cbmZ1bmN0aW9uIG1pdGVyQm94KHB0cywgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgc3Ryb2tlV2lkdGgpIHtcbiAgdmFyIHRwdHMgPSB0cmFuc2Zvcm1Qb2ludHMocHRzLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0KTtcbiAgdmFyIG9mZnNldFBvaW50cyA9IGluZmxhdGVQb2x5Z29uKHRwdHMsIHN0cm9rZVdpZHRoKTtcbiAgdmFyIGJiID0gbWFrZUJvdW5kaW5nQm94KCk7XG4gIG9mZnNldFBvaW50cy5mb3JFYWNoKGZ1bmN0aW9uIChwdCkge1xuICAgIHJldHVybiBleHBhbmRCb3VuZGluZ0JveEJ5UG9pbnQoYmIsIHB0LngsIHB0LnkpO1xuICB9KTtcbiAgcmV0dXJuIGJiO1xufVxudmFyIHJvdW5kUmVjdGFuZ2xlSW50ZXJzZWN0TGluZSA9IGZ1bmN0aW9uIHJvdW5kUmVjdGFuZ2xlSW50ZXJzZWN0TGluZSh4LCB5LCBub2RlWCwgbm9kZVksIHdpZHRoLCBoZWlnaHQsIHBhZGRpbmcpIHtcbiAgdmFyIHJhZGl1cyA9IGFyZ3VtZW50cy5sZW5ndGggPiA3ICYmIGFyZ3VtZW50c1s3XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzddIDogJ2F1dG8nO1xuICB2YXIgY29ybmVyUmFkaXVzID0gcmFkaXVzID09PSAnYXV0bycgPyBnZXRSb3VuZFJlY3RhbmdsZVJhZGl1cyh3aWR0aCwgaGVpZ2h0KSA6IHJhZGl1cztcbiAgdmFyIGhhbGZXaWR0aCA9IHdpZHRoIC8gMjtcbiAgdmFyIGhhbGZIZWlnaHQgPSBoZWlnaHQgLyAyO1xuICBjb3JuZXJSYWRpdXMgPSBNYXRoLm1pbihjb3JuZXJSYWRpdXMsIGhhbGZXaWR0aCwgaGFsZkhlaWdodCk7XG4gIHZhciBkb1dpZHRoID0gY29ybmVyUmFkaXVzICE9PSBoYWxmV2lkdGgsXG4gICAgZG9IZWlnaHQgPSBjb3JuZXJSYWRpdXMgIT09IGhhbGZIZWlnaHQ7XG5cbiAgLy8gQ2hlY2sgaW50ZXJzZWN0aW9ucyB3aXRoIHN0cmFpZ2h0IGxpbmUgc2VnbWVudHNcbiAgdmFyIHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnM7XG5cbiAgLy8gVG9wIHNlZ21lbnQsIGxlZnQgdG8gcmlnaHRcbiAgaWYgKGRvV2lkdGgpIHtcbiAgICB2YXIgdG9wU3RhcnRYID0gbm9kZVggLSBoYWxmV2lkdGggKyBjb3JuZXJSYWRpdXMgLSBwYWRkaW5nO1xuICAgIHZhciB0b3BTdGFydFkgPSBub2RlWSAtIGhhbGZIZWlnaHQgLSBwYWRkaW5nO1xuICAgIHZhciB0b3BFbmRYID0gbm9kZVggKyBoYWxmV2lkdGggLSBjb3JuZXJSYWRpdXMgKyBwYWRkaW5nO1xuICAgIHZhciB0b3BFbmRZID0gdG9wU3RhcnRZO1xuICAgIHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMgPSBmaW5pdGVMaW5lc0ludGVyc2VjdCh4LCB5LCBub2RlWCwgbm9kZVksIHRvcFN0YXJ0WCwgdG9wU3RhcnRZLCB0b3BFbmRYLCB0b3BFbmRZLCBmYWxzZSk7XG4gICAgaWYgKHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnM7XG4gICAgfVxuICB9XG5cbiAgLy8gUmlnaHQgc2VnbWVudCwgdG9wIHRvIGJvdHRvbVxuICBpZiAoZG9IZWlnaHQpIHtcbiAgICB2YXIgcmlnaHRTdGFydFggPSBub2RlWCArIGhhbGZXaWR0aCArIHBhZGRpbmc7XG4gICAgdmFyIHJpZ2h0U3RhcnRZID0gbm9kZVkgLSBoYWxmSGVpZ2h0ICsgY29ybmVyUmFkaXVzIC0gcGFkZGluZztcbiAgICB2YXIgcmlnaHRFbmRYID0gcmlnaHRTdGFydFg7XG4gICAgdmFyIHJpZ2h0RW5kWSA9IG5vZGVZICsgaGFsZkhlaWdodCAtIGNvcm5lclJhZGl1cyArIHBhZGRpbmc7XG4gICAgc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucyA9IGZpbml0ZUxpbmVzSW50ZXJzZWN0KHgsIHksIG5vZGVYLCBub2RlWSwgcmlnaHRTdGFydFgsIHJpZ2h0U3RhcnRZLCByaWdodEVuZFgsIHJpZ2h0RW5kWSwgZmFsc2UpO1xuICAgIGlmIChzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zO1xuICAgIH1cbiAgfVxuXG4gIC8vIEJvdHRvbSBzZWdtZW50LCBsZWZ0IHRvIHJpZ2h0XG4gIGlmIChkb1dpZHRoKSB7XG4gICAgdmFyIGJvdHRvbVN0YXJ0WCA9IG5vZGVYIC0gaGFsZldpZHRoICsgY29ybmVyUmFkaXVzIC0gcGFkZGluZztcbiAgICB2YXIgYm90dG9tU3RhcnRZID0gbm9kZVkgKyBoYWxmSGVpZ2h0ICsgcGFkZGluZztcbiAgICB2YXIgYm90dG9tRW5kWCA9IG5vZGVYICsgaGFsZldpZHRoIC0gY29ybmVyUmFkaXVzICsgcGFkZGluZztcbiAgICB2YXIgYm90dG9tRW5kWSA9IGJvdHRvbVN0YXJ0WTtcbiAgICBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zID0gZmluaXRlTGluZXNJbnRlcnNlY3QoeCwgeSwgbm9kZVgsIG5vZGVZLCBib3R0b21TdGFydFgsIGJvdHRvbVN0YXJ0WSwgYm90dG9tRW5kWCwgYm90dG9tRW5kWSwgZmFsc2UpO1xuICAgIGlmIChzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zO1xuICAgIH1cbiAgfVxuXG4gIC8vIExlZnQgc2VnbWVudCwgdG9wIHRvIGJvdHRvbVxuICBpZiAoZG9IZWlnaHQpIHtcbiAgICB2YXIgbGVmdFN0YXJ0WCA9IG5vZGVYIC0gaGFsZldpZHRoIC0gcGFkZGluZztcbiAgICB2YXIgbGVmdFN0YXJ0WSA9IG5vZGVZIC0gaGFsZkhlaWdodCArIGNvcm5lclJhZGl1cyAtIHBhZGRpbmc7XG4gICAgdmFyIGxlZnRFbmRYID0gbGVmdFN0YXJ0WDtcbiAgICB2YXIgbGVmdEVuZFkgPSBub2RlWSArIGhhbGZIZWlnaHQgLSBjb3JuZXJSYWRpdXMgKyBwYWRkaW5nO1xuICAgIHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMgPSBmaW5pdGVMaW5lc0ludGVyc2VjdCh4LCB5LCBub2RlWCwgbm9kZVksIGxlZnRTdGFydFgsIGxlZnRTdGFydFksIGxlZnRFbmRYLCBsZWZ0RW5kWSwgZmFsc2UpO1xuICAgIGlmIChzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zO1xuICAgIH1cbiAgfVxuXG4gIC8vIENoZWNrIGludGVyc2VjdGlvbnMgd2l0aCBhcmMgc2VnbWVudHNcbiAgdmFyIGFyY0ludGVyc2VjdGlvbnM7XG5cbiAgLy8gVG9wIExlZnRcbiAge1xuICAgIHZhciB0b3BMZWZ0Q2VudGVyWCA9IG5vZGVYIC0gaGFsZldpZHRoICsgY29ybmVyUmFkaXVzO1xuICAgIHZhciB0b3BMZWZ0Q2VudGVyWSA9IG5vZGVZIC0gaGFsZkhlaWdodCArIGNvcm5lclJhZGl1cztcbiAgICBhcmNJbnRlcnNlY3Rpb25zID0gaW50ZXJzZWN0TGluZUNpcmNsZSh4LCB5LCBub2RlWCwgbm9kZVksIHRvcExlZnRDZW50ZXJYLCB0b3BMZWZ0Q2VudGVyWSwgY29ybmVyUmFkaXVzICsgcGFkZGluZyk7XG5cbiAgICAvLyBFbnN1cmUgdGhlIGludGVyc2VjdGlvbiBpcyBvbiB0aGUgZGVzaXJlZCBxdWFydGVyIG9mIHRoZSBjaXJjbGVcbiAgICBpZiAoYXJjSW50ZXJzZWN0aW9ucy5sZW5ndGggPiAwICYmIGFyY0ludGVyc2VjdGlvbnNbMF0gPD0gdG9wTGVmdENlbnRlclggJiYgYXJjSW50ZXJzZWN0aW9uc1sxXSA8PSB0b3BMZWZ0Q2VudGVyWSkge1xuICAgICAgcmV0dXJuIFthcmNJbnRlcnNlY3Rpb25zWzBdLCBhcmNJbnRlcnNlY3Rpb25zWzFdXTtcbiAgICB9XG4gIH1cblxuICAvLyBUb3AgUmlnaHRcbiAge1xuICAgIHZhciB0b3BSaWdodENlbnRlclggPSBub2RlWCArIGhhbGZXaWR0aCAtIGNvcm5lclJhZGl1cztcbiAgICB2YXIgdG9wUmlnaHRDZW50ZXJZID0gbm9kZVkgLSBoYWxmSGVpZ2h0ICsgY29ybmVyUmFkaXVzO1xuICAgIGFyY0ludGVyc2VjdGlvbnMgPSBpbnRlcnNlY3RMaW5lQ2lyY2xlKHgsIHksIG5vZGVYLCBub2RlWSwgdG9wUmlnaHRDZW50ZXJYLCB0b3BSaWdodENlbnRlclksIGNvcm5lclJhZGl1cyArIHBhZGRpbmcpO1xuXG4gICAgLy8gRW5zdXJlIHRoZSBpbnRlcnNlY3Rpb24gaXMgb24gdGhlIGRlc2lyZWQgcXVhcnRlciBvZiB0aGUgY2lyY2xlXG4gICAgaWYgKGFyY0ludGVyc2VjdGlvbnMubGVuZ3RoID4gMCAmJiBhcmNJbnRlcnNlY3Rpb25zWzBdID49IHRvcFJpZ2h0Q2VudGVyWCAmJiBhcmNJbnRlcnNlY3Rpb25zWzFdIDw9IHRvcFJpZ2h0Q2VudGVyWSkge1xuICAgICAgcmV0dXJuIFthcmNJbnRlcnNlY3Rpb25zWzBdLCBhcmNJbnRlcnNlY3Rpb25zWzFdXTtcbiAgICB9XG4gIH1cblxuICAvLyBCb3R0b20gUmlnaHRcbiAge1xuICAgIHZhciBib3R0b21SaWdodENlbnRlclggPSBub2RlWCArIGhhbGZXaWR0aCAtIGNvcm5lclJhZGl1cztcbiAgICB2YXIgYm90dG9tUmlnaHRDZW50ZXJZID0gbm9kZVkgKyBoYWxmSGVpZ2h0IC0gY29ybmVyUmFkaXVzO1xuICAgIGFyY0ludGVyc2VjdGlvbnMgPSBpbnRlcnNlY3RMaW5lQ2lyY2xlKHgsIHksIG5vZGVYLCBub2RlWSwgYm90dG9tUmlnaHRDZW50ZXJYLCBib3R0b21SaWdodENlbnRlclksIGNvcm5lclJhZGl1cyArIHBhZGRpbmcpO1xuXG4gICAgLy8gRW5zdXJlIHRoZSBpbnRlcnNlY3Rpb24gaXMgb24gdGhlIGRlc2lyZWQgcXVhcnRlciBvZiB0aGUgY2lyY2xlXG4gICAgaWYgKGFyY0ludGVyc2VjdGlvbnMubGVuZ3RoID4gMCAmJiBhcmNJbnRlcnNlY3Rpb25zWzBdID49IGJvdHRvbVJpZ2h0Q2VudGVyWCAmJiBhcmNJbnRlcnNlY3Rpb25zWzFdID49IGJvdHRvbVJpZ2h0Q2VudGVyWSkge1xuICAgICAgcmV0dXJuIFthcmNJbnRlcnNlY3Rpb25zWzBdLCBhcmNJbnRlcnNlY3Rpb25zWzFdXTtcbiAgICB9XG4gIH1cblxuICAvLyBCb3R0b20gTGVmdFxuICB7XG4gICAgdmFyIGJvdHRvbUxlZnRDZW50ZXJYID0gbm9kZVggLSBoYWxmV2lkdGggKyBjb3JuZXJSYWRpdXM7XG4gICAgdmFyIGJvdHRvbUxlZnRDZW50ZXJZID0gbm9kZVkgKyBoYWxmSGVpZ2h0IC0gY29ybmVyUmFkaXVzO1xuICAgIGFyY0ludGVyc2VjdGlvbnMgPSBpbnRlcnNlY3RMaW5lQ2lyY2xlKHgsIHksIG5vZGVYLCBub2RlWSwgYm90dG9tTGVmdENlbnRlclgsIGJvdHRvbUxlZnRDZW50ZXJZLCBjb3JuZXJSYWRpdXMgKyBwYWRkaW5nKTtcblxuICAgIC8vIEVuc3VyZSB0aGUgaW50ZXJzZWN0aW9uIGlzIG9uIHRoZSBkZXNpcmVkIHF1YXJ0ZXIgb2YgdGhlIGNpcmNsZVxuICAgIGlmIChhcmNJbnRlcnNlY3Rpb25zLmxlbmd0aCA+IDAgJiYgYXJjSW50ZXJzZWN0aW9uc1swXSA8PSBib3R0b21MZWZ0Q2VudGVyWCAmJiBhcmNJbnRlcnNlY3Rpb25zWzFdID49IGJvdHRvbUxlZnRDZW50ZXJZKSB7XG4gICAgICByZXR1cm4gW2FyY0ludGVyc2VjdGlvbnNbMF0sIGFyY0ludGVyc2VjdGlvbnNbMV1dO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW107IC8vIGlmIG5vdGhpbmdcbn07XG52YXIgaW5MaW5lVmljaW5pdHkgPSBmdW5jdGlvbiBpbkxpbmVWaWNpbml0eSh4LCB5LCBseDEsIGx5MSwgbHgyLCBseTIsIHRvbGVyYW5jZSkge1xuICB2YXIgdCA9IHRvbGVyYW5jZTtcbiAgdmFyIHgxID0gTWF0aC5taW4obHgxLCBseDIpO1xuICB2YXIgeDIgPSBNYXRoLm1heChseDEsIGx4Mik7XG4gIHZhciB5MSA9IE1hdGgubWluKGx5MSwgbHkyKTtcbiAgdmFyIHkyID0gTWF0aC5tYXgobHkxLCBseTIpO1xuICByZXR1cm4geDEgLSB0IDw9IHggJiYgeCA8PSB4MiArIHQgJiYgeTEgLSB0IDw9IHkgJiYgeSA8PSB5MiArIHQ7XG59O1xudmFyIGluQmV6aWVyVmljaW5pdHkgPSBmdW5jdGlvbiBpbkJlemllclZpY2luaXR5KHgsIHksIHgxLCB5MSwgeDIsIHkyLCB4MywgeTMsIHRvbGVyYW5jZSkge1xuICB2YXIgYmIgPSB7XG4gICAgeDE6IE1hdGgubWluKHgxLCB4MywgeDIpIC0gdG9sZXJhbmNlLFxuICAgIHgyOiBNYXRoLm1heCh4MSwgeDMsIHgyKSArIHRvbGVyYW5jZSxcbiAgICB5MTogTWF0aC5taW4oeTEsIHkzLCB5MikgLSB0b2xlcmFuY2UsXG4gICAgeTI6IE1hdGgubWF4KHkxLCB5MywgeTIpICsgdG9sZXJhbmNlXG4gIH07XG5cbiAgLy8gaWYgb3V0c2lkZSB0aGUgcm91Z2ggYm91bmRpbmcgYm94IGZvciB0aGUgYmV6aWVyLCB0aGVuIGl0IGNhbid0IGJlIGEgaGl0XG4gIGlmICh4IDwgYmIueDEgfHwgeCA+IGJiLngyIHx8IHkgPCBiYi55MSB8fCB5ID4gYmIueTIpIHtcbiAgICAvLyBjb25zb2xlLmxvZygnYmV6aWVyIG91dCBvZiByb3VnaCBiYicpXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGVsc2Uge1xuICAgIC8vIGNvbnNvbGUubG9nKCdkbyBtb3JlIGV4cGVuc2l2ZSBjaGVjaycpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59O1xudmFyIHNvbHZlUXVhZHJhdGljID0gZnVuY3Rpb24gc29sdmVRdWFkcmF0aWMoYSwgYiwgYywgdmFsKSB7XG4gIGMgLT0gdmFsO1xuICB2YXIgciA9IGIgKiBiIC0gNCAqIGEgKiBjO1xuICBpZiAociA8IDApIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgdmFyIHNxcnRSID0gTWF0aC5zcXJ0KHIpO1xuICB2YXIgZGVub20gPSAyICogYTtcbiAgdmFyIHJvb3QxID0gKC1iICsgc3FydFIpIC8gZGVub207XG4gIHZhciByb290MiA9ICgtYiAtIHNxcnRSKSAvIGRlbm9tO1xuICByZXR1cm4gW3Jvb3QxLCByb290Ml07XG59O1xudmFyIHNvbHZlQ3ViaWMgPSBmdW5jdGlvbiBzb2x2ZUN1YmljKGEsIGIsIGMsIGQsIHJlc3VsdCkge1xuICAvLyBTb2x2ZXMgYSBjdWJpYyBmdW5jdGlvbiwgcmV0dXJucyByb290IGluIGZvcm0gW3IxLCBpMSwgcjIsIGkyLCByMywgaTNdLCB3aGVyZVxuICAvLyByIGlzIHRoZSByZWFsIGNvbXBvbmVudCwgaSBpcyB0aGUgaW1hZ2luYXJ5IGNvbXBvbmVudFxuXG4gIC8vIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBDYXJkYW5vIG1ldGhvZCBmcm9tIHRoZSB5ZWFyIDE1NDVcbiAgLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DdWJpY19mdW5jdGlvbiNUaGVfbmF0dXJlX29mX3RoZV9yb290c1xuXG4gIHZhciBlcHNpbG9uID0gMC4wMDAwMTtcblxuICAvLyBhdm9pZCBkaXZpc2lvbiBieSB6ZXJvIHdoaWxlIGtlZXBpbmcgdGhlIG92ZXJhbGwgZXhwcmVzc2lvbiBjbG9zZSBpbiB2YWx1ZVxuICBpZiAoYSA9PT0gMCkge1xuICAgIGEgPSBlcHNpbG9uO1xuICB9XG4gIGIgLz0gYTtcbiAgYyAvPSBhO1xuICBkIC89IGE7XG4gIHZhciBkaXNjcmltaW5hbnQsIHEsIHIsIGR1bTEsIHMsIHQsIHRlcm0xLCByMTM7XG4gIHEgPSAoMy4wICogYyAtIGIgKiBiKSAvIDkuMDtcbiAgciA9IC0oMjcuMCAqIGQpICsgYiAqICg5LjAgKiBjIC0gMi4wICogKGIgKiBiKSk7XG4gIHIgLz0gNTQuMDtcbiAgZGlzY3JpbWluYW50ID0gcSAqIHEgKiBxICsgciAqIHI7XG4gIHJlc3VsdFsxXSA9IDA7XG4gIHRlcm0xID0gYiAvIDMuMDtcbiAgaWYgKGRpc2NyaW1pbmFudCA+IDApIHtcbiAgICBzID0gciArIE1hdGguc3FydChkaXNjcmltaW5hbnQpO1xuICAgIHMgPSBzIDwgMCA/IC1NYXRoLnBvdygtcywgMS4wIC8gMy4wKSA6IE1hdGgucG93KHMsIDEuMCAvIDMuMCk7XG4gICAgdCA9IHIgLSBNYXRoLnNxcnQoZGlzY3JpbWluYW50KTtcbiAgICB0ID0gdCA8IDAgPyAtTWF0aC5wb3coLXQsIDEuMCAvIDMuMCkgOiBNYXRoLnBvdyh0LCAxLjAgLyAzLjApO1xuICAgIHJlc3VsdFswXSA9IC10ZXJtMSArIHMgKyB0O1xuICAgIHRlcm0xICs9IChzICsgdCkgLyAyLjA7XG4gICAgcmVzdWx0WzRdID0gcmVzdWx0WzJdID0gLXRlcm0xO1xuICAgIHRlcm0xID0gTWF0aC5zcXJ0KDMuMCkgKiAoLXQgKyBzKSAvIDI7XG4gICAgcmVzdWx0WzNdID0gdGVybTE7XG4gICAgcmVzdWx0WzVdID0gLXRlcm0xO1xuICAgIHJldHVybjtcbiAgfVxuICByZXN1bHRbNV0gPSByZXN1bHRbM10gPSAwO1xuICBpZiAoZGlzY3JpbWluYW50ID09PSAwKSB7XG4gICAgcjEzID0gciA8IDAgPyAtTWF0aC5wb3coLXIsIDEuMCAvIDMuMCkgOiBNYXRoLnBvdyhyLCAxLjAgLyAzLjApO1xuICAgIHJlc3VsdFswXSA9IC10ZXJtMSArIDIuMCAqIHIxMztcbiAgICByZXN1bHRbNF0gPSByZXN1bHRbMl0gPSAtKHIxMyArIHRlcm0xKTtcbiAgICByZXR1cm47XG4gIH1cbiAgcSA9IC1xO1xuICBkdW0xID0gcSAqIHEgKiBxO1xuICBkdW0xID0gTWF0aC5hY29zKHIgLyBNYXRoLnNxcnQoZHVtMSkpO1xuICByMTMgPSAyLjAgKiBNYXRoLnNxcnQocSk7XG4gIHJlc3VsdFswXSA9IC10ZXJtMSArIHIxMyAqIE1hdGguY29zKGR1bTEgLyAzLjApO1xuICByZXN1bHRbMl0gPSAtdGVybTEgKyByMTMgKiBNYXRoLmNvcygoZHVtMSArIDIuMCAqIE1hdGguUEkpIC8gMy4wKTtcbiAgcmVzdWx0WzRdID0gLXRlcm0xICsgcjEzICogTWF0aC5jb3MoKGR1bTEgKyA0LjAgKiBNYXRoLlBJKSAvIDMuMCk7XG4gIHJldHVybjtcbn07XG52YXIgc3FkaXN0VG9RdWFkcmF0aWNCZXppZXIgPSBmdW5jdGlvbiBzcWRpc3RUb1F1YWRyYXRpY0Jlemllcih4LCB5LCB4MSwgeTEsIHgyLCB5MiwgeDMsIHkzKSB7XG4gIC8vIEZpbmQgbWluaW11bSBkaXN0YW5jZSBieSB1c2luZyB0aGUgbWluaW11bSBvZiB0aGUgZGlzdGFuY2VcbiAgLy8gZnVuY3Rpb24gYmV0d2VlbiB0aGUgZ2l2ZW4gcG9pbnQgYW5kIHRoZSBjdXJ2ZVxuXG4gIC8vIFRoaXMgZ2l2ZXMgdGhlIGNvZWZmaWNpZW50cyBvZiB0aGUgcmVzdWx0aW5nIGN1YmljIGVxdWF0aW9uXG4gIC8vIHdob3NlIHJvb3RzIHRlbGwgdXMgd2hlcmUgYSBwb3NzaWJsZSBtaW5pbXVtIGlzXG4gIC8vIChDb2VmZmljaWVudHMgYXJlIGRpdmlkZWQgYnkgNClcblxuICB2YXIgYSA9IDEuMCAqIHgxICogeDEgLSA0ICogeDEgKiB4MiArIDIgKiB4MSAqIHgzICsgNCAqIHgyICogeDIgLSA0ICogeDIgKiB4MyArIHgzICogeDMgKyB5MSAqIHkxIC0gNCAqIHkxICogeTIgKyAyICogeTEgKiB5MyArIDQgKiB5MiAqIHkyIC0gNCAqIHkyICogeTMgKyB5MyAqIHkzO1xuICB2YXIgYiA9IDEuMCAqIDkgKiB4MSAqIHgyIC0gMyAqIHgxICogeDEgLSAzICogeDEgKiB4MyAtIDYgKiB4MiAqIHgyICsgMyAqIHgyICogeDMgKyA5ICogeTEgKiB5MiAtIDMgKiB5MSAqIHkxIC0gMyAqIHkxICogeTMgLSA2ICogeTIgKiB5MiArIDMgKiB5MiAqIHkzO1xuICB2YXIgYyA9IDEuMCAqIDMgKiB4MSAqIHgxIC0gNiAqIHgxICogeDIgKyB4MSAqIHgzIC0geDEgKiB4ICsgMiAqIHgyICogeDIgKyAyICogeDIgKiB4IC0geDMgKiB4ICsgMyAqIHkxICogeTEgLSA2ICogeTEgKiB5MiArIHkxICogeTMgLSB5MSAqIHkgKyAyICogeTIgKiB5MiArIDIgKiB5MiAqIHkgLSB5MyAqIHk7XG4gIHZhciBkID0gMS4wICogeDEgKiB4MiAtIHgxICogeDEgKyB4MSAqIHggLSB4MiAqIHggKyB5MSAqIHkyIC0geTEgKiB5MSArIHkxICogeSAtIHkyICogeTtcblxuICAvLyBkZWJ1ZyhcImNvZWZmaWNpZW50czogXCIgKyBhIC8gYSArIFwiLCBcIiArIGIgLyBhICsgXCIsIFwiICsgYyAvIGEgKyBcIiwgXCIgKyBkIC8gYSk7XG5cbiAgdmFyIHJvb3RzID0gW107XG5cbiAgLy8gVXNlIHRoZSBjdWJpYyBzb2x2aW5nIGFsZ29yaXRobVxuICBzb2x2ZUN1YmljKGEsIGIsIGMsIGQsIHJvb3RzKTtcbiAgdmFyIHplcm9UaHJlc2hvbGQgPSAwLjAwMDAwMDE7XG4gIHZhciBwYXJhbXMgPSBbXTtcbiAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IDY7IGluZGV4ICs9IDIpIHtcbiAgICBpZiAoTWF0aC5hYnMocm9vdHNbaW5kZXggKyAxXSkgPCB6ZXJvVGhyZXNob2xkICYmIHJvb3RzW2luZGV4XSA+PSAwICYmIHJvb3RzW2luZGV4XSA8PSAxLjApIHtcbiAgICAgIHBhcmFtcy5wdXNoKHJvb3RzW2luZGV4XSk7XG4gICAgfVxuICB9XG4gIHBhcmFtcy5wdXNoKDEuMCk7XG4gIHBhcmFtcy5wdXNoKDAuMCk7XG4gIHZhciBtaW5EaXN0YW5jZVNxdWFyZWQgPSAtMTtcbiAgdmFyIGN1clgsIGN1clksIGRpc3RTcXVhcmVkO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykge1xuICAgIGN1clggPSBNYXRoLnBvdygxLjAgLSBwYXJhbXNbaV0sIDIuMCkgKiB4MSArIDIuMCAqICgxIC0gcGFyYW1zW2ldKSAqIHBhcmFtc1tpXSAqIHgyICsgcGFyYW1zW2ldICogcGFyYW1zW2ldICogeDM7XG4gICAgY3VyWSA9IE1hdGgucG93KDEgLSBwYXJhbXNbaV0sIDIuMCkgKiB5MSArIDIgKiAoMS4wIC0gcGFyYW1zW2ldKSAqIHBhcmFtc1tpXSAqIHkyICsgcGFyYW1zW2ldICogcGFyYW1zW2ldICogeTM7XG4gICAgZGlzdFNxdWFyZWQgPSBNYXRoLnBvdyhjdXJYIC0geCwgMikgKyBNYXRoLnBvdyhjdXJZIC0geSwgMik7XG4gICAgLy8gZGVidWcoJ2Rpc3RhbmNlIGZvciBwYXJhbSAnICsgcGFyYW1zW2ldICsgXCI6IFwiICsgTWF0aC5zcXJ0KGRpc3RTcXVhcmVkKSk7XG4gICAgaWYgKG1pbkRpc3RhbmNlU3F1YXJlZCA+PSAwKSB7XG4gICAgICBpZiAoZGlzdFNxdWFyZWQgPCBtaW5EaXN0YW5jZVNxdWFyZWQpIHtcbiAgICAgICAgbWluRGlzdGFuY2VTcXVhcmVkID0gZGlzdFNxdWFyZWQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG1pbkRpc3RhbmNlU3F1YXJlZCA9IGRpc3RTcXVhcmVkO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbWluRGlzdGFuY2VTcXVhcmVkO1xufTtcbnZhciBzcWRpc3RUb0Zpbml0ZUxpbmUgPSBmdW5jdGlvbiBzcWRpc3RUb0Zpbml0ZUxpbmUoeCwgeSwgeDEsIHkxLCB4MiwgeTIpIHtcbiAgdmFyIG9mZnNldCA9IFt4IC0geDEsIHkgLSB5MV07XG4gIHZhciBsaW5lID0gW3gyIC0geDEsIHkyIC0geTFdO1xuICB2YXIgbGluZVNxID0gbGluZVswXSAqIGxpbmVbMF0gKyBsaW5lWzFdICogbGluZVsxXTtcbiAgdmFyIGh5cFNxID0gb2Zmc2V0WzBdICogb2Zmc2V0WzBdICsgb2Zmc2V0WzFdICogb2Zmc2V0WzFdO1xuICB2YXIgZG90UHJvZHVjdCA9IG9mZnNldFswXSAqIGxpbmVbMF0gKyBvZmZzZXRbMV0gKiBsaW5lWzFdO1xuICB2YXIgYWRqU3EgPSBkb3RQcm9kdWN0ICogZG90UHJvZHVjdCAvIGxpbmVTcTtcbiAgaWYgKGRvdFByb2R1Y3QgPCAwKSB7XG4gICAgcmV0dXJuIGh5cFNxO1xuICB9XG4gIGlmIChhZGpTcSA+IGxpbmVTcSkge1xuICAgIHJldHVybiAoeCAtIHgyKSAqICh4IC0geDIpICsgKHkgLSB5MikgKiAoeSAtIHkyKTtcbiAgfVxuICByZXR1cm4gaHlwU3EgLSBhZGpTcTtcbn07XG52YXIgcG9pbnRJbnNpZGVQb2x5Z29uUG9pbnRzID0gZnVuY3Rpb24gcG9pbnRJbnNpZGVQb2x5Z29uUG9pbnRzKHgsIHksIHBvaW50cykge1xuICB2YXIgeDEsIHkxLCB4MiwgeTI7XG4gIHZhciB5MztcblxuICAvLyBJbnRlcnNlY3Qgd2l0aCB2ZXJ0aWNhbCBsaW5lIHRocm91Z2ggKHgsIHkpXG4gIHZhciB1cCA9IDA7XG4gIC8vIGxldCBkb3duID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoIC8gMjsgaSsrKSB7XG4gICAgeDEgPSBwb2ludHNbaSAqIDJdO1xuICAgIHkxID0gcG9pbnRzW2kgKiAyICsgMV07XG4gICAgaWYgKGkgKyAxIDwgcG9pbnRzLmxlbmd0aCAvIDIpIHtcbiAgICAgIHgyID0gcG9pbnRzWyhpICsgMSkgKiAyXTtcbiAgICAgIHkyID0gcG9pbnRzWyhpICsgMSkgKiAyICsgMV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHgyID0gcG9pbnRzWyhpICsgMSAtIHBvaW50cy5sZW5ndGggLyAyKSAqIDJdO1xuICAgICAgeTIgPSBwb2ludHNbKGkgKyAxIC0gcG9pbnRzLmxlbmd0aCAvIDIpICogMiArIDFdO1xuICAgIH1cbiAgICBpZiAoeDEgPT0geCAmJiB4MiA9PSB4KSA7IGVsc2UgaWYgKHgxID49IHggJiYgeCA+PSB4MiB8fCB4MSA8PSB4ICYmIHggPD0geDIpIHtcbiAgICAgIHkzID0gKHggLSB4MSkgLyAoeDIgLSB4MSkgKiAoeTIgLSB5MSkgKyB5MTtcbiAgICAgIGlmICh5MyA+IHkpIHtcbiAgICAgICAgdXArKztcbiAgICAgIH1cblxuICAgICAgLy8gaWYoIHkzIDwgeSApe1xuICAgICAgLy8gZG93bisrO1xuICAgICAgLy8gfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gIH1cbiAgaWYgKHVwICUgMiA9PT0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcbnZhciBwb2ludEluc2lkZVBvbHlnb24gPSBmdW5jdGlvbiBwb2ludEluc2lkZVBvbHlnb24oeCwgeSwgYmFzZVBvaW50cywgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgZGlyZWN0aW9uLCBwYWRkaW5nKSB7XG4gIHZhciB0cmFuc2Zvcm1lZFBvaW50cyA9IG5ldyBBcnJheShiYXNlUG9pbnRzLmxlbmd0aCk7XG5cbiAgLy8gR2l2ZXMgbmVnYXRpdmUgYW5nbGVcbiAgdmFyIGFuZ2xlO1xuICBpZiAoZGlyZWN0aW9uWzBdICE9IG51bGwpIHtcbiAgICBhbmdsZSA9IE1hdGguYXRhbihkaXJlY3Rpb25bMV0gLyBkaXJlY3Rpb25bMF0pO1xuICAgIGlmIChkaXJlY3Rpb25bMF0gPCAwKSB7XG4gICAgICBhbmdsZSA9IGFuZ2xlICsgTWF0aC5QSSAvIDI7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFuZ2xlID0gLWFuZ2xlIC0gTWF0aC5QSSAvIDI7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGFuZ2xlID0gZGlyZWN0aW9uO1xuICB9XG4gIHZhciBjb3MgPSBNYXRoLmNvcygtYW5nbGUpO1xuICB2YXIgc2luID0gTWF0aC5zaW4oLWFuZ2xlKTtcblxuICAvLyAgICBjb25zb2xlLmxvZyhcImJhc2U6IFwiICsgYmFzZVBvaW50cyk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdHJhbnNmb3JtZWRQb2ludHMubGVuZ3RoIC8gMjsgaSsrKSB7XG4gICAgdHJhbnNmb3JtZWRQb2ludHNbaSAqIDJdID0gd2lkdGggLyAyICogKGJhc2VQb2ludHNbaSAqIDJdICogY29zIC0gYmFzZVBvaW50c1tpICogMiArIDFdICogc2luKTtcbiAgICB0cmFuc2Zvcm1lZFBvaW50c1tpICogMiArIDFdID0gaGVpZ2h0IC8gMiAqIChiYXNlUG9pbnRzW2kgKiAyICsgMV0gKiBjb3MgKyBiYXNlUG9pbnRzW2kgKiAyXSAqIHNpbik7XG4gICAgdHJhbnNmb3JtZWRQb2ludHNbaSAqIDJdICs9IGNlbnRlclg7XG4gICAgdHJhbnNmb3JtZWRQb2ludHNbaSAqIDIgKyAxXSArPSBjZW50ZXJZO1xuICB9XG4gIHZhciBwb2ludHM7XG4gIGlmIChwYWRkaW5nID4gMCkge1xuICAgIHZhciBleHBhbmRlZExpbmVTZXQgPSBleHBhbmRQb2x5Z29uKHRyYW5zZm9ybWVkUG9pbnRzLCAtcGFkZGluZyk7XG4gICAgcG9pbnRzID0gam9pbkxpbmVzKGV4cGFuZGVkTGluZVNldCk7XG4gIH0gZWxzZSB7XG4gICAgcG9pbnRzID0gdHJhbnNmb3JtZWRQb2ludHM7XG4gIH1cbiAgcmV0dXJuIHBvaW50SW5zaWRlUG9seWdvblBvaW50cyh4LCB5LCBwb2ludHMpO1xufTtcbnZhciBwb2ludEluc2lkZVJvdW5kUG9seWdvbiA9IGZ1bmN0aW9uIHBvaW50SW5zaWRlUm91bmRQb2x5Z29uKHgsIHksIGJhc2VQb2ludHMsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIGNvcm5lcnMpIHtcbiAgdmFyIGN1dFBvbHlnb25Qb2ludHMgPSBuZXcgQXJyYXkoYmFzZVBvaW50cy5sZW5ndGggKiAyKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3JuZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGNvcm5lciA9IGNvcm5lcnNbaV07XG4gICAgY3V0UG9seWdvblBvaW50c1tpICogNCArIDBdID0gY29ybmVyLnN0YXJ0WDtcbiAgICBjdXRQb2x5Z29uUG9pbnRzW2kgKiA0ICsgMV0gPSBjb3JuZXIuc3RhcnRZO1xuICAgIGN1dFBvbHlnb25Qb2ludHNbaSAqIDQgKyAyXSA9IGNvcm5lci5zdG9wWDtcbiAgICBjdXRQb2x5Z29uUG9pbnRzW2kgKiA0ICsgM10gPSBjb3JuZXIuc3RvcFk7XG4gICAgdmFyIHNxdWFyZWREaXN0YW5jZSA9IE1hdGgucG93KGNvcm5lci5jeCAtIHgsIDIpICsgTWF0aC5wb3coY29ybmVyLmN5IC0geSwgMik7XG4gICAgaWYgKHNxdWFyZWREaXN0YW5jZSA8PSBNYXRoLnBvdyhjb3JuZXIucmFkaXVzLCAyKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBwb2ludEluc2lkZVBvbHlnb25Qb2ludHMoeCwgeSwgY3V0UG9seWdvblBvaW50cyk7XG59O1xudmFyIGpvaW5MaW5lcyA9IGZ1bmN0aW9uIGpvaW5MaW5lcyhsaW5lU2V0KSB7XG4gIHZhciB2ZXJ0aWNlcyA9IG5ldyBBcnJheShsaW5lU2V0Lmxlbmd0aCAvIDIpO1xuICB2YXIgY3VycmVudExpbmVTdGFydFgsIGN1cnJlbnRMaW5lU3RhcnRZLCBjdXJyZW50TGluZUVuZFgsIGN1cnJlbnRMaW5lRW5kWTtcbiAgdmFyIG5leHRMaW5lU3RhcnRYLCBuZXh0TGluZVN0YXJ0WSwgbmV4dExpbmVFbmRYLCBuZXh0TGluZUVuZFk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZVNldC5sZW5ndGggLyA0OyBpKyspIHtcbiAgICBjdXJyZW50TGluZVN0YXJ0WCA9IGxpbmVTZXRbaSAqIDRdO1xuICAgIGN1cnJlbnRMaW5lU3RhcnRZID0gbGluZVNldFtpICogNCArIDFdO1xuICAgIGN1cnJlbnRMaW5lRW5kWCA9IGxpbmVTZXRbaSAqIDQgKyAyXTtcbiAgICBjdXJyZW50TGluZUVuZFkgPSBsaW5lU2V0W2kgKiA0ICsgM107XG4gICAgaWYgKGkgPCBsaW5lU2V0Lmxlbmd0aCAvIDQgLSAxKSB7XG4gICAgICBuZXh0TGluZVN0YXJ0WCA9IGxpbmVTZXRbKGkgKyAxKSAqIDRdO1xuICAgICAgbmV4dExpbmVTdGFydFkgPSBsaW5lU2V0WyhpICsgMSkgKiA0ICsgMV07XG4gICAgICBuZXh0TGluZUVuZFggPSBsaW5lU2V0WyhpICsgMSkgKiA0ICsgMl07XG4gICAgICBuZXh0TGluZUVuZFkgPSBsaW5lU2V0WyhpICsgMSkgKiA0ICsgM107XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHRMaW5lU3RhcnRYID0gbGluZVNldFswXTtcbiAgICAgIG5leHRMaW5lU3RhcnRZID0gbGluZVNldFsxXTtcbiAgICAgIG5leHRMaW5lRW5kWCA9IGxpbmVTZXRbMl07XG4gICAgICBuZXh0TGluZUVuZFkgPSBsaW5lU2V0WzNdO1xuICAgIH1cbiAgICB2YXIgaW50ZXJzZWN0aW9uID0gZmluaXRlTGluZXNJbnRlcnNlY3QoY3VycmVudExpbmVTdGFydFgsIGN1cnJlbnRMaW5lU3RhcnRZLCBjdXJyZW50TGluZUVuZFgsIGN1cnJlbnRMaW5lRW5kWSwgbmV4dExpbmVTdGFydFgsIG5leHRMaW5lU3RhcnRZLCBuZXh0TGluZUVuZFgsIG5leHRMaW5lRW5kWSwgdHJ1ZSk7XG4gICAgdmVydGljZXNbaSAqIDJdID0gaW50ZXJzZWN0aW9uWzBdO1xuICAgIHZlcnRpY2VzW2kgKiAyICsgMV0gPSBpbnRlcnNlY3Rpb25bMV07XG4gIH1cbiAgcmV0dXJuIHZlcnRpY2VzO1xufTtcbnZhciBleHBhbmRQb2x5Z29uID0gZnVuY3Rpb24gZXhwYW5kUG9seWdvbihwb2ludHMsIHBhZCkge1xuICB2YXIgZXhwYW5kZWRMaW5lU2V0ID0gbmV3IEFycmF5KHBvaW50cy5sZW5ndGggKiAyKTtcbiAgdmFyIGN1cnJlbnRQb2ludFgsIGN1cnJlbnRQb2ludFksIG5leHRQb2ludFgsIG5leHRQb2ludFk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aCAvIDI7IGkrKykge1xuICAgIGN1cnJlbnRQb2ludFggPSBwb2ludHNbaSAqIDJdO1xuICAgIGN1cnJlbnRQb2ludFkgPSBwb2ludHNbaSAqIDIgKyAxXTtcbiAgICBpZiAoaSA8IHBvaW50cy5sZW5ndGggLyAyIC0gMSkge1xuICAgICAgbmV4dFBvaW50WCA9IHBvaW50c1soaSArIDEpICogMl07XG4gICAgICBuZXh0UG9pbnRZID0gcG9pbnRzWyhpICsgMSkgKiAyICsgMV07XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHRQb2ludFggPSBwb2ludHNbMF07XG4gICAgICBuZXh0UG9pbnRZID0gcG9pbnRzWzFdO1xuICAgIH1cblxuICAgIC8vIEN1cnJlbnQgbGluZTogW2N1cnJlbnRQb2ludFgsIGN1cnJlbnRQb2ludFldIHRvIFtuZXh0UG9pbnRYLCBuZXh0UG9pbnRZXVxuXG4gICAgLy8gQXNzdW1lIENDVyBwb2x5Z29uIHdpbmRpbmdcblxuICAgIHZhciBvZmZzZXRYID0gbmV4dFBvaW50WSAtIGN1cnJlbnRQb2ludFk7XG4gICAgdmFyIG9mZnNldFkgPSAtKG5leHRQb2ludFggLSBjdXJyZW50UG9pbnRYKTtcblxuICAgIC8vIE5vcm1hbGl6ZVxuICAgIHZhciBvZmZzZXRMZW5ndGggPSBNYXRoLnNxcnQob2Zmc2V0WCAqIG9mZnNldFggKyBvZmZzZXRZICogb2Zmc2V0WSk7XG4gICAgdmFyIG5vcm1hbGl6ZWRPZmZzZXRYID0gb2Zmc2V0WCAvIG9mZnNldExlbmd0aDtcbiAgICB2YXIgbm9ybWFsaXplZE9mZnNldFkgPSBvZmZzZXRZIC8gb2Zmc2V0TGVuZ3RoO1xuICAgIGV4cGFuZGVkTGluZVNldFtpICogNF0gPSBjdXJyZW50UG9pbnRYICsgbm9ybWFsaXplZE9mZnNldFggKiBwYWQ7XG4gICAgZXhwYW5kZWRMaW5lU2V0W2kgKiA0ICsgMV0gPSBjdXJyZW50UG9pbnRZICsgbm9ybWFsaXplZE9mZnNldFkgKiBwYWQ7XG4gICAgZXhwYW5kZWRMaW5lU2V0W2kgKiA0ICsgMl0gPSBuZXh0UG9pbnRYICsgbm9ybWFsaXplZE9mZnNldFggKiBwYWQ7XG4gICAgZXhwYW5kZWRMaW5lU2V0W2kgKiA0ICsgM10gPSBuZXh0UG9pbnRZICsgbm9ybWFsaXplZE9mZnNldFkgKiBwYWQ7XG4gIH1cbiAgcmV0dXJuIGV4cGFuZGVkTGluZVNldDtcbn07XG52YXIgaW50ZXJzZWN0TGluZUVsbGlwc2UgPSBmdW5jdGlvbiBpbnRlcnNlY3RMaW5lRWxsaXBzZSh4LCB5LCBjZW50ZXJYLCBjZW50ZXJZLCBlbGxpcHNlV3JhZGl1cywgZWxsaXBzZUhyYWRpdXMpIHtcbiAgdmFyIGRpc3BYID0gY2VudGVyWCAtIHg7XG4gIHZhciBkaXNwWSA9IGNlbnRlclkgLSB5O1xuICBkaXNwWCAvPSBlbGxpcHNlV3JhZGl1cztcbiAgZGlzcFkgLz0gZWxsaXBzZUhyYWRpdXM7XG4gIHZhciBsZW4gPSBNYXRoLnNxcnQoZGlzcFggKiBkaXNwWCArIGRpc3BZICogZGlzcFkpO1xuICB2YXIgbmV3TGVuZ3RoID0gbGVuIC0gMTtcbiAgaWYgKG5ld0xlbmd0aCA8IDApIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgdmFyIGxlblByb3BvcnRpb24gPSBuZXdMZW5ndGggLyBsZW47XG4gIHJldHVybiBbKGNlbnRlclggLSB4KSAqIGxlblByb3BvcnRpb24gKyB4LCAoY2VudGVyWSAtIHkpICogbGVuUHJvcG9ydGlvbiArIHldO1xufTtcbnZhciBjaGVja0luRWxsaXBzZSA9IGZ1bmN0aW9uIGNoZWNrSW5FbGxpcHNlKHgsIHksIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclksIHBhZGRpbmcpIHtcbiAgeCAtPSBjZW50ZXJYO1xuICB5IC09IGNlbnRlclk7XG4gIHggLz0gd2lkdGggLyAyICsgcGFkZGluZztcbiAgeSAvPSBoZWlnaHQgLyAyICsgcGFkZGluZztcbiAgcmV0dXJuIHggKiB4ICsgeSAqIHkgPD0gMTtcbn07XG5cbi8vIFJldHVybnMgaW50ZXJzZWN0aW9ucyBvZiBpbmNyZWFzaW5nIGRpc3RhbmNlIGZyb20gbGluZSdzIHN0YXJ0IHBvaW50XG52YXIgaW50ZXJzZWN0TGluZUNpcmNsZSA9IGZ1bmN0aW9uIGludGVyc2VjdExpbmVDaXJjbGUoeDEsIHkxLCB4MiwgeTIsIGNlbnRlclgsIGNlbnRlclksIHJhZGl1cykge1xuICAvLyBDYWxjdWxhdGUgZCwgZGlyZWN0aW9uIHZlY3RvciBvZiBsaW5lXG4gIHZhciBkID0gW3gyIC0geDEsIHkyIC0geTFdOyAvLyBEaXJlY3Rpb24gdmVjdG9yIG9mIGxpbmVcbiAgdmFyIGYgPSBbeDEgLSBjZW50ZXJYLCB5MSAtIGNlbnRlclldO1xuICB2YXIgYSA9IGRbMF0gKiBkWzBdICsgZFsxXSAqIGRbMV07XG4gIHZhciBiID0gMiAqIChmWzBdICogZFswXSArIGZbMV0gKiBkWzFdKTtcbiAgdmFyIGMgPSBmWzBdICogZlswXSArIGZbMV0gKiBmWzFdIC0gcmFkaXVzICogcmFkaXVzO1xuICB2YXIgZGlzY3JpbWluYW50ID0gYiAqIGIgLSA0ICogYSAqIGM7XG4gIGlmIChkaXNjcmltaW5hbnQgPCAwKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHZhciB0MSA9ICgtYiArIE1hdGguc3FydChkaXNjcmltaW5hbnQpKSAvICgyICogYSk7XG4gIHZhciB0MiA9ICgtYiAtIE1hdGguc3FydChkaXNjcmltaW5hbnQpKSAvICgyICogYSk7XG4gIHZhciB0TWluID0gTWF0aC5taW4odDEsIHQyKTtcbiAgdmFyIHRNYXggPSBNYXRoLm1heCh0MSwgdDIpO1xuICB2YXIgaW5SYW5nZVBhcmFtcyA9IFtdO1xuICBpZiAodE1pbiA+PSAwICYmIHRNaW4gPD0gMSkge1xuICAgIGluUmFuZ2VQYXJhbXMucHVzaCh0TWluKTtcbiAgfVxuICBpZiAodE1heCA+PSAwICYmIHRNYXggPD0gMSkge1xuICAgIGluUmFuZ2VQYXJhbXMucHVzaCh0TWF4KTtcbiAgfVxuICBpZiAoaW5SYW5nZVBhcmFtcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgdmFyIG5lYXJJbnRlcnNlY3Rpb25YID0gaW5SYW5nZVBhcmFtc1swXSAqIGRbMF0gKyB4MTtcbiAgdmFyIG5lYXJJbnRlcnNlY3Rpb25ZID0gaW5SYW5nZVBhcmFtc1swXSAqIGRbMV0gKyB5MTtcbiAgaWYgKGluUmFuZ2VQYXJhbXMubGVuZ3RoID4gMSkge1xuICAgIGlmIChpblJhbmdlUGFyYW1zWzBdID09IGluUmFuZ2VQYXJhbXNbMV0pIHtcbiAgICAgIHJldHVybiBbbmVhckludGVyc2VjdGlvblgsIG5lYXJJbnRlcnNlY3Rpb25ZXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGZhckludGVyc2VjdGlvblggPSBpblJhbmdlUGFyYW1zWzFdICogZFswXSArIHgxO1xuICAgICAgdmFyIGZhckludGVyc2VjdGlvblkgPSBpblJhbmdlUGFyYW1zWzFdICogZFsxXSArIHkxO1xuICAgICAgcmV0dXJuIFtuZWFySW50ZXJzZWN0aW9uWCwgbmVhckludGVyc2VjdGlvblksIGZhckludGVyc2VjdGlvblgsIGZhckludGVyc2VjdGlvblldO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gW25lYXJJbnRlcnNlY3Rpb25YLCBuZWFySW50ZXJzZWN0aW9uWV07XG4gIH1cbn07XG52YXIgbWlkT2ZUaHJlZSA9IGZ1bmN0aW9uIG1pZE9mVGhyZWUoYSwgYiwgYykge1xuICBpZiAoYiA8PSBhICYmIGEgPD0gYyB8fCBjIDw9IGEgJiYgYSA8PSBiKSB7XG4gICAgcmV0dXJuIGE7XG4gIH0gZWxzZSBpZiAoYSA8PSBiICYmIGIgPD0gYyB8fCBjIDw9IGIgJiYgYiA8PSBhKSB7XG4gICAgcmV0dXJuIGI7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGM7XG4gIH1cbn07XG5cbi8vICh4MSx5MSk9Pih4Mix5MikgaW50ZXJzZWN0IHdpdGggKHgzLHkzKT0+KHg0LHk0KVxudmFyIGZpbml0ZUxpbmVzSW50ZXJzZWN0ID0gZnVuY3Rpb24gZmluaXRlTGluZXNJbnRlcnNlY3QoeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgeDQsIHk0LCBpbmZpbml0ZUxpbmVzKSB7XG4gIHZhciBkeDEzID0geDEgLSB4MztcbiAgdmFyIGR4MjEgPSB4MiAtIHgxO1xuICB2YXIgZHg0MyA9IHg0IC0geDM7XG4gIHZhciBkeTEzID0geTEgLSB5MztcbiAgdmFyIGR5MjEgPSB5MiAtIHkxO1xuICB2YXIgZHk0MyA9IHk0IC0geTM7XG4gIHZhciB1YV90ID0gZHg0MyAqIGR5MTMgLSBkeTQzICogZHgxMztcbiAgdmFyIHViX3QgPSBkeDIxICogZHkxMyAtIGR5MjEgKiBkeDEzO1xuICB2YXIgdV9iID0gZHk0MyAqIGR4MjEgLSBkeDQzICogZHkyMTtcbiAgaWYgKHVfYiAhPT0gMCkge1xuICAgIHZhciB1YSA9IHVhX3QgLyB1X2I7XG4gICAgdmFyIHViID0gdWJfdCAvIHVfYjtcbiAgICB2YXIgZmxwdFRocmVzaG9sZCA9IDAuMDAxO1xuICAgIHZhciBfbWluID0gMCAtIGZscHRUaHJlc2hvbGQ7XG4gICAgdmFyIF9tYXggPSAxICsgZmxwdFRocmVzaG9sZDtcbiAgICBpZiAoX21pbiA8PSB1YSAmJiB1YSA8PSBfbWF4ICYmIF9taW4gPD0gdWIgJiYgdWIgPD0gX21heCkge1xuICAgICAgcmV0dXJuIFt4MSArIHVhICogZHgyMSwgeTEgKyB1YSAqIGR5MjFdO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWluZmluaXRlTGluZXMpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFt4MSArIHVhICogZHgyMSwgeTEgKyB1YSAqIGR5MjFdO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAodWFfdCA9PT0gMCB8fCB1Yl90ID09PSAwKSB7XG4gICAgICAvLyBQYXJhbGxlbCwgY29pbmNpZGVudCBsaW5lcy4gQ2hlY2sgaWYgb3ZlcmxhcFxuXG4gICAgICAvLyBDaGVjayBlbmRwb2ludCBvZiBzZWNvbmQgbGluZVxuICAgICAgaWYgKG1pZE9mVGhyZWUoeDEsIHgyLCB4NCkgPT09IHg0KSB7XG4gICAgICAgIHJldHVybiBbeDQsIHk0XTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgc3RhcnQgcG9pbnQgb2Ygc2Vjb25kIGxpbmVcbiAgICAgIGlmIChtaWRPZlRocmVlKHgxLCB4MiwgeDMpID09PSB4Mykge1xuICAgICAgICByZXR1cm4gW3gzLCB5M107XG4gICAgICB9XG5cbiAgICAgIC8vIEVuZHBvaW50IG9mIGZpcnN0IGxpbmVcbiAgICAgIGlmIChtaWRPZlRocmVlKHgzLCB4NCwgeDIpID09PSB4Mikge1xuICAgICAgICByZXR1cm4gW3gyLCB5Ml07XG4gICAgICB9XG4gICAgICByZXR1cm4gW107XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFBhcmFsbGVsLCBub24tY29pbmNpZGVudFxuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxufTtcbnZhciB0cmFuc2Zvcm1Qb2ludHMgPSBmdW5jdGlvbiB0cmFuc2Zvcm1Qb2ludHMocG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0KSB7XG4gIHZhciByZXQgPSBbXTtcbiAgdmFyIGhhbGZXID0gd2lkdGggLyAyO1xuICB2YXIgaGFsZkggPSBoZWlnaHQgLyAyO1xuICB2YXIgeCA9IGNlbnRlclg7XG4gIHZhciB5ID0gY2VudGVyWTtcbiAgcmV0LnB1c2goe1xuICAgIHg6IHggKyBoYWxmVyAqIHBvaW50c1swXSxcbiAgICB5OiB5ICsgaGFsZkggKiBwb2ludHNbMV1cbiAgfSk7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgcG9pbnRzLmxlbmd0aCAvIDI7IGkrKykge1xuICAgIHJldC5wdXNoKHtcbiAgICAgIHg6IHggKyBoYWxmVyAqIHBvaW50c1tpICogMl0sXG4gICAgICB5OiB5ICsgaGFsZkggKiBwb2ludHNbaSAqIDIgKyAxXVxuICAgIH0pO1xuICB9XG4gIHJldHVybiByZXQ7XG59O1xuXG4vLyBtYXRoLnBvbHlnb25JbnRlcnNlY3RMaW5lKCB4LCB5LCBiYXNlUG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBwYWRkaW5nIClcbi8vIGludGVyc2VjdCBhIG5vZGUgcG9seWdvbiAocHRzIHRyYW5zZm9ybWVkKVxuLy9cbi8vIG1hdGgucG9seWdvbkludGVyc2VjdExpbmUoIHgsIHksIGJhc2VQb2ludHMsIGNlbnRlclgsIGNlbnRlclkgKVxuLy8gaW50ZXJzZWN0IHRoZSBwb2ludHMgKG5vIHRyYW5zZm9ybSlcbnZhciBwb2x5Z29uSW50ZXJzZWN0TGluZSA9IGZ1bmN0aW9uIHBvbHlnb25JbnRlcnNlY3RMaW5lKHgsIHksIGJhc2VQb2ludHMsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHBhZGRpbmcpIHtcbiAgdmFyIGludGVyc2VjdGlvbnMgPSBbXTtcbiAgdmFyIGludGVyc2VjdGlvbjtcbiAgdmFyIHRyYW5zZm9ybWVkUG9pbnRzID0gbmV3IEFycmF5KGJhc2VQb2ludHMubGVuZ3RoKTtcbiAgdmFyIGRvVHJhbnNmb3JtID0gdHJ1ZTtcbiAgaWYgKHdpZHRoID09IG51bGwpIHtcbiAgICBkb1RyYW5zZm9ybSA9IGZhbHNlO1xuICB9XG4gIHZhciBwb2ludHM7XG4gIGlmIChkb1RyYW5zZm9ybSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHJhbnNmb3JtZWRQb2ludHMubGVuZ3RoIC8gMjsgaSsrKSB7XG4gICAgICB0cmFuc2Zvcm1lZFBvaW50c1tpICogMl0gPSBiYXNlUG9pbnRzW2kgKiAyXSAqIHdpZHRoICsgY2VudGVyWDtcbiAgICAgIHRyYW5zZm9ybWVkUG9pbnRzW2kgKiAyICsgMV0gPSBiYXNlUG9pbnRzW2kgKiAyICsgMV0gKiBoZWlnaHQgKyBjZW50ZXJZO1xuICAgIH1cbiAgICBpZiAocGFkZGluZyA+IDApIHtcbiAgICAgIHZhciBleHBhbmRlZExpbmVTZXQgPSBleHBhbmRQb2x5Z29uKHRyYW5zZm9ybWVkUG9pbnRzLCAtcGFkZGluZyk7XG4gICAgICBwb2ludHMgPSBqb2luTGluZXMoZXhwYW5kZWRMaW5lU2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcG9pbnRzID0gdHJhbnNmb3JtZWRQb2ludHM7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHBvaW50cyA9IGJhc2VQb2ludHM7XG4gIH1cbiAgdmFyIGN1cnJlbnRYLCBjdXJyZW50WSwgbmV4dFgsIG5leHRZO1xuICBmb3IgKHZhciBfaTMgPSAwOyBfaTMgPCBwb2ludHMubGVuZ3RoIC8gMjsgX2kzKyspIHtcbiAgICBjdXJyZW50WCA9IHBvaW50c1tfaTMgKiAyXTtcbiAgICBjdXJyZW50WSA9IHBvaW50c1tfaTMgKiAyICsgMV07XG4gICAgaWYgKF9pMyA8IHBvaW50cy5sZW5ndGggLyAyIC0gMSkge1xuICAgICAgbmV4dFggPSBwb2ludHNbKF9pMyArIDEpICogMl07XG4gICAgICBuZXh0WSA9IHBvaW50c1soX2kzICsgMSkgKiAyICsgMV07XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHRYID0gcG9pbnRzWzBdO1xuICAgICAgbmV4dFkgPSBwb2ludHNbMV07XG4gICAgfVxuICAgIGludGVyc2VjdGlvbiA9IGZpbml0ZUxpbmVzSW50ZXJzZWN0KHgsIHksIGNlbnRlclgsIGNlbnRlclksIGN1cnJlbnRYLCBjdXJyZW50WSwgbmV4dFgsIG5leHRZKTtcbiAgICBpZiAoaW50ZXJzZWN0aW9uLmxlbmd0aCAhPT0gMCkge1xuICAgICAgaW50ZXJzZWN0aW9ucy5wdXNoKGludGVyc2VjdGlvblswXSwgaW50ZXJzZWN0aW9uWzFdKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGludGVyc2VjdGlvbnM7XG59O1xudmFyIHJvdW5kUG9seWdvbkludGVyc2VjdExpbmUgPSBmdW5jdGlvbiByb3VuZFBvbHlnb25JbnRlcnNlY3RMaW5lKHgsIHksIGJhc2VQb2ludHMsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHBhZGRpbmcsIGNvcm5lcnMpIHtcbiAgdmFyIGludGVyc2VjdGlvbnMgPSBbXTtcbiAgdmFyIGludGVyc2VjdGlvbjtcbiAgdmFyIGxpbmVzID0gbmV3IEFycmF5KGJhc2VQb2ludHMubGVuZ3RoICogMik7XG4gIGNvcm5lcnMuZm9yRWFjaChmdW5jdGlvbiAoY29ybmVyLCBpKSB7XG4gICAgaWYgKGkgPT09IDApIHtcbiAgICAgIGxpbmVzW2xpbmVzLmxlbmd0aCAtIDJdID0gY29ybmVyLnN0YXJ0WDtcbiAgICAgIGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdID0gY29ybmVyLnN0YXJ0WTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGluZXNbaSAqIDQgLSAyXSA9IGNvcm5lci5zdGFydFg7XG4gICAgICBsaW5lc1tpICogNCAtIDFdID0gY29ybmVyLnN0YXJ0WTtcbiAgICB9XG4gICAgbGluZXNbaSAqIDRdID0gY29ybmVyLnN0b3BYO1xuICAgIGxpbmVzW2kgKiA0ICsgMV0gPSBjb3JuZXIuc3RvcFk7XG4gICAgaW50ZXJzZWN0aW9uID0gaW50ZXJzZWN0TGluZUNpcmNsZSh4LCB5LCBjZW50ZXJYLCBjZW50ZXJZLCBjb3JuZXIuY3gsIGNvcm5lci5jeSwgY29ybmVyLnJhZGl1cyk7XG4gICAgaWYgKGludGVyc2VjdGlvbi5sZW5ndGggIT09IDApIHtcbiAgICAgIGludGVyc2VjdGlvbnMucHVzaChpbnRlcnNlY3Rpb25bMF0sIGludGVyc2VjdGlvblsxXSk7XG4gICAgfVxuICB9KTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGggLyA0OyBpKyspIHtcbiAgICBpbnRlcnNlY3Rpb24gPSBmaW5pdGVMaW5lc0ludGVyc2VjdCh4LCB5LCBjZW50ZXJYLCBjZW50ZXJZLCBsaW5lc1tpICogNF0sIGxpbmVzW2kgKiA0ICsgMV0sIGxpbmVzW2kgKiA0ICsgMl0sIGxpbmVzW2kgKiA0ICsgM10sIGZhbHNlKTtcbiAgICBpZiAoaW50ZXJzZWN0aW9uLmxlbmd0aCAhPT0gMCkge1xuICAgICAgaW50ZXJzZWN0aW9ucy5wdXNoKGludGVyc2VjdGlvblswXSwgaW50ZXJzZWN0aW9uWzFdKTtcbiAgICB9XG4gIH1cbiAgaWYgKGludGVyc2VjdGlvbnMubGVuZ3RoID4gMikge1xuICAgIHZhciBsb3dlc3RJbnRlcnNlY3Rpb24gPSBbaW50ZXJzZWN0aW9uc1swXSwgaW50ZXJzZWN0aW9uc1sxXV07XG4gICAgdmFyIGxvd2VzdFNxdWFyZWREaXN0YW5jZSA9IE1hdGgucG93KGxvd2VzdEludGVyc2VjdGlvblswXSAtIHgsIDIpICsgTWF0aC5wb3cobG93ZXN0SW50ZXJzZWN0aW9uWzFdIC0geSwgMik7XG4gICAgZm9yICh2YXIgX2k0ID0gMTsgX2k0IDwgaW50ZXJzZWN0aW9ucy5sZW5ndGggLyAyOyBfaTQrKykge1xuICAgICAgdmFyIHNxdWFyZWREaXN0YW5jZSA9IE1hdGgucG93KGludGVyc2VjdGlvbnNbX2k0ICogMl0gLSB4LCAyKSArIE1hdGgucG93KGludGVyc2VjdGlvbnNbX2k0ICogMiArIDFdIC0geSwgMik7XG4gICAgICBpZiAoc3F1YXJlZERpc3RhbmNlIDw9IGxvd2VzdFNxdWFyZWREaXN0YW5jZSkge1xuICAgICAgICBsb3dlc3RJbnRlcnNlY3Rpb25bMF0gPSBpbnRlcnNlY3Rpb25zW19pNCAqIDJdO1xuICAgICAgICBsb3dlc3RJbnRlcnNlY3Rpb25bMV0gPSBpbnRlcnNlY3Rpb25zW19pNCAqIDIgKyAxXTtcbiAgICAgICAgbG93ZXN0U3F1YXJlZERpc3RhbmNlID0gc3F1YXJlZERpc3RhbmNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbG93ZXN0SW50ZXJzZWN0aW9uO1xuICB9XG4gIHJldHVybiBpbnRlcnNlY3Rpb25zO1xufTtcbnZhciBzaG9ydGVuSW50ZXJzZWN0aW9uID0gZnVuY3Rpb24gc2hvcnRlbkludGVyc2VjdGlvbihpbnRlcnNlY3Rpb24sIG9mZnNldCwgYW1vdW50KSB7XG4gIHZhciBkaXNwID0gW2ludGVyc2VjdGlvblswXSAtIG9mZnNldFswXSwgaW50ZXJzZWN0aW9uWzFdIC0gb2Zmc2V0WzFdXTtcbiAgdmFyIGxlbmd0aCA9IE1hdGguc3FydChkaXNwWzBdICogZGlzcFswXSArIGRpc3BbMV0gKiBkaXNwWzFdKTtcbiAgdmFyIGxlblJhdGlvID0gKGxlbmd0aCAtIGFtb3VudCkgLyBsZW5ndGg7XG4gIGlmIChsZW5SYXRpbyA8IDApIHtcbiAgICBsZW5SYXRpbyA9IDAuMDAwMDE7XG4gIH1cbiAgcmV0dXJuIFtvZmZzZXRbMF0gKyBsZW5SYXRpbyAqIGRpc3BbMF0sIG9mZnNldFsxXSArIGxlblJhdGlvICogZGlzcFsxXV07XG59O1xudmFyIGdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSA9IGZ1bmN0aW9uIGdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZShzaWRlcywgcm90YXRpb25SYWRpYW5zKSB7XG4gIHZhciBwb2ludHMgPSBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzKHNpZGVzLCByb3RhdGlvblJhZGlhbnMpO1xuICBwb2ludHMgPSBmaXRQb2x5Z29uVG9TcXVhcmUocG9pbnRzKTtcbiAgcmV0dXJuIHBvaW50cztcbn07XG52YXIgZml0UG9seWdvblRvU3F1YXJlID0gZnVuY3Rpb24gZml0UG9seWdvblRvU3F1YXJlKHBvaW50cykge1xuICB2YXIgeCwgeTtcbiAgdmFyIHNpZGVzID0gcG9pbnRzLmxlbmd0aCAvIDI7XG4gIHZhciBtaW5YID0gSW5maW5pdHksXG4gICAgbWluWSA9IEluZmluaXR5LFxuICAgIG1heFggPSAtSW5maW5pdHksXG4gICAgbWF4WSA9IC1JbmZpbml0eTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaWRlczsgaSsrKSB7XG4gICAgeCA9IHBvaW50c1syICogaV07XG4gICAgeSA9IHBvaW50c1syICogaSArIDFdO1xuICAgIG1pblggPSBNYXRoLm1pbihtaW5YLCB4KTtcbiAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgeCk7XG4gICAgbWluWSA9IE1hdGgubWluKG1pblksIHkpO1xuICAgIG1heFkgPSBNYXRoLm1heChtYXhZLCB5KTtcbiAgfVxuXG4gIC8vIHN0cmV0Y2ggZmFjdG9yc1xuICB2YXIgc3ggPSAyIC8gKG1heFggLSBtaW5YKTtcbiAgdmFyIHN5ID0gMiAvIChtYXhZIC0gbWluWSk7XG4gIGZvciAodmFyIF9pNSA9IDA7IF9pNSA8IHNpZGVzOyBfaTUrKykge1xuICAgIHggPSBwb2ludHNbMiAqIF9pNV0gPSBwb2ludHNbMiAqIF9pNV0gKiBzeDtcbiAgICB5ID0gcG9pbnRzWzIgKiBfaTUgKyAxXSA9IHBvaW50c1syICogX2k1ICsgMV0gKiBzeTtcbiAgICBtaW5YID0gTWF0aC5taW4obWluWCwgeCk7XG4gICAgbWF4WCA9IE1hdGgubWF4KG1heFgsIHgpO1xuICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCB5KTtcbiAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgeSk7XG4gIH1cbiAgaWYgKG1pblkgPCAtMSkge1xuICAgIGZvciAodmFyIF9pNiA9IDA7IF9pNiA8IHNpZGVzOyBfaTYrKykge1xuICAgICAgeSA9IHBvaW50c1syICogX2k2ICsgMV0gPSBwb2ludHNbMiAqIF9pNiArIDFdICsgKC0xIC0gbWluWSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBwb2ludHM7XG59O1xudmFyIGdlbmVyYXRlVW5pdE5nb25Qb2ludHMgPSBmdW5jdGlvbiBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzKHNpZGVzLCByb3RhdGlvblJhZGlhbnMpIHtcbiAgdmFyIGluY3JlbWVudCA9IDEuMCAvIHNpZGVzICogMiAqIE1hdGguUEk7XG4gIHZhciBzdGFydEFuZ2xlID0gc2lkZXMgJSAyID09PSAwID8gTWF0aC5QSSAvIDIuMCArIGluY3JlbWVudCAvIDIuMCA6IE1hdGguUEkgLyAyLjA7XG4gIHN0YXJ0QW5nbGUgKz0gcm90YXRpb25SYWRpYW5zO1xuICB2YXIgcG9pbnRzID0gbmV3IEFycmF5KHNpZGVzICogMik7XG4gIHZhciBjdXJyZW50QW5nbGU7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc2lkZXM7IGkrKykge1xuICAgIGN1cnJlbnRBbmdsZSA9IGkgKiBpbmNyZW1lbnQgKyBzdGFydEFuZ2xlO1xuICAgIHBvaW50c1syICogaV0gPSBNYXRoLmNvcyhjdXJyZW50QW5nbGUpOyAvLyB4XG4gICAgcG9pbnRzWzIgKiBpICsgMV0gPSBNYXRoLnNpbigtY3VycmVudEFuZ2xlKTsgLy8geVxuICB9XG4gIHJldHVybiBwb2ludHM7XG59O1xuXG4vLyBTZXQgdGhlIGRlZmF1bHQgcmFkaXVzLCB1bmxlc3MgaGFsZiBvZiB3aWR0aCBvciBoZWlnaHQgaXMgc21hbGxlciB0aGFuIGRlZmF1bHRcbnZhciBnZXRSb3VuZFJlY3RhbmdsZVJhZGl1cyA9IGZ1bmN0aW9uIGdldFJvdW5kUmVjdGFuZ2xlUmFkaXVzKHdpZHRoLCBoZWlnaHQpIHtcbiAgcmV0dXJuIE1hdGgubWluKHdpZHRoIC8gNCwgaGVpZ2h0IC8gNCwgOCk7XG59O1xuXG4vLyBTZXQgdGhlIGRlZmF1bHQgcmFkaXVzXG52YXIgZ2V0Um91bmRQb2x5Z29uUmFkaXVzID0gZnVuY3Rpb24gZ2V0Um91bmRQb2x5Z29uUmFkaXVzKHdpZHRoLCBoZWlnaHQpIHtcbiAgcmV0dXJuIE1hdGgubWluKHdpZHRoIC8gMTAsIGhlaWdodCAvIDEwLCA4KTtcbn07XG52YXIgZ2V0Q3V0UmVjdGFuZ2xlQ29ybmVyTGVuZ3RoID0gZnVuY3Rpb24gZ2V0Q3V0UmVjdGFuZ2xlQ29ybmVyTGVuZ3RoKCkge1xuICByZXR1cm4gODtcbn07XG52YXIgYmV6aWVyUHRzVG9RdWFkQ29lZmYgPSBmdW5jdGlvbiBiZXppZXJQdHNUb1F1YWRDb2VmZihwMCwgcDEsIHAyKSB7XG4gIHJldHVybiBbcDAgLSAyICogcDEgKyBwMiwgMiAqIChwMSAtIHAwKSwgcDBdO1xufTtcblxuLy8gZ2V0IGN1cnZlIHdpZHRoLCBoZWlnaHQsIGFuZCBjb250cm9sIHBvaW50IHBvc2l0aW9uIG9mZnNldHMgYXMgYSBwZXJjZW50YWdlIG9mIG5vZGUgaGVpZ2h0IC8gd2lkdGhcbnZhciBnZXRCYXJyZWxDdXJ2ZUNvbnN0YW50cyA9IGZ1bmN0aW9uIGdldEJhcnJlbEN1cnZlQ29uc3RhbnRzKHdpZHRoLCBoZWlnaHQpIHtcbiAgcmV0dXJuIHtcbiAgICBoZWlnaHRPZmZzZXQ6IE1hdGgubWluKDE1LCAwLjA1ICogaGVpZ2h0KSxcbiAgICB3aWR0aE9mZnNldDogTWF0aC5taW4oMTAwLCAwLjI1ICogd2lkdGgpLFxuICAgIGN0cmxQdE9mZnNldFBjdDogMC4wNVxuICB9O1xufTtcblxuLy8gU2VwYXJhdGluZyBBeGlzIFRoZW9yZW0gKFNBVCkgdG8gZGV0ZXJtaW5lIGlmIHR3byBwb2x5Z29ucyBpbnRlcnNlY3QuIFxuLy8gVGhlIGZ1bmN0aW9uIHRha2VzIHR3byBwb2x5Z29ucyBhcyBpbnB1dCBhbmQgcmV0dXJucyBhIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyBcbi8vIHdoZXRoZXIgdGhlIHR3byBwb2x5Z29ucyBpbnRlcnNlY3QuXG5mdW5jdGlvbiBzYXRQb2x5Z29uSW50ZXJzZWN0aW9uKHBvbHkxLCBwb2x5Mikge1xuICBmdW5jdGlvbiBnZXRBeGVzKHBvbHlnb24pIHtcbiAgICB2YXIgYXhlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9seWdvbi5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHAxID0gcG9seWdvbltpXTtcbiAgICAgIHZhciBwMiA9IHBvbHlnb25bKGkgKyAxKSAlIHBvbHlnb24ubGVuZ3RoXTtcbiAgICAgIHZhciBlZGdlID0ge1xuICAgICAgICB4OiBwMi54IC0gcDEueCxcbiAgICAgICAgeTogcDIueSAtIHAxLnlcbiAgICAgIH07XG4gICAgICB2YXIgbm9ybWFsID0ge1xuICAgICAgICB4OiAtZWRnZS55LFxuICAgICAgICB5OiBlZGdlLnhcbiAgICAgIH07XG4gICAgICB2YXIgbGVuZ3RoID0gTWF0aC5zcXJ0KG5vcm1hbC54ICogbm9ybWFsLnggKyBub3JtYWwueSAqIG5vcm1hbC55KTtcbiAgICAgIGF4ZXMucHVzaCh7XG4gICAgICAgIHg6IG5vcm1hbC54IC8gbGVuZ3RoLFxuICAgICAgICB5OiBub3JtYWwueSAvIGxlbmd0aFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBheGVzO1xuICB9XG4gIGZ1bmN0aW9uIHByb2plY3QocG9seWdvbiwgYXhpcykge1xuICAgIHZhciBtaW4gPSBJbmZpbml0eTtcbiAgICB2YXIgbWF4ID0gLUluZmluaXR5O1xuICAgIHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihwb2x5Z29uKSxcbiAgICAgIF9zdGVwO1xuICAgIHRyeSB7XG4gICAgICBmb3IgKF9pdGVyYXRvci5zKCk7ICEoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lOykge1xuICAgICAgICB2YXIgcG9pbnQgPSBfc3RlcC52YWx1ZTtcbiAgICAgICAgdmFyIHByb2plY3Rpb24gPSBwb2ludC54ICogYXhpcy54ICsgcG9pbnQueSAqIGF4aXMueTtcbiAgICAgICAgbWluID0gTWF0aC5taW4obWluLCBwcm9qZWN0aW9uKTtcbiAgICAgICAgbWF4ID0gTWF0aC5tYXgobWF4LCBwcm9qZWN0aW9uKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIF9pdGVyYXRvci5lKGVycik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIF9pdGVyYXRvci5mKCk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBtaW46IG1pbixcbiAgICAgIG1heDogbWF4XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBvdmVybGFwcyhwcm9qMSwgcHJvajIpIHtcbiAgICByZXR1cm4gIShwcm9qMS5tYXggPCBwcm9qMi5taW4gfHwgcHJvajIubWF4IDwgcHJvajEubWluKTtcbiAgfVxuICB2YXIgYXhlcyA9IFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoZ2V0QXhlcyhwb2x5MSkpLCBfdG9Db25zdW1hYmxlQXJyYXkoZ2V0QXhlcyhwb2x5MikpKTtcbiAgdmFyIF9pdGVyYXRvcjIgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihheGVzKSxcbiAgICBfc3RlcDI7XG4gIHRyeSB7XG4gICAgZm9yIChfaXRlcmF0b3IyLnMoKTsgIShfc3RlcDIgPSBfaXRlcmF0b3IyLm4oKSkuZG9uZTspIHtcbiAgICAgIHZhciBheGlzID0gX3N0ZXAyLnZhbHVlO1xuICAgICAgdmFyIHByb2oxID0gcHJvamVjdChwb2x5MSwgYXhpcyk7XG4gICAgICB2YXIgcHJvajIgPSBwcm9qZWN0KHBvbHkyLCBheGlzKTtcbiAgICAgIGlmICghb3ZlcmxhcHMocHJvajEsIHByb2oyKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7IC8vIE5vIG92ZXJsYXAsIHNvIHRoZSBwb2x5Z29ucyBkbyBub3QgaW50ZXJzZWN0XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBfaXRlcmF0b3IyLmUoZXJyKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBfaXRlcmF0b3IyLmYoKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTsgLy8gcG9seWdvbnMgaW50ZXJzZWN0XG59XG5cbnZhciBwYWdlUmFua0RlZmF1bHRzID0gZGVmYXVsdHMkZyh7XG4gIGRhbXBpbmdGYWN0b3I6IDAuOCxcbiAgcHJlY2lzaW9uOiAwLjAwMDAwMSxcbiAgaXRlcmF0aW9uczogMjAwLFxuICB3ZWlnaHQ6IGZ1bmN0aW9uIHdlaWdodChlZGdlKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cbn0pO1xudmFyIGVsZXNmbiRvID0ge1xuICBwYWdlUmFuazogZnVuY3Rpb24gcGFnZVJhbmsob3B0aW9ucykge1xuICAgIHZhciBfcGFnZVJhbmtEZWZhdWx0cyA9IHBhZ2VSYW5rRGVmYXVsdHMob3B0aW9ucyksXG4gICAgICBkYW1waW5nRmFjdG9yID0gX3BhZ2VSYW5rRGVmYXVsdHMuZGFtcGluZ0ZhY3RvcixcbiAgICAgIHByZWNpc2lvbiA9IF9wYWdlUmFua0RlZmF1bHRzLnByZWNpc2lvbixcbiAgICAgIGl0ZXJhdGlvbnMgPSBfcGFnZVJhbmtEZWZhdWx0cy5pdGVyYXRpb25zLFxuICAgICAgd2VpZ2h0ID0gX3BhZ2VSYW5rRGVmYXVsdHMud2VpZ2h0O1xuICAgIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3k7XG4gICAgdmFyIF90aGlzJGJ5R3JvdXAgPSB0aGlzLmJ5R3JvdXAoKSxcbiAgICAgIG5vZGVzID0gX3RoaXMkYnlHcm91cC5ub2RlcyxcbiAgICAgIGVkZ2VzID0gX3RoaXMkYnlHcm91cC5lZGdlcztcbiAgICB2YXIgbnVtTm9kZXMgPSBub2Rlcy5sZW5ndGg7XG4gICAgdmFyIG51bU5vZGVzU3FkID0gbnVtTm9kZXMgKiBudW1Ob2RlcztcbiAgICB2YXIgbnVtRWRnZXMgPSBlZGdlcy5sZW5ndGg7XG5cbiAgICAvLyBDb25zdHJ1Y3QgdHJhbnNwb3NlZCBhZGphY2VuY3kgbWF0cml4XG4gICAgLy8gRmlyc3QgbGV0cyBoYXZlIGEgemVyb2VkIG1hdHJpeCBvZiB0aGUgcmlnaHQgc2l6ZVxuICAgIC8vIFdlJ2xsIGFsc28ga2VlcCB0cmFjayBvZiB0aGUgc3VtIG9mIGVhY2ggY29sdW1uXG4gICAgdmFyIG1hdHJpeCA9IG5ldyBBcnJheShudW1Ob2Rlc1NxZCk7XG4gICAgdmFyIGNvbHVtblN1bSA9IG5ldyBBcnJheShudW1Ob2Rlcyk7XG4gICAgdmFyIGFkZGl0aW9uYWxQcm9iID0gKDEgLSBkYW1waW5nRmFjdG9yKSAvIG51bU5vZGVzO1xuXG4gICAgLy8gQ3JlYXRlIG51bGwgbWF0cml4XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1Ob2RlczsgaSsrKSB7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG51bU5vZGVzOyBqKyspIHtcbiAgICAgICAgdmFyIG4gPSBpICogbnVtTm9kZXMgKyBqO1xuICAgICAgICBtYXRyaXhbbl0gPSAwO1xuICAgICAgfVxuICAgICAgY29sdW1uU3VtW2ldID0gMDtcbiAgICB9XG5cbiAgICAvLyBOb3csIHByb2Nlc3MgZWRnZXNcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbnVtRWRnZXM7IF9pKyspIHtcbiAgICAgIHZhciBlZGdlID0gZWRnZXNbX2ldO1xuICAgICAgdmFyIHNyY0lkID0gZWRnZS5kYXRhKCdzb3VyY2UnKTtcbiAgICAgIHZhciB0Z3RJZCA9IGVkZ2UuZGF0YSgndGFyZ2V0Jyk7XG5cbiAgICAgIC8vIERvbid0IGluY2x1ZGUgbG9vcHMgaW4gdGhlIG1hdHJpeFxuICAgICAgaWYgKHNyY0lkID09PSB0Z3RJZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBzID0gbm9kZXMuaW5kZXhPZklkKHNyY0lkKTtcbiAgICAgIHZhciB0ID0gbm9kZXMuaW5kZXhPZklkKHRndElkKTtcbiAgICAgIHZhciB3ID0gd2VpZ2h0KGVkZ2UpO1xuICAgICAgdmFyIF9uID0gdCAqIG51bU5vZGVzICsgcztcblxuICAgICAgLy8gVXBkYXRlIG1hdHJpeFxuICAgICAgbWF0cml4W19uXSArPSB3O1xuXG4gICAgICAvLyBVcGRhdGUgY29sdW1uIHN1bVxuICAgICAgY29sdW1uU3VtW3NdICs9IHc7XG4gICAgfVxuXG4gICAgLy8gQWRkIGFkZGl0aW9uYWwgcHJvYmFiaWxpdHkgYmFzZWQgb24gZGFtcGluZyBmYWN0b3JcbiAgICAvLyBBbHNvLCB0YWtlIGludG8gYWNjb3VudCBjb2x1bW5zIHRoYXQgaGF2ZSBzdW0gPSAwXG4gICAgdmFyIHAgPSAxLjAgLyBudW1Ob2RlcyArIGFkZGl0aW9uYWxQcm9iOyAvLyBTaG9ydGhhbmRcblxuICAgIC8vIFRyYXZlcnNlIG1hdHJpeCwgY29sdW1uIGJ5IGNvbHVtblxuICAgIGZvciAodmFyIF9qID0gMDsgX2ogPCBudW1Ob2RlczsgX2orKykge1xuICAgICAgaWYgKGNvbHVtblN1bVtfal0gPT09IDApIHtcbiAgICAgICAgLy8gTm8gJ2xpbmtzJyBvdXQgZnJvbSBub2RlIGp0aCwgYXNzdW1lIGVxdWFsIHByb2JhYmlsaXR5IGZvciBlYWNoIHBvc3NpYmxlIG5vZGVcbiAgICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgbnVtTm9kZXM7IF9pMisrKSB7XG4gICAgICAgICAgdmFyIF9uMiA9IF9pMiAqIG51bU5vZGVzICsgX2o7XG4gICAgICAgICAgbWF0cml4W19uMl0gPSBwO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBOb2RlIGp0aCBoYXMgb3V0Z29pbmcgbGluaywgY29tcHV0ZSBub3JtYWxpemVkIHByb2JhYmlsaXRpZXNcbiAgICAgICAgZm9yICh2YXIgX2kzID0gMDsgX2kzIDwgbnVtTm9kZXM7IF9pMysrKSB7XG4gICAgICAgICAgdmFyIF9uMyA9IF9pMyAqIG51bU5vZGVzICsgX2o7XG4gICAgICAgICAgbWF0cml4W19uM10gPSBtYXRyaXhbX24zXSAvIGNvbHVtblN1bVtfal0gKyBhZGRpdGlvbmFsUHJvYjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENvbXB1dGUgZG9taW5hbnQgZWlnZW52ZWN0b3IgdXNpbmcgcG93ZXIgbWV0aG9kXG4gICAgdmFyIGVpZ2VudmVjdG9yID0gbmV3IEFycmF5KG51bU5vZGVzKTtcbiAgICB2YXIgdGVtcCA9IG5ldyBBcnJheShudW1Ob2Rlcyk7XG4gICAgdmFyIHByZXZpb3VzO1xuXG4gICAgLy8gU3RhcnQgd2l0aCBhIHZlY3RvciBvZiBhbGwgMSdzXG4gICAgLy8gQWxzbywgaW5pdGlhbGl6ZSBhIG51bGwgdmVjdG9yIHdoaWNoIHdpbGwgYmUgdXNlZCBhcyBzaG9ydGhhbmRcbiAgICBmb3IgKHZhciBfaTQgPSAwOyBfaTQgPCBudW1Ob2RlczsgX2k0KyspIHtcbiAgICAgIGVpZ2VudmVjdG9yW19pNF0gPSAxO1xuICAgIH1cbiAgICBmb3IgKHZhciBpdGVyID0gMDsgaXRlciA8IGl0ZXJhdGlvbnM7IGl0ZXIrKykge1xuICAgICAgLy8gVGVtcCBhcnJheSB3aXRoIGFsbCAwJ3NcbiAgICAgIGZvciAodmFyIF9pNSA9IDA7IF9pNSA8IG51bU5vZGVzOyBfaTUrKykge1xuICAgICAgICB0ZW1wW19pNV0gPSAwO1xuICAgICAgfVxuXG4gICAgICAvLyBNdWx0aXBseSBtYXRyaXggd2l0aCBwcmV2aW91cyByZXN1bHRcbiAgICAgIGZvciAodmFyIF9pNiA9IDA7IF9pNiA8IG51bU5vZGVzOyBfaTYrKykge1xuICAgICAgICBmb3IgKHZhciBfajIgPSAwOyBfajIgPCBudW1Ob2RlczsgX2oyKyspIHtcbiAgICAgICAgICB2YXIgX240ID0gX2k2ICogbnVtTm9kZXMgKyBfajI7XG4gICAgICAgICAgdGVtcFtfaTZdICs9IG1hdHJpeFtfbjRdICogZWlnZW52ZWN0b3JbX2oyXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaW5QbGFjZVN1bU5vcm1hbGl6ZSh0ZW1wKTtcbiAgICAgIHByZXZpb3VzID0gZWlnZW52ZWN0b3I7XG4gICAgICBlaWdlbnZlY3RvciA9IHRlbXA7XG4gICAgICB0ZW1wID0gcHJldmlvdXM7XG4gICAgICB2YXIgZGlmZiA9IDA7XG4gICAgICAvLyBDb21wdXRlIGRpZmZlcmVuY2UgKHNxdWFyZWQgbW9kdWxlKSBvZiBib3RoIHZlY3RvcnNcbiAgICAgIGZvciAodmFyIF9pNyA9IDA7IF9pNyA8IG51bU5vZGVzOyBfaTcrKykge1xuICAgICAgICB2YXIgZGVsdGEgPSBwcmV2aW91c1tfaTddIC0gZWlnZW52ZWN0b3JbX2k3XTtcbiAgICAgICAgZGlmZiArPSBkZWx0YSAqIGRlbHRhO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiBkaWZmZXJlbmNlIGlzIGxlc3MgdGhhbiB0aGUgZGVzaXJlZCB0aHJlc2hvbGQsIHN0b3AgaXRlcmF0aW5nXG4gICAgICBpZiAoZGlmZiA8IHByZWNpc2lvbikge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDb25zdHJ1Y3QgcmVzdWx0XG4gICAgdmFyIHJlcyA9IHtcbiAgICAgIHJhbms6IGZ1bmN0aW9uIHJhbmsobm9kZSkge1xuICAgICAgICBub2RlID0gY3kuY29sbGVjdGlvbihub2RlKVswXTtcbiAgICAgICAgcmV0dXJuIGVpZ2VudmVjdG9yW25vZGVzLmluZGV4T2Yobm9kZSldO1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIHJlcztcbiAgfSAvLyBwYWdlUmFua1xufTsgLy8gZWxlc2ZuXG5cbnZhciBkZWZhdWx0cyRmID0gZGVmYXVsdHMkZyh7XG4gIHJvb3Q6IG51bGwsXG4gIHdlaWdodDogZnVuY3Rpb24gd2VpZ2h0KGVkZ2UpIHtcbiAgICByZXR1cm4gMTtcbiAgfSxcbiAgZGlyZWN0ZWQ6IGZhbHNlLFxuICBhbHBoYTogMFxufSk7XG52YXIgZWxlc2ZuJG4gPSB7XG4gIGRlZ3JlZUNlbnRyYWxpdHlOb3JtYWxpemVkOiBmdW5jdGlvbiBkZWdyZWVDZW50cmFsaXR5Tm9ybWFsaXplZChvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IGRlZmF1bHRzJGYob3B0aW9ucyk7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgIHZhciBub2RlcyA9IHRoaXMubm9kZXMoKTtcbiAgICB2YXIgbnVtTm9kZXMgPSBub2Rlcy5sZW5ndGg7XG4gICAgaWYgKCFvcHRpb25zLmRpcmVjdGVkKSB7XG4gICAgICB2YXIgZGVncmVlcyA9IHt9O1xuICAgICAgdmFyIG1heERlZ3JlZSA9IDA7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bU5vZGVzOyBpKyspIHtcbiAgICAgICAgdmFyIG5vZGUgPSBub2Rlc1tpXTtcblxuICAgICAgICAvLyBhZGQgY3VycmVudCBub2RlIHRvIHRoZSBjdXJyZW50IG9wdGlvbnMgb2JqZWN0IGFuZCBjYWxsIGRlZ3JlZUNlbnRyYWxpdHlcbiAgICAgICAgb3B0aW9ucy5yb290ID0gbm9kZTtcbiAgICAgICAgdmFyIGN1cnJEZWdyZWUgPSB0aGlzLmRlZ3JlZUNlbnRyYWxpdHkob3B0aW9ucyk7XG4gICAgICAgIGlmIChtYXhEZWdyZWUgPCBjdXJyRGVncmVlLmRlZ3JlZSkge1xuICAgICAgICAgIG1heERlZ3JlZSA9IGN1cnJEZWdyZWUuZGVncmVlO1xuICAgICAgICB9XG4gICAgICAgIGRlZ3JlZXNbbm9kZS5pZCgpXSA9IGN1cnJEZWdyZWUuZGVncmVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGVncmVlOiBmdW5jdGlvbiBkZWdyZWUobm9kZSkge1xuICAgICAgICAgIGlmIChtYXhEZWdyZWUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc3RyaW5nKG5vZGUpKSB7XG4gICAgICAgICAgICAvLyBmcm9tIGlzIGEgc2VsZWN0b3Igc3RyaW5nXG4gICAgICAgICAgICBub2RlID0gY3kuZmlsdGVyKG5vZGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZGVncmVlc1tub2RlLmlkKCldIC8gbWF4RGVncmVlO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgaW5kZWdyZWVzID0ge307XG4gICAgICB2YXIgb3V0ZGVncmVlcyA9IHt9O1xuICAgICAgdmFyIG1heEluZGVncmVlID0gMDtcbiAgICAgIHZhciBtYXhPdXRkZWdyZWUgPSAwO1xuICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IG51bU5vZGVzOyBfaSsrKSB7XG4gICAgICAgIHZhciBfbm9kZSA9IG5vZGVzW19pXTtcbiAgICAgICAgdmFyIGlkID0gX25vZGUuaWQoKTtcblxuICAgICAgICAvLyBhZGQgY3VycmVudCBub2RlIHRvIHRoZSBjdXJyZW50IG9wdGlvbnMgb2JqZWN0IGFuZCBjYWxsIGRlZ3JlZUNlbnRyYWxpdHlcbiAgICAgICAgb3B0aW9ucy5yb290ID0gX25vZGU7XG4gICAgICAgIHZhciBfY3VyckRlZ3JlZSA9IHRoaXMuZGVncmVlQ2VudHJhbGl0eShvcHRpb25zKTtcbiAgICAgICAgaWYgKG1heEluZGVncmVlIDwgX2N1cnJEZWdyZWUuaW5kZWdyZWUpIG1heEluZGVncmVlID0gX2N1cnJEZWdyZWUuaW5kZWdyZWU7XG4gICAgICAgIGlmIChtYXhPdXRkZWdyZWUgPCBfY3VyckRlZ3JlZS5vdXRkZWdyZWUpIG1heE91dGRlZ3JlZSA9IF9jdXJyRGVncmVlLm91dGRlZ3JlZTtcbiAgICAgICAgaW5kZWdyZWVzW2lkXSA9IF9jdXJyRGVncmVlLmluZGVncmVlO1xuICAgICAgICBvdXRkZWdyZWVzW2lkXSA9IF9jdXJyRGVncmVlLm91dGRlZ3JlZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGluZGVncmVlOiBmdW5jdGlvbiBpbmRlZ3JlZShub2RlKSB7XG4gICAgICAgICAgaWYgKG1heEluZGVncmVlID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc3RyaW5nKG5vZGUpKSB7XG4gICAgICAgICAgICAvLyBmcm9tIGlzIGEgc2VsZWN0b3Igc3RyaW5nXG4gICAgICAgICAgICBub2RlID0gY3kuZmlsdGVyKG5vZGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gaW5kZWdyZWVzW25vZGUuaWQoKV0gLyBtYXhJbmRlZ3JlZTtcbiAgICAgICAgfSxcbiAgICAgICAgb3V0ZGVncmVlOiBmdW5jdGlvbiBvdXRkZWdyZWUobm9kZSkge1xuICAgICAgICAgIGlmIChtYXhPdXRkZWdyZWUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc3RyaW5nKG5vZGUpKSB7XG4gICAgICAgICAgICAvLyBmcm9tIGlzIGEgc2VsZWN0b3Igc3RyaW5nXG4gICAgICAgICAgICBub2RlID0gY3kuZmlsdGVyKG5vZGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gb3V0ZGVncmVlc1tub2RlLmlkKCldIC8gbWF4T3V0ZGVncmVlO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgfSxcbiAgLy8gZGVncmVlQ2VudHJhbGl0eU5vcm1hbGl6ZWRcblxuICAvLyBJbXBsZW1lbnRlZCBmcm9tIHRoZSBhbGdvcml0aG0gaW4gT3BzYWhsJ3MgcGFwZXJcbiAgLy8gXCJOb2RlIGNlbnRyYWxpdHkgaW4gd2VpZ2h0ZWQgbmV0d29ya3M6IEdlbmVyYWxpemluZyBkZWdyZWUgYW5kIHNob3J0ZXN0IHBhdGhzXCJcbiAgLy8gY2hlY2sgdGhlIGhlYWRpbmcgMiBcIkRlZ3JlZVwiXG4gIGRlZ3JlZUNlbnRyYWxpdHk6IGZ1bmN0aW9uIGRlZ3JlZUNlbnRyYWxpdHkob3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBkZWZhdWx0cyRmKG9wdGlvbnMpO1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgICB2YXIgY2FsbGluZ0VsZXMgPSB0aGlzO1xuICAgIHZhciBfb3B0aW9ucyA9IG9wdGlvbnMsXG4gICAgICByb290ID0gX29wdGlvbnMucm9vdCxcbiAgICAgIHdlaWdodCA9IF9vcHRpb25zLndlaWdodCxcbiAgICAgIGRpcmVjdGVkID0gX29wdGlvbnMuZGlyZWN0ZWQsXG4gICAgICBhbHBoYSA9IF9vcHRpb25zLmFscGhhO1xuICAgIHJvb3QgPSBjeS5jb2xsZWN0aW9uKHJvb3QpWzBdO1xuICAgIGlmICghZGlyZWN0ZWQpIHtcbiAgICAgIHZhciBjb25uRWRnZXMgPSByb290LmNvbm5lY3RlZEVkZ2VzKCkuaW50ZXJzZWN0aW9uKGNhbGxpbmdFbGVzKTtcbiAgICAgIHZhciBrID0gY29ubkVkZ2VzLmxlbmd0aDtcbiAgICAgIHZhciBzID0gMDtcblxuICAgICAgLy8gTm93LCBzdW0gZWRnZSB3ZWlnaHRzXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbm5FZGdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBzICs9IHdlaWdodChjb25uRWRnZXNbaV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGVncmVlOiBNYXRoLnBvdyhrLCAxIC0gYWxwaGEpICogTWF0aC5wb3cocywgYWxwaGEpXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgZWRnZXMgPSByb290LmNvbm5lY3RlZEVkZ2VzKCk7XG4gICAgICB2YXIgaW5jb21pbmcgPSBlZGdlcy5maWx0ZXIoZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICAgICAgcmV0dXJuIGVkZ2UudGFyZ2V0KCkuc2FtZShyb290KSAmJiBjYWxsaW5nRWxlcy5oYXMoZWRnZSk7XG4gICAgICB9KTtcbiAgICAgIHZhciBvdXRnb2luZyA9IGVkZ2VzLmZpbHRlcihmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgICByZXR1cm4gZWRnZS5zb3VyY2UoKS5zYW1lKHJvb3QpICYmIGNhbGxpbmdFbGVzLmhhcyhlZGdlKTtcbiAgICAgIH0pO1xuICAgICAgdmFyIGtfaW4gPSBpbmNvbWluZy5sZW5ndGg7XG4gICAgICB2YXIga19vdXQgPSBvdXRnb2luZy5sZW5ndGg7XG4gICAgICB2YXIgc19pbiA9IDA7XG4gICAgICB2YXIgc19vdXQgPSAwO1xuXG4gICAgICAvLyBOb3csIHN1bSBpbmNvbWluZyBlZGdlIHdlaWdodHNcbiAgICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IGluY29taW5nLmxlbmd0aDsgX2kyKyspIHtcbiAgICAgICAgc19pbiArPSB3ZWlnaHQoaW5jb21pbmdbX2kyXSk7XG4gICAgICB9XG5cbiAgICAgIC8vIE5vdywgc3VtIG91dGdvaW5nIGVkZ2Ugd2VpZ2h0c1xuICAgICAgZm9yICh2YXIgX2kzID0gMDsgX2kzIDwgb3V0Z29pbmcubGVuZ3RoOyBfaTMrKykge1xuICAgICAgICBzX291dCArPSB3ZWlnaHQob3V0Z29pbmdbX2kzXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpbmRlZ3JlZTogTWF0aC5wb3coa19pbiwgMSAtIGFscGhhKSAqIE1hdGgucG93KHNfaW4sIGFscGhhKSxcbiAgICAgICAgb3V0ZGVncmVlOiBNYXRoLnBvdyhrX291dCwgMSAtIGFscGhhKSAqIE1hdGgucG93KHNfb3V0LCBhbHBoYSlcbiAgICAgIH07XG4gICAgfVxuICB9IC8vIGRlZ3JlZUNlbnRyYWxpdHlcbn07IC8vIGVsZXNmblxuXG4vLyBuaWNlLCBzaG9ydCBtYXRoZW1hdGljYWwgYWxpYXNcbmVsZXNmbiRuLmRjID0gZWxlc2ZuJG4uZGVncmVlQ2VudHJhbGl0eTtcbmVsZXNmbiRuLmRjbiA9IGVsZXNmbiRuLmRlZ3JlZUNlbnRyYWxpdHlOb3JtYWxpc2VkID0gZWxlc2ZuJG4uZGVncmVlQ2VudHJhbGl0eU5vcm1hbGl6ZWQ7XG5cbnZhciBkZWZhdWx0cyRlID0gZGVmYXVsdHMkZyh7XG4gIGhhcm1vbmljOiB0cnVlLFxuICB3ZWlnaHQ6IGZ1bmN0aW9uIHdlaWdodCgpIHtcbiAgICByZXR1cm4gMTtcbiAgfSxcbiAgZGlyZWN0ZWQ6IGZhbHNlLFxuICByb290OiBudWxsXG59KTtcbnZhciBlbGVzZm4kbSA9IHtcbiAgY2xvc2VuZXNzQ2VudHJhbGl0eU5vcm1hbGl6ZWQ6IGZ1bmN0aW9uIGNsb3NlbmVzc0NlbnRyYWxpdHlOb3JtYWxpemVkKG9wdGlvbnMpIHtcbiAgICB2YXIgX2RlZmF1bHRzID0gZGVmYXVsdHMkZShvcHRpb25zKSxcbiAgICAgIGhhcm1vbmljID0gX2RlZmF1bHRzLmhhcm1vbmljLFxuICAgICAgd2VpZ2h0ID0gX2RlZmF1bHRzLndlaWdodCxcbiAgICAgIGRpcmVjdGVkID0gX2RlZmF1bHRzLmRpcmVjdGVkO1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgICB2YXIgY2xvc2VuZXNzZXMgPSB7fTtcbiAgICB2YXIgbWF4Q2xvc2VuZXNzID0gMDtcbiAgICB2YXIgbm9kZXMgPSB0aGlzLm5vZGVzKCk7XG4gICAgdmFyIGZ3ID0gdGhpcy5mbG95ZFdhcnNoYWxsKHtcbiAgICAgIHdlaWdodDogd2VpZ2h0LFxuICAgICAgZGlyZWN0ZWQ6IGRpcmVjdGVkXG4gICAgfSk7XG5cbiAgICAvLyBDb21wdXRlIGNsb3NlbmVzcyBmb3IgZXZlcnkgbm9kZSBhbmQgZmluZCB0aGUgbWF4aW11bSBjbG9zZW5lc3NcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY3VyckNsb3NlbmVzcyA9IDA7XG4gICAgICB2YXIgbm9kZV9pID0gbm9kZXNbaV07XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG5vZGVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmIChpICE9PSBqKSB7XG4gICAgICAgICAgdmFyIGQgPSBmdy5kaXN0YW5jZShub2RlX2ksIG5vZGVzW2pdKTtcbiAgICAgICAgICBpZiAoaGFybW9uaWMpIHtcbiAgICAgICAgICAgIGN1cnJDbG9zZW5lc3MgKz0gMSAvIGQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGN1cnJDbG9zZW5lc3MgKz0gZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghaGFybW9uaWMpIHtcbiAgICAgICAgY3VyckNsb3NlbmVzcyA9IDEgLyBjdXJyQ2xvc2VuZXNzO1xuICAgICAgfVxuICAgICAgaWYgKG1heENsb3NlbmVzcyA8IGN1cnJDbG9zZW5lc3MpIHtcbiAgICAgICAgbWF4Q2xvc2VuZXNzID0gY3VyckNsb3NlbmVzcztcbiAgICAgIH1cbiAgICAgIGNsb3NlbmVzc2VzW25vZGVfaS5pZCgpXSA9IGN1cnJDbG9zZW5lc3M7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBjbG9zZW5lc3M6IGZ1bmN0aW9uIGNsb3NlbmVzcyhub2RlKSB7XG4gICAgICAgIGlmIChtYXhDbG9zZW5lc3MgPT0gMCkge1xuICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdHJpbmcobm9kZSkpIHtcbiAgICAgICAgICAvLyBmcm9tIGlzIGEgc2VsZWN0b3Igc3RyaW5nXG4gICAgICAgICAgbm9kZSA9IGN5LmZpbHRlcihub2RlKVswXS5pZCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGZyb20gaXMgYSBub2RlXG4gICAgICAgICAgbm9kZSA9IG5vZGUuaWQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2xvc2VuZXNzZXNbbm9kZV0gLyBtYXhDbG9zZW5lc3M7XG4gICAgICB9XG4gICAgfTtcbiAgfSxcbiAgLy8gSW1wbGVtZW50ZWQgZnJvbSBwc2V1ZG9jb2RlIGZyb20gd2lraXBlZGlhXG4gIGNsb3NlbmVzc0NlbnRyYWxpdHk6IGZ1bmN0aW9uIGNsb3NlbmVzc0NlbnRyYWxpdHkob3B0aW9ucykge1xuICAgIHZhciBfZGVmYXVsdHMyID0gZGVmYXVsdHMkZShvcHRpb25zKSxcbiAgICAgIHJvb3QgPSBfZGVmYXVsdHMyLnJvb3QsXG4gICAgICB3ZWlnaHQgPSBfZGVmYXVsdHMyLndlaWdodCxcbiAgICAgIGRpcmVjdGVkID0gX2RlZmF1bHRzMi5kaXJlY3RlZCxcbiAgICAgIGhhcm1vbmljID0gX2RlZmF1bHRzMi5oYXJtb25pYztcbiAgICByb290ID0gdGhpcy5maWx0ZXIocm9vdClbMF07XG5cbiAgICAvLyB3ZSBuZWVkIGRpc3RhbmNlIGZyb20gdGhpcyBub2RlIHRvIGV2ZXJ5IG90aGVyIG5vZGVcbiAgICB2YXIgZGlqa3N0cmEgPSB0aGlzLmRpamtzdHJhKHtcbiAgICAgIHJvb3Q6IHJvb3QsXG4gICAgICB3ZWlnaHQ6IHdlaWdodCxcbiAgICAgIGRpcmVjdGVkOiBkaXJlY3RlZFxuICAgIH0pO1xuICAgIHZhciB0b3RhbERpc3RhbmNlID0gMDtcbiAgICB2YXIgbm9kZXMgPSB0aGlzLm5vZGVzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG4gPSBub2Rlc1tpXTtcbiAgICAgIGlmICghbi5zYW1lKHJvb3QpKSB7XG4gICAgICAgIHZhciBkID0gZGlqa3N0cmEuZGlzdGFuY2VUbyhuKTtcbiAgICAgICAgaWYgKGhhcm1vbmljKSB7XG4gICAgICAgICAgdG90YWxEaXN0YW5jZSArPSAxIC8gZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0b3RhbERpc3RhbmNlICs9IGQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGhhcm1vbmljID8gdG90YWxEaXN0YW5jZSA6IDEgLyB0b3RhbERpc3RhbmNlO1xuICB9IC8vIGNsb3NlbmVzc0NlbnRyYWxpdHlcbn07IC8vIGVsZXNmblxuXG4vLyBuaWNlLCBzaG9ydCBtYXRoZW1hdGljYWwgYWxpYXNcbmVsZXNmbiRtLmNjID0gZWxlc2ZuJG0uY2xvc2VuZXNzQ2VudHJhbGl0eTtcbmVsZXNmbiRtLmNjbiA9IGVsZXNmbiRtLmNsb3NlbmVzc0NlbnRyYWxpdHlOb3JtYWxpc2VkID0gZWxlc2ZuJG0uY2xvc2VuZXNzQ2VudHJhbGl0eU5vcm1hbGl6ZWQ7XG5cbnZhciBkZWZhdWx0cyRkID0gZGVmYXVsdHMkZyh7XG4gIHdlaWdodDogbnVsbCxcbiAgZGlyZWN0ZWQ6IGZhbHNlXG59KTtcbnZhciBlbGVzZm4kbCA9IHtcbiAgLy8gSW1wbGVtZW50ZWQgZnJvbSB0aGUgYWxnb3JpdGhtIGluIHRoZSBwYXBlciBcIk9uIFZhcmlhbnRzIG9mIFNob3J0ZXN0LVBhdGggQmV0d2Vlbm5lc3MgQ2VudHJhbGl0eSBhbmQgdGhlaXIgR2VuZXJpYyBDb21wdXRhdGlvblwiIGJ5IFVscmlrIEJyYW5kZXNcbiAgYmV0d2Vlbm5lc3NDZW50cmFsaXR5OiBmdW5jdGlvbiBiZXR3ZWVubmVzc0NlbnRyYWxpdHkob3B0aW9ucykge1xuICAgIHZhciBfZGVmYXVsdHMgPSBkZWZhdWx0cyRkKG9wdGlvbnMpLFxuICAgICAgZGlyZWN0ZWQgPSBfZGVmYXVsdHMuZGlyZWN0ZWQsXG4gICAgICB3ZWlnaHQgPSBfZGVmYXVsdHMud2VpZ2h0O1xuICAgIHZhciB3ZWlnaHRlZCA9IHdlaWdodCAhPSBudWxsO1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcblxuICAgIC8vIHN0YXJ0aW5nXG4gICAgdmFyIFYgPSB0aGlzLm5vZGVzKCk7XG4gICAgdmFyIEEgPSB7fTtcbiAgICB2YXIgX0MgPSB7fTtcbiAgICB2YXIgbWF4ID0gMDtcbiAgICB2YXIgQyA9IHtcbiAgICAgIHNldDogZnVuY3Rpb24gc2V0KGtleSwgdmFsKSB7XG4gICAgICAgIF9DW2tleV0gPSB2YWw7XG4gICAgICAgIGlmICh2YWwgPiBtYXgpIHtcbiAgICAgICAgICBtYXggPSB2YWw7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICAgICAgcmV0dXJuIF9DW2tleV07XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIEEgY29udGFpbnMgdGhlIG5laWdoYm9yaG9vZHMgb2YgZXZlcnkgbm9kZVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgVi5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHYgPSBWW2ldO1xuICAgICAgdmFyIHZpZCA9IHYuaWQoKTtcbiAgICAgIGlmIChkaXJlY3RlZCkge1xuICAgICAgICBBW3ZpZF0gPSB2Lm91dGdvZXJzKCkubm9kZXMoKTsgLy8gZ2V0IG91dGdvZXJzIG9mIGV2ZXJ5IG5vZGVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIEFbdmlkXSA9IHYub3Blbk5laWdoYm9yaG9vZCgpLm5vZGVzKCk7IC8vIGdldCBuZWlnaGJvcnMgb2YgZXZlcnkgbm9kZVxuICAgICAgfVxuICAgICAgQy5zZXQodmlkLCAwKTtcbiAgICB9XG4gICAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoKSB7XG4gICAgICB2YXIgc2lkID0gVltzXS5pZCgpO1xuICAgICAgdmFyIFMgPSBbXTsgLy8gc3RhY2tcbiAgICAgIHZhciBQID0ge307XG4gICAgICB2YXIgZyA9IHt9O1xuICAgICAgdmFyIGQgPSB7fTtcbiAgICAgIHZhciBRID0gbmV3IEhlYXAoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIGRbYV0gLSBkW2JdO1xuICAgICAgfSk7IC8vIHF1ZXVlXG5cbiAgICAgIC8vIGluaXQgZGljdGlvbmFyaWVzXG4gICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgVi5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIF92aWQgPSBWW19pXS5pZCgpO1xuICAgICAgICBQW192aWRdID0gW107XG4gICAgICAgIGdbX3ZpZF0gPSAwO1xuICAgICAgICBkW192aWRdID0gSW5maW5pdHk7XG4gICAgICB9XG4gICAgICBnW3NpZF0gPSAxOyAvLyBzaWdtYVxuICAgICAgZFtzaWRdID0gMDsgLy8gZGlzdGFuY2UgdG8gc1xuXG4gICAgICBRLnB1c2goc2lkKTtcbiAgICAgIHdoaWxlICghUS5lbXB0eSgpKSB7XG4gICAgICAgIHZhciBfdiA9IFEucG9wKCk7XG4gICAgICAgIFMucHVzaChfdik7XG4gICAgICAgIGlmICh3ZWlnaHRlZCkge1xuICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgQVtfdl0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIHZhciB3ID0gQVtfdl1bal07XG4gICAgICAgICAgICB2YXIgdkVsZSA9IGN5LmdldEVsZW1lbnRCeUlkKF92KTtcbiAgICAgICAgICAgIHZhciBlZGdlID0gdm9pZCAwO1xuICAgICAgICAgICAgaWYgKHZFbGUuZWRnZXNUbyh3KS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGVkZ2UgPSB2RWxlLmVkZ2VzVG8odylbMF07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBlZGdlID0gdy5lZGdlc1RvKHZFbGUpWzBdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGVkZ2VXZWlnaHQgPSB3ZWlnaHQoZWRnZSk7XG4gICAgICAgICAgICB3ID0gdy5pZCgpO1xuICAgICAgICAgICAgaWYgKGRbd10gPiBkW192XSArIGVkZ2VXZWlnaHQpIHtcbiAgICAgICAgICAgICAgZFt3XSA9IGRbX3ZdICsgZWRnZVdlaWdodDtcbiAgICAgICAgICAgICAgaWYgKFEubm9kZXMuaW5kZXhPZih3KSA8IDApIHtcbiAgICAgICAgICAgICAgICAvL2lmIHcgaXMgbm90IGluIFFcbiAgICAgICAgICAgICAgICBRLnB1c2godyk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlIHBvc2l0aW9uIGlmIHcgaXMgaW4gUVxuICAgICAgICAgICAgICAgIFEudXBkYXRlSXRlbSh3KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBnW3ddID0gMDtcbiAgICAgICAgICAgICAgUFt3XSA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRbd10gPT0gZFtfdl0gKyBlZGdlV2VpZ2h0KSB7XG4gICAgICAgICAgICAgIGdbd10gPSBnW3ddICsgZ1tfdl07XG4gICAgICAgICAgICAgIFBbd10ucHVzaChfdik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvciAodmFyIF9qID0gMDsgX2ogPCBBW192XS5sZW5ndGg7IF9qKyspIHtcbiAgICAgICAgICAgIHZhciBfdyA9IEFbX3ZdW19qXS5pZCgpO1xuICAgICAgICAgICAgaWYgKGRbX3ddID09IEluZmluaXR5KSB7XG4gICAgICAgICAgICAgIFEucHVzaChfdyk7XG4gICAgICAgICAgICAgIGRbX3ddID0gZFtfdl0gKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRbX3ddID09IGRbX3ZdICsgMSkge1xuICAgICAgICAgICAgICBnW193XSA9IGdbX3ddICsgZ1tfdl07XG4gICAgICAgICAgICAgIFBbX3ddLnB1c2goX3YpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIGUgPSB7fTtcbiAgICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IFYubGVuZ3RoOyBfaTIrKykge1xuICAgICAgICBlW1ZbX2kyXS5pZCgpXSA9IDA7XG4gICAgICB9XG4gICAgICB3aGlsZSAoUy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZhciBfdzIgPSBTLnBvcCgpO1xuICAgICAgICBmb3IgKHZhciBfajIgPSAwOyBfajIgPCBQW193Ml0ubGVuZ3RoOyBfajIrKykge1xuICAgICAgICAgIHZhciBfdjIgPSBQW193Ml1bX2oyXTtcbiAgICAgICAgICBlW192Ml0gPSBlW192Ml0gKyBnW192Ml0gLyBnW193Ml0gKiAoMSArIGVbX3cyXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKF93MiAhPSBWW3NdLmlkKCkpIHtcbiAgICAgICAgICBDLnNldChfdzIsIEMuZ2V0KF93MikgKyBlW193Ml0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICBmb3IgKHZhciBzID0gMDsgcyA8IFYubGVuZ3RoOyBzKyspIHtcbiAgICAgIF9sb29wKCk7XG4gICAgfVxuICAgIHZhciByZXQgPSB7XG4gICAgICBiZXR3ZWVubmVzczogZnVuY3Rpb24gYmV0d2Vlbm5lc3Mobm9kZSkge1xuICAgICAgICB2YXIgaWQgPSBjeS5jb2xsZWN0aW9uKG5vZGUpLmlkKCk7XG4gICAgICAgIHJldHVybiBDLmdldChpZCk7XG4gICAgICB9LFxuICAgICAgYmV0d2Vlbm5lc3NOb3JtYWxpemVkOiBmdW5jdGlvbiBiZXR3ZWVubmVzc05vcm1hbGl6ZWQobm9kZSkge1xuICAgICAgICBpZiAobWF4ID09IDApIHtcbiAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaWQgPSBjeS5jb2xsZWN0aW9uKG5vZGUpLmlkKCk7XG4gICAgICAgIHJldHVybiBDLmdldChpZCkgLyBtYXg7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIGFsaWFzXG4gICAgcmV0LmJldHdlZW5uZXNzTm9ybWFsaXNlZCA9IHJldC5iZXR3ZWVubmVzc05vcm1hbGl6ZWQ7XG4gICAgcmV0dXJuIHJldDtcbiAgfSAvLyBiZXR3ZWVubmVzc0NlbnRyYWxpdHlcbn07IC8vIGVsZXNmblxuXG4vLyBuaWNlLCBzaG9ydCBtYXRoZW1hdGljYWwgYWxpYXNcbmVsZXNmbiRsLmJjID0gZWxlc2ZuJGwuYmV0d2Vlbm5lc3NDZW50cmFsaXR5O1xuXG4vLyBJbXBsZW1lbnRlZCBieSBab2UgWGkgQHpvZXhpIGZvciBHU09DIDIwMTZcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jeXRvc2NhcGUvY3l0b3NjYXBlLmpzLW1hcmtvdi1jbHVzdGVyXG5cblxuLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cbnZhciBkZWZhdWx0cyRjID0gZGVmYXVsdHMkZyh7XG4gIGV4cGFuZEZhY3RvcjogMixcbiAgLy8gYWZmZWN0cyB0aW1lIG9mIGNvbXB1dGF0aW9uIGFuZCBjbHVzdGVyIGdyYW51bGFyaXR5IHRvIHNvbWUgZXh0ZW50OiBNICogTVxuICBpbmZsYXRlRmFjdG9yOiAyLFxuICAvLyBhZmZlY3RzIGNsdXN0ZXIgZ3JhbnVsYXJpdHkgKHRoZSBncmVhdGVyIHRoZSB2YWx1ZSwgdGhlIG1vcmUgY2x1c3RlcnMpOiBNKGksaikgLyBFKGopXG4gIG11bHRGYWN0b3I6IDEsXG4gIC8vIG9wdGlvbmFsIHNlbGYgbG9vcHMgZm9yIGVhY2ggbm9kZS4gVXNlIGEgbmV1dHJhbCB2YWx1ZSB0byBpbXByb3ZlIGNsdXN0ZXIgY29tcHV0YXRpb25zLlxuICBtYXhJdGVyYXRpb25zOiAyMCxcbiAgLy8gbWF4aW11bSBudW1iZXIgb2YgaXRlcmF0aW9ucyBvZiB0aGUgTUNMIGFsZ29yaXRobSBpbiBhIHNpbmdsZSBydW5cbiAgYXR0cmlidXRlczogW1xuICAvLyBhdHRyaWJ1dGVzL2ZlYXR1cmVzIHVzZWQgdG8gZ3JvdXAgbm9kZXMsIGllLiBzaW1pbGFyaXR5IHZhbHVlcyBiZXR3ZWVuIG5vZGVzXG4gIGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1dXG59KTtcbi8qIGVzbGludC1lbmFibGUgKi9cblxudmFyIHNldE9wdGlvbnMkMyA9IGZ1bmN0aW9uIHNldE9wdGlvbnMob3B0aW9ucykge1xuICByZXR1cm4gZGVmYXVsdHMkYyhvcHRpb25zKTtcbn07XG4vKiBlc2xpbnQtZW5hYmxlICovXG5cbnZhciBnZXRTaW1pbGFyaXR5JDEgPSBmdW5jdGlvbiBnZXRTaW1pbGFyaXR5KGVkZ2UsIGF0dHJpYnV0ZXMpIHtcbiAgdmFyIHRvdGFsID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdG90YWwgKz0gYXR0cmlidXRlc1tpXShlZGdlKTtcbiAgfVxuICByZXR1cm4gdG90YWw7XG59O1xudmFyIGFkZExvb3BzID0gZnVuY3Rpb24gYWRkTG9vcHMoTSwgbiwgdmFsKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgTVtpICogbiArIGldID0gdmFsO1xuICB9XG59O1xudmFyIG5vcm1hbGl6ZSA9IGZ1bmN0aW9uIG5vcm1hbGl6ZShNLCBuKSB7XG4gIHZhciBzdW07XG4gIGZvciAodmFyIGNvbCA9IDA7IGNvbCA8IG47IGNvbCsrKSB7XG4gICAgc3VtID0gMDtcbiAgICBmb3IgKHZhciByb3cgPSAwOyByb3cgPCBuOyByb3crKykge1xuICAgICAgc3VtICs9IE1bcm93ICogbiArIGNvbF07XG4gICAgfVxuICAgIGZvciAodmFyIF9yb3cgPSAwOyBfcm93IDwgbjsgX3JvdysrKSB7XG4gICAgICBNW19yb3cgKiBuICsgY29sXSA9IE1bX3JvdyAqIG4gKyBjb2xdIC8gc3VtO1xuICAgIH1cbiAgfVxufTtcblxuLy8gVE9ETzogYmxvY2tlZCBtYXRyaXggbXVsdGlwbGljYXRpb24/XG52YXIgbW11bHQgPSBmdW5jdGlvbiBtbXVsdChBLCBCLCBuKSB7XG4gIHZhciBDID0gbmV3IEFycmF5KG4gKiBuKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG47IGorKykge1xuICAgICAgQ1tpICogbiArIGpdID0gMDtcbiAgICB9XG4gICAgZm9yICh2YXIgayA9IDA7IGsgPCBuOyBrKyspIHtcbiAgICAgIGZvciAodmFyIF9qID0gMDsgX2ogPCBuOyBfaisrKSB7XG4gICAgICAgIENbaSAqIG4gKyBfal0gKz0gQVtpICogbiArIGtdICogQltrICogbiArIF9qXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIEM7XG59O1xudmFyIGV4cGFuZCA9IGZ1bmN0aW9uIGV4cGFuZChNLCBuLCBleHBhbmRGYWN0b3IgLyoqIHBvd2VyICoqLykge1xuICB2YXIgX00gPSBNLnNsaWNlKDApO1xuICBmb3IgKHZhciBwID0gMTsgcCA8IGV4cGFuZEZhY3RvcjsgcCsrKSB7XG4gICAgTSA9IG1tdWx0KE0sIF9NLCBuKTtcbiAgfVxuICByZXR1cm4gTTtcbn07XG52YXIgaW5mbGF0ZSA9IGZ1bmN0aW9uIGluZmxhdGUoTSwgbiwgaW5mbGF0ZUZhY3RvciAvKiogciAqKi8pIHtcbiAgdmFyIF9NID0gbmV3IEFycmF5KG4gKiBuKTtcblxuICAvLyBNKGksaikgXiBpbmZsYXRlUG93ZXJcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuICogbjsgaSsrKSB7XG4gICAgX01baV0gPSBNYXRoLnBvdyhNW2ldLCBpbmZsYXRlRmFjdG9yKTtcbiAgfVxuICBub3JtYWxpemUoX00sIG4pO1xuICByZXR1cm4gX007XG59O1xudmFyIGhhc0NvbnZlcmdlZCA9IGZ1bmN0aW9uIGhhc0NvbnZlcmdlZChNLCBfTSwgbjIsIHJvdW5kRmFjdG9yKSB7XG4gIC8vIENoZWNrIHRoYXQgYm90aCBtYXRyaWNlcyBoYXZlIHRoZSBzYW1lIGVsZW1lbnRzIChpLGopXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbjI7IGkrKykge1xuICAgIHZhciB2MSA9IE1hdGgucm91bmQoTVtpXSAqIE1hdGgucG93KDEwLCByb3VuZEZhY3RvcikpIC8gTWF0aC5wb3coMTAsIHJvdW5kRmFjdG9yKTsgLy8gdHJ1bmNhdGUgdG8gJ3JvdW5kRmFjdG9yJyBkZWNpbWFsIHBsYWNlc1xuICAgIHZhciB2MiA9IE1hdGgucm91bmQoX01baV0gKiBNYXRoLnBvdygxMCwgcm91bmRGYWN0b3IpKSAvIE1hdGgucG93KDEwLCByb3VuZEZhY3Rvcik7XG4gICAgaWYgKHYxICE9PSB2Mikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG52YXIgYXNzaWduJDIgPSBmdW5jdGlvbiBhc3NpZ24oTSwgbiwgbm9kZXMsIGN5KSB7XG4gIHZhciBjbHVzdGVycyA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykge1xuICAgIHZhciBjbHVzdGVyID0gW107XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBuOyBqKyspIHtcbiAgICAgIC8vIFJvdy13aXNlIGF0dHJhY3RvcnMgYW5kIGVsZW1lbnRzIHRoYXQgdGhleSBhdHRyYWN0IGJlbG9uZyBpbiBzYW1lIGNsdXN0ZXJcbiAgICAgIGlmIChNYXRoLnJvdW5kKE1baSAqIG4gKyBqXSAqIDEwMDApIC8gMTAwMCA+IDApIHtcbiAgICAgICAgY2x1c3Rlci5wdXNoKG5vZGVzW2pdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNsdXN0ZXIubGVuZ3RoICE9PSAwKSB7XG4gICAgICBjbHVzdGVycy5wdXNoKGN5LmNvbGxlY3Rpb24oY2x1c3RlcikpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2x1c3RlcnM7XG59O1xudmFyIGlzRHVwbGljYXRlID0gZnVuY3Rpb24gaXNEdXBsaWNhdGUoYzEsIGMyKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYzEubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoIWMyW2ldIHx8IGMxW2ldLmlkKCkgIT09IGMyW2ldLmlkKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59O1xudmFyIHJlbW92ZUR1cGxpY2F0ZXMgPSBmdW5jdGlvbiByZW1vdmVEdXBsaWNhdGVzKGNsdXN0ZXJzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY2x1c3RlcnMubGVuZ3RoOyBpKyspIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNsdXN0ZXJzLmxlbmd0aDsgaisrKSB7XG4gICAgICBpZiAoaSAhPSBqICYmIGlzRHVwbGljYXRlKGNsdXN0ZXJzW2ldLCBjbHVzdGVyc1tqXSkpIHtcbiAgICAgICAgY2x1c3RlcnMuc3BsaWNlKGosIDEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gY2x1c3RlcnM7XG59O1xudmFyIG1hcmtvdkNsdXN0ZXJpbmcgPSBmdW5jdGlvbiBtYXJrb3ZDbHVzdGVyaW5nKG9wdGlvbnMpIHtcbiAgdmFyIG5vZGVzID0gdGhpcy5ub2RlcygpO1xuICB2YXIgZWRnZXMgPSB0aGlzLmVkZ2VzKCk7XG4gIHZhciBjeSA9IHRoaXMuY3koKTtcblxuICAvLyBTZXQgcGFyYW1ldGVycyBvZiBhbGdvcml0aG06XG4gIHZhciBvcHRzID0gc2V0T3B0aW9ucyQzKG9wdGlvbnMpO1xuXG4gIC8vIE1hcCBlYWNoIG5vZGUgdG8gaXRzIHBvc2l0aW9uIGluIG5vZGUgYXJyYXlcbiAgdmFyIGlkMnBvc2l0aW9uID0ge307XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICBpZDJwb3NpdGlvbltub2Rlc1tpXS5pZCgpXSA9IGk7XG4gIH1cblxuICAvLyBHZW5lcmF0ZSBzdG9jaGFzdGljIG1hdHJpeCBNIGZyb20gaW5wdXQgZ3JhcGggRyAoc2hvdWxkIGJlIHN5bW1ldHJpYy91bmRpcmVjdGVkKVxuICB2YXIgbiA9IG5vZGVzLmxlbmd0aCxcbiAgICBuMiA9IG4gKiBuO1xuICB2YXIgTSA9IG5ldyBBcnJheShuMiksXG4gICAgX007XG4gIGZvciAodmFyIF9pID0gMDsgX2kgPCBuMjsgX2krKykge1xuICAgIE1bX2ldID0gMDtcbiAgfVxuICBmb3IgKHZhciBlID0gMDsgZSA8IGVkZ2VzLmxlbmd0aDsgZSsrKSB7XG4gICAgdmFyIGVkZ2UgPSBlZGdlc1tlXTtcbiAgICB2YXIgX2kyID0gaWQycG9zaXRpb25bZWRnZS5zb3VyY2UoKS5pZCgpXTtcbiAgICB2YXIgaiA9IGlkMnBvc2l0aW9uW2VkZ2UudGFyZ2V0KCkuaWQoKV07XG4gICAgdmFyIHNpbSA9IGdldFNpbWlsYXJpdHkkMShlZGdlLCBvcHRzLmF0dHJpYnV0ZXMpO1xuICAgIE1bX2kyICogbiArIGpdICs9IHNpbTsgLy8gRyBzaG91bGQgYmUgc3ltbWV0cmljIGFuZCB1bmRpcmVjdGVkXG4gICAgTVtqICogbiArIF9pMl0gKz0gc2ltO1xuICB9XG5cbiAgLy8gQmVnaW4gTWFya292IGNsdXN0ZXIgYWxnb3JpdGhtXG5cbiAgLy8gU3RlcCAxOiBBZGQgc2VsZiBsb29wcyB0byBlYWNoIG5vZGUsIGllLiBhZGQgbXVsdEZhY3RvciB0byBtYXRyaXggZGlhZ29uYWxcbiAgYWRkTG9vcHMoTSwgbiwgb3B0cy5tdWx0RmFjdG9yKTtcblxuICAvLyBTdGVwIDI6IE0gPSBub3JtYWxpemUoIE0gKTtcbiAgbm9ybWFsaXplKE0sIG4pO1xuICB2YXIgaXNTdGlsbE1vdmluZyA9IHRydWU7XG4gIHZhciBpdGVyYXRpb25zID0gMDtcbiAgd2hpbGUgKGlzU3RpbGxNb3ZpbmcgJiYgaXRlcmF0aW9ucyA8IG9wdHMubWF4SXRlcmF0aW9ucykge1xuICAgIGlzU3RpbGxNb3ZpbmcgPSBmYWxzZTtcblxuICAgIC8vIFN0ZXAgMzpcbiAgICBfTSA9IGV4cGFuZChNLCBuLCBvcHRzLmV4cGFuZEZhY3Rvcik7XG5cbiAgICAvLyBTdGVwIDQ6XG4gICAgTSA9IGluZmxhdGUoX00sIG4sIG9wdHMuaW5mbGF0ZUZhY3Rvcik7XG5cbiAgICAvLyBTdGVwIDU6IGNoZWNrIHRvIHNlZSBpZiB+c3RlYWR5IHN0YXRlIGhhcyBiZWVuIHJlYWNoZWRcbiAgICBpZiAoIWhhc0NvbnZlcmdlZChNLCBfTSwgbjIsIDQpKSB7XG4gICAgICBpc1N0aWxsTW92aW5nID0gdHJ1ZTtcbiAgICB9XG4gICAgaXRlcmF0aW9ucysrO1xuICB9XG5cbiAgLy8gQnVpbGQgY2x1c3RlcnMgZnJvbSBtYXRyaXhcbiAgdmFyIGNsdXN0ZXJzID0gYXNzaWduJDIoTSwgbiwgbm9kZXMsIGN5KTtcblxuICAvLyBSZW1vdmUgZHVwbGljYXRlIGNsdXN0ZXJzIGR1ZSB0byBzeW1tZXRyeSBvZiBncmFwaCBhbmQgTSBtYXRyaXhcbiAgY2x1c3RlcnMgPSByZW1vdmVEdXBsaWNhdGVzKGNsdXN0ZXJzKTtcbiAgcmV0dXJuIGNsdXN0ZXJzO1xufTtcbnZhciBtYXJrb3ZDbHVzdGVyaW5nJDEgPSB7XG4gIG1hcmtvdkNsdXN0ZXJpbmc6IG1hcmtvdkNsdXN0ZXJpbmcsXG4gIG1jbDogbWFya292Q2x1c3RlcmluZ1xufTtcblxuLy8gQ29tbW9uIGRpc3RhbmNlIG1ldHJpY3MgZm9yIGNsdXN0ZXJpbmcgYWxnb3JpdGhtc1xuLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSGllcmFyY2hpY2FsX2NsdXN0ZXJpbmcjTWV0cmljXG5cbnZhciBpZGVudGl0eSQxID0gZnVuY3Rpb24gaWRlbnRpdHkoeCkge1xuICByZXR1cm4geDtcbn07XG52YXIgYWJzRGlmZiA9IGZ1bmN0aW9uIGFic0RpZmYocCwgcSkge1xuICByZXR1cm4gTWF0aC5hYnMocSAtIHApO1xufTtcbnZhciBhZGRBYnNEaWZmID0gZnVuY3Rpb24gYWRkQWJzRGlmZih0b3RhbCwgcCwgcSkge1xuICByZXR1cm4gdG90YWwgKyBhYnNEaWZmKHAsIHEpO1xufTtcbnZhciBhZGRTcXVhcmVkRGlmZiA9IGZ1bmN0aW9uIGFkZFNxdWFyZWREaWZmKHRvdGFsLCBwLCBxKSB7XG4gIHJldHVybiB0b3RhbCArIE1hdGgucG93KHEgLSBwLCAyKTtcbn07XG52YXIgc3FydCA9IGZ1bmN0aW9uIHNxcnQoeCkge1xuICByZXR1cm4gTWF0aC5zcXJ0KHgpO1xufTtcbnZhciBtYXhBYnNEaWZmID0gZnVuY3Rpb24gbWF4QWJzRGlmZihjdXJyZW50TWF4LCBwLCBxKSB7XG4gIHJldHVybiBNYXRoLm1heChjdXJyZW50TWF4LCBhYnNEaWZmKHAsIHEpKTtcbn07XG52YXIgZ2V0RGlzdGFuY2UgPSBmdW5jdGlvbiBnZXREaXN0YW5jZShsZW5ndGgsIGdldFAsIGdldFEsIGluaXQsIHZpc2l0KSB7XG4gIHZhciBwb3N0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDUgJiYgYXJndW1lbnRzWzVdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNV0gOiBpZGVudGl0eSQxO1xuICB2YXIgcmV0ID0gaW5pdDtcbiAgdmFyIHAsIHE7XG4gIGZvciAodmFyIGRpbSA9IDA7IGRpbSA8IGxlbmd0aDsgZGltKyspIHtcbiAgICBwID0gZ2V0UChkaW0pO1xuICAgIHEgPSBnZXRRKGRpbSk7XG4gICAgcmV0ID0gdmlzaXQocmV0LCBwLCBxKTtcbiAgfVxuICByZXR1cm4gcG9zdChyZXQpO1xufTtcbnZhciBkaXN0YW5jZXMgPSB7XG4gIGV1Y2xpZGVhbjogZnVuY3Rpb24gZXVjbGlkZWFuKGxlbmd0aCwgZ2V0UCwgZ2V0USkge1xuICAgIGlmIChsZW5ndGggPj0gMikge1xuICAgICAgcmV0dXJuIGdldERpc3RhbmNlKGxlbmd0aCwgZ2V0UCwgZ2V0USwgMCwgYWRkU3F1YXJlZERpZmYsIHNxcnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBmb3Igc2luZ2xlIGF0dHIgY2FzZSwgbW9yZSBlZmZpY2llbnQgdG8gYXZvaWQgc3FydFxuICAgICAgcmV0dXJuIGdldERpc3RhbmNlKGxlbmd0aCwgZ2V0UCwgZ2V0USwgMCwgYWRkQWJzRGlmZik7XG4gICAgfVxuICB9LFxuICBzcXVhcmVkRXVjbGlkZWFuOiBmdW5jdGlvbiBzcXVhcmVkRXVjbGlkZWFuKGxlbmd0aCwgZ2V0UCwgZ2V0USkge1xuICAgIHJldHVybiBnZXREaXN0YW5jZShsZW5ndGgsIGdldFAsIGdldFEsIDAsIGFkZFNxdWFyZWREaWZmKTtcbiAgfSxcbiAgbWFuaGF0dGFuOiBmdW5jdGlvbiBtYW5oYXR0YW4obGVuZ3RoLCBnZXRQLCBnZXRRKSB7XG4gICAgcmV0dXJuIGdldERpc3RhbmNlKGxlbmd0aCwgZ2V0UCwgZ2V0USwgMCwgYWRkQWJzRGlmZik7XG4gIH0sXG4gIG1heDogZnVuY3Rpb24gbWF4KGxlbmd0aCwgZ2V0UCwgZ2V0USkge1xuICAgIHJldHVybiBnZXREaXN0YW5jZShsZW5ndGgsIGdldFAsIGdldFEsIC1JbmZpbml0eSwgbWF4QWJzRGlmZik7XG4gIH1cbn07XG5cbi8vIGluIGNhc2UgdGhlIHVzZXIgYWNjaWRlbnRhbGx5IGRvZXNuJ3QgdXNlIGNhbWVsIGNhc2VcbmRpc3RhbmNlc1snc3F1YXJlZC1ldWNsaWRlYW4nXSA9IGRpc3RhbmNlc1snc3F1YXJlZEV1Y2xpZGVhbiddO1xuZGlzdGFuY2VzWydzcXVhcmVkZXVjbGlkZWFuJ10gPSBkaXN0YW5jZXNbJ3NxdWFyZWRFdWNsaWRlYW4nXTtcbmZ1bmN0aW9uIGNsdXN0ZXJpbmdEaXN0YW5jZSAobWV0aG9kLCBsZW5ndGgsIGdldFAsIGdldFEsIG5vZGVQLCBub2RlUSkge1xuICB2YXIgaW1wbDtcbiAgaWYgKGZuJDYobWV0aG9kKSkge1xuICAgIGltcGwgPSBtZXRob2Q7XG4gIH0gZWxzZSB7XG4gICAgaW1wbCA9IGRpc3RhbmNlc1ttZXRob2RdIHx8IGRpc3RhbmNlcy5ldWNsaWRlYW47XG4gIH1cbiAgaWYgKGxlbmd0aCA9PT0gMCAmJiBmbiQ2KG1ldGhvZCkpIHtcbiAgICByZXR1cm4gaW1wbChub2RlUCwgbm9kZVEpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBpbXBsKGxlbmd0aCwgZ2V0UCwgZ2V0USwgbm9kZVAsIG5vZGVRKTtcbiAgfVxufVxuXG52YXIgZGVmYXVsdHMkYiA9IGRlZmF1bHRzJGcoe1xuICBrOiAyLFxuICBtOiAyLFxuICBzZW5zaXRpdml0eVRocmVzaG9sZDogMC4wMDAxLFxuICBkaXN0YW5jZTogJ2V1Y2xpZGVhbicsXG4gIG1heEl0ZXJhdGlvbnM6IDEwLFxuICBhdHRyaWJ1dGVzOiBbXSxcbiAgdGVzdE1vZGU6IGZhbHNlLFxuICB0ZXN0Q2VudHJvaWRzOiBudWxsXG59KTtcbnZhciBzZXRPcHRpb25zJDIgPSBmdW5jdGlvbiBzZXRPcHRpb25zKG9wdGlvbnMpIHtcbiAgcmV0dXJuIGRlZmF1bHRzJGIob3B0aW9ucyk7XG59O1xuXG52YXIgZ2V0RGlzdCA9IGZ1bmN0aW9uIGdldERpc3QodHlwZSwgbm9kZSwgY2VudHJvaWQsIGF0dHJpYnV0ZXMsIG1vZGUpIHtcbiAgdmFyIG5vTm9kZVAgPSBtb2RlICE9PSAna01lZG9pZHMnO1xuICB2YXIgZ2V0UCA9IG5vTm9kZVAgPyBmdW5jdGlvbiAoaSkge1xuICAgIHJldHVybiBjZW50cm9pZFtpXTtcbiAgfSA6IGZ1bmN0aW9uIChpKSB7XG4gICAgcmV0dXJuIGF0dHJpYnV0ZXNbaV0oY2VudHJvaWQpO1xuICB9O1xuICB2YXIgZ2V0USA9IGZ1bmN0aW9uIGdldFEoaSkge1xuICAgIHJldHVybiBhdHRyaWJ1dGVzW2ldKG5vZGUpO1xuICB9O1xuICB2YXIgbm9kZVAgPSBjZW50cm9pZDtcbiAgdmFyIG5vZGVRID0gbm9kZTtcbiAgcmV0dXJuIGNsdXN0ZXJpbmdEaXN0YW5jZSh0eXBlLCBhdHRyaWJ1dGVzLmxlbmd0aCwgZ2V0UCwgZ2V0USwgbm9kZVAsIG5vZGVRKTtcbn07XG52YXIgcmFuZG9tQ2VudHJvaWRzID0gZnVuY3Rpb24gcmFuZG9tQ2VudHJvaWRzKG5vZGVzLCBrLCBhdHRyaWJ1dGVzKSB7XG4gIHZhciBuZGltID0gYXR0cmlidXRlcy5sZW5ndGg7XG4gIHZhciBtaW4gPSBuZXcgQXJyYXkobmRpbSk7XG4gIHZhciBtYXggPSBuZXcgQXJyYXkobmRpbSk7XG4gIHZhciBjZW50cm9pZHMgPSBuZXcgQXJyYXkoayk7XG4gIHZhciBjZW50cm9pZCA9IG51bGw7XG5cbiAgLy8gRmluZCBtaW4sIG1heCB2YWx1ZXMgZm9yIGVhY2ggYXR0cmlidXRlIGRpbWVuc2lvblxuICBmb3IgKHZhciBpID0gMDsgaSA8IG5kaW07IGkrKykge1xuICAgIG1pbltpXSA9IG5vZGVzLm1pbihhdHRyaWJ1dGVzW2ldKS52YWx1ZTtcbiAgICBtYXhbaV0gPSBub2Rlcy5tYXgoYXR0cmlidXRlc1tpXSkudmFsdWU7XG4gIH1cblxuICAvLyBCdWlsZCBrIGNlbnRyb2lkcywgZWFjaCByZXByZXNlbnRlZCBhcyBhbiBuLWRpbSBmZWF0dXJlIHZlY3RvclxuICBmb3IgKHZhciBjID0gMDsgYyA8IGs7IGMrKykge1xuICAgIGNlbnRyb2lkID0gW107XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IG5kaW07IF9pKyspIHtcbiAgICAgIGNlbnRyb2lkW19pXSA9IE1hdGgucmFuZG9tKCkgKiAobWF4W19pXSAtIG1pbltfaV0pICsgbWluW19pXTsgLy8gcmFuZG9tIGluaXRpYWwgdmFsdWVcbiAgICB9XG4gICAgY2VudHJvaWRzW2NdID0gY2VudHJvaWQ7XG4gIH1cbiAgcmV0dXJuIGNlbnRyb2lkcztcbn07XG52YXIgY2xhc3NpZnkgPSBmdW5jdGlvbiBjbGFzc2lmeShub2RlLCBjZW50cm9pZHMsIGRpc3RhbmNlLCBhdHRyaWJ1dGVzLCB0eXBlKSB7XG4gIHZhciBtaW4gPSBJbmZpbml0eTtcbiAgdmFyIGluZGV4ID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjZW50cm9pZHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZGlzdCA9IGdldERpc3QoZGlzdGFuY2UsIG5vZGUsIGNlbnRyb2lkc1tpXSwgYXR0cmlidXRlcywgdHlwZSk7XG4gICAgaWYgKGRpc3QgPCBtaW4pIHtcbiAgICAgIG1pbiA9IGRpc3Q7XG4gICAgICBpbmRleCA9IGk7XG4gICAgfVxuICB9XG4gIHJldHVybiBpbmRleDtcbn07XG52YXIgYnVpbGRDbHVzdGVyID0gZnVuY3Rpb24gYnVpbGRDbHVzdGVyKGNlbnRyb2lkLCBub2RlcywgYXNzaWdubWVudCkge1xuICB2YXIgY2x1c3RlciA9IFtdO1xuICB2YXIgbm9kZSA9IG51bGw7XG4gIGZvciAodmFyIG4gPSAwOyBuIDwgbm9kZXMubGVuZ3RoOyBuKyspIHtcbiAgICBub2RlID0gbm9kZXNbbl07XG4gICAgaWYgKGFzc2lnbm1lbnRbbm9kZS5pZCgpXSA9PT0gY2VudHJvaWQpIHtcbiAgICAgIC8vY29uc29sZS5sb2coXCJOb2RlIFwiICsgbm9kZS5pZCgpICsgXCIgaXMgYXNzb2NpYXRlZCB3aXRoIG1lZG9pZCAjOiBcIiArIG0pO1xuICAgICAgY2x1c3Rlci5wdXNoKG5vZGUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2x1c3Rlcjtcbn07XG52YXIgaGF2ZVZhbHVlc0NvbnZlcmdlZCA9IGZ1bmN0aW9uIGhhdmVWYWx1ZXNDb252ZXJnZWQodjEsIHYyLCBzZW5zaXRpdml0eVRocmVzaG9sZCkge1xuICByZXR1cm4gTWF0aC5hYnModjIgLSB2MSkgPD0gc2Vuc2l0aXZpdHlUaHJlc2hvbGQ7XG59O1xudmFyIGhhdmVNYXRyaWNlc0NvbnZlcmdlZCA9IGZ1bmN0aW9uIGhhdmVNYXRyaWNlc0NvbnZlcmdlZCh2MSwgdjIsIHNlbnNpdGl2aXR5VGhyZXNob2xkKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdjEubGVuZ3RoOyBpKyspIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHYxW2ldLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgZGlmZiA9IE1hdGguYWJzKHYxW2ldW2pdIC0gdjJbaV1bal0pO1xuICAgICAgaWYgKGRpZmYgPiBzZW5zaXRpdml0eVRocmVzaG9sZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufTtcbnZhciBzZWVuQmVmb3JlID0gZnVuY3Rpb24gc2VlbkJlZm9yZShub2RlLCBtZWRvaWRzLCBuKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgaWYgKG5vZGUgPT09IG1lZG9pZHNbaV0pIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG52YXIgcmFuZG9tTWVkb2lkcyA9IGZ1bmN0aW9uIHJhbmRvbU1lZG9pZHMobm9kZXMsIGspIHtcbiAgdmFyIG1lZG9pZHMgPSBuZXcgQXJyYXkoayk7XG5cbiAgLy8gRm9yIHNtYWxsIGRhdGEgc2V0cywgdGhlIHByb2JhYmlsaXR5IG9mIG1lZG9pZCBjb25mbGljdCBpcyBncmVhdGVyLFxuICAvLyBzbyB3ZSBuZWVkIHRvIGNoZWNrIHRvIHNlZSBpZiB3ZSd2ZSBhbHJlYWR5IHNlZW4gb3IgY2hvc2UgdGhpcyBub2RlIGJlZm9yZS5cbiAgaWYgKG5vZGVzLmxlbmd0aCA8IDUwKSB7XG4gICAgLy8gUmFuZG9tbHkgc2VsZWN0IGsgbWVkb2lkcyBmcm9tIHRoZSBuIG5vZGVzXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrOyBpKyspIHtcbiAgICAgIHZhciBub2RlID0gbm9kZXNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogbm9kZXMubGVuZ3RoKV07XG5cbiAgICAgIC8vIElmIHdlJ3ZlIGFscmVhZHkgY2hvc2VuIHRoaXMgbm9kZSB0byBiZSBhIG1lZG9pZCwgZG9uJ3QgY2hvb3NlIGl0IGFnYWluIChmb3Igc21hbGwgZGF0YSBzZXRzKS5cbiAgICAgIC8vIEluc3RlYWQgY2hvb3NlIGEgZGlmZmVyZW50IHJhbmRvbSBub2RlLlxuICAgICAgd2hpbGUgKHNlZW5CZWZvcmUobm9kZSwgbWVkb2lkcywgaSkpIHtcbiAgICAgICAgbm9kZSA9IG5vZGVzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIG5vZGVzLmxlbmd0aCldO1xuICAgICAgfVxuICAgICAgbWVkb2lkc1tpXSA9IG5vZGU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFJlbGF0aXZlbHkgbGFyZ2UgZGF0YSBzZXQsIHNvIHByZXR0eSBzYWZlIHRvIG5vdCBjaGVjayBhbmQganVzdCBzZWxlY3QgcmFuZG9tIG5vZGVzXG4gICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgazsgX2kyKyspIHtcbiAgICAgIG1lZG9pZHNbX2kyXSA9IG5vZGVzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIG5vZGVzLmxlbmd0aCldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbWVkb2lkcztcbn07XG52YXIgZmluZENvc3QgPSBmdW5jdGlvbiBmaW5kQ29zdChwb3RlbnRpYWxOZXdNZWRvaWQsIGNsdXN0ZXIsIGF0dHJpYnV0ZXMpIHtcbiAgdmFyIGNvc3QgPSAwO1xuICBmb3IgKHZhciBuID0gMDsgbiA8IGNsdXN0ZXIubGVuZ3RoOyBuKyspIHtcbiAgICBjb3N0ICs9IGdldERpc3QoJ21hbmhhdHRhbicsIGNsdXN0ZXJbbl0sIHBvdGVudGlhbE5ld01lZG9pZCwgYXR0cmlidXRlcywgJ2tNZWRvaWRzJyk7XG4gIH1cbiAgcmV0dXJuIGNvc3Q7XG59O1xudmFyIGtNZWFucyA9IGZ1bmN0aW9uIGtNZWFucyhvcHRpb25zKSB7XG4gIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgdmFyIG5vZGVzID0gdGhpcy5ub2RlcygpO1xuICB2YXIgbm9kZSA9IG51bGw7XG5cbiAgLy8gU2V0IHBhcmFtZXRlcnMgb2YgYWxnb3JpdGhtOiAjIG9mIGNsdXN0ZXJzLCBkaXN0YW5jZSBtZXRyaWMsIGV0Yy5cbiAgdmFyIG9wdHMgPSBzZXRPcHRpb25zJDIob3B0aW9ucyk7XG5cbiAgLy8gQmVnaW4gay1tZWFucyBhbGdvcml0aG1cbiAgdmFyIGNsdXN0ZXJzID0gbmV3IEFycmF5KG9wdHMuayk7XG4gIHZhciBhc3NpZ25tZW50ID0ge307XG4gIHZhciBjZW50cm9pZHM7XG5cbiAgLy8gU3RlcCAxOiBJbml0aWFsaXplIGNlbnRyb2lkIHBvc2l0aW9uc1xuICBpZiAob3B0cy50ZXN0TW9kZSkge1xuICAgIGlmICh0eXBlb2Ygb3B0cy50ZXN0Q2VudHJvaWRzID09PSAnbnVtYmVyJykge1xuICAgICAgLy8gVE9ETzogaW1wbGVtZW50IGEgc2VlZGVkIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLlxuICAgICAgb3B0cy50ZXN0Q2VudHJvaWRzO1xuICAgICAgY2VudHJvaWRzID0gcmFuZG9tQ2VudHJvaWRzKG5vZGVzLCBvcHRzLmssIG9wdHMuYXR0cmlidXRlcyk7XG4gICAgfSBlbHNlIGlmIChfdHlwZW9mKG9wdHMudGVzdENlbnRyb2lkcykgPT09ICdvYmplY3QnKSB7XG4gICAgICBjZW50cm9pZHMgPSBvcHRzLnRlc3RDZW50cm9pZHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNlbnRyb2lkcyA9IHJhbmRvbUNlbnRyb2lkcyhub2Rlcywgb3B0cy5rLCBvcHRzLmF0dHJpYnV0ZXMpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjZW50cm9pZHMgPSByYW5kb21DZW50cm9pZHMobm9kZXMsIG9wdHMuaywgb3B0cy5hdHRyaWJ1dGVzKTtcbiAgfVxuICB2YXIgaXNTdGlsbE1vdmluZyA9IHRydWU7XG4gIHZhciBpdGVyYXRpb25zID0gMDtcbiAgd2hpbGUgKGlzU3RpbGxNb3ZpbmcgJiYgaXRlcmF0aW9ucyA8IG9wdHMubWF4SXRlcmF0aW9ucykge1xuICAgIC8vIFN0ZXAgMjogQXNzaWduIG5vZGVzIHRvIHRoZSBuZWFyZXN0IGNlbnRyb2lkXG4gICAgZm9yICh2YXIgbiA9IDA7IG4gPCBub2Rlcy5sZW5ndGg7IG4rKykge1xuICAgICAgbm9kZSA9IG5vZGVzW25dO1xuICAgICAgLy8gRGV0ZXJtaW5lIHdoaWNoIGNsdXN0ZXIgdGhpcyBub2RlIGJlbG9uZ3MgdG86IG5vZGUgaWQgPT4gY2x1c3RlciAjXG4gICAgICBhc3NpZ25tZW50W25vZGUuaWQoKV0gPSBjbGFzc2lmeShub2RlLCBjZW50cm9pZHMsIG9wdHMuZGlzdGFuY2UsIG9wdHMuYXR0cmlidXRlcywgJ2tNZWFucycpO1xuICAgIH1cblxuICAgIC8vIFN0ZXAgMzogRm9yIGVhY2ggb2YgdGhlIGsgY2x1c3RlcnMsIHVwZGF0ZSBpdHMgY2VudHJvaWRcbiAgICBpc1N0aWxsTW92aW5nID0gZmFsc2U7XG4gICAgZm9yICh2YXIgYyA9IDA7IGMgPCBvcHRzLms7IGMrKykge1xuICAgICAgLy8gR2V0IGFsbCBub2RlcyB0aGF0IGJlbG9uZyB0byB0aGlzIGNsdXN0ZXJcbiAgICAgIHZhciBjbHVzdGVyID0gYnVpbGRDbHVzdGVyKGMsIG5vZGVzLCBhc3NpZ25tZW50KTtcbiAgICAgIGlmIChjbHVzdGVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBJZiBjbHVzdGVyIGlzIGVtcHR5LCBicmVhayBvdXQgZWFybHkgJiBtb3ZlIHRvIG5leHQgY2x1c3RlclxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIGNlbnRyb2lkcyBieSBjYWxjdWxhdGluZyBhdmcgb2YgYWxsIG5vZGVzIHdpdGhpbiB0aGUgY2x1c3Rlci5cbiAgICAgIHZhciBuZGltID0gb3B0cy5hdHRyaWJ1dGVzLmxlbmd0aDtcbiAgICAgIHZhciBjZW50cm9pZCA9IGNlbnRyb2lkc1tjXTsgLy8gWyBkaW1fMSwgZGltXzIsIGRpbV8zLCAuLi4gLCBkaW1fbiBdXG4gICAgICB2YXIgbmV3Q2VudHJvaWQgPSBuZXcgQXJyYXkobmRpbSk7XG4gICAgICB2YXIgc3VtID0gbmV3IEFycmF5KG5kaW0pO1xuICAgICAgZm9yICh2YXIgZCA9IDA7IGQgPCBuZGltOyBkKyspIHtcbiAgICAgICAgc3VtW2RdID0gMC4wO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNsdXN0ZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBub2RlID0gY2x1c3RlcltpXTtcbiAgICAgICAgICBzdW1bZF0gKz0gb3B0cy5hdHRyaWJ1dGVzW2RdKG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIG5ld0NlbnRyb2lkW2RdID0gc3VtW2RdIC8gY2x1c3Rlci5sZW5ndGg7XG5cbiAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIGFsZ29yaXRobSBoYXMgY29udmVyZ2VkLCBpLmUuIHdoZW4gY2VudHJvaWRzIG5vIGxvbmdlciBjaGFuZ2VcbiAgICAgICAgaWYgKCFoYXZlVmFsdWVzQ29udmVyZ2VkKG5ld0NlbnRyb2lkW2RdLCBjZW50cm9pZFtkXSwgb3B0cy5zZW5zaXRpdml0eVRocmVzaG9sZCkpIHtcbiAgICAgICAgICBpc1N0aWxsTW92aW5nID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2VudHJvaWRzW2NdID0gbmV3Q2VudHJvaWQ7XG4gICAgICBjbHVzdGVyc1tjXSA9IGN5LmNvbGxlY3Rpb24oY2x1c3Rlcik7XG4gICAgfVxuICAgIGl0ZXJhdGlvbnMrKztcbiAgfVxuICByZXR1cm4gY2x1c3RlcnM7XG59O1xudmFyIGtNZWRvaWRzID0gZnVuY3Rpb24ga01lZG9pZHMob3B0aW9ucykge1xuICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gIHZhciBub2RlcyA9IHRoaXMubm9kZXMoKTtcbiAgdmFyIG5vZGUgPSBudWxsO1xuICB2YXIgb3B0cyA9IHNldE9wdGlvbnMkMihvcHRpb25zKTtcblxuICAvLyBCZWdpbiBrLW1lZG9pZHMgYWxnb3JpdGhtXG4gIHZhciBjbHVzdGVycyA9IG5ldyBBcnJheShvcHRzLmspO1xuICB2YXIgbWVkb2lkcztcbiAgdmFyIGFzc2lnbm1lbnQgPSB7fTtcbiAgdmFyIGN1ckNvc3Q7XG4gIHZhciBtaW5Db3N0cyA9IG5ldyBBcnJheShvcHRzLmspOyAvLyBtaW5pbXVtIGNvc3QgY29uZmlndXJhdGlvbiBmb3IgZWFjaCBjbHVzdGVyXG5cbiAgLy8gU3RlcCAxOiBJbml0aWFsaXplIGsgbWVkb2lkc1xuICBpZiAob3B0cy50ZXN0TW9kZSkge1xuICAgIGlmICh0eXBlb2Ygb3B0cy50ZXN0Q2VudHJvaWRzID09PSAnbnVtYmVyJykgOyBlbHNlIGlmIChfdHlwZW9mKG9wdHMudGVzdENlbnRyb2lkcykgPT09ICdvYmplY3QnKSB7XG4gICAgICBtZWRvaWRzID0gb3B0cy50ZXN0Q2VudHJvaWRzO1xuICAgIH0gZWxzZSB7XG4gICAgICBtZWRvaWRzID0gcmFuZG9tTWVkb2lkcyhub2Rlcywgb3B0cy5rKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbWVkb2lkcyA9IHJhbmRvbU1lZG9pZHMobm9kZXMsIG9wdHMuayk7XG4gIH1cbiAgdmFyIGlzU3RpbGxNb3ZpbmcgPSB0cnVlO1xuICB2YXIgaXRlcmF0aW9ucyA9IDA7XG4gIHdoaWxlIChpc1N0aWxsTW92aW5nICYmIGl0ZXJhdGlvbnMgPCBvcHRzLm1heEl0ZXJhdGlvbnMpIHtcbiAgICAvLyBTdGVwIDI6IEFzc2lnbiBub2RlcyB0byB0aGUgbmVhcmVzdCBtZWRvaWRcbiAgICBmb3IgKHZhciBuID0gMDsgbiA8IG5vZGVzLmxlbmd0aDsgbisrKSB7XG4gICAgICBub2RlID0gbm9kZXNbbl07XG4gICAgICAvLyBEZXRlcm1pbmUgd2hpY2ggY2x1c3RlciB0aGlzIG5vZGUgYmVsb25ncyB0bzogbm9kZSBpZCA9PiBjbHVzdGVyICNcbiAgICAgIGFzc2lnbm1lbnRbbm9kZS5pZCgpXSA9IGNsYXNzaWZ5KG5vZGUsIG1lZG9pZHMsIG9wdHMuZGlzdGFuY2UsIG9wdHMuYXR0cmlidXRlcywgJ2tNZWRvaWRzJyk7XG4gICAgfVxuICAgIGlzU3RpbGxNb3ZpbmcgPSBmYWxzZTtcbiAgICAvLyBTdGVwIDM6IEZvciBlYWNoIG1lZG9pZCBtLCBhbmQgZm9yIGVhY2ggbm9kZSBhc3NvY2lhdGVkIHdpdGggbWVkaW9kIG0sXG4gICAgLy8gc2VsZWN0IHRoZSBub2RlIHdpdGggdGhlIGxvd2VzdCBjb25maWd1cmF0aW9uIGNvc3QgYXMgbmV3IG1lZG9pZC5cbiAgICBmb3IgKHZhciBtID0gMDsgbSA8IG1lZG9pZHMubGVuZ3RoOyBtKyspIHtcbiAgICAgIC8vIEdldCBhbGwgbm9kZXMgdGhhdCBiZWxvbmcgdG8gdGhpcyBtZWRvaWRcbiAgICAgIHZhciBjbHVzdGVyID0gYnVpbGRDbHVzdGVyKG0sIG5vZGVzLCBhc3NpZ25tZW50KTtcbiAgICAgIGlmIChjbHVzdGVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBJZiBjbHVzdGVyIGlzIGVtcHR5LCBicmVhayBvdXQgZWFybHkgJiBtb3ZlIHRvIG5leHQgY2x1c3RlclxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIG1pbkNvc3RzW21dID0gZmluZENvc3QobWVkb2lkc1ttXSwgY2x1c3Rlciwgb3B0cy5hdHRyaWJ1dGVzKTsgLy8gb3JpZ2luYWwgY29zdFxuXG4gICAgICAvLyBTZWxlY3QgZGlmZmVyZW50IG1lZG9pZCBpZiBpdHMgY29uZmlndXJhdGlvbiBoYXMgdGhlIGxvd2VzdCBjb3N0XG4gICAgICBmb3IgKHZhciBfbiA9IDA7IF9uIDwgY2x1c3Rlci5sZW5ndGg7IF9uKyspIHtcbiAgICAgICAgY3VyQ29zdCA9IGZpbmRDb3N0KGNsdXN0ZXJbX25dLCBjbHVzdGVyLCBvcHRzLmF0dHJpYnV0ZXMpO1xuICAgICAgICBpZiAoY3VyQ29zdCA8IG1pbkNvc3RzW21dKSB7XG4gICAgICAgICAgbWluQ29zdHNbbV0gPSBjdXJDb3N0O1xuICAgICAgICAgIG1lZG9pZHNbbV0gPSBjbHVzdGVyW19uXTtcbiAgICAgICAgICBpc1N0aWxsTW92aW5nID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2x1c3RlcnNbbV0gPSBjeS5jb2xsZWN0aW9uKGNsdXN0ZXIpO1xuICAgIH1cbiAgICBpdGVyYXRpb25zKys7XG4gIH1cbiAgcmV0dXJuIGNsdXN0ZXJzO1xufTtcbnZhciB1cGRhdGVDZW50cm9pZHMgPSBmdW5jdGlvbiB1cGRhdGVDZW50cm9pZHMoY2VudHJvaWRzLCBub2RlcywgVSwgd2VpZ2h0LCBvcHRzKSB7XG4gIHZhciBudW1lcmF0b3IsIGRlbm9taW5hdG9yO1xuICBmb3IgKHZhciBuID0gMDsgbiA8IG5vZGVzLmxlbmd0aDsgbisrKSB7XG4gICAgZm9yICh2YXIgYyA9IDA7IGMgPCBjZW50cm9pZHMubGVuZ3RoOyBjKyspIHtcbiAgICAgIHdlaWdodFtuXVtjXSA9IE1hdGgucG93KFVbbl1bY10sIG9wdHMubSk7XG4gICAgfVxuICB9XG4gIGZvciAodmFyIF9jID0gMDsgX2MgPCBjZW50cm9pZHMubGVuZ3RoOyBfYysrKSB7XG4gICAgZm9yICh2YXIgZGltID0gMDsgZGltIDwgb3B0cy5hdHRyaWJ1dGVzLmxlbmd0aDsgZGltKyspIHtcbiAgICAgIG51bWVyYXRvciA9IDA7XG4gICAgICBkZW5vbWluYXRvciA9IDA7XG4gICAgICBmb3IgKHZhciBfbjIgPSAwOyBfbjIgPCBub2Rlcy5sZW5ndGg7IF9uMisrKSB7XG4gICAgICAgIG51bWVyYXRvciArPSB3ZWlnaHRbX24yXVtfY10gKiBvcHRzLmF0dHJpYnV0ZXNbZGltXShub2Rlc1tfbjJdKTtcbiAgICAgICAgZGVub21pbmF0b3IgKz0gd2VpZ2h0W19uMl1bX2NdO1xuICAgICAgfVxuICAgICAgY2VudHJvaWRzW19jXVtkaW1dID0gbnVtZXJhdG9yIC8gZGVub21pbmF0b3I7XG4gICAgfVxuICB9XG59O1xudmFyIHVwZGF0ZU1lbWJlcnNoaXAgPSBmdW5jdGlvbiB1cGRhdGVNZW1iZXJzaGlwKFUsIF9VLCBjZW50cm9pZHMsIG5vZGVzLCBvcHRzKSB7XG4gIC8vIFNhdmUgcHJldmlvdXMgc3RlcFxuICBmb3IgKHZhciBpID0gMDsgaSA8IFUubGVuZ3RoOyBpKyspIHtcbiAgICBfVVtpXSA9IFVbaV0uc2xpY2UoKTtcbiAgfVxuICB2YXIgc3VtLCBudW1lcmF0b3IsIGRlbm9taW5hdG9yO1xuICB2YXIgcG93ID0gMiAvIChvcHRzLm0gLSAxKTtcbiAgZm9yICh2YXIgYyA9IDA7IGMgPCBjZW50cm9pZHMubGVuZ3RoOyBjKyspIHtcbiAgICBmb3IgKHZhciBuID0gMDsgbiA8IG5vZGVzLmxlbmd0aDsgbisrKSB7XG4gICAgICBzdW0gPSAwO1xuICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBjZW50cm9pZHMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgLy8gYWdhaW5zdCBhbGwgb3RoZXIgY2VudHJvaWRzXG4gICAgICAgIG51bWVyYXRvciA9IGdldERpc3Qob3B0cy5kaXN0YW5jZSwgbm9kZXNbbl0sIGNlbnRyb2lkc1tjXSwgb3B0cy5hdHRyaWJ1dGVzLCAnY21lYW5zJyk7XG4gICAgICAgIGRlbm9taW5hdG9yID0gZ2V0RGlzdChvcHRzLmRpc3RhbmNlLCBub2Rlc1tuXSwgY2VudHJvaWRzW2tdLCBvcHRzLmF0dHJpYnV0ZXMsICdjbWVhbnMnKTtcbiAgICAgICAgc3VtICs9IE1hdGgucG93KG51bWVyYXRvciAvIGRlbm9taW5hdG9yLCBwb3cpO1xuICAgICAgfVxuICAgICAgVVtuXVtjXSA9IDEgLyBzdW07XG4gICAgfVxuICB9XG59O1xudmFyIGFzc2lnbiQxID0gZnVuY3Rpb24gYXNzaWduKG5vZGVzLCBVLCBvcHRzLCBjeSkge1xuICB2YXIgY2x1c3RlcnMgPSBuZXcgQXJyYXkob3B0cy5rKTtcbiAgZm9yICh2YXIgYyA9IDA7IGMgPCBjbHVzdGVycy5sZW5ndGg7IGMrKykge1xuICAgIGNsdXN0ZXJzW2NdID0gW107XG4gIH1cbiAgdmFyIG1heDtcbiAgdmFyIGluZGV4O1xuICBmb3IgKHZhciBuID0gMDsgbiA8IFUubGVuZ3RoOyBuKyspIHtcbiAgICAvLyBmb3IgZWFjaCBub2RlIChVIGlzIE4geCBDIG1hdHJpeClcbiAgICBtYXggPSAtSW5maW5pdHk7XG4gICAgaW5kZXggPSAtMTtcbiAgICAvLyBEZXRlcm1pbmUgd2hpY2ggY2x1c3RlciB0aGUgbm9kZSBpcyBtb3N0IGxpa2VseSB0byBiZWxvbmcgaW5cbiAgICBmb3IgKHZhciBfYzIgPSAwOyBfYzIgPCBVWzBdLmxlbmd0aDsgX2MyKyspIHtcbiAgICAgIGlmIChVW25dW19jMl0gPiBtYXgpIHtcbiAgICAgICAgbWF4ID0gVVtuXVtfYzJdO1xuICAgICAgICBpbmRleCA9IF9jMjtcbiAgICAgIH1cbiAgICB9XG4gICAgY2x1c3RlcnNbaW5kZXhdLnB1c2gobm9kZXNbbl0pO1xuICB9XG5cbiAgLy8gVHVybiBldmVyeSBhcnJheSBpbnRvIGEgY29sbGVjdGlvbiBvZiBub2Rlc1xuICBmb3IgKHZhciBfYzMgPSAwOyBfYzMgPCBjbHVzdGVycy5sZW5ndGg7IF9jMysrKSB7XG4gICAgY2x1c3RlcnNbX2MzXSA9IGN5LmNvbGxlY3Rpb24oY2x1c3RlcnNbX2MzXSk7XG4gIH1cbiAgcmV0dXJuIGNsdXN0ZXJzO1xufTtcbnZhciBmdXp6eUNNZWFucyA9IGZ1bmN0aW9uIGZ1enp5Q01lYW5zKG9wdGlvbnMpIHtcbiAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICB2YXIgbm9kZXMgPSB0aGlzLm5vZGVzKCk7XG4gIHZhciBvcHRzID0gc2V0T3B0aW9ucyQyKG9wdGlvbnMpO1xuXG4gIC8vIEJlZ2luIGZ1enp5IGMtbWVhbnMgYWxnb3JpdGhtXG4gIHZhciBjbHVzdGVycztcbiAgdmFyIGNlbnRyb2lkcztcbiAgdmFyIFU7XG4gIHZhciBfVTtcbiAgdmFyIHdlaWdodDtcblxuICAvLyBTdGVwIDE6IEluaXRpYWxpemUgbGV0aWFibGVzLlxuICBfVSA9IG5ldyBBcnJheShub2Rlcy5sZW5ndGgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gTiB4IEMgbWF0cml4XG4gICAgX1VbaV0gPSBuZXcgQXJyYXkob3B0cy5rKTtcbiAgfVxuICBVID0gbmV3IEFycmF5KG5vZGVzLmxlbmd0aCk7XG4gIGZvciAodmFyIF9pMyA9IDA7IF9pMyA8IG5vZGVzLmxlbmd0aDsgX2kzKyspIHtcbiAgICAvLyBOIHggQyBtYXRyaXhcbiAgICBVW19pM10gPSBuZXcgQXJyYXkob3B0cy5rKTtcbiAgfVxuICBmb3IgKHZhciBfaTQgPSAwOyBfaTQgPCBub2Rlcy5sZW5ndGg7IF9pNCsrKSB7XG4gICAgdmFyIHRvdGFsID0gMDtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG9wdHMuazsgaisrKSB7XG4gICAgICBVW19pNF1bal0gPSBNYXRoLnJhbmRvbSgpO1xuICAgICAgdG90YWwgKz0gVVtfaTRdW2pdO1xuICAgIH1cbiAgICBmb3IgKHZhciBfaiA9IDA7IF9qIDwgb3B0cy5rOyBfaisrKSB7XG4gICAgICBVW19pNF1bX2pdID0gVVtfaTRdW19qXSAvIHRvdGFsO1xuICAgIH1cbiAgfVxuICBjZW50cm9pZHMgPSBuZXcgQXJyYXkob3B0cy5rKTtcbiAgZm9yICh2YXIgX2k1ID0gMDsgX2k1IDwgb3B0cy5rOyBfaTUrKykge1xuICAgIGNlbnRyb2lkc1tfaTVdID0gbmV3IEFycmF5KG9wdHMuYXR0cmlidXRlcy5sZW5ndGgpO1xuICB9XG4gIHdlaWdodCA9IG5ldyBBcnJheShub2Rlcy5sZW5ndGgpO1xuICBmb3IgKHZhciBfaTYgPSAwOyBfaTYgPCBub2Rlcy5sZW5ndGg7IF9pNisrKSB7XG4gICAgLy8gTiB4IEMgbWF0cml4XG4gICAgd2VpZ2h0W19pNl0gPSBuZXcgQXJyYXkob3B0cy5rKTtcbiAgfVxuICAvLyBlbmQgaW5pdCBGQ01cblxuICB2YXIgaXNTdGlsbE1vdmluZyA9IHRydWU7XG4gIHZhciBpdGVyYXRpb25zID0gMDtcbiAgd2hpbGUgKGlzU3RpbGxNb3ZpbmcgJiYgaXRlcmF0aW9ucyA8IG9wdHMubWF4SXRlcmF0aW9ucykge1xuICAgIGlzU3RpbGxNb3ZpbmcgPSBmYWxzZTtcblxuICAgIC8vIFN0ZXAgMjogQ2FsY3VsYXRlIHRoZSBjZW50cm9pZHMgZm9yIGVhY2ggc3RlcC5cbiAgICB1cGRhdGVDZW50cm9pZHMoY2VudHJvaWRzLCBub2RlcywgVSwgd2VpZ2h0LCBvcHRzKTtcblxuICAgIC8vIFN0ZXAgMzogVXBkYXRlIHRoZSBwYXJ0aXRpb24gbWF0cml4IFUuXG4gICAgdXBkYXRlTWVtYmVyc2hpcChVLCBfVSwgY2VudHJvaWRzLCBub2Rlcywgb3B0cyk7XG5cbiAgICAvLyBTdGVwIDQ6IENoZWNrIGZvciBjb252ZXJnZW5jZS5cbiAgICBpZiAoIWhhdmVNYXRyaWNlc0NvbnZlcmdlZChVLCBfVSwgb3B0cy5zZW5zaXRpdml0eVRocmVzaG9sZCkpIHtcbiAgICAgIGlzU3RpbGxNb3ZpbmcgPSB0cnVlO1xuICAgIH1cbiAgICBpdGVyYXRpb25zKys7XG4gIH1cblxuICAvLyBBc3NpZ24gbm9kZXMgdG8gY2x1c3RlcnMgd2l0aCBoaWdoZXN0IHByb2JhYmlsaXR5LlxuICBjbHVzdGVycyA9IGFzc2lnbiQxKG5vZGVzLCBVLCBvcHRzLCBjeSk7XG4gIHJldHVybiB7XG4gICAgY2x1c3RlcnM6IGNsdXN0ZXJzLFxuICAgIGRlZ3JlZU9mTWVtYmVyc2hpcDogVVxuICB9O1xufTtcbnZhciBrQ2x1c3RlcmluZyA9IHtcbiAga01lYW5zOiBrTWVhbnMsXG4gIGtNZWRvaWRzOiBrTWVkb2lkcyxcbiAgZnV6enlDTWVhbnM6IGZ1enp5Q01lYW5zLFxuICBmY206IGZ1enp5Q01lYW5zXG59O1xuXG4vLyBJbXBsZW1lbnRlZCBieSBab2UgWGkgQHpvZXhpIGZvciBHU09DIDIwMTZcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jeXRvc2NhcGUvY3l0b3NjYXBlLmpzLWhpZXJhcmNoaWNhbFxuXG52YXIgZGVmYXVsdHMkYSA9IGRlZmF1bHRzJGcoe1xuICBkaXN0YW5jZTogJ2V1Y2xpZGVhbicsXG4gIC8vIGRpc3RhbmNlIG1ldHJpYyB0byBjb21wYXJlIG5vZGVzXG4gIGxpbmthZ2U6ICdtaW4nLFxuICAvLyBsaW5rYWdlIGNyaXRlcmlvbiA6IGhvdyB0byBkZXRlcm1pbmUgdGhlIGRpc3RhbmNlIGJldHdlZW4gY2x1c3RlcnMgb2Ygbm9kZXNcbiAgbW9kZTogJ3RocmVzaG9sZCcsXG4gIC8vIG1vZGU6J3RocmVzaG9sZCcgPT4gY2x1c3RlcnMgbXVzdCBiZSB0aHJlc2hvbGQgZGlzdGFuY2UgYXBhcnRcbiAgdGhyZXNob2xkOiBJbmZpbml0eSxcbiAgLy8gdGhlIGRpc3RhbmNlIHRocmVzaG9sZFxuICAvLyBtb2RlOidkZW5kcm9ncmFtJyA9PiB0aGUgbm9kZXMgYXJlIG9yZ2FuaXNlZCBhcyBsZWF2ZXMgaW4gYSB0cmVlIChzaWJsaW5ncyBhcmUgY2xvc2UpLCBtZXJnaW5nIG1ha2VzIGNsdXN0ZXJzXG4gIGFkZERlbmRyb2dyYW06IGZhbHNlLFxuICAvLyB3aGV0aGVyIHRvIGFkZCB0aGUgZGVuZHJvZ3JhbSB0byB0aGUgZ3JhcGggZm9yIHZpelxuICBkZW5kcm9ncmFtRGVwdGg6IDAsXG4gIC8vIGRlcHRoIGF0IHdoaWNoIGRlbmRyb2dyYW0gYnJhbmNoZXMgYXJlIG1lcmdlZCBpbnRvIHRoZSByZXR1cm5lZCBjbHVzdGVyc1xuICBhdHRyaWJ1dGVzOiBbXSAvLyBhcnJheSBvZiBhdHRyIGZ1bmN0aW9uc1xufSk7XG52YXIgbGlua2FnZUFsaWFzZXMgPSB7XG4gICdzaW5nbGUnOiAnbWluJyxcbiAgJ2NvbXBsZXRlJzogJ21heCdcbn07XG52YXIgc2V0T3B0aW9ucyQxID0gZnVuY3Rpb24gc2V0T3B0aW9ucyhvcHRpb25zKSB7XG4gIHZhciBvcHRzID0gZGVmYXVsdHMkYShvcHRpb25zKTtcbiAgdmFyIHByZWZlcnJlZEFsaWFzID0gbGlua2FnZUFsaWFzZXNbb3B0cy5saW5rYWdlXTtcbiAgaWYgKHByZWZlcnJlZEFsaWFzICE9IG51bGwpIHtcbiAgICBvcHRzLmxpbmthZ2UgPSBwcmVmZXJyZWRBbGlhcztcbiAgfVxuICByZXR1cm4gb3B0cztcbn07XG52YXIgbWVyZ2VDbG9zZXN0ID0gZnVuY3Rpb24gbWVyZ2VDbG9zZXN0KGNsdXN0ZXJzLCBpbmRleCwgZGlzdHMsIG1pbnMsIG9wdHMpIHtcbiAgLy8gRmluZCB0d28gY2xvc2VzdCBjbHVzdGVycyBmcm9tIGNhY2hlZCBtaW5zXG4gIHZhciBtaW5LZXkgPSAwO1xuICB2YXIgbWluID0gSW5maW5pdHk7XG4gIHZhciBkaXN0O1xuICB2YXIgYXR0cnMgPSBvcHRzLmF0dHJpYnV0ZXM7XG4gIHZhciBnZXREaXN0ID0gZnVuY3Rpb24gZ2V0RGlzdChuMSwgbjIpIHtcbiAgICByZXR1cm4gY2x1c3RlcmluZ0Rpc3RhbmNlKG9wdHMuZGlzdGFuY2UsIGF0dHJzLmxlbmd0aCwgZnVuY3Rpb24gKGkpIHtcbiAgICAgIHJldHVybiBhdHRyc1tpXShuMSk7XG4gICAgfSwgZnVuY3Rpb24gKGkpIHtcbiAgICAgIHJldHVybiBhdHRyc1tpXShuMik7XG4gICAgfSwgbjEsIG4yKTtcbiAgfTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbHVzdGVycy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBrZXkgPSBjbHVzdGVyc1tpXS5rZXk7XG4gICAgdmFyIF9kaXN0ID0gZGlzdHNba2V5XVttaW5zW2tleV1dO1xuICAgIGlmIChfZGlzdCA8IG1pbikge1xuICAgICAgbWluS2V5ID0ga2V5O1xuICAgICAgbWluID0gX2Rpc3Q7XG4gICAgfVxuICB9XG4gIGlmIChvcHRzLm1vZGUgPT09ICd0aHJlc2hvbGQnICYmIG1pbiA+PSBvcHRzLnRocmVzaG9sZCB8fCBvcHRzLm1vZGUgPT09ICdkZW5kcm9ncmFtJyAmJiBjbHVzdGVycy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIGMxID0gaW5kZXhbbWluS2V5XTtcbiAgdmFyIGMyID0gaW5kZXhbbWluc1ttaW5LZXldXTtcbiAgdmFyIG1lcmdlZDtcblxuICAvLyBNZXJnZSB0d28gY2xvc2VzdCBjbHVzdGVyc1xuICBpZiAob3B0cy5tb2RlID09PSAnZGVuZHJvZ3JhbScpIHtcbiAgICBtZXJnZWQgPSB7XG4gICAgICBsZWZ0OiBjMSxcbiAgICAgIHJpZ2h0OiBjMixcbiAgICAgIGtleTogYzEua2V5XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBtZXJnZWQgPSB7XG4gICAgICB2YWx1ZTogYzEudmFsdWUuY29uY2F0KGMyLnZhbHVlKSxcbiAgICAgIGtleTogYzEua2V5XG4gICAgfTtcbiAgfVxuICBjbHVzdGVyc1tjMS5pbmRleF0gPSBtZXJnZWQ7XG4gIGNsdXN0ZXJzLnNwbGljZShjMi5pbmRleCwgMSk7XG4gIGluZGV4W2MxLmtleV0gPSBtZXJnZWQ7XG5cbiAgLy8gVXBkYXRlIGRpc3RhbmNlcyB3aXRoIG5ldyBtZXJnZWQgY2x1c3RlclxuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgY2x1c3RlcnMubGVuZ3RoOyBfaSsrKSB7XG4gICAgdmFyIGN1ciA9IGNsdXN0ZXJzW19pXTtcbiAgICBpZiAoYzEua2V5ID09PSBjdXIua2V5KSB7XG4gICAgICBkaXN0ID0gSW5maW5pdHk7XG4gICAgfSBlbHNlIGlmIChvcHRzLmxpbmthZ2UgPT09ICdtaW4nKSB7XG4gICAgICBkaXN0ID0gZGlzdHNbYzEua2V5XVtjdXIua2V5XTtcbiAgICAgIGlmIChkaXN0c1tjMS5rZXldW2N1ci5rZXldID4gZGlzdHNbYzIua2V5XVtjdXIua2V5XSkge1xuICAgICAgICBkaXN0ID0gZGlzdHNbYzIua2V5XVtjdXIua2V5XTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG9wdHMubGlua2FnZSA9PT0gJ21heCcpIHtcbiAgICAgIGRpc3QgPSBkaXN0c1tjMS5rZXldW2N1ci5rZXldO1xuICAgICAgaWYgKGRpc3RzW2MxLmtleV1bY3VyLmtleV0gPCBkaXN0c1tjMi5rZXldW2N1ci5rZXldKSB7XG4gICAgICAgIGRpc3QgPSBkaXN0c1tjMi5rZXldW2N1ci5rZXldO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAob3B0cy5saW5rYWdlID09PSAnbWVhbicpIHtcbiAgICAgIGRpc3QgPSAoZGlzdHNbYzEua2V5XVtjdXIua2V5XSAqIGMxLnNpemUgKyBkaXN0c1tjMi5rZXldW2N1ci5rZXldICogYzIuc2l6ZSkgLyAoYzEuc2l6ZSArIGMyLnNpemUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAob3B0cy5tb2RlID09PSAnZGVuZHJvZ3JhbScpIGRpc3QgPSBnZXREaXN0KGN1ci52YWx1ZSwgYzEudmFsdWUpO2Vsc2UgZGlzdCA9IGdldERpc3QoY3VyLnZhbHVlWzBdLCBjMS52YWx1ZVswXSk7XG4gICAgfVxuICAgIGRpc3RzW2MxLmtleV1bY3VyLmtleV0gPSBkaXN0c1tjdXIua2V5XVtjMS5rZXldID0gZGlzdDsgLy8gZGlzdGFuY2UgbWF0cml4IGlzIHN5bW1ldHJpY1xuICB9XG5cbiAgLy8gVXBkYXRlIGNhY2hlZCBtaW5zXG4gIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IGNsdXN0ZXJzLmxlbmd0aDsgX2kyKyspIHtcbiAgICB2YXIga2V5MSA9IGNsdXN0ZXJzW19pMl0ua2V5O1xuICAgIGlmIChtaW5zW2tleTFdID09PSBjMS5rZXkgfHwgbWluc1trZXkxXSA9PT0gYzIua2V5KSB7XG4gICAgICB2YXIgX21pbiA9IGtleTE7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNsdXN0ZXJzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBrZXkyID0gY2x1c3RlcnNbal0ua2V5O1xuICAgICAgICBpZiAoZGlzdHNba2V5MV1ba2V5Ml0gPCBkaXN0c1trZXkxXVtfbWluXSkge1xuICAgICAgICAgIF9taW4gPSBrZXkyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBtaW5zW2tleTFdID0gX21pbjtcbiAgICB9XG4gICAgY2x1c3RlcnNbX2kyXS5pbmRleCA9IF9pMjtcbiAgfVxuXG4gIC8vIENsZWFuIHVwIG1ldGEgZGF0YSB1c2VkIGZvciBjbHVzdGVyaW5nXG4gIGMxLmtleSA9IGMyLmtleSA9IGMxLmluZGV4ID0gYzIuaW5kZXggPSBudWxsO1xuICByZXR1cm4gdHJ1ZTtcbn07XG52YXIgX2dldEFsbENoaWxkcmVuID0gZnVuY3Rpb24gZ2V0QWxsQ2hpbGRyZW4ocm9vdCwgYXJyLCBjeSkge1xuICBpZiAoIXJvb3QpIHJldHVybjtcbiAgaWYgKHJvb3QudmFsdWUpIHtcbiAgICBhcnIucHVzaChyb290LnZhbHVlKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAocm9vdC5sZWZ0KSBfZ2V0QWxsQ2hpbGRyZW4ocm9vdC5sZWZ0LCBhcnIpO1xuICAgIGlmIChyb290LnJpZ2h0KSBfZ2V0QWxsQ2hpbGRyZW4ocm9vdC5yaWdodCwgYXJyKTtcbiAgfVxufTtcbnZhciBfYnVpbGREZW5kcm9ncmFtID0gZnVuY3Rpb24gYnVpbGREZW5kcm9ncmFtKHJvb3QsIGN5KSB7XG4gIGlmICghcm9vdCkgcmV0dXJuICcnO1xuICBpZiAocm9vdC5sZWZ0ICYmIHJvb3QucmlnaHQpIHtcbiAgICB2YXIgbGVmdFN0ciA9IF9idWlsZERlbmRyb2dyYW0ocm9vdC5sZWZ0LCBjeSk7XG4gICAgdmFyIHJpZ2h0U3RyID0gX2J1aWxkRGVuZHJvZ3JhbShyb290LnJpZ2h0LCBjeSk7XG4gICAgdmFyIG5vZGUgPSBjeS5hZGQoe1xuICAgICAgZ3JvdXA6ICdub2RlcycsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIGlkOiBsZWZ0U3RyICsgJywnICsgcmlnaHRTdHJcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjeS5hZGQoe1xuICAgICAgZ3JvdXA6ICdlZGdlcycsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIHNvdXJjZTogbGVmdFN0cixcbiAgICAgICAgdGFyZ2V0OiBub2RlLmlkKClcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjeS5hZGQoe1xuICAgICAgZ3JvdXA6ICdlZGdlcycsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIHNvdXJjZTogcmlnaHRTdHIsXG4gICAgICAgIHRhcmdldDogbm9kZS5pZCgpXG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG5vZGUuaWQoKTtcbiAgfSBlbHNlIGlmIChyb290LnZhbHVlKSB7XG4gICAgcmV0dXJuIHJvb3QudmFsdWUuaWQoKTtcbiAgfVxufTtcbnZhciBfYnVpbGRDbHVzdGVyc0Zyb21UcmVlID0gZnVuY3Rpb24gYnVpbGRDbHVzdGVyc0Zyb21UcmVlKHJvb3QsIGssIGN5KSB7XG4gIGlmICghcm9vdCkgcmV0dXJuIFtdO1xuICB2YXIgbGVmdCA9IFtdLFxuICAgIHJpZ2h0ID0gW10sXG4gICAgbGVhdmVzID0gW107XG4gIGlmIChrID09PSAwKSB7XG4gICAgLy8gZG9uJ3QgY3V0IHRyZWUsIHNpbXBseSByZXR1cm4gYWxsIG5vZGVzIGFzIDEgc2luZ2xlIGNsdXN0ZXJcbiAgICBpZiAocm9vdC5sZWZ0KSBfZ2V0QWxsQ2hpbGRyZW4ocm9vdC5sZWZ0LCBsZWZ0KTtcbiAgICBpZiAocm9vdC5yaWdodCkgX2dldEFsbENoaWxkcmVuKHJvb3QucmlnaHQsIHJpZ2h0KTtcbiAgICBsZWF2ZXMgPSBsZWZ0LmNvbmNhdChyaWdodCk7XG4gICAgcmV0dXJuIFtjeS5jb2xsZWN0aW9uKGxlYXZlcyldO1xuICB9IGVsc2UgaWYgKGsgPT09IDEpIHtcbiAgICAvLyBjdXQgYXQgcm9vdFxuXG4gICAgaWYgKHJvb3QudmFsdWUpIHtcbiAgICAgIC8vIGxlYWYgbm9kZVxuICAgICAgcmV0dXJuIFtjeS5jb2xsZWN0aW9uKHJvb3QudmFsdWUpXTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHJvb3QubGVmdCkgX2dldEFsbENoaWxkcmVuKHJvb3QubGVmdCwgbGVmdCk7XG4gICAgICBpZiAocm9vdC5yaWdodCkgX2dldEFsbENoaWxkcmVuKHJvb3QucmlnaHQsIHJpZ2h0KTtcbiAgICAgIHJldHVybiBbY3kuY29sbGVjdGlvbihsZWZ0KSwgY3kuY29sbGVjdGlvbihyaWdodCldO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAocm9vdC52YWx1ZSkge1xuICAgICAgcmV0dXJuIFtjeS5jb2xsZWN0aW9uKHJvb3QudmFsdWUpXTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHJvb3QubGVmdCkgbGVmdCA9IF9idWlsZENsdXN0ZXJzRnJvbVRyZWUocm9vdC5sZWZ0LCBrIC0gMSwgY3kpO1xuICAgICAgaWYgKHJvb3QucmlnaHQpIHJpZ2h0ID0gX2J1aWxkQ2x1c3RlcnNGcm9tVHJlZShyb290LnJpZ2h0LCBrIC0gMSwgY3kpO1xuICAgICAgcmV0dXJuIGxlZnQuY29uY2F0KHJpZ2h0KTtcbiAgICB9XG4gIH1cbn07XG5cbnZhciBoaWVyYXJjaGljYWxDbHVzdGVyaW5nID0gZnVuY3Rpb24gaGllcmFyY2hpY2FsQ2x1c3RlcmluZyhvcHRpb25zKSB7XG4gIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgdmFyIG5vZGVzID0gdGhpcy5ub2RlcygpO1xuXG4gIC8vIFNldCBwYXJhbWV0ZXJzIG9mIGFsZ29yaXRobTogbGlua2FnZSB0eXBlLCBkaXN0YW5jZSBtZXRyaWMsIGV0Yy5cbiAgdmFyIG9wdHMgPSBzZXRPcHRpb25zJDEob3B0aW9ucyk7XG4gIHZhciBhdHRycyA9IG9wdHMuYXR0cmlidXRlcztcbiAgdmFyIGdldERpc3QgPSBmdW5jdGlvbiBnZXREaXN0KG4xLCBuMikge1xuICAgIHJldHVybiBjbHVzdGVyaW5nRGlzdGFuY2Uob3B0cy5kaXN0YW5jZSwgYXR0cnMubGVuZ3RoLCBmdW5jdGlvbiAoaSkge1xuICAgICAgcmV0dXJuIGF0dHJzW2ldKG4xKTtcbiAgICB9LCBmdW5jdGlvbiAoaSkge1xuICAgICAgcmV0dXJuIGF0dHJzW2ldKG4yKTtcbiAgICB9LCBuMSwgbjIpO1xuICB9O1xuXG4gIC8vIEJlZ2luIGhpZXJhcmNoaWNhbCBhbGdvcml0aG1cbiAgdmFyIGNsdXN0ZXJzID0gW107XG4gIHZhciBkaXN0cyA9IFtdOyAvLyBkaXN0YW5jZXMgYmV0d2VlbiBlYWNoIHBhaXIgb2YgY2x1c3RlcnNcbiAgdmFyIG1pbnMgPSBbXTsgLy8gY2xvc2VzdCBjbHVzdGVyIGZvciBlYWNoIGNsdXN0ZXJcbiAgdmFyIGluZGV4ID0gW107IC8vIGhhc2ggb2YgYWxsIGNsdXN0ZXJzIGJ5IGtleVxuXG4gIC8vIEluIGFnZ2xvbWVyYXRpdmUgKGJvdHRvbS11cCkgY2x1c3RlcmluZywgZWFjaCBub2RlIHN0YXJ0cyBhcyBpdHMgb3duIGNsdXN0ZXJcbiAgZm9yICh2YXIgbiA9IDA7IG4gPCBub2Rlcy5sZW5ndGg7IG4rKykge1xuICAgIHZhciBjbHVzdGVyID0ge1xuICAgICAgdmFsdWU6IG9wdHMubW9kZSA9PT0gJ2RlbmRyb2dyYW0nID8gbm9kZXNbbl0gOiBbbm9kZXNbbl1dLFxuICAgICAga2V5OiBuLFxuICAgICAgaW5kZXg6IG5cbiAgICB9O1xuICAgIGNsdXN0ZXJzW25dID0gY2x1c3RlcjtcbiAgICBpbmRleFtuXSA9IGNsdXN0ZXI7XG4gICAgZGlzdHNbbl0gPSBbXTtcbiAgICBtaW5zW25dID0gMDtcbiAgfVxuXG4gIC8vIENhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgYmV0d2VlbiBlYWNoIHBhaXIgb2YgY2x1c3RlcnNcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbHVzdGVycy5sZW5ndGg7IGkrKykge1xuICAgIGZvciAodmFyIGogPSAwOyBqIDw9IGk7IGorKykge1xuICAgICAgdmFyIGRpc3QgPSB2b2lkIDA7XG4gICAgICBpZiAob3B0cy5tb2RlID09PSAnZGVuZHJvZ3JhbScpIHtcbiAgICAgICAgLy8gbW9kZXMgc3RvcmUgY2x1c3RlciB2YWx1ZXMgZGlmZmVyZW50bHlcbiAgICAgICAgZGlzdCA9IGkgPT09IGogPyBJbmZpbml0eSA6IGdldERpc3QoY2x1c3RlcnNbaV0udmFsdWUsIGNsdXN0ZXJzW2pdLnZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRpc3QgPSBpID09PSBqID8gSW5maW5pdHkgOiBnZXREaXN0KGNsdXN0ZXJzW2ldLnZhbHVlWzBdLCBjbHVzdGVyc1tqXS52YWx1ZVswXSk7XG4gICAgICB9XG4gICAgICBkaXN0c1tpXVtqXSA9IGRpc3Q7XG4gICAgICBkaXN0c1tqXVtpXSA9IGRpc3Q7XG4gICAgICBpZiAoZGlzdCA8IGRpc3RzW2ldW21pbnNbaV1dKSB7XG4gICAgICAgIG1pbnNbaV0gPSBqOyAvLyBDYWNoZSBtaW5zOiBjbG9zZXN0IGNsdXN0ZXIgdG8gY2x1c3RlciBpIGlzIGNsdXN0ZXIgalxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEZpbmQgdGhlIGNsb3Nlc3QgcGFpciBvZiBjbHVzdGVycyBhbmQgbWVyZ2UgdGhlbSBpbnRvIGEgc2luZ2xlIGNsdXN0ZXIuXG4gIC8vIFVwZGF0ZSBkaXN0YW5jZXMgYmV0d2VlbiBuZXcgY2x1c3RlciBhbmQgZWFjaCBvZiB0aGUgb2xkIGNsdXN0ZXJzLCBhbmQgbG9vcCB1bnRpbCB0aHJlc2hvbGQgcmVhY2hlZC5cbiAgdmFyIG1lcmdlZCA9IG1lcmdlQ2xvc2VzdChjbHVzdGVycywgaW5kZXgsIGRpc3RzLCBtaW5zLCBvcHRzKTtcbiAgd2hpbGUgKG1lcmdlZCkge1xuICAgIG1lcmdlZCA9IG1lcmdlQ2xvc2VzdChjbHVzdGVycywgaW5kZXgsIGRpc3RzLCBtaW5zLCBvcHRzKTtcbiAgfVxuICB2YXIgcmV0Q2x1c3RlcnM7XG5cbiAgLy8gRGVuZHJvZ3JhbSBtb2RlIGJ1aWxkcyB0aGUgaGllcmFyY2h5IGFuZCBhZGRzIGludGVybWVkaWFyeSBub2RlcyArIGVkZ2VzXG4gIC8vIGluIGFkZGl0aW9uIHRvIHJldHVybmluZyB0aGUgY2x1c3RlcnMuXG4gIGlmIChvcHRzLm1vZGUgPT09ICdkZW5kcm9ncmFtJykge1xuICAgIHJldENsdXN0ZXJzID0gX2J1aWxkQ2x1c3RlcnNGcm9tVHJlZShjbHVzdGVyc1swXSwgb3B0cy5kZW5kcm9ncmFtRGVwdGgsIGN5KTtcbiAgICBpZiAob3B0cy5hZGREZW5kcm9ncmFtKSBfYnVpbGREZW5kcm9ncmFtKGNsdXN0ZXJzWzBdLCBjeSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gUmVndWxhciBtb2RlIHNpbXBseSByZXR1cm5zIHRoZSBjbHVzdGVyc1xuXG4gICAgcmV0Q2x1c3RlcnMgPSBuZXcgQXJyYXkoY2x1c3RlcnMubGVuZ3RoKTtcbiAgICBjbHVzdGVycy5mb3JFYWNoKGZ1bmN0aW9uIChjbHVzdGVyLCBpKSB7XG4gICAgICAvLyBDbGVhbiB1cCBtZXRhIGRhdGEgdXNlZCBmb3IgY2x1c3RlcmluZ1xuICAgICAgY2x1c3Rlci5rZXkgPSBjbHVzdGVyLmluZGV4ID0gbnVsbDtcbiAgICAgIHJldENsdXN0ZXJzW2ldID0gY3kuY29sbGVjdGlvbihjbHVzdGVyLnZhbHVlKTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcmV0Q2x1c3RlcnM7XG59O1xudmFyIGhpZXJhcmNoaWNhbENsdXN0ZXJpbmckMSA9IHtcbiAgaGllcmFyY2hpY2FsQ2x1c3RlcmluZzogaGllcmFyY2hpY2FsQ2x1c3RlcmluZyxcbiAgaGNhOiBoaWVyYXJjaGljYWxDbHVzdGVyaW5nXG59O1xuXG4vLyBJbXBsZW1lbnRlZCBieSBab2UgWGkgQHpvZXhpIGZvciBHU09DIDIwMTZcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jeXRvc2NhcGUvY3l0b3NjYXBlLmpzLWFmZmluaXR5LXByb3BhZ2F0aW9uXG5cbnZhciBkZWZhdWx0cyQ5ID0gZGVmYXVsdHMkZyh7XG4gIGRpc3RhbmNlOiAnZXVjbGlkZWFuJyxcbiAgLy8gZGlzdGFuY2UgbWV0cmljIHRvIGNvbXBhcmUgYXR0cmlidXRlcyBiZXR3ZWVuIHR3byBub2Rlc1xuICBwcmVmZXJlbmNlOiAnbWVkaWFuJyxcbiAgLy8gc3VpdGFiaWxpdHkgb2YgYSBkYXRhIHBvaW50IHRvIHNlcnZlIGFzIGFuIGV4ZW1wbGFyXG4gIGRhbXBpbmc6IDAuOCxcbiAgLy8gZGFtcGluZyBmYWN0b3IgYmV0d2VlbiBbMC41LCAxKVxuICBtYXhJdGVyYXRpb25zOiAxMDAwLFxuICAvLyBtYXggbnVtYmVyIG9mIGl0ZXJhdGlvbnMgdG8gcnVuXG4gIG1pbkl0ZXJhdGlvbnM6IDEwMCxcbiAgLy8gbWluIG51bWJlciBvZiBpdGVyYXRpb25zIHRvIHJ1biBpbiBvcmRlciBmb3IgY2x1c3RlcmluZyB0byBzdG9wXG4gIGF0dHJpYnV0ZXM6IFsvLyBmdW5jdGlvbnMgdG8gcXVhbnRpZnkgdGhlIHNpbWlsYXJpdHkgYmV0d2VlbiBhbnkgdHdvIHBvaW50c1xuICAgIC8vIGUuZy4gbm9kZSA9PiBub2RlLmRhdGEoJ3dlaWdodCcpXG4gIF1cbn0pO1xudmFyIHNldE9wdGlvbnMgPSBmdW5jdGlvbiBzZXRPcHRpb25zKG9wdGlvbnMpIHtcbiAgdmFyIGRtcCA9IG9wdGlvbnMuZGFtcGluZztcbiAgdmFyIHByZWYgPSBvcHRpb25zLnByZWZlcmVuY2U7XG4gIGlmICghKDAuNSA8PSBkbXAgJiYgZG1wIDwgMSkpIHtcbiAgICBlcnJvcihcIkRhbXBpbmcgbXVzdCByYW5nZSBvbiBbMC41LCAxKS4gIEdvdDogXCIuY29uY2F0KGRtcCkpO1xuICB9XG4gIHZhciB2YWxpZFByZWZzID0gWydtZWRpYW4nLCAnbWVhbicsICdtaW4nLCAnbWF4J107XG4gIGlmICghKHZhbGlkUHJlZnMuc29tZShmdW5jdGlvbiAodikge1xuICAgIHJldHVybiB2ID09PSBwcmVmO1xuICB9KSB8fCBudW1iZXIkMShwcmVmKSkpIHtcbiAgICBlcnJvcihcIlByZWZlcmVuY2UgbXVzdCBiZSBvbmUgb2YgW1wiLmNvbmNhdCh2YWxpZFByZWZzLm1hcChmdW5jdGlvbiAocCkge1xuICAgICAgcmV0dXJuIFwiJ1wiLmNvbmNhdChwLCBcIidcIik7XG4gICAgfSkuam9pbignLCAnKSwgXCJdIG9yIGEgbnVtYmVyLiAgR290OiBcIikuY29uY2F0KHByZWYpKTtcbiAgfVxuICByZXR1cm4gZGVmYXVsdHMkOShvcHRpb25zKTtcbn07XG5cbnZhciBnZXRTaW1pbGFyaXR5ID0gZnVuY3Rpb24gZ2V0U2ltaWxhcml0eSh0eXBlLCBuMSwgbjIsIGF0dHJpYnV0ZXMpIHtcbiAgdmFyIGF0dHIgPSBmdW5jdGlvbiBhdHRyKG4sIGkpIHtcbiAgICByZXR1cm4gYXR0cmlidXRlc1tpXShuKTtcbiAgfTtcblxuICAvLyBuYiBuZWdhdGl2ZSBiZWNhdXNlIHNpbWlsYXJpdHkgc2hvdWxkIGhhdmUgYW4gaW52ZXJzZSByZWxhdGlvbnNoaXAgdG8gZGlzdGFuY2VcbiAgcmV0dXJuIC1jbHVzdGVyaW5nRGlzdGFuY2UodHlwZSwgYXR0cmlidXRlcy5sZW5ndGgsIGZ1bmN0aW9uIChpKSB7XG4gICAgcmV0dXJuIGF0dHIobjEsIGkpO1xuICB9LCBmdW5jdGlvbiAoaSkge1xuICAgIHJldHVybiBhdHRyKG4yLCBpKTtcbiAgfSwgbjEsIG4yKTtcbn07XG52YXIgZ2V0UHJlZmVyZW5jZSA9IGZ1bmN0aW9uIGdldFByZWZlcmVuY2UoUywgcHJlZmVyZW5jZSkge1xuICAvLyBsYXJnZXIgcHJlZmVyZW5jZSA9IGdyZWF0ZXIgIyBvZiBjbHVzdGVyc1xuICB2YXIgcCA9IG51bGw7XG4gIGlmIChwcmVmZXJlbmNlID09PSAnbWVkaWFuJykge1xuICAgIHAgPSBtZWRpYW4oUyk7XG4gIH0gZWxzZSBpZiAocHJlZmVyZW5jZSA9PT0gJ21lYW4nKSB7XG4gICAgcCA9IG1lYW4oUyk7XG4gIH0gZWxzZSBpZiAocHJlZmVyZW5jZSA9PT0gJ21pbicpIHtcbiAgICBwID0gbWluKFMpO1xuICB9IGVsc2UgaWYgKHByZWZlcmVuY2UgPT09ICdtYXgnKSB7XG4gICAgcCA9IG1heChTKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBDdXN0b20gcHJlZmVyZW5jZSBudW1iZXIsIGFzIHNldCBieSB1c2VyXG4gICAgcCA9IHByZWZlcmVuY2U7XG4gIH1cbiAgcmV0dXJuIHA7XG59O1xudmFyIGZpbmRFeGVtcGxhcnMgPSBmdW5jdGlvbiBmaW5kRXhlbXBsYXJzKG4sIFIsIEEpIHtcbiAgdmFyIGluZGljZXMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICBpZiAoUltpICogbiArIGldICsgQVtpICogbiArIGldID4gMCkge1xuICAgICAgaW5kaWNlcy5wdXNoKGkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaW5kaWNlcztcbn07XG52YXIgYXNzaWduQ2x1c3RlcnMgPSBmdW5jdGlvbiBhc3NpZ25DbHVzdGVycyhuLCBTLCBleGVtcGxhcnMpIHtcbiAgdmFyIGNsdXN0ZXJzID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgdmFyIGluZGV4ID0gLTE7XG4gICAgdmFyIG1heCA9IC1JbmZpbml0eTtcbiAgICBmb3IgKHZhciBlaSA9IDA7IGVpIDwgZXhlbXBsYXJzLmxlbmd0aDsgZWkrKykge1xuICAgICAgdmFyIGUgPSBleGVtcGxhcnNbZWldO1xuICAgICAgaWYgKFNbaSAqIG4gKyBlXSA+IG1heCkge1xuICAgICAgICBpbmRleCA9IGU7XG4gICAgICAgIG1heCA9IFNbaSAqIG4gKyBlXTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGluZGV4ID4gMCkge1xuICAgICAgY2x1c3RlcnMucHVzaChpbmRleCk7XG4gICAgfVxuICB9XG4gIGZvciAodmFyIF9laSA9IDA7IF9laSA8IGV4ZW1wbGFycy5sZW5ndGg7IF9laSsrKSB7XG4gICAgY2x1c3RlcnNbZXhlbXBsYXJzW19laV1dID0gZXhlbXBsYXJzW19laV07XG4gIH1cbiAgcmV0dXJuIGNsdXN0ZXJzO1xufTtcbnZhciBhc3NpZ24gPSBmdW5jdGlvbiBhc3NpZ24obiwgUywgZXhlbXBsYXJzKSB7XG4gIHZhciBjbHVzdGVycyA9IGFzc2lnbkNsdXN0ZXJzKG4sIFMsIGV4ZW1wbGFycyk7XG4gIGZvciAodmFyIGVpID0gMDsgZWkgPCBleGVtcGxhcnMubGVuZ3RoOyBlaSsrKSB7XG4gICAgdmFyIGlpID0gW107XG4gICAgZm9yICh2YXIgYyA9IDA7IGMgPCBjbHVzdGVycy5sZW5ndGg7IGMrKykge1xuICAgICAgaWYgKGNsdXN0ZXJzW2NdID09PSBleGVtcGxhcnNbZWldKSB7XG4gICAgICAgIGlpLnB1c2goYyk7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBtYXhJID0gLTE7XG4gICAgdmFyIG1heFN1bSA9IC1JbmZpbml0eTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlpLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc3VtID0gMDtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgaWkubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgc3VtICs9IFNbaWlbal0gKiBuICsgaWlbaV1dO1xuICAgICAgfVxuICAgICAgaWYgKHN1bSA+IG1heFN1bSkge1xuICAgICAgICBtYXhJID0gaTtcbiAgICAgICAgbWF4U3VtID0gc3VtO1xuICAgICAgfVxuICAgIH1cbiAgICBleGVtcGxhcnNbZWldID0gaWlbbWF4SV07XG4gIH1cbiAgY2x1c3RlcnMgPSBhc3NpZ25DbHVzdGVycyhuLCBTLCBleGVtcGxhcnMpO1xuICByZXR1cm4gY2x1c3RlcnM7XG59O1xudmFyIGFmZmluaXR5UHJvcGFnYXRpb24gPSBmdW5jdGlvbiBhZmZpbml0eVByb3BhZ2F0aW9uKG9wdGlvbnMpIHtcbiAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICB2YXIgbm9kZXMgPSB0aGlzLm5vZGVzKCk7XG4gIHZhciBvcHRzID0gc2V0T3B0aW9ucyhvcHRpb25zKTtcblxuICAvLyBNYXAgZWFjaCBub2RlIHRvIGl0cyBwb3NpdGlvbiBpbiBub2RlIGFycmF5XG4gIHZhciBpZDJwb3NpdGlvbiA9IHt9O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWQycG9zaXRpb25bbm9kZXNbaV0uaWQoKV0gPSBpO1xuICB9XG5cbiAgLy8gQmVnaW4gYWZmaW5pdHkgcHJvcGFnYXRpb24gYWxnb3JpdGhtXG5cbiAgdmFyIG47IC8vIG51bWJlciBvZiBkYXRhIHBvaW50c1xuICB2YXIgbjI7IC8vIHNpemUgb2YgbWF0cmljZXNcbiAgdmFyIFM7IC8vIHNpbWlsYXJpdHkgbWF0cml4ICgxRCBhcnJheSlcbiAgdmFyIHA7IC8vIHByZWZlcmVuY2Uvc3VpdGFiaWxpdHkgb2YgYSBkYXRhIHBvaW50IHRvIHNlcnZlIGFzIGFuIGV4ZW1wbGFyXG4gIHZhciBSOyAvLyByZXNwb25zaWJpbGl0eSBtYXRyaXggKDFEIGFycmF5KVxuICB2YXIgQTsgLy8gYXZhaWxhYmlsaXR5IG1hdHJpeCAoMUQgYXJyYXkpXG5cbiAgbiA9IG5vZGVzLmxlbmd0aDtcbiAgbjIgPSBuICogbjtcblxuICAvLyBJbml0aWFsaXplIGFuZCBidWlsZCBTIHNpbWlsYXJpdHkgbWF0cml4XG4gIFMgPSBuZXcgQXJyYXkobjIpO1xuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbjI7IF9pKyspIHtcbiAgICBTW19pXSA9IC1JbmZpbml0eTsgLy8gZm9yIGNhc2VzIHdoZXJlIHR3byBkYXRhIHBvaW50cyBzaG91bGRuJ3QgYmUgbGlua2VkIHRvZ2V0aGVyXG4gIH1cbiAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgbjsgX2kyKyspIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG47IGorKykge1xuICAgICAgaWYgKF9pMiAhPT0gaikge1xuICAgICAgICBTW19pMiAqIG4gKyBqXSA9IGdldFNpbWlsYXJpdHkob3B0cy5kaXN0YW5jZSwgbm9kZXNbX2kyXSwgbm9kZXNbal0sIG9wdHMuYXR0cmlidXRlcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gUGxhY2UgcHJlZmVyZW5jZXMgb24gdGhlIGRpYWdvbmFsIG9mIFNcbiAgcCA9IGdldFByZWZlcmVuY2UoUywgb3B0cy5wcmVmZXJlbmNlKTtcbiAgZm9yICh2YXIgX2kzID0gMDsgX2kzIDwgbjsgX2kzKyspIHtcbiAgICBTW19pMyAqIG4gKyBfaTNdID0gcDtcbiAgfVxuXG4gIC8vIEluaXRpYWxpemUgUiByZXNwb25zaWJpbGl0eSBtYXRyaXhcbiAgUiA9IG5ldyBBcnJheShuMik7XG4gIGZvciAodmFyIF9pNCA9IDA7IF9pNCA8IG4yOyBfaTQrKykge1xuICAgIFJbX2k0XSA9IDAuMDtcbiAgfVxuXG4gIC8vIEluaXRpYWxpemUgQSBhdmFpbGFiaWxpdHkgbWF0cml4XG4gIEEgPSBuZXcgQXJyYXkobjIpO1xuICBmb3IgKHZhciBfaTUgPSAwOyBfaTUgPCBuMjsgX2k1KyspIHtcbiAgICBBW19pNV0gPSAwLjA7XG4gIH1cbiAgdmFyIG9sZCA9IG5ldyBBcnJheShuKTtcbiAgdmFyIFJwID0gbmV3IEFycmF5KG4pO1xuICB2YXIgc2UgPSBuZXcgQXJyYXkobik7XG4gIGZvciAodmFyIF9pNiA9IDA7IF9pNiA8IG47IF9pNisrKSB7XG4gICAgb2xkW19pNl0gPSAwLjA7XG4gICAgUnBbX2k2XSA9IDAuMDtcbiAgICBzZVtfaTZdID0gMDtcbiAgfVxuICB2YXIgZSA9IG5ldyBBcnJheShuICogb3B0cy5taW5JdGVyYXRpb25zKTtcbiAgZm9yICh2YXIgX2k3ID0gMDsgX2k3IDwgZS5sZW5ndGg7IF9pNysrKSB7XG4gICAgZVtfaTddID0gMDtcbiAgfVxuICB2YXIgaXRlcjtcbiAgZm9yIChpdGVyID0gMDsgaXRlciA8IG9wdHMubWF4SXRlcmF0aW9uczsgaXRlcisrKSB7XG4gICAgLy8gbWFpbiBhbGdvcml0aG1pYyBsb29wXG5cbiAgICAvLyBVcGRhdGUgUiByZXNwb25zaWJpbGl0eSBtYXRyaXhcbiAgICBmb3IgKHZhciBfaTggPSAwOyBfaTggPCBuOyBfaTgrKykge1xuICAgICAgdmFyIG1heCA9IC1JbmZpbml0eSxcbiAgICAgICAgbWF4MiA9IC1JbmZpbml0eSxcbiAgICAgICAgbWF4SSA9IC0xLFxuICAgICAgICBBUyA9IDAuMDtcbiAgICAgIGZvciAodmFyIF9qID0gMDsgX2ogPCBuOyBfaisrKSB7XG4gICAgICAgIG9sZFtfal0gPSBSW19pOCAqIG4gKyBfal07XG4gICAgICAgIEFTID0gQVtfaTggKiBuICsgX2pdICsgU1tfaTggKiBuICsgX2pdO1xuICAgICAgICBpZiAoQVMgPj0gbWF4KSB7XG4gICAgICAgICAgbWF4MiA9IG1heDtcbiAgICAgICAgICBtYXggPSBBUztcbiAgICAgICAgICBtYXhJID0gX2o7XG4gICAgICAgIH0gZWxzZSBpZiAoQVMgPiBtYXgyKSB7XG4gICAgICAgICAgbWF4MiA9IEFTO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBfajIgPSAwOyBfajIgPCBuOyBfajIrKykge1xuICAgICAgICBSW19pOCAqIG4gKyBfajJdID0gKDEgLSBvcHRzLmRhbXBpbmcpICogKFNbX2k4ICogbiArIF9qMl0gLSBtYXgpICsgb3B0cy5kYW1waW5nICogb2xkW19qMl07XG4gICAgICB9XG4gICAgICBSW19pOCAqIG4gKyBtYXhJXSA9ICgxIC0gb3B0cy5kYW1waW5nKSAqIChTW19pOCAqIG4gKyBtYXhJXSAtIG1heDIpICsgb3B0cy5kYW1waW5nICogb2xkW21heEldO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBBIGF2YWlsYWJpbGl0eSBtYXRyaXhcbiAgICBmb3IgKHZhciBfaTkgPSAwOyBfaTkgPCBuOyBfaTkrKykge1xuICAgICAgdmFyIHN1bSA9IDA7XG4gICAgICBmb3IgKHZhciBfajMgPSAwOyBfajMgPCBuOyBfajMrKykge1xuICAgICAgICBvbGRbX2ozXSA9IEFbX2ozICogbiArIF9pOV07XG4gICAgICAgIFJwW19qM10gPSBNYXRoLm1heCgwLCBSW19qMyAqIG4gKyBfaTldKTtcbiAgICAgICAgc3VtICs9IFJwW19qM107XG4gICAgICB9XG4gICAgICBzdW0gLT0gUnBbX2k5XTtcbiAgICAgIFJwW19pOV0gPSBSW19pOSAqIG4gKyBfaTldO1xuICAgICAgc3VtICs9IFJwW19pOV07XG4gICAgICBmb3IgKHZhciBfajQgPSAwOyBfajQgPCBuOyBfajQrKykge1xuICAgICAgICBBW19qNCAqIG4gKyBfaTldID0gKDEgLSBvcHRzLmRhbXBpbmcpICogTWF0aC5taW4oMCwgc3VtIC0gUnBbX2o0XSkgKyBvcHRzLmRhbXBpbmcgKiBvbGRbX2o0XTtcbiAgICAgIH1cbiAgICAgIEFbX2k5ICogbiArIF9pOV0gPSAoMSAtIG9wdHMuZGFtcGluZykgKiAoc3VtIC0gUnBbX2k5XSkgKyBvcHRzLmRhbXBpbmcgKiBvbGRbX2k5XTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgY29udmVyZ2VuY2VcbiAgICB2YXIgSyA9IDA7XG4gICAgZm9yICh2YXIgX2kwID0gMDsgX2kwIDwgbjsgX2kwKyspIHtcbiAgICAgIHZhciBFID0gQVtfaTAgKiBuICsgX2kwXSArIFJbX2kwICogbiArIF9pMF0gPiAwID8gMSA6IDA7XG4gICAgICBlW2l0ZXIgJSBvcHRzLm1pbkl0ZXJhdGlvbnMgKiBuICsgX2kwXSA9IEU7XG4gICAgICBLICs9IEU7XG4gICAgfVxuICAgIGlmIChLID4gMCAmJiAoaXRlciA+PSBvcHRzLm1pbkl0ZXJhdGlvbnMgLSAxIHx8IGl0ZXIgPT0gb3B0cy5tYXhJdGVyYXRpb25zIC0gMSkpIHtcbiAgICAgIHZhciBfc3VtID0gMDtcbiAgICAgIGZvciAodmFyIF9pMSA9IDA7IF9pMSA8IG47IF9pMSsrKSB7XG4gICAgICAgIHNlW19pMV0gPSAwO1xuICAgICAgICBmb3IgKHZhciBfajUgPSAwOyBfajUgPCBvcHRzLm1pbkl0ZXJhdGlvbnM7IF9qNSsrKSB7XG4gICAgICAgICAgc2VbX2kxXSArPSBlW19qNSAqIG4gKyBfaTFdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZVtfaTFdID09PSAwIHx8IHNlW19pMV0gPT09IG9wdHMubWluSXRlcmF0aW9ucykge1xuICAgICAgICAgIF9zdW0rKztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKF9zdW0gPT09IG4pIHtcbiAgICAgICAgLy8gdGhlbiB3ZSBoYXZlIGNvbnZlcmdlbmNlXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIElkZW50aWZ5IGV4ZW1wbGFycyAoY2x1c3RlciBjZW50ZXJzKVxuICB2YXIgZXhlbXBsYXJzSW5kaWNlcyA9IGZpbmRFeGVtcGxhcnMobiwgUiwgQSk7XG5cbiAgLy8gQXNzaWduIG5vZGVzIHRvIGNsdXN0ZXJzXG4gIHZhciBjbHVzdGVySW5kaWNlcyA9IGFzc2lnbihuLCBTLCBleGVtcGxhcnNJbmRpY2VzKTtcbiAgdmFyIGNsdXN0ZXJzID0ge307XG4gIGZvciAodmFyIGMgPSAwOyBjIDwgZXhlbXBsYXJzSW5kaWNlcy5sZW5ndGg7IGMrKykge1xuICAgIGNsdXN0ZXJzW2V4ZW1wbGFyc0luZGljZXNbY11dID0gW107XG4gIH1cbiAgZm9yICh2YXIgX2kxMCA9IDA7IF9pMTAgPCBub2Rlcy5sZW5ndGg7IF9pMTArKykge1xuICAgIHZhciBwb3MgPSBpZDJwb3NpdGlvbltub2Rlc1tfaTEwXS5pZCgpXTtcbiAgICB2YXIgY2x1c3RlckluZGV4ID0gY2x1c3RlckluZGljZXNbcG9zXTtcbiAgICBpZiAoY2x1c3RlckluZGV4ICE9IG51bGwpIHtcbiAgICAgIC8vIHRoZSBub2RlIG1heSBoYXZlIG5vdCBiZWVuIGFzc2lnbmVkIGEgY2x1c3RlciBpZiBubyB2YWxpZCBhdHRyaWJ1dGVzIHdlcmUgc3BlY2lmaWVkXG4gICAgICBjbHVzdGVyc1tjbHVzdGVySW5kZXhdLnB1c2gobm9kZXNbX2kxMF0pO1xuICAgIH1cbiAgfVxuICB2YXIgcmV0Q2x1c3RlcnMgPSBuZXcgQXJyYXkoZXhlbXBsYXJzSW5kaWNlcy5sZW5ndGgpO1xuICBmb3IgKHZhciBfYyA9IDA7IF9jIDwgZXhlbXBsYXJzSW5kaWNlcy5sZW5ndGg7IF9jKyspIHtcbiAgICByZXRDbHVzdGVyc1tfY10gPSBjeS5jb2xsZWN0aW9uKGNsdXN0ZXJzW2V4ZW1wbGFyc0luZGljZXNbX2NdXSk7XG4gIH1cbiAgcmV0dXJuIHJldENsdXN0ZXJzO1xufTtcbnZhciBhZmZpbml0eVByb3BhZ2F0aW9uJDEgPSB7XG4gIGFmZmluaXR5UHJvcGFnYXRpb246IGFmZmluaXR5UHJvcGFnYXRpb24sXG4gIGFwOiBhZmZpbml0eVByb3BhZ2F0aW9uXG59O1xuXG52YXIgaGllcmhvbHplckRlZmF1bHRzID0gZGVmYXVsdHMkZyh7XG4gIHJvb3Q6IHVuZGVmaW5lZCxcbiAgZGlyZWN0ZWQ6IGZhbHNlXG59KTtcbnZhciBlbGVzZm4kayA9IHtcbiAgaGllcmhvbHplcjogZnVuY3Rpb24gaGllcmhvbHplcihvcHRpb25zKSB7XG4gICAgaWYgKCFwbGFpbk9iamVjdChvcHRpb25zKSkge1xuICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICBvcHRpb25zID0ge1xuICAgICAgICByb290OiBhcmdzWzBdLFxuICAgICAgICBkaXJlY3RlZDogYXJnc1sxXVxuICAgICAgfTtcbiAgICB9XG4gICAgdmFyIF9oaWVyaG9semVyRGVmYXVsdHMgPSBoaWVyaG9semVyRGVmYXVsdHMob3B0aW9ucyksXG4gICAgICByb290ID0gX2hpZXJob2x6ZXJEZWZhdWx0cy5yb290LFxuICAgICAgZGlyZWN0ZWQgPSBfaGllcmhvbHplckRlZmF1bHRzLmRpcmVjdGVkO1xuICAgIHZhciBlbGVzID0gdGhpcztcbiAgICB2YXIgZGZsYWcgPSBmYWxzZTtcbiAgICB2YXIgb2RkSW47XG4gICAgdmFyIG9kZE91dDtcbiAgICB2YXIgc3RhcnRWZXJ0ZXg7XG4gICAgaWYgKHJvb3QpIHN0YXJ0VmVydGV4ID0gc3RyaW5nKHJvb3QpID8gdGhpcy5maWx0ZXIocm9vdClbMF0uaWQoKSA6IHJvb3RbMF0uaWQoKTtcbiAgICB2YXIgbm9kZXMgPSB7fTtcbiAgICB2YXIgZWRnZXMgPSB7fTtcbiAgICBpZiAoZGlyZWN0ZWQpIHtcbiAgICAgIGVsZXMuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgIHZhciBpZCA9IGVsZS5pZCgpO1xuICAgICAgICBpZiAoZWxlLmlzTm9kZSgpKSB7XG4gICAgICAgICAgdmFyIGluZCA9IGVsZS5pbmRlZ3JlZSh0cnVlKTtcbiAgICAgICAgICB2YXIgb3V0ZCA9IGVsZS5vdXRkZWdyZWUodHJ1ZSk7XG4gICAgICAgICAgdmFyIGQxID0gaW5kIC0gb3V0ZDtcbiAgICAgICAgICB2YXIgZDIgPSBvdXRkIC0gaW5kO1xuICAgICAgICAgIGlmIChkMSA9PSAxKSB7XG4gICAgICAgICAgICBpZiAob2RkSW4pIGRmbGFnID0gdHJ1ZTtlbHNlIG9kZEluID0gaWQ7XG4gICAgICAgICAgfSBlbHNlIGlmIChkMiA9PSAxKSB7XG4gICAgICAgICAgICBpZiAob2RkT3V0KSBkZmxhZyA9IHRydWU7ZWxzZSBvZGRPdXQgPSBpZDtcbiAgICAgICAgICB9IGVsc2UgaWYgKGQyID4gMSB8fCBkMSA+IDEpIHtcbiAgICAgICAgICAgIGRmbGFnID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbm9kZXNbaWRdID0gW107XG4gICAgICAgICAgZWxlLm91dGdvZXJzKCkuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgaWYgKGUuaXNFZGdlKCkpIG5vZGVzW2lkXS5wdXNoKGUuaWQoKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZWRnZXNbaWRdID0gW3VuZGVmaW5lZCwgZWxlLnRhcmdldCgpLmlkKCldO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlcy5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgdmFyIGlkID0gZWxlLmlkKCk7XG4gICAgICAgIGlmIChlbGUuaXNOb2RlKCkpIHtcbiAgICAgICAgICB2YXIgZCA9IGVsZS5kZWdyZWUodHJ1ZSk7XG4gICAgICAgICAgaWYgKGQgJSAyKSB7XG4gICAgICAgICAgICBpZiAoIW9kZEluKSBvZGRJbiA9IGlkO2Vsc2UgaWYgKCFvZGRPdXQpIG9kZE91dCA9IGlkO2Vsc2UgZGZsYWcgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBub2Rlc1tpZF0gPSBbXTtcbiAgICAgICAgICBlbGUuY29ubmVjdGVkRWRnZXMoKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZXNbaWRdLnB1c2goZS5pZCgpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlZGdlc1tpZF0gPSBbZWxlLnNvdXJjZSgpLmlkKCksIGVsZS50YXJnZXQoKS5pZCgpXTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHZhciByZXN1bHQgPSB7XG4gICAgICBmb3VuZDogZmFsc2UsXG4gICAgICB0cmFpbDogdW5kZWZpbmVkXG4gICAgfTtcbiAgICBpZiAoZGZsYWcpIHJldHVybiByZXN1bHQ7ZWxzZSBpZiAob2RkT3V0ICYmIG9kZEluKSB7XG4gICAgICBpZiAoZGlyZWN0ZWQpIHtcbiAgICAgICAgaWYgKHN0YXJ0VmVydGV4ICYmIG9kZE91dCAhPSBzdGFydFZlcnRleCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgc3RhcnRWZXJ0ZXggPSBvZGRPdXQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoc3RhcnRWZXJ0ZXggJiYgb2RkT3V0ICE9IHN0YXJ0VmVydGV4ICYmIG9kZEluICE9IHN0YXJ0VmVydGV4KSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSBlbHNlIGlmICghc3RhcnRWZXJ0ZXgpIHtcbiAgICAgICAgICBzdGFydFZlcnRleCA9IG9kZE91dDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIXN0YXJ0VmVydGV4KSBzdGFydFZlcnRleCA9IGVsZXNbMF0uaWQoKTtcbiAgICB9XG4gICAgdmFyIHdhbGsgPSBmdW5jdGlvbiB3YWxrKHYpIHtcbiAgICAgIHZhciBjdXJyZW50Tm9kZSA9IHY7XG4gICAgICB2YXIgc3VidG91ciA9IFt2XTtcbiAgICAgIHZhciBhZGosIGFkalRhaWwsIGFkakhlYWQ7XG4gICAgICB3aGlsZSAobm9kZXNbY3VycmVudE5vZGVdLmxlbmd0aCkge1xuICAgICAgICBhZGogPSBub2Rlc1tjdXJyZW50Tm9kZV0uc2hpZnQoKTtcbiAgICAgICAgYWRqVGFpbCA9IGVkZ2VzW2Fkal1bMF07XG4gICAgICAgIGFkakhlYWQgPSBlZGdlc1thZGpdWzFdO1xuICAgICAgICBpZiAoY3VycmVudE5vZGUgIT0gYWRqSGVhZCkge1xuICAgICAgICAgIG5vZGVzW2FkakhlYWRdID0gbm9kZXNbYWRqSGVhZF0uZmlsdGVyKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gZSAhPSBhZGo7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY3VycmVudE5vZGUgPSBhZGpIZWFkO1xuICAgICAgICB9IGVsc2UgaWYgKCFkaXJlY3RlZCAmJiBjdXJyZW50Tm9kZSAhPSBhZGpUYWlsKSB7XG4gICAgICAgICAgbm9kZXNbYWRqVGFpbF0gPSBub2Rlc1thZGpUYWlsXS5maWx0ZXIoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBlICE9IGFkajtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjdXJyZW50Tm9kZSA9IGFkalRhaWw7XG4gICAgICAgIH1cbiAgICAgICAgc3VidG91ci51bnNoaWZ0KGFkaik7XG4gICAgICAgIHN1YnRvdXIudW5zaGlmdChjdXJyZW50Tm9kZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3VidG91cjtcbiAgICB9O1xuICAgIHZhciB0cmFpbCA9IFtdO1xuICAgIHZhciBzdWJ0b3VyID0gW107XG4gICAgc3VidG91ciA9IHdhbGsoc3RhcnRWZXJ0ZXgpO1xuICAgIHdoaWxlIChzdWJ0b3VyLmxlbmd0aCAhPSAxKSB7XG4gICAgICBpZiAobm9kZXNbc3VidG91clswXV0ubGVuZ3RoID09IDApIHtcbiAgICAgICAgdHJhaWwudW5zaGlmdChlbGVzLmdldEVsZW1lbnRCeUlkKHN1YnRvdXIuc2hpZnQoKSkpO1xuICAgICAgICB0cmFpbC51bnNoaWZ0KGVsZXMuZ2V0RWxlbWVudEJ5SWQoc3VidG91ci5zaGlmdCgpKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdWJ0b3VyID0gd2FsayhzdWJ0b3VyLnNoaWZ0KCkpLmNvbmNhdChzdWJ0b3VyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdHJhaWwudW5zaGlmdChlbGVzLmdldEVsZW1lbnRCeUlkKHN1YnRvdXIuc2hpZnQoKSkpOyAvLyBmaW5hbCBub2RlXG5cbiAgICBmb3IgKHZhciBkIGluIG5vZGVzKSB7XG4gICAgICBpZiAobm9kZXNbZF0ubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJlc3VsdC5mb3VuZCA9IHRydWU7XG4gICAgcmVzdWx0LnRyYWlsID0gdGhpcy5zcGF3bih0cmFpbCwgdHJ1ZSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufTtcblxudmFyIGhvcGNyb2Z0VGFyamFuQmljb25uZWN0ZWQgPSBmdW5jdGlvbiBob3Bjcm9mdFRhcmphbkJpY29ubmVjdGVkKCkge1xuICB2YXIgZWxlcyA9IHRoaXM7XG4gIHZhciBub2RlcyA9IHt9O1xuICB2YXIgaWQgPSAwO1xuICB2YXIgZWRnZUNvdW50ID0gMDtcbiAgdmFyIGNvbXBvbmVudHMgPSBbXTtcbiAgdmFyIHN0YWNrID0gW107XG4gIHZhciB2aXNpdGVkRWRnZXMgPSB7fTtcbiAgdmFyIGJ1aWxkQ29tcG9uZW50ID0gZnVuY3Rpb24gYnVpbGRDb21wb25lbnQoeCwgeSkge1xuICAgIHZhciBpID0gc3RhY2subGVuZ3RoIC0gMTtcbiAgICB2YXIgY3V0c2V0ID0gW107XG4gICAgdmFyIGNvbXBvbmVudCA9IGVsZXMuc3Bhd24oKTtcbiAgICB3aGlsZSAoc3RhY2tbaV0ueCAhPSB4IHx8IHN0YWNrW2ldLnkgIT0geSkge1xuICAgICAgY3V0c2V0LnB1c2goc3RhY2sucG9wKCkuZWRnZSk7XG4gICAgICBpLS07XG4gICAgfVxuICAgIGN1dHNldC5wdXNoKHN0YWNrLnBvcCgpLmVkZ2UpO1xuICAgIGN1dHNldC5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICB2YXIgY29ubmVjdGVkTm9kZXMgPSBlZGdlLmNvbm5lY3RlZE5vZGVzKCkuaW50ZXJzZWN0aW9uKGVsZXMpO1xuICAgICAgY29tcG9uZW50Lm1lcmdlKGVkZ2UpO1xuICAgICAgY29ubmVjdGVkTm9kZXMuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICB2YXIgbm9kZUlkID0gbm9kZS5pZCgpO1xuICAgICAgICB2YXIgY29ubmVjdGVkRWRnZXMgPSBub2RlLmNvbm5lY3RlZEVkZ2VzKCkuaW50ZXJzZWN0aW9uKGVsZXMpO1xuICAgICAgICBjb21wb25lbnQubWVyZ2Uobm9kZSk7XG4gICAgICAgIGlmICghbm9kZXNbbm9kZUlkXS5jdXRWZXJ0ZXgpIHtcbiAgICAgICAgICBjb21wb25lbnQubWVyZ2UoY29ubmVjdGVkRWRnZXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbXBvbmVudC5tZXJnZShjb25uZWN0ZWRFZGdlcy5maWx0ZXIoZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICAgICAgICAgIHJldHVybiBlZGdlLmlzTG9vcCgpO1xuICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgY29tcG9uZW50cy5wdXNoKGNvbXBvbmVudCk7XG4gIH07XG4gIHZhciBfYmljb25uZWN0ZWRTZWFyY2ggPSBmdW5jdGlvbiBiaWNvbm5lY3RlZFNlYXJjaChyb290LCBjdXJyZW50Tm9kZSwgcGFyZW50KSB7XG4gICAgaWYgKHJvb3QgPT09IHBhcmVudCkgZWRnZUNvdW50ICs9IDE7XG4gICAgbm9kZXNbY3VycmVudE5vZGVdID0ge1xuICAgICAgaWQ6IGlkLFxuICAgICAgbG93OiBpZCsrLFxuICAgICAgY3V0VmVydGV4OiBmYWxzZVxuICAgIH07XG4gICAgdmFyIGVkZ2VzID0gZWxlcy5nZXRFbGVtZW50QnlJZChjdXJyZW50Tm9kZSkuY29ubmVjdGVkRWRnZXMoKS5pbnRlcnNlY3Rpb24oZWxlcyk7XG4gICAgaWYgKGVkZ2VzLnNpemUoKSA9PT0gMCkge1xuICAgICAgY29tcG9uZW50cy5wdXNoKGVsZXMuc3Bhd24oZWxlcy5nZXRFbGVtZW50QnlJZChjdXJyZW50Tm9kZSkpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHNvdXJjZUlkLCB0YXJnZXRJZCwgb3RoZXJOb2RlSWQsIGVkZ2VJZDtcbiAgICAgIGVkZ2VzLmZvckVhY2goZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICAgICAgc291cmNlSWQgPSBlZGdlLnNvdXJjZSgpLmlkKCk7XG4gICAgICAgIHRhcmdldElkID0gZWRnZS50YXJnZXQoKS5pZCgpO1xuICAgICAgICBvdGhlck5vZGVJZCA9IHNvdXJjZUlkID09PSBjdXJyZW50Tm9kZSA/IHRhcmdldElkIDogc291cmNlSWQ7XG4gICAgICAgIGlmIChvdGhlck5vZGVJZCAhPT0gcGFyZW50KSB7XG4gICAgICAgICAgZWRnZUlkID0gZWRnZS5pZCgpO1xuICAgICAgICAgIGlmICghdmlzaXRlZEVkZ2VzW2VkZ2VJZF0pIHtcbiAgICAgICAgICAgIHZpc2l0ZWRFZGdlc1tlZGdlSWRdID0gdHJ1ZTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2goe1xuICAgICAgICAgICAgICB4OiBjdXJyZW50Tm9kZSxcbiAgICAgICAgICAgICAgeTogb3RoZXJOb2RlSWQsXG4gICAgICAgICAgICAgIGVkZ2U6IGVkZ2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIShvdGhlck5vZGVJZCBpbiBub2RlcykpIHtcbiAgICAgICAgICAgIF9iaWNvbm5lY3RlZFNlYXJjaChyb290LCBvdGhlck5vZGVJZCwgY3VycmVudE5vZGUpO1xuICAgICAgICAgICAgbm9kZXNbY3VycmVudE5vZGVdLmxvdyA9IE1hdGgubWluKG5vZGVzW2N1cnJlbnROb2RlXS5sb3csIG5vZGVzW290aGVyTm9kZUlkXS5sb3cpO1xuICAgICAgICAgICAgaWYgKG5vZGVzW2N1cnJlbnROb2RlXS5pZCA8PSBub2Rlc1tvdGhlck5vZGVJZF0ubG93KSB7XG4gICAgICAgICAgICAgIG5vZGVzW2N1cnJlbnROb2RlXS5jdXRWZXJ0ZXggPSB0cnVlO1xuICAgICAgICAgICAgICBidWlsZENvbXBvbmVudChjdXJyZW50Tm9kZSwgb3RoZXJOb2RlSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBub2Rlc1tjdXJyZW50Tm9kZV0ubG93ID0gTWF0aC5taW4obm9kZXNbY3VycmVudE5vZGVdLmxvdywgbm9kZXNbb3RoZXJOb2RlSWRdLmlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgZWxlcy5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHtcbiAgICBpZiAoZWxlLmlzTm9kZSgpKSB7XG4gICAgICB2YXIgbm9kZUlkID0gZWxlLmlkKCk7XG4gICAgICBpZiAoIShub2RlSWQgaW4gbm9kZXMpKSB7XG4gICAgICAgIGVkZ2VDb3VudCA9IDA7XG4gICAgICAgIF9iaWNvbm5lY3RlZFNlYXJjaChub2RlSWQsIG5vZGVJZCk7XG4gICAgICAgIG5vZGVzW25vZGVJZF0uY3V0VmVydGV4ID0gZWRnZUNvdW50ID4gMTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICB2YXIgY3V0VmVydGljZXMgPSBPYmplY3Qua2V5cyhub2RlcykuZmlsdGVyKGZ1bmN0aW9uIChpZCkge1xuICAgIHJldHVybiBub2Rlc1tpZF0uY3V0VmVydGV4O1xuICB9KS5tYXAoZnVuY3Rpb24gKGlkKSB7XG4gICAgcmV0dXJuIGVsZXMuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICB9KTtcbiAgcmV0dXJuIHtcbiAgICBjdXQ6IGVsZXMuc3Bhd24oY3V0VmVydGljZXMpLFxuICAgIGNvbXBvbmVudHM6IGNvbXBvbmVudHNcbiAgfTtcbn07XG52YXIgaG9wY3JvZnRUYXJqYW5CaWNvbm5lY3RlZCQxID0ge1xuICBob3Bjcm9mdFRhcmphbkJpY29ubmVjdGVkOiBob3Bjcm9mdFRhcmphbkJpY29ubmVjdGVkLFxuICBodGJjOiBob3Bjcm9mdFRhcmphbkJpY29ubmVjdGVkLFxuICBodGI6IGhvcGNyb2Z0VGFyamFuQmljb25uZWN0ZWQsXG4gIGhvcGNyb2Z0VGFyamFuQmljb25uZWN0ZWRDb21wb25lbnRzOiBob3Bjcm9mdFRhcmphbkJpY29ubmVjdGVkXG59O1xuXG52YXIgdGFyamFuU3Ryb25nbHlDb25uZWN0ZWQgPSBmdW5jdGlvbiB0YXJqYW5TdHJvbmdseUNvbm5lY3RlZCgpIHtcbiAgdmFyIGVsZXMgPSB0aGlzO1xuICB2YXIgbm9kZXMgPSB7fTtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGNvbXBvbmVudHMgPSBbXTtcbiAgdmFyIHN0YWNrID0gW107XG4gIHZhciBjdXQgPSBlbGVzLnNwYXduKGVsZXMpO1xuICB2YXIgX3N0cm9uZ2x5Q29ubmVjdGVkU2VhcmNoID0gZnVuY3Rpb24gc3Ryb25nbHlDb25uZWN0ZWRTZWFyY2goc291cmNlTm9kZUlkKSB7XG4gICAgc3RhY2sucHVzaChzb3VyY2VOb2RlSWQpO1xuICAgIG5vZGVzW3NvdXJjZU5vZGVJZF0gPSB7XG4gICAgICBpbmRleDogaW5kZXgsXG4gICAgICBsb3c6IGluZGV4KyssXG4gICAgICBleHBsb3JlZDogZmFsc2VcbiAgICB9O1xuICAgIHZhciBjb25uZWN0ZWRFZGdlcyA9IGVsZXMuZ2V0RWxlbWVudEJ5SWQoc291cmNlTm9kZUlkKS5jb25uZWN0ZWRFZGdlcygpLmludGVyc2VjdGlvbihlbGVzKTtcbiAgICBjb25uZWN0ZWRFZGdlcy5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICB2YXIgdGFyZ2V0Tm9kZUlkID0gZWRnZS50YXJnZXQoKS5pZCgpO1xuICAgICAgaWYgKHRhcmdldE5vZGVJZCAhPT0gc291cmNlTm9kZUlkKSB7XG4gICAgICAgIGlmICghKHRhcmdldE5vZGVJZCBpbiBub2RlcykpIHtcbiAgICAgICAgICBfc3Ryb25nbHlDb25uZWN0ZWRTZWFyY2godGFyZ2V0Tm9kZUlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW5vZGVzW3RhcmdldE5vZGVJZF0uZXhwbG9yZWQpIHtcbiAgICAgICAgICBub2Rlc1tzb3VyY2VOb2RlSWRdLmxvdyA9IE1hdGgubWluKG5vZGVzW3NvdXJjZU5vZGVJZF0ubG93LCBub2Rlc1t0YXJnZXROb2RlSWRdLmxvdyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAobm9kZXNbc291cmNlTm9kZUlkXS5pbmRleCA9PT0gbm9kZXNbc291cmNlTm9kZUlkXS5sb3cpIHtcbiAgICAgIHZhciBjb21wb25lbnROb2RlcyA9IGVsZXMuc3Bhd24oKTtcbiAgICAgIGZvciAoOzspIHtcbiAgICAgICAgdmFyIG5vZGVJZCA9IHN0YWNrLnBvcCgpO1xuICAgICAgICBjb21wb25lbnROb2Rlcy5tZXJnZShlbGVzLmdldEVsZW1lbnRCeUlkKG5vZGVJZCkpO1xuICAgICAgICBub2Rlc1tub2RlSWRdLmxvdyA9IG5vZGVzW3NvdXJjZU5vZGVJZF0uaW5kZXg7XG4gICAgICAgIG5vZGVzW25vZGVJZF0uZXhwbG9yZWQgPSB0cnVlO1xuICAgICAgICBpZiAobm9kZUlkID09PSBzb3VyY2VOb2RlSWQpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIGNvbXBvbmVudEVkZ2VzID0gY29tcG9uZW50Tm9kZXMuZWRnZXNXaXRoKGNvbXBvbmVudE5vZGVzKTtcbiAgICAgIHZhciBjb21wb25lbnQgPSBjb21wb25lbnROb2Rlcy5tZXJnZShjb21wb25lbnRFZGdlcyk7XG4gICAgICBjb21wb25lbnRzLnB1c2goY29tcG9uZW50KTtcbiAgICAgIGN1dCA9IGN1dC5kaWZmZXJlbmNlKGNvbXBvbmVudCk7XG4gICAgfVxuICB9O1xuICBlbGVzLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgIGlmIChlbGUuaXNOb2RlKCkpIHtcbiAgICAgIHZhciBub2RlSWQgPSBlbGUuaWQoKTtcbiAgICAgIGlmICghKG5vZGVJZCBpbiBub2RlcykpIHtcbiAgICAgICAgX3N0cm9uZ2x5Q29ubmVjdGVkU2VhcmNoKG5vZGVJZCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHtcbiAgICBjdXQ6IGN1dCxcbiAgICBjb21wb25lbnRzOiBjb21wb25lbnRzXG4gIH07XG59O1xudmFyIHRhcmphblN0cm9uZ2x5Q29ubmVjdGVkJDEgPSB7XG4gIHRhcmphblN0cm9uZ2x5Q29ubmVjdGVkOiB0YXJqYW5TdHJvbmdseUNvbm5lY3RlZCxcbiAgdHNjOiB0YXJqYW5TdHJvbmdseUNvbm5lY3RlZCxcbiAgdHNjYzogdGFyamFuU3Ryb25nbHlDb25uZWN0ZWQsXG4gIHRhcmphblN0cm9uZ2x5Q29ubmVjdGVkQ29tcG9uZW50czogdGFyamFuU3Ryb25nbHlDb25uZWN0ZWRcbn07XG5cbnZhciBlbGVzZm4kaiA9IHt9O1xuW2VsZXNmbiR2LCBlbGVzZm4kdSwgZWxlc2ZuJHQsIGVsZXNmbiRzLCBlbGVzZm4kciwgZWxlc2ZuJHEsIGVsZXNmbiRwLCBlbGVzZm4kbywgZWxlc2ZuJG4sIGVsZXNmbiRtLCBlbGVzZm4kbCwgbWFya292Q2x1c3RlcmluZyQxLCBrQ2x1c3RlcmluZywgaGllcmFyY2hpY2FsQ2x1c3RlcmluZyQxLCBhZmZpbml0eVByb3BhZ2F0aW9uJDEsIGVsZXNmbiRrLCBob3Bjcm9mdFRhcmphbkJpY29ubmVjdGVkJDEsIHRhcmphblN0cm9uZ2x5Q29ubmVjdGVkJDFdLmZvckVhY2goZnVuY3Rpb24gKHByb3BzKSB7XG4gIGV4dGVuZChlbGVzZm4kaiwgcHJvcHMpO1xufSk7XG5cbi8qIVxuRW1iZWRkYWJsZSBNaW5pbXVtIFN0cmljdGx5LUNvbXBsaWFudCBQcm9taXNlcy9BKyAxLjEuMSBUaGVuYWJsZVxuQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQgUmFsZiBTLiBFbmdlbHNjaGFsbCAoaHR0cDovL2VuZ2Vsc2NoYWxsLmNvbSlcbkxpY2Vuc2VkIHVuZGVyIFRoZSBNSVQgTGljZW5zZSAoaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVClcbiovXG5cbi8qICBwcm9taXNlIHN0YXRlcyBbUHJvbWlzZXMvQSsgMi4xXSAgKi9cbnZhciBTVEFURV9QRU5ESU5HID0gMDsgLyogIFtQcm9taXNlcy9BKyAyLjEuMV0gICovXG52YXIgU1RBVEVfRlVMRklMTEVEID0gMTsgLyogIFtQcm9taXNlcy9BKyAyLjEuMl0gICovXG52YXIgU1RBVEVfUkVKRUNURUQgPSAyOyAvKiAgW1Byb21pc2VzL0ErIDIuMS4zXSAgKi9cblxuLyogIHByb21pc2Ugb2JqZWN0IGNvbnN0cnVjdG9yICAqL1xudmFyIF9hcGkgPSBmdW5jdGlvbiBhcGkoZXhlY3V0b3IpIHtcbiAgLyogIG9wdGlvbmFsbHkgc3VwcG9ydCBub24tY29uc3RydWN0b3IvcGxhaW4tZnVuY3Rpb24gY2FsbCAgKi9cbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIF9hcGkpKSByZXR1cm4gbmV3IF9hcGkoZXhlY3V0b3IpO1xuXG4gIC8qICBpbml0aWFsaXplIG9iamVjdCAgKi9cbiAgdGhpcy5pZCA9ICdUaGVuYWJsZS8xLjAuNyc7XG4gIHRoaXMuc3RhdGUgPSBTVEFURV9QRU5ESU5HOyAvKiAgaW5pdGlhbCBzdGF0ZSAgKi9cbiAgdGhpcy5mdWxmaWxsVmFsdWUgPSB1bmRlZmluZWQ7IC8qICBpbml0aWFsIHZhbHVlICAqLyAvKiAgW1Byb21pc2VzL0ErIDEuMywgMi4xLjIuMl0gICovXG4gIHRoaXMucmVqZWN0UmVhc29uID0gdW5kZWZpbmVkOyAvKiAgaW5pdGlhbCByZWFzb24gKi8gLyogIFtQcm9taXNlcy9BKyAxLjUsIDIuMS4zLjJdICAqL1xuICB0aGlzLm9uRnVsZmlsbGVkID0gW107IC8qICBpbml0aWFsIGhhbmRsZXJzICAqL1xuICB0aGlzLm9uUmVqZWN0ZWQgPSBbXTsgLyogIGluaXRpYWwgaGFuZGxlcnMgICovXG5cbiAgLyogIHByb3ZpZGUgb3B0aW9uYWwgaW5mb3JtYXRpb24taGlkaW5nIHByb3h5ICAqL1xuICB0aGlzLnByb3h5ID0ge1xuICAgIHRoZW46IHRoaXMudGhlbi5iaW5kKHRoaXMpXG4gIH07XG5cbiAgLyogIHN1cHBvcnQgb3B0aW9uYWwgZXhlY3V0b3IgZnVuY3Rpb24gICovXG4gIGlmICh0eXBlb2YgZXhlY3V0b3IgPT09ICdmdW5jdGlvbicpIGV4ZWN1dG9yLmNhbGwodGhpcywgdGhpcy5mdWxmaWxsLmJpbmQodGhpcyksIHRoaXMucmVqZWN0LmJpbmQodGhpcykpO1xufTtcblxuLyogIHByb21pc2UgQVBJIG1ldGhvZHMgICovXG5fYXBpLnByb3RvdHlwZSA9IHtcbiAgLyogIHByb21pc2UgcmVzb2x2aW5nIG1ldGhvZHMgICovXG4gIGZ1bGZpbGw6IGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHtcbiAgICByZXR1cm4gZGVsaXZlcih0aGlzLCBTVEFURV9GVUxGSUxMRUQsICdmdWxmaWxsVmFsdWUnLCB2YWx1ZSk7XG4gIH0sXG4gIHJlamVjdDogZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7XG4gICAgcmV0dXJuIGRlbGl2ZXIodGhpcywgU1RBVEVfUkVKRUNURUQsICdyZWplY3RSZWFzb24nLCB2YWx1ZSk7XG4gIH0sXG4gIC8qICBcIlRoZSB0aGVuIE1ldGhvZFwiIFtQcm9taXNlcy9BKyAxLjEsIDEuMiwgMi4yXSAgKi9cbiAgdGhlbjogZnVuY3Rpb24gdGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuICAgIHZhciBjdXJyID0gdGhpcztcbiAgICB2YXIgbmV4dCA9IG5ldyBfYXBpKCk7IC8qICBbUHJvbWlzZXMvQSsgMi4yLjddICAqL1xuICAgIGN1cnIub25GdWxmaWxsZWQucHVzaChyZXNvbHZlcihvbkZ1bGZpbGxlZCwgbmV4dCwgJ2Z1bGZpbGwnKSk7IC8qICBbUHJvbWlzZXMvQSsgMi4yLjIvMi4yLjZdICAqL1xuICAgIGN1cnIub25SZWplY3RlZC5wdXNoKHJlc29sdmVyKG9uUmVqZWN0ZWQsIG5leHQsICdyZWplY3QnKSk7IC8qICBbUHJvbWlzZXMvQSsgMi4yLjMvMi4yLjZdICAqL1xuICAgIGV4ZWN1dGUoY3Vycik7XG4gICAgcmV0dXJuIG5leHQucHJveHk7IC8qICBbUHJvbWlzZXMvQSsgMi4yLjcsIDMuM10gICovXG4gIH1cbn07XG5cbi8qICBkZWxpdmVyIGFuIGFjdGlvbiAgKi9cbnZhciBkZWxpdmVyID0gZnVuY3Rpb24gZGVsaXZlcihjdXJyLCBzdGF0ZSwgbmFtZSwgdmFsdWUpIHtcbiAgaWYgKGN1cnIuc3RhdGUgPT09IFNUQVRFX1BFTkRJTkcpIHtcbiAgICBjdXJyLnN0YXRlID0gc3RhdGU7IC8qICBbUHJvbWlzZXMvQSsgMi4xLjIuMSwgMi4xLjMuMV0gICovXG4gICAgY3VycltuYW1lXSA9IHZhbHVlOyAvKiAgW1Byb21pc2VzL0ErIDIuMS4yLjIsIDIuMS4zLjJdICAqL1xuICAgIGV4ZWN1dGUoY3Vycik7XG4gIH1cbiAgcmV0dXJuIGN1cnI7XG59O1xuXG4vKiAgZXhlY3V0ZSBhbGwgaGFuZGxlcnMgICovXG52YXIgZXhlY3V0ZSA9IGZ1bmN0aW9uIGV4ZWN1dGUoY3Vycikge1xuICBpZiAoY3Vyci5zdGF0ZSA9PT0gU1RBVEVfRlVMRklMTEVEKSBleGVjdXRlX2hhbmRsZXJzKGN1cnIsICdvbkZ1bGZpbGxlZCcsIGN1cnIuZnVsZmlsbFZhbHVlKTtlbHNlIGlmIChjdXJyLnN0YXRlID09PSBTVEFURV9SRUpFQ1RFRCkgZXhlY3V0ZV9oYW5kbGVycyhjdXJyLCAnb25SZWplY3RlZCcsIGN1cnIucmVqZWN0UmVhc29uKTtcbn07XG5cbi8qICBleGVjdXRlIHBhcnRpY3VsYXIgc2V0IG9mIGhhbmRsZXJzICAqL1xudmFyIGV4ZWN1dGVfaGFuZGxlcnMgPSBmdW5jdGlvbiBleGVjdXRlX2hhbmRsZXJzKGN1cnIsIG5hbWUsIHZhbHVlKSB7XG4gIC8qIGdsb2JhbCBzZXRJbW1lZGlhdGU6IHRydWUgKi9cbiAgLyogZ2xvYmFsIHNldFRpbWVvdXQ6IHRydWUgKi9cblxuICAvKiAgc2hvcnQtY2lyY3VpdCBwcm9jZXNzaW5nICAqL1xuICBpZiAoY3VycltuYW1lXS5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAvKiAgaXRlcmF0ZSBvdmVyIGFsbCBoYW5kbGVycywgZXhhY3RseSBvbmNlICAqL1xuICB2YXIgaGFuZGxlcnMgPSBjdXJyW25hbWVdO1xuICBjdXJyW25hbWVdID0gW107IC8qICBbUHJvbWlzZXMvQSsgMi4yLjIuMywgMi4yLjMuM10gICovXG4gIHZhciBmdW5jID0gZnVuY3Rpb24gZnVuYygpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhhbmRsZXJzLmxlbmd0aDsgaSsrKSBoYW5kbGVyc1tpXSh2YWx1ZSk7IC8qICBbUHJvbWlzZXMvQSsgMi4yLjVdICAqL1xuICB9O1xuXG4gIC8qICBleGVjdXRlIHByb2NlZHVyZSBhc3luY2hyb25vdXNseSAgKi8gLyogIFtQcm9taXNlcy9BKyAyLjIuNCwgMy4xXSAgKi9cbiAgaWYgKHR5cGVvZiBzZXRJbW1lZGlhdGUgPT09ICdmdW5jdGlvbicpIHNldEltbWVkaWF0ZShmdW5jKTtlbHNlIHNldFRpbWVvdXQoZnVuYywgMCk7XG59O1xuXG4vKiAgZ2VuZXJhdGUgYSByZXNvbHZlciBmdW5jdGlvbiAgKi9cbnZhciByZXNvbHZlciA9IGZ1bmN0aW9uIHJlc29sdmVyKGNiLCBuZXh0LCBtZXRob2QpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgY2IgIT09ICdmdW5jdGlvbicpIC8qICBbUHJvbWlzZXMvQSsgMi4yLjEsIDIuMi43LjMsIDIuMi43LjRdICAqL1xuICAgICAgbmV4dFttZXRob2RdLmNhbGwobmV4dCwgdmFsdWUpOyAvKiAgW1Byb21pc2VzL0ErIDIuMi43LjMsIDIuMi43LjRdICAqL2Vsc2Uge1xuICAgICAgdmFyIHJlc3VsdDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc3VsdCA9IGNiKHZhbHVlKTtcbiAgICAgIH0gLyogIFtQcm9taXNlcy9BKyAyLjIuMi4xLCAyLjIuMy4xLCAyLjIuNSwgMy4yXSAgKi8gY2F0Y2ggKGUpIHtcbiAgICAgICAgbmV4dC5yZWplY3QoZSk7IC8qICBbUHJvbWlzZXMvQSsgMi4yLjcuMl0gICovXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIF9yZXNvbHZlKG5leHQsIHJlc3VsdCk7IC8qICBbUHJvbWlzZXMvQSsgMi4yLjcuMV0gICovXG4gICAgfVxuICB9O1xufTtcblxuLyogIFwiUHJvbWlzZSBSZXNvbHV0aW9uIFByb2NlZHVyZVwiICAqLyAvKiAgW1Byb21pc2VzL0ErIDIuM10gICovXG52YXIgX3Jlc29sdmUgPSBmdW5jdGlvbiByZXNvbHZlKHByb21pc2UsIHgpIHtcbiAgLyogIHNhbml0eSBjaGVjayBhcmd1bWVudHMgICovIC8qICBbUHJvbWlzZXMvQSsgMi4zLjFdICAqL1xuICBpZiAocHJvbWlzZSA9PT0geCB8fCBwcm9taXNlLnByb3h5ID09PSB4KSB7XG4gICAgcHJvbWlzZS5yZWplY3QobmV3IFR5cGVFcnJvcignY2Fubm90IHJlc29sdmUgcHJvbWlzZSB3aXRoIGl0c2VsZicpKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKiAgc3VyZ2ljYWxseSBjaGVjayBmb3IgYSBcInRoZW5cIiBtZXRob2RcbiAgICAobWFpbmx5IHRvIGp1c3QgY2FsbCB0aGUgXCJnZXR0ZXJcIiBvZiBcInRoZW5cIiBvbmx5IG9uY2UpICAqL1xuICB2YXIgdGhlbjtcbiAgaWYgKF90eXBlb2YoeCkgPT09ICdvYmplY3QnICYmIHggIT09IG51bGwgfHwgdHlwZW9mIHggPT09ICdmdW5jdGlvbicpIHtcbiAgICB0cnkge1xuICAgICAgdGhlbiA9IHgudGhlbjtcbiAgICB9IC8qICBbUHJvbWlzZXMvQSsgMi4zLjMuMSwgMy41XSAgKi8gY2F0Y2ggKGUpIHtcbiAgICAgIHByb21pc2UucmVqZWN0KGUpOyAvKiAgW1Byb21pc2VzL0ErIDIuMy4zLjJdICAqL1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIC8qICBoYW5kbGUgb3duIFRoZW5hYmxlcyAgICBbUHJvbWlzZXMvQSsgMi4zLjJdXG4gICAgYW5kIHNpbWlsYXIgXCJ0aGVuYWJsZXNcIiBbUHJvbWlzZXMvQSsgMi4zLjNdICAqL1xuICBpZiAodHlwZW9mIHRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgcmVzb2x2ZWQgPSBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgLyogIGNhbGwgcmV0cmlldmVkIFwidGhlblwiIG1ldGhvZCAqLyAvKiAgW1Byb21pc2VzL0ErIDIuMy4zLjNdICAqL1xuICAgICAgdGhlbi5jYWxsKHgsIC8qICByZXNvbHZlUHJvbWlzZSAgKi8gLyogIFtQcm9taXNlcy9BKyAyLjMuMy4zLjFdICAqL1xuICAgICAgZnVuY3Rpb24gKHkpIHtcbiAgICAgICAgaWYgKHJlc29sdmVkKSByZXR1cm47XG4gICAgICAgIHJlc29sdmVkID0gdHJ1ZTsgLyogIFtQcm9taXNlcy9BKyAyLjMuMy4zLjNdICAqL1xuICAgICAgICBpZiAoeSA9PT0geCkgLyogIFtQcm9taXNlcy9BKyAzLjZdICAqL1xuICAgICAgICAgIHByb21pc2UucmVqZWN0KG5ldyBUeXBlRXJyb3IoJ2NpcmN1bGFyIHRoZW5hYmxlIGNoYWluJykpO2Vsc2UgX3Jlc29sdmUocHJvbWlzZSwgeSk7XG4gICAgICB9LCAvKiAgcmVqZWN0UHJvbWlzZSAgKi8gLyogIFtQcm9taXNlcy9BKyAyLjMuMy4zLjJdICAqL1xuICAgICAgZnVuY3Rpb24gKHIpIHtcbiAgICAgICAgaWYgKHJlc29sdmVkKSByZXR1cm47XG4gICAgICAgIHJlc29sdmVkID0gdHJ1ZTsgLyogIFtQcm9taXNlcy9BKyAyLjMuMy4zLjNdICAqL1xuICAgICAgICBwcm9taXNlLnJlamVjdChyKTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmICghcmVzb2x2ZWQpIC8qICBbUHJvbWlzZXMvQSsgMi4zLjMuMy4zXSAgKi9cbiAgICAgICAgcHJvbWlzZS5yZWplY3QoZSk7IC8qICBbUHJvbWlzZXMvQSsgMi4zLjMuMy40XSAgKi9cbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyogIGhhbmRsZSBvdGhlciB2YWx1ZXMgICovXG4gIHByb21pc2UuZnVsZmlsbCh4KTsgLyogIFtQcm9taXNlcy9BKyAyLjMuNCwgMi4zLjMuNF0gICovXG59O1xuXG4vLyBzbyB3ZSBhbHdheXMgaGF2ZSBQcm9taXNlLmFsbCgpXG5fYXBpLmFsbCA9IGZ1bmN0aW9uIChwcykge1xuICByZXR1cm4gbmV3IF9hcGkoZnVuY3Rpb24gKHJlc29sdmVBbGwsIHJlamVjdEFsbCkge1xuICAgIHZhciB2YWxzID0gbmV3IEFycmF5KHBzLmxlbmd0aCk7XG4gICAgdmFyIGRvbmVDb3VudCA9IDA7XG4gICAgdmFyIGZ1bGZpbGwgPSBmdW5jdGlvbiBmdWxmaWxsKGksIHZhbCkge1xuICAgICAgdmFsc1tpXSA9IHZhbDtcbiAgICAgIGRvbmVDb3VudCsrO1xuICAgICAgaWYgKGRvbmVDb3VudCA9PT0gcHMubGVuZ3RoKSB7XG4gICAgICAgIHJlc29sdmVBbGwodmFscyk7XG4gICAgICB9XG4gICAgfTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAoZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgdmFyIHAgPSBwc1tpXTtcbiAgICAgICAgdmFyIGlzUHJvbWlzZSA9IHAgIT0gbnVsbCAmJiBwLnRoZW4gIT0gbnVsbDtcbiAgICAgICAgaWYgKGlzUHJvbWlzZSkge1xuICAgICAgICAgIHAudGhlbihmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgICAgICBmdWxmaWxsKGksIHZhbCk7XG4gICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgcmVqZWN0QWxsKGVycik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHZhbCA9IHA7XG4gICAgICAgICAgZnVsZmlsbChpLCB2YWwpO1xuICAgICAgICB9XG4gICAgICB9KShpKTtcbiAgICB9XG4gIH0pO1xufTtcbl9hcGkucmVzb2x2ZSA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgcmV0dXJuIG5ldyBfYXBpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICByZXNvbHZlKHZhbCk7XG4gIH0pO1xufTtcbl9hcGkucmVqZWN0ID0gZnVuY3Rpb24gKHZhbCkge1xuICByZXR1cm4gbmV3IF9hcGkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHJlamVjdCh2YWwpO1xuICB9KTtcbn07XG52YXIgUHJvbWlzZSQxID0gdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnID8gUHJvbWlzZSA6IF9hcGk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcblxudmFyIEFuaW1hdGlvbiA9IGZ1bmN0aW9uIEFuaW1hdGlvbih0YXJnZXQsIG9wdHMsIG9wdHMyKSB7XG4gIHZhciBpc0NvcmUgPSBjb3JlKHRhcmdldCk7XG4gIHZhciBpc0VsZSA9ICFpc0NvcmU7XG4gIHZhciBfcCA9IHRoaXMuX3ByaXZhdGUgPSBleHRlbmQoe1xuICAgIGR1cmF0aW9uOiAxMDAwXG4gIH0sIG9wdHMsIG9wdHMyKTtcbiAgX3AudGFyZ2V0ID0gdGFyZ2V0O1xuICBfcC5zdHlsZSA9IF9wLnN0eWxlIHx8IF9wLmNzcztcbiAgX3Auc3RhcnRlZCA9IGZhbHNlO1xuICBfcC5wbGF5aW5nID0gZmFsc2U7XG4gIF9wLmhvb2tlZCA9IGZhbHNlO1xuICBfcC5hcHBseWluZyA9IGZhbHNlO1xuICBfcC5wcm9ncmVzcyA9IDA7XG4gIF9wLmNvbXBsZXRlcyA9IFtdO1xuICBfcC5mcmFtZXMgPSBbXTtcbiAgaWYgKF9wLmNvbXBsZXRlICYmIGZuJDYoX3AuY29tcGxldGUpKSB7XG4gICAgX3AuY29tcGxldGVzLnB1c2goX3AuY29tcGxldGUpO1xuICB9XG4gIGlmIChpc0VsZSkge1xuICAgIHZhciBwb3MgPSB0YXJnZXQucG9zaXRpb24oKTtcbiAgICBfcC5zdGFydFBvc2l0aW9uID0gX3Auc3RhcnRQb3NpdGlvbiB8fCB7XG4gICAgICB4OiBwb3MueCxcbiAgICAgIHk6IHBvcy55XG4gICAgfTtcbiAgICBfcC5zdGFydFN0eWxlID0gX3Auc3RhcnRTdHlsZSB8fCB0YXJnZXQuY3koKS5zdHlsZSgpLmdldEFuaW1hdGlvblN0YXJ0U3R5bGUodGFyZ2V0LCBfcC5zdHlsZSk7XG4gIH1cbiAgaWYgKGlzQ29yZSkge1xuICAgIHZhciBwYW4gPSB0YXJnZXQucGFuKCk7XG4gICAgX3Auc3RhcnRQYW4gPSB7XG4gICAgICB4OiBwYW4ueCxcbiAgICAgIHk6IHBhbi55XG4gICAgfTtcbiAgICBfcC5zdGFydFpvb20gPSB0YXJnZXQuem9vbSgpO1xuICB9XG5cbiAgLy8gZm9yIGZ1dHVyZSB0aW1lbGluZS9hbmltYXRpb25zIGltcGxcbiAgdGhpcy5sZW5ndGggPSAxO1xuICB0aGlzWzBdID0gdGhpcztcbn07XG52YXIgYW5pZm4gPSBBbmltYXRpb24ucHJvdG90eXBlO1xuZXh0ZW5kKGFuaWZuLCB7XG4gIGluc3RhbmNlU3RyaW5nOiBmdW5jdGlvbiBpbnN0YW5jZVN0cmluZygpIHtcbiAgICByZXR1cm4gJ2FuaW1hdGlvbic7XG4gIH0sXG4gIGhvb2s6IGZ1bmN0aW9uIGhvb2soKSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICBpZiAoIV9wLmhvb2tlZCkge1xuICAgICAgLy8gYWRkIHRvIHRhcmdldCdzIGFuaW1hdGlvbiBxdWV1ZVxuICAgICAgdmFyIHE7XG4gICAgICB2YXIgdEFuaSA9IF9wLnRhcmdldC5fcHJpdmF0ZS5hbmltYXRpb247XG4gICAgICBpZiAoX3AucXVldWUpIHtcbiAgICAgICAgcSA9IHRBbmkucXVldWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBxID0gdEFuaS5jdXJyZW50O1xuICAgICAgfVxuICAgICAgcS5wdXNoKHRoaXMpO1xuXG4gICAgICAvLyBhZGQgdG8gdGhlIGFuaW1hdGlvbiBsb29wIHBvb2xcbiAgICAgIGlmIChlbGVtZW50T3JDb2xsZWN0aW9uKF9wLnRhcmdldCkpIHtcbiAgICAgICAgX3AudGFyZ2V0LmN5KCkuYWRkVG9BbmltYXRpb25Qb29sKF9wLnRhcmdldCk7XG4gICAgICB9XG4gICAgICBfcC5ob29rZWQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgcGxheTogZnVuY3Rpb24gcGxheSgpIHtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuXG4gICAgLy8gYXV0b3Jld2luZFxuICAgIGlmIChfcC5wcm9ncmVzcyA9PT0gMSkge1xuICAgICAgX3AucHJvZ3Jlc3MgPSAwO1xuICAgIH1cbiAgICBfcC5wbGF5aW5nID0gdHJ1ZTtcbiAgICBfcC5zdGFydGVkID0gZmFsc2U7IC8vIG5lZWRzIHRvIGJlIHN0YXJ0ZWQgYnkgYW5pbWF0aW9uIGxvb3BcbiAgICBfcC5zdG9wcGVkID0gZmFsc2U7XG4gICAgdGhpcy5ob29rKCk7XG5cbiAgICAvLyB0aGUgYW5pbWF0aW9uIGxvb3Agd2lsbCBzdGFydCB0aGUgYW5pbWF0aW9uLi4uXG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgcGxheWluZzogZnVuY3Rpb24gcGxheWluZygpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5wbGF5aW5nO1xuICB9LFxuICBhcHBseTogZnVuY3Rpb24gYXBwbHkoKSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICBfcC5hcHBseWluZyA9IHRydWU7XG4gICAgX3Auc3RhcnRlZCA9IGZhbHNlOyAvLyBuZWVkcyB0byBiZSBzdGFydGVkIGJ5IGFuaW1hdGlvbiBsb29wXG4gICAgX3Auc3RvcHBlZCA9IGZhbHNlO1xuICAgIHRoaXMuaG9vaygpO1xuXG4gICAgLy8gdGhlIGFuaW1hdGlvbiBsb29wIHdpbGwgYXBwbHkgdGhlIGFuaW1hdGlvbiBhdCB0aGlzIHByb2dyZXNzXG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgYXBwbHlpbmc6IGZ1bmN0aW9uIGFwcGx5aW5nKCkge1xuICAgIHJldHVybiB0aGlzLl9wcml2YXRlLmFwcGx5aW5nO1xuICB9LFxuICBwYXVzZTogZnVuY3Rpb24gcGF1c2UoKSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICBfcC5wbGF5aW5nID0gZmFsc2U7XG4gICAgX3Auc3RhcnRlZCA9IGZhbHNlO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBzdG9wOiBmdW5jdGlvbiBzdG9wKCkge1xuICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG4gICAgX3AucGxheWluZyA9IGZhbHNlO1xuICAgIF9wLnN0YXJ0ZWQgPSBmYWxzZTtcbiAgICBfcC5zdG9wcGVkID0gdHJ1ZTsgLy8gdG8gYmUgcmVtb3ZlZCBmcm9tIGFuaW1hdGlvbiBxdWV1ZXNcblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICByZXdpbmQ6IGZ1bmN0aW9uIHJld2luZCgpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9ncmVzcygwKTtcbiAgfSxcbiAgZmFzdGZvcndhcmQ6IGZ1bmN0aW9uIGZhc3Rmb3J3YXJkKCkge1xuICAgIHJldHVybiB0aGlzLnByb2dyZXNzKDEpO1xuICB9LFxuICB0aW1lOiBmdW5jdGlvbiB0aW1lKHQpIHtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuICAgIGlmICh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBfcC5wcm9ncmVzcyAqIF9wLmR1cmF0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9ncmVzcyh0IC8gX3AuZHVyYXRpb24pO1xuICAgIH1cbiAgfSxcbiAgcHJvZ3Jlc3M6IGZ1bmN0aW9uIHByb2dyZXNzKHApIHtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuICAgIHZhciB3YXNQbGF5aW5nID0gX3AucGxheWluZztcbiAgICBpZiAocCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gX3AucHJvZ3Jlc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh3YXNQbGF5aW5nKSB7XG4gICAgICAgIHRoaXMucGF1c2UoKTtcbiAgICAgIH1cbiAgICAgIF9wLnByb2dyZXNzID0gcDtcbiAgICAgIF9wLnN0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgIGlmICh3YXNQbGF5aW5nKSB7XG4gICAgICAgIHRoaXMucGxheSgpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgY29tcGxldGVkOiBmdW5jdGlvbiBjb21wbGV0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUucHJvZ3Jlc3MgPT09IDE7XG4gIH0sXG4gIHJldmVyc2U6IGZ1bmN0aW9uIHJldmVyc2UoKSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICB2YXIgd2FzUGxheWluZyA9IF9wLnBsYXlpbmc7XG4gICAgaWYgKHdhc1BsYXlpbmcpIHtcbiAgICAgIHRoaXMucGF1c2UoKTtcbiAgICB9XG4gICAgX3AucHJvZ3Jlc3MgPSAxIC0gX3AucHJvZ3Jlc3M7XG4gICAgX3Auc3RhcnRlZCA9IGZhbHNlO1xuICAgIHZhciBzd2FwID0gZnVuY3Rpb24gc3dhcChhLCBiKSB7XG4gICAgICB2YXIgX3BhID0gX3BbYV07XG4gICAgICBpZiAoX3BhID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgX3BbYV0gPSBfcFtiXTtcbiAgICAgIF9wW2JdID0gX3BhO1xuICAgIH07XG4gICAgc3dhcCgnem9vbScsICdzdGFydFpvb20nKTtcbiAgICBzd2FwKCdwYW4nLCAnc3RhcnRQYW4nKTtcbiAgICBzd2FwKCdwb3NpdGlvbicsICdzdGFydFBvc2l0aW9uJyk7XG5cbiAgICAvLyBzd2FwIHN0eWxlc1xuICAgIGlmIChfcC5zdHlsZSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBfcC5zdHlsZS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcHJvcCA9IF9wLnN0eWxlW2ldO1xuICAgICAgICB2YXIgbmFtZSA9IHByb3AubmFtZTtcbiAgICAgICAgdmFyIHN0YXJ0U3R5bGVQcm9wID0gX3Auc3RhcnRTdHlsZVtuYW1lXTtcbiAgICAgICAgX3Auc3RhcnRTdHlsZVtuYW1lXSA9IHByb3A7XG4gICAgICAgIF9wLnN0eWxlW2ldID0gc3RhcnRTdHlsZVByb3A7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh3YXNQbGF5aW5nKSB7XG4gICAgICB0aGlzLnBsYXkoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIHByb21pc2U6IGZ1bmN0aW9uIHByb21pc2UodHlwZSkge1xuICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG4gICAgdmFyIGFycjtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ2ZyYW1lJzpcbiAgICAgICAgYXJyID0gX3AuZnJhbWVzO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICBjYXNlICdjb21wbGV0ZSc6XG4gICAgICBjYXNlICdjb21wbGV0ZWQnOlxuICAgICAgICBhcnIgPSBfcC5jb21wbGV0ZXM7XG4gICAgfVxuICAgIHJldHVybiBuZXcgUHJvbWlzZSQxKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGFyci5wdXNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn0pO1xuYW5pZm4uY29tcGxldGUgPSBhbmlmbi5jb21wbGV0ZWQ7XG5hbmlmbi5ydW4gPSBhbmlmbi5wbGF5O1xuYW5pZm4ucnVubmluZyA9IGFuaWZuLnBsYXlpbmc7XG5cbnZhciBkZWZpbmUkMyA9IHtcbiAgYW5pbWF0ZWQ6IGZ1bmN0aW9uIGFuaW1hdGVkKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiBhbmltYXRlZEltcGwoKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgc2VsZklzQXJyYXlMaWtlID0gc2VsZi5sZW5ndGggIT09IHVuZGVmaW5lZDtcbiAgICAgIHZhciBhbGwgPSBzZWxmSXNBcnJheUxpa2UgPyBzZWxmIDogW3NlbGZdOyAvLyBwdXQgaW4gYXJyYXkgaWYgbm90IGFycmF5LWxpa2VcbiAgICAgIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3kgfHwgdGhpcztcbiAgICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFyIGVsZSA9IGFsbFswXTtcbiAgICAgIGlmIChlbGUpIHtcbiAgICAgICAgcmV0dXJuIGVsZS5fcHJpdmF0ZS5hbmltYXRpb24uY3VycmVudC5sZW5ndGggPiAwO1xuICAgICAgfVxuICAgIH07XG4gIH0sXG4gIC8vIGFuaW1hdGVkXG5cbiAgY2xlYXJRdWV1ZTogZnVuY3Rpb24gY2xlYXJRdWV1ZSgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gY2xlYXJRdWV1ZUltcGwoKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgc2VsZklzQXJyYXlMaWtlID0gc2VsZi5sZW5ndGggIT09IHVuZGVmaW5lZDtcbiAgICAgIHZhciBhbGwgPSBzZWxmSXNBcnJheUxpa2UgPyBzZWxmIDogW3NlbGZdOyAvLyBwdXQgaW4gYXJyYXkgaWYgbm90IGFycmF5LWxpa2VcbiAgICAgIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3kgfHwgdGhpcztcbiAgICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlID0gYWxsW2ldO1xuICAgICAgICBlbGUuX3ByaXZhdGUuYW5pbWF0aW9uLnF1ZXVlID0gW107XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICB9LFxuICAvLyBjbGVhclF1ZXVlXG5cbiAgZGVsYXk6IGZ1bmN0aW9uIGRlbGF5KCkge1xuICAgIHJldHVybiBmdW5jdGlvbiBkZWxheUltcGwodGltZSwgY29tcGxldGUpIHtcbiAgICAgIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3kgfHwgdGhpcztcbiAgICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5hbmltYXRlKHtcbiAgICAgICAgZGVsYXk6IHRpbWUsXG4gICAgICAgIGR1cmF0aW9uOiB0aW1lLFxuICAgICAgICBjb21wbGV0ZTogY29tcGxldGVcbiAgICAgIH0pO1xuICAgIH07XG4gIH0sXG4gIC8vIGRlbGF5XG5cbiAgZGVsYXlBbmltYXRpb246IGZ1bmN0aW9uIGRlbGF5QW5pbWF0aW9uKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiBkZWxheUFuaW1hdGlvbkltcGwodGltZSwgY29tcGxldGUpIHtcbiAgICAgIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3kgfHwgdGhpcztcbiAgICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5hbmltYXRpb24oe1xuICAgICAgICBkZWxheTogdGltZSxcbiAgICAgICAgZHVyYXRpb246IHRpbWUsXG4gICAgICAgIGNvbXBsZXRlOiBjb21wbGV0ZVxuICAgICAgfSk7XG4gICAgfTtcbiAgfSxcbiAgLy8gZGVsYXlcblxuICBhbmltYXRpb246IGZ1bmN0aW9uIGFuaW1hdGlvbigpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gYW5pbWF0aW9uSW1wbChwcm9wZXJ0aWVzLCBwYXJhbXMpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBzZWxmSXNBcnJheUxpa2UgPSBzZWxmLmxlbmd0aCAhPT0gdW5kZWZpbmVkO1xuICAgICAgdmFyIGFsbCA9IHNlbGZJc0FycmF5TGlrZSA/IHNlbGYgOiBbc2VsZl07IC8vIHB1dCBpbiBhcnJheSBpZiBub3QgYXJyYXktbGlrZVxuICAgICAgdmFyIGN5ID0gdGhpcy5fcHJpdmF0ZS5jeSB8fCB0aGlzO1xuICAgICAgdmFyIGlzQ29yZSA9ICFzZWxmSXNBcnJheUxpa2U7XG4gICAgICB2YXIgaXNFbGVzID0gIWlzQ29yZTtcbiAgICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICB2YXIgc3R5bGUgPSBjeS5zdHlsZSgpO1xuICAgICAgcHJvcGVydGllcyA9IGV4dGVuZCh7fSwgcHJvcGVydGllcywgcGFyYW1zKTtcbiAgICAgIHZhciBwcm9wZXJ0aWVzRW1wdHkgPSBPYmplY3Qua2V5cyhwcm9wZXJ0aWVzKS5sZW5ndGggPT09IDA7XG4gICAgICBpZiAocHJvcGVydGllc0VtcHR5KSB7XG4gICAgICAgIHJldHVybiBuZXcgQW5pbWF0aW9uKGFsbFswXSwgcHJvcGVydGllcyk7IC8vIG5vdGhpbmcgdG8gYW5pbWF0ZVxuICAgICAgfVxuICAgICAgaWYgKHByb3BlcnRpZXMuZHVyYXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwcm9wZXJ0aWVzLmR1cmF0aW9uID0gNDAwO1xuICAgICAgfVxuICAgICAgc3dpdGNoIChwcm9wZXJ0aWVzLmR1cmF0aW9uKSB7XG4gICAgICAgIGNhc2UgJ3Nsb3cnOlxuICAgICAgICAgIHByb3BlcnRpZXMuZHVyYXRpb24gPSA2MDA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2Zhc3QnOlxuICAgICAgICAgIHByb3BlcnRpZXMuZHVyYXRpb24gPSAyMDA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoaXNFbGVzKSB7XG4gICAgICAgIHByb3BlcnRpZXMuc3R5bGUgPSBzdHlsZS5nZXRQcm9wc0xpc3QocHJvcGVydGllcy5zdHlsZSB8fCBwcm9wZXJ0aWVzLmNzcyk7XG4gICAgICAgIHByb3BlcnRpZXMuY3NzID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaWYgKGlzRWxlcyAmJiBwcm9wZXJ0aWVzLnJlbmRlcmVkUG9zaXRpb24gIT0gbnVsbCkge1xuICAgICAgICB2YXIgcnBvcyA9IHByb3BlcnRpZXMucmVuZGVyZWRQb3NpdGlvbjtcbiAgICAgICAgdmFyIHBhbiA9IGN5LnBhbigpO1xuICAgICAgICB2YXIgem9vbSA9IGN5Lnpvb20oKTtcbiAgICAgICAgcHJvcGVydGllcy5wb3NpdGlvbiA9IHJlbmRlcmVkVG9Nb2RlbFBvc2l0aW9uKHJwb3MsIHpvb20sIHBhbik7XG4gICAgICB9XG5cbiAgICAgIC8vIG92ZXJyaWRlIHBhbiB3LyBwYW5CeSBpZiBzZXRcbiAgICAgIGlmIChpc0NvcmUgJiYgcHJvcGVydGllcy5wYW5CeSAhPSBudWxsKSB7XG4gICAgICAgIHZhciBwYW5CeSA9IHByb3BlcnRpZXMucGFuQnk7XG4gICAgICAgIHZhciBjeVBhbiA9IGN5LnBhbigpO1xuICAgICAgICBwcm9wZXJ0aWVzLnBhbiA9IHtcbiAgICAgICAgICB4OiBjeVBhbi54ICsgcGFuQnkueCxcbiAgICAgICAgICB5OiBjeVBhbi55ICsgcGFuQnkueVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBvdmVycmlkZSBwYW4gdy8gY2VudGVyIGlmIHNldFxuICAgICAgdmFyIGNlbnRlciA9IHByb3BlcnRpZXMuY2VudGVyIHx8IHByb3BlcnRpZXMuY2VudHJlO1xuICAgICAgaWYgKGlzQ29yZSAmJiBjZW50ZXIgIT0gbnVsbCkge1xuICAgICAgICB2YXIgY2VudGVyUGFuID0gY3kuZ2V0Q2VudGVyUGFuKGNlbnRlci5lbGVzLCBwcm9wZXJ0aWVzLnpvb20pO1xuICAgICAgICBpZiAoY2VudGVyUGFuICE9IG51bGwpIHtcbiAgICAgICAgICBwcm9wZXJ0aWVzLnBhbiA9IGNlbnRlclBhbjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBvdmVycmlkZSBwYW4gJiB6b29tIHcvIGZpdCBpZiBzZXRcbiAgICAgIGlmIChpc0NvcmUgJiYgcHJvcGVydGllcy5maXQgIT0gbnVsbCkge1xuICAgICAgICB2YXIgZml0ID0gcHJvcGVydGllcy5maXQ7XG4gICAgICAgIHZhciBmaXRWcCA9IGN5LmdldEZpdFZpZXdwb3J0KGZpdC5lbGVzIHx8IGZpdC5ib3VuZGluZ0JveCwgZml0LnBhZGRpbmcpO1xuICAgICAgICBpZiAoZml0VnAgIT0gbnVsbCkge1xuICAgICAgICAgIHByb3BlcnRpZXMucGFuID0gZml0VnAucGFuO1xuICAgICAgICAgIHByb3BlcnRpZXMuem9vbSA9IGZpdFZwLnpvb207XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gb3ZlcnJpZGUgem9vbSAoJiBwb3RlbnRpYWxseSBwYW4pIHcvIHpvb20gb2JqIGlmIHNldFxuICAgICAgaWYgKGlzQ29yZSAmJiBwbGFpbk9iamVjdChwcm9wZXJ0aWVzLnpvb20pKSB7XG4gICAgICAgIHZhciB2cCA9IGN5LmdldFpvb21lZFZpZXdwb3J0KHByb3BlcnRpZXMuem9vbSk7XG4gICAgICAgIGlmICh2cCAhPSBudWxsKSB7XG4gICAgICAgICAgaWYgKHZwLnpvb21lZCkge1xuICAgICAgICAgICAgcHJvcGVydGllcy56b29tID0gdnAuem9vbTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHZwLnBhbm5lZCkge1xuICAgICAgICAgICAgcHJvcGVydGllcy5wYW4gPSB2cC5wYW47XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb3BlcnRpZXMuem9vbSA9IG51bGw7IC8vIGFuIGluYXZhbGlkIHpvb20gKGUuZy4gbm8gZGVsdGEpIGdldHMgYXV0b21hdGljYWxseSBkZXN0cm95ZWRcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBBbmltYXRpb24oYWxsWzBdLCBwcm9wZXJ0aWVzKTtcbiAgICB9O1xuICB9LFxuICAvLyBhbmltYXRlXG5cbiAgYW5pbWF0ZTogZnVuY3Rpb24gYW5pbWF0ZSgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gYW5pbWF0ZUltcGwocHJvcGVydGllcywgcGFyYW1zKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgc2VsZklzQXJyYXlMaWtlID0gc2VsZi5sZW5ndGggIT09IHVuZGVmaW5lZDtcbiAgICAgIHZhciBhbGwgPSBzZWxmSXNBcnJheUxpa2UgPyBzZWxmIDogW3NlbGZdOyAvLyBwdXQgaW4gYXJyYXkgaWYgbm90IGFycmF5LWxpa2VcbiAgICAgIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3kgfHwgdGhpcztcbiAgICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1zKSB7XG4gICAgICAgIHByb3BlcnRpZXMgPSBleHRlbmQoe30sIHByb3BlcnRpZXMsIHBhcmFtcyk7XG4gICAgICB9XG5cbiAgICAgIC8vIG1hbnVhbGx5IGhvb2sgYW5kIHJ1biB0aGUgYW5pbWF0aW9uXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlID0gYWxsW2ldO1xuICAgICAgICB2YXIgcXVldWUgPSBlbGUuYW5pbWF0ZWQoKSAmJiAocHJvcGVydGllcy5xdWV1ZSA9PT0gdW5kZWZpbmVkIHx8IHByb3BlcnRpZXMucXVldWUpO1xuICAgICAgICB2YXIgYW5pID0gZWxlLmFuaW1hdGlvbihwcm9wZXJ0aWVzLCBxdWV1ZSA/IHtcbiAgICAgICAgICBxdWV1ZTogdHJ1ZVxuICAgICAgICB9IDogdW5kZWZpbmVkKTtcbiAgICAgICAgYW5pLnBsYXkoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICAgIH07XG4gIH0sXG4gIC8vIGFuaW1hdGVcblxuICBzdG9wOiBmdW5jdGlvbiBzdG9wKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiBzdG9wSW1wbChjbGVhclF1ZXVlLCBqdW1wVG9FbmQpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBzZWxmSXNBcnJheUxpa2UgPSBzZWxmLmxlbmd0aCAhPT0gdW5kZWZpbmVkO1xuICAgICAgdmFyIGFsbCA9IHNlbGZJc0FycmF5TGlrZSA/IHNlbGYgOiBbc2VsZl07IC8vIHB1dCBpbiBhcnJheSBpZiBub3QgYXJyYXktbGlrZVxuICAgICAgdmFyIGN5ID0gdGhpcy5fcHJpdmF0ZS5jeSB8fCB0aGlzO1xuICAgICAgaWYgKCFjeS5zdHlsZUVuYWJsZWQoKSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYWxsLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBlbGUgPSBhbGxbaV07XG4gICAgICAgIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgICAgICAgdmFyIGFuaXMgPSBfcC5hbmltYXRpb24uY3VycmVudDtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBhbmlzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgdmFyIGFuaSA9IGFuaXNbal07XG4gICAgICAgICAgdmFyIGFuaV9wID0gYW5pLl9wcml2YXRlO1xuICAgICAgICAgIGlmIChqdW1wVG9FbmQpIHtcbiAgICAgICAgICAgIC8vIG5leHQgaXRlcmF0aW9uIG9mIHRoZSBhbmltYXRpb24gbG9vcCwgdGhlIGFuaW1hdGlvblxuICAgICAgICAgICAgLy8gd2lsbCBnbyBzdHJhaWdodCB0byB0aGUgZW5kIGFuZCBiZSByZW1vdmVkXG4gICAgICAgICAgICBhbmlfcC5kdXJhdGlvbiA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2xlYXIgdGhlIHF1ZXVlIG9mIGZ1dHVyZSBhbmltYXRpb25zXG4gICAgICAgIGlmIChjbGVhclF1ZXVlKSB7XG4gICAgICAgICAgX3AuYW5pbWF0aW9uLnF1ZXVlID0gW107XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFqdW1wVG9FbmQpIHtcbiAgICAgICAgICBfcC5hbmltYXRpb24uY3VycmVudCA9IFtdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIHdlIGhhdmUgdG8gbm90aWZ5ICh0aGUgYW5pbWF0aW9uIGxvb3AgZG9lc24ndCBkbyBpdCBmb3IgdXMgb24gYHN0b3BgKVxuICAgICAgY3kubm90aWZ5KCdkcmF3Jyk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICB9IC8vIHN0b3Bcbn07IC8vIGRlZmluZVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYW4gYEFycmF5YCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FycmF5KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5KGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXkoJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXkoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cblxudmFyIGlzQXJyYXlfMTtcbnZhciBoYXNSZXF1aXJlZElzQXJyYXk7XG5cbmZ1bmN0aW9uIHJlcXVpcmVJc0FycmF5ICgpIHtcblx0aWYgKGhhc1JlcXVpcmVkSXNBcnJheSkgcmV0dXJuIGlzQXJyYXlfMTtcblx0aGFzUmVxdWlyZWRJc0FycmF5ID0gMTtcblx0dmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuXG5cdGlzQXJyYXlfMSA9IGlzQXJyYXk7XG5cdHJldHVybiBpc0FycmF5XzE7XG59XG5cbnZhciBfaXNLZXk7XG52YXIgaGFzUmVxdWlyZWRfaXNLZXk7XG5cbmZ1bmN0aW9uIHJlcXVpcmVfaXNLZXkgKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRfaXNLZXkpIHJldHVybiBfaXNLZXk7XG5cdGhhc1JlcXVpcmVkX2lzS2V5ID0gMTtcblx0dmFyIGlzQXJyYXkgPSByZXF1aXJlSXNBcnJheSgpLFxuXHQgICAgaXNTeW1ib2wgPSByZXF1aXJlSXNTeW1ib2woKTtcblxuXHQvKiogVXNlZCB0byBtYXRjaCBwcm9wZXJ0eSBuYW1lcyB3aXRoaW4gcHJvcGVydHkgcGF0aHMuICovXG5cdHZhciByZUlzRGVlcFByb3AgPSAvXFwufFxcWyg/OlteW1xcXV0qfChbXCInXSkoPzooPyFcXDEpW15cXFxcXXxcXFxcLikqP1xcMSlcXF0vLFxuXHQgICAgcmVJc1BsYWluUHJvcCA9IC9eXFx3KiQvO1xuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHByb3BlcnR5IG5hbWUgYW5kIG5vdCBhIHByb3BlcnR5IHBhdGguXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuXHQgKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeSBrZXlzIG9uLlxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHByb3BlcnR5IG5hbWUsIGVsc2UgYGZhbHNlYC5cblx0ICovXG5cdGZ1bmN0aW9uIGlzS2V5KHZhbHVlLCBvYmplY3QpIHtcblx0ICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcblx0ICAgIHJldHVybiBmYWxzZTtcblx0ICB9XG5cdCAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG5cdCAgaWYgKHR5cGUgPT0gJ251bWJlcicgfHwgdHlwZSA9PSAnc3ltYm9sJyB8fCB0eXBlID09ICdib29sZWFuJyB8fFxuXHQgICAgICB2YWx1ZSA9PSBudWxsIHx8IGlzU3ltYm9sKHZhbHVlKSkge1xuXHQgICAgcmV0dXJuIHRydWU7XG5cdCAgfVxuXHQgIHJldHVybiByZUlzUGxhaW5Qcm9wLnRlc3QodmFsdWUpIHx8ICFyZUlzRGVlcFByb3AudGVzdCh2YWx1ZSkgfHxcblx0ICAgIChvYmplY3QgIT0gbnVsbCAmJiB2YWx1ZSBpbiBPYmplY3Qob2JqZWN0KSk7XG5cdH1cblxuXHRfaXNLZXkgPSBpc0tleTtcblx0cmV0dXJuIF9pc0tleTtcbn1cblxudmFyIGlzRnVuY3Rpb25fMTtcbnZhciBoYXNSZXF1aXJlZElzRnVuY3Rpb247XG5cbmZ1bmN0aW9uIHJlcXVpcmVJc0Z1bmN0aW9uICgpIHtcblx0aWYgKGhhc1JlcXVpcmVkSXNGdW5jdGlvbikgcmV0dXJuIGlzRnVuY3Rpb25fMTtcblx0aGFzUmVxdWlyZWRJc0Z1bmN0aW9uID0gMTtcblx0dmFyIGJhc2VHZXRUYWcgPSByZXF1aXJlX2Jhc2VHZXRUYWcoKSxcblx0ICAgIGlzT2JqZWN0ID0gcmVxdWlyZUlzT2JqZWN0KCk7XG5cblx0LyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xuXHR2YXIgYXN5bmNUYWcgPSAnW29iamVjdCBBc3luY0Z1bmN0aW9uXScsXG5cdCAgICBmdW5jVGFnID0gJ1tvYmplY3QgRnVuY3Rpb25dJyxcblx0ICAgIGdlblRhZyA9ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXScsXG5cdCAgICBwcm94eVRhZyA9ICdbb2JqZWN0IFByb3h5XSc7XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgRnVuY3Rpb25gIG9iamVjdC5cblx0ICpcblx0ICogQHN0YXRpY1xuXHQgKiBAbWVtYmVyT2YgX1xuXHQgKiBAc2luY2UgMC4xLjBcblx0ICogQGNhdGVnb3J5IExhbmdcblx0ICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG5cdCAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgZnVuY3Rpb24sIGVsc2UgYGZhbHNlYC5cblx0ICogQGV4YW1wbGVcblx0ICpcblx0ICogXy5pc0Z1bmN0aW9uKF8pO1xuXHQgKiAvLyA9PiB0cnVlXG5cdCAqXG5cdCAqIF8uaXNGdW5jdGlvbigvYWJjLyk7XG5cdCAqIC8vID0+IGZhbHNlXG5cdCAqL1xuXHRmdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKSB7XG5cdCAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHtcblx0ICAgIHJldHVybiBmYWxzZTtcblx0ICB9XG5cdCAgLy8gVGhlIHVzZSBvZiBgT2JqZWN0I3RvU3RyaW5nYCBhdm9pZHMgaXNzdWVzIHdpdGggdGhlIGB0eXBlb2ZgIG9wZXJhdG9yXG5cdCAgLy8gaW4gU2FmYXJpIDkgd2hpY2ggcmV0dXJucyAnb2JqZWN0JyBmb3IgdHlwZWQgYXJyYXlzIGFuZCBvdGhlciBjb25zdHJ1Y3RvcnMuXG5cdCAgdmFyIHRhZyA9IGJhc2VHZXRUYWcodmFsdWUpO1xuXHQgIHJldHVybiB0YWcgPT0gZnVuY1RhZyB8fCB0YWcgPT0gZ2VuVGFnIHx8IHRhZyA9PSBhc3luY1RhZyB8fCB0YWcgPT0gcHJveHlUYWc7XG5cdH1cblxuXHRpc0Z1bmN0aW9uXzEgPSBpc0Z1bmN0aW9uO1xuXHRyZXR1cm4gaXNGdW5jdGlvbl8xO1xufVxuXG52YXIgX2NvcmVKc0RhdGE7XG52YXIgaGFzUmVxdWlyZWRfY29yZUpzRGF0YTtcblxuZnVuY3Rpb24gcmVxdWlyZV9jb3JlSnNEYXRhICgpIHtcblx0aWYgKGhhc1JlcXVpcmVkX2NvcmVKc0RhdGEpIHJldHVybiBfY29yZUpzRGF0YTtcblx0aGFzUmVxdWlyZWRfY29yZUpzRGF0YSA9IDE7XG5cdHZhciByb290ID0gcmVxdWlyZV9yb290KCk7XG5cblx0LyoqIFVzZWQgdG8gZGV0ZWN0IG92ZXJyZWFjaGluZyBjb3JlLWpzIHNoaW1zLiAqL1xuXHR2YXIgY29yZUpzRGF0YSA9IHJvb3RbJ19fY29yZS1qc19zaGFyZWRfXyddO1xuXG5cdF9jb3JlSnNEYXRhID0gY29yZUpzRGF0YTtcblx0cmV0dXJuIF9jb3JlSnNEYXRhO1xufVxuXG52YXIgX2lzTWFza2VkO1xudmFyIGhhc1JlcXVpcmVkX2lzTWFza2VkO1xuXG5mdW5jdGlvbiByZXF1aXJlX2lzTWFza2VkICgpIHtcblx0aWYgKGhhc1JlcXVpcmVkX2lzTWFza2VkKSByZXR1cm4gX2lzTWFza2VkO1xuXHRoYXNSZXF1aXJlZF9pc01hc2tlZCA9IDE7XG5cdHZhciBjb3JlSnNEYXRhID0gcmVxdWlyZV9jb3JlSnNEYXRhKCk7XG5cblx0LyoqIFVzZWQgdG8gZGV0ZWN0IG1ldGhvZHMgbWFzcXVlcmFkaW5nIGFzIG5hdGl2ZS4gKi9cblx0dmFyIG1hc2tTcmNLZXkgPSAoZnVuY3Rpb24oKSB7XG5cdCAgdmFyIHVpZCA9IC9bXi5dKyQvLmV4ZWMoY29yZUpzRGF0YSAmJiBjb3JlSnNEYXRhLmtleXMgJiYgY29yZUpzRGF0YS5rZXlzLklFX1BST1RPIHx8ICcnKTtcblx0ICByZXR1cm4gdWlkID8gKCdTeW1ib2woc3JjKV8xLicgKyB1aWQpIDogJyc7XG5cdH0oKSk7XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBgZnVuY2AgaGFzIGl0cyBzb3VyY2UgbWFza2VkLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjaGVjay5cblx0ICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBmdW5jYCBpcyBtYXNrZWQsIGVsc2UgYGZhbHNlYC5cblx0ICovXG5cdGZ1bmN0aW9uIGlzTWFza2VkKGZ1bmMpIHtcblx0ICByZXR1cm4gISFtYXNrU3JjS2V5ICYmIChtYXNrU3JjS2V5IGluIGZ1bmMpO1xuXHR9XG5cblx0X2lzTWFza2VkID0gaXNNYXNrZWQ7XG5cdHJldHVybiBfaXNNYXNrZWQ7XG59XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cblxudmFyIF90b1NvdXJjZTtcbnZhciBoYXNSZXF1aXJlZF90b1NvdXJjZTtcblxuZnVuY3Rpb24gcmVxdWlyZV90b1NvdXJjZSAoKSB7XG5cdGlmIChoYXNSZXF1aXJlZF90b1NvdXJjZSkgcmV0dXJuIF90b1NvdXJjZTtcblx0aGFzUmVxdWlyZWRfdG9Tb3VyY2UgPSAxO1xuXHR2YXIgZnVuY1Byb3RvID0gRnVuY3Rpb24ucHJvdG90eXBlO1xuXG5cdC8qKiBVc2VkIHRvIHJlc29sdmUgdGhlIGRlY29tcGlsZWQgc291cmNlIG9mIGZ1bmN0aW9ucy4gKi9cblx0dmFyIGZ1bmNUb1N0cmluZyA9IGZ1bmNQcm90by50b1N0cmluZztcblxuXHQvKipcblx0ICogQ29udmVydHMgYGZ1bmNgIHRvIGl0cyBzb3VyY2UgY29kZS5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY29udmVydC5cblx0ICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc291cmNlIGNvZGUuXG5cdCAqL1xuXHRmdW5jdGlvbiB0b1NvdXJjZShmdW5jKSB7XG5cdCAgaWYgKGZ1bmMgIT0gbnVsbCkge1xuXHQgICAgdHJ5IHtcblx0ICAgICAgcmV0dXJuIGZ1bmNUb1N0cmluZy5jYWxsKGZ1bmMpO1xuXHQgICAgfSBjYXRjaCAoZSkge31cblx0ICAgIHRyeSB7XG5cdCAgICAgIHJldHVybiAoZnVuYyArICcnKTtcblx0ICAgIH0gY2F0Y2ggKGUpIHt9XG5cdCAgfVxuXHQgIHJldHVybiAnJztcblx0fVxuXG5cdF90b1NvdXJjZSA9IHRvU291cmNlO1xuXHRyZXR1cm4gX3RvU291cmNlO1xufVxuXG52YXIgX2Jhc2VJc05hdGl2ZTtcbnZhciBoYXNSZXF1aXJlZF9iYXNlSXNOYXRpdmU7XG5cbmZ1bmN0aW9uIHJlcXVpcmVfYmFzZUlzTmF0aXZlICgpIHtcblx0aWYgKGhhc1JlcXVpcmVkX2Jhc2VJc05hdGl2ZSkgcmV0dXJuIF9iYXNlSXNOYXRpdmU7XG5cdGhhc1JlcXVpcmVkX2Jhc2VJc05hdGl2ZSA9IDE7XG5cdHZhciBpc0Z1bmN0aW9uID0gcmVxdWlyZUlzRnVuY3Rpb24oKSxcblx0ICAgIGlzTWFza2VkID0gcmVxdWlyZV9pc01hc2tlZCgpLFxuXHQgICAgaXNPYmplY3QgPSByZXF1aXJlSXNPYmplY3QoKSxcblx0ICAgIHRvU291cmNlID0gcmVxdWlyZV90b1NvdXJjZSgpO1xuXG5cdC8qKlxuXHQgKiBVc2VkIHRvIG1hdGNoIGBSZWdFeHBgXG5cdCAqIFtzeW50YXggY2hhcmFjdGVyc10oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcGF0dGVybnMpLlxuXHQgKi9cblx0dmFyIHJlUmVnRXhwQ2hhciA9IC9bXFxcXF4kLiorPygpW1xcXXt9fF0vZztcblxuXHQvKiogVXNlZCB0byBkZXRlY3QgaG9zdCBjb25zdHJ1Y3RvcnMgKFNhZmFyaSkuICovXG5cdHZhciByZUlzSG9zdEN0b3IgPSAvXlxcW29iamVjdCAuKz9Db25zdHJ1Y3RvclxcXSQvO1xuXG5cdC8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cblx0dmFyIGZ1bmNQcm90byA9IEZ1bmN0aW9uLnByb3RvdHlwZSxcblx0ICAgIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuXHQvKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG5cdHZhciBmdW5jVG9TdHJpbmcgPSBmdW5jUHJvdG8udG9TdHJpbmc7XG5cblx0LyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG5cdHZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG5cdC8qKiBVc2VkIHRvIGRldGVjdCBpZiBhIG1ldGhvZCBpcyBuYXRpdmUuICovXG5cdHZhciByZUlzTmF0aXZlID0gUmVnRXhwKCdeJyArXG5cdCAgZnVuY1RvU3RyaW5nLmNhbGwoaGFzT3duUHJvcGVydHkpLnJlcGxhY2UocmVSZWdFeHBDaGFyLCAnXFxcXCQmJylcblx0ICAucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXFxcXCgpfCBmb3IgLis/KD89XFxcXFxcXSkvZywgJyQxLio/JykgKyAnJCdcblx0KTtcblxuXHQvKipcblx0ICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNOYXRpdmVgIHdpdGhvdXQgYmFkIHNoaW0gY2hlY2tzLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cblx0ICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBuYXRpdmUgZnVuY3Rpb24sXG5cdCAqICBlbHNlIGBmYWxzZWAuXG5cdCAqL1xuXHRmdW5jdGlvbiBiYXNlSXNOYXRpdmUodmFsdWUpIHtcblx0ICBpZiAoIWlzT2JqZWN0KHZhbHVlKSB8fCBpc01hc2tlZCh2YWx1ZSkpIHtcblx0ICAgIHJldHVybiBmYWxzZTtcblx0ICB9XG5cdCAgdmFyIHBhdHRlcm4gPSBpc0Z1bmN0aW9uKHZhbHVlKSA/IHJlSXNOYXRpdmUgOiByZUlzSG9zdEN0b3I7XG5cdCAgcmV0dXJuIHBhdHRlcm4udGVzdCh0b1NvdXJjZSh2YWx1ZSkpO1xuXHR9XG5cblx0X2Jhc2VJc05hdGl2ZSA9IGJhc2VJc05hdGl2ZTtcblx0cmV0dXJuIF9iYXNlSXNOYXRpdmU7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgdmFsdWUgYXQgYGtleWAgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUuXG4gKi9cblxudmFyIF9nZXRWYWx1ZTtcbnZhciBoYXNSZXF1aXJlZF9nZXRWYWx1ZTtcblxuZnVuY3Rpb24gcmVxdWlyZV9nZXRWYWx1ZSAoKSB7XG5cdGlmIChoYXNSZXF1aXJlZF9nZXRWYWx1ZSkgcmV0dXJuIF9nZXRWYWx1ZTtcblx0aGFzUmVxdWlyZWRfZ2V0VmFsdWUgPSAxO1xuXHRmdW5jdGlvbiBnZXRWYWx1ZShvYmplY3QsIGtleSkge1xuXHQgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFtrZXldO1xuXHR9XG5cblx0X2dldFZhbHVlID0gZ2V0VmFsdWU7XG5cdHJldHVybiBfZ2V0VmFsdWU7XG59XG5cbnZhciBfZ2V0TmF0aXZlO1xudmFyIGhhc1JlcXVpcmVkX2dldE5hdGl2ZTtcblxuZnVuY3Rpb24gcmVxdWlyZV9nZXROYXRpdmUgKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRfZ2V0TmF0aXZlKSByZXR1cm4gX2dldE5hdGl2ZTtcblx0aGFzUmVxdWlyZWRfZ2V0TmF0aXZlID0gMTtcblx0dmFyIGJhc2VJc05hdGl2ZSA9IHJlcXVpcmVfYmFzZUlzTmF0aXZlKCksXG5cdCAgICBnZXRWYWx1ZSA9IHJlcXVpcmVfZ2V0VmFsdWUoKTtcblxuXHQvKipcblx0ICogR2V0cyB0aGUgbmF0aXZlIGZ1bmN0aW9uIGF0IGBrZXlgIG9mIGBvYmplY3RgLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgbWV0aG9kIHRvIGdldC5cblx0ICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGZ1bmN0aW9uIGlmIGl0J3MgbmF0aXZlLCBlbHNlIGB1bmRlZmluZWRgLlxuXHQgKi9cblx0ZnVuY3Rpb24gZ2V0TmF0aXZlKG9iamVjdCwga2V5KSB7XG5cdCAgdmFyIHZhbHVlID0gZ2V0VmFsdWUob2JqZWN0LCBrZXkpO1xuXHQgIHJldHVybiBiYXNlSXNOYXRpdmUodmFsdWUpID8gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHRfZ2V0TmF0aXZlID0gZ2V0TmF0aXZlO1xuXHRyZXR1cm4gX2dldE5hdGl2ZTtcbn1cblxudmFyIF9uYXRpdmVDcmVhdGU7XG52YXIgaGFzUmVxdWlyZWRfbmF0aXZlQ3JlYXRlO1xuXG5mdW5jdGlvbiByZXF1aXJlX25hdGl2ZUNyZWF0ZSAoKSB7XG5cdGlmIChoYXNSZXF1aXJlZF9uYXRpdmVDcmVhdGUpIHJldHVybiBfbmF0aXZlQ3JlYXRlO1xuXHRoYXNSZXF1aXJlZF9uYXRpdmVDcmVhdGUgPSAxO1xuXHR2YXIgZ2V0TmF0aXZlID0gcmVxdWlyZV9nZXROYXRpdmUoKTtcblxuXHQvKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG5cdHZhciBuYXRpdmVDcmVhdGUgPSBnZXROYXRpdmUoT2JqZWN0LCAnY3JlYXRlJyk7XG5cblx0X25hdGl2ZUNyZWF0ZSA9IG5hdGl2ZUNyZWF0ZTtcblx0cmV0dXJuIF9uYXRpdmVDcmVhdGU7XG59XG5cbnZhciBfaGFzaENsZWFyO1xudmFyIGhhc1JlcXVpcmVkX2hhc2hDbGVhcjtcblxuZnVuY3Rpb24gcmVxdWlyZV9oYXNoQ2xlYXIgKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRfaGFzaENsZWFyKSByZXR1cm4gX2hhc2hDbGVhcjtcblx0aGFzUmVxdWlyZWRfaGFzaENsZWFyID0gMTtcblx0dmFyIG5hdGl2ZUNyZWF0ZSA9IHJlcXVpcmVfbmF0aXZlQ3JlYXRlKCk7XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIGhhc2guXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBuYW1lIGNsZWFyXG5cdCAqIEBtZW1iZXJPZiBIYXNoXG5cdCAqL1xuXHRmdW5jdGlvbiBoYXNoQ2xlYXIoKSB7XG5cdCAgdGhpcy5fX2RhdGFfXyA9IG5hdGl2ZUNyZWF0ZSA/IG5hdGl2ZUNyZWF0ZShudWxsKSA6IHt9O1xuXHQgIHRoaXMuc2l6ZSA9IDA7XG5cdH1cblxuXHRfaGFzaENsZWFyID0gaGFzaENsZWFyO1xuXHRyZXR1cm4gX2hhc2hDbGVhcjtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgaGFzaC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZGVsZXRlXG4gKiBAbWVtYmVyT2YgSGFzaFxuICogQHBhcmFtIHtPYmplY3R9IGhhc2ggVGhlIGhhc2ggdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gKi9cblxudmFyIF9oYXNoRGVsZXRlO1xudmFyIGhhc1JlcXVpcmVkX2hhc2hEZWxldGU7XG5cbmZ1bmN0aW9uIHJlcXVpcmVfaGFzaERlbGV0ZSAoKSB7XG5cdGlmIChoYXNSZXF1aXJlZF9oYXNoRGVsZXRlKSByZXR1cm4gX2hhc2hEZWxldGU7XG5cdGhhc1JlcXVpcmVkX2hhc2hEZWxldGUgPSAxO1xuXHRmdW5jdGlvbiBoYXNoRGVsZXRlKGtleSkge1xuXHQgIHZhciByZXN1bHQgPSB0aGlzLmhhcyhrZXkpICYmIGRlbGV0ZSB0aGlzLl9fZGF0YV9fW2tleV07XG5cdCAgdGhpcy5zaXplIC09IHJlc3VsdCA/IDEgOiAwO1xuXHQgIHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRfaGFzaERlbGV0ZSA9IGhhc2hEZWxldGU7XG5cdHJldHVybiBfaGFzaERlbGV0ZTtcbn1cblxudmFyIF9oYXNoR2V0O1xudmFyIGhhc1JlcXVpcmVkX2hhc2hHZXQ7XG5cbmZ1bmN0aW9uIHJlcXVpcmVfaGFzaEdldCAoKSB7XG5cdGlmIChoYXNSZXF1aXJlZF9oYXNoR2V0KSByZXR1cm4gX2hhc2hHZXQ7XG5cdGhhc1JlcXVpcmVkX2hhc2hHZXQgPSAxO1xuXHR2YXIgbmF0aXZlQ3JlYXRlID0gcmVxdWlyZV9uYXRpdmVDcmVhdGUoKTtcblxuXHQvKiogVXNlZCB0byBzdGFuZC1pbiBmb3IgYHVuZGVmaW5lZGAgaGFzaCB2YWx1ZXMuICovXG5cdHZhciBIQVNIX1VOREVGSU5FRCA9ICdfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fJztcblxuXHQvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG5cdHZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cblx0LyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG5cdHZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBoYXNoIHZhbHVlIGZvciBga2V5YC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQG5hbWUgZ2V0XG5cdCAqIEBtZW1iZXJPZiBIYXNoXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuXHQgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG5cdCAqL1xuXHRmdW5jdGlvbiBoYXNoR2V0KGtleSkge1xuXHQgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcblx0ICBpZiAobmF0aXZlQ3JlYXRlKSB7XG5cdCAgICB2YXIgcmVzdWx0ID0gZGF0YVtrZXldO1xuXHQgICAgcmV0dXJuIHJlc3VsdCA9PT0gSEFTSF9VTkRFRklORUQgPyB1bmRlZmluZWQgOiByZXN1bHQ7XG5cdCAgfVxuXHQgIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSkgPyBkYXRhW2tleV0gOiB1bmRlZmluZWQ7XG5cdH1cblxuXHRfaGFzaEdldCA9IGhhc2hHZXQ7XG5cdHJldHVybiBfaGFzaEdldDtcbn1cblxudmFyIF9oYXNoSGFzO1xudmFyIGhhc1JlcXVpcmVkX2hhc2hIYXM7XG5cbmZ1bmN0aW9uIHJlcXVpcmVfaGFzaEhhcyAoKSB7XG5cdGlmIChoYXNSZXF1aXJlZF9oYXNoSGFzKSByZXR1cm4gX2hhc2hIYXM7XG5cdGhhc1JlcXVpcmVkX2hhc2hIYXMgPSAxO1xuXHR2YXIgbmF0aXZlQ3JlYXRlID0gcmVxdWlyZV9uYXRpdmVDcmVhdGUoKTtcblxuXHQvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG5cdHZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cblx0LyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG5cdHZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYSBoYXNoIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBuYW1lIGhhc1xuXHQgKiBAbWVtYmVyT2YgSGFzaFxuXHQgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuXHQgKi9cblx0ZnVuY3Rpb24gaGFzaEhhcyhrZXkpIHtcblx0ICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG5cdCAgcmV0dXJuIG5hdGl2ZUNyZWF0ZSA/IChkYXRhW2tleV0gIT09IHVuZGVmaW5lZCkgOiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSk7XG5cdH1cblxuXHRfaGFzaEhhcyA9IGhhc2hIYXM7XG5cdHJldHVybiBfaGFzaEhhcztcbn1cblxudmFyIF9oYXNoU2V0O1xudmFyIGhhc1JlcXVpcmVkX2hhc2hTZXQ7XG5cbmZ1bmN0aW9uIHJlcXVpcmVfaGFzaFNldCAoKSB7XG5cdGlmIChoYXNSZXF1aXJlZF9oYXNoU2V0KSByZXR1cm4gX2hhc2hTZXQ7XG5cdGhhc1JlcXVpcmVkX2hhc2hTZXQgPSAxO1xuXHR2YXIgbmF0aXZlQ3JlYXRlID0gcmVxdWlyZV9uYXRpdmVDcmVhdGUoKTtcblxuXHQvKiogVXNlZCB0byBzdGFuZC1pbiBmb3IgYHVuZGVmaW5lZGAgaGFzaCB2YWx1ZXMuICovXG5cdHZhciBIQVNIX1VOREVGSU5FRCA9ICdfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fJztcblxuXHQvKipcblx0ICogU2V0cyB0aGUgaGFzaCBga2V5YCB0byBgdmFsdWVgLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAbmFtZSBzZXRcblx0ICogQG1lbWJlck9mIEhhc2hcblx0ICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG5cdCAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cblx0ICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgaGFzaCBpbnN0YW5jZS5cblx0ICovXG5cdGZ1bmN0aW9uIGhhc2hTZXQoa2V5LCB2YWx1ZSkge1xuXHQgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcblx0ICB0aGlzLnNpemUgKz0gdGhpcy5oYXMoa2V5KSA/IDAgOiAxO1xuXHQgIGRhdGFba2V5XSA9IChuYXRpdmVDcmVhdGUgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCkgPyBIQVNIX1VOREVGSU5FRCA6IHZhbHVlO1xuXHQgIHJldHVybiB0aGlzO1xuXHR9XG5cblx0X2hhc2hTZXQgPSBoYXNoU2V0O1xuXHRyZXR1cm4gX2hhc2hTZXQ7XG59XG5cbnZhciBfSGFzaDtcbnZhciBoYXNSZXF1aXJlZF9IYXNoO1xuXG5mdW5jdGlvbiByZXF1aXJlX0hhc2ggKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRfSGFzaCkgcmV0dXJuIF9IYXNoO1xuXHRoYXNSZXF1aXJlZF9IYXNoID0gMTtcblx0dmFyIGhhc2hDbGVhciA9IHJlcXVpcmVfaGFzaENsZWFyKCksXG5cdCAgICBoYXNoRGVsZXRlID0gcmVxdWlyZV9oYXNoRGVsZXRlKCksXG5cdCAgICBoYXNoR2V0ID0gcmVxdWlyZV9oYXNoR2V0KCksXG5cdCAgICBoYXNoSGFzID0gcmVxdWlyZV9oYXNoSGFzKCksXG5cdCAgICBoYXNoU2V0ID0gcmVxdWlyZV9oYXNoU2V0KCk7XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBoYXNoIG9iamVjdC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuXHQgKi9cblx0ZnVuY3Rpb24gSGFzaChlbnRyaWVzKSB7XG5cdCAgdmFyIGluZGV4ID0gLTEsXG5cdCAgICAgIGxlbmd0aCA9IGVudHJpZXMgPT0gbnVsbCA/IDAgOiBlbnRyaWVzLmxlbmd0aDtcblxuXHQgIHRoaXMuY2xlYXIoKTtcblx0ICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuXHQgICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleF07XG5cdCAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xuXHQgIH1cblx0fVxuXG5cdC8vIEFkZCBtZXRob2RzIHRvIGBIYXNoYC5cblx0SGFzaC5wcm90b3R5cGUuY2xlYXIgPSBoYXNoQ2xlYXI7XG5cdEhhc2gucHJvdG90eXBlWydkZWxldGUnXSA9IGhhc2hEZWxldGU7XG5cdEhhc2gucHJvdG90eXBlLmdldCA9IGhhc2hHZXQ7XG5cdEhhc2gucHJvdG90eXBlLmhhcyA9IGhhc2hIYXM7XG5cdEhhc2gucHJvdG90eXBlLnNldCA9IGhhc2hTZXQ7XG5cblx0X0hhc2ggPSBIYXNoO1xuXHRyZXR1cm4gX0hhc2g7XG59XG5cbi8qKlxuICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgbGlzdCBjYWNoZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgY2xlYXJcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqL1xuXG52YXIgX2xpc3RDYWNoZUNsZWFyO1xudmFyIGhhc1JlcXVpcmVkX2xpc3RDYWNoZUNsZWFyO1xuXG5mdW5jdGlvbiByZXF1aXJlX2xpc3RDYWNoZUNsZWFyICgpIHtcblx0aWYgKGhhc1JlcXVpcmVkX2xpc3RDYWNoZUNsZWFyKSByZXR1cm4gX2xpc3RDYWNoZUNsZWFyO1xuXHRoYXNSZXF1aXJlZF9saXN0Q2FjaGVDbGVhciA9IDE7XG5cdGZ1bmN0aW9uIGxpc3RDYWNoZUNsZWFyKCkge1xuXHQgIHRoaXMuX19kYXRhX18gPSBbXTtcblx0ICB0aGlzLnNpemUgPSAwO1xuXHR9XG5cblx0X2xpc3RDYWNoZUNsZWFyID0gbGlzdENhY2hlQ2xlYXI7XG5cdHJldHVybiBfbGlzdENhY2hlQ2xlYXI7XG59XG5cbi8qKlxuICogUGVyZm9ybXMgYVxuICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAqIGNvbXBhcmlzb24gYmV0d2VlbiB0d28gdmFsdWVzIHRvIGRldGVybWluZSBpZiB0aGV5IGFyZSBlcXVpdmFsZW50LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICogdmFyIG90aGVyID0geyAnYSc6IDEgfTtcbiAqXG4gKiBfLmVxKG9iamVjdCwgb2JqZWN0KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmVxKG9iamVjdCwgb3RoZXIpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmVxKCdhJywgJ2EnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmVxKCdhJywgT2JqZWN0KCdhJykpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmVxKE5hTiwgTmFOKTtcbiAqIC8vID0+IHRydWVcbiAqL1xuXG52YXIgZXFfMTtcbnZhciBoYXNSZXF1aXJlZEVxO1xuXG5mdW5jdGlvbiByZXF1aXJlRXEgKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRFcSkgcmV0dXJuIGVxXzE7XG5cdGhhc1JlcXVpcmVkRXEgPSAxO1xuXHRmdW5jdGlvbiBlcSh2YWx1ZSwgb3RoZXIpIHtcblx0ICByZXR1cm4gdmFsdWUgPT09IG90aGVyIHx8ICh2YWx1ZSAhPT0gdmFsdWUgJiYgb3RoZXIgIT09IG90aGVyKTtcblx0fVxuXG5cdGVxXzEgPSBlcTtcblx0cmV0dXJuIGVxXzE7XG59XG5cbnZhciBfYXNzb2NJbmRleE9mO1xudmFyIGhhc1JlcXVpcmVkX2Fzc29jSW5kZXhPZjtcblxuZnVuY3Rpb24gcmVxdWlyZV9hc3NvY0luZGV4T2YgKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRfYXNzb2NJbmRleE9mKSByZXR1cm4gX2Fzc29jSW5kZXhPZjtcblx0aGFzUmVxdWlyZWRfYXNzb2NJbmRleE9mID0gMTtcblx0dmFyIGVxID0gcmVxdWlyZUVxKCk7XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGluZGV4IGF0IHdoaWNoIHRoZSBga2V5YCBpcyBmb3VuZCBpbiBgYXJyYXlgIG9mIGtleS12YWx1ZSBwYWlycy5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG5cdCAqIEBwYXJhbSB7Kn0ga2V5IFRoZSBrZXkgdG8gc2VhcmNoIGZvci5cblx0ICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cblx0ICovXG5cdGZ1bmN0aW9uIGFzc29jSW5kZXhPZihhcnJheSwga2V5KSB7XG5cdCAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblx0ICB3aGlsZSAobGVuZ3RoLS0pIHtcblx0ICAgIGlmIChlcShhcnJheVtsZW5ndGhdWzBdLCBrZXkpKSB7XG5cdCAgICAgIHJldHVybiBsZW5ndGg7XG5cdCAgICB9XG5cdCAgfVxuXHQgIHJldHVybiAtMTtcblx0fVxuXG5cdF9hc3NvY0luZGV4T2YgPSBhc3NvY0luZGV4T2Y7XG5cdHJldHVybiBfYXNzb2NJbmRleE9mO1xufVxuXG52YXIgX2xpc3RDYWNoZURlbGV0ZTtcbnZhciBoYXNSZXF1aXJlZF9saXN0Q2FjaGVEZWxldGU7XG5cbmZ1bmN0aW9uIHJlcXVpcmVfbGlzdENhY2hlRGVsZXRlICgpIHtcblx0aWYgKGhhc1JlcXVpcmVkX2xpc3RDYWNoZURlbGV0ZSkgcmV0dXJuIF9saXN0Q2FjaGVEZWxldGU7XG5cdGhhc1JlcXVpcmVkX2xpc3RDYWNoZURlbGV0ZSA9IDE7XG5cdHZhciBhc3NvY0luZGV4T2YgPSByZXF1aXJlX2Fzc29jSW5kZXhPZigpO1xuXG5cdC8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cblx0dmFyIGFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGU7XG5cblx0LyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG5cdHZhciBzcGxpY2UgPSBhcnJheVByb3RvLnNwbGljZTtcblxuXHQvKipcblx0ICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIGxpc3QgY2FjaGUuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBuYW1lIGRlbGV0ZVxuXHQgKiBAbWVtYmVyT2YgTGlzdENhY2hlXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG5cdCAqL1xuXHRmdW5jdGlvbiBsaXN0Q2FjaGVEZWxldGUoa2V5KSB7XG5cdCAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuXHQgICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG5cdCAgaWYgKGluZGV4IDwgMCkge1xuXHQgICAgcmV0dXJuIGZhbHNlO1xuXHQgIH1cblx0ICB2YXIgbGFzdEluZGV4ID0gZGF0YS5sZW5ndGggLSAxO1xuXHQgIGlmIChpbmRleCA9PSBsYXN0SW5kZXgpIHtcblx0ICAgIGRhdGEucG9wKCk7XG5cdCAgfSBlbHNlIHtcblx0ICAgIHNwbGljZS5jYWxsKGRhdGEsIGluZGV4LCAxKTtcblx0ICB9XG5cdCAgLS10aGlzLnNpemU7XG5cdCAgcmV0dXJuIHRydWU7XG5cdH1cblxuXHRfbGlzdENhY2hlRGVsZXRlID0gbGlzdENhY2hlRGVsZXRlO1xuXHRyZXR1cm4gX2xpc3RDYWNoZURlbGV0ZTtcbn1cblxudmFyIF9saXN0Q2FjaGVHZXQ7XG52YXIgaGFzUmVxdWlyZWRfbGlzdENhY2hlR2V0O1xuXG5mdW5jdGlvbiByZXF1aXJlX2xpc3RDYWNoZUdldCAoKSB7XG5cdGlmIChoYXNSZXF1aXJlZF9saXN0Q2FjaGVHZXQpIHJldHVybiBfbGlzdENhY2hlR2V0O1xuXHRoYXNSZXF1aXJlZF9saXN0Q2FjaGVHZXQgPSAxO1xuXHR2YXIgYXNzb2NJbmRleE9mID0gcmVxdWlyZV9hc3NvY0luZGV4T2YoKTtcblxuXHQvKipcblx0ICogR2V0cyB0aGUgbGlzdCBjYWNoZSB2YWx1ZSBmb3IgYGtleWAuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBuYW1lIGdldFxuXHQgKiBAbWVtYmVyT2YgTGlzdENhY2hlXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuXHQgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG5cdCAqL1xuXHRmdW5jdGlvbiBsaXN0Q2FjaGVHZXQoa2V5KSB7XG5cdCAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuXHQgICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG5cdCAgcmV0dXJuIGluZGV4IDwgMCA/IHVuZGVmaW5lZCA6IGRhdGFbaW5kZXhdWzFdO1xuXHR9XG5cblx0X2xpc3RDYWNoZUdldCA9IGxpc3RDYWNoZUdldDtcblx0cmV0dXJuIF9saXN0Q2FjaGVHZXQ7XG59XG5cbnZhciBfbGlzdENhY2hlSGFzO1xudmFyIGhhc1JlcXVpcmVkX2xpc3RDYWNoZUhhcztcblxuZnVuY3Rpb24gcmVxdWlyZV9saXN0Q2FjaGVIYXMgKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRfbGlzdENhY2hlSGFzKSByZXR1cm4gX2xpc3RDYWNoZUhhcztcblx0aGFzUmVxdWlyZWRfbGlzdENhY2hlSGFzID0gMTtcblx0dmFyIGFzc29jSW5kZXhPZiA9IHJlcXVpcmVfYXNzb2NJbmRleE9mKCk7XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBhIGxpc3QgY2FjaGUgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQG5hbWUgaGFzXG5cdCAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcblx0ICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cblx0ICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cblx0ICovXG5cdGZ1bmN0aW9uIGxpc3RDYWNoZUhhcyhrZXkpIHtcblx0ICByZXR1cm4gYXNzb2NJbmRleE9mKHRoaXMuX19kYXRhX18sIGtleSkgPiAtMTtcblx0fVxuXG5cdF9saXN0Q2FjaGVIYXMgPSBsaXN0Q2FjaGVIYXM7XG5cdHJldHVybiBfbGlzdENhY2hlSGFzO1xufVxuXG52YXIgX2xpc3RDYWNoZVNldDtcbnZhciBoYXNSZXF1aXJlZF9saXN0Q2FjaGVTZXQ7XG5cbmZ1bmN0aW9uIHJlcXVpcmVfbGlzdENhY2hlU2V0ICgpIHtcblx0aWYgKGhhc1JlcXVpcmVkX2xpc3RDYWNoZVNldCkgcmV0dXJuIF9saXN0Q2FjaGVTZXQ7XG5cdGhhc1JlcXVpcmVkX2xpc3RDYWNoZVNldCA9IDE7XG5cdHZhciBhc3NvY0luZGV4T2YgPSByZXF1aXJlX2Fzc29jSW5kZXhPZigpO1xuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBsaXN0IGNhY2hlIGBrZXlgIHRvIGB2YWx1ZWAuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBuYW1lIHNldFxuXHQgKiBAbWVtYmVyT2YgTGlzdENhY2hlXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuXHQgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG5cdCAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGxpc3QgY2FjaGUgaW5zdGFuY2UuXG5cdCAqL1xuXHRmdW5jdGlvbiBsaXN0Q2FjaGVTZXQoa2V5LCB2YWx1ZSkge1xuXHQgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcblx0ICAgICAgaW5kZXggPSBhc3NvY0luZGV4T2YoZGF0YSwga2V5KTtcblxuXHQgIGlmIChpbmRleCA8IDApIHtcblx0ICAgICsrdGhpcy5zaXplO1xuXHQgICAgZGF0YS5wdXNoKFtrZXksIHZhbHVlXSk7XG5cdCAgfSBlbHNlIHtcblx0ICAgIGRhdGFbaW5kZXhdWzFdID0gdmFsdWU7XG5cdCAgfVxuXHQgIHJldHVybiB0aGlzO1xuXHR9XG5cblx0X2xpc3RDYWNoZVNldCA9IGxpc3RDYWNoZVNldDtcblx0cmV0dXJuIF9saXN0Q2FjaGVTZXQ7XG59XG5cbnZhciBfTGlzdENhY2hlO1xudmFyIGhhc1JlcXVpcmVkX0xpc3RDYWNoZTtcblxuZnVuY3Rpb24gcmVxdWlyZV9MaXN0Q2FjaGUgKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRfTGlzdENhY2hlKSByZXR1cm4gX0xpc3RDYWNoZTtcblx0aGFzUmVxdWlyZWRfTGlzdENhY2hlID0gMTtcblx0dmFyIGxpc3RDYWNoZUNsZWFyID0gcmVxdWlyZV9saXN0Q2FjaGVDbGVhcigpLFxuXHQgICAgbGlzdENhY2hlRGVsZXRlID0gcmVxdWlyZV9saXN0Q2FjaGVEZWxldGUoKSxcblx0ICAgIGxpc3RDYWNoZUdldCA9IHJlcXVpcmVfbGlzdENhY2hlR2V0KCksXG5cdCAgICBsaXN0Q2FjaGVIYXMgPSByZXF1aXJlX2xpc3RDYWNoZUhhcygpLFxuXHQgICAgbGlzdENhY2hlU2V0ID0gcmVxdWlyZV9saXN0Q2FjaGVTZXQoKTtcblxuXHQvKipcblx0ICogQ3JlYXRlcyBhbiBsaXN0IGNhY2hlIG9iamVjdC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuXHQgKi9cblx0ZnVuY3Rpb24gTGlzdENhY2hlKGVudHJpZXMpIHtcblx0ICB2YXIgaW5kZXggPSAtMSxcblx0ICAgICAgbGVuZ3RoID0gZW50cmllcyA9PSBudWxsID8gMCA6IGVudHJpZXMubGVuZ3RoO1xuXG5cdCAgdGhpcy5jbGVhcigpO1xuXHQgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG5cdCAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcblx0ICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG5cdCAgfVxuXHR9XG5cblx0Ly8gQWRkIG1ldGhvZHMgdG8gYExpc3RDYWNoZWAuXG5cdExpc3RDYWNoZS5wcm90b3R5cGUuY2xlYXIgPSBsaXN0Q2FjaGVDbGVhcjtcblx0TGlzdENhY2hlLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBsaXN0Q2FjaGVEZWxldGU7XG5cdExpc3RDYWNoZS5wcm90b3R5cGUuZ2V0ID0gbGlzdENhY2hlR2V0O1xuXHRMaXN0Q2FjaGUucHJvdG90eXBlLmhhcyA9IGxpc3RDYWNoZUhhcztcblx0TGlzdENhY2hlLnByb3RvdHlwZS5zZXQgPSBsaXN0Q2FjaGVTZXQ7XG5cblx0X0xpc3RDYWNoZSA9IExpc3RDYWNoZTtcblx0cmV0dXJuIF9MaXN0Q2FjaGU7XG59XG5cbnZhciBfTWFwO1xudmFyIGhhc1JlcXVpcmVkX01hcDtcblxuZnVuY3Rpb24gcmVxdWlyZV9NYXAgKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRfTWFwKSByZXR1cm4gX01hcDtcblx0aGFzUmVxdWlyZWRfTWFwID0gMTtcblx0dmFyIGdldE5hdGl2ZSA9IHJlcXVpcmVfZ2V0TmF0aXZlKCksXG5cdCAgICByb290ID0gcmVxdWlyZV9yb290KCk7XG5cblx0LyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xuXHR2YXIgTWFwID0gZ2V0TmF0aXZlKHJvb3QsICdNYXAnKTtcblxuXHRfTWFwID0gTWFwO1xuXHRyZXR1cm4gX01hcDtcbn1cblxudmFyIF9tYXBDYWNoZUNsZWFyO1xudmFyIGhhc1JlcXVpcmVkX21hcENhY2hlQ2xlYXI7XG5cbmZ1bmN0aW9uIHJlcXVpcmVfbWFwQ2FjaGVDbGVhciAoKSB7XG5cdGlmIChoYXNSZXF1aXJlZF9tYXBDYWNoZUNsZWFyKSByZXR1cm4gX21hcENhY2hlQ2xlYXI7XG5cdGhhc1JlcXVpcmVkX21hcENhY2hlQ2xlYXIgPSAxO1xuXHR2YXIgSGFzaCA9IHJlcXVpcmVfSGFzaCgpLFxuXHQgICAgTGlzdENhY2hlID0gcmVxdWlyZV9MaXN0Q2FjaGUoKSxcblx0ICAgIE1hcCA9IHJlcXVpcmVfTWFwKCk7XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIG1hcC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQG5hbWUgY2xlYXJcblx0ICogQG1lbWJlck9mIE1hcENhY2hlXG5cdCAqL1xuXHRmdW5jdGlvbiBtYXBDYWNoZUNsZWFyKCkge1xuXHQgIHRoaXMuc2l6ZSA9IDA7XG5cdCAgdGhpcy5fX2RhdGFfXyA9IHtcblx0ICAgICdoYXNoJzogbmV3IEhhc2gsXG5cdCAgICAnbWFwJzogbmV3IChNYXAgfHwgTGlzdENhY2hlKSxcblx0ICAgICdzdHJpbmcnOiBuZXcgSGFzaFxuXHQgIH07XG5cdH1cblxuXHRfbWFwQ2FjaGVDbGVhciA9IG1hcENhY2hlQ2xlYXI7XG5cdHJldHVybiBfbWFwQ2FjaGVDbGVhcjtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSBmb3IgdXNlIGFzIHVuaXF1ZSBvYmplY3Qga2V5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIHN1aXRhYmxlLCBlbHNlIGBmYWxzZWAuXG4gKi9cblxudmFyIF9pc0tleWFibGU7XG52YXIgaGFzUmVxdWlyZWRfaXNLZXlhYmxlO1xuXG5mdW5jdGlvbiByZXF1aXJlX2lzS2V5YWJsZSAoKSB7XG5cdGlmIChoYXNSZXF1aXJlZF9pc0tleWFibGUpIHJldHVybiBfaXNLZXlhYmxlO1xuXHRoYXNSZXF1aXJlZF9pc0tleWFibGUgPSAxO1xuXHRmdW5jdGlvbiBpc0tleWFibGUodmFsdWUpIHtcblx0ICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcblx0ICByZXR1cm4gKHR5cGUgPT0gJ3N0cmluZycgfHwgdHlwZSA9PSAnbnVtYmVyJyB8fCB0eXBlID09ICdzeW1ib2wnIHx8IHR5cGUgPT0gJ2Jvb2xlYW4nKVxuXHQgICAgPyAodmFsdWUgIT09ICdfX3Byb3RvX18nKVxuXHQgICAgOiAodmFsdWUgPT09IG51bGwpO1xuXHR9XG5cblx0X2lzS2V5YWJsZSA9IGlzS2V5YWJsZTtcblx0cmV0dXJuIF9pc0tleWFibGU7XG59XG5cbnZhciBfZ2V0TWFwRGF0YTtcbnZhciBoYXNSZXF1aXJlZF9nZXRNYXBEYXRhO1xuXG5mdW5jdGlvbiByZXF1aXJlX2dldE1hcERhdGEgKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRfZ2V0TWFwRGF0YSkgcmV0dXJuIF9nZXRNYXBEYXRhO1xuXHRoYXNSZXF1aXJlZF9nZXRNYXBEYXRhID0gMTtcblx0dmFyIGlzS2V5YWJsZSA9IHJlcXVpcmVfaXNLZXlhYmxlKCk7XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGRhdGEgZm9yIGBtYXBgLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge09iamVjdH0gbWFwIFRoZSBtYXAgdG8gcXVlcnkuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIHJlZmVyZW5jZSBrZXkuXG5cdCAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXAgZGF0YS5cblx0ICovXG5cdGZ1bmN0aW9uIGdldE1hcERhdGEobWFwLCBrZXkpIHtcblx0ICB2YXIgZGF0YSA9IG1hcC5fX2RhdGFfXztcblx0ICByZXR1cm4gaXNLZXlhYmxlKGtleSlcblx0ICAgID8gZGF0YVt0eXBlb2Yga2V5ID09ICdzdHJpbmcnID8gJ3N0cmluZycgOiAnaGFzaCddXG5cdCAgICA6IGRhdGEubWFwO1xuXHR9XG5cblx0X2dldE1hcERhdGEgPSBnZXRNYXBEYXRhO1xuXHRyZXR1cm4gX2dldE1hcERhdGE7XG59XG5cbnZhciBfbWFwQ2FjaGVEZWxldGU7XG52YXIgaGFzUmVxdWlyZWRfbWFwQ2FjaGVEZWxldGU7XG5cbmZ1bmN0aW9uIHJlcXVpcmVfbWFwQ2FjaGVEZWxldGUgKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRfbWFwQ2FjaGVEZWxldGUpIHJldHVybiBfbWFwQ2FjaGVEZWxldGU7XG5cdGhhc1JlcXVpcmVkX21hcENhY2hlRGVsZXRlID0gMTtcblx0dmFyIGdldE1hcERhdGEgPSByZXF1aXJlX2dldE1hcERhdGEoKTtcblxuXHQvKipcblx0ICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIG1hcC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQG5hbWUgZGVsZXRlXG5cdCAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuXHQgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cblx0ICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuXHQgKi9cblx0ZnVuY3Rpb24gbWFwQ2FjaGVEZWxldGUoa2V5KSB7XG5cdCAgdmFyIHJlc3VsdCA9IGdldE1hcERhdGEodGhpcywga2V5KVsnZGVsZXRlJ10oa2V5KTtcblx0ICB0aGlzLnNpemUgLT0gcmVzdWx0ID8gMSA6IDA7XG5cdCAgcmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdF9tYXBDYWNoZURlbGV0ZSA9IG1hcENhY2hlRGVsZXRlO1xuXHRyZXR1cm4gX21hcENhY2hlRGVsZXRlO1xufVxuXG52YXIgX21hcENhY2hlR2V0O1xudmFyIGhhc1JlcXVpcmVkX21hcENhY2hlR2V0O1xuXG5mdW5jdGlvbiByZXF1aXJlX21hcENhY2hlR2V0ICgpIHtcblx0aWYgKGhhc1JlcXVpcmVkX21hcENhY2hlR2V0KSByZXR1cm4gX21hcENhY2hlR2V0O1xuXHRoYXNSZXF1aXJlZF9tYXBDYWNoZUdldCA9IDE7XG5cdHZhciBnZXRNYXBEYXRhID0gcmVxdWlyZV9nZXRNYXBEYXRhKCk7XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIG1hcCB2YWx1ZSBmb3IgYGtleWAuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBuYW1lIGdldFxuXHQgKiBAbWVtYmVyT2YgTWFwQ2FjaGVcblx0ICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG5cdCAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cblx0ICovXG5cdGZ1bmN0aW9uIG1hcENhY2hlR2V0KGtleSkge1xuXHQgIHJldHVybiBnZXRNYXBEYXRhKHRoaXMsIGtleSkuZ2V0KGtleSk7XG5cdH1cblxuXHRfbWFwQ2FjaGVHZXQgPSBtYXBDYWNoZUdldDtcblx0cmV0dXJuIF9tYXBDYWNoZUdldDtcbn1cblxudmFyIF9tYXBDYWNoZUhhcztcbnZhciBoYXNSZXF1aXJlZF9tYXBDYWNoZUhhcztcblxuZnVuY3Rpb24gcmVxdWlyZV9tYXBDYWNoZUhhcyAoKSB7XG5cdGlmIChoYXNSZXF1aXJlZF9tYXBDYWNoZUhhcykgcmV0dXJuIF9tYXBDYWNoZUhhcztcblx0aGFzUmVxdWlyZWRfbWFwQ2FjaGVIYXMgPSAxO1xuXHR2YXIgZ2V0TWFwRGF0YSA9IHJlcXVpcmVfZ2V0TWFwRGF0YSgpO1xuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYSBtYXAgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQG5hbWUgaGFzXG5cdCAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuXHQgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuXHQgKi9cblx0ZnVuY3Rpb24gbWFwQ2FjaGVIYXMoa2V5KSB7XG5cdCAgcmV0dXJuIGdldE1hcERhdGEodGhpcywga2V5KS5oYXMoa2V5KTtcblx0fVxuXG5cdF9tYXBDYWNoZUhhcyA9IG1hcENhY2hlSGFzO1xuXHRyZXR1cm4gX21hcENhY2hlSGFzO1xufVxuXG52YXIgX21hcENhY2hlU2V0O1xudmFyIGhhc1JlcXVpcmVkX21hcENhY2hlU2V0O1xuXG5mdW5jdGlvbiByZXF1aXJlX21hcENhY2hlU2V0ICgpIHtcblx0aWYgKGhhc1JlcXVpcmVkX21hcENhY2hlU2V0KSByZXR1cm4gX21hcENhY2hlU2V0O1xuXHRoYXNSZXF1aXJlZF9tYXBDYWNoZVNldCA9IDE7XG5cdHZhciBnZXRNYXBEYXRhID0gcmVxdWlyZV9nZXRNYXBEYXRhKCk7XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIG1hcCBga2V5YCB0byBgdmFsdWVgLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAbmFtZSBzZXRcblx0ICogQG1lbWJlck9mIE1hcENhY2hlXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuXHQgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG5cdCAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG1hcCBjYWNoZSBpbnN0YW5jZS5cblx0ICovXG5cdGZ1bmN0aW9uIG1hcENhY2hlU2V0KGtleSwgdmFsdWUpIHtcblx0ICB2YXIgZGF0YSA9IGdldE1hcERhdGEodGhpcywga2V5KSxcblx0ICAgICAgc2l6ZSA9IGRhdGEuc2l6ZTtcblxuXHQgIGRhdGEuc2V0KGtleSwgdmFsdWUpO1xuXHQgIHRoaXMuc2l6ZSArPSBkYXRhLnNpemUgPT0gc2l6ZSA/IDAgOiAxO1xuXHQgIHJldHVybiB0aGlzO1xuXHR9XG5cblx0X21hcENhY2hlU2V0ID0gbWFwQ2FjaGVTZXQ7XG5cdHJldHVybiBfbWFwQ2FjaGVTZXQ7XG59XG5cbnZhciBfTWFwQ2FjaGU7XG52YXIgaGFzUmVxdWlyZWRfTWFwQ2FjaGU7XG5cbmZ1bmN0aW9uIHJlcXVpcmVfTWFwQ2FjaGUgKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRfTWFwQ2FjaGUpIHJldHVybiBfTWFwQ2FjaGU7XG5cdGhhc1JlcXVpcmVkX01hcENhY2hlID0gMTtcblx0dmFyIG1hcENhY2hlQ2xlYXIgPSByZXF1aXJlX21hcENhY2hlQ2xlYXIoKSxcblx0ICAgIG1hcENhY2hlRGVsZXRlID0gcmVxdWlyZV9tYXBDYWNoZURlbGV0ZSgpLFxuXHQgICAgbWFwQ2FjaGVHZXQgPSByZXF1aXJlX21hcENhY2hlR2V0KCksXG5cdCAgICBtYXBDYWNoZUhhcyA9IHJlcXVpcmVfbWFwQ2FjaGVIYXMoKSxcblx0ICAgIG1hcENhY2hlU2V0ID0gcmVxdWlyZV9tYXBDYWNoZVNldCgpO1xuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbWFwIGNhY2hlIG9iamVjdCB0byBzdG9yZSBrZXktdmFsdWUgcGFpcnMuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cblx0ICovXG5cdGZ1bmN0aW9uIE1hcENhY2hlKGVudHJpZXMpIHtcblx0ICB2YXIgaW5kZXggPSAtMSxcblx0ICAgICAgbGVuZ3RoID0gZW50cmllcyA9PSBudWxsID8gMCA6IGVudHJpZXMubGVuZ3RoO1xuXG5cdCAgdGhpcy5jbGVhcigpO1xuXHQgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG5cdCAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcblx0ICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG5cdCAgfVxuXHR9XG5cblx0Ly8gQWRkIG1ldGhvZHMgdG8gYE1hcENhY2hlYC5cblx0TWFwQ2FjaGUucHJvdG90eXBlLmNsZWFyID0gbWFwQ2FjaGVDbGVhcjtcblx0TWFwQ2FjaGUucHJvdG90eXBlWydkZWxldGUnXSA9IG1hcENhY2hlRGVsZXRlO1xuXHRNYXBDYWNoZS5wcm90b3R5cGUuZ2V0ID0gbWFwQ2FjaGVHZXQ7XG5cdE1hcENhY2hlLnByb3RvdHlwZS5oYXMgPSBtYXBDYWNoZUhhcztcblx0TWFwQ2FjaGUucHJvdG90eXBlLnNldCA9IG1hcENhY2hlU2V0O1xuXG5cdF9NYXBDYWNoZSA9IE1hcENhY2hlO1xuXHRyZXR1cm4gX01hcENhY2hlO1xufVxuXG52YXIgbWVtb2l6ZV8xO1xudmFyIGhhc1JlcXVpcmVkTWVtb2l6ZTtcblxuZnVuY3Rpb24gcmVxdWlyZU1lbW9pemUgKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRNZW1vaXplKSByZXR1cm4gbWVtb2l6ZV8xO1xuXHRoYXNSZXF1aXJlZE1lbW9pemUgPSAxO1xuXHR2YXIgTWFwQ2FjaGUgPSByZXF1aXJlX01hcENhY2hlKCk7XG5cblx0LyoqIEVycm9yIG1lc3NhZ2UgY29uc3RhbnRzLiAqL1xuXHR2YXIgRlVOQ19FUlJPUl9URVhUID0gJ0V4cGVjdGVkIGEgZnVuY3Rpb24nO1xuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBtZW1vaXplcyB0aGUgcmVzdWx0IG9mIGBmdW5jYC4gSWYgYHJlc29sdmVyYCBpc1xuXHQgKiBwcm92aWRlZCwgaXQgZGV0ZXJtaW5lcyB0aGUgY2FjaGUga2V5IGZvciBzdG9yaW5nIHRoZSByZXN1bHQgYmFzZWQgb24gdGhlXG5cdCAqIGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24uIEJ5IGRlZmF1bHQsIHRoZSBmaXJzdCBhcmd1bWVudFxuXHQgKiBwcm92aWRlZCB0byB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24gaXMgdXNlZCBhcyB0aGUgbWFwIGNhY2hlIGtleS4gVGhlIGBmdW5jYFxuXHQgKiBpcyBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIHRoZSBtZW1vaXplZCBmdW5jdGlvbi5cblx0ICpcblx0ICogKipOb3RlOioqIFRoZSBjYWNoZSBpcyBleHBvc2VkIGFzIHRoZSBgY2FjaGVgIHByb3BlcnR5IG9uIHRoZSBtZW1vaXplZFxuXHQgKiBmdW5jdGlvbi4gSXRzIGNyZWF0aW9uIG1heSBiZSBjdXN0b21pemVkIGJ5IHJlcGxhY2luZyB0aGUgYF8ubWVtb2l6ZS5DYWNoZWBcblx0ICogY29uc3RydWN0b3Igd2l0aCBvbmUgd2hvc2UgaW5zdGFuY2VzIGltcGxlbWVudCB0aGVcblx0ICogW2BNYXBgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1wcm9wZXJ0aWVzLW9mLXRoZS1tYXAtcHJvdG90eXBlLW9iamVjdClcblx0ICogbWV0aG9kIGludGVyZmFjZSBvZiBgY2xlYXJgLCBgZGVsZXRlYCwgYGdldGAsIGBoYXNgLCBhbmQgYHNldGAuXG5cdCAqXG5cdCAqIEBzdGF0aWNcblx0ICogQG1lbWJlck9mIF9cblx0ICogQHNpbmNlIDAuMS4wXG5cdCAqIEBjYXRlZ29yeSBGdW5jdGlvblxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBoYXZlIGl0cyBvdXRwdXQgbWVtb2l6ZWQuXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IFtyZXNvbHZlcl0gVGhlIGZ1bmN0aW9uIHRvIHJlc29sdmUgdGhlIGNhY2hlIGtleS5cblx0ICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgbWVtb2l6ZWQgZnVuY3Rpb24uXG5cdCAqIEBleGFtcGxlXG5cdCAqXG5cdCAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAyIH07XG5cdCAqIHZhciBvdGhlciA9IHsgJ2MnOiAzLCAnZCc6IDQgfTtcblx0ICpcblx0ICogdmFyIHZhbHVlcyA9IF8ubWVtb2l6ZShfLnZhbHVlcyk7XG5cdCAqIHZhbHVlcyhvYmplY3QpO1xuXHQgKiAvLyA9PiBbMSwgMl1cblx0ICpcblx0ICogdmFsdWVzKG90aGVyKTtcblx0ICogLy8gPT4gWzMsIDRdXG5cdCAqXG5cdCAqIG9iamVjdC5hID0gMjtcblx0ICogdmFsdWVzKG9iamVjdCk7XG5cdCAqIC8vID0+IFsxLCAyXVxuXHQgKlxuXHQgKiAvLyBNb2RpZnkgdGhlIHJlc3VsdCBjYWNoZS5cblx0ICogdmFsdWVzLmNhY2hlLnNldChvYmplY3QsIFsnYScsICdiJ10pO1xuXHQgKiB2YWx1ZXMob2JqZWN0KTtcblx0ICogLy8gPT4gWydhJywgJ2InXVxuXHQgKlxuXHQgKiAvLyBSZXBsYWNlIGBfLm1lbW9pemUuQ2FjaGVgLlxuXHQgKiBfLm1lbW9pemUuQ2FjaGUgPSBXZWFrTWFwO1xuXHQgKi9cblx0ZnVuY3Rpb24gbWVtb2l6ZShmdW5jLCByZXNvbHZlcikge1xuXHQgIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nIHx8IChyZXNvbHZlciAhPSBudWxsICYmIHR5cGVvZiByZXNvbHZlciAhPSAnZnVuY3Rpb24nKSkge1xuXHQgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuXHQgIH1cblx0ICB2YXIgbWVtb2l6ZWQgPSBmdW5jdGlvbigpIHtcblx0ICAgIHZhciBhcmdzID0gYXJndW1lbnRzLFxuXHQgICAgICAgIGtleSA9IHJlc29sdmVyID8gcmVzb2x2ZXIuYXBwbHkodGhpcywgYXJncykgOiBhcmdzWzBdLFxuXHQgICAgICAgIGNhY2hlID0gbWVtb2l6ZWQuY2FjaGU7XG5cblx0ICAgIGlmIChjYWNoZS5oYXMoa2V5KSkge1xuXHQgICAgICByZXR1cm4gY2FjaGUuZ2V0KGtleSk7XG5cdCAgICB9XG5cdCAgICB2YXIgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzLCBhcmdzKTtcblx0ICAgIG1lbW9pemVkLmNhY2hlID0gY2FjaGUuc2V0KGtleSwgcmVzdWx0KSB8fCBjYWNoZTtcblx0ICAgIHJldHVybiByZXN1bHQ7XG5cdCAgfTtcblx0ICBtZW1vaXplZC5jYWNoZSA9IG5ldyAobWVtb2l6ZS5DYWNoZSB8fCBNYXBDYWNoZSk7XG5cdCAgcmV0dXJuIG1lbW9pemVkO1xuXHR9XG5cblx0Ly8gRXhwb3NlIGBNYXBDYWNoZWAuXG5cdG1lbW9pemUuQ2FjaGUgPSBNYXBDYWNoZTtcblxuXHRtZW1vaXplXzEgPSBtZW1vaXplO1xuXHRyZXR1cm4gbWVtb2l6ZV8xO1xufVxuXG52YXIgX21lbW9pemVDYXBwZWQ7XG52YXIgaGFzUmVxdWlyZWRfbWVtb2l6ZUNhcHBlZDtcblxuZnVuY3Rpb24gcmVxdWlyZV9tZW1vaXplQ2FwcGVkICgpIHtcblx0aWYgKGhhc1JlcXVpcmVkX21lbW9pemVDYXBwZWQpIHJldHVybiBfbWVtb2l6ZUNhcHBlZDtcblx0aGFzUmVxdWlyZWRfbWVtb2l6ZUNhcHBlZCA9IDE7XG5cdHZhciBtZW1vaXplID0gcmVxdWlyZU1lbW9pemUoKTtcblxuXHQvKiogVXNlZCBhcyB0aGUgbWF4aW11bSBtZW1vaXplIGNhY2hlIHNpemUuICovXG5cdHZhciBNQVhfTUVNT0laRV9TSVpFID0gNTAwO1xuXG5cdC8qKlxuXHQgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ubWVtb2l6ZWAgd2hpY2ggY2xlYXJzIHRoZSBtZW1vaXplZCBmdW5jdGlvbidzXG5cdCAqIGNhY2hlIHdoZW4gaXQgZXhjZWVkcyBgTUFYX01FTU9JWkVfU0laRWAuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGhhdmUgaXRzIG91dHB1dCBtZW1vaXplZC5cblx0ICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgbWVtb2l6ZWQgZnVuY3Rpb24uXG5cdCAqL1xuXHRmdW5jdGlvbiBtZW1vaXplQ2FwcGVkKGZ1bmMpIHtcblx0ICB2YXIgcmVzdWx0ID0gbWVtb2l6ZShmdW5jLCBmdW5jdGlvbihrZXkpIHtcblx0ICAgIGlmIChjYWNoZS5zaXplID09PSBNQVhfTUVNT0laRV9TSVpFKSB7XG5cdCAgICAgIGNhY2hlLmNsZWFyKCk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4ga2V5O1xuXHQgIH0pO1xuXG5cdCAgdmFyIGNhY2hlID0gcmVzdWx0LmNhY2hlO1xuXHQgIHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRfbWVtb2l6ZUNhcHBlZCA9IG1lbW9pemVDYXBwZWQ7XG5cdHJldHVybiBfbWVtb2l6ZUNhcHBlZDtcbn1cblxudmFyIF9zdHJpbmdUb1BhdGg7XG52YXIgaGFzUmVxdWlyZWRfc3RyaW5nVG9QYXRoO1xuXG5mdW5jdGlvbiByZXF1aXJlX3N0cmluZ1RvUGF0aCAoKSB7XG5cdGlmIChoYXNSZXF1aXJlZF9zdHJpbmdUb1BhdGgpIHJldHVybiBfc3RyaW5nVG9QYXRoO1xuXHRoYXNSZXF1aXJlZF9zdHJpbmdUb1BhdGggPSAxO1xuXHR2YXIgbWVtb2l6ZUNhcHBlZCA9IHJlcXVpcmVfbWVtb2l6ZUNhcHBlZCgpO1xuXG5cdC8qKiBVc2VkIHRvIG1hdGNoIHByb3BlcnR5IG5hbWVzIHdpdGhpbiBwcm9wZXJ0eSBwYXRocy4gKi9cblx0dmFyIHJlUHJvcE5hbWUgPSAvW14uW1xcXV0rfFxcWyg/OigtP1xcZCsoPzpcXC5cXGQrKT8pfChbXCInXSkoKD86KD8hXFwyKVteXFxcXF18XFxcXC4pKj8pXFwyKVxcXXwoPz0oPzpcXC58XFxbXFxdKSg/OlxcLnxcXFtcXF18JCkpL2c7XG5cblx0LyoqIFVzZWQgdG8gbWF0Y2ggYmFja3NsYXNoZXMgaW4gcHJvcGVydHkgcGF0aHMuICovXG5cdHZhciByZUVzY2FwZUNoYXIgPSAvXFxcXChcXFxcKT8vZztcblxuXHQvKipcblx0ICogQ29udmVydHMgYHN0cmluZ2AgdG8gYSBwcm9wZXJ0eSBwYXRoIGFycmF5LlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gY29udmVydC5cblx0ICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBwYXRoIGFycmF5LlxuXHQgKi9cblx0dmFyIHN0cmluZ1RvUGF0aCA9IG1lbW9pemVDYXBwZWQoZnVuY3Rpb24oc3RyaW5nKSB7XG5cdCAgdmFyIHJlc3VsdCA9IFtdO1xuXHQgIGlmIChzdHJpbmcuY2hhckNvZGVBdCgwKSA9PT0gNDYgLyogLiAqLykge1xuXHQgICAgcmVzdWx0LnB1c2goJycpO1xuXHQgIH1cblx0ICBzdHJpbmcucmVwbGFjZShyZVByb3BOYW1lLCBmdW5jdGlvbihtYXRjaCwgbnVtYmVyLCBxdW90ZSwgc3ViU3RyaW5nKSB7XG5cdCAgICByZXN1bHQucHVzaChxdW90ZSA/IHN1YlN0cmluZy5yZXBsYWNlKHJlRXNjYXBlQ2hhciwgJyQxJykgOiAobnVtYmVyIHx8IG1hdGNoKSk7XG5cdCAgfSk7XG5cdCAgcmV0dXJuIHJlc3VsdDtcblx0fSk7XG5cblx0X3N0cmluZ1RvUGF0aCA9IHN0cmluZ1RvUGF0aDtcblx0cmV0dXJuIF9zdHJpbmdUb1BhdGg7XG59XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLm1hcGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlXG4gKiBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICovXG5cbnZhciBfYXJyYXlNYXA7XG52YXIgaGFzUmVxdWlyZWRfYXJyYXlNYXA7XG5cbmZ1bmN0aW9uIHJlcXVpcmVfYXJyYXlNYXAgKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRfYXJyYXlNYXApIHJldHVybiBfYXJyYXlNYXA7XG5cdGhhc1JlcXVpcmVkX2FycmF5TWFwID0gMTtcblx0ZnVuY3Rpb24gYXJyYXlNYXAoYXJyYXksIGl0ZXJhdGVlKSB7XG5cdCAgdmFyIGluZGV4ID0gLTEsXG5cdCAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoLFxuXHQgICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpO1xuXG5cdCAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcblx0ICAgIHJlc3VsdFtpbmRleF0gPSBpdGVyYXRlZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSk7XG5cdCAgfVxuXHQgIHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRfYXJyYXlNYXAgPSBhcnJheU1hcDtcblx0cmV0dXJuIF9hcnJheU1hcDtcbn1cblxudmFyIF9iYXNlVG9TdHJpbmc7XG52YXIgaGFzUmVxdWlyZWRfYmFzZVRvU3RyaW5nO1xuXG5mdW5jdGlvbiByZXF1aXJlX2Jhc2VUb1N0cmluZyAoKSB7XG5cdGlmIChoYXNSZXF1aXJlZF9iYXNlVG9TdHJpbmcpIHJldHVybiBfYmFzZVRvU3RyaW5nO1xuXHRoYXNSZXF1aXJlZF9iYXNlVG9TdHJpbmcgPSAxO1xuXHR2YXIgU3ltYm9sID0gcmVxdWlyZV9TeW1ib2woKSxcblx0ICAgIGFycmF5TWFwID0gcmVxdWlyZV9hcnJheU1hcCgpLFxuXHQgICAgaXNBcnJheSA9IHJlcXVpcmVJc0FycmF5KCksXG5cdCAgICBpc1N5bWJvbCA9IHJlcXVpcmVJc1N5bWJvbCgpO1xuXG5cdC8qKiBVc2VkIHRvIGNvbnZlcnQgc3ltYm9scyB0byBwcmltaXRpdmVzIGFuZCBzdHJpbmdzLiAqL1xuXHR2YXIgc3ltYm9sUHJvdG8gPSBTeW1ib2wgPyBTeW1ib2wucHJvdG90eXBlIDogdW5kZWZpbmVkLFxuXHQgICAgc3ltYm9sVG9TdHJpbmcgPSBzeW1ib2xQcm90byA/IHN5bWJvbFByb3RvLnRvU3RyaW5nIDogdW5kZWZpbmVkO1xuXG5cdC8qKlxuXHQgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50b1N0cmluZ2Agd2hpY2ggZG9lc24ndCBjb252ZXJ0IG51bGxpc2hcblx0ICogdmFsdWVzIHRvIGVtcHR5IHN0cmluZ3MuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHN0cmluZy5cblx0ICovXG5cdGZ1bmN0aW9uIGJhc2VUb1N0cmluZyh2YWx1ZSkge1xuXHQgIC8vIEV4aXQgZWFybHkgZm9yIHN0cmluZ3MgdG8gYXZvaWQgYSBwZXJmb3JtYW5jZSBoaXQgaW4gc29tZSBlbnZpcm9ubWVudHMuXG5cdCAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJykge1xuXHQgICAgcmV0dXJuIHZhbHVlO1xuXHQgIH1cblx0ICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcblx0ICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbnZlcnQgdmFsdWVzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG5cdCAgICByZXR1cm4gYXJyYXlNYXAodmFsdWUsIGJhc2VUb1N0cmluZykgKyAnJztcblx0ICB9XG5cdCAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuXHQgICAgcmV0dXJuIHN5bWJvbFRvU3RyaW5nID8gc3ltYm9sVG9TdHJpbmcuY2FsbCh2YWx1ZSkgOiAnJztcblx0ICB9XG5cdCAgdmFyIHJlc3VsdCA9ICh2YWx1ZSArICcnKTtcblx0ICByZXR1cm4gKHJlc3VsdCA9PSAnMCcgJiYgKDEgLyB2YWx1ZSkgPT0gLUluZmluaXR5KSA/ICctMCcgOiByZXN1bHQ7XG5cdH1cblxuXHRfYmFzZVRvU3RyaW5nID0gYmFzZVRvU3RyaW5nO1xuXHRyZXR1cm4gX2Jhc2VUb1N0cmluZztcbn1cblxudmFyIHRvU3RyaW5nXzE7XG52YXIgaGFzUmVxdWlyZWRUb1N0cmluZztcblxuZnVuY3Rpb24gcmVxdWlyZVRvU3RyaW5nICgpIHtcblx0aWYgKGhhc1JlcXVpcmVkVG9TdHJpbmcpIHJldHVybiB0b1N0cmluZ18xO1xuXHRoYXNSZXF1aXJlZFRvU3RyaW5nID0gMTtcblx0dmFyIGJhc2VUb1N0cmluZyA9IHJlcXVpcmVfYmFzZVRvU3RyaW5nKCk7XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcuIEFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCBmb3IgYG51bGxgXG5cdCAqIGFuZCBgdW5kZWZpbmVkYCB2YWx1ZXMuIFRoZSBzaWduIG9mIGAtMGAgaXMgcHJlc2VydmVkLlxuXHQgKlxuXHQgKiBAc3RhdGljXG5cdCAqIEBtZW1iZXJPZiBfXG5cdCAqIEBzaW5jZSA0LjAuMFxuXHQgKiBAY2F0ZWdvcnkgTGFuZ1xuXHQgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLlxuXHQgKiBAZXhhbXBsZVxuXHQgKlxuXHQgKiBfLnRvU3RyaW5nKG51bGwpO1xuXHQgKiAvLyA9PiAnJ1xuXHQgKlxuXHQgKiBfLnRvU3RyaW5nKC0wKTtcblx0ICogLy8gPT4gJy0wJ1xuXHQgKlxuXHQgKiBfLnRvU3RyaW5nKFsxLCAyLCAzXSk7XG5cdCAqIC8vID0+ICcxLDIsMydcblx0ICovXG5cdGZ1bmN0aW9uIHRvU3RyaW5nKHZhbHVlKSB7XG5cdCAgcmV0dXJuIHZhbHVlID09IG51bGwgPyAnJyA6IGJhc2VUb1N0cmluZyh2YWx1ZSk7XG5cdH1cblxuXHR0b1N0cmluZ18xID0gdG9TdHJpbmc7XG5cdHJldHVybiB0b1N0cmluZ18xO1xufVxuXG52YXIgX2Nhc3RQYXRoO1xudmFyIGhhc1JlcXVpcmVkX2Nhc3RQYXRoO1xuXG5mdW5jdGlvbiByZXF1aXJlX2Nhc3RQYXRoICgpIHtcblx0aWYgKGhhc1JlcXVpcmVkX2Nhc3RQYXRoKSByZXR1cm4gX2Nhc3RQYXRoO1xuXHRoYXNSZXF1aXJlZF9jYXN0UGF0aCA9IDE7XG5cdHZhciBpc0FycmF5ID0gcmVxdWlyZUlzQXJyYXkoKSxcblx0ICAgIGlzS2V5ID0gcmVxdWlyZV9pc0tleSgpLFxuXHQgICAgc3RyaW5nVG9QYXRoID0gcmVxdWlyZV9zdHJpbmdUb1BhdGgoKSxcblx0ICAgIHRvU3RyaW5nID0gcmVxdWlyZVRvU3RyaW5nKCk7XG5cblx0LyoqXG5cdCAqIENhc3RzIGB2YWx1ZWAgdG8gYSBwYXRoIGFycmF5IGlmIGl0J3Mgbm90IG9uZS5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cblx0ICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkga2V5cyBvbi5cblx0ICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjYXN0IHByb3BlcnR5IHBhdGggYXJyYXkuXG5cdCAqL1xuXHRmdW5jdGlvbiBjYXN0UGF0aCh2YWx1ZSwgb2JqZWN0KSB7XG5cdCAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG5cdCAgICByZXR1cm4gdmFsdWU7XG5cdCAgfVxuXHQgIHJldHVybiBpc0tleSh2YWx1ZSwgb2JqZWN0KSA/IFt2YWx1ZV0gOiBzdHJpbmdUb1BhdGgodG9TdHJpbmcodmFsdWUpKTtcblx0fVxuXG5cdF9jYXN0UGF0aCA9IGNhc3RQYXRoO1xuXHRyZXR1cm4gX2Nhc3RQYXRoO1xufVxuXG52YXIgX3RvS2V5O1xudmFyIGhhc1JlcXVpcmVkX3RvS2V5O1xuXG5mdW5jdGlvbiByZXF1aXJlX3RvS2V5ICgpIHtcblx0aWYgKGhhc1JlcXVpcmVkX3RvS2V5KSByZXR1cm4gX3RvS2V5O1xuXHRoYXNSZXF1aXJlZF90b0tleSA9IDE7XG5cdHZhciBpc1N5bWJvbCA9IHJlcXVpcmVJc1N5bWJvbCgpO1xuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc3RyaW5nIGtleSBpZiBpdCdzIG5vdCBhIHN0cmluZyBvciBzeW1ib2wuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd8c3ltYm9sfSBSZXR1cm5zIHRoZSBrZXkuXG5cdCAqL1xuXHRmdW5jdGlvbiB0b0tleSh2YWx1ZSkge1xuXHQgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHwgaXNTeW1ib2wodmFsdWUpKSB7XG5cdCAgICByZXR1cm4gdmFsdWU7XG5cdCAgfVxuXHQgIHZhciByZXN1bHQgPSAodmFsdWUgKyAnJyk7XG5cdCAgcmV0dXJuIChyZXN1bHQgPT0gJzAnICYmICgxIC8gdmFsdWUpID09IC1JbmZpbml0eSkgPyAnLTAnIDogcmVzdWx0O1xuXHR9XG5cblx0X3RvS2V5ID0gdG9LZXk7XG5cdHJldHVybiBfdG9LZXk7XG59XG5cbnZhciBfYmFzZUdldDtcbnZhciBoYXNSZXF1aXJlZF9iYXNlR2V0O1xuXG5mdW5jdGlvbiByZXF1aXJlX2Jhc2VHZXQgKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRfYmFzZUdldCkgcmV0dXJuIF9iYXNlR2V0O1xuXHRoYXNSZXF1aXJlZF9iYXNlR2V0ID0gMTtcblx0dmFyIGNhc3RQYXRoID0gcmVxdWlyZV9jYXN0UGF0aCgpLFxuXHQgICAgdG9LZXkgPSByZXF1aXJlX3RvS2V5KCk7XG5cblx0LyoqXG5cdCAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmdldGAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWZhdWx0IHZhbHVlcy5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuXHQgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuXHQgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzb2x2ZWQgdmFsdWUuXG5cdCAqL1xuXHRmdW5jdGlvbiBiYXNlR2V0KG9iamVjdCwgcGF0aCkge1xuXHQgIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuXG5cdCAgdmFyIGluZGV4ID0gMCxcblx0ICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGg7XG5cblx0ICB3aGlsZSAob2JqZWN0ICE9IG51bGwgJiYgaW5kZXggPCBsZW5ndGgpIHtcblx0ICAgIG9iamVjdCA9IG9iamVjdFt0b0tleShwYXRoW2luZGV4KytdKV07XG5cdCAgfVxuXHQgIHJldHVybiAoaW5kZXggJiYgaW5kZXggPT0gbGVuZ3RoKSA/IG9iamVjdCA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdF9iYXNlR2V0ID0gYmFzZUdldDtcblx0cmV0dXJuIF9iYXNlR2V0O1xufVxuXG52YXIgZ2V0XzE7XG52YXIgaGFzUmVxdWlyZWRHZXQ7XG5cbmZ1bmN0aW9uIHJlcXVpcmVHZXQgKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRHZXQpIHJldHVybiBnZXRfMTtcblx0aGFzUmVxdWlyZWRHZXQgPSAxO1xuXHR2YXIgYmFzZUdldCA9IHJlcXVpcmVfYmFzZUdldCgpO1xuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSB2YWx1ZSBhdCBgcGF0aGAgb2YgYG9iamVjdGAuIElmIHRoZSByZXNvbHZlZCB2YWx1ZSBpc1xuXHQgKiBgdW5kZWZpbmVkYCwgdGhlIGBkZWZhdWx0VmFsdWVgIGlzIHJldHVybmVkIGluIGl0cyBwbGFjZS5cblx0ICpcblx0ICogQHN0YXRpY1xuXHQgKiBAbWVtYmVyT2YgX1xuXHQgKiBAc2luY2UgMy43LjBcblx0ICogQGNhdGVnb3J5IE9iamVjdFxuXHQgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG5cdCAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG5cdCAqIEBwYXJhbSB7Kn0gW2RlZmF1bHRWYWx1ZV0gVGhlIHZhbHVlIHJldHVybmVkIGZvciBgdW5kZWZpbmVkYCByZXNvbHZlZCB2YWx1ZXMuXG5cdCAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cblx0ICogQGV4YW1wbGVcblx0ICpcblx0ICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiAzIH0gfV0gfTtcblx0ICpcblx0ICogXy5nZXQob2JqZWN0LCAnYVswXS5iLmMnKTtcblx0ICogLy8gPT4gM1xuXHQgKlxuXHQgKiBfLmdldChvYmplY3QsIFsnYScsICcwJywgJ2InLCAnYyddKTtcblx0ICogLy8gPT4gM1xuXHQgKlxuXHQgKiBfLmdldChvYmplY3QsICdhLmIuYycsICdkZWZhdWx0Jyk7XG5cdCAqIC8vID0+ICdkZWZhdWx0J1xuXHQgKi9cblx0ZnVuY3Rpb24gZ2V0KG9iamVjdCwgcGF0aCwgZGVmYXVsdFZhbHVlKSB7XG5cdCAgdmFyIHJlc3VsdCA9IG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogYmFzZUdldChvYmplY3QsIHBhdGgpO1xuXHQgIHJldHVybiByZXN1bHQgPT09IHVuZGVmaW5lZCA/IGRlZmF1bHRWYWx1ZSA6IHJlc3VsdDtcblx0fVxuXG5cdGdldF8xID0gZ2V0O1xuXHRyZXR1cm4gZ2V0XzE7XG59XG5cbnZhciBnZXRFeHBvcnRzID0gcmVxdWlyZUdldCgpO1xudmFyIGdldCA9IC8qQF9fUFVSRV9fKi9nZXREZWZhdWx0RXhwb3J0RnJvbUNqcyhnZXRFeHBvcnRzKTtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTtcbnZhciBoYXNSZXF1aXJlZF9kZWZpbmVQcm9wZXJ0eTtcblxuZnVuY3Rpb24gcmVxdWlyZV9kZWZpbmVQcm9wZXJ0eSAoKSB7XG5cdGlmIChoYXNSZXF1aXJlZF9kZWZpbmVQcm9wZXJ0eSkgcmV0dXJuIF9kZWZpbmVQcm9wZXJ0eTtcblx0aGFzUmVxdWlyZWRfZGVmaW5lUHJvcGVydHkgPSAxO1xuXHR2YXIgZ2V0TmF0aXZlID0gcmVxdWlyZV9nZXROYXRpdmUoKTtcblxuXHR2YXIgZGVmaW5lUHJvcGVydHkgPSAoZnVuY3Rpb24oKSB7XG5cdCAgdHJ5IHtcblx0ICAgIHZhciBmdW5jID0gZ2V0TmF0aXZlKE9iamVjdCwgJ2RlZmluZVByb3BlcnR5Jyk7XG5cdCAgICBmdW5jKHt9LCAnJywge30pO1xuXHQgICAgcmV0dXJuIGZ1bmM7XG5cdCAgfSBjYXRjaCAoZSkge31cblx0fSgpKTtcblxuXHRfZGVmaW5lUHJvcGVydHkgPSBkZWZpbmVQcm9wZXJ0eTtcblx0cmV0dXJuIF9kZWZpbmVQcm9wZXJ0eTtcbn1cblxudmFyIF9iYXNlQXNzaWduVmFsdWU7XG52YXIgaGFzUmVxdWlyZWRfYmFzZUFzc2lnblZhbHVlO1xuXG5mdW5jdGlvbiByZXF1aXJlX2Jhc2VBc3NpZ25WYWx1ZSAoKSB7XG5cdGlmIChoYXNSZXF1aXJlZF9iYXNlQXNzaWduVmFsdWUpIHJldHVybiBfYmFzZUFzc2lnblZhbHVlO1xuXHRoYXNSZXF1aXJlZF9iYXNlQXNzaWduVmFsdWUgPSAxO1xuXHR2YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlX2RlZmluZVByb3BlcnR5KCk7XG5cblx0LyoqXG5cdCAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBhc3NpZ25WYWx1ZWAgYW5kIGBhc3NpZ25NZXJnZVZhbHVlYCB3aXRob3V0XG5cdCAqIHZhbHVlIGNoZWNrcy5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cblx0ICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uXG5cdCAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFzc2lnbi5cblx0ICovXG5cdGZ1bmN0aW9uIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpIHtcblx0ICBpZiAoa2V5ID09ICdfX3Byb3RvX18nICYmIGRlZmluZVByb3BlcnR5KSB7XG5cdCAgICBkZWZpbmVQcm9wZXJ0eShvYmplY3QsIGtleSwge1xuXHQgICAgICAnY29uZmlndXJhYmxlJzogdHJ1ZSxcblx0ICAgICAgJ2VudW1lcmFibGUnOiB0cnVlLFxuXHQgICAgICAndmFsdWUnOiB2YWx1ZSxcblx0ICAgICAgJ3dyaXRhYmxlJzogdHJ1ZVxuXHQgICAgfSk7XG5cdCAgfSBlbHNlIHtcblx0ICAgIG9iamVjdFtrZXldID0gdmFsdWU7XG5cdCAgfVxuXHR9XG5cblx0X2Jhc2VBc3NpZ25WYWx1ZSA9IGJhc2VBc3NpZ25WYWx1ZTtcblx0cmV0dXJuIF9iYXNlQXNzaWduVmFsdWU7XG59XG5cbnZhciBfYXNzaWduVmFsdWU7XG52YXIgaGFzUmVxdWlyZWRfYXNzaWduVmFsdWU7XG5cbmZ1bmN0aW9uIHJlcXVpcmVfYXNzaWduVmFsdWUgKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRfYXNzaWduVmFsdWUpIHJldHVybiBfYXNzaWduVmFsdWU7XG5cdGhhc1JlcXVpcmVkX2Fzc2lnblZhbHVlID0gMTtcblx0dmFyIGJhc2VBc3NpZ25WYWx1ZSA9IHJlcXVpcmVfYmFzZUFzc2lnblZhbHVlKCksXG5cdCAgICBlcSA9IHJlcXVpcmVFcSgpO1xuXG5cdC8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cblx0dmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuXHQvKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cblx0dmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cblx0LyoqXG5cdCAqIEFzc2lnbnMgYHZhbHVlYCB0byBga2V5YCBvZiBgb2JqZWN0YCBpZiB0aGUgZXhpc3RpbmcgdmFsdWUgaXMgbm90IGVxdWl2YWxlbnRcblx0ICogdXNpbmcgW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcblx0ICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuXHQgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cblx0ICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYXNzaWduLlxuXHQgKi9cblx0ZnVuY3Rpb24gYXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKSB7XG5cdCAgdmFyIG9ialZhbHVlID0gb2JqZWN0W2tleV07XG5cdCAgaWYgKCEoaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkgJiYgZXEob2JqVmFsdWUsIHZhbHVlKSkgfHxcblx0ICAgICAgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkpIHtcblx0ICAgIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpO1xuXHQgIH1cblx0fVxuXG5cdF9hc3NpZ25WYWx1ZSA9IGFzc2lnblZhbHVlO1xuXHRyZXR1cm4gX2Fzc2lnblZhbHVlO1xufVxuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cblxudmFyIF9pc0luZGV4O1xudmFyIGhhc1JlcXVpcmVkX2lzSW5kZXg7XG5cbmZ1bmN0aW9uIHJlcXVpcmVfaXNJbmRleCAoKSB7XG5cdGlmIChoYXNSZXF1aXJlZF9pc0luZGV4KSByZXR1cm4gX2lzSW5kZXg7XG5cdGhhc1JlcXVpcmVkX2lzSW5kZXggPSAxO1xuXHR2YXIgTUFYX1NBRkVfSU5URUdFUiA9IDkwMDcxOTkyNTQ3NDA5OTE7XG5cblx0LyoqIFVzZWQgdG8gZGV0ZWN0IHVuc2lnbmVkIGludGVnZXIgdmFsdWVzLiAqL1xuXHR2YXIgcmVJc1VpbnQgPSAvXig/OjB8WzEtOV1cXGQqKSQvO1xuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGFycmF5LWxpa2UgaW5kZXguXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2xlbmd0aD1NQVhfU0FGRV9JTlRFR0VSXSBUaGUgdXBwZXIgYm91bmRzIG9mIGEgdmFsaWQgaW5kZXguXG5cdCAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgaW5kZXgsIGVsc2UgYGZhbHNlYC5cblx0ICovXG5cdGZ1bmN0aW9uIGlzSW5kZXgodmFsdWUsIGxlbmd0aCkge1xuXHQgIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuXHQgIGxlbmd0aCA9IGxlbmd0aCA9PSBudWxsID8gTUFYX1NBRkVfSU5URUdFUiA6IGxlbmd0aDtcblxuXHQgIHJldHVybiAhIWxlbmd0aCAmJlxuXHQgICAgKHR5cGUgPT0gJ251bWJlcicgfHxcblx0ICAgICAgKHR5cGUgIT0gJ3N5bWJvbCcgJiYgcmVJc1VpbnQudGVzdCh2YWx1ZSkpKSAmJlxuXHQgICAgICAgICh2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDwgbGVuZ3RoKTtcblx0fVxuXG5cdF9pc0luZGV4ID0gaXNJbmRleDtcblx0cmV0dXJuIF9pc0luZGV4O1xufVxuXG52YXIgX2Jhc2VTZXQ7XG52YXIgaGFzUmVxdWlyZWRfYmFzZVNldDtcblxuZnVuY3Rpb24gcmVxdWlyZV9iYXNlU2V0ICgpIHtcblx0aWYgKGhhc1JlcXVpcmVkX2Jhc2VTZXQpIHJldHVybiBfYmFzZVNldDtcblx0aGFzUmVxdWlyZWRfYmFzZVNldCA9IDE7XG5cdHZhciBhc3NpZ25WYWx1ZSA9IHJlcXVpcmVfYXNzaWduVmFsdWUoKSxcblx0ICAgIGNhc3RQYXRoID0gcmVxdWlyZV9jYXN0UGF0aCgpLFxuXHQgICAgaXNJbmRleCA9IHJlcXVpcmVfaXNJbmRleCgpLFxuXHQgICAgaXNPYmplY3QgPSByZXF1aXJlSXNPYmplY3QoKSxcblx0ICAgIHRvS2V5ID0gcmVxdWlyZV90b0tleSgpO1xuXG5cdC8qKlxuXHQgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zZXRgLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuXHQgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LlxuXHQgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIHBhdGggY3JlYXRpb24uXG5cdCAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG5cdCAqL1xuXHRmdW5jdGlvbiBiYXNlU2V0KG9iamVjdCwgcGF0aCwgdmFsdWUsIGN1c3RvbWl6ZXIpIHtcblx0ICBpZiAoIWlzT2JqZWN0KG9iamVjdCkpIHtcblx0ICAgIHJldHVybiBvYmplY3Q7XG5cdCAgfVxuXHQgIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuXG5cdCAgdmFyIGluZGV4ID0gLTEsXG5cdCAgICAgIGxlbmd0aCA9IHBhdGgubGVuZ3RoLFxuXHQgICAgICBsYXN0SW5kZXggPSBsZW5ndGggLSAxLFxuXHQgICAgICBuZXN0ZWQgPSBvYmplY3Q7XG5cblx0ICB3aGlsZSAobmVzdGVkICE9IG51bGwgJiYgKytpbmRleCA8IGxlbmd0aCkge1xuXHQgICAgdmFyIGtleSA9IHRvS2V5KHBhdGhbaW5kZXhdKSxcblx0ICAgICAgICBuZXdWYWx1ZSA9IHZhbHVlO1xuXG5cdCAgICBpZiAoa2V5ID09PSAnX19wcm90b19fJyB8fCBrZXkgPT09ICdjb25zdHJ1Y3RvcicgfHwga2V5ID09PSAncHJvdG90eXBlJykge1xuXHQgICAgICByZXR1cm4gb2JqZWN0O1xuXHQgICAgfVxuXG5cdCAgICBpZiAoaW5kZXggIT0gbGFzdEluZGV4KSB7XG5cdCAgICAgIHZhciBvYmpWYWx1ZSA9IG5lc3RlZFtrZXldO1xuXHQgICAgICBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXIgPyBjdXN0b21pemVyKG9ialZhbHVlLCBrZXksIG5lc3RlZCkgOiB1bmRlZmluZWQ7XG5cdCAgICAgIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgbmV3VmFsdWUgPSBpc09iamVjdChvYmpWYWx1ZSlcblx0ICAgICAgICAgID8gb2JqVmFsdWVcblx0ICAgICAgICAgIDogKGlzSW5kZXgocGF0aFtpbmRleCArIDFdKSA/IFtdIDoge30pO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICBhc3NpZ25WYWx1ZShuZXN0ZWQsIGtleSwgbmV3VmFsdWUpO1xuXHQgICAgbmVzdGVkID0gbmVzdGVkW2tleV07XG5cdCAgfVxuXHQgIHJldHVybiBvYmplY3Q7XG5cdH1cblxuXHRfYmFzZVNldCA9IGJhc2VTZXQ7XG5cdHJldHVybiBfYmFzZVNldDtcbn1cblxudmFyIHNldF8xO1xudmFyIGhhc1JlcXVpcmVkU2V0O1xuXG5mdW5jdGlvbiByZXF1aXJlU2V0ICgpIHtcblx0aWYgKGhhc1JlcXVpcmVkU2V0KSByZXR1cm4gc2V0XzE7XG5cdGhhc1JlcXVpcmVkU2V0ID0gMTtcblx0dmFyIGJhc2VTZXQgPSByZXF1aXJlX2Jhc2VTZXQoKTtcblxuXHQvKipcblx0ICogU2V0cyB0aGUgdmFsdWUgYXQgYHBhdGhgIG9mIGBvYmplY3RgLiBJZiBhIHBvcnRpb24gb2YgYHBhdGhgIGRvZXNuJ3QgZXhpc3QsXG5cdCAqIGl0J3MgY3JlYXRlZC4gQXJyYXlzIGFyZSBjcmVhdGVkIGZvciBtaXNzaW5nIGluZGV4IHByb3BlcnRpZXMgd2hpbGUgb2JqZWN0c1xuXHQgKiBhcmUgY3JlYXRlZCBmb3IgYWxsIG90aGVyIG1pc3NpbmcgcHJvcGVydGllcy4gVXNlIGBfLnNldFdpdGhgIHRvIGN1c3RvbWl6ZVxuXHQgKiBgcGF0aGAgY3JlYXRpb24uXG5cdCAqXG5cdCAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuXHQgKlxuXHQgKiBAc3RhdGljXG5cdCAqIEBtZW1iZXJPZiBfXG5cdCAqIEBzaW5jZSAzLjcuMFxuXHQgKiBAY2F0ZWdvcnkgT2JqZWN0XG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG5cdCAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuXG5cdCAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cblx0ICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cblx0ICogQGV4YW1wbGVcblx0ICpcblx0ICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiAzIH0gfV0gfTtcblx0ICpcblx0ICogXy5zZXQob2JqZWN0LCAnYVswXS5iLmMnLCA0KTtcblx0ICogY29uc29sZS5sb2cob2JqZWN0LmFbMF0uYi5jKTtcblx0ICogLy8gPT4gNFxuXHQgKlxuXHQgKiBfLnNldChvYmplY3QsIFsneCcsICcwJywgJ3knLCAneiddLCA1KTtcblx0ICogY29uc29sZS5sb2cob2JqZWN0LnhbMF0ueS56KTtcblx0ICogLy8gPT4gNVxuXHQgKi9cblx0ZnVuY3Rpb24gc2V0KG9iamVjdCwgcGF0aCwgdmFsdWUpIHtcblx0ICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyBvYmplY3QgOiBiYXNlU2V0KG9iamVjdCwgcGF0aCwgdmFsdWUpO1xuXHR9XG5cblx0c2V0XzEgPSBzZXQ7XG5cdHJldHVybiBzZXRfMTtcbn1cblxudmFyIHNldEV4cG9ydHMgPSByZXF1aXJlU2V0KCk7XG52YXIgc2V0ID0gLypAX19QVVJFX18qL2dldERlZmF1bHRFeHBvcnRGcm9tQ2pzKHNldEV4cG9ydHMpO1xuXG4vKipcbiAqIENvcGllcyB0aGUgdmFsdWVzIG9mIGBzb3VyY2VgIHRvIGBhcnJheWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IHNvdXJjZSBUaGUgYXJyYXkgdG8gY29weSB2YWx1ZXMgZnJvbS5cbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheT1bXV0gVGhlIGFycmF5IHRvIGNvcHkgdmFsdWVzIHRvLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gKi9cblxudmFyIF9jb3B5QXJyYXk7XG52YXIgaGFzUmVxdWlyZWRfY29weUFycmF5O1xuXG5mdW5jdGlvbiByZXF1aXJlX2NvcHlBcnJheSAoKSB7XG5cdGlmIChoYXNSZXF1aXJlZF9jb3B5QXJyYXkpIHJldHVybiBfY29weUFycmF5O1xuXHRoYXNSZXF1aXJlZF9jb3B5QXJyYXkgPSAxO1xuXHRmdW5jdGlvbiBjb3B5QXJyYXkoc291cmNlLCBhcnJheSkge1xuXHQgIHZhciBpbmRleCA9IC0xLFxuXHQgICAgICBsZW5ndGggPSBzb3VyY2UubGVuZ3RoO1xuXG5cdCAgYXJyYXkgfHwgKGFycmF5ID0gQXJyYXkobGVuZ3RoKSk7XG5cdCAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcblx0ICAgIGFycmF5W2luZGV4XSA9IHNvdXJjZVtpbmRleF07XG5cdCAgfVxuXHQgIHJldHVybiBhcnJheTtcblx0fVxuXG5cdF9jb3B5QXJyYXkgPSBjb3B5QXJyYXk7XG5cdHJldHVybiBfY29weUFycmF5O1xufVxuXG52YXIgdG9QYXRoXzE7XG52YXIgaGFzUmVxdWlyZWRUb1BhdGg7XG5cbmZ1bmN0aW9uIHJlcXVpcmVUb1BhdGggKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRUb1BhdGgpIHJldHVybiB0b1BhdGhfMTtcblx0aGFzUmVxdWlyZWRUb1BhdGggPSAxO1xuXHR2YXIgYXJyYXlNYXAgPSByZXF1aXJlX2FycmF5TWFwKCksXG5cdCAgICBjb3B5QXJyYXkgPSByZXF1aXJlX2NvcHlBcnJheSgpLFxuXHQgICAgaXNBcnJheSA9IHJlcXVpcmVJc0FycmF5KCksXG5cdCAgICBpc1N5bWJvbCA9IHJlcXVpcmVJc1N5bWJvbCgpLFxuXHQgICAgc3RyaW5nVG9QYXRoID0gcmVxdWlyZV9zdHJpbmdUb1BhdGgoKSxcblx0ICAgIHRvS2V5ID0gcmVxdWlyZV90b0tleSgpLFxuXHQgICAgdG9TdHJpbmcgPSByZXF1aXJlVG9TdHJpbmcoKTtcblxuXHQvKipcblx0ICogQ29udmVydHMgYHZhbHVlYCB0byBhIHByb3BlcnR5IHBhdGggYXJyYXkuXG5cdCAqXG5cdCAqIEBzdGF0aWNcblx0ICogQG1lbWJlck9mIF9cblx0ICogQHNpbmNlIDQuMC4wXG5cdCAqIEBjYXRlZ29yeSBVdGlsXG5cdCAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG5cdCAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHByb3BlcnR5IHBhdGggYXJyYXkuXG5cdCAqIEBleGFtcGxlXG5cdCAqXG5cdCAqIF8udG9QYXRoKCdhLmIuYycpO1xuXHQgKiAvLyA9PiBbJ2EnLCAnYicsICdjJ11cblx0ICpcblx0ICogXy50b1BhdGgoJ2FbMF0uYi5jJyk7XG5cdCAqIC8vID0+IFsnYScsICcwJywgJ2InLCAnYyddXG5cdCAqL1xuXHRmdW5jdGlvbiB0b1BhdGgodmFsdWUpIHtcblx0ICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcblx0ICAgIHJldHVybiBhcnJheU1hcCh2YWx1ZSwgdG9LZXkpO1xuXHQgIH1cblx0ICByZXR1cm4gaXNTeW1ib2wodmFsdWUpID8gW3ZhbHVlXSA6IGNvcHlBcnJheShzdHJpbmdUb1BhdGgodG9TdHJpbmcodmFsdWUpKSk7XG5cdH1cblxuXHR0b1BhdGhfMSA9IHRvUGF0aDtcblx0cmV0dXJuIHRvUGF0aF8xO1xufVxuXG52YXIgdG9QYXRoRXhwb3J0cyA9IHJlcXVpcmVUb1BhdGgoKTtcbnZhciB0b1BhdGggPSAvKkBfX1BVUkVfXyovZ2V0RGVmYXVsdEV4cG9ydEZyb21DanModG9QYXRoRXhwb3J0cyk7XG5cbnZhciBkZWZpbmUkMiA9IHtcbiAgLy8gYWNjZXNzIGRhdGEgZmllbGRcbiAgZGF0YTogZnVuY3Rpb24gZGF0YShwYXJhbXMpIHtcbiAgICB2YXIgZGVmYXVsdHMgPSB7XG4gICAgICBmaWVsZDogJ2RhdGEnLFxuICAgICAgYmluZGluZ0V2ZW50OiAnZGF0YScsXG4gICAgICBhbGxvd0JpbmRpbmc6IGZhbHNlLFxuICAgICAgYWxsb3dTZXR0aW5nOiBmYWxzZSxcbiAgICAgIGFsbG93R2V0dGluZzogZmFsc2UsXG4gICAgICBzZXR0aW5nRXZlbnQ6ICdkYXRhJyxcbiAgICAgIHNldHRpbmdUcmlnZ2Vyc0V2ZW50OiBmYWxzZSxcbiAgICAgIHRyaWdnZXJGbk5hbWU6ICd0cmlnZ2VyJyxcbiAgICAgIGltbXV0YWJsZUtleXM6IHt9LFxuICAgICAgLy8ga2V5ID0+IHRydWUgaWYgaW1tdXRhYmxlXG4gICAgICB1cGRhdGVTdHlsZTogZmFsc2UsXG4gICAgICBiZWZvcmVHZXQ6IGZ1bmN0aW9uIGJlZm9yZUdldChzZWxmKSB7fSxcbiAgICAgIGJlZm9yZVNldDogZnVuY3Rpb24gYmVmb3JlU2V0KHNlbGYsIG9iaikge30sXG4gICAgICBvblNldDogZnVuY3Rpb24gb25TZXQoc2VsZikge30sXG4gICAgICBjYW5TZXQ6IGZ1bmN0aW9uIGNhblNldChzZWxmKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH07XG4gICAgcGFyYW1zID0gZXh0ZW5kKHt9LCBkZWZhdWx0cywgcGFyYW1zKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gZGF0YUltcGwobmFtZSwgdmFsdWUpIHtcbiAgICAgIHZhciBwID0gcGFyYW1zO1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHNlbGZJc0FycmF5TGlrZSA9IHNlbGYubGVuZ3RoICE9PSB1bmRlZmluZWQ7XG4gICAgICB2YXIgYWxsID0gc2VsZklzQXJyYXlMaWtlID8gc2VsZiA6IFtzZWxmXTsgLy8gcHV0IGluIGFycmF5IGlmIG5vdCBhcnJheS1saWtlXG4gICAgICB2YXIgc2luZ2xlID0gc2VsZklzQXJyYXlMaWtlID8gc2VsZlswXSA6IHNlbGY7XG5cbiAgICAgIC8vIC5kYXRhKCdmb28nLCAuLi4pXG4gICAgICBpZiAoc3RyaW5nKG5hbWUpKSB7XG4gICAgICAgIC8vIHNldCBvciBnZXQgcHJvcGVydHlcbiAgICAgICAgdmFyIGlzUGF0aExpa2UgPSBuYW1lLmluZGV4T2YoJy4nKSAhPT0gLTE7IC8vIHRoZXJlIG1pZ2h0IGJlIGEgbm9ybWFsIGZpZWxkIHdpdGggYSBkb3QgXG4gICAgICAgIHZhciBwYXRoID0gaXNQYXRoTGlrZSAmJiB0b1BhdGgobmFtZSk7XG5cbiAgICAgICAgLy8gLmRhdGEoJ2ZvbycpXG4gICAgICAgIGlmIChwLmFsbG93R2V0dGluZyAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gZ2V0XG5cbiAgICAgICAgICB2YXIgcmV0O1xuICAgICAgICAgIGlmIChzaW5nbGUpIHtcbiAgICAgICAgICAgIHAuYmVmb3JlR2V0KHNpbmdsZSk7XG5cbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIGl0J3MgcGF0aCBhbmQgYSBmaWVsZCB3aXRoIHRoZSBzYW1lIG5hbWUgZG9lc24ndCBleGlzdFxuICAgICAgICAgICAgaWYgKHBhdGggJiYgc2luZ2xlLl9wcml2YXRlW3AuZmllbGRdW25hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgcmV0ID0gZ2V0KHNpbmdsZS5fcHJpdmF0ZVtwLmZpZWxkXSwgcGF0aCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXQgPSBzaW5nbGUuX3ByaXZhdGVbcC5maWVsZF1bbmFtZV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXQ7XG5cbiAgICAgICAgICAvLyAuZGF0YSgnZm9vJywgJ2JhcicpXG4gICAgICAgIH0gZWxzZSBpZiAocC5hbGxvd1NldHRpbmcgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIHNldFxuICAgICAgICAgIHZhciB2YWxpZCA9ICFwLmltbXV0YWJsZUtleXNbbmFtZV07XG4gICAgICAgICAgaWYgKHZhbGlkKSB7XG4gICAgICAgICAgICB2YXIgY2hhbmdlID0gX2RlZmluZVByb3BlcnR5JDEoe30sIG5hbWUsIHZhbHVlKTtcbiAgICAgICAgICAgIHAuYmVmb3JlU2V0KHNlbGYsIGNoYW5nZSk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGFsbC5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgICAgdmFyIGVsZSA9IGFsbFtpXTtcbiAgICAgICAgICAgICAgaWYgKHAuY2FuU2V0KGVsZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAocGF0aCAmJiBzaW5nbGUuX3ByaXZhdGVbcC5maWVsZF1bbmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgc2V0KGVsZS5fcHJpdmF0ZVtwLmZpZWxkXSwgcGF0aCwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBlbGUuX3ByaXZhdGVbcC5maWVsZF1bbmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gdXBkYXRlIG1hcHBlcnMgaWYgYXNrZWRcbiAgICAgICAgICAgIGlmIChwLnVwZGF0ZVN0eWxlKSB7XG4gICAgICAgICAgICAgIHNlbGYudXBkYXRlU3R5bGUoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gY2FsbCBvblNldCBjYWxsYmFja1xuICAgICAgICAgICAgcC5vblNldChzZWxmKTtcbiAgICAgICAgICAgIGlmIChwLnNldHRpbmdUcmlnZ2Vyc0V2ZW50KSB7XG4gICAgICAgICAgICAgIHNlbGZbcC50cmlnZ2VyRm5OYW1lXShwLnNldHRpbmdFdmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gLmRhdGEoeyAnZm9vJzogJ2JhcicgfSlcbiAgICAgIH0gZWxzZSBpZiAocC5hbGxvd1NldHRpbmcgJiYgcGxhaW5PYmplY3QobmFtZSkpIHtcbiAgICAgICAgLy8gZXh0ZW5kXG4gICAgICAgIHZhciBvYmogPSBuYW1lO1xuICAgICAgICB2YXIgaywgdjtcbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICAgICAgICBwLmJlZm9yZVNldChzZWxmLCBvYmopO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwga2V5cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICBrID0ga2V5c1tfaV07XG4gICAgICAgICAgdiA9IG9ialtrXTtcbiAgICAgICAgICB2YXIgX3ZhbGlkID0gIXAuaW1tdXRhYmxlS2V5c1trXTtcbiAgICAgICAgICBpZiAoX3ZhbGlkKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGFsbC5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICB2YXIgX2VsZSA9IGFsbFtqXTtcbiAgICAgICAgICAgICAgaWYgKHAuY2FuU2V0KF9lbGUpKSB7XG4gICAgICAgICAgICAgICAgX2VsZS5fcHJpdmF0ZVtwLmZpZWxkXVtrXSA9IHY7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyB1cGRhdGUgbWFwcGVycyBpZiBhc2tlZFxuICAgICAgICBpZiAocC51cGRhdGVTdHlsZSkge1xuICAgICAgICAgIHNlbGYudXBkYXRlU3R5bGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNhbGwgb25TZXQgY2FsbGJhY2tcbiAgICAgICAgcC5vblNldChzZWxmKTtcbiAgICAgICAgaWYgKHAuc2V0dGluZ1RyaWdnZXJzRXZlbnQpIHtcbiAgICAgICAgICBzZWxmW3AudHJpZ2dlckZuTmFtZV0ocC5zZXR0aW5nRXZlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gLmRhdGEoZnVuY3Rpb24oKXsgLi4uIH0pXG4gICAgICB9IGVsc2UgaWYgKHAuYWxsb3dCaW5kaW5nICYmIGZuJDYobmFtZSkpIHtcbiAgICAgICAgLy8gYmluZCB0byBldmVudFxuICAgICAgICB2YXIgZm4gPSBuYW1lO1xuICAgICAgICBzZWxmLm9uKHAuYmluZGluZ0V2ZW50LCBmbik7XG5cbiAgICAgICAgLy8gLmRhdGEoKVxuICAgICAgfSBlbHNlIGlmIChwLmFsbG93R2V0dGluZyAmJiBuYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gZ2V0IHdob2xlIG9iamVjdFxuICAgICAgICB2YXIgX3JldDtcbiAgICAgICAgaWYgKHNpbmdsZSkge1xuICAgICAgICAgIHAuYmVmb3JlR2V0KHNpbmdsZSk7XG4gICAgICAgICAgX3JldCA9IHNpbmdsZS5fcHJpdmF0ZVtwLmZpZWxkXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX3JldDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzZWxmOyAvLyBtYWludGFpbiBjaGFpbmFiaWxpdHlcbiAgICB9OyAvLyBmdW5jdGlvblxuICB9LFxuICAvLyBkYXRhXG5cbiAgLy8gcmVtb3ZlIGRhdGEgZmllbGRcbiAgcmVtb3ZlRGF0YTogZnVuY3Rpb24gcmVtb3ZlRGF0YShwYXJhbXMpIHtcbiAgICB2YXIgZGVmYXVsdHMgPSB7XG4gICAgICBmaWVsZDogJ2RhdGEnLFxuICAgICAgZXZlbnQ6ICdkYXRhJyxcbiAgICAgIHRyaWdnZXJGbk5hbWU6ICd0cmlnZ2VyJyxcbiAgICAgIHRyaWdnZXJFdmVudDogZmFsc2UsXG4gICAgICBpbW11dGFibGVLZXlzOiB7fSAvLyBrZXkgPT4gdHJ1ZSBpZiBpbW11dGFibGVcbiAgICB9O1xuICAgIHBhcmFtcyA9IGV4dGVuZCh7fSwgZGVmYXVsdHMsIHBhcmFtcyk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHJlbW92ZURhdGFJbXBsKG5hbWVzKSB7XG4gICAgICB2YXIgcCA9IHBhcmFtcztcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBzZWxmSXNBcnJheUxpa2UgPSBzZWxmLmxlbmd0aCAhPT0gdW5kZWZpbmVkO1xuICAgICAgdmFyIGFsbCA9IHNlbGZJc0FycmF5TGlrZSA/IHNlbGYgOiBbc2VsZl07IC8vIHB1dCBpbiBhcnJheSBpZiBub3QgYXJyYXktbGlrZVxuXG4gICAgICAvLyAucmVtb3ZlRGF0YSgnZm9vIGJhcicpXG4gICAgICBpZiAoc3RyaW5nKG5hbWVzKSkge1xuICAgICAgICAvLyB0aGVuIGdldCB0aGUgbGlzdCBvZiBrZXlzLCBhbmQgZGVsZXRlIHRoZW1cbiAgICAgICAgdmFyIGtleXMgPSBuYW1lcy5zcGxpdCgvXFxzKy8pO1xuICAgICAgICB2YXIgbCA9IGtleXMubGVuZ3RoO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgIC8vIGRlbGV0ZSBlYWNoIG5vbi1lbXB0eSBrZXlcbiAgICAgICAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgICBpZiAoZW1wdHlTdHJpbmcoa2V5KSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciB2YWxpZCA9ICFwLmltbXV0YWJsZUtleXNba2V5XTsgLy8gbm90IHZhbGlkIGlmIGltbXV0YWJsZVxuICAgICAgICAgIGlmICh2YWxpZCkge1xuICAgICAgICAgICAgZm9yICh2YXIgaV9hID0gMCwgbF9hID0gYWxsLmxlbmd0aDsgaV9hIDwgbF9hOyBpX2ErKykge1xuICAgICAgICAgICAgICBhbGxbaV9hXS5fcHJpdmF0ZVtwLmZpZWxkXVtrZXldID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocC50cmlnZ2VyRXZlbnQpIHtcbiAgICAgICAgICBzZWxmW3AudHJpZ2dlckZuTmFtZV0ocC5ldmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAucmVtb3ZlRGF0YSgpXG4gICAgICB9IGVsc2UgaWYgKG5hbWVzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gdGhlbiBkZWxldGUgYWxsIGtleXNcblxuICAgICAgICBmb3IgKHZhciBfaV9hID0gMCwgX2xfYSA9IGFsbC5sZW5ndGg7IF9pX2EgPCBfbF9hOyBfaV9hKyspIHtcbiAgICAgICAgICB2YXIgX3ByaXZhdGVGaWVsZHMgPSBhbGxbX2lfYV0uX3ByaXZhdGVbcC5maWVsZF07XG4gICAgICAgICAgdmFyIF9rZXlzID0gT2JqZWN0LmtleXMoX3ByaXZhdGVGaWVsZHMpO1xuICAgICAgICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IF9rZXlzLmxlbmd0aDsgX2kyKyspIHtcbiAgICAgICAgICAgIHZhciBfa2V5ID0gX2tleXNbX2kyXTtcbiAgICAgICAgICAgIHZhciB2YWxpZEtleVRvRGVsZXRlID0gIXAuaW1tdXRhYmxlS2V5c1tfa2V5XTtcbiAgICAgICAgICAgIGlmICh2YWxpZEtleVRvRGVsZXRlKSB7XG4gICAgICAgICAgICAgIF9wcml2YXRlRmllbGRzW19rZXldID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocC50cmlnZ2VyRXZlbnQpIHtcbiAgICAgICAgICBzZWxmW3AudHJpZ2dlckZuTmFtZV0ocC5ldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzZWxmOyAvLyBtYWludGFpbiBjaGFpbmluZ1xuICAgIH07IC8vIGZ1bmN0aW9uXG4gIH0gLy8gcmVtb3ZlRGF0YVxufTsgLy8gZGVmaW5lXG5cbnZhciBkZWZpbmUkMSA9IHtcbiAgZXZlbnRBbGlhc2VzT246IGZ1bmN0aW9uIGV2ZW50QWxpYXNlc09uKHByb3RvKSB7XG4gICAgdmFyIHAgPSBwcm90bztcbiAgICBwLmFkZExpc3RlbmVyID0gcC5saXN0ZW4gPSBwLmJpbmQgPSBwLm9uO1xuICAgIHAudW5saXN0ZW4gPSBwLnVuYmluZCA9IHAub2ZmID0gcC5yZW1vdmVMaXN0ZW5lcjtcbiAgICBwLnRyaWdnZXIgPSBwLmVtaXQ7XG5cbiAgICAvLyB0aGlzIGlzIGp1c3QgYSB3cmFwcGVyIGFsaWFzIG9mIC5vbigpXG4gICAgcC5wb24gPSBwLnByb21pc2VPbiA9IGZ1bmN0aW9uIChldmVudHMsIHNlbGVjdG9yKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCk7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UkMShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHZhciBjYWxsYmFjayA9IGZ1bmN0aW9uIGNhbGxiYWNrKGUpIHtcbiAgICAgICAgICBzZWxmLm9mZi5hcHBseShzZWxmLCBvZmZBcmdzKTtcbiAgICAgICAgICByZXNvbHZlKGUpO1xuICAgICAgICB9O1xuICAgICAgICB2YXIgb25BcmdzID0gYXJncy5jb25jYXQoW2NhbGxiYWNrXSk7XG4gICAgICAgIHZhciBvZmZBcmdzID0gb25BcmdzLmNvbmNhdChbXSk7XG4gICAgICAgIHNlbGYub24uYXBwbHkoc2VsZiwgb25BcmdzKTtcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cbn07IC8vIGRlZmluZVxuXG4vLyB1c2UgdGhpcyBtb2R1bGUgdG8gY2hlcnJ5IHBpY2sgZnVuY3Rpb25zIGludG8geW91ciBwcm90b3R5cGVcbi8vICh1c2VmdWwgZm9yIGZ1bmN0aW9ucyBzaGFyZWQgYmV0d2VlbiB0aGUgY29yZSBhbmQgY29sbGVjdGlvbnMsIGZvciBleGFtcGxlKVxuXG52YXIgZGVmaW5lID0ge307XG5bZGVmaW5lJDMsIGRlZmluZSQyLCBkZWZpbmUkMV0uZm9yRWFjaChmdW5jdGlvbiAobSkge1xuICBleHRlbmQoZGVmaW5lLCBtKTtcbn0pO1xuXG52YXIgZWxlc2ZuJGkgPSB7XG4gIGFuaW1hdGU6IGRlZmluZS5hbmltYXRlKCksXG4gIGFuaW1hdGlvbjogZGVmaW5lLmFuaW1hdGlvbigpLFxuICBhbmltYXRlZDogZGVmaW5lLmFuaW1hdGVkKCksXG4gIGNsZWFyUXVldWU6IGRlZmluZS5jbGVhclF1ZXVlKCksXG4gIGRlbGF5OiBkZWZpbmUuZGVsYXkoKSxcbiAgZGVsYXlBbmltYXRpb246IGRlZmluZS5kZWxheUFuaW1hdGlvbigpLFxuICBzdG9wOiBkZWZpbmUuc3RvcCgpXG59O1xuXG52YXIgZWxlc2ZuJGggPSB7XG4gIGNsYXNzZXM6IGZ1bmN0aW9uIGNsYXNzZXMoX2NsYXNzZXMpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKF9jbGFzc2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciByZXQgPSBbXTtcbiAgICAgIHNlbGZbMF0uX3ByaXZhdGUuY2xhc3Nlcy5mb3JFYWNoKGZ1bmN0aW9uIChjbHMpIHtcbiAgICAgICAgcmV0dXJuIHJldC5wdXNoKGNscyk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXQ7XG4gICAgfSBlbHNlIGlmICghYXJyYXkoX2NsYXNzZXMpKSB7XG4gICAgICAvLyBleHRyYWN0IGNsYXNzZXMgZnJvbSBzdHJpbmdcbiAgICAgIF9jbGFzc2VzID0gKF9jbGFzc2VzIHx8ICcnKS5tYXRjaCgvXFxTKy9nKSB8fCBbXTtcbiAgICB9XG4gICAgdmFyIGNoYW5nZWQgPSBbXTtcbiAgICB2YXIgY2xhc3Nlc1NldCA9IG5ldyBTZXQkMShfY2xhc3Nlcyk7XG5cbiAgICAvLyBjaGVjayBhbmQgdXBkYXRlIGVhY2ggZWxlXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBzZWxmLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgZWxlID0gc2VsZltqXTtcbiAgICAgIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgICAgIHZhciBlbGVDbGFzc2VzID0gX3AuY2xhc3NlcztcbiAgICAgIHZhciBjaGFuZ2VkRWxlID0gZmFsc2U7XG5cbiAgICAgIC8vIGNoZWNrIGlmIGVsZSBoYXMgYWxsIG9mIHRoZSBwYXNzZWQgY2xhc3Nlc1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBfY2xhc3Nlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY2xzID0gX2NsYXNzZXNbaV07XG4gICAgICAgIHZhciBlbGVIYXNDbGFzcyA9IGVsZUNsYXNzZXMuaGFzKGNscyk7XG4gICAgICAgIGlmICghZWxlSGFzQ2xhc3MpIHtcbiAgICAgICAgICBjaGFuZ2VkRWxlID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBjaGVjayBpZiBlbGUgaGFzIGNsYXNzZXMgb3V0c2lkZSBvZiB0aG9zZSBwYXNzZWRcbiAgICAgIGlmICghY2hhbmdlZEVsZSkge1xuICAgICAgICBjaGFuZ2VkRWxlID0gZWxlQ2xhc3Nlcy5zaXplICE9PSBfY2xhc3Nlcy5sZW5ndGg7XG4gICAgICB9XG4gICAgICBpZiAoY2hhbmdlZEVsZSkge1xuICAgICAgICBfcC5jbGFzc2VzID0gY2xhc3Nlc1NldDtcbiAgICAgICAgY2hhbmdlZC5wdXNoKGVsZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gdHJpZ2dlciB1cGRhdGUgc3R5bGUgb24gdGhvc2UgZWxlcyB0aGF0IGhhZCBjbGFzcyBjaGFuZ2VzXG4gICAgaWYgKGNoYW5nZWQubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zcGF3bihjaGFuZ2VkKS51cGRhdGVTdHlsZSgpLmVtaXQoJ2NsYXNzJyk7XG4gICAgfVxuICAgIHJldHVybiBzZWxmO1xuICB9LFxuICBhZGRDbGFzczogZnVuY3Rpb24gYWRkQ2xhc3MoY2xhc3Nlcykge1xuICAgIHJldHVybiB0aGlzLnRvZ2dsZUNsYXNzKGNsYXNzZXMsIHRydWUpO1xuICB9LFxuICBoYXNDbGFzczogZnVuY3Rpb24gaGFzQ2xhc3MoY2xhc3NOYW1lKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgcmV0dXJuIGVsZSAhPSBudWxsICYmIGVsZS5fcHJpdmF0ZS5jbGFzc2VzLmhhcyhjbGFzc05hbWUpO1xuICB9LFxuICB0b2dnbGVDbGFzczogZnVuY3Rpb24gdG9nZ2xlQ2xhc3MoY2xhc3NlcywgdG9nZ2xlKSB7XG4gICAgaWYgKCFhcnJheShjbGFzc2VzKSkge1xuICAgICAgLy8gZXh0cmFjdCBjbGFzc2VzIGZyb20gc3RyaW5nXG4gICAgICBjbGFzc2VzID0gY2xhc3Nlcy5tYXRjaCgvXFxTKy9nKSB8fCBbXTtcbiAgICB9XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciB0b2dnbGVVbmRlZmQgPSB0b2dnbGUgPT09IHVuZGVmaW5lZDtcbiAgICB2YXIgY2hhbmdlZCA9IFtdOyAvLyBlbGVzIHdobyBoYWQgY2xhc3NlcyBjaGFuZ2VkXG5cbiAgICBmb3IgKHZhciBpID0gMCwgaWwgPSBzZWxmLmxlbmd0aDsgaSA8IGlsOyBpKyspIHtcbiAgICAgIHZhciBlbGUgPSBzZWxmW2ldO1xuICAgICAgdmFyIGVsZUNsYXNzZXMgPSBlbGUuX3ByaXZhdGUuY2xhc3NlcztcbiAgICAgIHZhciBjaGFuZ2VkRWxlID0gZmFsc2U7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNsYXNzZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIGNscyA9IGNsYXNzZXNbal07XG4gICAgICAgIHZhciBoYXNDbGFzcyA9IGVsZUNsYXNzZXMuaGFzKGNscyk7XG4gICAgICAgIHZhciBjaGFuZ2VkTm93ID0gZmFsc2U7XG4gICAgICAgIGlmICh0b2dnbGUgfHwgdG9nZ2xlVW5kZWZkICYmICFoYXNDbGFzcykge1xuICAgICAgICAgIGVsZUNsYXNzZXMuYWRkKGNscyk7XG4gICAgICAgICAgY2hhbmdlZE5vdyA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRvZ2dsZSB8fCB0b2dnbGVVbmRlZmQgJiYgaGFzQ2xhc3MpIHtcbiAgICAgICAgICBlbGVDbGFzc2VzW1wiZGVsZXRlXCJdKGNscyk7XG4gICAgICAgICAgY2hhbmdlZE5vdyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjaGFuZ2VkRWxlICYmIGNoYW5nZWROb3cpIHtcbiAgICAgICAgICBjaGFuZ2VkLnB1c2goZWxlKTtcbiAgICAgICAgICBjaGFuZ2VkRWxlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBmb3IgaiBjbGFzc2VzXG4gICAgfSAvLyBmb3IgaSBlbGVzXG5cbiAgICAvLyB0cmlnZ2VyIHVwZGF0ZSBzdHlsZSBvbiB0aG9zZSBlbGVzIHRoYXQgaGFkIGNsYXNzIGNoYW5nZXNcbiAgICBpZiAoY2hhbmdlZC5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnNwYXduKGNoYW5nZWQpLnVwZGF0ZVN0eWxlKCkuZW1pdCgnY2xhc3MnKTtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGY7XG4gIH0sXG4gIHJlbW92ZUNsYXNzOiBmdW5jdGlvbiByZW1vdmVDbGFzcyhjbGFzc2VzKSB7XG4gICAgcmV0dXJuIHRoaXMudG9nZ2xlQ2xhc3MoY2xhc3NlcywgZmFsc2UpO1xuICB9LFxuICBmbGFzaENsYXNzOiBmdW5jdGlvbiBmbGFzaENsYXNzKGNsYXNzZXMsIGR1cmF0aW9uKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmIChkdXJhdGlvbiA9PSBudWxsKSB7XG4gICAgICBkdXJhdGlvbiA9IDI1MDtcbiAgICB9IGVsc2UgaWYgKGR1cmF0aW9uID09PSAwKSB7XG4gICAgICByZXR1cm4gc2VsZjsgLy8gbm90aGluZyB0byBkbyByZWFsbHlcbiAgICB9XG4gICAgc2VsZi5hZGRDbGFzcyhjbGFzc2VzKTtcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHNlbGYucmVtb3ZlQ2xhc3MoY2xhc3Nlcyk7XG4gICAgfSwgZHVyYXRpb24pO1xuICAgIHJldHVybiBzZWxmO1xuICB9XG59O1xuZWxlc2ZuJGguY2xhc3NOYW1lID0gZWxlc2ZuJGguY2xhc3NOYW1lcyA9IGVsZXNmbiRoLmNsYXNzZXM7XG5cbi8vIHRva2VucyBpbiB0aGUgcXVlcnkgbGFuZ3VhZ2VcbnZhciB0b2tlbnMgPSB7XG4gIG1ldGFDaGFyOiAnW1xcXFwhXFxcXFwiXFxcXCNcXFxcJFxcXFwlXFxcXCZcXFxcXFwnXFxcXChcXFxcKVxcXFwqXFxcXCtcXFxcLFxcXFwuXFxcXC9cXFxcOlxcXFw7XFxcXDxcXFxcPVxcXFw+XFxcXD9cXFxcQFxcXFxbXFxcXF1cXFxcXlxcXFxgXFxcXHtcXFxcfFxcXFx9XFxcXH5dJyxcbiAgLy8gY2hhcnMgd2UgbmVlZCB0byBlc2NhcGUgaW4gbGV0IG5hbWVzLCBldGNcbiAgY29tcGFyYXRvck9wOiAnPXxcXFxcIT18Pnw+PXw8fDw9fFxcXFwkPXxcXFxcXj18XFxcXCo9JyxcbiAgLy8gYmluYXJ5IGNvbXBhcmlzb24gb3AgKHVzZWQgaW4gZGF0YSBzZWxlY3RvcnMpXG4gIGJvb2xPcDogJ1xcXFw/fFxcXFwhfFxcXFxeJyxcbiAgLy8gYm9vbGVhbiAodW5hcnkpIG9wZXJhdG9ycyAodXNlZCBpbiBkYXRhIHNlbGVjdG9ycylcbiAgc3RyaW5nOiAnXCIoPzpcXFxcXFxcXFwifFteXCJdKSpcIicgKyAnfCcgKyBcIicoPzpcXFxcXFxcXCd8W14nXSkqJ1wiLFxuICAvLyBzdHJpbmcgbGl0ZXJhbHMgKHVzZWQgaW4gZGF0YSBzZWxlY3RvcnMpIC0tIGRvdWJsZXF1b3RlcyB8IHNpbmdsZXF1b3Rlc1xuICBudW1iZXI6IG51bWJlcixcbiAgLy8gbnVtYmVyIGxpdGVyYWwgKHVzZWQgaW4gZGF0YSBzZWxlY3RvcnMpIC0tLSBlLmcuIDAuMTIzNCwgMTIzNCwgMTJlMTIzXG4gIG1ldGE6ICdkZWdyZWV8aW5kZWdyZWV8b3V0ZGVncmVlJyxcbiAgLy8gYWxsb3dlZCBtZXRhZGF0YSBmaWVsZHMgKGkuZS4gYWxsb3dlZCBmdW5jdGlvbnMgdG8gdXNlIGZyb20gQ29sbGVjdGlvbilcbiAgc2VwYXJhdG9yOiAnXFxcXHMqLFxcXFxzKicsXG4gIC8vIHF1ZXJpZXMgYXJlIHNlcGFyYXRlZCBieSBjb21tYXMsIGUuZy4gZWRnZVtmb28gPSAnYmFyJ10sIG5vZGUuc29tZUNsYXNzXG4gIGRlc2NlbmRhbnQ6ICdcXFxccysnLFxuICBjaGlsZDogJ1xcXFxzKz5cXFxccysnLFxuICBzdWJqZWN0OiAnXFxcXCQnLFxuICBncm91cDogJ25vZGV8ZWRnZXxcXFxcKicsXG4gIGRpcmVjdGVkRWRnZTogJ1xcXFxzKy0+XFxcXHMrJyxcbiAgdW5kaXJlY3RlZEVkZ2U6ICdcXFxccys8LT5cXFxccysnXG59O1xudG9rZW5zLnZhcmlhYmxlID0gJyg/OltcXFxcdy0uXXwoPzpcXFxcXFxcXCcgKyB0b2tlbnMubWV0YUNoYXIgKyAnKSkrJzsgLy8gYSB2YXJpYWJsZSBuYW1lIGNhbiBoYXZlIGxldHRlcnMsIG51bWJlcnMsIGRhc2hlcywgYW5kIHBlcmlvZHNcbnRva2Vucy5jbGFzc05hbWUgPSAnKD86W1xcXFx3LV18KD86XFxcXFxcXFwnICsgdG9rZW5zLm1ldGFDaGFyICsgJykpKyc7IC8vIGEgY2xhc3MgbmFtZSBoYXMgdGhlIHNhbWUgcnVsZXMgYXMgYSB2YXJpYWJsZSBleGNlcHQgaXQgY2FuJ3QgaGF2ZSBhICcuJyBpbiB0aGUgbmFtZVxudG9rZW5zLnZhbHVlID0gdG9rZW5zLnN0cmluZyArICd8JyArIHRva2Vucy5udW1iZXI7IC8vIGEgdmFsdWUgbGl0ZXJhbCwgZWl0aGVyIGEgc3RyaW5nIG9yIG51bWJlclxudG9rZW5zLmlkID0gdG9rZW5zLnZhcmlhYmxlOyAvLyBhbiBlbGVtZW50IGlkIChmb2xsb3dzIHZhcmlhYmxlIGNvbnZlbnRpb25zKVxuXG4oZnVuY3Rpb24gKCkge1xuICB2YXIgb3BzLCBvcCwgaTtcblxuICAvLyBhZGQgQCB2YXJpYW50cyB0byBjb21wYXJhdG9yT3BcbiAgb3BzID0gdG9rZW5zLmNvbXBhcmF0b3JPcC5zcGxpdCgnfCcpO1xuICBmb3IgKGkgPSAwOyBpIDwgb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgb3AgPSBvcHNbaV07XG4gICAgdG9rZW5zLmNvbXBhcmF0b3JPcCArPSAnfEAnICsgb3A7XG4gIH1cblxuICAvLyBhZGQgISB2YXJpYW50cyB0byBjb21wYXJhdG9yT3BcbiAgb3BzID0gdG9rZW5zLmNvbXBhcmF0b3JPcC5zcGxpdCgnfCcpO1xuICBmb3IgKGkgPSAwOyBpIDwgb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgb3AgPSBvcHNbaV07XG4gICAgaWYgKG9wLmluZGV4T2YoJyEnKSA+PSAwKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9IC8vIHNraXAgb3BzIHRoYXQgZXhwbGljaXRseSBjb250YWluICFcbiAgICBpZiAob3AgPT09ICc9Jykge1xuICAgICAgY29udGludWU7XG4gICAgfSAvLyBza2lwID0gYi9jICE9IGlzIGV4cGxpY2l0bHkgZGVmaW5lZFxuXG4gICAgdG9rZW5zLmNvbXBhcmF0b3JPcCArPSAnfFxcXFwhJyArIG9wO1xuICB9XG59KSgpO1xuXG4vKipcbiAqIE1ha2UgYSBuZXcgcXVlcnkgb2JqZWN0XG4gKlxuICogQHByb3AgdHlwZSB7VHlwZX0gVGhlIHR5cGUgZW51bSAoaW50KSBvZiB0aGUgcXVlcnlcbiAqIEBwcm9wIGNoZWNrcyBMaXN0IG9mIGNoZWNrcyB0byBtYWtlIGFnYWluc3QgYW4gZWxlIHRvIHRlc3QgZm9yIGEgbWF0Y2hcbiAqL1xudmFyIG5ld1F1ZXJ5ID0gZnVuY3Rpb24gbmV3UXVlcnkoKSB7XG4gIHJldHVybiB7XG4gICAgY2hlY2tzOiBbXVxuICB9O1xufTtcblxuLyoqXG4gKiBBIGNoZWNrIHR5cGUgZW51bS1saWtlIG9iamVjdC4gIFVzZXMgaW50ZWdlciB2YWx1ZXMgZm9yIGZhc3QgbWF0Y2goKSBsb29rdXAuXG4gKiBUaGUgb3JkZXJpbmcgZG9lcyBub3QgbWF0dGVyIGFzIGxvbmcgYXMgdGhlIGludHMgYXJlIHVuaXF1ZS5cbiAqL1xudmFyIFR5cGUgPSB7XG4gIC8qKiBFLmcuIG5vZGUgKi9cbiAgR1JPVVA6IDAsXG4gIC8qKiBBIGNvbGxlY3Rpb24gb2YgZWxlbWVudHMgKi9cbiAgQ09MTEVDVElPTjogMSxcbiAgLyoqIEEgZmlsdGVyKGVsZSkgZnVuY3Rpb24gKi9cbiAgRklMVEVSOiAyLFxuICAvKiogRS5nLiBbZm9vID4gMV0gKi9cbiAgREFUQV9DT01QQVJFOiAzLFxuICAvKiogRS5nLiBbZm9vXSAqL1xuICBEQVRBX0VYSVNUOiA0LFxuICAvKiogRS5nLiBbP2Zvb10gKi9cbiAgREFUQV9CT09MOiA1LFxuICAvKiogRS5nLiBbW2RlZ3JlZSA+IDJdXSAqL1xuICBNRVRBX0NPTVBBUkU6IDYsXG4gIC8qKiBFLmcuIDpzZWxlY3RlZCAqL1xuICBTVEFURTogNyxcbiAgLyoqIEUuZy4gI2ZvbyAqL1xuICBJRDogOCxcbiAgLyoqIEUuZy4gLmZvbyAqL1xuICBDTEFTUzogOSxcbiAgLyoqIEUuZy4gI2ZvbyA8LT4gI2JhciAqL1xuICBVTkRJUkVDVEVEX0VER0U6IDEwLFxuICAvKiogRS5nLiAjZm9vIC0+ICNiYXIgKi9cbiAgRElSRUNURURfRURHRTogMTEsXG4gIC8qKiBFLmcuICQjZm9vIC0+ICNiYXIgKi9cbiAgTk9ERV9TT1VSQ0U6IDEyLFxuICAvKiogRS5nLiAjZm9vIC0+ICQjYmFyICovXG4gIE5PREVfVEFSR0VUOiAxMyxcbiAgLyoqIEUuZy4gJCNmb28gPC0+ICNiYXIgKi9cbiAgTk9ERV9ORUlHSEJPUjogMTQsXG4gIC8qKiBFLmcuICNmb28gPiAjYmFyICovXG4gIENISUxEOiAxNSxcbiAgLyoqIEUuZy4gI2ZvbyAjYmFyICovXG4gIERFU0NFTkRBTlQ6IDE2LFxuICAvKiogRS5nLiAkI2ZvbyA+ICNiYXIgKi9cbiAgUEFSRU5UOiAxNyxcbiAgLyoqIEUuZy4gJCNmb28gI2JhciAqL1xuICBBTkNFU1RPUjogMTgsXG4gIC8qKiBFLmcuICNmb28gPiAkYmFyID4gI2JheiAqL1xuICBDT01QT1VORF9TUExJVDogMTksXG4gIC8qKiBBbHdheXMgbWF0Y2hlcywgdXNlZnVsIHBsYWNlaG9sZGVyIGZvciBzdWJqZWN0IGluIGBDT01QT1VORF9TUExJVGAgKi9cbiAgVFJVRTogMjBcbn07XG5cbnZhciBzdGF0ZVNlbGVjdG9ycyA9IFt7XG4gIHNlbGVjdG9yOiAnOnNlbGVjdGVkJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gZWxlLnNlbGVjdGVkKCk7XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6dW5zZWxlY3RlZCcsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuICFlbGUuc2VsZWN0ZWQoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzpzZWxlY3RhYmxlJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gZWxlLnNlbGVjdGFibGUoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzp1bnNlbGVjdGFibGUnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiAhZWxlLnNlbGVjdGFibGUoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzpsb2NrZWQnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiBlbGUubG9ja2VkKCk7XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6dW5sb2NrZWQnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiAhZWxlLmxvY2tlZCgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOnZpc2libGUnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiBlbGUudmlzaWJsZSgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOmhpZGRlbicsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuICFlbGUudmlzaWJsZSgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOnRyYW5zcGFyZW50JyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gZWxlLnRyYW5zcGFyZW50KCk7XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6Z3JhYmJlZCcsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5ncmFiYmVkKCk7XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6ZnJlZScsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuICFlbGUuZ3JhYmJlZCgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOnJlbW92ZWQnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiBlbGUucmVtb3ZlZCgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOmluc2lkZScsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuICFlbGUucmVtb3ZlZCgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOmdyYWJiYWJsZScsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5ncmFiYmFibGUoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzp1bmdyYWJiYWJsZScsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuICFlbGUuZ3JhYmJhYmxlKCk7XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6YW5pbWF0ZWQnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiBlbGUuYW5pbWF0ZWQoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzp1bmFuaW1hdGVkJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gIWVsZS5hbmltYXRlZCgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOnBhcmVudCcsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5pc1BhcmVudCgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOmNoaWxkbGVzcycsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5pc0NoaWxkbGVzcygpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOmNoaWxkJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gZWxlLmlzQ2hpbGQoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzpvcnBoYW4nLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiBlbGUuaXNPcnBoYW4oKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzpub25vcnBoYW4nLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiBlbGUuaXNDaGlsZCgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOmNvbXBvdW5kJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICBpZiAoZWxlLmlzTm9kZSgpKSB7XG4gICAgICByZXR1cm4gZWxlLmlzUGFyZW50KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBlbGUuc291cmNlKCkuaXNQYXJlbnQoKSB8fCBlbGUudGFyZ2V0KCkuaXNQYXJlbnQoKTtcbiAgICB9XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6bG9vcCcsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5pc0xvb3AoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzpzaW1wbGUnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiBlbGUuaXNTaW1wbGUoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzphY3RpdmUnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiBlbGUuYWN0aXZlKCk7XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6aW5hY3RpdmUnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiAhZWxlLmFjdGl2ZSgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOmJhY2tncm91bmRpbmcnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiBlbGUuYmFja2dyb3VuZGluZygpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOm5vbmJhY2tncm91bmRpbmcnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiAhZWxlLmJhY2tncm91bmRpbmcoKTtcbiAgfVxufV0uc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAvLyBuLmIuIHNlbGVjdG9ycyB0aGF0IGFyZSBzdGFydGluZyBzdWJzdHJpbmdzIG9mIG90aGVycyBtdXN0IGhhdmUgdGhlIGxvbmdlciBvbmVzIGZpcnN0XG4gIHJldHVybiBkZXNjZW5kaW5nKGEuc2VsZWN0b3IsIGIuc2VsZWN0b3IpO1xufSk7XG52YXIgbG9va3VwID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsVG9GbiA9IHt9O1xuICB2YXIgcztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGF0ZVNlbGVjdG9ycy5sZW5ndGg7IGkrKykge1xuICAgIHMgPSBzdGF0ZVNlbGVjdG9yc1tpXTtcbiAgICBzZWxUb0ZuW3Muc2VsZWN0b3JdID0gcy5tYXRjaGVzO1xuICB9XG4gIHJldHVybiBzZWxUb0ZuO1xufSgpO1xudmFyIHN0YXRlU2VsZWN0b3JNYXRjaGVzID0gZnVuY3Rpb24gc3RhdGVTZWxlY3Rvck1hdGNoZXMoc2VsLCBlbGUpIHtcbiAgcmV0dXJuIGxvb2t1cFtzZWxdKGVsZSk7XG59O1xudmFyIHN0YXRlU2VsZWN0b3JSZWdleCA9ICcoJyArIHN0YXRlU2VsZWN0b3JzLm1hcChmdW5jdGlvbiAocykge1xuICByZXR1cm4gcy5zZWxlY3Rvcjtcbn0pLmpvaW4oJ3wnKSArICcpJztcblxuLy8gd2hlbiBhIHRva2VuIGxpa2UgYSB2YXJpYWJsZSBoYXMgZXNjYXBlZCBtZXRhIGNoYXJhY3RlcnMsIHdlIG5lZWQgdG8gY2xlYW4gdGhlIGJhY2tzbGFzaGVzIG91dFxuLy8gc28gdGhhdCB2YWx1ZXMgZ2V0IGNvbXBhcmVkIHByb3Blcmx5IGluIFNlbGVjdG9yLmZpbHRlcigpXG52YXIgY2xlYW5NZXRhQ2hhcnMgPSBmdW5jdGlvbiBjbGVhbk1ldGFDaGFycyhzdHIpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKG5ldyBSZWdFeHAoJ1xcXFxcXFxcKCcgKyB0b2tlbnMubWV0YUNoYXIgKyAnKScsICdnJyksIGZ1bmN0aW9uIChtYXRjaCwgJDEpIHtcbiAgICByZXR1cm4gJDE7XG4gIH0pO1xufTtcbnZhciByZXBsYWNlTGFzdFF1ZXJ5ID0gZnVuY3Rpb24gcmVwbGFjZUxhc3RRdWVyeShzZWxlY3RvciwgZXhhbWluaW5nUXVlcnksIHJlcGxhY2VtZW50UXVlcnkpIHtcbiAgc2VsZWN0b3Jbc2VsZWN0b3IubGVuZ3RoIC0gMV0gPSByZXBsYWNlbWVudFF1ZXJ5O1xufTtcblxuLy8gTk9URTogYWRkIG5ldyBleHByZXNzaW9uIHN5bnRheCBoZXJlIHRvIGhhdmUgaXQgcmVjb2duaXNlZCBieSB0aGUgcGFyc2VyO1xuLy8gLSBhIHF1ZXJ5IGNvbnRhaW5zIGFsbCBhZGphY2VudCAoaS5lLiBubyBzZXBhcmF0b3IgaW4gYmV0d2VlbikgZXhwcmVzc2lvbnM7XG4vLyAtIHRoZSBjdXJyZW50IHF1ZXJ5IGlzIHN0b3JlZCBpbiBzZWxlY3RvcltpXVxuLy8gLSB5b3UgbmVlZCB0byBjaGVjayB0aGUgcXVlcnkgb2JqZWN0cyBpbiBtYXRjaCgpIGZvciBpdCBhY3R1YWxseSBmaWx0ZXIgcHJvcGVybHksIGJ1dCB0aGF0J3MgcHJldHR5IHN0cmFpZ2h0IGZvcndhcmRcbnZhciBleHBycyA9IFt7XG4gIG5hbWU6ICdncm91cCcsXG4gIC8vIGp1c3QgdXNlZCBmb3IgaWRlbnRpZnlpbmcgd2hlbiBkZWJ1Z2dpbmdcbiAgcXVlcnk6IHRydWUsXG4gIHJlZ2V4OiAnKCcgKyB0b2tlbnMuZ3JvdXAgKyAnKScsXG4gIHBvcHVsYXRlOiBmdW5jdGlvbiBwb3B1bGF0ZShzZWxlY3RvciwgcXVlcnksIF9yZWYpIHtcbiAgICB2YXIgX3JlZjIgPSBfc2xpY2VkVG9BcnJheShfcmVmLCAxKSxcbiAgICAgIGdyb3VwID0gX3JlZjJbMF07XG4gICAgcXVlcnkuY2hlY2tzLnB1c2goe1xuICAgICAgdHlwZTogVHlwZS5HUk9VUCxcbiAgICAgIHZhbHVlOiBncm91cCA9PT0gJyonID8gZ3JvdXAgOiBncm91cCArICdzJ1xuICAgIH0pO1xuICB9XG59LCB7XG4gIG5hbWU6ICdzdGF0ZScsXG4gIHF1ZXJ5OiB0cnVlLFxuICByZWdleDogc3RhdGVTZWxlY3RvclJlZ2V4LFxuICBwb3B1bGF0ZTogZnVuY3Rpb24gcG9wdWxhdGUoc2VsZWN0b3IsIHF1ZXJ5LCBfcmVmMykge1xuICAgIHZhciBfcmVmNCA9IF9zbGljZWRUb0FycmF5KF9yZWYzLCAxKSxcbiAgICAgIHN0YXRlID0gX3JlZjRbMF07XG4gICAgcXVlcnkuY2hlY2tzLnB1c2goe1xuICAgICAgdHlwZTogVHlwZS5TVEFURSxcbiAgICAgIHZhbHVlOiBzdGF0ZVxuICAgIH0pO1xuICB9XG59LCB7XG4gIG5hbWU6ICdpZCcsXG4gIHF1ZXJ5OiB0cnVlLFxuICByZWdleDogJ1xcXFwjKCcgKyB0b2tlbnMuaWQgKyAnKScsXG4gIHBvcHVsYXRlOiBmdW5jdGlvbiBwb3B1bGF0ZShzZWxlY3RvciwgcXVlcnksIF9yZWY1KSB7XG4gICAgdmFyIF9yZWY2ID0gX3NsaWNlZFRvQXJyYXkoX3JlZjUsIDEpLFxuICAgICAgaWQgPSBfcmVmNlswXTtcbiAgICBxdWVyeS5jaGVja3MucHVzaCh7XG4gICAgICB0eXBlOiBUeXBlLklELFxuICAgICAgdmFsdWU6IGNsZWFuTWV0YUNoYXJzKGlkKVxuICAgIH0pO1xuICB9XG59LCB7XG4gIG5hbWU6ICdjbGFzc05hbWUnLFxuICBxdWVyeTogdHJ1ZSxcbiAgcmVnZXg6ICdcXFxcLignICsgdG9rZW5zLmNsYXNzTmFtZSArICcpJyxcbiAgcG9wdWxhdGU6IGZ1bmN0aW9uIHBvcHVsYXRlKHNlbGVjdG9yLCBxdWVyeSwgX3JlZjcpIHtcbiAgICB2YXIgX3JlZjggPSBfc2xpY2VkVG9BcnJheShfcmVmNywgMSksXG4gICAgICBjbGFzc05hbWUgPSBfcmVmOFswXTtcbiAgICBxdWVyeS5jaGVja3MucHVzaCh7XG4gICAgICB0eXBlOiBUeXBlLkNMQVNTLFxuICAgICAgdmFsdWU6IGNsZWFuTWV0YUNoYXJzKGNsYXNzTmFtZSlcbiAgICB9KTtcbiAgfVxufSwge1xuICBuYW1lOiAnZGF0YUV4aXN0cycsXG4gIHF1ZXJ5OiB0cnVlLFxuICByZWdleDogJ1xcXFxbXFxcXHMqKCcgKyB0b2tlbnMudmFyaWFibGUgKyAnKVxcXFxzKlxcXFxdJyxcbiAgcG9wdWxhdGU6IGZ1bmN0aW9uIHBvcHVsYXRlKHNlbGVjdG9yLCBxdWVyeSwgX3JlZjkpIHtcbiAgICB2YXIgX3JlZjAgPSBfc2xpY2VkVG9BcnJheShfcmVmOSwgMSksXG4gICAgICB2YXJpYWJsZSA9IF9yZWYwWzBdO1xuICAgIHF1ZXJ5LmNoZWNrcy5wdXNoKHtcbiAgICAgIHR5cGU6IFR5cGUuREFUQV9FWElTVCxcbiAgICAgIGZpZWxkOiBjbGVhbk1ldGFDaGFycyh2YXJpYWJsZSlcbiAgICB9KTtcbiAgfVxufSwge1xuICBuYW1lOiAnZGF0YUNvbXBhcmUnLFxuICBxdWVyeTogdHJ1ZSxcbiAgcmVnZXg6ICdcXFxcW1xcXFxzKignICsgdG9rZW5zLnZhcmlhYmxlICsgJylcXFxccyooJyArIHRva2Vucy5jb21wYXJhdG9yT3AgKyAnKVxcXFxzKignICsgdG9rZW5zLnZhbHVlICsgJylcXFxccypcXFxcXScsXG4gIHBvcHVsYXRlOiBmdW5jdGlvbiBwb3B1bGF0ZShzZWxlY3RvciwgcXVlcnksIF9yZWYxKSB7XG4gICAgdmFyIF9yZWYxMCA9IF9zbGljZWRUb0FycmF5KF9yZWYxLCAzKSxcbiAgICAgIHZhcmlhYmxlID0gX3JlZjEwWzBdLFxuICAgICAgY29tcGFyYXRvck9wID0gX3JlZjEwWzFdLFxuICAgICAgdmFsdWUgPSBfcmVmMTBbMl07XG4gICAgdmFyIHZhbHVlSXNTdHJpbmcgPSBuZXcgUmVnRXhwKCdeJyArIHRva2Vucy5zdHJpbmcgKyAnJCcpLmV4ZWModmFsdWUpICE9IG51bGw7XG4gICAgaWYgKHZhbHVlSXNTdHJpbmcpIHtcbiAgICAgIHZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDEsIHZhbHVlLmxlbmd0aCAtIDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSA9IHBhcnNlRmxvYXQodmFsdWUpO1xuICAgIH1cbiAgICBxdWVyeS5jaGVja3MucHVzaCh7XG4gICAgICB0eXBlOiBUeXBlLkRBVEFfQ09NUEFSRSxcbiAgICAgIGZpZWxkOiBjbGVhbk1ldGFDaGFycyh2YXJpYWJsZSksXG4gICAgICBvcGVyYXRvcjogY29tcGFyYXRvck9wLFxuICAgICAgdmFsdWU6IHZhbHVlXG4gICAgfSk7XG4gIH1cbn0sIHtcbiAgbmFtZTogJ2RhdGFCb29sJyxcbiAgcXVlcnk6IHRydWUsXG4gIHJlZ2V4OiAnXFxcXFtcXFxccyooJyArIHRva2Vucy5ib29sT3AgKyAnKVxcXFxzKignICsgdG9rZW5zLnZhcmlhYmxlICsgJylcXFxccypcXFxcXScsXG4gIHBvcHVsYXRlOiBmdW5jdGlvbiBwb3B1bGF0ZShzZWxlY3RvciwgcXVlcnksIF9yZWYxMSkge1xuICAgIHZhciBfcmVmMTIgPSBfc2xpY2VkVG9BcnJheShfcmVmMTEsIDIpLFxuICAgICAgYm9vbE9wID0gX3JlZjEyWzBdLFxuICAgICAgdmFyaWFibGUgPSBfcmVmMTJbMV07XG4gICAgcXVlcnkuY2hlY2tzLnB1c2goe1xuICAgICAgdHlwZTogVHlwZS5EQVRBX0JPT0wsXG4gICAgICBmaWVsZDogY2xlYW5NZXRhQ2hhcnModmFyaWFibGUpLFxuICAgICAgb3BlcmF0b3I6IGJvb2xPcFxuICAgIH0pO1xuICB9XG59LCB7XG4gIG5hbWU6ICdtZXRhQ29tcGFyZScsXG4gIHF1ZXJ5OiB0cnVlLFxuICByZWdleDogJ1xcXFxbXFxcXFtcXFxccyooJyArIHRva2Vucy5tZXRhICsgJylcXFxccyooJyArIHRva2Vucy5jb21wYXJhdG9yT3AgKyAnKVxcXFxzKignICsgdG9rZW5zLm51bWJlciArICcpXFxcXHMqXFxcXF1cXFxcXScsXG4gIHBvcHVsYXRlOiBmdW5jdGlvbiBwb3B1bGF0ZShzZWxlY3RvciwgcXVlcnksIF9yZWYxMykge1xuICAgIHZhciBfcmVmMTQgPSBfc2xpY2VkVG9BcnJheShfcmVmMTMsIDMpLFxuICAgICAgbWV0YSA9IF9yZWYxNFswXSxcbiAgICAgIGNvbXBhcmF0b3JPcCA9IF9yZWYxNFsxXSxcbiAgICAgIG51bWJlciA9IF9yZWYxNFsyXTtcbiAgICBxdWVyeS5jaGVja3MucHVzaCh7XG4gICAgICB0eXBlOiBUeXBlLk1FVEFfQ09NUEFSRSxcbiAgICAgIGZpZWxkOiBjbGVhbk1ldGFDaGFycyhtZXRhKSxcbiAgICAgIG9wZXJhdG9yOiBjb21wYXJhdG9yT3AsXG4gICAgICB2YWx1ZTogcGFyc2VGbG9hdChudW1iZXIpXG4gICAgfSk7XG4gIH1cbn0sIHtcbiAgbmFtZTogJ25leHRRdWVyeScsXG4gIHNlcGFyYXRvcjogdHJ1ZSxcbiAgcmVnZXg6IHRva2Vucy5zZXBhcmF0b3IsXG4gIHBvcHVsYXRlOiBmdW5jdGlvbiBwb3B1bGF0ZShzZWxlY3RvciwgcXVlcnkpIHtcbiAgICB2YXIgY3VycmVudFN1YmplY3QgPSBzZWxlY3Rvci5jdXJyZW50U3ViamVjdDtcbiAgICB2YXIgZWRnZUNvdW50ID0gc2VsZWN0b3IuZWRnZUNvdW50O1xuICAgIHZhciBjb21wb3VuZENvdW50ID0gc2VsZWN0b3IuY29tcG91bmRDb3VudDtcbiAgICB2YXIgbGFzdFEgPSBzZWxlY3RvcltzZWxlY3Rvci5sZW5ndGggLSAxXTtcbiAgICBpZiAoY3VycmVudFN1YmplY3QgIT0gbnVsbCkge1xuICAgICAgbGFzdFEuc3ViamVjdCA9IGN1cnJlbnRTdWJqZWN0O1xuICAgICAgc2VsZWN0b3IuY3VycmVudFN1YmplY3QgPSBudWxsO1xuICAgIH1cbiAgICBsYXN0US5lZGdlQ291bnQgPSBlZGdlQ291bnQ7XG4gICAgbGFzdFEuY29tcG91bmRDb3VudCA9IGNvbXBvdW5kQ291bnQ7XG4gICAgc2VsZWN0b3IuZWRnZUNvdW50ID0gMDtcbiAgICBzZWxlY3Rvci5jb21wb3VuZENvdW50ID0gMDtcblxuICAgIC8vIGdvIG9uIHRvIG5leHQgcXVlcnlcbiAgICB2YXIgbmV4dFF1ZXJ5ID0gc2VsZWN0b3Jbc2VsZWN0b3IubGVuZ3RoKytdID0gbmV3UXVlcnkoKTtcbiAgICByZXR1cm4gbmV4dFF1ZXJ5OyAvLyB0aGlzIGlzIHRoZSBuZXcgcXVlcnkgdG8gYmUgZmlsbGVkIGJ5IHRoZSBmb2xsb3dpbmcgZXhwcnNcbiAgfVxufSwge1xuICBuYW1lOiAnZGlyZWN0ZWRFZGdlJyxcbiAgc2VwYXJhdG9yOiB0cnVlLFxuICByZWdleDogdG9rZW5zLmRpcmVjdGVkRWRnZSxcbiAgcG9wdWxhdGU6IGZ1bmN0aW9uIHBvcHVsYXRlKHNlbGVjdG9yLCBxdWVyeSkge1xuICAgIGlmIChzZWxlY3Rvci5jdXJyZW50U3ViamVjdCA9PSBudWxsKSB7XG4gICAgICAvLyB1bmRpcmVjdGVkIGVkZ2VcbiAgICAgIHZhciBlZGdlUXVlcnkgPSBuZXdRdWVyeSgpO1xuICAgICAgdmFyIHNvdXJjZSA9IHF1ZXJ5O1xuICAgICAgdmFyIHRhcmdldCA9IG5ld1F1ZXJ5KCk7XG4gICAgICBlZGdlUXVlcnkuY2hlY2tzLnB1c2goe1xuICAgICAgICB0eXBlOiBUeXBlLkRJUkVDVEVEX0VER0UsXG4gICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICB0YXJnZXQ6IHRhcmdldFxuICAgICAgfSk7XG5cbiAgICAgIC8vIHRoZSBxdWVyeSBpbiB0aGUgc2VsZWN0b3Igc2hvdWxkIGJlIHRoZSBlZGdlIHJhdGhlciB0aGFuIHRoZSBzb3VyY2VcbiAgICAgIHJlcGxhY2VMYXN0UXVlcnkoc2VsZWN0b3IsIHF1ZXJ5LCBlZGdlUXVlcnkpO1xuICAgICAgc2VsZWN0b3IuZWRnZUNvdW50Kys7XG5cbiAgICAgIC8vIHdlJ3JlIG5vdyBwb3B1bGF0aW5nIHRoZSB0YXJnZXQgcXVlcnkgd2l0aCBleHByZXNzaW9ucyB0aGF0IGZvbGxvd1xuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gc291cmNlL3RhcmdldFxuICAgICAgdmFyIHNyY1RndFEgPSBuZXdRdWVyeSgpO1xuICAgICAgdmFyIF9zb3VyY2UgPSBxdWVyeTtcbiAgICAgIHZhciBfdGFyZ2V0ID0gbmV3UXVlcnkoKTtcbiAgICAgIHNyY1RndFEuY2hlY2tzLnB1c2goe1xuICAgICAgICB0eXBlOiBUeXBlLk5PREVfU09VUkNFLFxuICAgICAgICBzb3VyY2U6IF9zb3VyY2UsXG4gICAgICAgIHRhcmdldDogX3RhcmdldFxuICAgICAgfSk7XG5cbiAgICAgIC8vIHRoZSBxdWVyeSBpbiB0aGUgc2VsZWN0b3Igc2hvdWxkIGJlIHRoZSBuZWlnaGJvdXJob29kIHJhdGhlciB0aGFuIHRoZSBub2RlXG4gICAgICByZXBsYWNlTGFzdFF1ZXJ5KHNlbGVjdG9yLCBxdWVyeSwgc3JjVGd0USk7XG4gICAgICBzZWxlY3Rvci5lZGdlQ291bnQrKztcbiAgICAgIHJldHVybiBfdGFyZ2V0OyAvLyBub3cgcG9wdWxhdGluZyB0aGUgdGFyZ2V0IHdpdGggdGhlIGZvbGxvd2luZyBleHByZXNzaW9uc1xuICAgIH1cbiAgfVxufSwge1xuICBuYW1lOiAndW5kaXJlY3RlZEVkZ2UnLFxuICBzZXBhcmF0b3I6IHRydWUsXG4gIHJlZ2V4OiB0b2tlbnMudW5kaXJlY3RlZEVkZ2UsXG4gIHBvcHVsYXRlOiBmdW5jdGlvbiBwb3B1bGF0ZShzZWxlY3RvciwgcXVlcnkpIHtcbiAgICBpZiAoc2VsZWN0b3IuY3VycmVudFN1YmplY3QgPT0gbnVsbCkge1xuICAgICAgLy8gdW5kaXJlY3RlZCBlZGdlXG4gICAgICB2YXIgZWRnZVF1ZXJ5ID0gbmV3UXVlcnkoKTtcbiAgICAgIHZhciBzb3VyY2UgPSBxdWVyeTtcbiAgICAgIHZhciB0YXJnZXQgPSBuZXdRdWVyeSgpO1xuICAgICAgZWRnZVF1ZXJ5LmNoZWNrcy5wdXNoKHtcbiAgICAgICAgdHlwZTogVHlwZS5VTkRJUkVDVEVEX0VER0UsXG4gICAgICAgIG5vZGVzOiBbc291cmNlLCB0YXJnZXRdXG4gICAgICB9KTtcblxuICAgICAgLy8gdGhlIHF1ZXJ5IGluIHRoZSBzZWxlY3RvciBzaG91bGQgYmUgdGhlIGVkZ2UgcmF0aGVyIHRoYW4gdGhlIHNvdXJjZVxuICAgICAgcmVwbGFjZUxhc3RRdWVyeShzZWxlY3RvciwgcXVlcnksIGVkZ2VRdWVyeSk7XG4gICAgICBzZWxlY3Rvci5lZGdlQ291bnQrKztcblxuICAgICAgLy8gd2UncmUgbm93IHBvcHVsYXRpbmcgdGhlIHRhcmdldCBxdWVyeSB3aXRoIGV4cHJlc3Npb25zIHRoYXQgZm9sbG93XG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBuZWlnaGJvdXJob29kXG4gICAgICB2YXIgbmhvb2RRID0gbmV3UXVlcnkoKTtcbiAgICAgIHZhciBub2RlID0gcXVlcnk7XG4gICAgICB2YXIgbmVpZ2hib3IgPSBuZXdRdWVyeSgpO1xuICAgICAgbmhvb2RRLmNoZWNrcy5wdXNoKHtcbiAgICAgICAgdHlwZTogVHlwZS5OT0RFX05FSUdIQk9SLFxuICAgICAgICBub2RlOiBub2RlLFxuICAgICAgICBuZWlnaGJvcjogbmVpZ2hib3JcbiAgICAgIH0pO1xuXG4gICAgICAvLyB0aGUgcXVlcnkgaW4gdGhlIHNlbGVjdG9yIHNob3VsZCBiZSB0aGUgbmVpZ2hib3VyaG9vZCByYXRoZXIgdGhhbiB0aGUgbm9kZVxuICAgICAgcmVwbGFjZUxhc3RRdWVyeShzZWxlY3RvciwgcXVlcnksIG5ob29kUSk7XG4gICAgICByZXR1cm4gbmVpZ2hib3I7IC8vIG5vdyBwb3B1bGF0aW5nIHRoZSBuZWlnaGJvciB3aXRoIGZvbGxvd2luZyBleHByZXNzaW9uc1xuICAgIH1cbiAgfVxufSwge1xuICBuYW1lOiAnY2hpbGQnLFxuICBzZXBhcmF0b3I6IHRydWUsXG4gIHJlZ2V4OiB0b2tlbnMuY2hpbGQsXG4gIHBvcHVsYXRlOiBmdW5jdGlvbiBwb3B1bGF0ZShzZWxlY3RvciwgcXVlcnkpIHtcbiAgICBpZiAoc2VsZWN0b3IuY3VycmVudFN1YmplY3QgPT0gbnVsbCkge1xuICAgICAgLy8gZGVmYXVsdDogY2hpbGQgcXVlcnlcbiAgICAgIHZhciBwYXJlbnRDaGlsZFF1ZXJ5ID0gbmV3UXVlcnkoKTtcbiAgICAgIHZhciBjaGlsZCA9IG5ld1F1ZXJ5KCk7XG4gICAgICB2YXIgcGFyZW50ID0gc2VsZWN0b3Jbc2VsZWN0b3IubGVuZ3RoIC0gMV07XG4gICAgICBwYXJlbnRDaGlsZFF1ZXJ5LmNoZWNrcy5wdXNoKHtcbiAgICAgICAgdHlwZTogVHlwZS5DSElMRCxcbiAgICAgICAgcGFyZW50OiBwYXJlbnQsXG4gICAgICAgIGNoaWxkOiBjaGlsZFxuICAgICAgfSk7XG5cbiAgICAgIC8vIHRoZSBxdWVyeSBpbiB0aGUgc2VsZWN0b3Igc2hvdWxkIGJlIHRoZSAnPicgaXRzZWxmXG4gICAgICByZXBsYWNlTGFzdFF1ZXJ5KHNlbGVjdG9yLCBxdWVyeSwgcGFyZW50Q2hpbGRRdWVyeSk7XG4gICAgICBzZWxlY3Rvci5jb21wb3VuZENvdW50Kys7XG5cbiAgICAgIC8vIHdlJ3JlIG5vdyBwb3B1bGF0aW5nIHRoZSBjaGlsZCBxdWVyeSB3aXRoIGV4cHJlc3Npb25zIHRoYXQgZm9sbG93XG4gICAgICByZXR1cm4gY2hpbGQ7XG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5jdXJyZW50U3ViamVjdCA9PT0gcXVlcnkpIHtcbiAgICAgIC8vIGNvbXBvdW5kIHNwbGl0IHF1ZXJ5XG4gICAgICB2YXIgY29tcG91bmQgPSBuZXdRdWVyeSgpO1xuICAgICAgdmFyIGxlZnQgPSBzZWxlY3RvcltzZWxlY3Rvci5sZW5ndGggLSAxXTtcbiAgICAgIHZhciByaWdodCA9IG5ld1F1ZXJ5KCk7XG4gICAgICB2YXIgc3ViamVjdCA9IG5ld1F1ZXJ5KCk7XG4gICAgICB2YXIgX2NoaWxkID0gbmV3UXVlcnkoKTtcbiAgICAgIHZhciBfcGFyZW50ID0gbmV3UXVlcnkoKTtcblxuICAgICAgLy8gc2V0IHVwIHRoZSByb290IGNvbXBvdW5kIHFcbiAgICAgIGNvbXBvdW5kLmNoZWNrcy5wdXNoKHtcbiAgICAgICAgdHlwZTogVHlwZS5DT01QT1VORF9TUExJVCxcbiAgICAgICAgbGVmdDogbGVmdCxcbiAgICAgICAgcmlnaHQ6IHJpZ2h0LFxuICAgICAgICBzdWJqZWN0OiBzdWJqZWN0XG4gICAgICB9KTtcblxuICAgICAgLy8gcG9wdWxhdGUgdGhlIHN1YmplY3QgYW5kIHJlcGxhY2UgdGhlIHEgYXQgdGhlIG9sZCBzcG90ICh3aXRoaW4gbGVmdCkgd2l0aCBUUlVFXG4gICAgICBzdWJqZWN0LmNoZWNrcyA9IHF1ZXJ5LmNoZWNrczsgLy8gdGFrZSB0aGUgY2hlY2tzIGZyb20gdGhlIGxlZnRcbiAgICAgIHF1ZXJ5LmNoZWNrcyA9IFt7XG4gICAgICAgIHR5cGU6IFR5cGUuVFJVRVxuICAgICAgfV07IC8vIGNoZWNrcyB1bmRlciBsZWZ0IHJlZnMgdGhlIHN1YmplY3QgaW1wbGljaXRseVxuXG4gICAgICAvLyBzZXQgdXAgdGhlIHJpZ2h0IHFcbiAgICAgIF9wYXJlbnQuY2hlY2tzLnB1c2goe1xuICAgICAgICB0eXBlOiBUeXBlLlRSVUVcbiAgICAgIH0pOyAvLyBwYXJlbnQgaW1wbGljaXRseSByZWZzIHRoZSBzdWJqZWN0XG4gICAgICByaWdodC5jaGVja3MucHVzaCh7XG4gICAgICAgIHR5cGU6IFR5cGUuUEFSRU5ULFxuICAgICAgICAvLyB0eXBlIGlzIHN3YXBwZWQgb24gcmlnaHQgc2lkZSBxdWVyaWVzXG4gICAgICAgIHBhcmVudDogX3BhcmVudCxcbiAgICAgICAgY2hpbGQ6IF9jaGlsZCAvLyBlbXB0eSBmb3Igbm93XG4gICAgICB9KTtcbiAgICAgIHJlcGxhY2VMYXN0UXVlcnkoc2VsZWN0b3IsIGxlZnQsIGNvbXBvdW5kKTtcblxuICAgICAgLy8gdXBkYXRlIHRoZSByZWYgc2luY2Ugd2UgbW92ZWQgdGhpbmdzIGFyb3VuZCBmb3IgYHF1ZXJ5YFxuICAgICAgc2VsZWN0b3IuY3VycmVudFN1YmplY3QgPSBzdWJqZWN0O1xuICAgICAgc2VsZWN0b3IuY29tcG91bmRDb3VudCsrO1xuICAgICAgcmV0dXJuIF9jaGlsZDsgLy8gbm93IHBvcHVsYXRpbmcgdGhlIHJpZ2h0IHNpZGUncyBjaGlsZFxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBwYXJlbnQgcXVlcnlcbiAgICAgIC8vIGluZm8gZm9yIHBhcmVudCBxdWVyeVxuICAgICAgdmFyIF9wYXJlbnQyID0gbmV3UXVlcnkoKTtcbiAgICAgIHZhciBfY2hpbGQyID0gbmV3UXVlcnkoKTtcbiAgICAgIHZhciBwY1FDaGVja3MgPSBbe1xuICAgICAgICB0eXBlOiBUeXBlLlBBUkVOVCxcbiAgICAgICAgcGFyZW50OiBfcGFyZW50MixcbiAgICAgICAgY2hpbGQ6IF9jaGlsZDJcbiAgICAgIH1dO1xuXG4gICAgICAvLyB0aGUgcGFyZW50LWNoaWxkIHF1ZXJ5IHRha2VzIHRoZSBwbGFjZSBvZiB0aGUgcXVlcnkgcHJldmlvdXNseSBiZWluZyBwb3B1bGF0ZWRcbiAgICAgIF9wYXJlbnQyLmNoZWNrcyA9IHF1ZXJ5LmNoZWNrczsgLy8gdGhlIHByZXZpb3VzIHF1ZXJ5IGNvbnRhaW5zIHRoZSBjaGVja3MgZm9yIHRoZSBwYXJlbnRcbiAgICAgIHF1ZXJ5LmNoZWNrcyA9IHBjUUNoZWNrczsgLy8gcGMgcXVlcnkgdGFrZXMgb3ZlclxuXG4gICAgICBzZWxlY3Rvci5jb21wb3VuZENvdW50Kys7XG4gICAgICByZXR1cm4gX2NoaWxkMjsgLy8gd2UncmUgbm93IHBvcHVsYXRpbmcgdGhlIGNoaWxkXG4gICAgfVxuICB9XG59LCB7XG4gIG5hbWU6ICdkZXNjZW5kYW50JyxcbiAgc2VwYXJhdG9yOiB0cnVlLFxuICByZWdleDogdG9rZW5zLmRlc2NlbmRhbnQsXG4gIHBvcHVsYXRlOiBmdW5jdGlvbiBwb3B1bGF0ZShzZWxlY3RvciwgcXVlcnkpIHtcbiAgICBpZiAoc2VsZWN0b3IuY3VycmVudFN1YmplY3QgPT0gbnVsbCkge1xuICAgICAgLy8gZGVmYXVsdDogZGVzY2VuZGFudCBxdWVyeVxuICAgICAgdmFyIGFuY0NoUXVlcnkgPSBuZXdRdWVyeSgpO1xuICAgICAgdmFyIGRlc2NlbmRhbnQgPSBuZXdRdWVyeSgpO1xuICAgICAgdmFyIGFuY2VzdG9yID0gc2VsZWN0b3Jbc2VsZWN0b3IubGVuZ3RoIC0gMV07XG4gICAgICBhbmNDaFF1ZXJ5LmNoZWNrcy5wdXNoKHtcbiAgICAgICAgdHlwZTogVHlwZS5ERVNDRU5EQU5ULFxuICAgICAgICBhbmNlc3RvcjogYW5jZXN0b3IsXG4gICAgICAgIGRlc2NlbmRhbnQ6IGRlc2NlbmRhbnRcbiAgICAgIH0pO1xuXG4gICAgICAvLyB0aGUgcXVlcnkgaW4gdGhlIHNlbGVjdG9yIHNob3VsZCBiZSB0aGUgJz4nIGl0c2VsZlxuICAgICAgcmVwbGFjZUxhc3RRdWVyeShzZWxlY3RvciwgcXVlcnksIGFuY0NoUXVlcnkpO1xuICAgICAgc2VsZWN0b3IuY29tcG91bmRDb3VudCsrO1xuXG4gICAgICAvLyB3ZSdyZSBub3cgcG9wdWxhdGluZyB0aGUgZGVzY2VuZGFudCBxdWVyeSB3aXRoIGV4cHJlc3Npb25zIHRoYXQgZm9sbG93XG4gICAgICByZXR1cm4gZGVzY2VuZGFudDtcbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmN1cnJlbnRTdWJqZWN0ID09PSBxdWVyeSkge1xuICAgICAgLy8gY29tcG91bmQgc3BsaXQgcXVlcnlcbiAgICAgIHZhciBjb21wb3VuZCA9IG5ld1F1ZXJ5KCk7XG4gICAgICB2YXIgbGVmdCA9IHNlbGVjdG9yW3NlbGVjdG9yLmxlbmd0aCAtIDFdO1xuICAgICAgdmFyIHJpZ2h0ID0gbmV3UXVlcnkoKTtcbiAgICAgIHZhciBzdWJqZWN0ID0gbmV3UXVlcnkoKTtcbiAgICAgIHZhciBfZGVzY2VuZGFudCA9IG5ld1F1ZXJ5KCk7XG4gICAgICB2YXIgX2FuY2VzdG9yID0gbmV3UXVlcnkoKTtcblxuICAgICAgLy8gc2V0IHVwIHRoZSByb290IGNvbXBvdW5kIHFcbiAgICAgIGNvbXBvdW5kLmNoZWNrcy5wdXNoKHtcbiAgICAgICAgdHlwZTogVHlwZS5DT01QT1VORF9TUExJVCxcbiAgICAgICAgbGVmdDogbGVmdCxcbiAgICAgICAgcmlnaHQ6IHJpZ2h0LFxuICAgICAgICBzdWJqZWN0OiBzdWJqZWN0XG4gICAgICB9KTtcblxuICAgICAgLy8gcG9wdWxhdGUgdGhlIHN1YmplY3QgYW5kIHJlcGxhY2UgdGhlIHEgYXQgdGhlIG9sZCBzcG90ICh3aXRoaW4gbGVmdCkgd2l0aCBUUlVFXG4gICAgICBzdWJqZWN0LmNoZWNrcyA9IHF1ZXJ5LmNoZWNrczsgLy8gdGFrZSB0aGUgY2hlY2tzIGZyb20gdGhlIGxlZnRcbiAgICAgIHF1ZXJ5LmNoZWNrcyA9IFt7XG4gICAgICAgIHR5cGU6IFR5cGUuVFJVRVxuICAgICAgfV07IC8vIGNoZWNrcyB1bmRlciBsZWZ0IHJlZnMgdGhlIHN1YmplY3QgaW1wbGljaXRseVxuXG4gICAgICAvLyBzZXQgdXAgdGhlIHJpZ2h0IHFcbiAgICAgIF9hbmNlc3Rvci5jaGVja3MucHVzaCh7XG4gICAgICAgIHR5cGU6IFR5cGUuVFJVRVxuICAgICAgfSk7IC8vIGFuY2VzdG9yIGltcGxpY2l0bHkgcmVmcyB0aGUgc3ViamVjdFxuICAgICAgcmlnaHQuY2hlY2tzLnB1c2goe1xuICAgICAgICB0eXBlOiBUeXBlLkFOQ0VTVE9SLFxuICAgICAgICAvLyB0eXBlIGlzIHN3YXBwZWQgb24gcmlnaHQgc2lkZSBxdWVyaWVzXG4gICAgICAgIGFuY2VzdG9yOiBfYW5jZXN0b3IsXG4gICAgICAgIGRlc2NlbmRhbnQ6IF9kZXNjZW5kYW50IC8vIGVtcHR5IGZvciBub3dcbiAgICAgIH0pO1xuICAgICAgcmVwbGFjZUxhc3RRdWVyeShzZWxlY3RvciwgbGVmdCwgY29tcG91bmQpO1xuXG4gICAgICAvLyB1cGRhdGUgdGhlIHJlZiBzaW5jZSB3ZSBtb3ZlZCB0aGluZ3MgYXJvdW5kIGZvciBgcXVlcnlgXG4gICAgICBzZWxlY3Rvci5jdXJyZW50U3ViamVjdCA9IHN1YmplY3Q7XG4gICAgICBzZWxlY3Rvci5jb21wb3VuZENvdW50Kys7XG4gICAgICByZXR1cm4gX2Rlc2NlbmRhbnQ7IC8vIG5vdyBwb3B1bGF0aW5nIHRoZSByaWdodCBzaWRlJ3MgZGVzY2VuZGFudFxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBhbmNlc3RvciBxdWVyeVxuICAgICAgLy8gaW5mbyBmb3IgcGFyZW50IHF1ZXJ5XG4gICAgICB2YXIgX2FuY2VzdG9yMiA9IG5ld1F1ZXJ5KCk7XG4gICAgICB2YXIgX2Rlc2NlbmRhbnQyID0gbmV3UXVlcnkoKTtcbiAgICAgIHZhciBhZFFDaGVja3MgPSBbe1xuICAgICAgICB0eXBlOiBUeXBlLkFOQ0VTVE9SLFxuICAgICAgICBhbmNlc3RvcjogX2FuY2VzdG9yMixcbiAgICAgICAgZGVzY2VuZGFudDogX2Rlc2NlbmRhbnQyXG4gICAgICB9XTtcblxuICAgICAgLy8gdGhlIHBhcmVudC1jaGlsZCBxdWVyeSB0YWtlcyB0aGUgcGxhY2Ugb2YgdGhlIHF1ZXJ5IHByZXZpb3VzbHkgYmVpbmcgcG9wdWxhdGVkXG4gICAgICBfYW5jZXN0b3IyLmNoZWNrcyA9IHF1ZXJ5LmNoZWNrczsgLy8gdGhlIHByZXZpb3VzIHF1ZXJ5IGNvbnRhaW5zIHRoZSBjaGVja3MgZm9yIHRoZSBwYXJlbnRcbiAgICAgIHF1ZXJ5LmNoZWNrcyA9IGFkUUNoZWNrczsgLy8gcGMgcXVlcnkgdGFrZXMgb3ZlclxuXG4gICAgICBzZWxlY3Rvci5jb21wb3VuZENvdW50Kys7XG4gICAgICByZXR1cm4gX2Rlc2NlbmRhbnQyOyAvLyB3ZSdyZSBub3cgcG9wdWxhdGluZyB0aGUgY2hpbGRcbiAgICB9XG4gIH1cbn0sIHtcbiAgbmFtZTogJ3N1YmplY3QnLFxuICBtb2RpZmllcjogdHJ1ZSxcbiAgcmVnZXg6IHRva2Vucy5zdWJqZWN0LFxuICBwb3B1bGF0ZTogZnVuY3Rpb24gcG9wdWxhdGUoc2VsZWN0b3IsIHF1ZXJ5KSB7XG4gICAgaWYgKHNlbGVjdG9yLmN1cnJlbnRTdWJqZWN0ICE9IG51bGwgJiYgc2VsZWN0b3IuY3VycmVudFN1YmplY3QgIT09IHF1ZXJ5KSB7XG4gICAgICB3YXJuKCdSZWRlZmluaXRpb24gb2Ygc3ViamVjdCBpbiBzZWxlY3RvciBgJyArIHNlbGVjdG9yLnRvU3RyaW5nKCkgKyAnYCcpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBzZWxlY3Rvci5jdXJyZW50U3ViamVjdCA9IHF1ZXJ5O1xuICAgIHZhciB0b3BRID0gc2VsZWN0b3Jbc2VsZWN0b3IubGVuZ3RoIC0gMV07XG4gICAgdmFyIHRvcENoayA9IHRvcFEuY2hlY2tzWzBdO1xuICAgIHZhciB0b3BUeXBlID0gdG9wQ2hrID09IG51bGwgPyBudWxsIDogdG9wQ2hrLnR5cGU7XG4gICAgaWYgKHRvcFR5cGUgPT09IFR5cGUuRElSRUNURURfRURHRSkge1xuICAgICAgLy8gZGlyZWN0ZWQgZWRnZSB3aXRoIHN1YmplY3Qgb24gdGhlIHRhcmdldFxuXG4gICAgICAvLyBjaGFuZ2UgdG8gdGFyZ2V0IG5vZGUgY2hlY2tcbiAgICAgIHRvcENoay50eXBlID0gVHlwZS5OT0RFX1RBUkdFVDtcbiAgICB9IGVsc2UgaWYgKHRvcFR5cGUgPT09IFR5cGUuVU5ESVJFQ1RFRF9FREdFKSB7XG4gICAgICAvLyB1bmRpcmVjdGVkIGVkZ2Ugd2l0aCBzdWJqZWN0IG9uIHRoZSBzZWNvbmQgbm9kZVxuXG4gICAgICAvLyBjaGFuZ2UgdG8gbmVpZ2hib3IgY2hlY2tcbiAgICAgIHRvcENoay50eXBlID0gVHlwZS5OT0RFX05FSUdIQk9SO1xuICAgICAgdG9wQ2hrLm5vZGUgPSB0b3BDaGsubm9kZXNbMV07IC8vIHNlY29uZCBub2RlIGlzIHN1YmplY3RcbiAgICAgIHRvcENoay5uZWlnaGJvciA9IHRvcENoay5ub2Rlc1swXTtcblxuICAgICAgLy8gY2xlYW4gdXAgdW51c2VkIGZpZWxkcyBmb3IgbmV3IHR5cGVcbiAgICAgIHRvcENoay5ub2RlcyA9IG51bGw7XG4gICAgfVxuICB9XG59XTtcbmV4cHJzLmZvckVhY2goZnVuY3Rpb24gKGUpIHtcbiAgcmV0dXJuIGUucmVnZXhPYmogPSBuZXcgUmVnRXhwKCdeJyArIGUucmVnZXgpO1xufSk7XG5cbi8qKlxuICogT2YgYWxsIHRoZSBleHByZXNzaW9ucywgZmluZCB0aGUgZmlyc3QgbWF0Y2ggaW4gdGhlIHJlbWFpbmluZyB0ZXh0LlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbWFpbmluZyBUaGUgcmVtYWluaW5nIHRleHQgdG8gcGFyc2VcbiAqIEByZXR1cm5zIFRoZSBtYXRjaGVkIGV4cHJlc3Npb24gYW5kIHRoZSBuZXdseSByZW1haW5pbmcgdGV4dCBgeyBleHByLCBtYXRjaCwgbmFtZSwgcmVtYWluaW5nIH1gXG4gKi9cbnZhciBjb25zdW1lRXhwciA9IGZ1bmN0aW9uIGNvbnN1bWVFeHByKHJlbWFpbmluZykge1xuICB2YXIgZXhwcjtcbiAgdmFyIG1hdGNoO1xuICB2YXIgbmFtZTtcbiAgZm9yICh2YXIgaiA9IDA7IGogPCBleHBycy5sZW5ndGg7IGorKykge1xuICAgIHZhciBlID0gZXhwcnNbal07XG4gICAgdmFyIG4gPSBlLm5hbWU7XG4gICAgdmFyIG0gPSByZW1haW5pbmcubWF0Y2goZS5yZWdleE9iaik7XG4gICAgaWYgKG0gIT0gbnVsbCkge1xuICAgICAgbWF0Y2ggPSBtO1xuICAgICAgZXhwciA9IGU7XG4gICAgICBuYW1lID0gbjtcbiAgICAgIHZhciBjb25zdW1lZCA9IG1bMF07XG4gICAgICByZW1haW5pbmcgPSByZW1haW5pbmcuc3Vic3RyaW5nKGNvbnN1bWVkLmxlbmd0aCk7XG4gICAgICBicmVhazsgLy8gd2UndmUgY29uc3VtZWQgb25lIGV4cHIsIHNvIHdlIGNhbiByZXR1cm4gbm93XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgZXhwcjogZXhwcixcbiAgICBtYXRjaDogbWF0Y2gsXG4gICAgbmFtZTogbmFtZSxcbiAgICByZW1haW5pbmc6IHJlbWFpbmluZ1xuICB9O1xufTtcblxuLyoqXG4gKiBDb25zdW1lIGFsbCB0aGUgbGVhZGluZyB3aGl0ZXNwYWNlXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVtYWluaW5nIFRoZSB0ZXh0IHRvIGNvbnN1bWVcbiAqIEByZXR1cm5zIFRoZSB0ZXh0IHdpdGggdGhlIGxlYWRpbmcgd2hpdGVzcGFjZSByZW1vdmVkXG4gKi9cbnZhciBjb25zdW1lV2hpdGVzcGFjZSA9IGZ1bmN0aW9uIGNvbnN1bWVXaGl0ZXNwYWNlKHJlbWFpbmluZykge1xuICB2YXIgbWF0Y2ggPSByZW1haW5pbmcubWF0Y2goL15cXHMrLyk7XG4gIGlmIChtYXRjaCkge1xuICAgIHZhciBjb25zdW1lZCA9IG1hdGNoWzBdO1xuICAgIHJlbWFpbmluZyA9IHJlbWFpbmluZy5zdWJzdHJpbmcoY29uc3VtZWQubGVuZ3RoKTtcbiAgfVxuICByZXR1cm4gcmVtYWluaW5nO1xufTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgc3RyaW5nIGFuZCBzdG9yZSB0aGUgcGFyc2VkIHJlcHJlc2VudGF0aW9uIGluIHRoZSBTZWxlY3Rvci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciBUaGUgc2VsZWN0b3Igc3RyaW5nXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHNlbGVjdG9yIHdhcyBzdWNjZXNzZnVsbHkgcGFyc2VkLCBgZmFsc2VgIG90aGVyd2lzZVxuICovXG52YXIgcGFyc2UgPSBmdW5jdGlvbiBwYXJzZShzZWxlY3Rvcikge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciByZW1haW5pbmcgPSBzZWxmLmlucHV0VGV4dCA9IHNlbGVjdG9yO1xuICB2YXIgY3VycmVudFF1ZXJ5ID0gc2VsZlswXSA9IG5ld1F1ZXJ5KCk7XG4gIHNlbGYubGVuZ3RoID0gMTtcbiAgcmVtYWluaW5nID0gY29uc3VtZVdoaXRlc3BhY2UocmVtYWluaW5nKTsgLy8gZ2V0IHJpZCBvZiBsZWFkaW5nIHdoaXRlc3BhY2VcblxuICBmb3IgKDs7KSB7XG4gICAgdmFyIGV4cHJJbmZvID0gY29uc3VtZUV4cHIocmVtYWluaW5nKTtcbiAgICBpZiAoZXhwckluZm8uZXhwciA9PSBudWxsKSB7XG4gICAgICB3YXJuKCdUaGUgc2VsZWN0b3IgYCcgKyBzZWxlY3RvciArICdgaXMgaW52YWxpZCcpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgYXJncyA9IGV4cHJJbmZvLm1hdGNoLnNsaWNlKDEpO1xuXG4gICAgICAvLyBsZXQgdGhlIHRva2VuIHBvcHVsYXRlIHRoZSBzZWxlY3RvciBvYmplY3QgaW4gY3VycmVudFF1ZXJ5XG4gICAgICB2YXIgcmV0ID0gZXhwckluZm8uZXhwci5wb3B1bGF0ZShzZWxmLCBjdXJyZW50UXVlcnksIGFyZ3MpO1xuICAgICAgaWYgKHJldCA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBleGl0IGlmIHBvcHVsYXRpb24gZmFpbGVkXG4gICAgICB9IGVsc2UgaWYgKHJldCAhPSBudWxsKSB7XG4gICAgICAgIGN1cnJlbnRRdWVyeSA9IHJldDsgLy8gY2hhbmdlIHRoZSBjdXJyZW50IHF1ZXJ5IHRvIGJlIGZpbGxlZCBpZiB0aGUgZXhwciBzcGVjaWZpZXNcbiAgICAgIH1cbiAgICB9XG4gICAgcmVtYWluaW5nID0gZXhwckluZm8ucmVtYWluaW5nO1xuXG4gICAgLy8gd2UncmUgZG9uZSB3aGVuIHRoZXJlJ3Mgbm90aGluZyBsZWZ0IHRvIHBhcnNlXG4gICAgaWYgKHJlbWFpbmluZy5tYXRjaCgvXlxccyokLykpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICB2YXIgbGFzdFEgPSBzZWxmW3NlbGYubGVuZ3RoIC0gMV07XG4gIGlmIChzZWxmLmN1cnJlbnRTdWJqZWN0ICE9IG51bGwpIHtcbiAgICBsYXN0US5zdWJqZWN0ID0gc2VsZi5jdXJyZW50U3ViamVjdDtcbiAgfVxuICBsYXN0US5lZGdlQ291bnQgPSBzZWxmLmVkZ2VDb3VudDtcbiAgbGFzdFEuY29tcG91bmRDb3VudCA9IHNlbGYuY29tcG91bmRDb3VudDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHEgPSBzZWxmW2ldO1xuXG4gICAgLy8gaW4gZnV0dXJlLCB0aGlzIGNvdWxkIHBvdGVudGlhbGx5IGJlIGFsbG93ZWQgaWYgdGhlcmUgd2VyZSBvcGVyYXRvciBwcmVjZWRlbmNlIGFuZCBkZXRlY3Rpb24gb2YgaW52YWxpZCBjb21iaW5hdGlvbnNcbiAgICBpZiAocS5jb21wb3VuZENvdW50ID4gMCAmJiBxLmVkZ2VDb3VudCA+IDApIHtcbiAgICAgIHdhcm4oJ1RoZSBzZWxlY3RvciBgJyArIHNlbGVjdG9yICsgJ2AgaXMgaW52YWxpZCBiZWNhdXNlIGl0IHVzZXMgYm90aCBhIGNvbXBvdW5kIHNlbGVjdG9yIGFuZCBhbiBlZGdlIHNlbGVjdG9yJyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChxLmVkZ2VDb3VudCA+IDEpIHtcbiAgICAgIHdhcm4oJ1RoZSBzZWxlY3RvciBgJyArIHNlbGVjdG9yICsgJ2AgaXMgaW52YWxpZCBiZWNhdXNlIGl0IHVzZXMgbXVsdGlwbGUgZWRnZSBzZWxlY3RvcnMnKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKHEuZWRnZUNvdW50ID09PSAxKSB7XG4gICAgICB3YXJuKCdUaGUgc2VsZWN0b3IgYCcgKyBzZWxlY3RvciArICdgIGlzIGRlcHJlY2F0ZWQuICBFZGdlIHNlbGVjdG9ycyBkbyBub3QgdGFrZSBlZmZlY3Qgb24gY2hhbmdlcyB0byBzb3VyY2UgYW5kIHRhcmdldCBub2RlcyBhZnRlciBhbiBlZGdlIGlzIGFkZGVkLCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4gIFVzZSBhIGNsYXNzIG9yIGRhdGEgc2VsZWN0b3Igb24gZWRnZXMgaW5zdGVhZCwgdXBkYXRpbmcgdGhlIGNsYXNzIG9yIGRhdGEgb2YgYW4gZWRnZSB3aGVuIHlvdXIgYXBwIGRldGVjdHMgYSBjaGFuZ2UgaW4gc291cmNlIG9yIHRhcmdldCBub2Rlcy4nKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7IC8vIHN1Y2Nlc3Ncbn07XG5cbi8qKlxuICogR2V0IHRoZSBzZWxlY3RvciByZXByZXNlbnRlZCBhcyBhIHN0cmluZy4gIFRoaXMgdmFsdWUgdXNlcyBkZWZhdWx0IGZvcm1hdHRpbmcsXG4gKiBzbyB0aGluZ3MgbGlrZSBzcGFjaW5nIG1heSBkaWZmZXIgZnJvbSB0aGUgaW5wdXQgdGV4dCBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yLlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIHNlbGVjdG9yIHN0cmluZ1xuICovXG52YXIgdG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgaWYgKHRoaXMudG9TdHJpbmdDYWNoZSAhPSBudWxsKSB7XG4gICAgcmV0dXJuIHRoaXMudG9TdHJpbmdDYWNoZTtcbiAgfVxuICB2YXIgY2xlYW4gPSBmdW5jdGlvbiBjbGVhbihvYmopIHtcbiAgICBpZiAob2JqID09IG51bGwpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG4gIH07XG4gIHZhciBjbGVhblZhbCA9IGZ1bmN0aW9uIGNsZWFuVmFsKHZhbCkge1xuICAgIGlmIChzdHJpbmcodmFsKSkge1xuICAgICAgcmV0dXJuICdcIicgKyB2YWwgKyAnXCInO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gY2xlYW4odmFsKTtcbiAgICB9XG4gIH07XG4gIHZhciBzcGFjZSA9IGZ1bmN0aW9uIHNwYWNlKHZhbCkge1xuICAgIHJldHVybiAnICcgKyB2YWwgKyAnICc7XG4gIH07XG4gIHZhciBjaGVja1RvU3RyaW5nID0gZnVuY3Rpb24gY2hlY2tUb1N0cmluZyhjaGVjaywgc3ViamVjdCkge1xuICAgIHZhciB0eXBlID0gY2hlY2sudHlwZSxcbiAgICAgIHZhbHVlID0gY2hlY2sudmFsdWU7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFR5cGUuR1JPVVA6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgZ3JvdXAgPSBjbGVhbih2YWx1ZSk7XG4gICAgICAgICAgcmV0dXJuIGdyb3VwLnN1YnN0cmluZygwLCBncm91cC5sZW5ndGggLSAxKTtcbiAgICAgICAgfVxuICAgICAgY2FzZSBUeXBlLkRBVEFfQ09NUEFSRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBmaWVsZCA9IGNoZWNrLmZpZWxkLFxuICAgICAgICAgICAgb3BlcmF0b3IgPSBjaGVjay5vcGVyYXRvcjtcbiAgICAgICAgICByZXR1cm4gJ1snICsgZmllbGQgKyBzcGFjZShjbGVhbihvcGVyYXRvcikpICsgY2xlYW5WYWwodmFsdWUpICsgJ10nO1xuICAgICAgICB9XG4gICAgICBjYXNlIFR5cGUuREFUQV9CT09MOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIF9vcGVyYXRvciA9IGNoZWNrLm9wZXJhdG9yLFxuICAgICAgICAgICAgX2ZpZWxkID0gY2hlY2suZmllbGQ7XG4gICAgICAgICAgcmV0dXJuICdbJyArIGNsZWFuKF9vcGVyYXRvcikgKyBfZmllbGQgKyAnXSc7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgVHlwZS5EQVRBX0VYSVNUOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIF9maWVsZDIgPSBjaGVjay5maWVsZDtcbiAgICAgICAgICByZXR1cm4gJ1snICsgX2ZpZWxkMiArICddJztcbiAgICAgICAgfVxuICAgICAgY2FzZSBUeXBlLk1FVEFfQ09NUEFSRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBfb3BlcmF0b3IyID0gY2hlY2sub3BlcmF0b3IsXG4gICAgICAgICAgICBfZmllbGQzID0gY2hlY2suZmllbGQ7XG4gICAgICAgICAgcmV0dXJuICdbWycgKyBfZmllbGQzICsgc3BhY2UoY2xlYW4oX29wZXJhdG9yMikpICsgY2xlYW5WYWwodmFsdWUpICsgJ11dJztcbiAgICAgICAgfVxuICAgICAgY2FzZSBUeXBlLlNUQVRFOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICBjYXNlIFR5cGUuSUQ6XG4gICAgICAgIHtcbiAgICAgICAgICByZXR1cm4gJyMnICsgdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgVHlwZS5DTEFTUzpcbiAgICAgICAge1xuICAgICAgICAgIHJldHVybiAnLicgKyB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgY2FzZSBUeXBlLlBBUkVOVDpcbiAgICAgIGNhc2UgVHlwZS5DSElMRDpcbiAgICAgICAge1xuICAgICAgICAgIHJldHVybiBxdWVyeVRvU3RyaW5nKGNoZWNrLnBhcmVudCwgc3ViamVjdCkgKyBzcGFjZSgnPicpICsgcXVlcnlUb1N0cmluZyhjaGVjay5jaGlsZCwgc3ViamVjdCk7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgVHlwZS5BTkNFU1RPUjpcbiAgICAgIGNhc2UgVHlwZS5ERVNDRU5EQU5UOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIHF1ZXJ5VG9TdHJpbmcoY2hlY2suYW5jZXN0b3IsIHN1YmplY3QpICsgJyAnICsgcXVlcnlUb1N0cmluZyhjaGVjay5kZXNjZW5kYW50LCBzdWJqZWN0KTtcbiAgICAgICAgfVxuICAgICAgY2FzZSBUeXBlLkNPTVBPVU5EX1NQTElUOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGxocyA9IHF1ZXJ5VG9TdHJpbmcoY2hlY2subGVmdCwgc3ViamVjdCk7XG4gICAgICAgICAgdmFyIHN1YiA9IHF1ZXJ5VG9TdHJpbmcoY2hlY2suc3ViamVjdCwgc3ViamVjdCk7XG4gICAgICAgICAgdmFyIHJocyA9IHF1ZXJ5VG9TdHJpbmcoY2hlY2sucmlnaHQsIHN1YmplY3QpO1xuICAgICAgICAgIHJldHVybiBsaHMgKyAobGhzLmxlbmd0aCA+IDAgPyAnICcgOiAnJykgKyBzdWIgKyByaHM7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgVHlwZS5UUlVFOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgfVxuICB9O1xuICB2YXIgcXVlcnlUb1N0cmluZyA9IGZ1bmN0aW9uIHF1ZXJ5VG9TdHJpbmcocXVlcnksIHN1YmplY3QpIHtcbiAgICByZXR1cm4gcXVlcnkuY2hlY2tzLnJlZHVjZShmdW5jdGlvbiAoc3RyLCBjaGssIGkpIHtcbiAgICAgIHJldHVybiBzdHIgKyAoc3ViamVjdCA9PT0gcXVlcnkgJiYgaSA9PT0gMCA/ICckJyA6ICcnKSArIGNoZWNrVG9TdHJpbmcoY2hrLCBzdWJqZWN0KTtcbiAgICB9LCAnJyk7XG4gIH07XG4gIHZhciBzdHIgPSAnJztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHF1ZXJ5ID0gdGhpc1tpXTtcbiAgICBzdHIgKz0gcXVlcnlUb1N0cmluZyhxdWVyeSwgcXVlcnkuc3ViamVjdCk7XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gMSAmJiBpIDwgdGhpcy5sZW5ndGggLSAxKSB7XG4gICAgICBzdHIgKz0gJywgJztcbiAgICB9XG4gIH1cbiAgdGhpcy50b1N0cmluZ0NhY2hlID0gc3RyO1xuICByZXR1cm4gc3RyO1xufTtcbnZhciBwYXJzZSQxID0ge1xuICBwYXJzZTogcGFyc2UsXG4gIHRvU3RyaW5nOiB0b1N0cmluZ1xufTtcblxudmFyIHZhbENtcCA9IGZ1bmN0aW9uIHZhbENtcChmaWVsZFZhbCwgb3BlcmF0b3IsIHZhbHVlKSB7XG4gIHZhciBtYXRjaGVzO1xuICB2YXIgaXNGaWVsZFN0ciA9IHN0cmluZyhmaWVsZFZhbCk7XG4gIHZhciBpc0ZpZWxkTnVtID0gbnVtYmVyJDEoZmllbGRWYWwpO1xuICB2YXIgaXNWYWxTdHIgPSBzdHJpbmcodmFsdWUpO1xuICB2YXIgZmllbGRTdHIsIHZhbFN0cjtcbiAgdmFyIGNhc2VJbnNlbnNpdGl2ZSA9IGZhbHNlO1xuICB2YXIgbm90RXhwciA9IGZhbHNlO1xuICB2YXIgaXNJbmVxQ21wID0gZmFsc2U7XG4gIGlmIChvcGVyYXRvci5pbmRleE9mKCchJykgPj0gMCkge1xuICAgIG9wZXJhdG9yID0gb3BlcmF0b3IucmVwbGFjZSgnIScsICcnKTtcbiAgICBub3RFeHByID0gdHJ1ZTtcbiAgfVxuICBpZiAob3BlcmF0b3IuaW5kZXhPZignQCcpID49IDApIHtcbiAgICBvcGVyYXRvciA9IG9wZXJhdG9yLnJlcGxhY2UoJ0AnLCAnJyk7XG4gICAgY2FzZUluc2Vuc2l0aXZlID0gdHJ1ZTtcbiAgfVxuICBpZiAoaXNGaWVsZFN0ciB8fCBpc1ZhbFN0ciB8fCBjYXNlSW5zZW5zaXRpdmUpIHtcbiAgICBmaWVsZFN0ciA9ICFpc0ZpZWxkU3RyICYmICFpc0ZpZWxkTnVtID8gJycgOiAnJyArIGZpZWxkVmFsO1xuICAgIHZhbFN0ciA9ICcnICsgdmFsdWU7XG4gIH1cblxuICAvLyBpZiB3ZSdyZSBkb2luZyBhIGNhc2UgaW5zZW5zaXRpdmUgY29tcGFyaXNvbiwgdGhlbiB3ZSdyZSB1c2luZyBhIFNUUklORyBjb21wYXJpc29uXG4gIC8vIGV2ZW4gaWYgd2UncmUgY29tcGFyaW5nIG51bWJlcnNcbiAgaWYgKGNhc2VJbnNlbnNpdGl2ZSkge1xuICAgIGZpZWxkVmFsID0gZmllbGRTdHIgPSBmaWVsZFN0ci50b0xvd2VyQ2FzZSgpO1xuICAgIHZhbHVlID0gdmFsU3RyID0gdmFsU3RyLnRvTG93ZXJDYXNlKCk7XG4gIH1cbiAgc3dpdGNoIChvcGVyYXRvcikge1xuICAgIGNhc2UgJyo9JzpcbiAgICAgIG1hdGNoZXMgPSBmaWVsZFN0ci5pbmRleE9mKHZhbFN0cikgPj0gMDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJyQ9JzpcbiAgICAgIG1hdGNoZXMgPSBmaWVsZFN0ci5pbmRleE9mKHZhbFN0ciwgZmllbGRTdHIubGVuZ3RoIC0gdmFsU3RyLmxlbmd0aCkgPj0gMDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ149JzpcbiAgICAgIG1hdGNoZXMgPSBmaWVsZFN0ci5pbmRleE9mKHZhbFN0cikgPT09IDA7XG4gICAgICBicmVhaztcbiAgICBjYXNlICc9JzpcbiAgICAgIG1hdGNoZXMgPSBmaWVsZFZhbCA9PT0gdmFsdWU7XG4gICAgICBicmVhaztcbiAgICBjYXNlICc+JzpcbiAgICAgIGlzSW5lcUNtcCA9IHRydWU7XG4gICAgICBtYXRjaGVzID0gZmllbGRWYWwgPiB2YWx1ZTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJz49JzpcbiAgICAgIGlzSW5lcUNtcCA9IHRydWU7XG4gICAgICBtYXRjaGVzID0gZmllbGRWYWwgPj0gdmFsdWU7XG4gICAgICBicmVhaztcbiAgICBjYXNlICc8JzpcbiAgICAgIGlzSW5lcUNtcCA9IHRydWU7XG4gICAgICBtYXRjaGVzID0gZmllbGRWYWwgPCB2YWx1ZTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJzw9JzpcbiAgICAgIGlzSW5lcUNtcCA9IHRydWU7XG4gICAgICBtYXRjaGVzID0gZmllbGRWYWwgPD0gdmFsdWU7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgbWF0Y2hlcyA9IGZhbHNlO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICAvLyBhcHBseSB0aGUgbm90IG9wLCBidXQgbnVsbCB2YWxzIGZvciBpbmVxdWFsaXRpZXMgc2hvdWxkIGFsd2F5cyBzdGF5IG5vbi1tYXRjaGluZ1xuICBpZiAobm90RXhwciAmJiAoZmllbGRWYWwgIT0gbnVsbCB8fCAhaXNJbmVxQ21wKSkge1xuICAgIG1hdGNoZXMgPSAhbWF0Y2hlcztcbiAgfVxuICByZXR1cm4gbWF0Y2hlcztcbn07XG52YXIgYm9vbENtcCA9IGZ1bmN0aW9uIGJvb2xDbXAoZmllbGRWYWwsIG9wZXJhdG9yKSB7XG4gIHN3aXRjaCAob3BlcmF0b3IpIHtcbiAgICBjYXNlICc/JzpcbiAgICAgIHJldHVybiBmaWVsZFZhbCA/IHRydWUgOiBmYWxzZTtcbiAgICBjYXNlICchJzpcbiAgICAgIHJldHVybiBmaWVsZFZhbCA/IGZhbHNlIDogdHJ1ZTtcbiAgICBjYXNlICdeJzpcbiAgICAgIHJldHVybiBmaWVsZFZhbCA9PT0gdW5kZWZpbmVkO1xuICB9XG59O1xudmFyIGV4aXN0Q21wID0gZnVuY3Rpb24gZXhpc3RDbXAoZmllbGRWYWwpIHtcbiAgcmV0dXJuIGZpZWxkVmFsICE9PSB1bmRlZmluZWQ7XG59O1xudmFyIGRhdGEkMSA9IGZ1bmN0aW9uIGRhdGEoZWxlLCBmaWVsZCkge1xuICByZXR1cm4gZWxlLmRhdGEoZmllbGQpO1xufTtcbnZhciBtZXRhID0gZnVuY3Rpb24gbWV0YShlbGUsIGZpZWxkKSB7XG4gIHJldHVybiBlbGVbZmllbGRdKCk7XG59O1xuXG4vKiogQSBsb29rdXAgb2YgYG1hdGNoKGNoZWNrLCBlbGUpYCBmdW5jdGlvbnMgYnkgYFR5cGVgIGludCAqL1xudmFyIG1hdGNoID0gW107XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIHRoZSBxdWVyeSBtYXRjaGVzIGZvciB0aGUgZWxlbWVudFxuICogQHBhcmFtIHF1ZXJ5IFRoZSBgeyB0eXBlLCB2YWx1ZSwgLi4uIH1gIHF1ZXJ5IG9iamVjdFxuICogQHBhcmFtIGVsZSBUaGUgZWxlbWVudCB0byBjb21wYXJlIGFnYWluc3RcbiovXG52YXIgbWF0Y2hlcyQxID0gZnVuY3Rpb24gbWF0Y2hlcyhxdWVyeSwgZWxlKSB7XG4gIHJldHVybiBxdWVyeS5jaGVja3MuZXZlcnkoZnVuY3Rpb24gKGNoaykge1xuICAgIHJldHVybiBtYXRjaFtjaGsudHlwZV0oY2hrLCBlbGUpO1xuICB9KTtcbn07XG5tYXRjaFtUeXBlLkdST1VQXSA9IGZ1bmN0aW9uIChjaGVjaywgZWxlKSB7XG4gIHZhciBncm91cCA9IGNoZWNrLnZhbHVlO1xuICByZXR1cm4gZ3JvdXAgPT09ICcqJyB8fCBncm91cCA9PT0gZWxlLmdyb3VwKCk7XG59O1xubWF0Y2hbVHlwZS5TVEFURV0gPSBmdW5jdGlvbiAoY2hlY2ssIGVsZSkge1xuICB2YXIgc3RhdGVTZWxlY3RvciA9IGNoZWNrLnZhbHVlO1xuICByZXR1cm4gc3RhdGVTZWxlY3Rvck1hdGNoZXMoc3RhdGVTZWxlY3RvciwgZWxlKTtcbn07XG5tYXRjaFtUeXBlLklEXSA9IGZ1bmN0aW9uIChjaGVjaywgZWxlKSB7XG4gIHZhciBpZCA9IGNoZWNrLnZhbHVlO1xuICByZXR1cm4gZWxlLmlkKCkgPT09IGlkO1xufTtcbm1hdGNoW1R5cGUuQ0xBU1NdID0gZnVuY3Rpb24gKGNoZWNrLCBlbGUpIHtcbiAgdmFyIGNscyA9IGNoZWNrLnZhbHVlO1xuICByZXR1cm4gZWxlLmhhc0NsYXNzKGNscyk7XG59O1xubWF0Y2hbVHlwZS5NRVRBX0NPTVBBUkVdID0gZnVuY3Rpb24gKGNoZWNrLCBlbGUpIHtcbiAgdmFyIGZpZWxkID0gY2hlY2suZmllbGQsXG4gICAgb3BlcmF0b3IgPSBjaGVjay5vcGVyYXRvcixcbiAgICB2YWx1ZSA9IGNoZWNrLnZhbHVlO1xuICByZXR1cm4gdmFsQ21wKG1ldGEoZWxlLCBmaWVsZCksIG9wZXJhdG9yLCB2YWx1ZSk7XG59O1xubWF0Y2hbVHlwZS5EQVRBX0NPTVBBUkVdID0gZnVuY3Rpb24gKGNoZWNrLCBlbGUpIHtcbiAgdmFyIGZpZWxkID0gY2hlY2suZmllbGQsXG4gICAgb3BlcmF0b3IgPSBjaGVjay5vcGVyYXRvcixcbiAgICB2YWx1ZSA9IGNoZWNrLnZhbHVlO1xuICByZXR1cm4gdmFsQ21wKGRhdGEkMShlbGUsIGZpZWxkKSwgb3BlcmF0b3IsIHZhbHVlKTtcbn07XG5tYXRjaFtUeXBlLkRBVEFfQk9PTF0gPSBmdW5jdGlvbiAoY2hlY2ssIGVsZSkge1xuICB2YXIgZmllbGQgPSBjaGVjay5maWVsZCxcbiAgICBvcGVyYXRvciA9IGNoZWNrLm9wZXJhdG9yO1xuICByZXR1cm4gYm9vbENtcChkYXRhJDEoZWxlLCBmaWVsZCksIG9wZXJhdG9yKTtcbn07XG5tYXRjaFtUeXBlLkRBVEFfRVhJU1RdID0gZnVuY3Rpb24gKGNoZWNrLCBlbGUpIHtcbiAgdmFyIGZpZWxkID0gY2hlY2suZmllbGQ7XG4gICAgY2hlY2sub3BlcmF0b3I7XG4gIHJldHVybiBleGlzdENtcChkYXRhJDEoZWxlLCBmaWVsZCkpO1xufTtcbm1hdGNoW1R5cGUuVU5ESVJFQ1RFRF9FREdFXSA9IGZ1bmN0aW9uIChjaGVjaywgZWxlKSB7XG4gIHZhciBxQSA9IGNoZWNrLm5vZGVzWzBdO1xuICB2YXIgcUIgPSBjaGVjay5ub2Rlc1sxXTtcbiAgdmFyIHNyYyA9IGVsZS5zb3VyY2UoKTtcbiAgdmFyIHRndCA9IGVsZS50YXJnZXQoKTtcbiAgcmV0dXJuIG1hdGNoZXMkMShxQSwgc3JjKSAmJiBtYXRjaGVzJDEocUIsIHRndCkgfHwgbWF0Y2hlcyQxKHFCLCBzcmMpICYmIG1hdGNoZXMkMShxQSwgdGd0KTtcbn07XG5tYXRjaFtUeXBlLk5PREVfTkVJR0hCT1JdID0gZnVuY3Rpb24gKGNoZWNrLCBlbGUpIHtcbiAgcmV0dXJuIG1hdGNoZXMkMShjaGVjay5ub2RlLCBlbGUpICYmIGVsZS5uZWlnaGJvcmhvb2QoKS5zb21lKGZ1bmN0aW9uIChuKSB7XG4gICAgcmV0dXJuIG4uaXNOb2RlKCkgJiYgbWF0Y2hlcyQxKGNoZWNrLm5laWdoYm9yLCBuKTtcbiAgfSk7XG59O1xubWF0Y2hbVHlwZS5ESVJFQ1RFRF9FREdFXSA9IGZ1bmN0aW9uIChjaGVjaywgZWxlKSB7XG4gIHJldHVybiBtYXRjaGVzJDEoY2hlY2suc291cmNlLCBlbGUuc291cmNlKCkpICYmIG1hdGNoZXMkMShjaGVjay50YXJnZXQsIGVsZS50YXJnZXQoKSk7XG59O1xubWF0Y2hbVHlwZS5OT0RFX1NPVVJDRV0gPSBmdW5jdGlvbiAoY2hlY2ssIGVsZSkge1xuICByZXR1cm4gbWF0Y2hlcyQxKGNoZWNrLnNvdXJjZSwgZWxlKSAmJiBlbGUub3V0Z29lcnMoKS5zb21lKGZ1bmN0aW9uIChuKSB7XG4gICAgcmV0dXJuIG4uaXNOb2RlKCkgJiYgbWF0Y2hlcyQxKGNoZWNrLnRhcmdldCwgbik7XG4gIH0pO1xufTtcbm1hdGNoW1R5cGUuTk9ERV9UQVJHRVRdID0gZnVuY3Rpb24gKGNoZWNrLCBlbGUpIHtcbiAgcmV0dXJuIG1hdGNoZXMkMShjaGVjay50YXJnZXQsIGVsZSkgJiYgZWxlLmluY29tZXJzKCkuc29tZShmdW5jdGlvbiAobikge1xuICAgIHJldHVybiBuLmlzTm9kZSgpICYmIG1hdGNoZXMkMShjaGVjay5zb3VyY2UsIG4pO1xuICB9KTtcbn07XG5tYXRjaFtUeXBlLkNISUxEXSA9IGZ1bmN0aW9uIChjaGVjaywgZWxlKSB7XG4gIHJldHVybiBtYXRjaGVzJDEoY2hlY2suY2hpbGQsIGVsZSkgJiYgbWF0Y2hlcyQxKGNoZWNrLnBhcmVudCwgZWxlLnBhcmVudCgpKTtcbn07XG5tYXRjaFtUeXBlLlBBUkVOVF0gPSBmdW5jdGlvbiAoY2hlY2ssIGVsZSkge1xuICByZXR1cm4gbWF0Y2hlcyQxKGNoZWNrLnBhcmVudCwgZWxlKSAmJiBlbGUuY2hpbGRyZW4oKS5zb21lKGZ1bmN0aW9uIChjKSB7XG4gICAgcmV0dXJuIG1hdGNoZXMkMShjaGVjay5jaGlsZCwgYyk7XG4gIH0pO1xufTtcbm1hdGNoW1R5cGUuREVTQ0VOREFOVF0gPSBmdW5jdGlvbiAoY2hlY2ssIGVsZSkge1xuICByZXR1cm4gbWF0Y2hlcyQxKGNoZWNrLmRlc2NlbmRhbnQsIGVsZSkgJiYgZWxlLmFuY2VzdG9ycygpLnNvbWUoZnVuY3Rpb24gKGEpIHtcbiAgICByZXR1cm4gbWF0Y2hlcyQxKGNoZWNrLmFuY2VzdG9yLCBhKTtcbiAgfSk7XG59O1xubWF0Y2hbVHlwZS5BTkNFU1RPUl0gPSBmdW5jdGlvbiAoY2hlY2ssIGVsZSkge1xuICByZXR1cm4gbWF0Y2hlcyQxKGNoZWNrLmFuY2VzdG9yLCBlbGUpICYmIGVsZS5kZXNjZW5kYW50cygpLnNvbWUoZnVuY3Rpb24gKGQpIHtcbiAgICByZXR1cm4gbWF0Y2hlcyQxKGNoZWNrLmRlc2NlbmRhbnQsIGQpO1xuICB9KTtcbn07XG5tYXRjaFtUeXBlLkNPTVBPVU5EX1NQTElUXSA9IGZ1bmN0aW9uIChjaGVjaywgZWxlKSB7XG4gIHJldHVybiBtYXRjaGVzJDEoY2hlY2suc3ViamVjdCwgZWxlKSAmJiBtYXRjaGVzJDEoY2hlY2subGVmdCwgZWxlKSAmJiBtYXRjaGVzJDEoY2hlY2sucmlnaHQsIGVsZSk7XG59O1xubWF0Y2hbVHlwZS5UUlVFXSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRydWU7XG59O1xubWF0Y2hbVHlwZS5DT0xMRUNUSU9OXSA9IGZ1bmN0aW9uIChjaGVjaywgZWxlKSB7XG4gIHZhciBjb2xsZWN0aW9uID0gY2hlY2sudmFsdWU7XG4gIHJldHVybiBjb2xsZWN0aW9uLmhhcyhlbGUpO1xufTtcbm1hdGNoW1R5cGUuRklMVEVSXSA9IGZ1bmN0aW9uIChjaGVjaywgZWxlKSB7XG4gIHZhciBmaWx0ZXIgPSBjaGVjay52YWx1ZTtcbiAgcmV0dXJuIGZpbHRlcihlbGUpO1xufTtcblxuLy8gZmlsdGVyIGFuIGV4aXN0aW5nIGNvbGxlY3Rpb25cbnZhciBmaWx0ZXIgPSBmdW5jdGlvbiBmaWx0ZXIoY29sbGVjdGlvbikge1xuICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgLy8gZm9yIDEgaWQgI2ZvbyBxdWVyaWVzLCBqdXN0IGdldCB0aGUgZWxlbWVudFxuICBpZiAoc2VsZi5sZW5ndGggPT09IDEgJiYgc2VsZlswXS5jaGVja3MubGVuZ3RoID09PSAxICYmIHNlbGZbMF0uY2hlY2tzWzBdLnR5cGUgPT09IFR5cGUuSUQpIHtcbiAgICByZXR1cm4gY29sbGVjdGlvbi5nZXRFbGVtZW50QnlJZChzZWxmWzBdLmNoZWNrc1swXS52YWx1ZSkuY29sbGVjdGlvbigpO1xuICB9XG4gIHZhciBzZWxlY3RvckZ1bmN0aW9uID0gZnVuY3Rpb24gc2VsZWN0b3JGdW5jdGlvbihlbGVtZW50KSB7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBzZWxmLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgcXVlcnkgPSBzZWxmW2pdO1xuICAgICAgaWYgKG1hdGNoZXMkMShxdWVyeSwgZWxlbWVudCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcbiAgaWYgKHNlbGYudGV4dCgpID09IG51bGwpIHtcbiAgICBzZWxlY3RvckZ1bmN0aW9uID0gZnVuY3Rpb24gc2VsZWN0b3JGdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIGNvbGxlY3Rpb24uZmlsdGVyKHNlbGVjdG9yRnVuY3Rpb24pO1xufTsgLy8gZmlsdGVyXG5cbi8vIGRvZXMgc2VsZWN0b3IgbWF0Y2ggYSBzaW5nbGUgZWxlbWVudD9cbnZhciBtYXRjaGVzID0gZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBmb3IgKHZhciBqID0gMDsgaiA8IHNlbGYubGVuZ3RoOyBqKyspIHtcbiAgICB2YXIgcXVlcnkgPSBzZWxmW2pdO1xuICAgIGlmIChtYXRjaGVzJDEocXVlcnksIGVsZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59OyAvLyBtYXRjaGVzXG5cbnZhciBtYXRjaGluZyA9IHtcbiAgbWF0Y2hlczogbWF0Y2hlcyxcbiAgZmlsdGVyOiBmaWx0ZXJcbn07XG5cbnZhciBTZWxlY3RvciA9IGZ1bmN0aW9uIFNlbGVjdG9yKHNlbGVjdG9yKSB7XG4gIHRoaXMuaW5wdXRUZXh0ID0gc2VsZWN0b3I7XG4gIHRoaXMuY3VycmVudFN1YmplY3QgPSBudWxsO1xuICB0aGlzLmNvbXBvdW5kQ291bnQgPSAwO1xuICB0aGlzLmVkZ2VDb3VudCA9IDA7XG4gIHRoaXMubGVuZ3RoID0gMDtcbiAgaWYgKHNlbGVjdG9yID09IG51bGwgfHwgc3RyaW5nKHNlbGVjdG9yKSAmJiBzZWxlY3Rvci5tYXRjaCgvXlxccyokLykpIDsgZWxzZSBpZiAoZWxlbWVudE9yQ29sbGVjdGlvbihzZWxlY3RvcikpIHtcbiAgICB0aGlzLmFkZFF1ZXJ5KHtcbiAgICAgIGNoZWNrczogW3tcbiAgICAgICAgdHlwZTogVHlwZS5DT0xMRUNUSU9OLFxuICAgICAgICB2YWx1ZTogc2VsZWN0b3IuY29sbGVjdGlvbigpXG4gICAgICB9XVxuICAgIH0pO1xuICB9IGVsc2UgaWYgKGZuJDYoc2VsZWN0b3IpKSB7XG4gICAgdGhpcy5hZGRRdWVyeSh7XG4gICAgICBjaGVja3M6IFt7XG4gICAgICAgIHR5cGU6IFR5cGUuRklMVEVSLFxuICAgICAgICB2YWx1ZTogc2VsZWN0b3JcbiAgICAgIH1dXG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoc3RyaW5nKHNlbGVjdG9yKSkge1xuICAgIGlmICghdGhpcy5wYXJzZShzZWxlY3RvcikpIHtcbiAgICAgIHRoaXMuaW52YWxpZCA9IHRydWU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGVycm9yKCdBIHNlbGVjdG9yIG11c3QgYmUgY3JlYXRlZCBmcm9tIGEgc3RyaW5nOyBmb3VuZCAnKTtcbiAgfVxufTtcbnZhciBzZWxmbiA9IFNlbGVjdG9yLnByb3RvdHlwZTtcbltwYXJzZSQxLCBtYXRjaGluZ10uZm9yRWFjaChmdW5jdGlvbiAocCkge1xuICByZXR1cm4gZXh0ZW5kKHNlbGZuLCBwKTtcbn0pO1xuc2VsZm4udGV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuaW5wdXRUZXh0O1xufTtcbnNlbGZuLnNpemUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmxlbmd0aDtcbn07XG5zZWxmbi5lcSA9IGZ1bmN0aW9uIChpKSB7XG4gIHJldHVybiB0aGlzW2ldO1xufTtcbnNlbGZuLnNhbWVUZXh0ID0gZnVuY3Rpb24gKG90aGVyU2VsKSB7XG4gIHJldHVybiAhdGhpcy5pbnZhbGlkICYmICFvdGhlclNlbC5pbnZhbGlkICYmIHRoaXMudGV4dCgpID09PSBvdGhlclNlbC50ZXh0KCk7XG59O1xuc2VsZm4uYWRkUXVlcnkgPSBmdW5jdGlvbiAocSkge1xuICB0aGlzW3RoaXMubGVuZ3RoKytdID0gcTtcbn07XG5zZWxmbi5zZWxlY3RvciA9IHNlbGZuLnRvU3RyaW5nO1xuXG52YXIgZWxlc2ZuJGcgPSB7XG4gIGFsbEFyZTogZnVuY3Rpb24gYWxsQXJlKHNlbGVjdG9yKSB7XG4gICAgdmFyIHNlbE9iaiA9IG5ldyBTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgcmV0dXJuIHRoaXMuZXZlcnkoZnVuY3Rpb24gKGVsZSkge1xuICAgICAgcmV0dXJuIHNlbE9iai5tYXRjaGVzKGVsZSk7XG4gICAgfSk7XG4gIH0sXG4gIGlzOiBmdW5jdGlvbiBpcyhzZWxlY3Rvcikge1xuICAgIHZhciBzZWxPYmogPSBuZXcgU2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgIHJldHVybiB0aGlzLnNvbWUoZnVuY3Rpb24gKGVsZSkge1xuICAgICAgcmV0dXJuIHNlbE9iai5tYXRjaGVzKGVsZSk7XG4gICAgfSk7XG4gIH0sXG4gIHNvbWU6IGZ1bmN0aW9uIHNvbWUoZm4sIHRoaXNBcmcpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciByZXQgPSAhdGhpc0FyZyA/IGZuKHRoaXNbaV0sIGksIHRoaXMpIDogZm4uYXBwbHkodGhpc0FyZywgW3RoaXNbaV0sIGksIHRoaXNdKTtcbiAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgZXZlcnk6IGZ1bmN0aW9uIGV2ZXJ5KGZuLCB0aGlzQXJnKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcmV0ID0gIXRoaXNBcmcgPyBmbih0aGlzW2ldLCBpLCB0aGlzKSA6IGZuLmFwcGx5KHRoaXNBcmcsIFt0aGlzW2ldLCBpLCB0aGlzXSk7XG4gICAgICBpZiAoIXJldCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICBzYW1lOiBmdW5jdGlvbiBzYW1lKGNvbGxlY3Rpb24pIHtcbiAgICAvLyBjaGVhcCBjb2xsZWN0aW9uIHJlZiBjaGVja1xuICAgIGlmICh0aGlzID09PSBjb2xsZWN0aW9uKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29sbGVjdGlvbiA9IHRoaXMuY3koKS5jb2xsZWN0aW9uKGNvbGxlY3Rpb24pO1xuICAgIHZhciB0aGlzTGVuZ3RoID0gdGhpcy5sZW5ndGg7XG4gICAgdmFyIGNvbGxlY3Rpb25MZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDtcblxuICAgIC8vIGNoZWFwIGxlbmd0aCBjaGVja1xuICAgIGlmICh0aGlzTGVuZ3RoICE9PSBjb2xsZWN0aW9uTGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gY2hlYXAgZWxlbWVudCByZWYgY2hlY2tcbiAgICBpZiAodGhpc0xlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIHRoaXNbMF0gPT09IGNvbGxlY3Rpb25bMF07XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmV2ZXJ5KGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHJldHVybiBjb2xsZWN0aW9uLmhhc0VsZW1lbnRXaXRoSWQoZWxlLmlkKCkpO1xuICAgIH0pO1xuICB9LFxuICBhbnlTYW1lOiBmdW5jdGlvbiBhbnlTYW1lKGNvbGxlY3Rpb24pIHtcbiAgICBjb2xsZWN0aW9uID0gdGhpcy5jeSgpLmNvbGxlY3Rpb24oY29sbGVjdGlvbik7XG4gICAgcmV0dXJuIHRoaXMuc29tZShmdW5jdGlvbiAoZWxlKSB7XG4gICAgICByZXR1cm4gY29sbGVjdGlvbi5oYXNFbGVtZW50V2l0aElkKGVsZS5pZCgpKTtcbiAgICB9KTtcbiAgfSxcbiAgYWxsQXJlTmVpZ2hib3JzOiBmdW5jdGlvbiBhbGxBcmVOZWlnaGJvcnMoY29sbGVjdGlvbikge1xuICAgIGNvbGxlY3Rpb24gPSB0aGlzLmN5KCkuY29sbGVjdGlvbihjb2xsZWN0aW9uKTtcbiAgICB2YXIgbmhvb2QgPSB0aGlzLm5laWdoYm9yaG9vZCgpO1xuICAgIHJldHVybiBjb2xsZWN0aW9uLmV2ZXJ5KGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHJldHVybiBuaG9vZC5oYXNFbGVtZW50V2l0aElkKGVsZS5pZCgpKTtcbiAgICB9KTtcbiAgfSxcbiAgY29udGFpbnM6IGZ1bmN0aW9uIGNvbnRhaW5zKGNvbGxlY3Rpb24pIHtcbiAgICBjb2xsZWN0aW9uID0gdGhpcy5jeSgpLmNvbGxlY3Rpb24oY29sbGVjdGlvbik7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHJldHVybiBjb2xsZWN0aW9uLmV2ZXJ5KGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHJldHVybiBzZWxmLmhhc0VsZW1lbnRXaXRoSWQoZWxlLmlkKCkpO1xuICAgIH0pO1xuICB9XG59O1xuZWxlc2ZuJGcuYWxsQXJlTmVpZ2hib3VycyA9IGVsZXNmbiRnLmFsbEFyZU5laWdoYm9ycztcbmVsZXNmbiRnLmhhcyA9IGVsZXNmbiRnLmNvbnRhaW5zO1xuZWxlc2ZuJGcuZXF1YWwgPSBlbGVzZm4kZy5lcXVhbHMgPSBlbGVzZm4kZy5zYW1lO1xuXG52YXIgY2FjaGUgPSBmdW5jdGlvbiBjYWNoZShmbiwgbmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24gdHJhdmVyc2FsQ2FjaGUoYXJnMSwgYXJnMiwgYXJnMywgYXJnNCkge1xuICAgIHZhciBzZWxlY3Rvck9yRWxlcyA9IGFyZzE7XG4gICAgdmFyIGVsZXMgPSB0aGlzO1xuICAgIHZhciBrZXk7XG4gICAgaWYgKHNlbGVjdG9yT3JFbGVzID09IG51bGwpIHtcbiAgICAgIGtleSA9ICcnO1xuICAgIH0gZWxzZSBpZiAoZWxlbWVudE9yQ29sbGVjdGlvbihzZWxlY3Rvck9yRWxlcykgJiYgc2VsZWN0b3JPckVsZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICBrZXkgPSBzZWxlY3Rvck9yRWxlcy5pZCgpO1xuICAgIH1cbiAgICBpZiAoZWxlcy5sZW5ndGggPT09IDEgJiYga2V5KSB7XG4gICAgICB2YXIgX3AgPSBlbGVzWzBdLl9wcml2YXRlO1xuICAgICAgdmFyIHRjaCA9IF9wLnRyYXZlcnNhbENhY2hlID0gX3AudHJhdmVyc2FsQ2FjaGUgfHwge307XG4gICAgICB2YXIgY2ggPSB0Y2hbbmFtZV0gPSB0Y2hbbmFtZV0gfHwgW107XG4gICAgICB2YXIgaGFzaCA9IGhhc2hTdHJpbmcoa2V5KTtcbiAgICAgIHZhciBjYWNoZUhpdCA9IGNoW2hhc2hdO1xuICAgICAgaWYgKGNhY2hlSGl0KSB7XG4gICAgICAgIHJldHVybiBjYWNoZUhpdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBjaFtoYXNoXSA9IGZuLmNhbGwoZWxlcywgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKGVsZXMsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQpO1xuICAgIH1cbiAgfTtcbn07XG5cbnZhciBlbGVzZm4kZiA9IHtcbiAgcGFyZW50OiBmdW5jdGlvbiBwYXJlbnQoc2VsZWN0b3IpIHtcbiAgICB2YXIgcGFyZW50cyA9IFtdO1xuXG4gICAgLy8gb3B0aW1pc2F0aW9uIGZvciBzaW5nbGUgZWxlIGNhbGxcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHZhciBwYXJlbnQgPSB0aGlzWzBdLl9wcml2YXRlLnBhcmVudDtcbiAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgcmV0dXJuIHBhcmVudDtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICAgIHZhciBfcGFyZW50ID0gZWxlLl9wcml2YXRlLnBhcmVudDtcbiAgICAgIGlmIChfcGFyZW50KSB7XG4gICAgICAgIHBhcmVudHMucHVzaChfcGFyZW50KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3Bhd24ocGFyZW50cywgdHJ1ZSkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfSxcbiAgcGFyZW50czogZnVuY3Rpb24gcGFyZW50cyhzZWxlY3Rvcikge1xuICAgIHZhciBwYXJlbnRzID0gW107XG4gICAgdmFyIGVsZXMgPSB0aGlzLnBhcmVudCgpO1xuICAgIHdoaWxlIChlbGVzLm5vbmVtcHR5KCkpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICAgICAgcGFyZW50cy5wdXNoKGVsZSk7XG4gICAgICB9XG4gICAgICBlbGVzID0gZWxlcy5wYXJlbnQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3Bhd24ocGFyZW50cywgdHJ1ZSkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfSxcbiAgY29tbW9uQW5jZXN0b3JzOiBmdW5jdGlvbiBjb21tb25BbmNlc3RvcnMoc2VsZWN0b3IpIHtcbiAgICB2YXIgYW5jZXN0b3JzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IHRoaXNbaV07XG4gICAgICB2YXIgcGFyZW50cyA9IGVsZS5wYXJlbnRzKCk7XG4gICAgICBhbmNlc3RvcnMgPSBhbmNlc3RvcnMgfHwgcGFyZW50cztcbiAgICAgIGFuY2VzdG9ycyA9IGFuY2VzdG9ycy5pbnRlcnNlY3QocGFyZW50cyk7IC8vIGN1cnJlbnQgbGlzdCBtdXN0IGJlIGNvbW1vbiB3aXRoIGN1cnJlbnQgZWxlIHBhcmVudHMgc2V0XG4gICAgfVxuICAgIHJldHVybiBhbmNlc3RvcnMuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfSxcbiAgb3JwaGFuczogZnVuY3Rpb24gb3JwaGFucyhzZWxlY3Rvcikge1xuICAgIHJldHVybiB0aGlzLnN0ZEZpbHRlcihmdW5jdGlvbiAoZWxlKSB7XG4gICAgICByZXR1cm4gZWxlLmlzT3JwaGFuKCk7XG4gICAgfSkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfSxcbiAgbm9ub3JwaGFuczogZnVuY3Rpb24gbm9ub3JwaGFucyhzZWxlY3Rvcikge1xuICAgIHJldHVybiB0aGlzLnN0ZEZpbHRlcihmdW5jdGlvbiAoZWxlKSB7XG4gICAgICByZXR1cm4gZWxlLmlzQ2hpbGQoKTtcbiAgICB9KS5maWx0ZXIoc2VsZWN0b3IpO1xuICB9LFxuICBjaGlsZHJlbjogY2FjaGUoZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICAgIHZhciBlbGVDaGlsZHJlbiA9IGVsZS5fcHJpdmF0ZS5jaGlsZHJlbjtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZWxlQ2hpbGRyZW4ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgY2hpbGRyZW4ucHVzaChlbGVDaGlsZHJlbltqXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNwYXduKGNoaWxkcmVuLCB0cnVlKS5maWx0ZXIoc2VsZWN0b3IpO1xuICB9LCAnY2hpbGRyZW4nKSxcbiAgc2libGluZ3M6IGZ1bmN0aW9uIHNpYmxpbmdzKHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50KCkuY2hpbGRyZW4oKS5ub3QodGhpcykuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfSxcbiAgaXNQYXJlbnQ6IGZ1bmN0aW9uIGlzUGFyZW50KCkge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIGlmIChlbGUpIHtcbiAgICAgIHJldHVybiBlbGUuaXNOb2RlKCkgJiYgZWxlLl9wcml2YXRlLmNoaWxkcmVuLmxlbmd0aCAhPT0gMDtcbiAgICB9XG4gIH0sXG4gIGlzQ2hpbGRsZXNzOiBmdW5jdGlvbiBpc0NoaWxkbGVzcygpIHtcbiAgICB2YXIgZWxlID0gdGhpc1swXTtcbiAgICBpZiAoZWxlKSB7XG4gICAgICByZXR1cm4gZWxlLmlzTm9kZSgpICYmIGVsZS5fcHJpdmF0ZS5jaGlsZHJlbi5sZW5ndGggPT09IDA7XG4gICAgfVxuICB9LFxuICBpc0NoaWxkOiBmdW5jdGlvbiBpc0NoaWxkKCkge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIGlmIChlbGUpIHtcbiAgICAgIHJldHVybiBlbGUuaXNOb2RlKCkgJiYgZWxlLl9wcml2YXRlLnBhcmVudCAhPSBudWxsO1xuICAgIH1cbiAgfSxcbiAgaXNPcnBoYW46IGZ1bmN0aW9uIGlzT3JwaGFuKCkge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIGlmIChlbGUpIHtcbiAgICAgIHJldHVybiBlbGUuaXNOb2RlKCkgJiYgZWxlLl9wcml2YXRlLnBhcmVudCA9PSBudWxsO1xuICAgIH1cbiAgfSxcbiAgZGVzY2VuZGFudHM6IGZ1bmN0aW9uIGRlc2NlbmRhbnRzKHNlbGVjdG9yKSB7XG4gICAgdmFyIGVsZW1lbnRzID0gW107XG4gICAgZnVuY3Rpb24gYWRkKGVsZXMpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICAgICAgZWxlbWVudHMucHVzaChlbGUpO1xuICAgICAgICBpZiAoZWxlLmNoaWxkcmVuKCkubm9uZW1wdHkoKSkge1xuICAgICAgICAgIGFkZChlbGUuY2hpbGRyZW4oKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgYWRkKHRoaXMuY2hpbGRyZW4oKSk7XG4gICAgcmV0dXJuIHRoaXMuc3Bhd24oZWxlbWVudHMsIHRydWUpLmZpbHRlcihzZWxlY3Rvcik7XG4gIH1cbn07XG5mdW5jdGlvbiBmb3JFYWNoQ29tcG91bmQoZWxlcywgZm4sIGluY2x1ZGVTZWxmLCByZWN1cnNpdmVTdGVwKSB7XG4gIHZhciBxID0gW107XG4gIHZhciBkaWQgPSBuZXcgU2V0JDEoKTtcbiAgdmFyIGN5ID0gZWxlcy5jeSgpO1xuICB2YXIgaGFzQ29tcG91bmRzID0gY3kuaGFzQ29tcG91bmROb2RlcygpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICBpZiAoaW5jbHVkZVNlbGYpIHtcbiAgICAgIHEucHVzaChlbGUpO1xuICAgIH0gZWxzZSBpZiAoaGFzQ29tcG91bmRzKSB7XG4gICAgICByZWN1cnNpdmVTdGVwKHEsIGRpZCwgZWxlKTtcbiAgICB9XG4gIH1cbiAgd2hpbGUgKHEubGVuZ3RoID4gMCkge1xuICAgIHZhciBfZWxlID0gcS5zaGlmdCgpO1xuICAgIGZuKF9lbGUpO1xuICAgIGRpZC5hZGQoX2VsZS5pZCgpKTtcbiAgICBpZiAoaGFzQ29tcG91bmRzKSB7XG4gICAgICByZWN1cnNpdmVTdGVwKHEsIGRpZCwgX2VsZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBlbGVzO1xufVxuZnVuY3Rpb24gYWRkQ2hpbGRyZW4ocSwgZGlkLCBlbGUpIHtcbiAgaWYgKGVsZS5pc1BhcmVudCgpKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gZWxlLl9wcml2YXRlLmNoaWxkcmVuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgICAgaWYgKCFkaWQuaGFzKGNoaWxkLmlkKCkpKSB7XG4gICAgICAgIHEucHVzaChjaGlsZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8vIHZlcnkgZWZmaWNpZW50IHZlcnNpb24gb2YgZWxlcy5hZGQoIGVsZXMuZGVzY2VuZGFudHMoKSApLmZvckVhY2goKVxuLy8gZm9yIGludGVybmFsIHVzZVxuZWxlc2ZuJGYuZm9yRWFjaERvd24gPSBmdW5jdGlvbiAoZm4pIHtcbiAgdmFyIGluY2x1ZGVTZWxmID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB0cnVlO1xuICByZXR1cm4gZm9yRWFjaENvbXBvdW5kKHRoaXMsIGZuLCBpbmNsdWRlU2VsZiwgYWRkQ2hpbGRyZW4pO1xufTtcbmZ1bmN0aW9uIGFkZFBhcmVudChxLCBkaWQsIGVsZSkge1xuICBpZiAoZWxlLmlzQ2hpbGQoKSkge1xuICAgIHZhciBwYXJlbnQgPSBlbGUuX3ByaXZhdGUucGFyZW50O1xuICAgIGlmICghZGlkLmhhcyhwYXJlbnQuaWQoKSkpIHtcbiAgICAgIHEucHVzaChwYXJlbnQpO1xuICAgIH1cbiAgfVxufVxuZWxlc2ZuJGYuZm9yRWFjaFVwID0gZnVuY3Rpb24gKGZuKSB7XG4gIHZhciBpbmNsdWRlU2VsZiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdHJ1ZTtcbiAgcmV0dXJuIGZvckVhY2hDb21wb3VuZCh0aGlzLCBmbiwgaW5jbHVkZVNlbGYsIGFkZFBhcmVudCk7XG59O1xuZnVuY3Rpb24gYWRkUGFyZW50QW5kQ2hpbGRyZW4ocSwgZGlkLCBlbGUpIHtcbiAgYWRkUGFyZW50KHEsIGRpZCwgZWxlKTtcbiAgYWRkQ2hpbGRyZW4ocSwgZGlkLCBlbGUpO1xufVxuZWxlc2ZuJGYuZm9yRWFjaFVwQW5kRG93biA9IGZ1bmN0aW9uIChmbikge1xuICB2YXIgaW5jbHVkZVNlbGYgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHRydWU7XG4gIHJldHVybiBmb3JFYWNoQ29tcG91bmQodGhpcywgZm4sIGluY2x1ZGVTZWxmLCBhZGRQYXJlbnRBbmRDaGlsZHJlbik7XG59O1xuXG4vLyBhbGlhc2VzXG5lbGVzZm4kZi5hbmNlc3RvcnMgPSBlbGVzZm4kZi5wYXJlbnRzO1xuXG52YXIgZm4kNSwgZWxlc2ZuJGU7XG5mbiQ1ID0gZWxlc2ZuJGUgPSB7XG4gIGRhdGE6IGRlZmluZS5kYXRhKHtcbiAgICBmaWVsZDogJ2RhdGEnLFxuICAgIGJpbmRpbmdFdmVudDogJ2RhdGEnLFxuICAgIGFsbG93QmluZGluZzogdHJ1ZSxcbiAgICBhbGxvd1NldHRpbmc6IHRydWUsXG4gICAgc2V0dGluZ0V2ZW50OiAnZGF0YScsXG4gICAgc2V0dGluZ1RyaWdnZXJzRXZlbnQ6IHRydWUsXG4gICAgdHJpZ2dlckZuTmFtZTogJ3RyaWdnZXInLFxuICAgIGFsbG93R2V0dGluZzogdHJ1ZSxcbiAgICBpbW11dGFibGVLZXlzOiB7XG4gICAgICAnaWQnOiB0cnVlLFxuICAgICAgJ3NvdXJjZSc6IHRydWUsXG4gICAgICAndGFyZ2V0JzogdHJ1ZSxcbiAgICAgICdwYXJlbnQnOiB0cnVlXG4gICAgfSxcbiAgICB1cGRhdGVTdHlsZTogdHJ1ZVxuICB9KSxcbiAgcmVtb3ZlRGF0YTogZGVmaW5lLnJlbW92ZURhdGEoe1xuICAgIGZpZWxkOiAnZGF0YScsXG4gICAgZXZlbnQ6ICdkYXRhJyxcbiAgICB0cmlnZ2VyRm5OYW1lOiAndHJpZ2dlcicsXG4gICAgdHJpZ2dlckV2ZW50OiB0cnVlLFxuICAgIGltbXV0YWJsZUtleXM6IHtcbiAgICAgICdpZCc6IHRydWUsXG4gICAgICAnc291cmNlJzogdHJ1ZSxcbiAgICAgICd0YXJnZXQnOiB0cnVlLFxuICAgICAgJ3BhcmVudCc6IHRydWVcbiAgICB9LFxuICAgIHVwZGF0ZVN0eWxlOiB0cnVlXG4gIH0pLFxuICBzY3JhdGNoOiBkZWZpbmUuZGF0YSh7XG4gICAgZmllbGQ6ICdzY3JhdGNoJyxcbiAgICBiaW5kaW5nRXZlbnQ6ICdzY3JhdGNoJyxcbiAgICBhbGxvd0JpbmRpbmc6IHRydWUsXG4gICAgYWxsb3dTZXR0aW5nOiB0cnVlLFxuICAgIHNldHRpbmdFdmVudDogJ3NjcmF0Y2gnLFxuICAgIHNldHRpbmdUcmlnZ2Vyc0V2ZW50OiB0cnVlLFxuICAgIHRyaWdnZXJGbk5hbWU6ICd0cmlnZ2VyJyxcbiAgICBhbGxvd0dldHRpbmc6IHRydWUsXG4gICAgdXBkYXRlU3R5bGU6IHRydWVcbiAgfSksXG4gIHJlbW92ZVNjcmF0Y2g6IGRlZmluZS5yZW1vdmVEYXRhKHtcbiAgICBmaWVsZDogJ3NjcmF0Y2gnLFxuICAgIGV2ZW50OiAnc2NyYXRjaCcsXG4gICAgdHJpZ2dlckZuTmFtZTogJ3RyaWdnZXInLFxuICAgIHRyaWdnZXJFdmVudDogdHJ1ZSxcbiAgICB1cGRhdGVTdHlsZTogdHJ1ZVxuICB9KSxcbiAgcnNjcmF0Y2g6IGRlZmluZS5kYXRhKHtcbiAgICBmaWVsZDogJ3JzY3JhdGNoJyxcbiAgICBhbGxvd0JpbmRpbmc6IGZhbHNlLFxuICAgIGFsbG93U2V0dGluZzogdHJ1ZSxcbiAgICBzZXR0aW5nVHJpZ2dlcnNFdmVudDogZmFsc2UsXG4gICAgYWxsb3dHZXR0aW5nOiB0cnVlXG4gIH0pLFxuICByZW1vdmVSc2NyYXRjaDogZGVmaW5lLnJlbW92ZURhdGEoe1xuICAgIGZpZWxkOiAncnNjcmF0Y2gnLFxuICAgIHRyaWdnZXJFdmVudDogZmFsc2VcbiAgfSksXG4gIGlkOiBmdW5jdGlvbiBpZCgpIHtcbiAgICB2YXIgZWxlID0gdGhpc1swXTtcbiAgICBpZiAoZWxlKSB7XG4gICAgICByZXR1cm4gZWxlLl9wcml2YXRlLmRhdGEuaWQ7XG4gICAgfVxuICB9XG59O1xuXG4vLyBhbGlhc2VzXG5mbiQ1LmF0dHIgPSBmbiQ1LmRhdGE7XG5mbiQ1LnJlbW92ZUF0dHIgPSBmbiQ1LnJlbW92ZURhdGE7XG52YXIgZGF0YSA9IGVsZXNmbiRlO1xuXG52YXIgZWxlc2ZuJGQgPSB7fTtcbmZ1bmN0aW9uIGRlZmluZURlZ3JlZUZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoaW5jbHVkZUxvb3BzKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmIChpbmNsdWRlTG9vcHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaW5jbHVkZUxvb3BzID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHNlbGYubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzZWxmLmlzTm9kZSgpICYmICFzZWxmLnJlbW92ZWQoKSkge1xuICAgICAgdmFyIGRlZ3JlZSA9IDA7XG4gICAgICB2YXIgbm9kZSA9IHNlbGZbMF07XG4gICAgICB2YXIgY29ubmVjdGVkRWRnZXMgPSBub2RlLl9wcml2YXRlLmVkZ2VzO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25uZWN0ZWRFZGdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWRnZSA9IGNvbm5lY3RlZEVkZ2VzW2ldO1xuICAgICAgICBpZiAoIWluY2x1ZGVMb29wcyAmJiBlZGdlLmlzTG9vcCgpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgZGVncmVlICs9IGNhbGxiYWNrKG5vZGUsIGVkZ2UpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRlZ3JlZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfTtcbn1cbmV4dGVuZChlbGVzZm4kZCwge1xuICBkZWdyZWU6IGRlZmluZURlZ3JlZUZ1bmN0aW9uKGZ1bmN0aW9uIChub2RlLCBlZGdlKSB7XG4gICAgaWYgKGVkZ2Uuc291cmNlKCkuc2FtZShlZGdlLnRhcmdldCgpKSkge1xuICAgICAgcmV0dXJuIDI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgfSksXG4gIGluZGVncmVlOiBkZWZpbmVEZWdyZWVGdW5jdGlvbihmdW5jdGlvbiAobm9kZSwgZWRnZSkge1xuICAgIGlmIChlZGdlLnRhcmdldCgpLnNhbWUobm9kZSkpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gIH0pLFxuICBvdXRkZWdyZWU6IGRlZmluZURlZ3JlZUZ1bmN0aW9uKGZ1bmN0aW9uIChub2RlLCBlZGdlKSB7XG4gICAgaWYgKGVkZ2Uuc291cmNlKCkuc2FtZShub2RlKSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgfSlcbn0pO1xuZnVuY3Rpb24gZGVmaW5lRGVncmVlQm91bmRzRnVuY3Rpb24oZGVncmVlRm4sIGNhbGxiYWNrKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoaW5jbHVkZUxvb3BzKSB7XG4gICAgdmFyIHJldDtcbiAgICB2YXIgbm9kZXMgPSB0aGlzLm5vZGVzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IG5vZGVzW2ldO1xuICAgICAgdmFyIGRlZ3JlZSA9IGVsZVtkZWdyZWVGbl0oaW5jbHVkZUxvb3BzKTtcbiAgICAgIGlmIChkZWdyZWUgIT09IHVuZGVmaW5lZCAmJiAocmV0ID09PSB1bmRlZmluZWQgfHwgY2FsbGJhY2soZGVncmVlLCByZXQpKSkge1xuICAgICAgICByZXQgPSBkZWdyZWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH07XG59XG5leHRlbmQoZWxlc2ZuJGQsIHtcbiAgbWluRGVncmVlOiBkZWZpbmVEZWdyZWVCb3VuZHNGdW5jdGlvbignZGVncmVlJywgZnVuY3Rpb24gKGRlZ3JlZSwgbWluKSB7XG4gICAgcmV0dXJuIGRlZ3JlZSA8IG1pbjtcbiAgfSksXG4gIG1heERlZ3JlZTogZGVmaW5lRGVncmVlQm91bmRzRnVuY3Rpb24oJ2RlZ3JlZScsIGZ1bmN0aW9uIChkZWdyZWUsIG1heCkge1xuICAgIHJldHVybiBkZWdyZWUgPiBtYXg7XG4gIH0pLFxuICBtaW5JbmRlZ3JlZTogZGVmaW5lRGVncmVlQm91bmRzRnVuY3Rpb24oJ2luZGVncmVlJywgZnVuY3Rpb24gKGRlZ3JlZSwgbWluKSB7XG4gICAgcmV0dXJuIGRlZ3JlZSA8IG1pbjtcbiAgfSksXG4gIG1heEluZGVncmVlOiBkZWZpbmVEZWdyZWVCb3VuZHNGdW5jdGlvbignaW5kZWdyZWUnLCBmdW5jdGlvbiAoZGVncmVlLCBtYXgpIHtcbiAgICByZXR1cm4gZGVncmVlID4gbWF4O1xuICB9KSxcbiAgbWluT3V0ZGVncmVlOiBkZWZpbmVEZWdyZWVCb3VuZHNGdW5jdGlvbignb3V0ZGVncmVlJywgZnVuY3Rpb24gKGRlZ3JlZSwgbWluKSB7XG4gICAgcmV0dXJuIGRlZ3JlZSA8IG1pbjtcbiAgfSksXG4gIG1heE91dGRlZ3JlZTogZGVmaW5lRGVncmVlQm91bmRzRnVuY3Rpb24oJ291dGRlZ3JlZScsIGZ1bmN0aW9uIChkZWdyZWUsIG1heCkge1xuICAgIHJldHVybiBkZWdyZWUgPiBtYXg7XG4gIH0pXG59KTtcbmV4dGVuZChlbGVzZm4kZCwge1xuICB0b3RhbERlZ3JlZTogZnVuY3Rpb24gdG90YWxEZWdyZWUoaW5jbHVkZUxvb3BzKSB7XG4gICAgdmFyIHRvdGFsID0gMDtcbiAgICB2YXIgbm9kZXMgPSB0aGlzLm5vZGVzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdG90YWwgKz0gbm9kZXNbaV0uZGVncmVlKGluY2x1ZGVMb29wcyk7XG4gICAgfVxuICAgIHJldHVybiB0b3RhbDtcbiAgfVxufSk7XG5cbnZhciBmbiQ0LCBlbGVzZm4kYztcbnZhciBiZWZvcmVQb3NpdGlvblNldCA9IGZ1bmN0aW9uIGJlZm9yZVBvc2l0aW9uU2V0KGVsZXMsIG5ld1Bvcywgc2lsZW50KSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgIGlmICghZWxlLmxvY2tlZCgpKSB7XG4gICAgICB2YXIgb2xkUG9zID0gZWxlLl9wcml2YXRlLnBvc2l0aW9uO1xuICAgICAgdmFyIGRlbHRhID0ge1xuICAgICAgICB4OiBuZXdQb3MueCAhPSBudWxsID8gbmV3UG9zLnggLSBvbGRQb3MueCA6IDAsXG4gICAgICAgIHk6IG5ld1Bvcy55ICE9IG51bGwgPyBuZXdQb3MueSAtIG9sZFBvcy55IDogMFxuICAgICAgfTtcbiAgICAgIGlmIChlbGUuaXNQYXJlbnQoKSAmJiAhKGRlbHRhLnggPT09IDAgJiYgZGVsdGEueSA9PT0gMCkpIHtcbiAgICAgICAgZWxlLmNoaWxkcmVuKCkuc2hpZnQoZGVsdGEsIHNpbGVudCk7XG4gICAgICB9XG4gICAgICBlbGUuZGlydHlCb3VuZGluZ0JveENhY2hlKCk7XG4gICAgfVxuICB9XG59O1xudmFyIHBvc2l0aW9uRGVmID0ge1xuICBmaWVsZDogJ3Bvc2l0aW9uJyxcbiAgYmluZGluZ0V2ZW50OiAncG9zaXRpb24nLFxuICBhbGxvd0JpbmRpbmc6IHRydWUsXG4gIGFsbG93U2V0dGluZzogdHJ1ZSxcbiAgc2V0dGluZ0V2ZW50OiAncG9zaXRpb24nLFxuICBzZXR0aW5nVHJpZ2dlcnNFdmVudDogdHJ1ZSxcbiAgdHJpZ2dlckZuTmFtZTogJ2VtaXRBbmROb3RpZnknLFxuICBhbGxvd0dldHRpbmc6IHRydWUsXG4gIHZhbGlkS2V5czogWyd4JywgJ3knXSxcbiAgYmVmb3JlR2V0OiBmdW5jdGlvbiBiZWZvcmVHZXQoZWxlKSB7XG4gICAgZWxlLnVwZGF0ZUNvbXBvdW5kQm91bmRzKCk7XG4gIH0sXG4gIGJlZm9yZVNldDogZnVuY3Rpb24gYmVmb3JlU2V0KGVsZXMsIG5ld1Bvcykge1xuICAgIGJlZm9yZVBvc2l0aW9uU2V0KGVsZXMsIG5ld1BvcywgZmFsc2UpO1xuICB9LFxuICBvblNldDogZnVuY3Rpb24gb25TZXQoZWxlcykge1xuICAgIGVsZXMuZGlydHlDb21wb3VuZEJvdW5kc0NhY2hlKCk7XG4gIH0sXG4gIGNhblNldDogZnVuY3Rpb24gY2FuU2V0KGVsZSkge1xuICAgIHJldHVybiAhZWxlLmxvY2tlZCgpO1xuICB9XG59O1xuZm4kNCA9IGVsZXNmbiRjID0ge1xuICBwb3NpdGlvbjogZGVmaW5lLmRhdGEocG9zaXRpb25EZWYpLFxuICAvLyBwb3NpdGlvbiBidXQgbm8gbm90aWZpY2F0aW9uIHRvIHJlbmRlcmVyXG4gIHNpbGVudFBvc2l0aW9uOiBkZWZpbmUuZGF0YShleHRlbmQoe30sIHBvc2l0aW9uRGVmLCB7XG4gICAgYWxsb3dCaW5kaW5nOiBmYWxzZSxcbiAgICBhbGxvd1NldHRpbmc6IHRydWUsXG4gICAgc2V0dGluZ1RyaWdnZXJzRXZlbnQ6IGZhbHNlLFxuICAgIGFsbG93R2V0dGluZzogZmFsc2UsXG4gICAgYmVmb3JlU2V0OiBmdW5jdGlvbiBiZWZvcmVTZXQoZWxlcywgbmV3UG9zKSB7XG4gICAgICBiZWZvcmVQb3NpdGlvblNldChlbGVzLCBuZXdQb3MsIHRydWUpO1xuICAgIH0sXG4gICAgb25TZXQ6IGZ1bmN0aW9uIG9uU2V0KGVsZXMpIHtcbiAgICAgIGVsZXMuZGlydHlDb21wb3VuZEJvdW5kc0NhY2hlKCk7XG4gICAgfVxuICB9KSksXG4gIHBvc2l0aW9uczogZnVuY3Rpb24gcG9zaXRpb25zKHBvcywgc2lsZW50KSB7XG4gICAgaWYgKHBsYWluT2JqZWN0KHBvcykpIHtcbiAgICAgIGlmIChzaWxlbnQpIHtcbiAgICAgICAgdGhpcy5zaWxlbnRQb3NpdGlvbihwb3MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wb3NpdGlvbihwb3MpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZm4kNihwb3MpKSB7XG4gICAgICB2YXIgX2ZuID0gcG9zO1xuICAgICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgICAgY3kuc3RhcnRCYXRjaCgpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBlbGUgPSB0aGlzW2ldO1xuICAgICAgICB2YXIgX3BvcyA9IHZvaWQgMDtcbiAgICAgICAgaWYgKF9wb3MgPSBfZm4oZWxlLCBpKSkge1xuICAgICAgICAgIGlmIChzaWxlbnQpIHtcbiAgICAgICAgICAgIGVsZS5zaWxlbnRQb3NpdGlvbihfcG9zKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZWxlLnBvc2l0aW9uKF9wb3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY3kuZW5kQmF0Y2goKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG4gIHNpbGVudFBvc2l0aW9uczogZnVuY3Rpb24gc2lsZW50UG9zaXRpb25zKHBvcykge1xuICAgIHJldHVybiB0aGlzLnBvc2l0aW9ucyhwb3MsIHRydWUpO1xuICB9LFxuICBzaGlmdDogZnVuY3Rpb24gc2hpZnQoZGltLCB2YWwsIHNpbGVudCkge1xuICAgIHZhciBkZWx0YTtcbiAgICBpZiAocGxhaW5PYmplY3QoZGltKSkge1xuICAgICAgZGVsdGEgPSB7XG4gICAgICAgIHg6IG51bWJlciQxKGRpbS54KSA/IGRpbS54IDogMCxcbiAgICAgICAgeTogbnVtYmVyJDEoZGltLnkpID8gZGltLnkgOiAwXG4gICAgICB9O1xuICAgICAgc2lsZW50ID0gdmFsO1xuICAgIH0gZWxzZSBpZiAoc3RyaW5nKGRpbSkgJiYgbnVtYmVyJDEodmFsKSkge1xuICAgICAgZGVsdGEgPSB7XG4gICAgICAgIHg6IDAsXG4gICAgICAgIHk6IDBcbiAgICAgIH07XG4gICAgICBkZWx0YVtkaW1dID0gdmFsO1xuICAgIH1cbiAgICBpZiAoZGVsdGEgIT0gbnVsbCkge1xuICAgICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgICAgY3kuc3RhcnRCYXRjaCgpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBlbGUgPSB0aGlzW2ldO1xuXG4gICAgICAgIC8vIGV4Y2x1ZGUgYW55IG5vZGUgdGhhdCBpcyBhIGRlc2NlbmRhbnQgb2YgdGhlIGNhbGxpbmcgY29sbGVjdGlvblxuICAgICAgICBpZiAoY3kuaGFzQ29tcG91bmROb2RlcygpICYmIGVsZS5pc0NoaWxkKCkgJiYgZWxlLmFuY2VzdG9ycygpLmFueVNhbWUodGhpcykpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcG9zID0gZWxlLnBvc2l0aW9uKCk7XG4gICAgICAgIHZhciBuZXdQb3MgPSB7XG4gICAgICAgICAgeDogcG9zLnggKyBkZWx0YS54LFxuICAgICAgICAgIHk6IHBvcy55ICsgZGVsdGEueVxuICAgICAgICB9O1xuICAgICAgICBpZiAoc2lsZW50KSB7XG4gICAgICAgICAgZWxlLnNpbGVudFBvc2l0aW9uKG5ld1Bvcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZWxlLnBvc2l0aW9uKG5ld1Bvcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGN5LmVuZEJhdGNoKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBzaWxlbnRTaGlmdDogZnVuY3Rpb24gc2lsZW50U2hpZnQoZGltLCB2YWwpIHtcbiAgICBpZiAocGxhaW5PYmplY3QoZGltKSkge1xuICAgICAgdGhpcy5zaGlmdChkaW0sIHRydWUpO1xuICAgIH0gZWxzZSBpZiAoc3RyaW5nKGRpbSkgJiYgbnVtYmVyJDEodmFsKSkge1xuICAgICAgdGhpcy5zaGlmdChkaW0sIHZhbCwgdHJ1ZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICAvLyBnZXQvc2V0IHRoZSByZW5kZXJlZCAoaS5lLiBvbiBzY3JlZW4pIHBvc2l0b24gb2YgdGhlIGVsZW1lbnRcbiAgcmVuZGVyZWRQb3NpdGlvbjogZnVuY3Rpb24gcmVuZGVyZWRQb3NpdGlvbihkaW0sIHZhbCkge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgICB2YXIgem9vbSA9IGN5Lnpvb20oKTtcbiAgICB2YXIgcGFuID0gY3kucGFuKCk7XG4gICAgdmFyIHJwb3MgPSBwbGFpbk9iamVjdChkaW0pID8gZGltIDogdW5kZWZpbmVkO1xuICAgIHZhciBzZXR0aW5nID0gcnBvcyAhPT0gdW5kZWZpbmVkIHx8IHZhbCAhPT0gdW5kZWZpbmVkICYmIHN0cmluZyhkaW0pO1xuICAgIGlmIChlbGUgJiYgZWxlLmlzTm9kZSgpKSB7XG4gICAgICAvLyBtdXN0IGhhdmUgYW4gZWxlbWVudCBhbmQgbXVzdCBiZSBhIG5vZGUgdG8gcmV0dXJuIHBvc2l0aW9uXG4gICAgICBpZiAoc2V0dGluZykge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgX2VsZSA9IHRoaXNbaV07XG4gICAgICAgICAgaWYgKHZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBzZXQgb25lIGRpbWVuc2lvblxuICAgICAgICAgICAgX2VsZS5wb3NpdGlvbihkaW0sICh2YWwgLSBwYW5bZGltXSkgLyB6b29tKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHJwb3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gc2V0IHdob2xlIHBvc2l0aW9uXG4gICAgICAgICAgICBfZWxlLnBvc2l0aW9uKHJlbmRlcmVkVG9Nb2RlbFBvc2l0aW9uKHJwb3MsIHpvb20sIHBhbikpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZ2V0dGluZ1xuICAgICAgICB2YXIgcG9zID0gZWxlLnBvc2l0aW9uKCk7XG4gICAgICAgIHJwb3MgPSBtb2RlbFRvUmVuZGVyZWRQb3NpdGlvbiQxKHBvcywgem9vbSwgcGFuKTtcbiAgICAgICAgaWYgKGRpbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gdGhlbiByZXR1cm4gdGhlIHdob2xlIHJlbmRlcmVkIHBvc2l0aW9uXG4gICAgICAgICAgcmV0dXJuIHJwb3M7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gdGhlbiByZXR1cm4gdGhlIHNwZWNpZmllZCBkaW1lbnNpb25cbiAgICAgICAgICByZXR1cm4gcnBvc1tkaW1dO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghc2V0dGluZykge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDsgLy8gZm9yIGVtcHR5IGNvbGxlY3Rpb24gY2FzZVxuICAgIH1cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcbiAgLy8gZ2V0L3NldCB0aGUgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIHBhcmVudFxuICByZWxhdGl2ZVBvc2l0aW9uOiBmdW5jdGlvbiByZWxhdGl2ZVBvc2l0aW9uKGRpbSwgdmFsKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgIHZhciBwcG9zID0gcGxhaW5PYmplY3QoZGltKSA/IGRpbSA6IHVuZGVmaW5lZDtcbiAgICB2YXIgc2V0dGluZyA9IHBwb3MgIT09IHVuZGVmaW5lZCB8fCB2YWwgIT09IHVuZGVmaW5lZCAmJiBzdHJpbmcoZGltKTtcbiAgICB2YXIgaGFzQ29tcG91bmROb2RlcyA9IGN5Lmhhc0NvbXBvdW5kTm9kZXMoKTtcbiAgICBpZiAoZWxlICYmIGVsZS5pc05vZGUoKSkge1xuICAgICAgLy8gbXVzdCBoYXZlIGFuIGVsZW1lbnQgYW5kIG11c3QgYmUgYSBub2RlIHRvIHJldHVybiBwb3NpdGlvblxuICAgICAgaWYgKHNldHRpbmcpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIF9lbGUyID0gdGhpc1tpXTtcbiAgICAgICAgICB2YXIgcGFyZW50ID0gaGFzQ29tcG91bmROb2RlcyA/IF9lbGUyLnBhcmVudCgpIDogbnVsbDtcbiAgICAgICAgICB2YXIgaGFzUGFyZW50ID0gcGFyZW50ICYmIHBhcmVudC5sZW5ndGggPiAwO1xuICAgICAgICAgIHZhciByZWxhdGl2ZVRvUGFyZW50ID0gaGFzUGFyZW50O1xuICAgICAgICAgIGlmIChoYXNQYXJlbnQpIHtcbiAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudFswXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIG9yaWdpbiA9IHJlbGF0aXZlVG9QYXJlbnQgPyBwYXJlbnQucG9zaXRpb24oKSA6IHtcbiAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICB5OiAwXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAodmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHNldCBvbmUgZGltZW5zaW9uXG4gICAgICAgICAgICBfZWxlMi5wb3NpdGlvbihkaW0sIHZhbCArIG9yaWdpbltkaW1dKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHBwb3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gc2V0IHdob2xlIHBvc2l0aW9uXG4gICAgICAgICAgICBfZWxlMi5wb3NpdGlvbih7XG4gICAgICAgICAgICAgIHg6IHBwb3MueCArIG9yaWdpbi54LFxuICAgICAgICAgICAgICB5OiBwcG9zLnkgKyBvcmlnaW4ueVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBnZXR0aW5nXG4gICAgICAgIHZhciBwb3MgPSBlbGUucG9zaXRpb24oKTtcbiAgICAgICAgdmFyIF9wYXJlbnQgPSBoYXNDb21wb3VuZE5vZGVzID8gZWxlLnBhcmVudCgpIDogbnVsbDtcbiAgICAgICAgdmFyIF9oYXNQYXJlbnQgPSBfcGFyZW50ICYmIF9wYXJlbnQubGVuZ3RoID4gMDtcbiAgICAgICAgdmFyIF9yZWxhdGl2ZVRvUGFyZW50ID0gX2hhc1BhcmVudDtcbiAgICAgICAgaWYgKF9oYXNQYXJlbnQpIHtcbiAgICAgICAgICBfcGFyZW50ID0gX3BhcmVudFswXTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgX29yaWdpbiA9IF9yZWxhdGl2ZVRvUGFyZW50ID8gX3BhcmVudC5wb3NpdGlvbigpIDoge1xuICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgeTogMFxuICAgICAgICB9O1xuICAgICAgICBwcG9zID0ge1xuICAgICAgICAgIHg6IHBvcy54IC0gX29yaWdpbi54LFxuICAgICAgICAgIHk6IHBvcy55IC0gX29yaWdpbi55XG4gICAgICAgIH07XG4gICAgICAgIGlmIChkaW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIHRoZW4gcmV0dXJuIHRoZSB3aG9sZSByZW5kZXJlZCBwb3NpdGlvblxuICAgICAgICAgIHJldHVybiBwcG9zO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHRoZW4gcmV0dXJuIHRoZSBzcGVjaWZpZWQgZGltZW5zaW9uXG4gICAgICAgICAgcmV0dXJuIHBwb3NbZGltXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIXNldHRpbmcpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7IC8vIGZvciBlbXB0eSBjb2xsZWN0aW9uIGNhc2VcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH1cbn07XG5cbi8vIGFsaWFzZXNcbmZuJDQubW9kZWxQb3NpdGlvbiA9IGZuJDQucG9pbnQgPSBmbiQ0LnBvc2l0aW9uO1xuZm4kNC5tb2RlbFBvc2l0aW9ucyA9IGZuJDQucG9pbnRzID0gZm4kNC5wb3NpdGlvbnM7XG5mbiQ0LnJlbmRlcmVkUG9pbnQgPSBmbiQ0LnJlbmRlcmVkUG9zaXRpb247XG5mbiQ0LnJlbGF0aXZlUG9pbnQgPSBmbiQ0LnJlbGF0aXZlUG9zaXRpb247XG52YXIgcG9zaXRpb24gPSBlbGVzZm4kYztcblxudmFyIGxhYmVsSGFsaWduID0gZnVuY3Rpb24gbGFiZWxIYWxpZ24oaGFsaWduKSB7XG4gIHN3aXRjaCAoaGFsaWduKSB7XG4gICAgY2FzZSAnbGVmdCc6XG4gICAgY2FzZSAncmlnaHQtaW5zaWRlJzpcbiAgICAgIHJldHVybiAnbGVmdCc7XG4gICAgY2FzZSAncmlnaHQnOlxuICAgIGNhc2UgJ2xlZnQtaW5zaWRlJzpcbiAgICAgIHJldHVybiAncmlnaHQnO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gJ2NlbnRlcic7XG4gIH1cbn07XG52YXIgbGFiZWxWYWxpZ24gPSBmdW5jdGlvbiBsYWJlbFZhbGlnbih2YWxpZ24pIHtcbiAgc3dpdGNoICh2YWxpZ24pIHtcbiAgICBjYXNlICd0b3AnOlxuICAgIGNhc2UgJ2JvdHRvbS1pbnNpZGUnOlxuICAgICAgcmV0dXJuICd0b3AnO1xuICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgY2FzZSAndG9wLWluc2lkZSc6XG4gICAgICByZXR1cm4gJ2JvdHRvbSc7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAnY2VudGVyJztcbiAgfVxufTtcbnZhciBsYWJlbEp1c3RpZmljYXRpb24gPSBmdW5jdGlvbiBsYWJlbEp1c3RpZmljYXRpb24oaGFsaWduKSB7XG4gIHN3aXRjaCAoaGFsaWduKSB7XG4gICAgY2FzZSAnbGVmdCc6XG4gICAgICByZXR1cm4gJ3JpZ2h0JztcbiAgICBjYXNlICdyaWdodCc6XG4gICAgICByZXR1cm4gJ2xlZnQnO1xuICAgIGNhc2UgJ2xlZnQtaW5zaWRlJzpcbiAgICAgIHJldHVybiAnbGVmdCc7XG4gICAgY2FzZSAncmlnaHQtaW5zaWRlJzpcbiAgICAgIHJldHVybiAncmlnaHQnO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gJ2NlbnRlcic7XG4gIH1cbn07XG5cbnZhciBmbiQzLCBlbGVzZm4kYjtcbmZuJDMgPSBlbGVzZm4kYiA9IHt9O1xuZWxlc2ZuJGIucmVuZGVyZWRCb3VuZGluZ0JveCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIHZhciBiYiA9IHRoaXMuYm91bmRpbmdCb3gob3B0aW9ucyk7XG4gIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgdmFyIHpvb20gPSBjeS56b29tKCk7XG4gIHZhciBwYW4gPSBjeS5wYW4oKTtcbiAgdmFyIHgxID0gYmIueDEgKiB6b29tICsgcGFuLng7XG4gIHZhciB4MiA9IGJiLngyICogem9vbSArIHBhbi54O1xuICB2YXIgeTEgPSBiYi55MSAqIHpvb20gKyBwYW4ueTtcbiAgdmFyIHkyID0gYmIueTIgKiB6b29tICsgcGFuLnk7XG4gIHJldHVybiB7XG4gICAgeDE6IHgxLFxuICAgIHgyOiB4MixcbiAgICB5MTogeTEsXG4gICAgeTI6IHkyLFxuICAgIHc6IHgyIC0geDEsXG4gICAgaDogeTIgLSB5MVxuICB9O1xufTtcbmVsZXNmbiRiLmRpcnR5Q29tcG91bmRCb3VuZHNDYWNoZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHNpbGVudCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZmFsc2U7XG4gIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgaWYgKCFjeS5zdHlsZUVuYWJsZWQoKSB8fCAhY3kuaGFzQ29tcG91bmROb2RlcygpKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgdGhpcy5mb3JFYWNoVXAoZnVuY3Rpb24gKGVsZSkge1xuICAgIGlmIChlbGUuaXNQYXJlbnQoKSkge1xuICAgICAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICAgICAgX3AuY29tcG91bmRCb3VuZHNDbGVhbiA9IGZhbHNlO1xuICAgICAgX3AuYmJDYWNoZSA9IG51bGw7XG4gICAgICBpZiAoIXNpbGVudCkge1xuICAgICAgICBlbGUuZW1pdEFuZE5vdGlmeSgnYm91bmRzJyk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuZWxlc2ZuJGIudXBkYXRlQ29tcG91bmRCb3VuZHMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBmb3JjZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZmFsc2U7XG4gIHZhciBjeSA9IHRoaXMuY3koKTtcblxuICAvLyBub3QgcG9zc2libGUgdG8gZG8gb24gbm9uLWNvbXBvdW5kIGdyYXBocyBvciB3aXRoIHRoZSBzdHlsZSBkaXNhYmxlZFxuICBpZiAoIWN5LnN0eWxlRW5hYmxlZCgpIHx8ICFjeS5oYXNDb21wb3VuZE5vZGVzKCkpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHNhdmUgY3ljbGVzIHdoZW4gYmF0Y2hpbmcgLS0gYnV0IGJvdW5kcyB3aWxsIGJlIHN0YWxlIChvciBub3QgZXhpc3QgeWV0KVxuICBpZiAoIWZvcmNlICYmIGN5LmJhdGNoaW5nKCkpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBmdW5jdGlvbiB1cGRhdGUocGFyZW50KSB7XG4gICAgaWYgKCFwYXJlbnQuaXNQYXJlbnQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgX3AgPSBwYXJlbnQuX3ByaXZhdGU7XG4gICAgdmFyIGNoaWxkcmVuID0gcGFyZW50LmNoaWxkcmVuKCk7XG4gICAgdmFyIGluY2x1ZGVMYWJlbHMgPSBwYXJlbnQucHN0eWxlKCdjb21wb3VuZC1zaXppbmctd3J0LWxhYmVscycpLnZhbHVlID09PSAnaW5jbHVkZSc7XG4gICAgdmFyIG1pbiA9IHtcbiAgICAgIHdpZHRoOiB7XG4gICAgICAgIHZhbDogcGFyZW50LnBzdHlsZSgnbWluLXdpZHRoJykucGZWYWx1ZSxcbiAgICAgICAgbGVmdDogcGFyZW50LnBzdHlsZSgnbWluLXdpZHRoLWJpYXMtbGVmdCcpLFxuICAgICAgICByaWdodDogcGFyZW50LnBzdHlsZSgnbWluLXdpZHRoLWJpYXMtcmlnaHQnKVxuICAgICAgfSxcbiAgICAgIGhlaWdodDoge1xuICAgICAgICB2YWw6IHBhcmVudC5wc3R5bGUoJ21pbi1oZWlnaHQnKS5wZlZhbHVlLFxuICAgICAgICB0b3A6IHBhcmVudC5wc3R5bGUoJ21pbi1oZWlnaHQtYmlhcy10b3AnKSxcbiAgICAgICAgYm90dG9tOiBwYXJlbnQucHN0eWxlKCdtaW4taGVpZ2h0LWJpYXMtYm90dG9tJylcbiAgICAgIH1cbiAgICB9O1xuICAgIHZhciBiYiA9IGNoaWxkcmVuLmJvdW5kaW5nQm94KHtcbiAgICAgIGluY2x1ZGVMYWJlbHM6IGluY2x1ZGVMYWJlbHMsXG4gICAgICBpbmNsdWRlT3ZlcmxheXM6IGZhbHNlLFxuICAgICAgLy8gdXBkYXRpbmcgdGhlIGNvbXBvdW5kIGJvdW5kcyBoYXBwZW5zIG91dHNpZGUgb2YgdGhlIHJlZ3VsYXJcbiAgICAgIC8vIGNhY2hlIGN5Y2xlIChpLmUuIGJlZm9yZSBmaXJlZCBldmVudHMpXG4gICAgICB1c2VDYWNoZTogZmFsc2VcbiAgICB9KTtcbiAgICB2YXIgcG9zID0gX3AucG9zaXRpb247XG5cbiAgICAvLyBpZiBjaGlsZHJlbiB0YWtlIHVwIHplcm8gYXJlYSB0aGVuIGtlZXAgcG9zaXRpb24gYW5kIGZhbGwgYmFjayBvbiBzdHlsZXNoZWV0IHcvaFxuICAgIGlmIChiYi53ID09PSAwIHx8IGJiLmggPT09IDApIHtcbiAgICAgIGJiID0ge1xuICAgICAgICB3OiBwYXJlbnQucHN0eWxlKCd3aWR0aCcpLnBmVmFsdWUsXG4gICAgICAgIGg6IHBhcmVudC5wc3R5bGUoJ2hlaWdodCcpLnBmVmFsdWVcbiAgICAgIH07XG4gICAgICBiYi54MSA9IHBvcy54IC0gYmIudyAvIDI7XG4gICAgICBiYi54MiA9IHBvcy54ICsgYmIudyAvIDI7XG4gICAgICBiYi55MSA9IHBvcy55IC0gYmIuaCAvIDI7XG4gICAgICBiYi55MiA9IHBvcy55ICsgYmIuaCAvIDI7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXB1dGVCaWFzVmFsdWVzKHByb3BEaWZmLCBwcm9wQmlhcywgcHJvcEJpYXNDb21wbGVtZW50KSB7XG4gICAgICB2YXIgYmlhc0RpZmYgPSAwO1xuICAgICAgdmFyIGJpYXNDb21wbGVtZW50RGlmZiA9IDA7XG4gICAgICB2YXIgYmlhc1RvdGFsID0gcHJvcEJpYXMgKyBwcm9wQmlhc0NvbXBsZW1lbnQ7XG4gICAgICBpZiAocHJvcERpZmYgPiAwICYmIGJpYXNUb3RhbCA+IDApIHtcbiAgICAgICAgYmlhc0RpZmYgPSBwcm9wQmlhcyAvIGJpYXNUb3RhbCAqIHByb3BEaWZmO1xuICAgICAgICBiaWFzQ29tcGxlbWVudERpZmYgPSBwcm9wQmlhc0NvbXBsZW1lbnQgLyBiaWFzVG90YWwgKiBwcm9wRGlmZjtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGJpYXNEaWZmOiBiaWFzRGlmZixcbiAgICAgICAgYmlhc0NvbXBsZW1lbnREaWZmOiBiaWFzQ29tcGxlbWVudERpZmZcbiAgICAgIH07XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXB1dGVQYWRkaW5nVmFsdWVzKHdpZHRoLCBoZWlnaHQsIHBhZGRpbmdPYmplY3QsIHJlbGF0aXZlVG8pIHtcbiAgICAgIC8vIEFzc3VtaW5nIHBlcmNlbnRhZ2UgaXMgbnVtYmVyIGZyb20gMCB0byAxXG4gICAgICBpZiAocGFkZGluZ09iamVjdC51bml0cyA9PT0gJyUnKSB7XG4gICAgICAgIHN3aXRjaCAocmVsYXRpdmVUbykge1xuICAgICAgICAgIGNhc2UgJ3dpZHRoJzpcbiAgICAgICAgICAgIHJldHVybiB3aWR0aCA+IDAgPyBwYWRkaW5nT2JqZWN0LnBmVmFsdWUgKiB3aWR0aCA6IDA7XG4gICAgICAgICAgY2FzZSAnaGVpZ2h0JzpcbiAgICAgICAgICAgIHJldHVybiBoZWlnaHQgPiAwID8gcGFkZGluZ09iamVjdC5wZlZhbHVlICogaGVpZ2h0IDogMDtcbiAgICAgICAgICBjYXNlICdhdmVyYWdlJzpcbiAgICAgICAgICAgIHJldHVybiB3aWR0aCA+IDAgJiYgaGVpZ2h0ID4gMCA/IHBhZGRpbmdPYmplY3QucGZWYWx1ZSAqICh3aWR0aCArIGhlaWdodCkgLyAyIDogMDtcbiAgICAgICAgICBjYXNlICdtaW4nOlxuICAgICAgICAgICAgcmV0dXJuIHdpZHRoID4gMCAmJiBoZWlnaHQgPiAwID8gd2lkdGggPiBoZWlnaHQgPyBwYWRkaW5nT2JqZWN0LnBmVmFsdWUgKiBoZWlnaHQgOiBwYWRkaW5nT2JqZWN0LnBmVmFsdWUgKiB3aWR0aCA6IDA7XG4gICAgICAgICAgY2FzZSAnbWF4JzpcbiAgICAgICAgICAgIHJldHVybiB3aWR0aCA+IDAgJiYgaGVpZ2h0ID4gMCA/IHdpZHRoID4gaGVpZ2h0ID8gcGFkZGluZ09iamVjdC5wZlZhbHVlICogd2lkdGggOiBwYWRkaW5nT2JqZWN0LnBmVmFsdWUgKiBoZWlnaHQgOiAwO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChwYWRkaW5nT2JqZWN0LnVuaXRzID09PSAncHgnKSB7XG4gICAgICAgIHJldHVybiBwYWRkaW5nT2JqZWN0LnBmVmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIGxlZnRWYWwgPSBtaW4ud2lkdGgubGVmdC52YWx1ZTtcbiAgICBpZiAobWluLndpZHRoLmxlZnQudW5pdHMgPT09ICdweCcgJiYgbWluLndpZHRoLnZhbCA+IDApIHtcbiAgICAgIGxlZnRWYWwgPSBsZWZ0VmFsICogMTAwIC8gbWluLndpZHRoLnZhbDtcbiAgICB9XG4gICAgdmFyIHJpZ2h0VmFsID0gbWluLndpZHRoLnJpZ2h0LnZhbHVlO1xuICAgIGlmIChtaW4ud2lkdGgucmlnaHQudW5pdHMgPT09ICdweCcgJiYgbWluLndpZHRoLnZhbCA+IDApIHtcbiAgICAgIHJpZ2h0VmFsID0gcmlnaHRWYWwgKiAxMDAgLyBtaW4ud2lkdGgudmFsO1xuICAgIH1cbiAgICB2YXIgdG9wVmFsID0gbWluLmhlaWdodC50b3AudmFsdWU7XG4gICAgaWYgKG1pbi5oZWlnaHQudG9wLnVuaXRzID09PSAncHgnICYmIG1pbi5oZWlnaHQudmFsID4gMCkge1xuICAgICAgdG9wVmFsID0gdG9wVmFsICogMTAwIC8gbWluLmhlaWdodC52YWw7XG4gICAgfVxuICAgIHZhciBib3R0b21WYWwgPSBtaW4uaGVpZ2h0LmJvdHRvbS52YWx1ZTtcbiAgICBpZiAobWluLmhlaWdodC5ib3R0b20udW5pdHMgPT09ICdweCcgJiYgbWluLmhlaWdodC52YWwgPiAwKSB7XG4gICAgICBib3R0b21WYWwgPSBib3R0b21WYWwgKiAxMDAgLyBtaW4uaGVpZ2h0LnZhbDtcbiAgICB9XG4gICAgdmFyIHdpZHRoQmlhc0RpZmZzID0gY29tcHV0ZUJpYXNWYWx1ZXMobWluLndpZHRoLnZhbCAtIGJiLncsIGxlZnRWYWwsIHJpZ2h0VmFsKTtcbiAgICB2YXIgZGlmZkxlZnQgPSB3aWR0aEJpYXNEaWZmcy5iaWFzRGlmZjtcbiAgICB2YXIgZGlmZlJpZ2h0ID0gd2lkdGhCaWFzRGlmZnMuYmlhc0NvbXBsZW1lbnREaWZmO1xuICAgIHZhciBoZWlnaHRCaWFzRGlmZnMgPSBjb21wdXRlQmlhc1ZhbHVlcyhtaW4uaGVpZ2h0LnZhbCAtIGJiLmgsIHRvcFZhbCwgYm90dG9tVmFsKTtcbiAgICB2YXIgZGlmZlRvcCA9IGhlaWdodEJpYXNEaWZmcy5iaWFzRGlmZjtcbiAgICB2YXIgZGlmZkJvdHRvbSA9IGhlaWdodEJpYXNEaWZmcy5iaWFzQ29tcGxlbWVudERpZmY7XG4gICAgX3AuYXV0b1BhZGRpbmcgPSBjb21wdXRlUGFkZGluZ1ZhbHVlcyhiYi53LCBiYi5oLCBwYXJlbnQucHN0eWxlKCdwYWRkaW5nJyksIHBhcmVudC5wc3R5bGUoJ3BhZGRpbmctcmVsYXRpdmUtdG8nKS52YWx1ZSk7XG4gICAgX3AuYXV0b1dpZHRoID0gTWF0aC5tYXgoYmIudywgbWluLndpZHRoLnZhbCk7XG4gICAgcG9zLnggPSAoLWRpZmZMZWZ0ICsgYmIueDEgKyBiYi54MiArIGRpZmZSaWdodCkgLyAyO1xuICAgIF9wLmF1dG9IZWlnaHQgPSBNYXRoLm1heChiYi5oLCBtaW4uaGVpZ2h0LnZhbCk7XG4gICAgcG9zLnkgPSAoLWRpZmZUb3AgKyBiYi55MSArIGJiLnkyICsgZGlmZkJvdHRvbSkgLyAyO1xuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbGUgPSB0aGlzW2ldO1xuICAgIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgICBpZiAoIV9wLmNvbXBvdW5kQm91bmRzQ2xlYW4gfHwgZm9yY2UpIHtcbiAgICAgIHVwZGF0ZShlbGUpO1xuICAgICAgaWYgKCFjeS5iYXRjaGluZygpKSB7XG4gICAgICAgIF9wLmNvbXBvdW5kQm91bmRzQ2xlYW4gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG52YXIgbm9uaW5mID0gZnVuY3Rpb24gbm9uaW5mKHgpIHtcbiAgaWYgKHggPT09IEluZmluaXR5IHx8IHggPT09IC1JbmZpbml0eSkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIHJldHVybiB4O1xufTtcbnZhciB1cGRhdGVCb3VuZHMgPSBmdW5jdGlvbiB1cGRhdGVCb3VuZHMoYiwgeDEsIHkxLCB4MiwgeTIpIHtcbiAgLy8gZG9uJ3QgdXBkYXRlIHdpdGggemVybyBhcmVhIGJveGVzXG4gIGlmICh4MiAtIHgxID09PSAwIHx8IHkyIC0geTEgPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBkb24ndCB1cGRhdGUgd2l0aCBudWxsIGRpbVxuICBpZiAoeDEgPT0gbnVsbCB8fCB5MSA9PSBudWxsIHx8IHgyID09IG51bGwgfHwgeTIgPT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfVxuICBiLngxID0geDEgPCBiLngxID8geDEgOiBiLngxO1xuICBiLngyID0geDIgPiBiLngyID8geDIgOiBiLngyO1xuICBiLnkxID0geTEgPCBiLnkxID8geTEgOiBiLnkxO1xuICBiLnkyID0geTIgPiBiLnkyID8geTIgOiBiLnkyO1xuICBiLncgPSBiLngyIC0gYi54MTtcbiAgYi5oID0gYi55MiAtIGIueTE7XG59O1xudmFyIHVwZGF0ZUJvdW5kc0Zyb21Cb3ggPSBmdW5jdGlvbiB1cGRhdGVCb3VuZHNGcm9tQm94KGIsIGIyKSB7XG4gIGlmIChiMiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGI7XG4gIH1cbiAgcmV0dXJuIHVwZGF0ZUJvdW5kcyhiLCBiMi54MSwgYjIueTEsIGIyLngyLCBiMi55Mik7XG59O1xudmFyIHByZWZpeGVkUHJvcGVydHkgPSBmdW5jdGlvbiBwcmVmaXhlZFByb3BlcnR5KG9iaiwgZmllbGQsIHByZWZpeCkge1xuICByZXR1cm4gZ2V0UHJlZml4ZWRQcm9wZXJ0eShvYmosIGZpZWxkLCBwcmVmaXgpO1xufTtcbnZhciB1cGRhdGVCb3VuZHNGcm9tQXJyb3cgPSBmdW5jdGlvbiB1cGRhdGVCb3VuZHNGcm9tQXJyb3coYm91bmRzLCBlbGUsIHByZWZpeCkge1xuICBpZiAoZWxlLmN5KCkuaGVhZGxlc3MoKSkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIHZhciByc3R5bGUgPSBfcC5yc3R5bGU7XG4gIHZhciBoYWxmQXJXID0gcnN0eWxlLmFycm93V2lkdGggLyAyO1xuICB2YXIgYXJyb3dUeXBlID0gZWxlLnBzdHlsZShwcmVmaXggKyAnLWFycm93LXNoYXBlJykudmFsdWU7XG4gIHZhciB4O1xuICB2YXIgeTtcbiAgaWYgKGFycm93VHlwZSAhPT0gJ25vbmUnKSB7XG4gICAgaWYgKHByZWZpeCA9PT0gJ3NvdXJjZScpIHtcbiAgICAgIHggPSByc3R5bGUuc3JjWDtcbiAgICAgIHkgPSByc3R5bGUuc3JjWTtcbiAgICB9IGVsc2UgaWYgKHByZWZpeCA9PT0gJ3RhcmdldCcpIHtcbiAgICAgIHggPSByc3R5bGUudGd0WDtcbiAgICAgIHkgPSByc3R5bGUudGd0WTtcbiAgICB9IGVsc2Uge1xuICAgICAgeCA9IHJzdHlsZS5taWRYO1xuICAgICAgeSA9IHJzdHlsZS5taWRZO1xuICAgIH1cblxuICAgIC8vIGFsd2F5cyBzdG9yZSB0aGUgaW5kaXZpZHVhbCBhcnJvdyBib3VuZHNcbiAgICB2YXIgYmJzID0gX3AuYXJyb3dCb3VuZHMgPSBfcC5hcnJvd0JvdW5kcyB8fCB7fTtcbiAgICB2YXIgYmIgPSBiYnNbcHJlZml4XSA9IGJic1twcmVmaXhdIHx8IHt9O1xuICAgIGJiLngxID0geCAtIGhhbGZBclc7XG4gICAgYmIueTEgPSB5IC0gaGFsZkFyVztcbiAgICBiYi54MiA9IHggKyBoYWxmQXJXO1xuICAgIGJiLnkyID0geSArIGhhbGZBclc7XG4gICAgYmIudyA9IGJiLngyIC0gYmIueDE7XG4gICAgYmIuaCA9IGJiLnkyIC0gYmIueTE7XG4gICAgZXhwYW5kQm91bmRpbmdCb3goYmIsIDEpO1xuICAgIHVwZGF0ZUJvdW5kcyhib3VuZHMsIGJiLngxLCBiYi55MSwgYmIueDIsIGJiLnkyKTtcbiAgfVxufTtcbnZhciB1cGRhdGVCb3VuZHNGcm9tTGFiZWwgPSBmdW5jdGlvbiB1cGRhdGVCb3VuZHNGcm9tTGFiZWwoYm91bmRzLCBlbGUsIHByZWZpeCkge1xuICBpZiAoZWxlLmN5KCkuaGVhZGxlc3MoKSkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgcHJlZml4RGFzaDtcbiAgaWYgKHByZWZpeCkge1xuICAgIHByZWZpeERhc2ggPSBwcmVmaXggKyAnLSc7XG4gIH0gZWxzZSB7XG4gICAgcHJlZml4RGFzaCA9ICcnO1xuICB9XG4gIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgdmFyIHJzdHlsZSA9IF9wLnJzdHlsZTtcbiAgdmFyIGxhYmVsID0gZWxlLnBzdHlsZShwcmVmaXhEYXNoICsgJ2xhYmVsJykuc3RyVmFsdWU7XG4gIGlmIChsYWJlbCkge1xuICAgIHZhciBoYWxpZ24gPSBlbGUucHN0eWxlKCd0ZXh0LWhhbGlnbicpO1xuICAgIHZhciB2YWxpZ24gPSBlbGUucHN0eWxlKCd0ZXh0LXZhbGlnbicpO1xuICAgIHZhciBsYWJlbFdpZHRoID0gcHJlZml4ZWRQcm9wZXJ0eShyc3R5bGUsICdsYWJlbFdpZHRoJywgcHJlZml4KTtcbiAgICB2YXIgbGFiZWxIZWlnaHQgPSBwcmVmaXhlZFByb3BlcnR5KHJzdHlsZSwgJ2xhYmVsSGVpZ2h0JywgcHJlZml4KTtcbiAgICB2YXIgbGFiZWxYID0gcHJlZml4ZWRQcm9wZXJ0eShyc3R5bGUsICdsYWJlbFgnLCBwcmVmaXgpO1xuICAgIHZhciBsYWJlbFkgPSBwcmVmaXhlZFByb3BlcnR5KHJzdHlsZSwgJ2xhYmVsWScsIHByZWZpeCk7XG4gICAgdmFyIG1hcmdpblggPSBlbGUucHN0eWxlKHByZWZpeERhc2ggKyAndGV4dC1tYXJnaW4teCcpLnBmVmFsdWU7XG4gICAgdmFyIG1hcmdpblkgPSBlbGUucHN0eWxlKHByZWZpeERhc2ggKyAndGV4dC1tYXJnaW4teScpLnBmVmFsdWU7XG4gICAgdmFyIGlzRWRnZSA9IGVsZS5pc0VkZ2UoKTtcbiAgICB2YXIgcm90YXRpb24gPSBlbGUucHN0eWxlKHByZWZpeERhc2ggKyAndGV4dC1yb3RhdGlvbicpO1xuICAgIHZhciBvdXRsaW5lV2lkdGggPSBlbGUucHN0eWxlKCd0ZXh0LW91dGxpbmUtd2lkdGgnKS5wZlZhbHVlO1xuICAgIHZhciBib3JkZXJXaWR0aCA9IGVsZS5wc3R5bGUoJ3RleHQtYm9yZGVyLXdpZHRoJykucGZWYWx1ZTtcbiAgICB2YXIgaGFsZkJvcmRlcldpZHRoID0gYm9yZGVyV2lkdGggLyAyO1xuICAgIHZhciBwYWRkaW5nID0gZWxlLnBzdHlsZSgndGV4dC1iYWNrZ3JvdW5kLXBhZGRpbmcnKS5wZlZhbHVlO1xuICAgIHZhciBtYXJnaW5PZkVycm9yID0gMjsgLy8gZXhwYW5kIHRvIHdvcmsgYXJvdW5kIGJyb3dzZXIgZGltZW5zaW9uIGluYWNjdXJhY2llc1xuXG4gICAgdmFyIGxoID0gbGFiZWxIZWlnaHQ7XG4gICAgdmFyIGx3ID0gbGFiZWxXaWR0aDtcbiAgICB2YXIgbHdfMiA9IGx3IC8gMjtcbiAgICB2YXIgbGhfMiA9IGxoIC8gMjtcbiAgICB2YXIgbHgxLCBseDIsIGx5MSwgbHkyO1xuICAgIGlmIChpc0VkZ2UpIHtcbiAgICAgIGx4MSA9IGxhYmVsWCAtIGx3XzI7XG4gICAgICBseDIgPSBsYWJlbFggKyBsd18yO1xuICAgICAgbHkxID0gbGFiZWxZIC0gbGhfMjtcbiAgICAgIGx5MiA9IGxhYmVsWSArIGxoXzI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN3aXRjaCAobGFiZWxIYWxpZ24oaGFsaWduLnZhbHVlKSkge1xuICAgICAgICBjYXNlICdsZWZ0JzpcbiAgICAgICAgICBseDEgPSBsYWJlbFggLSBsdztcbiAgICAgICAgICBseDIgPSBsYWJlbFg7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2NlbnRlcic6XG4gICAgICAgICAgbHgxID0gbGFiZWxYIC0gbHdfMjtcbiAgICAgICAgICBseDIgPSBsYWJlbFggKyBsd18yO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgICAgbHgxID0gbGFiZWxYO1xuICAgICAgICAgIGx4MiA9IGxhYmVsWCArIGx3O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc3dpdGNoIChsYWJlbFZhbGlnbih2YWxpZ24udmFsdWUpKSB7XG4gICAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgICAgbHkxID0gbGFiZWxZIC0gbGg7XG4gICAgICAgICAgbHkyID0gbGFiZWxZO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdjZW50ZXInOlxuICAgICAgICAgIGx5MSA9IGxhYmVsWSAtIGxoXzI7XG4gICAgICAgICAgbHkyID0gbGFiZWxZICsgbGhfMjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgICBseTEgPSBsYWJlbFk7XG4gICAgICAgICAgbHkyID0gbGFiZWxZICsgbGg7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gc2hpZnQgYnkgbWFyZ2luIGFuZCBleHBhbmQgYnkgb3V0bGluZSBhbmQgYm9yZGVyXG4gICAgdmFyIGxlZnRQYWQgPSBtYXJnaW5YIC0gTWF0aC5tYXgob3V0bGluZVdpZHRoLCBoYWxmQm9yZGVyV2lkdGgpIC0gcGFkZGluZyAtIG1hcmdpbk9mRXJyb3I7XG4gICAgdmFyIHJpZ2h0UGFkID0gbWFyZ2luWCArIE1hdGgubWF4KG91dGxpbmVXaWR0aCwgaGFsZkJvcmRlcldpZHRoKSArIHBhZGRpbmcgKyBtYXJnaW5PZkVycm9yO1xuICAgIHZhciB0b3BQYWQgPSBtYXJnaW5ZIC0gTWF0aC5tYXgob3V0bGluZVdpZHRoLCBoYWxmQm9yZGVyV2lkdGgpIC0gcGFkZGluZyAtIG1hcmdpbk9mRXJyb3I7XG4gICAgdmFyIGJvdFBhZCA9IG1hcmdpblkgKyBNYXRoLm1heChvdXRsaW5lV2lkdGgsIGhhbGZCb3JkZXJXaWR0aCkgKyBwYWRkaW5nICsgbWFyZ2luT2ZFcnJvcjtcbiAgICBseDEgKz0gbGVmdFBhZDtcbiAgICBseDIgKz0gcmlnaHRQYWQ7XG4gICAgbHkxICs9IHRvcFBhZDtcbiAgICBseTIgKz0gYm90UGFkO1xuXG4gICAgLy8gYWx3YXlzIHN0b3JlIHRoZSB1bnJvdGF0ZWQgbGFiZWwgYm91bmRzIHNlcGFyYXRlbHlcbiAgICB2YXIgYmJQcmVmaXggPSBwcmVmaXggfHwgJ21haW4nO1xuICAgIHZhciBiYnMgPSBfcC5sYWJlbEJvdW5kcztcbiAgICB2YXIgYmIgPSBiYnNbYmJQcmVmaXhdID0gYmJzW2JiUHJlZml4XSB8fCB7fTtcbiAgICBiYi54MSA9IGx4MTtcbiAgICBiYi55MSA9IGx5MTtcbiAgICBiYi54MiA9IGx4MjtcbiAgICBiYi55MiA9IGx5MjtcbiAgICBiYi53ID0gbHgyIC0gbHgxO1xuICAgIGJiLmggPSBseTIgLSBseTE7XG4gICAgYmIubGVmdFBhZCA9IGxlZnRQYWQ7XG4gICAgYmIucmlnaHRQYWQgPSByaWdodFBhZDtcbiAgICBiYi50b3BQYWQgPSB0b3BQYWQ7XG4gICAgYmIuYm90UGFkID0gYm90UGFkO1xuICAgIHZhciBpc0F1dG9yb3RhdGUgPSBpc0VkZ2UgJiYgcm90YXRpb24uc3RyVmFsdWUgPT09ICdhdXRvcm90YXRlJztcbiAgICB2YXIgaXNQZlZhbHVlID0gcm90YXRpb24ucGZWYWx1ZSAhPSBudWxsICYmIHJvdGF0aW9uLnBmVmFsdWUgIT09IDA7XG4gICAgaWYgKGlzQXV0b3JvdGF0ZSB8fCBpc1BmVmFsdWUpIHtcbiAgICAgIHZhciB0aGV0YSA9IGlzQXV0b3JvdGF0ZSA/IHByZWZpeGVkUHJvcGVydHkoX3AucnN0eWxlLCAnbGFiZWxBbmdsZScsIHByZWZpeCkgOiByb3RhdGlvbi5wZlZhbHVlO1xuICAgICAgdmFyIGNvcyA9IE1hdGguY29zKHRoZXRhKTtcbiAgICAgIHZhciBzaW4gPSBNYXRoLnNpbih0aGV0YSk7XG5cbiAgICAgIC8vIHJvdGF0aW9uIHBvaW50IChkZWZhdWx0IHZhbHVlIGZvciBjZW50ZXItY2VudGVyKVxuICAgICAgdmFyIHhvID0gKGx4MSArIGx4MikgLyAyO1xuICAgICAgdmFyIHlvID0gKGx5MSArIGx5MikgLyAyO1xuICAgICAgaWYgKCFpc0VkZ2UpIHtcbiAgICAgICAgc3dpdGNoIChsYWJlbEhhbGlnbihoYWxpZ24udmFsdWUpKSB7XG4gICAgICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgICAgICB4byA9IGx4MjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgICAgIHhvID0gbHgxO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoIChsYWJlbFZhbGlnbih2YWxpZ24udmFsdWUpKSB7XG4gICAgICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgICAgIHlvID0gbHkyO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgICAgIHlvID0gbHkxO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciByb3RhdGUgPSBmdW5jdGlvbiByb3RhdGUoeCwgeSkge1xuICAgICAgICB4ID0geCAtIHhvO1xuICAgICAgICB5ID0geSAtIHlvO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHg6IHggKiBjb3MgLSB5ICogc2luICsgeG8sXG4gICAgICAgICAgeTogeCAqIHNpbiArIHkgKiBjb3MgKyB5b1xuICAgICAgICB9O1xuICAgICAgfTtcbiAgICAgIHZhciBweDF5MSA9IHJvdGF0ZShseDEsIGx5MSk7XG4gICAgICB2YXIgcHgxeTIgPSByb3RhdGUobHgxLCBseTIpO1xuICAgICAgdmFyIHB4MnkxID0gcm90YXRlKGx4MiwgbHkxKTtcbiAgICAgIHZhciBweDJ5MiA9IHJvdGF0ZShseDIsIGx5Mik7XG4gICAgICBseDEgPSBNYXRoLm1pbihweDF5MS54LCBweDF5Mi54LCBweDJ5MS54LCBweDJ5Mi54KTtcbiAgICAgIGx4MiA9IE1hdGgubWF4KHB4MXkxLngsIHB4MXkyLngsIHB4MnkxLngsIHB4MnkyLngpO1xuICAgICAgbHkxID0gTWF0aC5taW4ocHgxeTEueSwgcHgxeTIueSwgcHgyeTEueSwgcHgyeTIueSk7XG4gICAgICBseTIgPSBNYXRoLm1heChweDF5MS55LCBweDF5Mi55LCBweDJ5MS55LCBweDJ5Mi55KTtcbiAgICB9XG4gICAgdmFyIGJiUHJlZml4Um90ID0gYmJQcmVmaXggKyAnUm90JztcbiAgICB2YXIgYmJSb3QgPSBiYnNbYmJQcmVmaXhSb3RdID0gYmJzW2JiUHJlZml4Um90XSB8fCB7fTtcbiAgICBiYlJvdC54MSA9IGx4MTtcbiAgICBiYlJvdC55MSA9IGx5MTtcbiAgICBiYlJvdC54MiA9IGx4MjtcbiAgICBiYlJvdC55MiA9IGx5MjtcbiAgICBiYlJvdC53ID0gbHgyIC0gbHgxO1xuICAgIGJiUm90LmggPSBseTIgLSBseTE7XG4gICAgdXBkYXRlQm91bmRzKGJvdW5kcywgbHgxLCBseTEsIGx4MiwgbHkyKTtcbiAgICB1cGRhdGVCb3VuZHMoX3AubGFiZWxCb3VuZHMuYWxsLCBseDEsIGx5MSwgbHgyLCBseTIpO1xuICB9XG4gIHJldHVybiBib3VuZHM7XG59O1xudmFyIHVwZGF0ZUJvdW5kc0Zyb21PdXRsaW5lID0gZnVuY3Rpb24gdXBkYXRlQm91bmRzRnJvbU91dGxpbmUoYm91bmRzLCBlbGUpIHtcbiAgaWYgKGVsZS5jeSgpLmhlYWRsZXNzKCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG91dGxpbmVPcGFjaXR5ID0gZWxlLnBzdHlsZSgnb3V0bGluZS1vcGFjaXR5JykudmFsdWU7XG4gIHZhciBvdXRsaW5lV2lkdGggPSBlbGUucHN0eWxlKCdvdXRsaW5lLXdpZHRoJykudmFsdWU7XG4gIHZhciBvdXRsaW5lT2Zmc2V0ID0gZWxlLnBzdHlsZSgnb3V0bGluZS1vZmZzZXQnKS52YWx1ZTtcbiAgdmFyIGV4cGFuc2lvbiA9IG91dGxpbmVXaWR0aCArIG91dGxpbmVPZmZzZXQ7XG4gIHVwZGF0ZUJvdW5kc0Zyb21NaXRlcihib3VuZHMsIGVsZSwgb3V0bGluZU9wYWNpdHksIGV4cGFuc2lvbiwgJ291dHNpZGUnLCBleHBhbnNpb24gLyAyKTtcbn07XG52YXIgdXBkYXRlQm91bmRzRnJvbU1pdGVyID0gZnVuY3Rpb24gdXBkYXRlQm91bmRzRnJvbU1pdGVyKGJvdW5kcywgZWxlLCBvcGFjaXR5LCBleHBhbnNpb25TaXplLCBleHBhbnNpb25Qb3NpdGlvbiwgdXNlRmFsbGJhY2tWYWx1ZSkge1xuICBpZiAob3BhY2l0eSA9PT0gMCB8fCBleHBhbnNpb25TaXplIDw9IDAgfHwgZXhwYW5zaW9uUG9zaXRpb24gPT09ICdpbnNpZGUnKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBjeSA9IGVsZS5jeSgpO1xuICB2YXIgciA9IGN5LnJlbmRlcmVyKCk7XG4gIHZhciByc2hhcGUgPSByLm5vZGVTaGFwZXNbci5nZXROb2RlU2hhcGUoZWxlKV07XG4gIGlmICghcnNoYXBlKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBfZWxlJHBvc2l0aW9uID0gZWxlLnBvc2l0aW9uKCksXG4gICAgeCA9IF9lbGUkcG9zaXRpb24ueCxcbiAgICB5ID0gX2VsZSRwb3NpdGlvbi55O1xuICB2YXIgdyA9IGVsZS53aWR0aCgpO1xuICB2YXIgaCA9IGVsZS5oZWlnaHQoKTtcbiAgaWYgKHJzaGFwZS5oYXNNaXRlckJvdW5kcykge1xuICAgIGlmIChleHBhbnNpb25Qb3NpdGlvbiA9PT0gJ2NlbnRlcicpIHtcbiAgICAgIGV4cGFuc2lvblNpemUgLz0gMjtcbiAgICB9XG4gICAgdmFyIG1iYiA9IHJzaGFwZS5taXRlckJvdW5kcyh4LCB5LCB3LCBoLCBleHBhbnNpb25TaXplKTtcbiAgICB1cGRhdGVCb3VuZHNGcm9tQm94KGJvdW5kcywgbWJiKTtcbiAgfSBlbHNlIGlmICh1c2VGYWxsYmFja1ZhbHVlICE9IG51bGwgJiYgdXNlRmFsbGJhY2tWYWx1ZSA+IDApIHtcbiAgICBleHBhbmRCb3VuZGluZ0JveFNpZGVzKGJvdW5kcywgW3VzZUZhbGxiYWNrVmFsdWUsIHVzZUZhbGxiYWNrVmFsdWUsIHVzZUZhbGxiYWNrVmFsdWUsIHVzZUZhbGxiYWNrVmFsdWVdKTtcbiAgfVxufTtcbnZhciB1cGRhdGVCb3VuZHNGcm9tTWl0ZXJCb3JkZXIgPSBmdW5jdGlvbiB1cGRhdGVCb3VuZHNGcm9tTWl0ZXJCb3JkZXIoYm91bmRzLCBlbGUpIHtcbiAgaWYgKGVsZS5jeSgpLmhlYWRsZXNzKCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIGJvcmRlck9wYWNpdHkgPSBlbGUucHN0eWxlKCdib3JkZXItb3BhY2l0eScpLnZhbHVlO1xuICB2YXIgYm9yZGVyV2lkdGggPSBlbGUucHN0eWxlKCdib3JkZXItd2lkdGgnKS5wZlZhbHVlO1xuICB2YXIgYm9yZGVyUG9zaXRpb24gPSBlbGUucHN0eWxlKCdib3JkZXItcG9zaXRpb24nKS52YWx1ZTtcbiAgdXBkYXRlQm91bmRzRnJvbU1pdGVyKGJvdW5kcywgZWxlLCBib3JkZXJPcGFjaXR5LCBib3JkZXJXaWR0aCwgYm9yZGVyUG9zaXRpb24pO1xufTtcblxuLy8gZ2V0IHRoZSBib3VuZGluZyBib3ggb2YgdGhlIGVsZW1lbnRzIChpbiByYXcgbW9kZWwgcG9zaXRpb24pXG52YXIgYm91bmRpbmdCb3hJbXBsID0gZnVuY3Rpb24gYm91bmRpbmdCb3hJbXBsKGVsZSwgb3B0aW9ucykge1xuICB2YXIgY3kgPSBlbGUuX3ByaXZhdGUuY3k7XG4gIHZhciBzdHlsZUVuYWJsZWQgPSBjeS5zdHlsZUVuYWJsZWQoKTtcbiAgdmFyIGhlYWRsZXNzID0gY3kuaGVhZGxlc3MoKTtcbiAgdmFyIGJvdW5kcyA9IG1ha2VCb3VuZGluZ0JveCgpO1xuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIHZhciBpc05vZGUgPSBlbGUuaXNOb2RlKCk7XG4gIHZhciBpc0VkZ2UgPSBlbGUuaXNFZGdlKCk7XG4gIHZhciBleDEsIGV4MiwgZXkxLCBleTI7IC8vIGV4dHJlbWEgb2YgYm9keSAvIGxpbmVzXG4gIHZhciB4LCB5OyAvLyBub2RlIHBvc1xuICB2YXIgcnN0eWxlID0gX3AucnN0eWxlO1xuICB2YXIgbWFudWFsRXhwYW5zaW9uID0gaXNOb2RlICYmIHN0eWxlRW5hYmxlZCA/IGVsZS5wc3R5bGUoJ2JvdW5kcy1leHBhbnNpb24nKS5wZlZhbHVlIDogWzBdO1xuXG4gIC8vIG11c3QgdXNlIGBkaXNwbGF5YCBwcm9wIG9ubHksIGFzIHJlYWRpbmcgYGNvbXBvdW5kLndpZHRoKClgIGNhdXNlcyByZWN1cnNpb25cbiAgLy8gKG90aGVyIGZhY3RvcnMgbGlrZSB3aWR0aCB2YWx1ZXMgd2lsbCBiZSBjb25zaWRlcmVkIGxhdGVyIGluIHRoaXMgZnVuY3Rpb24gYW55d2F5KVxuICB2YXIgaXNEaXNwbGF5ZWQgPSBmdW5jdGlvbiBpc0Rpc3BsYXllZChlbGUpIHtcbiAgICByZXR1cm4gZWxlLnBzdHlsZSgnZGlzcGxheScpLnZhbHVlICE9PSAnbm9uZSc7XG4gIH07XG4gIHZhciBkaXNwbGF5ZWQgPSAhc3R5bGVFbmFibGVkIHx8IGlzRGlzcGxheWVkKGVsZSlcblxuICAvLyBtdXN0IHRha2UgaW50byBhY2NvdW50IGNvbm5lY3RlZCBub2RlcyBiL2Mgb2YgaW1wbGljaXQgZWRnZSBoaWRpbmcgb24gZGlzcGxheTpub25lIG5vZGVcbiAgJiYgKCFpc0VkZ2UgfHwgaXNEaXNwbGF5ZWQoZWxlLnNvdXJjZSgpKSAmJiBpc0Rpc3BsYXllZChlbGUudGFyZ2V0KCkpKTtcbiAgaWYgKGRpc3BsYXllZCkge1xuICAgIC8vIGRpc3BsYXllZCBzdWZmaWNlcywgc2luY2Ugd2Ugd2lsbCBmaW5kIHplcm8gYXJlYSBlbGVzIGFueXdheVxuICAgIHZhciBvdmVybGF5T3BhY2l0eSA9IDA7XG4gICAgdmFyIG92ZXJsYXlQYWRkaW5nID0gMDtcbiAgICBpZiAoc3R5bGVFbmFibGVkICYmIG9wdGlvbnMuaW5jbHVkZU92ZXJsYXlzKSB7XG4gICAgICBvdmVybGF5T3BhY2l0eSA9IGVsZS5wc3R5bGUoJ292ZXJsYXktb3BhY2l0eScpLnZhbHVlO1xuICAgICAgaWYgKG92ZXJsYXlPcGFjaXR5ICE9PSAwKSB7XG4gICAgICAgIG92ZXJsYXlQYWRkaW5nID0gZWxlLnBzdHlsZSgnb3ZlcmxheS1wYWRkaW5nJykudmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciB1bmRlcmxheU9wYWNpdHkgPSAwO1xuICAgIHZhciB1bmRlcmxheVBhZGRpbmcgPSAwO1xuICAgIGlmIChzdHlsZUVuYWJsZWQgJiYgb3B0aW9ucy5pbmNsdWRlVW5kZXJsYXlzKSB7XG4gICAgICB1bmRlcmxheU9wYWNpdHkgPSBlbGUucHN0eWxlKCd1bmRlcmxheS1vcGFjaXR5JykudmFsdWU7XG4gICAgICBpZiAodW5kZXJsYXlPcGFjaXR5ICE9PSAwKSB7XG4gICAgICAgIHVuZGVybGF5UGFkZGluZyA9IGVsZS5wc3R5bGUoJ3VuZGVybGF5LXBhZGRpbmcnKS52YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIHBhZGRpbmcgPSBNYXRoLm1heChvdmVybGF5UGFkZGluZywgdW5kZXJsYXlQYWRkaW5nKTtcbiAgICB2YXIgdyA9IDA7XG4gICAgdmFyIHdIYWxmID0gMDtcbiAgICBpZiAoc3R5bGVFbmFibGVkKSB7XG4gICAgICB3ID0gZWxlLnBzdHlsZSgnd2lkdGgnKS5wZlZhbHVlO1xuICAgICAgd0hhbGYgPSB3IC8gMjtcbiAgICB9XG4gICAgaWYgKGlzTm9kZSAmJiBvcHRpb25zLmluY2x1ZGVOb2Rlcykge1xuICAgICAgdmFyIHBvcyA9IGVsZS5wb3NpdGlvbigpO1xuICAgICAgeCA9IHBvcy54O1xuICAgICAgeSA9IHBvcy55O1xuICAgICAgdmFyIF93ID0gZWxlLm91dGVyV2lkdGgoKTtcbiAgICAgIHZhciBoYWxmVyA9IF93IC8gMjtcbiAgICAgIHZhciBoID0gZWxlLm91dGVySGVpZ2h0KCk7XG4gICAgICB2YXIgaGFsZkggPSBoIC8gMjtcblxuICAgICAgLy8gaGFuZGxlIG5vZGUgZGltZW5zaW9uc1xuICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgICBleDEgPSB4IC0gaGFsZlc7XG4gICAgICBleDIgPSB4ICsgaGFsZlc7XG4gICAgICBleTEgPSB5IC0gaGFsZkg7XG4gICAgICBleTIgPSB5ICsgaGFsZkg7XG4gICAgICB1cGRhdGVCb3VuZHMoYm91bmRzLCBleDEsIGV5MSwgZXgyLCBleTIpO1xuICAgICAgaWYgKHN0eWxlRW5hYmxlZCkge1xuICAgICAgICB1cGRhdGVCb3VuZHNGcm9tT3V0bGluZShib3VuZHMsIGVsZSk7XG4gICAgICB9XG4gICAgICBpZiAoc3R5bGVFbmFibGVkICYmIG9wdGlvbnMuaW5jbHVkZU91dGxpbmVzICYmICFoZWFkbGVzcykge1xuICAgICAgICB1cGRhdGVCb3VuZHNGcm9tT3V0bGluZShib3VuZHMsIGVsZSk7XG4gICAgICB9XG4gICAgICBpZiAoc3R5bGVFbmFibGVkKSB7XG4gICAgICAgIHVwZGF0ZUJvdW5kc0Zyb21NaXRlckJvcmRlcihib3VuZHMsIGVsZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc0VkZ2UgJiYgb3B0aW9ucy5pbmNsdWRlRWRnZXMpIHtcbiAgICAgIGlmIChzdHlsZUVuYWJsZWQgJiYgIWhlYWRsZXNzKSB7XG4gICAgICAgIHZhciBjdXJ2ZVN0eWxlID0gZWxlLnBzdHlsZSgnY3VydmUtc3R5bGUnKS5zdHJWYWx1ZTtcblxuICAgICAgICAvLyBoYW5kbGUgZWRnZSBkaW1lbnNpb25zIChyb3VnaCBib3ggZXN0aW1hdGUpXG4gICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICAgICAgICBleDEgPSBNYXRoLm1pbihyc3R5bGUuc3JjWCwgcnN0eWxlLm1pZFgsIHJzdHlsZS50Z3RYKTtcbiAgICAgICAgZXgyID0gTWF0aC5tYXgocnN0eWxlLnNyY1gsIHJzdHlsZS5taWRYLCByc3R5bGUudGd0WCk7XG4gICAgICAgIGV5MSA9IE1hdGgubWluKHJzdHlsZS5zcmNZLCByc3R5bGUubWlkWSwgcnN0eWxlLnRndFkpO1xuICAgICAgICBleTIgPSBNYXRoLm1heChyc3R5bGUuc3JjWSwgcnN0eWxlLm1pZFksIHJzdHlsZS50Z3RZKTtcblxuICAgICAgICAvLyB0YWtlIGludG8gYWNjb3VudCBlZGdlIHdpZHRoXG4gICAgICAgIGV4MSAtPSB3SGFsZjtcbiAgICAgICAgZXgyICs9IHdIYWxmO1xuICAgICAgICBleTEgLT0gd0hhbGY7XG4gICAgICAgIGV5MiArPSB3SGFsZjtcbiAgICAgICAgdXBkYXRlQm91bmRzKGJvdW5kcywgZXgxLCBleTEsIGV4MiwgZXkyKTtcblxuICAgICAgICAvLyBwcmVjaXNlIGVkZ2VzXG4gICAgICAgIC8vLy8vLy8vLy8vLy8vLy9cblxuICAgICAgICBpZiAoY3VydmVTdHlsZSA9PT0gJ2hheXN0YWNrJykge1xuICAgICAgICAgIHZhciBocHRzID0gcnN0eWxlLmhheXN0YWNrUHRzO1xuICAgICAgICAgIGlmIChocHRzICYmIGhwdHMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICBleDEgPSBocHRzWzBdLng7XG4gICAgICAgICAgICBleTEgPSBocHRzWzBdLnk7XG4gICAgICAgICAgICBleDIgPSBocHRzWzFdLng7XG4gICAgICAgICAgICBleTIgPSBocHRzWzFdLnk7XG4gICAgICAgICAgICBpZiAoZXgxID4gZXgyKSB7XG4gICAgICAgICAgICAgIHZhciB0ZW1wID0gZXgxO1xuICAgICAgICAgICAgICBleDEgPSBleDI7XG4gICAgICAgICAgICAgIGV4MiA9IHRlbXA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXkxID4gZXkyKSB7XG4gICAgICAgICAgICAgIHZhciBfdGVtcCA9IGV5MTtcbiAgICAgICAgICAgICAgZXkxID0gZXkyO1xuICAgICAgICAgICAgICBleTIgPSBfdGVtcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHVwZGF0ZUJvdW5kcyhib3VuZHMsIGV4MSAtIHdIYWxmLCBleTEgLSB3SGFsZiwgZXgyICsgd0hhbGYsIGV5MiArIHdIYWxmKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoY3VydmVTdHlsZSA9PT0gJ2JlemllcicgfHwgY3VydmVTdHlsZSA9PT0gJ3VuYnVuZGxlZC1iZXppZXInIHx8IGVuZHNXaXRoKGN1cnZlU3R5bGUsICdzZWdtZW50cycpIHx8IGVuZHNXaXRoKGN1cnZlU3R5bGUsICd0YXhpJykpIHtcbiAgICAgICAgICB2YXIgcHRzO1xuICAgICAgICAgIHN3aXRjaCAoY3VydmVTdHlsZSkge1xuICAgICAgICAgICAgY2FzZSAnYmV6aWVyJzpcbiAgICAgICAgICAgIGNhc2UgJ3VuYnVuZGxlZC1iZXppZXInOlxuICAgICAgICAgICAgICBwdHMgPSByc3R5bGUuYmV6aWVyUHRzO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3NlZ21lbnRzJzpcbiAgICAgICAgICAgIGNhc2UgJ3RheGknOlxuICAgICAgICAgICAgY2FzZSAncm91bmQtc2VnbWVudHMnOlxuICAgICAgICAgICAgY2FzZSAncm91bmQtdGF4aSc6XG4gICAgICAgICAgICAgIHB0cyA9IHJzdHlsZS5saW5lUHRzO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHB0cyAhPSBudWxsKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHB0cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICB2YXIgcHQgPSBwdHNbal07XG4gICAgICAgICAgICAgIGV4MSA9IHB0LnggLSB3SGFsZjtcbiAgICAgICAgICAgICAgZXgyID0gcHQueCArIHdIYWxmO1xuICAgICAgICAgICAgICBleTEgPSBwdC55IC0gd0hhbGY7XG4gICAgICAgICAgICAgIGV5MiA9IHB0LnkgKyB3SGFsZjtcbiAgICAgICAgICAgICAgdXBkYXRlQm91bmRzKGJvdW5kcywgZXgxLCBleTEsIGV4MiwgZXkyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gYmV6aWVyLWxpa2Ugb3Igc2VnbWVudC1saWtlIGVkZ2VcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGhlYWRsZXNzIG9yIHN0eWxlIGRpc2FibGVkXG5cbiAgICAgICAgLy8gZmFsbGJhY2sgb24gc291cmNlIGFuZCB0YXJnZXQgcG9zaXRpb25zXG4gICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgICAgIHZhciBuMSA9IGVsZS5zb3VyY2UoKTtcbiAgICAgICAgdmFyIG4xcG9zID0gbjEucG9zaXRpb24oKTtcbiAgICAgICAgdmFyIG4yID0gZWxlLnRhcmdldCgpO1xuICAgICAgICB2YXIgbjJwb3MgPSBuMi5wb3NpdGlvbigpO1xuICAgICAgICBleDEgPSBuMXBvcy54O1xuICAgICAgICBleDIgPSBuMnBvcy54O1xuICAgICAgICBleTEgPSBuMXBvcy55O1xuICAgICAgICBleTIgPSBuMnBvcy55O1xuICAgICAgICBpZiAoZXgxID4gZXgyKSB7XG4gICAgICAgICAgdmFyIF90ZW1wMiA9IGV4MTtcbiAgICAgICAgICBleDEgPSBleDI7XG4gICAgICAgICAgZXgyID0gX3RlbXAyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChleTEgPiBleTIpIHtcbiAgICAgICAgICB2YXIgX3RlbXAzID0gZXkxO1xuICAgICAgICAgIGV5MSA9IGV5MjtcbiAgICAgICAgICBleTIgPSBfdGVtcDM7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0YWtlIGludG8gYWNjb3VudCBlZGdlIHdpZHRoXG4gICAgICAgIGV4MSAtPSB3SGFsZjtcbiAgICAgICAgZXgyICs9IHdIYWxmO1xuICAgICAgICBleTEgLT0gd0hhbGY7XG4gICAgICAgIGV5MiArPSB3SGFsZjtcbiAgICAgICAgdXBkYXRlQm91bmRzKGJvdW5kcywgZXgxLCBleTEsIGV4MiwgZXkyKTtcbiAgICAgIH0gLy8gaGVhZGxlc3Mgb3Igc3R5bGUgZGlzYWJsZWRcbiAgICB9IC8vIGVkZ2VzXG5cbiAgICAvLyBoYW5kbGUgZWRnZSBhcnJvdyBzaXplXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgaWYgKHN0eWxlRW5hYmxlZCAmJiBvcHRpb25zLmluY2x1ZGVFZGdlcyAmJiBpc0VkZ2UpIHtcbiAgICAgIHVwZGF0ZUJvdW5kc0Zyb21BcnJvdyhib3VuZHMsIGVsZSwgJ21pZC1zb3VyY2UnKTtcbiAgICAgIHVwZGF0ZUJvdW5kc0Zyb21BcnJvdyhib3VuZHMsIGVsZSwgJ21pZC10YXJnZXQnKTtcbiAgICAgIHVwZGF0ZUJvdW5kc0Zyb21BcnJvdyhib3VuZHMsIGVsZSwgJ3NvdXJjZScpO1xuICAgICAgdXBkYXRlQm91bmRzRnJvbUFycm93KGJvdW5kcywgZWxlLCAndGFyZ2V0Jyk7XG4gICAgfVxuXG4gICAgLy8gZ2hvc3RcbiAgICAvLy8vLy8vL1xuXG4gICAgaWYgKHN0eWxlRW5hYmxlZCkge1xuICAgICAgdmFyIGdob3N0ID0gZWxlLnBzdHlsZSgnZ2hvc3QnKS52YWx1ZSA9PT0gJ3llcyc7XG4gICAgICBpZiAoZ2hvc3QpIHtcbiAgICAgICAgdmFyIGd4ID0gZWxlLnBzdHlsZSgnZ2hvc3Qtb2Zmc2V0LXgnKS5wZlZhbHVlO1xuICAgICAgICB2YXIgZ3kgPSBlbGUucHN0eWxlKCdnaG9zdC1vZmZzZXQteScpLnBmVmFsdWU7XG4gICAgICAgIHVwZGF0ZUJvdW5kcyhib3VuZHMsIGJvdW5kcy54MSArIGd4LCBib3VuZHMueTEgKyBneSwgYm91bmRzLngyICsgZ3gsIGJvdW5kcy55MiArIGd5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBhbHdheXMgc3RvcmUgdGhlIGJvZHkgYm91bmRzIHNlcGFyYXRlbHkgZnJvbSB0aGUgbGFiZWxzXG4gICAgdmFyIGJiQm9keSA9IF9wLmJvZHlCb3VuZHMgPSBfcC5ib2R5Qm91bmRzIHx8IHt9O1xuICAgIGFzc2lnbkJvdW5kaW5nQm94KGJiQm9keSwgYm91bmRzKTtcbiAgICBleHBhbmRCb3VuZGluZ0JveFNpZGVzKGJiQm9keSwgbWFudWFsRXhwYW5zaW9uKTtcbiAgICBleHBhbmRCb3VuZGluZ0JveChiYkJvZHksIDEpOyAvLyBleHBhbmQgdG8gd29yayBhcm91bmQgYnJvd3NlciBkaW1lbnNpb24gaW5hY2N1cmFjaWVzXG5cbiAgICAvLyBvdmVybGF5XG4gICAgLy8vLy8vLy8vL1xuXG4gICAgaWYgKHN0eWxlRW5hYmxlZCkge1xuICAgICAgZXgxID0gYm91bmRzLngxO1xuICAgICAgZXgyID0gYm91bmRzLngyO1xuICAgICAgZXkxID0gYm91bmRzLnkxO1xuICAgICAgZXkyID0gYm91bmRzLnkyO1xuICAgICAgdXBkYXRlQm91bmRzKGJvdW5kcywgZXgxIC0gcGFkZGluZywgZXkxIC0gcGFkZGluZywgZXgyICsgcGFkZGluZywgZXkyICsgcGFkZGluZyk7XG4gICAgfVxuXG4gICAgLy8gYWx3YXlzIHN0b3JlIHRoZSBib2R5IGJvdW5kcyBzZXBhcmF0ZWx5IGZyb20gdGhlIGxhYmVsc1xuICAgIHZhciBiYk92ZXJsYXkgPSBfcC5vdmVybGF5Qm91bmRzID0gX3Aub3ZlcmxheUJvdW5kcyB8fCB7fTtcbiAgICBhc3NpZ25Cb3VuZGluZ0JveChiYk92ZXJsYXksIGJvdW5kcyk7XG4gICAgZXhwYW5kQm91bmRpbmdCb3hTaWRlcyhiYk92ZXJsYXksIG1hbnVhbEV4cGFuc2lvbik7XG4gICAgZXhwYW5kQm91bmRpbmdCb3goYmJPdmVybGF5LCAxKTsgLy8gZXhwYW5kIHRvIHdvcmsgYXJvdW5kIGJyb3dzZXIgZGltZW5zaW9uIGluYWNjdXJhY2llc1xuXG4gICAgLy8gaGFuZGxlIGxhYmVsIGRpbWVuc2lvbnNcbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgdmFyIGJiTGFiZWxzID0gX3AubGFiZWxCb3VuZHMgPSBfcC5sYWJlbEJvdW5kcyB8fCB7fTtcbiAgICBpZiAoYmJMYWJlbHMuYWxsICE9IG51bGwpIHtcbiAgICAgIGNsZWFyQm91bmRpbmdCb3goYmJMYWJlbHMuYWxsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYmJMYWJlbHMuYWxsID0gbWFrZUJvdW5kaW5nQm94KCk7XG4gICAgfVxuICAgIGlmIChzdHlsZUVuYWJsZWQgJiYgb3B0aW9ucy5pbmNsdWRlTGFiZWxzKSB7XG4gICAgICBpZiAob3B0aW9ucy5pbmNsdWRlTWFpbkxhYmVscykge1xuICAgICAgICB1cGRhdGVCb3VuZHNGcm9tTGFiZWwoYm91bmRzLCBlbGUsIG51bGwpO1xuICAgICAgfVxuICAgICAgaWYgKGlzRWRnZSkge1xuICAgICAgICBpZiAob3B0aW9ucy5pbmNsdWRlU291cmNlTGFiZWxzKSB7XG4gICAgICAgICAgdXBkYXRlQm91bmRzRnJvbUxhYmVsKGJvdW5kcywgZWxlLCAnc291cmNlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuaW5jbHVkZVRhcmdldExhYmVscykge1xuICAgICAgICAgIHVwZGF0ZUJvdW5kc0Zyb21MYWJlbChib3VuZHMsIGVsZSwgJ3RhcmdldCcpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSAvLyBzdHlsZSBlbmFibGVkIGZvciBsYWJlbHNcbiAgfSAvLyBpZiBkaXNwbGF5ZWRcblxuICBib3VuZHMueDEgPSBub25pbmYoYm91bmRzLngxKTtcbiAgYm91bmRzLnkxID0gbm9uaW5mKGJvdW5kcy55MSk7XG4gIGJvdW5kcy54MiA9IG5vbmluZihib3VuZHMueDIpO1xuICBib3VuZHMueTIgPSBub25pbmYoYm91bmRzLnkyKTtcbiAgYm91bmRzLncgPSBub25pbmYoYm91bmRzLngyIC0gYm91bmRzLngxKTtcbiAgYm91bmRzLmggPSBub25pbmYoYm91bmRzLnkyIC0gYm91bmRzLnkxKTtcbiAgaWYgKGJvdW5kcy53ID4gMCAmJiBib3VuZHMuaCA+IDAgJiYgZGlzcGxheWVkKSB7XG4gICAgZXhwYW5kQm91bmRpbmdCb3hTaWRlcyhib3VuZHMsIG1hbnVhbEV4cGFuc2lvbik7XG5cbiAgICAvLyBleHBhbmQgYm91bmRzIGJ5IDEgYmVjYXVzZSBhbnRpYWxpYXNpbmcgY2FuIGluY3JlYXNlIHRoZSB2aXN1YWwvZWZmZWN0aXZlIHNpemUgYnkgMSBvbiBhbGwgc2lkZXNcbiAgICBleHBhbmRCb3VuZGluZ0JveChib3VuZHMsIDEpO1xuICB9XG4gIHJldHVybiBib3VuZHM7XG59O1xudmFyIGdldEtleSA9IGZ1bmN0aW9uIGdldEtleShvcHRzKSB7XG4gIHZhciBpID0gMDtcbiAgdmFyIHRmID0gZnVuY3Rpb24gdGYodmFsKSB7XG4gICAgcmV0dXJuICh2YWwgPyAxIDogMCkgPDwgaSsrO1xuICB9O1xuICB2YXIga2V5ID0gMDtcbiAga2V5ICs9IHRmKG9wdHMuaW5jdWRlTm9kZXMpO1xuICBrZXkgKz0gdGYob3B0cy5pbmNsdWRlRWRnZXMpO1xuICBrZXkgKz0gdGYob3B0cy5pbmNsdWRlTGFiZWxzKTtcbiAga2V5ICs9IHRmKG9wdHMuaW5jbHVkZU1haW5MYWJlbHMpO1xuICBrZXkgKz0gdGYob3B0cy5pbmNsdWRlU291cmNlTGFiZWxzKTtcbiAga2V5ICs9IHRmKG9wdHMuaW5jbHVkZVRhcmdldExhYmVscyk7XG4gIGtleSArPSB0ZihvcHRzLmluY2x1ZGVPdmVybGF5cyk7XG4gIGtleSArPSB0ZihvcHRzLmluY2x1ZGVPdXRsaW5lcyk7XG4gIHJldHVybiBrZXk7XG59O1xudmFyIGdldEJvdW5kaW5nQm94UG9zS2V5ID0gZnVuY3Rpb24gZ2V0Qm91bmRpbmdCb3hQb3NLZXkoZWxlKSB7XG4gIHZhciByID0gZnVuY3Rpb24gcih4KSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQoeCk7XG4gIH07XG4gIGlmIChlbGUuaXNFZGdlKCkpIHtcbiAgICB2YXIgcDEgPSBlbGUuc291cmNlKCkucG9zaXRpb24oKTtcbiAgICB2YXIgcDIgPSBlbGUudGFyZ2V0KCkucG9zaXRpb24oKTtcbiAgICByZXR1cm4gaGFzaEludHNBcnJheShbcihwMS54KSwgcihwMS55KSwgcihwMi54KSwgcihwMi55KV0pO1xuICB9IGVsc2Uge1xuICAgIHZhciBwID0gZWxlLnBvc2l0aW9uKCk7XG4gICAgcmV0dXJuIGhhc2hJbnRzQXJyYXkoW3IocC54KSwgcihwLnkpXSk7XG4gIH1cbn07XG52YXIgY2FjaGVkQm91bmRpbmdCb3hJbXBsID0gZnVuY3Rpb24gY2FjaGVkQm91bmRpbmdCb3hJbXBsKGVsZSwgb3B0cykge1xuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIHZhciBiYjtcbiAgdmFyIGlzRWRnZSA9IGVsZS5pc0VkZ2UoKTtcbiAgdmFyIGtleSA9IG9wdHMgPT0gbnVsbCA/IGRlZkJiT3B0c0tleSA6IGdldEtleShvcHRzKTtcbiAgdmFyIHVzaW5nRGVmT3B0cyA9IGtleSA9PT0gZGVmQmJPcHRzS2V5O1xuICBpZiAoX3AuYmJDYWNoZSA9PSBudWxsKSB7XG4gICAgYmIgPSBib3VuZGluZ0JveEltcGwoZWxlLCBkZWZCYk9wdHMpO1xuICAgIF9wLmJiQ2FjaGUgPSBiYjtcbiAgICBfcC5iYkNhY2hlUG9zS2V5ID0gZ2V0Qm91bmRpbmdCb3hQb3NLZXkoZWxlKTtcbiAgfSBlbHNlIHtcbiAgICBiYiA9IF9wLmJiQ2FjaGU7XG4gIH1cblxuICAvLyBub3QgdXNpbmcgZGVmIG9wdHMgPT4gbmVlZCB0byBidWlsZCB1cCBiYiBmcm9tIGNvbWJpbmF0aW9uIG9mIHN1YiBiYnNcbiAgaWYgKCF1c2luZ0RlZk9wdHMpIHtcbiAgICB2YXIgaXNOb2RlID0gZWxlLmlzTm9kZSgpO1xuICAgIGJiID0gbWFrZUJvdW5kaW5nQm94KCk7XG4gICAgaWYgKG9wdHMuaW5jbHVkZU5vZGVzICYmIGlzTm9kZSB8fCBvcHRzLmluY2x1ZGVFZGdlcyAmJiAhaXNOb2RlKSB7XG4gICAgICBpZiAob3B0cy5pbmNsdWRlT3ZlcmxheXMpIHtcbiAgICAgICAgdXBkYXRlQm91bmRzRnJvbUJveChiYiwgX3Aub3ZlcmxheUJvdW5kcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1cGRhdGVCb3VuZHNGcm9tQm94KGJiLCBfcC5ib2R5Qm91bmRzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG9wdHMuaW5jbHVkZUxhYmVscykge1xuICAgICAgaWYgKG9wdHMuaW5jbHVkZU1haW5MYWJlbHMgJiYgKCFpc0VkZ2UgfHwgb3B0cy5pbmNsdWRlU291cmNlTGFiZWxzICYmIG9wdHMuaW5jbHVkZVRhcmdldExhYmVscykpIHtcbiAgICAgICAgdXBkYXRlQm91bmRzRnJvbUJveChiYiwgX3AubGFiZWxCb3VuZHMuYWxsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChvcHRzLmluY2x1ZGVNYWluTGFiZWxzKSB7XG4gICAgICAgICAgdXBkYXRlQm91bmRzRnJvbUJveChiYiwgX3AubGFiZWxCb3VuZHMubWFpblJvdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdHMuaW5jbHVkZVNvdXJjZUxhYmVscykge1xuICAgICAgICAgIHVwZGF0ZUJvdW5kc0Zyb21Cb3goYmIsIF9wLmxhYmVsQm91bmRzLnNvdXJjZVJvdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdHMuaW5jbHVkZVRhcmdldExhYmVscykge1xuICAgICAgICAgIHVwZGF0ZUJvdW5kc0Zyb21Cb3goYmIsIF9wLmxhYmVsQm91bmRzLnRhcmdldFJvdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgYmIudyA9IGJiLngyIC0gYmIueDE7XG4gICAgYmIuaCA9IGJiLnkyIC0gYmIueTE7XG4gIH1cbiAgcmV0dXJuIGJiO1xufTtcbnZhciBkZWZCYk9wdHMgPSB7XG4gIGluY2x1ZGVOb2RlczogdHJ1ZSxcbiAgaW5jbHVkZUVkZ2VzOiB0cnVlLFxuICBpbmNsdWRlTGFiZWxzOiB0cnVlLFxuICBpbmNsdWRlTWFpbkxhYmVsczogdHJ1ZSxcbiAgaW5jbHVkZVNvdXJjZUxhYmVsczogdHJ1ZSxcbiAgaW5jbHVkZVRhcmdldExhYmVsczogdHJ1ZSxcbiAgaW5jbHVkZU92ZXJsYXlzOiB0cnVlLFxuICBpbmNsdWRlVW5kZXJsYXlzOiB0cnVlLFxuICBpbmNsdWRlT3V0bGluZXM6IHRydWUsXG4gIHVzZUNhY2hlOiB0cnVlXG59O1xudmFyIGRlZkJiT3B0c0tleSA9IGdldEtleShkZWZCYk9wdHMpO1xudmFyIGZpbGxlZEJiT3B0cyA9IGRlZmF1bHRzJGcoZGVmQmJPcHRzKTtcbmVsZXNmbiRiLmJvdW5kaW5nQm94ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgdmFyIGJvdW5kcztcbiAgdmFyIHVzZUNhY2hlID0gb3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IG9wdGlvbnMudXNlQ2FjaGUgPT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLnVzZUNhY2hlID09PSB0cnVlO1xuICB2YXIgaXNEaXJ0eSA9IG1lbW9pemUoZnVuY3Rpb24gKGVsZSkge1xuICAgIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgICByZXR1cm4gX3AuYmJDYWNoZSA9PSBudWxsIHx8IF9wLnN0eWxlRGlydHkgfHwgX3AuYmJDYWNoZVBvc0tleSAhPT0gZ2V0Qm91bmRpbmdCb3hQb3NLZXkoZWxlKTtcbiAgfSwgZnVuY3Rpb24gKGVsZSkge1xuICAgIHJldHVybiBlbGUuaWQoKTtcbiAgfSk7XG5cbiAgLy8gdGhlIG1haW4gdXNlY2FzZSBpcyBlbGUuYm91bmRpbmdCb3goKSBmb3IgYSBzaW5nbGUgZWxlbWVudCB3aXRoIG5vL2RlZiBvcHRpb25zXG4gIC8vIHNwZWNpZmllZCBzLnQuIHRoZSBjYWNoZSBpcyB1c2VkLCBzbyBjaGVjayBmb3IgdGhpcyBjYXNlIHRvIG1ha2UgaXQgZmFzdGVyIGJ5XG4gIC8vIGF2b2lkaW5nIHRoZSBvdmVyaGVhZCBvZiB0aGUgcmVzdCBvZiB0aGUgZnVuY3Rpb25cbiAgaWYgKHVzZUNhY2hlICYmIHRoaXMubGVuZ3RoID09PSAxICYmICFpc0RpcnR5KHRoaXNbMF0pKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgb3B0aW9ucyA9IGRlZkJiT3B0cztcbiAgICB9IGVsc2Uge1xuICAgICAgb3B0aW9ucyA9IGZpbGxlZEJiT3B0cyhvcHRpb25zKTtcbiAgICB9XG4gICAgYm91bmRzID0gY2FjaGVkQm91bmRpbmdCb3hJbXBsKHRoaXNbMF0sIG9wdGlvbnMpO1xuICB9IGVsc2Uge1xuICAgIGJvdW5kcyA9IG1ha2VCb3VuZGluZ0JveCgpO1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IGRlZkJiT3B0cztcbiAgICB2YXIgb3B0cyA9IGZpbGxlZEJiT3B0cyhvcHRpb25zKTtcbiAgICB2YXIgZWxlcyA9IHRoaXM7XG4gICAgdmFyIGN5ID0gZWxlcy5jeSgpO1xuICAgIHZhciBzdHlsZUVuYWJsZWQgPSBjeS5zdHlsZUVuYWJsZWQoKTtcblxuICAgIC8vIGNhY2hlIHRoZSBpc0RpcnR5IHN0YXRlIGZvciBhbGwgZWxlcywgZWRnZXMgZmlyc3Qgc2luY2UgdGhleSBkZXBlbmQgb24gbm9kZSBzdGF0ZVxuICAgIHRoaXMuZWRnZXMoKS5mb3JFYWNoKGlzRGlydHkpO1xuICAgIHRoaXMubm9kZXMoKS5mb3JFYWNoKGlzRGlydHkpO1xuICAgIGlmIChzdHlsZUVuYWJsZWQpIHtcbiAgICAgIHRoaXMucmVjYWxjdWxhdGVSZW5kZXJlZFN0eWxlKHVzZUNhY2hlKTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVDb21wb3VuZEJvdW5kcyghdXNlQ2FjaGUpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgICBpZiAoaXNEaXJ0eShlbGUpKSB7XG4gICAgICAgIGVsZS5kaXJ0eUJvdW5kaW5nQm94Q2FjaGUoKTtcbiAgICAgIH1cbiAgICAgIHVwZGF0ZUJvdW5kc0Zyb21Cb3goYm91bmRzLCBjYWNoZWRCb3VuZGluZ0JveEltcGwoZWxlLCBvcHRzKSk7XG4gICAgfVxuICB9XG4gIGJvdW5kcy54MSA9IG5vbmluZihib3VuZHMueDEpO1xuICBib3VuZHMueTEgPSBub25pbmYoYm91bmRzLnkxKTtcbiAgYm91bmRzLngyID0gbm9uaW5mKGJvdW5kcy54Mik7XG4gIGJvdW5kcy55MiA9IG5vbmluZihib3VuZHMueTIpO1xuICBib3VuZHMudyA9IG5vbmluZihib3VuZHMueDIgLSBib3VuZHMueDEpO1xuICBib3VuZHMuaCA9IG5vbmluZihib3VuZHMueTIgLSBib3VuZHMueTEpO1xuICByZXR1cm4gYm91bmRzO1xufTtcbmVsZXNmbiRiLmRpcnR5Qm91bmRpbmdCb3hDYWNoZSA9IGZ1bmN0aW9uICgpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIF9wID0gdGhpc1tpXS5fcHJpdmF0ZTtcbiAgICBfcC5iYkNhY2hlID0gbnVsbDtcbiAgICBfcC5iYkNhY2hlUG9zS2V5ID0gbnVsbDtcbiAgICBfcC5ib2R5Qm91bmRzID0gbnVsbDtcbiAgICBfcC5vdmVybGF5Qm91bmRzID0gbnVsbDtcbiAgICBfcC5sYWJlbEJvdW5kcy5hbGwgPSBudWxsO1xuICAgIF9wLmxhYmVsQm91bmRzLnNvdXJjZSA9IG51bGw7XG4gICAgX3AubGFiZWxCb3VuZHMudGFyZ2V0ID0gbnVsbDtcbiAgICBfcC5sYWJlbEJvdW5kcy5tYWluID0gbnVsbDtcbiAgICBfcC5sYWJlbEJvdW5kcy5zb3VyY2VSb3QgPSBudWxsO1xuICAgIF9wLmxhYmVsQm91bmRzLnRhcmdldFJvdCA9IG51bGw7XG4gICAgX3AubGFiZWxCb3VuZHMubWFpblJvdCA9IG51bGw7XG4gICAgX3AuYXJyb3dCb3VuZHMuc291cmNlID0gbnVsbDtcbiAgICBfcC5hcnJvd0JvdW5kcy50YXJnZXQgPSBudWxsO1xuICAgIF9wLmFycm93Qm91bmRzWydtaWQtc291cmNlJ10gPSBudWxsO1xuICAgIF9wLmFycm93Qm91bmRzWydtaWQtdGFyZ2V0J10gPSBudWxsO1xuICB9XG4gIHRoaXMuZW1pdEFuZE5vdGlmeSgnYm91bmRzJyk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gcHJpdmF0ZSBoZWxwZXIgdG8gZ2V0IGJvdW5kaW5nIGJveCBmb3IgY3VzdG9tIG5vZGUgcG9zaXRpb25zXG4vLyAtIGdvb2QgZm9yIHBlcmYgaW4gY2VydGFpbiBjYXNlcyBidXQgY3VycmVudGx5IHJlcXVpcmVzIGRpcnR5aW5nIHRoZSByZW5kZXJlZCBzdHlsZVxuLy8gLSB3b3VsZCBiZSBiZXR0ZXIgdG8gbm90IG1vZGlmeSB0aGUgbm9kZXMgYnV0IHRoZSBub2RlcyBhcmUgcmVhZCBkaXJlY3RseSBldmVyeXdoZXJlIGluIHRoZSByZW5kZXJlci4uLlxuLy8gLSB0cnkgdG8gdXNlIGZvciBvbmx5IHRoaW5ncyBsaWtlIGRpc2NyZXRlIGxheW91dHMgd2hlcmUgdGhlIG5vZGUgcG9zaXRpb24gd291bGQgY2hhbmdlIGFueXdheVxuZWxlc2ZuJGIuYm91bmRpbmdCb3hBdCA9IGZ1bmN0aW9uIChmbikge1xuICB2YXIgbm9kZXMgPSB0aGlzLm5vZGVzKCk7XG4gIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgdmFyIGhhc0NvbXBvdW5kTm9kZXMgPSBjeS5oYXNDb21wb3VuZE5vZGVzKCk7XG4gIHZhciBwYXJlbnRzID0gY3kuY29sbGVjdGlvbigpO1xuICBpZiAoaGFzQ29tcG91bmROb2Rlcykge1xuICAgIHBhcmVudHMgPSBub2Rlcy5maWx0ZXIoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIHJldHVybiBub2RlLmlzUGFyZW50KCk7XG4gICAgfSk7XG4gICAgbm9kZXMgPSBub2Rlcy5ub3QocGFyZW50cyk7XG4gIH1cbiAgaWYgKHBsYWluT2JqZWN0KGZuKSkge1xuICAgIHZhciBvYmogPSBmbjtcbiAgICBmbiA9IGZ1bmN0aW9uIGZuKCkge1xuICAgICAgcmV0dXJuIG9iajtcbiAgICB9O1xuICB9XG4gIHZhciBzdG9yZU9sZFBvcyA9IGZ1bmN0aW9uIHN0b3JlT2xkUG9zKG5vZGUsIGkpIHtcbiAgICByZXR1cm4gbm9kZS5fcHJpdmF0ZS5iYkF0T2xkUG9zID0gZm4obm9kZSwgaSk7XG4gIH07XG4gIHZhciBnZXRPbGRQb3MgPSBmdW5jdGlvbiBnZXRPbGRQb3Mobm9kZSkge1xuICAgIHJldHVybiBub2RlLl9wcml2YXRlLmJiQXRPbGRQb3M7XG4gIH07XG4gIGN5LnN0YXJ0QmF0Y2goKTtcbiAgbm9kZXMuZm9yRWFjaChzdG9yZU9sZFBvcykuc2lsZW50UG9zaXRpb25zKGZuKTtcbiAgaWYgKGhhc0NvbXBvdW5kTm9kZXMpIHtcbiAgICBwYXJlbnRzLmRpcnR5Q29tcG91bmRCb3VuZHNDYWNoZSgpO1xuICAgIHBhcmVudHMuZGlydHlCb3VuZGluZ0JveENhY2hlKCk7XG4gICAgcGFyZW50cy51cGRhdGVDb21wb3VuZEJvdW5kcyh0cnVlKTsgLy8gZm9yY2UgdXBkYXRlIGIvYyB3ZSdyZSBpbnNpZGUgYSBiYXRjaCBjeWNsZVxuICB9XG4gIHZhciBiYiA9IGNvcHlCb3VuZGluZ0JveCh0aGlzLmJvdW5kaW5nQm94KHtcbiAgICB1c2VDYWNoZTogZmFsc2VcbiAgfSkpO1xuICBub2Rlcy5zaWxlbnRQb3NpdGlvbnMoZ2V0T2xkUG9zKTtcbiAgaWYgKGhhc0NvbXBvdW5kTm9kZXMpIHtcbiAgICBwYXJlbnRzLmRpcnR5Q29tcG91bmRCb3VuZHNDYWNoZSgpO1xuICAgIHBhcmVudHMuZGlydHlCb3VuZGluZ0JveENhY2hlKCk7XG4gICAgcGFyZW50cy51cGRhdGVDb21wb3VuZEJvdW5kcyh0cnVlKTsgLy8gZm9yY2UgdXBkYXRlIGIvYyB3ZSdyZSBpbnNpZGUgYSBiYXRjaCBjeWNsZVxuICB9XG4gIGN5LmVuZEJhdGNoKCk7XG4gIHJldHVybiBiYjtcbn07XG5mbiQzLmJvdW5kaW5nYm94ID0gZm4kMy5iYiA9IGZuJDMuYm91bmRpbmdCb3g7XG5mbiQzLnJlbmRlcmVkQm91bmRpbmdib3ggPSBmbiQzLnJlbmRlcmVkQm91bmRpbmdCb3g7XG52YXIgYm91bmRzID0gZWxlc2ZuJGI7XG5cbnZhciBmbiQyLCBlbGVzZm4kYTtcbmZuJDIgPSBlbGVzZm4kYSA9IHt9O1xudmFyIGRlZmluZURpbUZucyA9IGZ1bmN0aW9uIGRlZmluZURpbUZucyhvcHRzKSB7XG4gIG9wdHMudXBwZXJjYXNlTmFtZSA9IGNhcGl0YWxpemUob3B0cy5uYW1lKTtcbiAgb3B0cy5hdXRvTmFtZSA9ICdhdXRvJyArIG9wdHMudXBwZXJjYXNlTmFtZTtcbiAgb3B0cy5sYWJlbE5hbWUgPSAnbGFiZWwnICsgb3B0cy51cHBlcmNhc2VOYW1lO1xuICBvcHRzLm91dGVyTmFtZSA9ICdvdXRlcicgKyBvcHRzLnVwcGVyY2FzZU5hbWU7XG4gIG9wdHMudXBwZXJjYXNlT3V0ZXJOYW1lID0gY2FwaXRhbGl6ZShvcHRzLm91dGVyTmFtZSk7XG4gIGZuJDJbb3B0cy5uYW1lXSA9IGZ1bmN0aW9uIGRpbUltcGwoKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICAgIHZhciBjeSA9IF9wLmN5O1xuICAgIHZhciBzdHlsZUVuYWJsZWQgPSBjeS5fcHJpdmF0ZS5zdHlsZUVuYWJsZWQ7XG4gICAgaWYgKGVsZSkge1xuICAgICAgaWYgKHN0eWxlRW5hYmxlZCkge1xuICAgICAgICBpZiAoZWxlLmlzUGFyZW50KCkpIHtcbiAgICAgICAgICBlbGUudXBkYXRlQ29tcG91bmRCb3VuZHMoKTtcbiAgICAgICAgICByZXR1cm4gX3Bbb3B0cy5hdXRvTmFtZV0gfHwgMDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZCA9IGVsZS5wc3R5bGUob3B0cy5uYW1lKTtcbiAgICAgICAgc3dpdGNoIChkLnN0clZhbHVlKSB7XG4gICAgICAgICAgY2FzZSAnbGFiZWwnOlxuICAgICAgICAgICAgZWxlLnJlY2FsY3VsYXRlUmVuZGVyZWRTdHlsZSgpO1xuICAgICAgICAgICAgcmV0dXJuIF9wLnJzdHlsZVtvcHRzLmxhYmVsTmFtZV0gfHwgMDtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGQucGZWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBmbiQyWydvdXRlcicgKyBvcHRzLnVwcGVyY2FzZU5hbWVdID0gZnVuY3Rpb24gb3V0ZXJEaW1JbXBsKCkge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgICB2YXIgY3kgPSBfcC5jeTtcbiAgICB2YXIgc3R5bGVFbmFibGVkID0gY3kuX3ByaXZhdGUuc3R5bGVFbmFibGVkO1xuICAgIGlmIChlbGUpIHtcbiAgICAgIGlmIChzdHlsZUVuYWJsZWQpIHtcbiAgICAgICAgdmFyIGRpbSA9IGVsZVtvcHRzLm5hbWVdKCk7XG4gICAgICAgIHZhciBib3JkZXJQb3MgPSBlbGUucHN0eWxlKCdib3JkZXItcG9zaXRpb24nKS52YWx1ZTtcbiAgICAgICAgdmFyIGJvcmRlcjtcbiAgICAgICAgaWYgKGJvcmRlclBvcyA9PT0gJ2NlbnRlcicpIHtcbiAgICAgICAgICBib3JkZXIgPSBlbGUucHN0eWxlKCdib3JkZXItd2lkdGgnKS5wZlZhbHVlOyAvLyBuLmIuIDEvMiBlYWNoIHNpZGVcbiAgICAgICAgfSBlbHNlIGlmIChib3JkZXJQb3MgPT09ICdvdXRzaWRlJykge1xuICAgICAgICAgIGJvcmRlciA9IDIgKiBlbGUucHN0eWxlKCdib3JkZXItd2lkdGgnKS5wZlZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vICdpbnNpZGUnXG4gICAgICAgICAgYm9yZGVyID0gMDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcGFkZGluZyA9IDIgKiBlbGUucGFkZGluZygpO1xuICAgICAgICByZXR1cm4gZGltICsgYm9yZGVyICsgcGFkZGluZztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgZm4kMlsncmVuZGVyZWQnICsgb3B0cy51cHBlcmNhc2VOYW1lXSA9IGZ1bmN0aW9uIHJlbmRlcmVkRGltSW1wbCgpIHtcbiAgICB2YXIgZWxlID0gdGhpc1swXTtcbiAgICBpZiAoZWxlKSB7XG4gICAgICB2YXIgZCA9IGVsZVtvcHRzLm5hbWVdKCk7XG4gICAgICByZXR1cm4gZCAqIHRoaXMuY3koKS56b29tKCk7XG4gICAgfVxuICB9O1xuICBmbiQyWydyZW5kZXJlZCcgKyBvcHRzLnVwcGVyY2FzZU91dGVyTmFtZV0gPSBmdW5jdGlvbiByZW5kZXJlZE91dGVyRGltSW1wbCgpIHtcbiAgICB2YXIgZWxlID0gdGhpc1swXTtcbiAgICBpZiAoZWxlKSB7XG4gICAgICB2YXIgb2QgPSBlbGVbb3B0cy5vdXRlck5hbWVdKCk7XG4gICAgICByZXR1cm4gb2QgKiB0aGlzLmN5KCkuem9vbSgpO1xuICAgIH1cbiAgfTtcbn07XG5kZWZpbmVEaW1GbnMoe1xuICBuYW1lOiAnd2lkdGgnXG59KTtcbmRlZmluZURpbUZucyh7XG4gIG5hbWU6ICdoZWlnaHQnXG59KTtcbmVsZXNmbiRhLnBhZGRpbmcgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBlbGUgPSB0aGlzWzBdO1xuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIGlmIChlbGUuaXNQYXJlbnQoKSkge1xuICAgIGVsZS51cGRhdGVDb21wb3VuZEJvdW5kcygpO1xuICAgIGlmIChfcC5hdXRvUGFkZGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gX3AuYXV0b1BhZGRpbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBlbGUucHN0eWxlKCdwYWRkaW5nJykucGZWYWx1ZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGVsZS5wc3R5bGUoJ3BhZGRpbmcnKS5wZlZhbHVlO1xuICB9XG59O1xuZWxlc2ZuJGEucGFkZGVkSGVpZ2h0ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZWxlID0gdGhpc1swXTtcbiAgcmV0dXJuIGVsZS5oZWlnaHQoKSArIDIgKiBlbGUucGFkZGluZygpO1xufTtcbmVsZXNmbiRhLnBhZGRlZFdpZHRoID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZWxlID0gdGhpc1swXTtcbiAgcmV0dXJuIGVsZS53aWR0aCgpICsgMiAqIGVsZS5wYWRkaW5nKCk7XG59O1xudmFyIHdpZHRoSGVpZ2h0ID0gZWxlc2ZuJGE7XG5cbnZhciBpZkVkZ2UgPSBmdW5jdGlvbiBpZkVkZ2UoZWxlLCBnZXRWYWx1ZSkge1xuICBpZiAoZWxlLmlzRWRnZSgpICYmIGVsZS50YWtlc1VwU3BhY2UoKSkge1xuICAgIHJldHVybiBnZXRWYWx1ZShlbGUpO1xuICB9XG59O1xudmFyIGlmRWRnZVJlbmRlcmVkUG9zaXRpb24gPSBmdW5jdGlvbiBpZkVkZ2VSZW5kZXJlZFBvc2l0aW9uKGVsZSwgZ2V0UG9pbnQpIHtcbiAgaWYgKGVsZS5pc0VkZ2UoKSAmJiBlbGUudGFrZXNVcFNwYWNlKCkpIHtcbiAgICB2YXIgY3kgPSBlbGUuY3koKTtcbiAgICByZXR1cm4gbW9kZWxUb1JlbmRlcmVkUG9zaXRpb24kMShnZXRQb2ludChlbGUpLCBjeS56b29tKCksIGN5LnBhbigpKTtcbiAgfVxufTtcbnZhciBpZkVkZ2VSZW5kZXJlZFBvc2l0aW9ucyA9IGZ1bmN0aW9uIGlmRWRnZVJlbmRlcmVkUG9zaXRpb25zKGVsZSwgZ2V0UG9pbnRzKSB7XG4gIGlmIChlbGUuaXNFZGdlKCkgJiYgZWxlLnRha2VzVXBTcGFjZSgpKSB7XG4gICAgdmFyIGN5ID0gZWxlLmN5KCk7XG4gICAgdmFyIHBhbiA9IGN5LnBhbigpO1xuICAgIHZhciB6b29tID0gY3kuem9vbSgpO1xuICAgIHJldHVybiBnZXRQb2ludHMoZWxlKS5tYXAoZnVuY3Rpb24gKHApIHtcbiAgICAgIHJldHVybiBtb2RlbFRvUmVuZGVyZWRQb3NpdGlvbiQxKHAsIHpvb20sIHBhbik7XG4gICAgfSk7XG4gIH1cbn07XG52YXIgY29udHJvbFBvaW50cyA9IGZ1bmN0aW9uIGNvbnRyb2xQb2ludHMoZWxlKSB7XG4gIHJldHVybiBlbGUucmVuZGVyZXIoKS5nZXRDb250cm9sUG9pbnRzKGVsZSk7XG59O1xudmFyIHNlZ21lbnRQb2ludHMgPSBmdW5jdGlvbiBzZWdtZW50UG9pbnRzKGVsZSkge1xuICByZXR1cm4gZWxlLnJlbmRlcmVyKCkuZ2V0U2VnbWVudFBvaW50cyhlbGUpO1xufTtcbnZhciBzb3VyY2VFbmRwb2ludCA9IGZ1bmN0aW9uIHNvdXJjZUVuZHBvaW50KGVsZSkge1xuICByZXR1cm4gZWxlLnJlbmRlcmVyKCkuZ2V0U291cmNlRW5kcG9pbnQoZWxlKTtcbn07XG52YXIgdGFyZ2V0RW5kcG9pbnQgPSBmdW5jdGlvbiB0YXJnZXRFbmRwb2ludChlbGUpIHtcbiAgcmV0dXJuIGVsZS5yZW5kZXJlcigpLmdldFRhcmdldEVuZHBvaW50KGVsZSk7XG59O1xudmFyIG1pZHBvaW50ID0gZnVuY3Rpb24gbWlkcG9pbnQoZWxlKSB7XG4gIHJldHVybiBlbGUucmVuZGVyZXIoKS5nZXRFZGdlTWlkcG9pbnQoZWxlKTtcbn07XG52YXIgcHRzID0ge1xuICBjb250cm9sUG9pbnRzOiB7XG4gICAgZ2V0OiBjb250cm9sUG9pbnRzLFxuICAgIG11bHQ6IHRydWVcbiAgfSxcbiAgc2VnbWVudFBvaW50czoge1xuICAgIGdldDogc2VnbWVudFBvaW50cyxcbiAgICBtdWx0OiB0cnVlXG4gIH0sXG4gIHNvdXJjZUVuZHBvaW50OiB7XG4gICAgZ2V0OiBzb3VyY2VFbmRwb2ludFxuICB9LFxuICB0YXJnZXRFbmRwb2ludDoge1xuICAgIGdldDogdGFyZ2V0RW5kcG9pbnRcbiAgfSxcbiAgbWlkcG9pbnQ6IHtcbiAgICBnZXQ6IG1pZHBvaW50XG4gIH1cbn07XG52YXIgcmVuZGVyZWROYW1lID0gZnVuY3Rpb24gcmVuZGVyZWROYW1lKG5hbWUpIHtcbiAgcmV0dXJuICdyZW5kZXJlZCcgKyBuYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnN1YnN0cigxKTtcbn07XG52YXIgZWRnZVBvaW50cyA9IE9iamVjdC5rZXlzKHB0cykucmVkdWNlKGZ1bmN0aW9uIChvYmosIG5hbWUpIHtcbiAgdmFyIHNwZWMgPSBwdHNbbmFtZV07XG4gIHZhciByTmFtZSA9IHJlbmRlcmVkTmFtZShuYW1lKTtcbiAgb2JqW25hbWVdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBpZkVkZ2UodGhpcywgc3BlYy5nZXQpO1xuICB9O1xuICBpZiAoc3BlYy5tdWx0KSB7XG4gICAgb2JqW3JOYW1lXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBpZkVkZ2VSZW5kZXJlZFBvc2l0aW9ucyh0aGlzLCBzcGVjLmdldCk7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBvYmpbck5hbWVdID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGlmRWRnZVJlbmRlcmVkUG9zaXRpb24odGhpcywgc3BlYy5nZXQpO1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIG9iajtcbn0sIHt9KTtcblxudmFyIGRpbWVuc2lvbnMgPSBleHRlbmQoe30sIHBvc2l0aW9uLCBib3VuZHMsIHdpZHRoSGVpZ2h0LCBlZGdlUG9pbnRzKTtcblxuLyohXG5FdmVudCBvYmplY3QgYmFzZWQgb24galF1ZXJ5IGV2ZW50cywgTUlUIGxpY2Vuc2VcblxuaHR0cHM6Ly9qcXVlcnkub3JnL2xpY2Vuc2UvXG5odHRwczovL3RsZHJsZWdhbC5jb20vbGljZW5zZS9taXQtbGljZW5zZVxuaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnkvYmxvYi9tYXN0ZXIvc3JjL2V2ZW50LmpzXG4qL1xuXG52YXIgRXZlbnQgPSBmdW5jdGlvbiBFdmVudChzcmMsIHByb3BzKSB7XG4gIHRoaXMucmVjeWNsZShzcmMsIHByb3BzKTtcbn07XG5mdW5jdGlvbiByZXR1cm5GYWxzZSgpIHtcbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gcmV0dXJuVHJ1ZSgpIHtcbiAgcmV0dXJuIHRydWU7XG59XG5cbi8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMDMwMzMxL2VjbWEtc2NyaXB0LWJpbmRpbmcuaHRtbFxuRXZlbnQucHJvdG90eXBlID0ge1xuICBpbnN0YW5jZVN0cmluZzogZnVuY3Rpb24gaW5zdGFuY2VTdHJpbmcoKSB7XG4gICAgcmV0dXJuICdldmVudCc7XG4gIH0sXG4gIHJlY3ljbGU6IGZ1bmN0aW9uIHJlY3ljbGUoc3JjLCBwcm9wcykge1xuICAgIHRoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSB0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSByZXR1cm5GYWxzZTtcbiAgICBpZiAoc3JjICE9IG51bGwgJiYgc3JjLnByZXZlbnREZWZhdWx0KSB7XG4gICAgICAvLyBCcm93c2VyIEV2ZW50IG9iamVjdFxuICAgICAgdGhpcy50eXBlID0gc3JjLnR5cGU7XG5cbiAgICAgIC8vIEV2ZW50cyBidWJibGluZyB1cCB0aGUgZG9jdW1lbnQgbWF5IGhhdmUgYmVlbiBtYXJrZWQgYXMgcHJldmVudGVkXG4gICAgICAvLyBieSBhIGhhbmRsZXIgbG93ZXIgZG93biB0aGUgdHJlZTsgcmVmbGVjdCB0aGUgY29ycmVjdCB2YWx1ZS5cbiAgICAgIHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gc3JjLmRlZmF1bHRQcmV2ZW50ZWQgPyByZXR1cm5UcnVlIDogcmV0dXJuRmFsc2U7XG4gICAgfSBlbHNlIGlmIChzcmMgIT0gbnVsbCAmJiBzcmMudHlwZSkge1xuICAgICAgLy8gUGxhaW4gb2JqZWN0IGNvbnRhaW5pbmcgYWxsIGV2ZW50IGRldGFpbHNcbiAgICAgIHByb3BzID0gc3JjO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBFdmVudCBzdHJpbmdcbiAgICAgIHRoaXMudHlwZSA9IHNyYztcbiAgICB9XG5cbiAgICAvLyBQdXQgZXhwbGljaXRseSBwcm92aWRlZCBwcm9wZXJ0aWVzIG9udG8gdGhlIGV2ZW50IG9iamVjdFxuICAgIGlmIChwcm9wcyAhPSBudWxsKSB7XG4gICAgICAvLyBtb3JlIGVmZmljaWVudCB0byBtYW51YWxseSBjb3B5IGZpZWxkcyB3ZSB1c2VcbiAgICAgIHRoaXMub3JpZ2luYWxFdmVudCA9IHByb3BzLm9yaWdpbmFsRXZlbnQ7XG4gICAgICB0aGlzLnR5cGUgPSBwcm9wcy50eXBlICE9IG51bGwgPyBwcm9wcy50eXBlIDogdGhpcy50eXBlO1xuICAgICAgdGhpcy5jeSA9IHByb3BzLmN5O1xuICAgICAgdGhpcy50YXJnZXQgPSBwcm9wcy50YXJnZXQ7XG4gICAgICB0aGlzLnBvc2l0aW9uID0gcHJvcHMucG9zaXRpb247XG4gICAgICB0aGlzLnJlbmRlcmVkUG9zaXRpb24gPSBwcm9wcy5yZW5kZXJlZFBvc2l0aW9uO1xuICAgICAgdGhpcy5uYW1lc3BhY2UgPSBwcm9wcy5uYW1lc3BhY2U7XG4gICAgICB0aGlzLmxheW91dCA9IHByb3BzLmxheW91dDtcbiAgICB9XG4gICAgaWYgKHRoaXMuY3kgIT0gbnVsbCAmJiB0aGlzLnBvc2l0aW9uICE9IG51bGwgJiYgdGhpcy5yZW5kZXJlZFBvc2l0aW9uID09IG51bGwpIHtcbiAgICAgIC8vIGNyZWF0ZSBhIHJlbmRlcmVkIHBvc2l0aW9uIGJhc2VkIG9uIHRoZSBwYXNzZWQgcG9zaXRpb25cbiAgICAgIHZhciBwb3MgPSB0aGlzLnBvc2l0aW9uO1xuICAgICAgdmFyIHpvb20gPSB0aGlzLmN5Lnpvb20oKTtcbiAgICAgIHZhciBwYW4gPSB0aGlzLmN5LnBhbigpO1xuICAgICAgdGhpcy5yZW5kZXJlZFBvc2l0aW9uID0ge1xuICAgICAgICB4OiBwb3MueCAqIHpvb20gKyBwYW4ueCxcbiAgICAgICAgeTogcG9zLnkgKiB6b29tICsgcGFuLnlcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGEgdGltZXN0YW1wIGlmIGluY29taW5nIGV2ZW50IGRvZXNuJ3QgaGF2ZSBvbmVcbiAgICB0aGlzLnRpbWVTdGFtcCA9IHNyYyAmJiBzcmMudGltZVN0YW1wIHx8IERhdGUubm93KCk7XG4gIH0sXG4gIHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbiBwcmV2ZW50RGVmYXVsdCgpIHtcbiAgICB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IHJldHVyblRydWU7XG4gICAgdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7XG4gICAgaWYgKCFlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gaWYgcHJldmVudERlZmF1bHQgZXhpc3RzIHJ1biBpdCBvbiB0aGUgb3JpZ2luYWwgZXZlbnRcbiAgICBpZiAoZS5wcmV2ZW50RGVmYXVsdCkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfSxcbiAgc3RvcFByb3BhZ2F0aW9uOiBmdW5jdGlvbiBzdG9wUHJvcGFnYXRpb24oKSB7XG4gICAgdGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7XG4gICAgdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7XG4gICAgaWYgKCFlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gaWYgc3RvcFByb3BhZ2F0aW9uIGV4aXN0cyBydW4gaXQgb24gdGhlIG9yaWdpbmFsIGV2ZW50XG4gICAgaWYgKGUuc3RvcFByb3BhZ2F0aW9uKSB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cbiAgfSxcbiAgc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOiBmdW5jdGlvbiBzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSB7XG4gICAgdGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7XG4gICAgdGhpcy5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfSxcbiAgaXNEZWZhdWx0UHJldmVudGVkOiByZXR1cm5GYWxzZSxcbiAgaXNQcm9wYWdhdGlvblN0b3BwZWQ6IHJldHVybkZhbHNlLFxuICBpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2Vcbn07XG5cbnZhciBldmVudFJlZ2V4ID0gL14oW14uXSspKFxcLig/OlteLl0rKSk/JC87IC8vIHJlZ2V4IGZvciBtYXRjaGluZyBldmVudCBzdHJpbmdzIChlLmcuIFwiY2xpY2submFtZXNwYWNlXCIpXG52YXIgdW5pdmVyc2FsTmFtZXNwYWNlID0gJy4qJzsgLy8gbWF0Y2hlcyBhcyBpZiBubyBuYW1lc3BhY2Ugc3BlY2lmaWVkIGFuZCBwcmV2ZW50cyB1c2VycyBmcm9tIHVuYmluZGluZyBhY2NpZGVudGFsbHlcblxudmFyIGRlZmF1bHRzJDggPSB7XG4gIHF1YWxpZmllckNvbXBhcmU6IGZ1bmN0aW9uIHF1YWxpZmllckNvbXBhcmUocTEsIHEyKSB7XG4gICAgcmV0dXJuIHExID09PSBxMjtcbiAgfSxcbiAgZXZlbnRNYXRjaGVzOiBmdW5jdGlvbiBldmVudE1hdGNoZXMoLypjb250ZXh0LCBsaXN0ZW5lciwgZXZlbnRPYmoqL1xuICApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgYWRkRXZlbnRGaWVsZHM6IGZ1bmN0aW9uIGFkZEV2ZW50RmllbGRzKC8qY29udGV4dCwgZXZ0Ki9cbiAgKSB7fSxcbiAgY2FsbGJhY2tDb250ZXh0OiBmdW5jdGlvbiBjYWxsYmFja0NvbnRleHQoY29udGV4dCAvKiwgbGlzdGVuZXIsIGV2ZW50T2JqKi8pIHtcbiAgICByZXR1cm4gY29udGV4dDtcbiAgfSxcbiAgYmVmb3JlRW1pdDogZnVuY3Rpb24gYmVmb3JlRW1pdCgvKiBjb250ZXh0LCBsaXN0ZW5lciwgZXZlbnRPYmogKi9cbiAgKSB7fSxcbiAgYWZ0ZXJFbWl0OiBmdW5jdGlvbiBhZnRlckVtaXQoLyogY29udGV4dCwgbGlzdGVuZXIsIGV2ZW50T2JqICovXG4gICkge30sXG4gIGJ1YmJsZTogZnVuY3Rpb24gYnViYmxlKC8qY29udGV4dCovXG4gICkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgcGFyZW50OiBmdW5jdGlvbiBwYXJlbnQoLypjb250ZXh0Ki9cbiAgKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0sXG4gIGNvbnRleHQ6IG51bGxcbn07XG52YXIgZGVmYXVsdHNLZXlzID0gT2JqZWN0LmtleXMoZGVmYXVsdHMkOCk7XG52YXIgZW1wdHlPcHRzID0ge307XG5mdW5jdGlvbiBFbWl0dGVyKCkge1xuICB2YXIgb3B0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZW1wdHlPcHRzO1xuICB2YXIgY29udGV4dCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkO1xuICAvLyBtaWNyby1vcHRpbWlzYXRpb24gdnMgT2JqZWN0LmFzc2lnbigpIC0tIHJlZHVjZXMgRWxlbWVudCBpbnN0YW50aWF0aW9uIHRpbWVcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZWZhdWx0c0tleXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIga2V5ID0gZGVmYXVsdHNLZXlzW2ldO1xuICAgIHRoaXNba2V5XSA9IG9wdHNba2V5XSB8fCBkZWZhdWx0cyQ4W2tleV07XG4gIH1cbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dCB8fCB0aGlzLmNvbnRleHQ7XG4gIHRoaXMubGlzdGVuZXJzID0gW107XG4gIHRoaXMuZW1pdHRpbmcgPSAwO1xufVxudmFyIHAgPSBFbWl0dGVyLnByb3RvdHlwZTtcbnZhciBmb3JFYWNoRXZlbnQgPSBmdW5jdGlvbiBmb3JFYWNoRXZlbnQoc2VsZiwgaGFuZGxlciwgZXZlbnRzLCBxdWFsaWZpZXIsIGNhbGxiYWNrLCBjb25mLCBjb25mT3ZlcnJpZGVzKSB7XG4gIGlmIChmbiQ2KHF1YWxpZmllcikpIHtcbiAgICBjYWxsYmFjayA9IHF1YWxpZmllcjtcbiAgICBxdWFsaWZpZXIgPSBudWxsO1xuICB9XG4gIGlmIChjb25mT3ZlcnJpZGVzKSB7XG4gICAgaWYgKGNvbmYgPT0gbnVsbCkge1xuICAgICAgY29uZiA9IGNvbmZPdmVycmlkZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbmYgPSBleHRlbmQoe30sIGNvbmYsIGNvbmZPdmVycmlkZXMpO1xuICAgIH1cbiAgfVxuICB2YXIgZXZlbnRMaXN0ID0gYXJyYXkoZXZlbnRzKSA/IGV2ZW50cyA6IGV2ZW50cy5zcGxpdCgvXFxzKy8pO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGV2ZW50TGlzdC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBldnQgPSBldmVudExpc3RbaV07XG4gICAgaWYgKGVtcHR5U3RyaW5nKGV2dCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB2YXIgbWF0Y2ggPSBldnQubWF0Y2goZXZlbnRSZWdleCk7IC8vIHR5cGVbLm5hbWVzcGFjZV1cblxuICAgIGlmIChtYXRjaCkge1xuICAgICAgdmFyIHR5cGUgPSBtYXRjaFsxXTtcbiAgICAgIHZhciBuYW1lc3BhY2UgPSBtYXRjaFsyXSA/IG1hdGNoWzJdIDogbnVsbDtcbiAgICAgIHZhciByZXQgPSBoYW5kbGVyKHNlbGYsIGV2dCwgdHlwZSwgbmFtZXNwYWNlLCBxdWFsaWZpZXIsIGNhbGxiYWNrLCBjb25mKTtcbiAgICAgIGlmIChyZXQgPT09IGZhbHNlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSAvLyBhbGxvdyBleGl0aW5nIGVhcmx5XG4gICAgfVxuICB9XG59O1xudmFyIG1ha2VFdmVudE9iaiA9IGZ1bmN0aW9uIG1ha2VFdmVudE9iaihzZWxmLCBvYmopIHtcbiAgc2VsZi5hZGRFdmVudEZpZWxkcyhzZWxmLmNvbnRleHQsIG9iaik7XG4gIHJldHVybiBuZXcgRXZlbnQob2JqLnR5cGUsIG9iaik7XG59O1xudmFyIGZvckVhY2hFdmVudE9iaiA9IGZ1bmN0aW9uIGZvckVhY2hFdmVudE9iaihzZWxmLCBoYW5kbGVyLCBldmVudHMpIHtcbiAgaWYgKGV2ZW50KGV2ZW50cykpIHtcbiAgICBoYW5kbGVyKHNlbGYsIGV2ZW50cyk7XG4gICAgcmV0dXJuO1xuICB9IGVsc2UgaWYgKHBsYWluT2JqZWN0KGV2ZW50cykpIHtcbiAgICBoYW5kbGVyKHNlbGYsIG1ha2VFdmVudE9iaihzZWxmLCBldmVudHMpKTtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIGV2ZW50TGlzdCA9IGFycmF5KGV2ZW50cykgPyBldmVudHMgOiBldmVudHMuc3BsaXQoL1xccysvKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBldmVudExpc3QubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZXZ0ID0gZXZlbnRMaXN0W2ldO1xuICAgIGlmIChlbXB0eVN0cmluZyhldnQpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdmFyIG1hdGNoID0gZXZ0Lm1hdGNoKGV2ZW50UmVnZXgpOyAvLyB0eXBlWy5uYW1lc3BhY2VdXG5cbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIHZhciB0eXBlID0gbWF0Y2hbMV07XG4gICAgICB2YXIgbmFtZXNwYWNlID0gbWF0Y2hbMl0gPyBtYXRjaFsyXSA6IG51bGw7XG4gICAgICB2YXIgZXZlbnRPYmogPSBtYWtlRXZlbnRPYmooc2VsZiwge1xuICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICBuYW1lc3BhY2U6IG5hbWVzcGFjZSxcbiAgICAgICAgdGFyZ2V0OiBzZWxmLmNvbnRleHRcbiAgICAgIH0pO1xuICAgICAgaGFuZGxlcihzZWxmLCBldmVudE9iaik7XG4gICAgfVxuICB9XG59O1xucC5vbiA9IHAuYWRkTGlzdGVuZXIgPSBmdW5jdGlvbiAoZXZlbnRzLCBxdWFsaWZpZXIsIGNhbGxiYWNrLCBjb25mLCBjb25mT3ZlcnJpZGVzKSB7XG4gIGZvckVhY2hFdmVudCh0aGlzLCBmdW5jdGlvbiAoc2VsZiwgZXZlbnQsIHR5cGUsIG5hbWVzcGFjZSwgcXVhbGlmaWVyLCBjYWxsYmFjaywgY29uZikge1xuICAgIGlmIChmbiQ2KGNhbGxiYWNrKSkge1xuICAgICAgc2VsZi5saXN0ZW5lcnMucHVzaCh7XG4gICAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgICAgLy8gZnVsbCBldmVudCBzdHJpbmdcbiAgICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrLFxuICAgICAgICAvLyBjYWxsYmFjayB0byBydW5cbiAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgLy8gdGhlIGV2ZW50IHR5cGUgKGUuZy4gJ2NsaWNrJylcbiAgICAgICAgbmFtZXNwYWNlOiBuYW1lc3BhY2UsXG4gICAgICAgIC8vIHRoZSBldmVudCBuYW1lc3BhY2UgKGUuZy4gXCIuZm9vXCIpXG4gICAgICAgIHF1YWxpZmllcjogcXVhbGlmaWVyLFxuICAgICAgICAvLyBhIHJlc3RyaWN0aW9uIG9uIHdoZXRoZXIgdG8gbWF0Y2ggdGhpcyBlbWl0dGVyXG4gICAgICAgIGNvbmY6IGNvbmYgLy8gYWRkaXRpb25hbCBjb25maWd1cmF0aW9uXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIGV2ZW50cywgcXVhbGlmaWVyLCBjYWxsYmFjaywgY29uZiwgY29uZk92ZXJyaWRlcyk7XG4gIHJldHVybiB0aGlzO1xufTtcbnAub25lID0gZnVuY3Rpb24gKGV2ZW50cywgcXVhbGlmaWVyLCBjYWxsYmFjaywgY29uZikge1xuICByZXR1cm4gdGhpcy5vbihldmVudHMsIHF1YWxpZmllciwgY2FsbGJhY2ssIGNvbmYsIHtcbiAgICBvbmU6IHRydWVcbiAgfSk7XG59O1xucC5yZW1vdmVMaXN0ZW5lciA9IHAub2ZmID0gZnVuY3Rpb24gKGV2ZW50cywgcXVhbGlmaWVyLCBjYWxsYmFjaywgY29uZikge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuICBpZiAodGhpcy5lbWl0dGluZyAhPT0gMCkge1xuICAgIHRoaXMubGlzdGVuZXJzID0gY29weUFycmF5KHRoaXMubGlzdGVuZXJzKTtcbiAgfVxuICB2YXIgbGlzdGVuZXJzID0gdGhpcy5saXN0ZW5lcnM7XG4gIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKGkpIHtcbiAgICB2YXIgbGlzdGVuZXIgPSBsaXN0ZW5lcnNbaV07XG4gICAgZm9yRWFjaEV2ZW50KF90aGlzLCBmdW5jdGlvbiAoc2VsZiwgZXZlbnQsIHR5cGUsIG5hbWVzcGFjZSwgcXVhbGlmaWVyLCBjYWxsYmFjayAvKiwgY29uZiovKSB7XG4gICAgICBpZiAoKGxpc3RlbmVyLnR5cGUgPT09IHR5cGUgfHwgZXZlbnRzID09PSAnKicpICYmICghbmFtZXNwYWNlICYmIGxpc3RlbmVyLm5hbWVzcGFjZSAhPT0gJy4qJyB8fCBsaXN0ZW5lci5uYW1lc3BhY2UgPT09IG5hbWVzcGFjZSkgJiYgKCFxdWFsaWZpZXIgfHwgc2VsZi5xdWFsaWZpZXJDb21wYXJlKGxpc3RlbmVyLnF1YWxpZmllciwgcXVhbGlmaWVyKSkgJiYgKCFjYWxsYmFjayB8fCBsaXN0ZW5lci5jYWxsYmFjayA9PT0gY2FsbGJhY2spKSB7XG4gICAgICAgIGxpc3RlbmVycy5zcGxpY2UoaSwgMSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9LCBldmVudHMsIHF1YWxpZmllciwgY2FsbGJhY2ssIGNvbmYpO1xuICB9O1xuICBmb3IgKHZhciBpID0gbGlzdGVuZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgX2xvb3AoaSk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xucC5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnJlbW92ZUxpc3RlbmVyKCcqJyk7XG59O1xucC5lbWl0ID0gcC50cmlnZ2VyID0gZnVuY3Rpb24gKGV2ZW50cywgZXh0cmFQYXJhbXMsIG1hbnVhbENhbGxiYWNrKSB7XG4gIHZhciBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVycztcbiAgdmFyIG51bUxpc3RlbmVyc0JlZm9yZUVtaXQgPSBsaXN0ZW5lcnMubGVuZ3RoO1xuICB0aGlzLmVtaXR0aW5nKys7XG4gIGlmICghYXJyYXkoZXh0cmFQYXJhbXMpKSB7XG4gICAgZXh0cmFQYXJhbXMgPSBbZXh0cmFQYXJhbXNdO1xuICB9XG4gIGZvckVhY2hFdmVudE9iaih0aGlzLCBmdW5jdGlvbiAoc2VsZiwgZXZlbnRPYmopIHtcbiAgICBpZiAobWFudWFsQ2FsbGJhY2sgIT0gbnVsbCkge1xuICAgICAgbGlzdGVuZXJzID0gW3tcbiAgICAgICAgZXZlbnQ6IGV2ZW50T2JqLmV2ZW50LFxuICAgICAgICB0eXBlOiBldmVudE9iai50eXBlLFxuICAgICAgICBuYW1lc3BhY2U6IGV2ZW50T2JqLm5hbWVzcGFjZSxcbiAgICAgICAgY2FsbGJhY2s6IG1hbnVhbENhbGxiYWNrXG4gICAgICB9XTtcbiAgICAgIG51bUxpc3RlbmVyc0JlZm9yZUVtaXQgPSBsaXN0ZW5lcnMubGVuZ3RoO1xuICAgIH1cbiAgICB2YXIgX2xvb3AyID0gZnVuY3Rpb24gX2xvb3AyKCkge1xuICAgICAgdmFyIGxpc3RlbmVyID0gbGlzdGVuZXJzW2ldO1xuICAgICAgaWYgKGxpc3RlbmVyLnR5cGUgPT09IGV2ZW50T2JqLnR5cGUgJiYgKCFsaXN0ZW5lci5uYW1lc3BhY2UgfHwgbGlzdGVuZXIubmFtZXNwYWNlID09PSBldmVudE9iai5uYW1lc3BhY2UgfHwgbGlzdGVuZXIubmFtZXNwYWNlID09PSB1bml2ZXJzYWxOYW1lc3BhY2UpICYmIHNlbGYuZXZlbnRNYXRjaGVzKHNlbGYuY29udGV4dCwgbGlzdGVuZXIsIGV2ZW50T2JqKSkge1xuICAgICAgICB2YXIgYXJncyA9IFtldmVudE9ial07XG4gICAgICAgIGlmIChleHRyYVBhcmFtcyAhPSBudWxsKSB7XG4gICAgICAgICAgcHVzaChhcmdzLCBleHRyYVBhcmFtcyk7XG4gICAgICAgIH1cbiAgICAgICAgc2VsZi5iZWZvcmVFbWl0KHNlbGYuY29udGV4dCwgbGlzdGVuZXIsIGV2ZW50T2JqKTtcbiAgICAgICAgaWYgKGxpc3RlbmVyLmNvbmYgJiYgbGlzdGVuZXIuY29uZi5vbmUpIHtcbiAgICAgICAgICBzZWxmLmxpc3RlbmVycyA9IHNlbGYubGlzdGVuZXJzLmZpbHRlcihmdW5jdGlvbiAobCkge1xuICAgICAgICAgICAgcmV0dXJuIGwgIT09IGxpc3RlbmVyO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjb250ZXh0ID0gc2VsZi5jYWxsYmFja0NvbnRleHQoc2VsZi5jb250ZXh0LCBsaXN0ZW5lciwgZXZlbnRPYmopO1xuICAgICAgICB2YXIgcmV0ID0gbGlzdGVuZXIuY2FsbGJhY2suYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgICAgIHNlbGYuYWZ0ZXJFbWl0KHNlbGYuY29udGV4dCwgbGlzdGVuZXIsIGV2ZW50T2JqKTtcbiAgICAgICAgaWYgKHJldCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBldmVudE9iai5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBldmVudE9iai5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICB9IC8vIGlmIGxpc3RlbmVyIG1hdGNoZXNcbiAgICB9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtTGlzdGVuZXJzQmVmb3JlRW1pdDsgaSsrKSB7XG4gICAgICBfbG9vcDIoKTtcbiAgICB9IC8vIGZvciBsaXN0ZW5lclxuXG4gICAgaWYgKHNlbGYuYnViYmxlKHNlbGYuY29udGV4dCkgJiYgIWV2ZW50T2JqLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpIHtcbiAgICAgIHNlbGYucGFyZW50KHNlbGYuY29udGV4dCkuZW1pdChldmVudE9iaiwgZXh0cmFQYXJhbXMpO1xuICAgIH1cbiAgfSwgZXZlbnRzKTtcbiAgdGhpcy5lbWl0dGluZy0tO1xuICByZXR1cm4gdGhpcztcbn07XG5cbnZhciBlbWl0dGVyT3B0aW9ucyQxID0ge1xuICBxdWFsaWZpZXJDb21wYXJlOiBmdW5jdGlvbiBxdWFsaWZpZXJDb21wYXJlKHNlbGVjdG9yMSwgc2VsZWN0b3IyKSB7XG4gICAgaWYgKHNlbGVjdG9yMSA9PSBudWxsIHx8IHNlbGVjdG9yMiA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gc2VsZWN0b3IxID09IG51bGwgJiYgc2VsZWN0b3IyID09IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBzZWxlY3RvcjEuc2FtZVRleHQoc2VsZWN0b3IyKTtcbiAgICB9XG4gIH0sXG4gIGV2ZW50TWF0Y2hlczogZnVuY3Rpb24gZXZlbnRNYXRjaGVzKGVsZSwgbGlzdGVuZXIsIGV2ZW50T2JqKSB7XG4gICAgdmFyIHNlbGVjdG9yID0gbGlzdGVuZXIucXVhbGlmaWVyO1xuICAgIGlmIChzZWxlY3RvciAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gZWxlICE9PSBldmVudE9iai50YXJnZXQgJiYgZWxlbWVudChldmVudE9iai50YXJnZXQpICYmIHNlbGVjdG9yLm1hdGNoZXMoZXZlbnRPYmoudGFyZ2V0KTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIGFkZEV2ZW50RmllbGRzOiBmdW5jdGlvbiBhZGRFdmVudEZpZWxkcyhlbGUsIGV2dCkge1xuICAgIGV2dC5jeSA9IGVsZS5jeSgpO1xuICAgIGV2dC50YXJnZXQgPSBlbGU7XG4gIH0sXG4gIGNhbGxiYWNrQ29udGV4dDogZnVuY3Rpb24gY2FsbGJhY2tDb250ZXh0KGVsZSwgbGlzdGVuZXIsIGV2ZW50T2JqKSB7XG4gICAgcmV0dXJuIGxpc3RlbmVyLnF1YWxpZmllciAhPSBudWxsID8gZXZlbnRPYmoudGFyZ2V0IDogZWxlO1xuICB9LFxuICBiZWZvcmVFbWl0OiBmdW5jdGlvbiBiZWZvcmVFbWl0KGNvbnRleHQsIGxpc3RlbmVyIC8qLCBldmVudE9iaiovKSB7XG4gICAgaWYgKGxpc3RlbmVyLmNvbmYgJiYgbGlzdGVuZXIuY29uZi5vbmNlKSB7XG4gICAgICBsaXN0ZW5lci5jb25mLm9uY2VDb2xsZWN0aW9uLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyLmV2ZW50LCBsaXN0ZW5lci5xdWFsaWZpZXIsIGxpc3RlbmVyLmNhbGxiYWNrKTtcbiAgICB9XG4gIH0sXG4gIGJ1YmJsZTogZnVuY3Rpb24gYnViYmxlKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICBwYXJlbnQ6IGZ1bmN0aW9uIHBhcmVudChlbGUpIHtcbiAgICByZXR1cm4gZWxlLmlzQ2hpbGQoKSA/IGVsZS5wYXJlbnQoKSA6IGVsZS5jeSgpO1xuICB9XG59O1xudmFyIGFyZ1NlbGVjdG9yJDEgPSBmdW5jdGlvbiBhcmdTZWxlY3RvcihhcmcpIHtcbiAgaWYgKHN0cmluZyhhcmcpKSB7XG4gICAgcmV0dXJuIG5ldyBTZWxlY3RvcihhcmcpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBhcmc7XG4gIH1cbn07XG52YXIgZWxlc2ZuJDkgPSB7XG4gIGNyZWF0ZUVtaXR0ZXI6IGZ1bmN0aW9uIGNyZWF0ZUVtaXR0ZXIoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICAgIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgICAgIGlmICghX3AuZW1pdHRlcikge1xuICAgICAgICBfcC5lbWl0dGVyID0gbmV3IEVtaXR0ZXIoZW1pdHRlck9wdGlvbnMkMSwgZWxlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIGVtaXR0ZXI6IGZ1bmN0aW9uIGVtaXR0ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuZW1pdHRlcjtcbiAgfSxcbiAgb246IGZ1bmN0aW9uIG9uKGV2ZW50cywgc2VsZWN0b3IsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGFyZ1NlbCA9IGFyZ1NlbGVjdG9yJDEoc2VsZWN0b3IpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IHRoaXNbaV07XG4gICAgICBlbGUuZW1pdHRlcigpLm9uKGV2ZW50cywgYXJnU2VsLCBjYWxsYmFjayk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICByZW1vdmVMaXN0ZW5lcjogZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXIoZXZlbnRzLCBzZWxlY3RvciwgY2FsbGJhY2spIHtcbiAgICB2YXIgYXJnU2VsID0gYXJnU2VsZWN0b3IkMShzZWxlY3Rvcik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICAgIGVsZS5lbWl0dGVyKCkucmVtb3ZlTGlzdGVuZXIoZXZlbnRzLCBhcmdTZWwsIGNhbGxiYWNrKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIHJlbW92ZUFsbExpc3RlbmVyczogZnVuY3Rpb24gcmVtb3ZlQWxsTGlzdGVuZXJzKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IHRoaXNbaV07XG4gICAgICBlbGUuZW1pdHRlcigpLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgb25lOiBmdW5jdGlvbiBvbmUoZXZlbnRzLCBzZWxlY3RvciwgY2FsbGJhY2spIHtcbiAgICB2YXIgYXJnU2VsID0gYXJnU2VsZWN0b3IkMShzZWxlY3Rvcik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICAgIGVsZS5lbWl0dGVyKCkub25lKGV2ZW50cywgYXJnU2VsLCBjYWxsYmFjayk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBvbmNlOiBmdW5jdGlvbiBvbmNlKGV2ZW50cywgc2VsZWN0b3IsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGFyZ1NlbCA9IGFyZ1NlbGVjdG9yJDEoc2VsZWN0b3IpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IHRoaXNbaV07XG4gICAgICBlbGUuZW1pdHRlcigpLm9uKGV2ZW50cywgYXJnU2VsLCBjYWxsYmFjaywge1xuICAgICAgICBvbmNlOiB0cnVlLFxuICAgICAgICBvbmNlQ29sbGVjdGlvbjogdGhpc1xuICAgICAgfSk7XG4gICAgfVxuICB9LFxuICBlbWl0OiBmdW5jdGlvbiBlbWl0KGV2ZW50cywgZXh0cmFQYXJhbXMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbGUgPSB0aGlzW2ldO1xuICAgICAgZWxlLmVtaXR0ZXIoKS5lbWl0KGV2ZW50cywgZXh0cmFQYXJhbXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgZW1pdEFuZE5vdGlmeTogZnVuY3Rpb24gZW1pdEFuZE5vdGlmeShldmVudCwgZXh0cmFQYXJhbXMpIHtcbiAgICAvLyBmb3IgaW50ZXJuYWwgdXNlIG9ubHlcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIGVtcHR5IGNvbGxlY3Rpb25zIGRvbid0IG5lZWQgdG8gbm90aWZ5IGFueXRoaW5nXG5cbiAgICAvLyBub3RpZnkgcmVuZGVyZXJcbiAgICB0aGlzLmN5KCkubm90aWZ5KGV2ZW50LCB0aGlzKTtcbiAgICB0aGlzLmVtaXQoZXZlbnQsIGV4dHJhUGFyYW1zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufTtcbmRlZmluZS5ldmVudEFsaWFzZXNPbihlbGVzZm4kOSk7XG5cbnZhciBlbGVzZm4kOCA9IHtcbiAgbm9kZXM6IGZ1bmN0aW9uIG5vZGVzKHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHJldHVybiBlbGUuaXNOb2RlKCk7XG4gICAgfSkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfSxcbiAgZWRnZXM6IGZ1bmN0aW9uIGVkZ2VzKHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHJldHVybiBlbGUuaXNFZGdlKCk7XG4gICAgfSkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfSxcbiAgLy8gaW50ZXJuYWwgaGVscGVyIHRvIGdldCBub2RlcyBhbmQgZWRnZXMgYXMgc2VwYXJhdGUgY29sbGVjdGlvbnMgd2l0aCBzaW5nbGUgaXRlcmF0aW9uIG92ZXIgZWxlbWVudHNcbiAgYnlHcm91cDogZnVuY3Rpb24gYnlHcm91cCgpIHtcbiAgICB2YXIgbm9kZXMgPSB0aGlzLnNwYXduKCk7XG4gICAgdmFyIGVkZ2VzID0gdGhpcy5zcGF3bigpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IHRoaXNbaV07XG4gICAgICBpZiAoZWxlLmlzTm9kZSgpKSB7XG4gICAgICAgIG5vZGVzLnB1c2goZWxlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVkZ2VzLnB1c2goZWxlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG5vZGVzOiBub2RlcyxcbiAgICAgIGVkZ2VzOiBlZGdlc1xuICAgIH07XG4gIH0sXG4gIGZpbHRlcjogZnVuY3Rpb24gZmlsdGVyKF9maWx0ZXIsIHRoaXNBcmcpIHtcbiAgICBpZiAoX2ZpbHRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBjaGVjayB0aGlzIGZpcnN0IGIvYyBpdCdzIHRoZSBtb3N0IGNvbW1vbi9wZXJmb3JtYW50IGNhc2VcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0gZWxzZSBpZiAoc3RyaW5nKF9maWx0ZXIpIHx8IGVsZW1lbnRPckNvbGxlY3Rpb24oX2ZpbHRlcikpIHtcbiAgICAgIHJldHVybiBuZXcgU2VsZWN0b3IoX2ZpbHRlcikuZmlsdGVyKHRoaXMpO1xuICAgIH0gZWxzZSBpZiAoZm4kNihfZmlsdGVyKSkge1xuICAgICAgdmFyIGZpbHRlckVsZXMgPSB0aGlzLnNwYXduKCk7XG4gICAgICB2YXIgZWxlcyA9IHRoaXM7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgICAgIHZhciBpbmNsdWRlID0gdGhpc0FyZyA/IF9maWx0ZXIuYXBwbHkodGhpc0FyZywgW2VsZSwgaSwgZWxlc10pIDogX2ZpbHRlcihlbGUsIGksIGVsZXMpO1xuICAgICAgICBpZiAoaW5jbHVkZSkge1xuICAgICAgICAgIGZpbHRlckVsZXMucHVzaChlbGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmlsdGVyRWxlcztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3Bhd24oKTsgLy8gaWYgbm90IGhhbmRsZWQgYnkgYWJvdmUsIGdpdmUgJ2VtIGFuIGVtcHR5IGNvbGxlY3Rpb25cbiAgfSxcbiAgbm90OiBmdW5jdGlvbiBub3QodG9SZW1vdmUpIHtcbiAgICBpZiAoIXRvUmVtb3ZlKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHN0cmluZyh0b1JlbW92ZSkpIHtcbiAgICAgICAgdG9SZW1vdmUgPSB0aGlzLmZpbHRlcih0b1JlbW92ZSk7XG4gICAgICB9XG4gICAgICB2YXIgZWxlbWVudHMgPSB0aGlzLnNwYXduKCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVsZW1lbnQgPSB0aGlzW2ldO1xuICAgICAgICB2YXIgcmVtb3ZlID0gdG9SZW1vdmUuaGFzKGVsZW1lbnQpO1xuICAgICAgICBpZiAoIXJlbW92ZSkge1xuICAgICAgICAgIGVsZW1lbnRzLnB1c2goZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBlbGVtZW50cztcbiAgICB9XG4gIH0sXG4gIGFic29sdXRlQ29tcGxlbWVudDogZnVuY3Rpb24gYWJzb2x1dGVDb21wbGVtZW50KCkge1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgICByZXR1cm4gY3kubXV0YWJsZUVsZW1lbnRzKCkubm90KHRoaXMpO1xuICB9LFxuICBpbnRlcnNlY3Q6IGZ1bmN0aW9uIGludGVyc2VjdChvdGhlcikge1xuICAgIC8vIGlmIGEgc2VsZWN0b3IgaXMgc3BlY2lmaWVkLCB0aGVuIGZpbHRlciBieSBpdCBpbnN0ZWFkXG4gICAgaWYgKHN0cmluZyhvdGhlcikpIHtcbiAgICAgIHZhciBzZWxlY3RvciA9IG90aGVyO1xuICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyKHNlbGVjdG9yKTtcbiAgICB9XG4gICAgdmFyIGVsZW1lbnRzID0gdGhpcy5zcGF3bigpO1xuICAgIHZhciBjb2wxID0gdGhpcztcbiAgICB2YXIgY29sMiA9IG90aGVyO1xuICAgIHZhciBjb2wxU21hbGxlciA9IHRoaXMubGVuZ3RoIDwgb3RoZXIubGVuZ3RoO1xuICAgIHZhciBjb2xTID0gY29sMVNtYWxsZXIgPyBjb2wxIDogY29sMjtcbiAgICB2YXIgY29sTCA9IGNvbDFTbWFsbGVyID8gY29sMiA6IGNvbDE7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2xTLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gY29sU1tpXTtcbiAgICAgIGlmIChjb2xMLmhhcyhlbGUpKSB7XG4gICAgICAgIGVsZW1lbnRzLnB1c2goZWxlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnRzO1xuICB9LFxuICB4b3I6IGZ1bmN0aW9uIHhvcihvdGhlcikge1xuICAgIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3k7XG4gICAgaWYgKHN0cmluZyhvdGhlcikpIHtcbiAgICAgIG90aGVyID0gY3kuJChvdGhlcik7XG4gICAgfVxuICAgIHZhciBlbGVtZW50cyA9IHRoaXMuc3Bhd24oKTtcbiAgICB2YXIgY29sMSA9IHRoaXM7XG4gICAgdmFyIGNvbDIgPSBvdGhlcjtcbiAgICB2YXIgYWRkID0gZnVuY3Rpb24gYWRkKGNvbCwgb3RoZXIpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29sLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBlbGUgPSBjb2xbaV07XG4gICAgICAgIHZhciBpZCA9IGVsZS5fcHJpdmF0ZS5kYXRhLmlkO1xuICAgICAgICB2YXIgaW5PdGhlciA9IG90aGVyLmhhc0VsZW1lbnRXaXRoSWQoaWQpO1xuICAgICAgICBpZiAoIWluT3RoZXIpIHtcbiAgICAgICAgICBlbGVtZW50cy5wdXNoKGVsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIGFkZChjb2wxLCBjb2wyKTtcbiAgICBhZGQoY29sMiwgY29sMSk7XG4gICAgcmV0dXJuIGVsZW1lbnRzO1xuICB9LFxuICBkaWZmOiBmdW5jdGlvbiBkaWZmKG90aGVyKSB7XG4gICAgdmFyIGN5ID0gdGhpcy5fcHJpdmF0ZS5jeTtcbiAgICBpZiAoc3RyaW5nKG90aGVyKSkge1xuICAgICAgb3RoZXIgPSBjeS4kKG90aGVyKTtcbiAgICB9XG4gICAgdmFyIGxlZnQgPSB0aGlzLnNwYXduKCk7XG4gICAgdmFyIHJpZ2h0ID0gdGhpcy5zcGF3bigpO1xuICAgIHZhciBib3RoID0gdGhpcy5zcGF3bigpO1xuICAgIHZhciBjb2wxID0gdGhpcztcbiAgICB2YXIgY29sMiA9IG90aGVyO1xuICAgIHZhciBhZGQgPSBmdW5jdGlvbiBhZGQoY29sLCBvdGhlciwgcmV0RWxlcykge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2wubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVsZSA9IGNvbFtpXTtcbiAgICAgICAgdmFyIGlkID0gZWxlLl9wcml2YXRlLmRhdGEuaWQ7XG4gICAgICAgIHZhciBpbk90aGVyID0gb3RoZXIuaGFzRWxlbWVudFdpdGhJZChpZCk7XG4gICAgICAgIGlmIChpbk90aGVyKSB7XG4gICAgICAgICAgYm90aC5tZXJnZShlbGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldEVsZXMucHVzaChlbGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICBhZGQoY29sMSwgY29sMiwgbGVmdCk7XG4gICAgYWRkKGNvbDIsIGNvbDEsIHJpZ2h0KTtcbiAgICByZXR1cm4ge1xuICAgICAgbGVmdDogbGVmdCxcbiAgICAgIHJpZ2h0OiByaWdodCxcbiAgICAgIGJvdGg6IGJvdGhcbiAgICB9O1xuICB9LFxuICBhZGQ6IGZ1bmN0aW9uIGFkZCh0b0FkZCkge1xuICAgIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3k7XG4gICAgaWYgKCF0b0FkZCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGlmIChzdHJpbmcodG9BZGQpKSB7XG4gICAgICB2YXIgc2VsZWN0b3IgPSB0b0FkZDtcbiAgICAgIHRvQWRkID0gY3kubXV0YWJsZUVsZW1lbnRzKCkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgICB9XG4gICAgdmFyIGVsZW1lbnRzID0gdGhpcy5zcGF3blNlbGYoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRvQWRkLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gdG9BZGRbaV07XG4gICAgICB2YXIgYWRkID0gIXRoaXMuaGFzKGVsZSk7XG4gICAgICBpZiAoYWRkKSB7XG4gICAgICAgIGVsZW1lbnRzLnB1c2goZWxlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnRzO1xuICB9LFxuICAvLyBpbiBwbGFjZSBtZXJnZSBvbiBjYWxsaW5nIGNvbGxlY3Rpb25cbiAgbWVyZ2U6IGZ1bmN0aW9uIG1lcmdlKHRvQWRkKSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICB2YXIgY3kgPSBfcC5jeTtcbiAgICBpZiAoIXRvQWRkKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgaWYgKHRvQWRkICYmIHN0cmluZyh0b0FkZCkpIHtcbiAgICAgIHZhciBzZWxlY3RvciA9IHRvQWRkO1xuICAgICAgdG9BZGQgPSBjeS5tdXRhYmxlRWxlbWVudHMoKS5maWx0ZXIoc2VsZWN0b3IpO1xuICAgIH1cbiAgICB2YXIgbWFwID0gX3AubWFwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9BZGQubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB0b0FkZEVsZSA9IHRvQWRkW2ldO1xuICAgICAgdmFyIGlkID0gdG9BZGRFbGUuX3ByaXZhdGUuZGF0YS5pZDtcbiAgICAgIHZhciBhZGQgPSAhbWFwLmhhcyhpZCk7XG4gICAgICBpZiAoYWRkKSB7XG4gICAgICAgIHZhciBpbmRleCA9IHRoaXMubGVuZ3RoKys7XG4gICAgICAgIHRoaXNbaW5kZXhdID0gdG9BZGRFbGU7XG4gICAgICAgIG1hcC5zZXQoaWQsIHtcbiAgICAgICAgICBlbGU6IHRvQWRkRWxlLFxuICAgICAgICAgIGluZGV4OiBpbmRleFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG4gIHVubWVyZ2VBdDogZnVuY3Rpb24gdW5tZXJnZUF0KGkpIHtcbiAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICB2YXIgaWQgPSBlbGUuaWQoKTtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuICAgIHZhciBtYXAgPSBfcC5tYXA7XG5cbiAgICAvLyByZW1vdmUgZWxlXG4gICAgdGhpc1tpXSA9IHVuZGVmaW5lZDtcbiAgICBtYXBbXCJkZWxldGVcIl0oaWQpO1xuICAgIHZhciB1bm1lcmdlZExhc3RFbGUgPSBpID09PSB0aGlzLmxlbmd0aCAtIDE7XG5cbiAgICAvLyByZXBsYWNlIGVtcHR5IHNwb3Qgd2l0aCBsYXN0IGVsZSBpbiBjb2xsZWN0aW9uXG4gICAgaWYgKHRoaXMubGVuZ3RoID4gMSAmJiAhdW5tZXJnZWRMYXN0RWxlKSB7XG4gICAgICB2YXIgbGFzdEVsZUkgPSB0aGlzLmxlbmd0aCAtIDE7XG4gICAgICB2YXIgbGFzdEVsZSA9IHRoaXNbbGFzdEVsZUldO1xuICAgICAgdmFyIGxhc3RFbGVJZCA9IGxhc3RFbGUuX3ByaXZhdGUuZGF0YS5pZDtcbiAgICAgIHRoaXNbbGFzdEVsZUldID0gdW5kZWZpbmVkO1xuICAgICAgdGhpc1tpXSA9IGxhc3RFbGU7XG4gICAgICBtYXAuc2V0KGxhc3RFbGVJZCwge1xuICAgICAgICBlbGU6IGxhc3RFbGUsXG4gICAgICAgIGluZGV4OiBpXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyB0aGUgY29sbGVjdGlvbiBpcyBub3cgMSBlbGUgc21hbGxlclxuICAgIHRoaXMubGVuZ3RoLS07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIC8vIHJlbW92ZSBzaW5nbGUgZWxlIGluIHBsYWNlIGluIGNhbGxpbmcgY29sbGVjdGlvblxuICB1bm1lcmdlT25lOiBmdW5jdGlvbiB1bm1lcmdlT25lKGVsZSkge1xuICAgIGVsZSA9IGVsZVswXTtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuICAgIHZhciBpZCA9IGVsZS5fcHJpdmF0ZS5kYXRhLmlkO1xuICAgIHZhciBtYXAgPSBfcC5tYXA7XG4gICAgdmFyIGVudHJ5ID0gbWFwLmdldChpZCk7XG4gICAgaWYgKCFlbnRyeSkge1xuICAgICAgcmV0dXJuIHRoaXM7IC8vIG5vIG5lZWQgdG8gcmVtb3ZlXG4gICAgfVxuICAgIHZhciBpID0gZW50cnkuaW5kZXg7XG4gICAgdGhpcy51bm1lcmdlQXQoaSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIC8vIHJlbW92ZSBlbGVzIGluIHBsYWNlIG9uIGNhbGxpbmcgY29sbGVjdGlvblxuICB1bm1lcmdlOiBmdW5jdGlvbiB1bm1lcmdlKHRvUmVtb3ZlKSB7XG4gICAgdmFyIGN5ID0gdGhpcy5fcHJpdmF0ZS5jeTtcbiAgICBpZiAoIXRvUmVtb3ZlKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgaWYgKHRvUmVtb3ZlICYmIHN0cmluZyh0b1JlbW92ZSkpIHtcbiAgICAgIHZhciBzZWxlY3RvciA9IHRvUmVtb3ZlO1xuICAgICAgdG9SZW1vdmUgPSBjeS5tdXRhYmxlRWxlbWVudHMoKS5maWx0ZXIoc2VsZWN0b3IpO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRvUmVtb3ZlLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnVubWVyZ2VPbmUodG9SZW1vdmVbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcbiAgdW5tZXJnZUJ5OiBmdW5jdGlvbiB1bm1lcmdlQnkodG9SbUZuKSB7XG4gICAgZm9yICh2YXIgaSA9IHRoaXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBlbGUgPSB0aGlzW2ldO1xuICAgICAgaWYgKHRvUm1GbihlbGUpKSB7XG4gICAgICAgIHRoaXMudW5tZXJnZUF0KGkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgbWFwOiBmdW5jdGlvbiBtYXAobWFwRm4sIHRoaXNBcmcpIHtcbiAgICB2YXIgYXJyID0gW107XG4gICAgdmFyIGVsZXMgPSB0aGlzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgICB2YXIgcmV0ID0gdGhpc0FyZyA/IG1hcEZuLmFwcGx5KHRoaXNBcmcsIFtlbGUsIGksIGVsZXNdKSA6IG1hcEZuKGVsZSwgaSwgZWxlcyk7XG4gICAgICBhcnIucHVzaChyZXQpO1xuICAgIH1cbiAgICByZXR1cm4gYXJyO1xuICB9LFxuICByZWR1Y2U6IGZ1bmN0aW9uIHJlZHVjZShmbiwgaW5pdGlhbFZhbHVlKSB7XG4gICAgdmFyIHZhbCA9IGluaXRpYWxWYWx1ZTtcbiAgICB2YXIgZWxlcyA9IHRoaXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YWwgPSBmbih2YWwsIGVsZXNbaV0sIGksIGVsZXMpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsO1xuICB9LFxuICBtYXg6IGZ1bmN0aW9uIG1heCh2YWxGbiwgdGhpc0FyZykge1xuICAgIHZhciBtYXggPSAtSW5maW5pdHk7XG4gICAgdmFyIG1heEVsZTtcbiAgICB2YXIgZWxlcyA9IHRoaXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICAgIHZhciB2YWwgPSB0aGlzQXJnID8gdmFsRm4uYXBwbHkodGhpc0FyZywgW2VsZSwgaSwgZWxlc10pIDogdmFsRm4oZWxlLCBpLCBlbGVzKTtcbiAgICAgIGlmICh2YWwgPiBtYXgpIHtcbiAgICAgICAgbWF4ID0gdmFsO1xuICAgICAgICBtYXhFbGUgPSBlbGU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTogbWF4LFxuICAgICAgZWxlOiBtYXhFbGVcbiAgICB9O1xuICB9LFxuICBtaW46IGZ1bmN0aW9uIG1pbih2YWxGbiwgdGhpc0FyZykge1xuICAgIHZhciBtaW4gPSBJbmZpbml0eTtcbiAgICB2YXIgbWluRWxlO1xuICAgIHZhciBlbGVzID0gdGhpcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgICAgdmFyIHZhbCA9IHRoaXNBcmcgPyB2YWxGbi5hcHBseSh0aGlzQXJnLCBbZWxlLCBpLCBlbGVzXSkgOiB2YWxGbihlbGUsIGksIGVsZXMpO1xuICAgICAgaWYgKHZhbCA8IG1pbikge1xuICAgICAgICBtaW4gPSB2YWw7XG4gICAgICAgIG1pbkVsZSA9IGVsZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiBtaW4sXG4gICAgICBlbGU6IG1pbkVsZVxuICAgIH07XG4gIH1cbn07XG5cbi8vIGFsaWFzZXNcbnZhciBmbiQxID0gZWxlc2ZuJDg7XG5mbiQxWyd1J10gPSBmbiQxWyd8J10gPSBmbiQxWycrJ10gPSBmbiQxLnVuaW9uID0gZm4kMS5vciA9IGZuJDEuYWRkO1xuZm4kMVsnXFxcXCddID0gZm4kMVsnISddID0gZm4kMVsnLSddID0gZm4kMS5kaWZmZXJlbmNlID0gZm4kMS5yZWxhdGl2ZUNvbXBsZW1lbnQgPSBmbiQxLnN1YnRyYWN0ID0gZm4kMS5ub3Q7XG5mbiQxWyduJ10gPSBmbiQxWycmJ10gPSBmbiQxWycuJ10gPSBmbiQxLmFuZCA9IGZuJDEuaW50ZXJzZWN0aW9uID0gZm4kMS5pbnRlcnNlY3Q7XG5mbiQxWydeJ10gPSBmbiQxWycoKyknXSA9IGZuJDFbJygtKSddID0gZm4kMS5zeW1tZXRyaWNEaWZmZXJlbmNlID0gZm4kMS5zeW1kaWZmID0gZm4kMS54b3I7XG5mbiQxLmZuRmlsdGVyID0gZm4kMS5maWx0ZXJGbiA9IGZuJDEuc3RkRmlsdGVyID0gZm4kMS5maWx0ZXI7XG5mbiQxLmNvbXBsZW1lbnQgPSBmbiQxLmFic2NvbXAgPSBmbiQxLmFic29sdXRlQ29tcGxlbWVudDtcblxudmFyIGVsZXNmbiQ3ID0ge1xuICBpc05vZGU6IGZ1bmN0aW9uIGlzTm9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy5ncm91cCgpID09PSAnbm9kZXMnO1xuICB9LFxuICBpc0VkZ2U6IGZ1bmN0aW9uIGlzRWRnZSgpIHtcbiAgICByZXR1cm4gdGhpcy5ncm91cCgpID09PSAnZWRnZXMnO1xuICB9LFxuICBpc0xvb3A6IGZ1bmN0aW9uIGlzTG9vcCgpIHtcbiAgICByZXR1cm4gdGhpcy5pc0VkZ2UoKSAmJiB0aGlzLnNvdXJjZSgpWzBdID09PSB0aGlzLnRhcmdldCgpWzBdO1xuICB9LFxuICBpc1NpbXBsZTogZnVuY3Rpb24gaXNTaW1wbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNFZGdlKCkgJiYgdGhpcy5zb3VyY2UoKVswXSAhPT0gdGhpcy50YXJnZXQoKVswXTtcbiAgfSxcbiAgZ3JvdXA6IGZ1bmN0aW9uIGdyb3VwKCkge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIGlmIChlbGUpIHtcbiAgICAgIHJldHVybiBlbGUuX3ByaXZhdGUuZ3JvdXA7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqICBFbGVtZW50cyBhcmUgZHJhd24gaW4gYSBzcGVjaWZpYyBvcmRlciBiYXNlZCBvbiBjb21wb3VuZCBkZXB0aCAobG93IHRvIGhpZ2gpLCB0aGUgZWxlbWVudCB0eXBlIChub2RlcyBhYm92ZSBlZGdlcyksXG4gKiAgYW5kIHotaW5kZXggKGxvdyB0byBoaWdoKS4gIFRoZXNlIHN0eWxlcyBhZmZlY3QgaG93IHRoaXMgYXBwbGllczpcbiAqXG4gKiAgei1jb21wb3VuZC1kZXB0aDogTWF5IGJlIGBib3R0b20gfCBvcnBoYW4gfCBhdXRvIHwgdG9wYC4gIFRoZSBmaXJzdCBkcmF3biBpcyBgYm90dG9tYCwgdGhlbiBgb3JwaGFuYCB3aGljaCBpcyB0aGVcbiAqICAgICAgc2FtZSBkZXB0aCBhcyB0aGUgcm9vdCBvZiB0aGUgY29tcG91bmQgZ3JhcGgsIGZvbGxvd2VkIGJ5IHRoZSBkZWZhdWx0IHZhbHVlIGBhdXRvYCB3aGljaCBkcmF3cyBpbiBvcmRlciBmcm9tXG4gKiAgICAgIHJvb3QgdG8gbGVhdmVzIG9mIHRoZSBjb21wb3VuZCBncmFwaC4gIFRoZSBsYXN0IGRyYXduIGlzIGB0b3BgLlxuICogIHotaW5kZXgtY29tcGFyZTogTWF5IGJlIGBhdXRvIHwgbWFudWFsYC4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBhdXRvYCB3aGljaCBhbHdheXMgZHJhd3MgZWRnZXMgdW5kZXIgbm9kZXMuXG4gKiAgICAgIGBtYW51YWxgIGlnbm9yZXMgdGhpcyBjb252ZW50aW9uIGFuZCBkcmF3cyBiYXNlZCBvbiB0aGUgYHotaW5kZXhgIHZhbHVlIHNldHRpbmcuXG4gKiAgei1pbmRleDogQW4gaW50ZWdlciB2YWx1ZSB0aGF0IGFmZmVjdHMgdGhlIHJlbGF0aXZlIGRyYXcgb3JkZXIgb2YgZWxlbWVudHMuICBJbiBnZW5lcmFsLCBhbiBlbGVtZW50IHdpdGggYSBoaWdoZXJcbiAqICAgICAgYHotaW5kZXhgIHdpbGwgYmUgZHJhd24gb24gdG9wIG9mIGFuIGVsZW1lbnQgd2l0aCBhIGxvd2VyIGB6LWluZGV4YC5cbiAqL1xudmFyIHpJbmRleFNvcnQgPSBmdW5jdGlvbiB6SW5kZXhTb3J0KGEsIGIpIHtcbiAgdmFyIGN5ID0gYS5jeSgpO1xuICB2YXIgaGFzQ29tcG91bmROb2RlcyA9IGN5Lmhhc0NvbXBvdW5kTm9kZXMoKTtcbiAgZnVuY3Rpb24gZ2V0RGVwdGgoZWxlKSB7XG4gICAgdmFyIHN0eWxlID0gZWxlLnBzdHlsZSgnei1jb21wb3VuZC1kZXB0aCcpO1xuICAgIGlmIChzdHlsZS52YWx1ZSA9PT0gJ2F1dG8nKSB7XG4gICAgICByZXR1cm4gaGFzQ29tcG91bmROb2RlcyA/IGVsZS56RGVwdGgoKSA6IDA7XG4gICAgfSBlbHNlIGlmIChzdHlsZS52YWx1ZSA9PT0gJ2JvdHRvbScpIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9IGVsc2UgaWYgKHN0eWxlLnZhbHVlID09PSAndG9wJykge1xuICAgICAgcmV0dXJuIE1BWF9JTlQkMTtcbiAgICB9XG4gICAgLy8gJ29ycGhhbidcbiAgICByZXR1cm4gMDtcbiAgfVxuICB2YXIgZGVwdGhEaWZmID0gZ2V0RGVwdGgoYSkgLSBnZXREZXB0aChiKTtcbiAgaWYgKGRlcHRoRGlmZiAhPT0gMCkge1xuICAgIHJldHVybiBkZXB0aERpZmY7XG4gIH1cbiAgZnVuY3Rpb24gZ2V0RWxlRGVwdGgoZWxlKSB7XG4gICAgdmFyIHN0eWxlID0gZWxlLnBzdHlsZSgnei1pbmRleC1jb21wYXJlJyk7XG4gICAgaWYgKHN0eWxlLnZhbHVlID09PSAnYXV0bycpIHtcbiAgICAgIHJldHVybiBlbGUuaXNOb2RlKCkgPyAxIDogMDtcbiAgICB9XG4gICAgLy8gJ21hbnVhbCdcbiAgICByZXR1cm4gMDtcbiAgfVxuICB2YXIgZWxlRGlmZiA9IGdldEVsZURlcHRoKGEpIC0gZ2V0RWxlRGVwdGgoYik7XG4gIGlmIChlbGVEaWZmICE9PSAwKSB7XG4gICAgcmV0dXJuIGVsZURpZmY7XG4gIH1cbiAgdmFyIHpEaWZmID0gYS5wc3R5bGUoJ3otaW5kZXgnKS52YWx1ZSAtIGIucHN0eWxlKCd6LWluZGV4JykudmFsdWU7XG4gIGlmICh6RGlmZiAhPT0gMCkge1xuICAgIHJldHVybiB6RGlmZjtcbiAgfVxuICAvLyBjb21wYXJlIGluZGljZXMgaW4gdGhlIGNvcmUgKG9yZGVyIGFkZGVkIHRvIGdyYXBoIHcvIGxhc3Qgb24gdG9wKVxuICByZXR1cm4gYS5wb29sSW5kZXgoKSAtIGIucG9vbEluZGV4KCk7XG59O1xuXG52YXIgZWxlc2ZuJDYgPSB7XG4gIGZvckVhY2g6IGZ1bmN0aW9uIGZvckVhY2goZm4sIHRoaXNBcmcpIHtcbiAgICBpZiAoZm4kNihmbikpIHtcbiAgICAgIHZhciBOID0gdGhpcy5sZW5ndGg7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IE47IGkrKykge1xuICAgICAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICAgICAgdmFyIHJldCA9IHRoaXNBcmcgPyBmbi5hcHBseSh0aGlzQXJnLCBbZWxlLCBpLCB0aGlzXSkgOiBmbihlbGUsIGksIHRoaXMpO1xuICAgICAgICBpZiAocmV0ID09PSBmYWxzZSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IC8vIGV4aXQgZWFjaCBlYXJseSBvbiByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIHRvQXJyYXk6IGZ1bmN0aW9uIHRvQXJyYXkoKSB7XG4gICAgdmFyIGFycmF5ID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhcnJheS5wdXNoKHRoaXNbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG4gIH0sXG4gIHNsaWNlOiBmdW5jdGlvbiBzbGljZShzdGFydCwgZW5kKSB7XG4gICAgdmFyIGFycmF5ID0gW107XG4gICAgdmFyIHRoaXNTaXplID0gdGhpcy5sZW5ndGg7XG4gICAgaWYgKGVuZCA9PSBudWxsKSB7XG4gICAgICBlbmQgPSB0aGlzU2l6ZTtcbiAgICB9XG4gICAgaWYgKHN0YXJ0ID09IG51bGwpIHtcbiAgICAgIHN0YXJ0ID0gMDtcbiAgICB9XG4gICAgaWYgKHN0YXJ0IDwgMCkge1xuICAgICAgc3RhcnQgPSB0aGlzU2l6ZSArIHN0YXJ0O1xuICAgIH1cbiAgICBpZiAoZW5kIDwgMCkge1xuICAgICAgZW5kID0gdGhpc1NpemUgKyBlbmQ7XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA+PSAwICYmIGkgPCBlbmQgJiYgaSA8IHRoaXNTaXplOyBpKyspIHtcbiAgICAgIGFycmF5LnB1c2godGhpc1tpXSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNwYXduKGFycmF5KTtcbiAgfSxcbiAgc2l6ZTogZnVuY3Rpb24gc2l6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5sZW5ndGg7XG4gIH0sXG4gIGVxOiBmdW5jdGlvbiBlcShpKSB7XG4gICAgcmV0dXJuIHRoaXNbaV0gfHwgdGhpcy5zcGF3bigpO1xuICB9LFxuICBmaXJzdDogZnVuY3Rpb24gZmlyc3QoKSB7XG4gICAgcmV0dXJuIHRoaXNbMF0gfHwgdGhpcy5zcGF3bigpO1xuICB9LFxuICBsYXN0OiBmdW5jdGlvbiBsYXN0KCkge1xuICAgIHJldHVybiB0aGlzW3RoaXMubGVuZ3RoIC0gMV0gfHwgdGhpcy5zcGF3bigpO1xuICB9LFxuICBlbXB0eTogZnVuY3Rpb24gZW1wdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMubGVuZ3RoID09PSAwO1xuICB9LFxuICBub25lbXB0eTogZnVuY3Rpb24gbm9uZW1wdHkoKSB7XG4gICAgcmV0dXJuICF0aGlzLmVtcHR5KCk7XG4gIH0sXG4gIHNvcnQ6IGZ1bmN0aW9uIHNvcnQoc29ydEZuKSB7XG4gICAgaWYgKCFmbiQ2KHNvcnRGbikpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB2YXIgc29ydGVkID0gdGhpcy50b0FycmF5KCkuc29ydChzb3J0Rm4pO1xuICAgIHJldHVybiB0aGlzLnNwYXduKHNvcnRlZCk7XG4gIH0sXG4gIHNvcnRCeVpJbmRleDogZnVuY3Rpb24gc29ydEJ5WkluZGV4KCkge1xuICAgIHJldHVybiB0aGlzLnNvcnQoekluZGV4U29ydCk7XG4gIH0sXG4gIHpEZXB0aDogZnVuY3Rpb24gekRlcHRoKCkge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIGlmICghZWxlKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIGxldCBjeSA9IGVsZS5jeSgpO1xuICAgIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgICB2YXIgZ3JvdXAgPSBfcC5ncm91cDtcbiAgICBpZiAoZ3JvdXAgPT09ICdub2RlcycpIHtcbiAgICAgIHZhciBkZXB0aCA9IF9wLmRhdGEucGFyZW50ID8gZWxlLnBhcmVudHMoKS5zaXplKCkgOiAwO1xuICAgICAgaWYgKCFlbGUuaXNQYXJlbnQoKSkge1xuICAgICAgICByZXR1cm4gTUFYX0lOVCQxIC0gMTsgLy8gY2hpbGRsZXNzIG5vZGVzIGFsd2F5cyBvbiB0b3BcbiAgICAgIH1cbiAgICAgIHJldHVybiBkZXB0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHNyYyA9IF9wLnNvdXJjZTtcbiAgICAgIHZhciB0Z3QgPSBfcC50YXJnZXQ7XG4gICAgICB2YXIgc3JjRGVwdGggPSBzcmMuekRlcHRoKCk7XG4gICAgICB2YXIgdGd0RGVwdGggPSB0Z3QuekRlcHRoKCk7XG4gICAgICByZXR1cm4gTWF0aC5tYXgoc3JjRGVwdGgsIHRndERlcHRoLCAwKTsgLy8gZGVwdGggb2YgZGVlcGVzdCBwYXJlbnRcbiAgICB9XG4gIH1cbn07XG5lbGVzZm4kNi5lYWNoID0gZWxlc2ZuJDYuZm9yRWFjaDtcbnZhciBkZWZpbmVTeW1ib2xJdGVyYXRvciA9IGZ1bmN0aW9uIGRlZmluZVN5bWJvbEl0ZXJhdG9yKCkge1xuICB2YXIgdHlwZW9mVW5kZWYgPSBcInVuZGVmaW5lZFwiIDtcbiAgdmFyIGlzSXRlcmF0b3JTdXBwb3J0ZWQgPSAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiA/IFwidW5kZWZpbmVkXCIgOiBfdHlwZW9mKFN5bWJvbCkpICE9IHR5cGVvZlVuZGVmICYmIF90eXBlb2YoU3ltYm9sLml0ZXJhdG9yKSAhPSB0eXBlb2ZVbmRlZjtcbiAgaWYgKGlzSXRlcmF0b3JTdXBwb3J0ZWQpIHtcbiAgICBlbGVzZm4kNltTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgIHZhciBlbnRyeSA9IHtcbiAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgZG9uZTogZmFsc2VcbiAgICAgIH07XG4gICAgICB2YXIgaSA9IDA7XG4gICAgICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGg7XG4gICAgICByZXR1cm4gX2RlZmluZVByb3BlcnR5JDEoe1xuICAgICAgICBuZXh0OiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgIGlmIChpIDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICBlbnRyeS52YWx1ZSA9IF90aGlzW2krK107XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVudHJ5LnZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgZW50cnkuZG9uZSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBlbnRyeTtcbiAgICAgICAgfVxuICAgICAgfSwgU3ltYm9sLml0ZXJhdG9yLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfVxufTtcbmRlZmluZVN5bWJvbEl0ZXJhdG9yKCk7XG5cbnZhciBnZXRMYXlvdXREaW1lbnNpb25PcHRpb25zID0gZGVmYXVsdHMkZyh7XG4gIG5vZGVEaW1lbnNpb25zSW5jbHVkZUxhYmVsczogZmFsc2Vcbn0pO1xudmFyIGVsZXNmbiQ1ID0ge1xuICAvLyBDYWxjdWxhdGVzIGFuZCByZXR1cm5zIG5vZGUgZGltZW5zaW9ucyB7IHgsIHkgfSBiYXNlZCBvbiBvcHRpb25zIGdpdmVuXG4gIGxheW91dERpbWVuc2lvbnM6IGZ1bmN0aW9uIGxheW91dERpbWVuc2lvbnMob3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBnZXRMYXlvdXREaW1lbnNpb25PcHRpb25zKG9wdGlvbnMpO1xuICAgIHZhciBkaW1zO1xuICAgIGlmICghdGhpcy50YWtlc1VwU3BhY2UoKSkge1xuICAgICAgZGltcyA9IHtcbiAgICAgICAgdzogMCxcbiAgICAgICAgaDogMFxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMubm9kZURpbWVuc2lvbnNJbmNsdWRlTGFiZWxzKSB7XG4gICAgICB2YXIgYmJEaW0gPSB0aGlzLmJvdW5kaW5nQm94KCk7XG4gICAgICBkaW1zID0ge1xuICAgICAgICB3OiBiYkRpbS53LFxuICAgICAgICBoOiBiYkRpbS5oXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBkaW1zID0ge1xuICAgICAgICB3OiB0aGlzLm91dGVyV2lkdGgoKSxcbiAgICAgICAgaDogdGhpcy5vdXRlckhlaWdodCgpXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIHNhbml0aXNlIHRoZSBkaW1lbnNpb25zIGZvciBleHRlcm5hbCBsYXlvdXRzIChhdm9pZCBkaXZpc2lvbiBieSB6ZXJvKVxuICAgIGlmIChkaW1zLncgPT09IDAgfHwgZGltcy5oID09PSAwKSB7XG4gICAgICBkaW1zLncgPSBkaW1zLmggPSAxO1xuICAgIH1cbiAgICByZXR1cm4gZGltcztcbiAgfSxcbiAgLy8gdXNpbmcgc3RhbmRhcmQgbGF5b3V0IG9wdGlvbnMsIGFwcGx5IHBvc2l0aW9uIGZ1bmN0aW9uICh3LyBvciB3L28gYW5pbWF0aW9uKVxuICBsYXlvdXRQb3NpdGlvbnM6IGZ1bmN0aW9uIGxheW91dFBvc2l0aW9ucyhsYXlvdXQsIG9wdGlvbnMsIGZuKSB7XG4gICAgdmFyIG5vZGVzID0gdGhpcy5ub2RlcygpLmZpbHRlcihmdW5jdGlvbiAobikge1xuICAgICAgcmV0dXJuICFuLmlzUGFyZW50KCk7XG4gICAgfSk7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgIHZhciBsYXlvdXRFbGVzID0gb3B0aW9ucy5lbGVzOyAvLyBub2RlcyAmIGVkZ2VzXG4gICAgdmFyIGdldE1lbW9pemVLZXkgPSBmdW5jdGlvbiBnZXRNZW1vaXplS2V5KG5vZGUpIHtcbiAgICAgIHJldHVybiBub2RlLmlkKCk7XG4gICAgfTtcbiAgICB2YXIgZm5NZW0gPSBtZW1vaXplKGZuLCBnZXRNZW1vaXplS2V5KTsgLy8gbWVtb2l6ZWQgdmVyc2lvbiBvZiBwb3NpdGlvbiBmdW5jdGlvblxuXG4gICAgbGF5b3V0LmVtaXQoe1xuICAgICAgdHlwZTogJ2xheW91dHN0YXJ0JyxcbiAgICAgIGxheW91dDogbGF5b3V0XG4gICAgfSk7XG4gICAgbGF5b3V0LmFuaW1hdGlvbnMgPSBbXTtcbiAgICB2YXIgY2FsY3VsYXRlU3BhY2luZyA9IGZ1bmN0aW9uIGNhbGN1bGF0ZVNwYWNpbmcoc3BhY2luZywgbm9kZXNCYiwgcG9zKSB7XG4gICAgICB2YXIgY2VudGVyID0ge1xuICAgICAgICB4OiBub2Rlc0JiLngxICsgbm9kZXNCYi53IC8gMixcbiAgICAgICAgeTogbm9kZXNCYi55MSArIG5vZGVzQmIuaCAvIDJcbiAgICAgIH07XG4gICAgICB2YXIgc3BhY2luZ1ZlY3RvciA9IHtcbiAgICAgICAgLy8gc2NhbGUgZnJvbSBjZW50ZXIgb2YgYm91bmRpbmcgYm94IChub3QgbmVjZXNzYXJpbHkgMCwwKVxuICAgICAgICB4OiAocG9zLnggLSBjZW50ZXIueCkgKiBzcGFjaW5nLFxuICAgICAgICB5OiAocG9zLnkgLSBjZW50ZXIueSkgKiBzcGFjaW5nXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogY2VudGVyLnggKyBzcGFjaW5nVmVjdG9yLngsXG4gICAgICAgIHk6IGNlbnRlci55ICsgc3BhY2luZ1ZlY3Rvci55XG4gICAgICB9O1xuICAgIH07XG4gICAgdmFyIHVzZVNwYWNpbmdGYWN0b3IgPSBvcHRpb25zLnNwYWNpbmdGYWN0b3IgJiYgb3B0aW9ucy5zcGFjaW5nRmFjdG9yICE9PSAxO1xuICAgIHZhciBzcGFjaW5nQmIgPSBmdW5jdGlvbiBzcGFjaW5nQmIoKSB7XG4gICAgICBpZiAoIXVzZVNwYWNpbmdGYWN0b3IpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICB2YXIgYmIgPSBtYWtlQm91bmRpbmdCb3goKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgICAgdmFyIHBvcyA9IGZuTWVtKG5vZGUsIGkpO1xuICAgICAgICBleHBhbmRCb3VuZGluZ0JveEJ5UG9pbnQoYmIsIHBvcy54LCBwb3MueSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmI7XG4gICAgfTtcbiAgICB2YXIgYmIgPSBzcGFjaW5nQmIoKTtcbiAgICB2YXIgZ2V0RmluYWxQb3MgPSBtZW1vaXplKGZ1bmN0aW9uIChub2RlLCBpKSB7XG4gICAgICB2YXIgbmV3UG9zID0gZm5NZW0obm9kZSwgaSk7XG4gICAgICBpZiAodXNlU3BhY2luZ0ZhY3Rvcikge1xuICAgICAgICB2YXIgc3BhY2luZyA9IE1hdGguYWJzKG9wdGlvbnMuc3BhY2luZ0ZhY3Rvcik7XG4gICAgICAgIG5ld1BvcyA9IGNhbGN1bGF0ZVNwYWNpbmcoc3BhY2luZywgYmIsIG5ld1Bvcyk7XG4gICAgICB9XG4gICAgICBpZiAob3B0aW9ucy50cmFuc2Zvcm0gIT0gbnVsbCkge1xuICAgICAgICBuZXdQb3MgPSBvcHRpb25zLnRyYW5zZm9ybShub2RlLCBuZXdQb3MpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ld1BvcztcbiAgICB9LCBnZXRNZW1vaXplS2V5KTtcbiAgICBpZiAob3B0aW9ucy5hbmltYXRlKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBub2RlID0gbm9kZXNbaV07XG4gICAgICAgIHZhciBuZXdQb3MgPSBnZXRGaW5hbFBvcyhub2RlLCBpKTtcbiAgICAgICAgdmFyIGFuaW1hdGVOb2RlID0gb3B0aW9ucy5hbmltYXRlRmlsdGVyID09IG51bGwgfHwgb3B0aW9ucy5hbmltYXRlRmlsdGVyKG5vZGUsIGkpO1xuICAgICAgICBpZiAoYW5pbWF0ZU5vZGUpIHtcbiAgICAgICAgICB2YXIgYW5pID0gbm9kZS5hbmltYXRpb24oe1xuICAgICAgICAgICAgcG9zaXRpb246IG5ld1BvcyxcbiAgICAgICAgICAgIGR1cmF0aW9uOiBvcHRpb25zLmFuaW1hdGlvbkR1cmF0aW9uLFxuICAgICAgICAgICAgZWFzaW5nOiBvcHRpb25zLmFuaW1hdGlvbkVhc2luZ1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGxheW91dC5hbmltYXRpb25zLnB1c2goYW5pKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBub2RlLnBvc2l0aW9uKG5ld1Bvcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zLmZpdCkge1xuICAgICAgICB2YXIgZml0QW5pID0gY3kuYW5pbWF0aW9uKHtcbiAgICAgICAgICBmaXQ6IHtcbiAgICAgICAgICAgIGJvdW5kaW5nQm94OiBsYXlvdXRFbGVzLmJvdW5kaW5nQm94QXQoZ2V0RmluYWxQb3MpLFxuICAgICAgICAgICAgcGFkZGluZzogb3B0aW9ucy5wYWRkaW5nXG4gICAgICAgICAgfSxcbiAgICAgICAgICBkdXJhdGlvbjogb3B0aW9ucy5hbmltYXRpb25EdXJhdGlvbixcbiAgICAgICAgICBlYXNpbmc6IG9wdGlvbnMuYW5pbWF0aW9uRWFzaW5nXG4gICAgICAgIH0pO1xuICAgICAgICBsYXlvdXQuYW5pbWF0aW9ucy5wdXNoKGZpdEFuaSk7XG4gICAgICB9IGVsc2UgaWYgKG9wdGlvbnMuem9vbSAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnMucGFuICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFyIHpvb21QYW5BbmkgPSBjeS5hbmltYXRpb24oe1xuICAgICAgICAgIHpvb206IG9wdGlvbnMuem9vbSxcbiAgICAgICAgICBwYW46IG9wdGlvbnMucGFuLFxuICAgICAgICAgIGR1cmF0aW9uOiBvcHRpb25zLmFuaW1hdGlvbkR1cmF0aW9uLFxuICAgICAgICAgIGVhc2luZzogb3B0aW9ucy5hbmltYXRpb25FYXNpbmdcbiAgICAgICAgfSk7XG4gICAgICAgIGxheW91dC5hbmltYXRpb25zLnB1c2goem9vbVBhbkFuaSk7XG4gICAgICB9XG4gICAgICBsYXlvdXQuYW5pbWF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChhbmkpIHtcbiAgICAgICAgcmV0dXJuIGFuaS5wbGF5KCk7XG4gICAgICB9KTtcbiAgICAgIGxheW91dC5vbmUoJ2xheW91dHJlYWR5Jywgb3B0aW9ucy5yZWFkeSk7XG4gICAgICBsYXlvdXQuZW1pdCh7XG4gICAgICAgIHR5cGU6ICdsYXlvdXRyZWFkeScsXG4gICAgICAgIGxheW91dDogbGF5b3V0XG4gICAgICB9KTtcbiAgICAgIFByb21pc2UkMS5hbGwobGF5b3V0LmFuaW1hdGlvbnMubWFwKGZ1bmN0aW9uIChhbmkpIHtcbiAgICAgICAgcmV0dXJuIGFuaS5wcm9taXNlKCk7XG4gICAgICB9KSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxheW91dC5vbmUoJ2xheW91dHN0b3AnLCBvcHRpb25zLnN0b3ApO1xuICAgICAgICBsYXlvdXQuZW1pdCh7XG4gICAgICAgICAgdHlwZTogJ2xheW91dHN0b3AnLFxuICAgICAgICAgIGxheW91dDogbGF5b3V0XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGVzLnBvc2l0aW9ucyhnZXRGaW5hbFBvcyk7XG4gICAgICBpZiAob3B0aW9ucy5maXQpIHtcbiAgICAgICAgY3kuZml0KG9wdGlvbnMuZWxlcywgb3B0aW9ucy5wYWRkaW5nKTtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zLnpvb20gIT0gbnVsbCkge1xuICAgICAgICBjeS56b29tKG9wdGlvbnMuem9vbSk7XG4gICAgICB9XG4gICAgICBpZiAob3B0aW9ucy5wYW4pIHtcbiAgICAgICAgY3kucGFuKG9wdGlvbnMucGFuKTtcbiAgICAgIH1cbiAgICAgIGxheW91dC5vbmUoJ2xheW91dHJlYWR5Jywgb3B0aW9ucy5yZWFkeSk7XG4gICAgICBsYXlvdXQuZW1pdCh7XG4gICAgICAgIHR5cGU6ICdsYXlvdXRyZWFkeScsXG4gICAgICAgIGxheW91dDogbGF5b3V0XG4gICAgICB9KTtcbiAgICAgIGxheW91dC5vbmUoJ2xheW91dHN0b3AnLCBvcHRpb25zLnN0b3ApO1xuICAgICAgbGF5b3V0LmVtaXQoe1xuICAgICAgICB0eXBlOiAnbGF5b3V0c3RvcCcsXG4gICAgICAgIGxheW91dDogbGF5b3V0XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG4gIGxheW91dDogZnVuY3Rpb24gbGF5b3V0KG9wdGlvbnMpIHtcbiAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gICAgcmV0dXJuIGN5Lm1ha2VMYXlvdXQoZXh0ZW5kKHt9LCBvcHRpb25zLCB7XG4gICAgICBlbGVzOiB0aGlzXG4gICAgfSkpO1xuICB9XG59O1xuXG4vLyBhbGlhc2VzOlxuZWxlc2ZuJDUuY3JlYXRlTGF5b3V0ID0gZWxlc2ZuJDUubWFrZUxheW91dCA9IGVsZXNmbiQ1LmxheW91dDtcblxuZnVuY3Rpb24gc3R5bGVDYWNoZShrZXksIGZuLCBlbGUpIHtcbiAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICB2YXIgY2FjaGUgPSBfcC5zdHlsZUNhY2hlID0gX3Auc3R5bGVDYWNoZSB8fCBbXTtcbiAgdmFyIHZhbDtcbiAgaWYgKCh2YWwgPSBjYWNoZVtrZXldKSAhPSBudWxsKSB7XG4gICAgcmV0dXJuIHZhbDtcbiAgfSBlbHNlIHtcbiAgICB2YWwgPSBjYWNoZVtrZXldID0gZm4oZWxlKTtcbiAgICByZXR1cm4gdmFsO1xuICB9XG59XG5mdW5jdGlvbiBjYWNoZVN0eWxlRnVuY3Rpb24oa2V5LCBmbikge1xuICBrZXkgPSBoYXNoU3RyaW5nKGtleSk7XG4gIHJldHVybiBmdW5jdGlvbiBjYWNoZWRTdHlsZUZ1bmN0aW9uKGVsZSkge1xuICAgIHJldHVybiBzdHlsZUNhY2hlKGtleSwgZm4sIGVsZSk7XG4gIH07XG59XG5mdW5jdGlvbiBjYWNoZVByb3RvdHlwZVN0eWxlRnVuY3Rpb24oa2V5LCBmbikge1xuICBrZXkgPSBoYXNoU3RyaW5nKGtleSk7XG4gIHZhciBzZWxmRm4gPSBmdW5jdGlvbiBzZWxmRm4oZWxlKSB7XG4gICAgcmV0dXJuIGZuLmNhbGwoZWxlKTtcbiAgfTtcbiAgcmV0dXJuIGZ1bmN0aW9uIGNhY2hlZFByb3RvdHlwZVN0eWxlRnVuY3Rpb24oKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgaWYgKGVsZSkge1xuICAgICAgcmV0dXJuIHN0eWxlQ2FjaGUoa2V5LCBzZWxmRm4sIGVsZSk7XG4gICAgfVxuICB9O1xufVxudmFyIGVsZXNmbiQ0ID0ge1xuICByZWNhbGN1bGF0ZVJlbmRlcmVkU3R5bGU6IGZ1bmN0aW9uIHJlY2FsY3VsYXRlUmVuZGVyZWRTdHlsZSh1c2VDYWNoZSkge1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgICB2YXIgcmVuZGVyZXIgPSBjeS5yZW5kZXJlcigpO1xuICAgIHZhciBzdHlsZUVuYWJsZWQgPSBjeS5zdHlsZUVuYWJsZWQoKTtcbiAgICBpZiAocmVuZGVyZXIgJiYgc3R5bGVFbmFibGVkKSB7XG4gICAgICByZW5kZXJlci5yZWNhbGN1bGF0ZVJlbmRlcmVkU3R5bGUodGhpcywgdXNlQ2FjaGUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgZGlydHlTdHlsZUNhY2hlOiBmdW5jdGlvbiBkaXJ0eVN0eWxlQ2FjaGUoKSB7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgIHZhciBkaXJ0eSA9IGZ1bmN0aW9uIGRpcnR5KGVsZSkge1xuICAgICAgcmV0dXJuIGVsZS5fcHJpdmF0ZS5zdHlsZUNhY2hlID0gbnVsbDtcbiAgICB9O1xuICAgIGlmIChjeS5oYXNDb21wb3VuZE5vZGVzKCkpIHtcbiAgICAgIHZhciBlbGVzO1xuICAgICAgZWxlcyA9IHRoaXMuc3Bhd25TZWxmKCkubWVyZ2UodGhpcy5kZXNjZW5kYW50cygpKS5tZXJnZSh0aGlzLnBhcmVudHMoKSk7XG4gICAgICBlbGVzLm1lcmdlKGVsZXMuY29ubmVjdGVkRWRnZXMoKSk7XG4gICAgICBlbGVzLmZvckVhY2goZGlydHkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICBkaXJ0eShlbGUpO1xuICAgICAgICBlbGUuY29ubmVjdGVkRWRnZXMoKS5mb3JFYWNoKGRpcnR5KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgLy8gZnVsbHkgdXBkYXRlcyAocmVjYWxjdWxhdGVzKSB0aGUgc3R5bGUgZm9yIHRoZSBlbGVtZW50c1xuICB1cGRhdGVTdHlsZTogZnVuY3Rpb24gdXBkYXRlU3R5bGUobm90aWZ5UmVuZGVyZXIpIHtcbiAgICB2YXIgY3kgPSB0aGlzLl9wcml2YXRlLmN5O1xuICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBpZiAoY3kuYmF0Y2hpbmcoKSkge1xuICAgICAgdmFyIGJFbGVzID0gY3kuX3ByaXZhdGUuYmF0Y2hTdHlsZUVsZXM7XG4gICAgICBiRWxlcy5tZXJnZSh0aGlzKTtcbiAgICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZyBhbmQgZXhpdCBlYXJseSB3aGVuIGJhdGNoaW5nXG4gICAgfVxuICAgIHZhciBoYXNDb21wb3VuZHMgPSBjeS5oYXNDb21wb3VuZE5vZGVzKCk7XG4gICAgdmFyIHVwZGF0ZWRFbGVzID0gdGhpcztcbiAgICBub3RpZnlSZW5kZXJlciA9IG5vdGlmeVJlbmRlcmVyIHx8IG5vdGlmeVJlbmRlcmVyID09PSB1bmRlZmluZWQgPyB0cnVlIDogZmFsc2U7XG4gICAgaWYgKGhhc0NvbXBvdW5kcykge1xuICAgICAgLy8gdGhlbiBhZGQgZXZlcnl0aGluZyB1cCBhbmQgZG93biBmb3IgY29tcG91bmQgc2VsZWN0b3IgY2hlY2tzXG4gICAgICB1cGRhdGVkRWxlcyA9IHRoaXMuc3Bhd25TZWxmKCkubWVyZ2UodGhpcy5kZXNjZW5kYW50cygpKS5tZXJnZSh0aGlzLnBhcmVudHMoKSk7XG4gICAgfVxuXG4gICAgLy8gbGV0IGNoYW5nZWRFbGVzID0gc3R5bGUuYXBwbHkoIHVwZGF0ZWRFbGVzICk7XG4gICAgdmFyIGNoYW5nZWRFbGVzID0gdXBkYXRlZEVsZXM7XG4gICAgaWYgKG5vdGlmeVJlbmRlcmVyKSB7XG4gICAgICBjaGFuZ2VkRWxlcy5lbWl0QW5kTm90aWZ5KCdzdHlsZScpOyAvLyBsZXQgcmVuZGVyZXIga25vdyB3ZSBjaGFuZ2VkIHN0eWxlXG4gICAgfSBlbHNlIHtcbiAgICAgIGNoYW5nZWRFbGVzLmVtaXQoJ3N0eWxlJyk7IC8vIGp1c3QgZmlyZSB0aGUgZXZlbnRcbiAgICB9XG4gICAgdXBkYXRlZEVsZXMuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICByZXR1cm4gZWxlLl9wcml2YXRlLnN0eWxlRGlydHkgPSB0cnVlO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuICAvLyBwcml2YXRlOiBjbGVhcnMgZGlydHkgZmxhZyBhbmQgcmVjYWxjdWxhdGVzIHN0eWxlXG4gIGNsZWFuU3R5bGU6IGZ1bmN0aW9uIGNsZWFuU3R5bGUoKSB7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICAgIGlmIChlbGUuX3ByaXZhdGUuc3R5bGVEaXJ0eSkge1xuICAgICAgICAvLyBuLmIuIHRoaXMgZmxhZyBzaG91bGQgYmUgc2V0IGJlZm9yZSBhcHBseSgpIHRvIGF2b2lkIHBvdGVudGlhbCBpbmZpbml0ZSByZWN1cnNpb25cbiAgICAgICAgZWxlLl9wcml2YXRlLnN0eWxlRGlydHkgPSBmYWxzZTtcbiAgICAgICAgY3kuc3R5bGUoKS5hcHBseShlbGUpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgLy8gZ2V0IHRoZSBpbnRlcm5hbCBwYXJzZWQgc3R5bGUgb2JqZWN0IGZvciB0aGUgc3BlY2lmaWVkIHByb3BlcnR5XG4gIHBhcnNlZFN0eWxlOiBmdW5jdGlvbiBwYXJzZWRTdHlsZShwcm9wZXJ0eSkge1xuICAgIHZhciBpbmNsdWRlTm9uRGVmYXVsdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdHJ1ZTtcbiAgICB2YXIgZWxlID0gdGhpc1swXTtcbiAgICB2YXIgY3kgPSBlbGUuY3koKTtcbiAgICBpZiAoIWN5LnN0eWxlRW5hYmxlZCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChlbGUpIHtcbiAgICAgIC8vIHRoaXMuY2xlYW5TdHlsZSgpO1xuXG4gICAgICAvLyBJbmxpbmUgdGhlIGltcG9ydGFudCBwYXJ0IG9mIGNsZWFuU3R5bGUoKSwgZm9yIHJhdyBwZXJmb3JtYW5jZVxuICAgICAgaWYgKGVsZS5fcHJpdmF0ZS5zdHlsZURpcnR5KSB7XG4gICAgICAgIC8vIG4uYi4gdGhpcyBmbGFnIHNob3VsZCBiZSBzZXQgYmVmb3JlIGFwcGx5KCkgdG8gYXZvaWQgcG90ZW50aWFsIGluZmluaXRlIHJlY3Vyc2lvblxuICAgICAgICBlbGUuX3ByaXZhdGUuc3R5bGVEaXJ0eSA9IGZhbHNlO1xuICAgICAgICBjeS5zdHlsZSgpLmFwcGx5KGVsZSk7XG4gICAgICB9XG4gICAgICB2YXIgb3ZlcnJpZGRlblN0eWxlID0gZWxlLl9wcml2YXRlLnN0eWxlW3Byb3BlcnR5XTtcbiAgICAgIGlmIChvdmVycmlkZGVuU3R5bGUgIT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gb3ZlcnJpZGRlblN0eWxlO1xuICAgICAgfSBlbHNlIGlmIChpbmNsdWRlTm9uRGVmYXVsdCkge1xuICAgICAgICByZXR1cm4gY3kuc3R5bGUoKS5nZXREZWZhdWx0UHJvcGVydHkocHJvcGVydHkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBudW1lcmljU3R5bGU6IGZ1bmN0aW9uIG51bWVyaWNTdHlsZShwcm9wZXJ0eSkge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIGlmICghZWxlLmN5KCkuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGVsZSkge1xuICAgICAgdmFyIHBzdHlsZSA9IGVsZS5wc3R5bGUocHJvcGVydHkpO1xuICAgICAgcmV0dXJuIHBzdHlsZS5wZlZhbHVlICE9PSB1bmRlZmluZWQgPyBwc3R5bGUucGZWYWx1ZSA6IHBzdHlsZS52YWx1ZTtcbiAgICB9XG4gIH0sXG4gIG51bWVyaWNTdHlsZVVuaXRzOiBmdW5jdGlvbiBudW1lcmljU3R5bGVVbml0cyhwcm9wZXJ0eSkge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIGlmICghZWxlLmN5KCkuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGVsZSkge1xuICAgICAgcmV0dXJuIGVsZS5wc3R5bGUocHJvcGVydHkpLnVuaXRzO1xuICAgIH1cbiAgfSxcbiAgLy8gZ2V0IHRoZSBzcGVjaWZpZWQgY3NzIHByb3BlcnR5IGFzIGEgcmVuZGVyZWQgdmFsdWUgKGkuZS4gb24tc2NyZWVuIHZhbHVlKVxuICAvLyBvciBnZXQgdGhlIHdob2xlIHJlbmRlcmVkIHN0eWxlIGlmIG5vIHByb3BlcnR5IHNwZWNpZmllZCAoTkIgZG9lc24ndCBhbGxvdyBzZXR0aW5nKVxuICByZW5kZXJlZFN0eWxlOiBmdW5jdGlvbiByZW5kZXJlZFN0eWxlKHByb3BlcnR5KSB7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB2YXIgZWxlID0gdGhpc1swXTtcbiAgICBpZiAoZWxlKSB7XG4gICAgICByZXR1cm4gY3kuc3R5bGUoKS5nZXRSZW5kZXJlZFN0eWxlKGVsZSwgcHJvcGVydHkpO1xuICAgIH1cbiAgfSxcbiAgLy8gcmVhZCB0aGUgY2FsY3VsYXRlZCBjc3Mgc3R5bGUgb2YgdGhlIGVsZW1lbnQgb3Igb3ZlcnJpZGUgdGhlIHN0eWxlICh2aWEgYSBieXBhc3MpXG4gIHN0eWxlOiBmdW5jdGlvbiBzdHlsZShuYW1lLCB2YWx1ZSkge1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgICBpZiAoIWN5LnN0eWxlRW5hYmxlZCgpKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdmFyIHVwZGF0ZVRyYW5zaXRpb25zID0gZmFsc2U7XG4gICAgdmFyIHN0eWxlID0gY3kuc3R5bGUoKTtcbiAgICBpZiAocGxhaW5PYmplY3QobmFtZSkpIHtcbiAgICAgIC8vIHRoZW4gZXh0ZW5kIHRoZSBieXBhc3NcbiAgICAgIHZhciBwcm9wcyA9IG5hbWU7XG4gICAgICBzdHlsZS5hcHBseUJ5cGFzcyh0aGlzLCBwcm9wcywgdXBkYXRlVHJhbnNpdGlvbnMpO1xuICAgICAgdGhpcy5lbWl0QW5kTm90aWZ5KCdzdHlsZScpOyAvLyBsZXQgdGhlIHJlbmRlcmVyIGtub3cgd2UndmUgdXBkYXRlZCBzdHlsZVxuICAgIH0gZWxzZSBpZiAoc3RyaW5nKG5hbWUpKSB7XG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyB0aGVuIGdldCB0aGUgcHJvcGVydHkgZnJvbSB0aGUgc3R5bGVcbiAgICAgICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgICAgIGlmIChlbGUpIHtcbiAgICAgICAgICByZXR1cm4gc3R5bGUuZ2V0U3R5bGVQcm9wZXJ0eVZhbHVlKGVsZSwgbmFtZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gZW1wdHkgY29sbGVjdGlvbiA9PiBjYW4ndCBnZXQgYW55IHZhbHVlXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB0aGVuIHNldCB0aGUgYnlwYXNzIHdpdGggdGhlIHByb3BlcnR5IHZhbHVlXG4gICAgICAgIHN0eWxlLmFwcGx5QnlwYXNzKHRoaXMsIG5hbWUsIHZhbHVlLCB1cGRhdGVUcmFuc2l0aW9ucyk7XG4gICAgICAgIHRoaXMuZW1pdEFuZE5vdGlmeSgnc3R5bGUnKTsgLy8gbGV0IHRoZSByZW5kZXJlciBrbm93IHdlJ3ZlIHVwZGF0ZWQgc3R5bGVcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIF9lbGUgPSB0aGlzWzBdO1xuICAgICAgaWYgKF9lbGUpIHtcbiAgICAgICAgcmV0dXJuIHN0eWxlLmdldFJhd1N0eWxlKF9lbGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZW1wdHkgY29sbGVjdGlvbiA9PiBjYW4ndCBnZXQgYW55IHZhbHVlXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG4gIHJlbW92ZVN0eWxlOiBmdW5jdGlvbiByZW1vdmVTdHlsZShuYW1lcykge1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgICBpZiAoIWN5LnN0eWxlRW5hYmxlZCgpKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdmFyIHVwZGF0ZVRyYW5zaXRpb25zID0gZmFsc2U7XG4gICAgdmFyIHN0eWxlID0gY3kuc3R5bGUoKTtcbiAgICB2YXIgZWxlcyA9IHRoaXM7XG4gICAgaWYgKG5hbWVzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICAgICAgc3R5bGUucmVtb3ZlQWxsQnlwYXNzZXMoZWxlLCB1cGRhdGVUcmFuc2l0aW9ucyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG5hbWVzID0gbmFtZXMuc3BsaXQoL1xccysvKTtcbiAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBlbGVzLmxlbmd0aDsgX2krKykge1xuICAgICAgICB2YXIgX2VsZTIgPSBlbGVzW19pXTtcbiAgICAgICAgc3R5bGUucmVtb3ZlQnlwYXNzZXMoX2VsZTIsIG5hbWVzLCB1cGRhdGVUcmFuc2l0aW9ucyk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuZW1pdEFuZE5vdGlmeSgnc3R5bGUnKTsgLy8gbGV0IHRoZSByZW5kZXJlciBrbm93IHdlJ3ZlIHVwZGF0ZWQgc3R5bGVcblxuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuICBzaG93OiBmdW5jdGlvbiBzaG93KCkge1xuICAgIHRoaXMuY3NzKCdkaXNwbGF5JywgJ2VsZW1lbnQnKTtcbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcbiAgaGlkZTogZnVuY3Rpb24gaGlkZSgpIHtcbiAgICB0aGlzLmNzcygnZGlzcGxheScsICdub25lJyk7XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG4gIGVmZmVjdGl2ZU9wYWNpdHk6IGZ1bmN0aW9uIGVmZmVjdGl2ZU9wYWNpdHkoKSB7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICB2YXIgaGFzQ29tcG91bmROb2RlcyA9IGN5Lmhhc0NvbXBvdW5kTm9kZXMoKTtcbiAgICB2YXIgZWxlID0gdGhpc1swXTtcbiAgICBpZiAoZWxlKSB7XG4gICAgICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gICAgICB2YXIgcGFyZW50T3BhY2l0eSA9IGVsZS5wc3R5bGUoJ29wYWNpdHknKS52YWx1ZTtcbiAgICAgIGlmICghaGFzQ29tcG91bmROb2Rlcykge1xuICAgICAgICByZXR1cm4gcGFyZW50T3BhY2l0eTtcbiAgICAgIH1cbiAgICAgIHZhciBwYXJlbnRzID0gIV9wLmRhdGEucGFyZW50ID8gbnVsbCA6IGVsZS5wYXJlbnRzKCk7XG4gICAgICBpZiAocGFyZW50cykge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgcGFyZW50ID0gcGFyZW50c1tpXTtcbiAgICAgICAgICB2YXIgb3BhY2l0eSA9IHBhcmVudC5wc3R5bGUoJ29wYWNpdHknKS52YWx1ZTtcbiAgICAgICAgICBwYXJlbnRPcGFjaXR5ID0gb3BhY2l0eSAqIHBhcmVudE9wYWNpdHk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXJlbnRPcGFjaXR5O1xuICAgIH1cbiAgfSxcbiAgdHJhbnNwYXJlbnQ6IGZ1bmN0aW9uIHRyYW5zcGFyZW50KCkge1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgICBpZiAoIWN5LnN0eWxlRW5hYmxlZCgpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIHZhciBoYXNDb21wb3VuZE5vZGVzID0gZWxlLmN5KCkuaGFzQ29tcG91bmROb2RlcygpO1xuICAgIGlmIChlbGUpIHtcbiAgICAgIGlmICghaGFzQ29tcG91bmROb2Rlcykge1xuICAgICAgICByZXR1cm4gZWxlLnBzdHlsZSgnb3BhY2l0eScpLnZhbHVlID09PSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGVsZS5lZmZlY3RpdmVPcGFjaXR5KCkgPT09IDA7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBiYWNrZ3JvdW5kaW5nOiBmdW5jdGlvbiBiYWNrZ3JvdW5kaW5nKCkge1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgICBpZiAoIWN5LnN0eWxlRW5hYmxlZCgpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIHJldHVybiBlbGUuX3ByaXZhdGUuYmFja2dyb3VuZGluZyA/IHRydWUgOiBmYWxzZTtcbiAgfVxufTtcbmZ1bmN0aW9uIGNoZWNrQ29tcG91bmQoZWxlLCBwYXJlbnRPaykge1xuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIHZhciBwYXJlbnRzID0gX3AuZGF0YS5wYXJlbnQgPyBlbGUucGFyZW50cygpIDogbnVsbDtcbiAgaWYgKHBhcmVudHMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwYXJlbnQgPSBwYXJlbnRzW2ldO1xuICAgICAgaWYgKCFwYXJlbnRPayhwYXJlbnQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBkZWZpbmVEZXJpdmVkU3RhdGVGdW5jdGlvbihzcGVjcykge1xuICB2YXIgb2sgPSBzcGVjcy5vaztcbiAgdmFyIGVkZ2VPa1ZpYU5vZGUgPSBzcGVjcy5lZGdlT2tWaWFOb2RlIHx8IHNwZWNzLm9rO1xuICB2YXIgcGFyZW50T2sgPSBzcGVjcy5wYXJlbnRPayB8fCBzcGVjcy5vaztcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gICAgaWYgKCFjeS5zdHlsZUVuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIHZhciBoYXNDb21wb3VuZE5vZGVzID0gY3kuaGFzQ29tcG91bmROb2RlcygpO1xuICAgIGlmIChlbGUpIHtcbiAgICAgIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgICAgIGlmICghb2soZWxlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoZWxlLmlzTm9kZSgpKSB7XG4gICAgICAgIHJldHVybiAhaGFzQ29tcG91bmROb2RlcyB8fCBjaGVja0NvbXBvdW5kKGVsZSwgcGFyZW50T2spO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHNyYyA9IF9wLnNvdXJjZTtcbiAgICAgICAgdmFyIHRndCA9IF9wLnRhcmdldDtcbiAgICAgICAgcmV0dXJuIGVkZ2VPa1ZpYU5vZGUoc3JjKSAmJiAoIWhhc0NvbXBvdW5kTm9kZXMgfHwgY2hlY2tDb21wb3VuZChzcmMsIGVkZ2VPa1ZpYU5vZGUpKSAmJiAoc3JjID09PSB0Z3QgfHwgZWRnZU9rVmlhTm9kZSh0Z3QpICYmICghaGFzQ29tcG91bmROb2RlcyB8fCBjaGVja0NvbXBvdW5kKHRndCwgZWRnZU9rVmlhTm9kZSkpKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG52YXIgZWxlVGFrZXNVcFNwYWNlID0gY2FjaGVTdHlsZUZ1bmN0aW9uKCdlbGVUYWtlc1VwU3BhY2UnLCBmdW5jdGlvbiAoZWxlKSB7XG4gIHJldHVybiBlbGUucHN0eWxlKCdkaXNwbGF5JykudmFsdWUgPT09ICdlbGVtZW50JyAmJiBlbGUud2lkdGgoKSAhPT0gMCAmJiAoZWxlLmlzTm9kZSgpID8gZWxlLmhlaWdodCgpICE9PSAwIDogdHJ1ZSk7XG59KTtcbmVsZXNmbiQ0LnRha2VzVXBTcGFjZSA9IGNhY2hlUHJvdG90eXBlU3R5bGVGdW5jdGlvbigndGFrZXNVcFNwYWNlJywgZGVmaW5lRGVyaXZlZFN0YXRlRnVuY3Rpb24oe1xuICBvazogZWxlVGFrZXNVcFNwYWNlXG59KSk7XG52YXIgZWxlSW50ZXJhY3RpdmUgPSBjYWNoZVN0eWxlRnVuY3Rpb24oJ2VsZUludGVyYWN0aXZlJywgZnVuY3Rpb24gKGVsZSkge1xuICByZXR1cm4gZWxlLnBzdHlsZSgnZXZlbnRzJykudmFsdWUgPT09ICd5ZXMnICYmIGVsZS5wc3R5bGUoJ3Zpc2liaWxpdHknKS52YWx1ZSA9PT0gJ3Zpc2libGUnICYmIGVsZVRha2VzVXBTcGFjZShlbGUpO1xufSk7XG52YXIgcGFyZW50SW50ZXJhY3RpdmUgPSBjYWNoZVN0eWxlRnVuY3Rpb24oJ3BhcmVudEludGVyYWN0aXZlJywgZnVuY3Rpb24gKHBhcmVudCkge1xuICByZXR1cm4gcGFyZW50LnBzdHlsZSgndmlzaWJpbGl0eScpLnZhbHVlID09PSAndmlzaWJsZScgJiYgZWxlVGFrZXNVcFNwYWNlKHBhcmVudCk7XG59KTtcbmVsZXNmbiQ0LmludGVyYWN0aXZlID0gY2FjaGVQcm90b3R5cGVTdHlsZUZ1bmN0aW9uKCdpbnRlcmFjdGl2ZScsIGRlZmluZURlcml2ZWRTdGF0ZUZ1bmN0aW9uKHtcbiAgb2s6IGVsZUludGVyYWN0aXZlLFxuICBwYXJlbnRPazogcGFyZW50SW50ZXJhY3RpdmUsXG4gIGVkZ2VPa1ZpYU5vZGU6IGVsZVRha2VzVXBTcGFjZVxufSkpO1xuZWxlc2ZuJDQubm9uaW50ZXJhY3RpdmUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBlbGUgPSB0aGlzWzBdO1xuICBpZiAoZWxlKSB7XG4gICAgcmV0dXJuICFlbGUuaW50ZXJhY3RpdmUoKTtcbiAgfVxufTtcbnZhciBlbGVWaXNpYmxlID0gY2FjaGVTdHlsZUZ1bmN0aW9uKCdlbGVWaXNpYmxlJywgZnVuY3Rpb24gKGVsZSkge1xuICByZXR1cm4gZWxlLnBzdHlsZSgndmlzaWJpbGl0eScpLnZhbHVlID09PSAndmlzaWJsZScgJiYgZWxlLnBzdHlsZSgnb3BhY2l0eScpLnBmVmFsdWUgIT09IDAgJiYgZWxlVGFrZXNVcFNwYWNlKGVsZSk7XG59KTtcbnZhciBlZGdlVmlzaWJsZVZpYU5vZGUgPSBlbGVUYWtlc1VwU3BhY2U7XG5lbGVzZm4kNC52aXNpYmxlID0gY2FjaGVQcm90b3R5cGVTdHlsZUZ1bmN0aW9uKCd2aXNpYmxlJywgZGVmaW5lRGVyaXZlZFN0YXRlRnVuY3Rpb24oe1xuICBvazogZWxlVmlzaWJsZSxcbiAgZWRnZU9rVmlhTm9kZTogZWRnZVZpc2libGVWaWFOb2RlXG59KSk7XG5lbGVzZm4kNC5oaWRkZW4gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBlbGUgPSB0aGlzWzBdO1xuICBpZiAoZWxlKSB7XG4gICAgcmV0dXJuICFlbGUudmlzaWJsZSgpO1xuICB9XG59O1xuZWxlc2ZuJDQuaXNCdW5kbGVkQmV6aWVyID0gY2FjaGVQcm90b3R5cGVTdHlsZUZ1bmN0aW9uKCdpc0J1bmRsZWRCZXppZXInLCBmdW5jdGlvbiAoKSB7XG4gIGlmICghdGhpcy5jeSgpLnN0eWxlRW5hYmxlZCgpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiAhdGhpcy5yZW1vdmVkKCkgJiYgdGhpcy5wc3R5bGUoJ2N1cnZlLXN0eWxlJykudmFsdWUgPT09ICdiZXppZXInICYmIHRoaXMudGFrZXNVcFNwYWNlKCk7XG59KTtcbmVsZXNmbiQ0LmJ5cGFzcyA9IGVsZXNmbiQ0LmNzcyA9IGVsZXNmbiQ0LnN0eWxlO1xuZWxlc2ZuJDQucmVuZGVyZWRDc3MgPSBlbGVzZm4kNC5yZW5kZXJlZFN0eWxlO1xuZWxlc2ZuJDQucmVtb3ZlQnlwYXNzID0gZWxlc2ZuJDQucmVtb3ZlQ3NzID0gZWxlc2ZuJDQucmVtb3ZlU3R5bGU7XG5lbGVzZm4kNC5wc3R5bGUgPSBlbGVzZm4kNC5wYXJzZWRTdHlsZTtcblxudmFyIGVsZXNmbiQzID0ge307XG5mdW5jdGlvbiBkZWZpbmVTd2l0Y2hGdW5jdGlvbihwYXJhbXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICB2YXIgY2hhbmdlZEVsZXMgPSBbXTtcblxuICAgIC8vIGUuZy4gY3kubm9kZXMoKS5zZWxlY3QoIGRhdGEsIGhhbmRsZXIgKVxuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMikge1xuICAgICAgdmFyIGRhdGEgPSBhcmdzWzBdO1xuICAgICAgdmFyIGhhbmRsZXIgPSBhcmdzWzFdO1xuICAgICAgdGhpcy5vbihwYXJhbXMuZXZlbnQsIGRhdGEsIGhhbmRsZXIpO1xuICAgIH1cblxuICAgIC8vIGUuZy4gY3kubm9kZXMoKS5zZWxlY3QoIGhhbmRsZXIgKVxuICAgIGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09PSAxICYmIGZuJDYoYXJnc1swXSkpIHtcbiAgICAgIHZhciBfaGFuZGxlciA9IGFyZ3NbMF07XG4gICAgICB0aGlzLm9uKHBhcmFtcy5ldmVudCwgX2hhbmRsZXIpO1xuICAgIH1cblxuICAgIC8vIGUuZy4gY3kubm9kZXMoKS5zZWxlY3QoKVxuICAgIC8vIGUuZy4gKHByaXZhdGUpIGN5Lm5vZGVzKCkuc2VsZWN0KFsndGFwc2VsZWN0J10pXG4gICAgZWxzZSBpZiAoYXJncy5sZW5ndGggPT09IDAgfHwgYXJncy5sZW5ndGggPT09IDEgJiYgYXJyYXkoYXJnc1swXSkpIHtcbiAgICAgIHZhciBhZGRsRXZlbnRzID0gYXJncy5sZW5ndGggPT09IDEgPyBhcmdzWzBdIDogbnVsbDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICAgICAgdmFyIGFibGUgPSAhcGFyYW1zLmFibGVGaWVsZCB8fCBlbGUuX3ByaXZhdGVbcGFyYW1zLmFibGVGaWVsZF07XG4gICAgICAgIHZhciBjaGFuZ2VkID0gZWxlLl9wcml2YXRlW3BhcmFtcy5maWVsZF0gIT0gcGFyYW1zLnZhbHVlO1xuICAgICAgICBpZiAocGFyYW1zLm92ZXJyaWRlQWJsZSkge1xuICAgICAgICAgIHZhciBvdmVycmlkZUFibGUgPSBwYXJhbXMub3ZlcnJpZGVBYmxlKGVsZSk7XG4gICAgICAgICAgaWYgKG92ZXJyaWRlQWJsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBhYmxlID0gb3ZlcnJpZGVBYmxlO1xuICAgICAgICAgICAgaWYgKCFvdmVycmlkZUFibGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9IC8vIHRvIHNhdmUgY3ljbGVzIGFzc3VtZSBub3QgYWJsZSBmb3IgYWxsIG9uIG92ZXJyaWRlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChhYmxlKSB7XG4gICAgICAgICAgZWxlLl9wcml2YXRlW3BhcmFtcy5maWVsZF0gPSBwYXJhbXMudmFsdWU7XG4gICAgICAgICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgICAgIGNoYW5nZWRFbGVzLnB1c2goZWxlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBjaGFuZ2VkQ29sbCA9IHRoaXMuc3Bhd24oY2hhbmdlZEVsZXMpO1xuICAgICAgY2hhbmdlZENvbGwudXBkYXRlU3R5bGUoKTsgLy8gY2hhbmdlIG9mIHN0YXRlID0+IHBvc3NpYmxlIGNoYW5nZSBvZiBzdHlsZVxuICAgICAgY2hhbmdlZENvbGwuZW1pdChwYXJhbXMuZXZlbnQpO1xuICAgICAgaWYgKGFkZGxFdmVudHMpIHtcbiAgICAgICAgY2hhbmdlZENvbGwuZW1pdChhZGRsRXZlbnRzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG59XG5mdW5jdGlvbiBkZWZpbmVTd2l0Y2hTZXQocGFyYW1zKSB7XG4gIGVsZXNmbiQzW3BhcmFtcy5maWVsZF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgaWYgKGVsZSkge1xuICAgICAgaWYgKHBhcmFtcy5vdmVycmlkZUZpZWxkKSB7XG4gICAgICAgIHZhciB2YWwgPSBwYXJhbXMub3ZlcnJpZGVGaWVsZChlbGUpO1xuICAgICAgICBpZiAodmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZWxlLl9wcml2YXRlW3BhcmFtcy5maWVsZF07XG4gICAgfVxuICB9O1xuICBlbGVzZm4kM1twYXJhbXMub25dID0gZGVmaW5lU3dpdGNoRnVuY3Rpb24oe1xuICAgIGV2ZW50OiBwYXJhbXMub24sXG4gICAgZmllbGQ6IHBhcmFtcy5maWVsZCxcbiAgICBhYmxlRmllbGQ6IHBhcmFtcy5hYmxlRmllbGQsXG4gICAgb3ZlcnJpZGVBYmxlOiBwYXJhbXMub3ZlcnJpZGVBYmxlLFxuICAgIHZhbHVlOiB0cnVlXG4gIH0pO1xuICBlbGVzZm4kM1twYXJhbXMub2ZmXSA9IGRlZmluZVN3aXRjaEZ1bmN0aW9uKHtcbiAgICBldmVudDogcGFyYW1zLm9mZixcbiAgICBmaWVsZDogcGFyYW1zLmZpZWxkLFxuICAgIGFibGVGaWVsZDogcGFyYW1zLmFibGVGaWVsZCxcbiAgICBvdmVycmlkZUFibGU6IHBhcmFtcy5vdmVycmlkZUFibGUsXG4gICAgdmFsdWU6IGZhbHNlXG4gIH0pO1xufVxuZGVmaW5lU3dpdGNoU2V0KHtcbiAgZmllbGQ6ICdsb2NrZWQnLFxuICBvdmVycmlkZUZpZWxkOiBmdW5jdGlvbiBvdmVycmlkZUZpZWxkKGVsZSkge1xuICAgIHJldHVybiBlbGUuY3koKS5hdXRvbG9jaygpID8gdHJ1ZSA6IHVuZGVmaW5lZDtcbiAgfSxcbiAgb246ICdsb2NrJyxcbiAgb2ZmOiAndW5sb2NrJ1xufSk7XG5kZWZpbmVTd2l0Y2hTZXQoe1xuICBmaWVsZDogJ2dyYWJiYWJsZScsXG4gIG92ZXJyaWRlRmllbGQ6IGZ1bmN0aW9uIG92ZXJyaWRlRmllbGQoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5jeSgpLmF1dG91bmdyYWJpZnkoKSB8fCBlbGUucGFubmFibGUoKSA/IGZhbHNlIDogdW5kZWZpbmVkO1xuICB9LFxuICBvbjogJ2dyYWJpZnknLFxuICBvZmY6ICd1bmdyYWJpZnknXG59KTtcbmRlZmluZVN3aXRjaFNldCh7XG4gIGZpZWxkOiAnc2VsZWN0ZWQnLFxuICBhYmxlRmllbGQ6ICdzZWxlY3RhYmxlJyxcbiAgb3ZlcnJpZGVBYmxlOiBmdW5jdGlvbiBvdmVycmlkZUFibGUoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5jeSgpLmF1dG91bnNlbGVjdGlmeSgpID8gZmFsc2UgOiB1bmRlZmluZWQ7XG4gIH0sXG4gIG9uOiAnc2VsZWN0JyxcbiAgb2ZmOiAndW5zZWxlY3QnXG59KTtcbmRlZmluZVN3aXRjaFNldCh7XG4gIGZpZWxkOiAnc2VsZWN0YWJsZScsXG4gIG92ZXJyaWRlRmllbGQ6IGZ1bmN0aW9uIG92ZXJyaWRlRmllbGQoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5jeSgpLmF1dG91bnNlbGVjdGlmeSgpID8gZmFsc2UgOiB1bmRlZmluZWQ7XG4gIH0sXG4gIG9uOiAnc2VsZWN0aWZ5JyxcbiAgb2ZmOiAndW5zZWxlY3RpZnknXG59KTtcbmVsZXNmbiQzLmRlc2VsZWN0ID0gZWxlc2ZuJDMudW5zZWxlY3Q7XG5lbGVzZm4kMy5ncmFiYmVkID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZWxlID0gdGhpc1swXTtcbiAgaWYgKGVsZSkge1xuICAgIHJldHVybiBlbGUuX3ByaXZhdGUuZ3JhYmJlZDtcbiAgfVxufTtcbmRlZmluZVN3aXRjaFNldCh7XG4gIGZpZWxkOiAnYWN0aXZlJyxcbiAgb246ICdhY3RpdmF0ZScsXG4gIG9mZjogJ3VuYWN0aXZhdGUnXG59KTtcbmRlZmluZVN3aXRjaFNldCh7XG4gIGZpZWxkOiAncGFubmFibGUnLFxuICBvbjogJ3BhbmlmeScsXG4gIG9mZjogJ3VucGFuaWZ5J1xufSk7XG5lbGVzZm4kMy5pbmFjdGl2ZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGVsZSA9IHRoaXNbMF07XG4gIGlmIChlbGUpIHtcbiAgICByZXR1cm4gIWVsZS5fcHJpdmF0ZS5hY3RpdmU7XG4gIH1cbn07XG5cbnZhciBlbGVzZm4kMiA9IHt9O1xuXG4vLyBEQUcgZnVuY3Rpb25zXG4vLy8vLy8vLy8vLy8vLy8vXG5cbnZhciBkZWZpbmVEYWdFeHRyZW1pdHkgPSBmdW5jdGlvbiBkZWZpbmVEYWdFeHRyZW1pdHkocGFyYW1zKSB7XG4gIHJldHVybiBmdW5jdGlvbiBkYWdFeHRyZW1pdHlJbXBsKHNlbGVjdG9yKSB7XG4gICAgdmFyIGVsZXMgPSB0aGlzO1xuICAgIHZhciByZXQgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgICAgaWYgKCFlbGUuaXNOb2RlKCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB2YXIgZGlzcXVhbGlmaWVkID0gZmFsc2U7XG4gICAgICB2YXIgZWRnZXMgPSBlbGUuY29ubmVjdGVkRWRnZXMoKTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZWRnZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIGVkZ2UgPSBlZGdlc1tqXTtcbiAgICAgICAgdmFyIHNyYyA9IGVkZ2Uuc291cmNlKCk7XG4gICAgICAgIHZhciB0Z3QgPSBlZGdlLnRhcmdldCgpO1xuICAgICAgICBpZiAocGFyYW1zLm5vSW5jb21pbmdFZGdlcyAmJiB0Z3QgPT09IGVsZSAmJiBzcmMgIT09IGVsZSB8fCBwYXJhbXMubm9PdXRnb2luZ0VkZ2VzICYmIHNyYyA9PT0gZWxlICYmIHRndCAhPT0gZWxlKSB7XG4gICAgICAgICAgZGlzcXVhbGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFkaXNxdWFsaWZpZWQpIHtcbiAgICAgICAgcmV0LnB1c2goZWxlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3Bhd24ocmV0LCB0cnVlKS5maWx0ZXIoc2VsZWN0b3IpO1xuICB9O1xufTtcbnZhciBkZWZpbmVEYWdPbmVIb3AgPSBmdW5jdGlvbiBkZWZpbmVEYWdPbmVIb3AocGFyYW1zKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgICB2YXIgZWxlcyA9IHRoaXM7XG4gICAgdmFyIG9FbGVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICAgIGlmICghZWxlLmlzTm9kZSgpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdmFyIGVkZ2VzID0gZWxlLmNvbm5lY3RlZEVkZ2VzKCk7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGVkZ2VzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBlZGdlID0gZWRnZXNbal07XG4gICAgICAgIHZhciBzcmMgPSBlZGdlLnNvdXJjZSgpO1xuICAgICAgICB2YXIgdGd0ID0gZWRnZS50YXJnZXQoKTtcbiAgICAgICAgaWYgKHBhcmFtcy5vdXRnb2luZyAmJiBzcmMgPT09IGVsZSkge1xuICAgICAgICAgIG9FbGVzLnB1c2goZWRnZSk7XG4gICAgICAgICAgb0VsZXMucHVzaCh0Z3QpO1xuICAgICAgICB9IGVsc2UgaWYgKHBhcmFtcy5pbmNvbWluZyAmJiB0Z3QgPT09IGVsZSkge1xuICAgICAgICAgIG9FbGVzLnB1c2goZWRnZSk7XG4gICAgICAgICAgb0VsZXMucHVzaChzcmMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNwYXduKG9FbGVzLCB0cnVlKS5maWx0ZXIoc2VsZWN0b3IpO1xuICB9O1xufTtcbnZhciBkZWZpbmVEYWdBbGxIb3BzID0gZnVuY3Rpb24gZGVmaW5lRGFnQWxsSG9wcyhwYXJhbXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICAgIHZhciBlbGVzID0gdGhpcztcbiAgICB2YXIgc0VsZXMgPSBbXTtcbiAgICB2YXIgc0VsZXNJZHMgPSB7fTtcbiAgICBmb3IgKDs7KSB7XG4gICAgICB2YXIgbmV4dCA9IHBhcmFtcy5vdXRnb2luZyA/IGVsZXMub3V0Z29lcnMoKSA6IGVsZXMuaW5jb21lcnMoKTtcbiAgICAgIGlmIChuZXh0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH0gLy8gZG9uZSBpZiBub25lIGxlZnRcblxuICAgICAgdmFyIG5ld05leHQgPSBmYWxzZTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmV4dC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgbiA9IG5leHRbaV07XG4gICAgICAgIHZhciBuaWQgPSBuLmlkKCk7XG4gICAgICAgIGlmICghc0VsZXNJZHNbbmlkXSkge1xuICAgICAgICAgIHNFbGVzSWRzW25pZF0gPSB0cnVlO1xuICAgICAgICAgIHNFbGVzLnB1c2gobik7XG4gICAgICAgICAgbmV3TmV4dCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghbmV3TmV4dCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH0gLy8gZG9uZSBpZiB0b3VjaGVkIGFsbCBvdXRnb2VycyBhbHJlYWR5XG5cbiAgICAgIGVsZXMgPSBuZXh0O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zcGF3bihzRWxlcywgdHJ1ZSkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfTtcbn07XG5lbGVzZm4kMi5jbGVhclRyYXZlcnNhbENhY2hlID0gZnVuY3Rpb24gKCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICB0aGlzW2ldLl9wcml2YXRlLnRyYXZlcnNhbENhY2hlID0gbnVsbDtcbiAgfVxufTtcbmV4dGVuZChlbGVzZm4kMiwge1xuICAvLyBnZXQgdGhlIHJvb3Qgbm9kZXMgaW4gdGhlIERBR1xuICByb290czogZGVmaW5lRGFnRXh0cmVtaXR5KHtcbiAgICBub0luY29taW5nRWRnZXM6IHRydWVcbiAgfSksXG4gIC8vIGdldCB0aGUgbGVhZiBub2RlcyBpbiB0aGUgREFHXG4gIGxlYXZlczogZGVmaW5lRGFnRXh0cmVtaXR5KHtcbiAgICBub091dGdvaW5nRWRnZXM6IHRydWVcbiAgfSksXG4gIC8vIG5vcm1hbGx5IGNhbGxlZCBjaGlsZHJlbiBpbiBncmFwaCB0aGVvcnlcbiAgLy8gdGhlc2Ugbm9kZXMgPWVkZ2VzPT4gb3V0Z29pbmcgbm9kZXNcbiAgb3V0Z29lcnM6IGNhY2hlKGRlZmluZURhZ09uZUhvcCh7XG4gICAgb3V0Z29pbmc6IHRydWVcbiAgfSksICdvdXRnb2VycycpLFxuICAvLyBha2EgREFHIGRlc2NlbmRhbnRzXG4gIHN1Y2Nlc3NvcnM6IGRlZmluZURhZ0FsbEhvcHMoe1xuICAgIG91dGdvaW5nOiB0cnVlXG4gIH0pLFxuICAvLyBub3JtYWxseSBjYWxsZWQgcGFyZW50cyBpbiBncmFwaCB0aGVvcnlcbiAgLy8gdGhlc2Ugbm9kZXMgPD1lZGdlcz0gaW5jb21pbmcgbm9kZXNcbiAgaW5jb21lcnM6IGNhY2hlKGRlZmluZURhZ09uZUhvcCh7XG4gICAgaW5jb21pbmc6IHRydWVcbiAgfSksICdpbmNvbWVycycpLFxuICAvLyBha2EgREFHIGFuY2VzdG9yc1xuICBwcmVkZWNlc3NvcnM6IGRlZmluZURhZ0FsbEhvcHMoe1xuICAgIH0pXG59KTtcblxuLy8gTmVpZ2hib3VyaG9vZCBmdW5jdGlvbnNcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbmV4dGVuZChlbGVzZm4kMiwge1xuICBuZWlnaGJvcmhvb2Q6IGNhY2hlKGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICAgIHZhciBlbGVtZW50cyA9IFtdO1xuICAgIHZhciBub2RlcyA9IHRoaXMubm9kZXMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvLyBmb3IgYWxsIG5vZGVzXG4gICAgICB2YXIgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgdmFyIGNvbm5lY3RlZEVkZ2VzID0gbm9kZS5jb25uZWN0ZWRFZGdlcygpO1xuXG4gICAgICAvLyBmb3IgZWFjaCBjb25uZWN0ZWQgZWRnZSwgYWRkIHRoZSBlZGdlIGFuZCB0aGUgb3RoZXIgbm9kZVxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjb25uZWN0ZWRFZGdlcy5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgZWRnZSA9IGNvbm5lY3RlZEVkZ2VzW2pdO1xuICAgICAgICB2YXIgc3JjID0gZWRnZS5zb3VyY2UoKTtcbiAgICAgICAgdmFyIHRndCA9IGVkZ2UudGFyZ2V0KCk7XG4gICAgICAgIHZhciBvdGhlck5vZGUgPSBub2RlID09PSBzcmMgPyB0Z3QgOiBzcmM7XG5cbiAgICAgICAgLy8gbmVlZCBjaGVjayBpbiBjYXNlIG9mIGxvb3BcbiAgICAgICAgaWYgKG90aGVyTm9kZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgZWxlbWVudHMucHVzaChvdGhlck5vZGVbMF0pOyAvLyBhZGQgbm9kZSAxIGhvcCBhd2F5XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhZGQgY29ubmVjdGVkIGVkZ2VcbiAgICAgICAgZWxlbWVudHMucHVzaChlZGdlWzBdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3Bhd24oZWxlbWVudHMsIHRydWUpLmZpbHRlcihzZWxlY3Rvcik7XG4gIH0sICduZWlnaGJvcmhvb2QnKSxcbiAgY2xvc2VkTmVpZ2hib3Job29kOiBmdW5jdGlvbiBjbG9zZWROZWlnaGJvcmhvb2Qoc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gdGhpcy5uZWlnaGJvcmhvb2QoKS5hZGQodGhpcykuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfSxcbiAgb3Blbk5laWdoYm9yaG9vZDogZnVuY3Rpb24gb3Blbk5laWdoYm9yaG9vZChzZWxlY3Rvcikge1xuICAgIHJldHVybiB0aGlzLm5laWdoYm9yaG9vZChzZWxlY3Rvcik7XG4gIH1cbn0pO1xuXG4vLyBhbGlhc2VzXG5lbGVzZm4kMi5uZWlnaGJvdXJob29kID0gZWxlc2ZuJDIubmVpZ2hib3Job29kO1xuZWxlc2ZuJDIuY2xvc2VkTmVpZ2hib3VyaG9vZCA9IGVsZXNmbiQyLmNsb3NlZE5laWdoYm9yaG9vZDtcbmVsZXNmbiQyLm9wZW5OZWlnaGJvdXJob29kID0gZWxlc2ZuJDIub3Blbk5laWdoYm9yaG9vZDtcblxuLy8gRWRnZSBmdW5jdGlvbnNcbi8vLy8vLy8vLy8vLy8vLy8vXG5cbmV4dGVuZChlbGVzZm4kMiwge1xuICBzb3VyY2U6IGNhY2hlKGZ1bmN0aW9uIHNvdXJjZUltcGwoc2VsZWN0b3IpIHtcbiAgICB2YXIgZWxlID0gdGhpc1swXTtcbiAgICB2YXIgc3JjO1xuICAgIGlmIChlbGUpIHtcbiAgICAgIHNyYyA9IGVsZS5fcHJpdmF0ZS5zb3VyY2UgfHwgZWxlLmN5KCkuY29sbGVjdGlvbigpO1xuICAgIH1cbiAgICByZXR1cm4gc3JjICYmIHNlbGVjdG9yID8gc3JjLmZpbHRlcihzZWxlY3RvcikgOiBzcmM7XG4gIH0sICdzb3VyY2UnKSxcbiAgdGFyZ2V0OiBjYWNoZShmdW5jdGlvbiB0YXJnZXRJbXBsKHNlbGVjdG9yKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgdmFyIHRndDtcbiAgICBpZiAoZWxlKSB7XG4gICAgICB0Z3QgPSBlbGUuX3ByaXZhdGUudGFyZ2V0IHx8IGVsZS5jeSgpLmNvbGxlY3Rpb24oKTtcbiAgICB9XG4gICAgcmV0dXJuIHRndCAmJiBzZWxlY3RvciA/IHRndC5maWx0ZXIoc2VsZWN0b3IpIDogdGd0O1xuICB9LCAndGFyZ2V0JyksXG4gIHNvdXJjZXM6IGRlZmluZVNvdXJjZUZ1bmN0aW9uKHtcbiAgICBhdHRyOiAnc291cmNlJ1xuICB9KSxcbiAgdGFyZ2V0czogZGVmaW5lU291cmNlRnVuY3Rpb24oe1xuICAgIGF0dHI6ICd0YXJnZXQnXG4gIH0pXG59KTtcbmZ1bmN0aW9uIGRlZmluZVNvdXJjZUZ1bmN0aW9uKHBhcmFtcykge1xuICByZXR1cm4gZnVuY3Rpb24gc291cmNlSW1wbChzZWxlY3Rvcikge1xuICAgIHZhciBzb3VyY2VzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICAgIHZhciBzcmMgPSBlbGUuX3ByaXZhdGVbcGFyYW1zLmF0dHJdO1xuICAgICAgaWYgKHNyYykge1xuICAgICAgICBzb3VyY2VzLnB1c2goc3JjKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3Bhd24oc291cmNlcywgdHJ1ZSkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfTtcbn1cbmV4dGVuZChlbGVzZm4kMiwge1xuICBlZGdlc1dpdGg6IGNhY2hlKGRlZmluZUVkZ2VzV2l0aEZ1bmN0aW9uKCksICdlZGdlc1dpdGgnKSxcbiAgZWRnZXNUbzogY2FjaGUoZGVmaW5lRWRnZXNXaXRoRnVuY3Rpb24oe1xuICAgIHRoaXNJc1NyYzogdHJ1ZVxuICB9KSwgJ2VkZ2VzVG8nKVxufSk7XG5mdW5jdGlvbiBkZWZpbmVFZGdlc1dpdGhGdW5jdGlvbihwYXJhbXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGVkZ2VzV2l0aEltcGwob3RoZXJOb2Rlcykge1xuICAgIHZhciBlbGVtZW50cyA9IFtdO1xuICAgIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3k7XG4gICAgdmFyIHAgPSBwYXJhbXMgfHwge307XG5cbiAgICAvLyBnZXQgZWxlbWVudHMgaWYgYSBzZWxlY3RvciBpcyBzcGVjaWZpZWRcbiAgICBpZiAoc3RyaW5nKG90aGVyTm9kZXMpKSB7XG4gICAgICBvdGhlck5vZGVzID0gY3kuJChvdGhlck5vZGVzKTtcbiAgICB9XG4gICAgZm9yICh2YXIgaCA9IDA7IGggPCBvdGhlck5vZGVzLmxlbmd0aDsgaCsrKSB7XG4gICAgICB2YXIgZWRnZXMgPSBvdGhlck5vZGVzW2hdLl9wcml2YXRlLmVkZ2VzO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlZGdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWRnZSA9IGVkZ2VzW2ldO1xuICAgICAgICB2YXIgZWRnZURhdGEgPSBlZGdlLl9wcml2YXRlLmRhdGE7XG4gICAgICAgIHZhciB0aGlzVG9PdGhlciA9IHRoaXMuaGFzRWxlbWVudFdpdGhJZChlZGdlRGF0YS5zb3VyY2UpICYmIG90aGVyTm9kZXMuaGFzRWxlbWVudFdpdGhJZChlZGdlRGF0YS50YXJnZXQpO1xuICAgICAgICB2YXIgb3RoZXJUb1RoaXMgPSBvdGhlck5vZGVzLmhhc0VsZW1lbnRXaXRoSWQoZWRnZURhdGEuc291cmNlKSAmJiB0aGlzLmhhc0VsZW1lbnRXaXRoSWQoZWRnZURhdGEudGFyZ2V0KTtcbiAgICAgICAgdmFyIGVkZ2VDb25uZWN0c1RoaXNBbmRPdGhlciA9IHRoaXNUb090aGVyIHx8IG90aGVyVG9UaGlzO1xuICAgICAgICBpZiAoIWVkZ2VDb25uZWN0c1RoaXNBbmRPdGhlcikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwLnRoaXNJc1NyYyB8fCBwLnRoaXNJc1RndCkge1xuICAgICAgICAgIGlmIChwLnRoaXNJc1NyYyAmJiAhdGhpc1RvT3RoZXIpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocC50aGlzSXNUZ3QgJiYgIW90aGVyVG9UaGlzKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxlbWVudHMucHVzaChlZGdlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3Bhd24oZWxlbWVudHMsIHRydWUpO1xuICB9O1xufVxuZXh0ZW5kKGVsZXNmbiQyLCB7XG4gIGNvbm5lY3RlZEVkZ2VzOiBjYWNoZShmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgICB2YXIgcmV0RWxlcyA9IFtdO1xuICAgIHZhciBlbGVzID0gdGhpcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBub2RlID0gZWxlc1tpXTtcbiAgICAgIGlmICghbm9kZS5pc05vZGUoKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBlZGdlcyA9IG5vZGUuX3ByaXZhdGUuZWRnZXM7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGVkZ2VzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBlZGdlID0gZWRnZXNbal07XG4gICAgICAgIHJldEVsZXMucHVzaChlZGdlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3Bhd24ocmV0RWxlcywgdHJ1ZSkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfSwgJ2Nvbm5lY3RlZEVkZ2VzJyksXG4gIGNvbm5lY3RlZE5vZGVzOiBjYWNoZShmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgICB2YXIgcmV0RWxlcyA9IFtdO1xuICAgIHZhciBlbGVzID0gdGhpcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlZGdlID0gZWxlc1tpXTtcbiAgICAgIGlmICghZWRnZS5pc0VkZ2UoKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJldEVsZXMucHVzaChlZGdlLnNvdXJjZSgpWzBdKTtcbiAgICAgIHJldEVsZXMucHVzaChlZGdlLnRhcmdldCgpWzBdKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3Bhd24ocmV0RWxlcywgdHJ1ZSkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfSwgJ2Nvbm5lY3RlZE5vZGVzJyksXG4gIHBhcmFsbGVsRWRnZXM6IGNhY2hlKGRlZmluZVBhcmFsbGVsRWRnZXNGdW5jdGlvbigpLCAncGFyYWxsZWxFZGdlcycpLFxuICBjb2RpcmVjdGVkRWRnZXM6IGNhY2hlKGRlZmluZVBhcmFsbGVsRWRnZXNGdW5jdGlvbih7XG4gICAgY29kaXJlY3RlZDogdHJ1ZVxuICB9KSwgJ2NvZGlyZWN0ZWRFZGdlcycpXG59KTtcbmZ1bmN0aW9uIGRlZmluZVBhcmFsbGVsRWRnZXNGdW5jdGlvbihwYXJhbXMpIHtcbiAgdmFyIGRlZmF1bHRzID0ge1xuICAgIGNvZGlyZWN0ZWQ6IGZhbHNlXG4gIH07XG4gIHBhcmFtcyA9IGV4dGVuZCh7fSwgZGVmYXVsdHMsIHBhcmFtcyk7XG4gIHJldHVybiBmdW5jdGlvbiBwYXJhbGxlbEVkZ2VzSW1wbChzZWxlY3Rvcikge1xuICAgIC8vIG1pY3JvLW9wdGltaXNlZCBmb3IgcmVuZGVyZXJcbiAgICB2YXIgZWxlbWVudHMgPSBbXTtcbiAgICB2YXIgZWRnZXMgPSB0aGlzLmVkZ2VzKCk7XG4gICAgdmFyIHAgPSBwYXJhbXM7XG5cbiAgICAvLyBsb29rIGF0IGFsbCB0aGUgZWRnZXMgaW4gdGhlIGNvbGxlY3Rpb25cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVkZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWRnZTEgPSBlZGdlc1tpXTtcbiAgICAgIHZhciBlZGdlMV9wID0gZWRnZTEuX3ByaXZhdGU7XG4gICAgICB2YXIgc3JjMSA9IGVkZ2UxX3Auc291cmNlO1xuICAgICAgdmFyIHNyY2lkMSA9IHNyYzEuX3ByaXZhdGUuZGF0YS5pZDtcbiAgICAgIHZhciB0Z3RpZDEgPSBlZGdlMV9wLmRhdGEudGFyZ2V0O1xuICAgICAgdmFyIHNyY0VkZ2VzMSA9IHNyYzEuX3ByaXZhdGUuZWRnZXM7XG5cbiAgICAgIC8vIGxvb2sgYXQgZWRnZXMgY29ubmVjdGVkIHRvIHRoZSBzcmMgbm9kZSBvZiB0aGlzIGVkZ2VcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgc3JjRWRnZXMxLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBlZGdlMiA9IHNyY0VkZ2VzMVtqXTtcbiAgICAgICAgdmFyIGVkZ2UyZGF0YSA9IGVkZ2UyLl9wcml2YXRlLmRhdGE7XG4gICAgICAgIHZhciB0Z3RpZDIgPSBlZGdlMmRhdGEudGFyZ2V0O1xuICAgICAgICB2YXIgc3JjaWQyID0gZWRnZTJkYXRhLnNvdXJjZTtcbiAgICAgICAgdmFyIGNvZGlyZWN0ZWQgPSB0Z3RpZDIgPT09IHRndGlkMSAmJiBzcmNpZDIgPT09IHNyY2lkMTtcbiAgICAgICAgdmFyIG9wcGRpcmVjdGVkID0gc3JjaWQxID09PSB0Z3RpZDIgJiYgdGd0aWQxID09PSBzcmNpZDI7XG4gICAgICAgIGlmIChwLmNvZGlyZWN0ZWQgJiYgY29kaXJlY3RlZCB8fCAhcC5jb2RpcmVjdGVkICYmIChjb2RpcmVjdGVkIHx8IG9wcGRpcmVjdGVkKSkge1xuICAgICAgICAgIGVsZW1lbnRzLnB1c2goZWRnZTIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNwYXduKGVsZW1lbnRzLCB0cnVlKS5maWx0ZXIoc2VsZWN0b3IpO1xuICB9O1xufVxuXG4vLyBNaXNjIGZ1bmN0aW9uc1xuLy8vLy8vLy8vLy8vLy8vLy9cblxuZXh0ZW5kKGVsZXNmbiQyLCB7XG4gIGNvbXBvbmVudHM6IGZ1bmN0aW9uIGNvbXBvbmVudHMocm9vdCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgY3kgPSBzZWxmLmN5KCk7XG4gICAgdmFyIHZpc2l0ZWQgPSBjeS5jb2xsZWN0aW9uKCk7XG4gICAgdmFyIHVudmlzaXRlZCA9IHJvb3QgPT0gbnVsbCA/IHNlbGYubm9kZXMoKSA6IHJvb3Qubm9kZXMoKTtcbiAgICB2YXIgY29tcG9uZW50cyA9IFtdO1xuICAgIGlmIChyb290ICE9IG51bGwgJiYgdW52aXNpdGVkLmVtcHR5KCkpIHtcbiAgICAgIC8vIHJvb3QgbWF5IGNvbnRhaW4gb25seSBlZGdlc1xuICAgICAgdW52aXNpdGVkID0gcm9vdC5zb3VyY2VzKCk7IC8vIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIG5vZGUgdG8gdXNlICh1bmRpcmVjdGVkKSwgc28ganVzdCB1c2UgdGhlIHNvdXJjZSBzaWRlc1xuICAgIH1cbiAgICB2YXIgdmlzaXRJbkNvbXBvbmVudCA9IGZ1bmN0aW9uIHZpc2l0SW5Db21wb25lbnQobm9kZSwgY29tcG9uZW50KSB7XG4gICAgICB2aXNpdGVkLm1lcmdlKG5vZGUpO1xuICAgICAgdW52aXNpdGVkLnVubWVyZ2Uobm9kZSk7XG4gICAgICBjb21wb25lbnQubWVyZ2Uobm9kZSk7XG4gICAgfTtcbiAgICBpZiAodW52aXNpdGVkLmVtcHR5KCkpIHtcbiAgICAgIHJldHVybiBzZWxmLnNwYXduKCk7XG4gICAgfVxuICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKCkge1xuICAgICAgLy8gZWFjaCBpdGVyYXRpb24geWllbGRzIGEgY29tcG9uZW50XG4gICAgICB2YXIgY21wdCA9IGN5LmNvbGxlY3Rpb24oKTtcbiAgICAgIGNvbXBvbmVudHMucHVzaChjbXB0KTtcbiAgICAgIHZhciByb290ID0gdW52aXNpdGVkWzBdO1xuICAgICAgdmlzaXRJbkNvbXBvbmVudChyb290LCBjbXB0KTtcbiAgICAgIHNlbGYuYmZzKHtcbiAgICAgICAgZGlyZWN0ZWQ6IGZhbHNlLFxuICAgICAgICByb290czogcm9vdCxcbiAgICAgICAgdmlzaXQ6IGZ1bmN0aW9uIHZpc2l0KHYpIHtcbiAgICAgICAgICByZXR1cm4gdmlzaXRJbkNvbXBvbmVudCh2LCBjbXB0KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjbXB0LmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgbm9kZS5jb25uZWN0ZWRFZGdlcygpLmZvckVhY2goZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAvLyBjb25uZWN0ZWRFZGdlcygpIHVzdWFsbHkgY2FjaGVkXG4gICAgICAgICAgaWYgKHNlbGYuaGFzKGUpICYmIGNtcHQuaGFzKGUuc291cmNlKCkpICYmIGNtcHQuaGFzKGUudGFyZ2V0KCkpKSB7XG4gICAgICAgICAgICAvLyBoYXMoKSBpcyBjaGVhcFxuICAgICAgICAgICAgY21wdC5tZXJnZShlKTsgLy8gZm9yRWFjaCgpIG9ubHkgY29uc2lkZXJzIG5vZGVzIC0tIHNldHMgTiBhdCBjYWxsIHRpbWVcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfTtcbiAgICBkbyB7XG4gICAgICBfbG9vcCgpO1xuICAgIH0gd2hpbGUgKHVudmlzaXRlZC5sZW5ndGggPiAwKTtcbiAgICByZXR1cm4gY29tcG9uZW50cztcbiAgfSxcbiAgY29tcG9uZW50OiBmdW5jdGlvbiBjb21wb25lbnQoKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgcmV0dXJuIGVsZS5jeSgpLm11dGFibGVFbGVtZW50cygpLmNvbXBvbmVudHMoZWxlKVswXTtcbiAgfVxufSk7XG5lbGVzZm4kMi5jb21wb25lbnRzT2YgPSBlbGVzZm4kMi5jb21wb25lbnRzO1xuXG4vLyByZXByZXNlbnRzIGEgc2V0IG9mIG5vZGVzLCBlZGdlcywgb3IgYm90aCB0b2dldGhlclxudmFyIENvbGxlY3Rpb24gPSBmdW5jdGlvbiBDb2xsZWN0aW9uKGN5LCBlbGVtZW50cykge1xuICB2YXIgdW5pcXVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTtcbiAgdmFyIHJlbW92ZWQgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IGZhbHNlO1xuICBpZiAoY3kgPT09IHVuZGVmaW5lZCkge1xuICAgIGVycm9yKCdBIGNvbGxlY3Rpb24gbXVzdCBoYXZlIGEgcmVmZXJlbmNlIHRvIHRoZSBjb3JlJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBtYXAgPSBuZXcgTWFwJDEoKTtcbiAgdmFyIGNyZWF0ZWRFbGVtZW50cyA9IGZhbHNlO1xuICBpZiAoIWVsZW1lbnRzKSB7XG4gICAgZWxlbWVudHMgPSBbXTtcbiAgfSBlbHNlIGlmIChlbGVtZW50cy5sZW5ndGggPiAwICYmIHBsYWluT2JqZWN0KGVsZW1lbnRzWzBdKSAmJiAhZWxlbWVudChlbGVtZW50c1swXSkpIHtcbiAgICBjcmVhdGVkRWxlbWVudHMgPSB0cnVlO1xuXG4gICAgLy8gbWFrZSBlbGVtZW50cyBmcm9tIGpzb24gYW5kIHJlc3RvcmUgYWxsIGF0IG9uY2UgbGF0ZXJcbiAgICB2YXIgZWxlcyA9IFtdO1xuICAgIHZhciBlbGVzSWRzID0gbmV3IFNldCQxKCk7XG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBlbGVtZW50cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIHZhciBqc29uID0gZWxlbWVudHNbaV07XG4gICAgICBpZiAoanNvbi5kYXRhID09IG51bGwpIHtcbiAgICAgICAganNvbi5kYXRhID0ge307XG4gICAgICB9XG4gICAgICB2YXIgX2RhdGEgPSBqc29uLmRhdGE7XG5cbiAgICAgIC8vIG1ha2Ugc3VyZSBuZXdseSBjcmVhdGVkIGVsZW1lbnRzIGhhdmUgdmFsaWQgaWRzXG4gICAgICBpZiAoX2RhdGEuaWQgPT0gbnVsbCkge1xuICAgICAgICBfZGF0YS5pZCA9IHV1aWQoKTtcbiAgICAgIH0gZWxzZSBpZiAoY3kuaGFzRWxlbWVudFdpdGhJZChfZGF0YS5pZCkgfHwgZWxlc0lkcy5oYXMoX2RhdGEuaWQpKSB7XG4gICAgICAgIGNvbnRpbnVlOyAvLyBjYW4ndCBjcmVhdGUgZWxlbWVudCBpZiBwcmlvciBpZCBhbHJlYWR5IGV4aXN0c1xuICAgICAgfVxuICAgICAgdmFyIGVsZSA9IG5ldyBFbGVtZW50KGN5LCBqc29uLCBmYWxzZSk7XG4gICAgICBlbGVzLnB1c2goZWxlKTtcbiAgICAgIGVsZXNJZHMuYWRkKF9kYXRhLmlkKTtcbiAgICB9XG4gICAgZWxlbWVudHMgPSBlbGVzO1xuICB9XG4gIHRoaXMubGVuZ3RoID0gMDtcbiAgZm9yICh2YXIgX2kgPSAwLCBfbCA9IGVsZW1lbnRzLmxlbmd0aDsgX2kgPCBfbDsgX2krKykge1xuICAgIHZhciBlbGVtZW50JDEgPSBlbGVtZW50c1tfaV1bMF07IC8vIFswXSBpbiBjYXNlIGVsZW1lbnRzIGlzIGFuIGFycmF5IG9mIGNvbGxlY3Rpb25zLCByYXRoZXIgdGhhbiBhcnJheSBvZiBlbGVtZW50c1xuICAgIGlmIChlbGVtZW50JDEgPT0gbnVsbCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHZhciBpZCA9IGVsZW1lbnQkMS5fcHJpdmF0ZS5kYXRhLmlkO1xuICAgIGlmICghdW5pcXVlIHx8ICFtYXAuaGFzKGlkKSkge1xuICAgICAgaWYgKHVuaXF1ZSkge1xuICAgICAgICBtYXAuc2V0KGlkLCB7XG4gICAgICAgICAgaW5kZXg6IHRoaXMubGVuZ3RoLFxuICAgICAgICAgIGVsZTogZWxlbWVudCQxXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdGhpc1t0aGlzLmxlbmd0aF0gPSBlbGVtZW50JDE7XG4gICAgICB0aGlzLmxlbmd0aCsrO1xuICAgIH1cbiAgfVxuICB0aGlzLl9wcml2YXRlID0ge1xuICAgIGVsZXM6IHRoaXMsXG4gICAgY3k6IGN5LFxuICAgIGdldCBtYXAoKSB7XG4gICAgICBpZiAodGhpcy5sYXp5TWFwID09IG51bGwpIHtcbiAgICAgICAgdGhpcy5yZWJ1aWxkTWFwKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5sYXp5TWFwO1xuICAgIH0sXG4gICAgc2V0IG1hcChtKSB7XG4gICAgICB0aGlzLmxhenlNYXAgPSBtO1xuICAgIH0sXG4gICAgcmVidWlsZE1hcDogZnVuY3Rpb24gcmVidWlsZE1hcCgpIHtcbiAgICAgIHZhciBtID0gdGhpcy5sYXp5TWFwID0gbmV3IE1hcCQxKCk7XG4gICAgICB2YXIgZWxlcyA9IHRoaXMuZWxlcztcbiAgICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IGVsZXMubGVuZ3RoOyBfaTIrKykge1xuICAgICAgICB2YXIgX2VsZSA9IGVsZXNbX2kyXTtcbiAgICAgICAgbS5zZXQoX2VsZS5pZCgpLCB7XG4gICAgICAgICAgaW5kZXg6IF9pMixcbiAgICAgICAgICBlbGU6IF9lbGVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBpZiAodW5pcXVlKSB7XG4gICAgdGhpcy5fcHJpdmF0ZS5tYXAgPSBtYXA7XG4gIH1cblxuICAvLyByZXN0b3JlIHRoZSBlbGVtZW50cyBpZiB3ZSBjcmVhdGVkIHRoZW0gZnJvbSBqc29uXG4gIGlmIChjcmVhdGVkRWxlbWVudHMgJiYgIXJlbW92ZWQpIHtcbiAgICB0aGlzLnJlc3RvcmUoKTtcbiAgfVxufTtcblxuLy8gRnVuY3Rpb25zXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbi8vIGtlZXAgdGhlIHByb3RvdHlwZXMgaW4gc3luYyAoYW4gZWxlbWVudCBoYXMgdGhlIHNhbWUgZnVuY3Rpb25zIGFzIGEgY29sbGVjdGlvbilcbi8vIGFuZCB1c2UgZWxlZm4gYW5kIGVsZXNmbiBhcyBzaG9ydGhhbmRzIHRvIHRoZSBwcm90b3R5cGVzXG52YXIgZWxlc2ZuJDEgPSBFbGVtZW50LnByb3RvdHlwZSA9IENvbGxlY3Rpb24ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShBcnJheS5wcm90b3R5cGUpO1xuZWxlc2ZuJDEuaW5zdGFuY2VTdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAnY29sbGVjdGlvbic7XG59O1xuZWxlc2ZuJDEuc3Bhd24gPSBmdW5jdGlvbiAoZWxlcywgdW5pcXVlKSB7XG4gIHJldHVybiBuZXcgQ29sbGVjdGlvbih0aGlzLmN5KCksIGVsZXMsIHVuaXF1ZSk7XG59O1xuZWxlc2ZuJDEuc3Bhd25TZWxmID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5zcGF3bih0aGlzKTtcbn07XG5lbGVzZm4kMS5jeSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuY3k7XG59O1xuZWxlc2ZuJDEucmVuZGVyZXIgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLl9wcml2YXRlLmN5LnJlbmRlcmVyKCk7XG59O1xuZWxlc2ZuJDEuZWxlbWVudCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXNbMF07XG59O1xuZWxlc2ZuJDEuY29sbGVjdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKGNvbGxlY3Rpb24odGhpcykpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSBlbHNlIHtcbiAgICAvLyBhbiBlbGVtZW50XG4gICAgcmV0dXJuIG5ldyBDb2xsZWN0aW9uKHRoaXMuX3ByaXZhdGUuY3ksIFt0aGlzXSk7XG4gIH1cbn07XG5lbGVzZm4kMS51bmlxdWUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBuZXcgQ29sbGVjdGlvbih0aGlzLl9wcml2YXRlLmN5LCB0aGlzLCB0cnVlKTtcbn07XG5lbGVzZm4kMS5oYXNFbGVtZW50V2l0aElkID0gZnVuY3Rpb24gKGlkKSB7XG4gIGlkID0gJycgKyBpZDsgLy8gaWQgbXVzdCBiZSBzdHJpbmdcblxuICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5tYXAuaGFzKGlkKTtcbn07XG5lbGVzZm4kMS5nZXRFbGVtZW50QnlJZCA9IGZ1bmN0aW9uIChpZCkge1xuICBpZCA9ICcnICsgaWQ7IC8vIGlkIG11c3QgYmUgc3RyaW5nXG5cbiAgdmFyIGN5ID0gdGhpcy5fcHJpdmF0ZS5jeTtcbiAgdmFyIGVudHJ5ID0gdGhpcy5fcHJpdmF0ZS5tYXAuZ2V0KGlkKTtcbiAgcmV0dXJuIGVudHJ5ID8gZW50cnkuZWxlIDogbmV3IENvbGxlY3Rpb24oY3kpOyAvLyBnZXQgZWxlIG9yIGVtcHR5IGNvbGxlY3Rpb25cbn07XG5lbGVzZm4kMS4kaWQgPSBlbGVzZm4kMS5nZXRFbGVtZW50QnlJZDtcbmVsZXNmbiQxLnBvb2xJbmRleCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGN5ID0gdGhpcy5fcHJpdmF0ZS5jeTtcbiAgdmFyIGVsZXMgPSBjeS5fcHJpdmF0ZS5lbGVtZW50cztcbiAgdmFyIGlkID0gdGhpc1swXS5fcHJpdmF0ZS5kYXRhLmlkO1xuICByZXR1cm4gZWxlcy5fcHJpdmF0ZS5tYXAuZ2V0KGlkKS5pbmRleDtcbn07XG5lbGVzZm4kMS5pbmRleE9mID0gZnVuY3Rpb24gKGVsZSkge1xuICB2YXIgaWQgPSBlbGVbMF0uX3ByaXZhdGUuZGF0YS5pZDtcbiAgcmV0dXJuIHRoaXMuX3ByaXZhdGUubWFwLmdldChpZCkuaW5kZXg7XG59O1xuZWxlc2ZuJDEuaW5kZXhPZklkID0gZnVuY3Rpb24gKGlkKSB7XG4gIGlkID0gJycgKyBpZDsgLy8gaWQgbXVzdCBiZSBzdHJpbmdcblxuICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5tYXAuZ2V0KGlkKS5pbmRleDtcbn07XG5lbGVzZm4kMS5qc29uID0gZnVuY3Rpb24gKG9iaikge1xuICB2YXIgZWxlID0gdGhpcy5lbGVtZW50KCk7XG4gIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgaWYgKGVsZSA9PSBudWxsICYmIG9iaikge1xuICAgIHJldHVybiB0aGlzO1xuICB9IC8vIGNhbid0IHNldCB0byBubyBlbGVzXG5cbiAgaWYgKGVsZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfSAvLyBjYW4ndCBnZXQgZnJvbSBubyBlbGVzXG5cbiAgdmFyIHAgPSBlbGUuX3ByaXZhdGU7XG4gIGlmIChwbGFpbk9iamVjdChvYmopKSB7XG4gICAgLy8gc2V0XG5cbiAgICBjeS5zdGFydEJhdGNoKCk7XG4gICAgaWYgKG9iai5kYXRhKSB7XG4gICAgICBlbGUuZGF0YShvYmouZGF0YSk7XG4gICAgICB2YXIgX2RhdGEyID0gcC5kYXRhO1xuICAgICAgaWYgKGVsZS5pc0VkZ2UoKSkge1xuICAgICAgICAvLyBzb3VyY2UgYW5kIHRhcmdldCBhcmUgaW1tdXRhYmxlIHZpYSBkYXRhKClcbiAgICAgICAgdmFyIG1vdmUgPSBmYWxzZTtcbiAgICAgICAgdmFyIHNwZWMgPSB7fTtcbiAgICAgICAgdmFyIHNyYyA9IG9iai5kYXRhLnNvdXJjZTtcbiAgICAgICAgdmFyIHRndCA9IG9iai5kYXRhLnRhcmdldDtcbiAgICAgICAgaWYgKHNyYyAhPSBudWxsICYmIHNyYyAhPSBfZGF0YTIuc291cmNlKSB7XG4gICAgICAgICAgc3BlYy5zb3VyY2UgPSAnJyArIHNyYzsgLy8gaWQgbXVzdCBiZSBzdHJpbmdcbiAgICAgICAgICBtb3ZlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGd0ICE9IG51bGwgJiYgdGd0ICE9IF9kYXRhMi50YXJnZXQpIHtcbiAgICAgICAgICBzcGVjLnRhcmdldCA9ICcnICsgdGd0OyAvLyBpZCBtdXN0IGJlIHN0cmluZ1xuICAgICAgICAgIG1vdmUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtb3ZlKSB7XG4gICAgICAgICAgZWxlID0gZWxlLm1vdmUoc3BlYyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHBhcmVudCBpcyBpbW11dGFibGUgdmlhIGRhdGEoKVxuICAgICAgICB2YXIgbmV3UGFyZW50VmFsU3BlY2QgPSAncGFyZW50JyBpbiBvYmouZGF0YTtcbiAgICAgICAgdmFyIHBhcmVudCA9IG9iai5kYXRhLnBhcmVudDtcbiAgICAgICAgaWYgKG5ld1BhcmVudFZhbFNwZWNkICYmIChwYXJlbnQgIT0gbnVsbCB8fCBfZGF0YTIucGFyZW50ICE9IG51bGwpICYmIHBhcmVudCAhPSBfZGF0YTIucGFyZW50KSB7XG4gICAgICAgICAgaWYgKHBhcmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBjYW4ndCBzZXQgdW5kZWZpbmVkIGltcGVyYXRpdmVseSwgc28gdXNlIG51bGxcbiAgICAgICAgICAgIHBhcmVudCA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgcGFyZW50ID0gJycgKyBwYXJlbnQ7IC8vIGlkIG11c3QgYmUgc3RyaW5nXG4gICAgICAgICAgfVxuICAgICAgICAgIGVsZSA9IGVsZS5tb3ZlKHtcbiAgICAgICAgICAgIHBhcmVudDogcGFyZW50XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG9iai5wb3NpdGlvbikge1xuICAgICAgZWxlLnBvc2l0aW9uKG9iai5wb3NpdGlvbik7XG4gICAgfVxuXG4gICAgLy8gaWdub3JlIGdyb3VwIC0tIGltbXV0YWJsZVxuXG4gICAgdmFyIGNoZWNrU3dpdGNoID0gZnVuY3Rpb24gY2hlY2tTd2l0Y2goaywgdHJ1ZUZuTmFtZSwgZmFsc2VGbk5hbWUpIHtcbiAgICAgIHZhciBvYmpfayA9IG9ialtrXTtcbiAgICAgIGlmIChvYmpfayAhPSBudWxsICYmIG9ial9rICE9PSBwW2tdKSB7XG4gICAgICAgIGlmIChvYmpfaykge1xuICAgICAgICAgIGVsZVt0cnVlRm5OYW1lXSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVsZVtmYWxzZUZuTmFtZV0oKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgY2hlY2tTd2l0Y2goJ3JlbW92ZWQnLCAncmVtb3ZlJywgJ3Jlc3RvcmUnKTtcbiAgICBjaGVja1N3aXRjaCgnc2VsZWN0ZWQnLCAnc2VsZWN0JywgJ3Vuc2VsZWN0Jyk7XG4gICAgY2hlY2tTd2l0Y2goJ3NlbGVjdGFibGUnLCAnc2VsZWN0aWZ5JywgJ3Vuc2VsZWN0aWZ5Jyk7XG4gICAgY2hlY2tTd2l0Y2goJ2xvY2tlZCcsICdsb2NrJywgJ3VubG9jaycpO1xuICAgIGNoZWNrU3dpdGNoKCdncmFiYmFibGUnLCAnZ3JhYmlmeScsICd1bmdyYWJpZnknKTtcbiAgICBjaGVja1N3aXRjaCgncGFubmFibGUnLCAncGFuaWZ5JywgJ3VucGFuaWZ5Jyk7XG4gICAgaWYgKG9iai5jbGFzc2VzICE9IG51bGwpIHtcbiAgICAgIGVsZS5jbGFzc2VzKG9iai5jbGFzc2VzKTtcbiAgICB9XG4gICAgY3kuZW5kQmF0Y2goKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSBlbHNlIGlmIChvYmogPT09IHVuZGVmaW5lZCkge1xuICAgIC8vIGdldFxuXG4gICAgdmFyIGpzb24gPSB7XG4gICAgICBkYXRhOiBjb3B5KHAuZGF0YSksXG4gICAgICBwb3NpdGlvbjogY29weShwLnBvc2l0aW9uKSxcbiAgICAgIGdyb3VwOiBwLmdyb3VwLFxuICAgICAgcmVtb3ZlZDogcC5yZW1vdmVkLFxuICAgICAgc2VsZWN0ZWQ6IHAuc2VsZWN0ZWQsXG4gICAgICBzZWxlY3RhYmxlOiBwLnNlbGVjdGFibGUsXG4gICAgICBsb2NrZWQ6IHAubG9ja2VkLFxuICAgICAgZ3JhYmJhYmxlOiBwLmdyYWJiYWJsZSxcbiAgICAgIHBhbm5hYmxlOiBwLnBhbm5hYmxlLFxuICAgICAgY2xhc3NlczogbnVsbFxuICAgIH07XG4gICAganNvbi5jbGFzc2VzID0gJyc7XG4gICAgdmFyIGkgPSAwO1xuICAgIHAuY2xhc3Nlcy5mb3JFYWNoKGZ1bmN0aW9uIChjbHMpIHtcbiAgICAgIHJldHVybiBqc29uLmNsYXNzZXMgKz0gaSsrID09PSAwID8gY2xzIDogJyAnICsgY2xzO1xuICAgIH0pO1xuICAgIHJldHVybiBqc29uO1xuICB9XG59O1xuZWxlc2ZuJDEuanNvbnMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBqc29ucyA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICB2YXIganNvbiA9IGVsZS5qc29uKCk7XG4gICAganNvbnMucHVzaChqc29uKTtcbiAgfVxuICByZXR1cm4ganNvbnM7XG59O1xuZWxlc2ZuJDEuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgdmFyIGVsZXNBcnIgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbaV07XG4gICAgdmFyIGpzb24gPSBlbGUuanNvbigpO1xuICAgIHZhciBjbG9uZSA9IG5ldyBFbGVtZW50KGN5LCBqc29uLCBmYWxzZSk7IC8vIE5CIG5vIHJlc3RvcmVcblxuICAgIGVsZXNBcnIucHVzaChjbG9uZSk7XG4gIH1cbiAgcmV0dXJuIG5ldyBDb2xsZWN0aW9uKGN5LCBlbGVzQXJyKTtcbn07XG5lbGVzZm4kMS5jb3B5ID0gZWxlc2ZuJDEuY2xvbmU7XG5lbGVzZm4kMS5yZXN0b3JlID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbm90aWZ5UmVuZGVyZXIgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHRydWU7XG4gIHZhciBhZGRUb1Bvb2wgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHRydWU7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGN5ID0gc2VsZi5jeSgpO1xuICB2YXIgY3lfcCA9IGN5Ll9wcml2YXRlO1xuXG4gIC8vIGNyZWF0ZSBhcnJheXMgb2Ygbm9kZXMgYW5kIGVkZ2VzLCBzaW5jZSB3ZSBuZWVkIHRvXG4gIC8vIHJlc3RvcmUgdGhlIG5vZGVzIGZpcnN0XG4gIHZhciBub2RlcyA9IFtdO1xuICB2YXIgZWRnZXMgPSBbXTtcbiAgdmFyIGVsZW1lbnRzO1xuICBmb3IgKHZhciBfaTMgPSAwLCBsID0gc2VsZi5sZW5ndGg7IF9pMyA8IGw7IF9pMysrKSB7XG4gICAgdmFyIGVsZSA9IHNlbGZbX2kzXTtcbiAgICBpZiAoYWRkVG9Qb29sICYmICFlbGUucmVtb3ZlZCgpKSB7XG4gICAgICAvLyBkb24ndCBuZWVkIHRvIGhhbmRsZSB0aGlzIGVsZVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8ga2VlcCBub2RlcyBmaXJzdCBpbiB0aGUgYXJyYXkgYW5kIGVkZ2VzIGFmdGVyXG4gICAgaWYgKGVsZS5pc05vZGUoKSkge1xuICAgICAgLy8gcHV0IHRvIGZyb250IG9mIGFycmF5IGlmIG5vZGVcbiAgICAgIG5vZGVzLnB1c2goZWxlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gcHV0IHRvIGVuZCBvZiBhcnJheSBpZiBlZGdlXG4gICAgICBlZGdlcy5wdXNoKGVsZSk7XG4gICAgfVxuICB9XG4gIGVsZW1lbnRzID0gbm9kZXMuY29uY2F0KGVkZ2VzKTtcbiAgdmFyIGk7XG4gIHZhciByZW1vdmVGcm9tRWxlbWVudHMgPSBmdW5jdGlvbiByZW1vdmVGcm9tRWxlbWVudHMoKSB7XG4gICAgZWxlbWVudHMuc3BsaWNlKGksIDEpO1xuICAgIGktLTtcbiAgfTtcblxuICAvLyBub3csIHJlc3RvcmUgZWFjaCBlbGVtZW50XG4gIGZvciAoaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBfZWxlMiA9IGVsZW1lbnRzW2ldO1xuICAgIHZhciBfcHJpdmF0ZSA9IF9lbGUyLl9wcml2YXRlO1xuICAgIHZhciBfZGF0YTMgPSBfcHJpdmF0ZS5kYXRhO1xuXG4gICAgLy8gdGhlIHRyYXZlcnNhbCBjYWNoZSBzaG91bGQgc3RhcnQgZnJlc2ggd2hlbiBlbGUgaXMgYWRkZWRcbiAgICBfZWxlMi5jbGVhclRyYXZlcnNhbENhY2hlKCk7XG5cbiAgICAvLyBzZXQgaWQgYW5kIHZhbGlkYXRlXG4gICAgaWYgKCFhZGRUb1Bvb2wgJiYgIV9wcml2YXRlLnJlbW92ZWQpIDsgZWxzZSBpZiAoX2RhdGEzLmlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIF9kYXRhMy5pZCA9IHV1aWQoKTtcbiAgICB9IGVsc2UgaWYgKG51bWJlciQxKF9kYXRhMy5pZCkpIHtcbiAgICAgIF9kYXRhMy5pZCA9ICcnICsgX2RhdGEzLmlkOyAvLyBub3cgaXQncyBhIHN0cmluZ1xuICAgIH0gZWxzZSBpZiAoZW1wdHlTdHJpbmcoX2RhdGEzLmlkKSB8fCAhc3RyaW5nKF9kYXRhMy5pZCkpIHtcbiAgICAgIGVycm9yKCdDYW4gbm90IGNyZWF0ZSBlbGVtZW50IHdpdGggaW52YWxpZCBzdHJpbmcgSUQgYCcgKyBfZGF0YTMuaWQgKyAnYCcpO1xuXG4gICAgICAvLyBjYW4ndCBjcmVhdGUgZWxlbWVudCBpZiBpdCBoYXMgZW1wdHkgc3RyaW5nIGFzIGlkIG9yIG5vbi1zdHJpbmcgaWRcbiAgICAgIHJlbW92ZUZyb21FbGVtZW50cygpO1xuICAgICAgY29udGludWU7XG4gICAgfSBlbHNlIGlmIChjeS5oYXNFbGVtZW50V2l0aElkKF9kYXRhMy5pZCkpIHtcbiAgICAgIGVycm9yKCdDYW4gbm90IGNyZWF0ZSBzZWNvbmQgZWxlbWVudCB3aXRoIElEIGAnICsgX2RhdGEzLmlkICsgJ2AnKTtcblxuICAgICAgLy8gY2FuJ3QgY3JlYXRlIGVsZW1lbnQgaWYgb25lIGFscmVhZHkgaGFzIHRoYXQgaWRcbiAgICAgIHJlbW92ZUZyb21FbGVtZW50cygpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHZhciBpZCA9IF9kYXRhMy5pZDsgLy8gaWQgaXMgZmluYWxpc2VkLCBub3cgbGV0J3Mga2VlcCBhIHJlZlxuXG4gICAgaWYgKF9lbGUyLmlzTm9kZSgpKSB7XG4gICAgICAvLyBleHRyYSBjaGVja3MgZm9yIG5vZGVzXG4gICAgICB2YXIgcG9zID0gX3ByaXZhdGUucG9zaXRpb247XG5cbiAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgbm9kZXMgaGF2ZSBhIGRlZmluZWQgcG9zaXRpb25cblxuICAgICAgaWYgKHBvcy54ID09IG51bGwpIHtcbiAgICAgICAgcG9zLnggPSAwO1xuICAgICAgfVxuICAgICAgaWYgKHBvcy55ID09IG51bGwpIHtcbiAgICAgICAgcG9zLnkgPSAwO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoX2VsZTIuaXNFZGdlKCkpIHtcbiAgICAgIC8vIGV4dHJhIGNoZWNrcyBmb3IgZWRnZXNcblxuICAgICAgdmFyIGVkZ2UgPSBfZWxlMjtcbiAgICAgIHZhciBmaWVsZHMgPSBbJ3NvdXJjZScsICd0YXJnZXQnXTtcbiAgICAgIHZhciBmaWVsZHNMZW5ndGggPSBmaWVsZHMubGVuZ3RoO1xuICAgICAgdmFyIGJhZFNvdXJjZU9yVGFyZ2V0ID0gZmFsc2U7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGZpZWxkc0xlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBmaWVsZCA9IGZpZWxkc1tqXTtcbiAgICAgICAgdmFyIHZhbCA9IF9kYXRhM1tmaWVsZF07XG4gICAgICAgIGlmIChudW1iZXIkMSh2YWwpKSB7XG4gICAgICAgICAgdmFsID0gX2RhdGEzW2ZpZWxkXSA9ICcnICsgX2RhdGEzW2ZpZWxkXTsgLy8gbm93IHN0cmluZ1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWwgPT0gbnVsbCB8fCB2YWwgPT09ICcnKSB7XG4gICAgICAgICAgLy8gY2FuJ3QgY3JlYXRlIGlmIHNvdXJjZSBvciB0YXJnZXQgaXMgbm90IGRlZmluZWQgcHJvcGVybHlcbiAgICAgICAgICBlcnJvcignQ2FuIG5vdCBjcmVhdGUgZWRnZSBgJyArIGlkICsgJ2Agd2l0aCB1bnNwZWNpZmllZCAnICsgZmllbGQpO1xuICAgICAgICAgIGJhZFNvdXJjZU9yVGFyZ2V0ID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmICghY3kuaGFzRWxlbWVudFdpdGhJZCh2YWwpKSB7XG4gICAgICAgICAgLy8gY2FuJ3QgY3JlYXRlIGVkZ2UgaWYgb25lIG9mIGl0cyBub2RlcyBkb2Vzbid0IGV4aXN0XG4gICAgICAgICAgZXJyb3IoJ0NhbiBub3QgY3JlYXRlIGVkZ2UgYCcgKyBpZCArICdgIHdpdGggbm9uZXhpc3RlbnQgJyArIGZpZWxkICsgJyBgJyArIHZhbCArICdgJyk7XG4gICAgICAgICAgYmFkU291cmNlT3JUYXJnZXQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoYmFkU291cmNlT3JUYXJnZXQpIHtcbiAgICAgICAgcmVtb3ZlRnJvbUVsZW1lbnRzKCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSAvLyBjYW4ndCBjcmVhdGUgdGhpc1xuXG4gICAgICB2YXIgc3JjID0gY3kuZ2V0RWxlbWVudEJ5SWQoX2RhdGEzLnNvdXJjZSk7XG4gICAgICB2YXIgdGd0ID0gY3kuZ2V0RWxlbWVudEJ5SWQoX2RhdGEzLnRhcmdldCk7XG5cbiAgICAgIC8vIG9ubHkgb25lIGVkZ2UgaW4gbm9kZSBpZiBsb29wXG4gICAgICBpZiAoc3JjLnNhbWUodGd0KSkge1xuICAgICAgICBzcmMuX3ByaXZhdGUuZWRnZXMucHVzaChlZGdlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNyYy5fcHJpdmF0ZS5lZGdlcy5wdXNoKGVkZ2UpO1xuICAgICAgICB0Z3QuX3ByaXZhdGUuZWRnZXMucHVzaChlZGdlKTtcbiAgICAgIH1cbiAgICAgIGVkZ2UuX3ByaXZhdGUuc291cmNlID0gc3JjO1xuICAgICAgZWRnZS5fcHJpdmF0ZS50YXJnZXQgPSB0Z3Q7XG4gICAgfSAvLyBpZiBpcyBlZGdlXG5cbiAgICAvLyBjcmVhdGUgbW9jayBpZHMgLyBpbmRleGVzIG1hcHMgZm9yIGVsZW1lbnQgc28gaXQgY2FuIGJlIHVzZWQgbGlrZSBjb2xsZWN0aW9uc1xuICAgIF9wcml2YXRlLm1hcCA9IG5ldyBNYXAkMSgpO1xuICAgIF9wcml2YXRlLm1hcC5zZXQoaWQsIHtcbiAgICAgIGVsZTogX2VsZTIsXG4gICAgICBpbmRleDogMFxuICAgIH0pO1xuICAgIF9wcml2YXRlLnJlbW92ZWQgPSBmYWxzZTtcbiAgICBpZiAoYWRkVG9Qb29sKSB7XG4gICAgICBjeS5hZGRUb1Bvb2woX2VsZTIpO1xuICAgIH1cbiAgfSAvLyBmb3IgZWFjaCBlbGVtZW50XG5cbiAgLy8gZG8gY29tcG91bmQgbm9kZSBzYW5pdHkgY2hlY2tzXG4gIGZvciAodmFyIF9pNCA9IDA7IF9pNCA8IG5vZGVzLmxlbmd0aDsgX2k0KyspIHtcbiAgICAvLyBlYWNoIG5vZGVcbiAgICB2YXIgbm9kZSA9IG5vZGVzW19pNF07XG4gICAgdmFyIF9kYXRhNCA9IG5vZGUuX3ByaXZhdGUuZGF0YTtcbiAgICBpZiAobnVtYmVyJDEoX2RhdGE0LnBhcmVudCkpIHtcbiAgICAgIC8vIHRoZW4gYXV0b21ha2Ugc3RyaW5nXG4gICAgICBfZGF0YTQucGFyZW50ID0gJycgKyBfZGF0YTQucGFyZW50O1xuICAgIH1cbiAgICB2YXIgcGFyZW50SWQgPSBfZGF0YTQucGFyZW50O1xuICAgIHZhciBzcGVjaWZpZWRQYXJlbnQgPSBwYXJlbnRJZCAhPSBudWxsO1xuICAgIGlmIChzcGVjaWZpZWRQYXJlbnQgfHwgbm9kZS5fcHJpdmF0ZS5wYXJlbnQpIHtcbiAgICAgIHZhciBwYXJlbnQgPSBub2RlLl9wcml2YXRlLnBhcmVudCA/IGN5LmNvbGxlY3Rpb24oKS5tZXJnZShub2RlLl9wcml2YXRlLnBhcmVudCkgOiBjeS5nZXRFbGVtZW50QnlJZChwYXJlbnRJZCk7XG4gICAgICBpZiAocGFyZW50LmVtcHR5KCkpIHtcbiAgICAgICAgLy8gbm9uLWV4aXN0YW50IHBhcmVudDsganVzdCByZW1vdmUgaXRcbiAgICAgICAgX2RhdGE0LnBhcmVudCA9IHVuZGVmaW5lZDtcbiAgICAgIH0gZWxzZSBpZiAocGFyZW50WzBdLnJlbW92ZWQoKSkge1xuICAgICAgICB3YXJuKCdOb2RlIGFkZGVkIHdpdGggbWlzc2luZyBwYXJlbnQsIHJlZmVyZW5jZSB0byBwYXJlbnQgcmVtb3ZlZCcpO1xuICAgICAgICBfZGF0YTQucGFyZW50ID0gdW5kZWZpbmVkO1xuICAgICAgICBub2RlLl9wcml2YXRlLnBhcmVudCA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgc2VsZkFzUGFyZW50ID0gZmFsc2U7XG4gICAgICAgIHZhciBhbmNlc3RvciA9IHBhcmVudDtcbiAgICAgICAgd2hpbGUgKCFhbmNlc3Rvci5lbXB0eSgpKSB7XG4gICAgICAgICAgaWYgKG5vZGUuc2FtZShhbmNlc3RvcikpIHtcbiAgICAgICAgICAgIC8vIG1hcmsgc2VsZiBhcyBwYXJlbnQgYW5kIHJlbW92ZSBmcm9tIGRhdGFcbiAgICAgICAgICAgIHNlbGZBc1BhcmVudCA9IHRydWU7XG4gICAgICAgICAgICBfZGF0YTQucGFyZW50ID0gdW5kZWZpbmVkOyAvLyByZW1vdmUgcGFyZW50IHJlZmVyZW5jZVxuXG4gICAgICAgICAgICAvLyBleGl0IG9yIHdlIGxvb3AgZm9yZXZlclxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFuY2VzdG9yID0gYW5jZXN0b3IucGFyZW50KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzZWxmQXNQYXJlbnQpIHtcbiAgICAgICAgICAvLyBjb25uZWN0IHdpdGggY2hpbGRyZW5cbiAgICAgICAgICBwYXJlbnRbMF0uX3ByaXZhdGUuY2hpbGRyZW4ucHVzaChub2RlKTtcbiAgICAgICAgICBub2RlLl9wcml2YXRlLnBhcmVudCA9IHBhcmVudFswXTtcblxuICAgICAgICAgIC8vIGxldCB0aGUgY29yZSBrbm93IHdlIGhhdmUgYSBjb21wb3VuZCBncmFwaFxuICAgICAgICAgIGN5X3AuaGFzQ29tcG91bmROb2RlcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gZWxzZVxuICAgIH0gLy8gaWYgc3BlY2lmaWVkIHBhcmVudFxuICB9IC8vIGZvciBlYWNoIG5vZGVcblxuICBpZiAoZWxlbWVudHMubGVuZ3RoID4gMCkge1xuICAgIHZhciByZXN0b3JlZCA9IGVsZW1lbnRzLmxlbmd0aCA9PT0gc2VsZi5sZW5ndGggPyBzZWxmIDogbmV3IENvbGxlY3Rpb24oY3ksIGVsZW1lbnRzKTtcbiAgICBmb3IgKHZhciBfaTUgPSAwOyBfaTUgPCByZXN0b3JlZC5sZW5ndGg7IF9pNSsrKSB7XG4gICAgICB2YXIgX2VsZTMgPSByZXN0b3JlZFtfaTVdO1xuICAgICAgaWYgKF9lbGUzLmlzTm9kZSgpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBhZGRpbmcgYW4gZWRnZSBpbnZhbGlkYXRlcyB0aGUgdHJhdmVyc2FsIGNhY2hlcyBmb3IgdGhlIHBhcmFsbGVsIGVkZ2VzXG4gICAgICBfZWxlMy5wYXJhbGxlbEVkZ2VzKCkuY2xlYXJUcmF2ZXJzYWxDYWNoZSgpO1xuXG4gICAgICAvLyBhZGRpbmcgYW4gZWRnZSBpbnZhbGlkYXRlcyB0aGUgdHJhdmVyc2FsIGNhY2hlIGZvciB0aGUgY29ubmVjdGVkIG5vZGVzXG4gICAgICBfZWxlMy5zb3VyY2UoKS5jbGVhclRyYXZlcnNhbENhY2hlKCk7XG4gICAgICBfZWxlMy50YXJnZXQoKS5jbGVhclRyYXZlcnNhbENhY2hlKCk7XG4gICAgfVxuICAgIHZhciB0b1VwZGF0ZVN0eWxlO1xuICAgIGlmIChjeV9wLmhhc0NvbXBvdW5kTm9kZXMpIHtcbiAgICAgIHRvVXBkYXRlU3R5bGUgPSBjeS5jb2xsZWN0aW9uKCkubWVyZ2UocmVzdG9yZWQpLm1lcmdlKHJlc3RvcmVkLmNvbm5lY3RlZE5vZGVzKCkpLm1lcmdlKHJlc3RvcmVkLnBhcmVudCgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdG9VcGRhdGVTdHlsZSA9IHJlc3RvcmVkO1xuICAgIH1cbiAgICB0b1VwZGF0ZVN0eWxlLmRpcnR5Q29tcG91bmRCb3VuZHNDYWNoZSgpLmRpcnR5Qm91bmRpbmdCb3hDYWNoZSgpLnVwZGF0ZVN0eWxlKG5vdGlmeVJlbmRlcmVyKTtcbiAgICBpZiAobm90aWZ5UmVuZGVyZXIpIHtcbiAgICAgIHJlc3RvcmVkLmVtaXRBbmROb3RpZnkoJ2FkZCcpO1xuICAgIH0gZWxzZSBpZiAoYWRkVG9Qb29sKSB7XG4gICAgICByZXN0b3JlZC5lbWl0KCdhZGQnKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNlbGY7IC8vIGNoYWluYWJpbGl0eVxufTtcbmVsZXNmbiQxLnJlbW92ZWQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBlbGUgPSB0aGlzWzBdO1xuICByZXR1cm4gZWxlICYmIGVsZS5fcHJpdmF0ZS5yZW1vdmVkO1xufTtcbmVsZXNmbiQxLmluc2lkZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGVsZSA9IHRoaXNbMF07XG4gIHJldHVybiBlbGUgJiYgIWVsZS5fcHJpdmF0ZS5yZW1vdmVkO1xufTtcbmVsZXNmbiQxLnJlbW92ZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIG5vdGlmeVJlbmRlcmVyID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB0cnVlO1xuICB2YXIgcmVtb3ZlRnJvbVBvb2wgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHRydWU7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGVsZXNUb1JlbW92ZSA9IFtdO1xuICB2YXIgZWxlc1RvUmVtb3ZlSWRzID0ge307XG4gIHZhciBjeSA9IHNlbGYuX3ByaXZhdGUuY3k7XG5cbiAgLy8gYWRkIGNvbm5lY3RlZCBlZGdlc1xuICBmdW5jdGlvbiBhZGRDb25uZWN0ZWRFZGdlcyhub2RlKSB7XG4gICAgdmFyIGVkZ2VzID0gbm9kZS5fcHJpdmF0ZS5lZGdlcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVkZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhZGQoZWRnZXNbaV0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIGFkZCBkZXNjZW5kYW50IG5vZGVzXG4gIGZ1bmN0aW9uIGFkZENoaWxkcmVuKG5vZGUpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBub2RlLl9wcml2YXRlLmNoaWxkcmVuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGFkZChjaGlsZHJlbltpXSk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGFkZChlbGUpIHtcbiAgICB2YXIgYWxyZWFkeUFkZGVkID0gZWxlc1RvUmVtb3ZlSWRzW2VsZS5pZCgpXTtcbiAgICBpZiAocmVtb3ZlRnJvbVBvb2wgJiYgZWxlLnJlbW92ZWQoKSB8fCBhbHJlYWR5QWRkZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlc1RvUmVtb3ZlSWRzW2VsZS5pZCgpXSA9IHRydWU7XG4gICAgfVxuICAgIGlmIChlbGUuaXNOb2RlKCkpIHtcbiAgICAgIGVsZXNUb1JlbW92ZS5wdXNoKGVsZSk7IC8vIG5vZGVzIGFyZSByZW1vdmVkIGxhc3RcblxuICAgICAgYWRkQ29ubmVjdGVkRWRnZXMoZWxlKTtcbiAgICAgIGFkZENoaWxkcmVuKGVsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZXNUb1JlbW92ZS51bnNoaWZ0KGVsZSk7IC8vIGVkZ2VzIGFyZSByZW1vdmVkIGZpcnN0XG4gICAgfVxuICB9XG5cbiAgLy8gbWFrZSB0aGUgbGlzdCBvZiBlbGVtZW50cyB0byByZW1vdmVcbiAgLy8gKG1heSBiZSByZW1vdmluZyBtb3JlIHRoYW4gc3BlY2lmaWVkIGR1ZSB0byBjb25uZWN0ZWQgZWRnZXMgZXRjKVxuXG4gIGZvciAodmFyIGkgPSAwLCBsID0gc2VsZi5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICB2YXIgZWxlID0gc2VsZltpXTtcbiAgICBhZGQoZWxlKTtcbiAgfVxuICBmdW5jdGlvbiByZW1vdmVFZGdlUmVmKG5vZGUsIGVkZ2UpIHtcbiAgICB2YXIgY29ubmVjdGVkRWRnZXMgPSBub2RlLl9wcml2YXRlLmVkZ2VzO1xuICAgIHJlbW92ZUZyb21BcnJheShjb25uZWN0ZWRFZGdlcywgZWRnZSk7XG5cbiAgICAvLyByZW1vdmluZyBhbiBlZGdlcyBpbnZhbGlkYXRlcyB0aGUgdHJhdmVyc2FsIGNhY2hlIGZvciBpdHMgbm9kZXNcbiAgICBub2RlLmNsZWFyVHJhdmVyc2FsQ2FjaGUoKTtcbiAgfVxuICBmdW5jdGlvbiByZW1vdmVQYXJhbGxlbFJlZihwbGxFZGdlKSB7XG4gICAgLy8gcmVtb3ZpbmcgYW4gZWRnZSBpbnZhbGlkYXRlcyB0aGUgdHJhdmVyc2FsIGNhY2hlcyBmb3IgdGhlIHBhcmFsbGVsIGVkZ2VzXG4gICAgcGxsRWRnZS5jbGVhclRyYXZlcnNhbENhY2hlKCk7XG4gIH1cbiAgdmFyIGFsdGVyZWRQYXJlbnRzID0gW107XG4gIGFsdGVyZWRQYXJlbnRzLmlkcyA9IHt9O1xuICBmdW5jdGlvbiByZW1vdmVDaGlsZFJlZihwYXJlbnQsIGVsZSkge1xuICAgIGVsZSA9IGVsZVswXTtcbiAgICBwYXJlbnQgPSBwYXJlbnRbMF07XG4gICAgdmFyIGNoaWxkcmVuID0gcGFyZW50Ll9wcml2YXRlLmNoaWxkcmVuO1xuICAgIHZhciBwaWQgPSBwYXJlbnQuaWQoKTtcbiAgICByZW1vdmVGcm9tQXJyYXkoY2hpbGRyZW4sIGVsZSk7IC8vIHJlbW92ZSBwYXJlbnQgPT4gY2hpbGQgcmVmXG5cbiAgICBlbGUuX3ByaXZhdGUucGFyZW50ID0gbnVsbDsgLy8gcmVtb3ZlIGNoaWxkID0+IHBhcmVudCByZWZcblxuICAgIGlmICghYWx0ZXJlZFBhcmVudHMuaWRzW3BpZF0pIHtcbiAgICAgIGFsdGVyZWRQYXJlbnRzLmlkc1twaWRdID0gdHJ1ZTtcbiAgICAgIGFsdGVyZWRQYXJlbnRzLnB1c2gocGFyZW50KTtcbiAgICB9XG4gIH1cbiAgc2VsZi5kaXJ0eUNvbXBvdW5kQm91bmRzQ2FjaGUoKTtcbiAgaWYgKHJlbW92ZUZyb21Qb29sKSB7XG4gICAgY3kucmVtb3ZlRnJvbVBvb2woZWxlc1RvUmVtb3ZlKTsgLy8gcmVtb3ZlIGZyb20gY29yZSBwb29sXG4gIH1cbiAgZm9yICh2YXIgX2k2ID0gMDsgX2k2IDwgZWxlc1RvUmVtb3ZlLmxlbmd0aDsgX2k2KyspIHtcbiAgICB2YXIgX2VsZTQgPSBlbGVzVG9SZW1vdmVbX2k2XTtcbiAgICBpZiAoX2VsZTQuaXNFZGdlKCkpIHtcbiAgICAgIC8vIHJlbW92ZSByZWZlcmVuY2VzIHRvIHRoaXMgZWRnZSBpbiBpdHMgY29ubmVjdGVkIG5vZGVzXG4gICAgICB2YXIgc3JjID0gX2VsZTQuc291cmNlKClbMF07XG4gICAgICB2YXIgdGd0ID0gX2VsZTQudGFyZ2V0KClbMF07XG4gICAgICByZW1vdmVFZGdlUmVmKHNyYywgX2VsZTQpO1xuICAgICAgcmVtb3ZlRWRnZVJlZih0Z3QsIF9lbGU0KTtcbiAgICAgIHZhciBwbGxFZGdlcyA9IF9lbGU0LnBhcmFsbGVsRWRnZXMoKTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcGxsRWRnZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIHBsbEVkZ2UgPSBwbGxFZGdlc1tqXTtcbiAgICAgICAgcmVtb3ZlUGFyYWxsZWxSZWYocGxsRWRnZSk7XG4gICAgICAgIGlmIChwbGxFZGdlLmlzQnVuZGxlZEJlemllcigpKSB7XG4gICAgICAgICAgcGxsRWRnZS5kaXJ0eUJvdW5kaW5nQm94Q2FjaGUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyByZW1vdmUgcmVmZXJlbmNlIHRvIHBhcmVudFxuICAgICAgdmFyIHBhcmVudCA9IF9lbGU0LnBhcmVudCgpO1xuICAgICAgaWYgKHBhcmVudC5sZW5ndGggIT09IDApIHtcbiAgICAgICAgcmVtb3ZlQ2hpbGRSZWYocGFyZW50LCBfZWxlNCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyZW1vdmVGcm9tUG9vbCkge1xuICAgICAgLy8gbWFyayBhcyByZW1vdmVkXG4gICAgICBfZWxlNC5fcHJpdmF0ZS5yZW1vdmVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvLyBjaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhIGNvbXBvdW5kIGdyYXBoIG9yIG5vdFxuICB2YXIgZWxlc1N0aWxsSW5zaWRlID0gY3kuX3ByaXZhdGUuZWxlbWVudHM7XG4gIGN5Ll9wcml2YXRlLmhhc0NvbXBvdW5kTm9kZXMgPSBmYWxzZTtcbiAgZm9yICh2YXIgX2k3ID0gMDsgX2k3IDwgZWxlc1N0aWxsSW5zaWRlLmxlbmd0aDsgX2k3KyspIHtcbiAgICB2YXIgX2VsZTUgPSBlbGVzU3RpbGxJbnNpZGVbX2k3XTtcbiAgICBpZiAoX2VsZTUuaXNQYXJlbnQoKSkge1xuICAgICAgY3kuX3ByaXZhdGUuaGFzQ29tcG91bmROb2RlcyA9IHRydWU7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgdmFyIHJlbW92ZWRFbGVtZW50cyA9IG5ldyBDb2xsZWN0aW9uKHRoaXMuY3koKSwgZWxlc1RvUmVtb3ZlKTtcbiAgaWYgKHJlbW92ZWRFbGVtZW50cy5zaXplKCkgPiAwKSB7XG4gICAgLy8gbXVzdCBtYW51YWxseSBub3RpZnkgc2luY2UgdHJpZ2dlciB3b24ndCBkbyB0aGlzIGF1dG9tYXRpY2FsbHkgb25jZSByZW1vdmVkXG5cbiAgICBpZiAobm90aWZ5UmVuZGVyZXIpIHtcbiAgICAgIHJlbW92ZWRFbGVtZW50cy5lbWl0QW5kTm90aWZ5KCdyZW1vdmUnKTtcbiAgICB9IGVsc2UgaWYgKHJlbW92ZUZyb21Qb29sKSB7XG4gICAgICByZW1vdmVkRWxlbWVudHMuZW1pdCgncmVtb3ZlJyk7XG4gICAgfVxuICB9XG5cbiAgLy8gdGhlIHBhcmVudHMgd2hvIHdlcmUgbW9kaWZpZWQgYnkgdGhlIHJlbW92YWwgbmVlZCB0aGVpciBzdHlsZSB1cGRhdGVkXG4gIGZvciAodmFyIF9pOCA9IDA7IF9pOCA8IGFsdGVyZWRQYXJlbnRzLmxlbmd0aDsgX2k4KyspIHtcbiAgICB2YXIgX2VsZTYgPSBhbHRlcmVkUGFyZW50c1tfaThdO1xuICAgIGlmICghcmVtb3ZlRnJvbVBvb2wgfHwgIV9lbGU2LnJlbW92ZWQoKSkge1xuICAgICAgX2VsZTYudXBkYXRlU3R5bGUoKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlbW92ZWRFbGVtZW50cztcbn07XG5lbGVzZm4kMS5tb3ZlID0gZnVuY3Rpb24gKHN0cnVjdCkge1xuICB2YXIgY3kgPSB0aGlzLl9wcml2YXRlLmN5O1xuICB2YXIgZWxlcyA9IHRoaXM7XG5cbiAgLy8ganVzdCBjbGVhbiB1cCByZWZzLCBjYWNoZXMsIGV0Yy4gaW4gdGhlIHNhbWUgd2F5IGFzIHdoZW4gcmVtb3ZpbmcgYW5kIHRoZW4gcmVzdG9yaW5nXG4gIC8vIChvdXIgY2FsbHMgdG8gcmVtb3ZlL3Jlc3RvcmUgZG8gbm90IHJlbW92ZSBmcm9tIHRoZSBncmFwaCBvciBtYWtlIGV2ZW50cylcbiAgdmFyIG5vdGlmeVJlbmRlcmVyID0gZmFsc2U7XG4gIHZhciBtb2RpZnlQb29sID0gZmFsc2U7XG4gIHZhciB0b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKGlkKSB7XG4gICAgcmV0dXJuIGlkID09IG51bGwgPyBpZCA6ICcnICsgaWQ7XG4gIH07IC8vIGlkIG11c3QgYmUgc3RyaW5nXG5cbiAgaWYgKHN0cnVjdC5zb3VyY2UgIT09IHVuZGVmaW5lZCB8fCBzdHJ1Y3QudGFyZ2V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgc3JjSWQgPSB0b1N0cmluZyhzdHJ1Y3Quc291cmNlKTtcbiAgICB2YXIgdGd0SWQgPSB0b1N0cmluZyhzdHJ1Y3QudGFyZ2V0KTtcbiAgICB2YXIgc3JjRXhpc3RzID0gc3JjSWQgIT0gbnVsbCAmJiBjeS5oYXNFbGVtZW50V2l0aElkKHNyY0lkKTtcbiAgICB2YXIgdGd0RXhpc3RzID0gdGd0SWQgIT0gbnVsbCAmJiBjeS5oYXNFbGVtZW50V2l0aElkKHRndElkKTtcbiAgICBpZiAoc3JjRXhpc3RzIHx8IHRndEV4aXN0cykge1xuICAgICAgY3kuYmF0Y2goZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBhdm9pZCBkdXBsaWNhdGUgc3R5bGUgdXBkYXRlc1xuICAgICAgICBlbGVzLnJlbW92ZShub3RpZnlSZW5kZXJlciwgbW9kaWZ5UG9vbCk7IC8vIGNsZWFuIHVwIHJlZnMgZXRjLlxuICAgICAgICBlbGVzLmVtaXRBbmROb3RpZnkoJ21vdmVvdXQnKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgICAgICAgdmFyIF9kYXRhNSA9IGVsZS5fcHJpdmF0ZS5kYXRhO1xuICAgICAgICAgIGlmIChlbGUuaXNFZGdlKCkpIHtcbiAgICAgICAgICAgIGlmIChzcmNFeGlzdHMpIHtcbiAgICAgICAgICAgICAgX2RhdGE1LnNvdXJjZSA9IHNyY0lkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRndEV4aXN0cykge1xuICAgICAgICAgICAgICBfZGF0YTUudGFyZ2V0ID0gdGd0SWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsZXMucmVzdG9yZShub3RpZnlSZW5kZXJlciwgbW9kaWZ5UG9vbCk7IC8vIG1ha2UgbmV3IHJlZnMsIHN0eWxlLCBldGMuXG4gICAgICB9KTtcbiAgICAgIGVsZXMuZW1pdEFuZE5vdGlmeSgnbW92ZScpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChzdHJ1Y3QucGFyZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAvLyBtb3ZlIG5vZGUgdG8gbmV3IHBhcmVudFxuICAgIHZhciBwYXJlbnRJZCA9IHRvU3RyaW5nKHN0cnVjdC5wYXJlbnQpO1xuICAgIHZhciBwYXJlbnRFeGlzdHMgPSBwYXJlbnRJZCA9PT0gbnVsbCB8fCBjeS5oYXNFbGVtZW50V2l0aElkKHBhcmVudElkKTtcbiAgICBpZiAocGFyZW50RXhpc3RzKSB7XG4gICAgICB2YXIgcGlkVG9Bc3NpZ24gPSBwYXJlbnRJZCA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IHBhcmVudElkO1xuICAgICAgY3kuYmF0Y2goZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBhdm9pZCBkdXBsaWNhdGUgc3R5bGUgdXBkYXRlc1xuICAgICAgICB2YXIgdXBkYXRlZCA9IGVsZXMucmVtb3ZlKG5vdGlmeVJlbmRlcmVyLCBtb2RpZnlQb29sKTsgLy8gY2xlYW4gdXAgcmVmcyBldGMuXG4gICAgICAgIHVwZGF0ZWQuZW1pdEFuZE5vdGlmeSgnbW92ZW91dCcpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICAgICAgICB2YXIgX2RhdGE2ID0gZWxlLl9wcml2YXRlLmRhdGE7XG4gICAgICAgICAgaWYgKGVsZS5pc05vZGUoKSkge1xuICAgICAgICAgICAgX2RhdGE2LnBhcmVudCA9IHBpZFRvQXNzaWduO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB1cGRhdGVkLnJlc3RvcmUobm90aWZ5UmVuZGVyZXIsIG1vZGlmeVBvb2wpOyAvLyBtYWtlIG5ldyByZWZzLCBzdHlsZSwgZXRjLlxuICAgICAgfSk7XG4gICAgICBlbGVzLmVtaXRBbmROb3RpZnkoJ21vdmUnKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuW2VsZXNmbiRqLCBlbGVzZm4kaSwgZWxlc2ZuJGgsIGVsZXNmbiRnLCBlbGVzZm4kZiwgZGF0YSwgZWxlc2ZuJGQsIGRpbWVuc2lvbnMsIGVsZXNmbiQ5LCBlbGVzZm4kOCwgZWxlc2ZuJDcsIGVsZXNmbiQ2LCBlbGVzZm4kNSwgZWxlc2ZuJDQsIGVsZXNmbiQzLCBlbGVzZm4kMl0uZm9yRWFjaChmdW5jdGlvbiAocHJvcHMpIHtcbiAgZXh0ZW5kKGVsZXNmbiQxLCBwcm9wcyk7XG59KTtcblxudmFyIGNvcmVmbiQ5ID0ge1xuICBhZGQ6IGZ1bmN0aW9uIGFkZChvcHRzKSB7XG4gICAgdmFyIGVsZW1lbnRzO1xuICAgIHZhciBjeSA9IHRoaXM7XG5cbiAgICAvLyBhZGQgdGhlIGVsZW1lbnRzXG4gICAgaWYgKGVsZW1lbnRPckNvbGxlY3Rpb24ob3B0cykpIHtcbiAgICAgIHZhciBlbGVzID0gb3B0cztcbiAgICAgIGlmIChlbGVzLl9wcml2YXRlLmN5ID09PSBjeSkge1xuICAgICAgICAvLyBzYW1lIGluc3RhbmNlID0+IGp1c3QgcmVzdG9yZVxuICAgICAgICBlbGVtZW50cyA9IGVsZXMucmVzdG9yZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gb3RoZXJ3aXNlLCBjb3B5IGZyb20ganNvblxuICAgICAgICB2YXIganNvbnMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgICAgICAganNvbnMucHVzaChlbGUuanNvbigpKTtcbiAgICAgICAgfVxuICAgICAgICBlbGVtZW50cyA9IG5ldyBDb2xsZWN0aW9uKGN5LCBqc29ucyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gc3BlY2lmeSBhbiBhcnJheSBvZiBvcHRpb25zXG4gICAgZWxzZSBpZiAoYXJyYXkob3B0cykpIHtcbiAgICAgIHZhciBfanNvbnMgPSBvcHRzO1xuICAgICAgZWxlbWVudHMgPSBuZXcgQ29sbGVjdGlvbihjeSwgX2pzb25zKTtcbiAgICB9XG5cbiAgICAvLyBzcGVjaWZ5IHZpYSBvcHRzLm5vZGVzIGFuZCBvcHRzLmVkZ2VzXG4gICAgZWxzZSBpZiAocGxhaW5PYmplY3Qob3B0cykgJiYgKGFycmF5KG9wdHMubm9kZXMpIHx8IGFycmF5KG9wdHMuZWRnZXMpKSkge1xuICAgICAgdmFyIGVsZXNCeUdyb3VwID0gb3B0cztcbiAgICAgIHZhciBfanNvbnMyID0gW107XG4gICAgICB2YXIgZ3JzID0gWydub2RlcycsICdlZGdlcyddO1xuICAgICAgZm9yICh2YXIgX2kgPSAwLCBpbCA9IGdycy5sZW5ndGg7IF9pIDwgaWw7IF9pKyspIHtcbiAgICAgICAgdmFyIGdyb3VwID0gZ3JzW19pXTtcbiAgICAgICAgdmFyIGVsZXNBcnJheSA9IGVsZXNCeUdyb3VwW2dyb3VwXTtcbiAgICAgICAgaWYgKGFycmF5KGVsZXNBcnJheSkpIHtcbiAgICAgICAgICBmb3IgKHZhciBqID0gMCwgamwgPSBlbGVzQXJyYXkubGVuZ3RoOyBqIDwgamw7IGorKykge1xuICAgICAgICAgICAgdmFyIGpzb24gPSBleHRlbmQoe1xuICAgICAgICAgICAgICBncm91cDogZ3JvdXBcbiAgICAgICAgICAgIH0sIGVsZXNBcnJheVtqXSk7XG4gICAgICAgICAgICBfanNvbnMyLnB1c2goanNvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbGVtZW50cyA9IG5ldyBDb2xsZWN0aW9uKGN5LCBfanNvbnMyKTtcbiAgICB9XG5cbiAgICAvLyBzcGVjaWZ5IG9wdGlvbnMgZm9yIG9uZSBlbGVtZW50XG4gICAgZWxzZSB7XG4gICAgICB2YXIgX2pzb24gPSBvcHRzO1xuICAgICAgZWxlbWVudHMgPSBuZXcgRWxlbWVudChjeSwgX2pzb24pLmNvbGxlY3Rpb24oKTtcbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnRzO1xuICB9LFxuICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZShjb2xsZWN0aW9uKSB7XG4gICAgaWYgKGVsZW1lbnRPckNvbGxlY3Rpb24oY29sbGVjdGlvbikpIDsgZWxzZSBpZiAoc3RyaW5nKGNvbGxlY3Rpb24pKSB7XG4gICAgICB2YXIgc2VsZWN0b3IgPSBjb2xsZWN0aW9uO1xuICAgICAgY29sbGVjdGlvbiA9IHRoaXMuJChzZWxlY3Rvcik7XG4gICAgfVxuICAgIHJldHVybiBjb2xsZWN0aW9uLnJlbW92ZSgpO1xuICB9XG59O1xuXG4vKiBnbG9iYWwgRmxvYXQzMkFycmF5ICovXG5cbi8qISBCZXppZXIgY3VydmUgZnVuY3Rpb24gZ2VuZXJhdG9yLiBDb3B5cmlnaHQgR2FldGFuIFJlbmF1ZGVhdS4gTUlUIExpY2Vuc2U6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTUlUX0xpY2Vuc2UgKi9cbmZ1bmN0aW9uIGdlbmVyYXRlQ3ViaWNCZXppZXIobVgxLCBtWTEsIG1YMiwgbVkyKSB7XG4gIHZhciBORVdUT05fSVRFUkFUSU9OUyA9IDQsXG4gICAgTkVXVE9OX01JTl9TTE9QRSA9IDAuMDAxLFxuICAgIFNVQkRJVklTSU9OX1BSRUNJU0lPTiA9IDAuMDAwMDAwMSxcbiAgICBTVUJESVZJU0lPTl9NQVhfSVRFUkFUSU9OUyA9IDEwLFxuICAgIGtTcGxpbmVUYWJsZVNpemUgPSAxMSxcbiAgICBrU2FtcGxlU3RlcFNpemUgPSAxLjAgLyAoa1NwbGluZVRhYmxlU2l6ZSAtIDEuMCksXG4gICAgZmxvYXQzMkFycmF5U3VwcG9ydGVkID0gdHlwZW9mIEZsb2F0MzJBcnJheSAhPT0gJ3VuZGVmaW5lZCc7XG5cbiAgLyogTXVzdCBjb250YWluIGZvdXIgYXJndW1lbnRzLiAqL1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCAhPT0gNCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qIEFyZ3VtZW50cyBtdXN0IGJlIG51bWJlcnMuICovXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgKytpKSB7XG4gICAgaWYgKHR5cGVvZiBhcmd1bWVudHNbaV0gIT09IFwibnVtYmVyXCIgfHwgaXNOYU4oYXJndW1lbnRzW2ldKSB8fCAhaXNGaW5pdGUoYXJndW1lbnRzW2ldKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qIFggdmFsdWVzIG11c3QgYmUgaW4gdGhlIFswLCAxXSByYW5nZS4gKi9cbiAgbVgxID0gTWF0aC5taW4obVgxLCAxKTtcbiAgbVgyID0gTWF0aC5taW4obVgyLCAxKTtcbiAgbVgxID0gTWF0aC5tYXgobVgxLCAwKTtcbiAgbVgyID0gTWF0aC5tYXgobVgyLCAwKTtcbiAgdmFyIG1TYW1wbGVWYWx1ZXMgPSBmbG9hdDMyQXJyYXlTdXBwb3J0ZWQgPyBuZXcgRmxvYXQzMkFycmF5KGtTcGxpbmVUYWJsZVNpemUpIDogbmV3IEFycmF5KGtTcGxpbmVUYWJsZVNpemUpO1xuICBmdW5jdGlvbiBBKGFBMSwgYUEyKSB7XG4gICAgcmV0dXJuIDEuMCAtIDMuMCAqIGFBMiArIDMuMCAqIGFBMTtcbiAgfVxuICBmdW5jdGlvbiBCKGFBMSwgYUEyKSB7XG4gICAgcmV0dXJuIDMuMCAqIGFBMiAtIDYuMCAqIGFBMTtcbiAgfVxuICBmdW5jdGlvbiBDKGFBMSkge1xuICAgIHJldHVybiAzLjAgKiBhQTE7XG4gIH1cbiAgZnVuY3Rpb24gY2FsY0JlemllcihhVCwgYUExLCBhQTIpIHtcbiAgICByZXR1cm4gKChBKGFBMSwgYUEyKSAqIGFUICsgQihhQTEsIGFBMikpICogYVQgKyBDKGFBMSkpICogYVQ7XG4gIH1cbiAgZnVuY3Rpb24gZ2V0U2xvcGUoYVQsIGFBMSwgYUEyKSB7XG4gICAgcmV0dXJuIDMuMCAqIEEoYUExLCBhQTIpICogYVQgKiBhVCArIDIuMCAqIEIoYUExLCBhQTIpICogYVQgKyBDKGFBMSk7XG4gIH1cbiAgZnVuY3Rpb24gbmV3dG9uUmFwaHNvbkl0ZXJhdGUoYVgsIGFHdWVzc1QpIHtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgTkVXVE9OX0lURVJBVElPTlM7ICsrX2kpIHtcbiAgICAgIHZhciBjdXJyZW50U2xvcGUgPSBnZXRTbG9wZShhR3Vlc3NULCBtWDEsIG1YMik7XG4gICAgICBpZiAoY3VycmVudFNsb3BlID09PSAwLjApIHtcbiAgICAgICAgcmV0dXJuIGFHdWVzc1Q7XG4gICAgICB9XG4gICAgICB2YXIgY3VycmVudFggPSBjYWxjQmV6aWVyKGFHdWVzc1QsIG1YMSwgbVgyKSAtIGFYO1xuICAgICAgYUd1ZXNzVCAtPSBjdXJyZW50WCAvIGN1cnJlbnRTbG9wZTtcbiAgICB9XG4gICAgcmV0dXJuIGFHdWVzc1Q7XG4gIH1cbiAgZnVuY3Rpb24gY2FsY1NhbXBsZVZhbHVlcygpIHtcbiAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBrU3BsaW5lVGFibGVTaXplOyArK19pMikge1xuICAgICAgbVNhbXBsZVZhbHVlc1tfaTJdID0gY2FsY0JlemllcihfaTIgKiBrU2FtcGxlU3RlcFNpemUsIG1YMSwgbVgyKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gYmluYXJ5U3ViZGl2aWRlKGFYLCBhQSwgYUIpIHtcbiAgICB2YXIgY3VycmVudFgsXG4gICAgICBjdXJyZW50VCxcbiAgICAgIGkgPSAwO1xuICAgIGRvIHtcbiAgICAgIGN1cnJlbnRUID0gYUEgKyAoYUIgLSBhQSkgLyAyLjA7XG4gICAgICBjdXJyZW50WCA9IGNhbGNCZXppZXIoY3VycmVudFQsIG1YMSwgbVgyKSAtIGFYO1xuICAgICAgaWYgKGN1cnJlbnRYID4gMC4wKSB7XG4gICAgICAgIGFCID0gY3VycmVudFQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhQSA9IGN1cnJlbnRUO1xuICAgICAgfVxuICAgIH0gd2hpbGUgKE1hdGguYWJzKGN1cnJlbnRYKSA+IFNVQkRJVklTSU9OX1BSRUNJU0lPTiAmJiArK2kgPCBTVUJESVZJU0lPTl9NQVhfSVRFUkFUSU9OUyk7XG4gICAgcmV0dXJuIGN1cnJlbnRUO1xuICB9XG4gIGZ1bmN0aW9uIGdldFRGb3JYKGFYKSB7XG4gICAgdmFyIGludGVydmFsU3RhcnQgPSAwLjAsXG4gICAgICBjdXJyZW50U2FtcGxlID0gMSxcbiAgICAgIGxhc3RTYW1wbGUgPSBrU3BsaW5lVGFibGVTaXplIC0gMTtcbiAgICBmb3IgKDsgY3VycmVudFNhbXBsZSAhPT0gbGFzdFNhbXBsZSAmJiBtU2FtcGxlVmFsdWVzW2N1cnJlbnRTYW1wbGVdIDw9IGFYOyArK2N1cnJlbnRTYW1wbGUpIHtcbiAgICAgIGludGVydmFsU3RhcnQgKz0ga1NhbXBsZVN0ZXBTaXplO1xuICAgIH1cbiAgICAtLWN1cnJlbnRTYW1wbGU7XG4gICAgdmFyIGRpc3QgPSAoYVggLSBtU2FtcGxlVmFsdWVzW2N1cnJlbnRTYW1wbGVdKSAvIChtU2FtcGxlVmFsdWVzW2N1cnJlbnRTYW1wbGUgKyAxXSAtIG1TYW1wbGVWYWx1ZXNbY3VycmVudFNhbXBsZV0pLFxuICAgICAgZ3Vlc3NGb3JUID0gaW50ZXJ2YWxTdGFydCArIGRpc3QgKiBrU2FtcGxlU3RlcFNpemUsXG4gICAgICBpbml0aWFsU2xvcGUgPSBnZXRTbG9wZShndWVzc0ZvclQsIG1YMSwgbVgyKTtcbiAgICBpZiAoaW5pdGlhbFNsb3BlID49IE5FV1RPTl9NSU5fU0xPUEUpIHtcbiAgICAgIHJldHVybiBuZXd0b25SYXBoc29uSXRlcmF0ZShhWCwgZ3Vlc3NGb3JUKTtcbiAgICB9IGVsc2UgaWYgKGluaXRpYWxTbG9wZSA9PT0gMC4wKSB7XG4gICAgICByZXR1cm4gZ3Vlc3NGb3JUO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYmluYXJ5U3ViZGl2aWRlKGFYLCBpbnRlcnZhbFN0YXJ0LCBpbnRlcnZhbFN0YXJ0ICsga1NhbXBsZVN0ZXBTaXplKTtcbiAgICB9XG4gIH1cbiAgdmFyIF9wcmVjb21wdXRlZCA9IGZhbHNlO1xuICBmdW5jdGlvbiBwcmVjb21wdXRlKCkge1xuICAgIF9wcmVjb21wdXRlZCA9IHRydWU7XG4gICAgaWYgKG1YMSAhPT0gbVkxIHx8IG1YMiAhPT0gbVkyKSB7XG4gICAgICBjYWxjU2FtcGxlVmFsdWVzKCk7XG4gICAgfVxuICB9XG4gIHZhciBmID0gZnVuY3Rpb24gZihhWCkge1xuICAgIGlmICghX3ByZWNvbXB1dGVkKSB7XG4gICAgICBwcmVjb21wdXRlKCk7XG4gICAgfVxuICAgIGlmIChtWDEgPT09IG1ZMSAmJiBtWDIgPT09IG1ZMikge1xuICAgICAgcmV0dXJuIGFYO1xuICAgIH1cbiAgICBpZiAoYVggPT09IDApIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBpZiAoYVggPT09IDEpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICByZXR1cm4gY2FsY0JlemllcihnZXRURm9yWChhWCksIG1ZMSwgbVkyKTtcbiAgfTtcbiAgZi5nZXRDb250cm9sUG9pbnRzID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBbe1xuICAgICAgeDogbVgxLFxuICAgICAgeTogbVkxXG4gICAgfSwge1xuICAgICAgeDogbVgyLFxuICAgICAgeTogbVkyXG4gICAgfV07XG4gIH07XG4gIHZhciBzdHIgPSBcImdlbmVyYXRlQmV6aWVyKFwiICsgW21YMSwgbVkxLCBtWDIsIG1ZMl0gKyBcIilcIjtcbiAgZi50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gc3RyO1xuICB9O1xuICByZXR1cm4gZjtcbn1cblxuLyohIFJ1bmdlLUt1dHRhIHNwcmluZyBwaHlzaWNzIGZ1bmN0aW9uIGdlbmVyYXRvci4gQWRhcHRlZCBmcm9tIEZyYW1lci5qcywgY29weXJpZ2h0IEtvZW4gQm9rLiBNSVQgTGljZW5zZTogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NSVRfTGljZW5zZSAqL1xuLyogR2l2ZW4gYSB0ZW5zaW9uLCBmcmljdGlvbiwgYW5kIGR1cmF0aW9uLCBhIHNpbXVsYXRpb24gYXQgNjBGUFMgd2lsbCBmaXJzdCBydW4gd2l0aG91dCBhIGRlZmluZWQgZHVyYXRpb24gaW4gb3JkZXIgdG8gY2FsY3VsYXRlIHRoZSBmdWxsIHBhdGguIEEgc2Vjb25kIHBhc3NcbiAgIHRoZW4gYWRqdXN0cyB0aGUgdGltZSBkZWx0YSAtLSB1c2luZyB0aGUgcmVsYXRpb24gYmV0d2VlbiBhY3R1YWwgdGltZSBhbmQgZHVyYXRpb24gLS0gdG8gY2FsY3VsYXRlIHRoZSBwYXRoIGZvciB0aGUgZHVyYXRpb24tY29uc3RyYWluZWQgYW5pbWF0aW9uLiAqL1xudmFyIGdlbmVyYXRlU3ByaW5nUks0ID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBzcHJpbmdBY2NlbGVyYXRpb25Gb3JTdGF0ZShzdGF0ZSkge1xuICAgIHJldHVybiAtc3RhdGUudGVuc2lvbiAqIHN0YXRlLnggLSBzdGF0ZS5mcmljdGlvbiAqIHN0YXRlLnY7XG4gIH1cbiAgZnVuY3Rpb24gc3ByaW5nRXZhbHVhdGVTdGF0ZVdpdGhEZXJpdmF0aXZlKGluaXRpYWxTdGF0ZSwgZHQsIGRlcml2YXRpdmUpIHtcbiAgICB2YXIgc3RhdGUgPSB7XG4gICAgICB4OiBpbml0aWFsU3RhdGUueCArIGRlcml2YXRpdmUuZHggKiBkdCxcbiAgICAgIHY6IGluaXRpYWxTdGF0ZS52ICsgZGVyaXZhdGl2ZS5kdiAqIGR0LFxuICAgICAgdGVuc2lvbjogaW5pdGlhbFN0YXRlLnRlbnNpb24sXG4gICAgICBmcmljdGlvbjogaW5pdGlhbFN0YXRlLmZyaWN0aW9uXG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgZHg6IHN0YXRlLnYsXG4gICAgICBkdjogc3ByaW5nQWNjZWxlcmF0aW9uRm9yU3RhdGUoc3RhdGUpXG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBzcHJpbmdJbnRlZ3JhdGVTdGF0ZShzdGF0ZSwgZHQpIHtcbiAgICB2YXIgYSA9IHtcbiAgICAgICAgZHg6IHN0YXRlLnYsXG4gICAgICAgIGR2OiBzcHJpbmdBY2NlbGVyYXRpb25Gb3JTdGF0ZShzdGF0ZSlcbiAgICAgIH0sXG4gICAgICBiID0gc3ByaW5nRXZhbHVhdGVTdGF0ZVdpdGhEZXJpdmF0aXZlKHN0YXRlLCBkdCAqIDAuNSwgYSksXG4gICAgICBjID0gc3ByaW5nRXZhbHVhdGVTdGF0ZVdpdGhEZXJpdmF0aXZlKHN0YXRlLCBkdCAqIDAuNSwgYiksXG4gICAgICBkID0gc3ByaW5nRXZhbHVhdGVTdGF0ZVdpdGhEZXJpdmF0aXZlKHN0YXRlLCBkdCwgYyksXG4gICAgICBkeGR0ID0gMS4wIC8gNi4wICogKGEuZHggKyAyLjAgKiAoYi5keCArIGMuZHgpICsgZC5keCksXG4gICAgICBkdmR0ID0gMS4wIC8gNi4wICogKGEuZHYgKyAyLjAgKiAoYi5kdiArIGMuZHYpICsgZC5kdik7XG4gICAgc3RhdGUueCA9IHN0YXRlLnggKyBkeGR0ICogZHQ7XG4gICAgc3RhdGUudiA9IHN0YXRlLnYgKyBkdmR0ICogZHQ7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIHJldHVybiBmdW5jdGlvbiBzcHJpbmdSSzRGYWN0b3J5KHRlbnNpb24sIGZyaWN0aW9uLCBkdXJhdGlvbikge1xuICAgIHZhciBpbml0U3RhdGUgPSB7XG4gICAgICAgIHg6IC0xLFxuICAgICAgICB2OiAwLFxuICAgICAgICB0ZW5zaW9uOiBudWxsLFxuICAgICAgICBmcmljdGlvbjogbnVsbFxuICAgICAgfSxcbiAgICAgIHBhdGggPSBbMF0sXG4gICAgICB0aW1lX2xhcHNlZCA9IDAsXG4gICAgICB0b2xlcmFuY2UgPSAxIC8gMTAwMDAsXG4gICAgICBEVCA9IDE2IC8gMTAwMCxcbiAgICAgIGhhdmVfZHVyYXRpb24sXG4gICAgICBkdCxcbiAgICAgIGxhc3Rfc3RhdGU7XG4gICAgdGVuc2lvbiA9IHBhcnNlRmxvYXQodGVuc2lvbikgfHwgNTAwO1xuICAgIGZyaWN0aW9uID0gcGFyc2VGbG9hdChmcmljdGlvbikgfHwgMjA7XG4gICAgZHVyYXRpb24gPSBkdXJhdGlvbiB8fCBudWxsO1xuICAgIGluaXRTdGF0ZS50ZW5zaW9uID0gdGVuc2lvbjtcbiAgICBpbml0U3RhdGUuZnJpY3Rpb24gPSBmcmljdGlvbjtcbiAgICBoYXZlX2R1cmF0aW9uID0gZHVyYXRpb24gIT09IG51bGw7XG5cbiAgICAvKiBDYWxjdWxhdGUgdGhlIGFjdHVhbCB0aW1lIGl0IHRha2VzIGZvciB0aGlzIGFuaW1hdGlvbiB0byBjb21wbGV0ZSB3aXRoIHRoZSBwcm92aWRlZCBjb25kaXRpb25zLiAqL1xuICAgIGlmIChoYXZlX2R1cmF0aW9uKSB7XG4gICAgICAvKiBSdW4gdGhlIHNpbXVsYXRpb24gd2l0aG91dCBhIGR1cmF0aW9uLiAqL1xuICAgICAgdGltZV9sYXBzZWQgPSBzcHJpbmdSSzRGYWN0b3J5KHRlbnNpb24sIGZyaWN0aW9uKTtcbiAgICAgIC8qIENvbXB1dGUgdGhlIGFkanVzdGVkIHRpbWUgZGVsdGEuICovXG4gICAgICBkdCA9IHRpbWVfbGFwc2VkIC8gZHVyYXRpb24gKiBEVDtcbiAgICB9IGVsc2Uge1xuICAgICAgZHQgPSBEVDtcbiAgICB9XG4gICAgZm9yICg7Oykge1xuICAgICAgLyogTmV4dC9zdGVwIGZ1bmN0aW9uIC4qL1xuICAgICAgbGFzdF9zdGF0ZSA9IHNwcmluZ0ludGVncmF0ZVN0YXRlKGxhc3Rfc3RhdGUgfHwgaW5pdFN0YXRlLCBkdCk7XG4gICAgICAvKiBTdG9yZSB0aGUgcG9zaXRpb24uICovXG4gICAgICBwYXRoLnB1c2goMSArIGxhc3Rfc3RhdGUueCk7XG4gICAgICB0aW1lX2xhcHNlZCArPSAxNjtcbiAgICAgIC8qIElmIHRoZSBjaGFuZ2UgdGhyZXNob2xkIGlzIHJlYWNoZWQsIGJyZWFrLiAqL1xuICAgICAgaWYgKCEoTWF0aC5hYnMobGFzdF9zdGF0ZS54KSA+IHRvbGVyYW5jZSAmJiBNYXRoLmFicyhsYXN0X3N0YXRlLnYpID4gdG9sZXJhbmNlKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBJZiBkdXJhdGlvbiBpcyBub3QgZGVmaW5lZCwgcmV0dXJuIHRoZSBhY3R1YWwgdGltZSByZXF1aXJlZCBmb3IgY29tcGxldGluZyB0aGlzIGFuaW1hdGlvbi4gT3RoZXJ3aXNlLCByZXR1cm4gYSBjbG9zdXJlIHRoYXQgaG9sZHMgdGhlXG4gICAgICAgY29tcHV0ZWQgcGF0aCBhbmQgcmV0dXJucyBhIHNuYXBzaG90IG9mIHRoZSBwb3NpdGlvbiBhY2NvcmRpbmcgdG8gYSBnaXZlbiBwZXJjZW50Q29tcGxldGUuICovXG4gICAgcmV0dXJuICFoYXZlX2R1cmF0aW9uID8gdGltZV9sYXBzZWQgOiBmdW5jdGlvbiAocGVyY2VudENvbXBsZXRlKSB7XG4gICAgICByZXR1cm4gcGF0aFtwZXJjZW50Q29tcGxldGUgKiAocGF0aC5sZW5ndGggLSAxKSB8IDBdO1xuICAgIH07XG4gIH07XG59KCk7XG5cbnZhciBjdWJpY0JlemllciA9IGZ1bmN0aW9uIGN1YmljQmV6aWVyKHQxLCBwMSwgdDIsIHAyKSB7XG4gIHZhciBiZXppZXIgPSBnZW5lcmF0ZUN1YmljQmV6aWVyKHQxLCBwMSwgdDIsIHAyKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChzdGFydCwgZW5kLCBwZXJjZW50KSB7XG4gICAgcmV0dXJuIHN0YXJ0ICsgKGVuZCAtIHN0YXJ0KSAqIGJlemllcihwZXJjZW50KTtcbiAgfTtcbn07XG52YXIgZWFzaW5ncyA9IHtcbiAgJ2xpbmVhcic6IGZ1bmN0aW9uIGxpbmVhcihzdGFydCwgZW5kLCBwZXJjZW50KSB7XG4gICAgcmV0dXJuIHN0YXJ0ICsgKGVuZCAtIHN0YXJ0KSAqIHBlcmNlbnQ7XG4gIH0sXG4gIC8vIGRlZmF1bHQgZWFzaW5nc1xuICAnZWFzZSc6IGN1YmljQmV6aWVyKDAuMjUsIDAuMSwgMC4yNSwgMSksXG4gICdlYXNlLWluJzogY3ViaWNCZXppZXIoMC40MiwgMCwgMSwgMSksXG4gICdlYXNlLW91dCc6IGN1YmljQmV6aWVyKDAsIDAsIDAuNTgsIDEpLFxuICAnZWFzZS1pbi1vdXQnOiBjdWJpY0JlemllcigwLjQyLCAwLCAwLjU4LCAxKSxcbiAgLy8gc2luZVxuICAnZWFzZS1pbi1zaW5lJzogY3ViaWNCZXppZXIoMC40NywgMCwgMC43NDUsIDAuNzE1KSxcbiAgJ2Vhc2Utb3V0LXNpbmUnOiBjdWJpY0JlemllcigwLjM5LCAwLjU3NSwgMC41NjUsIDEpLFxuICAnZWFzZS1pbi1vdXQtc2luZSc6IGN1YmljQmV6aWVyKDAuNDQ1LCAwLjA1LCAwLjU1LCAwLjk1KSxcbiAgLy8gcXVhZFxuICAnZWFzZS1pbi1xdWFkJzogY3ViaWNCZXppZXIoMC41NSwgMC4wODUsIDAuNjgsIDAuNTMpLFxuICAnZWFzZS1vdXQtcXVhZCc6IGN1YmljQmV6aWVyKDAuMjUsIDAuNDYsIDAuNDUsIDAuOTQpLFxuICAnZWFzZS1pbi1vdXQtcXVhZCc6IGN1YmljQmV6aWVyKDAuNDU1LCAwLjAzLCAwLjUxNSwgMC45NTUpLFxuICAvLyBjdWJpY1xuICAnZWFzZS1pbi1jdWJpYyc6IGN1YmljQmV6aWVyKDAuNTUsIDAuMDU1LCAwLjY3NSwgMC4xOSksXG4gICdlYXNlLW91dC1jdWJpYyc6IGN1YmljQmV6aWVyKDAuMjE1LCAwLjYxLCAwLjM1NSwgMSksXG4gICdlYXNlLWluLW91dC1jdWJpYyc6IGN1YmljQmV6aWVyKDAuNjQ1LCAwLjA0NSwgMC4zNTUsIDEpLFxuICAvLyBxdWFydFxuICAnZWFzZS1pbi1xdWFydCc6IGN1YmljQmV6aWVyKDAuODk1LCAwLjAzLCAwLjY4NSwgMC4yMiksXG4gICdlYXNlLW91dC1xdWFydCc6IGN1YmljQmV6aWVyKDAuMTY1LCAwLjg0LCAwLjQ0LCAxKSxcbiAgJ2Vhc2UtaW4tb3V0LXF1YXJ0JzogY3ViaWNCZXppZXIoMC43NywgMCwgMC4xNzUsIDEpLFxuICAvLyBxdWludFxuICAnZWFzZS1pbi1xdWludCc6IGN1YmljQmV6aWVyKDAuNzU1LCAwLjA1LCAwLjg1NSwgMC4wNiksXG4gICdlYXNlLW91dC1xdWludCc6IGN1YmljQmV6aWVyKDAuMjMsIDEsIDAuMzIsIDEpLFxuICAnZWFzZS1pbi1vdXQtcXVpbnQnOiBjdWJpY0JlemllcigwLjg2LCAwLCAwLjA3LCAxKSxcbiAgLy8gZXhwb1xuICAnZWFzZS1pbi1leHBvJzogY3ViaWNCZXppZXIoMC45NSwgMC4wNSwgMC43OTUsIDAuMDM1KSxcbiAgJ2Vhc2Utb3V0LWV4cG8nOiBjdWJpY0JlemllcigwLjE5LCAxLCAwLjIyLCAxKSxcbiAgJ2Vhc2UtaW4tb3V0LWV4cG8nOiBjdWJpY0JlemllcigxLCAwLCAwLCAxKSxcbiAgLy8gY2lyY1xuICAnZWFzZS1pbi1jaXJjJzogY3ViaWNCZXppZXIoMC42LCAwLjA0LCAwLjk4LCAwLjMzNSksXG4gICdlYXNlLW91dC1jaXJjJzogY3ViaWNCZXppZXIoMC4wNzUsIDAuODIsIDAuMTY1LCAxKSxcbiAgJ2Vhc2UtaW4tb3V0LWNpcmMnOiBjdWJpY0JlemllcigwLjc4NSwgMC4xMzUsIDAuMTUsIDAuODYpLFxuICAvLyB1c2VyIHBhcmFtIGVhc2luZ3MuLi5cblxuICAnc3ByaW5nJzogZnVuY3Rpb24gc3ByaW5nKHRlbnNpb24sIGZyaWN0aW9uLCBkdXJhdGlvbikge1xuICAgIGlmIChkdXJhdGlvbiA9PT0gMCkge1xuICAgICAgLy8gY2FuJ3QgZ2V0IGEgc3ByaW5nIHcvIGR1cmF0aW9uIDBcbiAgICAgIHJldHVybiBlYXNpbmdzLmxpbmVhcjsgLy8gZHVyYXRpb24gMCA9PiBqdW1wIHRvIGVuZCBzbyBpbXBsIGRvZXNuJ3QgbWF0dGVyXG4gICAgfVxuICAgIHZhciBzcHJpbmcgPSBnZW5lcmF0ZVNwcmluZ1JLNCh0ZW5zaW9uLCBmcmljdGlvbiwgZHVyYXRpb24pO1xuICAgIHJldHVybiBmdW5jdGlvbiAoc3RhcnQsIGVuZCwgcGVyY2VudCkge1xuICAgICAgcmV0dXJuIHN0YXJ0ICsgKGVuZCAtIHN0YXJ0KSAqIHNwcmluZyhwZXJjZW50KTtcbiAgICB9O1xuICB9LFxuICAnY3ViaWMtYmV6aWVyJzogY3ViaWNCZXppZXJcbn07XG5cbmZ1bmN0aW9uIGdldEVhc2VkVmFsdWUodHlwZSwgc3RhcnQsIGVuZCwgcGVyY2VudCwgZWFzaW5nRm4pIHtcbiAgaWYgKHBlcmNlbnQgPT09IDEpIHtcbiAgICByZXR1cm4gZW5kO1xuICB9XG4gIGlmIChzdGFydCA9PT0gZW5kKSB7XG4gICAgcmV0dXJuIGVuZDtcbiAgfVxuICB2YXIgdmFsID0gZWFzaW5nRm4oc3RhcnQsIGVuZCwgcGVyY2VudCk7XG4gIGlmICh0eXBlID09IG51bGwpIHtcbiAgICByZXR1cm4gdmFsO1xuICB9XG4gIGlmICh0eXBlLnJvdW5kVmFsdWUgfHwgdHlwZS5jb2xvcikge1xuICAgIHZhbCA9IE1hdGgucm91bmQodmFsKTtcbiAgfVxuICBpZiAodHlwZS5taW4gIT09IHVuZGVmaW5lZCkge1xuICAgIHZhbCA9IE1hdGgubWF4KHZhbCwgdHlwZS5taW4pO1xuICB9XG4gIGlmICh0eXBlLm1heCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFsID0gTWF0aC5taW4odmFsLCB0eXBlLm1heCk7XG4gIH1cbiAgcmV0dXJuIHZhbDtcbn1cbmZ1bmN0aW9uIGdldFZhbHVlKHByb3AsIHNwZWMpIHtcbiAgaWYgKHByb3AucGZWYWx1ZSAhPSBudWxsIHx8IHByb3AudmFsdWUgIT0gbnVsbCkge1xuICAgIGlmIChwcm9wLnBmVmFsdWUgIT0gbnVsbCAmJiAoc3BlYyA9PSBudWxsIHx8IHNwZWMudHlwZS51bml0cyAhPT0gJyUnKSkge1xuICAgICAgcmV0dXJuIHByb3AucGZWYWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHByb3AudmFsdWU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBwcm9wO1xuICB9XG59XG5mdW5jdGlvbiBlYXNlKHN0YXJ0UHJvcCwgZW5kUHJvcCwgcGVyY2VudCwgZWFzaW5nRm4sIHByb3BTcGVjKSB7XG4gIHZhciB0eXBlID0gcHJvcFNwZWMgIT0gbnVsbCA/IHByb3BTcGVjLnR5cGUgOiBudWxsO1xuICBpZiAocGVyY2VudCA8IDApIHtcbiAgICBwZXJjZW50ID0gMDtcbiAgfSBlbHNlIGlmIChwZXJjZW50ID4gMSkge1xuICAgIHBlcmNlbnQgPSAxO1xuICB9XG4gIHZhciBzdGFydCA9IGdldFZhbHVlKHN0YXJ0UHJvcCwgcHJvcFNwZWMpO1xuICB2YXIgZW5kID0gZ2V0VmFsdWUoZW5kUHJvcCwgcHJvcFNwZWMpO1xuICBpZiAobnVtYmVyJDEoc3RhcnQpICYmIG51bWJlciQxKGVuZCkpIHtcbiAgICByZXR1cm4gZ2V0RWFzZWRWYWx1ZSh0eXBlLCBzdGFydCwgZW5kLCBwZXJjZW50LCBlYXNpbmdGbik7XG4gIH0gZWxzZSBpZiAoYXJyYXkoc3RhcnQpICYmIGFycmF5KGVuZCkpIHtcbiAgICB2YXIgZWFzZWRBcnIgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVuZC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHNpID0gc3RhcnRbaV07XG4gICAgICB2YXIgZWkgPSBlbmRbaV07XG4gICAgICBpZiAoc2kgIT0gbnVsbCAmJiBlaSAhPSBudWxsKSB7XG4gICAgICAgIHZhciB2YWwgPSBnZXRFYXNlZFZhbHVlKHR5cGUsIHNpLCBlaSwgcGVyY2VudCwgZWFzaW5nRm4pO1xuICAgICAgICBlYXNlZEFyci5wdXNoKHZhbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlYXNlZEFyci5wdXNoKGVpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVhc2VkQXJyO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHN0ZXAkMShzZWxmLCBhbmksIG5vdywgaXNDb3JlKSB7XG4gIHZhciBpc0VsZXMgPSAhaXNDb3JlO1xuICB2YXIgX3AgPSBzZWxmLl9wcml2YXRlO1xuICB2YXIgYW5pX3AgPSBhbmkuX3ByaXZhdGU7XG4gIHZhciBwRWFzaW5nID0gYW5pX3AuZWFzaW5nO1xuICB2YXIgc3RhcnRUaW1lID0gYW5pX3Auc3RhcnRUaW1lO1xuICB2YXIgY3kgPSBpc0NvcmUgPyBzZWxmIDogc2VsZi5jeSgpO1xuICB2YXIgc3R5bGUgPSBjeS5zdHlsZSgpO1xuICBpZiAoIWFuaV9wLmVhc2luZ0ltcGwpIHtcbiAgICBpZiAocEVhc2luZyA9PSBudWxsKSB7XG4gICAgICAvLyB1c2UgZGVmYXVsdFxuICAgICAgYW5pX3AuZWFzaW5nSW1wbCA9IGVhc2luZ3NbJ2xpbmVhciddO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB0aGVuIGRlZmluZSB3LyBuYW1lXG4gICAgICB2YXIgZWFzaW5nVmFscztcbiAgICAgIGlmIChzdHJpbmcocEVhc2luZykpIHtcbiAgICAgICAgdmFyIGVhc2luZ1Byb3AgPSBzdHlsZS5wYXJzZSgndHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb24nLCBwRWFzaW5nKTtcbiAgICAgICAgZWFzaW5nVmFscyA9IGVhc2luZ1Byb3AudmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB0aGVuIGFzc3VtZSBwcmVwYXJzZWQgYXJyYXlcbiAgICAgICAgZWFzaW5nVmFscyA9IHBFYXNpbmc7XG4gICAgICB9XG4gICAgICB2YXIgbmFtZSwgYXJncztcbiAgICAgIGlmIChzdHJpbmcoZWFzaW5nVmFscykpIHtcbiAgICAgICAgbmFtZSA9IGVhc2luZ1ZhbHM7XG4gICAgICAgIGFyZ3MgPSBbXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5hbWUgPSBlYXNpbmdWYWxzWzFdO1xuICAgICAgICBhcmdzID0gZWFzaW5nVmFscy5zbGljZSgyKS5tYXAoZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgICByZXR1cm4gK247XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyBjcmVhdGUgd2l0aCBhcmdzXG4gICAgICAgIGlmIChuYW1lID09PSAnc3ByaW5nJykge1xuICAgICAgICAgIGFyZ3MucHVzaChhbmlfcC5kdXJhdGlvbik7IC8vIG5lZWQgZHVyYXRpb24gdG8gZ2VuZXJhdGUgc3ByaW5nXG4gICAgICAgIH1cbiAgICAgICAgYW5pX3AuZWFzaW5nSW1wbCA9IGVhc2luZ3NbbmFtZV0uYXBwbHkobnVsbCwgYXJncyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBzdGF0aWMgaW1wbCBieSBuYW1lXG4gICAgICAgIGFuaV9wLmVhc2luZ0ltcGwgPSBlYXNpbmdzW25hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICB2YXIgZWFzaW5nID0gYW5pX3AuZWFzaW5nSW1wbDtcbiAgdmFyIHBlcmNlbnQ7XG4gIGlmIChhbmlfcC5kdXJhdGlvbiA9PT0gMCkge1xuICAgIHBlcmNlbnQgPSAxO1xuICB9IGVsc2Uge1xuICAgIHBlcmNlbnQgPSAobm93IC0gc3RhcnRUaW1lKSAvIGFuaV9wLmR1cmF0aW9uO1xuICB9XG4gIGlmIChhbmlfcC5hcHBseWluZykge1xuICAgIHBlcmNlbnQgPSBhbmlfcC5wcm9ncmVzcztcbiAgfVxuICBpZiAocGVyY2VudCA8IDApIHtcbiAgICBwZXJjZW50ID0gMDtcbiAgfSBlbHNlIGlmIChwZXJjZW50ID4gMSkge1xuICAgIHBlcmNlbnQgPSAxO1xuICB9XG4gIGlmIChhbmlfcC5kZWxheSA9PSBudWxsKSB7XG4gICAgLy8gdGhlbiB1cGRhdGVcblxuICAgIHZhciBzdGFydFBvcyA9IGFuaV9wLnN0YXJ0UG9zaXRpb247XG4gICAgdmFyIGVuZFBvcyA9IGFuaV9wLnBvc2l0aW9uO1xuICAgIGlmIChlbmRQb3MgJiYgaXNFbGVzICYmICFzZWxmLmxvY2tlZCgpKSB7XG4gICAgICB2YXIgbmV3UG9zID0ge307XG4gICAgICBpZiAodmFsaWQoc3RhcnRQb3MueCwgZW5kUG9zLngpKSB7XG4gICAgICAgIG5ld1Bvcy54ID0gZWFzZShzdGFydFBvcy54LCBlbmRQb3MueCwgcGVyY2VudCwgZWFzaW5nKTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWxpZChzdGFydFBvcy55LCBlbmRQb3MueSkpIHtcbiAgICAgICAgbmV3UG9zLnkgPSBlYXNlKHN0YXJ0UG9zLnksIGVuZFBvcy55LCBwZXJjZW50LCBlYXNpbmcpO1xuICAgICAgfVxuICAgICAgc2VsZi5wb3NpdGlvbihuZXdQb3MpO1xuICAgIH1cbiAgICB2YXIgc3RhcnRQYW4gPSBhbmlfcC5zdGFydFBhbjtcbiAgICB2YXIgZW5kUGFuID0gYW5pX3AucGFuO1xuICAgIHZhciBwYW4gPSBfcC5wYW47XG4gICAgdmFyIGFuaW1hdGluZ1BhbiA9IGVuZFBhbiAhPSBudWxsICYmIGlzQ29yZTtcbiAgICBpZiAoYW5pbWF0aW5nUGFuKSB7XG4gICAgICBpZiAodmFsaWQoc3RhcnRQYW4ueCwgZW5kUGFuLngpKSB7XG4gICAgICAgIHBhbi54ID0gZWFzZShzdGFydFBhbi54LCBlbmRQYW4ueCwgcGVyY2VudCwgZWFzaW5nKTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWxpZChzdGFydFBhbi55LCBlbmRQYW4ueSkpIHtcbiAgICAgICAgcGFuLnkgPSBlYXNlKHN0YXJ0UGFuLnksIGVuZFBhbi55LCBwZXJjZW50LCBlYXNpbmcpO1xuICAgICAgfVxuICAgICAgc2VsZi5lbWl0KCdwYW4nKTtcbiAgICB9XG4gICAgdmFyIHN0YXJ0Wm9vbSA9IGFuaV9wLnN0YXJ0Wm9vbTtcbiAgICB2YXIgZW5kWm9vbSA9IGFuaV9wLnpvb207XG4gICAgdmFyIGFuaW1hdGluZ1pvb20gPSBlbmRab29tICE9IG51bGwgJiYgaXNDb3JlO1xuICAgIGlmIChhbmltYXRpbmdab29tKSB7XG4gICAgICBpZiAodmFsaWQoc3RhcnRab29tLCBlbmRab29tKSkge1xuICAgICAgICBfcC56b29tID0gYm91bmQoX3AubWluWm9vbSwgZWFzZShzdGFydFpvb20sIGVuZFpvb20sIHBlcmNlbnQsIGVhc2luZyksIF9wLm1heFpvb20pO1xuICAgICAgfVxuICAgICAgc2VsZi5lbWl0KCd6b29tJyk7XG4gICAgfVxuICAgIGlmIChhbmltYXRpbmdQYW4gfHwgYW5pbWF0aW5nWm9vbSkge1xuICAgICAgc2VsZi5lbWl0KCd2aWV3cG9ydCcpO1xuICAgIH1cbiAgICB2YXIgcHJvcHMgPSBhbmlfcC5zdHlsZTtcbiAgICBpZiAocHJvcHMgJiYgcHJvcHMubGVuZ3RoID4gMCAmJiBpc0VsZXMpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHByb3AgPSBwcm9wc1tpXTtcbiAgICAgICAgdmFyIF9uYW1lID0gcHJvcC5uYW1lO1xuICAgICAgICB2YXIgZW5kID0gcHJvcDtcbiAgICAgICAgdmFyIHN0YXJ0ID0gYW5pX3Auc3RhcnRTdHlsZVtfbmFtZV07XG4gICAgICAgIHZhciBwcm9wU3BlYyA9IHN0eWxlLnByb3BlcnRpZXNbc3RhcnQubmFtZV07XG4gICAgICAgIHZhciBlYXNlZFZhbCA9IGVhc2Uoc3RhcnQsIGVuZCwgcGVyY2VudCwgZWFzaW5nLCBwcm9wU3BlYyk7XG4gICAgICAgIHN0eWxlLm92ZXJyaWRlQnlwYXNzKHNlbGYsIF9uYW1lLCBlYXNlZFZhbCk7XG4gICAgICB9IC8vIGZvciBwcm9wc1xuXG4gICAgICBzZWxmLmVtaXQoJ3N0eWxlJyk7XG4gICAgfSAvLyBpZlxuICB9XG4gIGFuaV9wLnByb2dyZXNzID0gcGVyY2VudDtcbiAgcmV0dXJuIHBlcmNlbnQ7XG59XG5mdW5jdGlvbiB2YWxpZChzdGFydCwgZW5kKSB7XG4gIGlmIChzdGFydCA9PSBudWxsIHx8IGVuZCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChudW1iZXIkMShzdGFydCkgJiYgbnVtYmVyJDEoZW5kKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2UgaWYgKHN0YXJ0ICYmIGVuZCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gc3RhcnRBbmltYXRpb24oc2VsZiwgYW5pLCBub3csIGlzQ29yZSkge1xuICB2YXIgYW5pX3AgPSBhbmkuX3ByaXZhdGU7XG4gIGFuaV9wLnN0YXJ0ZWQgPSB0cnVlO1xuICBhbmlfcC5zdGFydFRpbWUgPSBub3cgLSBhbmlfcC5wcm9ncmVzcyAqIGFuaV9wLmR1cmF0aW9uO1xufVxuXG5mdW5jdGlvbiBzdGVwQWxsKG5vdywgY3kpIHtcbiAgdmFyIGVsZXMgPSBjeS5fcHJpdmF0ZS5hbmlFbGVzO1xuICB2YXIgZG9uZUVsZXMgPSBbXTtcbiAgZnVuY3Rpb24gc3RlcE9uZShlbGUsIGlzQ29yZSkge1xuICAgIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgICB2YXIgY3VycmVudCA9IF9wLmFuaW1hdGlvbi5jdXJyZW50O1xuICAgIHZhciBxdWV1ZSA9IF9wLmFuaW1hdGlvbi5xdWV1ZTtcbiAgICB2YXIgcmFuQW5pcyA9IGZhbHNlO1xuXG4gICAgLy8gaWYgbm90aGluZyBjdXJyZW50bHkgYW5pbWF0aW5nLCBnZXQgc29tZXRoaW5nIGZyb20gdGhlIHF1ZXVlXG4gICAgaWYgKGN1cnJlbnQubGVuZ3RoID09PSAwKSB7XG4gICAgICB2YXIgbmV4dCA9IHF1ZXVlLnNoaWZ0KCk7XG4gICAgICBpZiAobmV4dCkge1xuICAgICAgICBjdXJyZW50LnB1c2gobmV4dCk7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBjYWxsYmFja3MgPSBmdW5jdGlvbiBjYWxsYmFja3MoX2NhbGxiYWNrcykge1xuICAgICAgZm9yICh2YXIgaiA9IF9jYWxsYmFja3MubGVuZ3RoIC0gMTsgaiA+PSAwOyBqLS0pIHtcbiAgICAgICAgdmFyIGNiID0gX2NhbGxiYWNrc1tqXTtcbiAgICAgICAgY2IoKTtcbiAgICAgIH1cbiAgICAgIF9jYWxsYmFja3Muc3BsaWNlKDAsIF9jYWxsYmFja3MubGVuZ3RoKTtcbiAgICB9O1xuXG4gICAgLy8gc3RlcCBhbmQgcmVtb3ZlIGlmIGRvbmVcbiAgICBmb3IgKHZhciBpID0gY3VycmVudC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGFuaSA9IGN1cnJlbnRbaV07XG4gICAgICB2YXIgYW5pX3AgPSBhbmkuX3ByaXZhdGU7XG4gICAgICBpZiAoYW5pX3Auc3RvcHBlZCkge1xuICAgICAgICBjdXJyZW50LnNwbGljZShpLCAxKTtcbiAgICAgICAgYW5pX3AuaG9va2VkID0gZmFsc2U7XG4gICAgICAgIGFuaV9wLnBsYXlpbmcgPSBmYWxzZTtcbiAgICAgICAgYW5pX3Auc3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICBjYWxsYmFja3MoYW5pX3AuZnJhbWVzKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoIWFuaV9wLnBsYXlpbmcgJiYgIWFuaV9wLmFwcGx5aW5nKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBhbiBhcHBseSgpIHdoaWxlIHBsYXlpbmcgc2hvdWxkbid0IGRvIGFueXRoaW5nXG4gICAgICBpZiAoYW5pX3AucGxheWluZyAmJiBhbmlfcC5hcHBseWluZykge1xuICAgICAgICBhbmlfcC5hcHBseWluZyA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKCFhbmlfcC5zdGFydGVkKSB7XG4gICAgICAgIHN0YXJ0QW5pbWF0aW9uKGVsZSwgYW5pLCBub3cpO1xuICAgICAgfVxuICAgICAgc3RlcCQxKGVsZSwgYW5pLCBub3csIGlzQ29yZSk7XG4gICAgICBpZiAoYW5pX3AuYXBwbHlpbmcpIHtcbiAgICAgICAgYW5pX3AuYXBwbHlpbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNhbGxiYWNrcyhhbmlfcC5mcmFtZXMpO1xuICAgICAgaWYgKGFuaV9wLnN0ZXAgIT0gbnVsbCkge1xuICAgICAgICBhbmlfcC5zdGVwKG5vdyk7XG4gICAgICB9XG4gICAgICBpZiAoYW5pLmNvbXBsZXRlZCgpKSB7XG4gICAgICAgIGN1cnJlbnQuc3BsaWNlKGksIDEpO1xuICAgICAgICBhbmlfcC5ob29rZWQgPSBmYWxzZTtcbiAgICAgICAgYW5pX3AucGxheWluZyA9IGZhbHNlO1xuICAgICAgICBhbmlfcC5zdGFydGVkID0gZmFsc2U7XG4gICAgICAgIGNhbGxiYWNrcyhhbmlfcC5jb21wbGV0ZXMpO1xuICAgICAgfVxuICAgICAgcmFuQW5pcyA9IHRydWU7XG4gICAgfVxuICAgIGlmICghaXNDb3JlICYmIGN1cnJlbnQubGVuZ3RoID09PSAwICYmIHF1ZXVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZG9uZUVsZXMucHVzaChlbGUpO1xuICAgIH1cbiAgICByZXR1cm4gcmFuQW5pcztcbiAgfSAvLyBzdGVwRWxlbWVudFxuXG4gIC8vIGhhbmRsZSBhbGwgZWxlc1xuICB2YXIgcmFuRWxlQW5pID0gZmFsc2U7XG4gIGZvciAodmFyIGUgPSAwOyBlIDwgZWxlcy5sZW5ndGg7IGUrKykge1xuICAgIHZhciBlbGUgPSBlbGVzW2VdO1xuICAgIHZhciBoYW5kbGVkVGhpc0VsZSA9IHN0ZXBPbmUoZWxlKTtcbiAgICByYW5FbGVBbmkgPSByYW5FbGVBbmkgfHwgaGFuZGxlZFRoaXNFbGU7XG4gIH0gLy8gZWFjaCBlbGVtZW50XG5cbiAgdmFyIHJhbkNvcmVBbmkgPSBzdGVwT25lKGN5LCB0cnVlKTtcblxuICAvLyBub3RpZnkgcmVuZGVyZXJcbiAgaWYgKHJhbkVsZUFuaSB8fCByYW5Db3JlQW5pKSB7XG4gICAgaWYgKGVsZXMubGVuZ3RoID4gMCkge1xuICAgICAgY3kubm90aWZ5KCdkcmF3JywgZWxlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN5Lm5vdGlmeSgnZHJhdycpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHJlbW92ZSBlbGVtZW50cyBmcm9tIGxpc3Qgb2YgY3VycmVudGx5IGFuaW1hdGluZyBpZiBpdHMgcXVldWVzIGFyZSBlbXB0eVxuICBlbGVzLnVubWVyZ2UoZG9uZUVsZXMpO1xuICBjeS5lbWl0KCdzdGVwJyk7XG59IC8vIHN0ZXBBbGxcblxudmFyIGNvcmVmbiQ4ID0ge1xuICAvLyBwdWxsIGluIGFuaW1hdGlvbiBmdW5jdGlvbnNcbiAgYW5pbWF0ZTogZGVmaW5lLmFuaW1hdGUoKSxcbiAgYW5pbWF0aW9uOiBkZWZpbmUuYW5pbWF0aW9uKCksXG4gIGFuaW1hdGVkOiBkZWZpbmUuYW5pbWF0ZWQoKSxcbiAgY2xlYXJRdWV1ZTogZGVmaW5lLmNsZWFyUXVldWUoKSxcbiAgZGVsYXk6IGRlZmluZS5kZWxheSgpLFxuICBkZWxheUFuaW1hdGlvbjogZGVmaW5lLmRlbGF5QW5pbWF0aW9uKCksXG4gIHN0b3A6IGRlZmluZS5zdG9wKCksXG4gIGFkZFRvQW5pbWF0aW9uUG9vbDogZnVuY3Rpb24gYWRkVG9BbmltYXRpb25Qb29sKGVsZXMpIHtcbiAgICB2YXIgY3kgPSB0aGlzO1xuICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIHNhdmUgY3ljbGVzIHdoZW4gbm8gc3R5bGUgdXNlZFxuXG4gICAgY3kuX3ByaXZhdGUuYW5pRWxlcy5tZXJnZShlbGVzKTtcbiAgfSxcbiAgc3RvcEFuaW1hdGlvbkxvb3A6IGZ1bmN0aW9uIHN0b3BBbmltYXRpb25Mb29wKCkge1xuICAgIHRoaXMuX3ByaXZhdGUuYW5pbWF0aW9uc1J1bm5pbmcgPSBmYWxzZTtcbiAgfSxcbiAgc3RhcnRBbmltYXRpb25Mb29wOiBmdW5jdGlvbiBzdGFydEFuaW1hdGlvbkxvb3AoKSB7XG4gICAgdmFyIGN5ID0gdGhpcztcbiAgICBjeS5fcHJpdmF0ZS5hbmltYXRpb25zUnVubmluZyA9IHRydWU7XG4gICAgaWYgKCFjeS5zdHlsZUVuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gc2F2ZSBjeWNsZXMgd2hlbiBubyBzdHlsZSB1c2VkXG5cbiAgICAvLyBOQiB0aGUgYW5pbWF0aW9uIGxvb3Agd2lsbCBleGVjIGluIGhlYWRsZXNzIGVudmlyb25tZW50cyBpZiBzdHlsZSBlbmFibGVkXG4gICAgLy8gYW5kIGV4cGxpY2l0IGN5LmRlc3Ryb3koKSBpcyBuZWNlc3NhcnkgdG8gc3RvcCB0aGUgbG9vcFxuXG4gICAgZnVuY3Rpb24gaGVhZGxlc3NTdGVwKCkge1xuICAgICAgaWYgKCFjeS5fcHJpdmF0ZS5hbmltYXRpb25zUnVubmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gYW5pbWF0aW9uU3RlcChub3cpIHtcbiAgICAgICAgc3RlcEFsbChub3csIGN5KTtcbiAgICAgICAgaGVhZGxlc3NTdGVwKCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgdmFyIHJlbmRlcmVyID0gY3kucmVuZGVyZXIoKTtcbiAgICBpZiAocmVuZGVyZXIgJiYgcmVuZGVyZXIuYmVmb3JlUmVuZGVyKSB7XG4gICAgICAvLyBsZXQgdGhlIHJlbmRlcmVyIHNjaGVkdWxlIGFuaW1hdGlvbnNcbiAgICAgIHJlbmRlcmVyLmJlZm9yZVJlbmRlcihmdW5jdGlvbiByZW5kZXJlckFuaW1hdGlvblN0ZXAod2lsbERyYXcsIG5vdykge1xuICAgICAgICBzdGVwQWxsKG5vdywgY3kpO1xuICAgICAgfSwgcmVuZGVyZXIuYmVmb3JlUmVuZGVyUHJpb3JpdGllcy5hbmltYXRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gbWFuYWdlIHRoZSBhbmltYXRpb24gbG9vcCBvdXJzZWx2ZXNcbiAgICAgIGhlYWRsZXNzU3RlcCgpOyAvLyBmaXJzdCBjYWxsXG4gICAgfVxuICB9XG59O1xuXG52YXIgZW1pdHRlck9wdGlvbnMgPSB7XG4gIHF1YWxpZmllckNvbXBhcmU6IGZ1bmN0aW9uIHF1YWxpZmllckNvbXBhcmUoc2VsZWN0b3IxLCBzZWxlY3RvcjIpIHtcbiAgICBpZiAoc2VsZWN0b3IxID09IG51bGwgfHwgc2VsZWN0b3IyID09IG51bGwpIHtcbiAgICAgIHJldHVybiBzZWxlY3RvcjEgPT0gbnVsbCAmJiBzZWxlY3RvcjIgPT0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHNlbGVjdG9yMS5zYW1lVGV4dChzZWxlY3RvcjIpO1xuICAgIH1cbiAgfSxcbiAgZXZlbnRNYXRjaGVzOiBmdW5jdGlvbiBldmVudE1hdGNoZXMoY3ksIGxpc3RlbmVyLCBldmVudE9iaikge1xuICAgIHZhciBzZWxlY3RvciA9IGxpc3RlbmVyLnF1YWxpZmllcjtcbiAgICBpZiAoc2VsZWN0b3IgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGN5ICE9PSBldmVudE9iai50YXJnZXQgJiYgZWxlbWVudChldmVudE9iai50YXJnZXQpICYmIHNlbGVjdG9yLm1hdGNoZXMoZXZlbnRPYmoudGFyZ2V0KTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIGFkZEV2ZW50RmllbGRzOiBmdW5jdGlvbiBhZGRFdmVudEZpZWxkcyhjeSwgZXZ0KSB7XG4gICAgZXZ0LmN5ID0gY3k7XG4gICAgZXZ0LnRhcmdldCA9IGN5O1xuICB9LFxuICBjYWxsYmFja0NvbnRleHQ6IGZ1bmN0aW9uIGNhbGxiYWNrQ29udGV4dChjeSwgbGlzdGVuZXIsIGV2ZW50T2JqKSB7XG4gICAgcmV0dXJuIGxpc3RlbmVyLnF1YWxpZmllciAhPSBudWxsID8gZXZlbnRPYmoudGFyZ2V0IDogY3k7XG4gIH1cbn07XG52YXIgYXJnU2VsZWN0b3IgPSBmdW5jdGlvbiBhcmdTZWxlY3RvcihhcmcpIHtcbiAgaWYgKHN0cmluZyhhcmcpKSB7XG4gICAgcmV0dXJuIG5ldyBTZWxlY3RvcihhcmcpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBhcmc7XG4gIH1cbn07XG52YXIgZWxlc2ZuID0ge1xuICBjcmVhdGVFbWl0dGVyOiBmdW5jdGlvbiBjcmVhdGVFbWl0dGVyKCkge1xuICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG4gICAgaWYgKCFfcC5lbWl0dGVyKSB7XG4gICAgICBfcC5lbWl0dGVyID0gbmV3IEVtaXR0ZXIoZW1pdHRlck9wdGlvbnMsIHRoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgZW1pdHRlcjogZnVuY3Rpb24gZW1pdHRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5lbWl0dGVyO1xuICB9LFxuICBvbjogZnVuY3Rpb24gb24oZXZlbnRzLCBzZWxlY3RvciwgY2FsbGJhY2spIHtcbiAgICB0aGlzLmVtaXR0ZXIoKS5vbihldmVudHMsIGFyZ1NlbGVjdG9yKHNlbGVjdG9yKSwgY2FsbGJhY2spO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICByZW1vdmVMaXN0ZW5lcjogZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXIoZXZlbnRzLCBzZWxlY3RvciwgY2FsbGJhY2spIHtcbiAgICB0aGlzLmVtaXR0ZXIoKS5yZW1vdmVMaXN0ZW5lcihldmVudHMsIGFyZ1NlbGVjdG9yKHNlbGVjdG9yKSwgY2FsbGJhY2spO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICByZW1vdmVBbGxMaXN0ZW5lcnM6IGZ1bmN0aW9uIHJlbW92ZUFsbExpc3RlbmVycygpIHtcbiAgICB0aGlzLmVtaXR0ZXIoKS5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgb25lOiBmdW5jdGlvbiBvbmUoZXZlbnRzLCBzZWxlY3RvciwgY2FsbGJhY2spIHtcbiAgICB0aGlzLmVtaXR0ZXIoKS5vbmUoZXZlbnRzLCBhcmdTZWxlY3RvcihzZWxlY3RvciksIGNhbGxiYWNrKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgb25jZTogZnVuY3Rpb24gb25jZShldmVudHMsIHNlbGVjdG9yLCBjYWxsYmFjaykge1xuICAgIHRoaXMuZW1pdHRlcigpLm9uZShldmVudHMsIGFyZ1NlbGVjdG9yKHNlbGVjdG9yKSwgY2FsbGJhY2spO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBlbWl0OiBmdW5jdGlvbiBlbWl0KGV2ZW50cywgZXh0cmFQYXJhbXMpIHtcbiAgICB0aGlzLmVtaXR0ZXIoKS5lbWl0KGV2ZW50cywgZXh0cmFQYXJhbXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBlbWl0QW5kTm90aWZ5OiBmdW5jdGlvbiBlbWl0QW5kTm90aWZ5KGV2ZW50LCBlbGVzKSB7XG4gICAgdGhpcy5lbWl0KGV2ZW50KTtcbiAgICB0aGlzLm5vdGlmeShldmVudCwgZWxlcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn07XG5kZWZpbmUuZXZlbnRBbGlhc2VzT24oZWxlc2ZuKTtcblxudmFyIGNvcmVmbiQ3ID0ge1xuICBwbmc6IGZ1bmN0aW9uIHBuZyhvcHRpb25zKSB7XG4gICAgdmFyIHJlbmRlcmVyID0gdGhpcy5fcHJpdmF0ZS5yZW5kZXJlcjtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICByZXR1cm4gcmVuZGVyZXIucG5nKG9wdGlvbnMpO1xuICB9LFxuICBqcGc6IGZ1bmN0aW9uIGpwZyhvcHRpb25zKSB7XG4gICAgdmFyIHJlbmRlcmVyID0gdGhpcy5fcHJpdmF0ZS5yZW5kZXJlcjtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBvcHRpb25zLmJnID0gb3B0aW9ucy5iZyB8fCAnI2ZmZic7XG4gICAgcmV0dXJuIHJlbmRlcmVyLmpwZyhvcHRpb25zKTtcbiAgfVxufTtcbmNvcmVmbiQ3LmpwZWcgPSBjb3JlZm4kNy5qcGc7XG5cbnZhciBjb3JlZm4kNiA9IHtcbiAgbGF5b3V0OiBmdW5jdGlvbiBsYXlvdXQob3B0aW9ucykge1xuICAgIHZhciBjeSA9IHRoaXM7XG4gICAgaWYgKG9wdGlvbnMgPT0gbnVsbCkge1xuICAgICAgZXJyb3IoJ0xheW91dCBvcHRpb25zIG11c3QgYmUgc3BlY2lmaWVkIHRvIG1ha2UgYSBsYXlvdXQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMubmFtZSA9PSBudWxsKSB7XG4gICAgICBlcnJvcignQSBgbmFtZWAgbXVzdCBiZSBzcGVjaWZpZWQgdG8gbWFrZSBhIGxheW91dCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgbmFtZSA9IG9wdGlvbnMubmFtZTtcbiAgICB2YXIgTGF5b3V0ID0gY3kuZXh0ZW5zaW9uKCdsYXlvdXQnLCBuYW1lKTtcbiAgICBpZiAoTGF5b3V0ID09IG51bGwpIHtcbiAgICAgIGVycm9yKCdObyBzdWNoIGxheW91dCBgJyArIG5hbWUgKyAnYCBmb3VuZC4gIERpZCB5b3UgZm9yZ2V0IHRvIGltcG9ydCBpdCBhbmQgYGN5dG9zY2FwZS51c2UoKWAgaXQ/Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBlbGVzO1xuICAgIGlmIChzdHJpbmcob3B0aW9ucy5lbGVzKSkge1xuICAgICAgZWxlcyA9IGN5LiQob3B0aW9ucy5lbGVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlcyA9IG9wdGlvbnMuZWxlcyAhPSBudWxsID8gb3B0aW9ucy5lbGVzIDogY3kuJCgpO1xuICAgIH1cbiAgICB2YXIgbGF5b3V0ID0gbmV3IExheW91dChleHRlbmQoe30sIG9wdGlvbnMsIHtcbiAgICAgIGN5OiBjeSxcbiAgICAgIGVsZXM6IGVsZXNcbiAgICB9KSk7XG4gICAgcmV0dXJuIGxheW91dDtcbiAgfVxufTtcbmNvcmVmbiQ2LmNyZWF0ZUxheW91dCA9IGNvcmVmbiQ2Lm1ha2VMYXlvdXQgPSBjb3JlZm4kNi5sYXlvdXQ7XG5cbnZhciBjb3JlZm4kNSA9IHtcbiAgbm90aWZ5OiBmdW5jdGlvbiBub3RpZnkoZXZlbnROYW1lLCBldmVudEVsZXMpIHtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuICAgIGlmICh0aGlzLmJhdGNoaW5nKCkpIHtcbiAgICAgIF9wLmJhdGNoTm90aWZpY2F0aW9ucyA9IF9wLmJhdGNoTm90aWZpY2F0aW9ucyB8fCB7fTtcbiAgICAgIHZhciBlbGVzID0gX3AuYmF0Y2hOb3RpZmljYXRpb25zW2V2ZW50TmFtZV0gPSBfcC5iYXRjaE5vdGlmaWNhdGlvbnNbZXZlbnROYW1lXSB8fCB0aGlzLmNvbGxlY3Rpb24oKTtcbiAgICAgIGlmIChldmVudEVsZXMgIT0gbnVsbCkge1xuICAgICAgICBlbGVzLm1lcmdlKGV2ZW50RWxlcyk7XG4gICAgICB9XG4gICAgICByZXR1cm47IC8vIG5vdGlmaWNhdGlvbnMgYXJlIGRpc2FibGVkIGR1cmluZyBiYXRjaGluZ1xuICAgIH1cbiAgICBpZiAoIV9wLm5vdGlmaWNhdGlvbnNFbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBleGl0IG9uIGRpc2FibGVkXG5cbiAgICB2YXIgcmVuZGVyZXIgPSB0aGlzLnJlbmRlcmVyKCk7XG5cbiAgICAvLyBleGl0IGlmIGRlc3Ryb3koKSBjYWxsZWQgb24gY29yZSBvciByZW5kZXJlciBpbiBiZXR3ZWVuIGZyYW1lcyAjMTQ5OSAjMTUyOFxuICAgIGlmICh0aGlzLmRlc3Ryb3llZCgpIHx8ICFyZW5kZXJlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZW5kZXJlci5ub3RpZnkoZXZlbnROYW1lLCBldmVudEVsZXMpO1xuICB9LFxuICBub3RpZmljYXRpb25zOiBmdW5jdGlvbiBub3RpZmljYXRpb25zKGJvb2wpIHtcbiAgICB2YXIgcCA9IHRoaXMuX3ByaXZhdGU7XG4gICAgaWYgKGJvb2wgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHAubm90aWZpY2F0aW9uc0VuYWJsZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHAubm90aWZpY2F0aW9uc0VuYWJsZWQgPSBib29sID8gdHJ1ZSA6IGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgbm9Ob3RpZmljYXRpb25zOiBmdW5jdGlvbiBub05vdGlmaWNhdGlvbnMoY2FsbGJhY2spIHtcbiAgICB0aGlzLm5vdGlmaWNhdGlvbnMoZmFsc2UpO1xuICAgIGNhbGxiYWNrKCk7XG4gICAgdGhpcy5ub3RpZmljYXRpb25zKHRydWUpO1xuICB9LFxuICBiYXRjaGluZzogZnVuY3Rpb24gYmF0Y2hpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuYmF0Y2hDb3VudCA+IDA7XG4gIH0sXG4gIHN0YXJ0QmF0Y2g6IGZ1bmN0aW9uIHN0YXJ0QmF0Y2goKSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICBpZiAoX3AuYmF0Y2hDb3VudCA9PSBudWxsKSB7XG4gICAgICBfcC5iYXRjaENvdW50ID0gMDtcbiAgICB9XG4gICAgaWYgKF9wLmJhdGNoQ291bnQgPT09IDApIHtcbiAgICAgIF9wLmJhdGNoU3R5bGVFbGVzID0gdGhpcy5jb2xsZWN0aW9uKCk7XG4gICAgICBfcC5iYXRjaE5vdGlmaWNhdGlvbnMgPSB7fTtcbiAgICB9XG4gICAgX3AuYmF0Y2hDb3VudCsrO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBlbmRCYXRjaDogZnVuY3Rpb24gZW5kQmF0Y2goKSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICBpZiAoX3AuYmF0Y2hDb3VudCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIF9wLmJhdGNoQ291bnQtLTtcbiAgICBpZiAoX3AuYmF0Y2hDb3VudCA9PT0gMCkge1xuICAgICAgLy8gdXBkYXRlIHN0eWxlIGZvciBkaXJ0eSBlbGVzXG4gICAgICBfcC5iYXRjaFN0eWxlRWxlcy51cGRhdGVTdHlsZSgpO1xuICAgICAgdmFyIHJlbmRlcmVyID0gdGhpcy5yZW5kZXJlcigpO1xuXG4gICAgICAvLyBub3RpZnkgdGhlIHJlbmRlcmVyIG9mIHF1ZXVlZCBlbGVzIGFuZCBldmVudCB0eXBlc1xuICAgICAgT2JqZWN0LmtleXMoX3AuYmF0Y2hOb3RpZmljYXRpb25zKS5mb3JFYWNoKGZ1bmN0aW9uIChldmVudE5hbWUpIHtcbiAgICAgICAgdmFyIGVsZXMgPSBfcC5iYXRjaE5vdGlmaWNhdGlvbnNbZXZlbnROYW1lXTtcbiAgICAgICAgaWYgKGVsZXMuZW1wdHkoKSkge1xuICAgICAgICAgIHJlbmRlcmVyLm5vdGlmeShldmVudE5hbWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlbmRlcmVyLm5vdGlmeShldmVudE5hbWUsIGVsZXMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIGJhdGNoOiBmdW5jdGlvbiBiYXRjaChjYWxsYmFjaykge1xuICAgIHRoaXMuc3RhcnRCYXRjaCgpO1xuICAgIGNhbGxiYWNrKCk7XG4gICAgdGhpcy5lbmRCYXRjaCgpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICAvLyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgYmF0Y2hEYXRhOiBmdW5jdGlvbiBiYXRjaERhdGEobWFwKSB7XG4gICAgdmFyIGN5ID0gdGhpcztcbiAgICByZXR1cm4gdGhpcy5iYXRjaChmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgaWRzID0gT2JqZWN0LmtleXMobWFwKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBpZCA9IGlkc1tpXTtcbiAgICAgICAgdmFyIGRhdGEgPSBtYXBbaWRdO1xuICAgICAgICB2YXIgZWxlID0gY3kuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgICAgICBlbGUuZGF0YShkYXRhKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufTtcblxudmFyIHJlbmRlcmVyRGVmYXVsdHMgPSBkZWZhdWx0cyRnKHtcbiAgaGlkZUVkZ2VzT25WaWV3cG9ydDogZmFsc2UsXG4gIHRleHR1cmVPblZpZXdwb3J0OiBmYWxzZSxcbiAgbW90aW9uQmx1cjogZmFsc2UsXG4gIG1vdGlvbkJsdXJPcGFjaXR5OiAwLjA1LFxuICBwaXhlbFJhdGlvOiB1bmRlZmluZWQsXG4gIGRlc2t0b3BUYXBUaHJlc2hvbGQ6IDQsXG4gIHRvdWNoVGFwVGhyZXNob2xkOiA4LFxuICB3aGVlbFNlbnNpdGl2aXR5OiAxLFxuICBkZWJ1ZzogZmFsc2UsXG4gIHNob3dGcHM6IGZhbHNlLFxuICAvLyB3ZWJnbCBvcHRpb25zXG4gIHdlYmdsOiBmYWxzZSxcbiAgd2ViZ2xEZWJ1ZzogZmFsc2UsXG4gIHdlYmdsRGVidWdTaG93QXRsYXNlczogZmFsc2UsXG4gIC8vIGRlZmF1bHRzIGdvb2QgZm9yIG1vYmlsZVxuICB3ZWJnbFRleFNpemU6IDIwNDgsXG4gIHdlYmdsVGV4Um93czogMzYsXG4gIHdlYmdsVGV4Um93c05vZGVzOiAxOCxcbiAgd2ViZ2xCYXRjaFNpemU6IDIwNDgsXG4gIHdlYmdsVGV4UGVyQmF0Y2g6IDE0LFxuICB3ZWJnbEJnQ29sb3I6IFsyNTUsIDI1NSwgMjU1XVxufSk7XG52YXIgY29yZWZuJDQgPSB7XG4gIHJlbmRlclRvOiBmdW5jdGlvbiByZW5kZXJUbyhjb250ZXh0LCB6b29tLCBwYW4sIHB4UmF0aW8pIHtcbiAgICB2YXIgciA9IHRoaXMuX3ByaXZhdGUucmVuZGVyZXI7XG4gICAgci5yZW5kZXJUbyhjb250ZXh0LCB6b29tLCBwYW4sIHB4UmF0aW8pO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICByZW5kZXJlcjogZnVuY3Rpb24gcmVuZGVyZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUucmVuZGVyZXI7XG4gIH0sXG4gIGZvcmNlUmVuZGVyOiBmdW5jdGlvbiBmb3JjZVJlbmRlcigpIHtcbiAgICB0aGlzLm5vdGlmeSgnZHJhdycpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICByZXNpemU6IGZ1bmN0aW9uIHJlc2l6ZSgpIHtcbiAgICB0aGlzLmludmFsaWRhdGVTaXplKCk7XG4gICAgdGhpcy5lbWl0QW5kTm90aWZ5KCdyZXNpemUnKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgaW5pdFJlbmRlcmVyOiBmdW5jdGlvbiBpbml0UmVuZGVyZXIob3B0aW9ucykge1xuICAgIHZhciBjeSA9IHRoaXM7XG4gICAgdmFyIFJlbmRlcmVyUHJvdG8gPSBjeS5leHRlbnNpb24oJ3JlbmRlcmVyJywgb3B0aW9ucy5uYW1lKTtcbiAgICBpZiAoUmVuZGVyZXJQcm90byA9PSBudWxsKSB7XG4gICAgICBlcnJvcihcIkNhbiBub3QgaW5pdGlhbGlzZTogTm8gc3VjaCByZW5kZXJlciBgXCIuY29uY2F0KG9wdGlvbnMubmFtZSwgXCJgIGZvdW5kLiBEaWQgeW91IGZvcmdldCB0byBpbXBvcnQgaXQgYW5kIGBjeXRvc2NhcGUudXNlKClgIGl0P1wiKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChvcHRpb25zLndoZWVsU2Vuc2l0aXZpdHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgd2FybihcIllvdSBoYXZlIHNldCBhIGN1c3RvbSB3aGVlbCBzZW5zaXRpdml0eS4gIFRoaXMgd2lsbCBtYWtlIHlvdXIgYXBwIHpvb20gdW5uYXR1cmFsbHkgd2hlbiB1c2luZyBtYWluc3RyZWFtIG1pY2UuICBZb3Ugc2hvdWxkIGNoYW5nZSB0aGlzIHZhbHVlIGZyb20gdGhlIGRlZmF1bHQgb25seSBpZiB5b3UgY2FuIGd1YXJhbnRlZSB0aGF0IGFsbCB5b3VyIHVzZXJzIHdpbGwgdXNlIHRoZSBzYW1lIGhhcmR3YXJlIGFuZCBPUyBjb25maWd1cmF0aW9uIGFzIHlvdXIgY3VycmVudCBtYWNoaW5lLlwiKTtcbiAgICB9XG4gICAgdmFyIHJPcHRzID0gcmVuZGVyZXJEZWZhdWx0cyhvcHRpb25zKTtcbiAgICByT3B0cy5jeSA9IGN5O1xuICAgIGN5Ll9wcml2YXRlLnJlbmRlcmVyID0gbmV3IFJlbmRlcmVyUHJvdG8ock9wdHMpO1xuICAgIHRoaXMubm90aWZ5KCdpbml0Jyk7XG4gIH0sXG4gIGRlc3Ryb3lSZW5kZXJlcjogZnVuY3Rpb24gZGVzdHJveVJlbmRlcmVyKCkge1xuICAgIHZhciBjeSA9IHRoaXM7XG4gICAgY3kubm90aWZ5KCdkZXN0cm95Jyk7IC8vIGRlc3Ryb3kgdGhlIHJlbmRlcmVyXG5cbiAgICB2YXIgZG9tRWxlID0gY3kuY29udGFpbmVyKCk7XG4gICAgaWYgKGRvbUVsZSkge1xuICAgICAgZG9tRWxlLl9jeXJlZyA9IG51bGw7XG4gICAgICB3aGlsZSAoZG9tRWxlLmNoaWxkTm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBkb21FbGUucmVtb3ZlQ2hpbGQoZG9tRWxlLmNoaWxkTm9kZXNbMF0pO1xuICAgICAgfVxuICAgIH1cbiAgICBjeS5fcHJpdmF0ZS5yZW5kZXJlciA9IG51bGw7IC8vIHRvIGJlIGV4dHJhIHNhZmUsIHJlbW92ZSB0aGUgcmVmXG4gICAgY3kubXV0YWJsZUVsZW1lbnRzKCkuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gICAgICBfcC5yc2NyYXRjaCA9IHt9O1xuICAgICAgX3AucnN0eWxlID0ge307XG4gICAgICBfcC5hbmltYXRpb24uY3VycmVudCA9IFtdO1xuICAgICAgX3AuYW5pbWF0aW9uLnF1ZXVlID0gW107XG4gICAgfSk7XG4gIH0sXG4gIG9uUmVuZGVyOiBmdW5jdGlvbiBvblJlbmRlcihmbikge1xuICAgIHJldHVybiB0aGlzLm9uKCdyZW5kZXInLCBmbik7XG4gIH0sXG4gIG9mZlJlbmRlcjogZnVuY3Rpb24gb2ZmUmVuZGVyKGZuKSB7XG4gICAgcmV0dXJuIHRoaXMub2ZmKCdyZW5kZXInLCBmbik7XG4gIH1cbn07XG5jb3JlZm4kNC5pbnZhbGlkYXRlRGltZW5zaW9ucyA9IGNvcmVmbiQ0LnJlc2l6ZTtcblxudmFyIGNvcmVmbiQzID0ge1xuICAvLyBnZXQgYSBjb2xsZWN0aW9uXG4gIC8vIC0gZW1wdHkgY29sbGVjdGlvbiBvbiBubyBhcmdzXG4gIC8vIC0gY29sbGVjdGlvbiBvZiBlbGVtZW50cyBpbiB0aGUgZ3JhcGggb24gc2VsZWN0b3IgYXJnXG4gIC8vIC0gZ3VhcmFudGVlIGEgcmV0dXJuZWQgY29sbGVjdGlvbiB3aGVuIGVsZW1lbnRzIG9yIGNvbGxlY3Rpb24gc3BlY2lmaWVkXG4gIGNvbGxlY3Rpb246IGZ1bmN0aW9uIGNvbGxlY3Rpb24oZWxlcywgb3B0cykge1xuICAgIGlmIChzdHJpbmcoZWxlcykpIHtcbiAgICAgIHJldHVybiB0aGlzLiQoZWxlcyk7XG4gICAgfSBlbHNlIGlmIChlbGVtZW50T3JDb2xsZWN0aW9uKGVsZXMpKSB7XG4gICAgICByZXR1cm4gZWxlcy5jb2xsZWN0aW9uKCk7XG4gICAgfSBlbHNlIGlmIChhcnJheShlbGVzKSkge1xuICAgICAgaWYgKCFvcHRzKSB7XG4gICAgICAgIG9wdHMgPSB7fTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgQ29sbGVjdGlvbih0aGlzLCBlbGVzLCBvcHRzLnVuaXF1ZSwgb3B0cy5yZW1vdmVkKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBDb2xsZWN0aW9uKHRoaXMpO1xuICB9LFxuICBub2RlczogZnVuY3Rpb24gbm9kZXMoc2VsZWN0b3IpIHtcbiAgICB2YXIgbm9kZXMgPSB0aGlzLiQoZnVuY3Rpb24gKGVsZSkge1xuICAgICAgcmV0dXJuIGVsZS5pc05vZGUoKTtcbiAgICB9KTtcbiAgICBpZiAoc2VsZWN0b3IpIHtcbiAgICAgIHJldHVybiBub2Rlcy5maWx0ZXIoc2VsZWN0b3IpO1xuICAgIH1cbiAgICByZXR1cm4gbm9kZXM7XG4gIH0sXG4gIGVkZ2VzOiBmdW5jdGlvbiBlZGdlcyhzZWxlY3Rvcikge1xuICAgIHZhciBlZGdlcyA9IHRoaXMuJChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICByZXR1cm4gZWxlLmlzRWRnZSgpO1xuICAgIH0pO1xuICAgIGlmIChzZWxlY3Rvcikge1xuICAgICAgcmV0dXJuIGVkZ2VzLmZpbHRlcihzZWxlY3Rvcik7XG4gICAgfVxuICAgIHJldHVybiBlZGdlcztcbiAgfSxcbiAgLy8gc2VhcmNoIHRoZSBncmFwaCBsaWtlIGpRdWVyeVxuICAkOiBmdW5jdGlvbiAkKHNlbGVjdG9yKSB7XG4gICAgdmFyIGVsZXMgPSB0aGlzLl9wcml2YXRlLmVsZW1lbnRzO1xuICAgIGlmIChzZWxlY3Rvcikge1xuICAgICAgcmV0dXJuIGVsZXMuZmlsdGVyKHNlbGVjdG9yKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGVsZXMuc3Bhd25TZWxmKCk7XG4gICAgfVxuICB9LFxuICBtdXRhYmxlRWxlbWVudHM6IGZ1bmN0aW9uIG11dGFibGVFbGVtZW50cygpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5lbGVtZW50cztcbiAgfVxufTtcblxuLy8gYWxpYXNlc1xuY29yZWZuJDMuZWxlbWVudHMgPSBjb3JlZm4kMy5maWx0ZXIgPSBjb3JlZm4kMy4kO1xuXG52YXIgc3R5Zm4kOCA9IHt9O1xuXG4vLyBrZXlzIGZvciBzdHlsZSBibG9ja3MsIGUuZy4gdHRmZnR0XG52YXIgVFJVRSA9ICd0JztcbnZhciBGQUxTRSA9ICdmJztcblxuLy8gKHBvdGVudGlhbGx5IGV4cGVuc2l2ZSBjYWxjdWxhdGlvbilcbi8vIGFwcGx5IHRoZSBzdHlsZSB0byB0aGUgZWxlbWVudCBiYXNlZCBvblxuLy8gLSBpdHMgYnlwYXNzXG4vLyAtIHdoYXQgc2VsZWN0b3JzIG1hdGNoIGl0XG5zdHlmbiQ4LmFwcGx5ID0gZnVuY3Rpb24gKGVsZXMpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgX3AgPSBzZWxmLl9wcml2YXRlO1xuICB2YXIgY3kgPSBfcC5jeTtcbiAgdmFyIHVwZGF0ZWRFbGVzID0gY3kuY29sbGVjdGlvbigpO1xuICBmb3IgKHZhciBpZSA9IDA7IGllIDwgZWxlcy5sZW5ndGg7IGllKyspIHtcbiAgICB2YXIgZWxlID0gZWxlc1tpZV07XG4gICAgdmFyIGN4dE1ldGEgPSBzZWxmLmdldENvbnRleHRNZXRhKGVsZSk7XG4gICAgaWYgKGN4dE1ldGEuZW1wdHkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB2YXIgY3h0U3R5bGUgPSBzZWxmLmdldENvbnRleHRTdHlsZShjeHRNZXRhKTtcbiAgICB2YXIgYXBwID0gc2VsZi5hcHBseUNvbnRleHRTdHlsZShjeHRNZXRhLCBjeHRTdHlsZSwgZWxlKTtcbiAgICBpZiAoZWxlLl9wcml2YXRlLmFwcGxpZWRJbml0U3R5bGUpIHtcbiAgICAgIHNlbGYudXBkYXRlVHJhbnNpdGlvbnMoZWxlLCBhcHAuZGlmZlByb3BzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlLl9wcml2YXRlLmFwcGxpZWRJbml0U3R5bGUgPSB0cnVlO1xuICAgIH1cbiAgICB2YXIgaGludHNEaWZmID0gc2VsZi51cGRhdGVTdHlsZUhpbnRzKGVsZSk7XG4gICAgaWYgKGhpbnRzRGlmZikge1xuICAgICAgdXBkYXRlZEVsZXMucHVzaChlbGUpO1xuICAgIH1cbiAgfSAvLyBmb3IgZWxlbWVudHNcblxuICByZXR1cm4gdXBkYXRlZEVsZXM7XG59O1xuc3R5Zm4kOC5nZXRQcm9wZXJ0aWVzRGlmZiA9IGZ1bmN0aW9uIChvbGRDeHRLZXksIG5ld0N4dEtleSkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBjYWNoZSA9IHNlbGYuX3ByaXZhdGUucHJvcERpZmZzID0gc2VsZi5fcHJpdmF0ZS5wcm9wRGlmZnMgfHwge307XG4gIHZhciBkdWFsQ3h0S2V5ID0gb2xkQ3h0S2V5ICsgJy0nICsgbmV3Q3h0S2V5O1xuICB2YXIgY2FjaGVkVmFsID0gY2FjaGVbZHVhbEN4dEtleV07XG4gIGlmIChjYWNoZWRWYWwpIHtcbiAgICByZXR1cm4gY2FjaGVkVmFsO1xuICB9XG4gIHZhciBkaWZmUHJvcHMgPSBbXTtcbiAgdmFyIGFkZGVkUHJvcCA9IHt9O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgY3h0ID0gc2VsZltpXTtcbiAgICB2YXIgb2xkSGFzQ3h0ID0gb2xkQ3h0S2V5W2ldID09PSBUUlVFO1xuICAgIHZhciBuZXdIYXNDeHQgPSBuZXdDeHRLZXlbaV0gPT09IFRSVUU7XG4gICAgdmFyIGN4dEhhc0RpZmZlZCA9IG9sZEhhc0N4dCAhPT0gbmV3SGFzQ3h0O1xuICAgIHZhciBjeHRIYXNNYXBwZWRQcm9wcyA9IGN4dC5tYXBwZWRQcm9wZXJ0aWVzLmxlbmd0aCA+IDA7XG4gICAgaWYgKGN4dEhhc0RpZmZlZCB8fCBuZXdIYXNDeHQgJiYgY3h0SGFzTWFwcGVkUHJvcHMpIHtcbiAgICAgIHZhciBwcm9wcyA9IHZvaWQgMDtcbiAgICAgIGlmIChjeHRIYXNEaWZmZWQgJiYgY3h0SGFzTWFwcGVkUHJvcHMpIHtcbiAgICAgICAgcHJvcHMgPSBjeHQucHJvcGVydGllczsgLy8gc3VmZmljZXMgYi9jIG1hcHBlZFByb3BlcnRpZXMgaXMgYSBzdWJzZXQgb2YgcHJvcGVydGllc1xuICAgICAgfSBlbHNlIGlmIChjeHRIYXNEaWZmZWQpIHtcbiAgICAgICAgcHJvcHMgPSBjeHQucHJvcGVydGllczsgLy8gbmVlZCB0byBjaGVjayB0aGVtIGFsbFxuICAgICAgfSBlbHNlIGlmIChjeHRIYXNNYXBwZWRQcm9wcykge1xuICAgICAgICBwcm9wcyA9IGN4dC5tYXBwZWRQcm9wZXJ0aWVzOyAvLyBvbmx5IG5lZWQgdG8gY2hlY2sgbWFwcGVkXG4gICAgICB9XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHByb3BzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBwcm9wID0gcHJvcHNbal07XG4gICAgICAgIHZhciBuYW1lID0gcHJvcC5uYW1lO1xuXG4gICAgICAgIC8vIGlmIGEgbGF0ZXIgY29udGV4dCBvdmVycmlkZXMgdGhpcyBwcm9wZXJ0eSwgdGhlbiB0aGUgZmFjdCB0aGF0IHRoaXMgY29udGV4dCBoYXMgc3dpdGNoZWQvZGlmZmVkIGRvZXNuJ3QgbWF0dGVyXG4gICAgICAgIC8vIChzZW1pIGV4cGVuc2l2ZSBjaGVjayBzaW5jZSBpdCBtYWtlcyB0aGlzIGZ1bmN0aW9uIE8obl4yKSBvbiBjb250ZXh0IGxlbmd0aCwgYnV0IHdvcnRoIGl0IHNpbmNlIG92ZXJhbGwgcmVzdWx0XG4gICAgICAgIC8vIGlzIGNhY2hlZClcbiAgICAgICAgdmFyIGxhdGVyQ3h0T3ZlcnJpZGVzID0gZmFsc2U7XG4gICAgICAgIGZvciAodmFyIGsgPSBpICsgMTsgayA8IHNlbGYubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICB2YXIgbGF0ZXJDeHQgPSBzZWxmW2tdO1xuICAgICAgICAgIHZhciBoYXNMYXRlckN4dCA9IG5ld0N4dEtleVtrXSA9PT0gVFJVRTtcbiAgICAgICAgICBpZiAoIWhhc0xhdGVyQ3h0KSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9IC8vIGNhbid0IG92ZXJyaWRlIHVubGVzcyB0aGUgY29udGV4dCBpcyBhY3RpdmVcblxuICAgICAgICAgIGxhdGVyQ3h0T3ZlcnJpZGVzID0gbGF0ZXJDeHQucHJvcGVydGllc1twcm9wLm5hbWVdICE9IG51bGw7XG4gICAgICAgICAgaWYgKGxhdGVyQ3h0T3ZlcnJpZGVzKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9IC8vIGV4aXQgZWFybHkgYXMgbG9uZyBhcyBvbmUgbGF0ZXIgY29udGV4dCBvdmVycmlkZXNcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWFkZGVkUHJvcFtuYW1lXSAmJiAhbGF0ZXJDeHRPdmVycmlkZXMpIHtcbiAgICAgICAgICBhZGRlZFByb3BbbmFtZV0gPSB0cnVlO1xuICAgICAgICAgIGRpZmZQcm9wcy5wdXNoKG5hbWUpO1xuICAgICAgICB9XG4gICAgICB9IC8vIGZvciBwcm9wc1xuICAgIH0gLy8gaWZcbiAgfSAvLyBmb3IgY29udGV4dHNcblxuICBjYWNoZVtkdWFsQ3h0S2V5XSA9IGRpZmZQcm9wcztcbiAgcmV0dXJuIGRpZmZQcm9wcztcbn07XG5zdHlmbiQ4LmdldENvbnRleHRNZXRhID0gZnVuY3Rpb24gKGVsZSkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBjeHRLZXkgPSAnJztcbiAgdmFyIGRpZmZQcm9wcztcbiAgdmFyIHByZXZLZXkgPSBlbGUuX3ByaXZhdGUuc3R5bGVDeHRLZXkgfHwgJyc7XG5cbiAgLy8gZ2V0IHRoZSBjeHQga2V5XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjb250ZXh0ID0gc2VsZltpXTtcbiAgICB2YXIgY29udGV4dFNlbGVjdG9yTWF0Y2hlcyA9IGNvbnRleHQuc2VsZWN0b3IgJiYgY29udGV4dC5zZWxlY3Rvci5tYXRjaGVzKGVsZSk7IC8vIE5COiBjb250ZXh0LnNlbGVjdG9yIG1heSBiZSBudWxsIGZvciAnY29yZSdcblxuICAgIGlmIChjb250ZXh0U2VsZWN0b3JNYXRjaGVzKSB7XG4gICAgICBjeHRLZXkgKz0gVFJVRTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3h0S2V5ICs9IEZBTFNFO1xuICAgIH1cbiAgfSAvLyBmb3IgY29udGV4dFxuXG4gIGRpZmZQcm9wcyA9IHNlbGYuZ2V0UHJvcGVydGllc0RpZmYocHJldktleSwgY3h0S2V5KTtcbiAgZWxlLl9wcml2YXRlLnN0eWxlQ3h0S2V5ID0gY3h0S2V5O1xuICByZXR1cm4ge1xuICAgIGtleTogY3h0S2V5LFxuICAgIGRpZmZQcm9wTmFtZXM6IGRpZmZQcm9wcyxcbiAgICBlbXB0eTogZGlmZlByb3BzLmxlbmd0aCA9PT0gMFxuICB9O1xufTtcblxuLy8gZ2V0cyBhIGNvbXB1dGVkIGVsZSBzdHlsZSBvYmplY3QgYmFzZWQgb24gbWF0Y2hlZCBjb250ZXh0c1xuc3R5Zm4kOC5nZXRDb250ZXh0U3R5bGUgPSBmdW5jdGlvbiAoY3h0TWV0YSkge1xuICB2YXIgY3h0S2V5ID0gY3h0TWV0YS5rZXk7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGN4dFN0eWxlcyA9IHRoaXMuX3ByaXZhdGUuY29udGV4dFN0eWxlcyA9IHRoaXMuX3ByaXZhdGUuY29udGV4dFN0eWxlcyB8fCB7fTtcblxuICAvLyBpZiBhbHJlYWR5IGNvbXB1dGVkIHN0eWxlLCByZXR1cm5lZCBjYWNoZWQgY29weVxuICBpZiAoY3h0U3R5bGVzW2N4dEtleV0pIHtcbiAgICByZXR1cm4gY3h0U3R5bGVzW2N4dEtleV07XG4gIH1cbiAgdmFyIHN0eWxlID0ge1xuICAgIF9wcml2YXRlOiB7XG4gICAgICBrZXk6IGN4dEtleVxuICAgIH1cbiAgfTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGN4dCA9IHNlbGZbaV07XG4gICAgdmFyIGhhc0N4dCA9IGN4dEtleVtpXSA9PT0gVFJVRTtcbiAgICBpZiAoIWhhc0N4dCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgY3h0LnByb3BlcnRpZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBwcm9wID0gY3h0LnByb3BlcnRpZXNbal07XG4gICAgICBzdHlsZVtwcm9wLm5hbWVdID0gcHJvcDtcbiAgICB9XG4gIH1cbiAgY3h0U3R5bGVzW2N4dEtleV0gPSBzdHlsZTtcbiAgcmV0dXJuIHN0eWxlO1xufTtcbnN0eWZuJDguYXBwbHlDb250ZXh0U3R5bGUgPSBmdW5jdGlvbiAoY3h0TWV0YSwgY3h0U3R5bGUsIGVsZSkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBkaWZmUHJvcHMgPSBjeHRNZXRhLmRpZmZQcm9wTmFtZXM7XG4gIHZhciByZXREaWZmUHJvcHMgPSB7fTtcbiAgdmFyIHR5cGVzID0gc2VsZi50eXBlcztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaWZmUHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZGlmZlByb3BOYW1lID0gZGlmZlByb3BzW2ldO1xuICAgIHZhciBjeHRQcm9wID0gY3h0U3R5bGVbZGlmZlByb3BOYW1lXTtcbiAgICB2YXIgZWxlUHJvcCA9IGVsZS5wc3R5bGUoZGlmZlByb3BOYW1lKTtcbiAgICBpZiAoIWN4dFByb3ApIHtcbiAgICAgIC8vIG5vIGNvbnRleHQgcHJvcCBtZWFucyBkZWxldGVcbiAgICAgIGlmICghZWxlUHJvcCkge1xuICAgICAgICBjb250aW51ZTsgLy8gbm8gZXhpc3RpbmcgcHJvcCBtZWFucyBub3RoaW5nIG5lZWRzIHRvIGJlIHJlbW92ZWRcbiAgICAgICAgLy8gbmIgYWZmZWN0cyBpbml0aWFsIGFwcGxpY2F0aW9uIG9uIG1hcHBlZCB2YWx1ZXMgbGlrZSBjb250cm9sLXBvaW50LWRpc3RhbmNlc1xuICAgICAgfSBlbHNlIGlmIChlbGVQcm9wLmJ5cGFzcykge1xuICAgICAgICBjeHRQcm9wID0ge1xuICAgICAgICAgIG5hbWU6IGRpZmZQcm9wTmFtZSxcbiAgICAgICAgICBkZWxldGVCeXBhc3NlZDogdHJ1ZVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3h0UHJvcCA9IHtcbiAgICAgICAgICBuYW1lOiBkaWZmUHJvcE5hbWUsXG4gICAgICAgICAgXCJkZWxldGVcIjogdHJ1ZVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHNhdmUgY3ljbGVzIHdoZW4gdGhlIGNvbnRleHQgcHJvcCBkb2Vzbid0IG5lZWQgdG8gYmUgYXBwbGllZFxuICAgIGlmIChlbGVQcm9wID09PSBjeHRQcm9wKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBzYXZlIGN5Y2xlcyB3aGVuIGEgbWFwcGVkIGNvbnRleHQgcHJvcCBkb2Vzbid0IG5lZWQgdG8gYmUgYXBwbGllZFxuICAgIGlmIChjeHRQcm9wLm1hcHBlZCA9PT0gdHlwZXMuZm4gLy8gY29udGV4dCBwcm9wIGlzIGZ1bmN0aW9uIG1hcHBlclxuICAgICYmIGVsZVByb3AgIT0gbnVsbCAvLyBzb21lIHByb3BzIGNhbiBiZSBudWxsIGV2ZW4gYnkgZGVmYXVsdCAoZS5nLiBhIHByb3AgdGhhdCBvdmVycmlkZXMgYW5vdGhlciBvbmUpXG4gICAgJiYgZWxlUHJvcC5tYXBwaW5nICE9IG51bGwgLy8gZWxlIHByb3AgaXMgYSBjb25jcmV0ZSB2YWx1ZSBmcm9tIGZyb20gYSBtYXBwZXJcbiAgICAmJiBlbGVQcm9wLm1hcHBpbmcudmFsdWUgPT09IGN4dFByb3AudmFsdWUgLy8gdGhlIGN1cnJlbnQgcHJvcCBvbiB0aGUgZWxlIGlzIGEgZmxhdCBwcm9wIHZhbHVlIGZvciB0aGUgZnVuY3Rpb24gbWFwcGVyXG4gICAgKSB7XG4gICAgICAvLyBOQiBkb24ndCB3cml0ZSB0byBjeHRQcm9wLCBhcyBpdCdzIHNoYXJlZCBhbW9uZyBlbGVzIChzdG9yZWQgaW4gc3R5bGVzaGVldClcbiAgICAgIHZhciBtYXBwaW5nID0gZWxlUHJvcC5tYXBwaW5nOyAvLyBjYW4gd3JpdGUgdG8gbWFwcGluZywgYXMgaXQncyBhIHBlci1lbGUgY29weVxuICAgICAgdmFyIGZuVmFsdWUgPSBtYXBwaW5nLmZuVmFsdWUgPSBjeHRQcm9wLnZhbHVlKGVsZSk7IC8vIHRlbXBvcmFyaWx5IGNhY2hlIHRoZSB2YWx1ZSBpbiBjYXNlIG9mIGEgbWlzc1xuXG4gICAgICBpZiAoZm5WYWx1ZSA9PT0gbWFwcGluZy5wcmV2Rm5WYWx1ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIHJldERpZmZQcm9wID0gcmV0RGlmZlByb3BzW2RpZmZQcm9wTmFtZV0gPSB7XG4gICAgICBwcmV2OiBlbGVQcm9wXG4gICAgfTtcbiAgICBzZWxmLmFwcGx5UGFyc2VkUHJvcGVydHkoZWxlLCBjeHRQcm9wKTtcbiAgICByZXREaWZmUHJvcC5uZXh0ID0gZWxlLnBzdHlsZShkaWZmUHJvcE5hbWUpO1xuICAgIGlmIChyZXREaWZmUHJvcC5uZXh0ICYmIHJldERpZmZQcm9wLm5leHQuYnlwYXNzKSB7XG4gICAgICByZXREaWZmUHJvcC5uZXh0ID0gcmV0RGlmZlByb3AubmV4dC5ieXBhc3NlZDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBkaWZmUHJvcHM6IHJldERpZmZQcm9wc1xuICB9O1xufTtcbnN0eWZuJDgudXBkYXRlU3R5bGVIaW50cyA9IGZ1bmN0aW9uIChlbGUpIHtcbiAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBwcm9wTmFtZXMgPSBzZWxmLnByb3BlcnR5R3JvdXBOYW1lcztcbiAgdmFyIHByb3BHcktleXMgPSBzZWxmLnByb3BlcnR5R3JvdXBLZXlzO1xuICB2YXIgcHJvcEhhc2ggPSBmdW5jdGlvbiBwcm9wSGFzaChlbGUsIHByb3BOYW1lcywgc2VlZEtleSkge1xuICAgIHJldHVybiBzZWxmLmdldFByb3BlcnRpZXNIYXNoKGVsZSwgcHJvcE5hbWVzLCBzZWVkS2V5KTtcbiAgfTtcbiAgdmFyIG9sZFN0eWxlS2V5ID0gX3Auc3R5bGVLZXk7XG4gIGlmIChlbGUucmVtb3ZlZCgpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBpc05vZGUgPSBfcC5ncm91cCA9PT0gJ25vZGVzJztcblxuICAvLyBnZXQgdGhlIHN0eWxlIGtleSBoYXNoZXMgcGVyIHByb3AgZ3JvdXBcbiAgLy8gYnV0IGxhemlseSAtLSBvbmx5IHVzZSBub24tZGVmYXVsdCBwcm9wIHZhbHVlcyB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBoYXNoZXNcbiAgLy9cblxuICB2YXIgb3ZlcnJpZGRlblN0eWxlcyA9IGVsZS5fcHJpdmF0ZS5zdHlsZTtcbiAgcHJvcE5hbWVzID0gT2JqZWN0LmtleXMob3ZlcnJpZGRlblN0eWxlcyk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcEdyS2V5cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBncktleSA9IHByb3BHcktleXNbaV07XG4gICAgX3Auc3R5bGVLZXlzW2dyS2V5XSA9IFtERUZBVUxUX0hBU0hfU0VFRCwgREVGQVVMVF9IQVNIX1NFRURfQUxUXTtcbiAgfVxuICB2YXIgdXBkYXRlR3JLZXkxID0gZnVuY3Rpb24gdXBkYXRlR3JLZXkxKHZhbCwgZ3JLZXkpIHtcbiAgICByZXR1cm4gX3Auc3R5bGVLZXlzW2dyS2V5XVswXSA9IGhhc2hJbnQodmFsLCBfcC5zdHlsZUtleXNbZ3JLZXldWzBdKTtcbiAgfTtcbiAgdmFyIHVwZGF0ZUdyS2V5MiA9IGZ1bmN0aW9uIHVwZGF0ZUdyS2V5Mih2YWwsIGdyS2V5KSB7XG4gICAgcmV0dXJuIF9wLnN0eWxlS2V5c1tncktleV1bMV0gPSBoYXNoSW50QWx0KHZhbCwgX3Auc3R5bGVLZXlzW2dyS2V5XVsxXSk7XG4gIH07XG4gIHZhciB1cGRhdGVHcktleSA9IGZ1bmN0aW9uIHVwZGF0ZUdyS2V5KHZhbCwgZ3JLZXkpIHtcbiAgICB1cGRhdGVHcktleTEodmFsLCBncktleSk7XG4gICAgdXBkYXRlR3JLZXkyKHZhbCwgZ3JLZXkpO1xuICB9O1xuICB2YXIgdXBkYXRlR3JLZXlXU3RyID0gZnVuY3Rpb24gdXBkYXRlR3JLZXlXU3RyKHN0clZhbCwgZ3JLZXkpIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHN0clZhbC5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIGNoID0gc3RyVmFsLmNoYXJDb2RlQXQoaik7XG4gICAgICB1cGRhdGVHcktleTEoY2gsIGdyS2V5KTtcbiAgICAgIHVwZGF0ZUdyS2V5MihjaCwgZ3JLZXkpO1xuICAgIH1cbiAgfTtcblxuICAvLyAtIGhhc2hpbmcgd29ya3Mgb24gMzIgYml0IGludHMgYi9jIHdlIHVzZSBiaXR3aXNlIG9wc1xuICAvLyAtIHNtYWxsIG51bWJlcnMgZ2V0IGN1dCBvZmYgKGUuZy4gMC4xMjMgaXMgc2VlbiBhcyAwIGJ5IHRoZSBoYXNoaW5nIGZ1bmN0aW9uKVxuICAvLyAtIHJhaXNlIHVwIHNtYWxsIG51bWJlcnMgc28gbW9yZSBzaWduaWZpY2FudCBkaWdpdHMgYXJlIHNlZW4gYnkgaGFzaGluZ1xuICAvLyAtIG1ha2Ugc21hbGwgbnVtYmVycyBsYXJnZXIgdGhhbiBhIG5vcm1hbCB2YWx1ZSB0byBhdm9pZCBjb2xsaXNpb25zXG4gIC8vIC0gd29ya3MgaW4gcHJhY3RpY2UgYW5kIGl0J3MgcmVsYXRpdmVseSBjaGVhcFxuICB2YXIgTiA9IDIwMDAwMDAwMDA7XG4gIHZhciBjbGVhbk51bSA9IGZ1bmN0aW9uIGNsZWFuTnVtKHZhbCkge1xuICAgIHJldHVybiAtMTI4IDwgdmFsICYmIHZhbCA8IDEyOCAmJiBNYXRoLmZsb29yKHZhbCkgIT09IHZhbCA/IE4gLSAodmFsICogMTAyNCB8IDApIDogdmFsO1xuICB9O1xuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgcHJvcE5hbWVzLmxlbmd0aDsgX2krKykge1xuICAgIHZhciBuYW1lID0gcHJvcE5hbWVzW19pXTtcbiAgICB2YXIgcGFyc2VkUHJvcCA9IG92ZXJyaWRkZW5TdHlsZXNbbmFtZV07XG4gICAgaWYgKHBhcnNlZFByb3AgPT0gbnVsbCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHZhciBwcm9wSW5mbyA9IHRoaXMucHJvcGVydGllc1tuYW1lXTtcbiAgICB2YXIgdHlwZSA9IHByb3BJbmZvLnR5cGU7XG4gICAgdmFyIF9ncktleSA9IHByb3BJbmZvLmdyb3VwS2V5O1xuICAgIHZhciBub3JtYWxpemVkTnVtYmVyVmFsID0gdm9pZCAwO1xuICAgIGlmIChwcm9wSW5mby5oYXNoT3ZlcnJpZGUgIT0gbnVsbCkge1xuICAgICAgbm9ybWFsaXplZE51bWJlclZhbCA9IHByb3BJbmZvLmhhc2hPdmVycmlkZShlbGUsIHBhcnNlZFByb3ApO1xuICAgIH0gZWxzZSBpZiAocGFyc2VkUHJvcC5wZlZhbHVlICE9IG51bGwpIHtcbiAgICAgIG5vcm1hbGl6ZWROdW1iZXJWYWwgPSBwYXJzZWRQcm9wLnBmVmFsdWU7XG4gICAgfVxuXG4gICAgLy8gbWlnaHQgbm90IGJlIGEgbnVtYmVyIGlmIGl0IGFsbG93cyBlbnVtc1xuICAgIHZhciBudW1iZXJWYWwgPSBwcm9wSW5mby5lbnVtcyA9PSBudWxsID8gcGFyc2VkUHJvcC52YWx1ZSA6IG51bGw7XG4gICAgdmFyIGhhdmVOb3JtTnVtID0gbm9ybWFsaXplZE51bWJlclZhbCAhPSBudWxsO1xuICAgIHZhciBoYXZlVW5pdGVkTnVtID0gbnVtYmVyVmFsICE9IG51bGw7XG4gICAgdmFyIGhhdmVOdW0gPSBoYXZlTm9ybU51bSB8fCBoYXZlVW5pdGVkTnVtO1xuICAgIHZhciB1bml0cyA9IHBhcnNlZFByb3AudW5pdHM7XG5cbiAgICAvLyBudW1iZXJzIGFyZSBjaGVhcGVyIHRvIGhhc2ggdGhhbiBzdHJpbmdzXG4gICAgLy8gMSBoYXNoIG9wIHZzIG4gaGFzaCBvcHMgKGZvciBsZW5ndGggbiBzdHJpbmcpXG4gICAgaWYgKHR5cGUubnVtYmVyICYmIGhhdmVOdW0gJiYgIXR5cGUubXVsdGlwbGUpIHtcbiAgICAgIHZhciB2ID0gaGF2ZU5vcm1OdW0gPyBub3JtYWxpemVkTnVtYmVyVmFsIDogbnVtYmVyVmFsO1xuICAgICAgdXBkYXRlR3JLZXkoY2xlYW5OdW0odiksIF9ncktleSk7XG4gICAgICBpZiAoIWhhdmVOb3JtTnVtICYmIHVuaXRzICE9IG51bGwpIHtcbiAgICAgICAgdXBkYXRlR3JLZXlXU3RyKHVuaXRzLCBfZ3JLZXkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB1cGRhdGVHcktleVdTdHIocGFyc2VkUHJvcC5zdHJWYWx1ZSwgX2dyS2V5KTtcbiAgICB9XG4gIH1cblxuICAvLyBvdmVyYWxsIHN0eWxlIGtleVxuICAvL1xuXG4gIHZhciBoYXNoID0gW0RFRkFVTFRfSEFTSF9TRUVELCBERUZBVUxUX0hBU0hfU0VFRF9BTFRdO1xuICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBwcm9wR3JLZXlzLmxlbmd0aDsgX2kyKyspIHtcbiAgICB2YXIgX2dyS2V5MiA9IHByb3BHcktleXNbX2kyXTtcbiAgICB2YXIgZ3JIYXNoID0gX3Auc3R5bGVLZXlzW19ncktleTJdO1xuICAgIGhhc2hbMF0gPSBoYXNoSW50KGdySGFzaFswXSwgaGFzaFswXSk7XG4gICAgaGFzaFsxXSA9IGhhc2hJbnRBbHQoZ3JIYXNoWzFdLCBoYXNoWzFdKTtcbiAgfVxuICBfcC5zdHlsZUtleSA9IGNvbWJpbmVIYXNoZXMoaGFzaFswXSwgaGFzaFsxXSk7XG5cbiAgLy8gbGFiZWwgZGltc1xuICAvL1xuXG4gIHZhciBzayA9IF9wLnN0eWxlS2V5cztcbiAgX3AubGFiZWxEaW1zS2V5ID0gY29tYmluZUhhc2hlc0FycmF5KHNrLmxhYmVsRGltZW5zaW9ucyk7XG4gIHZhciBsYWJlbEtleXMgPSBwcm9wSGFzaChlbGUsIFsnbGFiZWwnXSwgc2subGFiZWxEaW1lbnNpb25zKTtcbiAgX3AubGFiZWxLZXkgPSBjb21iaW5lSGFzaGVzQXJyYXkobGFiZWxLZXlzKTtcbiAgX3AubGFiZWxTdHlsZUtleSA9IGNvbWJpbmVIYXNoZXNBcnJheShoYXNoQXJyYXlzKHNrLmNvbW1vbkxhYmVsLCBsYWJlbEtleXMpKTtcbiAgaWYgKCFpc05vZGUpIHtcbiAgICB2YXIgc291cmNlTGFiZWxLZXlzID0gcHJvcEhhc2goZWxlLCBbJ3NvdXJjZS1sYWJlbCddLCBzay5sYWJlbERpbWVuc2lvbnMpO1xuICAgIF9wLnNvdXJjZUxhYmVsS2V5ID0gY29tYmluZUhhc2hlc0FycmF5KHNvdXJjZUxhYmVsS2V5cyk7XG4gICAgX3Auc291cmNlTGFiZWxTdHlsZUtleSA9IGNvbWJpbmVIYXNoZXNBcnJheShoYXNoQXJyYXlzKHNrLmNvbW1vbkxhYmVsLCBzb3VyY2VMYWJlbEtleXMpKTtcbiAgICB2YXIgdGFyZ2V0TGFiZWxLZXlzID0gcHJvcEhhc2goZWxlLCBbJ3RhcmdldC1sYWJlbCddLCBzay5sYWJlbERpbWVuc2lvbnMpO1xuICAgIF9wLnRhcmdldExhYmVsS2V5ID0gY29tYmluZUhhc2hlc0FycmF5KHRhcmdldExhYmVsS2V5cyk7XG4gICAgX3AudGFyZ2V0TGFiZWxTdHlsZUtleSA9IGNvbWJpbmVIYXNoZXNBcnJheShoYXNoQXJyYXlzKHNrLmNvbW1vbkxhYmVsLCB0YXJnZXRMYWJlbEtleXMpKTtcbiAgfVxuXG4gIC8vIG5vZGVcbiAgLy9cblxuICBpZiAoaXNOb2RlKSB7XG4gICAgdmFyIF9wJHN0eWxlS2V5cyA9IF9wLnN0eWxlS2V5cyxcbiAgICAgIG5vZGVCb2R5ID0gX3Akc3R5bGVLZXlzLm5vZGVCb2R5LFxuICAgICAgbm9kZUJvcmRlciA9IF9wJHN0eWxlS2V5cy5ub2RlQm9yZGVyLFxuICAgICAgbm9kZU91dGxpbmUgPSBfcCRzdHlsZUtleXMubm9kZU91dGxpbmUsXG4gICAgICBiYWNrZ3JvdW5kSW1hZ2UgPSBfcCRzdHlsZUtleXMuYmFja2dyb3VuZEltYWdlLFxuICAgICAgY29tcG91bmQgPSBfcCRzdHlsZUtleXMuY29tcG91bmQsXG4gICAgICBwaWUgPSBfcCRzdHlsZUtleXMucGllLFxuICAgICAgc3RyaXBlID0gX3Akc3R5bGVLZXlzLnN0cmlwZTtcbiAgICB2YXIgbm9kZUtleXMgPSBbbm9kZUJvZHksIG5vZGVCb3JkZXIsIG5vZGVPdXRsaW5lLCBiYWNrZ3JvdW5kSW1hZ2UsIGNvbXBvdW5kLCBwaWUsIHN0cmlwZV0uZmlsdGVyKGZ1bmN0aW9uIChrKSB7XG4gICAgICByZXR1cm4gayAhPSBudWxsO1xuICAgIH0pLnJlZHVjZShoYXNoQXJyYXlzLCBbREVGQVVMVF9IQVNIX1NFRUQsIERFRkFVTFRfSEFTSF9TRUVEX0FMVF0pO1xuICAgIF9wLm5vZGVLZXkgPSBjb21iaW5lSGFzaGVzQXJyYXkobm9kZUtleXMpO1xuICAgIF9wLmhhc1BpZSA9IHBpZSAhPSBudWxsICYmIHBpZVswXSAhPT0gREVGQVVMVF9IQVNIX1NFRUQgJiYgcGllWzFdICE9PSBERUZBVUxUX0hBU0hfU0VFRF9BTFQ7XG4gICAgX3AuaGFzU3RyaXBlID0gc3RyaXBlICE9IG51bGwgJiYgc3RyaXBlWzBdICE9PSBERUZBVUxUX0hBU0hfU0VFRCAmJiBzdHJpcGVbMV0gIT09IERFRkFVTFRfSEFTSF9TRUVEX0FMVDtcbiAgfVxuICByZXR1cm4gb2xkU3R5bGVLZXkgIT09IF9wLnN0eWxlS2V5O1xufTtcbnN0eWZuJDguY2xlYXJTdHlsZUhpbnRzID0gZnVuY3Rpb24gKGVsZSkge1xuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIF9wLnN0eWxlQ3h0S2V5ID0gJyc7XG4gIF9wLnN0eWxlS2V5cyA9IHt9O1xuICBfcC5zdHlsZUtleSA9IG51bGw7XG4gIF9wLmxhYmVsS2V5ID0gbnVsbDtcbiAgX3AubGFiZWxTdHlsZUtleSA9IG51bGw7XG4gIF9wLnNvdXJjZUxhYmVsS2V5ID0gbnVsbDtcbiAgX3Auc291cmNlTGFiZWxTdHlsZUtleSA9IG51bGw7XG4gIF9wLnRhcmdldExhYmVsS2V5ID0gbnVsbDtcbiAgX3AudGFyZ2V0TGFiZWxTdHlsZUtleSA9IG51bGw7XG4gIF9wLm5vZGVLZXkgPSBudWxsO1xuICBfcC5oYXNQaWUgPSBudWxsO1xuICBfcC5oYXNTdHJpcGUgPSBudWxsO1xufTtcblxuLy8gYXBwbHkgYSBwcm9wZXJ0eSB0byB0aGUgc3R5bGUgKGZvciBpbnRlcm5hbCB1c2UpXG4vLyByZXR1cm5zIHdoZXRoZXIgYXBwbGljYXRpb24gd2FzIHN1Y2Nlc3NmdWxcbi8vXG4vLyBub3csIHRoaXMgZnVuY3Rpb24gZmxhdHRlbnMgdGhlIHByb3BlcnR5LCBhbmQgaGVyZSdzIGhvdzpcbi8vXG4vLyBmb3IgcGFyc2VkUHJvcDp7IGJ5cGFzczogdHJ1ZSwgZGVsZXRlQnlwYXNzOiB0cnVlIH1cbi8vIG5vIHByb3BlcnR5IGlzIGdlbmVyYXRlZCwgaW5zdGVhZCB0aGUgYnlwYXNzIHByb3BlcnR5IGluIHRoZVxuLy8gZWxlbWVudCdzIHN0eWxlIGlzIHJlcGxhY2VkIGJ5IHdoYXQncyBwb2ludGVkIHRvIGJ5IHRoZSBgYnlwYXNzZWRgXG4vLyBmaWVsZCBpbiB0aGUgYnlwYXNzIHByb3BlcnR5IChpLmUuIHJlc3RvcmluZyB0aGUgcHJvcGVydHkgdGhlXG4vLyBieXBhc3Mgd2FzIG92ZXJyaWRpbmcpXG4vL1xuLy8gZm9yIHBhcnNlZFByb3A6eyBtYXBwZWQ6IHRydXRoeSB9XG4vLyB0aGUgZ2VuZXJhdGVkIGZsYXR0ZW5lZFByb3A6eyBtYXBwaW5nOiBwcm9wIH1cbi8vXG4vLyBmb3IgcGFyc2VkUHJvcDp7IGJ5cGFzczogdHJ1ZSB9XG4vLyB0aGUgZ2VuZXJhdGVkIGZsYXR0ZW5lZFByb3A6eyBieXBhc3NlZDogcGFyc2VkUHJvcCB9XG5zdHlmbiQ4LmFwcGx5UGFyc2VkUHJvcGVydHkgPSBmdW5jdGlvbiAoZWxlLCBwYXJzZWRQcm9wKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHByb3AgPSBwYXJzZWRQcm9wO1xuICB2YXIgc3R5bGUgPSBlbGUuX3ByaXZhdGUuc3R5bGU7XG4gIHZhciBmbGF0UHJvcDtcbiAgdmFyIHR5cGVzID0gc2VsZi50eXBlcztcbiAgdmFyIHR5cGUgPSBzZWxmLnByb3BlcnRpZXNbcHJvcC5uYW1lXS50eXBlO1xuICB2YXIgcHJvcElzQnlwYXNzID0gcHJvcC5ieXBhc3M7XG4gIHZhciBvcmlnUHJvcCA9IHN0eWxlW3Byb3AubmFtZV07XG4gIHZhciBvcmlnUHJvcElzQnlwYXNzID0gb3JpZ1Byb3AgJiYgb3JpZ1Byb3AuYnlwYXNzO1xuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIHZhciBmbGF0UHJvcE1hcHBpbmcgPSAnbWFwcGluZyc7XG4gIHZhciBnZXRWYWwgPSBmdW5jdGlvbiBnZXRWYWwocCkge1xuICAgIGlmIChwID09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSBpZiAocC5wZlZhbHVlICE9IG51bGwpIHtcbiAgICAgIHJldHVybiBwLnBmVmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBwLnZhbHVlO1xuICAgIH1cbiAgfTtcbiAgdmFyIGNoZWNrVHJpZ2dlcnMgPSBmdW5jdGlvbiBjaGVja1RyaWdnZXJzKCkge1xuICAgIHZhciBmcm9tVmFsID0gZ2V0VmFsKG9yaWdQcm9wKTtcbiAgICB2YXIgdG9WYWwgPSBnZXRWYWwocHJvcCk7XG4gICAgc2VsZi5jaGVja1RyaWdnZXJzKGVsZSwgcHJvcC5uYW1lLCBmcm9tVmFsLCB0b1ZhbCk7XG4gIH07XG5cbiAgLy8gZWRnZSBzYW5pdHkgY2hlY2tzIHRvIHByZXZlbnQgdGhlIGNsaWVudCBmcm9tIG1ha2luZyBzZXJpb3VzIG1pc3Rha2VzXG4gIGlmIChwYXJzZWRQcm9wLm5hbWUgPT09ICdjdXJ2ZS1zdHlsZScgJiYgZWxlLmlzRWRnZSgpICYmIChcbiAgLy8gbG9vcHMgbXVzdCBiZSBidW5kbGVkIGJlemllcnNcbiAgcGFyc2VkUHJvcC52YWx1ZSAhPT0gJ2JlemllcicgJiYgZWxlLmlzTG9vcCgpIHx8XG4gIC8vIGVkZ2VzIGNvbm5lY3RlZCB0byBjb21wb3VuZCBub2RlcyBjYW4gbm90IGJlIGhheXN0YWNrc1xuICBwYXJzZWRQcm9wLnZhbHVlID09PSAnaGF5c3RhY2snICYmIChlbGUuc291cmNlKCkuaXNQYXJlbnQoKSB8fCBlbGUudGFyZ2V0KCkuaXNQYXJlbnQoKSkpKSB7XG4gICAgcHJvcCA9IHBhcnNlZFByb3AgPSB0aGlzLnBhcnNlKHBhcnNlZFByb3AubmFtZSwgJ2JlemllcicsIHByb3BJc0J5cGFzcyk7XG4gIH1cbiAgaWYgKHByb3BbXCJkZWxldGVcIl0pIHtcbiAgICAvLyBkZWxldGUgdGhlIHByb3BlcnR5IGFuZCB1c2UgdGhlIGRlZmF1bHQgdmFsdWUgb24gZmFsc2V5IHZhbHVlXG4gICAgc3R5bGVbcHJvcC5uYW1lXSA9IHVuZGVmaW5lZDtcbiAgICBjaGVja1RyaWdnZXJzKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKHByb3AuZGVsZXRlQnlwYXNzZWQpIHtcbiAgICAvLyBkZWxldGUgdGhlIHByb3BlcnR5IHRoYXQgdGhlXG4gICAgaWYgKCFvcmlnUHJvcCkge1xuICAgICAgY2hlY2tUcmlnZ2VycygpO1xuICAgICAgcmV0dXJuIHRydWU7IC8vIGNhbid0IGRlbGV0ZSBpZiBubyBwcm9wXG4gICAgfSBlbHNlIGlmIChvcmlnUHJvcC5ieXBhc3MpIHtcbiAgICAgIC8vIGRlbGV0ZSBieXBhc3NlZFxuICAgICAgb3JpZ1Byb3AuYnlwYXNzZWQgPSB1bmRlZmluZWQ7XG4gICAgICBjaGVja1RyaWdnZXJzKCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlOyAvLyB3ZSdyZSB1bnN1Y2Nlc3NmdWwgZGVsZXRpbmcgdGhlIGJ5cGFzc2VkXG4gICAgfVxuICB9XG5cbiAgLy8gY2hlY2sgaWYgd2UgbmVlZCB0byBkZWxldGUgdGhlIGN1cnJlbnQgYnlwYXNzXG4gIGlmIChwcm9wLmRlbGV0ZUJ5cGFzcykge1xuICAgIC8vIHRoZW4gdGhpcyBwcm9wZXJ0eSBpcyBqdXN0IGhlcmUgdG8gaW5kaWNhdGUgd2UgbmVlZCB0byBkZWxldGVcbiAgICBpZiAoIW9yaWdQcm9wKSB7XG4gICAgICBjaGVja1RyaWdnZXJzKCk7XG4gICAgICByZXR1cm4gdHJ1ZTsgLy8gcHJvcGVydHkgaXMgYWxyZWFkeSBub3QgZGVmaW5lZFxuICAgIH0gZWxzZSBpZiAob3JpZ1Byb3AuYnlwYXNzKSB7XG4gICAgICAvLyB0aGVuIHJlcGxhY2UgdGhlIGJ5cGFzcyBwcm9wZXJ0eSB3aXRoIHRoZSBvcmlnaW5hbFxuICAgICAgLy8gYmVjYXVzZSB0aGUgYnlwYXNzZWQgcHJvcGVydHkgd2FzIGFscmVhZHkgYXBwbGllZCAoYW5kIHRoZXJlZm9yZSBwYXJzZWQpLCB3ZSBjYW4ganVzdCByZXBsYWNlIGl0IChubyByZWFwcGx5aW5nIG5lY2Vzc2FyeSlcbiAgICAgIHN0eWxlW3Byb3AubmFtZV0gPSBvcmlnUHJvcC5ieXBhc3NlZDtcbiAgICAgIGNoZWNrVHJpZ2dlcnMoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7IC8vIHdlJ3JlIHVuc3VjY2Vzc2Z1bCBkZWxldGluZyB0aGUgYnlwYXNzXG4gICAgfVxuICB9XG4gIHZhciBwcmludE1hcHBpbmdFcnIgPSBmdW5jdGlvbiBwcmludE1hcHBpbmdFcnIoKSB7XG4gICAgd2FybignRG8gbm90IGFzc2lnbiBtYXBwaW5ncyB0byBlbGVtZW50cyB3aXRob3V0IGNvcnJlc3BvbmRpbmcgZGF0YSAoaS5lLiBlbGUgYCcgKyBlbGUuaWQoKSArICdgIGhhcyBubyBtYXBwaW5nIGZvciBwcm9wZXJ0eSBgJyArIHByb3AubmFtZSArICdgIHdpdGggZGF0YSBmaWVsZCBgJyArIHByb3AuZmllbGQgKyAnYCk7IHRyeSBhIGBbJyArIHByb3AuZmllbGQgKyAnXWAgc2VsZWN0b3IgdG8gbGltaXQgc2NvcGUgdG8gZWxlbWVudHMgd2l0aCBgJyArIHByb3AuZmllbGQgKyAnYCBkZWZpbmVkJyk7XG4gIH07XG5cbiAgLy8gcHV0IHRoZSBwcm9wZXJ0eSBpbiB0aGUgc3R5bGUgb2JqZWN0c1xuICBzd2l0Y2ggKHByb3AubWFwcGVkKSB7XG4gICAgLy8gZmxhdHRlbiB0aGUgcHJvcGVydHkgaWYgbWFwcGVkXG4gICAgY2FzZSB0eXBlcy5tYXBEYXRhOlxuICAgICAge1xuICAgICAgICAvLyBmbGF0dGVuIHRoZSBmaWVsZCAoZS5nLiBkYXRhLmZvby5iYXIpXG4gICAgICAgIHZhciBmaWVsZHMgPSBwcm9wLmZpZWxkLnNwbGl0KCcuJyk7XG4gICAgICAgIHZhciBmaWVsZFZhbCA9IF9wLmRhdGE7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aCAmJiBmaWVsZFZhbDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGZpZWxkID0gZmllbGRzW2ldO1xuICAgICAgICAgIGZpZWxkVmFsID0gZmllbGRWYWxbZmllbGRdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWVsZFZhbCA9PSBudWxsKSB7XG4gICAgICAgICAgcHJpbnRNYXBwaW5nRXJyKCk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwZXJjZW50O1xuICAgICAgICBpZiAoIW51bWJlciQxKGZpZWxkVmFsKSkge1xuICAgICAgICAgIC8vIHRoZW4gZG9uJ3QgYXBwbHkgYW5kIGZhbGwgYmFjayBvbiB0aGUgZXhpc3Rpbmcgc3R5bGVcbiAgICAgICAgICB3YXJuKCdEbyBub3QgdXNlIGNvbnRpbnVvdXMgbWFwcGVycyB3aXRob3V0IHNwZWNpZnlpbmcgbnVtZXJpYyBkYXRhIChpLmUuIGAnICsgcHJvcC5maWVsZCArICc6ICcgKyBmaWVsZFZhbCArICdgIGZvciBgJyArIGVsZS5pZCgpICsgJ2AgaXMgbm9uLW51bWVyaWMpJyk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBmaWVsZFdpZHRoID0gcHJvcC5maWVsZE1heCAtIHByb3AuZmllbGRNaW47XG4gICAgICAgICAgaWYgKGZpZWxkV2lkdGggPT09IDApIHtcbiAgICAgICAgICAgIC8vIHNhZmV0eSBjaGVjayAtLSBub3Qgc3RyaWN0bHkgbmVjZXNzYXJ5IGFzIG5vIHByb3BzIG9mIHplcm8gcmFuZ2Ugc2hvdWxkIGJlIHBhc3NlZCBoZXJlXG4gICAgICAgICAgICBwZXJjZW50ID0gMDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVyY2VudCA9IChmaWVsZFZhbCAtIHByb3AuZmllbGRNaW4pIC8gZmllbGRXaWR0aDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBtYWtlIHN1cmUgdG8gYm91bmQgcGVyY2VudCB2YWx1ZVxuICAgICAgICBpZiAocGVyY2VudCA8IDApIHtcbiAgICAgICAgICBwZXJjZW50ID0gMDtcbiAgICAgICAgfSBlbHNlIGlmIChwZXJjZW50ID4gMSkge1xuICAgICAgICAgIHBlcmNlbnQgPSAxO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlLmNvbG9yKSB7XG4gICAgICAgICAgdmFyIHIxID0gcHJvcC52YWx1ZU1pblswXTtcbiAgICAgICAgICB2YXIgcjIgPSBwcm9wLnZhbHVlTWF4WzBdO1xuICAgICAgICAgIHZhciBnMSA9IHByb3AudmFsdWVNaW5bMV07XG4gICAgICAgICAgdmFyIGcyID0gcHJvcC52YWx1ZU1heFsxXTtcbiAgICAgICAgICB2YXIgYjEgPSBwcm9wLnZhbHVlTWluWzJdO1xuICAgICAgICAgIHZhciBiMiA9IHByb3AudmFsdWVNYXhbMl07XG4gICAgICAgICAgdmFyIGExID0gcHJvcC52YWx1ZU1pblszXSA9PSBudWxsID8gMSA6IHByb3AudmFsdWVNaW5bM107XG4gICAgICAgICAgdmFyIGEyID0gcHJvcC52YWx1ZU1heFszXSA9PSBudWxsID8gMSA6IHByb3AudmFsdWVNYXhbM107XG4gICAgICAgICAgdmFyIGNsciA9IFtNYXRoLnJvdW5kKHIxICsgKHIyIC0gcjEpICogcGVyY2VudCksIE1hdGgucm91bmQoZzEgKyAoZzIgLSBnMSkgKiBwZXJjZW50KSwgTWF0aC5yb3VuZChiMSArIChiMiAtIGIxKSAqIHBlcmNlbnQpLCBNYXRoLnJvdW5kKGExICsgKGEyIC0gYTEpICogcGVyY2VudCldO1xuICAgICAgICAgIGZsYXRQcm9wID0ge1xuICAgICAgICAgICAgLy8gY29sb3VycyBhcmUgc2ltcGxlLCBzbyBqdXN0IGNyZWF0ZSB0aGUgZmxhdCBwcm9wZXJ0eSBpbnN0ZWFkIG9mIGV4cGVuc2l2ZSBzdHJpbmcgcGFyc2luZ1xuICAgICAgICAgICAgYnlwYXNzOiBwcm9wLmJ5cGFzcyxcbiAgICAgICAgICAgIC8vIHdlJ3JlIGEgYnlwYXNzIGlmIHRoZSBtYXBwaW5nIHByb3BlcnR5IGlzIGEgYnlwYXNzXG4gICAgICAgICAgICBuYW1lOiBwcm9wLm5hbWUsXG4gICAgICAgICAgICB2YWx1ZTogY2xyLFxuICAgICAgICAgICAgc3RyVmFsdWU6ICdyZ2IoJyArIGNsclswXSArICcsICcgKyBjbHJbMV0gKyAnLCAnICsgY2xyWzJdICsgJyknXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlLm51bWJlcikge1xuICAgICAgICAgIHZhciBjYWxjVmFsdWUgPSBwcm9wLnZhbHVlTWluICsgKHByb3AudmFsdWVNYXggLSBwcm9wLnZhbHVlTWluKSAqIHBlcmNlbnQ7XG4gICAgICAgICAgZmxhdFByb3AgPSB0aGlzLnBhcnNlKHByb3AubmFtZSwgY2FsY1ZhbHVlLCBwcm9wLmJ5cGFzcywgZmxhdFByb3BNYXBwaW5nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIGNhbiBvbmx5IG1hcCB0byBjb2xvdXJzIGFuZCBudW1iZXJzXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFmbGF0UHJvcCkge1xuICAgICAgICAgIC8vIGlmIHdlIGNhbid0IGZsYXR0ZW4gdGhlIHByb3BlcnR5LCB0aGVuIGRvbid0IGFwcGx5IHRoZSBwcm9wZXJ0eSBhbmQgZmFsbCBiYWNrIG9uIHRoZSBleGlzdGluZyBzdHlsZVxuICAgICAgICAgIHByaW50TWFwcGluZ0VycigpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBmbGF0UHJvcC5tYXBwaW5nID0gcHJvcDsgLy8ga2VlcCBhIHJlZmVyZW5jZSB0byB0aGUgbWFwcGluZ1xuICAgICAgICBwcm9wID0gZmxhdFByb3A7IC8vIHRoZSBmbGF0dGVuZWQgKG1hcHBlZCkgcHJvcGVydHkgaXMgdGhlIG9uZSB3ZSB3YW50XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAvLyBkaXJlY3QgbWFwcGluZ1xuICAgIGNhc2UgdHlwZXMuZGF0YTpcbiAgICAgIHtcbiAgICAgICAgLy8gZmxhdHRlbiB0aGUgZmllbGQgKGUuZy4gZGF0YS5mb28uYmFyKVxuICAgICAgICB2YXIgX2ZpZWxkcyA9IHByb3AuZmllbGQuc3BsaXQoJy4nKTtcbiAgICAgICAgdmFyIF9maWVsZFZhbCA9IF9wLmRhdGE7XG4gICAgICAgIGZvciAodmFyIF9pMyA9IDA7IF9pMyA8IF9maWVsZHMubGVuZ3RoICYmIF9maWVsZFZhbDsgX2kzKyspIHtcbiAgICAgICAgICB2YXIgX2ZpZWxkID0gX2ZpZWxkc1tfaTNdO1xuICAgICAgICAgIF9maWVsZFZhbCA9IF9maWVsZFZhbFtfZmllbGRdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChfZmllbGRWYWwgIT0gbnVsbCkge1xuICAgICAgICAgIGZsYXRQcm9wID0gdGhpcy5wYXJzZShwcm9wLm5hbWUsIF9maWVsZFZhbCwgcHJvcC5ieXBhc3MsIGZsYXRQcm9wTWFwcGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFmbGF0UHJvcCkge1xuICAgICAgICAgIC8vIGlmIHdlIGNhbid0IGZsYXR0ZW4gdGhlIHByb3BlcnR5LCB0aGVuIGRvbid0IGFwcGx5IGFuZCBmYWxsIGJhY2sgb24gdGhlIGV4aXN0aW5nIHN0eWxlXG4gICAgICAgICAgcHJpbnRNYXBwaW5nRXJyKCk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZsYXRQcm9wLm1hcHBpbmcgPSBwcm9wOyAvLyBrZWVwIGEgcmVmZXJlbmNlIHRvIHRoZSBtYXBwaW5nXG4gICAgICAgIHByb3AgPSBmbGF0UHJvcDsgLy8gdGhlIGZsYXR0ZW5lZCAobWFwcGVkKSBwcm9wZXJ0eSBpcyB0aGUgb25lIHdlIHdhbnRcblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICBjYXNlIHR5cGVzLmZuOlxuICAgICAge1xuICAgICAgICB2YXIgZm4gPSBwcm9wLnZhbHVlO1xuICAgICAgICB2YXIgZm5SZXRWYWwgPSBwcm9wLmZuVmFsdWUgIT0gbnVsbCA/IHByb3AuZm5WYWx1ZSA6IGZuKGVsZSk7IC8vIGNoZWNrIGZvciBjYWNoZWQgdmFsdWUgYmVmb3JlIGNhbGxpbmcgZnVuY3Rpb25cblxuICAgICAgICBwcm9wLnByZXZGblZhbHVlID0gZm5SZXRWYWw7XG4gICAgICAgIGlmIChmblJldFZhbCA9PSBudWxsKSB7XG4gICAgICAgICAgd2FybignQ3VzdG9tIGZ1bmN0aW9uIG1hcHBlcnMgbWF5IG5vdCByZXR1cm4gbnVsbCAoaS5lLiBgJyArIHByb3AubmFtZSArICdgIGZvciBlbGUgYCcgKyBlbGUuaWQoKSArICdgIGlzIG51bGwpJyk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZsYXRQcm9wID0gdGhpcy5wYXJzZShwcm9wLm5hbWUsIGZuUmV0VmFsLCBwcm9wLmJ5cGFzcywgZmxhdFByb3BNYXBwaW5nKTtcbiAgICAgICAgaWYgKCFmbGF0UHJvcCkge1xuICAgICAgICAgIHdhcm4oJ0N1c3RvbSBmdW5jdGlvbiBtYXBwZXJzIG1heSBub3QgcmV0dXJuIGludmFsaWQgdmFsdWVzIGZvciB0aGUgcHJvcGVydHkgdHlwZSAoaS5lLiBgJyArIHByb3AubmFtZSArICdgIGZvciBlbGUgYCcgKyBlbGUuaWQoKSArICdgIGlzIGludmFsaWQpJyk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZsYXRQcm9wLm1hcHBpbmcgPSBjb3B5KHByb3ApOyAvLyBrZWVwIGEgcmVmZXJlbmNlIHRvIHRoZSBtYXBwaW5nXG4gICAgICAgIHByb3AgPSBmbGF0UHJvcDsgLy8gdGhlIGZsYXR0ZW5lZCAobWFwcGVkKSBwcm9wZXJ0eSBpcyB0aGUgb25lIHdlIHdhbnRcblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgIGJyZWFrO1xuICAgIC8vIGp1c3Qgc2V0IHRoZSBwcm9wZXJ0eVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICAvLyBub3QgYSB2YWxpZCBtYXBwaW5nXG4gIH1cblxuICAvLyBpZiB0aGUgcHJvcGVydHkgaXMgYSBieXBhc3MgcHJvcGVydHksIHRoZW4gbGluayB0aGUgcmVzdWx0YW50IHByb3BlcnR5IHRvIHRoZSBvcmlnaW5hbCBvbmVcbiAgaWYgKHByb3BJc0J5cGFzcykge1xuICAgIGlmIChvcmlnUHJvcElzQnlwYXNzKSB7XG4gICAgICAvLyB0aGVuIHRoaXMgYnlwYXNzIG92ZXJyaWRlcyB0aGUgZXhpc3Rpbmcgb25lXG4gICAgICBwcm9wLmJ5cGFzc2VkID0gb3JpZ1Byb3AuYnlwYXNzZWQ7IC8vIHN0ZWFsIGJ5cGFzc2VkIHByb3AgZnJvbSBvbGQgYnlwYXNzXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRoZW4gbGluayB0aGUgb3JpZyBwcm9wIHRvIHRoZSBuZXcgYnlwYXNzXG4gICAgICBwcm9wLmJ5cGFzc2VkID0gb3JpZ1Byb3A7XG4gICAgfVxuICAgIHN0eWxlW3Byb3AubmFtZV0gPSBwcm9wOyAvLyBhbmQgc2V0XG4gIH0gZWxzZSB7XG4gICAgLy8gcHJvcCBpcyBub3QgYnlwYXNzXG4gICAgaWYgKG9yaWdQcm9wSXNCeXBhc3MpIHtcbiAgICAgIC8vIHRoZW4ga2VlcCB0aGUgb3JpZyBwcm9wIChzaW5jZSBpdCdzIGEgYnlwYXNzKSBhbmQgbGluayB0byB0aGUgbmV3IHByb3BcbiAgICAgIG9yaWdQcm9wLmJ5cGFzc2VkID0gcHJvcDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdGhlbiBqdXN0IHJlcGxhY2UgdGhlIG9sZCBwcm9wIHdpdGggdGhlIG5ldyBvbmVcbiAgICAgIHN0eWxlW3Byb3AubmFtZV0gPSBwcm9wO1xuICAgIH1cbiAgfVxuICBjaGVja1RyaWdnZXJzKCk7XG4gIHJldHVybiB0cnVlO1xufTtcbnN0eWZuJDguY2xlYW5FbGVtZW50cyA9IGZ1bmN0aW9uIChlbGVzLCBrZWVwQnlwYXNzZXMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgdGhpcy5jbGVhclN0eWxlSGludHMoZWxlKTtcbiAgICBlbGUuZGlydHlDb21wb3VuZEJvdW5kc0NhY2hlKCk7XG4gICAgZWxlLmRpcnR5Qm91bmRpbmdCb3hDYWNoZSgpO1xuICAgIGlmICgha2VlcEJ5cGFzc2VzKSB7XG4gICAgICBlbGUuX3ByaXZhdGUuc3R5bGUgPSB7fTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHN0eWxlID0gZWxlLl9wcml2YXRlLnN0eWxlO1xuICAgICAgdmFyIHByb3BOYW1lcyA9IE9iamVjdC5rZXlzKHN0eWxlKTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcHJvcE5hbWVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBwcm9wTmFtZSA9IHByb3BOYW1lc1tqXTtcbiAgICAgICAgdmFyIGVsZVByb3AgPSBzdHlsZVtwcm9wTmFtZV07XG4gICAgICAgIGlmIChlbGVQcm9wICE9IG51bGwpIHtcbiAgICAgICAgICBpZiAoZWxlUHJvcC5ieXBhc3MpIHtcbiAgICAgICAgICAgIGVsZVByb3AuYnlwYXNzZWQgPSBudWxsO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdHlsZVtwcm9wTmFtZV0gPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuLy8gdXBkYXRlcyB0aGUgdmlzdWFsIHN0eWxlIGZvciBhbGwgZWxlbWVudHMgKHVzZWZ1bCBmb3IgbWFudWFsIHN0eWxlIG1vZGlmaWNhdGlvbiBhZnRlciBpbml0KVxuc3R5Zm4kOC51cGRhdGUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3k7XG4gIHZhciBlbGVzID0gY3kubXV0YWJsZUVsZW1lbnRzKCk7XG4gIGVsZXMudXBkYXRlU3R5bGUoKTtcbn07XG5cbi8vIGRpZmZQcm9wcyA6IHsgbmFtZSA9PiB7IHByZXYsIG5leHQgfSB9XG5zdHlmbiQ4LnVwZGF0ZVRyYW5zaXRpb25zID0gZnVuY3Rpb24gKGVsZSwgZGlmZlByb3BzKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICB2YXIgcHJvcHMgPSBlbGUucHN0eWxlKCd0cmFuc2l0aW9uLXByb3BlcnR5JykudmFsdWU7XG4gIHZhciBkdXJhdGlvbiA9IGVsZS5wc3R5bGUoJ3RyYW5zaXRpb24tZHVyYXRpb24nKS5wZlZhbHVlO1xuICB2YXIgZGVsYXkgPSBlbGUucHN0eWxlKCd0cmFuc2l0aW9uLWRlbGF5JykucGZWYWx1ZTtcbiAgaWYgKHByb3BzLmxlbmd0aCA+IDAgJiYgZHVyYXRpb24gPiAwKSB7XG4gICAgdmFyIHN0eWxlID0ge307XG5cbiAgICAvLyBidWlsZCB1cCB0aGUgc3R5bGUgdG8gYW5pbWF0ZSB0b3dhcmRzXG4gICAgdmFyIGFueVByZXYgPSBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcHJvcCA9IHByb3BzW2ldO1xuICAgICAgdmFyIHN0eVByb3AgPSBlbGUucHN0eWxlKHByb3ApO1xuICAgICAgdmFyIGRpZmZQcm9wID0gZGlmZlByb3BzW3Byb3BdO1xuICAgICAgaWYgKCFkaWZmUHJvcCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBwcmV2UHJvcCA9IGRpZmZQcm9wLnByZXY7XG4gICAgICB2YXIgZnJvbVByb3AgPSBwcmV2UHJvcDtcbiAgICAgIHZhciB0b1Byb3AgPSBkaWZmUHJvcC5uZXh0ICE9IG51bGwgPyBkaWZmUHJvcC5uZXh0IDogc3R5UHJvcDtcbiAgICAgIHZhciBkaWZmID0gZmFsc2U7XG4gICAgICB2YXIgaW5pdFZhbCA9IHZvaWQgMDtcbiAgICAgIHZhciBpbml0RHQgPSAwLjAwMDAwMTsgLy8gZGVsdGEgdGltZSAlIHZhbHVlIGZvciBpbml0VmFsIChhbGxvd3MgYW5pbWF0aW5nIG91dCBvZiBpbml0IHplcm8gb3BhY2l0eSlcblxuICAgICAgaWYgKCFmcm9tUHJvcCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gY29uc2lkZXIgcHggdmFsdWVzXG4gICAgICBpZiAobnVtYmVyJDEoZnJvbVByb3AucGZWYWx1ZSkgJiYgbnVtYmVyJDEodG9Qcm9wLnBmVmFsdWUpKSB7XG4gICAgICAgIGRpZmYgPSB0b1Byb3AucGZWYWx1ZSAtIGZyb21Qcm9wLnBmVmFsdWU7IC8vIG5vbnplcm8gaXMgdHJ1dGh5XG4gICAgICAgIGluaXRWYWwgPSBmcm9tUHJvcC5wZlZhbHVlICsgaW5pdER0ICogZGlmZjtcblxuICAgICAgICAvLyBjb25zaWRlciBudW1lcmljYWwgdmFsdWVzXG4gICAgICB9IGVsc2UgaWYgKG51bWJlciQxKGZyb21Qcm9wLnZhbHVlKSAmJiBudW1iZXIkMSh0b1Byb3AudmFsdWUpKSB7XG4gICAgICAgIGRpZmYgPSB0b1Byb3AudmFsdWUgLSBmcm9tUHJvcC52YWx1ZTsgLy8gbm9uemVybyBpcyB0cnV0aHlcbiAgICAgICAgaW5pdFZhbCA9IGZyb21Qcm9wLnZhbHVlICsgaW5pdER0ICogZGlmZjtcblxuICAgICAgICAvLyBjb25zaWRlciBjb2xvdXIgdmFsdWVzXG4gICAgICB9IGVsc2UgaWYgKGFycmF5KGZyb21Qcm9wLnZhbHVlKSAmJiBhcnJheSh0b1Byb3AudmFsdWUpKSB7XG4gICAgICAgIGRpZmYgPSBmcm9tUHJvcC52YWx1ZVswXSAhPT0gdG9Qcm9wLnZhbHVlWzBdIHx8IGZyb21Qcm9wLnZhbHVlWzFdICE9PSB0b1Byb3AudmFsdWVbMV0gfHwgZnJvbVByb3AudmFsdWVbMl0gIT09IHRvUHJvcC52YWx1ZVsyXTtcbiAgICAgICAgaW5pdFZhbCA9IGZyb21Qcm9wLnN0clZhbHVlO1xuICAgICAgfVxuXG4gICAgICAvLyB0aGUgcHJldmlvdXMgdmFsdWUgaXMgZ29vZCBmb3IgYW4gYW5pbWF0aW9uIG9ubHkgaWYgaXQncyBkaWZmZXJlbnRcbiAgICAgIGlmIChkaWZmKSB7XG4gICAgICAgIHN0eWxlW3Byb3BdID0gdG9Qcm9wLnN0clZhbHVlOyAvLyB0byB2YWxcbiAgICAgICAgdGhpcy5hcHBseUJ5cGFzcyhlbGUsIHByb3AsIGluaXRWYWwpOyAvLyBmcm9tIHZhbFxuICAgICAgICBhbnlQcmV2ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IC8vIGVuZCBpZiBwcm9wcyBhbGxvdyBhbmlcblxuICAgIC8vIGNhbid0IHRyYW5zaXRpb24gaWYgdGhlcmUncyBub3RoaW5nIHByZXZpb3VzIHRvIHRyYW5zaXRpb24gZnJvbVxuICAgIGlmICghYW55UHJldikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBfcC50cmFuc2l0aW9uaW5nID0gdHJ1ZTtcbiAgICBuZXcgUHJvbWlzZSQxKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICBpZiAoZGVsYXkgPiAwKSB7XG4gICAgICAgIGVsZS5kZWxheUFuaW1hdGlvbihkZWxheSkucGxheSgpLnByb21pc2UoKS50aGVuKHJlc29sdmUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfVxuICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGVsZS5hbmltYXRpb24oe1xuICAgICAgICBzdHlsZTogc3R5bGUsXG4gICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvbixcbiAgICAgICAgZWFzaW5nOiBlbGUucHN0eWxlKCd0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbicpLnZhbHVlLFxuICAgICAgICBxdWV1ZTogZmFsc2VcbiAgICAgIH0pLnBsYXkoKS5wcm9taXNlKCk7XG4gICAgfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBpZiggIWlzQnlwYXNzICl7XG4gICAgICBzZWxmLnJlbW92ZUJ5cGFzc2VzKGVsZSwgcHJvcHMpO1xuICAgICAgZWxlLmVtaXRBbmROb3RpZnkoJ3N0eWxlJyk7XG4gICAgICAvLyB9XG5cbiAgICAgIF9wLnRyYW5zaXRpb25pbmcgPSBmYWxzZTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChfcC50cmFuc2l0aW9uaW5nKSB7XG4gICAgdGhpcy5yZW1vdmVCeXBhc3NlcyhlbGUsIHByb3BzKTtcbiAgICBlbGUuZW1pdEFuZE5vdGlmeSgnc3R5bGUnKTtcbiAgICBfcC50cmFuc2l0aW9uaW5nID0gZmFsc2U7XG4gIH1cbn07XG5zdHlmbiQ4LmNoZWNrVHJpZ2dlciA9IGZ1bmN0aW9uIChlbGUsIG5hbWUsIGZyb21WYWx1ZSwgdG9WYWx1ZSwgZ2V0VHJpZ2dlciwgb25UcmlnZ2VyKSB7XG4gIHZhciBwcm9wID0gdGhpcy5wcm9wZXJ0aWVzW25hbWVdO1xuICB2YXIgdHJpZ2dlckNoZWNrID0gZ2V0VHJpZ2dlcihwcm9wKTtcbiAgaWYgKGVsZS5yZW1vdmVkKCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHRyaWdnZXJDaGVjayAhPSBudWxsICYmIHRyaWdnZXJDaGVjayhmcm9tVmFsdWUsIHRvVmFsdWUsIGVsZSkpIHtcbiAgICBvblRyaWdnZXIocHJvcCk7XG4gIH1cbn07XG5zdHlmbiQ4LmNoZWNrWk9yZGVyVHJpZ2dlciA9IGZ1bmN0aW9uIChlbGUsIG5hbWUsIGZyb21WYWx1ZSwgdG9WYWx1ZSkge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuICB0aGlzLmNoZWNrVHJpZ2dlcihlbGUsIG5hbWUsIGZyb21WYWx1ZSwgdG9WYWx1ZSwgZnVuY3Rpb24gKHByb3ApIHtcbiAgICByZXR1cm4gcHJvcC50cmlnZ2Vyc1pPcmRlcjtcbiAgfSwgZnVuY3Rpb24gKCkge1xuICAgIF90aGlzLl9wcml2YXRlLmN5Lm5vdGlmeSgnem9yZGVyJywgZWxlKTtcbiAgfSk7XG59O1xuc3R5Zm4kOC5jaGVja0JvdW5kc1RyaWdnZXIgPSBmdW5jdGlvbiAoZWxlLCBuYW1lLCBmcm9tVmFsdWUsIHRvVmFsdWUpIHtcbiAgdGhpcy5jaGVja1RyaWdnZXIoZWxlLCBuYW1lLCBmcm9tVmFsdWUsIHRvVmFsdWUsIGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgcmV0dXJuIHByb3AudHJpZ2dlcnNCb3VuZHM7XG4gIH0sIGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgZWxlLmRpcnR5Q29tcG91bmRCb3VuZHNDYWNoZSgpO1xuICAgIGVsZS5kaXJ0eUJvdW5kaW5nQm94Q2FjaGUoKTtcbiAgfSk7XG59O1xuc3R5Zm4kOC5jaGVja0Nvbm5lY3RlZEVkZ2VzQm91bmRzVHJpZ2dlciA9IGZ1bmN0aW9uIChlbGUsIG5hbWUsIGZyb21WYWx1ZSwgdG9WYWx1ZSkge1xuICB0aGlzLmNoZWNrVHJpZ2dlcihlbGUsIG5hbWUsIGZyb21WYWx1ZSwgdG9WYWx1ZSwgZnVuY3Rpb24gKHByb3ApIHtcbiAgICByZXR1cm4gcHJvcC50cmlnZ2Vyc0JvdW5kc09mQ29ubmVjdGVkRWRnZXM7XG4gIH0sIGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgZWxlLmNvbm5lY3RlZEVkZ2VzKCkuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgZWRnZS5kaXJ0eUJvdW5kaW5nQm94Q2FjaGUoKTtcbiAgICB9KTtcbiAgfSk7XG59O1xuc3R5Zm4kOC5jaGVja1BhcmFsbGVsRWRnZXNCb3VuZHNUcmlnZ2VyID0gZnVuY3Rpb24gKGVsZSwgbmFtZSwgZnJvbVZhbHVlLCB0b1ZhbHVlKSB7XG4gIHRoaXMuY2hlY2tUcmlnZ2VyKGVsZSwgbmFtZSwgZnJvbVZhbHVlLCB0b1ZhbHVlLCBmdW5jdGlvbiAocHJvcCkge1xuICAgIHJldHVybiBwcm9wLnRyaWdnZXJzQm91bmRzT2ZQYXJhbGxlbEVkZ2VzO1xuICB9LCBmdW5jdGlvbiAocHJvcCkge1xuICAgIGVsZS5wYXJhbGxlbEVkZ2VzKCkuZm9yRWFjaChmdW5jdGlvbiAocGxsRWRnZSkge1xuICAgICAgcGxsRWRnZS5kaXJ0eUJvdW5kaW5nQm94Q2FjaGUoKTtcbiAgICB9KTtcbiAgfSk7XG59O1xuc3R5Zm4kOC5jaGVja1RyaWdnZXJzID0gZnVuY3Rpb24gKGVsZSwgbmFtZSwgZnJvbVZhbHVlLCB0b1ZhbHVlKSB7XG4gIGVsZS5kaXJ0eVN0eWxlQ2FjaGUoKTtcbiAgdGhpcy5jaGVja1pPcmRlclRyaWdnZXIoZWxlLCBuYW1lLCBmcm9tVmFsdWUsIHRvVmFsdWUpO1xuICB0aGlzLmNoZWNrQm91bmRzVHJpZ2dlcihlbGUsIG5hbWUsIGZyb21WYWx1ZSwgdG9WYWx1ZSk7XG4gIHRoaXMuY2hlY2tDb25uZWN0ZWRFZGdlc0JvdW5kc1RyaWdnZXIoZWxlLCBuYW1lLCBmcm9tVmFsdWUsIHRvVmFsdWUpO1xuICB0aGlzLmNoZWNrUGFyYWxsZWxFZGdlc0JvdW5kc1RyaWdnZXIoZWxlLCBuYW1lLCBmcm9tVmFsdWUsIHRvVmFsdWUpO1xufTtcblxudmFyIHN0eWZuJDcgPSB7fTtcblxuLy8gYnlwYXNzZXMgYXJlIGFwcGxpZWQgdG8gYW4gZXhpc3Rpbmcgc3R5bGUgb24gYW4gZWxlbWVudCwgYW5kIGp1c3QgdGFja2VkIG9uIHRlbXBvcmFyaWx5XG4vLyByZXR1cm5zIHRydWUgaWZmIGFwcGxpY2F0aW9uIHdhcyBzdWNjZXNzZnVsIGZvciBhdCBsZWFzdCAxIHNwZWNpZmllZCBwcm9wZXJ0eVxuc3R5Zm4kNy5hcHBseUJ5cGFzcyA9IGZ1bmN0aW9uIChlbGVzLCBuYW1lLCB2YWx1ZSwgdXBkYXRlVHJhbnNpdGlvbnMpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgcHJvcHMgPSBbXTtcbiAgdmFyIGlzQnlwYXNzID0gdHJ1ZTtcblxuICAvLyBwdXQgYWxsIHRoZSBwcm9wZXJ0aWVzIChjYW4gc3BlY2lmeSBvbmUgb3IgbWFueSkgaW4gYW4gYXJyYXkgYWZ0ZXIgcGFyc2luZyB0aGVtXG4gIGlmIChuYW1lID09PSAnKicgfHwgbmFtZSA9PT0gJyoqJykge1xuICAgIC8vIGFwcGx5IHRvIGFsbCBwcm9wZXJ0eSBuYW1lc1xuXG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5wcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBwcm9wID0gc2VsZi5wcm9wZXJ0aWVzW2ldO1xuICAgICAgICB2YXIgX25hbWUgPSBwcm9wLm5hbWU7XG4gICAgICAgIHZhciBwYXJzZWRQcm9wID0gdGhpcy5wYXJzZShfbmFtZSwgdmFsdWUsIHRydWUpO1xuICAgICAgICBpZiAocGFyc2VkUHJvcCkge1xuICAgICAgICAgIHByb3BzLnB1c2gocGFyc2VkUHJvcCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAoc3RyaW5nKG5hbWUpKSB7XG4gICAgLy8gdGhlbiBwYXJzZSB0aGUgc2luZ2xlIHByb3BlcnR5XG4gICAgdmFyIF9wYXJzZWRQcm9wID0gdGhpcy5wYXJzZShuYW1lLCB2YWx1ZSwgdHJ1ZSk7XG4gICAgaWYgKF9wYXJzZWRQcm9wKSB7XG4gICAgICBwcm9wcy5wdXNoKF9wYXJzZWRQcm9wKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAocGxhaW5PYmplY3QobmFtZSkpIHtcbiAgICAvLyB0aGVuIHBhcnNlIGVhY2ggcHJvcGVydHlcbiAgICB2YXIgc3BlY2lmaWVkUHJvcHMgPSBuYW1lO1xuICAgIHVwZGF0ZVRyYW5zaXRpb25zID0gdmFsdWU7XG4gICAgdmFyIG5hbWVzID0gT2JqZWN0LmtleXMoc3BlY2lmaWVkUHJvcHMpO1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBuYW1lcy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBfbmFtZTIgPSBuYW1lc1tfaV07XG4gICAgICB2YXIgX3ZhbHVlID0gc3BlY2lmaWVkUHJvcHNbX25hbWUyXTtcbiAgICAgIGlmIChfdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyB0cnkgY2FtZWwgY2FzZSBuYW1lIHRvb1xuICAgICAgICBfdmFsdWUgPSBzcGVjaWZpZWRQcm9wc1tkYXNoMmNhbWVsKF9uYW1lMildO1xuICAgICAgfVxuICAgICAgaWYgKF92YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhciBfcGFyc2VkUHJvcDIgPSB0aGlzLnBhcnNlKF9uYW1lMiwgX3ZhbHVlLCB0cnVlKTtcbiAgICAgICAgaWYgKF9wYXJzZWRQcm9wMikge1xuICAgICAgICAgIHByb3BzLnB1c2goX3BhcnNlZFByb3AyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBjYW4ndCBkbyBhbnl0aGluZyB3aXRob3V0IHdlbGwgZGVmaW5lZCBwcm9wZXJ0aWVzXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gd2UndmUgZmFpbGVkIGlmIHRoZXJlIGFyZSBubyB2YWxpZCBwcm9wZXJ0aWVzXG4gIGlmIChwcm9wcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBub3csIGFwcGx5IHRoZSBieXBhc3MgcHJvcGVydGllcyBvbiB0aGUgZWxlbWVudHNcbiAgdmFyIHJldCA9IGZhbHNlOyAvLyByZXR1cm4gdHJ1ZSBpZiBhdCBsZWFzdCBvbmUgc3VjY2VzZnVsIGJ5cGFzcyBhcHBsaWVkXG4gIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IGVsZXMubGVuZ3RoOyBfaTIrKykge1xuICAgIC8vIGZvciBlYWNoIGVsZVxuICAgIHZhciBlbGUgPSBlbGVzW19pMl07XG4gICAgdmFyIGRpZmZQcm9wcyA9IHt9O1xuICAgIHZhciBkaWZmUHJvcCA9IHZvaWQgMDtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHByb3BzLmxlbmd0aDsgaisrKSB7XG4gICAgICAvLyBmb3IgZWFjaCBwcm9wXG4gICAgICB2YXIgX3Byb3AgPSBwcm9wc1tqXTtcbiAgICAgIGlmICh1cGRhdGVUcmFuc2l0aW9ucykge1xuICAgICAgICB2YXIgcHJldlByb3AgPSBlbGUucHN0eWxlKF9wcm9wLm5hbWUpO1xuICAgICAgICBkaWZmUHJvcCA9IGRpZmZQcm9wc1tfcHJvcC5uYW1lXSA9IHtcbiAgICAgICAgICBwcmV2OiBwcmV2UHJvcFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0ID0gdGhpcy5hcHBseVBhcnNlZFByb3BlcnR5KGVsZSwgY29weShfcHJvcCkpIHx8IHJldDtcbiAgICAgIGlmICh1cGRhdGVUcmFuc2l0aW9ucykge1xuICAgICAgICBkaWZmUHJvcC5uZXh0ID0gZWxlLnBzdHlsZShfcHJvcC5uYW1lKTtcbiAgICAgIH1cbiAgICB9IC8vIGZvciBwcm9wc1xuXG4gICAgaWYgKHJldCkge1xuICAgICAgdGhpcy51cGRhdGVTdHlsZUhpbnRzKGVsZSk7XG4gICAgfVxuICAgIGlmICh1cGRhdGVUcmFuc2l0aW9ucykge1xuICAgICAgdGhpcy51cGRhdGVUcmFuc2l0aW9ucyhlbGUsIGRpZmZQcm9wcywgaXNCeXBhc3MpO1xuICAgIH1cbiAgfSAvLyBmb3IgZWxlc1xuXG4gIHJldHVybiByZXQ7XG59O1xuXG4vLyBvbmx5IHVzZWZ1bCBpbiBzcGVjaWZpYyBjYXNlcyBsaWtlIGFuaW1hdGlvblxuc3R5Zm4kNy5vdmVycmlkZUJ5cGFzcyA9IGZ1bmN0aW9uIChlbGVzLCBuYW1lLCB2YWx1ZSkge1xuICBuYW1lID0gY2FtZWwyZGFzaChuYW1lKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgdmFyIHByb3AgPSBlbGUuX3ByaXZhdGUuc3R5bGVbbmFtZV07XG4gICAgdmFyIHR5cGUgPSB0aGlzLnByb3BlcnRpZXNbbmFtZV0udHlwZTtcbiAgICB2YXIgaXNDb2xvciA9IHR5cGUuY29sb3I7XG4gICAgdmFyIGlzTXVsdGkgPSB0eXBlLm11dGlwbGU7XG4gICAgdmFyIG9sZFZhbHVlID0gIXByb3AgPyBudWxsIDogcHJvcC5wZlZhbHVlICE9IG51bGwgPyBwcm9wLnBmVmFsdWUgOiBwcm9wLnZhbHVlO1xuICAgIGlmICghcHJvcCB8fCAhcHJvcC5ieXBhc3MpIHtcbiAgICAgIC8vIG5lZWQgYSBieXBhc3MgaWYgb25lIGRvZXNuJ3QgZXhpc3RcbiAgICAgIHRoaXMuYXBwbHlCeXBhc3MoZWxlLCBuYW1lLCB2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb3AudmFsdWUgPSB2YWx1ZTtcbiAgICAgIGlmIChwcm9wLnBmVmFsdWUgIT0gbnVsbCkge1xuICAgICAgICBwcm9wLnBmVmFsdWUgPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0NvbG9yKSB7XG4gICAgICAgIHByb3Auc3RyVmFsdWUgPSAncmdiKCcgKyB2YWx1ZS5qb2luKCcsJykgKyAnKSc7XG4gICAgICB9IGVsc2UgaWYgKGlzTXVsdGkpIHtcbiAgICAgICAgcHJvcC5zdHJWYWx1ZSA9IHZhbHVlLmpvaW4oJyAnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByb3Auc3RyVmFsdWUgPSAnJyArIHZhbHVlO1xuICAgICAgfVxuICAgICAgdGhpcy51cGRhdGVTdHlsZUhpbnRzKGVsZSk7XG4gICAgfVxuICAgIHRoaXMuY2hlY2tUcmlnZ2VycyhlbGUsIG5hbWUsIG9sZFZhbHVlLCB2YWx1ZSk7XG4gIH1cbn07XG5zdHlmbiQ3LnJlbW92ZUFsbEJ5cGFzc2VzID0gZnVuY3Rpb24gKGVsZXMsIHVwZGF0ZVRyYW5zaXRpb25zKSB7XG4gIHJldHVybiB0aGlzLnJlbW92ZUJ5cGFzc2VzKGVsZXMsIHRoaXMucHJvcGVydHlOYW1lcywgdXBkYXRlVHJhbnNpdGlvbnMpO1xufTtcbnN0eWZuJDcucmVtb3ZlQnlwYXNzZXMgPSBmdW5jdGlvbiAoZWxlcywgcHJvcHMsIHVwZGF0ZVRyYW5zaXRpb25zKSB7XG4gIHZhciBpc0J5cGFzcyA9IHRydWU7XG4gIGZvciAodmFyIGogPSAwOyBqIDwgZWxlcy5sZW5ndGg7IGorKykge1xuICAgIHZhciBlbGUgPSBlbGVzW2pdO1xuICAgIHZhciBkaWZmUHJvcHMgPSB7fTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbmFtZSA9IHByb3BzW2ldO1xuICAgICAgdmFyIHByb3AgPSB0aGlzLnByb3BlcnRpZXNbbmFtZV07XG4gICAgICB2YXIgcHJldlByb3AgPSBlbGUucHN0eWxlKHByb3AubmFtZSk7XG4gICAgICBpZiAoIXByZXZQcm9wIHx8ICFwcmV2UHJvcC5ieXBhc3MpIHtcbiAgICAgICAgLy8gaWYgYSBieXBhc3MgZG9lc24ndCBleGlzdCBmb3IgdGhlIHByb3AsIG5vdGhpbmcgbmVlZHMgdG8gYmUgcmVtb3ZlZFxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciB2YWx1ZSA9ICcnOyAvLyBlbXB0eSA9PiByZW1vdmUgYnlwYXNzXG4gICAgICB2YXIgcGFyc2VkUHJvcCA9IHRoaXMucGFyc2UobmFtZSwgdmFsdWUsIHRydWUpO1xuICAgICAgdmFyIGRpZmZQcm9wID0gZGlmZlByb3BzW3Byb3AubmFtZV0gPSB7XG4gICAgICAgIHByZXY6IHByZXZQcm9wXG4gICAgICB9O1xuICAgICAgdGhpcy5hcHBseVBhcnNlZFByb3BlcnR5KGVsZSwgcGFyc2VkUHJvcCk7XG4gICAgICBkaWZmUHJvcC5uZXh0ID0gZWxlLnBzdHlsZShwcm9wLm5hbWUpO1xuICAgIH0gLy8gZm9yIHByb3BzXG5cbiAgICB0aGlzLnVwZGF0ZVN0eWxlSGludHMoZWxlKTtcbiAgICBpZiAodXBkYXRlVHJhbnNpdGlvbnMpIHtcbiAgICAgIHRoaXMudXBkYXRlVHJhbnNpdGlvbnMoZWxlLCBkaWZmUHJvcHMsIGlzQnlwYXNzKTtcbiAgICB9XG4gIH0gLy8gZm9yIGVsZXNcbn07XG5cbnZhciBzdHlmbiQ2ID0ge307XG5cbi8vIGdldHMgd2hhdCBhbiBlbSBzaXplIGNvcnJlc3BvbmRzIHRvIGluIHBpeGVscyByZWxhdGl2ZSB0byBhIGRvbSBlbGVtZW50XG5zdHlmbiQ2LmdldEVtU2l6ZUluUGl4ZWxzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgcHggPSB0aGlzLmNvbnRhaW5lckNzcygnZm9udC1zaXplJyk7XG4gIGlmIChweCAhPSBudWxsKSB7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQocHgpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAxOyAvLyBmb3IgaGVhZGxlc3NcbiAgfVxufTtcblxuLy8gZ2V0cyBjc3MgcHJvcGVydHkgZnJvbSB0aGUgY29yZSBjb250YWluZXJcbnN0eWZuJDYuY29udGFpbmVyQ3NzID0gZnVuY3Rpb24gKHByb3BOYW1lKSB7XG4gIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3k7XG4gIHZhciBkb21FbGVtZW50ID0gY3kuY29udGFpbmVyKCk7XG4gIHZhciBjb250YWluZXJXaW5kb3cgPSBjeS53aW5kb3coKTtcbiAgaWYgKGNvbnRhaW5lcldpbmRvdyAmJiBkb21FbGVtZW50ICYmIGNvbnRhaW5lcldpbmRvdy5nZXRDb21wdXRlZFN0eWxlKSB7XG4gICAgcmV0dXJuIGNvbnRhaW5lcldpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvbUVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUocHJvcE5hbWUpO1xuICB9XG59O1xuXG52YXIgc3R5Zm4kNSA9IHt9O1xuXG4vLyBnZXRzIHRoZSByZW5kZXJlZCBzdHlsZSBmb3IgYW4gZWxlbWVudFxuc3R5Zm4kNS5nZXRSZW5kZXJlZFN0eWxlID0gZnVuY3Rpb24gKGVsZSwgcHJvcCkge1xuICBpZiAocHJvcCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0eWxlUHJvcGVydHlWYWx1ZShlbGUsIHByb3AsIHRydWUpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB0aGlzLmdldFJhd1N0eWxlKGVsZSwgdHJ1ZSk7XG4gIH1cbn07XG5cbi8vIGdldHMgdGhlIHJhdyBzdHlsZSBmb3IgYW4gZWxlbWVudFxuc3R5Zm4kNS5nZXRSYXdTdHlsZSA9IGZ1bmN0aW9uIChlbGUsIGlzUmVuZGVyZWRWYWwpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBlbGUgPSBlbGVbMF07IC8vIGluc3VyZSBpdCdzIGFuIGVsZW1lbnRcblxuICBpZiAoZWxlKSB7XG4gICAgdmFyIHJzdHlsZSA9IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5wcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcHJvcCA9IHNlbGYucHJvcGVydGllc1tpXTtcbiAgICAgIHZhciB2YWwgPSBzZWxmLmdldFN0eWxlUHJvcGVydHlWYWx1ZShlbGUsIHByb3AubmFtZSwgaXNSZW5kZXJlZFZhbCk7XG4gICAgICBpZiAodmFsICE9IG51bGwpIHtcbiAgICAgICAgcnN0eWxlW3Byb3AubmFtZV0gPSB2YWw7XG4gICAgICAgIHJzdHlsZVtkYXNoMmNhbWVsKHByb3AubmFtZSldID0gdmFsO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcnN0eWxlO1xuICB9XG59O1xuc3R5Zm4kNS5nZXRJbmRleGVkU3R5bGUgPSBmdW5jdGlvbiAoZWxlLCBwcm9wZXJ0eSwgc3VicHJvcGVydHksIGluZGV4KSB7XG4gIHZhciBwc3R5bGUgPSBlbGUucHN0eWxlKHByb3BlcnR5KVtzdWJwcm9wZXJ0eV1baW5kZXhdO1xuICByZXR1cm4gcHN0eWxlICE9IG51bGwgPyBwc3R5bGUgOiBlbGUuY3koKS5zdHlsZSgpLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eSlbc3VicHJvcGVydHldWzBdO1xufTtcbnN0eWZuJDUuZ2V0U3R5bGVQcm9wZXJ0eVZhbHVlID0gZnVuY3Rpb24gKGVsZSwgcHJvcE5hbWUsIGlzUmVuZGVyZWRWYWwpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBlbGUgPSBlbGVbMF07IC8vIGluc3VyZSBpdCdzIGFuIGVsZW1lbnRcblxuICBpZiAoZWxlKSB7XG4gICAgdmFyIHByb3AgPSBzZWxmLnByb3BlcnRpZXNbcHJvcE5hbWVdO1xuICAgIGlmIChwcm9wLmFsaWFzKSB7XG4gICAgICBwcm9wID0gcHJvcC5wb2ludHNUbztcbiAgICB9XG4gICAgdmFyIHR5cGUgPSBwcm9wLnR5cGU7XG4gICAgdmFyIHN0eWxlUHJvcCA9IGVsZS5wc3R5bGUocHJvcC5uYW1lKTtcbiAgICBpZiAoc3R5bGVQcm9wKSB7XG4gICAgICB2YXIgdmFsdWUgPSBzdHlsZVByb3AudmFsdWUsXG4gICAgICAgIHVuaXRzID0gc3R5bGVQcm9wLnVuaXRzLFxuICAgICAgICBzdHJWYWx1ZSA9IHN0eWxlUHJvcC5zdHJWYWx1ZTtcbiAgICAgIGlmIChpc1JlbmRlcmVkVmFsICYmIHR5cGUubnVtYmVyICYmIHZhbHVlICE9IG51bGwgJiYgbnVtYmVyJDEodmFsdWUpKSB7XG4gICAgICAgIHZhciB6b29tID0gZWxlLmN5KCkuem9vbSgpO1xuICAgICAgICB2YXIgZ2V0UmVuZGVyZWRWYWx1ZSA9IGZ1bmN0aW9uIGdldFJlbmRlcmVkVmFsdWUodmFsKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbCAqIHpvb207XG4gICAgICAgIH07XG4gICAgICAgIHZhciBnZXRWYWx1ZVN0cmluZ1dpdGhVbml0cyA9IGZ1bmN0aW9uIGdldFZhbHVlU3RyaW5nV2l0aFVuaXRzKHZhbCwgdW5pdHMpIHtcbiAgICAgICAgICByZXR1cm4gZ2V0UmVuZGVyZWRWYWx1ZSh2YWwpICsgdW5pdHM7XG4gICAgICAgIH07XG4gICAgICAgIHZhciBpc0FycmF5VmFsdWUgPSBhcnJheSh2YWx1ZSk7XG4gICAgICAgIHZhciBoYXZlVW5pdHMgPSBpc0FycmF5VmFsdWUgPyB1bml0cy5ldmVyeShmdW5jdGlvbiAodSkge1xuICAgICAgICAgIHJldHVybiB1ICE9IG51bGw7XG4gICAgICAgIH0pIDogdW5pdHMgIT0gbnVsbDtcbiAgICAgICAgaWYgKGhhdmVVbml0cykge1xuICAgICAgICAgIGlmIChpc0FycmF5VmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5tYXAoZnVuY3Rpb24gKHYsIGkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGdldFZhbHVlU3RyaW5nV2l0aFVuaXRzKHYsIHVuaXRzW2ldKTtcbiAgICAgICAgICAgIH0pLmpvaW4oJyAnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGdldFZhbHVlU3RyaW5nV2l0aFVuaXRzKHZhbHVlLCB1bml0cyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChpc0FycmF5VmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5tYXAoZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHN0cmluZyh2KSA/IHYgOiAnJyArIGdldFJlbmRlcmVkVmFsdWUodik7XG4gICAgICAgICAgICB9KS5qb2luKCcgJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAnJyArIGdldFJlbmRlcmVkVmFsdWUodmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzdHJWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgIHJldHVybiBzdHJWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn07XG5zdHlmbiQ1LmdldEFuaW1hdGlvblN0YXJ0U3R5bGUgPSBmdW5jdGlvbiAoZWxlLCBhbmlQcm9wcykge1xuICB2YXIgcnN0eWxlID0ge307XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYW5pUHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgYW5pUHJvcCA9IGFuaVByb3BzW2ldO1xuICAgIHZhciBuYW1lID0gYW5pUHJvcC5uYW1lO1xuICAgIHZhciBzdHlsZVByb3AgPSBlbGUucHN0eWxlKG5hbWUpO1xuICAgIGlmIChzdHlsZVByb3AgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gdGhlbiBtYWtlIGEgcHJvcCBvZiBpdFxuICAgICAgaWYgKHBsYWluT2JqZWN0KHN0eWxlUHJvcCkpIHtcbiAgICAgICAgc3R5bGVQcm9wID0gdGhpcy5wYXJzZShuYW1lLCBzdHlsZVByb3Auc3RyVmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3R5bGVQcm9wID0gdGhpcy5wYXJzZShuYW1lLCBzdHlsZVByb3ApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3R5bGVQcm9wKSB7XG4gICAgICByc3R5bGVbbmFtZV0gPSBzdHlsZVByb3A7XG4gICAgfVxuICB9XG4gIHJldHVybiByc3R5bGU7XG59O1xuc3R5Zm4kNS5nZXRQcm9wc0xpc3QgPSBmdW5jdGlvbiAocHJvcHNPYmopIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgcnN0eWxlID0gW107XG4gIHZhciBzdHlsZSA9IHByb3BzT2JqO1xuICB2YXIgcHJvcHMgPSBzZWxmLnByb3BlcnRpZXM7XG4gIGlmIChzdHlsZSkge1xuICAgIHZhciBuYW1lcyA9IE9iamVjdC5rZXlzKHN0eWxlKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbmFtZSA9IG5hbWVzW2ldO1xuICAgICAgdmFyIHZhbCA9IHN0eWxlW25hbWVdO1xuICAgICAgdmFyIHByb3AgPSBwcm9wc1tuYW1lXSB8fCBwcm9wc1tjYW1lbDJkYXNoKG5hbWUpXTtcbiAgICAgIHZhciBzdHlsZVByb3AgPSB0aGlzLnBhcnNlKHByb3AubmFtZSwgdmFsKTtcbiAgICAgIGlmIChzdHlsZVByb3ApIHtcbiAgICAgICAgcnN0eWxlLnB1c2goc3R5bGVQcm9wKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJzdHlsZTtcbn07XG5zdHlmbiQ1LmdldE5vbkRlZmF1bHRQcm9wZXJ0aWVzSGFzaCA9IGZ1bmN0aW9uIChlbGUsIHByb3BOYW1lcywgc2VlZCkge1xuICB2YXIgaGFzaCA9IHNlZWQuc2xpY2UoKTtcbiAgdmFyIG5hbWUsIHZhbCwgc3RyVmFsLCBjaFZhbDtcbiAgdmFyIGksIGo7XG4gIGZvciAoaSA9IDA7IGkgPCBwcm9wTmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICBuYW1lID0gcHJvcE5hbWVzW2ldO1xuICAgIHZhbCA9IGVsZS5wc3R5bGUobmFtZSwgZmFsc2UpO1xuICAgIGlmICh2YWwgPT0gbnVsbCkge1xuICAgICAgY29udGludWU7XG4gICAgfSBlbHNlIGlmICh2YWwucGZWYWx1ZSAhPSBudWxsKSB7XG4gICAgICBoYXNoWzBdID0gaGFzaEludChjaFZhbCwgaGFzaFswXSk7XG4gICAgICBoYXNoWzFdID0gaGFzaEludEFsdChjaFZhbCwgaGFzaFsxXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0clZhbCA9IHZhbC5zdHJWYWx1ZTtcbiAgICAgIGZvciAoaiA9IDA7IGogPCBzdHJWYWwubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgY2hWYWwgPSBzdHJWYWwuY2hhckNvZGVBdChqKTtcbiAgICAgICAgaGFzaFswXSA9IGhhc2hJbnQoY2hWYWwsIGhhc2hbMF0pO1xuICAgICAgICBoYXNoWzFdID0gaGFzaEludEFsdChjaFZhbCwgaGFzaFsxXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBoYXNoO1xufTtcbnN0eWZuJDUuZ2V0UHJvcGVydGllc0hhc2ggPSBzdHlmbiQ1LmdldE5vbkRlZmF1bHRQcm9wZXJ0aWVzSGFzaDtcblxudmFyIHN0eWZuJDQgPSB7fTtcbnN0eWZuJDQuYXBwZW5kRnJvbUpzb24gPSBmdW5jdGlvbiAoanNvbikge1xuICB2YXIgc3R5bGUgPSB0aGlzO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGpzb24ubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgY29udGV4dCA9IGpzb25baV07XG4gICAgdmFyIHNlbGVjdG9yID0gY29udGV4dC5zZWxlY3RvcjtcbiAgICB2YXIgcHJvcHMgPSBjb250ZXh0LnN0eWxlIHx8IGNvbnRleHQuY3NzO1xuICAgIHZhciBuYW1lcyA9IE9iamVjdC5rZXlzKHByb3BzKTtcbiAgICBzdHlsZS5zZWxlY3RvcihzZWxlY3Rvcik7IC8vIGFwcGx5IHNlbGVjdG9yXG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG5hbWVzLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgbmFtZSA9IG5hbWVzW2pdO1xuICAgICAgdmFyIHZhbHVlID0gcHJvcHNbbmFtZV07XG4gICAgICBzdHlsZS5jc3MobmFtZSwgdmFsdWUpOyAvLyBhcHBseSBwcm9wZXJ0eVxuICAgIH1cbiAgfVxuICByZXR1cm4gc3R5bGU7XG59O1xuXG4vLyBhY2Nlc3NpYmxlIGN5LnN0eWxlKCkgZnVuY3Rpb25cbnN0eWZuJDQuZnJvbUpzb24gPSBmdW5jdGlvbiAoanNvbikge1xuICB2YXIgc3R5bGUgPSB0aGlzO1xuICBzdHlsZS5yZXNldFRvRGVmYXVsdCgpO1xuICBzdHlsZS5hcHBlbmRGcm9tSnNvbihqc29uKTtcbiAgcmV0dXJuIHN0eWxlO1xufTtcblxuLy8gZ2V0IGpzb24gZnJvbSBjeS5zdHlsZSgpIGFwaVxuc3R5Zm4kNC5qc29uID0gZnVuY3Rpb24gKCkge1xuICB2YXIganNvbiA9IFtdO1xuICBmb3IgKHZhciBpID0gdGhpcy5kZWZhdWx0TGVuZ3RoOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjeHQgPSB0aGlzW2ldO1xuICAgIHZhciBzZWxlY3RvciA9IGN4dC5zZWxlY3RvcjtcbiAgICB2YXIgcHJvcHMgPSBjeHQucHJvcGVydGllcztcbiAgICB2YXIgY3NzID0ge307XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBwcm9wcy5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIHByb3AgPSBwcm9wc1tqXTtcbiAgICAgIGNzc1twcm9wLm5hbWVdID0gcHJvcC5zdHJWYWx1ZTtcbiAgICB9XG4gICAganNvbi5wdXNoKHtcbiAgICAgIHNlbGVjdG9yOiAhc2VsZWN0b3IgPyAnY29yZScgOiBzZWxlY3Rvci50b1N0cmluZygpLFxuICAgICAgc3R5bGU6IGNzc1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBqc29uO1xufTtcblxudmFyIHN0eWZuJDMgPSB7fTtcbnN0eWZuJDMuYXBwZW5kRnJvbVN0cmluZyA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgc3R5bGUgPSB0aGlzO1xuICB2YXIgcmVtYWluaW5nID0gJycgKyBzdHJpbmc7XG4gIHZhciBzZWxBbmRCbG9ja1N0cjtcbiAgdmFyIGJsb2NrUmVtO1xuICB2YXIgcHJvcEFuZFZhbFN0cjtcblxuICAvLyByZW1vdmUgY29tbWVudHMgZnJvbSB0aGUgc3R5bGUgc3RyaW5nXG4gIHJlbWFpbmluZyA9IHJlbWFpbmluZy5yZXBsYWNlKC9bL11bKl0oXFxzfC4pKz9bKl1bL10vZywgJycpO1xuICBmdW5jdGlvbiByZW1vdmVTZWxBbmRCbG9ja0Zyb21SZW1haW5pbmcoKSB7XG4gICAgLy8gcmVtb3ZlIHRoZSBwYXJzZWQgc2VsZWN0b3IgYW5kIGJsb2NrIGZyb20gdGhlIHJlbWFpbmluZyB0ZXh0IHRvIHBhcnNlXG4gICAgaWYgKHJlbWFpbmluZy5sZW5ndGggPiBzZWxBbmRCbG9ja1N0ci5sZW5ndGgpIHtcbiAgICAgIHJlbWFpbmluZyA9IHJlbWFpbmluZy5zdWJzdHIoc2VsQW5kQmxvY2tTdHIubGVuZ3RoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVtYWluaW5nID0gJyc7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHJlbW92ZVByb3BBbmRWYWxGcm9tUmVtKCkge1xuICAgIC8vIHJlbW92ZSB0aGUgcGFyc2VkIHByb3BlcnR5IGFuZCB2YWx1ZSBmcm9tIHRoZSByZW1haW5pbmcgYmxvY2sgdGV4dCB0byBwYXJzZVxuICAgIGlmIChibG9ja1JlbS5sZW5ndGggPiBwcm9wQW5kVmFsU3RyLmxlbmd0aCkge1xuICAgICAgYmxvY2tSZW0gPSBibG9ja1JlbS5zdWJzdHIocHJvcEFuZFZhbFN0ci5sZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBibG9ja1JlbSA9ICcnO1xuICAgIH1cbiAgfVxuICBmb3IgKDs7KSB7XG4gICAgdmFyIG5vdGhpbmdMZWZ0VG9QYXJzZSA9IHJlbWFpbmluZy5tYXRjaCgvXlxccyokLyk7XG4gICAgaWYgKG5vdGhpbmdMZWZ0VG9QYXJzZSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHZhciBzZWxBbmRCbG9jayA9IHJlbWFpbmluZy5tYXRjaCgvXlxccyooKD86LnxcXHMpKz8pXFxzKlxceygoPzoufFxccykrPylcXH0vKTtcbiAgICBpZiAoIXNlbEFuZEJsb2NrKSB7XG4gICAgICB3YXJuKCdIYWx0aW5nIHN0eWxlc2hlZXQgcGFyc2luZzogU3RyaW5nIHN0eWxlc2hlZXQgY29udGFpbnMgbW9yZSB0byBwYXJzZSBidXQgbm8gc2VsZWN0b3IgYW5kIGJsb2NrIGZvdW5kIGluOiAnICsgcmVtYWluaW5nKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBzZWxBbmRCbG9ja1N0ciA9IHNlbEFuZEJsb2NrWzBdO1xuXG4gICAgLy8gcGFyc2UgdGhlIHNlbGVjdG9yXG4gICAgdmFyIHNlbGVjdG9yU3RyID0gc2VsQW5kQmxvY2tbMV07XG4gICAgaWYgKHNlbGVjdG9yU3RyICE9PSAnY29yZScpIHtcbiAgICAgIHZhciBzZWxlY3RvciA9IG5ldyBTZWxlY3RvcihzZWxlY3RvclN0cik7XG4gICAgICBpZiAoc2VsZWN0b3IuaW52YWxpZCkge1xuICAgICAgICB3YXJuKCdTa2lwcGluZyBwYXJzaW5nIG9mIGJsb2NrOiBJbnZhbGlkIHNlbGVjdG9yIGZvdW5kIGluIHN0cmluZyBzdHlsZXNoZWV0OiAnICsgc2VsZWN0b3JTdHIpO1xuXG4gICAgICAgIC8vIHNraXAgdGhpcyBzZWxlY3RvciBhbmQgYmxvY2tcbiAgICAgICAgcmVtb3ZlU2VsQW5kQmxvY2tGcm9tUmVtYWluaW5nKCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHBhcnNlIHRoZSBibG9jayBvZiBwcm9wZXJ0aWVzIGFuZCB2YWx1ZXNcbiAgICB2YXIgYmxvY2tTdHIgPSBzZWxBbmRCbG9ja1syXTtcbiAgICB2YXIgaW52YWxpZEJsb2NrID0gZmFsc2U7XG4gICAgYmxvY2tSZW0gPSBibG9ja1N0cjtcbiAgICB2YXIgcHJvcHMgPSBbXTtcbiAgICBmb3IgKDs7KSB7XG4gICAgICB2YXIgX25vdGhpbmdMZWZ0VG9QYXJzZSA9IGJsb2NrUmVtLm1hdGNoKC9eXFxzKiQvKTtcbiAgICAgIGlmIChfbm90aGluZ0xlZnRUb1BhcnNlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgdmFyIHByb3BBbmRWYWwgPSBibG9ja1JlbS5tYXRjaCgvXlxccyooLis/KVxccyo6XFxzKiguKz8pKD86XFxzKjt8XFxzKiQpLyk7XG4gICAgICBpZiAoIXByb3BBbmRWYWwpIHtcbiAgICAgICAgd2FybignU2tpcHBpbmcgcGFyc2luZyBvZiBibG9jazogSW52YWxpZCBmb3JtYXR0aW5nIG9mIHN0eWxlIHByb3BlcnR5IGFuZCB2YWx1ZSBkZWZpbml0aW9ucyBmb3VuZCBpbjonICsgYmxvY2tTdHIpO1xuICAgICAgICBpbnZhbGlkQmxvY2sgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHByb3BBbmRWYWxTdHIgPSBwcm9wQW5kVmFsWzBdO1xuICAgICAgdmFyIHByb3BTdHIgPSBwcm9wQW5kVmFsWzFdO1xuICAgICAgdmFyIHZhbFN0ciA9IHByb3BBbmRWYWxbMl07XG4gICAgICB2YXIgcHJvcCA9IHNlbGYucHJvcGVydGllc1twcm9wU3RyXTtcbiAgICAgIGlmICghcHJvcCkge1xuICAgICAgICB3YXJuKCdTa2lwcGluZyBwcm9wZXJ0eTogSW52YWxpZCBwcm9wZXJ0eSBuYW1lIGluOiAnICsgcHJvcEFuZFZhbFN0cik7XG5cbiAgICAgICAgLy8gc2tpcCB0aGlzIHByb3BlcnR5IGluIHRoZSBibG9ja1xuICAgICAgICByZW1vdmVQcm9wQW5kVmFsRnJvbVJlbSgpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBwYXJzZWRQcm9wID0gc3R5bGUucGFyc2UocHJvcFN0ciwgdmFsU3RyKTtcbiAgICAgIGlmICghcGFyc2VkUHJvcCkge1xuICAgICAgICB3YXJuKCdTa2lwcGluZyBwcm9wZXJ0eTogSW52YWxpZCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluOiAnICsgcHJvcEFuZFZhbFN0cik7XG5cbiAgICAgICAgLy8gc2tpcCB0aGlzIHByb3BlcnR5IGluIHRoZSBibG9ja1xuICAgICAgICByZW1vdmVQcm9wQW5kVmFsRnJvbVJlbSgpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHByb3BzLnB1c2goe1xuICAgICAgICBuYW1lOiBwcm9wU3RyLFxuICAgICAgICB2YWw6IHZhbFN0clxuICAgICAgfSk7XG4gICAgICByZW1vdmVQcm9wQW5kVmFsRnJvbVJlbSgpO1xuICAgIH1cbiAgICBpZiAoaW52YWxpZEJsb2NrKSB7XG4gICAgICByZW1vdmVTZWxBbmRCbG9ja0Zyb21SZW1haW5pbmcoKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIC8vIHB1dCB0aGUgcGFyc2VkIGJsb2NrIGluIHRoZSBzdHlsZVxuICAgIHN0eWxlLnNlbGVjdG9yKHNlbGVjdG9yU3RyKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgX3Byb3AgPSBwcm9wc1tpXTtcbiAgICAgIHN0eWxlLmNzcyhfcHJvcC5uYW1lLCBfcHJvcC52YWwpO1xuICAgIH1cbiAgICByZW1vdmVTZWxBbmRCbG9ja0Zyb21SZW1haW5pbmcoKTtcbiAgfVxuICByZXR1cm4gc3R5bGU7XG59O1xuc3R5Zm4kMy5mcm9tU3RyaW5nID0gZnVuY3Rpb24gKHN0cmluZykge1xuICB2YXIgc3R5bGUgPSB0aGlzO1xuICBzdHlsZS5yZXNldFRvRGVmYXVsdCgpO1xuICBzdHlsZS5hcHBlbmRGcm9tU3RyaW5nKHN0cmluZyk7XG4gIHJldHVybiBzdHlsZTtcbn07XG5cbnZhciBzdHlmbiQyID0ge307XG4oZnVuY3Rpb24gKCkge1xuICB2YXIgbnVtYmVyJDEgPSBudW1iZXI7XG4gIHZhciByZ2JhID0gcmdiYU5vQmFja1JlZnM7XG4gIHZhciBoc2xhID0gaHNsYU5vQmFja1JlZnM7XG4gIHZhciBoZXgzJDEgPSBoZXgzO1xuICB2YXIgaGV4NiQxID0gaGV4NjtcbiAgdmFyIGRhdGEgPSBmdW5jdGlvbiBkYXRhKHByZWZpeCkge1xuICAgIHJldHVybiAnXicgKyBwcmVmaXggKyAnXFxcXHMqXFxcXChcXFxccyooW1xcXFx3XFxcXC5dKylcXFxccypcXFxcKSQnO1xuICB9O1xuICB2YXIgbWFwRGF0YSA9IGZ1bmN0aW9uIG1hcERhdGEocHJlZml4KSB7XG4gICAgdmFyIG1hcEFyZyA9IG51bWJlciQxICsgJ3xcXFxcdyt8JyArIHJnYmEgKyAnfCcgKyBoc2xhICsgJ3wnICsgaGV4MyQxICsgJ3wnICsgaGV4NiQxO1xuICAgIHJldHVybiAnXicgKyBwcmVmaXggKyAnXFxcXHMqXFxcXCgoW1xcXFx3XFxcXC5dKylcXFxccypcXFxcLFxcXFxzKignICsgbnVtYmVyJDEgKyAnKVxcXFxzKlxcXFwsXFxcXHMqKCcgKyBudW1iZXIkMSArICcpXFxcXHMqLFxcXFxzKignICsgbWFwQXJnICsgJylcXFxccypcXFxcLFxcXFxzKignICsgbWFwQXJnICsgJylcXFxcKSQnO1xuICB9O1xuICB2YXIgdXJsUmVnZXhlcyA9IFsnXnVybFxcXFxzKlxcXFwoXFxcXHMqW1xcJ1wiXT8oLis/KVtcXCdcIl0/XFxcXHMqXFxcXCkkJywgJ14obm9uZSkkJywgJ14oLispJCddO1xuXG4gIC8vIGVhY2ggdmlzdWFsIHN0eWxlIHByb3BlcnR5IGhhcyBhIHR5cGUgYW5kIG5lZWRzIHRvIGJlIHZhbGlkYXRlZCBhY2NvcmRpbmcgdG8gaXRcbiAgc3R5Zm4kMi50eXBlcyA9IHtcbiAgICB0aW1lOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICBtaW46IDAsXG4gICAgICB1bml0czogJ3N8bXMnLFxuICAgICAgaW1wbGljaXRVbml0czogJ21zJ1xuICAgIH0sXG4gICAgcGVyY2VudDoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgbWluOiAwLFxuICAgICAgbWF4OiAxMDAsXG4gICAgICB1bml0czogJyUnLFxuICAgICAgaW1wbGljaXRVbml0czogJyUnXG4gICAgfSxcbiAgICBwZXJjZW50YWdlczoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgbWluOiAwLFxuICAgICAgbWF4OiAxMDAsXG4gICAgICB1bml0czogJyUnLFxuICAgICAgaW1wbGljaXRVbml0czogJyUnLFxuICAgICAgbXVsdGlwbGU6IHRydWVcbiAgICB9LFxuICAgIHplcm9PbmVOdW1iZXI6IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIG1pbjogMCxcbiAgICAgIG1heDogMSxcbiAgICAgIHVuaXRsZXNzOiB0cnVlXG4gICAgfSxcbiAgICB6ZXJvT25lTnVtYmVyczoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgbWluOiAwLFxuICAgICAgbWF4OiAxLFxuICAgICAgdW5pdGxlc3M6IHRydWUsXG4gICAgICBtdWx0aXBsZTogdHJ1ZVxuICAgIH0sXG4gICAgbk9uZU9uZU51bWJlcjoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgbWluOiAtMSxcbiAgICAgIG1heDogMSxcbiAgICAgIHVuaXRsZXNzOiB0cnVlXG4gICAgfSxcbiAgICBub25OZWdhdGl2ZUludDoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgbWluOiAwLFxuICAgICAgaW50ZWdlcjogdHJ1ZSxcbiAgICAgIHVuaXRsZXNzOiB0cnVlXG4gICAgfSxcbiAgICBub25OZWdhdGl2ZU51bWJlcjoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgbWluOiAwLFxuICAgICAgdW5pdGxlc3M6IHRydWVcbiAgICB9LFxuICAgIHBvc2l0aW9uOiB7XG4gICAgICBlbnVtczogWydwYXJlbnQnLCAnb3JpZ2luJ11cbiAgICB9LFxuICAgIG5vZGVTaXplOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICBtaW46IDAsXG4gICAgICBlbnVtczogWydsYWJlbCddXG4gICAgfSxcbiAgICBudW1iZXI6IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIHVuaXRsZXNzOiB0cnVlXG4gICAgfSxcbiAgICBudW1iZXJzOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICB1bml0bGVzczogdHJ1ZSxcbiAgICAgIG11bHRpcGxlOiB0cnVlXG4gICAgfSxcbiAgICBwb3NpdGl2ZU51bWJlcjoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgdW5pdGxlc3M6IHRydWUsXG4gICAgICBtaW46IDAsXG4gICAgICBzdHJpY3RNaW46IHRydWVcbiAgICB9LFxuICAgIHNpemU6IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIG1pbjogMFxuICAgIH0sXG4gICAgYmlkaXJlY3Rpb25hbFNpemU6IHtcbiAgICAgIG51bWJlcjogdHJ1ZVxuICAgIH0sXG4gICAgLy8gYWxsb3dzIG5lZ2F0aXZlXG4gICAgYmlkaXJlY3Rpb25hbFNpemVNYXliZVBlcmNlbnQ6IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIGFsbG93UGVyY2VudDogdHJ1ZVxuICAgIH0sXG4gICAgLy8gYWxsb3dzIG5lZ2F0aXZlXG4gICAgYmlkaXJlY3Rpb25hbFNpemVzOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICBtdWx0aXBsZTogdHJ1ZVxuICAgIH0sXG4gICAgLy8gYWxsb3dzIG5lZ2F0aXZlXG4gICAgc2l6ZU1heWJlUGVyY2VudDoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgbWluOiAwLFxuICAgICAgYWxsb3dQZXJjZW50OiB0cnVlXG4gICAgfSxcbiAgICBheGlzRGlyZWN0aW9uOiB7XG4gICAgICBlbnVtczogWydob3Jpem9udGFsJywgJ2xlZnR3YXJkJywgJ3JpZ2h0d2FyZCcsICd2ZXJ0aWNhbCcsICd1cHdhcmQnLCAnZG93bndhcmQnLCAnYXV0byddXG4gICAgfSxcbiAgICBheGlzRGlyZWN0aW9uRXhwbGljaXQ6IHtcbiAgICAgIGVudW1zOiBbJ2xlZnR3YXJkJywgJ3JpZ2h0d2FyZCcsICd1cHdhcmQnLCAnZG93bndhcmQnXVxuICAgIH0sXG4gICAgYXhpc0RpcmVjdGlvblByaW1hcnk6IHtcbiAgICAgIGVudW1zOiBbJ2hvcml6b250YWwnLCAndmVydGljYWwnXVxuICAgIH0sXG4gICAgcGFkZGluZ1JlbGF0aXZlVG86IHtcbiAgICAgIGVudW1zOiBbJ3dpZHRoJywgJ2hlaWdodCcsICdhdmVyYWdlJywgJ21pbicsICdtYXgnXVxuICAgIH0sXG4gICAgYmdXSDoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgbWluOiAwLFxuICAgICAgYWxsb3dQZXJjZW50OiB0cnVlLFxuICAgICAgZW51bXM6IFsnYXV0byddLFxuICAgICAgbXVsdGlwbGU6IHRydWVcbiAgICB9LFxuICAgIGJnUG9zOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICBhbGxvd1BlcmNlbnQ6IHRydWUsXG4gICAgICBtdWx0aXBsZTogdHJ1ZVxuICAgIH0sXG4gICAgYmdSZWxhdGl2ZVRvOiB7XG4gICAgICBlbnVtczogWydpbm5lcicsICdpbmNsdWRlLXBhZGRpbmcnXSxcbiAgICAgIG11bHRpcGxlOiB0cnVlXG4gICAgfSxcbiAgICBiZ1JlcGVhdDoge1xuICAgICAgZW51bXM6IFsncmVwZWF0JywgJ3JlcGVhdC14JywgJ3JlcGVhdC15JywgJ25vLXJlcGVhdCddLFxuICAgICAgbXVsdGlwbGU6IHRydWVcbiAgICB9LFxuICAgIGJnRml0OiB7XG4gICAgICBlbnVtczogWydub25lJywgJ2NvbnRhaW4nLCAnY292ZXInXSxcbiAgICAgIG11bHRpcGxlOiB0cnVlXG4gICAgfSxcbiAgICBiZ0Nyb3NzT3JpZ2luOiB7XG4gICAgICBlbnVtczogWydhbm9ueW1vdXMnLCAndXNlLWNyZWRlbnRpYWxzJywgJ251bGwnXSxcbiAgICAgIG11bHRpcGxlOiB0cnVlXG4gICAgfSxcbiAgICBiZ0NsaXA6IHtcbiAgICAgIGVudW1zOiBbJ25vbmUnLCAnbm9kZSddLFxuICAgICAgbXVsdGlwbGU6IHRydWVcbiAgICB9LFxuICAgIGJnQ29udGFpbm1lbnQ6IHtcbiAgICAgIGVudW1zOiBbJ2luc2lkZScsICdvdmVyJ10sXG4gICAgICBtdWx0aXBsZTogdHJ1ZVxuICAgIH0sXG4gICAgYm94U2VsZWN0aW9uOiB7XG4gICAgICBlbnVtczogWydjb250YWluJywgJ292ZXJsYXAnLCAnbm9uZSddXG4gICAgfSxcbiAgICBjb2xvcjoge1xuICAgICAgY29sb3I6IHRydWVcbiAgICB9LFxuICAgIGNvbG9yczoge1xuICAgICAgY29sb3I6IHRydWUsXG4gICAgICBtdWx0aXBsZTogdHJ1ZVxuICAgIH0sXG4gICAgZmlsbDoge1xuICAgICAgZW51bXM6IFsnc29saWQnLCAnbGluZWFyLWdyYWRpZW50JywgJ3JhZGlhbC1ncmFkaWVudCddXG4gICAgfSxcbiAgICBib29sOiB7XG4gICAgICBlbnVtczogWyd5ZXMnLCAnbm8nXVxuICAgIH0sXG4gICAgYm9vbHM6IHtcbiAgICAgIGVudW1zOiBbJ3llcycsICdubyddLFxuICAgICAgbXVsdGlwbGU6IHRydWVcbiAgICB9LFxuICAgIGxpbmVTdHlsZToge1xuICAgICAgZW51bXM6IFsnc29saWQnLCAnZG90dGVkJywgJ2Rhc2hlZCddXG4gICAgfSxcbiAgICBsaW5lQ2FwOiB7XG4gICAgICBlbnVtczogWydidXR0JywgJ3JvdW5kJywgJ3NxdWFyZSddXG4gICAgfSxcbiAgICBsaW5lUG9zaXRpb246IHtcbiAgICAgIGVudW1zOiBbJ2NlbnRlcicsICdpbnNpZGUnLCAnb3V0c2lkZSddXG4gICAgfSxcbiAgICBsaW5lSm9pbjoge1xuICAgICAgZW51bXM6IFsncm91bmQnLCAnYmV2ZWwnLCAnbWl0ZXInXVxuICAgIH0sXG4gICAgYm9yZGVyU3R5bGU6IHtcbiAgICAgIGVudW1zOiBbJ3NvbGlkJywgJ2RvdHRlZCcsICdkYXNoZWQnLCAnZG91YmxlJ11cbiAgICB9LFxuICAgIGN1cnZlU3R5bGU6IHtcbiAgICAgIGVudW1zOiBbJ2JlemllcicsICd1bmJ1bmRsZWQtYmV6aWVyJywgJ2hheXN0YWNrJywgJ3NlZ21lbnRzJywgJ3N0cmFpZ2h0JywgJ3N0cmFpZ2h0LXRyaWFuZ2xlJywgJ3RheGknLCAncm91bmQtc2VnbWVudHMnLCAncm91bmQtdGF4aSddXG4gICAgfSxcbiAgICByYWRpdXNUeXBlOiB7XG4gICAgICBlbnVtczogWydhcmMtcmFkaXVzJywgJ2luZmx1ZW5jZS1yYWRpdXMnXSxcbiAgICAgIG11bHRpcGxlOiB0cnVlXG4gICAgfSxcbiAgICBmb250RmFtaWx5OiB7XG4gICAgICByZWdleDogJ14oW1xcXFx3LSBcXFxcXCJdKyg/OlxcXFxzKixcXFxccypbXFxcXHctIFxcXFxcIl0rKSopJCdcbiAgICB9LFxuICAgIGZvbnRTdHlsZToge1xuICAgICAgZW51bXM6IFsnaXRhbGljJywgJ25vcm1hbCcsICdvYmxpcXVlJ11cbiAgICB9LFxuICAgIGZvbnRXZWlnaHQ6IHtcbiAgICAgIGVudW1zOiBbJ25vcm1hbCcsICdib2xkJywgJ2JvbGRlcicsICdsaWdodGVyJywgJzEwMCcsICcyMDAnLCAnMzAwJywgJzQwMCcsICc1MDAnLCAnNjAwJywgJzgwMCcsICc5MDAnLCAxMDAsIDIwMCwgMzAwLCA0MDAsIDUwMCwgNjAwLCA3MDAsIDgwMCwgOTAwXVxuICAgIH0sXG4gICAgdGV4dERlY29yYXRpb246IHtcbiAgICAgIGVudW1zOiBbJ25vbmUnLCAndW5kZXJsaW5lJywgJ292ZXJsaW5lJywgJ2xpbmUtdGhyb3VnaCddXG4gICAgfSxcbiAgICB0ZXh0VHJhbnNmb3JtOiB7XG4gICAgICBlbnVtczogWydub25lJywgJ3VwcGVyY2FzZScsICdsb3dlcmNhc2UnXVxuICAgIH0sXG4gICAgdGV4dFdyYXA6IHtcbiAgICAgIGVudW1zOiBbJ25vbmUnLCAnd3JhcCcsICdlbGxpcHNpcyddXG4gICAgfSxcbiAgICB0ZXh0T3ZlcmZsb3dXcmFwOiB7XG4gICAgICBlbnVtczogWyd3aGl0ZXNwYWNlJywgJ2FueXdoZXJlJ11cbiAgICB9LFxuICAgIHRleHRCYWNrZ3JvdW5kU2hhcGU6IHtcbiAgICAgIGVudW1zOiBbJ3JlY3RhbmdsZScsICdyb3VuZHJlY3RhbmdsZScsICdyb3VuZC1yZWN0YW5nbGUnLCAnY2lyY2xlJ11cbiAgICB9LFxuICAgIG5vZGVTaGFwZToge1xuICAgICAgZW51bXM6IFsncmVjdGFuZ2xlJywgJ3JvdW5kcmVjdGFuZ2xlJywgJ3JvdW5kLXJlY3RhbmdsZScsICdjdXRyZWN0YW5nbGUnLCAnY3V0LXJlY3RhbmdsZScsICdib3R0b21yb3VuZHJlY3RhbmdsZScsICdib3R0b20tcm91bmQtcmVjdGFuZ2xlJywgJ2JhcnJlbCcsICdlbGxpcHNlJywgJ3RyaWFuZ2xlJywgJ3JvdW5kLXRyaWFuZ2xlJywgJ3NxdWFyZScsICdwZW50YWdvbicsICdyb3VuZC1wZW50YWdvbicsICdoZXhhZ29uJywgJ3JvdW5kLWhleGFnb24nLCAnY29uY2F2ZWhleGFnb24nLCAnY29uY2F2ZS1oZXhhZ29uJywgJ2hlcHRhZ29uJywgJ3JvdW5kLWhlcHRhZ29uJywgJ29jdGFnb24nLCAncm91bmQtb2N0YWdvbicsICd0YWcnLCAncm91bmQtdGFnJywgJ3N0YXInLCAnZGlhbW9uZCcsICdyb3VuZC1kaWFtb25kJywgJ3ZlZScsICdyaG9tYm9pZCcsICdyaWdodC1yaG9tYm9pZCcsICdwb2x5Z29uJ11cbiAgICB9LFxuICAgIG92ZXJsYXlTaGFwZToge1xuICAgICAgZW51bXM6IFsncm91bmRyZWN0YW5nbGUnLCAncm91bmQtcmVjdGFuZ2xlJywgJ2VsbGlwc2UnXVxuICAgIH0sXG4gICAgY29ybmVyUmFkaXVzOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICBtaW46IDAsXG4gICAgICB1bml0czogJ3B4fGVtJyxcbiAgICAgIGltcGxpY2l0VW5pdHM6ICdweCcsXG4gICAgICBlbnVtczogWydhdXRvJ11cbiAgICB9LFxuICAgIGNvbXBvdW5kSW5jbHVkZUxhYmVsczoge1xuICAgICAgZW51bXM6IFsnaW5jbHVkZScsICdleGNsdWRlJ11cbiAgICB9LFxuICAgIGFycm93U2hhcGU6IHtcbiAgICAgIGVudW1zOiBbJ3RlZScsICd0cmlhbmdsZScsICd0cmlhbmdsZS10ZWUnLCAnY2lyY2xlLXRyaWFuZ2xlJywgJ3RyaWFuZ2xlLWNyb3NzJywgJ3RyaWFuZ2xlLWJhY2tjdXJ2ZScsICd2ZWUnLCAnc3F1YXJlJywgJ2NpcmNsZScsICdkaWFtb25kJywgJ2NoZXZyb24nLCAnbm9uZSddXG4gICAgfSxcbiAgICBhcnJvd0ZpbGw6IHtcbiAgICAgIGVudW1zOiBbJ2ZpbGxlZCcsICdob2xsb3cnXVxuICAgIH0sXG4gICAgYXJyb3dXaWR0aDoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgdW5pdHM6ICclfHB4fGVtJyxcbiAgICAgIGltcGxpY2l0VW5pdHM6ICdweCcsXG4gICAgICBlbnVtczogWydtYXRjaC1saW5lJ11cbiAgICB9LFxuICAgIGRpc3BsYXk6IHtcbiAgICAgIGVudW1zOiBbJ2VsZW1lbnQnLCAnbm9uZSddXG4gICAgfSxcbiAgICB2aXNpYmlsaXR5OiB7XG4gICAgICBlbnVtczogWydoaWRkZW4nLCAndmlzaWJsZSddXG4gICAgfSxcbiAgICB6Q29tcG91bmREZXB0aDoge1xuICAgICAgZW51bXM6IFsnYm90dG9tJywgJ29ycGhhbicsICdhdXRvJywgJ3RvcCddXG4gICAgfSxcbiAgICB6SW5kZXhDb21wYXJlOiB7XG4gICAgICBlbnVtczogWydhdXRvJywgJ21hbnVhbCddXG4gICAgfSxcbiAgICB2YWxpZ246IHtcbiAgICAgIGVudW1zOiBbJ3RvcCcsICd0b3AtaW5zaWRlJywgJ2NlbnRlcicsICdib3R0b20nLCAnYm90dG9tLWluc2lkZSddXG4gICAgfSxcbiAgICBoYWxpZ246IHtcbiAgICAgIGVudW1zOiBbJ2xlZnQnLCAnbGVmdC1pbnNpZGUnLCAnY2VudGVyJywgJ3JpZ2h0JywgJ3JpZ2h0LWluc2lkZSddXG4gICAgfSxcbiAgICBqdXN0aWZpY2F0aW9uOiB7XG4gICAgICBlbnVtczogWydsZWZ0JywgJ2NlbnRlcicsICdyaWdodCcsICdhdXRvJ11cbiAgICB9LFxuICAgIHRleHRNZXRyaWNzOiB7XG4gICAgICBlbnVtczogWydmb250JywgJ2dseXBoJ11cbiAgICB9LFxuICAgIHRleHQ6IHtcbiAgICAgIHN0cmluZzogdHJ1ZVxuICAgIH0sXG4gICAgZGF0YToge1xuICAgICAgbWFwcGluZzogdHJ1ZSxcbiAgICAgIHJlZ2V4OiBkYXRhKCdkYXRhJylcbiAgICB9LFxuICAgIGxheW91dERhdGE6IHtcbiAgICAgIG1hcHBpbmc6IHRydWUsXG4gICAgICByZWdleDogZGF0YSgnbGF5b3V0RGF0YScpXG4gICAgfSxcbiAgICBzY3JhdGNoOiB7XG4gICAgICBtYXBwaW5nOiB0cnVlLFxuICAgICAgcmVnZXg6IGRhdGEoJ3NjcmF0Y2gnKVxuICAgIH0sXG4gICAgbWFwRGF0YToge1xuICAgICAgbWFwcGluZzogdHJ1ZSxcbiAgICAgIHJlZ2V4OiBtYXBEYXRhKCdtYXBEYXRhJylcbiAgICB9LFxuICAgIG1hcExheW91dERhdGE6IHtcbiAgICAgIG1hcHBpbmc6IHRydWUsXG4gICAgICByZWdleDogbWFwRGF0YSgnbWFwTGF5b3V0RGF0YScpXG4gICAgfSxcbiAgICBtYXBTY3JhdGNoOiB7XG4gICAgICBtYXBwaW5nOiB0cnVlLFxuICAgICAgcmVnZXg6IG1hcERhdGEoJ21hcFNjcmF0Y2gnKVxuICAgIH0sXG4gICAgZm46IHtcbiAgICAgIG1hcHBpbmc6IHRydWUsXG4gICAgICBmbjogdHJ1ZVxuICAgIH0sXG4gICAgdXJsOiB7XG4gICAgICByZWdleGVzOiB1cmxSZWdleGVzLFxuICAgICAgc2luZ2xlUmVnZXhNYXRjaFZhbHVlOiB0cnVlXG4gICAgfSxcbiAgICB1cmxzOiB7XG4gICAgICByZWdleGVzOiB1cmxSZWdleGVzLFxuICAgICAgc2luZ2xlUmVnZXhNYXRjaFZhbHVlOiB0cnVlLFxuICAgICAgbXVsdGlwbGU6IHRydWVcbiAgICB9LFxuICAgIHByb3BMaXN0OiB7XG4gICAgICBwcm9wTGlzdDogdHJ1ZVxuICAgIH0sXG4gICAgYW5nbGU6IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIHVuaXRzOiAnZGVnfHJhZCcsXG4gICAgICBpbXBsaWNpdFVuaXRzOiAncmFkJ1xuICAgIH0sXG4gICAgdGV4dFJvdGF0aW9uOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICB1bml0czogJ2RlZ3xyYWQnLFxuICAgICAgaW1wbGljaXRVbml0czogJ3JhZCcsXG4gICAgICBlbnVtczogWydub25lJywgJ2F1dG9yb3RhdGUnXVxuICAgIH0sXG4gICAgcG9seWdvblBvaW50TGlzdDoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgbXVsdGlwbGU6IHRydWUsXG4gICAgICBldmVuTXVsdGlwbGU6IHRydWUsXG4gICAgICBtaW46IC0xLFxuICAgICAgbWF4OiAxLFxuICAgICAgdW5pdGxlc3M6IHRydWVcbiAgICB9LFxuICAgIGVkZ2VEaXN0YW5jZXM6IHtcbiAgICAgIGVudW1zOiBbJ2ludGVyc2VjdGlvbicsICdub2RlLXBvc2l0aW9uJywgJ2VuZHBvaW50cyddXG4gICAgfSxcbiAgICBlZGdlRW5kcG9pbnQ6IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIG11bHRpcGxlOiB0cnVlLFxuICAgICAgdW5pdHM6ICclfHB4fGVtfGRlZ3xyYWQnLFxuICAgICAgaW1wbGljaXRVbml0czogJ3B4JyxcbiAgICAgIGVudW1zOiBbJ2luc2lkZS10by1ub2RlJywgJ291dHNpZGUtdG8tbm9kZScsICdvdXRzaWRlLXRvLW5vZGUtb3ItbGFiZWwnLCAnb3V0c2lkZS10by1saW5lJywgJ291dHNpZGUtdG8tbGluZS1vci1sYWJlbCddLFxuICAgICAgc2luZ2xlRW51bTogdHJ1ZSxcbiAgICAgIHZhbGlkYXRlOiBmdW5jdGlvbiB2YWxpZGF0ZSh2YWxBcnIsIHVuaXRzQXJyKSB7XG4gICAgICAgIHN3aXRjaCAodmFsQXJyLmxlbmd0aCkge1xuICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIC8vIGNhbiBiZSAlIG9yIHB4IG9ubHlcbiAgICAgICAgICAgIHJldHVybiB1bml0c0FyclswXSAhPT0gJ2RlZycgJiYgdW5pdHNBcnJbMF0gIT09ICdyYWQnICYmIHVuaXRzQXJyWzFdICE9PSAnZGVnJyAmJiB1bml0c0FyclsxXSAhPT0gJ3JhZCc7XG4gICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgLy8gY2FuIGJlIGVudW0sIGRlZywgb3IgcmFkIG9ubHlcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcodmFsQXJyWzBdKSB8fCB1bml0c0FyclswXSA9PT0gJ2RlZycgfHwgdW5pdHNBcnJbMF0gPT09ICdyYWQnO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGVhc2luZzoge1xuICAgICAgcmVnZXhlczogWydeKHNwcmluZylcXFxccypcXFxcKFxcXFxzKignICsgbnVtYmVyJDEgKyAnKVxcXFxzKixcXFxccyooJyArIG51bWJlciQxICsgJylcXFxccypcXFxcKSQnLCAnXihjdWJpYy1iZXppZXIpXFxcXHMqXFxcXChcXFxccyooJyArIG51bWJlciQxICsgJylcXFxccyosXFxcXHMqKCcgKyBudW1iZXIkMSArICcpXFxcXHMqLFxcXFxzKignICsgbnVtYmVyJDEgKyAnKVxcXFxzKixcXFxccyooJyArIG51bWJlciQxICsgJylcXFxccypcXFxcKSQnXSxcbiAgICAgIGVudW1zOiBbJ2xpbmVhcicsICdlYXNlJywgJ2Vhc2UtaW4nLCAnZWFzZS1vdXQnLCAnZWFzZS1pbi1vdXQnLCAnZWFzZS1pbi1zaW5lJywgJ2Vhc2Utb3V0LXNpbmUnLCAnZWFzZS1pbi1vdXQtc2luZScsICdlYXNlLWluLXF1YWQnLCAnZWFzZS1vdXQtcXVhZCcsICdlYXNlLWluLW91dC1xdWFkJywgJ2Vhc2UtaW4tY3ViaWMnLCAnZWFzZS1vdXQtY3ViaWMnLCAnZWFzZS1pbi1vdXQtY3ViaWMnLCAnZWFzZS1pbi1xdWFydCcsICdlYXNlLW91dC1xdWFydCcsICdlYXNlLWluLW91dC1xdWFydCcsICdlYXNlLWluLXF1aW50JywgJ2Vhc2Utb3V0LXF1aW50JywgJ2Vhc2UtaW4tb3V0LXF1aW50JywgJ2Vhc2UtaW4tZXhwbycsICdlYXNlLW91dC1leHBvJywgJ2Vhc2UtaW4tb3V0LWV4cG8nLCAnZWFzZS1pbi1jaXJjJywgJ2Vhc2Utb3V0LWNpcmMnLCAnZWFzZS1pbi1vdXQtY2lyYyddXG4gICAgfSxcbiAgICBncmFkaWVudERpcmVjdGlvbjoge1xuICAgICAgZW51bXM6IFsndG8tYm90dG9tJywgJ3RvLXRvcCcsICd0by1sZWZ0JywgJ3RvLXJpZ2h0JywgJ3RvLWJvdHRvbS1yaWdodCcsICd0by1ib3R0b20tbGVmdCcsICd0by10b3AtcmlnaHQnLCAndG8tdG9wLWxlZnQnLCAndG8tcmlnaHQtYm90dG9tJywgJ3RvLWxlZnQtYm90dG9tJywgJ3RvLXJpZ2h0LXRvcCcsICd0by1sZWZ0LXRvcCcgLy8gZGlmZmVyZW50IG9yZGVyXG4gICAgICBdXG4gICAgfSxcbiAgICBib3VuZHNFeHBhbnNpb246IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIG11bHRpcGxlOiB0cnVlLFxuICAgICAgbWluOiAwLFxuICAgICAgdmFsaWRhdGU6IGZ1bmN0aW9uIHZhbGlkYXRlKHZhbEFycikge1xuICAgICAgICB2YXIgbGVuZ3RoID0gdmFsQXJyLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIGxlbmd0aCA9PT0gMSB8fCBsZW5ndGggPT09IDIgfHwgbGVuZ3RoID09PSA0O1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgdmFyIGRpZmYgPSB7XG4gICAgemVyb05vblplcm86IGZ1bmN0aW9uIHplcm9Ob25aZXJvKHZhbDEsIHZhbDIpIHtcbiAgICAgIGlmICgodmFsMSA9PSBudWxsIHx8IHZhbDIgPT0gbnVsbCkgJiYgdmFsMSAhPT0gdmFsMikge1xuICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gbnVsbCBjYXNlcyBjb3VsZCByZXByZXNlbnQgYW55IHZhbHVlXG4gICAgICB9XG4gICAgICBpZiAodmFsMSA9PSAwICYmIHZhbDIgIT0gMCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAodmFsMSAhPSAwICYmIHZhbDIgPT0gMCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGFueTogZnVuY3Rpb24gYW55KHZhbDEsIHZhbDIpIHtcbiAgICAgIHJldHVybiB2YWwxICE9IHZhbDI7XG4gICAgfSxcbiAgICBlbXB0eU5vbkVtcHR5OiBmdW5jdGlvbiBlbXB0eU5vbkVtcHR5KHN0cjEsIHN0cjIpIHtcbiAgICAgIHZhciBlbXB0eTEgPSBlbXB0eVN0cmluZyhzdHIxKTtcbiAgICAgIHZhciBlbXB0eTIgPSBlbXB0eVN0cmluZyhzdHIyKTtcbiAgICAgIHJldHVybiBlbXB0eTEgJiYgIWVtcHR5MiB8fCAhZW1wdHkxICYmIGVtcHR5MjtcbiAgICB9XG4gIH07XG5cbiAgLy8gZGVmaW5lIHZpc3VhbCBzdHlsZSBwcm9wZXJ0aWVzXG4gIC8vXG4gIC8vIC0gbi5iLiBhZGRpbmcgYSBuZXcgZ3JvdXAgb2YgcHJvcHMgbWF5IHJlcXVpcmUgdXBkYXRlcyB0byB1cGRhdGVTdHlsZUhpbnRzKClcbiAgLy8gLSBhZGRpbmcgbmV3IHByb3BzIHRvIGFuIGV4aXN0aW5nIGdyb3VwIGdldHMgaGFuZGxlZCBhdXRvbWF0aWNhbGx5XG5cbiAgdmFyIHQgPSBzdHlmbiQyLnR5cGVzO1xuICB2YXIgbWFpbkxhYmVsID0gW3tcbiAgICBuYW1lOiAnbGFiZWwnLFxuICAgIHR5cGU6IHQudGV4dCxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnksXG4gICAgdHJpZ2dlcnNaT3JkZXI6IGRpZmYuZW1wdHlOb25FbXB0eVxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtcm90YXRpb24nLFxuICAgIHR5cGU6IHQudGV4dFJvdGF0aW9uLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtbWFyZ2luLXgnLFxuICAgIHR5cGU6IHQuYmlkaXJlY3Rpb25hbFNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1tYXJnaW4teScsXG4gICAgdHlwZTogdC5iaWRpcmVjdGlvbmFsU2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfV07XG4gIHZhciBzb3VyY2VMYWJlbCA9IFt7XG4gICAgbmFtZTogJ3NvdXJjZS1sYWJlbCcsXG4gICAgdHlwZTogdC50ZXh0LFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3NvdXJjZS10ZXh0LXJvdGF0aW9uJyxcbiAgICB0eXBlOiB0LnRleHRSb3RhdGlvbixcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdzb3VyY2UtdGV4dC1tYXJnaW4teCcsXG4gICAgdHlwZTogdC5iaWRpcmVjdGlvbmFsU2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdzb3VyY2UtdGV4dC1tYXJnaW4teScsXG4gICAgdHlwZTogdC5iaWRpcmVjdGlvbmFsU2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdzb3VyY2UtdGV4dC1vZmZzZXQnLFxuICAgIHR5cGU6IHQuc2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfV07XG4gIHZhciB0YXJnZXRMYWJlbCA9IFt7XG4gICAgbmFtZTogJ3RhcmdldC1sYWJlbCcsXG4gICAgdHlwZTogdC50ZXh0LFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RhcmdldC10ZXh0LXJvdGF0aW9uJyxcbiAgICB0eXBlOiB0LnRleHRSb3RhdGlvbixcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0YXJnZXQtdGV4dC1tYXJnaW4teCcsXG4gICAgdHlwZTogdC5iaWRpcmVjdGlvbmFsU2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0YXJnZXQtdGV4dC1tYXJnaW4teScsXG4gICAgdHlwZTogdC5iaWRpcmVjdGlvbmFsU2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0YXJnZXQtdGV4dC1vZmZzZXQnLFxuICAgIHR5cGU6IHQuc2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfV07XG4gIHZhciBsYWJlbERpbWVuc2lvbnMgPSBbe1xuICAgIG5hbWU6ICdmb250LWZhbWlseScsXG4gICAgdHlwZTogdC5mb250RmFtaWx5LFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2ZvbnQtc3R5bGUnLFxuICAgIHR5cGU6IHQuZm9udFN0eWxlLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2ZvbnQtd2VpZ2h0JyxcbiAgICB0eXBlOiB0LmZvbnRXZWlnaHQsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnZm9udC1zaXplJyxcbiAgICB0eXBlOiB0LnNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC10cmFuc2Zvcm0nLFxuICAgIHR5cGU6IHQudGV4dFRyYW5zZm9ybSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LXdyYXAnLFxuICAgIHR5cGU6IHQudGV4dFdyYXAsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1vdmVyZmxvdy13cmFwJyxcbiAgICB0eXBlOiB0LnRleHRPdmVyZmxvd1dyYXAsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1tYXgtd2lkdGgnLFxuICAgIHR5cGU6IHQuc2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LW91dGxpbmUtd2lkdGgnLFxuICAgIHR5cGU6IHQuc2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdsaW5lLWhlaWdodCcsXG4gICAgdHlwZTogdC5wb3NpdGl2ZU51bWJlcixcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfV07XG4gIHZhciBjb21tb25MYWJlbCA9IFt7XG4gICAgbmFtZTogJ3RleHQtdmFsaWduJyxcbiAgICB0eXBlOiB0LnZhbGlnbixcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LWhhbGlnbicsXG4gICAgdHlwZTogdC5oYWxpZ24sXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnY29sb3InLFxuICAgIHR5cGU6IHQuY29sb3JcbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LW91dGxpbmUtY29sb3InLFxuICAgIHR5cGU6IHQuY29sb3JcbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LW91dGxpbmUtb3BhY2l0eScsXG4gICAgdHlwZTogdC56ZXJvT25lTnVtYmVyXG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1iYWNrZ3JvdW5kLWNvbG9yJyxcbiAgICB0eXBlOiB0LmNvbG9yXG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1iYWNrZ3JvdW5kLW9wYWNpdHknLFxuICAgIHR5cGU6IHQuemVyb09uZU51bWJlclxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtYmFja2dyb3VuZC1wYWRkaW5nJyxcbiAgICB0eXBlOiB0LnNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1ib3JkZXItb3BhY2l0eScsXG4gICAgdHlwZTogdC56ZXJvT25lTnVtYmVyXG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1ib3JkZXItY29sb3InLFxuICAgIHR5cGU6IHQuY29sb3JcbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LWJvcmRlci13aWR0aCcsXG4gICAgdHlwZTogdC5zaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtYm9yZGVyLXN0eWxlJyxcbiAgICB0eXBlOiB0LmJvcmRlclN0eWxlLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtYmFja2dyb3VuZC1zaGFwZScsXG4gICAgdHlwZTogdC50ZXh0QmFja2dyb3VuZFNoYXBlLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtanVzdGlmaWNhdGlvbicsXG4gICAgdHlwZTogdC5qdXN0aWZpY2F0aW9uXG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1tZXRyaWNzJyxcbiAgICB0eXBlOiB0LnRleHRNZXRyaWNzXG4gIH0sIHtcbiAgICBuYW1lOiAnYm94LXNlbGVjdC1sYWJlbHMnLFxuICAgIHR5cGU6IHQuYm9vbCxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfV07XG4gIHZhciBiZWhhdmlvciA9IFt7XG4gICAgbmFtZTogJ2V2ZW50cycsXG4gICAgdHlwZTogdC5ib29sLFxuICAgIHRyaWdnZXJzWk9yZGVyOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtZXZlbnRzJyxcbiAgICB0eXBlOiB0LmJvb2wsXG4gICAgdHJpZ2dlcnNaT3JkZXI6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnYm94LXNlbGVjdGlvbicsXG4gICAgdHlwZTogdC5ib3hTZWxlY3Rpb24sXG4gICAgdHJpZ2dlcnNaT3JkZXI6IGRpZmYuYW55XG4gIH1dO1xuICB2YXIgdmlzaWJpbGl0eSA9IFt7XG4gICAgbmFtZTogJ2Rpc3BsYXknLFxuICAgIHR5cGU6IHQuZGlzcGxheSxcbiAgICB0cmlnZ2Vyc1pPcmRlcjogZGlmZi5hbnksXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55LFxuICAgIHRyaWdnZXJzQm91bmRzT2ZDb25uZWN0ZWRFZGdlczogZGlmZi5hbnksXG4gICAgdHJpZ2dlcnNCb3VuZHNPZlBhcmFsbGVsRWRnZXM6IGZ1bmN0aW9uIHRyaWdnZXJzQm91bmRzT2ZQYXJhbGxlbEVkZ2VzKGZyb21WYWx1ZSwgdG9WYWx1ZSwgZWxlKSB7XG4gICAgICBpZiAoZnJvbVZhbHVlID09PSB0b1ZhbHVlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gb25seSBpZiBlZGdlIGlzIGJ1bmRsZWQgYmV6aWVyIChzbyBhcyBub3QgdG8gYWZmZWN0IHBlcmZvcm1hbmNlIG9mIG90aGVyIGVkZ2VzKVxuICAgICAgcmV0dXJuIGVsZS5wc3R5bGUoJ2N1cnZlLXN0eWxlJykudmFsdWUgPT09ICdiZXppZXInO1xuICAgIH1cbiAgfSwge1xuICAgIG5hbWU6ICd2aXNpYmlsaXR5JyxcbiAgICB0eXBlOiB0LnZpc2liaWxpdHksXG4gICAgdHJpZ2dlcnNaT3JkZXI6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnb3BhY2l0eScsXG4gICAgdHlwZTogdC56ZXJvT25lTnVtYmVyLFxuICAgIHRyaWdnZXJzWk9yZGVyOiBkaWZmLnplcm9Ob25aZXJvXG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1vcGFjaXR5JyxcbiAgICB0eXBlOiB0Lnplcm9PbmVOdW1iZXJcbiAgfSwge1xuICAgIG5hbWU6ICdtaW4tem9vbWVkLWZvbnQtc2l6ZScsXG4gICAgdHlwZTogdC5zaXplXG4gIH0sIHtcbiAgICBuYW1lOiAnei1jb21wb3VuZC1kZXB0aCcsXG4gICAgdHlwZTogdC56Q29tcG91bmREZXB0aCxcbiAgICB0cmlnZ2Vyc1pPcmRlcjogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd6LWluZGV4LWNvbXBhcmUnLFxuICAgIHR5cGU6IHQuekluZGV4Q29tcGFyZSxcbiAgICB0cmlnZ2Vyc1pPcmRlcjogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd6LWluZGV4JyxcbiAgICB0eXBlOiB0Lm51bWJlcixcbiAgICB0cmlnZ2Vyc1pPcmRlcjogZGlmZi5hbnlcbiAgfV07XG4gIHZhciBvdmVybGF5ID0gW3tcbiAgICBuYW1lOiAnb3ZlcmxheS1wYWRkaW5nJyxcbiAgICB0eXBlOiB0LnNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnb3ZlcmxheS1jb2xvcicsXG4gICAgdHlwZTogdC5jb2xvclxuICB9LCB7XG4gICAgbmFtZTogJ292ZXJsYXktb3BhY2l0eScsXG4gICAgdHlwZTogdC56ZXJvT25lTnVtYmVyLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLnplcm9Ob25aZXJvXG4gIH0sIHtcbiAgICBuYW1lOiAnb3ZlcmxheS1zaGFwZScsXG4gICAgdHlwZTogdC5vdmVybGF5U2hhcGUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnb3ZlcmxheS1jb3JuZXItcmFkaXVzJyxcbiAgICB0eXBlOiB0LmNvcm5lclJhZGl1c1xuICB9XTtcbiAgdmFyIHVuZGVybGF5ID0gW3tcbiAgICBuYW1lOiAndW5kZXJsYXktcGFkZGluZycsXG4gICAgdHlwZTogdC5zaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3VuZGVybGF5LWNvbG9yJyxcbiAgICB0eXBlOiB0LmNvbG9yXG4gIH0sIHtcbiAgICBuYW1lOiAndW5kZXJsYXktb3BhY2l0eScsXG4gICAgdHlwZTogdC56ZXJvT25lTnVtYmVyLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLnplcm9Ob25aZXJvXG4gIH0sIHtcbiAgICBuYW1lOiAndW5kZXJsYXktc2hhcGUnLFxuICAgIHR5cGU6IHQub3ZlcmxheVNoYXBlLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3VuZGVybGF5LWNvcm5lci1yYWRpdXMnLFxuICAgIHR5cGU6IHQuY29ybmVyUmFkaXVzXG4gIH1dO1xuICB2YXIgdHJhbnNpdGlvbiA9IFt7XG4gICAgbmFtZTogJ3RyYW5zaXRpb24tcHJvcGVydHknLFxuICAgIHR5cGU6IHQucHJvcExpc3RcbiAgfSwge1xuICAgIG5hbWU6ICd0cmFuc2l0aW9uLWR1cmF0aW9uJyxcbiAgICB0eXBlOiB0LnRpbWVcbiAgfSwge1xuICAgIG5hbWU6ICd0cmFuc2l0aW9uLWRlbGF5JyxcbiAgICB0eXBlOiB0LnRpbWVcbiAgfSwge1xuICAgIG5hbWU6ICd0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbicsXG4gICAgdHlwZTogdC5lYXNpbmdcbiAgfV07XG4gIHZhciBub2RlU2l6ZUhhc2hPdmVycmlkZSA9IGZ1bmN0aW9uIG5vZGVTaXplSGFzaE92ZXJyaWRlKGVsZSwgcGFyc2VkUHJvcCkge1xuICAgIGlmIChwYXJzZWRQcm9wLnZhbHVlID09PSAnbGFiZWwnKSB7XG4gICAgICByZXR1cm4gLWVsZS5wb29sSW5kZXgoKTsgLy8gbm8gaGFzaCBrZXkgaGl0cyBpcyB1c2luZyBsYWJlbCBzaXplIChoaXRyYXRlIGZvciBwZXJmIHByb2JhYmx5IGxvdyBhbnl3YXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBwYXJzZWRQcm9wLnBmVmFsdWU7XG4gICAgfVxuICB9O1xuICB2YXIgbm9kZUJvZHkgPSBbe1xuICAgIG5hbWU6ICdoZWlnaHQnLFxuICAgIHR5cGU6IHQubm9kZVNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55LFxuICAgIGhhc2hPdmVycmlkZTogbm9kZVNpemVIYXNoT3ZlcnJpZGVcbiAgfSwge1xuICAgIG5hbWU6ICd3aWR0aCcsXG4gICAgdHlwZTogdC5ub2RlU2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnksXG4gICAgaGFzaE92ZXJyaWRlOiBub2RlU2l6ZUhhc2hPdmVycmlkZVxuICB9LCB7XG4gICAgbmFtZTogJ3NoYXBlJyxcbiAgICB0eXBlOiB0Lm5vZGVTaGFwZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdzaGFwZS1wb2x5Z29uLXBvaW50cycsXG4gICAgdHlwZTogdC5wb2x5Z29uUG9pbnRMaXN0LFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2Nvcm5lci1yYWRpdXMnLFxuICAgIHR5cGU6IHQuY29ybmVyUmFkaXVzXG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1jb2xvcicsXG4gICAgdHlwZTogdC5jb2xvclxuICB9LCB7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtZmlsbCcsXG4gICAgdHlwZTogdC5maWxsXG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1vcGFjaXR5JyxcbiAgICB0eXBlOiB0Lnplcm9PbmVOdW1iZXJcbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLWJsYWNrZW4nLFxuICAgIHR5cGU6IHQubk9uZU9uZU51bWJlclxuICB9LCB7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtZ3JhZGllbnQtc3RvcC1jb2xvcnMnLFxuICAgIHR5cGU6IHQuY29sb3JzXG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1ncmFkaWVudC1zdG9wLXBvc2l0aW9ucycsXG4gICAgdHlwZTogdC5wZXJjZW50YWdlc1xuICB9LCB7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtZ3JhZGllbnQtZGlyZWN0aW9uJyxcbiAgICB0eXBlOiB0LmdyYWRpZW50RGlyZWN0aW9uXG4gIH0sIHtcbiAgICBuYW1lOiAncGFkZGluZycsXG4gICAgdHlwZTogdC5zaXplTWF5YmVQZXJjZW50LFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3BhZGRpbmctcmVsYXRpdmUtdG8nLFxuICAgIHR5cGU6IHQucGFkZGluZ1JlbGF0aXZlVG8sXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnYm91bmRzLWV4cGFuc2lvbicsXG4gICAgdHlwZTogdC5ib3VuZHNFeHBhbnNpb24sXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH1dO1xuICB2YXIgbm9kZUJvcmRlciA9IFt7XG4gICAgbmFtZTogJ2JvcmRlci1jb2xvcicsXG4gICAgdHlwZTogdC5jb2xvclxuICB9LCB7XG4gICAgbmFtZTogJ2JvcmRlci1vcGFjaXR5JyxcbiAgICB0eXBlOiB0Lnplcm9PbmVOdW1iZXJcbiAgfSwge1xuICAgIG5hbWU6ICdib3JkZXItd2lkdGgnLFxuICAgIHR5cGU6IHQuc2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdib3JkZXItc3R5bGUnLFxuICAgIHR5cGU6IHQuYm9yZGVyU3R5bGVcbiAgfSwge1xuICAgIG5hbWU6ICdib3JkZXItY2FwJyxcbiAgICB0eXBlOiB0LmxpbmVDYXBcbiAgfSwge1xuICAgIG5hbWU6ICdib3JkZXItam9pbicsXG4gICAgdHlwZTogdC5saW5lSm9pblxuICB9LCB7XG4gICAgbmFtZTogJ2JvcmRlci1kYXNoLXBhdHRlcm4nLFxuICAgIHR5cGU6IHQubnVtYmVyc1xuICB9LCB7XG4gICAgbmFtZTogJ2JvcmRlci1kYXNoLW9mZnNldCcsXG4gICAgdHlwZTogdC5udW1iZXJcbiAgfSwge1xuICAgIG5hbWU6ICdib3JkZXItcG9zaXRpb24nLFxuICAgIHR5cGU6IHQubGluZVBvc2l0aW9uXG4gIH1dO1xuICB2YXIgbm9kZU91dGxpbmUgPSBbe1xuICAgIG5hbWU6ICdvdXRsaW5lLWNvbG9yJyxcbiAgICB0eXBlOiB0LmNvbG9yXG4gIH0sIHtcbiAgICBuYW1lOiAnb3V0bGluZS1vcGFjaXR5JyxcbiAgICB0eXBlOiB0Lnplcm9PbmVOdW1iZXJcbiAgfSwge1xuICAgIG5hbWU6ICdvdXRsaW5lLXdpZHRoJyxcbiAgICB0eXBlOiB0LnNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnb3V0bGluZS1zdHlsZScsXG4gICAgdHlwZTogdC5ib3JkZXJTdHlsZVxuICB9LCB7XG4gICAgbmFtZTogJ291dGxpbmUtb2Zmc2V0JyxcbiAgICB0eXBlOiB0LnNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH1dO1xuICB2YXIgYmFja2dyb3VuZEltYWdlID0gW3tcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1pbWFnZScsXG4gICAgdHlwZTogdC51cmxzXG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1pbWFnZS1jcm9zc29yaWdpbicsXG4gICAgdHlwZTogdC5iZ0Nyb3NzT3JpZ2luXG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1pbWFnZS1vcGFjaXR5JyxcbiAgICB0eXBlOiB0Lnplcm9PbmVOdW1iZXJzXG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1pbWFnZS1jb250YWlubWVudCcsXG4gICAgdHlwZTogdC5iZ0NvbnRhaW5tZW50XG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1pbWFnZS1zbW9vdGhpbmcnLFxuICAgIHR5cGU6IHQuYm9vbHNcbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLXBvc2l0aW9uLXgnLFxuICAgIHR5cGU6IHQuYmdQb3NcbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLXBvc2l0aW9uLXknLFxuICAgIHR5cGU6IHQuYmdQb3NcbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLXdpZHRoLXJlbGF0aXZlLXRvJyxcbiAgICB0eXBlOiB0LmJnUmVsYXRpdmVUb1xuICB9LCB7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtaGVpZ2h0LXJlbGF0aXZlLXRvJyxcbiAgICB0eXBlOiB0LmJnUmVsYXRpdmVUb1xuICB9LCB7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtcmVwZWF0JyxcbiAgICB0eXBlOiB0LmJnUmVwZWF0XG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1maXQnLFxuICAgIHR5cGU6IHQuYmdGaXRcbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLWNsaXAnLFxuICAgIHR5cGU6IHQuYmdDbGlwXG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC13aWR0aCcsXG4gICAgdHlwZTogdC5iZ1dIXG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1oZWlnaHQnLFxuICAgIHR5cGU6IHQuYmdXSFxuICB9LCB7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtb2Zmc2V0LXgnLFxuICAgIHR5cGU6IHQuYmdQb3NcbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLW9mZnNldC15JyxcbiAgICB0eXBlOiB0LmJnUG9zXG4gIH1dO1xuICB2YXIgY29tcG91bmQgPSBbe1xuICAgIG5hbWU6ICdwb3NpdGlvbicsXG4gICAgdHlwZTogdC5wb3NpdGlvbixcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdjb21wb3VuZC1zaXppbmctd3J0LWxhYmVscycsXG4gICAgdHlwZTogdC5jb21wb3VuZEluY2x1ZGVMYWJlbHMsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnbWluLXdpZHRoJyxcbiAgICB0eXBlOiB0LnNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnbWluLXdpZHRoLWJpYXMtbGVmdCcsXG4gICAgdHlwZTogdC5zaXplTWF5YmVQZXJjZW50LFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ21pbi13aWR0aC1iaWFzLXJpZ2h0JyxcbiAgICB0eXBlOiB0LnNpemVNYXliZVBlcmNlbnQsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnbWluLWhlaWdodCcsXG4gICAgdHlwZTogdC5zaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ21pbi1oZWlnaHQtYmlhcy10b3AnLFxuICAgIHR5cGU6IHQuc2l6ZU1heWJlUGVyY2VudCxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdtaW4taGVpZ2h0LWJpYXMtYm90dG9tJyxcbiAgICB0eXBlOiB0LnNpemVNYXliZVBlcmNlbnQsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH1dO1xuICB2YXIgZWRnZUxpbmUgPSBbe1xuICAgIG5hbWU6ICdsaW5lLXN0eWxlJyxcbiAgICB0eXBlOiB0LmxpbmVTdHlsZVxuICB9LCB7XG4gICAgbmFtZTogJ2xpbmUtY29sb3InLFxuICAgIHR5cGU6IHQuY29sb3JcbiAgfSwge1xuICAgIG5hbWU6ICdsaW5lLWZpbGwnLFxuICAgIHR5cGU6IHQuZmlsbFxuICB9LCB7XG4gICAgbmFtZTogJ2xpbmUtY2FwJyxcbiAgICB0eXBlOiB0LmxpbmVDYXBcbiAgfSwge1xuICAgIG5hbWU6ICdsaW5lLW9wYWNpdHknLFxuICAgIHR5cGU6IHQuemVyb09uZU51bWJlclxuICB9LCB7XG4gICAgbmFtZTogJ2xpbmUtZGFzaC1wYXR0ZXJuJyxcbiAgICB0eXBlOiB0Lm51bWJlcnNcbiAgfSwge1xuICAgIG5hbWU6ICdsaW5lLWRhc2gtb2Zmc2V0JyxcbiAgICB0eXBlOiB0Lm51bWJlclxuICB9LCB7XG4gICAgbmFtZTogJ2xpbmUtb3V0bGluZS13aWR0aCcsXG4gICAgdHlwZTogdC5zaXplXG4gIH0sIHtcbiAgICBuYW1lOiAnbGluZS1vdXRsaW5lLWNvbG9yJyxcbiAgICB0eXBlOiB0LmNvbG9yXG4gIH0sIHtcbiAgICBuYW1lOiAnbGluZS1ncmFkaWVudC1zdG9wLWNvbG9ycycsXG4gICAgdHlwZTogdC5jb2xvcnNcbiAgfSwge1xuICAgIG5hbWU6ICdsaW5lLWdyYWRpZW50LXN0b3AtcG9zaXRpb25zJyxcbiAgICB0eXBlOiB0LnBlcmNlbnRhZ2VzXG4gIH0sIHtcbiAgICBuYW1lOiAnY3VydmUtc3R5bGUnLFxuICAgIHR5cGU6IHQuY3VydmVTdHlsZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnksXG4gICAgdHJpZ2dlcnNCb3VuZHNPZlBhcmFsbGVsRWRnZXM6IGZ1bmN0aW9uIHRyaWdnZXJzQm91bmRzT2ZQYXJhbGxlbEVkZ2VzKGZyb21WYWx1ZSwgdG9WYWx1ZSkge1xuICAgICAgaWYgKGZyb21WYWx1ZSA9PT0gdG9WYWx1ZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9IC8vIG11c3QgaGF2ZSBkaWZmXG5cbiAgICAgIHJldHVybiBmcm9tVmFsdWUgPT09ICdiZXppZXInIHx8XG4gICAgICAvLyByZW1vdmUgZnJvbSBidW5kbGVcbiAgICAgIHRvVmFsdWUgPT09ICdiZXppZXInOyAvLyBhZGQgdG8gYnVuZGxlXG4gICAgfVxuICB9LCB7XG4gICAgbmFtZTogJ2hheXN0YWNrLXJhZGl1cycsXG4gICAgdHlwZTogdC56ZXJvT25lTnVtYmVyLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3NvdXJjZS1lbmRwb2ludCcsXG4gICAgdHlwZTogdC5lZGdlRW5kcG9pbnQsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGFyZ2V0LWVuZHBvaW50JyxcbiAgICB0eXBlOiB0LmVkZ2VFbmRwb2ludCxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdjb250cm9sLXBvaW50LXN0ZXAtc2l6ZScsXG4gICAgdHlwZTogdC5zaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2NvbnRyb2wtcG9pbnQtZGlzdGFuY2VzJyxcbiAgICB0eXBlOiB0LmJpZGlyZWN0aW9uYWxTaXplcyxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdjb250cm9sLXBvaW50LXdlaWdodHMnLFxuICAgIHR5cGU6IHQubnVtYmVycyxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdzZWdtZW50LWRpc3RhbmNlcycsXG4gICAgdHlwZTogdC5iaWRpcmVjdGlvbmFsU2l6ZXMsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnc2VnbWVudC13ZWlnaHRzJyxcbiAgICB0eXBlOiB0Lm51bWJlcnMsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnc2VnbWVudC1yYWRpaScsXG4gICAgdHlwZTogdC5udW1iZXJzLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3JhZGl1cy10eXBlJyxcbiAgICB0eXBlOiB0LnJhZGl1c1R5cGUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGF4aS10dXJuJyxcbiAgICB0eXBlOiB0LmJpZGlyZWN0aW9uYWxTaXplTWF5YmVQZXJjZW50LFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RheGktdHVybi1taW4tZGlzdGFuY2UnLFxuICAgIHR5cGU6IHQuc2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0YXhpLWRpcmVjdGlvbicsXG4gICAgdHlwZTogdC5heGlzRGlyZWN0aW9uLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RheGktcmFkaXVzJyxcbiAgICB0eXBlOiB0Lm51bWJlcixcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdlZGdlLWRpc3RhbmNlcycsXG4gICAgdHlwZTogdC5lZGdlRGlzdGFuY2VzLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2Fycm93LXNjYWxlJyxcbiAgICB0eXBlOiB0LnBvc2l0aXZlTnVtYmVyLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2xvb3AtZGlyZWN0aW9uJyxcbiAgICB0eXBlOiB0LmFuZ2xlLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2xvb3Atc3dlZXAnLFxuICAgIHR5cGU6IHQuYW5nbGUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnc291cmNlLWRpc3RhbmNlLWZyb20tbm9kZScsXG4gICAgdHlwZTogdC5zaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RhcmdldC1kaXN0YW5jZS1mcm9tLW5vZGUnLFxuICAgIHR5cGU6IHQuc2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfV07XG4gIHZhciBnaG9zdCA9IFt7XG4gICAgbmFtZTogJ2dob3N0JyxcbiAgICB0eXBlOiB0LmJvb2wsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnZ2hvc3Qtb2Zmc2V0LXgnLFxuICAgIHR5cGU6IHQuYmlkaXJlY3Rpb25hbFNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnZ2hvc3Qtb2Zmc2V0LXknLFxuICAgIHR5cGU6IHQuYmlkaXJlY3Rpb25hbFNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnZ2hvc3Qtb3BhY2l0eScsXG4gICAgdHlwZTogdC56ZXJvT25lTnVtYmVyXG4gIH1dO1xuICB2YXIgY29yZSA9IFt7XG4gICAgbmFtZTogJ3NlbGVjdGlvbi1ib3gtY29sb3InLFxuICAgIHR5cGU6IHQuY29sb3JcbiAgfSwge1xuICAgIG5hbWU6ICdzZWxlY3Rpb24tYm94LW9wYWNpdHknLFxuICAgIHR5cGU6IHQuemVyb09uZU51bWJlclxuICB9LCB7XG4gICAgbmFtZTogJ3NlbGVjdGlvbi1ib3gtYm9yZGVyLWNvbG9yJyxcbiAgICB0eXBlOiB0LmNvbG9yXG4gIH0sIHtcbiAgICBuYW1lOiAnc2VsZWN0aW9uLWJveC1ib3JkZXItd2lkdGgnLFxuICAgIHR5cGU6IHQuc2l6ZVxuICB9LCB7XG4gICAgbmFtZTogJ2FjdGl2ZS1iZy1jb2xvcicsXG4gICAgdHlwZTogdC5jb2xvclxuICB9LCB7XG4gICAgbmFtZTogJ2FjdGl2ZS1iZy1vcGFjaXR5JyxcbiAgICB0eXBlOiB0Lnplcm9PbmVOdW1iZXJcbiAgfSwge1xuICAgIG5hbWU6ICdhY3RpdmUtYmctc2l6ZScsXG4gICAgdHlwZTogdC5zaXplXG4gIH0sIHtcbiAgICBuYW1lOiAnb3V0c2lkZS10ZXh0dXJlLWJnLWNvbG9yJyxcbiAgICB0eXBlOiB0LmNvbG9yXG4gIH0sIHtcbiAgICBuYW1lOiAnb3V0c2lkZS10ZXh0dXJlLWJnLW9wYWNpdHknLFxuICAgIHR5cGU6IHQuemVyb09uZU51bWJlclxuICB9XTtcblxuICAvLyBwaWUgYmFja2dyb3VuZHMgZm9yIG5vZGVzXG4gIHZhciBwaWUgPSBbXTtcbiAgc3R5Zm4kMi5waWVCYWNrZ3JvdW5kTiA9IDE2OyAvLyBiZWNhdXNlIHRoZSBwaWUgcHJvcGVydGllcyBhcmUgbnVtYmVyZWQsIGdpdmUgYWNjZXNzIHRvIGEgY29uc3RhbnQgTiAoZm9yIHJlbmRlcmVyIHVzZSlcbiAgcGllLnB1c2goe1xuICAgIG5hbWU6ICdwaWUtc2l6ZScsXG4gICAgdHlwZTogdC5zaXplTWF5YmVQZXJjZW50XG4gIH0pO1xuICBwaWUucHVzaCh7XG4gICAgbmFtZTogJ3BpZS1ob2xlJyxcbiAgICB0eXBlOiB0LnNpemVNYXliZVBlcmNlbnRcbiAgfSk7XG4gIHBpZS5wdXNoKHtcbiAgICBuYW1lOiAncGllLXN0YXJ0LWFuZ2xlJyxcbiAgICB0eXBlOiB0LmFuZ2xlXG4gIH0pO1xuICBmb3IgKHZhciBpID0gMTsgaSA8PSBzdHlmbiQyLnBpZUJhY2tncm91bmROOyBpKyspIHtcbiAgICBwaWUucHVzaCh7XG4gICAgICBuYW1lOiAncGllLScgKyBpICsgJy1iYWNrZ3JvdW5kLWNvbG9yJyxcbiAgICAgIHR5cGU6IHQuY29sb3JcbiAgICB9KTtcbiAgICBwaWUucHVzaCh7XG4gICAgICBuYW1lOiAncGllLScgKyBpICsgJy1iYWNrZ3JvdW5kLXNpemUnLFxuICAgICAgdHlwZTogdC5wZXJjZW50XG4gICAgfSk7XG4gICAgcGllLnB1c2goe1xuICAgICAgbmFtZTogJ3BpZS0nICsgaSArICctYmFja2dyb3VuZC1vcGFjaXR5JyxcbiAgICAgIHR5cGU6IHQuemVyb09uZU51bWJlclxuICAgIH0pO1xuICB9XG5cbiAgLy8gc3RyaXBlIGJhY2tncm91bmRzIGZvciBub2Rlc1xuICB2YXIgc3RyaXBlID0gW107XG4gIHN0eWZuJDIuc3RyaXBlQmFja2dyb3VuZE4gPSAxNjsgLy8gYmVjYXVzZSB0aGUgc3RyaXBlIHByb3BlcnRpZXMgYXJlIG51bWJlcmVkLCBnaXZlIGFjY2VzcyB0byBhIGNvbnN0YW50IE4gKGZvciByZW5kZXJlciB1c2UpXG4gIHN0cmlwZS5wdXNoKHtcbiAgICBuYW1lOiAnc3RyaXBlLXNpemUnLFxuICAgIHR5cGU6IHQuc2l6ZU1heWJlUGVyY2VudFxuICB9KTtcbiAgc3RyaXBlLnB1c2goe1xuICAgIG5hbWU6ICdzdHJpcGUtZGlyZWN0aW9uJyxcbiAgICB0eXBlOiB0LmF4aXNEaXJlY3Rpb25QcmltYXJ5XG4gIH0pO1xuICBmb3IgKHZhciBfaSA9IDE7IF9pIDw9IHN0eWZuJDIuc3RyaXBlQmFja2dyb3VuZE47IF9pKyspIHtcbiAgICBzdHJpcGUucHVzaCh7XG4gICAgICBuYW1lOiAnc3RyaXBlLScgKyBfaSArICctYmFja2dyb3VuZC1jb2xvcicsXG4gICAgICB0eXBlOiB0LmNvbG9yXG4gICAgfSk7XG4gICAgc3RyaXBlLnB1c2goe1xuICAgICAgbmFtZTogJ3N0cmlwZS0nICsgX2kgKyAnLWJhY2tncm91bmQtc2l6ZScsXG4gICAgICB0eXBlOiB0LnBlcmNlbnRcbiAgICB9KTtcbiAgICBzdHJpcGUucHVzaCh7XG4gICAgICBuYW1lOiAnc3RyaXBlLScgKyBfaSArICctYmFja2dyb3VuZC1vcGFjaXR5JyxcbiAgICAgIHR5cGU6IHQuemVyb09uZU51bWJlclxuICAgIH0pO1xuICB9XG5cbiAgLy8gZWRnZSBhcnJvd3NcbiAgdmFyIGVkZ2VBcnJvdyA9IFtdO1xuICB2YXIgYXJyb3dQcmVmaXhlcyA9IHN0eWZuJDIuYXJyb3dQcmVmaXhlcyA9IFsnc291cmNlJywgJ21pZC1zb3VyY2UnLCAndGFyZ2V0JywgJ21pZC10YXJnZXQnXTtcbiAgW3tcbiAgICBuYW1lOiAnYXJyb3ctc2hhcGUnLFxuICAgIHR5cGU6IHQuYXJyb3dTaGFwZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdhcnJvdy1jb2xvcicsXG4gICAgdHlwZTogdC5jb2xvclxuICB9LCB7XG4gICAgbmFtZTogJ2Fycm93LWZpbGwnLFxuICAgIHR5cGU6IHQuYXJyb3dGaWxsXG4gIH0sIHtcbiAgICBuYW1lOiAnYXJyb3ctd2lkdGgnLFxuICAgIHR5cGU6IHQuYXJyb3dXaWR0aFxuICB9XS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgYXJyb3dQcmVmaXhlcy5mb3JFYWNoKGZ1bmN0aW9uIChwcmVmaXgpIHtcbiAgICAgIHZhciBuYW1lID0gcHJlZml4ICsgJy0nICsgcHJvcC5uYW1lO1xuICAgICAgdmFyIHR5cGUgPSBwcm9wLnR5cGUsXG4gICAgICAgIHRyaWdnZXJzQm91bmRzID0gcHJvcC50cmlnZ2Vyc0JvdW5kcztcbiAgICAgIGVkZ2VBcnJvdy5wdXNoKHtcbiAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgdHJpZ2dlcnNCb3VuZHM6IHRyaWdnZXJzQm91bmRzXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSwge30pO1xuICB2YXIgcHJvcHMgPSBzdHlmbiQyLnByb3BlcnRpZXMgPSBbXS5jb25jYXQoYmVoYXZpb3IsIHRyYW5zaXRpb24sIHZpc2liaWxpdHksIG92ZXJsYXksIHVuZGVybGF5LCBnaG9zdCwgY29tbW9uTGFiZWwsIGxhYmVsRGltZW5zaW9ucywgbWFpbkxhYmVsLCBzb3VyY2VMYWJlbCwgdGFyZ2V0TGFiZWwsIG5vZGVCb2R5LCBub2RlQm9yZGVyLCBub2RlT3V0bGluZSwgYmFja2dyb3VuZEltYWdlLCBwaWUsIHN0cmlwZSwgY29tcG91bmQsIGVkZ2VMaW5lLCBlZGdlQXJyb3csIGNvcmUpO1xuICB2YXIgcHJvcEdyb3VwcyA9IHN0eWZuJDIucHJvcGVydHlHcm91cHMgPSB7XG4gICAgLy8gY29tbW9uIHRvIGFsbCBlbGVzXG4gICAgYmVoYXZpb3I6IGJlaGF2aW9yLFxuICAgIHRyYW5zaXRpb246IHRyYW5zaXRpb24sXG4gICAgdmlzaWJpbGl0eTogdmlzaWJpbGl0eSxcbiAgICBvdmVybGF5OiBvdmVybGF5LFxuICAgIHVuZGVybGF5OiB1bmRlcmxheSxcbiAgICBnaG9zdDogZ2hvc3QsXG4gICAgLy8gbGFiZWxzXG4gICAgY29tbW9uTGFiZWw6IGNvbW1vbkxhYmVsLFxuICAgIGxhYmVsRGltZW5zaW9uczogbGFiZWxEaW1lbnNpb25zLFxuICAgIG1haW5MYWJlbDogbWFpbkxhYmVsLFxuICAgIHNvdXJjZUxhYmVsOiBzb3VyY2VMYWJlbCxcbiAgICB0YXJnZXRMYWJlbDogdGFyZ2V0TGFiZWwsXG4gICAgLy8gbm9kZSBwcm9wc1xuICAgIG5vZGVCb2R5OiBub2RlQm9keSxcbiAgICBub2RlQm9yZGVyOiBub2RlQm9yZGVyLFxuICAgIG5vZGVPdXRsaW5lOiBub2RlT3V0bGluZSxcbiAgICBiYWNrZ3JvdW5kSW1hZ2U6IGJhY2tncm91bmRJbWFnZSxcbiAgICBwaWU6IHBpZSxcbiAgICBzdHJpcGU6IHN0cmlwZSxcbiAgICBjb21wb3VuZDogY29tcG91bmQsXG4gICAgLy8gZWRnZSBwcm9wc1xuICAgIGVkZ2VMaW5lOiBlZGdlTGluZSxcbiAgICBlZGdlQXJyb3c6IGVkZ2VBcnJvdyxcbiAgICBjb3JlOiBjb3JlXG4gIH07XG4gIHZhciBwcm9wR3JvdXBOYW1lcyA9IHN0eWZuJDIucHJvcGVydHlHcm91cE5hbWVzID0ge307XG4gIHZhciBwcm9wR3JvdXBLZXlzID0gc3R5Zm4kMi5wcm9wZXJ0eUdyb3VwS2V5cyA9IE9iamVjdC5rZXlzKHByb3BHcm91cHMpO1xuICBwcm9wR3JvdXBLZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIHByb3BHcm91cE5hbWVzW2tleV0gPSBwcm9wR3JvdXBzW2tleV0ubWFwKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICByZXR1cm4gcHJvcC5uYW1lO1xuICAgIH0pO1xuICAgIHByb3BHcm91cHNba2V5XS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICByZXR1cm4gcHJvcC5ncm91cEtleSA9IGtleTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gZGVmaW5lIGFsaWFzZXNcbiAgdmFyIGFsaWFzZXMgPSBzdHlmbiQyLmFsaWFzZXMgPSBbe1xuICAgIG5hbWU6ICdjb250ZW50JyxcbiAgICBwb2ludHNUbzogJ2xhYmVsJ1xuICB9LCB7XG4gICAgbmFtZTogJ2NvbnRyb2wtcG9pbnQtZGlzdGFuY2UnLFxuICAgIHBvaW50c1RvOiAnY29udHJvbC1wb2ludC1kaXN0YW5jZXMnXG4gIH0sIHtcbiAgICBuYW1lOiAnY29udHJvbC1wb2ludC13ZWlnaHQnLFxuICAgIHBvaW50c1RvOiAnY29udHJvbC1wb2ludC13ZWlnaHRzJ1xuICB9LCB7XG4gICAgbmFtZTogJ3NlZ21lbnQtZGlzdGFuY2UnLFxuICAgIHBvaW50c1RvOiAnc2VnbWVudC1kaXN0YW5jZXMnXG4gIH0sIHtcbiAgICBuYW1lOiAnc2VnbWVudC13ZWlnaHQnLFxuICAgIHBvaW50c1RvOiAnc2VnbWVudC13ZWlnaHRzJ1xuICB9LCB7XG4gICAgbmFtZTogJ3NlZ21lbnQtcmFkaXVzJyxcbiAgICBwb2ludHNUbzogJ3NlZ21lbnQtcmFkaWknXG4gIH0sIHtcbiAgICBuYW1lOiAnZWRnZS10ZXh0LXJvdGF0aW9uJyxcbiAgICBwb2ludHNUbzogJ3RleHQtcm90YXRpb24nXG4gIH0sIHtcbiAgICBuYW1lOiAncGFkZGluZy1sZWZ0JyxcbiAgICBwb2ludHNUbzogJ3BhZGRpbmcnXG4gIH0sIHtcbiAgICBuYW1lOiAncGFkZGluZy1yaWdodCcsXG4gICAgcG9pbnRzVG86ICdwYWRkaW5nJ1xuICB9LCB7XG4gICAgbmFtZTogJ3BhZGRpbmctdG9wJyxcbiAgICBwb2ludHNUbzogJ3BhZGRpbmcnXG4gIH0sIHtcbiAgICBuYW1lOiAncGFkZGluZy1ib3R0b20nLFxuICAgIHBvaW50c1RvOiAncGFkZGluZydcbiAgfV07XG5cbiAgLy8gbGlzdCBvZiBwcm9wZXJ0eSBuYW1lc1xuICBzdHlmbiQyLnByb3BlcnR5TmFtZXMgPSBwcm9wcy5tYXAoZnVuY3Rpb24gKHApIHtcbiAgICByZXR1cm4gcC5uYW1lO1xuICB9KTtcblxuICAvLyBhbGxvdyBhY2Nlc3Mgb2YgcHJvcGVydGllcyBieSBuYW1lICggZS5nLiBzdHlsZS5wcm9wZXJ0aWVzLmhlaWdodCApXG4gIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IHByb3BzLmxlbmd0aDsgX2kyKyspIHtcbiAgICB2YXIgcHJvcCA9IHByb3BzW19pMl07XG4gICAgcHJvcHNbcHJvcC5uYW1lXSA9IHByb3A7IC8vIGFsbG93IGxvb2t1cCBieSBuYW1lXG4gIH1cblxuICAvLyBtYXAgYWxpYXNlc1xuICBmb3IgKHZhciBfaTMgPSAwOyBfaTMgPCBhbGlhc2VzLmxlbmd0aDsgX2kzKyspIHtcbiAgICB2YXIgYWxpYXMgPSBhbGlhc2VzW19pM107XG4gICAgdmFyIHBvaW50c1RvUHJvcCA9IHByb3BzW2FsaWFzLnBvaW50c1RvXTtcbiAgICB2YXIgYWxpYXNQcm9wID0ge1xuICAgICAgbmFtZTogYWxpYXMubmFtZSxcbiAgICAgIGFsaWFzOiB0cnVlLFxuICAgICAgcG9pbnRzVG86IHBvaW50c1RvUHJvcFxuICAgIH07XG5cbiAgICAvLyBhZGQgYWxpYXMgcHJvcCBmb3IgcGFyc2luZ1xuICAgIHByb3BzLnB1c2goYWxpYXNQcm9wKTtcbiAgICBwcm9wc1thbGlhcy5uYW1lXSA9IGFsaWFzUHJvcDsgLy8gYWxsb3cgbG9va3VwIGJ5IG5hbWVcbiAgfVxufSkoKTtcbnN0eWZuJDIuZ2V0RGVmYXVsdFByb3BlcnR5ID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgcmV0dXJuIHRoaXMuZ2V0RGVmYXVsdFByb3BlcnRpZXMoKVtuYW1lXTtcbn07XG5zdHlmbiQyLmdldERlZmF1bHRQcm9wZXJ0aWVzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuICBpZiAoX3AuZGVmYXVsdFByb3BlcnRpZXMgIT0gbnVsbCkge1xuICAgIHJldHVybiBfcC5kZWZhdWx0UHJvcGVydGllcztcbiAgfVxuICB2YXIgcmF3UHJvcHMgPSBleHRlbmQoe1xuICAgIC8vIGNvcmUgcHJvcHNcbiAgICAnc2VsZWN0aW9uLWJveC1jb2xvcic6ICcjZGRkJyxcbiAgICAnc2VsZWN0aW9uLWJveC1vcGFjaXR5JzogMC42NSxcbiAgICAnc2VsZWN0aW9uLWJveC1ib3JkZXItY29sb3InOiAnI2FhYScsXG4gICAgJ3NlbGVjdGlvbi1ib3gtYm9yZGVyLXdpZHRoJzogMSxcbiAgICAnYWN0aXZlLWJnLWNvbG9yJzogJ2JsYWNrJyxcbiAgICAnYWN0aXZlLWJnLW9wYWNpdHknOiAwLjE1LFxuICAgICdhY3RpdmUtYmctc2l6ZSc6IDMwLFxuICAgICdvdXRzaWRlLXRleHR1cmUtYmctY29sb3InOiAnIzAwMCcsXG4gICAgJ291dHNpZGUtdGV4dHVyZS1iZy1vcGFjaXR5JzogMC4xMjUsXG4gICAgLy8gY29tbW9uIG5vZGUvZWRnZSBwcm9wc1xuICAgICdldmVudHMnOiAneWVzJyxcbiAgICAndGV4dC1ldmVudHMnOiAnbm8nLFxuICAgICd0ZXh0LXZhbGlnbic6ICd0b3AnLFxuICAgICd0ZXh0LWhhbGlnbic6ICdjZW50ZXInLFxuICAgICd0ZXh0LWp1c3RpZmljYXRpb24nOiAnYXV0bycsXG4gICAgJ2xpbmUtaGVpZ2h0JzogMSxcbiAgICAnY29sb3InOiAnIzAwMCcsXG4gICAgJ2JveC1zZWxlY3Rpb24nOiAnY29udGFpbicsXG4gICAgJ3RleHQtb3V0bGluZS1jb2xvcic6ICcjMDAwJyxcbiAgICAndGV4dC1vdXRsaW5lLXdpZHRoJzogMCxcbiAgICAndGV4dC1vdXRsaW5lLW9wYWNpdHknOiAxLFxuICAgICd0ZXh0LW9wYWNpdHknOiAxLFxuICAgICd0ZXh0LWRlY29yYXRpb24nOiAnbm9uZScsXG4gICAgJ3RleHQtdHJhbnNmb3JtJzogJ25vbmUnLFxuICAgICd0ZXh0LXdyYXAnOiAnbm9uZScsXG4gICAgJ3RleHQtb3ZlcmZsb3ctd3JhcCc6ICd3aGl0ZXNwYWNlJyxcbiAgICAndGV4dC1tYXgtd2lkdGgnOiA5OTk5LFxuICAgICd0ZXh0LWJhY2tncm91bmQtY29sb3InOiAnIzAwMCcsXG4gICAgJ3RleHQtYmFja2dyb3VuZC1vcGFjaXR5JzogMCxcbiAgICAndGV4dC1iYWNrZ3JvdW5kLXNoYXBlJzogJ3JlY3RhbmdsZScsXG4gICAgJ3RleHQtYmFja2dyb3VuZC1wYWRkaW5nJzogMCxcbiAgICAndGV4dC1ib3JkZXItb3BhY2l0eSc6IDAsXG4gICAgJ3RleHQtYm9yZGVyLXdpZHRoJzogMCxcbiAgICAndGV4dC1ib3JkZXItc3R5bGUnOiAnc29saWQnLFxuICAgICd0ZXh0LWJvcmRlci1jb2xvcic6ICcjMDAwJyxcbiAgICAnZm9udC1mYW1pbHknOiAnSGVsdmV0aWNhIE5ldWUsIEhlbHZldGljYSwgc2Fucy1zZXJpZicsXG4gICAgJ2ZvbnQtc3R5bGUnOiAnbm9ybWFsJyxcbiAgICAnZm9udC13ZWlnaHQnOiAnbm9ybWFsJyxcbiAgICAnZm9udC1zaXplJzogMTYsXG4gICAgJ21pbi16b29tZWQtZm9udC1zaXplJzogMCxcbiAgICAndGV4dC1yb3RhdGlvbic6ICdub25lJyxcbiAgICAnc291cmNlLXRleHQtcm90YXRpb24nOiAnbm9uZScsXG4gICAgJ3RhcmdldC10ZXh0LXJvdGF0aW9uJzogJ25vbmUnLFxuICAgICd2aXNpYmlsaXR5JzogJ3Zpc2libGUnLFxuICAgICdkaXNwbGF5JzogJ2VsZW1lbnQnLFxuICAgICdvcGFjaXR5JzogMSxcbiAgICAnei1jb21wb3VuZC1kZXB0aCc6ICdhdXRvJyxcbiAgICAnei1pbmRleC1jb21wYXJlJzogJ2F1dG8nLFxuICAgICd6LWluZGV4JzogMCxcbiAgICAnbGFiZWwnOiAnJyxcbiAgICAndGV4dC1tYXJnaW4teCc6IDAsXG4gICAgJ3RleHQtbWFyZ2luLXknOiAwLFxuICAgICdzb3VyY2UtbGFiZWwnOiAnJyxcbiAgICAnc291cmNlLXRleHQtb2Zmc2V0JzogMCxcbiAgICAnc291cmNlLXRleHQtbWFyZ2luLXgnOiAwLFxuICAgICdzb3VyY2UtdGV4dC1tYXJnaW4teSc6IDAsXG4gICAgJ3RhcmdldC1sYWJlbCc6ICcnLFxuICAgICd0YXJnZXQtdGV4dC1vZmZzZXQnOiAwLFxuICAgICd0YXJnZXQtdGV4dC1tYXJnaW4teCc6IDAsXG4gICAgJ3RhcmdldC10ZXh0LW1hcmdpbi15JzogMCxcbiAgICAnb3ZlcmxheS1vcGFjaXR5JzogMCxcbiAgICAnb3ZlcmxheS1jb2xvcic6ICcjMDAwJyxcbiAgICAnb3ZlcmxheS1wYWRkaW5nJzogMTAsXG4gICAgJ292ZXJsYXktc2hhcGUnOiAncm91bmQtcmVjdGFuZ2xlJyxcbiAgICAnb3ZlcmxheS1jb3JuZXItcmFkaXVzJzogJ2F1dG8nLFxuICAgICd1bmRlcmxheS1vcGFjaXR5JzogMCxcbiAgICAndW5kZXJsYXktY29sb3InOiAnIzAwMCcsXG4gICAgJ3VuZGVybGF5LXBhZGRpbmcnOiAxMCxcbiAgICAndW5kZXJsYXktc2hhcGUnOiAncm91bmQtcmVjdGFuZ2xlJyxcbiAgICAndW5kZXJsYXktY29ybmVyLXJhZGl1cyc6ICdhdXRvJyxcbiAgICAndGV4dC1tZXRyaWNzJzogJ2ZvbnQnLFxuICAgICd0cmFuc2l0aW9uLXByb3BlcnR5JzogJ25vbmUnLFxuICAgICd0cmFuc2l0aW9uLWR1cmF0aW9uJzogMCxcbiAgICAndHJhbnNpdGlvbi1kZWxheSc6IDAsXG4gICAgJ3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uJzogJ2xpbmVhcicsXG4gICAgJ2JveC1zZWxlY3QtbGFiZWxzJzogJ25vJyxcbiAgICAvLyBub2RlIHByb3BzXG4gICAgJ2JhY2tncm91bmQtYmxhY2tlbic6IDAsXG4gICAgJ2JhY2tncm91bmQtY29sb3InOiAnIzk5OScsXG4gICAgJ2JhY2tncm91bmQtZmlsbCc6ICdzb2xpZCcsXG4gICAgJ2JhY2tncm91bmQtb3BhY2l0eSc6IDEsXG4gICAgJ2JhY2tncm91bmQtaW1hZ2UnOiAnbm9uZScsXG4gICAgJ2JhY2tncm91bmQtaW1hZ2UtY3Jvc3NvcmlnaW4nOiAnYW5vbnltb3VzJyxcbiAgICAnYmFja2dyb3VuZC1pbWFnZS1vcGFjaXR5JzogMSxcbiAgICAnYmFja2dyb3VuZC1pbWFnZS1jb250YWlubWVudCc6ICdpbnNpZGUnLFxuICAgICdiYWNrZ3JvdW5kLWltYWdlLXNtb290aGluZyc6ICd5ZXMnLFxuICAgICdiYWNrZ3JvdW5kLXBvc2l0aW9uLXgnOiAnNTAlJyxcbiAgICAnYmFja2dyb3VuZC1wb3NpdGlvbi15JzogJzUwJScsXG4gICAgJ2JhY2tncm91bmQtb2Zmc2V0LXgnOiAwLFxuICAgICdiYWNrZ3JvdW5kLW9mZnNldC15JzogMCxcbiAgICAnYmFja2dyb3VuZC13aWR0aC1yZWxhdGl2ZS10byc6ICdpbmNsdWRlLXBhZGRpbmcnLFxuICAgICdiYWNrZ3JvdW5kLWhlaWdodC1yZWxhdGl2ZS10byc6ICdpbmNsdWRlLXBhZGRpbmcnLFxuICAgICdiYWNrZ3JvdW5kLXJlcGVhdCc6ICduby1yZXBlYXQnLFxuICAgICdiYWNrZ3JvdW5kLWZpdCc6ICdub25lJyxcbiAgICAnYmFja2dyb3VuZC1jbGlwJzogJ25vZGUnLFxuICAgICdiYWNrZ3JvdW5kLXdpZHRoJzogJ2F1dG8nLFxuICAgICdiYWNrZ3JvdW5kLWhlaWdodCc6ICdhdXRvJyxcbiAgICAnYm9yZGVyLWNvbG9yJzogJyMwMDAnLFxuICAgICdib3JkZXItb3BhY2l0eSc6IDEsXG4gICAgJ2JvcmRlci13aWR0aCc6IDAsXG4gICAgJ2JvcmRlci1zdHlsZSc6ICdzb2xpZCcsXG4gICAgJ2JvcmRlci1kYXNoLXBhdHRlcm4nOiBbNCwgMl0sXG4gICAgJ2JvcmRlci1kYXNoLW9mZnNldCc6IDAsXG4gICAgJ2JvcmRlci1jYXAnOiAnYnV0dCcsXG4gICAgJ2JvcmRlci1qb2luJzogJ21pdGVyJyxcbiAgICAnYm9yZGVyLXBvc2l0aW9uJzogJ2NlbnRlcicsXG4gICAgJ291dGxpbmUtY29sb3InOiAnIzk5OScsXG4gICAgJ291dGxpbmUtb3BhY2l0eSc6IDEsXG4gICAgJ291dGxpbmUtd2lkdGgnOiAwLFxuICAgICdvdXRsaW5lLW9mZnNldCc6IDAsXG4gICAgJ291dGxpbmUtc3R5bGUnOiAnc29saWQnLFxuICAgICdoZWlnaHQnOiAzMCxcbiAgICAnd2lkdGgnOiAzMCxcbiAgICAnc2hhcGUnOiAnZWxsaXBzZScsXG4gICAgJ3NoYXBlLXBvbHlnb24tcG9pbnRzJzogJy0xLCAtMSwgICAxLCAtMSwgICAxLCAxLCAgIC0xLCAxJyxcbiAgICAnY29ybmVyLXJhZGl1cyc6ICdhdXRvJyxcbiAgICAnYm91bmRzLWV4cGFuc2lvbic6IDAsXG4gICAgLy8gbm9kZSBncmFkaWVudFxuICAgICdiYWNrZ3JvdW5kLWdyYWRpZW50LWRpcmVjdGlvbic6ICd0by1ib3R0b20nLFxuICAgICdiYWNrZ3JvdW5kLWdyYWRpZW50LXN0b3AtY29sb3JzJzogJyM5OTknLFxuICAgICdiYWNrZ3JvdW5kLWdyYWRpZW50LXN0b3AtcG9zaXRpb25zJzogJzAlJyxcbiAgICAvLyBnaG9zdCBwcm9wc1xuICAgICdnaG9zdCc6ICdubycsXG4gICAgJ2dob3N0LW9mZnNldC15JzogMCxcbiAgICAnZ2hvc3Qtb2Zmc2V0LXgnOiAwLFxuICAgICdnaG9zdC1vcGFjaXR5JzogMCxcbiAgICAvLyBjb21wb3VuZCBwcm9wc1xuICAgICdwYWRkaW5nJzogMCxcbiAgICAncGFkZGluZy1yZWxhdGl2ZS10byc6ICd3aWR0aCcsXG4gICAgJ3Bvc2l0aW9uJzogJ29yaWdpbicsXG4gICAgJ2NvbXBvdW5kLXNpemluZy13cnQtbGFiZWxzJzogJ2luY2x1ZGUnLFxuICAgICdtaW4td2lkdGgnOiAwLFxuICAgICdtaW4td2lkdGgtYmlhcy1sZWZ0JzogMCxcbiAgICAnbWluLXdpZHRoLWJpYXMtcmlnaHQnOiAwLFxuICAgICdtaW4taGVpZ2h0JzogMCxcbiAgICAnbWluLWhlaWdodC1iaWFzLXRvcCc6IDAsXG4gICAgJ21pbi1oZWlnaHQtYmlhcy1ib3R0b20nOiAwXG4gIH0sIHtcbiAgICAvLyBub2RlIHBpZSBiZ1xuICAgICdwaWUtc2l6ZSc6ICcxMDAlJyxcbiAgICAncGllLWhvbGUnOiAwLFxuICAgICdwaWUtc3RhcnQtYW5nbGUnOiAnMGRlZydcbiAgfSwgW3tcbiAgICBuYW1lOiAncGllLXt7aX19LWJhY2tncm91bmQtY29sb3InLFxuICAgIHZhbHVlOiAnYmxhY2snXG4gIH0sIHtcbiAgICBuYW1lOiAncGllLXt7aX19LWJhY2tncm91bmQtc2l6ZScsXG4gICAgdmFsdWU6ICcwJSdcbiAgfSwge1xuICAgIG5hbWU6ICdwaWUte3tpfX0tYmFja2dyb3VuZC1vcGFjaXR5JyxcbiAgICB2YWx1ZTogMVxuICB9XS5yZWR1Y2UoZnVuY3Rpb24gKGNzcywgcHJvcCkge1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDw9IHN0eWZuJDIucGllQmFja2dyb3VuZE47IGkrKykge1xuICAgICAgdmFyIG5hbWUgPSBwcm9wLm5hbWUucmVwbGFjZSgne3tpfX0nLCBpKTtcbiAgICAgIHZhciB2YWwgPSBwcm9wLnZhbHVlO1xuICAgICAgY3NzW25hbWVdID0gdmFsO1xuICAgIH1cbiAgICByZXR1cm4gY3NzO1xuICB9LCB7fSksIHtcbiAgICAvLyBub2RlIHN0cmlwZXMgYmdcbiAgICAnc3RyaXBlLXNpemUnOiAnMTAwJScsXG4gICAgJ3N0cmlwZS1kaXJlY3Rpb24nOiAnaG9yaXpvbnRhbCdcbiAgfSwgW3tcbiAgICBuYW1lOiAnc3RyaXBlLXt7aX19LWJhY2tncm91bmQtY29sb3InLFxuICAgIHZhbHVlOiAnYmxhY2snXG4gIH0sIHtcbiAgICBuYW1lOiAnc3RyaXBlLXt7aX19LWJhY2tncm91bmQtc2l6ZScsXG4gICAgdmFsdWU6ICcwJSdcbiAgfSwge1xuICAgIG5hbWU6ICdzdHJpcGUte3tpfX0tYmFja2dyb3VuZC1vcGFjaXR5JyxcbiAgICB2YWx1ZTogMVxuICB9XS5yZWR1Y2UoZnVuY3Rpb24gKGNzcywgcHJvcCkge1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDw9IHN0eWZuJDIuc3RyaXBlQmFja2dyb3VuZE47IGkrKykge1xuICAgICAgdmFyIG5hbWUgPSBwcm9wLm5hbWUucmVwbGFjZSgne3tpfX0nLCBpKTtcbiAgICAgIHZhciB2YWwgPSBwcm9wLnZhbHVlO1xuICAgICAgY3NzW25hbWVdID0gdmFsO1xuICAgIH1cbiAgICByZXR1cm4gY3NzO1xuICB9LCB7fSksIHtcbiAgICAvLyBlZGdlIHByb3BzXG4gICAgJ2xpbmUtc3R5bGUnOiAnc29saWQnLFxuICAgICdsaW5lLWNvbG9yJzogJyM5OTknLFxuICAgICdsaW5lLWZpbGwnOiAnc29saWQnLFxuICAgICdsaW5lLWNhcCc6ICdidXR0JyxcbiAgICAnbGluZS1vcGFjaXR5JzogMSxcbiAgICAnbGluZS1vdXRsaW5lLXdpZHRoJzogMCxcbiAgICAnbGluZS1vdXRsaW5lLWNvbG9yJzogJyMwMDAnLFxuICAgICdsaW5lLWdyYWRpZW50LXN0b3AtY29sb3JzJzogJyM5OTknLFxuICAgICdsaW5lLWdyYWRpZW50LXN0b3AtcG9zaXRpb25zJzogJzAlJyxcbiAgICAnY29udHJvbC1wb2ludC1zdGVwLXNpemUnOiA0MCxcbiAgICAnY29udHJvbC1wb2ludC13ZWlnaHRzJzogMC41LFxuICAgICdzZWdtZW50LXdlaWdodHMnOiAwLjUsXG4gICAgJ3NlZ21lbnQtZGlzdGFuY2VzJzogMjAsXG4gICAgJ3NlZ21lbnQtcmFkaWknOiAxNSxcbiAgICAncmFkaXVzLXR5cGUnOiAnYXJjLXJhZGl1cycsXG4gICAgJ3RheGktdHVybic6ICc1MCUnLFxuICAgICd0YXhpLXJhZGl1cyc6IDE1LFxuICAgICd0YXhpLXR1cm4tbWluLWRpc3RhbmNlJzogMTAsXG4gICAgJ3RheGktZGlyZWN0aW9uJzogJ2F1dG8nLFxuICAgICdlZGdlLWRpc3RhbmNlcyc6ICdpbnRlcnNlY3Rpb24nLFxuICAgICdjdXJ2ZS1zdHlsZSc6ICdoYXlzdGFjaycsXG4gICAgJ2hheXN0YWNrLXJhZGl1cyc6IDAsXG4gICAgJ2Fycm93LXNjYWxlJzogMSxcbiAgICAnbG9vcC1kaXJlY3Rpb24nOiAnLTQ1ZGVnJyxcbiAgICAnbG9vcC1zd2VlcCc6ICctOTBkZWcnLFxuICAgICdzb3VyY2UtZGlzdGFuY2UtZnJvbS1ub2RlJzogMCxcbiAgICAndGFyZ2V0LWRpc3RhbmNlLWZyb20tbm9kZSc6IDAsXG4gICAgJ3NvdXJjZS1lbmRwb2ludCc6ICdvdXRzaWRlLXRvLW5vZGUnLFxuICAgICd0YXJnZXQtZW5kcG9pbnQnOiAnb3V0c2lkZS10by1ub2RlJyxcbiAgICAnbGluZS1kYXNoLXBhdHRlcm4nOiBbNiwgM10sXG4gICAgJ2xpbmUtZGFzaC1vZmZzZXQnOiAwXG4gIH0sIFt7XG4gICAgbmFtZTogJ2Fycm93LXNoYXBlJyxcbiAgICB2YWx1ZTogJ25vbmUnXG4gIH0sIHtcbiAgICBuYW1lOiAnYXJyb3ctY29sb3InLFxuICAgIHZhbHVlOiAnIzk5OSdcbiAgfSwge1xuICAgIG5hbWU6ICdhcnJvdy1maWxsJyxcbiAgICB2YWx1ZTogJ2ZpbGxlZCdcbiAgfSwge1xuICAgIG5hbWU6ICdhcnJvdy13aWR0aCcsXG4gICAgdmFsdWU6IDFcbiAgfV0ucmVkdWNlKGZ1bmN0aW9uIChjc3MsIHByb3ApIHtcbiAgICBzdHlmbiQyLmFycm93UHJlZml4ZXMuZm9yRWFjaChmdW5jdGlvbiAocHJlZml4KSB7XG4gICAgICB2YXIgbmFtZSA9IHByZWZpeCArICctJyArIHByb3AubmFtZTtcbiAgICAgIHZhciB2YWwgPSBwcm9wLnZhbHVlO1xuICAgICAgY3NzW25hbWVdID0gdmFsO1xuICAgIH0pO1xuICAgIHJldHVybiBjc3M7XG4gIH0sIHt9KSk7XG4gIHZhciBwYXJzZWRQcm9wcyA9IHt9O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBwcm9wID0gdGhpcy5wcm9wZXJ0aWVzW2ldO1xuICAgIGlmIChwcm9wLnBvaW50c1RvKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdmFyIG5hbWUgPSBwcm9wLm5hbWU7XG4gICAgdmFyIHZhbCA9IHJhd1Byb3BzW25hbWVdO1xuICAgIHZhciBwYXJzZWRQcm9wID0gdGhpcy5wYXJzZShuYW1lLCB2YWwpO1xuICAgIHBhcnNlZFByb3BzW25hbWVdID0gcGFyc2VkUHJvcDtcbiAgfVxuICBfcC5kZWZhdWx0UHJvcGVydGllcyA9IHBhcnNlZFByb3BzO1xuICByZXR1cm4gX3AuZGVmYXVsdFByb3BlcnRpZXM7XG59O1xuc3R5Zm4kMi5hZGREZWZhdWx0U3R5bGVzaGVldCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5zZWxlY3RvcignOnBhcmVudCcpLmNzcyh7XG4gICAgJ3NoYXBlJzogJ3JlY3RhbmdsZScsXG4gICAgJ3BhZGRpbmcnOiAxMCxcbiAgICAnYmFja2dyb3VuZC1jb2xvcic6ICcjZWVlJyxcbiAgICAnYm9yZGVyLWNvbG9yJzogJyNjY2MnLFxuICAgICdib3JkZXItd2lkdGgnOiAxXG4gIH0pLnNlbGVjdG9yKCdlZGdlJykuY3NzKHtcbiAgICAnd2lkdGgnOiAzXG4gIH0pLnNlbGVjdG9yKCc6bG9vcCcpLmNzcyh7XG4gICAgJ2N1cnZlLXN0eWxlJzogJ2JlemllcidcbiAgfSkuc2VsZWN0b3IoJ2VkZ2U6Y29tcG91bmQnKS5jc3Moe1xuICAgICdjdXJ2ZS1zdHlsZSc6ICdiZXppZXInLFxuICAgICdzb3VyY2UtZW5kcG9pbnQnOiAnb3V0c2lkZS10by1saW5lJyxcbiAgICAndGFyZ2V0LWVuZHBvaW50JzogJ291dHNpZGUtdG8tbGluZSdcbiAgfSkuc2VsZWN0b3IoJzpzZWxlY3RlZCcpLmNzcyh7XG4gICAgJ2JhY2tncm91bmQtY29sb3InOiAnIzAxNjlEOScsXG4gICAgJ2xpbmUtY29sb3InOiAnIzAxNjlEOScsXG4gICAgJ3NvdXJjZS1hcnJvdy1jb2xvcic6ICcjMDE2OUQ5JyxcbiAgICAndGFyZ2V0LWFycm93LWNvbG9yJzogJyMwMTY5RDknLFxuICAgICdtaWQtc291cmNlLWFycm93LWNvbG9yJzogJyMwMTY5RDknLFxuICAgICdtaWQtdGFyZ2V0LWFycm93LWNvbG9yJzogJyMwMTY5RDknXG4gIH0pLnNlbGVjdG9yKCc6cGFyZW50OnNlbGVjdGVkJykuY3NzKHtcbiAgICAnYmFja2dyb3VuZC1jb2xvcic6ICcjQ0NFMUY5JyxcbiAgICAnYm9yZGVyLWNvbG9yJzogJyNhZWM4ZTUnXG4gIH0pLnNlbGVjdG9yKCc6YWN0aXZlJykuY3NzKHtcbiAgICAnb3ZlcmxheS1jb2xvcic6ICdibGFjaycsXG4gICAgJ292ZXJsYXktcGFkZGluZyc6IDEwLFxuICAgICdvdmVybGF5LW9wYWNpdHknOiAwLjI1XG4gIH0pO1xuICB0aGlzLmRlZmF1bHRMZW5ndGggPSB0aGlzLmxlbmd0aDtcbn07XG5cbnZhciBzdHlmbiQxID0ge307XG5cbi8vIGEgY2FjaGluZyBsYXllciBmb3IgcHJvcGVydHkgcGFyc2luZ1xuc3R5Zm4kMS5wYXJzZSA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSwgcHJvcElzQnlwYXNzLCBwcm9wSXNGbGF0KSB7XG4gIHZhciBzZWxmID0gdGhpcztcblxuICAvLyBmdW5jdGlvbiB2YWx1ZXMgY2FuJ3QgYmUgY2FjaGVkIGluIGFsbCBjYXNlcywgYW5kIHRoZXJlIGlzbid0IG11Y2ggYmVuZWZpdCBvZiBjYWNoaW5nIHRoZW0gYW55d2F5XG4gIGlmIChmbiQ2KHZhbHVlKSkge1xuICAgIHJldHVybiBzZWxmLnBhcnNlSW1wbFdhcm4obmFtZSwgdmFsdWUsIHByb3BJc0J5cGFzcywgcHJvcElzRmxhdCk7XG4gIH1cbiAgdmFyIGZsYXRLZXkgPSBwcm9wSXNGbGF0ID09PSAnbWFwcGluZycgfHwgcHJvcElzRmxhdCA9PT0gdHJ1ZSB8fCBwcm9wSXNGbGF0ID09PSBmYWxzZSB8fCBwcm9wSXNGbGF0ID09IG51bGwgPyAnZG9udGNhcmUnIDogcHJvcElzRmxhdDtcbiAgdmFyIGJ5cGFzc0tleSA9IHByb3BJc0J5cGFzcyA/ICd0JyA6ICdmJztcbiAgdmFyIHZhbHVlS2V5ID0gJycgKyB2YWx1ZTtcbiAgdmFyIGFyZ0hhc2ggPSBoYXNoU3RyaW5ncyhuYW1lLCB2YWx1ZUtleSwgYnlwYXNzS2V5LCBmbGF0S2V5KTtcbiAgdmFyIHByb3BDYWNoZSA9IHNlbGYucHJvcENhY2hlID0gc2VsZi5wcm9wQ2FjaGUgfHwgW107XG4gIHZhciByZXQ7XG4gIGlmICghKHJldCA9IHByb3BDYWNoZVthcmdIYXNoXSkpIHtcbiAgICByZXQgPSBwcm9wQ2FjaGVbYXJnSGFzaF0gPSBzZWxmLnBhcnNlSW1wbFdhcm4obmFtZSwgdmFsdWUsIHByb3BJc0J5cGFzcywgcHJvcElzRmxhdCk7XG4gIH1cblxuICAvLyAtIGJ5cGFzc2VzIGNhbid0IGJlIHNoYXJlZCBiL2MgdGhlIHZhbHVlIGNhbiBiZSBjaGFuZ2VkIGJ5IGFuaW1hdGlvbnMgb3Igb3RoZXJ3aXNlIG92ZXJyaWRkZW5cbiAgLy8gLSBtYXBwaW5ncyBjYW4ndCBiZSBzaGFyZWQgYi9jIG1hcHBpbmdzIGFyZSBwZXItZWxlbWVudFxuICBpZiAocHJvcElzQnlwYXNzIHx8IHByb3BJc0ZsYXQgPT09ICdtYXBwaW5nJykge1xuICAgIC8vIG5lZWQgYSBjb3B5IHNpbmNlIHByb3BzIGFyZSBtdXRhdGVkIGxhdGVyIGluIHRoZWlyIGxpZmVjeWNsZXNcbiAgICByZXQgPSBjb3B5KHJldCk7XG4gICAgaWYgKHJldCkge1xuICAgICAgcmV0LnZhbHVlID0gY29weShyZXQudmFsdWUpOyAvLyBiZWNhdXNlIGl0IGNvdWxkIGJlIGFuIGFycmF5LCBlLmcuIGNvbG91clxuICAgIH1cbiAgfVxuICByZXR1cm4gcmV0O1xufTtcbnN0eWZuJDEucGFyc2VJbXBsV2FybiA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSwgcHJvcElzQnlwYXNzLCBwcm9wSXNGbGF0KSB7XG4gIHZhciBwcm9wID0gdGhpcy5wYXJzZUltcGwobmFtZSwgdmFsdWUsIHByb3BJc0J5cGFzcywgcHJvcElzRmxhdCk7XG4gIGlmICghcHJvcCAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgd2FybihcIlRoZSBzdHlsZSBwcm9wZXJ0eSBgXCIuY29uY2F0KG5hbWUsIFwiOiBcIikuY29uY2F0KHZhbHVlLCBcImAgaXMgaW52YWxpZFwiKSk7XG4gIH1cbiAgaWYgKHByb3AgJiYgKHByb3AubmFtZSA9PT0gJ3dpZHRoJyB8fCBwcm9wLm5hbWUgPT09ICdoZWlnaHQnKSAmJiB2YWx1ZSA9PT0gJ2xhYmVsJykge1xuICAgIHdhcm4oJ1RoZSBzdHlsZSB2YWx1ZSBvZiBgbGFiZWxgIGlzIGRlcHJlY2F0ZWQgZm9yIGAnICsgcHJvcC5uYW1lICsgJ2AnKTtcbiAgfVxuICByZXR1cm4gcHJvcDtcbn07XG5cbi8vIHBhcnNlIGEgcHJvcGVydHk7IHJldHVybiBudWxsIG9uIGludmFsaWQ7IHJldHVybiBwYXJzZWQgcHJvcGVydHkgb3RoZXJ3aXNlXG4vLyBmaWVsZHMgOlxuLy8gLSBuYW1lIDogdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5XG4vLyAtIHZhbHVlIDogdGhlIHBhcnNlZCwgbmF0aXZlLXR5cGVkIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eVxuLy8gLSBzdHJWYWx1ZSA6IGEgc3RyaW5nIHZhbHVlIHRoYXQgcmVwcmVzZW50cyB0aGUgcHJvcGVydHkgdmFsdWUgaW4gdmFsaWQgY3NzXG4vLyAtIGJ5cGFzcyA6IHRydWUgaWZmIHRoZSBwcm9wZXJ0eSBpcyBhIGJ5cGFzcyBwcm9wZXJ0eVxuc3R5Zm4kMS5wYXJzZUltcGwgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUsIHByb3BJc0J5cGFzcywgcHJvcElzRmxhdCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIG5hbWUgPSBjYW1lbDJkYXNoKG5hbWUpOyAvLyBtYWtlIHN1cmUgdGhlIHByb3BlcnR5IG5hbWUgaXMgaW4gZGFzaCBmb3JtIChlLmcuICdwcm9wZXJ0eS1uYW1lJyBub3QgJ3Byb3BlcnR5TmFtZScpXG5cbiAgdmFyIHByb3BlcnR5ID0gc2VsZi5wcm9wZXJ0aWVzW25hbWVdO1xuICB2YXIgcGFzc2VkVmFsdWUgPSB2YWx1ZTtcbiAgdmFyIHR5cGVzID0gc2VsZi50eXBlcztcbiAgaWYgKCFwcm9wZXJ0eSkge1xuICAgIHJldHVybiBudWxsO1xuICB9IC8vIHJldHVybiBudWxsIG9uIHByb3BlcnR5IG9mIHVua25vd24gbmFtZVxuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9IC8vIGNhbid0IGFzc2lnbiB1bmRlZmluZWRcblxuICAvLyB0aGUgcHJvcGVydHkgbWF5IGJlIGFuIGFsaWFzXG4gIGlmIChwcm9wZXJ0eS5hbGlhcykge1xuICAgIHByb3BlcnR5ID0gcHJvcGVydHkucG9pbnRzVG87XG4gICAgbmFtZSA9IHByb3BlcnR5Lm5hbWU7XG4gIH1cbiAgdmFyIHZhbHVlSXNTdHJpbmcgPSBzdHJpbmcodmFsdWUpO1xuICBpZiAodmFsdWVJc1N0cmluZykge1xuICAgIC8vIHRyaW0gdGhlIHZhbHVlIHRvIG1ha2UgcGFyc2luZyBlYXNpZXJcbiAgICB2YWx1ZSA9IHZhbHVlLnRyaW0oKTtcbiAgfVxuICB2YXIgdHlwZSA9IHByb3BlcnR5LnR5cGU7XG4gIGlmICghdHlwZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9IC8vIG5vIHR5cGUsIG5vIGx1Y2tcblxuICAvLyBjaGVjayBpZiBieXBhc3MgaXMgbnVsbCBvciBlbXB0eSBzdHJpbmcgKGkuZS4gaW5kaWNhdGlvbiB0byBkZWxldGUgYnlwYXNzIHByb3BlcnR5KVxuICBpZiAocHJvcElzQnlwYXNzICYmICh2YWx1ZSA9PT0gJycgfHwgdmFsdWUgPT09IG51bGwpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBieXBhc3M6IHRydWUsXG4gICAgICBkZWxldGVCeXBhc3M6IHRydWVcbiAgICB9O1xuICB9XG5cbiAgLy8gY2hlY2sgaWYgdmFsdWUgaXMgYSBmdW5jdGlvbiB1c2VkIGFzIGEgbWFwcGVyXG4gIGlmIChmbiQ2KHZhbHVlKSkge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgc3RyVmFsdWU6ICdmbicsXG4gICAgICBtYXBwZWQ6IHR5cGVzLmZuLFxuICAgICAgYnlwYXNzOiBwcm9wSXNCeXBhc3NcbiAgICB9O1xuICB9XG5cbiAgLy8gY2hlY2sgaWYgdmFsdWUgaXMgbWFwcGVkXG4gIHZhciBkYXRhLCBtYXBEYXRhO1xuICBpZiAoIXZhbHVlSXNTdHJpbmcgfHwgcHJvcElzRmxhdCB8fCB2YWx1ZS5sZW5ndGggPCA3IHx8IHZhbHVlWzFdICE9PSAnYScpIDsgZWxzZSBpZiAodmFsdWUubGVuZ3RoID49IDcgJiYgdmFsdWVbMF0gPT09ICdkJyAmJiAoZGF0YSA9IG5ldyBSZWdFeHAodHlwZXMuZGF0YS5yZWdleCkuZXhlYyh2YWx1ZSkpKSB7XG4gICAgaWYgKHByb3BJc0J5cGFzcykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gbWFwcGVycyBub3QgYWxsb3dlZCBpbiBieXBhc3NcblxuICAgIHZhciBtYXBwZWQgPSB0eXBlcy5kYXRhO1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgdmFsdWU6IGRhdGEsXG4gICAgICBzdHJWYWx1ZTogJycgKyB2YWx1ZSxcbiAgICAgIG1hcHBlZDogbWFwcGVkLFxuICAgICAgZmllbGQ6IGRhdGFbMV0sXG4gICAgICBieXBhc3M6IHByb3BJc0J5cGFzc1xuICAgIH07XG4gIH0gZWxzZSBpZiAodmFsdWUubGVuZ3RoID49IDEwICYmIHZhbHVlWzBdID09PSAnbScgJiYgKG1hcERhdGEgPSBuZXcgUmVnRXhwKHR5cGVzLm1hcERhdGEucmVnZXgpLmV4ZWModmFsdWUpKSkge1xuICAgIGlmIChwcm9wSXNCeXBhc3MpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IC8vIG1hcHBlcnMgbm90IGFsbG93ZWQgaW4gYnlwYXNzXG4gICAgaWYgKHR5cGUubXVsdGlwbGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IC8vIGltcG9zc2libGUgdG8gbWFwIHRvIG51bVxuXG4gICAgdmFyIF9tYXBwZWQgPSB0eXBlcy5tYXBEYXRhO1xuXG4gICAgLy8gd2UgY2FuIG1hcCBvbmx5IGlmIHRoZSB0eXBlIGlzIGEgY29sb3VyIG9yIGEgbnVtYmVyXG4gICAgaWYgKCEodHlwZS5jb2xvciB8fCB0eXBlLm51bWJlcikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIHZhbHVlTWluID0gdGhpcy5wYXJzZShuYW1lLCBtYXBEYXRhWzRdKTsgLy8gcGFyc2UgdG8gdmFsaWRhdGVcbiAgICBpZiAoIXZhbHVlTWluIHx8IHZhbHVlTWluLm1hcHBlZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gY2FuJ3QgYmUgaW52YWxpZCBvciBtYXBwZWRcblxuICAgIHZhciB2YWx1ZU1heCA9IHRoaXMucGFyc2UobmFtZSwgbWFwRGF0YVs1XSk7IC8vIHBhcnNlIHRvIHZhbGlkYXRlXG4gICAgaWYgKCF2YWx1ZU1heCB8fCB2YWx1ZU1heC5tYXBwZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IC8vIGNhbid0IGJlIGludmFsaWQgb3IgbWFwcGVkXG5cbiAgICAvLyBjaGVjayBpZiB2YWx1ZU1pbiBhbmQgdmFsdWVNYXggYXJlIHRoZSBzYW1lXG4gICAgaWYgKHZhbHVlTWluLnBmVmFsdWUgPT09IHZhbHVlTWF4LnBmVmFsdWUgfHwgdmFsdWVNaW4uc3RyVmFsdWUgPT09IHZhbHVlTWF4LnN0clZhbHVlKSB7XG4gICAgICB3YXJuKCdgJyArIG5hbWUgKyAnOiAnICsgdmFsdWUgKyAnYCBpcyBub3QgYSB2YWxpZCBtYXBwZXIgYmVjYXVzZSB0aGUgb3V0cHV0IHJhbmdlIGlzIHplcm87IGNvbnZlcnRpbmcgdG8gYCcgKyBuYW1lICsgJzogJyArIHZhbHVlTWluLnN0clZhbHVlICsgJ2AnKTtcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlKG5hbWUsIHZhbHVlTWluLnN0clZhbHVlKTsgLy8gY2FuJ3QgbWFrZSBtdWNoIG9mIGEgbWFwcGVyIHdpdGhvdXQgYSByYW5nZVxuICAgIH0gZWxzZSBpZiAodHlwZS5jb2xvcikge1xuICAgICAgdmFyIGMxID0gdmFsdWVNaW4udmFsdWU7XG4gICAgICB2YXIgYzIgPSB2YWx1ZU1heC52YWx1ZTtcbiAgICAgIHZhciBzYW1lID0gYzFbMF0gPT09IGMyWzBdIC8vIHJlZFxuICAgICAgJiYgYzFbMV0gPT09IGMyWzFdIC8vIGdyZWVuXG4gICAgICAmJiBjMVsyXSA9PT0gYzJbMl0gLy8gYmx1ZVxuICAgICAgJiYgKFxuICAgICAgLy8gb3B0aW9uYWwgYWxwaGFcbiAgICAgIGMxWzNdID09PSBjMlszXSAvLyBzYW1lIGFscGhhIG91dHJpZ2h0XG4gICAgICB8fCAoYzFbM10gPT0gbnVsbCB8fCBjMVszXSA9PT0gMSAvLyBmdWxsIG9wYWNpdHkgZm9yIGNvbG91ciAxP1xuICAgICAgKSAmJiAoYzJbM10gPT0gbnVsbCB8fCBjMlszXSA9PT0gMSkgLy8gZnVsbCBvcGFjaXR5IGZvciBjb2xvdXIgMj9cbiAgICAgICk7XG4gICAgICBpZiAoc2FtZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9IC8vIGNhbid0IG1ha2UgYSBtYXBwZXIgd2l0aG91dCBhIHJhbmdlXG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgdmFsdWU6IG1hcERhdGEsXG4gICAgICBzdHJWYWx1ZTogJycgKyB2YWx1ZSxcbiAgICAgIG1hcHBlZDogX21hcHBlZCxcbiAgICAgIGZpZWxkOiBtYXBEYXRhWzFdLFxuICAgICAgZmllbGRNaW46IHBhcnNlRmxvYXQobWFwRGF0YVsyXSksXG4gICAgICAvLyBtaW4gJiBtYXggYXJlIG51bWVyaWNcbiAgICAgIGZpZWxkTWF4OiBwYXJzZUZsb2F0KG1hcERhdGFbM10pLFxuICAgICAgdmFsdWVNaW46IHZhbHVlTWluLnZhbHVlLFxuICAgICAgdmFsdWVNYXg6IHZhbHVlTWF4LnZhbHVlLFxuICAgICAgYnlwYXNzOiBwcm9wSXNCeXBhc3NcbiAgICB9O1xuICB9XG4gIGlmICh0eXBlLm11bHRpcGxlICYmIHByb3BJc0ZsYXQgIT09ICdtdWx0aXBsZScpIHtcbiAgICB2YXIgdmFscztcbiAgICBpZiAodmFsdWVJc1N0cmluZykge1xuICAgICAgdmFscyA9IHZhbHVlLnNwbGl0KC9cXHMrLyk7XG4gICAgfSBlbHNlIGlmIChhcnJheSh2YWx1ZSkpIHtcbiAgICAgIHZhbHMgPSB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFscyA9IFt2YWx1ZV07XG4gICAgfVxuICAgIGlmICh0eXBlLmV2ZW5NdWx0aXBsZSAmJiB2YWxzLmxlbmd0aCAlIDIgIT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB2YXIgdmFsQXJyID0gW107XG4gICAgdmFyIHVuaXRzQXJyID0gW107XG4gICAgdmFyIHBmVmFsQXJyID0gW107XG4gICAgdmFyIHN0clZhbCA9ICcnO1xuICAgIHZhciBoYXNFbnVtID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcCA9IHNlbGYucGFyc2UobmFtZSwgdmFsc1tpXSwgcHJvcElzQnlwYXNzLCAnbXVsdGlwbGUnKTtcbiAgICAgIGhhc0VudW0gPSBoYXNFbnVtIHx8IHN0cmluZyhwLnZhbHVlKTtcbiAgICAgIHZhbEFyci5wdXNoKHAudmFsdWUpO1xuICAgICAgcGZWYWxBcnIucHVzaChwLnBmVmFsdWUgIT0gbnVsbCA/IHAucGZWYWx1ZSA6IHAudmFsdWUpO1xuICAgICAgdW5pdHNBcnIucHVzaChwLnVuaXRzKTtcbiAgICAgIHN0clZhbCArPSAoaSA+IDAgPyAnICcgOiAnJykgKyBwLnN0clZhbHVlO1xuICAgIH1cbiAgICBpZiAodHlwZS52YWxpZGF0ZSAmJiAhdHlwZS52YWxpZGF0ZSh2YWxBcnIsIHVuaXRzQXJyKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmICh0eXBlLnNpbmdsZUVudW0gJiYgaGFzRW51bSkge1xuICAgICAgaWYgKHZhbEFyci5sZW5ndGggPT09IDEgJiYgc3RyaW5nKHZhbEFyclswXSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgIHZhbHVlOiB2YWxBcnJbMF0sXG4gICAgICAgICAgc3RyVmFsdWU6IHZhbEFyclswXSxcbiAgICAgICAgICBieXBhc3M6IHByb3BJc0J5cGFzc1xuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgdmFsdWU6IHZhbEFycixcbiAgICAgIHBmVmFsdWU6IHBmVmFsQXJyLFxuICAgICAgc3RyVmFsdWU6IHN0clZhbCxcbiAgICAgIGJ5cGFzczogcHJvcElzQnlwYXNzLFxuICAgICAgdW5pdHM6IHVuaXRzQXJyXG4gICAgfTtcbiAgfVxuXG4gIC8vIHNldmVyYWwgdHlwZXMgYWxzbyBhbGxvdyBlbnVtc1xuICB2YXIgY2hlY2tFbnVtcyA9IGZ1bmN0aW9uIGNoZWNrRW51bXMoKSB7XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IHR5cGUuZW51bXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgZW4gPSB0eXBlLmVudW1zW19pXTtcbiAgICAgIGlmIChlbiA9PT0gdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICBzdHJWYWx1ZTogJycgKyB2YWx1ZSxcbiAgICAgICAgICBieXBhc3M6IHByb3BJc0J5cGFzc1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICAvLyBjaGVjayB0aGUgdHlwZSBhbmQgcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBvYmplY3RcbiAgaWYgKHR5cGUubnVtYmVyKSB7XG4gICAgdmFyIHVuaXRzO1xuICAgIHZhciBpbXBsaWNpdFVuaXRzID0gJ3B4JzsgLy8gbm90IHNldCA9PiBweFxuXG4gICAgaWYgKHR5cGUudW5pdHMpIHtcbiAgICAgIC8vIHVzZSBzcGVjaWZpZWQgdW5pdHMgaWYgc2V0XG4gICAgICB1bml0cyA9IHR5cGUudW5pdHM7XG4gICAgfVxuICAgIGlmICh0eXBlLmltcGxpY2l0VW5pdHMpIHtcbiAgICAgIGltcGxpY2l0VW5pdHMgPSB0eXBlLmltcGxpY2l0VW5pdHM7XG4gICAgfVxuICAgIGlmICghdHlwZS51bml0bGVzcykge1xuICAgICAgaWYgKHZhbHVlSXNTdHJpbmcpIHtcbiAgICAgICAgdmFyIHVuaXRzUmVnZXggPSAncHh8ZW0nICsgKHR5cGUuYWxsb3dQZXJjZW50ID8gJ3xcXFxcJScgOiAnJyk7XG4gICAgICAgIGlmICh1bml0cykge1xuICAgICAgICAgIHVuaXRzUmVnZXggPSB1bml0cztcbiAgICAgICAgfSAvLyBvbmx5IGFsbG93IGV4cGxpY2l0IHVuaXRzIGlmIHNvIHNldFxuICAgICAgICB2YXIgbWF0Y2ggPSB2YWx1ZS5tYXRjaCgnXignICsgbnVtYmVyICsgJykoJyArIHVuaXRzUmVnZXggKyAnKT8nICsgJyQnKTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgdmFsdWUgPSBtYXRjaFsxXTtcbiAgICAgICAgICB1bml0cyA9IG1hdGNoWzJdIHx8IGltcGxpY2l0VW5pdHM7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIXVuaXRzIHx8IHR5cGUuaW1wbGljaXRVbml0cykge1xuICAgICAgICB1bml0cyA9IGltcGxpY2l0VW5pdHM7IC8vIGltcGxpY2l0bHkgcHggaWYgdW5zcGVjaWZpZWRcbiAgICAgIH1cbiAgICB9XG4gICAgdmFsdWUgPSBwYXJzZUZsb2F0KHZhbHVlKTtcblxuICAgIC8vIGlmIG5vdCBhIG51bWJlciBhbmQgZW51bXMgbm90IGFsbG93ZWQsIHRoZW4gdGhlIHZhbHVlIGlzIGludmFsaWRcbiAgICBpZiAoaXNOYU4odmFsdWUpICYmIHR5cGUuZW51bXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgaWYgdGhpcyBudW1iZXIgdHlwZSBhbHNvIGFjY2VwdHMgc3BlY2lhbCBrZXl3b3JkcyBpbiBwbGFjZSBvZiBudW1iZXJzXG4gICAgLy8gKGkuZS4gYGxlZnRgLCBgYXV0b2AsIGV0YylcbiAgICBpZiAoaXNOYU4odmFsdWUpICYmIHR5cGUuZW51bXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFsdWUgPSBwYXNzZWRWYWx1ZTtcbiAgICAgIHJldHVybiBjaGVja0VudW1zKCk7XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgaWYgdmFsdWUgbXVzdCBiZSBhbiBpbnRlZ2VyXG4gICAgaWYgKHR5cGUuaW50ZWdlciAmJiAhaW50ZWdlcih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIGNoZWNrIHZhbHVlIGlzIHdpdGhpbiByYW5nZVxuICAgIGlmICh0eXBlLm1pbiAhPT0gdW5kZWZpbmVkICYmICh2YWx1ZSA8IHR5cGUubWluIHx8IHR5cGUuc3RyaWN0TWluICYmIHZhbHVlID09PSB0eXBlLm1pbikgfHwgdHlwZS5tYXggIT09IHVuZGVmaW5lZCAmJiAodmFsdWUgPiB0eXBlLm1heCB8fCB0eXBlLnN0cmljdE1heCAmJiB2YWx1ZSA9PT0gdHlwZS5tYXgpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdmFyIHJldCA9IHtcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBzdHJWYWx1ZTogJycgKyB2YWx1ZSArICh1bml0cyA/IHVuaXRzIDogJycpLFxuICAgICAgdW5pdHM6IHVuaXRzLFxuICAgICAgYnlwYXNzOiBwcm9wSXNCeXBhc3NcbiAgICB9O1xuXG4gICAgLy8gbm9ybWFsaXNlIHZhbHVlIGluIHBpeGVsc1xuICAgIGlmICh0eXBlLnVuaXRsZXNzIHx8IHVuaXRzICE9PSAncHgnICYmIHVuaXRzICE9PSAnZW0nKSB7XG4gICAgICByZXQucGZWYWx1ZSA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXQucGZWYWx1ZSA9IHVuaXRzID09PSAncHgnIHx8ICF1bml0cyA/IHZhbHVlIDogdGhpcy5nZXRFbVNpemVJblBpeGVscygpICogdmFsdWU7XG4gICAgfVxuXG4gICAgLy8gbm9ybWFsaXNlIHZhbHVlIGluIG1zXG4gICAgaWYgKHVuaXRzID09PSAnbXMnIHx8IHVuaXRzID09PSAncycpIHtcbiAgICAgIHJldC5wZlZhbHVlID0gdW5pdHMgPT09ICdtcycgPyB2YWx1ZSA6IDEwMDAgKiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBub3JtYWxpc2UgdmFsdWUgaW4gcmFkXG4gICAgaWYgKHVuaXRzID09PSAnZGVnJyB8fCB1bml0cyA9PT0gJ3JhZCcpIHtcbiAgICAgIHJldC5wZlZhbHVlID0gdW5pdHMgPT09ICdyYWQnID8gdmFsdWUgOiBkZWcycmFkKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvLyBub3JtYWxpemUgdmFsdWUgaW4gJVxuICAgIGlmICh1bml0cyA9PT0gJyUnKSB7XG4gICAgICByZXQucGZWYWx1ZSA9IHZhbHVlIC8gMTAwO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9IGVsc2UgaWYgKHR5cGUucHJvcExpc3QpIHtcbiAgICB2YXIgcHJvcHMgPSBbXTtcbiAgICB2YXIgcHJvcHNTdHIgPSAnJyArIHZhbHVlO1xuICAgIGlmIChwcm9wc1N0ciA9PT0gJ25vbmUnKSA7IGVsc2Uge1xuICAgICAgLy8gZ28gb3ZlciBlYWNoIHByb3BcblxuICAgICAgdmFyIHByb3BzU3BsaXQgPSBwcm9wc1N0ci5zcGxpdCgvXFxzKixcXHMqfFxccysvKTtcbiAgICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IHByb3BzU3BsaXQubGVuZ3RoOyBfaTIrKykge1xuICAgICAgICB2YXIgcHJvcE5hbWUgPSBwcm9wc1NwbGl0W19pMl0udHJpbSgpO1xuICAgICAgICBpZiAoc2VsZi5wcm9wZXJ0aWVzW3Byb3BOYW1lXSkge1xuICAgICAgICAgIHByb3BzLnB1c2gocHJvcE5hbWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHdhcm4oJ2AnICsgcHJvcE5hbWUgKyAnYCBpcyBub3QgYSB2YWxpZCBwcm9wZXJ0eSBuYW1lJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChwcm9wcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgdmFsdWU6IHByb3BzLFxuICAgICAgc3RyVmFsdWU6IHByb3BzLmxlbmd0aCA9PT0gMCA/ICdub25lJyA6IHByb3BzLmpvaW4oJyAnKSxcbiAgICAgIGJ5cGFzczogcHJvcElzQnlwYXNzXG4gICAgfTtcbiAgfSBlbHNlIGlmICh0eXBlLmNvbG9yKSB7XG4gICAgdmFyIHR1cGxlID0gY29sb3IydHVwbGUodmFsdWUpO1xuICAgIGlmICghdHVwbGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIHZhbHVlOiB0dXBsZSxcbiAgICAgIHBmVmFsdWU6IHR1cGxlLFxuICAgICAgc3RyVmFsdWU6ICdyZ2IoJyArIHR1cGxlWzBdICsgJywnICsgdHVwbGVbMV0gKyAnLCcgKyB0dXBsZVsyXSArICcpJyxcbiAgICAgIC8vIG4uYi4gbm8gc3BhY2VzIGIvYyBvZiBtdWx0aXBsZSBzdXBwb3J0XG4gICAgICBieXBhc3M6IHByb3BJc0J5cGFzc1xuICAgIH07XG4gIH0gZWxzZSBpZiAodHlwZS5yZWdleCB8fCB0eXBlLnJlZ2V4ZXMpIHtcbiAgICAvLyBmaXJzdCBjaGVjayBlbnVtc1xuICAgIGlmICh0eXBlLmVudW1zKSB7XG4gICAgICB2YXIgZW51bVByb3AgPSBjaGVja0VudW1zKCk7XG4gICAgICBpZiAoZW51bVByb3ApIHtcbiAgICAgICAgcmV0dXJuIGVudW1Qcm9wO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgcmVnZXhlcyA9IHR5cGUucmVnZXhlcyA/IHR5cGUucmVnZXhlcyA6IFt0eXBlLnJlZ2V4XTtcbiAgICBmb3IgKHZhciBfaTMgPSAwOyBfaTMgPCByZWdleGVzLmxlbmd0aDsgX2kzKyspIHtcbiAgICAgIHZhciByZWdleCA9IG5ldyBSZWdFeHAocmVnZXhlc1tfaTNdKTsgLy8gbWFrZSBhIHJlZ2V4IGZyb20gdGhlIHR5cGUgc3RyaW5nXG4gICAgICB2YXIgbSA9IHJlZ2V4LmV4ZWModmFsdWUpO1xuICAgICAgaWYgKG0pIHtcbiAgICAgICAgLy8gcmVnZXggbWF0Y2hlc1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgdmFsdWU6IHR5cGUuc2luZ2xlUmVnZXhNYXRjaFZhbHVlID8gbVsxXSA6IG0sXG4gICAgICAgICAgc3RyVmFsdWU6ICcnICsgdmFsdWUsXG4gICAgICAgICAgYnlwYXNzOiBwcm9wSXNCeXBhc3NcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7IC8vIGRpZG4ndCBtYXRjaCBhbnlcbiAgfSBlbHNlIGlmICh0eXBlLnN0cmluZykge1xuICAgIC8vIGp1c3QgcmV0dXJuXG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICB2YWx1ZTogJycgKyB2YWx1ZSxcbiAgICAgIHN0clZhbHVlOiAnJyArIHZhbHVlLFxuICAgICAgYnlwYXNzOiBwcm9wSXNCeXBhc3NcbiAgICB9O1xuICB9IGVsc2UgaWYgKHR5cGUuZW51bXMpIHtcbiAgICAvLyBjaGVjayBlbnVtcyBsYXN0IGJlY2F1c2UgaXQncyBhIGNvbWJvIHR5cGUgaW4gb3RoZXJzXG4gICAgcmV0dXJuIGNoZWNrRW51bXMoKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbDsgLy8gbm90IGEgdHlwZSB3ZSBjYW4gaGFuZGxlXG4gIH1cbn07XG5cbnZhciBfU3R5bGUgPSBmdW5jdGlvbiBTdHlsZShjeSkge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgX1N0eWxlKSkge1xuICAgIHJldHVybiBuZXcgX1N0eWxlKGN5KTtcbiAgfVxuICBpZiAoIWNvcmUoY3kpKSB7XG4gICAgZXJyb3IoJ0Egc3R5bGUgbXVzdCBoYXZlIGEgY29yZSByZWZlcmVuY2UnKTtcbiAgICByZXR1cm47XG4gIH1cbiAgdGhpcy5fcHJpdmF0ZSA9IHtcbiAgICBjeTogY3ksXG4gICAgY29yZVN0eWxlOiB7fVxuICB9O1xuICB0aGlzLmxlbmd0aCA9IDA7XG4gIHRoaXMucmVzZXRUb0RlZmF1bHQoKTtcbn07XG52YXIgc3R5Zm4gPSBfU3R5bGUucHJvdG90eXBlO1xuc3R5Zm4uaW5zdGFuY2VTdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAnc3R5bGUnO1xufTtcblxuLy8gcmVtb3ZlIGFsbCBjb250ZXh0c1xuc3R5Zm4uY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG4gIHZhciBjeSA9IF9wLmN5O1xuICB2YXIgZWxlcyA9IGN5LmVsZW1lbnRzKCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgIHRoaXNbaV0gPSB1bmRlZmluZWQ7XG4gIH1cbiAgdGhpcy5sZW5ndGggPSAwO1xuICBfcC5jb250ZXh0U3R5bGVzID0ge307XG4gIF9wLnByb3BEaWZmcyA9IHt9O1xuICB0aGlzLmNsZWFuRWxlbWVudHMoZWxlcywgdHJ1ZSk7XG4gIGVsZXMuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgdmFyIGVsZV9wID0gZWxlWzBdLl9wcml2YXRlO1xuICAgIGVsZV9wLnN0eWxlRGlydHkgPSB0cnVlO1xuICAgIGVsZV9wLmFwcGxpZWRJbml0U3R5bGUgPSBmYWxzZTtcbiAgfSk7XG4gIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xufTtcbnN0eWZuLnJlc2V0VG9EZWZhdWx0ID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmNsZWFyKCk7XG4gIHRoaXMuYWRkRGVmYXVsdFN0eWxlc2hlZXQoKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBidWlsZHMgYSBzdHlsZSBvYmplY3QgZm9yIHRoZSAnY29yZScgc2VsZWN0b3JcbnN0eWZuLmNvcmUgPSBmdW5jdGlvbiAocHJvcE5hbWUpIHtcbiAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuY29yZVN0eWxlW3Byb3BOYW1lXSB8fCB0aGlzLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wTmFtZSk7XG59O1xuXG4vLyBjcmVhdGUgYSBuZXcgY29udGV4dCBmcm9tIHRoZSBzcGVjaWZpZWQgc2VsZWN0b3Igc3RyaW5nIGFuZCBzd2l0Y2ggdG8gdGhhdCBjb250ZXh0XG5zdHlmbi5zZWxlY3RvciA9IGZ1bmN0aW9uIChzZWxlY3RvclN0cikge1xuICAvLyAnY29yZScgaXMgYSBzcGVjaWFsIGNhc2UgYW5kIGRvZXMgbm90IG5lZWQgYSBzZWxlY3RvclxuICB2YXIgc2VsZWN0b3IgPSBzZWxlY3RvclN0ciA9PT0gJ2NvcmUnID8gbnVsbCA6IG5ldyBTZWxlY3RvcihzZWxlY3RvclN0cik7XG4gIHZhciBpID0gdGhpcy5sZW5ndGgrKzsgLy8gbmV3IGNvbnRleHQgbWVhbnMgbmV3IGluZGV4XG4gIHRoaXNbaV0gPSB7XG4gICAgc2VsZWN0b3I6IHNlbGVjdG9yLFxuICAgIHByb3BlcnRpZXM6IFtdLFxuICAgIG1hcHBlZFByb3BlcnRpZXM6IFtdLFxuICAgIGluZGV4OiBpXG4gIH07XG4gIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xufTtcblxuLy8gYWRkIG9uZSBvciBtYW55IGNzcyBydWxlcyB0byB0aGUgY3VycmVudCBjb250ZXh0XG5zdHlmbi5jc3MgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gIGlmIChhcmdzLmxlbmd0aCA9PT0gMSkge1xuICAgIHZhciBtYXAgPSBhcmdzWzBdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5wcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcHJvcCA9IHNlbGYucHJvcGVydGllc1tpXTtcbiAgICAgIHZhciBtYXBWYWwgPSBtYXBbcHJvcC5uYW1lXTtcbiAgICAgIGlmIChtYXBWYWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBtYXBWYWwgPSBtYXBbZGFzaDJjYW1lbChwcm9wLm5hbWUpXTtcbiAgICAgIH1cbiAgICAgIGlmIChtYXBWYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmNzc1J1bGUocHJvcC5uYW1lLCBtYXBWYWwpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PT0gMikge1xuICAgIHRoaXMuY3NzUnVsZShhcmdzWzBdLCBhcmdzWzFdKTtcbiAgfVxuXG4gIC8vIGRvIG5vdGhpbmcgaWYgYXJncyBhcmUgaW52YWxpZFxuXG4gIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xufTtcbnN0eWZuLnN0eWxlID0gc3R5Zm4uY3NzO1xuXG4vLyBhZGQgYSBzaW5nbGUgY3NzIHJ1bGUgdG8gdGhlIGN1cnJlbnQgY29udGV4dFxuc3R5Zm4uY3NzUnVsZSA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAvLyBuYW1lLXZhbHVlIHBhaXJcbiAgdmFyIHByb3BlcnR5ID0gdGhpcy5wYXJzZShuYW1lLCB2YWx1ZSk7XG5cbiAgLy8gYWRkIHByb3BlcnR5IHRvIGN1cnJlbnQgY29udGV4dCBpZiB2YWxpZFxuICBpZiAocHJvcGVydHkpIHtcbiAgICB2YXIgaSA9IHRoaXMubGVuZ3RoIC0gMTtcbiAgICB0aGlzW2ldLnByb3BlcnRpZXMucHVzaChwcm9wZXJ0eSk7XG4gICAgdGhpc1tpXS5wcm9wZXJ0aWVzW3Byb3BlcnR5Lm5hbWVdID0gcHJvcGVydHk7IC8vIGFsbG93IGFjY2VzcyBieSBuYW1lIGFzIHdlbGxcblxuICAgIGlmIChwcm9wZXJ0eS5uYW1lLm1hdGNoKC9waWUtKFxcZCspLWJhY2tncm91bmQtc2l6ZS8pICYmIHByb3BlcnR5LnZhbHVlKSB7XG4gICAgICB0aGlzLl9wcml2YXRlLmhhc1BpZSA9IHRydWU7XG4gICAgfVxuICAgIGlmIChwcm9wZXJ0eS5uYW1lLm1hdGNoKC9zdHJpcGUtKFxcZCspLWJhY2tncm91bmQtc2l6ZS8pICYmIHByb3BlcnR5LnZhbHVlKSB7XG4gICAgICB0aGlzLl9wcml2YXRlLmhhc1N0cmlwZSA9IHRydWU7XG4gICAgfVxuICAgIGlmIChwcm9wZXJ0eS5tYXBwZWQpIHtcbiAgICAgIHRoaXNbaV0ubWFwcGVkUHJvcGVydGllcy5wdXNoKHByb3BlcnR5KTtcbiAgICB9XG5cbiAgICAvLyBhZGQgdG8gY29yZSBzdHlsZSBpZiBuZWNlc3NhcnlcbiAgICB2YXIgY3VycmVudFNlbGVjdG9ySXNDb3JlID0gIXRoaXNbaV0uc2VsZWN0b3I7XG4gICAgaWYgKGN1cnJlbnRTZWxlY3RvcklzQ29yZSkge1xuICAgICAgdGhpcy5fcHJpdmF0ZS5jb3JlU3R5bGVbcHJvcGVydHkubmFtZV0gPSBwcm9wZXJ0eTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG59O1xuc3R5Zm4uYXBwZW5kID0gZnVuY3Rpb24gKHN0eWxlKSB7XG4gIGlmIChzdHlsZXNoZWV0KHN0eWxlKSkge1xuICAgIHN0eWxlLmFwcGVuZFRvU3R5bGUodGhpcyk7XG4gIH0gZWxzZSBpZiAoYXJyYXkoc3R5bGUpKSB7XG4gICAgdGhpcy5hcHBlbmRGcm9tSnNvbihzdHlsZSk7XG4gIH0gZWxzZSBpZiAoc3RyaW5nKHN0eWxlKSkge1xuICAgIHRoaXMuYXBwZW5kRnJvbVN0cmluZyhzdHlsZSk7XG4gIH0gLy8geW91IHByb2JhYmx5IHdvdWxkbid0IHdhbnQgdG8gYXBwZW5kIGEgU3R5bGUsIHNpbmNlIHlvdSdkIGR1cGxpY2F0ZSB0aGUgZGVmYXVsdCBwYXJ0c1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gc3RhdGljIGZ1bmN0aW9uXG5fU3R5bGUuZnJvbUpzb24gPSBmdW5jdGlvbiAoY3ksIGpzb24pIHtcbiAgdmFyIHN0eWxlID0gbmV3IF9TdHlsZShjeSk7XG4gIHN0eWxlLmZyb21Kc29uKGpzb24pO1xuICByZXR1cm4gc3R5bGU7XG59O1xuX1N0eWxlLmZyb21TdHJpbmcgPSBmdW5jdGlvbiAoY3ksIHN0cmluZykge1xuICByZXR1cm4gbmV3IF9TdHlsZShjeSkuZnJvbVN0cmluZyhzdHJpbmcpO1xufTtcbltzdHlmbiQ4LCBzdHlmbiQ3LCBzdHlmbiQ2LCBzdHlmbiQ1LCBzdHlmbiQ0LCBzdHlmbiQzLCBzdHlmbiQyLCBzdHlmbiQxXS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wcykge1xuICBleHRlbmQoc3R5Zm4sIHByb3BzKTtcbn0pO1xuX1N0eWxlLnR5cGVzID0gc3R5Zm4udHlwZXM7XG5fU3R5bGUucHJvcGVydGllcyA9IHN0eWZuLnByb3BlcnRpZXM7XG5fU3R5bGUucHJvcGVydHlHcm91cHMgPSBzdHlmbi5wcm9wZXJ0eUdyb3Vwcztcbl9TdHlsZS5wcm9wZXJ0eUdyb3VwTmFtZXMgPSBzdHlmbi5wcm9wZXJ0eUdyb3VwTmFtZXM7XG5fU3R5bGUucHJvcGVydHlHcm91cEtleXMgPSBzdHlmbi5wcm9wZXJ0eUdyb3VwS2V5cztcblxudmFyIGNvcmVmbiQyID0ge1xuICBzdHlsZTogZnVuY3Rpb24gc3R5bGUobmV3U3R5bGUpIHtcbiAgICBpZiAobmV3U3R5bGUpIHtcbiAgICAgIHZhciBzID0gdGhpcy5zZXRTdHlsZShuZXdTdHlsZSk7XG4gICAgICBzLnVwZGF0ZSgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5zdHlsZTtcbiAgfSxcbiAgc2V0U3R5bGU6IGZ1bmN0aW9uIHNldFN0eWxlKHN0eWxlKSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICBpZiAoc3R5bGVzaGVldChzdHlsZSkpIHtcbiAgICAgIF9wLnN0eWxlID0gc3R5bGUuZ2VuZXJhdGVTdHlsZSh0aGlzKTtcbiAgICB9IGVsc2UgaWYgKGFycmF5KHN0eWxlKSkge1xuICAgICAgX3Auc3R5bGUgPSBfU3R5bGUuZnJvbUpzb24odGhpcywgc3R5bGUpO1xuICAgIH0gZWxzZSBpZiAoc3RyaW5nKHN0eWxlKSkge1xuICAgICAgX3Auc3R5bGUgPSBfU3R5bGUuZnJvbVN0cmluZyh0aGlzLCBzdHlsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIF9wLnN0eWxlID0gX1N0eWxlKHRoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gX3Auc3R5bGU7XG4gIH0sXG4gIC8vIGUuZy4gY3kuZGF0YSgpIGNoYW5nZWQgPT4gcmVjYWxjIGVsZSBtYXBwZXJzXG4gIHVwZGF0ZVN0eWxlOiBmdW5jdGlvbiB1cGRhdGVTdHlsZSgpIHtcbiAgICB0aGlzLm11dGFibGVFbGVtZW50cygpLnVwZGF0ZVN0eWxlKCk7IC8vIGp1c3Qgc2VuZCB0byBhbGwgZWxlc1xuICB9XG59O1xuXG52YXIgZGVmYXVsdFNlbGVjdGlvblR5cGUgPSAnc2luZ2xlJztcbnZhciBjb3JlZm4kMSA9IHtcbiAgYXV0b2xvY2s6IGZ1bmN0aW9uIGF1dG9sb2NrKGJvb2wpIHtcbiAgICBpZiAoYm9vbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9wcml2YXRlLmF1dG9sb2NrID0gYm9vbCA/IHRydWUgOiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuYXV0b2xvY2s7XG4gICAgfVxuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuICBhdXRvdW5ncmFiaWZ5OiBmdW5jdGlvbiBhdXRvdW5ncmFiaWZ5KGJvb2wpIHtcbiAgICBpZiAoYm9vbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9wcml2YXRlLmF1dG91bmdyYWJpZnkgPSBib29sID8gdHJ1ZSA6IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5hdXRvdW5ncmFiaWZ5O1xuICAgIH1cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcbiAgYXV0b3Vuc2VsZWN0aWZ5OiBmdW5jdGlvbiBhdXRvdW5zZWxlY3RpZnkoYm9vbCkge1xuICAgIGlmIChib29sICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX3ByaXZhdGUuYXV0b3Vuc2VsZWN0aWZ5ID0gYm9vbCA/IHRydWUgOiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuYXV0b3Vuc2VsZWN0aWZ5O1xuICAgIH1cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcbiAgc2VsZWN0aW9uVHlwZTogZnVuY3Rpb24gc2VsZWN0aW9uVHlwZShzZWxUeXBlKSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICBpZiAoX3Auc2VsZWN0aW9uVHlwZSA9PSBudWxsKSB7XG4gICAgICBfcC5zZWxlY3Rpb25UeXBlID0gZGVmYXVsdFNlbGVjdGlvblR5cGU7XG4gICAgfVxuICAgIGlmIChzZWxUeXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChzZWxUeXBlID09PSAnYWRkaXRpdmUnIHx8IHNlbFR5cGUgPT09ICdzaW5nbGUnKSB7XG4gICAgICAgIF9wLnNlbGVjdGlvblR5cGUgPSBzZWxUeXBlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gX3Auc2VsZWN0aW9uVHlwZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIHBhbm5pbmdFbmFibGVkOiBmdW5jdGlvbiBwYW5uaW5nRW5hYmxlZChib29sKSB7XG4gICAgaWYgKGJvb2wgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fcHJpdmF0ZS5wYW5uaW5nRW5hYmxlZCA9IGJvb2wgPyB0cnVlIDogZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLl9wcml2YXRlLnBhbm5pbmdFbmFibGVkO1xuICAgIH1cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcbiAgdXNlclBhbm5pbmdFbmFibGVkOiBmdW5jdGlvbiB1c2VyUGFubmluZ0VuYWJsZWQoYm9vbCkge1xuICAgIGlmIChib29sICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX3ByaXZhdGUudXNlclBhbm5pbmdFbmFibGVkID0gYm9vbCA/IHRydWUgOiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUudXNlclBhbm5pbmdFbmFibGVkO1xuICAgIH1cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcbiAgem9vbWluZ0VuYWJsZWQ6IGZ1bmN0aW9uIHpvb21pbmdFbmFibGVkKGJvb2wpIHtcbiAgICBpZiAoYm9vbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9wcml2YXRlLnpvb21pbmdFbmFibGVkID0gYm9vbCA/IHRydWUgOiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuem9vbWluZ0VuYWJsZWQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuICB1c2VyWm9vbWluZ0VuYWJsZWQ6IGZ1bmN0aW9uIHVzZXJab29taW5nRW5hYmxlZChib29sKSB7XG4gICAgaWYgKGJvb2wgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fcHJpdmF0ZS51c2VyWm9vbWluZ0VuYWJsZWQgPSBib29sID8gdHJ1ZSA6IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS51c2VyWm9vbWluZ0VuYWJsZWQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuICBib3hTZWxlY3Rpb25FbmFibGVkOiBmdW5jdGlvbiBib3hTZWxlY3Rpb25FbmFibGVkKGJvb2wpIHtcbiAgICBpZiAoYm9vbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9wcml2YXRlLmJveFNlbGVjdGlvbkVuYWJsZWQgPSBib29sID8gdHJ1ZSA6IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5ib3hTZWxlY3Rpb25FbmFibGVkO1xuICAgIH1cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcbiAgcGFuOiBmdW5jdGlvbiBwYW4oKSB7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgdmFyIHBhbiA9IHRoaXMuX3ByaXZhdGUucGFuO1xuICAgIHZhciBkaW0sIHZhbCwgZGltcywgeCwgeTtcbiAgICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIC8vIC5wYW4oKVxuICAgICAgICByZXR1cm4gcGFuO1xuICAgICAgY2FzZSAxOlxuICAgICAgICBpZiAoc3RyaW5nKGFyZ3NbMF0pKSB7XG4gICAgICAgICAgLy8gLnBhbigneCcpXG4gICAgICAgICAgZGltID0gYXJnc1swXTtcbiAgICAgICAgICByZXR1cm4gcGFuW2RpbV07XG4gICAgICAgIH0gZWxzZSBpZiAocGxhaW5PYmplY3QoYXJnc1swXSkpIHtcbiAgICAgICAgICAvLyAucGFuKHsgeDogMCwgeTogMTAwIH0pXG4gICAgICAgICAgaWYgKCF0aGlzLl9wcml2YXRlLnBhbm5pbmdFbmFibGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICB9XG4gICAgICAgICAgZGltcyA9IGFyZ3NbMF07XG4gICAgICAgICAgeCA9IGRpbXMueDtcbiAgICAgICAgICB5ID0gZGltcy55O1xuICAgICAgICAgIGlmIChudW1iZXIkMSh4KSkge1xuICAgICAgICAgICAgcGFuLnggPSB4O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobnVtYmVyJDEoeSkpIHtcbiAgICAgICAgICAgIHBhbi55ID0geTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5lbWl0KCdwYW4gdmlld3BvcnQnKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgLy8gLnBhbigneCcsIDEwMClcbiAgICAgICAgaWYgKCF0aGlzLl9wcml2YXRlLnBhbm5pbmdFbmFibGVkKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgZGltID0gYXJnc1swXTtcbiAgICAgICAgdmFsID0gYXJnc1sxXTtcbiAgICAgICAgaWYgKChkaW0gPT09ICd4JyB8fCBkaW0gPT09ICd5JykgJiYgbnVtYmVyJDEodmFsKSkge1xuICAgICAgICAgIHBhbltkaW1dID0gdmFsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZW1pdCgncGFuIHZpZXdwb3J0Jyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgLy8gaW52YWxpZFxuICAgIH1cbiAgICB0aGlzLm5vdGlmeSgndmlld3BvcnQnKTtcbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcbiAgcGFuQnk6IGZ1bmN0aW9uIHBhbkJ5KGFyZzAsIGFyZzEpIHtcbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICB2YXIgcGFuID0gdGhpcy5fcHJpdmF0ZS5wYW47XG4gICAgdmFyIGRpbSwgdmFsLCBkaW1zLCB4LCB5O1xuICAgIGlmICghdGhpcy5fcHJpdmF0ZS5wYW5uaW5nRW5hYmxlZCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgaWYgKHBsYWluT2JqZWN0KGFyZzApKSB7XG4gICAgICAgICAgLy8gLnBhbkJ5KHsgeDogMCwgeTogMTAwIH0pXG4gICAgICAgICAgZGltcyA9IGFyZ3NbMF07XG4gICAgICAgICAgeCA9IGRpbXMueDtcbiAgICAgICAgICB5ID0gZGltcy55O1xuICAgICAgICAgIGlmIChudW1iZXIkMSh4KSkge1xuICAgICAgICAgICAgcGFuLnggKz0geDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG51bWJlciQxKHkpKSB7XG4gICAgICAgICAgICBwYW4ueSArPSB5O1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmVtaXQoJ3BhbiB2aWV3cG9ydCcpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyOlxuICAgICAgICAvLyAucGFuQnkoJ3gnLCAxMDApXG4gICAgICAgIGRpbSA9IGFyZzA7XG4gICAgICAgIHZhbCA9IGFyZzE7XG4gICAgICAgIGlmICgoZGltID09PSAneCcgfHwgZGltID09PSAneScpICYmIG51bWJlciQxKHZhbCkpIHtcbiAgICAgICAgICBwYW5bZGltXSArPSB2YWw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbWl0KCdwYW4gdmlld3BvcnQnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICAvLyBpbnZhbGlkXG4gICAgfVxuICAgIHRoaXMubm90aWZ5KCd2aWV3cG9ydCcpO1xuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuICBnYzogZnVuY3Rpb24gZ2MoKSB7XG4gICAgdGhpcy5ub3RpZnkoJ2djJyk7XG4gIH0sXG4gIGZpdDogZnVuY3Rpb24gZml0KGVsZW1lbnRzLCBwYWRkaW5nKSB7XG4gICAgdmFyIHZpZXdwb3J0U3RhdGUgPSB0aGlzLmdldEZpdFZpZXdwb3J0KGVsZW1lbnRzLCBwYWRkaW5nKTtcbiAgICBpZiAodmlld3BvcnRTdGF0ZSkge1xuICAgICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICAgIF9wLnpvb20gPSB2aWV3cG9ydFN0YXRlLnpvb207XG4gICAgICBfcC5wYW4gPSB2aWV3cG9ydFN0YXRlLnBhbjtcbiAgICAgIHRoaXMuZW1pdCgncGFuIHpvb20gdmlld3BvcnQnKTtcbiAgICAgIHRoaXMubm90aWZ5KCd2aWV3cG9ydCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcbiAgZ2V0Rml0Vmlld3BvcnQ6IGZ1bmN0aW9uIGdldEZpdFZpZXdwb3J0KGVsZW1lbnRzLCBwYWRkaW5nKSB7XG4gICAgaWYgKG51bWJlciQxKGVsZW1lbnRzKSAmJiBwYWRkaW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIGVsZW1lbnRzIGlzIG9wdGlvbmFsXG4gICAgICBwYWRkaW5nID0gZWxlbWVudHM7XG4gICAgICBlbGVtZW50cyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKCF0aGlzLl9wcml2YXRlLnBhbm5pbmdFbmFibGVkIHx8ICF0aGlzLl9wcml2YXRlLnpvb21pbmdFbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBiYjtcbiAgICBpZiAoc3RyaW5nKGVsZW1lbnRzKSkge1xuICAgICAgdmFyIHNlbCA9IGVsZW1lbnRzO1xuICAgICAgZWxlbWVudHMgPSB0aGlzLiQoc2VsKTtcbiAgICB9IGVsc2UgaWYgKGJvdW5kaW5nQm94KGVsZW1lbnRzKSkge1xuICAgICAgLy8gYXNzdW1lIGJiXG4gICAgICB2YXIgYmJlID0gZWxlbWVudHM7XG4gICAgICBiYiA9IHtcbiAgICAgICAgeDE6IGJiZS54MSxcbiAgICAgICAgeTE6IGJiZS55MSxcbiAgICAgICAgeDI6IGJiZS54MixcbiAgICAgICAgeTI6IGJiZS55MlxuICAgICAgfTtcbiAgICAgIGJiLncgPSBiYi54MiAtIGJiLngxO1xuICAgICAgYmIuaCA9IGJiLnkyIC0gYmIueTE7XG4gICAgfSBlbHNlIGlmICghZWxlbWVudE9yQ29sbGVjdGlvbihlbGVtZW50cykpIHtcbiAgICAgIGVsZW1lbnRzID0gdGhpcy5tdXRhYmxlRWxlbWVudHMoKTtcbiAgICB9XG4gICAgaWYgKGVsZW1lbnRPckNvbGxlY3Rpb24oZWxlbWVudHMpICYmIGVsZW1lbnRzLmVtcHR5KCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIGNhbid0IGZpdCB0byBub3RoaW5nXG5cbiAgICBiYiA9IGJiIHx8IGVsZW1lbnRzLmJvdW5kaW5nQm94KCk7XG4gICAgdmFyIHcgPSB0aGlzLndpZHRoKCk7XG4gICAgdmFyIGggPSB0aGlzLmhlaWdodCgpO1xuICAgIHZhciB6b29tO1xuICAgIHBhZGRpbmcgPSBudW1iZXIkMShwYWRkaW5nKSA/IHBhZGRpbmcgOiAwO1xuICAgIGlmICghaXNOYU4odykgJiYgIWlzTmFOKGgpICYmIHcgPiAwICYmIGggPiAwICYmICFpc05hTihiYi53KSAmJiAhaXNOYU4oYmIuaCkgJiYgYmIudyA+IDAgJiYgYmIuaCA+IDApIHtcbiAgICAgIHpvb20gPSBNYXRoLm1pbigodyAtIDIgKiBwYWRkaW5nKSAvIGJiLncsIChoIC0gMiAqIHBhZGRpbmcpIC8gYmIuaCk7XG5cbiAgICAgIC8vIGNyb3Agem9vbVxuICAgICAgem9vbSA9IHpvb20gPiB0aGlzLl9wcml2YXRlLm1heFpvb20gPyB0aGlzLl9wcml2YXRlLm1heFpvb20gOiB6b29tO1xuICAgICAgem9vbSA9IHpvb20gPCB0aGlzLl9wcml2YXRlLm1pblpvb20gPyB0aGlzLl9wcml2YXRlLm1pblpvb20gOiB6b29tO1xuICAgICAgdmFyIHBhbiA9IHtcbiAgICAgICAgLy8gbm93IHBhbiB0byBtaWRkbGVcbiAgICAgICAgeDogKHcgLSB6b29tICogKGJiLngxICsgYmIueDIpKSAvIDIsXG4gICAgICAgIHk6IChoIC0gem9vbSAqIChiYi55MSArIGJiLnkyKSkgLyAyXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgem9vbTogem9vbSxcbiAgICAgICAgcGFuOiBwYW5cbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybjtcbiAgfSxcbiAgem9vbVJhbmdlOiBmdW5jdGlvbiB6b29tUmFuZ2UobWluLCBtYXgpIHtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuICAgIGlmIChtYXggPT0gbnVsbCkge1xuICAgICAgdmFyIG9wdHMgPSBtaW47XG4gICAgICBtaW4gPSBvcHRzLm1pbjtcbiAgICAgIG1heCA9IG9wdHMubWF4O1xuICAgIH1cbiAgICBpZiAobnVtYmVyJDEobWluKSAmJiBudW1iZXIkMShtYXgpICYmIG1pbiA8PSBtYXgpIHtcbiAgICAgIF9wLm1pblpvb20gPSBtaW47XG4gICAgICBfcC5tYXhab29tID0gbWF4O1xuICAgIH0gZWxzZSBpZiAobnVtYmVyJDEobWluKSAmJiBtYXggPT09IHVuZGVmaW5lZCAmJiBtaW4gPD0gX3AubWF4Wm9vbSkge1xuICAgICAgX3AubWluWm9vbSA9IG1pbjtcbiAgICB9IGVsc2UgaWYgKG51bWJlciQxKG1heCkgJiYgbWluID09PSB1bmRlZmluZWQgJiYgbWF4ID49IF9wLm1pblpvb20pIHtcbiAgICAgIF9wLm1heFpvb20gPSBtYXg7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBtaW5ab29tOiBmdW5jdGlvbiBtaW5ab29tKHpvb20pIHtcbiAgICBpZiAoem9vbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5taW5ab29tO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy56b29tUmFuZ2Uoe1xuICAgICAgICBtaW46IHpvb21cbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcbiAgbWF4Wm9vbTogZnVuY3Rpb24gbWF4Wm9vbSh6b29tKSB7XG4gICAgaWYgKHpvb20gPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUubWF4Wm9vbTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuem9vbVJhbmdlKHtcbiAgICAgICAgbWF4OiB6b29tXG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG4gIGdldFpvb21lZFZpZXdwb3J0OiBmdW5jdGlvbiBnZXRab29tZWRWaWV3cG9ydChwYXJhbXMpIHtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuICAgIHZhciBjdXJyZW50UGFuID0gX3AucGFuO1xuICAgIHZhciBjdXJyZW50Wm9vbSA9IF9wLnpvb207XG4gICAgdmFyIHBvczsgLy8gaW4gcmVuZGVyZWQgcHhcbiAgICB2YXIgem9vbTtcbiAgICB2YXIgYmFpbCA9IGZhbHNlO1xuICAgIGlmICghX3Auem9vbWluZ0VuYWJsZWQpIHtcbiAgICAgIC8vIHpvb21pbmcgZGlzYWJsZWRcbiAgICAgIGJhaWwgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAobnVtYmVyJDEocGFyYW1zKSkge1xuICAgICAgLy8gdGhlbiBzZXQgdGhlIHpvb21cbiAgICAgIHpvb20gPSBwYXJhbXM7XG4gICAgfSBlbHNlIGlmIChwbGFpbk9iamVjdChwYXJhbXMpKSB7XG4gICAgICAvLyB0aGVuIHpvb20gYWJvdXQgYSBwb2ludFxuICAgICAgem9vbSA9IHBhcmFtcy5sZXZlbDtcbiAgICAgIGlmIChwYXJhbXMucG9zaXRpb24gIT0gbnVsbCkge1xuICAgICAgICBwb3MgPSBtb2RlbFRvUmVuZGVyZWRQb3NpdGlvbiQxKHBhcmFtcy5wb3NpdGlvbiwgY3VycmVudFpvb20sIGN1cnJlbnRQYW4pO1xuICAgICAgfSBlbHNlIGlmIChwYXJhbXMucmVuZGVyZWRQb3NpdGlvbiAhPSBudWxsKSB7XG4gICAgICAgIHBvcyA9IHBhcmFtcy5yZW5kZXJlZFBvc2l0aW9uO1xuICAgICAgfVxuICAgICAgaWYgKHBvcyAhPSBudWxsICYmICFfcC5wYW5uaW5nRW5hYmxlZCkge1xuICAgICAgICAvLyBwYW5uaW5nIGRpc2FibGVkXG4gICAgICAgIGJhaWwgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNyb3Agem9vbVxuICAgIHpvb20gPSB6b29tID4gX3AubWF4Wm9vbSA/IF9wLm1heFpvb20gOiB6b29tO1xuICAgIHpvb20gPSB6b29tIDwgX3AubWluWm9vbSA/IF9wLm1pblpvb20gOiB6b29tO1xuXG4gICAgLy8gY2FuJ3Qgem9vbSB3aXRoIGludmFsaWQgcGFyYW1zXG4gICAgaWYgKGJhaWwgfHwgIW51bWJlciQxKHpvb20pIHx8IHpvb20gPT09IGN1cnJlbnRab29tIHx8IHBvcyAhPSBudWxsICYmICghbnVtYmVyJDEocG9zLngpIHx8ICFudW1iZXIkMShwb3MueSkpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKHBvcyAhPSBudWxsKSB7XG4gICAgICAvLyBzZXQgem9vbSBhYm91dCBwb3NpdGlvblxuICAgICAgdmFyIHBhbjEgPSBjdXJyZW50UGFuO1xuICAgICAgdmFyIHpvb20xID0gY3VycmVudFpvb207XG4gICAgICB2YXIgem9vbTIgPSB6b29tO1xuICAgICAgdmFyIHBhbjIgPSB7XG4gICAgICAgIHg6IC16b29tMiAvIHpvb20xICogKHBvcy54IC0gcGFuMS54KSArIHBvcy54LFxuICAgICAgICB5OiAtem9vbTIgLyB6b29tMSAqIChwb3MueSAtIHBhbjEueSkgKyBwb3MueVxuICAgICAgfTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHpvb21lZDogdHJ1ZSxcbiAgICAgICAgcGFubmVkOiB0cnVlLFxuICAgICAgICB6b29tOiB6b29tMixcbiAgICAgICAgcGFuOiBwYW4yXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBqdXN0IHNldCB0aGUgem9vbVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgem9vbWVkOiB0cnVlLFxuICAgICAgICBwYW5uZWQ6IGZhbHNlLFxuICAgICAgICB6b29tOiB6b29tLFxuICAgICAgICBwYW46IGN1cnJlbnRQYW5cbiAgICAgIH07XG4gICAgfVxuICB9LFxuICB6b29tOiBmdW5jdGlvbiB6b29tKHBhcmFtcykge1xuICAgIGlmIChwYXJhbXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gZ2V0XG4gICAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS56b29tO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBzZXRcbiAgICAgIHZhciB2cCA9IHRoaXMuZ2V0Wm9vbWVkVmlld3BvcnQocGFyYW1zKTtcbiAgICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG4gICAgICBpZiAodnAgPT0gbnVsbCB8fCAhdnAuem9vbWVkKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgX3Auem9vbSA9IHZwLnpvb207XG4gICAgICBpZiAodnAucGFubmVkKSB7XG4gICAgICAgIF9wLnBhbi54ID0gdnAucGFuLng7XG4gICAgICAgIF9wLnBhbi55ID0gdnAucGFuLnk7XG4gICAgICB9XG4gICAgICB0aGlzLmVtaXQoJ3pvb20nICsgKHZwLnBhbm5lZCA/ICcgcGFuJyA6ICcnKSArICcgdmlld3BvcnQnKTtcbiAgICAgIHRoaXMubm90aWZ5KCd2aWV3cG9ydCcpO1xuICAgICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gICAgfVxuICB9LFxuICB2aWV3cG9ydDogZnVuY3Rpb24gdmlld3BvcnQob3B0cykge1xuICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG4gICAgdmFyIHpvb21EZWZkID0gdHJ1ZTtcbiAgICB2YXIgcGFuRGVmZCA9IHRydWU7XG4gICAgdmFyIGV2ZW50cyA9IFtdOyAvLyB0byB0cmlnZ2VyXG4gICAgdmFyIHpvb21GYWlsZWQgPSBmYWxzZTtcbiAgICB2YXIgcGFuRmFpbGVkID0gZmFsc2U7XG4gICAgaWYgKCFvcHRzKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgaWYgKCFudW1iZXIkMShvcHRzLnpvb20pKSB7XG4gICAgICB6b29tRGVmZCA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIXBsYWluT2JqZWN0KG9wdHMucGFuKSkge1xuICAgICAgcGFuRGVmZCA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIXpvb21EZWZkICYmICFwYW5EZWZkKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgaWYgKHpvb21EZWZkKSB7XG4gICAgICB2YXIgeiA9IG9wdHMuem9vbTtcbiAgICAgIGlmICh6IDwgX3AubWluWm9vbSB8fCB6ID4gX3AubWF4Wm9vbSB8fCAhX3Auem9vbWluZ0VuYWJsZWQpIHtcbiAgICAgICAgem9vbUZhaWxlZCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfcC56b29tID0gejtcbiAgICAgICAgZXZlbnRzLnB1c2goJ3pvb20nKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBhbkRlZmQgJiYgKCF6b29tRmFpbGVkIHx8ICFvcHRzLmNhbmNlbE9uRmFpbGVkWm9vbSkgJiYgX3AucGFubmluZ0VuYWJsZWQpIHtcbiAgICAgIHZhciBwID0gb3B0cy5wYW47XG4gICAgICBpZiAobnVtYmVyJDEocC54KSkge1xuICAgICAgICBfcC5wYW4ueCA9IHAueDtcbiAgICAgICAgcGFuRmFpbGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAobnVtYmVyJDEocC55KSkge1xuICAgICAgICBfcC5wYW4ueSA9IHAueTtcbiAgICAgICAgcGFuRmFpbGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoIXBhbkZhaWxlZCkge1xuICAgICAgICBldmVudHMucHVzaCgncGFuJyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChldmVudHMubGVuZ3RoID4gMCkge1xuICAgICAgZXZlbnRzLnB1c2goJ3ZpZXdwb3J0Jyk7XG4gICAgICB0aGlzLmVtaXQoZXZlbnRzLmpvaW4oJyAnKSk7XG4gICAgICB0aGlzLm5vdGlmeSgndmlld3BvcnQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG4gIGNlbnRlcjogZnVuY3Rpb24gY2VudGVyKGVsZW1lbnRzKSB7XG4gICAgdmFyIHBhbiA9IHRoaXMuZ2V0Q2VudGVyUGFuKGVsZW1lbnRzKTtcbiAgICBpZiAocGFuKSB7XG4gICAgICB0aGlzLl9wcml2YXRlLnBhbiA9IHBhbjtcbiAgICAgIHRoaXMuZW1pdCgncGFuIHZpZXdwb3J0Jyk7XG4gICAgICB0aGlzLm5vdGlmeSgndmlld3BvcnQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG4gIGdldENlbnRlclBhbjogZnVuY3Rpb24gZ2V0Q2VudGVyUGFuKGVsZW1lbnRzLCB6b29tKSB7XG4gICAgaWYgKCF0aGlzLl9wcml2YXRlLnBhbm5pbmdFbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzdHJpbmcoZWxlbWVudHMpKSB7XG4gICAgICB2YXIgc2VsZWN0b3IgPSBlbGVtZW50cztcbiAgICAgIGVsZW1lbnRzID0gdGhpcy5tdXRhYmxlRWxlbWVudHMoKS5maWx0ZXIoc2VsZWN0b3IpO1xuICAgIH0gZWxzZSBpZiAoIWVsZW1lbnRPckNvbGxlY3Rpb24oZWxlbWVudHMpKSB7XG4gICAgICBlbGVtZW50cyA9IHRoaXMubXV0YWJsZUVsZW1lbnRzKCk7XG4gICAgfVxuICAgIGlmIChlbGVtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIGNhbid0IGNlbnRyZSBwYW4gdG8gbm90aGluZ1xuXG4gICAgdmFyIGJiID0gZWxlbWVudHMuYm91bmRpbmdCb3goKTtcbiAgICB2YXIgdyA9IHRoaXMud2lkdGgoKTtcbiAgICB2YXIgaCA9IHRoaXMuaGVpZ2h0KCk7XG4gICAgem9vbSA9IHpvb20gPT09IHVuZGVmaW5lZCA/IHRoaXMuX3ByaXZhdGUuem9vbSA6IHpvb207XG4gICAgdmFyIHBhbiA9IHtcbiAgICAgIC8vIG1pZGRsZVxuICAgICAgeDogKHcgLSB6b29tICogKGJiLngxICsgYmIueDIpKSAvIDIsXG4gICAgICB5OiAoaCAtIHpvb20gKiAoYmIueTEgKyBiYi55MikpIC8gMlxuICAgIH07XG4gICAgcmV0dXJuIHBhbjtcbiAgfSxcbiAgcmVzZXQ6IGZ1bmN0aW9uIHJlc2V0KCkge1xuICAgIGlmICghdGhpcy5fcHJpdmF0ZS5wYW5uaW5nRW5hYmxlZCB8fCAhdGhpcy5fcHJpdmF0ZS56b29taW5nRW5hYmxlZCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHRoaXMudmlld3BvcnQoe1xuICAgICAgcGFuOiB7XG4gICAgICAgIHg6IDAsXG4gICAgICAgIHk6IDBcbiAgICAgIH0sXG4gICAgICB6b29tOiAxXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG4gIGludmFsaWRhdGVTaXplOiBmdW5jdGlvbiBpbnZhbGlkYXRlU2l6ZSgpIHtcbiAgICB0aGlzLl9wcml2YXRlLnNpemVDYWNoZSA9IG51bGw7XG4gIH0sXG4gIHNpemU6IGZ1bmN0aW9uIHNpemUoKSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICB2YXIgY29udGFpbmVyID0gX3AuY29udGFpbmVyO1xuICAgIHZhciBjeSA9IHRoaXM7XG4gICAgcmV0dXJuIF9wLnNpemVDYWNoZSA9IF9wLnNpemVDYWNoZSB8fCAoY29udGFpbmVyID8gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHN0eWxlID0gY3kud2luZG93KCkuZ2V0Q29tcHV0ZWRTdHlsZShjb250YWluZXIpO1xuICAgICAgdmFyIHZhbCA9IGZ1bmN0aW9uIHZhbChuYW1lKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUZsb2F0KHN0eWxlLmdldFByb3BlcnR5VmFsdWUobmFtZSkpO1xuICAgICAgfTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHdpZHRoOiBjb250YWluZXIuY2xpZW50V2lkdGggLSB2YWwoJ3BhZGRpbmctbGVmdCcpIC0gdmFsKCdwYWRkaW5nLXJpZ2h0JyksXG4gICAgICAgIGhlaWdodDogY29udGFpbmVyLmNsaWVudEhlaWdodCAtIHZhbCgncGFkZGluZy10b3AnKSAtIHZhbCgncGFkZGluZy1ib3R0b20nKVxuICAgICAgfTtcbiAgICB9KCkgOiB7XG4gICAgICAvLyBmYWxsYmFjayBpZiBubyBjb250YWluZXIgKG5vdCAwIGIvYyBjYW4gYmUgdXNlZCBmb3IgZGl2aWRpbmcgZXRjKVxuICAgICAgd2lkdGg6IDEsXG4gICAgICBoZWlnaHQ6IDFcbiAgICB9KTtcbiAgfSxcbiAgd2lkdGg6IGZ1bmN0aW9uIHdpZHRoKCkge1xuICAgIHJldHVybiB0aGlzLnNpemUoKS53aWR0aDtcbiAgfSxcbiAgaGVpZ2h0OiBmdW5jdGlvbiBoZWlnaHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2l6ZSgpLmhlaWdodDtcbiAgfSxcbiAgZXh0ZW50OiBmdW5jdGlvbiBleHRlbnQoKSB7XG4gICAgdmFyIHBhbiA9IHRoaXMuX3ByaXZhdGUucGFuO1xuICAgIHZhciB6b29tID0gdGhpcy5fcHJpdmF0ZS56b29tO1xuICAgIHZhciByYiA9IHRoaXMucmVuZGVyZWRFeHRlbnQoKTtcbiAgICB2YXIgYiA9IHtcbiAgICAgIHgxOiAocmIueDEgLSBwYW4ueCkgLyB6b29tLFxuICAgICAgeDI6IChyYi54MiAtIHBhbi54KSAvIHpvb20sXG4gICAgICB5MTogKHJiLnkxIC0gcGFuLnkpIC8gem9vbSxcbiAgICAgIHkyOiAocmIueTIgLSBwYW4ueSkgLyB6b29tXG4gICAgfTtcbiAgICBiLncgPSBiLngyIC0gYi54MTtcbiAgICBiLmggPSBiLnkyIC0gYi55MTtcbiAgICByZXR1cm4gYjtcbiAgfSxcbiAgcmVuZGVyZWRFeHRlbnQ6IGZ1bmN0aW9uIHJlbmRlcmVkRXh0ZW50KCkge1xuICAgIHZhciB3aWR0aCA9IHRoaXMud2lkdGgoKTtcbiAgICB2YXIgaGVpZ2h0ID0gdGhpcy5oZWlnaHQoKTtcbiAgICByZXR1cm4ge1xuICAgICAgeDE6IDAsXG4gICAgICB5MTogMCxcbiAgICAgIHgyOiB3aWR0aCxcbiAgICAgIHkyOiBoZWlnaHQsXG4gICAgICB3OiB3aWR0aCxcbiAgICAgIGg6IGhlaWdodFxuICAgIH07XG4gIH0sXG4gIG11bHRpQ2xpY2tEZWJvdW5jZVRpbWU6IGZ1bmN0aW9uIG11bHRpQ2xpY2tEZWJvdW5jZVRpbWUoX2ludCkge1xuICAgIGlmIChfaW50KSB0aGlzLl9wcml2YXRlLm11bHRpQ2xpY2tEZWJvdW5jZVRpbWUgPSBfaW50O2Vsc2UgcmV0dXJuIHRoaXMuX3ByaXZhdGUubXVsdGlDbGlja0RlYm91bmNlVGltZTtcbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfVxufTtcblxuLy8gYWxpYXNlc1xuY29yZWZuJDEuY2VudHJlID0gY29yZWZuJDEuY2VudGVyO1xuXG4vLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuY29yZWZuJDEuYXV0b2xvY2tOb2RlcyA9IGNvcmVmbiQxLmF1dG9sb2NrO1xuY29yZWZuJDEuYXV0b3VuZ3JhYmlmeU5vZGVzID0gY29yZWZuJDEuYXV0b3VuZ3JhYmlmeTtcblxudmFyIGZuID0ge1xuICBkYXRhOiBkZWZpbmUuZGF0YSh7XG4gICAgZmllbGQ6ICdkYXRhJyxcbiAgICBiaW5kaW5nRXZlbnQ6ICdkYXRhJyxcbiAgICBhbGxvd0JpbmRpbmc6IHRydWUsXG4gICAgYWxsb3dTZXR0aW5nOiB0cnVlLFxuICAgIHNldHRpbmdFdmVudDogJ2RhdGEnLFxuICAgIHNldHRpbmdUcmlnZ2Vyc0V2ZW50OiB0cnVlLFxuICAgIHRyaWdnZXJGbk5hbWU6ICd0cmlnZ2VyJyxcbiAgICBhbGxvd0dldHRpbmc6IHRydWUsXG4gICAgdXBkYXRlU3R5bGU6IHRydWVcbiAgfSksXG4gIHJlbW92ZURhdGE6IGRlZmluZS5yZW1vdmVEYXRhKHtcbiAgICBmaWVsZDogJ2RhdGEnLFxuICAgIGV2ZW50OiAnZGF0YScsXG4gICAgdHJpZ2dlckZuTmFtZTogJ3RyaWdnZXInLFxuICAgIHRyaWdnZXJFdmVudDogdHJ1ZSxcbiAgICB1cGRhdGVTdHlsZTogdHJ1ZVxuICB9KSxcbiAgc2NyYXRjaDogZGVmaW5lLmRhdGEoe1xuICAgIGZpZWxkOiAnc2NyYXRjaCcsXG4gICAgYmluZGluZ0V2ZW50OiAnc2NyYXRjaCcsXG4gICAgYWxsb3dCaW5kaW5nOiB0cnVlLFxuICAgIGFsbG93U2V0dGluZzogdHJ1ZSxcbiAgICBzZXR0aW5nRXZlbnQ6ICdzY3JhdGNoJyxcbiAgICBzZXR0aW5nVHJpZ2dlcnNFdmVudDogdHJ1ZSxcbiAgICB0cmlnZ2VyRm5OYW1lOiAndHJpZ2dlcicsXG4gICAgYWxsb3dHZXR0aW5nOiB0cnVlLFxuICAgIHVwZGF0ZVN0eWxlOiB0cnVlXG4gIH0pLFxuICByZW1vdmVTY3JhdGNoOiBkZWZpbmUucmVtb3ZlRGF0YSh7XG4gICAgZmllbGQ6ICdzY3JhdGNoJyxcbiAgICBldmVudDogJ3NjcmF0Y2gnLFxuICAgIHRyaWdnZXJGbk5hbWU6ICd0cmlnZ2VyJyxcbiAgICB0cmlnZ2VyRXZlbnQ6IHRydWUsXG4gICAgdXBkYXRlU3R5bGU6IHRydWVcbiAgfSlcbn07XG5cbi8vIGFsaWFzZXNcbmZuLmF0dHIgPSBmbi5kYXRhO1xuZm4ucmVtb3ZlQXR0ciA9IGZuLnJlbW92ZURhdGE7XG5cbnZhciBDb3JlID0gZnVuY3Rpb24gQ29yZShvcHRzKSB7XG4gIHZhciBjeSA9IHRoaXM7XG4gIG9wdHMgPSBleHRlbmQoe30sIG9wdHMpO1xuICB2YXIgY29udGFpbmVyID0gb3B0cy5jb250YWluZXI7XG5cbiAgLy8gYWxsb3cgZm9yIHBhc3NpbmcgYSB3cmFwcGVkIGpxdWVyeSBvYmplY3RcbiAgLy8gZS5nLiBjeXRvc2NhcGUoeyBjb250YWluZXI6ICQoJyNjeScpIH0pXG4gIGlmIChjb250YWluZXIgJiYgIWh0bWxFbGVtZW50KGNvbnRhaW5lcikgJiYgaHRtbEVsZW1lbnQoY29udGFpbmVyWzBdKSkge1xuICAgIGNvbnRhaW5lciA9IGNvbnRhaW5lclswXTtcbiAgfVxuICB2YXIgcmVnID0gY29udGFpbmVyID8gY29udGFpbmVyLl9jeXJlZyA6IG51bGw7IC8vIGUuZy4gYWxyZWFkeSByZWdpc3RlcmVkIHNvbWUgaW5mbyAoZS5nLiByZWFkaWVzKSB2aWEganF1ZXJ5XG4gIHJlZyA9IHJlZyB8fCB7fTtcbiAgaWYgKHJlZyAmJiByZWcuY3kpIHtcbiAgICByZWcuY3kuZGVzdHJveSgpO1xuICAgIHJlZyA9IHt9OyAvLyBvbGQgaW5zdGFuY2UgPT4gcmVwbGFjZSByZWcgY29tcGxldGVseVxuICB9XG4gIHZhciByZWFkaWVzID0gcmVnLnJlYWRpZXMgPSByZWcucmVhZGllcyB8fCBbXTtcbiAgaWYgKGNvbnRhaW5lcikge1xuICAgIGNvbnRhaW5lci5fY3lyZWcgPSByZWc7XG4gIH0gLy8gbWFrZSBzdXJlIGNvbnRhaW5lciBhc3NvYydkIHJlZyBwb2ludHMgdG8gdGhpcyBjeVxuICByZWcuY3kgPSBjeTtcbiAgdmFyIGhlYWQgPSBfd2luZG93ICE9PSB1bmRlZmluZWQgJiYgY29udGFpbmVyICE9PSB1bmRlZmluZWQgJiYgIW9wdHMuaGVhZGxlc3M7XG4gIHZhciBvcHRpb25zID0gb3B0cztcbiAgb3B0aW9ucy5sYXlvdXQgPSBleHRlbmQoe1xuICAgIG5hbWU6IGhlYWQgPyAnZ3JpZCcgOiAnbnVsbCdcbiAgfSwgb3B0aW9ucy5sYXlvdXQpO1xuICBvcHRpb25zLnJlbmRlcmVyID0gZXh0ZW5kKHtcbiAgICBuYW1lOiBoZWFkID8gJ2NhbnZhcycgOiAnbnVsbCdcbiAgfSwgb3B0aW9ucy5yZW5kZXJlcik7XG4gIHZhciBkZWZWYWwgPSBmdW5jdGlvbiBkZWZWYWwoZGVmLCB2YWwsIGFsdFZhbCkge1xuICAgIGlmICh2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHZhbDtcbiAgICB9IGVsc2UgaWYgKGFsdFZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gYWx0VmFsO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZGVmO1xuICAgIH1cbiAgfTtcbiAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZSA9IHtcbiAgICBjb250YWluZXI6IGNvbnRhaW5lcixcbiAgICAvLyBodG1sIGRvbSBlbGUgY29udGFpbmVyXG4gICAgcmVhZHk6IGZhbHNlLFxuICAgIC8vIHdoZXRoZXIgcmVhZHkgaGFzIGJlZW4gdHJpZ2dlcmVkXG4gICAgb3B0aW9uczogb3B0aW9ucyxcbiAgICAvLyBjYWNoZWQgb3B0aW9uc1xuICAgIGVsZW1lbnRzOiBuZXcgQ29sbGVjdGlvbih0aGlzKSxcbiAgICAvLyBlbGVtZW50cyBpbiB0aGUgZ3JhcGhcbiAgICBsaXN0ZW5lcnM6IFtdLFxuICAgIC8vIGxpc3Qgb2YgbGlzdGVuZXJzXG4gICAgYW5pRWxlczogbmV3IENvbGxlY3Rpb24odGhpcyksXG4gICAgLy8gZWxlbWVudHMgYmVpbmcgYW5pbWF0ZWRcbiAgICBkYXRhOiBvcHRpb25zLmRhdGEgfHwge30sXG4gICAgLy8gZGF0YSBmb3IgdGhlIGNvcmVcbiAgICBzY3JhdGNoOiB7fSxcbiAgICAvLyBzY3JhdGNoIG9iamVjdCBmb3IgY29yZVxuICAgIGxheW91dDogbnVsbCxcbiAgICByZW5kZXJlcjogbnVsbCxcbiAgICBkZXN0cm95ZWQ6IGZhbHNlLFxuICAgIC8vIHdoZXRoZXIgZGVzdHJveSB3YXMgY2FsbGVkXG4gICAgbm90aWZpY2F0aW9uc0VuYWJsZWQ6IHRydWUsXG4gICAgLy8gd2hldGhlciBub3RpZmljYXRpb25zIGFyZSBzZW50IHRvIHRoZSByZW5kZXJlclxuICAgIG1pblpvb206IDFlLTUwLFxuICAgIG1heFpvb206IDFlNTAsXG4gICAgem9vbWluZ0VuYWJsZWQ6IGRlZlZhbCh0cnVlLCBvcHRpb25zLnpvb21pbmdFbmFibGVkKSxcbiAgICB1c2VyWm9vbWluZ0VuYWJsZWQ6IGRlZlZhbCh0cnVlLCBvcHRpb25zLnVzZXJab29taW5nRW5hYmxlZCksXG4gICAgcGFubmluZ0VuYWJsZWQ6IGRlZlZhbCh0cnVlLCBvcHRpb25zLnBhbm5pbmdFbmFibGVkKSxcbiAgICB1c2VyUGFubmluZ0VuYWJsZWQ6IGRlZlZhbCh0cnVlLCBvcHRpb25zLnVzZXJQYW5uaW5nRW5hYmxlZCksXG4gICAgYm94U2VsZWN0aW9uRW5hYmxlZDogZGVmVmFsKHRydWUsIG9wdGlvbnMuYm94U2VsZWN0aW9uRW5hYmxlZCksXG4gICAgYXV0b2xvY2s6IGRlZlZhbChmYWxzZSwgb3B0aW9ucy5hdXRvbG9jaywgb3B0aW9ucy5hdXRvbG9ja05vZGVzKSxcbiAgICBhdXRvdW5ncmFiaWZ5OiBkZWZWYWwoZmFsc2UsIG9wdGlvbnMuYXV0b3VuZ3JhYmlmeSwgb3B0aW9ucy5hdXRvdW5ncmFiaWZ5Tm9kZXMpLFxuICAgIGF1dG91bnNlbGVjdGlmeTogZGVmVmFsKGZhbHNlLCBvcHRpb25zLmF1dG91bnNlbGVjdGlmeSksXG4gICAgc3R5bGVFbmFibGVkOiBvcHRpb25zLnN0eWxlRW5hYmxlZCA9PT0gdW5kZWZpbmVkID8gaGVhZCA6IG9wdGlvbnMuc3R5bGVFbmFibGVkLFxuICAgIHpvb206IG51bWJlciQxKG9wdGlvbnMuem9vbSkgPyBvcHRpb25zLnpvb20gOiAxLFxuICAgIHBhbjoge1xuICAgICAgeDogcGxhaW5PYmplY3Qob3B0aW9ucy5wYW4pICYmIG51bWJlciQxKG9wdGlvbnMucGFuLngpID8gb3B0aW9ucy5wYW4ueCA6IDAsXG4gICAgICB5OiBwbGFpbk9iamVjdChvcHRpb25zLnBhbikgJiYgbnVtYmVyJDEob3B0aW9ucy5wYW4ueSkgPyBvcHRpb25zLnBhbi55IDogMFxuICAgIH0sXG4gICAgYW5pbWF0aW9uOiB7XG4gICAgICAvLyBvYmplY3QgZm9yIGN1cnJlbnRseS1ydW5uaW5nIGFuaW1hdGlvbnNcbiAgICAgIGN1cnJlbnQ6IFtdLFxuICAgICAgcXVldWU6IFtdXG4gICAgfSxcbiAgICBoYXNDb21wb3VuZE5vZGVzOiBmYWxzZSxcbiAgICBtdWx0aUNsaWNrRGVib3VuY2VUaW1lOiBkZWZWYWwoMjUwLCBvcHRpb25zLm11bHRpQ2xpY2tEZWJvdW5jZVRpbWUpXG4gIH07XG4gIHRoaXMuY3JlYXRlRW1pdHRlcigpO1xuXG4gIC8vIHNldCBzZWxlY3Rpb24gdHlwZVxuICB0aGlzLnNlbGVjdGlvblR5cGUob3B0aW9ucy5zZWxlY3Rpb25UeXBlKTtcblxuICAvLyBpbml0IHpvb20gYm91bmRzXG4gIHRoaXMuem9vbVJhbmdlKHtcbiAgICBtaW46IG9wdGlvbnMubWluWm9vbSxcbiAgICBtYXg6IG9wdGlvbnMubWF4Wm9vbVxuICB9KTtcbiAgdmFyIGxvYWRFeHREYXRhID0gZnVuY3Rpb24gbG9hZEV4dERhdGEoZXh0RGF0YSwgbmV4dCkge1xuICAgIHZhciBhbnlJc1Byb21pc2UgPSBleHREYXRhLnNvbWUocHJvbWlzZSk7XG4gICAgaWYgKGFueUlzUHJvbWlzZSkge1xuICAgICAgcmV0dXJuIFByb21pc2UkMS5hbGwoZXh0RGF0YSkudGhlbihuZXh0KTsgLy8gbG9hZCBhbGwgZGF0YSBhc3luY2hyb25vdXNseSwgdGhlbiBleGVjIHJlc3Qgb2YgaW5pdFxuICAgIH0gZWxzZSB7XG4gICAgICBuZXh0KGV4dERhdGEpOyAvLyBleGVjIHN5bmNocm9ub3VzbHkgZm9yIGNvbnZlbmllbmNlXG4gICAgfVxuICB9O1xuXG4gIC8vIHN0YXJ0IHdpdGggdGhlIGRlZmF1bHQgc3R5bGVzaGVldCBzbyB3ZSBoYXZlIHNvbWV0aGluZyBiZWZvcmUgbG9hZGluZyBhbiBleHRlcm5hbCBzdHlsZXNoZWV0XG4gIGlmIChfcC5zdHlsZUVuYWJsZWQpIHtcbiAgICBjeS5zZXRTdHlsZShbXSk7XG4gIH1cblxuICAvLyBjcmVhdGUgdGhlIHJlbmRlcmVyXG4gIHZhciByZW5kZXJlck9wdGlvbnMgPSBleHRlbmQoe30sIG9wdGlvbnMsIG9wdGlvbnMucmVuZGVyZXIpOyAvLyBhbGxvdyByZW5kZXJpbmcgaGludHMgaW4gdG9wIGxldmVsIG9wdGlvbnNcbiAgY3kuaW5pdFJlbmRlcmVyKHJlbmRlcmVyT3B0aW9ucyk7XG4gIHZhciBzZXRFbGVzQW5kTGF5b3V0ID0gZnVuY3Rpb24gc2V0RWxlc0FuZExheW91dChlbGVtZW50cywgb25sb2FkLCBvbmRvbmUpIHtcbiAgICBjeS5ub3RpZmljYXRpb25zKGZhbHNlKTtcblxuICAgIC8vIHJlbW92ZSBvbGQgZWxlbWVudHNcbiAgICB2YXIgb2xkRWxlcyA9IGN5Lm11dGFibGVFbGVtZW50cygpO1xuICAgIGlmIChvbGRFbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIG9sZEVsZXMucmVtb3ZlKCk7XG4gICAgfVxuICAgIGlmIChlbGVtZW50cyAhPSBudWxsKSB7XG4gICAgICBpZiAocGxhaW5PYmplY3QoZWxlbWVudHMpIHx8IGFycmF5KGVsZW1lbnRzKSkge1xuICAgICAgICBjeS5hZGQoZWxlbWVudHMpO1xuICAgICAgfVxuICAgIH1cbiAgICBjeS5vbmUoJ2xheW91dHJlYWR5JywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIGN5Lm5vdGlmaWNhdGlvbnModHJ1ZSk7XG4gICAgICBjeS5lbWl0KGUpOyAvLyB3ZSBtaXNzZWQgdGhpcyBldmVudCBieSB0dXJuaW5nIG5vdGlmaWNhdGlvbnMgb2ZmLCBzbyBwYXNzIGl0IG9uXG5cbiAgICAgIGN5Lm9uZSgnbG9hZCcsIG9ubG9hZCk7XG4gICAgICBjeS5lbWl0QW5kTm90aWZ5KCdsb2FkJyk7XG4gICAgfSkub25lKCdsYXlvdXRzdG9wJywgZnVuY3Rpb24gKCkge1xuICAgICAgY3kub25lKCdkb25lJywgb25kb25lKTtcbiAgICAgIGN5LmVtaXQoJ2RvbmUnKTtcbiAgICB9KTtcbiAgICB2YXIgbGF5b3V0T3B0cyA9IGV4dGVuZCh7fSwgY3kuX3ByaXZhdGUub3B0aW9ucy5sYXlvdXQpO1xuICAgIGxheW91dE9wdHMuZWxlcyA9IGN5LmVsZW1lbnRzKCk7XG4gICAgY3kubGF5b3V0KGxheW91dE9wdHMpLnJ1bigpO1xuICB9O1xuICBsb2FkRXh0RGF0YShbb3B0aW9ucy5zdHlsZSwgb3B0aW9ucy5lbGVtZW50c10sIGZ1bmN0aW9uICh0aGVucykge1xuICAgIHZhciBpbml0U3R5bGUgPSB0aGVuc1swXTtcbiAgICB2YXIgaW5pdEVsZXMgPSB0aGVuc1sxXTtcblxuICAgIC8vIGluaXQgc3R5bGVcbiAgICBpZiAoX3Auc3R5bGVFbmFibGVkKSB7XG4gICAgICBjeS5zdHlsZSgpLmFwcGVuZChpbml0U3R5bGUpO1xuICAgIH1cblxuICAgIC8vIGluaXRpYWwgbG9hZFxuICAgIHNldEVsZXNBbmRMYXlvdXQoaW5pdEVsZXMsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIG9ucmVhZHlcbiAgICAgIGN5LnN0YXJ0QW5pbWF0aW9uTG9vcCgpO1xuICAgICAgX3AucmVhZHkgPSB0cnVlO1xuXG4gICAgICAvLyBpZiBhIHJlYWR5IGNhbGxiYWNrIGlzIHNwZWNpZmllZCBhcyBhbiBvcHRpb24sIHRoZSBiaW5kIGl0XG4gICAgICBpZiAoZm4kNihvcHRpb25zLnJlYWR5KSkge1xuICAgICAgICBjeS5vbigncmVhZHknLCBvcHRpb25zLnJlYWR5KTtcbiAgICAgIH1cblxuICAgICAgLy8gYmluZCBhbGwgdGhlIHJlYWR5IGhhbmRsZXJzIHJlZ2lzdGVyZWQgYmVmb3JlIGNyZWF0aW5nIHRoaXMgaW5zdGFuY2VcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVhZGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZm4gPSByZWFkaWVzW2ldO1xuICAgICAgICBjeS5vbigncmVhZHknLCBmbik7XG4gICAgICB9XG4gICAgICBpZiAocmVnKSB7XG4gICAgICAgIHJlZy5yZWFkaWVzID0gW107XG4gICAgICB9IC8vIGNsZWFyIGIvYyB3ZSd2ZSBib3VuZCB0aGVtIGFsbCBhbmQgZG9uJ3Qgd2FudCB0byBrZWVwIGl0IGFyb3VuZCBpbiBjYXNlIGEgbmV3IGNvcmUgdXNlcyB0aGUgc2FtZSBkaXYgZXRjXG5cbiAgICAgIGN5LmVtaXQoJ3JlYWR5Jyk7XG4gICAgfSwgb3B0aW9ucy5kb25lKTtcbiAgfSk7XG59O1xudmFyIGNvcmVmbiA9IENvcmUucHJvdG90eXBlOyAvLyBzaG9ydCBhbGlhc1xuXG5leHRlbmQoY29yZWZuLCB7XG4gIGluc3RhbmNlU3RyaW5nOiBmdW5jdGlvbiBpbnN0YW5jZVN0cmluZygpIHtcbiAgICByZXR1cm4gJ2NvcmUnO1xuICB9LFxuICBpc1JlYWR5OiBmdW5jdGlvbiBpc1JlYWR5KCkge1xuICAgIHJldHVybiB0aGlzLl9wcml2YXRlLnJlYWR5O1xuICB9LFxuICBkZXN0cm95ZWQ6IGZ1bmN0aW9uIGRlc3Ryb3llZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5kZXN0cm95ZWQ7XG4gIH0sXG4gIHJlYWR5OiBmdW5jdGlvbiByZWFkeShmbikge1xuICAgIGlmICh0aGlzLmlzUmVhZHkoKSkge1xuICAgICAgdGhpcy5lbWl0dGVyKCkuZW1pdCgncmVhZHknLCBbXSwgZm4pOyAvLyBqdXN0IGNhbGxzIGZuIGFzIHRob3VnaCB0cmlnZ2VyZWQgdmlhIHJlYWR5IGV2ZW50XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub24oJ3JlYWR5JywgZm4pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICB2YXIgY3kgPSB0aGlzO1xuICAgIGlmIChjeS5kZXN0cm95ZWQoKSkgcmV0dXJuO1xuICAgIGN5LnN0b3BBbmltYXRpb25Mb29wKCk7XG4gICAgY3kuZGVzdHJveVJlbmRlcmVyKCk7XG4gICAgdGhpcy5lbWl0KCdkZXN0cm95Jyk7XG4gICAgY3kuX3ByaXZhdGUuZGVzdHJveWVkID0gdHJ1ZTtcbiAgICByZXR1cm4gY3k7XG4gIH0sXG4gIGhhc0VsZW1lbnRXaXRoSWQ6IGZ1bmN0aW9uIGhhc0VsZW1lbnRXaXRoSWQoaWQpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5lbGVtZW50cy5oYXNFbGVtZW50V2l0aElkKGlkKTtcbiAgfSxcbiAgZ2V0RWxlbWVudEJ5SWQ6IGZ1bmN0aW9uIGdldEVsZW1lbnRCeUlkKGlkKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuZWxlbWVudHMuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICB9LFxuICBoYXNDb21wb3VuZE5vZGVzOiBmdW5jdGlvbiBoYXNDb21wb3VuZE5vZGVzKCkge1xuICAgIHJldHVybiB0aGlzLl9wcml2YXRlLmhhc0NvbXBvdW5kTm9kZXM7XG4gIH0sXG4gIGhlYWRsZXNzOiBmdW5jdGlvbiBoZWFkbGVzcygpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5yZW5kZXJlci5pc0hlYWRsZXNzKCk7XG4gIH0sXG4gIHN0eWxlRW5hYmxlZDogZnVuY3Rpb24gc3R5bGVFbmFibGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9wcml2YXRlLnN0eWxlRW5hYmxlZDtcbiAgfSxcbiAgYWRkVG9Qb29sOiBmdW5jdGlvbiBhZGRUb1Bvb2woZWxlcykge1xuICAgIHRoaXMuX3ByaXZhdGUuZWxlbWVudHMubWVyZ2UoZWxlcyk7XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG4gIHJlbW92ZUZyb21Qb29sOiBmdW5jdGlvbiByZW1vdmVGcm9tUG9vbChlbGVzKSB7XG4gICAgdGhpcy5fcHJpdmF0ZS5lbGVtZW50cy51bm1lcmdlKGVsZXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBjb250YWluZXI6IGZ1bmN0aW9uIGNvbnRhaW5lcigpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5jb250YWluZXIgfHwgbnVsbDtcbiAgfSxcbiAgd2luZG93OiBmdW5jdGlvbiB3aW5kb3coKSB7XG4gICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuX3ByaXZhdGUuY29udGFpbmVyO1xuICAgIGlmIChjb250YWluZXIgPT0gbnVsbCkgcmV0dXJuIF93aW5kb3c7XG4gICAgdmFyIG93bmVyRG9jdW1lbnQgPSB0aGlzLl9wcml2YXRlLmNvbnRhaW5lci5vd25lckRvY3VtZW50O1xuICAgIGlmIChvd25lckRvY3VtZW50ID09PSB1bmRlZmluZWQgfHwgb3duZXJEb2N1bWVudCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gX3dpbmRvdztcbiAgICB9XG4gICAgcmV0dXJuIG93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgfHwgX3dpbmRvdztcbiAgfSxcbiAgbW91bnQ6IGZ1bmN0aW9uIG1vdW50KGNvbnRhaW5lcikge1xuICAgIGlmIChjb250YWluZXIgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgY3kgPSB0aGlzO1xuICAgIHZhciBfcCA9IGN5Ll9wcml2YXRlO1xuICAgIHZhciBvcHRpb25zID0gX3Aub3B0aW9ucztcbiAgICBpZiAoIWh0bWxFbGVtZW50KGNvbnRhaW5lcikgJiYgaHRtbEVsZW1lbnQoY29udGFpbmVyWzBdKSkge1xuICAgICAgY29udGFpbmVyID0gY29udGFpbmVyWzBdO1xuICAgIH1cbiAgICBjeS5zdG9wQW5pbWF0aW9uTG9vcCgpO1xuICAgIGN5LmRlc3Ryb3lSZW5kZXJlcigpO1xuICAgIF9wLmNvbnRhaW5lciA9IGNvbnRhaW5lcjtcbiAgICBfcC5zdHlsZUVuYWJsZWQgPSB0cnVlO1xuICAgIGN5LmludmFsaWRhdGVTaXplKCk7XG4gICAgY3kuaW5pdFJlbmRlcmVyKGV4dGVuZCh7fSwgb3B0aW9ucywgb3B0aW9ucy5yZW5kZXJlciwge1xuICAgICAgLy8gYWxsb3cgY3VzdG9tIHJlbmRlcmVyIG5hbWUgdG8gYmUgcmUtdXNlZCwgb3RoZXJ3aXNlIHVzZSBjYW52YXNcbiAgICAgIG5hbWU6IG9wdGlvbnMucmVuZGVyZXIubmFtZSA9PT0gJ251bGwnID8gJ2NhbnZhcycgOiBvcHRpb25zLnJlbmRlcmVyLm5hbWVcbiAgICB9KSk7XG4gICAgY3kuc3RhcnRBbmltYXRpb25Mb29wKCk7XG4gICAgY3kuc3R5bGUob3B0aW9ucy5zdHlsZSk7XG4gICAgY3kuZW1pdCgnbW91bnQnKTtcbiAgICByZXR1cm4gY3k7XG4gIH0sXG4gIHVubW91bnQ6IGZ1bmN0aW9uIHVubW91bnQoKSB7XG4gICAgdmFyIGN5ID0gdGhpcztcbiAgICBjeS5zdG9wQW5pbWF0aW9uTG9vcCgpO1xuICAgIGN5LmRlc3Ryb3lSZW5kZXJlcigpO1xuICAgIGN5LmluaXRSZW5kZXJlcih7XG4gICAgICBuYW1lOiAnbnVsbCdcbiAgICB9KTtcbiAgICBjeS5lbWl0KCd1bm1vdW50Jyk7XG4gICAgcmV0dXJuIGN5O1xuICB9LFxuICBvcHRpb25zOiBmdW5jdGlvbiBvcHRpb25zKCkge1xuICAgIHJldHVybiBjb3B5KHRoaXMuX3ByaXZhdGUub3B0aW9ucyk7XG4gIH0sXG4gIGpzb246IGZ1bmN0aW9uIGpzb24ob2JqKSB7XG4gICAgdmFyIGN5ID0gdGhpcztcbiAgICB2YXIgX3AgPSBjeS5fcHJpdmF0ZTtcbiAgICB2YXIgZWxlcyA9IGN5Lm11dGFibGVFbGVtZW50cygpO1xuICAgIHZhciBnZXRGcmVzaFJlZiA9IGZ1bmN0aW9uIGdldEZyZXNoUmVmKGVsZSkge1xuICAgICAgcmV0dXJuIGN5LmdldEVsZW1lbnRCeUlkKGVsZS5pZCgpKTtcbiAgICB9O1xuICAgIGlmIChwbGFpbk9iamVjdChvYmopKSB7XG4gICAgICAvLyBzZXRcblxuICAgICAgY3kuc3RhcnRCYXRjaCgpO1xuICAgICAgaWYgKG9iai5lbGVtZW50cykge1xuICAgICAgICB2YXIgaWRJbkpzb24gPSB7fTtcbiAgICAgICAgdmFyIHVwZGF0ZUVsZXMgPSBmdW5jdGlvbiB1cGRhdGVFbGVzKGpzb25zLCBncikge1xuICAgICAgICAgIHZhciB0b0FkZCA9IFtdO1xuICAgICAgICAgIHZhciB0b01vZCA9IFtdO1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwganNvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBqc29uID0ganNvbnNbaV07XG4gICAgICAgICAgICBpZiAoIWpzb24uZGF0YS5pZCkge1xuICAgICAgICAgICAgICB3YXJuKCdjeS5qc29uKCkgY2Fubm90IGhhbmRsZSBlbGVtZW50cyB3aXRob3V0IGFuIElEIGF0dHJpYnV0ZScpO1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBpZCA9ICcnICsganNvbi5kYXRhLmlkOyAvLyBpZCBtdXN0IGJlIHN0cmluZ1xuICAgICAgICAgICAgdmFyIGVsZSA9IGN5LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICAgICAgICAgIGlkSW5Kc29uW2lkXSA9IHRydWU7XG4gICAgICAgICAgICBpZiAoZWxlLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAvLyBleGlzdGluZyBlbGVtZW50IHNob3VsZCBiZSB1cGRhdGVkXG4gICAgICAgICAgICAgIHRvTW9kLnB1c2goe1xuICAgICAgICAgICAgICAgIGVsZTogZWxlLFxuICAgICAgICAgICAgICAgIGpzb246IGpzb25cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBvdGhlcndpc2Ugc2hvdWxkIGJlIGFkZGVkXG4gICAgICAgICAgICAgIGlmIChncikge1xuICAgICAgICAgICAgICAgIGpzb24uZ3JvdXAgPSBncjtcbiAgICAgICAgICAgICAgICB0b0FkZC5wdXNoKGpzb24pO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRvQWRkLnB1c2goanNvbik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY3kuYWRkKHRvQWRkKTtcbiAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgdG9Nb2QubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB2YXIgX3RvTW9kJF9pID0gdG9Nb2RbX2ldLFxuICAgICAgICAgICAgICBfZWxlID0gX3RvTW9kJF9pLmVsZSxcbiAgICAgICAgICAgICAgX2pzb24gPSBfdG9Nb2QkX2kuanNvbjtcbiAgICAgICAgICAgIF9lbGUuanNvbihfanNvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBpZiAoYXJyYXkob2JqLmVsZW1lbnRzKSkge1xuICAgICAgICAgIC8vIGVsZW1lbnRzOiBbXVxuICAgICAgICAgIHVwZGF0ZUVsZXMob2JqLmVsZW1lbnRzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBlbGVtZW50czogeyBub2RlczogW10sIGVkZ2VzOiBbXSB9XG4gICAgICAgICAgdmFyIGdycyA9IFsnbm9kZXMnLCAnZWRnZXMnXTtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGdyID0gZ3JzW2ldO1xuICAgICAgICAgICAgdmFyIGVsZW1lbnRzID0gb2JqLmVsZW1lbnRzW2dyXTtcbiAgICAgICAgICAgIGlmIChhcnJheShlbGVtZW50cykpIHtcbiAgICAgICAgICAgICAgdXBkYXRlRWxlcyhlbGVtZW50cywgZ3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgcGFyZW50c1RvUmVtb3ZlID0gY3kuY29sbGVjdGlvbigpO1xuICAgICAgICBlbGVzLmZpbHRlcihmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgICAgcmV0dXJuICFpZEluSnNvbltlbGUuaWQoKV07XG4gICAgICAgIH0pLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICAgIGlmIChlbGUuaXNQYXJlbnQoKSkge1xuICAgICAgICAgICAgcGFyZW50c1RvUmVtb3ZlLm1lcmdlKGVsZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVsZS5yZW1vdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIHNvIHRoYXQgY2hpbGRyZW4gYXJlIG5vdCByZW1vdmVkIHcvcGFyZW50XG4gICAgICAgIHBhcmVudHNUb1JlbW92ZS5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgICByZXR1cm4gZWxlLmNoaWxkcmVuKCkubW92ZSh7XG4gICAgICAgICAgICBwYXJlbnQ6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gaW50ZXJtZWRpYXRlIHBhcmVudHMgbWF5IGJlIG1vdmVkIGJ5IHByaW9yIGxpbmUsIHNvIG1ha2Ugc3VyZSB3ZSByZW1vdmUgYnkgZnJlc2ggcmVmc1xuICAgICAgICBwYXJlbnRzVG9SZW1vdmUuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgICAgcmV0dXJuIGdldEZyZXNoUmVmKGVsZSkucmVtb3ZlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKG9iai5zdHlsZSkge1xuICAgICAgICBjeS5zdHlsZShvYmouc3R5bGUpO1xuICAgICAgfVxuICAgICAgaWYgKG9iai56b29tICE9IG51bGwgJiYgb2JqLnpvb20gIT09IF9wLnpvb20pIHtcbiAgICAgICAgY3kuem9vbShvYmouem9vbSk7XG4gICAgICB9XG4gICAgICBpZiAob2JqLnBhbikge1xuICAgICAgICBpZiAob2JqLnBhbi54ICE9PSBfcC5wYW4ueCB8fCBvYmoucGFuLnkgIT09IF9wLnBhbi55KSB7XG4gICAgICAgICAgY3kucGFuKG9iai5wYW4pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAob2JqLmRhdGEpIHtcbiAgICAgICAgY3kuZGF0YShvYmouZGF0YSk7XG4gICAgICB9XG4gICAgICB2YXIgZmllbGRzID0gWydtaW5ab29tJywgJ21heFpvb20nLCAnem9vbWluZ0VuYWJsZWQnLCAndXNlclpvb21pbmdFbmFibGVkJywgJ3Bhbm5pbmdFbmFibGVkJywgJ3VzZXJQYW5uaW5nRW5hYmxlZCcsICdib3hTZWxlY3Rpb25FbmFibGVkJywgJ2F1dG9sb2NrJywgJ2F1dG91bmdyYWJpZnknLCAnYXV0b3Vuc2VsZWN0aWZ5JywgJ211bHRpQ2xpY2tEZWJvdW5jZVRpbWUnXTtcbiAgICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IGZpZWxkcy5sZW5ndGg7IF9pMisrKSB7XG4gICAgICAgIHZhciBmID0gZmllbGRzW19pMl07XG4gICAgICAgIGlmIChvYmpbZl0gIT0gbnVsbCkge1xuICAgICAgICAgIGN5W2ZdKG9ialtmXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGN5LmVuZEJhdGNoKCk7XG4gICAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZ2V0XG4gICAgICB2YXIgZmxhdCA9ICEhb2JqO1xuICAgICAgdmFyIGpzb24gPSB7fTtcbiAgICAgIGlmIChmbGF0KSB7XG4gICAgICAgIGpzb24uZWxlbWVudHMgPSB0aGlzLmVsZW1lbnRzKCkubWFwKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgICByZXR1cm4gZWxlLmpzb24oKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBqc29uLmVsZW1lbnRzID0ge307XG4gICAgICAgIGVsZXMuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgICAgdmFyIGdyb3VwID0gZWxlLmdyb3VwKCk7XG4gICAgICAgICAgaWYgKCFqc29uLmVsZW1lbnRzW2dyb3VwXSkge1xuICAgICAgICAgICAganNvbi5lbGVtZW50c1tncm91cF0gPSBbXTtcbiAgICAgICAgICB9XG4gICAgICAgICAganNvbi5lbGVtZW50c1tncm91cF0ucHVzaChlbGUuanNvbigpKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fcHJpdmF0ZS5zdHlsZUVuYWJsZWQpIHtcbiAgICAgICAganNvbi5zdHlsZSA9IGN5LnN0eWxlKCkuanNvbigpO1xuICAgICAgfVxuICAgICAganNvbi5kYXRhID0gY29weShjeS5kYXRhKCkpO1xuICAgICAgdmFyIG9wdGlvbnMgPSBfcC5vcHRpb25zO1xuICAgICAganNvbi56b29taW5nRW5hYmxlZCA9IF9wLnpvb21pbmdFbmFibGVkO1xuICAgICAganNvbi51c2VyWm9vbWluZ0VuYWJsZWQgPSBfcC51c2VyWm9vbWluZ0VuYWJsZWQ7XG4gICAgICBqc29uLnpvb20gPSBfcC56b29tO1xuICAgICAganNvbi5taW5ab29tID0gX3AubWluWm9vbTtcbiAgICAgIGpzb24ubWF4Wm9vbSA9IF9wLm1heFpvb207XG4gICAgICBqc29uLnBhbm5pbmdFbmFibGVkID0gX3AucGFubmluZ0VuYWJsZWQ7XG4gICAgICBqc29uLnVzZXJQYW5uaW5nRW5hYmxlZCA9IF9wLnVzZXJQYW5uaW5nRW5hYmxlZDtcbiAgICAgIGpzb24ucGFuID0gY29weShfcC5wYW4pO1xuICAgICAganNvbi5ib3hTZWxlY3Rpb25FbmFibGVkID0gX3AuYm94U2VsZWN0aW9uRW5hYmxlZDtcbiAgICAgIGpzb24ucmVuZGVyZXIgPSBjb3B5KG9wdGlvbnMucmVuZGVyZXIpO1xuICAgICAganNvbi5oaWRlRWRnZXNPblZpZXdwb3J0ID0gb3B0aW9ucy5oaWRlRWRnZXNPblZpZXdwb3J0O1xuICAgICAganNvbi50ZXh0dXJlT25WaWV3cG9ydCA9IG9wdGlvbnMudGV4dHVyZU9uVmlld3BvcnQ7XG4gICAgICBqc29uLndoZWVsU2Vuc2l0aXZpdHkgPSBvcHRpb25zLndoZWVsU2Vuc2l0aXZpdHk7XG4gICAgICBqc29uLm1vdGlvbkJsdXIgPSBvcHRpb25zLm1vdGlvbkJsdXI7XG4gICAgICBqc29uLm11bHRpQ2xpY2tEZWJvdW5jZVRpbWUgPSBvcHRpb25zLm11bHRpQ2xpY2tEZWJvdW5jZVRpbWU7XG4gICAgICByZXR1cm4ganNvbjtcbiAgICB9XG4gIH1cbn0pO1xuY29yZWZuLiRpZCA9IGNvcmVmbi5nZXRFbGVtZW50QnlJZDtcbltjb3JlZm4kOSwgY29yZWZuJDgsIGVsZXNmbiwgY29yZWZuJDcsIGNvcmVmbiQ2LCBjb3JlZm4kNSwgY29yZWZuJDQsIGNvcmVmbiQzLCBjb3JlZm4kMiwgY29yZWZuJDEsIGZuXS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wcykge1xuICBleHRlbmQoY29yZWZuLCBwcm9wcyk7XG59KTtcblxuLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cbnZhciBkZWZhdWx0cyQ3ID0ge1xuICBmaXQ6IHRydWUsXG4gIC8vIHdoZXRoZXIgdG8gZml0IHRoZSB2aWV3cG9ydCB0byB0aGUgZ3JhcGhcbiAgZGlyZWN0ZWQ6IGZhbHNlLFxuICAvLyB3aGV0aGVyIHRoZSB0cmVlIGlzIGRpcmVjdGVkIGRvd253YXJkcyAob3IgZWRnZXMgY2FuIHBvaW50IGluIGFueSBkaXJlY3Rpb24gaWYgZmFsc2UpXG4gIGRpcmVjdGlvbjogJ2Rvd253YXJkJyxcbiAgLy8gZGV0ZXJtaW5lcyB0aGUgZGlyZWN0aW9uIGluIHdoaWNoIHRoZSB0cmVlIHN0cnVjdHVyZSBpcyBkcmF3bi4gIFRoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlICdkb3dud2FyZCcsICd1cHdhcmQnLCAncmlnaHR3YXJkJywgb3IgJ2xlZnR3YXJkJy5cbiAgcGFkZGluZzogMzAsXG4gIC8vIHBhZGRpbmcgb24gZml0XG4gIGNpcmNsZTogZmFsc2UsXG4gIC8vIHB1dCBkZXB0aHMgaW4gY29uY2VudHJpYyBjaXJjbGVzIGlmIHRydWUsIHB1dCBkZXB0aHMgdG9wIGRvd24gaWYgZmFsc2VcbiAgZ3JpZDogZmFsc2UsXG4gIC8vIHdoZXRoZXIgdG8gY3JlYXRlIGFuIGV2ZW4gZ3JpZCBpbnRvIHdoaWNoIHRoZSBEQUcgaXMgcGxhY2VkIChjaXJjbGU6ZmFsc2Ugb25seSlcbiAgc3BhY2luZ0ZhY3RvcjogMS43NSxcbiAgLy8gcG9zaXRpdmUgc3BhY2luZyBmYWN0b3IsIGxhcmdlciA9PiBtb3JlIHNwYWNlIGJldHdlZW4gbm9kZXMgKE4uQi4gbi9hIGlmIGNhdXNlcyBvdmVybGFwKVxuICBib3VuZGluZ0JveDogdW5kZWZpbmVkLFxuICAvLyBjb25zdHJhaW4gbGF5b3V0IGJvdW5kczsgeyB4MSwgeTEsIHgyLCB5MiB9IG9yIHsgeDEsIHkxLCB3LCBoIH1cbiAgYXZvaWRPdmVybGFwOiB0cnVlLFxuICAvLyBwcmV2ZW50cyBub2RlIG92ZXJsYXAsIG1heSBvdmVyZmxvdyBib3VuZGluZ0JveCBpZiBub3QgZW5vdWdoIHNwYWNlXG4gIG5vZGVEaW1lbnNpb25zSW5jbHVkZUxhYmVsczogZmFsc2UsXG4gIC8vIEV4Y2x1ZGVzIHRoZSBsYWJlbCB3aGVuIGNhbGN1bGF0aW5nIG5vZGUgYm91bmRpbmcgYm94ZXMgZm9yIHRoZSBsYXlvdXQgYWxnb3JpdGhtXG4gIHJvb3RzOiB1bmRlZmluZWQsXG4gIC8vIHRoZSByb290cyBvZiB0aGUgdHJlZXNcbiAgZGVwdGhTb3J0OiB1bmRlZmluZWQsXG4gIC8vIGEgc29ydGluZyBmdW5jdGlvbiB0byBvcmRlciBub2RlcyBhdCBlcXVhbCBkZXB0aC4gZS5nLiBmdW5jdGlvbihhLCBiKXsgcmV0dXJuIGEuZGF0YSgnd2VpZ2h0JykgLSBiLmRhdGEoJ3dlaWdodCcpIH1cbiAgYW5pbWF0ZTogZmFsc2UsXG4gIC8vIHdoZXRoZXIgdG8gdHJhbnNpdGlvbiB0aGUgbm9kZSBwb3NpdGlvbnNcbiAgYW5pbWF0aW9uRHVyYXRpb246IDUwMCxcbiAgLy8gZHVyYXRpb24gb2YgYW5pbWF0aW9uIGluIG1zIGlmIGVuYWJsZWRcbiAgYW5pbWF0aW9uRWFzaW5nOiB1bmRlZmluZWQsXG4gIC8vIGVhc2luZyBvZiBhbmltYXRpb24gaWYgZW5hYmxlZCxcbiAgYW5pbWF0ZUZpbHRlcjogZnVuY3Rpb24gYW5pbWF0ZUZpbHRlcihub2RlLCBpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIC8vIGEgZnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIG5vZGUgc2hvdWxkIGJlIGFuaW1hdGVkLiAgQWxsIG5vZGVzIGFuaW1hdGVkIGJ5IGRlZmF1bHQgb24gYW5pbWF0ZSBlbmFibGVkLiAgTm9uLWFuaW1hdGVkIG5vZGVzIGFyZSBwb3NpdGlvbmVkIGltbWVkaWF0ZWx5IHdoZW4gdGhlIGxheW91dCBzdGFydHNcbiAgcmVhZHk6IHVuZGVmaW5lZCxcbiAgLy8gY2FsbGJhY2sgb24gbGF5b3V0cmVhZHlcbiAgc3RvcDogdW5kZWZpbmVkLFxuICAvLyBjYWxsYmFjayBvbiBsYXlvdXRzdG9wXG4gIHRyYW5zZm9ybTogZnVuY3Rpb24gdHJhbnNmb3JtKG5vZGUsIHBvc2l0aW9uKSB7XG4gICAgcmV0dXJuIHBvc2l0aW9uO1xuICB9IC8vIHRyYW5zZm9ybSBhIGdpdmVuIG5vZGUgcG9zaXRpb24uIFVzZWZ1bCBmb3IgY2hhbmdpbmcgZmxvdyBkaXJlY3Rpb24gaW4gZGlzY3JldGUgbGF5b3V0c1xufTtcbnZhciBkZXByZWNhdGVkT3B0aW9uRGVmYXVsdHMgPSB7XG4gIG1heGltYWw6IGZhbHNlLFxuICAvLyB3aGV0aGVyIHRvIHNoaWZ0IG5vZGVzIGRvd24gdGhlaXIgbmF0dXJhbCBCRlMgZGVwdGhzIGluIG9yZGVyIHRvIGF2b2lkIHVwd2FyZHMgZWRnZXMgKERBR1Mgb25seSk7IHNldHRpbmcgYWN5Y2xpYyB0byB0cnVlIHNldHMgbWF4aW1hbCB0byB0cnVlIGFsc29cbiAgYWN5Y2xpYzogZmFsc2UgLy8gd2hldGhlciB0aGUgdHJlZSBpcyBhY3ljbGljIGFuZCB0aHVzIGEgbm9kZSBjb3VsZCBiZSBzaGlmdGVkIChkdWUgdG8gdGhlIG1heGltYWwgb3B0aW9uKSBtdWx0aXBsZSB0aW1lcyB3aXRob3V0IGNhdXNpbmcgYW4gaW5maW5pdGUgbG9vcDsgc2V0dGluZyB0byB0cnVlIHNldHMgbWF4aW1hbCB0byB0cnVlIGFsc287IGlmIHlvdSBhcmUgdW5jZXJ0YWluIHdoZXRoZXIgYSB0cmVlIGlzIGFjeWNsaWMsIHNldCB0byBmYWxzZSB0byBhdm9pZCBwb3RlbnRpYWwgaW5maW5pdGUgbG9vcHNcbn07XG5cbi8qIGVzbGludC1lbmFibGUgKi9cblxudmFyIGdldEluZm8gPSBmdW5jdGlvbiBnZXRJbmZvKGVsZSkge1xuICByZXR1cm4gZWxlLnNjcmF0Y2goJ2JyZWFkdGhmaXJzdCcpO1xufTtcbnZhciBzZXRJbmZvID0gZnVuY3Rpb24gc2V0SW5mbyhlbGUsIG9iaikge1xuICByZXR1cm4gZWxlLnNjcmF0Y2goJ2JyZWFkdGhmaXJzdCcsIG9iaik7XG59O1xuZnVuY3Rpb24gQnJlYWR0aEZpcnN0TGF5b3V0KG9wdGlvbnMpIHtcbiAgdGhpcy5vcHRpb25zID0gZXh0ZW5kKHt9LCBkZWZhdWx0cyQ3LCBkZXByZWNhdGVkT3B0aW9uRGVmYXVsdHMsIG9wdGlvbnMpO1xufVxuQnJlYWR0aEZpcnN0TGF5b3V0LnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICB2YXIgY3kgPSBvcHRpb25zLmN5O1xuICB2YXIgZWxlcyA9IG9wdGlvbnMuZWxlcztcbiAgdmFyIG5vZGVzID0gZWxlcy5ub2RlcygpLmZpbHRlcihmdW5jdGlvbiAobikge1xuICAgIHJldHVybiBuLmlzQ2hpbGRsZXNzKCk7XG4gIH0pO1xuICB2YXIgZ3JhcGggPSBlbGVzO1xuICB2YXIgZGlyZWN0ZWQgPSBvcHRpb25zLmRpcmVjdGVkO1xuICB2YXIgbWF4aW1hbCA9IG9wdGlvbnMuYWN5Y2xpYyB8fCBvcHRpb25zLm1heGltYWwgfHwgb3B0aW9ucy5tYXhpbWFsQWRqdXN0bWVudHMgPiAwOyAvLyBtYXhpbWFsQWRqdXN0bWVudHMgZm9yIGNvbXBhdC4gdy8gb2xkIGNvZGU7IGFsc28sIHNldHRpbmcgYWN5Y2xpYyB0byB0cnVlIHNldHMgbWF4aW1hbCB0byB0cnVlXG5cbiAgdmFyIGhhc0JvdW5kaW5nQm94ID0gISFvcHRpb25zLmJvdW5kaW5nQm94O1xuICB2YXIgYmIgPSBtYWtlQm91bmRpbmdCb3goaGFzQm91bmRpbmdCb3ggPyBvcHRpb25zLmJvdW5kaW5nQm94IDogc3RydWN0dXJlZENsb25lKGN5LmV4dGVudCgpKSk7XG4gIHZhciByb290cztcbiAgaWYgKGVsZW1lbnRPckNvbGxlY3Rpb24ob3B0aW9ucy5yb290cykpIHtcbiAgICByb290cyA9IG9wdGlvbnMucm9vdHM7XG4gIH0gZWxzZSBpZiAoYXJyYXkob3B0aW9ucy5yb290cykpIHtcbiAgICB2YXIgcm9vdHNBcnJheSA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3B0aW9ucy5yb290cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGlkID0gb3B0aW9ucy5yb290c1tpXTtcbiAgICAgIHZhciBlbGUgPSBjeS5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgICByb290c0FycmF5LnB1c2goZWxlKTtcbiAgICB9XG4gICAgcm9vdHMgPSBjeS5jb2xsZWN0aW9uKHJvb3RzQXJyYXkpO1xuICB9IGVsc2UgaWYgKHN0cmluZyhvcHRpb25zLnJvb3RzKSkge1xuICAgIHJvb3RzID0gY3kuJChvcHRpb25zLnJvb3RzKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoZGlyZWN0ZWQpIHtcbiAgICAgIHJvb3RzID0gbm9kZXMucm9vdHMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGNvbXBvbmVudHMgPSBlbGVzLmNvbXBvbmVudHMoKTtcbiAgICAgIHJvb3RzID0gY3kuY29sbGVjdGlvbigpO1xuICAgICAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoKSB7XG4gICAgICAgIHZhciBjb21wID0gY29tcG9uZW50c1tfaV07XG4gICAgICAgIHZhciBtYXhEZWdyZWUgPSBjb21wLm1heERlZ3JlZShmYWxzZSk7XG4gICAgICAgIHZhciBjb21wUm9vdHMgPSBjb21wLmZpbHRlcihmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgICAgcmV0dXJuIGVsZS5kZWdyZWUoZmFsc2UpID09PSBtYXhEZWdyZWU7XG4gICAgICAgIH0pO1xuICAgICAgICByb290cyA9IHJvb3RzLmFkZChjb21wUm9vdHMpO1xuICAgICAgfTtcbiAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBjb21wb25lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICBfbG9vcCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICB2YXIgZGVwdGhzID0gW107XG4gIHZhciBmb3VuZEJ5QmZzID0ge307XG4gIHZhciBhZGRUb0RlcHRoID0gZnVuY3Rpb24gYWRkVG9EZXB0aChlbGUsIGQpIHtcbiAgICBpZiAoZGVwdGhzW2RdID09IG51bGwpIHtcbiAgICAgIGRlcHRoc1tkXSA9IFtdO1xuICAgIH1cbiAgICB2YXIgaSA9IGRlcHRoc1tkXS5sZW5ndGg7XG4gICAgZGVwdGhzW2RdLnB1c2goZWxlKTtcbiAgICBzZXRJbmZvKGVsZSwge1xuICAgICAgaW5kZXg6IGksXG4gICAgICBkZXB0aDogZFxuICAgIH0pO1xuICB9O1xuICB2YXIgY2hhbmdlRGVwdGggPSBmdW5jdGlvbiBjaGFuZ2VEZXB0aChlbGUsIG5ld0RlcHRoKSB7XG4gICAgdmFyIF9nZXRJbmZvID0gZ2V0SW5mbyhlbGUpLFxuICAgICAgZGVwdGggPSBfZ2V0SW5mby5kZXB0aCxcbiAgICAgIGluZGV4ID0gX2dldEluZm8uaW5kZXg7XG4gICAgZGVwdGhzW2RlcHRoXVtpbmRleF0gPSBudWxsO1xuXG4gICAgLy8gYWRkIG9ubHkgY2hpbGRsZXNzIG5vZGVzXG4gICAgaWYgKGVsZS5pc0NoaWxkbGVzcygpKSBhZGRUb0RlcHRoKGVsZSwgbmV3RGVwdGgpO1xuICB9O1xuXG4gIC8vIGZpbmQgdGhlIGRlcHRocyBvZiB0aGUgbm9kZXNcbiAgZ3JhcGguYmZzKHtcbiAgICByb290czogcm9vdHMsXG4gICAgZGlyZWN0ZWQ6IG9wdGlvbnMuZGlyZWN0ZWQsXG4gICAgdmlzaXQ6IGZ1bmN0aW9uIHZpc2l0KG5vZGUsIGVkZ2UsIHBOb2RlLCBpLCBkZXB0aCkge1xuICAgICAgdmFyIGVsZSA9IG5vZGVbMF07XG4gICAgICB2YXIgaWQgPSBlbGUuaWQoKTtcblxuICAgICAgLy8gYWRkIG9ubHkgY2hpbGRsZXNzIG5vZGVzXG4gICAgICBpZiAoZWxlLmlzQ2hpbGRsZXNzKCkpIGFkZFRvRGVwdGgoZWxlLCBkZXB0aCk7XG4gICAgICBmb3VuZEJ5QmZzW2lkXSA9IHRydWU7XG4gICAgfVxuICB9KTtcblxuICAvLyBjaGVjayBmb3Igbm9kZXMgbm90IGZvdW5kIGJ5IGJmc1xuICB2YXIgb3JwaGFuTm9kZXMgPSBbXTtcbiAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgbm9kZXMubGVuZ3RoOyBfaTIrKykge1xuICAgIHZhciBfZWxlID0gbm9kZXNbX2kyXTtcbiAgICBpZiAoZm91bmRCeUJmc1tfZWxlLmlkKCldKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3JwaGFuTm9kZXMucHVzaChfZWxlKTtcbiAgICB9XG4gIH1cblxuICAvLyBhc3NpZ24gdGhlIG5vZGVzIGEgZGVwdGggYW5kIGluZGV4XG4gIHZhciBhc3NpZ25EZXB0aHNBdCA9IGZ1bmN0aW9uIGFzc2lnbkRlcHRoc0F0KGkpIHtcbiAgICB2YXIgZWxlcyA9IGRlcHRoc1tpXTtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGVsZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBfZWxlMiA9IGVsZXNbal07XG4gICAgICBpZiAoX2VsZTIgPT0gbnVsbCkge1xuICAgICAgICBlbGVzLnNwbGljZShqLCAxKTtcbiAgICAgICAgai0tO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHNldEluZm8oX2VsZTIsIHtcbiAgICAgICAgZGVwdGg6IGksXG4gICAgICAgIGluZGV4OiBqXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG4gIHZhciBhZGp1c3RNYXhpbWFsbHkgPSBmdW5jdGlvbiBhZGp1c3RNYXhpbWFsbHkoZWxlLCBzaGlmdGVkKSB7XG4gICAgdmFyIGVJbmZvID0gZ2V0SW5mbyhlbGUpO1xuICAgIHZhciBpbmNvbWVycyA9IGVsZS5pbmNvbWVycygpLmZpbHRlcihmdW5jdGlvbiAoZWwpIHtcbiAgICAgIHJldHVybiBlbC5pc05vZGUoKSAmJiBlbGVzLmhhcyhlbCk7XG4gICAgfSk7XG4gICAgdmFyIG1heERlcHRoID0gLTE7XG4gICAgdmFyIGlkID0gZWxlLmlkKCk7XG4gICAgZm9yICh2YXIgayA9IDA7IGsgPCBpbmNvbWVycy5sZW5ndGg7IGsrKykge1xuICAgICAgdmFyIGluY21yID0gaW5jb21lcnNba107XG4gICAgICB2YXIgaUluZm8gPSBnZXRJbmZvKGluY21yKTtcbiAgICAgIG1heERlcHRoID0gTWF0aC5tYXgobWF4RGVwdGgsIGlJbmZvLmRlcHRoKTtcbiAgICB9XG4gICAgaWYgKGVJbmZvLmRlcHRoIDw9IG1heERlcHRoKSB7XG4gICAgICBpZiAoIW9wdGlvbnMuYWN5Y2xpYyAmJiBzaGlmdGVkW2lkXSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHZhciBuZXdEZXB0aCA9IG1heERlcHRoICsgMTtcbiAgICAgIGNoYW5nZURlcHRoKGVsZSwgbmV3RGVwdGgpO1xuICAgICAgc2hpZnRlZFtpZF0gPSBuZXdEZXB0aDtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgLy8gZm9yIHRoZSBkaXJlY3RlZCBjYXNlLCB0cnkgdG8gbWFrZSB0aGUgZWRnZXMgYWxsIGdvIGRvd24gKGkuZS4gZGVwdGggaSA9PiBkZXB0aCBpICsgMSlcbiAgaWYgKGRpcmVjdGVkICYmIG1heGltYWwpIHtcbiAgICB2YXIgUSA9IFtdO1xuICAgIHZhciBzaGlmdGVkID0ge307XG4gICAgdmFyIGVucXVldWUgPSBmdW5jdGlvbiBlbnF1ZXVlKG4pIHtcbiAgICAgIHJldHVybiBRLnB1c2gobik7XG4gICAgfTtcbiAgICB2YXIgZGVxdWV1ZSA9IGZ1bmN0aW9uIGRlcXVldWUoKSB7XG4gICAgICByZXR1cm4gUS5zaGlmdCgpO1xuICAgIH07XG4gICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbiAobikge1xuICAgICAgcmV0dXJuIFEucHVzaChuKTtcbiAgICB9KTtcbiAgICB3aGlsZSAoUS5sZW5ndGggPiAwKSB7XG4gICAgICB2YXIgX2VsZTMgPSBkZXF1ZXVlKCk7XG4gICAgICB2YXIgZGlkU2hpZnQgPSBhZGp1c3RNYXhpbWFsbHkoX2VsZTMsIHNoaWZ0ZWQpO1xuICAgICAgaWYgKGRpZFNoaWZ0KSB7XG4gICAgICAgIF9lbGUzLm91dGdvZXJzKCkuZmlsdGVyKGZ1bmN0aW9uIChlbCkge1xuICAgICAgICAgIHJldHVybiBlbC5pc05vZGUoKSAmJiBlbGVzLmhhcyhlbCk7XG4gICAgICAgIH0pLmZvckVhY2goZW5xdWV1ZSk7XG4gICAgICB9IGVsc2UgaWYgKGRpZFNoaWZ0ID09PSBudWxsKSB7XG4gICAgICAgIHdhcm4oJ0RldGVjdGVkIGRvdWJsZSBtYXhpbWFsIHNoaWZ0IGZvciBub2RlIGAnICsgX2VsZTMuaWQoKSArICdgLiAgQmFpbGluZyBtYXhpbWFsIGFkanVzdG1lbnQgZHVlIHRvIGN5Y2xlLiAgVXNlIGBvcHRpb25zLm1heGltYWw6IHRydWVgIG9ubHkgb24gREFHcy4nKTtcbiAgICAgICAgYnJlYWs7IC8vIGV4aXQgb24gZmFpbHVyZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIGZpbmQgbWluIGRpc3RhbmNlIHdlIG5lZWQgdG8gbGVhdmUgYmV0d2VlbiBub2Rlc1xuICB2YXIgbWluRGlzdGFuY2UgPSAwO1xuICBpZiAob3B0aW9ucy5hdm9pZE92ZXJsYXApIHtcbiAgICBmb3IgKHZhciBfaTMgPSAwOyBfaTMgPCBub2Rlcy5sZW5ndGg7IF9pMysrKSB7XG4gICAgICB2YXIgbiA9IG5vZGVzW19pM107XG4gICAgICB2YXIgbmJiID0gbi5sYXlvdXREaW1lbnNpb25zKG9wdGlvbnMpO1xuICAgICAgdmFyIHcgPSBuYmIudztcbiAgICAgIHZhciBoID0gbmJiLmg7XG4gICAgICBtaW5EaXN0YW5jZSA9IE1hdGgubWF4KG1pbkRpc3RhbmNlLCB3LCBoKTtcbiAgICB9XG4gIH1cblxuICAvLyBnZXQgdGhlIHdlaWdodGVkIHBlcmNlbnQgZm9yIGFuIGVsZW1lbnQgYmFzZWQgb24gaXRzIGNvbm5lY3Rpdml0eSB0byBvdGhlciBsZXZlbHNcbiAgdmFyIGNhY2hlZFdlaWdodGVkUGVyY2VudCA9IHt9O1xuICB2YXIgZ2V0V2VpZ2h0ZWRQZXJjZW50ID0gZnVuY3Rpb24gZ2V0V2VpZ2h0ZWRQZXJjZW50KGVsZSkge1xuICAgIGlmIChjYWNoZWRXZWlnaHRlZFBlcmNlbnRbZWxlLmlkKCldKSB7XG4gICAgICByZXR1cm4gY2FjaGVkV2VpZ2h0ZWRQZXJjZW50W2VsZS5pZCgpXTtcbiAgICB9XG4gICAgdmFyIGVsZURlcHRoID0gZ2V0SW5mbyhlbGUpLmRlcHRoO1xuICAgIHZhciBuZWlnaGJvcnMgPSBlbGUubmVpZ2hib3Job29kKCk7XG4gICAgdmFyIHBlcmNlbnQgPSAwO1xuICAgIHZhciBzYW1wbGVzID0gMDtcbiAgICBmb3IgKHZhciBfaTQgPSAwOyBfaTQgPCBuZWlnaGJvcnMubGVuZ3RoOyBfaTQrKykge1xuICAgICAgdmFyIG5laWdoYm9yID0gbmVpZ2hib3JzW19pNF07XG4gICAgICBpZiAobmVpZ2hib3IuaXNFZGdlKCkgfHwgbmVpZ2hib3IuaXNQYXJlbnQoKSB8fCAhbm9kZXMuaGFzKG5laWdoYm9yKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBiZiA9IGdldEluZm8obmVpZ2hib3IpO1xuICAgICAgaWYgKGJmID09IG51bGwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSBiZi5pbmRleDtcbiAgICAgIHZhciBkZXB0aCA9IGJmLmRlcHRoO1xuXG4gICAgICAvLyB1bmFzc2lnbmVkIG5laWdoYm91cnMgc2hvdWxkbid0IGFmZmVjdCB0aGUgb3JkZXJpbmdcbiAgICAgIGlmIChpbmRleCA9PSBudWxsIHx8IGRlcHRoID09IG51bGwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB2YXIgbkRlcHRoID0gZGVwdGhzW2RlcHRoXS5sZW5ndGg7XG4gICAgICBpZiAoZGVwdGggPCBlbGVEZXB0aCkge1xuICAgICAgICAvLyBvbmx5IGdldCBpbmZsdWVuY2VkIGJ5IGVsZW1lbnRzIGFib3ZlXG4gICAgICAgIHBlcmNlbnQgKz0gaW5kZXggLyBuRGVwdGg7XG4gICAgICAgIHNhbXBsZXMrKztcbiAgICAgIH1cbiAgICB9XG4gICAgc2FtcGxlcyA9IE1hdGgubWF4KDEsIHNhbXBsZXMpO1xuICAgIHBlcmNlbnQgPSBwZXJjZW50IC8gc2FtcGxlcztcbiAgICBpZiAoc2FtcGxlcyA9PT0gMCkge1xuICAgICAgLy8gcHV0IGxvbmUgbm9kZXMgYXQgdGhlIHN0YXJ0XG4gICAgICBwZXJjZW50ID0gMDtcbiAgICB9XG4gICAgY2FjaGVkV2VpZ2h0ZWRQZXJjZW50W2VsZS5pZCgpXSA9IHBlcmNlbnQ7XG4gICAgcmV0dXJuIHBlcmNlbnQ7XG4gIH07XG5cbiAgLy8gcmVhcnJhbmdlIHRoZSBpbmRpY2VzIGluIGVhY2ggZGVwdGggbGV2ZWwgYmFzZWQgb24gY29ubmVjdGl2aXR5XG4gIHZhciBzb3J0Rm4gPSBmdW5jdGlvbiBzb3J0Rm4oYSwgYikge1xuICAgIHZhciBhcGN0ID0gZ2V0V2VpZ2h0ZWRQZXJjZW50KGEpO1xuICAgIHZhciBicGN0ID0gZ2V0V2VpZ2h0ZWRQZXJjZW50KGIpO1xuICAgIHZhciBkaWZmID0gYXBjdCAtIGJwY3Q7XG4gICAgaWYgKGRpZmYgPT09IDApIHtcbiAgICAgIHJldHVybiBhc2NlbmRpbmcoYS5pZCgpLCBiLmlkKCkpOyAvLyBtYWtlIHN1cmUgc29ydCBkb2Vzbid0IGhhdmUgZG9uJ3QtY2FyZSBjb21wYXJpc29uc1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZGlmZjtcbiAgICB9XG4gIH07XG4gIGlmIChvcHRpb25zLmRlcHRoU29ydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgc29ydEZuID0gb3B0aW9ucy5kZXB0aFNvcnQ7XG4gIH1cbiAgdmFyIGRlcHRoc0xlbiA9IGRlcHRocy5sZW5ndGg7XG5cbiAgLy8gc29ydCBlYWNoIGxldmVsIHRvIG1ha2UgY29ubmVjdGVkIG5vZGVzIGNsb3NlclxuICBmb3IgKHZhciBfaTUgPSAwOyBfaTUgPCBkZXB0aHNMZW47IF9pNSsrKSB7XG4gICAgZGVwdGhzW19pNV0uc29ydChzb3J0Rm4pO1xuICAgIGFzc2lnbkRlcHRoc0F0KF9pNSk7XG4gIH1cblxuICAvLyBhc3NpZ24gb3JwaGFuIG5vZGVzIHRvIGEgbmV3IHRvcC1sZXZlbCBkZXB0aFxuICB2YXIgb3JwaGFuRGVwdGggPSBbXTtcbiAgZm9yICh2YXIgX2k2ID0gMDsgX2k2IDwgb3JwaGFuTm9kZXMubGVuZ3RoOyBfaTYrKykge1xuICAgIG9ycGhhbkRlcHRoLnB1c2gob3JwaGFuTm9kZXNbX2k2XSk7XG4gIH1cbiAgdmFyIGFzc2lnbkRlcHRocyA9IGZ1bmN0aW9uIGFzc2lnbkRlcHRocygpIHtcbiAgICBmb3IgKHZhciBfaTcgPSAwOyBfaTcgPCBkZXB0aHNMZW47IF9pNysrKSB7XG4gICAgICBhc3NpZ25EZXB0aHNBdChfaTcpO1xuICAgIH1cbiAgfTtcblxuICAvLyBhZGQgYSBuZXcgdG9wLWxldmVsIGRlcHRoIG9ubHkgd2hlbiB0aGVyZSBhcmUgb3JwaGFuIG5vZGVzXG4gIGlmIChvcnBoYW5EZXB0aC5sZW5ndGgpIHtcbiAgICBkZXB0aHMudW5zaGlmdChvcnBoYW5EZXB0aCk7XG4gICAgZGVwdGhzTGVuID0gZGVwdGhzLmxlbmd0aDtcbiAgICBhc3NpZ25EZXB0aHMoKTtcbiAgfVxuICB2YXIgYmlnZ2VzdERlcHRoU2l6ZSA9IDA7XG4gIGZvciAodmFyIF9pOCA9IDA7IF9pOCA8IGRlcHRoc0xlbjsgX2k4KyspIHtcbiAgICBiaWdnZXN0RGVwdGhTaXplID0gTWF0aC5tYXgoZGVwdGhzW19pOF0ubGVuZ3RoLCBiaWdnZXN0RGVwdGhTaXplKTtcbiAgfVxuICB2YXIgY2VudGVyID0ge1xuICAgIHg6IGJiLngxICsgYmIudyAvIDIsXG4gICAgeTogYmIueTEgKyBiYi5oIC8gMlxuICB9O1xuXG4gIC8vIGF2ZXJhZ2Ugbm9kZSBzaXplXG4gIHZhciBhdmVOb2RlU2l6ZSA9IG5vZGVzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBub2RlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChib3gpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHc6IGFjYy53ID09PSAtMSA/IGJveC53IDogKGFjYy53ICsgYm94LncpIC8gMixcbiAgICAgICAgaDogYWNjLmggPT09IC0xID8gYm94LmggOiAoYWNjLmggKyBib3guaCkgLyAyXG4gICAgICB9O1xuICAgIH0obm9kZS5ib3VuZGluZ0JveCh7XG4gICAgICBpbmNsdWRlTGFiZWxzOiBvcHRpb25zLm5vZGVEaW1lbnNpb25zSW5jbHVkZUxhYmVsc1xuICAgIH0pKTtcbiAgfSwge1xuICAgIHc6IC0xLFxuICAgIGg6IC0xXG4gIH0pO1xuICB2YXIgZGlzdGFuY2VZID0gTWF0aC5tYXgoXG4gIC8vIG9ubHkgb25lIGRlcHRoXG4gIGRlcHRoc0xlbiA9PT0gMSA/IDAgOlxuICAvLyBpbnNpZGUgYSBib3VuZGluZyBib3gsIG5vIG5lZWQgZm9yIHRvcCAmIGJvdHRvbSBwYWRkaW5nXG4gIGhhc0JvdW5kaW5nQm94ID8gKGJiLmggLSBvcHRpb25zLnBhZGRpbmcgKiAyIC0gYXZlTm9kZVNpemUuaCkgLyAoZGVwdGhzTGVuIC0gMSkgOiAoYmIuaCAtIG9wdGlvbnMucGFkZGluZyAqIDIgLSBhdmVOb2RlU2l6ZS5oKSAvIChkZXB0aHNMZW4gKyAxKSwgbWluRGlzdGFuY2UpO1xuICB2YXIgbWF4RGVwdGhTaXplID0gZGVwdGhzLnJlZHVjZShmdW5jdGlvbiAobWF4LCBlbGVzKSB7XG4gICAgcmV0dXJuIE1hdGgubWF4KG1heCwgZWxlcy5sZW5ndGgpO1xuICB9LCAwKTtcbiAgdmFyIGdldFBvc2l0aW9uVG9wQm90dG9tID0gZnVuY3Rpb24gZ2V0UG9zaXRpb25Ub3BCb3R0b20oZWxlKSB7XG4gICAgdmFyIF9nZXRJbmZvMiA9IGdldEluZm8oZWxlKSxcbiAgICAgIGRlcHRoID0gX2dldEluZm8yLmRlcHRoLFxuICAgICAgaW5kZXggPSBfZ2V0SW5mbzIuaW5kZXg7XG4gICAgaWYgKG9wdGlvbnMuY2lyY2xlKSB7XG4gICAgICB2YXIgcmFkaXVzU3RlcFNpemUgPSBNYXRoLm1pbihiYi53IC8gMiAvIGRlcHRoc0xlbiwgYmIuaCAvIDIgLyBkZXB0aHNMZW4pO1xuICAgICAgcmFkaXVzU3RlcFNpemUgPSBNYXRoLm1heChyYWRpdXNTdGVwU2l6ZSwgbWluRGlzdGFuY2UpO1xuICAgICAgdmFyIHJhZGl1cyA9IHJhZGl1c1N0ZXBTaXplICogZGVwdGggKyByYWRpdXNTdGVwU2l6ZSAtIChkZXB0aHNMZW4gPiAwICYmIGRlcHRoc1swXS5sZW5ndGggPD0gMyA/IHJhZGl1c1N0ZXBTaXplIC8gMiA6IDApO1xuICAgICAgdmFyIHRoZXRhID0gMiAqIE1hdGguUEkgLyBkZXB0aHNbZGVwdGhdLmxlbmd0aCAqIGluZGV4O1xuICAgICAgaWYgKGRlcHRoID09PSAwICYmIGRlcHRoc1swXS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmFkaXVzID0gMTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IGNlbnRlci54ICsgcmFkaXVzICogTWF0aC5jb3ModGhldGEpLFxuICAgICAgICB5OiBjZW50ZXIueSArIHJhZGl1cyAqIE1hdGguc2luKHRoZXRhKVxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGRlcHRoU2l6ZSA9IGRlcHRoc1tkZXB0aF0ubGVuZ3RoO1xuICAgICAgdmFyIGRpc3RhbmNlWCA9IE1hdGgubWF4KFxuICAgICAgLy8gb25seSBvbmUgZGVwdGhcbiAgICAgIGRlcHRoU2l6ZSA9PT0gMSA/IDAgOlxuICAgICAgLy8gaW5zaWRlIGEgYm91bmRpbmcgYm94LCBubyBuZWVkIGZvciBsZWZ0ICYgcmlnaHQgcGFkZGluZ1xuICAgICAgaGFzQm91bmRpbmdCb3ggPyAoYmIudyAtIG9wdGlvbnMucGFkZGluZyAqIDIgLSBhdmVOb2RlU2l6ZS53KSAvICgob3B0aW9ucy5ncmlkID8gbWF4RGVwdGhTaXplIDogZGVwdGhTaXplKSAtIDEpIDogKGJiLncgLSBvcHRpb25zLnBhZGRpbmcgKiAyIC0gYXZlTm9kZVNpemUudykgLyAoKG9wdGlvbnMuZ3JpZCA/IG1heERlcHRoU2l6ZSA6IGRlcHRoU2l6ZSkgKyAxKSwgbWluRGlzdGFuY2UpO1xuICAgICAgdmFyIGVwb3MgPSB7XG4gICAgICAgIHg6IGNlbnRlci54ICsgKGluZGV4ICsgMSAtIChkZXB0aFNpemUgKyAxKSAvIDIpICogZGlzdGFuY2VYLFxuICAgICAgICB5OiBjZW50ZXIueSArIChkZXB0aCArIDEgLSAoZGVwdGhzTGVuICsgMSkgLyAyKSAqIGRpc3RhbmNlWVxuICAgICAgfTtcbiAgICAgIHJldHVybiBlcG9zO1xuICAgIH1cbiAgfTtcbiAgdmFyIHJvdGF0ZURlZ3JlZXMgPSB7XG4gICAgJ2Rvd253YXJkJzogMCxcbiAgICAnbGVmdHdhcmQnOiA5MCxcbiAgICAndXB3YXJkJzogMTgwLFxuICAgICdyaWdodHdhcmQnOiAtOTBcbiAgfTtcbiAgaWYgKE9iamVjdC5rZXlzKHJvdGF0ZURlZ3JlZXMpLmluZGV4T2Yob3B0aW9ucy5kaXJlY3Rpb24pID09PSAtMSkge1xuICAgIGVycm9yKFwiSW52YWxpZCBkaXJlY3Rpb24gJ1wiLmNvbmNhdChvcHRpb25zLmRpcmVjdGlvbiwgXCInIHNwZWNpZmllZCBmb3IgYnJlYWR0aGZpcnN0IGxheW91dC4gVmFsaWQgdmFsdWVzIGFyZTogXCIpLmNvbmNhdChPYmplY3Qua2V5cyhyb3RhdGVEZWdyZWVzKS5qb2luKCcsICcpKSk7XG4gIH1cbiAgdmFyIGdldFBvc2l0aW9uID0gZnVuY3Rpb24gZ2V0UG9zaXRpb24oZWxlKSB7XG4gICAgcmV0dXJuIHJvdGF0ZVBvc0FuZFNrZXdCeUJveChnZXRQb3NpdGlvblRvcEJvdHRvbShlbGUpLCBiYiwgcm90YXRlRGVncmVlc1tvcHRpb25zLmRpcmVjdGlvbl0pO1xuICB9O1xuICBlbGVzLm5vZGVzKCkubGF5b3V0UG9zaXRpb25zKHRoaXMsIG9wdGlvbnMsIGdldFBvc2l0aW9uKTtcbiAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG59O1xuXG52YXIgZGVmYXVsdHMkNiA9IHtcbiAgZml0OiB0cnVlLFxuICAvLyB3aGV0aGVyIHRvIGZpdCB0aGUgdmlld3BvcnQgdG8gdGhlIGdyYXBoXG4gIHBhZGRpbmc6IDMwLFxuICAvLyB0aGUgcGFkZGluZyBvbiBmaXRcbiAgYm91bmRpbmdCb3g6IHVuZGVmaW5lZCxcbiAgLy8gY29uc3RyYWluIGxheW91dCBib3VuZHM7IHsgeDEsIHkxLCB4MiwgeTIgfSBvciB7IHgxLCB5MSwgdywgaCB9XG4gIGF2b2lkT3ZlcmxhcDogdHJ1ZSxcbiAgLy8gcHJldmVudHMgbm9kZSBvdmVybGFwLCBtYXkgb3ZlcmZsb3cgYm91bmRpbmdCb3ggYW5kIHJhZGl1cyBpZiBub3QgZW5vdWdoIHNwYWNlXG4gIG5vZGVEaW1lbnNpb25zSW5jbHVkZUxhYmVsczogZmFsc2UsXG4gIC8vIEV4Y2x1ZGVzIHRoZSBsYWJlbCB3aGVuIGNhbGN1bGF0aW5nIG5vZGUgYm91bmRpbmcgYm94ZXMgZm9yIHRoZSBsYXlvdXQgYWxnb3JpdGhtXG4gIHNwYWNpbmdGYWN0b3I6IHVuZGVmaW5lZCxcbiAgLy8gQXBwbGllcyBhIG11bHRpcGxpY2F0aXZlIGZhY3RvciAoPjApIHRvIGV4cGFuZCBvciBjb21wcmVzcyB0aGUgb3ZlcmFsbCBhcmVhIHRoYXQgdGhlIG5vZGVzIHRha2UgdXBcbiAgcmFkaXVzOiB1bmRlZmluZWQsXG4gIC8vIHRoZSByYWRpdXMgb2YgdGhlIGNpcmNsZVxuICBzdGFydEFuZ2xlOiAzIC8gMiAqIE1hdGguUEksXG4gIC8vIHdoZXJlIG5vZGVzIHN0YXJ0IGluIHJhZGlhbnNcbiAgc3dlZXA6IHVuZGVmaW5lZCxcbiAgLy8gaG93IG1hbnkgcmFkaWFucyBzaG91bGQgYmUgYmV0d2VlbiB0aGUgZmlyc3QgYW5kIGxhc3Qgbm9kZSAoZGVmYXVsdHMgdG8gZnVsbCBjaXJjbGUpXG4gIGNsb2Nrd2lzZTogdHJ1ZSxcbiAgLy8gd2hldGhlciB0aGUgbGF5b3V0IHNob3VsZCBnbyBjbG9ja3dpc2UgKHRydWUpIG9yIGNvdW50ZXJjbG9ja3dpc2UvYW50aWNsb2Nrd2lzZSAoZmFsc2UpXG4gIHNvcnQ6IHVuZGVmaW5lZCxcbiAgLy8gYSBzb3J0aW5nIGZ1bmN0aW9uIHRvIG9yZGVyIHRoZSBub2RlczsgZS5nLiBmdW5jdGlvbihhLCBiKXsgcmV0dXJuIGEuZGF0YSgnd2VpZ2h0JykgLSBiLmRhdGEoJ3dlaWdodCcpIH1cbiAgYW5pbWF0ZTogZmFsc2UsXG4gIC8vIHdoZXRoZXIgdG8gdHJhbnNpdGlvbiB0aGUgbm9kZSBwb3NpdGlvbnNcbiAgYW5pbWF0aW9uRHVyYXRpb246IDUwMCxcbiAgLy8gZHVyYXRpb24gb2YgYW5pbWF0aW9uIGluIG1zIGlmIGVuYWJsZWRcbiAgYW5pbWF0aW9uRWFzaW5nOiB1bmRlZmluZWQsXG4gIC8vIGVhc2luZyBvZiBhbmltYXRpb24gaWYgZW5hYmxlZFxuICBhbmltYXRlRmlsdGVyOiBmdW5jdGlvbiBhbmltYXRlRmlsdGVyKG5vZGUsIGkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgLy8gYSBmdW5jdGlvbiB0aGF0IGRldGVybWluZXMgd2hldGhlciB0aGUgbm9kZSBzaG91bGQgYmUgYW5pbWF0ZWQuICBBbGwgbm9kZXMgYW5pbWF0ZWQgYnkgZGVmYXVsdCBvbiBhbmltYXRlIGVuYWJsZWQuICBOb24tYW5pbWF0ZWQgbm9kZXMgYXJlIHBvc2l0aW9uZWQgaW1tZWRpYXRlbHkgd2hlbiB0aGUgbGF5b3V0IHN0YXJ0c1xuICByZWFkeTogdW5kZWZpbmVkLFxuICAvLyBjYWxsYmFjayBvbiBsYXlvdXRyZWFkeVxuICBzdG9wOiB1bmRlZmluZWQsXG4gIC8vIGNhbGxiYWNrIG9uIGxheW91dHN0b3BcbiAgdHJhbnNmb3JtOiBmdW5jdGlvbiB0cmFuc2Zvcm0obm9kZSwgcG9zaXRpb24pIHtcbiAgICByZXR1cm4gcG9zaXRpb247XG4gIH0gLy8gdHJhbnNmb3JtIGEgZ2l2ZW4gbm9kZSBwb3NpdGlvbi4gVXNlZnVsIGZvciBjaGFuZ2luZyBmbG93IGRpcmVjdGlvbiBpbiBkaXNjcmV0ZSBsYXlvdXRzIFxufTtcbmZ1bmN0aW9uIENpcmNsZUxheW91dChvcHRpb25zKSB7XG4gIHRoaXMub3B0aW9ucyA9IGV4dGVuZCh7fSwgZGVmYXVsdHMkNiwgb3B0aW9ucyk7XG59XG5DaXJjbGVMYXlvdXQucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHBhcmFtcyA9IHRoaXMub3B0aW9ucztcbiAgdmFyIG9wdGlvbnMgPSBwYXJhbXM7XG4gIHZhciBjeSA9IHBhcmFtcy5jeTtcbiAgdmFyIGVsZXMgPSBvcHRpb25zLmVsZXM7XG4gIHZhciBjbG9ja3dpc2UgPSBvcHRpb25zLmNvdW50ZXJjbG9ja3dpc2UgIT09IHVuZGVmaW5lZCA/ICFvcHRpb25zLmNvdW50ZXJjbG9ja3dpc2UgOiBvcHRpb25zLmNsb2Nrd2lzZTtcbiAgdmFyIG5vZGVzID0gZWxlcy5ub2RlcygpLm5vdCgnOnBhcmVudCcpO1xuICBpZiAob3B0aW9ucy5zb3J0KSB7XG4gICAgbm9kZXMgPSBub2Rlcy5zb3J0KG9wdGlvbnMuc29ydCk7XG4gIH1cbiAgdmFyIGJiID0gbWFrZUJvdW5kaW5nQm94KG9wdGlvbnMuYm91bmRpbmdCb3ggPyBvcHRpb25zLmJvdW5kaW5nQm94IDoge1xuICAgIHgxOiAwLFxuICAgIHkxOiAwLFxuICAgIHc6IGN5LndpZHRoKCksXG4gICAgaDogY3kuaGVpZ2h0KClcbiAgfSk7XG4gIHZhciBjZW50ZXIgPSB7XG4gICAgeDogYmIueDEgKyBiYi53IC8gMixcbiAgICB5OiBiYi55MSArIGJiLmggLyAyXG4gIH07XG4gIHZhciBzd2VlcCA9IG9wdGlvbnMuc3dlZXAgPT09IHVuZGVmaW5lZCA/IDIgKiBNYXRoLlBJIC0gMiAqIE1hdGguUEkgLyBub2Rlcy5sZW5ndGggOiBvcHRpb25zLnN3ZWVwO1xuICB2YXIgZFRoZXRhID0gc3dlZXAgLyBNYXRoLm1heCgxLCBub2Rlcy5sZW5ndGggLSAxKTtcbiAgdmFyIHI7XG4gIHZhciBtaW5EaXN0YW5jZSA9IDA7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbiA9IG5vZGVzW2ldO1xuICAgIHZhciBuYmIgPSBuLmxheW91dERpbWVuc2lvbnMob3B0aW9ucyk7XG4gICAgdmFyIHcgPSBuYmIudztcbiAgICB2YXIgaCA9IG5iYi5oO1xuICAgIG1pbkRpc3RhbmNlID0gTWF0aC5tYXgobWluRGlzdGFuY2UsIHcsIGgpO1xuICB9XG4gIGlmIChudW1iZXIkMShvcHRpb25zLnJhZGl1cykpIHtcbiAgICByID0gb3B0aW9ucy5yYWRpdXM7XG4gIH0gZWxzZSBpZiAobm9kZXMubGVuZ3RoIDw9IDEpIHtcbiAgICByID0gMDtcbiAgfSBlbHNlIHtcbiAgICByID0gTWF0aC5taW4oYmIuaCwgYmIudykgLyAyIC0gbWluRGlzdGFuY2U7XG4gIH1cblxuICAvLyBjYWxjdWxhdGUgdGhlIHJhZGl1c1xuICBpZiAobm9kZXMubGVuZ3RoID4gMSAmJiBvcHRpb25zLmF2b2lkT3ZlcmxhcCkge1xuICAgIC8vIGJ1dCBvbmx5IGlmIG1vcmUgdGhhbiBvbmUgbm9kZSAoY2FuJ3Qgb3ZlcmxhcClcbiAgICBtaW5EaXN0YW5jZSAqPSAxLjc1OyAvLyBqdXN0IHRvIGhhdmUgc29tZSBuaWNlIHNwYWNpbmdcblxuICAgIHZhciBkY29zID0gTWF0aC5jb3MoZFRoZXRhKSAtIE1hdGguY29zKDApO1xuICAgIHZhciBkc2luID0gTWF0aC5zaW4oZFRoZXRhKSAtIE1hdGguc2luKDApO1xuICAgIHZhciByTWluID0gTWF0aC5zcXJ0KG1pbkRpc3RhbmNlICogbWluRGlzdGFuY2UgLyAoZGNvcyAqIGRjb3MgKyBkc2luICogZHNpbikpOyAvLyBzLnQuIG5vIG5vZGVzIG92ZXJsYXBwaW5nXG4gICAgciA9IE1hdGgubWF4KHJNaW4sIHIpO1xuICB9XG4gIHZhciBnZXRQb3MgPSBmdW5jdGlvbiBnZXRQb3MoZWxlLCBpKSB7XG4gICAgdmFyIHRoZXRhID0gb3B0aW9ucy5zdGFydEFuZ2xlICsgaSAqIGRUaGV0YSAqIChjbG9ja3dpc2UgPyAxIDogLTEpO1xuICAgIHZhciByeCA9IHIgKiBNYXRoLmNvcyh0aGV0YSk7XG4gICAgdmFyIHJ5ID0gciAqIE1hdGguc2luKHRoZXRhKTtcbiAgICB2YXIgcG9zID0ge1xuICAgICAgeDogY2VudGVyLnggKyByeCxcbiAgICAgIHk6IGNlbnRlci55ICsgcnlcbiAgICB9O1xuICAgIHJldHVybiBwb3M7XG4gIH07XG4gIGVsZXMubm9kZXMoKS5sYXlvdXRQb3NpdGlvbnModGhpcywgb3B0aW9ucywgZ2V0UG9zKTtcbiAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG59O1xuXG52YXIgZGVmYXVsdHMkNSA9IHtcbiAgZml0OiB0cnVlLFxuICAvLyB3aGV0aGVyIHRvIGZpdCB0aGUgdmlld3BvcnQgdG8gdGhlIGdyYXBoXG4gIHBhZGRpbmc6IDMwLFxuICAvLyB0aGUgcGFkZGluZyBvbiBmaXRcbiAgc3RhcnRBbmdsZTogMyAvIDIgKiBNYXRoLlBJLFxuICAvLyB3aGVyZSBub2RlcyBzdGFydCBpbiByYWRpYW5zXG4gIHN3ZWVwOiB1bmRlZmluZWQsXG4gIC8vIGhvdyBtYW55IHJhZGlhbnMgc2hvdWxkIGJlIGJldHdlZW4gdGhlIGZpcnN0IGFuZCBsYXN0IG5vZGUgKGRlZmF1bHRzIHRvIGZ1bGwgY2lyY2xlKVxuICBjbG9ja3dpc2U6IHRydWUsXG4gIC8vIHdoZXRoZXIgdGhlIGxheW91dCBzaG91bGQgZ28gY2xvY2t3aXNlICh0cnVlKSBvciBjb3VudGVyY2xvY2t3aXNlL2FudGljbG9ja3dpc2UgKGZhbHNlKVxuICBlcXVpZGlzdGFudDogZmFsc2UsXG4gIC8vIHdoZXRoZXIgbGV2ZWxzIGhhdmUgYW4gZXF1YWwgcmFkaWFsIGRpc3RhbmNlIGJldHdlbiB0aGVtLCBtYXkgY2F1c2UgYm91bmRpbmcgYm94IG92ZXJmbG93XG4gIG1pbk5vZGVTcGFjaW5nOiAxMCxcbiAgLy8gbWluIHNwYWNpbmcgYmV0d2VlbiBvdXRzaWRlIG9mIG5vZGVzICh1c2VkIGZvciByYWRpdXMgYWRqdXN0bWVudClcbiAgYm91bmRpbmdCb3g6IHVuZGVmaW5lZCxcbiAgLy8gY29uc3RyYWluIGxheW91dCBib3VuZHM7IHsgeDEsIHkxLCB4MiwgeTIgfSBvciB7IHgxLCB5MSwgdywgaCB9XG4gIGF2b2lkT3ZlcmxhcDogdHJ1ZSxcbiAgLy8gcHJldmVudHMgbm9kZSBvdmVybGFwLCBtYXkgb3ZlcmZsb3cgYm91bmRpbmdCb3ggaWYgbm90IGVub3VnaCBzcGFjZVxuICBub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHM6IGZhbHNlLFxuICAvLyBFeGNsdWRlcyB0aGUgbGFiZWwgd2hlbiBjYWxjdWxhdGluZyBub2RlIGJvdW5kaW5nIGJveGVzIGZvciB0aGUgbGF5b3V0IGFsZ29yaXRobVxuICBoZWlnaHQ6IHVuZGVmaW5lZCxcbiAgLy8gaGVpZ2h0IG9mIGxheW91dCBhcmVhIChvdmVycmlkZXMgY29udGFpbmVyIGhlaWdodClcbiAgd2lkdGg6IHVuZGVmaW5lZCxcbiAgLy8gd2lkdGggb2YgbGF5b3V0IGFyZWEgKG92ZXJyaWRlcyBjb250YWluZXIgd2lkdGgpXG4gIHNwYWNpbmdGYWN0b3I6IHVuZGVmaW5lZCxcbiAgLy8gQXBwbGllcyBhIG11bHRpcGxpY2F0aXZlIGZhY3RvciAoPjApIHRvIGV4cGFuZCBvciBjb21wcmVzcyB0aGUgb3ZlcmFsbCBhcmVhIHRoYXQgdGhlIG5vZGVzIHRha2UgdXBcbiAgY29uY2VudHJpYzogZnVuY3Rpb24gY29uY2VudHJpYyhub2RlKSB7XG4gICAgLy8gcmV0dXJucyBudW1lcmljIHZhbHVlIGZvciBlYWNoIG5vZGUsIHBsYWNpbmcgaGlnaGVyIG5vZGVzIGluIGxldmVscyB0b3dhcmRzIHRoZSBjZW50cmVcbiAgICByZXR1cm4gbm9kZS5kZWdyZWUoKTtcbiAgfSxcbiAgbGV2ZWxXaWR0aDogZnVuY3Rpb24gbGV2ZWxXaWR0aChub2Rlcykge1xuICAgIC8vIHRoZSB2YXJpYXRpb24gb2YgY29uY2VudHJpYyB2YWx1ZXMgaW4gZWFjaCBsZXZlbFxuICAgIHJldHVybiBub2Rlcy5tYXhEZWdyZWUoKSAvIDQ7XG4gIH0sXG4gIGFuaW1hdGU6IGZhbHNlLFxuICAvLyB3aGV0aGVyIHRvIHRyYW5zaXRpb24gdGhlIG5vZGUgcG9zaXRpb25zXG4gIGFuaW1hdGlvbkR1cmF0aW9uOiA1MDAsXG4gIC8vIGR1cmF0aW9uIG9mIGFuaW1hdGlvbiBpbiBtcyBpZiBlbmFibGVkXG4gIGFuaW1hdGlvbkVhc2luZzogdW5kZWZpbmVkLFxuICAvLyBlYXNpbmcgb2YgYW5pbWF0aW9uIGlmIGVuYWJsZWRcbiAgYW5pbWF0ZUZpbHRlcjogZnVuY3Rpb24gYW5pbWF0ZUZpbHRlcihub2RlLCBpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIC8vIGEgZnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIG5vZGUgc2hvdWxkIGJlIGFuaW1hdGVkLiAgQWxsIG5vZGVzIGFuaW1hdGVkIGJ5IGRlZmF1bHQgb24gYW5pbWF0ZSBlbmFibGVkLiAgTm9uLWFuaW1hdGVkIG5vZGVzIGFyZSBwb3NpdGlvbmVkIGltbWVkaWF0ZWx5IHdoZW4gdGhlIGxheW91dCBzdGFydHNcbiAgcmVhZHk6IHVuZGVmaW5lZCxcbiAgLy8gY2FsbGJhY2sgb24gbGF5b3V0cmVhZHlcbiAgc3RvcDogdW5kZWZpbmVkLFxuICAvLyBjYWxsYmFjayBvbiBsYXlvdXRzdG9wXG4gIHRyYW5zZm9ybTogZnVuY3Rpb24gdHJhbnNmb3JtKG5vZGUsIHBvc2l0aW9uKSB7XG4gICAgcmV0dXJuIHBvc2l0aW9uO1xuICB9IC8vIHRyYW5zZm9ybSBhIGdpdmVuIG5vZGUgcG9zaXRpb24uIFVzZWZ1bCBmb3IgY2hhbmdpbmcgZmxvdyBkaXJlY3Rpb24gaW4gZGlzY3JldGUgbGF5b3V0c1xufTtcbmZ1bmN0aW9uIENvbmNlbnRyaWNMYXlvdXQob3B0aW9ucykge1xuICB0aGlzLm9wdGlvbnMgPSBleHRlbmQoe30sIGRlZmF1bHRzJDUsIG9wdGlvbnMpO1xufVxuQ29uY2VudHJpY0xheW91dC5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICB2YXIgcGFyYW1zID0gdGhpcy5vcHRpb25zO1xuICB2YXIgb3B0aW9ucyA9IHBhcmFtcztcbiAgdmFyIGNsb2Nrd2lzZSA9IG9wdGlvbnMuY291bnRlcmNsb2Nrd2lzZSAhPT0gdW5kZWZpbmVkID8gIW9wdGlvbnMuY291bnRlcmNsb2Nrd2lzZSA6IG9wdGlvbnMuY2xvY2t3aXNlO1xuICB2YXIgY3kgPSBwYXJhbXMuY3k7XG4gIHZhciBlbGVzID0gb3B0aW9ucy5lbGVzO1xuICB2YXIgbm9kZXMgPSBlbGVzLm5vZGVzKCkubm90KCc6cGFyZW50Jyk7XG4gIHZhciBiYiA9IG1ha2VCb3VuZGluZ0JveChvcHRpb25zLmJvdW5kaW5nQm94ID8gb3B0aW9ucy5ib3VuZGluZ0JveCA6IHtcbiAgICB4MTogMCxcbiAgICB5MTogMCxcbiAgICB3OiBjeS53aWR0aCgpLFxuICAgIGg6IGN5LmhlaWdodCgpXG4gIH0pO1xuICB2YXIgY2VudGVyID0ge1xuICAgIHg6IGJiLngxICsgYmIudyAvIDIsXG4gICAgeTogYmIueTEgKyBiYi5oIC8gMlxuICB9O1xuICB2YXIgbm9kZVZhbHVlcyA9IFtdOyAvLyB7IG5vZGUsIHZhbHVlIH1cbiAgdmFyIG1heE5vZGVTaXplID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBub2RlID0gbm9kZXNbaV07XG4gICAgdmFyIHZhbHVlID0gdm9pZCAwO1xuXG4gICAgLy8gY2FsY3VsYXRlIHRoZSBub2RlIHZhbHVlXG4gICAgdmFsdWUgPSBvcHRpb25zLmNvbmNlbnRyaWMobm9kZSk7XG4gICAgbm9kZVZhbHVlcy5wdXNoKHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIG5vZGU6IG5vZGVcbiAgICB9KTtcblxuICAgIC8vIGZvciBzdHlsZSBtYXBwaW5nXG4gICAgbm9kZS5fcHJpdmF0ZS5zY3JhdGNoLmNvbmNlbnRyaWMgPSB2YWx1ZTtcbiAgfVxuXG4gIC8vIGluIGNhc2Ugd2UgdXNlZCB0aGUgYGNvbmNlbnRyaWNgIGluIHN0eWxlXG4gIG5vZGVzLnVwZGF0ZVN0eWxlKCk7XG5cbiAgLy8gY2FsY3VsYXRlIG1heCBzaXplIG5vdyBiYXNlZCBvbiBwb3RlbnRpYWxseSB1cGRhdGVkIG1hcHBlcnNcbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IG5vZGVzLmxlbmd0aDsgX2krKykge1xuICAgIHZhciBfbm9kZSA9IG5vZGVzW19pXTtcbiAgICB2YXIgbmJiID0gX25vZGUubGF5b3V0RGltZW5zaW9ucyhvcHRpb25zKTtcbiAgICBtYXhOb2RlU2l6ZSA9IE1hdGgubWF4KG1heE5vZGVTaXplLCBuYmIudywgbmJiLmgpO1xuICB9XG5cbiAgLy8gc29ydCBub2RlIHZhbHVlcyBpbiBkZXNjcmVhc2luZyBvcmRlclxuICBub2RlVmFsdWVzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gYi52YWx1ZSAtIGEudmFsdWU7XG4gIH0pO1xuICB2YXIgbGV2ZWxXaWR0aCA9IG9wdGlvbnMubGV2ZWxXaWR0aChub2Rlcyk7XG5cbiAgLy8gcHV0IHRoZSB2YWx1ZXMgaW50byBsZXZlbHNcbiAgdmFyIGxldmVscyA9IFtbXV07XG4gIHZhciBjdXJyZW50TGV2ZWwgPSBsZXZlbHNbMF07XG4gIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IG5vZGVWYWx1ZXMubGVuZ3RoOyBfaTIrKykge1xuICAgIHZhciB2YWwgPSBub2RlVmFsdWVzW19pMl07XG4gICAgaWYgKGN1cnJlbnRMZXZlbC5sZW5ndGggPiAwKSB7XG4gICAgICB2YXIgZGlmZiA9IE1hdGguYWJzKGN1cnJlbnRMZXZlbFswXS52YWx1ZSAtIHZhbC52YWx1ZSk7XG4gICAgICBpZiAoZGlmZiA+PSBsZXZlbFdpZHRoKSB7XG4gICAgICAgIGN1cnJlbnRMZXZlbCA9IFtdO1xuICAgICAgICBsZXZlbHMucHVzaChjdXJyZW50TGV2ZWwpO1xuICAgICAgfVxuICAgIH1cbiAgICBjdXJyZW50TGV2ZWwucHVzaCh2YWwpO1xuICB9XG5cbiAgLy8gY3JlYXRlIHBvc2l0aW9ucyBmcm9tIGxldmVsc1xuXG4gIHZhciBtaW5EaXN0ID0gbWF4Tm9kZVNpemUgKyBvcHRpb25zLm1pbk5vZGVTcGFjaW5nOyAvLyBtaW4gZGlzdCBiZXR3ZWVuIG5vZGVzXG5cbiAgaWYgKCFvcHRpb25zLmF2b2lkT3ZlcmxhcCkge1xuICAgIC8vIHRoZW4gc3RyaWN0bHkgY29uc3RyYWluIHRvIGJiXG4gICAgdmFyIGZpcnN0THZsSGFzTXVsdGkgPSBsZXZlbHMubGVuZ3RoID4gMCAmJiBsZXZlbHNbMF0ubGVuZ3RoID4gMTtcbiAgICB2YXIgbWF4UiA9IE1hdGgubWluKGJiLncsIGJiLmgpIC8gMiAtIG1pbkRpc3Q7XG4gICAgdmFyIHJTdGVwID0gbWF4UiAvIChsZXZlbHMubGVuZ3RoICsgZmlyc3RMdmxIYXNNdWx0aSA/IDEgOiAwKTtcbiAgICBtaW5EaXN0ID0gTWF0aC5taW4obWluRGlzdCwgclN0ZXApO1xuICB9XG5cbiAgLy8gZmluZCB0aGUgbWV0cmljcyBmb3IgZWFjaCBsZXZlbFxuICB2YXIgciA9IDA7XG4gIGZvciAodmFyIF9pMyA9IDA7IF9pMyA8IGxldmVscy5sZW5ndGg7IF9pMysrKSB7XG4gICAgdmFyIGxldmVsID0gbGV2ZWxzW19pM107XG4gICAgdmFyIHN3ZWVwID0gb3B0aW9ucy5zd2VlcCA9PT0gdW5kZWZpbmVkID8gMiAqIE1hdGguUEkgLSAyICogTWF0aC5QSSAvIGxldmVsLmxlbmd0aCA6IG9wdGlvbnMuc3dlZXA7XG4gICAgdmFyIGRUaGV0YSA9IGxldmVsLmRUaGV0YSA9IHN3ZWVwIC8gTWF0aC5tYXgoMSwgbGV2ZWwubGVuZ3RoIC0gMSk7XG5cbiAgICAvLyBjYWxjdWxhdGUgdGhlIHJhZGl1c1xuICAgIGlmIChsZXZlbC5sZW5ndGggPiAxICYmIG9wdGlvbnMuYXZvaWRPdmVybGFwKSB7XG4gICAgICAvLyBidXQgb25seSBpZiBtb3JlIHRoYW4gb25lIG5vZGUgKGNhbid0IG92ZXJsYXApXG4gICAgICB2YXIgZGNvcyA9IE1hdGguY29zKGRUaGV0YSkgLSBNYXRoLmNvcygwKTtcbiAgICAgIHZhciBkc2luID0gTWF0aC5zaW4oZFRoZXRhKSAtIE1hdGguc2luKDApO1xuICAgICAgdmFyIHJNaW4gPSBNYXRoLnNxcnQobWluRGlzdCAqIG1pbkRpc3QgLyAoZGNvcyAqIGRjb3MgKyBkc2luICogZHNpbikpOyAvLyBzLnQuIG5vIG5vZGVzIG92ZXJsYXBwaW5nXG5cbiAgICAgIHIgPSBNYXRoLm1heChyTWluLCByKTtcbiAgICB9XG4gICAgbGV2ZWwuciA9IHI7XG4gICAgciArPSBtaW5EaXN0O1xuICB9XG4gIGlmIChvcHRpb25zLmVxdWlkaXN0YW50KSB7XG4gICAgdmFyIHJEZWx0YU1heCA9IDA7XG4gICAgdmFyIF9yID0gMDtcbiAgICBmb3IgKHZhciBfaTQgPSAwOyBfaTQgPCBsZXZlbHMubGVuZ3RoOyBfaTQrKykge1xuICAgICAgdmFyIF9sZXZlbCA9IGxldmVsc1tfaTRdO1xuICAgICAgdmFyIHJEZWx0YSA9IF9sZXZlbC5yIC0gX3I7XG4gICAgICByRGVsdGFNYXggPSBNYXRoLm1heChyRGVsdGFNYXgsIHJEZWx0YSk7XG4gICAgfVxuICAgIF9yID0gMDtcbiAgICBmb3IgKHZhciBfaTUgPSAwOyBfaTUgPCBsZXZlbHMubGVuZ3RoOyBfaTUrKykge1xuICAgICAgdmFyIF9sZXZlbDIgPSBsZXZlbHNbX2k1XTtcbiAgICAgIGlmIChfaTUgPT09IDApIHtcbiAgICAgICAgX3IgPSBfbGV2ZWwyLnI7XG4gICAgICB9XG4gICAgICBfbGV2ZWwyLnIgPSBfcjtcbiAgICAgIF9yICs9IHJEZWx0YU1heDtcbiAgICB9XG4gIH1cblxuICAvLyBjYWxjdWxhdGUgdGhlIG5vZGUgcG9zaXRpb25zXG4gIHZhciBwb3MgPSB7fTsgLy8gaWQgPT4gcG9zaXRpb25cbiAgZm9yICh2YXIgX2k2ID0gMDsgX2k2IDwgbGV2ZWxzLmxlbmd0aDsgX2k2KyspIHtcbiAgICB2YXIgX2xldmVsMyA9IGxldmVsc1tfaTZdO1xuICAgIHZhciBfZFRoZXRhID0gX2xldmVsMy5kVGhldGE7XG4gICAgdmFyIF9yMiA9IF9sZXZlbDMucjtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IF9sZXZlbDMubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBfdmFsID0gX2xldmVsM1tqXTtcbiAgICAgIHZhciB0aGV0YSA9IG9wdGlvbnMuc3RhcnRBbmdsZSArIChjbG9ja3dpc2UgPyAxIDogLTEpICogX2RUaGV0YSAqIGo7XG4gICAgICB2YXIgcCA9IHtcbiAgICAgICAgeDogY2VudGVyLnggKyBfcjIgKiBNYXRoLmNvcyh0aGV0YSksXG4gICAgICAgIHk6IGNlbnRlci55ICsgX3IyICogTWF0aC5zaW4odGhldGEpXG4gICAgICB9O1xuICAgICAgcG9zW192YWwubm9kZS5pZCgpXSA9IHA7XG4gICAgfVxuICB9XG5cbiAgLy8gcG9zaXRpb24gdGhlIG5vZGVzXG4gIGVsZXMubm9kZXMoKS5sYXlvdXRQb3NpdGlvbnModGhpcywgb3B0aW9ucywgZnVuY3Rpb24gKGVsZSkge1xuICAgIHZhciBpZCA9IGVsZS5pZCgpO1xuICAgIHJldHVybiBwb3NbaWRdO1xuICB9KTtcbiAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG59O1xuXG4vKlxuVGhlIENvU0UgbGF5b3V0IHdhcyB3cml0dGVuIGJ5IEdlcmFyZG8gSHVjay5cbmh0dHBzOi8vd3d3LmxpbmtlZGluLmNvbS9pbi9nZXJhcmRvaHVjay9cblxuQmFzZWQgb24gdGhlIGZvbGxvd2luZyBhcnRpY2xlOlxuaHR0cDovL2RsLmFjbS5vcmcvY2l0YXRpb24uY2ZtP2lkPTE0OTgwNDdcblxuTW9kaWZpY2F0aW9ucyB0cmFja2VkIG9uIEdpdGh1Yi5cbiovXG5cbnZhciBERUJVRztcblxuLyoqXG4gKiBAYnJpZWYgOiAgZGVmYXVsdCBsYXlvdXQgb3B0aW9uc1xuICovXG52YXIgZGVmYXVsdHMkNCA9IHtcbiAgLy8gQ2FsbGVkIG9uIGBsYXlvdXRyZWFkeWBcbiAgcmVhZHk6IGZ1bmN0aW9uIHJlYWR5KCkge30sXG4gIC8vIENhbGxlZCBvbiBgbGF5b3V0c3RvcGBcbiAgc3RvcDogZnVuY3Rpb24gc3RvcCgpIHt9LFxuICAvLyBXaGV0aGVyIHRvIGFuaW1hdGUgd2hpbGUgcnVubmluZyB0aGUgbGF5b3V0XG4gIC8vIHRydWUgOiBBbmltYXRlIGNvbnRpbnVvdXNseSBhcyB0aGUgbGF5b3V0IGlzIHJ1bm5pbmdcbiAgLy8gZmFsc2UgOiBKdXN0IHNob3cgdGhlIGVuZCByZXN1bHRcbiAgLy8gJ2VuZCcgOiBBbmltYXRlIHdpdGggdGhlIGVuZCByZXN1bHQsIGZyb20gdGhlIGluaXRpYWwgcG9zaXRpb25zIHRvIHRoZSBlbmQgcG9zaXRpb25zXG4gIGFuaW1hdGU6IHRydWUsXG4gIC8vIEVhc2luZyBvZiB0aGUgYW5pbWF0aW9uIGZvciBhbmltYXRlOidlbmQnXG4gIGFuaW1hdGlvbkVhc2luZzogdW5kZWZpbmVkLFxuICAvLyBUaGUgZHVyYXRpb24gb2YgdGhlIGFuaW1hdGlvbiBmb3IgYW5pbWF0ZTonZW5kJ1xuICBhbmltYXRpb25EdXJhdGlvbjogdW5kZWZpbmVkLFxuICAvLyBBIGZ1bmN0aW9uIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBub2RlIHNob3VsZCBiZSBhbmltYXRlZFxuICAvLyBBbGwgbm9kZXMgYW5pbWF0ZWQgYnkgZGVmYXVsdCBvbiBhbmltYXRlIGVuYWJsZWRcbiAgLy8gTm9uLWFuaW1hdGVkIG5vZGVzIGFyZSBwb3NpdGlvbmVkIGltbWVkaWF0ZWx5IHdoZW4gdGhlIGxheW91dCBzdGFydHNcbiAgYW5pbWF0ZUZpbHRlcjogZnVuY3Rpb24gYW5pbWF0ZUZpbHRlcihub2RlLCBpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIC8vIFRoZSBsYXlvdXQgYW5pbWF0ZXMgb25seSBhZnRlciB0aGlzIG1hbnkgbWlsbGlzZWNvbmRzIGZvciBhbmltYXRlOnRydWVcbiAgLy8gKHByZXZlbnRzIGZsYXNoaW5nIG9uIGZhc3QgcnVucylcbiAgYW5pbWF0aW9uVGhyZXNob2xkOiAyNTAsXG4gIC8vIE51bWJlciBvZiBpdGVyYXRpb25zIGJldHdlZW4gY29uc2VjdXRpdmUgc2NyZWVuIHBvc2l0aW9ucyB1cGRhdGVcbiAgcmVmcmVzaDogMjAsXG4gIC8vIFdoZXRoZXIgdG8gZml0IHRoZSBuZXR3b3JrIHZpZXcgYWZ0ZXIgd2hlbiBkb25lXG4gIGZpdDogdHJ1ZSxcbiAgLy8gUGFkZGluZyBvbiBmaXRcbiAgcGFkZGluZzogMzAsXG4gIC8vIENvbnN0cmFpbiBsYXlvdXQgYm91bmRzOyB7IHgxLCB5MSwgeDIsIHkyIH0gb3IgeyB4MSwgeTEsIHcsIGggfVxuICBib3VuZGluZ0JveDogdW5kZWZpbmVkLFxuICAvLyBFeGNsdWRlcyB0aGUgbGFiZWwgd2hlbiBjYWxjdWxhdGluZyBub2RlIGJvdW5kaW5nIGJveGVzIGZvciB0aGUgbGF5b3V0IGFsZ29yaXRobVxuICBub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHM6IGZhbHNlLFxuICAvLyBSYW5kb21pemUgdGhlIGluaXRpYWwgcG9zaXRpb25zIG9mIHRoZSBub2RlcyAodHJ1ZSkgb3IgdXNlIGV4aXN0aW5nIHBvc2l0aW9ucyAoZmFsc2UpXG4gIHJhbmRvbWl6ZTogZmFsc2UsXG4gIC8vIEV4dHJhIHNwYWNpbmcgYmV0d2VlbiBjb21wb25lbnRzIGluIG5vbi1jb21wb3VuZCBncmFwaHNcbiAgY29tcG9uZW50U3BhY2luZzogNDAsXG4gIC8vIE5vZGUgcmVwdWxzaW9uIChub24gb3ZlcmxhcHBpbmcpIG11bHRpcGxpZXJcbiAgbm9kZVJlcHVsc2lvbjogZnVuY3Rpb24gbm9kZVJlcHVsc2lvbihub2RlKSB7XG4gICAgcmV0dXJuIDIwNDg7XG4gIH0sXG4gIC8vIE5vZGUgcmVwdWxzaW9uIChvdmVybGFwcGluZykgbXVsdGlwbGllclxuICBub2RlT3ZlcmxhcDogNCxcbiAgLy8gSWRlYWwgZWRnZSAobm9uIG5lc3RlZCkgbGVuZ3RoXG4gIGlkZWFsRWRnZUxlbmd0aDogZnVuY3Rpb24gaWRlYWxFZGdlTGVuZ3RoKGVkZ2UpIHtcbiAgICByZXR1cm4gMzI7XG4gIH0sXG4gIC8vIERpdmlzb3IgdG8gY29tcHV0ZSBlZGdlIGZvcmNlc1xuICBlZGdlRWxhc3RpY2l0eTogZnVuY3Rpb24gZWRnZUVsYXN0aWNpdHkoZWRnZSkge1xuICAgIHJldHVybiAzMjtcbiAgfSxcbiAgLy8gTmVzdGluZyBmYWN0b3IgKG11bHRpcGxpZXIpIHRvIGNvbXB1dGUgaWRlYWwgZWRnZSBsZW5ndGggZm9yIG5lc3RlZCBlZGdlc1xuICBuZXN0aW5nRmFjdG9yOiAxLjIsXG4gIC8vIEdyYXZpdHkgZm9yY2UgKGNvbnN0YW50KVxuICBncmF2aXR5OiAxLFxuICAvLyBNYXhpbXVtIG51bWJlciBvZiBpdGVyYXRpb25zIHRvIHBlcmZvcm1cbiAgbnVtSXRlcjogMTAwMCxcbiAgLy8gSW5pdGlhbCB0ZW1wZXJhdHVyZSAobWF4aW11bSBub2RlIGRpc3BsYWNlbWVudClcbiAgaW5pdGlhbFRlbXA6IDEwMDAsXG4gIC8vIENvb2xpbmcgZmFjdG9yIChob3cgdGhlIHRlbXBlcmF0dXJlIGlzIHJlZHVjZWQgYmV0d2VlbiBjb25zZWN1dGl2ZSBpdGVyYXRpb25zXG4gIGNvb2xpbmdGYWN0b3I6IDAuOTksXG4gIC8vIExvd2VyIHRlbXBlcmF0dXJlIHRocmVzaG9sZCAoYmVsb3cgdGhpcyBwb2ludCB0aGUgbGF5b3V0IHdpbGwgZW5kKVxuICBtaW5UZW1wOiAxLjBcbn07XG5cbi8qKlxuICogQGJyaWVmICAgICAgIDogY29uc3RydWN0b3JcbiAqIEBhcmcgb3B0aW9ucyA6IG9iamVjdCBjb250YWluaW5nIGxheW91dCBvcHRpb25zXG4gKi9cbmZ1bmN0aW9uIENvc2VMYXlvdXQob3B0aW9ucykge1xuICB0aGlzLm9wdGlvbnMgPSBleHRlbmQoe30sIGRlZmF1bHRzJDQsIG9wdGlvbnMpO1xuICB0aGlzLm9wdGlvbnMubGF5b3V0ID0gdGhpcztcblxuICAvLyBFeGNsdWRlIGFueSBlZGdlIHRoYXQgaGFzIGEgc291cmNlIG9yIHRhcmdldCBub2RlIHRoYXQgaXMgbm90IGluIHRoZSBzZXQgb2YgcGFzc2VkLWluIG5vZGVzXG4gIHZhciBub2RlcyA9IHRoaXMub3B0aW9ucy5lbGVzLm5vZGVzKCk7XG4gIHZhciBlZGdlcyA9IHRoaXMub3B0aW9ucy5lbGVzLmVkZ2VzKCk7XG4gIHZhciBub3RFZGdlcyA9IGVkZ2VzLmZpbHRlcihmdW5jdGlvbiAoZSkge1xuICAgIHZhciBzb3VyY2VJZCA9IGUuc291cmNlKCkuZGF0YSgnaWQnKTtcbiAgICB2YXIgdGFyZ2V0SWQgPSBlLnRhcmdldCgpLmRhdGEoJ2lkJyk7XG4gICAgdmFyIGhhc1NvdXJjZSA9IG5vZGVzLnNvbWUoZnVuY3Rpb24gKG4pIHtcbiAgICAgIHJldHVybiBuLmRhdGEoJ2lkJykgPT09IHNvdXJjZUlkO1xuICAgIH0pO1xuICAgIHZhciBoYXNUYXJnZXQgPSBub2Rlcy5zb21lKGZ1bmN0aW9uIChuKSB7XG4gICAgICByZXR1cm4gbi5kYXRhKCdpZCcpID09PSB0YXJnZXRJZDtcbiAgICB9KTtcbiAgICByZXR1cm4gIWhhc1NvdXJjZSB8fCAhaGFzVGFyZ2V0O1xuICB9KTtcbiAgdGhpcy5vcHRpb25zLmVsZXMgPSB0aGlzLm9wdGlvbnMuZWxlcy5ub3Qobm90RWRnZXMpO1xufVxuXG4vKipcbiAqIEBicmllZiA6IHJ1bnMgdGhlIGxheW91dFxuICovXG5Db3NlTGF5b3V0LnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICB2YXIgY3kgPSBvcHRpb25zLmN5O1xuICB2YXIgbGF5b3V0ID0gdGhpcztcbiAgbGF5b3V0LnN0b3BwZWQgPSBmYWxzZTtcbiAgaWYgKG9wdGlvbnMuYW5pbWF0ZSA9PT0gdHJ1ZSB8fCBvcHRpb25zLmFuaW1hdGUgPT09IGZhbHNlKSB7XG4gICAgbGF5b3V0LmVtaXQoe1xuICAgICAgdHlwZTogJ2xheW91dHN0YXJ0JyxcbiAgICAgIGxheW91dDogbGF5b3V0XG4gICAgfSk7XG4gIH1cblxuICAvLyBTZXQgREVCVUcgLSBHbG9iYWwgdmFyaWFibGVcbiAgaWYgKHRydWUgPT09IG9wdGlvbnMuZGVidWcpIHtcbiAgICBERUJVRyA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgREVCVUcgPSBmYWxzZTtcbiAgfVxuXG4gIC8vIEluaXRpYWxpemUgbGF5b3V0IGluZm9cbiAgdmFyIGxheW91dEluZm8gPSBjcmVhdGVMYXlvdXRJbmZvKGN5LCBsYXlvdXQsIG9wdGlvbnMpO1xuXG4gIC8vIFNob3cgTGF5b3V0SW5mbyBjb250ZW50cyBpZiBkZWJ1Z2dpbmdcbiAgaWYgKERFQlVHKSB7XG4gICAgcHJpbnRMYXlvdXRJbmZvKGxheW91dEluZm8pO1xuICB9XG5cbiAgLy8gSWYgcmVxdWlyZWQsIHJhbmRvbWl6ZSBub2RlIHBvc2l0aW9uc1xuICBpZiAob3B0aW9ucy5yYW5kb21pemUpIHtcbiAgICByYW5kb21pemVQb3NpdGlvbnMobGF5b3V0SW5mbyk7XG4gIH1cbiAgdmFyIHN0YXJ0VGltZSA9IHBlcmZvcm1hbmNlTm93KCk7XG4gIHZhciByZWZyZXNoID0gZnVuY3Rpb24gcmVmcmVzaCgpIHtcbiAgICByZWZyZXNoUG9zaXRpb25zKGxheW91dEluZm8sIGN5LCBvcHRpb25zKTtcblxuICAgIC8vIEZpdCB0aGUgZ3JhcGggaWYgbmVjZXNzYXJ5XG4gICAgaWYgKHRydWUgPT09IG9wdGlvbnMuZml0KSB7XG4gICAgICBjeS5maXQob3B0aW9ucy5wYWRkaW5nKTtcbiAgICB9XG4gIH07XG4gIHZhciBtYWluTG9vcCA9IGZ1bmN0aW9uIG1haW5Mb29wKGkpIHtcbiAgICBpZiAobGF5b3V0LnN0b3BwZWQgfHwgaSA+PSBvcHRpb25zLm51bUl0ZXIpIHtcbiAgICAgIC8vIGxvZ0RlYnVnKFwiTGF5b3V0IG1hbnVhbGx5IHN0b3BwZWQuIFN0b3BwaW5nIGNvbXB1dGF0aW9uIGluIHN0ZXAgXCIgKyBpKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBEbyBvbmUgc3RlcCBpbiB0aGUgcGhpc2ljYWwgc2ltdWxhdGlvblxuICAgIHN0ZXAobGF5b3V0SW5mbywgb3B0aW9ucyk7XG5cbiAgICAvLyBVcGRhdGUgdGVtcGVyYXR1cmVcbiAgICBsYXlvdXRJbmZvLnRlbXBlcmF0dXJlID0gbGF5b3V0SW5mby50ZW1wZXJhdHVyZSAqIG9wdGlvbnMuY29vbGluZ0ZhY3RvcjtcbiAgICAvLyBsb2dEZWJ1ZyhcIk5ldyB0ZW1wZXJhdHVyZTogXCIgKyBsYXlvdXRJbmZvLnRlbXBlcmF0dXJlKTtcblxuICAgIGlmIChsYXlvdXRJbmZvLnRlbXBlcmF0dXJlIDwgb3B0aW9ucy5taW5UZW1wKSB7XG4gICAgICAvLyBsb2dEZWJ1ZyhcIlRlbXBlcmF0dXJlIGRyb3AgYmVsb3cgbWluaW11bSB0aHJlc2hvbGQuIFN0b3BwaW5nIGNvbXB1dGF0aW9uIGluIHN0ZXAgXCIgKyBpKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG4gIHZhciBkb25lID0gZnVuY3Rpb24gZG9uZSgpIHtcbiAgICBpZiAob3B0aW9ucy5hbmltYXRlID09PSB0cnVlIHx8IG9wdGlvbnMuYW5pbWF0ZSA9PT0gZmFsc2UpIHtcbiAgICAgIHJlZnJlc2goKTtcblxuICAgICAgLy8gTGF5b3V0IGhhcyBmaW5pc2hlZFxuICAgICAgbGF5b3V0Lm9uZSgnbGF5b3V0c3RvcCcsIG9wdGlvbnMuc3RvcCk7XG4gICAgICBsYXlvdXQuZW1pdCh7XG4gICAgICAgIHR5cGU6ICdsYXlvdXRzdG9wJyxcbiAgICAgICAgbGF5b3V0OiBsYXlvdXRcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbm9kZXMgPSBvcHRpb25zLmVsZXMubm9kZXMoKTtcbiAgICAgIHZhciBnZXRTY2FsZWRQb3MgPSBnZXRTY2FsZUluQm91bmRzRm4obGF5b3V0SW5mbywgb3B0aW9ucywgbm9kZXMpO1xuICAgICAgbm9kZXMubGF5b3V0UG9zaXRpb25zKGxheW91dCwgb3B0aW9ucywgZ2V0U2NhbGVkUG9zKTtcbiAgICB9XG4gIH07XG4gIHZhciBpID0gMDtcbiAgdmFyIGxvb3BSZXQgPSB0cnVlO1xuICBpZiAob3B0aW9ucy5hbmltYXRlID09PSB0cnVlKSB7XG4gICAgdmFyIF9mcmFtZSA9IGZ1bmN0aW9uIGZyYW1lKCkge1xuICAgICAgdmFyIGYgPSAwO1xuICAgICAgd2hpbGUgKGxvb3BSZXQgJiYgZiA8IG9wdGlvbnMucmVmcmVzaCkge1xuICAgICAgICBsb29wUmV0ID0gbWFpbkxvb3AoaSk7XG4gICAgICAgIGkrKztcbiAgICAgICAgZisrO1xuICAgICAgfVxuICAgICAgaWYgKCFsb29wUmV0KSB7XG4gICAgICAgIC8vIGl0J3MgZG9uZVxuICAgICAgICBzZXBhcmF0ZUNvbXBvbmVudHMobGF5b3V0SW5mbywgb3B0aW9ucyk7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBub3cgPSBwZXJmb3JtYW5jZU5vdygpO1xuICAgICAgICBpZiAobm93IC0gc3RhcnRUaW1lID49IG9wdGlvbnMuYW5pbWF0aW9uVGhyZXNob2xkKSB7XG4gICAgICAgICAgcmVmcmVzaCgpO1xuICAgICAgICB9XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShfZnJhbWUpO1xuICAgICAgfVxuICAgIH07XG4gICAgX2ZyYW1lKCk7XG4gIH0gZWxzZSB7XG4gICAgd2hpbGUgKGxvb3BSZXQpIHtcbiAgICAgIGxvb3BSZXQgPSBtYWluTG9vcChpKTtcbiAgICAgIGkrKztcbiAgICB9XG4gICAgc2VwYXJhdGVDb21wb25lbnRzKGxheW91dEluZm8sIG9wdGlvbnMpO1xuICAgIGRvbmUoKTtcbiAgfVxuICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbn07XG5cbi8qKlxuICogQGJyaWVmIDogY2FsbGVkIG9uIGNvbnRpbnVvdXMgbGF5b3V0cyB0byBzdG9wIHRoZW0gYmVmb3JlIHRoZXkgZmluaXNoXG4gKi9cbkNvc2VMYXlvdXQucHJvdG90eXBlLnN0b3AgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuc3RvcHBlZCA9IHRydWU7XG4gIGlmICh0aGlzLnRocmVhZCkge1xuICAgIHRoaXMudGhyZWFkLnN0b3AoKTtcbiAgfVxuICB0aGlzLmVtaXQoJ2xheW91dHN0b3AnKTtcbiAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG59O1xuQ29zZUxheW91dC5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMudGhyZWFkKSB7XG4gICAgdGhpcy50aHJlYWQuc3RvcCgpO1xuICB9XG4gIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xufTtcblxuLyoqXG4gKiBAYnJpZWYgICAgIDogQ3JlYXRlcyBhbiBvYmplY3Qgd2hpY2ggaXMgY29udGFpbnMgYWxsIHRoZSBkYXRhXG4gKiAgICAgICAgICAgICAgdXNlZCBpbiB0aGUgbGF5b3V0IHByb2Nlc3NcbiAqIEBhcmcgY3kgICAgOiBjeXRvc2NhcGUuanMgb2JqZWN0XG4gKiBAcmV0dXJuICAgIDogbGF5b3V0SW5mbyBvYmplY3QgaW5pdGlhbGl6ZWRcbiAqL1xudmFyIGNyZWF0ZUxheW91dEluZm8gPSBmdW5jdGlvbiBjcmVhdGVMYXlvdXRJbmZvKGN5LCBsYXlvdXQsIG9wdGlvbnMpIHtcbiAgLy8gU2hvcnRjdXRcbiAgdmFyIGVkZ2VzID0gb3B0aW9ucy5lbGVzLmVkZ2VzKCk7XG4gIHZhciBub2RlcyA9IG9wdGlvbnMuZWxlcy5ub2RlcygpO1xuICB2YXIgYmIgPSBtYWtlQm91bmRpbmdCb3gob3B0aW9ucy5ib3VuZGluZ0JveCA/IG9wdGlvbnMuYm91bmRpbmdCb3ggOiB7XG4gICAgeDE6IDAsXG4gICAgeTE6IDAsXG4gICAgdzogY3kud2lkdGgoKSxcbiAgICBoOiBjeS5oZWlnaHQoKVxuICB9KTtcbiAgdmFyIGxheW91dEluZm8gPSB7XG4gICAgaXNDb21wb3VuZDogY3kuaGFzQ29tcG91bmROb2RlcygpLFxuICAgIGxheW91dE5vZGVzOiBbXSxcbiAgICBpZFRvSW5kZXg6IHt9LFxuICAgIG5vZGVTaXplOiBub2Rlcy5zaXplKCksXG4gICAgZ3JhcGhTZXQ6IFtdLFxuICAgIGluZGV4VG9HcmFwaDogW10sXG4gICAgbGF5b3V0RWRnZXM6IFtdLFxuICAgIGVkZ2VTaXplOiBlZGdlcy5zaXplKCksXG4gICAgdGVtcGVyYXR1cmU6IG9wdGlvbnMuaW5pdGlhbFRlbXAsXG4gICAgY2xpZW50V2lkdGg6IGJiLncsXG4gICAgY2xpZW50SGVpZ2h0OiBiYi5oLFxuICAgIGJvdW5kaW5nQm94OiBiYlxuICB9O1xuICB2YXIgY29tcG9uZW50cyA9IG9wdGlvbnMuZWxlcy5jb21wb25lbnRzKCk7XG4gIHZhciBpZDJjbXB0SWQgPSB7fTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21wb25lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGNvbXBvbmVudCA9IGNvbXBvbmVudHNbaV07XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBjb21wb25lbnQubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBub2RlID0gY29tcG9uZW50W2pdO1xuICAgICAgaWQyY21wdElkW25vZGUuaWQoKV0gPSBpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEl0ZXJhdGUgb3ZlciBhbGwgbm9kZXMsIGNyZWF0aW5nIGxheW91dCBub2Rlc1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxheW91dEluZm8ubm9kZVNpemU7IGkrKykge1xuICAgIHZhciBuID0gbm9kZXNbaV07XG4gICAgdmFyIG5iYiA9IG4ubGF5b3V0RGltZW5zaW9ucyhvcHRpb25zKTtcbiAgICB2YXIgdGVtcE5vZGUgPSB7fTtcbiAgICB0ZW1wTm9kZS5pc0xvY2tlZCA9IG4ubG9ja2VkKCk7XG4gICAgdGVtcE5vZGUuaWQgPSBuLmRhdGEoJ2lkJyk7XG4gICAgdGVtcE5vZGUucGFyZW50SWQgPSBuLmRhdGEoJ3BhcmVudCcpO1xuICAgIHRlbXBOb2RlLmNtcHRJZCA9IGlkMmNtcHRJZFtuLmlkKCldO1xuICAgIHRlbXBOb2RlLmNoaWxkcmVuID0gW107XG4gICAgdGVtcE5vZGUucG9zaXRpb25YID0gbi5wb3NpdGlvbigneCcpO1xuICAgIHRlbXBOb2RlLnBvc2l0aW9uWSA9IG4ucG9zaXRpb24oJ3knKTtcbiAgICB0ZW1wTm9kZS5vZmZzZXRYID0gMDtcbiAgICB0ZW1wTm9kZS5vZmZzZXRZID0gMDtcbiAgICB0ZW1wTm9kZS5oZWlnaHQgPSBuYmIudztcbiAgICB0ZW1wTm9kZS53aWR0aCA9IG5iYi5oO1xuICAgIHRlbXBOb2RlLm1heFggPSB0ZW1wTm9kZS5wb3NpdGlvblggKyB0ZW1wTm9kZS53aWR0aCAvIDI7XG4gICAgdGVtcE5vZGUubWluWCA9IHRlbXBOb2RlLnBvc2l0aW9uWCAtIHRlbXBOb2RlLndpZHRoIC8gMjtcbiAgICB0ZW1wTm9kZS5tYXhZID0gdGVtcE5vZGUucG9zaXRpb25ZICsgdGVtcE5vZGUuaGVpZ2h0IC8gMjtcbiAgICB0ZW1wTm9kZS5taW5ZID0gdGVtcE5vZGUucG9zaXRpb25ZIC0gdGVtcE5vZGUuaGVpZ2h0IC8gMjtcbiAgICB0ZW1wTm9kZS5wYWRMZWZ0ID0gcGFyc2VGbG9hdChuLnN0eWxlKCdwYWRkaW5nJykpO1xuICAgIHRlbXBOb2RlLnBhZFJpZ2h0ID0gcGFyc2VGbG9hdChuLnN0eWxlKCdwYWRkaW5nJykpO1xuICAgIHRlbXBOb2RlLnBhZFRvcCA9IHBhcnNlRmxvYXQobi5zdHlsZSgncGFkZGluZycpKTtcbiAgICB0ZW1wTm9kZS5wYWRCb3R0b20gPSBwYXJzZUZsb2F0KG4uc3R5bGUoJ3BhZGRpbmcnKSk7XG5cbiAgICAvLyBmb3JjZXNcbiAgICB0ZW1wTm9kZS5ub2RlUmVwdWxzaW9uID0gZm4kNihvcHRpb25zLm5vZGVSZXB1bHNpb24pID8gb3B0aW9ucy5ub2RlUmVwdWxzaW9uKG4pIDogb3B0aW9ucy5ub2RlUmVwdWxzaW9uO1xuXG4gICAgLy8gQWRkIG5ldyBub2RlXG4gICAgbGF5b3V0SW5mby5sYXlvdXROb2Rlcy5wdXNoKHRlbXBOb2RlKTtcbiAgICAvLyBBZGQgZW50cnkgdG8gaWQtaW5kZXggbWFwXG4gICAgbGF5b3V0SW5mby5pZFRvSW5kZXhbdGVtcE5vZGUuaWRdID0gaTtcbiAgfVxuXG4gIC8vIElubGluZSBpbXBsZW1lbnRhdGlvbiBvZiBhIHF1ZXVlLCB1c2VkIGZvciB0cmF2ZXJzaW5nIHRoZSBncmFwaCBpbiBCRlMgb3JkZXJcbiAgdmFyIHF1ZXVlID0gW107XG4gIHZhciBzdGFydCA9IDA7IC8vIFBvaW50cyB0byB0aGUgc3RhcnQgdGhlIHF1ZXVlXG4gIHZhciBlbmQgPSAtMTsgLy8gUG9pbnRzIHRvIHRoZSBlbmQgb2YgdGhlIHF1ZXVlXG5cbiAgdmFyIHRlbXBHcmFwaCA9IFtdO1xuXG4gIC8vIFNlY29uZCBwYXNzIHRvIGFkZCBjaGlsZCBpbmZvcm1hdGlvbiBhbmRcbiAgLy8gaW5pdGlhbGl6ZSBxdWV1ZSBmb3IgaGllcmFyY2hpY2FsIHRyYXZlcnNhbFxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxheW91dEluZm8ubm9kZVNpemU7IGkrKykge1xuICAgIHZhciBuID0gbGF5b3V0SW5mby5sYXlvdXROb2Rlc1tpXTtcbiAgICB2YXIgcF9pZCA9IG4ucGFyZW50SWQ7XG4gICAgLy8gQ2hlY2sgaWYgbm9kZSBuIGhhcyBhIHBhcmVudCBub2RlXG4gICAgaWYgKG51bGwgIT0gcF9pZCkge1xuICAgICAgLy8gQWRkIG5vZGUgSWQgdG8gcGFyZW50J3MgbGlzdCBvZiBjaGlsZHJlblxuICAgICAgbGF5b3V0SW5mby5sYXlvdXROb2Rlc1tsYXlvdXRJbmZvLmlkVG9JbmRleFtwX2lkXV0uY2hpbGRyZW4ucHVzaChuLmlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgYSBub2RlIGRvZXNuJ3QgaGF2ZSBhIHBhcmVudCwgdGhlbiBpdCdzIGluIHRoZSByb290IGdyYXBoXG4gICAgICBxdWV1ZVsrK2VuZF0gPSBuLmlkO1xuICAgICAgdGVtcEdyYXBoLnB1c2gobi5pZCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQWRkIHJvb3QgZ3JhcGggdG8gZ3JhcGhTZXRcbiAgbGF5b3V0SW5mby5ncmFwaFNldC5wdXNoKHRlbXBHcmFwaCk7XG5cbiAgLy8gVHJhdmVyc2UgdGhlIGdyYXBoLCBsZXZlbCBieSBsZXZlbCxcbiAgd2hpbGUgKHN0YXJ0IDw9IGVuZCkge1xuICAgIC8vIEdldCB0aGUgbm9kZSB0byB2aXNpdCBhbmQgcmVtb3ZlIGl0IGZyb20gcXVldWVcbiAgICB2YXIgbm9kZV9pZCA9IHF1ZXVlW3N0YXJ0KytdO1xuICAgIHZhciBub2RlX2l4ID0gbGF5b3V0SW5mby5pZFRvSW5kZXhbbm9kZV9pZF07XG4gICAgdmFyIG5vZGUgPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW25vZGVfaXhdO1xuICAgIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47XG4gICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIEFkZCBjaGlsZHJlbiBub2RlcyBhcyBhIG5ldyBncmFwaCB0byBncmFwaCBzZXRcbiAgICAgIGxheW91dEluZm8uZ3JhcGhTZXQucHVzaChjaGlsZHJlbik7XG4gICAgICAvLyBBZGQgY2hpbGRyZW4gdG8gcXVlIHF1ZXVlIHRvIGJlIHZpc2l0ZWRcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcXVldWVbKytlbmRdID0gY2hpbGRyZW5baV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gQ3JlYXRlIGluZGV4VG9HcmFwaCBtYXBcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXlvdXRJbmZvLmdyYXBoU2V0Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGdyYXBoID0gbGF5b3V0SW5mby5ncmFwaFNldFtpXTtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGdyYXBoLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgaW5kZXggPSBsYXlvdXRJbmZvLmlkVG9JbmRleFtncmFwaFtqXV07XG4gICAgICBsYXlvdXRJbmZvLmluZGV4VG9HcmFwaFtpbmRleF0gPSBpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEl0ZXJhdGUgb3ZlciBhbGwgZWRnZXMsIGNyZWF0aW5nIExheW91dCBFZGdlc1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxheW91dEluZm8uZWRnZVNpemU7IGkrKykge1xuICAgIHZhciBlID0gZWRnZXNbaV07XG4gICAgdmFyIHRlbXBFZGdlID0ge307XG4gICAgdGVtcEVkZ2UuaWQgPSBlLmRhdGEoJ2lkJyk7XG4gICAgdGVtcEVkZ2Uuc291cmNlSWQgPSBlLmRhdGEoJ3NvdXJjZScpO1xuICAgIHRlbXBFZGdlLnRhcmdldElkID0gZS5kYXRhKCd0YXJnZXQnKTtcblxuICAgIC8vIENvbXB1dGUgaWRlYWwgbGVuZ3RoXG4gICAgdmFyIGlkZWFsTGVuZ3RoID0gZm4kNihvcHRpb25zLmlkZWFsRWRnZUxlbmd0aCkgPyBvcHRpb25zLmlkZWFsRWRnZUxlbmd0aChlKSA6IG9wdGlvbnMuaWRlYWxFZGdlTGVuZ3RoO1xuICAgIHZhciBlbGFzdGljaXR5ID0gZm4kNihvcHRpb25zLmVkZ2VFbGFzdGljaXR5KSA/IG9wdGlvbnMuZWRnZUVsYXN0aWNpdHkoZSkgOiBvcHRpb25zLmVkZ2VFbGFzdGljaXR5O1xuXG4gICAgLy8gQ2hlY2sgaWYgaXQncyBhbiBpbnRlciBncmFwaCBlZGdlXG4gICAgdmFyIHNvdXJjZUl4ID0gbGF5b3V0SW5mby5pZFRvSW5kZXhbdGVtcEVkZ2Uuc291cmNlSWRdO1xuICAgIHZhciB0YXJnZXRJeCA9IGxheW91dEluZm8uaWRUb0luZGV4W3RlbXBFZGdlLnRhcmdldElkXTtcbiAgICB2YXIgc291cmNlR3JhcGggPSBsYXlvdXRJbmZvLmluZGV4VG9HcmFwaFtzb3VyY2VJeF07XG4gICAgdmFyIHRhcmdldEdyYXBoID0gbGF5b3V0SW5mby5pbmRleFRvR3JhcGhbdGFyZ2V0SXhdO1xuICAgIGlmIChzb3VyY2VHcmFwaCAhPSB0YXJnZXRHcmFwaCkge1xuICAgICAgLy8gRmluZCBsb3dlc3QgY29tbW9uIGdyYXBoIGFuY2VzdG9yXG4gICAgICB2YXIgbGNhID0gZmluZExDQSh0ZW1wRWRnZS5zb3VyY2VJZCwgdGVtcEVkZ2UudGFyZ2V0SWQsIGxheW91dEluZm8pO1xuXG4gICAgICAvLyBDb21wdXRlIHN1bSBvZiBub2RlIGRlcHRocywgcmVsYXRpdmUgdG8gbGNhIGdyYXBoXG4gICAgICB2YXIgbGNhR3JhcGggPSBsYXlvdXRJbmZvLmdyYXBoU2V0W2xjYV07XG4gICAgICB2YXIgZGVwdGggPSAwO1xuXG4gICAgICAvLyBTb3VyY2UgZGVwdGhcbiAgICAgIHZhciB0ZW1wTm9kZSA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXNbc291cmNlSXhdO1xuICAgICAgd2hpbGUgKC0xID09PSBsY2FHcmFwaC5pbmRleE9mKHRlbXBOb2RlLmlkKSkge1xuICAgICAgICB0ZW1wTm9kZSA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXNbbGF5b3V0SW5mby5pZFRvSW5kZXhbdGVtcE5vZGUucGFyZW50SWRdXTtcbiAgICAgICAgZGVwdGgrKztcbiAgICAgIH1cblxuICAgICAgLy8gVGFyZ2V0IGRlcHRoXG4gICAgICB0ZW1wTm9kZSA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXNbdGFyZ2V0SXhdO1xuICAgICAgd2hpbGUgKC0xID09PSBsY2FHcmFwaC5pbmRleE9mKHRlbXBOb2RlLmlkKSkge1xuICAgICAgICB0ZW1wTm9kZSA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXNbbGF5b3V0SW5mby5pZFRvSW5kZXhbdGVtcE5vZGUucGFyZW50SWRdXTtcbiAgICAgICAgZGVwdGgrKztcbiAgICAgIH1cblxuICAgICAgLy8gbG9nRGVidWcoJ0xDQSBvZiBub2RlcyAnICsgdGVtcEVkZ2Uuc291cmNlSWQgKyAnIGFuZCAnICsgdGVtcEVkZ2UudGFyZ2V0SWQgK1xuICAgICAgLy8gIFwiLiBJbmRleDogXCIgKyBsY2EgKyBcIiBDb250ZW50czogXCIgKyBsY2FHcmFwaC50b1N0cmluZygpICtcbiAgICAgIC8vICBcIi4gRGVwdGg6IFwiICsgZGVwdGgpO1xuXG4gICAgICAvLyBVcGRhdGUgaWRlYWxMZW5ndGhcbiAgICAgIGlkZWFsTGVuZ3RoICo9IGRlcHRoICogb3B0aW9ucy5uZXN0aW5nRmFjdG9yO1xuICAgIH1cbiAgICB0ZW1wRWRnZS5pZGVhbExlbmd0aCA9IGlkZWFsTGVuZ3RoO1xuICAgIHRlbXBFZGdlLmVsYXN0aWNpdHkgPSBlbGFzdGljaXR5O1xuICAgIGxheW91dEluZm8ubGF5b3V0RWRnZXMucHVzaCh0ZW1wRWRnZSk7XG4gIH1cblxuICAvLyBGaW5hbGx5LCByZXR1cm4gbGF5b3V0SW5mbyBvYmplY3RcbiAgcmV0dXJuIGxheW91dEluZm87XG59O1xuXG4vKipcbiAqIEBicmllZiA6IFRoaXMgZnVuY3Rpb24gZmluZHMgdGhlIGluZGV4IG9mIHRoZSBsb3dlc3QgY29tbW9uXG4gKiAgICAgICAgICBncmFwaCBhbmNlc3RvciBiZXR3ZWVuIDIgbm9kZXMgaW4gdGhlIHN1YnRyZWVcbiAqICAgICAgICAgIChmcm9tIHRoZSBncmFwaCBoaWVyYXJjaHkgaW5kdWNlZCB0cmVlKSB3aG9zZVxuICogICAgICAgICAgcm9vdCBpcyBncmFwaEl4XG4gKlxuICogQGFyZyBub2RlMTogbm9kZTEncyBJRFxuICogQGFyZyBub2RlMjogbm9kZTIncyBJRFxuICogQGFyZyBsYXlvdXRJbmZvOiBsYXlvdXRJbmZvIG9iamVjdFxuICpcbiAqL1xudmFyIGZpbmRMQ0EgPSBmdW5jdGlvbiBmaW5kTENBKG5vZGUxLCBub2RlMiwgbGF5b3V0SW5mbykge1xuICAvLyBGaW5kIHRoZWlyIGNvbW1vbiBhbmNlc3Rlciwgc3RhcnRpbmcgZnJvbSB0aGUgcm9vdCBncmFwaFxuICB2YXIgcmVzID0gX2ZpbmRMQ0FfYXV4KG5vZGUxLCBub2RlMiwgMCwgbGF5b3V0SW5mbyk7XG4gIGlmICgyID4gcmVzLmNvdW50KSB7XG4gICAgLy8gSWYgYXV4IGZ1bmN0aW9uIGNvdWxkbid0IGZpbmQgdGhlIGNvbW1vbiBhbmNlc3RlcixcbiAgICAvLyB0aGVuIGl0IGlzIHRoZSByb290IGdyYXBoXG4gICAgcmV0dXJuIDA7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHJlcy5ncmFwaDtcbiAgfVxufTtcblxuLyoqXG4gKiBAYnJpZWYgICAgICAgICAgOiBBdXhpbGlhcnkgZnVuY3Rpb24gdXNlZCBmb3IgTENBIGNvbXB1dGF0aW9uXG4gKlxuICogQGFyZyBub2RlMSAgICAgIDogbm9kZTEncyBJRFxuICogQGFyZyBub2RlMiAgICAgIDogbm9kZTIncyBJRFxuICogQGFyZyBncmFwaEl4ICAgIDogc3ViZ3JhcGggaW5kZXhcbiAqIEBhcmcgbGF5b3V0SW5mbyA6IGxheW91dEluZm8gb2JqZWN0XG4gKlxuICogQHJldHVybiAgICAgICAgIDogb2JqZWN0IG9mIHRoZSBmb3JtIHtjb3VudDogWCwgZ3JhcGg6IFl9LCB3aGVyZTpcbiAqICAgICAgICAgICAgICAgICAgIFggaXMgdGhlIG51bWJlciBvZiBhbmNlc3RvcnMgKG1heDogMikgZm91bmQgaW5cbiAqICAgICAgICAgICAgICAgICAgIGdyYXBoSXggKGFuZCBpdCdzIHN1YmdyYXBocyksXG4gKiAgICAgICAgICAgICAgICAgICBZIGlzIHRoZSBncmFwaCBpbmRleCBvZiB0aGUgbG93ZXN0IGdyYXBoIGNvbnRhaW5pbmdcbiAqICAgICAgICAgICAgICAgICAgIGFsbCBYIG5vZGVzXG4gKi9cbnZhciBfZmluZExDQV9hdXggPSBmdW5jdGlvbiBmaW5kTENBX2F1eChub2RlMSwgbm9kZTIsIGdyYXBoSXgsIGxheW91dEluZm8pIHtcbiAgdmFyIGdyYXBoID0gbGF5b3V0SW5mby5ncmFwaFNldFtncmFwaEl4XTtcbiAgLy8gSWYgYm90aCBub2RlcyBiZWxvbmdzIHRvIGdyYXBoSXhcbiAgaWYgKC0xIDwgZ3JhcGguaW5kZXhPZihub2RlMSkgJiYgLTEgPCBncmFwaC5pbmRleE9mKG5vZGUyKSkge1xuICAgIHJldHVybiB7XG4gICAgICBjb3VudDogMixcbiAgICAgIGdyYXBoOiBncmFwaEl4XG4gICAgfTtcbiAgfVxuXG4gIC8vIE1ha2UgcmVjdXJzaXZlIGNhbGxzIGZvciBhbGwgc3ViZ3JhcGhzXG4gIHZhciBjID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBncmFwaC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBub2RlSWQgPSBncmFwaFtpXTtcbiAgICB2YXIgbm9kZUl4ID0gbGF5b3V0SW5mby5pZFRvSW5kZXhbbm9kZUlkXTtcbiAgICB2YXIgY2hpbGRyZW4gPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW25vZGVJeF0uY2hpbGRyZW47XG5cbiAgICAvLyBJZiB0aGUgbm9kZSBoYXMgbm8gY2hpbGQsIHNraXAgaXRcbiAgICBpZiAoMCA9PT0gY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdmFyIGNoaWxkR3JhcGhJeCA9IGxheW91dEluZm8uaW5kZXhUb0dyYXBoW2xheW91dEluZm8uaWRUb0luZGV4W2NoaWxkcmVuWzBdXV07XG4gICAgdmFyIHJlc3VsdCA9IF9maW5kTENBX2F1eChub2RlMSwgbm9kZTIsIGNoaWxkR3JhcGhJeCwgbGF5b3V0SW5mbyk7XG4gICAgaWYgKDAgPT09IHJlc3VsdC5jb3VudCkge1xuICAgICAgLy8gTmVpdGhlciBub2RlMSBub3Igbm9kZTIgYXJlIHByZXNlbnQgaW4gdGhpcyBzdWJncmFwaFxuICAgICAgY29udGludWU7XG4gICAgfSBlbHNlIGlmICgxID09PSByZXN1bHQuY291bnQpIHtcbiAgICAgIC8vIE9uZSBvZiAobm9kZTEsIG5vZGUyKSBpcyBwcmVzZW50IGluIHRoaXMgc3ViZ3JhcGhcbiAgICAgIGMrKztcbiAgICAgIGlmICgyID09PSBjKSB7XG4gICAgICAgIC8vIFdlJ3ZlIGFscmVhZHkgZm91bmQgYm90aCBub2Rlcywgbm8gbmVlZCB0byBrZWVwIHNlYXJjaGluZ1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQm90aCBub2RlcyBhcmUgcHJlc2VudCBpbiB0aGlzIHN1YmdyYXBoXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIGNvdW50OiBjLFxuICAgIGdyYXBoOiBncmFwaEl4XG4gIH07XG59O1xuXG4vKipcbiAqIEBicmllZjogcHJpbnRzTGF5b3V0SW5mbyBpbnRvIGpzIGNvbnNvbGVcbiAqICAgICAgICAgT25seSB1c2VkIGZvciBkZWJidWdpbmdcbiAqL1xudmFyIHByaW50TGF5b3V0SW5mbzsgXG5cbi8qKlxuICogQGJyaWVmIDogUmFuZG9taXplcyB0aGUgcG9zaXRpb24gb2YgYWxsIG5vZGVzXG4gKi9cbnZhciByYW5kb21pemVQb3NpdGlvbnMgPSBmdW5jdGlvbiByYW5kb21pemVQb3NpdGlvbnMobGF5b3V0SW5mbywgY3kpIHtcbiAgdmFyIHdpZHRoID0gbGF5b3V0SW5mby5jbGllbnRXaWR0aDtcbiAgdmFyIGhlaWdodCA9IGxheW91dEluZm8uY2xpZW50SGVpZ2h0O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxheW91dEluZm8ubm9kZVNpemU7IGkrKykge1xuICAgIHZhciBuID0gbGF5b3V0SW5mby5sYXlvdXROb2Rlc1tpXTtcblxuICAgIC8vIE5vIG5lZWQgdG8gcmFuZG9taXplIGNvbXBvdW5kIG5vZGVzIG9yIGxvY2tlZCBub2Rlc1xuICAgIGlmICgwID09PSBuLmNoaWxkcmVuLmxlbmd0aCAmJiAhbi5pc0xvY2tlZCkge1xuICAgICAgbi5wb3NpdGlvblggPSBNYXRoLnJhbmRvbSgpICogd2lkdGg7XG4gICAgICBuLnBvc2l0aW9uWSA9IE1hdGgucmFuZG9tKCkgKiBoZWlnaHQ7XG4gICAgfVxuICB9XG59O1xudmFyIGdldFNjYWxlSW5Cb3VuZHNGbiA9IGZ1bmN0aW9uIGdldFNjYWxlSW5Cb3VuZHNGbihsYXlvdXRJbmZvLCBvcHRpb25zLCBub2Rlcykge1xuICB2YXIgYmIgPSBsYXlvdXRJbmZvLmJvdW5kaW5nQm94O1xuICB2YXIgY29zZUJCID0ge1xuICAgIHgxOiBJbmZpbml0eSxcbiAgICB4MjogLUluZmluaXR5LFxuICAgIHkxOiBJbmZpbml0eSxcbiAgICB5MjogLUluZmluaXR5XG4gIH07XG4gIGlmIChvcHRpb25zLmJvdW5kaW5nQm94KSB7XG4gICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgdmFyIGxub2RlID0gbGF5b3V0SW5mby5sYXlvdXROb2Rlc1tsYXlvdXRJbmZvLmlkVG9JbmRleFtub2RlLmRhdGEoJ2lkJyldXTtcbiAgICAgIGNvc2VCQi54MSA9IE1hdGgubWluKGNvc2VCQi54MSwgbG5vZGUucG9zaXRpb25YKTtcbiAgICAgIGNvc2VCQi54MiA9IE1hdGgubWF4KGNvc2VCQi54MiwgbG5vZGUucG9zaXRpb25YKTtcbiAgICAgIGNvc2VCQi55MSA9IE1hdGgubWluKGNvc2VCQi55MSwgbG5vZGUucG9zaXRpb25ZKTtcbiAgICAgIGNvc2VCQi55MiA9IE1hdGgubWF4KGNvc2VCQi55MiwgbG5vZGUucG9zaXRpb25ZKTtcbiAgICB9KTtcbiAgICBjb3NlQkIudyA9IGNvc2VCQi54MiAtIGNvc2VCQi54MTtcbiAgICBjb3NlQkIuaCA9IGNvc2VCQi55MiAtIGNvc2VCQi55MTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24gKGVsZSwgaSkge1xuICAgIHZhciBsbm9kZSA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXNbbGF5b3V0SW5mby5pZFRvSW5kZXhbZWxlLmRhdGEoJ2lkJyldXTtcbiAgICBpZiAob3B0aW9ucy5ib3VuZGluZ0JveCkge1xuICAgICAgLy8gdGhlbiBhZGQgZXh0cmEgYm91bmRpbmcgYm94IGNvbnN0cmFpbnRcbiAgICAgIC8vIEhhbmRsZSBzaW5nbGUgbm9kZSBjYXNlIHdoZXJlIGNvc2VCQi53IG9yIGNvc2VCQi5oIGlzIDBcbiAgICAgIHZhciBwY3RYID0gY29zZUJCLncgPT09IDAgPyAwLjUgOiAobG5vZGUucG9zaXRpb25YIC0gY29zZUJCLngxKSAvIGNvc2VCQi53O1xuICAgICAgdmFyIHBjdFkgPSBjb3NlQkIuaCA9PT0gMCA/IDAuNSA6IChsbm9kZS5wb3NpdGlvblkgLSBjb3NlQkIueTEpIC8gY29zZUJCLmg7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4OiBiYi54MSArIHBjdFggKiBiYi53LFxuICAgICAgICB5OiBiYi55MSArIHBjdFkgKiBiYi5oXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4OiBsbm9kZS5wb3NpdGlvblgsXG4gICAgICAgIHk6IGxub2RlLnBvc2l0aW9uWVxuICAgICAgfTtcbiAgICB9XG4gIH07XG59O1xuXG4vKipcbiAqIEBicmllZiAgICAgICAgICA6IFVwZGF0ZXMgdGhlIHBvc2l0aW9ucyBvZiBub2RlcyBpbiB0aGUgbmV0d29ya1xuICogQGFyZyBsYXlvdXRJbmZvIDogTGF5b3V0SW5mbyBvYmplY3RcbiAqIEBhcmcgY3kgICAgICAgICA6IEN5dG9zY2FwZSBvYmplY3RcbiAqIEBhcmcgb3B0aW9ucyAgICA6IExheW91dCBvcHRpb25zXG4gKi9cbnZhciByZWZyZXNoUG9zaXRpb25zID0gZnVuY3Rpb24gcmVmcmVzaFBvc2l0aW9ucyhsYXlvdXRJbmZvLCBjeSwgb3B0aW9ucykge1xuICAvLyB2YXIgcyA9ICdSZWZyZXNoaW5nIHBvc2l0aW9ucyc7XG4gIC8vIGxvZ0RlYnVnKHMpO1xuXG4gIHZhciBsYXlvdXQgPSBvcHRpb25zLmxheW91dDtcbiAgdmFyIG5vZGVzID0gb3B0aW9ucy5lbGVzLm5vZGVzKCk7XG4gIHZhciBnZXRTY2FsZWRQb3MgPSBnZXRTY2FsZUluQm91bmRzRm4obGF5b3V0SW5mbywgb3B0aW9ucywgbm9kZXMpO1xuICBub2Rlcy5wb3NpdGlvbnMoZ2V0U2NhbGVkUG9zKTtcblxuICAvLyBUcmlnZ2VyIGxheW91dFJlYWR5IG9ubHkgb24gZmlyc3QgY2FsbFxuICBpZiAodHJ1ZSAhPT0gbGF5b3V0SW5mby5yZWFkeSkge1xuICAgIC8vIHMgPSAnVHJpZ2dlcmluZyBsYXlvdXRyZWFkeSc7XG4gICAgLy8gbG9nRGVidWcocyk7XG4gICAgbGF5b3V0SW5mby5yZWFkeSA9IHRydWU7XG4gICAgbGF5b3V0Lm9uZSgnbGF5b3V0cmVhZHknLCBvcHRpb25zLnJlYWR5KTtcbiAgICBsYXlvdXQuZW1pdCh7XG4gICAgICB0eXBlOiAnbGF5b3V0cmVhZHknLFxuICAgICAgbGF5b3V0OiB0aGlzXG4gICAgfSk7XG4gIH1cbn07XG5cbi8qKlxuICogQGJyaWVmIDogTG9ncyBhIGRlYnVnIG1lc3NhZ2UgaW4gSlMgY29uc29sZSwgaWYgREVCVUcgaXMgT05cbiAqL1xuLy8gdmFyIGxvZ0RlYnVnID0gZnVuY3Rpb24odGV4dCkge1xuLy8gICBpZiAoREVCVUcpIHtcbi8vICAgICBjb25zb2xlLmRlYnVnKHRleHQpO1xuLy8gICB9XG4vLyB9O1xuXG4vKipcbiAqIEBicmllZiAgICAgICAgICA6IFBlcmZvcm1zIG9uZSBpdGVyYXRpb24gb2YgdGhlIHBoeXNpY2FsIHNpbXVsYXRpb25cbiAqIEBhcmcgbGF5b3V0SW5mbyA6IExheW91dEluZm8gb2JqZWN0IGFscmVhZHkgaW5pdGlhbGl6ZWRcbiAqIEBhcmcgY3kgICAgICAgICA6IEN5dG9zY2FwZSBvYmplY3RcbiAqIEBhcmcgb3B0aW9ucyAgICA6IExheW91dCBvcHRpb25zXG4gKi9cbnZhciBzdGVwID0gZnVuY3Rpb24gc3RlcChsYXlvdXRJbmZvLCBvcHRpb25zLCBfc3RlcCkge1xuICAvLyB2YXIgcyA9IFwiXFxuXFxuIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1wiO1xuICAvLyBzICs9IFwiXFxuU1RFUDogXCIgKyBzdGVwO1xuICAvLyBzICs9IFwiXFxuIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xcblwiO1xuICAvLyBsb2dEZWJ1ZyhzKTtcblxuICAvLyBDYWxjdWxhdGUgbm9kZSByZXB1bHNpb25zXG4gIGNhbGN1bGF0ZU5vZGVGb3JjZXMobGF5b3V0SW5mbywgb3B0aW9ucyk7XG4gIC8vIENhbGN1bGF0ZSBlZGdlIGZvcmNlc1xuICBjYWxjdWxhdGVFZGdlRm9yY2VzKGxheW91dEluZm8pO1xuICAvLyBDYWxjdWxhdGUgZ3Jhdml0eSBmb3JjZXNcbiAgY2FsY3VsYXRlR3Jhdml0eUZvcmNlcyhsYXlvdXRJbmZvLCBvcHRpb25zKTtcbiAgLy8gUHJvcGFnYXRlIGZvcmNlcyBmcm9tIHBhcmVudCB0byBjaGlsZFxuICBwcm9wYWdhdGVGb3JjZXMobGF5b3V0SW5mbyk7XG4gIC8vIFVwZGF0ZSBwb3NpdGlvbnMgYmFzZWQgb24gY2FsY3VsYXRlZCBmb3JjZXNcbiAgdXBkYXRlUG9zaXRpb25zKGxheW91dEluZm8pO1xufTtcblxuLyoqXG4gKiBAYnJpZWYgOiBDb21wdXRlcyB0aGUgbm9kZSByZXB1bHNpb24gZm9yY2VzXG4gKi9cbnZhciBjYWxjdWxhdGVOb2RlRm9yY2VzID0gZnVuY3Rpb24gY2FsY3VsYXRlTm9kZUZvcmNlcyhsYXlvdXRJbmZvLCBvcHRpb25zKSB7XG4gIC8vIEdvIHRocm91Z2ggZWFjaCBvZiB0aGUgZ3JhcGhzIGluIGdyYXBoU2V0XG4gIC8vIE5vZGVzIG9ubHkgcmVwZWwgZWFjaCBvdGhlciBpZiB0aGV5IGJlbG9uZyB0byB0aGUgc2FtZSBncmFwaFxuICAvLyB2YXIgcyA9ICdjYWxjdWxhdGVOb2RlRm9yY2VzJztcbiAgLy8gbG9nRGVidWcocyk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGF5b3V0SW5mby5ncmFwaFNldC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBncmFwaCA9IGxheW91dEluZm8uZ3JhcGhTZXRbaV07XG4gICAgdmFyIG51bU5vZGVzID0gZ3JhcGgubGVuZ3RoO1xuXG4gICAgLy8gcyA9IFwiU2V0OiBcIiArIGdyYXBoLnRvU3RyaW5nKCk7XG4gICAgLy8gbG9nRGVidWcocyk7XG5cbiAgICAvLyBOb3cgZ2V0IGFsbCB0aGUgcGFpcnMgb2Ygbm9kZXNcbiAgICAvLyBPbmx5IGdldCBlYWNoIHBhaXIgb25jZSwgKEEsIEIpID0gKEIsIEEpXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBudW1Ob2RlczsgaisrKSB7XG4gICAgICB2YXIgbm9kZTEgPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW2xheW91dEluZm8uaWRUb0luZGV4W2dyYXBoW2pdXV07XG4gICAgICBmb3IgKHZhciBrID0gaiArIDE7IGsgPCBudW1Ob2RlczsgaysrKSB7XG4gICAgICAgIHZhciBub2RlMiA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXNbbGF5b3V0SW5mby5pZFRvSW5kZXhbZ3JhcGhba11dXTtcbiAgICAgICAgbm9kZVJlcHVsc2lvbihub2RlMSwgbm9kZTIsIGxheW91dEluZm8sIG9wdGlvbnMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcbnZhciByYW5kb21EaXN0YW5jZSA9IGZ1bmN0aW9uIHJhbmRvbURpc3RhbmNlKG1heCkge1xuICByZXR1cm4gLW1heCArIDIgKiBtYXggKiBNYXRoLnJhbmRvbSgpO1xufTtcblxuLyoqXG4gKiBAYnJpZWYgOiBDb21wdXRlIHRoZSBub2RlIHJlcHVsc2lvbiBmb3JjZXMgYmV0d2VlbiBhIHBhaXIgb2Ygbm9kZXNcbiAqL1xudmFyIG5vZGVSZXB1bHNpb24gPSBmdW5jdGlvbiBub2RlUmVwdWxzaW9uKG5vZGUxLCBub2RlMiwgbGF5b3V0SW5mbywgb3B0aW9ucykge1xuICAvLyB2YXIgcyA9IFwiTm9kZSByZXB1bHNpb24uIE5vZGUxOiBcIiArIG5vZGUxLmlkICsgXCIgTm9kZTI6IFwiICsgbm9kZTIuaWQ7XG5cbiAgdmFyIGNtcHRJZDEgPSBub2RlMS5jbXB0SWQ7XG4gIHZhciBjbXB0SWQyID0gbm9kZTIuY21wdElkO1xuICBpZiAoY21wdElkMSAhPT0gY21wdElkMiAmJiAhbGF5b3V0SW5mby5pc0NvbXBvdW5kKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gR2V0IGRpcmVjdGlvbiBvZiBsaW5lIGNvbm5lY3RpbmcgYm90aCBub2RlIGNlbnRlcnNcbiAgdmFyIGRpcmVjdGlvblggPSBub2RlMi5wb3NpdGlvblggLSBub2RlMS5wb3NpdGlvblg7XG4gIHZhciBkaXJlY3Rpb25ZID0gbm9kZTIucG9zaXRpb25ZIC0gbm9kZTEucG9zaXRpb25ZO1xuICB2YXIgbWF4UmFuZERpc3QgPSAxO1xuICAvLyBzICs9IFwiXFxuZGlyZWN0aW9uWDogXCIgKyBkaXJlY3Rpb25YICsgXCIsIGRpcmVjdGlvblk6IFwiICsgZGlyZWN0aW9uWTtcblxuICAvLyBJZiBib3RoIGNlbnRlcnMgYXJlIHRoZSBzYW1lLCBhcHBseSBhIHJhbmRvbSBmb3JjZVxuICBpZiAoMCA9PT0gZGlyZWN0aW9uWCAmJiAwID09PSBkaXJlY3Rpb25ZKSB7XG4gICAgZGlyZWN0aW9uWCA9IHJhbmRvbURpc3RhbmNlKG1heFJhbmREaXN0KTtcbiAgICBkaXJlY3Rpb25ZID0gcmFuZG9tRGlzdGFuY2UobWF4UmFuZERpc3QpO1xuICB9XG4gIHZhciBvdmVybGFwID0gbm9kZXNPdmVybGFwKG5vZGUxLCBub2RlMiwgZGlyZWN0aW9uWCwgZGlyZWN0aW9uWSk7XG4gIGlmIChvdmVybGFwID4gMCkge1xuICAgIC8vIHMgKz0gXCJcXG5Ob2RlcyBETyBvdmVybGFwLlwiO1xuICAgIC8vIHMgKz0gXCJcXG5PdmVybGFwOiBcIiArIG92ZXJsYXA7XG4gICAgLy8gSWYgbm9kZXMgb3ZlcmxhcCwgcmVwdWxzaW9uIGZvcmNlIGlzIHByb3BvcnRpb25hbFxuICAgIC8vIHRvIHRoZSBvdmVybGFwXG4gICAgdmFyIGZvcmNlID0gb3B0aW9ucy5ub2RlT3ZlcmxhcCAqIG92ZXJsYXA7XG5cbiAgICAvLyBDb21wdXRlIHRoZSBtb2R1bGUgYW5kIGNvbXBvbmVudHMgb2YgdGhlIGZvcmNlIHZlY3RvclxuICAgIHZhciBkaXN0YW5jZSA9IE1hdGguc3FydChkaXJlY3Rpb25YICogZGlyZWN0aW9uWCArIGRpcmVjdGlvblkgKiBkaXJlY3Rpb25ZKTtcbiAgICAvLyBzICs9IFwiXFxuRGlzdGFuY2U6IFwiICsgZGlzdGFuY2U7XG4gICAgdmFyIGZvcmNlWCA9IGZvcmNlICogZGlyZWN0aW9uWCAvIGRpc3RhbmNlO1xuICAgIHZhciBmb3JjZVkgPSBmb3JjZSAqIGRpcmVjdGlvblkgLyBkaXN0YW5jZTtcbiAgfSBlbHNlIHtcbiAgICAvLyBzICs9IFwiXFxuTm9kZXMgZG8gTk9UIG92ZXJsYXAuXCI7XG4gICAgLy8gSWYgdGhlcmUncyBubyBvdmVybGFwLCBmb3JjZSBpcyBpbnZlcnNlbHkgcHJvcG9ydGlvbmFsXG4gICAgLy8gdG8gc3F1YXJlZCBkaXN0YW5jZVxuXG4gICAgLy8gR2V0IGNsaXBwaW5nIHBvaW50cyBmb3IgYm90aCBub2Rlc1xuICAgIHZhciBwb2ludDEgPSBmaW5kQ2xpcHBpbmdQb2ludChub2RlMSwgZGlyZWN0aW9uWCwgZGlyZWN0aW9uWSk7XG4gICAgdmFyIHBvaW50MiA9IGZpbmRDbGlwcGluZ1BvaW50KG5vZGUyLCAtMSAqIGRpcmVjdGlvblgsIC0xICogZGlyZWN0aW9uWSk7XG5cbiAgICAvLyBVc2UgY2xpcHBpbmcgcG9pbnRzIHRvIGNvbXB1dGUgZGlzdGFuY2VcbiAgICB2YXIgZGlzdGFuY2VYID0gcG9pbnQyLnggLSBwb2ludDEueDtcbiAgICB2YXIgZGlzdGFuY2VZID0gcG9pbnQyLnkgLSBwb2ludDEueTtcbiAgICB2YXIgZGlzdGFuY2VTcXIgPSBkaXN0YW5jZVggKiBkaXN0YW5jZVggKyBkaXN0YW5jZVkgKiBkaXN0YW5jZVk7XG4gICAgdmFyIGRpc3RhbmNlID0gTWF0aC5zcXJ0KGRpc3RhbmNlU3FyKTtcbiAgICAvLyBzICs9IFwiXFxuRGlzdGFuY2U6IFwiICsgZGlzdGFuY2U7XG5cbiAgICAvLyBDb21wdXRlIHRoZSBtb2R1bGUgYW5kIGNvbXBvbmVudHMgb2YgdGhlIGZvcmNlIHZlY3RvclxuICAgIHZhciBmb3JjZSA9IChub2RlMS5ub2RlUmVwdWxzaW9uICsgbm9kZTIubm9kZVJlcHVsc2lvbikgLyBkaXN0YW5jZVNxcjtcbiAgICB2YXIgZm9yY2VYID0gZm9yY2UgKiBkaXN0YW5jZVggLyBkaXN0YW5jZTtcbiAgICB2YXIgZm9yY2VZID0gZm9yY2UgKiBkaXN0YW5jZVkgLyBkaXN0YW5jZTtcbiAgfVxuXG4gIC8vIEFwcGx5IGZvcmNlXG4gIGlmICghbm9kZTEuaXNMb2NrZWQpIHtcbiAgICBub2RlMS5vZmZzZXRYIC09IGZvcmNlWDtcbiAgICBub2RlMS5vZmZzZXRZIC09IGZvcmNlWTtcbiAgfVxuICBpZiAoIW5vZGUyLmlzTG9ja2VkKSB7XG4gICAgbm9kZTIub2Zmc2V0WCArPSBmb3JjZVg7XG4gICAgbm9kZTIub2Zmc2V0WSArPSBmb3JjZVk7XG4gIH1cblxuICAvLyBzICs9IFwiXFxuRm9yY2VYOiBcIiArIGZvcmNlWCArIFwiIEZvcmNlWTogXCIgKyBmb3JjZVk7XG4gIC8vIGxvZ0RlYnVnKHMpO1xuXG4gIHJldHVybjtcbn07XG5cbi8qKlxuICogQGJyaWVmICA6IERldGVybWluZXMgd2hldGhlciB0d28gbm9kZXMgb3ZlcmxhcCBvciBub3RcbiAqIEByZXR1cm4gOiBBbW91bnQgb2Ygb3ZlcmxhcHBpbmcgKDAgPT4gbm8gb3ZlcmxhcClcbiAqL1xudmFyIG5vZGVzT3ZlcmxhcCA9IGZ1bmN0aW9uIG5vZGVzT3ZlcmxhcChub2RlMSwgbm9kZTIsIGRYLCBkWSkge1xuICBpZiAoZFggPiAwKSB7XG4gICAgdmFyIG92ZXJsYXBYID0gbm9kZTEubWF4WCAtIG5vZGUyLm1pblg7XG4gIH0gZWxzZSB7XG4gICAgdmFyIG92ZXJsYXBYID0gbm9kZTIubWF4WCAtIG5vZGUxLm1pblg7XG4gIH1cbiAgaWYgKGRZID4gMCkge1xuICAgIHZhciBvdmVybGFwWSA9IG5vZGUxLm1heFkgLSBub2RlMi5taW5ZO1xuICB9IGVsc2Uge1xuICAgIHZhciBvdmVybGFwWSA9IG5vZGUyLm1heFkgLSBub2RlMS5taW5ZO1xuICB9XG4gIGlmIChvdmVybGFwWCA+PSAwICYmIG92ZXJsYXBZID49IDApIHtcbiAgICByZXR1cm4gTWF0aC5zcXJ0KG92ZXJsYXBYICogb3ZlcmxhcFggKyBvdmVybGFwWSAqIG92ZXJsYXBZKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gMDtcbiAgfVxufTtcblxuLyoqXG4gKiBAYnJpZWYgOiBGaW5kcyB0aGUgcG9pbnQgaW4gd2hpY2ggYW4gZWRnZSAoZGlyZWN0aW9uIGRYLCBkWSkgaW50ZXJzZWN0c1xuICogICAgICAgICAgdGhlIHJlY3Rhbmd1bGFyIGJvdW5kaW5nIGJveCBvZiBpdCdzIHNvdXJjZS90YXJnZXQgbm9kZVxuICovXG52YXIgZmluZENsaXBwaW5nUG9pbnQgPSBmdW5jdGlvbiBmaW5kQ2xpcHBpbmdQb2ludChub2RlLCBkWCwgZFkpIHtcbiAgLy8gU2hvcmN1dHNcbiAgdmFyIFggPSBub2RlLnBvc2l0aW9uWDtcbiAgdmFyIFkgPSBub2RlLnBvc2l0aW9uWTtcbiAgdmFyIEggPSBub2RlLmhlaWdodCB8fCAxO1xuICB2YXIgVyA9IG5vZGUud2lkdGggfHwgMTtcbiAgdmFyIGRpclNsb3BlID0gZFkgLyBkWDtcbiAgdmFyIG5vZGVTbG9wZSA9IEggLyBXO1xuXG4gIC8vIHZhciBzID0gJ0NvbXB1dGluZyBjbGlwcGluZyBwb2ludCBvZiBub2RlICcgKyBub2RlLmlkICtcbiAgLy8gICBcIiAuIEhlaWdodDogIFwiICsgSCArIFwiLCBXaWR0aDogXCIgKyBXICtcbiAgLy8gICBcIlxcbkRpcmVjdGlvbiBcIiArIGRYICsgXCIsIFwiICsgZFk7XG4gIC8vXG4gIC8vIENvbXB1dGUgaW50ZXJzZWN0aW9uXG4gIHZhciByZXMgPSB7fTtcblxuICAvLyBDYXNlOiBWZXJ0aWNhbCBkaXJlY3Rpb24gKHVwKVxuICBpZiAoMCA9PT0gZFggJiYgMCA8IGRZKSB7XG4gICAgcmVzLnggPSBYO1xuICAgIC8vIHMgKz0gXCJcXG5VcCBkaXJlY3Rpb25cIjtcbiAgICByZXMueSA9IFkgKyBIIC8gMjtcbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLy8gQ2FzZTogVmVydGljYWwgZGlyZWN0aW9uIChkb3duKVxuICBpZiAoMCA9PT0gZFggJiYgMCA+IGRZKSB7XG4gICAgcmVzLnggPSBYO1xuICAgIHJlcy55ID0gWSArIEggLyAyO1xuICAgIC8vIHMgKz0gXCJcXG5Eb3duIGRpcmVjdGlvblwiO1xuXG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8vIENhc2U6IEludGVyc2VjdHMgdGhlIHJpZ2h0IGJvcmRlclxuICBpZiAoMCA8IGRYICYmIC0xICogbm9kZVNsb3BlIDw9IGRpclNsb3BlICYmIGRpclNsb3BlIDw9IG5vZGVTbG9wZSkge1xuICAgIHJlcy54ID0gWCArIFcgLyAyO1xuICAgIHJlcy55ID0gWSArIFcgKiBkWSAvIDIgLyBkWDtcbiAgICAvLyBzICs9IFwiXFxuUmlnaHRib3JkZXJcIjtcblxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvLyBDYXNlOiBJbnRlcnNlY3RzIHRoZSBsZWZ0IGJvcmRlclxuICBpZiAoMCA+IGRYICYmIC0xICogbm9kZVNsb3BlIDw9IGRpclNsb3BlICYmIGRpclNsb3BlIDw9IG5vZGVTbG9wZSkge1xuICAgIHJlcy54ID0gWCAtIFcgLyAyO1xuICAgIHJlcy55ID0gWSAtIFcgKiBkWSAvIDIgLyBkWDtcbiAgICAvLyBzICs9IFwiXFxuTGVmdGJvcmRlclwiO1xuXG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8vIENhc2U6IEludGVyc2VjdHMgdGhlIHRvcCBib3JkZXJcbiAgaWYgKDAgPCBkWSAmJiAoZGlyU2xvcGUgPD0gLTEgKiBub2RlU2xvcGUgfHwgZGlyU2xvcGUgPj0gbm9kZVNsb3BlKSkge1xuICAgIHJlcy54ID0gWCArIEggKiBkWCAvIDIgLyBkWTtcbiAgICByZXMueSA9IFkgKyBIIC8gMjtcbiAgICAvLyBzICs9IFwiXFxuVG9wIGJvcmRlclwiO1xuXG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8vIENhc2U6IEludGVyc2VjdHMgdGhlIGJvdHRvbSBib3JkZXJcbiAgaWYgKDAgPiBkWSAmJiAoZGlyU2xvcGUgPD0gLTEgKiBub2RlU2xvcGUgfHwgZGlyU2xvcGUgPj0gbm9kZVNsb3BlKSkge1xuICAgIHJlcy54ID0gWCAtIEggKiBkWCAvIDIgLyBkWTtcbiAgICByZXMueSA9IFkgLSBIIC8gMjtcbiAgICAvLyBzICs9IFwiXFxuQm90dG9tIGJvcmRlclwiO1xuXG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8vIHMgKz0gXCJcXG5DbGlwcGluZyBwb2ludCBmb3VuZCBhdCBcIiArIHJlcy54ICsgXCIsIFwiICsgcmVzLnk7XG4gIC8vIGxvZ0RlYnVnKHMpO1xuICByZXR1cm4gcmVzO1xufTtcblxuLyoqXG4gKiBAYnJpZWYgOiBDYWxjdWxhdGVzIGFsbCBlZGdlIGZvcmNlc1xuICovXG52YXIgY2FsY3VsYXRlRWRnZUZvcmNlcyA9IGZ1bmN0aW9uIGNhbGN1bGF0ZUVkZ2VGb3JjZXMobGF5b3V0SW5mbywgb3B0aW9ucykge1xuICAvLyBJdGVyYXRlIG92ZXIgYWxsIGVkZ2VzXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGF5b3V0SW5mby5lZGdlU2l6ZTsgaSsrKSB7XG4gICAgLy8gR2V0IGVkZ2UsIHNvdXJjZSAmIHRhcmdldCBub2Rlc1xuICAgIHZhciBlZGdlID0gbGF5b3V0SW5mby5sYXlvdXRFZGdlc1tpXTtcbiAgICB2YXIgc291cmNlSXggPSBsYXlvdXRJbmZvLmlkVG9JbmRleFtlZGdlLnNvdXJjZUlkXTtcbiAgICB2YXIgc291cmNlID0gbGF5b3V0SW5mby5sYXlvdXROb2Rlc1tzb3VyY2VJeF07XG4gICAgdmFyIHRhcmdldEl4ID0gbGF5b3V0SW5mby5pZFRvSW5kZXhbZWRnZS50YXJnZXRJZF07XG4gICAgdmFyIHRhcmdldCA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXNbdGFyZ2V0SXhdO1xuXG4gICAgLy8gR2V0IGRpcmVjdGlvbiBvZiBsaW5lIGNvbm5lY3RpbmcgYm90aCBub2RlIGNlbnRlcnNcbiAgICB2YXIgZGlyZWN0aW9uWCA9IHRhcmdldC5wb3NpdGlvblggLSBzb3VyY2UucG9zaXRpb25YO1xuICAgIHZhciBkaXJlY3Rpb25ZID0gdGFyZ2V0LnBvc2l0aW9uWSAtIHNvdXJjZS5wb3NpdGlvblk7XG5cbiAgICAvLyBJZiBib3RoIGNlbnRlcnMgYXJlIHRoZSBzYW1lLCBkbyBub3RoaW5nLlxuICAgIC8vIEEgcmFuZG9tIGZvcmNlIGhhcyBhbHJlYWR5IGJlZW4gYXBwbGllZCBhcyBub2RlIHJlcHVsc2lvblxuICAgIGlmICgwID09PSBkaXJlY3Rpb25YICYmIDAgPT09IGRpcmVjdGlvblkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIEdldCBjbGlwcGluZyBwb2ludHMgZm9yIGJvdGggbm9kZXNcbiAgICB2YXIgcG9pbnQxID0gZmluZENsaXBwaW5nUG9pbnQoc291cmNlLCBkaXJlY3Rpb25YLCBkaXJlY3Rpb25ZKTtcbiAgICB2YXIgcG9pbnQyID0gZmluZENsaXBwaW5nUG9pbnQodGFyZ2V0LCAtMSAqIGRpcmVjdGlvblgsIC0xICogZGlyZWN0aW9uWSk7XG4gICAgdmFyIGx4ID0gcG9pbnQyLnggLSBwb2ludDEueDtcbiAgICB2YXIgbHkgPSBwb2ludDIueSAtIHBvaW50MS55O1xuICAgIHZhciBsID0gTWF0aC5zcXJ0KGx4ICogbHggKyBseSAqIGx5KTtcbiAgICB2YXIgZm9yY2UgPSBNYXRoLnBvdyhlZGdlLmlkZWFsTGVuZ3RoIC0gbCwgMikgLyBlZGdlLmVsYXN0aWNpdHk7XG4gICAgaWYgKDAgIT09IGwpIHtcbiAgICAgIHZhciBmb3JjZVggPSBmb3JjZSAqIGx4IC8gbDtcbiAgICAgIHZhciBmb3JjZVkgPSBmb3JjZSAqIGx5IC8gbDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGZvcmNlWCA9IDA7XG4gICAgICB2YXIgZm9yY2VZID0gMDtcbiAgICB9XG5cbiAgICAvLyBBZGQgdGhpcyBmb3JjZSB0byB0YXJnZXQgYW5kIHNvdXJjZSBub2Rlc1xuICAgIGlmICghc291cmNlLmlzTG9ja2VkKSB7XG4gICAgICBzb3VyY2Uub2Zmc2V0WCArPSBmb3JjZVg7XG4gICAgICBzb3VyY2Uub2Zmc2V0WSArPSBmb3JjZVk7XG4gICAgfVxuICAgIGlmICghdGFyZ2V0LmlzTG9ja2VkKSB7XG4gICAgICB0YXJnZXQub2Zmc2V0WCAtPSBmb3JjZVg7XG4gICAgICB0YXJnZXQub2Zmc2V0WSAtPSBmb3JjZVk7XG4gICAgfVxuXG4gICAgLy8gdmFyIHMgPSAnRWRnZSBmb3JjZSBiZXR3ZWVuIG5vZGVzICcgKyBzb3VyY2UuaWQgKyAnIGFuZCAnICsgdGFyZ2V0LmlkO1xuICAgIC8vIHMgKz0gXCJcXG5EaXN0YW5jZTogXCIgKyBsICsgXCIgRm9yY2U6IChcIiArIGZvcmNlWCArIFwiLCBcIiArIGZvcmNlWSArIFwiKVwiO1xuICAgIC8vIGxvZ0RlYnVnKHMpO1xuICB9XG59O1xuXG4vKipcbiAqIEBicmllZiA6IENvbXB1dGVzIGdyYXZpdHkgZm9yY2VzIGZvciBhbGwgbm9kZXNcbiAqL1xudmFyIGNhbGN1bGF0ZUdyYXZpdHlGb3JjZXMgPSBmdW5jdGlvbiBjYWxjdWxhdGVHcmF2aXR5Rm9yY2VzKGxheW91dEluZm8sIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMuZ3Jhdml0eSA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgZGlzdFRocmVzaG9sZCA9IDE7XG5cbiAgLy8gdmFyIHMgPSAnY2FsY3VsYXRlR3Jhdml0eUZvcmNlcyc7XG4gIC8vIGxvZ0RlYnVnKHMpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxheW91dEluZm8uZ3JhcGhTZXQubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZ3JhcGggPSBsYXlvdXRJbmZvLmdyYXBoU2V0W2ldO1xuICAgIHZhciBudW1Ob2RlcyA9IGdyYXBoLmxlbmd0aDtcblxuICAgIC8vIHMgPSBcIlNldDogXCIgKyBncmFwaC50b1N0cmluZygpO1xuICAgIC8vIGxvZ0RlYnVnKHMpO1xuXG4gICAgLy8gQ29tcHV0ZSBncmFwaCBjZW50ZXJcbiAgICBpZiAoMCA9PT0gaSkge1xuICAgICAgdmFyIGNlbnRlclggPSBsYXlvdXRJbmZvLmNsaWVudEhlaWdodCAvIDI7XG4gICAgICB2YXIgY2VudGVyWSA9IGxheW91dEluZm8uY2xpZW50V2lkdGggLyAyO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBHZXQgUGFyZW50IG5vZGUgZm9yIHRoaXMgZ3JhcGgsIGFuZCB1c2UgaXRzIHBvc2l0aW9uIGFzIGNlbnRlclxuICAgICAgdmFyIHRlbXAgPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW2xheW91dEluZm8uaWRUb0luZGV4W2dyYXBoWzBdXV07XG4gICAgICB2YXIgcGFyZW50ID0gbGF5b3V0SW5mby5sYXlvdXROb2Rlc1tsYXlvdXRJbmZvLmlkVG9JbmRleFt0ZW1wLnBhcmVudElkXV07XG4gICAgICB2YXIgY2VudGVyWCA9IHBhcmVudC5wb3NpdGlvblg7XG4gICAgICB2YXIgY2VudGVyWSA9IHBhcmVudC5wb3NpdGlvblk7XG4gICAgfVxuICAgIC8vIHMgPSBcIkNlbnRlciBmb3VuZCBhdDogXCIgKyBjZW50ZXJYICsgXCIsIFwiICsgY2VudGVyWTtcbiAgICAvLyBsb2dEZWJ1ZyhzKTtcblxuICAgIC8vIEFwcGx5IGZvcmNlIHRvIGFsbCBub2RlcyBpbiBncmFwaFxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgbnVtTm9kZXM7IGorKykge1xuICAgICAgdmFyIG5vZGUgPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW2xheW91dEluZm8uaWRUb0luZGV4W2dyYXBoW2pdXV07XG4gICAgICAvLyBzID0gXCJOb2RlOiBcIiArIG5vZGUuaWQ7XG5cbiAgICAgIGlmIChub2RlLmlzTG9ja2VkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdmFyIGR4ID0gY2VudGVyWCAtIG5vZGUucG9zaXRpb25YO1xuICAgICAgdmFyIGR5ID0gY2VudGVyWSAtIG5vZGUucG9zaXRpb25ZO1xuICAgICAgdmFyIGQgPSBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpO1xuICAgICAgaWYgKGQgPiBkaXN0VGhyZXNob2xkKSB7XG4gICAgICAgIHZhciBmeCA9IG9wdGlvbnMuZ3Jhdml0eSAqIGR4IC8gZDtcbiAgICAgICAgdmFyIGZ5ID0gb3B0aW9ucy5ncmF2aXR5ICogZHkgLyBkO1xuICAgICAgICBub2RlLm9mZnNldFggKz0gZng7XG4gICAgICAgIG5vZGUub2Zmc2V0WSArPSBmeTtcbiAgICAgICAgLy8gcyArPSBcIjogQXBwbGllZCBmb3JjZTogXCIgKyBmeCArIFwiLCBcIiArIGZ5O1xuICAgICAgfVxuICAgICAgLy8gbG9nRGVidWcocyk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEBicmllZiAgICAgICAgICA6IFRoaXMgZnVuY3Rpb24gcHJvcGFnYXRlcyB0aGUgZXhpc3Rpbmcgb2Zmc2V0cyBmcm9tXG4gKiAgICAgICAgICAgICAgICAgICBwYXJlbnQgbm9kZXMgdG8gaXRzIGRlc2NlbmRlbnRzLlxuICogQGFyZyBsYXlvdXRJbmZvIDogbGF5b3V0SW5mbyBPYmplY3RcbiAqIEBhcmcgY3kgICAgICAgICA6IGN5dG9zY2FwZSBPYmplY3RcbiAqIEBhcmcgb3B0aW9ucyAgICA6IExheW91dCBvcHRpb25zXG4gKi9cbnZhciBwcm9wYWdhdGVGb3JjZXMgPSBmdW5jdGlvbiBwcm9wYWdhdGVGb3JjZXMobGF5b3V0SW5mbywgb3B0aW9ucykge1xuICAvLyBJbmxpbmUgaW1wbGVtZW50YXRpb24gb2YgYSBxdWV1ZSwgdXNlZCBmb3IgdHJhdmVyc2luZyB0aGUgZ3JhcGggaW4gQkZTIG9yZGVyXG4gIHZhciBxdWV1ZSA9IFtdO1xuICB2YXIgc3RhcnQgPSAwOyAvLyBQb2ludHMgdG8gdGhlIHN0YXJ0IHRoZSBxdWV1ZVxuICB2YXIgZW5kID0gLTE7IC8vIFBvaW50cyB0byB0aGUgZW5kIG9mIHRoZSBxdWV1ZVxuXG4gIC8vIGxvZ0RlYnVnKCdwcm9wYWdhdGVGb3JjZXMnKTtcblxuICAvLyBTdGFydCBieSB2aXNpdGluZyB0aGUgbm9kZXMgaW4gdGhlIHJvb3QgZ3JhcGhcbiAgcXVldWUucHVzaC5hcHBseShxdWV1ZSwgbGF5b3V0SW5mby5ncmFwaFNldFswXSk7XG4gIGVuZCArPSBsYXlvdXRJbmZvLmdyYXBoU2V0WzBdLmxlbmd0aDtcblxuICAvLyBUcmF2ZXJzZSB0aGUgZ3JhcGgsIGxldmVsIGJ5IGxldmVsLFxuICB3aGlsZSAoc3RhcnQgPD0gZW5kKSB7XG4gICAgLy8gR2V0IHRoZSBub2RlIHRvIHZpc2l0IGFuZCByZW1vdmUgaXQgZnJvbSBxdWV1ZVxuICAgIHZhciBub2RlSWQgPSBxdWV1ZVtzdGFydCsrXTtcbiAgICB2YXIgbm9kZUluZGV4ID0gbGF5b3V0SW5mby5pZFRvSW5kZXhbbm9kZUlkXTtcbiAgICB2YXIgbm9kZSA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXNbbm9kZUluZGV4XTtcbiAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xuXG4gICAgLy8gV2Ugb25seSBuZWVkIHRvIHByb2Nlc3MgdGhlIG5vZGUgaWYgaXQncyBjb21wb3VuZFxuICAgIGlmICgwIDwgY2hpbGRyZW4ubGVuZ3RoICYmICFub2RlLmlzTG9ja2VkKSB7XG4gICAgICB2YXIgb2ZmWCA9IG5vZGUub2Zmc2V0WDtcbiAgICAgIHZhciBvZmZZID0gbm9kZS5vZmZzZXRZO1xuXG4gICAgICAvLyB2YXIgcyA9IFwiUHJvcGFnYXRpbmcgb2Zmc2V0IGZyb20gcGFyZW50IG5vZGUgOiBcIiArIG5vZGUuaWQgK1xuICAgICAgLy8gICBcIi4gT2Zmc2V0WDogXCIgKyBvZmZYICsgXCIuIE9mZnNldFk6IFwiICsgb2ZmWTtcbiAgICAgIC8vIHMgKz0gXCJcXG4gQ2hpbGRyZW46IFwiICsgY2hpbGRyZW4udG9TdHJpbmcoKTtcbiAgICAgIC8vIGxvZ0RlYnVnKHMpO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjaGlsZE5vZGUgPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW2xheW91dEluZm8uaWRUb0luZGV4W2NoaWxkcmVuW2ldXV07XG4gICAgICAgIC8vIFByb3BhZ2F0ZSBvZmZzZXRcbiAgICAgICAgY2hpbGROb2RlLm9mZnNldFggKz0gb2ZmWDtcbiAgICAgICAgY2hpbGROb2RlLm9mZnNldFkgKz0gb2ZmWTtcbiAgICAgICAgLy8gQWRkIGNoaWxkcmVuIHRvIHF1ZXVlIHRvIGJlIHZpc2l0ZWRcbiAgICAgICAgcXVldWVbKytlbmRdID0gY2hpbGRyZW5baV07XG4gICAgICB9XG5cbiAgICAgIC8vIFJlc2V0IHBhcmVudCBvZmZzZXRzXG4gICAgICBub2RlLm9mZnNldFggPSAwO1xuICAgICAgbm9kZS5vZmZzZXRZID0gMDtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogQGJyaWVmIDogVXBkYXRlcyB0aGUgbGF5b3V0IG1vZGVsIHBvc2l0aW9ucywgYmFzZWQgb25cbiAqICAgICAgICAgIHRoZSBhY2N1bXVsYXRlZCBmb3JjZXNcbiAqL1xudmFyIHVwZGF0ZVBvc2l0aW9ucyA9IGZ1bmN0aW9uIHVwZGF0ZVBvc2l0aW9ucyhsYXlvdXRJbmZvLCBvcHRpb25zKSB7XG4gIC8vIHZhciBzID0gJ1VwZGF0aW5nIHBvc2l0aW9ucyc7XG4gIC8vIGxvZ0RlYnVnKHMpO1xuXG4gIC8vIFJlc2V0IGJvdW5kYXJpZXMgZm9yIGNvbXBvdW5kIG5vZGVzXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGF5b3V0SW5mby5ub2RlU2l6ZTsgaSsrKSB7XG4gICAgdmFyIG4gPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW2ldO1xuICAgIGlmICgwIDwgbi5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgIC8vIGxvZ0RlYnVnKFwiUmVzZXR0aW5nIGJvdW5kYXJpZXMgb2YgY29tcG91bmQgbm9kZTogXCIgKyBuLmlkKTtcbiAgICAgIG4ubWF4WCA9IHVuZGVmaW5lZDtcbiAgICAgIG4ubWluWCA9IHVuZGVmaW5lZDtcbiAgICAgIG4ubWF4WSA9IHVuZGVmaW5lZDtcbiAgICAgIG4ubWluWSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXlvdXRJbmZvLm5vZGVTaXplOyBpKyspIHtcbiAgICB2YXIgbiA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXNbaV07XG4gICAgaWYgKDAgPCBuLmNoaWxkcmVuLmxlbmd0aCB8fCBuLmlzTG9ja2VkKSB7XG4gICAgICAvLyBObyBuZWVkIHRvIHNldCBjb21wb3VuZCBvciBsb2NrZWQgbm9kZSBwb3NpdGlvblxuICAgICAgLy8gbG9nRGVidWcoXCJTa2lwcGluZyBwb3NpdGlvbiB1cGRhdGUgb2Ygbm9kZTogXCIgKyBuLmlkKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICAvLyBzID0gXCJOb2RlOiBcIiArIG4uaWQgKyBcIiBQcmV2aW91cyBwb3NpdGlvbjogKFwiICtcbiAgICAvLyBuLnBvc2l0aW9uWCArIFwiLCBcIiArIG4ucG9zaXRpb25ZICsgXCIpLlwiO1xuXG4gICAgLy8gTGltaXQgZGlzcGxhY2VtZW50IGluIG9yZGVyIHRvIGltcHJvdmUgc3RhYmlsaXR5XG4gICAgdmFyIHRlbXBGb3JjZSA9IGxpbWl0Rm9yY2Uobi5vZmZzZXRYLCBuLm9mZnNldFksIGxheW91dEluZm8udGVtcGVyYXR1cmUpO1xuICAgIG4ucG9zaXRpb25YICs9IHRlbXBGb3JjZS54O1xuICAgIG4ucG9zaXRpb25ZICs9IHRlbXBGb3JjZS55O1xuICAgIG4ub2Zmc2V0WCA9IDA7XG4gICAgbi5vZmZzZXRZID0gMDtcbiAgICBuLm1pblggPSBuLnBvc2l0aW9uWCAtIG4ud2lkdGg7XG4gICAgbi5tYXhYID0gbi5wb3NpdGlvblggKyBuLndpZHRoO1xuICAgIG4ubWluWSA9IG4ucG9zaXRpb25ZIC0gbi5oZWlnaHQ7XG4gICAgbi5tYXhZID0gbi5wb3NpdGlvblkgKyBuLmhlaWdodDtcbiAgICAvLyBzICs9IFwiIE5ldyBQb3NpdGlvbjogKFwiICsgbi5wb3NpdGlvblggKyBcIiwgXCIgKyBuLnBvc2l0aW9uWSArIFwiKS5cIjtcbiAgICAvLyBsb2dEZWJ1ZyhzKTtcblxuICAgIC8vIFVwZGF0ZSBhbmNlc3RyeSBib3VkYXJpZXNcbiAgICBfdXBkYXRlQW5jZXN0cnlCb3VuZGFyaWVzKG4sIGxheW91dEluZm8pO1xuICB9XG5cbiAgLy8gVXBkYXRlIHNpemUsIHBvc2l0aW9uIG9mIGNvbXB1bmQgbm9kZXNcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXlvdXRJbmZvLm5vZGVTaXplOyBpKyspIHtcbiAgICB2YXIgbiA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXNbaV07XG4gICAgaWYgKDAgPCBuLmNoaWxkcmVuLmxlbmd0aCAmJiAhbi5pc0xvY2tlZCkge1xuICAgICAgbi5wb3NpdGlvblggPSAobi5tYXhYICsgbi5taW5YKSAvIDI7XG4gICAgICBuLnBvc2l0aW9uWSA9IChuLm1heFkgKyBuLm1pblkpIC8gMjtcbiAgICAgIG4ud2lkdGggPSBuLm1heFggLSBuLm1pblg7XG4gICAgICBuLmhlaWdodCA9IG4ubWF4WSAtIG4ubWluWTtcbiAgICAgIC8vIHMgPSBcIlVwZGF0aW5nIHBvc2l0aW9uLCBzaXplIG9mIGNvbXBvdW5kIG5vZGUgXCIgKyBuLmlkO1xuICAgICAgLy8gcyArPSBcIlxcblBvc2l0aW9uWDogXCIgKyBuLnBvc2l0aW9uWCArIFwiLCBQb3NpdGlvblk6IFwiICsgbi5wb3NpdGlvblk7XG4gICAgICAvLyBzICs9IFwiXFxuV2lkdGg6IFwiICsgbi53aWR0aCArIFwiLCBIZWlnaHQ6IFwiICsgbi5oZWlnaHQ7XG4gICAgICAvLyBsb2dEZWJ1ZyhzKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogQGJyaWVmIDogTGltaXRzIGEgZm9yY2UgKGZvcmNlWCwgZm9yY2VZKSB0byBiZSBub3RcbiAqICAgICAgICAgIGdyZWF0ZXIgKGluIG1vZHVsbykgdGhhbiBtYXguXG4gOCAgICAgICAgICBQcmVzZXJ2ZXMgZm9yY2UgZGlyZWN0aW9uLlxuICAqL1xudmFyIGxpbWl0Rm9yY2UgPSBmdW5jdGlvbiBsaW1pdEZvcmNlKGZvcmNlWCwgZm9yY2VZLCBtYXgpIHtcbiAgLy8gdmFyIHMgPSBcIkxpbWl0aW5nIGZvcmNlOiAoXCIgKyBmb3JjZVggKyBcIiwgXCIgKyBmb3JjZVkgKyBcIikuIE1heDogXCIgKyBtYXg7XG4gIHZhciBmb3JjZSA9IE1hdGguc3FydChmb3JjZVggKiBmb3JjZVggKyBmb3JjZVkgKiBmb3JjZVkpO1xuICBpZiAoZm9yY2UgPiBtYXgpIHtcbiAgICB2YXIgcmVzID0ge1xuICAgICAgeDogbWF4ICogZm9yY2VYIC8gZm9yY2UsXG4gICAgICB5OiBtYXggKiBmb3JjZVkgLyBmb3JjZVxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgdmFyIHJlcyA9IHtcbiAgICAgIHg6IGZvcmNlWCxcbiAgICAgIHk6IGZvcmNlWVxuICAgIH07XG4gIH1cblxuICAvLyBzICs9IFwiLlxcblJlc3VsdDogKFwiICsgcmVzLnggKyBcIiwgXCIgKyByZXMueSArIFwiKVwiO1xuICAvLyBsb2dEZWJ1ZyhzKTtcblxuICByZXR1cm4gcmVzO1xufTtcblxuLyoqXG4gKiBAYnJpZWYgOiBGdW5jdGlvbiB1c2VkIGZvciBrZWVwaW5nIHRyYWNrIG9mIGNvbXBvdW5kIG5vZGVcbiAqICAgICAgICAgIHNpemVzLCBzaW5jZSB0aGV5IHNob3VsZCBib3VuZCBhbGwgdGhlaXIgc3Vibm9kZXMuXG4gKi9cbnZhciBfdXBkYXRlQW5jZXN0cnlCb3VuZGFyaWVzID0gZnVuY3Rpb24gdXBkYXRlQW5jZXN0cnlCb3VuZGFyaWVzKG5vZGUsIGxheW91dEluZm8pIHtcbiAgLy8gdmFyIHMgPSBcIlByb3BhZ2F0aW5nIG5ldyBwb3NpdGlvbi9zaXplIG9mIG5vZGUgXCIgKyBub2RlLmlkO1xuICB2YXIgcGFyZW50SWQgPSBub2RlLnBhcmVudElkO1xuICBpZiAobnVsbCA9PSBwYXJlbnRJZCkge1xuICAgIC8vIElmIHRoZXJlJ3Mgbm8gcGFyZW50LCB3ZSBhcmUgZG9uZVxuICAgIC8vIHMgKz0gXCIuIE5vIHBhcmVudCBub2RlLlwiO1xuICAgIC8vIGxvZ0RlYnVnKHMpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEdldCBQYXJlbnQgTm9kZVxuICB2YXIgcCA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXNbbGF5b3V0SW5mby5pZFRvSW5kZXhbcGFyZW50SWRdXTtcbiAgdmFyIGZsYWcgPSBmYWxzZTtcblxuICAvLyBNYXhYXG4gIGlmIChudWxsID09IHAubWF4WCB8fCBub2RlLm1heFggKyBwLnBhZFJpZ2h0ID4gcC5tYXhYKSB7XG4gICAgcC5tYXhYID0gbm9kZS5tYXhYICsgcC5wYWRSaWdodDtcbiAgICBmbGFnID0gdHJ1ZTtcbiAgICAvLyBzICs9IFwiXFxuTmV3IG1heFggZm9yIHBhcmVudCBub2RlIFwiICsgcC5pZCArIFwiOiBcIiArIHAubWF4WDtcbiAgfVxuXG4gIC8vIE1pblhcbiAgaWYgKG51bGwgPT0gcC5taW5YIHx8IG5vZGUubWluWCAtIHAucGFkTGVmdCA8IHAubWluWCkge1xuICAgIHAubWluWCA9IG5vZGUubWluWCAtIHAucGFkTGVmdDtcbiAgICBmbGFnID0gdHJ1ZTtcbiAgICAvLyBzICs9IFwiXFxuTmV3IG1pblggZm9yIHBhcmVudCBub2RlIFwiICsgcC5pZCArIFwiOiBcIiArIHAubWluWDtcbiAgfVxuXG4gIC8vIE1heFlcbiAgaWYgKG51bGwgPT0gcC5tYXhZIHx8IG5vZGUubWF4WSArIHAucGFkQm90dG9tID4gcC5tYXhZKSB7XG4gICAgcC5tYXhZID0gbm9kZS5tYXhZICsgcC5wYWRCb3R0b207XG4gICAgZmxhZyA9IHRydWU7XG4gICAgLy8gcyArPSBcIlxcbk5ldyBtYXhZIGZvciBwYXJlbnQgbm9kZSBcIiArIHAuaWQgKyBcIjogXCIgKyBwLm1heFk7XG4gIH1cblxuICAvLyBNaW5ZXG4gIGlmIChudWxsID09IHAubWluWSB8fCBub2RlLm1pblkgLSBwLnBhZFRvcCA8IHAubWluWSkge1xuICAgIHAubWluWSA9IG5vZGUubWluWSAtIHAucGFkVG9wO1xuICAgIGZsYWcgPSB0cnVlO1xuICAgIC8vIHMgKz0gXCJcXG5OZXcgbWluWSBmb3IgcGFyZW50IG5vZGUgXCIgKyBwLmlkICsgXCI6IFwiICsgcC5taW5ZO1xuICB9XG5cbiAgLy8gSWYgdXBkYXRlZCBib3VuZGFyaWVzLCBwcm9wYWdhdGUgY2hhbmdlcyB1cHdhcmRcbiAgaWYgKGZsYWcpIHtcbiAgICAvLyBsb2dEZWJ1ZyhzKTtcbiAgICByZXR1cm4gX3VwZGF0ZUFuY2VzdHJ5Qm91bmRhcmllcyhwLCBsYXlvdXRJbmZvKTtcbiAgfVxuXG4gIC8vIHMgKz0gXCIuIE5vIGNoYW5nZXMgaW4gYm91bmRhcmllcy9wb3NpdGlvbiBvZiBwYXJlbnQgbm9kZSBcIiArIHAuaWQ7XG4gIC8vIGxvZ0RlYnVnKHMpO1xuICByZXR1cm47XG59O1xudmFyIHNlcGFyYXRlQ29tcG9uZW50cyA9IGZ1bmN0aW9uIHNlcGFyYXRlQ29tcG9uZW50cyhsYXlvdXRJbmZvLCBvcHRpb25zKSB7XG4gIHZhciBub2RlcyA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXM7XG4gIHZhciBjb21wb25lbnRzID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbm9kZSA9IG5vZGVzW2ldO1xuICAgIHZhciBjaWQgPSBub2RlLmNtcHRJZDtcbiAgICB2YXIgY29tcG9uZW50ID0gY29tcG9uZW50c1tjaWRdID0gY29tcG9uZW50c1tjaWRdIHx8IFtdO1xuICAgIGNvbXBvbmVudC5wdXNoKG5vZGUpO1xuICB9XG4gIHZhciB0b3RhbEEgPSAwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbXBvbmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgYyA9IGNvbXBvbmVudHNbaV07XG4gICAgaWYgKCFjKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgYy54MSA9IEluZmluaXR5O1xuICAgIGMueDIgPSAtSW5maW5pdHk7XG4gICAgYy55MSA9IEluZmluaXR5O1xuICAgIGMueTIgPSAtSW5maW5pdHk7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBjLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgbiA9IGNbal07XG4gICAgICBjLngxID0gTWF0aC5taW4oYy54MSwgbi5wb3NpdGlvblggLSBuLndpZHRoIC8gMik7XG4gICAgICBjLngyID0gTWF0aC5tYXgoYy54Miwgbi5wb3NpdGlvblggKyBuLndpZHRoIC8gMik7XG4gICAgICBjLnkxID0gTWF0aC5taW4oYy55MSwgbi5wb3NpdGlvblkgLSBuLmhlaWdodCAvIDIpO1xuICAgICAgYy55MiA9IE1hdGgubWF4KGMueTIsIG4ucG9zaXRpb25ZICsgbi5oZWlnaHQgLyAyKTtcbiAgICB9XG4gICAgYy53ID0gYy54MiAtIGMueDE7XG4gICAgYy5oID0gYy55MiAtIGMueTE7XG4gICAgdG90YWxBICs9IGMudyAqIGMuaDtcbiAgfVxuICBjb21wb25lbnRzLnNvcnQoZnVuY3Rpb24gKGMxLCBjMikge1xuICAgIHJldHVybiBjMi53ICogYzIuaCAtIGMxLncgKiBjMS5oO1xuICB9KTtcbiAgdmFyIHggPSAwO1xuICB2YXIgeSA9IDA7XG4gIHZhciB1c2VkVyA9IDA7XG4gIHZhciByb3dIID0gMDtcbiAgdmFyIG1heFJvd1cgPSBNYXRoLnNxcnQodG90YWxBKSAqIGxheW91dEluZm8uY2xpZW50V2lkdGggLyBsYXlvdXRJbmZvLmNsaWVudEhlaWdodDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21wb25lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGMgPSBjb21wb25lbnRzW2ldO1xuICAgIGlmICghYykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgYy5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIG4gPSBjW2pdO1xuICAgICAgaWYgKCFuLmlzTG9ja2VkKSB7XG4gICAgICAgIG4ucG9zaXRpb25YICs9IHggLSBjLngxO1xuICAgICAgICBuLnBvc2l0aW9uWSArPSB5IC0gYy55MTtcbiAgICAgIH1cbiAgICB9XG4gICAgeCArPSBjLncgKyBvcHRpb25zLmNvbXBvbmVudFNwYWNpbmc7XG4gICAgdXNlZFcgKz0gYy53ICsgb3B0aW9ucy5jb21wb25lbnRTcGFjaW5nO1xuICAgIHJvd0ggPSBNYXRoLm1heChyb3dILCBjLmgpO1xuICAgIGlmICh1c2VkVyA+IG1heFJvd1cpIHtcbiAgICAgIHkgKz0gcm93SCArIG9wdGlvbnMuY29tcG9uZW50U3BhY2luZztcbiAgICAgIHggPSAwO1xuICAgICAgdXNlZFcgPSAwO1xuICAgICAgcm93SCA9IDA7XG4gICAgfVxuICB9XG59O1xuXG52YXIgZGVmYXVsdHMkMyA9IHtcbiAgZml0OiB0cnVlLFxuICAvLyB3aGV0aGVyIHRvIGZpdCB0aGUgdmlld3BvcnQgdG8gdGhlIGdyYXBoXG4gIHBhZGRpbmc6IDMwLFxuICAvLyBwYWRkaW5nIHVzZWQgb24gZml0XG4gIGJvdW5kaW5nQm94OiB1bmRlZmluZWQsXG4gIC8vIGNvbnN0cmFpbiBsYXlvdXQgYm91bmRzOyB7IHgxLCB5MSwgeDIsIHkyIH0gb3IgeyB4MSwgeTEsIHcsIGggfVxuICBhdm9pZE92ZXJsYXA6IHRydWUsXG4gIC8vIHByZXZlbnRzIG5vZGUgb3ZlcmxhcCwgbWF5IG92ZXJmbG93IGJvdW5kaW5nQm94IGlmIG5vdCBlbm91Z2ggc3BhY2VcbiAgYXZvaWRPdmVybGFwUGFkZGluZzogMTAsXG4gIC8vIGV4dHJhIHNwYWNpbmcgYXJvdW5kIG5vZGVzIHdoZW4gYXZvaWRPdmVybGFwOiB0cnVlXG4gIG5vZGVEaW1lbnNpb25zSW5jbHVkZUxhYmVsczogZmFsc2UsXG4gIC8vIEV4Y2x1ZGVzIHRoZSBsYWJlbCB3aGVuIGNhbGN1bGF0aW5nIG5vZGUgYm91bmRpbmcgYm94ZXMgZm9yIHRoZSBsYXlvdXQgYWxnb3JpdGhtXG4gIHNwYWNpbmdGYWN0b3I6IHVuZGVmaW5lZCxcbiAgLy8gQXBwbGllcyBhIG11bHRpcGxpY2F0aXZlIGZhY3RvciAoPjApIHRvIGV4cGFuZCBvciBjb21wcmVzcyB0aGUgb3ZlcmFsbCBhcmVhIHRoYXQgdGhlIG5vZGVzIHRha2UgdXBcbiAgY29uZGVuc2U6IGZhbHNlLFxuICAvLyB1c2VzIGFsbCBhdmFpbGFibGUgc3BhY2Ugb24gZmFsc2UsIHVzZXMgbWluaW1hbCBzcGFjZSBvbiB0cnVlXG4gIHJvd3M6IHVuZGVmaW5lZCxcbiAgLy8gZm9yY2UgbnVtIG9mIHJvd3MgaW4gdGhlIGdyaWRcbiAgY29sczogdW5kZWZpbmVkLFxuICAvLyBmb3JjZSBudW0gb2YgY29sdW1ucyBpbiB0aGUgZ3JpZFxuICBwb3NpdGlvbjogZnVuY3Rpb24gcG9zaXRpb24obm9kZSkge30sXG4gIC8vIHJldHVybnMgeyByb3csIGNvbCB9IGZvciBlbGVtZW50XG4gIHNvcnQ6IHVuZGVmaW5lZCxcbiAgLy8gYSBzb3J0aW5nIGZ1bmN0aW9uIHRvIG9yZGVyIHRoZSBub2RlczsgZS5nLiBmdW5jdGlvbihhLCBiKXsgcmV0dXJuIGEuZGF0YSgnd2VpZ2h0JykgLSBiLmRhdGEoJ3dlaWdodCcpIH1cbiAgYW5pbWF0ZTogZmFsc2UsXG4gIC8vIHdoZXRoZXIgdG8gdHJhbnNpdGlvbiB0aGUgbm9kZSBwb3NpdGlvbnNcbiAgYW5pbWF0aW9uRHVyYXRpb246IDUwMCxcbiAgLy8gZHVyYXRpb24gb2YgYW5pbWF0aW9uIGluIG1zIGlmIGVuYWJsZWRcbiAgYW5pbWF0aW9uRWFzaW5nOiB1bmRlZmluZWQsXG4gIC8vIGVhc2luZyBvZiBhbmltYXRpb24gaWYgZW5hYmxlZFxuICBhbmltYXRlRmlsdGVyOiBmdW5jdGlvbiBhbmltYXRlRmlsdGVyKG5vZGUsIGkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgLy8gYSBmdW5jdGlvbiB0aGF0IGRldGVybWluZXMgd2hldGhlciB0aGUgbm9kZSBzaG91bGQgYmUgYW5pbWF0ZWQuICBBbGwgbm9kZXMgYW5pbWF0ZWQgYnkgZGVmYXVsdCBvbiBhbmltYXRlIGVuYWJsZWQuICBOb24tYW5pbWF0ZWQgbm9kZXMgYXJlIHBvc2l0aW9uZWQgaW1tZWRpYXRlbHkgd2hlbiB0aGUgbGF5b3V0IHN0YXJ0c1xuICByZWFkeTogdW5kZWZpbmVkLFxuICAvLyBjYWxsYmFjayBvbiBsYXlvdXRyZWFkeVxuICBzdG9wOiB1bmRlZmluZWQsXG4gIC8vIGNhbGxiYWNrIG9uIGxheW91dHN0b3BcbiAgdHJhbnNmb3JtOiBmdW5jdGlvbiB0cmFuc2Zvcm0obm9kZSwgcG9zaXRpb24pIHtcbiAgICByZXR1cm4gcG9zaXRpb247XG4gIH0gLy8gdHJhbnNmb3JtIGEgZ2l2ZW4gbm9kZSBwb3NpdGlvbi4gVXNlZnVsIGZvciBjaGFuZ2luZyBmbG93IGRpcmVjdGlvbiBpbiBkaXNjcmV0ZSBsYXlvdXRzIFxufTtcbmZ1bmN0aW9uIEdyaWRMYXlvdXQob3B0aW9ucykge1xuICB0aGlzLm9wdGlvbnMgPSBleHRlbmQoe30sIGRlZmF1bHRzJDMsIG9wdGlvbnMpO1xufVxuR3JpZExheW91dC5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICB2YXIgcGFyYW1zID0gdGhpcy5vcHRpb25zO1xuICB2YXIgb3B0aW9ucyA9IHBhcmFtcztcbiAgdmFyIGN5ID0gcGFyYW1zLmN5O1xuICB2YXIgZWxlcyA9IG9wdGlvbnMuZWxlcztcbiAgdmFyIG5vZGVzID0gZWxlcy5ub2RlcygpLm5vdCgnOnBhcmVudCcpO1xuICBpZiAob3B0aW9ucy5zb3J0KSB7XG4gICAgbm9kZXMgPSBub2Rlcy5zb3J0KG9wdGlvbnMuc29ydCk7XG4gIH1cbiAgdmFyIGJiID0gbWFrZUJvdW5kaW5nQm94KG9wdGlvbnMuYm91bmRpbmdCb3ggPyBvcHRpb25zLmJvdW5kaW5nQm94IDoge1xuICAgIHgxOiAwLFxuICAgIHkxOiAwLFxuICAgIHc6IGN5LndpZHRoKCksXG4gICAgaDogY3kuaGVpZ2h0KClcbiAgfSk7XG4gIGlmIChiYi5oID09PSAwIHx8IGJiLncgPT09IDApIHtcbiAgICBlbGVzLm5vZGVzKCkubGF5b3V0UG9zaXRpb25zKHRoaXMsIG9wdGlvbnMsIGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IGJiLngxLFxuICAgICAgICB5OiBiYi55MVxuICAgICAgfTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICAvLyB3aWR0aC9oZWlnaHQgKiBzcGxpdHNeMiA9IGNlbGxzIHdoZXJlIHNwbGl0cyBpcyBudW1iZXIgb2YgdGltZXMgdG8gc3BsaXQgd2lkdGhcbiAgICB2YXIgY2VsbHMgPSBub2Rlcy5zaXplKCk7XG4gICAgdmFyIHNwbGl0cyA9IE1hdGguc3FydChjZWxscyAqIGJiLmggLyBiYi53KTtcbiAgICB2YXIgcm93cyA9IE1hdGgucm91bmQoc3BsaXRzKTtcbiAgICB2YXIgY29scyA9IE1hdGgucm91bmQoYmIudyAvIGJiLmggKiBzcGxpdHMpO1xuICAgIHZhciBzbWFsbCA9IGZ1bmN0aW9uIHNtYWxsKHZhbCkge1xuICAgICAgaWYgKHZhbCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBNYXRoLm1pbihyb3dzLCBjb2xzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBtaW4gPSBNYXRoLm1pbihyb3dzLCBjb2xzKTtcbiAgICAgICAgaWYgKG1pbiA9PSByb3dzKSB7XG4gICAgICAgICAgcm93cyA9IHZhbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb2xzID0gdmFsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICB2YXIgbGFyZ2UgPSBmdW5jdGlvbiBsYXJnZSh2YWwpIHtcbiAgICAgIGlmICh2YWwgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gTWF0aC5tYXgocm93cywgY29scyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgbWF4ID0gTWF0aC5tYXgocm93cywgY29scyk7XG4gICAgICAgIGlmIChtYXggPT0gcm93cykge1xuICAgICAgICAgIHJvd3MgPSB2YWw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29scyA9IHZhbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgdmFyIG9Sb3dzID0gb3B0aW9ucy5yb3dzO1xuICAgIHZhciBvQ29scyA9IG9wdGlvbnMuY29scyAhPSBudWxsID8gb3B0aW9ucy5jb2xzIDogb3B0aW9ucy5jb2x1bW5zO1xuXG4gICAgLy8gaWYgcm93cyBvciBjb2x1bW5zIHdlcmUgc2V0IGluIG9wdGlvbnMsIHVzZSB0aG9zZSB2YWx1ZXNcbiAgICBpZiAob1Jvd3MgIT0gbnVsbCAmJiBvQ29scyAhPSBudWxsKSB7XG4gICAgICByb3dzID0gb1Jvd3M7XG4gICAgICBjb2xzID0gb0NvbHM7XG4gICAgfSBlbHNlIGlmIChvUm93cyAhPSBudWxsICYmIG9Db2xzID09IG51bGwpIHtcbiAgICAgIHJvd3MgPSBvUm93cztcbiAgICAgIGNvbHMgPSBNYXRoLmNlaWwoY2VsbHMgLyByb3dzKTtcbiAgICB9IGVsc2UgaWYgKG9Sb3dzID09IG51bGwgJiYgb0NvbHMgIT0gbnVsbCkge1xuICAgICAgY29scyA9IG9Db2xzO1xuICAgICAgcm93cyA9IE1hdGguY2VpbChjZWxscyAvIGNvbHMpO1xuICAgIH1cblxuICAgIC8vIG90aGVyd2lzZSB1c2UgdGhlIGF1dG9tYXRpYyB2YWx1ZXMgYW5kIGFkanVzdCBhY2NvcmRpbmdseVxuXG4gICAgLy8gaWYgcm91bmRpbmcgd2FzIHVwLCBzZWUgaWYgd2UgY2FuIHJlZHVjZSByb3dzIG9yIGNvbHVtbnNcbiAgICBlbHNlIGlmIChjb2xzICogcm93cyA+IGNlbGxzKSB7XG4gICAgICB2YXIgc20gPSBzbWFsbCgpO1xuICAgICAgdmFyIGxnID0gbGFyZ2UoKTtcblxuICAgICAgLy8gcmVkdWNpbmcgdGhlIHNtYWxsIHNpZGUgdGFrZXMgYXdheSB0aGUgbW9zdCBjZWxscywgc28gdHJ5IGl0IGZpcnN0XG4gICAgICBpZiAoKHNtIC0gMSkgKiBsZyA+PSBjZWxscykge1xuICAgICAgICBzbWFsbChzbSAtIDEpO1xuICAgICAgfSBlbHNlIGlmICgobGcgLSAxKSAqIHNtID49IGNlbGxzKSB7XG4gICAgICAgIGxhcmdlKGxnIC0gMSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGlmIHJvdW5kaW5nIHdhcyB0b28gbG93LCBhZGQgcm93cyBvciBjb2x1bW5zXG4gICAgICB3aGlsZSAoY29scyAqIHJvd3MgPCBjZWxscykge1xuICAgICAgICB2YXIgX3NtID0gc21hbGwoKTtcbiAgICAgICAgdmFyIF9sZyA9IGxhcmdlKCk7XG5cbiAgICAgICAgLy8gdHJ5IHRvIGFkZCB0byBsYXJnZXIgc2lkZSBmaXJzdCAoYWRkcyBsZXNzIGluIG11bHRpcGxpY2F0aW9uKVxuICAgICAgICBpZiAoKF9sZyArIDEpICogX3NtID49IGNlbGxzKSB7XG4gICAgICAgICAgbGFyZ2UoX2xnICsgMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc21hbGwoX3NtICsgMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIGNlbGxXaWR0aCA9IGJiLncgLyBjb2xzO1xuICAgIHZhciBjZWxsSGVpZ2h0ID0gYmIuaCAvIHJvd3M7XG4gICAgaWYgKG9wdGlvbnMuY29uZGVuc2UpIHtcbiAgICAgIGNlbGxXaWR0aCA9IDA7XG4gICAgICBjZWxsSGVpZ2h0ID0gMDtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuYXZvaWRPdmVybGFwKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBub2RlID0gbm9kZXNbaV07XG4gICAgICAgIHZhciBwb3MgPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uO1xuICAgICAgICBpZiAocG9zLnggPT0gbnVsbCB8fCBwb3MueSA9PSBudWxsKSB7XG4gICAgICAgICAgLy8gZm9yIGJiXG4gICAgICAgICAgcG9zLnggPSAwO1xuICAgICAgICAgIHBvcy55ID0gMDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbmJiID0gbm9kZS5sYXlvdXREaW1lbnNpb25zKG9wdGlvbnMpO1xuICAgICAgICB2YXIgcCA9IG9wdGlvbnMuYXZvaWRPdmVybGFwUGFkZGluZztcbiAgICAgICAgdmFyIHcgPSBuYmIudyArIHA7XG4gICAgICAgIHZhciBoID0gbmJiLmggKyBwO1xuICAgICAgICBjZWxsV2lkdGggPSBNYXRoLm1heChjZWxsV2lkdGgsIHcpO1xuICAgICAgICBjZWxsSGVpZ2h0ID0gTWF0aC5tYXgoY2VsbEhlaWdodCwgaCk7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBjZWxsVXNlZCA9IHt9OyAvLyBlLmcuICdjLTAtMicgPT4gdHJ1ZVxuXG4gICAgdmFyIHVzZWQgPSBmdW5jdGlvbiB1c2VkKHJvdywgY29sKSB7XG4gICAgICByZXR1cm4gY2VsbFVzZWRbJ2MtJyArIHJvdyArICctJyArIGNvbF0gPyB0cnVlIDogZmFsc2U7XG4gICAgfTtcbiAgICB2YXIgdXNlID0gZnVuY3Rpb24gdXNlKHJvdywgY29sKSB7XG4gICAgICBjZWxsVXNlZFsnYy0nICsgcm93ICsgJy0nICsgY29sXSA9IHRydWU7XG4gICAgfTtcblxuICAgIC8vIHRvIGtlZXAgdHJhY2sgb2YgY3VycmVudCBjZWxsIHBvc2l0aW9uXG4gICAgdmFyIHJvdyA9IDA7XG4gICAgdmFyIGNvbCA9IDA7XG4gICAgdmFyIG1vdmVUb05leHRDZWxsID0gZnVuY3Rpb24gbW92ZVRvTmV4dENlbGwoKSB7XG4gICAgICBjb2wrKztcbiAgICAgIGlmIChjb2wgPj0gY29scykge1xuICAgICAgICBjb2wgPSAwO1xuICAgICAgICByb3crKztcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gZ2V0IGEgY2FjaGUgb2YgYWxsIHRoZSBtYW51YWwgcG9zaXRpb25zXG4gICAgdmFyIGlkMm1hblBvcyA9IHt9O1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBub2Rlcy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBfbm9kZSA9IG5vZGVzW19pXTtcbiAgICAgIHZhciByY1BvcyA9IG9wdGlvbnMucG9zaXRpb24oX25vZGUpO1xuICAgICAgaWYgKHJjUG9zICYmIChyY1Bvcy5yb3cgIT09IHVuZGVmaW5lZCB8fCByY1Bvcy5jb2wgIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgLy8gbXVzdCBoYXZlIGF0IGxlYXN0IHJvdyBvciBjb2wgZGVmJ2RcbiAgICAgICAgdmFyIF9wb3MgPSB7XG4gICAgICAgICAgcm93OiByY1Bvcy5yb3csXG4gICAgICAgICAgY29sOiByY1Bvcy5jb2xcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKF9wb3MuY29sID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBmaW5kIHVudXNlZCBjb2xcbiAgICAgICAgICBfcG9zLmNvbCA9IDA7XG4gICAgICAgICAgd2hpbGUgKHVzZWQoX3Bvcy5yb3csIF9wb3MuY29sKSkge1xuICAgICAgICAgICAgX3Bvcy5jb2wrKztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoX3Bvcy5yb3cgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIGZpbmQgdW51c2VkIHJvd1xuICAgICAgICAgIF9wb3Mucm93ID0gMDtcbiAgICAgICAgICB3aGlsZSAodXNlZChfcG9zLnJvdywgX3Bvcy5jb2wpKSB7XG4gICAgICAgICAgICBfcG9zLnJvdysrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZDJtYW5Qb3NbX25vZGUuaWQoKV0gPSBfcG9zO1xuICAgICAgICB1c2UoX3Bvcy5yb3csIF9wb3MuY29sKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIGdldFBvcyA9IGZ1bmN0aW9uIGdldFBvcyhlbGVtZW50LCBpKSB7XG4gICAgICB2YXIgeCwgeTtcbiAgICAgIGlmIChlbGVtZW50LmxvY2tlZCgpIHx8IGVsZW1lbnQuaXNQYXJlbnQoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIHNlZSBpZiB3ZSBoYXZlIGEgbWFudWFsIHBvc2l0aW9uIHNldFxuICAgICAgdmFyIHJjUG9zID0gaWQybWFuUG9zW2VsZW1lbnQuaWQoKV07XG4gICAgICBpZiAocmNQb3MpIHtcbiAgICAgICAgeCA9IHJjUG9zLmNvbCAqIGNlbGxXaWR0aCArIGNlbGxXaWR0aCAvIDIgKyBiYi54MTtcbiAgICAgICAgeSA9IHJjUG9zLnJvdyAqIGNlbGxIZWlnaHQgKyBjZWxsSGVpZ2h0IC8gMiArIGJiLnkxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gb3RoZXJ3aXNlIHNldCBhdXRvbWF0aWNhbGx5XG5cbiAgICAgICAgd2hpbGUgKHVzZWQocm93LCBjb2wpKSB7XG4gICAgICAgICAgbW92ZVRvTmV4dENlbGwoKTtcbiAgICAgICAgfVxuICAgICAgICB4ID0gY29sICogY2VsbFdpZHRoICsgY2VsbFdpZHRoIC8gMiArIGJiLngxO1xuICAgICAgICB5ID0gcm93ICogY2VsbEhlaWdodCArIGNlbGxIZWlnaHQgLyAyICsgYmIueTE7XG4gICAgICAgIHVzZShyb3csIGNvbCk7XG4gICAgICAgIG1vdmVUb05leHRDZWxsKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4OiB4LFxuICAgICAgICB5OiB5XG4gICAgICB9O1xuICAgIH07XG4gICAgbm9kZXMubGF5b3V0UG9zaXRpb25zKHRoaXMsIG9wdGlvbnMsIGdldFBvcyk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG59O1xuXG4vLyBkZWZhdWx0IGxheW91dCBvcHRpb25zXG52YXIgZGVmYXVsdHMkMiA9IHtcbiAgcmVhZHk6IGZ1bmN0aW9uIHJlYWR5KCkge30sXG4gIC8vIG9uIGxheW91dHJlYWR5XG4gIHN0b3A6IGZ1bmN0aW9uIHN0b3AoKSB7fSAvLyBvbiBsYXlvdXRzdG9wXG59O1xuXG4vLyBjb25zdHJ1Y3RvclxuLy8gb3B0aW9ucyA6IG9iamVjdCBjb250YWluaW5nIGxheW91dCBvcHRpb25zXG5mdW5jdGlvbiBOdWxsTGF5b3V0KG9wdGlvbnMpIHtcbiAgdGhpcy5vcHRpb25zID0gZXh0ZW5kKHt9LCBkZWZhdWx0cyQyLCBvcHRpb25zKTtcbn1cblxuLy8gcnVucyB0aGUgbGF5b3V0XG5OdWxsTGF5b3V0LnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICB2YXIgZWxlcyA9IG9wdGlvbnMuZWxlczsgLy8gZWxlbWVudHMgdG8gY29uc2lkZXIgaW4gdGhlIGxheW91dFxuICB2YXIgbGF5b3V0ID0gdGhpcztcblxuICAvLyBjeSBpcyBhdXRvbWF0aWNhbGx5IHBvcHVsYXRlZCBmb3IgdXMgaW4gdGhlIGNvbnN0cnVjdG9yXG4gIC8vIChkaXNhYmxlIGVzbGludCBmb3IgbmV4dCBsaW5lIGFzIHRoaXMgc2VydmVzIGFzIGV4YW1wbGUgbGF5b3V0IGNvZGUgdG8gZXh0ZXJuYWwgZGV2ZWxvcGVycylcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIG9wdGlvbnMuY3k7XG4gIGxheW91dC5lbWl0KCdsYXlvdXRzdGFydCcpO1xuXG4gIC8vIHB1dHMgYWxsIG5vZGVzIGF0ICgwLCAwKVxuICAvLyBuLmIuIG1vc3QgbGF5b3V0cyB3b3VsZCB1c2UgbGF5b3V0UG9zaXRpb25zKCksIGluc3RlYWQgb2YgcG9zaXRpb25zKCkgYW5kIG1hbnVhbCBldmVudHNcbiAgZWxlcy5ub2RlcygpLnBvc2l0aW9ucyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IDAsXG4gICAgICB5OiAwXG4gICAgfTtcbiAgfSk7XG5cbiAgLy8gdHJpZ2dlciBsYXlvdXRyZWFkeSB3aGVuIGVhY2ggbm9kZSBoYXMgaGFkIGl0cyBwb3NpdGlvbiBzZXQgYXQgbGVhc3Qgb25jZVxuICBsYXlvdXQub25lKCdsYXlvdXRyZWFkeScsIG9wdGlvbnMucmVhZHkpO1xuICBsYXlvdXQuZW1pdCgnbGF5b3V0cmVhZHknKTtcblxuICAvLyB0cmlnZ2VyIGxheW91dHN0b3Agd2hlbiB0aGUgbGF5b3V0IHN0b3BzIChlLmcuIGZpbmlzaGVzKVxuICBsYXlvdXQub25lKCdsYXlvdXRzdG9wJywgb3B0aW9ucy5zdG9wKTtcbiAgbGF5b3V0LmVtaXQoJ2xheW91dHN0b3AnKTtcbiAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG59O1xuXG4vLyBjYWxsZWQgb24gY29udGludW91cyBsYXlvdXRzIHRvIHN0b3AgdGhlbSBiZWZvcmUgdGhleSBmaW5pc2hcbk51bGxMYXlvdXQucHJvdG90eXBlLnN0b3AgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xufTtcblxudmFyIGRlZmF1bHRzJDEgPSB7XG4gIHBvc2l0aW9uczogdW5kZWZpbmVkLFxuICAvLyBtYXAgb2YgKG5vZGUgaWQpID0+IChwb3NpdGlvbiBvYmopOyBvciBmdW5jdGlvbihub2RlKXsgcmV0dXJuIHNvbVBvczsgfVxuICB6b29tOiB1bmRlZmluZWQsXG4gIC8vIHRoZSB6b29tIGxldmVsIHRvIHNldCAocHJvYiB3YW50IGZpdCA9IGZhbHNlIGlmIHNldClcbiAgcGFuOiB1bmRlZmluZWQsXG4gIC8vIHRoZSBwYW4gbGV2ZWwgdG8gc2V0IChwcm9iIHdhbnQgZml0ID0gZmFsc2UgaWYgc2V0KVxuICBmaXQ6IHRydWUsXG4gIC8vIHdoZXRoZXIgdG8gZml0IHRvIHZpZXdwb3J0XG4gIHBhZGRpbmc6IDMwLFxuICAvLyBwYWRkaW5nIG9uIGZpdFxuICBzcGFjaW5nRmFjdG9yOiB1bmRlZmluZWQsXG4gIC8vIEFwcGxpZXMgYSBtdWx0aXBsaWNhdGl2ZSBmYWN0b3IgKD4wKSB0byBleHBhbmQgb3IgY29tcHJlc3MgdGhlIG92ZXJhbGwgYXJlYSB0aGF0IHRoZSBub2RlcyB0YWtlIHVwXG4gIGFuaW1hdGU6IGZhbHNlLFxuICAvLyB3aGV0aGVyIHRvIHRyYW5zaXRpb24gdGhlIG5vZGUgcG9zaXRpb25zXG4gIGFuaW1hdGlvbkR1cmF0aW9uOiA1MDAsXG4gIC8vIGR1cmF0aW9uIG9mIGFuaW1hdGlvbiBpbiBtcyBpZiBlbmFibGVkXG4gIGFuaW1hdGlvbkVhc2luZzogdW5kZWZpbmVkLFxuICAvLyBlYXNpbmcgb2YgYW5pbWF0aW9uIGlmIGVuYWJsZWRcbiAgYW5pbWF0ZUZpbHRlcjogZnVuY3Rpb24gYW5pbWF0ZUZpbHRlcihub2RlLCBpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIC8vIGEgZnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIG5vZGUgc2hvdWxkIGJlIGFuaW1hdGVkLiAgQWxsIG5vZGVzIGFuaW1hdGVkIGJ5IGRlZmF1bHQgb24gYW5pbWF0ZSBlbmFibGVkLiAgTm9uLWFuaW1hdGVkIG5vZGVzIGFyZSBwb3NpdGlvbmVkIGltbWVkaWF0ZWx5IHdoZW4gdGhlIGxheW91dCBzdGFydHNcbiAgcmVhZHk6IHVuZGVmaW5lZCxcbiAgLy8gY2FsbGJhY2sgb24gbGF5b3V0cmVhZHlcbiAgc3RvcDogdW5kZWZpbmVkLFxuICAvLyBjYWxsYmFjayBvbiBsYXlvdXRzdG9wXG4gIHRyYW5zZm9ybTogZnVuY3Rpb24gdHJhbnNmb3JtKG5vZGUsIHBvc2l0aW9uKSB7XG4gICAgcmV0dXJuIHBvc2l0aW9uO1xuICB9IC8vIHRyYW5zZm9ybSBhIGdpdmVuIG5vZGUgcG9zaXRpb24uIFVzZWZ1bCBmb3IgY2hhbmdpbmcgZmxvdyBkaXJlY3Rpb24gaW4gZGlzY3JldGUgbGF5b3V0c1xufTtcbmZ1bmN0aW9uIFByZXNldExheW91dChvcHRpb25zKSB7XG4gIHRoaXMub3B0aW9ucyA9IGV4dGVuZCh7fSwgZGVmYXVsdHMkMSwgb3B0aW9ucyk7XG59XG5QcmVzZXRMYXlvdXQucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gIHZhciBlbGVzID0gb3B0aW9ucy5lbGVzO1xuICB2YXIgbm9kZXMgPSBlbGVzLm5vZGVzKCk7XG4gIHZhciBwb3NJc0ZuID0gZm4kNihvcHRpb25zLnBvc2l0aW9ucyk7XG4gIGZ1bmN0aW9uIGdldFBvc2l0aW9uKG5vZGUpIHtcbiAgICBpZiAob3B0aW9ucy5wb3NpdGlvbnMgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGNvcHlQb3NpdGlvbihub2RlLnBvc2l0aW9uKCkpO1xuICAgIH1cbiAgICBpZiAocG9zSXNGbikge1xuICAgICAgcmV0dXJuIG9wdGlvbnMucG9zaXRpb25zKG5vZGUpO1xuICAgIH1cbiAgICB2YXIgcG9zID0gb3B0aW9ucy5wb3NpdGlvbnNbbm9kZS5fcHJpdmF0ZS5kYXRhLmlkXTtcbiAgICBpZiAocG9zID09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gcG9zO1xuICB9XG4gIG5vZGVzLmxheW91dFBvc2l0aW9ucyh0aGlzLCBvcHRpb25zLCBmdW5jdGlvbiAobm9kZSwgaSkge1xuICAgIHZhciBwb3NpdGlvbiA9IGdldFBvc2l0aW9uKG5vZGUpO1xuICAgIGlmIChub2RlLmxvY2tlZCgpIHx8IHBvc2l0aW9uID09IG51bGwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHBvc2l0aW9uO1xuICB9KTtcbiAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG59O1xuXG52YXIgZGVmYXVsdHMgPSB7XG4gIGZpdDogdHJ1ZSxcbiAgLy8gd2hldGhlciB0byBmaXQgdG8gdmlld3BvcnRcbiAgcGFkZGluZzogMzAsXG4gIC8vIGZpdCBwYWRkaW5nXG4gIGJvdW5kaW5nQm94OiB1bmRlZmluZWQsXG4gIC8vIGNvbnN0cmFpbiBsYXlvdXQgYm91bmRzOyB7IHgxLCB5MSwgeDIsIHkyIH0gb3IgeyB4MSwgeTEsIHcsIGggfVxuICBhbmltYXRlOiBmYWxzZSxcbiAgLy8gd2hldGhlciB0byB0cmFuc2l0aW9uIHRoZSBub2RlIHBvc2l0aW9uc1xuICBhbmltYXRpb25EdXJhdGlvbjogNTAwLFxuICAvLyBkdXJhdGlvbiBvZiBhbmltYXRpb24gaW4gbXMgaWYgZW5hYmxlZFxuICBhbmltYXRpb25FYXNpbmc6IHVuZGVmaW5lZCxcbiAgLy8gZWFzaW5nIG9mIGFuaW1hdGlvbiBpZiBlbmFibGVkXG4gIGFuaW1hdGVGaWx0ZXI6IGZ1bmN0aW9uIGFuaW1hdGVGaWx0ZXIobm9kZSwgaSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICAvLyBhIGZ1bmN0aW9uIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBub2RlIHNob3VsZCBiZSBhbmltYXRlZC4gIEFsbCBub2RlcyBhbmltYXRlZCBieSBkZWZhdWx0IG9uIGFuaW1hdGUgZW5hYmxlZC4gIE5vbi1hbmltYXRlZCBub2RlcyBhcmUgcG9zaXRpb25lZCBpbW1lZGlhdGVseSB3aGVuIHRoZSBsYXlvdXQgc3RhcnRzXG4gIHJlYWR5OiB1bmRlZmluZWQsXG4gIC8vIGNhbGxiYWNrIG9uIGxheW91dHJlYWR5XG4gIHN0b3A6IHVuZGVmaW5lZCxcbiAgLy8gY2FsbGJhY2sgb24gbGF5b3V0c3RvcFxuICB0cmFuc2Zvcm06IGZ1bmN0aW9uIHRyYW5zZm9ybShub2RlLCBwb3NpdGlvbikge1xuICAgIHJldHVybiBwb3NpdGlvbjtcbiAgfSAvLyB0cmFuc2Zvcm0gYSBnaXZlbiBub2RlIHBvc2l0aW9uLiBVc2VmdWwgZm9yIGNoYW5naW5nIGZsb3cgZGlyZWN0aW9uIGluIGRpc2NyZXRlIGxheW91dHMgXG59O1xuZnVuY3Rpb24gUmFuZG9tTGF5b3V0KG9wdGlvbnMpIHtcbiAgdGhpcy5vcHRpb25zID0gZXh0ZW5kKHt9LCBkZWZhdWx0cywgb3B0aW9ucyk7XG59XG5SYW5kb21MYXlvdXQucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gIHZhciBjeSA9IG9wdGlvbnMuY3k7XG4gIHZhciBlbGVzID0gb3B0aW9ucy5lbGVzO1xuICB2YXIgYmIgPSBtYWtlQm91bmRpbmdCb3gob3B0aW9ucy5ib3VuZGluZ0JveCA/IG9wdGlvbnMuYm91bmRpbmdCb3ggOiB7XG4gICAgeDE6IDAsXG4gICAgeTE6IDAsXG4gICAgdzogY3kud2lkdGgoKSxcbiAgICBoOiBjeS5oZWlnaHQoKVxuICB9KTtcbiAgdmFyIGdldFBvcyA9IGZ1bmN0aW9uIGdldFBvcyhub2RlLCBpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IGJiLngxICsgTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpICogYmIudyksXG4gICAgICB5OiBiYi55MSArIE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSAqIGJiLmgpXG4gICAgfTtcbiAgfTtcbiAgZWxlcy5ub2RlcygpLmxheW91dFBvc2l0aW9ucyh0aGlzLCBvcHRpb25zLCBnZXRQb3MpO1xuICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbn07XG5cbnZhciBsYXlvdXQgPSBbe1xuICBuYW1lOiAnYnJlYWR0aGZpcnN0JyxcbiAgaW1wbDogQnJlYWR0aEZpcnN0TGF5b3V0XG59LCB7XG4gIG5hbWU6ICdjaXJjbGUnLFxuICBpbXBsOiBDaXJjbGVMYXlvdXRcbn0sIHtcbiAgbmFtZTogJ2NvbmNlbnRyaWMnLFxuICBpbXBsOiBDb25jZW50cmljTGF5b3V0XG59LCB7XG4gIG5hbWU6ICdjb3NlJyxcbiAgaW1wbDogQ29zZUxheW91dFxufSwge1xuICBuYW1lOiAnZ3JpZCcsXG4gIGltcGw6IEdyaWRMYXlvdXRcbn0sIHtcbiAgbmFtZTogJ251bGwnLFxuICBpbXBsOiBOdWxsTGF5b3V0XG59LCB7XG4gIG5hbWU6ICdwcmVzZXQnLFxuICBpbXBsOiBQcmVzZXRMYXlvdXRcbn0sIHtcbiAgbmFtZTogJ3JhbmRvbScsXG4gIGltcGw6IFJhbmRvbUxheW91dFxufV07XG5cbmZ1bmN0aW9uIE51bGxSZW5kZXJlcihvcHRpb25zKSB7XG4gIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gIHRoaXMubm90aWZpY2F0aW9ucyA9IDA7IC8vIGZvciB0ZXN0aW5nXG59XG52YXIgbm9vcCA9IGZ1bmN0aW9uIG5vb3AoKSB7fTtcbnZhciB0aHJvd0ltZ0VyciA9IGZ1bmN0aW9uIHRocm93SW1nRXJyKCkge1xuICB0aHJvdyBuZXcgRXJyb3IoJ0EgaGVhZGxlc3MgaW5zdGFuY2UgY2FuIG5vdCByZW5kZXIgaW1hZ2VzJyk7XG59O1xuTnVsbFJlbmRlcmVyLnByb3RvdHlwZSA9IHtcbiAgcmVjYWxjdWxhdGVSZW5kZXJlZFN0eWxlOiBub29wLFxuICBub3RpZnk6IGZ1bmN0aW9uIG5vdGlmeSgpIHtcbiAgICB0aGlzLm5vdGlmaWNhdGlvbnMrKztcbiAgfSxcbiAgaW5pdDogbm9vcCxcbiAgaXNIZWFkbGVzczogZnVuY3Rpb24gaXNIZWFkbGVzcygpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgcG5nOiB0aHJvd0ltZ0VycixcbiAganBnOiB0aHJvd0ltZ0VyclxufTtcblxudmFyIEJScCRmID0ge307XG5CUnAkZi5hcnJvd1NoYXBlV2lkdGggPSAwLjM7XG5CUnAkZi5yZWdpc3RlckFycm93U2hhcGVzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgYXJyb3dTaGFwZXMgPSB0aGlzLmFycm93U2hhcGVzID0ge307XG4gIHZhciByZW5kZXJlciA9IHRoaXM7XG5cbiAgLy8gQ29udHJhY3QgZm9yIGFycm93IHNoYXBlczpcbiAgLy8gMCwgMCBpcyBhcnJvdyB0aXBcbiAgLy8gKDAsIDEpIGlzIGRpcmVjdGlvbiB0b3dhcmRzIG5vZGVcbiAgLy8gKDEsIDApIGlzIHJpZ2h0XG4gIC8vXG4gIC8vIGZ1bmN0aW9uYWwgYXBpOlxuICAvLyBjb2xsaWRlOiBjaGVjayB4LCB5IGluIHNoYXBlXG4gIC8vIHJvdWdoQ29sbGlkZTogY2FsbGVkIGJlZm9yZSBjb2xsaWRlLCBubyBmYWxzZSBuZWdhdGl2ZXNcbiAgLy8gZHJhdzogZHJhd1xuICAvLyBzcGFjaW5nOiBkaXN0KGFycm93VGlwLCBub2RlQm91bmRhcnkpXG4gIC8vIGdhcDogZGlzdChlZGdlVGlwLCBub2RlQm91bmRhcnkpLCBlZGdlVGlwIG1heSAhPSBhcnJvd1RpcFxuXG4gIHZhciBiYkNvbGxpZGUgPSBmdW5jdGlvbiBiYkNvbGxpZGUoeCwgeSwgc2l6ZSwgYW5nbGUsIHRyYW5zbGF0aW9uLCBlZGdlV2lkdGgsIHBhZGRpbmcpIHtcbiAgICB2YXIgeDEgPSB0cmFuc2xhdGlvbi54IC0gc2l6ZSAvIDIgLSBwYWRkaW5nO1xuICAgIHZhciB4MiA9IHRyYW5zbGF0aW9uLnggKyBzaXplIC8gMiArIHBhZGRpbmc7XG4gICAgdmFyIHkxID0gdHJhbnNsYXRpb24ueSAtIHNpemUgLyAyIC0gcGFkZGluZztcbiAgICB2YXIgeTIgPSB0cmFuc2xhdGlvbi55ICsgc2l6ZSAvIDIgKyBwYWRkaW5nO1xuICAgIHZhciBpbnNpZGUgPSB4MSA8PSB4ICYmIHggPD0geDIgJiYgeTEgPD0geSAmJiB5IDw9IHkyO1xuICAgIHJldHVybiBpbnNpZGU7XG4gIH07XG4gIHZhciB0cmFuc2Zvcm0gPSBmdW5jdGlvbiB0cmFuc2Zvcm0oeCwgeSwgc2l6ZSwgYW5nbGUsIHRyYW5zbGF0aW9uKSB7XG4gICAgdmFyIHhSb3RhdGVkID0geCAqIE1hdGguY29zKGFuZ2xlKSAtIHkgKiBNYXRoLnNpbihhbmdsZSk7XG4gICAgdmFyIHlSb3RhdGVkID0geCAqIE1hdGguc2luKGFuZ2xlKSArIHkgKiBNYXRoLmNvcyhhbmdsZSk7XG4gICAgdmFyIHhTY2FsZWQgPSB4Um90YXRlZCAqIHNpemU7XG4gICAgdmFyIHlTY2FsZWQgPSB5Um90YXRlZCAqIHNpemU7XG4gICAgdmFyIHhUcmFuc2xhdGVkID0geFNjYWxlZCArIHRyYW5zbGF0aW9uLng7XG4gICAgdmFyIHlUcmFuc2xhdGVkID0geVNjYWxlZCArIHRyYW5zbGF0aW9uLnk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IHhUcmFuc2xhdGVkLFxuICAgICAgeTogeVRyYW5zbGF0ZWRcbiAgICB9O1xuICB9O1xuICB2YXIgdHJhbnNmb3JtUG9pbnRzID0gZnVuY3Rpb24gdHJhbnNmb3JtUG9pbnRzKHB0cywgc2l6ZSwgYW5nbGUsIHRyYW5zbGF0aW9uKSB7XG4gICAgdmFyIHJldFB0cyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHRzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICB2YXIgeCA9IHB0c1tpXTtcbiAgICAgIHZhciB5ID0gcHRzW2kgKyAxXTtcbiAgICAgIHJldFB0cy5wdXNoKHRyYW5zZm9ybSh4LCB5LCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24pKTtcbiAgICB9XG4gICAgcmV0dXJuIHJldFB0cztcbiAgfTtcbiAgdmFyIHBvaW50c1RvQXJyID0gZnVuY3Rpb24gcG9pbnRzVG9BcnIocHRzKSB7XG4gICAgdmFyIHJldCA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcCA9IHB0c1tpXTtcbiAgICAgIHJldC5wdXNoKHAueCwgcC55KTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfTtcbiAgdmFyIHN0YW5kYXJkR2FwID0gZnVuY3Rpb24gc3RhbmRhcmRHYXAoZWRnZSkge1xuICAgIHJldHVybiBlZGdlLnBzdHlsZSgnd2lkdGgnKS5wZlZhbHVlICogZWRnZS5wc3R5bGUoJ2Fycm93LXNjYWxlJykucGZWYWx1ZSAqIDI7XG4gIH07XG4gIHZhciBkZWZpbmVBcnJvd1NoYXBlID0gZnVuY3Rpb24gZGVmaW5lQXJyb3dTaGFwZShuYW1lLCBkZWZuKSB7XG4gICAgaWYgKHN0cmluZyhkZWZuKSkge1xuICAgICAgZGVmbiA9IGFycm93U2hhcGVzW2RlZm5dO1xuICAgIH1cbiAgICBhcnJvd1NoYXBlc1tuYW1lXSA9IGV4dGVuZCh7XG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgcG9pbnRzOiBbLTAuMTUsIC0wLjMsIDAuMTUsIC0wLjMsIDAuMTUsIDAuMywgLTAuMTUsIDAuM10sXG4gICAgICBjb2xsaWRlOiBmdW5jdGlvbiBjb2xsaWRlKHgsIHksIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbiwgcGFkZGluZykge1xuICAgICAgICB2YXIgcG9pbnRzID0gcG9pbnRzVG9BcnIodHJhbnNmb3JtUG9pbnRzKHRoaXMucG9pbnRzLCBzaXplICsgMiAqIHBhZGRpbmcsIGFuZ2xlLCB0cmFuc2xhdGlvbikpO1xuICAgICAgICB2YXIgaW5zaWRlID0gcG9pbnRJbnNpZGVQb2x5Z29uUG9pbnRzKHgsIHksIHBvaW50cyk7XG4gICAgICAgIHJldHVybiBpbnNpZGU7XG4gICAgICB9LFxuICAgICAgcm91Z2hDb2xsaWRlOiBiYkNvbGxpZGUsXG4gICAgICBkcmF3OiBmdW5jdGlvbiBkcmF3KGNvbnRleHQsIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbikge1xuICAgICAgICB2YXIgcG9pbnRzID0gdHJhbnNmb3JtUG9pbnRzKHRoaXMucG9pbnRzLCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24pO1xuICAgICAgICByZW5kZXJlci5hcnJvd1NoYXBlSW1wbCgncG9seWdvbicpKGNvbnRleHQsIHBvaW50cyk7XG4gICAgICB9LFxuICAgICAgc3BhY2luZzogZnVuY3Rpb24gc3BhY2luZyhlZGdlKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfSxcbiAgICAgIGdhcDogc3RhbmRhcmRHYXBcbiAgICB9LCBkZWZuKTtcbiAgfTtcbiAgZGVmaW5lQXJyb3dTaGFwZSgnbm9uZScsIHtcbiAgICBjb2xsaWRlOiBmYWxzaWZ5LFxuICAgIHJvdWdoQ29sbGlkZTogZmFsc2lmeSxcbiAgICBkcmF3OiBub29wJDEsXG4gICAgc3BhY2luZzogemVyb2lmeSxcbiAgICBnYXA6IHplcm9pZnlcbiAgfSk7XG4gIGRlZmluZUFycm93U2hhcGUoJ3RyaWFuZ2xlJywge1xuICAgIHBvaW50czogWy0wLjE1LCAtMC4zLCAwLCAwLCAwLjE1LCAtMC4zXVxuICB9KTtcbiAgZGVmaW5lQXJyb3dTaGFwZSgnYXJyb3cnLCAndHJpYW5nbGUnKTtcbiAgZGVmaW5lQXJyb3dTaGFwZSgndHJpYW5nbGUtYmFja2N1cnZlJywge1xuICAgIHBvaW50czogYXJyb3dTaGFwZXNbJ3RyaWFuZ2xlJ10ucG9pbnRzLFxuICAgIGNvbnRyb2xQb2ludDogWzAsIC0wLjE1XSxcbiAgICByb3VnaENvbGxpZGU6IGJiQ29sbGlkZSxcbiAgICBkcmF3OiBmdW5jdGlvbiBkcmF3KGNvbnRleHQsIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbiwgZWRnZVdpZHRoKSB7XG4gICAgICB2YXIgcHRzVHJhbnMgPSB0cmFuc2Zvcm1Qb2ludHModGhpcy5wb2ludHMsIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbik7XG4gICAgICB2YXIgY3RybFB0ID0gdGhpcy5jb250cm9sUG9pbnQ7XG4gICAgICB2YXIgY3RybFB0VHJhbnMgPSB0cmFuc2Zvcm0oY3RybFB0WzBdLCBjdHJsUHRbMV0sIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbik7XG4gICAgICByZW5kZXJlci5hcnJvd1NoYXBlSW1wbCh0aGlzLm5hbWUpKGNvbnRleHQsIHB0c1RyYW5zLCBjdHJsUHRUcmFucyk7XG4gICAgfSxcbiAgICBnYXA6IGZ1bmN0aW9uIGdhcChlZGdlKSB7XG4gICAgICByZXR1cm4gc3RhbmRhcmRHYXAoZWRnZSkgKiAwLjg7XG4gICAgfVxuICB9KTtcbiAgZGVmaW5lQXJyb3dTaGFwZSgndHJpYW5nbGUtdGVlJywge1xuICAgIHBvaW50czogWzAsIDAsIDAuMTUsIC0wLjMsIC0wLjE1LCAtMC4zLCAwLCAwXSxcbiAgICBwb2ludHNUZWU6IFstMC4xNSwgLTAuNCwgLTAuMTUsIC0wLjUsIDAuMTUsIC0wLjUsIDAuMTUsIC0wLjRdLFxuICAgIGNvbGxpZGU6IGZ1bmN0aW9uIGNvbGxpZGUoeCwgeSwgc2l6ZSwgYW5nbGUsIHRyYW5zbGF0aW9uLCBlZGdlV2lkdGgsIHBhZGRpbmcpIHtcbiAgICAgIHZhciB0cmlQdHMgPSBwb2ludHNUb0Fycih0cmFuc2Zvcm1Qb2ludHModGhpcy5wb2ludHMsIHNpemUgKyAyICogcGFkZGluZywgYW5nbGUsIHRyYW5zbGF0aW9uKSk7XG4gICAgICB2YXIgdGVlUHRzID0gcG9pbnRzVG9BcnIodHJhbnNmb3JtUG9pbnRzKHRoaXMucG9pbnRzVGVlLCBzaXplICsgMiAqIHBhZGRpbmcsIGFuZ2xlLCB0cmFuc2xhdGlvbikpO1xuICAgICAgdmFyIGluc2lkZSA9IHBvaW50SW5zaWRlUG9seWdvblBvaW50cyh4LCB5LCB0cmlQdHMpIHx8IHBvaW50SW5zaWRlUG9seWdvblBvaW50cyh4LCB5LCB0ZWVQdHMpO1xuICAgICAgcmV0dXJuIGluc2lkZTtcbiAgICB9LFxuICAgIGRyYXc6IGZ1bmN0aW9uIGRyYXcoY29udGV4dCwgc2l6ZSwgYW5nbGUsIHRyYW5zbGF0aW9uLCBlZGdlV2lkdGgpIHtcbiAgICAgIHZhciB0cmlQdHMgPSB0cmFuc2Zvcm1Qb2ludHModGhpcy5wb2ludHMsIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbik7XG4gICAgICB2YXIgdGVlUHRzID0gdHJhbnNmb3JtUG9pbnRzKHRoaXMucG9pbnRzVGVlLCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24pO1xuICAgICAgcmVuZGVyZXIuYXJyb3dTaGFwZUltcGwodGhpcy5uYW1lKShjb250ZXh0LCB0cmlQdHMsIHRlZVB0cyk7XG4gICAgfVxuICB9KTtcbiAgZGVmaW5lQXJyb3dTaGFwZSgnY2lyY2xlLXRyaWFuZ2xlJywge1xuICAgIHJhZGl1czogMC4xNSxcbiAgICBwb2ludHNUcjogWzAsIC0wLjE1LCAwLjE1LCAtMC40NSwgLTAuMTUsIC0wLjQ1LCAwLCAtMC4xNV0sXG4gICAgY29sbGlkZTogZnVuY3Rpb24gY29sbGlkZSh4LCB5LCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24sIGVkZ2VXaWR0aCwgcGFkZGluZykge1xuICAgICAgdmFyIHQgPSB0cmFuc2xhdGlvbjtcbiAgICAgIHZhciBjaXJjbGVJbnNpZGUgPSBNYXRoLnBvdyh0LnggLSB4LCAyKSArIE1hdGgucG93KHQueSAtIHksIDIpIDw9IE1hdGgucG93KChzaXplICsgMiAqIHBhZGRpbmcpICogdGhpcy5yYWRpdXMsIDIpO1xuICAgICAgdmFyIHRyaVB0cyA9IHBvaW50c1RvQXJyKHRyYW5zZm9ybVBvaW50cyh0aGlzLnBvaW50cywgc2l6ZSArIDIgKiBwYWRkaW5nLCBhbmdsZSwgdHJhbnNsYXRpb24pKTtcbiAgICAgIHJldHVybiBwb2ludEluc2lkZVBvbHlnb25Qb2ludHMoeCwgeSwgdHJpUHRzKSB8fCBjaXJjbGVJbnNpZGU7XG4gICAgfSxcbiAgICBkcmF3OiBmdW5jdGlvbiBkcmF3KGNvbnRleHQsIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbiwgZWRnZVdpZHRoKSB7XG4gICAgICB2YXIgdHJpUHRzID0gdHJhbnNmb3JtUG9pbnRzKHRoaXMucG9pbnRzVHIsIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbik7XG4gICAgICByZW5kZXJlci5hcnJvd1NoYXBlSW1wbCh0aGlzLm5hbWUpKGNvbnRleHQsIHRyaVB0cywgdHJhbnNsYXRpb24ueCwgdHJhbnNsYXRpb24ueSwgdGhpcy5yYWRpdXMgKiBzaXplKTtcbiAgICB9LFxuICAgIHNwYWNpbmc6IGZ1bmN0aW9uIHNwYWNpbmcoZWRnZSkge1xuICAgICAgcmV0dXJuIHJlbmRlcmVyLmdldEFycm93V2lkdGgoZWRnZS5wc3R5bGUoJ3dpZHRoJykucGZWYWx1ZSwgZWRnZS5wc3R5bGUoJ2Fycm93LXNjYWxlJykudmFsdWUpICogdGhpcy5yYWRpdXM7XG4gICAgfVxuICB9KTtcbiAgZGVmaW5lQXJyb3dTaGFwZSgndHJpYW5nbGUtY3Jvc3MnLCB7XG4gICAgcG9pbnRzOiBbMCwgMCwgMC4xNSwgLTAuMywgLTAuMTUsIC0wLjMsIDAsIDBdLFxuICAgIGJhc2VDcm9zc0xpbmVQdHM6IFstMC4xNSwgLTAuNCxcbiAgICAvLyBmaXJzdCBoYWxmIG9mIHRoZSByZWN0YW5nbGVcbiAgICAtMC4xNSwgLTAuNCwgMC4xNSwgLTAuNCxcbiAgICAvLyBzZWNvbmQgaGFsZiBvZiB0aGUgcmVjdGFuZ2xlXG4gICAgMC4xNSwgLTAuNF0sXG4gICAgY3Jvc3NMaW5lUHRzOiBmdW5jdGlvbiBjcm9zc0xpbmVQdHMoc2l6ZSwgZWRnZVdpZHRoKSB7XG4gICAgICAvLyBzaGlmdCBwb2ludHMgc28gdGhhdCB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgY3Jvc3MgcG9pbnRzIG1hdGNoZXMgZWRnZSB3aWR0aFxuICAgICAgdmFyIHAgPSB0aGlzLmJhc2VDcm9zc0xpbmVQdHMuc2xpY2UoKTtcbiAgICAgIHZhciBzaGlmdEZhY3RvciA9IGVkZ2VXaWR0aCAvIHNpemU7XG4gICAgICB2YXIgeTAgPSAzO1xuICAgICAgdmFyIHkxID0gNTtcbiAgICAgIHBbeTBdID0gcFt5MF0gLSBzaGlmdEZhY3RvcjtcbiAgICAgIHBbeTFdID0gcFt5MV0gLSBzaGlmdEZhY3RvcjtcbiAgICAgIHJldHVybiBwO1xuICAgIH0sXG4gICAgY29sbGlkZTogZnVuY3Rpb24gY29sbGlkZSh4LCB5LCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24sIGVkZ2VXaWR0aCwgcGFkZGluZykge1xuICAgICAgdmFyIHRyaVB0cyA9IHBvaW50c1RvQXJyKHRyYW5zZm9ybVBvaW50cyh0aGlzLnBvaW50cywgc2l6ZSArIDIgKiBwYWRkaW5nLCBhbmdsZSwgdHJhbnNsYXRpb24pKTtcbiAgICAgIHZhciB0ZWVQdHMgPSBwb2ludHNUb0Fycih0cmFuc2Zvcm1Qb2ludHModGhpcy5jcm9zc0xpbmVQdHMoc2l6ZSwgZWRnZVdpZHRoKSwgc2l6ZSArIDIgKiBwYWRkaW5nLCBhbmdsZSwgdHJhbnNsYXRpb24pKTtcbiAgICAgIHZhciBpbnNpZGUgPSBwb2ludEluc2lkZVBvbHlnb25Qb2ludHMoeCwgeSwgdHJpUHRzKSB8fCBwb2ludEluc2lkZVBvbHlnb25Qb2ludHMoeCwgeSwgdGVlUHRzKTtcbiAgICAgIHJldHVybiBpbnNpZGU7XG4gICAgfSxcbiAgICBkcmF3OiBmdW5jdGlvbiBkcmF3KGNvbnRleHQsIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbiwgZWRnZVdpZHRoKSB7XG4gICAgICB2YXIgdHJpUHRzID0gdHJhbnNmb3JtUG9pbnRzKHRoaXMucG9pbnRzLCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24pO1xuICAgICAgdmFyIGNyb3NzTGluZVB0cyA9IHRyYW5zZm9ybVBvaW50cyh0aGlzLmNyb3NzTGluZVB0cyhzaXplLCBlZGdlV2lkdGgpLCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24pO1xuICAgICAgcmVuZGVyZXIuYXJyb3dTaGFwZUltcGwodGhpcy5uYW1lKShjb250ZXh0LCB0cmlQdHMsIGNyb3NzTGluZVB0cyk7XG4gICAgfVxuICB9KTtcbiAgZGVmaW5lQXJyb3dTaGFwZSgndmVlJywge1xuICAgIHBvaW50czogWy0wLjE1LCAtMC4zLCAwLCAwLCAwLjE1LCAtMC4zLCAwLCAtMC4xNV0sXG4gICAgZ2FwOiBmdW5jdGlvbiBnYXAoZWRnZSkge1xuICAgICAgcmV0dXJuIHN0YW5kYXJkR2FwKGVkZ2UpICogMC41MjU7XG4gICAgfVxuICB9KTtcbiAgZGVmaW5lQXJyb3dTaGFwZSgnY2lyY2xlJywge1xuICAgIHJhZGl1czogMC4xNSxcbiAgICBjb2xsaWRlOiBmdW5jdGlvbiBjb2xsaWRlKHgsIHksIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbiwgZWRnZVdpZHRoLCBwYWRkaW5nKSB7XG4gICAgICB2YXIgdCA9IHRyYW5zbGF0aW9uO1xuICAgICAgdmFyIGluc2lkZSA9IE1hdGgucG93KHQueCAtIHgsIDIpICsgTWF0aC5wb3codC55IC0geSwgMikgPD0gTWF0aC5wb3coKHNpemUgKyAyICogcGFkZGluZykgKiB0aGlzLnJhZGl1cywgMik7XG4gICAgICByZXR1cm4gaW5zaWRlO1xuICAgIH0sXG4gICAgZHJhdzogZnVuY3Rpb24gZHJhdyhjb250ZXh0LCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24sIGVkZ2VXaWR0aCkge1xuICAgICAgcmVuZGVyZXIuYXJyb3dTaGFwZUltcGwodGhpcy5uYW1lKShjb250ZXh0LCB0cmFuc2xhdGlvbi54LCB0cmFuc2xhdGlvbi55LCB0aGlzLnJhZGl1cyAqIHNpemUpO1xuICAgIH0sXG4gICAgc3BhY2luZzogZnVuY3Rpb24gc3BhY2luZyhlZGdlKSB7XG4gICAgICByZXR1cm4gcmVuZGVyZXIuZ2V0QXJyb3dXaWR0aChlZGdlLnBzdHlsZSgnd2lkdGgnKS5wZlZhbHVlLCBlZGdlLnBzdHlsZSgnYXJyb3ctc2NhbGUnKS52YWx1ZSkgKiB0aGlzLnJhZGl1cztcbiAgICB9XG4gIH0pO1xuICBkZWZpbmVBcnJvd1NoYXBlKCd0ZWUnLCB7XG4gICAgcG9pbnRzOiBbLTAuMTUsIDAsIC0wLjE1LCAtMC4xLCAwLjE1LCAtMC4xLCAwLjE1LCAwXSxcbiAgICBzcGFjaW5nOiBmdW5jdGlvbiBzcGFjaW5nKGVkZ2UpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH0sXG4gICAgZ2FwOiBmdW5jdGlvbiBnYXAoZWRnZSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICB9KTtcbiAgZGVmaW5lQXJyb3dTaGFwZSgnc3F1YXJlJywge1xuICAgIHBvaW50czogWy0wLjE1LCAwLjAwLCAwLjE1LCAwLjAwLCAwLjE1LCAtMC4zLCAtMC4xNSwgLTAuM11cbiAgfSk7XG4gIGRlZmluZUFycm93U2hhcGUoJ2RpYW1vbmQnLCB7XG4gICAgcG9pbnRzOiBbLTAuMTUsIC0wLjE1LCAwLCAtMC4zLCAwLjE1LCAtMC4xNSwgMCwgMF0sXG4gICAgZ2FwOiBmdW5jdGlvbiBnYXAoZWRnZSkge1xuICAgICAgcmV0dXJuIGVkZ2UucHN0eWxlKCd3aWR0aCcpLnBmVmFsdWUgKiBlZGdlLnBzdHlsZSgnYXJyb3ctc2NhbGUnKS52YWx1ZTtcbiAgICB9XG4gIH0pO1xuICBkZWZpbmVBcnJvd1NoYXBlKCdjaGV2cm9uJywge1xuICAgIHBvaW50czogWzAsIDAsIC0wLjE1LCAtMC4xNSwgLTAuMSwgLTAuMiwgMCwgLTAuMSwgMC4xLCAtMC4yLCAwLjE1LCAtMC4xNV0sXG4gICAgZ2FwOiBmdW5jdGlvbiBnYXAoZWRnZSkge1xuICAgICAgcmV0dXJuIDAuOTUgKiBlZGdlLnBzdHlsZSgnd2lkdGgnKS5wZlZhbHVlICogZWRnZS5wc3R5bGUoJ2Fycm93LXNjYWxlJykudmFsdWU7XG4gICAgfVxuICB9KTtcbn07XG5cbnZhciBCUnAkZSA9IHt9O1xuXG4vLyBQcm9qZWN0IG1vdXNlXG5CUnAkZS5wcm9qZWN0SW50b1ZpZXdwb3J0ID0gZnVuY3Rpb24gKGNsaWVudFgsIGNsaWVudFkpIHtcbiAgdmFyIGN5ID0gdGhpcy5jeTtcbiAgdmFyIG9mZnNldHMgPSB0aGlzLmZpbmRDb250YWluZXJDbGllbnRDb29yZHMoKTtcbiAgdmFyIG9mZnNldExlZnQgPSBvZmZzZXRzWzBdO1xuICB2YXIgb2Zmc2V0VG9wID0gb2Zmc2V0c1sxXTtcbiAgdmFyIHNjYWxlID0gb2Zmc2V0c1s0XTtcbiAgdmFyIHBhbiA9IGN5LnBhbigpO1xuICB2YXIgem9vbSA9IGN5Lnpvb20oKTtcbiAgdmFyIHggPSAoKGNsaWVudFggLSBvZmZzZXRMZWZ0KSAvIHNjYWxlIC0gcGFuLngpIC8gem9vbTtcbiAgdmFyIHkgPSAoKGNsaWVudFkgLSBvZmZzZXRUb3ApIC8gc2NhbGUgLSBwYW4ueSkgLyB6b29tO1xuICByZXR1cm4gW3gsIHldO1xufTtcbkJScCRlLmZpbmRDb250YWluZXJDbGllbnRDb29yZHMgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLmNvbnRhaW5lckJCKSB7XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyQkI7XG4gIH1cbiAgdmFyIGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyO1xuICB2YXIgcmVjdCA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgdmFyIHN0eWxlID0gdGhpcy5jeS53aW5kb3coKS5nZXRDb21wdXRlZFN0eWxlKGNvbnRhaW5lcik7XG4gIHZhciBzdHlsZVZhbHVlID0gZnVuY3Rpb24gc3R5bGVWYWx1ZShuYW1lKSB7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQoc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKSk7XG4gIH07XG4gIHZhciBwYWRkaW5nID0ge1xuICAgIGxlZnQ6IHN0eWxlVmFsdWUoJ3BhZGRpbmctbGVmdCcpLFxuICAgIHJpZ2h0OiBzdHlsZVZhbHVlKCdwYWRkaW5nLXJpZ2h0JyksXG4gICAgdG9wOiBzdHlsZVZhbHVlKCdwYWRkaW5nLXRvcCcpLFxuICAgIGJvdHRvbTogc3R5bGVWYWx1ZSgncGFkZGluZy1ib3R0b20nKVxuICB9O1xuICB2YXIgYm9yZGVyID0ge1xuICAgIGxlZnQ6IHN0eWxlVmFsdWUoJ2JvcmRlci1sZWZ0LXdpZHRoJyksXG4gICAgcmlnaHQ6IHN0eWxlVmFsdWUoJ2JvcmRlci1yaWdodC13aWR0aCcpLFxuICAgIHRvcDogc3R5bGVWYWx1ZSgnYm9yZGVyLXRvcC13aWR0aCcpLFxuICAgIGJvdHRvbTogc3R5bGVWYWx1ZSgnYm9yZGVyLWJvdHRvbS13aWR0aCcpXG4gIH07XG4gIHZhciBjbGllbnRXaWR0aCA9IGNvbnRhaW5lci5jbGllbnRXaWR0aDtcbiAgdmFyIGNsaWVudEhlaWdodCA9IGNvbnRhaW5lci5jbGllbnRIZWlnaHQ7XG4gIHZhciBwYWRkaW5nSG9yID0gcGFkZGluZy5sZWZ0ICsgcGFkZGluZy5yaWdodDtcbiAgdmFyIHBhZGRpbmdWZXIgPSBwYWRkaW5nLnRvcCArIHBhZGRpbmcuYm90dG9tO1xuICB2YXIgYm9yZGVySG9yID0gYm9yZGVyLmxlZnQgKyBib3JkZXIucmlnaHQ7XG4gIHZhciBzY2FsZSA9IHJlY3Qud2lkdGggLyAoY2xpZW50V2lkdGggKyBib3JkZXJIb3IpO1xuICB2YXIgdW5zY2FsZWRXID0gY2xpZW50V2lkdGggLSBwYWRkaW5nSG9yO1xuICB2YXIgdW5zY2FsZWRIID0gY2xpZW50SGVpZ2h0IC0gcGFkZGluZ1ZlcjtcbiAgdmFyIGxlZnQgPSByZWN0LmxlZnQgKyBwYWRkaW5nLmxlZnQgKyBib3JkZXIubGVmdDtcbiAgdmFyIHRvcCA9IHJlY3QudG9wICsgcGFkZGluZy50b3AgKyBib3JkZXIudG9wO1xuICByZXR1cm4gdGhpcy5jb250YWluZXJCQiA9IFtsZWZ0LCB0b3AsIHVuc2NhbGVkVywgdW5zY2FsZWRILCBzY2FsZV07XG59O1xuQlJwJGUuaW52YWxpZGF0ZUNvbnRhaW5lckNsaWVudENvb3Jkc0NhY2hlID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmNvbnRhaW5lckJCID0gbnVsbDtcbn07XG5CUnAkZS5maW5kTmVhcmVzdEVsZW1lbnQgPSBmdW5jdGlvbiAoeCwgeSwgaW50ZXJhY3RpdmVFbGVtZW50c09ubHksIGlzVG91Y2gpIHtcbiAgcmV0dXJuIHRoaXMuZmluZE5lYXJlc3RFbGVtZW50cyh4LCB5LCBpbnRlcmFjdGl2ZUVsZW1lbnRzT25seSwgaXNUb3VjaClbMF07XG59O1xuQlJwJGUuZmluZE5lYXJlc3RFbGVtZW50cyA9IGZ1bmN0aW9uICh4LCB5LCBpbnRlcmFjdGl2ZUVsZW1lbnRzT25seSwgaXNUb3VjaCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIGVsZXMgPSByLmdldENhY2hlZFpTb3J0ZWRFbGVzKCk7XG4gIHZhciBuZWFyID0gW107IC8vIDEgbm9kZSBtYXgsIDEgZWRnZSBtYXhcbiAgdmFyIHpvb20gPSByLmN5Lnpvb20oKTtcbiAgdmFyIGhhc0NvbXBvdW5kcyA9IHIuY3kuaGFzQ29tcG91bmROb2RlcygpO1xuICB2YXIgZWRnZVRocmVzaG9sZCA9IChpc1RvdWNoID8gMjQgOiA4KSAvIHpvb207XG4gIHZhciBub2RlVGhyZXNob2xkID0gKGlzVG91Y2ggPyA4IDogMikgLyB6b29tO1xuICB2YXIgbGFiZWxUaHJlc2hvbGQgPSAoaXNUb3VjaCA/IDggOiAyKSAvIHpvb207XG4gIHZhciBtaW5TcURpc3QgPSBJbmZpbml0eTtcbiAgdmFyIG5lYXJFZGdlO1xuICB2YXIgbmVhck5vZGU7XG4gIGlmIChpbnRlcmFjdGl2ZUVsZW1lbnRzT25seSkge1xuICAgIGVsZXMgPSBlbGVzLmludGVyYWN0aXZlO1xuICB9XG4gIGZ1bmN0aW9uIGFkZEVsZShlbGUsIHNxRGlzdCkge1xuICAgIGlmIChlbGUuaXNOb2RlKCkpIHtcbiAgICAgIGlmIChuZWFyTm9kZSkge1xuICAgICAgICByZXR1cm47IC8vIGNhbid0IHJlcGxhY2Ugbm9kZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmVhck5vZGUgPSBlbGU7XG4gICAgICAgIG5lYXIucHVzaChlbGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZWxlLmlzRWRnZSgpICYmIChzcURpc3QgPT0gbnVsbCB8fCBzcURpc3QgPCBtaW5TcURpc3QpKSB7XG4gICAgICBpZiAobmVhckVkZ2UpIHtcbiAgICAgICAgLy8gdGhlbiByZXBsYWNlIGV4aXN0aW5nIGVkZ2VcbiAgICAgICAgLy8gY2FuIHJlcGxhY2Ugb25seSBpZiBzYW1lIHotaW5kZXhcbiAgICAgICAgaWYgKG5lYXJFZGdlLnBzdHlsZSgnei1jb21wb3VuZC1kZXB0aCcpLnZhbHVlID09PSBlbGUucHN0eWxlKCd6LWNvbXBvdW5kLWRlcHRoJykudmFsdWUgJiYgbmVhckVkZ2UucHN0eWxlKCd6LWNvbXBvdW5kLWRlcHRoJykudmFsdWUgPT09IGVsZS5wc3R5bGUoJ3otY29tcG91bmQtZGVwdGgnKS52YWx1ZSkge1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmVhci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKG5lYXJbaV0uaXNFZGdlKCkpIHtcbiAgICAgICAgICAgICAgbmVhcltpXSA9IGVsZTtcbiAgICAgICAgICAgICAgbmVhckVkZ2UgPSBlbGU7XG4gICAgICAgICAgICAgIG1pblNxRGlzdCA9IHNxRGlzdCAhPSBudWxsID8gc3FEaXN0IDogbWluU3FEaXN0O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5lYXIucHVzaChlbGUpO1xuICAgICAgICBuZWFyRWRnZSA9IGVsZTtcbiAgICAgICAgbWluU3FEaXN0ID0gc3FEaXN0ICE9IG51bGwgPyBzcURpc3QgOiBtaW5TcURpc3Q7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGNoZWNrTm9kZShub2RlKSB7XG4gICAgdmFyIHdpZHRoID0gbm9kZS5vdXRlcldpZHRoKCkgKyAyICogbm9kZVRocmVzaG9sZDtcbiAgICB2YXIgaGVpZ2h0ID0gbm9kZS5vdXRlckhlaWdodCgpICsgMiAqIG5vZGVUaHJlc2hvbGQ7XG4gICAgdmFyIGh3ID0gd2lkdGggLyAyO1xuICAgIHZhciBoaCA9IGhlaWdodCAvIDI7XG4gICAgdmFyIHBvcyA9IG5vZGUucG9zaXRpb24oKTtcbiAgICB2YXIgY29ybmVyUmFkaXVzID0gbm9kZS5wc3R5bGUoJ2Nvcm5lci1yYWRpdXMnKS52YWx1ZSA9PT0gJ2F1dG8nID8gJ2F1dG8nIDogbm9kZS5wc3R5bGUoJ2Nvcm5lci1yYWRpdXMnKS5wZlZhbHVlO1xuICAgIHZhciBycyA9IG5vZGUuX3ByaXZhdGUucnNjcmF0Y2g7XG4gICAgaWYgKHBvcy54IC0gaHcgPD0geCAmJiB4IDw9IHBvcy54ICsgaHcgLy8gYmIgY2hlY2sgeFxuICAgICYmIHBvcy55IC0gaGggPD0geSAmJiB5IDw9IHBvcy55ICsgaGggLy8gYmIgY2hlY2sgeVxuICAgICkge1xuICAgICAgdmFyIHNoYXBlID0gci5ub2RlU2hhcGVzW3NlbGYuZ2V0Tm9kZVNoYXBlKG5vZGUpXTtcbiAgICAgIGlmIChzaGFwZS5jaGVja1BvaW50KHgsIHksIDAsIHdpZHRoLCBoZWlnaHQsIHBvcy54LCBwb3MueSwgY29ybmVyUmFkaXVzLCBycykpIHtcbiAgICAgICAgYWRkRWxlKG5vZGUsIDApO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gY2hlY2tFZGdlKGVkZ2UpIHtcbiAgICB2YXIgX3AgPSBlZGdlLl9wcml2YXRlO1xuICAgIHZhciBycyA9IF9wLnJzY3JhdGNoO1xuICAgIHZhciBzdHlsZVdpZHRoID0gZWRnZS5wc3R5bGUoJ3dpZHRoJykucGZWYWx1ZTtcbiAgICB2YXIgc2NhbGUgPSBlZGdlLnBzdHlsZSgnYXJyb3ctc2NhbGUnKS52YWx1ZTtcbiAgICB2YXIgd2lkdGggPSBzdHlsZVdpZHRoIC8gMiArIGVkZ2VUaHJlc2hvbGQ7IC8vIG1vcmUgbGlrZSBhIGRpc3RhbmNlIHJhZGl1cyBmcm9tIGNlbnRyZVxuICAgIHZhciB3aWR0aFNxID0gd2lkdGggKiB3aWR0aDtcbiAgICB2YXIgd2lkdGgyID0gd2lkdGggKiAyO1xuICAgIHZhciBzcmMgPSBfcC5zb3VyY2U7XG4gICAgdmFyIHRndCA9IF9wLnRhcmdldDtcbiAgICB2YXIgc3FEaXN0O1xuICAgIGlmIChycy5lZGdlVHlwZSA9PT0gJ3NlZ21lbnRzJyB8fCBycy5lZGdlVHlwZSA9PT0gJ3N0cmFpZ2h0JyB8fCBycy5lZGdlVHlwZSA9PT0gJ2hheXN0YWNrJykge1xuICAgICAgdmFyIHB0cyA9IHJzLmFsbHB0cztcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpICsgMyA8IHB0cy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICBpZiAoaW5MaW5lVmljaW5pdHkoeCwgeSwgcHRzW2ldLCBwdHNbaSArIDFdLCBwdHNbaSArIDJdLCBwdHNbaSArIDNdLCB3aWR0aDIpICYmIHdpZHRoU3EgPiAoc3FEaXN0ID0gc3FkaXN0VG9GaW5pdGVMaW5lKHgsIHksIHB0c1tpXSwgcHRzW2kgKyAxXSwgcHRzW2kgKyAyXSwgcHRzW2kgKyAzXSkpKSB7XG4gICAgICAgICAgYWRkRWxlKGVkZ2UsIHNxRGlzdCk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHJzLmVkZ2VUeXBlID09PSAnYmV6aWVyJyB8fCBycy5lZGdlVHlwZSA9PT0gJ211bHRpYmV6aWVyJyB8fCBycy5lZGdlVHlwZSA9PT0gJ3NlbGYnIHx8IHJzLmVkZ2VUeXBlID09PSAnY29tcG91bmQnKSB7XG4gICAgICB2YXIgcHRzID0gcnMuYWxscHRzO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgKyA1IDwgcnMuYWxscHRzLmxlbmd0aDsgaSArPSA0KSB7XG4gICAgICAgIGlmIChpbkJlemllclZpY2luaXR5KHgsIHksIHB0c1tpXSwgcHRzW2kgKyAxXSwgcHRzW2kgKyAyXSwgcHRzW2kgKyAzXSwgcHRzW2kgKyA0XSwgcHRzW2kgKyA1XSwgd2lkdGgyKSAmJiB3aWR0aFNxID4gKHNxRGlzdCA9IHNxZGlzdFRvUXVhZHJhdGljQmV6aWVyKHgsIHksIHB0c1tpXSwgcHRzW2kgKyAxXSwgcHRzW2kgKyAyXSwgcHRzW2kgKyAzXSwgcHRzW2kgKyA0XSwgcHRzW2kgKyA1XSkpKSB7XG4gICAgICAgICAgYWRkRWxlKGVkZ2UsIHNxRGlzdCk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBpZiB3ZSdyZSBjbG9zZSB0byB0aGUgZWRnZSBidXQgZGlkbid0IGhpdCBpdCwgbWF5YmUgd2UgaGl0IGl0cyBhcnJvd3NcblxuICAgIHZhciBzcmMgPSBzcmMgfHwgX3Auc291cmNlO1xuICAgIHZhciB0Z3QgPSB0Z3QgfHwgX3AudGFyZ2V0O1xuICAgIHZhciBhclNpemUgPSBzZWxmLmdldEFycm93V2lkdGgoc3R5bGVXaWR0aCwgc2NhbGUpO1xuICAgIHZhciBhcnJvd3MgPSBbe1xuICAgICAgbmFtZTogJ3NvdXJjZScsXG4gICAgICB4OiBycy5hcnJvd1N0YXJ0WCxcbiAgICAgIHk6IHJzLmFycm93U3RhcnRZLFxuICAgICAgYW5nbGU6IHJzLnNyY0Fycm93QW5nbGVcbiAgICB9LCB7XG4gICAgICBuYW1lOiAndGFyZ2V0JyxcbiAgICAgIHg6IHJzLmFycm93RW5kWCxcbiAgICAgIHk6IHJzLmFycm93RW5kWSxcbiAgICAgIGFuZ2xlOiBycy50Z3RBcnJvd0FuZ2xlXG4gICAgfSwge1xuICAgICAgbmFtZTogJ21pZC1zb3VyY2UnLFxuICAgICAgeDogcnMubWlkWCxcbiAgICAgIHk6IHJzLm1pZFksXG4gICAgICBhbmdsZTogcnMubWlkc3JjQXJyb3dBbmdsZVxuICAgIH0sIHtcbiAgICAgIG5hbWU6ICdtaWQtdGFyZ2V0JyxcbiAgICAgIHg6IHJzLm1pZFgsXG4gICAgICB5OiBycy5taWRZLFxuICAgICAgYW5nbGU6IHJzLm1pZHRndEFycm93QW5nbGVcbiAgICB9XTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGFyID0gYXJyb3dzW2ldO1xuICAgICAgdmFyIHNoYXBlID0gci5hcnJvd1NoYXBlc1tlZGdlLnBzdHlsZShhci5uYW1lICsgJy1hcnJvdy1zaGFwZScpLnZhbHVlXTtcbiAgICAgIHZhciBlZGdlV2lkdGggPSBlZGdlLnBzdHlsZSgnd2lkdGgnKS5wZlZhbHVlO1xuICAgICAgaWYgKHNoYXBlLnJvdWdoQ29sbGlkZSh4LCB5LCBhclNpemUsIGFyLmFuZ2xlLCB7XG4gICAgICAgIHg6IGFyLngsXG4gICAgICAgIHk6IGFyLnlcbiAgICAgIH0sIGVkZ2VXaWR0aCwgZWRnZVRocmVzaG9sZCkgJiYgc2hhcGUuY29sbGlkZSh4LCB5LCBhclNpemUsIGFyLmFuZ2xlLCB7XG4gICAgICAgIHg6IGFyLngsXG4gICAgICAgIHk6IGFyLnlcbiAgICAgIH0sIGVkZ2VXaWR0aCwgZWRnZVRocmVzaG9sZCkpIHtcbiAgICAgICAgYWRkRWxlKGVkZ2UpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBmb3IgY29tcG91bmQgZ3JhcGhzLCBoaXR0aW5nIGVkZ2UgbWF5IGFjdHVhbGx5IHdhbnQgYSBjb25uZWN0ZWQgbm9kZSBpbnN0ZWFkIChiL2MgZWRnZSBtYXkgaGF2ZSBncmVhdGVyIHotaW5kZXggcHJlY2VkZW5jZSlcbiAgICBpZiAoaGFzQ29tcG91bmRzICYmIG5lYXIubGVuZ3RoID4gMCkge1xuICAgICAgY2hlY2tOb2RlKHNyYyk7XG4gICAgICBjaGVja05vZGUodGd0KTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gcHJlcHJvcChvYmosIG5hbWUsIHByZSkge1xuICAgIHJldHVybiBnZXRQcmVmaXhlZFByb3BlcnR5KG9iaiwgbmFtZSwgcHJlKTtcbiAgfVxuICBmdW5jdGlvbiBjaGVja0xhYmVsKGVsZSwgcHJlZml4KSB7XG4gICAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICAgIHZhciB0aCA9IGxhYmVsVGhyZXNob2xkO1xuICAgIHZhciBwcmVmaXhEYXNoO1xuICAgIGlmIChwcmVmaXgpIHtcbiAgICAgIHByZWZpeERhc2ggPSBwcmVmaXggKyAnLSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByZWZpeERhc2ggPSAnJztcbiAgICB9XG4gICAgZWxlLmJvdW5kaW5nQm94KCk7XG4gICAgdmFyIGJiID0gX3AubGFiZWxCb3VuZHNbcHJlZml4IHx8ICdtYWluJ107XG4gICAgdmFyIHRleHQgPSBlbGUucHN0eWxlKHByZWZpeERhc2ggKyAnbGFiZWwnKS52YWx1ZTtcbiAgICB2YXIgZXZlbnRzRW5hYmxlZCA9IGVsZS5wc3R5bGUoJ3RleHQtZXZlbnRzJykuc3RyVmFsdWUgPT09ICd5ZXMnO1xuICAgIGlmICghZXZlbnRzRW5hYmxlZCB8fCAhdGV4dCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgbHggPSBwcmVwcm9wKF9wLnJzY3JhdGNoLCAnbGFiZWxYJywgcHJlZml4KTtcbiAgICB2YXIgbHkgPSBwcmVwcm9wKF9wLnJzY3JhdGNoLCAnbGFiZWxZJywgcHJlZml4KTtcbiAgICB2YXIgdGhldGEgPSBwcmVwcm9wKF9wLnJzY3JhdGNoLCAnbGFiZWxBbmdsZScsIHByZWZpeCk7XG4gICAgdmFyIG94ID0gZWxlLnBzdHlsZShwcmVmaXhEYXNoICsgJ3RleHQtbWFyZ2luLXgnKS5wZlZhbHVlO1xuICAgIHZhciBveSA9IGVsZS5wc3R5bGUocHJlZml4RGFzaCArICd0ZXh0LW1hcmdpbi15JykucGZWYWx1ZTtcbiAgICB2YXIgbHgxID0gYmIueDEgLSB0aCAtIG94OyAvLyAoLW94LCAtb3kpIGFzIGJiIGFscmVhZHkgaW5jbHVkZXMgbWFyZ2luXG4gICAgdmFyIGx4MiA9IGJiLngyICsgdGggLSBveDsgLy8gYW5kIHJvdGF0aW9uIGlzIGFib3V0IChseCwgbHkpXG4gICAgdmFyIGx5MSA9IGJiLnkxIC0gdGggLSBveTtcbiAgICB2YXIgbHkyID0gYmIueTIgKyB0aCAtIG95O1xuICAgIGlmICh0aGV0YSkge1xuICAgICAgdmFyIGNvcyA9IE1hdGguY29zKHRoZXRhKTtcbiAgICAgIHZhciBzaW4gPSBNYXRoLnNpbih0aGV0YSk7XG4gICAgICB2YXIgcm90YXRlID0gZnVuY3Rpb24gcm90YXRlKHgsIHkpIHtcbiAgICAgICAgeCA9IHggLSBseDtcbiAgICAgICAgeSA9IHkgLSBseTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB4OiB4ICogY29zIC0geSAqIHNpbiArIGx4LFxuICAgICAgICAgIHk6IHggKiBzaW4gKyB5ICogY29zICsgbHlcbiAgICAgICAgfTtcbiAgICAgIH07XG4gICAgICB2YXIgcHgxeTEgPSByb3RhdGUobHgxLCBseTEpO1xuICAgICAgdmFyIHB4MXkyID0gcm90YXRlKGx4MSwgbHkyKTtcbiAgICAgIHZhciBweDJ5MSA9IHJvdGF0ZShseDIsIGx5MSk7XG4gICAgICB2YXIgcHgyeTIgPSByb3RhdGUobHgyLCBseTIpO1xuICAgICAgdmFyIHBvaW50cyA9IFtcbiAgICAgIC8vIHdpdGggdGhlIG1hcmdpbiBhZGRlZCBhZnRlciB0aGUgcm90YXRpb24gaXMgYXBwbGllZFxuICAgICAgcHgxeTEueCArIG94LCBweDF5MS55ICsgb3ksIHB4MnkxLnggKyBveCwgcHgyeTEueSArIG95LCBweDJ5Mi54ICsgb3gsIHB4MnkyLnkgKyBveSwgcHgxeTIueCArIG94LCBweDF5Mi55ICsgb3ldO1xuICAgICAgaWYgKHBvaW50SW5zaWRlUG9seWdvblBvaW50cyh4LCB5LCBwb2ludHMpKSB7XG4gICAgICAgIGFkZEVsZShlbGUpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZG8gYSBjaGVhcGVyIGJiIGNoZWNrXG4gICAgICBpZiAoaW5Cb3VuZGluZ0JveChiYiwgeCwgeSkpIHtcbiAgICAgICAgYWRkRWxlKGVsZSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBmb3IgKHZhciBpID0gZWxlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIC8vIHJldmVyc2Ugb3JkZXIgZm9yIHByZWNlZGVuY2VcbiAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICBpZiAoZWxlLmlzTm9kZSgpKSB7XG4gICAgICBjaGVja05vZGUoZWxlKSB8fCBjaGVja0xhYmVsKGVsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRoZW4gZWRnZVxuICAgICAgY2hlY2tFZGdlKGVsZSkgfHwgY2hlY2tMYWJlbChlbGUpIHx8IGNoZWNrTGFiZWwoZWxlLCAnc291cmNlJykgfHwgY2hlY2tMYWJlbChlbGUsICd0YXJnZXQnKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5lYXI7XG59O1xuXG4vLyAnR2l2ZSBtZSBldmVyeXRoaW5nIGZyb20gdGhpcyBib3gnXG5CUnAkZS5nZXRBbGxJbkJveCA9IGZ1bmN0aW9uICh4MSwgeTEsIHgyLCB5Mikge1xuICB2YXIgZWxlcyA9IHRoaXMuZ2V0Q2FjaGVkWlNvcnRlZEVsZXMoKS5pbnRlcmFjdGl2ZTtcbiAgdmFyIHpvb20gPSB0aGlzLmN5Lnpvb20oKTtcbiAgdmFyIGxhYmVsVGhyZXNob2xkID0gMiAvIHpvb207XG4gIHZhciBib3ggPSBbXTtcbiAgdmFyIHgxYyA9IE1hdGgubWluKHgxLCB4Mik7XG4gIHZhciB4MmMgPSBNYXRoLm1heCh4MSwgeDIpO1xuICB2YXIgeTFjID0gTWF0aC5taW4oeTEsIHkyKTtcbiAgdmFyIHkyYyA9IE1hdGgubWF4KHkxLCB5Mik7XG4gIHgxID0geDFjO1xuICB4MiA9IHgyYztcbiAgeTEgPSB5MWM7XG4gIHkyID0geTJjO1xuICB2YXIgYm94QmIgPSBtYWtlQm91bmRpbmdCb3goe1xuICAgIHgxOiB4MSxcbiAgICB5MTogeTEsXG4gICAgeDI6IHgyLFxuICAgIHkyOiB5MlxuICB9KTtcbiAgdmFyIHNlbGVjdGlvbkJveCA9IFt7XG4gICAgeDogYm94QmIueDEsXG4gICAgeTogYm94QmIueTFcbiAgfSwge1xuICAgIHg6IGJveEJiLngyLFxuICAgIHk6IGJveEJiLnkxXG4gIH0sIHtcbiAgICB4OiBib3hCYi54MixcbiAgICB5OiBib3hCYi55MlxuICB9LCB7XG4gICAgeDogYm94QmIueDEsXG4gICAgeTogYm94QmIueTJcbiAgfV07XG4gIHZhciBib3hFZGdlcyA9IFtbc2VsZWN0aW9uQm94WzBdLCBzZWxlY3Rpb25Cb3hbMV1dLCBbc2VsZWN0aW9uQm94WzFdLCBzZWxlY3Rpb25Cb3hbMl1dLCBbc2VsZWN0aW9uQm94WzJdLCBzZWxlY3Rpb25Cb3hbM11dLCBbc2VsZWN0aW9uQm94WzNdLCBzZWxlY3Rpb25Cb3hbMF1dXTtcbiAgZnVuY3Rpb24gcHJlcHJvcChvYmosIG5hbWUsIHByZSkge1xuICAgIHJldHVybiBnZXRQcmVmaXhlZFByb3BlcnR5KG9iaiwgbmFtZSwgcHJlKTtcbiAgfVxuICBmdW5jdGlvbiBnZXRSb3RhdGVkTGFiZWxCb3goZWxlLCBwcmVmaXgpIHtcbiAgICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gICAgdmFyIHRoID0gbGFiZWxUaHJlc2hvbGQ7XG4gICAgdmFyIHByZWZpeERhc2ggPSAnJztcbiAgICBlbGUuYm91bmRpbmdCb3goKTtcbiAgICB2YXIgYmIgPSBfcC5sYWJlbEJvdW5kc1snbWFpbiddO1xuXG4gICAgLy8gSWYgdGhlIGJvdW5kaW5nIGJveCBpcyBub3QgYXZhaWxhYmxlLCByZXR1cm4gbnVsbC5cbiAgICAvLyBUaGlzIGluZGljYXRlcyB0aGF0IHRoZSBsYWJlbCBib3ggY2Fubm90IGJlIGNhbGN1bGF0ZWQsIHdoaWNoIGlzIGNvbnNpc3RlbnRcbiAgICAvLyB3aXRoIHRoZSBleHBlY3RlZCBiZWhhdmlvciBvZiB0aGlzIGZ1bmN0aW9uLiBSZXR1cm5pbmcgbnVsbCBhbGxvd3MgdGhlIGNhbGxlclxuICAgIC8vIHRvIGhhbmRsZSB0aGUgYWJzZW5jZSBvZiBhIGJvdW5kaW5nIGJveCBleHBsaWNpdGx5LlxuICAgIGlmICghYmIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB2YXIgbHggPSBwcmVwcm9wKF9wLnJzY3JhdGNoLCAnbGFiZWxYJywgcHJlZml4KTtcbiAgICB2YXIgbHkgPSBwcmVwcm9wKF9wLnJzY3JhdGNoLCAnbGFiZWxZJywgcHJlZml4KTtcbiAgICB2YXIgdGhldGEgPSBwcmVwcm9wKF9wLnJzY3JhdGNoLCAnbGFiZWxBbmdsZScsIHByZWZpeCk7XG4gICAgdmFyIG94ID0gZWxlLnBzdHlsZShwcmVmaXhEYXNoICsgJ3RleHQtbWFyZ2luLXgnKS5wZlZhbHVlO1xuICAgIHZhciBveSA9IGVsZS5wc3R5bGUocHJlZml4RGFzaCArICd0ZXh0LW1hcmdpbi15JykucGZWYWx1ZTtcbiAgICB2YXIgbHgxID0gYmIueDEgLSB0aCAtIG94O1xuICAgIHZhciBseDIgPSBiYi54MiArIHRoIC0gb3g7XG4gICAgdmFyIGx5MSA9IGJiLnkxIC0gdGggLSBveTtcbiAgICB2YXIgbHkyID0gYmIueTIgKyB0aCAtIG95O1xuICAgIGlmICh0aGV0YSkge1xuICAgICAgdmFyIGNvcyA9IE1hdGguY29zKHRoZXRhKTtcbiAgICAgIHZhciBzaW4gPSBNYXRoLnNpbih0aGV0YSk7XG4gICAgICB2YXIgcm90YXRlID0gZnVuY3Rpb24gcm90YXRlKHgsIHkpIHtcbiAgICAgICAgeCA9IHggLSBseDtcbiAgICAgICAgeSA9IHkgLSBseTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB4OiB4ICogY29zIC0geSAqIHNpbiArIGx4LFxuICAgICAgICAgIHk6IHggKiBzaW4gKyB5ICogY29zICsgbHlcbiAgICAgICAgfTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gW3JvdGF0ZShseDEsIGx5MSksIHJvdGF0ZShseDIsIGx5MSksIHJvdGF0ZShseDIsIGx5MiksIHJvdGF0ZShseDEsIGx5MildO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW3tcbiAgICAgICAgeDogbHgxLFxuICAgICAgICB5OiBseTFcbiAgICAgIH0sIHtcbiAgICAgICAgeDogbHgyLFxuICAgICAgICB5OiBseTFcbiAgICAgIH0sIHtcbiAgICAgICAgeDogbHgyLFxuICAgICAgICB5OiBseTJcbiAgICAgIH0sIHtcbiAgICAgICAgeDogbHgxLFxuICAgICAgICB5OiBseTJcbiAgICAgIH1dO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBkb0xpbmVzSW50ZXJzZWN0KHAxLCBwMiwgcTEsIHEyKSB7XG4gICAgZnVuY3Rpb24gY2N3KGEsIGIsIGMpIHtcbiAgICAgIHJldHVybiAoYy55IC0gYS55KSAqIChiLnggLSBhLngpID4gKGIueSAtIGEueSkgKiAoYy54IC0gYS54KTtcbiAgICB9XG4gICAgcmV0dXJuIGNjdyhwMSwgcTEsIHEyKSAhPT0gY2N3KHAyLCBxMSwgcTIpICYmIGNjdyhwMSwgcDIsIHExKSAhPT0gY2N3KHAxLCBwMiwgcTIpO1xuICB9XG4gIGZvciAodmFyIGUgPSAwOyBlIDwgZWxlcy5sZW5ndGg7IGUrKykge1xuICAgIHZhciBlbGUgPSBlbGVzW2VdO1xuICAgIGlmIChlbGUuaXNOb2RlKCkpIHtcbiAgICAgIHZhciBub2RlID0gZWxlO1xuICAgICAgdmFyIHRleHRFdmVudHMgPSBub2RlLnBzdHlsZSgndGV4dC1ldmVudHMnKS5zdHJWYWx1ZSA9PT0gJ3llcyc7XG4gICAgICB2YXIgbm9kZUJveFNlbGVjdE1vZGUgPSBub2RlLnBzdHlsZSgnYm94LXNlbGVjdGlvbicpLnN0clZhbHVlO1xuICAgICAgdmFyIGxhYmVsQm94U2VsZWN0RW5hYmxlZCA9IG5vZGUucHN0eWxlKCdib3gtc2VsZWN0LWxhYmVscycpLnN0clZhbHVlID09PSAneWVzJztcbiAgICAgIGlmIChub2RlQm94U2VsZWN0TW9kZSA9PT0gJ25vbmUnKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdmFyIGluY2x1ZGVMYWJlbHMgPSAobm9kZUJveFNlbGVjdE1vZGUgPT09ICdvdmVybGFwJyB8fCBsYWJlbEJveFNlbGVjdEVuYWJsZWQpICYmIHRleHRFdmVudHM7XG4gICAgICB2YXIgbm9kZUJiID0gbm9kZS5ib3VuZGluZ0JveCh7XG4gICAgICAgIGluY2x1ZGVOb2RlczogdHJ1ZSxcbiAgICAgICAgaW5jbHVkZUVkZ2VzOiBmYWxzZSxcbiAgICAgICAgaW5jbHVkZUxhYmVsczogaW5jbHVkZUxhYmVsc1xuICAgICAgfSk7XG4gICAgICBpZiAobm9kZUJveFNlbGVjdE1vZGUgPT09ICdjb250YWluJykge1xuICAgICAgICB2YXIgc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKGxhYmVsQm94U2VsZWN0RW5hYmxlZCAmJiB0ZXh0RXZlbnRzKSB7XG4gICAgICAgICAgdmFyIHJvdGF0ZWRMYWJlbEJveCA9IGdldFJvdGF0ZWRMYWJlbEJveChub2RlKTtcbiAgICAgICAgICBpZiAocm90YXRlZExhYmVsQm94ICYmIHNhdFBvbHlnb25JbnRlcnNlY3Rpb24ocm90YXRlZExhYmVsQm94LCBzZWxlY3Rpb25Cb3gpKSB7XG4gICAgICAgICAgICBib3gucHVzaChub2RlKTtcbiAgICAgICAgICAgIHNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzZWxlY3RlZCAmJiBib3VuZGluZ0JveEluQm91bmRpbmdCb3goYm94QmIsIG5vZGVCYikpIHtcbiAgICAgICAgICBib3gucHVzaChub2RlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChub2RlQm94U2VsZWN0TW9kZSA9PT0gJ292ZXJsYXAnKSB7XG4gICAgICAgIGlmIChib3VuZGluZ0JveGVzSW50ZXJzZWN0KGJveEJiLCBub2RlQmIpKSB7XG4gICAgICAgICAgdmFyIG5vZGVCb2R5QmIgPSBub2RlLmJvdW5kaW5nQm94KHtcbiAgICAgICAgICAgIGluY2x1ZGVOb2RlczogdHJ1ZSxcbiAgICAgICAgICAgIGluY2x1ZGVFZGdlczogdHJ1ZSxcbiAgICAgICAgICAgIGluY2x1ZGVMYWJlbHM6IGZhbHNlLFxuICAgICAgICAgICAgaW5jbHVkZU1haW5MYWJlbHM6IGZhbHNlLFxuICAgICAgICAgICAgaW5jbHVkZVNvdXJjZUxhYmVsczogZmFsc2UsXG4gICAgICAgICAgICBpbmNsdWRlVGFyZ2V0TGFiZWxzOiBmYWxzZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHZhciBub2RlQm9keUNvcm5lcnMgPSBbe1xuICAgICAgICAgICAgeDogbm9kZUJvZHlCYi54MSxcbiAgICAgICAgICAgIHk6IG5vZGVCb2R5QmIueTFcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICB4OiBub2RlQm9keUJiLngyLFxuICAgICAgICAgICAgeTogbm9kZUJvZHlCYi55MVxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIHg6IG5vZGVCb2R5QmIueDIsXG4gICAgICAgICAgICB5OiBub2RlQm9keUJiLnkyXG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgeDogbm9kZUJvZHlCYi54MSxcbiAgICAgICAgICAgIHk6IG5vZGVCb2R5QmIueTJcbiAgICAgICAgICB9XTtcblxuICAgICAgICAgIC8vIGlmIG5vZGUgYm9keSBpbnRlcnNlY3RzLCBubyBuZWVkIHRvIGNoZWNrIGxhYmVsXG4gICAgICAgICAgaWYgKHNhdFBvbHlnb25JbnRlcnNlY3Rpb24obm9kZUJvZHlDb3JuZXJzLCBzZWxlY3Rpb25Cb3gpKSB7XG4gICAgICAgICAgICBib3gucHVzaChub2RlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gb25seSBjaGVjayBsYWJlbCBpZiBub2RlIGJvZHkgZGlkbid0IGludGVyc2VjdFxuICAgICAgICAgICAgdmFyIF9yb3RhdGVkTGFiZWxCb3ggPSBnZXRSb3RhdGVkTGFiZWxCb3gobm9kZSk7XG4gICAgICAgICAgICBpZiAoX3JvdGF0ZWRMYWJlbEJveCAmJiBzYXRQb2x5Z29uSW50ZXJzZWN0aW9uKF9yb3RhdGVkTGFiZWxCb3gsIHNlbGVjdGlvbkJveCkpIHtcbiAgICAgICAgICAgICAgYm94LnB1c2gobm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBlZGdlID0gZWxlO1xuICAgICAgdmFyIF9wID0gZWRnZS5fcHJpdmF0ZTtcbiAgICAgIHZhciBycyA9IF9wLnJzY3JhdGNoO1xuICAgICAgdmFyIGVkZ2VCb3hTZWxlY3RNb2RlID0gZWRnZS5wc3R5bGUoJ2JveC1zZWxlY3Rpb24nKS5zdHJWYWx1ZTtcbiAgICAgIGlmIChlZGdlQm94U2VsZWN0TW9kZSA9PT0gJ25vbmUnKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGVkZ2VCb3hTZWxlY3RNb2RlID09PSAnY29udGFpbicpIHtcbiAgICAgICAgaWYgKHJzLnN0YXJ0WCAhPSBudWxsICYmIHJzLnN0YXJ0WSAhPSBudWxsICYmICFpbkJvdW5kaW5nQm94KGJveEJiLCBycy5zdGFydFgsIHJzLnN0YXJ0WSkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocnMuZW5kWCAhPSBudWxsICYmIHJzLmVuZFkgIT0gbnVsbCAmJiAhaW5Cb3VuZGluZ0JveChib3hCYiwgcnMuZW5kWCwgcnMuZW5kWSkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocnMuZWRnZVR5cGUgPT09ICdiZXppZXInIHx8IHJzLmVkZ2VUeXBlID09PSAnbXVsdGliZXppZXInIHx8IHJzLmVkZ2VUeXBlID09PSAnc2VsZicgfHwgcnMuZWRnZVR5cGUgPT09ICdjb21wb3VuZCcgfHwgcnMuZWRnZVR5cGUgPT09ICdzZWdtZW50cycgfHwgcnMuZWRnZVR5cGUgPT09ICdoYXlzdGFjaycpIHtcbiAgICAgICAgICB2YXIgcHRzID0gX3AucnN0eWxlLmJlemllclB0cyB8fCBfcC5yc3R5bGUubGluZVB0cyB8fCBfcC5yc3R5bGUuaGF5c3RhY2tQdHM7XG4gICAgICAgICAgdmFyIGFsbEluc2lkZSA9IHRydWU7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghcG9pbnRJbkJvdW5kaW5nQm94KGJveEJiLCBwdHNbaV0pKSB7XG4gICAgICAgICAgICAgIGFsbEluc2lkZSA9IGZhbHNlO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGFsbEluc2lkZSkge1xuICAgICAgICAgICAgYm94LnB1c2goZWRnZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHJzLmVkZ2VUeXBlID09PSAnc3RyYWlnaHQnKSB7XG4gICAgICAgICAgYm94LnB1c2goZWRnZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZWRnZUJveFNlbGVjdE1vZGUgPT09ICdvdmVybGFwJykge1xuICAgICAgICB2YXIgX3NlbGVjdGVkID0gZmFsc2U7XG5cbiAgICAgICAgLy8gQ2hlY2s6IGVpdGhlciBlbmRwb2ludCBpbnNpZGUgYm94XG4gICAgICAgIGlmIChycy5zdGFydFggIT0gbnVsbCAmJiBycy5zdGFydFkgIT0gbnVsbCAmJiBycy5lbmRYICE9IG51bGwgJiYgcnMuZW5kWSAhPSBudWxsICYmIChpbkJvdW5kaW5nQm94KGJveEJiLCBycy5zdGFydFgsIHJzLnN0YXJ0WSkgfHwgaW5Cb3VuZGluZ0JveChib3hCYiwgcnMuZW5kWCwgcnMuZW5kWSkpKSB7XG4gICAgICAgICAgYm94LnB1c2goZWRnZSk7XG4gICAgICAgICAgX3NlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEhheXN0YWNrIGZhbGxiYWNrIChvbmx5IGNoZWNrIGlmIG5vdCBhbHJlYWR5IHNlbGVjdGVkKVxuICAgICAgICBlbHNlIGlmICghX3NlbGVjdGVkICYmIHJzLmVkZ2VUeXBlID09PSAnaGF5c3RhY2snKSB7XG4gICAgICAgICAgdmFyIGhheXN0YWNrUHRzID0gX3AucnN0eWxlLmhheXN0YWNrUHRzO1xuICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBoYXlzdGFja1B0cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGlmIChwb2ludEluQm91bmRpbmdCb3goYm94QmIsIGhheXN0YWNrUHRzW19pXSkpIHtcbiAgICAgICAgICAgICAgYm94LnB1c2goZWRnZSk7XG4gICAgICAgICAgICAgIF9zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNlZ21lbnQgaW50ZXJzZWN0aW9uIGNoZWNrIChvbmx5IGlmIG5vdCBhbHJlYWR5IHNlbGVjdGVkKVxuICAgICAgICBpZiAoIV9zZWxlY3RlZCkge1xuICAgICAgICAgIHZhciBfcHRzID0gX3AucnN0eWxlLmJlemllclB0cyB8fCBfcC5yc3R5bGUubGluZVB0cyB8fCBfcC5yc3R5bGUuaGF5c3RhY2tQdHM7XG5cbiAgICAgICAgICAvLyBzdHJhaWdodCBlZGdlc1xuICAgICAgICAgIGlmICgoIV9wdHMgfHwgX3B0cy5sZW5ndGggPCAyKSAmJiBycy5lZGdlVHlwZSA9PT0gJ3N0cmFpZ2h0Jykge1xuICAgICAgICAgICAgaWYgKHJzLnN0YXJ0WCAhPSBudWxsICYmIHJzLnN0YXJ0WSAhPSBudWxsICYmIHJzLmVuZFggIT0gbnVsbCAmJiBycy5lbmRZICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgX3B0cyA9IFt7XG4gICAgICAgICAgICAgICAgeDogcnMuc3RhcnRYLFxuICAgICAgICAgICAgICAgIHk6IHJzLnN0YXJ0WVxuICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgeDogcnMuZW5kWCxcbiAgICAgICAgICAgICAgICB5OiBycy5lbmRZXG4gICAgICAgICAgICAgIH1dO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIV9wdHMgfHwgX3B0cy5sZW5ndGggPCAyKSBjb250aW51ZTtcbiAgICAgICAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBfcHRzLmxlbmd0aCAtIDE7IF9pMisrKSB7XG4gICAgICAgICAgICB2YXIgc2VnU3RhcnQgPSBfcHRzW19pMl07XG4gICAgICAgICAgICB2YXIgc2VnRW5kID0gX3B0c1tfaTIgKyAxXTtcbiAgICAgICAgICAgIGZvciAodmFyIGIgPSAwOyBiIDwgYm94RWRnZXMubGVuZ3RoOyBiKyspIHtcbiAgICAgICAgICAgICAgdmFyIF9ib3hFZGdlcyRiID0gX3NsaWNlZFRvQXJyYXkoYm94RWRnZXNbYl0sIDIpLFxuICAgICAgICAgICAgICAgIGJveFN0YXJ0ID0gX2JveEVkZ2VzJGJbMF0sXG4gICAgICAgICAgICAgICAgYm94RW5kID0gX2JveEVkZ2VzJGJbMV07XG4gICAgICAgICAgICAgIGlmIChkb0xpbmVzSW50ZXJzZWN0KHNlZ1N0YXJ0LCBzZWdFbmQsIGJveFN0YXJ0LCBib3hFbmQpKSB7XG4gICAgICAgICAgICAgICAgYm94LnB1c2goZWRnZSk7XG4gICAgICAgICAgICAgICAgX3NlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKF9zZWxlY3RlZCkgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBib3g7XG59O1xuXG52YXIgQlJwJGQgPSB7fTtcbkJScCRkLmNhbGN1bGF0ZUFycm93QW5nbGVzID0gZnVuY3Rpb24gKGVkZ2UpIHtcbiAgdmFyIHJzID0gZWRnZS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgdmFyIGlzSGF5c3RhY2sgPSBycy5lZGdlVHlwZSA9PT0gJ2hheXN0YWNrJztcbiAgdmFyIGlzQmV6aWVyID0gcnMuZWRnZVR5cGUgPT09ICdiZXppZXInO1xuICB2YXIgaXNNdWx0aWJlemllciA9IHJzLmVkZ2VUeXBlID09PSAnbXVsdGliZXppZXInO1xuICB2YXIgaXNTZWdtZW50cyA9IHJzLmVkZ2VUeXBlID09PSAnc2VnbWVudHMnO1xuICB2YXIgaXNDb21wb3VuZCA9IHJzLmVkZ2VUeXBlID09PSAnY29tcG91bmQnO1xuICB2YXIgaXNTZWxmID0gcnMuZWRnZVR5cGUgPT09ICdzZWxmJztcblxuICAvLyBEaXNwbGFjZW1lbnQgZ2l2ZXMgZGlyZWN0aW9uIGZvciBhcnJvd2hlYWQgb3JpZW50YXRpb25cbiAgdmFyIGRpc3BYLCBkaXNwWTtcbiAgdmFyIHN0YXJ0WCwgc3RhcnRZLCBlbmRYLCBlbmRZLCBtaWRYLCBtaWRZO1xuICBpZiAoaXNIYXlzdGFjaykge1xuICAgIHN0YXJ0WCA9IHJzLmhheXN0YWNrUHRzWzBdO1xuICAgIHN0YXJ0WSA9IHJzLmhheXN0YWNrUHRzWzFdO1xuICAgIGVuZFggPSBycy5oYXlzdGFja1B0c1syXTtcbiAgICBlbmRZID0gcnMuaGF5c3RhY2tQdHNbM107XG4gIH0gZWxzZSB7XG4gICAgc3RhcnRYID0gcnMuYXJyb3dTdGFydFg7XG4gICAgc3RhcnRZID0gcnMuYXJyb3dTdGFydFk7XG4gICAgZW5kWCA9IHJzLmFycm93RW5kWDtcbiAgICBlbmRZID0gcnMuYXJyb3dFbmRZO1xuICB9XG4gIG1pZFggPSBycy5taWRYO1xuICBtaWRZID0gcnMubWlkWTtcblxuICAvLyBzb3VyY2VcbiAgLy9cblxuICBpZiAoaXNTZWdtZW50cykge1xuICAgIGRpc3BYID0gc3RhcnRYIC0gcnMuc2VncHRzWzBdO1xuICAgIGRpc3BZID0gc3RhcnRZIC0gcnMuc2VncHRzWzFdO1xuICB9IGVsc2UgaWYgKGlzTXVsdGliZXppZXIgfHwgaXNDb21wb3VuZCB8fCBpc1NlbGYgfHwgaXNCZXppZXIpIHtcbiAgICB2YXIgcHRzID0gcnMuYWxscHRzO1xuICAgIHZhciBiWCA9IHFiZXppZXJBdChwdHNbMF0sIHB0c1syXSwgcHRzWzRdLCAwLjEpO1xuICAgIHZhciBiWSA9IHFiZXppZXJBdChwdHNbMV0sIHB0c1szXSwgcHRzWzVdLCAwLjEpO1xuICAgIGRpc3BYID0gc3RhcnRYIC0gYlg7XG4gICAgZGlzcFkgPSBzdGFydFkgLSBiWTtcbiAgfSBlbHNlIHtcbiAgICBkaXNwWCA9IHN0YXJ0WCAtIG1pZFg7XG4gICAgZGlzcFkgPSBzdGFydFkgLSBtaWRZO1xuICB9XG4gIHJzLnNyY0Fycm93QW5nbGUgPSBnZXRBbmdsZUZyb21EaXNwKGRpc3BYLCBkaXNwWSk7XG5cbiAgLy8gbWlkIHRhcmdldFxuICAvL1xuXG4gIHZhciBtaWRYID0gcnMubWlkWDtcbiAgdmFyIG1pZFkgPSBycy5taWRZO1xuICBpZiAoaXNIYXlzdGFjaykge1xuICAgIG1pZFggPSAoc3RhcnRYICsgZW5kWCkgLyAyO1xuICAgIG1pZFkgPSAoc3RhcnRZICsgZW5kWSkgLyAyO1xuICB9XG4gIGRpc3BYID0gZW5kWCAtIHN0YXJ0WDtcbiAgZGlzcFkgPSBlbmRZIC0gc3RhcnRZO1xuICBpZiAoaXNTZWdtZW50cykge1xuICAgIHZhciBwdHMgPSBycy5hbGxwdHM7XG4gICAgaWYgKHB0cy5sZW5ndGggLyAyICUgMiA9PT0gMCkge1xuICAgICAgdmFyIGkyID0gcHRzLmxlbmd0aCAvIDI7XG4gICAgICB2YXIgaTEgPSBpMiAtIDI7XG4gICAgICBkaXNwWCA9IHB0c1tpMl0gLSBwdHNbaTFdO1xuICAgICAgZGlzcFkgPSBwdHNbaTIgKyAxXSAtIHB0c1tpMSArIDFdO1xuICAgIH0gZWxzZSBpZiAocnMuaXNSb3VuZCkge1xuICAgICAgZGlzcFggPSBycy5taWRWZWN0b3JbMV07XG4gICAgICBkaXNwWSA9IC1ycy5taWRWZWN0b3JbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBpMiA9IHB0cy5sZW5ndGggLyAyIC0gMTtcbiAgICAgIHZhciBpMSA9IGkyIC0gMjtcbiAgICAgIGRpc3BYID0gcHRzW2kyXSAtIHB0c1tpMV07XG4gICAgICBkaXNwWSA9IHB0c1tpMiArIDFdIC0gcHRzW2kxICsgMV07XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzTXVsdGliZXppZXIgfHwgaXNDb21wb3VuZCB8fCBpc1NlbGYpIHtcbiAgICB2YXIgcHRzID0gcnMuYWxscHRzO1xuICAgIHZhciBjcHRzID0gcnMuY3RybHB0cztcbiAgICB2YXIgYnAweCwgYnAweTtcbiAgICB2YXIgYnAxeCwgYnAxeTtcbiAgICBpZiAoY3B0cy5sZW5ndGggLyAyICUgMiA9PT0gMCkge1xuICAgICAgdmFyIHAwID0gcHRzLmxlbmd0aCAvIDIgLSAxOyAvLyBzdGFydHB0XG4gICAgICB2YXIgaWMgPSBwMCArIDI7XG4gICAgICB2YXIgcDEgPSBpYyArIDI7XG4gICAgICBicDB4ID0gcWJlemllckF0KHB0c1twMF0sIHB0c1tpY10sIHB0c1twMV0sIDAuMCk7XG4gICAgICBicDB5ID0gcWJlemllckF0KHB0c1twMCArIDFdLCBwdHNbaWMgKyAxXSwgcHRzW3AxICsgMV0sIDAuMCk7XG4gICAgICBicDF4ID0gcWJlemllckF0KHB0c1twMF0sIHB0c1tpY10sIHB0c1twMV0sIDAuMDAwMSk7XG4gICAgICBicDF5ID0gcWJlemllckF0KHB0c1twMCArIDFdLCBwdHNbaWMgKyAxXSwgcHRzW3AxICsgMV0sIDAuMDAwMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBpYyA9IHB0cy5sZW5ndGggLyAyIC0gMTsgLy8gY3RycHRcbiAgICAgIHZhciBwMCA9IGljIC0gMjsgLy8gc3RhcnRwdFxuICAgICAgdmFyIHAxID0gaWMgKyAyOyAvLyBlbmRwdFxuXG4gICAgICBicDB4ID0gcWJlemllckF0KHB0c1twMF0sIHB0c1tpY10sIHB0c1twMV0sIDAuNDk5OSk7XG4gICAgICBicDB5ID0gcWJlemllckF0KHB0c1twMCArIDFdLCBwdHNbaWMgKyAxXSwgcHRzW3AxICsgMV0sIDAuNDk5OSk7XG4gICAgICBicDF4ID0gcWJlemllckF0KHB0c1twMF0sIHB0c1tpY10sIHB0c1twMV0sIDAuNSk7XG4gICAgICBicDF5ID0gcWJlemllckF0KHB0c1twMCArIDFdLCBwdHNbaWMgKyAxXSwgcHRzW3AxICsgMV0sIDAuNSk7XG4gICAgfVxuICAgIGRpc3BYID0gYnAxeCAtIGJwMHg7XG4gICAgZGlzcFkgPSBicDF5IC0gYnAweTtcbiAgfVxuICBycy5taWR0Z3RBcnJvd0FuZ2xlID0gZ2V0QW5nbGVGcm9tRGlzcChkaXNwWCwgZGlzcFkpO1xuICBycy5taWREaXNwWCA9IGRpc3BYO1xuICBycy5taWREaXNwWSA9IGRpc3BZO1xuXG4gIC8vIG1pZCBzb3VyY2VcbiAgLy9cblxuICBkaXNwWCAqPSAtMTtcbiAgZGlzcFkgKj0gLTE7XG4gIGlmIChpc1NlZ21lbnRzKSB7XG4gICAgdmFyIHB0cyA9IHJzLmFsbHB0cztcbiAgICBpZiAocHRzLmxlbmd0aCAvIDIgJSAyID09PSAwKSA7IGVsc2UgaWYgKCFycy5pc1JvdW5kKSB7XG4gICAgICB2YXIgaTIgPSBwdHMubGVuZ3RoIC8gMiAtIDE7XG4gICAgICB2YXIgaTMgPSBpMiArIDI7XG4gICAgICBkaXNwWCA9IC0ocHRzW2kzXSAtIHB0c1tpMl0pO1xuICAgICAgZGlzcFkgPSAtKHB0c1tpMyArIDFdIC0gcHRzW2kyICsgMV0pO1xuICAgIH1cbiAgfVxuICBycy5taWRzcmNBcnJvd0FuZ2xlID0gZ2V0QW5nbGVGcm9tRGlzcChkaXNwWCwgZGlzcFkpO1xuXG4gIC8vIHRhcmdldFxuICAvL1xuXG4gIGlmIChpc1NlZ21lbnRzKSB7XG4gICAgZGlzcFggPSBlbmRYIC0gcnMuc2VncHRzW3JzLnNlZ3B0cy5sZW5ndGggLSAyXTtcbiAgICBkaXNwWSA9IGVuZFkgLSBycy5zZWdwdHNbcnMuc2VncHRzLmxlbmd0aCAtIDFdO1xuICB9IGVsc2UgaWYgKGlzTXVsdGliZXppZXIgfHwgaXNDb21wb3VuZCB8fCBpc1NlbGYgfHwgaXNCZXppZXIpIHtcbiAgICB2YXIgcHRzID0gcnMuYWxscHRzO1xuICAgIHZhciBsID0gcHRzLmxlbmd0aDtcbiAgICB2YXIgYlggPSBxYmV6aWVyQXQocHRzW2wgLSA2XSwgcHRzW2wgLSA0XSwgcHRzW2wgLSAyXSwgMC45KTtcbiAgICB2YXIgYlkgPSBxYmV6aWVyQXQocHRzW2wgLSA1XSwgcHRzW2wgLSAzXSwgcHRzW2wgLSAxXSwgMC45KTtcbiAgICBkaXNwWCA9IGVuZFggLSBiWDtcbiAgICBkaXNwWSA9IGVuZFkgLSBiWTtcbiAgfSBlbHNlIHtcbiAgICBkaXNwWCA9IGVuZFggLSBtaWRYO1xuICAgIGRpc3BZID0gZW5kWSAtIG1pZFk7XG4gIH1cbiAgcnMudGd0QXJyb3dBbmdsZSA9IGdldEFuZ2xlRnJvbURpc3AoZGlzcFgsIGRpc3BZKTtcbn07XG5CUnAkZC5nZXRBcnJvd1dpZHRoID0gQlJwJGQuZ2V0QXJyb3dIZWlnaHQgPSBmdW5jdGlvbiAoZWRnZVdpZHRoLCBzY2FsZSkge1xuICB2YXIgY2FjaGUgPSB0aGlzLmFycm93V2lkdGhDYWNoZSA9IHRoaXMuYXJyb3dXaWR0aENhY2hlIHx8IHt9O1xuICB2YXIgY2FjaGVkVmFsID0gY2FjaGVbZWRnZVdpZHRoICsgJywgJyArIHNjYWxlXTtcbiAgaWYgKGNhY2hlZFZhbCkge1xuICAgIHJldHVybiBjYWNoZWRWYWw7XG4gIH1cbiAgY2FjaGVkVmFsID0gTWF0aC5tYXgoTWF0aC5wb3coZWRnZVdpZHRoICogMTMuMzcsIDAuOSksIDI5KSAqIHNjYWxlO1xuICBjYWNoZVtlZGdlV2lkdGggKyAnLCAnICsgc2NhbGVdID0gY2FjaGVkVmFsO1xuICByZXR1cm4gY2FjaGVkVmFsO1xufTtcblxuLyoqXG4gKiBFeHBsYWluZWQgYnkgQmxpbmRtYW42NyBhdCBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNDQ4NTY5MjUvMTEwMjg4MjhcbiAqL1xuXG4vLyBEZWNsYXJlIHJldXNlZCB2YXJpYWJsZSB0byBhdm9pZCByZWFsbG9jYXRpbmcgdmFyaWFibGVzIGV2ZXJ5IHRpbWUgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZFxudmFyIHgsXG4gIHksXG4gIHYxID0ge30sXG4gIHYyID0ge30sXG4gIHNpbkEsXG4gIHNpbkE5MCxcbiAgcmFkRGlyZWN0aW9uLFxuICBkcmF3RGlyZWN0aW9uLFxuICBhbmdsZSxcbiAgaGFsZkFuZ2xlLFxuICBjUmFkaXVzLFxuICBsZW5PdXQsXG4gIHJhZGl1cyxcbiAgbGltaXQ7XG52YXIgc3RhcnRYLCBzdGFydFksIHN0b3BYLCBzdG9wWTtcbnZhciBsYXN0UG9pbnQ7XG5cbi8vIGNvbnZlcnQgMiBwb2ludHMgaW50byB2ZWN0b3IgZm9ybSwgcG9sYXIgZm9ybSwgYW5kIG5vcm1hbGlzZWRcbnZhciBhc1ZlYyA9IGZ1bmN0aW9uIGFzVmVjKHAsIHBwLCB2KSB7XG4gIHYueCA9IHBwLnggLSBwLng7XG4gIHYueSA9IHBwLnkgLSBwLnk7XG4gIHYubGVuID0gTWF0aC5zcXJ0KHYueCAqIHYueCArIHYueSAqIHYueSk7XG4gIHYubnggPSB2LnggLyB2LmxlbjtcbiAgdi5ueSA9IHYueSAvIHYubGVuO1xuICB2LmFuZyA9IE1hdGguYXRhbjIodi5ueSwgdi5ueCk7XG59O1xudmFyIGludmVydFZlYyA9IGZ1bmN0aW9uIGludmVydFZlYyhvcmlnaW5hbFYsIGludmVydGVkVikge1xuICBpbnZlcnRlZFYueCA9IG9yaWdpbmFsVi54ICogLTE7XG4gIGludmVydGVkVi55ID0gb3JpZ2luYWxWLnkgKiAtMTtcbiAgaW52ZXJ0ZWRWLm54ID0gb3JpZ2luYWxWLm54ICogLTE7XG4gIGludmVydGVkVi5ueSA9IG9yaWdpbmFsVi5ueSAqIC0xO1xuICBpbnZlcnRlZFYuYW5nID0gb3JpZ2luYWxWLmFuZyA+IDAgPyAtKE1hdGguUEkgLSBvcmlnaW5hbFYuYW5nKSA6IE1hdGguUEkgKyBvcmlnaW5hbFYuYW5nO1xufTtcbnZhciBjYWxjQ29ybmVyQXJjID0gZnVuY3Rpb24gY2FsY0Nvcm5lckFyYyhwcmV2aW91c1BvaW50LCBjdXJyZW50UG9pbnQsIG5leHRQb2ludCwgcmFkaXVzTWF4LCBpc0FyY1JhZGl1cykge1xuICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIFBhcnQgMVxuICBwcmV2aW91c1BvaW50ICE9PSBsYXN0UG9pbnQgPyBhc1ZlYyhjdXJyZW50UG9pbnQsIHByZXZpb3VzUG9pbnQsIHYxKSA6IGludmVydFZlYyh2MiwgdjEpOyAvLyBBdm9pZCByZWNhbGN1bGF0aW5nIHZlYyBpZiBpdCBpcyB0aGUgaW52ZXJ0IG9mIHRoZSBsYXN0IG9uZSBjYWxjdWxhdGVkXG4gIGFzVmVjKGN1cnJlbnRQb2ludCwgbmV4dFBvaW50LCB2Mik7XG4gIHNpbkEgPSB2MS5ueCAqIHYyLm55IC0gdjEubnkgKiB2Mi5ueDtcbiAgc2luQTkwID0gdjEubnggKiB2Mi5ueCAtIHYxLm55ICogLXYyLm55O1xuICBhbmdsZSA9IE1hdGguYXNpbihNYXRoLm1heCgtMSwgTWF0aC5taW4oMSwgc2luQSkpKTtcbiAgaWYgKE1hdGguYWJzKGFuZ2xlKSA8IDFlLTYpIHtcbiAgICB4ID0gY3VycmVudFBvaW50Lng7XG4gICAgeSA9IGN1cnJlbnRQb2ludC55O1xuICAgIGNSYWRpdXMgPSByYWRpdXMgPSAwO1xuICAgIHJldHVybjtcbiAgfVxuICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIHJhZERpcmVjdGlvbiA9IDE7XG4gIGRyYXdEaXJlY3Rpb24gPSBmYWxzZTtcbiAgaWYgKHNpbkE5MCA8IDApIHtcbiAgICBpZiAoYW5nbGUgPCAwKSB7XG4gICAgICBhbmdsZSA9IE1hdGguUEkgKyBhbmdsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgYW5nbGUgPSBNYXRoLlBJIC0gYW5nbGU7XG4gICAgICByYWREaXJlY3Rpb24gPSAtMTtcbiAgICAgIGRyYXdEaXJlY3Rpb24gPSB0cnVlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoYW5nbGUgPiAwKSB7XG4gICAgICByYWREaXJlY3Rpb24gPSAtMTtcbiAgICAgIGRyYXdEaXJlY3Rpb24gPSB0cnVlO1xuICAgIH1cbiAgfVxuICBpZiAoY3VycmVudFBvaW50LnJhZGl1cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmFkaXVzID0gY3VycmVudFBvaW50LnJhZGl1cztcbiAgfSBlbHNlIHtcbiAgICByYWRpdXMgPSByYWRpdXNNYXg7XG4gIH1cbiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBQYXJ0IDJcbiAgaGFsZkFuZ2xlID0gYW5nbGUgLyAyO1xuICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgbGltaXQgPSBNYXRoLm1pbih2MS5sZW4gLyAyLCB2Mi5sZW4gLyAyKTtcbiAgaWYgKGlzQXJjUmFkaXVzKSB7XG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFBhcnQgM1xuICAgIGxlbk91dCA9IE1hdGguYWJzKE1hdGguY29zKGhhbGZBbmdsZSkgKiByYWRpdXMgLyBNYXRoLnNpbihoYWxmQW5nbGUpKTtcblxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBTcGVjaWFsIHBhcnQgQVxuICAgIGlmIChsZW5PdXQgPiBsaW1pdCkge1xuICAgICAgbGVuT3V0ID0gbGltaXQ7XG4gICAgICBjUmFkaXVzID0gTWF0aC5hYnMobGVuT3V0ICogTWF0aC5zaW4oaGFsZkFuZ2xlKSAvIE1hdGguY29zKGhhbGZBbmdsZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjUmFkaXVzID0gcmFkaXVzO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsZW5PdXQgPSBNYXRoLm1pbihsaW1pdCwgcmFkaXVzKTtcbiAgICBjUmFkaXVzID0gTWF0aC5hYnMobGVuT3V0ICogTWF0aC5zaW4oaGFsZkFuZ2xlKSAvIE1hdGguY29zKGhhbGZBbmdsZSkpO1xuICB9XG4gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIFBhcnQgNFxuICBzdG9wWCA9IGN1cnJlbnRQb2ludC54ICsgdjIubnggKiBsZW5PdXQ7XG4gIHN0b3BZID0gY3VycmVudFBvaW50LnkgKyB2Mi5ueSAqIGxlbk91dDtcbiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBQYXJ0IDVcbiAgeCA9IHN0b3BYIC0gdjIubnkgKiBjUmFkaXVzICogcmFkRGlyZWN0aW9uO1xuICB5ID0gc3RvcFkgKyB2Mi5ueCAqIGNSYWRpdXMgKiByYWREaXJlY3Rpb247XG4gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gQWRkaXRpb25hbCBQYXJ0IDogY2FsY3VsYXRlIHN0YXJ0IHBvaW50IEVcbiAgc3RhcnRYID0gY3VycmVudFBvaW50LnggKyB2MS5ueCAqIGxlbk91dDtcbiAgc3RhcnRZID0gY3VycmVudFBvaW50LnkgKyB2MS5ueSAqIGxlbk91dDtcblxuICAvLyBTYXZlIGxhc3QgcG9pbnQgdG8gYXZvaWQgcmVjYWxjdWxhdGluZyB2ZWN0b3Igd2hlbiBub3QgbmVlZGVkXG4gIGxhc3RQb2ludCA9IGN1cnJlbnRQb2ludDtcbn07XG5cbi8qKlxuICogRHJhdyBjb3JuZXIgcHJvdmlkZWQgYnkge0BsaW5rIGdldFJvdW5kQ29ybmVyfVxuICpcbiAqIEBwYXJhbSBjdHggOkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRFxuICogQHBhcmFtIHJvdW5kQ29ybmVyIHt7Y3g6bnVtYmVyLCBjeTpudW1iZXIsIHJhZGl1czpudW1iZXIsIGVuZEFuZ2xlOiBudW1iZXIsIHN0YXJ0QW5nbGU6IG51bWJlciwgY291bnRlckNsb2Nrd2lzZTogYm9vbGVhbn19XG4gKi9cbmZ1bmN0aW9uIGRyYXdQcmVwYXJlZFJvdW5kQ29ybmVyKGN0eCwgcm91bmRDb3JuZXIpIHtcbiAgaWYgKHJvdW5kQ29ybmVyLnJhZGl1cyA9PT0gMCkgY3R4LmxpbmVUbyhyb3VuZENvcm5lci5jeCwgcm91bmRDb3JuZXIuY3kpO2Vsc2UgY3R4LmFyYyhyb3VuZENvcm5lci5jeCwgcm91bmRDb3JuZXIuY3ksIHJvdW5kQ29ybmVyLnJhZGl1cywgcm91bmRDb3JuZXIuc3RhcnRBbmdsZSwgcm91bmRDb3JuZXIuZW5kQW5nbGUsIHJvdW5kQ29ybmVyLmNvdW50ZXJDbG9ja3dpc2UpO1xufVxuXG4vKipcbiAqIEdldCByb3VuZCBjb3JuZXIgZnJvbSBhIHBvaW50IGFuZCBpdHMgcHJldmlvdXMgYW5kIG5leHQgbmVpZ2hib3VycyBpbiBhIHBhdGhcbiAqXG4gKiBAcGFyYW0gcHJldmlvdXNQb2ludCB7e3g6IG51bWJlciwgeTpudW1iZXIsIHJhZGl1czogbnVtYmVyP319XG4gKiBAcGFyYW0gY3VycmVudFBvaW50IHt7eDogbnVtYmVyLCB5Om51bWJlciwgcmFkaXVzOiBudW1iZXI/fX1cbiAqIEBwYXJhbSBuZXh0UG9pbnQge3t4OiBudW1iZXIsIHk6bnVtYmVyLCByYWRpdXM6IG51bWJlcj99fVxuICogQHBhcmFtIHJhZGl1c01heCA6bnVtYmVyXG4gKiBAcGFyYW0gaXNBcmNSYWRpdXMgOmJvb2xlYW5cbiAqIEByZXR1cm4ge3tcbiAqIGN4Om51bWJlciwgY3k6bnVtYmVyLCByYWRpdXM6bnVtYmVyLFxuICogc3RhcnRYOm51bWJlciwgc3RhcnRZOm51bWJlcixcbiAqIHN0b3BYOm51bWJlciwgc3RvcFk6IG51bWJlcixcbiAqIGVuZEFuZ2xlOiBudW1iZXIsIHN0YXJ0QW5nbGU6IG51bWJlciwgY291bnRlckNsb2Nrd2lzZTogYm9vbGVhblxuICogfX1cbiAqL1xuZnVuY3Rpb24gZ2V0Um91bmRDb3JuZXIocHJldmlvdXNQb2ludCwgY3VycmVudFBvaW50LCBuZXh0UG9pbnQsIHJhZGl1c01heCkge1xuICB2YXIgaXNBcmNSYWRpdXMgPSBhcmd1bWVudHMubGVuZ3RoID4gNCAmJiBhcmd1bWVudHNbNF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s0XSA6IHRydWU7XG4gIGlmIChyYWRpdXNNYXggPT09IDAgfHwgY3VycmVudFBvaW50LnJhZGl1cyA9PT0gMCkgcmV0dXJuIHtcbiAgICBjeDogY3VycmVudFBvaW50LngsXG4gICAgY3k6IGN1cnJlbnRQb2ludC55LFxuICAgIHJhZGl1czogMCxcbiAgICBzdGFydFg6IGN1cnJlbnRQb2ludC54LFxuICAgIHN0YXJ0WTogY3VycmVudFBvaW50LnksXG4gICAgc3RvcFg6IGN1cnJlbnRQb2ludC54LFxuICAgIHN0b3BZOiBjdXJyZW50UG9pbnQueSxcbiAgICBzdGFydEFuZ2xlOiB1bmRlZmluZWQsXG4gICAgZW5kQW5nbGU6IHVuZGVmaW5lZCxcbiAgICBjb3VudGVyQ2xvY2t3aXNlOiB1bmRlZmluZWRcbiAgfTtcbiAgY2FsY0Nvcm5lckFyYyhwcmV2aW91c1BvaW50LCBjdXJyZW50UG9pbnQsIG5leHRQb2ludCwgcmFkaXVzTWF4LCBpc0FyY1JhZGl1cyk7XG4gIHJldHVybiB7XG4gICAgY3g6IHgsXG4gICAgY3k6IHksXG4gICAgcmFkaXVzOiBjUmFkaXVzLFxuICAgIHN0YXJ0WDogc3RhcnRYLFxuICAgIHN0YXJ0WTogc3RhcnRZLFxuICAgIHN0b3BYOiBzdG9wWCxcbiAgICBzdG9wWTogc3RvcFksXG4gICAgc3RhcnRBbmdsZTogdjEuYW5nICsgTWF0aC5QSSAvIDIgKiByYWREaXJlY3Rpb24sXG4gICAgZW5kQW5nbGU6IHYyLmFuZyAtIE1hdGguUEkgLyAyICogcmFkRGlyZWN0aW9uLFxuICAgIGNvdW50ZXJDbG9ja3dpc2U6IGRyYXdEaXJlY3Rpb25cbiAgfTtcbn1cblxudmFyIEFWT0lEX0lNUE9TU0lCTEVfQkVaSUVSX0NPTlNUQU5UID0gMC4wMTtcbnZhciBBVk9JRF9JTVBPU1NJQkxFX0JFWklFUl9DT05TVEFOVF9MID0gTWF0aC5zcXJ0KDIgKiBBVk9JRF9JTVBPU1NJQkxFX0JFWklFUl9DT05TVEFOVCk7XG52YXIgQlJwJGMgPSB7fTtcbkJScCRjLmZpbmRNaWRwdFB0c0V0YyA9IGZ1bmN0aW9uIChlZGdlLCBwYWlySW5mbykge1xuICB2YXIgcG9zUHRzID0gcGFpckluZm8ucG9zUHRzLFxuICAgIGludGVyc2VjdGlvblB0cyA9IHBhaXJJbmZvLmludGVyc2VjdGlvblB0cyxcbiAgICB2ZWN0b3JOb3JtSW52ZXJzZSA9IHBhaXJJbmZvLnZlY3Rvck5vcm1JbnZlcnNlO1xuICB2YXIgbWlkcHRQdHM7XG5cbiAgLy8gbi5iLiBhc3N1bWVzIGFsbCBlZGdlcyBpbiBiZXppZXIgYnVuZGxlIGhhdmUgc2FtZSBlbmRwb2ludHMgc3BlY2lmaWVkXG4gIHZhciBzcmNNYW5FbmRwdCA9IGVkZ2UucHN0eWxlKCdzb3VyY2UtZW5kcG9pbnQnKTtcbiAgdmFyIHRndE1hbkVuZHB0ID0gZWRnZS5wc3R5bGUoJ3RhcmdldC1lbmRwb2ludCcpO1xuICB2YXIgaGF2ZU1hbnVhbEVuZFB0cyA9IHNyY01hbkVuZHB0LnVuaXRzICE9IG51bGwgJiYgdGd0TWFuRW5kcHQudW5pdHMgIT0gbnVsbDtcbiAgdmFyIHJlY2FsY1ZlY3Rvck5vcm1JbnZlcnNlID0gZnVuY3Rpb24gcmVjYWxjVmVjdG9yTm9ybUludmVyc2UoeDEsIHkxLCB4MiwgeTIpIHtcbiAgICB2YXIgZHkgPSB5MiAtIHkxO1xuICAgIHZhciBkeCA9IHgyIC0geDE7XG4gICAgdmFyIGwgPSBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpO1xuICAgIHJldHVybiB7XG4gICAgICB4OiAtZHkgLyBsLFxuICAgICAgeTogZHggLyBsXG4gICAgfTtcbiAgfTtcbiAgdmFyIGVkZ2VEaXN0YW5jZXMgPSBlZGdlLnBzdHlsZSgnZWRnZS1kaXN0YW5jZXMnKS52YWx1ZTtcbiAgc3dpdGNoIChlZGdlRGlzdGFuY2VzKSB7XG4gICAgY2FzZSAnbm9kZS1wb3NpdGlvbic6XG4gICAgICBtaWRwdFB0cyA9IHBvc1B0cztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2ludGVyc2VjdGlvbic6XG4gICAgICBtaWRwdFB0cyA9IGludGVyc2VjdGlvblB0cztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2VuZHBvaW50cyc6XG4gICAgICB7XG4gICAgICAgIGlmIChoYXZlTWFudWFsRW5kUHRzKSB7XG4gICAgICAgICAgdmFyIF90aGlzJG1hbnVhbEVuZHB0VG9QeCA9IHRoaXMubWFudWFsRW5kcHRUb1B4KGVkZ2Uuc291cmNlKClbMF0sIHNyY01hbkVuZHB0KSxcbiAgICAgICAgICAgIF90aGlzJG1hbnVhbEVuZHB0VG9QeDIgPSBfc2xpY2VkVG9BcnJheShfdGhpcyRtYW51YWxFbmRwdFRvUHgsIDIpLFxuICAgICAgICAgICAgeDEgPSBfdGhpcyRtYW51YWxFbmRwdFRvUHgyWzBdLFxuICAgICAgICAgICAgeTEgPSBfdGhpcyRtYW51YWxFbmRwdFRvUHgyWzFdO1xuICAgICAgICAgIHZhciBfdGhpcyRtYW51YWxFbmRwdFRvUHgzID0gdGhpcy5tYW51YWxFbmRwdFRvUHgoZWRnZS50YXJnZXQoKVswXSwgdGd0TWFuRW5kcHQpLFxuICAgICAgICAgICAgX3RoaXMkbWFudWFsRW5kcHRUb1B4NCA9IF9zbGljZWRUb0FycmF5KF90aGlzJG1hbnVhbEVuZHB0VG9QeDMsIDIpLFxuICAgICAgICAgICAgeDIgPSBfdGhpcyRtYW51YWxFbmRwdFRvUHg0WzBdLFxuICAgICAgICAgICAgeTIgPSBfdGhpcyRtYW51YWxFbmRwdFRvUHg0WzFdO1xuICAgICAgICAgIHZhciBlbmRQdHMgPSB7XG4gICAgICAgICAgICB4MTogeDEsXG4gICAgICAgICAgICB5MTogeTEsXG4gICAgICAgICAgICB4MjogeDIsXG4gICAgICAgICAgICB5MjogeTJcbiAgICAgICAgICB9O1xuICAgICAgICAgIHZlY3Rvck5vcm1JbnZlcnNlID0gcmVjYWxjVmVjdG9yTm9ybUludmVyc2UoeDEsIHkxLCB4MiwgeTIpO1xuICAgICAgICAgIG1pZHB0UHRzID0gZW5kUHRzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHdhcm4oXCJFZGdlIFwiLmNvbmNhdChlZGdlLmlkKCksIFwiIGhhcyBlZGdlLWRpc3RhbmNlczplbmRwb2ludHMgc3BlY2lmaWVkIHdpdGhvdXQgbWFudWFsIGVuZHBvaW50cyBzcGVjaWZpZWQgdmlhIHNvdXJjZS1lbmRwb2ludCBhbmQgdGFyZ2V0LWVuZHBvaW50LiAgRmFsbGluZyBiYWNrIG9uIGVkZ2UtZGlzdGFuY2VzOmludGVyc2VjdGlvbiAoZGVmYXVsdCkuXCIpKTtcbiAgICAgICAgICBtaWRwdFB0cyA9IGludGVyc2VjdGlvblB0czsgLy8gYmFjayB0byBkZWZhdWx0XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBtaWRwdFB0czogbWlkcHRQdHMsXG4gICAgdmVjdG9yTm9ybUludmVyc2U6IHZlY3Rvck5vcm1JbnZlcnNlXG4gIH07XG59O1xuQlJwJGMuZmluZEhheXN0YWNrUG9pbnRzID0gZnVuY3Rpb24gKGVkZ2VzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWRnZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZWRnZSA9IGVkZ2VzW2ldO1xuICAgIHZhciBfcCA9IGVkZ2UuX3ByaXZhdGU7XG4gICAgdmFyIHJzID0gX3AucnNjcmF0Y2g7XG4gICAgaWYgKCFycy5oYXlzdGFjaykge1xuICAgICAgdmFyIGFuZ2xlID0gTWF0aC5yYW5kb20oKSAqIDIgKiBNYXRoLlBJO1xuICAgICAgcnMuc291cmNlID0ge1xuICAgICAgICB4OiBNYXRoLmNvcyhhbmdsZSksXG4gICAgICAgIHk6IE1hdGguc2luKGFuZ2xlKVxuICAgICAgfTtcbiAgICAgIGFuZ2xlID0gTWF0aC5yYW5kb20oKSAqIDIgKiBNYXRoLlBJO1xuICAgICAgcnMudGFyZ2V0ID0ge1xuICAgICAgICB4OiBNYXRoLmNvcyhhbmdsZSksXG4gICAgICAgIHk6IE1hdGguc2luKGFuZ2xlKVxuICAgICAgfTtcbiAgICB9XG4gICAgdmFyIHNyYyA9IF9wLnNvdXJjZTtcbiAgICB2YXIgdGd0ID0gX3AudGFyZ2V0O1xuICAgIHZhciBzcmNQb3MgPSBzcmMucG9zaXRpb24oKTtcbiAgICB2YXIgdGd0UG9zID0gdGd0LnBvc2l0aW9uKCk7XG4gICAgdmFyIHNyY1cgPSBzcmMud2lkdGgoKTtcbiAgICB2YXIgdGd0VyA9IHRndC53aWR0aCgpO1xuICAgIHZhciBzcmNIID0gc3JjLmhlaWdodCgpO1xuICAgIHZhciB0Z3RIID0gdGd0LmhlaWdodCgpO1xuICAgIHZhciByYWRpdXMgPSBlZGdlLnBzdHlsZSgnaGF5c3RhY2stcmFkaXVzJykudmFsdWU7XG4gICAgdmFyIGhhbGZSYWRpdXMgPSByYWRpdXMgLyAyOyAvLyBiL2MgaGF2ZSB0byBoYWxmIHdpZHRoL2hlaWdodFxuXG4gICAgcnMuaGF5c3RhY2tQdHMgPSBycy5hbGxwdHMgPSBbcnMuc291cmNlLnggKiBzcmNXICogaGFsZlJhZGl1cyArIHNyY1Bvcy54LCBycy5zb3VyY2UueSAqIHNyY0ggKiBoYWxmUmFkaXVzICsgc3JjUG9zLnksIHJzLnRhcmdldC54ICogdGd0VyAqIGhhbGZSYWRpdXMgKyB0Z3RQb3MueCwgcnMudGFyZ2V0LnkgKiB0Z3RIICogaGFsZlJhZGl1cyArIHRndFBvcy55XTtcbiAgICBycy5taWRYID0gKHJzLmFsbHB0c1swXSArIHJzLmFsbHB0c1syXSkgLyAyO1xuICAgIHJzLm1pZFkgPSAocnMuYWxscHRzWzFdICsgcnMuYWxscHRzWzNdKSAvIDI7XG5cbiAgICAvLyBhbHdheXMgb3ZlcnJpZGUgYXMgaGF5c3RhY2sgaW4gY2FzZSBzZXQgdG8gZGlmZmVyZW50IHR5cGUgcHJldmlvdXNseVxuICAgIHJzLmVkZ2VUeXBlID0gJ2hheXN0YWNrJztcbiAgICBycy5oYXlzdGFjayA9IHRydWU7XG4gICAgdGhpcy5zdG9yZUVkZ2VQcm9qZWN0aW9ucyhlZGdlKTtcbiAgICB0aGlzLmNhbGN1bGF0ZUFycm93QW5nbGVzKGVkZ2UpO1xuICAgIHRoaXMucmVjYWxjdWxhdGVFZGdlTGFiZWxQcm9qZWN0aW9ucyhlZGdlKTtcbiAgICB0aGlzLmNhbGN1bGF0ZUxhYmVsQW5nbGVzKGVkZ2UpO1xuICB9XG59O1xuQlJwJGMuZmluZFNlZ21lbnRzUG9pbnRzID0gZnVuY3Rpb24gKGVkZ2UsIHBhaXJJbmZvKSB7XG4gIC8vIFNlZ21lbnRzIChtdWx0aXBsZSBzdHJhaWdodCBsaW5lcylcblxuICB2YXIgcnMgPSBlZGdlLl9wcml2YXRlLnJzY3JhdGNoO1xuICB2YXIgc2VnbWVudFdzID0gZWRnZS5wc3R5bGUoJ3NlZ21lbnQtd2VpZ2h0cycpO1xuICB2YXIgc2VnbWVudERzID0gZWRnZS5wc3R5bGUoJ3NlZ21lbnQtZGlzdGFuY2VzJyk7XG4gIHZhciBzZWdtZW50UnMgPSBlZGdlLnBzdHlsZSgnc2VnbWVudC1yYWRpaScpO1xuICB2YXIgc2VnbWVudFRzID0gZWRnZS5wc3R5bGUoJ3JhZGl1cy10eXBlJyk7XG4gIHZhciBzZWdtZW50c04gPSBNYXRoLm1pbihzZWdtZW50V3MucGZWYWx1ZS5sZW5ndGgsIHNlZ21lbnREcy5wZlZhbHVlLmxlbmd0aCk7XG4gIHZhciBsYXN0UmFkaXVzID0gc2VnbWVudFJzLnBmVmFsdWVbc2VnbWVudFJzLnBmVmFsdWUubGVuZ3RoIC0gMV07XG4gIHZhciBsYXN0UmFkaXVzVHlwZSA9IHNlZ21lbnRUcy5wZlZhbHVlW3NlZ21lbnRUcy5wZlZhbHVlLmxlbmd0aCAtIDFdO1xuICBycy5lZGdlVHlwZSA9ICdzZWdtZW50cyc7XG4gIHJzLnNlZ3B0cyA9IFtdO1xuICBycy5yYWRpaSA9IFtdO1xuICBycy5pc0FyY1JhZGl1cyA9IFtdO1xuICBmb3IgKHZhciBzID0gMDsgcyA8IHNlZ21lbnRzTjsgcysrKSB7XG4gICAgdmFyIHcgPSBzZWdtZW50V3MucGZWYWx1ZVtzXTtcbiAgICB2YXIgZCA9IHNlZ21lbnREcy5wZlZhbHVlW3NdO1xuICAgIHZhciB3MSA9IDEgLSB3O1xuICAgIHZhciB3MiA9IHc7XG4gICAgdmFyIF90aGlzJGZpbmRNaWRwdFB0c0V0YyA9IHRoaXMuZmluZE1pZHB0UHRzRXRjKGVkZ2UsIHBhaXJJbmZvKSxcbiAgICAgIG1pZHB0UHRzID0gX3RoaXMkZmluZE1pZHB0UHRzRXRjLm1pZHB0UHRzLFxuICAgICAgdmVjdG9yTm9ybUludmVyc2UgPSBfdGhpcyRmaW5kTWlkcHRQdHNFdGMudmVjdG9yTm9ybUludmVyc2U7XG4gICAgdmFyIGFkanVzdGVkTWlkcHQgPSB7XG4gICAgICB4OiBtaWRwdFB0cy54MSAqIHcxICsgbWlkcHRQdHMueDIgKiB3MixcbiAgICAgIHk6IG1pZHB0UHRzLnkxICogdzEgKyBtaWRwdFB0cy55MiAqIHcyXG4gICAgfTtcbiAgICBycy5zZWdwdHMucHVzaChhZGp1c3RlZE1pZHB0LnggKyB2ZWN0b3JOb3JtSW52ZXJzZS54ICogZCwgYWRqdXN0ZWRNaWRwdC55ICsgdmVjdG9yTm9ybUludmVyc2UueSAqIGQpO1xuICAgIHJzLnJhZGlpLnB1c2goc2VnbWVudFJzLnBmVmFsdWVbc10gIT09IHVuZGVmaW5lZCA/IHNlZ21lbnRScy5wZlZhbHVlW3NdIDogbGFzdFJhZGl1cyk7XG4gICAgcnMuaXNBcmNSYWRpdXMucHVzaCgoc2VnbWVudFRzLnBmVmFsdWVbc10gIT09IHVuZGVmaW5lZCA/IHNlZ21lbnRUcy5wZlZhbHVlW3NdIDogbGFzdFJhZGl1c1R5cGUpID09PSAnYXJjLXJhZGl1cycpO1xuICB9XG59O1xuQlJwJGMuZmluZExvb3BQb2ludHMgPSBmdW5jdGlvbiAoZWRnZSwgcGFpckluZm8sIGksIGVkZ2VJc1VuYnVuZGxlZCkge1xuICAvLyBTZWxmLWVkZ2VcblxuICB2YXIgcnMgPSBlZGdlLl9wcml2YXRlLnJzY3JhdGNoO1xuICB2YXIgZGlyQ291bnRzID0gcGFpckluZm8uZGlyQ291bnRzLFxuICAgIHNyY1BvcyA9IHBhaXJJbmZvLnNyY1BvcztcbiAgdmFyIGN0cmxwdERpc3RzID0gZWRnZS5wc3R5bGUoJ2NvbnRyb2wtcG9pbnQtZGlzdGFuY2VzJyk7XG4gIHZhciBjdHJscHREaXN0ID0gY3RybHB0RGlzdHMgPyBjdHJscHREaXN0cy5wZlZhbHVlWzBdIDogdW5kZWZpbmVkO1xuICB2YXIgbG9vcERpciA9IGVkZ2UucHN0eWxlKCdsb29wLWRpcmVjdGlvbicpLnBmVmFsdWU7XG4gIHZhciBsb29wU3dwID0gZWRnZS5wc3R5bGUoJ2xvb3Atc3dlZXAnKS5wZlZhbHVlO1xuICB2YXIgc3RlcFNpemUgPSBlZGdlLnBzdHlsZSgnY29udHJvbC1wb2ludC1zdGVwLXNpemUnKS5wZlZhbHVlO1xuICBycy5lZGdlVHlwZSA9ICdzZWxmJztcbiAgdmFyIGogPSBpO1xuICB2YXIgbG9vcERpc3QgPSBzdGVwU2l6ZTtcbiAgaWYgKGVkZ2VJc1VuYnVuZGxlZCkge1xuICAgIGogPSAwO1xuICAgIGxvb3BEaXN0ID0gY3RybHB0RGlzdDtcbiAgfVxuICB2YXIgbG9vcEFuZ2xlID0gbG9vcERpciAtIE1hdGguUEkgLyAyO1xuICB2YXIgb3V0QW5nbGUgPSBsb29wQW5nbGUgLSBsb29wU3dwIC8gMjtcbiAgdmFyIGluQW5nbGUgPSBsb29wQW5nbGUgKyBsb29wU3dwIC8gMjtcblxuICAvLyBpbmNyZWFzZSBieSBzdGVwIHNpemUgZm9yIG92ZXJsYXBwaW5nIGxvb3BzLCBrZXllZCBvbiBkaXJlY3Rpb24gYW5kIHN3ZWVwIHZhbHVlc1xuICB2YXIgZGMgPSBTdHJpbmcobG9vcERpciArICdfJyArIGxvb3BTd3ApO1xuICBqID0gZGlyQ291bnRzW2RjXSA9PT0gdW5kZWZpbmVkID8gZGlyQ291bnRzW2RjXSA9IDAgOiArK2RpckNvdW50c1tkY107XG4gIHJzLmN0cmxwdHMgPSBbc3JjUG9zLnggKyBNYXRoLmNvcyhvdXRBbmdsZSkgKiAxLjQgKiBsb29wRGlzdCAqIChqIC8gMyArIDEpLCBzcmNQb3MueSArIE1hdGguc2luKG91dEFuZ2xlKSAqIDEuNCAqIGxvb3BEaXN0ICogKGogLyAzICsgMSksIHNyY1Bvcy54ICsgTWF0aC5jb3MoaW5BbmdsZSkgKiAxLjQgKiBsb29wRGlzdCAqIChqIC8gMyArIDEpLCBzcmNQb3MueSArIE1hdGguc2luKGluQW5nbGUpICogMS40ICogbG9vcERpc3QgKiAoaiAvIDMgKyAxKV07XG59O1xuQlJwJGMuZmluZENvbXBvdW5kTG9vcFBvaW50cyA9IGZ1bmN0aW9uIChlZGdlLCBwYWlySW5mbywgaSwgZWRnZUlzVW5idW5kbGVkKSB7XG4gIC8vIENvbXBvdW5kIGVkZ2VcblxuICB2YXIgcnMgPSBlZGdlLl9wcml2YXRlLnJzY3JhdGNoO1xuICBycy5lZGdlVHlwZSA9ICdjb21wb3VuZCc7XG4gIHZhciBzcmNQb3MgPSBwYWlySW5mby5zcmNQb3MsXG4gICAgdGd0UG9zID0gcGFpckluZm8udGd0UG9zLFxuICAgIHNyY1cgPSBwYWlySW5mby5zcmNXLFxuICAgIHNyY0ggPSBwYWlySW5mby5zcmNILFxuICAgIHRndFcgPSBwYWlySW5mby50Z3RXLFxuICAgIHRndEggPSBwYWlySW5mby50Z3RIO1xuICB2YXIgc3RlcFNpemUgPSBlZGdlLnBzdHlsZSgnY29udHJvbC1wb2ludC1zdGVwLXNpemUnKS5wZlZhbHVlO1xuICB2YXIgY3RybHB0RGlzdHMgPSBlZGdlLnBzdHlsZSgnY29udHJvbC1wb2ludC1kaXN0YW5jZXMnKTtcbiAgdmFyIGN0cmxwdERpc3QgPSBjdHJscHREaXN0cyA/IGN0cmxwdERpc3RzLnBmVmFsdWVbMF0gOiB1bmRlZmluZWQ7XG4gIHZhciBqID0gaTtcbiAgdmFyIGxvb3BEaXN0ID0gc3RlcFNpemU7XG4gIGlmIChlZGdlSXNVbmJ1bmRsZWQpIHtcbiAgICBqID0gMDtcbiAgICBsb29wRGlzdCA9IGN0cmxwdERpc3Q7XG4gIH1cbiAgdmFyIGxvb3BXID0gNTA7XG4gIHZhciBsb29wYVBvcyA9IHtcbiAgICB4OiBzcmNQb3MueCAtIHNyY1cgLyAyLFxuICAgIHk6IHNyY1Bvcy55IC0gc3JjSCAvIDJcbiAgfTtcbiAgdmFyIGxvb3BiUG9zID0ge1xuICAgIHg6IHRndFBvcy54IC0gdGd0VyAvIDIsXG4gICAgeTogdGd0UG9zLnkgLSB0Z3RIIC8gMlxuICB9O1xuICB2YXIgbG9vcFBvcyA9IHtcbiAgICB4OiBNYXRoLm1pbihsb29wYVBvcy54LCBsb29wYlBvcy54KSxcbiAgICB5OiBNYXRoLm1pbihsb29wYVBvcy55LCBsb29wYlBvcy55KVxuICB9O1xuXG4gIC8vIGF2b2lkcyBjYXNlcyB3aXRoIGltcG9zc2libGUgYmV6aWVyc1xuICB2YXIgbWluQ29tcG91bmRTdHJldGNoID0gMC41O1xuICB2YXIgY29tcG91bmRTdHJldGNoQSA9IE1hdGgubWF4KG1pbkNvbXBvdW5kU3RyZXRjaCwgTWF0aC5sb2coc3JjVyAqIEFWT0lEX0lNUE9TU0lCTEVfQkVaSUVSX0NPTlNUQU5UKSk7XG4gIHZhciBjb21wb3VuZFN0cmV0Y2hCID0gTWF0aC5tYXgobWluQ29tcG91bmRTdHJldGNoLCBNYXRoLmxvZyh0Z3RXICogQVZPSURfSU1QT1NTSUJMRV9CRVpJRVJfQ09OU1RBTlQpKTtcbiAgcnMuY3RybHB0cyA9IFtsb29wUG9zLngsIGxvb3BQb3MueSAtICgxICsgTWF0aC5wb3cobG9vcFcsIDEuMTIpIC8gMTAwKSAqIGxvb3BEaXN0ICogKGogLyAzICsgMSkgKiBjb21wb3VuZFN0cmV0Y2hBLCBsb29wUG9zLnggLSAoMSArIE1hdGgucG93KGxvb3BXLCAxLjEyKSAvIDEwMCkgKiBsb29wRGlzdCAqIChqIC8gMyArIDEpICogY29tcG91bmRTdHJldGNoQiwgbG9vcFBvcy55XTtcbn07XG5CUnAkYy5maW5kU3RyYWlnaHRFZGdlUG9pbnRzID0gZnVuY3Rpb24gKGVkZ2UpIHtcbiAgLy8gU3RyYWlnaHQgZWRnZSB3aXRoaW4gYnVuZGxlXG5cbiAgZWRnZS5fcHJpdmF0ZS5yc2NyYXRjaC5lZGdlVHlwZSA9ICdzdHJhaWdodCc7XG59O1xuQlJwJGMuZmluZEJlemllclBvaW50cyA9IGZ1bmN0aW9uIChlZGdlLCBwYWlySW5mbywgaSwgZWRnZUlzVW5idW5kbGVkLCBlZGdlSXNTd2FwcGVkKSB7XG4gIHZhciBycyA9IGVkZ2UuX3ByaXZhdGUucnNjcmF0Y2g7XG4gIHZhciBzdGVwU2l6ZSA9IGVkZ2UucHN0eWxlKCdjb250cm9sLXBvaW50LXN0ZXAtc2l6ZScpLnBmVmFsdWU7XG4gIHZhciBjdHJscHREaXN0cyA9IGVkZ2UucHN0eWxlKCdjb250cm9sLXBvaW50LWRpc3RhbmNlcycpO1xuICB2YXIgY3RybHB0V3MgPSBlZGdlLnBzdHlsZSgnY29udHJvbC1wb2ludC13ZWlnaHRzJyk7XG4gIHZhciBiZXppZXJOID0gY3RybHB0RGlzdHMgJiYgY3RybHB0V3MgPyBNYXRoLm1pbihjdHJscHREaXN0cy52YWx1ZS5sZW5ndGgsIGN0cmxwdFdzLnZhbHVlLmxlbmd0aCkgOiAxO1xuICB2YXIgY3RybHB0RGlzdCA9IGN0cmxwdERpc3RzID8gY3RybHB0RGlzdHMucGZWYWx1ZVswXSA6IHVuZGVmaW5lZDtcbiAgdmFyIGN0cmxwdFdlaWdodCA9IGN0cmxwdFdzLnZhbHVlWzBdO1xuXG4gIC8vIChNdWx0aSliZXppZXJcblxuICB2YXIgbXVsdGkgPSBlZGdlSXNVbmJ1bmRsZWQ7XG4gIHJzLmVkZ2VUeXBlID0gbXVsdGkgPyAnbXVsdGliZXppZXInIDogJ2Jlemllcic7XG4gIHJzLmN0cmxwdHMgPSBbXTtcbiAgZm9yICh2YXIgYiA9IDA7IGIgPCBiZXppZXJOOyBiKyspIHtcbiAgICB2YXIgbm9ybWN0cmxwdERpc3QgPSAoMC41IC0gcGFpckluZm8uZWxlcy5sZW5ndGggLyAyICsgaSkgKiBzdGVwU2l6ZSAqIChlZGdlSXNTd2FwcGVkID8gLTEgOiAxKTtcbiAgICB2YXIgbWFuY3RybHB0RGlzdCA9IHZvaWQgMDtcbiAgICB2YXIgc2lnbiA9IHNpZ251bShub3JtY3RybHB0RGlzdCk7XG4gICAgaWYgKG11bHRpKSB7XG4gICAgICBjdHJscHREaXN0ID0gY3RybHB0RGlzdHMgPyBjdHJscHREaXN0cy5wZlZhbHVlW2JdIDogc3RlcFNpemU7IC8vIGZhbGwgYmFjayBvbiBzdGVwIHNpemVcbiAgICAgIGN0cmxwdFdlaWdodCA9IGN0cmxwdFdzLnZhbHVlW2JdO1xuICAgIH1cbiAgICBpZiAoZWRnZUlzVW5idW5kbGVkKSB7XG4gICAgICAvLyBtdWx0aSBvciBzaW5nbGUgdW5idW5kbGVkXG4gICAgICBtYW5jdHJscHREaXN0ID0gY3RybHB0RGlzdDtcbiAgICB9IGVsc2Uge1xuICAgICAgbWFuY3RybHB0RGlzdCA9IGN0cmxwdERpc3QgIT09IHVuZGVmaW5lZCA/IHNpZ24gKiBjdHJscHREaXN0IDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICB2YXIgZGlzdGFuY2VGcm9tTWlkcG9pbnQgPSBtYW5jdHJscHREaXN0ICE9PSB1bmRlZmluZWQgPyBtYW5jdHJscHREaXN0IDogbm9ybWN0cmxwdERpc3Q7XG4gICAgdmFyIHcxID0gMSAtIGN0cmxwdFdlaWdodDtcbiAgICB2YXIgdzIgPSBjdHJscHRXZWlnaHQ7XG4gICAgdmFyIF90aGlzJGZpbmRNaWRwdFB0c0V0YzIgPSB0aGlzLmZpbmRNaWRwdFB0c0V0YyhlZGdlLCBwYWlySW5mbyksXG4gICAgICBtaWRwdFB0cyA9IF90aGlzJGZpbmRNaWRwdFB0c0V0YzIubWlkcHRQdHMsXG4gICAgICB2ZWN0b3JOb3JtSW52ZXJzZSA9IF90aGlzJGZpbmRNaWRwdFB0c0V0YzIudmVjdG9yTm9ybUludmVyc2U7XG4gICAgdmFyIGFkanVzdGVkTWlkcHQgPSB7XG4gICAgICB4OiBtaWRwdFB0cy54MSAqIHcxICsgbWlkcHRQdHMueDIgKiB3MixcbiAgICAgIHk6IG1pZHB0UHRzLnkxICogdzEgKyBtaWRwdFB0cy55MiAqIHcyXG4gICAgfTtcbiAgICBycy5jdHJscHRzLnB1c2goYWRqdXN0ZWRNaWRwdC54ICsgdmVjdG9yTm9ybUludmVyc2UueCAqIGRpc3RhbmNlRnJvbU1pZHBvaW50LCBhZGp1c3RlZE1pZHB0LnkgKyB2ZWN0b3JOb3JtSW52ZXJzZS55ICogZGlzdGFuY2VGcm9tTWlkcG9pbnQpO1xuICB9XG59O1xuQlJwJGMuZmluZFRheGlQb2ludHMgPSBmdW5jdGlvbiAoZWRnZSwgcGFpckluZm8pIHtcbiAgLy8gVGF4aWNhYiBnZW9tZXRyeSB3aXRoIHR3byB0dXJucyBtYXhpbXVtXG5cbiAgdmFyIHJzID0gZWRnZS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgcnMuZWRnZVR5cGUgPSAnc2VnbWVudHMnO1xuICB2YXIgVkVSVElDQUwgPSAndmVydGljYWwnO1xuICB2YXIgSE9SSVpPTlRBTCA9ICdob3Jpem9udGFsJztcbiAgdmFyIExFRlRXQVJEID0gJ2xlZnR3YXJkJztcbiAgdmFyIFJJR0hUV0FSRCA9ICdyaWdodHdhcmQnO1xuICB2YXIgRE9XTldBUkQgPSAnZG93bndhcmQnO1xuICB2YXIgVVBXQVJEID0gJ3Vwd2FyZCc7XG4gIHZhciBBVVRPID0gJ2F1dG8nO1xuICB2YXIgcG9zUHRzID0gcGFpckluZm8ucG9zUHRzLFxuICAgIHNyY1cgPSBwYWlySW5mby5zcmNXLFxuICAgIHNyY0ggPSBwYWlySW5mby5zcmNILFxuICAgIHRndFcgPSBwYWlySW5mby50Z3RXLFxuICAgIHRndEggPSBwYWlySW5mby50Z3RIO1xuICB2YXIgZWRnZURpc3RhbmNlcyA9IGVkZ2UucHN0eWxlKCdlZGdlLWRpc3RhbmNlcycpLnZhbHVlO1xuICB2YXIgZEluY2x1ZGVzTm9kZUJvZHkgPSBlZGdlRGlzdGFuY2VzICE9PSAnbm9kZS1wb3NpdGlvbic7XG4gIHZhciB0YXhpRGlyID0gZWRnZS5wc3R5bGUoJ3RheGktZGlyZWN0aW9uJykudmFsdWU7XG4gIHZhciByYXdUYXhpRGlyID0gdGF4aURpcjsgLy8gdW5wcm9jZXNzZWQgdmFsdWVcbiAgdmFyIHRheGlUdXJuID0gZWRnZS5wc3R5bGUoJ3RheGktdHVybicpO1xuICB2YXIgdHVybklzUGVyY2VudCA9IHRheGlUdXJuLnVuaXRzID09PSAnJSc7XG4gIHZhciB0YXhpVHVyblBmVmFsID0gdGF4aVR1cm4ucGZWYWx1ZTtcbiAgdmFyIHR1cm5Jc05lZ2F0aXZlID0gdGF4aVR1cm5QZlZhbCA8IDA7IC8vIGkuZS4gZnJvbSB0YXJnZXQgc2lkZVxuICB2YXIgbWluRCA9IGVkZ2UucHN0eWxlKCd0YXhpLXR1cm4tbWluLWRpc3RhbmNlJykucGZWYWx1ZTtcbiAgdmFyIGR3ID0gZEluY2x1ZGVzTm9kZUJvZHkgPyAoc3JjVyArIHRndFcpIC8gMiA6IDA7XG4gIHZhciBkaCA9IGRJbmNsdWRlc05vZGVCb2R5ID8gKHNyY0ggKyB0Z3RIKSAvIDIgOiAwO1xuICB2YXIgcGR4ID0gcG9zUHRzLngyIC0gcG9zUHRzLngxO1xuICB2YXIgcGR5ID0gcG9zUHRzLnkyIC0gcG9zUHRzLnkxO1xuXG4gIC8vIHRha2UgYXdheSB0aGUgZWZmZWN0aXZlIHcvaCBmcm9tIHRoZSBtYWduaXR1ZGUgb2YgdGhlIGRlbHRhIHZhbHVlXG4gIHZhciBzdWJEV0ggPSBmdW5jdGlvbiBzdWJEV0goZHh5LCBkd2gpIHtcbiAgICBpZiAoZHh5ID4gMCkge1xuICAgICAgcmV0dXJuIE1hdGgubWF4KGR4eSAtIGR3aCwgMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBNYXRoLm1pbihkeHkgKyBkd2gsIDApO1xuICAgIH1cbiAgfTtcbiAgdmFyIGR4ID0gc3ViRFdIKHBkeCwgZHcpO1xuICB2YXIgZHkgPSBzdWJEV0gocGR5LCBkaCk7XG4gIHZhciBpc0V4cGxpY2l0RGlyID0gZmFsc2U7XG4gIGlmIChyYXdUYXhpRGlyID09PSBBVVRPKSB7XG4gICAgdGF4aURpciA9IE1hdGguYWJzKGR4KSA+IE1hdGguYWJzKGR5KSA/IEhPUklaT05UQUwgOiBWRVJUSUNBTDtcbiAgfSBlbHNlIGlmIChyYXdUYXhpRGlyID09PSBVUFdBUkQgfHwgcmF3VGF4aURpciA9PT0gRE9XTldBUkQpIHtcbiAgICB0YXhpRGlyID0gVkVSVElDQUw7XG4gICAgaXNFeHBsaWNpdERpciA9IHRydWU7XG4gIH0gZWxzZSBpZiAocmF3VGF4aURpciA9PT0gTEVGVFdBUkQgfHwgcmF3VGF4aURpciA9PT0gUklHSFRXQVJEKSB7XG4gICAgdGF4aURpciA9IEhPUklaT05UQUw7XG4gICAgaXNFeHBsaWNpdERpciA9IHRydWU7XG4gIH1cbiAgdmFyIGlzVmVydCA9IHRheGlEaXIgPT09IFZFUlRJQ0FMO1xuICB2YXIgbCA9IGlzVmVydCA/IGR5IDogZHg7XG4gIHZhciBwbCA9IGlzVmVydCA/IHBkeSA6IHBkeDtcbiAgdmFyIHNnbkwgPSBzaWdudW0ocGwpO1xuICB2YXIgZm9yY2VkRGlyID0gZmFsc2U7XG4gIGlmICghKGlzRXhwbGljaXREaXIgJiYgKHR1cm5Jc1BlcmNlbnQgfHwgdHVybklzTmVnYXRpdmUpKSAvLyBmb3JjaW5nIGluIHRoaXMgY2FzZSB3b3VsZCBjYXVzZSB3ZWlyZCBncm93aW5nIGluIHRoZSBvcHBvc2l0ZSBkaXJlY3Rpb25cbiAgJiYgKHJhd1RheGlEaXIgPT09IERPV05XQVJEICYmIHBsIDwgMCB8fCByYXdUYXhpRGlyID09PSBVUFdBUkQgJiYgcGwgPiAwIHx8IHJhd1RheGlEaXIgPT09IExFRlRXQVJEICYmIHBsID4gMCB8fCByYXdUYXhpRGlyID09PSBSSUdIVFdBUkQgJiYgcGwgPCAwKSkge1xuICAgIHNnbkwgKj0gLTE7XG4gICAgbCA9IHNnbkwgKiBNYXRoLmFicyhsKTtcbiAgICBmb3JjZWREaXIgPSB0cnVlO1xuICB9XG4gIHZhciBkO1xuICBpZiAodHVybklzUGVyY2VudCkge1xuICAgIHZhciBwID0gdGF4aVR1cm5QZlZhbCA8IDAgPyAxICsgdGF4aVR1cm5QZlZhbCA6IHRheGlUdXJuUGZWYWw7XG4gICAgZCA9IHAgKiBsO1xuICB9IGVsc2Uge1xuICAgIHZhciBrID0gdGF4aVR1cm5QZlZhbCA8IDAgPyBsIDogMDtcbiAgICBkID0gayArIHRheGlUdXJuUGZWYWwgKiBzZ25MO1xuICB9XG4gIHZhciBnZXRJc1Rvb0Nsb3NlID0gZnVuY3Rpb24gZ2V0SXNUb29DbG9zZShkKSB7XG4gICAgcmV0dXJuIE1hdGguYWJzKGQpIDwgbWluRCB8fCBNYXRoLmFicyhkKSA+PSBNYXRoLmFicyhsKTtcbiAgfTtcbiAgdmFyIGlzVG9vQ2xvc2VTcmMgPSBnZXRJc1Rvb0Nsb3NlKGQpO1xuICB2YXIgaXNUb29DbG9zZVRndCA9IGdldElzVG9vQ2xvc2UoTWF0aC5hYnMobCkgLSBNYXRoLmFicyhkKSk7XG4gIHZhciBpc1Rvb0Nsb3NlID0gaXNUb29DbG9zZVNyYyB8fCBpc1Rvb0Nsb3NlVGd0O1xuICBpZiAoaXNUb29DbG9zZSAmJiAhZm9yY2VkRGlyKSB7XG4gICAgLy8gbm9uLWlkZWFsIHJvdXRpbmdcbiAgICBpZiAoaXNWZXJ0KSB7XG4gICAgICAvLyB2ZXJ0aWNhbCBmYWxsYmFja3NcbiAgICAgIHZhciBsU2hhcGVJbnNpZGVTcmMgPSBNYXRoLmFicyhwbCkgPD0gc3JjSCAvIDI7XG4gICAgICB2YXIgbFNoYXBlSW5zaWRlVGd0ID0gTWF0aC5hYnMocGR4KSA8PSB0Z3RXIC8gMjtcbiAgICAgIGlmIChsU2hhcGVJbnNpZGVTcmMpIHtcbiAgICAgICAgLy8gaG9yaXpvbnRhbCBaLXNoYXBlIChkaXJlY3Rpb24gbm90IHJlc3BlY3RlZClcbiAgICAgICAgdmFyIHggPSAocG9zUHRzLngxICsgcG9zUHRzLngyKSAvIDI7XG4gICAgICAgIHZhciB5MSA9IHBvc1B0cy55MSxcbiAgICAgICAgICB5MiA9IHBvc1B0cy55MjtcbiAgICAgICAgcnMuc2VncHRzID0gW3gsIHkxLCB4LCB5Ml07XG4gICAgICB9IGVsc2UgaWYgKGxTaGFwZUluc2lkZVRndCkge1xuICAgICAgICAvLyB2ZXJ0aWNhbCBaLXNoYXBlIChkaXN0YW5jZSBub3QgcmVzcGVjdGVkKVxuICAgICAgICB2YXIgeSA9IChwb3NQdHMueTEgKyBwb3NQdHMueTIpIC8gMjtcbiAgICAgICAgdmFyIHgxID0gcG9zUHRzLngxLFxuICAgICAgICAgIHgyID0gcG9zUHRzLngyO1xuICAgICAgICBycy5zZWdwdHMgPSBbeDEsIHksIHgyLCB5XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEwtc2hhcGUgZmFsbGJhY2sgKHR1cm4gZGlzdGFuY2Ugbm90IHJlc3BlY3RlZCwgYnV0IHdvcmtzIHdlbGwgd2l0aCB0cmVlIHNpYmxpbmdzKVxuICAgICAgICBycy5zZWdwdHMgPSBbcG9zUHRzLngxLCBwb3NQdHMueTJdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBob3Jpem9udGFsIGZhbGxiYWNrc1xuICAgICAgdmFyIF9sU2hhcGVJbnNpZGVTcmMgPSBNYXRoLmFicyhwbCkgPD0gc3JjVyAvIDI7XG4gICAgICB2YXIgX2xTaGFwZUluc2lkZVRndCA9IE1hdGguYWJzKHBkeSkgPD0gdGd0SCAvIDI7XG4gICAgICBpZiAoX2xTaGFwZUluc2lkZVNyYykge1xuICAgICAgICAvLyB2ZXJ0aWNhbCBaLXNoYXBlIChkaXJlY3Rpb24gbm90IHJlc3BlY3RlZClcbiAgICAgICAgdmFyIF95ID0gKHBvc1B0cy55MSArIHBvc1B0cy55MikgLyAyO1xuICAgICAgICB2YXIgX3ggPSBwb3NQdHMueDEsXG4gICAgICAgICAgX3gyID0gcG9zUHRzLngyO1xuICAgICAgICBycy5zZWdwdHMgPSBbX3gsIF95LCBfeDIsIF95XTtcbiAgICAgIH0gZWxzZSBpZiAoX2xTaGFwZUluc2lkZVRndCkge1xuICAgICAgICAvLyBob3Jpem9udGFsIFotc2hhcGUgKHR1cm4gZGlzdGFuY2Ugbm90IHJlc3BlY3RlZClcbiAgICAgICAgdmFyIF94MyA9IChwb3NQdHMueDEgKyBwb3NQdHMueDIpIC8gMjtcbiAgICAgICAgdmFyIF95MiA9IHBvc1B0cy55MSxcbiAgICAgICAgICBfeTMgPSBwb3NQdHMueTI7XG4gICAgICAgIHJzLnNlZ3B0cyA9IFtfeDMsIF95MiwgX3gzLCBfeTNdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTC1zaGFwZSAodHVybiBkaXN0YW5jZSBub3QgcmVzcGVjdGVkLCBidXQgd29ya3Mgd2VsbCBmb3IgdHJlZSBzaWJsaW5ncylcbiAgICAgICAgcnMuc2VncHRzID0gW3Bvc1B0cy54MiwgcG9zUHRzLnkxXTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gaWRlYWwgcm91dGluZ1xuICAgIGlmIChpc1ZlcnQpIHtcbiAgICAgIHZhciBfeTQgPSBwb3NQdHMueTEgKyBkICsgKGRJbmNsdWRlc05vZGVCb2R5ID8gc3JjSCAvIDIgKiBzZ25MIDogMCk7XG4gICAgICB2YXIgX3g0ID0gcG9zUHRzLngxLFxuICAgICAgICBfeDUgPSBwb3NQdHMueDI7XG4gICAgICBycy5zZWdwdHMgPSBbX3g0LCBfeTQsIF94NSwgX3k0XTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaG9yaXpvbnRhbFxuICAgICAgdmFyIF94NiA9IHBvc1B0cy54MSArIGQgKyAoZEluY2x1ZGVzTm9kZUJvZHkgPyBzcmNXIC8gMiAqIHNnbkwgOiAwKTtcbiAgICAgIHZhciBfeTUgPSBwb3NQdHMueTEsXG4gICAgICAgIF95NiA9IHBvc1B0cy55MjtcbiAgICAgIHJzLnNlZ3B0cyA9IFtfeDYsIF95NSwgX3g2LCBfeTZdO1xuICAgIH1cbiAgfVxuICBpZiAocnMuaXNSb3VuZCkge1xuICAgIHZhciByYWRpdXMgPSBlZGdlLnBzdHlsZSgndGF4aS1yYWRpdXMnKS52YWx1ZTtcbiAgICB2YXIgaXNBcmNSYWRpdXMgPSBlZGdlLnBzdHlsZSgncmFkaXVzLXR5cGUnKS52YWx1ZVswXSA9PT0gJ2FyYy1yYWRpdXMnO1xuICAgIHJzLnJhZGlpID0gbmV3IEFycmF5KHJzLnNlZ3B0cy5sZW5ndGggLyAyKS5maWxsKHJhZGl1cyk7XG4gICAgcnMuaXNBcmNSYWRpdXMgPSBuZXcgQXJyYXkocnMuc2VncHRzLmxlbmd0aCAvIDIpLmZpbGwoaXNBcmNSYWRpdXMpO1xuICB9XG59O1xuQlJwJGMudHJ5VG9Db3JyZWN0SW52YWxpZFBvaW50cyA9IGZ1bmN0aW9uIChlZGdlLCBwYWlySW5mbykge1xuICB2YXIgcnMgPSBlZGdlLl9wcml2YXRlLnJzY3JhdGNoO1xuXG4gIC8vIGNhbiBvbmx5IGNvcnJlY3QgYmV6aWVycyBmb3Igbm93Li4uXG4gIGlmIChycy5lZGdlVHlwZSA9PT0gJ2JlemllcicpIHtcbiAgICB2YXIgc3JjUG9zID0gcGFpckluZm8uc3JjUG9zLFxuICAgICAgdGd0UG9zID0gcGFpckluZm8udGd0UG9zLFxuICAgICAgc3JjVyA9IHBhaXJJbmZvLnNyY1csXG4gICAgICBzcmNIID0gcGFpckluZm8uc3JjSCxcbiAgICAgIHRndFcgPSBwYWlySW5mby50Z3RXLFxuICAgICAgdGd0SCA9IHBhaXJJbmZvLnRndEgsXG4gICAgICBzcmNTaGFwZSA9IHBhaXJJbmZvLnNyY1NoYXBlLFxuICAgICAgdGd0U2hhcGUgPSBwYWlySW5mby50Z3RTaGFwZSxcbiAgICAgIHNyY0Nvcm5lclJhZGl1cyA9IHBhaXJJbmZvLnNyY0Nvcm5lclJhZGl1cyxcbiAgICAgIHRndENvcm5lclJhZGl1cyA9IHBhaXJJbmZvLnRndENvcm5lclJhZGl1cyxcbiAgICAgIHNyY1JzID0gcGFpckluZm8uc3JjUnMsXG4gICAgICB0Z3RScyA9IHBhaXJJbmZvLnRndFJzO1xuICAgIHZhciBiYWRTdGFydCA9ICFudW1iZXIkMShycy5zdGFydFgpIHx8ICFudW1iZXIkMShycy5zdGFydFkpO1xuICAgIHZhciBiYWRBU3RhcnQgPSAhbnVtYmVyJDEocnMuYXJyb3dTdGFydFgpIHx8ICFudW1iZXIkMShycy5hcnJvd1N0YXJ0WSk7XG4gICAgdmFyIGJhZEVuZCA9ICFudW1iZXIkMShycy5lbmRYKSB8fCAhbnVtYmVyJDEocnMuZW5kWSk7XG4gICAgdmFyIGJhZEFFbmQgPSAhbnVtYmVyJDEocnMuYXJyb3dFbmRYKSB8fCAhbnVtYmVyJDEocnMuYXJyb3dFbmRZKTtcbiAgICB2YXIgbWluQ3BBRGlzdEZhY3RvciA9IDM7XG4gICAgdmFyIGFycm93VyA9IHRoaXMuZ2V0QXJyb3dXaWR0aChlZGdlLnBzdHlsZSgnd2lkdGgnKS5wZlZhbHVlLCBlZGdlLnBzdHlsZSgnYXJyb3ctc2NhbGUnKS52YWx1ZSkgKiB0aGlzLmFycm93U2hhcGVXaWR0aDtcbiAgICB2YXIgbWluQ3BBRGlzdCA9IG1pbkNwQURpc3RGYWN0b3IgKiBhcnJvd1c7XG4gICAgdmFyIHN0YXJ0QUNwRGlzdCA9IGRpc3Qoe1xuICAgICAgeDogcnMuY3RybHB0c1swXSxcbiAgICAgIHk6IHJzLmN0cmxwdHNbMV1cbiAgICB9LCB7XG4gICAgICB4OiBycy5zdGFydFgsXG4gICAgICB5OiBycy5zdGFydFlcbiAgICB9KTtcbiAgICB2YXIgY2xvc2VTdGFydEFDcCA9IHN0YXJ0QUNwRGlzdCA8IG1pbkNwQURpc3Q7XG4gICAgdmFyIGVuZEFDcERpc3QgPSBkaXN0KHtcbiAgICAgIHg6IHJzLmN0cmxwdHNbMF0sXG4gICAgICB5OiBycy5jdHJscHRzWzFdXG4gICAgfSwge1xuICAgICAgeDogcnMuZW5kWCxcbiAgICAgIHk6IHJzLmVuZFlcbiAgICB9KTtcbiAgICB2YXIgY2xvc2VFbmRBQ3AgPSBlbmRBQ3BEaXN0IDwgbWluQ3BBRGlzdDtcbiAgICB2YXIgb3ZlcmxhcHBpbmcgPSBmYWxzZTtcbiAgICBpZiAoYmFkU3RhcnQgfHwgYmFkQVN0YXJ0IHx8IGNsb3NlU3RhcnRBQ3ApIHtcbiAgICAgIG92ZXJsYXBwaW5nID0gdHJ1ZTtcblxuICAgICAgLy8gcHJvamVjdCBjb250cm9sIHBvaW50IGFsb25nIGxpbmUgZnJvbSBzcmMgY2VudHJlIHRvIG91dHNpZGUgdGhlIHNyYyBzaGFwZVxuICAgICAgLy8gKG90aGVyd2lzZSBpbnRlcnNlY3Rpb24gd2lsbCB5aWVsZCBub3RoaW5nKVxuICAgICAgdmFyIGNwRCA9IHtcbiAgICAgICAgLy8gZGVsdGFcbiAgICAgICAgeDogcnMuY3RybHB0c1swXSAtIHNyY1Bvcy54LFxuICAgICAgICB5OiBycy5jdHJscHRzWzFdIC0gc3JjUG9zLnlcbiAgICAgIH07XG4gICAgICB2YXIgY3BMID0gTWF0aC5zcXJ0KGNwRC54ICogY3BELnggKyBjcEQueSAqIGNwRC55KTsgLy8gbGVuZ3RoIG9mIGxpbmVcbiAgICAgIHZhciBjcE0gPSB7XG4gICAgICAgIC8vIG5vcm1hbGlzZWQgZGVsdGFcbiAgICAgICAgeDogY3BELnggLyBjcEwsXG4gICAgICAgIHk6IGNwRC55IC8gY3BMXG4gICAgICB9O1xuICAgICAgdmFyIHJhZGl1cyA9IE1hdGgubWF4KHNyY1csIHNyY0gpO1xuICAgICAgdmFyIGNwUHJvaiA9IHtcbiAgICAgICAgLy8gKjIgcmFkaXVzIGd1YXJhbnRlZXMgb3V0c2lkZSBzaGFwZVxuICAgICAgICB4OiBycy5jdHJscHRzWzBdICsgY3BNLnggKiAyICogcmFkaXVzLFxuICAgICAgICB5OiBycy5jdHJscHRzWzFdICsgY3BNLnkgKiAyICogcmFkaXVzXG4gICAgICB9O1xuICAgICAgdmFyIHNyY0N0cmxQdEludG4gPSBzcmNTaGFwZS5pbnRlcnNlY3RMaW5lKHNyY1Bvcy54LCBzcmNQb3MueSwgc3JjVywgc3JjSCwgY3BQcm9qLngsIGNwUHJvai55LCAwLCBzcmNDb3JuZXJSYWRpdXMsIHNyY1JzKTtcbiAgICAgIGlmIChjbG9zZVN0YXJ0QUNwKSB7XG4gICAgICAgIHJzLmN0cmxwdHNbMF0gPSBycy5jdHJscHRzWzBdICsgY3BNLnggKiAobWluQ3BBRGlzdCAtIHN0YXJ0QUNwRGlzdCk7XG4gICAgICAgIHJzLmN0cmxwdHNbMV0gPSBycy5jdHJscHRzWzFdICsgY3BNLnkgKiAobWluQ3BBRGlzdCAtIHN0YXJ0QUNwRGlzdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBycy5jdHJscHRzWzBdID0gc3JjQ3RybFB0SW50blswXSArIGNwTS54ICogbWluQ3BBRGlzdDtcbiAgICAgICAgcnMuY3RybHB0c1sxXSA9IHNyY0N0cmxQdEludG5bMV0gKyBjcE0ueSAqIG1pbkNwQURpc3Q7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChiYWRFbmQgfHwgYmFkQUVuZCB8fCBjbG9zZUVuZEFDcCkge1xuICAgICAgb3ZlcmxhcHBpbmcgPSB0cnVlO1xuXG4gICAgICAvLyBwcm9qZWN0IGNvbnRyb2wgcG9pbnQgYWxvbmcgbGluZSBmcm9tIHRndCBjZW50cmUgdG8gb3V0c2lkZSB0aGUgdGd0IHNoYXBlXG4gICAgICAvLyAob3RoZXJ3aXNlIGludGVyc2VjdGlvbiB3aWxsIHlpZWxkIG5vdGhpbmcpXG4gICAgICB2YXIgX2NwRCA9IHtcbiAgICAgICAgLy8gZGVsdGFcbiAgICAgICAgeDogcnMuY3RybHB0c1swXSAtIHRndFBvcy54LFxuICAgICAgICB5OiBycy5jdHJscHRzWzFdIC0gdGd0UG9zLnlcbiAgICAgIH07XG4gICAgICB2YXIgX2NwTCA9IE1hdGguc3FydChfY3BELnggKiBfY3BELnggKyBfY3BELnkgKiBfY3BELnkpOyAvLyBsZW5ndGggb2YgbGluZVxuICAgICAgdmFyIF9jcE0gPSB7XG4gICAgICAgIC8vIG5vcm1hbGlzZWQgZGVsdGFcbiAgICAgICAgeDogX2NwRC54IC8gX2NwTCxcbiAgICAgICAgeTogX2NwRC55IC8gX2NwTFxuICAgICAgfTtcbiAgICAgIHZhciBfcmFkaXVzID0gTWF0aC5tYXgoc3JjVywgc3JjSCk7XG4gICAgICB2YXIgX2NwUHJvaiA9IHtcbiAgICAgICAgLy8gKjIgcmFkaXVzIGd1YXJhbnRlZXMgb3V0c2lkZSBzaGFwZVxuICAgICAgICB4OiBycy5jdHJscHRzWzBdICsgX2NwTS54ICogMiAqIF9yYWRpdXMsXG4gICAgICAgIHk6IHJzLmN0cmxwdHNbMV0gKyBfY3BNLnkgKiAyICogX3JhZGl1c1xuICAgICAgfTtcbiAgICAgIHZhciB0Z3RDdHJsUHRJbnRuID0gdGd0U2hhcGUuaW50ZXJzZWN0TGluZSh0Z3RQb3MueCwgdGd0UG9zLnksIHRndFcsIHRndEgsIF9jcFByb2oueCwgX2NwUHJvai55LCAwLCB0Z3RDb3JuZXJSYWRpdXMsIHRndFJzKTtcbiAgICAgIGlmIChjbG9zZUVuZEFDcCkge1xuICAgICAgICBycy5jdHJscHRzWzBdID0gcnMuY3RybHB0c1swXSArIF9jcE0ueCAqIChtaW5DcEFEaXN0IC0gZW5kQUNwRGlzdCk7XG4gICAgICAgIHJzLmN0cmxwdHNbMV0gPSBycy5jdHJscHRzWzFdICsgX2NwTS55ICogKG1pbkNwQURpc3QgLSBlbmRBQ3BEaXN0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJzLmN0cmxwdHNbMF0gPSB0Z3RDdHJsUHRJbnRuWzBdICsgX2NwTS54ICogbWluQ3BBRGlzdDtcbiAgICAgICAgcnMuY3RybHB0c1sxXSA9IHRndEN0cmxQdEludG5bMV0gKyBfY3BNLnkgKiBtaW5DcEFEaXN0O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAob3ZlcmxhcHBpbmcpIHtcbiAgICAgIC8vIHJlY2FsYyBlbmRwdHNcbiAgICAgIHRoaXMuZmluZEVuZHBvaW50cyhlZGdlKTtcbiAgICB9XG4gIH1cbn07XG5CUnAkYy5zdG9yZUFsbHB0cyA9IGZ1bmN0aW9uIChlZGdlKSB7XG4gIHZhciBycyA9IGVkZ2UuX3ByaXZhdGUucnNjcmF0Y2g7XG4gIGlmIChycy5lZGdlVHlwZSA9PT0gJ211bHRpYmV6aWVyJyB8fCBycy5lZGdlVHlwZSA9PT0gJ2JlemllcicgfHwgcnMuZWRnZVR5cGUgPT09ICdzZWxmJyB8fCBycy5lZGdlVHlwZSA9PT0gJ2NvbXBvdW5kJykge1xuICAgIHJzLmFsbHB0cyA9IFtdO1xuICAgIHJzLmFsbHB0cy5wdXNoKHJzLnN0YXJ0WCwgcnMuc3RhcnRZKTtcbiAgICBmb3IgKHZhciBiID0gMDsgYiArIDEgPCBycy5jdHJscHRzLmxlbmd0aDsgYiArPSAyKSB7XG4gICAgICAvLyBjdHJsIHB0IGl0c2VsZlxuICAgICAgcnMuYWxscHRzLnB1c2gocnMuY3RybHB0c1tiXSwgcnMuY3RybHB0c1tiICsgMV0pO1xuXG4gICAgICAvLyB0aGUgbWlkcHQgYmV0d2VlbiBjdHJscHRzIGFzIGludGVybWVkaWF0ZSBkZXN0aW5hdGlvbiBwdHNcbiAgICAgIGlmIChiICsgMyA8IHJzLmN0cmxwdHMubGVuZ3RoKSB7XG4gICAgICAgIHJzLmFsbHB0cy5wdXNoKChycy5jdHJscHRzW2JdICsgcnMuY3RybHB0c1tiICsgMl0pIC8gMiwgKHJzLmN0cmxwdHNbYiArIDFdICsgcnMuY3RybHB0c1tiICsgM10pIC8gMik7XG4gICAgICB9XG4gICAgfVxuICAgIHJzLmFsbHB0cy5wdXNoKHJzLmVuZFgsIHJzLmVuZFkpO1xuICAgIHZhciBtLCBtdDtcbiAgICBpZiAocnMuY3RybHB0cy5sZW5ndGggLyAyICUgMiA9PT0gMCkge1xuICAgICAgbSA9IHJzLmFsbHB0cy5sZW5ndGggLyAyIC0gMTtcbiAgICAgIHJzLm1pZFggPSBycy5hbGxwdHNbbV07XG4gICAgICBycy5taWRZID0gcnMuYWxscHRzW20gKyAxXTtcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IHJzLmFsbHB0cy5sZW5ndGggLyAyIC0gMztcbiAgICAgIG10ID0gMC41O1xuICAgICAgcnMubWlkWCA9IHFiZXppZXJBdChycy5hbGxwdHNbbV0sIHJzLmFsbHB0c1ttICsgMl0sIHJzLmFsbHB0c1ttICsgNF0sIG10KTtcbiAgICAgIHJzLm1pZFkgPSBxYmV6aWVyQXQocnMuYWxscHRzW20gKyAxXSwgcnMuYWxscHRzW20gKyAzXSwgcnMuYWxscHRzW20gKyA1XSwgbXQpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChycy5lZGdlVHlwZSA9PT0gJ3N0cmFpZ2h0Jykge1xuICAgIC8vIG5lZWQgdG8gY2FsYyB0aGVzZSBhZnRlciBlbmRwdHNcbiAgICBycy5hbGxwdHMgPSBbcnMuc3RhcnRYLCBycy5zdGFydFksIHJzLmVuZFgsIHJzLmVuZFldO1xuXG4gICAgLy8gZGVmYXVsdCBtaWRwdCBmb3IgbGFiZWxzIGV0Y1xuICAgIHJzLm1pZFggPSAocnMuc3RhcnRYICsgcnMuZW5kWCArIHJzLmFycm93U3RhcnRYICsgcnMuYXJyb3dFbmRYKSAvIDQ7XG4gICAgcnMubWlkWSA9IChycy5zdGFydFkgKyBycy5lbmRZICsgcnMuYXJyb3dTdGFydFkgKyBycy5hcnJvd0VuZFkpIC8gNDtcbiAgfSBlbHNlIGlmIChycy5lZGdlVHlwZSA9PT0gJ3NlZ21lbnRzJykge1xuICAgIHJzLmFsbHB0cyA9IFtdO1xuICAgIHJzLmFsbHB0cy5wdXNoKHJzLnN0YXJ0WCwgcnMuc3RhcnRZKTtcbiAgICBycy5hbGxwdHMucHVzaC5hcHBseShycy5hbGxwdHMsIHJzLnNlZ3B0cyk7XG4gICAgcnMuYWxscHRzLnB1c2gocnMuZW5kWCwgcnMuZW5kWSk7XG4gICAgaWYgKHJzLmlzUm91bmQpIHtcbiAgICAgIHJzLnJvdW5kQ29ybmVycyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDI7IGkgKyAzIDwgcnMuYWxscHRzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgIHZhciByYWRpdXMgPSBycy5yYWRpaVtpIC8gMiAtIDFdO1xuICAgICAgICB2YXIgaXNBcmNSYWRpdXMgPSBycy5pc0FyY1JhZGl1c1tpIC8gMiAtIDFdO1xuICAgICAgICBycy5yb3VuZENvcm5lcnMucHVzaChnZXRSb3VuZENvcm5lcih7XG4gICAgICAgICAgeDogcnMuYWxscHRzW2kgLSAyXSxcbiAgICAgICAgICB5OiBycy5hbGxwdHNbaSAtIDFdXG4gICAgICAgIH0sIHtcbiAgICAgICAgICB4OiBycy5hbGxwdHNbaV0sXG4gICAgICAgICAgeTogcnMuYWxscHRzW2kgKyAxXSxcbiAgICAgICAgICByYWRpdXM6IHJhZGl1c1xuICAgICAgICB9LCB7XG4gICAgICAgICAgeDogcnMuYWxscHRzW2kgKyAyXSxcbiAgICAgICAgICB5OiBycy5hbGxwdHNbaSArIDNdXG4gICAgICAgIH0sIHJhZGl1cywgaXNBcmNSYWRpdXMpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJzLnNlZ3B0cy5sZW5ndGggJSA0ID09PSAwKSB7XG4gICAgICB2YXIgaTIgPSBycy5zZWdwdHMubGVuZ3RoIC8gMjtcbiAgICAgIHZhciBpMSA9IGkyIC0gMjtcbiAgICAgIHJzLm1pZFggPSAocnMuc2VncHRzW2kxXSArIHJzLnNlZ3B0c1tpMl0pIC8gMjtcbiAgICAgIHJzLm1pZFkgPSAocnMuc2VncHRzW2kxICsgMV0gKyBycy5zZWdwdHNbaTIgKyAxXSkgLyAyO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgX2kgPSBycy5zZWdwdHMubGVuZ3RoIC8gMiAtIDE7XG4gICAgICBpZiAoIXJzLmlzUm91bmQpIHtcbiAgICAgICAgcnMubWlkWCA9IHJzLnNlZ3B0c1tfaV07XG4gICAgICAgIHJzLm1pZFkgPSBycy5zZWdwdHNbX2kgKyAxXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBwb2ludCA9IHtcbiAgICAgICAgICB4OiBycy5zZWdwdHNbX2ldLFxuICAgICAgICAgIHk6IHJzLnNlZ3B0c1tfaSArIDFdXG4gICAgICAgIH07XG4gICAgICAgIHZhciBjb3JuZXIgPSBycy5yb3VuZENvcm5lcnNbX2kgLyAyXTtcbiAgICAgICAgaWYgKGNvcm5lci5yYWRpdXMgPT09IDApIHtcbiAgICAgICAgICAvLyBPbiBjb2xsaW5lYXIgcG9pbnRzXG4gICAgICAgICAgdmFyIG5leHRQb2ludCA9IHtcbiAgICAgICAgICAgIHg6IHJzLnNlZ3B0c1tfaSArIDJdLFxuICAgICAgICAgICAgeTogcnMuc2VncHRzW19pICsgM11cbiAgICAgICAgICB9O1xuICAgICAgICAgIHJzLm1pZFggPSBwb2ludC54O1xuICAgICAgICAgIHJzLm1pZFkgPSBwb2ludC55O1xuICAgICAgICAgIHJzLm1pZFZlY3RvciA9IFtwb2ludC55IC0gbmV4dFBvaW50LnksIG5leHRQb2ludC54IC0gcG9pbnQueF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gT24gcm91bmRlZCBwb2ludHNcbiAgICAgICAgICB2YXIgdiA9IFtwb2ludC54IC0gY29ybmVyLmN4LCBwb2ludC55IC0gY29ybmVyLmN5XTtcbiAgICAgICAgICB2YXIgZmFjdG9yID0gY29ybmVyLnJhZGl1cyAvIE1hdGguc3FydChNYXRoLnBvdyh2WzBdLCAyKSArIE1hdGgucG93KHZbMV0sIDIpKTtcbiAgICAgICAgICB2ID0gdi5tYXAoZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgICAgIHJldHVybiBjICogZmFjdG9yO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJzLm1pZFggPSBjb3JuZXIuY3ggKyB2WzBdO1xuICAgICAgICAgIHJzLm1pZFkgPSBjb3JuZXIuY3kgKyB2WzFdO1xuICAgICAgICAgIHJzLm1pZFZlY3RvciA9IHY7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5CUnAkYy5jaGVja0ZvckludmFsaWRFZGdlV2FybmluZyA9IGZ1bmN0aW9uIChlZGdlKSB7XG4gIHZhciBycyA9IGVkZ2VbMF0uX3ByaXZhdGUucnNjcmF0Y2g7XG4gIGlmIChycy5ub2Rlc092ZXJsYXAgfHwgbnVtYmVyJDEocnMuc3RhcnRYKSAmJiBudW1iZXIkMShycy5zdGFydFkpICYmIG51bWJlciQxKHJzLmVuZFgpICYmIG51bWJlciQxKHJzLmVuZFkpKSB7XG4gICAgcnMubG9nZ2VkRXJyID0gZmFsc2U7XG4gIH0gZWxzZSB7XG4gICAgaWYgKCFycy5sb2dnZWRFcnIpIHtcbiAgICAgIHJzLmxvZ2dlZEVyciA9IHRydWU7XG4gICAgICB3YXJuKCdFZGdlIGAnICsgZWRnZS5pZCgpICsgJ2AgaGFzIGludmFsaWQgZW5kcG9pbnRzIGFuZCBzbyBpdCBpcyBpbXBvc3NpYmxlIHRvIGRyYXcuICBBZGp1c3QgeW91ciBlZGdlIHN0eWxlIChlLmcuIGNvbnRyb2wgcG9pbnRzKSBhY2NvcmRpbmdseSBvciB1c2UgYW4gYWx0ZXJuYXRpdmUgZWRnZSB0eXBlLiAgVGhpcyBpcyBleHBlY3RlZCBiZWhhdmlvdXIgd2hlbiB0aGUgc291cmNlIG5vZGUgYW5kIHRoZSB0YXJnZXQgbm9kZSBvdmVybGFwLicpO1xuICAgIH1cbiAgfVxufTtcbkJScCRjLmZpbmRFZGdlQ29udHJvbFBvaW50cyA9IGZ1bmN0aW9uIChlZGdlcykge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuICBpZiAoIWVkZ2VzIHx8IGVkZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgciA9IHRoaXM7XG4gIHZhciBjeSA9IHIuY3k7XG4gIHZhciBoYXNDb21wb3VuZHMgPSBjeS5oYXNDb21wb3VuZE5vZGVzKCk7XG4gIHZhciBoYXNoVGFibGUgPSBuZXcgTWFwJDEoKTtcbiAgdmFyIGdldEtleSA9IGZ1bmN0aW9uIGdldEtleShwYWlySWQsIGVkZ2VJc1VuYnVuZGxlZCkge1xuICAgIHJldHVybiBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHBhaXJJZCksIFtlZGdlSXNVbmJ1bmRsZWQgPyAxIDogMF0pLmpvaW4oJy0nKTtcbiAgfTtcbiAgdmFyIHBhaXJJZHMgPSBbXTtcbiAgdmFyIGhheXN0YWNrRWRnZXMgPSBbXTtcblxuICAvLyBjcmVhdGUgYSB0YWJsZSBvZiBlZGdlIChzcmMsIHRndCkgPT4gbGlzdCBvZiBlZGdlcyBiZXR3ZWVuIHRoZW1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlZGdlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlZGdlID0gZWRnZXNbaV07XG4gICAgdmFyIF9wID0gZWRnZS5fcHJpdmF0ZTtcbiAgICB2YXIgY3VydmVTdHlsZSA9IGVkZ2UucHN0eWxlKCdjdXJ2ZS1zdHlsZScpLnZhbHVlO1xuXG4gICAgLy8gaWdub3JlIGVkZ2VzIHdobyBhcmUgbm90IHRvIGJlIGRpc3BsYXllZFxuICAgIC8vIHRoZXkgc2hvdWxkbid0IHRha2UgdXAgc3BhY2VcbiAgICBpZiAoZWRnZS5yZW1vdmVkKCkgfHwgIWVkZ2UudGFrZXNVcFNwYWNlKCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY3VydmVTdHlsZSA9PT0gJ2hheXN0YWNrJykge1xuICAgICAgaGF5c3RhY2tFZGdlcy5wdXNoKGVkZ2UpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHZhciBlZGdlSXNVbmJ1bmRsZWQgPSBjdXJ2ZVN0eWxlID09PSAndW5idW5kbGVkLWJlemllcicgfHwgZW5kc1dpdGgoY3VydmVTdHlsZSwgJ3NlZ21lbnRzJykgfHwgY3VydmVTdHlsZSA9PT0gJ3N0cmFpZ2h0JyB8fCBjdXJ2ZVN0eWxlID09PSAnc3RyYWlnaHQtdHJpYW5nbGUnIHx8IGVuZHNXaXRoKGN1cnZlU3R5bGUsICd0YXhpJyk7XG4gICAgdmFyIGVkZ2VJc0JlemllciA9IGN1cnZlU3R5bGUgPT09ICd1bmJ1bmRsZWQtYmV6aWVyJyB8fCBjdXJ2ZVN0eWxlID09PSAnYmV6aWVyJztcbiAgICB2YXIgc3JjID0gX3Auc291cmNlO1xuICAgIHZhciB0Z3QgPSBfcC50YXJnZXQ7XG4gICAgdmFyIHNyY0luZGV4ID0gc3JjLnBvb2xJbmRleCgpO1xuICAgIHZhciB0Z3RJbmRleCA9IHRndC5wb29sSW5kZXgoKTtcbiAgICB2YXIgcGFpcklkID0gW3NyY0luZGV4LCB0Z3RJbmRleF0uc29ydCgpO1xuICAgIHZhciBrZXkgPSBnZXRLZXkocGFpcklkLCBlZGdlSXNVbmJ1bmRsZWQpO1xuICAgIHZhciB0YWJsZUVudHJ5ID0gaGFzaFRhYmxlLmdldChrZXkpO1xuICAgIGlmICh0YWJsZUVudHJ5ID09IG51bGwpIHtcbiAgICAgIHRhYmxlRW50cnkgPSB7XG4gICAgICAgIGVsZXM6IFtdXG4gICAgICB9O1xuICAgICAgcGFpcklkcy5wdXNoKHtcbiAgICAgICAgcGFpcklkOiBwYWlySWQsXG4gICAgICAgIGVkZ2VJc1VuYnVuZGxlZDogZWRnZUlzVW5idW5kbGVkXG4gICAgICB9KTtcbiAgICAgIGhhc2hUYWJsZS5zZXQoa2V5LCB0YWJsZUVudHJ5KTtcbiAgICB9XG4gICAgdGFibGVFbnRyeS5lbGVzLnB1c2goZWRnZSk7XG4gICAgaWYgKGVkZ2VJc1VuYnVuZGxlZCkge1xuICAgICAgdGFibGVFbnRyeS5oYXNVbmJ1bmRsZWQgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoZWRnZUlzQmV6aWVyKSB7XG4gICAgICB0YWJsZUVudHJ5Lmhhc0JlemllciA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLy8gZm9yIGVhY2ggcGFpciAoc3JjLCB0Z3QpLCBjcmVhdGUgdGhlIGN0cmwgcHRzXG4gIC8vIE5lc3RlZCBmb3IgbG9vcCBpcyBPSzsgdG90YWwgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgZm9yIGJvdGggbG9vcHMgPSBlZGdlQ291bnRcbiAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoKSB7XG4gICAgdmFyIF9wYWlySWRzJHAgPSBwYWlySWRzW3BdLFxuICAgICAgcGFpcklkID0gX3BhaXJJZHMkcC5wYWlySWQsXG4gICAgICBlZGdlSXNVbmJ1bmRsZWQgPSBfcGFpcklkcyRwLmVkZ2VJc1VuYnVuZGxlZDtcbiAgICB2YXIga2V5ID0gZ2V0S2V5KHBhaXJJZCwgZWRnZUlzVW5idW5kbGVkKTtcbiAgICB2YXIgcGFpckluZm8gPSBoYXNoVGFibGUuZ2V0KGtleSk7XG4gICAgdmFyIHN3YXBwZWRwYWlySW5mbztcbiAgICBpZiAoIXBhaXJJbmZvLmhhc1VuYnVuZGxlZCkge1xuICAgICAgdmFyIHBsbEVkZ2VzID0gcGFpckluZm8uZWxlc1swXS5wYXJhbGxlbEVkZ2VzKCkuZmlsdGVyKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiBlLmlzQnVuZGxlZEJlemllcigpO1xuICAgICAgfSk7XG4gICAgICBjbGVhckFycmF5KHBhaXJJbmZvLmVsZXMpO1xuICAgICAgcGxsRWRnZXMuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgICByZXR1cm4gcGFpckluZm8uZWxlcy5wdXNoKGVkZ2UpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIGZvciBlYWNoIHBhaXIgaWQsIHRoZSBlZGdlcyBzaG91bGQgYmUgc29ydGVkIGJ5IGluZGV4XG4gICAgICBwYWlySW5mby5lbGVzLnNvcnQoZnVuY3Rpb24gKGVkZ2UxLCBlZGdlMikge1xuICAgICAgICByZXR1cm4gZWRnZTEucG9vbEluZGV4KCkgLSBlZGdlMi5wb29sSW5kZXgoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB2YXIgZmlyc3RFZGdlID0gcGFpckluZm8uZWxlc1swXTtcbiAgICB2YXIgc3JjID0gZmlyc3RFZGdlLnNvdXJjZSgpO1xuICAgIHZhciB0Z3QgPSBmaXJzdEVkZ2UudGFyZ2V0KCk7XG5cbiAgICAvLyBtYWtlIHN1cmUgc3JjL3RndCBkaXN0aW5jdGlvbiBpcyBjb25zaXN0ZW50IHcuci50LiBwYWlySWRcbiAgICBpZiAoc3JjLnBvb2xJbmRleCgpID4gdGd0LnBvb2xJbmRleCgpKSB7XG4gICAgICB2YXIgdGVtcCA9IHNyYztcbiAgICAgIHNyYyA9IHRndDtcbiAgICAgIHRndCA9IHRlbXA7XG4gICAgfVxuICAgIHZhciBzcmNQb3MgPSBwYWlySW5mby5zcmNQb3MgPSBzcmMucG9zaXRpb24oKTtcbiAgICB2YXIgdGd0UG9zID0gcGFpckluZm8udGd0UG9zID0gdGd0LnBvc2l0aW9uKCk7XG4gICAgdmFyIHNyY1cgPSBwYWlySW5mby5zcmNXID0gc3JjLm91dGVyV2lkdGgoKTtcbiAgICB2YXIgc3JjSCA9IHBhaXJJbmZvLnNyY0ggPSBzcmMub3V0ZXJIZWlnaHQoKTtcbiAgICB2YXIgdGd0VyA9IHBhaXJJbmZvLnRndFcgPSB0Z3Qub3V0ZXJXaWR0aCgpO1xuICAgIHZhciB0Z3RIID0gcGFpckluZm8udGd0SCA9IHRndC5vdXRlckhlaWdodCgpO1xuICAgIHZhciBzcmNTaGFwZSA9IHBhaXJJbmZvLnNyY1NoYXBlID0gci5ub2RlU2hhcGVzW190aGlzLmdldE5vZGVTaGFwZShzcmMpXTtcbiAgICB2YXIgdGd0U2hhcGUgPSBwYWlySW5mby50Z3RTaGFwZSA9IHIubm9kZVNoYXBlc1tfdGhpcy5nZXROb2RlU2hhcGUodGd0KV07XG4gICAgdmFyIHNyY0Nvcm5lclJhZGl1cyA9IHBhaXJJbmZvLnNyY0Nvcm5lclJhZGl1cyA9IHNyYy5wc3R5bGUoJ2Nvcm5lci1yYWRpdXMnKS52YWx1ZSA9PT0gJ2F1dG8nID8gJ2F1dG8nIDogc3JjLnBzdHlsZSgnY29ybmVyLXJhZGl1cycpLnBmVmFsdWU7XG4gICAgdmFyIHRndENvcm5lclJhZGl1cyA9IHBhaXJJbmZvLnRndENvcm5lclJhZGl1cyA9IHRndC5wc3R5bGUoJ2Nvcm5lci1yYWRpdXMnKS52YWx1ZSA9PT0gJ2F1dG8nID8gJ2F1dG8nIDogdGd0LnBzdHlsZSgnY29ybmVyLXJhZGl1cycpLnBmVmFsdWU7XG4gICAgdmFyIHRndFJzID0gcGFpckluZm8udGd0UnMgPSB0Z3QuX3ByaXZhdGUucnNjcmF0Y2g7XG4gICAgdmFyIHNyY1JzID0gcGFpckluZm8uc3JjUnMgPSBzcmMuX3ByaXZhdGUucnNjcmF0Y2g7XG4gICAgcGFpckluZm8uZGlyQ291bnRzID0ge1xuICAgICAgJ25vcnRoJzogMCxcbiAgICAgICd3ZXN0JzogMCxcbiAgICAgICdzb3V0aCc6IDAsXG4gICAgICAnZWFzdCc6IDAsXG4gICAgICAnbm9ydGh3ZXN0JzogMCxcbiAgICAgICdzb3V0aHdlc3QnOiAwLFxuICAgICAgJ25vcnRoZWFzdCc6IDAsXG4gICAgICAnc291dGhlYXN0JzogMFxuICAgIH07XG4gICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgcGFpckluZm8uZWxlcy5sZW5ndGg7IF9pMisrKSB7XG4gICAgICB2YXIgX2VkZ2UgPSBwYWlySW5mby5lbGVzW19pMl07XG4gICAgICB2YXIgcnMgPSBfZWRnZVswXS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgICAgIHZhciBfY3VydmVTdHlsZSA9IF9lZGdlLnBzdHlsZSgnY3VydmUtc3R5bGUnKS52YWx1ZTtcbiAgICAgIHZhciBfZWRnZUlzVW5idW5kbGVkID0gX2N1cnZlU3R5bGUgPT09ICd1bmJ1bmRsZWQtYmV6aWVyJyB8fCBlbmRzV2l0aChfY3VydmVTdHlsZSwgJ3NlZ21lbnRzJykgfHwgZW5kc1dpdGgoX2N1cnZlU3R5bGUsICd0YXhpJyk7XG5cbiAgICAgIC8vIHdoZXRoZXIgdGhlIG5vcm1hbGlzZWQgcGFpciBvcmRlciBpcyB0aGUgcmV2ZXJzZSBvZiB0aGUgZWRnZSdzIHNyYy10Z3Qgb3JkZXJcbiAgICAgIHZhciBlZGdlSXNTd2FwcGVkID0gIXNyYy5zYW1lKF9lZGdlLnNvdXJjZSgpKTtcbiAgICAgIGlmICghcGFpckluZm8uY2FsY3VsYXRlZEludGVyc2VjdGlvbiAmJiBzcmMgIT09IHRndCAmJiAocGFpckluZm8uaGFzQmV6aWVyIHx8IHBhaXJJbmZvLmhhc1VuYnVuZGxlZCkpIHtcbiAgICAgICAgcGFpckluZm8uY2FsY3VsYXRlZEludGVyc2VjdGlvbiA9IHRydWU7XG5cbiAgICAgICAgLy8gcHQgb3V0c2lkZSBzcmMgc2hhcGUgdG8gY2FsYyBkaXN0YW5jZS9kaXNwbGFjZW1lbnQgZnJvbSBzcmMgdG8gdGd0XG4gICAgICAgIHZhciBzcmNPdXRzaWRlID0gc3JjU2hhcGUuaW50ZXJzZWN0TGluZShzcmNQb3MueCwgc3JjUG9zLnksIHNyY1csIHNyY0gsIHRndFBvcy54LCB0Z3RQb3MueSwgMCwgc3JjQ29ybmVyUmFkaXVzLCBzcmNScyk7XG4gICAgICAgIHZhciBzcmNJbnRuID0gcGFpckluZm8uc3JjSW50biA9IHNyY091dHNpZGU7XG5cbiAgICAgICAgLy8gcHQgb3V0c2lkZSB0Z3Qgc2hhcGUgdG8gY2FsYyBkaXN0YW5jZS9kaXNwbGFjZW1lbnQgZnJvbSBzcmMgdG8gdGd0XG4gICAgICAgIHZhciB0Z3RPdXRzaWRlID0gdGd0U2hhcGUuaW50ZXJzZWN0TGluZSh0Z3RQb3MueCwgdGd0UG9zLnksIHRndFcsIHRndEgsIHNyY1Bvcy54LCBzcmNQb3MueSwgMCwgdGd0Q29ybmVyUmFkaXVzLCB0Z3RScyk7XG4gICAgICAgIHZhciB0Z3RJbnRuID0gcGFpckluZm8udGd0SW50biA9IHRndE91dHNpZGU7XG4gICAgICAgIHZhciBpbnRlcnNlY3Rpb25QdHMgPSBwYWlySW5mby5pbnRlcnNlY3Rpb25QdHMgPSB7XG4gICAgICAgICAgeDE6IHNyY091dHNpZGVbMF0sXG4gICAgICAgICAgeDI6IHRndE91dHNpZGVbMF0sXG4gICAgICAgICAgeTE6IHNyY091dHNpZGVbMV0sXG4gICAgICAgICAgeTI6IHRndE91dHNpZGVbMV1cbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHBvc1B0cyA9IHBhaXJJbmZvLnBvc1B0cyA9IHtcbiAgICAgICAgICB4MTogc3JjUG9zLngsXG4gICAgICAgICAgeDI6IHRndFBvcy54LFxuICAgICAgICAgIHkxOiBzcmNQb3MueSxcbiAgICAgICAgICB5MjogdGd0UG9zLnlcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIGR5ID0gdGd0T3V0c2lkZVsxXSAtIHNyY091dHNpZGVbMV07XG4gICAgICAgIHZhciBkeCA9IHRndE91dHNpZGVbMF0gLSBzcmNPdXRzaWRlWzBdO1xuICAgICAgICB2YXIgbCA9IE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSk7XG4gICAgICAgIGlmIChudW1iZXIkMShsKSAmJiBsID49IEFWT0lEX0lNUE9TU0lCTEVfQkVaSUVSX0NPTlNUQU5UX0wpIDsgZWxzZSB7XG4gICAgICAgICAgbCA9IE1hdGguc3FydChNYXRoLm1heChkeCAqIGR4LCBBVk9JRF9JTVBPU1NJQkxFX0JFWklFUl9DT05TVEFOVCkgKyBNYXRoLm1heChkeSAqIGR5LCBBVk9JRF9JTVBPU1NJQkxFX0JFWklFUl9DT05TVEFOVCkpO1xuICAgICAgICB9XG4gICAgICAgIHZhciB2ZWN0b3IgPSBwYWlySW5mby52ZWN0b3IgPSB7XG4gICAgICAgICAgeDogZHgsXG4gICAgICAgICAgeTogZHlcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHZlY3Rvck5vcm0gPSBwYWlySW5mby52ZWN0b3JOb3JtID0ge1xuICAgICAgICAgIHg6IHZlY3Rvci54IC8gbCxcbiAgICAgICAgICB5OiB2ZWN0b3IueSAvIGxcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHZlY3Rvck5vcm1JbnZlcnNlID0ge1xuICAgICAgICAgIHg6IC12ZWN0b3JOb3JtLnksXG4gICAgICAgICAgeTogdmVjdG9yTm9ybS54XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gaWYgbm9kZSBzaGFwZXMgb3ZlcmxhcCwgdGhlbiBubyBjdHJsIHB0cyB0byBkcmF3XG4gICAgICAgIHBhaXJJbmZvLm5vZGVzT3ZlcmxhcCA9ICFudW1iZXIkMShsKSB8fCB0Z3RTaGFwZS5jaGVja1BvaW50KHNyY091dHNpZGVbMF0sIHNyY091dHNpZGVbMV0sIDAsIHRndFcsIHRndEgsIHRndFBvcy54LCB0Z3RQb3MueSwgdGd0Q29ybmVyUmFkaXVzLCB0Z3RScykgfHwgc3JjU2hhcGUuY2hlY2tQb2ludCh0Z3RPdXRzaWRlWzBdLCB0Z3RPdXRzaWRlWzFdLCAwLCBzcmNXLCBzcmNILCBzcmNQb3MueCwgc3JjUG9zLnksIHNyY0Nvcm5lclJhZGl1cywgc3JjUnMpO1xuICAgICAgICBwYWlySW5mby52ZWN0b3JOb3JtSW52ZXJzZSA9IHZlY3Rvck5vcm1JbnZlcnNlO1xuICAgICAgICBzd2FwcGVkcGFpckluZm8gPSB7XG4gICAgICAgICAgbm9kZXNPdmVybGFwOiBwYWlySW5mby5ub2Rlc092ZXJsYXAsXG4gICAgICAgICAgZGlyQ291bnRzOiBwYWlySW5mby5kaXJDb3VudHMsXG4gICAgICAgICAgY2FsY3VsYXRlZEludGVyc2VjdGlvbjogdHJ1ZSxcbiAgICAgICAgICBoYXNCZXppZXI6IHBhaXJJbmZvLmhhc0JlemllcixcbiAgICAgICAgICBoYXNVbmJ1bmRsZWQ6IHBhaXJJbmZvLmhhc1VuYnVuZGxlZCxcbiAgICAgICAgICBlbGVzOiBwYWlySW5mby5lbGVzLFxuICAgICAgICAgIHNyY1BvczogdGd0UG9zLFxuICAgICAgICAgIHNyY1JzOiB0Z3RScyxcbiAgICAgICAgICB0Z3RQb3M6IHNyY1BvcyxcbiAgICAgICAgICB0Z3RSczogc3JjUnMsXG4gICAgICAgICAgc3JjVzogdGd0VyxcbiAgICAgICAgICBzcmNIOiB0Z3RILFxuICAgICAgICAgIHRndFc6IHNyY1csXG4gICAgICAgICAgdGd0SDogc3JjSCxcbiAgICAgICAgICBzcmNJbnRuOiB0Z3RJbnRuLFxuICAgICAgICAgIHRndEludG46IHNyY0ludG4sXG4gICAgICAgICAgc3JjU2hhcGU6IHRndFNoYXBlLFxuICAgICAgICAgIHRndFNoYXBlOiBzcmNTaGFwZSxcbiAgICAgICAgICBwb3NQdHM6IHtcbiAgICAgICAgICAgIHgxOiBwb3NQdHMueDIsXG4gICAgICAgICAgICB5MTogcG9zUHRzLnkyLFxuICAgICAgICAgICAgeDI6IHBvc1B0cy54MSxcbiAgICAgICAgICAgIHkyOiBwb3NQdHMueTFcbiAgICAgICAgICB9LFxuICAgICAgICAgIGludGVyc2VjdGlvblB0czoge1xuICAgICAgICAgICAgeDE6IGludGVyc2VjdGlvblB0cy54MixcbiAgICAgICAgICAgIHkxOiBpbnRlcnNlY3Rpb25QdHMueTIsXG4gICAgICAgICAgICB4MjogaW50ZXJzZWN0aW9uUHRzLngxLFxuICAgICAgICAgICAgeTI6IGludGVyc2VjdGlvblB0cy55MVxuICAgICAgICAgIH0sXG4gICAgICAgICAgdmVjdG9yOiB7XG4gICAgICAgICAgICB4OiAtdmVjdG9yLngsXG4gICAgICAgICAgICB5OiAtdmVjdG9yLnlcbiAgICAgICAgICB9LFxuICAgICAgICAgIHZlY3Rvck5vcm06IHtcbiAgICAgICAgICAgIHg6IC12ZWN0b3JOb3JtLngsXG4gICAgICAgICAgICB5OiAtdmVjdG9yTm9ybS55XG4gICAgICAgICAgfSxcbiAgICAgICAgICB2ZWN0b3JOb3JtSW52ZXJzZToge1xuICAgICAgICAgICAgeDogLXZlY3Rvck5vcm1JbnZlcnNlLngsXG4gICAgICAgICAgICB5OiAtdmVjdG9yTm9ybUludmVyc2UueVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHZhciBwYXNzZWRQYWlySW5mbyA9IGVkZ2VJc1N3YXBwZWQgPyBzd2FwcGVkcGFpckluZm8gOiBwYWlySW5mbztcbiAgICAgIHJzLm5vZGVzT3ZlcmxhcCA9IHBhc3NlZFBhaXJJbmZvLm5vZGVzT3ZlcmxhcDtcbiAgICAgIHJzLnNyY0ludG4gPSBwYXNzZWRQYWlySW5mby5zcmNJbnRuO1xuICAgICAgcnMudGd0SW50biA9IHBhc3NlZFBhaXJJbmZvLnRndEludG47XG4gICAgICBycy5pc1JvdW5kID0gX2N1cnZlU3R5bGUuc3RhcnRzV2l0aCgncm91bmQnKTtcbiAgICAgIGlmIChoYXNDb21wb3VuZHMgJiYgKHNyYy5pc1BhcmVudCgpIHx8IHNyYy5pc0NoaWxkKCkgfHwgdGd0LmlzUGFyZW50KCkgfHwgdGd0LmlzQ2hpbGQoKSkgJiYgKHNyYy5wYXJlbnRzKCkuYW55U2FtZSh0Z3QpIHx8IHRndC5wYXJlbnRzKCkuYW55U2FtZShzcmMpIHx8IHNyYy5zYW1lKHRndCkgJiYgc3JjLmlzUGFyZW50KCkpKSB7XG4gICAgICAgIF90aGlzLmZpbmRDb21wb3VuZExvb3BQb2ludHMoX2VkZ2UsIHBhc3NlZFBhaXJJbmZvLCBfaTIsIF9lZGdlSXNVbmJ1bmRsZWQpO1xuICAgICAgfSBlbHNlIGlmIChzcmMgPT09IHRndCkge1xuICAgICAgICBfdGhpcy5maW5kTG9vcFBvaW50cyhfZWRnZSwgcGFzc2VkUGFpckluZm8sIF9pMiwgX2VkZ2VJc1VuYnVuZGxlZCk7XG4gICAgICB9IGVsc2UgaWYgKF9jdXJ2ZVN0eWxlLmVuZHNXaXRoKCdzZWdtZW50cycpKSB7XG4gICAgICAgIF90aGlzLmZpbmRTZWdtZW50c1BvaW50cyhfZWRnZSwgcGFzc2VkUGFpckluZm8pO1xuICAgICAgfSBlbHNlIGlmIChfY3VydmVTdHlsZS5lbmRzV2l0aCgndGF4aScpKSB7XG4gICAgICAgIF90aGlzLmZpbmRUYXhpUG9pbnRzKF9lZGdlLCBwYXNzZWRQYWlySW5mbyk7XG4gICAgICB9IGVsc2UgaWYgKF9jdXJ2ZVN0eWxlID09PSAnc3RyYWlnaHQnIHx8ICFfZWRnZUlzVW5idW5kbGVkICYmIHBhaXJJbmZvLmVsZXMubGVuZ3RoICUgMiA9PT0gMSAmJiBfaTIgPT09IE1hdGguZmxvb3IocGFpckluZm8uZWxlcy5sZW5ndGggLyAyKSkge1xuICAgICAgICBfdGhpcy5maW5kU3RyYWlnaHRFZGdlUG9pbnRzKF9lZGdlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF90aGlzLmZpbmRCZXppZXJQb2ludHMoX2VkZ2UsIHBhc3NlZFBhaXJJbmZvLCBfaTIsIF9lZGdlSXNVbmJ1bmRsZWQsIGVkZ2VJc1N3YXBwZWQpO1xuICAgICAgfVxuICAgICAgX3RoaXMuZmluZEVuZHBvaW50cyhfZWRnZSk7XG4gICAgICBfdGhpcy50cnlUb0NvcnJlY3RJbnZhbGlkUG9pbnRzKF9lZGdlLCBwYXNzZWRQYWlySW5mbyk7XG4gICAgICBfdGhpcy5jaGVja0ZvckludmFsaWRFZGdlV2FybmluZyhfZWRnZSk7XG4gICAgICBfdGhpcy5zdG9yZUFsbHB0cyhfZWRnZSk7XG4gICAgICBfdGhpcy5zdG9yZUVkZ2VQcm9qZWN0aW9ucyhfZWRnZSk7XG4gICAgICBfdGhpcy5jYWxjdWxhdGVBcnJvd0FuZ2xlcyhfZWRnZSk7XG4gICAgICBfdGhpcy5yZWNhbGN1bGF0ZUVkZ2VMYWJlbFByb2plY3Rpb25zKF9lZGdlKTtcbiAgICAgIF90aGlzLmNhbGN1bGF0ZUxhYmVsQW5nbGVzKF9lZGdlKTtcbiAgICB9IC8vIGZvciBwYWlyIGVkZ2VzXG4gIH07XG4gIGZvciAodmFyIHAgPSAwOyBwIDwgcGFpcklkcy5sZW5ndGg7IHArKykge1xuICAgIF9sb29wKCk7XG4gIH0gLy8gZm9yIHBhaXIgaWRzXG5cbiAgLy8gaGF5c3RhY2tzIGF2b2lkIHRoZSBleHBlbnNlIG9mIHBhaXJJbmZvIHN0dWZmIChpbnRlcnNlY3Rpb25zIGV0Yy4pXG4gIHRoaXMuZmluZEhheXN0YWNrUG9pbnRzKGhheXN0YWNrRWRnZXMpO1xufTtcbmZ1bmN0aW9uIGdldFB0cyhwdHMpIHtcbiAgdmFyIHJldFB0cyA9IFtdO1xuICBpZiAocHRzID09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwdHMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICB2YXIgeCA9IHB0c1tpXTtcbiAgICB2YXIgeSA9IHB0c1tpICsgMV07XG4gICAgcmV0UHRzLnB1c2goe1xuICAgICAgeDogeCxcbiAgICAgIHk6IHlcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcmV0UHRzO1xufVxuQlJwJGMuZ2V0U2VnbWVudFBvaW50cyA9IGZ1bmN0aW9uIChlZGdlKSB7XG4gIHZhciBycyA9IGVkZ2VbMF0uX3ByaXZhdGUucnNjcmF0Y2g7XG4gIHRoaXMucmVjYWxjdWxhdGVSZW5kZXJlZFN0eWxlKGVkZ2UpO1xuICB2YXIgdHlwZSA9IHJzLmVkZ2VUeXBlO1xuICBpZiAodHlwZSA9PT0gJ3NlZ21lbnRzJykge1xuICAgIHJldHVybiBnZXRQdHMocnMuc2VncHRzKTtcbiAgfVxufTtcbkJScCRjLmdldENvbnRyb2xQb2ludHMgPSBmdW5jdGlvbiAoZWRnZSkge1xuICB2YXIgcnMgPSBlZGdlWzBdLl9wcml2YXRlLnJzY3JhdGNoO1xuICB0aGlzLnJlY2FsY3VsYXRlUmVuZGVyZWRTdHlsZShlZGdlKTtcbiAgdmFyIHR5cGUgPSBycy5lZGdlVHlwZTtcbiAgaWYgKHR5cGUgPT09ICdiZXppZXInIHx8IHR5cGUgPT09ICdtdWx0aWJlemllcicgfHwgdHlwZSA9PT0gJ3NlbGYnIHx8IHR5cGUgPT09ICdjb21wb3VuZCcpIHtcbiAgICByZXR1cm4gZ2V0UHRzKHJzLmN0cmxwdHMpO1xuICB9XG59O1xuQlJwJGMuZ2V0RWRnZU1pZHBvaW50ID0gZnVuY3Rpb24gKGVkZ2UpIHtcbiAgdmFyIHJzID0gZWRnZVswXS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgdGhpcy5yZWNhbGN1bGF0ZVJlbmRlcmVkU3R5bGUoZWRnZSk7XG4gIHJldHVybiB7XG4gICAgeDogcnMubWlkWCxcbiAgICB5OiBycy5taWRZXG4gIH07XG59O1xuXG52YXIgQlJwJGIgPSB7fTtcbkJScCRiLm1hbnVhbEVuZHB0VG9QeCA9IGZ1bmN0aW9uIChub2RlLCBwcm9wKSB7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIG5wb3MgPSBub2RlLnBvc2l0aW9uKCk7XG4gIHZhciB3ID0gbm9kZS5vdXRlcldpZHRoKCk7XG4gIHZhciBoID0gbm9kZS5vdXRlckhlaWdodCgpO1xuICB2YXIgcnMgPSBub2RlLl9wcml2YXRlLnJzY3JhdGNoO1xuICBpZiAocHJvcC52YWx1ZS5sZW5ndGggPT09IDIpIHtcbiAgICB2YXIgcCA9IFtwcm9wLnBmVmFsdWVbMF0sIHByb3AucGZWYWx1ZVsxXV07XG4gICAgaWYgKHByb3AudW5pdHNbMF0gPT09ICclJykge1xuICAgICAgcFswXSA9IHBbMF0gKiB3O1xuICAgIH1cbiAgICBpZiAocHJvcC51bml0c1sxXSA9PT0gJyUnKSB7XG4gICAgICBwWzFdID0gcFsxXSAqIGg7XG4gICAgfVxuICAgIHBbMF0gKz0gbnBvcy54O1xuICAgIHBbMV0gKz0gbnBvcy55O1xuICAgIHJldHVybiBwO1xuICB9IGVsc2Uge1xuICAgIHZhciBhbmdsZSA9IHByb3AucGZWYWx1ZVswXTtcbiAgICBhbmdsZSA9IC1NYXRoLlBJIC8gMiArIGFuZ2xlOyAvLyBzdGFydCBhdCAxMiBvJ2Nsb2NrXG5cbiAgICB2YXIgbCA9IDIgKiBNYXRoLm1heCh3LCBoKTtcbiAgICB2YXIgX3AgPSBbbnBvcy54ICsgTWF0aC5jb3MoYW5nbGUpICogbCwgbnBvcy55ICsgTWF0aC5zaW4oYW5nbGUpICogbF07XG4gICAgcmV0dXJuIHIubm9kZVNoYXBlc1t0aGlzLmdldE5vZGVTaGFwZShub2RlKV0uaW50ZXJzZWN0TGluZShucG9zLngsIG5wb3MueSwgdywgaCwgX3BbMF0sIF9wWzFdLCAwLCBub2RlLnBzdHlsZSgnY29ybmVyLXJhZGl1cycpLnZhbHVlID09PSAnYXV0bycgPyAnYXV0bycgOiBub2RlLnBzdHlsZSgnY29ybmVyLXJhZGl1cycpLnBmVmFsdWUsIHJzKTtcbiAgfVxufTtcbkJScCRiLmZpbmRFbmRwb2ludHMgPSBmdW5jdGlvbiAoZWRnZSkge1xuICB2YXIgX3JlZiwgX3RndE1hbkVuZHB0JHBmVmFsdWUsIF9yZWYyLCBfc3JjTWFuRW5kcHQkcGZWYWx1ZTtcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgaW50ZXJzZWN0O1xuICB2YXIgc291cmNlID0gZWRnZS5zb3VyY2UoKVswXTtcbiAgdmFyIHRhcmdldCA9IGVkZ2UudGFyZ2V0KClbMF07XG4gIHZhciBzcmNQb3MgPSBzb3VyY2UucG9zaXRpb24oKTtcbiAgdmFyIHRndFBvcyA9IHRhcmdldC5wb3NpdGlvbigpO1xuICB2YXIgdGd0QXJTaGFwZSA9IGVkZ2UucHN0eWxlKCd0YXJnZXQtYXJyb3ctc2hhcGUnKS52YWx1ZTtcbiAgdmFyIHNyY0FyU2hhcGUgPSBlZGdlLnBzdHlsZSgnc291cmNlLWFycm93LXNoYXBlJykudmFsdWU7XG4gIHZhciB0Z3REaXN0ID0gZWRnZS5wc3R5bGUoJ3RhcmdldC1kaXN0YW5jZS1mcm9tLW5vZGUnKS5wZlZhbHVlO1xuICB2YXIgc3JjRGlzdCA9IGVkZ2UucHN0eWxlKCdzb3VyY2UtZGlzdGFuY2UtZnJvbS1ub2RlJykucGZWYWx1ZTtcbiAgdmFyIHNyY1JzID0gc291cmNlLl9wcml2YXRlLnJzY3JhdGNoO1xuICB2YXIgdGd0UnMgPSB0YXJnZXQuX3ByaXZhdGUucnNjcmF0Y2g7XG4gIHZhciBjdXJ2ZVN0eWxlID0gZWRnZS5wc3R5bGUoJ2N1cnZlLXN0eWxlJykudmFsdWU7XG4gIHZhciBycyA9IGVkZ2UuX3ByaXZhdGUucnNjcmF0Y2g7XG4gIHZhciBldCA9IHJzLmVkZ2VUeXBlO1xuICB2YXIgdGF4aSA9IGVuZHNXaXRoKGN1cnZlU3R5bGUsICd0YXhpJyk7IC8vIENvdmVycyB0YXhpIGFuZCByb3VuZC10YXhpXG4gIHZhciBzZWxmID0gZXQgPT09ICdzZWxmJyB8fCBldCA9PT0gJ2NvbXBvdW5kJztcbiAgdmFyIGJlemllciA9IGV0ID09PSAnYmV6aWVyJyB8fCBldCA9PT0gJ211bHRpYmV6aWVyJyB8fCBzZWxmO1xuICB2YXIgbXVsdGkgPSBldCAhPT0gJ2Jlemllcic7XG4gIHZhciBsaW5lcyA9IGV0ID09PSAnc3RyYWlnaHQnIHx8IGV0ID09PSAnc2VnbWVudHMnO1xuICB2YXIgc2VnbWVudHMgPSBldCA9PT0gJ3NlZ21lbnRzJztcbiAgdmFyIGhhc0VuZHB0cyA9IGJlemllciB8fCBtdWx0aSB8fCBsaW5lcztcbiAgdmFyIG92ZXJyaWRlRW5kcHRzID0gc2VsZiB8fCB0YXhpO1xuICB2YXIgc3JjTWFuRW5kcHQgPSBlZGdlLnBzdHlsZSgnc291cmNlLWVuZHBvaW50Jyk7XG4gIHZhciBzcmNNYW5FbmRwdFZhbCA9IG92ZXJyaWRlRW5kcHRzID8gJ291dHNpZGUtdG8tbm9kZScgOiBzcmNNYW5FbmRwdC52YWx1ZTtcbiAgdmFyIHNyY0Nvcm5lclJhZGl1cyA9IHNvdXJjZS5wc3R5bGUoJ2Nvcm5lci1yYWRpdXMnKS52YWx1ZSA9PT0gJ2F1dG8nID8gJ2F1dG8nIDogc291cmNlLnBzdHlsZSgnY29ybmVyLXJhZGl1cycpLnBmVmFsdWU7XG4gIHZhciB0Z3RNYW5FbmRwdCA9IGVkZ2UucHN0eWxlKCd0YXJnZXQtZW5kcG9pbnQnKTtcbiAgdmFyIHRndE1hbkVuZHB0VmFsID0gb3ZlcnJpZGVFbmRwdHMgPyAnb3V0c2lkZS10by1ub2RlJyA6IHRndE1hbkVuZHB0LnZhbHVlO1xuICB2YXIgdGd0Q29ybmVyUmFkaXVzID0gdGFyZ2V0LnBzdHlsZSgnY29ybmVyLXJhZGl1cycpLnZhbHVlID09PSAnYXV0bycgPyAnYXV0bycgOiB0YXJnZXQucHN0eWxlKCdjb3JuZXItcmFkaXVzJykucGZWYWx1ZTtcbiAgcnMuc3JjTWFuRW5kcHQgPSBzcmNNYW5FbmRwdDtcbiAgcnMudGd0TWFuRW5kcHQgPSB0Z3RNYW5FbmRwdDtcbiAgdmFyIHAxOyAvLyBsYXN0IGtub3duIHBvaW50IG9mIGVkZ2Ugb24gdGFyZ2V0IHNpZGVcbiAgdmFyIHAyOyAvLyBsYXN0IGtub3duIHBvaW50IG9mIGVkZ2Ugb24gc291cmNlIHNpZGVcblxuICB2YXIgcDFfaTsgLy8gcG9pbnQgdG8gaW50ZXJzZWN0IHdpdGggdGFyZ2V0IHNoYXBlXG4gIHZhciBwMl9pOyAvLyBwb2ludCB0byBpbnRlcnNlY3Qgd2l0aCBzb3VyY2Ugc2hhcGVcblxuICB2YXIgdGd0TWFuRW5kcHRQdCA9IChfcmVmID0gKHRndE1hbkVuZHB0ID09PSBudWxsIHx8IHRndE1hbkVuZHB0ID09PSB2b2lkIDAgfHwgKF90Z3RNYW5FbmRwdCRwZlZhbHVlID0gdGd0TWFuRW5kcHQucGZWYWx1ZSkgPT09IG51bGwgfHwgX3RndE1hbkVuZHB0JHBmVmFsdWUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90Z3RNYW5FbmRwdCRwZlZhbHVlLmxlbmd0aCkgPT09IDIgPyB0Z3RNYW5FbmRwdC5wZlZhbHVlIDogbnVsbCkgIT09IG51bGwgJiYgX3JlZiAhPT0gdm9pZCAwID8gX3JlZiA6IFswLCAwXTtcbiAgdmFyIHNyY01hbkVuZHB0UHQgPSAoX3JlZjIgPSAoc3JjTWFuRW5kcHQgPT09IG51bGwgfHwgc3JjTWFuRW5kcHQgPT09IHZvaWQgMCB8fCAoX3NyY01hbkVuZHB0JHBmVmFsdWUgPSBzcmNNYW5FbmRwdC5wZlZhbHVlKSA9PT0gbnVsbCB8fCBfc3JjTWFuRW5kcHQkcGZWYWx1ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3NyY01hbkVuZHB0JHBmVmFsdWUubGVuZ3RoKSA9PT0gMiA/IHNyY01hbkVuZHB0LnBmVmFsdWUgOiBudWxsKSAhPT0gbnVsbCAmJiBfcmVmMiAhPT0gdm9pZCAwID8gX3JlZjIgOiBbMCwgMF07XG4gIGlmIChiZXppZXIpIHtcbiAgICB2YXIgY3BTdGFydCA9IFtycy5jdHJscHRzWzBdLCBycy5jdHJscHRzWzFdXTtcbiAgICB2YXIgY3BFbmQgPSBtdWx0aSA/IFtycy5jdHJscHRzW3JzLmN0cmxwdHMubGVuZ3RoIC0gMl0sIHJzLmN0cmxwdHNbcnMuY3RybHB0cy5sZW5ndGggLSAxXV0gOiBjcFN0YXJ0O1xuICAgIHAxID0gY3BFbmQ7XG4gICAgcDIgPSBjcFN0YXJ0O1xuICB9IGVsc2UgaWYgKGxpbmVzKSB7XG4gICAgdmFyIHNyY0Fycm93RnJvbVB0ID0gIXNlZ21lbnRzID8gW3RndFBvcy54ICsgdGd0TWFuRW5kcHRQdFswXSwgdGd0UG9zLnkgKyB0Z3RNYW5FbmRwdFB0WzFdXSA6IHJzLnNlZ3B0cy5zbGljZSgwLCAyKTtcbiAgICB2YXIgdGd0QXJyb3dGcm9tUHQgPSAhc2VnbWVudHMgPyBbc3JjUG9zLnggKyBzcmNNYW5FbmRwdFB0WzBdLCBzcmNQb3MueSArIHNyY01hbkVuZHB0UHRbMV1dIDogcnMuc2VncHRzLnNsaWNlKHJzLnNlZ3B0cy5sZW5ndGggLSAyKTtcbiAgICBwMSA9IHRndEFycm93RnJvbVB0O1xuICAgIHAyID0gc3JjQXJyb3dGcm9tUHQ7XG4gIH1cbiAgaWYgKHRndE1hbkVuZHB0VmFsID09PSAnaW5zaWRlLXRvLW5vZGUnKSB7XG4gICAgaW50ZXJzZWN0ID0gW3RndFBvcy54LCB0Z3RQb3MueV07XG4gIH0gZWxzZSBpZiAodGd0TWFuRW5kcHQudW5pdHMpIHtcbiAgICBpbnRlcnNlY3QgPSB0aGlzLm1hbnVhbEVuZHB0VG9QeCh0YXJnZXQsIHRndE1hbkVuZHB0KTtcbiAgfSBlbHNlIGlmICh0Z3RNYW5FbmRwdFZhbCA9PT0gJ291dHNpZGUtdG8tbGluZScpIHtcbiAgICBpbnRlcnNlY3QgPSBycy50Z3RJbnRuOyAvLyB1c2UgY2FjaGVkIHZhbHVlIGZyb20gY3RybHB0IGNhbGNcbiAgfSBlbHNlIHtcbiAgICBpZiAodGd0TWFuRW5kcHRWYWwgPT09ICdvdXRzaWRlLXRvLW5vZGUnIHx8IHRndE1hbkVuZHB0VmFsID09PSAnb3V0c2lkZS10by1ub2RlLW9yLWxhYmVsJykge1xuICAgICAgcDFfaSA9IHAxO1xuICAgIH0gZWxzZSBpZiAodGd0TWFuRW5kcHRWYWwgPT09ICdvdXRzaWRlLXRvLWxpbmUnIHx8IHRndE1hbkVuZHB0VmFsID09PSAnb3V0c2lkZS10by1saW5lLW9yLWxhYmVsJykge1xuICAgICAgcDFfaSA9IFtzcmNQb3MueCwgc3JjUG9zLnldO1xuICAgIH1cbiAgICBpbnRlcnNlY3QgPSByLm5vZGVTaGFwZXNbdGhpcy5nZXROb2RlU2hhcGUodGFyZ2V0KV0uaW50ZXJzZWN0TGluZSh0Z3RQb3MueCwgdGd0UG9zLnksIHRhcmdldC5vdXRlcldpZHRoKCksIHRhcmdldC5vdXRlckhlaWdodCgpLCBwMV9pWzBdLCBwMV9pWzFdLCAwLCB0Z3RDb3JuZXJSYWRpdXMsIHRndFJzKTtcbiAgICBpZiAodGd0TWFuRW5kcHRWYWwgPT09ICdvdXRzaWRlLXRvLW5vZGUtb3ItbGFiZWwnIHx8IHRndE1hbkVuZHB0VmFsID09PSAnb3V0c2lkZS10by1saW5lLW9yLWxhYmVsJykge1xuICAgICAgdmFyIHRycyA9IHRhcmdldC5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgICAgIHZhciBsdyA9IHRycy5sYWJlbFdpZHRoO1xuICAgICAgdmFyIGxoID0gdHJzLmxhYmVsSGVpZ2h0O1xuICAgICAgdmFyIGx4ID0gdHJzLmxhYmVsWDtcbiAgICAgIHZhciBseSA9IHRycy5sYWJlbFk7XG4gICAgICB2YXIgbHcyID0gbHcgLyAyO1xuICAgICAgdmFyIGxoMiA9IGxoIC8gMjtcbiAgICAgIHZhciB2YSA9IHRhcmdldC5wc3R5bGUoJ3RleHQtdmFsaWduJykudmFsdWU7XG4gICAgICB2YSA9IGxhYmVsVmFsaWduKHZhKTtcbiAgICAgIGlmICh2YSA9PT0gJ3RvcCcpIHtcbiAgICAgICAgbHkgLT0gbGgyO1xuICAgICAgfSBlbHNlIGlmICh2YSA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgbHkgKz0gbGgyO1xuICAgICAgfVxuICAgICAgdmFyIGhhID0gdGFyZ2V0LnBzdHlsZSgndGV4dC1oYWxpZ24nKS52YWx1ZTtcbiAgICAgIGhhID0gbGFiZWxIYWxpZ24oaGEpO1xuICAgICAgaWYgKGhhID09PSAnbGVmdCcpIHtcbiAgICAgICAgbHggLT0gbHcyO1xuICAgICAgfSBlbHNlIGlmIChoYSA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICBseCArPSBsdzI7XG4gICAgICB9XG4gICAgICB2YXIgbGFiZWxJbnRlcnNlY3QgPSBwb2x5Z29uSW50ZXJzZWN0TGluZShwMV9pWzBdLCBwMV9pWzFdLCBbbHggLSBsdzIsIGx5IC0gbGgyLCBseCArIGx3MiwgbHkgLSBsaDIsIGx4ICsgbHcyLCBseSArIGxoMiwgbHggLSBsdzIsIGx5ICsgbGgyXSwgdGd0UG9zLngsIHRndFBvcy55KTtcbiAgICAgIGlmIChsYWJlbEludGVyc2VjdC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZhciByZWZQdCA9IHNyY1BvcztcbiAgICAgICAgdmFyIGludFNxZGlzdCA9IHNxZGlzdChyZWZQdCwgYXJyYXkycG9pbnQoaW50ZXJzZWN0KSk7XG4gICAgICAgIHZhciBsYWJJbnRTcWRpc3QgPSBzcWRpc3QocmVmUHQsIGFycmF5MnBvaW50KGxhYmVsSW50ZXJzZWN0KSk7XG4gICAgICAgIHZhciBtaW5TcURpc3QgPSBpbnRTcWRpc3Q7XG4gICAgICAgIGlmIChsYWJJbnRTcWRpc3QgPCBpbnRTcWRpc3QpIHtcbiAgICAgICAgICBpbnRlcnNlY3QgPSBsYWJlbEludGVyc2VjdDtcbiAgICAgICAgICBtaW5TcURpc3QgPSBsYWJJbnRTcWRpc3Q7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxhYmVsSW50ZXJzZWN0Lmxlbmd0aCA+IDIpIHtcbiAgICAgICAgICB2YXIgbGFiSW50MlNxRGlzdCA9IHNxZGlzdChyZWZQdCwge1xuICAgICAgICAgICAgeDogbGFiZWxJbnRlcnNlY3RbMl0sXG4gICAgICAgICAgICB5OiBsYWJlbEludGVyc2VjdFszXVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChsYWJJbnQyU3FEaXN0IDwgbWluU3FEaXN0KSB7XG4gICAgICAgICAgICBpbnRlcnNlY3QgPSBbbGFiZWxJbnRlcnNlY3RbMl0sIGxhYmVsSW50ZXJzZWN0WzNdXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgdmFyIGFycm93RW5kID0gc2hvcnRlbkludGVyc2VjdGlvbihpbnRlcnNlY3QsIHAxLCByLmFycm93U2hhcGVzW3RndEFyU2hhcGVdLnNwYWNpbmcoZWRnZSkgKyB0Z3REaXN0KTtcbiAgdmFyIGVkZ2VFbmQgPSBzaG9ydGVuSW50ZXJzZWN0aW9uKGludGVyc2VjdCwgcDEsIHIuYXJyb3dTaGFwZXNbdGd0QXJTaGFwZV0uZ2FwKGVkZ2UpICsgdGd0RGlzdCk7XG4gIHJzLmVuZFggPSBlZGdlRW5kWzBdO1xuICBycy5lbmRZID0gZWRnZUVuZFsxXTtcbiAgcnMuYXJyb3dFbmRYID0gYXJyb3dFbmRbMF07XG4gIHJzLmFycm93RW5kWSA9IGFycm93RW5kWzFdO1xuICBpZiAoc3JjTWFuRW5kcHRWYWwgPT09ICdpbnNpZGUtdG8tbm9kZScpIHtcbiAgICBpbnRlcnNlY3QgPSBbc3JjUG9zLngsIHNyY1Bvcy55XTtcbiAgfSBlbHNlIGlmIChzcmNNYW5FbmRwdC51bml0cykge1xuICAgIGludGVyc2VjdCA9IHRoaXMubWFudWFsRW5kcHRUb1B4KHNvdXJjZSwgc3JjTWFuRW5kcHQpO1xuICB9IGVsc2UgaWYgKHNyY01hbkVuZHB0VmFsID09PSAnb3V0c2lkZS10by1saW5lJykge1xuICAgIGludGVyc2VjdCA9IHJzLnNyY0ludG47IC8vIHVzZSBjYWNoZWQgdmFsdWUgZnJvbSBjdHJscHQgY2FsY1xuICB9IGVsc2Uge1xuICAgIGlmIChzcmNNYW5FbmRwdFZhbCA9PT0gJ291dHNpZGUtdG8tbm9kZScgfHwgc3JjTWFuRW5kcHRWYWwgPT09ICdvdXRzaWRlLXRvLW5vZGUtb3ItbGFiZWwnKSB7XG4gICAgICBwMl9pID0gcDI7XG4gICAgfSBlbHNlIGlmIChzcmNNYW5FbmRwdFZhbCA9PT0gJ291dHNpZGUtdG8tbGluZScgfHwgc3JjTWFuRW5kcHRWYWwgPT09ICdvdXRzaWRlLXRvLWxpbmUtb3ItbGFiZWwnKSB7XG4gICAgICBwMl9pID0gW3RndFBvcy54LCB0Z3RQb3MueV07XG4gICAgfVxuICAgIGludGVyc2VjdCA9IHIubm9kZVNoYXBlc1t0aGlzLmdldE5vZGVTaGFwZShzb3VyY2UpXS5pbnRlcnNlY3RMaW5lKHNyY1Bvcy54LCBzcmNQb3MueSwgc291cmNlLm91dGVyV2lkdGgoKSwgc291cmNlLm91dGVySGVpZ2h0KCksIHAyX2lbMF0sIHAyX2lbMV0sIDAsIHNyY0Nvcm5lclJhZGl1cywgc3JjUnMpO1xuICAgIGlmIChzcmNNYW5FbmRwdFZhbCA9PT0gJ291dHNpZGUtdG8tbm9kZS1vci1sYWJlbCcgfHwgc3JjTWFuRW5kcHRWYWwgPT09ICdvdXRzaWRlLXRvLWxpbmUtb3ItbGFiZWwnKSB7XG4gICAgICB2YXIgc3JzID0gc291cmNlLl9wcml2YXRlLnJzY3JhdGNoO1xuICAgICAgdmFyIF9sdyA9IHNycy5sYWJlbFdpZHRoO1xuICAgICAgdmFyIF9saCA9IHNycy5sYWJlbEhlaWdodDtcbiAgICAgIHZhciBfbHggPSBzcnMubGFiZWxYO1xuICAgICAgdmFyIF9seSA9IHNycy5sYWJlbFk7XG4gICAgICB2YXIgX2x3MiA9IF9sdyAvIDI7XG4gICAgICB2YXIgX2xoMiA9IF9saCAvIDI7XG4gICAgICB2YXIgX3ZhID0gc291cmNlLnBzdHlsZSgndGV4dC12YWxpZ24nKS52YWx1ZTtcbiAgICAgIF92YSA9IGxhYmVsVmFsaWduKF92YSk7XG4gICAgICBpZiAoX3ZhID09PSAndG9wJykge1xuICAgICAgICBfbHkgLT0gX2xoMjtcbiAgICAgIH0gZWxzZSBpZiAoX3ZhID09PSAnYm90dG9tJykge1xuICAgICAgICBfbHkgKz0gX2xoMjtcbiAgICAgIH1cbiAgICAgIHZhciBfaGEgPSBzb3VyY2UucHN0eWxlKCd0ZXh0LWhhbGlnbicpLnZhbHVlO1xuICAgICAgX2hhID0gbGFiZWxIYWxpZ24oX2hhKTtcbiAgICAgIGlmIChfaGEgPT09ICdsZWZ0Jykge1xuICAgICAgICBfbHggLT0gX2x3MjtcbiAgICAgIH0gZWxzZSBpZiAoX2hhID09PSAncmlnaHQnKSB7XG4gICAgICAgIF9seCArPSBfbHcyO1xuICAgICAgfVxuICAgICAgdmFyIF9sYWJlbEludGVyc2VjdCA9IHBvbHlnb25JbnRlcnNlY3RMaW5lKHAyX2lbMF0sIHAyX2lbMV0sIFtfbHggLSBfbHcyLCBfbHkgLSBfbGgyLCBfbHggKyBfbHcyLCBfbHkgLSBfbGgyLCBfbHggKyBfbHcyLCBfbHkgKyBfbGgyLCBfbHggLSBfbHcyLCBfbHkgKyBfbGgyXSwgc3JjUG9zLngsIHNyY1Bvcy55KTtcbiAgICAgIGlmIChfbGFiZWxJbnRlcnNlY3QubGVuZ3RoID4gMCkge1xuICAgICAgICB2YXIgX3JlZlB0ID0gdGd0UG9zO1xuICAgICAgICB2YXIgX2ludFNxZGlzdCA9IHNxZGlzdChfcmVmUHQsIGFycmF5MnBvaW50KGludGVyc2VjdCkpO1xuICAgICAgICB2YXIgX2xhYkludFNxZGlzdCA9IHNxZGlzdChfcmVmUHQsIGFycmF5MnBvaW50KF9sYWJlbEludGVyc2VjdCkpO1xuICAgICAgICB2YXIgX21pblNxRGlzdCA9IF9pbnRTcWRpc3Q7XG4gICAgICAgIGlmIChfbGFiSW50U3FkaXN0IDwgX2ludFNxZGlzdCkge1xuICAgICAgICAgIGludGVyc2VjdCA9IFtfbGFiZWxJbnRlcnNlY3RbMF0sIF9sYWJlbEludGVyc2VjdFsxXV07XG4gICAgICAgICAgX21pblNxRGlzdCA9IF9sYWJJbnRTcWRpc3Q7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKF9sYWJlbEludGVyc2VjdC5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgdmFyIF9sYWJJbnQyU3FEaXN0ID0gc3FkaXN0KF9yZWZQdCwge1xuICAgICAgICAgICAgeDogX2xhYmVsSW50ZXJzZWN0WzJdLFxuICAgICAgICAgICAgeTogX2xhYmVsSW50ZXJzZWN0WzNdXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKF9sYWJJbnQyU3FEaXN0IDwgX21pblNxRGlzdCkge1xuICAgICAgICAgICAgaW50ZXJzZWN0ID0gW19sYWJlbEludGVyc2VjdFsyXSwgX2xhYmVsSW50ZXJzZWN0WzNdXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgdmFyIGFycm93U3RhcnQgPSBzaG9ydGVuSW50ZXJzZWN0aW9uKGludGVyc2VjdCwgcDIsIHIuYXJyb3dTaGFwZXNbc3JjQXJTaGFwZV0uc3BhY2luZyhlZGdlKSArIHNyY0Rpc3QpO1xuICB2YXIgZWRnZVN0YXJ0ID0gc2hvcnRlbkludGVyc2VjdGlvbihpbnRlcnNlY3QsIHAyLCByLmFycm93U2hhcGVzW3NyY0FyU2hhcGVdLmdhcChlZGdlKSArIHNyY0Rpc3QpO1xuICBycy5zdGFydFggPSBlZGdlU3RhcnRbMF07XG4gIHJzLnN0YXJ0WSA9IGVkZ2VTdGFydFsxXTtcbiAgcnMuYXJyb3dTdGFydFggPSBhcnJvd1N0YXJ0WzBdO1xuICBycy5hcnJvd1N0YXJ0WSA9IGFycm93U3RhcnRbMV07XG4gIGlmIChoYXNFbmRwdHMpIHtcbiAgICBpZiAoIW51bWJlciQxKHJzLnN0YXJ0WCkgfHwgIW51bWJlciQxKHJzLnN0YXJ0WSkgfHwgIW51bWJlciQxKHJzLmVuZFgpIHx8ICFudW1iZXIkMShycy5lbmRZKSkge1xuICAgICAgcnMuYmFkTGluZSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJzLmJhZExpbmUgPSBmYWxzZTtcbiAgICB9XG4gIH1cbn07XG5CUnAkYi5nZXRTb3VyY2VFbmRwb2ludCA9IGZ1bmN0aW9uIChlZGdlKSB7XG4gIHZhciBycyA9IGVkZ2VbMF0uX3ByaXZhdGUucnNjcmF0Y2g7XG4gIHRoaXMucmVjYWxjdWxhdGVSZW5kZXJlZFN0eWxlKGVkZ2UpO1xuICBzd2l0Y2ggKHJzLmVkZ2VUeXBlKSB7XG4gICAgY2FzZSAnaGF5c3RhY2snOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogcnMuaGF5c3RhY2tQdHNbMF0sXG4gICAgICAgIHk6IHJzLmhheXN0YWNrUHRzWzFdXG4gICAgICB9O1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4OiBycy5hcnJvd1N0YXJ0WCxcbiAgICAgICAgeTogcnMuYXJyb3dTdGFydFlcbiAgICAgIH07XG4gIH1cbn07XG5CUnAkYi5nZXRUYXJnZXRFbmRwb2ludCA9IGZ1bmN0aW9uIChlZGdlKSB7XG4gIHZhciBycyA9IGVkZ2VbMF0uX3ByaXZhdGUucnNjcmF0Y2g7XG4gIHRoaXMucmVjYWxjdWxhdGVSZW5kZXJlZFN0eWxlKGVkZ2UpO1xuICBzd2l0Y2ggKHJzLmVkZ2VUeXBlKSB7XG4gICAgY2FzZSAnaGF5c3RhY2snOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogcnMuaGF5c3RhY2tQdHNbMl0sXG4gICAgICAgIHk6IHJzLmhheXN0YWNrUHRzWzNdXG4gICAgICB9O1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4OiBycy5hcnJvd0VuZFgsXG4gICAgICAgIHk6IHJzLmFycm93RW5kWVxuICAgICAgfTtcbiAgfVxufTtcblxudmFyIEJScCRhID0ge307XG5mdW5jdGlvbiBwdXNoQmV6aWVyUHRzKHIsIGVkZ2UsIHB0cykge1xuICB2YXIgcWJlemllckF0JDEgPSBmdW5jdGlvbiBxYmV6aWVyQXQkMShwMSwgcDIsIHAzLCB0KSB7XG4gICAgcmV0dXJuIHFiZXppZXJBdChwMSwgcDIsIHAzLCB0KTtcbiAgfTtcbiAgdmFyIF9wID0gZWRnZS5fcHJpdmF0ZTtcbiAgdmFyIGJwdHMgPSBfcC5yc3R5bGUuYmV6aWVyUHRzO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHIuYmV6aWVyUHJvalBjdHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcCA9IHIuYmV6aWVyUHJvalBjdHNbaV07XG4gICAgYnB0cy5wdXNoKHtcbiAgICAgIHg6IHFiZXppZXJBdCQxKHB0c1swXSwgcHRzWzJdLCBwdHNbNF0sIHApLFxuICAgICAgeTogcWJlemllckF0JDEocHRzWzFdLCBwdHNbM10sIHB0c1s1XSwgcClcbiAgICB9KTtcbiAgfVxufVxuQlJwJGEuc3RvcmVFZGdlUHJvamVjdGlvbnMgPSBmdW5jdGlvbiAoZWRnZSkge1xuICB2YXIgX3AgPSBlZGdlLl9wcml2YXRlO1xuICB2YXIgcnMgPSBfcC5yc2NyYXRjaDtcbiAgdmFyIGV0ID0gcnMuZWRnZVR5cGU7XG5cbiAgLy8gY2xlYXIgdGhlIGNhY2hlZCBwb2ludHMgc3RhdGVcbiAgX3AucnN0eWxlLmJlemllclB0cyA9IG51bGw7XG4gIF9wLnJzdHlsZS5saW5lUHRzID0gbnVsbDtcbiAgX3AucnN0eWxlLmhheXN0YWNrUHRzID0gbnVsbDtcbiAgaWYgKGV0ID09PSAnbXVsdGliZXppZXInIHx8IGV0ID09PSAnYmV6aWVyJyB8fCBldCA9PT0gJ3NlbGYnIHx8IGV0ID09PSAnY29tcG91bmQnKSB7XG4gICAgX3AucnN0eWxlLmJlemllclB0cyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpICsgNSA8IHJzLmFsbHB0cy5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgcHVzaEJlemllclB0cyh0aGlzLCBlZGdlLCBycy5hbGxwdHMuc2xpY2UoaSwgaSArIDYpKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoZXQgPT09ICdzZWdtZW50cycpIHtcbiAgICB2YXIgbHB0cyA9IF9wLnJzdHlsZS5saW5lUHRzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgKyAxIDwgcnMuYWxscHRzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICBscHRzLnB1c2goe1xuICAgICAgICB4OiBycy5hbGxwdHNbaV0sXG4gICAgICAgIHk6IHJzLmFsbHB0c1tpICsgMV1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIGlmIChldCA9PT0gJ2hheXN0YWNrJykge1xuICAgIHZhciBocHRzID0gcnMuaGF5c3RhY2tQdHM7XG4gICAgX3AucnN0eWxlLmhheXN0YWNrUHRzID0gW3tcbiAgICAgIHg6IGhwdHNbMF0sXG4gICAgICB5OiBocHRzWzFdXG4gICAgfSwge1xuICAgICAgeDogaHB0c1syXSxcbiAgICAgIHk6IGhwdHNbM11cbiAgICB9XTtcbiAgfVxuICBfcC5yc3R5bGUuYXJyb3dXaWR0aCA9IHRoaXMuZ2V0QXJyb3dXaWR0aChlZGdlLnBzdHlsZSgnd2lkdGgnKS5wZlZhbHVlLCBlZGdlLnBzdHlsZSgnYXJyb3ctc2NhbGUnKS52YWx1ZSkgKiB0aGlzLmFycm93U2hhcGVXaWR0aDtcbn07XG5CUnAkYS5yZWNhbGN1bGF0ZUVkZ2VQcm9qZWN0aW9ucyA9IGZ1bmN0aW9uIChlZGdlcykge1xuICB0aGlzLmZpbmRFZGdlQ29udHJvbFBvaW50cyhlZGdlcyk7XG59O1xuXG52YXIgQlJwJDkgPSB7fTtcbkJScCQ5LnJlY2FsY3VsYXRlTm9kZUxhYmVsUHJvamVjdGlvbiA9IGZ1bmN0aW9uIChub2RlKSB7XG4gIHZhciBjb250ZW50ID0gbm9kZS5wc3R5bGUoJ2xhYmVsJykuc3RyVmFsdWU7XG4gIGlmIChlbXB0eVN0cmluZyhjb250ZW50KSkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgdGV4dFgsIHRleHRZO1xuICB2YXIgX3AgPSBub2RlLl9wcml2YXRlO1xuICB2YXIgbm9kZVdpZHRoID0gbm9kZS53aWR0aCgpO1xuICB2YXIgbm9kZUhlaWdodCA9IG5vZGUuaGVpZ2h0KCk7XG4gIHZhciBwYWRkaW5nID0gbm9kZS5wYWRkaW5nKCk7XG4gIHZhciBub2RlUG9zID0gbm9kZS5wb3NpdGlvbigpO1xuICB2YXIgdGV4dEhhbGlnbiA9IG5vZGUucHN0eWxlKCd0ZXh0LWhhbGlnbicpLnN0clZhbHVlO1xuICB2YXIgdGV4dFZhbGlnbiA9IG5vZGUucHN0eWxlKCd0ZXh0LXZhbGlnbicpLnN0clZhbHVlO1xuICB2YXIgcnMgPSBfcC5yc2NyYXRjaDtcbiAgdmFyIHJzdHlsZSA9IF9wLnJzdHlsZTtcbiAgc3dpdGNoICh0ZXh0SGFsaWduKSB7XG4gICAgY2FzZSAnbGVmdCc6XG4gICAgICB0ZXh0WCA9IG5vZGVQb3MueCAtIG5vZGVXaWR0aCAvIDIgLSBwYWRkaW5nO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnbGVmdC1pbnNpZGUnOlxuICAgICAgdGV4dFggPSBub2RlUG9zLnggLSBub2RlV2lkdGggLyAyICsgcGFkZGluZztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgIHRleHRYID0gbm9kZVBvcy54ICsgbm9kZVdpZHRoIC8gMiArIHBhZGRpbmc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdyaWdodC1pbnNpZGUnOlxuICAgICAgdGV4dFggPSBub2RlUG9zLnggKyBub2RlV2lkdGggLyAyIC0gcGFkZGluZztcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBlLmcuIGNlbnRlclxuICAgICAgdGV4dFggPSBub2RlUG9zLng7XG4gIH1cbiAgc3dpdGNoICh0ZXh0VmFsaWduKSB7XG4gICAgY2FzZSAndG9wJzpcbiAgICAgIHRleHRZID0gbm9kZVBvcy55IC0gbm9kZUhlaWdodCAvIDIgLSBwYWRkaW5nO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndG9wLWluc2lkZSc6XG4gICAgICB0ZXh0WSA9IG5vZGVQb3MueSAtIG5vZGVIZWlnaHQgLyAyICsgcGFkZGluZztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICB0ZXh0WSA9IG5vZGVQb3MueSArIG5vZGVIZWlnaHQgLyAyICsgcGFkZGluZztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2JvdHRvbS1pbnNpZGUnOlxuICAgICAgdGV4dFkgPSBub2RlUG9zLnkgKyBub2RlSGVpZ2h0IC8gMiAtIHBhZGRpbmc7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgLy8gZS5nLiBtaWRkbGVcbiAgICAgIHRleHRZID0gbm9kZVBvcy55O1xuICB9XG4gIHJzLmxhYmVsWCA9IHRleHRYO1xuICBycy5sYWJlbFkgPSB0ZXh0WTtcbiAgcnN0eWxlLmxhYmVsWCA9IHRleHRYO1xuICByc3R5bGUubGFiZWxZID0gdGV4dFk7XG4gIHRoaXMuY2FsY3VsYXRlTGFiZWxBbmdsZXMobm9kZSk7XG4gIHRoaXMuYXBwbHlMYWJlbERpbWVuc2lvbnMobm9kZSk7XG59O1xudmFyIGxpbmVBbmdsZUZyb21EZWx0YSA9IGZ1bmN0aW9uIGxpbmVBbmdsZUZyb21EZWx0YShkeCwgZHkpIHtcbiAgdmFyIGFuZ2xlID0gTWF0aC5hdGFuKGR5IC8gZHgpO1xuICBpZiAoZHggPT09IDAgJiYgYW5nbGUgPCAwKSB7XG4gICAgYW5nbGUgPSBhbmdsZSAqIC0xO1xuICB9XG4gIHJldHVybiBhbmdsZTtcbn07XG52YXIgbGluZUFuZ2xlID0gZnVuY3Rpb24gbGluZUFuZ2xlKHAwLCBwMSkge1xuICB2YXIgZHggPSBwMS54IC0gcDAueDtcbiAgdmFyIGR5ID0gcDEueSAtIHAwLnk7XG4gIHJldHVybiBsaW5lQW5nbGVGcm9tRGVsdGEoZHgsIGR5KTtcbn07XG52YXIgYmV6aWVyQW5nbGUgPSBmdW5jdGlvbiBiZXppZXJBbmdsZShwMCwgcDEsIHAyLCB0KSB7XG4gIHZhciB0MCA9IGJvdW5kKDAsIHQgLSAwLjAwMSwgMSk7XG4gIHZhciB0MSA9IGJvdW5kKDAsIHQgKyAwLjAwMSwgMSk7XG4gIHZhciBscDAgPSBxYmV6aWVyUHRBdChwMCwgcDEsIHAyLCB0MCk7XG4gIHZhciBscDEgPSBxYmV6aWVyUHRBdChwMCwgcDEsIHAyLCB0MSk7XG4gIHJldHVybiBsaW5lQW5nbGUobHAwLCBscDEpO1xufTtcbkJScCQ5LnJlY2FsY3VsYXRlRWRnZUxhYmVsUHJvamVjdGlvbnMgPSBmdW5jdGlvbiAoZWRnZSkge1xuICB2YXIgcDtcbiAgdmFyIF9wID0gZWRnZS5fcHJpdmF0ZTtcbiAgdmFyIHJzID0gX3AucnNjcmF0Y2g7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIGNvbnRlbnQgPSB7XG4gICAgbWlkOiBlZGdlLnBzdHlsZSgnbGFiZWwnKS5zdHJWYWx1ZSxcbiAgICBzb3VyY2U6IGVkZ2UucHN0eWxlKCdzb3VyY2UtbGFiZWwnKS5zdHJWYWx1ZSxcbiAgICB0YXJnZXQ6IGVkZ2UucHN0eWxlKCd0YXJnZXQtbGFiZWwnKS5zdHJWYWx1ZVxuICB9O1xuICBpZiAoY29udGVudC5taWQgfHwgY29udGVudC5zb3VyY2UgfHwgY29udGVudC50YXJnZXQpIDsgZWxzZSB7XG4gICAgcmV0dXJuOyAvLyBubyBsYWJlbHMgPT4gbm8gY2FsY3NcbiAgfVxuXG4gIC8vIGFkZCBjZW50ZXIgcG9pbnQgdG8gc3R5bGUgc28gYm91bmRpbmcgYm94IGNhbGN1bGF0aW9ucyBjYW4gdXNlIGl0XG4gIC8vXG4gIHAgPSB7XG4gICAgeDogcnMubWlkWCxcbiAgICB5OiBycy5taWRZXG4gIH07XG4gIHZhciBzZXRScyA9IGZ1bmN0aW9uIHNldFJzKHByb3BOYW1lLCBwcmVmaXgsIHZhbHVlKSB7XG4gICAgc2V0UHJlZml4ZWRQcm9wZXJ0eShfcC5yc2NyYXRjaCwgcHJvcE5hbWUsIHByZWZpeCwgdmFsdWUpO1xuICAgIHNldFByZWZpeGVkUHJvcGVydHkoX3AucnN0eWxlLCBwcm9wTmFtZSwgcHJlZml4LCB2YWx1ZSk7XG4gIH07XG4gIHNldFJzKCdsYWJlbFgnLCBudWxsLCBwLngpO1xuICBzZXRScygnbGFiZWxZJywgbnVsbCwgcC55KTtcbiAgdmFyIG1pZEFuZ2xlID0gbGluZUFuZ2xlRnJvbURlbHRhKHJzLm1pZERpc3BYLCBycy5taWREaXNwWSk7XG4gIHNldFJzKCdsYWJlbEF1dG9BbmdsZScsIG51bGwsIG1pZEFuZ2xlKTtcbiAgdmFyIF9jcmVhdGVDb250cm9sUG9pbnRJbmZvID0gZnVuY3Rpb24gY3JlYXRlQ29udHJvbFBvaW50SW5mbygpIHtcbiAgICBpZiAoX2NyZWF0ZUNvbnRyb2xQb2ludEluZm8uY2FjaGUpIHtcbiAgICAgIHJldHVybiBfY3JlYXRlQ29udHJvbFBvaW50SW5mby5jYWNoZTtcbiAgICB9IC8vIHVzZSBjYWNoZSBzbyBvbmx5IDF4IHBlciBlZGdlXG5cbiAgICB2YXIgY3RybHB0cyA9IFtdO1xuXG4gICAgLy8gc3RvcmUgZWFjaCBjdHJscHQgaW5mbyBpbml0XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgKyA1IDwgcnMuYWxscHRzLmxlbmd0aDsgaSArPSA0KSB7XG4gICAgICB2YXIgcDAgPSB7XG4gICAgICAgIHg6IHJzLmFsbHB0c1tpXSxcbiAgICAgICAgeTogcnMuYWxscHRzW2kgKyAxXVxuICAgICAgfTtcbiAgICAgIHZhciBwMSA9IHtcbiAgICAgICAgeDogcnMuYWxscHRzW2kgKyAyXSxcbiAgICAgICAgeTogcnMuYWxscHRzW2kgKyAzXVxuICAgICAgfTsgLy8gY3RybHB0XG4gICAgICB2YXIgcDIgPSB7XG4gICAgICAgIHg6IHJzLmFsbHB0c1tpICsgNF0sXG4gICAgICAgIHk6IHJzLmFsbHB0c1tpICsgNV1cbiAgICAgIH07XG4gICAgICBjdHJscHRzLnB1c2goe1xuICAgICAgICBwMDogcDAsXG4gICAgICAgIHAxOiBwMSxcbiAgICAgICAgcDI6IHAyLFxuICAgICAgICBzdGFydERpc3Q6IDAsXG4gICAgICAgIGxlbmd0aDogMCxcbiAgICAgICAgc2VnbWVudHM6IFtdXG4gICAgICB9KTtcbiAgICB9XG4gICAgdmFyIGJwdHMgPSBfcC5yc3R5bGUuYmV6aWVyUHRzO1xuICAgIHZhciBuUHJvanMgPSByLmJlemllclByb2pQY3RzLmxlbmd0aDtcbiAgICBmdW5jdGlvbiBhZGRTZWdtZW50KGNwLCBwMCwgcDEsIHQwLCB0MSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGRpc3QocDAsIHAxKTtcbiAgICAgIHZhciBwcmV2U2VnbWVudCA9IGNwLnNlZ21lbnRzW2NwLnNlZ21lbnRzLmxlbmd0aCAtIDFdO1xuICAgICAgdmFyIHNlZ21lbnQgPSB7XG4gICAgICAgIHAwOiBwMCxcbiAgICAgICAgcDE6IHAxLFxuICAgICAgICB0MDogdDAsXG4gICAgICAgIHQxOiB0MSxcbiAgICAgICAgc3RhcnREaXN0OiBwcmV2U2VnbWVudCA/IHByZXZTZWdtZW50LnN0YXJ0RGlzdCArIHByZXZTZWdtZW50Lmxlbmd0aCA6IDAsXG4gICAgICAgIGxlbmd0aDogbGVuZ3RoXG4gICAgICB9O1xuICAgICAgY3Auc2VnbWVudHMucHVzaChzZWdtZW50KTtcbiAgICAgIGNwLmxlbmd0aCArPSBsZW5ndGg7XG4gICAgfVxuXG4gICAgLy8gdXBkYXRlIGVhY2ggY3RybHB0IHdpdGggc2VnbWVudCBpbmZvXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGN0cmxwdHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgY3AgPSBjdHJscHRzW19pXTtcbiAgICAgIHZhciBwcmV2Q3AgPSBjdHJscHRzW19pIC0gMV07XG4gICAgICBpZiAocHJldkNwKSB7XG4gICAgICAgIGNwLnN0YXJ0RGlzdCA9IHByZXZDcC5zdGFydERpc3QgKyBwcmV2Q3AubGVuZ3RoO1xuICAgICAgfVxuICAgICAgYWRkU2VnbWVudChjcCwgY3AucDAsIGJwdHNbX2kgKiBuUHJvanNdLCAwLCByLmJlemllclByb2pQY3RzWzBdKTsgLy8gZmlyc3RcblxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBuUHJvanMgLSAxOyBqKyspIHtcbiAgICAgICAgYWRkU2VnbWVudChjcCwgYnB0c1tfaSAqIG5Qcm9qcyArIGpdLCBicHRzW19pICogblByb2pzICsgaiArIDFdLCByLmJlemllclByb2pQY3RzW2pdLCByLmJlemllclByb2pQY3RzW2ogKyAxXSk7XG4gICAgICB9XG4gICAgICBhZGRTZWdtZW50KGNwLCBicHRzW19pICogblByb2pzICsgblByb2pzIC0gMV0sIGNwLnAyLCByLmJlemllclByb2pQY3RzW25Qcm9qcyAtIDFdLCAxKTsgLy8gbGFzdFxuICAgIH1cbiAgICByZXR1cm4gX2NyZWF0ZUNvbnRyb2xQb2ludEluZm8uY2FjaGUgPSBjdHJscHRzO1xuICB9O1xuICB2YXIgY2FsY3VsYXRlRW5kUHJvamVjdGlvbiA9IGZ1bmN0aW9uIGNhbGN1bGF0ZUVuZFByb2plY3Rpb24ocHJlZml4KSB7XG4gICAgdmFyIGFuZ2xlO1xuICAgIHZhciBpc1NyYyA9IHByZWZpeCA9PT0gJ3NvdXJjZSc7XG4gICAgaWYgKCFjb250ZW50W3ByZWZpeF0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIG9mZnNldCA9IGVkZ2UucHN0eWxlKHByZWZpeCArICctdGV4dC1vZmZzZXQnKS5wZlZhbHVlO1xuICAgIHN3aXRjaCAocnMuZWRnZVR5cGUpIHtcbiAgICAgIGNhc2UgJ3NlbGYnOlxuICAgICAgY2FzZSAnY29tcG91bmQnOlxuICAgICAgY2FzZSAnYmV6aWVyJzpcbiAgICAgIGNhc2UgJ211bHRpYmV6aWVyJzpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBjcHMgPSBfY3JlYXRlQ29udHJvbFBvaW50SW5mbygpO1xuICAgICAgICAgIHZhciBzZWxlY3RlZDtcbiAgICAgICAgICB2YXIgc3RhcnREaXN0ID0gMDtcbiAgICAgICAgICB2YXIgdG90YWxEaXN0ID0gMDtcblxuICAgICAgICAgIC8vIGZpbmQgdGhlIHNlZ21lbnQgd2UncmUgb25cbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIF9jcCA9IGNwc1tpc1NyYyA/IGkgOiBjcHMubGVuZ3RoIC0gMSAtIGldO1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBfY3Auc2VnbWVudHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgdmFyIF9zZWcgPSBfY3Auc2VnbWVudHNbaXNTcmMgPyBqIDogX2NwLnNlZ21lbnRzLmxlbmd0aCAtIDEgLSBqXTtcbiAgICAgICAgICAgICAgdmFyIGxhc3RTZWcgPSBpID09PSBjcHMubGVuZ3RoIC0gMSAmJiBqID09PSBfY3Auc2VnbWVudHMubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgc3RhcnREaXN0ID0gdG90YWxEaXN0O1xuICAgICAgICAgICAgICB0b3RhbERpc3QgKz0gX3NlZy5sZW5ndGg7XG4gICAgICAgICAgICAgIGlmICh0b3RhbERpc3QgPj0gb2Zmc2V0IHx8IGxhc3RTZWcpIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZCA9IHtcbiAgICAgICAgICAgICAgICAgIGNwOiBfY3AsXG4gICAgICAgICAgICAgICAgICBzZWdtZW50OiBfc2VnXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgY3AgPSBzZWxlY3RlZC5jcDtcbiAgICAgICAgICB2YXIgc2VnID0gc2VsZWN0ZWQuc2VnbWVudDtcbiAgICAgICAgICB2YXIgdFNlZ21lbnQgPSAob2Zmc2V0IC0gc3RhcnREaXN0KSAvIHNlZy5sZW5ndGg7XG4gICAgICAgICAgdmFyIHNlZ0R0ID0gc2VnLnQxIC0gc2VnLnQwO1xuICAgICAgICAgIHZhciB0ID0gaXNTcmMgPyBzZWcudDAgKyBzZWdEdCAqIHRTZWdtZW50IDogc2VnLnQxIC0gc2VnRHQgKiB0U2VnbWVudDtcbiAgICAgICAgICB0ID0gYm91bmQoMCwgdCwgMSk7XG4gICAgICAgICAgcCA9IHFiZXppZXJQdEF0KGNwLnAwLCBjcC5wMSwgY3AucDIsIHQpO1xuICAgICAgICAgIGFuZ2xlID0gYmV6aWVyQW5nbGUoY3AucDAsIGNwLnAxLCBjcC5wMiwgdCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgJ3N0cmFpZ2h0JzpcbiAgICAgIGNhc2UgJ3NlZ21lbnRzJzpcbiAgICAgIGNhc2UgJ2hheXN0YWNrJzpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBkID0gMCxcbiAgICAgICAgICAgIGRpLFxuICAgICAgICAgICAgZDA7XG4gICAgICAgICAgdmFyIHAwLCBwMTtcbiAgICAgICAgICB2YXIgbCA9IHJzLmFsbHB0cy5sZW5ndGg7XG4gICAgICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyICsgMyA8IGw7IF9pMiArPSAyKSB7XG4gICAgICAgICAgICBpZiAoaXNTcmMpIHtcbiAgICAgICAgICAgICAgcDAgPSB7XG4gICAgICAgICAgICAgICAgeDogcnMuYWxscHRzW19pMl0sXG4gICAgICAgICAgICAgICAgeTogcnMuYWxscHRzW19pMiArIDFdXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIHAxID0ge1xuICAgICAgICAgICAgICAgIHg6IHJzLmFsbHB0c1tfaTIgKyAyXSxcbiAgICAgICAgICAgICAgICB5OiBycy5hbGxwdHNbX2kyICsgM11cbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHAwID0ge1xuICAgICAgICAgICAgICAgIHg6IHJzLmFsbHB0c1tsIC0gMiAtIF9pMl0sXG4gICAgICAgICAgICAgICAgeTogcnMuYWxscHRzW2wgLSAxIC0gX2kyXVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBwMSA9IHtcbiAgICAgICAgICAgICAgICB4OiBycy5hbGxwdHNbbCAtIDQgLSBfaTJdLFxuICAgICAgICAgICAgICAgIHk6IHJzLmFsbHB0c1tsIC0gMyAtIF9pMl1cbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRpID0gZGlzdChwMCwgcDEpO1xuICAgICAgICAgICAgZDAgPSBkO1xuICAgICAgICAgICAgZCArPSBkaTtcbiAgICAgICAgICAgIGlmIChkID49IG9mZnNldCkge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIHBEID0gb2Zmc2V0IC0gZDA7XG4gICAgICAgICAgdmFyIF90ID0gcEQgLyBkaTtcbiAgICAgICAgICBfdCA9IGJvdW5kKDAsIF90LCAxKTtcbiAgICAgICAgICBwID0gbGluZUF0KHAwLCBwMSwgX3QpO1xuICAgICAgICAgIGFuZ2xlID0gbGluZUFuZ2xlKHAwLCBwMSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2V0UnMoJ2xhYmVsWCcsIHByZWZpeCwgcC54KTtcbiAgICBzZXRScygnbGFiZWxZJywgcHJlZml4LCBwLnkpO1xuICAgIHNldFJzKCdsYWJlbEF1dG9BbmdsZScsIHByZWZpeCwgYW5nbGUpO1xuICB9O1xuICBjYWxjdWxhdGVFbmRQcm9qZWN0aW9uKCdzb3VyY2UnKTtcbiAgY2FsY3VsYXRlRW5kUHJvamVjdGlvbigndGFyZ2V0Jyk7XG4gIHRoaXMuYXBwbHlMYWJlbERpbWVuc2lvbnMoZWRnZSk7XG59O1xuQlJwJDkuYXBwbHlMYWJlbERpbWVuc2lvbnMgPSBmdW5jdGlvbiAoZWxlKSB7XG4gIHRoaXMuYXBwbHlQcmVmaXhlZExhYmVsRGltZW5zaW9ucyhlbGUpO1xuICBpZiAoZWxlLmlzRWRnZSgpKSB7XG4gICAgdGhpcy5hcHBseVByZWZpeGVkTGFiZWxEaW1lbnNpb25zKGVsZSwgJ3NvdXJjZScpO1xuICAgIHRoaXMuYXBwbHlQcmVmaXhlZExhYmVsRGltZW5zaW9ucyhlbGUsICd0YXJnZXQnKTtcbiAgfVxufTtcbkJScCQ5LmFwcGx5UHJlZml4ZWRMYWJlbERpbWVuc2lvbnMgPSBmdW5jdGlvbiAoZWxlLCBwcmVmaXgpIHtcbiAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICB2YXIgdGV4dCA9IHRoaXMuZ2V0TGFiZWxUZXh0KGVsZSwgcHJlZml4KTtcbiAgdmFyIGNhY2hlS2V5ID0gaGFzaFN0cmluZyh0ZXh0LCBlbGUuX3ByaXZhdGUubGFiZWxEaW1zS2V5KTtcblxuICAvLyBzYXZlIHJlY2FsYyBpZiB0aGUgbGFiZWwgaXMgdGhlIHNhbWUgYXMgYmVmb3JlXG4gIGlmIChnZXRQcmVmaXhlZFByb3BlcnR5KF9wLnJzY3JhdGNoLCAncHJlZml4ZWRMYWJlbERpbXNLZXknLCBwcmVmaXgpID09PSBjYWNoZUtleSkge1xuICAgIHJldHVybjsgLy8gdGhlbiB0aGUgbGFiZWwgZGltZW5zaW9ucyArIHRleHQgYXJlIHRoZSBzYW1lXG4gIH1cblxuICAvLyBzYXZlIHRoZSBrZXlcbiAgc2V0UHJlZml4ZWRQcm9wZXJ0eShfcC5yc2NyYXRjaCwgJ3ByZWZpeGVkTGFiZWxEaW1zS2V5JywgcHJlZml4LCBjYWNoZUtleSk7XG4gIHZhciBsYWJlbERpbXMgPSB0aGlzLmNhbGN1bGF0ZUxhYmVsRGltZW5zaW9ucyhlbGUsIHRleHQpO1xuICB2YXIgbGluZUhlaWdodCA9IGVsZS5wc3R5bGUoJ2xpbmUtaGVpZ2h0JykucGZWYWx1ZTtcbiAgdmFyIHNpemUgPSBlbGUucHN0eWxlKCdmb250LXNpemUnKS5wZlZhbHVlO1xuICB2YXIgdGV4dFdyYXAgPSBlbGUucHN0eWxlKCd0ZXh0LXdyYXAnKS5zdHJWYWx1ZTtcbiAgdmFyIGxpbmVzID0gZ2V0UHJlZml4ZWRQcm9wZXJ0eShfcC5yc2NyYXRjaCwgJ2xhYmVsV3JhcENhY2hlZExpbmVzJywgcHJlZml4KSB8fCBbXTtcbiAgdmFyIG51bUxpbmVzID0gdGV4dFdyYXAgIT09ICd3cmFwJyA/IDEgOiBNYXRoLm1heChsaW5lcy5sZW5ndGgsIDEpO1xuICB2YXIgbGFiZWxMaW5lSGVpZ2h0ID0gc2l6ZSAqIGxpbmVIZWlnaHQ7XG4gIHZhciB3aWR0aCA9IGxhYmVsRGltcy53aWR0aDtcbiAgdmFyIGhlaWdodCA9IGxhYmVsRGltcy5oZWlnaHQgKyAobnVtTGluZXMgLSAxKSAqIChsaW5lSGVpZ2h0IC0gMSkgKiBzaXplO1xuICBzZXRQcmVmaXhlZFByb3BlcnR5KF9wLnJzdHlsZSwgJ2xhYmVsV2lkdGgnLCBwcmVmaXgsIHdpZHRoKTtcbiAgc2V0UHJlZml4ZWRQcm9wZXJ0eShfcC5yc2NyYXRjaCwgJ2xhYmVsV2lkdGgnLCBwcmVmaXgsIHdpZHRoKTtcbiAgc2V0UHJlZml4ZWRQcm9wZXJ0eShfcC5yc3R5bGUsICdsYWJlbEhlaWdodCcsIHByZWZpeCwgaGVpZ2h0KTtcbiAgc2V0UHJlZml4ZWRQcm9wZXJ0eShfcC5yc2NyYXRjaCwgJ2xhYmVsSGVpZ2h0JywgcHJlZml4LCBoZWlnaHQpO1xuICBzZXRQcmVmaXhlZFByb3BlcnR5KF9wLnJzY3JhdGNoLCAnbGFiZWxMaW5lSGVpZ2h0JywgcHJlZml4LCBsYWJlbExpbmVIZWlnaHQpO1xuICBzZXRQcmVmaXhlZFByb3BlcnR5KF9wLnJzY3JhdGNoLCAnbGFiZWxBY3R1YWxEZXNjZW50JywgcHJlZml4LCBsYWJlbERpbXMubGFiZWxBY3R1YWxEZXNjZW50KTtcbn07XG5CUnAkOS5nZXRMYWJlbFRleHQgPSBmdW5jdGlvbiAoZWxlLCBwcmVmaXgpIHtcbiAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICB2YXIgcGZkID0gcHJlZml4ID8gcHJlZml4ICsgJy0nIDogJyc7XG4gIHZhciB0ZXh0ID0gZWxlLnBzdHlsZShwZmQgKyAnbGFiZWwnKS5zdHJWYWx1ZTtcbiAgdmFyIHRleHRUcmFuc2Zvcm0gPSBlbGUucHN0eWxlKCd0ZXh0LXRyYW5zZm9ybScpLnZhbHVlO1xuICB2YXIgcnNjcmF0Y2ggPSBmdW5jdGlvbiByc2NyYXRjaChwcm9wTmFtZSwgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHNldFByZWZpeGVkUHJvcGVydHkoX3AucnNjcmF0Y2gsIHByb3BOYW1lLCBwcmVmaXgsIHZhbHVlKTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGdldFByZWZpeGVkUHJvcGVydHkoX3AucnNjcmF0Y2gsIHByb3BOYW1lLCBwcmVmaXgpO1xuICAgIH1cbiAgfTtcblxuICAvLyBmb3IgZW1wdHkgdGV4dCwgc2tpcCBhbGwgcHJvY2Vzc2luZ1xuICBpZiAoIXRleHQpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgaWYgKHRleHRUcmFuc2Zvcm0gPT0gJ25vbmUnKSA7IGVsc2UgaWYgKHRleHRUcmFuc2Zvcm0gPT0gJ3VwcGVyY2FzZScpIHtcbiAgICB0ZXh0ID0gdGV4dC50b1VwcGVyQ2FzZSgpO1xuICB9IGVsc2UgaWYgKHRleHRUcmFuc2Zvcm0gPT0gJ2xvd2VyY2FzZScpIHtcbiAgICB0ZXh0ID0gdGV4dC50b0xvd2VyQ2FzZSgpO1xuICB9XG4gIHZhciB3cmFwU3R5bGUgPSBlbGUucHN0eWxlKCd0ZXh0LXdyYXAnKS52YWx1ZTtcbiAgaWYgKHdyYXBTdHlsZSA9PT0gJ3dyYXAnKSB7XG4gICAgdmFyIGxhYmVsS2V5ID0gcnNjcmF0Y2goJ2xhYmVsS2V5Jyk7XG5cbiAgICAvLyBzYXZlIHJlY2FsYyBpZiB0aGUgbGFiZWwgaXMgdGhlIHNhbWUgYXMgYmVmb3JlXG4gICAgaWYgKGxhYmVsS2V5ICE9IG51bGwgJiYgcnNjcmF0Y2goJ2xhYmVsV3JhcEtleScpID09PSBsYWJlbEtleSkge1xuICAgICAgcmV0dXJuIHJzY3JhdGNoKCdsYWJlbFdyYXBDYWNoZWRUZXh0Jyk7XG4gICAgfVxuICAgIHZhciB6d3NwID0gXCJcXHUyMDBCXCI7XG4gICAgdmFyIGxpbmVzID0gdGV4dC5zcGxpdCgnXFxuJyk7XG4gICAgdmFyIG1heFcgPSBlbGUucHN0eWxlKCd0ZXh0LW1heC13aWR0aCcpLnBmVmFsdWU7XG4gICAgdmFyIG92ZXJmbG93ID0gZWxlLnBzdHlsZSgndGV4dC1vdmVyZmxvdy13cmFwJykudmFsdWU7XG4gICAgdmFyIG92ZXJmbG93QW55ID0gb3ZlcmZsb3cgPT09ICdhbnl3aGVyZSc7XG4gICAgdmFyIHdyYXBwZWRMaW5lcyA9IFtdO1xuICAgIHZhciBzZXBhcmF0b3JSZWdleCA9IC9bXFxzXFx1MjAwYl0rfCQvZzsgLy8gSW5jbHVkZSBlbmQgb2Ygc3RyaW5nIHRvIGFkZCBsYXN0IHdvcmRcblxuICAgIGZvciAodmFyIGwgPSAwOyBsIDwgbGluZXMubGVuZ3RoOyBsKyspIHtcbiAgICAgIHZhciBsaW5lID0gbGluZXNbbF07XG4gICAgICB2YXIgbGluZURpbXMgPSB0aGlzLmNhbGN1bGF0ZUxhYmVsRGltZW5zaW9ucyhlbGUsIGxpbmUpO1xuICAgICAgdmFyIGxpbmVXID0gbGluZURpbXMud2lkdGg7XG4gICAgICBpZiAob3ZlcmZsb3dBbnkpIHtcbiAgICAgICAgdmFyIHByb2Nlc3NlZExpbmUgPSBsaW5lLnNwbGl0KCcnKS5qb2luKHp3c3ApO1xuICAgICAgICBsaW5lID0gcHJvY2Vzc2VkTGluZTtcbiAgICAgIH1cbiAgICAgIGlmIChsaW5lVyA+IG1heFcpIHtcbiAgICAgICAgLy8gbGluZSBpcyB0b28gbG9uZ1xuICAgICAgICB2YXIgc2VwYXJhdG9yTWF0Y2hlcyA9IGxpbmUubWF0Y2hBbGwoc2VwYXJhdG9yUmVnZXgpO1xuICAgICAgICB2YXIgc3VibGluZSA9ICcnO1xuICAgICAgICB2YXIgcHJldmlvdXNJbmRleCA9IDA7XG4gICAgICAgIC8vIEFkZCBmYWtlIG1hdGNoXG4gICAgICAgIHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihzZXBhcmF0b3JNYXRjaGVzKSxcbiAgICAgICAgICBfc3RlcDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmb3IgKF9pdGVyYXRvci5zKCk7ICEoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lOykge1xuICAgICAgICAgICAgdmFyIHNlcGFyYXRvck1hdGNoID0gX3N0ZXAudmFsdWU7XG4gICAgICAgICAgICB2YXIgd29yZFNlcGFyYXRvciA9IHNlcGFyYXRvck1hdGNoWzBdO1xuICAgICAgICAgICAgdmFyIHdvcmQgPSBsaW5lLnN1YnN0cmluZyhwcmV2aW91c0luZGV4LCBzZXBhcmF0b3JNYXRjaC5pbmRleCk7XG4gICAgICAgICAgICBwcmV2aW91c0luZGV4ID0gc2VwYXJhdG9yTWF0Y2guaW5kZXggKyB3b3JkU2VwYXJhdG9yLmxlbmd0aDtcbiAgICAgICAgICAgIHZhciB0ZXN0TGluZSA9IHN1YmxpbmUubGVuZ3RoID09PSAwID8gd29yZCA6IHN1YmxpbmUgKyB3b3JkICsgd29yZFNlcGFyYXRvcjtcbiAgICAgICAgICAgIHZhciB0ZXN0RGltcyA9IHRoaXMuY2FsY3VsYXRlTGFiZWxEaW1lbnNpb25zKGVsZSwgdGVzdExpbmUpO1xuICAgICAgICAgICAgdmFyIHRlc3RXID0gdGVzdERpbXMud2lkdGg7XG4gICAgICAgICAgICBpZiAodGVzdFcgPD0gbWF4Vykge1xuICAgICAgICAgICAgICAvLyB3b3JkIGZpdHMgb24gY3VycmVudCBsaW5lXG4gICAgICAgICAgICAgIHN1YmxpbmUgKz0gd29yZCArIHdvcmRTZXBhcmF0b3I7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyB3b3JkIHN0YXJ0cyBuZXcgbGluZVxuICAgICAgICAgICAgICBpZiAoc3VibGluZSkge1xuICAgICAgICAgICAgICAgIHdyYXBwZWRMaW5lcy5wdXNoKHN1YmxpbmUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHN1YmxpbmUgPSB3b3JkICsgd29yZFNlcGFyYXRvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBpZiB0aGVyZSdzIHJlbWFpbmluZyB0ZXh0LCBwdXQgaXQgaW4gYSB3cmFwcGVkIGxpbmVcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgX2l0ZXJhdG9yLmUoZXJyKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBfaXRlcmF0b3IuZigpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc3VibGluZS5tYXRjaCgvXltcXHNcXHUyMDBiXSskLykpIHtcbiAgICAgICAgICB3cmFwcGVkTGluZXMucHVzaChzdWJsaW5lKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gbGluZSBpcyBhbHJlYWR5IHNob3J0IGVub3VnaFxuICAgICAgICB3cmFwcGVkTGluZXMucHVzaChsaW5lKTtcbiAgICAgIH1cbiAgICB9IC8vIGZvclxuXG4gICAgcnNjcmF0Y2goJ2xhYmVsV3JhcENhY2hlZExpbmVzJywgd3JhcHBlZExpbmVzKTtcbiAgICB0ZXh0ID0gcnNjcmF0Y2goJ2xhYmVsV3JhcENhY2hlZFRleHQnLCB3cmFwcGVkTGluZXMuam9pbignXFxuJykpO1xuICAgIHJzY3JhdGNoKCdsYWJlbFdyYXBLZXknLCBsYWJlbEtleSk7XG4gIH0gZWxzZSBpZiAod3JhcFN0eWxlID09PSAnZWxsaXBzaXMnKSB7XG4gICAgdmFyIF9tYXhXID0gZWxlLnBzdHlsZSgndGV4dC1tYXgtd2lkdGgnKS5wZlZhbHVlO1xuICAgIHZhciBlbGxpcHNpemVkID0gJyc7XG4gICAgdmFyIGVsbGlwc2lzID0gXCJcXHUyMDI2XCI7XG4gICAgdmFyIGluY0xhc3RDaCA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmNhbGN1bGF0ZUxhYmVsRGltZW5zaW9ucyhlbGUsIHRleHQpLndpZHRoIDwgX21heFcpIHtcbiAgICAgIC8vIHRoZSBsYWJlbCBhbHJlYWR5IGZpdHNcbiAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRleHQubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB3aWR0aFdpdGhOZXh0Q2ggPSB0aGlzLmNhbGN1bGF0ZUxhYmVsRGltZW5zaW9ucyhlbGUsIGVsbGlwc2l6ZWQgKyB0ZXh0W2ldICsgZWxsaXBzaXMpLndpZHRoO1xuICAgICAgaWYgKHdpZHRoV2l0aE5leHRDaCA+IF9tYXhXKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZWxsaXBzaXplZCArPSB0ZXh0W2ldO1xuICAgICAgaWYgKGkgPT09IHRleHQubGVuZ3RoIC0gMSkge1xuICAgICAgICBpbmNMYXN0Q2ggPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWluY0xhc3RDaCkge1xuICAgICAgZWxsaXBzaXplZCArPSBlbGxpcHNpcztcbiAgICB9XG4gICAgcmV0dXJuIGVsbGlwc2l6ZWQ7XG4gIH0gLy8gaWYgZWxsaXBzaXplXG5cbiAgcmV0dXJuIHRleHQ7XG59O1xuQlJwJDkuZ2V0TGFiZWxKdXN0aWZpY2F0aW9uID0gZnVuY3Rpb24gKGVsZSkge1xuICB2YXIganVzdGlmaWNhdGlvbiA9IGVsZS5wc3R5bGUoJ3RleHQtanVzdGlmaWNhdGlvbicpLnN0clZhbHVlO1xuICB2YXIgdGV4dEhhbGlnbiA9IGVsZS5wc3R5bGUoJ3RleHQtaGFsaWduJykuc3RyVmFsdWU7XG4gIGlmIChqdXN0aWZpY2F0aW9uID09PSAnYXV0bycpIHtcbiAgICBpZiAoZWxlLmlzTm9kZSgpKSB7XG4gICAgICByZXR1cm4gbGFiZWxKdXN0aWZpY2F0aW9uKHRleHRIYWxpZ24pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJ2NlbnRlcic7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBqdXN0aWZpY2F0aW9uO1xuICB9XG59O1xuQlJwJDkuY2FsY3VsYXRlTGFiZWxEaW1lbnNpb25zID0gZnVuY3Rpb24gKGVsZSwgdGV4dCkge1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBjb250YWluZXJXaW5kb3cgPSByLmN5LndpbmRvdygpO1xuICB2YXIgZG9jdW1lbnQgPSBjb250YWluZXJXaW5kb3cuZG9jdW1lbnQ7XG4gIHZhciBwYWRkaW5nID0gMDsgLy8gYWRkIHBhZGRpbmcgYXJvdW5kIHRleHQgZGltcywgYXMgdGhlIG1lYXN1cmVtZW50IGlzbid0IHRoYXQgYWNjdXJhdGVcbiAgdmFyIGZTdHlsZSA9IGVsZS5wc3R5bGUoJ2ZvbnQtc3R5bGUnKS5zdHJWYWx1ZTtcbiAgdmFyIHNpemUgPSBlbGUucHN0eWxlKCdmb250LXNpemUnKS5wZlZhbHVlO1xuICB2YXIgZmFtaWx5ID0gZWxlLnBzdHlsZSgnZm9udC1mYW1pbHknKS5zdHJWYWx1ZTtcbiAgdmFyIHdlaWdodCA9IGVsZS5wc3R5bGUoJ2ZvbnQtd2VpZ2h0Jykuc3RyVmFsdWU7XG4gIHZhciB0ZXh0TWV0cmljcyA9IGVsZS5wc3R5bGUoJ3RleHQtbWV0cmljcycpLnN0clZhbHVlIHx8ICdmb250JztcbiAgdmFyIGNhbnZhcyA9IHRoaXMubGFiZWxDYWxjQ2FudmFzO1xuICB2YXIgYzJkID0gdGhpcy5sYWJlbENhbGNDYW52YXNDb250ZXh0O1xuICBpZiAoIWNhbnZhcykge1xuICAgIGNhbnZhcyA9IHRoaXMubGFiZWxDYWxjQ2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgYzJkID0gdGhpcy5sYWJlbENhbGNDYW52YXNDb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgdmFyIGRzID0gY2FudmFzLnN0eWxlO1xuICAgIGRzLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICBkcy5sZWZ0ID0gJy05OTk5cHgnO1xuICAgIGRzLnRvcCA9ICctOTk5OXB4JztcbiAgICBkcy56SW5kZXggPSAnLTEnO1xuICAgIGRzLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICBkcy5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuICB9XG4gIGMyZC5mb250ID0gXCJcIi5jb25jYXQoZlN0eWxlLCBcIiBcIikuY29uY2F0KHdlaWdodCwgXCIgXCIpLmNvbmNhdChzaXplLCBcInB4IFwiKS5jb25jYXQoZmFtaWx5KTtcbiAgdmFyIHdpZHRoID0gMDtcbiAgdmFyIGhlaWdodCA9IDA7XG4gIHZhciBsaW5lcyA9IHRleHQuc3BsaXQoJ1xcbicpO1xuICB2YXIgbGluZUNvdW50ID0gbGluZXMubGVuZ3RoO1xuICB2YXIgbGFiZWxBY3R1YWxEZXNjZW50ID0gMDtcbiAgdmFyIGxhYmVsQWN0dWFsQXNjZW50ID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lQ291bnQ7IGkrKykge1xuICAgIHZhciBsaW5lID0gbGluZXNbaV07XG4gICAgdmFyIG1ldHJpY3MgPSBjMmQubWVhc3VyZVRleHQobGluZSk7XG4gICAgdmFyIHcgPSBNYXRoLmNlaWwobWV0cmljcy53aWR0aCk7XG4gICAgdmFyIGggPSBzaXplO1xuICAgIGlmICh0ZXh0TWV0cmljcyA9PT0gJ2dseXBoJykge1xuICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgbGFiZWxBY3R1YWxBc2NlbnQgPSBtZXRyaWNzLmFjdHVhbEJvdW5kaW5nQm94QXNjZW50O1xuICAgICAgfVxuICAgICAgaWYgKGkgPT09IGxpbmVDb3VudCAtIDEpIHtcbiAgICAgICAgbGFiZWxBY3R1YWxEZXNjZW50ID0gbWV0cmljcy5hY3R1YWxCb3VuZGluZ0JveERlc2NlbnQ7XG4gICAgICB9XG4gICAgfVxuICAgIHdpZHRoID0gTWF0aC5tYXgodywgd2lkdGgpO1xuICAgIGhlaWdodCArPSBoO1xuICB9XG4gIGlmICh0ZXh0TWV0cmljcyA9PT0gJ2dseXBoJykge1xuICAgIGhlaWdodCAtPSBzaXplIC0gbGFiZWxBY3R1YWxBc2NlbnQgLSBsYWJlbEFjdHVhbERlc2NlbnQ7XG4gIH1cbiAgd2lkdGggKz0gcGFkZGluZztcbiAgaGVpZ2h0ICs9IHBhZGRpbmc7XG4gIHJldHVybiB7XG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0LFxuICAgIGxhYmVsQWN0dWFsQXNjZW50OiBsYWJlbEFjdHVhbEFzY2VudCxcbiAgICBsYWJlbEFjdHVhbERlc2NlbnQ6IGxhYmVsQWN0dWFsRGVzY2VudFxuICB9O1xufTtcbkJScCQ5LmNhbGN1bGF0ZUxhYmVsQW5nbGUgPSBmdW5jdGlvbiAoZWxlLCBwcmVmaXgpIHtcbiAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICB2YXIgcnMgPSBfcC5yc2NyYXRjaDtcbiAgdmFyIGlzRWRnZSA9IGVsZS5pc0VkZ2UoKTtcbiAgdmFyIHByZWZpeERhc2ggPSBwcmVmaXggPyBwcmVmaXggKyAnLScgOiAnJztcbiAgdmFyIHJvdCA9IGVsZS5wc3R5bGUocHJlZml4RGFzaCArICd0ZXh0LXJvdGF0aW9uJyk7XG4gIHZhciByb3RTdHIgPSByb3Quc3RyVmFsdWU7XG4gIGlmIChyb3RTdHIgPT09ICdub25lJykge1xuICAgIHJldHVybiAwO1xuICB9IGVsc2UgaWYgKGlzRWRnZSAmJiByb3RTdHIgPT09ICdhdXRvcm90YXRlJykge1xuICAgIHJldHVybiBycy5sYWJlbEF1dG9BbmdsZTtcbiAgfSBlbHNlIGlmIChyb3RTdHIgPT09ICdhdXRvcm90YXRlJykge1xuICAgIHJldHVybiAwO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiByb3QucGZWYWx1ZTtcbiAgfVxufTtcbkJScCQ5LmNhbGN1bGF0ZUxhYmVsQW5nbGVzID0gZnVuY3Rpb24gKGVsZSkge1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBpc0VkZ2UgPSBlbGUuaXNFZGdlKCk7XG4gIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgdmFyIHJzID0gX3AucnNjcmF0Y2g7XG4gIHJzLmxhYmVsQW5nbGUgPSByLmNhbGN1bGF0ZUxhYmVsQW5nbGUoZWxlKTtcbiAgaWYgKGlzRWRnZSkge1xuICAgIHJzLnNvdXJjZUxhYmVsQW5nbGUgPSByLmNhbGN1bGF0ZUxhYmVsQW5nbGUoZWxlLCAnc291cmNlJyk7XG4gICAgcnMudGFyZ2V0TGFiZWxBbmdsZSA9IHIuY2FsY3VsYXRlTGFiZWxBbmdsZShlbGUsICd0YXJnZXQnKTtcbiAgfVxufTtcblxudmFyIEJScCQ4ID0ge307XG52YXIgVE9PX1NNQUxMX0NVVF9SRUNUID0gMjg7XG52YXIgd2FybmVkQ3V0UmVjdCA9IGZhbHNlO1xuQlJwJDguZ2V0Tm9kZVNoYXBlID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgc2hhcGUgPSBub2RlLnBzdHlsZSgnc2hhcGUnKS52YWx1ZTtcbiAgaWYgKHNoYXBlID09PSAnY3V0cmVjdGFuZ2xlJyAmJiAobm9kZS53aWR0aCgpIDwgVE9PX1NNQUxMX0NVVF9SRUNUIHx8IG5vZGUuaGVpZ2h0KCkgPCBUT09fU01BTExfQ1VUX1JFQ1QpKSB7XG4gICAgaWYgKCF3YXJuZWRDdXRSZWN0KSB7XG4gICAgICB3YXJuKCdUaGUgYGN1dHJlY3RhbmdsZWAgbm9kZSBzaGFwZSBjYW4gbm90IGJlIHVzZWQgYXQgc21hbGwgc2l6ZXMgc28gYHJlY3RhbmdsZWAgaXMgdXNlZCBpbnN0ZWFkJyk7XG4gICAgICB3YXJuZWRDdXRSZWN0ID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuICdyZWN0YW5nbGUnO1xuICB9XG4gIGlmIChub2RlLmlzUGFyZW50KCkpIHtcbiAgICBpZiAoc2hhcGUgPT09ICdyZWN0YW5nbGUnIHx8IHNoYXBlID09PSAncm91bmRyZWN0YW5nbGUnIHx8IHNoYXBlID09PSAncm91bmQtcmVjdGFuZ2xlJyB8fCBzaGFwZSA9PT0gJ2N1dHJlY3RhbmdsZScgfHwgc2hhcGUgPT09ICdjdXQtcmVjdGFuZ2xlJyB8fCBzaGFwZSA9PT0gJ2JhcnJlbCcpIHtcbiAgICAgIHJldHVybiBzaGFwZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICdyZWN0YW5nbGUnO1xuICAgIH1cbiAgfVxuICBpZiAoc2hhcGUgPT09ICdwb2x5Z29uJykge1xuICAgIHZhciBwb2ludHMgPSBub2RlLnBzdHlsZSgnc2hhcGUtcG9seWdvbi1wb2ludHMnKS52YWx1ZTtcbiAgICByZXR1cm4gci5ub2RlU2hhcGVzLm1ha2VQb2x5Z29uKHBvaW50cykubmFtZTtcbiAgfVxuICByZXR1cm4gc2hhcGU7XG59O1xuXG52YXIgQlJwJDcgPSB7fTtcbkJScCQ3LnJlZ2lzdGVyQ2FsY3VsYXRpb25MaXN0ZW5lcnMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBjeSA9IHRoaXMuY3k7XG4gIHZhciBlbGVzVG9VcGRhdGUgPSBjeS5jb2xsZWN0aW9uKCk7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIGVucXVldWUgPSBmdW5jdGlvbiBlbnF1ZXVlKGVsZXMpIHtcbiAgICB2YXIgZGlydHlTdHlsZUNhY2hlcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdHJ1ZTtcbiAgICBlbGVzVG9VcGRhdGUubWVyZ2UoZWxlcyk7XG4gICAgaWYgKGRpcnR5U3R5bGVDYWNoZXMpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICAgICAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICAgICAgICB2YXIgcnN0eWxlID0gX3AucnN0eWxlO1xuICAgICAgICByc3R5bGUuY2xlYW4gPSBmYWxzZTtcbiAgICAgICAgcnN0eWxlLmNsZWFuQ29ubmVjdGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICByLmJpbmRlcihjeSkub24oJ2JvdW5kcy4qIGRpcnR5LionLCBmdW5jdGlvbiBvbkRpcnR5Qm91bmRzKGUpIHtcbiAgICB2YXIgZWxlID0gZS50YXJnZXQ7XG4gICAgZW5xdWV1ZShlbGUpO1xuICB9KS5vbignc3R5bGUuKiBiYWNrZ3JvdW5kLionLCBmdW5jdGlvbiBvbkRpcnR5U3R5bGUoZSkge1xuICAgIHZhciBlbGUgPSBlLnRhcmdldDtcbiAgICBlbnF1ZXVlKGVsZSwgZmFsc2UpO1xuICB9KTtcbiAgdmFyIHVwZGF0ZUVsZUNhbGNzID0gZnVuY3Rpb24gdXBkYXRlRWxlQ2FsY3Mod2lsbERyYXcpIHtcbiAgICBpZiAod2lsbERyYXcpIHtcbiAgICAgIHZhciBmbnMgPSByLm9uVXBkYXRlRWxlQ2FsY3NGbnM7XG5cbiAgICAgIC8vIGJlY2F1c2Ugd2UgbmVlZCB0byBoYXZlIHVwLXRvLWRhdGUgc3R5bGUgKGUuZy4gc3R5bGVzaGVldCBtYXBwZXJzKVxuICAgICAgLy8gYmVmb3JlIGNhbGN1bGF0aW5nIHJlbmRlcmVkIHN0eWxlIChhbmQgcHN0eWxlIG1pZ2h0IG5vdCBiZSBjYWxsZWQgeWV0KVxuICAgICAgZWxlc1RvVXBkYXRlLmNsZWFuU3R5bGUoKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlc1RvVXBkYXRlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBlbGUgPSBlbGVzVG9VcGRhdGVbaV07XG4gICAgICAgIHZhciByc3R5bGUgPSBlbGUuX3ByaXZhdGUucnN0eWxlO1xuICAgICAgICBpZiAoZWxlLmlzTm9kZSgpICYmICFyc3R5bGUuY2xlYW5Db25uZWN0ZWQpIHtcbiAgICAgICAgICBlbnF1ZXVlKGVsZS5jb25uZWN0ZWRFZGdlcygpKTtcbiAgICAgICAgICByc3R5bGUuY2xlYW5Db25uZWN0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZm5zKSB7XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBmbnMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgdmFyIGZuID0gZm5zW19pXTtcbiAgICAgICAgICBmbih3aWxsRHJhdywgZWxlc1RvVXBkYXRlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgci5yZWNhbGN1bGF0ZVJlbmRlcmVkU3R5bGUoZWxlc1RvVXBkYXRlKTtcbiAgICAgIGVsZXNUb1VwZGF0ZSA9IGN5LmNvbGxlY3Rpb24oKTtcbiAgICB9XG4gIH07XG4gIHIuZmx1c2hSZW5kZXJlZFN0eWxlUXVldWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgdXBkYXRlRWxlQ2FsY3ModHJ1ZSk7XG4gIH07XG4gIHIuYmVmb3JlUmVuZGVyKHVwZGF0ZUVsZUNhbGNzLCByLmJlZm9yZVJlbmRlclByaW9yaXRpZXMuZWxlQ2FsY3MpO1xufTtcbkJScCQ3Lm9uVXBkYXRlRWxlQ2FsY3MgPSBmdW5jdGlvbiAoZm4pIHtcbiAgdmFyIGZucyA9IHRoaXMub25VcGRhdGVFbGVDYWxjc0ZucyA9IHRoaXMub25VcGRhdGVFbGVDYWxjc0ZucyB8fCBbXTtcbiAgZm5zLnB1c2goZm4pO1xufTtcbkJScCQ3LnJlY2FsY3VsYXRlUmVuZGVyZWRTdHlsZSA9IGZ1bmN0aW9uIChlbGVzLCB1c2VDYWNoZSkge1xuICB2YXIgaXNDbGVhbkNvbm5lY3RlZCA9IGZ1bmN0aW9uIGlzQ2xlYW5Db25uZWN0ZWQoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5fcHJpdmF0ZS5yc3R5bGUuY2xlYW5Db25uZWN0ZWQ7XG4gIH07XG4gIGlmIChlbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgZWRnZXMgPSBbXTtcbiAgdmFyIG5vZGVzID0gW107XG5cbiAgLy8gdGhlIHJlbmRlcmVyIGNhbid0IGJlIHVzZWQgZm9yIGNhbGNzIHdoZW4gZGVzdHJveWVkLCBlLmcuIGVsZS5ib3VuZGluZ0JveCgpXG4gIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIHVzZSBjYWNoZSBieSBkZWZhdWx0IGZvciBwZXJmXG4gIGlmICh1c2VDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdXNlQ2FjaGUgPSB0cnVlO1xuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgICB2YXIgcnN0eWxlID0gX3AucnN0eWxlO1xuXG4gICAgLy8gYW4gZWRnZSBtYXkgYmUgaW1wbGljaXRseSBkaXJ0eSBiL2Mgb2Ygb25lIG9mIGl0cyBjb25uZWN0ZWQgbm9kZXNcbiAgICAvLyAoYW5kIGEgcmVxdWVzdCBmb3IgcmVjYWxjIG1heSBjb21lIGluIGJldHdlZW4gZnJhbWVzKVxuICAgIGlmIChlbGUuaXNFZGdlKCkgJiYgKCFpc0NsZWFuQ29ubmVjdGVkKGVsZS5zb3VyY2UoKSkgfHwgIWlzQ2xlYW5Db25uZWN0ZWQoZWxlLnRhcmdldCgpKSkpIHtcbiAgICAgIHJzdHlsZS5jbGVhbiA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoZWxlLmlzRWRnZSgpICYmIGVsZS5pc0J1bmRsZWRCZXppZXIoKSkge1xuICAgICAgaWYgKGVsZS5wYXJhbGxlbEVkZ2VzKCkuc29tZShmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgIHJldHVybiAhZWxlLl9wcml2YXRlLnJzdHlsZS5jbGVhbiAmJiBlbGUuaXNCdW5kbGVkQmV6aWVyKCk7XG4gICAgICB9KSkge1xuICAgICAgICByc3R5bGUuY2xlYW4gPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBvbmx5IHVwZGF0ZSBpZiBkaXJ0eSBhbmQgaW4gZ3JhcGhcbiAgICBpZiAodXNlQ2FjaGUgJiYgcnN0eWxlLmNsZWFuIHx8IGVsZS5yZW1vdmVkKCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIG9ubHkgdXBkYXRlIGlmIG5vdCBkaXNwbGF5OiBub25lXG4gICAgaWYgKGVsZS5wc3R5bGUoJ2Rpc3BsYXknKS52YWx1ZSA9PT0gJ25vbmUnKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKF9wLmdyb3VwID09PSAnbm9kZXMnKSB7XG4gICAgICBub2Rlcy5wdXNoKGVsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGVkZ2VzXG4gICAgICBlZGdlcy5wdXNoKGVsZSk7XG4gICAgfVxuICAgIHJzdHlsZS5jbGVhbiA9IHRydWU7XG4gIH1cblxuICAvLyB1cGRhdGUgbm9kZSBkYXRhIGZyb20gcHJvamVjdGlvbnNcbiAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgbm9kZXMubGVuZ3RoOyBfaTIrKykge1xuICAgIHZhciBfZWxlID0gbm9kZXNbX2kyXTtcbiAgICB2YXIgX3AyID0gX2VsZS5fcHJpdmF0ZTtcbiAgICB2YXIgX3JzdHlsZSA9IF9wMi5yc3R5bGU7XG4gICAgdmFyIHBvcyA9IF9lbGUucG9zaXRpb24oKTtcbiAgICB0aGlzLnJlY2FsY3VsYXRlTm9kZUxhYmVsUHJvamVjdGlvbihfZWxlKTtcbiAgICBfcnN0eWxlLm5vZGVYID0gcG9zLng7XG4gICAgX3JzdHlsZS5ub2RlWSA9IHBvcy55O1xuICAgIF9yc3R5bGUubm9kZVcgPSBfZWxlLnBzdHlsZSgnd2lkdGgnKS5wZlZhbHVlO1xuICAgIF9yc3R5bGUubm9kZUggPSBfZWxlLnBzdHlsZSgnaGVpZ2h0JykucGZWYWx1ZTtcbiAgfVxuICB0aGlzLnJlY2FsY3VsYXRlRWRnZVByb2plY3Rpb25zKGVkZ2VzKTtcblxuICAvLyB1cGRhdGUgZWRnZSBkYXRhIGZyb20gcHJvamVjdGlvbnNcbiAgZm9yICh2YXIgX2kzID0gMDsgX2kzIDwgZWRnZXMubGVuZ3RoOyBfaTMrKykge1xuICAgIHZhciBfZWxlMiA9IGVkZ2VzW19pM107XG4gICAgdmFyIF9wMyA9IF9lbGUyLl9wcml2YXRlO1xuICAgIHZhciBfcnN0eWxlMiA9IF9wMy5yc3R5bGU7XG4gICAgdmFyIHJzID0gX3AzLnJzY3JhdGNoO1xuXG4gICAgLy8gdXBkYXRlIHJzdHlsZSBwb3NpdGlvbnNcbiAgICBfcnN0eWxlMi5zcmNYID0gcnMuYXJyb3dTdGFydFg7XG4gICAgX3JzdHlsZTIuc3JjWSA9IHJzLmFycm93U3RhcnRZO1xuICAgIF9yc3R5bGUyLnRndFggPSBycy5hcnJvd0VuZFg7XG4gICAgX3JzdHlsZTIudGd0WSA9IHJzLmFycm93RW5kWTtcbiAgICBfcnN0eWxlMi5taWRYID0gcnMubWlkWDtcbiAgICBfcnN0eWxlMi5taWRZID0gcnMubWlkWTtcbiAgICBfcnN0eWxlMi5sYWJlbEFuZ2xlID0gcnMubGFiZWxBbmdsZTtcbiAgICBfcnN0eWxlMi5zb3VyY2VMYWJlbEFuZ2xlID0gcnMuc291cmNlTGFiZWxBbmdsZTtcbiAgICBfcnN0eWxlMi50YXJnZXRMYWJlbEFuZ2xlID0gcnMudGFyZ2V0TGFiZWxBbmdsZTtcbiAgfVxufTtcblxudmFyIEJScCQ2ID0ge307XG5CUnAkNi51cGRhdGVDYWNoZWRHcmFiYmVkRWxlcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGVsZXMgPSB0aGlzLmNhY2hlZFpTb3J0ZWRFbGVzO1xuICBpZiAoIWVsZXMpIHtcbiAgICAvLyBqdXN0IGxldCB0aGlzIGJlIHJlY2FsY3VsYXRlZCBvbiB0aGUgbmV4dCB6IHNvcnQgdGlja1xuICAgIHJldHVybjtcbiAgfVxuICBlbGVzLmRyYWcgPSBbXTtcbiAgZWxlcy5ub25kcmFnID0gW107XG4gIHZhciBncmFiVGFyZ2V0cyA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICB2YXIgcnMgPSBlbGUuX3ByaXZhdGUucnNjcmF0Y2g7XG4gICAgaWYgKGVsZS5ncmFiYmVkKCkgJiYgIWVsZS5pc1BhcmVudCgpKSB7XG4gICAgICBncmFiVGFyZ2V0cy5wdXNoKGVsZSk7XG4gICAgfSBlbHNlIGlmIChycy5pbkRyYWdMYXllcikge1xuICAgICAgZWxlcy5kcmFnLnB1c2goZWxlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlcy5ub25kcmFnLnB1c2goZWxlKTtcbiAgICB9XG4gIH1cblxuICAvLyBwdXQgdGhlIGdyYWIgdGFyZ2V0IG5vZGVzIGxhc3Qgc28gaXQncyBvbiB0b3Agb2YgaXRzIG5laWdoYm91cmhvb2RcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBncmFiVGFyZ2V0cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbGUgPSBncmFiVGFyZ2V0c1tpXTtcbiAgICBlbGVzLmRyYWcucHVzaChlbGUpO1xuICB9XG59O1xuQlJwJDYuaW52YWxpZGF0ZUNhY2hlZFpTb3J0ZWRFbGVzID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmNhY2hlZFpTb3J0ZWRFbGVzID0gbnVsbDtcbn07XG5CUnAkNi5nZXRDYWNoZWRaU29ydGVkRWxlcyA9IGZ1bmN0aW9uIChmb3JjZVJlY2FsYykge1xuICBpZiAoZm9yY2VSZWNhbGMgfHwgIXRoaXMuY2FjaGVkWlNvcnRlZEVsZXMpIHtcbiAgICB2YXIgZWxlcyA9IHRoaXMuY3kubXV0YWJsZUVsZW1lbnRzKCkudG9BcnJheSgpO1xuICAgIGVsZXMuc29ydCh6SW5kZXhTb3J0KTtcbiAgICBlbGVzLmludGVyYWN0aXZlID0gZWxlcy5maWx0ZXIoZnVuY3Rpb24gKGVsZSkge1xuICAgICAgcmV0dXJuIGVsZS5pbnRlcmFjdGl2ZSgpO1xuICAgIH0pO1xuICAgIHRoaXMuY2FjaGVkWlNvcnRlZEVsZXMgPSBlbGVzO1xuICAgIHRoaXMudXBkYXRlQ2FjaGVkR3JhYmJlZEVsZXMoKTtcbiAgfSBlbHNlIHtcbiAgICBlbGVzID0gdGhpcy5jYWNoZWRaU29ydGVkRWxlcztcbiAgfVxuICByZXR1cm4gZWxlcztcbn07XG5cbnZhciBCUnAkNSA9IHt9O1xuW0JScCRlLCBCUnAkZCwgQlJwJGMsIEJScCRiLCBCUnAkYSwgQlJwJDksIEJScCQ4LCBCUnAkNywgQlJwJDZdLmZvckVhY2goZnVuY3Rpb24gKHByb3BzKSB7XG4gIGV4dGVuZChCUnAkNSwgcHJvcHMpO1xufSk7XG5cbnZhciBCUnAkNCA9IHt9O1xuQlJwJDQuZ2V0Q2FjaGVkSW1hZ2UgPSBmdW5jdGlvbiAodXJsLCBjcm9zc09yaWdpbiwgb25Mb2FkKSB7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIGltYWdlQ2FjaGUgPSByLmltYWdlQ2FjaGUgPSByLmltYWdlQ2FjaGUgfHwge307XG4gIHZhciBjYWNoZSA9IGltYWdlQ2FjaGVbdXJsXTtcbiAgaWYgKGNhY2hlKSB7XG4gICAgaWYgKCFjYWNoZS5pbWFnZS5jb21wbGV0ZSkge1xuICAgICAgY2FjaGUuaW1hZ2UuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIG9uTG9hZCk7XG4gICAgfVxuICAgIHJldHVybiBjYWNoZS5pbWFnZTtcbiAgfSBlbHNlIHtcbiAgICBjYWNoZSA9IGltYWdlQ2FjaGVbdXJsXSA9IGltYWdlQ2FjaGVbdXJsXSB8fCB7fTtcbiAgICB2YXIgaW1hZ2UgPSBjYWNoZS5pbWFnZSA9IG5ldyBJbWFnZSgpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG5cbiAgICBpbWFnZS5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgb25Mb2FkKTtcbiAgICBpbWFnZS5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGltYWdlLmVycm9yID0gdHJ1ZTtcbiAgICB9KTtcblxuICAgIC8vICMxNTgyIHNhZmFyaSBkb2Vzbid0IGxvYWQgZGF0YSB1cmlzIHdpdGggY3Jvc3NPcmlnaW4gcHJvcGVybHlcbiAgICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTIzOTc4XG4gICAgdmFyIGRhdGFVcmlQcmVmaXggPSAnZGF0YTonO1xuICAgIHZhciBpc0RhdGFVcmkgPSB1cmwuc3Vic3RyaW5nKDAsIGRhdGFVcmlQcmVmaXgubGVuZ3RoKS50b0xvd2VyQ2FzZSgpID09PSBkYXRhVXJpUHJlZml4O1xuICAgIGlmICghaXNEYXRhVXJpKSB7XG4gICAgICAvLyBpZiBjcm9zc29yaWdpbiBpcyAnbnVsbCcoc3RyaW5naWZpZWQpLCB0aGVuIG1hbnVhbGx5IHNldCBpdCB0byBudWxsIFxuICAgICAgY3Jvc3NPcmlnaW4gPSBjcm9zc09yaWdpbiA9PT0gJ251bGwnID8gbnVsbCA6IGNyb3NzT3JpZ2luO1xuICAgICAgaW1hZ2UuY3Jvc3NPcmlnaW4gPSBjcm9zc09yaWdpbjsgLy8gcHJldmVudCB0YWludGVkIGNhbnZhc1xuICAgIH1cbiAgICBpbWFnZS5zcmMgPSB1cmw7XG4gICAgcmV0dXJuIGltYWdlO1xuICB9XG59O1xuXG52YXIgc2V0R3JhYlN0YXRlID0gZnVuY3Rpb24gc2V0R3JhYlN0YXRlKGVsZSwgZ3JhYmJlZCkge1xuICB2YXIgZWxlMCA9IGVsZVswXTtcbiAgaWYgKCFlbGUwIHx8IGVsZTAuX3ByaXZhdGUuZ3JhYmJlZCA9PT0gZ3JhYmJlZCkge1xuICAgIHJldHVybjtcbiAgfVxuICBlbGUwLl9wcml2YXRlLmdyYWJiZWQgPSBncmFiYmVkO1xuICBlbGUudXBkYXRlU3R5bGUoZmFsc2UpO1xufTtcbnZhciBzZXRHcmFiYmVkID0gZnVuY3Rpb24gc2V0R3JhYmJlZChlbGUpIHtcbiAgc2V0R3JhYlN0YXRlKGVsZSwgdHJ1ZSk7XG59O1xudmFyIHNldEZyZWVkID0gZnVuY3Rpb24gc2V0RnJlZWQoZWxlKSB7XG4gIHNldEdyYWJTdGF0ZShlbGUsIGZhbHNlKTtcbn07XG5cbnZhciBCUnAkMyA9IHt9O1xuXG4vKiBnbG9iYWwgZG9jdW1lbnQsIFJlc2l6ZU9ic2VydmVyLCBNdXRhdGlvbk9ic2VydmVyICovXG5cbkJScCQzLnJlZ2lzdGVyQmluZGluZyA9IGZ1bmN0aW9uICh0YXJnZXQsIGV2ZW50LCBoYW5kbGVyLCB1c2VDYXB0dXJlKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYXJndW1lbnRzLCBbMV0pOyAvLyBjb3B5XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodGFyZ2V0KSkge1xuICAgIHZhciByZXMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRhcmdldC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHQgPSB0YXJnZXRbaV07XG4gICAgICBpZiAodCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhciBiID0gdGhpcy5iaW5kZXIodCk7XG4gICAgICAgIHJlcy5wdXNoKGIub24uYXBwbHkoYiwgYXJncykpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHZhciBiID0gdGhpcy5iaW5kZXIodGFyZ2V0KTtcbiAgcmV0dXJuIGIub24uYXBwbHkoYiwgYXJncyk7XG59O1xuQlJwJDMuYmluZGVyID0gZnVuY3Rpb24gKHRndCkge1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBjb250YWluZXJXaW5kb3cgPSByLmN5LndpbmRvdygpO1xuICB2YXIgdGd0SXNEb20gPSB0Z3QgPT09IGNvbnRhaW5lcldpbmRvdyB8fCB0Z3QgPT09IGNvbnRhaW5lcldpbmRvdy5kb2N1bWVudCB8fCB0Z3QgPT09IGNvbnRhaW5lcldpbmRvdy5kb2N1bWVudC5ib2R5IHx8IGRvbUVsZW1lbnQodGd0KTtcbiAgaWYgKHIuc3VwcG9ydHNQYXNzaXZlRXZlbnRzID09IG51bGwpIHtcbiAgICAvLyBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9XSUNHL0V2ZW50TGlzdGVuZXJPcHRpb25zL2Jsb2IvZ2gtcGFnZXMvZXhwbGFpbmVyLm1kI2ZlYXR1cmUtZGV0ZWN0aW9uXG4gICAgdmFyIHN1cHBvcnRzUGFzc2l2ZSA9IGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICB2YXIgb3B0cyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ3Bhc3NpdmUnLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgIHN1cHBvcnRzUGFzc2l2ZSA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY29udGFpbmVyV2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCBudWxsLCBvcHRzKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIG5vdCBzdXBwb3J0ZWRcbiAgICB9XG4gICAgci5zdXBwb3J0c1Bhc3NpdmVFdmVudHMgPSBzdXBwb3J0c1Bhc3NpdmU7XG4gIH1cbiAgdmFyIG9uID0gZnVuY3Rpb24gb24oZXZlbnQsIGhhbmRsZXIsIHVzZUNhcHR1cmUpIHtcbiAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgaWYgKHRndElzRG9tICYmIHIuc3VwcG9ydHNQYXNzaXZlRXZlbnRzKSB7XG4gICAgICAvLyByZXBsYWNlIHVzZUNhcHR1cmUgdy8gb3B0cyBvYmpcbiAgICAgIGFyZ3NbMl0gPSB7XG4gICAgICAgIGNhcHR1cmU6IHVzZUNhcHR1cmUgIT0gbnVsbCA/IHVzZUNhcHR1cmUgOiBmYWxzZSxcbiAgICAgICAgcGFzc2l2ZTogZmFsc2UsXG4gICAgICAgIG9uY2U6IGZhbHNlXG4gICAgICB9O1xuICAgIH1cbiAgICByLmJpbmRpbmdzLnB1c2goe1xuICAgICAgdGFyZ2V0OiB0Z3QsXG4gICAgICBhcmdzOiBhcmdzXG4gICAgfSk7XG4gICAgKHRndC5hZGRFdmVudExpc3RlbmVyIHx8IHRndC5vbikuYXBwbHkodGd0LCBhcmdzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBvbjogb24sXG4gICAgYWRkRXZlbnRMaXN0ZW5lcjogb24sXG4gICAgYWRkTGlzdGVuZXI6IG9uLFxuICAgIGJpbmQ6IG9uXG4gIH07XG59O1xuQlJwJDMubm9kZUlzRHJhZ2dhYmxlID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUgJiYgbm9kZS5pc05vZGUoKSAmJiAhbm9kZS5sb2NrZWQoKSAmJiBub2RlLmdyYWJiYWJsZSgpO1xufTtcbkJScCQzLm5vZGVJc0dyYWJiYWJsZSA9IGZ1bmN0aW9uIChub2RlKSB7XG4gIHJldHVybiB0aGlzLm5vZGVJc0RyYWdnYWJsZShub2RlKSAmJiBub2RlLmludGVyYWN0aXZlKCk7XG59O1xuQlJwJDMubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgY29udGFpbmVyV2luZG93ID0gci5jeS53aW5kb3coKTtcbiAgdmFyIGlzU2VsZWN0ZWQgPSBmdW5jdGlvbiBpc1NlbGVjdGVkKGVsZSkge1xuICAgIHJldHVybiBlbGUuc2VsZWN0ZWQoKTtcbiAgfTtcbiAgdmFyIGdldFNoYWRvd1Jvb3QgPSBmdW5jdGlvbiBnZXRTaGFkb3dSb290KGVsZW1lbnQpIHtcbiAgICB2YXIgcm9vdE5vZGUgPSBlbGVtZW50LmdldFJvb3ROb2RlKCk7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHJvb3Qgbm9kZSBpcyBhIHNoYWRvdyByb290XG4gICAgaWYgKHJvb3ROb2RlICYmIHJvb3ROb2RlLm5vZGVUeXBlID09PSAxMSAmJiByb290Tm9kZS5ob3N0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiByb290Tm9kZTtcbiAgICB9XG4gIH07XG4gIHZhciB0cmlnZ2VyRXZlbnRzID0gZnVuY3Rpb24gdHJpZ2dlckV2ZW50cyh0YXJnZXQsIG5hbWVzLCBlLCBwb3NpdGlvbikge1xuICAgIGlmICh0YXJnZXQgPT0gbnVsbCkge1xuICAgICAgdGFyZ2V0ID0gci5jeTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG5hbWUgPSBuYW1lc1tpXTtcbiAgICAgIHRhcmdldC5lbWl0KHtcbiAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgdHlwZTogbmFtZSxcbiAgICAgICAgcG9zaXRpb246IHBvc2l0aW9uXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG4gIHZhciBpc011bHRTZWxLZXlEb3duID0gZnVuY3Rpb24gaXNNdWx0U2VsS2V5RG93bihlKSB7XG4gICAgcmV0dXJuIGUuc2hpZnRLZXkgfHwgZS5tZXRhS2V5IHx8IGUuY3RybEtleTsgLy8gbWF5YmUgZS5hbHRLZXlcbiAgfTtcbiAgdmFyIGFsbG93UGFubmluZ1Bhc3N0aHJvdWdoID0gZnVuY3Rpb24gYWxsb3dQYW5uaW5nUGFzc3Rocm91Z2goZG93biwgZG93bnMpIHtcbiAgICB2YXIgYWxsb3dQYXNzdGhyb3VnaCA9IHRydWU7XG4gICAgaWYgKHIuY3kuaGFzQ29tcG91bmROb2RlcygpICYmIGRvd24gJiYgZG93bi5wYW5uYWJsZSgpKSB7XG4gICAgICAvLyBhIGdyYWJiYWJsZSBjb21wb3VuZCBub2RlIGJlbG93IHRoZSBlbGUgPT4gbm8gcGFzc3Rocm91Z2ggcGFubmluZ1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGRvd25zICYmIGkgPCBkb3ducy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZG93biA9IGRvd25zW2ldO1xuXG4gICAgICAgIC8vaWYgYW55IHBhcmVudCBub2RlIGluIGV2ZW50IGhpZXJhcmNoeSBpc24ndCBwYW5uYWJsZSwgcmVqZWN0IHBhc3N0aHJvdWdoXG4gICAgICAgIGlmIChkb3duLmlzTm9kZSgpICYmIGRvd24uaXNQYXJlbnQoKSAmJiAhZG93bi5wYW5uYWJsZSgpKSB7XG4gICAgICAgICAgYWxsb3dQYXNzdGhyb3VnaCA9IGZhbHNlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGFsbG93UGFzc3Rocm91Z2ggPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gYWxsb3dQYXNzdGhyb3VnaDtcbiAgfTtcbiAgdmFyIHNldEluRHJhZ0xheWVyID0gZnVuY3Rpb24gc2V0SW5EcmFnTGF5ZXIoZWxlKSB7XG4gICAgZWxlWzBdLl9wcml2YXRlLnJzY3JhdGNoLmluRHJhZ0xheWVyID0gdHJ1ZTtcbiAgfTtcbiAgdmFyIHNldE91dERyYWdMYXllciA9IGZ1bmN0aW9uIHNldE91dERyYWdMYXllcihlbGUpIHtcbiAgICBlbGVbMF0uX3ByaXZhdGUucnNjcmF0Y2guaW5EcmFnTGF5ZXIgPSBmYWxzZTtcbiAgfTtcbiAgdmFyIHNldEdyYWJUYXJnZXQgPSBmdW5jdGlvbiBzZXRHcmFiVGFyZ2V0KGVsZSkge1xuICAgIGVsZVswXS5fcHJpdmF0ZS5yc2NyYXRjaC5pc0dyYWJUYXJnZXQgPSB0cnVlO1xuICB9O1xuICB2YXIgcmVtb3ZlR3JhYlRhcmdldCA9IGZ1bmN0aW9uIHJlbW92ZUdyYWJUYXJnZXQoZWxlKSB7XG4gICAgZWxlWzBdLl9wcml2YXRlLnJzY3JhdGNoLmlzR3JhYlRhcmdldCA9IGZhbHNlO1xuICB9O1xuICB2YXIgYWRkVG9EcmFnTGlzdCA9IGZ1bmN0aW9uIGFkZFRvRHJhZ0xpc3QoZWxlLCBvcHRzKSB7XG4gICAgdmFyIGxpc3QgPSBvcHRzLmFkZFRvTGlzdDtcbiAgICB2YXIgbGlzdEhhc0VsZSA9IGxpc3QuaGFzKGVsZSk7XG4gICAgaWYgKCFsaXN0SGFzRWxlICYmIGVsZS5ncmFiYmFibGUoKSAmJiAhZWxlLmxvY2tlZCgpKSB7XG4gICAgICBsaXN0Lm1lcmdlKGVsZSk7XG4gICAgICBzZXRHcmFiYmVkKGVsZSk7XG4gICAgfVxuICB9O1xuXG4gIC8vIGhlbHBlciBmdW5jdGlvbiB0byBkZXRlcm1pbmUgd2hpY2ggY2hpbGQgbm9kZXMgYW5kIGlubmVyIGVkZ2VzXG4gIC8vIG9mIGEgY29tcG91bmQgbm9kZSB0byBiZSBkcmFnZ2VkIGFzIHdlbGwgYXMgdGhlIGdyYWJiZWQgYW5kIHNlbGVjdGVkIG5vZGVzXG4gIHZhciBhZGREZXNjZW5kYW50c1RvRHJhZyA9IGZ1bmN0aW9uIGFkZERlc2NlbmRhbnRzVG9EcmFnKG5vZGUsIG9wdHMpIHtcbiAgICBpZiAoIW5vZGUuY3koKS5oYXNDb21wb3VuZE5vZGVzKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG9wdHMuaW5EcmFnTGF5ZXIgPT0gbnVsbCAmJiBvcHRzLmFkZFRvTGlzdCA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBub3RoaW5nIHRvIGRvXG5cbiAgICB2YXIgaW5uZXJOb2RlcyA9IG5vZGUuZGVzY2VuZGFudHMoKTtcbiAgICBpZiAob3B0cy5pbkRyYWdMYXllcikge1xuICAgICAgaW5uZXJOb2Rlcy5mb3JFYWNoKHNldEluRHJhZ0xheWVyKTtcbiAgICAgIGlubmVyTm9kZXMuY29ubmVjdGVkRWRnZXMoKS5mb3JFYWNoKHNldEluRHJhZ0xheWVyKTtcbiAgICB9XG4gICAgaWYgKG9wdHMuYWRkVG9MaXN0KSB7XG4gICAgICBhZGRUb0RyYWdMaXN0KGlubmVyTm9kZXMsIG9wdHMpO1xuICAgIH1cbiAgfTtcblxuICAvLyBhZGRzIHRoZSBnaXZlbiBub2RlcyBhbmQgaXRzIG5laWdoYm91cmhvb2QgdG8gdGhlIGRyYWcgbGF5ZXJcbiAgdmFyIGFkZE5vZGVzVG9EcmFnID0gZnVuY3Rpb24gYWRkTm9kZXNUb0RyYWcobm9kZXMsIG9wdHMpIHtcbiAgICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgICB2YXIgaGFzQ29tcG91bmROb2RlcyA9IG5vZGVzLmN5KCkuaGFzQ29tcG91bmROb2RlcygpO1xuICAgIGlmIChvcHRzLmluRHJhZ0xheWVyKSB7XG4gICAgICBub2Rlcy5mb3JFYWNoKHNldEluRHJhZ0xheWVyKTtcbiAgICAgIG5vZGVzLm5laWdoYm9yaG9vZCgpLnN0ZEZpbHRlcihmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgIHJldHVybiAhaGFzQ29tcG91bmROb2RlcyB8fCBlbGUuaXNFZGdlKCk7XG4gICAgICB9KS5mb3JFYWNoKHNldEluRHJhZ0xheWVyKTtcbiAgICB9XG4gICAgaWYgKG9wdHMuYWRkVG9MaXN0KSB7XG4gICAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgYWRkVG9EcmFnTGlzdChlbGUsIG9wdHMpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGFkZERlc2NlbmRhbnRzVG9EcmFnKG5vZGVzLCBvcHRzKTsgLy8gYWx3YXlzIGFkZCB0byBkcmFnXG5cbiAgICAvLyBhbHNvIGFkZCBub2RlcyBhbmQgZWRnZXMgcmVsYXRlZCB0byB0aGUgdG9wbW9zdCBhbmNlc3RvclxuICAgIHVwZGF0ZUFuY2VzdG9yc0luRHJhZ0xheWVyKG5vZGVzLCB7XG4gICAgICBpbkRyYWdMYXllcjogb3B0cy5pbkRyYWdMYXllclxuICAgIH0pO1xuICAgIHIudXBkYXRlQ2FjaGVkR3JhYmJlZEVsZXMoKTtcbiAgfTtcbiAgdmFyIGFkZE5vZGVUb0RyYWcgPSBhZGROb2Rlc1RvRHJhZztcbiAgdmFyIGZyZWVEcmFnZ2VkRWxlbWVudHMgPSBmdW5jdGlvbiBmcmVlRHJhZ2dlZEVsZW1lbnRzKGdyYWJiZWRFbGVzKSB7XG4gICAgaWYgKCFncmFiYmVkRWxlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGp1c3QgZ28gb3ZlciBhbGwgZWxlbWVudHMgcmF0aGVyIHRoYW4gZG9pbmcgYSBidW5jaCBvZiAocG9zc2libHkgZXhwZW5zaXZlKSB0cmF2ZXJzYWxzXG4gICAgci5nZXRDYWNoZWRaU29ydGVkRWxlcygpLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgICAgc2V0RnJlZWQoZWxlKTtcbiAgICAgIHNldE91dERyYWdMYXllcihlbGUpO1xuICAgICAgcmVtb3ZlR3JhYlRhcmdldChlbGUpO1xuICAgIH0pO1xuICAgIHIudXBkYXRlQ2FjaGVkR3JhYmJlZEVsZXMoKTtcbiAgfTtcblxuICAvLyBoZWxwZXIgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHdoaWNoIGFuY2VzdG9yIG5vZGVzIGFuZCBlZGdlcyBzaG91bGQgZ29cbiAgLy8gdG8gdGhlIGRyYWcgbGF5ZXIgKG9yIHNob3VsZCBiZSByZW1vdmVkIGZyb20gZHJhZyBsYXllcikuXG4gIHZhciB1cGRhdGVBbmNlc3RvcnNJbkRyYWdMYXllciA9IGZ1bmN0aW9uIHVwZGF0ZUFuY2VzdG9yc0luRHJhZ0xheWVyKG5vZGUsIG9wdHMpIHtcbiAgICBpZiAob3B0cy5pbkRyYWdMYXllciA9PSBudWxsICYmIG9wdHMuYWRkVG9MaXN0ID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIG5vdGhpbmcgdG8gZG9cblxuICAgIGlmICghbm9kZS5jeSgpLmhhc0NvbXBvdW5kTm9kZXMoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGZpbmQgdG9wLWxldmVsIHBhcmVudFxuICAgIHZhciBwYXJlbnQgPSBub2RlLmFuY2VzdG9ycygpLm9ycGhhbnMoKTtcblxuICAgIC8vIG5vIHBhcmVudCBub2RlOiBubyBub2RlcyB0byBhZGQgdG8gdGhlIGRyYWcgbGF5ZXJcbiAgICBpZiAocGFyZW50LnNhbWUobm9kZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIG5vZGVzID0gcGFyZW50LmRlc2NlbmRhbnRzKCkuc3Bhd25TZWxmKCkubWVyZ2UocGFyZW50KS51bm1lcmdlKG5vZGUpLnVubWVyZ2Uobm9kZS5kZXNjZW5kYW50cygpKTtcbiAgICB2YXIgZWRnZXMgPSBub2Rlcy5jb25uZWN0ZWRFZGdlcygpO1xuICAgIGlmIChvcHRzLmluRHJhZ0xheWVyKSB7XG4gICAgICBlZGdlcy5mb3JFYWNoKHNldEluRHJhZ0xheWVyKTtcbiAgICAgIG5vZGVzLmZvckVhY2goc2V0SW5EcmFnTGF5ZXIpO1xuICAgIH1cbiAgICBpZiAob3B0cy5hZGRUb0xpc3QpIHtcbiAgICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICBhZGRUb0RyYWdMaXN0KGVsZSwgb3B0cyk7XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG4gIHZhciBibHVyQWN0aXZlRG9tRWxlbWVudCA9IGZ1bmN0aW9uIGJsdXJBY3RpdmVEb21FbGVtZW50KCkge1xuICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ICE9IG51bGwgJiYgZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5ibHVyICE9IG51bGwpIHtcbiAgICAgIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQuYmx1cigpO1xuICAgIH1cbiAgfTtcbiAgdmFyIGhhdmVNdXRhdGlvbnNBcGkgPSB0eXBlb2YgTXV0YXRpb25PYnNlcnZlciAhPT0gJ3VuZGVmaW5lZCc7XG4gIHZhciBoYXZlUmVzaXplT2JzZXJ2ZXJBcGkgPSB0eXBlb2YgUmVzaXplT2JzZXJ2ZXIgIT09ICd1bmRlZmluZWQnO1xuXG4gIC8vIHdhdGNoIGZvciB3aGVuIHRoZSBjeSBjb250YWluZXIgaXMgcmVtb3ZlZCBmcm9tIHRoZSBkb21cbiAgaWYgKGhhdmVNdXRhdGlvbnNBcGkpIHtcbiAgICByLnJlbW92ZU9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24gKG11dG5zKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG11dG5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBtdXRuID0gbXV0bnNbaV07XG4gICAgICAgIHZhciByTm9kZXMgPSBtdXRuLnJlbW92ZWROb2RlcztcbiAgICAgICAgaWYgKHJOb2Rlcykge1xuICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgck5vZGVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICB2YXIgck5vZGUgPSByTm9kZXNbal07XG4gICAgICAgICAgICBpZiAock5vZGUgPT09IHIuY29udGFpbmVyKSB7XG4gICAgICAgICAgICAgIHIuZGVzdHJveSgpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoci5jb250YWluZXIucGFyZW50Tm9kZSkge1xuICAgICAgci5yZW1vdmVPYnNlcnZlci5vYnNlcnZlKHIuY29udGFpbmVyLnBhcmVudE5vZGUsIHtcbiAgICAgICAgY2hpbGRMaXN0OiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgci5yZWdpc3RlckJpbmRpbmcoci5jb250YWluZXIsICdET01Ob2RlUmVtb3ZlZCcsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgICByLmRlc3Ryb3koKTtcbiAgICB9KTtcbiAgfVxuICB2YXIgb25SZXNpemUgPSBkZWJvdW5jZShmdW5jdGlvbiAoKSB7XG4gICAgci5jeS5yZXNpemUoKTtcbiAgfSwgMTAwKTtcbiAgaWYgKGhhdmVNdXRhdGlvbnNBcGkpIHtcbiAgICByLnN0eWxlT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihvblJlc2l6ZSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcblxuICAgIHIuc3R5bGVPYnNlcnZlci5vYnNlcnZlKHIuY29udGFpbmVyLCB7XG4gICAgICBhdHRyaWJ1dGVzOiB0cnVlXG4gICAgfSk7XG4gIH1cblxuICAvLyBhdXRvIHJlc2l6ZVxuICByLnJlZ2lzdGVyQmluZGluZyhjb250YWluZXJXaW5kb3csICdyZXNpemUnLCBvblJlc2l6ZSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcblxuICBpZiAoaGF2ZVJlc2l6ZU9ic2VydmVyQXBpKSB7XG4gICAgci5yZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcihvblJlc2l6ZSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcblxuICAgIHIucmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShyLmNvbnRhaW5lcik7XG4gIH1cbiAgdmFyIGZvckVhY2hVcCA9IGZ1bmN0aW9uIGZvckVhY2hVcChkb21FbGUsIGZuKSB7XG4gICAgd2hpbGUgKGRvbUVsZSAhPSBudWxsKSB7XG4gICAgICBmbihkb21FbGUpO1xuICAgICAgZG9tRWxlID0gZG9tRWxlLnBhcmVudE5vZGU7XG4gICAgfVxuICB9O1xuICB2YXIgaW52YWxpZGF0ZUNvb3JkcyA9IGZ1bmN0aW9uIGludmFsaWRhdGVDb29yZHMoKSB7XG4gICAgci5pbnZhbGlkYXRlQ29udGFpbmVyQ2xpZW50Q29vcmRzQ2FjaGUoKTtcbiAgfTtcbiAgZm9yRWFjaFVwKHIuY29udGFpbmVyLCBmdW5jdGlvbiAoZG9tRWxlKSB7XG4gICAgci5yZWdpc3RlckJpbmRpbmcoZG9tRWxlLCAndHJhbnNpdGlvbmVuZCcsIGludmFsaWRhdGVDb29yZHMpO1xuICAgIHIucmVnaXN0ZXJCaW5kaW5nKGRvbUVsZSwgJ2FuaW1hdGlvbmVuZCcsIGludmFsaWRhdGVDb29yZHMpO1xuICAgIHIucmVnaXN0ZXJCaW5kaW5nKGRvbUVsZSwgJ3Njcm9sbCcsIGludmFsaWRhdGVDb29yZHMpO1xuICB9KTtcblxuICAvLyBzdG9wIHJpZ2h0IGNsaWNrIG1lbnUgZnJvbSBhcHBlYXJpbmcgb24gY3lcbiAgci5yZWdpc3RlckJpbmRpbmcoci5jb250YWluZXIsICdjb250ZXh0bWVudScsIGZ1bmN0aW9uIChlKSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICB9KTtcbiAgdmFyIGluQm94U2VsZWN0aW9uID0gZnVuY3Rpb24gaW5Cb3hTZWxlY3Rpb24oKSB7XG4gICAgcmV0dXJuIHIuc2VsZWN0aW9uWzRdICE9PSAwO1xuICB9O1xuICB2YXIgZXZlbnRJbkNvbnRhaW5lciA9IGZ1bmN0aW9uIGV2ZW50SW5Db250YWluZXIoZSkge1xuICAgIC8vIHNhdmUgY3ljbGVzIGlmIG1vdXNlIGV2ZW50cyBhcmVuJ3QgdG8gYmUgY2FwdHVyZWRcbiAgICB2YXIgY29udGFpbmVyUGFnZUNvb3JkcyA9IHIuZmluZENvbnRhaW5lckNsaWVudENvb3JkcygpO1xuICAgIHZhciB4ID0gY29udGFpbmVyUGFnZUNvb3Jkc1swXTtcbiAgICB2YXIgeSA9IGNvbnRhaW5lclBhZ2VDb29yZHNbMV07XG4gICAgdmFyIHdpZHRoID0gY29udGFpbmVyUGFnZUNvb3Jkc1syXTtcbiAgICB2YXIgaGVpZ2h0ID0gY29udGFpbmVyUGFnZUNvb3Jkc1szXTtcbiAgICB2YXIgcG9zaXRpb25zID0gZS50b3VjaGVzID8gZS50b3VjaGVzIDogW2VdO1xuICAgIHZhciBhdExlYXN0T25lUG9zSW5zaWRlID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwID0gcG9zaXRpb25zW2ldO1xuICAgICAgaWYgKHggPD0gcC5jbGllbnRYICYmIHAuY2xpZW50WCA8PSB4ICsgd2lkdGggJiYgeSA8PSBwLmNsaWVudFkgJiYgcC5jbGllbnRZIDw9IHkgKyBoZWlnaHQpIHtcbiAgICAgICAgYXRMZWFzdE9uZVBvc0luc2lkZSA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWF0TGVhc3RPbmVQb3NJbnNpZGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIGNvbnRhaW5lciA9IHIuY29udGFpbmVyO1xuICAgIHZhciB0YXJnZXQgPSBlLnRhcmdldDtcbiAgICB2YXIgdFBhcmVudCA9IHRhcmdldC5wYXJlbnROb2RlO1xuICAgIHZhciBjb250YWluZXJJc1RhcmdldCA9IGZhbHNlO1xuICAgIHdoaWxlICh0UGFyZW50KSB7XG4gICAgICBpZiAodFBhcmVudCA9PT0gY29udGFpbmVyKSB7XG4gICAgICAgIGNvbnRhaW5lcklzVGFyZ2V0ID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICB0UGFyZW50ID0gdFBhcmVudC5wYXJlbnROb2RlO1xuICAgIH1cbiAgICBpZiAoIWNvbnRhaW5lcklzVGFyZ2V0KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSAvLyBpZiB0YXJnZXQgaXMgb3V0aXNkZSBjeSBjb250YWluZXIsIHRoZW4gdGhpcyBldmVudCBpcyBub3QgZm9yIHVzXG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICAvLyBQcmltYXJ5IGtleVxuICByLnJlZ2lzdGVyQmluZGluZyhyLmNvbnRhaW5lciwgJ21vdXNlZG93bicsIGZ1bmN0aW9uIG1vdXNlZG93bkhhbmRsZXIoZSkge1xuICAgIGlmICghZXZlbnRJbkNvbnRhaW5lcihlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGR1cmluZyBsZWZ0IG1vdXNlIGJ1dHRvbiBnZXN0dXJlcywgaWdub3JlIG90aGVyIGJ1dHRvbnNcbiAgICBpZiAoci5ob3ZlckRhdGEud2hpY2ggPT09IDEgJiYgZS53aGljaCAhPT0gMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgYmx1ckFjdGl2ZURvbUVsZW1lbnQoKTtcbiAgICByLmhvdmVyRGF0YS5jYXB0dXJlID0gdHJ1ZTtcbiAgICByLmhvdmVyRGF0YS53aGljaCA9IGUud2hpY2g7XG4gICAgdmFyIGN5ID0gci5jeTtcbiAgICB2YXIgZ3BvcyA9IFtlLmNsaWVudFgsIGUuY2xpZW50WV07XG4gICAgdmFyIHBvcyA9IHIucHJvamVjdEludG9WaWV3cG9ydChncG9zWzBdLCBncG9zWzFdKTtcbiAgICB2YXIgc2VsZWN0ID0gci5zZWxlY3Rpb247XG4gICAgdmFyIG5lYXJzID0gci5maW5kTmVhcmVzdEVsZW1lbnRzKHBvc1swXSwgcG9zWzFdLCB0cnVlLCBmYWxzZSk7XG4gICAgdmFyIG5lYXIgPSBuZWFyc1swXTtcbiAgICB2YXIgZHJhZ2dlZEVsZW1lbnRzID0gci5kcmFnRGF0YS5wb3NzaWJsZURyYWdFbGVtZW50cztcbiAgICByLmhvdmVyRGF0YS5tZG93blBvcyA9IHBvcztcbiAgICByLmhvdmVyRGF0YS5tZG93bkdQb3MgPSBncG9zO1xuICAgIHZhciBtYWtlRXZlbnQgPSBmdW5jdGlvbiBtYWtlRXZlbnQodHlwZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgICAgeTogcG9zWzFdXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfTtcbiAgICB2YXIgY2hlY2tGb3JUYXBob2xkID0gZnVuY3Rpb24gY2hlY2tGb3JUYXBob2xkKCkge1xuICAgICAgci5ob3ZlckRhdGEudGFwaG9sZENhbmNlbGxlZCA9IGZhbHNlO1xuICAgICAgY2xlYXJUaW1lb3V0KHIuaG92ZXJEYXRhLnRhcGhvbGRUaW1lb3V0KTtcbiAgICAgIHIuaG92ZXJEYXRhLnRhcGhvbGRUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChyLmhvdmVyRGF0YS50YXBob2xkQ2FuY2VsbGVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBlbGUgPSByLmhvdmVyRGF0YS5kb3duO1xuICAgICAgICAgIGlmIChlbGUpIHtcbiAgICAgICAgICAgIGVsZS5lbWl0KG1ha2VFdmVudCgndGFwaG9sZCcpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY3kuZW1pdChtYWtlRXZlbnQoJ3RhcGhvbGQnKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCByLnRhcGhvbGREdXJhdGlvbik7XG4gICAgfTtcblxuICAgIC8vIFJpZ2h0IGNsaWNrIGJ1dHRvblxuICAgIGlmIChlLndoaWNoID09IDMpIHtcbiAgICAgIHIuaG92ZXJEYXRhLmN4dFN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgdmFyIGN4dEV2dCA9IHtcbiAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgdHlwZTogJ2N4dHRhcHN0YXJ0JyxcbiAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgICAgeTogcG9zWzFdXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBpZiAobmVhcikge1xuICAgICAgICBuZWFyLmFjdGl2YXRlKCk7XG4gICAgICAgIG5lYXIuZW1pdChjeHRFdnQpO1xuICAgICAgICByLmhvdmVyRGF0YS5kb3duID0gbmVhcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN5LmVtaXQoY3h0RXZ0KTtcbiAgICAgIH1cbiAgICAgIHIuaG92ZXJEYXRhLmRvd25UaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICByLmhvdmVyRGF0YS5jeHREcmFnZ2VkID0gZmFsc2U7XG5cbiAgICAgIC8vIFByaW1hcnkgYnV0dG9uXG4gICAgfSBlbHNlIGlmIChlLndoaWNoID09IDEpIHtcbiAgICAgIGlmIChuZWFyKSB7XG4gICAgICAgIG5lYXIuYWN0aXZhdGUoKTtcbiAgICAgIH1cblxuICAgICAgLy8gRWxlbWVudCBkcmFnZ2luZ1xuICAgICAge1xuICAgICAgICAvLyBJZiBzb21ldGhpbmcgaXMgdW5kZXIgdGhlIGN1cnNvciBhbmQgaXQgaXMgZHJhZ2dhYmxlLCBwcmVwYXJlIHRvIGdyYWIgaXRcbiAgICAgICAgaWYgKG5lYXIgIT0gbnVsbCkge1xuICAgICAgICAgIGlmIChyLm5vZGVJc0dyYWJiYWJsZShuZWFyKSkge1xuICAgICAgICAgICAgdmFyIHRyaWdnZXJHcmFiID0gZnVuY3Rpb24gdHJpZ2dlckdyYWIoZWxlKSB7XG4gICAgICAgICAgICAgIGVsZS5lbWl0KG1ha2VFdmVudCgnZ3JhYicpKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBzZXRHcmFiVGFyZ2V0KG5lYXIpO1xuICAgICAgICAgICAgaWYgKCFuZWFyLnNlbGVjdGVkKCkpIHtcbiAgICAgICAgICAgICAgZHJhZ2dlZEVsZW1lbnRzID0gci5kcmFnRGF0YS5wb3NzaWJsZURyYWdFbGVtZW50cyA9IGN5LmNvbGxlY3Rpb24oKTtcbiAgICAgICAgICAgICAgYWRkTm9kZVRvRHJhZyhuZWFyLCB7XG4gICAgICAgICAgICAgICAgYWRkVG9MaXN0OiBkcmFnZ2VkRWxlbWVudHNcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIG5lYXIuZW1pdChtYWtlRXZlbnQoJ2dyYWJvbicpKS5lbWl0KG1ha2VFdmVudCgnZ3JhYicpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGRyYWdnZWRFbGVtZW50cyA9IHIuZHJhZ0RhdGEucG9zc2libGVEcmFnRWxlbWVudHMgPSBjeS5jb2xsZWN0aW9uKCk7XG4gICAgICAgICAgICAgIHZhciBzZWxlY3RlZE5vZGVzID0gY3kuJChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZS5pc05vZGUoKSAmJiBlbGUuc2VsZWN0ZWQoKSAmJiByLm5vZGVJc0dyYWJiYWJsZShlbGUpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgYWRkTm9kZXNUb0RyYWcoc2VsZWN0ZWROb2Rlcywge1xuICAgICAgICAgICAgICAgIGFkZFRvTGlzdDogZHJhZ2dlZEVsZW1lbnRzXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBuZWFyLmVtaXQobWFrZUV2ZW50KCdncmFib24nKSk7XG4gICAgICAgICAgICAgIHNlbGVjdGVkTm9kZXMuZm9yRWFjaCh0cmlnZ2VyR3JhYik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgICAgICAgIHIucmVkcmF3SGludCgnZHJhZycsIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByLmhvdmVyRGF0YS5kb3duID0gbmVhcjtcbiAgICAgICAgci5ob3ZlckRhdGEuZG93bnMgPSBuZWFycztcbiAgICAgICAgci5ob3ZlckRhdGEuZG93blRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgIH1cbiAgICAgIHRyaWdnZXJFdmVudHMobmVhciwgWydtb3VzZWRvd24nLCAndGFwc3RhcnQnLCAndm1vdXNlZG93biddLCBlLCB7XG4gICAgICAgIHg6IHBvc1swXSxcbiAgICAgICAgeTogcG9zWzFdXG4gICAgICB9KTtcbiAgICAgIGlmIChuZWFyID09IG51bGwpIHtcbiAgICAgICAgc2VsZWN0WzRdID0gMTtcbiAgICAgICAgci5kYXRhLmJnQWN0aXZlUG9zaXN0aW9uID0ge1xuICAgICAgICAgIHg6IHBvc1swXSxcbiAgICAgICAgICB5OiBwb3NbMV1cbiAgICAgICAgfTtcbiAgICAgICAgci5yZWRyYXdIaW50KCdzZWxlY3QnLCB0cnVlKTtcbiAgICAgICAgci5yZWRyYXcoKTtcbiAgICAgIH0gZWxzZSBpZiAobmVhci5wYW5uYWJsZSgpKSB7XG4gICAgICAgIHNlbGVjdFs0XSA9IDE7IC8vIGZvciBmdXR1cmUgcGFuXG4gICAgICB9XG4gICAgICBjaGVja0ZvclRhcGhvbGQoKTtcbiAgICB9XG5cbiAgICAvLyBJbml0aWFsaXplIHNlbGVjdGlvbiBib3ggY29vcmRpbmF0ZXNcbiAgICBzZWxlY3RbMF0gPSBzZWxlY3RbMl0gPSBwb3NbMF07XG4gICAgc2VsZWN0WzFdID0gc2VsZWN0WzNdID0gcG9zWzFdO1xuICB9LCBmYWxzZSk7XG4gIHZhciBzaGFkb3dSb290ID0gZ2V0U2hhZG93Um9vdChyLmNvbnRhaW5lcik7XG4gIHIucmVnaXN0ZXJCaW5kaW5nKFtjb250YWluZXJXaW5kb3csIHNoYWRvd1Jvb3RdLCAnbW91c2Vtb3ZlJywgZnVuY3Rpb24gbW91c2Vtb3ZlSGFuZGxlcihlKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuICAgIHZhciBjYXB0dXJlID0gci5ob3ZlckRhdGEuY2FwdHVyZTtcbiAgICBpZiAoIWNhcHR1cmUgJiYgIWV2ZW50SW5Db250YWluZXIoZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHByZXZlbnREZWZhdWx0ID0gZmFsc2U7XG4gICAgdmFyIGN5ID0gci5jeTtcbiAgICB2YXIgem9vbSA9IGN5Lnpvb20oKTtcbiAgICB2YXIgZ3BvcyA9IFtlLmNsaWVudFgsIGUuY2xpZW50WV07XG4gICAgdmFyIHBvcyA9IHIucHJvamVjdEludG9WaWV3cG9ydChncG9zWzBdLCBncG9zWzFdKTtcbiAgICB2YXIgbWRvd25Qb3MgPSByLmhvdmVyRGF0YS5tZG93blBvcztcbiAgICB2YXIgbWRvd25HUG9zID0gci5ob3ZlckRhdGEubWRvd25HUG9zO1xuICAgIHZhciBzZWxlY3QgPSByLnNlbGVjdGlvbjtcbiAgICB2YXIgbmVhciA9IG51bGw7XG4gICAgaWYgKCFyLmhvdmVyRGF0YS5kcmFnZ2luZ0VsZXMgJiYgIXIuaG92ZXJEYXRhLmRyYWdnaW5nICYmICFyLmhvdmVyRGF0YS5zZWxlY3RpbmcpIHtcbiAgICAgIG5lYXIgPSByLmZpbmROZWFyZXN0RWxlbWVudChwb3NbMF0sIHBvc1sxXSwgdHJ1ZSwgZmFsc2UpO1xuICAgIH1cbiAgICB2YXIgbGFzdCA9IHIuaG92ZXJEYXRhLmxhc3Q7XG4gICAgdmFyIGRvd24gPSByLmhvdmVyRGF0YS5kb3duO1xuICAgIHZhciBkaXNwID0gW3Bvc1swXSAtIHNlbGVjdFsyXSwgcG9zWzFdIC0gc2VsZWN0WzNdXTtcbiAgICB2YXIgZHJhZ2dlZEVsZW1lbnRzID0gci5kcmFnRGF0YS5wb3NzaWJsZURyYWdFbGVtZW50cztcbiAgICB2YXIgaXNPdmVyVGhyZXNob2xkRHJhZztcbiAgICBpZiAobWRvd25HUG9zKSB7XG4gICAgICB2YXIgZHggPSBncG9zWzBdIC0gbWRvd25HUG9zWzBdO1xuICAgICAgdmFyIGR4MiA9IGR4ICogZHg7XG4gICAgICB2YXIgZHkgPSBncG9zWzFdIC0gbWRvd25HUG9zWzFdO1xuICAgICAgdmFyIGR5MiA9IGR5ICogZHk7XG4gICAgICB2YXIgZGlzdDIgPSBkeDIgKyBkeTI7XG4gICAgICByLmhvdmVyRGF0YS5pc092ZXJUaHJlc2hvbGREcmFnID0gaXNPdmVyVGhyZXNob2xkRHJhZyA9IGRpc3QyID49IHIuZGVza3RvcFRhcFRocmVzaG9sZDI7XG4gICAgfVxuICAgIHZhciBtdWx0U2VsS2V5RG93biA9IGlzTXVsdFNlbEtleURvd24oZSk7XG4gICAgaWYgKGlzT3ZlclRocmVzaG9sZERyYWcpIHtcbiAgICAgIHIuaG92ZXJEYXRhLnRhcGhvbGRDYW5jZWxsZWQgPSB0cnVlO1xuICAgIH1cbiAgICB2YXIgdXBkYXRlRHJhZ0RlbHRhID0gZnVuY3Rpb24gdXBkYXRlRHJhZ0RlbHRhKCkge1xuICAgICAgdmFyIGRyYWdEZWx0YSA9IHIuaG92ZXJEYXRhLmRyYWdEZWx0YSA9IHIuaG92ZXJEYXRhLmRyYWdEZWx0YSB8fCBbXTtcbiAgICAgIGlmIChkcmFnRGVsdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGRyYWdEZWx0YS5wdXNoKGRpc3BbMF0pO1xuICAgICAgICBkcmFnRGVsdGEucHVzaChkaXNwWzFdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRyYWdEZWx0YVswXSArPSBkaXNwWzBdO1xuICAgICAgICBkcmFnRGVsdGFbMV0gKz0gZGlzcFsxXTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHByZXZlbnREZWZhdWx0ID0gdHJ1ZTtcbiAgICB0cmlnZ2VyRXZlbnRzKG5lYXIsIFsnbW91c2Vtb3ZlJywgJ3Ztb3VzZW1vdmUnLCAndGFwZHJhZyddLCBlLCB7XG4gICAgICB4OiBwb3NbMF0sXG4gICAgICB5OiBwb3NbMV1cbiAgICB9KTtcbiAgICB2YXIgbWFrZUV2ZW50ID0gZnVuY3Rpb24gbWFrZUV2ZW50KHR5cGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICAgIHk6IHBvc1sxXVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH07XG4gICAgdmFyIGdvSW50b0JveE1vZGUgPSBmdW5jdGlvbiBnb0ludG9Cb3hNb2RlKCkge1xuICAgICAgci5kYXRhLmJnQWN0aXZlUG9zaXN0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgaWYgKCFyLmhvdmVyRGF0YS5zZWxlY3RpbmcpIHtcbiAgICAgICAgY3kuZW1pdChtYWtlRXZlbnQoJ2JveHN0YXJ0JykpO1xuICAgICAgfVxuICAgICAgc2VsZWN0WzRdID0gMTtcbiAgICAgIHIuaG92ZXJEYXRhLnNlbGVjdGluZyA9IHRydWU7XG4gICAgICByLnJlZHJhd0hpbnQoJ3NlbGVjdCcsIHRydWUpO1xuICAgICAgci5yZWRyYXcoKTtcbiAgICB9O1xuXG4gICAgLy8gdHJpZ2dlciBjb250ZXh0IGRyYWcgaWYgcm1vdXNlIGRvd25cbiAgICBpZiAoci5ob3ZlckRhdGEud2hpY2ggPT09IDMpIHtcbiAgICAgIC8vIGJ1dCBvbmx5IGlmIG92ZXIgdGhyZXNob2xkXG4gICAgICBpZiAoaXNPdmVyVGhyZXNob2xkRHJhZykge1xuICAgICAgICB2YXIgY3h0RXZ0ID0gbWFrZUV2ZW50KCdjeHRkcmFnJyk7XG4gICAgICAgIGlmIChkb3duKSB7XG4gICAgICAgICAgZG93bi5lbWl0KGN4dEV2dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3kuZW1pdChjeHRFdnQpO1xuICAgICAgICB9XG4gICAgICAgIHIuaG92ZXJEYXRhLmN4dERyYWdnZWQgPSB0cnVlO1xuICAgICAgICBpZiAoIXIuaG92ZXJEYXRhLmN4dE92ZXIgfHwgbmVhciAhPT0gci5ob3ZlckRhdGEuY3h0T3Zlcikge1xuICAgICAgICAgIGlmIChyLmhvdmVyRGF0YS5jeHRPdmVyKSB7XG4gICAgICAgICAgICByLmhvdmVyRGF0YS5jeHRPdmVyLmVtaXQobWFrZUV2ZW50KCdjeHRkcmFnb3V0JykpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByLmhvdmVyRGF0YS5jeHRPdmVyID0gbmVhcjtcbiAgICAgICAgICBpZiAobmVhcikge1xuICAgICAgICAgICAgbmVhci5lbWl0KG1ha2VFdmVudCgnY3h0ZHJhZ292ZXInKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHdlIGFyZSBkcmFnIHBhbm5pbmcgdGhlIGVudGlyZSBncmFwaFxuICAgIH0gZWxzZSBpZiAoci5ob3ZlckRhdGEuZHJhZ2dpbmcpIHtcbiAgICAgIHByZXZlbnREZWZhdWx0ID0gdHJ1ZTtcbiAgICAgIGlmIChjeS5wYW5uaW5nRW5hYmxlZCgpICYmIGN5LnVzZXJQYW5uaW5nRW5hYmxlZCgpKSB7XG4gICAgICAgIHZhciBkZWx0YVA7XG4gICAgICAgIGlmIChyLmhvdmVyRGF0YS5qdXN0U3RhcnRlZFBhbikge1xuICAgICAgICAgIHZhciBtZFBvcyA9IHIuaG92ZXJEYXRhLm1kb3duUG9zO1xuICAgICAgICAgIGRlbHRhUCA9IHtcbiAgICAgICAgICAgIHg6IChwb3NbMF0gLSBtZFBvc1swXSkgKiB6b29tLFxuICAgICAgICAgICAgeTogKHBvc1sxXSAtIG1kUG9zWzFdKSAqIHpvb21cbiAgICAgICAgICB9O1xuICAgICAgICAgIHIuaG92ZXJEYXRhLmp1c3RTdGFydGVkUGFuID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVsdGFQID0ge1xuICAgICAgICAgICAgeDogZGlzcFswXSAqIHpvb20sXG4gICAgICAgICAgICB5OiBkaXNwWzFdICogem9vbVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY3kucGFuQnkoZGVsdGFQKTtcbiAgICAgICAgY3kuZW1pdChtYWtlRXZlbnQoJ2RyYWdwYW4nKSk7XG4gICAgICAgIHIuaG92ZXJEYXRhLmRyYWdnZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBOZWVkcyByZXByb2plY3QgZHVlIHRvIHBhbiBjaGFuZ2luZyB2aWV3cG9ydFxuICAgICAgcG9zID0gci5wcm9qZWN0SW50b1ZpZXdwb3J0KGUuY2xpZW50WCwgZS5jbGllbnRZKTtcblxuICAgICAgLy8gQ2hlY2tzIHByaW1hcnkgYnV0dG9uIGRvd24gJiBvdXQgb2YgdGltZSAmIG1vdXNlIG5vdCBtb3ZlZCBtdWNoXG4gICAgfSBlbHNlIGlmIChzZWxlY3RbNF0gPT0gMSAmJiAoZG93biA9PSBudWxsIHx8IGRvd24ucGFubmFibGUoKSkpIHtcbiAgICAgIGlmIChpc092ZXJUaHJlc2hvbGREcmFnKSB7XG4gICAgICAgIGlmICghci5ob3ZlckRhdGEuZHJhZ2dpbmcgJiYgY3kuYm94U2VsZWN0aW9uRW5hYmxlZCgpICYmIChtdWx0U2VsS2V5RG93biB8fCAhY3kucGFubmluZ0VuYWJsZWQoKSB8fCAhY3kudXNlclBhbm5pbmdFbmFibGVkKCkpKSB7XG4gICAgICAgICAgZ29JbnRvQm94TW9kZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKCFyLmhvdmVyRGF0YS5zZWxlY3RpbmcgJiYgY3kucGFubmluZ0VuYWJsZWQoKSAmJiBjeS51c2VyUGFubmluZ0VuYWJsZWQoKSkge1xuICAgICAgICAgIHZhciBhbGxvd1Bhc3N0aHJvdWdoID0gYWxsb3dQYW5uaW5nUGFzc3Rocm91Z2goZG93biwgci5ob3ZlckRhdGEuZG93bnMpO1xuICAgICAgICAgIGlmIChhbGxvd1Bhc3N0aHJvdWdoKSB7XG4gICAgICAgICAgICByLmhvdmVyRGF0YS5kcmFnZ2luZyA9IHRydWU7XG4gICAgICAgICAgICByLmhvdmVyRGF0YS5qdXN0U3RhcnRlZFBhbiA9IHRydWU7XG4gICAgICAgICAgICBzZWxlY3RbNF0gPSAwO1xuICAgICAgICAgICAgci5kYXRhLmJnQWN0aXZlUG9zaXN0aW9uID0gYXJyYXkycG9pbnQobWRvd25Qb3MpO1xuICAgICAgICAgICAgci5yZWRyYXdIaW50KCdzZWxlY3QnLCB0cnVlKTtcbiAgICAgICAgICAgIHIucmVkcmF3KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChkb3duICYmIGRvd24ucGFubmFibGUoKSAmJiBkb3duLmFjdGl2ZSgpKSB7XG4gICAgICAgICAgZG93bi51bmFjdGl2YXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGRvd24gJiYgZG93bi5wYW5uYWJsZSgpICYmIGRvd24uYWN0aXZlKCkpIHtcbiAgICAgICAgZG93bi51bmFjdGl2YXRlKCk7XG4gICAgICB9XG4gICAgICBpZiAoKCFkb3duIHx8ICFkb3duLmdyYWJiZWQoKSkgJiYgbmVhciAhPSBsYXN0KSB7XG4gICAgICAgIGlmIChsYXN0KSB7XG4gICAgICAgICAgdHJpZ2dlckV2ZW50cyhsYXN0LCBbJ21vdXNlb3V0JywgJ3RhcGRyYWdvdXQnXSwgZSwge1xuICAgICAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICAgICAgeTogcG9zWzFdXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5lYXIpIHtcbiAgICAgICAgICB0cmlnZ2VyRXZlbnRzKG5lYXIsIFsnbW91c2VvdmVyJywgJ3RhcGRyYWdvdmVyJ10sIGUsIHtcbiAgICAgICAgICAgIHg6IHBvc1swXSxcbiAgICAgICAgICAgIHk6IHBvc1sxXVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHIuaG92ZXJEYXRhLmxhc3QgPSBuZWFyO1xuICAgICAgfVxuICAgICAgaWYgKGRvd24pIHtcbiAgICAgICAgaWYgKGlzT3ZlclRocmVzaG9sZERyYWcpIHtcbiAgICAgICAgICAvLyB0aGVuIHdlIGNhbiB0YWtlIGFjdGlvblxuXG4gICAgICAgICAgaWYgKGN5LmJveFNlbGVjdGlvbkVuYWJsZWQoKSAmJiBtdWx0U2VsS2V5RG93bikge1xuICAgICAgICAgICAgLy8gdGhlbiBzZWxlY3Rpb24gb3ZlcnJpZGVzXG4gICAgICAgICAgICBpZiAoZG93biAmJiBkb3duLmdyYWJiZWQoKSkge1xuICAgICAgICAgICAgICBmcmVlRHJhZ2dlZEVsZW1lbnRzKGRyYWdnZWRFbGVtZW50cyk7XG4gICAgICAgICAgICAgIGRvd24uZW1pdChtYWtlRXZlbnQoJ2ZyZWVvbicpKTtcbiAgICAgICAgICAgICAgZHJhZ2dlZEVsZW1lbnRzLmVtaXQobWFrZUV2ZW50KCdmcmVlJykpO1xuICAgICAgICAgICAgICBpZiAoci5kcmFnRGF0YS5kaWREcmFnKSB7XG4gICAgICAgICAgICAgICAgZG93bi5lbWl0KG1ha2VFdmVudCgnZHJhZ2ZyZWVvbicpKTtcbiAgICAgICAgICAgICAgICBkcmFnZ2VkRWxlbWVudHMuZW1pdChtYWtlRXZlbnQoJ2RyYWdmcmVlJykpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBnb0ludG9Cb3hNb2RlKCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChkb3duICYmIGRvd24uZ3JhYmJlZCgpICYmIHIubm9kZUlzRHJhZ2dhYmxlKGRvd24pKSB7XG4gICAgICAgICAgICAvLyBkcmFnIG5vZGVcbiAgICAgICAgICAgIHZhciBqdXN0U3RhcnRlZERyYWcgPSAhci5kcmFnRGF0YS5kaWREcmFnO1xuICAgICAgICAgICAgaWYgKGp1c3RTdGFydGVkRHJhZykge1xuICAgICAgICAgICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHIuZHJhZ0RhdGEuZGlkRHJhZyA9IHRydWU7IC8vIGluZGljYXRlIHRoYXQgd2UgYWN0dWFsbHkgZGlkIGRyYWcgdGhlIG5vZGVcblxuICAgICAgICAgICAgLy8gbm93LCBhZGQgdGhlIGVsZW1lbnRzIHRvIHRoZSBkcmFnIGxheWVyIGlmIG5vdCBkb25lIGFscmVhZHlcbiAgICAgICAgICAgIGlmICghci5ob3ZlckRhdGEuZHJhZ2dpbmdFbGVzKSB7XG4gICAgICAgICAgICAgIGFkZE5vZGVzVG9EcmFnKGRyYWdnZWRFbGVtZW50cywge1xuICAgICAgICAgICAgICAgIGluRHJhZ0xheWVyOiB0cnVlXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHRvdGFsU2hpZnQgPSB7XG4gICAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICAgIHk6IDBcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAobnVtYmVyJDEoZGlzcFswXSkgJiYgbnVtYmVyJDEoZGlzcFsxXSkpIHtcbiAgICAgICAgICAgICAgdG90YWxTaGlmdC54ICs9IGRpc3BbMF07XG4gICAgICAgICAgICAgIHRvdGFsU2hpZnQueSArPSBkaXNwWzFdO1xuICAgICAgICAgICAgICBpZiAoanVzdFN0YXJ0ZWREcmFnKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRyYWdEZWx0YSA9IHIuaG92ZXJEYXRhLmRyYWdEZWx0YTtcbiAgICAgICAgICAgICAgICBpZiAoZHJhZ0RlbHRhICYmIG51bWJlciQxKGRyYWdEZWx0YVswXSkgJiYgbnVtYmVyJDEoZHJhZ0RlbHRhWzFdKSkge1xuICAgICAgICAgICAgICAgICAgdG90YWxTaGlmdC54ICs9IGRyYWdEZWx0YVswXTtcbiAgICAgICAgICAgICAgICAgIHRvdGFsU2hpZnQueSArPSBkcmFnRGVsdGFbMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByLmhvdmVyRGF0YS5kcmFnZ2luZ0VsZXMgPSB0cnVlO1xuICAgICAgICAgICAgZHJhZ2dlZEVsZW1lbnRzLnNpbGVudFNoaWZ0KHRvdGFsU2hpZnQpLmVtaXQobWFrZUV2ZW50KCdwb3NpdGlvbicpKS5lbWl0KG1ha2VFdmVudCgnZHJhZycpKTtcbiAgICAgICAgICAgIHIucmVkcmF3SGludCgnZHJhZycsIHRydWUpO1xuICAgICAgICAgICAgci5yZWRyYXcoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gb3RoZXJ3aXNlIHNhdmUgZHJhZyBkZWx0YSBmb3Igd2hlbiB3ZSBhY3R1YWxseSBzdGFydCBkcmFnZ2luZyBzbyB0aGUgcmVsYXRpdmUgZ3JhYiBwb3MgaXMgY29uc3RhbnRcbiAgICAgICAgICB1cGRhdGVEcmFnRGVsdGEoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBwcmV2ZW50IHRoZSBkcmFnZ2luZyBmcm9tIHRyaWdnZXJpbmcgdGV4dCBzZWxlY3Rpb24gb24gdGhlIHBhZ2VcbiAgICAgIHByZXZlbnREZWZhdWx0ID0gdHJ1ZTtcbiAgICB9XG4gICAgc2VsZWN0WzJdID0gcG9zWzBdO1xuICAgIHNlbGVjdFszXSA9IHBvc1sxXTtcbiAgICBpZiAocHJldmVudERlZmF1bHQpIHtcbiAgICAgIGlmIChlLnN0b3BQcm9wYWdhdGlvbikgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGlmIChlLnByZXZlbnREZWZhdWx0KSBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LCBmYWxzZSk7XG4gIHZhciBjbGlja1RpbWVvdXQsIGRpZERvdWJsZUNsaWNrLCBwcmV2Q2xpY2tUaW1lU3RhbXA7XG4gIHIucmVnaXN0ZXJCaW5kaW5nKGNvbnRhaW5lcldpbmRvdywgJ21vdXNldXAnLCBmdW5jdGlvbiBtb3VzZXVwSGFuZGxlcihlKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuICAgIC8vIGR1cmluZyBsZWZ0IG1vdXNlIGJ1dHRvbiBnZXN0dXJlcywgaWdub3JlIG90aGVyIGJ1dHRvbnNcbiAgICBpZiAoci5ob3ZlckRhdGEud2hpY2ggPT09IDEgJiYgZS53aGljaCAhPT0gMSAmJiByLmhvdmVyRGF0YS5jYXB0dXJlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBjYXB0dXJlID0gci5ob3ZlckRhdGEuY2FwdHVyZTtcbiAgICBpZiAoIWNhcHR1cmUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgci5ob3ZlckRhdGEuY2FwdHVyZSA9IGZhbHNlO1xuICAgIHZhciBjeSA9IHIuY3k7XG4gICAgdmFyIHBvcyA9IHIucHJvamVjdEludG9WaWV3cG9ydChlLmNsaWVudFgsIGUuY2xpZW50WSk7XG4gICAgdmFyIHNlbGVjdCA9IHIuc2VsZWN0aW9uO1xuICAgIHZhciBuZWFyID0gci5maW5kTmVhcmVzdEVsZW1lbnQocG9zWzBdLCBwb3NbMV0sIHRydWUsIGZhbHNlKTtcbiAgICB2YXIgZHJhZ2dlZEVsZW1lbnRzID0gci5kcmFnRGF0YS5wb3NzaWJsZURyYWdFbGVtZW50cztcbiAgICB2YXIgZG93biA9IHIuaG92ZXJEYXRhLmRvd247XG4gICAgdmFyIG11bHRTZWxLZXlEb3duID0gaXNNdWx0U2VsS2V5RG93bihlKTtcbiAgICBpZiAoci5kYXRhLmJnQWN0aXZlUG9zaXN0aW9uKSB7XG4gICAgICByLnJlZHJhd0hpbnQoJ3NlbGVjdCcsIHRydWUpO1xuICAgICAgci5yZWRyYXcoKTtcbiAgICB9XG4gICAgci5ob3ZlckRhdGEudGFwaG9sZENhbmNlbGxlZCA9IHRydWU7XG4gICAgci5kYXRhLmJnQWN0aXZlUG9zaXN0aW9uID0gdW5kZWZpbmVkOyAvLyBub3QgYWN0aXZlIGJnIG5vd1xuXG4gICAgaWYgKGRvd24pIHtcbiAgICAgIGRvd24udW5hY3RpdmF0ZSgpO1xuICAgIH1cbiAgICB2YXIgbWFrZUV2ZW50ID0gZnVuY3Rpb24gbWFrZUV2ZW50KHR5cGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICAgIHk6IHBvc1sxXVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH07XG4gICAgaWYgKHIuaG92ZXJEYXRhLndoaWNoID09PSAzKSB7XG4gICAgICB2YXIgY3h0RXZ0ID0gbWFrZUV2ZW50KCdjeHR0YXBlbmQnKTtcbiAgICAgIGlmIChkb3duKSB7XG4gICAgICAgIGRvd24uZW1pdChjeHRFdnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3kuZW1pdChjeHRFdnQpO1xuICAgICAgfVxuICAgICAgaWYgKCFyLmhvdmVyRGF0YS5jeHREcmFnZ2VkKSB7XG4gICAgICAgIHZhciBjeHRUYXAgPSBtYWtlRXZlbnQoJ2N4dHRhcCcpO1xuICAgICAgICBpZiAoZG93bikge1xuICAgICAgICAgIGRvd24uZW1pdChjeHRUYXApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN5LmVtaXQoY3h0VGFwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgci5ob3ZlckRhdGEuY3h0RHJhZ2dlZCA9IGZhbHNlO1xuICAgICAgci5ob3ZlckRhdGEud2hpY2ggPSBudWxsO1xuICAgIH0gZWxzZSBpZiAoci5ob3ZlckRhdGEud2hpY2ggPT09IDEpIHtcbiAgICAgIHRyaWdnZXJFdmVudHMobmVhciwgWydtb3VzZXVwJywgJ3RhcGVuZCcsICd2bW91c2V1cCddLCBlLCB7XG4gICAgICAgIHg6IHBvc1swXSxcbiAgICAgICAgeTogcG9zWzFdXG4gICAgICB9KTtcbiAgICAgIGlmICghci5kcmFnRGF0YS5kaWREcmFnICYmXG4gICAgICAvLyBkaWRuJ3QgbW92ZSBhIG5vZGUgYXJvdW5kXG4gICAgICAhci5ob3ZlckRhdGEuZHJhZ2dlZCAmJlxuICAgICAgLy8gZGlkbid0IHBhblxuICAgICAgIXIuaG92ZXJEYXRhLnNlbGVjdGluZyAmJlxuICAgICAgLy8gbm90IGJveCBzZWxlY3Rpb25cbiAgICAgICFyLmhvdmVyRGF0YS5pc092ZXJUaHJlc2hvbGREcmFnIC8vIGRpZG4ndCBtb3ZlIHRvbyBtdWNoXG4gICAgICApIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50cyhkb3duLCBbXCJjbGlja1wiLCBcInRhcFwiLCBcInZjbGlja1wiXSwgZSwge1xuICAgICAgICAgIHg6IHBvc1swXSxcbiAgICAgICAgICB5OiBwb3NbMV1cbiAgICAgICAgfSk7XG4gICAgICAgIGRpZERvdWJsZUNsaWNrID0gZmFsc2U7XG4gICAgICAgIGlmIChlLnRpbWVTdGFtcCAtIHByZXZDbGlja1RpbWVTdGFtcCA8PSBjeS5tdWx0aUNsaWNrRGVib3VuY2VUaW1lKCkpIHtcbiAgICAgICAgICBjbGlja1RpbWVvdXQgJiYgY2xlYXJUaW1lb3V0KGNsaWNrVGltZW91dCk7XG4gICAgICAgICAgZGlkRG91YmxlQ2xpY2sgPSB0cnVlO1xuICAgICAgICAgIHByZXZDbGlja1RpbWVTdGFtcCA9IG51bGw7XG4gICAgICAgICAgdHJpZ2dlckV2ZW50cyhkb3duLCBbXCJkYmxjbGlja1wiLCBcImRibHRhcFwiLCBcInZkYmxjbGlja1wiXSwgZSwge1xuICAgICAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICAgICAgeTogcG9zWzFdXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2xpY2tUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoZGlkRG91YmxlQ2xpY2spIHJldHVybjtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudHMoZG93biwgW1wib25lY2xpY2tcIiwgXCJvbmV0YXBcIiwgXCJ2b25lY2xpY2tcIl0sIGUsIHtcbiAgICAgICAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICAgICAgICB5OiBwb3NbMV1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sIGN5Lm11bHRpQ2xpY2tEZWJvdW5jZVRpbWUoKSk7XG4gICAgICAgICAgcHJldkNsaWNrVGltZVN0YW1wID0gZS50aW1lU3RhbXA7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRGVzZWxlY3QgYWxsIGVsZW1lbnRzIGlmIG5vdGhpbmcgaXMgY3VycmVudGx5IHVuZGVyIHRoZSBtb3VzZSBjdXJzb3IgYW5kIHdlIGFyZW4ndCBkcmFnZ2luZyBzb21ldGhpbmdcbiAgICAgIGlmIChkb3duID09IG51bGwgLy8gbm90IG1vdXNlZG93biBvbiBub2RlXG4gICAgICAmJiAhci5kcmFnRGF0YS5kaWREcmFnIC8vIGRpZG4ndCBtb3ZlIHRoZSBub2RlIGFyb3VuZFxuICAgICAgJiYgIXIuaG92ZXJEYXRhLnNlbGVjdGluZyAvLyBub3QgYm94IHNlbGVjdGlvblxuICAgICAgJiYgIXIuaG92ZXJEYXRhLmRyYWdnZWQgLy8gZGlkbid0IHBhblxuICAgICAgJiYgIWlzTXVsdFNlbEtleURvd24oZSkpIHtcbiAgICAgICAgY3kuJChpc1NlbGVjdGVkKS51bnNlbGVjdChbJ3RhcHVuc2VsZWN0J10pO1xuICAgICAgICBpZiAoZHJhZ2dlZEVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICByLmRyYWdEYXRhLnBvc3NpYmxlRHJhZ0VsZW1lbnRzID0gZHJhZ2dlZEVsZW1lbnRzID0gY3kuY29sbGVjdGlvbigpO1xuICAgICAgfVxuXG4gICAgICAvLyBTaW5nbGUgc2VsZWN0aW9uXG4gICAgICBpZiAobmVhciA9PSBkb3duICYmICFyLmRyYWdEYXRhLmRpZERyYWcgJiYgIXIuaG92ZXJEYXRhLnNlbGVjdGluZykge1xuICAgICAgICBpZiAobmVhciAhPSBudWxsICYmIG5lYXIuX3ByaXZhdGUuc2VsZWN0YWJsZSkge1xuICAgICAgICAgIGlmIChyLmhvdmVyRGF0YS5kcmFnZ2luZykgOyBlbHNlIGlmIChjeS5zZWxlY3Rpb25UeXBlKCkgPT09ICdhZGRpdGl2ZScgfHwgbXVsdFNlbEtleURvd24pIHtcbiAgICAgICAgICAgIGlmIChuZWFyLnNlbGVjdGVkKCkpIHtcbiAgICAgICAgICAgICAgbmVhci51bnNlbGVjdChbJ3RhcHVuc2VsZWN0J10pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbmVhci5zZWxlY3QoWyd0YXBzZWxlY3QnXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghbXVsdFNlbEtleURvd24pIHtcbiAgICAgICAgICAgICAgY3kuJChpc1NlbGVjdGVkKS51bm1lcmdlKG5lYXIpLnVuc2VsZWN0KFsndGFwdW5zZWxlY3QnXSk7XG4gICAgICAgICAgICAgIG5lYXIuc2VsZWN0KFsndGFwc2VsZWN0J10pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHIuaG92ZXJEYXRhLnNlbGVjdGluZykge1xuICAgICAgICB2YXIgYm94ID0gY3kuY29sbGVjdGlvbihyLmdldEFsbEluQm94KHNlbGVjdFswXSwgc2VsZWN0WzFdLCBzZWxlY3RbMl0sIHNlbGVjdFszXSkpO1xuICAgICAgICByLnJlZHJhd0hpbnQoJ3NlbGVjdCcsIHRydWUpO1xuICAgICAgICBpZiAoYm94Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBjeS5lbWl0KG1ha2VFdmVudCgnYm94ZW5kJykpO1xuICAgICAgICB2YXIgZWxlV291bGRCZVNlbGVjdGVkID0gZnVuY3Rpb24gZWxlV291bGRCZVNlbGVjdGVkKGVsZSkge1xuICAgICAgICAgIHJldHVybiBlbGUuc2VsZWN0YWJsZSgpICYmICFlbGUuc2VsZWN0ZWQoKTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGN5LnNlbGVjdGlvblR5cGUoKSA9PT0gJ2FkZGl0aXZlJykge1xuICAgICAgICAgIGJveC5lbWl0KG1ha2VFdmVudCgnYm94JykpLnN0ZEZpbHRlcihlbGVXb3VsZEJlU2VsZWN0ZWQpLnNlbGVjdCgpLmVtaXQobWFrZUV2ZW50KCdib3hzZWxlY3QnKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCFtdWx0U2VsS2V5RG93bikge1xuICAgICAgICAgICAgY3kuJChpc1NlbGVjdGVkKS51bm1lcmdlKGJveCkudW5zZWxlY3QoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYm94LmVtaXQobWFrZUV2ZW50KCdib3gnKSkuc3RkRmlsdGVyKGVsZVdvdWxkQmVTZWxlY3RlZCkuc2VsZWN0KCkuZW1pdChtYWtlRXZlbnQoJ2JveHNlbGVjdCcpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFsd2F5cyBuZWVkIHJlZHJhdyBpbiBjYXNlIGVsZXMgdW5zZWxlY3RhYmxlXG4gICAgICAgIHIucmVkcmF3KCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENhbmNlbCBkcmFnIHBhblxuICAgICAgaWYgKHIuaG92ZXJEYXRhLmRyYWdnaW5nKSB7XG4gICAgICAgIHIuaG92ZXJEYXRhLmRyYWdnaW5nID0gZmFsc2U7XG4gICAgICAgIHIucmVkcmF3SGludCgnc2VsZWN0JywgdHJ1ZSk7XG4gICAgICAgIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICAgICAgICByLnJlZHJhdygpO1xuICAgICAgfVxuICAgICAgaWYgKCFzZWxlY3RbNF0pIHtcbiAgICAgICAgci5yZWRyYXdIaW50KCdkcmFnJywgdHJ1ZSk7XG4gICAgICAgIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICAgICAgICB2YXIgZG93bldhc0dyYWJiZWQgPSBkb3duICYmIGRvd24uZ3JhYmJlZCgpO1xuICAgICAgICBmcmVlRHJhZ2dlZEVsZW1lbnRzKGRyYWdnZWRFbGVtZW50cyk7XG4gICAgICAgIGlmIChkb3duV2FzR3JhYmJlZCkge1xuICAgICAgICAgIGRvd24uZW1pdChtYWtlRXZlbnQoJ2ZyZWVvbicpKTtcbiAgICAgICAgICBkcmFnZ2VkRWxlbWVudHMuZW1pdChtYWtlRXZlbnQoJ2ZyZWUnKSk7XG4gICAgICAgICAgaWYgKHIuZHJhZ0RhdGEuZGlkRHJhZykge1xuICAgICAgICAgICAgZG93bi5lbWl0KG1ha2VFdmVudCgnZHJhZ2ZyZWVvbicpKTtcbiAgICAgICAgICAgIGRyYWdnZWRFbGVtZW50cy5lbWl0KG1ha2VFdmVudCgnZHJhZ2ZyZWUnKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSAvLyBlbHNlIG5vdCByaWdodCBtb3VzZVxuXG4gICAgc2VsZWN0WzRdID0gMDtcbiAgICByLmhvdmVyRGF0YS5kb3duID0gbnVsbDtcbiAgICByLmhvdmVyRGF0YS5jeHRTdGFydGVkID0gZmFsc2U7XG4gICAgci5ob3ZlckRhdGEuZHJhZ2dpbmdFbGVzID0gZmFsc2U7XG4gICAgci5ob3ZlckRhdGEuc2VsZWN0aW5nID0gZmFsc2U7XG4gICAgci5ob3ZlckRhdGEuaXNPdmVyVGhyZXNob2xkRHJhZyA9IGZhbHNlO1xuICAgIHIuZHJhZ0RhdGEuZGlkRHJhZyA9IGZhbHNlO1xuICAgIHIuaG92ZXJEYXRhLmRyYWdnZWQgPSBmYWxzZTtcbiAgICByLmhvdmVyRGF0YS5kcmFnRGVsdGEgPSBbXTtcbiAgICByLmhvdmVyRGF0YS5tZG93blBvcyA9IG51bGw7XG4gICAgci5ob3ZlckRhdGEubWRvd25HUG9zID0gbnVsbDtcbiAgICByLmhvdmVyRGF0YS53aGljaCA9IG51bGw7XG4gIH0sIGZhbHNlKTtcbiAgdmFyIHdoZWVsRGVsdGFzID0gW107IC8vIGxvZyBvZiBmaXJzdCBOIHdoZWVsIGRlbHRhcycgbWFnbml0dWRlc1xuICB2YXIgd2hlZWxEZWx0YU4gPSA0OyAvLyBob3cgbWFueSBldmVudHMgdG8gbG9nXG4gIHZhciBpbmFjY3VyYXRlU2Nyb2xsRGV2aWNlO1xuICB2YXIgaW5hY2N1cmF0ZVNjcm9sbEZhY3RvciA9IDEwMDAwMDsgLy8gYmFzZSBvZiBpbmFjY3VyYXRlIHdoZWVsIGRlbHRhcyAoZS5nLiBiYXNlIDUgY291bGQgeWllbGQgd2hlZWxzIG9mIDEwLCAyNSwgNTAsIGV0Yy4pXG5cbiAgdmFyIGFsbEFyZVNhbWVNYWduaXR1ZGUgPSBmdW5jdGlvbiBhbGxBcmVTYW1lTWFnbml0dWRlKGxpc3QpIHtcbiAgICB2YXIgZmlyc3RNYWcgPSBNYXRoLmFicyhsaXN0WzBdKTtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChNYXRoLmFicyhsaXN0W2ldKSAhPT0gZmlyc3RNYWcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbiAgdmFyIHdoZWVsSGFuZGxlciA9IGZ1bmN0aW9uIHdoZWVsSGFuZGxlcihlKSB7XG4gICAgdmFyIGNsYW1wID0gZmFsc2U7XG4gICAgdmFyIGRlbHRhID0gZS5kZWx0YVk7XG4gICAgaWYgKGRlbHRhID09IG51bGwpIHtcbiAgICAgIC8vIGNvbXBhdGliaWxpdHkgd2l0aCBvbGQgYnJvd3NlcnNcbiAgICAgIGlmIChlLndoZWVsRGVsdGFZICE9IG51bGwpIHtcbiAgICAgICAgZGVsdGEgPSBlLndoZWVsRGVsdGFZIC8gNDtcbiAgICAgIH0gZWxzZSBpZiAoZS53aGVlbERlbHRhICE9IG51bGwpIHtcbiAgICAgICAgZGVsdGEgPSBlLndoZWVsRGVsdGEgLyA0O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGVsdGEgPT09IDApIHtcbiAgICAgIHJldHVybjsgLy8gbm8gY2hhbmdlIGluIHpvb20gKEJ1ZzogWm9vbSBiZWNvbWVzIGVycmF0aWMgb24gcmFwaWQgc2Nyb2xsIGR1ZSB0byBkZWx0YVk6IDAgZXZlbnQgIzMzOTQpXG4gICAgfVxuICAgIGlmIChpbmFjY3VyYXRlU2Nyb2xsRGV2aWNlID09IG51bGwpIHtcbiAgICAgIGlmICh3aGVlbERlbHRhcy5sZW5ndGggPj0gd2hlZWxEZWx0YU4pIHtcbiAgICAgICAgLy8gdXNlIGxvZyB0byBkZXRlcm1pbmUgaWYgaW5hY2N1cmF0ZVxuICAgICAgICBpbmFjY3VyYXRlU2Nyb2xsRGV2aWNlID0gZmFsc2U7XG4gICAgICAgIHZhciB3ZHMgPSB3aGVlbERlbHRhcztcbiAgICAgICAgaWYgKHdkc1swXSA+PSA1KSB7XG4gICAgICAgICAgdmFyIGZhY3RvcjtcbiAgICAgICAgICAvLyBhbiBhcnJheSBvZiBlcXVhbCBpbnRlZ2VycyBcInhcIiB3aWxsIGhhdmUgYSBHQ0Qgb2YgeCwgc28gaW4gdGhhdFxuICAgICAgICAgIC8vIGNhc2UgdGhlcmUgaXMgbm8gbmVlZCB0byBoYXZlIGEgc2VwYXJhdGUgXCJhbGxBcmVTYW1lTWFnbml0dWRlXCJcbiAgICAgICAgICAvLyBjaGVjay4gYnV0IHRoZSBHQ0QgZnVuY3Rpb24gb25seSBzdXBwb3J0cyBpbnRlZ2Vycywgc28ga2VlcGluZ1xuICAgICAgICAgIC8vIGJvdGggY2hlY2tzIGFsbG93cyBhcnJheXMgb2YgZXF1YWwgZmxvYXRpbmctcG9pbnQgbnVtYmVyc1xuICAgICAgICAgIGlmIChhbGxBcmVTYW1lTWFnbml0dWRlKHdkcykpIHtcbiAgICAgICAgICAgIGZhY3RvciA9IHdkc1swXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmFjdG9yID0gZ2NkTXVsdGlwbGVaZXJvSWZOb25JbnQod2RzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGZhY3RvciA+IDEpIHtcbiAgICAgICAgICAgIGluYWNjdXJhdGVTY3JvbGxEZXZpY2UgPSB0cnVlO1xuICAgICAgICAgICAgaW5hY2N1cmF0ZVNjcm9sbEZhY3RvciA9IGZhY3RvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gY29uc29sZS5sb2coJ1NhbXBsZWQgd2hlZWwgZGVsdGFzOicsIHdkcyk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdpbmFjY3VyYXRlU2Nyb2xsRGV2aWNlOicsIGluYWNjdXJhdGVTY3JvbGxEZXZpY2UpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnaW5hY2N1cmF0ZVNjcm9sbEZhY3RvcjonLCBpbmFjY3VyYXRlU2Nyb2xsRmFjdG9yKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGNsYW1wIGFuZCBsb2cgdW50aWwgd2UgcmVhY2ggTlxuICAgICAgICB3aGVlbERlbHRhcy5wdXNoKE1hdGguYWJzKGRlbHRhKSk7XG4gICAgICAgIGNsYW1wID0gdHJ1ZTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ0NsYW1waW5nIGluaXRpYWwgd2hlZWwgZXZlbnRzIHVudGlsIHdlIGdldCBhIGdvb2Qgc2FtcGxlJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpbmFjY3VyYXRlU2Nyb2xsRGV2aWNlKSB7XG4gICAgICAvLyBrZWVwIHVwZGF0aW5nXG4gICAgICBpbmFjY3VyYXRlU2Nyb2xsRmFjdG9yID0gTWF0aC5taW4oTWF0aC5hYnMoZGVsdGEpLCBpbmFjY3VyYXRlU2Nyb2xsRmFjdG9yKTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdLZWVwIHVwZGF0aW5nIGluYWNjdXJhdGVTY3JvbGxGYWN0b3IgYmV5b25kIHNhbXBsZSBpbiBjYXNlIHdlIGRpZCBub3QgZ2V0IHRoZSBzbWFsbGVzdCBwb3NzaWJsZSB2YWw6JywgaW5hY2N1cmF0ZVNjcm9sbEZhY3Rvcik7XG4gICAgfVxuICAgIGlmIChyLnNjcm9sbGluZ1BhZ2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIHdoaWxlIHNjcm9sbGluZywgaWdub3JlIHdoZWVsLXRvLXpvb21cblxuICAgIHZhciBjeSA9IHIuY3k7XG4gICAgdmFyIHpvb20gPSBjeS56b29tKCk7XG4gICAgdmFyIHBhbiA9IGN5LnBhbigpO1xuICAgIHZhciBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZS5jbGllbnRYLCBlLmNsaWVudFkpO1xuICAgIHZhciBycG9zID0gW3Bvc1swXSAqIHpvb20gKyBwYW4ueCwgcG9zWzFdICogem9vbSArIHBhbi55XTtcbiAgICBpZiAoci5ob3ZlckRhdGEuZHJhZ2dpbmdFbGVzIHx8IHIuaG92ZXJEYXRhLmRyYWdnaW5nIHx8IHIuaG92ZXJEYXRhLmN4dFN0YXJ0ZWQgfHwgaW5Cb3hTZWxlY3Rpb24oKSkge1xuICAgICAgLy8gaWYgcGFuIGRyYWdnaW5nIG9yIGN4dCBkcmFnZ2luZywgd2hlZWwgbW92ZW1lbnRzIG1ha2Ugbm8gem9vbVxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoY3kucGFubmluZ0VuYWJsZWQoKSAmJiBjeS51c2VyUGFubmluZ0VuYWJsZWQoKSAmJiBjeS56b29taW5nRW5hYmxlZCgpICYmIGN5LnVzZXJab29taW5nRW5hYmxlZCgpKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICByLmRhdGEud2hlZWxab29taW5nID0gdHJ1ZTtcbiAgICAgIGNsZWFyVGltZW91dChyLmRhdGEud2hlZWxUaW1lb3V0KTtcbiAgICAgIHIuZGF0YS53aGVlbFRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgci5kYXRhLndoZWVsWm9vbWluZyA9IGZhbHNlO1xuICAgICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgICAgci5yZWRyYXcoKTtcbiAgICAgIH0sIDE1MCk7XG4gICAgICB2YXIgZGlmZjtcbiAgICAgIGlmIChjbGFtcCAmJiBNYXRoLmFicyhkZWx0YSkgPiA1KSB7XG4gICAgICAgIGRlbHRhID0gc2lnbnVtKGRlbHRhKSAqIDU7XG4gICAgICB9XG4gICAgICBkaWZmID0gZGVsdGEgLyAtMjUwO1xuICAgICAgaWYgKGluYWNjdXJhdGVTY3JvbGxEZXZpY2UpIHtcbiAgICAgICAgZGlmZiAvPSBpbmFjY3VyYXRlU2Nyb2xsRmFjdG9yO1xuICAgICAgICBkaWZmICo9IDM7XG4gICAgICB9XG4gICAgICBkaWZmID0gZGlmZiAqIHIud2hlZWxTZW5zaXRpdml0eTtcblxuICAgICAgLy8gY29uc29sZS5sb2coYGRlbHRhID0gJHtkZWx0YX0sIGRpZmYgPSAke2RpZmZ9LCBtb2RlID0gJHtlLmRlbHRhTW9kZX1gKVxuXG4gICAgICB2YXIgbmVlZHNXaGVlbEZpeCA9IGUuZGVsdGFNb2RlID09PSAxO1xuICAgICAgaWYgKG5lZWRzV2hlZWxGaXgpIHtcbiAgICAgICAgLy8gZml4ZXMgc2xvdyB3aGVlbCBldmVudHMgb24gZmYvbGludXggYW5kIGZmL3dpbmRvd3NcbiAgICAgICAgZGlmZiAqPSAzMztcbiAgICAgIH1cbiAgICAgIHZhciBuZXdab29tID0gY3kuem9vbSgpICogTWF0aC5wb3coMTAsIGRpZmYpO1xuICAgICAgaWYgKGUudHlwZSA9PT0gJ2dlc3R1cmVjaGFuZ2UnKSB7XG4gICAgICAgIG5ld1pvb20gPSByLmdlc3R1cmVTdGFydFpvb20gKiBlLnNjYWxlO1xuICAgICAgfVxuICAgICAgY3kuem9vbSh7XG4gICAgICAgIGxldmVsOiBuZXdab29tLFxuICAgICAgICByZW5kZXJlZFBvc2l0aW9uOiB7XG4gICAgICAgICAgeDogcnBvc1swXSxcbiAgICAgICAgICB5OiBycG9zWzFdXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY3kuZW1pdCh7XG4gICAgICAgIHR5cGU6IGUudHlwZSA9PT0gJ2dlc3R1cmVjaGFuZ2UnID8gJ3BpbmNoem9vbScgOiAnc2Nyb2xsem9vbScsXG4gICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICAgIHk6IHBvc1sxXVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgLy8gRnVuY3Rpb25zIHRvIGhlbHAgd2l0aCB3aGV0aGVyIG1vdXNlIHdoZWVsIHNob3VsZCB0cmlnZ2VyIHpvb21pbmdcbiAgLy8gLS1cbiAgci5yZWdpc3RlckJpbmRpbmcoci5jb250YWluZXIsICd3aGVlbCcsIHdoZWVsSGFuZGxlciwgdHJ1ZSk7XG5cbiAgLy8gZGlzYWJsZSBub25zdGFuZGFyZCB3aGVlbCBldmVudHNcbiAgLy8gci5yZWdpc3RlckJpbmRpbmcoci5jb250YWluZXIsICdtb3VzZXdoZWVsJywgd2hlZWxIYW5kbGVyLCB0cnVlKTtcbiAgLy8gci5yZWdpc3RlckJpbmRpbmcoci5jb250YWluZXIsICdET01Nb3VzZVNjcm9sbCcsIHdoZWVsSGFuZGxlciwgdHJ1ZSk7XG4gIC8vIHIucmVnaXN0ZXJCaW5kaW5nKHIuY29udGFpbmVyLCAnTW96TW91c2VQaXhlbFNjcm9sbCcsIHdoZWVsSGFuZGxlciwgdHJ1ZSk7IC8vIG9sZGVyIGZpcmVmb3hcblxuICByLnJlZ2lzdGVyQmluZGluZyhjb250YWluZXJXaW5kb3csICdzY3JvbGwnLCBmdW5jdGlvbiBzY3JvbGxIYW5kbGVyKGUpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgci5zY3JvbGxpbmdQYWdlID0gdHJ1ZTtcbiAgICBjbGVhclRpbWVvdXQoci5zY3JvbGxpbmdQYWdlVGltZW91dCk7XG4gICAgci5zY3JvbGxpbmdQYWdlVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgci5zY3JvbGxpbmdQYWdlID0gZmFsc2U7XG4gICAgfSwgMjUwKTtcbiAgfSwgdHJ1ZSk7XG5cbiAgLy8gZGVza3RvcCBzYWZhcmkgcGluY2ggdG8gem9vbSBzdGFydFxuICByLnJlZ2lzdGVyQmluZGluZyhyLmNvbnRhaW5lciwgJ2dlc3R1cmVzdGFydCcsIGZ1bmN0aW9uIGdlc3R1cmVTdGFydEhhbmRsZXIoZSkge1xuICAgIHIuZ2VzdHVyZVN0YXJ0Wm9vbSA9IHIuY3kuem9vbSgpO1xuICAgIGlmICghci5oYXNUb3VjaFN0YXJ0ZWQpIHtcbiAgICAgIC8vIGRvbid0IGFmZmVjdCB0b3VjaCBkZXZpY2VzIGxpa2UgaXBob25lXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9LCB0cnVlKTtcbiAgci5yZWdpc3RlckJpbmRpbmcoci5jb250YWluZXIsICdnZXN0dXJlY2hhbmdlJywgZnVuY3Rpb24gKGUpIHtcbiAgICBpZiAoIXIuaGFzVG91Y2hTdGFydGVkKSB7XG4gICAgICAvLyBkb24ndCBhZmZlY3QgdG91Y2ggZGV2aWNlcyBsaWtlIGlwaG9uZVxuICAgICAgd2hlZWxIYW5kbGVyKGUpO1xuICAgIH1cbiAgfSwgdHJ1ZSk7XG5cbiAgLy8gRnVuY3Rpb25zIHRvIGhlbHAgd2l0aCBoYW5kbGluZyBtb3VzZW91dC9tb3VzZW92ZXIgb24gdGhlIEN5dG9zY2FwZSBjb250YWluZXJcbiAgLy8gSGFuZGxlIG1vdXNlb3V0IG9uIEN5dG9zY2FwZSBjb250YWluZXJcbiAgci5yZWdpc3RlckJpbmRpbmcoci5jb250YWluZXIsICdtb3VzZW91dCcsIGZ1bmN0aW9uIG1vdXNlT3V0SGFuZGxlcihlKSB7XG4gICAgdmFyIHBvcyA9IHIucHJvamVjdEludG9WaWV3cG9ydChlLmNsaWVudFgsIGUuY2xpZW50WSk7XG4gICAgci5jeS5lbWl0KHtcbiAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICB0eXBlOiAnbW91c2VvdXQnLFxuICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICB5OiBwb3NbMV1cbiAgICAgIH1cbiAgICB9KTtcbiAgfSwgZmFsc2UpO1xuICByLnJlZ2lzdGVyQmluZGluZyhyLmNvbnRhaW5lciwgJ21vdXNlb3ZlcicsIGZ1bmN0aW9uIG1vdXNlT3ZlckhhbmRsZXIoZSkge1xuICAgIHZhciBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZS5jbGllbnRYLCBlLmNsaWVudFkpO1xuICAgIHIuY3kuZW1pdCh7XG4gICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgdHlwZTogJ21vdXNlb3ZlcicsXG4gICAgICBwb3NpdGlvbjoge1xuICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgIHk6IHBvc1sxXVxuICAgICAgfVxuICAgIH0pO1xuICB9LCBmYWxzZSk7XG4gIHZhciBmMXgxLCBmMXkxLCBmMngxLCBmMnkxOyAvLyBzdGFydGluZyBwb2ludHMgZm9yIHBpbmNoLXRvLXpvb21cbiAgdmFyIGRpc3RhbmNlMSwgZGlzdGFuY2UxU3E7IC8vIGluaXRpYWwgZGlzdGFuY2UgYmV0d2VlbiBmaW5nZXIgMSBhbmQgZmluZ2VyIDIgZm9yIHBpbmNoLXRvLXpvb21cbiAgdmFyIGNlbnRlcjEsIG1vZGVsQ2VudGVyMTsgLy8gY2VudGVyIHBvaW50IG9uIHN0YXJ0IHBpbmNoIHRvIHpvb21cbiAgdmFyIG9mZnNldExlZnQsIG9mZnNldFRvcDtcbiAgdmFyIGNvbnRhaW5lcldpZHRoLCBjb250YWluZXJIZWlnaHQ7XG4gIHZhciB0d29GaW5nZXJzU3RhcnRJbnNpZGU7XG4gIHZhciBkaXN0YW5jZSA9IGZ1bmN0aW9uIGRpc3RhbmNlKHgxLCB5MSwgeDIsIHkyKSB7XG4gICAgcmV0dXJuIE1hdGguc3FydCgoeDIgLSB4MSkgKiAoeDIgLSB4MSkgKyAoeTIgLSB5MSkgKiAoeTIgLSB5MSkpO1xuICB9O1xuICB2YXIgZGlzdGFuY2VTcSA9IGZ1bmN0aW9uIGRpc3RhbmNlU3EoeDEsIHkxLCB4MiwgeTIpIHtcbiAgICByZXR1cm4gKHgyIC0geDEpICogKHgyIC0geDEpICsgKHkyIC0geTEpICogKHkyIC0geTEpO1xuICB9O1xuICB2YXIgdG91Y2hzdGFydEhhbmRsZXI7XG4gIHIucmVnaXN0ZXJCaW5kaW5nKHIuY29udGFpbmVyLCAndG91Y2hzdGFydCcsIHRvdWNoc3RhcnRIYW5kbGVyID0gZnVuY3Rpb24gdG91Y2hzdGFydEhhbmRsZXIoZSkge1xuICAgIHIuaGFzVG91Y2hTdGFydGVkID0gdHJ1ZTtcbiAgICBpZiAoIWV2ZW50SW5Db250YWluZXIoZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYmx1ckFjdGl2ZURvbUVsZW1lbnQoKTtcbiAgICByLnRvdWNoRGF0YS5jYXB0dXJlID0gdHJ1ZTtcbiAgICByLmRhdGEuYmdBY3RpdmVQb3Npc3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgdmFyIGN5ID0gci5jeTtcbiAgICB2YXIgbm93ID0gci50b3VjaERhdGEubm93O1xuICAgIHZhciBlYXJsaWVyID0gci50b3VjaERhdGEuZWFybGllcjtcbiAgICBpZiAoZS50b3VjaGVzWzBdKSB7XG4gICAgICB2YXIgcG9zID0gci5wcm9qZWN0SW50b1ZpZXdwb3J0KGUudG91Y2hlc1swXS5jbGllbnRYLCBlLnRvdWNoZXNbMF0uY2xpZW50WSk7XG4gICAgICBub3dbMF0gPSBwb3NbMF07XG4gICAgICBub3dbMV0gPSBwb3NbMV07XG4gICAgfVxuICAgIGlmIChlLnRvdWNoZXNbMV0pIHtcbiAgICAgIHZhciBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZS50b3VjaGVzWzFdLmNsaWVudFgsIGUudG91Y2hlc1sxXS5jbGllbnRZKTtcbiAgICAgIG5vd1syXSA9IHBvc1swXTtcbiAgICAgIG5vd1szXSA9IHBvc1sxXTtcbiAgICB9XG4gICAgaWYgKGUudG91Y2hlc1syXSkge1xuICAgICAgdmFyIHBvcyA9IHIucHJvamVjdEludG9WaWV3cG9ydChlLnRvdWNoZXNbMl0uY2xpZW50WCwgZS50b3VjaGVzWzJdLmNsaWVudFkpO1xuICAgICAgbm93WzRdID0gcG9zWzBdO1xuICAgICAgbm93WzVdID0gcG9zWzFdO1xuICAgIH1cbiAgICB2YXIgbWFrZUV2ZW50ID0gZnVuY3Rpb24gbWFrZUV2ZW50KHR5cGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgeDogbm93WzBdLFxuICAgICAgICAgIHk6IG5vd1sxXVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH07XG5cbiAgICAvLyByZWNvcmQgc3RhcnRpbmcgcG9pbnRzIGZvciBwaW5jaC10by16b29tXG4gICAgaWYgKGUudG91Y2hlc1sxXSkge1xuICAgICAgci50b3VjaERhdGEuc2luZ2xlVG91Y2hNb3ZlZCA9IHRydWU7XG4gICAgICBmcmVlRHJhZ2dlZEVsZW1lbnRzKHIuZHJhZ0RhdGEudG91Y2hEcmFnRWxlcyk7XG4gICAgICB2YXIgb2Zmc2V0cyA9IHIuZmluZENvbnRhaW5lckNsaWVudENvb3JkcygpO1xuICAgICAgb2Zmc2V0TGVmdCA9IG9mZnNldHNbMF07XG4gICAgICBvZmZzZXRUb3AgPSBvZmZzZXRzWzFdO1xuICAgICAgY29udGFpbmVyV2lkdGggPSBvZmZzZXRzWzJdO1xuICAgICAgY29udGFpbmVySGVpZ2h0ID0gb2Zmc2V0c1szXTtcbiAgICAgIGYxeDEgPSBlLnRvdWNoZXNbMF0uY2xpZW50WCAtIG9mZnNldExlZnQ7XG4gICAgICBmMXkxID0gZS50b3VjaGVzWzBdLmNsaWVudFkgLSBvZmZzZXRUb3A7XG4gICAgICBmMngxID0gZS50b3VjaGVzWzFdLmNsaWVudFggLSBvZmZzZXRMZWZ0O1xuICAgICAgZjJ5MSA9IGUudG91Y2hlc1sxXS5jbGllbnRZIC0gb2Zmc2V0VG9wO1xuICAgICAgdHdvRmluZ2Vyc1N0YXJ0SW5zaWRlID0gMCA8PSBmMXgxICYmIGYxeDEgPD0gY29udGFpbmVyV2lkdGggJiYgMCA8PSBmMngxICYmIGYyeDEgPD0gY29udGFpbmVyV2lkdGggJiYgMCA8PSBmMXkxICYmIGYxeTEgPD0gY29udGFpbmVySGVpZ2h0ICYmIDAgPD0gZjJ5MSAmJiBmMnkxIDw9IGNvbnRhaW5lckhlaWdodDtcbiAgICAgIHZhciBwYW4gPSBjeS5wYW4oKTtcbiAgICAgIHZhciB6b29tID0gY3kuem9vbSgpO1xuICAgICAgZGlzdGFuY2UxID0gZGlzdGFuY2UoZjF4MSwgZjF5MSwgZjJ4MSwgZjJ5MSk7XG4gICAgICBkaXN0YW5jZTFTcSA9IGRpc3RhbmNlU3EoZjF4MSwgZjF5MSwgZjJ4MSwgZjJ5MSk7XG4gICAgICBjZW50ZXIxID0gWyhmMXgxICsgZjJ4MSkgLyAyLCAoZjF5MSArIGYyeTEpIC8gMl07XG4gICAgICBtb2RlbENlbnRlcjEgPSBbKGNlbnRlcjFbMF0gLSBwYW4ueCkgLyB6b29tLCAoY2VudGVyMVsxXSAtIHBhbi55KSAvIHpvb21dO1xuXG4gICAgICAvLyBjb25zaWRlciBjb250ZXh0IHRhcFxuICAgICAgdmFyIGN4dERpc3RUaHJlc2hvbGQgPSAyMDA7XG4gICAgICB2YXIgY3h0RGlzdFRocmVzaG9sZFNxID0gY3h0RGlzdFRocmVzaG9sZCAqIGN4dERpc3RUaHJlc2hvbGQ7XG4gICAgICBpZiAoZGlzdGFuY2UxU3EgPCBjeHREaXN0VGhyZXNob2xkU3EgJiYgIWUudG91Y2hlc1syXSkge1xuICAgICAgICB2YXIgbmVhcjEgPSByLmZpbmROZWFyZXN0RWxlbWVudChub3dbMF0sIG5vd1sxXSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHZhciBuZWFyMiA9IHIuZmluZE5lYXJlc3RFbGVtZW50KG5vd1syXSwgbm93WzNdLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgaWYgKG5lYXIxICYmIG5lYXIxLmlzTm9kZSgpKSB7XG4gICAgICAgICAgbmVhcjEuYWN0aXZhdGUoKS5lbWl0KG1ha2VFdmVudCgnY3h0dGFwc3RhcnQnKSk7XG4gICAgICAgICAgci50b3VjaERhdGEuc3RhcnQgPSBuZWFyMTtcbiAgICAgICAgfSBlbHNlIGlmIChuZWFyMiAmJiBuZWFyMi5pc05vZGUoKSkge1xuICAgICAgICAgIG5lYXIyLmFjdGl2YXRlKCkuZW1pdChtYWtlRXZlbnQoJ2N4dHRhcHN0YXJ0JykpO1xuICAgICAgICAgIHIudG91Y2hEYXRhLnN0YXJ0ID0gbmVhcjI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3kuZW1pdChtYWtlRXZlbnQoJ2N4dHRhcHN0YXJ0JykpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyLnRvdWNoRGF0YS5zdGFydCkge1xuICAgICAgICAgIHIudG91Y2hEYXRhLnN0YXJ0Ll9wcml2YXRlLmdyYWJiZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByLnRvdWNoRGF0YS5jeHQgPSB0cnVlO1xuICAgICAgICByLnRvdWNoRGF0YS5jeHREcmFnZ2VkID0gZmFsc2U7XG4gICAgICAgIHIuZGF0YS5iZ0FjdGl2ZVBvc2lzdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgci5yZWRyYXcoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZS50b3VjaGVzWzJdKSB7XG4gICAgICAvLyBpZ25vcmVcblxuICAgICAgLy8gc2FmYXJpIG9uIGlvcyBwYW5zIHRoZSBwYWdlIG90aGVyd2lzZSAobm9ybWFsbHkgeW91IHNob3VsZCBiZSBhYmxlIHRvIHByZXZlbnRkZWZhdWx0IG9uIHRvdWNobW92ZS4uLilcbiAgICAgIGlmIChjeS5ib3hTZWxlY3Rpb25FbmFibGVkKCkpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZS50b3VjaGVzWzFdKSA7IGVsc2UgaWYgKGUudG91Y2hlc1swXSkge1xuICAgICAgdmFyIG5lYXJzID0gci5maW5kTmVhcmVzdEVsZW1lbnRzKG5vd1swXSwgbm93WzFdLCB0cnVlLCB0cnVlKTtcbiAgICAgIHZhciBuZWFyID0gbmVhcnNbMF07XG4gICAgICBpZiAobmVhciAhPSBudWxsKSB7XG4gICAgICAgIG5lYXIuYWN0aXZhdGUoKTtcbiAgICAgICAgci50b3VjaERhdGEuc3RhcnQgPSBuZWFyO1xuICAgICAgICByLnRvdWNoRGF0YS5zdGFydHMgPSBuZWFycztcbiAgICAgICAgaWYgKHIubm9kZUlzR3JhYmJhYmxlKG5lYXIpKSB7XG4gICAgICAgICAgdmFyIGRyYWdnZWRFbGVzID0gci5kcmFnRGF0YS50b3VjaERyYWdFbGVzID0gY3kuY29sbGVjdGlvbigpO1xuICAgICAgICAgIHZhciBzZWxlY3RlZE5vZGVzID0gbnVsbDtcbiAgICAgICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgICAgICByLnJlZHJhd0hpbnQoJ2RyYWcnLCB0cnVlKTtcbiAgICAgICAgICBpZiAobmVhci5zZWxlY3RlZCgpKSB7XG4gICAgICAgICAgICAvLyByZXNldCBkcmFnIGVsZW1lbnRzLCBzaW5jZSBuZWFyIHdpbGwgYmUgYWRkZWQgYWdhaW5cblxuICAgICAgICAgICAgc2VsZWN0ZWROb2RlcyA9IGN5LiQoZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICAgICAgICByZXR1cm4gZWxlLnNlbGVjdGVkKCkgJiYgci5ub2RlSXNHcmFiYmFibGUoZWxlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYWRkTm9kZXNUb0RyYWcoc2VsZWN0ZWROb2Rlcywge1xuICAgICAgICAgICAgICBhZGRUb0xpc3Q6IGRyYWdnZWRFbGVzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWRkTm9kZVRvRHJhZyhuZWFyLCB7XG4gICAgICAgICAgICAgIGFkZFRvTGlzdDogZHJhZ2dlZEVsZXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZXRHcmFiVGFyZ2V0KG5lYXIpO1xuICAgICAgICAgIG5lYXIuZW1pdChtYWtlRXZlbnQoJ2dyYWJvbicpKTtcbiAgICAgICAgICBpZiAoc2VsZWN0ZWROb2Rlcykge1xuICAgICAgICAgICAgc2VsZWN0ZWROb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7XG4gICAgICAgICAgICAgIG4uZW1pdChtYWtlRXZlbnQoJ2dyYWInKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmVhci5lbWl0KG1ha2VFdmVudCgnZ3JhYicpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRyaWdnZXJFdmVudHMobmVhciwgWyd0b3VjaHN0YXJ0JywgJ3RhcHN0YXJ0JywgJ3Ztb3VzZWRvd24nXSwgZSwge1xuICAgICAgICB4OiBub3dbMF0sXG4gICAgICAgIHk6IG5vd1sxXVxuICAgICAgfSk7XG4gICAgICBpZiAobmVhciA9PSBudWxsKSB7XG4gICAgICAgIHIuZGF0YS5iZ0FjdGl2ZVBvc2lzdGlvbiA9IHtcbiAgICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgICAgeTogcG9zWzFdXG4gICAgICAgIH07XG4gICAgICAgIHIucmVkcmF3SGludCgnc2VsZWN0JywgdHJ1ZSk7XG4gICAgICAgIHIucmVkcmF3KCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFRhcCwgdGFwaG9sZFxuICAgICAgLy8gLS0tLS1cblxuICAgICAgci50b3VjaERhdGEuc2luZ2xlVG91Y2hNb3ZlZCA9IGZhbHNlO1xuICAgICAgci50b3VjaERhdGEuc2luZ2xlVG91Y2hTdGFydFRpbWUgPSArbmV3IERhdGUoKTtcbiAgICAgIGNsZWFyVGltZW91dChyLnRvdWNoRGF0YS50YXBob2xkVGltZW91dCk7XG4gICAgICByLnRvdWNoRGF0YS50YXBob2xkVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoci50b3VjaERhdGEuc2luZ2xlVG91Y2hNb3ZlZCA9PT0gZmFsc2UgJiYgIXIucGluY2hpbmcgLy8gaWYgcGluY2hpbmcsIHRoZW4gdGFwaG9sZCB1bnNlbGVjdCBzaG91bGRuJ3QgdGFrZSBlZmZlY3RcbiAgICAgICAgJiYgIXIudG91Y2hEYXRhLnNlbGVjdGluZyAvLyBib3ggc2VsZWN0aW9uIHNob3VsZG4ndCBhbGxvdyB0YXBob2xkIHRocm91Z2hcbiAgICAgICAgKSB7XG4gICAgICAgICAgdHJpZ2dlckV2ZW50cyhyLnRvdWNoRGF0YS5zdGFydCwgWyd0YXBob2xkJ10sIGUsIHtcbiAgICAgICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgICAgIHk6IG5vd1sxXVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LCByLnRhcGhvbGREdXJhdGlvbik7XG4gICAgfVxuICAgIGlmIChlLnRvdWNoZXMubGVuZ3RoID49IDEpIHtcbiAgICAgIHZhciBzUG9zID0gci50b3VjaERhdGEuc3RhcnRQb3NpdGlvbiA9IFtudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm93Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHNQb3NbaV0gPSBlYXJsaWVyW2ldID0gbm93W2ldO1xuICAgICAgfVxuICAgICAgdmFyIHRvdWNoMCA9IGUudG91Y2hlc1swXTtcbiAgICAgIHIudG91Y2hEYXRhLnN0YXJ0R1Bvc2l0aW9uID0gW3RvdWNoMC5jbGllbnRYLCB0b3VjaDAuY2xpZW50WV07XG4gICAgfVxuICB9LCBmYWxzZSk7XG4gIHZhciB0b3VjaG1vdmVIYW5kbGVyO1xuICByLnJlZ2lzdGVyQmluZGluZyhjb250YWluZXJXaW5kb3csICd0b3VjaG1vdmUnLCB0b3VjaG1vdmVIYW5kbGVyID0gZnVuY3Rpb24gdG91Y2htb3ZlSGFuZGxlcihlKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuICAgIHZhciBjYXB0dXJlID0gci50b3VjaERhdGEuY2FwdHVyZTtcbiAgICBpZiAoIWNhcHR1cmUgJiYgIWV2ZW50SW5Db250YWluZXIoZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHNlbGVjdCA9IHIuc2VsZWN0aW9uO1xuICAgIHZhciBjeSA9IHIuY3k7XG4gICAgdmFyIG5vdyA9IHIudG91Y2hEYXRhLm5vdztcbiAgICB2YXIgZWFybGllciA9IHIudG91Y2hEYXRhLmVhcmxpZXI7XG4gICAgdmFyIHpvb20gPSBjeS56b29tKCk7XG4gICAgaWYgKGUudG91Y2hlc1swXSkge1xuICAgICAgdmFyIHBvcyA9IHIucHJvamVjdEludG9WaWV3cG9ydChlLnRvdWNoZXNbMF0uY2xpZW50WCwgZS50b3VjaGVzWzBdLmNsaWVudFkpO1xuICAgICAgbm93WzBdID0gcG9zWzBdO1xuICAgICAgbm93WzFdID0gcG9zWzFdO1xuICAgIH1cbiAgICBpZiAoZS50b3VjaGVzWzFdKSB7XG4gICAgICB2YXIgcG9zID0gci5wcm9qZWN0SW50b1ZpZXdwb3J0KGUudG91Y2hlc1sxXS5jbGllbnRYLCBlLnRvdWNoZXNbMV0uY2xpZW50WSk7XG4gICAgICBub3dbMl0gPSBwb3NbMF07XG4gICAgICBub3dbM10gPSBwb3NbMV07XG4gICAgfVxuICAgIGlmIChlLnRvdWNoZXNbMl0pIHtcbiAgICAgIHZhciBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZS50b3VjaGVzWzJdLmNsaWVudFgsIGUudG91Y2hlc1syXS5jbGllbnRZKTtcbiAgICAgIG5vd1s0XSA9IHBvc1swXTtcbiAgICAgIG5vd1s1XSA9IHBvc1sxXTtcbiAgICB9XG4gICAgdmFyIG1ha2VFdmVudCA9IGZ1bmN0aW9uIG1ha2VFdmVudCh0eXBlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgICB5OiBub3dbMV1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9O1xuICAgIHZhciBzdGFydEdQb3MgPSByLnRvdWNoRGF0YS5zdGFydEdQb3NpdGlvbjtcbiAgICB2YXIgaXNPdmVyVGhyZXNob2xkRHJhZztcbiAgICBpZiAoY2FwdHVyZSAmJiBlLnRvdWNoZXNbMF0gJiYgc3RhcnRHUG9zKSB7XG4gICAgICB2YXIgZGlzcCA9IFtdO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBub3cubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgZGlzcFtqXSA9IG5vd1tqXSAtIGVhcmxpZXJbal07XG4gICAgICB9XG4gICAgICB2YXIgZHggPSBlLnRvdWNoZXNbMF0uY2xpZW50WCAtIHN0YXJ0R1Bvc1swXTtcbiAgICAgIHZhciBkeDIgPSBkeCAqIGR4O1xuICAgICAgdmFyIGR5ID0gZS50b3VjaGVzWzBdLmNsaWVudFkgLSBzdGFydEdQb3NbMV07XG4gICAgICB2YXIgZHkyID0gZHkgKiBkeTtcbiAgICAgIHZhciBkaXN0MiA9IGR4MiArIGR5MjtcbiAgICAgIGlzT3ZlclRocmVzaG9sZERyYWcgPSBkaXN0MiA+PSByLnRvdWNoVGFwVGhyZXNob2xkMjtcbiAgICB9XG5cbiAgICAvLyBjb250ZXh0IHN3aXBlIGNhbmNlbGxpbmdcbiAgICBpZiAoY2FwdHVyZSAmJiByLnRvdWNoRGF0YS5jeHQpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHZhciBmMXgyID0gZS50b3VjaGVzWzBdLmNsaWVudFggLSBvZmZzZXRMZWZ0LFxuICAgICAgICBmMXkyID0gZS50b3VjaGVzWzBdLmNsaWVudFkgLSBvZmZzZXRUb3A7XG4gICAgICB2YXIgZjJ4MiA9IGUudG91Y2hlc1sxXS5jbGllbnRYIC0gb2Zmc2V0TGVmdCxcbiAgICAgICAgZjJ5MiA9IGUudG91Y2hlc1sxXS5jbGllbnRZIC0gb2Zmc2V0VG9wO1xuICAgICAgLy8gdmFyIGRpc3RhbmNlMiA9IGRpc3RhbmNlKCBmMXgyLCBmMXkyLCBmMngyLCBmMnkyICk7XG4gICAgICB2YXIgZGlzdGFuY2UyU3EgPSBkaXN0YW5jZVNxKGYxeDIsIGYxeTIsIGYyeDIsIGYyeTIpO1xuICAgICAgdmFyIGZhY3RvclNxID0gZGlzdGFuY2UyU3EgLyBkaXN0YW5jZTFTcTtcbiAgICAgIHZhciBkaXN0VGhyZXNob2xkID0gMTUwO1xuICAgICAgdmFyIGRpc3RUaHJlc2hvbGRTcSA9IGRpc3RUaHJlc2hvbGQgKiBkaXN0VGhyZXNob2xkO1xuICAgICAgdmFyIGZhY3RvclRocmVzaG9sZCA9IDEuNTtcbiAgICAgIHZhciBmYWN0b3JUaHJlc2hvbGRTcSA9IGZhY3RvclRocmVzaG9sZCAqIGZhY3RvclRocmVzaG9sZDtcblxuICAgICAgLy8gY2FuY2VsIGN0eCBnZXN0dXJlcyBpZiB0aGUgZGlzdGFuY2UgYi90IHRoZSBmaW5nZXJzIGluY3JlYXNlc1xuICAgICAgaWYgKGZhY3RvclNxID49IGZhY3RvclRocmVzaG9sZFNxIHx8IGRpc3RhbmNlMlNxID49IGRpc3RUaHJlc2hvbGRTcSkge1xuICAgICAgICByLnRvdWNoRGF0YS5jeHQgPSBmYWxzZTtcbiAgICAgICAgci5kYXRhLmJnQWN0aXZlUG9zaXN0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgICByLnJlZHJhd0hpbnQoJ3NlbGVjdCcsIHRydWUpO1xuICAgICAgICB2YXIgY3h0RXZ0ID0gbWFrZUV2ZW50KCdjeHR0YXBlbmQnKTtcbiAgICAgICAgaWYgKHIudG91Y2hEYXRhLnN0YXJ0KSB7XG4gICAgICAgICAgci50b3VjaERhdGEuc3RhcnQudW5hY3RpdmF0ZSgpLmVtaXQoY3h0RXZ0KTtcbiAgICAgICAgICByLnRvdWNoRGF0YS5zdGFydCA9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3kuZW1pdChjeHRFdnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gY29udGV4dCBzd2lwZVxuICAgIGlmIChjYXB0dXJlICYmIHIudG91Y2hEYXRhLmN4dCkge1xuICAgICAgdmFyIGN4dEV2dCA9IG1ha2VFdmVudCgnY3h0ZHJhZycpO1xuICAgICAgci5kYXRhLmJnQWN0aXZlUG9zaXN0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgci5yZWRyYXdIaW50KCdzZWxlY3QnLCB0cnVlKTtcbiAgICAgIGlmIChyLnRvdWNoRGF0YS5zdGFydCkge1xuICAgICAgICByLnRvdWNoRGF0YS5zdGFydC5lbWl0KGN4dEV2dCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjeS5lbWl0KGN4dEV2dCk7XG4gICAgICB9XG4gICAgICBpZiAoci50b3VjaERhdGEuc3RhcnQpIHtcbiAgICAgICAgci50b3VjaERhdGEuc3RhcnQuX3ByaXZhdGUuZ3JhYmJlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgci50b3VjaERhdGEuY3h0RHJhZ2dlZCA9IHRydWU7XG4gICAgICB2YXIgbmVhciA9IHIuZmluZE5lYXJlc3RFbGVtZW50KG5vd1swXSwgbm93WzFdLCB0cnVlLCB0cnVlKTtcbiAgICAgIGlmICghci50b3VjaERhdGEuY3h0T3ZlciB8fCBuZWFyICE9PSByLnRvdWNoRGF0YS5jeHRPdmVyKSB7XG4gICAgICAgIGlmIChyLnRvdWNoRGF0YS5jeHRPdmVyKSB7XG4gICAgICAgICAgci50b3VjaERhdGEuY3h0T3Zlci5lbWl0KG1ha2VFdmVudCgnY3h0ZHJhZ291dCcpKTtcbiAgICAgICAgfVxuICAgICAgICByLnRvdWNoRGF0YS5jeHRPdmVyID0gbmVhcjtcbiAgICAgICAgaWYgKG5lYXIpIHtcbiAgICAgICAgICBuZWFyLmVtaXQobWFrZUV2ZW50KCdjeHRkcmFnb3ZlcicpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBib3ggc2VsZWN0aW9uXG4gICAgfSBlbHNlIGlmIChjYXB0dXJlICYmIGUudG91Y2hlc1syXSAmJiBjeS5ib3hTZWxlY3Rpb25FbmFibGVkKCkpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHIuZGF0YS5iZ0FjdGl2ZVBvc2lzdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMubGFzdFRocmVlVG91Y2ggPSArbmV3IERhdGUoKTtcbiAgICAgIGlmICghci50b3VjaERhdGEuc2VsZWN0aW5nKSB7XG4gICAgICAgIGN5LmVtaXQobWFrZUV2ZW50KCdib3hzdGFydCcpKTtcbiAgICAgIH1cbiAgICAgIHIudG91Y2hEYXRhLnNlbGVjdGluZyA9IHRydWU7XG4gICAgICByLnRvdWNoRGF0YS5kaWRTZWxlY3QgPSB0cnVlO1xuICAgICAgc2VsZWN0WzRdID0gMTtcbiAgICAgIGlmICghc2VsZWN0IHx8IHNlbGVjdC5sZW5ndGggPT09IDAgfHwgc2VsZWN0WzBdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc2VsZWN0WzBdID0gKG5vd1swXSArIG5vd1syXSArIG5vd1s0XSkgLyAzO1xuICAgICAgICBzZWxlY3RbMV0gPSAobm93WzFdICsgbm93WzNdICsgbm93WzVdKSAvIDM7XG4gICAgICAgIHNlbGVjdFsyXSA9IChub3dbMF0gKyBub3dbMl0gKyBub3dbNF0pIC8gMyArIDE7XG4gICAgICAgIHNlbGVjdFszXSA9IChub3dbMV0gKyBub3dbM10gKyBub3dbNV0pIC8gMyArIDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxlY3RbMl0gPSAobm93WzBdICsgbm93WzJdICsgbm93WzRdKSAvIDM7XG4gICAgICAgIHNlbGVjdFszXSA9IChub3dbMV0gKyBub3dbM10gKyBub3dbNV0pIC8gMztcbiAgICAgIH1cbiAgICAgIHIucmVkcmF3SGludCgnc2VsZWN0JywgdHJ1ZSk7XG4gICAgICByLnJlZHJhdygpO1xuXG4gICAgICAvLyBwaW5jaCB0byB6b29tXG4gICAgfSBlbHNlIGlmIChjYXB0dXJlICYmIGUudG91Y2hlc1sxXSAmJiAhci50b3VjaERhdGEuZGlkU2VsZWN0IC8vIGRvbid0IGFsbG93IGJveCBzZWxlY3Rpb24gdG8gZGVncmFkZSB0byBwaW5jaC10by16b29tXG4gICAgJiYgY3kuem9vbWluZ0VuYWJsZWQoKSAmJiBjeS5wYW5uaW5nRW5hYmxlZCgpICYmIGN5LnVzZXJab29taW5nRW5hYmxlZCgpICYmIGN5LnVzZXJQYW5uaW5nRW5hYmxlZCgpKSB7XG4gICAgICAvLyB0d28gZmluZ2VycyA9PiBwaW5jaCB0byB6b29tXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICByLmRhdGEuYmdBY3RpdmVQb3Npc3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgICByLnJlZHJhd0hpbnQoJ3NlbGVjdCcsIHRydWUpO1xuICAgICAgdmFyIGRyYWdnZWRFbGVzID0gci5kcmFnRGF0YS50b3VjaERyYWdFbGVzO1xuICAgICAgaWYgKGRyYWdnZWRFbGVzKSB7XG4gICAgICAgIHIucmVkcmF3SGludCgnZHJhZycsIHRydWUpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRyYWdnZWRFbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGRlX3AgPSBkcmFnZ2VkRWxlc1tpXS5fcHJpdmF0ZTtcbiAgICAgICAgICBkZV9wLmdyYWJiZWQgPSBmYWxzZTtcbiAgICAgICAgICBkZV9wLnJzY3JhdGNoLmluRHJhZ0xheWVyID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBfc3RhcnQgPSByLnRvdWNoRGF0YS5zdGFydDtcblxuICAgICAgLy8gKHgyLCB5MikgZm9yIGZpbmdlcnMgMSBhbmQgMlxuICAgICAgdmFyIGYxeDIgPSBlLnRvdWNoZXNbMF0uY2xpZW50WCAtIG9mZnNldExlZnQsXG4gICAgICAgIGYxeTIgPSBlLnRvdWNoZXNbMF0uY2xpZW50WSAtIG9mZnNldFRvcDtcbiAgICAgIHZhciBmMngyID0gZS50b3VjaGVzWzFdLmNsaWVudFggLSBvZmZzZXRMZWZ0LFxuICAgICAgICBmMnkyID0gZS50b3VjaGVzWzFdLmNsaWVudFkgLSBvZmZzZXRUb3A7XG4gICAgICB2YXIgZGlzdGFuY2UyID0gZGlzdGFuY2UoZjF4MiwgZjF5MiwgZjJ4MiwgZjJ5Mik7XG4gICAgICAvLyB2YXIgZGlzdGFuY2UyU3EgPSBkaXN0YW5jZVNxKCBmMXgyLCBmMXkyLCBmMngyLCBmMnkyICk7XG4gICAgICAvLyB2YXIgZmFjdG9yID0gTWF0aC5zcXJ0KCBkaXN0YW5jZTJTcSApIC8gTWF0aC5zcXJ0KCBkaXN0YW5jZTFTcSApO1xuICAgICAgdmFyIGZhY3RvciA9IGRpc3RhbmNlMiAvIGRpc3RhbmNlMTtcbiAgICAgIGlmICh0d29GaW5nZXJzU3RhcnRJbnNpZGUpIHtcbiAgICAgICAgLy8gZGVsdGEgZmluZ2VyMVxuICAgICAgICB2YXIgZGYxeCA9IGYxeDIgLSBmMXgxO1xuICAgICAgICB2YXIgZGYxeSA9IGYxeTIgLSBmMXkxO1xuXG4gICAgICAgIC8vIGRlbHRhIGZpbmdlciAyXG4gICAgICAgIHZhciBkZjJ4ID0gZjJ4MiAtIGYyeDE7XG4gICAgICAgIHZhciBkZjJ5ID0gZjJ5MiAtIGYyeTE7XG5cbiAgICAgICAgLy8gdHJhbnNsYXRpb24gaXMgdGhlIG5vcm1hbGlzZWQgdmVjdG9yIG9mIHRoZSB0d28gZmluZ2VycyBtb3ZlbWVudFxuICAgICAgICAvLyBpLmUuIHNvIHBpbmNoaW5nIGNhbmNlbHMgb3V0IGFuZCBtb3ZpbmcgdG9nZXRoZXIgcGFuc1xuICAgICAgICB2YXIgdHggPSAoZGYxeCArIGRmMngpIC8gMjtcbiAgICAgICAgdmFyIHR5ID0gKGRmMXkgKyBkZjJ5KSAvIDI7XG5cbiAgICAgICAgLy8gbm93IGNhbGN1bGF0ZSB0aGUgem9vbVxuICAgICAgICB2YXIgem9vbTEgPSBjeS56b29tKCk7XG4gICAgICAgIHZhciB6b29tMiA9IHpvb20xICogZmFjdG9yO1xuICAgICAgICB2YXIgcGFuMSA9IGN5LnBhbigpO1xuXG4gICAgICAgIC8vIHRoZSBtb2RlbCBjZW50ZXIgcG9pbnQgY29udmVydGVkIHRvIHRoZSBjdXJyZW50IHJlbmRlcmVkIHBvc1xuICAgICAgICB2YXIgY3RyeCA9IG1vZGVsQ2VudGVyMVswXSAqIHpvb20xICsgcGFuMS54O1xuICAgICAgICB2YXIgY3RyeSA9IG1vZGVsQ2VudGVyMVsxXSAqIHpvb20xICsgcGFuMS55O1xuICAgICAgICB2YXIgcGFuMiA9IHtcbiAgICAgICAgICB4OiAtem9vbTIgLyB6b29tMSAqIChjdHJ4IC0gcGFuMS54IC0gdHgpICsgY3RyeCxcbiAgICAgICAgICB5OiAtem9vbTIgLyB6b29tMSAqIChjdHJ5IC0gcGFuMS55IC0gdHkpICsgY3RyeVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIHJlbW92ZSBkcmFnZ2VkIGVsZXNcbiAgICAgICAgaWYgKF9zdGFydCAmJiBfc3RhcnQuYWN0aXZlKCkpIHtcbiAgICAgICAgICB2YXIgZHJhZ2dlZEVsZXMgPSByLmRyYWdEYXRhLnRvdWNoRHJhZ0VsZXM7XG4gICAgICAgICAgZnJlZURyYWdnZWRFbGVtZW50cyhkcmFnZ2VkRWxlcyk7XG4gICAgICAgICAgci5yZWRyYXdIaW50KCdkcmFnJywgdHJ1ZSk7XG4gICAgICAgICAgci5yZWRyYXdIaW50KCdlbGVzJywgdHJ1ZSk7XG4gICAgICAgICAgX3N0YXJ0LnVuYWN0aXZhdGUoKS5lbWl0KG1ha2VFdmVudCgnZnJlZW9uJykpO1xuICAgICAgICAgIGlmIChkcmFnZ2VkRWxlcykge1xuICAgICAgICAgICAgZHJhZ2dlZEVsZXMuZW1pdChtYWtlRXZlbnQoJ2ZyZWUnKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyLmRyYWdEYXRhLmRpZERyYWcpIHtcbiAgICAgICAgICAgIF9zdGFydC5lbWl0KG1ha2VFdmVudCgnZHJhZ2ZyZWVvbicpKTtcbiAgICAgICAgICAgIGlmIChkcmFnZ2VkRWxlcykge1xuICAgICAgICAgICAgICBkcmFnZ2VkRWxlcy5lbWl0KG1ha2VFdmVudCgnZHJhZ2ZyZWUnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGN5LnZpZXdwb3J0KHtcbiAgICAgICAgICB6b29tOiB6b29tMixcbiAgICAgICAgICBwYW46IHBhbjIsXG4gICAgICAgICAgY2FuY2VsT25GYWlsZWRab29tOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBjeS5lbWl0KG1ha2VFdmVudCgncGluY2h6b29tJykpO1xuICAgICAgICBkaXN0YW5jZTEgPSBkaXN0YW5jZTI7XG4gICAgICAgIGYxeDEgPSBmMXgyO1xuICAgICAgICBmMXkxID0gZjF5MjtcbiAgICAgICAgZjJ4MSA9IGYyeDI7XG4gICAgICAgIGYyeTEgPSBmMnkyO1xuICAgICAgICByLnBpbmNoaW5nID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gUmUtcHJvamVjdFxuICAgICAgaWYgKGUudG91Y2hlc1swXSkge1xuICAgICAgICB2YXIgcG9zID0gci5wcm9qZWN0SW50b1ZpZXdwb3J0KGUudG91Y2hlc1swXS5jbGllbnRYLCBlLnRvdWNoZXNbMF0uY2xpZW50WSk7XG4gICAgICAgIG5vd1swXSA9IHBvc1swXTtcbiAgICAgICAgbm93WzFdID0gcG9zWzFdO1xuICAgICAgfVxuICAgICAgaWYgKGUudG91Y2hlc1sxXSkge1xuICAgICAgICB2YXIgcG9zID0gci5wcm9qZWN0SW50b1ZpZXdwb3J0KGUudG91Y2hlc1sxXS5jbGllbnRYLCBlLnRvdWNoZXNbMV0uY2xpZW50WSk7XG4gICAgICAgIG5vd1syXSA9IHBvc1swXTtcbiAgICAgICAgbm93WzNdID0gcG9zWzFdO1xuICAgICAgfVxuICAgICAgaWYgKGUudG91Y2hlc1syXSkge1xuICAgICAgICB2YXIgcG9zID0gci5wcm9qZWN0SW50b1ZpZXdwb3J0KGUudG91Y2hlc1syXS5jbGllbnRYLCBlLnRvdWNoZXNbMl0uY2xpZW50WSk7XG4gICAgICAgIG5vd1s0XSA9IHBvc1swXTtcbiAgICAgICAgbm93WzVdID0gcG9zWzFdO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZS50b3VjaGVzWzBdICYmICFyLnRvdWNoRGF0YS5kaWRTZWxlY3QgLy8gZG9uJ3QgYWxsb3cgYm94IHNlbGVjdGlvbiB0byBkZWdyYWRlIHRvIHNpbmdsZSBmaW5nZXIgZXZlbnRzIGxpa2UgcGFubmluZ1xuICAgICkge1xuICAgICAgdmFyIHN0YXJ0ID0gci50b3VjaERhdGEuc3RhcnQ7XG4gICAgICB2YXIgbGFzdCA9IHIudG91Y2hEYXRhLmxhc3Q7XG4gICAgICB2YXIgbmVhcjtcbiAgICAgIGlmICghci5ob3ZlckRhdGEuZHJhZ2dpbmdFbGVzICYmICFyLnN3aXBlUGFubmluZykge1xuICAgICAgICBuZWFyID0gci5maW5kTmVhcmVzdEVsZW1lbnQobm93WzBdLCBub3dbMV0sIHRydWUsIHRydWUpO1xuICAgICAgfVxuICAgICAgaWYgKGNhcHR1cmUgJiYgc3RhcnQgIT0gbnVsbCkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIC8vIGRyYWdnaW5nIG5vZGVzXG4gICAgICBpZiAoY2FwdHVyZSAmJiBzdGFydCAhPSBudWxsICYmIHIubm9kZUlzRHJhZ2dhYmxlKHN0YXJ0KSkge1xuICAgICAgICBpZiAoaXNPdmVyVGhyZXNob2xkRHJhZykge1xuICAgICAgICAgIC8vIHRoZW4gZHJhZ2dpbmcgY2FuIGhhcHBlblxuICAgICAgICAgIHZhciBkcmFnZ2VkRWxlcyA9IHIuZHJhZ0RhdGEudG91Y2hEcmFnRWxlcztcbiAgICAgICAgICB2YXIganVzdFN0YXJ0ZWREcmFnID0gIXIuZHJhZ0RhdGEuZGlkRHJhZztcbiAgICAgICAgICBpZiAoanVzdFN0YXJ0ZWREcmFnKSB7XG4gICAgICAgICAgICBhZGROb2Rlc1RvRHJhZyhkcmFnZ2VkRWxlcywge1xuICAgICAgICAgICAgICBpbkRyYWdMYXllcjogdHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHIuZHJhZ0RhdGEuZGlkRHJhZyA9IHRydWU7XG4gICAgICAgICAgdmFyIHRvdGFsU2hpZnQgPSB7XG4gICAgICAgICAgICB4OiAwLFxuICAgICAgICAgICAgeTogMFxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKG51bWJlciQxKGRpc3BbMF0pICYmIG51bWJlciQxKGRpc3BbMV0pKSB7XG4gICAgICAgICAgICB0b3RhbFNoaWZ0LnggKz0gZGlzcFswXTtcbiAgICAgICAgICAgIHRvdGFsU2hpZnQueSArPSBkaXNwWzFdO1xuICAgICAgICAgICAgaWYgKGp1c3RTdGFydGVkRHJhZykge1xuICAgICAgICAgICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgICAgICAgICAgdmFyIGRyYWdEZWx0YSA9IHIudG91Y2hEYXRhLmRyYWdEZWx0YTtcbiAgICAgICAgICAgICAgaWYgKGRyYWdEZWx0YSAmJiBudW1iZXIkMShkcmFnRGVsdGFbMF0pICYmIG51bWJlciQxKGRyYWdEZWx0YVsxXSkpIHtcbiAgICAgICAgICAgICAgICB0b3RhbFNoaWZ0LnggKz0gZHJhZ0RlbHRhWzBdO1xuICAgICAgICAgICAgICAgIHRvdGFsU2hpZnQueSArPSBkcmFnRGVsdGFbMV07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgci5ob3ZlckRhdGEuZHJhZ2dpbmdFbGVzID0gdHJ1ZTtcbiAgICAgICAgICBkcmFnZ2VkRWxlcy5zaWxlbnRTaGlmdCh0b3RhbFNoaWZ0KS5lbWl0KG1ha2VFdmVudCgncG9zaXRpb24nKSkuZW1pdChtYWtlRXZlbnQoJ2RyYWcnKSk7XG4gICAgICAgICAgci5yZWRyYXdIaW50KCdkcmFnJywgdHJ1ZSk7XG4gICAgICAgICAgaWYgKHIudG91Y2hEYXRhLnN0YXJ0UG9zaXRpb25bMF0gPT0gZWFybGllclswXSAmJiByLnRvdWNoRGF0YS5zdGFydFBvc2l0aW9uWzFdID09IGVhcmxpZXJbMV0pIHtcbiAgICAgICAgICAgIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByLnJlZHJhdygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIG90aGVyd2lzZSBrZWVwIHRyYWNrIG9mIGRyYWcgZGVsdGEgZm9yIGxhdGVyXG4gICAgICAgICAgdmFyIGRyYWdEZWx0YSA9IHIudG91Y2hEYXRhLmRyYWdEZWx0YSA9IHIudG91Y2hEYXRhLmRyYWdEZWx0YSB8fCBbXTtcbiAgICAgICAgICBpZiAoZHJhZ0RlbHRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgZHJhZ0RlbHRhLnB1c2goZGlzcFswXSk7XG4gICAgICAgICAgICBkcmFnRGVsdGEucHVzaChkaXNwWzFdKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZHJhZ0RlbHRhWzBdICs9IGRpc3BbMF07XG4gICAgICAgICAgICBkcmFnRGVsdGFbMV0gKz0gZGlzcFsxXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gdG91Y2htb3ZlXG4gICAgICB7XG4gICAgICAgIHRyaWdnZXJFdmVudHMoc3RhcnQgfHwgbmVhciwgWyd0b3VjaG1vdmUnLCAndGFwZHJhZycsICd2bW91c2Vtb3ZlJ10sIGUsIHtcbiAgICAgICAgICB4OiBub3dbMF0sXG4gICAgICAgICAgeTogbm93WzFdXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoKCFzdGFydCB8fCAhc3RhcnQuZ3JhYmJlZCgpKSAmJiBuZWFyICE9IGxhc3QpIHtcbiAgICAgICAgICBpZiAobGFzdCkge1xuICAgICAgICAgICAgbGFzdC5lbWl0KG1ha2VFdmVudCgndGFwZHJhZ291dCcpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG5lYXIpIHtcbiAgICAgICAgICAgIG5lYXIuZW1pdChtYWtlRXZlbnQoJ3RhcGRyYWdvdmVyJykpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByLnRvdWNoRGF0YS5sYXN0ID0gbmVhcjtcbiAgICAgIH1cblxuICAgICAgLy8gY2hlY2sgdG8gY2FuY2VsIHRhcGhvbGRcbiAgICAgIGlmIChjYXB0dXJlKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm93Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKG5vd1tpXSAmJiByLnRvdWNoRGF0YS5zdGFydFBvc2l0aW9uW2ldICYmIGlzT3ZlclRocmVzaG9sZERyYWcpIHtcbiAgICAgICAgICAgIHIudG91Y2hEYXRhLnNpbmdsZVRvdWNoTW92ZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBwYW5uaW5nXG4gICAgICBpZiAoY2FwdHVyZSAmJiAoc3RhcnQgPT0gbnVsbCB8fCBzdGFydC5wYW5uYWJsZSgpKSAmJiBjeS5wYW5uaW5nRW5hYmxlZCgpICYmIGN5LnVzZXJQYW5uaW5nRW5hYmxlZCgpKSB7XG4gICAgICAgIHZhciBhbGxvd1Bhc3N0aHJvdWdoID0gYWxsb3dQYW5uaW5nUGFzc3Rocm91Z2goc3RhcnQsIHIudG91Y2hEYXRhLnN0YXJ0cyk7XG4gICAgICAgIGlmIChhbGxvd1Bhc3N0aHJvdWdoKSB7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGlmICghci5kYXRhLmJnQWN0aXZlUG9zaXN0aW9uKSB7XG4gICAgICAgICAgICByLmRhdGEuYmdBY3RpdmVQb3Npc3Rpb24gPSBhcnJheTJwb2ludChyLnRvdWNoRGF0YS5zdGFydFBvc2l0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHIuc3dpcGVQYW5uaW5nKSB7XG4gICAgICAgICAgICBjeS5wYW5CeSh7XG4gICAgICAgICAgICAgIHg6IGRpc3BbMF0gKiB6b29tLFxuICAgICAgICAgICAgICB5OiBkaXNwWzFdICogem9vbVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjeS5lbWl0KG1ha2VFdmVudCgnZHJhZ3BhbicpKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzT3ZlclRocmVzaG9sZERyYWcpIHtcbiAgICAgICAgICAgIHIuc3dpcGVQYW5uaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIGN5LnBhbkJ5KHtcbiAgICAgICAgICAgICAgeDogZHggKiB6b29tLFxuICAgICAgICAgICAgICB5OiBkeSAqIHpvb21cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY3kuZW1pdChtYWtlRXZlbnQoJ2RyYWdwYW4nKSk7XG4gICAgICAgICAgICBpZiAoc3RhcnQpIHtcbiAgICAgICAgICAgICAgc3RhcnQudW5hY3RpdmF0ZSgpO1xuICAgICAgICAgICAgICByLnJlZHJhd0hpbnQoJ3NlbGVjdCcsIHRydWUpO1xuICAgICAgICAgICAgICByLnRvdWNoRGF0YS5zdGFydCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmUtcHJvamVjdFxuICAgICAgICB2YXIgcG9zID0gci5wcm9qZWN0SW50b1ZpZXdwb3J0KGUudG91Y2hlc1swXS5jbGllbnRYLCBlLnRvdWNoZXNbMF0uY2xpZW50WSk7XG4gICAgICAgIG5vd1swXSA9IHBvc1swXTtcbiAgICAgICAgbm93WzFdID0gcG9zWzFdO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG5vdy5sZW5ndGg7IGorKykge1xuICAgICAgZWFybGllcltqXSA9IG5vd1tqXTtcbiAgICB9XG5cbiAgICAvLyB0aGUgYWN0aXZlIGJnIGluZGljYXRvciBzaG91bGQgYmUgcmVtb3ZlZCB3aGVuIG1ha2luZyBhIHN3aXBlIHRoYXQgaXMgbmVpdGhlciBmb3IgZHJhZ2dpbmcgbm9kZXMgb3IgcGFubmluZ1xuICAgIGlmIChjYXB0dXJlICYmIGUudG91Y2hlcy5sZW5ndGggPiAwICYmICFyLmhvdmVyRGF0YS5kcmFnZ2luZ0VsZXMgJiYgIXIuc3dpcGVQYW5uaW5nICYmIHIuZGF0YS5iZ0FjdGl2ZVBvc2lzdGlvbiAhPSBudWxsKSB7XG4gICAgICByLmRhdGEuYmdBY3RpdmVQb3Npc3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgICByLnJlZHJhd0hpbnQoJ3NlbGVjdCcsIHRydWUpO1xuICAgICAgci5yZWRyYXcoKTtcbiAgICB9XG4gIH0sIGZhbHNlKTtcbiAgdmFyIHRvdWNoY2FuY2VsSGFuZGxlcjtcbiAgci5yZWdpc3RlckJpbmRpbmcoY29udGFpbmVyV2luZG93LCAndG91Y2hjYW5jZWwnLCB0b3VjaGNhbmNlbEhhbmRsZXIgPSBmdW5jdGlvbiB0b3VjaGNhbmNlbEhhbmRsZXIoZSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICB2YXIgc3RhcnQgPSByLnRvdWNoRGF0YS5zdGFydDtcbiAgICByLnRvdWNoRGF0YS5jYXB0dXJlID0gZmFsc2U7XG4gICAgaWYgKHN0YXJ0KSB7XG4gICAgICBzdGFydC51bmFjdGl2YXRlKCk7XG4gICAgfVxuICB9KTtcbiAgdmFyIHRvdWNoZW5kSGFuZGxlciwgZGlkRG91YmxlVG91Y2gsIHRvdWNoVGltZW91dCwgcHJldlRvdWNoVGltZVN0YW1wO1xuICByLnJlZ2lzdGVyQmluZGluZyhjb250YWluZXJXaW5kb3csICd0b3VjaGVuZCcsIHRvdWNoZW5kSGFuZGxlciA9IGZ1bmN0aW9uIHRvdWNoZW5kSGFuZGxlcihlKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIHZhciBzdGFydCA9IHIudG91Y2hEYXRhLnN0YXJ0O1xuICAgIHZhciBjYXB0dXJlID0gci50b3VjaERhdGEuY2FwdHVyZTtcbiAgICBpZiAoY2FwdHVyZSkge1xuICAgICAgaWYgKGUudG91Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgci50b3VjaERhdGEuY2FwdHVyZSA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBzZWxlY3QgPSByLnNlbGVjdGlvbjtcbiAgICByLnN3aXBlUGFubmluZyA9IGZhbHNlO1xuICAgIHIuaG92ZXJEYXRhLmRyYWdnaW5nRWxlcyA9IGZhbHNlO1xuICAgIHZhciBjeSA9IHIuY3k7XG4gICAgdmFyIHpvb20gPSBjeS56b29tKCk7XG4gICAgdmFyIG5vdyA9IHIudG91Y2hEYXRhLm5vdztcbiAgICB2YXIgZWFybGllciA9IHIudG91Y2hEYXRhLmVhcmxpZXI7XG4gICAgaWYgKGUudG91Y2hlc1swXSkge1xuICAgICAgdmFyIHBvcyA9IHIucHJvamVjdEludG9WaWV3cG9ydChlLnRvdWNoZXNbMF0uY2xpZW50WCwgZS50b3VjaGVzWzBdLmNsaWVudFkpO1xuICAgICAgbm93WzBdID0gcG9zWzBdO1xuICAgICAgbm93WzFdID0gcG9zWzFdO1xuICAgIH1cbiAgICBpZiAoZS50b3VjaGVzWzFdKSB7XG4gICAgICB2YXIgcG9zID0gci5wcm9qZWN0SW50b1ZpZXdwb3J0KGUudG91Y2hlc1sxXS5jbGllbnRYLCBlLnRvdWNoZXNbMV0uY2xpZW50WSk7XG4gICAgICBub3dbMl0gPSBwb3NbMF07XG4gICAgICBub3dbM10gPSBwb3NbMV07XG4gICAgfVxuICAgIGlmIChlLnRvdWNoZXNbMl0pIHtcbiAgICAgIHZhciBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZS50b3VjaGVzWzJdLmNsaWVudFgsIGUudG91Y2hlc1syXS5jbGllbnRZKTtcbiAgICAgIG5vd1s0XSA9IHBvc1swXTtcbiAgICAgIG5vd1s1XSA9IHBvc1sxXTtcbiAgICB9XG4gICAgdmFyIG1ha2VFdmVudCA9IGZ1bmN0aW9uIG1ha2VFdmVudCh0eXBlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgICB5OiBub3dbMV1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9O1xuICAgIGlmIChzdGFydCkge1xuICAgICAgc3RhcnQudW5hY3RpdmF0ZSgpO1xuICAgIH1cbiAgICB2YXIgY3R4VGFwZW5kO1xuICAgIGlmIChyLnRvdWNoRGF0YS5jeHQpIHtcbiAgICAgIGN0eFRhcGVuZCA9IG1ha2VFdmVudCgnY3h0dGFwZW5kJyk7XG4gICAgICBpZiAoc3RhcnQpIHtcbiAgICAgICAgc3RhcnQuZW1pdChjdHhUYXBlbmQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3kuZW1pdChjdHhUYXBlbmQpO1xuICAgICAgfVxuICAgICAgaWYgKCFyLnRvdWNoRGF0YS5jeHREcmFnZ2VkKSB7XG4gICAgICAgIHZhciBjdHhUYXAgPSBtYWtlRXZlbnQoJ2N4dHRhcCcpO1xuICAgICAgICBpZiAoc3RhcnQpIHtcbiAgICAgICAgICBzdGFydC5lbWl0KGN0eFRhcCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3kuZW1pdChjdHhUYXApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoci50b3VjaERhdGEuc3RhcnQpIHtcbiAgICAgICAgci50b3VjaERhdGEuc3RhcnQuX3ByaXZhdGUuZ3JhYmJlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgci50b3VjaERhdGEuY3h0ID0gZmFsc2U7XG4gICAgICByLnRvdWNoRGF0YS5zdGFydCA9IG51bGw7XG4gICAgICByLnJlZHJhdygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIG5vIG1vcmUgYm94IHNlbGVjdGlvbiBpZiB3ZSBkb24ndCBoYXZlIHRocmVlIGZpbmdlcnNcbiAgICBpZiAoIWUudG91Y2hlc1syXSAmJiBjeS5ib3hTZWxlY3Rpb25FbmFibGVkKCkgJiYgci50b3VjaERhdGEuc2VsZWN0aW5nKSB7XG4gICAgICByLnRvdWNoRGF0YS5zZWxlY3RpbmcgPSBmYWxzZTtcbiAgICAgIHZhciBib3ggPSBjeS5jb2xsZWN0aW9uKHIuZ2V0QWxsSW5Cb3goc2VsZWN0WzBdLCBzZWxlY3RbMV0sIHNlbGVjdFsyXSwgc2VsZWN0WzNdKSk7XG4gICAgICBzZWxlY3RbMF0gPSB1bmRlZmluZWQ7XG4gICAgICBzZWxlY3RbMV0gPSB1bmRlZmluZWQ7XG4gICAgICBzZWxlY3RbMl0gPSB1bmRlZmluZWQ7XG4gICAgICBzZWxlY3RbM10gPSB1bmRlZmluZWQ7XG4gICAgICBzZWxlY3RbNF0gPSAwO1xuICAgICAgci5yZWRyYXdIaW50KCdzZWxlY3QnLCB0cnVlKTtcbiAgICAgIGN5LmVtaXQobWFrZUV2ZW50KCdib3hlbmQnKSk7XG4gICAgICB2YXIgZWxlV291bGRCZVNlbGVjdGVkID0gZnVuY3Rpb24gZWxlV291bGRCZVNlbGVjdGVkKGVsZSkge1xuICAgICAgICByZXR1cm4gZWxlLnNlbGVjdGFibGUoKSAmJiAhZWxlLnNlbGVjdGVkKCk7XG4gICAgICB9O1xuICAgICAgYm94LmVtaXQobWFrZUV2ZW50KCdib3gnKSkuc3RkRmlsdGVyKGVsZVdvdWxkQmVTZWxlY3RlZCkuc2VsZWN0KCkuZW1pdChtYWtlRXZlbnQoJ2JveHNlbGVjdCcpKTtcbiAgICAgIGlmIChib3gubm9uZW1wdHkoKSkge1xuICAgICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHIucmVkcmF3KCk7XG4gICAgfVxuICAgIGlmIChzdGFydCAhPSBudWxsKSB7XG4gICAgICBzdGFydC51bmFjdGl2YXRlKCk7XG4gICAgfVxuICAgIGlmIChlLnRvdWNoZXNbMl0pIHtcbiAgICAgIHIuZGF0YS5iZ0FjdGl2ZVBvc2lzdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgIHIucmVkcmF3SGludCgnc2VsZWN0JywgdHJ1ZSk7XG4gICAgfSBlbHNlIGlmIChlLnRvdWNoZXNbMV0pIDsgZWxzZSBpZiAoZS50b3VjaGVzWzBdKSA7IGVsc2UgaWYgKCFlLnRvdWNoZXNbMF0pIHtcbiAgICAgIHIuZGF0YS5iZ0FjdGl2ZVBvc2lzdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgIHIucmVkcmF3SGludCgnc2VsZWN0JywgdHJ1ZSk7XG4gICAgICB2YXIgZHJhZ2dlZEVsZXMgPSByLmRyYWdEYXRhLnRvdWNoRHJhZ0VsZXM7XG4gICAgICBpZiAoc3RhcnQgIT0gbnVsbCkge1xuICAgICAgICB2YXIgc3RhcnRXYXNHcmFiYmVkID0gc3RhcnQuX3ByaXZhdGUuZ3JhYmJlZDtcbiAgICAgICAgZnJlZURyYWdnZWRFbGVtZW50cyhkcmFnZ2VkRWxlcyk7XG4gICAgICAgIHIucmVkcmF3SGludCgnZHJhZycsIHRydWUpO1xuICAgICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgICAgaWYgKHN0YXJ0V2FzR3JhYmJlZCkge1xuICAgICAgICAgIHN0YXJ0LmVtaXQobWFrZUV2ZW50KCdmcmVlb24nKSk7XG4gICAgICAgICAgZHJhZ2dlZEVsZXMuZW1pdChtYWtlRXZlbnQoJ2ZyZWUnKSk7XG4gICAgICAgICAgaWYgKHIuZHJhZ0RhdGEuZGlkRHJhZykge1xuICAgICAgICAgICAgc3RhcnQuZW1pdChtYWtlRXZlbnQoJ2RyYWdmcmVlb24nKSk7XG4gICAgICAgICAgICBkcmFnZ2VkRWxlcy5lbWl0KG1ha2VFdmVudCgnZHJhZ2ZyZWUnKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRyaWdnZXJFdmVudHMoc3RhcnQsIFsndG91Y2hlbmQnLCAndGFwZW5kJywgJ3Ztb3VzZXVwJywgJ3RhcGRyYWdvdXQnXSwgZSwge1xuICAgICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgICB5OiBub3dbMV1cbiAgICAgICAgfSk7XG4gICAgICAgIHN0YXJ0LnVuYWN0aXZhdGUoKTtcbiAgICAgICAgci50b3VjaERhdGEuc3RhcnQgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIG5lYXIgPSByLmZpbmROZWFyZXN0RWxlbWVudChub3dbMF0sIG5vd1sxXSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHRyaWdnZXJFdmVudHMobmVhciwgWyd0b3VjaGVuZCcsICd0YXBlbmQnLCAndm1vdXNldXAnLCAndGFwZHJhZ291dCddLCBlLCB7XG4gICAgICAgICAgeDogbm93WzBdLFxuICAgICAgICAgIHk6IG5vd1sxXVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHZhciBkeCA9IHIudG91Y2hEYXRhLnN0YXJ0UG9zaXRpb25bMF0gLSBub3dbMF07XG4gICAgICB2YXIgZHgyID0gZHggKiBkeDtcbiAgICAgIHZhciBkeSA9IHIudG91Y2hEYXRhLnN0YXJ0UG9zaXRpb25bMV0gLSBub3dbMV07XG4gICAgICB2YXIgZHkyID0gZHkgKiBkeTtcbiAgICAgIHZhciBkaXN0MiA9IGR4MiArIGR5MjtcbiAgICAgIHZhciByZGlzdDIgPSBkaXN0MiAqIHpvb20gKiB6b29tO1xuXG4gICAgICAvLyBUYXAgZXZlbnQsIHJvdWdobHkgc2FtZSBhcyBtb3VzZSBjbGljayBldmVudCBmb3IgdG91Y2hcbiAgICAgIGlmICghci50b3VjaERhdGEuc2luZ2xlVG91Y2hNb3ZlZCkge1xuICAgICAgICBpZiAoIXN0YXJ0KSB7XG4gICAgICAgICAgY3kuJCgnOnNlbGVjdGVkJykudW5zZWxlY3QoWyd0YXB1bnNlbGVjdCddKTtcbiAgICAgICAgfVxuICAgICAgICB0cmlnZ2VyRXZlbnRzKHN0YXJ0LCBbJ3RhcCcsICd2Y2xpY2snXSwgZSwge1xuICAgICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgICB5OiBub3dbMV1cbiAgICAgICAgfSk7XG4gICAgICAgIGRpZERvdWJsZVRvdWNoID0gZmFsc2U7XG4gICAgICAgIGlmIChlLnRpbWVTdGFtcCAtIHByZXZUb3VjaFRpbWVTdGFtcCA8PSBjeS5tdWx0aUNsaWNrRGVib3VuY2VUaW1lKCkpIHtcbiAgICAgICAgICB0b3VjaFRpbWVvdXQgJiYgY2xlYXJUaW1lb3V0KHRvdWNoVGltZW91dCk7XG4gICAgICAgICAgZGlkRG91YmxlVG91Y2ggPSB0cnVlO1xuICAgICAgICAgIHByZXZUb3VjaFRpbWVTdGFtcCA9IG51bGw7XG4gICAgICAgICAgdHJpZ2dlckV2ZW50cyhzdGFydCwgWydkYmx0YXAnLCAndmRibGNsaWNrJ10sIGUsIHtcbiAgICAgICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgICAgIHk6IG5vd1sxXVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRvdWNoVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKGRpZERvdWJsZVRvdWNoKSByZXR1cm47XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnRzKHN0YXJ0LCBbJ29uZXRhcCcsICd2b25lY2xpY2snXSwgZSwge1xuICAgICAgICAgICAgICB4OiBub3dbMF0sXG4gICAgICAgICAgICAgIHk6IG5vd1sxXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSwgY3kubXVsdGlDbGlja0RlYm91bmNlVGltZSgpKTtcbiAgICAgICAgICBwcmV2VG91Y2hUaW1lU3RhbXAgPSBlLnRpbWVTdGFtcDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBQcmVwYXJlIHRvIHNlbGVjdCB0aGUgY3VycmVudGx5IHRvdWNoZWQgbm9kZSwgb25seSBpZiBpdCBoYXNuJ3QgYmVlbiBkcmFnZ2VkIHBhc3QgYSBjZXJ0YWluIGRpc3RhbmNlXG4gICAgICBpZiAoc3RhcnQgIT0gbnVsbCAmJiAhci5kcmFnRGF0YS5kaWREcmFnIC8vIGRpZG4ndCBkcmFnIG5vZGVzIGFyb3VuZFxuICAgICAgJiYgc3RhcnQuX3ByaXZhdGUuc2VsZWN0YWJsZSAmJiByZGlzdDIgPCByLnRvdWNoVGFwVGhyZXNob2xkMiAmJiAhci5waW5jaGluZyAvLyBwaW5jaCB0byB6b29tIHNob3VsZCBub3QgYWZmZWN0IHNlbGVjdGlvblxuICAgICAgKSB7XG4gICAgICAgIGlmIChjeS5zZWxlY3Rpb25UeXBlKCkgPT09ICdzaW5nbGUnKSB7XG4gICAgICAgICAgY3kuJChpc1NlbGVjdGVkKS51bm1lcmdlKHN0YXJ0KS51bnNlbGVjdChbJ3RhcHVuc2VsZWN0J10pO1xuICAgICAgICAgIHN0YXJ0LnNlbGVjdChbJ3RhcHNlbGVjdCddKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoc3RhcnQuc2VsZWN0ZWQoKSkge1xuICAgICAgICAgICAgc3RhcnQudW5zZWxlY3QoWyd0YXB1bnNlbGVjdCddKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RhcnQuc2VsZWN0KFsndGFwc2VsZWN0J10pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHIudG91Y2hEYXRhLnNpbmdsZVRvdWNoTW92ZWQgPSB0cnVlO1xuICAgIH1cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG5vdy5sZW5ndGg7IGorKykge1xuICAgICAgZWFybGllcltqXSA9IG5vd1tqXTtcbiAgICB9XG4gICAgci5kcmFnRGF0YS5kaWREcmFnID0gZmFsc2U7IC8vIHJlc2V0IGZvciBuZXh0IHRvdWNoc3RhcnRcblxuICAgIGlmIChlLnRvdWNoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByLnRvdWNoRGF0YS5kcmFnRGVsdGEgPSBbXTtcbiAgICAgIHIudG91Y2hEYXRhLnN0YXJ0UG9zaXRpb24gPSBbbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbF07XG4gICAgICByLnRvdWNoRGF0YS5zdGFydEdQb3NpdGlvbiA9IG51bGw7XG4gICAgICByLnRvdWNoRGF0YS5kaWRTZWxlY3QgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGUudG91Y2hlcy5sZW5ndGggPCAyKSB7XG4gICAgICBpZiAoZS50b3VjaGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAvLyB0aGUgb2xkIHN0YXJ0IGdsb2JhbCBwb3MnbiBtYXkgbm90IGJlIHRoZSBzYW1lIGZpbmdlciB0aGF0IHJlbWFpbnNcbiAgICAgICAgci50b3VjaERhdGEuc3RhcnRHUG9zaXRpb24gPSBbZS50b3VjaGVzWzBdLmNsaWVudFgsIGUudG91Y2hlc1swXS5jbGllbnRZXTtcbiAgICAgIH1cbiAgICAgIHIucGluY2hpbmcgPSBmYWxzZTtcbiAgICAgIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICAgICAgci5yZWRyYXcoKTtcbiAgICB9XG5cbiAgICAvL3IucmVkcmF3KCk7XG4gIH0sIGZhbHNlKTtcblxuICAvLyBmYWxsYmFjayBjb21wYXRpYmlsaXR5IGxheWVyIGZvciBtcyBwb2ludGVyIGV2ZW50c1xuICBpZiAodHlwZW9mIFRvdWNoRXZlbnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgdmFyIHBvaW50ZXJzID0gW107XG4gICAgdmFyIG1ha2VUb3VjaCA9IGZ1bmN0aW9uIG1ha2VUb3VjaChlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjbGllbnRYOiBlLmNsaWVudFgsXG4gICAgICAgIGNsaWVudFk6IGUuY2xpZW50WSxcbiAgICAgICAgZm9yY2U6IDEsXG4gICAgICAgIGlkZW50aWZpZXI6IGUucG9pbnRlcklkLFxuICAgICAgICBwYWdlWDogZS5wYWdlWCxcbiAgICAgICAgcGFnZVk6IGUucGFnZVksXG4gICAgICAgIHJhZGl1c1g6IGUud2lkdGggLyAyLFxuICAgICAgICByYWRpdXNZOiBlLmhlaWdodCAvIDIsXG4gICAgICAgIHNjcmVlblg6IGUuc2NyZWVuWCxcbiAgICAgICAgc2NyZWVuWTogZS5zY3JlZW5ZLFxuICAgICAgICB0YXJnZXQ6IGUudGFyZ2V0XG4gICAgICB9O1xuICAgIH07XG4gICAgdmFyIG1ha2VQb2ludGVyID0gZnVuY3Rpb24gbWFrZVBvaW50ZXIoZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXZlbnQ6IGUsXG4gICAgICAgIHRvdWNoOiBtYWtlVG91Y2goZSlcbiAgICAgIH07XG4gICAgfTtcbiAgICB2YXIgYWRkUG9pbnRlciA9IGZ1bmN0aW9uIGFkZFBvaW50ZXIoZSkge1xuICAgICAgcG9pbnRlcnMucHVzaChtYWtlUG9pbnRlcihlKSk7XG4gICAgfTtcbiAgICB2YXIgcmVtb3ZlUG9pbnRlciA9IGZ1bmN0aW9uIHJlbW92ZVBvaW50ZXIoZSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcCA9IHBvaW50ZXJzW2ldO1xuICAgICAgICBpZiAocC5ldmVudC5wb2ludGVySWQgPT09IGUucG9pbnRlcklkKSB7XG4gICAgICAgICAgcG9pbnRlcnMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgdmFyIHVwZGF0ZVBvaW50ZXIgPSBmdW5jdGlvbiB1cGRhdGVQb2ludGVyKGUpIHtcbiAgICAgIHZhciBwID0gcG9pbnRlcnMuZmlsdGVyKGZ1bmN0aW9uIChwKSB7XG4gICAgICAgIHJldHVybiBwLmV2ZW50LnBvaW50ZXJJZCA9PT0gZS5wb2ludGVySWQ7XG4gICAgICB9KVswXTtcbiAgICAgIHAuZXZlbnQgPSBlO1xuICAgICAgcC50b3VjaCA9IG1ha2VUb3VjaChlKTtcbiAgICB9O1xuICAgIHZhciBhZGRUb3VjaGVzVG9FdmVudCA9IGZ1bmN0aW9uIGFkZFRvdWNoZXNUb0V2ZW50KGUpIHtcbiAgICAgIGUudG91Y2hlcyA9IHBvaW50ZXJzLm1hcChmdW5jdGlvbiAocCkge1xuICAgICAgICByZXR1cm4gcC50b3VjaDtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgdmFyIHBvaW50ZXJJc01vdXNlID0gZnVuY3Rpb24gcG9pbnRlcklzTW91c2UoZSkge1xuICAgICAgcmV0dXJuIGUucG9pbnRlclR5cGUgPT09ICdtb3VzZScgfHwgZS5wb2ludGVyVHlwZSA9PT0gNDtcbiAgICB9O1xuICAgIHIucmVnaXN0ZXJCaW5kaW5nKHIuY29udGFpbmVyLCAncG9pbnRlcmRvd24nLCBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKHBvaW50ZXJJc01vdXNlKGUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gbW91c2UgYWxyZWFkeSBoYW5kbGVkXG5cbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGFkZFBvaW50ZXIoZSk7XG4gICAgICBhZGRUb3VjaGVzVG9FdmVudChlKTtcbiAgICAgIHRvdWNoc3RhcnRIYW5kbGVyKGUpO1xuICAgIH0pO1xuICAgIHIucmVnaXN0ZXJCaW5kaW5nKHIuY29udGFpbmVyLCAncG9pbnRlcnVwJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmIChwb2ludGVySXNNb3VzZShlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IC8vIG1vdXNlIGFscmVhZHkgaGFuZGxlZFxuXG4gICAgICByZW1vdmVQb2ludGVyKGUpO1xuICAgICAgYWRkVG91Y2hlc1RvRXZlbnQoZSk7XG4gICAgICB0b3VjaGVuZEhhbmRsZXIoZSk7XG4gICAgfSk7XG4gICAgci5yZWdpc3RlckJpbmRpbmcoci5jb250YWluZXIsICdwb2ludGVyY2FuY2VsJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmIChwb2ludGVySXNNb3VzZShlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IC8vIG1vdXNlIGFscmVhZHkgaGFuZGxlZFxuXG4gICAgICByZW1vdmVQb2ludGVyKGUpO1xuICAgICAgYWRkVG91Y2hlc1RvRXZlbnQoZSk7XG4gICAgICB0b3VjaGNhbmNlbEhhbmRsZXIoZSk7XG4gICAgfSk7XG4gICAgci5yZWdpc3RlckJpbmRpbmcoci5jb250YWluZXIsICdwb2ludGVybW92ZScsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAocG9pbnRlcklzTW91c2UoZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyBtb3VzZSBhbHJlYWR5IGhhbmRsZWRcblxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdXBkYXRlUG9pbnRlcihlKTtcbiAgICAgIGFkZFRvdWNoZXNUb0V2ZW50KGUpO1xuICAgICAgdG91Y2htb3ZlSGFuZGxlcihlKTtcbiAgICB9KTtcbiAgfVxufTtcblxudmFyIEJScCQyID0ge307XG5CUnAkMi5nZW5lcmF0ZVBvbHlnb24gPSBmdW5jdGlvbiAobmFtZSwgcG9pbnRzKSB7XG4gIHJldHVybiB0aGlzLm5vZGVTaGFwZXNbbmFtZV0gPSB7XG4gICAgcmVuZGVyZXI6IHRoaXMsXG4gICAgbmFtZTogbmFtZSxcbiAgICBwb2ludHM6IHBvaW50cyxcbiAgICBkcmF3OiBmdW5jdGlvbiBkcmF3KGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIGNvcm5lclJhZGl1cykge1xuICAgICAgdGhpcy5yZW5kZXJlci5ub2RlU2hhcGVJbXBsKCdwb2x5Z29uJywgY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgdGhpcy5wb2ludHMpO1xuICAgIH0sXG4gICAgaW50ZXJzZWN0TGluZTogZnVuY3Rpb24gaW50ZXJzZWN0TGluZShub2RlWCwgbm9kZVksIHdpZHRoLCBoZWlnaHQsIHgsIHksIHBhZGRpbmcsIGNvcm5lclJhZGl1cykge1xuICAgICAgcmV0dXJuIHBvbHlnb25JbnRlcnNlY3RMaW5lKHgsIHksIHRoaXMucG9pbnRzLCBub2RlWCwgbm9kZVksIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMiwgcGFkZGluZyk7XG4gICAgfSxcbiAgICBjaGVja1BvaW50OiBmdW5jdGlvbiBjaGVja1BvaW50KHgsIHksIHBhZGRpbmcsIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclksIGNvcm5lclJhZGl1cykge1xuICAgICAgcmV0dXJuIHBvaW50SW5zaWRlUG9seWdvbih4LCB5LCB0aGlzLnBvaW50cywgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgWzAsIC0xXSwgcGFkZGluZyk7XG4gICAgfSxcbiAgICBoYXNNaXRlckJvdW5kczogbmFtZSAhPT0gJ3JlY3RhbmdsZScsXG4gICAgbWl0ZXJCb3VuZHM6IGZ1bmN0aW9uIG1pdGVyQm91bmRzKGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHN0cm9rZVdpZHRoLCBzdHJva2VQb3NpdGlvbikge1xuICAgICAgcmV0dXJuIG1pdGVyQm94KHRoaXMucG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBzdHJva2VXaWR0aCk7XG4gICAgfVxuICB9O1xufTtcbkJScCQyLmdlbmVyYXRlRWxsaXBzZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubm9kZVNoYXBlc1snZWxsaXBzZSddID0ge1xuICAgIHJlbmRlcmVyOiB0aGlzLFxuICAgIG5hbWU6ICdlbGxpcHNlJyxcbiAgICBkcmF3OiBmdW5jdGlvbiBkcmF3KGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIGNvcm5lclJhZGl1cykge1xuICAgICAgdGhpcy5yZW5kZXJlci5ub2RlU2hhcGVJbXBsKHRoaXMubmFtZSwgY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCk7XG4gICAgfSxcbiAgICBpbnRlcnNlY3RMaW5lOiBmdW5jdGlvbiBpbnRlcnNlY3RMaW5lKG5vZGVYLCBub2RlWSwgd2lkdGgsIGhlaWdodCwgeCwgeSwgcGFkZGluZywgY29ybmVyUmFkaXVzKSB7XG4gICAgICByZXR1cm4gaW50ZXJzZWN0TGluZUVsbGlwc2UoeCwgeSwgbm9kZVgsIG5vZGVZLCB3aWR0aCAvIDIgKyBwYWRkaW5nLCBoZWlnaHQgLyAyICsgcGFkZGluZyk7XG4gICAgfSxcbiAgICBjaGVja1BvaW50OiBmdW5jdGlvbiBjaGVja1BvaW50KHgsIHksIHBhZGRpbmcsIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclksIGNvcm5lclJhZGl1cykge1xuICAgICAgcmV0dXJuIGNoZWNrSW5FbGxpcHNlKHgsIHksIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclksIHBhZGRpbmcpO1xuICAgIH1cbiAgfTtcbn07XG5CUnAkMi5nZW5lcmF0ZVJvdW5kUG9seWdvbiA9IGZ1bmN0aW9uIChuYW1lLCBwb2ludHMpIHtcbiAgcmV0dXJuIHRoaXMubm9kZVNoYXBlc1tuYW1lXSA9IHtcbiAgICByZW5kZXJlcjogdGhpcyxcbiAgICBuYW1lOiBuYW1lLFxuICAgIHBvaW50czogcG9pbnRzLFxuICAgIGdldE9yQ3JlYXRlQ29ybmVyczogZnVuY3Rpb24gZ2V0T3JDcmVhdGVDb3JuZXJzKGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIGNvcm5lclJhZGl1cywgcnMsIGZpZWxkKSB7XG4gICAgICBpZiAocnNbZmllbGRdICE9PSB1bmRlZmluZWQgJiYgcnNbZmllbGQgKyAnLWN4J10gPT09IGNlbnRlclggJiYgcnNbZmllbGQgKyAnLWN5J10gPT09IGNlbnRlclkgJiYgcnNbZmllbGQgKyAnLXcnXSA9PT0gd2lkdGggJiYgcnNbZmllbGQgKyAnLWgnXSA9PT0gaGVpZ2h0ICYmIHJzW2ZpZWxkICsgJy1jb3JuZXItcmFkaXVzJ10gPT09IGNvcm5lclJhZGl1cykge1xuICAgICAgICByZXR1cm4gcnNbZmllbGRdO1xuICAgICAgfVxuICAgICAgcnNbZmllbGRdID0gbmV3IEFycmF5KHBvaW50cy5sZW5ndGggLyAyKTtcbiAgICAgIHJzW2ZpZWxkICsgJy1jeCddID0gY2VudGVyWDtcbiAgICAgIHJzW2ZpZWxkICsgJy1jeSddID0gY2VudGVyWTtcbiAgICAgIHJzW2ZpZWxkICsgJy13J10gPSB3aWR0aDtcbiAgICAgIHJzW2ZpZWxkICsgJy1oJ10gPSBoZWlnaHQ7XG4gICAgICByc1tmaWVsZCArICctY29ybmVyLXJhZGl1cyddID0gY29ybmVyUmFkaXVzO1xuICAgICAgdmFyIGhhbGZXID0gd2lkdGggLyAyO1xuICAgICAgdmFyIGhhbGZIID0gaGVpZ2h0IC8gMjtcbiAgICAgIGNvcm5lclJhZGl1cyA9IGNvcm5lclJhZGl1cyA9PT0gJ2F1dG8nID8gZ2V0Um91bmRQb2x5Z29uUmFkaXVzKHdpZHRoLCBoZWlnaHQpIDogY29ybmVyUmFkaXVzO1xuICAgICAgdmFyIHAgPSBuZXcgQXJyYXkocG9pbnRzLmxlbmd0aCAvIDIpO1xuICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IHBvaW50cy5sZW5ndGggLyAyOyBfaSsrKSB7XG4gICAgICAgIHBbX2ldID0ge1xuICAgICAgICAgIHg6IGNlbnRlclggKyBoYWxmVyAqIHBvaW50c1tfaSAqIDJdLFxuICAgICAgICAgIHk6IGNlbnRlclkgKyBoYWxmSCAqIHBvaW50c1tfaSAqIDIgKyAxXVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgdmFyIGksXG4gICAgICAgIHAxLFxuICAgICAgICBwMixcbiAgICAgICAgcDMsXG4gICAgICAgIGxlbiA9IHAubGVuZ3RoO1xuICAgICAgcDEgPSBwW2xlbiAtIDFdO1xuICAgICAgLy8gZm9yIGVhY2ggcG9pbnRcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBwMiA9IHBbaSAlIGxlbl07XG4gICAgICAgIHAzID0gcFsoaSArIDEpICUgbGVuXTtcbiAgICAgICAgcnNbZmllbGRdW2ldID0gZ2V0Um91bmRDb3JuZXIocDEsIHAyLCBwMywgY29ybmVyUmFkaXVzKTtcbiAgICAgICAgcDEgPSBwMjtcbiAgICAgICAgcDIgPSBwMztcbiAgICAgIH1cbiAgICAgIHJldHVybiByc1tmaWVsZF07XG4gICAgfSxcbiAgICBkcmF3OiBmdW5jdGlvbiBkcmF3KGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIGNvcm5lclJhZGl1cywgcnMpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIubm9kZVNoYXBlSW1wbCgncm91bmQtcG9seWdvbicsIGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHRoaXMucG9pbnRzLCB0aGlzLmdldE9yQ3JlYXRlQ29ybmVycyhjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBjb3JuZXJSYWRpdXMsIHJzLCAnZHJhd0Nvcm5lcnMnKSk7XG4gICAgfSxcbiAgICBpbnRlcnNlY3RMaW5lOiBmdW5jdGlvbiBpbnRlcnNlY3RMaW5lKG5vZGVYLCBub2RlWSwgd2lkdGgsIGhlaWdodCwgeCwgeSwgcGFkZGluZywgY29ybmVyUmFkaXVzLCBycykge1xuICAgICAgcmV0dXJuIHJvdW5kUG9seWdvbkludGVyc2VjdExpbmUoeCwgeSwgdGhpcy5wb2ludHMsIG5vZGVYLCBub2RlWSwgd2lkdGgsIGhlaWdodCwgcGFkZGluZywgdGhpcy5nZXRPckNyZWF0ZUNvcm5lcnMobm9kZVgsIG5vZGVZLCB3aWR0aCwgaGVpZ2h0LCBjb3JuZXJSYWRpdXMsIHJzLCAnY29ybmVycycpKTtcbiAgICB9LFxuICAgIGNoZWNrUG9pbnQ6IGZ1bmN0aW9uIGNoZWNrUG9pbnQoeCwgeSwgcGFkZGluZywgd2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSwgY29ybmVyUmFkaXVzLCBycykge1xuICAgICAgcmV0dXJuIHBvaW50SW5zaWRlUm91bmRQb2x5Z29uKHgsIHksIHRoaXMucG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCB0aGlzLmdldE9yQ3JlYXRlQ29ybmVycyhjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBjb3JuZXJSYWRpdXMsIHJzLCAnY29ybmVycycpKTtcbiAgICB9XG4gIH07XG59O1xuQlJwJDIuZ2VuZXJhdGVSb3VuZFJlY3RhbmdsZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubm9kZVNoYXBlc1sncm91bmQtcmVjdGFuZ2xlJ10gPSB0aGlzLm5vZGVTaGFwZXNbJ3JvdW5kcmVjdGFuZ2xlJ10gPSB7XG4gICAgcmVuZGVyZXI6IHRoaXMsXG4gICAgbmFtZTogJ3JvdW5kLXJlY3RhbmdsZScsXG4gICAgcG9pbnRzOiBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoNCwgMCksXG4gICAgZHJhdzogZnVuY3Rpb24gZHJhdyhjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBjb3JuZXJSYWRpdXMpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIubm9kZVNoYXBlSW1wbCh0aGlzLm5hbWUsIGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHRoaXMucG9pbnRzLCBjb3JuZXJSYWRpdXMpO1xuICAgIH0sXG4gICAgaW50ZXJzZWN0TGluZTogZnVuY3Rpb24gaW50ZXJzZWN0TGluZShub2RlWCwgbm9kZVksIHdpZHRoLCBoZWlnaHQsIHgsIHksIHBhZGRpbmcsIGNvcm5lclJhZGl1cykge1xuICAgICAgcmV0dXJuIHJvdW5kUmVjdGFuZ2xlSW50ZXJzZWN0TGluZSh4LCB5LCBub2RlWCwgbm9kZVksIHdpZHRoLCBoZWlnaHQsIHBhZGRpbmcsIGNvcm5lclJhZGl1cyk7XG4gICAgfSxcbiAgICBjaGVja1BvaW50OiBmdW5jdGlvbiBjaGVja1BvaW50KHgsIHksIHBhZGRpbmcsIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclksIGNvcm5lclJhZGl1cykge1xuICAgICAgdmFyIGhhbGZXaWR0aCA9IHdpZHRoIC8gMjtcbiAgICAgIHZhciBoYWxmSGVpZ2h0ID0gaGVpZ2h0IC8gMjtcbiAgICAgIGNvcm5lclJhZGl1cyA9IGNvcm5lclJhZGl1cyA9PT0gJ2F1dG8nID8gZ2V0Um91bmRSZWN0YW5nbGVSYWRpdXMod2lkdGgsIGhlaWdodCkgOiBjb3JuZXJSYWRpdXM7XG4gICAgICBjb3JuZXJSYWRpdXMgPSBNYXRoLm1pbihoYWxmV2lkdGgsIGhhbGZIZWlnaHQsIGNvcm5lclJhZGl1cyk7XG4gICAgICB2YXIgZGlhbSA9IGNvcm5lclJhZGl1cyAqIDI7XG5cbiAgICAgIC8vIENoZWNrIGhCb3hcbiAgICAgIGlmIChwb2ludEluc2lkZVBvbHlnb24oeCwgeSwgdGhpcy5wb2ludHMsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQgLSBkaWFtLCBbMCwgLTFdLCBwYWRkaW5nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgdkJveFxuICAgICAgaWYgKHBvaW50SW5zaWRlUG9seWdvbih4LCB5LCB0aGlzLnBvaW50cywgY2VudGVyWCwgY2VudGVyWSwgd2lkdGggLSBkaWFtLCBoZWlnaHQsIFswLCAtMV0sIHBhZGRpbmcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayB0b3AgbGVmdCBxdWFydGVyIGNpcmNsZVxuICAgICAgaWYgKGNoZWNrSW5FbGxpcHNlKHgsIHksIGRpYW0sIGRpYW0sIGNlbnRlclggLSBoYWxmV2lkdGggKyBjb3JuZXJSYWRpdXMsIGNlbnRlclkgLSBoYWxmSGVpZ2h0ICsgY29ybmVyUmFkaXVzLCBwYWRkaW5nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgdG9wIHJpZ2h0IHF1YXJ0ZXIgY2lyY2xlXG4gICAgICBpZiAoY2hlY2tJbkVsbGlwc2UoeCwgeSwgZGlhbSwgZGlhbSwgY2VudGVyWCArIGhhbGZXaWR0aCAtIGNvcm5lclJhZGl1cywgY2VudGVyWSAtIGhhbGZIZWlnaHQgKyBjb3JuZXJSYWRpdXMsIHBhZGRpbmcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBib3R0b20gcmlnaHQgcXVhcnRlciBjaXJjbGVcbiAgICAgIGlmIChjaGVja0luRWxsaXBzZSh4LCB5LCBkaWFtLCBkaWFtLCBjZW50ZXJYICsgaGFsZldpZHRoIC0gY29ybmVyUmFkaXVzLCBjZW50ZXJZICsgaGFsZkhlaWdodCAtIGNvcm5lclJhZGl1cywgcGFkZGluZykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGJvdHRvbSBsZWZ0IHF1YXJ0ZXIgY2lyY2xlXG4gICAgICBpZiAoY2hlY2tJbkVsbGlwc2UoeCwgeSwgZGlhbSwgZGlhbSwgY2VudGVyWCAtIGhhbGZXaWR0aCArIGNvcm5lclJhZGl1cywgY2VudGVyWSArIGhhbGZIZWlnaHQgLSBjb3JuZXJSYWRpdXMsIHBhZGRpbmcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcbn07XG5CUnAkMi5nZW5lcmF0ZUN1dFJlY3RhbmdsZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubm9kZVNoYXBlc1snY3V0LXJlY3RhbmdsZSddID0gdGhpcy5ub2RlU2hhcGVzWydjdXRyZWN0YW5nbGUnXSA9IHtcbiAgICByZW5kZXJlcjogdGhpcyxcbiAgICBuYW1lOiAnY3V0LXJlY3RhbmdsZScsXG4gICAgY29ybmVyTGVuZ3RoOiBnZXRDdXRSZWN0YW5nbGVDb3JuZXJMZW5ndGgoKSxcbiAgICBwb2ludHM6IGdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSg0LCAwKSxcbiAgICBkcmF3OiBmdW5jdGlvbiBkcmF3KGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIGNvcm5lclJhZGl1cykge1xuICAgICAgdGhpcy5yZW5kZXJlci5ub2RlU2hhcGVJbXBsKHRoaXMubmFtZSwgY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgbnVsbCwgY29ybmVyUmFkaXVzKTtcbiAgICB9LFxuICAgIGdlbmVyYXRlQ3V0VHJpYW5nbGVQdHM6IGZ1bmN0aW9uIGdlbmVyYXRlQ3V0VHJpYW5nbGVQdHMod2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSwgY29ybmVyUmFkaXVzKSB7XG4gICAgICB2YXIgY2wgPSBjb3JuZXJSYWRpdXMgPT09ICdhdXRvJyA/IHRoaXMuY29ybmVyTGVuZ3RoIDogY29ybmVyUmFkaXVzO1xuICAgICAgdmFyIGhoID0gaGVpZ2h0IC8gMjtcbiAgICAgIHZhciBodyA9IHdpZHRoIC8gMjtcbiAgICAgIHZhciB4QmVnaW4gPSBjZW50ZXJYIC0gaHc7XG4gICAgICB2YXIgeEVuZCA9IGNlbnRlclggKyBodztcbiAgICAgIHZhciB5QmVnaW4gPSBjZW50ZXJZIC0gaGg7XG4gICAgICB2YXIgeUVuZCA9IGNlbnRlclkgKyBoaDtcblxuICAgICAgLy8gcG9pbnRzIGFyZSBpbiBjbG9ja3dpc2Ugb3JkZXIsIGlubmVyIChpbWFnaW5hcnkpIHRyaWFuZ2xlIHB0IG9uIFs0LCA1XVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdG9wTGVmdDogW3hCZWdpbiwgeUJlZ2luICsgY2wsIHhCZWdpbiArIGNsLCB5QmVnaW4sIHhCZWdpbiArIGNsLCB5QmVnaW4gKyBjbF0sXG4gICAgICAgIHRvcFJpZ2h0OiBbeEVuZCAtIGNsLCB5QmVnaW4sIHhFbmQsIHlCZWdpbiArIGNsLCB4RW5kIC0gY2wsIHlCZWdpbiArIGNsXSxcbiAgICAgICAgYm90dG9tUmlnaHQ6IFt4RW5kLCB5RW5kIC0gY2wsIHhFbmQgLSBjbCwgeUVuZCwgeEVuZCAtIGNsLCB5RW5kIC0gY2xdLFxuICAgICAgICBib3R0b21MZWZ0OiBbeEJlZ2luICsgY2wsIHlFbmQsIHhCZWdpbiwgeUVuZCAtIGNsLCB4QmVnaW4gKyBjbCwgeUVuZCAtIGNsXVxuICAgICAgfTtcbiAgICB9LFxuICAgIGludGVyc2VjdExpbmU6IGZ1bmN0aW9uIGludGVyc2VjdExpbmUobm9kZVgsIG5vZGVZLCB3aWR0aCwgaGVpZ2h0LCB4LCB5LCBwYWRkaW5nLCBjb3JuZXJSYWRpdXMpIHtcbiAgICAgIHZhciBjUHRzID0gdGhpcy5nZW5lcmF0ZUN1dFRyaWFuZ2xlUHRzKHdpZHRoICsgMiAqIHBhZGRpbmcsIGhlaWdodCArIDIgKiBwYWRkaW5nLCBub2RlWCwgbm9kZVksIGNvcm5lclJhZGl1cyk7XG4gICAgICB2YXIgcHRzID0gW10uY29uY2F0LmFwcGx5KFtdLCBbY1B0cy50b3BMZWZ0LnNwbGljZSgwLCA0KSwgY1B0cy50b3BSaWdodC5zcGxpY2UoMCwgNCksIGNQdHMuYm90dG9tUmlnaHQuc3BsaWNlKDAsIDQpLCBjUHRzLmJvdHRvbUxlZnQuc3BsaWNlKDAsIDQpXSk7XG4gICAgICByZXR1cm4gcG9seWdvbkludGVyc2VjdExpbmUoeCwgeSwgcHRzLCBub2RlWCwgbm9kZVkpO1xuICAgIH0sXG4gICAgY2hlY2tQb2ludDogZnVuY3Rpb24gY2hlY2tQb2ludCh4LCB5LCBwYWRkaW5nLCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZLCBjb3JuZXJSYWRpdXMpIHtcbiAgICAgIHZhciBjbCA9IGNvcm5lclJhZGl1cyA9PT0gJ2F1dG8nID8gdGhpcy5jb3JuZXJMZW5ndGggOiBjb3JuZXJSYWRpdXM7XG4gICAgICAvLyBDaGVjayBoQm94XG4gICAgICBpZiAocG9pbnRJbnNpZGVQb2x5Z29uKHgsIHksIHRoaXMucG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0IC0gMiAqIGNsLCBbMCwgLTFdLCBwYWRkaW5nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgdkJveFxuICAgICAgaWYgKHBvaW50SW5zaWRlUG9seWdvbih4LCB5LCB0aGlzLnBvaW50cywgY2VudGVyWCwgY2VudGVyWSwgd2lkdGggLSAyICogY2wsIGhlaWdodCwgWzAsIC0xXSwgcGFkZGluZykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICB2YXIgY3V0VHJpYW5nbGVQdHMgPSB0aGlzLmdlbmVyYXRlQ3V0VHJpYW5nbGVQdHMod2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSk7XG4gICAgICByZXR1cm4gcG9pbnRJbnNpZGVQb2x5Z29uUG9pbnRzKHgsIHksIGN1dFRyaWFuZ2xlUHRzLnRvcExlZnQpIHx8IHBvaW50SW5zaWRlUG9seWdvblBvaW50cyh4LCB5LCBjdXRUcmlhbmdsZVB0cy50b3BSaWdodCkgfHwgcG9pbnRJbnNpZGVQb2x5Z29uUG9pbnRzKHgsIHksIGN1dFRyaWFuZ2xlUHRzLmJvdHRvbVJpZ2h0KSB8fCBwb2ludEluc2lkZVBvbHlnb25Qb2ludHMoeCwgeSwgY3V0VHJpYW5nbGVQdHMuYm90dG9tTGVmdCk7XG4gICAgfVxuICB9O1xufTtcbkJScCQyLmdlbmVyYXRlQmFycmVsID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5ub2RlU2hhcGVzWydiYXJyZWwnXSA9IHtcbiAgICByZW5kZXJlcjogdGhpcyxcbiAgICBuYW1lOiAnYmFycmVsJyxcbiAgICBwb2ludHM6IGdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSg0LCAwKSxcbiAgICBkcmF3OiBmdW5jdGlvbiBkcmF3KGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIGNvcm5lclJhZGl1cykge1xuICAgICAgdGhpcy5yZW5kZXJlci5ub2RlU2hhcGVJbXBsKHRoaXMubmFtZSwgY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCk7XG4gICAgfSxcbiAgICBpbnRlcnNlY3RMaW5lOiBmdW5jdGlvbiBpbnRlcnNlY3RMaW5lKG5vZGVYLCBub2RlWSwgd2lkdGgsIGhlaWdodCwgeCwgeSwgcGFkZGluZywgY29ybmVyUmFkaXVzKSB7XG4gICAgICAvLyB1c2UgdHdvIGZpeGVkIHQgdmFsdWVzIGZvciB0aGUgYmV6aWVyIGN1cnZlIGFwcHJveGltYXRpb25cblxuICAgICAgdmFyIHQwID0gMC4xNTtcbiAgICAgIHZhciB0MSA9IDAuNTtcbiAgICAgIHZhciB0MiA9IDAuODU7XG4gICAgICB2YXIgYlB0cyA9IHRoaXMuZ2VuZXJhdGVCYXJyZWxCZXppZXJQdHMod2lkdGggKyAyICogcGFkZGluZywgaGVpZ2h0ICsgMiAqIHBhZGRpbmcsIG5vZGVYLCBub2RlWSk7XG4gICAgICB2YXIgYXBwcm94aW1hdGVCYXJyZWxDdXJ2ZVB0cyA9IGZ1bmN0aW9uIGFwcHJveGltYXRlQmFycmVsQ3VydmVQdHMocHRzKSB7XG4gICAgICAgIC8vIGFwcHJveGltYXRlIGN1cnZlIHB0cyBiYXNlZCBvbiB0aGUgdHdvIHQgdmFsdWVzXG4gICAgICAgIHZhciBtMCA9IHFiZXppZXJQdEF0KHtcbiAgICAgICAgICB4OiBwdHNbMF0sXG4gICAgICAgICAgeTogcHRzWzFdXG4gICAgICAgIH0sIHtcbiAgICAgICAgICB4OiBwdHNbMl0sXG4gICAgICAgICAgeTogcHRzWzNdXG4gICAgICAgIH0sIHtcbiAgICAgICAgICB4OiBwdHNbNF0sXG4gICAgICAgICAgeTogcHRzWzVdXG4gICAgICAgIH0sIHQwKTtcbiAgICAgICAgdmFyIG0xID0gcWJlemllclB0QXQoe1xuICAgICAgICAgIHg6IHB0c1swXSxcbiAgICAgICAgICB5OiBwdHNbMV1cbiAgICAgICAgfSwge1xuICAgICAgICAgIHg6IHB0c1syXSxcbiAgICAgICAgICB5OiBwdHNbM11cbiAgICAgICAgfSwge1xuICAgICAgICAgIHg6IHB0c1s0XSxcbiAgICAgICAgICB5OiBwdHNbNV1cbiAgICAgICAgfSwgdDEpO1xuICAgICAgICB2YXIgbTIgPSBxYmV6aWVyUHRBdCh7XG4gICAgICAgICAgeDogcHRzWzBdLFxuICAgICAgICAgIHk6IHB0c1sxXVxuICAgICAgICB9LCB7XG4gICAgICAgICAgeDogcHRzWzJdLFxuICAgICAgICAgIHk6IHB0c1szXVxuICAgICAgICB9LCB7XG4gICAgICAgICAgeDogcHRzWzRdLFxuICAgICAgICAgIHk6IHB0c1s1XVxuICAgICAgICB9LCB0Mik7XG4gICAgICAgIHJldHVybiBbcHRzWzBdLCBwdHNbMV0sIG0wLngsIG0wLnksIG0xLngsIG0xLnksIG0yLngsIG0yLnksIHB0c1s0XSwgcHRzWzVdXTtcbiAgICAgIH07XG4gICAgICB2YXIgcHRzID0gW10uY29uY2F0KGFwcHJveGltYXRlQmFycmVsQ3VydmVQdHMoYlB0cy50b3BMZWZ0KSwgYXBwcm94aW1hdGVCYXJyZWxDdXJ2ZVB0cyhiUHRzLnRvcFJpZ2h0KSwgYXBwcm94aW1hdGVCYXJyZWxDdXJ2ZVB0cyhiUHRzLmJvdHRvbVJpZ2h0KSwgYXBwcm94aW1hdGVCYXJyZWxDdXJ2ZVB0cyhiUHRzLmJvdHRvbUxlZnQpKTtcbiAgICAgIHJldHVybiBwb2x5Z29uSW50ZXJzZWN0TGluZSh4LCB5LCBwdHMsIG5vZGVYLCBub2RlWSk7XG4gICAgfSxcbiAgICBnZW5lcmF0ZUJhcnJlbEJlemllclB0czogZnVuY3Rpb24gZ2VuZXJhdGVCYXJyZWxCZXppZXJQdHMod2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSkge1xuICAgICAgdmFyIGhoID0gaGVpZ2h0IC8gMjtcbiAgICAgIHZhciBodyA9IHdpZHRoIC8gMjtcbiAgICAgIHZhciB4QmVnaW4gPSBjZW50ZXJYIC0gaHc7XG4gICAgICB2YXIgeEVuZCA9IGNlbnRlclggKyBodztcbiAgICAgIHZhciB5QmVnaW4gPSBjZW50ZXJZIC0gaGg7XG4gICAgICB2YXIgeUVuZCA9IGNlbnRlclkgKyBoaDtcbiAgICAgIHZhciBjdXJ2ZUNvbnN0YW50cyA9IGdldEJhcnJlbEN1cnZlQ29uc3RhbnRzKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgdmFyIGhPZmZzZXQgPSBjdXJ2ZUNvbnN0YW50cy5oZWlnaHRPZmZzZXQ7XG4gICAgICB2YXIgd09mZnNldCA9IGN1cnZlQ29uc3RhbnRzLndpZHRoT2Zmc2V0O1xuICAgICAgdmFyIGN0cmxQdFhPZmZzZXQgPSBjdXJ2ZUNvbnN0YW50cy5jdHJsUHRPZmZzZXRQY3QgKiB3aWR0aDtcblxuICAgICAgLy8gcG9pbnRzIGFyZSBpbiBjbG9ja3dpc2Ugb3JkZXIsIGlubmVyIChpbWFnaW5hcnkpIGNvbnRyb2wgcHQgb24gWzQsIDVdXG4gICAgICB2YXIgcHRzID0ge1xuICAgICAgICB0b3BMZWZ0OiBbeEJlZ2luLCB5QmVnaW4gKyBoT2Zmc2V0LCB4QmVnaW4gKyBjdHJsUHRYT2Zmc2V0LCB5QmVnaW4sIHhCZWdpbiArIHdPZmZzZXQsIHlCZWdpbl0sXG4gICAgICAgIHRvcFJpZ2h0OiBbeEVuZCAtIHdPZmZzZXQsIHlCZWdpbiwgeEVuZCAtIGN0cmxQdFhPZmZzZXQsIHlCZWdpbiwgeEVuZCwgeUJlZ2luICsgaE9mZnNldF0sXG4gICAgICAgIGJvdHRvbVJpZ2h0OiBbeEVuZCwgeUVuZCAtIGhPZmZzZXQsIHhFbmQgLSBjdHJsUHRYT2Zmc2V0LCB5RW5kLCB4RW5kIC0gd09mZnNldCwgeUVuZF0sXG4gICAgICAgIGJvdHRvbUxlZnQ6IFt4QmVnaW4gKyB3T2Zmc2V0LCB5RW5kLCB4QmVnaW4gKyBjdHJsUHRYT2Zmc2V0LCB5RW5kLCB4QmVnaW4sIHlFbmQgLSBoT2Zmc2V0XVxuICAgICAgfTtcbiAgICAgIHB0cy50b3BMZWZ0LmlzVG9wID0gdHJ1ZTtcbiAgICAgIHB0cy50b3BSaWdodC5pc1RvcCA9IHRydWU7XG4gICAgICBwdHMuYm90dG9tTGVmdC5pc0JvdHRvbSA9IHRydWU7XG4gICAgICBwdHMuYm90dG9tUmlnaHQuaXNCb3R0b20gPSB0cnVlO1xuICAgICAgcmV0dXJuIHB0cztcbiAgICB9LFxuICAgIGNoZWNrUG9pbnQ6IGZ1bmN0aW9uIGNoZWNrUG9pbnQoeCwgeSwgcGFkZGluZywgd2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSwgY29ybmVyUmFkaXVzKSB7XG4gICAgICB2YXIgY3VydmVDb25zdGFudHMgPSBnZXRCYXJyZWxDdXJ2ZUNvbnN0YW50cyh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIHZhciBoT2Zmc2V0ID0gY3VydmVDb25zdGFudHMuaGVpZ2h0T2Zmc2V0O1xuICAgICAgdmFyIHdPZmZzZXQgPSBjdXJ2ZUNvbnN0YW50cy53aWR0aE9mZnNldDtcblxuICAgICAgLy8gQ2hlY2sgaEJveFxuICAgICAgaWYgKHBvaW50SW5zaWRlUG9seWdvbih4LCB5LCB0aGlzLnBvaW50cywgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCAtIDIgKiBoT2Zmc2V0LCBbMCwgLTFdLCBwYWRkaW5nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgdkJveFxuICAgICAgaWYgKHBvaW50SW5zaWRlUG9seWdvbih4LCB5LCB0aGlzLnBvaW50cywgY2VudGVyWCwgY2VudGVyWSwgd2lkdGggLSAyICogd09mZnNldCwgaGVpZ2h0LCBbMCwgLTFdLCBwYWRkaW5nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHZhciBiYXJyZWxDdXJ2ZVB0cyA9IHRoaXMuZ2VuZXJhdGVCYXJyZWxCZXppZXJQdHMod2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSk7XG4gICAgICB2YXIgZ2V0Q3VydmVUID0gZnVuY3Rpb24gZ2V0Q3VydmVUKHgsIHksIGN1cnZlUHRzKSB7XG4gICAgICAgIHZhciB4MCA9IGN1cnZlUHRzWzRdO1xuICAgICAgICB2YXIgeDEgPSBjdXJ2ZVB0c1syXTtcbiAgICAgICAgdmFyIHgyID0gY3VydmVQdHNbMF07XG4gICAgICAgIHZhciB5MCA9IGN1cnZlUHRzWzVdO1xuICAgICAgICAvLyB2YXIgeTEgPSBjdXJ2ZVB0c1sgMyBdO1xuICAgICAgICB2YXIgeTIgPSBjdXJ2ZVB0c1sxXTtcbiAgICAgICAgdmFyIHhNaW4gPSBNYXRoLm1pbih4MCwgeDIpO1xuICAgICAgICB2YXIgeE1heCA9IE1hdGgubWF4KHgwLCB4Mik7XG4gICAgICAgIHZhciB5TWluID0gTWF0aC5taW4oeTAsIHkyKTtcbiAgICAgICAgdmFyIHlNYXggPSBNYXRoLm1heCh5MCwgeTIpO1xuICAgICAgICBpZiAoeE1pbiA8PSB4ICYmIHggPD0geE1heCAmJiB5TWluIDw9IHkgJiYgeSA8PSB5TWF4KSB7XG4gICAgICAgICAgdmFyIGNvZWZmID0gYmV6aWVyUHRzVG9RdWFkQ29lZmYoeDAsIHgxLCB4Mik7XG4gICAgICAgICAgdmFyIHJvb3RzID0gc29sdmVRdWFkcmF0aWMoY29lZmZbMF0sIGNvZWZmWzFdLCBjb2VmZlsyXSwgeCk7XG4gICAgICAgICAgdmFyIHZhbGlkUm9vdHMgPSByb290cy5maWx0ZXIoZnVuY3Rpb24gKHIpIHtcbiAgICAgICAgICAgIHJldHVybiAwIDw9IHIgJiYgciA8PSAxO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmICh2YWxpZFJvb3RzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiB2YWxpZFJvb3RzWzBdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH07XG4gICAgICB2YXIgY3VydmVSZWdpb25zID0gT2JqZWN0LmtleXMoYmFycmVsQ3VydmVQdHMpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjdXJ2ZVJlZ2lvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNvcm5lciA9IGN1cnZlUmVnaW9uc1tpXTtcbiAgICAgICAgdmFyIGNvcm5lclB0cyA9IGJhcnJlbEN1cnZlUHRzW2Nvcm5lcl07XG4gICAgICAgIHZhciB0ID0gZ2V0Q3VydmVUKHgsIHksIGNvcm5lclB0cyk7XG4gICAgICAgIGlmICh0ID09IG51bGwpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgeTAgPSBjb3JuZXJQdHNbNV07XG4gICAgICAgIHZhciB5MSA9IGNvcm5lclB0c1szXTtcbiAgICAgICAgdmFyIHkyID0gY29ybmVyUHRzWzFdO1xuICAgICAgICB2YXIgYmV6WSA9IHFiZXppZXJBdCh5MCwgeTEsIHkyLCB0KTtcbiAgICAgICAgaWYgKGNvcm5lclB0cy5pc1RvcCAmJiBiZXpZIDw9IHkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29ybmVyUHRzLmlzQm90dG9tICYmIHkgPD0gYmV6WSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9O1xufTtcbkJScCQyLmdlbmVyYXRlQm90dG9tUm91bmRyZWN0YW5nbGUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLm5vZGVTaGFwZXNbJ2JvdHRvbS1yb3VuZC1yZWN0YW5nbGUnXSA9IHRoaXMubm9kZVNoYXBlc1snYm90dG9tcm91bmRyZWN0YW5nbGUnXSA9IHtcbiAgICByZW5kZXJlcjogdGhpcyxcbiAgICBuYW1lOiAnYm90dG9tLXJvdW5kLXJlY3RhbmdsZScsXG4gICAgcG9pbnRzOiBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoNCwgMCksXG4gICAgZHJhdzogZnVuY3Rpb24gZHJhdyhjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBjb3JuZXJSYWRpdXMpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIubm9kZVNoYXBlSW1wbCh0aGlzLm5hbWUsIGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHRoaXMucG9pbnRzLCBjb3JuZXJSYWRpdXMpO1xuICAgIH0sXG4gICAgaW50ZXJzZWN0TGluZTogZnVuY3Rpb24gaW50ZXJzZWN0TGluZShub2RlWCwgbm9kZVksIHdpZHRoLCBoZWlnaHQsIHgsIHksIHBhZGRpbmcsIGNvcm5lclJhZGl1cykge1xuICAgICAgdmFyIHRvcFN0YXJ0WCA9IG5vZGVYIC0gKHdpZHRoIC8gMiArIHBhZGRpbmcpO1xuICAgICAgdmFyIHRvcFN0YXJ0WSA9IG5vZGVZIC0gKGhlaWdodCAvIDIgKyBwYWRkaW5nKTtcbiAgICAgIHZhciB0b3BFbmRZID0gdG9wU3RhcnRZO1xuICAgICAgdmFyIHRvcEVuZFggPSBub2RlWCArICh3aWR0aCAvIDIgKyBwYWRkaW5nKTtcbiAgICAgIHZhciB0b3BJbnRlcnNlY3Rpb25zID0gZmluaXRlTGluZXNJbnRlcnNlY3QoeCwgeSwgbm9kZVgsIG5vZGVZLCB0b3BTdGFydFgsIHRvcFN0YXJ0WSwgdG9wRW5kWCwgdG9wRW5kWSwgZmFsc2UpO1xuICAgICAgaWYgKHRvcEludGVyc2VjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gdG9wSW50ZXJzZWN0aW9ucztcbiAgICAgIH1cbiAgICAgIHJldHVybiByb3VuZFJlY3RhbmdsZUludGVyc2VjdExpbmUoeCwgeSwgbm9kZVgsIG5vZGVZLCB3aWR0aCwgaGVpZ2h0LCBwYWRkaW5nLCBjb3JuZXJSYWRpdXMpO1xuICAgIH0sXG4gICAgY2hlY2tQb2ludDogZnVuY3Rpb24gY2hlY2tQb2ludCh4LCB5LCBwYWRkaW5nLCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZLCBjb3JuZXJSYWRpdXMpIHtcbiAgICAgIGNvcm5lclJhZGl1cyA9IGNvcm5lclJhZGl1cyA9PT0gJ2F1dG8nID8gZ2V0Um91bmRSZWN0YW5nbGVSYWRpdXMod2lkdGgsIGhlaWdodCkgOiBjb3JuZXJSYWRpdXM7XG4gICAgICB2YXIgZGlhbSA9IDIgKiBjb3JuZXJSYWRpdXM7XG5cbiAgICAgIC8vIENoZWNrIGhCb3hcbiAgICAgIGlmIChwb2ludEluc2lkZVBvbHlnb24oeCwgeSwgdGhpcy5wb2ludHMsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQgLSBkaWFtLCBbMCwgLTFdLCBwYWRkaW5nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgdkJveFxuICAgICAgaWYgKHBvaW50SW5zaWRlUG9seWdvbih4LCB5LCB0aGlzLnBvaW50cywgY2VudGVyWCwgY2VudGVyWSwgd2lkdGggLSBkaWFtLCBoZWlnaHQsIFswLCAtMV0sIHBhZGRpbmcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBjaGVjayBub24tcm91bmRlZCB0b3Agc2lkZVxuICAgICAgdmFyIG91dGVyV2lkdGggPSB3aWR0aCAvIDIgKyAyICogcGFkZGluZztcbiAgICAgIHZhciBvdXRlckhlaWdodCA9IGhlaWdodCAvIDIgKyAyICogcGFkZGluZztcbiAgICAgIHZhciBwb2ludHMgPSBbY2VudGVyWCAtIG91dGVyV2lkdGgsIGNlbnRlclkgLSBvdXRlckhlaWdodCwgY2VudGVyWCAtIG91dGVyV2lkdGgsIGNlbnRlclksIGNlbnRlclggKyBvdXRlcldpZHRoLCBjZW50ZXJZLCBjZW50ZXJYICsgb3V0ZXJXaWR0aCwgY2VudGVyWSAtIG91dGVySGVpZ2h0XTtcbiAgICAgIGlmIChwb2ludEluc2lkZVBvbHlnb25Qb2ludHMoeCwgeSwgcG9pbnRzKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgYm90dG9tIHJpZ2h0IHF1YXJ0ZXIgY2lyY2xlXG4gICAgICBpZiAoY2hlY2tJbkVsbGlwc2UoeCwgeSwgZGlhbSwgZGlhbSwgY2VudGVyWCArIHdpZHRoIC8gMiAtIGNvcm5lclJhZGl1cywgY2VudGVyWSArIGhlaWdodCAvIDIgLSBjb3JuZXJSYWRpdXMsIHBhZGRpbmcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBib3R0b20gbGVmdCBxdWFydGVyIGNpcmNsZVxuICAgICAgaWYgKGNoZWNrSW5FbGxpcHNlKHgsIHksIGRpYW0sIGRpYW0sIGNlbnRlclggLSB3aWR0aCAvIDIgKyBjb3JuZXJSYWRpdXMsIGNlbnRlclkgKyBoZWlnaHQgLyAyIC0gY29ybmVyUmFkaXVzLCBwYWRkaW5nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH07XG59O1xuQlJwJDIucmVnaXN0ZXJOb2RlU2hhcGVzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbm9kZVNoYXBlcyA9IHRoaXMubm9kZVNoYXBlcyA9IHt9O1xuICB2YXIgcmVuZGVyZXIgPSB0aGlzO1xuICB0aGlzLmdlbmVyYXRlRWxsaXBzZSgpO1xuICB0aGlzLmdlbmVyYXRlUG9seWdvbigndHJpYW5nbGUnLCBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoMywgMCkpO1xuICB0aGlzLmdlbmVyYXRlUm91bmRQb2x5Z29uKCdyb3VuZC10cmlhbmdsZScsIGdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSgzLCAwKSk7XG4gIHRoaXMuZ2VuZXJhdGVQb2x5Z29uKCdyZWN0YW5nbGUnLCBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoNCwgMCkpO1xuICBub2RlU2hhcGVzWydzcXVhcmUnXSA9IG5vZGVTaGFwZXNbJ3JlY3RhbmdsZSddO1xuICB0aGlzLmdlbmVyYXRlUm91bmRSZWN0YW5nbGUoKTtcbiAgdGhpcy5nZW5lcmF0ZUN1dFJlY3RhbmdsZSgpO1xuICB0aGlzLmdlbmVyYXRlQmFycmVsKCk7XG4gIHRoaXMuZ2VuZXJhdGVCb3R0b21Sb3VuZHJlY3RhbmdsZSgpO1xuICB7XG4gICAgdmFyIGRpYW1vbmRQb2ludHMgPSBbMCwgMSwgMSwgMCwgMCwgLTEsIC0xLCAwXTtcbiAgICB0aGlzLmdlbmVyYXRlUG9seWdvbignZGlhbW9uZCcsIGRpYW1vbmRQb2ludHMpO1xuICAgIHRoaXMuZ2VuZXJhdGVSb3VuZFBvbHlnb24oJ3JvdW5kLWRpYW1vbmQnLCBkaWFtb25kUG9pbnRzKTtcbiAgfVxuICB0aGlzLmdlbmVyYXRlUG9seWdvbigncGVudGFnb24nLCBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoNSwgMCkpO1xuICB0aGlzLmdlbmVyYXRlUm91bmRQb2x5Z29uKCdyb3VuZC1wZW50YWdvbicsIGdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSg1LCAwKSk7XG4gIHRoaXMuZ2VuZXJhdGVQb2x5Z29uKCdoZXhhZ29uJywgZ2VuZXJhdGVVbml0TmdvblBvaW50c0ZpdFRvU3F1YXJlKDYsIDApKTtcbiAgdGhpcy5nZW5lcmF0ZVJvdW5kUG9seWdvbigncm91bmQtaGV4YWdvbicsIGdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSg2LCAwKSk7XG4gIHRoaXMuZ2VuZXJhdGVQb2x5Z29uKCdoZXB0YWdvbicsIGdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSg3LCAwKSk7XG4gIHRoaXMuZ2VuZXJhdGVSb3VuZFBvbHlnb24oJ3JvdW5kLWhlcHRhZ29uJywgZ2VuZXJhdGVVbml0TmdvblBvaW50c0ZpdFRvU3F1YXJlKDcsIDApKTtcbiAgdGhpcy5nZW5lcmF0ZVBvbHlnb24oJ29jdGFnb24nLCBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoOCwgMCkpO1xuICB0aGlzLmdlbmVyYXRlUm91bmRQb2x5Z29uKCdyb3VuZC1vY3RhZ29uJywgZ2VuZXJhdGVVbml0TmdvblBvaW50c0ZpdFRvU3F1YXJlKDgsIDApKTtcbiAgdmFyIHN0YXI1UG9pbnRzID0gbmV3IEFycmF5KDIwKTtcbiAge1xuICAgIHZhciBvdXRlclBvaW50cyA9IGdlbmVyYXRlVW5pdE5nb25Qb2ludHMoNSwgMCk7XG4gICAgdmFyIGlubmVyUG9pbnRzID0gZ2VuZXJhdGVVbml0TmdvblBvaW50cyg1LCBNYXRoLlBJIC8gNSk7XG5cbiAgICAvLyBPdXRlciByYWRpdXMgaXMgMTsgaW5uZXIgcmFkaXVzIG9mIHN0YXIgaXMgc21hbGxlclxuICAgIHZhciBpbm5lclJhZGl1cyA9IDAuNSAqICgzIC0gTWF0aC5zcXJ0KDUpKTtcbiAgICBpbm5lclJhZGl1cyAqPSAxLjU3O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5uZXJQb2ludHMubGVuZ3RoIC8gMjsgaSsrKSB7XG4gICAgICBpbm5lclBvaW50c1tpICogMl0gKj0gaW5uZXJSYWRpdXM7XG4gICAgICBpbm5lclBvaW50c1tpICogMiArIDFdICo9IGlubmVyUmFkaXVzO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDIwIC8gNDsgaSsrKSB7XG4gICAgICBzdGFyNVBvaW50c1tpICogNF0gPSBvdXRlclBvaW50c1tpICogMl07XG4gICAgICBzdGFyNVBvaW50c1tpICogNCArIDFdID0gb3V0ZXJQb2ludHNbaSAqIDIgKyAxXTtcbiAgICAgIHN0YXI1UG9pbnRzW2kgKiA0ICsgMl0gPSBpbm5lclBvaW50c1tpICogMl07XG4gICAgICBzdGFyNVBvaW50c1tpICogNCArIDNdID0gaW5uZXJQb2ludHNbaSAqIDIgKyAxXTtcbiAgICB9XG4gIH1cbiAgc3RhcjVQb2ludHMgPSBmaXRQb2x5Z29uVG9TcXVhcmUoc3RhcjVQb2ludHMpO1xuICB0aGlzLmdlbmVyYXRlUG9seWdvbignc3RhcicsIHN0YXI1UG9pbnRzKTtcbiAgdGhpcy5nZW5lcmF0ZVBvbHlnb24oJ3ZlZScsIFstMSwgLTEsIDAsIC0wLjMzMywgMSwgLTEsIDAsIDFdKTtcbiAgdGhpcy5nZW5lcmF0ZVBvbHlnb24oJ3Job21ib2lkJywgWy0xLCAtMSwgMC4zMzMsIC0xLCAxLCAxLCAtMC4zMzMsIDFdKTtcbiAgdGhpcy5nZW5lcmF0ZVBvbHlnb24oJ3JpZ2h0LXJob21ib2lkJywgWy0wLjMzMywgLTEsIDEsIC0xLCAwLjMzMywgMSwgLTEsIDFdKTtcbiAgdGhpcy5ub2RlU2hhcGVzWydjb25jYXZlaGV4YWdvbiddID0gdGhpcy5nZW5lcmF0ZVBvbHlnb24oJ2NvbmNhdmUtaGV4YWdvbicsIFstMSwgLTAuOTUsIC0wLjc1LCAwLCAtMSwgMC45NSwgMSwgMC45NSwgMC43NSwgMCwgMSwgLTAuOTVdKTtcbiAge1xuICAgIHZhciB0YWdQb2ludHMgPSBbLTEsIC0xLCAwLjI1LCAtMSwgMSwgMCwgMC4yNSwgMSwgLTEsIDFdO1xuICAgIHRoaXMuZ2VuZXJhdGVQb2x5Z29uKCd0YWcnLCB0YWdQb2ludHMpO1xuICAgIHRoaXMuZ2VuZXJhdGVSb3VuZFBvbHlnb24oJ3JvdW5kLXRhZycsIHRhZ1BvaW50cyk7XG4gIH1cbiAgbm9kZVNoYXBlcy5tYWtlUG9seWdvbiA9IGZ1bmN0aW9uIChwb2ludHMpIHtcbiAgICAvLyB1c2UgY2FjaGluZyBvbiB1c2VyLXNwZWNpZmllZCBwb2x5Z29ucyBzbyB0aGV5IGFyZSBhcyBmYXN0IGFzIG5hdGl2ZSBzaGFwZXNcblxuICAgIHZhciBrZXkgPSBwb2ludHMuam9pbignJCcpO1xuICAgIHZhciBuYW1lID0gJ3BvbHlnb24tJyArIGtleTtcbiAgICB2YXIgc2hhcGU7XG4gICAgaWYgKHNoYXBlID0gdGhpc1tuYW1lXSkge1xuICAgICAgLy8gZ290IGNhY2hlZCBzaGFwZVxuICAgICAgcmV0dXJuIHNoYXBlO1xuICAgIH1cblxuICAgIC8vIGNyZWF0ZSBhbmQgY2FjaGUgbmV3IHNoYXBlXG4gICAgcmV0dXJuIHJlbmRlcmVyLmdlbmVyYXRlUG9seWdvbihuYW1lLCBwb2ludHMpO1xuICB9O1xufTtcblxudmFyIEJScCQxID0ge307XG5CUnAkMS50aW1lVG9SZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnJlZHJhd1RvdGFsVGltZSAvIHRoaXMucmVkcmF3Q291bnQ7XG59O1xuQlJwJDEucmVkcmF3ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwgc3RhdGljRW1wdHlPYmplY3QoKTtcbiAgdmFyIHIgPSB0aGlzO1xuICBpZiAoci5hdmVyYWdlUmVkcmF3VGltZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgci5hdmVyYWdlUmVkcmF3VGltZSA9IDA7XG4gIH1cbiAgaWYgKHIubGFzdFJlZHJhd1RpbWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHIubGFzdFJlZHJhd1RpbWUgPSAwO1xuICB9XG4gIGlmIChyLmxhc3REcmF3VGltZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgci5sYXN0RHJhd1RpbWUgPSAwO1xuICB9XG4gIHIucmVxdWVzdGVkRnJhbWUgPSB0cnVlO1xuICByLnJlbmRlck9wdGlvbnMgPSBvcHRpb25zO1xufTtcbkJScCQxLmJlZm9yZVJlbmRlciA9IGZ1bmN0aW9uIChmbiwgcHJpb3JpdHkpIHtcbiAgLy8gdGhlIHJlbmRlcmVyIGNhbid0IGFkZCB0aWNrIGNhbGxiYWNrcyB3aGVuIGRlc3Ryb3llZFxuICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHByaW9yaXR5ID09IG51bGwpIHtcbiAgICBlcnJvcignUHJpb3JpdHkgaXMgbm90IG9wdGlvbmFsIGZvciBiZWZvcmVSZW5kZXInKTtcbiAgfVxuICB2YXIgY2JzID0gdGhpcy5iZWZvcmVSZW5kZXJDYWxsYmFja3M7XG4gIGNicy5wdXNoKHtcbiAgICBmbjogZm4sXG4gICAgcHJpb3JpdHk6IHByaW9yaXR5XG4gIH0pO1xuXG4gIC8vIGhpZ2hlciBwcmlvcml0eSBjYWxsYmFja3MgZXhlY3V0ZWQgZmlyc3RcbiAgY2JzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gYi5wcmlvcml0eSAtIGEucHJpb3JpdHk7XG4gIH0pO1xufTtcbnZhciBiZWZvcmVSZW5kZXJDYWxsYmFja3MgPSBmdW5jdGlvbiBiZWZvcmVSZW5kZXJDYWxsYmFja3Mociwgd2lsbERyYXcsIHN0YXJ0VGltZSkge1xuICB2YXIgY2JzID0gci5iZWZvcmVSZW5kZXJDYWxsYmFja3M7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY2JzLmxlbmd0aDsgaSsrKSB7XG4gICAgY2JzW2ldLmZuKHdpbGxEcmF3LCBzdGFydFRpbWUpO1xuICB9XG59O1xuQlJwJDEuc3RhcnRSZW5kZXJMb29wID0gZnVuY3Rpb24gKCkge1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBjeSA9IHIuY3k7XG4gIGlmIChyLnJlbmRlckxvb3BTdGFydGVkKSB7XG4gICAgcmV0dXJuO1xuICB9IGVsc2Uge1xuICAgIHIucmVuZGVyTG9vcFN0YXJ0ZWQgPSB0cnVlO1xuICB9XG4gIHZhciBfcmVuZGVyRm4gPSBmdW5jdGlvbiByZW5kZXJGbihyZXF1ZXN0VGltZSkge1xuICAgIGlmIChyLmRlc3Ryb3llZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoY3kuYmF0Y2hpbmcoKSkgOyBlbHNlIGlmIChyLnJlcXVlc3RlZEZyYW1lICYmICFyLnNraXBGcmFtZSkge1xuICAgICAgYmVmb3JlUmVuZGVyQ2FsbGJhY2tzKHIsIHRydWUsIHJlcXVlc3RUaW1lKTtcbiAgICAgIHZhciBzdGFydFRpbWUgPSBwZXJmb3JtYW5jZU5vdygpO1xuICAgICAgci5yZW5kZXIoci5yZW5kZXJPcHRpb25zKTtcbiAgICAgIHZhciBlbmRUaW1lID0gci5sYXN0RHJhd1RpbWUgPSBwZXJmb3JtYW5jZU5vdygpO1xuICAgICAgaWYgKHIuYXZlcmFnZVJlZHJhd1RpbWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByLmF2ZXJhZ2VSZWRyYXdUaW1lID0gZW5kVGltZSAtIHN0YXJ0VGltZTtcbiAgICAgIH1cbiAgICAgIGlmIChyLnJlZHJhd0NvdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgci5yZWRyYXdDb3VudCA9IDA7XG4gICAgICB9XG4gICAgICByLnJlZHJhd0NvdW50Kys7XG4gICAgICBpZiAoci5yZWRyYXdUb3RhbFRpbWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByLnJlZHJhd1RvdGFsVGltZSA9IDA7XG4gICAgICB9XG4gICAgICB2YXIgZHVyYXRpb24gPSBlbmRUaW1lIC0gc3RhcnRUaW1lO1xuICAgICAgci5yZWRyYXdUb3RhbFRpbWUgKz0gZHVyYXRpb247XG4gICAgICByLmxhc3RSZWRyYXdUaW1lID0gZHVyYXRpb247XG5cbiAgICAgIC8vIHVzZSBhIHdlaWdodGVkIGF2ZXJhZ2Ugd2l0aCBhIGJpYXMgZnJvbSB0aGUgcHJldmlvdXMgYXZlcmFnZSBzbyB3ZSBkb24ndCBzcGlrZSBzbyBlYXNpbHlcbiAgICAgIHIuYXZlcmFnZVJlZHJhd1RpbWUgPSByLmF2ZXJhZ2VSZWRyYXdUaW1lIC8gMiArIGR1cmF0aW9uIC8gMjtcbiAgICAgIHIucmVxdWVzdGVkRnJhbWUgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgYmVmb3JlUmVuZGVyQ2FsbGJhY2tzKHIsIGZhbHNlLCByZXF1ZXN0VGltZSk7XG4gICAgfVxuICAgIHIuc2tpcEZyYW1lID0gZmFsc2U7XG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKF9yZW5kZXJGbik7XG4gIH07XG4gIHJlcXVlc3RBbmltYXRpb25GcmFtZShfcmVuZGVyRm4pO1xufTtcblxudmFyIEJhc2VSZW5kZXJlciA9IGZ1bmN0aW9uIEJhc2VSZW5kZXJlcihvcHRpb25zKSB7XG4gIHRoaXMuaW5pdChvcHRpb25zKTtcbn07XG52YXIgQlIgPSBCYXNlUmVuZGVyZXI7XG52YXIgQlJwID0gQlIucHJvdG90eXBlO1xuQlJwLmNsaWVudEZ1bmN0aW9ucyA9IFsncmVkcmF3SGludCcsICdyZW5kZXInLCAncmVuZGVyVG8nLCAnbWF0Y2hDYW52YXNTaXplJywgJ25vZGVTaGFwZUltcGwnLCAnYXJyb3dTaGFwZUltcGwnXTtcbkJScC5pbml0ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICByLm9wdGlvbnMgPSBvcHRpb25zO1xuICByLmN5ID0gb3B0aW9ucy5jeTtcbiAgdmFyIGN0ciA9IHIuY29udGFpbmVyID0gb3B0aW9ucy5jeS5jb250YWluZXIoKTtcbiAgdmFyIGNvbnRhaW5lcldpbmRvdyA9IHIuY3kud2luZG93KCk7XG5cbiAgLy8gcHJlcGVuZCBhIHN0eWxlc2hlZXQgaW4gdGhlIGhlYWQgc3VjaCB0aGF0XG4gIGlmIChjb250YWluZXJXaW5kb3cpIHtcbiAgICB2YXIgZG9jdW1lbnQgPSBjb250YWluZXJXaW5kb3cuZG9jdW1lbnQ7XG4gICAgdmFyIGhlYWQgPSBkb2N1bWVudC5oZWFkO1xuICAgIHZhciBzdHlsZXNoZWV0SWQgPSAnX19fX19fX19fX2N5dG9zY2FwZV9zdHlsZXNoZWV0JztcbiAgICB2YXIgY2xhc3NOYW1lID0gJ19fX19fX19fX19jeXRvc2NhcGVfY29udGFpbmVyJztcbiAgICB2YXIgc3R5bGVzaGVldEFscmVhZHlFeGlzdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzdHlsZXNoZWV0SWQpICE9IG51bGw7XG4gICAgaWYgKGN0ci5jbGFzc05hbWUuaW5kZXhPZihjbGFzc05hbWUpIDwgMCkge1xuICAgICAgY3RyLmNsYXNzTmFtZSA9IChjdHIuY2xhc3NOYW1lIHx8ICcnKSArICcgJyArIGNsYXNzTmFtZTtcbiAgICB9XG4gICAgaWYgKCFzdHlsZXNoZWV0QWxyZWFkeUV4aXN0cykge1xuICAgICAgdmFyIHN0eWxlc2hlZXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgc3R5bGVzaGVldC5pZCA9IHN0eWxlc2hlZXRJZDtcbiAgICAgIHN0eWxlc2hlZXQudGV4dENvbnRlbnQgPSAnLicgKyBjbGFzc05hbWUgKyAnIHsgcG9zaXRpb246IHJlbGF0aXZlOyB9JztcbiAgICAgIGhlYWQuaW5zZXJ0QmVmb3JlKHN0eWxlc2hlZXQsIGhlYWQuY2hpbGRyZW5bMF0pOyAvLyBmaXJzdCBzbyBsb3dlc3QgcHJpb3JpdHlcbiAgICB9XG4gICAgdmFyIGNvbXB1dGVkU3R5bGUgPSBjb250YWluZXJXaW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjdHIpO1xuICAgIHZhciBwb3NpdGlvbiA9IGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgncG9zaXRpb24nKTtcbiAgICBpZiAocG9zaXRpb24gPT09ICdzdGF0aWMnKSB7XG4gICAgICB3YXJuKCdBIEN5dG9zY2FwZSBjb250YWluZXIgaGFzIHN0eWxlIHBvc2l0aW9uOnN0YXRpYyBhbmQgc28gY2FuIG5vdCB1c2UgVUkgZXh0ZW5zaW9ucyBwcm9wZXJseScpO1xuICAgIH1cbiAgfVxuICByLnNlbGVjdGlvbiA9IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIDBdOyAvLyBDb29yZGluYXRlcyBmb3Igc2VsZWN0aW9uIGJveCwgcGx1cyBlbmFibGVkIGZsYWdcblxuICByLmJlemllclByb2pQY3RzID0gWzAuMDUsIDAuMjI1LCAwLjQsIDAuNSwgMC42LCAwLjc3NSwgMC45NV07XG5cbiAgLy8tLVBvaW50ZXItcmVsYXRlZCBkYXRhXG4gIHIuaG92ZXJEYXRhID0ge1xuICAgIGRvd246IG51bGwsXG4gICAgbGFzdDogbnVsbCxcbiAgICBkb3duVGltZTogbnVsbCxcbiAgICB0cmlnZ2VyTW9kZTogbnVsbCxcbiAgICBkcmFnZ2luZzogZmFsc2UsXG4gICAgaW5pdGlhbFBhbjogW251bGwsIG51bGxdLFxuICAgIGNhcHR1cmU6IGZhbHNlXG4gIH07XG4gIHIuZHJhZ0RhdGEgPSB7XG4gICAgcG9zc2libGVEcmFnRWxlbWVudHM6IFtdXG4gIH07XG4gIHIudG91Y2hEYXRhID0ge1xuICAgIHN0YXJ0OiBudWxsLFxuICAgIGNhcHR1cmU6IGZhbHNlLFxuICAgIC8vIFRoZXNlIDMgZmllbGRzIHJlbGF0ZWQgdG8gdGFwLCB0YXBob2xkIGV2ZW50c1xuICAgIHN0YXJ0UG9zaXRpb246IFtudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsXSxcbiAgICBzaW5nbGVUb3VjaFN0YXJ0VGltZTogbnVsbCxcbiAgICBzaW5nbGVUb3VjaE1vdmVkOiB0cnVlLFxuICAgIG5vdzogW251bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGxdLFxuICAgIGVhcmxpZXI6IFtudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsXVxuICB9O1xuICByLnJlZHJhd3MgPSAwO1xuICByLnNob3dGcHMgPSBvcHRpb25zLnNob3dGcHM7XG4gIHIuZGVidWcgPSBvcHRpb25zLmRlYnVnO1xuICByLndlYmdsID0gb3B0aW9ucy53ZWJnbDtcbiAgci5oaWRlRWRnZXNPblZpZXdwb3J0ID0gb3B0aW9ucy5oaWRlRWRnZXNPblZpZXdwb3J0O1xuICByLnRleHR1cmVPblZpZXdwb3J0ID0gb3B0aW9ucy50ZXh0dXJlT25WaWV3cG9ydDtcbiAgci53aGVlbFNlbnNpdGl2aXR5ID0gb3B0aW9ucy53aGVlbFNlbnNpdGl2aXR5O1xuICByLm1vdGlvbkJsdXJFbmFibGVkID0gb3B0aW9ucy5tb3Rpb25CbHVyOyAvLyBvbiBieSBkZWZhdWx0XG4gIHIuZm9yY2VkUGl4ZWxSYXRpbyA9IG51bWJlciQxKG9wdGlvbnMucGl4ZWxSYXRpbykgPyBvcHRpb25zLnBpeGVsUmF0aW8gOiBudWxsO1xuICByLm1vdGlvbkJsdXIgPSBvcHRpb25zLm1vdGlvbkJsdXI7IC8vIGZvciBpbml0aWFsIGtpY2sgb2ZmXG4gIHIubW90aW9uQmx1ck9wYWNpdHkgPSBvcHRpb25zLm1vdGlvbkJsdXJPcGFjaXR5O1xuICByLm1vdGlvbkJsdXJUcmFuc3BhcmVuY3kgPSAxIC0gci5tb3Rpb25CbHVyT3BhY2l0eTtcbiAgci5tb3Rpb25CbHVyUHhSYXRpbyA9IDE7XG4gIHIubWJQeFJCbHVycnkgPSAxOyAvLzAuODtcbiAgci5taW5NYkxvd1F1YWxGcmFtZXMgPSA0O1xuICByLmZ1bGxRdWFsaXR5TWIgPSBmYWxzZTtcbiAgci5jbGVhcmVkRm9yTW90aW9uQmx1ciA9IFtdO1xuICByLmRlc2t0b3BUYXBUaHJlc2hvbGQgPSBvcHRpb25zLmRlc2t0b3BUYXBUaHJlc2hvbGQ7XG4gIHIuZGVza3RvcFRhcFRocmVzaG9sZDIgPSBvcHRpb25zLmRlc2t0b3BUYXBUaHJlc2hvbGQgKiBvcHRpb25zLmRlc2t0b3BUYXBUaHJlc2hvbGQ7XG4gIHIudG91Y2hUYXBUaHJlc2hvbGQgPSBvcHRpb25zLnRvdWNoVGFwVGhyZXNob2xkO1xuICByLnRvdWNoVGFwVGhyZXNob2xkMiA9IG9wdGlvbnMudG91Y2hUYXBUaHJlc2hvbGQgKiBvcHRpb25zLnRvdWNoVGFwVGhyZXNob2xkO1xuICByLnRhcGhvbGREdXJhdGlvbiA9IDUwMDtcbiAgci5iaW5kaW5ncyA9IFtdO1xuICByLmJlZm9yZVJlbmRlckNhbGxiYWNrcyA9IFtdO1xuICByLmJlZm9yZVJlbmRlclByaW9yaXRpZXMgPSB7XG4gICAgLy8gaGlnaGVyIHByaW9yaXR5IGV4ZWNzIGJlZm9yZSBsb3dlciBvbmVcbiAgICBhbmltYXRpb25zOiA0MDAsXG4gICAgZWxlQ2FsY3M6IDMwMCxcbiAgICBlbGVUeHJEZXE6IDIwMCxcbiAgICBseXJUeHJEZXE6IDE1MCxcbiAgICBseXJUeHJTa2lwOiAxMDBcbiAgfTtcbiAgci5yZWdpc3Rlck5vZGVTaGFwZXMoKTtcbiAgci5yZWdpc3RlckFycm93U2hhcGVzKCk7XG4gIHIucmVnaXN0ZXJDYWxjdWxhdGlvbkxpc3RlbmVycygpO1xufTtcbkJScC5ub3RpZnkgPSBmdW5jdGlvbiAoZXZlbnROYW1lLCBlbGVzKSB7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIGN5ID0gci5jeTtcblxuICAvLyB0aGUgcmVuZGVyZXIgY2FuJ3QgYmUgbm90aWZpZWQgYWZ0ZXIgaXQncyBkZXN0cm95ZWRcbiAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChldmVudE5hbWUgPT09ICdpbml0Jykge1xuICAgIHIubG9hZCgpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoZXZlbnROYW1lID09PSAnZGVzdHJveScpIHtcbiAgICByLmRlc3Ryb3koKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGV2ZW50TmFtZSA9PT0gJ2FkZCcgfHwgZXZlbnROYW1lID09PSAncmVtb3ZlJyB8fCBldmVudE5hbWUgPT09ICdtb3ZlJyAmJiBjeS5oYXNDb21wb3VuZE5vZGVzKCkgfHwgZXZlbnROYW1lID09PSAnbG9hZCcgfHwgZXZlbnROYW1lID09PSAnem9yZGVyJyB8fCBldmVudE5hbWUgPT09ICdtb3VudCcpIHtcbiAgICByLmludmFsaWRhdGVDYWNoZWRaU29ydGVkRWxlcygpO1xuICB9XG4gIGlmIChldmVudE5hbWUgPT09ICd2aWV3cG9ydCcpIHtcbiAgICByLnJlZHJhd0hpbnQoJ3NlbGVjdCcsIHRydWUpO1xuICB9XG4gIGlmIChldmVudE5hbWUgPT09ICdnYycpIHtcbiAgICByLnJlZHJhd0hpbnQoJ2djJywgdHJ1ZSk7XG4gIH1cbiAgaWYgKGV2ZW50TmFtZSA9PT0gJ2xvYWQnIHx8IGV2ZW50TmFtZSA9PT0gJ3Jlc2l6ZScgfHwgZXZlbnROYW1lID09PSAnbW91bnQnKSB7XG4gICAgci5pbnZhbGlkYXRlQ29udGFpbmVyQ2xpZW50Q29vcmRzQ2FjaGUoKTtcbiAgICByLm1hdGNoQ2FudmFzU2l6ZShyLmNvbnRhaW5lcik7XG4gIH1cbiAgci5yZWRyYXdIaW50KCdlbGVzJywgdHJ1ZSk7XG4gIHIucmVkcmF3SGludCgnZHJhZycsIHRydWUpO1xuICB0aGlzLnN0YXJ0UmVuZGVyTG9vcCgpO1xuICB0aGlzLnJlZHJhdygpO1xufTtcbkJScC5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgciA9IHRoaXM7XG4gIHIuZGVzdHJveWVkID0gdHJ1ZTtcbiAgci5jeS5zdG9wQW5pbWF0aW9uTG9vcCgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHIuYmluZGluZ3MubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgYmluZGluZyA9IHIuYmluZGluZ3NbaV07XG4gICAgdmFyIGIgPSBiaW5kaW5nO1xuICAgIHZhciB0Z3QgPSBiLnRhcmdldDtcbiAgICAodGd0Lm9mZiB8fCB0Z3QucmVtb3ZlRXZlbnRMaXN0ZW5lcikuYXBwbHkodGd0LCBiLmFyZ3MpO1xuICB9XG4gIHIuYmluZGluZ3MgPSBbXTtcbiAgci5iZWZvcmVSZW5kZXJDYWxsYmFja3MgPSBbXTtcbiAgci5vblVwZGF0ZUVsZUNhbGNzRm5zID0gW107XG4gIGlmIChyLnJlbW92ZU9ic2VydmVyKSB7XG4gICAgci5yZW1vdmVPYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gIH1cbiAgaWYgKHIuc3R5bGVPYnNlcnZlcikge1xuICAgIHIuc3R5bGVPYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gIH1cbiAgaWYgKHIucmVzaXplT2JzZXJ2ZXIpIHtcbiAgICByLnJlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgfVxuICBpZiAoci5sYWJlbENhbGNEaXYpIHtcbiAgICB0cnkge1xuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChyLmxhYmVsQ2FsY0Rpdik7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBpZTEwIGlzc3VlICMxMDE0XG4gICAgfVxuICB9XG59O1xuQlJwLmlzSGVhZGxlc3MgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmYWxzZTtcbn07XG5bQlJwJGYsIEJScCQ1LCBCUnAkNCwgQlJwJDMsIEJScCQyLCBCUnAkMV0uZm9yRWFjaChmdW5jdGlvbiAocHJvcHMpIHtcbiAgZXh0ZW5kKEJScCwgcHJvcHMpO1xufSk7XG5cbnZhciBmdWxsRnBzVGltZSA9IDEwMDAgLyA2MDsgLy8gYXNzdW1lIDYwIGZyYW1lcyBwZXIgc2Vjb25kXG5cbnZhciBkZWZzID0ge1xuICBzZXR1cERlcXVldWVpbmc6IGZ1bmN0aW9uIHNldHVwRGVxdWV1ZWluZyhvcHRzKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHNldHVwRGVxdWV1ZWluZ0ltcGwoKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgciA9IHRoaXMucmVuZGVyZXI7XG4gICAgICBpZiAoc2VsZi5kZXF1ZXVlaW5nU2V0dXApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VsZi5kZXF1ZXVlaW5nU2V0dXAgPSB0cnVlO1xuICAgICAgfVxuICAgICAgdmFyIHF1ZXVlUmVkcmF3ID0gZGVib3VuY2UoZnVuY3Rpb24gKCkge1xuICAgICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgICAgci5yZWRyYXdIaW50KCdkcmFnJywgdHJ1ZSk7XG4gICAgICAgIHIucmVkcmF3KCk7XG4gICAgICB9LCBvcHRzLmRlcVJlZHJhd1RocmVzaG9sZCk7XG4gICAgICB2YXIgZGVxdWV1ZSA9IGZ1bmN0aW9uIGRlcXVldWUod2lsbERyYXcsIGZyYW1lU3RhcnRUaW1lKSB7XG4gICAgICAgIHZhciBzdGFydFRpbWUgPSBwZXJmb3JtYW5jZU5vdygpO1xuICAgICAgICB2YXIgYXZnUmVuZGVyVGltZSA9IHIuYXZlcmFnZVJlZHJhd1RpbWU7XG4gICAgICAgIHZhciByZW5kZXJUaW1lID0gci5sYXN0UmVkcmF3VGltZTtcbiAgICAgICAgdmFyIGRlcWQgPSBbXTtcbiAgICAgICAgdmFyIGV4dGVudCA9IHIuY3kuZXh0ZW50KCk7XG4gICAgICAgIHZhciBwaXhlbFJhdGlvID0gci5nZXRQaXhlbFJhdGlvKCk7XG5cbiAgICAgICAgLy8gaWYgd2UgYXJlbid0IGluIGEgdGljayB0aGF0IGNhdXNlcyBhIGRyYXcsIHRoZW4gdGhlIHJlbmRlcmVkIHN0eWxlXG4gICAgICAgIC8vIHF1ZXVlIHdvbid0IGF1dG9tYXRpY2FsbHkgYmUgZmx1c2hlZCBiZWZvcmUgZGVxdWV1ZWluZyBzdGFydHNcbiAgICAgICAgaWYgKCF3aWxsRHJhdykge1xuICAgICAgICAgIHIuZmx1c2hSZW5kZXJlZFN0eWxlUXVldWUoKTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc3RhbnQtY29uZGl0aW9uXG4gICAgICAgICAgdmFyIG5vdyA9IHBlcmZvcm1hbmNlTm93KCk7XG4gICAgICAgICAgdmFyIGR1cmF0aW9uID0gbm93IC0gc3RhcnRUaW1lO1xuICAgICAgICAgIHZhciBmcmFtZUR1cmF0aW9uID0gbm93IC0gZnJhbWVTdGFydFRpbWU7XG4gICAgICAgICAgaWYgKHJlbmRlclRpbWUgPCBmdWxsRnBzVGltZSkge1xuICAgICAgICAgICAgLy8gaWYgd2UncmUgcmVuZGVyaW5nIGZhc3RlciB0aGFuIHRoZSBpZGVhbCBmcHMsIHRoZW4gZG8gZGVxdWV1ZWluZ1xuICAgICAgICAgICAgLy8gZHVyaW5nIGFsbCBvZiB0aGUgcmVtYWluaW5nIGZyYW1lIHRpbWVcblxuICAgICAgICAgICAgdmFyIHRpbWVBdmFpbGFibGUgPSBmdWxsRnBzVGltZSAtICh3aWxsRHJhdyA/IGF2Z1JlbmRlclRpbWUgOiAwKTtcbiAgICAgICAgICAgIGlmIChmcmFtZUR1cmF0aW9uID49IG9wdHMuZGVxRmFzdENvc3QgKiB0aW1lQXZhaWxhYmxlKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAod2lsbERyYXcpIHtcbiAgICAgICAgICAgICAgaWYgKGR1cmF0aW9uID49IG9wdHMuZGVxQ29zdCAqIHJlbmRlclRpbWUgfHwgZHVyYXRpb24gPj0gb3B0cy5kZXFBdmdDb3N0ICogYXZnUmVuZGVyVGltZSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGZyYW1lRHVyYXRpb24gPj0gb3B0cy5kZXFOb0RyYXdDb3N0ICogZnVsbEZwc1RpbWUpIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciB0aGlzRGVxZCA9IG9wdHMuZGVxKHNlbGYsIHBpeGVsUmF0aW8sIGV4dGVudCk7XG4gICAgICAgICAgaWYgKHRoaXNEZXFkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpc0RlcWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgZGVxZC5wdXNoKHRoaXNEZXFkW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2FsbGJhY2tzIG9uIGRlcXVldWVcbiAgICAgICAgaWYgKGRlcWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgIG9wdHMub25EZXFkKHNlbGYsIGRlcWQpO1xuICAgICAgICAgIGlmICghd2lsbERyYXcgJiYgb3B0cy5zaG91bGRSZWRyYXcoc2VsZiwgZGVxZCwgcGl4ZWxSYXRpbywgZXh0ZW50KSkge1xuICAgICAgICAgICAgcXVldWVSZWRyYXcoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB2YXIgcHJpb3JpdHkgPSBvcHRzLnByaW9yaXR5IHx8IG5vb3AkMTtcbiAgICAgIHIuYmVmb3JlUmVuZGVyKGRlcXVldWUsIHByaW9yaXR5KHNlbGYpKTtcbiAgICB9O1xuICB9XG59O1xuXG4vLyBBbGxvd3MgbG9va3VwcyBmb3IgKGVsZSwgbHZsKSA9PiBjYWNoZS5cbi8vIFVzZXMga2V5cyBzbyBlbGVtZW50cyBtYXkgc2hhcmUgdGhlIHNhbWUgY2FjaGUuXG52YXIgRWxlbWVudFRleHR1cmVDYWNoZUxvb2t1cCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEVsZW1lbnRUZXh0dXJlQ2FjaGVMb29rdXAoZ2V0S2V5KSB7XG4gICAgdmFyIGRvZXNFbGVJbnZhbGlkYXRlS2V5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzaWZ5O1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBFbGVtZW50VGV4dHVyZUNhY2hlTG9va3VwKTtcbiAgICB0aGlzLmlkc0J5S2V5ID0gbmV3IE1hcCQxKCk7XG4gICAgdGhpcy5rZXlGb3JJZCA9IG5ldyBNYXAkMSgpO1xuICAgIHRoaXMuY2FjaGVzQnlMdmwgPSBuZXcgTWFwJDEoKTtcbiAgICB0aGlzLmx2bHMgPSBbXTtcbiAgICB0aGlzLmdldEtleSA9IGdldEtleTtcbiAgICB0aGlzLmRvZXNFbGVJbnZhbGlkYXRlS2V5ID0gZG9lc0VsZUludmFsaWRhdGVLZXk7XG4gIH1cbiAgcmV0dXJuIF9jcmVhdGVDbGFzcyhFbGVtZW50VGV4dHVyZUNhY2hlTG9va3VwLCBbe1xuICAgIGtleTogXCJnZXRJZHNGb3JcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0SWRzRm9yKGtleSkge1xuICAgICAgaWYgKGtleSA9PSBudWxsKSB7XG4gICAgICAgIGVycm9yKFwiQ2FuIG5vdCBnZXQgaWQgbGlzdCBmb3IgbnVsbCBrZXlcIik7XG4gICAgICB9XG4gICAgICB2YXIgaWRzQnlLZXkgPSB0aGlzLmlkc0J5S2V5O1xuICAgICAgdmFyIGlkcyA9IHRoaXMuaWRzQnlLZXkuZ2V0KGtleSk7XG4gICAgICBpZiAoIWlkcykge1xuICAgICAgICBpZHMgPSBuZXcgU2V0JDEoKTtcbiAgICAgICAgaWRzQnlLZXkuc2V0KGtleSwgaWRzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpZHM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImFkZElkRm9yS2V5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZElkRm9yS2V5KGtleSwgaWQpIHtcbiAgICAgIGlmIChrZXkgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLmdldElkc0ZvcihrZXkpLmFkZChpZCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImRlbGV0ZUlkRm9yS2V5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlbGV0ZUlkRm9yS2V5KGtleSwgaWQpIHtcbiAgICAgIGlmIChrZXkgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLmdldElkc0ZvcihrZXkpW1wiZGVsZXRlXCJdKGlkKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0TnVtYmVyT2ZJZHNGb3JLZXlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0TnVtYmVyT2ZJZHNGb3JLZXkoa2V5KSB7XG4gICAgICBpZiAoa2V5ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRJZHNGb3Ioa2V5KS5zaXplO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ1cGRhdGVLZXlNYXBwaW5nRm9yXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVwZGF0ZUtleU1hcHBpbmdGb3IoZWxlKSB7XG4gICAgICB2YXIgaWQgPSBlbGUuaWQoKTtcbiAgICAgIHZhciBwcmV2S2V5ID0gdGhpcy5rZXlGb3JJZC5nZXQoaWQpO1xuICAgICAgdmFyIGN1cnJLZXkgPSB0aGlzLmdldEtleShlbGUpO1xuICAgICAgdGhpcy5kZWxldGVJZEZvcktleShwcmV2S2V5LCBpZCk7XG4gICAgICB0aGlzLmFkZElkRm9yS2V5KGN1cnJLZXksIGlkKTtcbiAgICAgIHRoaXMua2V5Rm9ySWQuc2V0KGlkLCBjdXJyS2V5KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZGVsZXRlS2V5TWFwcGluZ0ZvclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZWxldGVLZXlNYXBwaW5nRm9yKGVsZSkge1xuICAgICAgdmFyIGlkID0gZWxlLmlkKCk7XG4gICAgICB2YXIgcHJldktleSA9IHRoaXMua2V5Rm9ySWQuZ2V0KGlkKTtcbiAgICAgIHRoaXMuZGVsZXRlSWRGb3JLZXkocHJldktleSwgaWQpO1xuICAgICAgdGhpcy5rZXlGb3JJZFtcImRlbGV0ZVwiXShpZCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImtleUhhc0NoYW5nZWRGb3JcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24ga2V5SGFzQ2hhbmdlZEZvcihlbGUpIHtcbiAgICAgIHZhciBpZCA9IGVsZS5pZCgpO1xuICAgICAgdmFyIHByZXZLZXkgPSB0aGlzLmtleUZvcklkLmdldChpZCk7XG4gICAgICB2YXIgbmV3S2V5ID0gdGhpcy5nZXRLZXkoZWxlKTtcbiAgICAgIHJldHVybiBwcmV2S2V5ICE9PSBuZXdLZXk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImlzSW52YWxpZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpc0ludmFsaWQoZWxlKSB7XG4gICAgICByZXR1cm4gdGhpcy5rZXlIYXNDaGFuZ2VkRm9yKGVsZSkgfHwgdGhpcy5kb2VzRWxlSW52YWxpZGF0ZUtleShlbGUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRDYWNoZXNBdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRDYWNoZXNBdChsdmwpIHtcbiAgICAgIHZhciBjYWNoZXNCeUx2bCA9IHRoaXMuY2FjaGVzQnlMdmwsXG4gICAgICAgIGx2bHMgPSB0aGlzLmx2bHM7XG4gICAgICB2YXIgY2FjaGVzID0gY2FjaGVzQnlMdmwuZ2V0KGx2bCk7XG4gICAgICBpZiAoIWNhY2hlcykge1xuICAgICAgICBjYWNoZXMgPSBuZXcgTWFwJDEoKTtcbiAgICAgICAgY2FjaGVzQnlMdmwuc2V0KGx2bCwgY2FjaGVzKTtcbiAgICAgICAgbHZscy5wdXNoKGx2bCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2FjaGVzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRDYWNoZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRDYWNoZShrZXksIGx2bCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2FjaGVzQXQobHZsKS5nZXQoa2V5KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldChlbGUsIGx2bCkge1xuICAgICAgdmFyIGtleSA9IHRoaXMuZ2V0S2V5KGVsZSk7XG4gICAgICB2YXIgY2FjaGUgPSB0aGlzLmdldENhY2hlKGtleSwgbHZsKTtcblxuICAgICAgLy8gZ2V0dGluZyBmb3IgYW4gZWxlbWVudCBtYXkgbmVlZCB0byBhZGQgdG8gdGhlIGlkIGxpc3QgYi9jIGVsZXMgY2FuIHNoYXJlIGtleXNcbiAgICAgIGlmIChjYWNoZSAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMudXBkYXRlS2V5TWFwcGluZ0ZvcihlbGUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNhY2hlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRGb3JDYWNoZWRLZXlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Rm9yQ2FjaGVkS2V5KGVsZSwgbHZsKSB7XG4gICAgICB2YXIga2V5ID0gdGhpcy5rZXlGb3JJZC5nZXQoZWxlLmlkKCkpOyAvLyBuLmIuIHVzZSBjYWNoZWQga2V5LCBub3QgbmV3bHkgY29tcHV0ZWQga2V5XG4gICAgICB2YXIgY2FjaGUgPSB0aGlzLmdldENhY2hlKGtleSwgbHZsKTtcbiAgICAgIHJldHVybiBjYWNoZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaGFzQ2FjaGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFzQ2FjaGUoa2V5LCBsdmwpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldENhY2hlc0F0KGx2bCkuaGFzKGtleSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImhhc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYXMoZWxlLCBsdmwpIHtcbiAgICAgIHZhciBrZXkgPSB0aGlzLmdldEtleShlbGUpO1xuICAgICAgcmV0dXJuIHRoaXMuaGFzQ2FjaGUoa2V5LCBsdmwpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZXRDYWNoZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRDYWNoZShrZXksIGx2bCwgY2FjaGUpIHtcbiAgICAgIGNhY2hlLmtleSA9IGtleTtcbiAgICAgIHRoaXMuZ2V0Q2FjaGVzQXQobHZsKS5zZXQoa2V5LCBjYWNoZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXQoZWxlLCBsdmwsIGNhY2hlKSB7XG4gICAgICB2YXIga2V5ID0gdGhpcy5nZXRLZXkoZWxlKTtcbiAgICAgIHRoaXMuc2V0Q2FjaGUoa2V5LCBsdmwsIGNhY2hlKTtcbiAgICAgIHRoaXMudXBkYXRlS2V5TWFwcGluZ0ZvcihlbGUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJkZWxldGVDYWNoZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZWxldGVDYWNoZShrZXksIGx2bCkge1xuICAgICAgdGhpcy5nZXRDYWNoZXNBdChsdmwpW1wiZGVsZXRlXCJdKGtleSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImRlbGV0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfZGVsZXRlKGVsZSwgbHZsKSB7XG4gICAgICB2YXIga2V5ID0gdGhpcy5nZXRLZXkoZWxlKTtcbiAgICAgIHRoaXMuZGVsZXRlQ2FjaGUoa2V5LCBsdmwpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpbnZhbGlkYXRlS2V5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGludmFsaWRhdGVLZXkoa2V5KSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgdGhpcy5sdmxzLmZvckVhY2goZnVuY3Rpb24gKGx2bCkge1xuICAgICAgICByZXR1cm4gX3RoaXMuZGVsZXRlQ2FjaGUoa2V5LCBsdmwpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gcmV0dXJucyB0cnVlIGlmIG5vIG90aGVyIGVsZXMgcmVmZXJlbmNlIHRoZSBpbnZhbGlkYXRlZCBjYWNoZSAobi5iLiBvdGhlciBlbGVzIG1heSBuZWVkIHRoZSBjYWNoZSB3aXRoIHRoZSBzYW1lIGtleSlcbiAgfSwge1xuICAgIGtleTogXCJpbnZhbGlkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGludmFsaWRhdGUoZWxlKSB7XG4gICAgICB2YXIgaWQgPSBlbGUuaWQoKTtcbiAgICAgIHZhciBrZXkgPSB0aGlzLmtleUZvcklkLmdldChpZCk7IC8vIG4uYi4gdXNlIHN0b3JlZCBrZXkgcmF0aGVyIHRoYW4gY3VycmVudCAocG90ZW50aWFsIGtleSlcblxuICAgICAgdGhpcy5kZWxldGVLZXlNYXBwaW5nRm9yKGVsZSk7XG4gICAgICB2YXIgZW50aXJlS2V5SW52YWxpZGF0ZWQgPSB0aGlzLmRvZXNFbGVJbnZhbGlkYXRlS2V5KGVsZSk7XG4gICAgICBpZiAoZW50aXJlS2V5SW52YWxpZGF0ZWQpIHtcbiAgICAgICAgLy8gY2xlYXIgbWFwcGluZyBmb3IgY3VycmVudCBrZXlcbiAgICAgICAgdGhpcy5pbnZhbGlkYXRlS2V5KGtleSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZW50aXJlS2V5SW52YWxpZGF0ZWQgfHwgdGhpcy5nZXROdW1iZXJPZklkc0ZvcktleShrZXkpID09PSAwO1xuICAgIH1cbiAgfV0pO1xufSgpO1xuXG52YXIgbWluVHhySCA9IDI1OyAvLyB0aGUgc2l6ZSBvZiB0aGUgdGV4dHVyZSBjYWNoZSBmb3Igc21hbGwgaGVpZ2h0IGVsZXMgKHNwZWNpYWwgY2FzZSlcbnZhciB0eHJTdGVwSCA9IDUwOyAvLyB0aGUgbWluIHNpemUgb2YgdGhlIHJlZ3VsYXIgY2FjaGUsIGFuZCB0aGUgc2l6ZSBpdCBpbmNyZWFzZXMgd2l0aCBlYWNoIHN0ZXAgdXBcbnZhciBtaW5MdmwkMSA9IC00OyAvLyB3aGVuIHNjYWxpbmcgc21hbGxlciB0aGFuIHRoYXQgd2UgZG9uJ3QgbmVlZCB0byByZS1yZW5kZXJcbnZhciBtYXhMdmwkMSA9IDM7IC8vIHdoZW4gbGFyZ2VyIHRoYW4gdGhpcyBzY2FsZSBqdXN0IHJlbmRlciBkaXJlY3RseSAoY2FjaGluZyBpcyBub3QgaGVscGZ1bClcbnZhciBtYXhab29tJDEgPSA3Ljk5OyAvLyBiZXlvbmQgdGhpcyB6b29tIGxldmVsLCBsYXllcmVkIHRleHR1cmVzIGFyZSBub3QgdXNlZFxudmFyIGVsZVR4clNwYWNpbmcgPSA4OyAvLyBzcGFjaW5nIGJldHdlZW4gZWxlbWVudHMgb24gdGV4dHVyZXMgdG8gYXZvaWQgYmxpdHRpbmcgb3ZlcmxhcHNcbnZhciBkZWZUeHJXaWR0aCA9IDEwMjQ7IC8vIGRlZmF1bHQvbWluaW11bSB0ZXh0dXJlIHdpZHRoXG52YXIgbWF4VHhyVyA9IDEwMjQ7IC8vIHRoZSBtYXhpbXVtIHdpZHRoIG9mIGEgdGV4dHVyZVxudmFyIG1heFR4ckggPSAxMDI0OyAvLyB0aGUgbWF4aW11bSBoZWlnaHQgb2YgYSB0ZXh0dXJlXG52YXIgbWluVXRpbGl0eSA9IDAuMjsgLy8gaWYgdXNhZ2Ugb2YgdGV4dHVyZSBpcyBsZXNzIHRoYW4gdGhpcywgaXQgaXMgcmV0aXJlZFxudmFyIG1heEZ1bGxuZXNzID0gMC44OyAvLyBmdWxsbmVzcyBvZiB0ZXh0dXJlIGFmdGVyIHdoaWNoIHF1ZXVlIHJlbW92YWwgaXMgY2hlY2tlZFxudmFyIG1heEZ1bGxuZXNzQ2hlY2tzID0gMTA7IC8vIGRlcXVldWVkIGFmdGVyIHRoaXMgbWFueSBjaGVja3NcbnZhciBkZXFDb3N0JDEgPSAwLjE1OyAvLyAlIG9mIGFkZCdsIHJlbmRlcmluZyBjb3N0IGFsbG93ZWQgZm9yIGRlcXVldWluZyBlbGUgY2FjaGVzIGVhY2ggZnJhbWVcbnZhciBkZXFBdmdDb3N0JDEgPSAwLjE7IC8vICUgb2YgYWRkJ2wgcmVuZGVyaW5nIGNvc3QgY29tcGFyZWQgdG8gYXZlcmFnZSBvdmVyYWxsIHJlZHJhdyB0aW1lXG52YXIgZGVxTm9EcmF3Q29zdCQxID0gMC45OyAvLyAlIG9mIGF2ZyBmcmFtZSB0aW1lIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGRlcXVldWVpbmcgd2hlbiBub3QgZHJhd2luZ1xudmFyIGRlcUZhc3RDb3N0JDEgPSAwLjk7IC8vICUgb2YgZnJhbWUgdGltZSB0byBiZSB1c2VkIHdoZW4gPjYwZnBzXG52YXIgZGVxUmVkcmF3VGhyZXNob2xkJDEgPSAxMDA7IC8vIHRpbWUgdG8gYmF0Y2ggcmVkcmF3cyB0b2dldGhlciBmcm9tIGRlcXVldWVpbmcgdG8gYWxsb3cgbW9yZSBkZXF1ZXVlaW5nIGNhbGNzIHRvIGhhcHBlbiBpbiB0aGUgbWVhbndoaWxlXG52YXIgbWF4RGVxU2l6ZSQxID0gMTsgLy8gbnVtYmVyIG9mIGVsZXMgdG8gZGVxdWV1ZSBhbmQgcmVuZGVyIGF0IGhpZ2hlciB0ZXh0dXJlIGluIGVhY2ggYmF0Y2hcblxudmFyIGdldFR4clJlYXNvbnMgPSB7XG4gIGRlcXVldWU6ICdkZXF1ZXVlJyxcbiAgZG93bnNjYWxlOiAnZG93bnNjYWxlJyxcbiAgaGlnaFF1YWxpdHk6ICdoaWdoUXVhbGl0eSdcbn07XG52YXIgaW5pdERlZmF1bHRzID0gZGVmYXVsdHMkZyh7XG4gIGdldEtleTogbnVsbCxcbiAgZG9lc0VsZUludmFsaWRhdGVLZXk6IGZhbHNpZnksXG4gIGRyYXdFbGVtZW50OiBudWxsLFxuICBnZXRCb3VuZGluZ0JveDogbnVsbCxcbiAgZ2V0Um90YXRpb25Qb2ludDogbnVsbCxcbiAgZ2V0Um90YXRpb25PZmZzZXQ6IG51bGwsXG4gIGlzVmlzaWJsZTogdHJ1ZWlmeSxcbiAgYWxsb3dFZGdlVHhyQ2FjaGluZzogdHJ1ZSxcbiAgYWxsb3dQYXJlbnRUeHJDYWNoaW5nOiB0cnVlXG59KTtcbnZhciBFbGVtZW50VGV4dHVyZUNhY2hlID0gZnVuY3Rpb24gRWxlbWVudFRleHR1cmVDYWNoZShyZW5kZXJlciwgaW5pdE9wdGlvbnMpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBzZWxmLnJlbmRlcmVyID0gcmVuZGVyZXI7XG4gIHNlbGYub25EZXF1ZXVlcyA9IFtdO1xuICB2YXIgb3B0cyA9IGluaXREZWZhdWx0cyhpbml0T3B0aW9ucyk7XG4gIGV4dGVuZChzZWxmLCBvcHRzKTtcbiAgc2VsZi5sb29rdXAgPSBuZXcgRWxlbWVudFRleHR1cmVDYWNoZUxvb2t1cChvcHRzLmdldEtleSwgb3B0cy5kb2VzRWxlSW52YWxpZGF0ZUtleSk7XG4gIHNlbGYuc2V0dXBEZXF1ZXVlaW5nKCk7XG59O1xudmFyIEVUQ3AgPSBFbGVtZW50VGV4dHVyZUNhY2hlLnByb3RvdHlwZTtcbkVUQ3AucmVhc29ucyA9IGdldFR4clJlYXNvbnM7XG5cbi8vIHRoZSBsaXN0IG9mIHRleHR1cmVzIGluIHdoaWNoIG5ldyBzdWJ0ZXh0dXJlcyBmb3IgZWxlbWVudHMgY2FuIGJlIHBsYWNlZFxuRVRDcC5nZXRUZXh0dXJlUXVldWUgPSBmdW5jdGlvbiAodHhySCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHNlbGYuZWxlSW1nQ2FjaGVzID0gc2VsZi5lbGVJbWdDYWNoZXMgfHwge307XG4gIHJldHVybiBzZWxmLmVsZUltZ0NhY2hlc1t0eHJIXSA9IHNlbGYuZWxlSW1nQ2FjaGVzW3R4ckhdIHx8IFtdO1xufTtcblxuLy8gdGhlIGxpc3Qgb2YgdXN1c2VkIHRleHR1cmVzIHdoaWNoIGNhbiBiZSByZWN5Y2xlZCAoaW4gdXNlIGluIHRleHR1cmUgcXVldWUpXG5FVENwLmdldFJldGlyZWRUZXh0dXJlUXVldWUgPSBmdW5jdGlvbiAodHhySCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBydHh0clFzID0gc2VsZi5lbGVJbWdDYWNoZXMucmV0aXJlZCA9IHNlbGYuZWxlSW1nQ2FjaGVzLnJldGlyZWQgfHwge307XG4gIHZhciBydHh0clEgPSBydHh0clFzW3R4ckhdID0gcnR4dHJRc1t0eHJIXSB8fCBbXTtcbiAgcmV0dXJuIHJ0eHRyUTtcbn07XG5cbi8vIHF1ZXVlIG9mIGVsZW1lbnQgZHJhdyByZXF1ZXN0cyBhdCBkaWZmZXJlbnQgc2NhbGUgbGV2ZWxzXG5FVENwLmdldEVsZW1lbnRRdWV1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgcSA9IHNlbGYuZWxlQ2FjaGVRdWV1ZSA9IHNlbGYuZWxlQ2FjaGVRdWV1ZSB8fCBuZXcgSGVhcChmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBiLnJlcXMgLSBhLnJlcXM7XG4gIH0pO1xuICByZXR1cm4gcTtcbn07XG5cbi8vIHF1ZXVlIG9mIGVsZW1lbnQgZHJhdyByZXF1ZXN0cyBhdCBkaWZmZXJlbnQgc2NhbGUgbGV2ZWxzIChlbGVtZW50IGlkIGxvb2t1cClcbkVUQ3AuZ2V0RWxlbWVudEtleVRvUXVldWUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGsycSA9IHNlbGYuZWxlS2V5VG9DYWNoZVF1ZXVlID0gc2VsZi5lbGVLZXlUb0NhY2hlUXVldWUgfHwge307XG4gIHJldHVybiBrMnE7XG59O1xuRVRDcC5nZXRFbGVtZW50ID0gZnVuY3Rpb24gKGVsZSwgYmIsIHB4UmF0aW8sIGx2bCwgcmVhc29uKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHIgPSB0aGlzLnJlbmRlcmVyO1xuICB2YXIgem9vbSA9IHIuY3kuem9vbSgpO1xuICB2YXIgbG9va3VwID0gdGhpcy5sb29rdXA7XG4gIGlmICghYmIgfHwgYmIudyA9PT0gMCB8fCBiYi5oID09PSAwIHx8IGlzTmFOKGJiLncpIHx8IGlzTmFOKGJiLmgpIHx8ICFlbGUudmlzaWJsZSgpIHx8IGVsZS5yZW1vdmVkKCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAoIXNlbGYuYWxsb3dFZGdlVHhyQ2FjaGluZyAmJiBlbGUuaXNFZGdlKCkgfHwgIXNlbGYuYWxsb3dQYXJlbnRUeHJDYWNoaW5nICYmIGVsZS5pc1BhcmVudCgpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKGx2bCA9PSBudWxsKSB7XG4gICAgbHZsID0gTWF0aC5jZWlsKGxvZzIoem9vbSAqIHB4UmF0aW8pKTtcbiAgfVxuICBpZiAobHZsIDwgbWluTHZsJDEpIHtcbiAgICBsdmwgPSBtaW5MdmwkMTtcbiAgfSBlbHNlIGlmICh6b29tID49IG1heFpvb20kMSB8fCBsdmwgPiBtYXhMdmwkMSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZhciBzY2FsZSA9IE1hdGgucG93KDIsIGx2bCk7XG4gIHZhciBlbGVTY2FsZWRIID0gYmIuaCAqIHNjYWxlO1xuICB2YXIgZWxlU2NhbGVkVyA9IGJiLncgKiBzY2FsZTtcbiAgdmFyIHNjYWxlZExhYmVsU2hvd24gPSByLmVsZVRleHRCaWdnZXJUaGFuTWluKGVsZSwgc2NhbGUpO1xuICBpZiAoIXRoaXMuaXNWaXNpYmxlKGVsZSwgc2NhbGVkTGFiZWxTaG93bikpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2YXIgZWxlQ2FjaGUgPSBsb29rdXAuZ2V0KGVsZSwgbHZsKTtcblxuICAvLyBpZiB0aGlzIGdldCB3YXMgb24gYW4gdW51c2VkL2ludmFsaWRhdGVkIGNhY2hlLCB0aGVuIHJlc3RvcmUgdGhlIHRleHR1cmUgdXNhZ2UgbWV0cmljXG4gIGlmIChlbGVDYWNoZSAmJiBlbGVDYWNoZS5pbnZhbGlkYXRlZCkge1xuICAgIGVsZUNhY2hlLmludmFsaWRhdGVkID0gZmFsc2U7XG4gICAgZWxlQ2FjaGUudGV4dHVyZS5pbnZhbGlkYXRlZFdpZHRoIC09IGVsZUNhY2hlLndpZHRoO1xuICB9XG4gIGlmIChlbGVDYWNoZSkge1xuICAgIHJldHVybiBlbGVDYWNoZTtcbiAgfVxuICB2YXIgdHhySDsgLy8gd2hpY2ggdGV4dHVyZSBoZWlnaHQgdGhpcyBlbGUgYmVsb25ncyB0b1xuXG4gIGlmIChlbGVTY2FsZWRIIDw9IG1pblR4ckgpIHtcbiAgICB0eHJIID0gbWluVHhySDtcbiAgfSBlbHNlIGlmIChlbGVTY2FsZWRIIDw9IHR4clN0ZXBIKSB7XG4gICAgdHhySCA9IHR4clN0ZXBIO1xuICB9IGVsc2Uge1xuICAgIHR4ckggPSBNYXRoLmNlaWwoZWxlU2NhbGVkSCAvIHR4clN0ZXBIKSAqIHR4clN0ZXBIO1xuICB9XG4gIGlmIChlbGVTY2FsZWRIID4gbWF4VHhySCB8fCBlbGVTY2FsZWRXID4gbWF4VHhyVykge1xuICAgIHJldHVybiBudWxsOyAvLyBjYWNoaW5nIGxhcmdlIGVsZW1lbnRzIGlzIG5vdCBlZmZpY2llbnRcbiAgfVxuICB2YXIgdHhyUSA9IHNlbGYuZ2V0VGV4dHVyZVF1ZXVlKHR4ckgpO1xuXG4gIC8vIGZpcnN0IHRyeSB0aGUgc2Vjb25kIGxhc3Qgb25lIGluIGNhc2UgaXQgaGFzIHNwYWNlIGF0IHRoZSBlbmRcbiAgdmFyIHR4ciA9IHR4clFbdHhyUS5sZW5ndGggLSAyXTtcbiAgdmFyIGFkZE5ld1R4ciA9IGZ1bmN0aW9uIGFkZE5ld1R4cigpIHtcbiAgICByZXR1cm4gc2VsZi5yZWN5Y2xlVGV4dHVyZSh0eHJILCBlbGVTY2FsZWRXKSB8fCBzZWxmLmFkZFRleHR1cmUodHhySCwgZWxlU2NhbGVkVyk7XG4gIH07XG5cbiAgLy8gdHJ5IHRoZSBsYXN0IG9uZSBpZiB0aGVyZSBpcyBubyBzZWNvbmQgbGFzdCBvbmVcbiAgaWYgKCF0eHIpIHtcbiAgICB0eHIgPSB0eHJRW3R4clEubGVuZ3RoIC0gMV07XG4gIH1cblxuICAvLyBpZiB0aGUgbGFzdCBvbmUgZG9lc24ndCBleGlzdCwgd2UgbmVlZCBhIGZpcnN0IG9uZVxuICBpZiAoIXR4cikge1xuICAgIHR4ciA9IGFkZE5ld1R4cigpO1xuICB9XG5cbiAgLy8gaWYgdGhlcmUncyBubyByb29tIGluIHRoZSBjdXJyZW50IHRleHR1cmUsIHdlIG5lZWQgYSBuZXcgb25lXG4gIGlmICh0eHIud2lkdGggLSB0eHIudXNlZFdpZHRoIDwgZWxlU2NhbGVkVykge1xuICAgIHR4ciA9IGFkZE5ld1R4cigpO1xuICB9XG4gIHZhciBzY2FsYWJsZUZyb20gPSBmdW5jdGlvbiBzY2FsYWJsZUZyb20ob3RoZXJDYWNoZSkge1xuICAgIHJldHVybiBvdGhlckNhY2hlICYmIG90aGVyQ2FjaGUuc2NhbGVkTGFiZWxTaG93biA9PT0gc2NhbGVkTGFiZWxTaG93bjtcbiAgfTtcbiAgdmFyIGRlcWluZyA9IHJlYXNvbiAmJiByZWFzb24gPT09IGdldFR4clJlYXNvbnMuZGVxdWV1ZTtcbiAgdmFyIGhpZ2hRdWFsaXR5UmVxID0gcmVhc29uICYmIHJlYXNvbiA9PT0gZ2V0VHhyUmVhc29ucy5oaWdoUXVhbGl0eTtcbiAgdmFyIGRvd25zY2FsZVJlcSA9IHJlYXNvbiAmJiByZWFzb24gPT09IGdldFR4clJlYXNvbnMuZG93bnNjYWxlO1xuICB2YXIgaGlnaGVyQ2FjaGU7IC8vIHRoZSBuZWFyZXN0IGNhY2hlIHdpdGggYSBoaWdoZXIgbGV2ZWxcbiAgZm9yICh2YXIgbCA9IGx2bCArIDE7IGwgPD0gbWF4THZsJDE7IGwrKykge1xuICAgIHZhciBjID0gbG9va3VwLmdldChlbGUsIGwpO1xuICAgIGlmIChjKSB7XG4gICAgICBoaWdoZXJDYWNoZSA9IGM7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgdmFyIG9uZVVwQ2FjaGUgPSBoaWdoZXJDYWNoZSAmJiBoaWdoZXJDYWNoZS5sZXZlbCA9PT0gbHZsICsgMSA/IGhpZ2hlckNhY2hlIDogbnVsbDtcbiAgdmFyIGRvd25zY2FsZSA9IGZ1bmN0aW9uIGRvd25zY2FsZSgpIHtcbiAgICB0eHIuY29udGV4dC5kcmF3SW1hZ2Uob25lVXBDYWNoZS50ZXh0dXJlLmNhbnZhcywgb25lVXBDYWNoZS54LCAwLCBvbmVVcENhY2hlLndpZHRoLCBvbmVVcENhY2hlLmhlaWdodCwgdHhyLnVzZWRXaWR0aCwgMCwgZWxlU2NhbGVkVywgZWxlU2NhbGVkSCk7XG4gIH07XG5cbiAgLy8gcmVzZXQgZWxlIGFyZWEgaW4gdGV4dHVyZVxuICB0eHIuY29udGV4dC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7XG4gIHR4ci5jb250ZXh0LmNsZWFyUmVjdCh0eHIudXNlZFdpZHRoLCAwLCBlbGVTY2FsZWRXLCB0eHJIKTtcbiAgaWYgKHNjYWxhYmxlRnJvbShvbmVVcENhY2hlKSkge1xuICAgIC8vIHRoZW4gd2UgY2FuIHJlbGF0aXZlbHkgY2hlYXBseSByZXNjYWxlIHRoZSBleGlzdGluZyBpbWFnZSB3L28gcmVyZW5kZXJpbmdcbiAgICBkb3duc2NhbGUoKTtcbiAgfSBlbHNlIGlmIChzY2FsYWJsZUZyb20oaGlnaGVyQ2FjaGUpKSB7XG4gICAgLy8gdGhlbiB1c2UgdGhlIGhpZ2hlciBjYWNoZSBmb3Igbm93IGFuZCBxdWV1ZSB0aGUgbmV4dCBsZXZlbCBkb3duXG4gICAgLy8gdG8gY2hlYXBseSBzY2FsZSB0b3dhcmRzIHRoZSBzbWFsbGVyIGxldmVsXG5cbiAgICBpZiAoaGlnaFF1YWxpdHlSZXEpIHtcbiAgICAgIGZvciAodmFyIF9sID0gaGlnaGVyQ2FjaGUubGV2ZWw7IF9sID4gbHZsOyBfbC0tKSB7XG4gICAgICAgIG9uZVVwQ2FjaGUgPSBzZWxmLmdldEVsZW1lbnQoZWxlLCBiYiwgcHhSYXRpbywgX2wsIGdldFR4clJlYXNvbnMuZG93bnNjYWxlKTtcbiAgICAgIH1cbiAgICAgIGRvd25zY2FsZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZWxmLnF1ZXVlRWxlbWVudChlbGUsIGhpZ2hlckNhY2hlLmxldmVsIC0gMSk7XG4gICAgICByZXR1cm4gaGlnaGVyQ2FjaGU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBsb3dlckNhY2hlOyAvLyB0aGUgbmVhcmVzdCBjYWNoZSB3aXRoIGEgbG93ZXIgbGV2ZWxcbiAgICBpZiAoIWRlcWluZyAmJiAhaGlnaFF1YWxpdHlSZXEgJiYgIWRvd25zY2FsZVJlcSkge1xuICAgICAgZm9yICh2YXIgX2wyID0gbHZsIC0gMTsgX2wyID49IG1pbkx2bCQxOyBfbDItLSkge1xuICAgICAgICB2YXIgX2MgPSBsb29rdXAuZ2V0KGVsZSwgX2wyKTtcbiAgICAgICAgaWYgKF9jKSB7XG4gICAgICAgICAgbG93ZXJDYWNoZSA9IF9jO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzY2FsYWJsZUZyb20obG93ZXJDYWNoZSkpIHtcbiAgICAgIC8vIHRoZW4gdXNlIHRoZSBsb3dlciBxdWFsaXR5IGNhY2hlIGZvciBub3cgYW5kIHF1ZXVlIHRoZSBiZXR0ZXIgb25lIGZvciBsYXRlclxuXG4gICAgICBzZWxmLnF1ZXVlRWxlbWVudChlbGUsIGx2bCk7XG4gICAgICByZXR1cm4gbG93ZXJDYWNoZTtcbiAgICB9XG4gICAgdHhyLmNvbnRleHQudHJhbnNsYXRlKHR4ci51c2VkV2lkdGgsIDApO1xuICAgIHR4ci5jb250ZXh0LnNjYWxlKHNjYWxlLCBzY2FsZSk7XG4gICAgdGhpcy5kcmF3RWxlbWVudCh0eHIuY29udGV4dCwgZWxlLCBiYiwgc2NhbGVkTGFiZWxTaG93biwgZmFsc2UpO1xuICAgIHR4ci5jb250ZXh0LnNjYWxlKDEgLyBzY2FsZSwgMSAvIHNjYWxlKTtcbiAgICB0eHIuY29udGV4dC50cmFuc2xhdGUoLXR4ci51c2VkV2lkdGgsIDApO1xuICB9XG4gIGVsZUNhY2hlID0ge1xuICAgIHg6IHR4ci51c2VkV2lkdGgsXG4gICAgdGV4dHVyZTogdHhyLFxuICAgIGxldmVsOiBsdmwsXG4gICAgc2NhbGU6IHNjYWxlLFxuICAgIHdpZHRoOiBlbGVTY2FsZWRXLFxuICAgIGhlaWdodDogZWxlU2NhbGVkSCxcbiAgICBzY2FsZWRMYWJlbFNob3duOiBzY2FsZWRMYWJlbFNob3duXG4gIH07XG4gIHR4ci51c2VkV2lkdGggKz0gTWF0aC5jZWlsKGVsZVNjYWxlZFcgKyBlbGVUeHJTcGFjaW5nKTtcbiAgdHhyLmVsZUNhY2hlcy5wdXNoKGVsZUNhY2hlKTtcbiAgbG9va3VwLnNldChlbGUsIGx2bCwgZWxlQ2FjaGUpO1xuICBzZWxmLmNoZWNrVGV4dHVyZUZ1bGxuZXNzKHR4cik7XG4gIHJldHVybiBlbGVDYWNoZTtcbn07XG5FVENwLmludmFsaWRhdGVFbGVtZW50cyA9IGZ1bmN0aW9uIChlbGVzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgIHRoaXMuaW52YWxpZGF0ZUVsZW1lbnQoZWxlc1tpXSk7XG4gIH1cbn07XG5FVENwLmludmFsaWRhdGVFbGVtZW50ID0gZnVuY3Rpb24gKGVsZSkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBsb29rdXAgPSBzZWxmLmxvb2t1cDtcbiAgdmFyIGNhY2hlcyA9IFtdO1xuICB2YXIgaW52YWxpZCA9IGxvb2t1cC5pc0ludmFsaWQoZWxlKTtcbiAgaWYgKCFpbnZhbGlkKSB7XG4gICAgcmV0dXJuOyAvLyBvdmVycmlkZSB0aGUgaW52YWxpZGF0aW9uIHJlcXVlc3QgaWYgdGhlIGVsZW1lbnQga2V5IGhhcyBub3QgY2hhbmdlZFxuICB9XG4gIGZvciAodmFyIGx2bCA9IG1pbkx2bCQxOyBsdmwgPD0gbWF4THZsJDE7IGx2bCsrKSB7XG4gICAgdmFyIGNhY2hlID0gbG9va3VwLmdldEZvckNhY2hlZEtleShlbGUsIGx2bCk7XG4gICAgaWYgKGNhY2hlKSB7XG4gICAgICBjYWNoZXMucHVzaChjYWNoZSk7XG4gICAgfVxuICB9XG4gIHZhciBub090aGVyRWxlc1VzZUNhY2hlID0gbG9va3VwLmludmFsaWRhdGUoZWxlKTtcbiAgaWYgKG5vT3RoZXJFbGVzVXNlQ2FjaGUpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNhY2hlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIF9jYWNoZSA9IGNhY2hlc1tpXTtcbiAgICAgIHZhciB0eHIgPSBfY2FjaGUudGV4dHVyZTtcblxuICAgICAgLy8gcmVtb3ZlIHNwYWNlIGZyb20gdGhlIHRleHR1cmUgaXQgYmVsb25ncyB0b1xuICAgICAgdHhyLmludmFsaWRhdGVkV2lkdGggKz0gX2NhY2hlLndpZHRoO1xuXG4gICAgICAvLyBtYXJrIHRoZSBjYWNoZSBhcyBpbnZhbGlkYXRlZFxuICAgICAgX2NhY2hlLmludmFsaWRhdGVkID0gdHJ1ZTtcblxuICAgICAgLy8gcmV0aXJlIHRoZSB0ZXh0dXJlIGlmIGl0cyB1dGlsaXR5IGlzIGxvd1xuICAgICAgc2VsZi5jaGVja1RleHR1cmVVdGlsaXR5KHR4cik7XG4gICAgfVxuICB9XG5cbiAgLy8gcmVtb3ZlIGZyb20gcXVldWUgc2luY2UgdGhlIG9sZCByZXEgd2FzIGZvciB0aGUgb2xkIHN0YXRlXG4gIHNlbGYucmVtb3ZlRnJvbVF1ZXVlKGVsZSk7XG59O1xuRVRDcC5jaGVja1RleHR1cmVVdGlsaXR5ID0gZnVuY3Rpb24gKHR4cikge1xuICAvLyBpbnZhbGlkYXRlIGFsbCBlbnRyaWVzIGluIHRoZSBjYWNoZSBpZiB0aGUgY2FjaGUgc2l6ZSBpcyBzbWFsbFxuICBpZiAodHhyLmludmFsaWRhdGVkV2lkdGggPj0gbWluVXRpbGl0eSAqIHR4ci53aWR0aCkge1xuICAgIHRoaXMucmV0aXJlVGV4dHVyZSh0eHIpO1xuICB9XG59O1xuRVRDcC5jaGVja1RleHR1cmVGdWxsbmVzcyA9IGZ1bmN0aW9uICh0eHIpIHtcbiAgLy8gaWYgdGV4dHVyZSBoYXMgYmVlbiBtb3N0bHkgZmlsbGVkIGFuZCBwYXNzZWQgb3ZlciBzZXZlcmFsIHRpbWVzLCByZW1vdmVcbiAgLy8gaXQgZnJvbSB0aGUgcXVldWUgc28gd2UgZG9uJ3QgbmVlZCB0byB3YXN0ZSB0aW1lIGxvb2tpbmcgYXQgaXQgdG8gcHV0IG5ldyB0aGluZ3NcblxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciB0eHJRID0gc2VsZi5nZXRUZXh0dXJlUXVldWUodHhyLmhlaWdodCk7XG4gIGlmICh0eHIudXNlZFdpZHRoIC8gdHhyLndpZHRoID4gbWF4RnVsbG5lc3MgJiYgdHhyLmZ1bGxuZXNzQ2hlY2tzID49IG1heEZ1bGxuZXNzQ2hlY2tzKSB7XG4gICAgcmVtb3ZlRnJvbUFycmF5KHR4clEsIHR4cik7XG4gIH0gZWxzZSB7XG4gICAgdHhyLmZ1bGxuZXNzQ2hlY2tzKys7XG4gIH1cbn07XG5FVENwLnJldGlyZVRleHR1cmUgPSBmdW5jdGlvbiAodHhyKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHR4ckggPSB0eHIuaGVpZ2h0O1xuICB2YXIgdHhyUSA9IHNlbGYuZ2V0VGV4dHVyZVF1ZXVlKHR4ckgpO1xuICB2YXIgbG9va3VwID0gdGhpcy5sb29rdXA7XG5cbiAgLy8gcmV0aXJlIHRoZSB0ZXh0dXJlIGZyb20gdGhlIGFjdGl2ZSAvIHNlYXJjaGFibGUgcXVldWU6XG5cbiAgcmVtb3ZlRnJvbUFycmF5KHR4clEsIHR4cik7XG4gIHR4ci5yZXRpcmVkID0gdHJ1ZTtcblxuICAvLyByZW1vdmUgdGhlIHJlZnMgZnJvbSB0aGUgZWxlcyB0byB0aGUgY2FjaGVzOlxuXG4gIHZhciBlbGVDYWNoZXMgPSB0eHIuZWxlQ2FjaGVzO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZUNhY2hlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbGVDYWNoZSA9IGVsZUNhY2hlc1tpXTtcbiAgICBsb29rdXAuZGVsZXRlQ2FjaGUoZWxlQ2FjaGUua2V5LCBlbGVDYWNoZS5sZXZlbCk7XG4gIH1cbiAgY2xlYXJBcnJheShlbGVDYWNoZXMpO1xuXG4gIC8vIGFkZCB0aGUgdGV4dHVyZSB0byBhIHJldGlyZWQgcXVldWUgc28gaXQgY2FuIGJlIHJlY3ljbGVkIGluIGZ1dHVyZTpcblxuICB2YXIgcnR4dHJRID0gc2VsZi5nZXRSZXRpcmVkVGV4dHVyZVF1ZXVlKHR4ckgpO1xuICBydHh0clEucHVzaCh0eHIpO1xufTtcbkVUQ3AuYWRkVGV4dHVyZSA9IGZ1bmN0aW9uICh0eHJILCBtaW5XKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHR4clEgPSBzZWxmLmdldFRleHR1cmVRdWV1ZSh0eHJIKTtcbiAgdmFyIHR4ciA9IHt9O1xuICB0eHJRLnB1c2godHhyKTtcbiAgdHhyLmVsZUNhY2hlcyA9IFtdO1xuICB0eHIuaGVpZ2h0ID0gdHhySDtcbiAgdHhyLndpZHRoID0gTWF0aC5tYXgoZGVmVHhyV2lkdGgsIG1pblcpO1xuICB0eHIudXNlZFdpZHRoID0gMDtcbiAgdHhyLmludmFsaWRhdGVkV2lkdGggPSAwO1xuICB0eHIuZnVsbG5lc3NDaGVja3MgPSAwO1xuICB0eHIuY2FudmFzID0gc2VsZi5yZW5kZXJlci5tYWtlT2Zmc2NyZWVuQ2FudmFzKHR4ci53aWR0aCwgdHhyLmhlaWdodCk7XG4gIHR4ci5jb250ZXh0ID0gdHhyLmNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICByZXR1cm4gdHhyO1xufTtcbkVUQ3AucmVjeWNsZVRleHR1cmUgPSBmdW5jdGlvbiAodHhySCwgbWluVykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciB0eHJRID0gc2VsZi5nZXRUZXh0dXJlUXVldWUodHhySCk7XG4gIHZhciBydHh0clEgPSBzZWxmLmdldFJldGlyZWRUZXh0dXJlUXVldWUodHhySCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcnR4dHJRLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHR4ciA9IHJ0eHRyUVtpXTtcbiAgICBpZiAodHhyLndpZHRoID49IG1pblcpIHtcbiAgICAgIHR4ci5yZXRpcmVkID0gZmFsc2U7XG4gICAgICB0eHIudXNlZFdpZHRoID0gMDtcbiAgICAgIHR4ci5pbnZhbGlkYXRlZFdpZHRoID0gMDtcbiAgICAgIHR4ci5mdWxsbmVzc0NoZWNrcyA9IDA7XG4gICAgICBjbGVhckFycmF5KHR4ci5lbGVDYWNoZXMpO1xuICAgICAgdHhyLmNvbnRleHQuc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuICAgICAgdHhyLmNvbnRleHQuY2xlYXJSZWN0KDAsIDAsIHR4ci53aWR0aCwgdHhyLmhlaWdodCk7XG4gICAgICByZW1vdmVGcm9tQXJyYXkocnR4dHJRLCB0eHIpO1xuICAgICAgdHhyUS5wdXNoKHR4cik7XG4gICAgICByZXR1cm4gdHhyO1xuICAgIH1cbiAgfVxufTtcbkVUQ3AucXVldWVFbGVtZW50ID0gZnVuY3Rpb24gKGVsZSwgbHZsKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHEgPSBzZWxmLmdldEVsZW1lbnRRdWV1ZSgpO1xuICB2YXIgazJxID0gc2VsZi5nZXRFbGVtZW50S2V5VG9RdWV1ZSgpO1xuICB2YXIga2V5ID0gdGhpcy5nZXRLZXkoZWxlKTtcbiAgdmFyIGV4aXN0aW5nUmVxID0gazJxW2tleV07XG4gIGlmIChleGlzdGluZ1JlcSkge1xuICAgIC8vIHVzZSB0aGUgbWF4IGx2bCBiL2MgaW4gYmV0d2VlbiBsdmxzIGFyZSBjaGVhcCB0byBtYWtlXG4gICAgZXhpc3RpbmdSZXEubGV2ZWwgPSBNYXRoLm1heChleGlzdGluZ1JlcS5sZXZlbCwgbHZsKTtcbiAgICBleGlzdGluZ1JlcS5lbGVzLm1lcmdlKGVsZSk7XG4gICAgZXhpc3RpbmdSZXEucmVxcysrO1xuICAgIHEudXBkYXRlSXRlbShleGlzdGluZ1JlcSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHJlcSA9IHtcbiAgICAgIGVsZXM6IGVsZS5zcGF3bigpLm1lcmdlKGVsZSksXG4gICAgICBsZXZlbDogbHZsLFxuICAgICAgcmVxczogMSxcbiAgICAgIGtleToga2V5XG4gICAgfTtcbiAgICBxLnB1c2gocmVxKTtcbiAgICBrMnFba2V5XSA9IHJlcTtcbiAgfVxufTtcbkVUQ3AuZGVxdWV1ZSA9IGZ1bmN0aW9uIChweFJhdGlvIC8qLCBleHRlbnQqLykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBxID0gc2VsZi5nZXRFbGVtZW50UXVldWUoKTtcbiAgdmFyIGsycSA9IHNlbGYuZ2V0RWxlbWVudEtleVRvUXVldWUoKTtcbiAgdmFyIGRlcXVldWVkID0gW107XG4gIHZhciBsb29rdXAgPSBzZWxmLmxvb2t1cDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXhEZXFTaXplJDE7IGkrKykge1xuICAgIGlmIChxLnNpemUoKSA+IDApIHtcbiAgICAgIHZhciByZXEgPSBxLnBvcCgpO1xuICAgICAgdmFyIGtleSA9IHJlcS5rZXk7XG4gICAgICB2YXIgZWxlID0gcmVxLmVsZXNbMF07IC8vIGFsbCBlbGVzIGhhdmUgdGhlIHNhbWUga2V5XG4gICAgICB2YXIgY2FjaGVFeGlzdHMgPSBsb29rdXAuaGFzQ2FjaGUoZWxlLCByZXEubGV2ZWwpO1xuXG4gICAgICAvLyBjbGVhciBvdXQgdGhlIGtleSB0byByZXEgbG9va3VwXG4gICAgICBrMnFba2V5XSA9IG51bGw7XG5cbiAgICAgIC8vIGRlcXVldWVpbmcgaXNuJ3QgbmVjZXNzYXJ5IHdpdGggYW4gZXhpc3RpbmcgY2FjaGVcbiAgICAgIGlmIChjYWNoZUV4aXN0cykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGRlcXVldWVkLnB1c2gocmVxKTtcbiAgICAgIHZhciBiYiA9IHNlbGYuZ2V0Qm91bmRpbmdCb3goZWxlKTtcbiAgICAgIHNlbGYuZ2V0RWxlbWVudChlbGUsIGJiLCBweFJhdGlvLCByZXEubGV2ZWwsIGdldFR4clJlYXNvbnMuZGVxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGVxdWV1ZWQ7XG59O1xuRVRDcC5yZW1vdmVGcm9tUXVldWUgPSBmdW5jdGlvbiAoZWxlKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHEgPSBzZWxmLmdldEVsZW1lbnRRdWV1ZSgpO1xuICB2YXIgazJxID0gc2VsZi5nZXRFbGVtZW50S2V5VG9RdWV1ZSgpO1xuICB2YXIga2V5ID0gdGhpcy5nZXRLZXkoZWxlKTtcbiAgdmFyIHJlcSA9IGsycVtrZXldO1xuICBpZiAocmVxICE9IG51bGwpIHtcbiAgICBpZiAocmVxLmVsZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAvLyByZW1vdmUgaWYgbGFzdCBlbGUgaW4gdGhlIHJlcVxuICAgICAgLy8gYnJpbmcgdG8gZnJvbnQgb2YgcXVldWVcbiAgICAgIHJlcS5yZXFzID0gTUFYX0lOVCQxO1xuICAgICAgcS51cGRhdGVJdGVtKHJlcSk7XG4gICAgICBxLnBvcCgpOyAvLyByZW1vdmUgZnJvbSBxdWV1ZVxuXG4gICAgICBrMnFba2V5XSA9IG51bGw7IC8vIHJlbW92ZSBmcm9tIGxvb2t1cCBtYXBcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gb3RoZXJ3aXNlIGp1c3QgcmVtb3ZlIGVsZSBmcm9tIHJlcVxuICAgICAgcmVxLmVsZXMudW5tZXJnZShlbGUpO1xuICAgIH1cbiAgfVxufTtcbkVUQ3Aub25EZXF1ZXVlID0gZnVuY3Rpb24gKGZuKSB7XG4gIHRoaXMub25EZXF1ZXVlcy5wdXNoKGZuKTtcbn07XG5FVENwLm9mZkRlcXVldWUgPSBmdW5jdGlvbiAoZm4pIHtcbiAgcmVtb3ZlRnJvbUFycmF5KHRoaXMub25EZXF1ZXVlcywgZm4pO1xufTtcbkVUQ3Auc2V0dXBEZXF1ZXVlaW5nID0gZGVmcy5zZXR1cERlcXVldWVpbmcoe1xuICBkZXFSZWRyYXdUaHJlc2hvbGQ6IGRlcVJlZHJhd1RocmVzaG9sZCQxLFxuICBkZXFDb3N0OiBkZXFDb3N0JDEsXG4gIGRlcUF2Z0Nvc3Q6IGRlcUF2Z0Nvc3QkMSxcbiAgZGVxTm9EcmF3Q29zdDogZGVxTm9EcmF3Q29zdCQxLFxuICBkZXFGYXN0Q29zdDogZGVxRmFzdENvc3QkMSxcbiAgZGVxOiBmdW5jdGlvbiBkZXEoc2VsZiwgcHhSYXRpbywgZXh0ZW50KSB7XG4gICAgcmV0dXJuIHNlbGYuZGVxdWV1ZShweFJhdGlvLCBleHRlbnQpO1xuICB9LFxuICBvbkRlcWQ6IGZ1bmN0aW9uIG9uRGVxZChzZWxmLCBkZXFkKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLm9uRGVxdWV1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBmbiA9IHNlbGYub25EZXF1ZXVlc1tpXTtcbiAgICAgIGZuKGRlcWQpO1xuICAgIH1cbiAgfSxcbiAgc2hvdWxkUmVkcmF3OiBmdW5jdGlvbiBzaG91bGRSZWRyYXcoc2VsZiwgZGVxZCwgcHhSYXRpbywgZXh0ZW50KSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZXFkLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlcyA9IGRlcWRbaV0uZWxlcztcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZWxlcy5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgYmIgPSBlbGVzW2pdLmJvdW5kaW5nQm94KCk7XG4gICAgICAgIGlmIChib3VuZGluZ0JveGVzSW50ZXJzZWN0KGJiLCBleHRlbnQpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBwcmlvcml0eTogZnVuY3Rpb24gcHJpb3JpdHkoc2VsZikge1xuICAgIHJldHVybiBzZWxmLnJlbmRlcmVyLmJlZm9yZVJlbmRlclByaW9yaXRpZXMuZWxlVHhyRGVxO1xuICB9XG59KTtcblxudmFyIGRlZk51bUxheWVycyA9IDE7IC8vIGRlZmF1bHQgbnVtYmVyIG9mIGxheWVycyB0byB1c2VcbnZhciBtaW5MdmwgPSAtNDsgLy8gd2hlbiBzY2FsaW5nIHNtYWxsZXIgdGhhbiB0aGF0IHdlIGRvbid0IG5lZWQgdG8gcmUtcmVuZGVyXG52YXIgbWF4THZsID0gMjsgLy8gd2hlbiBsYXJnZXIgdGhhbiB0aGlzIHNjYWxlIGp1c3QgcmVuZGVyIGRpcmVjdGx5IChjYWNoaW5nIGlzIG5vdCBoZWxwZnVsKVxudmFyIG1heFpvb20gPSAzLjk5OyAvLyBiZXlvbmQgdGhpcyB6b29tIGxldmVsLCBsYXllcmVkIHRleHR1cmVzIGFyZSBub3QgdXNlZFxudmFyIGRlcVJlZHJhd1RocmVzaG9sZCA9IDUwOyAvLyB0aW1lIHRvIGJhdGNoIHJlZHJhd3MgdG9nZXRoZXIgZnJvbSBkZXF1ZXVlaW5nIHRvIGFsbG93IG1vcmUgZGVxdWV1ZWluZyBjYWxjcyB0byBoYXBwZW4gaW4gdGhlIG1lYW53aGlsZVxudmFyIHJlZmluZUVsZURlYm91bmNlVGltZSA9IDUwOyAvLyB0aW1lIHRvIGRlYm91bmNlIHNoYXJwZXIgZWxlIHRleHR1cmUgdXBkYXRlc1xudmFyIGRlcUNvc3QgPSAwLjE1OyAvLyAlIG9mIGFkZCdsIHJlbmRlcmluZyBjb3N0IGFsbG93ZWQgZm9yIGRlcXVldWluZyBlbGUgY2FjaGVzIGVhY2ggZnJhbWVcbnZhciBkZXFBdmdDb3N0ID0gMC4xOyAvLyAlIG9mIGFkZCdsIHJlbmRlcmluZyBjb3N0IGNvbXBhcmVkIHRvIGF2ZXJhZ2Ugb3ZlcmFsbCByZWRyYXcgdGltZVxudmFyIGRlcU5vRHJhd0Nvc3QgPSAwLjk7IC8vICUgb2YgYXZnIGZyYW1lIHRpbWUgdGhhdCBjYW4gYmUgdXNlZCBmb3IgZGVxdWV1ZWluZyB3aGVuIG5vdCBkcmF3aW5nXG52YXIgZGVxRmFzdENvc3QgPSAwLjk7IC8vICUgb2YgZnJhbWUgdGltZSB0byBiZSB1c2VkIHdoZW4gPjYwZnBzXG52YXIgbWF4RGVxU2l6ZSA9IDE7IC8vIG51bWJlciBvZiBlbGVzIHRvIGRlcXVldWUgYW5kIHJlbmRlciBhdCBoaWdoZXIgdGV4dHVyZSBpbiBlYWNoIGJhdGNoXG52YXIgaW52YWxpZFRocmVzaG9sZCA9IDI1MDsgLy8gdGltZSB0aHJlc2hvbGQgZm9yIGRpc2FibGluZyBiL2Mgb2YgaW52YWxpZGF0aW9uc1xudmFyIG1heExheWVyQXJlYSA9IDQwMDAgKiA0MDAwOyAvLyBsYXllcnMgY2FuJ3QgYmUgYmlnZ2VyIHRoYW4gdGhpc1xudmFyIG1heExheWVyRGltID0gMzI3Njc7IC8vIG1heGltdW0gc2l6ZSBmb3IgdGhlIHdpZHRoL2hlaWdodCBvZiBsYXllciBjYW52YXNlc1xudmFyIHVzZUhpZ2hRdWFsaXR5RWxlVHhyUmVxcyA9IHRydWU7IC8vIHdoZXRoZXIgdG8gdXNlIGhpZ2ggcXVhbGl0eSBlbGUgdHhyIHJlcXVlc3RzIChnZW5lcmFsbHkgZmFzdGVyIGFuZCBjaGVhcGVyIGluIHRoZSBsb25ndGVybSlcblxuLy8gdmFyIGxvZyA9IGZ1bmN0aW9uKCl7IGNvbnNvbGUubG9nLmFwcGx5KCBjb25zb2xlLCBhcmd1bWVudHMgKTsgfTtcblxudmFyIExheWVyZWRUZXh0dXJlQ2FjaGUgPSBmdW5jdGlvbiBMYXllcmVkVGV4dHVyZUNhY2hlKHJlbmRlcmVyKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHIgPSBzZWxmLnJlbmRlcmVyID0gcmVuZGVyZXI7XG4gIHZhciBjeSA9IHIuY3k7XG4gIHNlbGYubGF5ZXJzQnlMZXZlbCA9IHt9OyAvLyBlLmcuIDIgPT4gWyBsYXllcjEsIGxheWVyMiwgLi4uLCBsYXllck4gXVxuXG4gIHNlbGYuZmlyc3RHZXQgPSB0cnVlO1xuICBzZWxmLmxhc3RJbnZhbGlkYXRpb25UaW1lID0gcGVyZm9ybWFuY2VOb3coKSAtIDIgKiBpbnZhbGlkVGhyZXNob2xkO1xuICBzZWxmLnNraXBwaW5nID0gZmFsc2U7XG4gIHNlbGYuZWxlVHhyRGVxcyA9IGN5LmNvbGxlY3Rpb24oKTtcbiAgc2VsZi5zY2hlZHVsZUVsZW1lbnRSZWZpbmVtZW50ID0gZGVib3VuY2UoZnVuY3Rpb24gKCkge1xuICAgIHNlbGYucmVmaW5lRWxlbWVudFRleHR1cmVzKHNlbGYuZWxlVHhyRGVxcyk7XG4gICAgc2VsZi5lbGVUeHJEZXFzLnVubWVyZ2Uoc2VsZi5lbGVUeHJEZXFzKTtcbiAgfSwgcmVmaW5lRWxlRGVib3VuY2VUaW1lKTtcbiAgci5iZWZvcmVSZW5kZXIoZnVuY3Rpb24gKHdpbGxEcmF3LCBub3cpIHtcbiAgICBpZiAobm93IC0gc2VsZi5sYXN0SW52YWxpZGF0aW9uVGltZSA8PSBpbnZhbGlkVGhyZXNob2xkKSB7XG4gICAgICBzZWxmLnNraXBwaW5nID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZi5za2lwcGluZyA9IGZhbHNlO1xuICAgIH1cbiAgfSwgci5iZWZvcmVSZW5kZXJQcmlvcml0aWVzLmx5clR4clNraXApO1xuICB2YXIgcVNvcnQgPSBmdW5jdGlvbiBxU29ydChhLCBiKSB7XG4gICAgcmV0dXJuIGIucmVxcyAtIGEucmVxcztcbiAgfTtcbiAgc2VsZi5sYXllcnNRdWV1ZSA9IG5ldyBIZWFwKHFTb3J0KTtcbiAgc2VsZi5zZXR1cERlcXVldWVpbmcoKTtcbn07XG52YXIgTFRDcCA9IExheWVyZWRUZXh0dXJlQ2FjaGUucHJvdG90eXBlO1xudmFyIGxheWVySWRQb29sID0gMDtcbnZhciBNQVhfSU5UID0gTWF0aC5wb3coMiwgNTMpIC0gMTtcbkxUQ3AubWFrZUxheWVyID0gZnVuY3Rpb24gKGJiLCBsdmwpIHtcbiAgdmFyIHNjYWxlID0gTWF0aC5wb3coMiwgbHZsKTtcbiAgdmFyIHcgPSBNYXRoLmNlaWwoYmIudyAqIHNjYWxlKTtcbiAgdmFyIGggPSBNYXRoLmNlaWwoYmIuaCAqIHNjYWxlKTtcbiAgdmFyIGNhbnZhcyA9IHRoaXMucmVuZGVyZXIubWFrZU9mZnNjcmVlbkNhbnZhcyh3LCBoKTtcbiAgdmFyIGxheWVyID0ge1xuICAgIGlkOiBsYXllcklkUG9vbCA9ICsrbGF5ZXJJZFBvb2wgJSBNQVhfSU5ULFxuICAgIGJiOiBiYixcbiAgICBsZXZlbDogbHZsLFxuICAgIHdpZHRoOiB3LFxuICAgIGhlaWdodDogaCxcbiAgICBjYW52YXM6IGNhbnZhcyxcbiAgICBjb250ZXh0OiBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKSxcbiAgICBlbGVzOiBbXSxcbiAgICBlbGVzUXVldWU6IFtdLFxuICAgIHJlcXM6IDBcbiAgfTtcblxuICAvLyBsb2coJ21ha2UgbGF5ZXIgJXMgd2l0aCB3ICVzIGFuZCBoICVzIGFuZCBsdmwgJXMnLCBsYXllci5pZCwgbGF5ZXIud2lkdGgsIGxheWVyLmhlaWdodCwgbGF5ZXIubGV2ZWwpO1xuXG4gIHZhciBjeHQgPSBsYXllci5jb250ZXh0O1xuICB2YXIgZHggPSAtbGF5ZXIuYmIueDE7XG4gIHZhciBkeSA9IC1sYXllci5iYi55MTtcblxuICAvLyBkbyB0aGUgdHJhbnNmb3JtIG9uIGNyZWF0aW9uIHRvIHNhdmUgY3ljbGVzIChpdCdzIHRoZSBzYW1lIGZvciBhbGwgZWxlcylcbiAgY3h0LnNjYWxlKHNjYWxlLCBzY2FsZSk7XG4gIGN4dC50cmFuc2xhdGUoZHgsIGR5KTtcbiAgcmV0dXJuIGxheWVyO1xufTtcbkxUQ3AuZ2V0TGF5ZXJzID0gZnVuY3Rpb24gKGVsZXMsIHB4UmF0aW8sIGx2bCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciByID0gc2VsZi5yZW5kZXJlcjtcbiAgdmFyIGN5ID0gci5jeTtcbiAgdmFyIHpvb20gPSBjeS56b29tKCk7XG4gIHZhciBmaXJzdEdldCA9IHNlbGYuZmlyc3RHZXQ7XG4gIHNlbGYuZmlyc3RHZXQgPSBmYWxzZTtcblxuICAvLyBsb2coJy0tXFxuZ2V0IGxheWVycyB3aXRoICVzIGVsZXMnLCBlbGVzLmxlbmd0aCk7XG4gIC8vbG9nIGVsZXMubWFwKGZ1bmN0aW9uKGVsZSl7IHJldHVybiBlbGUuaWQoKSB9KSApO1xuXG4gIGlmIChsdmwgPT0gbnVsbCkge1xuICAgIGx2bCA9IE1hdGguY2VpbChsb2cyKHpvb20gKiBweFJhdGlvKSk7XG4gICAgaWYgKGx2bCA8IG1pbkx2bCkge1xuICAgICAgbHZsID0gbWluTHZsO1xuICAgIH0gZWxzZSBpZiAoem9vbSA+PSBtYXhab29tIHx8IGx2bCA+IG1heEx2bCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG4gIHNlbGYudmFsaWRhdGVMYXllcnNFbGVzT3JkZXJpbmcobHZsLCBlbGVzKTtcbiAgdmFyIGxheWVyc0J5THZsID0gc2VsZi5sYXllcnNCeUxldmVsO1xuICB2YXIgc2NhbGUgPSBNYXRoLnBvdygyLCBsdmwpO1xuICB2YXIgbGF5ZXJzID0gbGF5ZXJzQnlMdmxbbHZsXSA9IGxheWVyc0J5THZsW2x2bF0gfHwgW107XG4gIHZhciBiYjtcbiAgdmFyIGx2bENvbXBsZXRlID0gc2VsZi5sZXZlbElzQ29tcGxldGUobHZsLCBlbGVzKTtcbiAgdmFyIHRtcExheWVycztcbiAgdmFyIGNoZWNrVGVtcExldmVscyA9IGZ1bmN0aW9uIGNoZWNrVGVtcExldmVscygpIHtcbiAgICB2YXIgY2FuVXNlQXNUbXBMdmwgPSBmdW5jdGlvbiBjYW5Vc2VBc1RtcEx2bChsKSB7XG4gICAgICBzZWxmLnZhbGlkYXRlTGF5ZXJzRWxlc09yZGVyaW5nKGwsIGVsZXMpO1xuICAgICAgaWYgKHNlbGYubGV2ZWxJc0NvbXBsZXRlKGwsIGVsZXMpKSB7XG4gICAgICAgIHRtcExheWVycyA9IGxheWVyc0J5THZsW2xdO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHZhciBjaGVja0x2bHMgPSBmdW5jdGlvbiBjaGVja0x2bHMoZGlyKSB7XG4gICAgICBpZiAodG1wTGF5ZXJzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGwgPSBsdmwgKyBkaXI7IG1pbkx2bCA8PSBsICYmIGwgPD0gbWF4THZsOyBsICs9IGRpcikge1xuICAgICAgICBpZiAoY2FuVXNlQXNUbXBMdmwobCkpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgY2hlY2tMdmxzKDEpO1xuICAgIGNoZWNrTHZscygtMSk7XG5cbiAgICAvLyByZW1vdmUgdGhlIGludmFsaWQgbGF5ZXJzOyB0aGV5IHdpbGwgYmUgcmVwbGFjZWQgYXMgbmVlZGVkIGxhdGVyIGluIHRoaXMgZnVuY3Rpb25cbiAgICBmb3IgKHZhciBpID0gbGF5ZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgbGF5ZXIgPSBsYXllcnNbaV07XG4gICAgICBpZiAobGF5ZXIuaW52YWxpZCkge1xuICAgICAgICByZW1vdmVGcm9tQXJyYXkobGF5ZXJzLCBsYXllcik7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBpZiAoIWx2bENvbXBsZXRlKSB7XG4gICAgLy8gaWYgdGhlIGN1cnJlbnQgbGV2ZWwgaXMgaW5jb21wbGV0ZSwgdGhlbiB1c2UgdGhlIGNsb3Nlc3QsIGJlc3QgcXVhbGl0eSBsYXllcnNldCB0ZW1wb3JhcmlseVxuICAgIC8vIGFuZCBsYXRlciBxdWV1ZSB0aGUgY3VycmVudCBsYXllcnNldCBzbyB3ZSBjYW4gZ2V0IHRoZSBwcm9wZXIgcXVhbGl0eSBsZXZlbCBzb29uXG5cbiAgICBjaGVja1RlbXBMZXZlbHMoKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBsb2coJ2xldmVsIGNvbXBsZXRlLCB1c2luZyBleGlzdGluZyBsYXllcnNcXG4tLScpO1xuICAgIHJldHVybiBsYXllcnM7XG4gIH1cbiAgdmFyIGdldEJiID0gZnVuY3Rpb24gZ2V0QmIoKSB7XG4gICAgaWYgKCFiYikge1xuICAgICAgYmIgPSBtYWtlQm91bmRpbmdCb3goKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB1cGRhdGVCb3VuZGluZ0JveChiYiwgZWxlc1tpXS5ib3VuZGluZ0JveCgpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJiO1xuICB9O1xuICB2YXIgbWFrZUxheWVyID0gZnVuY3Rpb24gbWFrZUxheWVyKG9wdHMpIHtcbiAgICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgICB2YXIgYWZ0ZXIgPSBvcHRzLmFmdGVyO1xuICAgIGdldEJiKCk7XG4gICAgdmFyIHcgPSBNYXRoLmNlaWwoYmIudyAqIHNjYWxlKTtcbiAgICB2YXIgaCA9IE1hdGguY2VpbChiYi5oICogc2NhbGUpO1xuICAgIGlmICh3ID4gbWF4TGF5ZXJEaW0gfHwgaCA+IG1heExheWVyRGltKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdmFyIGFyZWEgPSB3ICogaDtcbiAgICBpZiAoYXJlYSA+IG1heExheWVyQXJlYSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHZhciBsYXllciA9IHNlbGYubWFrZUxheWVyKGJiLCBsdmwpO1xuICAgIGlmIChhZnRlciAhPSBudWxsKSB7XG4gICAgICB2YXIgaW5kZXggPSBsYXllcnMuaW5kZXhPZihhZnRlcikgKyAxO1xuICAgICAgbGF5ZXJzLnNwbGljZShpbmRleCwgMCwgbGF5ZXIpO1xuICAgIH0gZWxzZSBpZiAob3B0cy5pbnNlcnQgPT09IHVuZGVmaW5lZCB8fCBvcHRzLmluc2VydCkge1xuICAgICAgLy8gbm8gYWZ0ZXIgc3BlY2lmaWVkID0+IGZpcnN0IGxheWVyIG1hZGUgc28gcHV0IGF0IHN0YXJ0XG4gICAgICBsYXllcnMudW5zaGlmdChsYXllcik7XG4gICAgfVxuXG4gICAgLy8gaWYoIHRtcExheWVycyApe1xuICAgIC8vc2VsZi5xdWV1ZUxheWVyKCBsYXllciApO1xuICAgIC8vIH1cblxuICAgIHJldHVybiBsYXllcjtcbiAgfTtcbiAgaWYgKHNlbGYuc2tpcHBpbmcgJiYgIWZpcnN0R2V0KSB7XG4gICAgLy8gbG9nKCdza2lwIGxheWVycycpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gbG9nKCdkbyBsYXllcnMnKTtcblxuICB2YXIgbGF5ZXIgPSBudWxsO1xuICB2YXIgbWF4RWxlc1BlckxheWVyID0gZWxlcy5sZW5ndGggLyBkZWZOdW1MYXllcnM7XG4gIHZhciBhbGxvd0xhenlRdWV1ZWluZyA9ICFmaXJzdEdldDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgdmFyIHJzID0gZWxlLl9wcml2YXRlLnJzY3JhdGNoO1xuICAgIHZhciBjYWNoZXMgPSBycy5pbWdMYXllckNhY2hlcyA9IHJzLmltZ0xheWVyQ2FjaGVzIHx8IHt9O1xuXG4gICAgLy8gbG9nKCdsb29rIGF0IGVsZScsIGVsZS5pZCgpKTtcblxuICAgIHZhciBleGlzdGluZ0xheWVyID0gY2FjaGVzW2x2bF07XG4gICAgaWYgKGV4aXN0aW5nTGF5ZXIpIHtcbiAgICAgIC8vIHJldXNlIGxheWVyIGZvciBsYXRlciBlbGVzXG4gICAgICAvLyBsb2coJ3JldXNlIGxheWVyIGZvcicsIGVsZS5pZCgpKTtcbiAgICAgIGxheWVyID0gZXhpc3RpbmdMYXllcjtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoIWxheWVyIHx8IGxheWVyLmVsZXMubGVuZ3RoID49IG1heEVsZXNQZXJMYXllciB8fCAhYm91bmRpbmdCb3hJbkJvdW5kaW5nQm94KGxheWVyLmJiLCBlbGUuYm91bmRpbmdCb3goKSkpIHtcbiAgICAgIC8vIGxvZygnbWFrZSBuZXcgbGF5ZXIgZm9yIGVsZSAlcycsIGVsZS5pZCgpKTtcblxuICAgICAgbGF5ZXIgPSBtYWtlTGF5ZXIoe1xuICAgICAgICBpbnNlcnQ6IHRydWUsXG4gICAgICAgIGFmdGVyOiBsYXllclxuICAgICAgfSk7XG5cbiAgICAgIC8vIGlmIG5vdyBsYXllciBjYW4gYmUgYnVpbHQgdGhlbiB3ZSBjYW4ndCB1c2UgbGF5ZXJzIGF0IHRoaXMgbGV2ZWxcbiAgICAgIGlmICghbGF5ZXIpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIGxvZygnbmV3IGxheWVyIHdpdGggaWQgJXMnLCBsYXllci5pZCk7XG4gICAgfVxuICAgIGlmICh0bXBMYXllcnMgfHwgYWxsb3dMYXp5UXVldWVpbmcpIHtcbiAgICAgIC8vIGxvZygncXVldWUgZWxlICVzIGluIGxheWVyICVzJywgZWxlLmlkKCksIGxheWVyLmlkKTtcbiAgICAgIHNlbGYucXVldWVMYXllcihsYXllciwgZWxlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gbG9nKCdkcmF3IGVsZSAlcyBpbiBsYXllciAlcycsIGVsZS5pZCgpLCBsYXllci5pZCk7XG4gICAgICBzZWxmLmRyYXdFbGVJbkxheWVyKGxheWVyLCBlbGUsIGx2bCwgcHhSYXRpbyk7XG4gICAgfVxuICAgIGxheWVyLmVsZXMucHVzaChlbGUpO1xuICAgIGNhY2hlc1tsdmxdID0gbGF5ZXI7XG4gIH1cblxuICAvLyBsb2coJy0tJyk7XG5cbiAgaWYgKHRtcExheWVycykge1xuICAgIC8vIHRoZW4gd2Ugb25seSBxdWV1ZWQgdGhlIGN1cnJlbnQgbGF5ZXJzZXQgYW5kIGNhbid0IGRyYXcgaXQgeWV0XG4gICAgcmV0dXJuIHRtcExheWVycztcbiAgfVxuICBpZiAoYWxsb3dMYXp5UXVldWVpbmcpIHtcbiAgICAvLyBsb2coJ2xhenkgcXVldWUgbGV2ZWwnLCBsdmwpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBsYXllcnM7XG59O1xuXG4vLyBhIGxheWVyIG1heSB3YW50IHRvIHVzZSBhbiBlbGUgY2FjaGUgb2YgYSBoaWdoZXIgbGV2ZWwgdG8gYXZvaWQgYmx1cnJpbmVzc1xuLy8gc28gdGhlIGxheWVyIGxldmVsIG1pZ2h0IG5vdCBlcXVhbCB0aGUgZWxlIGxldmVsXG5MVENwLmdldEVsZUxldmVsRm9yTGF5ZXJMZXZlbCA9IGZ1bmN0aW9uIChsdmwsIHB4UmF0aW8pIHtcbiAgcmV0dXJuIGx2bDtcbn07XG5MVENwLmRyYXdFbGVJbkxheWVyID0gZnVuY3Rpb24gKGxheWVyLCBlbGUsIGx2bCwgcHhSYXRpbykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciByID0gdGhpcy5yZW5kZXJlcjtcbiAgdmFyIGNvbnRleHQgPSBsYXllci5jb250ZXh0O1xuICB2YXIgYmIgPSBlbGUuYm91bmRpbmdCb3goKTtcbiAgaWYgKGJiLncgPT09IDAgfHwgYmIuaCA9PT0gMCB8fCAhZWxlLnZpc2libGUoKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBsdmwgPSBzZWxmLmdldEVsZUxldmVsRm9yTGF5ZXJMZXZlbChsdmwsIHB4UmF0aW8pO1xuICB7XG4gICAgci5zZXRJbWdTbW9vdGhpbmcoY29udGV4dCwgZmFsc2UpO1xuICB9XG4gIHtcbiAgICByLmRyYXdDYWNoZWRFbGVtZW50KGNvbnRleHQsIGVsZSwgbnVsbCwgbnVsbCwgbHZsLCB1c2VIaWdoUXVhbGl0eUVsZVR4clJlcXMpO1xuICB9XG4gIHtcbiAgICByLnNldEltZ1Ntb290aGluZyhjb250ZXh0LCB0cnVlKTtcbiAgfVxufTtcbkxUQ3AubGV2ZWxJc0NvbXBsZXRlID0gZnVuY3Rpb24gKGx2bCwgZWxlcykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBsYXllcnMgPSBzZWxmLmxheWVyc0J5TGV2ZWxbbHZsXTtcbiAgaWYgKCFsYXllcnMgfHwgbGF5ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgbnVtRWxlc0luTGF5ZXJzID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXllcnMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbGF5ZXIgPSBsYXllcnNbaV07XG5cbiAgICAvLyBpZiB0aGVyZSBhcmUgYW55IGVsZXMgbmVlZGVkIHRvIGJlIGRyYXduIHlldCwgdGhlIGxldmVsIGlzIG5vdCBjb21wbGV0ZVxuICAgIGlmIChsYXllci5yZXFzID4gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIGlmIHRoZSBsYXllciBpcyBpbnZhbGlkLCB0aGUgbGV2ZWwgaXMgbm90IGNvbXBsZXRlXG4gICAgaWYgKGxheWVyLmludmFsaWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgbnVtRWxlc0luTGF5ZXJzICs9IGxheWVyLmVsZXMubGVuZ3RoO1xuICB9XG5cbiAgLy8gd2Ugc2hvdWxkIGhhdmUgZXhhY3RseSB0aGUgbnVtYmVyIG9mIGVsZXMgcGFzc2VkIGluIHRvIGJlIGNvbXBsZXRlXG4gIGlmIChudW1FbGVzSW5MYXllcnMgIT09IGVsZXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufTtcbkxUQ3AudmFsaWRhdGVMYXllcnNFbGVzT3JkZXJpbmcgPSBmdW5jdGlvbiAobHZsLCBlbGVzKSB7XG4gIHZhciBsYXllcnMgPSB0aGlzLmxheWVyc0J5TGV2ZWxbbHZsXTtcbiAgaWYgKCFsYXllcnMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBpZiBpbiBhIGxheWVyIHRoZSBlbGVzIGFyZSBub3QgaW4gdGhlIHNhbWUgb3JkZXIsIHRoZW4gdGhlIGxheWVyIGlzIGludmFsaWRcbiAgLy8gKGkuZS4gdGhlcmUgaXMgYW4gZWxlIGluIGJldHdlZW4gdGhlIGVsZXMgaW4gdGhlIGxheWVyKVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGF5ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGxheWVyID0gbGF5ZXJzW2ldO1xuICAgIHZhciBvZmZzZXQgPSAtMTtcblxuICAgIC8vIGZpbmQgdGhlIG9mZnNldFxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgZWxlcy5sZW5ndGg7IGorKykge1xuICAgICAgaWYgKGxheWVyLmVsZXNbMF0gPT09IGVsZXNbal0pIHtcbiAgICAgICAgb2Zmc2V0ID0gajtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChvZmZzZXQgPCAwKSB7XG4gICAgICAvLyB0aGVuIHRoZSBsYXllciBoYXMgbm9uZXhpc3RlbnQgZWxlbWVudHMgYW5kIGlzIGludmFsaWRcbiAgICAgIHRoaXMuaW52YWxpZGF0ZUxheWVyKGxheWVyKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIHRoZSBlbGVzIGluIHRoZSBsYXllciBtdXN0IGJlIGluIHRoZSBzYW1lIGNvbnRpbnVvdXMgb3JkZXIsIGVsc2UgdGhlIGxheWVyIGlzIGludmFsaWRcblxuICAgIHZhciBvID0gb2Zmc2V0O1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgbGF5ZXIuZWxlcy5sZW5ndGg7IGorKykge1xuICAgICAgaWYgKGxheWVyLmVsZXNbal0gIT09IGVsZXNbbyArIGpdKSB7XG4gICAgICAgIC8vIGxvZygnaW52YWxpZGF0ZSBiYXNlZCBvbiBvcmRlcmluZycsIGxheWVyLmlkKTtcblxuICAgICAgICB0aGlzLmludmFsaWRhdGVMYXllcihsYXllcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcbkxUQ3AudXBkYXRlRWxlbWVudHNJbkxheWVycyA9IGZ1bmN0aW9uIChlbGVzLCB1cGRhdGUpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgaXNFbGVzID0gZWxlbWVudChlbGVzWzBdKTtcblxuICAvLyBjb2xsZWN0IHVkcGF0ZWQgZWxlbWVudHMgKGNhc2NhZGVkIGZyb20gdGhlIGxheWVycykgYW5kIHVwZGF0ZSBlYWNoXG4gIC8vIGxheWVyIGl0c2VsZiBhbG9uZyB0aGUgd2F5XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciByZXEgPSBpc0VsZXMgPyBudWxsIDogZWxlc1tpXTtcbiAgICB2YXIgZWxlID0gaXNFbGVzID8gZWxlc1tpXSA6IGVsZXNbaV0uZWxlO1xuICAgIHZhciBycyA9IGVsZS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgICB2YXIgY2FjaGVzID0gcnMuaW1nTGF5ZXJDYWNoZXMgPSBycy5pbWdMYXllckNhY2hlcyB8fCB7fTtcbiAgICBmb3IgKHZhciBsID0gbWluTHZsOyBsIDw9IG1heEx2bDsgbCsrKSB7XG4gICAgICB2YXIgbGF5ZXIgPSBjYWNoZXNbbF07XG4gICAgICBpZiAoIWxheWVyKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBpZiB1cGRhdGUgaXMgYSByZXF1ZXN0IGZyb20gdGhlIGVsZSBjYWNoZSwgdGhlbiBpdCBhZmZlY3RzIG9ubHlcbiAgICAgIC8vIHRoZSBtYXRjaGluZyBsZXZlbFxuICAgICAgaWYgKHJlcSAmJiBzZWxmLmdldEVsZUxldmVsRm9yTGF5ZXJMZXZlbChsYXllci5sZXZlbCkgIT09IHJlcS5sZXZlbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHVwZGF0ZShsYXllciwgZWxlLCByZXEpO1xuICAgIH1cbiAgfVxufTtcbkxUQ3AuaGF2ZUxheWVycyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgaGF2ZUxheWVycyA9IGZhbHNlO1xuICBmb3IgKHZhciBsID0gbWluTHZsOyBsIDw9IG1heEx2bDsgbCsrKSB7XG4gICAgdmFyIGxheWVycyA9IHNlbGYubGF5ZXJzQnlMZXZlbFtsXTtcbiAgICBpZiAobGF5ZXJzICYmIGxheWVycy5sZW5ndGggPiAwKSB7XG4gICAgICBoYXZlTGF5ZXJzID0gdHJ1ZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaGF2ZUxheWVycztcbn07XG5MVENwLmludmFsaWRhdGVFbGVtZW50cyA9IGZ1bmN0aW9uIChlbGVzKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgaWYgKGVsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHNlbGYubGFzdEludmFsaWRhdGlvblRpbWUgPSBwZXJmb3JtYW5jZU5vdygpO1xuXG4gIC8vIGxvZygndXBkYXRlIGludmFsaWRhdGUgbGF5ZXIgdGltZSBmcm9tIGVsZXMnKTtcblxuICBpZiAoZWxlcy5sZW5ndGggPT09IDAgfHwgIXNlbGYuaGF2ZUxheWVycygpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHNlbGYudXBkYXRlRWxlbWVudHNJbkxheWVycyhlbGVzLCBmdW5jdGlvbiBpbnZhbEFzc29jTGF5ZXJzKGxheWVyLCBlbGUsIHJlcSkge1xuICAgIHNlbGYuaW52YWxpZGF0ZUxheWVyKGxheWVyKTtcbiAgfSk7XG59O1xuTFRDcC5pbnZhbGlkYXRlTGF5ZXIgPSBmdW5jdGlvbiAobGF5ZXIpIHtcbiAgLy8gbG9nKCd1cGRhdGUgaW52YWxpZGF0ZSBsYXllciB0aW1lJyk7XG5cbiAgdGhpcy5sYXN0SW52YWxpZGF0aW9uVGltZSA9IHBlcmZvcm1hbmNlTm93KCk7XG4gIGlmIChsYXllci5pbnZhbGlkKSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIHNhdmUgY3ljbGVzXG5cbiAgdmFyIGx2bCA9IGxheWVyLmxldmVsO1xuICB2YXIgZWxlcyA9IGxheWVyLmVsZXM7XG4gIHZhciBsYXllcnMgPSB0aGlzLmxheWVyc0J5TGV2ZWxbbHZsXTtcblxuICAvLyBsb2coJ2ludmFsaWRhdGUgbGF5ZXInLCBsYXllci5pZCApO1xuXG4gIHJlbW92ZUZyb21BcnJheShsYXllcnMsIGxheWVyKTtcbiAgLy8gbGF5ZXIuZWxlcyA9IFtdO1xuXG4gIGxheWVyLmVsZXNRdWV1ZSA9IFtdO1xuICBsYXllci5pbnZhbGlkID0gdHJ1ZTtcbiAgaWYgKGxheWVyLnJlcGxhY2VtZW50KSB7XG4gICAgbGF5ZXIucmVwbGFjZW1lbnQuaW52YWxpZCA9IHRydWU7XG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGNhY2hlcyA9IGVsZXNbaV0uX3ByaXZhdGUucnNjcmF0Y2guaW1nTGF5ZXJDYWNoZXM7XG4gICAgaWYgKGNhY2hlcykge1xuICAgICAgY2FjaGVzW2x2bF0gPSBudWxsO1xuICAgIH1cbiAgfVxufTtcbkxUQ3AucmVmaW5lRWxlbWVudFRleHR1cmVzID0gZnVuY3Rpb24gKGVsZXMpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gIC8vIGxvZygncmVmaW5lJywgZWxlcy5sZW5ndGgpO1xuXG4gIHNlbGYudXBkYXRlRWxlbWVudHNJbkxheWVycyhlbGVzLCBmdW5jdGlvbiByZWZpbmVFYWNoRWxlKGxheWVyLCBlbGUsIHJlcSkge1xuICAgIHZhciByTHlyID0gbGF5ZXIucmVwbGFjZW1lbnQ7XG4gICAgaWYgKCFyTHlyKSB7XG4gICAgICByTHlyID0gbGF5ZXIucmVwbGFjZW1lbnQgPSBzZWxmLm1ha2VMYXllcihsYXllci5iYiwgbGF5ZXIubGV2ZWwpO1xuICAgICAgckx5ci5yZXBsYWNlcyA9IGxheWVyO1xuICAgICAgckx5ci5lbGVzID0gbGF5ZXIuZWxlcztcblxuICAgICAgLy8gbG9nKCdtYWtlIHJlcGxhY2VtZW50IGxheWVyICVzIGZvciAlcyB3aXRoIGxldmVsICVzJywgckx5ci5pZCwgbGF5ZXIuaWQsIHJMeXIubGV2ZWwpO1xuICAgIH1cbiAgICBpZiAoIXJMeXIucmVxcykge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByTHlyLmVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgc2VsZi5xdWV1ZUxheWVyKHJMeXIsIHJMeXIuZWxlc1tpXSk7XG4gICAgICB9XG5cbiAgICAgIC8vIGxvZygncXVldWUgcmVwbGFjZW1lbnQgbGF5ZXIgcmVmaW5lbWVudCcsIHJMeXIuaWQpO1xuICAgIH1cbiAgfSk7XG59O1xuTFRDcC5lbnF1ZXVlRWxlbWVudFJlZmluZW1lbnQgPSBmdW5jdGlvbiAoZWxlKSB7XG4gIHRoaXMuZWxlVHhyRGVxcy5tZXJnZShlbGUpO1xuICB0aGlzLnNjaGVkdWxlRWxlbWVudFJlZmluZW1lbnQoKTtcbn07XG5MVENwLnF1ZXVlTGF5ZXIgPSBmdW5jdGlvbiAobGF5ZXIsIGVsZSkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBxID0gc2VsZi5sYXllcnNRdWV1ZTtcbiAgdmFyIGVsZXNRID0gbGF5ZXIuZWxlc1F1ZXVlO1xuICB2YXIgaGFzSWQgPSBlbGVzUS5oYXNJZCA9IGVsZXNRLmhhc0lkIHx8IHt9O1xuXG4gIC8vIGlmIGEgbGF5ZXIgaXMgZ29pbmcgdG8gYmUgcmVwbGFjZWQsIHF1ZXVpbmcgaXMgYSB3YXN0ZSBvZiB0aW1lXG4gIGlmIChsYXllci5yZXBsYWNlbWVudCkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoZWxlKSB7XG4gICAgaWYgKGhhc0lkW2VsZS5pZCgpXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbGVzUS5wdXNoKGVsZSk7XG4gICAgaGFzSWRbZWxlLmlkKCldID0gdHJ1ZTtcbiAgfVxuICBpZiAobGF5ZXIucmVxcykge1xuICAgIGxheWVyLnJlcXMrKztcbiAgICBxLnVwZGF0ZUl0ZW0obGF5ZXIpO1xuICB9IGVsc2Uge1xuICAgIGxheWVyLnJlcXMgPSAxO1xuICAgIHEucHVzaChsYXllcik7XG4gIH1cbn07XG5MVENwLmRlcXVldWUgPSBmdW5jdGlvbiAocHhSYXRpbykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBxID0gc2VsZi5sYXllcnNRdWV1ZTtcbiAgdmFyIGRlcWQgPSBbXTtcbiAgdmFyIGVsZURlcXMgPSAwO1xuICB3aGlsZSAoZWxlRGVxcyA8IG1heERlcVNpemUpIHtcbiAgICBpZiAocS5zaXplKCkgPT09IDApIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB2YXIgbGF5ZXIgPSBxLnBlZWsoKTtcblxuICAgIC8vIGlmIGEgbGF5ZXIgaGFzIGJlZW4gb3Igd2lsbCBiZSByZXBsYWNlZCwgdGhlbiBkb24ndCB3YXN0ZSB0aW1lIHdpdGggaXRcbiAgICBpZiAobGF5ZXIucmVwbGFjZW1lbnQpIHtcbiAgICAgIC8vIGxvZygnbGF5ZXIgJXMgaW4gcXVldWUgc2tpcHBlZCBiL2MgaXQgYWxyZWFkeSBoYXMgYSByZXBsYWNlbWVudCcsIGxheWVyLmlkKTtcbiAgICAgIHEucG9wKCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBpZiB0aGlzIGlzIGEgcmVwbGFjZW1lbnQgbGF5ZXIgdGhhdCBoYXMgYmVlbiBzdXBlcmNlZGVkLCB0aGVuIGZvcmdldCBpdFxuICAgIGlmIChsYXllci5yZXBsYWNlcyAmJiBsYXllciAhPT0gbGF5ZXIucmVwbGFjZXMucmVwbGFjZW1lbnQpIHtcbiAgICAgIC8vIGxvZygnbGF5ZXIgaXMgbm8gbG9uZ2VyIHRoZSBtb3N0IHVwdG9kYXRlIHJlcGxhY2VtZW50OyBkZXF1ZXVlZCcsIGxheWVyLmlkKVxuICAgICAgcS5wb3AoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAobGF5ZXIuaW52YWxpZCkge1xuICAgICAgLy8gbG9nKCdyZXBsYWNlbWVudCBsYXllciAlcyBpcyBpbnZhbGlkOyBkZXF1ZXVlZCcsIGxheWVyLmlkKTtcbiAgICAgIHEucG9wKCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdmFyIGVsZSA9IGxheWVyLmVsZXNRdWV1ZS5zaGlmdCgpO1xuICAgIGlmIChlbGUpIHtcbiAgICAgIC8vIGxvZygnZGVxdWV1ZSBsYXllciAlcycsIGxheWVyLmlkKTtcblxuICAgICAgc2VsZi5kcmF3RWxlSW5MYXllcihsYXllciwgZWxlLCBsYXllci5sZXZlbCwgcHhSYXRpbyk7XG4gICAgICBlbGVEZXFzKys7XG4gICAgfVxuICAgIGlmIChkZXFkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gd2UgbmVlZCBvbmx5IG9uZSBlbnRyeSBpbiBkZXFkIHRvIHF1ZXVlIHJlZHJhd2luZyBldGNcbiAgICAgIGRlcWQucHVzaCh0cnVlKTtcbiAgICB9XG5cbiAgICAvLyBpZiB0aGUgbGF5ZXIgaGFzIGFsbCBpdHMgZWxlcyBkb25lLCB0aGVuIHJlbW92ZSBmcm9tIHRoZSBxdWV1ZVxuICAgIGlmIChsYXllci5lbGVzUXVldWUubGVuZ3RoID09PSAwKSB7XG4gICAgICBxLnBvcCgpO1xuICAgICAgbGF5ZXIucmVxcyA9IDA7XG5cbiAgICAgIC8vIGxvZygnZGVxdWV1ZSBvZiBsYXllciAlcyBjb21wbGV0ZScsIGxheWVyLmlkKTtcblxuICAgICAgLy8gd2hlbiBhIHJlcGxhY2VtZW50IGxheWVyIGlzIGRlcXVldWVkLCBpdCByZXBsYWNlcyB0aGUgb2xkIGxheWVyIGluIHRoZSBsZXZlbFxuICAgICAgaWYgKGxheWVyLnJlcGxhY2VzKSB7XG4gICAgICAgIHNlbGYuYXBwbHlMYXllclJlcGxhY2VtZW50KGxheWVyKTtcbiAgICAgIH1cbiAgICAgIHNlbGYucmVxdWVzdFJlZHJhdygpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGVxZDtcbn07XG5MVENwLmFwcGx5TGF5ZXJSZXBsYWNlbWVudCA9IGZ1bmN0aW9uIChsYXllcikge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBsYXllcnNJbkxldmVsID0gc2VsZi5sYXllcnNCeUxldmVsW2xheWVyLmxldmVsXTtcbiAgdmFyIHJlcGxhY2VkID0gbGF5ZXIucmVwbGFjZXM7XG4gIHZhciBpbmRleCA9IGxheWVyc0luTGV2ZWwuaW5kZXhPZihyZXBsYWNlZCk7XG5cbiAgLy8gaWYgdGhlIHJlcGxhY2VkIGxheWVyIGlzIG5vdCBpbiB0aGUgYWN0aXZlIGxpc3QgZm9yIHRoZSBsZXZlbCwgdGhlbiByZXBsYWNpbmdcbiAgLy8gcmVmcyB3b3VsZCBiZSBhIG1pc3Rha2UgKGkuZS4gb3ZlcndyaXRpbmcgdGhlIHRydWUgYWN0aXZlIGxheWVyKVxuICBpZiAoaW5kZXggPCAwIHx8IHJlcGxhY2VkLmludmFsaWQpIHtcbiAgICAvLyBsb2coJ3JlcGxhY2VtZW50IGxheWVyIHdvdWxkIGhhdmUgbm8gZWZmZWN0JywgbGF5ZXIuaWQpO1xuICAgIHJldHVybjtcbiAgfVxuICBsYXllcnNJbkxldmVsW2luZGV4XSA9IGxheWVyOyAvLyByZXBsYWNlIGxldmVsIHJlZlxuXG4gIC8vIHJlcGxhY2UgcmVmcyBpbiBlbGVzXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGF5ZXIuZWxlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBfcCA9IGxheWVyLmVsZXNbaV0uX3ByaXZhdGU7XG4gICAgdmFyIGNhY2hlID0gX3AuaW1nTGF5ZXJDYWNoZXMgPSBfcC5pbWdMYXllckNhY2hlcyB8fCB7fTtcbiAgICBpZiAoY2FjaGUpIHtcbiAgICAgIGNhY2hlW2xheWVyLmxldmVsXSA9IGxheWVyO1xuICAgIH1cbiAgfVxuXG4gIC8vIGxvZygnYXBwbHkgcmVwbGFjZW1lbnQgbGF5ZXIgJXMgb3ZlciAlcycsIGxheWVyLmlkLCByZXBsYWNlZC5pZCk7XG5cbiAgc2VsZi5yZXF1ZXN0UmVkcmF3KCk7XG59O1xuTFRDcC5yZXF1ZXN0UmVkcmF3ID0gZGVib3VuY2UoZnVuY3Rpb24gKCkge1xuICB2YXIgciA9IHRoaXMucmVuZGVyZXI7XG4gIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICByLnJlZHJhd0hpbnQoJ2RyYWcnLCB0cnVlKTtcbiAgci5yZWRyYXcoKTtcbn0sIDEwMCk7XG5MVENwLnNldHVwRGVxdWV1ZWluZyA9IGRlZnMuc2V0dXBEZXF1ZXVlaW5nKHtcbiAgZGVxUmVkcmF3VGhyZXNob2xkOiBkZXFSZWRyYXdUaHJlc2hvbGQsXG4gIGRlcUNvc3Q6IGRlcUNvc3QsXG4gIGRlcUF2Z0Nvc3Q6IGRlcUF2Z0Nvc3QsXG4gIGRlcU5vRHJhd0Nvc3Q6IGRlcU5vRHJhd0Nvc3QsXG4gIGRlcUZhc3RDb3N0OiBkZXFGYXN0Q29zdCxcbiAgZGVxOiBmdW5jdGlvbiBkZXEoc2VsZiwgcHhSYXRpbykge1xuICAgIHJldHVybiBzZWxmLmRlcXVldWUocHhSYXRpbyk7XG4gIH0sXG4gIG9uRGVxZDogbm9vcCQxLFxuICBzaG91bGRSZWRyYXc6IHRydWVpZnksXG4gIHByaW9yaXR5OiBmdW5jdGlvbiBwcmlvcml0eShzZWxmKSB7XG4gICAgcmV0dXJuIHNlbGYucmVuZGVyZXIuYmVmb3JlUmVuZGVyUHJpb3JpdGllcy5seXJUeHJEZXE7XG4gIH1cbn0pO1xuXG52YXIgQ1JwJGIgPSB7fTtcbnZhciBpbXBsO1xuZnVuY3Rpb24gcG9seWdvbihjb250ZXh0LCBwb2ludHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcHQgPSBwb2ludHNbaV07XG4gICAgY29udGV4dC5saW5lVG8ocHQueCwgcHQueSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHRyaWFuZ2xlQmFja2N1cnZlKGNvbnRleHQsIHBvaW50cywgY29udHJvbFBvaW50KSB7XG4gIHZhciBmaXJzdFB0O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBwdCA9IHBvaW50c1tpXTtcbiAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgZmlyc3RQdCA9IHB0O1xuICAgIH1cbiAgICBjb250ZXh0LmxpbmVUbyhwdC54LCBwdC55KTtcbiAgfVxuICBjb250ZXh0LnF1YWRyYXRpY0N1cnZlVG8oY29udHJvbFBvaW50LngsIGNvbnRyb2xQb2ludC55LCBmaXJzdFB0LngsIGZpcnN0UHQueSk7XG59XG5mdW5jdGlvbiB0cmlhbmdsZVRlZShjb250ZXh0LCB0cmlhbmdsZVBvaW50cywgdGVlUG9pbnRzKSB7XG4gIGlmIChjb250ZXh0LmJlZ2luUGF0aCkge1xuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gIH1cbiAgdmFyIHRyaVB0cyA9IHRyaWFuZ2xlUG9pbnRzO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHRyaVB0cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBwdCA9IHRyaVB0c1tpXTtcbiAgICBjb250ZXh0LmxpbmVUbyhwdC54LCBwdC55KTtcbiAgfVxuICB2YXIgdGVlUHRzID0gdGVlUG9pbnRzO1xuICB2YXIgZmlyc3RUZWVQdCA9IHRlZVBvaW50c1swXTtcbiAgY29udGV4dC5tb3ZlVG8oZmlyc3RUZWVQdC54LCBmaXJzdFRlZVB0LnkpO1xuICBmb3IgKHZhciBpID0gMTsgaSA8IHRlZVB0cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBwdCA9IHRlZVB0c1tpXTtcbiAgICBjb250ZXh0LmxpbmVUbyhwdC54LCBwdC55KTtcbiAgfVxuICBpZiAoY29udGV4dC5jbG9zZVBhdGgpIHtcbiAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICB9XG59XG5mdW5jdGlvbiBjaXJjbGVUcmlhbmdsZShjb250ZXh0LCB0cmlhbmdsZVBvaW50cywgcngsIHJ5LCByKSB7XG4gIGlmIChjb250ZXh0LmJlZ2luUGF0aCkge1xuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gIH1cbiAgY29udGV4dC5hcmMocngsIHJ5LCByLCAwLCBNYXRoLlBJICogMiwgZmFsc2UpO1xuICB2YXIgdHJpUHRzID0gdHJpYW5nbGVQb2ludHM7XG4gIHZhciBmaXJzdFRyUHQgPSB0cmlQdHNbMF07XG4gIGNvbnRleHQubW92ZVRvKGZpcnN0VHJQdC54LCBmaXJzdFRyUHQueSk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdHJpUHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHB0ID0gdHJpUHRzW2ldO1xuICAgIGNvbnRleHQubGluZVRvKHB0LngsIHB0LnkpO1xuICB9XG4gIGlmIChjb250ZXh0LmNsb3NlUGF0aCkge1xuICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGNpcmNsZSQxKGNvbnRleHQsIHJ4LCByeSwgcikge1xuICBjb250ZXh0LmFyYyhyeCwgcnksIHIsIDAsIE1hdGguUEkgKiAyLCBmYWxzZSk7XG59XG5DUnAkYi5hcnJvd1NoYXBlSW1wbCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIHJldHVybiAoaW1wbCB8fCAoaW1wbCA9IHtcbiAgICAncG9seWdvbic6IHBvbHlnb24sXG4gICAgJ3RyaWFuZ2xlLWJhY2tjdXJ2ZSc6IHRyaWFuZ2xlQmFja2N1cnZlLFxuICAgICd0cmlhbmdsZS10ZWUnOiB0cmlhbmdsZVRlZSxcbiAgICAnY2lyY2xlLXRyaWFuZ2xlJzogY2lyY2xlVHJpYW5nbGUsXG4gICAgJ3RyaWFuZ2xlLWNyb3NzJzogdHJpYW5nbGVUZWUsXG4gICAgJ2NpcmNsZSc6IGNpcmNsZSQxXG4gIH0pKVtuYW1lXTtcbn07XG5cbnZhciBDUnAkYSA9IHt9O1xuQ1JwJGEuZHJhd0VsZW1lbnQgPSBmdW5jdGlvbiAoY29udGV4dCwgZWxlLCBzaGlmdFRvT3JpZ2luV2l0aEJiLCBzaG93TGFiZWwsIHNob3dPdmVybGF5LCBzaG93T3BhY2l0eSkge1xuICB2YXIgciA9IHRoaXM7XG4gIGlmIChlbGUuaXNOb2RlKCkpIHtcbiAgICByLmRyYXdOb2RlKGNvbnRleHQsIGVsZSwgc2hpZnRUb09yaWdpbldpdGhCYiwgc2hvd0xhYmVsLCBzaG93T3ZlcmxheSwgc2hvd09wYWNpdHkpO1xuICB9IGVsc2Uge1xuICAgIHIuZHJhd0VkZ2UoY29udGV4dCwgZWxlLCBzaGlmdFRvT3JpZ2luV2l0aEJiLCBzaG93TGFiZWwsIHNob3dPdmVybGF5LCBzaG93T3BhY2l0eSk7XG4gIH1cbn07XG5DUnAkYS5kcmF3RWxlbWVudE92ZXJsYXkgPSBmdW5jdGlvbiAoY29udGV4dCwgZWxlKSB7XG4gIHZhciByID0gdGhpcztcbiAgaWYgKGVsZS5pc05vZGUoKSkge1xuICAgIHIuZHJhd05vZGVPdmVybGF5KGNvbnRleHQsIGVsZSk7XG4gIH0gZWxzZSB7XG4gICAgci5kcmF3RWRnZU92ZXJsYXkoY29udGV4dCwgZWxlKTtcbiAgfVxufTtcbkNScCRhLmRyYXdFbGVtZW50VW5kZXJsYXkgPSBmdW5jdGlvbiAoY29udGV4dCwgZWxlKSB7XG4gIHZhciByID0gdGhpcztcbiAgaWYgKGVsZS5pc05vZGUoKSkge1xuICAgIHIuZHJhd05vZGVVbmRlcmxheShjb250ZXh0LCBlbGUpO1xuICB9IGVsc2Uge1xuICAgIHIuZHJhd0VkZ2VVbmRlcmxheShjb250ZXh0LCBlbGUpO1xuICB9XG59O1xuQ1JwJGEuZHJhd0NhY2hlZEVsZW1lbnRQb3J0aW9uID0gZnVuY3Rpb24gKGNvbnRleHQsIGVsZSwgZWxlVHhyQ2FjaGUsIHB4UmF0aW8sIGx2bCwgcmVhc29uLCBnZXRSb3RhdGlvbiwgZ2V0T3BhY2l0eSkge1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBiYiA9IGVsZVR4ckNhY2hlLmdldEJvdW5kaW5nQm94KGVsZSk7XG4gIGlmIChiYi53ID09PSAwIHx8IGJiLmggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH0gLy8gaWdub3JlIHplcm8gc2l6ZSBjYXNlXG5cbiAgdmFyIGVsZUNhY2hlID0gZWxlVHhyQ2FjaGUuZ2V0RWxlbWVudChlbGUsIGJiLCBweFJhdGlvLCBsdmwsIHJlYXNvbik7XG4gIGlmIChlbGVDYWNoZSAhPSBudWxsKSB7XG4gICAgdmFyIG9wYWNpdHkgPSBnZXRPcGFjaXR5KHIsIGVsZSk7XG4gICAgaWYgKG9wYWNpdHkgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRoZXRhID0gZ2V0Um90YXRpb24ociwgZWxlKTtcbiAgICB2YXIgeDEgPSBiYi54MSxcbiAgICAgIHkxID0gYmIueTEsXG4gICAgICB3ID0gYmIudyxcbiAgICAgIGggPSBiYi5oO1xuICAgIHZhciB4LCB5LCBzeCwgc3ksIHNtb290aDtcbiAgICBpZiAodGhldGEgIT09IDApIHtcbiAgICAgIHZhciByb3RQdCA9IGVsZVR4ckNhY2hlLmdldFJvdGF0aW9uUG9pbnQoZWxlKTtcbiAgICAgIHN4ID0gcm90UHQueDtcbiAgICAgIHN5ID0gcm90UHQueTtcbiAgICAgIGNvbnRleHQudHJhbnNsYXRlKHN4LCBzeSk7XG4gICAgICBjb250ZXh0LnJvdGF0ZSh0aGV0YSk7XG4gICAgICBzbW9vdGggPSByLmdldEltZ1Ntb290aGluZyhjb250ZXh0KTtcbiAgICAgIGlmICghc21vb3RoKSB7XG4gICAgICAgIHIuc2V0SW1nU21vb3RoaW5nKGNvbnRleHQsIHRydWUpO1xuICAgICAgfVxuICAgICAgdmFyIG9mZiA9IGVsZVR4ckNhY2hlLmdldFJvdGF0aW9uT2Zmc2V0KGVsZSk7XG4gICAgICB4ID0gb2ZmLng7XG4gICAgICB5ID0gb2ZmLnk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHggPSB4MTtcbiAgICAgIHkgPSB5MTtcbiAgICB9XG4gICAgdmFyIG9sZEdsb2JhbEFscGhhO1xuICAgIGlmIChvcGFjaXR5ICE9PSAxKSB7XG4gICAgICBvbGRHbG9iYWxBbHBoYSA9IGNvbnRleHQuZ2xvYmFsQWxwaGE7XG4gICAgICBjb250ZXh0Lmdsb2JhbEFscGhhID0gb2xkR2xvYmFsQWxwaGEgKiBvcGFjaXR5O1xuICAgIH1cbiAgICBjb250ZXh0LmRyYXdJbWFnZShlbGVDYWNoZS50ZXh0dXJlLmNhbnZhcywgZWxlQ2FjaGUueCwgMCwgZWxlQ2FjaGUud2lkdGgsIGVsZUNhY2hlLmhlaWdodCwgeCwgeSwgdywgaCk7XG4gICAgaWYgKG9wYWNpdHkgIT09IDEpIHtcbiAgICAgIGNvbnRleHQuZ2xvYmFsQWxwaGEgPSBvbGRHbG9iYWxBbHBoYTtcbiAgICB9XG4gICAgaWYgKHRoZXRhICE9PSAwKSB7XG4gICAgICBjb250ZXh0LnJvdGF0ZSgtdGhldGEpO1xuICAgICAgY29udGV4dC50cmFuc2xhdGUoLXN4LCAtc3kpO1xuICAgICAgaWYgKCFzbW9vdGgpIHtcbiAgICAgICAgci5zZXRJbWdTbW9vdGhpbmcoY29udGV4dCwgZmFsc2UpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBlbGVUeHJDYWNoZS5kcmF3RWxlbWVudChjb250ZXh0LCBlbGUpOyAvLyBkaXJlY3QgZHJhdyBmYWxsYmFja1xuICB9XG59O1xudmFyIGdldFplcm9Sb3RhdGlvbiA9IGZ1bmN0aW9uIGdldFplcm9Sb3RhdGlvbigpIHtcbiAgcmV0dXJuIDA7XG59O1xudmFyIGdldExhYmVsUm90YXRpb24gPSBmdW5jdGlvbiBnZXRMYWJlbFJvdGF0aW9uKHIsIGVsZSkge1xuICByZXR1cm4gci5nZXRUZXh0QW5nbGUoZWxlLCBudWxsKTtcbn07XG52YXIgZ2V0U291cmNlTGFiZWxSb3RhdGlvbiA9IGZ1bmN0aW9uIGdldFNvdXJjZUxhYmVsUm90YXRpb24ociwgZWxlKSB7XG4gIHJldHVybiByLmdldFRleHRBbmdsZShlbGUsICdzb3VyY2UnKTtcbn07XG52YXIgZ2V0VGFyZ2V0TGFiZWxSb3RhdGlvbiA9IGZ1bmN0aW9uIGdldFRhcmdldExhYmVsUm90YXRpb24ociwgZWxlKSB7XG4gIHJldHVybiByLmdldFRleHRBbmdsZShlbGUsICd0YXJnZXQnKTtcbn07XG52YXIgZ2V0T3BhY2l0eSA9IGZ1bmN0aW9uIGdldE9wYWNpdHkociwgZWxlKSB7XG4gIHJldHVybiBlbGUuZWZmZWN0aXZlT3BhY2l0eSgpO1xufTtcbnZhciBnZXRUZXh0T3BhY2l0eSA9IGZ1bmN0aW9uIGdldFRleHRPcGFjaXR5KGUsIGVsZSkge1xuICByZXR1cm4gZWxlLnBzdHlsZSgndGV4dC1vcGFjaXR5JykucGZWYWx1ZSAqIGVsZS5lZmZlY3RpdmVPcGFjaXR5KCk7XG59O1xuQ1JwJGEuZHJhd0NhY2hlZEVsZW1lbnQgPSBmdW5jdGlvbiAoY29udGV4dCwgZWxlLCBweFJhdGlvLCBleHRlbnQsIGx2bCwgcmVxdWVzdEhpZ2hRdWFsaXR5KSB7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIF9yJGRhdGEgPSByLmRhdGEsXG4gICAgZWxlVHhyQ2FjaGUgPSBfciRkYXRhLmVsZVR4ckNhY2hlLFxuICAgIGxibFR4ckNhY2hlID0gX3IkZGF0YS5sYmxUeHJDYWNoZSxcbiAgICBzbGJUeHJDYWNoZSA9IF9yJGRhdGEuc2xiVHhyQ2FjaGUsXG4gICAgdGxiVHhyQ2FjaGUgPSBfciRkYXRhLnRsYlR4ckNhY2hlO1xuICB2YXIgYmIgPSBlbGUuYm91bmRpbmdCb3goKTtcbiAgdmFyIHJlYXNvbiA9IHJlcXVlc3RIaWdoUXVhbGl0eSA9PT0gdHJ1ZSA/IGVsZVR4ckNhY2hlLnJlYXNvbnMuaGlnaFF1YWxpdHkgOiBudWxsO1xuICBpZiAoYmIudyA9PT0gMCB8fCBiYi5oID09PSAwIHx8ICFlbGUudmlzaWJsZSgpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICghZXh0ZW50IHx8IGJvdW5kaW5nQm94ZXNJbnRlcnNlY3QoYmIsIGV4dGVudCkpIHtcbiAgICB2YXIgaXNFZGdlID0gZWxlLmlzRWRnZSgpO1xuICAgIHZhciBiYWRMaW5lID0gZWxlLmVsZW1lbnQoKS5fcHJpdmF0ZS5yc2NyYXRjaC5iYWRMaW5lO1xuICAgIHIuZHJhd0VsZW1lbnRVbmRlcmxheShjb250ZXh0LCBlbGUpO1xuICAgIHIuZHJhd0NhY2hlZEVsZW1lbnRQb3J0aW9uKGNvbnRleHQsIGVsZSwgZWxlVHhyQ2FjaGUsIHB4UmF0aW8sIGx2bCwgcmVhc29uLCBnZXRaZXJvUm90YXRpb24sIGdldE9wYWNpdHkpO1xuICAgIGlmICghaXNFZGdlIHx8ICFiYWRMaW5lKSB7XG4gICAgICByLmRyYXdDYWNoZWRFbGVtZW50UG9ydGlvbihjb250ZXh0LCBlbGUsIGxibFR4ckNhY2hlLCBweFJhdGlvLCBsdmwsIHJlYXNvbiwgZ2V0TGFiZWxSb3RhdGlvbiwgZ2V0VGV4dE9wYWNpdHkpO1xuICAgIH1cbiAgICBpZiAoaXNFZGdlICYmICFiYWRMaW5lKSB7XG4gICAgICByLmRyYXdDYWNoZWRFbGVtZW50UG9ydGlvbihjb250ZXh0LCBlbGUsIHNsYlR4ckNhY2hlLCBweFJhdGlvLCBsdmwsIHJlYXNvbiwgZ2V0U291cmNlTGFiZWxSb3RhdGlvbiwgZ2V0VGV4dE9wYWNpdHkpO1xuICAgICAgci5kcmF3Q2FjaGVkRWxlbWVudFBvcnRpb24oY29udGV4dCwgZWxlLCB0bGJUeHJDYWNoZSwgcHhSYXRpbywgbHZsLCByZWFzb24sIGdldFRhcmdldExhYmVsUm90YXRpb24sIGdldFRleHRPcGFjaXR5KTtcbiAgICB9XG4gICAgci5kcmF3RWxlbWVudE92ZXJsYXkoY29udGV4dCwgZWxlKTtcbiAgfVxufTtcbkNScCRhLmRyYXdFbGVtZW50cyA9IGZ1bmN0aW9uIChjb250ZXh0LCBlbGVzKSB7XG4gIHZhciByID0gdGhpcztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgci5kcmF3RWxlbWVudChjb250ZXh0LCBlbGUpO1xuICB9XG59O1xuQ1JwJGEuZHJhd0NhY2hlZEVsZW1lbnRzID0gZnVuY3Rpb24gKGNvbnRleHQsIGVsZXMsIHB4UmF0aW8sIGV4dGVudCkge1xuICB2YXIgciA9IHRoaXM7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgIHIuZHJhd0NhY2hlZEVsZW1lbnQoY29udGV4dCwgZWxlLCBweFJhdGlvLCBleHRlbnQpO1xuICB9XG59O1xuQ1JwJGEuZHJhd0NhY2hlZE5vZGVzID0gZnVuY3Rpb24gKGNvbnRleHQsIGVsZXMsIHB4UmF0aW8sIGV4dGVudCkge1xuICB2YXIgciA9IHRoaXM7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgIGlmICghZWxlLmlzTm9kZSgpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgci5kcmF3Q2FjaGVkRWxlbWVudChjb250ZXh0LCBlbGUsIHB4UmF0aW8sIGV4dGVudCk7XG4gIH1cbn07XG5DUnAkYS5kcmF3TGF5ZXJlZEVsZW1lbnRzID0gZnVuY3Rpb24gKGNvbnRleHQsIGVsZXMsIHB4UmF0aW8sIGV4dGVudCkge1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBsYXllcnMgPSByLmRhdGEubHlyVHhyQ2FjaGUuZ2V0TGF5ZXJzKGVsZXMsIHB4UmF0aW8pO1xuICBpZiAobGF5ZXJzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXllcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBsYXllciA9IGxheWVyc1tpXTtcbiAgICAgIHZhciBiYiA9IGxheWVyLmJiO1xuICAgICAgaWYgKGJiLncgPT09IDAgfHwgYmIuaCA9PT0gMCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnRleHQuZHJhd0ltYWdlKGxheWVyLmNhbnZhcywgYmIueDEsIGJiLnkxLCBiYi53LCBiYi5oKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gZmFsbCBiYWNrIG9uIHBsYWluIGNhY2hpbmcgaWYgbm8gbGF5ZXJzXG4gICAgci5kcmF3Q2FjaGVkRWxlbWVudHMoY29udGV4dCwgZWxlcywgcHhSYXRpbywgZXh0ZW50KTtcbiAgfVxufTtcblxudmFyIENScCQ5ID0ge307XG5DUnAkOS5kcmF3RWRnZSA9IGZ1bmN0aW9uIChjb250ZXh0LCBlZGdlLCBzaGlmdFRvT3JpZ2luV2l0aEJiKSB7XG4gIHZhciBkcmF3TGFiZWwgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IHRydWU7XG4gIHZhciBzaG91bGREcmF3T3ZlcmxheSA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ICYmIGFyZ3VtZW50c1s0XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzRdIDogdHJ1ZTtcbiAgdmFyIHNob3VsZERyYXdPcGFjaXR5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDUgJiYgYXJndW1lbnRzWzVdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNV0gOiB0cnVlO1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBycyA9IGVkZ2UuX3ByaXZhdGUucnNjcmF0Y2g7XG4gIGlmIChzaG91bGREcmF3T3BhY2l0eSAmJiAhZWRnZS52aXNpYmxlKCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBpZiBiZXppZXIgY3RybCBwdHMgY2FuIG5vdCBiZSBjYWxjdWxhdGVkLCB0aGVuIGRpZVxuICBpZiAocnMuYmFkTGluZSB8fCBycy5hbGxwdHMgPT0gbnVsbCB8fCBpc05hTihycy5hbGxwdHNbMF0pKSB7XG4gICAgLy8gaXNOYU4gaW4gY2FzZSBlZGdlIGlzIGltcG9zc2libGUgYW5kIGJyb3dzZXIgYnVncyAoZS5nLiBzYWZhcmkpXG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBiYjtcbiAgaWYgKHNoaWZ0VG9PcmlnaW5XaXRoQmIpIHtcbiAgICBiYiA9IHNoaWZ0VG9PcmlnaW5XaXRoQmI7XG4gICAgY29udGV4dC50cmFuc2xhdGUoLWJiLngxLCAtYmIueTEpO1xuICB9XG4gIHZhciBvcGFjaXR5ID0gc2hvdWxkRHJhd09wYWNpdHkgPyBlZGdlLnBzdHlsZSgnb3BhY2l0eScpLnZhbHVlIDogMTtcbiAgdmFyIGxpbmVPcGFjaXR5ID0gc2hvdWxkRHJhd09wYWNpdHkgPyBlZGdlLnBzdHlsZSgnbGluZS1vcGFjaXR5JykudmFsdWUgOiAxO1xuICB2YXIgY3VydmVTdHlsZSA9IGVkZ2UucHN0eWxlKCdjdXJ2ZS1zdHlsZScpLnZhbHVlO1xuICB2YXIgbGluZVN0eWxlID0gZWRnZS5wc3R5bGUoJ2xpbmUtc3R5bGUnKS52YWx1ZTtcbiAgdmFyIGVkZ2VXaWR0aCA9IGVkZ2UucHN0eWxlKCd3aWR0aCcpLnBmVmFsdWU7XG4gIHZhciBsaW5lQ2FwID0gZWRnZS5wc3R5bGUoJ2xpbmUtY2FwJykudmFsdWU7XG4gIHZhciBsaW5lT3V0bGluZVdpZHRoID0gZWRnZS5wc3R5bGUoJ2xpbmUtb3V0bGluZS13aWR0aCcpLnZhbHVlO1xuICB2YXIgbGluZU91dGxpbmVDb2xvciA9IGVkZ2UucHN0eWxlKCdsaW5lLW91dGxpbmUtY29sb3InKS52YWx1ZTtcbiAgdmFyIGVmZmVjdGl2ZUxpbmVPcGFjaXR5ID0gb3BhY2l0eSAqIGxpbmVPcGFjaXR5O1xuICAvLyBzZXBhcmF0ZSBhcnJvdyBvcGFjaXR5IHdvdWxkIHJlcXVpcmUgYXJyb3ctb3BhY2l0eSBwcm9wZXJ0eVxuICB2YXIgZWZmZWN0aXZlQXJyb3dPcGFjaXR5ID0gb3BhY2l0eSAqIGxpbmVPcGFjaXR5O1xuICB2YXIgZHJhd0xpbmUgPSBmdW5jdGlvbiBkcmF3TGluZSgpIHtcbiAgICB2YXIgc3Ryb2tlT3BhY2l0eSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZWZmZWN0aXZlTGluZU9wYWNpdHk7XG4gICAgaWYgKGN1cnZlU3R5bGUgPT09ICdzdHJhaWdodC10cmlhbmdsZScpIHtcbiAgICAgIHIuZWxlU3Ryb2tlU3R5bGUoY29udGV4dCwgZWRnZSwgc3Ryb2tlT3BhY2l0eSk7XG4gICAgICByLmRyYXdFZGdlVHJpYW5nbGVQYXRoKGVkZ2UsIGNvbnRleHQsIHJzLmFsbHB0cyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRleHQubGluZVdpZHRoID0gZWRnZVdpZHRoO1xuICAgICAgY29udGV4dC5saW5lQ2FwID0gbGluZUNhcDtcbiAgICAgIHIuZWxlU3Ryb2tlU3R5bGUoY29udGV4dCwgZWRnZSwgc3Ryb2tlT3BhY2l0eSk7XG4gICAgICByLmRyYXdFZGdlUGF0aChlZGdlLCBjb250ZXh0LCBycy5hbGxwdHMsIGxpbmVTdHlsZSk7XG4gICAgICBjb250ZXh0LmxpbmVDYXAgPSAnYnV0dCc7IC8vIHJlc2V0IGZvciBvdGhlciBkcmF3aW5nIGZ1bmN0aW9uc1xuICAgIH1cbiAgfTtcbiAgdmFyIGRyYXdMaW5lT3V0bGluZSA9IGZ1bmN0aW9uIGRyYXdMaW5lT3V0bGluZSgpIHtcbiAgICB2YXIgc3Ryb2tlT3BhY2l0eSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZWZmZWN0aXZlTGluZU9wYWNpdHk7XG4gICAgY29udGV4dC5saW5lV2lkdGggPSBlZGdlV2lkdGggKyBsaW5lT3V0bGluZVdpZHRoO1xuICAgIGNvbnRleHQubGluZUNhcCA9IGxpbmVDYXA7XG4gICAgaWYgKGxpbmVPdXRsaW5lV2lkdGggPiAwKSB7XG4gICAgICByLmNvbG9yU3Ryb2tlU3R5bGUoY29udGV4dCwgbGluZU91dGxpbmVDb2xvclswXSwgbGluZU91dGxpbmVDb2xvclsxXSwgbGluZU91dGxpbmVDb2xvclsyXSwgc3Ryb2tlT3BhY2l0eSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGRvIG5vdCBkcmF3IGFueSBsaW5lT3V0bGluZVxuICAgICAgY29udGV4dC5saW5lQ2FwID0gJ2J1dHQnOyAvLyByZXNldCBmb3Igb3RoZXIgZHJhd2luZyBmdW5jdGlvbnNcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGN1cnZlU3R5bGUgPT09ICdzdHJhaWdodC10cmlhbmdsZScpIHtcbiAgICAgIHIuZHJhd0VkZ2VUcmlhbmdsZVBhdGgoZWRnZSwgY29udGV4dCwgcnMuYWxscHRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgci5kcmF3RWRnZVBhdGgoZWRnZSwgY29udGV4dCwgcnMuYWxscHRzLCBsaW5lU3R5bGUpO1xuICAgICAgY29udGV4dC5saW5lQ2FwID0gJ2J1dHQnOyAvLyByZXNldCBmb3Igb3RoZXIgZHJhd2luZyBmdW5jdGlvbnNcbiAgICB9XG4gIH07XG4gIHZhciBkcmF3T3ZlcmxheSA9IGZ1bmN0aW9uIGRyYXdPdmVybGF5KCkge1xuICAgIGlmICghc2hvdWxkRHJhd092ZXJsYXkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgci5kcmF3RWRnZU92ZXJsYXkoY29udGV4dCwgZWRnZSk7XG4gIH07XG4gIHZhciBkcmF3VW5kZXJsYXkgPSBmdW5jdGlvbiBkcmF3VW5kZXJsYXkoKSB7XG4gICAgaWYgKCFzaG91bGREcmF3T3ZlcmxheSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByLmRyYXdFZGdlVW5kZXJsYXkoY29udGV4dCwgZWRnZSk7XG4gIH07XG4gIHZhciBkcmF3QXJyb3dzID0gZnVuY3Rpb24gZHJhd0Fycm93cygpIHtcbiAgICB2YXIgYXJyb3dPcGFjaXR5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBlZmZlY3RpdmVBcnJvd09wYWNpdHk7XG4gICAgci5kcmF3QXJyb3doZWFkcyhjb250ZXh0LCBlZGdlLCBhcnJvd09wYWNpdHkpO1xuICB9O1xuICB2YXIgZHJhd1RleHQgPSBmdW5jdGlvbiBkcmF3VGV4dCgpIHtcbiAgICByLmRyYXdFbGVtZW50VGV4dChjb250ZXh0LCBlZGdlLCBudWxsLCBkcmF3TGFiZWwpO1xuICB9O1xuICBjb250ZXh0LmxpbmVKb2luID0gJ3JvdW5kJztcbiAgdmFyIGdob3N0ID0gZWRnZS5wc3R5bGUoJ2dob3N0JykudmFsdWUgPT09ICd5ZXMnO1xuICBpZiAoZ2hvc3QpIHtcbiAgICB2YXIgZ3ggPSBlZGdlLnBzdHlsZSgnZ2hvc3Qtb2Zmc2V0LXgnKS5wZlZhbHVlO1xuICAgIHZhciBneSA9IGVkZ2UucHN0eWxlKCdnaG9zdC1vZmZzZXQteScpLnBmVmFsdWU7XG4gICAgdmFyIGdob3N0T3BhY2l0eSA9IGVkZ2UucHN0eWxlKCdnaG9zdC1vcGFjaXR5JykudmFsdWU7XG4gICAgdmFyIGVmZmVjdGl2ZUdob3N0T3BhY2l0eSA9IGVmZmVjdGl2ZUxpbmVPcGFjaXR5ICogZ2hvc3RPcGFjaXR5O1xuICAgIGNvbnRleHQudHJhbnNsYXRlKGd4LCBneSk7XG4gICAgZHJhd0xpbmUoZWZmZWN0aXZlR2hvc3RPcGFjaXR5KTtcbiAgICBkcmF3QXJyb3dzKGVmZmVjdGl2ZUdob3N0T3BhY2l0eSk7XG4gICAgY29udGV4dC50cmFuc2xhdGUoLWd4LCAtZ3kpO1xuICB9IGVsc2Uge1xuICAgIGRyYXdMaW5lT3V0bGluZSgpO1xuICB9XG4gIGRyYXdVbmRlcmxheSgpO1xuICBkcmF3TGluZSgpO1xuICBkcmF3QXJyb3dzKCk7XG4gIGRyYXdPdmVybGF5KCk7XG4gIGRyYXdUZXh0KCk7XG4gIGlmIChzaGlmdFRvT3JpZ2luV2l0aEJiKSB7XG4gICAgY29udGV4dC50cmFuc2xhdGUoYmIueDEsIGJiLnkxKTtcbiAgfVxufTtcbnZhciBkcmF3RWRnZU92ZXJsYXlVbmRlcmxheSA9IGZ1bmN0aW9uIGRyYXdFZGdlT3ZlcmxheVVuZGVybGF5KG92ZXJsYXlPclVuZGVybGF5KSB7XG4gIGlmICghWydvdmVybGF5JywgJ3VuZGVybGF5J10uaW5jbHVkZXMob3ZlcmxheU9yVW5kZXJsYXkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHN0YXRlJyk7XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uIChjb250ZXh0LCBlZGdlKSB7XG4gICAgaWYgKCFlZGdlLnZpc2libGUoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgb3BhY2l0eSA9IGVkZ2UucHN0eWxlKFwiXCIuY29uY2F0KG92ZXJsYXlPclVuZGVybGF5LCBcIi1vcGFjaXR5XCIpKS52YWx1ZTtcbiAgICBpZiAob3BhY2l0eSA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgciA9IHRoaXM7XG4gICAgdmFyIHVzZVBhdGhzID0gci51c2VQYXRocygpO1xuICAgIHZhciBycyA9IGVkZ2UuX3ByaXZhdGUucnNjcmF0Y2g7XG4gICAgdmFyIHBhZGRpbmcgPSBlZGdlLnBzdHlsZShcIlwiLmNvbmNhdChvdmVybGF5T3JVbmRlcmxheSwgXCItcGFkZGluZ1wiKSkucGZWYWx1ZTtcbiAgICB2YXIgd2lkdGggPSAyICogcGFkZGluZztcbiAgICB2YXIgY29sb3IgPSBlZGdlLnBzdHlsZShcIlwiLmNvbmNhdChvdmVybGF5T3JVbmRlcmxheSwgXCItY29sb3JcIikpLnZhbHVlO1xuICAgIGNvbnRleHQubGluZVdpZHRoID0gd2lkdGg7XG4gICAgaWYgKHJzLmVkZ2VUeXBlID09PSAnc2VsZicgJiYgIXVzZVBhdGhzKSB7XG4gICAgICBjb250ZXh0LmxpbmVDYXAgPSAnYnV0dCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRleHQubGluZUNhcCA9ICdyb3VuZCc7XG4gICAgfVxuICAgIHIuY29sb3JTdHJva2VTdHlsZShjb250ZXh0LCBjb2xvclswXSwgY29sb3JbMV0sIGNvbG9yWzJdLCBvcGFjaXR5KTtcbiAgICByLmRyYXdFZGdlUGF0aChlZGdlLCBjb250ZXh0LCBycy5hbGxwdHMsICdzb2xpZCcpO1xuICB9O1xufTtcbkNScCQ5LmRyYXdFZGdlT3ZlcmxheSA9IGRyYXdFZGdlT3ZlcmxheVVuZGVybGF5KCdvdmVybGF5Jyk7XG5DUnAkOS5kcmF3RWRnZVVuZGVybGF5ID0gZHJhd0VkZ2VPdmVybGF5VW5kZXJsYXkoJ3VuZGVybGF5Jyk7XG5DUnAkOS5kcmF3RWRnZVBhdGggPSBmdW5jdGlvbiAoZWRnZSwgY29udGV4dCwgcHRzLCB0eXBlKSB7XG4gIHZhciBycyA9IGVkZ2UuX3ByaXZhdGUucnNjcmF0Y2g7XG4gIHZhciBjYW52YXNDeHQgPSBjb250ZXh0O1xuICB2YXIgcGF0aDtcbiAgdmFyIHBhdGhDYWNoZUhpdCA9IGZhbHNlO1xuICB2YXIgdXNlUGF0aHMgPSB0aGlzLnVzZVBhdGhzKCk7XG4gIHZhciBsaW5lRGFzaFBhdHRlcm4gPSBlZGdlLnBzdHlsZSgnbGluZS1kYXNoLXBhdHRlcm4nKS5wZlZhbHVlO1xuICB2YXIgbGluZURhc2hPZmZzZXQgPSBlZGdlLnBzdHlsZSgnbGluZS1kYXNoLW9mZnNldCcpLnBmVmFsdWU7XG4gIGlmICh1c2VQYXRocykge1xuICAgIHZhciBwYXRoQ2FjaGVLZXkgPSBwdHMuam9pbignJCcpO1xuICAgIHZhciBrZXlNYXRjaGVzID0gcnMucGF0aENhY2hlS2V5ICYmIHJzLnBhdGhDYWNoZUtleSA9PT0gcGF0aENhY2hlS2V5O1xuICAgIGlmIChrZXlNYXRjaGVzKSB7XG4gICAgICBwYXRoID0gY29udGV4dCA9IHJzLnBhdGhDYWNoZTtcbiAgICAgIHBhdGhDYWNoZUhpdCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhdGggPSBjb250ZXh0ID0gbmV3IFBhdGgyRCgpO1xuICAgICAgcnMucGF0aENhY2hlS2V5ID0gcGF0aENhY2hlS2V5O1xuICAgICAgcnMucGF0aENhY2hlID0gcGF0aDtcbiAgICB9XG4gIH1cbiAgaWYgKGNhbnZhc0N4dC5zZXRMaW5lRGFzaCkge1xuICAgIC8vIGZvciB2ZXJ5IG91dG9mZGF0ZSBicm93c2Vyc1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnZG90dGVkJzpcbiAgICAgICAgY2FudmFzQ3h0LnNldExpbmVEYXNoKFsxLCAxXSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZGFzaGVkJzpcbiAgICAgICAgY2FudmFzQ3h0LnNldExpbmVEYXNoKGxpbmVEYXNoUGF0dGVybik7XG4gICAgICAgIGNhbnZhc0N4dC5saW5lRGFzaE9mZnNldCA9IGxpbmVEYXNoT2Zmc2V0O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3NvbGlkJzpcbiAgICAgICAgY2FudmFzQ3h0LnNldExpbmVEYXNoKFtdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGlmICghcGF0aENhY2hlSGl0ICYmICFycy5iYWRMaW5lKSB7XG4gICAgaWYgKGNvbnRleHQuYmVnaW5QYXRoKSB7XG4gICAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgIH1cbiAgICBjb250ZXh0Lm1vdmVUbyhwdHNbMF0sIHB0c1sxXSk7XG4gICAgc3dpdGNoIChycy5lZGdlVHlwZSkge1xuICAgICAgY2FzZSAnYmV6aWVyJzpcbiAgICAgIGNhc2UgJ3NlbGYnOlxuICAgICAgY2FzZSAnY29tcG91bmQnOlxuICAgICAgY2FzZSAnbXVsdGliZXppZXInOlxuICAgICAgICBmb3IgKHZhciBpID0gMjsgaSArIDMgPCBwdHMubGVuZ3RoOyBpICs9IDQpIHtcbiAgICAgICAgICBjb250ZXh0LnF1YWRyYXRpY0N1cnZlVG8ocHRzW2ldLCBwdHNbaSArIDFdLCBwdHNbaSArIDJdLCBwdHNbaSArIDNdKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3N0cmFpZ2h0JzpcbiAgICAgIGNhc2UgJ2hheXN0YWNrJzpcbiAgICAgICAgZm9yICh2YXIgX2kgPSAyOyBfaSArIDEgPCBwdHMubGVuZ3RoOyBfaSArPSAyKSB7XG4gICAgICAgICAgY29udGV4dC5saW5lVG8ocHRzW19pXSwgcHRzW19pICsgMV0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc2VnbWVudHMnOlxuICAgICAgICBpZiAocnMuaXNSb3VuZCkge1xuICAgICAgICAgIHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihycy5yb3VuZENvcm5lcnMpLFxuICAgICAgICAgICAgX3N0ZXA7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgICAgIHZhciBjb3JuZXIgPSBfc3RlcC52YWx1ZTtcbiAgICAgICAgICAgICAgZHJhd1ByZXBhcmVkUm91bmRDb3JuZXIoY29udGV4dCwgY29ybmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIF9pdGVyYXRvci5lKGVycik7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIF9pdGVyYXRvci5mKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRleHQubGluZVRvKHB0c1twdHMubGVuZ3RoIC0gMl0sIHB0c1twdHMubGVuZ3RoIC0gMV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvciAodmFyIF9pMiA9IDI7IF9pMiArIDEgPCBwdHMubGVuZ3RoOyBfaTIgKz0gMikge1xuICAgICAgICAgICAgY29udGV4dC5saW5lVG8ocHRzW19pMl0sIHB0c1tfaTIgKyAxXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBjb250ZXh0ID0gY2FudmFzQ3h0O1xuICBpZiAodXNlUGF0aHMpIHtcbiAgICBjb250ZXh0LnN0cm9rZShwYXRoKTtcbiAgfSBlbHNlIHtcbiAgICBjb250ZXh0LnN0cm9rZSgpO1xuICB9XG5cbiAgLy8gcmVzZXQgYW55IGxpbmUgZGFzaGVzXG4gIGlmIChjb250ZXh0LnNldExpbmVEYXNoKSB7XG4gICAgLy8gZm9yIHZlcnkgb3V0b2ZkYXRlIGJyb3dzZXJzXG4gICAgY29udGV4dC5zZXRMaW5lRGFzaChbXSk7XG4gIH1cbn07XG5DUnAkOS5kcmF3RWRnZVRyaWFuZ2xlUGF0aCA9IGZ1bmN0aW9uIChlZGdlLCBjb250ZXh0LCBwdHMpIHtcbiAgLy8gdXNlIGxpbmUgc3Ryb2tlIHN0eWxlIGZvciB0cmlhbmdsZSBmaWxsIHN0eWxlXG4gIGNvbnRleHQuZmlsbFN0eWxlID0gY29udGV4dC5zdHJva2VTdHlsZTtcbiAgdmFyIGVkZ2VXaWR0aCA9IGVkZ2UucHN0eWxlKCd3aWR0aCcpLnBmVmFsdWU7XG4gIGZvciAodmFyIGkgPSAwOyBpICsgMSA8IHB0cy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHZhciB2ZWN0b3IgPSBbcHRzW2kgKyAyXSAtIHB0c1tpXSwgcHRzW2kgKyAzXSAtIHB0c1tpICsgMV1dO1xuICAgIHZhciBsZW5ndGggPSBNYXRoLnNxcnQodmVjdG9yWzBdICogdmVjdG9yWzBdICsgdmVjdG9yWzFdICogdmVjdG9yWzFdKTtcbiAgICB2YXIgbm9ybWFsID0gW3ZlY3RvclsxXSAvIGxlbmd0aCwgLXZlY3RvclswXSAvIGxlbmd0aF07XG4gICAgdmFyIHRyaWFuZ2xlSGVhZCA9IFtub3JtYWxbMF0gKiBlZGdlV2lkdGggLyAyLCBub3JtYWxbMV0gKiBlZGdlV2lkdGggLyAyXTtcbiAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgIGNvbnRleHQubW92ZVRvKHB0c1tpXSAtIHRyaWFuZ2xlSGVhZFswXSwgcHRzW2kgKyAxXSAtIHRyaWFuZ2xlSGVhZFsxXSk7XG4gICAgY29udGV4dC5saW5lVG8ocHRzW2ldICsgdHJpYW5nbGVIZWFkWzBdLCBwdHNbaSArIDFdICsgdHJpYW5nbGVIZWFkWzFdKTtcbiAgICBjb250ZXh0LmxpbmVUbyhwdHNbaSArIDJdLCBwdHNbaSArIDNdKTtcbiAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgIGNvbnRleHQuZmlsbCgpO1xuICB9XG59O1xuQ1JwJDkuZHJhd0Fycm93aGVhZHMgPSBmdW5jdGlvbiAoY29udGV4dCwgZWRnZSwgb3BhY2l0eSkge1xuICB2YXIgcnMgPSBlZGdlLl9wcml2YXRlLnJzY3JhdGNoO1xuICB2YXIgaXNIYXlzdGFjayA9IHJzLmVkZ2VUeXBlID09PSAnaGF5c3RhY2snO1xuICBpZiAoIWlzSGF5c3RhY2spIHtcbiAgICB0aGlzLmRyYXdBcnJvd2hlYWQoY29udGV4dCwgZWRnZSwgJ3NvdXJjZScsIHJzLmFycm93U3RhcnRYLCBycy5hcnJvd1N0YXJ0WSwgcnMuc3JjQXJyb3dBbmdsZSwgb3BhY2l0eSk7XG4gIH1cbiAgdGhpcy5kcmF3QXJyb3doZWFkKGNvbnRleHQsIGVkZ2UsICdtaWQtdGFyZ2V0JywgcnMubWlkWCwgcnMubWlkWSwgcnMubWlkdGd0QXJyb3dBbmdsZSwgb3BhY2l0eSk7XG4gIHRoaXMuZHJhd0Fycm93aGVhZChjb250ZXh0LCBlZGdlLCAnbWlkLXNvdXJjZScsIHJzLm1pZFgsIHJzLm1pZFksIHJzLm1pZHNyY0Fycm93QW5nbGUsIG9wYWNpdHkpO1xuICBpZiAoIWlzSGF5c3RhY2spIHtcbiAgICB0aGlzLmRyYXdBcnJvd2hlYWQoY29udGV4dCwgZWRnZSwgJ3RhcmdldCcsIHJzLmFycm93RW5kWCwgcnMuYXJyb3dFbmRZLCBycy50Z3RBcnJvd0FuZ2xlLCBvcGFjaXR5KTtcbiAgfVxufTtcbkNScCQ5LmRyYXdBcnJvd2hlYWQgPSBmdW5jdGlvbiAoY29udGV4dCwgZWRnZSwgcHJlZml4LCB4LCB5LCBhbmdsZSwgb3BhY2l0eSkge1xuICBpZiAoaXNOYU4oeCkgfHwgeCA9PSBudWxsIHx8IGlzTmFOKHkpIHx8IHkgPT0gbnVsbCB8fCBpc05hTihhbmdsZSkgfHwgYW5nbGUgPT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBhcnJvd1NoYXBlID0gZWRnZS5wc3R5bGUocHJlZml4ICsgJy1hcnJvdy1zaGFwZScpLnZhbHVlO1xuICBpZiAoYXJyb3dTaGFwZSA9PT0gJ25vbmUnKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBhcnJvd0NsZWFyRmlsbCA9IGVkZ2UucHN0eWxlKHByZWZpeCArICctYXJyb3ctZmlsbCcpLnZhbHVlID09PSAnaG9sbG93JyA/ICdib3RoJyA6ICdmaWxsZWQnO1xuICB2YXIgYXJyb3dGaWxsID0gZWRnZS5wc3R5bGUocHJlZml4ICsgJy1hcnJvdy1maWxsJykudmFsdWU7XG4gIHZhciBlZGdlV2lkdGggPSBlZGdlLnBzdHlsZSgnd2lkdGgnKS5wZlZhbHVlO1xuICB2YXIgcEFycm93V2lkdGggPSBlZGdlLnBzdHlsZShwcmVmaXggKyAnLWFycm93LXdpZHRoJyk7XG4gIHZhciBhcnJvd1dpZHRoID0gcEFycm93V2lkdGgudmFsdWUgPT09ICdtYXRjaC1saW5lJyA/IGVkZ2VXaWR0aCA6IHBBcnJvd1dpZHRoLnBmVmFsdWU7XG4gIGlmIChwQXJyb3dXaWR0aC51bml0cyA9PT0gJyUnKSBhcnJvd1dpZHRoICo9IGVkZ2VXaWR0aDtcbiAgdmFyIGVkZ2VPcGFjaXR5ID0gZWRnZS5wc3R5bGUoJ29wYWNpdHknKS52YWx1ZTtcbiAgaWYgKG9wYWNpdHkgPT09IHVuZGVmaW5lZCkge1xuICAgIG9wYWNpdHkgPSBlZGdlT3BhY2l0eTtcbiAgfVxuICB2YXIgZ2NvID0gY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb247XG4gIGlmIChvcGFjaXR5ICE9PSAxIHx8IGFycm93RmlsbCA9PT0gJ2hvbGxvdycpIHtcbiAgICAvLyB0aGVuIGV4dHJhIGNsZWFyIGlzIG5lZWRlZFxuICAgIGNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ2Rlc3RpbmF0aW9uLW91dCc7XG4gICAgc2VsZi5jb2xvckZpbGxTdHlsZShjb250ZXh0LCAyNTUsIDI1NSwgMjU1LCAxKTtcbiAgICBzZWxmLmNvbG9yU3Ryb2tlU3R5bGUoY29udGV4dCwgMjU1LCAyNTUsIDI1NSwgMSk7XG4gICAgc2VsZi5kcmF3QXJyb3dTaGFwZShlZGdlLCBjb250ZXh0LCBhcnJvd0NsZWFyRmlsbCwgZWRnZVdpZHRoLCBhcnJvd1NoYXBlLCBhcnJvd1dpZHRoLCB4LCB5LCBhbmdsZSk7XG4gICAgY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBnY287XG4gIH0gLy8gb3RoZXJ3aXNlLCB0aGUgb3BhcXVlIGFycm93IGNsZWFycyBpdCBmb3IgZnJlZSA6KVxuXG4gIHZhciBjb2xvciA9IGVkZ2UucHN0eWxlKHByZWZpeCArICctYXJyb3ctY29sb3InKS52YWx1ZTtcbiAgc2VsZi5jb2xvckZpbGxTdHlsZShjb250ZXh0LCBjb2xvclswXSwgY29sb3JbMV0sIGNvbG9yWzJdLCBvcGFjaXR5KTtcbiAgc2VsZi5jb2xvclN0cm9rZVN0eWxlKGNvbnRleHQsIGNvbG9yWzBdLCBjb2xvclsxXSwgY29sb3JbMl0sIG9wYWNpdHkpO1xuICBzZWxmLmRyYXdBcnJvd1NoYXBlKGVkZ2UsIGNvbnRleHQsIGFycm93RmlsbCwgZWRnZVdpZHRoLCBhcnJvd1NoYXBlLCBhcnJvd1dpZHRoLCB4LCB5LCBhbmdsZSk7XG59O1xuQ1JwJDkuZHJhd0Fycm93U2hhcGUgPSBmdW5jdGlvbiAoZWRnZSwgY29udGV4dCwgZmlsbCwgZWRnZVdpZHRoLCBzaGFwZSwgc2hhcGVXaWR0aCwgeCwgeSwgYW5nbGUpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgdXNlUGF0aHMgPSB0aGlzLnVzZVBhdGhzKCkgJiYgc2hhcGUgIT09ICd0cmlhbmdsZS1jcm9zcyc7XG4gIHZhciBwYXRoQ2FjaGVIaXQgPSBmYWxzZTtcbiAgdmFyIHBhdGg7XG4gIHZhciBjYW52YXNDb250ZXh0ID0gY29udGV4dDtcbiAgdmFyIHRyYW5zbGF0aW9uID0ge1xuICAgIHg6IHgsXG4gICAgeTogeVxuICB9O1xuICB2YXIgc2NhbGUgPSBlZGdlLnBzdHlsZSgnYXJyb3ctc2NhbGUnKS52YWx1ZTtcbiAgdmFyIHNpemUgPSB0aGlzLmdldEFycm93V2lkdGgoZWRnZVdpZHRoLCBzY2FsZSk7XG4gIHZhciBzaGFwZUltcGwgPSByLmFycm93U2hhcGVzW3NoYXBlXTtcbiAgaWYgKHVzZVBhdGhzKSB7XG4gICAgdmFyIGNhY2hlID0gci5hcnJvd1BhdGhDYWNoZSA9IHIuYXJyb3dQYXRoQ2FjaGUgfHwgW107XG4gICAgdmFyIGtleSA9IGhhc2hTdHJpbmcoc2hhcGUpO1xuICAgIHZhciBjYWNoZWRQYXRoID0gY2FjaGVba2V5XTtcbiAgICBpZiAoY2FjaGVkUGF0aCAhPSBudWxsKSB7XG4gICAgICBwYXRoID0gY29udGV4dCA9IGNhY2hlZFBhdGg7XG4gICAgICBwYXRoQ2FjaGVIaXQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXRoID0gY29udGV4dCA9IG5ldyBQYXRoMkQoKTtcbiAgICAgIGNhY2hlW2tleV0gPSBwYXRoO1xuICAgIH1cbiAgfVxuICBpZiAoIXBhdGhDYWNoZUhpdCkge1xuICAgIGlmIChjb250ZXh0LmJlZ2luUGF0aCkge1xuICAgICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICB9XG4gICAgaWYgKHVzZVBhdGhzKSB7XG4gICAgICAvLyBzdG9yZSBpbiB0aGUgcGF0aCBjYWNoZSB3aXRoIHZhbHVlcyBlYXNpbHkgbWFuaXB1bGF0ZWQgbGF0ZXJcbiAgICAgIHNoYXBlSW1wbC5kcmF3KGNvbnRleHQsIDEsIDAsIHtcbiAgICAgICAgeDogMCxcbiAgICAgICAgeTogMFxuICAgICAgfSwgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNoYXBlSW1wbC5kcmF3KGNvbnRleHQsIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbiwgZWRnZVdpZHRoKTtcbiAgICB9XG4gICAgaWYgKGNvbnRleHQuY2xvc2VQYXRoKSB7XG4gICAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgIH1cbiAgfVxuICBjb250ZXh0ID0gY2FudmFzQ29udGV4dDtcbiAgaWYgKHVzZVBhdGhzKSB7XG4gICAgLy8gc2V0IHRyYW5zZm9ybSB0byBhcnJvdyBwb3NpdGlvbi9vcmllbnRhdGlvblxuICAgIGNvbnRleHQudHJhbnNsYXRlKHgsIHkpO1xuICAgIGNvbnRleHQucm90YXRlKGFuZ2xlKTtcbiAgICBjb250ZXh0LnNjYWxlKHNpemUsIHNpemUpO1xuICB9XG4gIGlmIChmaWxsID09PSAnZmlsbGVkJyB8fCBmaWxsID09PSAnYm90aCcpIHtcbiAgICBpZiAodXNlUGF0aHMpIHtcbiAgICAgIGNvbnRleHQuZmlsbChwYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGV4dC5maWxsKCk7XG4gICAgfVxuICB9XG4gIGlmIChmaWxsID09PSAnaG9sbG93JyB8fCBmaWxsID09PSAnYm90aCcpIHtcbiAgICBjb250ZXh0LmxpbmVXaWR0aCA9IHNoYXBlV2lkdGggLyAodXNlUGF0aHMgPyBzaXplIDogMSk7XG4gICAgY29udGV4dC5saW5lSm9pbiA9ICdtaXRlcic7XG4gICAgaWYgKHVzZVBhdGhzKSB7XG4gICAgICBjb250ZXh0LnN0cm9rZShwYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGV4dC5zdHJva2UoKTtcbiAgICB9XG4gIH1cbiAgaWYgKHVzZVBhdGhzKSB7XG4gICAgLy8gcmVzZXQgdHJhbnNmb3JtIGJ5IGFwcGx5aW5nIGludmVyc2VcbiAgICBjb250ZXh0LnNjYWxlKDEgLyBzaXplLCAxIC8gc2l6ZSk7XG4gICAgY29udGV4dC5yb3RhdGUoLWFuZ2xlKTtcbiAgICBjb250ZXh0LnRyYW5zbGF0ZSgteCwgLXkpO1xuICB9XG59O1xuXG52YXIgQ1JwJDggPSB7fTtcbkNScCQ4LnNhZmVEcmF3SW1hZ2UgPSBmdW5jdGlvbiAoY29udGV4dCwgaW1nLCBpeCwgaXksIGl3LCBpaCwgeCwgeSwgdywgaCkge1xuICAvLyBkZXRlY3QgcHJvYmxlbWF0aWMgY2FzZXMgZm9yIG9sZCBicm93c2VycyB3aXRoIGJhZCBpbWFnZXMgKGNoZWFwZXIgdGhhbiB0cnktY2F0Y2gpXG4gIGlmIChpdyA8PSAwIHx8IGloIDw9IDAgfHwgdyA8PSAwIHx8IGggPD0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICB0cnkge1xuICAgIGNvbnRleHQuZHJhd0ltYWdlKGltZywgaXgsIGl5LCBpdywgaWgsIHgsIHksIHcsIGgpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgd2FybihlKTtcbiAgfVxufTtcbkNScCQ4LmRyYXdJbnNjcmliZWRJbWFnZSA9IGZ1bmN0aW9uIChjb250ZXh0LCBpbWcsIG5vZGUsIGluZGV4LCBub2RlT3BhY2l0eSkge1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBwb3MgPSBub2RlLnBvc2l0aW9uKCk7XG4gIHZhciBub2RlWCA9IHBvcy54O1xuICB2YXIgbm9kZVkgPSBwb3MueTtcbiAgdmFyIHN0eWxlT2JqID0gbm9kZS5jeSgpLnN0eWxlKCk7XG4gIHZhciBnZXRJbmRleGVkU3R5bGUgPSBzdHlsZU9iai5nZXRJbmRleGVkU3R5bGUuYmluZChzdHlsZU9iaik7XG4gIHZhciBmaXQgPSBnZXRJbmRleGVkU3R5bGUobm9kZSwgJ2JhY2tncm91bmQtZml0JywgJ3ZhbHVlJywgaW5kZXgpO1xuICB2YXIgcmVwZWF0ID0gZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLXJlcGVhdCcsICd2YWx1ZScsIGluZGV4KTtcbiAgdmFyIG5vZGVXID0gbm9kZS53aWR0aCgpO1xuICB2YXIgbm9kZUggPSBub2RlLmhlaWdodCgpO1xuICB2YXIgcGFkZGluZ1gyID0gbm9kZS5wYWRkaW5nKCkgKiAyO1xuICB2YXIgbm9kZVRXID0gbm9kZVcgKyAoZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLXdpZHRoLXJlbGF0aXZlLXRvJywgJ3ZhbHVlJywgaW5kZXgpID09PSAnaW5uZXInID8gMCA6IHBhZGRpbmdYMik7XG4gIHZhciBub2RlVEggPSBub2RlSCArIChnZXRJbmRleGVkU3R5bGUobm9kZSwgJ2JhY2tncm91bmQtaGVpZ2h0LXJlbGF0aXZlLXRvJywgJ3ZhbHVlJywgaW5kZXgpID09PSAnaW5uZXInID8gMCA6IHBhZGRpbmdYMik7XG4gIHZhciBycyA9IG5vZGUuX3ByaXZhdGUucnNjcmF0Y2g7XG4gIHZhciBjbGlwID0gZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLWNsaXAnLCAndmFsdWUnLCBpbmRleCk7XG4gIHZhciBzaG91bGRDbGlwID0gY2xpcCA9PT0gJ25vZGUnO1xuICB2YXIgaW1nT3BhY2l0eSA9IGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC1pbWFnZS1vcGFjaXR5JywgJ3ZhbHVlJywgaW5kZXgpICogbm9kZU9wYWNpdHk7XG4gIHZhciBzbW9vdGggPSBnZXRJbmRleGVkU3R5bGUobm9kZSwgJ2JhY2tncm91bmQtaW1hZ2Utc21vb3RoaW5nJywgJ3ZhbHVlJywgaW5kZXgpO1xuICB2YXIgY29ybmVyUmFkaXVzID0gbm9kZS5wc3R5bGUoJ2Nvcm5lci1yYWRpdXMnKS52YWx1ZTtcbiAgaWYgKGNvcm5lclJhZGl1cyAhPT0gJ2F1dG8nKSBjb3JuZXJSYWRpdXMgPSBub2RlLnBzdHlsZSgnY29ybmVyLXJhZGl1cycpLnBmVmFsdWU7XG4gIHZhciBpbWdXID0gaW1nLndpZHRoIHx8IGltZy5jYWNoZWRXO1xuICB2YXIgaW1nSCA9IGltZy5oZWlnaHQgfHwgaW1nLmNhY2hlZEg7XG5cbiAgLy8gd29ya2Fyb3VuZCBmb3IgYnJva2VuIGJyb3dzZXJzIGxpa2UgaWVcbiAgaWYgKG51bGwgPT0gaW1nVyB8fCBudWxsID09IGltZ0gpIHtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGltZyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcblxuICAgIGltZ1cgPSBpbWcuY2FjaGVkVyA9IGltZy53aWR0aCB8fCBpbWcub2Zmc2V0V2lkdGg7XG4gICAgaW1nSCA9IGltZy5jYWNoZWRIID0gaW1nLmhlaWdodCB8fCBpbWcub2Zmc2V0SGVpZ2h0O1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoaW1nKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuICB9XG4gIHZhciB3ID0gaW1nVztcbiAgdmFyIGggPSBpbWdIO1xuICBpZiAoZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLXdpZHRoJywgJ3ZhbHVlJywgaW5kZXgpICE9PSAnYXV0bycpIHtcbiAgICBpZiAoZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLXdpZHRoJywgJ3VuaXRzJywgaW5kZXgpID09PSAnJScpIHtcbiAgICAgIHcgPSBnZXRJbmRleGVkU3R5bGUobm9kZSwgJ2JhY2tncm91bmQtd2lkdGgnLCAncGZWYWx1ZScsIGluZGV4KSAqIG5vZGVUVztcbiAgICB9IGVsc2Uge1xuICAgICAgdyA9IGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC13aWR0aCcsICdwZlZhbHVlJywgaW5kZXgpO1xuICAgIH1cbiAgfVxuICBpZiAoZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLWhlaWdodCcsICd2YWx1ZScsIGluZGV4KSAhPT0gJ2F1dG8nKSB7XG4gICAgaWYgKGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC1oZWlnaHQnLCAndW5pdHMnLCBpbmRleCkgPT09ICclJykge1xuICAgICAgaCA9IGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC1oZWlnaHQnLCAncGZWYWx1ZScsIGluZGV4KSAqIG5vZGVUSDtcbiAgICB9IGVsc2Uge1xuICAgICAgaCA9IGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC1oZWlnaHQnLCAncGZWYWx1ZScsIGluZGV4KTtcbiAgICB9XG4gIH1cbiAgaWYgKHcgPT09IDAgfHwgaCA9PT0gMCkge1xuICAgIHJldHVybjsgLy8gbm8gcG9pbnQgaW4gZHJhd2luZyBlbXB0eSBpbWFnZSAoYW5kIGNocm9tZSBpcyBicm9rZW4gaW4gdGhpcyBjYXNlKVxuICB9XG4gIGlmIChmaXQgPT09ICdjb250YWluJykge1xuICAgIHZhciBzY2FsZSA9IE1hdGgubWluKG5vZGVUVyAvIHcsIG5vZGVUSCAvIGgpO1xuICAgIHcgKj0gc2NhbGU7XG4gICAgaCAqPSBzY2FsZTtcbiAgfSBlbHNlIGlmIChmaXQgPT09ICdjb3ZlcicpIHtcbiAgICB2YXIgc2NhbGUgPSBNYXRoLm1heChub2RlVFcgLyB3LCBub2RlVEggLyBoKTtcbiAgICB3ICo9IHNjYWxlO1xuICAgIGggKj0gc2NhbGU7XG4gIH1cbiAgdmFyIHggPSBub2RlWCAtIG5vZGVUVyAvIDI7IC8vIGxlZnRcbiAgdmFyIHBvc1hVbml0cyA9IGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC1wb3NpdGlvbi14JywgJ3VuaXRzJywgaW5kZXgpO1xuICB2YXIgcG9zWFBmVmFsID0gZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLXBvc2l0aW9uLXgnLCAncGZWYWx1ZScsIGluZGV4KTtcbiAgaWYgKHBvc1hVbml0cyA9PT0gJyUnKSB7XG4gICAgeCArPSAobm9kZVRXIC0gdykgKiBwb3NYUGZWYWw7XG4gIH0gZWxzZSB7XG4gICAgeCArPSBwb3NYUGZWYWw7XG4gIH1cbiAgdmFyIG9mZlhVbml0cyA9IGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC1vZmZzZXQteCcsICd1bml0cycsIGluZGV4KTtcbiAgdmFyIG9mZlhQZlZhbCA9IGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC1vZmZzZXQteCcsICdwZlZhbHVlJywgaW5kZXgpO1xuICBpZiAob2ZmWFVuaXRzID09PSAnJScpIHtcbiAgICB4ICs9IChub2RlVFcgLSB3KSAqIG9mZlhQZlZhbDtcbiAgfSBlbHNlIHtcbiAgICB4ICs9IG9mZlhQZlZhbDtcbiAgfVxuICB2YXIgeSA9IG5vZGVZIC0gbm9kZVRIIC8gMjsgLy8gdG9wXG4gIHZhciBwb3NZVW5pdHMgPSBnZXRJbmRleGVkU3R5bGUobm9kZSwgJ2JhY2tncm91bmQtcG9zaXRpb24teScsICd1bml0cycsIGluZGV4KTtcbiAgdmFyIHBvc1lQZlZhbCA9IGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC1wb3NpdGlvbi15JywgJ3BmVmFsdWUnLCBpbmRleCk7XG4gIGlmIChwb3NZVW5pdHMgPT09ICclJykge1xuICAgIHkgKz0gKG5vZGVUSCAtIGgpICogcG9zWVBmVmFsO1xuICB9IGVsc2Uge1xuICAgIHkgKz0gcG9zWVBmVmFsO1xuICB9XG4gIHZhciBvZmZZVW5pdHMgPSBnZXRJbmRleGVkU3R5bGUobm9kZSwgJ2JhY2tncm91bmQtb2Zmc2V0LXknLCAndW5pdHMnLCBpbmRleCk7XG4gIHZhciBvZmZZUGZWYWwgPSBnZXRJbmRleGVkU3R5bGUobm9kZSwgJ2JhY2tncm91bmQtb2Zmc2V0LXknLCAncGZWYWx1ZScsIGluZGV4KTtcbiAgaWYgKG9mZllVbml0cyA9PT0gJyUnKSB7XG4gICAgeSArPSAobm9kZVRIIC0gaCkgKiBvZmZZUGZWYWw7XG4gIH0gZWxzZSB7XG4gICAgeSArPSBvZmZZUGZWYWw7XG4gIH1cbiAgaWYgKHJzLnBhdGhDYWNoZSkge1xuICAgIHggLT0gbm9kZVg7XG4gICAgeSAtPSBub2RlWTtcbiAgICBub2RlWCA9IDA7XG4gICAgbm9kZVkgPSAwO1xuICB9XG4gIHZhciBnQWxwaGEgPSBjb250ZXh0Lmdsb2JhbEFscGhhO1xuICBjb250ZXh0Lmdsb2JhbEFscGhhID0gaW1nT3BhY2l0eTtcbiAgdmFyIHNtb290aGluZ0VuYWJsZWQgPSByLmdldEltZ1Ntb290aGluZyhjb250ZXh0KTtcbiAgdmFyIGlzU21vb3RoaW5nU3dpdGNoZWQgPSBmYWxzZTtcbiAgaWYgKHNtb290aCA9PT0gJ25vJyAmJiBzbW9vdGhpbmdFbmFibGVkKSB7XG4gICAgci5zZXRJbWdTbW9vdGhpbmcoY29udGV4dCwgZmFsc2UpO1xuICAgIGlzU21vb3RoaW5nU3dpdGNoZWQgPSB0cnVlO1xuICB9IGVsc2UgaWYgKHNtb290aCA9PT0gJ3llcycgJiYgIXNtb290aGluZ0VuYWJsZWQpIHtcbiAgICByLnNldEltZ1Ntb290aGluZyhjb250ZXh0LCB0cnVlKTtcbiAgICBpc1Ntb290aGluZ1N3aXRjaGVkID0gdHJ1ZTtcbiAgfVxuICBpZiAocmVwZWF0ID09PSAnbm8tcmVwZWF0Jykge1xuICAgIGlmIChzaG91bGRDbGlwKSB7XG4gICAgICBjb250ZXh0LnNhdmUoKTtcbiAgICAgIGlmIChycy5wYXRoQ2FjaGUpIHtcbiAgICAgICAgY29udGV4dC5jbGlwKHJzLnBhdGhDYWNoZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByLm5vZGVTaGFwZXNbci5nZXROb2RlU2hhcGUobm9kZSldLmRyYXcoY29udGV4dCwgbm9kZVgsIG5vZGVZLCBub2RlVFcsIG5vZGVUSCwgY29ybmVyUmFkaXVzLCBycyk7XG4gICAgICAgIGNvbnRleHQuY2xpcCgpO1xuICAgICAgfVxuICAgIH1cbiAgICByLnNhZmVEcmF3SW1hZ2UoY29udGV4dCwgaW1nLCAwLCAwLCBpbWdXLCBpbWdILCB4LCB5LCB3LCBoKTtcbiAgICBpZiAoc2hvdWxkQ2xpcCkge1xuICAgICAgY29udGV4dC5yZXN0b3JlKCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBwYXR0ZXJuID0gY29udGV4dC5jcmVhdGVQYXR0ZXJuKGltZywgcmVwZWF0KTtcbiAgICBjb250ZXh0LmZpbGxTdHlsZSA9IHBhdHRlcm47XG4gICAgci5ub2RlU2hhcGVzW3IuZ2V0Tm9kZVNoYXBlKG5vZGUpXS5kcmF3KGNvbnRleHQsIG5vZGVYLCBub2RlWSwgbm9kZVRXLCBub2RlVEgsIGNvcm5lclJhZGl1cywgcnMpO1xuICAgIGNvbnRleHQudHJhbnNsYXRlKHgsIHkpO1xuICAgIGNvbnRleHQuZmlsbCgpO1xuICAgIGNvbnRleHQudHJhbnNsYXRlKC14LCAteSk7XG4gIH1cbiAgY29udGV4dC5nbG9iYWxBbHBoYSA9IGdBbHBoYTtcbiAgaWYgKGlzU21vb3RoaW5nU3dpdGNoZWQpIHtcbiAgICByLnNldEltZ1Ntb290aGluZyhjb250ZXh0LCBzbW9vdGhpbmdFbmFibGVkKTtcbiAgfVxufTtcblxudmFyIENScCQ3ID0ge307XG5DUnAkNy5lbGVUZXh0QmlnZ2VyVGhhbk1pbiA9IGZ1bmN0aW9uIChlbGUsIHNjYWxlKSB7XG4gIGlmICghc2NhbGUpIHtcbiAgICB2YXIgem9vbSA9IGVsZS5jeSgpLnpvb20oKTtcbiAgICB2YXIgcHhSYXRpbyA9IHRoaXMuZ2V0UGl4ZWxSYXRpbygpO1xuICAgIHZhciBsdmwgPSBNYXRoLmNlaWwobG9nMih6b29tICogcHhSYXRpbykpOyAvLyB0aGUgZWZmZWN0aXZlIHRleHR1cmUgbGV2ZWxcblxuICAgIHNjYWxlID0gTWF0aC5wb3coMiwgbHZsKTtcbiAgfVxuICB2YXIgY29tcHV0ZWRTaXplID0gZWxlLnBzdHlsZSgnZm9udC1zaXplJykucGZWYWx1ZSAqIHNjYWxlO1xuICB2YXIgbWluU2l6ZSA9IGVsZS5wc3R5bGUoJ21pbi16b29tZWQtZm9udC1zaXplJykucGZWYWx1ZTtcbiAgaWYgKGNvbXB1dGVkU2l6ZSA8IG1pblNpemUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59O1xuQ1JwJDcuZHJhd0VsZW1lbnRUZXh0ID0gZnVuY3Rpb24gKGNvbnRleHQsIGVsZSwgc2hpZnRUb09yaWdpbldpdGhCYiwgZm9yY2UsIHByZWZpeCkge1xuICB2YXIgdXNlRWxlT3BhY2l0eSA9IGFyZ3VtZW50cy5sZW5ndGggPiA1ICYmIGFyZ3VtZW50c1s1XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzVdIDogdHJ1ZTtcbiAgdmFyIHIgPSB0aGlzO1xuICBpZiAoZm9yY2UgPT0gbnVsbCkge1xuICAgIGlmICh1c2VFbGVPcGFjaXR5ICYmICFyLmVsZVRleHRCaWdnZXJUaGFuTWluKGVsZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH0gZWxzZSBpZiAoZm9yY2UgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChlbGUuaXNOb2RlKCkpIHtcbiAgICB2YXIgbGFiZWwgPSBlbGUucHN0eWxlKCdsYWJlbCcpO1xuICAgIGlmICghbGFiZWwgfHwgIWxhYmVsLnZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBqdXN0aWZpY2F0aW9uID0gci5nZXRMYWJlbEp1c3RpZmljYXRpb24oZWxlKTtcbiAgICB2YXIgaXNUZXh0TWV0cmljc0dseXBoID0gZWxlLnBzdHlsZSgndGV4dC1tZXRyaWNzJykuc3RyVmFsdWUgPT09ICdnbHlwaCc7XG4gICAgY29udGV4dC50ZXh0QWxpZ24gPSBqdXN0aWZpY2F0aW9uO1xuICAgIGNvbnRleHQudGV4dEJhc2VsaW5lID0gaXNUZXh0TWV0cmljc0dseXBoID8gJ2FscGhhYmV0aWMnIDogJ2JvdHRvbSc7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGJhZExpbmUgPSBlbGUuZWxlbWVudCgpLl9wcml2YXRlLnJzY3JhdGNoLmJhZExpbmU7XG4gICAgdmFyIF9sYWJlbCA9IGVsZS5wc3R5bGUoJ2xhYmVsJyk7XG4gICAgdmFyIHNyY0xhYmVsID0gZWxlLnBzdHlsZSgnc291cmNlLWxhYmVsJyk7XG4gICAgdmFyIHRndExhYmVsID0gZWxlLnBzdHlsZSgndGFyZ2V0LWxhYmVsJyk7XG4gICAgaWYgKGJhZExpbmUgfHwgKCFfbGFiZWwgfHwgIV9sYWJlbC52YWx1ZSkgJiYgKCFzcmNMYWJlbCB8fCAhc3JjTGFiZWwudmFsdWUpICYmICghdGd0TGFiZWwgfHwgIXRndExhYmVsLnZhbHVlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb250ZXh0LnRleHRBbGlnbiA9ICdjZW50ZXInO1xuICAgIGNvbnRleHQudGV4dEJhc2VsaW5lID0gJ2JvdHRvbSc7XG4gIH1cbiAgdmFyIGFwcGx5Um90YXRpb24gPSAhc2hpZnRUb09yaWdpbldpdGhCYjtcbiAgdmFyIGJiO1xuICBpZiAoc2hpZnRUb09yaWdpbldpdGhCYikge1xuICAgIGJiID0gc2hpZnRUb09yaWdpbldpdGhCYjtcbiAgICBjb250ZXh0LnRyYW5zbGF0ZSgtYmIueDEsIC1iYi55MSk7XG4gIH1cbiAgaWYgKHByZWZpeCA9PSBudWxsKSB7XG4gICAgci5kcmF3VGV4dChjb250ZXh0LCBlbGUsIG51bGwsIGFwcGx5Um90YXRpb24sIHVzZUVsZU9wYWNpdHkpO1xuICAgIGlmIChlbGUuaXNFZGdlKCkpIHtcbiAgICAgIHIuZHJhd1RleHQoY29udGV4dCwgZWxlLCAnc291cmNlJywgYXBwbHlSb3RhdGlvbiwgdXNlRWxlT3BhY2l0eSk7XG4gICAgICByLmRyYXdUZXh0KGNvbnRleHQsIGVsZSwgJ3RhcmdldCcsIGFwcGx5Um90YXRpb24sIHVzZUVsZU9wYWNpdHkpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByLmRyYXdUZXh0KGNvbnRleHQsIGVsZSwgcHJlZml4LCBhcHBseVJvdGF0aW9uLCB1c2VFbGVPcGFjaXR5KTtcbiAgfVxuICBpZiAoc2hpZnRUb09yaWdpbldpdGhCYikge1xuICAgIGNvbnRleHQudHJhbnNsYXRlKGJiLngxLCBiYi55MSk7XG4gIH1cbn07XG5DUnAkNy5nZXRGb250Q2FjaGUgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICB2YXIgY2FjaGU7XG4gIHRoaXMuZm9udENhY2hlcyA9IHRoaXMuZm9udENhY2hlcyB8fCBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmZvbnRDYWNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjYWNoZSA9IHRoaXMuZm9udENhY2hlc1tpXTtcbiAgICBpZiAoY2FjaGUuY29udGV4dCA9PT0gY29udGV4dCkge1xuICAgICAgcmV0dXJuIGNhY2hlO1xuICAgIH1cbiAgfVxuICBjYWNoZSA9IHtcbiAgICBjb250ZXh0OiBjb250ZXh0XG4gIH07XG4gIHRoaXMuZm9udENhY2hlcy5wdXNoKGNhY2hlKTtcbiAgcmV0dXJuIGNhY2hlO1xufTtcblxuLy8gc2V0IHVwIGNhbnZhcyBjb250ZXh0IHdpdGggZm9udFxuLy8gcmV0dXJucyB0cmFuc2Zvcm1lZCB0ZXh0IHN0cmluZ1xuQ1JwJDcuc2V0dXBUZXh0U3R5bGUgPSBmdW5jdGlvbiAoY29udGV4dCwgZWxlKSB7XG4gIHZhciB1c2VFbGVPcGFjaXR5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB0cnVlO1xuICAvLyBGb250IHN0eWxlXG4gIHZhciBsYWJlbFN0eWxlID0gZWxlLnBzdHlsZSgnZm9udC1zdHlsZScpLnN0clZhbHVlO1xuICB2YXIgbGFiZWxTaXplID0gZWxlLnBzdHlsZSgnZm9udC1zaXplJykucGZWYWx1ZSArICdweCc7XG4gIHZhciBsYWJlbEZhbWlseSA9IGVsZS5wc3R5bGUoJ2ZvbnQtZmFtaWx5Jykuc3RyVmFsdWU7XG4gIHZhciBsYWJlbFdlaWdodCA9IGVsZS5wc3R5bGUoJ2ZvbnQtd2VpZ2h0Jykuc3RyVmFsdWU7XG4gIHZhciBvcGFjaXR5ID0gdXNlRWxlT3BhY2l0eSA/IGVsZS5lZmZlY3RpdmVPcGFjaXR5KCkgKiBlbGUucHN0eWxlKCd0ZXh0LW9wYWNpdHknKS52YWx1ZSA6IDE7XG4gIHZhciBvdXRsaW5lT3BhY2l0eSA9IGVsZS5wc3R5bGUoJ3RleHQtb3V0bGluZS1vcGFjaXR5JykudmFsdWUgKiBvcGFjaXR5O1xuICB2YXIgY29sb3IgPSBlbGUucHN0eWxlKCdjb2xvcicpLnZhbHVlO1xuICB2YXIgb3V0bGluZUNvbG9yID0gZWxlLnBzdHlsZSgndGV4dC1vdXRsaW5lLWNvbG9yJykudmFsdWU7XG4gIGNvbnRleHQuZm9udCA9IGxhYmVsU3R5bGUgKyAnICcgKyBsYWJlbFdlaWdodCArICcgJyArIGxhYmVsU2l6ZSArICcgJyArIGxhYmVsRmFtaWx5O1xuICBjb250ZXh0LmxpbmVKb2luID0gJ3JvdW5kJzsgLy8gc28gdGV4dCBvdXRsaW5lcyBhcmVuJ3QgamFnZ2VkXG5cbiAgdGhpcy5jb2xvckZpbGxTdHlsZShjb250ZXh0LCBjb2xvclswXSwgY29sb3JbMV0sIGNvbG9yWzJdLCBvcGFjaXR5KTtcbiAgdGhpcy5jb2xvclN0cm9rZVN0eWxlKGNvbnRleHQsIG91dGxpbmVDb2xvclswXSwgb3V0bGluZUNvbG9yWzFdLCBvdXRsaW5lQ29sb3JbMl0sIG91dGxpbmVPcGFjaXR5KTtcbn07XG5mdW5jdGlvbiBjaXJjbGUoY3R4LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KSB7XG4gIHZhciBkaWFtZXRlciA9IE1hdGgubWluKHdpZHRoLCBoZWlnaHQpO1xuICB2YXIgcmFkaXVzID0gZGlhbWV0ZXIgLyAyO1xuICB2YXIgY2VudGVyWCA9IHggKyB3aWR0aCAvIDI7XG4gIHZhciBjZW50ZXJZID0geSArIGhlaWdodCAvIDI7XG4gIGN0eC5iZWdpblBhdGgoKTtcbiAgY3R4LmFyYyhjZW50ZXJYLCBjZW50ZXJZLCByYWRpdXMsIDAsIE1hdGguUEkgKiAyKTtcbiAgY3R4LmNsb3NlUGF0aCgpO1xufVxuZnVuY3Rpb24gcm91bmRSZWN0KGN0eCwgeCwgeSwgd2lkdGgsIGhlaWdodCkge1xuICB2YXIgcmFkaXVzID0gYXJndW1lbnRzLmxlbmd0aCA+IDUgJiYgYXJndW1lbnRzWzVdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNV0gOiA1O1xuICB2YXIgciA9IE1hdGgubWluKHJhZGl1cywgd2lkdGggLyAyLCBoZWlnaHQgLyAyKTsgLy8gcHJldmVudCBvdmVyZmxvd1xuICBjdHguYmVnaW5QYXRoKCk7XG4gIGN0eC5tb3ZlVG8oeCArIHIsIHkpO1xuICBjdHgubGluZVRvKHggKyB3aWR0aCAtIHIsIHkpO1xuICBjdHgucXVhZHJhdGljQ3VydmVUbyh4ICsgd2lkdGgsIHksIHggKyB3aWR0aCwgeSArIHIpO1xuICBjdHgubGluZVRvKHggKyB3aWR0aCwgeSArIGhlaWdodCAtIHIpO1xuICBjdHgucXVhZHJhdGljQ3VydmVUbyh4ICsgd2lkdGgsIHkgKyBoZWlnaHQsIHggKyB3aWR0aCAtIHIsIHkgKyBoZWlnaHQpO1xuICBjdHgubGluZVRvKHggKyByLCB5ICsgaGVpZ2h0KTtcbiAgY3R4LnF1YWRyYXRpY0N1cnZlVG8oeCwgeSArIGhlaWdodCwgeCwgeSArIGhlaWdodCAtIHIpO1xuICBjdHgubGluZVRvKHgsIHkgKyByKTtcbiAgY3R4LnF1YWRyYXRpY0N1cnZlVG8oeCwgeSwgeCArIHIsIHkpO1xuICBjdHguY2xvc2VQYXRoKCk7XG59XG5DUnAkNy5nZXRUZXh0QW5nbGUgPSBmdW5jdGlvbiAoZWxlLCBwcmVmaXgpIHtcbiAgdmFyIHRoZXRhO1xuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIHZhciByc2NyYXRjaCA9IF9wLnJzY3JhdGNoO1xuICB2YXIgcGRhc2ggPSBwcmVmaXggPyBwcmVmaXggKyAnLScgOiAnJztcbiAgdmFyIHJvdGF0aW9uID0gZWxlLnBzdHlsZShwZGFzaCArICd0ZXh0LXJvdGF0aW9uJyk7XG4gIGlmIChyb3RhdGlvbi5zdHJWYWx1ZSA9PT0gJ2F1dG9yb3RhdGUnKSB7XG4gICAgdmFyIHRleHRBbmdsZSA9IGdldFByZWZpeGVkUHJvcGVydHkocnNjcmF0Y2gsICdsYWJlbEFuZ2xlJywgcHJlZml4KTtcbiAgICB0aGV0YSA9IGVsZS5pc0VkZ2UoKSA/IHRleHRBbmdsZSA6IDA7XG4gIH0gZWxzZSBpZiAocm90YXRpb24uc3RyVmFsdWUgPT09ICdub25lJykge1xuICAgIHRoZXRhID0gMDtcbiAgfSBlbHNlIHtcbiAgICB0aGV0YSA9IHJvdGF0aW9uLnBmVmFsdWU7XG4gIH1cbiAgcmV0dXJuIHRoZXRhO1xufTtcbkNScCQ3LmRyYXdUZXh0ID0gZnVuY3Rpb24gKGNvbnRleHQsIGVsZSwgcHJlZml4KSB7XG4gIHZhciBhcHBseVJvdGF0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiB0cnVlO1xuICB2YXIgdXNlRWxlT3BhY2l0eSA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ICYmIGFyZ3VtZW50c1s0XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzRdIDogdHJ1ZTtcbiAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICB2YXIgcnNjcmF0Y2ggPSBfcC5yc2NyYXRjaDtcbiAgdmFyIHBhcmVudE9wYWNpdHkgPSB1c2VFbGVPcGFjaXR5ID8gZWxlLmVmZmVjdGl2ZU9wYWNpdHkoKSA6IDE7XG4gIGlmICh1c2VFbGVPcGFjaXR5ICYmIChwYXJlbnRPcGFjaXR5ID09PSAwIHx8IGVsZS5wc3R5bGUoJ3RleHQtb3BhY2l0eScpLnZhbHVlID09PSAwKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIHVzZSAnbWFpbicgYXMgYW4gYWxpYXMgZm9yIHRoZSBtYWluIGxhYmVsIChpLmUuIG51bGwgcHJlZml4KVxuICBpZiAocHJlZml4ID09PSAnbWFpbicpIHtcbiAgICBwcmVmaXggPSBudWxsO1xuICB9XG4gIHZhciB0ZXh0WCA9IGdldFByZWZpeGVkUHJvcGVydHkocnNjcmF0Y2gsICdsYWJlbFgnLCBwcmVmaXgpO1xuICB2YXIgdGV4dFkgPSBnZXRQcmVmaXhlZFByb3BlcnR5KHJzY3JhdGNoLCAnbGFiZWxZJywgcHJlZml4KTtcbiAgdmFyIG9yZ1RleHRYLCBvcmdUZXh0WTsgLy8gdXNlZCBmb3Igcm90YXRpb25cbiAgdmFyIHRleHQgPSB0aGlzLmdldExhYmVsVGV4dChlbGUsIHByZWZpeCk7XG4gIGlmICh0ZXh0ICE9IG51bGwgJiYgdGV4dCAhPT0gJycgJiYgIWlzTmFOKHRleHRYKSAmJiAhaXNOYU4odGV4dFkpKSB7XG4gICAgdGhpcy5zZXR1cFRleHRTdHlsZShjb250ZXh0LCBlbGUsIHVzZUVsZU9wYWNpdHkpO1xuICAgIHZhciBwZGFzaCA9IHByZWZpeCA/IHByZWZpeCArICctJyA6ICcnO1xuICAgIHZhciB0ZXh0VyA9IGdldFByZWZpeGVkUHJvcGVydHkocnNjcmF0Y2gsICdsYWJlbFdpZHRoJywgcHJlZml4KTtcbiAgICB2YXIgdGV4dEggPSBnZXRQcmVmaXhlZFByb3BlcnR5KHJzY3JhdGNoLCAnbGFiZWxIZWlnaHQnLCBwcmVmaXgpO1xuICAgIHZhciBsYWJlbEFjdHVhbERlc2NlbnQgPSBnZXRQcmVmaXhlZFByb3BlcnR5KHJzY3JhdGNoLCAnbGFiZWxBY3R1YWxEZXNjZW50JywgcHJlZml4KTtcbiAgICB2YXIgbWFyZ2luWCA9IGVsZS5wc3R5bGUocGRhc2ggKyAndGV4dC1tYXJnaW4teCcpLnBmVmFsdWU7XG4gICAgdmFyIG1hcmdpblkgPSBlbGUucHN0eWxlKHBkYXNoICsgJ3RleHQtbWFyZ2luLXknKS5wZlZhbHVlO1xuICAgIHZhciBpc0VkZ2UgPSBlbGUuaXNFZGdlKCk7XG4gICAgdmFyIGhhbGlnbiA9IGVsZS5wc3R5bGUoJ3RleHQtaGFsaWduJykudmFsdWU7XG4gICAgdmFyIHZhbGlnbiA9IGVsZS5wc3R5bGUoJ3RleHQtdmFsaWduJykudmFsdWU7XG4gICAgaWYgKGlzRWRnZSkge1xuICAgICAgaGFsaWduID0gJ2NlbnRlcic7XG4gICAgICB2YWxpZ24gPSAnY2VudGVyJztcbiAgICB9XG4gICAgdGV4dFggKz0gbWFyZ2luWDtcbiAgICB0ZXh0WSArPSBtYXJnaW5ZO1xuICAgIHZhciB0aGV0YTtcbiAgICBpZiAoIWFwcGx5Um90YXRpb24pIHtcbiAgICAgIHRoZXRhID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhldGEgPSB0aGlzLmdldFRleHRBbmdsZShlbGUsIHByZWZpeCk7XG4gICAgfVxuICAgIGlmICh0aGV0YSAhPT0gMCkge1xuICAgICAgb3JnVGV4dFggPSB0ZXh0WDtcbiAgICAgIG9yZ1RleHRZID0gdGV4dFk7XG4gICAgICBjb250ZXh0LnRyYW5zbGF0ZShvcmdUZXh0WCwgb3JnVGV4dFkpO1xuICAgICAgY29udGV4dC5yb3RhdGUodGhldGEpO1xuICAgICAgdGV4dFggPSAwO1xuICAgICAgdGV4dFkgPSAwO1xuICAgIH1cbiAgICB2YXIgYm94SGFsaWduID0gbGFiZWxIYWxpZ24oaGFsaWduKTtcbiAgICB2YXIgYm94VmFsaWduID0gbGFiZWxWYWxpZ24odmFsaWduKTtcbiAgICBzd2l0Y2ggKGJveFZhbGlnbikge1xuICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdjZW50ZXInOlxuICAgICAgICB0ZXh0WSArPSB0ZXh0SCAvIDI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgdGV4dFkgKz0gdGV4dEg7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB2YXIgYmFja2dyb3VuZE9wYWNpdHkgPSBlbGUucHN0eWxlKCd0ZXh0LWJhY2tncm91bmQtb3BhY2l0eScpLnZhbHVlO1xuICAgIHZhciBib3JkZXJPcGFjaXR5ID0gZWxlLnBzdHlsZSgndGV4dC1ib3JkZXItb3BhY2l0eScpLnZhbHVlO1xuICAgIHZhciB0ZXh0Qm9yZGVyV2lkdGggPSBlbGUucHN0eWxlKCd0ZXh0LWJvcmRlci13aWR0aCcpLnBmVmFsdWU7XG4gICAgdmFyIGJhY2tncm91bmRQYWRkaW5nID0gZWxlLnBzdHlsZSgndGV4dC1iYWNrZ3JvdW5kLXBhZGRpbmcnKS5wZlZhbHVlO1xuICAgIHZhciBzdHlsZVNoYXBlID0gZWxlLnBzdHlsZSgndGV4dC1iYWNrZ3JvdW5kLXNoYXBlJykuc3RyVmFsdWU7XG4gICAgdmFyIHJvdW5kZWQgPSBzdHlsZVNoYXBlID09PSAncm91bmQtcmVjdGFuZ2xlJyB8fCBzdHlsZVNoYXBlID09PSAncm91bmRyZWN0YW5nbGUnO1xuICAgIHZhciBjaXJjbGVkID0gc3R5bGVTaGFwZSA9PT0gJ2NpcmNsZSc7XG4gICAgdmFyIHJvdW5kUmFkaXVzID0gMjtcbiAgICBpZiAoYmFja2dyb3VuZE9wYWNpdHkgPiAwIHx8IHRleHRCb3JkZXJXaWR0aCA+IDAgJiYgYm9yZGVyT3BhY2l0eSA+IDApIHtcbiAgICAgIHZhciB0ZXh0RmlsbCA9IGNvbnRleHQuZmlsbFN0eWxlO1xuICAgICAgdmFyIHRleHRTdHJva2UgPSBjb250ZXh0LnN0cm9rZVN0eWxlO1xuICAgICAgdmFyIHRleHRMaW5lV2lkdGggPSBjb250ZXh0LmxpbmVXaWR0aDtcbiAgICAgIHZhciB0ZXh0QmFja2dyb3VuZENvbG9yID0gZWxlLnBzdHlsZSgndGV4dC1iYWNrZ3JvdW5kLWNvbG9yJykudmFsdWU7XG4gICAgICB2YXIgdGV4dEJvcmRlckNvbG9yID0gZWxlLnBzdHlsZSgndGV4dC1ib3JkZXItY29sb3InKS52YWx1ZTtcbiAgICAgIHZhciB0ZXh0Qm9yZGVyU3R5bGUgPSBlbGUucHN0eWxlKCd0ZXh0LWJvcmRlci1zdHlsZScpLnZhbHVlO1xuICAgICAgdmFyIGRvRmlsbCA9IGJhY2tncm91bmRPcGFjaXR5ID4gMDtcbiAgICAgIHZhciBkb1N0cm9rZSA9IHRleHRCb3JkZXJXaWR0aCA+IDAgJiYgYm9yZGVyT3BhY2l0eSA+IDA7XG4gICAgICB2YXIgYmdYID0gdGV4dFggLSBiYWNrZ3JvdW5kUGFkZGluZztcbiAgICAgIHN3aXRjaCAoYm94SGFsaWduKSB7XG4gICAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICAgIGJnWCAtPSB0ZXh0VztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnY2VudGVyJzpcbiAgICAgICAgICBiZ1ggLT0gdGV4dFcgLyAyO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgdmFyIGJnWSA9IHRleHRZIC0gdGV4dEggLSBiYWNrZ3JvdW5kUGFkZGluZztcbiAgICAgIHZhciBiZ1cgPSB0ZXh0VyArIDIgKiBiYWNrZ3JvdW5kUGFkZGluZztcbiAgICAgIHZhciBiZ0ggPSB0ZXh0SCArIDIgKiBiYWNrZ3JvdW5kUGFkZGluZztcbiAgICAgIGlmIChkb0ZpbGwpIHtcbiAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBcInJnYmEoXCIuY29uY2F0KHRleHRCYWNrZ3JvdW5kQ29sb3JbMF0sIFwiLFwiKS5jb25jYXQodGV4dEJhY2tncm91bmRDb2xvclsxXSwgXCIsXCIpLmNvbmNhdCh0ZXh0QmFja2dyb3VuZENvbG9yWzJdLCBcIixcIikuY29uY2F0KGJhY2tncm91bmRPcGFjaXR5ICogcGFyZW50T3BhY2l0eSwgXCIpXCIpO1xuICAgICAgfVxuICAgICAgaWYgKGRvU3Ryb2tlKSB7XG4gICAgICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBcInJnYmEoXCIuY29uY2F0KHRleHRCb3JkZXJDb2xvclswXSwgXCIsXCIpLmNvbmNhdCh0ZXh0Qm9yZGVyQ29sb3JbMV0sIFwiLFwiKS5jb25jYXQodGV4dEJvcmRlckNvbG9yWzJdLCBcIixcIikuY29uY2F0KGJvcmRlck9wYWNpdHkgKiBwYXJlbnRPcGFjaXR5LCBcIilcIik7XG4gICAgICAgIGNvbnRleHQubGluZVdpZHRoID0gdGV4dEJvcmRlcldpZHRoO1xuICAgICAgICBpZiAoY29udGV4dC5zZXRMaW5lRGFzaCkge1xuICAgICAgICAgIHN3aXRjaCAodGV4dEJvcmRlclN0eWxlKSB7XG4gICAgICAgICAgICBjYXNlICdkb3R0ZWQnOlxuICAgICAgICAgICAgICBjb250ZXh0LnNldExpbmVEYXNoKFsxLCAxXSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZGFzaGVkJzpcbiAgICAgICAgICAgICAgY29udGV4dC5zZXRMaW5lRGFzaChbNCwgMl0pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2RvdWJsZSc6XG4gICAgICAgICAgICAgIGNvbnRleHQubGluZVdpZHRoID0gdGV4dEJvcmRlcldpZHRoIC8gNDtcbiAgICAgICAgICAgICAgY29udGV4dC5zZXRMaW5lRGFzaChbXSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnc29saWQnOlxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgY29udGV4dC5zZXRMaW5lRGFzaChbXSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHJvdW5kZWQpIHtcbiAgICAgICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICAgICAgcm91bmRSZWN0KGNvbnRleHQsIGJnWCwgYmdZLCBiZ1csIGJnSCwgcm91bmRSYWRpdXMpO1xuICAgICAgfSBlbHNlIGlmIChjaXJjbGVkKSB7XG4gICAgICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgICAgIGNpcmNsZShjb250ZXh0LCBiZ1gsIGJnWSwgYmdXLCBiZ0gpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICAgICAgY29udGV4dC5yZWN0KGJnWCwgYmdZLCBiZ1csIGJnSCk7XG4gICAgICB9XG4gICAgICBpZiAoZG9GaWxsKSBjb250ZXh0LmZpbGwoKTtcbiAgICAgIGlmIChkb1N0cm9rZSkgY29udGV4dC5zdHJva2UoKTtcblxuICAgICAgLy8gRG91YmxlIGJvcmRlciBwYXNzIGZvciAnZG91YmxlJyBzdHlsZVxuICAgICAgaWYgKGRvU3Ryb2tlICYmIHRleHRCb3JkZXJTdHlsZSA9PT0gJ2RvdWJsZScpIHtcbiAgICAgICAgdmFyIHdoaXRlV2lkdGggPSB0ZXh0Qm9yZGVyV2lkdGggLyAyO1xuICAgICAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgICAgICBpZiAocm91bmRlZCkge1xuICAgICAgICAgIHJvdW5kUmVjdChjb250ZXh0LCBiZ1ggKyB3aGl0ZVdpZHRoLCBiZ1kgKyB3aGl0ZVdpZHRoLCBiZ1cgLSAyICogd2hpdGVXaWR0aCwgYmdIIC0gMiAqIHdoaXRlV2lkdGgsIHJvdW5kUmFkaXVzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb250ZXh0LnJlY3QoYmdYICsgd2hpdGVXaWR0aCwgYmdZICsgd2hpdGVXaWR0aCwgYmdXIC0gMiAqIHdoaXRlV2lkdGgsIGJnSCAtIDIgKiB3aGl0ZVdpZHRoKTtcbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0LnN0cm9rZSgpO1xuICAgICAgfVxuICAgICAgY29udGV4dC5maWxsU3R5bGUgPSB0ZXh0RmlsbDtcbiAgICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSB0ZXh0U3Ryb2tlO1xuICAgICAgY29udGV4dC5saW5lV2lkdGggPSB0ZXh0TGluZVdpZHRoO1xuICAgICAgaWYgKGNvbnRleHQuc2V0TGluZURhc2gpIGNvbnRleHQuc2V0TGluZURhc2goW10pO1xuICAgIH1cbiAgICB2YXIgbGluZVdpZHRoID0gMiAqIGVsZS5wc3R5bGUoJ3RleHQtb3V0bGluZS13aWR0aCcpLnBmVmFsdWU7IC8vICoyIGIvYyB0aGUgc3Ryb2tlIGlzIGRyYXduIGNlbnRyZWQgb24gdGhlIG1pZGRsZVxuXG4gICAgaWYgKGxpbmVXaWR0aCA+IDApIHtcbiAgICAgIGNvbnRleHQubGluZVdpZHRoID0gbGluZVdpZHRoO1xuICAgIH1cbiAgICB0ZXh0WSAtPSBsYWJlbEFjdHVhbERlc2NlbnQ7XG4gICAgaWYgKGVsZS5wc3R5bGUoJ3RleHQtd3JhcCcpLnZhbHVlID09PSAnd3JhcCcpIHtcbiAgICAgIHZhciBsaW5lcyA9IGdldFByZWZpeGVkUHJvcGVydHkocnNjcmF0Y2gsICdsYWJlbFdyYXBDYWNoZWRMaW5lcycsIHByZWZpeCk7XG4gICAgICB2YXIgbGluZUhlaWdodCA9IGdldFByZWZpeGVkUHJvcGVydHkocnNjcmF0Y2gsICdsYWJlbExpbmVIZWlnaHQnLCBwcmVmaXgpO1xuICAgICAgdmFyIGhhbGZUZXh0VyA9IHRleHRXIC8gMjtcbiAgICAgIHZhciBqdXN0aWZpY2F0aW9uID0gdGhpcy5nZXRMYWJlbEp1c3RpZmljYXRpb24oZWxlKTtcbiAgICAgIGlmIChqdXN0aWZpY2F0aW9uID09PSAnYXV0bycpIDsgZWxzZSBpZiAoYm94SGFsaWduID09PSAnbGVmdCcpIHtcbiAgICAgICAgLy8gYXV0byBqdXN0aWZpY2F0aW9uIDogcmlnaHRcbiAgICAgICAgaWYgKGp1c3RpZmljYXRpb24gPT09ICdsZWZ0Jykge1xuICAgICAgICAgIHRleHRYICs9IC10ZXh0VztcbiAgICAgICAgfSBlbHNlIGlmIChqdXN0aWZpY2F0aW9uID09PSAnY2VudGVyJykge1xuICAgICAgICAgIHRleHRYICs9IC1oYWxmVGV4dFc7XG4gICAgICAgIH0gLy8gZWxzZSBzYW1lIGFzIGF1dG9cbiAgICAgIH0gZWxzZSBpZiAoYm94SGFsaWduID09PSAnY2VudGVyJykge1xuICAgICAgICAvLyBhdXRvIGp1c3RmaWNhdGlvbiA6IGNlbnRlclxuICAgICAgICBpZiAoanVzdGlmaWNhdGlvbiA9PT0gJ2xlZnQnKSB7XG4gICAgICAgICAgdGV4dFggKz0gLWhhbGZUZXh0VztcbiAgICAgICAgfSBlbHNlIGlmIChqdXN0aWZpY2F0aW9uID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgdGV4dFggKz0gaGFsZlRleHRXO1xuICAgICAgICB9IC8vIGVsc2Ugc2FtZSBhcyBhdXRvXG4gICAgICB9IGVsc2UgaWYgKGJveEhhbGlnbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAvLyBhdXRvIGp1c3RpZmljYXRpb24gOiBsZWZ0XG4gICAgICAgIGlmIChqdXN0aWZpY2F0aW9uID09PSAnY2VudGVyJykge1xuICAgICAgICAgIHRleHRYICs9IGhhbGZUZXh0VztcbiAgICAgICAgfSBlbHNlIGlmIChqdXN0aWZpY2F0aW9uID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgdGV4dFggKz0gdGV4dFc7XG4gICAgICAgIH0gLy8gZWxzZSBzYW1lIGFzIGF1dG9cbiAgICAgIH1cbiAgICAgIHN3aXRjaCAoYm94VmFsaWduKSB7XG4gICAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgICAgdGV4dFkgLT0gKGxpbmVzLmxlbmd0aCAtIDEpICogbGluZUhlaWdodDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnY2VudGVyJzpcbiAgICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgICB0ZXh0WSAtPSAobGluZXMubGVuZ3RoIC0gMSkgKiBsaW5lSGVpZ2h0O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIgbCA9IDA7IGwgPCBsaW5lcy5sZW5ndGg7IGwrKykge1xuICAgICAgICBpZiAobGluZVdpZHRoID4gMCkge1xuICAgICAgICAgIGNvbnRleHQuc3Ryb2tlVGV4dChsaW5lc1tsXSwgdGV4dFgsIHRleHRZKTtcbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0LmZpbGxUZXh0KGxpbmVzW2xdLCB0ZXh0WCwgdGV4dFkpO1xuICAgICAgICB0ZXh0WSArPSBsaW5lSGVpZ2h0O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAobGluZVdpZHRoID4gMCkge1xuICAgICAgICBjb250ZXh0LnN0cm9rZVRleHQodGV4dCwgdGV4dFgsIHRleHRZKTtcbiAgICAgIH1cbiAgICAgIGNvbnRleHQuZmlsbFRleHQodGV4dCwgdGV4dFgsIHRleHRZKTtcbiAgICB9XG4gICAgaWYgKHRoZXRhICE9PSAwKSB7XG4gICAgICBjb250ZXh0LnJvdGF0ZSgtdGhldGEpO1xuICAgICAgY29udGV4dC50cmFuc2xhdGUoLW9yZ1RleHRYLCAtb3JnVGV4dFkpO1xuICAgIH1cbiAgfVxufTtcblxuLyogZ2xvYmFsIFBhdGgyRCAqL1xuXG52YXIgQ1JwJDYgPSB7fTtcbkNScCQ2LmRyYXdOb2RlID0gZnVuY3Rpb24gKGNvbnRleHQsIG5vZGUsIHNoaWZ0VG9PcmlnaW5XaXRoQmIpIHtcbiAgdmFyIGRyYXdMYWJlbCA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogdHJ1ZTtcbiAgdmFyIHNob3VsZERyYXdPdmVybGF5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgYXJndW1lbnRzWzRdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNF0gOiB0cnVlO1xuICB2YXIgc2hvdWxkRHJhd09wYWNpdHkgPSBhcmd1bWVudHMubGVuZ3RoID4gNSAmJiBhcmd1bWVudHNbNV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s1XSA6IHRydWU7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIG5vZGVXaWR0aCwgbm9kZUhlaWdodDtcbiAgdmFyIF9wID0gbm9kZS5fcHJpdmF0ZTtcbiAgdmFyIHJzID0gX3AucnNjcmF0Y2g7XG4gIHZhciBwb3MgPSBub2RlLnBvc2l0aW9uKCk7XG4gIGlmICghbnVtYmVyJDEocG9zLngpIHx8ICFudW1iZXIkMShwb3MueSkpIHtcbiAgICByZXR1cm47IC8vIGNhbid0IGRyYXcgbm9kZSB3aXRoIHVuZGVmaW5lZCBwb3NpdGlvblxuICB9XG4gIGlmIChzaG91bGREcmF3T3BhY2l0eSAmJiAhbm9kZS52aXNpYmxlKCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIGVsZU9wYWNpdHkgPSBzaG91bGREcmF3T3BhY2l0eSA/IG5vZGUuZWZmZWN0aXZlT3BhY2l0eSgpIDogMTtcbiAgdmFyIHVzZVBhdGhzID0gci51c2VQYXRocygpO1xuICB2YXIgcGF0aDtcbiAgdmFyIHBhdGhDYWNoZUhpdCA9IGZhbHNlO1xuICB2YXIgcGFkZGluZyA9IG5vZGUucGFkZGluZygpO1xuICBub2RlV2lkdGggPSBub2RlLndpZHRoKCkgKyAyICogcGFkZGluZztcbiAgbm9kZUhlaWdodCA9IG5vZGUuaGVpZ2h0KCkgKyAyICogcGFkZGluZztcblxuICAvL1xuICAvLyBzZXR1cCBzaGlmdFxuXG4gIHZhciBiYjtcbiAgaWYgKHNoaWZ0VG9PcmlnaW5XaXRoQmIpIHtcbiAgICBiYiA9IHNoaWZ0VG9PcmlnaW5XaXRoQmI7XG4gICAgY29udGV4dC50cmFuc2xhdGUoLWJiLngxLCAtYmIueTEpO1xuICB9XG5cbiAgLy9cbiAgLy8gbG9hZCBiZyBpbWFnZVxuXG4gIHZhciBiZ0ltZ1Byb3AgPSBub2RlLnBzdHlsZSgnYmFja2dyb3VuZC1pbWFnZScpO1xuICB2YXIgdXJscyA9IGJnSW1nUHJvcC52YWx1ZTtcbiAgdmFyIHVybERlZmluZWQgPSBuZXcgQXJyYXkodXJscy5sZW5ndGgpO1xuICB2YXIgaW1hZ2UgPSBuZXcgQXJyYXkodXJscy5sZW5ndGgpO1xuICB2YXIgbnVtSW1hZ2VzID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB1cmxzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHVybCA9IHVybHNbaV07XG4gICAgdmFyIGRlZmQgPSB1cmxEZWZpbmVkW2ldID0gdXJsICE9IG51bGwgJiYgdXJsICE9PSAnbm9uZSc7XG4gICAgaWYgKGRlZmQpIHtcbiAgICAgIHZhciBiZ0ltZ0Nyb3NzT3JpZ2luID0gbm9kZS5jeSgpLnN0eWxlKCkuZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLWltYWdlLWNyb3Nzb3JpZ2luJywgJ3ZhbHVlJywgaSk7XG4gICAgICBudW1JbWFnZXMrKztcblxuICAgICAgLy8gZ2V0IGltYWdlLCBhbmQgaWYgbm90IGxvYWRlZCB0aGVuIGFzayB0byByZWRyYXcgd2hlbiBsYXRlciBsb2FkZWRcbiAgICAgIGltYWdlW2ldID0gci5nZXRDYWNoZWRJbWFnZSh1cmwsIGJnSW1nQ3Jvc3NPcmlnaW4sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3AuYmFja2dyb3VuZFRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgICAgIG5vZGUuZW1pdEFuZE5vdGlmeSgnYmFja2dyb3VuZCcpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLy9cbiAgLy8gc2V0dXAgc3R5bGVzXG5cbiAgdmFyIGRhcmtuZXNzID0gbm9kZS5wc3R5bGUoJ2JhY2tncm91bmQtYmxhY2tlbicpLnZhbHVlO1xuICB2YXIgYm9yZGVyV2lkdGggPSBub2RlLnBzdHlsZSgnYm9yZGVyLXdpZHRoJykucGZWYWx1ZTtcbiAgdmFyIGJnT3BhY2l0eSA9IG5vZGUucHN0eWxlKCdiYWNrZ3JvdW5kLW9wYWNpdHknKS52YWx1ZSAqIGVsZU9wYWNpdHk7XG4gIHZhciBib3JkZXJDb2xvciA9IG5vZGUucHN0eWxlKCdib3JkZXItY29sb3InKS52YWx1ZTtcbiAgdmFyIGJvcmRlclN0eWxlID0gbm9kZS5wc3R5bGUoJ2JvcmRlci1zdHlsZScpLnZhbHVlO1xuICB2YXIgYm9yZGVySm9pbiA9IG5vZGUucHN0eWxlKCdib3JkZXItam9pbicpLnZhbHVlO1xuICB2YXIgYm9yZGVyQ2FwID0gbm9kZS5wc3R5bGUoJ2JvcmRlci1jYXAnKS52YWx1ZTtcbiAgdmFyIGJvcmRlclBvc2l0aW9uID0gbm9kZS5wc3R5bGUoJ2JvcmRlci1wb3NpdGlvbicpLnZhbHVlO1xuICB2YXIgYm9yZGVyUGF0dGVybiA9IG5vZGUucHN0eWxlKCdib3JkZXItZGFzaC1wYXR0ZXJuJykucGZWYWx1ZTtcbiAgdmFyIGJvcmRlck9mZnNldCA9IG5vZGUucHN0eWxlKCdib3JkZXItZGFzaC1vZmZzZXQnKS5wZlZhbHVlO1xuICB2YXIgYm9yZGVyT3BhY2l0eSA9IG5vZGUucHN0eWxlKCdib3JkZXItb3BhY2l0eScpLnZhbHVlICogZWxlT3BhY2l0eTtcbiAgdmFyIG91dGxpbmVXaWR0aCA9IG5vZGUucHN0eWxlKCdvdXRsaW5lLXdpZHRoJykucGZWYWx1ZTtcbiAgdmFyIG91dGxpbmVDb2xvciA9IG5vZGUucHN0eWxlKCdvdXRsaW5lLWNvbG9yJykudmFsdWU7XG4gIHZhciBvdXRsaW5lU3R5bGUgPSBub2RlLnBzdHlsZSgnb3V0bGluZS1zdHlsZScpLnZhbHVlO1xuICB2YXIgb3V0bGluZU9wYWNpdHkgPSBub2RlLnBzdHlsZSgnb3V0bGluZS1vcGFjaXR5JykudmFsdWUgKiBlbGVPcGFjaXR5O1xuICB2YXIgb3V0bGluZU9mZnNldCA9IG5vZGUucHN0eWxlKCdvdXRsaW5lLW9mZnNldCcpLnZhbHVlO1xuICB2YXIgY29ybmVyUmFkaXVzID0gbm9kZS5wc3R5bGUoJ2Nvcm5lci1yYWRpdXMnKS52YWx1ZTtcbiAgaWYgKGNvcm5lclJhZGl1cyAhPT0gJ2F1dG8nKSBjb3JuZXJSYWRpdXMgPSBub2RlLnBzdHlsZSgnY29ybmVyLXJhZGl1cycpLnBmVmFsdWU7XG4gIHZhciBzZXR1cFNoYXBlQ29sb3IgPSBmdW5jdGlvbiBzZXR1cFNoYXBlQ29sb3IoKSB7XG4gICAgdmFyIGJnT3B5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBiZ09wYWNpdHk7XG4gICAgci5lbGVGaWxsU3R5bGUoY29udGV4dCwgbm9kZSwgYmdPcHkpO1xuICB9O1xuICB2YXIgc2V0dXBCb3JkZXJDb2xvciA9IGZ1bmN0aW9uIHNldHVwQm9yZGVyQ29sb3IoKSB7XG4gICAgdmFyIGJkck9weSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogYm9yZGVyT3BhY2l0eTtcbiAgICByLmNvbG9yU3Ryb2tlU3R5bGUoY29udGV4dCwgYm9yZGVyQ29sb3JbMF0sIGJvcmRlckNvbG9yWzFdLCBib3JkZXJDb2xvclsyXSwgYmRyT3B5KTtcbiAgfTtcbiAgdmFyIHNldHVwT3V0bGluZUNvbG9yID0gZnVuY3Rpb24gc2V0dXBPdXRsaW5lQ29sb3IoKSB7XG4gICAgdmFyIG90bG5PcHkgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IG91dGxpbmVPcGFjaXR5O1xuICAgIHIuY29sb3JTdHJva2VTdHlsZShjb250ZXh0LCBvdXRsaW5lQ29sb3JbMF0sIG91dGxpbmVDb2xvclsxXSwgb3V0bGluZUNvbG9yWzJdLCBvdGxuT3B5KTtcbiAgfTtcblxuICAvL1xuICAvLyBzZXR1cCBzaGFwZVxuXG4gIHZhciBnZXRQYXRoID0gZnVuY3Rpb24gZ2V0UGF0aCh3aWR0aCwgaGVpZ2h0LCBzaGFwZSwgcG9pbnRzKSB7XG4gICAgdmFyIHBhdGhDYWNoZSA9IHIubm9kZVBhdGhDYWNoZSA9IHIubm9kZVBhdGhDYWNoZSB8fCBbXTtcbiAgICB2YXIga2V5ID0gaGFzaFN0cmluZ3Moc2hhcGUgPT09ICdwb2x5Z29uJyA/IHNoYXBlICsgJywnICsgcG9pbnRzLmpvaW4oJywnKSA6IHNoYXBlLCAnJyArIGhlaWdodCwgJycgKyB3aWR0aCwgJycgKyBjb3JuZXJSYWRpdXMpO1xuICAgIHZhciBjYWNoZWRQYXRoID0gcGF0aENhY2hlW2tleV07XG4gICAgdmFyIHBhdGg7XG4gICAgdmFyIGNhY2hlSGl0ID0gZmFsc2U7XG4gICAgaWYgKGNhY2hlZFBhdGggIT0gbnVsbCkge1xuICAgICAgcGF0aCA9IGNhY2hlZFBhdGg7XG4gICAgICBjYWNoZUhpdCA9IHRydWU7XG4gICAgICBycy5wYXRoQ2FjaGUgPSBwYXRoO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXRoID0gbmV3IFBhdGgyRCgpO1xuICAgICAgcGF0aENhY2hlW2tleV0gPSBycy5wYXRoQ2FjaGUgPSBwYXRoO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcGF0aDogcGF0aCxcbiAgICAgIGNhY2hlSGl0OiBjYWNoZUhpdFxuICAgIH07XG4gIH07XG4gIHZhciBzdHlsZVNoYXBlID0gbm9kZS5wc3R5bGUoJ3NoYXBlJykuc3RyVmFsdWU7XG4gIHZhciBzaGFwZVB0cyA9IG5vZGUucHN0eWxlKCdzaGFwZS1wb2x5Z29uLXBvaW50cycpLnBmVmFsdWU7XG4gIGlmICh1c2VQYXRocykge1xuICAgIGNvbnRleHQudHJhbnNsYXRlKHBvcy54LCBwb3MueSk7XG4gICAgdmFyIHNoYXBlUGF0aCA9IGdldFBhdGgobm9kZVdpZHRoLCBub2RlSGVpZ2h0LCBzdHlsZVNoYXBlLCBzaGFwZVB0cyk7XG4gICAgcGF0aCA9IHNoYXBlUGF0aC5wYXRoO1xuICAgIHBhdGhDYWNoZUhpdCA9IHNoYXBlUGF0aC5jYWNoZUhpdDtcbiAgfVxuICB2YXIgZHJhd1NoYXBlID0gZnVuY3Rpb24gZHJhd1NoYXBlKCkge1xuICAgIGlmICghcGF0aENhY2hlSGl0KSB7XG4gICAgICB2YXIgbnBvcyA9IHBvcztcbiAgICAgIGlmICh1c2VQYXRocykge1xuICAgICAgICBucG9zID0ge1xuICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgeTogMFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgci5ub2RlU2hhcGVzW3IuZ2V0Tm9kZVNoYXBlKG5vZGUpXS5kcmF3KHBhdGggfHwgY29udGV4dCwgbnBvcy54LCBucG9zLnksIG5vZGVXaWR0aCwgbm9kZUhlaWdodCwgY29ybmVyUmFkaXVzLCBycyk7XG4gICAgfVxuICAgIGlmICh1c2VQYXRocykge1xuICAgICAgY29udGV4dC5maWxsKHBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250ZXh0LmZpbGwoKTtcbiAgICB9XG4gIH07XG4gIHZhciBkcmF3SW1hZ2VzID0gZnVuY3Rpb24gZHJhd0ltYWdlcygpIHtcbiAgICB2YXIgbm9kZU9wYWNpdHkgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGVsZU9wYWNpdHk7XG4gICAgdmFyIGluc2lkZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdHJ1ZTtcbiAgICB2YXIgcHJldkJnaW5nID0gX3AuYmFja2dyb3VuZGluZztcbiAgICB2YXIgdG90YWxDb21wbGV0ZWQgPSAwO1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBpbWFnZS5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBiZ0NvbnRhaW5tZW50ID0gbm9kZS5jeSgpLnN0eWxlKCkuZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLWltYWdlLWNvbnRhaW5tZW50JywgJ3ZhbHVlJywgX2kpO1xuICAgICAgaWYgKGluc2lkZSAmJiBiZ0NvbnRhaW5tZW50ID09PSAnb3ZlcicgfHwgIWluc2lkZSAmJiBiZ0NvbnRhaW5tZW50ID09PSAnaW5zaWRlJykge1xuICAgICAgICB0b3RhbENvbXBsZXRlZCsrO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICh1cmxEZWZpbmVkW19pXSAmJiBpbWFnZVtfaV0uY29tcGxldGUgJiYgIWltYWdlW19pXS5lcnJvcikge1xuICAgICAgICB0b3RhbENvbXBsZXRlZCsrO1xuICAgICAgICByLmRyYXdJbnNjcmliZWRJbWFnZShjb250ZXh0LCBpbWFnZVtfaV0sIG5vZGUsIF9pLCBub2RlT3BhY2l0eSk7XG4gICAgICB9XG4gICAgfVxuICAgIF9wLmJhY2tncm91bmRpbmcgPSAhKHRvdGFsQ29tcGxldGVkID09PSBudW1JbWFnZXMpO1xuICAgIGlmIChwcmV2QmdpbmcgIT09IF9wLmJhY2tncm91bmRpbmcpIHtcbiAgICAgIC8vIHVwZGF0ZSBzdHlsZSBiL2MgOmJhY2tncm91bmRpbmcgc3RhdGUgY2hhbmdlZFxuICAgICAgbm9kZS51cGRhdGVTdHlsZShmYWxzZSk7XG4gICAgfVxuICB9O1xuICB2YXIgZHJhd1BpZSA9IGZ1bmN0aW9uIGRyYXdQaWUoKSB7XG4gICAgdmFyIHJlZHJhd1NoYXBlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBmYWxzZTtcbiAgICB2YXIgcGllT3BhY2l0eSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZWxlT3BhY2l0eTtcbiAgICBpZiAoci5oYXNQaWUobm9kZSkpIHtcbiAgICAgIHIuZHJhd1BpZShjb250ZXh0LCBub2RlLCBwaWVPcGFjaXR5KTtcblxuICAgICAgLy8gcmVkcmF3L3Jlc3RvcmUgcGF0aCBpZiBzdGVwcyBhZnRlciBwaWUgbmVlZCBpdFxuICAgICAgaWYgKHJlZHJhd1NoYXBlKSB7XG4gICAgICAgIGlmICghdXNlUGF0aHMpIHtcbiAgICAgICAgICByLm5vZGVTaGFwZXNbci5nZXROb2RlU2hhcGUobm9kZSldLmRyYXcoY29udGV4dCwgcG9zLngsIHBvcy55LCBub2RlV2lkdGgsIG5vZGVIZWlnaHQsIGNvcm5lclJhZGl1cywgcnMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuICB2YXIgZHJhd1N0cmlwZSA9IGZ1bmN0aW9uIGRyYXdTdHJpcGUoKSB7XG4gICAgdmFyIHJlZHJhd1NoYXBlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBmYWxzZTtcbiAgICB2YXIgc3RyaXBlT3BhY2l0eSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZWxlT3BhY2l0eTtcbiAgICBpZiAoci5oYXNTdHJpcGUobm9kZSkpIHtcbiAgICAgIGNvbnRleHQuc2F2ZSgpO1xuICAgICAgaWYgKHVzZVBhdGhzKSB7XG4gICAgICAgIGNvbnRleHQuY2xpcChycy5wYXRoQ2FjaGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgci5ub2RlU2hhcGVzW3IuZ2V0Tm9kZVNoYXBlKG5vZGUpXS5kcmF3KGNvbnRleHQsIHBvcy54LCBwb3MueSwgbm9kZVdpZHRoLCBub2RlSGVpZ2h0LCBjb3JuZXJSYWRpdXMsIHJzKTtcbiAgICAgICAgY29udGV4dC5jbGlwKCk7XG4gICAgICB9XG4gICAgICByLmRyYXdTdHJpcGUoY29udGV4dCwgbm9kZSwgc3RyaXBlT3BhY2l0eSk7XG4gICAgICBjb250ZXh0LnJlc3RvcmUoKTtcblxuICAgICAgLy8gcmVkcmF3L3Jlc3RvcmUgcGF0aCBpZiBzdGVwcyBhZnRlciBzdHJpcGVzIG5lZWQgaXRcbiAgICAgIGlmIChyZWRyYXdTaGFwZSkge1xuICAgICAgICBpZiAoIXVzZVBhdGhzKSB7XG4gICAgICAgICAgci5ub2RlU2hhcGVzW3IuZ2V0Tm9kZVNoYXBlKG5vZGUpXS5kcmF3KGNvbnRleHQsIHBvcy54LCBwb3MueSwgbm9kZVdpZHRoLCBub2RlSGVpZ2h0LCBjb3JuZXJSYWRpdXMsIHJzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgdmFyIGRhcmtlbiA9IGZ1bmN0aW9uIGRhcmtlbigpIHtcbiAgICB2YXIgZGFya2VuT3BhY2l0eSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZWxlT3BhY2l0eTtcbiAgICB2YXIgb3BhY2l0eSA9IChkYXJrbmVzcyA+IDAgPyBkYXJrbmVzcyA6IC1kYXJrbmVzcykgKiBkYXJrZW5PcGFjaXR5O1xuICAgIHZhciBjID0gZGFya25lc3MgPiAwID8gMCA6IDI1NTtcbiAgICBpZiAoZGFya25lc3MgIT09IDApIHtcbiAgICAgIHIuY29sb3JGaWxsU3R5bGUoY29udGV4dCwgYywgYywgYywgb3BhY2l0eSk7XG4gICAgICBpZiAodXNlUGF0aHMpIHtcbiAgICAgICAgY29udGV4dC5maWxsKHBhdGgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGV4dC5maWxsKCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICB2YXIgZHJhd0JvcmRlciA9IGZ1bmN0aW9uIGRyYXdCb3JkZXIoKSB7XG4gICAgaWYgKGJvcmRlcldpZHRoID4gMCkge1xuICAgICAgY29udGV4dC5saW5lV2lkdGggPSBib3JkZXJXaWR0aDtcbiAgICAgIGNvbnRleHQubGluZUNhcCA9IGJvcmRlckNhcDtcbiAgICAgIGNvbnRleHQubGluZUpvaW4gPSBib3JkZXJKb2luO1xuICAgICAgaWYgKGNvbnRleHQuc2V0TGluZURhc2gpIHtcbiAgICAgICAgLy8gZm9yIHZlcnkgb3V0b2ZkYXRlIGJyb3dzZXJzXG4gICAgICAgIHN3aXRjaCAoYm9yZGVyU3R5bGUpIHtcbiAgICAgICAgICBjYXNlICdkb3R0ZWQnOlxuICAgICAgICAgICAgY29udGV4dC5zZXRMaW5lRGFzaChbMSwgMV0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnZGFzaGVkJzpcbiAgICAgICAgICAgIGNvbnRleHQuc2V0TGluZURhc2goYm9yZGVyUGF0dGVybik7XG4gICAgICAgICAgICBjb250ZXh0LmxpbmVEYXNoT2Zmc2V0ID0gYm9yZGVyT2Zmc2V0O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnc29saWQnOlxuICAgICAgICAgIGNhc2UgJ2RvdWJsZSc6XG4gICAgICAgICAgICBjb250ZXh0LnNldExpbmVEYXNoKFtdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoYm9yZGVyUG9zaXRpb24gIT09ICdjZW50ZXInKSB7XG4gICAgICAgIGNvbnRleHQuc2F2ZSgpO1xuICAgICAgICBjb250ZXh0LmxpbmVXaWR0aCAqPSAyO1xuICAgICAgICBpZiAoYm9yZGVyUG9zaXRpb24gPT09ICdpbnNpZGUnKSB7XG4gICAgICAgICAgdXNlUGF0aHMgPyBjb250ZXh0LmNsaXAocGF0aCkgOiBjb250ZXh0LmNsaXAoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgcmVnaW9uID0gbmV3IFBhdGgyRCgpO1xuICAgICAgICAgIHJlZ2lvbi5yZWN0KC1ub2RlV2lkdGggLyAyIC0gYm9yZGVyV2lkdGgsIC1ub2RlSGVpZ2h0IC8gMiAtIGJvcmRlcldpZHRoLCBub2RlV2lkdGggKyAyICogYm9yZGVyV2lkdGgsIG5vZGVIZWlnaHQgKyAyICogYm9yZGVyV2lkdGgpO1xuICAgICAgICAgIHJlZ2lvbi5hZGRQYXRoKHBhdGgpO1xuICAgICAgICAgIGNvbnRleHQuY2xpcChyZWdpb24sICdldmVub2RkJyk7XG4gICAgICAgIH1cbiAgICAgICAgdXNlUGF0aHMgPyBjb250ZXh0LnN0cm9rZShwYXRoKSA6IGNvbnRleHQuc3Ryb2tlKCk7XG4gICAgICAgIGNvbnRleHQucmVzdG9yZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdXNlUGF0aHMgPyBjb250ZXh0LnN0cm9rZShwYXRoKSA6IGNvbnRleHQuc3Ryb2tlKCk7XG4gICAgICB9XG4gICAgICBpZiAoYm9yZGVyU3R5bGUgPT09ICdkb3VibGUnKSB7XG4gICAgICAgIGNvbnRleHQubGluZVdpZHRoID0gYm9yZGVyV2lkdGggLyAzO1xuICAgICAgICB2YXIgZ2NvID0gY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb247XG4gICAgICAgIGNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ2Rlc3RpbmF0aW9uLW91dCc7XG4gICAgICAgIGlmICh1c2VQYXRocykge1xuICAgICAgICAgIGNvbnRleHQuc3Ryb2tlKHBhdGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnRleHQuc3Ryb2tlKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBnY287XG4gICAgICB9XG5cbiAgICAgIC8vIHJlc2V0IGluIGNhc2Ugd2UgY2hhbmdlZCB0aGUgYm9yZGVyIHN0eWxlXG4gICAgICBpZiAoY29udGV4dC5zZXRMaW5lRGFzaCkge1xuICAgICAgICAvLyBmb3IgdmVyeSBvdXRvZmRhdGUgYnJvd3NlcnNcbiAgICAgICAgY29udGV4dC5zZXRMaW5lRGFzaChbXSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICB2YXIgZHJhd091dGxpbmUgPSBmdW5jdGlvbiBkcmF3T3V0bGluZSgpIHtcbiAgICBpZiAob3V0bGluZVdpZHRoID4gMCkge1xuICAgICAgY29udGV4dC5saW5lV2lkdGggPSBvdXRsaW5lV2lkdGg7XG4gICAgICBjb250ZXh0LmxpbmVDYXAgPSAnYnV0dCc7XG4gICAgICBpZiAoY29udGV4dC5zZXRMaW5lRGFzaCkge1xuICAgICAgICAvLyBmb3IgdmVyeSBvdXRvZmRhdGUgYnJvd3NlcnNcbiAgICAgICAgc3dpdGNoIChvdXRsaW5lU3R5bGUpIHtcbiAgICAgICAgICBjYXNlICdkb3R0ZWQnOlxuICAgICAgICAgICAgY29udGV4dC5zZXRMaW5lRGFzaChbMSwgMV0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnZGFzaGVkJzpcbiAgICAgICAgICAgIGNvbnRleHQuc2V0TGluZURhc2goWzQsIDJdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ3NvbGlkJzpcbiAgICAgICAgICBjYXNlICdkb3VibGUnOlxuICAgICAgICAgICAgY29udGV4dC5zZXRMaW5lRGFzaChbXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIG5wb3MgPSBwb3M7XG4gICAgICBpZiAodXNlUGF0aHMpIHtcbiAgICAgICAgbnBvcyA9IHtcbiAgICAgICAgICB4OiAwLFxuICAgICAgICAgIHk6IDBcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHZhciBzaGFwZSA9IHIuZ2V0Tm9kZVNoYXBlKG5vZGUpO1xuICAgICAgdmFyIGJXaWR0aCA9IGJvcmRlcldpZHRoO1xuICAgICAgaWYgKGJvcmRlclBvc2l0aW9uID09PSAnaW5zaWRlJykgYldpZHRoID0gMDtcbiAgICAgIGlmIChib3JkZXJQb3NpdGlvbiA9PT0gJ291dHNpZGUnKSBiV2lkdGggKj0gMjtcbiAgICAgIHZhciBzY2FsZVggPSAobm9kZVdpZHRoICsgYldpZHRoICsgKG91dGxpbmVXaWR0aCArIG91dGxpbmVPZmZzZXQpKSAvIG5vZGVXaWR0aDtcbiAgICAgIHZhciBzY2FsZVkgPSAobm9kZUhlaWdodCArIGJXaWR0aCArIChvdXRsaW5lV2lkdGggKyBvdXRsaW5lT2Zmc2V0KSkgLyBub2RlSGVpZ2h0O1xuICAgICAgdmFyIHNXaWR0aCA9IG5vZGVXaWR0aCAqIHNjYWxlWDtcbiAgICAgIHZhciBzSGVpZ2h0ID0gbm9kZUhlaWdodCAqIHNjYWxlWTtcbiAgICAgIHZhciBwb2ludHMgPSByLm5vZGVTaGFwZXNbc2hhcGVdLnBvaW50cztcbiAgICAgIHZhciBfcGF0aDtcbiAgICAgIGlmICh1c2VQYXRocykge1xuICAgICAgICB2YXIgb3V0bGluZVBhdGggPSBnZXRQYXRoKHNXaWR0aCwgc0hlaWdodCwgc2hhcGUsIHBvaW50cyk7XG4gICAgICAgIF9wYXRoID0gb3V0bGluZVBhdGgucGF0aDtcbiAgICAgIH1cblxuICAgICAgLy8gZHJhdyB0aGUgb3V0bGluZSBwYXRoLCBlaXRoZXIgYnkgdXNpbmcgZXhwYW5kZWQgcG9pbnRzIG9yIGJ5IHNjYWxpbmcgXG4gICAgICAvLyB0aGUgZGltZW5zaW9ucywgZGVwZW5kaW5nIG9uIHNoYXBlXG4gICAgICBpZiAoc2hhcGUgPT09IFwiZWxsaXBzZVwiKSB7XG4gICAgICAgIHIuZHJhd0VsbGlwc2VQYXRoKF9wYXRoIHx8IGNvbnRleHQsIG5wb3MueCwgbnBvcy55LCBzV2lkdGgsIHNIZWlnaHQpO1xuICAgICAgfSBlbHNlIGlmIChbJ3JvdW5kLWRpYW1vbmQnLCAncm91bmQtaGVwdGFnb24nLCAncm91bmQtaGV4YWdvbicsICdyb3VuZC1vY3RhZ29uJywgJ3JvdW5kLXBlbnRhZ29uJywgJ3JvdW5kLXBvbHlnb24nLCAncm91bmQtdHJpYW5nbGUnLCAncm91bmQtdGFnJ10uaW5jbHVkZXMoc2hhcGUpKSB7XG4gICAgICAgIHZhciBzTXVsdCA9IDA7XG4gICAgICAgIHZhciBvZmZzZXRYID0gMDtcbiAgICAgICAgdmFyIG9mZnNldFkgPSAwO1xuICAgICAgICBpZiAoc2hhcGUgPT09ICdyb3VuZC1kaWFtb25kJykge1xuICAgICAgICAgIHNNdWx0ID0gKGJXaWR0aCArIG91dGxpbmVPZmZzZXQgKyBvdXRsaW5lV2lkdGgpICogMS40O1xuICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAncm91bmQtaGVwdGFnb24nKSB7XG4gICAgICAgICAgc011bHQgPSAoYldpZHRoICsgb3V0bGluZU9mZnNldCArIG91dGxpbmVXaWR0aCkgKiAxLjA3NTtcbiAgICAgICAgICBvZmZzZXRZID0gLShiV2lkdGggLyAyICsgb3V0bGluZU9mZnNldCArIG91dGxpbmVXaWR0aCkgLyAzNTtcbiAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gJ3JvdW5kLWhleGFnb24nKSB7XG4gICAgICAgICAgc011bHQgPSAoYldpZHRoICsgb3V0bGluZU9mZnNldCArIG91dGxpbmVXaWR0aCkgKiAxLjEyO1xuICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAncm91bmQtcGVudGFnb24nKSB7XG4gICAgICAgICAgc011bHQgPSAoYldpZHRoICsgb3V0bGluZU9mZnNldCArIG91dGxpbmVXaWR0aCkgKiAxLjEzO1xuICAgICAgICAgIG9mZnNldFkgPSAtKGJXaWR0aCAvIDIgKyBvdXRsaW5lT2Zmc2V0ICsgb3V0bGluZVdpZHRoKSAvIDE1O1xuICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAncm91bmQtdGFnJykge1xuICAgICAgICAgIHNNdWx0ID0gKGJXaWR0aCArIG91dGxpbmVPZmZzZXQgKyBvdXRsaW5lV2lkdGgpICogMS4xMjtcbiAgICAgICAgICBvZmZzZXRYID0gKGJXaWR0aCAvIDIgKyBvdXRsaW5lV2lkdGggKyBvdXRsaW5lT2Zmc2V0KSAqIC4wNztcbiAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gJ3JvdW5kLXRyaWFuZ2xlJykge1xuICAgICAgICAgIHNNdWx0ID0gKGJXaWR0aCArIG91dGxpbmVPZmZzZXQgKyBvdXRsaW5lV2lkdGgpICogKE1hdGguUEkgLyAyKTtcbiAgICAgICAgICBvZmZzZXRZID0gLShiV2lkdGggKyBvdXRsaW5lT2Zmc2V0IC8gMiArIG91dGxpbmVXaWR0aCkgLyBNYXRoLlBJO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzTXVsdCAhPT0gMCkge1xuICAgICAgICAgIHNjYWxlWCA9IChub2RlV2lkdGggKyBzTXVsdCkgLyBub2RlV2lkdGg7XG4gICAgICAgICAgc1dpZHRoID0gbm9kZVdpZHRoICogc2NhbGVYO1xuICAgICAgICAgIGlmICghWydyb3VuZC1oZXhhZ29uJywgJ3JvdW5kLXRhZyddLmluY2x1ZGVzKHNoYXBlKSkge1xuICAgICAgICAgICAgc2NhbGVZID0gKG5vZGVIZWlnaHQgKyBzTXVsdCkgLyBub2RlSGVpZ2h0O1xuICAgICAgICAgICAgc0hlaWdodCA9IG5vZGVIZWlnaHQgKiBzY2FsZVk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvcm5lclJhZGl1cyA9IGNvcm5lclJhZGl1cyA9PT0gJ2F1dG8nID8gZ2V0Um91bmRQb2x5Z29uUmFkaXVzKHNXaWR0aCwgc0hlaWdodCkgOiBjb3JuZXJSYWRpdXM7XG4gICAgICAgIHZhciBoYWxmVyA9IHNXaWR0aCAvIDI7XG4gICAgICAgIHZhciBoYWxmSCA9IHNIZWlnaHQgLyAyO1xuICAgICAgICB2YXIgcmFkaXVzID0gY29ybmVyUmFkaXVzICsgKGJXaWR0aCArIG91dGxpbmVXaWR0aCArIG91dGxpbmVPZmZzZXQpIC8gMjtcbiAgICAgICAgdmFyIHAgPSBuZXcgQXJyYXkocG9pbnRzLmxlbmd0aCAvIDIpO1xuICAgICAgICB2YXIgY29ybmVycyA9IG5ldyBBcnJheShwb2ludHMubGVuZ3RoIC8gMik7XG4gICAgICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IHBvaW50cy5sZW5ndGggLyAyOyBfaTIrKykge1xuICAgICAgICAgIHBbX2kyXSA9IHtcbiAgICAgICAgICAgIHg6IG5wb3MueCArIG9mZnNldFggKyBoYWxmVyAqIHBvaW50c1tfaTIgKiAyXSxcbiAgICAgICAgICAgIHk6IG5wb3MueSArIG9mZnNldFkgKyBoYWxmSCAqIHBvaW50c1tfaTIgKiAyICsgMV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHZhciBfaTMsXG4gICAgICAgICAgcDEsXG4gICAgICAgICAgcDIsXG4gICAgICAgICAgcDMsXG4gICAgICAgICAgbGVuID0gcC5sZW5ndGg7XG4gICAgICAgIHAxID0gcFtsZW4gLSAxXTtcbiAgICAgICAgLy8gZm9yIGVhY2ggcG9pbnRcbiAgICAgICAgZm9yIChfaTMgPSAwOyBfaTMgPCBsZW47IF9pMysrKSB7XG4gICAgICAgICAgcDIgPSBwW19pMyAlIGxlbl07XG4gICAgICAgICAgcDMgPSBwWyhfaTMgKyAxKSAlIGxlbl07XG4gICAgICAgICAgY29ybmVyc1tfaTNdID0gZ2V0Um91bmRDb3JuZXIocDEsIHAyLCBwMywgcmFkaXVzKTtcbiAgICAgICAgICBwMSA9IHAyO1xuICAgICAgICAgIHAyID0gcDM7XG4gICAgICAgIH1cbiAgICAgICAgci5kcmF3Um91bmRQb2x5Z29uUGF0aChfcGF0aCB8fCBjb250ZXh0LCBucG9zLnggKyBvZmZzZXRYLCBucG9zLnkgKyBvZmZzZXRZLCBub2RlV2lkdGggKiBzY2FsZVgsIG5vZGVIZWlnaHQgKiBzY2FsZVksIHBvaW50cywgY29ybmVycyk7XG4gICAgICB9IGVsc2UgaWYgKFsncm91bmRyZWN0YW5nbGUnLCAncm91bmQtcmVjdGFuZ2xlJ10uaW5jbHVkZXMoc2hhcGUpKSB7XG4gICAgICAgIGNvcm5lclJhZGl1cyA9IGNvcm5lclJhZGl1cyA9PT0gJ2F1dG8nID8gZ2V0Um91bmRSZWN0YW5nbGVSYWRpdXMoc1dpZHRoLCBzSGVpZ2h0KSA6IGNvcm5lclJhZGl1cztcbiAgICAgICAgci5kcmF3Um91bmRSZWN0YW5nbGVQYXRoKF9wYXRoIHx8IGNvbnRleHQsIG5wb3MueCwgbnBvcy55LCBzV2lkdGgsIHNIZWlnaHQsIGNvcm5lclJhZGl1cyArIChiV2lkdGggKyBvdXRsaW5lV2lkdGggKyBvdXRsaW5lT2Zmc2V0KSAvIDIpO1xuICAgICAgfSBlbHNlIGlmIChbJ2N1dHJlY3RhbmdsZScsICdjdXQtcmVjdGFuZ2xlJ10uaW5jbHVkZXMoc2hhcGUpKSB7XG4gICAgICAgIGNvcm5lclJhZGl1cyA9IGNvcm5lclJhZGl1cyA9PT0gJ2F1dG8nID8gZ2V0Q3V0UmVjdGFuZ2xlQ29ybmVyTGVuZ3RoKCkgOiBjb3JuZXJSYWRpdXM7XG4gICAgICAgIHIuZHJhd0N1dFJlY3RhbmdsZVBhdGgoX3BhdGggfHwgY29udGV4dCwgbnBvcy54LCBucG9zLnksIHNXaWR0aCwgc0hlaWdodCwgbnVsbCwgY29ybmVyUmFkaXVzICsgKGJXaWR0aCArIG91dGxpbmVXaWR0aCArIG91dGxpbmVPZmZzZXQpIC8gNCk7XG4gICAgICB9IGVsc2UgaWYgKFsnYm90dG9tcm91bmRyZWN0YW5nbGUnLCAnYm90dG9tLXJvdW5kLXJlY3RhbmdsZSddLmluY2x1ZGVzKHNoYXBlKSkge1xuICAgICAgICBjb3JuZXJSYWRpdXMgPSBjb3JuZXJSYWRpdXMgPT09ICdhdXRvJyA/IGdldFJvdW5kUmVjdGFuZ2xlUmFkaXVzKHNXaWR0aCwgc0hlaWdodCkgOiBjb3JuZXJSYWRpdXM7XG4gICAgICAgIHIuZHJhd0JvdHRvbVJvdW5kUmVjdGFuZ2xlUGF0aChfcGF0aCB8fCBjb250ZXh0LCBucG9zLngsIG5wb3MueSwgc1dpZHRoLCBzSGVpZ2h0LCBjb3JuZXJSYWRpdXMgKyAoYldpZHRoICsgb3V0bGluZVdpZHRoICsgb3V0bGluZU9mZnNldCkgLyAyKTtcbiAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09IFwiYmFycmVsXCIpIHtcbiAgICAgICAgci5kcmF3QmFycmVsUGF0aChfcGF0aCB8fCBjb250ZXh0LCBucG9zLngsIG5wb3MueSwgc1dpZHRoLCBzSGVpZ2h0KTtcbiAgICAgIH0gZWxzZSBpZiAoc2hhcGUuc3RhcnRzV2l0aChcInBvbHlnb25cIikgfHwgWydyaG9tYm9pZCcsICdyaWdodC1yaG9tYm9pZCcsICdyb3VuZC10YWcnLCAndGFnJywgJ3ZlZSddLmluY2x1ZGVzKHNoYXBlKSkge1xuICAgICAgICB2YXIgcGFkID0gKGJXaWR0aCArIG91dGxpbmVXaWR0aCArIG91dGxpbmVPZmZzZXQpIC8gbm9kZVdpZHRoO1xuICAgICAgICBwb2ludHMgPSBqb2luTGluZXMoZXhwYW5kUG9seWdvbihwb2ludHMsIHBhZCkpO1xuICAgICAgICByLmRyYXdQb2x5Z29uUGF0aChfcGF0aCB8fCBjb250ZXh0LCBucG9zLngsIG5wb3MueSwgbm9kZVdpZHRoLCBub2RlSGVpZ2h0LCBwb2ludHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIF9wYWQgPSAoYldpZHRoICsgb3V0bGluZVdpZHRoICsgb3V0bGluZU9mZnNldCkgLyBub2RlV2lkdGg7XG4gICAgICAgIHBvaW50cyA9IGpvaW5MaW5lcyhleHBhbmRQb2x5Z29uKHBvaW50cywgLV9wYWQpKTtcbiAgICAgICAgci5kcmF3UG9seWdvblBhdGgoX3BhdGggfHwgY29udGV4dCwgbnBvcy54LCBucG9zLnksIG5vZGVXaWR0aCwgbm9kZUhlaWdodCwgcG9pbnRzKTtcbiAgICAgIH1cbiAgICAgIGlmICh1c2VQYXRocykge1xuICAgICAgICBjb250ZXh0LnN0cm9rZShfcGF0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250ZXh0LnN0cm9rZSgpO1xuICAgICAgfVxuICAgICAgaWYgKG91dGxpbmVTdHlsZSA9PT0gJ2RvdWJsZScpIHtcbiAgICAgICAgY29udGV4dC5saW5lV2lkdGggPSBiV2lkdGggLyAzO1xuICAgICAgICB2YXIgZ2NvID0gY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb247XG4gICAgICAgIGNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ2Rlc3RpbmF0aW9uLW91dCc7XG4gICAgICAgIGlmICh1c2VQYXRocykge1xuICAgICAgICAgIGNvbnRleHQuc3Ryb2tlKF9wYXRoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb250ZXh0LnN0cm9rZSgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gZ2NvO1xuICAgICAgfVxuXG4gICAgICAvLyByZXNldCBpbiBjYXNlIHdlIGNoYW5nZWQgdGhlIGJvcmRlciBzdHlsZVxuICAgICAgaWYgKGNvbnRleHQuc2V0TGluZURhc2gpIHtcbiAgICAgICAgLy8gZm9yIHZlcnkgb3V0b2ZkYXRlIGJyb3dzZXJzXG4gICAgICAgIGNvbnRleHQuc2V0TGluZURhc2goW10pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgdmFyIGRyYXdPdmVybGF5ID0gZnVuY3Rpb24gZHJhd092ZXJsYXkoKSB7XG4gICAgaWYgKHNob3VsZERyYXdPdmVybGF5KSB7XG4gICAgICByLmRyYXdOb2RlT3ZlcmxheShjb250ZXh0LCBub2RlLCBwb3MsIG5vZGVXaWR0aCwgbm9kZUhlaWdodCk7XG4gICAgfVxuICB9O1xuICB2YXIgZHJhd1VuZGVybGF5ID0gZnVuY3Rpb24gZHJhd1VuZGVybGF5KCkge1xuICAgIGlmIChzaG91bGREcmF3T3ZlcmxheSkge1xuICAgICAgci5kcmF3Tm9kZVVuZGVybGF5KGNvbnRleHQsIG5vZGUsIHBvcywgbm9kZVdpZHRoLCBub2RlSGVpZ2h0KTtcbiAgICB9XG4gIH07XG4gIHZhciBkcmF3VGV4dCA9IGZ1bmN0aW9uIGRyYXdUZXh0KCkge1xuICAgIHIuZHJhd0VsZW1lbnRUZXh0KGNvbnRleHQsIG5vZGUsIG51bGwsIGRyYXdMYWJlbCk7XG4gIH07XG4gIHZhciBnaG9zdCA9IG5vZGUucHN0eWxlKCdnaG9zdCcpLnZhbHVlID09PSAneWVzJztcbiAgaWYgKGdob3N0KSB7XG4gICAgdmFyIGd4ID0gbm9kZS5wc3R5bGUoJ2dob3N0LW9mZnNldC14JykucGZWYWx1ZTtcbiAgICB2YXIgZ3kgPSBub2RlLnBzdHlsZSgnZ2hvc3Qtb2Zmc2V0LXknKS5wZlZhbHVlO1xuICAgIHZhciBnaG9zdE9wYWNpdHkgPSBub2RlLnBzdHlsZSgnZ2hvc3Qtb3BhY2l0eScpLnZhbHVlO1xuICAgIHZhciBlZmZHaG9zdE9wYWNpdHkgPSBnaG9zdE9wYWNpdHkgKiBlbGVPcGFjaXR5O1xuICAgIGNvbnRleHQudHJhbnNsYXRlKGd4LCBneSk7XG4gICAgc2V0dXBPdXRsaW5lQ29sb3IoKTtcbiAgICBkcmF3T3V0bGluZSgpO1xuICAgIHNldHVwU2hhcGVDb2xvcihnaG9zdE9wYWNpdHkgKiBiZ09wYWNpdHkpO1xuICAgIGRyYXdTaGFwZSgpO1xuICAgIGRyYXdJbWFnZXMoZWZmR2hvc3RPcGFjaXR5LCB0cnVlKTtcbiAgICBzZXR1cEJvcmRlckNvbG9yKGdob3N0T3BhY2l0eSAqIGJvcmRlck9wYWNpdHkpO1xuICAgIGRyYXdCb3JkZXIoKTtcbiAgICBkcmF3UGllKGRhcmtuZXNzICE9PSAwIHx8IGJvcmRlcldpZHRoICE9PSAwKTtcbiAgICBkcmF3U3RyaXBlKGRhcmtuZXNzICE9PSAwIHx8IGJvcmRlcldpZHRoICE9PSAwKTtcbiAgICBkcmF3SW1hZ2VzKGVmZkdob3N0T3BhY2l0eSwgZmFsc2UpO1xuICAgIGRhcmtlbihlZmZHaG9zdE9wYWNpdHkpO1xuICAgIGNvbnRleHQudHJhbnNsYXRlKC1neCwgLWd5KTtcbiAgfVxuICBpZiAodXNlUGF0aHMpIHtcbiAgICBjb250ZXh0LnRyYW5zbGF0ZSgtcG9zLngsIC1wb3MueSk7XG4gIH1cbiAgZHJhd1VuZGVybGF5KCk7XG4gIGlmICh1c2VQYXRocykge1xuICAgIGNvbnRleHQudHJhbnNsYXRlKHBvcy54LCBwb3MueSk7XG4gIH1cbiAgc2V0dXBPdXRsaW5lQ29sb3IoKTtcbiAgZHJhd091dGxpbmUoKTtcbiAgc2V0dXBTaGFwZUNvbG9yKCk7XG4gIGRyYXdTaGFwZSgpO1xuICBkcmF3SW1hZ2VzKGVsZU9wYWNpdHksIHRydWUpO1xuICBzZXR1cEJvcmRlckNvbG9yKCk7XG4gIGRyYXdCb3JkZXIoKTtcbiAgZHJhd1BpZShkYXJrbmVzcyAhPT0gMCB8fCBib3JkZXJXaWR0aCAhPT0gMCk7XG4gIGRyYXdTdHJpcGUoZGFya25lc3MgIT09IDAgfHwgYm9yZGVyV2lkdGggIT09IDApO1xuICBkcmF3SW1hZ2VzKGVsZU9wYWNpdHksIGZhbHNlKTtcbiAgZGFya2VuKCk7XG4gIGlmICh1c2VQYXRocykge1xuICAgIGNvbnRleHQudHJhbnNsYXRlKC1wb3MueCwgLXBvcy55KTtcbiAgfVxuICBkcmF3VGV4dCgpO1xuICBkcmF3T3ZlcmxheSgpO1xuXG4gIC8vXG4gIC8vIGNsZWFuIHVwIHNoaWZ0XG5cbiAgaWYgKHNoaWZ0VG9PcmlnaW5XaXRoQmIpIHtcbiAgICBjb250ZXh0LnRyYW5zbGF0ZShiYi54MSwgYmIueTEpO1xuICB9XG59O1xudmFyIGRyYXdOb2RlT3ZlcmxheVVuZGVybGF5ID0gZnVuY3Rpb24gZHJhd05vZGVPdmVybGF5VW5kZXJsYXkob3ZlcmxheU9yVW5kZXJsYXkpIHtcbiAgaWYgKCFbJ292ZXJsYXknLCAndW5kZXJsYXknXS5pbmNsdWRlcyhvdmVybGF5T3JVbmRlcmxheSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc3RhdGUnKTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24gKGNvbnRleHQsIG5vZGUsIHBvcywgbm9kZVdpZHRoLCBub2RlSGVpZ2h0KSB7XG4gICAgdmFyIHIgPSB0aGlzO1xuICAgIGlmICghbm9kZS52aXNpYmxlKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHBhZGRpbmcgPSBub2RlLnBzdHlsZShcIlwiLmNvbmNhdChvdmVybGF5T3JVbmRlcmxheSwgXCItcGFkZGluZ1wiKSkucGZWYWx1ZTtcbiAgICB2YXIgb3BhY2l0eSA9IG5vZGUucHN0eWxlKFwiXCIuY29uY2F0KG92ZXJsYXlPclVuZGVybGF5LCBcIi1vcGFjaXR5XCIpKS52YWx1ZTtcbiAgICB2YXIgY29sb3IgPSBub2RlLnBzdHlsZShcIlwiLmNvbmNhdChvdmVybGF5T3JVbmRlcmxheSwgXCItY29sb3JcIikpLnZhbHVlO1xuICAgIHZhciBzaGFwZSA9IG5vZGUucHN0eWxlKFwiXCIuY29uY2F0KG92ZXJsYXlPclVuZGVybGF5LCBcIi1zaGFwZVwiKSkudmFsdWU7XG4gICAgdmFyIHJhZGl1cyA9IG5vZGUucHN0eWxlKFwiXCIuY29uY2F0KG92ZXJsYXlPclVuZGVybGF5LCBcIi1jb3JuZXItcmFkaXVzXCIpKS52YWx1ZTtcbiAgICBpZiAob3BhY2l0eSA+IDApIHtcbiAgICAgIHBvcyA9IHBvcyB8fCBub2RlLnBvc2l0aW9uKCk7XG4gICAgICBpZiAobm9kZVdpZHRoID09IG51bGwgfHwgbm9kZUhlaWdodCA9PSBudWxsKSB7XG4gICAgICAgIHZhciBfcGFkZGluZyA9IG5vZGUucGFkZGluZygpO1xuICAgICAgICBub2RlV2lkdGggPSBub2RlLndpZHRoKCkgKyAyICogX3BhZGRpbmc7XG4gICAgICAgIG5vZGVIZWlnaHQgPSBub2RlLmhlaWdodCgpICsgMiAqIF9wYWRkaW5nO1xuICAgICAgfVxuICAgICAgci5jb2xvckZpbGxTdHlsZShjb250ZXh0LCBjb2xvclswXSwgY29sb3JbMV0sIGNvbG9yWzJdLCBvcGFjaXR5KTtcbiAgICAgIHIubm9kZVNoYXBlc1tzaGFwZV0uZHJhdyhjb250ZXh0LCBwb3MueCwgcG9zLnksIG5vZGVXaWR0aCArIHBhZGRpbmcgKiAyLCBub2RlSGVpZ2h0ICsgcGFkZGluZyAqIDIsIHJhZGl1cyk7XG4gICAgICBjb250ZXh0LmZpbGwoKTtcbiAgICB9XG4gIH07XG59O1xuQ1JwJDYuZHJhd05vZGVPdmVybGF5ID0gZHJhd05vZGVPdmVybGF5VW5kZXJsYXkoJ292ZXJsYXknKTtcbkNScCQ2LmRyYXdOb2RlVW5kZXJsYXkgPSBkcmF3Tm9kZU92ZXJsYXlVbmRlcmxheSgndW5kZXJsYXknKTtcblxuLy8gZG9lcyB0aGUgbm9kZSBoYXZlIGF0IGxlYXN0IG9uZSBwaWUgcGllY2U/XG5DUnAkNi5oYXNQaWUgPSBmdW5jdGlvbiAobm9kZSkge1xuICBub2RlID0gbm9kZVswXTsgLy8gZW5zdXJlIGVsZSByZWZcblxuICByZXR1cm4gbm9kZS5fcHJpdmF0ZS5oYXNQaWU7XG59O1xuQ1JwJDYuaGFzU3RyaXBlID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgbm9kZSA9IG5vZGVbMF07IC8vIGVuc3VyZSBlbGUgcmVmXG5cbiAgcmV0dXJuIG5vZGUuX3ByaXZhdGUuaGFzU3RyaXBlO1xufTtcbkNScCQ2LmRyYXdQaWUgPSBmdW5jdGlvbiAoY29udGV4dCwgbm9kZSwgbm9kZU9wYWNpdHksIHBvcykge1xuICBub2RlID0gbm9kZVswXTsgLy8gZW5zdXJlIGVsZSByZWZcbiAgcG9zID0gcG9zIHx8IG5vZGUucG9zaXRpb24oKTtcbiAgdmFyIGN5U3R5bGUgPSBub2RlLmN5KCkuc3R5bGUoKTtcbiAgdmFyIHBpZVNpemUgPSBub2RlLnBzdHlsZSgncGllLXNpemUnKTtcbiAgdmFyIGhvbGUgPSBub2RlLnBzdHlsZSgncGllLWhvbGUnKTtcbiAgdmFyIG92ZXJhbGxTdGFydEFuZ2xlID0gbm9kZS5wc3R5bGUoJ3BpZS1zdGFydC1hbmdsZScpLnBmVmFsdWU7XG4gIHZhciB4ID0gcG9zLng7XG4gIHZhciB5ID0gcG9zLnk7XG4gIHZhciBub2RlVyA9IG5vZGUud2lkdGgoKTtcbiAgdmFyIG5vZGVIID0gbm9kZS5oZWlnaHQoKTtcbiAgdmFyIHJhZGl1cyA9IE1hdGgubWluKG5vZGVXLCBub2RlSCkgLyAyOyAvLyBtdXN0IGZpdCBpbiBub2RlXG4gIHZhciBob2xlUmFkaXVzO1xuICB2YXIgbGFzdFBlcmNlbnQgPSAwOyAvLyB3aGF0ICUgdG8gY29udGludWUgZHJhd2luZyBwaWUgc2xpY2VzIGZyb20gb24gWzAsIDFdXG4gIHZhciB1c2VQYXRocyA9IHRoaXMudXNlUGF0aHMoKTtcbiAgaWYgKHVzZVBhdGhzKSB7XG4gICAgeCA9IDA7XG4gICAgeSA9IDA7XG4gIH1cbiAgaWYgKHBpZVNpemUudW5pdHMgPT09ICclJykge1xuICAgIHJhZGl1cyA9IHJhZGl1cyAqIHBpZVNpemUucGZWYWx1ZTtcbiAgfSBlbHNlIGlmIChwaWVTaXplLnBmVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgIHJhZGl1cyA9IHBpZVNpemUucGZWYWx1ZSAvIDI7IC8vIGRpYW1ldGVyIGluIHBpeGVscyA9PiByYWRpdXNcbiAgfVxuICBpZiAoaG9sZS51bml0cyA9PT0gJyUnKSB7XG4gICAgaG9sZVJhZGl1cyA9IHJhZGl1cyAqIGhvbGUucGZWYWx1ZTtcbiAgfSBlbHNlIGlmIChob2xlLnBmVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgIGhvbGVSYWRpdXMgPSBob2xlLnBmVmFsdWUgLyAyOyAvLyBkaWFtZXRlciBpbiBwaXhlbHMgPT4gcmFkaXVzXG4gIH1cbiAgaWYgKGhvbGVSYWRpdXMgPj0gcmFkaXVzKSB7XG4gICAgcmV0dXJuOyAvLyB0aGUgcGllIHdvdWxkIGJlIGludmlzaWJsZSBhbnl3YXlcbiAgfVxuICBmb3IgKHZhciBpID0gMTsgaSA8PSBjeVN0eWxlLnBpZUJhY2tncm91bmROOyBpKyspIHtcbiAgICAvLyAxLi5OXG4gICAgdmFyIHNpemUgPSBub2RlLnBzdHlsZSgncGllLScgKyBpICsgJy1iYWNrZ3JvdW5kLXNpemUnKS52YWx1ZTtcbiAgICB2YXIgY29sb3IgPSBub2RlLnBzdHlsZSgncGllLScgKyBpICsgJy1iYWNrZ3JvdW5kLWNvbG9yJykudmFsdWU7XG4gICAgdmFyIG9wYWNpdHkgPSBub2RlLnBzdHlsZSgncGllLScgKyBpICsgJy1iYWNrZ3JvdW5kLW9wYWNpdHknKS52YWx1ZSAqIG5vZGVPcGFjaXR5O1xuICAgIHZhciBwZXJjZW50ID0gc2l6ZSAvIDEwMDsgLy8gbWFwIGludGVnZXIgcmFuZ2UgWzAsIDEwMF0gdG8gWzAsIDFdXG5cbiAgICAvLyBwZXJjZW50IGNhbid0IHB1c2ggYmV5b25kIDFcbiAgICBpZiAocGVyY2VudCArIGxhc3RQZXJjZW50ID4gMSkge1xuICAgICAgcGVyY2VudCA9IDEgLSBsYXN0UGVyY2VudDtcbiAgICB9XG4gICAgdmFyIGFuZ2xlU3RhcnQgPSAxLjUgKiBNYXRoLlBJICsgMiAqIE1hdGguUEkgKiBsYXN0UGVyY2VudDsgLy8gc3RhcnQgYXQgMTIgbydjbG9jayBhbmQgZ28gY2xvY2t3aXNlXG4gICAgYW5nbGVTdGFydCArPSBvdmVyYWxsU3RhcnRBbmdsZTsgLy8gc2hpZnQgYnkgdGhlIG92ZXJhbGwgcGllIHN0YXJ0IGFuZ2xlXG4gICAgdmFyIGFuZ2xlRGVsdGEgPSAyICogTWF0aC5QSSAqIHBlcmNlbnQ7XG4gICAgdmFyIGFuZ2xlRW5kID0gYW5nbGVTdGFydCArIGFuZ2xlRGVsdGE7XG5cbiAgICAvLyBpZ25vcmUgaWZcbiAgICAvLyAtIHplcm8gc2l6ZVxuICAgIC8vIC0gd2UncmUgYWxyZWFkeSBiZXlvbmQgdGhlIGZ1bGwgY2lyY2xlXG4gICAgLy8gLSBhZGRpbmcgdGhlIGN1cnJlbnQgc2xpY2Ugd291bGQgZ28gYmV5b25kIHRoZSBmdWxsIGNpcmNsZVxuICAgIGlmIChzaXplID09PSAwIHx8IGxhc3RQZXJjZW50ID49IDEgfHwgbGFzdFBlcmNlbnQgKyBwZXJjZW50ID4gMSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChob2xlUmFkaXVzID09PSAwKSB7XG4gICAgICAvLyBtYWtlIGEgcGllIHNsaWNlXG4gICAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgICAgY29udGV4dC5tb3ZlVG8oeCwgeSk7XG4gICAgICBjb250ZXh0LmFyYyh4LCB5LCByYWRpdXMsIGFuZ2xlU3RhcnQsIGFuZ2xlRW5kKTtcbiAgICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG1ha2UgYSBwaWUgc2xpY2UgdGhhdCdzIGxpa2UgdGhlIGFib3ZlIGJ1dCB3aXRoIGEgaG9sZSBpbiB0aGUgbWlkZGxlXG4gICAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgICAgY29udGV4dC5hcmMoeCwgeSwgcmFkaXVzLCBhbmdsZVN0YXJ0LCBhbmdsZUVuZCk7XG4gICAgICBjb250ZXh0LmFyYyh4LCB5LCBob2xlUmFkaXVzLCBhbmdsZUVuZCwgYW5nbGVTdGFydCwgdHJ1ZSk7IC8vIHRydWUgZm9yIGFudGljbG9ja3dpc2VcbiAgICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gICAgfVxuICAgIHRoaXMuY29sb3JGaWxsU3R5bGUoY29udGV4dCwgY29sb3JbMF0sIGNvbG9yWzFdLCBjb2xvclsyXSwgb3BhY2l0eSk7XG4gICAgY29udGV4dC5maWxsKCk7XG4gICAgbGFzdFBlcmNlbnQgKz0gcGVyY2VudDtcbiAgfVxufTtcbkNScCQ2LmRyYXdTdHJpcGUgPSBmdW5jdGlvbiAoY29udGV4dCwgbm9kZSwgbm9kZU9wYWNpdHksIHBvcykge1xuICBub2RlID0gbm9kZVswXTsgLy8gZW5zdXJlIGVsZSByZWZcbiAgcG9zID0gcG9zIHx8IG5vZGUucG9zaXRpb24oKTtcbiAgdmFyIGN5U3R5bGUgPSBub2RlLmN5KCkuc3R5bGUoKTtcbiAgdmFyIHggPSBwb3MueDtcbiAgdmFyIHkgPSBwb3MueTtcbiAgdmFyIG5vZGVXID0gbm9kZS53aWR0aCgpO1xuICB2YXIgbm9kZUggPSBub2RlLmhlaWdodCgpO1xuICB2YXIgbGFzdFBlcmNlbnQgPSAwOyAvLyB3aGF0ICUgdG8gY29udGludWUgZHJhd2luZyBwaWUgc2xpY2VzIGZyb20gb24gWzAsIDFdXG4gIHZhciB1c2VQYXRocyA9IHRoaXMudXNlUGF0aHMoKTtcbiAgY29udGV4dC5zYXZlKCk7XG4gIHZhciBkaXJlY3Rpb24gPSBub2RlLnBzdHlsZSgnc3RyaXBlLWRpcmVjdGlvbicpLnZhbHVlO1xuICB2YXIgc3RyaXBlU2l6ZSA9IG5vZGUucHN0eWxlKCdzdHJpcGUtc2l6ZScpO1xuICBzd2l0Y2ggKGRpcmVjdGlvbikge1xuICAgIGNhc2UgJ3ZlcnRpY2FsJzpcbiAgICAgIGJyZWFrO1xuICAgIC8vIGRlZmF1bHRcbiAgICBjYXNlICdyaWdod2FyZCc6XG4gICAgICBjb250ZXh0LnJvdGF0ZSgtTWF0aC5QSSAvIDIpO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgdmFyIHN0cmlwZVcgPSBub2RlVztcbiAgdmFyIHN0cmlwZUggPSBub2RlSDtcbiAgaWYgKHN0cmlwZVNpemUudW5pdHMgPT09ICclJykge1xuICAgIHN0cmlwZVcgPSBzdHJpcGVXICogc3RyaXBlU2l6ZS5wZlZhbHVlO1xuICAgIHN0cmlwZUggPSBzdHJpcGVIICogc3RyaXBlU2l6ZS5wZlZhbHVlO1xuICB9IGVsc2UgaWYgKHN0cmlwZVNpemUucGZWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgc3RyaXBlVyA9IHN0cmlwZVNpemUucGZWYWx1ZTtcbiAgICBzdHJpcGVIID0gc3RyaXBlU2l6ZS5wZlZhbHVlO1xuICB9XG4gIGlmICh1c2VQYXRocykge1xuICAgIHggPSAwO1xuICAgIHkgPSAwO1xuICB9XG5cbiAgLy8gc2hpZnQgdXAgZnJvbSB0aGUgY2VudHJlIG9mIHRoZSBub2RlIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXJcbiAgeSAtPSBzdHJpcGVXIC8gMjtcbiAgeCAtPSBzdHJpcGVIIC8gMjtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPD0gY3lTdHlsZS5zdHJpcGVCYWNrZ3JvdW5kTjsgaSsrKSB7XG4gICAgLy8gMS4uTlxuICAgIHZhciBzaXplID0gbm9kZS5wc3R5bGUoJ3N0cmlwZS0nICsgaSArICctYmFja2dyb3VuZC1zaXplJykudmFsdWU7XG4gICAgdmFyIGNvbG9yID0gbm9kZS5wc3R5bGUoJ3N0cmlwZS0nICsgaSArICctYmFja2dyb3VuZC1jb2xvcicpLnZhbHVlO1xuICAgIHZhciBvcGFjaXR5ID0gbm9kZS5wc3R5bGUoJ3N0cmlwZS0nICsgaSArICctYmFja2dyb3VuZC1vcGFjaXR5JykudmFsdWUgKiBub2RlT3BhY2l0eTtcbiAgICB2YXIgcGVyY2VudCA9IHNpemUgLyAxMDA7IC8vIG1hcCBpbnRlZ2VyIHJhbmdlIFswLCAxMDBdIHRvIFswLCAxXVxuXG4gICAgLy8gcGVyY2VudCBjYW4ndCBwdXNoIGJleW9uZCAxXG4gICAgaWYgKHBlcmNlbnQgKyBsYXN0UGVyY2VudCA+IDEpIHtcbiAgICAgIHBlcmNlbnQgPSAxIC0gbGFzdFBlcmNlbnQ7XG4gICAgfVxuXG4gICAgLy8gaWdub3JlIGlmXG4gICAgLy8gLSB6ZXJvIHNpemVcbiAgICAvLyAtIHdlJ3JlIGFscmVhZHkgYmV5b25kIHRoZSBmdWxsIGNoYXJ0XG4gICAgLy8gLSBhZGRpbmcgdGhlIGN1cnJlbnQgc2xpY2Ugd291bGQgZ28gYmV5b25kIHRoZSBmdWxsIGNoYXJ0XG4gICAgaWYgKHNpemUgPT09IDAgfHwgbGFzdFBlcmNlbnQgPj0gMSB8fCBsYXN0UGVyY2VudCArIHBlcmNlbnQgPiAxKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBkcmF3IHJlY3QgZm9yIHRoZSBjdXJyZW50IHN0cmlwZVxuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgY29udGV4dC5yZWN0KHgsIHkgKyBzdHJpcGVIICogbGFzdFBlcmNlbnQsIHN0cmlwZVcsIHN0cmlwZUggKiBwZXJjZW50KTtcbiAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgIHRoaXMuY29sb3JGaWxsU3R5bGUoY29udGV4dCwgY29sb3JbMF0sIGNvbG9yWzFdLCBjb2xvclsyXSwgb3BhY2l0eSk7XG4gICAgY29udGV4dC5maWxsKCk7XG4gICAgbGFzdFBlcmNlbnQgKz0gcGVyY2VudDtcbiAgfVxuICBjb250ZXh0LnJlc3RvcmUoKTtcbn07XG5cbnZhciBDUnAkNSA9IHt9O1xudmFyIG1vdGlvbkJsdXJEZWxheSA9IDEwMDtcblxuLy8gdmFyIGlzRmlyZWZveCA9IHR5cGVvZiBJbnN0YWxsVHJpZ2dlciAhPT0gJ3VuZGVmaW5lZCc7XG5cbkNScCQ1LmdldFBpeGVsUmF0aW8gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBjb250ZXh0ID0gdGhpcy5kYXRhLmNvbnRleHRzWzBdO1xuICBpZiAodGhpcy5mb3JjZWRQaXhlbFJhdGlvICE9IG51bGwpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JjZWRQaXhlbFJhdGlvO1xuICB9XG4gIHZhciBjb250YWluZXJXaW5kb3cgPSB0aGlzLmN5LndpbmRvdygpO1xuICB2YXIgYmFja2luZ1N0b3JlID0gY29udGV4dC5iYWNraW5nU3RvcmVQaXhlbFJhdGlvIHx8IGNvbnRleHQud2Via2l0QmFja2luZ1N0b3JlUGl4ZWxSYXRpbyB8fCBjb250ZXh0Lm1vekJhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHwgY29udGV4dC5tc0JhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHwgY29udGV4dC5vQmFja2luZ1N0b3JlUGl4ZWxSYXRpbyB8fCBjb250ZXh0LmJhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHwgMTtcbiAgcmV0dXJuIChjb250YWluZXJXaW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxKSAvIGJhY2tpbmdTdG9yZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxufTtcbkNScCQ1LnBhaW50Q2FjaGUgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICB2YXIgY2FjaGVzID0gdGhpcy5wYWludENhY2hlcyA9IHRoaXMucGFpbnRDYWNoZXMgfHwgW107XG4gIHZhciBuZWVkVG9DcmVhdGVDYWNoZSA9IHRydWU7XG4gIHZhciBjYWNoZTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYWNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjYWNoZSA9IGNhY2hlc1tpXTtcbiAgICBpZiAoY2FjaGUuY29udGV4dCA9PT0gY29udGV4dCkge1xuICAgICAgbmVlZFRvQ3JlYXRlQ2FjaGUgPSBmYWxzZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBpZiAobmVlZFRvQ3JlYXRlQ2FjaGUpIHtcbiAgICBjYWNoZSA9IHtcbiAgICAgIGNvbnRleHQ6IGNvbnRleHRcbiAgICB9O1xuICAgIGNhY2hlcy5wdXNoKGNhY2hlKTtcbiAgfVxuICByZXR1cm4gY2FjaGU7XG59O1xuQ1JwJDUuY3JlYXRlR3JhZGllbnRTdHlsZUZvciA9IGZ1bmN0aW9uIChjb250ZXh0LCBzaGFwZVN0eWxlTmFtZSwgZWxlLCBmaWxsLCBvcGFjaXR5KSB7XG4gIHZhciBncmFkaWVudFN0eWxlO1xuICB2YXIgdXNlUGF0aHMgPSB0aGlzLnVzZVBhdGhzKCk7XG4gIHZhciBjb2xvcnMgPSBlbGUucHN0eWxlKHNoYXBlU3R5bGVOYW1lICsgJy1ncmFkaWVudC1zdG9wLWNvbG9ycycpLnZhbHVlLFxuICAgIHBvc2l0aW9ucyA9IGVsZS5wc3R5bGUoc2hhcGVTdHlsZU5hbWUgKyAnLWdyYWRpZW50LXN0b3AtcG9zaXRpb25zJykucGZWYWx1ZTtcbiAgaWYgKGZpbGwgPT09ICdyYWRpYWwtZ3JhZGllbnQnKSB7XG4gICAgaWYgKGVsZS5pc0VkZ2UoKSkge1xuICAgICAgdmFyIHN0YXJ0ID0gZWxlLnNvdXJjZUVuZHBvaW50KCksXG4gICAgICAgIGVuZCA9IGVsZS50YXJnZXRFbmRwb2ludCgpLFxuICAgICAgICBtaWQgPSBlbGUubWlkcG9pbnQoKTtcbiAgICAgIHZhciBkMSA9IGRpc3Qoc3RhcnQsIG1pZCk7XG4gICAgICB2YXIgZDIgPSBkaXN0KGVuZCwgbWlkKTtcbiAgICAgIGdyYWRpZW50U3R5bGUgPSBjb250ZXh0LmNyZWF0ZVJhZGlhbEdyYWRpZW50KG1pZC54LCBtaWQueSwgMCwgbWlkLngsIG1pZC55LCBNYXRoLm1heChkMSwgZDIpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHBvcyA9IHVzZVBhdGhzID8ge1xuICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgeTogMFxuICAgICAgICB9IDogZWxlLnBvc2l0aW9uKCksXG4gICAgICAgIHdpZHRoID0gZWxlLnBhZGRlZFdpZHRoKCksXG4gICAgICAgIGhlaWdodCA9IGVsZS5wYWRkZWRIZWlnaHQoKTtcbiAgICAgIGdyYWRpZW50U3R5bGUgPSBjb250ZXh0LmNyZWF0ZVJhZGlhbEdyYWRpZW50KHBvcy54LCBwb3MueSwgMCwgcG9zLngsIHBvcy55LCBNYXRoLm1heCh3aWR0aCwgaGVpZ2h0KSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChlbGUuaXNFZGdlKCkpIHtcbiAgICAgIHZhciBfc3RhcnQgPSBlbGUuc291cmNlRW5kcG9pbnQoKSxcbiAgICAgICAgX2VuZCA9IGVsZS50YXJnZXRFbmRwb2ludCgpO1xuICAgICAgZ3JhZGllbnRTdHlsZSA9IGNvbnRleHQuY3JlYXRlTGluZWFyR3JhZGllbnQoX3N0YXJ0LngsIF9zdGFydC55LCBfZW5kLngsIF9lbmQueSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBfcG9zID0gdXNlUGF0aHMgPyB7XG4gICAgICAgICAgeDogMCxcbiAgICAgICAgICB5OiAwXG4gICAgICAgIH0gOiBlbGUucG9zaXRpb24oKSxcbiAgICAgICAgX3dpZHRoID0gZWxlLnBhZGRlZFdpZHRoKCksXG4gICAgICAgIF9oZWlnaHQgPSBlbGUucGFkZGVkSGVpZ2h0KCksXG4gICAgICAgIGhhbGZXaWR0aCA9IF93aWR0aCAvIDIsXG4gICAgICAgIGhhbGZIZWlnaHQgPSBfaGVpZ2h0IC8gMjtcbiAgICAgIHZhciBkaXJlY3Rpb24gPSBlbGUucHN0eWxlKCdiYWNrZ3JvdW5kLWdyYWRpZW50LWRpcmVjdGlvbicpLnZhbHVlO1xuICAgICAgc3dpdGNoIChkaXJlY3Rpb24pIHtcbiAgICAgICAgY2FzZSAndG8tYm90dG9tJzpcbiAgICAgICAgICBncmFkaWVudFN0eWxlID0gY29udGV4dC5jcmVhdGVMaW5lYXJHcmFkaWVudChfcG9zLngsIF9wb3MueSAtIGhhbGZIZWlnaHQsIF9wb3MueCwgX3Bvcy55ICsgaGFsZkhlaWdodCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3RvLXRvcCc6XG4gICAgICAgICAgZ3JhZGllbnRTdHlsZSA9IGNvbnRleHQuY3JlYXRlTGluZWFyR3JhZGllbnQoX3Bvcy54LCBfcG9zLnkgKyBoYWxmSGVpZ2h0LCBfcG9zLngsIF9wb3MueSAtIGhhbGZIZWlnaHQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd0by1sZWZ0JzpcbiAgICAgICAgICBncmFkaWVudFN0eWxlID0gY29udGV4dC5jcmVhdGVMaW5lYXJHcmFkaWVudChfcG9zLnggKyBoYWxmV2lkdGgsIF9wb3MueSwgX3Bvcy54IC0gaGFsZldpZHRoLCBfcG9zLnkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd0by1yaWdodCc6XG4gICAgICAgICAgZ3JhZGllbnRTdHlsZSA9IGNvbnRleHQuY3JlYXRlTGluZWFyR3JhZGllbnQoX3Bvcy54IC0gaGFsZldpZHRoLCBfcG9zLnksIF9wb3MueCArIGhhbGZXaWR0aCwgX3Bvcy55KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndG8tYm90dG9tLXJpZ2h0JzpcbiAgICAgICAgY2FzZSAndG8tcmlnaHQtYm90dG9tJzpcbiAgICAgICAgICBncmFkaWVudFN0eWxlID0gY29udGV4dC5jcmVhdGVMaW5lYXJHcmFkaWVudChfcG9zLnggLSBoYWxmV2lkdGgsIF9wb3MueSAtIGhhbGZIZWlnaHQsIF9wb3MueCArIGhhbGZXaWR0aCwgX3Bvcy55ICsgaGFsZkhlaWdodCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3RvLXRvcC1yaWdodCc6XG4gICAgICAgIGNhc2UgJ3RvLXJpZ2h0LXRvcCc6XG4gICAgICAgICAgZ3JhZGllbnRTdHlsZSA9IGNvbnRleHQuY3JlYXRlTGluZWFyR3JhZGllbnQoX3Bvcy54IC0gaGFsZldpZHRoLCBfcG9zLnkgKyBoYWxmSGVpZ2h0LCBfcG9zLnggKyBoYWxmV2lkdGgsIF9wb3MueSAtIGhhbGZIZWlnaHQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd0by1ib3R0b20tbGVmdCc6XG4gICAgICAgIGNhc2UgJ3RvLWxlZnQtYm90dG9tJzpcbiAgICAgICAgICBncmFkaWVudFN0eWxlID0gY29udGV4dC5jcmVhdGVMaW5lYXJHcmFkaWVudChfcG9zLnggKyBoYWxmV2lkdGgsIF9wb3MueSAtIGhhbGZIZWlnaHQsIF9wb3MueCAtIGhhbGZXaWR0aCwgX3Bvcy55ICsgaGFsZkhlaWdodCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3RvLXRvcC1sZWZ0JzpcbiAgICAgICAgY2FzZSAndG8tbGVmdC10b3AnOlxuICAgICAgICAgIGdyYWRpZW50U3R5bGUgPSBjb250ZXh0LmNyZWF0ZUxpbmVhckdyYWRpZW50KF9wb3MueCArIGhhbGZXaWR0aCwgX3Bvcy55ICsgaGFsZkhlaWdodCwgX3Bvcy54IC0gaGFsZldpZHRoLCBfcG9zLnkgLSBoYWxmSGVpZ2h0KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKCFncmFkaWVudFN0eWxlKSByZXR1cm4gbnVsbDsgLy8gaW52YWxpZCBncmFkaWVudCBzdHlsZVxuXG4gIHZhciBoYXNQb3NpdGlvbnMgPSBwb3NpdGlvbnMubGVuZ3RoID09PSBjb2xvcnMubGVuZ3RoO1xuICB2YXIgbGVuZ3RoID0gY29sb3JzLmxlbmd0aDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIGdyYWRpZW50U3R5bGUuYWRkQ29sb3JTdG9wKGhhc1Bvc2l0aW9ucyA/IHBvc2l0aW9uc1tpXSA6IGkgLyAobGVuZ3RoIC0gMSksICdyZ2JhKCcgKyBjb2xvcnNbaV1bMF0gKyAnLCcgKyBjb2xvcnNbaV1bMV0gKyAnLCcgKyBjb2xvcnNbaV1bMl0gKyAnLCcgKyBvcGFjaXR5ICsgJyknKTtcbiAgfVxuICByZXR1cm4gZ3JhZGllbnRTdHlsZTtcbn07XG5DUnAkNS5ncmFkaWVudEZpbGxTdHlsZSA9IGZ1bmN0aW9uIChjb250ZXh0LCBlbGUsIGZpbGwsIG9wYWNpdHkpIHtcbiAgdmFyIGdyYWRpZW50U3R5bGUgPSB0aGlzLmNyZWF0ZUdyYWRpZW50U3R5bGVGb3IoY29udGV4dCwgJ2JhY2tncm91bmQnLCBlbGUsIGZpbGwsIG9wYWNpdHkpO1xuICBpZiAoIWdyYWRpZW50U3R5bGUpIHJldHVybiBudWxsOyAvLyBlcnJvclxuICBjb250ZXh0LmZpbGxTdHlsZSA9IGdyYWRpZW50U3R5bGU7XG59O1xuQ1JwJDUuY29sb3JGaWxsU3R5bGUgPSBmdW5jdGlvbiAoY29udGV4dCwgciwgZywgYiwgYSkge1xuICBjb250ZXh0LmZpbGxTdHlsZSA9ICdyZ2JhKCcgKyByICsgJywnICsgZyArICcsJyArIGIgKyAnLCcgKyBhICsgJyknO1xuICAvLyB0dXJuIG9mZiBmb3Igbm93LCBzZWVtcyBjb250ZXh0IGRvZXMgaXRzIG93biBjYWNoaW5nXG5cbiAgLy8gdmFyIGNhY2hlID0gdGhpcy5wYWludENhY2hlKGNvbnRleHQpO1xuXG4gIC8vIHZhciBmaWxsU3R5bGUgPSAncmdiYSgnICsgciArICcsJyArIGcgKyAnLCcgKyBiICsgJywnICsgYSArICcpJztcblxuICAvLyBpZiggY2FjaGUuZmlsbFN0eWxlICE9PSBmaWxsU3R5bGUgKXtcbiAgLy8gICBjb250ZXh0LmZpbGxTdHlsZSA9IGNhY2hlLmZpbGxTdHlsZSA9IGZpbGxTdHlsZTtcbiAgLy8gfVxufTtcbkNScCQ1LmVsZUZpbGxTdHlsZSA9IGZ1bmN0aW9uIChjb250ZXh0LCBlbGUsIG9wYWNpdHkpIHtcbiAgdmFyIGJhY2tncm91bmRGaWxsID0gZWxlLnBzdHlsZSgnYmFja2dyb3VuZC1maWxsJykudmFsdWU7XG4gIGlmIChiYWNrZ3JvdW5kRmlsbCA9PT0gJ2xpbmVhci1ncmFkaWVudCcgfHwgYmFja2dyb3VuZEZpbGwgPT09ICdyYWRpYWwtZ3JhZGllbnQnKSB7XG4gICAgdGhpcy5ncmFkaWVudEZpbGxTdHlsZShjb250ZXh0LCBlbGUsIGJhY2tncm91bmRGaWxsLCBvcGFjaXR5KTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgYmFja2dyb3VuZENvbG9yID0gZWxlLnBzdHlsZSgnYmFja2dyb3VuZC1jb2xvcicpLnZhbHVlO1xuICAgIHRoaXMuY29sb3JGaWxsU3R5bGUoY29udGV4dCwgYmFja2dyb3VuZENvbG9yWzBdLCBiYWNrZ3JvdW5kQ29sb3JbMV0sIGJhY2tncm91bmRDb2xvclsyXSwgb3BhY2l0eSk7XG4gIH1cbn07XG5DUnAkNS5ncmFkaWVudFN0cm9rZVN0eWxlID0gZnVuY3Rpb24gKGNvbnRleHQsIGVsZSwgZmlsbCwgb3BhY2l0eSkge1xuICB2YXIgZ3JhZGllbnRTdHlsZSA9IHRoaXMuY3JlYXRlR3JhZGllbnRTdHlsZUZvcihjb250ZXh0LCAnbGluZScsIGVsZSwgZmlsbCwgb3BhY2l0eSk7XG4gIGlmICghZ3JhZGllbnRTdHlsZSkgcmV0dXJuIG51bGw7IC8vIGVycm9yXG4gIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBncmFkaWVudFN0eWxlO1xufTtcbkNScCQ1LmNvbG9yU3Ryb2tlU3R5bGUgPSBmdW5jdGlvbiAoY29udGV4dCwgciwgZywgYiwgYSkge1xuICBjb250ZXh0LnN0cm9rZVN0eWxlID0gJ3JnYmEoJyArIHIgKyAnLCcgKyBnICsgJywnICsgYiArICcsJyArIGEgKyAnKSc7XG4gIC8vIHR1cm4gb2ZmIGZvciBub3csIHNlZW1zIGNvbnRleHQgZG9lcyBpdHMgb3duIGNhY2hpbmdcblxuICAvLyB2YXIgY2FjaGUgPSB0aGlzLnBhaW50Q2FjaGUoY29udGV4dCk7XG5cbiAgLy8gdmFyIHN0cm9rZVN0eWxlID0gJ3JnYmEoJyArIHIgKyAnLCcgKyBnICsgJywnICsgYiArICcsJyArIGEgKyAnKSc7XG5cbiAgLy8gaWYoIGNhY2hlLnN0cm9rZVN0eWxlICE9PSBzdHJva2VTdHlsZSApe1xuICAvLyAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBjYWNoZS5zdHJva2VTdHlsZSA9IHN0cm9rZVN0eWxlO1xuICAvLyB9XG59O1xuQ1JwJDUuZWxlU3Ryb2tlU3R5bGUgPSBmdW5jdGlvbiAoY29udGV4dCwgZWxlLCBvcGFjaXR5KSB7XG4gIHZhciBsaW5lRmlsbCA9IGVsZS5wc3R5bGUoJ2xpbmUtZmlsbCcpLnZhbHVlO1xuICBpZiAobGluZUZpbGwgPT09ICdsaW5lYXItZ3JhZGllbnQnIHx8IGxpbmVGaWxsID09PSAncmFkaWFsLWdyYWRpZW50Jykge1xuICAgIHRoaXMuZ3JhZGllbnRTdHJva2VTdHlsZShjb250ZXh0LCBlbGUsIGxpbmVGaWxsLCBvcGFjaXR5KTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbGluZUNvbG9yID0gZWxlLnBzdHlsZSgnbGluZS1jb2xvcicpLnZhbHVlO1xuICAgIHRoaXMuY29sb3JTdHJva2VTdHlsZShjb250ZXh0LCBsaW5lQ29sb3JbMF0sIGxpbmVDb2xvclsxXSwgbGluZUNvbG9yWzJdLCBvcGFjaXR5KTtcbiAgfVxufTtcblxuLy8gUmVzaXplIGNhbnZhc1xuQ1JwJDUubWF0Y2hDYW52YXNTaXplID0gZnVuY3Rpb24gKGNvbnRhaW5lcikge1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBkYXRhID0gci5kYXRhO1xuICB2YXIgYmIgPSByLmZpbmRDb250YWluZXJDbGllbnRDb29yZHMoKTtcbiAgdmFyIHdpZHRoID0gYmJbMl07XG4gIHZhciBoZWlnaHQgPSBiYlszXTtcbiAgdmFyIHBpeGVsUmF0aW8gPSByLmdldFBpeGVsUmF0aW8oKTtcbiAgdmFyIG1iUHhSYXRpbyA9IHIubW90aW9uQmx1clB4UmF0aW87XG4gIGlmIChjb250YWluZXIgPT09IHIuZGF0YS5idWZmZXJDYW52YXNlc1tyLk1PVElPTkJMVVJfQlVGRkVSX05PREVdIHx8IGNvbnRhaW5lciA9PT0gci5kYXRhLmJ1ZmZlckNhbnZhc2VzW3IuTU9USU9OQkxVUl9CVUZGRVJfRFJBR10pIHtcbiAgICBwaXhlbFJhdGlvID0gbWJQeFJhdGlvO1xuICB9XG4gIHZhciBjYW52YXNXaWR0aCA9IHdpZHRoICogcGl4ZWxSYXRpbztcbiAgdmFyIGNhbnZhc0hlaWdodCA9IGhlaWdodCAqIHBpeGVsUmF0aW87XG4gIHZhciBjYW52YXM7XG4gIGlmIChjYW52YXNXaWR0aCA9PT0gci5jYW52YXNXaWR0aCAmJiBjYW52YXNIZWlnaHQgPT09IHIuY2FudmFzSGVpZ2h0KSB7XG4gICAgcmV0dXJuOyAvLyBzYXZlIGN5Y2xlcyBpZiBzYW1lXG4gIH1cbiAgci5mb250Q2FjaGVzID0gbnVsbDsgLy8gcmVzaXppbmcgcmVzZXRzIHRoZSBzdHlsZVxuXG4gIHZhciBjYW52YXNDb250YWluZXIgPSBkYXRhLmNhbnZhc0NvbnRhaW5lcjtcbiAgY2FudmFzQ29udGFpbmVyLnN0eWxlLndpZHRoID0gd2lkdGggKyAncHgnO1xuICBjYW52YXNDb250YWluZXIuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByLkNBTlZBU19MQVlFUlM7IGkrKykge1xuICAgIGNhbnZhcyA9IGRhdGEuY2FudmFzZXNbaV07XG4gICAgY2FudmFzLndpZHRoID0gY2FudmFzV2lkdGg7XG4gICAgY2FudmFzLmhlaWdodCA9IGNhbnZhc0hlaWdodDtcbiAgICBjYW52YXMuc3R5bGUud2lkdGggPSB3aWR0aCArICdweCc7XG4gICAgY2FudmFzLnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCc7XG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByLkJVRkZFUl9DT1VOVDsgaSsrKSB7XG4gICAgY2FudmFzID0gZGF0YS5idWZmZXJDYW52YXNlc1tpXTtcbiAgICBjYW52YXMud2lkdGggPSBjYW52YXNXaWR0aDtcbiAgICBjYW52YXMuaGVpZ2h0ID0gY2FudmFzSGVpZ2h0O1xuICAgIGNhbnZhcy5zdHlsZS53aWR0aCA9IHdpZHRoICsgJ3B4JztcbiAgICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JztcbiAgfVxuICByLnRleHR1cmVNdWx0ID0gMTtcbiAgaWYgKHBpeGVsUmF0aW8gPD0gMSkge1xuICAgIGNhbnZhcyA9IGRhdGEuYnVmZmVyQ2FudmFzZXNbci5URVhUVVJFX0JVRkZFUl07XG4gICAgci50ZXh0dXJlTXVsdCA9IDI7XG4gICAgY2FudmFzLndpZHRoID0gY2FudmFzV2lkdGggKiByLnRleHR1cmVNdWx0O1xuICAgIGNhbnZhcy5oZWlnaHQgPSBjYW52YXNIZWlnaHQgKiByLnRleHR1cmVNdWx0O1xuICB9XG4gIHIuY2FudmFzV2lkdGggPSBjYW52YXNXaWR0aDtcbiAgci5jYW52YXNIZWlnaHQgPSBjYW52YXNIZWlnaHQ7XG4gIHIucGl4ZWxSYXRpbyA9IHBpeGVsUmF0aW87XG59O1xuQ1JwJDUucmVuZGVyVG8gPSBmdW5jdGlvbiAoY3h0LCB6b29tLCBwYW4sIHB4UmF0aW8pIHtcbiAgdGhpcy5yZW5kZXIoe1xuICAgIGZvcmNlZENvbnRleHQ6IGN4dCxcbiAgICBmb3JjZWRab29tOiB6b29tLFxuICAgIGZvcmNlZFBhbjogcGFuLFxuICAgIGRyYXdBbGxMYXllcnM6IHRydWUsXG4gICAgZm9yY2VkUHhSYXRpbzogcHhSYXRpb1xuICB9KTtcbn07XG5DUnAkNS5jbGVhckNhbnZhcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgZGF0YSA9IHIuZGF0YTtcbiAgZnVuY3Rpb24gY2xlYXIoY29udGV4dCkge1xuICAgIGNvbnRleHQuY2xlYXJSZWN0KDAsIDAsIHIuY2FudmFzV2lkdGgsIHIuY2FudmFzSGVpZ2h0KTtcbiAgfVxuICBjbGVhcihkYXRhLmNvbnRleHRzW3IuTk9ERV0pO1xuICBjbGVhcihkYXRhLmNvbnRleHRzW3IuRFJBR10pO1xufTtcbkNScCQ1LnJlbmRlciA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIHZhciByID0gdGhpcztcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwgc3RhdGljRW1wdHlPYmplY3QoKTtcbiAgdmFyIGN5ID0gci5jeTtcbiAgdmFyIGZvcmNlZENvbnRleHQgPSBvcHRpb25zLmZvcmNlZENvbnRleHQ7XG4gIHZhciBkcmF3QWxsTGF5ZXJzID0gb3B0aW9ucy5kcmF3QWxsTGF5ZXJzO1xuICB2YXIgZHJhd09ubHlOb2RlTGF5ZXIgPSBvcHRpb25zLmRyYXdPbmx5Tm9kZUxheWVyO1xuICB2YXIgZm9yY2VkWm9vbSA9IG9wdGlvbnMuZm9yY2VkWm9vbTtcbiAgdmFyIGZvcmNlZFBhbiA9IG9wdGlvbnMuZm9yY2VkUGFuO1xuICB2YXIgcGl4ZWxSYXRpbyA9IG9wdGlvbnMuZm9yY2VkUHhSYXRpbyA9PT0gdW5kZWZpbmVkID8gdGhpcy5nZXRQaXhlbFJhdGlvKCkgOiBvcHRpb25zLmZvcmNlZFB4UmF0aW87XG4gIHZhciBkYXRhID0gci5kYXRhO1xuICB2YXIgbmVlZERyYXcgPSBkYXRhLmNhbnZhc05lZWRzUmVkcmF3O1xuICB2YXIgdGV4dHVyZURyYXcgPSByLnRleHR1cmVPblZpZXdwb3J0ICYmICFmb3JjZWRDb250ZXh0ICYmIChyLnBpbmNoaW5nIHx8IHIuaG92ZXJEYXRhLmRyYWdnaW5nIHx8IHIuc3dpcGVQYW5uaW5nIHx8IHIuZGF0YS53aGVlbFpvb21pbmcpO1xuICB2YXIgbW90aW9uQmx1ciA9IG9wdGlvbnMubW90aW9uQmx1ciAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5tb3Rpb25CbHVyIDogci5tb3Rpb25CbHVyO1xuICB2YXIgbWJQeFJhdGlvID0gci5tb3Rpb25CbHVyUHhSYXRpbztcbiAgdmFyIGhhc0NvbXBvdW5kTm9kZXMgPSBjeS5oYXNDb21wb3VuZE5vZGVzKCk7XG4gIHZhciBpbk5vZGVEcmFnR2VzdHVyZSA9IHIuaG92ZXJEYXRhLmRyYWdnaW5nRWxlcztcbiAgdmFyIGluQm94U2VsZWN0aW9uID0gci5ob3ZlckRhdGEuc2VsZWN0aW5nIHx8IHIudG91Y2hEYXRhLnNlbGVjdGluZyA/IHRydWUgOiBmYWxzZTtcbiAgbW90aW9uQmx1ciA9IG1vdGlvbkJsdXIgJiYgIWZvcmNlZENvbnRleHQgJiYgci5tb3Rpb25CbHVyRW5hYmxlZCAmJiAhaW5Cb3hTZWxlY3Rpb247XG4gIHZhciBtb3Rpb25CbHVyRmFkZUVmZmVjdCA9IG1vdGlvbkJsdXI7XG4gIGlmICghZm9yY2VkQ29udGV4dCkge1xuICAgIGlmIChyLnByZXZQeFJhdGlvICE9PSBwaXhlbFJhdGlvKSB7XG4gICAgICByLmludmFsaWRhdGVDb250YWluZXJDbGllbnRDb29yZHNDYWNoZSgpO1xuICAgICAgci5tYXRjaENhbnZhc1NpemUoci5jb250YWluZXIpO1xuICAgICAgci5yZWRyYXdIaW50KCdlbGVzJywgdHJ1ZSk7XG4gICAgICByLnJlZHJhd0hpbnQoJ2RyYWcnLCB0cnVlKTtcbiAgICB9XG4gICAgci5wcmV2UHhSYXRpbyA9IHBpeGVsUmF0aW87XG4gIH1cbiAgaWYgKCFmb3JjZWRDb250ZXh0ICYmIHIubW90aW9uQmx1clRpbWVvdXQpIHtcbiAgICBjbGVhclRpbWVvdXQoci5tb3Rpb25CbHVyVGltZW91dCk7XG4gIH1cbiAgaWYgKG1vdGlvbkJsdXIpIHtcbiAgICBpZiAoci5tYkZyYW1lcyA9PSBudWxsKSB7XG4gICAgICByLm1iRnJhbWVzID0gMDtcbiAgICB9XG4gICAgci5tYkZyYW1lcysrO1xuICAgIGlmIChyLm1iRnJhbWVzIDwgMykge1xuICAgICAgLy8gbmVlZCBzZXZlcmFsIGZyYW1lcyBiZWZvcmUgZXZlbiBoaWdoIHF1YWxpdHkgbW90aW9uYmx1clxuICAgICAgbW90aW9uQmx1ckZhZGVFZmZlY3QgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBnbyB0byBsb3dlciBxdWFsaXR5IGJsdXJyeSBmcmFtZXMgd2hlbiBzZXZlcmFsIG0vYiBmcmFtZXMgaGF2ZSBiZWVuIHJlbmRlcmVkIChhdm9pZHMgZmxhc2hpbmcpXG4gICAgaWYgKHIubWJGcmFtZXMgPiByLm1pbk1iTG93UXVhbEZyYW1lcykge1xuICAgICAgLy9yLmZ1bGxRdWFsaXR5TWIgPSBmYWxzZTtcbiAgICAgIHIubW90aW9uQmx1clB4UmF0aW8gPSByLm1iUHhSQmx1cnJ5O1xuICAgIH1cbiAgfVxuICBpZiAoci5jbGVhcmluZ01vdGlvbkJsdXIpIHtcbiAgICByLm1vdGlvbkJsdXJQeFJhdGlvID0gMTtcbiAgfVxuXG4gIC8vIGIvYyBkcmF3VG9Db250ZXh0KCkgbWF5IGJlIGFzeW5jIHcuci50LiByZWRyYXcoKSwga2VlcCB0cmFjayBvZiBsYXN0IHRleHR1cmUgZnJhbWVcbiAgLy8gYmVjYXVzZSBhIHJvZ3VlIGFzeW5jIHRleHR1cmUgZnJhbWUgd291bGQgY2xlYXIgbmVlZERyYXdcbiAgaWYgKHIudGV4dHVyZURyYXdMYXN0RnJhbWUgJiYgIXRleHR1cmVEcmF3KSB7XG4gICAgbmVlZERyYXdbci5OT0RFXSA9IHRydWU7XG4gICAgbmVlZERyYXdbci5TRUxFQ1RfQk9YXSA9IHRydWU7XG4gIH1cbiAgdmFyIHN0eWxlID0gY3kuc3R5bGUoKTtcbiAgdmFyIHpvb20gPSBjeS56b29tKCk7XG4gIHZhciBlZmZlY3RpdmVab29tID0gZm9yY2VkWm9vbSAhPT0gdW5kZWZpbmVkID8gZm9yY2VkWm9vbSA6IHpvb207XG4gIHZhciBwYW4gPSBjeS5wYW4oKTtcbiAgdmFyIGVmZmVjdGl2ZVBhbiA9IHtcbiAgICB4OiBwYW4ueCxcbiAgICB5OiBwYW4ueVxuICB9O1xuICB2YXIgdnAgPSB7XG4gICAgem9vbTogem9vbSxcbiAgICBwYW46IHtcbiAgICAgIHg6IHBhbi54LFxuICAgICAgeTogcGFuLnlcbiAgICB9XG4gIH07XG4gIHZhciBwcmV2VnAgPSByLnByZXZWaWV3cG9ydDtcbiAgdmFyIHZpZXdwb3J0SXNEaWZmID0gcHJldlZwID09PSB1bmRlZmluZWQgfHwgdnAuem9vbSAhPT0gcHJldlZwLnpvb20gfHwgdnAucGFuLnggIT09IHByZXZWcC5wYW4ueCB8fCB2cC5wYW4ueSAhPT0gcHJldlZwLnBhbi55O1xuXG4gIC8vIHdlIHdhbnQgdGhlIGxvdyBxdWFsaXR5IG1vdGlvbmJsdXIgb25seSB3aGVuIHRoZSB2aWV3cG9ydCBpcyBiZWluZyBtYW5pcHVsYXRlZCBldGMgKHdoZXJlIGl0J3Mgbm90IG5vdGljZWQpXG4gIGlmICghdmlld3BvcnRJc0RpZmYgJiYgIShpbk5vZGVEcmFnR2VzdHVyZSAmJiAhaGFzQ29tcG91bmROb2RlcykpIHtcbiAgICByLm1vdGlvbkJsdXJQeFJhdGlvID0gMTtcbiAgfVxuICBpZiAoZm9yY2VkUGFuKSB7XG4gICAgZWZmZWN0aXZlUGFuID0gZm9yY2VkUGFuO1xuICB9XG5cbiAgLy8gYXBwbHkgcGl4ZWwgcmF0aW9cblxuICBlZmZlY3RpdmVab29tICo9IHBpeGVsUmF0aW87XG4gIGVmZmVjdGl2ZVBhbi54ICo9IHBpeGVsUmF0aW87XG4gIGVmZmVjdGl2ZVBhbi55ICo9IHBpeGVsUmF0aW87XG4gIHZhciBlbGVzID0gci5nZXRDYWNoZWRaU29ydGVkRWxlcygpO1xuICBmdW5jdGlvbiBtYmNsZWFyKGNvbnRleHQsIHgsIHksIHcsIGgpIHtcbiAgICB2YXIgZ2NvID0gY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb247XG4gICAgY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAnZGVzdGluYXRpb24tb3V0JztcbiAgICByLmNvbG9yRmlsbFN0eWxlKGNvbnRleHQsIDI1NSwgMjU1LCAyNTUsIHIubW90aW9uQmx1clRyYW5zcGFyZW5jeSk7XG4gICAgY29udGV4dC5maWxsUmVjdCh4LCB5LCB3LCBoKTtcbiAgICBjb250ZXh0Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IGdjbztcbiAgfVxuICBmdW5jdGlvbiBzZXRDb250ZXh0VHJhbnNmb3JtKGNvbnRleHQsIGNsZWFyKSB7XG4gICAgdmFyIGVQYW4sIGVab29tLCB3LCBoO1xuICAgIGlmICghci5jbGVhcmluZ01vdGlvbkJsdXIgJiYgKGNvbnRleHQgPT09IGRhdGEuYnVmZmVyQ29udGV4dHNbci5NT1RJT05CTFVSX0JVRkZFUl9OT0RFXSB8fCBjb250ZXh0ID09PSBkYXRhLmJ1ZmZlckNvbnRleHRzW3IuTU9USU9OQkxVUl9CVUZGRVJfRFJBR10pKSB7XG4gICAgICBlUGFuID0ge1xuICAgICAgICB4OiBwYW4ueCAqIG1iUHhSYXRpbyxcbiAgICAgICAgeTogcGFuLnkgKiBtYlB4UmF0aW9cbiAgICAgIH07XG4gICAgICBlWm9vbSA9IHpvb20gKiBtYlB4UmF0aW87XG4gICAgICB3ID0gci5jYW52YXNXaWR0aCAqIG1iUHhSYXRpbztcbiAgICAgIGggPSByLmNhbnZhc0hlaWdodCAqIG1iUHhSYXRpbztcbiAgICB9IGVsc2Uge1xuICAgICAgZVBhbiA9IGVmZmVjdGl2ZVBhbjtcbiAgICAgIGVab29tID0gZWZmZWN0aXZlWm9vbTtcbiAgICAgIHcgPSByLmNhbnZhc1dpZHRoO1xuICAgICAgaCA9IHIuY2FudmFzSGVpZ2h0O1xuICAgIH1cbiAgICBjb250ZXh0LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcbiAgICBpZiAoY2xlYXIgPT09ICdtb3Rpb25CbHVyJykge1xuICAgICAgbWJjbGVhcihjb250ZXh0LCAwLCAwLCB3LCBoKTtcbiAgICB9IGVsc2UgaWYgKCFmb3JjZWRDb250ZXh0ICYmIChjbGVhciA9PT0gdW5kZWZpbmVkIHx8IGNsZWFyKSkge1xuICAgICAgY29udGV4dC5jbGVhclJlY3QoMCwgMCwgdywgaCk7XG4gICAgfVxuICAgIGlmICghZHJhd0FsbExheWVycykge1xuICAgICAgY29udGV4dC50cmFuc2xhdGUoZVBhbi54LCBlUGFuLnkpO1xuICAgICAgY29udGV4dC5zY2FsZShlWm9vbSwgZVpvb20pO1xuICAgIH1cbiAgICBpZiAoZm9yY2VkUGFuKSB7XG4gICAgICBjb250ZXh0LnRyYW5zbGF0ZShmb3JjZWRQYW4ueCwgZm9yY2VkUGFuLnkpO1xuICAgIH1cbiAgICBpZiAoZm9yY2VkWm9vbSkge1xuICAgICAgY29udGV4dC5zY2FsZShmb3JjZWRab29tLCBmb3JjZWRab29tKTtcbiAgICB9XG4gIH1cbiAgaWYgKCF0ZXh0dXJlRHJhdykge1xuICAgIHIudGV4dHVyZURyYXdMYXN0RnJhbWUgPSBmYWxzZTtcbiAgfVxuICBpZiAodGV4dHVyZURyYXcpIHtcbiAgICByLnRleHR1cmVEcmF3TGFzdEZyYW1lID0gdHJ1ZTtcbiAgICBpZiAoIXIudGV4dHVyZUNhY2hlKSB7XG4gICAgICByLnRleHR1cmVDYWNoZSA9IHt9O1xuICAgICAgci50ZXh0dXJlQ2FjaGUuYmIgPSBjeS5tdXRhYmxlRWxlbWVudHMoKS5ib3VuZGluZ0JveCgpO1xuICAgICAgci50ZXh0dXJlQ2FjaGUudGV4dHVyZSA9IHIuZGF0YS5idWZmZXJDYW52YXNlc1tyLlRFWFRVUkVfQlVGRkVSXTtcbiAgICAgIHZhciBjeHQgPSByLmRhdGEuYnVmZmVyQ29udGV4dHNbci5URVhUVVJFX0JVRkZFUl07XG4gICAgICBjeHQuc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuICAgICAgY3h0LmNsZWFyUmVjdCgwLCAwLCByLmNhbnZhc1dpZHRoICogci50ZXh0dXJlTXVsdCwgci5jYW52YXNIZWlnaHQgKiByLnRleHR1cmVNdWx0KTtcbiAgICAgIHIucmVuZGVyKHtcbiAgICAgICAgZm9yY2VkQ29udGV4dDogY3h0LFxuICAgICAgICBkcmF3T25seU5vZGVMYXllcjogdHJ1ZSxcbiAgICAgICAgZm9yY2VkUHhSYXRpbzogcGl4ZWxSYXRpbyAqIHIudGV4dHVyZU11bHRcbiAgICAgIH0pO1xuICAgICAgdmFyIHZwID0gci50ZXh0dXJlQ2FjaGUudmlld3BvcnQgPSB7XG4gICAgICAgIHpvb206IGN5Lnpvb20oKSxcbiAgICAgICAgcGFuOiBjeS5wYW4oKSxcbiAgICAgICAgd2lkdGg6IHIuY2FudmFzV2lkdGgsXG4gICAgICAgIGhlaWdodDogci5jYW52YXNIZWlnaHRcbiAgICAgIH07XG4gICAgICB2cC5tcGFuID0ge1xuICAgICAgICB4OiAoMCAtIHZwLnBhbi54KSAvIHZwLnpvb20sXG4gICAgICAgIHk6ICgwIC0gdnAucGFuLnkpIC8gdnAuem9vbVxuICAgICAgfTtcbiAgICB9XG4gICAgbmVlZERyYXdbci5EUkFHXSA9IGZhbHNlO1xuICAgIG5lZWREcmF3W3IuTk9ERV0gPSBmYWxzZTtcbiAgICB2YXIgY29udGV4dCA9IGRhdGEuY29udGV4dHNbci5OT0RFXTtcbiAgICB2YXIgdGV4dHVyZSA9IHIudGV4dHVyZUNhY2hlLnRleHR1cmU7XG4gICAgdmFyIHZwID0gci50ZXh0dXJlQ2FjaGUudmlld3BvcnQ7XG4gICAgY29udGV4dC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7XG4gICAgaWYgKG1vdGlvbkJsdXIpIHtcbiAgICAgIG1iY2xlYXIoY29udGV4dCwgMCwgMCwgdnAud2lkdGgsIHZwLmhlaWdodCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRleHQuY2xlYXJSZWN0KDAsIDAsIHZwLndpZHRoLCB2cC5oZWlnaHQpO1xuICAgIH1cbiAgICB2YXIgb3V0c2lkZUJnQ29sb3IgPSBzdHlsZS5jb3JlKCdvdXRzaWRlLXRleHR1cmUtYmctY29sb3InKS52YWx1ZTtcbiAgICB2YXIgb3V0c2lkZUJnT3BhY2l0eSA9IHN0eWxlLmNvcmUoJ291dHNpZGUtdGV4dHVyZS1iZy1vcGFjaXR5JykudmFsdWU7XG4gICAgci5jb2xvckZpbGxTdHlsZShjb250ZXh0LCBvdXRzaWRlQmdDb2xvclswXSwgb3V0c2lkZUJnQ29sb3JbMV0sIG91dHNpZGVCZ0NvbG9yWzJdLCBvdXRzaWRlQmdPcGFjaXR5KTtcbiAgICBjb250ZXh0LmZpbGxSZWN0KDAsIDAsIHZwLndpZHRoLCB2cC5oZWlnaHQpO1xuICAgIHZhciB6b29tID0gY3kuem9vbSgpO1xuICAgIHNldENvbnRleHRUcmFuc2Zvcm0oY29udGV4dCwgZmFsc2UpO1xuICAgIGNvbnRleHQuY2xlYXJSZWN0KHZwLm1wYW4ueCwgdnAubXBhbi55LCB2cC53aWR0aCAvIHZwLnpvb20gLyBwaXhlbFJhdGlvLCB2cC5oZWlnaHQgLyB2cC56b29tIC8gcGl4ZWxSYXRpbyk7XG4gICAgY29udGV4dC5kcmF3SW1hZ2UodGV4dHVyZSwgdnAubXBhbi54LCB2cC5tcGFuLnksIHZwLndpZHRoIC8gdnAuem9vbSAvIHBpeGVsUmF0aW8sIHZwLmhlaWdodCAvIHZwLnpvb20gLyBwaXhlbFJhdGlvKTtcbiAgfSBlbHNlIGlmIChyLnRleHR1cmVPblZpZXdwb3J0ICYmICFmb3JjZWRDb250ZXh0KSB7XG4gICAgLy8gY2xlYXIgdGhlIGNhY2hlIHNpbmNlIHdlIGRvbid0IG5lZWQgaXRcbiAgICByLnRleHR1cmVDYWNoZSA9IG51bGw7XG4gIH1cbiAgdmFyIGV4dGVudCA9IGN5LmV4dGVudCgpO1xuICB2YXIgdnBNYW5pcCA9IHIucGluY2hpbmcgfHwgci5ob3ZlckRhdGEuZHJhZ2dpbmcgfHwgci5zd2lwZVBhbm5pbmcgfHwgci5kYXRhLndoZWVsWm9vbWluZyB8fCByLmhvdmVyRGF0YS5kcmFnZ2luZ0VsZXMgfHwgci5jeS5hbmltYXRlZCgpO1xuICB2YXIgaGlkZUVkZ2VzID0gci5oaWRlRWRnZXNPblZpZXdwb3J0ICYmIHZwTWFuaXA7XG4gIHZhciBuZWVkTWJDbGVhciA9IFtdO1xuICBuZWVkTWJDbGVhcltyLk5PREVdID0gIW5lZWREcmF3W3IuTk9ERV0gJiYgbW90aW9uQmx1ciAmJiAhci5jbGVhcmVkRm9yTW90aW9uQmx1cltyLk5PREVdIHx8IHIuY2xlYXJpbmdNb3Rpb25CbHVyO1xuICBpZiAobmVlZE1iQ2xlYXJbci5OT0RFXSkge1xuICAgIHIuY2xlYXJlZEZvck1vdGlvbkJsdXJbci5OT0RFXSA9IHRydWU7XG4gIH1cbiAgbmVlZE1iQ2xlYXJbci5EUkFHXSA9ICFuZWVkRHJhd1tyLkRSQUddICYmIG1vdGlvbkJsdXIgJiYgIXIuY2xlYXJlZEZvck1vdGlvbkJsdXJbci5EUkFHXSB8fCByLmNsZWFyaW5nTW90aW9uQmx1cjtcbiAgaWYgKG5lZWRNYkNsZWFyW3IuRFJBR10pIHtcbiAgICByLmNsZWFyZWRGb3JNb3Rpb25CbHVyW3IuRFJBR10gPSB0cnVlO1xuICB9XG4gIGlmIChuZWVkRHJhd1tyLk5PREVdIHx8IGRyYXdBbGxMYXllcnMgfHwgZHJhd09ubHlOb2RlTGF5ZXIgfHwgbmVlZE1iQ2xlYXJbci5OT0RFXSkge1xuICAgIHZhciB1c2VCdWZmZXIgPSBtb3Rpb25CbHVyICYmICFuZWVkTWJDbGVhcltyLk5PREVdICYmIG1iUHhSYXRpbyAhPT0gMTtcbiAgICB2YXIgY29udGV4dCA9IGZvcmNlZENvbnRleHQgfHwgKHVzZUJ1ZmZlciA/IHIuZGF0YS5idWZmZXJDb250ZXh0c1tyLk1PVElPTkJMVVJfQlVGRkVSX05PREVdIDogZGF0YS5jb250ZXh0c1tyLk5PREVdKTtcbiAgICB2YXIgY2xlYXIgPSBtb3Rpb25CbHVyICYmICF1c2VCdWZmZXIgPyAnbW90aW9uQmx1cicgOiB1bmRlZmluZWQ7XG4gICAgc2V0Q29udGV4dFRyYW5zZm9ybShjb250ZXh0LCBjbGVhcik7XG4gICAgaWYgKGhpZGVFZGdlcykge1xuICAgICAgci5kcmF3Q2FjaGVkTm9kZXMoY29udGV4dCwgZWxlcy5ub25kcmFnLCBwaXhlbFJhdGlvLCBleHRlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByLmRyYXdMYXllcmVkRWxlbWVudHMoY29udGV4dCwgZWxlcy5ub25kcmFnLCBwaXhlbFJhdGlvLCBleHRlbnQpO1xuICAgIH1cbiAgICBpZiAoci5kZWJ1Zykge1xuICAgICAgci5kcmF3RGVidWdQb2ludHMoY29udGV4dCwgZWxlcy5ub25kcmFnKTtcbiAgICB9XG4gICAgaWYgKCFkcmF3QWxsTGF5ZXJzICYmICFtb3Rpb25CbHVyKSB7XG4gICAgICBuZWVkRHJhd1tyLk5PREVdID0gZmFsc2U7XG4gICAgfVxuICB9XG4gIGlmICghZHJhd09ubHlOb2RlTGF5ZXIgJiYgKG5lZWREcmF3W3IuRFJBR10gfHwgZHJhd0FsbExheWVycyB8fCBuZWVkTWJDbGVhcltyLkRSQUddKSkge1xuICAgIHZhciB1c2VCdWZmZXIgPSBtb3Rpb25CbHVyICYmICFuZWVkTWJDbGVhcltyLkRSQUddICYmIG1iUHhSYXRpbyAhPT0gMTtcbiAgICB2YXIgY29udGV4dCA9IGZvcmNlZENvbnRleHQgfHwgKHVzZUJ1ZmZlciA/IHIuZGF0YS5idWZmZXJDb250ZXh0c1tyLk1PVElPTkJMVVJfQlVGRkVSX0RSQUddIDogZGF0YS5jb250ZXh0c1tyLkRSQUddKTtcbiAgICBzZXRDb250ZXh0VHJhbnNmb3JtKGNvbnRleHQsIG1vdGlvbkJsdXIgJiYgIXVzZUJ1ZmZlciA/ICdtb3Rpb25CbHVyJyA6IHVuZGVmaW5lZCk7XG4gICAgaWYgKGhpZGVFZGdlcykge1xuICAgICAgci5kcmF3Q2FjaGVkTm9kZXMoY29udGV4dCwgZWxlcy5kcmFnLCBwaXhlbFJhdGlvLCBleHRlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByLmRyYXdDYWNoZWRFbGVtZW50cyhjb250ZXh0LCBlbGVzLmRyYWcsIHBpeGVsUmF0aW8sIGV4dGVudCk7XG4gICAgfVxuICAgIGlmIChyLmRlYnVnKSB7XG4gICAgICByLmRyYXdEZWJ1Z1BvaW50cyhjb250ZXh0LCBlbGVzLmRyYWcpO1xuICAgIH1cbiAgICBpZiAoIWRyYXdBbGxMYXllcnMgJiYgIW1vdGlvbkJsdXIpIHtcbiAgICAgIG5lZWREcmF3W3IuRFJBR10gPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgdGhpcy5kcmF3U2VsZWN0aW9uUmVjdGFuZ2xlKG9wdGlvbnMsIHNldENvbnRleHRUcmFuc2Zvcm0pO1xuXG4gIC8vIG1vdGlvbmJsdXI6IGJsaXQgcmVuZGVyZWQgYmx1cnJ5IGZyYW1lc1xuICBpZiAobW90aW9uQmx1ciAmJiBtYlB4UmF0aW8gIT09IDEpIHtcbiAgICB2YXIgY3h0Tm9kZSA9IGRhdGEuY29udGV4dHNbci5OT0RFXTtcbiAgICB2YXIgdHh0Tm9kZSA9IHIuZGF0YS5idWZmZXJDYW52YXNlc1tyLk1PVElPTkJMVVJfQlVGRkVSX05PREVdO1xuICAgIHZhciBjeHREcmFnID0gZGF0YS5jb250ZXh0c1tyLkRSQUddO1xuICAgIHZhciB0eHREcmFnID0gci5kYXRhLmJ1ZmZlckNhbnZhc2VzW3IuTU9USU9OQkxVUl9CVUZGRVJfRFJBR107XG4gICAgdmFyIGRyYXdNb3Rpb25CbHVyID0gZnVuY3Rpb24gZHJhd01vdGlvbkJsdXIoY3h0LCB0eHQsIG5lZWRDbGVhcikge1xuICAgICAgY3h0LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcbiAgICAgIGlmIChuZWVkQ2xlYXIgfHwgIW1vdGlvbkJsdXJGYWRlRWZmZWN0KSB7XG4gICAgICAgIGN4dC5jbGVhclJlY3QoMCwgMCwgci5jYW52YXNXaWR0aCwgci5jYW52YXNIZWlnaHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWJjbGVhcihjeHQsIDAsIDAsIHIuY2FudmFzV2lkdGgsIHIuY2FudmFzSGVpZ2h0KTtcbiAgICAgIH1cbiAgICAgIHZhciBweHIgPSBtYlB4UmF0aW87XG4gICAgICBjeHQuZHJhd0ltYWdlKHR4dCxcbiAgICAgIC8vIGltZ1xuICAgICAgMCwgMCxcbiAgICAgIC8vIHN4LCBzeVxuICAgICAgci5jYW52YXNXaWR0aCAqIHB4ciwgci5jYW52YXNIZWlnaHQgKiBweHIsXG4gICAgICAvLyBzdywgc2hcbiAgICAgIDAsIDAsXG4gICAgICAvLyB4LCB5XG4gICAgICByLmNhbnZhc1dpZHRoLCByLmNhbnZhc0hlaWdodCAvLyB3LCBoXG4gICAgICApO1xuICAgIH07XG4gICAgaWYgKG5lZWREcmF3W3IuTk9ERV0gfHwgbmVlZE1iQ2xlYXJbci5OT0RFXSkge1xuICAgICAgZHJhd01vdGlvbkJsdXIoY3h0Tm9kZSwgdHh0Tm9kZSwgbmVlZE1iQ2xlYXJbci5OT0RFXSk7XG4gICAgICBuZWVkRHJhd1tyLk5PREVdID0gZmFsc2U7XG4gICAgfVxuICAgIGlmIChuZWVkRHJhd1tyLkRSQUddIHx8IG5lZWRNYkNsZWFyW3IuRFJBR10pIHtcbiAgICAgIGRyYXdNb3Rpb25CbHVyKGN4dERyYWcsIHR4dERyYWcsIG5lZWRNYkNsZWFyW3IuRFJBR10pO1xuICAgICAgbmVlZERyYXdbci5EUkFHXSA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICByLnByZXZWaWV3cG9ydCA9IHZwO1xuICBpZiAoci5jbGVhcmluZ01vdGlvbkJsdXIpIHtcbiAgICByLmNsZWFyaW5nTW90aW9uQmx1ciA9IGZhbHNlO1xuICAgIHIubW90aW9uQmx1ckNsZWFyZWQgPSB0cnVlO1xuICAgIHIubW90aW9uQmx1ciA9IHRydWU7XG4gIH1cbiAgaWYgKG1vdGlvbkJsdXIpIHtcbiAgICByLm1vdGlvbkJsdXJUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICByLm1vdGlvbkJsdXJUaW1lb3V0ID0gbnVsbDtcbiAgICAgIHIuY2xlYXJlZEZvck1vdGlvbkJsdXJbci5OT0RFXSA9IGZhbHNlO1xuICAgICAgci5jbGVhcmVkRm9yTW90aW9uQmx1cltyLkRSQUddID0gZmFsc2U7XG4gICAgICByLm1vdGlvbkJsdXIgPSBmYWxzZTtcbiAgICAgIHIuY2xlYXJpbmdNb3Rpb25CbHVyID0gIXRleHR1cmVEcmF3O1xuICAgICAgci5tYkZyYW1lcyA9IDA7XG4gICAgICBuZWVkRHJhd1tyLk5PREVdID0gdHJ1ZTtcbiAgICAgIG5lZWREcmF3W3IuRFJBR10gPSB0cnVlO1xuICAgICAgci5yZWRyYXcoKTtcbiAgICB9LCBtb3Rpb25CbHVyRGVsYXkpO1xuICB9XG4gIGlmICghZm9yY2VkQ29udGV4dCkge1xuICAgIGN5LmVtaXQoJ3JlbmRlcicpO1xuICB9XG59O1xudmFyIGZwc0hlaWdodDtcbkNScCQ1LmRyYXdTZWxlY3Rpb25SZWN0YW5nbGUgPSBmdW5jdGlvbiAob3B0aW9ucywgc2V0Q29udGV4dFRyYW5zZm9ybSkge1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBjeSA9IHIuY3k7XG4gIHZhciBkYXRhID0gci5kYXRhO1xuICB2YXIgc3R5bGUgPSBjeS5zdHlsZSgpO1xuICB2YXIgZHJhd09ubHlOb2RlTGF5ZXIgPSBvcHRpb25zLmRyYXdPbmx5Tm9kZUxheWVyO1xuICB2YXIgZHJhd0FsbExheWVycyA9IG9wdGlvbnMuZHJhd0FsbExheWVycztcbiAgdmFyIG5lZWREcmF3ID0gZGF0YS5jYW52YXNOZWVkc1JlZHJhdztcbiAgdmFyIGZvcmNlZENvbnRleHQgPSBvcHRpb25zLmZvcmNlZENvbnRleHQ7XG4gIGlmIChyLnNob3dGcHMgfHwgIWRyYXdPbmx5Tm9kZUxheWVyICYmIG5lZWREcmF3W3IuU0VMRUNUX0JPWF0gJiYgIWRyYXdBbGxMYXllcnMpIHtcbiAgICB2YXIgY29udGV4dCA9IGZvcmNlZENvbnRleHQgfHwgZGF0YS5jb250ZXh0c1tyLlNFTEVDVF9CT1hdO1xuICAgIHNldENvbnRleHRUcmFuc2Zvcm0oY29udGV4dCk7XG4gICAgaWYgKHIuc2VsZWN0aW9uWzRdID09IDEgJiYgKHIuaG92ZXJEYXRhLnNlbGVjdGluZyB8fCByLnRvdWNoRGF0YS5zZWxlY3RpbmcpKSB7XG4gICAgICB2YXIgem9vbSA9IHIuY3kuem9vbSgpO1xuICAgICAgdmFyIGJvcmRlcldpZHRoID0gc3R5bGUuY29yZSgnc2VsZWN0aW9uLWJveC1ib3JkZXItd2lkdGgnKS52YWx1ZSAvIHpvb207XG4gICAgICBjb250ZXh0LmxpbmVXaWR0aCA9IGJvcmRlcldpZHRoO1xuICAgICAgY29udGV4dC5maWxsU3R5bGUgPSAncmdiYSgnICsgc3R5bGUuY29yZSgnc2VsZWN0aW9uLWJveC1jb2xvcicpLnZhbHVlWzBdICsgJywnICsgc3R5bGUuY29yZSgnc2VsZWN0aW9uLWJveC1jb2xvcicpLnZhbHVlWzFdICsgJywnICsgc3R5bGUuY29yZSgnc2VsZWN0aW9uLWJveC1jb2xvcicpLnZhbHVlWzJdICsgJywnICsgc3R5bGUuY29yZSgnc2VsZWN0aW9uLWJveC1vcGFjaXR5JykudmFsdWUgKyAnKSc7XG4gICAgICBjb250ZXh0LmZpbGxSZWN0KHIuc2VsZWN0aW9uWzBdLCByLnNlbGVjdGlvblsxXSwgci5zZWxlY3Rpb25bMl0gLSByLnNlbGVjdGlvblswXSwgci5zZWxlY3Rpb25bM10gLSByLnNlbGVjdGlvblsxXSk7XG4gICAgICBpZiAoYm9yZGVyV2lkdGggPiAwKSB7XG4gICAgICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSAncmdiYSgnICsgc3R5bGUuY29yZSgnc2VsZWN0aW9uLWJveC1ib3JkZXItY29sb3InKS52YWx1ZVswXSArICcsJyArIHN0eWxlLmNvcmUoJ3NlbGVjdGlvbi1ib3gtYm9yZGVyLWNvbG9yJykudmFsdWVbMV0gKyAnLCcgKyBzdHlsZS5jb3JlKCdzZWxlY3Rpb24tYm94LWJvcmRlci1jb2xvcicpLnZhbHVlWzJdICsgJywnICsgc3R5bGUuY29yZSgnc2VsZWN0aW9uLWJveC1vcGFjaXR5JykudmFsdWUgKyAnKSc7XG4gICAgICAgIGNvbnRleHQuc3Ryb2tlUmVjdChyLnNlbGVjdGlvblswXSwgci5zZWxlY3Rpb25bMV0sIHIuc2VsZWN0aW9uWzJdIC0gci5zZWxlY3Rpb25bMF0sIHIuc2VsZWN0aW9uWzNdIC0gci5zZWxlY3Rpb25bMV0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGF0YS5iZ0FjdGl2ZVBvc2lzdGlvbiAmJiAhci5ob3ZlckRhdGEuc2VsZWN0aW5nKSB7XG4gICAgICB2YXIgem9vbSA9IHIuY3kuem9vbSgpO1xuICAgICAgdmFyIHBvcyA9IGRhdGEuYmdBY3RpdmVQb3Npc3Rpb247XG4gICAgICBjb250ZXh0LmZpbGxTdHlsZSA9ICdyZ2JhKCcgKyBzdHlsZS5jb3JlKCdhY3RpdmUtYmctY29sb3InKS52YWx1ZVswXSArICcsJyArIHN0eWxlLmNvcmUoJ2FjdGl2ZS1iZy1jb2xvcicpLnZhbHVlWzFdICsgJywnICsgc3R5bGUuY29yZSgnYWN0aXZlLWJnLWNvbG9yJykudmFsdWVbMl0gKyAnLCcgKyBzdHlsZS5jb3JlKCdhY3RpdmUtYmctb3BhY2l0eScpLnZhbHVlICsgJyknO1xuICAgICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICAgIGNvbnRleHQuYXJjKHBvcy54LCBwb3MueSwgc3R5bGUuY29yZSgnYWN0aXZlLWJnLXNpemUnKS5wZlZhbHVlIC8gem9vbSwgMCwgMiAqIE1hdGguUEkpO1xuICAgICAgY29udGV4dC5maWxsKCk7XG4gICAgfVxuICAgIHZhciB0aW1lVG9SZW5kZXIgPSByLmxhc3RSZWRyYXdUaW1lO1xuICAgIGlmIChyLnNob3dGcHMgJiYgdGltZVRvUmVuZGVyKSB7XG4gICAgICB0aW1lVG9SZW5kZXIgPSBNYXRoLnJvdW5kKHRpbWVUb1JlbmRlcik7XG4gICAgICB2YXIgZnBzID0gTWF0aC5yb3VuZCgxMDAwIC8gdGltZVRvUmVuZGVyKTtcbiAgICAgIHZhciB0ZXh0ID0gJzEgZnJhbWUgPSAnICsgdGltZVRvUmVuZGVyICsgJyBtcyA9ICcgKyBmcHMgKyAnIGZwcyc7XG4gICAgICBjb250ZXh0LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcbiAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gJ3JnYmEoMjU1LCAwLCAwLCAwLjc1KSc7XG4gICAgICBjb250ZXh0LnN0cm9rZVN0eWxlID0gJ3JnYmEoMjU1LCAwLCAwLCAwLjc1KSc7XG4gICAgICAvLyBjb250ZXh0LmxpbmVXaWR0aCA9IDE7XG4gICAgICBjb250ZXh0LmZvbnQgPSAnMzBweCBBcmlhbCc7XG4gICAgICBpZiAoIWZwc0hlaWdodCkge1xuICAgICAgICB2YXIgZGltcyA9IGNvbnRleHQubWVhc3VyZVRleHQodGV4dCk7XG4gICAgICAgIGZwc0hlaWdodCA9IGRpbXMuYWN0dWFsQm91bmRpbmdCb3hBc2NlbnQ7XG4gICAgICB9XG4gICAgICBjb250ZXh0LmZpbGxUZXh0KHRleHQsIDAsIGZwc0hlaWdodCk7XG4gICAgICB2YXIgbWF4RnBzID0gNjA7XG4gICAgICBjb250ZXh0LnN0cm9rZVJlY3QoMCwgZnBzSGVpZ2h0ICsgMTAsIDI1MCwgMjApO1xuICAgICAgY29udGV4dC5maWxsUmVjdCgwLCBmcHNIZWlnaHQgKyAxMCwgMjUwICogTWF0aC5taW4oZnBzIC8gbWF4RnBzLCAxKSwgMjApO1xuICAgIH1cbiAgICBpZiAoIWRyYXdBbGxMYXllcnMpIHtcbiAgICAgIG5lZWREcmF3W3IuU0VMRUNUX0JPWF0gPSBmYWxzZTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogTm90ZXM6XG4gKiAtIEFsbCBjb2xvcnMgaGF2ZSBwcmVtdWx0aXBsaWVkIGFscGhhLiBWZXJ5IGltcG9ydGFudCBmb3IgdGV4dHVlcyBhbmQgXG4gKiAgIGJsZW5kaW5nIHRvIHdvcmsgY29ycmVjdGx5LlxuICovXG5cbmZ1bmN0aW9uIGNvbXBpbGVTaGFkZXIoZ2wsIHR5cGUsIHNvdXJjZSkge1xuICB2YXIgc2hhZGVyID0gZ2wuY3JlYXRlU2hhZGVyKHR5cGUpO1xuICBnbC5zaGFkZXJTb3VyY2Uoc2hhZGVyLCBzb3VyY2UpO1xuICBnbC5jb21waWxlU2hhZGVyKHNoYWRlcik7XG4gIGlmICghZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKHNoYWRlciwgZ2wuQ09NUElMRV9TVEFUVVMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGdsLmdldFNoYWRlckluZm9Mb2coc2hhZGVyKSk7XG4gIH1cbiAgLy8gY29uc29sZS5sb2coZ2wuZ2V0U2hhZGVySW5mb0xvZyhzaGFkZXIpKTtcbiAgcmV0dXJuIHNoYWRlcjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVByb2dyYW0oZ2wsIHZlcnRleFNvdXJjZSwgZnJhZ2VtZW50U291cmNlKSB7XG4gIHZhciB2ZXJ0ZXhTaGFkZXIgPSBjb21waWxlU2hhZGVyKGdsLCBnbC5WRVJURVhfU0hBREVSLCB2ZXJ0ZXhTb3VyY2UpO1xuICB2YXIgZnJhZ21lbnRTaGFkZXIgPSBjb21waWxlU2hhZGVyKGdsLCBnbC5GUkFHTUVOVF9TSEFERVIsIGZyYWdlbWVudFNvdXJjZSk7XG4gIHZhciBwcm9ncmFtID0gZ2wuY3JlYXRlUHJvZ3JhbSgpO1xuICBnbC5hdHRhY2hTaGFkZXIocHJvZ3JhbSwgdmVydGV4U2hhZGVyKTtcbiAgZ2wuYXR0YWNoU2hhZGVyKHByb2dyYW0sIGZyYWdtZW50U2hhZGVyKTtcbiAgZ2wubGlua1Byb2dyYW0ocHJvZ3JhbSk7XG4gIGlmICghZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlcihwcm9ncmFtLCBnbC5MSU5LX1NUQVRVUykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBpbml0aWFsaXplIHNoYWRlcnMnKTtcbiAgfVxuICByZXR1cm4gcHJvZ3JhbTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIG9mZnNjcmVuIGNhbnZhcyB3aXRoIGEgMkQgY29udGV4dCwgZm9yIHRoZVxuICogY2FudmFzIHJlbmRlcmVyIHRvIHVzZSBmb3IgZHJhd2luZyB0ZXh0dXJlcy5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlVGV4dHVyZUNhbnZhcyhyLCB3aWR0aCwgaGVpZ2h0KSB7XG4gIGlmIChoZWlnaHQgPT09IHVuZGVmaW5lZCkge1xuICAgIGhlaWdodCA9IHdpZHRoO1xuICB9XG4gIHZhciBjYW52YXMgPSByLm1ha2VPZmZzY3JlZW5DYW52YXMod2lkdGgsIGhlaWdodCk7XG4gIHZhciBjdHggPSBjYW52YXMuY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICBjYW52YXMuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGN0eC5jbGVhclJlY3QoMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcbiAgfTtcbiAgY2FudmFzLmNsZWFyKCk7XG4gIHJldHVybiBjYW52YXM7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgY3VycmVudCBwYW4gJiB6b29tIHZhbHVlcywgc2NhbGVkIGJ5IHRoZSBwaXhlbCByYXRpby5cbiAqL1xuZnVuY3Rpb24gZ2V0RWZmZWN0aXZlUGFuWm9vbShyKSB7XG4gIHZhciBwaXhlbFJhdGlvID0gci5waXhlbFJhdGlvO1xuICB2YXIgem9vbSA9IHIuY3kuem9vbSgpO1xuICB2YXIgcGFuID0gci5jeS5wYW4oKTtcbiAgcmV0dXJuIHtcbiAgICB6b29tOiB6b29tICogcGl4ZWxSYXRpbyxcbiAgICBwYW46IHtcbiAgICAgIHg6IHBhbi54ICogcGl4ZWxSYXRpbyxcbiAgICAgIHk6IHBhbi55ICogcGl4ZWxSYXRpb1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSB6b29tIHZhbHVlLCBzY2FsZWQgYnkgdGhlIHBpeGVsIHJhdGlvLlxuICovXG5mdW5jdGlvbiBnZXRFZmZlY3RpdmVab29tKHIpIHtcbiAgdmFyIHBpeGVsUmF0aW8gPSByLnBpeGVsUmF0aW87XG4gIHZhciB6b29tID0gci5jeS56b29tKCk7XG4gIHJldHVybiB6b29tICogcGl4ZWxSYXRpbztcbn1cbmZ1bmN0aW9uIG1vZGVsVG9SZW5kZXJlZFBvc2l0aW9uKHIsIHBhbiwgem9vbSwgeCwgeSkge1xuICB2YXIgcnggPSB4ICogem9vbSArIHBhbi54O1xuICB2YXIgcnkgPSB5ICogem9vbSArIHBhbi55O1xuICByeSA9IE1hdGgucm91bmQoci5jYW52YXNIZWlnaHQgLSByeSk7IC8vIGFkanVzdCBmb3Igd2ViZ2xcbiAgcmV0dXJuIFtyeCwgcnldO1xufVxuZnVuY3Rpb24gaXNTaW1wbGVTaGFwZShub2RlLCByZW5kZXJUYXJnZXQpIHtcbiAgLy8gdGhlIGFjdHVhbCBzaGFwZSBpcyBjaGVja2VkIGluIEVsZW1lbnREcmF3aW5nV2ViR0wuX2dldFZlcnRUeXBlRm9yU2hhcGUoKVxuICAvLyBubyBuZWVkIHRvIGNoZWNrIGl0IHR3aWNlLCB0aGlzIGp1c3QgY2hlY2tzIG90aGVyIHZpc3VhbCBwcm9wZXJ0aWVzXG4gIGlmIChyZW5kZXJUYXJnZXQucGlja2luZykge1xuICAgIC8vIFdlIGRvbid0IGNhcmUgYWJvdXQgdGhlIGJvcmRlciBvciBiYWNrZ3JvdW5kIHN0eWxlIGZvciBwaWNraW5nXG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSB7XG4gICAgaWYgKG5vZGUucHN0eWxlKCdiYWNrZ3JvdW5kLWZpbGwnKS52YWx1ZSAhPT0gJ3NvbGlkJykgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChub2RlLnBzdHlsZSgnYmFja2dyb3VuZC1pbWFnZScpLnN0clZhbHVlICE9PSAnbm9uZScpIHJldHVybiBmYWxzZTtcbiAgICBpZiAobm9kZS5wc3R5bGUoJ2JvcmRlci13aWR0aCcpLnZhbHVlID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAobm9kZS5wc3R5bGUoJ2JvcmRlci1vcGFjaXR5JykudmFsdWUgPT09IDApIHJldHVybiB0cnVlO1xuICAgIC8vIHdlIGhhdmUgYSBib3JkZXIgYnV0IGl0IG11c3QgYmUgc2ltcGxlXG4gICAgaWYgKG5vZGUucHN0eWxlKCdib3JkZXItc3R5bGUnKS52YWx1ZSAhPT0gJ3NvbGlkJykgcmV0dXJuIGZhbHNlO1xuICAgIC8vIFRPRE8gaWdub3JpbmcgJ2JvcmRlci1jYXAnLCAnYm9yZGVyLWpvaW4nIGFuZCAnYm9yZGVyLXBvc2l0aW9uJyBmb3Igbm93XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cbmZ1bmN0aW9uIGFycmF5RXF1YWwoYTEsIGEyKSB7XG4gIGlmIChhMS5sZW5ndGggIT09IGEyLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGExLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGExW2ldICE9PSBhMltpXSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBUYWtlcyBjb2xvciAmIG9wYWNpdHkgc3R5bGUgdmFsdWVzIGFuZCBjb252ZXJ0cyB0aGVtIHRvIFdlYkdMIGZvcm1hdC4gXG4gKiBBbHBoYSBpcyBwcmVtdWx0aXBsaWVkLlxuICovXG5mdW5jdGlvbiB0b1dlYkdMQ29sb3IoY29sb3IsIG9wYWNpdHksIG91dEFycmF5KSB7XG4gIHZhciByID0gY29sb3JbMF0gLyAyNTU7XG4gIHZhciBnID0gY29sb3JbMV0gLyAyNTU7XG4gIHZhciBiID0gY29sb3JbMl0gLyAyNTU7XG4gIHZhciBhID0gb3BhY2l0eTtcbiAgdmFyIGFyciA9IG91dEFycmF5IHx8IG5ldyBBcnJheSg0KTtcbiAgYXJyWzBdID0gciAqIGE7XG4gIGFyclsxXSA9IGcgKiBhO1xuICBhcnJbMl0gPSBiICogYTtcbiAgYXJyWzNdID0gYTtcbiAgcmV0dXJuIGFycjtcbn1cbmZ1bmN0aW9uIGluZGV4VG9WZWM0KGluZGV4LCBvdXRBcnJheSkge1xuICB2YXIgYXJyID0gb3V0QXJyYXkgfHwgbmV3IEFycmF5KDQpO1xuICBhcnJbMF0gPSAoaW5kZXggPj4gMCAmIDB4RkYpIC8gMHhGRjtcbiAgYXJyWzFdID0gKGluZGV4ID4+IDggJiAweEZGKSAvIDB4RkY7XG4gIGFyclsyXSA9IChpbmRleCA+PiAxNiAmIDB4RkYpIC8gMHhGRjtcbiAgYXJyWzNdID0gKGluZGV4ID4+IDI0ICYgMHhGRikgLyAweEZGO1xuICByZXR1cm4gYXJyO1xufVxuZnVuY3Rpb24gdmVjNFRvSW5kZXgodmVjNCkge1xuICByZXR1cm4gdmVjNFswXSArICh2ZWM0WzFdIDw8IDgpICsgKHZlYzRbMl0gPDwgMTYpICsgKHZlYzRbM10gPDwgMjQpO1xufVxuZnVuY3Rpb24gY3JlYXRlVGV4dHVyZShnbCwgZGVidWdJRCkge1xuICB2YXIgdGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKTtcbiAgdGV4dHVyZS5idWZmZXIgPSBmdW5jdGlvbiAob2Zmc2NyZWVuQ2FudmFzKSB7XG4gICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZSk7XG4gICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfUywgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfVCwgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLkxJTkVBUik7XG4gICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLkxJTkVBUl9NSVBNQVBfTkVBUkVTVCk7XG5cbiAgICAvLyB2ZXJ5IGltcG9ydGFudCwgdGhpcyB0ZWxscyB3ZWJnbCB0byBwcmVtdWx0aXBseSBjb2xvcnMgYnkgdGhlIGFscGhhIGNoYW5uZWxcbiAgICBnbC5waXhlbFN0b3JlaShnbC5VTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0wsIHRydWUpO1xuICAgIGdsLnRleEltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgZ2wuUkdCQSwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgb2Zmc2NyZWVuQ2FudmFzKTtcbiAgICBnbC5nZW5lcmF0ZU1pcG1hcChnbC5URVhUVVJFXzJEKTtcbiAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBudWxsKTtcbiAgfTtcbiAgdGV4dHVyZS5kZWxldGVUZXh0dXJlID0gZnVuY3Rpb24gKCkge1xuICAgIGdsLmRlbGV0ZVRleHR1cmUodGV4dHVyZSk7XG4gIH07XG4gIHJldHVybiB0ZXh0dXJlO1xufVxuZnVuY3Rpb24gZ2V0VHlwZUluZm8oZ2wsIGdsc2xUeXBlKSB7XG4gIHN3aXRjaCAoZ2xzbFR5cGUpIHtcbiAgICBjYXNlICdmbG9hdCc6XG4gICAgICByZXR1cm4gWzEsIGdsLkZMT0FULCA0XTtcbiAgICBjYXNlICd2ZWMyJzpcbiAgICAgIHJldHVybiBbMiwgZ2wuRkxPQVQsIDRdO1xuICAgIGNhc2UgJ3ZlYzMnOlxuICAgICAgcmV0dXJuIFszLCBnbC5GTE9BVCwgNF07XG4gICAgY2FzZSAndmVjNCc6XG4gICAgICByZXR1cm4gWzQsIGdsLkZMT0FULCA0XTtcbiAgICBjYXNlICdpbnQnOlxuICAgICAgcmV0dXJuIFsxLCBnbC5JTlQsIDRdO1xuICAgIGNhc2UgJ2l2ZWMyJzpcbiAgICAgIHJldHVybiBbMiwgZ2wuSU5ULCA0XTtcbiAgfVxufVxuZnVuY3Rpb24gY3JlYXRlVHlwZWRBcnJheShnbCwgZ2xUeXBlLCBkYXRhT3JTaXplKSB7XG4gIHN3aXRjaCAoZ2xUeXBlKSB7XG4gICAgY2FzZSBnbC5GTE9BVDpcbiAgICAgIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KGRhdGFPclNpemUpO1xuICAgIGNhc2UgZ2wuSU5UOlxuICAgICAgcmV0dXJuIG5ldyBJbnQzMkFycmF5KGRhdGFPclNpemUpO1xuICB9XG59XG5mdW5jdGlvbiBjcmVhdGVUeXBlZEFycmF5VmlldyhnbCwgZ2xUeXBlLCBhcnJheSwgc3RyaWRlLCBzaXplLCBpKSB7XG4gIHN3aXRjaCAoZ2xUeXBlKSB7XG4gICAgY2FzZSBnbC5GTE9BVDpcbiAgICAgIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KGFycmF5LmJ1ZmZlciwgaSAqIHN0cmlkZSwgc2l6ZSk7XG4gICAgY2FzZSBnbC5JTlQ6XG4gICAgICByZXR1cm4gbmV3IEludDMyQXJyYXkoYXJyYXkuYnVmZmVyLCBpICogc3RyaWRlLCBzaXplKTtcbiAgfVxufVxuXG4vKiogQHBhcmFtIHtXZWJHTFJlbmRlcmluZ0NvbnRleHR9IGdsICovXG5mdW5jdGlvbiBjcmVhdGVCdWZmZXJTdGF0aWNEcmF3KGdsLCB0eXBlLCBhdHRyaWJ1dGVMb2MsIGRhdGFBcnJheSkge1xuICB2YXIgX2dldFR5cGVJbmZvID0gZ2V0VHlwZUluZm8oZ2wsIHR5cGUpLFxuICAgIF9nZXRUeXBlSW5mbzIgPSBfc2xpY2VkVG9BcnJheShfZ2V0VHlwZUluZm8sIDIpLFxuICAgIHNpemUgPSBfZ2V0VHlwZUluZm8yWzBdLFxuICAgIGdsVHlwZSA9IF9nZXRUeXBlSW5mbzJbMV07XG4gIHZhciBkYXRhID0gY3JlYXRlVHlwZWRBcnJheShnbCwgZ2xUeXBlLCBkYXRhQXJyYXkpO1xuICB2YXIgYnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7XG4gIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBidWZmZXIpO1xuICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgZGF0YSwgZ2wuU1RBVElDX0RSQVcpO1xuICBpZiAoZ2xUeXBlID09PSBnbC5GTE9BVCkge1xuICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoYXR0cmlidXRlTG9jLCBzaXplLCBnbFR5cGUsIGZhbHNlLCAwLCAwKTtcbiAgfSBlbHNlIGlmIChnbFR5cGUgPT09IGdsLklOVCkge1xuICAgIGdsLnZlcnRleEF0dHJpYklQb2ludGVyKGF0dHJpYnV0ZUxvYywgc2l6ZSwgZ2xUeXBlLCAwLCAwKTtcbiAgfVxuICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShhdHRyaWJ1dGVMb2MpO1xuICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgbnVsbCk7XG4gIHJldHVybiBidWZmZXI7XG59XG5cbi8qKiBcbiAqIENyZWF0ZXMgYSBmbG9hdCBidWZmZXIgd2l0aCBnbC5EWU5BTUlDX0RSQVcuXG4gKiBUaGUgcmV0dXJuZWQgYnVmZmVyIG9iamVjdCBjb250YWlucyBmdW5jdGlvbnMgdG8gZWFzaWx5IHNldCBpbnN0YW5jZSBkYXRhIGFuZCBidWZmZXIgdGhlIGRhdGEgYmVmb3JlIGEgZHJhdyBjYWxsLlxuICogQHBhcmFtIHtXZWJHTFJlbmRlcmluZ0NvbnRleHR9IGdsIFxuICovXG5mdW5jdGlvbiBjcmVhdGVCdWZmZXJEeW5hbWljRHJhdyhnbCwgaW5zdGFuY2VzLCB0eXBlLCBhdHRyaWJ1dGVMb2MpIHtcbiAgdmFyIF9nZXRUeXBlSW5mbzMgPSBnZXRUeXBlSW5mbyhnbCwgdHlwZSksXG4gICAgX2dldFR5cGVJbmZvNCA9IF9zbGljZWRUb0FycmF5KF9nZXRUeXBlSW5mbzMsIDMpLFxuICAgIHNpemUgPSBfZ2V0VHlwZUluZm80WzBdLFxuICAgIGdsVHlwZSA9IF9nZXRUeXBlSW5mbzRbMV0sXG4gICAgYnl0ZXMgPSBfZ2V0VHlwZUluZm80WzJdO1xuICB2YXIgZGF0YUFycmF5ID0gY3JlYXRlVHlwZWRBcnJheShnbCwgZ2xUeXBlLCBpbnN0YW5jZXMgKiBzaXplKTtcbiAgdmFyIHN0cmlkZSA9IHNpemUgKiBieXRlcztcbiAgdmFyIGJ1ZmZlciA9IGdsLmNyZWF0ZUJ1ZmZlcigpO1xuICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgYnVmZmVyKTtcbiAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIGluc3RhbmNlcyAqIHN0cmlkZSwgZ2wuRFlOQU1JQ19EUkFXKTtcbiAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoYXR0cmlidXRlTG9jKTtcbiAgaWYgKGdsVHlwZSA9PT0gZ2wuRkxPQVQpIHtcbiAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGF0dHJpYnV0ZUxvYywgc2l6ZSwgZ2xUeXBlLCBmYWxzZSwgc3RyaWRlLCAwKTtcbiAgfSBlbHNlIGlmIChnbFR5cGUgPT09IGdsLklOVCkge1xuICAgIGdsLnZlcnRleEF0dHJpYklQb2ludGVyKGF0dHJpYnV0ZUxvYywgc2l6ZSwgZ2xUeXBlLCBzdHJpZGUsIDApO1xuICB9XG4gIGdsLnZlcnRleEF0dHJpYkRpdmlzb3IoYXR0cmlidXRlTG9jLCAxKTtcbiAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIG51bGwpO1xuXG4gIC8vIHVzZSBhcnJheSB2aWV3cyB0byBzZXQgdmFsdWVzIGRpcmVjdGx5IGludG8gdGhlIGJ1ZmZlciBhcnJheVxuICB2YXIgdmlld3MgPSBuZXcgQXJyYXkoaW5zdGFuY2VzKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbnN0YW5jZXM7IGkrKykge1xuICAgIHZpZXdzW2ldID0gY3JlYXRlVHlwZWRBcnJheVZpZXcoZ2wsIGdsVHlwZSwgZGF0YUFycmF5LCBzdHJpZGUsIHNpemUsIGkpO1xuICB9XG4gIGJ1ZmZlci5kYXRhQXJyYXkgPSBkYXRhQXJyYXk7XG4gIGJ1ZmZlci5zdHJpZGUgPSBzdHJpZGU7XG4gIGJ1ZmZlci5zaXplID0gc2l6ZTtcbiAgYnVmZmVyLmdldFZpZXcgPSBmdW5jdGlvbiAoaSkge1xuICAgIHJldHVybiB2aWV3c1tpXTtcbiAgfTtcbiAgYnVmZmVyLnNldFBvaW50ID0gZnVuY3Rpb24gKGksIHgsIHkpIHtcbiAgICB2YXIgdmlldyA9IHZpZXdzW2ldO1xuICAgIHZpZXdbMF0gPSB4O1xuICAgIHZpZXdbMV0gPSB5O1xuICB9O1xuICBidWZmZXIuYnVmZmVyU3ViRGF0YSA9IGZ1bmN0aW9uIChjb3VudCkge1xuICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBidWZmZXIpO1xuICAgIGlmIChjb3VudCkge1xuICAgICAgZ2wuYnVmZmVyU3ViRGF0YShnbC5BUlJBWV9CVUZGRVIsIDAsIGRhdGFBcnJheSwgMCwgY291bnQgKiBzaXplKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2wuYnVmZmVyU3ViRGF0YShnbC5BUlJBWV9CVUZGRVIsIDAsIGRhdGFBcnJheSk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gYnVmZmVyO1xufVxuXG4vKiogXG4gKiBDcmVhdGVzIGEgYnVmZmVyIG9mIDN4MyBtYXRyaXggZGF0YSBmb3IgdXNlIGFzIGF0dHJpYnV0ZSBkYXRhLlxuICogQHBhcmFtIHtXZWJHTFJlbmRlcmluZ0NvbnRleHR9IGdsIFxuICovXG5mdW5jdGlvbiBjcmVhdGUzeDNNYXRyaXhCdWZmZXJEeW5hbWljRHJhdyhnbCwgaW5zdGFuY2VzLCBhdHRyaWJ1dGVMb2MpIHtcbiAgdmFyIG1hdHJpeFNpemUgPSA5OyAvLyAzeDMgbWF0cml4XG4gIHZhciBtYXRyaXhEYXRhID0gbmV3IEZsb2F0MzJBcnJheShpbnN0YW5jZXMgKiBtYXRyaXhTaXplKTtcblxuICAvLyB1c2UgbWF0cml4IHZpZXdzIHRvIHNldCB2YWx1ZXMgZGlyZWN0bHkgaW50byB0aGUgbWF0cml4RGF0YSBhcnJheVxuICB2YXIgbWF0cml4Vmlld3MgPSBuZXcgQXJyYXkoaW5zdGFuY2VzKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbnN0YW5jZXM7IGkrKykge1xuICAgIHZhciBieXRlT2Zmc2V0ID0gaSAqIG1hdHJpeFNpemUgKiA0OyAvLyA0IGJ5dGVzIHBlciBmbG9hdFxuICAgIG1hdHJpeFZpZXdzW2ldID0gbmV3IEZsb2F0MzJBcnJheShtYXRyaXhEYXRhLmJ1ZmZlciwgYnl0ZU9mZnNldCwgbWF0cml4U2l6ZSk7IC8vIGFycmF5IHZpZXdcbiAgfVxuICB2YXIgYnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7XG4gIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBidWZmZXIpO1xuICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgbWF0cml4RGF0YS5ieXRlTGVuZ3RoLCBnbC5EWU5BTUlDX0RSQVcpO1xuXG4gIC8vIGVhY2ggcm93IG9mIHRoZSBtYXRyaXggbmVlZHMgdG8gYmUgYSBzZXBhcmF0ZSBhdHRyaWJ1dGVcbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IDM7IF9pKyspIHtcbiAgICB2YXIgbG9jID0gYXR0cmlidXRlTG9jICsgX2k7XG4gICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkobG9jKTtcbiAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGxvYywgMywgZ2wuRkxPQVQsIGZhbHNlLCAzICogMTIsIF9pICogMTIpO1xuICAgIGdsLnZlcnRleEF0dHJpYkRpdmlzb3IobG9jLCAxKTtcbiAgfVxuICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgbnVsbCk7XG4gIGJ1ZmZlci5nZXRNYXRyaXhWaWV3ID0gZnVuY3Rpb24gKGkpIHtcbiAgICByZXR1cm4gbWF0cml4Vmlld3NbaV07XG4gIH07XG5cbiAgLy8gVE9ETyB0aGlzIGlzIHRvbyBzbG93LCB1c2UgZ2V0TWF0cml4VmlldyBhbmQgcGFzcyB0aGUgdmlldyBkaXJlY3RseSB0byB0aGUgZ2xtYXRyaXggbGlicmFyeVxuICBidWZmZXIuc2V0RGF0YSA9IGZ1bmN0aW9uIChtYXRyaXgsIGkpIHtcbiAgICBtYXRyaXhWaWV3c1tpXS5zZXQobWF0cml4LCAwKTtcbiAgfTtcbiAgYnVmZmVyLmJ1ZmZlclN1YkRhdGEgPSBmdW5jdGlvbiAoKSB7XG4gICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIGJ1ZmZlcik7XG4gICAgZ2wuYnVmZmVyU3ViRGF0YShnbC5BUlJBWV9CVUZGRVIsIDAsIG1hdHJpeERhdGEpO1xuICB9O1xuICByZXR1cm4gYnVmZmVyO1xufVxuXG4vKiogXG4gKiBDcmVhdGVzIGEgRnJhbWUgQnVmZmVyIHRvIHVzZSBmb3Igb2Zmc2NyZWVuIHJlbmRlcmluZy5cbiAqIEBwYXJhbSB7V2ViR0xSZW5kZXJpbmdDb250ZXh0fSBnbCBcbiAqL1xuZnVuY3Rpb24gY3JlYXRlUGlja2luZ0ZyYW1lQnVmZmVyKGdsKSB7XG4gIC8vIENyZWF0ZSBhbmQgYmluZCB0aGUgZnJhbWVidWZmZXJcbiAgdmFyIGZiID0gZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTtcbiAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBmYik7XG5cbiAgLy8gQ3JlYXRlIGEgdGV4dHVyZSB0byByZW5kZXIgdG9cbiAgdmFyIHRhcmdldFRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCk7XG4gIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRhcmdldFRleHR1cmUpO1xuICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTElORUFSKTtcbiAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfUywgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1QsIGdsLkNMQU1QX1RPX0VER0UpO1xuXG4gIC8vIGF0dGFjaCB0aGUgdGV4dHVyZSBhcyB0aGUgZmlyc3QgY29sb3IgYXR0YWNobWVudFxuICBnbC5mcmFtZWJ1ZmZlclRleHR1cmUyRChnbC5GUkFNRUJVRkZFUiwgZ2wuQ09MT1JfQVRUQUNITUVOVDAsIGdsLlRFWFRVUkVfMkQsIHRhcmdldFRleHR1cmUsIDApO1xuICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIG51bGwpO1xuICBmYi5zZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRTaXplcyA9IGZ1bmN0aW9uICh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGFyZ2V0VGV4dHVyZSk7XG4gICAgZ2wudGV4SW1hZ2UyRChnbC5URVhUVVJFXzJELCAwLCBnbC5SR0JBLCB3aWR0aCwgaGVpZ2h0LCAwLCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCBudWxsKTtcbiAgfTtcbiAgcmV0dXJuIGZiO1xufVxuXG4vKipcbiAqIENvbW1vbiB1dGlsaXRpZXNcbiAqIEBtb2R1bGUgZ2xNYXRyaXhcbiAqL1xuLy8gQ29uZmlndXJhdGlvbiBDb25zdGFudHNcbnZhciBBUlJBWV9UWVBFID0gdHlwZW9mIEZsb2F0MzJBcnJheSAhPT0gJ3VuZGVmaW5lZCcgPyBGbG9hdDMyQXJyYXkgOiBBcnJheTtcbmlmICghTWF0aC5oeXBvdCkgTWF0aC5oeXBvdCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHkgPSAwLFxuICAgICAgaSA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cbiAgd2hpbGUgKGktLSkge1xuICAgIHkgKz0gYXJndW1lbnRzW2ldICogYXJndW1lbnRzW2ldO1xuICB9XG5cbiAgcmV0dXJuIE1hdGguc3FydCh5KTtcbn07XG5cbi8qKlxuICogM3gzIE1hdHJpeFxuICogQG1vZHVsZSBtYXQzXG4gKi9cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGlkZW50aXR5IG1hdDNcbiAqXG4gKiBAcmV0dXJucyB7bWF0M30gYSBuZXcgM3gzIG1hdHJpeFxuICovXG5cbmZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgdmFyIG91dCA9IG5ldyBBUlJBWV9UWVBFKDkpO1xuXG4gIGlmIChBUlJBWV9UWVBFICE9IEZsb2F0MzJBcnJheSkge1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAwO1xuICAgIG91dFs1XSA9IDA7XG4gICAgb3V0WzZdID0gMDtcbiAgICBvdXRbN10gPSAwO1xuICB9XG5cbiAgb3V0WzBdID0gMTtcbiAgb3V0WzRdID0gMTtcbiAgb3V0WzhdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogU2V0IGEgbWF0MyB0byB0aGUgaWRlbnRpdHkgbWF0cml4XG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xuXG5mdW5jdGlvbiBpZGVudGl0eShvdXQpIHtcbiAgb3V0WzBdID0gMTtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gMTtcbiAgb3V0WzVdID0gMDtcbiAgb3V0WzZdID0gMDtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogTXVsdGlwbGllcyB0d28gbWF0MydzXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xuXG5mdW5jdGlvbiBtdWx0aXBseShvdXQsIGEsIGIpIHtcbiAgdmFyIGEwMCA9IGFbMF0sXG4gICAgICBhMDEgPSBhWzFdLFxuICAgICAgYTAyID0gYVsyXTtcbiAgdmFyIGExMCA9IGFbM10sXG4gICAgICBhMTEgPSBhWzRdLFxuICAgICAgYTEyID0gYVs1XTtcbiAgdmFyIGEyMCA9IGFbNl0sXG4gICAgICBhMjEgPSBhWzddLFxuICAgICAgYTIyID0gYVs4XTtcbiAgdmFyIGIwMCA9IGJbMF0sXG4gICAgICBiMDEgPSBiWzFdLFxuICAgICAgYjAyID0gYlsyXTtcbiAgdmFyIGIxMCA9IGJbM10sXG4gICAgICBiMTEgPSBiWzRdLFxuICAgICAgYjEyID0gYls1XTtcbiAgdmFyIGIyMCA9IGJbNl0sXG4gICAgICBiMjEgPSBiWzddLFxuICAgICAgYjIyID0gYls4XTtcbiAgb3V0WzBdID0gYjAwICogYTAwICsgYjAxICogYTEwICsgYjAyICogYTIwO1xuICBvdXRbMV0gPSBiMDAgKiBhMDEgKyBiMDEgKiBhMTEgKyBiMDIgKiBhMjE7XG4gIG91dFsyXSA9IGIwMCAqIGEwMiArIGIwMSAqIGExMiArIGIwMiAqIGEyMjtcbiAgb3V0WzNdID0gYjEwICogYTAwICsgYjExICogYTEwICsgYjEyICogYTIwO1xuICBvdXRbNF0gPSBiMTAgKiBhMDEgKyBiMTEgKiBhMTEgKyBiMTIgKiBhMjE7XG4gIG91dFs1XSA9IGIxMCAqIGEwMiArIGIxMSAqIGExMiArIGIxMiAqIGEyMjtcbiAgb3V0WzZdID0gYjIwICogYTAwICsgYjIxICogYTEwICsgYjIyICogYTIwO1xuICBvdXRbN10gPSBiMjAgKiBhMDEgKyBiMjEgKiBhMTEgKyBiMjIgKiBhMjE7XG4gIG91dFs4XSA9IGIyMCAqIGEwMiArIGIyMSAqIGExMiArIGIyMiAqIGEyMjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogVHJhbnNsYXRlIGEgbWF0MyBieSB0aGUgZ2l2ZW4gdmVjdG9yXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBhIHRoZSBtYXRyaXggdG8gdHJhbnNsYXRlXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gdiB2ZWN0b3IgdG8gdHJhbnNsYXRlIGJ5XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cblxuZnVuY3Rpb24gdHJhbnNsYXRlKG91dCwgYSwgdikge1xuICB2YXIgYTAwID0gYVswXSxcbiAgICAgIGEwMSA9IGFbMV0sXG4gICAgICBhMDIgPSBhWzJdLFxuICAgICAgYTEwID0gYVszXSxcbiAgICAgIGExMSA9IGFbNF0sXG4gICAgICBhMTIgPSBhWzVdLFxuICAgICAgYTIwID0gYVs2XSxcbiAgICAgIGEyMSA9IGFbN10sXG4gICAgICBhMjIgPSBhWzhdLFxuICAgICAgeCA9IHZbMF0sXG4gICAgICB5ID0gdlsxXTtcbiAgb3V0WzBdID0gYTAwO1xuICBvdXRbMV0gPSBhMDE7XG4gIG91dFsyXSA9IGEwMjtcbiAgb3V0WzNdID0gYTEwO1xuICBvdXRbNF0gPSBhMTE7XG4gIG91dFs1XSA9IGExMjtcbiAgb3V0WzZdID0geCAqIGEwMCArIHkgKiBhMTAgKyBhMjA7XG4gIG91dFs3XSA9IHggKiBhMDEgKyB5ICogYTExICsgYTIxO1xuICBvdXRbOF0gPSB4ICogYTAyICsgeSAqIGExMiArIGEyMjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUm90YXRlcyBhIG1hdDMgYnkgdGhlIGdpdmVuIGFuZ2xlXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBhIHRoZSBtYXRyaXggdG8gcm90YXRlXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5cbmZ1bmN0aW9uIHJvdGF0ZShvdXQsIGEsIHJhZCkge1xuICB2YXIgYTAwID0gYVswXSxcbiAgICAgIGEwMSA9IGFbMV0sXG4gICAgICBhMDIgPSBhWzJdLFxuICAgICAgYTEwID0gYVszXSxcbiAgICAgIGExMSA9IGFbNF0sXG4gICAgICBhMTIgPSBhWzVdLFxuICAgICAgYTIwID0gYVs2XSxcbiAgICAgIGEyMSA9IGFbN10sXG4gICAgICBhMjIgPSBhWzhdLFxuICAgICAgcyA9IE1hdGguc2luKHJhZCksXG4gICAgICBjID0gTWF0aC5jb3MocmFkKTtcbiAgb3V0WzBdID0gYyAqIGEwMCArIHMgKiBhMTA7XG4gIG91dFsxXSA9IGMgKiBhMDEgKyBzICogYTExO1xuICBvdXRbMl0gPSBjICogYTAyICsgcyAqIGExMjtcbiAgb3V0WzNdID0gYyAqIGExMCAtIHMgKiBhMDA7XG4gIG91dFs0XSA9IGMgKiBhMTEgLSBzICogYTAxO1xuICBvdXRbNV0gPSBjICogYTEyIC0gcyAqIGEwMjtcbiAgb3V0WzZdID0gYTIwO1xuICBvdXRbN10gPSBhMjE7XG4gIG91dFs4XSA9IGEyMjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogU2NhbGVzIHRoZSBtYXQzIGJ5IHRoZSBkaW1lbnNpb25zIGluIHRoZSBnaXZlbiB2ZWMyXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBhIHRoZSBtYXRyaXggdG8gcm90YXRlXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gdiB0aGUgdmVjMiB0byBzY2FsZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKiovXG5cbmZ1bmN0aW9uIHNjYWxlKG91dCwgYSwgdikge1xuICB2YXIgeCA9IHZbMF0sXG4gICAgICB5ID0gdlsxXTtcbiAgb3V0WzBdID0geCAqIGFbMF07XG4gIG91dFsxXSA9IHggKiBhWzFdO1xuICBvdXRbMl0gPSB4ICogYVsyXTtcbiAgb3V0WzNdID0geSAqIGFbM107XG4gIG91dFs0XSA9IHkgKiBhWzRdO1xuICBvdXRbNV0gPSB5ICogYVs1XTtcbiAgb3V0WzZdID0gYVs2XTtcbiAgb3V0WzddID0gYVs3XTtcbiAgb3V0WzhdID0gYVs4XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogR2VuZXJhdGVzIGEgMkQgcHJvamVjdGlvbiBtYXRyaXggd2l0aCB0aGUgZ2l2ZW4gYm91bmRzXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgbWF0MyBmcnVzdHVtIG1hdHJpeCB3aWxsIGJlIHdyaXR0ZW4gaW50b1xuICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIFdpZHRoIG9mIHlvdXIgZ2wgY29udGV4dFxuICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCBIZWlnaHQgb2YgZ2wgY29udGV4dFxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5cbmZ1bmN0aW9uIHByb2plY3Rpb24ob3V0LCB3aWR0aCwgaGVpZ2h0KSB7XG4gIG91dFswXSA9IDIgLyB3aWR0aDtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gLTIgLyBoZWlnaHQ7XG4gIG91dFs1XSA9IDA7XG4gIG91dFs2XSA9IC0xO1xuICBvdXRbN10gPSAxO1xuICBvdXRbOF0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuXG4vLyBBIFwidGV4dHVyZSBhdGxhc1wiIGlzIGEgYmlnIGNhbnZhcywgYW5kIHNlY3Rpb25zIG9mIGl0IGFyZSB1c2VkIGFzIHRleHR1cmVzIGZvciBub2Rlcy9sYWJlbHMuXG5cbi8qKlxuICogQSBzaW5nbGUgc3F1YXJlIHRleHR1cmUgYXRsYXMgKGFsc28ga25vd24gYXMgYSBcInNwcml0ZSBzaGVldFwiKS5cbiAqL1xudmFyIEF0bGFzID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQXRsYXMociwgdGV4U2l6ZSwgdGV4Um93cywgY3JlYXRlVGV4dHVyZUNhbnZhcykge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBBdGxhcyk7XG4gICAgdGhpcy5kZWJ1Z0lEID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTAwMDApO1xuICAgIHRoaXMuciA9IHI7XG4gICAgdGhpcy50ZXhTaXplID0gdGV4U2l6ZTtcbiAgICB0aGlzLnRleFJvd3MgPSB0ZXhSb3dzO1xuICAgIHRoaXMudGV4SGVpZ2h0ID0gTWF0aC5mbG9vcih0ZXhTaXplIC8gdGV4Um93cyk7XG4gICAgdGhpcy5lbmFibGVXcmFwcGluZyA9IHRydWU7IC8vIGhhcmRjb2RlZCBmb3Igbm93LCBjYW4gYmUgbWFkZSBhbiBvcHRpb25cblxuICAgIHRoaXMubG9ja2VkID0gZmFsc2U7IC8vIG9uY2UgYW4gYXRsYXMgaXMgbG9ja2VkIGl0IGNhbiBubyBsb25nZXIgYmUgZHJhd24gdG9cbiAgICB0aGlzLnRleHR1cmUgPSBudWxsOyAvLyBXZWJHTFRleHR1cmUgb2JqZWN0XG4gICAgdGhpcy5uZWVkc0J1ZmZlciA9IHRydWU7XG5cbiAgICAvLyBhIFwibG9jYXRpb25cIiBpcyBhbiBwb2ludGVyIGludG8gdGhlIGF0bGFzIHdpdGggYSAncm93JyBhbmQgJ3gnIGZpZWxkc1xuICAgIHRoaXMuZnJlZVBvaW50ZXIgPSB7XG4gICAgICB4OiAwLFxuICAgICAgcm93OiAwXG4gICAgfTtcblxuICAgIC8vIG1hcCBmcm9tIHRoZSBzdHlsZSBrZXkgdG8gdGhlIHJvdy94IHdoZXJlIHRoZSB0ZXh0dXJlIHN0YXJ0c1xuICAgIC8vIGlmIHRoZSB0ZXh0dXJlIHdyYXBzIHRoZW4gdGhlcmUncyBhIHNlY29uZCBsb2NhdGlvblxuICAgIHRoaXMua2V5VG9Mb2NhdGlvbiA9IG5ldyBNYXAoKTsgLy8gc3R5bGVLZXkgLT4gWyBsb2NhdGlvbiwgbG9jYXRpb24gXVxuXG4gICAgdGhpcy5jYW52YXMgPSBjcmVhdGVUZXh0dXJlQ2FudmFzKHIsIHRleFNpemUsIHRleFNpemUpO1xuICAgIHRoaXMuc2NyYXRjaCA9IGNyZWF0ZVRleHR1cmVDYW52YXMociwgdGV4U2l6ZSwgdGhpcy50ZXhIZWlnaHQsICdzY3JhdGNoJyk7XG4gIH1cbiAgcmV0dXJuIF9jcmVhdGVDbGFzcyhBdGxhcywgW3tcbiAgICBrZXk6IFwibG9ja1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBsb2NrKCkge1xuICAgICAgdGhpcy5sb2NrZWQgPSB0cnVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRLZXlzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEtleXMoKSB7XG4gICAgICByZXR1cm4gbmV3IFNldCh0aGlzLmtleVRvTG9jYXRpb24ua2V5cygpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0U2NhbGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0U2NhbGUoX3JlZikge1xuICAgICAgdmFyIHcgPSBfcmVmLncsXG4gICAgICAgIGggPSBfcmVmLmg7XG4gICAgICB2YXIgdGV4SGVpZ2h0ID0gdGhpcy50ZXhIZWlnaHQsXG4gICAgICAgIG1heFRleFdpZHRoID0gdGhpcy50ZXhTaXplO1xuICAgICAgLy8gdHJ5IHRvIGZpdCB0byB0aGUgaGVpZ2h0IG9mIGEgcm93XG4gICAgICB2YXIgc2NhbGUgPSB0ZXhIZWlnaHQgLyBoOyAvLyBUT0RPIHdoYXQgYWJvdXQgcGl4ZWxSYXRpbz9cbiAgICAgIHZhciB0ZXhXID0gdyAqIHNjYWxlO1xuICAgICAgdmFyIHRleEggPSBoICogc2NhbGU7XG4gICAgICAvLyBpZiB0aGUgc2NhbGVkIHdpZHRoIGlzIHRvbyB3aWRlIHRoZW4gc2NhbGUgdG8gZml0IG1heCB3aWR0aCBpbnN0ZWFkXG4gICAgICBpZiAodGV4VyA+IG1heFRleFdpZHRoKSB7XG4gICAgICAgIHNjYWxlID0gbWF4VGV4V2lkdGggLyB3O1xuICAgICAgICB0ZXhXID0gdyAqIHNjYWxlO1xuICAgICAgICB0ZXhIID0gaCAqIHNjYWxlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2NhbGU6IHNjYWxlLFxuICAgICAgICB0ZXhXOiB0ZXhXLFxuICAgICAgICB0ZXhIOiB0ZXhIXG4gICAgICB9O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJkcmF3XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRyYXcoa2V5LCBiYiwgZG9EcmF3aW5nKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgaWYgKHRoaXMubG9ja2VkKSB0aHJvdyBuZXcgRXJyb3IoJ2NhblxcJ3QgZHJhdywgYXRsYXMgaXMgbG9ja2VkJyk7XG4gICAgICB2YXIgdGV4U2l6ZSA9IHRoaXMudGV4U2l6ZSxcbiAgICAgICAgdGV4Um93cyA9IHRoaXMudGV4Um93cyxcbiAgICAgICAgdGV4SGVpZ2h0ID0gdGhpcy50ZXhIZWlnaHQ7XG4gICAgICB2YXIgX3RoaXMkZ2V0U2NhbGUgPSB0aGlzLmdldFNjYWxlKGJiKSxcbiAgICAgICAgc2NhbGUgPSBfdGhpcyRnZXRTY2FsZS5zY2FsZSxcbiAgICAgICAgdGV4VyA9IF90aGlzJGdldFNjYWxlLnRleFcsXG4gICAgICAgIHRleEggPSBfdGhpcyRnZXRTY2FsZS50ZXhIO1xuICAgICAgdmFyIGRyYXdBdCA9IGZ1bmN0aW9uIGRyYXdBdChsb2NhdGlvbiwgY2FudmFzKSB7XG4gICAgICAgIGlmIChkb0RyYXdpbmcgJiYgY2FudmFzKSB7XG4gICAgICAgICAgdmFyIGNvbnRleHQgPSBjYW52YXMuY29udGV4dDtcbiAgICAgICAgICB2YXIgeCA9IGxvY2F0aW9uLngsXG4gICAgICAgICAgICByb3cgPSBsb2NhdGlvbi5yb3c7XG4gICAgICAgICAgdmFyIHhPZmZzZXQgPSB4O1xuICAgICAgICAgIHZhciB5T2Zmc2V0ID0gdGV4SGVpZ2h0ICogcm93O1xuICAgICAgICAgIGNvbnRleHQuc2F2ZSgpO1xuICAgICAgICAgIGNvbnRleHQudHJhbnNsYXRlKHhPZmZzZXQsIHlPZmZzZXQpO1xuICAgICAgICAgIGNvbnRleHQuc2NhbGUoc2NhbGUsIHNjYWxlKTtcbiAgICAgICAgICBkb0RyYXdpbmcoY29udGV4dCwgYmIpO1xuICAgICAgICAgIGNvbnRleHQucmVzdG9yZSgpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgdmFyIGxvY2F0aW9ucyA9IFtudWxsLCBudWxsXTtcbiAgICAgIHZhciBkcmF3Tm9ybWFsID0gZnVuY3Rpb24gZHJhd05vcm1hbCgpIHtcbiAgICAgICAgLy8gZG9uJ3QgbmVlZCB0byB3cmFwLCBkcmF3IGRpcmVjdGx5IG9uIHRoZSBjYW52YXNcbiAgICAgICAgZHJhd0F0KF90aGlzLmZyZWVQb2ludGVyLCBfdGhpcy5jYW52YXMpO1xuICAgICAgICBsb2NhdGlvbnNbMF0gPSB7XG4gICAgICAgICAgeDogX3RoaXMuZnJlZVBvaW50ZXIueCxcbiAgICAgICAgICB5OiBfdGhpcy5mcmVlUG9pbnRlci5yb3cgKiB0ZXhIZWlnaHQsXG4gICAgICAgICAgdzogdGV4VyxcbiAgICAgICAgICBoOiB0ZXhIXG4gICAgICAgIH07XG4gICAgICAgIGxvY2F0aW9uc1sxXSA9IHtcbiAgICAgICAgICAvLyBjcmVhdGUgYSBzZWNvbmQgbG9jYXRpb24gd2l0aCBhIHdpZHRoIG9mIDAsIGZvciBjb252ZW5pZW5jZVxuICAgICAgICAgIHg6IF90aGlzLmZyZWVQb2ludGVyLnggKyB0ZXhXLFxuICAgICAgICAgIHk6IF90aGlzLmZyZWVQb2ludGVyLnJvdyAqIHRleEhlaWdodCxcbiAgICAgICAgICB3OiAwLFxuICAgICAgICAgIGg6IHRleEhcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBtb3ZlIHRoZSBwb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhlIHRleHR1cmVcbiAgICAgICAgX3RoaXMuZnJlZVBvaW50ZXIueCArPSB0ZXhXO1xuICAgICAgICBpZiAoX3RoaXMuZnJlZVBvaW50ZXIueCA9PSB0ZXhTaXplKSB7XG4gICAgICAgICAgX3RoaXMuZnJlZVBvaW50ZXIueCA9IDA7XG4gICAgICAgICAgX3RoaXMuZnJlZVBvaW50ZXIucm93Kys7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB2YXIgZHJhd1dyYXBwZWQgPSBmdW5jdGlvbiBkcmF3V3JhcHBlZCgpIHtcbiAgICAgICAgdmFyIHNjcmF0Y2ggPSBfdGhpcy5zY3JhdGNoLFxuICAgICAgICAgIGNhbnZhcyA9IF90aGlzLmNhbnZhcztcblxuICAgICAgICAvLyBEcmF3IHRvIHRoZSBzY3JhdGNoIGNhbnZhc1xuICAgICAgICBzY3JhdGNoLmNsZWFyKCk7XG4gICAgICAgIGRyYXdBdCh7XG4gICAgICAgICAgeDogMCxcbiAgICAgICAgICByb3c6IDBcbiAgICAgICAgfSwgc2NyYXRjaCk7XG4gICAgICAgIHZhciBmaXJzdFRleFcgPSB0ZXhTaXplIC0gX3RoaXMuZnJlZVBvaW50ZXIueDtcbiAgICAgICAgdmFyIHNlY29uZFRleFcgPSB0ZXhXIC0gZmlyc3RUZXhXO1xuICAgICAgICB2YXIgaCA9IHRleEhlaWdodDtcbiAgICAgICAge1xuICAgICAgICAgIC8vIGNvcHkgZmlyc3QgcGFydCBvZiBzY3JhdGNoIHRvIHRoZSBmaXJzdCB0ZXh0dXJlXG4gICAgICAgICAgdmFyIGR4ID0gX3RoaXMuZnJlZVBvaW50ZXIueDtcbiAgICAgICAgICB2YXIgZHkgPSBfdGhpcy5mcmVlUG9pbnRlci5yb3cgKiB0ZXhIZWlnaHQ7XG4gICAgICAgICAgdmFyIHcgPSBmaXJzdFRleFc7XG4gICAgICAgICAgY2FudmFzLmNvbnRleHQuZHJhd0ltYWdlKHNjcmF0Y2gsIDAsIDAsIHcsIGgsIGR4LCBkeSwgdywgaCk7XG4gICAgICAgICAgbG9jYXRpb25zWzBdID0ge1xuICAgICAgICAgICAgeDogZHgsXG4gICAgICAgICAgICB5OiBkeSxcbiAgICAgICAgICAgIHc6IHcsXG4gICAgICAgICAgICBoOiB0ZXhIXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB7XG4gICAgICAgICAgLy8gY29weSBzZWNvbmQgcGFydCBvZiBzY3JhdGNoIHRvIHRoZSBzZWNvbmQgdGV4dHVyZVxuICAgICAgICAgIHZhciBzeCA9IGZpcnN0VGV4VztcbiAgICAgICAgICB2YXIgX2R5ID0gKF90aGlzLmZyZWVQb2ludGVyLnJvdyArIDEpICogdGV4SGVpZ2h0O1xuICAgICAgICAgIHZhciBfdyA9IHNlY29uZFRleFc7XG4gICAgICAgICAgaWYgKGNhbnZhcykge1xuICAgICAgICAgICAgY2FudmFzLmNvbnRleHQuZHJhd0ltYWdlKHNjcmF0Y2gsIHN4LCAwLCBfdywgaCwgMCwgX2R5LCBfdywgaCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxvY2F0aW9uc1sxXSA9IHtcbiAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICB5OiBfZHksXG4gICAgICAgICAgICB3OiBfdyxcbiAgICAgICAgICAgIGg6IHRleEhcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIF90aGlzLmZyZWVQb2ludGVyLnggPSBzZWNvbmRUZXhXO1xuICAgICAgICBfdGhpcy5mcmVlUG9pbnRlci5yb3crKztcbiAgICAgIH07XG4gICAgICB2YXIgbW92ZVRvU3RhcnRPZk5leHRSb3cgPSBmdW5jdGlvbiBtb3ZlVG9TdGFydE9mTmV4dFJvdygpIHtcbiAgICAgICAgX3RoaXMuZnJlZVBvaW50ZXIueCA9IDA7XG4gICAgICAgIF90aGlzLmZyZWVQb2ludGVyLnJvdysrO1xuICAgICAgfTtcbiAgICAgIGlmICh0aGlzLmZyZWVQb2ludGVyLnggKyB0ZXhXIDw9IHRleFNpemUpIHtcbiAgICAgICAgLy8gVGhlcmUncyBlbm91Z2ggc3BhY2UgaW4gdGhlIGN1cnJlbnQgcm93XG4gICAgICAgIGRyYXdOb3JtYWwoKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5mcmVlUG9pbnRlci5yb3cgPj0gdGV4Um93cyAtIDEpIHtcbiAgICAgICAgLy8gTmVlZCB0byBtb3ZlIHRvIHRoZSBuZXh0IHJvdywgYnV0IHRoZXJlIGFyZSBubyBtb3JlIHJvd3MsIGF0bGFzIGlzIGZ1bGwuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5mcmVlUG9pbnRlci54ID09PSB0ZXhTaXplKSB7XG4gICAgICAgIC8vIGhhcHBlbiB0byBiZSByaWdodCBhdCBlbmQgb2YgY3VycmVudCByb3dcbiAgICAgICAgbW92ZVRvU3RhcnRPZk5leHRSb3coKTtcbiAgICAgICAgZHJhd05vcm1hbCgpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmVuYWJsZVdyYXBwaW5nKSB7XG4gICAgICAgIC8vIGRyYXcgcGFydCBvZiB0aGUgdGV4dHVyZSB0byB0aGUgZW5kIG9mIHRoZSBjdXJlbnQgcm93LCB0aGVuIHdyYXAgdG8gdGhlIG5leHQgcm93XG4gICAgICAgIGRyYXdXcmFwcGVkKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBtb3ZlIHRvIHRoZSBzdGFydCBvZiB0aGUgbmV4dCByb3csIHRoZW4gZHJhdyBub3JtYWxseVxuICAgICAgICBtb3ZlVG9TdGFydE9mTmV4dFJvdygpO1xuICAgICAgICBkcmF3Tm9ybWFsKCk7XG4gICAgICB9XG4gICAgICB0aGlzLmtleVRvTG9jYXRpb24uc2V0KGtleSwgbG9jYXRpb25zKTtcbiAgICAgIHRoaXMubmVlZHNCdWZmZXIgPSB0cnVlO1xuICAgICAgcmV0dXJuIGxvY2F0aW9ucztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0T2Zmc2V0c1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRPZmZzZXRzKGtleSkge1xuICAgICAgcmV0dXJuIHRoaXMua2V5VG9Mb2NhdGlvbi5nZXQoa2V5KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaXNFbXB0eVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpc0VtcHR5KCkge1xuICAgICAgcmV0dXJuIHRoaXMuZnJlZVBvaW50ZXIueCA9PT0gMCAmJiB0aGlzLmZyZWVQb2ludGVyLnJvdyA9PT0gMDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY2FuRml0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNhbkZpdChiYikge1xuICAgICAgaWYgKHRoaXMubG9ja2VkKSByZXR1cm4gZmFsc2U7XG4gICAgICB2YXIgdGV4U2l6ZSA9IHRoaXMudGV4U2l6ZSxcbiAgICAgICAgdGV4Um93cyA9IHRoaXMudGV4Um93cztcbiAgICAgIHZhciBfdGhpcyRnZXRTY2FsZTIgPSB0aGlzLmdldFNjYWxlKGJiKSxcbiAgICAgICAgdGV4VyA9IF90aGlzJGdldFNjYWxlMi50ZXhXO1xuICAgICAgaWYgKHRoaXMuZnJlZVBvaW50ZXIueCArIHRleFcgPiB0ZXhTaXplKSB7XG4gICAgICAgIC8vIG5lZWQgdG8gd3JhcFxuICAgICAgICByZXR1cm4gdGhpcy5mcmVlUG9pbnRlci5yb3cgPCB0ZXhSb3dzIC0gMTsgLy8gcmV0dXJuIHRydWUgaWYgdGhlcmUncyBhIHJvdyB0byB3cmFwIHRvXG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBjYWxsZWQgb24gZXZlcnkgZnJhbWVcbiAgfSwge1xuICAgIGtleTogXCJidWZmZXJJZk5lZWRlZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWZmZXJJZk5lZWRlZChnbCkge1xuICAgICAgaWYgKCF0aGlzLnRleHR1cmUpIHtcbiAgICAgICAgdGhpcy50ZXh0dXJlID0gY3JlYXRlVGV4dHVyZShnbCwgdGhpcy5kZWJ1Z0lEKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm5lZWRzQnVmZmVyKSB7XG4gICAgICAgIHRoaXMudGV4dHVyZS5idWZmZXIodGhpcy5jYW52YXMpO1xuICAgICAgICB0aGlzLm5lZWRzQnVmZmVyID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLmxvY2tlZCkge1xuICAgICAgICAgIHRoaXMuY2FudmFzID0gbnVsbDtcbiAgICAgICAgICB0aGlzLnNjcmF0Y2ggPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImRpc3Bvc2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGlzcG9zZSgpIHtcbiAgICAgIGlmICh0aGlzLnRleHR1cmUpIHtcbiAgICAgICAgdGhpcy50ZXh0dXJlLmRlbGV0ZVRleHR1cmUoKTtcbiAgICAgICAgdGhpcy50ZXh0dXJlID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2FudmFzID0gbnVsbDtcbiAgICAgIHRoaXMuc2NyYXRjaCA9IG51bGw7XG4gICAgICB0aGlzLmxvY2tlZCA9IHRydWU7XG4gICAgfVxuICB9XSk7XG59KCk7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHRleHR1cmUgYXRsYXNlcywgYWxsIG9mIHRoZSBzYW1lIFwicmVuZGVyIHR5cGVcIi4gXG4gKiAoJ25vZGUtYm9keScgaXMgYW4gZXhhbXBsZSBvZiBhIHJlbmRlciB0eXBlLilcbiAqIEFuIEF0bGFzQ29sbGVjdGlvbiBjYW4gYWxzbyBiZSBub3RpZmllZCB3aGVuIGEgdGV4dHVyZSBpcyBubyBsb25nZXIgbmVlZGVkLCBcbiAqIGFuZCBpdCBjYW4gZ2FyYmFnZSBjb2xsZWN0IHRoZSB1bnVzZWQgdGV4dHVyZXMuXG4gKi9cbnZhciBBdGxhc0NvbGxlY3Rpb24gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBBdGxhc0NvbGxlY3Rpb24ociwgdGV4U2l6ZSwgdGV4Um93cywgY3JlYXRlVGV4dHVyZUNhbnZhcykge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBBdGxhc0NvbGxlY3Rpb24pO1xuICAgIHRoaXMuciA9IHI7XG4gICAgdGhpcy50ZXhTaXplID0gdGV4U2l6ZTtcbiAgICB0aGlzLnRleFJvd3MgPSB0ZXhSb3dzO1xuICAgIHRoaXMuY3JlYXRlVGV4dHVyZUNhbnZhcyA9IGNyZWF0ZVRleHR1cmVDYW52YXM7XG4gICAgdGhpcy5hdGxhc2VzID0gW107XG4gICAgdGhpcy5zdHlsZUtleVRvQXRsYXMgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5tYXJrZWRLZXlzID0gbmV3IFNldCgpOyAvLyBtYXJrZWQgZm9yIGdhcmJhZ2UgY29sbGVjdGlvblxuICB9XG4gIHJldHVybiBfY3JlYXRlQ2xhc3MoQXRsYXNDb2xsZWN0aW9uLCBbe1xuICAgIGtleTogXCJnZXRLZXlzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEtleXMoKSB7XG4gICAgICByZXR1cm4gbmV3IFNldCh0aGlzLnN0eWxlS2V5VG9BdGxhcy5rZXlzKCkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfY3JlYXRlQXRsYXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2NyZWF0ZUF0bGFzKCkge1xuICAgICAgdmFyIHIgPSB0aGlzLnIsXG4gICAgICAgIHRleFNpemUgPSB0aGlzLnRleFNpemUsXG4gICAgICAgIHRleFJvd3MgPSB0aGlzLnRleFJvd3MsXG4gICAgICAgIGNyZWF0ZVRleHR1cmVDYW52YXMgPSB0aGlzLmNyZWF0ZVRleHR1cmVDYW52YXM7XG4gICAgICByZXR1cm4gbmV3IEF0bGFzKHIsIHRleFNpemUsIHRleFJvd3MsIGNyZWF0ZVRleHR1cmVDYW52YXMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfZ2V0U2NyYXRjaENhbnZhc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfZ2V0U2NyYXRjaENhbnZhcygpIHtcbiAgICAgIGlmICghdGhpcy5zY3JhdGNoKSB7XG4gICAgICAgIHZhciByID0gdGhpcy5yLFxuICAgICAgICAgIHRleFNpemUgPSB0aGlzLnRleFNpemUsXG4gICAgICAgICAgdGV4Um93cyA9IHRoaXMudGV4Um93cyxcbiAgICAgICAgICBjcmVhdGVUZXh0dXJlQ2FudmFzID0gdGhpcy5jcmVhdGVUZXh0dXJlQ2FudmFzO1xuICAgICAgICB2YXIgdGV4SGVpZ2h0ID0gTWF0aC5mbG9vcih0ZXhTaXplIC8gdGV4Um93cyk7XG4gICAgICAgIHRoaXMuc2NyYXRjaCA9IGNyZWF0ZVRleHR1cmVDYW52YXMociwgdGV4U2l6ZSwgdGV4SGVpZ2h0LCAnc2NyYXRjaCcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuc2NyYXRjaDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZHJhd1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkcmF3KGtleSwgYmIsIGRvRHJhd2luZykge1xuICAgICAgdmFyIGF0bGFzID0gdGhpcy5zdHlsZUtleVRvQXRsYXMuZ2V0KGtleSk7XG4gICAgICBpZiAoIWF0bGFzKSB7XG4gICAgICAgIC8vIGNoZWNrIGZvciBzcGFjZSBhdCB0aGUgZW5kIG9mIHRoZSBsYXN0IGF0bGFzXG4gICAgICAgIGF0bGFzID0gdGhpcy5hdGxhc2VzW3RoaXMuYXRsYXNlcy5sZW5ndGggLSAxXTtcbiAgICAgICAgaWYgKCFhdGxhcyB8fCAhYXRsYXMuY2FuRml0KGJiKSkge1xuICAgICAgICAgIGlmIChhdGxhcykgYXRsYXMubG9jaygpO1xuICAgICAgICAgIC8vIGNyZWF0ZSBhIG5ldyBhdGxhc1xuICAgICAgICAgIGF0bGFzID0gdGhpcy5fY3JlYXRlQXRsYXMoKTtcbiAgICAgICAgICB0aGlzLmF0bGFzZXMucHVzaChhdGxhcyk7XG4gICAgICAgIH1cbiAgICAgICAgYXRsYXMuZHJhdyhrZXksIGJiLCBkb0RyYXdpbmcpO1xuICAgICAgICB0aGlzLnN0eWxlS2V5VG9BdGxhcy5zZXQoa2V5LCBhdGxhcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXRsYXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldEF0bGFzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEF0bGFzKGtleSkge1xuICAgICAgcmV0dXJuIHRoaXMuc3R5bGVLZXlUb0F0bGFzLmdldChrZXkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJoYXNBdGxhc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYXNBdGxhcyhrZXkpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0eWxlS2V5VG9BdGxhcy5oYXMoa2V5KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibWFya0tleUZvckdDXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1hcmtLZXlGb3JHQyhrZXkpIHtcbiAgICAgIHRoaXMubWFya2VkS2V5cy5hZGQoa2V5KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2NcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2MoKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcbiAgICAgIHZhciBtYXJrZWRLZXlzID0gdGhpcy5tYXJrZWRLZXlzO1xuICAgICAgaWYgKG1hcmtlZEtleXMuc2l6ZSA9PT0gMCkge1xuICAgICAgICBjb25zb2xlLmxvZygnbm90aGluZyB0byBnYXJiYWdlIGNvbGxlY3QnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIG5ld0F0bGFzZXMgPSBbXTtcbiAgICAgIHZhciBuZXdTdHlsZUtleVRvQXRsYXMgPSBuZXcgTWFwKCk7XG4gICAgICB2YXIgbmV3QXRsYXMgPSBudWxsO1xuICAgICAgdmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHRoaXMuYXRsYXNlcyksXG4gICAgICAgIF9zdGVwO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoKSB7XG4gICAgICAgICAgdmFyIGF0bGFzID0gX3N0ZXAudmFsdWU7XG4gICAgICAgICAgdmFyIGtleXMgPSBhdGxhcy5nZXRLZXlzKCk7XG4gICAgICAgICAgdmFyIGtleXNUb0NvbGxlY3QgPSBpbnRlcnNlY3Rpb24obWFya2VkS2V5cywga2V5cyk7XG4gICAgICAgICAgaWYgKGtleXNUb0NvbGxlY3Quc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgLy8gdGhpcyBhdGxhcyBjYW4gc3RpbGwgYmUgdXNlZFxuICAgICAgICAgICAgbmV3QXRsYXNlcy5wdXNoKGF0bGFzKTtcbiAgICAgICAgICAgIGtleXMuZm9yRWFjaChmdW5jdGlvbiAoaykge1xuICAgICAgICAgICAgICByZXR1cm4gbmV3U3R5bGVLZXlUb0F0bGFzLnNldChrLCBhdGxhcyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiAxOyAvLyBjb250aW51ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIW5ld0F0bGFzKSB7XG4gICAgICAgICAgICBuZXdBdGxhcyA9IF90aGlzMi5fY3JlYXRlQXRsYXMoKTtcbiAgICAgICAgICAgIG5ld0F0bGFzZXMucHVzaChuZXdBdGxhcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBfaXRlcmF0b3IyID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoa2V5cyksXG4gICAgICAgICAgICBfc3RlcDI7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAoX2l0ZXJhdG9yMi5zKCk7ICEoX3N0ZXAyID0gX2l0ZXJhdG9yMi5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgICAgIHZhciBrZXkgPSBfc3RlcDIudmFsdWU7XG4gICAgICAgICAgICAgIGlmICgha2V5c1RvQ29sbGVjdC5oYXMoa2V5KSkge1xuICAgICAgICAgICAgICAgIHZhciBfYXRsYXMkZ2V0T2Zmc2V0cyA9IGF0bGFzLmdldE9mZnNldHMoa2V5KSxcbiAgICAgICAgICAgICAgICAgIF9hdGxhcyRnZXRPZmZzZXRzMiA9IF9zbGljZWRUb0FycmF5KF9hdGxhcyRnZXRPZmZzZXRzLCAyKSxcbiAgICAgICAgICAgICAgICAgIHMxID0gX2F0bGFzJGdldE9mZnNldHMyWzBdLFxuICAgICAgICAgICAgICAgICAgczIgPSBfYXRsYXMkZ2V0T2Zmc2V0czJbMV07XG4gICAgICAgICAgICAgICAgaWYgKCFuZXdBdGxhcy5jYW5GaXQoe1xuICAgICAgICAgICAgICAgICAgdzogczEudyArIHMyLncsXG4gICAgICAgICAgICAgICAgICBoOiBzMS5oXG4gICAgICAgICAgICAgICAgfSkpIHtcbiAgICAgICAgICAgICAgICAgIG5ld0F0bGFzLmxvY2soKTtcbiAgICAgICAgICAgICAgICAgIG5ld0F0bGFzID0gX3RoaXMyLl9jcmVhdGVBdGxhcygpO1xuICAgICAgICAgICAgICAgICAgbmV3QXRsYXNlcy5wdXNoKG5ld0F0bGFzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGF0bGFzLmNhbnZhcykge1xuICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHRleHR1cmUgY2FuJ3QgYmUgY29waWVkIHRoZW4gaXQgd2lsbCBoYXZlIHRvIGJlIHJlZHJhd24gb24gdGhlIG5leHQgZnJhbWVcbiAgICAgICAgICAgICAgICAgIF90aGlzMi5fY29weVRleHR1cmVUb05ld0F0bGFzKGtleSwgYXRsYXMsIG5ld0F0bGFzKTtcbiAgICAgICAgICAgICAgICAgIG5ld1N0eWxlS2V5VG9BdGxhcy5zZXQoa2V5LCBuZXdBdGxhcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBfaXRlcmF0b3IyLmUoZXJyKTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgX2l0ZXJhdG9yMi5mKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGF0bGFzLmRpc3Bvc2UoKTtcbiAgICAgICAgfTtcbiAgICAgICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHtcbiAgICAgICAgICBpZiAoX2xvb3AoKSkgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBfaXRlcmF0b3IuZShlcnIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgX2l0ZXJhdG9yLmYoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYXRsYXNlcyA9IG5ld0F0bGFzZXM7XG4gICAgICB0aGlzLnN0eWxlS2V5VG9BdGxhcyA9IG5ld1N0eWxlS2V5VG9BdGxhcztcbiAgICAgIHRoaXMubWFya2VkS2V5cyA9IG5ldyBTZXQoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX2NvcHlUZXh0dXJlVG9OZXdBdGxhc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfY29weVRleHR1cmVUb05ld0F0bGFzKGtleSwgb2xkQXRsYXMsIG5ld0F0bGFzKSB7XG4gICAgICB2YXIgX29sZEF0bGFzJGdldE9mZnNldHMgPSBvbGRBdGxhcy5nZXRPZmZzZXRzKGtleSksXG4gICAgICAgIF9vbGRBdGxhcyRnZXRPZmZzZXRzMiA9IF9zbGljZWRUb0FycmF5KF9vbGRBdGxhcyRnZXRPZmZzZXRzLCAyKSxcbiAgICAgICAgczEgPSBfb2xkQXRsYXMkZ2V0T2Zmc2V0czJbMF0sXG4gICAgICAgIHMyID0gX29sZEF0bGFzJGdldE9mZnNldHMyWzFdO1xuICAgICAgaWYgKHMyLncgPT09IDApIHtcbiAgICAgICAgLy8gdGhlIHRleHR1cmUgZG9lcyBub3Qgd3JhcCwgZHJhdyBkaXJlY3RseSB0byBuZXcgYXRsYXNcbiAgICAgICAgbmV3QXRsYXMuZHJhdyhrZXksIHMxLCBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICAgIGNvbnRleHQuZHJhd0ltYWdlKG9sZEF0bGFzLmNhbnZhcywgczEueCwgczEueSwgczEudywgczEuaCwgMCwgMCwgczEudywgczEuaCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gdGhlIHRleHR1cmUgd3JhcHMsIGZpcnN0IGRyYXcgYm90aCBwYXJ0cyB0byBhIHNjcmF0Y2ggY2FudmFzXG4gICAgICAgIHZhciBzY3JhdGNoID0gdGhpcy5fZ2V0U2NyYXRjaENhbnZhcygpO1xuICAgICAgICBzY3JhdGNoLmNsZWFyKCk7XG4gICAgICAgIHNjcmF0Y2guY29udGV4dC5kcmF3SW1hZ2Uob2xkQXRsYXMuY2FudmFzLCBzMS54LCBzMS55LCBzMS53LCBzMS5oLCAwLCAwLCBzMS53LCBzMS5oKTtcbiAgICAgICAgc2NyYXRjaC5jb250ZXh0LmRyYXdJbWFnZShvbGRBdGxhcy5jYW52YXMsIHMyLngsIHMyLnksIHMyLncsIHMyLmgsIHMxLncsIDAsIHMyLncsIHMyLmgpO1xuXG4gICAgICAgIC8vIG5vdyBkcmF3IHRoZSBzY3JhdGNoIHRvIHRoZSBuZXcgYXRsYXNcbiAgICAgICAgdmFyIHcgPSBzMS53ICsgczIudztcbiAgICAgICAgdmFyIGggPSBzMS5oO1xuICAgICAgICBuZXdBdGxhcy5kcmF3KGtleSwge1xuICAgICAgICAgIHc6IHcsXG4gICAgICAgICAgaDogaFxuICAgICAgICB9LCBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICAgIGNvbnRleHQuZHJhd0ltYWdlKHNjcmF0Y2gsIDAsIDAsIHcsIGgsIDAsIDAsIHcsIGggLy8gdGhlIGRlc3RpbmF0aW9uIGNvbnRleHQgaGFzIGFscmVhZHkgYmVlbiB0cmFuc2xhdGVkIHRvIHRoZSBjb3JyZWN0IHBvc2l0aW9uXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldENvdW50c1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRDb3VudHMoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBrZXlDb3VudDogdGhpcy5zdHlsZUtleVRvQXRsYXMuc2l6ZSxcbiAgICAgICAgYXRsYXNDb3VudDogbmV3IFNldCh0aGlzLnN0eWxlS2V5VG9BdGxhcy52YWx1ZXMoKSkuc2l6ZVxuICAgICAgfTtcbiAgICB9XG4gIH1dKTtcbn0oKTtcbmZ1bmN0aW9uIGludGVyc2VjdGlvbihzZXQxLCBzZXQyKSB7XG4gIC8vIFRPRE8gd2h5IG5vIFNldC5pbnRlcnNlY3Rpb24gaW4gbm9kZSAxNj8/P1xuICBpZiAoc2V0MS5pbnRlcnNlY3Rpb24pIHJldHVybiBzZXQxLmludGVyc2VjdGlvbihzZXQyKTtlbHNlIHJldHVybiBuZXcgU2V0KF90b0NvbnN1bWFibGVBcnJheShzZXQxKS5maWx0ZXIoZnVuY3Rpb24gKHgpIHtcbiAgICByZXR1cm4gc2V0Mi5oYXMoeCk7XG4gIH0pKTtcbn1cblxuLyoqXG4gKiBVc2VkIHRvIG1hbmFnZSBiYXRjaGVzIG9mIEF0bGFzZXMgZm9yIGRyYXdpbmcgbm9kZXMgYW5kIGxhYmVscy5cbiAqIFN1cHBvcnRzIGRpZmZlcmVudCB0eXBlcyBvZiBBdGxhc0NvbGxlY3Rpb25zIGZvciBkaWZmZXJlbnQgcmVuZGVyIHR5cGVzLFxuICogZm9yIGV4YW1wbGUgJ25vZGUtYm9keScgYW5kICdub2RlLWxhYmVsJyB3b3VsZCBiZSBkaWZmZXJlbnQgcmVuZGVyIHR5cGVzLlxuICogUmVuZGVyIHR5cGVzIGFyZSBrZXB0IHNlcGFyYXRlIGJlY2F1c2UgdGhleSB3aWxsIGxpa2VseSBuZWVkIHRvIGJlIGdhcmJhZ2UgY29sbGVjdGVkXG4gKiBzZXBhcmF0ZWx5IGFuZCBpdHMgbm90IGVudGllcmx5IGd1YXJhbnRlZWQgdGhhdCB0aGVpciBzdHlsZSBrZXlzIHdvbid0IGNvbGxpZGUuXG4gKi9cbnZhciBBdGxhc01hbmFnZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBBdGxhc01hbmFnZXIociwgZ2xvYmFsT3B0aW9ucykge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBBdGxhc01hbmFnZXIpO1xuICAgIHRoaXMuciA9IHI7XG4gICAgdGhpcy5nbG9iYWxPcHRpb25zID0gZ2xvYmFsT3B0aW9ucztcbiAgICB0aGlzLmF0bGFzU2l6ZSA9IGdsb2JhbE9wdGlvbnMud2ViZ2xUZXhTaXplO1xuICAgIHRoaXMubWF4QXRsYXNlc1BlckJhdGNoID0gZ2xvYmFsT3B0aW9ucy53ZWJnbFRleFBlckJhdGNoO1xuICAgIHRoaXMucmVuZGVyVHlwZXMgPSBuZXcgTWFwKCk7IC8vIHJlbmRlclR5cGU6c3RyaW5nIC0+IHJlbmRlclR5cGVPcHRpb25zXG4gICAgdGhpcy5jb2xsZWN0aW9ucyA9IG5ldyBNYXAoKTsgLy8gY29sbGVjdGlvbk5hbWU6c3RyaW5nIC0+IEF0bGFzQ29sbGVjdGlvblxuXG4gICAgdGhpcy50eXBlQW5kSWRUb0tleSA9IG5ldyBNYXAoKTsgLy8gW3JlbmRlclR5cGUsaWRdID0+IEFycmF5PHN0eWxlIGtleT5cbiAgfVxuICByZXR1cm4gX2NyZWF0ZUNsYXNzKEF0bGFzTWFuYWdlciwgW3tcbiAgICBrZXk6IFwiZ2V0QXRsYXNTaXplXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEF0bGFzU2l6ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmF0bGFzU2l6ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYWRkQXRsYXNDb2xsZWN0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZEF0bGFzQ29sbGVjdGlvbihjb2xsZWN0aW9uTmFtZSwgYXRsYXNDb2xsZWN0aW9uT3B0aW9ucykge1xuICAgICAgdmFyIF90aGlzJGdsb2JhbE9wdGlvbnMgPSB0aGlzLmdsb2JhbE9wdGlvbnMsXG4gICAgICAgIHdlYmdsVGV4U2l6ZSA9IF90aGlzJGdsb2JhbE9wdGlvbnMud2ViZ2xUZXhTaXplLFxuICAgICAgICBjcmVhdGVUZXh0dXJlQ2FudmFzID0gX3RoaXMkZ2xvYmFsT3B0aW9ucy5jcmVhdGVUZXh0dXJlQ2FudmFzO1xuICAgICAgdmFyIHRleFJvd3MgPSBhdGxhc0NvbGxlY3Rpb25PcHRpb25zLnRleFJvd3M7XG4gICAgICB2YXIgY2FjaGVkQ3JlYXRlVGV4dHVyZUNhbnZhcyA9IHRoaXMuX2NhY2hlU2NyYXRjaENhbnZhcyhjcmVhdGVUZXh0dXJlQ2FudmFzKTtcbiAgICAgIHZhciBhdGxhc0NvbGxlY3Rpb24gPSBuZXcgQXRsYXNDb2xsZWN0aW9uKHRoaXMuciwgd2ViZ2xUZXhTaXplLCB0ZXhSb3dzLCBjYWNoZWRDcmVhdGVUZXh0dXJlQ2FudmFzKTtcbiAgICAgIHRoaXMuY29sbGVjdGlvbnMuc2V0KGNvbGxlY3Rpb25OYW1lLCBhdGxhc0NvbGxlY3Rpb24pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJhZGRSZW5kZXJUeXBlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZFJlbmRlclR5cGUodHlwZSwgcmVuZGVyVHlwZU9wdGlvbnMpIHtcbiAgICAgIHZhciBjb2xsZWN0aW9uID0gcmVuZGVyVHlwZU9wdGlvbnMuY29sbGVjdGlvbjtcbiAgICAgIGlmICghdGhpcy5jb2xsZWN0aW9ucy5oYXMoY29sbGVjdGlvbikpIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgYXRsYXMgY29sbGVjdGlvbiBuYW1lICdcIi5jb25jYXQoY29sbGVjdGlvbiwgXCInXCIpKTtcbiAgICAgIHZhciBhdGxhc0NvbGxlY3Rpb24gPSB0aGlzLmNvbGxlY3Rpb25zLmdldChjb2xsZWN0aW9uKTtcbiAgICAgIHZhciBvcHRzID0gZXh0ZW5kKHtcbiAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgYXRsYXNDb2xsZWN0aW9uOiBhdGxhc0NvbGxlY3Rpb25cbiAgICAgIH0sIHJlbmRlclR5cGVPcHRpb25zKTtcbiAgICAgIHRoaXMucmVuZGVyVHlwZXMuc2V0KHR5cGUsIG9wdHMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRSZW5kZXJUeXBlT3B0c1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRSZW5kZXJUeXBlT3B0cyh0eXBlKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZW5kZXJUeXBlcy5nZXQodHlwZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldEF0bGFzQ29sbGVjdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRBdGxhc0NvbGxlY3Rpb24obmFtZSkge1xuICAgICAgcmV0dXJuIHRoaXMuY29sbGVjdGlvbnMuZ2V0KG5hbWUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfY2FjaGVTY3JhdGNoQ2FudmFzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9jYWNoZVNjcmF0Y2hDYW52YXMoY3JlYXRlVGV4dHVyZUNhbnZhcykge1xuICAgICAgLy8gYWxsIHNjcmF0Y2ggY2FudmFzZXMgZm9yIHRoZSBzYW1lIHJlbmRlciB0eXBlIHdpbGwgaGF2ZSB0aGUgc2FtZSB3aWR0aCBhbmQgaGVpZ2h0IChpZSB3ZWJnbFRleFJvd3Mgb3B0aW9uKVxuICAgICAgLy8gYnV0IHdlJ2xsIGtlZXAgdHJhY2sgb2YgdGhlIHdpZHRoIGFuZCBoZWlnaHQganVzdCB0byBiZSBzYWZlXG4gICAgICB2YXIgcHJldlcgPSAtMTtcbiAgICAgIHZhciBwcmV2SCA9IC0xO1xuICAgICAgdmFyIHNjcmF0Y2hDYW52YXMgPSBudWxsO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChyLCB3LCBoLCBzY3JhdGNoKSB7XG4gICAgICAgIGlmIChzY3JhdGNoKSB7XG4gICAgICAgICAgaWYgKCFzY3JhdGNoQ2FudmFzIHx8IHcgIT0gcHJldlcgfHwgaCAhPSBwcmV2SCkge1xuICAgICAgICAgICAgcHJldlcgPSB3O1xuICAgICAgICAgICAgcHJldkggPSBoO1xuICAgICAgICAgICAgc2NyYXRjaENhbnZhcyA9IGNyZWF0ZVRleHR1cmVDYW52YXMociwgdywgaCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBzY3JhdGNoQ2FudmFzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVUZXh0dXJlQ2FudmFzKHIsIHcsIGgpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfa2V5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9rZXkocmVuZGVyVHlwZSwgaWQpIHtcbiAgICAgIHJldHVybiBcIlwiLmNvbmNhdChyZW5kZXJUeXBlLCBcIi1cIikuY29uY2F0KGlkKTsgLy8gVE9ETyBub3QgdmVyeSBlZmZpY2llbnRcbiAgICB9XG5cbiAgICAvKiogTWFya3MgdGV4dHVlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnQgZm9yIGdhcmJhZ2UgY29sbGVjdGlvbi4gKi9cbiAgfSwge1xuICAgIGtleTogXCJpbnZhbGlkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGludmFsaWRhdGUoZWxlcykge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG4gICAgICB2YXIgX3JlZjIgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9LFxuICAgICAgICBfcmVmMiRmb3JjZVJlZHJhdyA9IF9yZWYyLmZvcmNlUmVkcmF3LFxuICAgICAgICBmb3JjZVJlZHJhdyA9IF9yZWYyJGZvcmNlUmVkcmF3ID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWYyJGZvcmNlUmVkcmF3LFxuICAgICAgICBfcmVmMiRmaWx0ZXJFbGUgPSBfcmVmMi5maWx0ZXJFbGUsXG4gICAgICAgIGZpbHRlckVsZSA9IF9yZWYyJGZpbHRlckVsZSA9PT0gdm9pZCAwID8gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IDogX3JlZjIkZmlsdGVyRWxlLFxuICAgICAgICBfcmVmMiRmaWx0ZXJUeXBlID0gX3JlZjIuZmlsdGVyVHlwZSxcbiAgICAgICAgZmlsdGVyVHlwZSA9IF9yZWYyJGZpbHRlclR5cGUgPT09IHZvaWQgMCA/IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSA6IF9yZWYyJGZpbHRlclR5cGU7XG4gICAgICB2YXIgbmVlZEdDID0gZmFsc2U7XG4gICAgICB2YXIgcnVuR0NOb3cgPSBmYWxzZTtcbiAgICAgIHZhciBfaXRlcmF0b3IzID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoZWxlcyksXG4gICAgICAgIF9zdGVwMztcbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAoX2l0ZXJhdG9yMy5zKCk7ICEoX3N0ZXAzID0gX2l0ZXJhdG9yMy5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgdmFyIGVsZSA9IF9zdGVwMy52YWx1ZTtcbiAgICAgICAgICBpZiAoZmlsdGVyRWxlKGVsZSkpIHtcbiAgICAgICAgICAgIHZhciBfaXRlcmF0b3I0ID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIodGhpcy5yZW5kZXJUeXBlcy52YWx1ZXMoKSksXG4gICAgICAgICAgICAgIF9zdGVwNDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHZhciBfbG9vcDIgPSBmdW5jdGlvbiBfbG9vcDIoKSB7XG4gICAgICAgICAgICAgICAgdmFyIG9wdHMgPSBfc3RlcDQudmFsdWU7XG4gICAgICAgICAgICAgICAgdmFyIHJlbmRlclR5cGUgPSBvcHRzLnR5cGU7XG4gICAgICAgICAgICAgICAgaWYgKGZpbHRlclR5cGUocmVuZGVyVHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgIHZhciBhdGxhc0NvbGxlY3Rpb24gPSBfdGhpczMuY29sbGVjdGlvbnMuZ2V0KG9wdHMuY29sbGVjdGlvbik7XG4gICAgICAgICAgICAgICAgICB2YXIga2V5ID0gb3B0cy5nZXRLZXkoZWxlKTtcbiAgICAgICAgICAgICAgICAgIHZhciBrZXlBcnJheSA9IEFycmF5LmlzQXJyYXkoa2V5KSA/IGtleSA6IFtrZXldO1xuXG4gICAgICAgICAgICAgICAgICAvLyB3aGVuIGEgbm9kZSdzIGJhY2tncm91bmQgaW1hZ2UgZmluaXNoZXMgbG9hZGluZywgdGhlIHN0eWxlIGtleSBkb2Vzbid0IGNoYW5nZSBidXQgc3RpbGwgbmVlZHMgdG8gYmUgcmVkcmF3blxuICAgICAgICAgICAgICAgICAgaWYgKGZvcmNlUmVkcmF3KSB7XG4gICAgICAgICAgICAgICAgICAgIGtleUFycmF5LmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhdGxhc0NvbGxlY3Rpb24ubWFya0tleUZvckdDKGtleSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBydW5HQ05vdyA9IHRydWU7IC8vIHJ1biBHQyB0byByZW1vdmUgdGhlIG9sZCB0ZXh0dXJlIHJpZ2h0IG5vdywgdGhhdCB3YXkgd2UgZG9uJ3QgbmVlZCB0byByZW1lbWJlciBmb3IgdGhlIG5leHQgZ2MgXG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSBvcHRzLmdldElEID8gb3B0cy5nZXRJRChlbGUpIDogZWxlLmlkKCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtYXBLZXkgPSBfdGhpczMuX2tleShyZW5kZXJUeXBlLCBpZCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBvbGRLZXlBcnJheSA9IF90aGlzMy50eXBlQW5kSWRUb0tleS5nZXQobWFwS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9sZEtleUFycmF5ICE9PSB1bmRlZmluZWQgJiYgIWFycmF5RXF1YWwoa2V5QXJyYXksIG9sZEtleUFycmF5KSkge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNlcnZhdGl2ZSBhcHByb2FjaCwgaWYgYW55IG9mIHRoZSBrZXlzIGRvbid0IG1hdGNoIHRoZW4gdGhyb3cgdGhlbSBhbGwgYXdheVxuICAgICAgICAgICAgICAgICAgICAgIG5lZWRHQyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgX3RoaXMzLnR5cGVBbmRJZFRvS2V5W1wiZGVsZXRlXCJdKG1hcEtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgb2xkS2V5QXJyYXkuZm9yRWFjaChmdW5jdGlvbiAob2xkS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXRsYXNDb2xsZWN0aW9uLm1hcmtLZXlGb3JHQyhvbGRLZXkpO1xuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBmb3IgKF9pdGVyYXRvcjQucygpOyAhKF9zdGVwNCA9IF9pdGVyYXRvcjQubigpKS5kb25lOykge1xuICAgICAgICAgICAgICAgIF9sb29wMigpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgX2l0ZXJhdG9yNC5lKGVycik7XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICBfaXRlcmF0b3I0LmYoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBfaXRlcmF0b3IzLmUoZXJyKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIF9pdGVyYXRvcjMuZigpO1xuICAgICAgfVxuICAgICAgaWYgKHJ1bkdDTm93KSB7XG4gICAgICAgIHRoaXMuZ2MoKTtcbiAgICAgICAgbmVlZEdDID0gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmVlZEdDO1xuICAgIH1cblxuICAgIC8qKiBHYXJiYWdlIGNvbGxlY3QgKi9cbiAgfSwge1xuICAgIGtleTogXCJnY1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnYygpIHtcbiAgICAgIHZhciBfaXRlcmF0b3I1ID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIodGhpcy5jb2xsZWN0aW9ucy52YWx1ZXMoKSksXG4gICAgICAgIF9zdGVwNTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAoX2l0ZXJhdG9yNS5zKCk7ICEoX3N0ZXA1ID0gX2l0ZXJhdG9yNS5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgdmFyIGNvbGxlY3Rpb24gPSBfc3RlcDUudmFsdWU7XG4gICAgICAgICAgY29sbGVjdGlvbi5nYygpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgX2l0ZXJhdG9yNS5lKGVycik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBfaXRlcmF0b3I1LmYoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0T3JDcmVhdGVBdGxhc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRPckNyZWF0ZUF0bGFzKGVsZSwgdHlwZSwgYmIsIHN0eWxlS2V5KSB7XG4gICAgICAvLyBzdHlsZUtleSBpcyBub3QgYW4gYXJyYXkgaGVyZVxuICAgICAgdmFyIG9wdHMgPSB0aGlzLnJlbmRlclR5cGVzLmdldCh0eXBlKTtcbiAgICAgIHZhciBhdGxhc0NvbGxlY3Rpb24gPSB0aGlzLmNvbGxlY3Rpb25zLmdldChvcHRzLmNvbGxlY3Rpb24pO1xuXG4gICAgICAvLyBkcmF3cyB0aGUgdGV4dHVyZSBvbmx5IGlmIG5lZWRlZFxuICAgICAgdmFyIGRyYXduID0gZmFsc2U7XG4gICAgICB2YXIgYXRsYXMgPSBhdGxhc0NvbGxlY3Rpb24uZHJhdyhzdHlsZUtleSwgYmIsIGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIGlmIChvcHRzLmRyYXdDbGlwcGVkKSB7XG4gICAgICAgICAgY29udGV4dC5zYXZlKCk7XG4gICAgICAgICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICAgICAgICBjb250ZXh0LnJlY3QoMCwgMCwgYmIudywgYmIuaCk7XG4gICAgICAgICAgY29udGV4dC5jbGlwKCk7XG4gICAgICAgICAgb3B0cy5kcmF3RWxlbWVudChjb250ZXh0LCBlbGUsIGJiLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgICBjb250ZXh0LnJlc3RvcmUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvcHRzLmRyYXdFbGVtZW50KGNvbnRleHQsIGVsZSwgYmIsIHRydWUsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGRyYXduID0gdHJ1ZTtcbiAgICAgIH0pO1xuICAgICAgaWYgKGRyYXduKSB7XG4gICAgICAgIHZhciBpZCA9IG9wdHMuZ2V0SUQgPyBvcHRzLmdldElEKGVsZSkgOiBlbGUuaWQoKTsgLy8gZm9yIHRlc3RpbmdcbiAgICAgICAgdmFyIG1hcEtleSA9IHRoaXMuX2tleSh0eXBlLCBpZCk7XG4gICAgICAgIGlmICh0aGlzLnR5cGVBbmRJZFRvS2V5LmhhcyhtYXBLZXkpKSB7XG4gICAgICAgICAgdGhpcy50eXBlQW5kSWRUb0tleS5nZXQobWFwS2V5KS5wdXNoKHN0eWxlS2V5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnR5cGVBbmRJZFRvS2V5LnNldChtYXBLZXksIFtzdHlsZUtleV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYXRsYXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldEF0bGFzSW5mb1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRBdGxhc0luZm8oZWxlLCB0eXBlKSB7XG4gICAgICB2YXIgX3RoaXM0ID0gdGhpcztcbiAgICAgIHZhciBvcHRzID0gdGhpcy5yZW5kZXJUeXBlcy5nZXQodHlwZSk7XG4gICAgICB2YXIga2V5ID0gb3B0cy5nZXRLZXkoZWxlKTtcbiAgICAgIHZhciBrZXlBcnJheSA9IEFycmF5LmlzQXJyYXkoa2V5KSA/IGtleSA6IFtrZXldO1xuICAgICAgcmV0dXJuIGtleUFycmF5Lm1hcChmdW5jdGlvbiAoc3R5bGVLZXkpIHtcbiAgICAgICAgdmFyIGJiID0gb3B0cy5nZXRCb3VuZGluZ0JveChlbGUsIHN0eWxlS2V5KTsgLy8gcGFzcyB0aGUga2V5IGJhY2sgdG8gdGhlIGdldEJvdW5kaW5nQm94IG1ldGhvZFxuICAgICAgICB2YXIgYXRsYXMgPSBfdGhpczQuZ2V0T3JDcmVhdGVBdGxhcyhlbGUsIHR5cGUsIGJiLCBzdHlsZUtleSk7XG4gICAgICAgIHZhciBfYXRsYXMkZ2V0T2Zmc2V0czMgPSBhdGxhcy5nZXRPZmZzZXRzKHN0eWxlS2V5KSxcbiAgICAgICAgICBfYXRsYXMkZ2V0T2Zmc2V0czQgPSBfc2xpY2VkVG9BcnJheShfYXRsYXMkZ2V0T2Zmc2V0czMsIDIpLFxuICAgICAgICAgIHRleDEgPSBfYXRsYXMkZ2V0T2Zmc2V0czRbMF0sXG4gICAgICAgICAgdGV4MiA9IF9hdGxhcyRnZXRPZmZzZXRzNFsxXTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBhdGxhczogYXRsYXMsXG4gICAgICAgICAgdGV4OiB0ZXgxLFxuICAgICAgICAgIHRleDE6IHRleDEsXG4gICAgICAgICAgdGV4MjogdGV4MixcbiAgICAgICAgICBiYjogYmJcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXREZWJ1Z0luZm9cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0RGVidWdJbmZvKCkge1xuICAgICAgdmFyIGRlYnVnSW5mbyA9IFtdO1xuICAgICAgdmFyIF9pdGVyYXRvcjYgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcih0aGlzLmNvbGxlY3Rpb25zKSxcbiAgICAgICAgX3N0ZXA2O1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIChfaXRlcmF0b3I2LnMoKTsgIShfc3RlcDYgPSBfaXRlcmF0b3I2Lm4oKSkuZG9uZTspIHtcbiAgICAgICAgICB2YXIgX3N0ZXA2JHZhbHVlID0gX3NsaWNlZFRvQXJyYXkoX3N0ZXA2LnZhbHVlLCAyKSxcbiAgICAgICAgICAgIG5hbWUgPSBfc3RlcDYkdmFsdWVbMF0sXG4gICAgICAgICAgICBjb2xsZWN0aW9uID0gX3N0ZXA2JHZhbHVlWzFdO1xuICAgICAgICAgIHZhciBfY29sbGVjdGlvbiRnZXRDb3VudHMgPSBjb2xsZWN0aW9uLmdldENvdW50cygpLFxuICAgICAgICAgICAga2V5Q291bnQgPSBfY29sbGVjdGlvbiRnZXRDb3VudHMua2V5Q291bnQsXG4gICAgICAgICAgICBhdGxhc0NvdW50ID0gX2NvbGxlY3Rpb24kZ2V0Q291bnRzLmF0bGFzQ291bnQ7XG4gICAgICAgICAgZGVidWdJbmZvLnB1c2goe1xuICAgICAgICAgICAgdHlwZTogbmFtZSxcbiAgICAgICAgICAgIGtleUNvdW50OiBrZXlDb3VudCxcbiAgICAgICAgICAgIGF0bGFzQ291bnQ6IGF0bGFzQ291bnRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIF9pdGVyYXRvcjYuZShlcnIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgX2l0ZXJhdG9yNi5mKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGVidWdJbmZvO1xuICAgIH1cbiAgfV0pO1xufSgpO1xudmFyIEF0bGFzQmF0Y2hNYW5hZ2VyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQXRsYXNCYXRjaE1hbmFnZXIoZ2xvYmFsT3B0aW9ucykge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBBdGxhc0JhdGNoTWFuYWdlcik7XG4gICAgdGhpcy5nbG9iYWxPcHRpb25zID0gZ2xvYmFsT3B0aW9ucztcbiAgICB0aGlzLmF0bGFzU2l6ZSA9IGdsb2JhbE9wdGlvbnMud2ViZ2xUZXhTaXplO1xuICAgIHRoaXMubWF4QXRsYXNlc1BlckJhdGNoID0gZ2xvYmFsT3B0aW9ucy53ZWJnbFRleFBlckJhdGNoO1xuICAgIHRoaXMuYmF0Y2hBdGxhc2VzID0gW107XG4gIH1cbiAgcmV0dXJuIF9jcmVhdGVDbGFzcyhBdGxhc0JhdGNoTWFuYWdlciwgW3tcbiAgICBrZXk6IFwiZ2V0TWF4QXRsYXNlc1BlckJhdGNoXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldE1heEF0bGFzZXNQZXJCYXRjaCgpIHtcbiAgICAgIHJldHVybiB0aGlzLm1heEF0bGFzZXNQZXJCYXRjaDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0QXRsYXNTaXplXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEF0bGFzU2l6ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmF0bGFzU2l6ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0SW5kZXhBcnJheVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRJbmRleEFycmF5KCkge1xuICAgICAgcmV0dXJuIEFycmF5LmZyb20oe1xuICAgICAgICBsZW5ndGg6IHRoaXMubWF4QXRsYXNlc1BlckJhdGNoXG4gICAgICB9LCBmdW5jdGlvbiAodiwgaSkge1xuICAgICAgICByZXR1cm4gaTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzdGFydEJhdGNoXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHN0YXJ0QmF0Y2goKSB7XG4gICAgICB0aGlzLmJhdGNoQXRsYXNlcyA9IFtdO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRBdGxhc0NvdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEF0bGFzQ291bnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5iYXRjaEF0bGFzZXMubGVuZ3RoO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRBdGxhc2VzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEF0bGFzZXMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5iYXRjaEF0bGFzZXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNhbkFkZFRvQ3VycmVudEJhdGNoXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNhbkFkZFRvQ3VycmVudEJhdGNoKGF0bGFzKSB7XG4gICAgICBpZiAodGhpcy5iYXRjaEF0bGFzZXMubGVuZ3RoID09PSB0aGlzLm1heEF0bGFzZXNQZXJCYXRjaCkge1xuICAgICAgICByZXR1cm4gdGhpcy5iYXRjaEF0bGFzZXMuaW5jbHVkZXMoYXRsYXMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7IC8vIG5vdCBmdWxsXG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldEF0bGFzSW5kZXhGb3JCYXRjaFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRBdGxhc0luZGV4Rm9yQmF0Y2goYXRsYXMpIHtcbiAgICAgIHZhciBhdGxhc0lEID0gdGhpcy5iYXRjaEF0bGFzZXMuaW5kZXhPZihhdGxhcyk7XG4gICAgICBpZiAoYXRsYXNJRCA8IDApIHtcbiAgICAgICAgaWYgKHRoaXMuYmF0Y2hBdGxhc2VzLmxlbmd0aCA9PT0gdGhpcy5tYXhBdGxhc2VzUGVyQmF0Y2gpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Nhbm5vdCBhZGQgbW9yZSBhdGxhc2VzIHRvIGJhdGNoJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5iYXRjaEF0bGFzZXMucHVzaChhdGxhcyk7XG4gICAgICAgIGF0bGFzSUQgPSB0aGlzLmJhdGNoQXRsYXNlcy5sZW5ndGggLSAxO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGF0bGFzSUQ7XG4gICAgfVxuICB9XSk7XG59KCk7XG5cbi8vIEZyYWdtZW50IHNoYWRlciBmdW5jdGlvbnMgdG8gY2FsY3VsYXRlIHNpZ25lZCBkaXN0YW5jZVxuLy8gaHR0cHM6Ly9pcXVpbGV6bGVzLm9yZy9hcnRpY2xlcy9kaXN0ZnVuY3Rpb25zMmQvXG4vLyBlbGxpcHNlOiBodHRwczovL3d3dy5zaGFkZXJ0b3kuY29tL3ZpZXcvNGxzWEROIFxuXG4vKipcbiAqIHBhcmFtIHAgLSBwb2ludFxuICogZmxvYXQgciAtIGNpcmNsZSByYWRpdXMsIGVnIDAuNSBmb3IgdW5pdCBjaXJjbGVcbiAqL1xudmFyIGNpcmNsZVNEID0gXCJcXG4gIGZsb2F0IGNpcmNsZVNEKHZlYzIgcCwgZmxvYXQgcikge1xcbiAgICByZXR1cm4gZGlzdGFuY2UodmVjMigwKSwgcCkgLSByOyAvLyBzaWduZWQgZGlzdGFuY2VcXG4gIH1cXG5cIjtcblxuLyoqXG4gKiBwYXJhbSBwIC0gcG9pbnRcbiAqIHBhcmFtIGIgLSBiLnggPSBoYWxmIHdpZHRoLCBiLnkgPSBoYWxmIGhlaWdodFxuICovXG52YXIgcmVjdGFuZ2xlU0QgPSBcIlxcbiAgZmxvYXQgcmVjdGFuZ2xlU0QodmVjMiBwLCB2ZWMyIGIpIHtcXG4gICAgdmVjMiBkID0gYWJzKHApLWI7XFxuICAgIHJldHVybiBkaXN0YW5jZSh2ZWMyKDApLG1heChkLDAuMCkpICsgbWluKG1heChkLngsZC55KSwwLjApO1xcbiAgfVxcblwiO1xuXG4vKipcbiAqIHBhcmFtIHAgLSBwb2ludFxuICogcGFyYW0gYiAtIGIueCA9IGhhbGYgd2lkdGgsIGIueSA9IGhhbGYgaGVpZ2h0XG4gKiBwYXJhbSBjciAtIHZlY3RvciBvZiBjb3JuZXIgcmFkaXVzZXNcbiAqL1xudmFyIHJvdW5kUmVjdGFuZ2xlU0QgPSBcIlxcbiAgZmxvYXQgcm91bmRSZWN0YW5nbGVTRCh2ZWMyIHAsIHZlYzIgYiwgdmVjNCBjcikge1xcbiAgICBjci54eSA9IChwLnggPiAwLjApID8gY3IueHkgOiBjci56dztcXG4gICAgY3IueCAgPSAocC55ID4gMC4wKSA/IGNyLnggIDogY3IueTtcXG4gICAgdmVjMiBxID0gYWJzKHApIC0gYiArIGNyLng7XFxuICAgIHJldHVybiBtaW4obWF4KHEueCwgcS55KSwgMC4wKSArIGRpc3RhbmNlKHZlYzIoMCksIG1heChxLCAwLjApKSAtIGNyLng7XFxuICB9XFxuXCI7XG5cbi8qKlxuICogcGFyYW0gcCAtIHBvaW50XG4gKiBwYXJhbSBhYiAtIGEueCA9IGhvcml6b250YWwgcmFkaXVzLCBhLnkgPSB2ZXJ0aWNhbCByYWRpdXNcbiAqL1xudmFyIGVsbGlwc2VTRCA9IFwiXFxuICBmbG9hdCBlbGxpcHNlU0QodmVjMiBwLCB2ZWMyIGFiKSB7XFxuICAgIHAgPSBhYnMoIHAgKTsgLy8gc3ltbWV0cnlcXG5cXG4gICAgLy8gZmluZCByb290IHdpdGggTmV3dG9uIHNvbHZlclxcbiAgICB2ZWMyIHEgPSBhYioocC1hYik7XFxuICAgIGZsb2F0IHcgPSAocS54PHEueSk/IDEuNTcwNzk2MzI3IDogMC4wO1xcbiAgICBmb3IoIGludCBpPTA7IGk8NTsgaSsrICkge1xcbiAgICAgIHZlYzIgY3MgPSB2ZWMyKGNvcyh3KSxzaW4odykpO1xcbiAgICAgIHZlYzIgdSA9IGFiKnZlYzIoIGNzLngsY3MueSk7XFxuICAgICAgdmVjMiB2ID0gYWIqdmVjMigtY3MueSxjcy54KTtcXG4gICAgICB3ID0gdyArIGRvdChwLXUsdikvKGRvdChwLXUsdSkrZG90KHYsdikpO1xcbiAgICB9XFxuICAgIFxcbiAgICAvLyBjb21wdXRlIGZpbmFsIHBvaW50IGFuZCBkaXN0YW5jZVxcbiAgICBmbG9hdCBkID0gbGVuZ3RoKHAtYWIqdmVjMihjb3Modyksc2luKHcpKSk7XFxuICAgIFxcbiAgICAvLyByZXR1cm4gc2lnbmVkIGRpc3RhbmNlXFxuICAgIHJldHVybiAoZG90KHAvYWIscC9hYik+MS4wKSA/IGQgOiAtZDtcXG4gIH1cXG5cIjtcblxuLyoqXG4gKiBUd28gcmVuZGVyIG1vZGVzLiBFYWNoIG1vZGUgaGFzIGl0cyBvd24gc2hhZGVyIHByb2dyYW0uIFRoZXkgYXJlIGFsbW9zdCBpZGVudGljYWwsIHRoZSBtYWluIGRpZmZlcmVuY2UgaXMgdGhlIG91dHB1dC5cbiAqIFNDUkVFTjogIG91dHB1dCBwaXhlbCBjb2xvcnMgdG8gdGhlIHNjcmVlblxuICogUElDS0lORzogb3V0cHV0IHotb3JkZXIgaW5kZXggdG8gYW4gb2Zmc2NyZWVuIGZyYW1lYnVmZmVyLCB1c2VkIHRvIGRldGVjdCB3aGF0J3MgdW5kZXIgdGhlIG1vdXNlIGN1cnNvclxuICovXG52YXIgUkVOREVSX1RBUkdFVCA9IHtcbiAgU0NSRUVOOiB7XG4gICAgbmFtZTogJ3NjcmVlbicsXG4gICAgc2NyZWVuOiB0cnVlXG4gIH0sXG4gIFBJQ0tJTkc6IHtcbiAgICBuYW1lOiAncGlja2luZycsXG4gICAgcGlja2luZzogdHJ1ZVxuICB9XG59O1xuXG4vKipcbiAqIFNwZWNpYWwgaGFuZGluZyBmb3IgbGFiZWwgdGV4dHVyZXMgaW4gUElDS0lORyBtb2RlLiBTZWUgaXNzdWUgIzMzMzcuXG4gKi9cbnZhciBURVhfUElDS0lOR19NT0RFID0ge1xuICAvLyByZW5kZXIgdGhlIHRleHR1cmUganVzdCBsaWtlIGluIFJFTkRFUl9UQVJHRVQuU0NSRUVOIG1vZGVcbiAgSUdOT1JFOiAxLFxuICAvLyBkb24ndCByZW5kZXIgdGhlIHRleHR1cmUgYXQgYWxsXG4gIFVTRV9CQjogMiAvLyByZW5kZXIgdGhlIGJvdW5kaW5nIGJveCBhcyBhbiBvcGFxdWUgcmVjdGFuZ2xlXG59O1xuXG4vLyBWZXJ0ZXggdHlwZXMuXG4vLyBVc2VkIGRpcmVjdGx5IGluIHRoZSBzaGFkZXJzIHNvIG11c3QgYmUgbnVtZXJpYy5cbi8vIFRoZXJlIGlzIG9ubHkgb25lIHNoYWRlciBwcm9ncmFtIHVzZWQgZm9yIGFuIGVudGlyZSBmcmFtZSB0aGF0IHJlbmRlcnMgYWxsIHR5cGVzIG9mIGVsZW1lbnRzLlxuLy8gVGhlcmUgYXJlIGlmLWVsc2UgYmxvY2tzIGluIHRoZSBzaGFkZXJzIHRoYXQgZG8gZGlmZmVyZW50IHRoaW5ncyBkZXBlbmRpbmcgb24gdGhlIHZlcnRleCB0eXBlLlxuLy8gVGhpcyBhbGxvd3MgYWxsIGVsZW1lbnRzIHRvIGJlIHJlbmRlcmVyZCBpbiBsYXJnZSBiYXRjaGVzIHdpdGhvdXQgc3dpdGNoaW5nIHNoYWRlciBwcm9ncmFtcy5cbnZhciBURVhUVVJFID0gMDtcbnZhciBFREdFX1NUUkFJR0hUID0gMTtcbnZhciBFREdFX0NVUlZFX1NFR01FTlQgPSAyO1xudmFyIEVER0VfQVJST1cgPSAzO1xudmFyIFJFQ1RBTkdMRSA9IDQ7XG52YXIgUk9VTkRfUkVDVEFOR0xFID0gNTtcbnZhciBCT1RUT01fUk9VTkRfUkVDVEFOR0xFID0gNjtcbnZhciBFTExJUFNFID0gNztcbnZhciBFbGVtZW50RHJhd2luZ1dlYkdMID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJpbmdDb250ZXh0fSBnbFxuICAgKi9cbiAgZnVuY3Rpb24gRWxlbWVudERyYXdpbmdXZWJHTChyLCBnbCwgb3B0cykge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBFbGVtZW50RHJhd2luZ1dlYkdMKTtcbiAgICB0aGlzLnIgPSByOyAvLyByZWZlcmVuY2UgdG8gdGhlIGNhbnZhcyByZW5kZXJlclxuICAgIHRoaXMuZ2wgPSBnbDtcbiAgICB0aGlzLm1heEluc3RhbmNlcyA9IG9wdHMud2ViZ2xCYXRjaFNpemU7XG4gICAgdGhpcy5hdGxhc1NpemUgPSBvcHRzLndlYmdsVGV4U2l6ZTtcbiAgICB0aGlzLmJnQ29sb3IgPSBvcHRzLmJnQ29sb3I7XG4gICAgdGhpcy5kZWJ1ZyA9IG9wdHMud2ViZ2xEZWJ1ZztcbiAgICB0aGlzLmJhdGNoRGVidWdJbmZvID0gW107XG4gICAgb3B0cy5lbmFibGVXcmFwcGluZyA9IHRydWU7XG4gICAgb3B0cy5jcmVhdGVUZXh0dXJlQ2FudmFzID0gY3JlYXRlVGV4dHVyZUNhbnZhczsgLy8gVW5pdCB0ZXN0cyBtb2NrIHRoaXNcblxuICAgIHRoaXMuYXRsYXNNYW5hZ2VyID0gbmV3IEF0bGFzTWFuYWdlcihyLCBvcHRzKTtcbiAgICB0aGlzLmJhdGNoTWFuYWdlciA9IG5ldyBBdGxhc0JhdGNoTWFuYWdlcihvcHRzKTtcbiAgICB0aGlzLnNpbXBsZVNoYXBlT3B0aW9ucyA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLnByb2dyYW0gPSB0aGlzLl9jcmVhdGVTaGFkZXJQcm9ncmFtKFJFTkRFUl9UQVJHRVQuU0NSRUVOKTtcbiAgICB0aGlzLnBpY2tpbmdQcm9ncmFtID0gdGhpcy5fY3JlYXRlU2hhZGVyUHJvZ3JhbShSRU5ERVJfVEFSR0VULlBJQ0tJTkcpO1xuICAgIHRoaXMudmFvID0gdGhpcy5fY3JlYXRlVkFPKCk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHsgc3RyaW5nIH0gY29sbGVjdGlvbk5hbWVcbiAgICogQHBhcmFtIHt7IHRleFJvd3M6IG51bWJlciB9fSBvcHRzXG4gICAqL1xuICByZXR1cm4gX2NyZWF0ZUNsYXNzKEVsZW1lbnREcmF3aW5nV2ViR0wsIFt7XG4gICAga2V5OiBcImFkZEF0bGFzQ29sbGVjdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRBdGxhc0NvbGxlY3Rpb24oY29sbGVjdGlvbk5hbWUsIG9wdHMpIHtcbiAgICAgIHRoaXMuYXRsYXNNYW5hZ2VyLmFkZEF0bGFzQ29sbGVjdGlvbihjb2xsZWN0aW9uTmFtZSwgb3B0cyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHR5cGVkZWYgeyBPYmplY3QgfSBUZXh0dXJlUmVuZGVyVHlwZU9wdHNcbiAgICAgKiBAcHJvcGVydHkgeyBzdHJpbmcgfSBjb2xsZWN0aW9uIC0gbmFtZSBvZiBhdGxhcyBjb2xsZWN0aW9uIHRvIHJlbmRlciB0ZXh0dXJlcyB0b1xuICAgICAqIEBwcm9wZXJ0eSB7IGZ1bmN0aW9uIH0gZ2V0S2V5IC0gcmV0dXJucyB0aGUgXCJzdHlsZSBrZXlcIiBmb3IgYW4gZWxlbWVudCwgbWF5IGJlIGEgc2luZ2xlIHZhbHVlIG9yIGFuIGFycmF5IGZvciBtdWx0aS1saW5lIGxhYmxlc1xuICAgICAqIEBwcm9wZXJ0eSB7IGZ1bmN0aW9uIH0gZHJhd0VsZW1lbnQgLSB1c2VzIGEgY2FudmFzIHJlbmRlcmVyIHRvIGRyYXcgdGhlIGVsZW1lbnQgdG8gdGhlIHRleHR1cmUgYXRsYXNcbiAgICAgKiBAcHJvcGVydHkgeyBib29sZWFuICB9IGRyYXdDbGlwcGVkIC0gaWYgdHJ1ZSB0aGUgY29udGV4dCB3aWxsIGJlIGNsaXBwZWQgdG8gdGhlIGJvdW5kaW5nIGJveCBiZWZvcmUgZHJhd0VsZW1lbnQoKSBpcyBjYWxsZWQsIG1heSBhZmZlY3QgcGVyZm9ybWFuY2VcbiAgICAgKiBAcHJvcGVydHkgeyBmdW5jdGlvbiB9IGdldEJvdW5kaW5nQm94IC0gcmV0dXJucyB0aGUgYm91bmRpbmcgYm94IGZvciBhbiBlbGVtZW50XG4gICAgICogQHByb3BlcnR5IHsgZnVuY3Rpb24gfSBnZXRSb3RhdGlvblxuICAgICAqIEBwcm9wZXJ0eSB7IGZ1bmN0aW9uIH0gZ2V0Um90YXRpb25Qb2ludFxuICAgICAqIEBwcm9wZXJ0eSB7IGZ1bmN0aW9uIH0gZ2V0Um90YXRpb25PZmZzZXRcbiAgICAgKiBAcHJvcGVydHkgeyBmdW5jdGlvbiB9IGlzVmlzaWJsZSAtIGFuIGV4dHJhIGNoZWNrIGZvciB2aXNpYmlsaXR5IGluIGFkZGl0aW9uIHRvIGVsZS52aXNpYmxlKClcbiAgICAgKiBAcHJvcGVydHkgeyBmdW5jdGlvbiB9IGdldFRleFBpY2tpbmdNb2RlIC0gcmV0dXJucyBhIHZhbHVlIGZyb20gdGhlIFRFWF9QSUNLSU5HX01PREUgZW51bVxuICAgICAqL1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7IHN0cmluZyB9IHR5cGVOYW1lXG4gICAgICogQHBhcmFtIHsgVGV4dHVyZVJlbmRlclR5cGVPcHRzIH0gb3B0c1xuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiBcImFkZFRleHR1cmVBdGxhc1JlbmRlclR5cGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkVGV4dHVyZUF0bGFzUmVuZGVyVHlwZSh0eXBlTmFtZSwgb3B0cykge1xuICAgICAgdGhpcy5hdGxhc01hbmFnZXIuYWRkUmVuZGVyVHlwZSh0eXBlTmFtZSwgb3B0cyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHR5cGVkZWYgeyBPYmplY3QgfSBTaW1wbGVTaGFwZVJlbmRlclR5cGVPcHRzXG4gICAgICogQHByb3BlcnR5IHsgZnVuY3Rpb24gfSBnZXRCb3VuZGluZ0JveCAtIHJldHVybnMgdGhlIGJvdW5kaW5nIGJveCBmb3IgYW4gZWxlbWVudFxuICAgICAqIEBwcm9wZXJ0eSB7IGZ1bmN0aW9uIH0gaXNWaXNpYmxlIC0gdGhpcyBpcyBhbiBleHRyYSBjaGVjayBmb3IgdmlzaWJpbGl0eSBpbiBhZGRpdGlvbiB0byBlbGUudmlzaWJsZSgpXG4gICAgICogQHByb3BlcnR5IHsgZnVuY3Rpb24gfSBpc1NpbXBsZSAtIGNoZWNrIGlmIGVsZW1lbnQgaXMgYSBzaW1wbGUgc2hhcGUsIG9yIGlmIGl0IG5lZWRzIHRvIGZhbGwgYmFjayB0byB0ZXh0dXJlIHJlbmRlcmluZ1xuICAgICAqIEBwcm9wZXJ0eSB7IFNoYXBlVmlzdWFsUHJvcGVydGllcyB9IHNoYXBlUHJvcHNcbiAgICAgKi9cbiAgICAvKipcbiAgICAgKiBAdHlwZWRlZiB7IE9iamVjdCB9IFNoYXBlVmlzdWFsUHJvcGVydGllc1xuICAgICAqIEBwcm9wZXJ0eSB7IHN0cmluZyB9IHNoYXBlXG4gICAgICogQHByb3BlcnR5IHsgc3RyaW5nIH0gY29sb3JcbiAgICAgKiBAcHJvcGVydHkgeyBzdHJpbmcgfSBvcGFjaXR5XG4gICAgICogQHByb3BlcnR5IHsgc3RyaW5nIH0gcGFkZGluZ1xuICAgICAqIEBwcm9wZXJ0eSB7IHN0cmluZyB9IHJhZGl1c1xuICAgICAqIEBwcm9wZXJ0eSB7IGJvb2xlYW4gfSBib3JkZXJcbiAgICAqL1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7IHN0cmluZyB9IHR5cGVOYW1lXG4gICAgICogQHBhcmFtIHsgU2ltcGxlU2hhcGVSZW5kZXJUeXBlT3B0cyB9IG9wdHNcbiAgICAgKi9cbiAgfSwge1xuICAgIGtleTogXCJhZGRTaW1wbGVTaGFwZVJlbmRlclR5cGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkU2ltcGxlU2hhcGVSZW5kZXJUeXBlKHR5cGVOYW1lLCBvcHRzKSB7XG4gICAgICB0aGlzLnNpbXBsZVNoYXBlT3B0aW9ucy5zZXQodHlwZU5hbWUsIG9wdHMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluZm9ybSB0aGUgYXRsYXNNYW5hZ2VyIHdoZW4gZWxlbWVudCBzdHlsZSBrZXlzIG1heSBoYXZlIGNoYW5nZWQuXG4gICAgICogVGhlIGF0bGFzTWFuYWdlciBjYW4gdGhlbiBtYXJrIHVudXNlZCB0ZXh0dXJlcyBmb3IgXCJnYXJiYWdlIGNvbGxlY3Rpb25cIi5cbiAgICAgKi9cbiAgfSwge1xuICAgIGtleTogXCJpbnZhbGlkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGludmFsaWRhdGUoZWxlcykge1xuICAgICAgdmFyIF9yZWYgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9LFxuICAgICAgICB0eXBlID0gX3JlZi50eXBlO1xuICAgICAgdmFyIGF0bGFzTWFuYWdlciA9IHRoaXMuYXRsYXNNYW5hZ2VyO1xuICAgICAgaWYgKHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIGF0bGFzTWFuYWdlci5pbnZhbGlkYXRlKGVsZXMsIHtcbiAgICAgICAgICBmaWx0ZXJUeXBlOiBmdW5jdGlvbiBmaWx0ZXJUeXBlKHQpIHtcbiAgICAgICAgICAgIHJldHVybiB0ID09PSB0eXBlO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZm9yY2VSZWRyYXc6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYXRsYXNNYW5hZ2VyLmludmFsaWRhdGUoZWxlcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUnVuIHRleHR1cmUgZ2FyYmFnZSBjb2xsZWN0aW9uLlxuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiBcImdjXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdjKCkge1xuICAgICAgdGhpcy5hdGxhc01hbmFnZXIuZ2MoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX2NyZWF0ZVNoYWRlclByb2dyYW1cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2NyZWF0ZVNoYWRlclByb2dyYW0ocmVuZGVyVGFyZ2V0KSB7XG4gICAgICB2YXIgZ2wgPSB0aGlzLmdsO1xuICAgICAgdmFyIHZlcnRleFNoYWRlclNvdXJjZSA9IFwiI3ZlcnNpb24gMzAwIGVzXFxuICAgICAgcHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xcblxcbiAgICAgIHVuaWZvcm0gbWF0MyB1UGFuWm9vbU1hdHJpeDtcXG4gICAgICB1bmlmb3JtIGludCAgdUF0bGFzU2l6ZTtcXG4gICAgICBcXG4gICAgICAvLyBpbnN0YW5jZWRcXG4gICAgICBpbiB2ZWMyIGFQb3NpdGlvbjsgLy8gYSB2ZXJ0ZXggZnJvbSB0aGUgdW5pdCBzcXVhcmVcXG4gICAgICBcXG4gICAgICBpbiBtYXQzIGFUcmFuc2Zvcm07IC8vIHVzZWQgdG8gdHJhbnNmb3JtIHZlcnRpY2llcywgZWcgaW50byBhIGJvdW5kaW5nIGJveFxcbiAgICAgIGluIGludCBhVmVydFR5cGU7IC8vIHRoZSB0eXBlIG9mIHRoaW5nIHdlIGFyZSByZW5kZXJpbmdcXG5cXG4gICAgICAvLyB0aGUgei1pbmRleCB0aGF0IGlzIG91dHB1dCB3aGVuIHVzaW5nIHBpY2tpbmcgbW9kZVxcbiAgICAgIGluIHZlYzQgYUluZGV4O1xcbiAgICAgIFxcbiAgICAgIC8vIEZvciB0ZXh0dXJlc1xcbiAgICAgIGluIGludCBhQXRsYXNJZDsgLy8gd2hpY2ggc2hhZGVyIHVuaXQvYXRsYXMgdG8gdXNlXFxuICAgICAgaW4gdmVjNCBhVGV4OyAvLyB4L3kvdy9oIG9mIHRleHR1cmUgaW4gYXRsYXNcXG5cXG4gICAgICAvLyBmb3IgZWRnZXNcXG4gICAgICBpbiB2ZWM0IGFQb2ludEFQb2ludEI7XFxuICAgICAgaW4gdmVjNCBhUG9pbnRDUG9pbnREO1xcbiAgICAgIGluIHZlYzIgYUxpbmVXaWR0aDsgLy8gYWxzbyB1c2VkIGZvciBub2RlIGJvcmRlciB3aWR0aFxcblxcbiAgICAgIC8vIHNpbXBsZSBzaGFwZXNcXG4gICAgICBpbiB2ZWM0IGFDb3JuZXJSYWRpdXM7IC8vIGZvciByb3VuZC1yZWN0YW5nbGUgW3RvcC1yaWdodCwgYm90dG9tLXJpZ2h0LCB0b3AtbGVmdCwgYm90dG9tLWxlZnRdXFxuICAgICAgaW4gdmVjNCBhQ29sb3I7IC8vIGFsc28gdXNlZCBmb3IgZWRnZXNcXG4gICAgICBpbiB2ZWM0IGFCb3JkZXJDb2xvcjsgLy8gYUxpbmVXaWR0aCBpcyB1c2VkIGZvciBib3JkZXIgd2lkdGhcXG5cXG4gICAgICAvLyBvdXRwdXQgdmFsdWVzIHBhc3NlZCB0byB0aGUgZnJhZ21lbnQgc2hhZGVyXFxuICAgICAgb3V0IHZlYzIgdlRleENvb3JkO1xcbiAgICAgIG91dCB2ZWM0IHZDb2xvcjtcXG4gICAgICBvdXQgdmVjMiB2UG9zaXRpb247XFxuICAgICAgLy8gZmxhdCB2YWx1ZXMgYXJlIG5vdCBpbnRlcnBvbGF0ZWRcXG4gICAgICBmbGF0IG91dCBpbnQgdkF0bGFzSWQ7IFxcbiAgICAgIGZsYXQgb3V0IGludCB2VmVydFR5cGU7XFxuICAgICAgZmxhdCBvdXQgdmVjMiB2VG9wUmlnaHQ7XFxuICAgICAgZmxhdCBvdXQgdmVjMiB2Qm90TGVmdDtcXG4gICAgICBmbGF0IG91dCB2ZWM0IHZDb3JuZXJSYWRpdXM7XFxuICAgICAgZmxhdCBvdXQgdmVjNCB2Qm9yZGVyQ29sb3I7XFxuICAgICAgZmxhdCBvdXQgdmVjMiB2Qm9yZGVyV2lkdGg7XFxuICAgICAgZmxhdCBvdXQgdmVjNCB2SW5kZXg7XFxuICAgICAgXFxuICAgICAgdm9pZCBtYWluKHZvaWQpIHtcXG4gICAgICAgIGludCB2aWQgPSBnbF9WZXJ0ZXhJRDtcXG4gICAgICAgIHZlYzIgcG9zaXRpb24gPSBhUG9zaXRpb247IC8vIFRPRE8gbWFrZSB0aGlzIGEgdmVjMywgc2ltcGxpZmllcyBzb21lIGNvZGUgYmVsb3dcXG5cXG4gICAgICAgIGlmKGFWZXJ0VHlwZSA9PSBcIi5jb25jYXQoVEVYVFVSRSwgXCIpIHtcXG4gICAgICAgICAgZmxvYXQgdGV4WCA9IGFUZXgueDsgLy8gdGV4dHVyZSBjb29yZGluYXRlc1xcbiAgICAgICAgICBmbG9hdCB0ZXhZID0gYVRleC55O1xcbiAgICAgICAgICBmbG9hdCB0ZXhXID0gYVRleC56O1xcbiAgICAgICAgICBmbG9hdCB0ZXhIID0gYVRleC53O1xcblxcbiAgICAgICAgICBpZih2aWQgPT0gMSB8fCB2aWQgPT0gMiB8fCB2aWQgPT0gNCkge1xcbiAgICAgICAgICAgIHRleFggKz0gdGV4VztcXG4gICAgICAgICAgfVxcbiAgICAgICAgICBpZih2aWQgPT0gMiB8fCB2aWQgPT0gNCB8fCB2aWQgPT0gNSkge1xcbiAgICAgICAgICAgIHRleFkgKz0gdGV4SDtcXG4gICAgICAgICAgfVxcblxcbiAgICAgICAgICBmbG9hdCBkID0gZmxvYXQodUF0bGFzU2l6ZSk7XFxuICAgICAgICAgIHZUZXhDb29yZCA9IHZlYzIodGV4WCAvIGQsIHRleFkgLyBkKTsgLy8gdGV4IGNvb3JkcyBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMVxcblxcbiAgICAgICAgICBnbF9Qb3NpdGlvbiA9IHZlYzQodVBhblpvb21NYXRyaXggKiBhVHJhbnNmb3JtICogdmVjMyhwb3NpdGlvbiwgMS4wKSwgMS4wKTtcXG4gICAgICAgIH1cXG4gICAgICAgIGVsc2UgaWYoYVZlcnRUeXBlID09IFwiKS5jb25jYXQoUkVDVEFOR0xFLCBcIiB8fCBhVmVydFR5cGUgPT0gXCIpLmNvbmNhdChFTExJUFNFLCBcIiBcXG4gICAgICAgICAgICAgfHwgYVZlcnRUeXBlID09IFwiKS5jb25jYXQoUk9VTkRfUkVDVEFOR0xFLCBcIiB8fCBhVmVydFR5cGUgPT0gXCIpLmNvbmNhdChCT1RUT01fUk9VTkRfUkVDVEFOR0xFLCBcIikgeyAvLyBzaW1wbGUgc2hhcGVzXFxuXFxuICAgICAgICAgIC8vIHRoZSBib3VuZGluZyBib3ggaXMgbmVlZGVkIGJ5IHRoZSBmcmFnbWVudCBzaGFkZXJcXG4gICAgICAgICAgdkJvdExlZnQgID0gKGFUcmFuc2Zvcm0gKiB2ZWMzKDAsIDAsIDEpKS54eTsgLy8gZmxhdFxcbiAgICAgICAgICB2VG9wUmlnaHQgPSAoYVRyYW5zZm9ybSAqIHZlYzMoMSwgMSwgMSkpLnh5OyAvLyBmbGF0XFxuICAgICAgICAgIHZQb3NpdGlvbiA9IChhVHJhbnNmb3JtICogdmVjMyhwb3NpdGlvbiwgMSkpLnh5OyAvLyB3aWxsIGJlIGludGVycG9sYXRlZFxcblxcbiAgICAgICAgICAvLyBjYWxjdWxhdGlvbnMgYXJlIGRvbmUgaW4gdGhlIGZyYWdtZW50IHNoYWRlciwganVzdCBwYXNzIHRoZXNlIGFsb25nXFxuICAgICAgICAgIHZDb2xvciA9IGFDb2xvcjtcXG4gICAgICAgICAgdkNvcm5lclJhZGl1cyA9IGFDb3JuZXJSYWRpdXM7XFxuICAgICAgICAgIHZCb3JkZXJDb2xvciA9IGFCb3JkZXJDb2xvcjtcXG4gICAgICAgICAgdkJvcmRlcldpZHRoID0gYUxpbmVXaWR0aDtcXG5cXG4gICAgICAgICAgZ2xfUG9zaXRpb24gPSB2ZWM0KHVQYW5ab29tTWF0cml4ICogYVRyYW5zZm9ybSAqIHZlYzMocG9zaXRpb24sIDEuMCksIDEuMCk7XFxuICAgICAgICB9XFxuICAgICAgICBlbHNlIGlmKGFWZXJ0VHlwZSA9PSBcIikuY29uY2F0KEVER0VfU1RSQUlHSFQsIFwiKSB7XFxuICAgICAgICAgIHZlYzIgc291cmNlID0gYVBvaW50QVBvaW50Qi54eTtcXG4gICAgICAgICAgdmVjMiB0YXJnZXQgPSBhUG9pbnRBUG9pbnRCLnp3O1xcblxcbiAgICAgICAgICAvLyBhZGp1c3QgdGhlIGdlb21ldHJ5IHNvIHRoYXQgdGhlIGxpbmUgaXMgY2VudGVyZWQgb24gdGhlIGVkZ2VcXG4gICAgICAgICAgcG9zaXRpb24ueSA9IHBvc2l0aW9uLnkgLSAwLjU7XFxuXFxuICAgICAgICAgIC8vIHN0cmV0Y2ggdGhlIHVuaXQgc3F1YXJlIGludG8gYSBsb25nIHNraW5ueSByZWN0YW5nbGVcXG4gICAgICAgICAgdmVjMiB4QmFzaXMgPSB0YXJnZXQgLSBzb3VyY2U7XFxuICAgICAgICAgIHZlYzIgeUJhc2lzID0gbm9ybWFsaXplKHZlYzIoLXhCYXNpcy55LCB4QmFzaXMueCkpO1xcbiAgICAgICAgICB2ZWMyIHBvaW50ID0gc291cmNlICsgeEJhc2lzICogcG9zaXRpb24ueCArIHlCYXNpcyAqIGFMaW5lV2lkdGhbMF0gKiBwb3NpdGlvbi55O1xcblxcbiAgICAgICAgICBnbF9Qb3NpdGlvbiA9IHZlYzQodVBhblpvb21NYXRyaXggKiB2ZWMzKHBvaW50LCAxLjApLCAxLjApO1xcbiAgICAgICAgICB2Q29sb3IgPSBhQ29sb3I7XFxuICAgICAgICB9IFxcbiAgICAgICAgZWxzZSBpZihhVmVydFR5cGUgPT0gXCIpLmNvbmNhdChFREdFX0NVUlZFX1NFR01FTlQsIFwiKSB7XFxuICAgICAgICAgIHZlYzIgcG9pbnRBID0gYVBvaW50QVBvaW50Qi54eTtcXG4gICAgICAgICAgdmVjMiBwb2ludEIgPSBhUG9pbnRBUG9pbnRCLnp3O1xcbiAgICAgICAgICB2ZWMyIHBvaW50QyA9IGFQb2ludENQb2ludEQueHk7XFxuICAgICAgICAgIHZlYzIgcG9pbnREID0gYVBvaW50Q1BvaW50RC56dztcXG5cXG4gICAgICAgICAgLy8gYWRqdXN0IHRoZSBnZW9tZXRyeSBzbyB0aGF0IHRoZSBsaW5lIGlzIGNlbnRlcmVkIG9uIHRoZSBlZGdlXFxuICAgICAgICAgIHBvc2l0aW9uLnkgPSBwb3NpdGlvbi55IC0gMC41O1xcblxcbiAgICAgICAgICB2ZWMyIHAwLCBwMSwgcDIsIHBvcztcXG4gICAgICAgICAgaWYocG9zaXRpb24ueCA9PSAwLjApIHsgLy8gVGhlIGxlZnQgc2lkZSBvZiB0aGUgdW5pdCBzcXVhcmVcXG4gICAgICAgICAgICBwMCA9IHBvaW50QTtcXG4gICAgICAgICAgICBwMSA9IHBvaW50QjtcXG4gICAgICAgICAgICBwMiA9IHBvaW50QztcXG4gICAgICAgICAgICBwb3MgPSBwb3NpdGlvbjtcXG4gICAgICAgICAgfSBlbHNlIHsgLy8gVGhlIHJpZ2h0IHNpZGUgb2YgdGhlIHVuaXQgc3F1YXJlLCB1c2Ugc2FtZSBhcHByb2FjaCBidXQgZmxpcCB0aGUgZ2VvbWV0cnkgdXBzaWRlIGRvd25cXG4gICAgICAgICAgICBwMCA9IHBvaW50RDtcXG4gICAgICAgICAgICBwMSA9IHBvaW50QztcXG4gICAgICAgICAgICBwMiA9IHBvaW50QjtcXG4gICAgICAgICAgICBwb3MgPSB2ZWMyKDAuMCwgLXBvc2l0aW9uLnkpO1xcbiAgICAgICAgICB9XFxuXFxuICAgICAgICAgIHZlYzIgcDAxID0gcDEgLSBwMDtcXG4gICAgICAgICAgdmVjMiBwMTIgPSBwMiAtIHAxO1xcbiAgICAgICAgICB2ZWMyIHAyMSA9IHAxIC0gcDI7XFxuXFxuICAgICAgICAgIC8vIEZpbmQgdGhlIG5vcm1hbCB2ZWN0b3IuXFxuICAgICAgICAgIHZlYzIgdGFuZ2VudCA9IG5vcm1hbGl6ZShub3JtYWxpemUocDEyKSArIG5vcm1hbGl6ZShwMDEpKTtcXG4gICAgICAgICAgdmVjMiBub3JtYWwgPSB2ZWMyKC10YW5nZW50LnksIHRhbmdlbnQueCk7XFxuXFxuICAgICAgICAgIC8vIEZpbmQgdGhlIHZlY3RvciBwZXJwZW5kaWN1bGFyIHRvIHAwIC0+IHAxLlxcbiAgICAgICAgICB2ZWMyIHAwMU5vcm0gPSBub3JtYWxpemUodmVjMigtcDAxLnksIHAwMS54KSk7XFxuXFxuICAgICAgICAgIC8vIERldGVybWluZSB0aGUgYmVuZCBkaXJlY3Rpb24uXFxuICAgICAgICAgIGZsb2F0IHNpZ21hID0gc2lnbihkb3QocDAxICsgcDIxLCBub3JtYWwpKTtcXG4gICAgICAgICAgZmxvYXQgd2lkdGggPSBhTGluZVdpZHRoWzBdO1xcblxcbiAgICAgICAgICBpZihzaWduKHBvcy55KSA9PSAtc2lnbWEpIHtcXG4gICAgICAgICAgICAvLyBUaGlzIGlzIGFuIGludGVyc2VjdGluZyB2ZXJ0ZXguIEFkanVzdCB0aGUgcG9zaXRpb24gc28gdGhhdCB0aGVyZSdzIG5vIG92ZXJsYXAuXFxuICAgICAgICAgICAgdmVjMiBwb2ludCA9IDAuNSAqIHdpZHRoICogbm9ybWFsICogLXNpZ21hIC8gZG90KG5vcm1hbCwgcDAxTm9ybSk7XFxuICAgICAgICAgICAgZ2xfUG9zaXRpb24gPSB2ZWM0KHVQYW5ab29tTWF0cml4ICogdmVjMyhwMSArIHBvaW50LCAxLjApLCAxLjApO1xcbiAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBub24taW50ZXJzZWN0aW5nIHZlcnRleC4gVHJlYXQgaXQgbGlrZSBhIG1pdHJlIGpvaW4uXFxuICAgICAgICAgICAgdmVjMiBwb2ludCA9IDAuNSAqIHdpZHRoICogbm9ybWFsICogc2lnbWEgKiBkb3Qobm9ybWFsLCBwMDFOb3JtKTtcXG4gICAgICAgICAgICBnbF9Qb3NpdGlvbiA9IHZlYzQodVBhblpvb21NYXRyaXggKiB2ZWMzKHAxICsgcG9pbnQsIDEuMCksIDEuMCk7XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgdkNvbG9yID0gYUNvbG9yO1xcbiAgICAgICAgfSBcXG4gICAgICAgIGVsc2UgaWYoYVZlcnRUeXBlID09IFwiKS5jb25jYXQoRURHRV9BUlJPVywgXCIgJiYgdmlkIDwgMykge1xcbiAgICAgICAgICAvLyBtYXNzYWdlIHRoZSBmaXJzdCB0cmlhbmdsZSBpbnRvIGFuIGVkZ2UgYXJyb3dcXG4gICAgICAgICAgaWYodmlkID09IDApXFxuICAgICAgICAgICAgcG9zaXRpb24gPSB2ZWMyKC0wLjE1LCAtMC4zKTtcXG4gICAgICAgICAgaWYodmlkID09IDEpXFxuICAgICAgICAgICAgcG9zaXRpb24gPSB2ZWMyKCAgMC4wLCAgMC4wKTtcXG4gICAgICAgICAgaWYodmlkID09IDIpXFxuICAgICAgICAgICAgcG9zaXRpb24gPSB2ZWMyKCAwLjE1LCAtMC4zKTtcXG5cXG4gICAgICAgICAgZ2xfUG9zaXRpb24gPSB2ZWM0KHVQYW5ab29tTWF0cml4ICogYVRyYW5zZm9ybSAqIHZlYzMocG9zaXRpb24sIDEuMCksIDEuMCk7XFxuICAgICAgICAgIHZDb2xvciA9IGFDb2xvcjtcXG4gICAgICAgIH1cXG4gICAgICAgIGVsc2Uge1xcbiAgICAgICAgICBnbF9Qb3NpdGlvbiA9IHZlYzQoMi4wLCAwLjAsIDAuMCwgMS4wKTsgLy8gZGlzY2FyZCB2ZXJ0ZXggYnkgcHV0dGluZyBpdCBvdXRzaWRlIHdlYmdsIGNsaXAgc3BhY2VcXG4gICAgICAgIH1cXG5cXG4gICAgICAgIHZBdGxhc0lkID0gYUF0bGFzSWQ7XFxuICAgICAgICB2VmVydFR5cGUgPSBhVmVydFR5cGU7XFxuICAgICAgICB2SW5kZXggPSBhSW5kZXg7XFxuICAgICAgfVxcbiAgICBcIik7XG4gICAgICB2YXIgaWR4cyA9IHRoaXMuYmF0Y2hNYW5hZ2VyLmdldEluZGV4QXJyYXkoKTtcbiAgICAgIHZhciBmcmFnbWVudFNoYWRlclNvdXJjZSA9IFwiI3ZlcnNpb24gMzAwIGVzXFxuICAgICAgcHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xcblxcbiAgICAgIC8vIGRlY2xhcmUgdGV4dHVyZSB1bml0IGZvciBlYWNoIHRleHR1cmUgYXRsYXMgaW4gdGhlIGJhdGNoXFxuICAgICAgXCIuY29uY2F0KGlkeHMubWFwKGZ1bmN0aW9uIChpKSB7XG4gICAgICAgIHJldHVybiBcInVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlXCIuY29uY2F0KGksIFwiO1wiKTtcbiAgICAgIH0pLmpvaW4oJ1xcblxcdCcpLCBcIlxcblxcbiAgICAgIHVuaWZvcm0gdmVjNCB1QkdDb2xvcjtcXG4gICAgICB1bmlmb3JtIGZsb2F0IHVab29tO1xcblxcbiAgICAgIGluIHZlYzIgdlRleENvb3JkO1xcbiAgICAgIGluIHZlYzQgdkNvbG9yO1xcbiAgICAgIGluIHZlYzIgdlBvc2l0aW9uOyAvLyBtb2RlbCBjb29yZGluYXRlc1xcblxcbiAgICAgIGZsYXQgaW4gaW50IHZBdGxhc0lkO1xcbiAgICAgIGZsYXQgaW4gdmVjNCB2SW5kZXg7XFxuICAgICAgZmxhdCBpbiBpbnQgdlZlcnRUeXBlO1xcbiAgICAgIGZsYXQgaW4gdmVjMiB2VG9wUmlnaHQ7XFxuICAgICAgZmxhdCBpbiB2ZWMyIHZCb3RMZWZ0O1xcbiAgICAgIGZsYXQgaW4gdmVjNCB2Q29ybmVyUmFkaXVzO1xcbiAgICAgIGZsYXQgaW4gdmVjNCB2Qm9yZGVyQ29sb3I7XFxuICAgICAgZmxhdCBpbiB2ZWMyIHZCb3JkZXJXaWR0aDtcXG5cXG4gICAgICBvdXQgdmVjNCBvdXRDb2xvcjtcXG5cXG4gICAgICBcIikuY29uY2F0KGNpcmNsZVNELCBcIlxcbiAgICAgIFwiKS5jb25jYXQocmVjdGFuZ2xlU0QsIFwiXFxuICAgICAgXCIpLmNvbmNhdChyb3VuZFJlY3RhbmdsZVNELCBcIlxcbiAgICAgIFwiKS5jb25jYXQoZWxsaXBzZVNELCBcIlxcblxcbiAgICAgIHZlYzQgYmxlbmQodmVjNCB0b3AsIHZlYzQgYm90KSB7IC8vIGJsZW5kIGNvbG9ycyB3aXRoIHByZW11bHRpcGxpZWQgYWxwaGFcXG4gICAgICAgIHJldHVybiB2ZWM0KCBcXG4gICAgICAgICAgdG9wLnJnYiArIChib3QucmdiICogKDEuMCAtIHRvcC5hKSksXFxuICAgICAgICAgIHRvcC5hICAgKyAoYm90LmEgICAqICgxLjAgLSB0b3AuYSkpIFxcbiAgICAgICAgKTtcXG4gICAgICB9XFxuXFxuICAgICAgdmVjNCBkaXN0SW50ZXJwKHZlYzQgY0EsIHZlYzQgY0IsIGZsb2F0IGQpIHsgLy8gaW50ZXJwb2xhdGUgY29sb3IgdXNpbmcgU2lnbmVkIERpc3RhbmNlXFxuICAgICAgICAvLyBzY2FsZSB0byB0aGUgem9vbSBsZXZlbCBzbyB0aGF0IGJvcmRlcnMgZG9uJ3QgbG9vayBibHVycnkgd2hlbiB6b29tZWQgaW5cXG4gICAgICAgIC8vIG5vdGUgMS41IGlzIGFuIGFyaWJpdHJhcnkgdmFsdWUgY2hvc2VuIGJlY2F1c2UgaXQgbG9va3MgZ29vZFxcbiAgICAgICAgcmV0dXJuIG1peChjQSwgY0IsIDEuMCAtIHNtb290aHN0ZXAoMC4wLCAxLjUgLyB1Wm9vbSwgYWJzKGQpKSk7IFxcbiAgICAgIH1cXG5cXG4gICAgICB2b2lkIG1haW4odm9pZCkge1xcbiAgICAgICAgaWYodlZlcnRUeXBlID09IFwiKS5jb25jYXQoVEVYVFVSRSwgXCIpIHtcXG4gICAgICAgICAgLy8gbG9vayB1cCB0aGUgdGV4ZWwgZnJvbSB0aGUgdGV4dHVyZSB1bml0XFxuICAgICAgICAgIFwiKS5jb25jYXQoaWR4cy5tYXAoZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgcmV0dXJuIFwiaWYodkF0bGFzSWQgPT0gXCIuY29uY2F0KGksIFwiKSBvdXRDb2xvciA9IHRleHR1cmUodVRleHR1cmVcIikuY29uY2F0KGksIFwiLCB2VGV4Q29vcmQpO1wiKTtcbiAgICAgIH0pLmpvaW4oJ1xcblxcdGVsc2UgJyksIFwiXFxuICAgICAgICB9IFxcbiAgICAgICAgZWxzZSBpZih2VmVydFR5cGUgPT0gXCIpLmNvbmNhdChFREdFX0FSUk9XLCBcIikge1xcbiAgICAgICAgICAvLyBtaW1pY3MgaG93IGNhbnZhcyByZW5kZXJlciB1c2VzIGNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ2Rlc3RpbmF0aW9uLW91dCc7XFxuICAgICAgICAgIG91dENvbG9yID0gYmxlbmQodkNvbG9yLCB1QkdDb2xvcik7XFxuICAgICAgICAgIG91dENvbG9yLmEgPSAxLjA7IC8vIG1ha2Ugb3BhcXVlLCBtYXNrcyBvdXQgbGluZSB1bmRlciBhcnJvd1xcbiAgICAgICAgfVxcbiAgICAgICAgZWxzZSBpZih2VmVydFR5cGUgPT0gXCIpLmNvbmNhdChSRUNUQU5HTEUsIFwiICYmIHZCb3JkZXJXaWR0aCA9PSB2ZWMyKDAuMCkpIHsgLy8gc2ltcGxlIHJlY3RhbmdsZSB3aXRoIG5vIGJvcmRlclxcbiAgICAgICAgICBvdXRDb2xvciA9IHZDb2xvcjsgLy8gdW5pdCBzcXVhcmUgaXMgYWxyZWFkeSB0cmFuc2Zvcm1lZCB0byB0aGUgcmVjdGFuZ2xlLCBub3RoaW5nIGVsc2UgbmVlZHMgdG8gYmUgZG9uZVxcbiAgICAgICAgfVxcbiAgICAgICAgZWxzZSBpZih2VmVydFR5cGUgPT0gXCIpLmNvbmNhdChSRUNUQU5HTEUsIFwiIHx8IHZWZXJ0VHlwZSA9PSBcIikuY29uY2F0KEVMTElQU0UsIFwiIFxcbiAgICAgICAgICB8fCB2VmVydFR5cGUgPT0gXCIpLmNvbmNhdChST1VORF9SRUNUQU5HTEUsIFwiIHx8IHZWZXJ0VHlwZSA9PSBcIikuY29uY2F0KEJPVFRPTV9ST1VORF9SRUNUQU5HTEUsIFwiKSB7IC8vIHVzZSBTREZcXG5cXG4gICAgICAgICAgZmxvYXQgb3V0ZXJCb3JkZXIgPSB2Qm9yZGVyV2lkdGhbMF07XFxuICAgICAgICAgIGZsb2F0IGlubmVyQm9yZGVyID0gdkJvcmRlcldpZHRoWzFdO1xcbiAgICAgICAgICBmbG9hdCBib3JkZXJQYWRkaW5nID0gb3V0ZXJCb3JkZXIgKiAyLjA7XFxuICAgICAgICAgIGZsb2F0IHcgPSB2VG9wUmlnaHQueCAtIHZCb3RMZWZ0LnggLSBib3JkZXJQYWRkaW5nO1xcbiAgICAgICAgICBmbG9hdCBoID0gdlRvcFJpZ2h0LnkgLSB2Qm90TGVmdC55IC0gYm9yZGVyUGFkZGluZztcXG4gICAgICAgICAgdmVjMiBiID0gdmVjMih3LzIuMCwgaC8yLjApOyAvLyBoYWxmIHdpZHRoLCBoYWxmIGhlaWdodFxcbiAgICAgICAgICB2ZWMyIHAgPSB2UG9zaXRpb24gLSB2ZWMyKHZUb3BSaWdodC54IC0gYlswXSAtIG91dGVyQm9yZGVyLCB2VG9wUmlnaHQueSAtIGJbMV0gLSBvdXRlckJvcmRlcik7IC8vIHRyYW5zbGF0ZSB0byBjZW50ZXJcXG5cXG4gICAgICAgICAgZmxvYXQgZDsgLy8gc2lnbmVkIGRpc3RhbmNlXFxuICAgICAgICAgIGlmKHZWZXJ0VHlwZSA9PSBcIikuY29uY2F0KFJFQ1RBTkdMRSwgXCIpIHtcXG4gICAgICAgICAgICBkID0gcmVjdGFuZ2xlU0QocCwgYik7XFxuICAgICAgICAgIH0gZWxzZSBpZih2VmVydFR5cGUgPT0gXCIpLmNvbmNhdChFTExJUFNFLCBcIiAmJiB3ID09IGgpIHtcXG4gICAgICAgICAgICBkID0gY2lyY2xlU0QocCwgYi54KTsgLy8gZmFzdGVyIHRoYW4gZWxsaXBzZVxcbiAgICAgICAgICB9IGVsc2UgaWYodlZlcnRUeXBlID09IFwiKS5jb25jYXQoRUxMSVBTRSwgXCIpIHtcXG4gICAgICAgICAgICBkID0gZWxsaXBzZVNEKHAsIGIpO1xcbiAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGQgPSByb3VuZFJlY3RhbmdsZVNEKHAsIGIsIHZDb3JuZXJSYWRpdXMud3p5eCk7XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgLy8gdXNlIHRoZSBkaXN0YW5jZSB0byBpbnRlcnBvbGF0ZSBhIGNvbG9yIHRvIHNtb290aCB0aGUgZWRnZXMgb2YgdGhlIHNoYXBlLCBkb2Vzbid0IG5lZWQgbXVsdGlzYW1wbGluZ1xcbiAgICAgICAgICAvLyB3ZSBtdXN0IHNtb290aCBjb2xvcnMgaW53YXJkcywgYmVjYXVzZSB3ZSBjYW4ndCBjaGFuZ2UgcGl4ZWxzIG91dHNpZGUgdGhlIHNoYXBlJ3MgYm91bmRpbmcgYm94XFxuICAgICAgICAgIGlmKGQgPiAwLjApIHtcXG4gICAgICAgICAgICBpZihkID4gb3V0ZXJCb3JkZXIpIHtcXG4gICAgICAgICAgICAgIGRpc2NhcmQ7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgIG91dENvbG9yID0gZGlzdEludGVycCh2Qm9yZGVyQ29sb3IsIHZlYzQoMCksIGQgLSBvdXRlckJvcmRlcik7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGlmKGQgPiBpbm5lckJvcmRlcikge1xcbiAgICAgICAgICAgICAgdmVjNCBvdXRlckNvbG9yID0gb3V0ZXJCb3JkZXIgPT0gMC4wID8gdmVjNCgwKSA6IHZCb3JkZXJDb2xvcjtcXG4gICAgICAgICAgICAgIHZlYzQgaW5uZXJCb3JkZXJDb2xvciA9IGJsZW5kKHZCb3JkZXJDb2xvciwgdkNvbG9yKTtcXG4gICAgICAgICAgICAgIG91dENvbG9yID0gZGlzdEludGVycChpbm5lckJvcmRlckNvbG9yLCBvdXRlckNvbG9yLCBkKTtcXG4gICAgICAgICAgICB9IFxcbiAgICAgICAgICAgIGVsc2Uge1xcbiAgICAgICAgICAgICAgdmVjNCBvdXRlckNvbG9yO1xcbiAgICAgICAgICAgICAgaWYoaW5uZXJCb3JkZXIgPT0gMC4wICYmIG91dGVyQm9yZGVyID09IDAuMCkge1xcbiAgICAgICAgICAgICAgICBvdXRlckNvbG9yID0gdmVjNCgwKTtcXG4gICAgICAgICAgICAgIH0gZWxzZSBpZihpbm5lckJvcmRlciA9PSAwLjApIHtcXG4gICAgICAgICAgICAgICAgb3V0ZXJDb2xvciA9IHZCb3JkZXJDb2xvcjtcXG4gICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIG91dGVyQ29sb3IgPSBibGVuZCh2Qm9yZGVyQ29sb3IsIHZDb2xvcik7XFxuICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICBvdXRDb2xvciA9IGRpc3RJbnRlcnAodkNvbG9yLCBvdXRlckNvbG9yLCBkIC0gaW5uZXJCb3JkZXIpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICAgICAgZWxzZSB7XFxuICAgICAgICAgIG91dENvbG9yID0gdkNvbG9yO1xcbiAgICAgICAgfVxcblxcbiAgICAgICAgXCIpLmNvbmNhdChyZW5kZXJUYXJnZXQucGlja2luZyA/IFwiaWYob3V0Q29sb3IuYSA9PSAwLjApIGRpc2NhcmQ7XFxuICAgICAgICAgICAgIGVsc2Ugb3V0Q29sb3IgPSB2SW5kZXg7XCIgOiAnJywgXCJcXG4gICAgICB9XFxuICAgIFwiKTtcbiAgICAgIHZhciBwcm9ncmFtID0gY3JlYXRlUHJvZ3JhbShnbCwgdmVydGV4U2hhZGVyU291cmNlLCBmcmFnbWVudFNoYWRlclNvdXJjZSk7XG5cbiAgICAgIC8vIGluc3RhbmNlIGdlb21ldHJ5XG4gICAgICBwcm9ncmFtLmFQb3NpdGlvbiA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sICdhUG9zaXRpb24nKTtcblxuICAgICAgLy8gYXR0cmlidXRlc1xuICAgICAgcHJvZ3JhbS5hSW5kZXggPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCAnYUluZGV4Jyk7XG4gICAgICBwcm9ncmFtLmFWZXJ0VHlwZSA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sICdhVmVydFR5cGUnKTtcbiAgICAgIHByb2dyYW0uYVRyYW5zZm9ybSA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sICdhVHJhbnNmb3JtJyk7XG4gICAgICBwcm9ncmFtLmFBdGxhc0lkID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgJ2FBdGxhc0lkJyk7XG4gICAgICBwcm9ncmFtLmFUZXggPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCAnYVRleCcpO1xuICAgICAgcHJvZ3JhbS5hUG9pbnRBUG9pbnRCID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgJ2FQb2ludEFQb2ludEInKTtcbiAgICAgIHByb2dyYW0uYVBvaW50Q1BvaW50RCA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sICdhUG9pbnRDUG9pbnREJyk7XG4gICAgICBwcm9ncmFtLmFMaW5lV2lkdGggPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCAnYUxpbmVXaWR0aCcpO1xuICAgICAgcHJvZ3JhbS5hQ29sb3IgPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCAnYUNvbG9yJyk7XG4gICAgICBwcm9ncmFtLmFDb3JuZXJSYWRpdXMgPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCAnYUNvcm5lclJhZGl1cycpO1xuICAgICAgcHJvZ3JhbS5hQm9yZGVyQ29sb3IgPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCAnYUJvcmRlckNvbG9yJyk7XG5cbiAgICAgIC8vIHVuaWZvcm1zXG4gICAgICBwcm9ncmFtLnVQYW5ab29tTWF0cml4ID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICd1UGFuWm9vbU1hdHJpeCcpO1xuICAgICAgcHJvZ3JhbS51QXRsYXNTaXplID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICd1QXRsYXNTaXplJyk7XG4gICAgICBwcm9ncmFtLnVCR0NvbG9yID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICd1QkdDb2xvcicpO1xuICAgICAgcHJvZ3JhbS51Wm9vbSA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAndVpvb20nKTtcbiAgICAgIHByb2dyYW0udVRleHR1cmVzID0gW107XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuYmF0Y2hNYW5hZ2VyLmdldE1heEF0bGFzZXNQZXJCYXRjaCgpOyBpKyspIHtcbiAgICAgICAgcHJvZ3JhbS51VGV4dHVyZXMucHVzaChnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgXCJ1VGV4dHVyZVwiLmNvbmNhdChpKSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHByb2dyYW07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9jcmVhdGVWQU9cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2NyZWF0ZVZBTygpIHtcbiAgICAgIHZhciB1bml0U3F1YXJlID0gWzAsIDAsIDEsIDAsIDEsIDEsIDAsIDAsIDEsIDEsIDAsIDFdO1xuICAgICAgdGhpcy52ZXJ0ZXhDb3VudCA9IHVuaXRTcXVhcmUubGVuZ3RoIC8gMjtcbiAgICAgIHZhciBuID0gdGhpcy5tYXhJbnN0YW5jZXM7XG4gICAgICB2YXIgZ2wgPSB0aGlzLmdsLFxuICAgICAgICBwcm9ncmFtID0gdGhpcy5wcm9ncmFtO1xuICAgICAgdmFyIHZhbyA9IGdsLmNyZWF0ZVZlcnRleEFycmF5KCk7XG4gICAgICBnbC5iaW5kVmVydGV4QXJyYXkodmFvKTtcbiAgICAgIGNyZWF0ZUJ1ZmZlclN0YXRpY0RyYXcoZ2wsICd2ZWMyJywgcHJvZ3JhbS5hUG9zaXRpb24sIHVuaXRTcXVhcmUpO1xuXG4gICAgICAvLyBDcmVhdGUgYnVmZmVycyBmb3IgYWxsIHRoZSBhdHRyaWJ1dGVzXG4gICAgICB0aGlzLnRyYW5zZm9ybUJ1ZmZlciA9IGNyZWF0ZTN4M01hdHJpeEJ1ZmZlckR5bmFtaWNEcmF3KGdsLCBuLCBwcm9ncmFtLmFUcmFuc2Zvcm0pO1xuICAgICAgdGhpcy5pbmRleEJ1ZmZlciA9IGNyZWF0ZUJ1ZmZlckR5bmFtaWNEcmF3KGdsLCBuLCAndmVjNCcsIHByb2dyYW0uYUluZGV4KTtcbiAgICAgIHRoaXMudmVydFR5cGVCdWZmZXIgPSBjcmVhdGVCdWZmZXJEeW5hbWljRHJhdyhnbCwgbiwgJ2ludCcsIHByb2dyYW0uYVZlcnRUeXBlKTtcbiAgICAgIHRoaXMuYXRsYXNJZEJ1ZmZlciA9IGNyZWF0ZUJ1ZmZlckR5bmFtaWNEcmF3KGdsLCBuLCAnaW50JywgcHJvZ3JhbS5hQXRsYXNJZCk7XG4gICAgICB0aGlzLnRleEJ1ZmZlciA9IGNyZWF0ZUJ1ZmZlckR5bmFtaWNEcmF3KGdsLCBuLCAndmVjNCcsIHByb2dyYW0uYVRleCk7XG4gICAgICB0aGlzLnBvaW50QVBvaW50QkJ1ZmZlciA9IGNyZWF0ZUJ1ZmZlckR5bmFtaWNEcmF3KGdsLCBuLCAndmVjNCcsIHByb2dyYW0uYVBvaW50QVBvaW50Qik7XG4gICAgICB0aGlzLnBvaW50Q1BvaW50REJ1ZmZlciA9IGNyZWF0ZUJ1ZmZlckR5bmFtaWNEcmF3KGdsLCBuLCAndmVjNCcsIHByb2dyYW0uYVBvaW50Q1BvaW50RCk7XG4gICAgICB0aGlzLmxpbmVXaWR0aEJ1ZmZlciA9IGNyZWF0ZUJ1ZmZlckR5bmFtaWNEcmF3KGdsLCBuLCAndmVjMicsIHByb2dyYW0uYUxpbmVXaWR0aCk7XG4gICAgICB0aGlzLmNvbG9yQnVmZmVyID0gY3JlYXRlQnVmZmVyRHluYW1pY0RyYXcoZ2wsIG4sICd2ZWM0JywgcHJvZ3JhbS5hQ29sb3IpO1xuICAgICAgdGhpcy5jb3JuZXJSYWRpdXNCdWZmZXIgPSBjcmVhdGVCdWZmZXJEeW5hbWljRHJhdyhnbCwgbiwgJ3ZlYzQnLCBwcm9ncmFtLmFDb3JuZXJSYWRpdXMpO1xuICAgICAgdGhpcy5ib3JkZXJDb2xvckJ1ZmZlciA9IGNyZWF0ZUJ1ZmZlckR5bmFtaWNEcmF3KGdsLCBuLCAndmVjNCcsIHByb2dyYW0uYUJvcmRlckNvbG9yKTtcbiAgICAgIGdsLmJpbmRWZXJ0ZXhBcnJheShudWxsKTtcbiAgICAgIHJldHVybiB2YW87XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImJ1ZmZlcnNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICBpZiAoIXRoaXMuX2J1ZmZlcnMpIHtcbiAgICAgICAgdGhpcy5fYnVmZmVycyA9IE9iamVjdC5rZXlzKHRoaXMpLmZpbHRlcihmdW5jdGlvbiAoaykge1xuICAgICAgICAgIHJldHVybiBlbmRzV2l0aChrLCAnQnVmZmVyJyk7XG4gICAgICAgIH0pLm1hcChmdW5jdGlvbiAoaykge1xuICAgICAgICAgIHJldHVybiBfdGhpc1trXTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5fYnVmZmVycztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic3RhcnRGcmFtZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzdGFydEZyYW1lKHBhblpvb21NYXRyaXgpIHtcbiAgICAgIHZhciByZW5kZXJUYXJnZXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IFJFTkRFUl9UQVJHRVQuU0NSRUVOO1xuICAgICAgdGhpcy5wYW5ab29tTWF0cml4ID0gcGFuWm9vbU1hdHJpeDtcbiAgICAgIHRoaXMucmVuZGVyVGFyZ2V0ID0gcmVuZGVyVGFyZ2V0O1xuICAgICAgdGhpcy5iYXRjaERlYnVnSW5mbyA9IFtdO1xuICAgICAgdGhpcy53cmFwcGVkQ291bnQgPSAwO1xuICAgICAgdGhpcy5zaW1wbGVDb3VudCA9IDA7XG4gICAgICB0aGlzLnN0YXJ0QmF0Y2goKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic3RhcnRCYXRjaFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzdGFydEJhdGNoKCkge1xuICAgICAgdGhpcy5pbnN0YW5jZUNvdW50ID0gMDtcbiAgICAgIHRoaXMuYmF0Y2hNYW5hZ2VyLnN0YXJ0QmF0Y2goKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZW5kRnJhbWVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZW5kRnJhbWUoKSB7XG4gICAgICB0aGlzLmVuZEJhdGNoKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9pc1Zpc2libGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2lzVmlzaWJsZShlbGUsIG9wdHMpIHtcbiAgICAgIGlmIChlbGUudmlzaWJsZSgpKSB7XG4gICAgICAgIGlmIChvcHRzICYmIG9wdHMuaXNWaXNpYmxlKSB7XG4gICAgICAgICAgcmV0dXJuIG9wdHMuaXNWaXNpYmxlKGVsZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHJhd3MgYSB0ZXh0dXJlIHVzaW5nIHRoZSB0ZXh0dXJlIGF0bGFzLlxuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiBcImRyYXdUZXh0dXJlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRyYXdUZXh0dXJlKGVsZSwgZWxlSW5kZXgsIHR5cGUpIHtcbiAgICAgIHZhciBhdGxhc01hbmFnZXIgPSB0aGlzLmF0bGFzTWFuYWdlcixcbiAgICAgICAgYmF0Y2hNYW5hZ2VyID0gdGhpcy5iYXRjaE1hbmFnZXI7XG4gICAgICB2YXIgb3B0cyA9IGF0bGFzTWFuYWdlci5nZXRSZW5kZXJUeXBlT3B0cyh0eXBlKTtcbiAgICAgIGlmICghdGhpcy5faXNWaXNpYmxlKGVsZSwgb3B0cykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBFZGdlcyB3aXRoIGludmFsaWQgcG9pbnRzIGNvdWxkIGJlIHBhc3NlZCBoZXJlIChsYWJlbHMpLCBjYXVzaW5nIGVycm9yc1xuICAgICAgLy8gUmVmOiBSYW5kb20gXCJTY3JpcHQgRXJyb3JcIiB0aHJvd24gd2hlbiBnZW5lcmF0aW5nIG5vZGVzIGFuZCBlZGdlcyBpbiBuZXdlc3Qgd2ViZ2wgdmVyc2lvbiAjMzM2NVxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2N5dG9zY2FwZS9jeXRvc2NhcGUuanMvaXNzdWVzLzMzNjVcbiAgICAgIGlmIChlbGUuaXNFZGdlKCkgJiYgIXRoaXMuX2lzVmFsaWRFZGdlKGVsZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMucmVuZGVyVGFyZ2V0LnBpY2tpbmcgJiYgb3B0cy5nZXRUZXhQaWNraW5nTW9kZSkge1xuICAgICAgICB2YXIgbW9kZSA9IG9wdHMuZ2V0VGV4UGlja2luZ01vZGUoZWxlKTtcbiAgICAgICAgaWYgKG1vZGUgPT09IFRFWF9QSUNLSU5HX01PREUuSUdOT1JFKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gVEVYX1BJQ0tJTkdfTU9ERS5VU0VfQkIpIHtcbiAgICAgICAgICB0aGlzLmRyYXdQaWNraW5nUmVjdGFuZ2xlKGVsZSwgZWxlSW5kZXgsIHR5cGUpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBHZXQgdGhlIGF0bGFzIGFuZCB0aGUgdGV4dHVyZSBjb29yZGluYXRlcywgd2lsbCBkcmF3IHRoZSB0ZXh0dXJlIGlmIGl0IGhhc24ndCBiZWVuIGRyYXduIHlldFxuICAgICAgLy8gTWF5IGJlIG1vcmUgdGhhbiBvbmUgdGV4dHVyZSBpZiBmb3IgZXhhbXBsZSB0aGUgbGFiZWwgaGFzIG11bHRpcGxlIGxpbmVzXG4gICAgICB2YXIgYXRsYXNJbmZvQXJyYXkgPSBhdGxhc01hbmFnZXIuZ2V0QXRsYXNJbmZvKGVsZSwgdHlwZSk7XG4gICAgICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoYXRsYXNJbmZvQXJyYXkpLFxuICAgICAgICBfc3RlcDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgdmFyIGF0bGFzSW5mbyA9IF9zdGVwLnZhbHVlO1xuICAgICAgICAgIHZhciBhdGxhcyA9IGF0bGFzSW5mby5hdGxhcyxcbiAgICAgICAgICAgIHRleDEgPSBhdGxhc0luZm8udGV4MSxcbiAgICAgICAgICAgIHRleDIgPSBhdGxhc0luZm8udGV4MjsgLy8gdGV4MiBpcyB1c2VkIGlmIHRoZSBsYWJlbCB3cmFwcyBhbmQgdGhlcmUgYXJlIHR3byB0ZXh0dXJlc1xuXG4gICAgICAgICAgaWYgKCFiYXRjaE1hbmFnZXIuY2FuQWRkVG9DdXJyZW50QmF0Y2goYXRsYXMpKSB7XG4gICAgICAgICAgICB0aGlzLmVuZEJhdGNoKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBhdGxhc0luZGV4ID0gYmF0Y2hNYW5hZ2VyLmdldEF0bGFzSW5kZXhGb3JCYXRjaChhdGxhcyk7XG4gICAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBfYXJyID0gW1t0ZXgxLCB0cnVlXSwgW3RleDIsIGZhbHNlXV07IF9pIDwgX2Fyci5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIHZhciBfYXJyJF9pID0gX3NsaWNlZFRvQXJyYXkoX2FycltfaV0sIDIpLFxuICAgICAgICAgICAgICB0ZXggPSBfYXJyJF9pWzBdLFxuICAgICAgICAgICAgICBmaXJzdCA9IF9hcnIkX2lbMV07XG4gICAgICAgICAgICBpZiAodGV4LncgIT0gMCkge1xuICAgICAgICAgICAgICB2YXIgaW5zdGFuY2UgPSB0aGlzLmluc3RhbmNlQ291bnQ7XG4gICAgICAgICAgICAgIHRoaXMudmVydFR5cGVCdWZmZXIuZ2V0VmlldyhpbnN0YW5jZSlbMF0gPSBURVhUVVJFO1xuICAgICAgICAgICAgICB2YXIgaW5kZXhWaWV3ID0gdGhpcy5pbmRleEJ1ZmZlci5nZXRWaWV3KGluc3RhbmNlKTtcbiAgICAgICAgICAgICAgaW5kZXhUb1ZlYzQoZWxlSW5kZXgsIGluZGV4Vmlldyk7XG5cbiAgICAgICAgICAgICAgLy8gU2V0IHZhbHVlcyBpbiB0aGUgYnVmZmVycyB1c2luZyBUeXBlZCBBcnJheSBWaWV3cyBmb3IgcGVyZm9ybWFuY2UuXG4gICAgICAgICAgICAgIHZhciBhdGxhc0lkVmlldyA9IHRoaXMuYXRsYXNJZEJ1ZmZlci5nZXRWaWV3KGluc3RhbmNlKTtcbiAgICAgICAgICAgICAgYXRsYXNJZFZpZXdbMF0gPSBhdGxhc0luZGV4O1xuXG4gICAgICAgICAgICAgIC8vIHdlIGhhdmUgdHdvIHNldHMgb2YgdGV4dHVyZSBjb29yZGluYXRlcyBhbmQgdHJhbnNmb3JtcyBiZWNhdXNlIHRleHR1cmVzIGNhbiB3cmFwIGluIHRoZSBhdGxhc1xuICAgICAgICAgICAgICB2YXIgdGV4VmlldyA9IHRoaXMudGV4QnVmZmVyLmdldFZpZXcoaW5zdGFuY2UpO1xuICAgICAgICAgICAgICB0ZXhWaWV3WzBdID0gdGV4Lng7XG4gICAgICAgICAgICAgIHRleFZpZXdbMV0gPSB0ZXgueTtcbiAgICAgICAgICAgICAgdGV4Vmlld1syXSA9IHRleC53O1xuICAgICAgICAgICAgICB0ZXhWaWV3WzNdID0gdGV4Lmg7XG4gICAgICAgICAgICAgIHZhciBtYXRyaXhWaWV3ID0gdGhpcy50cmFuc2Zvcm1CdWZmZXIuZ2V0TWF0cml4VmlldyhpbnN0YW5jZSk7XG4gICAgICAgICAgICAgIHRoaXMuc2V0VHJhbnNmb3JtTWF0cml4KGVsZSwgbWF0cml4Vmlldywgb3B0cywgYXRsYXNJbmZvLCBmaXJzdCk7XG4gICAgICAgICAgICAgIHRoaXMuaW5zdGFuY2VDb3VudCsrO1xuICAgICAgICAgICAgICBpZiAoIWZpcnN0KSB0aGlzLndyYXBwZWRDb3VudCsrO1xuICAgICAgICAgICAgICBpZiAodGhpcy5pbnN0YW5jZUNvdW50ID49IHRoaXMubWF4SW5zdGFuY2VzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbmRCYXRjaCgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgX2l0ZXJhdG9yLmUoZXJyKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIF9pdGVyYXRvci5mKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogbWF0cml4IGlzIGV4cGVjdGVkIHRvIGJlIGEgOSBlbGVtZW50IGFycmF5XG4gICAgICogdGhpcyBmdW5jdGlvbiBmb2xsb3dzIHNhbWUgcGF0dGVybiBhcyBDUnAuZHJhd0NhY2hlZEVsZW1lbnRQb3J0aW9uKC4uLilcbiAgICAgKi9cbiAgfSwge1xuICAgIGtleTogXCJzZXRUcmFuc2Zvcm1NYXRyaXhcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0VHJhbnNmb3JtTWF0cml4KGVsZSwgbWF0cml4LCBvcHRzLCBhdGxhc0luZm8pIHtcbiAgICAgIHZhciBmaXJzdCA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ICYmIGFyZ3VtZW50c1s0XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzRdIDogdHJ1ZTtcbiAgICAgIHZhciBwYWRkaW5nID0gMDtcbiAgICAgIGlmIChvcHRzLnNoYXBlUHJvcHMgJiYgb3B0cy5zaGFwZVByb3BzLnBhZGRpbmcpIHtcbiAgICAgICAgcGFkZGluZyA9IGVsZS5wc3R5bGUob3B0cy5zaGFwZVByb3BzLnBhZGRpbmcpLnBmVmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAoYXRsYXNJbmZvKSB7XG4gICAgICAgIC8vIHdlJ3ZlIGFscmVhZHkgY29tcHV0ZWQgdGhlIGJiIGFuZCB0ZXggYm91bmRzIGZvciBhIHRleHR1cmVcbiAgICAgICAgdmFyIGJiID0gYXRsYXNJbmZvLmJiLFxuICAgICAgICAgIHRleDEgPSBhdGxhc0luZm8udGV4MSxcbiAgICAgICAgICB0ZXgyID0gYXRsYXNJbmZvLnRleDI7XG4gICAgICAgIC8vIHdyYXBwZWQgdGV4dHVyZXMgbmVlZCBzZXBhcmF0ZSBtYXRyaXggZm9yIGVhY2ggcGFydFxuICAgICAgICB2YXIgcmF0aW8gPSB0ZXgxLncgLyAodGV4MS53ICsgdGV4Mi53KTtcbiAgICAgICAgaWYgKCFmaXJzdCkge1xuICAgICAgICAgIC8vIGZpcnN0ID0gdHJ1ZSBtZWFucyBpdHMgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIHdyYXBwZWQgdGV4dHVyZVxuICAgICAgICAgIHJhdGlvID0gMSAtIHJhdGlvO1xuICAgICAgICB9XG4gICAgICAgIHZhciBhZGpCQiA9IHRoaXMuX2dldEFkanVzdGVkQkIoYmIsIHBhZGRpbmcsIGZpcnN0LCByYXRpbyk7XG4gICAgICAgIHRoaXMuX2FwcGx5VHJhbnNmb3JtTWF0cml4KG1hdHJpeCwgYWRqQkIsIG9wdHMsIGVsZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB3ZSBkb24ndCBoYXZlIGEgdGV4dHVyZSwgb3Igd2Ugd2FudCB0byBhdm9pZCBjcmVhdGluZyBhIHRleHR1cmUgZm9yIHNpbXBsZSBzaGFwZXNcbiAgICAgICAgdmFyIF9iYiA9IG9wdHMuZ2V0Qm91bmRpbmdCb3goZWxlKTtcbiAgICAgICAgdmFyIF9hZGpCQiA9IHRoaXMuX2dldEFkanVzdGVkQkIoX2JiLCBwYWRkaW5nLCB0cnVlLCAxKTtcbiAgICAgICAgdGhpcy5fYXBwbHlUcmFuc2Zvcm1NYXRyaXgobWF0cml4LCBfYWRqQkIsIG9wdHMsIGVsZSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9hcHBseVRyYW5zZm9ybU1hdHJpeFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfYXBwbHlUcmFuc2Zvcm1NYXRyaXgobWF0cml4LCBhZGpCQiwgb3B0cywgZWxlKSB7XG4gICAgICB2YXIgeCwgeTtcbiAgICAgIGlkZW50aXR5KG1hdHJpeCk7XG4gICAgICB2YXIgdGhldGEgPSBvcHRzLmdldFJvdGF0aW9uID8gb3B0cy5nZXRSb3RhdGlvbihlbGUpIDogMDtcbiAgICAgIGlmICh0aGV0YSAhPT0gMCkge1xuICAgICAgICB2YXIgX29wdHMkZ2V0Um90YXRpb25Qb2luID0gb3B0cy5nZXRSb3RhdGlvblBvaW50KGVsZSksXG4gICAgICAgICAgc3ggPSBfb3B0cyRnZXRSb3RhdGlvblBvaW4ueCxcbiAgICAgICAgICBzeSA9IF9vcHRzJGdldFJvdGF0aW9uUG9pbi55O1xuICAgICAgICB0cmFuc2xhdGUobWF0cml4LCBtYXRyaXgsIFtzeCwgc3ldKTtcbiAgICAgICAgcm90YXRlKG1hdHJpeCwgbWF0cml4LCB0aGV0YSk7XG4gICAgICAgIHZhciBvZmZzZXQgPSBvcHRzLmdldFJvdGF0aW9uT2Zmc2V0KGVsZSk7XG4gICAgICAgIHggPSBvZmZzZXQueCArIChhZGpCQi54T2Zmc2V0IHx8IDApO1xuICAgICAgICB5ID0gb2Zmc2V0LnkgKyAoYWRqQkIueU9mZnNldCB8fCAwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHggPSBhZGpCQi54MTtcbiAgICAgICAgeSA9IGFkakJCLnkxO1xuICAgICAgfVxuICAgICAgdHJhbnNsYXRlKG1hdHJpeCwgbWF0cml4LCBbeCwgeV0pO1xuICAgICAgc2NhbGUobWF0cml4LCBtYXRyaXgsIFthZGpCQi53LCBhZGpCQi5oXSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRqdXN0cyBhIG5vZGUgb3IgbGFiZWwgQkIgdG8gYWNjb21vZGF0ZSBwYWRkaW5nIGFuZCBzcGxpdCBmb3Igd3JhcHBlZCB0ZXh0dXJlcy5cbiAgICAgKiBAcGFyYW0gYmIgLSB0aGUgb3JpZ2luYWwgYm91bmRpbmcgYm94XG4gICAgICogQHBhcmFtIHBhZGRpbmcgLSB0aGUgcGFkZGluZyB0byBhZGQgdG8gdGhlIGJvdW5kaW5nIGJveFxuICAgICAqIEBwYXJhbSBmaXJzdCAtIHdoZXRoZXIgdGhpcyBpcyB0aGUgZmlyc3QgcGFydCBvZiBhIHdyYXBwZWQgdGV4dHVyZVxuICAgICAqIEBwYXJhbSByYXRpbyAtIHRoZSByYXRpbyBvZiB0aGUgdGV4dHVyZSB3aWR0aCBvZiBwYXJ0IG9mIHRoZSB0ZXh0IHRvIHRoZSBlbnRpcmUgdGV4dHVyZVxuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiBcIl9nZXRBZGp1c3RlZEJCXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9nZXRBZGp1c3RlZEJCKGJiLCBwYWRkaW5nLCBmaXJzdCwgcmF0aW8pIHtcbiAgICAgIHZhciB4MSA9IGJiLngxLFxuICAgICAgICB5MSA9IGJiLnkxLFxuICAgICAgICB3ID0gYmIudyxcbiAgICAgICAgaCA9IGJiLmgsXG4gICAgICAgIHlPZmZzZXQgPSBiYi55T2Zmc2V0O1xuICAgICAgaWYgKHBhZGRpbmcpIHtcbiAgICAgICAgeDEgLT0gcGFkZGluZztcbiAgICAgICAgeTEgLT0gcGFkZGluZztcbiAgICAgICAgdyArPSAyICogcGFkZGluZztcbiAgICAgICAgaCArPSAyICogcGFkZGluZztcbiAgICAgIH1cbiAgICAgIHZhciB4T2Zmc2V0ID0gMDtcbiAgICAgIHZhciBhZGpXID0gdyAqIHJhdGlvO1xuICAgICAgaWYgKGZpcnN0ICYmIHJhdGlvIDwgMSkge1xuICAgICAgICB3ID0gYWRqVztcbiAgICAgIH0gZWxzZSBpZiAoIWZpcnN0ICYmIHJhdGlvIDwgMSkge1xuICAgICAgICB4T2Zmc2V0ID0gdyAtIGFkalc7XG4gICAgICAgIHgxICs9IHhPZmZzZXQ7XG4gICAgICAgIHcgPSBhZGpXO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDE6IHgxLFxuICAgICAgICB5MTogeTEsXG4gICAgICAgIHc6IHcsXG4gICAgICAgIGg6IGgsXG4gICAgICAgIHhPZmZzZXQ6IHhPZmZzZXQsXG4gICAgICAgIHlPZmZzZXQ6IHlPZmZzZXRcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHJhdyBhIHNvbGlkIG9wYXF1ZSByZWN0YW5nbGUgbWF0Y2hpbmcgdGhlIGVsZW1lbnQncyBCb3VuZGluZyBCb3guXG4gICAgICogVXNlZCBieSB0aGUgUElDS0lORyBtb2RlIHRvIG1ha2UgdGhlIGVudGlyZSBCQiBvZiBhIGxhYmVsIGNsaWNrYWJsZS5cbiAgICAgKi9cbiAgfSwge1xuICAgIGtleTogXCJkcmF3UGlja2luZ1JlY3RhbmdsZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkcmF3UGlja2luZ1JlY3RhbmdsZShlbGUsIGVsZUluZGV4LCB0eXBlKSB7XG4gICAgICB2YXIgb3B0cyA9IHRoaXMuYXRsYXNNYW5hZ2VyLmdldFJlbmRlclR5cGVPcHRzKHR5cGUpO1xuICAgICAgdmFyIGluc3RhbmNlID0gdGhpcy5pbnN0YW5jZUNvdW50O1xuICAgICAgdGhpcy52ZXJ0VHlwZUJ1ZmZlci5nZXRWaWV3KGluc3RhbmNlKVswXSA9IFJFQ1RBTkdMRTtcbiAgICAgIHZhciBpbmRleFZpZXcgPSB0aGlzLmluZGV4QnVmZmVyLmdldFZpZXcoaW5zdGFuY2UpO1xuICAgICAgaW5kZXhUb1ZlYzQoZWxlSW5kZXgsIGluZGV4Vmlldyk7XG4gICAgICB2YXIgY29sb3JWaWV3ID0gdGhpcy5jb2xvckJ1ZmZlci5nZXRWaWV3KGluc3RhbmNlKTtcbiAgICAgIHRvV2ViR0xDb2xvcihbMCwgMCwgMF0sIDEsIGNvbG9yVmlldyk7IC8vIG9wYXF1ZSwgc28gZW50aXJlIGxhYmVsIEJCIGlzIGNsaWNrYWJsZVxuXG4gICAgICB2YXIgbWF0cml4VmlldyA9IHRoaXMudHJhbnNmb3JtQnVmZmVyLmdldE1hdHJpeFZpZXcoaW5zdGFuY2UpO1xuICAgICAgdGhpcy5zZXRUcmFuc2Zvcm1NYXRyaXgoZWxlLCBtYXRyaXhWaWV3LCBvcHRzKTtcbiAgICAgIHRoaXMuc2ltcGxlQ291bnQrKztcbiAgICAgIHRoaXMuaW5zdGFuY2VDb3VudCsrO1xuICAgICAgaWYgKHRoaXMuaW5zdGFuY2VDb3VudCA+PSB0aGlzLm1heEluc3RhbmNlcykge1xuICAgICAgICB0aGlzLmVuZEJhdGNoKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHJhdyBhIG5vZGUgdXNpbmcgZWl0aGVyIGEgdGV4dHVyZSBvciBhIFwic2ltcGxlIHNoYXBlXCIuXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6IFwiZHJhd05vZGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZHJhd05vZGUobm9kZSwgZWxlSW5kZXgsIHR5cGUpIHtcbiAgICAgIHZhciBvcHRzID0gdGhpcy5zaW1wbGVTaGFwZU9wdGlvbnMuZ2V0KHR5cGUpO1xuICAgICAgaWYgKCF0aGlzLl9pc1Zpc2libGUobm9kZSwgb3B0cykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIHByb3BzID0gb3B0cy5zaGFwZVByb3BzO1xuXG4gICAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIHRvIHVzZSBhIHRleHR1cmVcbiAgICAgIHZhciB2ZXJ0VHlwZSA9IHRoaXMuX2dldFZlcnRUeXBlRm9yU2hhcGUobm9kZSwgcHJvcHMuc2hhcGUpO1xuICAgICAgaWYgKHZlcnRUeXBlID09PSB1bmRlZmluZWQgfHwgb3B0cy5pc1NpbXBsZSAmJiAhb3B0cy5pc1NpbXBsZShub2RlLCB0aGlzLnJlbmRlclRhcmdldCkpIHtcbiAgICAgICAgdGhpcy5kcmF3VGV4dHVyZShub2RlLCBlbGVJbmRleCwgdHlwZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gUmVuZGVyIGEgXCJzaW1wbGUgc2hhcGVcIiB1c2luZyBTREYgKHNpZ25lZCBkaXN0YW5jZSBmaWVsZHMpXG4gICAgICB2YXIgaW5zdGFuY2UgPSB0aGlzLmluc3RhbmNlQ291bnQ7XG4gICAgICB0aGlzLnZlcnRUeXBlQnVmZmVyLmdldFZpZXcoaW5zdGFuY2UpWzBdID0gdmVydFR5cGU7XG4gICAgICBpZiAodmVydFR5cGUgPT09IFJPVU5EX1JFQ1RBTkdMRSB8fCB2ZXJ0VHlwZSA9PT0gQk9UVE9NX1JPVU5EX1JFQ1RBTkdMRSkge1xuICAgICAgICAvLyBnZXQgY29ybmVyIHJhZGl1c1xuICAgICAgICB2YXIgYmIgPSBvcHRzLmdldEJvdW5kaW5nQm94KG5vZGUpO1xuICAgICAgICB2YXIgcmFkaXVzID0gdGhpcy5fZ2V0Q29ybmVyUmFkaXVzKG5vZGUsIHByb3BzLnJhZGl1cywgYmIpO1xuICAgICAgICB2YXIgcmFkaXVzVmlldyA9IHRoaXMuY29ybmVyUmFkaXVzQnVmZmVyLmdldFZpZXcoaW5zdGFuY2UpO1xuICAgICAgICByYWRpdXNWaWV3WzBdID0gcmFkaXVzOyAvLyB0b3AtcmlnaHRcbiAgICAgICAgcmFkaXVzVmlld1sxXSA9IHJhZGl1czsgLy8gYm90dG9tLXJpZ2h0XG4gICAgICAgIHJhZGl1c1ZpZXdbMl0gPSByYWRpdXM7IC8vIHRvcC1sZWZ0XG4gICAgICAgIHJhZGl1c1ZpZXdbM10gPSByYWRpdXM7IC8vIGJvdHRvbS1sZWZ0XG4gICAgICAgIGlmICh2ZXJ0VHlwZSA9PT0gQk9UVE9NX1JPVU5EX1JFQ1RBTkdMRSkge1xuICAgICAgICAgIHJhZGl1c1ZpZXdbMF0gPSAwO1xuICAgICAgICAgIHJhZGl1c1ZpZXdbMl0gPSAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXhWaWV3ID0gdGhpcy5pbmRleEJ1ZmZlci5nZXRWaWV3KGluc3RhbmNlKTtcbiAgICAgIGluZGV4VG9WZWM0KGVsZUluZGV4LCBpbmRleFZpZXcpO1xuXG4gICAgICAvLyBOb2RlcyBzaG91bGQgc3RpbGwgYmUgY2xpY2thYmxlIGlmIHRoZXkgcGFzcyB0aGUgdmlzaWJpbGl0eSBjaGVjayBidXRcbiAgICAgIC8vIGhhdmUgYmFja2dyb3VuZC1vcGFjaXR5OiAwXG4gICAgICAvLyBBbHNvOiBldmVyeXRoaW5nIGJ1dCBub2RlLWJvZHkgaXMgZXhlbXB0IGZyb20gZWZmZWN0aXZlIG9wYWNpdHkgaW5oZXJpdGVuY2Uvc3RhY2tpbmdcbiAgICAgIHZhciBvcGFjaXR5ID0gdGhpcy5yZW5kZXJUYXJnZXQucGlja2luZyA/IDEgOiB0eXBlID09PSAnbm9kZS1ib2R5JyA/IG5vZGUuZWZmZWN0aXZlT3BhY2l0eSgpIDogMTtcbiAgICAgIHZhciBiZ09wYWNpdHkgPSB0aGlzLnJlbmRlclRhcmdldC5waWNraW5nID8gMSA6IG5vZGUucHN0eWxlKHByb3BzLm9wYWNpdHkpLnZhbHVlICogb3BhY2l0eTtcbiAgICAgIHZhciBjb2xvciA9IG5vZGUucHN0eWxlKHByb3BzLmNvbG9yKS52YWx1ZTtcbiAgICAgIHZhciBjb2xvclZpZXcgPSB0aGlzLmNvbG9yQnVmZmVyLmdldFZpZXcoaW5zdGFuY2UpO1xuICAgICAgdG9XZWJHTENvbG9yKGNvbG9yLCBiZ09wYWNpdHksIGNvbG9yVmlldyk7XG4gICAgICB2YXIgbGluZVdpZHRoVmlldyA9IHRoaXMubGluZVdpZHRoQnVmZmVyLmdldFZpZXcoaW5zdGFuY2UpOyAvLyByZXVzZSBlZGdlIGxpbmUgd2lkdGggYXR0cmlidXRlIGZvciBub2RlIGJvcmRlclxuICAgICAgbGluZVdpZHRoVmlld1swXSA9IDA7XG4gICAgICBsaW5lV2lkdGhWaWV3WzFdID0gMDtcbiAgICAgIGlmIChwcm9wcy5ib3JkZXIpIHtcbiAgICAgICAgdmFyIGJvcmRlcldpZHRoID0gbm9kZS5wc3R5bGUoJ2JvcmRlci13aWR0aCcpLnZhbHVlO1xuICAgICAgICBpZiAoYm9yZGVyV2lkdGggPiAwKSB7XG4gICAgICAgICAgdmFyIGJvcmRlckNvbG9yID0gbm9kZS5wc3R5bGUoJ2JvcmRlci1jb2xvcicpLnZhbHVlO1xuICAgICAgICAgIHZhciBib3JkZXJPcGFjaXR5ID0gb3BhY2l0eSAqIG5vZGUucHN0eWxlKCdib3JkZXItb3BhY2l0eScpLnZhbHVlO1xuICAgICAgICAgIHZhciBib3JkZXJDb2xvclZpZXcgPSB0aGlzLmJvcmRlckNvbG9yQnVmZmVyLmdldFZpZXcoaW5zdGFuY2UpO1xuICAgICAgICAgIHRvV2ViR0xDb2xvcihib3JkZXJDb2xvciwgYm9yZGVyT3BhY2l0eSwgYm9yZGVyQ29sb3JWaWV3KTtcblxuICAgICAgICAgIC8vIFNERiBkaXN0YW5jZSBpcyBuZWdhdGl2ZSBpbnNpZGUgdGhlIHNoYXBlIGFuZCBwb3NpdGl2ZSBvdXRzaWRlXG4gICAgICAgICAgdmFyIGJvcmRlclBvcyA9IG5vZGUucHN0eWxlKCdib3JkZXItcG9zaXRpb24nKS52YWx1ZTtcbiAgICAgICAgICBpZiAoYm9yZGVyUG9zID09PSAnaW5zaWRlJykge1xuICAgICAgICAgICAgbGluZVdpZHRoVmlld1swXSA9IDA7XG4gICAgICAgICAgICBsaW5lV2lkdGhWaWV3WzFdID0gLWJvcmRlcldpZHRoO1xuICAgICAgICAgIH0gZWxzZSBpZiAoYm9yZGVyUG9zID09PSAnb3V0c2lkZScpIHtcbiAgICAgICAgICAgIGxpbmVXaWR0aFZpZXdbMF0gPSBib3JkZXJXaWR0aDtcbiAgICAgICAgICAgIGxpbmVXaWR0aFZpZXdbMV0gPSAwO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyAnY2VudGVyJ1xuICAgICAgICAgICAgdmFyIGhhbGZXaWR0aCA9IGJvcmRlcldpZHRoIC8gMjtcbiAgICAgICAgICAgIGxpbmVXaWR0aFZpZXdbMF0gPSBoYWxmV2lkdGg7XG4gICAgICAgICAgICBsaW5lV2lkdGhWaWV3WzFdID0gLWhhbGZXaWR0aDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBtYXRyaXhWaWV3ID0gdGhpcy50cmFuc2Zvcm1CdWZmZXIuZ2V0TWF0cml4VmlldyhpbnN0YW5jZSk7XG4gICAgICB0aGlzLnNldFRyYW5zZm9ybU1hdHJpeChub2RlLCBtYXRyaXhWaWV3LCBvcHRzKTtcbiAgICAgIHRoaXMuc2ltcGxlQ291bnQrKztcbiAgICAgIHRoaXMuaW5zdGFuY2VDb3VudCsrO1xuICAgICAgaWYgKHRoaXMuaW5zdGFuY2VDb3VudCA+PSB0aGlzLm1heEluc3RhbmNlcykge1xuICAgICAgICB0aGlzLmVuZEJhdGNoKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9nZXRWZXJ0VHlwZUZvclNoYXBlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9nZXRWZXJ0VHlwZUZvclNoYXBlKG5vZGUsIHNoYXBlUHJvcCkge1xuICAgICAgdmFyIHNoYXBlID0gbm9kZS5wc3R5bGUoc2hhcGVQcm9wKS52YWx1ZTtcbiAgICAgIHN3aXRjaCAoc2hhcGUpIHtcbiAgICAgICAgY2FzZSAncmVjdGFuZ2xlJzpcbiAgICAgICAgICByZXR1cm4gUkVDVEFOR0xFO1xuICAgICAgICBjYXNlICdlbGxpcHNlJzpcbiAgICAgICAgICByZXR1cm4gRUxMSVBTRTtcbiAgICAgICAgY2FzZSAncm91bmRyZWN0YW5nbGUnOlxuICAgICAgICBjYXNlICdyb3VuZC1yZWN0YW5nbGUnOlxuICAgICAgICAgIHJldHVybiBST1VORF9SRUNUQU5HTEU7XG4gICAgICAgIGNhc2UgJ2JvdHRvbS1yb3VuZC1yZWN0YW5nbGUnOlxuICAgICAgICAgIHJldHVybiBCT1RUT01fUk9VTkRfUkVDVEFOR0xFO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9nZXRDb3JuZXJSYWRpdXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2dldENvcm5lclJhZGl1cyhub2RlLCByYWRpdXNQcm9wLCBfcmVmMikge1xuICAgICAgdmFyIHcgPSBfcmVmMi53LFxuICAgICAgICBoID0gX3JlZjIuaDtcbiAgICAgIC8vIHNlZSBDUnAuZHJhd1JvdW5kUmVjdGFuZ2xlUGF0aFxuICAgICAgaWYgKG5vZGUucHN0eWxlKHJhZGl1c1Byb3ApLnZhbHVlID09PSAnYXV0bycpIHtcbiAgICAgICAgcmV0dXJuIGdldFJvdW5kUmVjdGFuZ2xlUmFkaXVzKHcsIGgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHJhZGl1cyA9IG5vZGUucHN0eWxlKHJhZGl1c1Byb3ApLnBmVmFsdWU7XG4gICAgICAgIHZhciBoYWxmV2lkdGggPSB3IC8gMjtcbiAgICAgICAgdmFyIGhhbGZIZWlnaHQgPSBoIC8gMjtcbiAgICAgICAgcmV0dXJuIE1hdGgubWluKHJhZGl1cywgaGFsZkhlaWdodCwgaGFsZldpZHRoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPbmx5IHN1cHBvcnRzIGRyYXdpbmcgdHJpYW5nbGVzIGF0IHRoZSBtb21lbnQuXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6IFwiZHJhd0VkZ2VBcnJvd1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkcmF3RWRnZUFycm93KGVkZ2UsIGVsZUluZGV4LCBwcmVmaXgpIHtcbiAgICAgIGlmICghZWRnZS52aXNpYmxlKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gRWRnZSBwb2ludHMgYW5kIGFycm93IGFuZ2xlcyBldGMgYXJlIGNhbGN1bGF0ZWQgYnkgdGhlIGJhc2UgcmVuZGVyZXIgYW5kIGNhY2hlZCBpbiB0aGUgcnNjcmF0Y2ggb2JqZWN0LlxuICAgICAgdmFyIHJzID0gZWRnZS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgICAgIHZhciB4LCB5LCBhbmdsZTtcbiAgICAgIGlmIChwcmVmaXggPT09ICdzb3VyY2UnKSB7XG4gICAgICAgIHggPSBycy5hcnJvd1N0YXJ0WDtcbiAgICAgICAgeSA9IHJzLmFycm93U3RhcnRZO1xuICAgICAgICBhbmdsZSA9IHJzLnNyY0Fycm93QW5nbGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB4ID0gcnMuYXJyb3dFbmRYO1xuICAgICAgICB5ID0gcnMuYXJyb3dFbmRZO1xuICAgICAgICBhbmdsZSA9IHJzLnRndEFycm93QW5nbGU7XG4gICAgICB9XG5cbiAgICAgIC8vIHRha2VuIGZyb20gQ1JwLmRyYXdBcnJvd2hlYWRcbiAgICAgIGlmIChpc05hTih4KSB8fCB4ID09IG51bGwgfHwgaXNOYU4oeSkgfHwgeSA9PSBudWxsIHx8IGlzTmFOKGFuZ2xlKSB8fCBhbmdsZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gY2hlY2sgc2hhcGUgYWZ0ZXIgdGhlIHgveSBjaGVjayBiZWNhdXNlIHBzdHlsZSgpIGlzIGEgYml0IHNsb3dcbiAgICAgIHZhciBhcnJvd1NoYXBlID0gZWRnZS5wc3R5bGUocHJlZml4ICsgJy1hcnJvdy1zaGFwZScpLnZhbHVlO1xuICAgICAgaWYgKGFycm93U2hhcGUgPT09ICdub25lJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgY29sb3IgPSBlZGdlLnBzdHlsZShwcmVmaXggKyAnLWFycm93LWNvbG9yJykudmFsdWU7XG4gICAgICB2YXIgYmFzZU9wYWNpdHkgPSBlZGdlLnBzdHlsZSgnb3BhY2l0eScpLnZhbHVlO1xuICAgICAgdmFyIGxpbmVPcGFjaXR5ID0gZWRnZS5wc3R5bGUoJ2xpbmUtb3BhY2l0eScpLnZhbHVlO1xuICAgICAgdmFyIG9wYWNpdHkgPSBiYXNlT3BhY2l0eSAqIGxpbmVPcGFjaXR5O1xuICAgICAgdmFyIGxpbmVXaWR0aCA9IGVkZ2UucHN0eWxlKCd3aWR0aCcpLnBmVmFsdWU7XG4gICAgICB2YXIgc2NhbGUkMSA9IGVkZ2UucHN0eWxlKCdhcnJvdy1zY2FsZScpLnZhbHVlO1xuICAgICAgdmFyIHNpemUgPSB0aGlzLnIuZ2V0QXJyb3dXaWR0aChsaW5lV2lkdGgsIHNjYWxlJDEpO1xuICAgICAgdmFyIGluc3RhbmNlID0gdGhpcy5pbnN0YW5jZUNvdW50O1xuICAgICAgdmFyIHRyYW5zZm9ybSA9IHRoaXMudHJhbnNmb3JtQnVmZmVyLmdldE1hdHJpeFZpZXcoaW5zdGFuY2UpO1xuICAgICAgaWRlbnRpdHkodHJhbnNmb3JtKTtcbiAgICAgIHRyYW5zbGF0ZSh0cmFuc2Zvcm0sIHRyYW5zZm9ybSwgW3gsIHldKTtcbiAgICAgIHNjYWxlKHRyYW5zZm9ybSwgdHJhbnNmb3JtLCBbc2l6ZSwgc2l6ZV0pO1xuICAgICAgcm90YXRlKHRyYW5zZm9ybSwgdHJhbnNmb3JtLCBhbmdsZSk7XG4gICAgICB0aGlzLnZlcnRUeXBlQnVmZmVyLmdldFZpZXcoaW5zdGFuY2UpWzBdID0gRURHRV9BUlJPVztcbiAgICAgIHZhciBpbmRleFZpZXcgPSB0aGlzLmluZGV4QnVmZmVyLmdldFZpZXcoaW5zdGFuY2UpO1xuICAgICAgaW5kZXhUb1ZlYzQoZWxlSW5kZXgsIGluZGV4Vmlldyk7XG4gICAgICB2YXIgY29sb3JWaWV3ID0gdGhpcy5jb2xvckJ1ZmZlci5nZXRWaWV3KGluc3RhbmNlKTtcbiAgICAgIHRvV2ViR0xDb2xvcihjb2xvciwgb3BhY2l0eSwgY29sb3JWaWV3KTtcbiAgICAgIHRoaXMuaW5zdGFuY2VDb3VudCsrO1xuICAgICAgaWYgKHRoaXMuaW5zdGFuY2VDb3VudCA+PSB0aGlzLm1heEluc3RhbmNlcykge1xuICAgICAgICB0aGlzLmVuZEJhdGNoKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHJhdyBzdHJhaWdodC1saW5lIG9yIGJlemllciBjdXJ2ZSBlZGdlcy5cbiAgICAgKi9cbiAgfSwge1xuICAgIGtleTogXCJkcmF3RWRnZUxpbmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZHJhd0VkZ2VMaW5lKGVkZ2UsIGVsZUluZGV4KSB7XG4gICAgICBpZiAoIWVkZ2UudmlzaWJsZSgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciBwb2ludHMgPSB0aGlzLl9nZXRFZGdlUG9pbnRzKGVkZ2UpO1xuICAgICAgaWYgKCFwb2ludHMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBsaW5lIHN0eWxlXG4gICAgICB2YXIgYmFzZU9wYWNpdHkgPSBlZGdlLnBzdHlsZSgnb3BhY2l0eScpLnZhbHVlO1xuICAgICAgdmFyIGxpbmVPcGFjaXR5ID0gZWRnZS5wc3R5bGUoJ2xpbmUtb3BhY2l0eScpLnZhbHVlO1xuICAgICAgdmFyIHdpZHRoID0gZWRnZS5wc3R5bGUoJ3dpZHRoJykucGZWYWx1ZTtcbiAgICAgIHZhciBjb2xvciA9IGVkZ2UucHN0eWxlKCdsaW5lLWNvbG9yJykudmFsdWU7XG4gICAgICB2YXIgb3BhY2l0eSA9IGJhc2VPcGFjaXR5ICogbGluZU9wYWNpdHk7XG4gICAgICBpZiAocG9pbnRzLmxlbmd0aCAvIDIgKyB0aGlzLmluc3RhbmNlQ291bnQgPiB0aGlzLm1heEluc3RhbmNlcykge1xuICAgICAgICB0aGlzLmVuZEJhdGNoKCk7XG4gICAgICB9XG4gICAgICBpZiAocG9pbnRzLmxlbmd0aCA9PSA0KSB7XG4gICAgICAgIC8vIHN0cmFpZ2h0IGxpbmVcbiAgICAgICAgdmFyIGluc3RhbmNlID0gdGhpcy5pbnN0YW5jZUNvdW50O1xuICAgICAgICB0aGlzLnZlcnRUeXBlQnVmZmVyLmdldFZpZXcoaW5zdGFuY2UpWzBdID0gRURHRV9TVFJBSUdIVDtcbiAgICAgICAgdmFyIGluZGV4VmlldyA9IHRoaXMuaW5kZXhCdWZmZXIuZ2V0VmlldyhpbnN0YW5jZSk7XG4gICAgICAgIGluZGV4VG9WZWM0KGVsZUluZGV4LCBpbmRleFZpZXcpO1xuICAgICAgICB2YXIgY29sb3JWaWV3ID0gdGhpcy5jb2xvckJ1ZmZlci5nZXRWaWV3KGluc3RhbmNlKTtcbiAgICAgICAgdG9XZWJHTENvbG9yKGNvbG9yLCBvcGFjaXR5LCBjb2xvclZpZXcpO1xuICAgICAgICB2YXIgbGluZVdpZHRoQnVmZmVyID0gdGhpcy5saW5lV2lkdGhCdWZmZXIuZ2V0VmlldyhpbnN0YW5jZSk7XG4gICAgICAgIGxpbmVXaWR0aEJ1ZmZlclswXSA9IHdpZHRoO1xuICAgICAgICB2YXIgc291cmNlVGFyZ2V0VmlldyA9IHRoaXMucG9pbnRBUG9pbnRCQnVmZmVyLmdldFZpZXcoaW5zdGFuY2UpO1xuICAgICAgICBzb3VyY2VUYXJnZXRWaWV3WzBdID0gcG9pbnRzWzBdOyAvLyBzb3VyY2UgeFxuICAgICAgICBzb3VyY2VUYXJnZXRWaWV3WzFdID0gcG9pbnRzWzFdOyAvLyBzb3VyY2UgeVxuICAgICAgICBzb3VyY2VUYXJnZXRWaWV3WzJdID0gcG9pbnRzWzJdOyAvLyB0YXJnZXQgeFxuICAgICAgICBzb3VyY2VUYXJnZXRWaWV3WzNdID0gcG9pbnRzWzNdOyAvLyB0YXJnZXQgeVxuXG4gICAgICAgIHRoaXMuaW5zdGFuY2VDb3VudCsrO1xuICAgICAgICBpZiAodGhpcy5pbnN0YW5jZUNvdW50ID49IHRoaXMubWF4SW5zdGFuY2VzKSB7XG4gICAgICAgICAgdGhpcy5lbmRCYXRjaCgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBjdXJ2ZWQgbGluZVxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGggLSAyOyBpICs9IDIpIHtcbiAgICAgICAgICB2YXIgX2luc3RhbmNlID0gdGhpcy5pbnN0YW5jZUNvdW50O1xuICAgICAgICAgIHRoaXMudmVydFR5cGVCdWZmZXIuZ2V0VmlldyhfaW5zdGFuY2UpWzBdID0gRURHRV9DVVJWRV9TRUdNRU5UO1xuICAgICAgICAgIHZhciBfaW5kZXhWaWV3ID0gdGhpcy5pbmRleEJ1ZmZlci5nZXRWaWV3KF9pbnN0YW5jZSk7XG4gICAgICAgICAgaW5kZXhUb1ZlYzQoZWxlSW5kZXgsIF9pbmRleFZpZXcpO1xuICAgICAgICAgIHZhciBfY29sb3JWaWV3ID0gdGhpcy5jb2xvckJ1ZmZlci5nZXRWaWV3KF9pbnN0YW5jZSk7XG4gICAgICAgICAgdG9XZWJHTENvbG9yKGNvbG9yLCBvcGFjaXR5LCBfY29sb3JWaWV3KTtcbiAgICAgICAgICB2YXIgX2xpbmVXaWR0aEJ1ZmZlciA9IHRoaXMubGluZVdpZHRoQnVmZmVyLmdldFZpZXcoX2luc3RhbmNlKTtcbiAgICAgICAgICBfbGluZVdpZHRoQnVmZmVyWzBdID0gd2lkdGg7XG4gICAgICAgICAgdmFyIHBBeCA9IHBvaW50c1tpIC0gMl0sXG4gICAgICAgICAgICBwQXkgPSBwb2ludHNbaSAtIDFdO1xuICAgICAgICAgIHZhciBwQnggPSBwb2ludHNbaV0sXG4gICAgICAgICAgICBwQnkgPSBwb2ludHNbaSArIDFdO1xuICAgICAgICAgIHZhciBwQ3ggPSBwb2ludHNbaSArIDJdLFxuICAgICAgICAgICAgcEN5ID0gcG9pbnRzW2kgKyAzXTtcbiAgICAgICAgICB2YXIgcER4ID0gcG9pbnRzW2kgKyA0XSxcbiAgICAgICAgICAgIHBEeSA9IHBvaW50c1tpICsgNV07XG5cbiAgICAgICAgICAvLyBtYWtlIHBoYW50b20gcG9pbnRzIGZvciB0aGUgZmlyc3QgYW5kIGxhc3Qgc2VnbWVudHNcbiAgICAgICAgICAvLyBUT0RPIGFkZGluZyAwLjAwMSB0byBhdm9pZCBkaXZpc2lvbiBieSB6ZXJvIGluIHRoZSBzaGFkZXIgKEkgdGhpbmspLCBuZWVkIGEgYmV0dGVyIHNvbHV0aW9uXG4gICAgICAgICAgaWYgKGkgPT0gMCkge1xuICAgICAgICAgICAgcEF4ID0gMiAqIHBCeCAtIHBDeCArIDAuMDAxO1xuICAgICAgICAgICAgcEF5ID0gMiAqIHBCeSAtIHBDeSArIDAuMDAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaSA9PSBwb2ludHMubGVuZ3RoIC0gNCkge1xuICAgICAgICAgICAgcER4ID0gMiAqIHBDeCAtIHBCeCArIDAuMDAxO1xuICAgICAgICAgICAgcER5ID0gMiAqIHBDeSAtIHBCeSArIDAuMDAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgcG9pbnRBQlZpZXcgPSB0aGlzLnBvaW50QVBvaW50QkJ1ZmZlci5nZXRWaWV3KF9pbnN0YW5jZSk7XG4gICAgICAgICAgcG9pbnRBQlZpZXdbMF0gPSBwQXg7XG4gICAgICAgICAgcG9pbnRBQlZpZXdbMV0gPSBwQXk7XG4gICAgICAgICAgcG9pbnRBQlZpZXdbMl0gPSBwQng7XG4gICAgICAgICAgcG9pbnRBQlZpZXdbM10gPSBwQnk7XG4gICAgICAgICAgdmFyIHBvaW50Q0RWaWV3ID0gdGhpcy5wb2ludENQb2ludERCdWZmZXIuZ2V0VmlldyhfaW5zdGFuY2UpO1xuICAgICAgICAgIHBvaW50Q0RWaWV3WzBdID0gcEN4O1xuICAgICAgICAgIHBvaW50Q0RWaWV3WzFdID0gcEN5O1xuICAgICAgICAgIHBvaW50Q0RWaWV3WzJdID0gcER4O1xuICAgICAgICAgIHBvaW50Q0RWaWV3WzNdID0gcER5O1xuICAgICAgICAgIHRoaXMuaW5zdGFuY2VDb3VudCsrO1xuICAgICAgICAgIGlmICh0aGlzLmluc3RhbmNlQ291bnQgPj0gdGhpcy5tYXhJbnN0YW5jZXMpIHtcbiAgICAgICAgICAgIHRoaXMuZW5kQmF0Y2goKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX2lzVmFsaWRFZGdlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9pc1ZhbGlkRWRnZShlZGdlKSB7XG4gICAgICB2YXIgcnMgPSBlZGdlLl9wcml2YXRlLnJzY3JhdGNoO1xuICAgICAgaWYgKHJzLmJhZExpbmUgfHwgcnMuYWxscHRzID09IG51bGwgfHwgaXNOYU4ocnMuYWxscHRzWzBdKSkge1xuICAgICAgICAvLyBpc05hTiBpbiBjYXNlIGVkZ2UgaXMgaW1wb3NzaWJsZSBhbmQgYnJvd3NlciBidWdzIChlLmcuIHNhZmFyaSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9nZXRFZGdlUG9pbnRzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9nZXRFZGdlUG9pbnRzKGVkZ2UpIHtcbiAgICAgIHZhciBycyA9IGVkZ2UuX3ByaXZhdGUucnNjcmF0Y2g7XG5cbiAgICAgIC8vIGlmIGJlemllciBjdHJsIHB0cyBjYW4gbm90IGJlIGNhbGN1bGF0ZWQsIHRoZW4gZGllXG4gICAgICBpZiAoIXRoaXMuX2lzVmFsaWRFZGdlKGVkZ2UpKSB7XG4gICAgICAgIC8vIGlzTmFOIGluIGNhc2UgZWRnZSBpcyBpbXBvc3NpYmxlIGFuZCBicm93c2VyIGJ1Z3MgKGUuZy4gc2FmYXJpKVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgY29udHJvbFBvaW50cyA9IHJzLmFsbHB0cztcbiAgICAgIGlmIChjb250cm9sUG9pbnRzLmxlbmd0aCA9PSA0KSB7XG4gICAgICAgIHJldHVybiBjb250cm9sUG9pbnRzO1xuICAgICAgfVxuICAgICAgdmFyIG51bVNlZ21lbnRzID0gdGhpcy5fZ2V0TnVtU2VnbWVudHMoZWRnZSk7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0Q3VydmVTZWdtZW50UG9pbnRzKGNvbnRyb2xQb2ludHMsIG51bVNlZ21lbnRzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX2dldE51bVNlZ21lbnRzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9nZXROdW1TZWdtZW50cyhlZGdlKSB7XG4gICAgICAvLyBUT0RPIE5lZWQgYSBoZXVyaXN0aWMgdGhhdCBkZWNpZGVzIGhvdyBtYW55IHNlZ21lbnRzIHRvIHVzZS4gRmFjdG9ycyB0byBjb25zaWRlcjpcbiAgICAgIC8vIC0gZWRnZSB3aWR0aC9sZW5ndGhcbiAgICAgIC8vIC0gZWRnZSBjdXJ2YXR1cmUgKHRoZSBtb3JlIHRoZSBjdXJ2YXR1cmUsIHRoZSBtb3JlIHNlZ21lbnRzKVxuICAgICAgLy8gLSB6b29tIGxldmVsIChtb3JlIHNlZ21lbnRzIHdoZW4gem9vbWVkIGluKVxuICAgICAgLy8gLSBudW1iZXIgb2YgdmlzaWJsZSBlZGdlcyAobW9yZSBzZWdtZW50cyB3aGVuIHRoZXJlIGFyZSBmZXdlciBlZGdlcylcbiAgICAgIC8vIC0gcGVyZm9ybWFuY2UgKGZld2VyIHNlZ21lbnRzIHdoZW4gcGVyZm9ybWFuY2UgaXMgYSBjb25jZXJuKVxuICAgICAgLy8gLSB1c2VyIGNvbmZpZ3VyYWJsZSBvcHRpb24ocylcbiAgICAgIC8vIG5vdGU6IG51bWJlciBvZiBzZWdtZW50cyBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgbWF4IG51bWJlciBvZiBpbnN0YW5jZXNcbiAgICAgIC8vIG5vdGU6IHNlZ21lbnRzIGRvbid0IG5lZWQgdG8gYmUgZXZlbmx5IHNwYWNlZCBvdXQsIGl0IG1pZ2h0IG1ha2Ugc2Vuc2UgdG8gaGF2ZSBzaG9ydGVyIHNlZ21lbnRzIG5lYXJlciB0byB0aGUgY29udHJvbCBwb2ludHNcbiAgICAgIHZhciBudW1TZWdtZW50cyA9IDE1O1xuICAgICAgcmV0dXJuIE1hdGgubWluKE1hdGgubWF4KG51bVNlZ21lbnRzLCA1KSwgdGhpcy5tYXhJbnN0YW5jZXMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfZ2V0Q3VydmVTZWdtZW50UG9pbnRzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9nZXRDdXJ2ZVNlZ21lbnRQb2ludHMoY29udHJvbFBvaW50cywgc2VnbWVudHMpIHtcbiAgICAgIGlmIChjb250cm9sUG9pbnRzLmxlbmd0aCA9PSA0KSB7XG4gICAgICAgIHJldHVybiBjb250cm9sUG9pbnRzOyAvLyBzdHJhaWdodCBsaW5lXG4gICAgICB9XG4gICAgICB2YXIgY3VydmVQb2ludHMgPSBBcnJheSgoc2VnbWVudHMgKyAxKSAqIDIpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gc2VnbWVudHM7IGkrKykge1xuICAgICAgICAvLyB0aGUgZmlyc3QgYW5kIGxhc3QgcG9pbnRzIGFyZSB0aGUgc2FtZSBhcyB0aGUgZmlyc3QgYW5kIGxhc3QgY29udHJvbCBwb2ludHNcbiAgICAgICAgaWYgKGkgPT0gMCkge1xuICAgICAgICAgIGN1cnZlUG9pbnRzWzBdID0gY29udHJvbFBvaW50c1swXTtcbiAgICAgICAgICBjdXJ2ZVBvaW50c1sxXSA9IGNvbnRyb2xQb2ludHNbMV07XG4gICAgICAgIH0gZWxzZSBpZiAoaSA9PSBzZWdtZW50cykge1xuICAgICAgICAgIGN1cnZlUG9pbnRzW2kgKiAyXSA9IGNvbnRyb2xQb2ludHNbY29udHJvbFBvaW50cy5sZW5ndGggLSAyXTtcbiAgICAgICAgICBjdXJ2ZVBvaW50c1tpICogMiArIDFdID0gY29udHJvbFBvaW50c1tjb250cm9sUG9pbnRzLmxlbmd0aCAtIDFdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciB0ID0gaSAvIHNlZ21lbnRzOyAvLyBzZWdtZW50cyBoYXZlIGVxdWFsIGxlbmd0aCwgaXRzIG5vdCBzdHJpY3RseSBuZWNlc3NhcnkgdG8gZG8gaXQgdGhpcyB3YXlcbiAgICAgICAgICAvLyBwYXNzIGluIGN1cnZlUG9pbnRzIHRvIHNldCB0aGUgdmFsdWVzIGluIHRoZSBhcnJheSBkaXJlY3RseVxuICAgICAgICAgIHRoaXMuX3NldEN1cnZlUG9pbnQoY29udHJvbFBvaW50cywgdCwgY3VydmVQb2ludHMsIGkgKiAyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGN1cnZlUG9pbnRzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfc2V0Q3VydmVQb2ludFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfc2V0Q3VydmVQb2ludChwb2ludHMsIHQsIGN1cnZlUG9pbnRzLCBjcGkpIHtcbiAgICAgIGlmIChwb2ludHMubGVuZ3RoIDw9IDIpIHtcbiAgICAgICAgY3VydmVQb2ludHNbY3BpXSA9IHBvaW50c1swXTtcbiAgICAgICAgY3VydmVQb2ludHNbY3BpICsgMV0gPSBwb2ludHNbMV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgbmV3cG9pbnRzID0gQXJyYXkocG9pbnRzLmxlbmd0aCAtIDIpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5ld3BvaW50cy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICAgIHZhciB4ID0gKDEgLSB0KSAqIHBvaW50c1tpXSArIHQgKiBwb2ludHNbaSArIDJdO1xuICAgICAgICAgIHZhciB5ID0gKDEgLSB0KSAqIHBvaW50c1tpICsgMV0gKyB0ICogcG9pbnRzW2kgKyAzXTtcbiAgICAgICAgICBuZXdwb2ludHNbaV0gPSB4O1xuICAgICAgICAgIG5ld3BvaW50c1tpICsgMV0gPSB5O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9zZXRDdXJ2ZVBvaW50KG5ld3BvaW50cywgdCwgY3VydmVQb2ludHMsIGNwaSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImVuZEJhdGNoXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVuZEJhdGNoKCkge1xuICAgICAgdmFyIGdsID0gdGhpcy5nbCxcbiAgICAgICAgdmFvID0gdGhpcy52YW8sXG4gICAgICAgIHZlcnRleENvdW50ID0gdGhpcy52ZXJ0ZXhDb3VudCxcbiAgICAgICAgY291bnQgPSB0aGlzLmluc3RhbmNlQ291bnQ7XG4gICAgICBpZiAoY291bnQgPT09IDApIHJldHVybjtcbiAgICAgIHZhciBwcm9ncmFtID0gdGhpcy5yZW5kZXJUYXJnZXQucGlja2luZyA/IHRoaXMucGlja2luZ1Byb2dyYW0gOiB0aGlzLnByb2dyYW07XG4gICAgICBnbC51c2VQcm9ncmFtKHByb2dyYW0pO1xuICAgICAgZ2wuYmluZFZlcnRleEFycmF5KHZhbyk7XG5cbiAgICAgIC8vIGJ1ZmZlciB0aGUgYXR0cmlidXRlIGRhdGFcbiAgICAgIHZhciBfaXRlcmF0b3IyID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIodGhpcy5idWZmZXJzKSxcbiAgICAgICAgX3N0ZXAyO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIChfaXRlcmF0b3IyLnMoKTsgIShfc3RlcDIgPSBfaXRlcmF0b3IyLm4oKSkuZG9uZTspIHtcbiAgICAgICAgICB2YXIgYnVmZmVyID0gX3N0ZXAyLnZhbHVlO1xuICAgICAgICAgIGJ1ZmZlci5idWZmZXJTdWJEYXRhKGNvdW50KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIF9pdGVyYXRvcjIuZShlcnIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgX2l0ZXJhdG9yMi5mKCk7XG4gICAgICB9XG4gICAgICB2YXIgYXRsYXNlcyA9IHRoaXMuYmF0Y2hNYW5hZ2VyLmdldEF0bGFzZXMoKTtcbiAgICAgIC8vIG11c3QgYnVmZmVyIGJlZm9yZSBhY3RpdmF0aW5nIHRleHR1cmUgdW5pdHNcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXRsYXNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBhdGxhc2VzW2ldLmJ1ZmZlcklmTmVlZGVkKGdsKTtcbiAgICAgIH1cbiAgICAgIC8vIEFjdGl2YXRlIGFsbCB0aGUgdGV4dHVyZSB1bml0cyB0aGF0IHdlIG5lZWRcbiAgICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IGF0bGFzZXMubGVuZ3RoOyBfaTIrKykge1xuICAgICAgICBnbC5hY3RpdmVUZXh0dXJlKGdsLlRFWFRVUkUwICsgX2kyKTtcbiAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgYXRsYXNlc1tfaTJdLnRleHR1cmUpO1xuICAgICAgICBnbC51bmlmb3JtMWkocHJvZ3JhbS51VGV4dHVyZXNbX2kyXSwgX2kyKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IHRoZSB1bmlmb3Jtc1xuICAgICAgZ2wudW5pZm9ybTFmKHByb2dyYW0udVpvb20sIGdldEVmZmVjdGl2ZVpvb20odGhpcy5yKSk7XG4gICAgICBnbC51bmlmb3JtTWF0cml4M2Z2KHByb2dyYW0udVBhblpvb21NYXRyaXgsIGZhbHNlLCB0aGlzLnBhblpvb21NYXRyaXgpO1xuICAgICAgZ2wudW5pZm9ybTFpKHByb2dyYW0udUF0bGFzU2l6ZSwgdGhpcy5iYXRjaE1hbmFnZXIuZ2V0QXRsYXNTaXplKCkpO1xuICAgICAgLy8gc2V0IGJhY2tncm91bmQgY29sb3IsIG5lZWRlZCBmb3IgZWRnZSBhcnJvdyBjb2xvciBibGVuZGluZ1xuICAgICAgdmFyIHdlYmdsQmdDb2xvciA9IHRvV2ViR0xDb2xvcih0aGlzLmJnQ29sb3IsIDEpO1xuICAgICAgZ2wudW5pZm9ybTRmdihwcm9ncmFtLnVCR0NvbG9yLCB3ZWJnbEJnQ29sb3IpO1xuXG4gICAgICAvLyBkcmF3IVxuICAgICAgZ2wuZHJhd0FycmF5c0luc3RhbmNlZChnbC5UUklBTkdMRVMsIDAsIHZlcnRleENvdW50LCBjb3VudCk7XG4gICAgICBnbC5iaW5kVmVydGV4QXJyYXkobnVsbCk7XG4gICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBudWxsKTsgLy8gVE9ETyBpcyB0aGlzIHJpZ2h0IHdoZW4gaGF2aW5nIG11bHRpcGxlIHRleHR1cmUgdW5pdHM/XG5cbiAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgIHRoaXMuYmF0Y2hEZWJ1Z0luZm8ucHVzaCh7XG4gICAgICAgICAgY291bnQ6IGNvdW50LFxuICAgICAgICAgIC8vIGluc3RhbmNlIGNvdW50XG4gICAgICAgICAgYXRsYXNDb3VudDogYXRsYXNlcy5sZW5ndGhcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIHN0YXJ0IHRoZSBuZXh0IGJhdGNoLCBldmVuIGlmIG5vdCBuZWVkZWRcbiAgICAgIHRoaXMuc3RhcnRCYXRjaCgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXREZWJ1Z0luZm9cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0RGVidWdJbmZvKCkge1xuICAgICAgdmFyIGF0bGFzSW5mbyA9IHRoaXMuYXRsYXNNYW5hZ2VyLmdldERlYnVnSW5mbygpO1xuICAgICAgdmFyIHRvdGFsQXRsYXNlcyA9IGF0bGFzSW5mby5yZWR1Y2UoZnVuY3Rpb24gKGNvdW50LCBpbmZvKSB7XG4gICAgICAgIHJldHVybiBjb3VudCArIGluZm8uYXRsYXNDb3VudDtcbiAgICAgIH0sIDApO1xuICAgICAgdmFyIGJhdGNoSW5mbyA9IHRoaXMuYmF0Y2hEZWJ1Z0luZm87XG4gICAgICB2YXIgdG90YWxJbnN0YW5jZXMgPSBiYXRjaEluZm8ucmVkdWNlKGZ1bmN0aW9uIChjb3VudCwgaW5mbykge1xuICAgICAgICByZXR1cm4gY291bnQgKyBpbmZvLmNvdW50O1xuICAgICAgfSwgMCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhdGxhc0luZm86IGF0bGFzSW5mbyxcbiAgICAgICAgdG90YWxBdGxhc2VzOiB0b3RhbEF0bGFzZXMsXG4gICAgICAgIHdyYXBwZWRDb3VudDogdGhpcy53cmFwcGVkQ291bnQsXG4gICAgICAgIHNpbXBsZUNvdW50OiB0aGlzLnNpbXBsZUNvdW50LFxuICAgICAgICBiYXRjaENvdW50OiBiYXRjaEluZm8ubGVuZ3RoLFxuICAgICAgICBiYXRjaEluZm86IGJhdGNoSW5mbyxcbiAgICAgICAgdG90YWxJbnN0YW5jZXM6IHRvdGFsSW5zdGFuY2VzXG4gICAgICB9O1xuICAgIH1cbiAgfV0pO1xufSgpO1xuXG52YXIgQ1JwJDQgPSB7fTtcblxuLyoqXG4gKiBJbml0aWFsaXplIHRoZSBXZWJHTCByZW5kZXJpbmcgbW9kZSBhZnRlciB0aGUgQ2FudmFzIHJlbmRlcmVyIGhhcyBiZWVuIGluaXRpYWxpemVkLlxuICovXG5DUnAkNC5pbml0V2ViZ2wgPSBmdW5jdGlvbiAob3B0cywgZm5zKSB7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIGdsID0gci5kYXRhLmNvbnRleHRzW3IuV0VCR0xdO1xuXG4gIC8vIFNldCBkZWZhdWx0cyBhbmQgbGltaXRzIGZvciBjb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gIG9wdHMuYmdDb2xvciA9IGdldEJHQ29sb3Iocik7XG4gIG9wdHMud2ViZ2xUZXhTaXplID0gTWF0aC5taW4ob3B0cy53ZWJnbFRleFNpemUsIGdsLmdldFBhcmFtZXRlcihnbC5NQVhfVEVYVFVSRV9TSVpFKSk7XG4gIG9wdHMud2ViZ2xUZXhSb3dzID0gTWF0aC5taW4ob3B0cy53ZWJnbFRleFJvd3MsIDU0KTtcbiAgb3B0cy53ZWJnbFRleFJvd3NOb2RlcyA9IE1hdGgubWluKG9wdHMud2ViZ2xUZXhSb3dzTm9kZXMsIDU0KTtcbiAgb3B0cy53ZWJnbEJhdGNoU2l6ZSA9IE1hdGgubWluKG9wdHMud2ViZ2xCYXRjaFNpemUsIDE2Mzg0KTtcbiAgb3B0cy53ZWJnbFRleFBlckJhdGNoID0gTWF0aC5taW4ob3B0cy53ZWJnbFRleFBlckJhdGNoLCBnbC5nZXRQYXJhbWV0ZXIoZ2wuTUFYX1RFWFRVUkVfSU1BR0VfVU5JVFMpKTtcblxuICAvLyBUdXJuIGRlYnVnIG1vZGUgb24gb3Igb2ZmLlxuICByLndlYmdsRGVidWcgPSBvcHRzLndlYmdsRGVidWc7XG4gIHIud2ViZ2xEZWJ1Z1Nob3dBdGxhc2VzID0gb3B0cy53ZWJnbERlYnVnU2hvd0F0bGFzZXM7XG5cbiAgLy8gQ3JlYXRlIG9mZnNjcmVlbiBmcmFtZWJ1ZmZlciB0aGF0IHN0b3JlcyB0aGUgcmVzdWx0cyB3aGVuIFJFTkRFUl9UQVJHRVQuUElDS0lORyBpcyBlbmFibGVkLlxuICAvLyBUaGlzIGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRvcG1vc3QgZWxlbWVudCB6LWluZGV4IGZvciBlYWNoIHBpeGVsLCB3aGljaCBpcyB1c2VkIHRvIHRlbGwgd2hhdHMgdW5kZXIgdGhlIG1vdXNlIGN1cnNvciBwb2ludC5cbiAgci5waWNraW5nRnJhbWVCdWZmZXIgPSBjcmVhdGVQaWNraW5nRnJhbWVCdWZmZXIoZ2wpO1xuICByLnBpY2tpbmdGcmFtZUJ1ZmZlci5uZWVkc0RyYXcgPSB0cnVlO1xuXG4gIC8vIENyZWF0ZSBhbiBFbGVtZW50RHJhd2luZ1dlYkdMIGluc3RhbmNlIHdpY2ggaXMgdXNlZCB0byBkbyB0aGUgYWN0dWFsIFdlYkdMIHJlbmRlcmluZy5cbiAgLy8gVGhpcyBpbnN0YW5jZSBuZWVkcyB0byBiZSBjb25maWd1cmVkIHRvIGRyYXcgdmFyaW91cyB0eXBlcyBvZiBlbGVtZW50cy5cbiAgci5kcmF3aW5nID0gbmV3IEVsZW1lbnREcmF3aW5nV2ViR0wociwgZ2wsIG9wdHMpO1xuXG4gIC8vIFNvbWUgZnVuY3Rpb25zIHRoYXQgYXJlIHVzZWQgdG8gY29uZmlndXJlIEVsZW1lbnREcmF3aW5nV2ViR0xcbiAgdmFyIGdldExhYmVsUm90YXRpb24gPSBmdW5jdGlvbiBnZXRMYWJlbFJvdGF0aW9uKHByb3ApIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGVsZSkge1xuICAgICAgcmV0dXJuIHIuZ2V0VGV4dEFuZ2xlKGVsZSwgcHJvcCk7XG4gICAgfTtcbiAgfTtcbiAgdmFyIGlzTGFiZWxWaXNpYmxlID0gZnVuY3Rpb24gaXNMYWJlbFZpc2libGUocHJvcCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZWxlKSB7XG4gICAgICB2YXIgbGFiZWwgPSBlbGUucHN0eWxlKHByb3ApO1xuICAgICAgcmV0dXJuIGxhYmVsICYmIGxhYmVsLnZhbHVlO1xuICAgIH07XG4gIH07XG4gIHZhciBpc0xheWVyVmlzaWJsZSA9IGZ1bmN0aW9uIGlzTGF5ZXJWaXNpYmxlKHByZWZpeCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgLy8gcHJlZml4IGlzICdvdmVybGF5JyBvciAndW5kZXJsYXknXG4gICAgICByZXR1cm4gbm9kZS5wc3R5bGUoXCJcIi5jb25jYXQocHJlZml4LCBcIi1vcGFjaXR5XCIpKS52YWx1ZSA+IDA7XG4gICAgfTtcbiAgfTtcbiAgdmFyIGdldFRleFBpY2tpbmdNb2RlID0gZnVuY3Rpb24gZ2V0VGV4UGlja2luZ01vZGUoZWxlKSB7XG4gICAgLy8gdGVsbHMgd2hlbiBhIGxhYmVsIHNob3VsZCBiZSBjbGlja2FibGVcbiAgICB2YXIgZW5hYmxlZCA9IGVsZS5wc3R5bGUoJ3RleHQtZXZlbnRzJykuc3RyVmFsdWUgPT09ICd5ZXMnO1xuICAgIHJldHVybiBlbmFibGVkID8gVEVYX1BJQ0tJTkdfTU9ERS5VU0VfQkIgOiBURVhfUElDS0lOR19NT0RFLklHTk9SRTtcbiAgfTtcbiAgdmFyIGdldEJCRm9yU2ltcGxlU2hhcGUgPSBmdW5jdGlvbiBnZXRCQkZvclNpbXBsZVNoYXBlKG5vZGUpIHtcbiAgICAvLyBcInNpbXBsZVwiIHNoYXBlcyBuZWVkIHRoZWlyIEJCIHRvIGluY2x1ZGUgYm9yZGVyIGFuZCBwYWRkaW5nXG4gICAgdmFyIF9ub2RlJHBvc2l0aW9uID0gbm9kZS5wb3NpdGlvbigpLFxuICAgICAgeCA9IF9ub2RlJHBvc2l0aW9uLngsXG4gICAgICB5ID0gX25vZGUkcG9zaXRpb24ueTtcbiAgICB2YXIgdyA9IG5vZGUub3V0ZXJXaWR0aCgpOyAvLyBpbmNsdWRlcyBib3JkZXIgYW5kIHBhZGRpbmdcbiAgICB2YXIgaCA9IG5vZGUub3V0ZXJIZWlnaHQoKTtcbiAgICByZXR1cm4ge1xuICAgICAgdzogdyxcbiAgICAgIGg6IGgsXG4gICAgICB4MTogeCAtIHcgLyAyLFxuICAgICAgeTE6IHkgLSBoIC8gMlxuICAgIH07XG4gIH07XG5cbiAgLy8gQW4gQXRsYXNDb2xsZWN0aW9uIGlzIGEgY29sbGVjdGlvbiBvZiBBdGxhc2VzIHRoYXQgaGF2ZSB0aGUgc2FtZSBjb25maWd1cmFpdG9uIG9wdGlvbnMuXG4gIC8vIENyZWF0ZSBvbmUgZm9yIG5vZGUgYm9kaWVzIGFuZCBvbmUgZm9yIGFsbCB0eXBlcyBvZiBsYWJlbHMuXG4gIHIuZHJhd2luZy5hZGRBdGxhc0NvbGxlY3Rpb24oJ25vZGUnLCB7XG4gICAgdGV4Um93czogb3B0cy53ZWJnbFRleFJvd3NOb2Rlc1xuICB9KTtcbiAgci5kcmF3aW5nLmFkZEF0bGFzQ29sbGVjdGlvbignbGFiZWwnLCB7XG4gICAgdGV4Um93czogb3B0cy53ZWJnbFRleFJvd3NcbiAgfSk7XG5cbiAgLy8gQ29uZmlndXJlIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgZWxlbWVudHMgdGhhdCBjYW4gYmUgcmVuZGVyZWQuXG5cbiAgLy8gTm9kZSBib2RpZXMgY2FuIGJlIHJlbmRlcmVkIGFzIHRleHR1cmVzIG9yIGFzIFwic2ltcGxlIHNoYXBlc1wiLiBcbiAgLy8gU2ltcGxlIHNoYXBlcyBhcmUgcHJlZmVycmVkIGJlY2F1c2UgdGhleSBkbyBub3QgdXNlIHRleHR1cmUgbWVtb3J5LlxuICAvLyBUZXh0dXJlcyBhcmUgcmVxdWlyZWQgaWYgdGhlIG5vZGUgYm9keSB1c2VzIGNvbXBsZXggc3R5bGVzLiBcbiAgci5kcmF3aW5nLmFkZFRleHR1cmVBdGxhc1JlbmRlclR5cGUoJ25vZGUtYm9keScsIHtcbiAgICBjb2xsZWN0aW9uOiAnbm9kZScsXG4gICAgZ2V0S2V5OiBmbnMuZ2V0U3R5bGVLZXksXG4gICAgZ2V0Qm91bmRpbmdCb3g6IGZucy5nZXRFbGVtZW50Qm94LFxuICAgIGRyYXdFbGVtZW50OiBmbnMuZHJhd0VsZW1lbnRcbiAgfSk7XG4gIHIuZHJhd2luZy5hZGRTaW1wbGVTaGFwZVJlbmRlclR5cGUoJ25vZGUtYm9keScsIHtcbiAgICBnZXRCb3VuZGluZ0JveDogZ2V0QkJGb3JTaW1wbGVTaGFwZSxcbiAgICBpc1NpbXBsZTogaXNTaW1wbGVTaGFwZSxcbiAgICBzaGFwZVByb3BzOiB7XG4gICAgICBzaGFwZTogJ3NoYXBlJyxcbiAgICAgIGNvbG9yOiAnYmFja2dyb3VuZC1jb2xvcicsXG4gICAgICBvcGFjaXR5OiAnYmFja2dyb3VuZC1vcGFjaXR5JyxcbiAgICAgIHJhZGl1czogJ2Nvcm5lci1yYWRpdXMnLFxuICAgICAgYm9yZGVyOiB0cnVlXG4gICAgfVxuICB9KTtcbiAgci5kcmF3aW5nLmFkZFNpbXBsZVNoYXBlUmVuZGVyVHlwZSgnbm9kZS1vdmVybGF5Jywge1xuICAgIGdldEJvdW5kaW5nQm94OiBnZXRCQkZvclNpbXBsZVNoYXBlLFxuICAgIGlzVmlzaWJsZTogaXNMYXllclZpc2libGUoJ292ZXJsYXknKSxcbiAgICBzaGFwZVByb3BzOiB7XG4gICAgICBzaGFwZTogJ292ZXJsYXktc2hhcGUnLFxuICAgICAgY29sb3I6ICdvdmVybGF5LWNvbG9yJyxcbiAgICAgIG9wYWNpdHk6ICdvdmVybGF5LW9wYWNpdHknLFxuICAgICAgcGFkZGluZzogJ292ZXJsYXktcGFkZGluZycsXG4gICAgICByYWRpdXM6ICdvdmVybGF5LWNvcm5lci1yYWRpdXMnXG4gICAgfVxuICB9KTtcbiAgci5kcmF3aW5nLmFkZFNpbXBsZVNoYXBlUmVuZGVyVHlwZSgnbm9kZS11bmRlcmxheScsIHtcbiAgICBnZXRCb3VuZGluZ0JveDogZ2V0QkJGb3JTaW1wbGVTaGFwZSxcbiAgICBpc1Zpc2libGU6IGlzTGF5ZXJWaXNpYmxlKCd1bmRlcmxheScpLFxuICAgIHNoYXBlUHJvcHM6IHtcbiAgICAgIHNoYXBlOiAndW5kZXJsYXktc2hhcGUnLFxuICAgICAgY29sb3I6ICd1bmRlcmxheS1jb2xvcicsXG4gICAgICBvcGFjaXR5OiAndW5kZXJsYXktb3BhY2l0eScsXG4gICAgICBwYWRkaW5nOiAndW5kZXJsYXktcGFkZGluZycsXG4gICAgICByYWRpdXM6ICd1bmRlcmxheS1jb3JuZXItcmFkaXVzJ1xuICAgIH1cbiAgfSk7XG4gIHIuZHJhd2luZy5hZGRUZXh0dXJlQXRsYXNSZW5kZXJUeXBlKCdsYWJlbCcsIHtcbiAgICAvLyBub2RlIGxhYmVsIG9yIGVkZ2UgbWlkIGxhYmVsXG4gICAgY29sbGVjdGlvbjogJ2xhYmVsJyxcbiAgICBnZXRUZXhQaWNraW5nTW9kZTogZ2V0VGV4UGlja2luZ01vZGUsXG4gICAgZ2V0S2V5OiBnZXRTdHlsZUtleXNGb3JMYWJlbChmbnMuZ2V0TGFiZWxLZXksIG51bGwpLFxuICAgIGdldEJvdW5kaW5nQm94OiBnZXRCb3VuZGluZ0JveEZvckxhYmVsKGZucy5nZXRMYWJlbEJveCwgbnVsbCksXG4gICAgZHJhd0NsaXBwZWQ6IHRydWUsXG4gICAgZHJhd0VsZW1lbnQ6IGZucy5kcmF3TGFiZWwsXG4gICAgZ2V0Um90YXRpb246IGdldExhYmVsUm90YXRpb24obnVsbCksXG4gICAgZ2V0Um90YXRpb25Qb2ludDogZm5zLmdldExhYmVsUm90YXRpb25Qb2ludCxcbiAgICBnZXRSb3RhdGlvbk9mZnNldDogZm5zLmdldExhYmVsUm90YXRpb25PZmZzZXQsXG4gICAgaXNWaXNpYmxlOiBpc0xhYmVsVmlzaWJsZSgnbGFiZWwnKVxuICB9KTtcbiAgci5kcmF3aW5nLmFkZFRleHR1cmVBdGxhc1JlbmRlclR5cGUoJ2VkZ2Utc291cmNlLWxhYmVsJywge1xuICAgIGNvbGxlY3Rpb246ICdsYWJlbCcsXG4gICAgZ2V0VGV4UGlja2luZ01vZGU6IGdldFRleFBpY2tpbmdNb2RlLFxuICAgIGdldEtleTogZ2V0U3R5bGVLZXlzRm9yTGFiZWwoZm5zLmdldFNvdXJjZUxhYmVsS2V5LCAnc291cmNlJyksXG4gICAgZ2V0Qm91bmRpbmdCb3g6IGdldEJvdW5kaW5nQm94Rm9yTGFiZWwoZm5zLmdldFNvdXJjZUxhYmVsQm94LCAnc291cmNlJyksXG4gICAgZHJhd0NsaXBwZWQ6IHRydWUsXG4gICAgZHJhd0VsZW1lbnQ6IGZucy5kcmF3U291cmNlTGFiZWwsXG4gICAgZ2V0Um90YXRpb246IGdldExhYmVsUm90YXRpb24oJ3NvdXJjZScpLFxuICAgIGdldFJvdGF0aW9uUG9pbnQ6IGZucy5nZXRTb3VyY2VMYWJlbFJvdGF0aW9uUG9pbnQsXG4gICAgZ2V0Um90YXRpb25PZmZzZXQ6IGZucy5nZXRTb3VyY2VMYWJlbFJvdGF0aW9uT2Zmc2V0LFxuICAgIGlzVmlzaWJsZTogaXNMYWJlbFZpc2libGUoJ3NvdXJjZS1sYWJlbCcpXG4gIH0pO1xuICByLmRyYXdpbmcuYWRkVGV4dHVyZUF0bGFzUmVuZGVyVHlwZSgnZWRnZS10YXJnZXQtbGFiZWwnLCB7XG4gICAgY29sbGVjdGlvbjogJ2xhYmVsJyxcbiAgICBnZXRUZXhQaWNraW5nTW9kZTogZ2V0VGV4UGlja2luZ01vZGUsXG4gICAgZ2V0S2V5OiBnZXRTdHlsZUtleXNGb3JMYWJlbChmbnMuZ2V0VGFyZ2V0TGFiZWxLZXksICd0YXJnZXQnKSxcbiAgICBnZXRCb3VuZGluZ0JveDogZ2V0Qm91bmRpbmdCb3hGb3JMYWJlbChmbnMuZ2V0VGFyZ2V0TGFiZWxCb3gsICd0YXJnZXQnKSxcbiAgICBkcmF3Q2xpcHBlZDogdHJ1ZSxcbiAgICBkcmF3RWxlbWVudDogZm5zLmRyYXdUYXJnZXRMYWJlbCxcbiAgICBnZXRSb3RhdGlvbjogZ2V0TGFiZWxSb3RhdGlvbigndGFyZ2V0JyksXG4gICAgZ2V0Um90YXRpb25Qb2ludDogZm5zLmdldFRhcmdldExhYmVsUm90YXRpb25Qb2ludCxcbiAgICBnZXRSb3RhdGlvbk9mZnNldDogZm5zLmdldFRhcmdldExhYmVsUm90YXRpb25PZmZzZXQsXG4gICAgaXNWaXNpYmxlOiBpc0xhYmVsVmlzaWJsZSgndGFyZ2V0LWxhYmVsJylcbiAgfSk7XG5cbiAgLy8gVmVyeSBzaW1wbGlzdGljIHdheSBvZiB0cmlnZ2VyaW5nIGdhcmJhZ2UgY29sbGVjdGlvbiwganVzdCB1c2UgYSB0aW1lci5cbiAgdmFyIHNldEdDRmxhZyA9IGRlYm91bmNlKGZ1bmN0aW9uICgpIHtcbiAgICBjb25zb2xlLmxvZygnZ2FyYmFnZSBjb2xsZWN0IGZsYWcgc2V0Jyk7XG4gICAgci5kYXRhLmdjID0gdHJ1ZTtcbiAgfSwgMTAwMDApO1xuXG4gIC8vIEV2ZW50IGxpc3RlbmVyIGNoZWNrcyBpZiBzdHlsZSBrZXlzIGFyZSBubyBsb25nZXIgaW4gdXNlLlxuICByLm9uVXBkYXRlRWxlQ2FsY3MoZnVuY3Rpb24gKHdpbGxEcmF3LCBlbGVzKSB7XG4gICAgdmFyIGdjTmVlZGVkID0gZmFsc2U7XG4gICAgaWYgKGVsZXMgJiYgZWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBnY05lZWRlZCB8PSByLmRyYXdpbmcuaW52YWxpZGF0ZShlbGVzKTtcbiAgICB9XG4gICAgaWYgKGdjTmVlZGVkKSB7XG4gICAgICBzZXRHQ0ZsYWcoKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIFwiT3ZlcnJpZGVcIiBjZXJ0YWluIGZ1bmN0aW9ucyBpbiBjYW52YXMgYW5kIGJhc2UgcmVuZGVyZXJcbiAgb3ZlcnJpZGVDYW52YXNSZW5kZXJlckZ1bmN0aW9ucyhyKTtcbn07XG5mdW5jdGlvbiBnZXRCR0NvbG9yKHIpIHtcbiAgdmFyIGNvbnRhaW5lciA9IHIuY3kuY29udGFpbmVyKCk7XG4gIHZhciBjc3NDb2xvciA9IGNvbnRhaW5lciAmJiBjb250YWluZXIuc3R5bGUgJiYgY29udGFpbmVyLnN0eWxlLmJhY2tncm91bmRDb2xvciB8fCAnd2hpdGUnO1xuICByZXR1cm4gY29sb3IydHVwbGUoY3NzQ29sb3IpO1xufVxuZnVuY3Rpb24gZ2V0TGFiZWxMaW5lcyhlbGUsIHByZWZpeCkge1xuICB2YXIgcnMgPSBlbGUuX3ByaXZhdGUucnNjcmF0Y2g7XG4gIHJldHVybiBnZXRQcmVmaXhlZFByb3BlcnR5KHJzLCAnbGFiZWxXcmFwQ2FjaGVkTGluZXMnLCBwcmVmaXgpIHx8IFtdO1xufVxuXG4vKiogXG4gKiBIYW5kbGUgbXVsdGktbGluZSBsYWJlbHMgYnkgcmVuZGVyaW5nIGVhY2ggbGluZSBhcyBhIHNlcGVyYXRlIHRleHR1cmUuXG4gKiBUaGF0IG1lYW5zIGVhY2ggbGluZSBuZWVkcyBpdHMgb3duIHN0eWxlIGtleS5cbiAqL1xudmFyIGdldFN0eWxlS2V5c0ZvckxhYmVsID0gZnVuY3Rpb24gZ2V0U3R5bGVLZXlzRm9yTGFiZWwoZ2V0S2V5LCBwcmVmaXgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChlbGUpIHtcbiAgICB2YXIga2V5ID0gZ2V0S2V5KGVsZSk7XG4gICAgdmFyIGxpbmVzID0gZ2V0TGFiZWxMaW5lcyhlbGUsIHByZWZpeCk7XG4gICAgaWYgKGxpbmVzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHJldHVybiBsaW5lcy5tYXAoZnVuY3Rpb24gKGxpbmUsIGluZGV4KSB7XG4gICAgICAgIHJldHVybiBcIlwiLmNvbmNhdChrZXksIFwiX1wiKS5jb25jYXQoaW5kZXgpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBrZXk7XG4gIH07XG59O1xuXG4vKipcbiAqIE5lZWQgdG8gY3JlYXRlIGEgc2VwYXJhdGUgYm91bmRpbmcgYm94IGZvciBlYWNoIGxpbmUgb2YgYSBtdWx0aS1saW5lIGxhYmVsLlxuICogTm90ZSB0aGF0ICdkcmF3Q2xpcHBlZDogdHJ1ZScgc2hvdWxkIGJlIHVzZWQgd2l0aCB0aGlzLlxuICovXG52YXIgZ2V0Qm91bmRpbmdCb3hGb3JMYWJlbCA9IGZ1bmN0aW9uIGdldEJvdW5kaW5nQm94Rm9yTGFiZWwoZ2V0Qm91bmRpbmdCb3gsIHByZWZpeCkge1xuICByZXR1cm4gZnVuY3Rpb24gKGVsZSwgc3R5bGVLZXkpIHtcbiAgICB2YXIgYmIgPSBnZXRCb3VuZGluZ0JveChlbGUpO1xuICAgIGlmICh0eXBlb2Ygc3R5bGVLZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgICB2YXIgdWkgPSBzdHlsZUtleS5pbmRleE9mKCdfJyk7XG4gICAgICBpZiAodWkgPiAwKSB7XG4gICAgICAgIHZhciBsaW5lSW5kZXggPSBOdW1iZXIoc3R5bGVLZXkuc3Vic3RyaW5nKHVpICsgMSkpO1xuICAgICAgICB2YXIgbGluZXMgPSBnZXRMYWJlbExpbmVzKGVsZSwgcHJlZml4KTtcbiAgICAgICAgLy8gQWRqdXN0IHRoZSBoZWlnaHQgYW5kIFkgY29vcmRpbmF0ZSBmb3Igb25lIGxpbmUgb2YgdGhlIGxhYmVsLlxuICAgICAgICB2YXIgaCA9IGJiLmggLyBsaW5lcy5sZW5ndGg7XG4gICAgICAgIHZhciB5T2Zmc2V0ID0gaCAqIGxpbmVJbmRleDtcbiAgICAgICAgdmFyIHkxID0gYmIueTEgKyB5T2Zmc2V0O1xuICAgICAgICAvLyB0aGUgeU9mZnNldCBpcyBuZWVkZWQgd2hlbiByb3RhdGluZyB0aGUgbGFiZWxcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB4MTogYmIueDEsXG4gICAgICAgICAgdzogYmIudyxcbiAgICAgICAgICB5MTogeTEsXG4gICAgICAgICAgaDogaCxcbiAgICAgICAgICB5T2Zmc2V0OiB5T2Zmc2V0XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiYjtcbiAgfTtcbn07XG5cbi8qKlxuICogUGx1ZyBpbnRvIHRoZSBjYW52YXMgcmVuZGVyZXIgYnkgZHluYW1pY2FsbHkgb3ZlcnJpZGluZyBzb21lIG9mIGl0cyBmdW5jdGlvbnMuXG4gKiBUaGlzIHJlcXVpcmVzIG1pbmltYWwgY2hhbmdlcyB0byB0aGUgY2FudmFzIHJlbmRyZXJlci5cbiAqL1xuZnVuY3Rpb24gb3ZlcnJpZGVDYW52YXNSZW5kZXJlckZ1bmN0aW9ucyhyKSB7XG4gIHtcbiAgICAvLyBPdmVycmlkZSB0aGUgcmVuZGVyIGZ1bmN0aW9uIHRvIGNhbGwgdGhlIHdlYmdsIHJlbmRlciBmdW5jdGlvbiBpZiB0aGUgem9vbSBsZXZlbCBpcyBhcHByb3ByaWF0ZVxuICAgIHZhciByZW5kZXJDYW52YXMgPSByLnJlbmRlcjtcbiAgICByLnJlbmRlciA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgIHZhciBjeSA9IHIuY3k7XG4gICAgICBpZiAoci53ZWJnbCkge1xuICAgICAgICAvLyBJZiB0aGUgem9vbSBsZXZlbCBpcyBncmVhdGVyIHRoYW4gdGhlIG1heCB6b29tIGxldmVsLCB0aGVuIGRpc2FibGUgd2ViZ2wgYW5kIHN3aXRjaCBiYWNrIHRvIFxuICAgICAgICAvLyB0aGUgY2FudmFzIHJlbmRlcmVyLlxuICAgICAgICBpZiAoY3kuem9vbSgpID4gbWF4Wm9vbSQxKSB7XG4gICAgICAgICAgY2xlYXJXZWJnbChyKTtcbiAgICAgICAgICByZW5kZXJDYW52YXMuY2FsbChyLCBvcHRpb25zKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjbGVhckNhbnZhcyhyKTtcbiAgICAgICAgICByZW5kZXJXZWJnbChyLCBvcHRpb25zLCBSRU5ERVJfVEFSR0VULlNDUkVFTik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIHtcbiAgICAvLyBPdmVycmlkZSB0aGUgbWF0Y2hDYW52YXNTaXplIGZ1bmN0aW9uIHRvIHVwZGF0ZSB0aGUgcGlja2luZyBmcmFtZSBidWZmZXIgc2l6ZVxuICAgIHZhciBiYXNlRnVuYyA9IHIubWF0Y2hDYW52YXNTaXplO1xuICAgIHIubWF0Y2hDYW52YXNTaXplID0gZnVuY3Rpb24gKGNvbnRhaW5lcikge1xuICAgICAgYmFzZUZ1bmMuY2FsbChyLCBjb250YWluZXIpO1xuICAgICAgci5waWNraW5nRnJhbWVCdWZmZXIuc2V0RnJhbWVidWZmZXJBdHRhY2htZW50U2l6ZXMoci5jYW52YXNXaWR0aCwgci5jYW52YXNIZWlnaHQpO1xuICAgICAgci5waWNraW5nRnJhbWVCdWZmZXIubmVlZHNEcmF3ID0gdHJ1ZTtcbiAgICB9O1xuICB9XG4gIHtcbiAgICAvLyBPdmVycmlkZSBmdW5jdGlvbiB0byBjYWxsIHRoZSB3ZWJnbCB2ZXJzaW9uIGZvciBwaWNraW5nLlxuICAgIC8vIERvbid0IG92ZXJyaWRlIHIuZ2V0QWxsSW5Cb3goKSBzZWxjdGlvbiBib3ggcGlja2luZywgaXRzIG5vdCBhY2N1cmF0ZSBlbm91Z2ggd2l0aCB3ZWJnbFxuICAgIHIuZmluZE5lYXJlc3RFbGVtZW50cyA9IGZ1bmN0aW9uICh4LCB5LCBpbnRlcmFjdGl2ZUVsZW1lbnRzT25seSwgaXNUb3VjaCkge1xuICAgICAgLy8gdGhlIGNhbnZhcyB2ZXJzaW9uIG9mIHRoaXMgZnVuY3Rpb24gaXMgdmVyeSBzbG93IG9uIGxhcmdlIGdyYXBoc1xuICAgICAgcmV0dXJuIGZpbmROZWFyZXN0RWxlbWVudHNXZWJnbChyLCB4LCB5KTtcbiAgICB9O1xuICB9XG4gIHtcbiAgICAvLyBuZWVkIHRvIGtub3cgd2hlbiB0aGUgY2FjaGVkIGVsZW1lbnRzIGhhdmUgY2hhbmdlZCBzbyB3ZSBjYW4gaW52YWxpZGF0ZSBvdXIgY2FjaGVzXG4gICAgdmFyIF9iYXNlRnVuYyA9IHIuaW52YWxpZGF0ZUNhY2hlZFpTb3J0ZWRFbGVzO1xuICAgIHIuaW52YWxpZGF0ZUNhY2hlZFpTb3J0ZWRFbGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgX2Jhc2VGdW5jLmNhbGwocik7XG4gICAgICByLnBpY2tpbmdGcmFtZUJ1ZmZlci5uZWVkc0RyYXcgPSB0cnVlO1xuICAgIH07XG4gIH1cbiAge1xuICAgIC8vIG5lZWQgdG8ga25vdyB3aGVuIHRoZSBjYWNoZWQgZWxlbWVudHMgaGF2ZSBjaGFuZ2VkIHNvIHdlIGNhbiBpbnZhbGlkYXRlIG91ciBjYWNoZXNcbiAgICB2YXIgX2Jhc2VGdW5jMiA9IHIubm90aWZ5O1xuICAgIHIubm90aWZ5ID0gZnVuY3Rpb24gKGV2ZW50TmFtZSwgZWxlcykge1xuICAgICAgX2Jhc2VGdW5jMi5jYWxsKHIsIGV2ZW50TmFtZSwgZWxlcyk7XG4gICAgICBpZiAoZXZlbnROYW1lID09PSAndmlld3BvcnQnIHx8IGV2ZW50TmFtZSA9PT0gJ2JvdW5kcycpIHtcbiAgICAgICAgci5waWNraW5nRnJhbWVCdWZmZXIubmVlZHNEcmF3ID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnROYW1lID09PSAnYmFja2dyb3VuZCcpIHtcbiAgICAgICAgLy8gYmFja2dyb3VuZCBpbWFnZSBmaW5pc2hlZCBsb2FkaW5nLCBuZWVkIHRvIHJlZHJhd1xuICAgICAgICByLmRyYXdpbmcuaW52YWxpZGF0ZShlbGVzLCB7XG4gICAgICAgICAgdHlwZTogJ25vZGUtYm9keSdcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuZnVuY3Rpb24gY2xlYXJXZWJnbChyKSB7XG4gIHZhciBnbCA9IHIuZGF0YS5jb250ZXh0c1tyLldFQkdMXTtcbiAgZ2wuY2xlYXIoZ2wuQ09MT1JfQlVGRkVSX0JJVCB8IGdsLkRFUFRIX0JVRkZFUl9CSVQpO1xufVxuZnVuY3Rpb24gY2xlYXJDYW52YXMocikge1xuICAvLyB0aGUgQ1JwLmNsZWFyQ2FudmFzKCkgZnVuY3Rpb24gZG9lc24ndCB0YWtlIHRoZSB0cmFuc2Zvcm0gaW50byBhY2NvdW50XG4gIHZhciBjbGVhciA9IGZ1bmN0aW9uIGNsZWFyKGNvbnRleHQpIHtcbiAgICBjb250ZXh0LnNhdmUoKTtcbiAgICBjb250ZXh0LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcbiAgICBjb250ZXh0LmNsZWFyUmVjdCgwLCAwLCByLmNhbnZhc1dpZHRoLCByLmNhbnZhc0hlaWdodCk7XG4gICAgY29udGV4dC5yZXN0b3JlKCk7XG4gIH07XG4gIGNsZWFyKHIuZGF0YS5jb250ZXh0c1tyLk5PREVdKTtcbiAgY2xlYXIoci5kYXRhLmNvbnRleHRzW3IuRFJBR10pO1xufVxuZnVuY3Rpb24gY3JlYXRlUGFuWm9vbU1hdHJpeChyKSB7XG4gIHZhciB3aWR0aCA9IHIuY2FudmFzV2lkdGg7XG4gIHZhciBoZWlnaHQgPSByLmNhbnZhc0hlaWdodDtcbiAgdmFyIF91dGlsJGdldEVmZmVjdGl2ZVBhbiA9IGdldEVmZmVjdGl2ZVBhblpvb20ociksXG4gICAgcGFuID0gX3V0aWwkZ2V0RWZmZWN0aXZlUGFuLnBhbixcbiAgICB6b29tID0gX3V0aWwkZ2V0RWZmZWN0aXZlUGFuLnpvb207XG4gIHZhciB0cmFuc2Zvcm0gPSBjcmVhdGUoKTtcbiAgdHJhbnNsYXRlKHRyYW5zZm9ybSwgdHJhbnNmb3JtLCBbcGFuLngsIHBhbi55XSk7XG4gIHNjYWxlKHRyYW5zZm9ybSwgdHJhbnNmb3JtLCBbem9vbSwgem9vbV0pO1xuICB2YXIgcHJvamVjdGlvbiQxID0gY3JlYXRlKCk7XG4gIHByb2plY3Rpb24ocHJvamVjdGlvbiQxLCB3aWR0aCwgaGVpZ2h0KTtcbiAgdmFyIHByb2R1Y3QgPSBjcmVhdGUoKTtcbiAgbXVsdGlwbHkocHJvZHVjdCwgcHJvamVjdGlvbiQxLCB0cmFuc2Zvcm0pO1xuICByZXR1cm4gcHJvZHVjdDtcbn1cbmZ1bmN0aW9uIHNldENvbnRleHRUcmFuc2Zvcm0ociwgY29udGV4dCkge1xuICB2YXIgd2lkdGggPSByLmNhbnZhc1dpZHRoO1xuICB2YXIgaGVpZ2h0ID0gci5jYW52YXNIZWlnaHQ7XG4gIHZhciBfdXRpbCRnZXRFZmZlY3RpdmVQYW4yID0gZ2V0RWZmZWN0aXZlUGFuWm9vbShyKSxcbiAgICBwYW4gPSBfdXRpbCRnZXRFZmZlY3RpdmVQYW4yLnBhbixcbiAgICB6b29tID0gX3V0aWwkZ2V0RWZmZWN0aXZlUGFuMi56b29tO1xuICBjb250ZXh0LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcbiAgY29udGV4dC5jbGVhclJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gIGNvbnRleHQudHJhbnNsYXRlKHBhbi54LCBwYW4ueSk7XG4gIGNvbnRleHQuc2NhbGUoem9vbSwgem9vbSk7XG59XG5mdW5jdGlvbiBkcmF3U2VsZWN0aW9uUmVjdGFuZ2xlKHIsIG9wdGlvbnMpIHtcbiAgci5kcmF3U2VsZWN0aW9uUmVjdGFuZ2xlKG9wdGlvbnMsIGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgcmV0dXJuIHNldENvbnRleHRUcmFuc2Zvcm0ociwgY29udGV4dCk7XG4gIH0pO1xufVxuZnVuY3Rpb24gZHJhd0F4ZXMocikge1xuICAvLyBmb3IgZGViZ2dpbmdcbiAgdmFyIGNvbnRleHQgPSByLmRhdGEuY29udGV4dHNbci5OT0RFXTtcbiAgY29udGV4dC5zYXZlKCk7XG4gIHNldENvbnRleHRUcmFuc2Zvcm0ociwgY29udGV4dCk7XG4gIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSAncmdiYSgwLCAwLCAwLCAwLjMpJztcbiAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgY29udGV4dC5tb3ZlVG8oLTFlMywgMCk7XG4gIGNvbnRleHQubGluZVRvKDEwMDAsIDApO1xuICBjb250ZXh0LnN0cm9rZSgpO1xuICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICBjb250ZXh0Lm1vdmVUbygwLCAtMWUzKTtcbiAgY29udGV4dC5saW5lVG8oMCwgMTAwMCk7XG4gIGNvbnRleHQuc3Ryb2tlKCk7XG4gIGNvbnRleHQucmVzdG9yZSgpO1xufVxuZnVuY3Rpb24gZHJhd0F0bGFzZXMocikge1xuICAvLyBGb3IgZGVidWdnaW5nIHRoZSBhdGxhc2VzLCB0aGlzIGRvZXNuJ3Qgd29yayBmb3IgQXRsYXNlcyB0aGF0IGFyZSBsb2NrZWRcbiAgdmFyIGRyYXcgPSBmdW5jdGlvbiBkcmF3KGRyYXdpbmcsIG5hbWUsIHJvdykge1xuICAgIHZhciBjb2xsZWN0aW9uID0gZHJhd2luZy5hdGxhc01hbmFnZXIuZ2V0QXRsYXNDb2xsZWN0aW9uKG5hbWUpO1xuICAgIHZhciBjb250ZXh0ID0gci5kYXRhLmNvbnRleHRzW3IuTk9ERV07XG4gICAgdmFyIGF0bGFzZXMgPSBjb2xsZWN0aW9uLmF0bGFzZXM7XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGF0bGFzZXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgYXRsYXMgPSBhdGxhc2VzW19pXTtcbiAgICAgIHZhciBjYW52YXMgPSBhdGxhcy5jYW52YXM7XG4gICAgICBpZiAoY2FudmFzKSB7XG4gICAgICAgIHZhciB3ID0gY2FudmFzLndpZHRoO1xuICAgICAgICB2YXIgaCA9IGNhbnZhcy5oZWlnaHQ7XG4gICAgICAgIHZhciB4ID0gdyAqIF9pO1xuICAgICAgICB2YXIgeSA9IGNhbnZhcy5oZWlnaHQgKiByb3c7XG4gICAgICAgIHZhciBzY2FsZSA9IDAuNDtcbiAgICAgICAgY29udGV4dC5zYXZlKCk7XG4gICAgICAgIGNvbnRleHQuc2NhbGUoc2NhbGUsIHNjYWxlKTtcbiAgICAgICAgY29udGV4dC5kcmF3SW1hZ2UoY2FudmFzLCB4LCB5KTtcbiAgICAgICAgY29udGV4dC5zdHJva2VTdHlsZSA9ICdibGFjayc7XG4gICAgICAgIGNvbnRleHQucmVjdCh4LCB5LCB3LCBoKTtcbiAgICAgICAgY29udGV4dC5zdHJva2UoKTtcbiAgICAgICAgY29udGV4dC5yZXN0b3JlKCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICB2YXIgaSA9IDA7XG4gIGRyYXcoci5kcmF3aW5nLCAnbm9kZScsIGkrKyk7XG4gIGRyYXcoci5kcmF3aW5nLCAnbGFiZWwnLCBpKyspO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHotb3JkZXIgaW5kZXggb2YgZWxtZW50cyB1bmRlciBvciB2ZXJ5IGNsb3NlIHRvIHRoZSBtb3VzZSBjdXJzb3IgcG9pbnQuXG4gKiBBcmd1bWVudHMgYXJlIGluIG1vZGVsIGNvb3JkaW5hdGVzLlxuICogKHgxLCB5MSkgaXMgdG9wIGxlZnQgY29ybmVyXG4gKiAoeDIsIHkyKSBpcyBib3R0b20gcmlnaHQgY29ybmVyIChvcHRpb25hbClcbiAqIFJldHVybnMgYSBTZXQgb2YgaW5kZXhlcy5cbiAqL1xuZnVuY3Rpb24gZ2V0UGlja2luZ0luZGV4ZXMociwgbVgxLCBtWTEsIG1YMiwgbVkyKSB7XG4gIHZhciB4LCB5LCB3LCBoO1xuICB2YXIgX3V0aWwkZ2V0RWZmZWN0aXZlUGFuMyA9IGdldEVmZmVjdGl2ZVBhblpvb20ociksXG4gICAgcGFuID0gX3V0aWwkZ2V0RWZmZWN0aXZlUGFuMy5wYW4sXG4gICAgem9vbSA9IF91dGlsJGdldEVmZmVjdGl2ZVBhbjMuem9vbTtcbiAge1xuICAgIHZhciBfdXRpbCRtb2RlbFRvUmVuZGVyZWQgPSBtb2RlbFRvUmVuZGVyZWRQb3NpdGlvbihyLCBwYW4sIHpvb20sIG1YMSwgbVkxKSxcbiAgICAgIF91dGlsJG1vZGVsVG9SZW5kZXJlZDIgPSBfc2xpY2VkVG9BcnJheShfdXRpbCRtb2RlbFRvUmVuZGVyZWQsIDIpLFxuICAgICAgY1gxID0gX3V0aWwkbW9kZWxUb1JlbmRlcmVkMlswXSxcbiAgICAgIGNZMSA9IF91dGlsJG1vZGVsVG9SZW5kZXJlZDJbMV07XG4gICAgdmFyIHQgPSA2OyAvLyBzaG91bGQgYmUgZXZlblxuICAgIHggPSBjWDEgLSB0IC8gMjtcbiAgICB5ID0gY1kxIC0gdCAvIDI7XG4gICAgdyA9IHQ7XG4gICAgaCA9IHQ7XG4gIH1cbiAgaWYgKHcgPT09IDAgfHwgaCA9PT0gMCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICB2YXIgZ2wgPSByLmRhdGEuY29udGV4dHNbci5XRUJHTF07XG4gIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgci5waWNraW5nRnJhbWVCdWZmZXIpO1xuICBpZiAoci5waWNraW5nRnJhbWVCdWZmZXIubmVlZHNEcmF3KSB7XG4gICAgLy8gRHJhdyBlbGVtZW50IHotaW5kZXhlcyB0byB0aGUgcGlja2luZyBmcmFtZWJ1ZmZlclxuICAgIGdsLnZpZXdwb3J0KDAsIDAsIGdsLmNhbnZhcy53aWR0aCwgZ2wuY2FudmFzLmhlaWdodCk7XG4gICAgcmVuZGVyV2ViZ2wociwgbnVsbCwgUkVOREVSX1RBUkdFVC5QSUNLSU5HKTtcbiAgICByLnBpY2tpbmdGcmFtZUJ1ZmZlci5uZWVkc0RyYXcgPSBmYWxzZTtcbiAgfVxuICB2YXIgbiA9IHcgKiBoOyAvLyBudW1iZXIgb2YgcGl4ZWxzIHRvIHJlYWRcbiAgdmFyIGRhdGEgPSBuZXcgVWludDhBcnJheShuICogNCk7IC8vIDQgYnl0ZXMgcGVyIHBpeGVsXG4gIGdsLnJlYWRQaXhlbHMoeCwgeSwgdywgaCwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgZGF0YSk7XG4gIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgbnVsbCk7XG4gIHZhciBpbmRleGVzID0gbmV3IFNldCgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykge1xuICAgIHZhciBwaXhlbCA9IGRhdGEuc2xpY2UoaSAqIDQsIGkgKiA0ICsgNCk7XG4gICAgdmFyIGluZGV4ID0gdmVjNFRvSW5kZXgocGl4ZWwpIC0gMTsgLy8gVGhlIGZyYW1lYnVmZmVyIGlzIGNsZWFyZWQgd2l0aCAwcywgc28gei1pbmRleGVzIGFyZSBvZmZzZXQgYnkgMVxuICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICBpbmRleGVzLmFkZChpbmRleCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBpbmRleGVzO1xufVxuXG4vKipcbiAqIEN5LmpzOiBtb2RlbCBjb29yZGluYXRlIHkgYXhpcyBnb2VzIGRvd25cbiAqL1xuZnVuY3Rpb24gZmluZE5lYXJlc3RFbGVtZW50c1dlYmdsKHIsIHgsIHkpIHtcbiAgLy8gbW9kZWwgY29vcmRpbmF0ZXNcbiAgdmFyIGluZGV4ZXMgPSBnZXRQaWNraW5nSW5kZXhlcyhyLCB4LCB5KTtcbiAgdmFyIGVsZXMgPSByLmdldENhY2hlZFpTb3J0ZWRFbGVzKCk7XG4gIHZhciBub2RlLCBlZGdlO1xuICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoaW5kZXhlcyksXG4gICAgX3N0ZXA7XG4gIHRyeSB7XG4gICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHtcbiAgICAgIHZhciBpbmRleCA9IF9zdGVwLnZhbHVlO1xuICAgICAgdmFyIGVsZSA9IGVsZXNbaW5kZXhdO1xuICAgICAgaWYgKCFub2RlICYmIGVsZS5pc05vZGUoKSkge1xuICAgICAgICBub2RlID0gZWxlO1xuICAgICAgfVxuICAgICAgaWYgKCFlZGdlICYmIGVsZS5pc0VkZ2UoKSkge1xuICAgICAgICBlZGdlID0gZWxlO1xuICAgICAgfVxuICAgICAgaWYgKG5vZGUgJiYgZWRnZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIF9pdGVyYXRvci5lKGVycik7XG4gIH0gZmluYWxseSB7XG4gICAgX2l0ZXJhdG9yLmYoKTtcbiAgfVxuICByZXR1cm4gW25vZGUsIGVkZ2VdLmZpbHRlcihCb29sZWFuKTtcbn1cblxuLyoqXG4gKiBEcmF3IG9uZSBub2RlIG9yIGVkZ2UuIFxuICovXG5mdW5jdGlvbiBkcmF3RWxlKHIsIGluZGV4LCBlbGUpIHtcbiAgdmFyIGRyYXdpbmcgPSByLmRyYXdpbmc7XG4gIGluZGV4ICs9IDE7IC8vIDAgaXMgdXNlZCB0byBjbGVhciB0aGUgYmFja2dyb3VuZCwgbmVlZCB0byBvZmZzZXQgYWxsIHotaW5kZXhlcyBieSBvbmVcbiAgaWYgKGVsZS5pc05vZGUoKSkge1xuICAgIGRyYXdpbmcuZHJhd05vZGUoZWxlLCBpbmRleCwgJ25vZGUtdW5kZXJsYXknKTtcbiAgICBkcmF3aW5nLmRyYXdOb2RlKGVsZSwgaW5kZXgsICdub2RlLWJvZHknKTtcbiAgICBkcmF3aW5nLmRyYXdUZXh0dXJlKGVsZSwgaW5kZXgsICdsYWJlbCcpO1xuICAgIGRyYXdpbmcuZHJhd05vZGUoZWxlLCBpbmRleCwgJ25vZGUtb3ZlcmxheScpO1xuICB9IGVsc2Uge1xuICAgIGRyYXdpbmcuZHJhd0VkZ2VMaW5lKGVsZSwgaW5kZXgpO1xuICAgIGRyYXdpbmcuZHJhd0VkZ2VBcnJvdyhlbGUsIGluZGV4LCAnc291cmNlJyk7XG4gICAgZHJhd2luZy5kcmF3RWRnZUFycm93KGVsZSwgaW5kZXgsICd0YXJnZXQnKTtcbiAgICBkcmF3aW5nLmRyYXdUZXh0dXJlKGVsZSwgaW5kZXgsICdsYWJlbCcpO1xuICAgIGRyYXdpbmcuZHJhd1RleHR1cmUoZWxlLCBpbmRleCwgJ2VkZ2Utc291cmNlLWxhYmVsJyk7XG4gICAgZHJhd2luZy5kcmF3VGV4dHVyZShlbGUsIGluZGV4LCAnZWRnZS10YXJnZXQtbGFiZWwnKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlbmRlciBvbmUgZnJhbWUuXG4gKi9cbmZ1bmN0aW9uIHJlbmRlcldlYmdsKHIsIG9wdGlvbnMsIHJlbmRlclRhcmdldCkge1xuICB2YXIgc3RhcnQ7XG4gIGlmIChyLndlYmdsRGVidWcpIHtcbiAgICBzdGFydCA9IHBlcmZvcm1hbmNlLm5vdygpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4gIH1cbiAgdmFyIGRyYXdpbmcgPSByLmRyYXdpbmc7XG4gIHZhciBlbGVDb3VudCA9IDA7XG4gIGlmIChyZW5kZXJUYXJnZXQuc2NyZWVuKSB7XG4gICAgaWYgKHIuZGF0YS5jYW52YXNOZWVkc1JlZHJhd1tyLlNFTEVDVF9CT1hdKSB7XG4gICAgICBkcmF3U2VsZWN0aW9uUmVjdGFuZ2xlKHIsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHNlZSBkcmF3aW5nLWVsZW1lbnRzLmpzIGRyYXdDYWNoZWRFbGVtZW50KClcbiAgaWYgKHIuZGF0YS5jYW52YXNOZWVkc1JlZHJhd1tyLk5PREVdIHx8IHJlbmRlclRhcmdldC5waWNraW5nKSB7XG4gICAgdmFyIGdsID0gci5kYXRhLmNvbnRleHRzW3IuV0VCR0xdO1xuICAgIGlmIChyZW5kZXJUYXJnZXQuc2NyZWVuKSB7XG4gICAgICBnbC5jbGVhckNvbG9yKDAsIDAsIDAsIDApOyAvLyBiYWNrZ3JvdW5kIGNvbG9yXG4gICAgICBnbC5lbmFibGUoZ2wuQkxFTkQpOyAvLyBlbmFibGUgYWxwaGEgYmxlbmRpbmcgb2YgY29sb3JzXG4gICAgICBnbC5ibGVuZEZ1bmMoZ2wuT05FLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBKTsgLy8gd2ViZ2wgY29sb3JzIHVzZSBwcmVtdWx0aXBsaWVkIGFscGhhXG4gICAgfSBlbHNlIHtcbiAgICAgIGdsLmRpc2FibGUoZ2wuQkxFTkQpOyAvLyBkb24ndCBibGVuZCB6LW9yZGVyIGluZGV4IHZhbHVlcyEgdGhleSBhcmUgbm90IGNvbG9yc1xuICAgIH1cbiAgICBnbC5jbGVhcihnbC5DT0xPUl9CVUZGRVJfQklUIHwgZ2wuREVQVEhfQlVGRkVSX0JJVCk7XG4gICAgZ2wudmlld3BvcnQoMCwgMCwgZ2wuY2FudmFzLndpZHRoLCBnbC5jYW52YXMuaGVpZ2h0KTtcbiAgICB2YXIgcGFuWm9vbU1hdHJpeCA9IGNyZWF0ZVBhblpvb21NYXRyaXgocik7XG4gICAgdmFyIGVsZXMgPSByLmdldENhY2hlZFpTb3J0ZWRFbGVzKCk7XG4gICAgZWxlQ291bnQgPSBlbGVzLmxlbmd0aDtcbiAgICBkcmF3aW5nLnN0YXJ0RnJhbWUocGFuWm9vbU1hdHJpeCwgcmVuZGVyVGFyZ2V0KTtcbiAgICBpZiAocmVuZGVyVGFyZ2V0LnNjcmVlbikge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLm5vbmRyYWcubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZHJhd0VsZShyLCBpLCBlbGVzLm5vbmRyYWdbaV0pO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgZWxlcy5kcmFnLmxlbmd0aDsgX2kyKyspIHtcbiAgICAgICAgZHJhd0VsZShyLCBfaTIsIGVsZXMuZHJhZ1tfaTJdKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHJlbmRlclRhcmdldC5waWNraW5nKSB7XG4gICAgICBmb3IgKHZhciBfaTMgPSAwOyBfaTMgPCBlbGVzLmxlbmd0aDsgX2kzKyspIHtcbiAgICAgICAgZHJhd0VsZShyLCBfaTMsIGVsZXNbX2kzXSk7XG4gICAgICB9XG4gICAgfVxuICAgIGRyYXdpbmcuZW5kRnJhbWUoKTtcbiAgICBpZiAocmVuZGVyVGFyZ2V0LnNjcmVlbiAmJiByLndlYmdsRGVidWdTaG93QXRsYXNlcykge1xuICAgICAgZHJhd0F4ZXMocik7XG4gICAgICBkcmF3QXRsYXNlcyhyKTtcbiAgICB9XG4gICAgci5kYXRhLmNhbnZhc05lZWRzUmVkcmF3W3IuTk9ERV0gPSBmYWxzZTtcbiAgICByLmRhdGEuY2FudmFzTmVlZHNSZWRyYXdbci5EUkFHXSA9IGZhbHNlO1xuICB9XG4gIGlmIChyLndlYmdsRGVidWcpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgICB2YXIgZW5kID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgdmFyIGNvbXBhY3QgPSBmYWxzZTtcbiAgICB2YXIgdGltZSA9IE1hdGguY2VpbChlbmQgLSBzdGFydCk7XG4gICAgdmFyIGRlYnVnSW5mbyA9IGRyYXdpbmcuZ2V0RGVidWdJbmZvKCk7XG4gICAgdmFyIHJlcG9ydCA9IFtcIlwiLmNvbmNhdChlbGVDb3VudCwgXCIgZWxlbWVudHNcIiksIFwiXCIuY29uY2F0KGRlYnVnSW5mby50b3RhbEluc3RhbmNlcywgXCIgaW5zdGFuY2VzXCIpLCBcIlwiLmNvbmNhdChkZWJ1Z0luZm8uYmF0Y2hDb3VudCwgXCIgYmF0Y2hlc1wiKSwgXCJcIi5jb25jYXQoZGVidWdJbmZvLnRvdGFsQXRsYXNlcywgXCIgYXRsYXNlc1wiKSwgXCJcIi5jb25jYXQoZGVidWdJbmZvLndyYXBwZWRDb3VudCwgXCIgd3JhcHBlZCB0ZXh0dXJlc1wiKSwgXCJcIi5jb25jYXQoZGVidWdJbmZvLnNpbXBsZUNvdW50LCBcIiBzaW1wbGUgc2hhcGVzXCIpXS5qb2luKCcsICcpO1xuICAgIGlmIChjb21wYWN0KSB7XG4gICAgICBjb25zb2xlLmxvZyhcIldlYkdMIChcIi5jb25jYXQocmVuZGVyVGFyZ2V0Lm5hbWUsIFwiKSAtIHRpbWUgXCIpLmNvbmNhdCh0aW1lLCBcIm1zLCBcIikuY29uY2F0KHJlcG9ydCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZyhcIldlYkdMIChcIi5jb25jYXQocmVuZGVyVGFyZ2V0Lm5hbWUsIFwiKSAtIGZyYW1lIHRpbWUgXCIpLmNvbmNhdCh0aW1lLCBcIm1zXCIpKTtcbiAgICAgIGNvbnNvbGUubG9nKCdUb3RhbHM6Jyk7XG4gICAgICBjb25zb2xlLmxvZyhcIiAgXCIuY29uY2F0KHJlcG9ydCkpO1xuICAgICAgY29uc29sZS5sb2coJ1RleHR1cmUgQXRsYXNlcyBVc2VkOicpO1xuICAgICAgdmFyIGF0bGFzSW5mbyA9IGRlYnVnSW5mby5hdGxhc0luZm87XG4gICAgICB2YXIgX2l0ZXJhdG9yMiA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGF0bGFzSW5mbyksXG4gICAgICAgIF9zdGVwMjtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAoX2l0ZXJhdG9yMi5zKCk7ICEoX3N0ZXAyID0gX2l0ZXJhdG9yMi5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgdmFyIGluZm8gPSBfc3RlcDIudmFsdWU7XG4gICAgICAgICAgY29uc29sZS5sb2coXCIgIFwiLmNvbmNhdChpbmZvLnR5cGUsIFwiOiBcIikuY29uY2F0KGluZm8ua2V5Q291bnQsIFwiIGtleXMsIFwiKS5jb25jYXQoaW5mby5hdGxhc0NvdW50LCBcIiBhdGxhc2VzXCIpKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIF9pdGVyYXRvcjIuZShlcnIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgX2l0ZXJhdG9yMi5mKCk7XG4gICAgICB9XG4gICAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgfVxuICB9XG4gIGlmIChyLmRhdGEuZ2MpIHtcbiAgICBjb25zb2xlLmxvZygnR2FyYmFnZSBDb2xsZWN0IScpO1xuICAgIHIuZGF0YS5nYyA9IGZhbHNlO1xuICAgIGRyYXdpbmcuZ2MoKTtcbiAgfVxufVxuXG52YXIgQ1JwJDMgPSB7fTtcblxuLy8gQE8gUG9seWdvbiBkcmF3aW5nXG5DUnAkMy5kcmF3UG9seWdvblBhdGggPSBmdW5jdGlvbiAoY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgcG9pbnRzKSB7XG4gIHZhciBoYWxmVyA9IHdpZHRoIC8gMjtcbiAgdmFyIGhhbGZIID0gaGVpZ2h0IC8gMjtcbiAgaWYgKGNvbnRleHQuYmVnaW5QYXRoKSB7XG4gICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgfVxuICBjb250ZXh0Lm1vdmVUbyh4ICsgaGFsZlcgKiBwb2ludHNbMF0sIHkgKyBoYWxmSCAqIHBvaW50c1sxXSk7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgcG9pbnRzLmxlbmd0aCAvIDI7IGkrKykge1xuICAgIGNvbnRleHQubGluZVRvKHggKyBoYWxmVyAqIHBvaW50c1tpICogMl0sIHkgKyBoYWxmSCAqIHBvaW50c1tpICogMiArIDFdKTtcbiAgfVxuICBjb250ZXh0LmNsb3NlUGF0aCgpO1xufTtcbkNScCQzLmRyYXdSb3VuZFBvbHlnb25QYXRoID0gZnVuY3Rpb24gKGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIHBvaW50cywgY29ybmVycykge1xuICBjb3JuZXJzLmZvckVhY2goZnVuY3Rpb24gKGNvcm5lcikge1xuICAgIHJldHVybiBkcmF3UHJlcGFyZWRSb3VuZENvcm5lcihjb250ZXh0LCBjb3JuZXIpO1xuICB9KTtcbiAgY29udGV4dC5jbG9zZVBhdGgoKTtcbn07XG5cbi8vIFJvdW5kIHJlY3RhbmdsZSBkcmF3aW5nXG5DUnAkMy5kcmF3Um91bmRSZWN0YW5nbGVQYXRoID0gZnVuY3Rpb24gKGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIHJhZGl1cykge1xuICB2YXIgaGFsZldpZHRoID0gd2lkdGggLyAyO1xuICB2YXIgaGFsZkhlaWdodCA9IGhlaWdodCAvIDI7XG4gIHZhciBjb3JuZXJSYWRpdXMgPSByYWRpdXMgPT09ICdhdXRvJyA/IGdldFJvdW5kUmVjdGFuZ2xlUmFkaXVzKHdpZHRoLCBoZWlnaHQpIDogTWF0aC5taW4ocmFkaXVzLCBoYWxmSGVpZ2h0LCBoYWxmV2lkdGgpO1xuICBpZiAoY29udGV4dC5iZWdpblBhdGgpIHtcbiAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICB9XG5cbiAgLy8gU3RhcnQgYXQgdG9wIG1pZGRsZVxuICBjb250ZXh0Lm1vdmVUbyh4LCB5IC0gaGFsZkhlaWdodCk7XG4gIC8vIEFyYyBmcm9tIG1pZGRsZSB0b3AgdG8gcmlnaHQgc2lkZVxuICBjb250ZXh0LmFyY1RvKHggKyBoYWxmV2lkdGgsIHkgLSBoYWxmSGVpZ2h0LCB4ICsgaGFsZldpZHRoLCB5LCBjb3JuZXJSYWRpdXMpO1xuICAvLyBBcmMgZnJvbSByaWdodCBzaWRlIHRvIGJvdHRvbVxuICBjb250ZXh0LmFyY1RvKHggKyBoYWxmV2lkdGgsIHkgKyBoYWxmSGVpZ2h0LCB4LCB5ICsgaGFsZkhlaWdodCwgY29ybmVyUmFkaXVzKTtcbiAgLy8gQXJjIGZyb20gYm90dG9tIHRvIGxlZnQgc2lkZVxuICBjb250ZXh0LmFyY1RvKHggLSBoYWxmV2lkdGgsIHkgKyBoYWxmSGVpZ2h0LCB4IC0gaGFsZldpZHRoLCB5LCBjb3JuZXJSYWRpdXMpO1xuICAvLyBBcmMgZnJvbSBsZWZ0IHNpZGUgdG8gdG9wQm9yZGVyXG4gIGNvbnRleHQuYXJjVG8oeCAtIGhhbGZXaWR0aCwgeSAtIGhhbGZIZWlnaHQsIHgsIHkgLSBoYWxmSGVpZ2h0LCBjb3JuZXJSYWRpdXMpO1xuICAvLyBKb2luIGxpbmVcbiAgY29udGV4dC5saW5lVG8oeCwgeSAtIGhhbGZIZWlnaHQpO1xuICBjb250ZXh0LmNsb3NlUGF0aCgpO1xufTtcbkNScCQzLmRyYXdCb3R0b21Sb3VuZFJlY3RhbmdsZVBhdGggPSBmdW5jdGlvbiAoY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgcmFkaXVzKSB7XG4gIHZhciBoYWxmV2lkdGggPSB3aWR0aCAvIDI7XG4gIHZhciBoYWxmSGVpZ2h0ID0gaGVpZ2h0IC8gMjtcbiAgdmFyIGNvcm5lclJhZGl1cyA9IHJhZGl1cyA9PT0gJ2F1dG8nID8gZ2V0Um91bmRSZWN0YW5nbGVSYWRpdXMod2lkdGgsIGhlaWdodCkgOiByYWRpdXM7XG4gIGlmIChjb250ZXh0LmJlZ2luUGF0aCkge1xuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gIH1cblxuICAvLyBTdGFydCBhdCB0b3AgbWlkZGxlXG4gIGNvbnRleHQubW92ZVRvKHgsIHkgLSBoYWxmSGVpZ2h0KTtcbiAgY29udGV4dC5saW5lVG8oeCArIGhhbGZXaWR0aCwgeSAtIGhhbGZIZWlnaHQpO1xuICBjb250ZXh0LmxpbmVUbyh4ICsgaGFsZldpZHRoLCB5KTtcbiAgY29udGV4dC5hcmNUbyh4ICsgaGFsZldpZHRoLCB5ICsgaGFsZkhlaWdodCwgeCwgeSArIGhhbGZIZWlnaHQsIGNvcm5lclJhZGl1cyk7XG4gIGNvbnRleHQuYXJjVG8oeCAtIGhhbGZXaWR0aCwgeSArIGhhbGZIZWlnaHQsIHggLSBoYWxmV2lkdGgsIHksIGNvcm5lclJhZGl1cyk7XG4gIGNvbnRleHQubGluZVRvKHggLSBoYWxmV2lkdGgsIHkgLSBoYWxmSGVpZ2h0KTtcbiAgY29udGV4dC5saW5lVG8oeCwgeSAtIGhhbGZIZWlnaHQpO1xuICBjb250ZXh0LmNsb3NlUGF0aCgpO1xufTtcbkNScCQzLmRyYXdDdXRSZWN0YW5nbGVQYXRoID0gZnVuY3Rpb24gKGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIHBvaW50cywgY29ybmVycykge1xuICB2YXIgaGFsZldpZHRoID0gd2lkdGggLyAyO1xuICB2YXIgaGFsZkhlaWdodCA9IGhlaWdodCAvIDI7XG4gIHZhciBjb3JuZXJMZW5ndGggPSBjb3JuZXJzID09PSAnYXV0bycgPyBnZXRDdXRSZWN0YW5nbGVDb3JuZXJMZW5ndGgoKSA6IGNvcm5lcnM7XG4gIGlmIChjb250ZXh0LmJlZ2luUGF0aCkge1xuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gIH1cbiAgY29udGV4dC5tb3ZlVG8oeCAtIGhhbGZXaWR0aCArIGNvcm5lckxlbmd0aCwgeSAtIGhhbGZIZWlnaHQpO1xuICBjb250ZXh0LmxpbmVUbyh4ICsgaGFsZldpZHRoIC0gY29ybmVyTGVuZ3RoLCB5IC0gaGFsZkhlaWdodCk7XG4gIGNvbnRleHQubGluZVRvKHggKyBoYWxmV2lkdGgsIHkgLSBoYWxmSGVpZ2h0ICsgY29ybmVyTGVuZ3RoKTtcbiAgY29udGV4dC5saW5lVG8oeCArIGhhbGZXaWR0aCwgeSArIGhhbGZIZWlnaHQgLSBjb3JuZXJMZW5ndGgpO1xuICBjb250ZXh0LmxpbmVUbyh4ICsgaGFsZldpZHRoIC0gY29ybmVyTGVuZ3RoLCB5ICsgaGFsZkhlaWdodCk7XG4gIGNvbnRleHQubGluZVRvKHggLSBoYWxmV2lkdGggKyBjb3JuZXJMZW5ndGgsIHkgKyBoYWxmSGVpZ2h0KTtcbiAgY29udGV4dC5saW5lVG8oeCAtIGhhbGZXaWR0aCwgeSArIGhhbGZIZWlnaHQgLSBjb3JuZXJMZW5ndGgpO1xuICBjb250ZXh0LmxpbmVUbyh4IC0gaGFsZldpZHRoLCB5IC0gaGFsZkhlaWdodCArIGNvcm5lckxlbmd0aCk7XG4gIGNvbnRleHQuY2xvc2VQYXRoKCk7XG59O1xuQ1JwJDMuZHJhd0JhcnJlbFBhdGggPSBmdW5jdGlvbiAoY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCkge1xuICB2YXIgaGFsZldpZHRoID0gd2lkdGggLyAyO1xuICB2YXIgaGFsZkhlaWdodCA9IGhlaWdodCAvIDI7XG4gIHZhciB4QmVnaW4gPSB4IC0gaGFsZldpZHRoO1xuICB2YXIgeEVuZCA9IHggKyBoYWxmV2lkdGg7XG4gIHZhciB5QmVnaW4gPSB5IC0gaGFsZkhlaWdodDtcbiAgdmFyIHlFbmQgPSB5ICsgaGFsZkhlaWdodDtcbiAgdmFyIGJhcnJlbEN1cnZlQ29uc3RhbnRzID0gZ2V0QmFycmVsQ3VydmVDb25zdGFudHMod2lkdGgsIGhlaWdodCk7XG4gIHZhciB3T2Zmc2V0ID0gYmFycmVsQ3VydmVDb25zdGFudHMud2lkdGhPZmZzZXQ7XG4gIHZhciBoT2Zmc2V0ID0gYmFycmVsQ3VydmVDb25zdGFudHMuaGVpZ2h0T2Zmc2V0O1xuICB2YXIgY3RybFB0WE9mZnNldCA9IGJhcnJlbEN1cnZlQ29uc3RhbnRzLmN0cmxQdE9mZnNldFBjdCAqIHdPZmZzZXQ7XG4gIGlmIChjb250ZXh0LmJlZ2luUGF0aCkge1xuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gIH1cbiAgY29udGV4dC5tb3ZlVG8oeEJlZ2luLCB5QmVnaW4gKyBoT2Zmc2V0KTtcbiAgY29udGV4dC5saW5lVG8oeEJlZ2luLCB5RW5kIC0gaE9mZnNldCk7XG4gIGNvbnRleHQucXVhZHJhdGljQ3VydmVUbyh4QmVnaW4gKyBjdHJsUHRYT2Zmc2V0LCB5RW5kLCB4QmVnaW4gKyB3T2Zmc2V0LCB5RW5kKTtcbiAgY29udGV4dC5saW5lVG8oeEVuZCAtIHdPZmZzZXQsIHlFbmQpO1xuICBjb250ZXh0LnF1YWRyYXRpY0N1cnZlVG8oeEVuZCAtIGN0cmxQdFhPZmZzZXQsIHlFbmQsIHhFbmQsIHlFbmQgLSBoT2Zmc2V0KTtcbiAgY29udGV4dC5saW5lVG8oeEVuZCwgeUJlZ2luICsgaE9mZnNldCk7XG4gIGNvbnRleHQucXVhZHJhdGljQ3VydmVUbyh4RW5kIC0gY3RybFB0WE9mZnNldCwgeUJlZ2luLCB4RW5kIC0gd09mZnNldCwgeUJlZ2luKTtcbiAgY29udGV4dC5saW5lVG8oeEJlZ2luICsgd09mZnNldCwgeUJlZ2luKTtcbiAgY29udGV4dC5xdWFkcmF0aWNDdXJ2ZVRvKHhCZWdpbiArIGN0cmxQdFhPZmZzZXQsIHlCZWdpbiwgeEJlZ2luLCB5QmVnaW4gKyBoT2Zmc2V0KTtcbiAgY29udGV4dC5jbG9zZVBhdGgoKTtcbn07XG52YXIgc2luMCA9IE1hdGguc2luKDApO1xudmFyIGNvczAgPSBNYXRoLmNvcygwKTtcbnZhciBzaW4gPSB7fTtcbnZhciBjb3MgPSB7fTtcbnZhciBlbGxpcHNlU3RlcFNpemUgPSBNYXRoLlBJIC8gNDA7XG5mb3IgKHZhciBpID0gMCAqIE1hdGguUEk7IGkgPCAyICogTWF0aC5QSTsgaSArPSBlbGxpcHNlU3RlcFNpemUpIHtcbiAgc2luW2ldID0gTWF0aC5zaW4oaSk7XG4gIGNvc1tpXSA9IE1hdGguY29zKGkpO1xufVxuQ1JwJDMuZHJhd0VsbGlwc2VQYXRoID0gZnVuY3Rpb24gKGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQpIHtcbiAgaWYgKGNvbnRleHQuYmVnaW5QYXRoKSB7XG4gICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgfVxuICBpZiAoY29udGV4dC5lbGxpcHNlKSB7XG4gICAgY29udGV4dC5lbGxpcHNlKGNlbnRlclgsIGNlbnRlclksIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMiwgMCwgMCwgMiAqIE1hdGguUEkpO1xuICB9IGVsc2Uge1xuICAgIHZhciB4UG9zLCB5UG9zO1xuICAgIHZhciBydyA9IHdpZHRoIC8gMjtcbiAgICB2YXIgcmggPSBoZWlnaHQgLyAyO1xuICAgIGZvciAodmFyIGkgPSAwICogTWF0aC5QSTsgaSA8IDIgKiBNYXRoLlBJOyBpICs9IGVsbGlwc2VTdGVwU2l6ZSkge1xuICAgICAgeFBvcyA9IGNlbnRlclggLSBydyAqIHNpbltpXSAqIHNpbjAgKyBydyAqIGNvc1tpXSAqIGNvczA7XG4gICAgICB5UG9zID0gY2VudGVyWSArIHJoICogY29zW2ldICogc2luMCArIHJoICogc2luW2ldICogY29zMDtcbiAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgIGNvbnRleHQubW92ZVRvKHhQb3MsIHlQb3MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGV4dC5saW5lVG8oeFBvcywgeVBvcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbnRleHQuY2xvc2VQYXRoKCk7XG59O1xuXG4vKiBnbG9iYWwgYXRvYiwgQXJyYXlCdWZmZXIsIFVpbnQ4QXJyYXksIEJsb2IgKi9cblxudmFyIENScCQyID0ge307XG5DUnAkMi5jcmVhdGVCdWZmZXIgPSBmdW5jdGlvbiAodywgaCkge1xuICB2YXIgYnVmZmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiAgYnVmZmVyLndpZHRoID0gdztcbiAgYnVmZmVyLmhlaWdodCA9IGg7XG4gIHJldHVybiBbYnVmZmVyLCBidWZmZXIuZ2V0Q29udGV4dCgnMmQnKV07XG59O1xuQ1JwJDIuYnVmZmVyQ2FudmFzSW1hZ2UgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICB2YXIgY3kgPSB0aGlzLmN5O1xuICB2YXIgZWxlcyA9IGN5Lm11dGFibGVFbGVtZW50cygpO1xuICB2YXIgYmIgPSBlbGVzLmJvdW5kaW5nQm94KCk7XG4gIHZhciBjdHJSZWN0ID0gdGhpcy5maW5kQ29udGFpbmVyQ2xpZW50Q29vcmRzKCk7XG4gIHZhciB3aWR0aCA9IG9wdGlvbnMuZnVsbCA/IE1hdGguY2VpbChiYi53KSA6IGN0clJlY3RbMl07XG4gIHZhciBoZWlnaHQgPSBvcHRpb25zLmZ1bGwgPyBNYXRoLmNlaWwoYmIuaCkgOiBjdHJSZWN0WzNdO1xuICB2YXIgc3BlY2RNYXhEaW1zID0gbnVtYmVyJDEob3B0aW9ucy5tYXhXaWR0aCkgfHwgbnVtYmVyJDEob3B0aW9ucy5tYXhIZWlnaHQpO1xuICB2YXIgcHhSYXRpbyA9IHRoaXMuZ2V0UGl4ZWxSYXRpbygpO1xuICB2YXIgc2NhbGUgPSAxO1xuICBpZiAob3B0aW9ucy5zY2FsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgd2lkdGggKj0gb3B0aW9ucy5zY2FsZTtcbiAgICBoZWlnaHQgKj0gb3B0aW9ucy5zY2FsZTtcbiAgICBzY2FsZSA9IG9wdGlvbnMuc2NhbGU7XG4gIH0gZWxzZSBpZiAoc3BlY2RNYXhEaW1zKSB7XG4gICAgdmFyIG1heFNjYWxlVyA9IEluZmluaXR5O1xuICAgIHZhciBtYXhTY2FsZUggPSBJbmZpbml0eTtcbiAgICBpZiAobnVtYmVyJDEob3B0aW9ucy5tYXhXaWR0aCkpIHtcbiAgICAgIG1heFNjYWxlVyA9IHNjYWxlICogb3B0aW9ucy5tYXhXaWR0aCAvIHdpZHRoO1xuICAgIH1cbiAgICBpZiAobnVtYmVyJDEob3B0aW9ucy5tYXhIZWlnaHQpKSB7XG4gICAgICBtYXhTY2FsZUggPSBzY2FsZSAqIG9wdGlvbnMubWF4SGVpZ2h0IC8gaGVpZ2h0O1xuICAgIH1cbiAgICBzY2FsZSA9IE1hdGgubWluKG1heFNjYWxlVywgbWF4U2NhbGVIKTtcbiAgICB3aWR0aCAqPSBzY2FsZTtcbiAgICBoZWlnaHQgKj0gc2NhbGU7XG4gIH1cbiAgaWYgKCFzcGVjZE1heERpbXMpIHtcbiAgICB3aWR0aCAqPSBweFJhdGlvO1xuICAgIGhlaWdodCAqPSBweFJhdGlvO1xuICAgIHNjYWxlICo9IHB4UmF0aW87XG4gIH1cbiAgdmFyIGJ1ZmZDYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuXG4gIGJ1ZmZDYW52YXMud2lkdGggPSB3aWR0aDtcbiAgYnVmZkNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gIGJ1ZmZDYW52YXMuc3R5bGUud2lkdGggPSB3aWR0aCArICdweCc7XG4gIGJ1ZmZDYW52YXMuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JztcbiAgdmFyIGJ1ZmZDeHQgPSBidWZmQ2FudmFzLmdldENvbnRleHQoJzJkJyk7XG5cbiAgLy8gUmFzdGVyaXplIHRoZSBsYXllcnMsIGJ1dCBvbmx5IGlmIGNvbnRhaW5lciBoYXMgbm9uemVybyBzaXplXG4gIGlmICh3aWR0aCA+IDAgJiYgaGVpZ2h0ID4gMCkge1xuICAgIGJ1ZmZDeHQuY2xlYXJSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgIGJ1ZmZDeHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ3NvdXJjZS1vdmVyJztcbiAgICB2YXIgenNvcnRlZEVsZXMgPSB0aGlzLmdldENhY2hlZFpTb3J0ZWRFbGVzKCk7XG4gICAgaWYgKG9wdGlvbnMuZnVsbCkge1xuICAgICAgLy8gZHJhdyB0aGUgZnVsbCBib3VuZHMgb2YgdGhlIGdyYXBoXG4gICAgICBidWZmQ3h0LnRyYW5zbGF0ZSgtYmIueDEgKiBzY2FsZSwgLWJiLnkxICogc2NhbGUpO1xuICAgICAgYnVmZkN4dC5zY2FsZShzY2FsZSwgc2NhbGUpO1xuICAgICAgdGhpcy5kcmF3RWxlbWVudHMoYnVmZkN4dCwgenNvcnRlZEVsZXMpO1xuICAgICAgYnVmZkN4dC5zY2FsZSgxIC8gc2NhbGUsIDEgLyBzY2FsZSk7XG4gICAgICBidWZmQ3h0LnRyYW5zbGF0ZShiYi54MSAqIHNjYWxlLCBiYi55MSAqIHNjYWxlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZHJhdyB0aGUgY3VycmVudCB2aWV3XG4gICAgICB2YXIgcGFuID0gY3kucGFuKCk7XG4gICAgICB2YXIgdHJhbnNsYXRpb24gPSB7XG4gICAgICAgIHg6IHBhbi54ICogc2NhbGUsXG4gICAgICAgIHk6IHBhbi55ICogc2NhbGVcbiAgICAgIH07XG4gICAgICBzY2FsZSAqPSBjeS56b29tKCk7XG4gICAgICBidWZmQ3h0LnRyYW5zbGF0ZSh0cmFuc2xhdGlvbi54LCB0cmFuc2xhdGlvbi55KTtcbiAgICAgIGJ1ZmZDeHQuc2NhbGUoc2NhbGUsIHNjYWxlKTtcbiAgICAgIHRoaXMuZHJhd0VsZW1lbnRzKGJ1ZmZDeHQsIHpzb3J0ZWRFbGVzKTtcbiAgICAgIGJ1ZmZDeHQuc2NhbGUoMSAvIHNjYWxlLCAxIC8gc2NhbGUpO1xuICAgICAgYnVmZkN4dC50cmFuc2xhdGUoLXRyYW5zbGF0aW9uLngsIC10cmFuc2xhdGlvbi55KTtcbiAgICB9XG5cbiAgICAvLyBuZWVkIHRvIGZpbGwgYmcgYXQgZW5kIGxpa2UgdGhpcyBpbiBvcmRlciB0byBmaWxsIGNsZWFyZWQgdHJhbnNwYXJlbnQgcGl4ZWxzIGluIGpwZ3NcbiAgICBpZiAob3B0aW9ucy5iZykge1xuICAgICAgYnVmZkN4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAnZGVzdGluYXRpb24tb3Zlcic7XG4gICAgICBidWZmQ3h0LmZpbGxTdHlsZSA9IG9wdGlvbnMuYmc7XG4gICAgICBidWZmQ3h0LnJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICBidWZmQ3h0LmZpbGwoKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGJ1ZmZDYW52YXM7XG59O1xuZnVuY3Rpb24gYjY0VG9CbG9iKGI2NCwgbWltZVR5cGUpIHtcbiAgdmFyIGJ5dGVzID0gYXRvYihiNjQpO1xuICB2YXIgYnVmZiA9IG5ldyBBcnJheUJ1ZmZlcihieXRlcy5sZW5ndGgpO1xuICB2YXIgYnVmZlVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkoYnVmZik7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICBidWZmVWludDhbaV0gPSBieXRlcy5jaGFyQ29kZUF0KGkpO1xuICB9XG4gIHJldHVybiBuZXcgQmxvYihbYnVmZl0sIHtcbiAgICB0eXBlOiBtaW1lVHlwZVxuICB9KTtcbn1cbmZ1bmN0aW9uIGI2NFVyaVRvQjY0KGI2NHVyaSkge1xuICB2YXIgaSA9IGI2NHVyaS5pbmRleE9mKCcsJyk7XG4gIHJldHVybiBiNjR1cmkuc3Vic3RyKGkgKyAxKTtcbn1cbmZ1bmN0aW9uIG91dHB1dChvcHRpb25zLCBjYW52YXMsIG1pbWVUeXBlKSB7XG4gIHZhciBnZXRCNjRVcmkgPSBmdW5jdGlvbiBnZXRCNjRVcmkoKSB7XG4gICAgcmV0dXJuIGNhbnZhcy50b0RhdGFVUkwobWltZVR5cGUsIG9wdGlvbnMucXVhbGl0eSk7XG4gIH07XG4gIHN3aXRjaCAob3B0aW9ucy5vdXRwdXQpIHtcbiAgICBjYXNlICdibG9iLXByb21pc2UnOlxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlJDEoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNhbnZhcy50b0Jsb2IoZnVuY3Rpb24gKGJsb2IpIHtcbiAgICAgICAgICAgIGlmIChibG9iICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZShibG9iKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ2BjYW52YXMudG9CbG9iKClgIHNlbnQgYSBudWxsIHZhbHVlIGluIGl0cyBjYWxsYmFjaycpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCBtaW1lVHlwZSwgb3B0aW9ucy5xdWFsaXR5KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIGNhc2UgJ2Jsb2InOlxuICAgICAgcmV0dXJuIGI2NFRvQmxvYihiNjRVcmlUb0I2NChnZXRCNjRVcmkoKSksIG1pbWVUeXBlKTtcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgcmV0dXJuIGI2NFVyaVRvQjY0KGdldEI2NFVyaSgpKTtcbiAgICBjYXNlICdiYXNlNjR1cmknOlxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZ2V0QjY0VXJpKCk7XG4gIH1cbn1cbkNScCQyLnBuZyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIHJldHVybiBvdXRwdXQob3B0aW9ucywgdGhpcy5idWZmZXJDYW52YXNJbWFnZShvcHRpb25zKSwgJ2ltYWdlL3BuZycpO1xufTtcbkNScCQyLmpwZyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIHJldHVybiBvdXRwdXQob3B0aW9ucywgdGhpcy5idWZmZXJDYW52YXNJbWFnZShvcHRpb25zKSwgJ2ltYWdlL2pwZWcnKTtcbn07XG5cbnZhciBDUnAkMSA9IHt9O1xuQ1JwJDEubm9kZVNoYXBlSW1wbCA9IGZ1bmN0aW9uIChuYW1lLCBjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBwb2ludHMsIGNvcm5lcnMpIHtcbiAgc3dpdGNoIChuYW1lKSB7XG4gICAgY2FzZSAnZWxsaXBzZSc6XG4gICAgICByZXR1cm4gdGhpcy5kcmF3RWxsaXBzZVBhdGgoY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCk7XG4gICAgY2FzZSAncG9seWdvbic6XG4gICAgICByZXR1cm4gdGhpcy5kcmF3UG9seWdvblBhdGgoY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgcG9pbnRzKTtcbiAgICBjYXNlICdyb3VuZC1wb2x5Z29uJzpcbiAgICAgIHJldHVybiB0aGlzLmRyYXdSb3VuZFBvbHlnb25QYXRoKGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHBvaW50cywgY29ybmVycyk7XG4gICAgY2FzZSAncm91bmRyZWN0YW5nbGUnOlxuICAgIGNhc2UgJ3JvdW5kLXJlY3RhbmdsZSc6XG4gICAgICByZXR1cm4gdGhpcy5kcmF3Um91bmRSZWN0YW5nbGVQYXRoKGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIGNvcm5lcnMpO1xuICAgIGNhc2UgJ2N1dHJlY3RhbmdsZSc6XG4gICAgY2FzZSAnY3V0LXJlY3RhbmdsZSc6XG4gICAgICByZXR1cm4gdGhpcy5kcmF3Q3V0UmVjdGFuZ2xlUGF0aChjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBwb2ludHMsIGNvcm5lcnMpO1xuICAgIGNhc2UgJ2JvdHRvbXJvdW5kcmVjdGFuZ2xlJzpcbiAgICBjYXNlICdib3R0b20tcm91bmQtcmVjdGFuZ2xlJzpcbiAgICAgIHJldHVybiB0aGlzLmRyYXdCb3R0b21Sb3VuZFJlY3RhbmdsZVBhdGgoY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgY29ybmVycyk7XG4gICAgY2FzZSAnYmFycmVsJzpcbiAgICAgIHJldHVybiB0aGlzLmRyYXdCYXJyZWxQYXRoKGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQpO1xuICB9XG59O1xuXG52YXIgQ1IgPSBDYW52YXNSZW5kZXJlcjtcbnZhciBDUnAgPSBDYW52YXNSZW5kZXJlci5wcm90b3R5cGU7XG5DUnAuQ0FOVkFTX0xBWUVSUyA9IDM7XG4vL1xuQ1JwLlNFTEVDVF9CT1ggPSAwO1xuQ1JwLkRSQUcgPSAxO1xuQ1JwLk5PREUgPSAyO1xuQ1JwLldFQkdMID0gMztcbkNScC5DQU5WQVNfVFlQRVMgPSBbJzJkJywgJzJkJywgJzJkJywgJ3dlYmdsMiddO1xuQ1JwLkJVRkZFUl9DT1VOVCA9IDM7XG4vL1xuQ1JwLlRFWFRVUkVfQlVGRkVSID0gMDtcbkNScC5NT1RJT05CTFVSX0JVRkZFUl9OT0RFID0gMTtcbkNScC5NT1RJT05CTFVSX0JVRkZFUl9EUkFHID0gMjtcbmZ1bmN0aW9uIENhbnZhc1JlbmRlcmVyKG9wdGlvbnMpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgY29udGFpbmVyV2luZG93ID0gci5jeS53aW5kb3coKTtcbiAgdmFyIGRvY3VtZW50ID0gY29udGFpbmVyV2luZG93LmRvY3VtZW50O1xuICBpZiAob3B0aW9ucy53ZWJnbCkge1xuICAgIENScC5DQU5WQVNfTEFZRVJTID0gci5DQU5WQVNfTEFZRVJTID0gNDtcbiAgICBjb25zb2xlLmxvZygnd2ViZ2wgcmVuZGVyaW5nIGVuYWJsZWQnKTtcbiAgfVxuICByLmRhdGEgPSB7XG4gICAgY2FudmFzZXM6IG5ldyBBcnJheShDUnAuQ0FOVkFTX0xBWUVSUyksXG4gICAgY29udGV4dHM6IG5ldyBBcnJheShDUnAuQ0FOVkFTX0xBWUVSUyksXG4gICAgY2FudmFzTmVlZHNSZWRyYXc6IG5ldyBBcnJheShDUnAuQ0FOVkFTX0xBWUVSUyksXG4gICAgYnVmZmVyQ2FudmFzZXM6IG5ldyBBcnJheShDUnAuQlVGRkVSX0NPVU5UKSxcbiAgICBidWZmZXJDb250ZXh0czogbmV3IEFycmF5KENScC5DQU5WQVNfTEFZRVJTKVxuICB9O1xuICB2YXIgdGFwSGxPZmZBdHRyID0gJy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcic7XG4gIHZhciB0YXBIbE9mZlN0eWxlID0gJ3JnYmEoMCwwLDAsMCknO1xuICByLmRhdGEuY2FudmFzQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiAgdmFyIGNvbnRhaW5lclN0eWxlID0gci5kYXRhLmNhbnZhc0NvbnRhaW5lci5zdHlsZTtcbiAgci5kYXRhLmNhbnZhc0NvbnRhaW5lci5zdHlsZVt0YXBIbE9mZkF0dHJdID0gdGFwSGxPZmZTdHlsZTtcbiAgY29udGFpbmVyU3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xuICBjb250YWluZXJTdHlsZS56SW5kZXggPSAnMCc7XG4gIGNvbnRhaW5lclN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XG4gIHZhciBjb250YWluZXIgPSBvcHRpb25zLmN5LmNvbnRhaW5lcigpO1xuICBjb250YWluZXIuYXBwZW5kQ2hpbGQoci5kYXRhLmNhbnZhc0NvbnRhaW5lcik7XG4gIGNvbnRhaW5lci5zdHlsZVt0YXBIbE9mZkF0dHJdID0gdGFwSGxPZmZTdHlsZTtcbiAgdmFyIHN0eWxlTWFwID0ge1xuICAgICctd2Via2l0LXVzZXItc2VsZWN0JzogJ25vbmUnLFxuICAgICctbW96LXVzZXItc2VsZWN0JzogJy1tb3otbm9uZScsXG4gICAgJ3VzZXItc2VsZWN0JzogJ25vbmUnLFxuICAgICctd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3InOiAncmdiYSgwLDAsMCwwKScsXG4gICAgJ291dGxpbmUtc3R5bGUnOiAnbm9uZSdcbiAgfTtcbiAgaWYgKG1zKCkpIHtcbiAgICBzdHlsZU1hcFsnLW1zLXRvdWNoLWFjdGlvbiddID0gJ25vbmUnO1xuICAgIHN0eWxlTWFwWyd0b3VjaC1hY3Rpb24nXSA9ICdub25lJztcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IENScC5DQU5WQVNfTEFZRVJTOyBpKyspIHtcbiAgICB2YXIgY2FudmFzID0gci5kYXRhLmNhbnZhc2VzW2ldID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiAgICB2YXIgdHlwZSA9IENScC5DQU5WQVNfVFlQRVNbaV07XG4gICAgci5kYXRhLmNvbnRleHRzW2ldID0gY2FudmFzLmdldENvbnRleHQodHlwZSk7XG4gICAgaWYgKCFyLmRhdGEuY29udGV4dHNbaV0pIHtcbiAgICAgIGVycm9yKCdDb3VsZCBub3QgY3JlYXRlIGNhbnZhcyBvZiB0eXBlICcgKyB0eXBlKTtcbiAgICB9XG4gICAgT2JqZWN0LmtleXMoc3R5bGVNYXApLmZvckVhY2goZnVuY3Rpb24gKGspIHtcbiAgICAgIGNhbnZhcy5zdHlsZVtrXSA9IHN0eWxlTWFwW2tdO1xuICAgIH0pO1xuICAgIGNhbnZhcy5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgY2FudmFzLnNldEF0dHJpYnV0ZSgnZGF0YS1pZCcsICdsYXllcicgKyBpKTtcbiAgICBjYW52YXMuc3R5bGUuekluZGV4ID0gU3RyaW5nKENScC5DQU5WQVNfTEFZRVJTIC0gaSk7XG4gICAgci5kYXRhLmNhbnZhc0NvbnRhaW5lci5hcHBlbmRDaGlsZChjYW52YXMpO1xuICAgIHIuZGF0YS5jYW52YXNOZWVkc1JlZHJhd1tpXSA9IGZhbHNlO1xuICB9XG4gIHIuZGF0YS50b3BDYW52YXMgPSByLmRhdGEuY2FudmFzZXNbMF07XG4gIHIuZGF0YS5jYW52YXNlc1tDUnAuTk9ERV0uc2V0QXR0cmlidXRlKCdkYXRhLWlkJywgJ2xheWVyJyArIENScC5OT0RFICsgJy1ub2RlJyk7XG4gIHIuZGF0YS5jYW52YXNlc1tDUnAuU0VMRUNUX0JPWF0uc2V0QXR0cmlidXRlKCdkYXRhLWlkJywgJ2xheWVyJyArIENScC5TRUxFQ1RfQk9YICsgJy1zZWxlY3Rib3gnKTtcbiAgci5kYXRhLmNhbnZhc2VzW0NScC5EUkFHXS5zZXRBdHRyaWJ1dGUoJ2RhdGEtaWQnLCAnbGF5ZXInICsgQ1JwLkRSQUcgKyAnLWRyYWcnKTtcbiAgaWYgKHIuZGF0YS5jYW52YXNlc1tDUnAuV0VCR0xdKSB7XG4gICAgci5kYXRhLmNhbnZhc2VzW0NScC5XRUJHTF0uc2V0QXR0cmlidXRlKCdkYXRhLWlkJywgJ2xheWVyJyArIENScC5XRUJHTCArICctd2ViZ2wnKTtcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IENScC5CVUZGRVJfQ09VTlQ7IGkrKykge1xuICAgIHIuZGF0YS5idWZmZXJDYW52YXNlc1tpXSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4gICAgci5kYXRhLmJ1ZmZlckNvbnRleHRzW2ldID0gci5kYXRhLmJ1ZmZlckNhbnZhc2VzW2ldLmdldENvbnRleHQoJzJkJyk7XG4gICAgci5kYXRhLmJ1ZmZlckNhbnZhc2VzW2ldLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICByLmRhdGEuYnVmZmVyQ2FudmFzZXNbaV0uc2V0QXR0cmlidXRlKCdkYXRhLWlkJywgJ2J1ZmZlcicgKyBpKTtcbiAgICByLmRhdGEuYnVmZmVyQ2FudmFzZXNbaV0uc3R5bGUuekluZGV4ID0gU3RyaW5nKC1pIC0gMSk7XG4gICAgci5kYXRhLmJ1ZmZlckNhbnZhc2VzW2ldLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAvL3IuZGF0YS5jYW52YXNDb250YWluZXIuYXBwZW5kQ2hpbGQoci5kYXRhLmJ1ZmZlckNhbnZhc2VzW2ldKTtcbiAgfVxuICByLnBhdGhzRW5hYmxlZCA9IHRydWU7XG4gIHZhciBlbXB0eUJiID0gbWFrZUJvdW5kaW5nQm94KCk7XG4gIHZhciBnZXRCb3hDZW50ZXIgPSBmdW5jdGlvbiBnZXRCb3hDZW50ZXIoYmIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgeDogKGJiLngxICsgYmIueDIpIC8gMixcbiAgICAgIHk6IChiYi55MSArIGJiLnkyKSAvIDJcbiAgICB9O1xuICB9O1xuICB2YXIgZ2V0Q2VudGVyT2Zmc2V0ID0gZnVuY3Rpb24gZ2V0Q2VudGVyT2Zmc2V0KGJiKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IC1iYi53IC8gMixcbiAgICAgIHk6IC1iYi5oIC8gMlxuICAgIH07XG4gIH07XG4gIHZhciBiYWNrZ3JvdW5kVGltZXN0YW1wSGFzQ2hhbmdlZCA9IGZ1bmN0aW9uIGJhY2tncm91bmRUaW1lc3RhbXBIYXNDaGFuZ2VkKGVsZSkge1xuICAgIHZhciBfcCA9IGVsZVswXS5fcHJpdmF0ZTtcbiAgICB2YXIgc2FtZSA9IF9wLm9sZEJhY2tncm91bmRUaW1lc3RhbXAgPT09IF9wLmJhY2tncm91bmRUaW1lc3RhbXA7XG4gICAgcmV0dXJuICFzYW1lO1xuICB9O1xuICB2YXIgZ2V0U3R5bGVLZXkgPSBmdW5jdGlvbiBnZXRTdHlsZUtleShlbGUpIHtcbiAgICByZXR1cm4gZWxlWzBdLl9wcml2YXRlLm5vZGVLZXk7XG4gIH07XG4gIHZhciBnZXRMYWJlbEtleSA9IGZ1bmN0aW9uIGdldExhYmVsS2V5KGVsZSkge1xuICAgIHJldHVybiBlbGVbMF0uX3ByaXZhdGUubGFiZWxTdHlsZUtleTtcbiAgfTtcbiAgdmFyIGdldFNvdXJjZUxhYmVsS2V5ID0gZnVuY3Rpb24gZ2V0U291cmNlTGFiZWxLZXkoZWxlKSB7XG4gICAgcmV0dXJuIGVsZVswXS5fcHJpdmF0ZS5zb3VyY2VMYWJlbFN0eWxlS2V5O1xuICB9O1xuICB2YXIgZ2V0VGFyZ2V0TGFiZWxLZXkgPSBmdW5jdGlvbiBnZXRUYXJnZXRMYWJlbEtleShlbGUpIHtcbiAgICByZXR1cm4gZWxlWzBdLl9wcml2YXRlLnRhcmdldExhYmVsU3R5bGVLZXk7XG4gIH07XG4gIHZhciBkcmF3RWxlbWVudCA9IGZ1bmN0aW9uIGRyYXdFbGVtZW50KGNvbnRleHQsIGVsZSwgYmIsIHNjYWxlZExhYmVsU2hvd24sIHVzZUVsZU9wYWNpdHkpIHtcbiAgICByZXR1cm4gci5kcmF3RWxlbWVudChjb250ZXh0LCBlbGUsIGJiLCBmYWxzZSwgZmFsc2UsIHVzZUVsZU9wYWNpdHkpO1xuICB9O1xuICB2YXIgZHJhd0xhYmVsID0gZnVuY3Rpb24gZHJhd0xhYmVsKGNvbnRleHQsIGVsZSwgYmIsIHNjYWxlZExhYmVsU2hvd24sIHVzZUVsZU9wYWNpdHkpIHtcbiAgICByZXR1cm4gci5kcmF3RWxlbWVudFRleHQoY29udGV4dCwgZWxlLCBiYiwgc2NhbGVkTGFiZWxTaG93biwgJ21haW4nLCB1c2VFbGVPcGFjaXR5KTtcbiAgfTtcbiAgdmFyIGRyYXdTb3VyY2VMYWJlbCA9IGZ1bmN0aW9uIGRyYXdTb3VyY2VMYWJlbChjb250ZXh0LCBlbGUsIGJiLCBzY2FsZWRMYWJlbFNob3duLCB1c2VFbGVPcGFjaXR5KSB7XG4gICAgcmV0dXJuIHIuZHJhd0VsZW1lbnRUZXh0KGNvbnRleHQsIGVsZSwgYmIsIHNjYWxlZExhYmVsU2hvd24sICdzb3VyY2UnLCB1c2VFbGVPcGFjaXR5KTtcbiAgfTtcbiAgdmFyIGRyYXdUYXJnZXRMYWJlbCA9IGZ1bmN0aW9uIGRyYXdUYXJnZXRMYWJlbChjb250ZXh0LCBlbGUsIGJiLCBzY2FsZWRMYWJlbFNob3duLCB1c2VFbGVPcGFjaXR5KSB7XG4gICAgcmV0dXJuIHIuZHJhd0VsZW1lbnRUZXh0KGNvbnRleHQsIGVsZSwgYmIsIHNjYWxlZExhYmVsU2hvd24sICd0YXJnZXQnLCB1c2VFbGVPcGFjaXR5KTtcbiAgfTtcbiAgdmFyIGdldEVsZW1lbnRCb3ggPSBmdW5jdGlvbiBnZXRFbGVtZW50Qm94KGVsZSkge1xuICAgIGVsZS5ib3VuZGluZ0JveCgpO1xuICAgIHJldHVybiBlbGVbMF0uX3ByaXZhdGUuYm9keUJvdW5kcztcbiAgfTtcbiAgdmFyIGdldExhYmVsQm94ID0gZnVuY3Rpb24gZ2V0TGFiZWxCb3goZWxlKSB7XG4gICAgZWxlLmJvdW5kaW5nQm94KCk7XG4gICAgcmV0dXJuIGVsZVswXS5fcHJpdmF0ZS5sYWJlbEJvdW5kcy5tYWluIHx8IGVtcHR5QmI7XG4gIH07XG4gIHZhciBnZXRTb3VyY2VMYWJlbEJveCA9IGZ1bmN0aW9uIGdldFNvdXJjZUxhYmVsQm94KGVsZSkge1xuICAgIGVsZS5ib3VuZGluZ0JveCgpO1xuICAgIHJldHVybiBlbGVbMF0uX3ByaXZhdGUubGFiZWxCb3VuZHMuc291cmNlIHx8IGVtcHR5QmI7XG4gIH07XG4gIHZhciBnZXRUYXJnZXRMYWJlbEJveCA9IGZ1bmN0aW9uIGdldFRhcmdldExhYmVsQm94KGVsZSkge1xuICAgIGVsZS5ib3VuZGluZ0JveCgpO1xuICAgIHJldHVybiBlbGVbMF0uX3ByaXZhdGUubGFiZWxCb3VuZHMudGFyZ2V0IHx8IGVtcHR5QmI7XG4gIH07XG4gIHZhciBpc0xhYmVsVmlzaWJsZUF0U2NhbGUgPSBmdW5jdGlvbiBpc0xhYmVsVmlzaWJsZUF0U2NhbGUoZWxlLCBzY2FsZWRMYWJlbFNob3duKSB7XG4gICAgcmV0dXJuIHNjYWxlZExhYmVsU2hvd247XG4gIH07XG4gIHZhciBnZXRFbGVtZW50Um90YXRpb25Qb2ludCA9IGZ1bmN0aW9uIGdldEVsZW1lbnRSb3RhdGlvblBvaW50KGVsZSkge1xuICAgIHJldHVybiBnZXRCb3hDZW50ZXIoZ2V0RWxlbWVudEJveChlbGUpKTtcbiAgfTtcbiAgdmFyIGFkZFRleHRNYXJnaW4gPSBmdW5jdGlvbiBhZGRUZXh0TWFyZ2luKHByZWZpeCwgcHQsIGVsZSkge1xuICAgIHZhciBwcmUgPSBwcmVmaXggPyBwcmVmaXggKyAnLScgOiAnJztcbiAgICByZXR1cm4ge1xuICAgICAgeDogcHQueCArIGVsZS5wc3R5bGUocHJlICsgJ3RleHQtbWFyZ2luLXgnKS5wZlZhbHVlLFxuICAgICAgeTogcHQueSArIGVsZS5wc3R5bGUocHJlICsgJ3RleHQtbWFyZ2luLXknKS5wZlZhbHVlXG4gICAgfTtcbiAgfTtcbiAgdmFyIGdldFJzUHQgPSBmdW5jdGlvbiBnZXRSc1B0KGVsZSwgeCwgeSkge1xuICAgIHZhciBycyA9IGVsZVswXS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgICByZXR1cm4ge1xuICAgICAgeDogcnNbeF0sXG4gICAgICB5OiByc1t5XVxuICAgIH07XG4gIH07XG4gIHZhciBnZXRMYWJlbFJvdGF0aW9uUG9pbnQgPSBmdW5jdGlvbiBnZXRMYWJlbFJvdGF0aW9uUG9pbnQoZWxlKSB7XG4gICAgcmV0dXJuIGFkZFRleHRNYXJnaW4oJycsIGdldFJzUHQoZWxlLCAnbGFiZWxYJywgJ2xhYmVsWScpLCBlbGUpO1xuICB9O1xuICB2YXIgZ2V0U291cmNlTGFiZWxSb3RhdGlvblBvaW50ID0gZnVuY3Rpb24gZ2V0U291cmNlTGFiZWxSb3RhdGlvblBvaW50KGVsZSkge1xuICAgIHJldHVybiBhZGRUZXh0TWFyZ2luKCdzb3VyY2UnLCBnZXRSc1B0KGVsZSwgJ3NvdXJjZUxhYmVsWCcsICdzb3VyY2VMYWJlbFknKSwgZWxlKTtcbiAgfTtcbiAgdmFyIGdldFRhcmdldExhYmVsUm90YXRpb25Qb2ludCA9IGZ1bmN0aW9uIGdldFRhcmdldExhYmVsUm90YXRpb25Qb2ludChlbGUpIHtcbiAgICByZXR1cm4gYWRkVGV4dE1hcmdpbigndGFyZ2V0JywgZ2V0UnNQdChlbGUsICd0YXJnZXRMYWJlbFgnLCAndGFyZ2V0TGFiZWxZJyksIGVsZSk7XG4gIH07XG4gIHZhciBnZXRFbGVtZW50Um90YXRpb25PZmZzZXQgPSBmdW5jdGlvbiBnZXRFbGVtZW50Um90YXRpb25PZmZzZXQoZWxlKSB7XG4gICAgcmV0dXJuIGdldENlbnRlck9mZnNldChnZXRFbGVtZW50Qm94KGVsZSkpO1xuICB9O1xuICB2YXIgZ2V0U291cmNlTGFiZWxSb3RhdGlvbk9mZnNldCA9IGZ1bmN0aW9uIGdldFNvdXJjZUxhYmVsUm90YXRpb25PZmZzZXQoZWxlKSB7XG4gICAgcmV0dXJuIGdldENlbnRlck9mZnNldChnZXRTb3VyY2VMYWJlbEJveChlbGUpKTtcbiAgfTtcbiAgdmFyIGdldFRhcmdldExhYmVsUm90YXRpb25PZmZzZXQgPSBmdW5jdGlvbiBnZXRUYXJnZXRMYWJlbFJvdGF0aW9uT2Zmc2V0KGVsZSkge1xuICAgIHJldHVybiBnZXRDZW50ZXJPZmZzZXQoZ2V0VGFyZ2V0TGFiZWxCb3goZWxlKSk7XG4gIH07XG4gIHZhciBnZXRMYWJlbFJvdGF0aW9uT2Zmc2V0ID0gZnVuY3Rpb24gZ2V0TGFiZWxSb3RhdGlvbk9mZnNldChlbGUpIHtcbiAgICB2YXIgYmIgPSBnZXRMYWJlbEJveChlbGUpO1xuICAgIHZhciBwID0gZ2V0Q2VudGVyT2Zmc2V0KGdldExhYmVsQm94KGVsZSkpO1xuICAgIGlmIChlbGUuaXNOb2RlKCkpIHtcbiAgICAgIHN3aXRjaCAobGFiZWxIYWxpZ24oZWxlLnBzdHlsZSgndGV4dC1oYWxpZ24nKS52YWx1ZSkpIHtcbiAgICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgICAgcC54ID0gLWJiLncgLSAoYmIubGVmdFBhZCB8fCAwKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICAgIHAueCA9IC0oYmIucmlnaHRQYWQgfHwgMCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKGxhYmVsVmFsaWduKGVsZS5wc3R5bGUoJ3RleHQtdmFsaWduJykudmFsdWUpKSB7XG4gICAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgICAgcC55ID0gLWJiLmggLSAoYmIudG9wUGFkIHx8IDApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICAgIHAueSA9IC0oYmIuYm90UGFkIHx8IDApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcDtcbiAgfTtcbiAgdmFyIGVsZVR4ckNhY2hlID0gci5kYXRhLmVsZVR4ckNhY2hlID0gbmV3IEVsZW1lbnRUZXh0dXJlQ2FjaGUociwge1xuICAgIGdldEtleTogZ2V0U3R5bGVLZXksXG4gICAgZG9lc0VsZUludmFsaWRhdGVLZXk6IGJhY2tncm91bmRUaW1lc3RhbXBIYXNDaGFuZ2VkLFxuICAgIGRyYXdFbGVtZW50OiBkcmF3RWxlbWVudCxcbiAgICBnZXRCb3VuZGluZ0JveDogZ2V0RWxlbWVudEJveCxcbiAgICBnZXRSb3RhdGlvblBvaW50OiBnZXRFbGVtZW50Um90YXRpb25Qb2ludCxcbiAgICBnZXRSb3RhdGlvbk9mZnNldDogZ2V0RWxlbWVudFJvdGF0aW9uT2Zmc2V0LFxuICAgIGFsbG93RWRnZVR4ckNhY2hpbmc6IGZhbHNlLFxuICAgIGFsbG93UGFyZW50VHhyQ2FjaGluZzogZmFsc2VcbiAgfSk7XG4gIHZhciBsYmxUeHJDYWNoZSA9IHIuZGF0YS5sYmxUeHJDYWNoZSA9IG5ldyBFbGVtZW50VGV4dHVyZUNhY2hlKHIsIHtcbiAgICBnZXRLZXk6IGdldExhYmVsS2V5LFxuICAgIGRyYXdFbGVtZW50OiBkcmF3TGFiZWwsXG4gICAgZ2V0Qm91bmRpbmdCb3g6IGdldExhYmVsQm94LFxuICAgIGdldFJvdGF0aW9uUG9pbnQ6IGdldExhYmVsUm90YXRpb25Qb2ludCxcbiAgICBnZXRSb3RhdGlvbk9mZnNldDogZ2V0TGFiZWxSb3RhdGlvbk9mZnNldCxcbiAgICBpc1Zpc2libGU6IGlzTGFiZWxWaXNpYmxlQXRTY2FsZVxuICB9KTtcbiAgdmFyIHNsYlR4ckNhY2hlID0gci5kYXRhLnNsYlR4ckNhY2hlID0gbmV3IEVsZW1lbnRUZXh0dXJlQ2FjaGUociwge1xuICAgIGdldEtleTogZ2V0U291cmNlTGFiZWxLZXksXG4gICAgZHJhd0VsZW1lbnQ6IGRyYXdTb3VyY2VMYWJlbCxcbiAgICBnZXRCb3VuZGluZ0JveDogZ2V0U291cmNlTGFiZWxCb3gsXG4gICAgZ2V0Um90YXRpb25Qb2ludDogZ2V0U291cmNlTGFiZWxSb3RhdGlvblBvaW50LFxuICAgIGdldFJvdGF0aW9uT2Zmc2V0OiBnZXRTb3VyY2VMYWJlbFJvdGF0aW9uT2Zmc2V0LFxuICAgIGlzVmlzaWJsZTogaXNMYWJlbFZpc2libGVBdFNjYWxlXG4gIH0pO1xuICB2YXIgdGxiVHhyQ2FjaGUgPSByLmRhdGEudGxiVHhyQ2FjaGUgPSBuZXcgRWxlbWVudFRleHR1cmVDYWNoZShyLCB7XG4gICAgZ2V0S2V5OiBnZXRUYXJnZXRMYWJlbEtleSxcbiAgICBkcmF3RWxlbWVudDogZHJhd1RhcmdldExhYmVsLFxuICAgIGdldEJvdW5kaW5nQm94OiBnZXRUYXJnZXRMYWJlbEJveCxcbiAgICBnZXRSb3RhdGlvblBvaW50OiBnZXRUYXJnZXRMYWJlbFJvdGF0aW9uUG9pbnQsXG4gICAgZ2V0Um90YXRpb25PZmZzZXQ6IGdldFRhcmdldExhYmVsUm90YXRpb25PZmZzZXQsXG4gICAgaXNWaXNpYmxlOiBpc0xhYmVsVmlzaWJsZUF0U2NhbGVcbiAgfSk7XG4gIHZhciBseXJUeHJDYWNoZSA9IHIuZGF0YS5seXJUeHJDYWNoZSA9IG5ldyBMYXllcmVkVGV4dHVyZUNhY2hlKHIpO1xuICByLm9uVXBkYXRlRWxlQ2FsY3MoZnVuY3Rpb24gaW52YWxpZGF0ZVRleHR1cmVDYWNoZXMod2lsbERyYXcsIGVsZXMpIHtcbiAgICAvLyBlYWNoIGNhY2hlIHNob3VsZCBjaGVjayBmb3Igc3ViLWtleSBkaWZmIHRvIHNlZSB0aGF0IHRoZSB1cGRhdGUgYWZmZWN0cyB0aGF0IGNhY2hlIHBhcnRpY3VsYXJseVxuICAgIGVsZVR4ckNhY2hlLmludmFsaWRhdGVFbGVtZW50cyhlbGVzKTtcbiAgICBsYmxUeHJDYWNoZS5pbnZhbGlkYXRlRWxlbWVudHMoZWxlcyk7XG4gICAgc2xiVHhyQ2FjaGUuaW52YWxpZGF0ZUVsZW1lbnRzKGVsZXMpO1xuICAgIHRsYlR4ckNhY2hlLmludmFsaWRhdGVFbGVtZW50cyhlbGVzKTtcblxuICAgIC8vIGFueSBjaGFuZ2UgaW52YWxpZGF0ZXMgdGhlIGxheWVyc1xuICAgIGx5clR4ckNhY2hlLmludmFsaWRhdGVFbGVtZW50cyhlbGVzKTtcblxuICAgIC8vIHVwZGF0ZSB0aGUgb2xkIGJnIHRpbWVzdGFtcCBzbyBkaWZmcyBjYW4gYmUgZG9uZSBpbiB0aGUgZWxlIHR4ciBjYWNoZXNcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgZWxlcy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBfcCA9IGVsZXNbX2ldLl9wcml2YXRlO1xuICAgICAgX3Aub2xkQmFja2dyb3VuZFRpbWVzdGFtcCA9IF9wLmJhY2tncm91bmRUaW1lc3RhbXA7XG4gICAgfVxuICB9KTtcbiAgdmFyIHJlZmluZUluTGF5ZXJzID0gZnVuY3Rpb24gcmVmaW5lSW5MYXllcnMocmVxcykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVxcy5sZW5ndGg7IGkrKykge1xuICAgICAgbHlyVHhyQ2FjaGUuZW5xdWV1ZUVsZW1lbnRSZWZpbmVtZW50KHJlcXNbaV0uZWxlKTtcbiAgICB9XG4gIH07XG4gIGVsZVR4ckNhY2hlLm9uRGVxdWV1ZShyZWZpbmVJbkxheWVycyk7XG4gIGxibFR4ckNhY2hlLm9uRGVxdWV1ZShyZWZpbmVJbkxheWVycyk7XG4gIHNsYlR4ckNhY2hlLm9uRGVxdWV1ZShyZWZpbmVJbkxheWVycyk7XG4gIHRsYlR4ckNhY2hlLm9uRGVxdWV1ZShyZWZpbmVJbkxheWVycyk7XG4gIGlmIChvcHRpb25zLndlYmdsKSB7XG4gICAgci5pbml0V2ViZ2wob3B0aW9ucywge1xuICAgICAgZ2V0U3R5bGVLZXk6IGdldFN0eWxlS2V5LFxuICAgICAgZ2V0TGFiZWxLZXk6IGdldExhYmVsS2V5LFxuICAgICAgZ2V0U291cmNlTGFiZWxLZXk6IGdldFNvdXJjZUxhYmVsS2V5LFxuICAgICAgZ2V0VGFyZ2V0TGFiZWxLZXk6IGdldFRhcmdldExhYmVsS2V5LFxuICAgICAgZHJhd0VsZW1lbnQ6IGRyYXdFbGVtZW50LFxuICAgICAgZHJhd0xhYmVsOiBkcmF3TGFiZWwsXG4gICAgICBkcmF3U291cmNlTGFiZWw6IGRyYXdTb3VyY2VMYWJlbCxcbiAgICAgIGRyYXdUYXJnZXRMYWJlbDogZHJhd1RhcmdldExhYmVsLFxuICAgICAgZ2V0RWxlbWVudEJveDogZ2V0RWxlbWVudEJveCxcbiAgICAgIGdldExhYmVsQm94OiBnZXRMYWJlbEJveCxcbiAgICAgIGdldFNvdXJjZUxhYmVsQm94OiBnZXRTb3VyY2VMYWJlbEJveCxcbiAgICAgIGdldFRhcmdldExhYmVsQm94OiBnZXRUYXJnZXRMYWJlbEJveCxcbiAgICAgIGdldEVsZW1lbnRSb3RhdGlvblBvaW50OiBnZXRFbGVtZW50Um90YXRpb25Qb2ludCxcbiAgICAgIGdldEVsZW1lbnRSb3RhdGlvbk9mZnNldDogZ2V0RWxlbWVudFJvdGF0aW9uT2Zmc2V0LFxuICAgICAgZ2V0TGFiZWxSb3RhdGlvblBvaW50OiBnZXRMYWJlbFJvdGF0aW9uUG9pbnQsXG4gICAgICBnZXRTb3VyY2VMYWJlbFJvdGF0aW9uUG9pbnQ6IGdldFNvdXJjZUxhYmVsUm90YXRpb25Qb2ludCxcbiAgICAgIGdldFRhcmdldExhYmVsUm90YXRpb25Qb2ludDogZ2V0VGFyZ2V0TGFiZWxSb3RhdGlvblBvaW50LFxuICAgICAgZ2V0TGFiZWxSb3RhdGlvbk9mZnNldDogZ2V0TGFiZWxSb3RhdGlvbk9mZnNldCxcbiAgICAgIGdldFNvdXJjZUxhYmVsUm90YXRpb25PZmZzZXQ6IGdldFNvdXJjZUxhYmVsUm90YXRpb25PZmZzZXQsXG4gICAgICBnZXRUYXJnZXRMYWJlbFJvdGF0aW9uT2Zmc2V0OiBnZXRUYXJnZXRMYWJlbFJvdGF0aW9uT2Zmc2V0XG4gICAgfSk7XG4gIH1cbn1cbkNScC5yZWRyYXdIaW50ID0gZnVuY3Rpb24gKGdyb3VwLCBib29sKSB7XG4gIHZhciByID0gdGhpcztcbiAgc3dpdGNoIChncm91cCkge1xuICAgIGNhc2UgJ2VsZXMnOlxuICAgICAgci5kYXRhLmNhbnZhc05lZWRzUmVkcmF3W0NScC5OT0RFXSA9IGJvb2w7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdkcmFnJzpcbiAgICAgIHIuZGF0YS5jYW52YXNOZWVkc1JlZHJhd1tDUnAuRFJBR10gPSBib29sO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgIHIuZGF0YS5jYW52YXNOZWVkc1JlZHJhd1tDUnAuU0VMRUNUX0JPWF0gPSBib29sO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZ2MnOlxuICAgICAgci5kYXRhLmdjID0gdHJ1ZTtcbiAgICAgIGJyZWFrO1xuICB9XG59O1xuXG4vLyB3aGV0aGVyIHRvIHVzZSBQYXRoMkQgY2FjaGluZyBmb3IgZHJhd2luZ1xudmFyIHBhdGhzSW1wbGQgPSB0eXBlb2YgUGF0aDJEICE9PSAndW5kZWZpbmVkJztcbkNScC5wYXRoMmRFbmFibGVkID0gZnVuY3Rpb24gKG9uKSB7XG4gIGlmIChvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHRoaXMucGF0aHNFbmFibGVkO1xuICB9XG4gIHRoaXMucGF0aHNFbmFibGVkID0gb24gPyB0cnVlIDogZmFsc2U7XG59O1xuQ1JwLnVzZVBhdGhzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gcGF0aHNJbXBsZCAmJiB0aGlzLnBhdGhzRW5hYmxlZDtcbn07XG5DUnAuc2V0SW1nU21vb3RoaW5nID0gZnVuY3Rpb24gKGNvbnRleHQsIGJvb2wpIHtcbiAgaWYgKGNvbnRleHQuaW1hZ2VTbW9vdGhpbmdFbmFibGVkICE9IG51bGwpIHtcbiAgICBjb250ZXh0LmltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGJvb2w7XG4gIH0gZWxzZSB7XG4gICAgY29udGV4dC53ZWJraXRJbWFnZVNtb290aGluZ0VuYWJsZWQgPSBib29sO1xuICAgIGNvbnRleHQubW96SW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gYm9vbDtcbiAgICBjb250ZXh0Lm1zSW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gYm9vbDtcbiAgfVxufTtcbkNScC5nZXRJbWdTbW9vdGhpbmcgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICBpZiAoY29udGV4dC5pbWFnZVNtb290aGluZ0VuYWJsZWQgIT0gbnVsbCkge1xuICAgIHJldHVybiBjb250ZXh0LmltYWdlU21vb3RoaW5nRW5hYmxlZDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY29udGV4dC53ZWJraXRJbWFnZVNtb290aGluZ0VuYWJsZWQgfHwgY29udGV4dC5tb3pJbWFnZVNtb290aGluZ0VuYWJsZWQgfHwgY29udGV4dC5tc0ltYWdlU21vb3RoaW5nRW5hYmxlZDtcbiAgfVxufTtcbkNScC5tYWtlT2Zmc2NyZWVuQ2FudmFzID0gZnVuY3Rpb24gKHdpZHRoLCBoZWlnaHQpIHtcbiAgdmFyIGNhbnZhcztcbiAgaWYgKCh0eXBlb2YgT2Zmc2NyZWVuQ2FudmFzID09PSBcInVuZGVmaW5lZFwiID8gXCJ1bmRlZmluZWRcIiA6IF90eXBlb2YoT2Zmc2NyZWVuQ2FudmFzKSkgIT09IChcInVuZGVmaW5lZFwiICkpIHtcbiAgICBjYW52YXMgPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKHdpZHRoLCBoZWlnaHQpO1xuICB9IGVsc2Uge1xuICAgIHZhciBjb250YWluZXJXaW5kb3cgPSB0aGlzLmN5LndpbmRvdygpO1xuICAgIHZhciBkb2N1bWVudCA9IGNvbnRhaW5lcldpbmRvdy5kb2N1bWVudDtcbiAgICBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gIH1cbiAgcmV0dXJuIGNhbnZhcztcbn07XG5bQ1JwJGIsIENScCRhLCBDUnAkOSwgQ1JwJDgsIENScCQ3LCBDUnAkNiwgQ1JwJDUsIENScCQ0LCBDUnAkMywgQ1JwJDIsIENScCQxXS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wcykge1xuICBleHRlbmQoQ1JwLCBwcm9wcyk7XG59KTtcblxudmFyIHJlbmRlcmVyID0gW3tcbiAgbmFtZTogJ251bGwnLFxuICBpbXBsOiBOdWxsUmVuZGVyZXJcbn0sIHtcbiAgbmFtZTogJ2Jhc2UnLFxuICBpbXBsOiBCUlxufSwge1xuICBuYW1lOiAnY2FudmFzJyxcbiAgaW1wbDogQ1Jcbn1dO1xuXG52YXIgaW5jRXh0cyA9IFt7XG4gIHR5cGU6ICdsYXlvdXQnLFxuICBleHRlbnNpb25zOiBsYXlvdXRcbn0sIHtcbiAgdHlwZTogJ3JlbmRlcmVyJyxcbiAgZXh0ZW5zaW9uczogcmVuZGVyZXJcbn1dO1xuXG4vLyByZWdpc3RlcmVkIGV4dGVuc2lvbnMgdG8gY3l0b3NjYXBlLCBpbmRleGVkIGJ5IG5hbWVcbnZhciBleHRlbnNpb25zID0ge307XG5cbi8vIHJlZ2lzdGVyZWQgbW9kdWxlcyBmb3IgZXh0ZW5zaW9ucywgaW5kZXhlZCBieSBuYW1lXG52YXIgbW9kdWxlcyA9IHt9O1xuZnVuY3Rpb24gc2V0RXh0ZW5zaW9uKHR5cGUsIG5hbWUsIHJlZ2lzdHJhbnQpIHtcbiAgdmFyIGV4dCA9IHJlZ2lzdHJhbnQ7XG4gIHZhciBvdmVycmlkZUVyciA9IGZ1bmN0aW9uIG92ZXJyaWRlRXJyKGZpZWxkKSB7XG4gICAgd2FybignQ2FuIG5vdCByZWdpc3RlciBgJyArIG5hbWUgKyAnYCBmb3IgYCcgKyB0eXBlICsgJ2Agc2luY2UgYCcgKyBmaWVsZCArICdgIGFscmVhZHkgZXhpc3RzIGluIHRoZSBwcm90b3R5cGUgYW5kIGNhbiBub3QgYmUgb3ZlcnJpZGRlbicpO1xuICB9O1xuICBpZiAodHlwZSA9PT0gJ2NvcmUnKSB7XG4gICAgaWYgKENvcmUucHJvdG90eXBlW25hbWVdKSB7XG4gICAgICByZXR1cm4gb3ZlcnJpZGVFcnIobmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIENvcmUucHJvdG90eXBlW25hbWVdID0gcmVnaXN0cmFudDtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2NvbGxlY3Rpb24nKSB7XG4gICAgaWYgKENvbGxlY3Rpb24ucHJvdG90eXBlW25hbWVdKSB7XG4gICAgICByZXR1cm4gb3ZlcnJpZGVFcnIobmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIENvbGxlY3Rpb24ucHJvdG90eXBlW25hbWVdID0gcmVnaXN0cmFudDtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2xheW91dCcpIHtcbiAgICAvLyBmaWxsIGluIG1pc3NpbmcgbGF5b3V0IGZ1bmN0aW9ucyBpbiB0aGUgcHJvdG90eXBlXG5cbiAgICB2YXIgTGF5b3V0ID0gZnVuY3Rpb24gTGF5b3V0KG9wdGlvbnMpIHtcbiAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICByZWdpc3RyYW50LmNhbGwodGhpcywgb3B0aW9ucyk7XG5cbiAgICAgIC8vIG1ha2Ugc3VyZSBsYXlvdXQgaGFzIF9wcml2YXRlIGZvciB1c2Ugdy8gc3RkIGFwaXMgbGlrZSAub24oKVxuICAgICAgaWYgKCFwbGFpbk9iamVjdCh0aGlzLl9wcml2YXRlKSkge1xuICAgICAgICB0aGlzLl9wcml2YXRlID0ge307XG4gICAgICB9XG4gICAgICB0aGlzLl9wcml2YXRlLmN5ID0gb3B0aW9ucy5jeTtcbiAgICAgIHRoaXMuX3ByaXZhdGUubGlzdGVuZXJzID0gW107XG4gICAgICB0aGlzLmNyZWF0ZUVtaXR0ZXIoKTtcbiAgICB9O1xuICAgIHZhciBsYXlvdXRQcm90byA9IExheW91dC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHJlZ2lzdHJhbnQucHJvdG90eXBlKTtcbiAgICB2YXIgb3B0TGF5b3V0Rm5zID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcHRMYXlvdXRGbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBmbk5hbWUgPSBvcHRMYXlvdXRGbnNbaV07XG4gICAgICBsYXlvdXRQcm90b1tmbk5hbWVdID0gbGF5b3V0UHJvdG9bZm5OYW1lXSB8fCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBlaXRoZXIgLnN0YXJ0KCkgb3IgLnJ1bigpIGlzIGRlZmluZWQsIHNvIGF1dG9nZW4gdGhlIG90aGVyXG4gICAgaWYgKGxheW91dFByb3RvLnN0YXJ0ICYmICFsYXlvdXRQcm90by5ydW4pIHtcbiAgICAgIGxheW91dFByb3RvLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5zdGFydCgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmICghbGF5b3V0UHJvdG8uc3RhcnQgJiYgbGF5b3V0UHJvdG8ucnVuKSB7XG4gICAgICBsYXlvdXRQcm90by5zdGFydCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5ydW4oKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9O1xuICAgIH1cbiAgICB2YXIgcmVnU3RvcCA9IHJlZ2lzdHJhbnQucHJvdG90eXBlLnN0b3A7XG4gICAgbGF5b3V0UHJvdG8uc3RvcCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBvcHRzID0gdGhpcy5vcHRpb25zO1xuICAgICAgaWYgKG9wdHMgJiYgb3B0cy5hbmltYXRlKSB7XG4gICAgICAgIHZhciBhbmlzID0gdGhpcy5hbmltYXRpb25zO1xuICAgICAgICBpZiAoYW5pcykge1xuICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhbmlzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgYW5pc1tfaV0uc3RvcCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHJlZ1N0b3ApIHtcbiAgICAgICAgcmVnU3RvcC5jYWxsKHRoaXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5lbWl0KCdsYXlvdXRzdG9wJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIGlmICghbGF5b3V0UHJvdG8uZGVzdHJveSkge1xuICAgICAgbGF5b3V0UHJvdG8uZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9O1xuICAgIH1cbiAgICBsYXlvdXRQcm90by5jeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9wcml2YXRlLmN5O1xuICAgIH07XG4gICAgdmFyIGdldEN5ID0gZnVuY3Rpb24gZ2V0Q3kobGF5b3V0KSB7XG4gICAgICByZXR1cm4gbGF5b3V0Ll9wcml2YXRlLmN5O1xuICAgIH07XG4gICAgdmFyIGVtaXR0ZXJPcHRzID0ge1xuICAgICAgYWRkRXZlbnRGaWVsZHM6IGZ1bmN0aW9uIGFkZEV2ZW50RmllbGRzKGxheW91dCwgZXZ0KSB7XG4gICAgICAgIGV2dC5sYXlvdXQgPSBsYXlvdXQ7XG4gICAgICAgIGV2dC5jeSA9IGdldEN5KGxheW91dCk7XG4gICAgICAgIGV2dC50YXJnZXQgPSBsYXlvdXQ7XG4gICAgICB9LFxuICAgICAgYnViYmxlOiBmdW5jdGlvbiBidWJibGUoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSxcbiAgICAgIHBhcmVudDogZnVuY3Rpb24gcGFyZW50KGxheW91dCkge1xuICAgICAgICByZXR1cm4gZ2V0Q3kobGF5b3V0KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGV4dGVuZChsYXlvdXRQcm90bywge1xuICAgICAgY3JlYXRlRW1pdHRlcjogZnVuY3Rpb24gY3JlYXRlRW1pdHRlcigpIHtcbiAgICAgICAgdGhpcy5fcHJpdmF0ZS5lbWl0dGVyID0gbmV3IEVtaXR0ZXIoZW1pdHRlck9wdHMsIHRoaXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG4gICAgICBlbWl0dGVyOiBmdW5jdGlvbiBlbWl0dGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5lbWl0dGVyO1xuICAgICAgfSxcbiAgICAgIG9uOiBmdW5jdGlvbiBvbihldnQsIGNiKSB7XG4gICAgICAgIHRoaXMuZW1pdHRlcigpLm9uKGV2dCwgY2IpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG4gICAgICBvbmU6IGZ1bmN0aW9uIG9uZShldnQsIGNiKSB7XG4gICAgICAgIHRoaXMuZW1pdHRlcigpLm9uZShldnQsIGNiKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuICAgICAgb25jZTogZnVuY3Rpb24gb25jZShldnQsIGNiKSB7XG4gICAgICAgIHRoaXMuZW1pdHRlcigpLm9uZShldnQsIGNiKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuICAgICAgcmVtb3ZlTGlzdGVuZXI6IGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKGV2dCwgY2IpIHtcbiAgICAgICAgdGhpcy5lbWl0dGVyKCkucmVtb3ZlTGlzdGVuZXIoZXZ0LCBjYik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICAgIHJlbW92ZUFsbExpc3RlbmVyczogZnVuY3Rpb24gcmVtb3ZlQWxsTGlzdGVuZXJzKCkge1xuICAgICAgICB0aGlzLmVtaXR0ZXIoKS5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuICAgICAgZW1pdDogZnVuY3Rpb24gZW1pdChldnQsIHBhcmFtcykge1xuICAgICAgICB0aGlzLmVtaXR0ZXIoKS5lbWl0KGV2dCwgcGFyYW1zKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgfSk7XG4gICAgZGVmaW5lLmV2ZW50QWxpYXNlc09uKGxheW91dFByb3RvKTtcbiAgICBleHQgPSBMYXlvdXQ7IC8vIHJlcGxhY2Ugd2l0aCBvdXIgd3JhcHBlZCBsYXlvdXRcbiAgfSBlbHNlIGlmICh0eXBlID09PSAncmVuZGVyZXInICYmIG5hbWUgIT09ICdudWxsJyAmJiBuYW1lICE9PSAnYmFzZScpIHtcbiAgICAvLyB1c2VyIHJlZ2lzdGVyZWQgcmVuZGVyZXJzIGluaGVyaXQgZnJvbSBiYXNlXG5cbiAgICB2YXIgQmFzZVJlbmRlcmVyID0gZ2V0RXh0ZW5zaW9uKCdyZW5kZXJlcicsICdiYXNlJyk7XG4gICAgdmFyIGJQcm90byA9IEJhc2VSZW5kZXJlci5wcm90b3R5cGU7XG4gICAgdmFyIFJlZ2lzdHJhbnRSZW5kZXJlciA9IHJlZ2lzdHJhbnQ7XG4gICAgdmFyIHJQcm90byA9IHJlZ2lzdHJhbnQucHJvdG90eXBlO1xuICAgIHZhciBSZW5kZXJlciA9IGZ1bmN0aW9uIFJlbmRlcmVyKCkge1xuICAgICAgQmFzZVJlbmRlcmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICBSZWdpc3RyYW50UmVuZGVyZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICAgIHZhciBwcm90byA9IFJlbmRlcmVyLnByb3RvdHlwZTtcbiAgICBmb3IgKHZhciBwTmFtZSBpbiBiUHJvdG8pIHtcbiAgICAgIHZhciBwVmFsID0gYlByb3RvW3BOYW1lXTtcbiAgICAgIHZhciBleGlzdHNJblIgPSByUHJvdG9bcE5hbWVdICE9IG51bGw7XG4gICAgICBpZiAoZXhpc3RzSW5SKSB7XG4gICAgICAgIHJldHVybiBvdmVycmlkZUVycihwTmFtZSk7XG4gICAgICB9XG4gICAgICBwcm90b1twTmFtZV0gPSBwVmFsOyAvLyB0YWtlIGltcGwgZnJvbSBiYXNlXG4gICAgfVxuICAgIGZvciAodmFyIF9wTmFtZSBpbiByUHJvdG8pIHtcbiAgICAgIHByb3RvW19wTmFtZV0gPSByUHJvdG9bX3BOYW1lXTsgLy8gdGFrZSBpbXBsIGZyb20gcmVnaXN0cmFudFxuICAgIH1cbiAgICBiUHJvdG8uY2xpZW50RnVuY3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIHByb3RvW25hbWVdID0gcHJvdG9bbmFtZV0gfHwgZnVuY3Rpb24gKCkge1xuICAgICAgICBlcnJvcignUmVuZGVyZXIgZG9lcyBub3QgaW1wbGVtZW50IGByZW5kZXJlci4nICsgbmFtZSArICcoKWAgb24gaXRzIHByb3RvdHlwZScpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgICBleHQgPSBSZW5kZXJlcjtcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnX19wcm90b19fJyB8fCB0eXBlID09PSAnY29uc3RydWN0b3InIHx8IHR5cGUgPT09ICdwcm90b3R5cGUnKSB7XG4gICAgLy8gdG8gYXZvaWQgcG90ZW50aWFsIHByb3RvdHlwZSBwb2xsdXRpb25cbiAgICByZXR1cm4gZXJyb3IodHlwZSArICcgaXMgYW4gaWxsZWdhbCB0eXBlIHRvIGJlIHJlZ2lzdGVyZWQsIHBvc3NpYmx5IGxlYWQgdG8gcHJvdG90eXBlIHBvbGx1dGlvbnMnKTtcbiAgfVxuICByZXR1cm4gc2V0TWFwKHtcbiAgICBtYXA6IGV4dGVuc2lvbnMsXG4gICAga2V5czogW3R5cGUsIG5hbWVdLFxuICAgIHZhbHVlOiBleHRcbiAgfSk7XG59XG5mdW5jdGlvbiBnZXRFeHRlbnNpb24odHlwZSwgbmFtZSkge1xuICByZXR1cm4gZ2V0TWFwKHtcbiAgICBtYXA6IGV4dGVuc2lvbnMsXG4gICAga2V5czogW3R5cGUsIG5hbWVdXG4gIH0pO1xufVxuZnVuY3Rpb24gc2V0TW9kdWxlKHR5cGUsIG5hbWUsIG1vZHVsZVR5cGUsIG1vZHVsZU5hbWUsIHJlZ2lzdHJhbnQpIHtcbiAgcmV0dXJuIHNldE1hcCh7XG4gICAgbWFwOiBtb2R1bGVzLFxuICAgIGtleXM6IFt0eXBlLCBuYW1lLCBtb2R1bGVUeXBlLCBtb2R1bGVOYW1lXSxcbiAgICB2YWx1ZTogcmVnaXN0cmFudFxuICB9KTtcbn1cbmZ1bmN0aW9uIGdldE1vZHVsZSh0eXBlLCBuYW1lLCBtb2R1bGVUeXBlLCBtb2R1bGVOYW1lKSB7XG4gIHJldHVybiBnZXRNYXAoe1xuICAgIG1hcDogbW9kdWxlcyxcbiAgICBrZXlzOiBbdHlwZSwgbmFtZSwgbW9kdWxlVHlwZSwgbW9kdWxlTmFtZV1cbiAgfSk7XG59XG52YXIgZXh0ZW5zaW9uID0gZnVuY3Rpb24gZXh0ZW5zaW9uKCkge1xuICAvLyBlLmcuIGV4dGVuc2lvbigncmVuZGVyZXInLCAnc3ZnJylcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICByZXR1cm4gZ2V0RXh0ZW5zaW9uLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gIH1cblxuICAvLyBlLmcuIGV4dGVuc2lvbigncmVuZGVyZXInLCAnc3ZnJywgeyAuLi4gfSlcbiAgZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykge1xuICAgIHJldHVybiBzZXRFeHRlbnNpb24uYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgfVxuXG4gIC8vIGUuZy4gZXh0ZW5zaW9uKCdyZW5kZXJlcicsICdzdmcnLCAnbm9kZVNoYXBlJywgJ2VsbGlwc2UnKVxuICBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSA0KSB7XG4gICAgcmV0dXJuIGdldE1vZHVsZS5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgLy8gZS5nLiBleHRlbnNpb24oJ3JlbmRlcmVyJywgJ3N2ZycsICdub2RlU2hhcGUnLCAnZWxsaXBzZScsIHsgLi4uIH0pXG4gIGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDUpIHtcbiAgICByZXR1cm4gc2V0TW9kdWxlLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gIH0gZWxzZSB7XG4gICAgZXJyb3IoJ0ludmFsaWQgZXh0ZW5zaW9uIGFjY2VzcyBzeW50YXgnKTtcbiAgfVxufTtcblxuLy8gYWxsb3dzIGEgY29yZSBpbnN0YW5jZSB0byBhY2Nlc3MgZXh0ZW5zaW9ucyBpbnRlcm5hbGx5XG5Db3JlLnByb3RvdHlwZS5leHRlbnNpb24gPSBleHRlbnNpb247XG5cbi8vIGluY2x1ZGVkIGV4dGVuc2lvbnNcbmluY0V4dHMuZm9yRWFjaChmdW5jdGlvbiAoZ3JvdXApIHtcbiAgZ3JvdXAuZXh0ZW5zaW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChleHQpIHtcbiAgICBzZXRFeHRlbnNpb24oZ3JvdXAudHlwZSwgZXh0Lm5hbWUsIGV4dC5pbXBsKTtcbiAgfSk7XG59KTtcblxuLy8gYSBkdW1teSBzdHlsZXNoZWV0IG9iamVjdCB0aGF0IGRvZXNuJ3QgbmVlZCBhIHJlZmVyZW5jZSB0byB0aGUgY29yZVxuLy8gKHVzZWZ1bCBmb3IgaW5pdClcbnZhciBfU3R5bGVzaGVldCA9IGZ1bmN0aW9uIFN0eWxlc2hlZXQoKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBfU3R5bGVzaGVldCkpIHtcbiAgICByZXR1cm4gbmV3IF9TdHlsZXNoZWV0KCk7XG4gIH1cbiAgdGhpcy5sZW5ndGggPSAwO1xufTtcbnZhciBzaGVldGZuID0gX1N0eWxlc2hlZXQucHJvdG90eXBlO1xuc2hlZXRmbi5pbnN0YW5jZVN0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICdzdHlsZXNoZWV0Jztcbn07XG5cbi8vIGp1c3Qgc3RvcmUgdGhlIHNlbGVjdG9yIHRvIGJlIHBhcnNlZCBsYXRlclxuc2hlZXRmbi5zZWxlY3RvciA9IGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICB2YXIgaSA9IHRoaXMubGVuZ3RoKys7XG4gIHRoaXNbaV0gPSB7XG4gICAgc2VsZWN0b3I6IHNlbGVjdG9yLFxuICAgIHByb3BlcnRpZXM6IFtdXG4gIH07XG4gIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xufTtcblxuLy8ganVzdCBzdG9yZSB0aGUgcHJvcGVydHkgdG8gYmUgcGFyc2VkIGxhdGVyXG5zaGVldGZuLmNzcyA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICB2YXIgaSA9IHRoaXMubGVuZ3RoIC0gMTtcbiAgaWYgKHN0cmluZyhuYW1lKSkge1xuICAgIHRoaXNbaV0ucHJvcGVydGllcy5wdXNoKHtcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICB2YWx1ZTogdmFsdWVcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChwbGFpbk9iamVjdChuYW1lKSkge1xuICAgIHZhciBtYXAgPSBuYW1lO1xuICAgIHZhciBwcm9wTmFtZXMgPSBPYmplY3Qua2V5cyhtYXApO1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgcHJvcE5hbWVzLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIga2V5ID0gcHJvcE5hbWVzW2pdO1xuICAgICAgdmFyIG1hcFZhbCA9IG1hcFtrZXldO1xuICAgICAgaWYgKG1hcFZhbCA9PSBudWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdmFyIHByb3AgPSBfU3R5bGUucHJvcGVydGllc1trZXldIHx8IF9TdHlsZS5wcm9wZXJ0aWVzW2Rhc2gyY2FtZWwoa2V5KV07XG4gICAgICBpZiAocHJvcCA9PSBudWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdmFyIF9uYW1lID0gcHJvcC5uYW1lO1xuICAgICAgdmFyIF92YWx1ZSA9IG1hcFZhbDtcbiAgICAgIHRoaXNbaV0ucHJvcGVydGllcy5wdXNoKHtcbiAgICAgICAgbmFtZTogX25hbWUsXG4gICAgICAgIHZhbHVlOiBfdmFsdWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbn07XG5zaGVldGZuLnN0eWxlID0gc2hlZXRmbi5jc3M7XG5cbi8vIGdlbmVyYXRlIGEgcmVhbCBzdHlsZSBvYmplY3QgZnJvbSB0aGUgZHVtbXkgc3R5bGVzaGVldFxuc2hlZXRmbi5nZW5lcmF0ZVN0eWxlID0gZnVuY3Rpb24gKGN5KSB7XG4gIHZhciBzdHlsZSA9IG5ldyBfU3R5bGUoY3kpO1xuICByZXR1cm4gdGhpcy5hcHBlbmRUb1N0eWxlKHN0eWxlKTtcbn07XG5cbi8vIGFwcGVuZCBhIGR1bW15IHN0eWxlc2hlZXQgb2JqZWN0IG9uIGEgcmVhbCBzdHlsZSBvYmplY3RcbnNoZWV0Zm4uYXBwZW5kVG9TdHlsZSA9IGZ1bmN0aW9uIChzdHlsZSkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgY29udGV4dCA9IHRoaXNbaV07XG4gICAgdmFyIHNlbGVjdG9yID0gY29udGV4dC5zZWxlY3RvcjtcbiAgICB2YXIgcHJvcHMgPSBjb250ZXh0LnByb3BlcnRpZXM7XG4gICAgc3R5bGUuc2VsZWN0b3Ioc2VsZWN0b3IpOyAvLyBhcHBseSBzZWxlY3RvclxuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBwcm9wcy5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIHByb3AgPSBwcm9wc1tqXTtcbiAgICAgIHN0eWxlLmNzcyhwcm9wLm5hbWUsIHByb3AudmFsdWUpOyAvLyBhcHBseSBwcm9wZXJ0eVxuICAgIH1cbiAgfVxuICByZXR1cm4gc3R5bGU7XG59O1xuXG52YXIgdmVyc2lvbiA9IFwiMy4zNC4zXCI7XG5cbnZhciBjeXRvc2NhcGUgPSBmdW5jdGlvbiBjeXRvc2NhcGUob3B0aW9ucykge1xuICAvLyBpZiBubyBvcHRpb25zIHNwZWNpZmllZCwgdXNlIGRlZmF1bHRcbiAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIC8vIGNyZWF0ZSBpbnN0YW5jZVxuICBpZiAocGxhaW5PYmplY3Qob3B0aW9ucykpIHtcbiAgICByZXR1cm4gbmV3IENvcmUob3B0aW9ucyk7XG4gIH1cblxuICAvLyBhbGxvdyBmb3IgcmVnaXN0cmF0aW9uIG9mIGV4dGVuc2lvbnNcbiAgZWxzZSBpZiAoc3RyaW5nKG9wdGlvbnMpKSB7XG4gICAgcmV0dXJuIGV4dGVuc2lvbi5hcHBseShleHRlbnNpb24sIGFyZ3VtZW50cyk7XG4gIH1cbn07XG5cbi8vIGUuZy4gY3l0b3NjYXBlLnVzZSggcmVxdWlyZSgnY3l0b3NjYXBlLWZvbycpLCBiYXIgKVxuY3l0b3NjYXBlLnVzZSA9IGZ1bmN0aW9uIChleHQpIHtcbiAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOyAvLyBhcmdzIHRvIHBhc3MgdG8gZXh0XG5cbiAgYXJncy51bnNoaWZ0KGN5dG9zY2FwZSk7IC8vIGN5dG9zY2FwZSBpcyBmaXJzdCBhcmcgdG8gZXh0XG5cbiAgZXh0LmFwcGx5KG51bGwsIGFyZ3MpO1xuICByZXR1cm4gdGhpcztcbn07XG5jeXRvc2NhcGUud2FybmluZ3MgPSBmdW5jdGlvbiAoYm9vbCkge1xuICByZXR1cm4gd2FybmluZ3MoYm9vbCk7XG59O1xuXG4vLyByZXBsYWNlZCBieSBidWlsZCBzeXN0ZW1cbmN5dG9zY2FwZS52ZXJzaW9uID0gdmVyc2lvbjtcblxuLy8gZXhwb3NlIHB1YmxpYyBhcGlzIChtb3N0bHkgZm9yIGV4dGVuc2lvbnMpXG5jeXRvc2NhcGUuc3R5bGVzaGVldCA9IGN5dG9zY2FwZS5TdHlsZXNoZWV0ID0gX1N0eWxlc2hlZXQ7XG5cbmV4cG9ydCB7IGN5dG9zY2FwZSBhcyBkZWZhdWx0IH07XG4iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdGlkOiBtb2R1bGVJZCxcblx0XHRsb2FkZWQ6IGZhbHNlLFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdGlmICghKG1vZHVsZUlkIGluIF9fd2VicGFja19tb2R1bGVzX18pKSB7XG5cdFx0ZGVsZXRlIF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgbW9kdWxlSWQgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuXHRtb2R1bGUubG9hZGVkID0gdHJ1ZTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcblx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG5cdFx0ZnVuY3Rpb24oKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG5cdFx0ZnVuY3Rpb24oKSB7IHJldHVybiBtb2R1bGU7IH07XG5cdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsIHsgYTogZ2V0dGVyIH0pO1xuXHRyZXR1cm4gZ2V0dGVyO1xufTsiLCIvLyBkZWZpbmUgZ2V0dGVyL3ZhbHVlIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBkZWZpbml0aW9uKSB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18uZyA9IChmdW5jdGlvbigpIHtcblx0aWYgKHR5cGVvZiBnbG9iYWxUaGlzID09PSAnb2JqZWN0JykgcmV0dXJuIGdsb2JhbFRoaXM7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIHRoaXMgfHwgbmV3IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ29iamVjdCcpIHJldHVybiB3aW5kb3c7XG5cdH1cbn0pKCk7IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqLCBwcm9wKSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTsgfTsiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm5tZCA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuXHRtb2R1bGUucGF0aHMgPSBbXTtcblx0aWYgKCFtb2R1bGUuY2hpbGRyZW4pIG1vZHVsZS5jaGlsZHJlbiA9IFtdO1xuXHRyZXR1cm4gbW9kdWxlO1xufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm5jID0gdW5kZWZpbmVkOyIsIi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvdHlwZS1idWlsdGlucyAqL1xudmFyIGcgPVxuICAodHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnICYmIGdsb2JhbFRoaXMpIHx8XG4gICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgJiYgc2VsZikgfHxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyAmJiBnbG9iYWwpIHx8XG4gIHt9XG5cbnZhciBzdXBwb3J0ID0ge1xuICBzZWFyY2hQYXJhbXM6ICdVUkxTZWFyY2hQYXJhbXMnIGluIGcsXG4gIGl0ZXJhYmxlOiAnU3ltYm9sJyBpbiBnICYmICdpdGVyYXRvcicgaW4gU3ltYm9sLFxuICBibG9iOlxuICAgICdGaWxlUmVhZGVyJyBpbiBnICYmXG4gICAgJ0Jsb2InIGluIGcgJiZcbiAgICAoZnVuY3Rpb24oKSB7XG4gICAgICB0cnkge1xuICAgICAgICBuZXcgQmxvYigpXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH0pKCksXG4gIGZvcm1EYXRhOiAnRm9ybURhdGEnIGluIGcsXG4gIGFycmF5QnVmZmVyOiAnQXJyYXlCdWZmZXInIGluIGdcbn1cblxuZnVuY3Rpb24gaXNEYXRhVmlldyhvYmopIHtcbiAgcmV0dXJuIG9iaiAmJiBEYXRhVmlldy5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihvYmopXG59XG5cbmlmIChzdXBwb3J0LmFycmF5QnVmZmVyKSB7XG4gIHZhciB2aWV3Q2xhc3NlcyA9IFtcbiAgICAnW29iamVjdCBJbnQ4QXJyYXldJyxcbiAgICAnW29iamVjdCBVaW50OEFycmF5XScsXG4gICAgJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJyxcbiAgICAnW29iamVjdCBJbnQxNkFycmF5XScsXG4gICAgJ1tvYmplY3QgVWludDE2QXJyYXldJyxcbiAgICAnW29iamVjdCBJbnQzMkFycmF5XScsXG4gICAgJ1tvYmplY3QgVWludDMyQXJyYXldJyxcbiAgICAnW29iamVjdCBGbG9hdDMyQXJyYXldJyxcbiAgICAnW29iamVjdCBGbG9hdDY0QXJyYXldJ1xuICBdXG5cbiAgdmFyIGlzQXJyYXlCdWZmZXJWaWV3ID1cbiAgICBBcnJheUJ1ZmZlci5pc1ZpZXcgfHxcbiAgICBmdW5jdGlvbihvYmopIHtcbiAgICAgIHJldHVybiBvYmogJiYgdmlld0NsYXNzZXMuaW5kZXhPZihPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSkgPiAtMVxuICAgIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTmFtZShuYW1lKSB7XG4gIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICBuYW1lID0gU3RyaW5nKG5hbWUpXG4gIH1cbiAgaWYgKC9bXmEtejAtOVxcLSMkJSYnKisuXl9gfH4hXS9pLnRlc3QobmFtZSkgfHwgbmFtZSA9PT0gJycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGNoYXJhY3RlciBpbiBoZWFkZXIgZmllbGQgbmFtZTogXCInICsgbmFtZSArICdcIicpXG4gIH1cbiAgcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVWYWx1ZSh2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgIHZhbHVlID0gU3RyaW5nKHZhbHVlKVxuICB9XG4gIHJldHVybiB2YWx1ZVxufVxuXG4vLyBCdWlsZCBhIGRlc3RydWN0aXZlIGl0ZXJhdG9yIGZvciB0aGUgdmFsdWUgbGlzdFxuZnVuY3Rpb24gaXRlcmF0b3JGb3IoaXRlbXMpIHtcbiAgdmFyIGl0ZXJhdG9yID0ge1xuICAgIG5leHQ6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHZhbHVlID0gaXRlbXMuc2hpZnQoKVxuICAgICAgcmV0dXJuIHtkb25lOiB2YWx1ZSA9PT0gdW5kZWZpbmVkLCB2YWx1ZTogdmFsdWV9XG4gICAgfVxuICB9XG5cbiAgaWYgKHN1cHBvcnQuaXRlcmFibGUpIHtcbiAgICBpdGVyYXRvcltTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gaXRlcmF0b3JcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaXRlcmF0b3Jcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEhlYWRlcnMoaGVhZGVycykge1xuICB0aGlzLm1hcCA9IHt9XG5cbiAgaWYgKGhlYWRlcnMgaW5zdGFuY2VvZiBIZWFkZXJzKSB7XG4gICAgaGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgICB0aGlzLmFwcGVuZChuYW1lLCB2YWx1ZSlcbiAgICB9LCB0aGlzKVxuICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoaGVhZGVycykpIHtcbiAgICBoZWFkZXJzLmZvckVhY2goZnVuY3Rpb24oaGVhZGVyKSB7XG4gICAgICBpZiAoaGVhZGVyLmxlbmd0aCAhPSAyKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0hlYWRlcnMgY29uc3RydWN0b3I6IGV4cGVjdGVkIG5hbWUvdmFsdWUgcGFpciB0byBiZSBsZW5ndGggMiwgZm91bmQnICsgaGVhZGVyLmxlbmd0aClcbiAgICAgIH1cbiAgICAgIHRoaXMuYXBwZW5kKGhlYWRlclswXSwgaGVhZGVyWzFdKVxuICAgIH0sIHRoaXMpXG4gIH0gZWxzZSBpZiAoaGVhZGVycykge1xuICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGhlYWRlcnMpLmZvckVhY2goZnVuY3Rpb24obmFtZSkge1xuICAgICAgdGhpcy5hcHBlbmQobmFtZSwgaGVhZGVyc1tuYW1lXSlcbiAgICB9LCB0aGlzKVxuICB9XG59XG5cbkhlYWRlcnMucHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIG5hbWUgPSBub3JtYWxpemVOYW1lKG5hbWUpXG4gIHZhbHVlID0gbm9ybWFsaXplVmFsdWUodmFsdWUpXG4gIHZhciBvbGRWYWx1ZSA9IHRoaXMubWFwW25hbWVdXG4gIHRoaXMubWFwW25hbWVdID0gb2xkVmFsdWUgPyBvbGRWYWx1ZSArICcsICcgKyB2YWx1ZSA6IHZhbHVlXG59XG5cbkhlYWRlcnMucHJvdG90eXBlWydkZWxldGUnXSA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgZGVsZXRlIHRoaXMubWFwW25vcm1hbGl6ZU5hbWUobmFtZSldXG59XG5cbkhlYWRlcnMucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgbmFtZSA9IG5vcm1hbGl6ZU5hbWUobmFtZSlcbiAgcmV0dXJuIHRoaXMuaGFzKG5hbWUpID8gdGhpcy5tYXBbbmFtZV0gOiBudWxsXG59XG5cbkhlYWRlcnMucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgcmV0dXJuIHRoaXMubWFwLmhhc093blByb3BlcnR5KG5vcm1hbGl6ZU5hbWUobmFtZSkpXG59XG5cbkhlYWRlcnMucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHRoaXMubWFwW25vcm1hbGl6ZU5hbWUobmFtZSldID0gbm9ybWFsaXplVmFsdWUodmFsdWUpXG59XG5cbkhlYWRlcnMucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbihjYWxsYmFjaywgdGhpc0FyZykge1xuICBmb3IgKHZhciBuYW1lIGluIHRoaXMubWFwKSB7XG4gICAgaWYgKHRoaXMubWFwLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICBjYWxsYmFjay5jYWxsKHRoaXNBcmcsIHRoaXMubWFwW25hbWVdLCBuYW1lLCB0aGlzKVxuICAgIH1cbiAgfVxufVxuXG5IZWFkZXJzLnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24oKSB7XG4gIHZhciBpdGVtcyA9IFtdXG4gIHRoaXMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgIGl0ZW1zLnB1c2gobmFtZSlcbiAgfSlcbiAgcmV0dXJuIGl0ZXJhdG9yRm9yKGl0ZW1zKVxufVxuXG5IZWFkZXJzLnByb3RvdHlwZS52YWx1ZXMgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGl0ZW1zID0gW11cbiAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgaXRlbXMucHVzaCh2YWx1ZSlcbiAgfSlcbiAgcmV0dXJuIGl0ZXJhdG9yRm9yKGl0ZW1zKVxufVxuXG5IZWFkZXJzLnByb3RvdHlwZS5lbnRyaWVzID0gZnVuY3Rpb24oKSB7XG4gIHZhciBpdGVtcyA9IFtdXG4gIHRoaXMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgIGl0ZW1zLnB1c2goW25hbWUsIHZhbHVlXSlcbiAgfSlcbiAgcmV0dXJuIGl0ZXJhdG9yRm9yKGl0ZW1zKVxufVxuXG5pZiAoc3VwcG9ydC5pdGVyYWJsZSkge1xuICBIZWFkZXJzLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID0gSGVhZGVycy5wcm90b3R5cGUuZW50cmllc1xufVxuXG5mdW5jdGlvbiBjb25zdW1lZChib2R5KSB7XG4gIGlmIChib2R5Ll9ub0JvZHkpIHJldHVyblxuICBpZiAoYm9keS5ib2R5VXNlZCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgVHlwZUVycm9yKCdBbHJlYWR5IHJlYWQnKSlcbiAgfVxuICBib2R5LmJvZHlVc2VkID0gdHJ1ZVxufVxuXG5mdW5jdGlvbiBmaWxlUmVhZGVyUmVhZHkocmVhZGVyKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICByZWFkZXIub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXNvbHZlKHJlYWRlci5yZXN1bHQpXG4gICAgfVxuICAgIHJlYWRlci5vbmVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICByZWplY3QocmVhZGVyLmVycm9yKVxuICAgIH1cbiAgfSlcbn1cblxuZnVuY3Rpb24gcmVhZEJsb2JBc0FycmF5QnVmZmVyKGJsb2IpIHtcbiAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKClcbiAgdmFyIHByb21pc2UgPSBmaWxlUmVhZGVyUmVhZHkocmVhZGVyKVxuICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoYmxvYilcbiAgcmV0dXJuIHByb21pc2Vcbn1cblxuZnVuY3Rpb24gcmVhZEJsb2JBc1RleHQoYmxvYikge1xuICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKVxuICB2YXIgcHJvbWlzZSA9IGZpbGVSZWFkZXJSZWFkeShyZWFkZXIpXG4gIHZhciBtYXRjaCA9IC9jaGFyc2V0PShbQS1aYS16MC05Xy1dKykvLmV4ZWMoYmxvYi50eXBlKVxuICB2YXIgZW5jb2RpbmcgPSBtYXRjaCA/IG1hdGNoWzFdIDogJ3V0Zi04J1xuICByZWFkZXIucmVhZEFzVGV4dChibG9iLCBlbmNvZGluZylcbiAgcmV0dXJuIHByb21pc2Vcbn1cblxuZnVuY3Rpb24gcmVhZEFycmF5QnVmZmVyQXNUZXh0KGJ1Zikge1xuICB2YXIgdmlldyA9IG5ldyBVaW50OEFycmF5KGJ1ZilcbiAgdmFyIGNoYXJzID0gbmV3IEFycmF5KHZpZXcubGVuZ3RoKVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdmlldy5sZW5ndGg7IGkrKykge1xuICAgIGNoYXJzW2ldID0gU3RyaW5nLmZyb21DaGFyQ29kZSh2aWV3W2ldKVxuICB9XG4gIHJldHVybiBjaGFycy5qb2luKCcnKVxufVxuXG5mdW5jdGlvbiBidWZmZXJDbG9uZShidWYpIHtcbiAgaWYgKGJ1Zi5zbGljZSkge1xuICAgIHJldHVybiBidWYuc2xpY2UoMClcbiAgfSBlbHNlIHtcbiAgICB2YXIgdmlldyA9IG5ldyBVaW50OEFycmF5KGJ1Zi5ieXRlTGVuZ3RoKVxuICAgIHZpZXcuc2V0KG5ldyBVaW50OEFycmF5KGJ1ZikpXG4gICAgcmV0dXJuIHZpZXcuYnVmZmVyXG4gIH1cbn1cblxuZnVuY3Rpb24gQm9keSgpIHtcbiAgdGhpcy5ib2R5VXNlZCA9IGZhbHNlXG5cbiAgdGhpcy5faW5pdEJvZHkgPSBmdW5jdGlvbihib2R5KSB7XG4gICAgLypcbiAgICAgIGZldGNoLW1vY2sgd3JhcHMgdGhlIFJlc3BvbnNlIG9iamVjdCBpbiBhbiBFUzYgUHJveHkgdG9cbiAgICAgIHByb3ZpZGUgdXNlZnVsIHRlc3QgaGFybmVzcyBmZWF0dXJlcyBzdWNoIGFzIGZsdXNoLiBIb3dldmVyLCBvblxuICAgICAgRVM1IGJyb3dzZXJzIHdpdGhvdXQgZmV0Y2ggb3IgUHJveHkgc3VwcG9ydCBwb2xseWZpbGxzIG11c3QgYmUgdXNlZDtcbiAgICAgIHRoZSBwcm94eS1wb2xseWZpbGwgaXMgdW5hYmxlIHRvIHByb3h5IGFuIGF0dHJpYnV0ZSB1bmxlc3MgaXQgZXhpc3RzXG4gICAgICBvbiB0aGUgb2JqZWN0IGJlZm9yZSB0aGUgUHJveHkgaXMgY3JlYXRlZC4gVGhpcyBjaGFuZ2UgZW5zdXJlc1xuICAgICAgUmVzcG9uc2UuYm9keVVzZWQgZXhpc3RzIG9uIHRoZSBpbnN0YW5jZSwgd2hpbGUgbWFpbnRhaW5pbmcgdGhlXG4gICAgICBzZW1hbnRpYyBvZiBzZXR0aW5nIFJlcXVlc3QuYm9keVVzZWQgaW4gdGhlIGNvbnN0cnVjdG9yIGJlZm9yZVxuICAgICAgX2luaXRCb2R5IGlzIGNhbGxlZC5cbiAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWFzc2lnblxuICAgIHRoaXMuYm9keVVzZWQgPSB0aGlzLmJvZHlVc2VkXG4gICAgdGhpcy5fYm9keUluaXQgPSBib2R5XG4gICAgaWYgKCFib2R5KSB7XG4gICAgICB0aGlzLl9ub0JvZHkgPSB0cnVlO1xuICAgICAgdGhpcy5fYm9keVRleHQgPSAnJ1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGJvZHkgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLl9ib2R5VGV4dCA9IGJvZHlcbiAgICB9IGVsc2UgaWYgKHN1cHBvcnQuYmxvYiAmJiBCbG9iLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGJvZHkpKSB7XG4gICAgICB0aGlzLl9ib2R5QmxvYiA9IGJvZHlcbiAgICB9IGVsc2UgaWYgKHN1cHBvcnQuZm9ybURhdGEgJiYgRm9ybURhdGEucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYm9keSkpIHtcbiAgICAgIHRoaXMuX2JvZHlGb3JtRGF0YSA9IGJvZHlcbiAgICB9IGVsc2UgaWYgKHN1cHBvcnQuc2VhcmNoUGFyYW1zICYmIFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihib2R5KSkge1xuICAgICAgdGhpcy5fYm9keVRleHQgPSBib2R5LnRvU3RyaW5nKClcbiAgICB9IGVsc2UgaWYgKHN1cHBvcnQuYXJyYXlCdWZmZXIgJiYgc3VwcG9ydC5ibG9iICYmIGlzRGF0YVZpZXcoYm9keSkpIHtcbiAgICAgIHRoaXMuX2JvZHlBcnJheUJ1ZmZlciA9IGJ1ZmZlckNsb25lKGJvZHkuYnVmZmVyKVxuICAgICAgLy8gSUUgMTAtMTEgY2FuJ3QgaGFuZGxlIGEgRGF0YVZpZXcgYm9keS5cbiAgICAgIHRoaXMuX2JvZHlJbml0ID0gbmV3IEJsb2IoW3RoaXMuX2JvZHlBcnJheUJ1ZmZlcl0pXG4gICAgfSBlbHNlIGlmIChzdXBwb3J0LmFycmF5QnVmZmVyICYmIChBcnJheUJ1ZmZlci5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihib2R5KSB8fCBpc0FycmF5QnVmZmVyVmlldyhib2R5KSkpIHtcbiAgICAgIHRoaXMuX2JvZHlBcnJheUJ1ZmZlciA9IGJ1ZmZlckNsb25lKGJvZHkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2JvZHlUZXh0ID0gYm9keSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChib2R5KVxuICAgIH1cblxuICAgIGlmICghdGhpcy5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJykpIHtcbiAgICAgIGlmICh0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy5oZWFkZXJzLnNldCgnY29udGVudC10eXBlJywgJ3RleHQvcGxhaW47Y2hhcnNldD1VVEYtOCcpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX2JvZHlCbG9iICYmIHRoaXMuX2JvZHlCbG9iLnR5cGUpIHtcbiAgICAgICAgdGhpcy5oZWFkZXJzLnNldCgnY29udGVudC10eXBlJywgdGhpcy5fYm9keUJsb2IudHlwZSlcbiAgICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5zZWFyY2hQYXJhbXMgJiYgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGJvZHkpKSB7XG4gICAgICAgIHRoaXMuaGVhZGVycy5zZXQoJ2NvbnRlbnQtdHlwZScsICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD1VVEYtOCcpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHN1cHBvcnQuYmxvYikge1xuICAgIHRoaXMuYmxvYiA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHJlamVjdGVkID0gY29uc3VtZWQodGhpcylcbiAgICAgIGlmIChyZWplY3RlZCkge1xuICAgICAgICByZXR1cm4gcmVqZWN0ZWRcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX2JvZHlCbG9iKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYm9keUJsb2IpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX2JvZHlBcnJheUJ1ZmZlcikge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ldyBCbG9iKFt0aGlzLl9ib2R5QXJyYXlCdWZmZXJdKSlcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fYm9keUZvcm1EYXRhKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IHJlYWQgRm9ybURhdGEgYm9keSBhcyBibG9iJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobmV3IEJsb2IoW3RoaXMuX2JvZHlUZXh0XSkpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdGhpcy5hcnJheUJ1ZmZlciA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpIHtcbiAgICAgIHZhciBpc0NvbnN1bWVkID0gY29uc3VtZWQodGhpcylcbiAgICAgIGlmIChpc0NvbnN1bWVkKSB7XG4gICAgICAgIHJldHVybiBpc0NvbnN1bWVkXG4gICAgICB9IGVsc2UgaWYgKEFycmF5QnVmZmVyLmlzVmlldyh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoXG4gICAgICAgICAgdGhpcy5fYm9keUFycmF5QnVmZmVyLmJ1ZmZlci5zbGljZShcbiAgICAgICAgICAgIHRoaXMuX2JvZHlBcnJheUJ1ZmZlci5ieXRlT2Zmc2V0LFxuICAgICAgICAgICAgdGhpcy5fYm9keUFycmF5QnVmZmVyLmJ5dGVPZmZzZXQgKyB0aGlzLl9ib2R5QXJyYXlCdWZmZXIuYnl0ZUxlbmd0aFxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzdXBwb3J0LmJsb2IpIHtcbiAgICAgIHJldHVybiB0aGlzLmJsb2IoKS50aGVuKHJlYWRCbG9iQXNBcnJheUJ1ZmZlcilcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgcmVhZCBhcyBBcnJheUJ1ZmZlcicpXG4gICAgfVxuICB9XG5cbiAgdGhpcy50ZXh0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHJlamVjdGVkID0gY29uc3VtZWQodGhpcylcbiAgICBpZiAocmVqZWN0ZWQpIHtcbiAgICAgIHJldHVybiByZWplY3RlZFxuICAgIH1cblxuICAgIGlmICh0aGlzLl9ib2R5QmxvYikge1xuICAgICAgcmV0dXJuIHJlYWRCbG9iQXNUZXh0KHRoaXMuX2JvZHlCbG9iKVxuICAgIH0gZWxzZSBpZiAodGhpcy5fYm9keUFycmF5QnVmZmVyKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlYWRBcnJheUJ1ZmZlckFzVGV4dCh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpKVxuICAgIH0gZWxzZSBpZiAodGhpcy5fYm9keUZvcm1EYXRhKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdWxkIG5vdCByZWFkIEZvcm1EYXRhIGJvZHkgYXMgdGV4dCcpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYm9keVRleHQpXG4gICAgfVxuICB9XG5cbiAgaWYgKHN1cHBvcnQuZm9ybURhdGEpIHtcbiAgICB0aGlzLmZvcm1EYXRhID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy50ZXh0KCkudGhlbihkZWNvZGUpXG4gICAgfVxuICB9XG5cbiAgdGhpcy5qc29uID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudGV4dCgpLnRoZW4oSlNPTi5wYXJzZSlcbiAgfVxuXG4gIHJldHVybiB0aGlzXG59XG5cbi8vIEhUVFAgbWV0aG9kcyB3aG9zZSBjYXBpdGFsaXphdGlvbiBzaG91bGQgYmUgbm9ybWFsaXplZFxudmFyIG1ldGhvZHMgPSBbJ0NPTk5FQ1QnLCAnREVMRVRFJywgJ0dFVCcsICdIRUFEJywgJ09QVElPTlMnLCAnUEFUQ0gnLCAnUE9TVCcsICdQVVQnLCAnVFJBQ0UnXVxuXG5mdW5jdGlvbiBub3JtYWxpemVNZXRob2QobWV0aG9kKSB7XG4gIHZhciB1cGNhc2VkID0gbWV0aG9kLnRvVXBwZXJDYXNlKClcbiAgcmV0dXJuIG1ldGhvZHMuaW5kZXhPZih1cGNhc2VkKSA+IC0xID8gdXBjYXNlZCA6IG1ldGhvZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gUmVxdWVzdChpbnB1dCwgb3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUmVxdWVzdCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdQbGVhc2UgdXNlIHRoZSBcIm5ld1wiIG9wZXJhdG9yLCB0aGlzIERPTSBvYmplY3QgY29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLicpXG4gIH1cblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fVxuICB2YXIgYm9keSA9IG9wdGlvbnMuYm9keVxuXG4gIGlmIChpbnB1dCBpbnN0YW5jZW9mIFJlcXVlc3QpIHtcbiAgICBpZiAoaW5wdXQuYm9keVVzZWQpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FscmVhZHkgcmVhZCcpXG4gICAgfVxuICAgIHRoaXMudXJsID0gaW5wdXQudXJsXG4gICAgdGhpcy5jcmVkZW50aWFscyA9IGlucHV0LmNyZWRlbnRpYWxzXG4gICAgaWYgKCFvcHRpb25zLmhlYWRlcnMpIHtcbiAgICAgIHRoaXMuaGVhZGVycyA9IG5ldyBIZWFkZXJzKGlucHV0LmhlYWRlcnMpXG4gICAgfVxuICAgIHRoaXMubWV0aG9kID0gaW5wdXQubWV0aG9kXG4gICAgdGhpcy5tb2RlID0gaW5wdXQubW9kZVxuICAgIHRoaXMuc2lnbmFsID0gaW5wdXQuc2lnbmFsXG4gICAgaWYgKCFib2R5ICYmIGlucHV0Ll9ib2R5SW5pdCAhPSBudWxsKSB7XG4gICAgICBib2R5ID0gaW5wdXQuX2JvZHlJbml0XG4gICAgICBpbnB1dC5ib2R5VXNlZCA9IHRydWVcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhpcy51cmwgPSBTdHJpbmcoaW5wdXQpXG4gIH1cblxuICB0aGlzLmNyZWRlbnRpYWxzID0gb3B0aW9ucy5jcmVkZW50aWFscyB8fCB0aGlzLmNyZWRlbnRpYWxzIHx8ICdzYW1lLW9yaWdpbidcbiAgaWYgKG9wdGlvbnMuaGVhZGVycyB8fCAhdGhpcy5oZWFkZXJzKSB7XG4gICAgdGhpcy5oZWFkZXJzID0gbmV3IEhlYWRlcnMob3B0aW9ucy5oZWFkZXJzKVxuICB9XG4gIHRoaXMubWV0aG9kID0gbm9ybWFsaXplTWV0aG9kKG9wdGlvbnMubWV0aG9kIHx8IHRoaXMubWV0aG9kIHx8ICdHRVQnKVxuICB0aGlzLm1vZGUgPSBvcHRpb25zLm1vZGUgfHwgdGhpcy5tb2RlIHx8IG51bGxcbiAgdGhpcy5zaWduYWwgPSBvcHRpb25zLnNpZ25hbCB8fCB0aGlzLnNpZ25hbCB8fCAoZnVuY3Rpb24gKCkge1xuICAgIGlmICgnQWJvcnRDb250cm9sbGVyJyBpbiBnKSB7XG4gICAgICB2YXIgY3RybCA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgIHJldHVybiBjdHJsLnNpZ25hbDtcbiAgICB9XG4gIH0oKSk7XG4gIHRoaXMucmVmZXJyZXIgPSBudWxsXG5cbiAgaWYgKCh0aGlzLm1ldGhvZCA9PT0gJ0dFVCcgfHwgdGhpcy5tZXRob2QgPT09ICdIRUFEJykgJiYgYm9keSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0JvZHkgbm90IGFsbG93ZWQgZm9yIEdFVCBvciBIRUFEIHJlcXVlc3RzJylcbiAgfVxuICB0aGlzLl9pbml0Qm9keShib2R5KVxuXG4gIGlmICh0aGlzLm1ldGhvZCA9PT0gJ0dFVCcgfHwgdGhpcy5tZXRob2QgPT09ICdIRUFEJykge1xuICAgIGlmIChvcHRpb25zLmNhY2hlID09PSAnbm8tc3RvcmUnIHx8IG9wdGlvbnMuY2FjaGUgPT09ICduby1jYWNoZScpIHtcbiAgICAgIC8vIFNlYXJjaCBmb3IgYSAnXycgcGFyYW1ldGVyIGluIHRoZSBxdWVyeSBzdHJpbmdcbiAgICAgIHZhciByZVBhcmFtU2VhcmNoID0gLyhbPyZdKV89W14mXSovXG4gICAgICBpZiAocmVQYXJhbVNlYXJjaC50ZXN0KHRoaXMudXJsKSkge1xuICAgICAgICAvLyBJZiBpdCBhbHJlYWR5IGV4aXN0cyB0aGVuIHNldCB0aGUgdmFsdWUgd2l0aCB0aGUgY3VycmVudCB0aW1lXG4gICAgICAgIHRoaXMudXJsID0gdGhpcy51cmwucmVwbGFjZShyZVBhcmFtU2VhcmNoLCAnJDFfPScgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE90aGVyd2lzZSBhZGQgYSBuZXcgJ18nIHBhcmFtZXRlciB0byB0aGUgZW5kIHdpdGggdGhlIGN1cnJlbnQgdGltZVxuICAgICAgICB2YXIgcmVRdWVyeVN0cmluZyA9IC9cXD8vXG4gICAgICAgIHRoaXMudXJsICs9IChyZVF1ZXJ5U3RyaW5nLnRlc3QodGhpcy51cmwpID8gJyYnIDogJz8nKSArICdfPScgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFJlcXVlc3QodGhpcywge2JvZHk6IHRoaXMuX2JvZHlJbml0fSlcbn1cblxuZnVuY3Rpb24gZGVjb2RlKGJvZHkpIHtcbiAgdmFyIGZvcm0gPSBuZXcgRm9ybURhdGEoKVxuICBib2R5XG4gICAgLnRyaW0oKVxuICAgIC5zcGxpdCgnJicpXG4gICAgLmZvckVhY2goZnVuY3Rpb24oYnl0ZXMpIHtcbiAgICAgIGlmIChieXRlcykge1xuICAgICAgICB2YXIgc3BsaXQgPSBieXRlcy5zcGxpdCgnPScpXG4gICAgICAgIHZhciBuYW1lID0gc3BsaXQuc2hpZnQoKS5yZXBsYWNlKC9cXCsvZywgJyAnKVxuICAgICAgICB2YXIgdmFsdWUgPSBzcGxpdC5qb2luKCc9JykucmVwbGFjZSgvXFwrL2csICcgJylcbiAgICAgICAgZm9ybS5hcHBlbmQoZGVjb2RlVVJJQ29tcG9uZW50KG5hbWUpLCBkZWNvZGVVUklDb21wb25lbnQodmFsdWUpKVxuICAgICAgfVxuICAgIH0pXG4gIHJldHVybiBmb3JtXG59XG5cbmZ1bmN0aW9uIHBhcnNlSGVhZGVycyhyYXdIZWFkZXJzKSB7XG4gIHZhciBoZWFkZXJzID0gbmV3IEhlYWRlcnMoKVxuICAvLyBSZXBsYWNlIGluc3RhbmNlcyBvZiBcXHJcXG4gYW5kIFxcbiBmb2xsb3dlZCBieSBhdCBsZWFzdCBvbmUgc3BhY2Ugb3IgaG9yaXpvbnRhbCB0YWIgd2l0aCBhIHNwYWNlXG4gIC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMwI3NlY3Rpb24tMy4yXG4gIHZhciBwcmVQcm9jZXNzZWRIZWFkZXJzID0gcmF3SGVhZGVycy5yZXBsYWNlKC9cXHI/XFxuW1xcdCBdKy9nLCAnICcpXG4gIC8vIEF2b2lkaW5nIHNwbGl0IHZpYSByZWdleCB0byB3b3JrIGFyb3VuZCBhIGNvbW1vbiBJRTExIGJ1ZyB3aXRoIHRoZSBjb3JlLWpzIDMuNi4wIHJlZ2V4IHBvbHlmaWxsXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9naXRodWIvZmV0Y2gvaXNzdWVzLzc0OFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNzUxXG4gIHByZVByb2Nlc3NlZEhlYWRlcnNcbiAgICAuc3BsaXQoJ1xccicpXG4gICAgLm1hcChmdW5jdGlvbihoZWFkZXIpIHtcbiAgICAgIHJldHVybiBoZWFkZXIuaW5kZXhPZignXFxuJykgPT09IDAgPyBoZWFkZXIuc3Vic3RyKDEsIGhlYWRlci5sZW5ndGgpIDogaGVhZGVyXG4gICAgfSlcbiAgICAuZm9yRWFjaChmdW5jdGlvbihsaW5lKSB7XG4gICAgICB2YXIgcGFydHMgPSBsaW5lLnNwbGl0KCc6JylcbiAgICAgIHZhciBrZXkgPSBwYXJ0cy5zaGlmdCgpLnRyaW0oKVxuICAgICAgaWYgKGtleSkge1xuICAgICAgICB2YXIgdmFsdWUgPSBwYXJ0cy5qb2luKCc6JykudHJpbSgpXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaGVhZGVycy5hcHBlbmQoa2V5LCB2YWx1ZSlcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1Jlc3BvbnNlICcgKyBlcnJvci5tZXNzYWdlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgcmV0dXJuIGhlYWRlcnNcbn1cblxuQm9keS5jYWxsKFJlcXVlc3QucHJvdG90eXBlKVxuXG5leHBvcnQgZnVuY3Rpb24gUmVzcG9uc2UoYm9keUluaXQsIG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFJlc3BvbnNlKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1BsZWFzZSB1c2UgdGhlIFwibmV3XCIgb3BlcmF0b3IsIHRoaXMgRE9NIG9iamVjdCBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgY2FsbGVkIGFzIGEgZnVuY3Rpb24uJylcbiAgfVxuICBpZiAoIW9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0ge31cbiAgfVxuXG4gIHRoaXMudHlwZSA9ICdkZWZhdWx0J1xuICB0aGlzLnN0YXR1cyA9IG9wdGlvbnMuc3RhdHVzID09PSB1bmRlZmluZWQgPyAyMDAgOiBvcHRpb25zLnN0YXR1c1xuICBpZiAodGhpcy5zdGF0dXMgPCAyMDAgfHwgdGhpcy5zdGF0dXMgPiA1OTkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkZhaWxlZCB0byBjb25zdHJ1Y3QgJ1Jlc3BvbnNlJzogVGhlIHN0YXR1cyBwcm92aWRlZCAoMCkgaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzIwMCwgNTk5XS5cIilcbiAgfVxuICB0aGlzLm9rID0gdGhpcy5zdGF0dXMgPj0gMjAwICYmIHRoaXMuc3RhdHVzIDwgMzAwXG4gIHRoaXMuc3RhdHVzVGV4dCA9IG9wdGlvbnMuc3RhdHVzVGV4dCA9PT0gdW5kZWZpbmVkID8gJycgOiAnJyArIG9wdGlvbnMuc3RhdHVzVGV4dFxuICB0aGlzLmhlYWRlcnMgPSBuZXcgSGVhZGVycyhvcHRpb25zLmhlYWRlcnMpXG4gIHRoaXMudXJsID0gb3B0aW9ucy51cmwgfHwgJydcbiAgdGhpcy5faW5pdEJvZHkoYm9keUluaXQpXG59XG5cbkJvZHkuY2FsbChSZXNwb25zZS5wcm90b3R5cGUpXG5cblJlc3BvbnNlLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFJlc3BvbnNlKHRoaXMuX2JvZHlJbml0LCB7XG4gICAgc3RhdHVzOiB0aGlzLnN0YXR1cyxcbiAgICBzdGF0dXNUZXh0OiB0aGlzLnN0YXR1c1RleHQsXG4gICAgaGVhZGVyczogbmV3IEhlYWRlcnModGhpcy5oZWFkZXJzKSxcbiAgICB1cmw6IHRoaXMudXJsXG4gIH0pXG59XG5cblJlc3BvbnNlLmVycm9yID0gZnVuY3Rpb24oKSB7XG4gIHZhciByZXNwb25zZSA9IG5ldyBSZXNwb25zZShudWxsLCB7c3RhdHVzOiAyMDAsIHN0YXR1c1RleHQ6ICcnfSlcbiAgcmVzcG9uc2Uub2sgPSBmYWxzZVxuICByZXNwb25zZS5zdGF0dXMgPSAwXG4gIHJlc3BvbnNlLnR5cGUgPSAnZXJyb3InXG4gIHJldHVybiByZXNwb25zZVxufVxuXG52YXIgcmVkaXJlY3RTdGF0dXNlcyA9IFszMDEsIDMwMiwgMzAzLCAzMDcsIDMwOF1cblxuUmVzcG9uc2UucmVkaXJlY3QgPSBmdW5jdGlvbih1cmwsIHN0YXR1cykge1xuICBpZiAocmVkaXJlY3RTdGF0dXNlcy5pbmRleE9mKHN0YXR1cykgPT09IC0xKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgc3RhdHVzIGNvZGUnKVxuICB9XG5cbiAgcmV0dXJuIG5ldyBSZXNwb25zZShudWxsLCB7c3RhdHVzOiBzdGF0dXMsIGhlYWRlcnM6IHtsb2NhdGlvbjogdXJsfX0pXG59XG5cbmV4cG9ydCB2YXIgRE9NRXhjZXB0aW9uID0gZy5ET01FeGNlcHRpb25cbnRyeSB7XG4gIG5ldyBET01FeGNlcHRpb24oKVxufSBjYXRjaCAoZXJyKSB7XG4gIERPTUV4Y2VwdGlvbiA9IGZ1bmN0aW9uKG1lc3NhZ2UsIG5hbWUpIHtcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlXG4gICAgdGhpcy5uYW1lID0gbmFtZVxuICAgIHZhciBlcnJvciA9IEVycm9yKG1lc3NhZ2UpXG4gICAgdGhpcy5zdGFjayA9IGVycm9yLnN0YWNrXG4gIH1cbiAgRE9NRXhjZXB0aW9uLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKVxuICBET01FeGNlcHRpb24ucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRE9NRXhjZXB0aW9uXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmZXRjaChpbnB1dCwgaW5pdCkge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgdmFyIHJlcXVlc3QgPSBuZXcgUmVxdWVzdChpbnB1dCwgaW5pdClcblxuICAgIGlmIChyZXF1ZXN0LnNpZ25hbCAmJiByZXF1ZXN0LnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICByZXR1cm4gcmVqZWN0KG5ldyBET01FeGNlcHRpb24oJ0Fib3J0ZWQnLCAnQWJvcnRFcnJvcicpKVxuICAgIH1cblxuICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxuXG4gICAgZnVuY3Rpb24gYWJvcnRYaHIoKSB7XG4gICAgICB4aHIuYWJvcnQoKVxuICAgIH1cblxuICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICBzdGF0dXNUZXh0OiB4aHIuc3RhdHVzVGV4dCxcbiAgICAgICAgaGVhZGVyczogcGFyc2VIZWFkZXJzKHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSB8fCAnJylcbiAgICAgIH1cbiAgICAgIC8vIFRoaXMgY2hlY2sgaWYgc3BlY2lmaWNhbGx5IGZvciB3aGVuIGEgdXNlciBmZXRjaGVzIGEgZmlsZSBsb2NhbGx5IGZyb20gdGhlIGZpbGUgc3lzdGVtXG4gICAgICAvLyBPbmx5IGlmIHRoZSBzdGF0dXMgaXMgb3V0IG9mIGEgbm9ybWFsIHJhbmdlXG4gICAgICBpZiAocmVxdWVzdC51cmwuaW5kZXhPZignZmlsZTovLycpID09PSAwICYmICh4aHIuc3RhdHVzIDwgMjAwIHx8IHhoci5zdGF0dXMgPiA1OTkpKSB7XG4gICAgICAgIG9wdGlvbnMuc3RhdHVzID0gMjAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3B0aW9ucy5zdGF0dXMgPSB4aHIuc3RhdHVzO1xuICAgICAgfVxuICAgICAgb3B0aW9ucy51cmwgPSAncmVzcG9uc2VVUkwnIGluIHhociA/IHhoci5yZXNwb25zZVVSTCA6IG9wdGlvbnMuaGVhZGVycy5nZXQoJ1gtUmVxdWVzdC1VUkwnKVxuICAgICAgdmFyIGJvZHkgPSAncmVzcG9uc2UnIGluIHhociA/IHhoci5yZXNwb25zZSA6IHhoci5yZXNwb25zZVRleHRcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlc29sdmUobmV3IFJlc3BvbnNlKGJvZHksIG9wdGlvbnMpKVxuICAgICAgfSwgMClcbiAgICB9XG5cbiAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBUeXBlRXJyb3IoJ05ldHdvcmsgcmVxdWVzdCBmYWlsZWQnKSlcbiAgICAgIH0sIDApXG4gICAgfVxuXG4gICAgeGhyLm9udGltZW91dCA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBUeXBlRXJyb3IoJ05ldHdvcmsgcmVxdWVzdCB0aW1lZCBvdXQnKSlcbiAgICAgIH0sIDApXG4gICAgfVxuXG4gICAgeGhyLm9uYWJvcnQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlamVjdChuZXcgRE9NRXhjZXB0aW9uKCdBYm9ydGVkJywgJ0Fib3J0RXJyb3InKSlcbiAgICAgIH0sIDApXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZml4VXJsKHVybCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVybCA9PT0gJycgJiYgZy5sb2NhdGlvbi5ocmVmID8gZy5sb2NhdGlvbi5ocmVmIDogdXJsXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiB1cmxcbiAgICAgIH1cbiAgICB9XG5cbiAgICB4aHIub3BlbihyZXF1ZXN0Lm1ldGhvZCwgZml4VXJsKHJlcXVlc3QudXJsKSwgdHJ1ZSlcblxuICAgIGlmIChyZXF1ZXN0LmNyZWRlbnRpYWxzID09PSAnaW5jbHVkZScpIHtcbiAgICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSB0cnVlXG4gICAgfSBlbHNlIGlmIChyZXF1ZXN0LmNyZWRlbnRpYWxzID09PSAnb21pdCcpIHtcbiAgICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSBmYWxzZVxuICAgIH1cblxuICAgIGlmICgncmVzcG9uc2VUeXBlJyBpbiB4aHIpIHtcbiAgICAgIGlmIChzdXBwb3J0LmJsb2IpIHtcbiAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdibG9iJ1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgc3VwcG9ydC5hcnJheUJ1ZmZlclxuICAgICAgKSB7XG4gICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAnYXJyYXlidWZmZXInXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGluaXQgJiYgdHlwZW9mIGluaXQuaGVhZGVycyA9PT0gJ29iamVjdCcgJiYgIShpbml0LmhlYWRlcnMgaW5zdGFuY2VvZiBIZWFkZXJzIHx8IChnLkhlYWRlcnMgJiYgaW5pdC5oZWFkZXJzIGluc3RhbmNlb2YgZy5IZWFkZXJzKSkpIHtcbiAgICAgIHZhciBuYW1lcyA9IFtdO1xuICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoaW5pdC5oZWFkZXJzKS5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgbmFtZXMucHVzaChub3JtYWxpemVOYW1lKG5hbWUpKVxuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihuYW1lLCBub3JtYWxpemVWYWx1ZShpbml0LmhlYWRlcnNbbmFtZV0pKVxuICAgICAgfSlcbiAgICAgIHJlcXVlc3QuaGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgICAgIGlmIChuYW1lcy5pbmRleE9mKG5hbWUpID09PSAtMSkge1xuICAgICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKG5hbWUsIHZhbHVlKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICByZXF1ZXN0LmhlYWRlcnMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihuYW1lLCB2YWx1ZSlcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3Quc2lnbmFsKSB7XG4gICAgICByZXF1ZXN0LnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0WGhyKVxuXG4gICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIERPTkUgKHN1Y2Nlc3Mgb3IgZmFpbHVyZSlcbiAgICAgICAgaWYgKHhoci5yZWFkeVN0YXRlID09PSA0KSB7XG4gICAgICAgICAgcmVxdWVzdC5zaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBhYm9ydFhocilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHhoci5zZW5kKHR5cGVvZiByZXF1ZXN0Ll9ib2R5SW5pdCA9PT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogcmVxdWVzdC5fYm9keUluaXQpXG4gIH0pXG59XG5cbmZldGNoLnBvbHlmaWxsID0gdHJ1ZVxuXG5pZiAoIWcuZmV0Y2gpIHtcbiAgZy5mZXRjaCA9IGZldGNoXG4gIGcuSGVhZGVycyA9IEhlYWRlcnNcbiAgZy5SZXF1ZXN0ID0gUmVxdWVzdFxuICBnLlJlc3BvbnNlID0gUmVzcG9uc2Vcbn1cbiIsImltcG9ydCAnLi9yZWFjdC1zaGltJzsgLy8gRmFsbGJhY2s7IG5vcm1hbGx5IGxvYWRlZCBzdGFuZGFsb25lIHJpZ2h0IGFmdGVyIFJlYWN0XG5pbXBvcnQge0Rhc2hSZW5kZXJlcn0gZnJvbSAnLi9EYXNoUmVuZGVyZXInO1xuaW1wb3J0ICcuL3V0aWxzL2NsaWVudHNpZGVGdW5jdGlvbnMnO1xuXG4vLyBtYWtlIERhc2hSZW5kZXJlciBnbG9iYWxseSBhdmFpbGFibGVcbndpbmRvdy5EYXNoUmVuZGVyZXIgPSBEYXNoUmVuZGVyZXI7XG4iXSwibmFtZXMiOlsiUHJvcFR5cGVzIiwiUmVhY3QiLCJ1c2VTdGF0ZSIsInVzZUVmZmVjdCIsIlByb3ZpZGVyIiwiU3RvcmUiLCJBcHBDb250YWluZXIiLCJnZXRDb25maWdGcm9tRE9NIiwiaW5pdGlhbGl6ZVdlYlNvY2tldCIsImRpc2Nvbm5lY3RXZWJTb2NrZXQiLCJBcHBQcm92aWRlciIsIl9yZWYiLCJfcmVmJGhvb2tzIiwiaG9va3MiLCJsYXlvdXRfcHJlIiwibGF5b3V0X3Bvc3QiLCJyZXF1ZXN0X3ByZSIsInJlcXVlc3RfcG9zdCIsImNhbGxiYWNrX3Jlc29sdmVkIiwicmVxdWVzdF9yZWZyZXNoX2p3dCIsIl91c2VTdGF0ZSIsIl91c2VTdGF0ZTIiLCJfc2xpY2VkVG9BcnJheSIsInN0b3JlIiwiX2NvbmZpZyR3ZWJzb2NrZXQiLCJfY29uZmlnJHdlYnNvY2tldDIiLCJjb25maWciLCJ3ZWJzb2NrZXQiLCJ1cmwiLCJ3b3JrZXJfdXJsIiwiZnVsbENvbmZpZyIsIl9vYmplY3RTcHJlYWQiLCJmZXRjaCIsImNyZWRlbnRpYWxzIiwiaGVhZGVycyIsIkFjY2VwdCIsImNyZWF0ZUVsZW1lbnQiLCJwcm9wVHlwZXMiLCJzaGFwZSIsImZ1bmMiLCJhbnkiLCJmaWx0ZXIiLCJtYXAiLCJwYXRoIiwiU3RvcmVPYnNlcnZlciIsIl9jcmVhdGVDbGFzcyIsIl90aGlzIiwiX2NsYXNzQ2FsbENoZWNrIiwiX2RlZmluZVByb3BlcnR5Iiwib2JzZXJ2ZXIiLCJpbnB1dHMiLCJBcnJheSIsImlzQXJyYXkiLCJFcnJvciIsImFkZCIsInJlbW92ZSIsIl9fZmluYWxpemVfXyIsIl9faW5pdF9fIiwiX3RoaXMkX3Vuc3Vic2NyaWJlIiwiX3Vuc3Vic2NyaWJlIiwiY2FsbCIsIl9zdG9yZSIsInN1YnNjcmliZSIsIm5vdGlmeSIsIl9vYnNlcnZlcnMiLCJmb3JFYWNoIiwibyIsImxhc3RTdGF0ZSIsInB1c2giLCJpbnB1dFBhdGhzIiwicCIsInNwbGl0IiwidHJpZ2dlcmVkIiwic3RhdGUiLCJnZXRTdGF0ZSIsImkiLCJzcGxpY2UiLCJmaW5kSW5kZXgiLCJkZWZhdWx0IiwiZSIsInQiLCJyIiwiU3ltYm9sIiwibiIsIml0ZXJhdG9yIiwidG9TdHJpbmdUYWciLCJjIiwicHJvdG90eXBlIiwiR2VuZXJhdG9yIiwidSIsIk9iamVjdCIsImNyZWF0ZSIsIl9yZWdlbmVyYXRvckRlZmluZTIiLCJmIiwieSIsIkciLCJ2IiwiYSIsImQiLCJiaW5kIiwibGVuZ3RoIiwibCIsIlR5cGVFcnJvciIsImRvbmUiLCJ2YWx1ZSIsInJldHVybiIsIkdlbmVyYXRvckZ1bmN0aW9uIiwiR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUiLCJnZXRQcm90b3R5cGVPZiIsInNldFByb3RvdHlwZU9mIiwiX19wcm90b19fIiwiZGlzcGxheU5hbWUiLCJfcmVnZW5lcmF0b3IiLCJ3IiwibSIsImRlZmluZVByb3BlcnR5IiwiX3JlZ2VuZXJhdG9yRGVmaW5lIiwiX2ludm9rZSIsImVudW1lcmFibGUiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsImFzeW5jR2VuZXJhdG9yU3RlcCIsIlByb21pc2UiLCJyZXNvbHZlIiwidGhlbiIsIl9hc3luY1RvR2VuZXJhdG9yIiwiYXJndW1lbnRzIiwiYXBwbHkiLCJfbmV4dCIsIl90aHJvdyIsIl90b0NvbnN1bWFibGVBcnJheSIsIl9hcnJheVdpdGhvdXRIb2xlcyIsIl9pdGVyYWJsZVRvQXJyYXkiLCJfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkiLCJfbm9uSXRlcmFibGVTcHJlYWQiLCJmcm9tIiwiX2FycmF5TGlrZVRvQXJyYXkiLCJfYXJyYXlXaXRoSG9sZXMiLCJfaXRlcmFibGVUb0FycmF5TGltaXQiLCJfbm9uSXRlcmFibGVSZXN0IiwidG9TdHJpbmciLCJzbGljZSIsImNvbnN0cnVjdG9yIiwibmFtZSIsInRlc3QiLCJuZXh0Iiwib3duS2V5cyIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsIl90b1Byb3BlcnR5S2V5IiwiX3RvUHJpbWl0aXZlIiwiX3R5cGVvZiIsInRvUHJpbWl0aXZlIiwiU3RyaW5nIiwiTnVtYmVyIiwiY29uY2F0IiwiZmxhdHRlbiIsImludGVyc2VjdGlvbiIsIm1lcmdlRGVlcFJpZ2h0IiwicGljayIsInBsdWNrIiwidmFsdWVzIiwidG9QYWlycyIsInppcCIsImFzc29jUGF0aCIsIlNUQVRVUyIsIkpXVF9FWFBJUkVEX01FU1NBR0UiLCJNQVhfQVVUSF9SRVRSSUVTIiwiQ2FsbGJhY2tBY3Rpb25UeXBlIiwiQ2FsbGJhY2tBZ2dyZWdhdGVBY3Rpb25UeXBlIiwiaXNNdWx0aVZhbHVlZCIsInN0cmluZ2lmeUlkIiwiaXNNdWx0aU91dHB1dFByb3AiLCJ1cmxCYXNlIiwiZ2V0Q1NSRkhlYWRlciIsImRpc3BhdGNoRXJyb3IiLCJzZXRQYXRocyIsImNyZWF0ZUFjdGlvbiIsImFkZEh0dHBIZWFkZXJzIiwibm90aWZ5T2JzZXJ2ZXJzIiwidXBkYXRlUHJvcHMiLCJpc1BhdGNoIiwicGFyc2VQYXRjaFByb3BzIiwiY3JlYXRlUGF0Y2hBbmFseXNpcyIsImNvbXB1dGVQYXRocyIsImdldFBhdGgiLCJyZXF1ZXN0RGVwZW5kZW5jaWVzIiwibG9hZExpYnJhcnkiLCJnZXRTdHJlYW1DbGllbnQiLCJpc1N0cmVhbU11bHRpcGxleGVkIiwicGFyc2VQTUNJZCIsInJlcGxhY2VQTUMiLCJsb2FkZWQiLCJsb2FkaW5nIiwiZ2V0Q29tcG9uZW50TGF5b3V0IiwiZ2V0V29ya2VyQ2xpZW50IiwiaXNXZWJTb2NrZXRFbmFibGVkIiwiaXNXZWJTb2NrZXRBdmFpbGFibGUiLCJhZGRCbG9ja2VkQ2FsbGJhY2tzIiwiQWRkQmxvY2tlZCIsImFkZENvbXBsZXRlZENhbGxiYWNrcyIsIkFkZENvbXBsZXRlZCIsImFkZEV4ZWN1dGVkQ2FsbGJhY2tzIiwiQWRkRXhlY3V0ZWQiLCJhZGRFeGVjdXRpbmdDYWxsYmFja3MiLCJBZGRFeGVjdXRpbmciLCJhZGRQcmlvcml0aXplZENhbGxiYWNrcyIsIkFkZFByaW9yaXRpemVkIiwiYWRkUmVxdWVzdGVkQ2FsbGJhY2tzIiwiQWRkUmVxdWVzdGVkIiwiYWRkU3RvcmVkQ2FsbGJhY2tzIiwiQWRkU3RvcmVkIiwiYWRkV2F0Y2hlZENhbGxiYWNrcyIsIkFkZFdhdGNoZWQiLCJyZW1vdmVFeGVjdXRlZENhbGxiYWNrcyIsIlJlbW92ZUV4ZWN1dGVkIiwicmVtb3ZlQmxvY2tlZENhbGxiYWNrcyIsIlJlbW92ZUJsb2NrZWQiLCJyZW1vdmVFeGVjdXRpbmdDYWxsYmFja3MiLCJSZW1vdmVFeGVjdXRpbmciLCJyZW1vdmVQcmlvcml0aXplZENhbGxiYWNrcyIsIlJlbW92ZVByaW9yaXRpemVkIiwicmVtb3ZlUmVxdWVzdGVkQ2FsbGJhY2tzIiwiUmVtb3ZlUmVxdWVzdGVkIiwicmVtb3ZlU3RvcmVkQ2FsbGJhY2tzIiwiUmVtb3ZlU3RvcmVkIiwicmVtb3ZlV2F0Y2hlZENhbGxiYWNrcyIsIlJlbW92ZVdhdGNoZWQiLCJhZ2dyZWdhdGVDYWxsYmFja3MiLCJBZ2dyZWdhdGUiLCJ1cGRhdGVSZXNvdXJjZVVzYWdlIiwiYWRkQ2FsbGJhY2tKb2IiLCJyZW1vdmVDYWxsYmFja0pvYiIsInNldENhbGxiYWNrSm9iT3V0ZGF0ZWQiLCJ1bndyYXBJZk5vdE11bHRpIiwicGF0aHMiLCJpZFByb3BzIiwic3BlYyIsImFueVZhbHMiLCJkZXBUeXBlIiwibXNnIiwiYWxsb3dfb3B0aW9uYWwiLCJpc1N0ciIsImlkIiwiSlNPTiIsInN0cmluZ2lmeSIsInByb3BlcnR5Iiwic3RycyIsImpvaW4iLCJmaWxsVmFscyIsImxheW91dCIsImNiIiwic3BlY3MiLCJhbGxvd0FsbE1pc3NpbmciLCJ1bmRlZmluZWQiLCJnZXR0ZXIiLCJnZXRJbnB1dHMiLCJlcnJvcnMiLCJlbXB0eU11bHRpVmFsdWVzIiwiaW5wdXRWYWxzIiwiaW5wdXRMaXN0IiwiX3Vud3JhcElmTm90TXVsdGkiLCJwYXRoXyIsIl91bndyYXBJZk5vdE11bHRpMiIsImlucHV0RXJyb3IiLCJyZWZFcnIiLCJlcnIiLCJpbmRleE9mIiwiY29uc29sZSIsImVycm9yIiwib2JqcyIsIlJlZmVyZW5jZUVycm9yIiwiZ2V0VmFscyIsImlucHV0IiwiemlwSWZBcnJheSIsImIiLCJ3aW5kb3ciLCJkYXNoX2NsaWVudHNpZGUiLCJub191cGRhdGUiLCJjbGVhbk91dHB1dFByb3AiLCJwYXRjaGVkUmVzdWx0RmllbGRzIiwicGF0Y2hlZE91dHB1dHMiLCJhcHBseVBhdGNoZWRPdXRwdXRzIiwib3V0cHV0cyIsImN1cnJlbnRMYXlvdXQiLCJkYXRhIiwib3V0IiwicHJvcE5hbWUiLCJvdXRwdXRQYXRoIiwiaWRTdHIiLCJkYXRhUGF0aCIsIm91dHB1dFZhbHVlIiwib2xkUHJvcHMiLCJuZXdQcm9wcyIsImhhbmRsZUNsaWVudHNpZGUiLCJfeCIsIl94MiIsIl94MyIsIl94NCIsIl9oYW5kbGVDbGllbnRzaWRlIiwiX2NhbGxlZTUiLCJkaXNwYXRjaCIsImNsaWVudHNpZGVfZnVuY3Rpb24iLCJwYXlsb2FkIiwiZGMiLCJyZXF1ZXN0VGltZSIsImlucHV0RGljdCIsInN0YXRlRGljdCIsInJlc3VsdCIsInN0YXR1cyIsIl9kYyRuYW1lc3BhY2UiLCJfcmV0dXJuVmFsdWUiLCJuYW1lc3BhY2UiLCJmdW5jdGlvbl9uYW1lIiwiYXJncyIsInJldHVyblZhbHVlIiwidG90YWxUaW1lIiwicmVzb3VyY2VzIiwiX3Q4IiwiX2NvbnRleHQ1IiwiZGVzY3JpcHRpb24iLCJEYXRlIiwibm93IiwiaW5wdXRzVG9EaWN0IiwiT0siLCJjYWxsYmFja19jb250ZXh0IiwiY2hhbmdlZFByb3BJZHMiLCJwcm9wX2lkIiwidHJpZ2dlcmVkX2lkIiwiZ2V0VHJpZ2dlcmVkSWQiLCJpbnB1dHNfbGlzdCIsInN0YXRlc19saXN0Iiwic3RhdGVzIiwib3V0cHV0c19saXN0IiwiX3JlZjE3IiwiX3JlZjE4Iiwib3V0aSIsInJldGkiLCJfcmVmMTkiLCJfcmVmMjAiLCJvdXRpaiIsInJldGlqIiwiZGF0YUZvcklkIiwiUHJldmVudFVwZGF0ZSIsIlBSRVZFTlRfVVBEQVRFIiwiQ0xJRU5UU0lERV9FUlJPUiIsIl9fZGFzaF9zZXJ2ZXIiLCJfX2Rhc2hfY2xpZW50IiwiX19kYXNoX3VwbG9hZCIsIl9fZGFzaF9kb3dubG9hZCIsInVpIiwib3V0cHV0IiwidXNhZ2UiLCJ1cGRhdGVDb21wb25lbnQiLCJjb21wb25lbnRfaWQiLCJwcm9wcyIsIl9nZXRTdGF0ZSIsImNvbXBvbmVudFBhdGgiLCJzdXBwcmVzc19jYWxsYmFja19leGNlcHRpb25zIiwiaXRlbXBhdGgiLCJyZW5kZXJUeXBlIiwic2lkZVVwZGF0ZSIsInJlZHVjZSIsImFjYyIsIl9yZWYyIiwiX3JlZjMiLCJjb21wb25lbnRJZCIsInJlcGxhY2VkSWRzIiwic3RhcnRzV2l0aCIsIl9wYXJzZVBNQ0lkIiwiX3BhcnNlUE1DSWQyIiwiaW5jbHVkZXMiLCJfaWQkc3BsaXQiLCJfaWQkc3BsaXQyIiwicmVwIiwiX3JlZjQiLCJfb2xkQ29tcG9uZW50IiwiX3JlZjUiLCJvbGRDb21wb25lbnQiLCJwYXRjaGVkUHJvcHMiLCJldmVudHMiLCJhcHBseVN0cmVhbUZyYW1lIiwiZnJhbWUiLCJyZXNwb25zZSIsImZsYXQiLCJfcmVmNiIsIl9yZWY3IiwiX3JlZjgiLCJfcmVmOSIsInByb3AiLCJoYW5kbGVTdHJlYW1DYWxsYmFjayIsIl94NSIsIl94NiIsIl94NyIsIl94OCIsIl9oYW5kbGVTdHJlYW1DYWxsYmFjayIsIl9jYWxsZWU2IiwicnVubmluZyIsInJ1bm5pbmdPZmYiLCJpbml0IiwiX2NvbnRleHQ2IiwicnVuIiwiZW5kX2lkIiwiZGlzdCIsImFsbCIsImhhbmRsZVNlcnZlcnNpZGUiLCJiYWNrZ3JvdW5kIiwiYWRkaXRpb25hbEFyZ3MiLCJjb21wcmVzc1BheWxvYWQiLCJjb21wcmVzc1RocmVzaG9sZCIsImJvZHkiLCJjYWNoZUtleSIsImpvYiIsInByb2dyZXNzRGVmYXVsdCIsIm1vcmVBcmdzIiwiZmV0Y2hDYWxsYmFjayIsIl9yZWYwIiwiX2NhbGxlZSIsIm5ld0JvZHkiLCJhZGRBcmciLCJ0bXBCb2R5IiwiX2kiLCJmZXRjaEJvZHkiLCJzdHJlYW0iLCJfdCIsIl9jb250ZXh0IiwiZGVsaW0iLCJwYXJzZSIsIl9yZWYxIiwiX3JlZjEwIiwia2V5IiwiX3JlZjExIiwiX3JlZjEyIiwiXyIsIl9fIiwic2luZ2xlIiwiQmxvYiIsInBpcGVUaHJvdWdoIiwiQ29tcHJlc3Npb25TdHJlYW0iLCJSZXNwb25zZSIsImJsb2IiLCJ3YXJuIiwibWV0aG9kIiwicmVqZWN0IiwiaGFuZGxlT3V0cHV0IiwicmVzIiwiY2FsbGJhY2tKb2IiLCJjYWxsYmFja0pvYnMiLCJvdXRkYXRlZCIsImpvYklkIiwicmVjb3JkUHJvZmlsZSIsImdldCIsInRpbWluZ0hlYWRlcnMiLCJoZWFkZXIiLCJkdXIiLCJtYXRjaCIsImZpbmlzaExpbmUiLCJtdWx0aSIsInN1YnN0ciIsImxhc3RJbmRleE9mIiwiY29tcGxldGVKb2IiLCJoYW5kbGVTdHJlYW1lZFJlc3BvbnNlIiwiX3JlZjEzIiwiX2NhbGxlZTMiLCJzdHJlYW1SZXMiLCJyZWFkZXIiLCJkZWNvZGVyIiwiYnVmZmVyIiwibGFzdFJlc3BvbnNlIiwiZmluaXNoZWQiLCJwcm9jZXNzRnJhbWUiLCJfeWllbGQkcmVhZGVyJHJlYWQiLCJsaW5lcyIsIl9pdGVyYXRvciIsIl9zdGVwIiwibGluZSIsIl90MiIsIl90MyIsIl9jb250ZXh0MyIsImdldFJlYWRlciIsIlRleHREZWNvZGVyIiwiX3JlZjE0IiwiX2NhbGxlZTIiLCJfY29udGV4dDIiLCJtZXNzYWdlIiwiX3gwIiwicmVhZCIsImRlY29kZSIsInBvcCIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwicyIsInRyaW0iLCJjYW5jZWwiLCJfeDkiLCJjb250ZW50VHlwZSIsImpzb24iLCJqb2JJbmZvIiwiY2FuY2VsSW5wdXRzIiwicHJvZ3Jlc3MiLCJzZXRUaW1lb3V0IiwiaGFuZGxlIiwiaW50ZXJ2YWwiLCJoYW5kbGVFcnJvciIsIk5PX1JFU1BPTlNFIiwiaGFuZGxlV2Vic29ja2V0Q2FsbGJhY2siLCJfeDEiLCJfeDEwIiwiX3gxMSIsIl94MTIiLCJfeDEzIiwiX2hhbmRsZVdlYnNvY2tldENhbGxiYWNrIiwiX2NhbGxlZTciLCJ3b3JrZXJDbGllbnQiLCJsYXN0U3RyZWFtUmVzcG9uc2UiLCJfdG90YWxUaW1lIiwiY2FsbGJhY2tEYXRhIiwiX3JlZjIxIiwiY2FsbGJhY2tSZXNwb25zZSIsIl90b3RhbFRpbWUyIiwiX3Q5IiwiX2NvbnRleHQ3IiwiZW5zdXJlQ29ubmVjdGVkIiwic2VuZENhbGxiYWNrIiwiaW5wdXRzaSIsImlpIiwiX2lucHV0c2kkaWkkdmFsdWUiLCJpZF9zdHIiLCJfaW5wdXRzX2xpc3QkaSR2YWx1ZSIsInRyaWciLCJzdWJzdHJpbmciLCJleGVjdXRlQ2FsbGJhY2siLCJfcmVmMTUiLCJhbGxPdXRwdXRzIiwiX2NiJGNhbGxiYWNrIiwiY2FsbGJhY2siLCJkeW5hbWljX2NyZWF0b3IiLCJpblZhbHMiLCJleGVjdXRpb25Qcm9taXNlIiwib3V0cHV0RXJyb3JzIiwiX3Vud3JhcElmTm90TXVsdGkzIiwiX3Vud3JhcElmTm90TXVsdGk0IiwiZXJyaSIsIl9fZXhlY3V0ZSIsIl9yZWYxNiIsIl9jYWxsZWU0IiwibG9hZGluZ091dHB1dHMiLCJwYXJzZWRDaGFuZ2VkUHJvcHNJZHMiLCJfYXBwbHlQYXRjaGVkT3V0cHV0cyIsInBhdGNoZWREYXRhIiwibmV3Q29uZmlnIiwibmV3SGVhZGVycyIsImxhc3RFcnJvciIsImpzb25PdXRwdXQiLCJ1c2VXZWJTb2NrZXQiLCJ1c2VTdHJlYW0iLCJyZXRyeSIsIl9kYXRhIiwiX3N0cmVhbUVyciRtZXNzYWdlIiwiX2FwcGx5UGF0Y2hlZE91dHB1dHMyIiwiX3BhdGNoZWREYXRhIiwiX3BhdGNoZWRPdXRwdXRzIiwib2xkSnd0IiwibmV3Snd0IiwiX3Q0IiwiX3Q1IiwiX3Q2IiwiX3Q3IiwiX2NvbnRleHQ0IiwiX291dCRwcm9wZXJ0eSIsInByb3BJZCIsImludGVyIiwiY29tcHJlc3NfcGF5bG9hZCIsImNvbXByZXNzX3RocmVzaG9sZCIsIlVOQVVUSE9SSVpFRCIsIkJBRF9SRVFVRVNUIiwidGV4dCIsIkF1dGhvcml6YXRpb24iLCJuZXdDYiIsImFzc29jIiwiZGlmZmVyZW5jZSIsImlzRW1wdHkiLCJtZXJnZVdpdGgiLCJwYXJ0aXRpb24iLCJwaWNrQnkiLCJ6aXBPYmoiLCJhZGRBbGxSZXNvbHZlZEZyb21PdXRwdXRzIiwiZ2V0QW55VmFscyIsImdldFVuZmlsdGVyZWRMYXlvdXRDYWxsYmFja3MiLCJpZE1hdGNoIiwicGFydGlhbElkTWF0Y2giLCJzcGxpdElkQW5kUHJvcCIsIkRJUkVDVCIsIklORElSRUNUIiwibWVyZ2VNYXgiLCJNYXRoIiwibWF4IiwiY29tYmluZUlkQW5kUHJvcCIsImdldENhbGxiYWNrc0J5SW5wdXQiLCJncmFwaHMiLCJjaGFuZ2VUeXBlIiwid2l0aFByaW9yaXR5IiwibWF0Y2hlcyIsImlkQW5kUHJvcCIsImNhbGxiYWNrcyIsImlucHV0TWFwIiwicmVzb2x2ZURlcHMiLCJpZEtleXMiLCJzb3J0IiwidmFscyIsImlkS2V5U3RyIiwicGF0dGVybnMiLCJpbnB1dFBhdHRlcm5zIiwicGF0dGVybiIsInBhcnRpYWwiLCJ0cmlnZ2VyQW55VmFscyIsInBhdHRlcm5SZWZWYWxzIiwiayIsInJlc29sdmVQYXJ0aWFsRGVwcyIsImhhc1BhcnRpYWxJbnB1dFBhdHRlcm5zIiwicGF0S2V5U3RyIiwicGFydGlhbElucHV0UGF0dGVybnMiLCJwYXRLZXlzIiwiZXZlcnkiLCJwYXRQcm9wUGF0dGVybnMiLCJwcmlvcml0eSIsImdldFByaW9yaXR5IiwidG91Y2hlZE91dHB1dHMiLCJ0b3VjaGVkQ2JJZHMiLCJ0b3VjaGVkIiwicmVzb2x2ZWRJZCIsImdldE91dHB1dHMiLCJ1bnNoaWZ0IiwibWluIiwiZ2V0QWxsU3Vic2VxdWVudE91dHB1dHNGb3JDYWxsYmFjayIsImdldFJlYWR5Q2FsbGJhY2tzIiwiY2FuZGlkYXRlcyIsIm91dHB1dHNNYXAiLCJhbGxUb3VjaGVkT3V0cHV0cyIsImFzc2lnbiIsImRpZmZlcmVuY2VCYXNlZE9uSWQiLCJzb21lIiwiY2JwIiwiZ2V0TGF5b3V0Q2FsbGJhY2tzIiwib3B0aW9ucyIsImV4Y2x1c2lvbnMiLCJfcGFydGl0aW9uIiwiX3BhcnRpdGlvbjIiLCJpbmNsdWRlZCIsImV4Y2x1ZGVkIiwiZmlsdGVyUm9vdCIsInJvb3RJZCIsInByZXZpb3VzIiwiZXhlY3V0aW9uR3JvdXAiLCJyYW5kb20iLCJnZXRVbmlxdWVJZGVudGlmaWVyIiwiX3JlZjYkY2FsbGJhY2siLCJpZFBhcnRzIiwiaW5jbHVkZU9ic2VydmVycyIsInByb3BlcnRpZXMiLCJtYWtlUmVzb2x2ZWRDYWxsYmFjayIsImluaXRpYWxDYWxsIiwicHJ1bmVDYWxsYmFja3MiLCJfcGFydGl0aW9uMyIsIl9wYXJ0aXRpb240IiwicmVtb3ZlZCIsIl9wYXJ0aXRpb241IiwiX3BhcnRpdGlvbjYiLCJtb2RpZmllZCIsImFkZGVkIiwicmVmS2V5cyIsInJlZlZhbHMiLCJyZWZQYXR0ZXJuVmFscyIsImlkUGF0dGVybiIsImlzUGFydGlhbCIsInBhdHRlcm5WYWxzIiwia2V5UGF0aHMiLCJfbG9vcCIsIm9iaktleXMiLCJvYmpLZXlTdHIiLCJvYmpLZXlQYXRocyIsInBhdHRlcm5LZXlzIiwiX2NvbXBvbmVudEtleXMiLCJtYXBwZWRSZWZWYWxzIiwiaWR4IiwibWFwcGVkUmVmUGF0dGVyblZhbHMiLCJfbG9vcDIiLCJJc0xvYWRpbmdBY3Rpb25UeXBlIiwic2V0SXNMb2FkaW5nIiwiU2V0IiwiYXBwZW5kIiwiZGlzc29jUGF0aCIsImVtcHR5IiwiZXF1YWxzIiwiaGFzIiwiaW5zZXJ0IiwiaXMiLCJwcmVwZW5kIiwicmV2ZXJzZSIsImlzRHJ5Q29tcG9uZW50Iiwib2JqIiwiZ2V0TG9jYXRpb25JbmRleCIsImdldExvY2F0aW9uUGF0aCIsImxvY2F0aW9uIiwiY3VycmVudCIsIlBhdGNoQnVpbGRlciIsIm9wZXJhdGlvbnMiLCJvcGVyYXRpb24iLCJwYXJhbXMiLCJtZXJnZSIsImV4dGVuZCIsImRlbGV0ZSIsImluZGV4Iiwic3ViIiwibXVsIiwiZGl2IiwiY2xlYXIiLCJidWlsZCIsIl9fZGFzaF9wYXRjaF91cGRhdGUiLCJwYXRjaEhhbmRsZXJzIiwiQXNzaWduIiwicGF0Y2hPcGVyYXRpb24iLCJNZXJnZSIsInByZXYiLCJFeHRlbmQiLCJEZWxldGUiLCJJbnNlcnQiLCJBcHBlbmQiLCJQcmVwZW5kIiwiQWRkIiwiU3ViIiwiTXVsIiwiRGl2IiwiQ2xlYXIiLCJSZXZlcnNlIiwiUmVtb3ZlIiwiaXRlbSIsImluc2VydGluZ09wZXJhdGlvbnMiLCJjb2xsZWN0Q29tcG9uZW50SWRzIiwiZnJlc2hJZHMiLCJ2aXNpdGVkIiwicmVjb3JkV3JpdHRlblByb3AiLCJ3cml0dGVuUHJvcHMiLCJ0YWlsQXBwZW5kQ291bnRzIiwicmVjb3JkVGFpbEFwcGVuZCIsImFuYWx5c2lzIiwiZXhpc3RpbmciLCJ0YWlsQXBwZW5kcyIsImNvdW50IiwicmVjb3JkUGF0Y2hPcGVyYXRpb24iLCJoYW5kbGVQYXRjaCIsInByZXZpb3VzVmFsdWUiLCJwYXRjaFZhbHVlIiwicmVkdWNlZFZhbHVlIiwicGF0Y2giLCJoYW5kbGVyIiwicHJldmlvdXNQcm9wcyIsIl9PYmplY3Qka2V5cyIsInZhbCIsImFuYWx5c2lzRm9yUHJvcCIsImFuYWx5c2lzRm9yQWxsUHJvcHMiLCJpc0NhcnJpZWRPdmVyQnlQYXRjaCIsImlzVW50b3VjaGVkQnlQYXRjaCIsIndhc1dyaXR0ZW5CeVBhdGNoIiwiX2FuYWx5c2lzJHdyaXR0ZW5Qcm9wIiwiQm9vbGVhbiIsInRhaWxBcHBlbmQiLCJlbnRyeSIsInRhaWxBcHBlbmRDb3VudCIsIl90YWlsQXBwZW5kJGNvdW50IiwiX3RhaWxBcHBlbmQiLCJkaXNzb2MiLCJnZXRBbGxQTUNJZHMiLCJ0cmlnZ2VyS2V5Iiwia2V5c09mSWRzIiwiaWRLZXkiLCJleHRyYXMiLCJyZXBsYWNlZCIsInRyaWdnZXJWYWx1ZSIsImJhdGNoIiwic2V0R3JhcGhzIiwiYXBpVGh1bmsiLCJyZXNldCIsImNvbmZpZ0VsZW1lbnQiLCJkb2N1bWVudCIsImdldEVsZW1lbnRCeUlkIiwidGV4dENvbnRlbnQiLCJEYXNoQ29udGV4dCIsInVzZURhc2hDb250ZXh0IiwiZ2V0U3RvcmVzIiwiRXh0ZXJuYWxXcmFwcGVyIiwiRGV2dG9vbENvbnRleHQiLCJ1c2VEZXZ0b29sIiwidXNlRGV2dG9vbE1lbnVCdXR0b25DbGFzc05hbWUiLCJnZXRMYXlvdXQiLCJjb21wb25lbnRQYXRoT3JJZCIsImRzIiwiX2RzJHkkZ2V0U3RhdGUiLCJkYXNoX2NvbXBvbmVudF9hcGkiLCJkZXZ0b29sIiwidXBkYXRlVGl0bGUiLCJpc0xvYWRpbmciLCJ1cGRhdGVfdGl0bGUiLCJ0aXRsZSIsIm11dGF0aW9uT2JzZXJ2ZXIiLCJfZ2V0U3RhdGUyIiwiX29ic2VydmVyJG11dGF0aW9uT2JzIiwiZGlzY29ubmVjdCIsIk11dGF0aW9uT2JzZXJ2ZXIiLCJxdWVyeVNlbGVjdG9yIiwib2JzZXJ2ZSIsInN1YnRyZWUiLCJjaGlsZExpc3QiLCJhdHRyaWJ1dGVzIiwiY2hhcmFjdGVyRGF0YSIsImlzTmlsIiwicGF0aE9yIiwicGFyc2VJZldpbGRjYXJkIiwiaGFuZGxlQXN5bmNFcnJvciIsImFwcGVuZFBhdGhzIiwiYXBwbHlQZXJzaXN0ZW5jZSIsInBydW5lUGVyc2lzdGVuY2UiLCJleGVjdXRlZCIsImFwcGx5UHJvcHMiLCJ1cGRhdGVkUHJvcHMiLCJwYXRjaEFuYWx5c2lzIiwiX2FwcGx5UGVyc2lzdGVuY2UiLCJzb3VyY2UiLCJyZXF1ZXN0ZWRDYWxsYmFja3MiLCJzdG9yZWRDYWxsYmFja3MiLCJfY2IkcHJlZGVjZXNzb3JzIiwicHJlZGVjZXNzb3JzIiwiZXhlY3V0aW9uUmVzdWx0IiwiZW50cmllcyIsInBhcnNlZElkIiwiX2dldFN0YXRlMyIsIm9sZExheW91dCIsIm9sZFBhdGhzIiwiYXBwbGllZFByb3BzIiwicmNiIiwiYmFzZVBhdGgiLCJvbGRPYmoiLCJjaGlsZHJlblByb3BzIiwidHlwZSIsIl9fZGFzaHByaXZhdGVfY2hpbGRyZW5Qcm9wcyIsImhhbmRsZVBhdGhzIiwiY2hpbGRyZW4iLCJvbGRDaGlsZHJlbiIsIm9sZENoaWxkcmVuUGF0aCIsInByb3BBbmFseXNpcyIsIm9QYXRocyIsIm5ld0xpc3QiLCJvbGRMaXN0IiwiaXNUYWlsQXBwZW5kIiwiY2h1bmtQYXRoIiwicmVtb3ZlZEFycmF5SW5wdXRzT25seSIsIm5ld1BhdGhzIiwicmVjb21wdXRlZCIsImNoaWxkcmVuUHJvcCIsIl9jaGlsZHJlblByb3Akc3BsaXQkbSIsIl9jaGlsZHJlblByb3Akc3BsaXQkbTIiLCJmcm9udFBhdGgiLCJmcm9udE9iaiIsImNoaWxkcmVuUHJvcFBhdGgiLCJjaGlsZHJlblByb3BBbmFseXNpcyIsImFkZGVkUHJvcHMiLCJfZ2V0U3RhdGU0IiwiY3VycmVudEdyYXBocyIsImV4ZWN1dGlvbk1ldGEiLCJhbGxQcm9wcyIsIm5vX291dHB1dCIsImlucHRzIiwibnMiLCJmbiIsImZpbmQiLCJnZXRBcHBTdGF0ZSIsImV4ZWN1dGluZyIsImRlZmVycmVkIiwic2tpcHBlZE9yUmVhZHkiLCJ3YXRjaGVkIiwiYXBwTGlmZWN5Y2xlIiwiY3VycmVudENiIiwiX2NiIiwiZ2V0UGVuZGluZ0NhbGxiYWNrcyIsInBlbmRpbmdDYWxsYmFja3MiLCJub25QZXJzaXN0ZW50Q2FsbGJhY2tzIiwicGVyc2lzdGVudCIsImlzQXBwUmVhZHkiLCJNQVhfQ09OQ1VSUkVOVF9IVFRQX0NBTExCQUNLUyIsInVzZXNSZXF1ZXN0U2xvdCIsInNvcnRQcmlvcml0eSIsImMxIiwiYzIiLCJfYzEkcHJpb3JpdHkiLCJfYzIkcHJpb3JpdHkiLCJnZXRTdGFzaCIsImZsYXRPdXRwdXRzIiwiYWxsUHJvcElkcyIsInJlcU91dCIsImlkT3V0IiwiZ2V0SWRzIiwiaXRlbXMiLCJ1bmlxdWVJZHMiLCJNYXAiLCJ1bmlxdWVJdGVtcyIsIl9vYnNlcnZlciIsIl9nZXRTdGF0ZSRjYWxsYmFja3MiLCJwcmlvcml0aXplZCIsImNvdW50c1Rvd2FyZCIsImluRmxpZ2h0IiwiYXZhaWxhYmxlIiwiYnVkZ2V0ZWQiLCJleGVtcHQiLCJpc1JlYWR5IiwiYnVkZ2V0ZWRTeW5jIiwiYnVkZ2V0ZWRBc3luYyIsInBpY2tlZEJ1ZGdldGVkU3luYyIsInBpY2tlZEJ1ZGdldGVkQXN5bmMiLCJleGVtcHRTeW5jIiwiZXhlbXB0QXN5bmMiLCJwaWNrZWRTeW5jQ2FsbGJhY2tzIiwicGlja2VkQXN5bmNDYWxsYmFja3MiLCJibG9ja2VkIiwiZXhlY3V0aW5nQ2FsbGJhY2siLCJyb3V0ZWRPdmVyV2ViU29ja2V0IiwiZ3JvdXBCeSIsIm1lcmdlTGVmdCIsIndhaXQiLCJzdG9yZWQiLCJyZXF1ZXN0ZWQiLCJpbml0aWFsUmVxdWVzdGVkIiwickNpcmN1bGFycyIsInJEdXBsaWNhdGVzIiwick1lcmdlZER1cGxpY2F0ZXMiLCJwRHVwbGljYXRlcyIsImJEdXBsaWNhdGVzIiwiZUR1cGxpY2F0ZXMiLCJ3RHVwbGljYXRlcyIsIl9wcnVuZUNhbGxiYWNrcyIsInJBZGRlZCIsInJSZW1vdmVkIiwiX3BydW5lQ2FsbGJhY2tzMiIsInBBZGRlZCIsInBSZW1vdmVkIiwiX3BydW5lQ2FsbGJhY2tzMyIsImJBZGRlZCIsImJSZW1vdmVkIiwiX3BydW5lQ2FsbGJhY2tzNCIsImVBZGRlZCIsImVSZW1vdmVkIiwiX3BydW5lQ2FsbGJhY2tzNSIsIndBZGRlZCIsIndSZW1vdmVkIiwicmVhZHlDYWxsYmFja3MiLCJvbGRCbG9ja2VkIiwibmV3QmxvY2tlZCIsInBlbmRpbmdHcm91cHMiLCJkcm9wcGVkIiwiZ3JvdXAiLCJpbml0aWFsIiwiZ3JvdXBXaXRob3V0SW5pdGlhbCIsImV4ZyIsInJlYWR5Q2FsbGJhY2siLCJibG9ja2VkQnlBc3N1bXB0aW9ucyIsIl9jYiRwcmVkZWNlc3NvcnMyIiwiX3JlZ2VuZXJhdG9yVmFsdWVzIiwiZ2NiIiwidXBkYXRlZCIsImRlcCIsIm51bGxHcm91cENhbGxiYWNrcyIsImdyb3VwQ2FsbGJhY2tzIiwiZXhlY3V0aW9uR3JvdXBzIiwiZXhlY3V0aW9uR3JvdXBDYWxsYmFja3MiLCJfbiIsIkYiLCJyZXNvbHZlUHJvcFBhdGgiLCJwYXJzZUNvbXBvbmVudElkIiwiZW5kc1dpdGgiLCJfdW51c2VkIiwicmVhZFJlcXVlc3RlZFByb3BzIiwiY29tcG9uZW50UHJvcHMiLCJwcm9wUGF0aCIsIl9yZXNvbHZlUHJvcFBhdGgiLCJfaW5pdGlhbGl6ZVdlYlNvY2tldCIsIl9jb25maWckd2Vic29ja2V0MyIsIl9jb25maWckd2Vic29ja2V0NCIsIndzQXZhaWxhYmxlIiwicHJvY2Vzc1NldFByb3BzIiwid2FzRGlzY29ubmVjdGVkIiwid3NVcmwiLCJTaGFyZWRXb3JrZXIiLCJyYXdQcm9wcyIsInByb2Nlc3NlZFByb3BzIiwidXBkYXRlZFN0YXRlIiwib25TZXRQcm9wcyIsIm9uU2V0UHJvcHNCYXRjaCIsInBheWxvYWRzIiwiX2l0ZXJhdG9yMiIsIl9zdGVwMiIsIm9uR2V0UHJvcHNSZXF1ZXN0IiwicmVxdWVzdElkIiwic2VuZEdldFByb3BzUmVzcG9uc2UiLCJvbkNvbm5lY3RlZCIsImxvZyIsInBlcnNpc3RlbnRDYWxsYmFja3MiLCJub091dHB1dCIsInJlc29sdmVkIiwib25EaXNjb25uZWN0ZWQiLCJyZWFzb24iLCJvbkVycm9yIiwiY29kZSIsImFkZEV2ZW50TGlzdGVuZXIiLCJ2aXNpYmlsaXR5U3RhdGUiLCJjb25uZWN0ZWQiLCJub3RpZnlUYWJWaXNpYmxlIiwiY2F0Y2giLCJlbmFibGVkIiwiYnVpbGRXZWJTb2NrZXRVcmwiLCJjb25uZWN0IiwiaW5hY3Rpdml0eV90aW1lb3V0Iiwid3NQcm90b2NvbCIsInByb3RvY29sIiwiaG9zdCIsInNldEpvYiIsInJlbW92ZUpvYiIsInNldE91dGRhdGVkIiwiYWN0aW9uIiwiREVGQVVMVF9TVEFURSIsImNvbXBsZXRlZCIsInRyYW5zZm9ybXMiLCJmaWVsZHMiLCJtdXRhdGVDb21wbGV0ZWQiLCJtdXRhdGVDYWxsYmFja3MiLCJ0cmFuc2Zvcm0iLCJmaWVsZCIsImxvYWQiLCJsb2FkUGF0aCIsIm9uY2UiLCJjcmVhdGVTdG9yZSIsImFwcGx5TWlkZGxld2FyZSIsInRodW5rIiwiY3JlYXRlUmVkdWNlciIsImRvY3VtZW50VGl0bGUiLCJleGVjdXRlZENhbGxiYWNrcyIsImV4ZWN1dGluZ0NhbGxiYWNrcyIsInByaW9yaXRpemVkQ2FsbGJhY2tzIiwiUmVuZGVyZXJTdG9yZSIsInN0b3JlT2JzZXJ2ZXIiLCJyZWR1Y2VyIiwibWlkZGxld2FyZSIsIl9fc3RvcmUiLCJzZXRTdG9yZSIsImRhc2hfc3RvcmVzIiwic2V0T2JzZXJ2ZXJzIiwicHJvY2VzcyIsImVudiIsIk5PREVfRU5WIiwiY3JlYXRlQXBwU3RvcmUiLCJyZWR1eERURUMiLCJfX1JFRFVYX0RFVlRPT0xTX0VYVEVOU0lPTl9DT01QT1NFX18iLCJhY3Rpb25zRGVueWxpc3QiLCJtb2R1bGUiLCJob3QiLCJhY2NlcHQiLCJuZXh0Um9vdFJlZHVjZXIiLCJyZXF1aXJlIiwicmVwbGFjZVJlZHVjZXIiLCJpbml0aWFsaXplU3RvcmUiLCJvbWl0IiwiX0FycmF5Iiwic2V0X3Byb3BzIiwiaWRPclBhdGgiLCJfZHMkeSIsImludmFsaWRQcm90b2NvbHMiLCJuZXdMaW5lcyIsImN0cmxDaGFycyIsImh0bWxFbnRpdGllcyIsImNsZWFuX3VybCIsImZhbGxiYWNrIiwiY2xlYW5lZCIsInJlcGxhY2UiLCJkZWMiLCJmcm9tQ2hhckNvZGUiLCJyZXNvdXJjZSIsInByb20iLCJoZWFkIiwiZWxlbWVudCIsInNyYyIsImFzeW5jIiwib25sb2FkIiwib25lcnJvciIsImFwcGVuZENoaWxkIiwiaHJlZiIsInJlbCIsInJlc29sdmVBcnJheUtleSIsImlzU2FmZUludGVnZXIiLCJyZXNvbHZlT2JqZWN0S2V5IiwiY2FjaGVkUmVuZGVyZXJJZCIsImdldFJlbmRlcmVySWQiLCJjcnlwdG8iLCJyYW5kb21VVUlEIiwic3RvcmVzIiwiX2RlZmluZVByb3BlcnRpZXMiLCJERUZBVUxUX1BPTExfSU5URVJWQUwiLCJFTVBUWV9QT0xMU19CRUZPUkVfQkFDS09GRiIsIk1BWF9CQUNLT0ZGX0ZBQ1RPUiIsImdlbklkIiwic2xlZXAiLCJtcyIsIlN0cmVhbUNsaWVudCIsIl9vcHRzJGZldGNoSW1wbCIsIl9vcHRzJHJlY29ubmVjdERlbGF5IiwiX29wdHMkbWF4UmVjb25uZWN0RGVsIiwiX29wdHMkcmVjb25uZWN0V2luZG93Iiwib3B0cyIsImZldGNoSW1wbCIsImdsb2JhbFRoaXMiLCJyZWNvbm5lY3REZWxheSIsIm1heFJlY29ubmVjdERlbGF5IiwicmVjb25uZWN0V2luZG93IiwiY29uZmlndXJlIiwidHJhbnNwb3J0IiwibW9kZSIsIl90cmFuc3BvcnQiLCJwb2xsSW50ZXJ2YWwiLCJwZW5kaW5nIiwic2l6ZSIsImVuZElkIiwic3RyZWFtVXJsIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiZG93bmxpbmtJZCIsIm9uRnJhbWUiLCJzdGFydCIsInNldHRsZWQiLCJjdXJzb3IiLCJsb2NhbElkIiwiY291bnRlciIsInNldCIsImFja2VkIiwiZ290RnJhbWUiLCJzdHJlYW1Db25uZWN0aW9uIiwiY2hlY2tVcGxpbmsiLCJmYWlsIiwic3RyZWFtQ2FuY2VsIiwic3RvcERvd25saW5rSWZJZGxlIiwib2siLCJfdGhpcyR3YWtlVXAiLCJlbnN1cmVEb3dubGluayIsIndva2VuRm9yTmV3U3RyZWFtIiwid2FrZVVwIiwiaGFzQWNrZWQiLCJkaXNwYXRjaEVudmVsb3BlIiwiZW52ZWxvcGUiLCJzZXR0bGVBbGwiLCJzZXEiLCJyaWQiLCJjbG9zZURvd25saW5rIiwiZG93bmxpbmtPcGVuIiwiX3RoaXMkd2FrZVVwMiIsImFib3J0IiwibG9vcEdlbiIsInJlYWRMb29wIiwiX3JlYWRMb29wIiwiZ2VuIiwiX3RoaXMkX3RyYW5zcG9ydCRwb2xsIiwicG9sbGluZyIsImJhc2UiLCJpZGxlUGF1c2UiLCJlbXB0eVBvbGxzIiwidW5yZWFjaGFibGVTaW5jZSIsImRlbGF5IiwicmVjZWl2ZWQiLCJBYm9ydENvbnRyb2xsZXIiLCJzaWduYWwiLCJzdHJlYW1Eb3dubGluayIsImNvbnN1bWUiLCJwYXVzZSIsIl90aGlzMiIsInRpbWVyIiwiY2xlYXJUaW1lb3V0IiwiX2NvbnN1bWUiLCJubCIsIlNoYXJlZFN0cmVhbUNsaWVudCIsInBvcnQiLCJfdGhpczMiLCJfcG9ydCRzdGFydCIsInJlbmRlcmVySWQiLCJvbm1lc3NhZ2UiLCJldmVudCIsImhhbmRsZU1lc3NhZ2UiLCJfYnJva2VuIiwiX3RoaXM0IiwicG9zdE1lc3NhZ2UiLCJyZWxlYXNlIiwic2luZ2xldG9uIiwiX2NvbmZpZyRzdHJlYW0iLCJfY29uZmlnJHN0cmVhbTIiLCJfY29uZmlnJHN0cmVhbTMiLCJicm9rZW4iLCJwb2xsX2ludGVydmFsIiwid29ya2VyVXJsIiwid29ya2VyIiwiY2xpZW50IiwiX2NvbmZpZyRzdHJlYW00IiwiZHVyYXRpb24iLCJfcmVzb2x2ZSIsIldvcmtlck1lc3NhZ2VUeXBlIiwiV29ya2VyQ2xpZW50IiwiX2Nvbm5lY3QiLCJzZXJ2ZXJVcmwiLCJpbmFjdGl2aXR5VGltZW91dCIsImhlYXJ0YmVhdEludGVydmFsIiwiY29ubmVjdGlvblByb21pc2UiLCJjb25uZWN0aW9uUmVzb2x2ZSIsIkNPTk5FQ1QiLCJESVNDT05ORUNUIiwiY2xvc2UiLCJpc0Nvbm5lY3RlZCIsIl9zdGVwJHZhbHVlIiwiX2Vuc3VyZUNvbm5lY3RlZCIsImhlYXJ0YmVhdF9pbnRlcnZhbCIsIl9zZW5kQ2FsbGJhY2siLCJyZXF1ZXN0Q291bnRlciIsIkNBTExCQUNLX1JFUVVFU1QiLCJHRVRfUFJPUFNfUkVTUE9OU0UiLCJUQUJfVklTSUJMRSIsIkNPTk5FQ1RFRCIsIkRJU0NPTk5FQ1RFRCIsIl9zdGVwMiR2YWx1ZSIsIl9tZXNzYWdlJHBheWxvYWQiLCJDQUxMQkFDS19SRVNQT05TRSIsIlNFVF9QUk9QUyIsIlNFVF9QUk9QU19CQVRDSCIsIkdFVF9QUk9QU19SRVFVRVNUIiwiRVJST1IiLCJfbWVzc2FnZSRwYXlsb2FkMiIsIl9tZXNzYWdlJHBheWxvYWQzIiwid29ya2VyQ2xpZW50SW5zdGFuY2UiLCJfY29uZmlnJHdlYnNvY2tldDUiLCJjaGVja1Byb3BUeXBlcyIsInByb3BUeXBlRXJyb3JIYW5kbGVyIiwidmFsaWRhdGVDb21wb25lbnQiLCJDaGVja2VkQ29tcG9uZW50IiwiY29tcG9uZW50IiwiZXJyb3JNZXNzYWdlIiwidXNlQ2FsbGJhY2siLCJ1c2VDb250ZXh0IiwidXNlTWVtbyIsInVzZVN0b3JlIiwidXNlU2VsZWN0b3IiLCJ1c2VEaXNwYXRjaCIsImNyZWF0ZUNvbnRleHQiLCJEYXNoQ29udGV4dFByb3ZpZGVyIiwic3RyaW5nUGF0aCIsImV4dHJhUGF0aCIsInJhd1BhdGgiLCJmaWx0ZXJGdW5jIiwibG9hZGluZ1BhdGgiLCJ1c2VMb2FkaW5nIiwiY3R4VmFsdWUiLCJjdHgiLCJ1c2VSZWYiLCJtZXJnZVJpZ2h0IiwibWFwT2JqSW5kZXhlZCIsIkNvbXBvbmVudEVycm9yQm91bmRhcnkiLCJyZXNldENvbXBvbmVudFN0YXRlIiwiZ2V0V2F0Y2hlZEtleXMiLCJjaGVja1JlbmRlclR5cGVQcm9wIiwic3RyaW5naWZ5UGF0aCIsIlJlZ2lzdHJ5IiwiaXNTaW1wbGVDb21wb25lbnQiLCJzZWxlY3REYXNoUHJvcHMiLCJzZWxlY3REYXNoUHJvcHNFcXVhbGl0eUZuIiwic2VsZWN0Q29uZmlnIiwiY29tcG9uZW50SWRlbnRpdHkiLCJfY29tcG9uZW50JHByb3BzIiwiRGFzaFdyYXBwZXIiLCJfZGFzaHByaXZhdGVfZXJyb3IiLCJfcGFzc2VkQ29tcG9uZW50IiwiX25ld1JlbmRlciIsIl9vYmplY3RXaXRob3V0UHJvcGVydGllcyIsIl9leGNsdWRlZCIsIm1lbW9pemVkS2V5cyIsIm5ld1JlbmRlciIsImZyZXNoUmVuZGVycyIsInJlbW91bnRlZFRoaXNSZW5kZXIiLCJyZW5kZXJlZElkZW50aXR5IiwiaGFzRnJlc2hSZW5kZXJlZCIsInJlbmRlcmVkUGF0aCIsInByZXZDaGlsZHJlbkFycmF5cyIsInJlbmRlckNvbXBvbmVudCIsInJlbmRlckNvbXBvbmVudFByb3BzIiwicmVuZGVySCIsIl91c2VTZWxlY3RvciIsIl91c2VTZWxlY3RvcjIiLCJoIiwiY2hhbmdlZFByb3BzIiwiaWRlbnRpdHkiLCJpc1JlbW91bnQiLCJfZGFzaHByaXZhdGVfcmVtb3VudCIsInNldFByb3BzIiwiX3JlbmRlckNvbXBvbmVudFByb3BzIiwiX2Rhc2hfZXJyb3IiLCJyZXN0UHJvcHMiLCJfZXhjbHVkZWQyIiwiY3VycmVudFN0YXRlIiwid2F0Y2hlZEtleXMiLCJjcmVhdGVDb250YWluZXIiLCJjb250YWluZXIiLCJjb250YWluZXJQYXRoIiwiX2NoaWxkTmV3UmVuZGVyIiwiX2NvbnRhaW5lciRwcm9wcyIsIndyYXBDaGlsZHJlblByb3AiLCJub2RlIiwiY2hpbGRyZW5QYXRoIiwiYWxsb3dSZWZTa2lwIiwicGF0aEtleSIsInByZXZBcnJheSIsInVuY2hhbmdlZCIsImV4dHJhUHJvcHMiLCJzZXRIeWRyYXRlZFByb3BzIiwiY2hpbGROZXdSZW5kZXIiLCJoYW5kbGVPYmplY3QiLCJvcGF0aCIsIm5vZGVWYWx1ZSIsIl9ub2RlIiwiYmFja1BhdGgiLCJmb3VuZCIsImhhc09iamVjdCIsImZpcnN0Tm9kZSIsImVsIiwiZWxlbWVudFBhdGgiLCJsaXN0VmFsdWUiLCJmcm9udCIsImR5bmFtaWMiLCJoYXNCYWNrIiwiaiIsImN1ciIsImR5blZhbHVlIiwiYVBhdGgiLCJfcmV0IiwiaHlkcmF0ZUZ1bmMiLCJoeWRyYXRlZFByb3BzIiwiaHlkcmF0ZWRDaGlsZHJlbiIsInByb3BzX2NoZWNrIiwiaHlkcmF0ZWQiLCJpc1ZhbGlkRWxlbWVudCIsImNvbXBvbmVudFR5cGUiLCJhZGRDb21wb25lbnRUb0xheW91dCIsInJlbW92ZUNvbXBvbmVudCIsIl9yZWYkdGVtcCIsInRlbXAiLCJpbnNlcnRlZCIsInNldEluc2VydGVkIiwiX2Rpc3BhdGNoIiwiZXhpc3RzIiwiY2hlY2tEYXNoQ2hpbGRyZW5VcGRhdGUiLCJwcmV2aW91c0hhc2hlcyIsImlzRmlyc3RMZXZlbFByb3BzQ2hpbGQiLCJ1cGRhdGVkUGF0aCIsInN0clBhdGgiLCJ1cGRhdGVkU2VnbWVudHMiLCJmdWxsU2VnbWVudHMiLCJzdGFydHNXaXRoUGF0aCIsInNlZyIsInJlbWFpbmluZ1NlZ21lbnRzIiwicHJvcHNDb3VudCIsImRldGVybWluZUNoYW5nZWRQcm9wcyIsImNvbWJpbmVkSGFzaCIsImxheW91dEhhc2hlcyIsInBhdGhIYXNoIiwiX2lzRmlyc3RMZXZlbFByb3BzQ2hpIiwiX2lzRmlyc3RMZXZlbFByb3BzQ2hpMiIsImRlc2NlbmRhbnQiLCJwcmV2aW91c0hhc2giLCJoYXNoIiwiX19fIiwiX19fXyIsImNvbXBvbmVudERlZmluaXRpb24iLCJsYXlvdXRQYXRoIiwiR2xvYmFsRXJyb3JDb250YWluZXIiLCJoeWRyYXRlSW5pdGlhbE91dHB1dHMiLCJzZXRMYXlvdXQiLCJjb21wdXRlR3JhcGhzIiwiRXZlbnRFbWl0dGVyIiwiVW5jb25uZWN0ZWRDb250YWluZXIiLCJkZXBlbmRlbmNpZXNSZXF1ZXN0IiwibGF5b3V0UmVxdWVzdCIsImVycm9yTG9hZGluZyIsInNldEVycm9yTG9hZGluZyIsInJlbmRlcmVkVHJlZSIsInN0b3JlRWZmZWN0IiwiZW1pdCIsInNlcnZlX2xvY2FsbHkiLCJfZGFzaFBsb3RseUpTVVJMIiwicmVxdWVzdHNfcGF0aG5hbWVfcHJlZml4IiwicGxvdGx5anNfdXJsIiwiY29udGVudCIsImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIiwiX19odG1sIiwiY2xhc3NOYW1lIiwiRnJhZ21lbnQiLCJjb21wb25lbnRzIiwiZmluYWxMYXlvdXQiLCJoYXNFcnJvciIsImZyb250RW5kIiwiYmFja0VuZCIsIm9uZU9mIiwib2JqZWN0IiwiaGlzdG9yeSIsIkNvbnRhaW5lciIsIkFQSUNvbnRyb2xsZXIiLCJMb2FkaW5nIiwiVG9vbGJhciIsIlJlbG9hZGVyIiwic2V0SG9va3MiLCJzZXRDb25maWciLCJtZW1vaXplV2l0aCIsIlVuY29ubmVjdGVkQXBwQ29udGFpbmVyIiwiX1JlYWN0JENvbXBvbmVudCIsIl9jYWxsU3VwZXIiLCJfaW5oZXJpdHMiLCJVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50IiwicmVuZGVyIiwic2hvd191bmRvX3JlZG8iLCJDb21wb25lbnQiLCJSZWFjdERPTSIsIkRhc2hSZW5kZXJlciIsImNyZWF0ZVJvb3QiLCJyb290IiwibG9nV2FybmluZ09uY2UiLCJHRVQiLCJmZXRjaENvbmZpZyIsIl9ib2R5IiwiUE9TVCIsInJlcXVlc3QiLCJlbmRwb2ludCIsInNldENvbm5lY3Rpb25TdGF0dXMiLCJfYm9keTIiLCJfc2V0Q29ubmVjdGlvblN0YXR1cyIsImJhY2tFbmRDb25uZWN0ZWQiLCJhY3Rpb25MaXN0IiwiT05fUFJPUF9DSEFOR0UiLCJTRVRfUkVRVUVTVF9RVUVVRSIsIlNFVF9HUkFQSFMiLCJTRVRfUEFUSFMiLCJTRVRfTEFZT1VUIiwiU0VUX0FQUF9MSUZFQ1lDTEUiLCJTRVRfQ09ORklHIiwiQUREX0hUVFBfSEVBREVSUyIsIk9OX0VSUk9SIiwiU0VUX0hPT0tTIiwiSU5TRVJUX0NPTVBPTkVOVCIsIlJFTU9WRV9DT01QT05FTlQiLCJSRVNFVF9DT01QT05FTlRfU1RBVEUiLCJnZXRBY3Rpb24iLCJEZXBHcmFwaCIsImlzTnVtZXJpYyIsImFwIiwiZXZvbHZlIiwiZm9yRWFjaE9iakluZGV4ZWQiLCJjcmF3bExheW91dCIsIkFMTCIsIndpbGQiLCJNQVRDSCIsIkFMTFNNQUxMRVIiLCJleHBhbmQiLCJ3aWxkY2FyZHMiLCJhbGxvd2VkV2lsZGNhcmRzIiwiT3V0cHV0IiwiSW5wdXQiLCJTdGF0ZSIsIndpbGRjYXJkVmFsVHlwZXMiLCJpZEludmFsaWRDaGFycyIsImlzV2lsZGNhcmRJZCIsInBhcnNlV2lsZGNhcmRJZCIsInBhcnNlTXVsdGlwbGVPdXRwdXRzIiwib3V0cHV0SWRBbmRQcm9wIiwiZG90UG9zIiwic3RyaW5naWZ5VmFsIiwicGFydHMiLCJpZFZhbFNvcnQiLCJiSXNOdW1lcmljIiwiYU4iLCJiTiIsImFJc0Jvb2wiLCJ2YWxCZWZvcmUiLCJ2YWxBZnRlciIsImFkZE1hcCIsImRlcE1hcCIsImRlcGVuZGVuY3kiLCJpZE1hcCIsImFkZFBhdHRlcm4iLCJpZFNwZWMiLCJrZXlTdHIiLCJ2YWx1ZXNLZXkiLCJwcm9wTWFwIiwidmFsdWVNYXAiLCJ2YWxNYXRjaCIsImFkZFBhcnRpYWxQYXR0ZXJuIiwib2ZmbG9hZFBhdHRlcm5zIiwicGF0dGVybnNNYXAiLCJ0YXJnZXRNYXAiLCJ2YWxpZGF0ZURlcGVuZGVuY2llcyIsInBhcnNlZERlcGVuZGVuY2llcyIsIm91dFN0cnMiLCJvdXRPYmpzIiwiaGFzT3V0cHV0cyIsInByZXZlbnRfaW5pdGlhbF9jYWxsIiwiY2xzIiwiaWRQcm9wIiwidmFsaWRhdGVBcmciLCJmaW5kRHVwbGljYXRlT3V0cHV0cyIsImZpbmRNaXNtYXRjaGVkV2lsZGNhcmRzIiwiaW52YWxpZENoYXJzIiwibmV3T3V0cHV0U3RycyIsIm5ld091dHB1dE9ianMiLCJpZE9iaiIsInNlbGZPdmVybGFwIiwid2lsZGNhcmRPdmVybGFwIiwib3RoZXJPdmVybGFwIiwiaWRQcm9wMiIsImNoZWNrSW5PdXRPdmVybGFwIiwib3V0SWQiLCJvdXRQcm9wIiwiaW5fIiwiaW5JZCIsImluUHJvcCIsIl9maW5kV2lsZGNhcmRLZXlzIiwiZmluZFdpbGRjYXJkS2V5cyIsIm91dDBNYXRjaEtleXMiLCJtYXRjaEtleXMiLCJvdXRwdXRzSGF2ZU1hdGNoIiwiYXJnIiwiX2ZpbmRXaWxkY2FyZEtleXMyIiwiYWxsc21hbGxlcktleXMiLCJkaWZmS2V5cyIsImRpZmYiLCJvdXREZXNjIiwibWF0Y2hXaWxkS2V5cyIsImFXaWxkIiwiYldpbGQiLCJpZFZhbHMiLCJfaXRlcmF0b3IzIiwiX3N0ZXAzIiwiaWQyIiwicHJvcGVydHkyIiwidmFsaWRhdGVDYWxsYmFja3NUb0xheW91dCIsInN0YXRlXyIsImxheW91dF8iLCJwYXRoc18iLCJ2YWxpZGF0ZUlkcyIsInZhbGlkYXRpb25fbGF5b3V0Iiwib3V0cHV0TWFwIiwib3V0cHV0UGF0dGVybnMiLCJ0YWlsIiwibWlzc2luZ0lkIiwidmFsaWRhdGVQcm9wIiwiaWRQYXRoIiwicmF3UHJvcCIsImxhc3QiLCJjaGFyQXQiLCJ2YWxpZGF0ZUlkUGF0dGVyblByb3AiLCJpZFJlc29sdmVkIiwiY2FsbGJhY2tJZHNDaGVja2VkRm9yU3RhdGUiLCJ2YWxpZGF0ZVN0YXRlIiwidmFsaWRhdGVNYXAiLCJkb1N0YXRlIiwiZmNiIiwib3B0aW9uYWwiLCJkZXBzIiwidmFsaWRhdGVQYXR0ZXJucyIsImtleVBhdHRlcm5zIiwiZGVwZW5kZW5jaWVzIiwibXVsdGlHcmFwaCIsInBlcmZvcm1hbmNlIiwid2lsZGNhcmRQbGFjZWhvbGRlcnMiLCJmaXhJZHMiLCJvdXRwdXRzX21ldGEiLCJvdXRwdXRTdHJzIiwicGFyc2VkIiwid3JhcHBlZERFIiwidmFsaWRhdGVfY2FsbGJhY2tzIiwib3V0cHV0UGF0dGVybk1hcCIsImlucHV0UGF0dGVybk1hcCIsInBhcnRpYWxPdXRwdXRQYXR0ZXJuTWFwIiwicGFydGlhbElucHV0UGF0dGVybk1hcCIsInBhcnRpYWxPdXRwdXRQYXR0ZXJucyIsImhhc1BhcnRpYWxPdXRwdXRQYXR0ZXJucyIsImZpbmFsR3JhcGhzIiwiTXVsdGlHcmFwaCIsImV4YWN0Iiwia2V5UGxhY2Vob2xkZXJzIiwibWFrZUFsbElkcyIsIm91dElkRmluYWwiLCJpZExpc3QiLCJ0ZXN0VmFscyIsIm91dFZhbEluZGV4IiwibmV3VmFscyIsIm91dHB1dFRhZyIsImR1cGxpY2F0ZU91dHB1dHMiLCJjYkluIiwiY2JPdXQiLCJhZGRJbnB1dFRvTXVsdGkiLCJpbklkUHJvcCIsIm91dElkUHJvcCIsImZpcnN0UGFzcyIsImFkZE5vZGUiLCJhZGREZXBlbmRlbmN5IiwiYWRkT3V0cHV0VG9NdWx0aSIsImluT2JqIiwiaW5JZExpc3QiLCJfZmluZFdpbGRjYXJkS2V5czMiLCJmaXJzdFNpbmdsZU91dHB1dCIsImZpbmFsRGVwZW5kZW5jeSIsIm91dFBhcnRpYWwiLCJhbHNvSW5wdXQiLCJvdXRJZExpc3QiLCJ0ZW1wT3V0SWRQcm9wIiwib3V0SWROYW1lIiwiaW5wdXRPYmplY3QiLCJpblBhcnRpYWwiLCJkdXBlT3V0SWRQcm9wIiwib3JpZ2luYWxOYW1lIiwibmV3TmFtZSIsImNudCIsImluTmFtZSIsIm91dE5hbWUiLCJlbmQiLCJjYWxsYmFja0dyYXBoVGltZSIsInRvRml4ZWQiLCJwYXR0ZXJuVmFsIiwicmVmSW5kZXgiLCJyZWZQYXR0ZXJuVmFsIiwiY29tcG9uZW50S2V5cyIsImNvbXBvbmVudFZhbHMiLCJwYXR0ZXJuS2V5IiwiY29tcEluZGV4IiwiX3JlZjEyJHBhcnRpYWwiLCJnZXRDYWxsYmFja0J5T3V0cHV0IiwiX2tleXMiLCJhZGRSZXNvbHZlZEZyb21PdXRwdXRzIiwib3V0UGF0dGVybiIsIm91dHMiLCJvdXQwS2V5cyIsIm91dDBQYXR0ZXJuVmFscyIsImZvdW5kQ2JJZHMiLCJvdXRWYWxzIiwic2luZ2xlT3V0UGF0dGVybiIsImFueVNlZW4iLCJvdXRTZXQiLCJtYXRjaFN0ciIsIm5ld1Byb3AiLCJfbG9vcDMiLCJsYXlvdXRDaHVuayIsIm91dHB1dHNPbmx5IiwiYWRkQ2FsbGJhY2siLCJmb3VuZEluZGV4IiwiZm91bmRDYiIsImFkZENhbGxiYWNrSWZBcnJheSIsImluaSIsImluaWoiLCJoYW5kbGVPbmVJZCIsIm91dElkQ2FsbGJhY2tzIiwiaW5JZENhbGxiYWNrcyIsImlzQ2FycnlPdmVyIiwibWF5YmVBZGRDYWxsYmFjayIsImhhbmRsZVRoaXNDYWxsYmFjayIsImNoaWxkIiwicGFyc2VDb29raWUiLCJyZWNvcmRVaUVkaXQiLCJzZXRBcHBMaWZlY3ljbGUiLCJzZXRSZXF1ZXN0UXVldWUiLCJpbnNlcnRDb21wb25lbnQiLCJvblByb3BDaGFuZ2UiLCJodG1sIiwidHJpZ2dlckRlZmF1bHRTdGF0ZSIsInRva2VuTmFtZSIsImNzcmZfdG9rZW5fbmFtZSIsImhlYWRlck5hbWUiLCJjc3JmX2hlYWRlcl9uYW1lIiwiY29va2llcyIsImNvb2tpZSIsInRva2VuIiwib3ZlcmFsbE9yZGVyIiwibGF5b3V0Q2FsbGJhY2tzIiwic3BlY2lhbENhbGxiYWNrcyIsImlzTm9PdXRwdXQiLCJpc05vSW5wdXQiLCJpbnAiLCJyZWRvIiwibW92ZUhpc3RvcnkiLCJ1bmRvIiwicmV2ZXJ0IiwiZnV0dXJlIiwicGFzdCIsInRhcmdldHMiLCJwcm9taXNlcyIsInJlbmRlcmVkIiwicmVzb2x2ZVJlbmRlcmVkIiwicGF0aE9mSWQiLCJ0YXJnZXQiLCJyZWFkeSIsInJhY2UiLCJwcm9wRXEiLCJzdWJUcmVlIiwic3RhcnRpbmdQYXRoIiwib2xkU3RycyIsIm9sZE9ianMiLCJfcmVmJG9iakluZGV4Iiwib2JqSW5kZXgiLCJvbGRPYmpJbmRleCIsImRpZmZIZWFkIiwic3BMZW4iLCJlZGl0TWFwIiwib2xkVmFsUGF0aHMiLCJvbGRLZXlzIiwib2xkaWUiLCJuZXdJdGVtcyIsImFwcGVuZE9mZnNldCIsIm5ld09iakl0ZW1zIiwiZnVsbFBhdGgiLCJwYXRoT2JqIiwiaGFzVXJsQmFzZSIsImhhc1JlcVByZWZpeCIsInVybF9iYXNlX3BhdGhuYW1lIiwicHJvcHNDaGlsZHJlbiIsImN1cnJlbnRQYXRoIiwib2JqT2YiLCJiYWNrIiwiY2hpbGRPYmoiLCJjaGlsZFBhdGgiLCJuZXdQYXRoIiwiY3AiLCJjdXJQYXRoIiwib1ZhbHVlIiwiX2NyYXdsTGF5b3V0IiwiX2V2Iiwib24iLCJsaXN0ZW5lciIsInJlbW92ZUxpc3RlbmVyIiwiX2xlbiIsIl9rZXkiLCJfbGVuMiIsIl9rZXkyIiwiUmVhY3RQcm9wVHlwZXNTZWNyZXQiLCJ0eXBlU3BlY3MiLCJjb21wb25lbnROYW1lIiwiZ2V0U3RhY2siLCJ0eXBlU3BlY05hbWUiLCJoYXNPd25Qcm9wZXJ0eSIsImV4Iiwic3RhY2siLCJib29sIiwiaXNSZXF1aXJlZCIsImNvbXBhcmF0b3IiLCJsdCIsImhvdF9yZWxvYWQiLCJfcHJvcHMkY29uZmlnJGhvdF9yZWwiLCJtYXhfcmV0cnkiLCJkaXNhYmxlZCIsImludGVydmFsSWQiLCJwYWNrYWdlcyIsIl9yZXRyeSIsIl9oZWFkIiwiY2xlYXJJbnRlcnZhbCIsInNldFN0YXRlIiwiY29tcG9uZW50RGlkVXBkYXRlIiwicHJldlByb3BzIiwicHJldlN0YXRlIiwicmVsb2FkUmVxdWVzdCIsImhhcmQiLCJ3YXNfY3NzIiwiZmlsZXMiLCJpc19jc3MiLCJub2Rlc1RvRGlzYWJsZSIsIml0IiwiZXZhbHVhdGUiLCJpdGVyYXRlTmV4dCIsInNldEF0dHJpYnV0ZSIsImxpbmsiLCJyZWxvYWQiLCJhbGVydCIsImNvbXBvbmVudERpZE1vdW50IiwiX3RoaXMkcHJvcHMiLCJfdGhpcyRzdGF0ZSIsInNldEludGVydmFsIiwiY29tcG9uZW50V2lsbFVubW91bnQiLCJnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMiLCJkZWZhdWx0UHJvcHMiLCJzdHJpbmciLCJudW1iZXIiLCJVbmNvbm5lY3RlZFRvb2xiYXIiLCJ1bmRvTGluayIsIm9uQ2xpY2siLCJyZWRvTGluayIsIkN5dG9zY2FwZSIsIkN5dG9zY2FwZUNvbXBvbmVudCIsImRhZ3JlIiwiZmNvc2UiLCJKU09OVHJlZSIsInN0eWxlc2hlZXQiLCJ1cGRhdGVTZWxlY3RlZE5vZGUiLCJ1cGRhdGVDaGFuZ2VkUHJvcHMiLCJ1cGRhdGVDYWxsYmFjayIsInVzZSIsImdlbmVyYXRlRWxlbWVudHMiLCJwcm9maWxlIiwiZXh0cmFMaW5rcyIsImNvbnN1bWVkIiwiZWxlbWVudHMiLCJzdHJ1Y3R1cmUiLCJyZWNvcmROb2RlIiwicmF3UHJvcGVydHkiLCJpZFR5cGUiLCJwYXJlbnRJZCIsImNoaWxkSWQiLCJsYWJlbCIsInBhcmVudCIsInJlY29yZEVkZ2UiLCJ2aXNpYmxlSW5kZXgiLCJoaWRkZW4iLCJjYlByb2ZpbGUiLCJ0aW1lIiwidG90YWwiLCJyb3VuZCIsImxvYWRpbmdTZXQiLCJlcnJvclNldCIsIm5vZGVJZCIsImNoaWxkSWRzIiwiY2hpbGRGcm9tIiwiY2hpbGRUbyIsInJlZHVjZVN0YXR1cyIsImxhdGVzdCIsImZsYXR0ZW5PdXRwdXRzIiwiZmxhdHRlbklucHV0cyIsImluQXJyYXkiLCJmaW5hbCIsImluSXRlbSIsImNsZWFuT3V0cHV0SWQiLCJvdXRwdXRJZCIsImFnZyIsImNiUHJlZml4TGVuIiwiZGFncmVMYXlvdXQiLCJwYWRkaW5nIiwicmFua2VyIiwiZm9yY2VMYXlvdXQiLCJhbmltYXRlIiwibGF5b3V0cyIsInNwYWNpbmdGYWN0b3IiLCJub2RlU2VwIiwicmFua1NlcCIsInJhbmtEaXIiLCJmb3JjZSIsIkNhbGxiYWNrR3JhcGgiLCJjaGFuZ2VkIiwibGlmZWN5Y2xlU3RhdGUiLCJzZWxlY3RlZCIsInNldFNlbGVjdGVkIiwiX3VzZVN0YXRlMyIsIl91c2VTdGF0ZTQiLCJjeXRvc2NhcGUiLCJzZXRDeXRvc2NhcGUiLCJncmFwaExheW91dCIsImNob3NlblR5cGUiLCJfY2hvc2VuVHlwZSIsImxheW91dFNlbGVjdG9yIiwiX3VzZVN0YXRlNSIsIl91c2VTdGF0ZTYiLCJsYXlvdXRUeXBlIiwic2V0TGF5b3V0VHlwZSIsInVzZUN5dG9zY2FwZUVmZmVjdCIsImVmZmVjdCIsImNvbmRpdGlvbiIsImdldENvbXBvbmVudCIsImhhc1BhdHRlcm5zIiwiZ2V0UHJvcFZhbHVlIiwic2V0UHJlc2V0TGF5b3V0IiwiX2xheW91dFNlbGVjdG9yJGN1cnJlIiwiY3kiLCJwb3NpdGlvbnMiLCJub2RlcyIsImVhY2giLCJwb3NpdGlvbiIsImZpdCIsInpvb20iLCJwYW4iLCJlbGVtZW50TmFtZSIsImVsZW1lbnRJbmZvIiwiX2dldENvbXBvbmVudCIsInJlc3QiLCJjYWxsYmFja091dHB1dElkIiwibmV0d29yayIsImNvbXB1dGUiLCJhdmciLCJ0aW1pbmciLCJkb3dubG9hZCIsInVwbG9hZCIsImN5TGF5b3V0Iiwic3R5bGUiLCJ3aWR0aCIsImhlaWdodCIsInRoZW1lIiwibGFiZWxSZW5kZXJlciIsImdldEl0ZW1TdHJpbmciLCJpdGVtVHlwZSIsInNob3VsZEV4cGFuZE5vZGUiLCJrZXlOYW1lIiwibGV2ZWwiLCJvbkNoYW5nZSIsInJlZiIsIlVuY29ubmVjdGVkQ2FsbGJhY2tHcmFwaENvbnRhaW5lciIsIl9Db21wb25lbnQiLCJjb21wb25lbnREaWRDYXRjaCIsImluZm8iLCJteUlEIiwiZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yIiwiQ2FsbGJhY2tHcmFwaENvbnRhaW5lciIsInNlbGVjdG9yIiwiZGlzcGxheSIsImNvbG9yIiwiZ2hvc3QiLCJvcGFjaXR5IiwiU1RBVFVTTUFQIiwiZ2V0RWRnZVR5cGVzIiwiY29ubmVjdGVkRWRnZXMiLCJhc2NlbmQiLCJjb2xsZWN0aW9uIiwiZWRnZXMiLCJwYXJlbnRzIiwic291cmNlcyIsImFuY2VzdG9ycyIsImRlc2NlbmQiLCJhZGRDbGFzcyIsIm90aGVyIiwiYWJzb2x1dGVDb21wbGVtZW50IiwicmVtb3ZlQ2xhc3MiLCJmbGFzaFRpbWUiLCJmbGFzaENsYXNzIiwiZWRnZXNUbyIsImF2Z1RpbWUiLCJoYXNDbGFzcyIsInRpbWVMZWZ0IiwicHJldkNoaWxkcmVuIiwiQ29sbGFwc2VJY29uIiwid2Vya3pldWdDc3MiLCJGcm9udEVuZEVycm9yIiwiY29sbGFwc2VkIiwiaXNMaXN0SXRlbSIsImluQWxlcnRzVHJheSIsImNhcmRDbGFzc2VzIiwiZXJyb3JIZWFkZXIiLCJ0aW1lc3RhbXAiLCJ0b0xvY2FsZVRpbWVTdHJpbmciLCJFcnJvckNvbnRlbnQiLCJCYWNrZW5kRXJyb3IiLCJpZnJhbWVSZWYiLCJzZXRIZWlnaHQiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwic3JjRG9jIiwiYm9yZGVyIiwiTUFYX01FU1NBR0VfTEVOR1RIIiwiVW5jb25uZWN0ZWRFcnJvckNvbnRlbnQiLCJpc0Z1bGxIdG1sRG9jIiwidG9Mb3dlckNhc2UiLCJpc0h0bWxGcmFnbWVudCIsImVycm9yUHJvcFR5cGVzIiwiRnJvbnRFbmRFcnJvckNvbnRhaW5lciIsImNsaWNrSGFuZGxlciIsImVycm9yRWxlbWVudHMiLCJhcnJheSIsIkRlYnVnTWVudSIsIlVuY29ubmVjdGVkR2xvYmFsRXJyb3JDb250YWluZXIiLCJob3RSZWxvYWQiLCJDaGVja0ljb24iLCJDbG9ja0ljb24iLCJFcnJvckljb24iLCJHcmFwaEljb24iLCJPZmZJY29uIiwiRXhwYW5kIiwiVmVyc2lvbkluZm8iLCJQbG90bHlDbG91ZCIsIkRldnRvb2xQcm92aWRlciIsImNsYXNzZXMiLCJ2YXJpYW50IiwidmFyaWFudDIiLCJpc0NvbGxhcHNlZCIsImxvY2FsU3RvcmFnZSIsImdldEl0ZW0iLCJNZW51Q29udGVudCIsIl9jb25maWckZGV2X3Rvb2xzIiwicG9wdXAiLCJ0b2dnbGVFcnJvcnMiLCJlcnJDb3VudCIsInRvZ2dsZUNhbGxiYWNrR3JhcGgiLCJfU3RhdHVzSWNvbiIsImN1c3RvbSIsImRldl90b29scyIsIl9kZXZ0b29sJHByb3BzIiwiY29tcCIsImxlZnQiLCJyaWdodCIsInBsb3RseV9jbG91ZF9pbnN0YWxsZWQiLCJmaWxsIiwibWFyZ2luUmlnaHQiLCJEZWJ1ZyIsIl91c2VEZXZ0b29sIiwic2V0UG9wdXAiLCJzZXRDb2xsYXBzZWQiLCJ0b2dnbGVDb2xsYXBzZWQiLCJzZXRJdGVtIiwicG9wdXBDb250ZW50IiwibWVudUNvbnRlbnQiLCJwb3B1cE5hbWUiLCJDbG91ZFNsYXNoSWNvbiIsIkNMT1VEX1BPUFVQIiwiaXNPcGVuIiwib25Db3B5IiwibmF2aWdhdG9yIiwiY2xpcGJvYXJkIiwid3JpdGVUZXh0IiwiREFZX0lOX01TIiwiY29tcGFyZVZlcnNpb25zIiwidjEiLCJ2MiIsInYxUGFydHMiLCJ2MlBhcnRzIiwicGFydDEiLCJwYXJ0MiIsInJlcXVlc3REYXNoVmVyc2lvbkluZm8iLCJfcmVxdWVzdERhc2hWZXJzaW9uSW5mbyIsImN1cnJlbnREYXNoVmVyc2lvbiIsImRhc2hWZXJzaW9uVXJsIiwicHl0aG9uVmVyc2lvbiIsImRka1ZlcnNpb24iLCJwbG90bHlWZXJzaW9uIiwiY2FjaGVkVmVyc2lvbkluZm8iLCJjYWNoZWROZXdEYXNoVmVyc2lvbkxpbmsiLCJsYXN0RmV0Y2hlZCIsInF1ZXJ5UGFyYW1zIiwiZGFzaF92ZXJzaW9uIiwiZGFzaF92ZXJzaW9uX3VybCIsInB5dGhvbl92ZXJzaW9uIiwiZGRrX3ZlcnNpb24iLCJwbG90bHlfdmVyc2lvbiIsInZlcnNpb24iLCJzaG91bGRSZXF1ZXN0RGFzaFZlcnNpb24iLCJVUkxTZWFyY2hQYXJhbXMiLCJkaXNhYmxlX3ZlcnNpb25fY2hlY2siLCJzaG93Tm90aWZpY2F0aW9ucyIsInNob3VsZFNob3dVcGdyYWRlTm90aWZpY2F0aW9uIiwibmV3RGFzaFZlcnNpb24iLCJsYXN0RGlzbWlzc2VkIiwibGFzdERpc21pc3NlZFZlcnNpb24iLCJzZXROZXdEYXNoVmVyc2lvbiIsIm5ld0Rhc2hWZXJzaW9uTGluayIsInNldE5ld0Rhc2hWZXJzaW9uTGluayIsInVwZ3JhZGVUb29sdGlwT3BlbmVkIiwic2V0VXBncmFkZVRvb2x0aXBPcGVuZWQiLCJzZXREb250U2hvd0FnYWluIiwic2V0UmVtaW5kTWVMYXRlciIsInNldFNraXBUaGlzVmVyc2lvbiIsImhpZGVVcGdyYWRlVG9vbHRpcCIsIlJFRElSRUNUX1VSSV9QQVRITkFNRSIsIk9BVVRIX0NPT0tJRV9OQU1FIiwibWVzc2FnZVBhcnRzIiwiaW52YWxpZFByb3BQYXRoIiwiZXhwZWN0ZWRQcm9wVHlwZSIsImludmFsaWRQcm9wVHlwZVByb3ZpZGVkIiwianNvblN1cHBsaWVkVmFsdWUiLCJTSU1QTEVfQ09NUE9ORU5UX1RZUEVTIiwibGVuc1BhdGgiLCJzdG9yZVByZWZpeCIsImtleVByZWZpeE1hdGNoIiwicHJlZml4Iiwic2VwYXJhdG9yIiwiZnVsbFN0ciIsImZ1bGxMZW4iLCJVTkRFRklORUQiLCJfcGFyc2UiLCJfc3RyaW5naWZ5IiwiV2ViU3RvcmUiLCJfbmFtZSIsIl9zdG9yYWdlIiwiaGFzSXRlbSIsIl9zZXRJdGVtIiwicmVtb3ZlSXRlbSIsImtleVByZWZpeCIsImZ1bGxQcmVmaXgiLCJrZXlNYXRjaCIsImtleXNUb1JlbW92ZSIsImZ1bGxLZXkiLCJNZW1TdG9yZSIsInBvdyIsImxvbmdTdHJpbmciLCJtZW1vcnkiLCJiYWNrRW5kcyIsImxvY2FsIiwic2Vzc2lvbiIsInRyeUdldFdlYlN0b3JlIiwiZmFsbGJhY2tTdG9yZSIsInN0b3JlVGVzdCIsInRlc3RLZXkiLCJnZXRTdG9yZSIsIm5vb3BUcmFuc2Zvcm0iLCJleHRyYWN0IiwicHJvcFZhbHVlIiwic3RvcmVkVmFsdWUiLCJfcHJvcFZhbHVlIiwiZ2V0VHJhbnNmb3JtIiwicHJvcFBhcnQiLCJwZXJzaXN0ZW5jZVRyYW5zZm9ybXMiLCJnZXRWYWxzS2V5IiwicGVyc2lzdGVkUHJvcCIsInBlcnNpc3RlbmNlIiwiZ2V0UHJvcHMiLCJnZXRWYWwiLCJkYXNoUGVyc2lzdGVuY2UiLCJwZXJzaXN0ZWRfcHJvcHMiLCJwZXJzaXN0ZW5jZV90eXBlIiwiY2FuUGVyc2lzdCIsIl9nZXRQcm9wcyIsImlzUGVyc2lzdGVuY2VNaXNtYXRjaCIsIl9wZXJzaXN0ZWRQcm9wJHNwbGl0IiwiX3BlcnNpc3RlZFByb3Akc3BsaXQyIiwic3RvcmFnZSIsIl9nZXRUcmFuc2Zvcm0iLCJ2YWxzS2V5Iiwib3JpZ2luYWxWYWwiLCJuZXdWYWwiLCJsYXkiLCJwZXJzaXN0ZW5jZU1vZHMiLCJVTkRPIiwibW9kUHJvcCIsInVwZGF0ZSIsIl9zdG9yYWdlJGdldEl0ZW0iLCJfc3RvcmFnZSRnZXRJdGVtMiIsImZyb21WYWwiLCJ0b1ZhbCIsIl9wZXJzaXN0ZWRQcm9wJHNwbGl0MyIsIl9wZXJzaXN0ZWRQcm9wJHNwbGl0NCIsInRyZWVQYXRoIiwiX2dldFByb3BzMiIsImxheW91dE91dCIsImNhcnJpZWRPdmVyIiwiX2dldFByb3BzMyIsImdldEZpbmFsIiwicHJldlZhbCIsImZpbmFsUGVyc2lzdGVuY2UiLCJmaW5hbFBlcnNpc3RlbmNlVHlwZSIsImZpbmFsUGVyc2lzdGVkUHJvcHMiLCJwZXJzaXN0ZW5jZUNoYW5nZWQiLCJub3RJbk5ld1Byb3BzIiwiZGVwZXJzaXN0ZWRQcm9wcyIsImZpbmFsU3RvcmFnZSIsImludGVybmFscyIsIl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEIiwiUmVhY3RDdXJyZW50T3duZXIiLCJSZWFjdEN1cnJlbnREaXNwYXRjaGVyIiwiUmVhY3RDdXJyZW50QmF0Y2hDb25maWciLCJ0cmFuc2l0aW9uIiwicmVhY3RNYWpvciIsInBhcnNlSW50IiwiZm9yIiwiZWxlbWVudFN5bWJvbCIsIm9yaWdpbmFsU3ltYm9sRm9yIiwiUmVhY3RKU1hSdW50aW1lIiwianN4IiwibWF5YmVLZXkiLCJqc3hzIiwianN4REVWIiwiY3JlYXRlQXBpUmVkdWNlciIsIkFwaVJlZHVjZXIiLCJuZXdTdGF0ZSIsIl9hY3Rpb24kcGF5bG9hZCIsIm5ld1JlcXVlc3QiLCJpbml0aWFsQ2hhbmdlIiwiY2hpbGRyZW5fcHJvcHMiLCJzdGF0ZUxpc3QiLCJTVEFSVEVEIiwiSFlEUkFURUQiLCJERVNUUk9ZRUQiLCJpbml0aWFsR3JhcGgiLCJpbml0aWFsRXJyb3IiLCJpbml0aWFsSGlzdG9yeSIsInByZXNlbnQiLCJuZXdQYXN0IiwibmV3RnV0dXJlIiwiY3VzdG9tSG9va3MiLCJiZWFyIiwidmlldyIsImV4aXN0aW5nUHJvcHMiLCJtZXJnZWRQcm9wcyIsImluaXRpYWxQYXRocyIsImNsb25lIiwiZGVmYXVsdFByb2ZpbGUiLCJkZWZhdWx0U3RhdGUiLCJzdGF0dXNNYXBwZWQiLCJjYlJlc291cmNlcyIsInRvdGFsUmVzb3VyY2VzIiwidXNlciIsImNvbWJpbmVSZWR1Y2VycyIsImFwaVJlcXVlc3RzIiwiYWN0aW9uUGF0aCIsInByZWZpeFN0ciIsImZyb21FbnRyaWVzIiwibWFpblJlZHVjZXIiLCJnZXRJbnB1dEhpc3RvcnlTdGF0ZSIsInJlY29yZENoYW5nZXMiLCJyZWZQcm9wcyIsImhpc3RvcnlFbnRyeSIsInByb3BLZXkiLCJyZWNvcmRIaXN0b3J5IiwibmV4dFN0YXRlIiwicmVsb2FkZXJSZWR1Y2VyIiwid2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJmYWN0b3J5IiwiZXhwb3J0cyIsImRlZmluZSIsImFtZCIsIl9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzE0MF9fIiwiX193ZWJwYWNrX21vZHVsZXNfXyIsInRndCIsInNyY3MiLCJfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwic2xpY2VJdGVyYXRvciIsImFyciIsIl9hcnIiLCJfZCIsIl9lIiwiX3MiLCJMaW5rZWRMaXN0IiwibGF5b3V0QmFzZSIsImF1eGlsaWFyeSIsImdldFRvcE1vc3ROb2RlcyIsIm5vZGVzTWFwIiwicm9vdHMiLCJlbGUiLCJjb25uZWN0Q29tcG9uZW50cyIsImVsZXMiLCJ0b3BNb3N0Tm9kZXMiLCJkdW1teU5vZGVzIiwicXVldWUiLCJ2aXNpdGVkVG9wTW9zdE5vZGVzIiwiY3VycmVudE5laWdoYm9yIiwibWluRGVncmVlTm9kZSIsIm1pbkRlZ3JlZSIsIm5vZGVzQ29ubmVjdGVkVG9EdW1teSIsImNtcHQiLCJjdXJyZW50Tm9kZSIsImNoaWxkcmVuT2ZDdXJyZW50Tm9kZSIsImRlc2NlbmRhbnRzIiwic2hpZnQiLCJuZWlnaGJvck5vZGVzIiwibmVpZ2hib3Job29kIiwiZWRnZXNXaXRoIiwibmVpZ2hib3JOb2RlIiwidW5pb24iLCJjaGlsZHJlbk9mTmVpZ2hib3IiLCJyZWxvY2F0ZUNvbXBvbmVudCIsIm9yaWdpbmFsQ2VudGVyIiwiY29tcG9uZW50UmVzdWx0IiwiZml4ZWROb2RlQ29uc3RyYWludCIsIm1pblhDb29yZCIsIlBPU0lUSVZFX0lORklOSVRZIiwibWF4WENvb3JkIiwiTkVHQVRJVkVfSU5GSU5JVFkiLCJtaW5ZQ29vcmQiLCJtYXhZQ29vcmQiLCJxdWFsaXR5IiwiX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiIsIl9kaWRJdGVyYXRvckVycm9yIiwiX2l0ZXJhdG9yRXJyb3IiLCJub2RlSW5kZXhlcyIsImN5Tm9kZSIsIm5vZGVCQiIsImJvdW5kaW5nQm94IiwibGVmdFgiLCJ4Q29vcmRzIiwicmlnaHRYIiwidG9wWSIsInlDb29yZHMiLCJib3R0b21ZIiwiZGlmZk9uWCIsIngiLCJkaWZmT25ZIiwiZ2V0UmVjdCIsIl9kaWZmT25YIiwiX2RpZmZPblkiLCJzZXRDZW50ZXIiLCJnZXRDZW50ZXJYIiwiZ2V0Q2VudGVyWSIsImNhbGNCb3VuZGluZ0JveCIsInBhcmVudE5vZGUiLCJNQVhfU0FGRV9JTlRFR0VSIiwiTUlOX1NBRkVfSU5URUdFUiIsInRvcCIsImJvdHRvbSIsIm5vZGVMZWZ0Iiwibm9kZVJpZ2h0Iiwibm9kZVRvcCIsIm5vZGVCb3R0b20iLCJub3QiLCJ0b3BMZWZ0WCIsInRvcExlZnRZIiwiY2FsY1BhcmVudHNXaXRob3V0Q2hpbGRyZW4iLCJwYXJlbnRzV2l0aG91dENoaWxkcmVuIiwiY2hlY2siLCJjc3MiLCJhdXgiLCJDb1NFTGF5b3V0IiwiQ29TRU5vZGUiLCJQb2ludEQiLCJEaW1lbnNpb25EIiwiTGF5b3V0Q29uc3RhbnRzIiwiRkRMYXlvdXRDb25zdGFudHMiLCJDb1NFQ29uc3RhbnRzIiwiY29zZUxheW91dCIsInNwZWN0cmFsUmVzdWx0IiwiaWRUb0xOb2RlIiwicmFuZG9taXplIiwiaXNGbiIsIm9wdEZuIiwib3B0IiwicHJvY2Vzc0NoaWxkcmVuTGlzdCIsInRoZUNoaWxkIiwiY2hpbGRyZW5fb2ZfY2hpbGRyZW4iLCJ0aGVOb2RlIiwiZGltZW5zaW9ucyIsImxheW91dERpbWVuc2lvbnMiLCJub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHMiLCJvdXRlcldpZHRoIiwib3V0ZXJIZWlnaHQiLCJpc1BhcmVudCIsImdyYXBoTWFuYWdlciIsInBhcnNlRmxvYXQiLCJwYXJlbnRJbmZvIiwibm9kZVJlcHVsc2lvbiIsInBhZGRpbmdMZWZ0IiwicGFkZGluZ1RvcCIsInBhZGRpbmdSaWdodCIsInBhZGRpbmdCb3R0b20iLCJsYWJlbFdpZHRoIiwiaW5jbHVkZUxhYmVscyIsImluY2x1ZGVOb2RlcyIsImluY2x1ZGVPdmVybGF5cyIsImxhYmVsSGVpZ2h0IiwibGFiZWxQb3NWZXJ0aWNhbCIsImxhYmVsUG9zSG9yaXpvbnRhbCIsImlzTmFOIiwicmVjdCIsInRoZU5ld0dyYXBoIiwiZ2V0R3JhcGhNYW5hZ2VyIiwibmV3R3JhcGgiLCJwcm9jZXNzRWRnZXMiLCJnbSIsImlkZWFsTGVuZ3RoVG90YWwiLCJlZGdlQ291bnQiLCJlZGdlIiwic291cmNlTm9kZSIsInRhcmdldE5vZGUiLCJnZXRFZGdlc0JldHdlZW4iLCJlMSIsIm5ld0VkZ2UiLCJpZGVhbExlbmd0aCIsImlkZWFsRWRnZUxlbmd0aCIsImVkZ2VFbGFzdGljaXR5IiwiREVGQVVMVF9FREdFX0xFTkdUSCIsIk1JTl9SRVBVTFNJT05fRElTVCIsIkRFRkFVTFRfUkFESUFMX1NFUEFSQVRJT04iLCJwcm9jZXNzQ29uc3RyYWludHMiLCJjb25zdHJhaW50cyIsImFsaWdubWVudENvbnN0cmFpbnQiLCJyZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQiLCJuZXN0aW5nRmFjdG9yIiwiUEVSX0xFVkVMX0lERUFMX0VER0VfTEVOR1RIX0ZBQ1RPUiIsImdyYXZpdHkiLCJERUZBVUxUX0dSQVZJVFlfU1RSRU5HVEgiLCJudW1JdGVyIiwiTUFYX0lURVJBVElPTlMiLCJncmF2aXR5UmFuZ2UiLCJERUZBVUxUX0dSQVZJVFlfUkFOR0VfRkFDVE9SIiwiZ3Jhdml0eUNvbXBvdW5kIiwiREVGQVVMVF9DT01QT1VORF9HUkFWSVRZX1NUUkVOR1RIIiwiZ3Jhdml0eVJhbmdlQ29tcG91bmQiLCJERUZBVUxUX0NPTVBPVU5EX0dSQVZJVFlfUkFOR0VfRkFDVE9SIiwiaW5pdGlhbEVuZXJneU9uSW5jcmVtZW50YWwiLCJERUZBVUxUX0NPT0xJTkdfRkFDVE9SX0lOQ1JFTUVOVEFMIiwidGlsaW5nQ29tcGFyZUJ5IiwiVElMSU5HX0NPTVBBUkVfQlkiLCJRVUFMSVRZIiwiTk9ERV9ESU1FTlNJT05TX0lOQ0xVREVfTEFCRUxTIiwiREVGQVVMVF9JTkNSRU1FTlRBTCIsIkFOSU1BVEUiLCJUSUxFIiwidGlsZSIsIlRJTElOR19QQURESU5HX1ZFUlRJQ0FMIiwidGlsaW5nUGFkZGluZ1ZlcnRpY2FsIiwiVElMSU5HX1BBRERJTkdfSE9SSVpPTlRBTCIsInRpbGluZ1BhZGRpbmdIb3Jpem9udGFsIiwiUFVSRV9JTkNSRU1FTlRBTCIsIkRFRkFVTFRfVU5JRk9STV9MRUFGX05PREVfU0laRVMiLCJ1bmlmb3JtTm9kZURpbWVuc2lvbnMiLCJzdGVwIiwiVFJBTlNGT1JNX09OX0NPTlNUUkFJTlRfSEFORExJTkciLCJFTkZPUkNFX0NPTlNUUkFJTlRTIiwiQVBQTFlfTEFZT1VUIiwiVFJFRV9SRURVQ1RJT05fT05fSU5DUkVNRU5UQUwiLCJuZXdHcmFwaE1hbmFnZXIiLCJhZGRSb290IiwicnVuTGF5b3V0IiwiZGVzY3JpcHRvciIsIkNvbnN0cnVjdG9yIiwicHJvdG9Qcm9wcyIsInN0YXRpY1Byb3BzIiwiaW5zdGFuY2UiLCJfcmVxdWlyZSIsInNwZWN0cmFsTGF5b3V0IiwiX3JlcXVpcmUyIiwiZGVmYXVsdHMiLCJmcmVlemUiLCJhbmltYXRpb25EdXJhdGlvbiIsImFuaW1hdGlvbkVhc2luZyIsInBhY2tDb21wb25lbnRzIiwic2FtcGxpbmdUeXBlIiwic2FtcGxlU2l6ZSIsIm5vZGVTZXBhcmF0aW9uIiwicGlUb2wiLCJzdG9wIiwiTGF5b3V0IiwiY29zZVJlc3VsdCIsImNvbXBvbmVudENlbnRlcnMiLCJ2ZXJ0aWNhbCIsImhvcml6b250YWwiLCJjb25zdHJhaW50RXhpc3QiLCJsYXlVdGlsIiwicGFja2luZ0VuYWJsZWQiLCJsYXlvdXRVdGlsaXRpZXMiLCJ4MSIsInkxIiwidG9CZVRpbGVkTm9kZXMiLCJfeENvb3JkcyIsIl95Q29vcmRzIiwidGVtcFNwZWN0cmFsUmVzdWx0IiwiaW5kZXhlc1RvQmVEZWxldGVkIiwiX2JvdW5kaW5nQm94IiwiY29tcG9uZW50c0V2YWx1YXRlZCIsInN1YmdyYXBocyIsImhpZGRlbkVsZXMiLCJzdWJncmFwaCIsIm5vZGVJbmRleCIsImJvdW5kaW5nYm94IiwiZ2V0TGVmdCIsImdldFRvcCIsImdldFdpZHRoIiwiZ2V0SGVpZ2h0Iiwic291cmNlTm9kZUluZGV4IiwidGFyZ2V0Tm9kZUluZGV4Iiwic291cmNlQ2VudGVyIiwidGFyZ2V0Q2VudGVyIiwiX3BhcmVudEluZm8iLCJzdGFydFgiLCJzdGFydFkiLCJlbmRYIiwiZW5kWSIsInNoaWZ0UmVzdWx0Iiwic2hpZnRzIiwibmV3WENvb3JkcyIsImR4IiwibmV3WUNvb3JkcyIsImR5IiwiX2NvdW50Iiwibm9kZVJlY3RhbmdsZSIsImdldFBvc2l0aW9ucyIsInBvcyIsInRoZUlkIiwiX3BvcyIsIl9oaWRkZW5FbGVzIiwibGF5b3V0UG9zaXRpb25zIiwiTWF0cml4IiwiU1ZEIiwicGFyZW50Tm9kZXMiLCJwYXJlbnRDaGlsZE1hcCIsImFsbE5vZGVzTmVpZ2hib3Job29kIiwic2FtcGxlc0NvbHVtbiIsIm1pbkRpc3RhbmNlc0NvbHVtbiIsIkMiLCJQSEkiLCJJTlYiLCJmaXJzdFNhbXBsZSIsIm5vZGVTaXplIiwiaW5maW5pdHkiLCJzbWFsbCIsInJhbmRvbVNhbXBsZUNSIiwic2FtcGxlIiwiZmxhZyIsImZsb29yIiwiQkZTIiwicGl2b3QiLCJzYW1wbGluZ01ldGhvZCIsImRpc3RhbmNlIiwibWF4X2Rpc3QiLCJtYXhfaW5kIiwibmVpZ2hib3JzIiwiX2kyIiwiX2kzIiwiYWxsQkZTIiwiX2k0IiwiX2k1IiwiX2k2IiwiX2k3IiwiX2k4IiwiX2oiLCJTVkRSZXN1bHQiLCJzdmQiLCJhX3EiLCJTIiwiYV91IiwiVSIsImFfdiIsIlYiLCJtYXhfcyIsImFfU2lnIiwibXVsdE1hdCIsInRyYW5zcG9zZSIsInBvd2VySXRlcmF0aW9uIiwidGhldGExIiwidGhldGEyIiwiWTEiLCJZMiIsIlYxIiwiVjIiLCJub3JtYWxpemUiLCJfaTkiLCJtdWx0R2FtbWEiLCJtdWx0TCIsImRvdFByb2R1Y3QiLCJhYnMiLCJfaTEwIiwiX2kxMSIsIm1pbnVzT3AiLCJtdWx0Q29ucyIsIl9pMTIiLCJzcXJ0IiwiX2kxMyIsImVsZTIiLCJlbGVJbmRleCIsImRpc2Nvbm5lY3RlZElkIiwiX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjIiLCJfZGlkSXRlcmF0b3JFcnJvcjIiLCJfaXRlcmF0b3JFcnJvcjIiLCJfaTE0IiwiX2kxNSIsImZpcnN0Tm9kZVBvcyIsImZpcnN0Tm9kZVdpZHRoIiwic2Vjb25kTm9kZSIsInNlY29uZE5vZGVXaWR0aCIsImltcGwiLCJyZWdpc3RlciIsIl9fd2VicGFja19tb2R1bGVfY2FjaGVfXyIsIm1vZHVsZUlkIiwiY2FjaGVkTW9kdWxlIiwiX193ZWJwYWNrX2V4cG9ydHNfXyIsIm9uZU9mVHlwZSIsInBhbm5pbmdFbmFibGVkIiwidXNlclBhbm5pbmdFbmFibGVkIiwibWluWm9vbSIsIm1heFpvb20iLCJ6b29taW5nRW5hYmxlZCIsInVzZXJab29taW5nRW5hYmxlZCIsImJveFNlbGVjdGlvbkVuYWJsZWQiLCJhdXRvdW5ncmFiaWZ5IiwiYXV0b2xvY2siLCJhdXRvdW5zZWxlY3RpZnkiLCJ0b0pzb24iLCJoZWFkbGVzcyIsInN0eWxlRW5hYmxlZCIsImhpZGVFZGdlc09uVmlld3BvcnQiLCJ0ZXh0dXJlT25WaWV3cG9ydCIsIm1vdGlvbkJsdXIiLCJtb3Rpb25CbHVyT3BhY2l0eSIsIndoZWVsU2Vuc2l0aXZpdHkiLCJwaXhlbFJhdGlvIiwic2hhbGxvd09iakRpZmYiLCJtaXNtYXRjaGVzIiwiaXNEaWZmQXRLZXkiLCJFIiwiZyIsInBhdGNoSnNvbiIsInZhbDIiLCJmcm9tSnNvbiIsImdldElkIiwiZWxlMSIsIk8iLCJzY3JhdGNoIiwiX2UkQ29tcG9uZW50IiwiY29udGFpbmVyUmVmIiwiY3JlYXRlUmVmIiwiZ2xvYmFsIiwiX2N5IiwidXBkYXRlQ3l0b3NjYXBlIiwiZGVzdHJveSIsIl90aGlzJHByb3BzMiIsIm5vcm1hbGl6ZUVsZW1lbnRzIiwic3RhdGljIiwiQ29udGV4dEtleSIsImdUIiwiZ2V0Q29udGV4dCIsIl9nVCRDb250ZXh0S2V5IiwiY29udGV4dE1hcCIsInJlYWxDb250ZXh0IiwiUmVhY3RSZWR1eENvbnRleHQiLCJjcmVhdGVTdWJzY3JpcHRpb24iLCJ1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0IiwiY29udGV4dCIsInNlcnZlclN0YXRlIiwiX3JlZiRzdGFiaWxpdHlDaGVjayIsInN0YWJpbGl0eUNoZWNrIiwiX3JlZiRub29wQ2hlY2siLCJub29wQ2hlY2siLCJjb250ZXh0VmFsdWUiLCJzdWJzY3JpcHRpb24iLCJnZXRTZXJ2ZXJTdGF0ZSIsInByZXZpb3VzU3RhdGUiLCJvblN0YXRlQ2hhbmdlIiwibm90aWZ5TmVzdGVkU3VicyIsInRyeVN1YnNjcmliZSIsInRyeVVuc3Vic2NyaWJlIiwiQ29udGV4dCIsIl9leHRlbmRzIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UiLCJob2lzdFN0YXRpY3MiLCJpc1ZhbGlkRWxlbWVudFR5cGUiLCJpc0NvbnRleHRDb25zdW1lciIsImRlZmF1bHRTZWxlY3RvckZhY3RvcnkiLCJtYXBEaXNwYXRjaFRvUHJvcHNGYWN0b3J5IiwibWFwU3RhdGVUb1Byb3BzRmFjdG9yeSIsIm1lcmdlUHJvcHNGYWN0b3J5Iiwic2hhbGxvd0VxdWFsIiwid2FybmluZyIsIm5vdEluaXRpYWxpemVkIiwidXNlU3luY0V4dGVybmFsU3RvcmUiLCJpbml0aWFsaXplQ29ubmVjdCIsIkVNUFRZX0FSUkFZIiwiTk9fU1VCU0NSSVBUSU9OX0FSUkFZIiwic3RyaW5naWZ5Q29tcG9uZW50IiwiQ29tcCIsInVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3RXaXRoQXJncyIsImVmZmVjdEZ1bmMiLCJlZmZlY3RBcmdzIiwiY2FwdHVyZVdyYXBwZXJQcm9wcyIsImxhc3RXcmFwcGVyUHJvcHMiLCJsYXN0Q2hpbGRQcm9wcyIsInJlbmRlcklzU2NoZWR1bGVkIiwid3JhcHBlclByb3BzIiwiY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZSIsInN1YnNjcmliZVVwZGF0ZXMiLCJzaG91bGRIYW5kbGVTdGF0ZUNoYW5nZXMiLCJjaGlsZFByb3BzU2VsZWN0b3IiLCJpc01vdW50ZWQiLCJhZGRpdGlvbmFsU3Vic2NyaWJlTGlzdGVuZXIiLCJkaWRVbnN1YnNjcmliZSIsImxhc3RUaHJvd25FcnJvciIsImNoZWNrRm9yVXBkYXRlcyIsImxhdGVzdFN0b3JlU3RhdGUiLCJuZXdDaGlsZFByb3BzIiwidW5zdWJzY3JpYmVXcmFwcGVyIiwiaW5pdFN0YXRlVXBkYXRlcyIsInN0cmljdEVxdWFsIiwiaGFzV2FybmVkQWJvdXREZXByZWNhdGVkUHVyZU9wdGlvbiIsIm1hcFN0YXRlVG9Qcm9wcyIsIm1hcERpc3BhdGNoVG9Qcm9wcyIsIm1lcmdlUHJvcHMiLCJwdXJlIiwiX3JlZiRhcmVTdGF0ZXNFcXVhbCIsImFyZVN0YXRlc0VxdWFsIiwiX3JlZiRhcmVPd25Qcm9wc0VxdWFsIiwiYXJlT3duUHJvcHNFcXVhbCIsIl9yZWYkYXJlU3RhdGVQcm9wc0VxdSIsImFyZVN0YXRlUHJvcHNFcXVhbCIsIl9yZWYkYXJlTWVyZ2VkUHJvcHNFcSIsImFyZU1lcmdlZFByb3BzRXF1YWwiLCJfcmVmJGZvcndhcmRSZWYiLCJmb3J3YXJkUmVmIiwiX3JlZiRjb250ZXh0IiwiaW5pdE1hcFN0YXRlVG9Qcm9wcyIsImluaXRNYXBEaXNwYXRjaFRvUHJvcHMiLCJpbml0TWVyZ2VQcm9wcyIsIndyYXBXaXRoQ29ubmVjdCIsIldyYXBwZWRDb21wb25lbnQiLCJ3cmFwcGVkQ29tcG9uZW50TmFtZSIsInNlbGVjdG9yRmFjdG9yeU9wdGlvbnMiLCJDb25uZWN0RnVuY3Rpb24iLCJfUmVhY3QkdXNlTWVtbyIsInJlYWN0UmVkdXhGb3J3YXJkZWRSZWYiLCJfUmVhY3QkdXNlTWVtbzIiLCJwcm9wc0NvbnRleHQiLCJDb250ZXh0VG9Vc2UiLCJDb25zdW1lciIsImRpZFN0b3JlQ29tZUZyb21Qcm9wcyIsImRpZFN0b3JlQ29tZUZyb21Db250ZXh0IiwiX1JlYWN0JHVzZU1lbW8zIiwiX1JlYWN0JHVzZU1lbW80Iiwib3ZlcnJpZGRlbkNvbnRleHRWYWx1ZSIsImlzUHJvY2Vzc2luZ0Rpc3BhdGNoIiwibGF0ZXN0U3Vic2NyaXB0aW9uQ2FsbGJhY2tFcnJvciIsImFjdHVhbENoaWxkUHJvcHNTZWxlY3RvciIsInN1YnNjcmliZUZvclJlYWN0IiwicmVhY3RMaXN0ZW5lciIsImFjdHVhbENoaWxkUHJvcHMiLCJyZW5kZXJlZFdyYXBwZWRDb21wb25lbnQiLCJyZW5kZXJlZENoaWxkIiwiX0Nvbm5lY3QiLCJtZW1vIiwiQ29ubmVjdCIsIl9mb3J3YXJkZWQiLCJmb3J3YXJkQ29ubmVjdFJlZiIsImZvcndhcmRlZCIsImNyZWF0ZUludmFsaWRBcmdGYWN0b3J5IiwiYmluZEFjdGlvbkNyZWF0b3JzIiwid3JhcE1hcFRvUHJvcHNDb25zdGFudCIsIndyYXBNYXBUb1Byb3BzRnVuYyIsInZlcmlmeVBsYWluT2JqZWN0IiwiZGVmYXVsdE1lcmdlUHJvcHMiLCJzdGF0ZVByb3BzIiwiZGlzcGF0Y2hQcm9wcyIsIm93blByb3BzIiwid3JhcE1lcmdlUHJvcHNGdW5jIiwiaW5pdE1lcmdlUHJvcHNQcm94eSIsImhhc1J1bk9uY2UiLCJtZXJnZVByb3BzUHJveHkiLCJuZXh0TWVyZ2VkUHJvcHMiLCJ2ZXJpZnlTdWJzZWxlY3RvcnMiLCJwdXJlRmluYWxQcm9wc1NlbGVjdG9yRmFjdG9yeSIsImhhc1J1bkF0TGVhc3RPbmNlIiwiaGFuZGxlRmlyc3RDYWxsIiwiZmlyc3RTdGF0ZSIsImZpcnN0T3duUHJvcHMiLCJoYW5kbGVOZXdQcm9wc0FuZE5ld1N0YXRlIiwiZGVwZW5kc09uT3duUHJvcHMiLCJoYW5kbGVOZXdQcm9wcyIsImhhbmRsZU5ld1N0YXRlIiwibmV4dFN0YXRlUHJvcHMiLCJzdGF0ZVByb3BzQ2hhbmdlZCIsImhhbmRsZVN1YnNlcXVlbnRDYWxscyIsIm5leHRPd25Qcm9wcyIsInByb3BzQ2hhbmdlZCIsInN0YXRlQ2hhbmdlZCIsInB1cmVGaW5hbFByb3BzU2VsZWN0b3IiLCJmaW5hbFByb3BzU2VsZWN0b3JGYWN0b3J5IiwidmVyaWZ5IiwibWV0aG9kTmFtZSIsImdldENvbnN0YW50IiwiaW5pdENvbnN0YW50U2VsZWN0b3IiLCJjb25zdGFudCIsImNvbnN0YW50U2VsZWN0b3IiLCJnZXREZXBlbmRzT25Pd25Qcm9wcyIsIm1hcFRvUHJvcHMiLCJpbml0UHJveHlTZWxlY3RvciIsInByb3h5IiwibWFwVG9Qcm9wc1Byb3h5Iiwic3RhdGVPckRpc3BhdGNoIiwiZGV0ZWN0RmFjdG9yeUFuZFZlcmlmeSIsImNyZWF0ZURpc3BhdGNoSG9vayIsImNyZWF0ZVNlbGVjdG9ySG9vayIsImNyZWF0ZVN0b3JlSG9vayIsInVzZURlZmF1bHRTdG9yZSIsImNyZWF0ZVJlZHV4Q29udGV4dEhvb2siLCJ1c2VSZWR1eENvbnRleHQiLCJ1c2VEZWJ1Z1ZhbHVlIiwidXNlRGVmYXVsdFJlZHV4Q29udGV4dCIsInVzZVN5bmNFeHRlcm5hbFN0b3JlV2l0aFNlbGVjdG9yIiwiaW5pdGlhbGl6ZVVzZVNlbGVjdG9yIiwicmVmRXF1YWxpdHkiLCJlcXVhbGl0eUZuT3JPcHRpb25zIiwiZXF1YWxpdHlGbiIsIl9yZWYkZXF1YWxpdHlGbiIsIl91c2VSZWR1eENvbnRleHQiLCJnbG9iYWxTdGFiaWxpdHlDaGVjayIsImdsb2JhbE5vb3BDaGVjayIsImZpcnN0UnVuIiwid3JhcHBlZFNlbGVjdG9yIiwiZmluYWxTdGFiaWxpdHlDaGVjayIsInRvQ29tcGFyZSIsInNlbGVjdGVkMiIsImZpbmFsTm9vcENoZWNrIiwic2VsZWN0ZWRTdGF0ZSIsImFkZE5lc3RlZFN1YiIsInVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzIiwic2V0QmF0Y2giLCJnZXRCYXRjaCIsImNyZWF0ZUxpc3RlbmVyQ29sbGVjdGlvbiIsImZpcnN0IiwibGlzdGVuZXJzIiwiaXNTdWJzY3JpYmVkIiwidW5zdWJzY3JpYmUiLCJudWxsTGlzdGVuZXJzIiwicGFyZW50U3ViIiwic3Vic2NyaXB0aW9uc0Ftb3VudCIsInNlbGZTdWJzY3JpYmVkIiwiY2xlYW51cExpc3RlbmVyIiwiaGFuZGxlQ2hhbmdlV3JhcHBlciIsInRyeVN1YnNjcmliZVNlbGYiLCJ0cnlVbnN1YnNjcmliZVNlbGYiLCJnZXRMaXN0ZW5lcnMiLCJkZWZhdWx0Tm9vcEJhdGNoIiwibmV3QmF0Y2giLCJhY3Rpb25DcmVhdG9ycyIsImJvdW5kQWN0aW9uQ3JlYXRvcnMiLCJhY3Rpb25DcmVhdG9yIiwiaXNQbGFpbk9iamVjdCIsInByb3RvIiwiYmFzZVByb3RvIiwib2JqQSIsIm9iakIiLCJrZXlzQSIsImtleXNCIiwiY2FuVXNlRE9NIiwidXNlTGF5b3V0RWZmZWN0IiwiUkVBQ1RfRUxFTUVOVF9UWVBFIiwiUkVBQ1RfUE9SVEFMX1RZUEUiLCJSRUFDVF9GUkFHTUVOVF9UWVBFIiwiUkVBQ1RfU1RSSUNUX01PREVfVFlQRSIsIlJFQUNUX1BST0ZJTEVSX1RZUEUiLCJSRUFDVF9QUk9WSURFUl9UWVBFIiwiUkVBQ1RfQ09OVEVYVF9UWVBFIiwiUkVBQ1RfU0VSVkVSX0NPTlRFWFRfVFlQRSIsIlJFQUNUX0ZPUldBUkRfUkVGX1RZUEUiLCJSRUFDVF9TVVNQRU5TRV9UWVBFIiwiUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFIiwiUkVBQ1RfTUVNT19UWVBFIiwiUkVBQ1RfTEFaWV9UWVBFIiwiUkVBQ1RfT0ZGU0NSRUVOX1RZUEUiLCJlbmFibGVTY29wZUFQSSIsImVuYWJsZUNhY2hlRWxlbWVudCIsImVuYWJsZVRyYW5zaXRpb25UcmFjaW5nIiwiZW5hYmxlTGVnYWN5SGlkZGVuIiwiZW5hYmxlRGVidWdUcmFjaW5nIiwiUkVBQ1RfTU9EVUxFX1JFRkVSRU5DRSIsIiQkdHlwZW9mIiwiZ2V0TW9kdWxlSWQiLCJ0eXBlT2YiLCIkJHR5cGVvZlR5cGUiLCJDb250ZXh0Q29uc3VtZXIiLCJDb250ZXh0UHJvdmlkZXIiLCJFbGVtZW50IiwiRm9yd2FyZFJlZiIsIkxhenkiLCJNZW1vIiwiUG9ydGFsIiwiUHJvZmlsZXIiLCJTdHJpY3RNb2RlIiwiU3VzcGVuc2UiLCJTdXNwZW5zZUxpc3QiLCJoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0FzeW5jTW9kZSIsImhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQ29uY3VycmVudE1vZGUiLCJpc0FzeW5jTW9kZSIsImlzQ29uY3VycmVudE1vZGUiLCJpc0NvbnRleHRQcm92aWRlciIsImlzRWxlbWVudCIsImlzRm9yd2FyZFJlZiIsImlzRnJhZ21lbnQiLCJpc0xhenkiLCJpc01lbW8iLCJpc1BvcnRhbCIsImlzUHJvZmlsZXIiLCJpc1N0cmljdE1vZGUiLCJpc1N1c3BlbnNlIiwiaXNTdXNwZW5zZUxpc3QiLCJjb29raWVOYW1lUmVnRXhwIiwiY29va2llVmFsdWVSZWdFeHAiLCJkb21haW5WYWx1ZVJlZ0V4cCIsInBhdGhWYWx1ZVJlZ0V4cCIsIm1heEFnZVJlZ0V4cCIsImNvb2tpZU9jdGV0UmVnRXhwIiwiTnVsbE9iamVjdCIsInN0ciIsImxlbiIsImVxSWR4IiwiZXFJbmRleCIsImVuZElkeCIsImVuZEluZGV4IiwidmFsdWVTbGljZSIsInN0cmluZ2lmeUNvb2tpZSIsImVuYyIsImVuY29kZSIsImRlZmF1bHRFbmNvZGUiLCJzdHJpbmdpZnlTZXRDb29raWUiLCJtYXhBZ2UiLCJpc0ludGVnZXIiLCJkb21haW4iLCJleHBpcmVzIiwiaXNGaW5pdGUiLCJ2YWx1ZU9mIiwidG9VVENTdHJpbmciLCJodHRwT25seSIsInNlY3VyZSIsInBhcnRpdGlvbmVkIiwic2FtZVNpdGUiLCJwYXJzZVNldENvb2tpZSIsInNldENvb2tpZSIsImF0dHIiLCJkYXRlIiwiY2hhckNvZGVBdCIsImRlY29kZVVSSUNvbXBvbmVudCIsIl9jdXJyeTIiLCJfZGlzcGF0Y2hhYmxlIiwiX3hhbGwiLCJsaXN0IiwiX2N1cnJ5MSIsImFsd2F5cyIsIl94YW55IiwiX2NvbmNhdCIsIl9yZWR1Y2UiLCJhcHBseUYiLCJhcHBseVgiLCJfY3VycnkzIiwiX2hhcyIsIl9pc0ludGVnZXIiLCJfYXNzb2MiLCJuZXh0T2JqIiwiX2FyaXR5IiwidGhpc09iaiIsIl9jbG9uZSIsInByZWQiLCJfaXNBcnJheSIsIl9pc0Z1bmN0aW9uIiwiX2lzU3RyaW5nIiwiX21hcCIsImN1cnJ5TiIsImNvbnZlcmdlIiwiYWZ0ZXIiLCJmbnMiLCJfY3VycnlOIiwiZGVmYXVsdFRvIiwiX1NldCIsInNlY29uZCIsImZpcnN0TGVuIiwic2Vjb25kTGVuIiwidG9GaWx0ZXJPdXQiLCJfZGlzc29jIiwiX3NoYWxsb3dDbG9uZU9iamVjdCIsIl9pc0FyZ3VtZW50cyIsIl9pc09iamVjdCIsIl9pc1R5cGVkQXJyYXkiLCJfZXF1YWxzIiwidHJhbnNmb3JtYXRpb25zIiwidHJhbnNmb3JtYXRpb24iLCJfYXJyYXlSZWR1Y2UiLCJfZmlsdGVyIiwiX3hmaWx0ZXIiLCJmaWx0ZXJhYmxlIiwiX3hmaW5kIiwiX3hmaW5kSW5kZXgiLCJfbWFrZUZsYXQiLCJfY2hlY2tGb3JNZXRob2QiLCJrZXlMaXN0IiwicmVkdWNlQnkiLCJoYXNQYXRoIiwiX3BhdGgiLCJfaWRlbnRpdHkiLCJfaW5jbHVkZXMiLCJfaW5kZXhPZiIsInhzIiwiZWx0IiwiX25hdGl2ZVNldCIsIl9pdGVtcyIsImhhc09yQWRkIiwic2hvdWxkQWRkIiwicHJldlNpemUiLCJuZXdTaXplIiwiSW5maW5pdHkiLCJiSWR4IiwiYTAiLCJhMSIsImEyIiwiYTMiLCJhNCIsImE1IiwiYTYiLCJhNyIsImE4IiwiYTkiLCJfYXJyYXlGcm9tSXRlcmF0b3IiLCJpdGVyIiwibWV0aG9kbmFtZSIsIl9jbG9uZVJlZ0V4cCIsImRlZXAiLCJfT2JqZWN0TWFwIiwiX2lzUHJpbWl0aXZlIiwiY29weSIsImNvcGllZFZhbHVlIiwiY2FjaGVkQ29weSIsInBhcmFtIiwiaGFzaGVkS2V5IiwiYnVja2V0IiwiUmVnRXhwIiwiZmxhZ3MiLCJpZ25vcmVDYXNlIiwibXVsdGlsaW5lIiwic3RpY2t5IiwidW5pY29kZSIsImRvdEFsbCIsIl9jb21wbGVtZW50Iiwic2V0MSIsInNldDIiLCJsZW4xIiwibGVuMiIsIl9pc0FycmF5TGlrZSIsInN5bUl0ZXJhdG9yIiwiX2NyZWF0ZVJlZHVjZSIsImFycmF5UmVkdWNlIiwibWV0aG9kUmVkdWNlIiwiaXRlcmFibGVSZWR1Y2UiLCJ4ZiIsIl9pc1BsYWNlaG9sZGVyIiwiZjEiLCJmMiIsIl9iIiwiX2EiLCJmMyIsIl9jIiwiY29tYmluZWQiLCJhcmdzSWR4IiwiY29tYmluZWRJZHgiLCJoYXNQbGFjZWhvbGRlciIsIl9pc1RyYW5zZm9ybWVyIiwibWV0aG9kTmFtZXMiLCJ0cmFuc2R1Y2VyQ3JlYXRvciIsInRyYW5zZHVjZXIiLCJfaW5jbHVkZXNXaXRoIiwiX2Z1bmN0aW9uTmFtZSIsIl9vYmplY3RJcyIsIl91bmlxQ29udGVudEVxdWFscyIsImFJdGVyYXRvciIsImJJdGVyYXRvciIsInN0YWNrQSIsInN0YWNrQiIsImVxIiwiYUl0ZW0iLCJ0eXBlQSIsImV4dGVuZGVkU3RhY2tBIiwiZXh0ZW5kZWRTdGFja0IiLCJpbmYiLCJpc0FycmF5TGlrZSIsInJlY3Vyc2l2ZSIsImZsYXR0IiwiamxlbiIsImlsZW4iLCJmdW5jdG9yIiwiX250aCIsIm9mZnNldCIsIl9vYmplY3RBc3NpZ24iLCJuZXh0S2V5IiwicGF0aEFyIiwiX3F1b3RlIiwiZXNjYXBlZCIsIl9pdGVyYWJsZVJlZHVjZSIsIl9tZXRob2RSZWR1Y2UiLCJfcmVkdWNlZCIsInBhZCIsIl90b0lTT1N0cmluZyIsInRvSVNPU3RyaW5nIiwiZ2V0VVRDRnVsbFllYXIiLCJnZXRVVENNb250aCIsImdldFVUQ0RhdGUiLCJnZXRVVENIb3VycyIsImdldFVUQ01pbnV0ZXMiLCJnZXRVVENTZWNvbmRzIiwiZ2V0VVRDTWlsbGlzZWNvbmRzIiwiX3RvU3RyaW5nIiwic2VlbiIsInJlY3VyIiwibWFwUGFpcnMiLCJOYU4iLCJyZXByIiwiX3hBcnJheVJlZHVjZSIsIl94SXRlcmFibGVSZWR1Y2UiLCJfeE1ldGhvZFJlZHVjZSIsIl94UmVkdWNlIiwiX3hmQmFzZSIsIlhBbGwiLCJYQW55IiwiWEZpbHRlciIsIlhGaW5kIiwiWEZpbmRJbmRleCIsIlhNYXAiLCJfeG1hcCIsIlhSZWR1Y2VCeSIsInZhbHVlRm4iLCJ2YWx1ZUFjYyIsImtleUZuIiwiX3hyZWR1Y2VCeSIsIlhUYWtlIiwicmV0IiwiX3h0YWtlIiwiWFVuaXFCeSIsIl94dW5pcUJ5IiwiWFdyYXAiLCJfeHdyYXAiLCJ1bmlxIiwibGlzdDEiLCJsaXN0MiIsInRvS2VlcCIsImludm9rZXIiLCJhcml0eSIsIkN0b3IiLCJqdXh0IiwiaGFzRW51bUJ1ZyIsInByb3BlcnR5SXNFbnVtZXJhYmxlIiwibm9uRW51bWVyYWJsZVByb3BzIiwiaGFzQXJnc0VudW1CdWciLCJjb250YWlucyIsIm5JZHgiLCJrcyIsImNoZWNrQXJnc0xlbmd0aCIsImxlbnMiLCJzZXR0ZXIiLCJ0b0Z1bmN0b3JGbiIsImZvY3VzIiwic2FmZU1heCIsIm1heEJ5VmFsdWUiLCJtYXhCeVR5cGUiLCJzdHJpbmdBIiwibWF4QnlTdHJpbmdWYWx1ZSIsImtleUdlbiIsImNhY2hlIiwibWVyZ2VEZWVwV2l0aEtleSIsImxPYmoiLCJyT2JqIiwibFZhbCIsInJWYWwiLCJtZXJnZVdpdGhLZXkiLCJfbCIsIl9yIiwibmFtZXMiLCJjYWxsZWQiLCJJZGVudGl0eSIsIm92ZXIiLCJwcyIsImZyb21JbmRleCIsInRvSW5kZXgiLCJ0YWtlIiwicGFpcnMiLCJ1bmlxQnkiLCJhcHBsaWVkSXRlbSIsIkNvbnN0IiwiZmFudGFzeUxhbmRfbWFwIiwicnYiXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/dash/dash-renderer/build/dash_renderer.min.js b/dash/dash-renderer/build/dash_renderer.min.js index 5839aadae7..c239a9a8f1 100644 --- a/dash/dash-renderer/build/dash_renderer.min.js +++ b/dash/dash-renderer/build/dash_renderer.min.js @@ -1,2 +1,2 @@ /*! For license information please see dash_renderer.min.js.LICENSE.txt */ -!function(){var t={296:function(t,e,r){var n;window,t.exports=(n=r(609),function(t){var e={};function r(n){if(e[n])return e[n].exports;var o=e[n]={i:n,l:!1,exports:{}};return t[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}return r.m=t,r.c=e,r.d=function(t,e,n){r.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:n})},r.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.t=function(t,e){if(1&e&&(t=r(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)r.d(n,o,function(e){return t[e]}.bind(null,o));return n},r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,"a",e),e},r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.p="",r(r.s=1)}([function(t,e){t.exports=n},function(t,e,r){"use strict";r.r(e),r.d(e,"asyncDecorator",function(){return a}),r.d(e,"inheritAsyncDecorator",function(){return u}),r.d(e,"isReady",function(){return c}),r.d(e,"History",function(){return f});var n=r(0);function o(t,e,r,n,o,i,a){try{var u=t[i](a),c=u.value}catch(t){return void r(t)}u.done?e(c):Promise.resolve(c).then(n,o)}function i(t){return function(){var e=this,r=arguments;return new Promise(function(n,i){var a=t.apply(e,r);function u(t){o(a,n,i,u,c,"next",t)}function c(t){o(a,n,i,u,c,"throw",t)}u(void 0)})}}var a=function(t,e){var r,o={isReady:new Promise(function(t){r=t}),get:Object(n.lazy)(function(){return Promise.resolve(e()).then(function(t){return setTimeout(i(regeneratorRuntime.mark(function t(){return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,r(!0);case 2:o.isReady=!0;case 3:case"end":return t.stop()}},t)})),0),t})})};return Object.defineProperty(t,"_dashprivate_isLazyComponentReady",{get:function(){return o.isReady}}),o.get},u=function(t,e){Object.defineProperty(t,"_dashprivate_isLazyComponentReady",{get:function(){return c(e)}})},c=function(t){return t&&t._dashprivate_isLazyComponentReady};function s(t,e){for(var r=0;r=19&&Symbol.for("react.element")!==Symbol.for("react.transitional.element")){var r=Symbol.for("react.transitional.element"),n=Symbol.for;Symbol.for=function(t){return"react.element"===t?r:n.apply(Symbol,arguments)}}window.ReactJSXRuntime||(window.ReactJSXRuntime={jsx:o,jsxs:o,jsxDEV:o,Fragment:t.Fragment})}function o(e,r,n){var o={},i=null;if(null!=r)for(var a in void 0!==r.key&&(o.key=""+r.key),r)Object.prototype.hasOwnProperty.call(r,a)&&"key"!==a&&"__self"!==a&&"__source"!==a&&("children"===a?i=r[a]:o[a]=r[a]);return void 0!==n&&(o.key=""+n),null!=i?Array.isArray(i)?t.createElement.apply(t,[e,o].concat(i)):t.createElement(e,o,i):t.createElement(e,o)}}()},217:function(t,e,r){"use strict";var n=r(601),o=r.n(n),i=r(314),a=r.n(i)()(o());a.push([t.id,"._dash-undo-redo {\n position: fixed;\n bottom: 30px;\n left: 30px;\n font-size: 20px;\n text-align: center;\n z-index: 9999;\n background-color: rgba(255, 255, 255, 0.9);\n}\n._dash-undo-redo > div {\n position: relative;\n}\n._dash-undo-redo-link {\n color: #0074d9;\n cursor: pointer;\n margin-left: 10px;\n margin-right: 10px;\n display: inline-block;\n opacity: 0.2;\n}\n._dash-undo-redo-link:hover {\n opacity: 1;\n}\n._dash-undo-redo-link ._dash-icon-undo {\n font-size: 20px;\n transform: rotate(270deg);\n}\n._dash-undo-redo-link ._dash-icon-redo {\n font-size: 20px;\n transform: rotate(90deg);\n}\n._dash-undo-redo-link ._dash-undo-redo-label {\n font-size: 15px;\n}\n",""]),e.A=a},314:function(t){"use strict";t.exports=function(t){var e=[];return e.toString=function(){return this.map(function(e){var r="",n=void 0!==e[5];return e[4]&&(r+="@supports (".concat(e[4],") {")),e[2]&&(r+="@media ".concat(e[2]," {")),n&&(r+="@layer".concat(e[5].length>0?" ".concat(e[5]):""," {")),r+=t(e),n&&(r+="}"),e[2]&&(r+="}"),e[4]&&(r+="}"),r}).join("")},e.i=function(t,r,n,o,i){"string"==typeof t&&(t=[[null,t,void 0]]);var a={};if(n)for(var u=0;u0?" ".concat(l[5]):""," {").concat(l[1],"}")),l[5]=i),r&&(l[2]?(l[1]="@media ".concat(l[2]," {").concat(l[1],"}"),l[2]=r):l[2]=r),o&&(l[4]?(l[1]="@supports (".concat(l[4],") {").concat(l[1],"}"),l[4]=o):l[4]="".concat(o)),e.push(l))}},e}},601:function(t){"use strict";t.exports=function(t){return t[1]}},131:function(t,e){function r(t,e,r,n){var i={};return function(a){if(!i[a]){var u={},c=[],s=[];for(s.push({node:a,processed:!1});s.length>0;){var l=s[s.length-1],f=l.processed,p=l.node;if(f)s.pop(),c.pop(),u[p]=!1,i[p]=!0,e&&0!==t[p].length||r.push(p);else{if(i[p]){s.pop();continue}if(u[p]){if(n){s.pop();continue}throw c.push(p),new o(c)}u[p]=!0,c.push(p);for(var d=t[p],y=d.length-1;y>=0;y--)s.push({node:d[y],processed:!1});l.processed=!0}}}}}var n=e.DepGraph=function(t){this.nodes={},this.outgoingEdges={},this.incomingEdges={},this.circular=t&&!!t.circular};n.prototype={size:function(){return Object.keys(this.nodes).length},addNode:function(t,e){this.hasNode(t)||(this.nodes[t]=2===arguments.length?e:t,this.outgoingEdges[t]=[],this.incomingEdges[t]=[])},removeNode:function(t){this.hasNode(t)&&(delete this.nodes[t],delete this.outgoingEdges[t],delete this.incomingEdges[t],[this.incomingEdges,this.outgoingEdges].forEach(function(e){Object.keys(e).forEach(function(r){var n=e[r].indexOf(t);n>=0&&e[r].splice(n,1)},this)}))},hasNode:function(t){return this.nodes.hasOwnProperty(t)},getNodeData:function(t){if(this.hasNode(t))return this.nodes[t];throw new Error("Node does not exist: "+t)},setNodeData:function(t,e){if(!this.hasNode(t))throw new Error("Node does not exist: "+t);this.nodes[t]=e},addDependency:function(t,e){if(!this.hasNode(t))throw new Error("Node does not exist: "+t);if(!this.hasNode(e))throw new Error("Node does not exist: "+e);return-1===this.outgoingEdges[t].indexOf(e)&&this.outgoingEdges[t].push(e),-1===this.incomingEdges[e].indexOf(t)&&this.incomingEdges[e].push(t),!0},removeDependency:function(t,e){var r;this.hasNode(t)&&(r=this.outgoingEdges[t].indexOf(e))>=0&&this.outgoingEdges[t].splice(r,1),this.hasNode(e)&&(r=this.incomingEdges[e].indexOf(t))>=0&&this.incomingEdges[e].splice(r,1)},clone:function(){var t=this,e=new n;return Object.keys(t.nodes).forEach(function(r){e.nodes[r]=t.nodes[r],e.outgoingEdges[r]=t.outgoingEdges[r].slice(0),e.incomingEdges[r]=t.incomingEdges[r].slice(0)}),e},directDependenciesOf:function(t){if(this.hasNode(t))return this.outgoingEdges[t].slice(0);throw new Error("Node does not exist: "+t)},directDependantsOf:function(t){if(this.hasNode(t))return this.incomingEdges[t].slice(0);throw new Error("Node does not exist: "+t)},dependenciesOf:function(t,e){if(this.hasNode(t)){var n=[];r(this.outgoingEdges,e,n,this.circular)(t);var o=n.indexOf(t);return o>=0&&n.splice(o,1),n}throw new Error("Node does not exist: "+t)},dependantsOf:function(t,e){if(this.hasNode(t)){var n=[];r(this.incomingEdges,e,n,this.circular)(t);var o=n.indexOf(t);return o>=0&&n.splice(o,1),n}throw new Error("Node does not exist: "+t)},overallOrder:function(t){var e=this,n=[],o=Object.keys(this.nodes);if(0===o.length)return n;if(!this.circular){var i=r(this.outgoingEdges,!1,[],this.circular);o.forEach(function(t){i(t)})}var a=r(this.outgoingEdges,t,n,this.circular);return o.filter(function(t){return 0===e.incomingEdges[t].length}).forEach(function(t){a(t)}),this.circular&&o.filter(function(t){return-1===n.indexOf(t)}).forEach(function(t){a(t)}),n},entryNodes:function(){var t=this;return Object.keys(this.nodes).filter(function(e){return 0===t.incomingEdges[e].length})}},n.prototype.directDependentsOf=n.prototype.directDependantsOf,n.prototype.dependentsOf=n.prototype.dependantsOf;var o=e.DepGraphCycleError=function(t){var e="Dependency Cycle Found: "+t.join(" -> "),r=new Error(e);return r.cyclePath=t,Object.setPrototypeOf(r,Object.getPrototypeOf(this)),Error.captureStackTrace&&Error.captureStackTrace(r,o),r};o.prototype=Object.create(Error.prototype,{constructor:{value:Error,enumerable:!1,writable:!0,configurable:!0}}),Object.setPrototypeOf(o,Error)},886: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}},799:function(t,e){"use strict";var r="function"==typeof Symbol&&Symbol.for,n=r?Symbol.for("react.element"):60103,o=r?Symbol.for("react.portal"):60106,i=r?Symbol.for("react.fragment"):60107,a=r?Symbol.for("react.strict_mode"):60108,u=r?Symbol.for("react.profiler"):60114,c=r?Symbol.for("react.provider"):60109,s=r?Symbol.for("react.context"):60110,l=r?Symbol.for("react.async_mode"):60111,f=r?Symbol.for("react.concurrent_mode"):60111,p=r?Symbol.for("react.forward_ref"):60112,d=r?Symbol.for("react.suspense"):60113,y=r?Symbol.for("react.suspense_list"):60120,h=r?Symbol.for("react.memo"):60115,v=r?Symbol.for("react.lazy"):60116,b=r?Symbol.for("react.block"):60121,m=r?Symbol.for("react.fundamental"):60117,g=r?Symbol.for("react.responder"):60118,w=r?Symbol.for("react.scope"):60119;function O(t){if("object"==typeof t&&null!==t){var e=t.$$typeof;switch(e){case n:switch(t=t.type){case l:case f:case i:case u:case a:case d:return t;default:switch(t=t&&t.$$typeof){case s:case p:case v:case h:case c:return t;default:return e}}case o:return e}}}function S(t){return O(t)===f}e.AsyncMode=l,e.ConcurrentMode=f,e.ContextConsumer=s,e.ContextProvider=c,e.Element=n,e.ForwardRef=p,e.Fragment=i,e.Lazy=v,e.Memo=h,e.Portal=o,e.Profiler=u,e.StrictMode=a,e.Suspense=d,e.isAsyncMode=function(t){return S(t)||O(t)===l},e.isConcurrentMode=S,e.isContextConsumer=function(t){return O(t)===s},e.isContextProvider=function(t){return O(t)===c},e.isElement=function(t){return"object"==typeof t&&null!==t&&t.$$typeof===n},e.isForwardRef=function(t){return O(t)===p},e.isFragment=function(t){return O(t)===i},e.isLazy=function(t){return O(t)===v},e.isMemo=function(t){return O(t)===h},e.isPortal=function(t){return O(t)===o},e.isProfiler=function(t){return O(t)===u},e.isStrictMode=function(t){return O(t)===a},e.isSuspense=function(t){return O(t)===d},e.isValidElementType=function(t){return"string"==typeof t||"function"==typeof t||t===i||t===f||t===u||t===a||t===d||t===y||"object"==typeof t&&null!==t&&(t.$$typeof===v||t.$$typeof===h||t.$$typeof===c||t.$$typeof===s||t.$$typeof===p||t.$$typeof===m||t.$$typeof===g||t.$$typeof===w||t.$$typeof===b)},e.typeOf=O},363:function(t,e,r){"use strict";t.exports=r(799)},609:function(t){"use strict";t.exports=window.React}},e={};function r(n){var o=e[n];if(void 0!==o)return o.exports;var i=e[n]={id:n,exports:{}};return t[n](i,i.exports,r),i.exports}r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,{a:e}),e},r.cw=function(t){var e;return function(){if(t){var r=t;t=0,e={exports:{}},r.call(e.exports,e,e.exports)}return e.exports}},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.nc=void 0,function(){"use strict";var t="undefined"!=typeof globalThis&&globalThis||"undefined"!=typeof self&&self||void 0!==r.g&&r.g||{},e="URLSearchParams"in t,n="Symbol"in t&&"iterator"in Symbol,o="FileReader"in t&&"Blob"in t&&function(){try{return new Blob,!0}catch(t){return!1}}(),i="FormData"in t,a="ArrayBuffer"in t;if(a)var u=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]"],c=ArrayBuffer.isView||function(t){return t&&u.indexOf(Object.prototype.toString.call(t))>-1};function s(t){if("string"!=typeof t&&(t=String(t)),/[^a-z0-9\-#$%&'*+.^_`|~!]/i.test(t)||""===t)throw new TypeError('Invalid character in header field name: "'+t+'"');return t.toLowerCase()}function l(t){return"string"!=typeof t&&(t=String(t)),t}function f(t){var e={next:function(){var e=t.shift();return{done:void 0===e,value:e}}};return n&&(e[Symbol.iterator]=function(){return e}),e}function p(t){this.map={},t instanceof p?t.forEach(function(t,e){this.append(e,t)},this):Array.isArray(t)?t.forEach(function(t){if(2!=t.length)throw new TypeError("Headers constructor: expected name/value pair to be length 2, found"+t.length);this.append(t[0],t[1])},this):t&&Object.getOwnPropertyNames(t).forEach(function(e){this.append(e,t[e])},this)}function d(t){if(!t._noBody)return t.bodyUsed?Promise.reject(new TypeError("Already read")):void(t.bodyUsed=!0)}function y(t){return new Promise(function(e,r){t.onload=function(){e(t.result)},t.onerror=function(){r(t.error)}})}function h(t){var e=new FileReader,r=y(e);return e.readAsArrayBuffer(t),r}function v(t){if(t.slice)return t.slice(0);var e=new Uint8Array(t.byteLength);return e.set(new Uint8Array(t)),e.buffer}function b(){return this.bodyUsed=!1,this._initBody=function(t){var r;this.bodyUsed=this.bodyUsed,this._bodyInit=t,t?"string"==typeof t?this._bodyText=t:o&&Blob.prototype.isPrototypeOf(t)?this._bodyBlob=t:i&&FormData.prototype.isPrototypeOf(t)?this._bodyFormData=t:e&&URLSearchParams.prototype.isPrototypeOf(t)?this._bodyText=t.toString():a&&o&&(r=t)&&DataView.prototype.isPrototypeOf(r)?(this._bodyArrayBuffer=v(t.buffer),this._bodyInit=new Blob([this._bodyArrayBuffer])):a&&(ArrayBuffer.prototype.isPrototypeOf(t)||c(t))?this._bodyArrayBuffer=v(t):this._bodyText=t=Object.prototype.toString.call(t):(this._noBody=!0,this._bodyText=""),this.headers.get("content-type")||("string"==typeof t?this.headers.set("content-type","text/plain;charset=UTF-8"):this._bodyBlob&&this._bodyBlob.type?this.headers.set("content-type",this._bodyBlob.type):e&&URLSearchParams.prototype.isPrototypeOf(t)&&this.headers.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"))},o&&(this.blob=function(){var t=d(this);if(t)return t;if(this._bodyBlob)return Promise.resolve(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(new Blob([this._bodyArrayBuffer]));if(this._bodyFormData)throw new Error("could not read FormData body as blob");return Promise.resolve(new Blob([this._bodyText]))}),this.arrayBuffer=function(){if(this._bodyArrayBuffer)return d(this)||(ArrayBuffer.isView(this._bodyArrayBuffer)?Promise.resolve(this._bodyArrayBuffer.buffer.slice(this._bodyArrayBuffer.byteOffset,this._bodyArrayBuffer.byteOffset+this._bodyArrayBuffer.byteLength)):Promise.resolve(this._bodyArrayBuffer));if(o)return this.blob().then(h);throw new Error("could not read as ArrayBuffer")},this.text=function(){var t,e,r,n,o,i=d(this);if(i)return i;if(this._bodyBlob)return t=this._bodyBlob,r=y(e=new FileReader),o=(n=/charset=([A-Za-z0-9_-]+)/.exec(t.type))?n[1]:"utf-8",e.readAsText(t,o),r;if(this._bodyArrayBuffer)return Promise.resolve(function(t){for(var e=new Uint8Array(t),r=new Array(e.length),n=0;n-1?o:n),this.mode=r.mode||this.mode||null,this.signal=r.signal||this.signal||function(){if("AbortController"in t)return(new AbortController).signal}(),this.referrer=null,("GET"===this.method||"HEAD"===this.method)&&i)throw new TypeError("Body not allowed for GET or HEAD requests");if(this._initBody(i),!("GET"!==this.method&&"HEAD"!==this.method||"no-store"!==r.cache&&"no-cache"!==r.cache)){var a=/([?&])_=[^&]*/;a.test(this.url)?this.url=this.url.replace(a,"$1_="+(new Date).getTime()):this.url+=(/\?/.test(this.url)?"&":"?")+"_="+(new Date).getTime()}}function w(t){var e=new FormData;return t.trim().split("&").forEach(function(t){if(t){var r=t.split("="),n=r.shift().replace(/\+/g," "),o=r.join("=").replace(/\+/g," ");e.append(decodeURIComponent(n),decodeURIComponent(o))}}),e}function O(t,e){if(!(this instanceof O))throw new TypeError('Please use the "new" operator, this DOM object constructor cannot be called as a function.');if(e||(e={}),this.type="default",this.status=void 0===e.status?200:e.status,this.status<200||this.status>599)throw new RangeError("Failed to construct 'Response': The status provided (0) is outside the range [200, 599].");this.ok=this.status>=200&&this.status<300,this.statusText=void 0===e.statusText?"":""+e.statusText,this.headers=new p(e.headers),this.url=e.url||"",this._initBody(t)}g.prototype.clone=function(){return new g(this,{body:this._bodyInit})},b.call(g.prototype),b.call(O.prototype),O.prototype.clone=function(){return new O(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new p(this.headers),url:this.url})},O.error=function(){var t=new O(null,{status:200,statusText:""});return t.ok=!1,t.status=0,t.type="error",t};var S=[301,302,303,307,308];O.redirect=function(t,e){if(-1===S.indexOf(e))throw new RangeError("Invalid status code");return new O(null,{status:e,headers:{location:t}})};var j=t.DOMException;try{new j}catch(t){(j=function(t,e){this.message=t,this.name=e;var r=Error(t);this.stack=r.stack}).prototype=Object.create(Error.prototype),j.prototype.constructor=j}function _(e,r){return new Promise(function(n,i){var u=new g(e,r);if(u.signal&&u.signal.aborted)return i(new j("Aborted","AbortError"));var c=new XMLHttpRequest;function f(){c.abort()}if(c.onload=function(){var t,e,r={statusText:c.statusText,headers:(t=c.getAllResponseHeaders()||"",e=new p,t.replace(/\r?\n[\t ]+/g," ").split("\r").map(function(t){return 0===t.indexOf("\n")?t.substr(1,t.length):t}).forEach(function(t){var r=t.split(":"),n=r.shift().trim();if(n){var o=r.join(":").trim();try{e.append(n,o)}catch(t){console.warn("Response "+t.message)}}}),e)};0===u.url.indexOf("file://")&&(c.status<200||c.status>599)?r.status=200:r.status=c.status,r.url="responseURL"in c?c.responseURL:r.headers.get("X-Request-URL");var o="response"in c?c.response:c.responseText;setTimeout(function(){n(new O(o,r))},0)},c.onerror=function(){setTimeout(function(){i(new TypeError("Network request failed"))},0)},c.ontimeout=function(){setTimeout(function(){i(new TypeError("Network request timed out"))},0)},c.onabort=function(){setTimeout(function(){i(new j("Aborted","AbortError"))},0)},c.open(u.method,function(e){try{return""===e&&t.location.href?t.location.href:e}catch(t){return e}}(u.url),!0),"include"===u.credentials?c.withCredentials=!0:"omit"===u.credentials&&(c.withCredentials=!1),"responseType"in c&&(o?c.responseType="blob":a&&(c.responseType="arraybuffer")),r&&"object"==typeof r.headers&&!(r.headers instanceof p||t.Headers&&r.headers instanceof t.Headers)){var d=[];Object.getOwnPropertyNames(r.headers).forEach(function(t){d.push(s(t)),c.setRequestHeader(t,l(r.headers[t]))}),u.headers.forEach(function(t,e){-1===d.indexOf(e)&&c.setRequestHeader(e,t)})}else u.headers.forEach(function(t,e){c.setRequestHeader(e,t)});u.signal&&(u.signal.addEventListener("abort",f),c.onreadystatechange=function(){4===c.readyState&&u.signal.removeEventListener("abort",f)}),c.send(void 0===u._bodyInit?null:u._bodyInit)})}_.polyfill=!0,t.fetch||(t.fetch=_,t.Headers=p,t.Request=g,t.Response=O)}(),function(){"use strict";var t=r.cw(function(t,e){function r(t){return r="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},r(t)}var n=Symbol.for("react.element"),o=Symbol.for("react.portal"),i=Symbol.for("react.fragment"),a=Symbol.for("react.strict_mode"),u=Symbol.for("react.profiler"),c=Symbol.for("react.provider"),s=Symbol.for("react.context"),l=Symbol.for("react.server_context"),f=Symbol.for("react.forward_ref"),p=Symbol.for("react.suspense"),d=Symbol.for("react.suspense_list"),y=Symbol.for("react.memo"),h=Symbol.for("react.lazy");Symbol.for("react.offscreen");Symbol.for("react.module.reference"),e.isContextConsumer=function(t){return function(t){if("object"===r(t)&&null!==t){var e=t.$$typeof;switch(e){case n:switch(t=t.type){case i:case u:case a:case p:case d:return t;default:switch(t=t&&t.$$typeof){case l:case s:case f:case h:case y:case c:return t;default:return e}}case o:return e}}}(t)===s}}),e=r.cw(function(e,r){e.exports=t()}),n=r.cw(function(t,e){var r=a();t.exports=function(t){var e=typeof t;if("string"===e){var n=t;if(0===(t=+t)&&r(n))return!1}else if("number"!==e)return!1;return t-t<1}}),o=r.cw(function(t,e){var r=c(),n={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},o={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},a={};function u(t){return r.isMemo(t)?i:a[t.$$typeof]||n}a[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},a[r.Memo]=i;var s=Object.defineProperty,l=Object.getOwnPropertyNames,f=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,d=Object.getPrototypeOf,y=Object.prototype;t.exports=function t(e,r,n){if("string"!=typeof r){if(y){var i=d(r);i&&i!==y&&t(e,i,n)}var a=l(r);f&&(a=a.concat(f(r)));for(var c=u(e),h=u(r),v=0;v0?" ".concat(r.layer):""," {")),n+=r.css,o&&(n+="}"),r.media&&(n+="}"),r.supports&&(n+="}");var i=r.sourceMap;i&&"undefined"!=typeof btoa&&(n+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(i))))," */")),e.styleTagTransform(n,t,e.options)}(e,t,r)},remove:function(){!function(t){if(null===t.parentNode)return!1;t.parentNode.removeChild(t)}(e)}}}}),y=r.cw(function(t,e){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))}}}),h=r.cw(function(t,e){var r=g(),n="function"==typeof Object.is?Object.is:function(t,e){return t===e&&(0!==t||1/t==1/e)||t!=t&&e!=e},o=r.useState,i=r.useEffect,a=r.useLayoutEffect,u=r.useDebugValue;function c(t){var e=t.getSnapshot;t=t.value;try{var r=e();return!n(t,r)}catch(t){return!0}}var s="undefined"==typeof window||void 0===window.document||void 0===window.document.createElement?function(t,e){return e()}:function(t,e){var r=e(),n=o({inst:{value:r,getSnapshot:e}}),s=n[0].inst,l=n[1];return a(function(){s.value=r,s.getSnapshot=e,c(s)&&l({inst:s})},[t,r,e]),i(function(){return c(s)&&l({inst:s}),t(function(){c(s)&&l({inst:s})})},[t]),u(r),r};e.useSyncExternalStore=void 0!==r.useSyncExternalStore?r.useSyncExternalStore:s}),v=r.cw(function(t,e){var r=g(),n=b(),o="function"==typeof Object.is?Object.is:function(t,e){return t===e&&(0!==t||1/t==1/e)||t!=t&&e!=e},i=n.useSyncExternalStore,a=r.useRef,u=r.useEffect,c=r.useMemo,s=r.useDebugValue;e.useSyncExternalStoreWithSelector=function(t,e,r,n,l){var f=a(null);if(null===f.current){var p={hasValue:!1,value:null};f.current=p}else p=f.current;f=c(function(){function t(t){if(!u){if(u=!0,i=t,t=n(t),void 0!==l&&p.hasValue){var e=p.value;if(l(e,t))return a=e}return a=t}if(e=a,o(i,t))return e;var r=n(t);return void 0!==l&&l(e,r)?(i=t,e):(i=t,a=r)}var i,a,u=!1,c=void 0===r?null:r;return[function(){return t(e())},null===c?void 0:function(){return t(c())}]},[e,r,n,l]);var d=i(t,f[0],f[1]);return u(function(){p.hasValue=!0,p.value=d},[d]),s(d),d}}),b=r.cw(function(t,e){t.exports=h()}),m=r.cw(function(t,e){t.exports=v()}),g=function(){return r(609)};function w(){return w.c||(w.c=r.n(g()))}r(186),g();var O=window.ReactDOM,S=r.n(O),j=window.PropTypes,_=r.n(j);b(),m();var E=function(t){t()},P=function(){return E},k=Symbol.for("react-redux-context"),A="undefined"!=typeof globalThis?globalThis:{};function T(){var t;if(!g().createContext)return{};var e=null!=(t=A[k])?t:A[k]=new Map,r=e.get(g().createContext);return r||(r=g().createContext(null),e.set(g().createContext,r)),r}var x=T();function I(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:x;return function(){return(0,g().useContext)(t)}}var C=I(),R=function(){throw new Error("uSES not initialized!")},D=R,N=function(t,e){return t===e};function M(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:x,e=t===x?C:I(t);return function(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n="function"==typeof r?{equalityFn:r}:r,o=n.equalityFn,i=void 0===o?N:o,a=n.stabilityCheck,u=void 0===a?void 0:a;n.noopCheck;var c=e(),s=c.store,l=c.subscription,f=c.getServerState,p=c.stabilityCheck,d=(c.noopCheck,(0,g().useRef)(!0),(0,g().useCallback)({[t.name]:e=>t(e)}[t.name],[t,p,u])),y=D(l.addNestedSub,s.getState,f||s.getState,d,i);return(0,g().useDebugValue)(y),y}}var U=M();function q(){return q=Object.assign?Object.assign.bind():function(t){for(var e=1;et.length)&&(e=t.length);for(var r=0,n=Array(e);r3&&void 0!==arguments[3]?arguments[3]:{},i=(o.pure,o.areStatesEqual),a=void 0===i?st:i,u=o.areOwnPropsEqual,c=void 0===u?et:u,s=o.areStatePropsEqual,l=void 0===s?et:s,f=o.areMergedPropsEqual,p=void 0===f?et:f,d=o.forwardRef,y=void 0!==d&&d,h=o.context,v=void 0===h?x:h,b=function(t){return t?"function"==typeof t?$(t):z(t,"mapStateToProps"):H(function(){return{}})}(e),m=function(t){return t&&"object"===V(t)?H(function(e){return function(t,e){var r={},n=function(){var n=t[o];"function"==typeof n&&(r[o]=function(){return e(n.apply(void 0,arguments))})};for(var o in t)n();return r}(t,e)}):t?"function"==typeof t?$(t):z(t,"mapDispatchToProps"):H(function(t){return{dispatch:t}})}(r),w=function(t){return t?"function"==typeof t?function(t){return function(e,r){r.displayName;var n,o=r.areMergedPropsEqual,i=!1;return function(e,r,a){var u=t(e,r,a);return i?o(u,n)||(n=u):(i=!0,n=u),n}}}(t):z(t,"mergeProps"):function(){return K}}(n),O=Boolean(e);return function(e){var r=e.displayName||e.name||"Component",n="Connect(".concat(r,")"),o={shouldHandleStateChanges:O,displayName:n,wrappedComponentName:r,WrappedComponent:e,initMapStateToProps:b,initMapDispatchToProps:m,initMergeProps:w,areStatesEqual:a,areStatePropsEqual:l,areOwnPropsEqual:c,areMergedPropsEqual:p};function i(r){var n=g().useMemo(function(){var t=r.reactReduxForwardedRef,e=L(r,it);return[r.context,t,e]},[r]),i=rt(n,3),a=i[0],u=i[1],c=i[2],s=g().useMemo(function(){return a&&a.Consumer&&(0,t().isContextConsumer)(g().createElement(a.Consumer,null))?a:v},[a,v]),l=g().useContext(s),f=Boolean(r.store)&&Boolean(r.store.getState)&&Boolean(r.store.dispatch),p=Boolean(l)&&Boolean(l.store),d=f?r.store:l.store,y=p?l.getServerState:d.getState,h=g().useMemo(function(){return function(t,e){var r=e.initMapStateToProps,n=e.initMapDispatchToProps,o=e.initMergeProps,i=L(e,F);return B(r(t,i),n(t,i),o(t,i),t,i)}(d.dispatch,o)},[d]),b=g().useMemo(function(){if(!O)return ut;var t=Q(d,f?void 0:l.subscription),e=t.notifyNestedSubs.bind(t);return[t,e]},[d,f,l]),m=rt(b,2),w=m[0],S=m[1],j=g().useMemo(function(){return f?l:q({},l,{subscription:w})},[f,l,w]),_=g().useRef(),E=g().useRef(c),P=g().useRef(),k=g().useRef(!1),A=(g().useRef(!1),g().useRef(!1)),T=g().useRef();X(function(){return A.current=!0,function(){A.current=!1}},[]);var x,I,C,R=g().useMemo(function(){return function(){return P.current&&c===E.current?P.current:h(d.getState(),c)}},[d,c]),D=g().useMemo(function(){return function(t){return w?function(t,e,r,n,o,i,a,u,c,s,l){if(!t)return function(){};var f=!1,p=null,d=function(){if(!f&&u.current){var t,r,d=e.getState();try{t=n(d,o.current)}catch(t){r=t,p=t}r||(p=null),t===i.current?a.current||s():(i.current=t,c.current=t,a.current=!0,l())}};return r.onStateChange=d,r.trySubscribe(),d(),function(){if(f=!0,r.tryUnsubscribe(),r.onStateChange=null,p)throw p}}(O,d,w,h,E,_,k,A,P,S,t):function(){}}},[w]);x=ct,I=[E,_,k,c,P,S],X(function(){return x.apply(void 0,function(t){if(Array.isArray(t))return ot(t)}(t=I)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||nt(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}());var t},void 0);try{C=at(D,R,y?function(){return h(y(),c)}:R)}catch(t){throw T.current&&(t.message+="\nThe error may be correlated with this previous error:\n".concat(T.current.stack,"\n\n")),t}X(function(){T.current=void 0,P.current=void 0,_.current=C});var N=g().useMemo(function(){return g().createElement(e,q({},C,{ref:u}))},[u,e,C]);return g().useMemo(function(){return O?g().createElement(s.Provider,{value:j},N):N},[s,N,j])}var u=g().memo(i);if(u.WrappedComponent=e,u.displayName=i.displayName=n,y){var s=g().forwardRef(function(t,e){return g().createElement(u,q({},t,{reactReduxForwardedRef:e}))});return s.displayName=n,s.WrappedComponent=e,G()()(s,e)}return G()()(u,e)}},ft=function(t){var e=t.store,r=t.context,n=t.children,o=t.serverState,i=t.stabilityCheck,a=void 0===i?"once":i,u=t.noopCheck,c=void 0===u?"once":u,s=g().useMemo(function(){var t=Q(e);return{store:e,subscription:t,getServerState:o?function(){return o}:void 0,stabilityCheck:a,noopCheck:c}},[e,o,a,c]),l=g().useMemo(function(){return e.getState()},[e]);X(function(){var t=s.subscription;return t.onStateChange=t.notifyNestedSubs,t.trySubscribe(),l!==e.getState()&&t.notifyNestedSubs(),function(){t.tryUnsubscribe(),t.onStateChange=void 0}},[s,l]);var f=r||x;return g().createElement(f.Provider,{value:s},n)};function pt(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:x,e=t===x?C:I(t);return function(){return e().store}}var dt=pt();function yt(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:x,e=t===x?dt:pt(t);return function(){return e().dispatch}}var ht,vt,bt=yt();function mt(t,e){switch(t){case 0:return function(){return e.apply(this,arguments)};case 1:return function(t){return e.apply(this,arguments)};case 2:return function(t,r){return e.apply(this,arguments)};case 3:return function(t,r,n){return e.apply(this,arguments)};case 4:return function(t,r,n,o){return e.apply(this,arguments)};case 5:return function(t,r,n,o,i){return e.apply(this,arguments)};case 6:return function(t,r,n,o,i,a){return e.apply(this,arguments)};case 7:return function(t,r,n,o,i,a,u){return e.apply(this,arguments)};case 8:return function(t,r,n,o,i,a,u,c){return e.apply(this,arguments)};case 9:return function(t,r,n,o,i,a,u,c,s){return e.apply(this,arguments)};case 10:return function(t,r,n,o,i,a,u,c,s,l){return e.apply(this,arguments)};default:throw new Error("First argument to _arity must be a non-negative integer no greater than ten")}}function gt(t){return gt="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},gt(t)}function wt(t){return null!=t&&"object"===gt(t)&&!0===t["@@functional/placeholder"]}function Ot(t){return function e(r){return 0===arguments.length||wt(r)?e:t.apply(this,arguments)}}ht=v().useSyncExternalStoreWithSelector,D=ht,function(t){at=t}(h().useSyncExternalStore),vt=O.unstable_batchedUpdates,E=vt;var St=Ot(function(t){var e,r=!1;return mt(t.length,function(){return r?e:(r=!0,e=t.apply(this,arguments))})}),jt=St;function _t(t){return _t="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},_t(t)}function Et(t,e,r){return(e=function(t){var e=function(t){if("object"!=_t(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var r=e.call(t,"string");if("object"!=_t(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==_t(e)?e:e+""}(e))in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function Pt(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 kt(t){for(var e=1;e=0;)Ft(e=zt[r],t)&&!Kt(n,e)&&(n[n.length]=e),r-=1;return n}):Ot(function(t){return Object(t)!==t?[]:Object.keys(t)}),Qt=Ot(function(t){return null===t?"Null":void 0===t?"Undefined":Object.prototype.toString.call(t).slice(8,-1)});function Xt(t){return Xt="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},Xt(t)}function Zt(t,e,r,n){var o=Lt(t);function i(t,e){return te(t,e,r.slice(),n.slice())}return!Gt(function(t,e){return!Gt(i,e,t)},Lt(e),o)}function te(t,e,r,n){if(Bt(t,e))return!0;var o,i,a=Qt(t);if(a!==Qt(e))return!1;if("function"==typeof t["fantasy-land/equals"]||"function"==typeof e["fantasy-land/equals"])return"function"==typeof t["fantasy-land/equals"]&&t["fantasy-land/equals"](e)&&"function"==typeof e["fantasy-land/equals"]&&e["fantasy-land/equals"](t);if("function"==typeof t.equals||"function"==typeof e.equals)return"function"==typeof t.equals&&t.equals(e)&&"function"==typeof e.equals&&e.equals(t);switch(a){case"Arguments":case"Array":case"Object":if("function"==typeof t.constructor&&"Promise"===(o=t.constructor,null==(i=String(o).match(/^function (\w*)/))?"":i[1]))return t===e;break;case"Boolean":case"Number":case"String":if(Xt(t)!==Xt(e)||!Bt(t.valueOf(),e.valueOf()))return!1;break;case"Date":if(!Bt(t.valueOf(),e.valueOf()))return!1;break;case"Error":return t.name===e.name&&t.message===e.message;case"RegExp":if(t.source!==e.source||t.global!==e.global||t.ignoreCase!==e.ignoreCase||t.multiline!==e.multiline||t.sticky!==e.sticky||t.unicode!==e.unicode)return!1}for(var u=r.length-1;u>=0;){if(r[u]===t)return n[u]===e;u-=1}switch(a){case"Map":return t.size===e.size&&Zt(t.entries(),e.entries(),r.concat([t]),n.concat([e]));case"Set":return t.size===e.size&&Zt(t.values(),e.values(),r.concat([t]),n.concat([e]));case"Arguments":case"Array":case"Object":case"Boolean":case"Number":case"String":case"Date":case"Error":case"RegExp":case"Int8Array":case"Uint8Array":case"Uint8ClampedArray":case"Int16Array":case"Uint16Array":case"Int32Array":case"Uint32Array":case"Float32Array":case"Float64Array":case"ArrayBuffer":break;default:return!1}var c=Yt(t);if(c.length!==Yt(e).length)return!1;var s=r.concat([t]),l=n.concat([e]);for(u=c.length-1;u>=0;){var f=c[u];if(!Ft(f,e)||!te(e[f],t[f],s,l))return!1;u-=1}return!0}var ee=qt(function(t,e){return te(t,e,[],[])});function re(t){return re="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},re(t)}function ne(t,e,r){var n,o;if("function"==typeof t.indexOf)switch(re(e)){case"number":if(0===e){for(n=1/e;r=0}var ie=qt(oe);function ae(t){return function e(r,n,o){switch(arguments.length){case 0:return e;case 1:return wt(r)?e:qt(function(e,n){return t(r,e,n)});case 2:return wt(r)&&wt(n)?e:wt(r)?qt(function(e,r){return t(e,n,r)}):wt(n)?qt(function(e,n){return t(r,e,n)}):Ot(function(e){return t(r,n,e)});default:return wt(r)&&wt(n)&&wt(o)?e:wt(r)&&wt(n)?qt(function(e,r){return t(e,r,o)}):wt(r)&&wt(o)?qt(function(e,r){return t(e,n,r)}):wt(n)&&wt(o)?qt(function(e,n){return t(r,e,n)}):wt(r)?Ot(function(e){return t(e,n,o)}):wt(n)?Ot(function(e){return t(r,e,o)}):wt(o)?Ot(function(e){return t(r,n,e)}):t(r,n,o)}}}var ue=Number.isInteger||function(t){return(0|t)===t};function ce(t){return"[object String]"===Object.prototype.toString.call(t)}function se(t,e){var r=t<0?e.length+t:t;return ce(e)?e.charAt(r):e[r]}function le(t,e){for(var r=e,n=0;n=0&&"[object Array]"===Object.prototype.toString.call(t)},ye=Ot(function(t){return null==t});function he(t){return he="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},he(t)}var ve=ae(function t(e,r,n){if(0===e.length)return r;var o=e[0];if(e.length>1){var i=!ye(n)&&Ft(o,n)&&"object"===he(n[o])?n[o]:ue(e[1])?[]:{};r=t(Array.prototype.slice.call(e,1),r,i)}return function(t,e,r){if(ue(t)&&de(r)){var n=[].concat(r);return n[t]=e,n}var o={};for(var i in r)o[i]=r[i];return o[t]=e,o}(o,r,n)}),be=ae(function(t,e,r){return ve([t],e,r)});function me(t,e){return function(){var r=arguments.length;if(0===r)return e();var n=arguments[r-1];return de(n)||"function"!=typeof n[t]?e.apply(this,arguments):n[t].apply(n,Array.prototype.slice.call(arguments,0,r-1))}}var ge=qt(me("forEach",function(t,e){for(var r=e.length,n=0;n0&&t.hasOwnProperty(0)&&t.hasOwnProperty(t.length-1))});function Be(t){return function e(r){for(var n,o,i,a=[],u=0,c=r.length;u=arguments.length)?c=e[a]:(c=arguments[o],o+=1),n[a]=c,wt(c)?u=!0:i-=1,a+=1}return!u&&i<=0?r.apply(this,n):mt(Math.max(0,i),ze(t,n,r))}}var Ve=qt(function(t,e){return 1===t?Ot(e):mt(t,ze(t,[],e))}),Ke=Ve,Ye=qt(Re(["fantasy-land/map","map"],We,function(t,e){switch(Object.prototype.toString.call(e)){case"[object Function]":return Ke(e.length,function(){return t.call(this,e.apply(this,arguments))});case"[object Object]":return Ce(function(r,n){return r[n]=t(e[n]),r},{},Yt(e));default:return Je(t,e)}})),Qe=Ye,Xe="undefined"!=typeof Symbol?Symbol.iterator:"@@iterator";function Ze(t,e,r){return function(n,o,i){if(Fe(i))return t(n,o,i);if(null==i)return o;if("function"==typeof i["fantasy-land/reduce"])return e(n,o,i,"fantasy-land/reduce");if(null!=i[Xe])return r(n,o,i[Xe]());if("function"==typeof i.next)return r(n,o,i);if("function"==typeof i.reduce)return e(n,o,i,"reduce");throw new TypeError("reduce: list must be array or iterable")}}function tr(t,e,r){for(var n=0,o=r.length;n":vr(r,n)},n=function(t,e){return Je(function(e){return lr(e)+": "+r(t[e])},e.slice().sort())};switch(Object.prototype.toString.call(t)){case"[object Arguments]":return"(function() { return arguments; }("+Je(r,t).join(", ")+"))";case"[object Array]":return"["+Je(r,t).concat(n(t,yr(function(t){return/^\d+$/.test(t)},Yt(t)))).join(", ")+"]";case"[object Boolean]":return"object"===hr(t)?"new Boolean("+r(t.valueOf())+")":t.toString();case"[object Date]":return"new Date("+(isNaN(t.valueOf())?r(NaN):lr(pr(t)))+")";case"[object Map]":return"new Map("+r(Array.from(t))+")";case"[object Null]":return"null";case"[object Number]":return"object"===hr(t)?"new Number("+r(t.valueOf())+")":1/t==-1/0?"-0":t.toString(10);case"[object Set]":return"new Set("+r(Array.from(t).sort())+")";case"[object String]":return"object"===hr(t)?"new String("+r(t.valueOf())+")":lr(t);case"[object Undefined]":return"undefined";default:if("function"==typeof t.toString){var o=t.toString();if("[object Object]"!==o)return o}return"{"+n(t,Yt(t)).join(", ")+"}"}}var br=Ot(function(t){return vr(t,[])}),mr=qt(function(t,e){if(de(t)){if(de(e))return t.concat(e);throw new TypeError(br(e)+" is not an array")}if(ce(t)){if(ce(e))return t+e;throw new TypeError(br(e)+" is not a string")}if(null!=t&&sr(t["fantasy-land/concat"]))return t["fantasy-land/concat"](e);if(null!=t&&sr(t.concat))return t.concat(e);throw new TypeError(br(t)+' does not have a method named "concat" or "fantasy-land/concat"')});function gr(t){return t&&t["@@transducer/reduced"]?t:{"@@transducer/value":t,"@@transducer/reduced":!0}}var wr=function(){function t(t,e){this.xf=e,this.f=t,this.all=!0}return t.prototype["@@transducer/init"]=Ne,t.prototype["@@transducer/result"]=function(t){return this.all&&(t=this.xf["@@transducer/step"](t,!0)),this.xf["@@transducer/result"](t)},t.prototype["@@transducer/step"]=function(t,e){return this.f(e)||(this.all=!1,t=gr(this.xf["@@transducer/step"](t,!1))),t},t}();function Or(t){return function(e){return new wr(t,e)}}var Sr=qt(Re(["all"],Or,function(t,e){for(var r=0;re!=e>t)return e>t?e:t}var n=r(t,e);if(void 0!==n)return n;var o=r(_r(t),_r(e));if(void 0!==o)return o===_r(t)?t:e;var i=br(t),a=r(i,br(e));return void 0!==a&&a===i?t:e}),Pr=qt(function(t,e){return Qe(xe(t),e)}),kr=qt(function(t,e){return Ke(cr(Er,0,Pr("length",e)),function(){var r=arguments,n=this;return t.apply(n,Je(function(t){return t.apply(n,r)},e))})}),Ar=kr,Tr=Ot(function(t){return Ar(function(){return Array.prototype.slice.call(arguments,0)},t)}),xr=Tr([Le,yr]);function Ir(t){return Ir="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},Ir(t)}function Cr(t,e,r){var n,o=Ir(t);switch(o){case"string":case"number":return 0===t&&1/t==-1/0?!!r._items["-0"]||(e&&(r._items["-0"]=!0),!1):null!==r._nativeSet?e?(n=r._nativeSet.size,r._nativeSet.add(t),r._nativeSet.size===n):r._nativeSet.has(t):o in r._items?t in r._items[o]||(e&&(r._items[o][t]=!0),!1):(e&&(r._items[o]={},r._items[o][t]=!0),!1);case"boolean":if(o in r._items){var i=t?1:0;return!!r._items[o][i]||(e&&(r._items[o][i]=!0),!1)}return e&&(r._items[o]=t?[!1,!0]:[!0,!1]),!1;case"function":return null!==r._nativeSet?e?(n=r._nativeSet.size,r._nativeSet.add(t),r._nativeSet.size===n):r._nativeSet.has(t):o in r._items?!!oe(t,r._items[o])||(e&&r._items[o].push(t),!1):(e&&(r._items[o]=[t]),!1);case"undefined":return!!r._items[o]||(e&&(r._items[o]=!0),!1);case"object":if(null===t)return!!r._items.null||(e&&(r._items.null=!0),!1);default:return(o=Object.prototype.toString.call(t))in r._items?!!oe(t,r._items[o])||(e&&r._items[o].push(t),!1):(e&&(r._items[o]=[t]),!1)}}var Rr=function(){function t(){this._nativeSet="function"==typeof Set?new Set:null,this._items={}}return t.prototype.add=function(t){return!Cr(t,!0,this)},t.prototype.has=function(t){return Cr(t,!1,this)},t}(),Dr=qt(function(t,e){for(var r=[],n=0,o=t.length,i=e.length,a=new Rr,u=0;u=0&&this.i>=this.n?gr(r):r},t}();function vn(t){return function(e){return new hn(t,e)}}var bn=ae(me("slice",function(t,e,r){return Array.prototype.slice.call(r,t,e)})),mn=qt(Re(["take"],vn,function(t,e){return bn(0,t<0?1/0:t,e)})),gn=qt(function(t,e){return ee(mn(t.length,e),t)}),wn=qt(function(t,e){return"function"!=typeof e.indexOf||de(e)?ne(e,t,0):e.indexOf(t)}),On=ae(function(t,e,r){t=t=0?t:r.length;var n=Array.prototype.slice.call(r,0);return n.splice(t,0,e),n}),Sn=function(){function t(t,e){this.xf=e,this.f=t,this.found=!1}return t.prototype["@@transducer/init"]=Ne,t.prototype["@@transducer/result"]=function(t){return this.found||(t=this.xf["@@transducer/step"](t,void 0)),this.xf["@@transducer/result"](t)},t.prototype["@@transducer/step"]=function(t,e){return this.f(e)&&(this.found=!0,t=gr(this.xf["@@transducer/step"](t,e))),t},t}();function jn(t){return function(e){return new Sn(t,e)}}var _n=qt(Re(["find"],jn,function(t,e){for(var r=0,n=e.length;rt.length)&&(e=t.length);for(var r=0,n=Array(e);r2&&void 0!==arguments[2]?arguments[2]:[],n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:void 0;if(Array.isArray(t))t.forEach(function(t,o){if(n){var i=cn(function(t){return ie("{}",t)},n);if(-1!==i){var a=bn(0,i,n),u=bn(i,n.length,n);if(a.length)qn(Oe(a,t),e,mr(r,mr([o],a)),u);else{var c,s=u.map(function(t){return t.replace("{}","")}).filter(function(t){return t}),l=mr([o],s);for(var f in c=s.length?Oe(s,t):t){var p=c[f];qn(p,e,mr(r,l.concat([f])))}}}else qn(Oe(n,t),e,mr(r,mr([o],n)))}else qn(t,e,r.concat(o))});else if("Object"===Qt(t)){e(t,r);var o=t.props&&t.props.children;if(o){var i=r.concat(Un);qn(o,e,i)}var a=window.__dashprivate_childrenProps;(a&&a[t.namespace]&&a[t.namespace][t.type]||[]).forEach(function(n){if(n.includes("[]")){var o=(w=n.split("[]").map(function(t){return t.split(".").filter(function(t){return t})}),O=2,function(t){if(Array.isArray(t))return t}(w)||function(t,e){var r=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=r){var n,o,i,a,u=[],c=!0,s=!1;try{if(i=(r=r.call(t)).next,0===e){if(Object(r)!==r)return;c=!1}else for(;!(c=(n=i.call(r)).done)&&(u.push(n.value),u.length!==e);c=!0);}catch(t){s=!0,o=t}finally{try{if(!c&&null!=r.return&&(a=r.return(),Object(a)!==a))return}finally{if(s)throw o}}return u}}(w,O)||Dn(w,O)||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.")}()),i=o[0],a=o[1],u=mr(["props"],i),c=mr(r,u);qn(Oe(u,t),e,c,a)}else if(n.includes("{}")){for(var s=n.split("."),l=[],f=[],p=!1,d=0;d-1&&r.splice(n,1)}}},{key:"emit",value:function(t){for(var e=this,r=arguments.length,n=new Array(r>1?r-1:0),o=1;o=t.length?{done:!0}:{done:!1,value:t[n++]}},e:function(t){throw t},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,u=!1;return{s:function(){r=r.call(t)},n:function(){var t=r.next();return a=t.done,t},e:function(t){u=!0,i=t},f:function(){try{a||null==r.return||r.return()}finally{if(u)throw i}}}}function ro(t,e){if(t){if("string"==typeof t)return no(t,e);var r={}.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)?no(t,e):void 0}}function no(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);ro?1:ne?1:t0;[[e,"Input"],[r,"State"]].forEach(function(e){var r=to(e,2),u=r[0],c=r[1];u.forEach(function(e,r){var u=ko(e.id),s=u.matchKeys,l=u.allsmallerKeys,f=a?s.concat(l):l,p=Dr(f,i);if(p.length){p.sort();var d=t.length?"Output 0 (".concat(Wo(t[0]),")"):"the (absent) Output";o("`Input` / `State` wildcards not in `Output`s",[n,"".concat(c," ").concat(r," (").concat(Wo(e),")"),"has MATCH or ALLSMALLER on key(s) ".concat(p.join(", ")),"where ".concat(d),"does not have a MATCH wildcard. Inputs and State do not","need every MATCH from the Output(s), but ALLSMALLER","requires a matching MATCH in the Output(s), and when","the Output(s) have any MATCH, Input/State MATCH keys","must be a subset of them."])}})})}(i,o,a,c,e))})}(u,function(t,r){c=!0,e(t,r)});var s={},l={},f=new Map,p=new Map,d=new Map,y=new Map,h={},v={},b={},m={},g=!1,w=!1,O={MultiGraph:n,outputMap:s,inputMap:l,outputPatterns:h,inputPatterns:v,partialOutputPatterns:b,partialInputPatterns:m,hasPartialOutputPatterns:g,hasPartialInputPatterns:w,callbacks:u};if(c)return O;function S(t,e){var r=[{}];return Fr(function(t,n){var o=i[n].vals,a=o.indexOf(e[n]),u=[t];t&&t.wild&&(u=t===co?a>0?o.slice(0,a):[]:-1===a||t===ao?o:[e[n]]),r=nn(nn([be(n)],u),r)},t),r}u.forEach(function(t){var e=t.outputs,r=t.inputs;e.concat(r).filter(function(t){return"object"===oo(t.id)}).forEach(function(t){Fr(function(t,e){i[e]||(i[e]={exact:[],expand:0});var r=i[e];t&&t.wild?t.expand&&(r.expand+=1):-1===r.exact.indexOf(t)&&r.exact.push(t)},t.id)})}),Fr(function(t){var e=t.exact,r=t.expand,n=e.slice().sort(bo);if(r)for(var o=0;o2&&void 0!==arguments[2])||arguments[2];r.validate_callbacks&&(n.addNode(t),n.addDependency(t,e),o&&(E[E.length-1].push(t),P[P.length-1].push(e)))}u.forEach(function(t){var e=t.outputs,o=t.inputs;function i(t,e){r.validate_callbacks&&(n.addNode(e),o.forEach(function(r){var n=r.id,o=r.property;"object"===oo(n)?S(n,t).forEach(function(t){k(Wo({id:t,property:o}),e)}):k(Wo(r),e)}))}E.push([]),P.push([]);var a=ko(e.length?e[0].id:void 0).matchKeys,u=cn(function(t){return!Io(t)},e),c=ln({matchKeys:a,firstSingleOutput:u,outputs:e},t);e.forEach(function(t){var e,n=t.id,a=t.property,u=t.partial;if(r.validate_callbacks&&(e=function(t,e){var r=t.id,n=t.property;return e.some(function(e){var o=e.id,i=e.property;if(n!==i||oo(r)!==oo(o))return!1;if("string"==typeof r){if(r===o)return!0}else if(Eo(e,[t]))return!0;return!1})}(t,o)),"object"===oo(n))r.validate_callbacks&&S(n,{}).forEach(function(t){var r={id:t,property:a},n=Wo(r);e&&(_.push(r),n+=j),i(t,n)}),u?(So(f,n,a,c),So(d,n,a,c),g=!0):Oo(f,n,a,c);else{if(r.validate_callbacks){var l=Wo(t);e&&(_.push(t),l+=j),i({},l)}wo(s,n,a,c)}}),o.forEach(function(t){var e=t.id,r=t.property,n=t.partial;"object"===oo(e)?n?(So(p,e,r,c),So(y,e,r,c),w=!0):Oo(p,e,r,c):wo(l,e,r,c)})}),h=jo(f,h),v=jo(p,v),b=jo(d,b),m=jo(y,m),O.outputPatterns=h,O.inputPatterns=v,O.partialOutputPatterns=b,O.partialInputPatterns=m,O.hasPartialOutputPatterns=g,O.hasPartialInputPatterns=w,_.forEach(function(t){for(var e=Wo(t),r=e.concat(j),n=0;n3&&void 0!==arguments[3]?arguments[3]:"";return function(o){var i=o.matchKeys,a=o.firstSingleOutput,u=o.outputs;if(i.length){var c=u[a];if(c)Ro(o,c,t(e)(c),r);else{var s={};u.forEach(function(n){var a=t(e)(n).filter(function(t){var e=JSON.stringify(Ie(i,t.id));return!s[e]&&(s[e]=1,!0)});Ro(o,n,a,r)})}}else{var l=Zo(o,t,n);r.push(l)}}}function No(t){return No="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},No(t)}function Mo(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 Uo(t){for(var e=1;et.length)&&(e=t.length);for(var r=0,n=Array(e);r5&&void 0!==arguments[5])||arguments[5],a=[],u=Wo({id:r,property:n});if("string"==typeof r){var c=(t.inputMap[r]||{})[n];if(!c)return[];c.forEach(Do(ei(),e,a))}else{var s=Object.keys(r).sort(),l=Ie(s,r),f=s.join(","),p=(t.inputPatterns[f]||{})[n];if(p&&p.forEach(function(t){if(t.partial){if(To(t.keys,t.values,s,l)){var r=xo(t.values,l),n=t.keys.map(function(t){return l[s.indexOf(t)]});t.callbacks.forEach(Do(ri(t.keys,n,t.values),e,a,r))}}else if(Ao(s,l,t.values)){var o=xo(t.values,l);t.callbacks.forEach(Do(ei(s,l,t.values),e,a,o))}}),t.hasPartialInputPatterns)for(var d in t.partialInputPatterns)if(d!==f&&d.split(",").every(function(t){return-1!==s.indexOf(t)})){var y=t.partialInputPatterns[d][n];y&&y.forEach(function(t){if(To(t.keys,t.values,s,l)){var r=xo(t.values,l),n=t.keys.map(function(t){return l[s.indexOf(t)]});t.callbacks.forEach(Do(ri(t.keys,n,t.values),e,a,r))}})}}return a.forEach(function(r){r.changedPropIds[u]=o||Ho,i&&(r.priority=Vo(t,e,r))}),a}function Vo(t,e,r){for(var n=[r],o={},i={},a=[];n.length;){n=Le(function(t){var e=i[t.resolvedId];return i[t.resolvedId]=!0,e},n);var u=Le(function(t){return!o[Wo(t)]},He(Qe(function(t){return He(t.getOutputs(e))},n)));u.forEach(function(t){return o[Wo(t)]=!0}),(n=He(Qe(function(r){var n=r.id,o=r.property;return zo(t,e,n,o,Jo,!1)},u))).length&&a.push(n.length)}return a.unshift(a.length),Qe(function(t){return Math.min(t,35).toString(36)},a).join("")}var Ko=function(t,e){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e,n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};if(!e.length)return[];var o=Qe(Wo,cr(function(e,r){return mr(e,He(r.getOutputs(t)))},[],r)),i={};if(o.forEach(function(t){return i[t]=!0}),Object.keys(n).length){var a=He(Qe(function(e){return function(t,e,r){for(var n=[r],o={};n.length;){var i=Le(function(t){return!o[Wo(t)]},He(Qe(function(t){return He(t.getOutputs(e))},n)));o=cr(function(t,e){return be(Wo(e),!0,t)},o,i),n=He(Qe(function(r){var n=r.id,o=r.property;return zo(t,e,n,o,Jo,!1)},i))}return o}(n,t,e)},r));a.length>0&&(i=Object.assign.apply(Object,[a[0]].concat(Go(a))))}return Le(function(e){return jr(function(t){return!i[Wo(t)]},function(t,e){return t.filter(function(t){return!e.some(function(e){return Wo(t)===Wo(e)})})}(He(e.getInputs(t)),He(e.getOutputs(t))))},e)},Yo=function(t,e,r,n){for(var o=[],i=function(t,e,r,n){var o=n.outputsOnly,i=n.removedArrayInputsOnly,a=n.newPaths,u=n.chunkPath,c=n.patchAnalysis,s={},l=[];function f(t){if(t){var e=s[t.resolvedId];if(void 0!==e){var r=l[e];r.changedPropIds=$o(r.changedPropIds,t.changedPropIds),t.initialCall&&(r.initialCall=!0)}else s[t.resolvedId]=l.length,l.push(t)}}function p(r,n,s){if(n){var l=!!c&&function(t,e){return!(!t||!e||t.freshIds[e])}(c,vo(r));for(var p in n){var d=Co(t,0,r,p);d&&(d.callback.prevent_initial_call||l||(d.initialCall=!0,f(d)))}}if(!o&&s){var y=vo(r),h=i?function(t){return function(r){return r.getInputs(e).some(function(e){return!(!Array.isArray(e)||!e.some(function(e){return vo(e.id)===t})||(He(r.getOutputs(a)).length&&(r.initialCall=!0,r.changedPropIds={},f(r)),0))})}}(y):f;for(var v in s){var b=h;u&&!Kn(c,y,v)&&(b=function(t){jr(gn(u),Pr("path",He(t.getOutputs(e))))||h(t)}),zo(t,e,r,v,Jo).forEach(b)}}}return qn(r,function(e){var r=e.props&&e.props.id;if(r)if("string"!=typeof r||i){var n=Object.keys(r).sort(),o=n.join(",");if(p(r,!i&&t.outputPatterns[o],t.inputPatterns[o]),t.hasPartialInputPatterns)for(var a in t.partialInputPatterns)a!==o&&a.split(",").every(function(t){return-1!==n.indexOf(t)})&&p(r,null,t.partialInputPatterns[a]);if(!i&&t.hasPartialOutputPatterns)for(var u in t.partialOutputPatterns)u!==o&&u.split(",").every(function(t){return-1!==n.indexOf(t)})&&p(r,t.partialOutputPatterns[u],null)}else p(r,t.outputMap[r],t.inputMap[r])}),Qe(function(r){return Xn(Xn({},r),{},{priority:Vo(t,e,r)})},l)}(t,e,r,n);;){var a=Lo(xr(function(t){var r=t.callback.inputs,n=t.getInputs;return jr(Io,r)||!Ee(Dr(Qe(Wo,He(n(e))),o))},i),2),u=a[0],c=a[1];if(!c.length)break;i=u,o=mr(o,Qe(Wo,He(Qe(function(t){return(0,t.getOutputs)(e)},c))))}if(n.filterRoot){var s=Oe(["props","id"],r);s&&(s=vo(s),i=i.filter(function(t){return t.callback.inputs.reduce(function(t,e){return t||vo(e.id)==s&&n.filterRoot.includes(e.property)},!1)}))}var l=Math.random().toString(16);return Qe(function(t){return Uo(Uo({},t),{},{executionGroup:l})},i)},Qo=function(t){var e=t.anyVals,r=t.callback,n=r.inputs,o=r.outputs,i=r.state,a=r.output,u=Qe(Wo,[].concat(Go(n),Go(o),Go(i)));return 0===o.length&&a&&u.push(a),mr(u,Array.isArray(e)?e:""===e?[]:[e]).join(",")};function Xo(t,e,r,n){return He(Qe(function(e){return zo(r,n,t,e)},Yt(e)))}var Zo=function(t,e,r){return{callback:t,anyVals:r,resolvedId:t.output+r,getOutputs:function(r){return t.outputs.map(e(r))},getInputs:function(r){return t.inputs.map(e(r))},getState:function(r){return t.state.map(e(r))},changedPropIds:{},initialCall:!1}};function ti(t,e){var r=Lo(xr(function(t){var r=t.getOutputs,n=t.callback.outputs;return He(r(e)).length===n.length},t),2)[1],n=Lo(xr(function(t){var r=t.getOutputs;return!He(r(e)).length},r),2)[1];return{added:Qe(function(t){return be("changedPropIds",Nr(function(t,r){return Wn(e,yo(r).id)},t.changedPropIds),t)},n),removed:r}}function ei(t,e,r){return function(n){return function(o){var i=o.id,a=o.property,u=o.partial;if("string"==typeof i){var c=Wn(n,i);return c?[{id:i,property:a,path:c}]:[]}var s=Object.keys(i).sort(),l=Ie(s,i),f=s.join(","),p=n.objs[f];if(p){var d=[];return p.forEach(function(n){var o=n.values,i=n.path;Ao(s,o,l,t,e,r)&&d.push({id:Ur(s,o),property:a,path:i})}),d}if(u){var y=[],h=function(){var o=v.split(",");if(!s.every(function(t){return-1!==o.indexOf(t)}))return 1;n.objs[v].forEach(function(n){var i=n.values,u=n.path;To(s,l,o,i,t,e,r)&&y.push({id:Ur(o,i),property:a,path:u})})};for(var v in n.objs)h();return y}return[]}}}function ri(t,e,r,n){return function(n){return function(o){var i=o.id,a=o.property,u=o.partial;if("string"==typeof i){var c=Wn(n,i);return c?[{id:i,property:a,path:c}]:[]}var s=Object.keys(i).sort(),l=Ie(s,i);if(!u){var f=s.join(","),p=n.objs[f];if(!p)return[];var d=[],y=e?s.map(function(r){var n=t.indexOf(r);return-1!==n?e[n]:void 0}):void 0,h=r?s.map(function(e){var n=t.indexOf(e);return-1!==n?r[n]:void 0}):void 0;return p.forEach(function(e){var r=e.values,n=e.path;Ao(s,r,l,t,y,h)&&d.push({id:Ur(s,r),property:a,path:n})}),d}var v=[],b=function(){var o=m.split(",");if(!s.every(function(t){return-1!==o.indexOf(t)}))return 1;n.objs[m].forEach(function(n){var i=n.values,u=n.path;To(s,l,o,i,t,e,r)&&v.push({id:Ur(o,i),property:a,path:u})})};for(var m in n.objs)b();return v}}}var ni={ON_PROP_CHANGE:1,SET_REQUEST_QUEUE:1,SET_GRAPHS:1,SET_PATHS:1,SET_LAYOUT:1,SET_APP_LIFECYCLE:1,SET_CONFIG:1,ADD_HTTP_HEADERS:1,ON_ERROR:1,SET_HOOKS:1,INSERT_COMPONENT:1,REMOVE_COMPONENT:1,RESET_COMPONENT_STATE:1},oi=function(t){if(ni[t])return t;throw new Error("".concat(t," is not defined."))};function ii(t){var e={STARTED:"STARTED",HYDRATED:"HYDRATED",DESTROYED:"DESTROYED"};if(e[t])return e[t];throw new Error("".concat(t," is not a valid app state."))}var ai,ui,ci=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:ii("STARTED"),e=arguments.length>1?arguments[1]:void 0;return e.type===oi("SET_APP_LIFECYCLE")?ii(e.payload):t};function si(t){return si="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},si(t)}function li(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 fi(t){for(var e=1;e1?arguments[1]:void 0;return cr(function(t,e){return null===e?t:e.type===ui.AddCompleted?function(t,e){return fi(fi({},t),{},{completed:t.completed+e.payload})}(t,e):function(t,e){var r=yi[e.type],n=hi[e.type];return r&&n&&0!==e.payload.length?fi(fi({},t),{},{[n]:r(t[n],e.payload)}):t}(t,e)},arguments.length>0&&void 0!==arguments[0]?arguments[0]:di,t.type===ui.Aggregate?t.payload:[t])},bi=ae(function t(e,r,n){return ke(function(r,n,o){return Se(n)&&Se(o)?t(e,n,o):e(r,n,o)},r,n)}),mi=bi,gi=qt(function(t,e){return mi(function(t,e,r){return r},t,e)});function wi(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,e=arguments.length>1?arguments[1]:void 0;return e.type===oi("SET_CONFIG")?(window.__dashprivate_childrenProps=gi(window.__dashprivate_childrenProps||{},e.payload.children_props),e.payload):e.type===oi("ADD_HTTP_HEADERS")?gi(t,{fetch:{headers:e.payload}}):t}var Oi={},Si=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:Oi,e=arguments.length>1?arguments[1]:void 0;return"SET_GRAPHS"===e.type?e.payload:t};function ji(t){return function(t){if(Array.isArray(t))return _i(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||function(t,e){if(t){if("string"==typeof t)return _i(t,e);var r={}.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)||function(){throw new TypeError("Invalid attempt to spread 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=Array(e);r0&&void 0!==arguments[0]?arguments[0]:Ei,e=arguments.length>1?arguments[1]:void 0;switch(e.type){case"ON_ERROR":var r=t.frontEnd,n=t.backEnd,o=t.backEndConnected;return console.error(e.payload.error),"frontEnd"===e.payload.type?{frontEnd:[ln(e.payload,{timestamp:new Date})].concat(ji(r)),backEnd:n,backEndConnected:o}:"backEnd"===e.payload.type?{frontEnd:r,backEnd:[ln(e.payload,{timestamp:new Date})].concat(ji(n)),backEndConnected:o}:t;case"SET_CONNECTION_STATUS":return ln(t,{backEndConnected:e.payload});default:return t}}function ki(t){return function(t){if(Array.isArray(t))return Ai(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||function(t,e){if(t){if("string"==typeof t)return Ai(t,e);var r={}.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)?Ai(t,e):void 0}}(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Ai(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r0&&void 0!==arguments[0]?arguments[0]:Ti;switch((arguments.length>1?arguments[1]:void 0).type){case"UNDO":var e=t.past,r=t.present,n=t.future,o=e[e.length-1];return{past:e.slice(0,e.length-1),present:o,future:[r].concat(ki(n))};case"REDO":var i=t.past,a=t.present,u=t.future,c=u[0],s=u.slice(1);return{past:[].concat(ki(i),[a]),present:c,future:s};case"REVERT":var l=t.past,f=t.future,p=l[l.length-1];return{past:l.slice(0,l.length-1),present:p,future:ki(f)};default:return t}},Ii=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{layout_pre:null,layout_post:null,request_pre:null,request_post:null,callback_resolved:null,request_refresh_jwt:null,bear:!1},e=arguments.length>1?arguments[1]:void 0;return"SET_HOOKS"===e.type?e.payload:t};function Ci(t){return Ci="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},Ci(t)}function Ri(t,e,r){if(r||(r=new Ni),o=Ci(n=t),null==n||"object"!=o&&"function"!=o)return t;var n,o,i,a=function(n){var o=r.get(t);if(o)return o;for(var i in r.set(t,n),t)Object.prototype.hasOwnProperty.call(t,i)&&(n[i]=e?Ri(t[i],!0,r):t[i]);return n};switch(Qt(t)){case"Object":return a(Object.create(Object.getPrototypeOf(t)));case"Array":return a(Array(t.length));case"Date":return new Date(t.valueOf());case"RegExp":return i=t,new RegExp(i.source,i.flags?i.flags:(i.global?"g":"")+(i.ignoreCase?"i":"")+(i.multiline?"m":"")+(i.sticky?"y":"")+(i.unicode?"u":"")+(i.dotAll?"s":""));case"Int8Array":case"Uint8Array":case"Uint8ClampedArray":case"Int16Array":case"Uint16Array":case"Int32Array":case"Uint32Array":case"Float32Array":case"Float64Array":case"BigInt64Array":case"BigUint64Array":return t.slice();default:return t}}var Di,Ni=function(){function t(){this.map={},this.length=0}return t.prototype.set=function(t,e){var r=this.hash(t),n=this.map[r];n||(this.map[r]=n=[]),n.push([t,e]),this.length+=1},t.prototype.hash=function(t){var e=[];for(var r in t)e.push(Object.prototype.toString.call(t[r]));return e.join()},t.prototype.get=function(t){if(this.length<=180){for(var e in this.map)for(var r=this.map[e],n=0;n0&&void 0!==arguments[0]?arguments[0]:Ji,e=arguments.length>1?arguments[1]:void 0;if("UPDATE_RESOURCE_USAGE"===e.type){var r=e.payload,n=r.id,o=r.usage,i=r.status,a=Fi[i]||i,u={updated:[n],resources:t.resources,callbacks:t.callbacks,graphLayout:t.graphLayout};u.callbacks[n]=u.callbacks[n]||Mi(Hi);var c=u.callbacks[n],s=c.resources,l=u.resources;if(c.count+=1,c.status.latest=a,c.status[a]=(c.status[a]||0)+1,c.result=e.payload.result,c.inputs=e.payload.inputs,c.state=e.payload.state,o){var f=o.__dash_client,p=o.__dash_server,d=o.__dash_upload,y=o.__dash_download,h=function(t,e){if(null==t)return{};var r,n,o=function(t,e){if(null==t)return{};var r={};for(var n in t)if({}.hasOwnProperty.call(t,n)){if(-1!==e.indexOf(n))continue;r[n]=t[n]}return r}(t,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);for(n=0;n0&&void 0!==arguments[0]?arguments[0]:Wi};!function(t){t.Set="IsLoading.Set"}(Di||(Di={}));var Vi=function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],e=arguments.length>1?arguments[1]:void 0;return e.type===Di.Set?e.payload:t},Ki=qt(function(t,e){return Zr(e,[t])}),Yi=function(t){return{value:t,"fantasy-land/map":function(){return this}}},Qi=qt(function(t,e){return t(Yi)(e).value}),Xi=qt(function(t,e){return function(r){return function(n){return Qe(function(t){return e(t,n)},r(t(n)))}}}),Zi=Ot(function(t){return Xi(function(e){return le(t,e)},ve(t))}),ta=ae(function(t,e,r){var n=Array.prototype.slice.call(r,0);return n.splice(t,e),n}),ea=qt(function t(e,r){if(null==r)return r;switch(e.length){case 0:return r;case 1:return function(t,e){if(null==e)return e;if(ue(t)&&de(e))return ta(t,1,e);var r={};for(var n in e)r[n]=e[n];return delete r[t],r}(e[0],r);default:var n=e[0],o=Array.prototype.slice.call(e,1);return null==r[n]?function(t,e){if(ue(t)&&de(e))return[].concat(e);var r={};for(var n in e)r[n]=e[n];return r}(n,r):be(n,t(o,r[n]),r)}});function ra(t){return ra="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},ra(t)}function na(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 oa(t,e,r){return(e=function(t){var e=function(t){if("object"!=ra(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var r=e.call(t,"string");if("object"!=ra(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==ra(e)?e:e+""}(e))in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function ia(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r0&&void 0!==arguments[0]?arguments[0]:{components:[]},r=arguments.length>1?arguments[1]:void 0;if(r.type===oi("SET_LAYOUT"))return Array.isArray(r.payload)?e.components=function(t){if(Array.isArray(t))return ia(t)}(t=r.payload)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||function(t,e){if(t){if("string"==typeof t)return ia(t,e);var r={}.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)?ia(t,e):void 0}}(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}():e.components=function(t){for(var e=1;e0&&void 0!==arguments[0]?arguments[0]:ua,e=arguments.length>1?arguments[1]:void 0;return e.type===oi("SET_PATHS")?e.payload:t},sa=qt(function(t,e){return ea([t],e)});function la(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1?arguments[1]:void 0;switch(e.type){case"ADD_CALLBACK_JOB":return function(t,e){return be(t.jobId,t,e)}(e.payload,t);case"REMOVE_CALLBACK_JOB":return function(t,e){return sa(t,e)}(e.payload.jobId,t);case"CALLBACK_JOB_OUTDATED":return function(t,e){return ve([t,"outdated"],!0,e)}(e.payload.jobId,t);default:return t}}function fa(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1?arguments[1]:void 0;switch(e.type){case"LOADED":return e.payload.reduce(function(t,e){var r=[JSON.stringify(e.path)],n=pe([],r,t);return ve(r,n.filter(function(t){return t.property!==e.property}),t)},t);case"LOADING":return e.payload.reduce(function(t,e){var r=[JSON.stringify(e.path)],n=pe([],r,t);return ie(e,n)||n.push(e),ve(r,n,t)},t);default:return t}}var pa=qt(function(t,e){return Ke(t+1,function(){var r=arguments[t];if(null!=r&&sr(r[e]))return r[e].apply(r,Array.prototype.slice.call(arguments,0,t));throw new TypeError(br(r)+' does not have a method named "'+e+'"')})}),da=pa(1,"join");function ya(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);rt.length)&&(e=t.length);for(var r=0,n=Array(e);r0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1?arguments[1]:void 0;if(ie(e.type,["UNDO_PROP_CHANGE","REDO_PROP_CHANGE","ON_PROP_CHANGE"])){var r=ba(e.payload.itempath),n=pe(0,[r,"hash"],t);t=be(r,{hash:n+1,changedProps:e.payload.props,renderType:e.payload.renderType},t)}else if("RESET_COMPONENT_STATE"===e.type){var o=e.payload.itempath;if(o){var i=ba(o);return Object.fromEntries(Object.entries(t).filter(function(t){return!(e=t,r=1,function(t){if(Array.isArray(t))return t}(e)||function(t,e){var r=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=r){var n,o,i,a,u=[],c=!0,s=!1;try{if(i=(r=r.call(t)).next,0===e){if(Object(r)!==r)return;c=!1}else for(;!(c=(n=i.call(r)).done)&&(u.push(n.value),u.length!==e);c=!0);}catch(t){s=!0,o=t}finally{try{if(!c&&null!=r.return&&(a=r.return(),Object(a)!==a))return}finally{if(s)throw o}}return u}}(e,r)||ga(e,r)||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.")}())[0].startsWith(i);var e,r}))}}return t};function ja(){var t={appLifecycle:ci,callbacks:vi,config:wi,error:Pi,graphs:Si,history:xi,hooks:Ii,profile:$i,changed:zi,isLoading:Vi,layout:aa,paths:ca,layoutHashes:Sa,loading:fa};return we(function(e){var r;t[e]=(r=e,function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1?arguments[1]:void 0,n=t;if(e.type===r){var o=e.payload,i=o.id,a={status:o.status,content:o.content};n=Array.isArray(i)?ve(i,a,t):i?be(i,a,t):ln(t,a)}return n})},Oa),t.callbackJobs=la,function(t){for(var e=Object.keys(t),r={},n=0;n1?r-1:0),o=1;on;){var a=t.charCodeAt(o-1);if(32!==a&&9!==a)break;o--}return t.slice(n,o)}function $a(t){if(-1===t.indexOf("%"))return t;try{return decodeURIComponent(t)}catch(e){return t}}var Wa=Ot(function(t){return function(){return t}}),za=function(t){return{value:t,map:function(e){return za(e(t))}}},Va=ae(function(t,e,r){return t(function(t){return za(e(t))})(r).value}),Ka=ae(function(t,e,r){return Va(t,Wa(e),r)});function Ya(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,o,i,a,u=[],c=!0,s=!1;try{if(i=(r=r.call(t)).next,0===e){if(Object(r)!==r)return;c=!1}else for(;!(c=(n=i.call(r)).done)&&(u.push(n.value),u.length!==e);c=!0);}catch(t){s=!0,o=t}finally{try{if(!c&&null!=r.return&&(a=r.return(),Object(a)!==a))return}finally{if(s)throw o}}return u}}(t,e)||function(t,e){if(t){if("string"==typeof t)return Qa(t,e);var r={}.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)?Qa(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 Qa(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r3?(o=y===n)&&(c=i[(u=i[4])?5:(u=3,3)],i[4]=i[5]=t):i[0]<=d&&((o=r<2&&dn||n>y)&&(i[4]=r,i[5]=n,p.n=y,u=0))}if(o||r>1)return a;throw f=!0,n}return function(o,l,y){if(s>1)throw TypeError("Generator is already running");for(f&&1===l&&d(l,y),u=l,c=y;(e=u<2?t:c)||!f;){i||(u?u<3?(u>1&&(p.n=-1),d(u,c)):p.n=c:p.v=c);try{if(s=2,i){if(u||(o="next"),e=i[o]){if(!(e=e.call(i,c)))throw TypeError("iterator result is not an object");if(!e.done)return e;c=e.value,u<2&&(u=0)}else 1===u&&(e=i.return)&&e.call(i),u<2&&(c=TypeError("The iterator does not provide a '"+o+"' method"),u=1);i=t}else if((e=(f=p.n<0)?c:r.call(n,p))!==a)break}catch(e){i=t,u=1,c=e}finally{s=1}}return{value:e,done:f}}}(r,o,i),!0),s}var a={};function u(){}function c(){}function s(){}e=Object.getPrototypeOf;var l=[][n]?e(e([][n]())):(wu(e={},n,function(){return this}),e),f=s.prototype=u.prototype=Object.create(l);function p(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,s):(t.__proto__=s,wu(t,o,"GeneratorFunction")),t.prototype=Object.create(f),t}return c.prototype=s,wu(f,"constructor",s),wu(s,"constructor",c),c.displayName="GeneratorFunction",wu(s,o,"GeneratorFunction"),wu(f),wu(f,o,"Generator"),wu(f,n,function(){return this}),wu(f,"toString",function(){return"[object Generator]"}),(gu=function(){return{w:i,m:p}})()}function wu(t,e,r,n){var o=Object.defineProperty;try{o({},"",{})}catch(t){o=0}wu=function(t,e,r,n){function i(e,r){wu(t,e,function(t){return this._invoke(e,r,t)})}e?o?o(t,e,{value:r,enumerable:!n,configurable:!n,writable:!n}):t[e]=r:(i("next",0),i("throw",1),i("return",2))},wu(t,e,r,n)}function Ou(t,e,r,n,o,i,a){try{var u=t[i](a),c=u.value}catch(t){return void r(t)}u.done?e(c):Promise.resolve(c).then(n,o)}function Su(t){return function(t){if(Array.isArray(t))return ju(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||function(t,e){if(t){if("string"==typeof t)return ju(t,e);var r={}.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)?ju(t,e):void 0}}(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function ju(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);ra)o=t.lastIndexOf(";",i-1)+1;else{var u=Ja(t,o,i);void 0===e[u]&&(e[u]=n(Ja(t,i+1,a))),o=a+1}}while(o3?(o=y===n)&&(c=i[(u=i[4])?5:(u=3,3)],i[4]=i[5]=t):i[0]<=d&&((o=r<2&&dn||n>y)&&(i[4]=r,i[5]=n,p.n=y,u=0))}if(o||r>1)return a;throw f=!0,n}return function(o,l,y){if(s>1)throw TypeError("Generator is already running");for(f&&1===l&&d(l,y),u=l,c=y;(e=u<2?t:c)||!f;){i||(u?u<3?(u>1&&(p.n=-1),d(u,c)):p.n=c:p.v=c);try{if(s=2,i){if(u||(o="next"),e=i[o]){if(!(e=e.call(i,c)))throw TypeError("iterator result is not an object");if(!e.done)return e;c=e.value,u<2&&(u=0)}else 1===u&&(e=i.return)&&e.call(i),u<2&&(c=TypeError("The iterator does not provide a '"+o+"' method"),u=1);i=t}else if((e=(f=p.n<0)?c:r.call(n,p))!==a)break}catch(e){i=t,u=1,c=e}finally{s=1}}return{value:e,done:f}}}(r,o,i),!0),s}var a={};function u(){}function c(){}function s(){}e=Object.getPrototypeOf;var l=[][n]?e(e([][n]())):(vc(e={},n,function(){return this}),e),f=s.prototype=u.prototype=Object.create(l);function p(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,s):(t.__proto__=s,vc(t,o,"GeneratorFunction")),t.prototype=Object.create(f),t}return c.prototype=s,vc(f,"constructor",s),vc(s,"constructor",c),c.displayName="GeneratorFunction",vc(s,o,"GeneratorFunction"),vc(f),vc(f,o,"Generator"),vc(f,n,function(){return this}),vc(f,"toString",function(){return"[object Generator]"}),(hc=function(){return{w:i,m:p}})()}function vc(t,e,r,n){var o=Object.defineProperty;try{o({},"",{})}catch(t){o=0}vc=function(t,e,r,n){function i(e,r){vc(t,e,function(t){return this._invoke(e,r,t)})}e?o?o(t,e,{value:r,enumerable:!n,configurable:!n,writable:!n}):t[e]=r:(i("next",0),i("throw",1),i("return",2))},vc(t,e,r,n)}function bc(t,e,r,n,o,i,a){try{var u=t[i](a),c=u.value}catch(t){return void r(t)}u.done?e(c):Promise.resolve(c).then(n,o)}var mc=jt(console.warn),gc={GET:function(t,e,r,n){return fetch(t,gi(e,{method:"GET",headers:Gu(n)}))},POST:function(t,e){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return fetch(t,gi(e,{method:"POST",headers:Gu(arguments.length>3?arguments[3]:void 0),body:r?JSON.stringify(r):null}))}};function wc(t,e,r,n,o){return function(){var i,a=(i=hc().m(function i(a,u){var c,s,l,f,p,d,y,h,v,b,m;return hc().w(function(i){for(;;)switch(i.p=i.n){case 0:d=function(t){u().error.backEndConnected!==t&&a({type:"SET_CONNECTION_STATUS",payload:t})},c=u(),s=c.config,l=c.hooks,f=null,p="".concat(Mn(s)).concat(t),a({type:r,payload:{id:n,status:"loading"}}),i.p=1,h=0;case 2:if(!(h<=1)){i.n=11;break}return i.p=3,i.n=4,gc[e](p,s.fetch,o,s);case 4:y=i.v,i.n=6;break;case 5:return i.p=5,i.v,console.log("fetch error",y),d(!1),i.a(2);case 6:if(401!==y.status&&400!==y.status){i.n=9;break}if(!l.request_refresh_jwt){i.n=9;break}return i.n=7,y.text();case 7:if(!i.v.includes(Ui)){i.n=9;break}return i.n=8,l.request_refresh_jwt(s.fetch.headers.Authorization.substr(7));case 8:if(!(v=i.v)){i.n=9;break}return f={Authorization:"Bearer ".concat(v)},s=gi(s,{fetch:{headers:f}}),i.a(3,10);case 9:return i.a(3,11);case 10:h++,i.n=2;break;case 11:if(b=y.headers.get("content-type"),f&&a(ku(f)),d(!0),!b||-1===b.indexOf("application/json")){i.n=12;break}return i.a(2,y.json().then(function(t){return a({type:r,payload:{status:y.status,content:t,id:n}}),t}));case 12:return i.n=13,y.text();case 13:return m=i.v,mc("Response is missing header: content-type: application/json"),i.a(2,a({type:r,payload:{id:n,status:y.status,content:m}}));case 14:i.p=14,Wu(i.v,"Error from API call: "+t,a);case 15:return i.a(2)}},i,null,[[3,5],[1,14]])}),function(){var t=this,e=arguments;return new Promise(function(r,n){var o=i.apply(t,e);function a(t){bc(o,r,n,a,u,"next",t)}function u(t){bc(o,r,n,a,u,"throw",t)}a(void 0)})});return function(t,e){return a.apply(this,arguments)}}()}function Oc(t){return Oc="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},Oc(t)}function Sc(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 jc(t){for(var e=1;e3?(o=y===n)&&(c=i[(u=i[4])?5:(u=3,3)],i[4]=i[5]=t):i[0]<=d&&((o=r<2&&dn||n>y)&&(i[4]=r,i[5]=n,p.n=y,u=0))}if(o||r>1)return a;throw f=!0,n}return function(o,l,y){if(s>1)throw TypeError("Generator is already running");for(f&&1===l&&d(l,y),u=l,c=y;(e=u<2?t:c)||!f;){i||(u?u<3?(u>1&&(p.n=-1),d(u,c)):p.n=c:p.v=c);try{if(s=2,i){if(u||(o="next"),e=i[o]){if(!(e=e.call(i,c)))throw TypeError("iterator result is not an object");if(!e.done)return e;c=e.value,u<2&&(u=0)}else 1===u&&(e=i.return)&&e.call(i),u<2&&(c=TypeError("The iterator does not provide a '"+o+"' method"),u=1);i=t}else if((e=(f=p.n<0)?c:r.call(n,p))!==a)break}catch(e){i=t,u=1,c=e}finally{s=1}}return{value:e,done:f}}}(r,o,i),!0),s}var a={};function u(){}function c(){}function s(){}e=Object.getPrototypeOf;var l=[][n]?e(e([][n]())):(xc(e={},n,function(){return this}),e),f=s.prototype=u.prototype=Object.create(l);function p(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,s):(t.__proto__=s,xc(t,o,"GeneratorFunction")),t.prototype=Object.create(f),t}return c.prototype=s,xc(f,"constructor",s),xc(s,"constructor",c),c.displayName="GeneratorFunction",xc(s,o,"GeneratorFunction"),xc(f),xc(f,o,"Generator"),xc(f,n,function(){return this}),xc(f,"toString",function(){return"[object Generator]"}),(Tc=function(){return{w:i,m:p}})()}function xc(t,e,r,n){var o=Object.defineProperty;try{o({},"",{})}catch(t){o=0}xc=function(t,e,r,n){function i(e,r){xc(t,e,function(t){return this._invoke(e,r,t)})}e?o?o(t,e,{value:r,enumerable:!n,configurable:!n,writable:!n}):t[e]=r:(i("next",0),i("throw",1),i("return",2))},xc(t,e,r,n)}function Ic(t,e,r,n,o,i,a){try{var u=t[i](a),c=u.value}catch(t){return void r(t)}u.done?e(c):Promise.resolve(c).then(n,o)}function Cc(t){return function(){var e=this,r=arguments;return new Promise(function(n,o){var i=t.apply(e,r);function a(t){Ic(i,n,o,a,u,"next",t)}function u(t){Ic(i,n,o,a,u,"throw",t)}a(void 0)})}}function Rc(t,e){var r="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!r){if(Array.isArray(t)||(r=function(t,e){if(t){if("string"==typeof t)return Dc(t,e);var r={}.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)?Dc(t,e):void 0}}(t))||e&&t&&"number"==typeof t.length){r&&(t=r);var n=0,o=function(){};return{s:o,n:function(){return n>=t.length?{done:!0}:{done:!1,value:t[n++]}},e:function(t){throw t},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,u=!1;return{s:function(){r=r.call(t)},n:function(){var t=r.next();return a=t.done,t},e:function(t){u=!0,i=t},f:function(){try{a||null==r.return||r.return()}finally{if(u)throw i}}}}function Dc(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r0&&void 0!==arguments[0]?arguments[0]:{};Uc(this,t),Gc(this,"localId",Bc()),Gc(this,"endId",""),Gc(this,"downlinkId",""),Gc(this,"pending",new Map),Gc(this,"counter",0),Gc(this,"cursor",0),Gc(this,"downlinkOpen",!1),Gc(this,"abort",null),Gc(this,"loopGen",0),Gc(this,"reconnectDelay",void 0),Gc(this,"maxReconnectDelay",void 0),Gc(this,"reconnectWindow",void 0),Gc(this,"fetchImpl",void 0),Gc(this,"_transport",{}),Gc(this,"wakeUp",null),Gc(this,"wokenForNewStream",!1),this.fetchImpl=null!==(e=i.fetchImpl)&&void 0!==e?e:fetch.bind(globalThis),this.reconnectDelay=null!==(r=i.reconnectDelay)&&void 0!==r?r:1e3,this.maxReconnectDelay=null!==(n=i.maxReconnectDelay)&&void 0!==n?n:5e3,this.reconnectWindow=null!==(o=i.reconnectWindow)&&void 0!==o?o:3e4,this.configure(i)},[{key:"configure",value:function(t){t.mode&&(this._transport.mode=t.mode),"number"==typeof t.pollInterval&&(this._transport.pollInterval=t.pollInterval)}},{key:"transport",get:function(){return Mc({},this._transport)}},{key:"activeCount",get:function(){return this.pending.size}},{key:"connectionEndId",get:function(){return this.endId}},{key:"streamUrl",value:function(t){if(!this.endId)return t;var e=t.includes("?")?"&":"?";return"".concat(t).concat(e,"endId=").concat(encodeURIComponent(this.endId))+"&downlinkId=".concat(encodeURIComponent(this.downlinkId))}},{key:"run",value:function(t,e,r,n,o){return this.start(t,e,r,n,o).settled}},{key:"start",value:function(t,e,r,n,o){var i=this;0!==this.pending.size&&this.endId||(this.endId=r||"",this.downlinkId=Bc(),this.cursor=0);var a="".concat(this.localId,"-").concat(++this.counter),u=new Promise(function(t,e){i.pending.set(a,{onFrame:o,resolve:t,reject:e,acked:!1,gotFrame:!1})});return this.fetchImpl(this.streamUrl(t),Mc(Mc({},e),{},{method:"POST",body:JSON.stringify(Mc(Mc({},n),{},{streamConnection:{requestId:a}}))})).then(function(r){return i.checkUplink(a,r,t,e)}).catch(function(t){return i.fail(a,t)}),{requestId:a,settled:u}}},{key:"cancel",value:function(t,e,r){var n=this.pending.get(t);n&&(this.pending.delete(t),n.reject(new Error("Streaming callback cancelled")),this.fetchImpl(this.streamUrl(e),Mc(Mc({},r),{},{method:"POST",body:JSON.stringify({streamCancel:{requestId:t}})})).catch(function(){}),this.stopDownlinkIfIdle())}},{key:"checkUplink",value:function(t,e,r,n){if(e.ok){var o,i=this.pending.get(t);i&&(i.acked=!0,this.ensureDownlink(r,n),this.wokenForNewStream=!0,null===(o=this.wakeUp)||void 0===o||o.call(this))}else this.fail(t,new Error("stream uplink responded ".concat(e.status)))}},{key:"hasAcked",value:function(){var t,e=Rc(this.pending.values());try{for(e.s();!(t=e.n()).done;)if(t.value.acked)return!0}catch(t){e.e(t)}finally{e.f()}return!1}},{key:"dispatchEnvelope",value:function(t){if(t.reset)return this.cursor=0,void this.settleAll(new Error("stream reset: the server lost this connection (restart or owner change)"));if("number"==typeof t.seq&&(this.cursor=t.seq),void 0!==t.rid&&void 0!==t.frame){var e=this.pending.get(t.rid);if(e){var r=t.frame;r.done?(this.pending.delete(t.rid),r.error?e.reject(new Error(r.error.message||"Streaming callback error")):e.resolve(),this.stopDownlinkIfIdle()):(e.gotFrame=!0,e.onFrame(r))}}}},{key:"settleAll",value:function(t){var e=Array.from(this.pending.values());this.pending.clear(),this.closeDownlink(),e.forEach(function(e){return e.gotFrame?e.resolve():e.reject(t)})}},{key:"fail",value:function(t,e){var r=this.pending.get(t);r&&(this.pending.delete(t),r.reject(e),this.stopDownlinkIfIdle())}},{key:"stopDownlinkIfIdle",value:function(){this.downlinkOpen&&!this.hasAcked()&&this.closeDownlink()}},{key:"closeDownlink",value:function(){var t,e=this.abort;this.abort=null,this.downlinkOpen=!1,this.loopGen++,null===(t=this.wakeUp)||void 0===t||t.call(this),e&&e.abort()}},{key:"ensureDownlink",value:function(t,e){this.downlinkOpen||(this.downlinkOpen=!0,this.readLoop(t,e,++this.loopGen))}},{key:"readLoop",value:(e=Cc(Tc().m(function t(e,r,n){var o,i,a,u,c,s,l,f,p,d;return Tc().w(function(t){for(;;)switch(t.p=t.n){case 0:i="poll"===this._transport.mode,a=null!==(o=this._transport.pollInterval)&&void 0!==o?o:100,u=a,c=0,s=null,l=this.reconnectDelay;case 1:if(!this.hasAcked()||this.loopGen!==n){t.n=14;break}return this.wokenForNewStream&&(this.wokenForNewStream=!1,c=0,u=a),this.abort=new AbortController,f=0,t.p=2,t.n=3,this.fetchImpl(this.streamUrl(e),Mc(Mc({},r),{},{method:"POST",signal:this.abort.signal,body:JSON.stringify({streamDownlink:{from:this.cursor}})}));case 3:if(!((p=t.v).status>=400&&p.status<500)){t.n=4;break}return this.settleAll(new Error("stream downlink responded ".concat(p.status))),t.a(3,14);case 4:if(p.ok&&p.body){t.n=5;break}throw new Error("downlink responded ".concat(p.status));case 5:return t.n=6,this.consume(p.body,n);case 6:if(0!==(f=t.v)||i){t.n=7;break}throw new Error("downlink closed without data");case 7:s=null,l=this.reconnectDelay,t.n=12;break;case 8:if(t.p=8,t.v,this.hasAcked()&&this.loopGen===n){t.n=9;break}return t.a(3,14);case 9:if(!((d=Date.now())-(s=null!=s?s:d)>=this.reconnectWindow)){t.n=10;break}return this.settleAll(new Error("stream downlink lost: could not reconnect to the server")),t.a(3,14);case 10:return t.n=11,Hc(l);case 11:return l=Math.min(2*l,this.maxReconnectDelay),t.a(3,1);case 12:if(!i||!this.hasAcked()||this.loopGen!==n){t.n=13;break}return f?(c=0,u=a):++c>2&&(u=Math.min(2*u,5*a)),t.n=13,this.pause(u);case 13:t.n=1;break;case 14:this.loopGen===n&&(this.downlinkOpen=!1,this.abort=null);case 15:return t.a(2)}},t,this,[[2,8]])})),function(t,r,n){return e.apply(this,arguments)})},{key:"pause",value:function(t){var e=this;return new Promise(function(r){var n=setTimeout(function(){e.wakeUp=null,r()},t);e.wakeUp=function(){clearTimeout(n),e.wakeUp=null,r()}})}},{key:"consume",value:(t=Cc(Tc().m(function t(e,r){var n,o,i,a,u,c,s,l,f;return Tc().w(function(t){for(;;)switch(t.n){case 0:n=e.getReader(),o=new TextDecoder,i="",a=0;case 1:return t.n=2,n.read();case 2:if(u=t.v,c=u.done,s=u.value,!c){t.n=3;break}return t.a(2,a);case 3:i+=o.decode(s,{stream:!0}),l=void 0;case 4:if(!((l=i.indexOf("\n"))>=0)){t.n=7;break}if(f=i.slice(0,l),i=i.slice(l+1),f.trim()){t.n=5;break}return t.a(3,4);case 5:if(this.loopGen===r){t.n=6;break}return t.a(2,a);case 6:a++,this.dispatchEnvelope(JSON.parse(f)),t.n=4;break;case 7:t.n=1;break;case 8:return t.a(2)}},t,this)})),function(e,r){return t.apply(this,arguments)})}]);var t,e}(),$c=function(){return Lc(function t(e){var r,n=this,o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:kc(),i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Uc(this,t),Gc(this,"pending",new Map),Gc(this,"counter",0),Gc(this,"port",void 0),Gc(this,"rendererId",void 0),Gc(this,"transport",void 0),Gc(this,"_broken",!1),this.port=e,this.rendererId=o,this.transport=i,e.onmessage=function(t){return n.handleMessage(t.data)},null===(r=e.start)||void 0===r||r.call(e)},[{key:"broken",get:function(){return this._broken}},{key:"activeCount",get:function(){return this.pending.size}},{key:"run",value:function(t,e,r,n,o){var i=this,a="".concat(this.rendererId,"-").concat(++this.counter);return new Promise(function(u,c){i.pending.set(a,{onFrame:o,resolve:u,reject:c,acked:!1,gotFrame:!1});var s={type:"stream",rendererId:i.rendererId,requestId:a,url:t,init:e,endId:r||"",payload:n,transport:i.transport};i.port.postMessage(s)})}},{key:"release",value:function(){var t={type:"unregister",rendererId:this.rendererId};this.port.postMessage(t)}},{key:"fail",value:function(t){this._broken=!0;var e,r=Rc(this.pending.values());try{for(r.s();!(e=r.n()).done;)e.value.reject(t)}catch(t){r.e(t)}finally{r.f()}this.pending.clear()}},{key:"handleMessage",value:function(t){var e=this.pending.get(t.requestId);e&&("frame"!==t.type?(this.pending.delete(t.requestId),"done"===t.type?e.resolve():e.reject(new Error(t.message))):e.onFrame(t.frame))}}])}(),Wc=null;function zc(){var t,e,r,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(Wc instanceof $c&&Wc.broken&&(Wc=null),Wc)return Wc;var o={mode:null===(t=n.stream)||void 0===t?void 0:t.mode,pollInterval:null===(e=n.stream)||void 0===e?void 0:e.poll_interval},i=null===(r=n.stream)||void 0===r?void 0:r.worker_url;if(i&&"undefined"!=typeof SharedWorker)try{var a=new SharedWorker(i,{name:"dash-stream-worker"}),u=new $c(a.port,kc(),o);return a.onerror=function(){return u.fail(new Error("Dash stream worker failed"))},window.addEventListener("pagehide",function(){return u.release()}),Wc=u}catch(t){}return Wc=new Jc(o)}function Vc(t){var e;return!(null===(e=t.stream)||void 0===e||!e.enabled)}function Kc(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r=t.length?{done:!0}:{done:!1,value:t[n++]}},e:function(t){throw t},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,u=!1;return{s:function(){r=r.call(t)},n:function(){var t=r.next();return a=t.done,t},e:function(t){u=!0,i=t},f:function(){try{a||null==r.return||r.return()}finally{if(u)throw i}}}}function os(t,e){if(t){if("string"==typeof t)return is(t,e);var r={}.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)?is(t,e):void 0}}function is(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r3?(o=y===n)&&(c=i[(u=i[4])?5:(u=3,3)],i[4]=i[5]=t):i[0]<=d&&((o=r<2&&dn||n>y)&&(i[4]=r,i[5]=n,p.n=y,u=0))}if(o||r>1)return a;throw f=!0,n}return function(o,l,y){if(s>1)throw TypeError("Generator is already running");for(f&&1===l&&d(l,y),u=l,c=y;(e=u<2?t:c)||!f;){i||(u?u<3?(u>1&&(p.n=-1),d(u,c)):p.n=c:p.v=c);try{if(s=2,i){if(u||(o="next"),e=i[o]){if(!(e=e.call(i,c)))throw TypeError("iterator result is not an object");if(!e.done)return e;c=e.value,u<2&&(u=0)}else 1===u&&(e=i.return)&&e.call(i),u<2&&(c=TypeError("The iterator does not provide a '"+o+"' method"),u=1);i=t}else if((e=(f=p.n<0)?c:r.call(n,p))!==a)break}catch(e){i=t,u=1,c=e}finally{s=1}}return{value:e,done:f}}}(r,o,i),!0),s}var a={};function u(){}function c(){}function s(){}e=Object.getPrototypeOf;var l=[][n]?e(e([][n]())):(us(e={},n,function(){return this}),e),f=s.prototype=u.prototype=Object.create(l);function p(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,s):(t.__proto__=s,us(t,o,"GeneratorFunction")),t.prototype=Object.create(f),t}return c.prototype=s,us(f,"constructor",s),us(s,"constructor",c),c.displayName="GeneratorFunction",us(s,o,"GeneratorFunction"),us(f),us(f,o,"Generator"),us(f,n,function(){return this}),us(f,"toString",function(){return"[object Generator]"}),(as=function(){return{w:i,m:p}})()}function us(t,e,r,n){var o=Object.defineProperty;try{o({},"",{})}catch(t){o=0}us=function(t,e,r,n){function i(e,r){us(t,e,function(t){return this._invoke(e,r,t)})}e?o?o(t,e,{value:r,enumerable:!n,configurable:!n,writable:!n}):t[e]=r:(i("next",0),i("throw",1),i("return",2))},us(t,e,r,n)}function cs(t,e,r,n,o,i,a){try{var u=t[i](a),c=u.value}catch(t){return void r(t)}u.done?e(c):Promise.resolve(c).then(n,o)}function ss(t){return function(){var e=this,r=arguments;return new Promise(function(n,o){var i=t.apply(e,r);function a(t){cs(i,n,o,a,u,"next",t)}function u(t){cs(i,n,o,a,u,"throw",t)}a(void 0)})}}function ls(t,e){for(var r=0;r=t.length?{done:!0}:{done:!1,value:t[n++]}},e:function(t){throw t},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,u=!1;return{s:function(){r=r.call(t)},n:function(){var t=r.next();return a=t.done,t},e:function(t){u=!0,i=t},f:function(){try{a||null==r.return||r.return()}finally{if(u)throw i}}}}function ws(){var t,e,r="function"==typeof Symbol?Symbol:{},n=r.iterator||"@@iterator",o=r.toStringTag||"@@toStringTag";function i(r,n,o,i){var c=n&&n.prototype instanceof u?n:u,s=Object.create(c.prototype);return Os(s,"_invoke",function(r,n,o){var i,u,c,s=0,l=o||[],f=!1,p={p:0,n:0,v:t,a:d,f:d.bind(t,4),d:function(e,r){return i=e,u=0,c=t,p.n=r,a}};function d(r,n){for(u=r,c=n,e=0;!f&&s&&!o&&e3?(o=y===n)&&(c=i[(u=i[4])?5:(u=3,3)],i[4]=i[5]=t):i[0]<=d&&((o=r<2&&dn||n>y)&&(i[4]=r,i[5]=n,p.n=y,u=0))}if(o||r>1)return a;throw f=!0,n}return function(o,l,y){if(s>1)throw TypeError("Generator is already running");for(f&&1===l&&d(l,y),u=l,c=y;(e=u<2?t:c)||!f;){i||(u?u<3?(u>1&&(p.n=-1),d(u,c)):p.n=c:p.v=c);try{if(s=2,i){if(u||(o="next"),e=i[o]){if(!(e=e.call(i,c)))throw TypeError("iterator result is not an object");if(!e.done)return e;c=e.value,u<2&&(u=0)}else 1===u&&(e=i.return)&&e.call(i),u<2&&(c=TypeError("The iterator does not provide a '"+o+"' method"),u=1);i=t}else if((e=(f=p.n<0)?c:r.call(n,p))!==a)break}catch(e){i=t,u=1,c=e}finally{s=1}}return{value:e,done:f}}}(r,o,i),!0),s}var a={};function u(){}function c(){}function s(){}e=Object.getPrototypeOf;var l=[][n]?e(e([][n]())):(Os(e={},n,function(){return this}),e),f=s.prototype=u.prototype=Object.create(l);function p(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,s):(t.__proto__=s,Os(t,o,"GeneratorFunction")),t.prototype=Object.create(f),t}return c.prototype=s,Os(f,"constructor",s),Os(s,"constructor",c),c.displayName="GeneratorFunction",Os(s,o,"GeneratorFunction"),Os(f),Os(f,o,"Generator"),Os(f,n,function(){return this}),Os(f,"toString",function(){return"[object Generator]"}),(ws=function(){return{w:i,m:p}})()}function Os(t,e,r,n){var o=Object.defineProperty;try{o({},"",{})}catch(t){o=0}Os=function(t,e,r,n){function i(e,r){Os(t,e,function(t){return this._invoke(e,r,t)})}e?o?o(t,e,{value:r,enumerable:!n,configurable:!n,writable:!n}):t[e]=r:(i("next",0),i("throw",1),i("return",2))},Os(t,e,r,n)}function Ss(t,e,r,n,o,i,a){try{var u=t[i](a),c=u.value}catch(t){return void r(t)}u.done?e(c):Promise.resolve(c).then(n,o)}function js(t){return function(){var e=this,r=arguments;return new Promise(function(n,o){var i=t.apply(e,r);function a(t){Ss(i,n,o,a,u,"next",t)}function u(t){Ss(i,n,o,a,u,"throw",t)}a(void 0)})}}function _s(t){return function(t){if(Array.isArray(t))return ks(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||Ps(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Es(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,o,i,a,u=[],c=!0,s=!1;try{if(i=(r=r.call(t)).next,0===e){if(Object(r)!==r)return;c=!1}else for(;!(c=(n=i.call(r)).done)&&(u.push(n.value),u.length!==e);c=!0);}catch(t){s=!0,o=t}finally{try{if(!c&&null!=r.return&&(a=r.return(),Object(a)!==a))return}finally{if(s)throw o}}return u}}(t,e)||Ps(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 Ps(t,e){if(t){if("string"==typeof t)return ks(t,e);var r={}.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)?ks(t,e):void 0}}function ks(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r5&&void 0!==arguments[5]&&arguments[5],a="Input"===o?r.getInputs:r.getState,u=[],c=0,s=a(t).map(function(i,a){var s=Es(Qs(t,i.map(function(t){var r=t.id,n=t.property,o=t.path;return{id:r,property:n,value:Oe([].concat(_s(o),["props",n]),e)}}),n[a],r.anyVals,o),2),l=s[0],f=s[1];return Io(n[a])&&!l.length&&c++,f&&u.push(f),l});if(u.length){if(i&&u.length+c===s.length)return null;Zs(u,t)}return s}function Zs(t,e){var r=t[0];throw-1!==r.indexOf("logged above")&&console.error(e.objs),new ReferenceError(r)}var tl=function(t){return Array.isArray(t)?Pr("value",t):t.value},el=function(t,e){return Array.isArray(t)?e===window.dash_clientside.no_update?Br(t,[e]):Br(t,e):[[t,e]]};function rl(t){return t.split("@")[0]}function nl(t){return Yt(t).length?{patchedOutputs:t}:{}}function ol(t,e,r,n){var o={};return He(t).forEach(function(t){var i=rl(t.property),a=Wn(e,t.id),u=vo(t.id),c=[u,i],s=Oe(c,n);if(void 0!==s){nc(s)&&(o[u]=o[u]||{patchedProps:{},freshIds:{},writtenProps:{},tailAppends:{}});var l=Oe(a.concat(["props"]),r)||{},f=yc({[i]:s},l,o[u]);n=ve(c,f[i],n)}}),{data:n,patchedOutputs:o}}function il(t,e,r,n){return al.apply(this,arguments)}function al(){return al=js(ws().m(function t(e,r,n,o){var i,a,u,c,s,l,f,p,d,y,h,v,b,m,g,w,O,S;return ws().w(function(t){for(;;)switch(t.p=t.n){case 0:if((i=window.dash_clientside=window.dash_clientside||{}).no_update||(Object.defineProperty(i,"no_update",{value:{description:"Return to prevent updating an Output."},writable:!1}),Object.defineProperty(i,"PreventUpdate",{value:{description:"Throw to prevent updating all Outputs."},writable:!1})),a=o.inputs,u=o.outputs,c=o.state,s=Date.now(),l=yl(a),f=yl(c),p={},d=qi,t.p=1,v=r.namespace,b=r.function_name,m=a.map(tl),c&&(m=mr(m,c.map(tl))),i.callback_context={},i.callback_context.triggered=o.changedPropIds.map(function(t){return{prop_id:t,value:l[t]}}),i.callback_context.triggered_id=hl(o.changedPropIds),i.callback_context.inputs_list=a,i.callback_context.inputs=l,i.callback_context.states_list=c,i.callback_context.states=f,i.callback_context.outputs_list=u,g=(y=i[v])[b].apply(y,_s(m)),delete i.callback_context,"function"!=typeof(null===(h=g)||void 0===h?void 0:h.then)){t.n=3;break}return t.n=2,g;case 2:g=t.v;case 3:u&&el(u,g).forEach(function(t){var e=Es(t,2),r=e[0],n=e[1];el(r,n).forEach(function(t){var e=Es(t,2),r=e[0],n=e[1],o=r.id,a=r.property,u=vo(o),c=p[u]=p[u]||{};n!==i.no_update&&(c[rl(a)]=n)})}),t.n=6;break;case 4:if(t.p=4,(S=t.v)!==i.PreventUpdate){t.n=5;break}d=Li,t.n=6;break;case 5:throw d="CLIENTSIDE_ERROR",S;case 6:return t.p=6,delete i.callback_context,w=Date.now()-s,O={__dash_server:w,__dash_client:w,__dash_upload:0,__dash_download:0},n.ui&&e(zs({id:o.output,usage:O,status:d,result:p,inputs:a,state:c})),t.f(6);case 7:return t.a(2,p)}},t,null,[[1,4,6,7]])})),al.apply(this,arguments)}function ul(t,e){return function(r,n){Da(t).reduce(function(t,r,o){var i,a=Es(r,2),u=a[0],c=a[1],s=u,l=[];if(u.startsWith("{")){var f=Es(Yc(u),2);s=f[0],i=f[1],l=function(t,e,r,n){var o=[],i={};return Da(t).forEach(function(a){var u,c,s=(c=2,function(t){if(Array.isArray(t))return t}(u=a)||function(t,e){var r=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=r){var n,o,i,a,u=[],c=!0,s=!1;try{if(i=(r=r.call(t)).next,0===e){if(Object(r)!==r)return;c=!1}else for(;!(c=(n=i.call(r)).done)&&(u.push(n.value),u.length!==e);c=!0);}catch(t){s=!0,o=t}finally{try{if(!c&&null!=r.return&&(a=r.return(),Object(a)!==a))return}finally{if(s)throw o}}return u}}(u,c)||function(t,e){if(t){if("string"==typeof t)return Kc(t,e);var r={}.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)?Kc(t,e):void 0}}(u,c)||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.")}()),l=s[0],f=s[1];if(!o.length)if(Array.isArray(f)){var p=(e.parsedChangedPropsIds[r]||e.parsedChangedPropsIds[0])[l];f.includes("MATCH")?i[l]=p:f.includes("ALL")?o=Qc(t,n(),l):f.includes("ALLSMALLER")&&(o=Qc(t,n(),l).filter(function(t){return t[l]s)){t.n=4;break}return t.p=1,y=new Blob([o]).stream().pipeThrough(new CompressionStream("gzip")),t.n=2,new Response(y).blob();case 2:d=t.v,e["Content-Encoding"]="gzip",t.n=4;break;case 3:t.p=3,b=t.v,console.warn("Sending uncompressed payload, because compressing failed:",b);case 4:return t.a(2,fetch(n,gi(r.fetch,{method:"POST",headers:e,body:d})))}},t,null,[[1,3]])}));return function(){return t.apply(this,arguments)}}();return new Promise(function(i,u){var c=function(c){var s=c.status;if(f){var b=a().callbackJobs[f];if(null!=b&&b.outdated)return t(Ks({jobId:f})),i({})}function m(e){if(r.ui){var o={__dash_server:0,__dash_client:Date.now()-y,__dash_upload:h.length,__dash_download:Number(c.headers.get("Content-Length"))};(c.headers.get("Server-Timing")||"").split(",").forEach(function(t){var e=t.split(";")[0],r=t.match(/;dur=[0-9.]+/);r&&(o[e]=Number(r[0].slice(5)))}),t(zs({id:n.output,usage:o,status:s,result:e,inputs:n.inputs,state:n.state}))}}var g=function(t){var r,o=t.multi,a=t.response;if(e.request_post&&e.request_post(n,a),o)r=a;else{var u=n.output,c=u.substr(0,u.lastIndexOf("."));r={[c]:a.props}}m(r),i(r)},w=function(){f&&t(Ks({jobId:f})),p&&t(ul(p,n)),d&&t(ul(d,n))},O=function(){var r=js(ws().m(function r(o){var a,c,s,l,f,p,d,y,h,v,b,g,O,S,j;return ws().w(function(r){for(;;)switch(r.p=r.n){case 0:a=o.body.getReader(),c=new TextDecoder,s="",f=!1,p=function(){var r=js(ws().m(function r(o){return ws().w(function(r){for(;;)switch(r.n){case 0:if(!o.done){r.n=2;break}if(f=!0,w(),!o.error){r.n=1;break}return m({}),u(new Error(o.error.message||"Callback error")),r.a(2);case 1:return e.request_post&&e.request_post(n,l),m(l||{}),i({}),r.a(2);case 2:if(!o.dist){r.n=3;break}return r.n=3,Promise.all(o.dist.map(Ec));case 3:l=o.response,cl(t,o,n);case 4:return r.a(2)}},r)}));return function(t){return r.apply(this,arguments)}}(),r.p=1;case 2:return r.n=3,a.read();case 3:if(d=r.v,y=d.done,h=d.value,!y){r.n=4;break}return r.a(3,14);case 4:s+=c.decode(h,{stream:!0}),v=s.split("\n"),s=v.pop(),b=gs(v),r.p=5,b.s();case 6:if((g=b.n()).done){r.n=10;break}if((O=g.value).trim()){r.n=7;break}return r.a(3,9);case 7:return r.n=8,p(JSON.parse(O));case 8:if(!f){r.n=9;break}return a.cancel(),r.a(2);case 9:r.n=6;break;case 10:r.n=12;break;case 11:r.p=11,S=r.v,b.e(S);case 12:return r.p=12,b.f(),r.f(12);case 13:r.n=2;break;case 14:if(!s.trim()||f){r.n=15;break}return r.n=15,p(JSON.parse(s));case 15:r.n=17;break;case 16:if(r.p=16,j=r.v,f){r.n=17;break}return f=!0,w(),l?(m(l),i({})):(m({}),u(j)),r.a(2);case 17:f||(w(),m(l||{}),i({}));case 18:return r.a(2)}},r,null,[[5,11,12,13],[1,16]])}));return function(t){return r.apply(this,arguments)}}();if(s===qi){if((c.headers.get("Content-Type")||"").includes("application/x-ndjson")&&c.body)return void O(c);c.json().then(function(e){if(!l&&e.cacheKey&&(l=e.cacheKey),!f&&e.job){var r={jobId:e.job,cacheKey:e.cacheKey,cancelInputs:e.cancel,progressDefault:e.progressDefault,output:JSON.stringify(n.outputs)};t(Vs(r)),f=e.job}e.sideUpdate&&t(ul(e.sideUpdate,n)),e.progress&&t(ul(e.progress,n)),!d&&e.progressDefault&&(d=e.progressDefault),o&&void 0===e.response?setTimeout(v,void 0!==o.interval?o.interval:500):e.dist?Promise.all(e.dist.map(Ec)).then(function(){w(),g(e)}):(w(),g(e))})}else s===Li?(w(),m({}),i({})):(w(),u(c))},s=function(){r.ui&&t(zs({id:n.output,status:Gi,result:{},inputs:n.inputs,state:n.state})),u(new Error("Callback failed: the server did not respond."))},v=function(){b().then(c,s)};v()})}function pl(t,e,r,n,o){return dl.apply(this,arguments)}function dl(){return dl=js(ws().m(function t(e,r,n,o,i){var a,u,c,s,l,f,p,d,y,h,v,b,m,g,w,O;return ws().w(function(t){for(;;)switch(t.p=t.n){case 0:return r.request_pre&&r.request_pre(o),a=Date.now(),i&&(e(ul(i.running,o)),u=i.runningOff),c=hs(),t.p=1,t.n=2,c.ensureConnected(n);case 2:return t.n=3,c.sendCallback(o,function(t){s=null==t?void 0:t.response,cl(e,t,o)});case 3:if(l=t.v,u&&e(ul(u,o)),"prevent_update"!==l.status){t.n=4;break}return n.ui&&(f=Date.now()-a,e(zs({id:o.output,usage:{__dash_server:f,__dash_client:f,__dash_upload:0,__dash_download:0},status:Li,result:{},inputs:o.inputs,state:o.state}))),t.a(2,{});case 4:if("error"!==l.status){t.n=5;break}throw new Error(l.message||"Callback error");case 5:if(!l.stream){t.n=6;break}return r.request_post&&r.request_post(o,s),n.ui&&(p=Date.now()-a,e(zs({id:o.output,usage:{__dash_server:p,__dash_client:p,__dash_upload:0,__dash_download:0},status:qi,result:s||{},inputs:o.inputs,state:o.state}))),t.a(2,{});case 6:return null!=(d=l.data)&&d.sideUpdate&&e(ul(d.sideUpdate,o)),v=(h=d||{}).multi,b=h.response,r.request_post&&r.request_post(o,b),v?y=b:(m=o.output,g=m.substr(0,m.lastIndexOf(".")),y={[g]:null==b?void 0:b.props}),n.ui&&(w=Date.now()-a,e(zs({id:o.output,usage:{__dash_server:w,__dash_client:w,__dash_upload:0,__dash_download:0},status:qi,result:y||{},inputs:o.inputs,state:o.state}))),t.a(2,y||{});case 7:throw t.p=7,O=t.v,u&&e(ul(u,o)),n.ui&&e(zs({id:o.output,status:Gi,result:{},inputs:o.inputs,state:o.state})),O;case 8:return t.a(2)}},t,null,[[1,7]])})),dl.apply(this,arguments)}function yl(t){if(!t)return{};for(var e={},r=0;rt.length)&&(e=t.length);for(var r=0,n=Array(e);r3&&void 0!==arguments[3]&&arguments[3],c=arguments.length>4?arguments[4]:void 0,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:null,f=r().paths,d=s?s.location.length?Oe(s.location,t):t:void 0,y=s?s.location.length?Oe(s.location,n):n:void 0,h=!!s&&s.count>0&&Array.isArray(d)&&Array.isArray(y)&&d.length===y.length+s.count,v=h&&s?function(t,e,r,n){var o=Bn({},n.strs),i=Bn({},n.objs),a={},u=n.objIndex?Bn({},n.objIndex):null;return t.forEach(function(t,n){qn(t,function(t,i){var u=t.props&&t.props.id;if(u){var c=mr(e,[r+n]).concat(i);if("object"===Gn(u)){var s=Object.keys(u).sort(),l=Ie(s,u),f=s.join(",");(a[f]=a[f]||[]).push({values:l,path:c})}else o[u]=c}})}),Object.keys(a).forEach(function(t){if(i[t]=mr(i[t]||[],a[t]),u){var e=Bn({},u[t]||{});a[t].forEach(function(t){var r=t.values,n=t.path,o=Jn(r);o in e||(e[o]=n)}),u[t]=e}}),Bn(Bn({strs:o,objs:i},u?{objIndex:u}:{}),{},{events:n.events})}(d.slice(y.length),i.concat(s.location),y.length,f):$n(t,i,f);e(Iu(v)),o=mr(o,Yo(l,v,t,{chunkPath:i,patchAnalysis:c,filterRoot:u}).map(function(t){return gl(gl({},t),{},{predecessors:a})})),h||(o=mr(o,Yo(l,p,n,{removedArrayInputsOnly:!0,newPaths:v,chunkPath:i,filterRoot:u}).map(function(t){return gl(gl({},t),{},{predecessors:a})})))},w=!1;["children"].concat(m).forEach(function(t){var e,r;if(!w)if(t.includes("[]")){var n=Ol(t.split("[]").map(function(t){return t.split(".").filter(function(t){return t})}),1)[0];if(!Oe(n,h))return;g(gl(gl({},b),{},{props:gl(gl({},b.props),h)}),b,v,Yt(h),(e=d,r=Yt(u),e&&r.length&&r.every(function(t){return e.patchedProps[t]})?e:void 0)),w=!0}else{var o=t.split("."),i=Oe(o,h);if(!i)return;var a=mr(Wn(p,c),["props"].concat(o)),s=Oe(a,f),l=Vn(d,o[0]);g(i,s,a,!1,l,1===o.length?function(t,e){var r=null==t?void 0:t.tailAppends[e];return r&&"object"===zn(r)?r:null}(l,o[0]):null)}});var O=Nr(function(t,e){return!(e in u)},h);if(!Ee(O)){var S=r(),j=S.graphs,_=S.paths;o=mr(o,Xo(i,O,j,_).map(function(t){return gl(gl({},t),{},{predecessors:a})}))}}}),i.push(gl(gl({},t),{},{executionMeta:{allProps:Qe(Wo,He(t.getOutputs(r().paths))),updatedProps:He(Qe(function(t){var e=Ol(t,2),r=e[0],n=e[1];return Qe(function(t){return Wo({id:r,property:t})},Yt(n))},Da(f)))}}))),void 0!==p){var h;if(t.callback.no_output){var v=Yt(t.changedPropIds).join(", ");h="Callback error with no output from input ".concat(v)}else{var b=d?Qe(Wo,He([d.outputs])).join(", "):s;h="Callback error updating ".concat(b)}if(c){var m=c.namespace,g=c.function_name;h+=" via clientside function ".concat(m,".").concat(g)}Wu(p,h,e),i.push(gl(gl({},t),{},{executionMeta:{allProps:Qe(Wo,He(t.getOutputs(r().paths))),updatedProps:[]}}))}}}),e(Ws([n.length?Ls(n):null,n.length?Cs(n.length):null,i.length?Us(i):null,o.length?Ms(o):null]))},inputs:["callbacks.executed"]},_l=jl;function El(t){return El="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},El(t)}function Pl(){var t,e,r="function"==typeof Symbol?Symbol:{},n=r.iterator||"@@iterator",o=r.toStringTag||"@@toStringTag";function i(r,n,o,i){var c=n&&n.prototype instanceof u?n:u,s=Object.create(c.prototype);return kl(s,"_invoke",function(r,n,o){var i,u,c,s=0,l=o||[],f=!1,p={p:0,n:0,v:t,a:d,f:d.bind(t,4),d:function(e,r){return i=e,u=0,c=t,p.n=r,a}};function d(r,n){for(u=r,c=n,e=0;!f&&s&&!o&&e3?(o=y===n)&&(c=i[(u=i[4])?5:(u=3,3)],i[4]=i[5]=t):i[0]<=d&&((o=r<2&&dn||n>y)&&(i[4]=r,i[5]=n,p.n=y,u=0))}if(o||r>1)return a;throw f=!0,n}return function(o,l,y){if(s>1)throw TypeError("Generator is already running");for(f&&1===l&&d(l,y),u=l,c=y;(e=u<2?t:c)||!f;){i||(u?u<3?(u>1&&(p.n=-1),d(u,c)):p.n=c:p.v=c);try{if(s=2,i){if(u||(o="next"),e=i[o]){if(!(e=e.call(i,c)))throw TypeError("iterator result is not an object");if(!e.done)return e;c=e.value,u<2&&(u=0)}else 1===u&&(e=i.return)&&e.call(i),u<2&&(c=TypeError("The iterator does not provide a '"+o+"' method"),u=1);i=t}else if((e=(f=p.n<0)?c:r.call(n,p))!==a)break}catch(e){i=t,u=1,c=e}finally{s=1}}return{value:e,done:f}}}(r,o,i),!0),s}var a={};function u(){}function c(){}function s(){}e=Object.getPrototypeOf;var l=[][n]?e(e([][n]())):(kl(e={},n,function(){return this}),e),f=s.prototype=u.prototype=Object.create(l);function p(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,s):(t.__proto__=s,kl(t,o,"GeneratorFunction")),t.prototype=Object.create(f),t}return c.prototype=s,kl(f,"constructor",s),kl(s,"constructor",c),c.displayName="GeneratorFunction",kl(s,o,"GeneratorFunction"),kl(f),kl(f,o,"Generator"),kl(f,n,function(){return this}),kl(f,"toString",function(){return"[object Generator]"}),(Pl=function(){return{w:i,m:p}})()}function kl(t,e,r,n){var o=Object.defineProperty;try{o({},"",{})}catch(t){o=0}kl=function(t,e,r,n){function i(e,r){kl(t,e,function(t){return this._invoke(e,r,t)})}e?o?o(t,e,{value:r,enumerable:!n,configurable:!n,writable:!n}):t[e]=r:(i("next",0),i("throw",1),i("return",2))},kl(t,e,r,n)}function Al(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 Tl(t){for(var e=1;et.length)&&(e=t.length);for(var r=0,n=Array(e);rt.length)&&(e=t.length);for(var r=0,n=Array(e);r3?(o=y===n)&&(c=i[(u=i[4])?5:(u=3,3)],i[4]=i[5]=t):i[0]<=d&&((o=r<2&&dn||n>y)&&(i[4]=r,i[5]=n,p.n=y,u=0))}if(o||r>1)return a;throw f=!0,n}return function(o,l,y){if(s>1)throw TypeError("Generator is already running");for(f&&1===l&&d(l,y),u=l,c=y;(e=u<2?t:c)||!f;){i||(u?u<3?(u>1&&(p.n=-1),d(u,c)):p.n=c:p.v=c);try{if(s=2,i){if(u||(o="next"),e=i[o]){if(!(e=e.call(i,c)))throw TypeError("iterator result is not an object");if(!e.done)return e;c=e.value,u<2&&(u=0)}else 1===u&&(e=i.return)&&e.call(i),u<2&&(c=TypeError("The iterator does not provide a '"+o+"' method"),u=1);i=t}else if((e=(f=p.n<0)?c:r.call(n,p))!==a)break}catch(e){i=t,u=1,c=e}finally{s=1}}return{value:e,done:f}}}(r,o,i),!0),s}var a={};function u(){}function c(){}function s(){}e=Object.getPrototypeOf;var l=[][n]?e(e([][n]())):(zl(e={},n,function(){return this}),e),f=s.prototype=u.prototype=Object.create(l);function p(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,s):(t.__proto__=s,zl(t,o,"GeneratorFunction")),t.prototype=Object.create(f),t}return c.prototype=s,zl(f,"constructor",s),zl(s,"constructor",c),c.displayName="GeneratorFunction",zl(s,o,"GeneratorFunction"),zl(f),zl(f,o,"Generator"),zl(f,n,function(){return this}),zl(f,"toString",function(){return"[object Generator]"}),(Wl=function(){return{w:i,m:p}})()}function zl(t,e,r,n){var o=Object.defineProperty;try{o({},"",{})}catch(t){o=0}zl=function(t,e,r,n){function i(e,r){zl(t,e,function(t){return this._invoke(e,r,t)})}e?o?o(t,e,{value:r,enumerable:!n,configurable:!n,writable:!n}):t[e]=r:(i("next",0),i("throw",1),i("return",2))},zl(t,e,r,n)}function Vl(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 Kl(t){for(var e=1;et.length)&&(e=t.length);for(var r=0,n=Array(e);r(null!==(n=e.priority)&&void 0!==n?n:"")?-1:1},of=function(t,e){var r=(0,t.getOutputs)(e),n=He(r),o=[],i={};return n.forEach(function(t){var e=t.id,r=t.property,n=vo(e);(i[n]=i[n]||[]).push(r),o.push(Wo({id:n,property:r}))}),{allOutputs:r,allPropIds:o}},af=function(t,e){var r=[].concat(tf(He(t.getInputs(e))),tf(He(t.getState(e)))),n=new Map(r.map(function(t){return[vo(t.id),t]}));return Array.from(n.values())},uf={observer:function(){var t=Zl(Wl().m(function t(e){var r,n,o,i,a,u,c,s,l,f,p,d,y,h,v,b,m,g,w,O,S,j,_,E,P,k,A,T,x,I,C,R,D,N;return Wl().w(function(t){for(;;)switch(t.n){case 0:if(r=e.dispatch,n=e.getState,o=n(),i=o.callbacks,a=i.executing,u=i.watched,c=o.config,s=o.hooks,l=o.layout,f=o.paths,p=o.appLifecycle,d=n(),y=d.callbacks.prioritized,p===ii("HYDRATED")){t.n=1;break}return t.a(2);case 1:h=function(t){return Jl(t,c)},v=a.filter(h).length+u.filter(h).length,b=Math.max(0,12-v),y=Fl(nf,y),m=xr(h,y),g=Ql(m,2),w=g[0],O=g[1],j=xr(S=function(t){return!0===Hl(l,f,af(t,f))},w),_=Ql(j,2),E=_[0],P=_[1],k=E.slice(0,b),A=P.slice(0,b-k.length),T=xr(S,O),x=Ql(T,2),I=x[0],C=x[1],R=[].concat(tf(I),tf(k)),D=[].concat(tf(C),tf(A)),R.length&&r(Ws([Bs(R),Ds(Qe(function(t){return vl(t,c,s,f,l,of(t,f),r,n)},R))])),D.length&&(N=Qe(function(t){return Kl(Kl(Kl({},t),of(t,f)),{},{isReady:Hl(l,f,af(t,f))})},D),r(Ws([Bs(D),Is(N)])),N.forEach(function(){var t=Zl(Wl().m(function t(e){var o,i,a;return Wl().w(function(t){for(;;)switch(t.n){case 0:return t.n=1,e.isReady;case 1:if(o=n(),i=o.callbacks.blocked,En(function(t){return t===e||t.isReady===e.isReady},i)){t.n=2;break}return t.a(2);case 2:a=vl(e,c,s,f,l,e,r,n),r(Ws([Gs([e]),Ds([a])]));case 3:return t.a(2)}},t)}));return function(e){return t.apply(this,arguments)}}()));case 2:return t.a(2)}},t)}));return function(e){return t.apply(this,arguments)}}(),inputs:["callbacks.prioritized","callbacks.completed"]},cf=uf,sf=function(){function t(t,e,r,n){this.valueFn=t,this.valueAcc=e,this.keyFn=r,this.xf=n,this.inputs={}}return t.prototype["@@transducer/init"]=Ne,t.prototype["@@transducer/result"]=function(t){var e;for(e in this.inputs)if(Ft(e,this.inputs)&&(t=this.xf["@@transducer/step"](t,this.inputs[e]))["@@transducer/reduced"]){t=t["@@transducer/value"];break}return this.inputs=null,this.xf["@@transducer/result"](t)},t.prototype["@@transducer/step"]=function(t,e){var r=this.keyFn(e);return this.inputs[r]=this.inputs[r]||[r,Ri(this.valueAcc,!1)],this.inputs[r][1]=this.valueFn(this.inputs[r][1],e),t},t}();function lf(t,e,r){return function(n){return new sf(t,e,r,n)}}var ff=qt(me("groupBy",ze(4,[],Re([],lf,function(t,e,r,n){var o=ur(function(n,o){var i=r(o),a=t(Ft(i,n)?n[i]:Ri(e,!1),o);return a&&a["@@transducer/reduced"]?gr(n):(n[i]=a,n)});return ir(o,{},n)}))(function(t,e){return t.push(e),t},[]))),pf=qt(function(t,e){return sn({},e,t)});function df(){var t,e,r="function"==typeof Symbol?Symbol:{},n=r.iterator||"@@iterator",o=r.toStringTag||"@@toStringTag";function i(r,n,o,i){var c=n&&n.prototype instanceof u?n:u,s=Object.create(c.prototype);return yf(s,"_invoke",function(r,n,o){var i,u,c,s=0,l=o||[],f=!1,p={p:0,n:0,v:t,a:d,f:d.bind(t,4),d:function(e,r){return i=e,u=0,c=t,p.n=r,a}};function d(r,n){for(u=r,c=n,e=0;!f&&s&&!o&&e3?(o=y===n)&&(c=i[(u=i[4])?5:(u=3,3)],i[4]=i[5]=t):i[0]<=d&&((o=r<2&&dn||n>y)&&(i[4]=r,i[5]=n,p.n=y,u=0))}if(o||r>1)return a;throw f=!0,n}return function(o,l,y){if(s>1)throw TypeError("Generator is already running");for(f&&1===l&&d(l,y),u=l,c=y;(e=u<2?t:c)||!f;){i||(u?u<3?(u>1&&(p.n=-1),d(u,c)):p.n=c:p.v=c);try{if(s=2,i){if(u||(o="next"),e=i[o]){if(!(e=e.call(i,c)))throw TypeError("iterator result is not an object");if(!e.done)return e;c=e.value,u<2&&(u=0)}else 1===u&&(e=i.return)&&e.call(i),u<2&&(c=TypeError("The iterator does not provide a '"+o+"' method"),u=1);i=t}else if((e=(f=p.n<0)?c:r.call(n,p))!==a)break}catch(e){i=t,u=1,c=e}finally{s=1}}return{value:e,done:f}}}(r,o,i),!0),s}var a={};function u(){}function c(){}function s(){}e=Object.getPrototypeOf;var l=[][n]?e(e([][n]())):(yf(e={},n,function(){return this}),e),f=s.prototype=u.prototype=Object.create(l);function p(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,s):(t.__proto__=s,yf(t,o,"GeneratorFunction")),t.prototype=Object.create(f),t}return c.prototype=s,yf(f,"constructor",s),yf(s,"constructor",c),c.displayName="GeneratorFunction",yf(s,o,"GeneratorFunction"),yf(f),yf(f,o,"Generator"),yf(f,n,function(){return this}),yf(f,"toString",function(){return"[object Generator]"}),(df=function(){return{w:i,m:p}})()}function yf(t,e,r,n){var o=Object.defineProperty;try{o({},"",{})}catch(t){o=0}yf=function(t,e,r,n){function i(e,r){yf(t,e,function(t){return this._invoke(e,r,t)})}e?o?o(t,e,{value:r,enumerable:!n,configurable:!n,writable:!n}):t[e]=r:(i("next",0),i("throw",1),i("return",2))},yf(t,e,r,n)}function hf(t,e,r,n,o,i,a){try{var u=t[i](a),c=u.value}catch(t){return void r(t)}u.done?e(c):Promise.resolve(c).then(n,o)}var vf=function(){var t,e=(t=df().m(function t(e){var r,n;return df().w(function(t){for(;;)if(0===t.n)return n=new Promise(function(t){return r=t}),setTimeout(r,e),t.a(2,n)},t)}),function(){var e=this,r=arguments;return new Promise(function(n,o){var i=t.apply(e,r);function a(t){hf(i,n,o,a,u,"next",t)}function u(t){hf(i,n,o,a,u,"throw",t)}a(void 0)})});return function(t){return e.apply(this,arguments)}}();function bf(t){return bf="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},bf(t)}function mf(t){if(null!=t){var e=t["function"==typeof Symbol&&Symbol.iterator||"@@iterator"],r=0;if(e)return e.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length))return{next:function(){return t&&r>=t.length&&(t=void 0),{value:t&&t[r++],done:!t}}}}throw new TypeError(bf(t)+" is not iterable")}function gf(){var t,e,r="function"==typeof Symbol?Symbol:{},n=r.iterator||"@@iterator",o=r.toStringTag||"@@toStringTag";function i(r,n,o,i){var c=n&&n.prototype instanceof u?n:u,s=Object.create(c.prototype);return wf(s,"_invoke",function(r,n,o){var i,u,c,s=0,l=o||[],f=!1,p={p:0,n:0,v:t,a:d,f:d.bind(t,4),d:function(e,r){return i=e,u=0,c=t,p.n=r,a}};function d(r,n){for(u=r,c=n,e=0;!f&&s&&!o&&e3?(o=y===n)&&(c=i[(u=i[4])?5:(u=3,3)],i[4]=i[5]=t):i[0]<=d&&((o=r<2&&dn||n>y)&&(i[4]=r,i[5]=n,p.n=y,u=0))}if(o||r>1)return a;throw f=!0,n}return function(o,l,y){if(s>1)throw TypeError("Generator is already running");for(f&&1===l&&d(l,y),u=l,c=y;(e=u<2?t:c)||!f;){i||(u?u<3?(u>1&&(p.n=-1),d(u,c)):p.n=c:p.v=c);try{if(s=2,i){if(u||(o="next"),e=i[o]){if(!(e=e.call(i,c)))throw TypeError("iterator result is not an object");if(!e.done)return e;c=e.value,u<2&&(u=0)}else 1===u&&(e=i.return)&&e.call(i),u<2&&(c=TypeError("The iterator does not provide a '"+o+"' method"),u=1);i=t}else if((e=(f=p.n<0)?c:r.call(n,p))!==a)break}catch(e){i=t,u=1,c=e}finally{s=1}}return{value:e,done:f}}}(r,o,i),!0),s}var a={};function u(){}function c(){}function s(){}e=Object.getPrototypeOf;var l=[][n]?e(e([][n]())):(wf(e={},n,function(){return this}),e),f=s.prototype=u.prototype=Object.create(l);function p(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,s):(t.__proto__=s,wf(t,o,"GeneratorFunction")),t.prototype=Object.create(f),t}return c.prototype=s,wf(f,"constructor",s),wf(s,"constructor",c),c.displayName="GeneratorFunction",wf(s,o,"GeneratorFunction"),wf(f),wf(f,o,"Generator"),wf(f,n,function(){return this}),wf(f,"toString",function(){return"[object Generator]"}),(gf=function(){return{w:i,m:p}})()}function wf(t,e,r,n){var o=Object.defineProperty;try{o({},"",{})}catch(t){o=0}wf=function(t,e,r,n){function i(e,r){wf(t,e,function(t){return this._invoke(e,r,t)})}e?o?o(t,e,{value:r,enumerable:!n,configurable:!n,writable:!n}):t[e]=r:(i("next",0),i("throw",1),i("return",2))},wf(t,e,r,n)}function Of(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 Sf(t){for(var e=1;et.length)&&(e=t.length);for(var r=0,n=Array(e);rt.length)&&(e=t.length);for(var r=0,n=Array(e);r4&&void 0!==arguments[4]?arguments[4]:null,i=[];for(var a in t)if(t.hasOwnProperty(a)){var u=void 0;try{"function"!=typeof t[a]?(u=Error((n||"React class")+": "+r+" type `"+a+"` is invalid; it must be a function, usually from the `prop-types` package, but received `"+cp(t[a])+"`.")).name="Invariant Violation":u=t[a](e,a,n,r,null,up()())}catch(t){u=t}if(!u||u instanceof Error||i.push((n||"React class")+": type specification of "+r+" `"+a+"` is invalid; the type checker function must return `null` or an `Error` but returned a "+cp(u)+". You may have forgotten to pass an argument to the type checker creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and shape all require an argument)."),u instanceof Error){var c=o&&o()||"";i.push("Failed "+r+" type: "+u.message+c)}}return i.join("\n\n")}(e.propTypes,r,"component prop",e);return i&&function(t,e,r){var n,o=t.split("`");if(ie("is marked as required",t)){var i=o[1];n="".concat(i," in ").concat(r),e.id&&(n+=' with ID "'.concat(e.id,'"')),n+=" is required but it was not provided."}else if(ie("Bad object",t))n=t.split("supplied to ")[0]+"supplied to ".concat(r)+".\nBad"+t.split(".\nBad")[1];else{if(!ie("Invalid ",t)||!ie(" supplied to ",t))throw new Error(t);var a=o[1];if(n="Invalid argument `".concat(a,"` passed into ").concat(r),e.id&&(n+=' with ID "'.concat(e.id,'"')),n+=".",ie(", expected ",t)){var u=t.split(", expected ")[1];n+="\nExpected ".concat(u)}if(ie(" of type `",t)){var c=t.split(" of type `")[1].split("`")[0];n+="\nWas supplied type `".concat(c,"`.")}if(Tn(a,e)){var s=JSON.stringify(e[a],null,2);s&&(ie("\n",s)?n+="\nValue provided: \n".concat(s):n+="\nValue provided: ".concat(s))}}throw new Error(n)}(i,r,o.type),n}var lp=w()().createContext({});function fp(t){var e=t.children,r=t.componentPath,n=(0,g().useMemo)(function(){return JSON.stringify(r)},[r]),o=dt(),i=(0,g().useCallback)(function(t){var e=t||{},i=e.extraPath,a=e.rawPath,u=e.filterFunc,c=[n];i?c=[JSON.stringify(mr(r,i))]:a&&(c=[JSON.stringify(a)]);var s=pe([],c,o.getState().loading);return u?s.filter(u).length>0:s.length>0},[n]),a=(0,g().useCallback)(function(t){var e=t||{},o=e.filterFunc,i=e.extraPath,a=e.rawPath;return U(function(t){var e=[n];i?e=[JSON.stringify(mr(r,i))]:a&&(e=[JSON.stringify(a)]);var u=pe([],e,t.loading);return o?u.filter(o).length>0:u.length>0})},[n]),u=(0,g().useMemo)(function(){return{componentPath:r,isLoading:i,useLoading:a,useSelector:U,useStore:dt,useDispatch:bt}},[n]);return w()().createElement(lp.Provider,{value:u},e)}function pp(t){return pp="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},pp(t)}var dp=["componentPath","_dashprivate_error","_passedComponent","_newRender"],yp=["_dash_error"];function hp(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 vp(t,e,r){return(e=function(t){var e=function(t){if("object"!=pp(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var r=e.call(t,"string");if("object"!=pp(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==pp(e)?e:e+""}(e))in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function bp(t){return function(t){if(Array.isArray(t))return gp(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||mp(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function mp(t,e){if(t){if("string"==typeof t)return gp(t,e);var r={}.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)?gp(t,e):void 0}}function gp(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r3&&void 0!==arguments[3]&&arguments[3];if(Array.isArray(t)){var i=ba(e),a=n?b.current[i]:void 0;return b.current[i]=t,t.map(function(t,i){if(va(t)){var u=n&&(null==a?void 0:a[i])===t;return C(t,mr(o,["props"].concat(bp(e),[i])),u?0:r)}return t})}return va(t)?C(t,mr(o,["props"].concat(bp(e))),r):t},[o]),D=function(t){for(var e=1;e3?(o=y===n)&&(c=i[(u=i[4])?5:(u=3,3)],i[4]=i[5]=t):i[0]<=d&&((o=r<2&&dn||n>y)&&(i[4]=r,i[5]=n,p.n=y,u=0))}if(o||r>1)return a;throw f=!0,n}return function(o,l,y){if(s>1)throw TypeError("Generator is already running");for(f&&1===l&&d(l,y),u=l,c=y;(e=u<2?t:c)||!f;){i||(u?u<3?(u>1&&(p.n=-1),d(u,c)):p.n=c:p.v=c);try{if(s=2,i){if(u||(o="next"),e=i[o]){if(!(e=e.call(i,c)))throw TypeError("iterator result is not an object");if(!e.done)return e;c=e.value,u<2&&(u=0)}else 1===u&&(e=i.return)&&e.call(i),u<2&&(c=TypeError("The iterator does not provide a '"+o+"' method"),u=1);i=t}else if((e=(f=p.n<0)?c:r.call(n,p))!==a)break}catch(e){i=t,u=1,c=e}finally{s=1}}return{value:e,done:f}}}(r,o,i),!0),s}var a={};function u(){}function c(){}function s(){}e=Object.getPrototypeOf;var l=[][n]?e(e([][n]())):(jp(e={},n,function(){return this}),e),f=s.prototype=u.prototype=Object.create(l);function p(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,s):(t.__proto__=s,jp(t,o,"GeneratorFunction")),t.prototype=Object.create(f),t}return c.prototype=s,jp(f,"constructor",s),jp(s,"constructor",c),c.displayName="GeneratorFunction",jp(s,o,"GeneratorFunction"),jp(f),jp(f,o,"Generator"),jp(f,n,function(){return this}),jp(f,"toString",function(){return"[object Generator]"}),(Sp=function(){return{w:i,m:p}})()}function jp(t,e,r,n){var o=Object.defineProperty;try{o({},"",{})}catch(t){o=0}jp=function(t,e,r,n){function i(e,r){jp(t,e,function(t){return this._invoke(e,r,t)})}e?o?o(t,e,{value:r,enumerable:!n,configurable:!n,writable:!n}):t[e]=r:(i("next",0),i("throw",1),i("return",2))},jp(t,e,r,n)}function _p(t,e,r,n,o,i,a){try{var u=t[i](a),c=u.value}catch(t){return void r(t)}u.done?e(c):Promise.resolve(c).then(n,o)}function Ep(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r0:t}))&&t.push(i):i.getOutputs(o).some(function(t){return Array.isArray(t)?t.length>0:t})&&t.push(i),t},[]);t(Ms([].concat(Su(a),Su(u))))}(t,e),t(Eu(ii("HYDRATED")))}))}catch(t){a.frontEnd.length||a.backEnd.length||i(_u({type:"backEnd",error:t})),p=!0}finally{r(p)}}})}Pp.propTypes={appLifecycle:_().oneOf([ii("STARTED"),ii("HYDRATED"),ii("DESTROYED")]),dispatch:_().func,dependenciesRequest:_().object,graphs:_().object,hooks:_().object,layoutRequest:_().object,layout:_().any,history:_().any,error:_().object,config:_().object};var Ap=lt(function(t){return{appLifecycle:t.appLifecycle,dependenciesRequest:t.dependenciesRequest,hooks:t.hooks,layoutRequest:t.layoutRequest,layout:t.layout,graphs:t.graphs,history:t.history,error:t.error,config:t.config}},function(t){return{dispatch:t}})(Pp);function Tp(t){return t.isLoading?w()().createElement("div",{className:"_dash-loading-callback"}):null}Tp.propTypes={isLoading:_().bool.isRequired};var xp=lt(function(t){return{isLoading:t.isLoading}})(Tp);s(),d(),l(),p(),f(),y();var Ip=r(217),Cp={};function Rp(t){var e=t.dispatch,r=t.history,n=w()().createElement("span",{key:"undoLink",className:"_dash-undo-redo-link",onClick:function(){return e(Bu)}},w()().createElement("div",{className:"_dash-icon-undo"},"↺"),w()().createElement("div",{className:"_dash-undo-redo-label"},"undo")),o=w()().createElement("span",{key:"redoLink",className:"_dash-undo-redo-link",onClick:function(){return e(Fu)}},w()().createElement("div",{className:"_dash-icon-redo"},"↻"),w()().createElement("div",{className:"_dash-undo-redo-label"},"redo"));return w()().createElement("div",{className:"_dash-undo-redo"},w()().createElement("div",null,r.past.length>0?n:null,r.future.length>0?o:null))}Cp.styleTagTransform=function t(){return t.c||(t.c=r.n(y()))}()(),Cp.setAttributes=function t(){return t.c||(t.c=r.n(p()))}()(),Cp.insert=function t(){return t.c||(t.c=r.n(l()))}()().bind(null,"head"),Cp.domAPI=function t(){return t.c||(t.c=r.n(d()))}()(),Cp.insertStyleElement=function t(){return t.c||(t.c=r.n(f()))}()(),function t(){return t.c||(t.c=r.n(s()))}()()(Ip.A,Cp),Ip.A&&Ip.A.locals&&Ip.A.locals,Rp.propTypes={history:_().object,dispatch:_().func};var Dp=lt(function(t){return{history:t.history}},function(t){return{dispatch:t}})(Rp),Np=Ot(function(t){return function(e,r){return t(e,r)?-1:t(r,e)?1:0}}),Mp=qt(function(t,e){return tt.length)&&(e=t.length);for(var r=0,n=Array(e);r=t.length?{done:!0}:{done:!1,value:t[n++]}},e:function(t){throw t},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,u=!1;return{s:function(){r=r.call(t)},n:function(){var t=r.next();return a=t.done,t},e:function(t){u=!0,i=t},f:function(){try{a||null==r.return||r.return()}finally{if(u)throw i}}}}(r.content.files);try{for(a.s();!(o=a.n()).done;){var u=o.value;if(!u.is_css){i=!1;break}i=!0;for(var c=[],s=document.evaluate('//link[contains(@href, "'.concat(u.url,'")]'),this._head),l=s.iterateNext();l;)c.push(l),l=s.iterateNext();if(we(function(t){return t.setAttribute("disabled","disabled")},c),u.modified>0){var f=document.createElement("link");f.href="".concat(u.url,"?m=").concat(u.modified),f.type="text/css",f.rel="stylesheet",this._head.appendChild(f)}}}catch(t){a.e(t)}finally{a.f()}i||window.location.reload()}else null!==this.state.intervalId&&500===r.status&&(this._retry>this.state.max_retry&&(this.clearInterval(),window.alert("Hot reloading is disabled after failing ".concat(this._retry," times. ")+"Please check your application for errors, then refresh the page.")),this._retry++)}},{key:"componentDidMount",value:function(){var t=this.props,e=t.dispatch,r=t.reloadRequest,n=this.state,o=n.disabled,i=n.interval;if(!o&&!this.state.intervalId){var a=window.setInterval(function(){"loading"!==r.status&&e(wc("_reload-hash","GET","reloadRequest"))},i);this.setState({intervalId:a})}}},{key:"componentWillUnmount",value:function(){!this.state.disabled&&this.state.intervalId&&this.clearInterval()}},{key:"render",value:function(){return null}}],o=[{key:"getDerivedStateFromProps",value:function(t){return Ee(t.reloadRequest)||"loading"===t.reloadRequest.status?null:{reloadRequest:t.reloadRequest}}}],n&&Lp(r.prototype,n),o&&Lp(r,o),Object.defineProperty(r,"prototype",{writable:!1}),r;var r,n,o}(w()().Component);Jp.defaultProps={},Jp.propTypes={id:_().string,config:_().object,reloadRequest:_().object,dispatch:_().func,interval:_().number};var $p=lt(function(t){return{config:t.config,reloadRequest:t.reloadRequest}},function(t){return{dispatch:t}})(Jp);function Wp(){var t=document.getElementById("_dash-config");return JSON.parse(null!=t&&t.textContent?null==t?void 0:t.textContent:"{}")}var zp=qt(function(t,e){var r={};return mt(e.length,function(){var n=t.apply(this,arguments);return Ft(n,r)||(r[n]=e.apply(this,arguments)),r[n]})}),Vp=zp;function Kp(t){return Kp="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},Kp(t)}function Yp(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 Qp(t){for(var e=1;et.length)&&(e=t.length);for(var r=0,n=Array(e);r=t.length)&&Tn(String(r),t))return t[r]}}function sd(t,e){if("string"==typeof e&&Tn(e,t))return t[e]}function ld(t,e){if(Array.isArray(e)){var r,n=t,o=function(t,e){var r="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!r){if(Array.isArray(t)||(r=function(t,e){if(t){if("string"==typeof t)return ud(t,e);var r={}.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)?ud(t,e):void 0}}(t))||e&&t&&"number"==typeof t.length){r&&(t=r);var n=0,o=function(){};return{s:o,n:function(){return n>=t.length?{done:!0}:{done:!1,value:t[n++]}},e:function(t){throw t},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,u=!1;return{s:function(){r=r.call(t)},n:function(){var t=r.next();return a=t.done,t},e:function(t){u=!0,i=t},f:function(){try{a||null==r.return||r.return()}finally{if(u)throw i}}}}(e);try{for(o.s();!(r=o.n()).done;){var i=r.value;if(Array.isArray(n))n=cd(n,i);else{if(null===n||"object"!==ad(n))return;n=sd(n,i)}}}catch(t){o.e(t)}finally{o.f()}return n}}function fd(t){return fd="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},fd(t)}function pd(){var t,e,r="function"==typeof Symbol?Symbol:{},n=r.iterator||"@@iterator",o=r.toStringTag||"@@toStringTag";function i(r,n,o,i){var c=n&&n.prototype instanceof u?n:u,s=Object.create(c.prototype);return dd(s,"_invoke",function(r,n,o){var i,u,c,s=0,l=o||[],f=!1,p={p:0,n:0,v:t,a:d,f:d.bind(t,4),d:function(e,r){return i=e,u=0,c=t,p.n=r,a}};function d(r,n){for(u=r,c=n,e=0;!f&&s&&!o&&e3?(o=y===n)&&(c=i[(u=i[4])?5:(u=3,3)],i[4]=i[5]=t):i[0]<=d&&((o=r<2&&dn||n>y)&&(i[4]=r,i[5]=n,p.n=y,u=0))}if(o||r>1)return a;throw f=!0,n}return function(o,l,y){if(s>1)throw TypeError("Generator is already running");for(f&&1===l&&d(l,y),u=l,c=y;(e=u<2?t:c)||!f;){i||(u?u<3?(u>1&&(p.n=-1),d(u,c)):p.n=c:p.v=c);try{if(s=2,i){if(u||(o="next"),e=i[o]){if(!(e=e.call(i,c)))throw TypeError("iterator result is not an object");if(!e.done)return e;c=e.value,u<2&&(u=0)}else 1===u&&(e=i.return)&&e.call(i),u<2&&(c=TypeError("The iterator does not provide a '"+o+"' method"),u=1);i=t}else if((e=(f=p.n<0)?c:r.call(n,p))!==a)break}catch(e){i=t,u=1,c=e}finally{s=1}}return{value:e,done:f}}}(r,o,i),!0),s}var a={};function u(){}function c(){}function s(){}e=Object.getPrototypeOf;var l=[][n]?e(e([][n]())):(dd(e={},n,function(){return this}),e),f=s.prototype=u.prototype=Object.create(l);function p(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,s):(t.__proto__=s,dd(t,o,"GeneratorFunction")),t.prototype=Object.create(f),t}return c.prototype=s,dd(f,"constructor",s),dd(s,"constructor",c),c.displayName="GeneratorFunction",dd(s,o,"GeneratorFunction"),dd(f),dd(f,o,"Generator"),dd(f,n,function(){return this}),dd(f,"toString",function(){return"[object Generator]"}),(pd=function(){return{w:i,m:p}})()}function dd(t,e,r,n){var o=Object.defineProperty;try{o({},"",{})}catch(t){o=0}dd=function(t,e,r,n){function i(e,r){dd(t,e,function(t){return this._invoke(e,r,t)})}e?o?o(t,e,{value:r,enumerable:!n,configurable:!n,writable:!n}):t[e]=r:(i("next",0),i("throw",1),i("return",2))},dd(t,e,r,n)}function yd(t){return function(t){if(Array.isArray(t))return Od(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||wd(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function hd(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 vd(t){for(var e=1;e=t.length?{done:!0}:{done:!1,value:t[n++]}},e:function(t){throw t},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,u=!1;return{s:function(){r=r.call(t)},n:function(){var t=r.next();return a=t.done,t},e:function(t){u=!0,i=t},f:function(){try{a||null==r.return||r.return()}finally{if(u)throw i}}}}function wd(t,e){if(t){if("string"==typeof t)return Od(t,e);var r={}.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)?Od(t,e):void 0}}function Od(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r0&&(console.log("[Dash] Re-triggering ".concat(r.length," persistent callback(s)")),e.dispatch(Ms(r)))}}},a.onDisconnected=function(t){console.log("[Dash] WebSocket disconnected: ".concat(t)),c=!0},a.onError=function(t,e){console.error("[Dash] WebSocket error: ".concat(t),e)},document.addEventListener("visibilitychange",function(){"visible"===document.visibilityState&&(a.connected?a.notifyTabVisible():c&&(console.log("[Dash] Tab visible, reconnecting WebSocket..."),a.ensureConnected(r).catch(function(t){return console.error("[Dash] Failed to reconnect:",t)})))}),null!==(i=r.websocket)&&void 0!==i&&i.enabled){t.n=3;break}return t.a(2);case 3:return s=Ed(r),t.p=4,t.n=5,a.connect(r.websocket.worker_url,s,r.websocket.inactivity_timeout);case 5:t.n=7;break;case 6:t.p=6,l=t.v,console.error("[Dash] Failed to connect to WebSocket worker:",l);case 7:return t.a(2)}},t,null,[[4,6]])}),_d=function(){var e=this,r=arguments;return new Promise(function(n,o){var i=t.apply(e,r);function a(t){md(i,n,o,a,u,"next",t)}function u(t){md(i,n,o,a,u,"throw",t)}a(void 0)})},_d.apply(this,arguments)}function Ed(t){var e;if(null===(e=t.websocket)||void 0===e||!e.url)throw new Error("WebSocket URL not configured");var r="https:"===window.location.protocol?"wss:":"ws:",n=window.location.host;return"".concat(r,"//").concat(n).concat(t.websocket.url)}function Pd(t){return Pd="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},Pd(t)}function kd(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 Ad(t){for(var e=1;et.length)&&(e=t.length);for(var r=0,n=Array(e);rt.length)&&(e=t.length);for(var r=0,n=Array(e);rt.length)&&(e=t.length);for(var r=0,n=Array(e);r1&&void 0!==arguments[1]?arguments[1]:"about:blank";if(""===t)return t;var r=t.replace(Kd,"").replace(Yd,"").replace(Qd,function(t,e){return String.fromCharCode(e)}).trim();return Vd.test(r)?e:t}:Xd.clean_url,Xd.Patch=ac,window.DashRenderer=Fd}(),window.dash_renderer={}}(); \ No newline at end of file +!function(){var t={296:function(t,e,r){var n;window,t.exports=(n=r(609),function(t){var e={};function r(n){if(e[n])return e[n].exports;var o=e[n]={i:n,l:!1,exports:{}};return t[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}return r.m=t,r.c=e,r.d=function(t,e,n){r.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:n})},r.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.t=function(t,e){if(1&e&&(t=r(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)r.d(n,o,function(e){return t[e]}.bind(null,o));return n},r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,"a",e),e},r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.p="",r(r.s=1)}([function(t,e){t.exports=n},function(t,e,r){"use strict";r.r(e),r.d(e,"asyncDecorator",function(){return a}),r.d(e,"inheritAsyncDecorator",function(){return u}),r.d(e,"isReady",function(){return c}),r.d(e,"History",function(){return f});var n=r(0);function o(t,e,r,n,o,i,a){try{var u=t[i](a),c=u.value}catch(t){return void r(t)}u.done?e(c):Promise.resolve(c).then(n,o)}function i(t){return function(){var e=this,r=arguments;return new Promise(function(n,i){var a=t.apply(e,r);function u(t){o(a,n,i,u,c,"next",t)}function c(t){o(a,n,i,u,c,"throw",t)}u(void 0)})}}var a=function(t,e){var r,o={isReady:new Promise(function(t){r=t}),get:Object(n.lazy)(function(){return Promise.resolve(e()).then(function(t){return setTimeout(i(regeneratorRuntime.mark(function t(){return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,r(!0);case 2:o.isReady=!0;case 3:case"end":return t.stop()}},t)})),0),t})})};return Object.defineProperty(t,"_dashprivate_isLazyComponentReady",{get:function(){return o.isReady}}),o.get},u=function(t,e){Object.defineProperty(t,"_dashprivate_isLazyComponentReady",{get:function(){return c(e)}})},c=function(t){return t&&t._dashprivate_isLazyComponentReady};function s(t,e){for(var r=0;r=19&&Symbol.for("react.element")!==Symbol.for("react.transitional.element")){var r=Symbol.for("react.transitional.element"),n=Symbol.for;Symbol.for=function(t){return"react.element"===t?r:n.apply(Symbol,arguments)}}window.ReactJSXRuntime||(window.ReactJSXRuntime={jsx:o,jsxs:o,jsxDEV:o,Fragment:t.Fragment})}function o(e,r,n){var o={},i=null;if(null!=r)for(var a in void 0!==r.key&&(o.key=""+r.key),r)Object.prototype.hasOwnProperty.call(r,a)&&"key"!==a&&"__self"!==a&&"__source"!==a&&("children"===a?i=r[a]:o[a]=r[a]);return void 0!==n&&(o.key=""+n),null!=i?Array.isArray(i)?t.createElement.apply(t,[e,o].concat(i)):t.createElement(e,o,i):t.createElement(e,o)}}()},217:function(t,e,r){"use strict";var n=r(601),o=r.n(n),i=r(314),a=r.n(i)()(o());a.push([t.id,"._dash-undo-redo {\n position: fixed;\n bottom: 30px;\n left: 30px;\n font-size: 20px;\n text-align: center;\n z-index: 9999;\n background-color: rgba(255, 255, 255, 0.9);\n}\n._dash-undo-redo > div {\n position: relative;\n}\n._dash-undo-redo-link {\n color: #0074d9;\n cursor: pointer;\n margin-left: 10px;\n margin-right: 10px;\n display: inline-block;\n opacity: 0.2;\n}\n._dash-undo-redo-link:hover {\n opacity: 1;\n}\n._dash-undo-redo-link ._dash-icon-undo {\n font-size: 20px;\n transform: rotate(270deg);\n}\n._dash-undo-redo-link ._dash-icon-redo {\n font-size: 20px;\n transform: rotate(90deg);\n}\n._dash-undo-redo-link ._dash-undo-redo-label {\n font-size: 15px;\n}\n",""]),e.A=a},314:function(t){"use strict";t.exports=function(t){var e=[];return e.toString=function(){return this.map(function(e){var r="",n=void 0!==e[5];return e[4]&&(r+="@supports (".concat(e[4],") {")),e[2]&&(r+="@media ".concat(e[2]," {")),n&&(r+="@layer".concat(e[5].length>0?" ".concat(e[5]):""," {")),r+=t(e),n&&(r+="}"),e[2]&&(r+="}"),e[4]&&(r+="}"),r}).join("")},e.i=function(t,r,n,o,i){"string"==typeof t&&(t=[[null,t,void 0]]);var a={};if(n)for(var u=0;u0?" ".concat(l[5]):""," {").concat(l[1],"}")),l[5]=i),r&&(l[2]?(l[1]="@media ".concat(l[2]," {").concat(l[1],"}"),l[2]=r):l[2]=r),o&&(l[4]?(l[1]="@supports (".concat(l[4],") {").concat(l[1],"}"),l[4]=o):l[4]="".concat(o)),e.push(l))}},e}},601:function(t){"use strict";t.exports=function(t){return t[1]}},131:function(t,e){function r(t,e,r,n){var i={};return function(a){if(!i[a]){var u={},c=[],s=[];for(s.push({node:a,processed:!1});s.length>0;){var l=s[s.length-1],f=l.processed,p=l.node;if(f)s.pop(),c.pop(),u[p]=!1,i[p]=!0,e&&0!==t[p].length||r.push(p);else{if(i[p]){s.pop();continue}if(u[p]){if(n){s.pop();continue}throw c.push(p),new o(c)}u[p]=!0,c.push(p);for(var d=t[p],y=d.length-1;y>=0;y--)s.push({node:d[y],processed:!1});l.processed=!0}}}}}var n=e.DepGraph=function(t){this.nodes={},this.outgoingEdges={},this.incomingEdges={},this.circular=t&&!!t.circular};n.prototype={size:function(){return Object.keys(this.nodes).length},addNode:function(t,e){this.hasNode(t)||(this.nodes[t]=2===arguments.length?e:t,this.outgoingEdges[t]=[],this.incomingEdges[t]=[])},removeNode:function(t){this.hasNode(t)&&(delete this.nodes[t],delete this.outgoingEdges[t],delete this.incomingEdges[t],[this.incomingEdges,this.outgoingEdges].forEach(function(e){Object.keys(e).forEach(function(r){var n=e[r].indexOf(t);n>=0&&e[r].splice(n,1)},this)}))},hasNode:function(t){return this.nodes.hasOwnProperty(t)},getNodeData:function(t){if(this.hasNode(t))return this.nodes[t];throw new Error("Node does not exist: "+t)},setNodeData:function(t,e){if(!this.hasNode(t))throw new Error("Node does not exist: "+t);this.nodes[t]=e},addDependency:function(t,e){if(!this.hasNode(t))throw new Error("Node does not exist: "+t);if(!this.hasNode(e))throw new Error("Node does not exist: "+e);return-1===this.outgoingEdges[t].indexOf(e)&&this.outgoingEdges[t].push(e),-1===this.incomingEdges[e].indexOf(t)&&this.incomingEdges[e].push(t),!0},removeDependency:function(t,e){var r;this.hasNode(t)&&(r=this.outgoingEdges[t].indexOf(e))>=0&&this.outgoingEdges[t].splice(r,1),this.hasNode(e)&&(r=this.incomingEdges[e].indexOf(t))>=0&&this.incomingEdges[e].splice(r,1)},clone:function(){var t=this,e=new n;return Object.keys(t.nodes).forEach(function(r){e.nodes[r]=t.nodes[r],e.outgoingEdges[r]=t.outgoingEdges[r].slice(0),e.incomingEdges[r]=t.incomingEdges[r].slice(0)}),e},directDependenciesOf:function(t){if(this.hasNode(t))return this.outgoingEdges[t].slice(0);throw new Error("Node does not exist: "+t)},directDependantsOf:function(t){if(this.hasNode(t))return this.incomingEdges[t].slice(0);throw new Error("Node does not exist: "+t)},dependenciesOf:function(t,e){if(this.hasNode(t)){var n=[];r(this.outgoingEdges,e,n,this.circular)(t);var o=n.indexOf(t);return o>=0&&n.splice(o,1),n}throw new Error("Node does not exist: "+t)},dependantsOf:function(t,e){if(this.hasNode(t)){var n=[];r(this.incomingEdges,e,n,this.circular)(t);var o=n.indexOf(t);return o>=0&&n.splice(o,1),n}throw new Error("Node does not exist: "+t)},overallOrder:function(t){var e=this,n=[],o=Object.keys(this.nodes);if(0===o.length)return n;if(!this.circular){var i=r(this.outgoingEdges,!1,[],this.circular);o.forEach(function(t){i(t)})}var a=r(this.outgoingEdges,t,n,this.circular);return o.filter(function(t){return 0===e.incomingEdges[t].length}).forEach(function(t){a(t)}),this.circular&&o.filter(function(t){return-1===n.indexOf(t)}).forEach(function(t){a(t)}),n},entryNodes:function(){var t=this;return Object.keys(this.nodes).filter(function(e){return 0===t.incomingEdges[e].length})}},n.prototype.directDependentsOf=n.prototype.directDependantsOf,n.prototype.dependentsOf=n.prototype.dependantsOf;var o=e.DepGraphCycleError=function(t){var e="Dependency Cycle Found: "+t.join(" -> "),r=new Error(e);return r.cyclePath=t,Object.setPrototypeOf(r,Object.getPrototypeOf(this)),Error.captureStackTrace&&Error.captureStackTrace(r,o),r};o.prototype=Object.create(Error.prototype,{constructor:{value:Error,enumerable:!1,writable:!0,configurable:!0}}),Object.setPrototypeOf(o,Error)},886: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}},799:function(t,e){"use strict";var r="function"==typeof Symbol&&Symbol.for,n=r?Symbol.for("react.element"):60103,o=r?Symbol.for("react.portal"):60106,i=r?Symbol.for("react.fragment"):60107,a=r?Symbol.for("react.strict_mode"):60108,u=r?Symbol.for("react.profiler"):60114,c=r?Symbol.for("react.provider"):60109,s=r?Symbol.for("react.context"):60110,l=r?Symbol.for("react.async_mode"):60111,f=r?Symbol.for("react.concurrent_mode"):60111,p=r?Symbol.for("react.forward_ref"):60112,d=r?Symbol.for("react.suspense"):60113,y=r?Symbol.for("react.suspense_list"):60120,h=r?Symbol.for("react.memo"):60115,v=r?Symbol.for("react.lazy"):60116,b=r?Symbol.for("react.block"):60121,m=r?Symbol.for("react.fundamental"):60117,g=r?Symbol.for("react.responder"):60118,w=r?Symbol.for("react.scope"):60119;function O(t){if("object"==typeof t&&null!==t){var e=t.$$typeof;switch(e){case n:switch(t=t.type){case l:case f:case i:case u:case a:case d:return t;default:switch(t=t&&t.$$typeof){case s:case p:case v:case h:case c:return t;default:return e}}case o:return e}}}function S(t){return O(t)===f}e.AsyncMode=l,e.ConcurrentMode=f,e.ContextConsumer=s,e.ContextProvider=c,e.Element=n,e.ForwardRef=p,e.Fragment=i,e.Lazy=v,e.Memo=h,e.Portal=o,e.Profiler=u,e.StrictMode=a,e.Suspense=d,e.isAsyncMode=function(t){return S(t)||O(t)===l},e.isConcurrentMode=S,e.isContextConsumer=function(t){return O(t)===s},e.isContextProvider=function(t){return O(t)===c},e.isElement=function(t){return"object"==typeof t&&null!==t&&t.$$typeof===n},e.isForwardRef=function(t){return O(t)===p},e.isFragment=function(t){return O(t)===i},e.isLazy=function(t){return O(t)===v},e.isMemo=function(t){return O(t)===h},e.isPortal=function(t){return O(t)===o},e.isProfiler=function(t){return O(t)===u},e.isStrictMode=function(t){return O(t)===a},e.isSuspense=function(t){return O(t)===d},e.isValidElementType=function(t){return"string"==typeof t||"function"==typeof t||t===i||t===f||t===u||t===a||t===d||t===y||"object"==typeof t&&null!==t&&(t.$$typeof===v||t.$$typeof===h||t.$$typeof===c||t.$$typeof===s||t.$$typeof===p||t.$$typeof===m||t.$$typeof===g||t.$$typeof===w||t.$$typeof===b)},e.typeOf=O},363:function(t,e,r){"use strict";t.exports=r(799)},609:function(t){"use strict";t.exports=window.React}},e={};function r(n){var o=e[n];if(void 0!==o)return o.exports;var i=e[n]={id:n,exports:{}};return t[n](i,i.exports,r),i.exports}r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,{a:e}),e},r.cw=function(t){var e;return function(){if(t){var r=t;t=0,e={exports:{}},r.call(e.exports,e,e.exports)}return e.exports}},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.nc=void 0,function(){"use strict";var t="undefined"!=typeof globalThis&&globalThis||"undefined"!=typeof self&&self||void 0!==r.g&&r.g||{},e="URLSearchParams"in t,n="Symbol"in t&&"iterator"in Symbol,o="FileReader"in t&&"Blob"in t&&function(){try{return new Blob,!0}catch(t){return!1}}(),i="FormData"in t,a="ArrayBuffer"in t;if(a)var u=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]"],c=ArrayBuffer.isView||function(t){return t&&u.indexOf(Object.prototype.toString.call(t))>-1};function s(t){if("string"!=typeof t&&(t=String(t)),/[^a-z0-9\-#$%&'*+.^_`|~!]/i.test(t)||""===t)throw new TypeError('Invalid character in header field name: "'+t+'"');return t.toLowerCase()}function l(t){return"string"!=typeof t&&(t=String(t)),t}function f(t){var e={next:function(){var e=t.shift();return{done:void 0===e,value:e}}};return n&&(e[Symbol.iterator]=function(){return e}),e}function p(t){this.map={},t instanceof p?t.forEach(function(t,e){this.append(e,t)},this):Array.isArray(t)?t.forEach(function(t){if(2!=t.length)throw new TypeError("Headers constructor: expected name/value pair to be length 2, found"+t.length);this.append(t[0],t[1])},this):t&&Object.getOwnPropertyNames(t).forEach(function(e){this.append(e,t[e])},this)}function d(t){if(!t._noBody)return t.bodyUsed?Promise.reject(new TypeError("Already read")):void(t.bodyUsed=!0)}function y(t){return new Promise(function(e,r){t.onload=function(){e(t.result)},t.onerror=function(){r(t.error)}})}function h(t){var e=new FileReader,r=y(e);return e.readAsArrayBuffer(t),r}function v(t){if(t.slice)return t.slice(0);var e=new Uint8Array(t.byteLength);return e.set(new Uint8Array(t)),e.buffer}function b(){return this.bodyUsed=!1,this._initBody=function(t){var r;this.bodyUsed=this.bodyUsed,this._bodyInit=t,t?"string"==typeof t?this._bodyText=t:o&&Blob.prototype.isPrototypeOf(t)?this._bodyBlob=t:i&&FormData.prototype.isPrototypeOf(t)?this._bodyFormData=t:e&&URLSearchParams.prototype.isPrototypeOf(t)?this._bodyText=t.toString():a&&o&&(r=t)&&DataView.prototype.isPrototypeOf(r)?(this._bodyArrayBuffer=v(t.buffer),this._bodyInit=new Blob([this._bodyArrayBuffer])):a&&(ArrayBuffer.prototype.isPrototypeOf(t)||c(t))?this._bodyArrayBuffer=v(t):this._bodyText=t=Object.prototype.toString.call(t):(this._noBody=!0,this._bodyText=""),this.headers.get("content-type")||("string"==typeof t?this.headers.set("content-type","text/plain;charset=UTF-8"):this._bodyBlob&&this._bodyBlob.type?this.headers.set("content-type",this._bodyBlob.type):e&&URLSearchParams.prototype.isPrototypeOf(t)&&this.headers.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"))},o&&(this.blob=function(){var t=d(this);if(t)return t;if(this._bodyBlob)return Promise.resolve(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(new Blob([this._bodyArrayBuffer]));if(this._bodyFormData)throw new Error("could not read FormData body as blob");return Promise.resolve(new Blob([this._bodyText]))}),this.arrayBuffer=function(){if(this._bodyArrayBuffer)return d(this)||(ArrayBuffer.isView(this._bodyArrayBuffer)?Promise.resolve(this._bodyArrayBuffer.buffer.slice(this._bodyArrayBuffer.byteOffset,this._bodyArrayBuffer.byteOffset+this._bodyArrayBuffer.byteLength)):Promise.resolve(this._bodyArrayBuffer));if(o)return this.blob().then(h);throw new Error("could not read as ArrayBuffer")},this.text=function(){var t,e,r,n,o,i=d(this);if(i)return i;if(this._bodyBlob)return t=this._bodyBlob,r=y(e=new FileReader),o=(n=/charset=([A-Za-z0-9_-]+)/.exec(t.type))?n[1]:"utf-8",e.readAsText(t,o),r;if(this._bodyArrayBuffer)return Promise.resolve(function(t){for(var e=new Uint8Array(t),r=new Array(e.length),n=0;n-1?o:n),this.mode=r.mode||this.mode||null,this.signal=r.signal||this.signal||function(){if("AbortController"in t)return(new AbortController).signal}(),this.referrer=null,("GET"===this.method||"HEAD"===this.method)&&i)throw new TypeError("Body not allowed for GET or HEAD requests");if(this._initBody(i),!("GET"!==this.method&&"HEAD"!==this.method||"no-store"!==r.cache&&"no-cache"!==r.cache)){var a=/([?&])_=[^&]*/;a.test(this.url)?this.url=this.url.replace(a,"$1_="+(new Date).getTime()):this.url+=(/\?/.test(this.url)?"&":"?")+"_="+(new Date).getTime()}}function w(t){var e=new FormData;return t.trim().split("&").forEach(function(t){if(t){var r=t.split("="),n=r.shift().replace(/\+/g," "),o=r.join("=").replace(/\+/g," ");e.append(decodeURIComponent(n),decodeURIComponent(o))}}),e}function O(t,e){if(!(this instanceof O))throw new TypeError('Please use the "new" operator, this DOM object constructor cannot be called as a function.');if(e||(e={}),this.type="default",this.status=void 0===e.status?200:e.status,this.status<200||this.status>599)throw new RangeError("Failed to construct 'Response': The status provided (0) is outside the range [200, 599].");this.ok=this.status>=200&&this.status<300,this.statusText=void 0===e.statusText?"":""+e.statusText,this.headers=new p(e.headers),this.url=e.url||"",this._initBody(t)}g.prototype.clone=function(){return new g(this,{body:this._bodyInit})},b.call(g.prototype),b.call(O.prototype),O.prototype.clone=function(){return new O(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new p(this.headers),url:this.url})},O.error=function(){var t=new O(null,{status:200,statusText:""});return t.ok=!1,t.status=0,t.type="error",t};var S=[301,302,303,307,308];O.redirect=function(t,e){if(-1===S.indexOf(e))throw new RangeError("Invalid status code");return new O(null,{status:e,headers:{location:t}})};var j=t.DOMException;try{new j}catch(t){(j=function(t,e){this.message=t,this.name=e;var r=Error(t);this.stack=r.stack}).prototype=Object.create(Error.prototype),j.prototype.constructor=j}function _(e,r){return new Promise(function(n,i){var u=new g(e,r);if(u.signal&&u.signal.aborted)return i(new j("Aborted","AbortError"));var c=new XMLHttpRequest;function f(){c.abort()}if(c.onload=function(){var t,e,r={statusText:c.statusText,headers:(t=c.getAllResponseHeaders()||"",e=new p,t.replace(/\r?\n[\t ]+/g," ").split("\r").map(function(t){return 0===t.indexOf("\n")?t.substr(1,t.length):t}).forEach(function(t){var r=t.split(":"),n=r.shift().trim();if(n){var o=r.join(":").trim();try{e.append(n,o)}catch(t){console.warn("Response "+t.message)}}}),e)};0===u.url.indexOf("file://")&&(c.status<200||c.status>599)?r.status=200:r.status=c.status,r.url="responseURL"in c?c.responseURL:r.headers.get("X-Request-URL");var o="response"in c?c.response:c.responseText;setTimeout(function(){n(new O(o,r))},0)},c.onerror=function(){setTimeout(function(){i(new TypeError("Network request failed"))},0)},c.ontimeout=function(){setTimeout(function(){i(new TypeError("Network request timed out"))},0)},c.onabort=function(){setTimeout(function(){i(new j("Aborted","AbortError"))},0)},c.open(u.method,function(e){try{return""===e&&t.location.href?t.location.href:e}catch(t){return e}}(u.url),!0),"include"===u.credentials?c.withCredentials=!0:"omit"===u.credentials&&(c.withCredentials=!1),"responseType"in c&&(o?c.responseType="blob":a&&(c.responseType="arraybuffer")),r&&"object"==typeof r.headers&&!(r.headers instanceof p||t.Headers&&r.headers instanceof t.Headers)){var d=[];Object.getOwnPropertyNames(r.headers).forEach(function(t){d.push(s(t)),c.setRequestHeader(t,l(r.headers[t]))}),u.headers.forEach(function(t,e){-1===d.indexOf(e)&&c.setRequestHeader(e,t)})}else u.headers.forEach(function(t,e){c.setRequestHeader(e,t)});u.signal&&(u.signal.addEventListener("abort",f),c.onreadystatechange=function(){4===c.readyState&&u.signal.removeEventListener("abort",f)}),c.send(void 0===u._bodyInit?null:u._bodyInit)})}_.polyfill=!0,t.fetch||(t.fetch=_,t.Headers=p,t.Request=g,t.Response=O)}(),function(){"use strict";var t=r.cw(function(t,e){function r(t){return r="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},r(t)}var n=Symbol.for("react.element"),o=Symbol.for("react.portal"),i=Symbol.for("react.fragment"),a=Symbol.for("react.strict_mode"),u=Symbol.for("react.profiler"),c=Symbol.for("react.provider"),s=Symbol.for("react.context"),l=Symbol.for("react.server_context"),f=Symbol.for("react.forward_ref"),p=Symbol.for("react.suspense"),d=Symbol.for("react.suspense_list"),y=Symbol.for("react.memo"),h=Symbol.for("react.lazy");Symbol.for("react.offscreen");Symbol.for("react.module.reference"),e.isContextConsumer=function(t){return function(t){if("object"===r(t)&&null!==t){var e=t.$$typeof;switch(e){case n:switch(t=t.type){case i:case u:case a:case p:case d:return t;default:switch(t=t&&t.$$typeof){case l:case s:case f:case h:case y:case c:return t;default:return e}}case o:return e}}}(t)===s}}),e=r.cw(function(e,r){e.exports=t()}),n=r.cw(function(t,e){var r=a();t.exports=function(t){var e=typeof t;if("string"===e){var n=t;if(0===(t=+t)&&r(n))return!1}else if("number"!==e)return!1;return t-t<1}}),o=r.cw(function(t,e){var r=c(),n={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},o={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},a={};function u(t){return r.isMemo(t)?i:a[t.$$typeof]||n}a[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},a[r.Memo]=i;var s=Object.defineProperty,l=Object.getOwnPropertyNames,f=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,d=Object.getPrototypeOf,y=Object.prototype;t.exports=function t(e,r,n){if("string"!=typeof r){if(y){var i=d(r);i&&i!==y&&t(e,i,n)}var a=l(r);f&&(a=a.concat(f(r)));for(var c=u(e),h=u(r),v=0;v0?" ".concat(r.layer):""," {")),n+=r.css,o&&(n+="}"),r.media&&(n+="}"),r.supports&&(n+="}");var i=r.sourceMap;i&&"undefined"!=typeof btoa&&(n+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(i))))," */")),e.styleTagTransform(n,t,e.options)}(e,t,r)},remove:function(){!function(t){if(null===t.parentNode)return!1;t.parentNode.removeChild(t)}(e)}}}}),y=r.cw(function(t,e){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))}}}),h=r.cw(function(t,e){var r=g(),n="function"==typeof Object.is?Object.is:function(t,e){return t===e&&(0!==t||1/t==1/e)||t!=t&&e!=e},o=r.useState,i=r.useEffect,a=r.useLayoutEffect,u=r.useDebugValue;function c(t){var e=t.getSnapshot;t=t.value;try{var r=e();return!n(t,r)}catch(t){return!0}}var s="undefined"==typeof window||void 0===window.document||void 0===window.document.createElement?function(t,e){return e()}:function(t,e){var r=e(),n=o({inst:{value:r,getSnapshot:e}}),s=n[0].inst,l=n[1];return a(function(){s.value=r,s.getSnapshot=e,c(s)&&l({inst:s})},[t,r,e]),i(function(){return c(s)&&l({inst:s}),t(function(){c(s)&&l({inst:s})})},[t]),u(r),r};e.useSyncExternalStore=void 0!==r.useSyncExternalStore?r.useSyncExternalStore:s}),v=r.cw(function(t,e){var r=g(),n=b(),o="function"==typeof Object.is?Object.is:function(t,e){return t===e&&(0!==t||1/t==1/e)||t!=t&&e!=e},i=n.useSyncExternalStore,a=r.useRef,u=r.useEffect,c=r.useMemo,s=r.useDebugValue;e.useSyncExternalStoreWithSelector=function(t,e,r,n,l){var f=a(null);if(null===f.current){var p={hasValue:!1,value:null};f.current=p}else p=f.current;f=c(function(){function t(t){if(!u){if(u=!0,i=t,t=n(t),void 0!==l&&p.hasValue){var e=p.value;if(l(e,t))return a=e}return a=t}if(e=a,o(i,t))return e;var r=n(t);return void 0!==l&&l(e,r)?(i=t,e):(i=t,a=r)}var i,a,u=!1,c=void 0===r?null:r;return[function(){return t(e())},null===c?void 0:function(){return t(c())}]},[e,r,n,l]);var d=i(t,f[0],f[1]);return u(function(){p.hasValue=!0,p.value=d},[d]),s(d),d}}),b=r.cw(function(t,e){t.exports=h()}),m=r.cw(function(t,e){t.exports=v()}),g=function(){return r(609)};function w(){return w.c||(w.c=r.n(g()))}r(186),g();var O=window.ReactDOM,S=r.n(O),j=window.PropTypes,_=r.n(j);b(),m();var E=function(t){t()},P=function(){return E},k=Symbol.for("react-redux-context"),A="undefined"!=typeof globalThis?globalThis:{};function T(){var t;if(!g().createContext)return{};var e=null!=(t=A[k])?t:A[k]=new Map,r=e.get(g().createContext);return r||(r=g().createContext(null),e.set(g().createContext,r)),r}var x=T();function I(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:x;return function(){return(0,g().useContext)(t)}}var C=I(),R=function(){throw new Error("uSES not initialized!")},D=R,N=function(t,e){return t===e};function M(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:x,e=t===x?C:I(t);return function(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n="function"==typeof r?{equalityFn:r}:r,o=n.equalityFn,i=void 0===o?N:o,a=n.stabilityCheck,u=void 0===a?void 0:a;n.noopCheck;var c=e(),s=c.store,l=c.subscription,f=c.getServerState,p=c.stabilityCheck,d=(c.noopCheck,(0,g().useRef)(!0),(0,g().useCallback)({[t.name]:e=>t(e)}[t.name],[t,p,u])),y=D(l.addNestedSub,s.getState,f||s.getState,d,i);return(0,g().useDebugValue)(y),y}}var U=M();function q(){return q=Object.assign?Object.assign.bind():function(t){for(var e=1;et.length)&&(e=t.length);for(var r=0,n=Array(e);r3&&void 0!==arguments[3]?arguments[3]:{},i=(o.pure,o.areStatesEqual),a=void 0===i?st:i,u=o.areOwnPropsEqual,c=void 0===u?et:u,s=o.areStatePropsEqual,l=void 0===s?et:s,f=o.areMergedPropsEqual,p=void 0===f?et:f,d=o.forwardRef,y=void 0!==d&&d,h=o.context,v=void 0===h?x:h,b=function(t){return t?"function"==typeof t?$(t):z(t,"mapStateToProps"):H(function(){return{}})}(e),m=function(t){return t&&"object"===V(t)?H(function(e){return function(t,e){var r={},n=function(){var n=t[o];"function"==typeof n&&(r[o]=function(){return e(n.apply(void 0,arguments))})};for(var o in t)n();return r}(t,e)}):t?"function"==typeof t?$(t):z(t,"mapDispatchToProps"):H(function(t){return{dispatch:t}})}(r),w=function(t){return t?"function"==typeof t?function(t){return function(e,r){r.displayName;var n,o=r.areMergedPropsEqual,i=!1;return function(e,r,a){var u=t(e,r,a);return i?o(u,n)||(n=u):(i=!0,n=u),n}}}(t):z(t,"mergeProps"):function(){return K}}(n),O=Boolean(e);return function(e){var r=e.displayName||e.name||"Component",n="Connect(".concat(r,")"),o={shouldHandleStateChanges:O,displayName:n,wrappedComponentName:r,WrappedComponent:e,initMapStateToProps:b,initMapDispatchToProps:m,initMergeProps:w,areStatesEqual:a,areStatePropsEqual:l,areOwnPropsEqual:c,areMergedPropsEqual:p};function i(r){var n=g().useMemo(function(){var t=r.reactReduxForwardedRef,e=L(r,it);return[r.context,t,e]},[r]),i=rt(n,3),a=i[0],u=i[1],c=i[2],s=g().useMemo(function(){return a&&a.Consumer&&(0,t().isContextConsumer)(g().createElement(a.Consumer,null))?a:v},[a,v]),l=g().useContext(s),f=Boolean(r.store)&&Boolean(r.store.getState)&&Boolean(r.store.dispatch),p=Boolean(l)&&Boolean(l.store),d=f?r.store:l.store,y=p?l.getServerState:d.getState,h=g().useMemo(function(){return function(t,e){var r=e.initMapStateToProps,n=e.initMapDispatchToProps,o=e.initMergeProps,i=L(e,F);return B(r(t,i),n(t,i),o(t,i),t,i)}(d.dispatch,o)},[d]),b=g().useMemo(function(){if(!O)return ut;var t=Q(d,f?void 0:l.subscription),e=t.notifyNestedSubs.bind(t);return[t,e]},[d,f,l]),m=rt(b,2),w=m[0],S=m[1],j=g().useMemo(function(){return f?l:q({},l,{subscription:w})},[f,l,w]),_=g().useRef(),E=g().useRef(c),P=g().useRef(),k=g().useRef(!1),A=(g().useRef(!1),g().useRef(!1)),T=g().useRef();X(function(){return A.current=!0,function(){A.current=!1}},[]);var x,I,C,R=g().useMemo(function(){return function(){return P.current&&c===E.current?P.current:h(d.getState(),c)}},[d,c]),D=g().useMemo(function(){return function(t){return w?function(t,e,r,n,o,i,a,u,c,s,l){if(!t)return function(){};var f=!1,p=null,d=function(){if(!f&&u.current){var t,r,d=e.getState();try{t=n(d,o.current)}catch(t){r=t,p=t}r||(p=null),t===i.current?a.current||s():(i.current=t,c.current=t,a.current=!0,l())}};return r.onStateChange=d,r.trySubscribe(),d(),function(){if(f=!0,r.tryUnsubscribe(),r.onStateChange=null,p)throw p}}(O,d,w,h,E,_,k,A,P,S,t):function(){}}},[w]);x=ct,I=[E,_,k,c,P,S],X(function(){return x.apply(void 0,function(t){if(Array.isArray(t))return ot(t)}(t=I)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||nt(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}());var t},void 0);try{C=at(D,R,y?function(){return h(y(),c)}:R)}catch(t){throw T.current&&(t.message+="\nThe error may be correlated with this previous error:\n".concat(T.current.stack,"\n\n")),t}X(function(){T.current=void 0,P.current=void 0,_.current=C});var N=g().useMemo(function(){return g().createElement(e,q({},C,{ref:u}))},[u,e,C]);return g().useMemo(function(){return O?g().createElement(s.Provider,{value:j},N):N},[s,N,j])}var u=g().memo(i);if(u.WrappedComponent=e,u.displayName=i.displayName=n,y){var s=g().forwardRef(function(t,e){return g().createElement(u,q({},t,{reactReduxForwardedRef:e}))});return s.displayName=n,s.WrappedComponent=e,G()()(s,e)}return G()()(u,e)}},ft=function(t){var e=t.store,r=t.context,n=t.children,o=t.serverState,i=t.stabilityCheck,a=void 0===i?"once":i,u=t.noopCheck,c=void 0===u?"once":u,s=g().useMemo(function(){var t=Q(e);return{store:e,subscription:t,getServerState:o?function(){return o}:void 0,stabilityCheck:a,noopCheck:c}},[e,o,a,c]),l=g().useMemo(function(){return e.getState()},[e]);X(function(){var t=s.subscription;return t.onStateChange=t.notifyNestedSubs,t.trySubscribe(),l!==e.getState()&&t.notifyNestedSubs(),function(){t.tryUnsubscribe(),t.onStateChange=void 0}},[s,l]);var f=r||x;return g().createElement(f.Provider,{value:s},n)};function pt(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:x,e=t===x?C:I(t);return function(){return e().store}}var dt=pt();function yt(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:x,e=t===x?dt:pt(t);return function(){return e().dispatch}}var ht,vt,bt=yt();function mt(t,e){switch(t){case 0:return function(){return e.apply(this,arguments)};case 1:return function(t){return e.apply(this,arguments)};case 2:return function(t,r){return e.apply(this,arguments)};case 3:return function(t,r,n){return e.apply(this,arguments)};case 4:return function(t,r,n,o){return e.apply(this,arguments)};case 5:return function(t,r,n,o,i){return e.apply(this,arguments)};case 6:return function(t,r,n,o,i,a){return e.apply(this,arguments)};case 7:return function(t,r,n,o,i,a,u){return e.apply(this,arguments)};case 8:return function(t,r,n,o,i,a,u,c){return e.apply(this,arguments)};case 9:return function(t,r,n,o,i,a,u,c,s){return e.apply(this,arguments)};case 10:return function(t,r,n,o,i,a,u,c,s,l){return e.apply(this,arguments)};default:throw new Error("First argument to _arity must be a non-negative integer no greater than ten")}}function gt(t){return gt="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},gt(t)}function wt(t){return null!=t&&"object"===gt(t)&&!0===t["@@functional/placeholder"]}function Ot(t){return function e(r){return 0===arguments.length||wt(r)?e:t.apply(this,arguments)}}ht=v().useSyncExternalStoreWithSelector,D=ht,function(t){at=t}(h().useSyncExternalStore),vt=O.unstable_batchedUpdates,E=vt;var St=Ot(function(t){var e,r=!1;return mt(t.length,function(){return r?e:(r=!0,e=t.apply(this,arguments))})}),jt=St;function _t(t){return _t="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},_t(t)}function Et(t,e,r){return(e=function(t){var e=function(t){if("object"!=_t(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var r=e.call(t,"string");if("object"!=_t(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==_t(e)?e:e+""}(e))in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function Pt(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 kt(t){for(var e=1;e=0;)Ft(e=zt[r],t)&&!Kt(n,e)&&(n[n.length]=e),r-=1;return n}):Ot(function(t){return Object(t)!==t?[]:Object.keys(t)}),Qt=Ot(function(t){return null===t?"Null":void 0===t?"Undefined":Object.prototype.toString.call(t).slice(8,-1)});function Xt(t){return Xt="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},Xt(t)}function Zt(t,e,r,n){var o=Lt(t);function i(t,e){return te(t,e,r.slice(),n.slice())}return!Gt(function(t,e){return!Gt(i,e,t)},Lt(e),o)}function te(t,e,r,n){if(Bt(t,e))return!0;var o,i,a=Qt(t);if(a!==Qt(e))return!1;if("function"==typeof t["fantasy-land/equals"]||"function"==typeof e["fantasy-land/equals"])return"function"==typeof t["fantasy-land/equals"]&&t["fantasy-land/equals"](e)&&"function"==typeof e["fantasy-land/equals"]&&e["fantasy-land/equals"](t);if("function"==typeof t.equals||"function"==typeof e.equals)return"function"==typeof t.equals&&t.equals(e)&&"function"==typeof e.equals&&e.equals(t);switch(a){case"Arguments":case"Array":case"Object":if("function"==typeof t.constructor&&"Promise"===(o=t.constructor,null==(i=String(o).match(/^function (\w*)/))?"":i[1]))return t===e;break;case"Boolean":case"Number":case"String":if(Xt(t)!==Xt(e)||!Bt(t.valueOf(),e.valueOf()))return!1;break;case"Date":if(!Bt(t.valueOf(),e.valueOf()))return!1;break;case"Error":return t.name===e.name&&t.message===e.message;case"RegExp":if(t.source!==e.source||t.global!==e.global||t.ignoreCase!==e.ignoreCase||t.multiline!==e.multiline||t.sticky!==e.sticky||t.unicode!==e.unicode)return!1}for(var u=r.length-1;u>=0;){if(r[u]===t)return n[u]===e;u-=1}switch(a){case"Map":return t.size===e.size&&Zt(t.entries(),e.entries(),r.concat([t]),n.concat([e]));case"Set":return t.size===e.size&&Zt(t.values(),e.values(),r.concat([t]),n.concat([e]));case"Arguments":case"Array":case"Object":case"Boolean":case"Number":case"String":case"Date":case"Error":case"RegExp":case"Int8Array":case"Uint8Array":case"Uint8ClampedArray":case"Int16Array":case"Uint16Array":case"Int32Array":case"Uint32Array":case"Float32Array":case"Float64Array":case"ArrayBuffer":break;default:return!1}var c=Yt(t);if(c.length!==Yt(e).length)return!1;var s=r.concat([t]),l=n.concat([e]);for(u=c.length-1;u>=0;){var f=c[u];if(!Ft(f,e)||!te(e[f],t[f],s,l))return!1;u-=1}return!0}var ee=qt(function(t,e){return te(t,e,[],[])});function re(t){return re="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},re(t)}function ne(t,e,r){var n,o;if("function"==typeof t.indexOf)switch(re(e)){case"number":if(0===e){for(n=1/e;r=0}var ie=qt(oe);function ae(t){return function e(r,n,o){switch(arguments.length){case 0:return e;case 1:return wt(r)?e:qt(function(e,n){return t(r,e,n)});case 2:return wt(r)&&wt(n)?e:wt(r)?qt(function(e,r){return t(e,n,r)}):wt(n)?qt(function(e,n){return t(r,e,n)}):Ot(function(e){return t(r,n,e)});default:return wt(r)&&wt(n)&&wt(o)?e:wt(r)&&wt(n)?qt(function(e,r){return t(e,r,o)}):wt(r)&&wt(o)?qt(function(e,r){return t(e,n,r)}):wt(n)&&wt(o)?qt(function(e,n){return t(r,e,n)}):wt(r)?Ot(function(e){return t(e,n,o)}):wt(n)?Ot(function(e){return t(r,e,o)}):wt(o)?Ot(function(e){return t(r,n,e)}):t(r,n,o)}}}var ue=Number.isInteger||function(t){return(0|t)===t};function ce(t){return"[object String]"===Object.prototype.toString.call(t)}function se(t,e){var r=t<0?e.length+t:t;return ce(e)?e.charAt(r):e[r]}function le(t,e){for(var r=e,n=0;n=0&&"[object Array]"===Object.prototype.toString.call(t)},ye=Ot(function(t){return null==t});function he(t){return he="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},he(t)}var ve=ae(function t(e,r,n){if(0===e.length)return r;var o=e[0];if(e.length>1){var i=!ye(n)&&Ft(o,n)&&"object"===he(n[o])?n[o]:ue(e[1])?[]:{};r=t(Array.prototype.slice.call(e,1),r,i)}return function(t,e,r){if(ue(t)&&de(r)){var n=[].concat(r);return n[t]=e,n}var o={};for(var i in r)o[i]=r[i];return o[t]=e,o}(o,r,n)}),be=ae(function(t,e,r){return ve([t],e,r)});function me(t,e){return function(){var r=arguments.length;if(0===r)return e();var n=arguments[r-1];return de(n)||"function"!=typeof n[t]?e.apply(this,arguments):n[t].apply(n,Array.prototype.slice.call(arguments,0,r-1))}}var ge=qt(me("forEach",function(t,e){for(var r=e.length,n=0;n0&&t.hasOwnProperty(0)&&t.hasOwnProperty(t.length-1))});function Be(t){return function e(r){for(var n,o,i,a=[],u=0,c=r.length;u=arguments.length)?c=e[a]:(c=arguments[o],o+=1),n[a]=c,wt(c)?u=!0:i-=1,a+=1}return!u&&i<=0?r.apply(this,n):mt(Math.max(0,i),ze(t,n,r))}}var Ve=qt(function(t,e){return 1===t?Ot(e):mt(t,ze(t,[],e))}),Ke=Ve,Ye=qt(Re(["fantasy-land/map","map"],We,function(t,e){switch(Object.prototype.toString.call(e)){case"[object Function]":return Ke(e.length,function(){return t.call(this,e.apply(this,arguments))});case"[object Object]":return Ce(function(r,n){return r[n]=t(e[n]),r},{},Yt(e));default:return Je(t,e)}})),Qe=Ye,Xe="undefined"!=typeof Symbol?Symbol.iterator:"@@iterator";function Ze(t,e,r){return function(n,o,i){if(Fe(i))return t(n,o,i);if(null==i)return o;if("function"==typeof i["fantasy-land/reduce"])return e(n,o,i,"fantasy-land/reduce");if(null!=i[Xe])return r(n,o,i[Xe]());if("function"==typeof i.next)return r(n,o,i);if("function"==typeof i.reduce)return e(n,o,i,"reduce");throw new TypeError("reduce: list must be array or iterable")}}function tr(t,e,r){for(var n=0,o=r.length;n":vr(r,n)},n=function(t,e){return Je(function(e){return lr(e)+": "+r(t[e])},e.slice().sort())};switch(Object.prototype.toString.call(t)){case"[object Arguments]":return"(function() { return arguments; }("+Je(r,t).join(", ")+"))";case"[object Array]":return"["+Je(r,t).concat(n(t,yr(function(t){return/^\d+$/.test(t)},Yt(t)))).join(", ")+"]";case"[object Boolean]":return"object"===hr(t)?"new Boolean("+r(t.valueOf())+")":t.toString();case"[object Date]":return"new Date("+(isNaN(t.valueOf())?r(NaN):lr(pr(t)))+")";case"[object Map]":return"new Map("+r(Array.from(t))+")";case"[object Null]":return"null";case"[object Number]":return"object"===hr(t)?"new Number("+r(t.valueOf())+")":1/t==-1/0?"-0":t.toString(10);case"[object Set]":return"new Set("+r(Array.from(t).sort())+")";case"[object String]":return"object"===hr(t)?"new String("+r(t.valueOf())+")":lr(t);case"[object Undefined]":return"undefined";default:if("function"==typeof t.toString){var o=t.toString();if("[object Object]"!==o)return o}return"{"+n(t,Yt(t)).join(", ")+"}"}}var br=Ot(function(t){return vr(t,[])}),mr=qt(function(t,e){if(de(t)){if(de(e))return t.concat(e);throw new TypeError(br(e)+" is not an array")}if(ce(t)){if(ce(e))return t+e;throw new TypeError(br(e)+" is not a string")}if(null!=t&&sr(t["fantasy-land/concat"]))return t["fantasy-land/concat"](e);if(null!=t&&sr(t.concat))return t.concat(e);throw new TypeError(br(t)+' does not have a method named "concat" or "fantasy-land/concat"')});function gr(t){return t&&t["@@transducer/reduced"]?t:{"@@transducer/value":t,"@@transducer/reduced":!0}}var wr=function(){function t(t,e){this.xf=e,this.f=t,this.all=!0}return t.prototype["@@transducer/init"]=Ne,t.prototype["@@transducer/result"]=function(t){return this.all&&(t=this.xf["@@transducer/step"](t,!0)),this.xf["@@transducer/result"](t)},t.prototype["@@transducer/step"]=function(t,e){return this.f(e)||(this.all=!1,t=gr(this.xf["@@transducer/step"](t,!1))),t},t}();function Or(t){return function(e){return new wr(t,e)}}var Sr=qt(Re(["all"],Or,function(t,e){for(var r=0;re!=e>t)return e>t?e:t}var n=r(t,e);if(void 0!==n)return n;var o=r(_r(t),_r(e));if(void 0!==o)return o===_r(t)?t:e;var i=br(t),a=r(i,br(e));return void 0!==a&&a===i?t:e}),Pr=qt(function(t,e){return Qe(xe(t),e)}),kr=qt(function(t,e){return Ke(cr(Er,0,Pr("length",e)),function(){var r=arguments,n=this;return t.apply(n,Je(function(t){return t.apply(n,r)},e))})}),Ar=kr,Tr=Ot(function(t){return Ar(function(){return Array.prototype.slice.call(arguments,0)},t)}),xr=Tr([Le,yr]);function Ir(t){return Ir="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},Ir(t)}function Cr(t,e,r){var n,o=Ir(t);switch(o){case"string":case"number":return 0===t&&1/t==-1/0?!!r._items["-0"]||(e&&(r._items["-0"]=!0),!1):null!==r._nativeSet?e?(n=r._nativeSet.size,r._nativeSet.add(t),r._nativeSet.size===n):r._nativeSet.has(t):o in r._items?t in r._items[o]||(e&&(r._items[o][t]=!0),!1):(e&&(r._items[o]={},r._items[o][t]=!0),!1);case"boolean":if(o in r._items){var i=t?1:0;return!!r._items[o][i]||(e&&(r._items[o][i]=!0),!1)}return e&&(r._items[o]=t?[!1,!0]:[!0,!1]),!1;case"function":return null!==r._nativeSet?e?(n=r._nativeSet.size,r._nativeSet.add(t),r._nativeSet.size===n):r._nativeSet.has(t):o in r._items?!!oe(t,r._items[o])||(e&&r._items[o].push(t),!1):(e&&(r._items[o]=[t]),!1);case"undefined":return!!r._items[o]||(e&&(r._items[o]=!0),!1);case"object":if(null===t)return!!r._items.null||(e&&(r._items.null=!0),!1);default:return(o=Object.prototype.toString.call(t))in r._items?!!oe(t,r._items[o])||(e&&r._items[o].push(t),!1):(e&&(r._items[o]=[t]),!1)}}var Rr=function(){function t(){this._nativeSet="function"==typeof Set?new Set:null,this._items={}}return t.prototype.add=function(t){return!Cr(t,!0,this)},t.prototype.has=function(t){return Cr(t,!1,this)},t}(),Dr=qt(function(t,e){for(var r=[],n=0,o=t.length,i=e.length,a=new Rr,u=0;u=0&&this.i>=this.n?gr(r):r},t}();function vn(t){return function(e){return new hn(t,e)}}var bn=ae(me("slice",function(t,e,r){return Array.prototype.slice.call(r,t,e)})),mn=qt(Re(["take"],vn,function(t,e){return bn(0,t<0?1/0:t,e)})),gn=qt(function(t,e){return ee(mn(t.length,e),t)}),wn=qt(function(t,e){return"function"!=typeof e.indexOf||de(e)?ne(e,t,0):e.indexOf(t)}),On=ae(function(t,e,r){t=t=0?t:r.length;var n=Array.prototype.slice.call(r,0);return n.splice(t,0,e),n}),Sn=function(){function t(t,e){this.xf=e,this.f=t,this.found=!1}return t.prototype["@@transducer/init"]=Ne,t.prototype["@@transducer/result"]=function(t){return this.found||(t=this.xf["@@transducer/step"](t,void 0)),this.xf["@@transducer/result"](t)},t.prototype["@@transducer/step"]=function(t,e){return this.f(e)&&(this.found=!0,t=gr(this.xf["@@transducer/step"](t,e))),t},t}();function jn(t){return function(e){return new Sn(t,e)}}var _n=qt(Re(["find"],jn,function(t,e){for(var r=0,n=e.length;rt.length)&&(e=t.length);for(var r=0,n=Array(e);r2&&void 0!==arguments[2]?arguments[2]:[],n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:void 0;if(Array.isArray(t))t.forEach(function(t,o){if(n){var i=cn(function(t){return ie("{}",t)},n);if(-1!==i){var a=bn(0,i,n),u=bn(i,n.length,n);if(a.length)qn(Oe(a,t),e,mr(r,mr([o],a)),u);else{var c,s=u.map(function(t){return t.replace("{}","")}).filter(function(t){return t}),l=mr([o],s);for(var f in c=s.length?Oe(s,t):t){var p=c[f];qn(p,e,mr(r,l.concat([f])))}}}else qn(Oe(n,t),e,mr(r,mr([o],n)))}else qn(t,e,r.concat(o))});else if("Object"===Qt(t)){e(t,r);var o=t.props&&t.props.children;if(o){var i=r.concat(Un);qn(o,e,i)}var a=window.__dashprivate_childrenProps;(a&&a[t.namespace]&&a[t.namespace][t.type]||[]).forEach(function(n){if(n.includes("[]")){var o=(w=n.split("[]").map(function(t){return t.split(".").filter(function(t){return t})}),O=2,function(t){if(Array.isArray(t))return t}(w)||function(t,e){var r=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=r){var n,o,i,a,u=[],c=!0,s=!1;try{if(i=(r=r.call(t)).next,0===e){if(Object(r)!==r)return;c=!1}else for(;!(c=(n=i.call(r)).done)&&(u.push(n.value),u.length!==e);c=!0);}catch(t){s=!0,o=t}finally{try{if(!c&&null!=r.return&&(a=r.return(),Object(a)!==a))return}finally{if(s)throw o}}return u}}(w,O)||Dn(w,O)||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.")}()),i=o[0],a=o[1],u=mr(["props"],i),c=mr(r,u);qn(Oe(u,t),e,c,a)}else if(n.includes("{}")){for(var s=n.split("."),l=[],f=[],p=!1,d=0;d-1&&r.splice(n,1)}}},{key:"emit",value:function(t){for(var e=this,r=arguments.length,n=new Array(r>1?r-1:0),o=1;o=t.length?{done:!0}:{done:!1,value:t[n++]}},e:function(t){throw t},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,u=!1;return{s:function(){r=r.call(t)},n:function(){var t=r.next();return a=t.done,t},e:function(t){u=!0,i=t},f:function(){try{a||null==r.return||r.return()}finally{if(u)throw i}}}}function ro(t,e){if(t){if("string"==typeof t)return no(t,e);var r={}.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)?no(t,e):void 0}}function no(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);ro?1:ne?1:t0;[[e,"Input"],[r,"State"]].forEach(function(e){var r=to(e,2),u=r[0],c=r[1];u.forEach(function(e,r){var u=ko(e.id),s=u.matchKeys,l=u.allsmallerKeys,f=a?s.concat(l):l,p=Dr(f,i);if(p.length){p.sort();var d=t.length?"Output 0 (".concat(Wo(t[0]),")"):"the (absent) Output";o("`Input` / `State` wildcards not in `Output`s",[n,"".concat(c," ").concat(r," (").concat(Wo(e),")"),"has MATCH or ALLSMALLER on key(s) ".concat(p.join(", ")),"where ".concat(d),"does not have a MATCH wildcard. Inputs and State do not","need every MATCH from the Output(s), but ALLSMALLER","requires a matching MATCH in the Output(s), and when","the Output(s) have any MATCH, Input/State MATCH keys","must be a subset of them."])}})})}(i,o,a,c,e))})}(u,function(t,r){c=!0,e(t,r)});var s={},l={},f=new Map,p=new Map,d=new Map,y=new Map,h={},v={},b={},m={},g=!1,w=!1,O={MultiGraph:n,outputMap:s,inputMap:l,outputPatterns:h,inputPatterns:v,partialOutputPatterns:b,partialInputPatterns:m,hasPartialOutputPatterns:g,hasPartialInputPatterns:w,callbacks:u};if(c)return O;function S(t,e){var r=[{}];return Fr(function(t,n){var o=i[n].vals,a=o.indexOf(e[n]),u=[t];t&&t.wild&&(u=t===co?a>0?o.slice(0,a):[]:-1===a||t===ao?o:[e[n]]),r=nn(nn([be(n)],u),r)},t),r}u.forEach(function(t){var e=t.outputs,r=t.inputs;e.concat(r).filter(function(t){return"object"===oo(t.id)}).forEach(function(t){Fr(function(t,e){i[e]||(i[e]={exact:[],expand:0});var r=i[e];t&&t.wild?t.expand&&(r.expand+=1):-1===r.exact.indexOf(t)&&r.exact.push(t)},t.id)})}),Fr(function(t){var e=t.exact,r=t.expand,n=e.slice().sort(bo);if(r)for(var o=0;o2&&void 0!==arguments[2])||arguments[2];r.validate_callbacks&&(n.addNode(t),n.addDependency(t,e),o&&(E[E.length-1].push(t),P[P.length-1].push(e)))}u.forEach(function(t){var e=t.outputs,o=t.inputs;function i(t,e){r.validate_callbacks&&(n.addNode(e),o.forEach(function(r){var n=r.id,o=r.property;"object"===oo(n)?S(n,t).forEach(function(t){k(Wo({id:t,property:o}),e)}):k(Wo(r),e)}))}E.push([]),P.push([]);var a=ko(e.length?e[0].id:void 0).matchKeys,u=cn(function(t){return!Io(t)},e),c=ln({matchKeys:a,firstSingleOutput:u,outputs:e},t);e.forEach(function(t){var e,n=t.id,a=t.property,u=t.partial;if(r.validate_callbacks&&(e=function(t,e){var r=t.id,n=t.property;return e.some(function(e){var o=e.id,i=e.property;if(n!==i||oo(r)!==oo(o))return!1;if("string"==typeof r){if(r===o)return!0}else if(Eo(e,[t]))return!0;return!1})}(t,o)),"object"===oo(n))r.validate_callbacks&&S(n,{}).forEach(function(t){var r={id:t,property:a},n=Wo(r);e&&(_.push(r),n+=j),i(t,n)}),u?(So(f,n,a,c),So(d,n,a,c),g=!0):Oo(f,n,a,c);else{if(r.validate_callbacks){var l=Wo(t);e&&(_.push(t),l+=j),i({},l)}wo(s,n,a,c)}}),o.forEach(function(t){var e=t.id,r=t.property,n=t.partial;"object"===oo(e)?n?(So(p,e,r,c),So(y,e,r,c),w=!0):Oo(p,e,r,c):wo(l,e,r,c)})}),h=jo(f,h),v=jo(p,v),b=jo(d,b),m=jo(y,m),O.outputPatterns=h,O.inputPatterns=v,O.partialOutputPatterns=b,O.partialInputPatterns=m,O.hasPartialOutputPatterns=g,O.hasPartialInputPatterns=w,_.forEach(function(t){for(var e=Wo(t),r=e.concat(j),n=0;n3&&void 0!==arguments[3]?arguments[3]:"";return function(o){var i=o.matchKeys,a=o.firstSingleOutput,u=o.outputs;if(i.length){var c=u[a];if(c)Ro(o,c,t(e)(c),r);else{var s={};u.forEach(function(n){var a=t(e)(n).filter(function(t){var e=JSON.stringify(Ie(i,t.id));return!s[e]&&(s[e]=1,!0)});Ro(o,n,a,r)})}}else{var l=Zo(o,t,n);r.push(l)}}}function No(t){return No="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},No(t)}function Mo(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 Uo(t){for(var e=1;et.length)&&(e=t.length);for(var r=0,n=Array(e);r5&&void 0!==arguments[5])||arguments[5],a=[],u=Wo({id:r,property:n});if("string"==typeof r){var c=(t.inputMap[r]||{})[n];if(!c)return[];c.forEach(Do(ei(),e,a))}else{var s=Object.keys(r).sort(),l=Ie(s,r),f=s.join(","),p=(t.inputPatterns[f]||{})[n];if(p&&p.forEach(function(t){if(t.partial){if(To(t.keys,t.values,s,l)){var r=xo(t.values,l),n=t.keys.map(function(t){return l[s.indexOf(t)]});t.callbacks.forEach(Do(ri(t.keys,n,t.values),e,a,r))}}else if(Ao(s,l,t.values)){var o=xo(t.values,l);t.callbacks.forEach(Do(ei(s,l,t.values),e,a,o))}}),t.hasPartialInputPatterns)for(var d in t.partialInputPatterns)if(d!==f&&d.split(",").every(function(t){return-1!==s.indexOf(t)})){var y=t.partialInputPatterns[d][n];y&&y.forEach(function(t){if(To(t.keys,t.values,s,l)){var r=xo(t.values,l),n=t.keys.map(function(t){return l[s.indexOf(t)]});t.callbacks.forEach(Do(ri(t.keys,n,t.values),e,a,r))}})}}return a.forEach(function(r){r.changedPropIds[u]=o||Ho,i&&(r.priority=Vo(t,e,r))}),a}function Vo(t,e,r){for(var n=[r],o={},i={},a=[];n.length;){n=Le(function(t){var e=i[t.resolvedId];return i[t.resolvedId]=!0,e},n);var u=Le(function(t){return!o[Wo(t)]},He(Qe(function(t){return He(t.getOutputs(e))},n)));u.forEach(function(t){return o[Wo(t)]=!0}),(n=He(Qe(function(r){var n=r.id,o=r.property;return zo(t,e,n,o,Jo,!1)},u))).length&&a.push(n.length)}return a.unshift(a.length),Qe(function(t){return Math.min(t,35).toString(36)},a).join("")}var Ko=function(t,e){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e,n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};if(!e.length)return[];var o=Qe(Wo,cr(function(e,r){return mr(e,He(r.getOutputs(t)))},[],r)),i={};if(o.forEach(function(t){return i[t]=!0}),Object.keys(n).length){var a=He(Qe(function(e){return function(t,e,r){for(var n=[r],o={};n.length;){var i=Le(function(t){return!o[Wo(t)]},He(Qe(function(t){return He(t.getOutputs(e))},n)));o=cr(function(t,e){return be(Wo(e),!0,t)},o,i),n=He(Qe(function(r){var n=r.id,o=r.property;return zo(t,e,n,o,Jo,!1)},i))}return o}(n,t,e)},r));a.length>0&&(i=Object.assign.apply(Object,[a[0]].concat(Go(a))))}return Le(function(e){return jr(function(t){return!i[Wo(t)]},function(t,e){return t.filter(function(t){return!e.some(function(e){return Wo(t)===Wo(e)})})}(He(e.getInputs(t)),He(e.getOutputs(t))))},e)},Yo=function(t,e,r,n){for(var o=[],i=function(t,e,r,n){var o=n.outputsOnly,i=n.removedArrayInputsOnly,a=n.newPaths,u=n.chunkPath,c=n.patchAnalysis,s={},l=[];function f(t){if(t){var e=s[t.resolvedId];if(void 0!==e){var r=l[e];r.changedPropIds=$o(r.changedPropIds,t.changedPropIds),t.initialCall&&(r.initialCall=!0)}else s[t.resolvedId]=l.length,l.push(t)}}function p(r,n,s){if(n){var l=!!c&&function(t,e){return!(!t||!e||t.freshIds[e])}(c,vo(r));for(var p in n){var d=Co(t,0,r,p);d&&(d.callback.prevent_initial_call||l||(d.initialCall=!0,f(d)))}}if(!o&&s){var y=vo(r),h=i?function(t){return function(r){return r.getInputs(e).some(function(e){return!(!Array.isArray(e)||!e.some(function(e){return vo(e.id)===t})||(He(r.getOutputs(a)).length&&(r.initialCall=!0,r.changedPropIds={},f(r)),0))})}}(y):f;for(var v in s){var b=h;u&&!Kn(c,y,v)&&(b=function(t){jr(gn(u),Pr("path",He(t.getOutputs(e))))||h(t)}),zo(t,e,r,v,Jo).forEach(b)}}}return qn(r,function(e){var r=e.props&&e.props.id;if(r)if("string"!=typeof r||i){var n=Object.keys(r).sort(),o=n.join(",");if(p(r,!i&&t.outputPatterns[o],t.inputPatterns[o]),t.hasPartialInputPatterns)for(var a in t.partialInputPatterns)a!==o&&a.split(",").every(function(t){return-1!==n.indexOf(t)})&&p(r,null,t.partialInputPatterns[a]);if(!i&&t.hasPartialOutputPatterns)for(var u in t.partialOutputPatterns)u!==o&&u.split(",").every(function(t){return-1!==n.indexOf(t)})&&p(r,t.partialOutputPatterns[u],null)}else p(r,t.outputMap[r],t.inputMap[r])}),Qe(function(r){return Xn(Xn({},r),{},{priority:Vo(t,e,r)})},l)}(t,e,r,n);;){var a=Lo(xr(function(t){var r=t.callback.inputs,n=t.getInputs;return jr(Io,r)||!Ee(Dr(Qe(Wo,He(n(e))),o))},i),2),u=a[0],c=a[1];if(!c.length)break;i=u,o=mr(o,Qe(Wo,He(Qe(function(t){return(0,t.getOutputs)(e)},c))))}if(n.filterRoot){var s=Oe(["props","id"],r);s&&(s=vo(s),i=i.filter(function(t){return t.callback.inputs.reduce(function(t,e){return t||vo(e.id)==s&&n.filterRoot.includes(e.property)},!1)}))}var l=Math.random().toString(16);return Qe(function(t){return Uo(Uo({},t),{},{executionGroup:l})},i)},Qo=function(t){var e=t.anyVals,r=t.callback,n=r.inputs,o=r.outputs,i=r.state,a=r.output,u=Qe(Wo,[].concat(Go(n),Go(o),Go(i)));return 0===o.length&&a&&u.push(a),mr(u,Array.isArray(e)?e:""===e?[]:[e]).join(",")};function Xo(t,e,r,n){return He(Qe(function(e){return zo(r,n,t,e)},Yt(e)))}var Zo=function(t,e,r){return{callback:t,anyVals:r,resolvedId:t.output+r,getOutputs:function(r){return t.outputs.map(e(r))},getInputs:function(r){return t.inputs.map(e(r))},getState:function(r){return t.state.map(e(r))},changedPropIds:{},initialCall:!1}};function ti(t,e){var r=Lo(xr(function(t){var r=t.getOutputs,n=t.callback.outputs;return He(r(e)).length===n.length},t),2)[1],n=Lo(xr(function(t){var r=t.getOutputs;return!He(r(e)).length},r),2)[1];return{added:Qe(function(t){return be("changedPropIds",Nr(function(t,r){return Wn(e,yo(r).id)},t.changedPropIds),t)},n),removed:r}}function ei(t,e,r){return function(n){return function(o){var i=o.id,a=o.property,u=o.partial;if("string"==typeof i){var c=Wn(n,i);return c?[{id:i,property:a,path:c}]:[]}var s=Object.keys(i).sort(),l=Ie(s,i),f=s.join(","),p=n.objs[f];if(p){var d=[];return p.forEach(function(n){var o=n.values,i=n.path;Ao(s,o,l,t,e,r)&&d.push({id:Ur(s,o),property:a,path:i})}),d}if(u){var y=[],h=function(){var o=v.split(",");if(!s.every(function(t){return-1!==o.indexOf(t)}))return 1;n.objs[v].forEach(function(n){var i=n.values,u=n.path;To(s,l,o,i,t,e,r)&&y.push({id:Ur(o,i),property:a,path:u})})};for(var v in n.objs)h();return y}return[]}}}function ri(t,e,r,n){return function(n){return function(o){var i=o.id,a=o.property,u=o.partial;if("string"==typeof i){var c=Wn(n,i);return c?[{id:i,property:a,path:c}]:[]}var s=Object.keys(i).sort(),l=Ie(s,i);if(!u){var f=s.join(","),p=n.objs[f];if(!p)return[];var d=[],y=e?s.map(function(r){var n=t.indexOf(r);return-1!==n?e[n]:void 0}):void 0,h=r?s.map(function(e){var n=t.indexOf(e);return-1!==n?r[n]:void 0}):void 0;return p.forEach(function(e){var r=e.values,n=e.path;Ao(s,r,l,t,y,h)&&d.push({id:Ur(s,r),property:a,path:n})}),d}var v=[],b=function(){var o=m.split(",");if(!s.every(function(t){return-1!==o.indexOf(t)}))return 1;n.objs[m].forEach(function(n){var i=n.values,u=n.path;To(s,l,o,i,t,e,r)&&v.push({id:Ur(o,i),property:a,path:u})})};for(var m in n.objs)b();return v}}}var ni={ON_PROP_CHANGE:1,SET_REQUEST_QUEUE:1,SET_GRAPHS:1,SET_PATHS:1,SET_LAYOUT:1,SET_APP_LIFECYCLE:1,SET_CONFIG:1,ADD_HTTP_HEADERS:1,ON_ERROR:1,SET_HOOKS:1,INSERT_COMPONENT:1,REMOVE_COMPONENT:1,RESET_COMPONENT_STATE:1},oi=function(t){if(ni[t])return t;throw new Error("".concat(t," is not defined."))};function ii(t){var e={STARTED:"STARTED",HYDRATED:"HYDRATED",DESTROYED:"DESTROYED"};if(e[t])return e[t];throw new Error("".concat(t," is not a valid app state."))}var ai,ui,ci=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:ii("STARTED"),e=arguments.length>1?arguments[1]:void 0;return e.type===oi("SET_APP_LIFECYCLE")?ii(e.payload):t};function si(t){return si="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},si(t)}function li(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 fi(t){for(var e=1;e1?arguments[1]:void 0;return cr(function(t,e){return null===e?t:e.type===ui.AddCompleted?function(t,e){return fi(fi({},t),{},{completed:t.completed+e.payload})}(t,e):function(t,e){var r=yi[e.type],n=hi[e.type];return r&&n&&0!==e.payload.length?fi(fi({},t),{},{[n]:r(t[n],e.payload)}):t}(t,e)},arguments.length>0&&void 0!==arguments[0]?arguments[0]:di,t.type===ui.Aggregate?t.payload:[t])},bi=ae(function t(e,r,n){return ke(function(r,n,o){return Se(n)&&Se(o)?t(e,n,o):e(r,n,o)},r,n)}),mi=bi,gi=qt(function(t,e){return mi(function(t,e,r){return r},t,e)});function wi(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,e=arguments.length>1?arguments[1]:void 0;return e.type===oi("SET_CONFIG")?(window.__dashprivate_childrenProps=gi(window.__dashprivate_childrenProps||{},e.payload.children_props),e.payload):e.type===oi("ADD_HTTP_HEADERS")?gi(t,{fetch:{headers:e.payload}}):t}var Oi={},Si=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:Oi,e=arguments.length>1?arguments[1]:void 0;return"SET_GRAPHS"===e.type?e.payload:t};function ji(t){return function(t){if(Array.isArray(t))return _i(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||function(t,e){if(t){if("string"==typeof t)return _i(t,e);var r={}.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)||function(){throw new TypeError("Invalid attempt to spread 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=Array(e);r0&&void 0!==arguments[0]?arguments[0]:Ei,e=arguments.length>1?arguments[1]:void 0;switch(e.type){case"ON_ERROR":var r=t.frontEnd,n=t.backEnd,o=t.backEndConnected;return console.error(e.payload.error),"frontEnd"===e.payload.type?{frontEnd:[ln(e.payload,{timestamp:new Date})].concat(ji(r)),backEnd:n,backEndConnected:o}:"backEnd"===e.payload.type?{frontEnd:r,backEnd:[ln(e.payload,{timestamp:new Date})].concat(ji(n)),backEndConnected:o}:t;case"SET_CONNECTION_STATUS":return ln(t,{backEndConnected:e.payload});default:return t}}function ki(t){return function(t){if(Array.isArray(t))return Ai(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||function(t,e){if(t){if("string"==typeof t)return Ai(t,e);var r={}.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)?Ai(t,e):void 0}}(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Ai(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r0&&void 0!==arguments[0]?arguments[0]:Ti;switch((arguments.length>1?arguments[1]:void 0).type){case"UNDO":var e=t.past,r=t.present,n=t.future,o=e[e.length-1];return{past:e.slice(0,e.length-1),present:o,future:[r].concat(ki(n))};case"REDO":var i=t.past,a=t.present,u=t.future,c=u[0],s=u.slice(1);return{past:[].concat(ki(i),[a]),present:c,future:s};case"REVERT":var l=t.past,f=t.future,p=l[l.length-1];return{past:l.slice(0,l.length-1),present:p,future:ki(f)};default:return t}},Ii=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{layout_pre:null,layout_post:null,request_pre:null,request_post:null,callback_resolved:null,request_refresh_jwt:null,bear:!1},e=arguments.length>1?arguments[1]:void 0;return"SET_HOOKS"===e.type?e.payload:t};function Ci(t){return Ci="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},Ci(t)}function Ri(t,e,r){if(r||(r=new Ni),o=Ci(n=t),null==n||"object"!=o&&"function"!=o)return t;var n,o,i,a=function(n){var o=r.get(t);if(o)return o;for(var i in r.set(t,n),t)Object.prototype.hasOwnProperty.call(t,i)&&(n[i]=e?Ri(t[i],!0,r):t[i]);return n};switch(Qt(t)){case"Object":return a(Object.create(Object.getPrototypeOf(t)));case"Array":return a(Array(t.length));case"Date":return new Date(t.valueOf());case"RegExp":return i=t,new RegExp(i.source,i.flags?i.flags:(i.global?"g":"")+(i.ignoreCase?"i":"")+(i.multiline?"m":"")+(i.sticky?"y":"")+(i.unicode?"u":"")+(i.dotAll?"s":""));case"Int8Array":case"Uint8Array":case"Uint8ClampedArray":case"Int16Array":case"Uint16Array":case"Int32Array":case"Uint32Array":case"Float32Array":case"Float64Array":case"BigInt64Array":case"BigUint64Array":return t.slice();default:return t}}var Di,Ni=function(){function t(){this.map={},this.length=0}return t.prototype.set=function(t,e){var r=this.hash(t),n=this.map[r];n||(this.map[r]=n=[]),n.push([t,e]),this.length+=1},t.prototype.hash=function(t){var e=[];for(var r in t)e.push(Object.prototype.toString.call(t[r]));return e.join()},t.prototype.get=function(t){if(this.length<=180){for(var e in this.map)for(var r=this.map[e],n=0;n0&&void 0!==arguments[0]?arguments[0]:Ji,e=arguments.length>1?arguments[1]:void 0;if("UPDATE_RESOURCE_USAGE"===e.type){var r=e.payload,n=r.id,o=r.usage,i=r.status,a=Fi[i]||i,u={updated:[n],resources:t.resources,callbacks:t.callbacks,graphLayout:t.graphLayout};u.callbacks[n]=u.callbacks[n]||Mi(Hi);var c=u.callbacks[n],s=c.resources,l=u.resources;if(c.count+=1,c.status.latest=a,c.status[a]=(c.status[a]||0)+1,c.result=e.payload.result,c.inputs=e.payload.inputs,c.state=e.payload.state,o){var f=o.__dash_client,p=o.__dash_server,d=o.__dash_upload,y=o.__dash_download,h=function(t,e){if(null==t)return{};var r,n,o=function(t,e){if(null==t)return{};var r={};for(var n in t)if({}.hasOwnProperty.call(t,n)){if(-1!==e.indexOf(n))continue;r[n]=t[n]}return r}(t,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);for(n=0;n0&&void 0!==arguments[0]?arguments[0]:Wi};!function(t){t.Set="IsLoading.Set"}(Di||(Di={}));var Vi=function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],e=arguments.length>1?arguments[1]:void 0;return e.type===Di.Set?e.payload:t},Ki=qt(function(t,e){return Zr(e,[t])}),Yi=function(t){return{value:t,"fantasy-land/map":function(){return this}}},Qi=qt(function(t,e){return t(Yi)(e).value}),Xi=qt(function(t,e){return function(r){return function(n){return Qe(function(t){return e(t,n)},r(t(n)))}}}),Zi=Ot(function(t){return Xi(function(e){return le(t,e)},ve(t))}),ta=ae(function(t,e,r){var n=Array.prototype.slice.call(r,0);return n.splice(t,e),n}),ea=qt(function t(e,r){if(null==r)return r;switch(e.length){case 0:return r;case 1:return function(t,e){if(null==e)return e;if(ue(t)&&de(e))return ta(t,1,e);var r={};for(var n in e)r[n]=e[n];return delete r[t],r}(e[0],r);default:var n=e[0],o=Array.prototype.slice.call(e,1);return null==r[n]?function(t,e){if(ue(t)&&de(e))return[].concat(e);var r={};for(var n in e)r[n]=e[n];return r}(n,r):be(n,t(o,r[n]),r)}});function ra(t){return ra="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},ra(t)}function na(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 oa(t,e,r){return(e=function(t){var e=function(t){if("object"!=ra(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var r=e.call(t,"string");if("object"!=ra(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==ra(e)?e:e+""}(e))in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function ia(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r0&&void 0!==arguments[0]?arguments[0]:{components:[]},r=arguments.length>1?arguments[1]:void 0;if(r.type===oi("SET_LAYOUT"))return Array.isArray(r.payload)?e.components=function(t){if(Array.isArray(t))return ia(t)}(t=r.payload)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||function(t,e){if(t){if("string"==typeof t)return ia(t,e);var r={}.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)?ia(t,e):void 0}}(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}():e.components=function(t){for(var e=1;e0&&void 0!==arguments[0]?arguments[0]:ua,e=arguments.length>1?arguments[1]:void 0;return e.type===oi("SET_PATHS")?e.payload:t},sa=qt(function(t,e){return ea([t],e)});function la(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1?arguments[1]:void 0;switch(e.type){case"ADD_CALLBACK_JOB":return function(t,e){return be(t.jobId,t,e)}(e.payload,t);case"REMOVE_CALLBACK_JOB":return function(t,e){return sa(t,e)}(e.payload.jobId,t);case"CALLBACK_JOB_OUTDATED":return function(t,e){return ve([t,"outdated"],!0,e)}(e.payload.jobId,t);default:return t}}function fa(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1?arguments[1]:void 0;switch(e.type){case"LOADED":return e.payload.reduce(function(t,e){var r=[JSON.stringify(e.path)],n=pe([],r,t);return ve(r,n.filter(function(t){return t.property!==e.property}),t)},t);case"LOADING":return e.payload.reduce(function(t,e){var r=[JSON.stringify(e.path)],n=pe([],r,t);return ie(e,n)||n.push(e),ve(r,n,t)},t);default:return t}}var pa=qt(function(t,e){return Ke(t+1,function(){var r=arguments[t];if(null!=r&&sr(r[e]))return r[e].apply(r,Array.prototype.slice.call(arguments,0,t));throw new TypeError(br(r)+' does not have a method named "'+e+'"')})}),da=pa(1,"join");function ya(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);rt.length)&&(e=t.length);for(var r=0,n=Array(e);r0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1?arguments[1]:void 0;if(ie(e.type,["UNDO_PROP_CHANGE","REDO_PROP_CHANGE","ON_PROP_CHANGE"])){var r=ba(e.payload.itempath),n=pe(0,[r,"hash"],t);t=be(r,{hash:n+1,changedProps:e.payload.props,renderType:e.payload.renderType},t)}else if("RESET_COMPONENT_STATE"===e.type){var o=e.payload.itempath;if(o){var i=ba(o);return Object.fromEntries(Object.entries(t).filter(function(t){return!(e=t,r=1,function(t){if(Array.isArray(t))return t}(e)||function(t,e){var r=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=r){var n,o,i,a,u=[],c=!0,s=!1;try{if(i=(r=r.call(t)).next,0===e){if(Object(r)!==r)return;c=!1}else for(;!(c=(n=i.call(r)).done)&&(u.push(n.value),u.length!==e);c=!0);}catch(t){s=!0,o=t}finally{try{if(!c&&null!=r.return&&(a=r.return(),Object(a)!==a))return}finally{if(s)throw o}}return u}}(e,r)||ga(e,r)||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.")}())[0].startsWith(i);var e,r}))}}return t};function ja(){var t={appLifecycle:ci,callbacks:vi,config:wi,error:Pi,graphs:Si,history:xi,hooks:Ii,profile:$i,changed:zi,isLoading:Vi,layout:aa,paths:ca,layoutHashes:Sa,loading:fa};return we(function(e){var r;t[e]=(r=e,function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1?arguments[1]:void 0,n=t;if(e.type===r){var o=e.payload,i=o.id,a={status:o.status,content:o.content};n=Array.isArray(i)?ve(i,a,t):i?be(i,a,t):ln(t,a)}return n})},Oa),t.callbackJobs=la,function(t){for(var e=Object.keys(t),r={},n=0;n1?r-1:0),o=1;on;){var a=t.charCodeAt(o-1);if(32!==a&&9!==a)break;o--}return t.slice(n,o)}function $a(t){if(-1===t.indexOf("%"))return t;try{return decodeURIComponent(t)}catch(e){return t}}var Wa=Ot(function(t){return function(){return t}}),za=function(t){return{value:t,map:function(e){return za(e(t))}}},Va=ae(function(t,e,r){return t(function(t){return za(e(t))})(r).value}),Ka=ae(function(t,e,r){return Va(t,Wa(e),r)});function Ya(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,o,i,a,u=[],c=!0,s=!1;try{if(i=(r=r.call(t)).next,0===e){if(Object(r)!==r)return;c=!1}else for(;!(c=(n=i.call(r)).done)&&(u.push(n.value),u.length!==e);c=!0);}catch(t){s=!0,o=t}finally{try{if(!c&&null!=r.return&&(a=r.return(),Object(a)!==a))return}finally{if(s)throw o}}return u}}(t,e)||function(t,e){if(t){if("string"==typeof t)return Qa(t,e);var r={}.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)?Qa(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 Qa(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r3?(o=y===n)&&(c=i[(u=i[4])?5:(u=3,3)],i[4]=i[5]=t):i[0]<=d&&((o=r<2&&dn||n>y)&&(i[4]=r,i[5]=n,p.n=y,u=0))}if(o||r>1)return a;throw f=!0,n}return function(o,l,y){if(s>1)throw TypeError("Generator is already running");for(f&&1===l&&d(l,y),u=l,c=y;(e=u<2?t:c)||!f;){i||(u?u<3?(u>1&&(p.n=-1),d(u,c)):p.n=c:p.v=c);try{if(s=2,i){if(u||(o="next"),e=i[o]){if(!(e=e.call(i,c)))throw TypeError("iterator result is not an object");if(!e.done)return e;c=e.value,u<2&&(u=0)}else 1===u&&(e=i.return)&&e.call(i),u<2&&(c=TypeError("The iterator does not provide a '"+o+"' method"),u=1);i=t}else if((e=(f=p.n<0)?c:r.call(n,p))!==a)break}catch(e){i=t,u=1,c=e}finally{s=1}}return{value:e,done:f}}}(r,o,i),!0),s}var a={};function u(){}function c(){}function s(){}e=Object.getPrototypeOf;var l=[][n]?e(e([][n]())):(wu(e={},n,function(){return this}),e),f=s.prototype=u.prototype=Object.create(l);function p(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,s):(t.__proto__=s,wu(t,o,"GeneratorFunction")),t.prototype=Object.create(f),t}return c.prototype=s,wu(f,"constructor",s),wu(s,"constructor",c),c.displayName="GeneratorFunction",wu(s,o,"GeneratorFunction"),wu(f),wu(f,o,"Generator"),wu(f,n,function(){return this}),wu(f,"toString",function(){return"[object Generator]"}),(gu=function(){return{w:i,m:p}})()}function wu(t,e,r,n){var o=Object.defineProperty;try{o({},"",{})}catch(t){o=0}wu=function(t,e,r,n){function i(e,r){wu(t,e,function(t){return this._invoke(e,r,t)})}e?o?o(t,e,{value:r,enumerable:!n,configurable:!n,writable:!n}):t[e]=r:(i("next",0),i("throw",1),i("return",2))},wu(t,e,r,n)}function Ou(t,e,r,n,o,i,a){try{var u=t[i](a),c=u.value}catch(t){return void r(t)}u.done?e(c):Promise.resolve(c).then(n,o)}function Su(t){return function(t){if(Array.isArray(t))return ju(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||function(t,e){if(t){if("string"==typeof t)return ju(t,e);var r={}.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)?ju(t,e):void 0}}(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function ju(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);ra)o=t.lastIndexOf(";",i-1)+1;else{var u=Ja(t,o,i);void 0===e[u]&&(e[u]=n(Ja(t,i+1,a))),o=a+1}}while(o3?(o=y===n)&&(c=i[(u=i[4])?5:(u=3,3)],i[4]=i[5]=t):i[0]<=d&&((o=r<2&&dn||n>y)&&(i[4]=r,i[5]=n,p.n=y,u=0))}if(o||r>1)return a;throw f=!0,n}return function(o,l,y){if(s>1)throw TypeError("Generator is already running");for(f&&1===l&&d(l,y),u=l,c=y;(e=u<2?t:c)||!f;){i||(u?u<3?(u>1&&(p.n=-1),d(u,c)):p.n=c:p.v=c);try{if(s=2,i){if(u||(o="next"),e=i[o]){if(!(e=e.call(i,c)))throw TypeError("iterator result is not an object");if(!e.done)return e;c=e.value,u<2&&(u=0)}else 1===u&&(e=i.return)&&e.call(i),u<2&&(c=TypeError("The iterator does not provide a '"+o+"' method"),u=1);i=t}else if((e=(f=p.n<0)?c:r.call(n,p))!==a)break}catch(e){i=t,u=1,c=e}finally{s=1}}return{value:e,done:f}}}(r,o,i),!0),s}var a={};function u(){}function c(){}function s(){}e=Object.getPrototypeOf;var l=[][n]?e(e([][n]())):(vc(e={},n,function(){return this}),e),f=s.prototype=u.prototype=Object.create(l);function p(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,s):(t.__proto__=s,vc(t,o,"GeneratorFunction")),t.prototype=Object.create(f),t}return c.prototype=s,vc(f,"constructor",s),vc(s,"constructor",c),c.displayName="GeneratorFunction",vc(s,o,"GeneratorFunction"),vc(f),vc(f,o,"Generator"),vc(f,n,function(){return this}),vc(f,"toString",function(){return"[object Generator]"}),(hc=function(){return{w:i,m:p}})()}function vc(t,e,r,n){var o=Object.defineProperty;try{o({},"",{})}catch(t){o=0}vc=function(t,e,r,n){function i(e,r){vc(t,e,function(t){return this._invoke(e,r,t)})}e?o?o(t,e,{value:r,enumerable:!n,configurable:!n,writable:!n}):t[e]=r:(i("next",0),i("throw",1),i("return",2))},vc(t,e,r,n)}function bc(t,e,r,n,o,i,a){try{var u=t[i](a),c=u.value}catch(t){return void r(t)}u.done?e(c):Promise.resolve(c).then(n,o)}var mc=jt(console.warn),gc={GET:function(t,e,r,n){return fetch(t,gi(e,{method:"GET",headers:Gu(n)}))},POST:function(t,e){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return fetch(t,gi(e,{method:"POST",headers:Gu(arguments.length>3?arguments[3]:void 0),body:r?JSON.stringify(r):null}))}};function wc(t,e,r,n,o){return function(){var i,a=(i=hc().m(function i(a,u){var c,s,l,f,p,d,y,h,v,b,m;return hc().w(function(i){for(;;)switch(i.p=i.n){case 0:d=function(t){u().error.backEndConnected!==t&&a({type:"SET_CONNECTION_STATUS",payload:t})},c=u(),s=c.config,l=c.hooks,f=null,p="".concat(Mn(s)).concat(t),a({type:r,payload:{id:n,status:"loading"}}),i.p=1,h=0;case 2:if(!(h<=1)){i.n=11;break}return i.p=3,i.n=4,gc[e](p,s.fetch,o,s);case 4:y=i.v,i.n=6;break;case 5:return i.p=5,i.v,console.log("fetch error",y),d(!1),i.a(2);case 6:if(401!==y.status&&400!==y.status){i.n=9;break}if(!l.request_refresh_jwt){i.n=9;break}return i.n=7,y.text();case 7:if(!i.v.includes(Ui)){i.n=9;break}return i.n=8,l.request_refresh_jwt(s.fetch.headers.Authorization.substr(7));case 8:if(!(v=i.v)){i.n=9;break}return f={Authorization:"Bearer ".concat(v)},s=gi(s,{fetch:{headers:f}}),i.a(3,10);case 9:return i.a(3,11);case 10:h++,i.n=2;break;case 11:if(b=y.headers.get("content-type"),f&&a(ku(f)),d(!0),!b||-1===b.indexOf("application/json")){i.n=12;break}return i.a(2,y.json().then(function(t){return a({type:r,payload:{status:y.status,content:t,id:n}}),t}));case 12:return i.n=13,y.text();case 13:return m=i.v,mc("Response is missing header: content-type: application/json"),i.a(2,a({type:r,payload:{id:n,status:y.status,content:m}}));case 14:i.p=14,Wu(i.v,"Error from API call: "+t,a);case 15:return i.a(2)}},i,null,[[3,5],[1,14]])}),function(){var t=this,e=arguments;return new Promise(function(r,n){var o=i.apply(t,e);function a(t){bc(o,r,n,a,u,"next",t)}function u(t){bc(o,r,n,a,u,"throw",t)}a(void 0)})});return function(t,e){return a.apply(this,arguments)}}()}function Oc(t){return Oc="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},Oc(t)}function Sc(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 jc(t){for(var e=1;e3?(o=y===n)&&(c=i[(u=i[4])?5:(u=3,3)],i[4]=i[5]=t):i[0]<=d&&((o=r<2&&dn||n>y)&&(i[4]=r,i[5]=n,p.n=y,u=0))}if(o||r>1)return a;throw f=!0,n}return function(o,l,y){if(s>1)throw TypeError("Generator is already running");for(f&&1===l&&d(l,y),u=l,c=y;(e=u<2?t:c)||!f;){i||(u?u<3?(u>1&&(p.n=-1),d(u,c)):p.n=c:p.v=c);try{if(s=2,i){if(u||(o="next"),e=i[o]){if(!(e=e.call(i,c)))throw TypeError("iterator result is not an object");if(!e.done)return e;c=e.value,u<2&&(u=0)}else 1===u&&(e=i.return)&&e.call(i),u<2&&(c=TypeError("The iterator does not provide a '"+o+"' method"),u=1);i=t}else if((e=(f=p.n<0)?c:r.call(n,p))!==a)break}catch(e){i=t,u=1,c=e}finally{s=1}}return{value:e,done:f}}}(r,o,i),!0),s}var a={};function u(){}function c(){}function s(){}e=Object.getPrototypeOf;var l=[][n]?e(e([][n]())):(xc(e={},n,function(){return this}),e),f=s.prototype=u.prototype=Object.create(l);function p(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,s):(t.__proto__=s,xc(t,o,"GeneratorFunction")),t.prototype=Object.create(f),t}return c.prototype=s,xc(f,"constructor",s),xc(s,"constructor",c),c.displayName="GeneratorFunction",xc(s,o,"GeneratorFunction"),xc(f),xc(f,o,"Generator"),xc(f,n,function(){return this}),xc(f,"toString",function(){return"[object Generator]"}),(Tc=function(){return{w:i,m:p}})()}function xc(t,e,r,n){var o=Object.defineProperty;try{o({},"",{})}catch(t){o=0}xc=function(t,e,r,n){function i(e,r){xc(t,e,function(t){return this._invoke(e,r,t)})}e?o?o(t,e,{value:r,enumerable:!n,configurable:!n,writable:!n}):t[e]=r:(i("next",0),i("throw",1),i("return",2))},xc(t,e,r,n)}function Ic(t,e,r,n,o,i,a){try{var u=t[i](a),c=u.value}catch(t){return void r(t)}u.done?e(c):Promise.resolve(c).then(n,o)}function Cc(t){return function(){var e=this,r=arguments;return new Promise(function(n,o){var i=t.apply(e,r);function a(t){Ic(i,n,o,a,u,"next",t)}function u(t){Ic(i,n,o,a,u,"throw",t)}a(void 0)})}}function Rc(t,e){var r="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!r){if(Array.isArray(t)||(r=function(t,e){if(t){if("string"==typeof t)return Dc(t,e);var r={}.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)?Dc(t,e):void 0}}(t))||e&&t&&"number"==typeof t.length){r&&(t=r);var n=0,o=function(){};return{s:o,n:function(){return n>=t.length?{done:!0}:{done:!1,value:t[n++]}},e:function(t){throw t},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,u=!1;return{s:function(){r=r.call(t)},n:function(){var t=r.next();return a=t.done,t},e:function(t){u=!0,i=t},f:function(){try{a||null==r.return||r.return()}finally{if(u)throw i}}}}function Dc(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r0&&void 0!==arguments[0]?arguments[0]:{};Uc(this,t),Gc(this,"localId",Bc()),Gc(this,"endId",""),Gc(this,"downlinkId",""),Gc(this,"pending",new Map),Gc(this,"counter",0),Gc(this,"cursor",0),Gc(this,"downlinkOpen",!1),Gc(this,"abort",null),Gc(this,"loopGen",0),Gc(this,"reconnectDelay",void 0),Gc(this,"maxReconnectDelay",void 0),Gc(this,"reconnectWindow",void 0),Gc(this,"fetchImpl",void 0),Gc(this,"_transport",{}),Gc(this,"wakeUp",null),Gc(this,"wokenForNewStream",!1),this.fetchImpl=null!==(e=i.fetchImpl)&&void 0!==e?e:fetch.bind(globalThis),this.reconnectDelay=null!==(r=i.reconnectDelay)&&void 0!==r?r:1e3,this.maxReconnectDelay=null!==(n=i.maxReconnectDelay)&&void 0!==n?n:5e3,this.reconnectWindow=null!==(o=i.reconnectWindow)&&void 0!==o?o:3e4,this.configure(i)},[{key:"configure",value:function(t){t.mode&&(this._transport.mode=t.mode),"number"==typeof t.pollInterval&&(this._transport.pollInterval=t.pollInterval)}},{key:"transport",get:function(){return Mc({},this._transport)}},{key:"activeCount",get:function(){return this.pending.size}},{key:"connectionEndId",get:function(){return this.endId}},{key:"streamUrl",value:function(t){if(!this.endId)return t;var e=t.includes("?")?"&":"?";return"".concat(t).concat(e,"endId=").concat(encodeURIComponent(this.endId))+"&downlinkId=".concat(encodeURIComponent(this.downlinkId))}},{key:"run",value:function(t,e,r,n,o){return this.start(t,e,r,n,o).settled}},{key:"start",value:function(t,e,r,n,o){var i=this;0!==this.pending.size&&this.endId||(this.endId=r||"",this.downlinkId=Bc(),this.cursor=0);var a="".concat(this.localId,"-").concat(++this.counter),u=new Promise(function(t,e){i.pending.set(a,{onFrame:o,resolve:t,reject:e,acked:!1,gotFrame:!1})});return this.fetchImpl(this.streamUrl(t),Mc(Mc({},e),{},{method:"POST",body:JSON.stringify(Mc(Mc({},n),{},{streamConnection:{requestId:a}}))})).then(function(r){return i.checkUplink(a,r,t,e)}).catch(function(t){return i.fail(a,t)}),{requestId:a,settled:u}}},{key:"cancel",value:function(t,e,r){var n=this.pending.get(t);n&&(this.pending.delete(t),n.reject(new Error("Streaming callback cancelled")),this.fetchImpl(this.streamUrl(e),Mc(Mc({},r),{},{method:"POST",body:JSON.stringify({streamCancel:{requestId:t}})})).catch(function(){}),this.stopDownlinkIfIdle())}},{key:"checkUplink",value:function(t,e,r,n){if(e.ok){var o,i=this.pending.get(t);i&&(i.acked=!0,this.ensureDownlink(r,n),this.wokenForNewStream=!0,null===(o=this.wakeUp)||void 0===o||o.call(this))}else this.fail(t,new Error("stream uplink responded ".concat(e.status)))}},{key:"hasAcked",value:function(){var t,e=Rc(this.pending.values());try{for(e.s();!(t=e.n()).done;)if(t.value.acked)return!0}catch(t){e.e(t)}finally{e.f()}return!1}},{key:"dispatchEnvelope",value:function(t){if(t.reset)return this.cursor=0,void this.settleAll(new Error("stream reset: the server lost this connection (restart or owner change)"));if("number"==typeof t.seq&&(this.cursor=t.seq),void 0!==t.rid&&void 0!==t.frame){var e=this.pending.get(t.rid);if(e){var r=t.frame;r.done?(this.pending.delete(t.rid),r.error?e.reject(new Error(r.error.message||"Streaming callback error")):e.resolve(),this.stopDownlinkIfIdle()):(e.gotFrame=!0,e.onFrame(r))}}}},{key:"settleAll",value:function(t){var e=Array.from(this.pending.values());this.pending.clear(),this.closeDownlink(),e.forEach(function(e){return e.gotFrame?e.resolve():e.reject(t)})}},{key:"fail",value:function(t,e){var r=this.pending.get(t);r&&(this.pending.delete(t),r.reject(e),this.stopDownlinkIfIdle())}},{key:"stopDownlinkIfIdle",value:function(){this.downlinkOpen&&!this.hasAcked()&&this.closeDownlink()}},{key:"closeDownlink",value:function(){var t,e=this.abort;this.abort=null,this.downlinkOpen=!1,this.loopGen++,null===(t=this.wakeUp)||void 0===t||t.call(this),e&&e.abort()}},{key:"ensureDownlink",value:function(t,e){this.downlinkOpen||(this.downlinkOpen=!0,this.readLoop(t,e,++this.loopGen))}},{key:"readLoop",value:(e=Cc(Tc().m(function t(e,r,n){var o,i,a,u,c,s,l,f,p,d;return Tc().w(function(t){for(;;)switch(t.p=t.n){case 0:i="poll"===this._transport.mode,a=null!==(o=this._transport.pollInterval)&&void 0!==o?o:100,u=a,c=0,s=null,l=this.reconnectDelay;case 1:if(!this.hasAcked()||this.loopGen!==n){t.n=14;break}return this.wokenForNewStream&&(this.wokenForNewStream=!1,c=0,u=a),this.abort=new AbortController,f=0,t.p=2,t.n=3,this.fetchImpl(this.streamUrl(e),Mc(Mc({},r),{},{method:"POST",signal:this.abort.signal,body:JSON.stringify({streamDownlink:{from:this.cursor}})}));case 3:if(!((p=t.v).status>=400&&p.status<500)){t.n=4;break}return this.settleAll(new Error("stream downlink responded ".concat(p.status))),t.a(3,14);case 4:if(p.ok&&p.body){t.n=5;break}throw new Error("downlink responded ".concat(p.status));case 5:return t.n=6,this.consume(p.body,n);case 6:if(0!==(f=t.v)||i){t.n=7;break}throw new Error("downlink closed without data");case 7:s=null,l=this.reconnectDelay,t.n=12;break;case 8:if(t.p=8,t.v,this.hasAcked()&&this.loopGen===n){t.n=9;break}return t.a(3,14);case 9:if(!((d=Date.now())-(s=null!=s?s:d)>=this.reconnectWindow)){t.n=10;break}return this.settleAll(new Error("stream downlink lost: could not reconnect to the server")),t.a(3,14);case 10:return t.n=11,Hc(l);case 11:return l=Math.min(2*l,this.maxReconnectDelay),t.a(3,1);case 12:if(!i||!this.hasAcked()||this.loopGen!==n){t.n=13;break}return f?(c=0,u=a):++c>2&&(u=Math.min(2*u,5*a)),t.n=13,this.pause(u);case 13:t.n=1;break;case 14:this.loopGen===n&&(this.downlinkOpen=!1,this.abort=null);case 15:return t.a(2)}},t,this,[[2,8]])})),function(t,r,n){return e.apply(this,arguments)})},{key:"pause",value:function(t){var e=this;return new Promise(function(r){var n=setTimeout(function(){e.wakeUp=null,r()},t);e.wakeUp=function(){clearTimeout(n),e.wakeUp=null,r()}})}},{key:"consume",value:(t=Cc(Tc().m(function t(e,r){var n,o,i,a,u,c,s,l,f;return Tc().w(function(t){for(;;)switch(t.n){case 0:n=e.getReader(),o=new TextDecoder,i="",a=0;case 1:return t.n=2,n.read();case 2:if(u=t.v,c=u.done,s=u.value,!c){t.n=3;break}return t.a(2,a);case 3:i+=o.decode(s,{stream:!0}),l=void 0;case 4:if(!((l=i.indexOf("\n"))>=0)){t.n=7;break}if(f=i.slice(0,l),i=i.slice(l+1),f.trim()){t.n=5;break}return t.a(3,4);case 5:if(this.loopGen===r){t.n=6;break}return t.a(2,a);case 6:a++,this.dispatchEnvelope(JSON.parse(f)),t.n=4;break;case 7:t.n=1;break;case 8:return t.a(2)}},t,this)})),function(e,r){return t.apply(this,arguments)})}]);var t,e}(),$c=function(){return Lc(function t(e){var r,n=this,o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:kc(),i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Uc(this,t),Gc(this,"pending",new Map),Gc(this,"counter",0),Gc(this,"port",void 0),Gc(this,"rendererId",void 0),Gc(this,"transport",void 0),Gc(this,"_broken",!1),this.port=e,this.rendererId=o,this.transport=i,e.onmessage=function(t){return n.handleMessage(t.data)},null===(r=e.start)||void 0===r||r.call(e)},[{key:"broken",get:function(){return this._broken}},{key:"activeCount",get:function(){return this.pending.size}},{key:"run",value:function(t,e,r,n,o){var i=this,a="".concat(this.rendererId,"-").concat(++this.counter);return new Promise(function(u,c){i.pending.set(a,{onFrame:o,resolve:u,reject:c,acked:!1,gotFrame:!1});var s={type:"stream",rendererId:i.rendererId,requestId:a,url:t,init:e,endId:r||"",payload:n,transport:i.transport};i.port.postMessage(s)})}},{key:"release",value:function(){var t={type:"unregister",rendererId:this.rendererId};this.port.postMessage(t)}},{key:"fail",value:function(t){this._broken=!0;var e,r=Rc(this.pending.values());try{for(r.s();!(e=r.n()).done;)e.value.reject(t)}catch(t){r.e(t)}finally{r.f()}this.pending.clear()}},{key:"handleMessage",value:function(t){var e=this.pending.get(t.requestId);e&&("frame"!==t.type?(this.pending.delete(t.requestId),"done"===t.type?e.resolve():e.reject(new Error(t.message))):e.onFrame(t.frame))}}])}(),Wc=null;function zc(){var t,e,r,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(Wc instanceof $c&&Wc.broken&&(Wc=null),Wc)return Wc;var o={mode:null===(t=n.stream)||void 0===t?void 0:t.mode,pollInterval:null===(e=n.stream)||void 0===e?void 0:e.poll_interval},i=null===(r=n.stream)||void 0===r?void 0:r.worker_url;if(i&&"undefined"!=typeof SharedWorker)try{var a=new SharedWorker(i,{name:"dash-stream-worker"}),u=new $c(a.port,kc(),o);return a.onerror=function(){return u.fail(new Error("Dash stream worker failed"))},window.addEventListener("pagehide",function(){return u.release()}),Wc=u}catch(t){}return Wc=new Jc(o)}function Vc(t){var e;return!(null===(e=t.stream)||void 0===e||!e.enabled)}function Kc(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r=t.length?{done:!0}:{done:!1,value:t[n++]}},e:function(t){throw t},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,u=!1;return{s:function(){r=r.call(t)},n:function(){var t=r.next();return a=t.done,t},e:function(t){u=!0,i=t},f:function(){try{a||null==r.return||r.return()}finally{if(u)throw i}}}}function os(t,e){if(t){if("string"==typeof t)return is(t,e);var r={}.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)?is(t,e):void 0}}function is(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r3?(o=y===n)&&(c=i[(u=i[4])?5:(u=3,3)],i[4]=i[5]=t):i[0]<=d&&((o=r<2&&dn||n>y)&&(i[4]=r,i[5]=n,p.n=y,u=0))}if(o||r>1)return a;throw f=!0,n}return function(o,l,y){if(s>1)throw TypeError("Generator is already running");for(f&&1===l&&d(l,y),u=l,c=y;(e=u<2?t:c)||!f;){i||(u?u<3?(u>1&&(p.n=-1),d(u,c)):p.n=c:p.v=c);try{if(s=2,i){if(u||(o="next"),e=i[o]){if(!(e=e.call(i,c)))throw TypeError("iterator result is not an object");if(!e.done)return e;c=e.value,u<2&&(u=0)}else 1===u&&(e=i.return)&&e.call(i),u<2&&(c=TypeError("The iterator does not provide a '"+o+"' method"),u=1);i=t}else if((e=(f=p.n<0)?c:r.call(n,p))!==a)break}catch(e){i=t,u=1,c=e}finally{s=1}}return{value:e,done:f}}}(r,o,i),!0),s}var a={};function u(){}function c(){}function s(){}e=Object.getPrototypeOf;var l=[][n]?e(e([][n]())):(us(e={},n,function(){return this}),e),f=s.prototype=u.prototype=Object.create(l);function p(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,s):(t.__proto__=s,us(t,o,"GeneratorFunction")),t.prototype=Object.create(f),t}return c.prototype=s,us(f,"constructor",s),us(s,"constructor",c),c.displayName="GeneratorFunction",us(s,o,"GeneratorFunction"),us(f),us(f,o,"Generator"),us(f,n,function(){return this}),us(f,"toString",function(){return"[object Generator]"}),(as=function(){return{w:i,m:p}})()}function us(t,e,r,n){var o=Object.defineProperty;try{o({},"",{})}catch(t){o=0}us=function(t,e,r,n){function i(e,r){us(t,e,function(t){return this._invoke(e,r,t)})}e?o?o(t,e,{value:r,enumerable:!n,configurable:!n,writable:!n}):t[e]=r:(i("next",0),i("throw",1),i("return",2))},us(t,e,r,n)}function cs(t,e,r,n,o,i,a){try{var u=t[i](a),c=u.value}catch(t){return void r(t)}u.done?e(c):Promise.resolve(c).then(n,o)}function ss(t){return function(){var e=this,r=arguments;return new Promise(function(n,o){var i=t.apply(e,r);function a(t){cs(i,n,o,a,u,"next",t)}function u(t){cs(i,n,o,a,u,"throw",t)}a(void 0)})}}function ls(t,e){for(var r=0;r=t.length?{done:!0}:{done:!1,value:t[n++]}},e:function(t){throw t},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,u=!1;return{s:function(){r=r.call(t)},n:function(){var t=r.next();return a=t.done,t},e:function(t){u=!0,i=t},f:function(){try{a||null==r.return||r.return()}finally{if(u)throw i}}}}function ws(){var t,e,r="function"==typeof Symbol?Symbol:{},n=r.iterator||"@@iterator",o=r.toStringTag||"@@toStringTag";function i(r,n,o,i){var c=n&&n.prototype instanceof u?n:u,s=Object.create(c.prototype);return Os(s,"_invoke",function(r,n,o){var i,u,c,s=0,l=o||[],f=!1,p={p:0,n:0,v:t,a:d,f:d.bind(t,4),d:function(e,r){return i=e,u=0,c=t,p.n=r,a}};function d(r,n){for(u=r,c=n,e=0;!f&&s&&!o&&e3?(o=y===n)&&(c=i[(u=i[4])?5:(u=3,3)],i[4]=i[5]=t):i[0]<=d&&((o=r<2&&dn||n>y)&&(i[4]=r,i[5]=n,p.n=y,u=0))}if(o||r>1)return a;throw f=!0,n}return function(o,l,y){if(s>1)throw TypeError("Generator is already running");for(f&&1===l&&d(l,y),u=l,c=y;(e=u<2?t:c)||!f;){i||(u?u<3?(u>1&&(p.n=-1),d(u,c)):p.n=c:p.v=c);try{if(s=2,i){if(u||(o="next"),e=i[o]){if(!(e=e.call(i,c)))throw TypeError("iterator result is not an object");if(!e.done)return e;c=e.value,u<2&&(u=0)}else 1===u&&(e=i.return)&&e.call(i),u<2&&(c=TypeError("The iterator does not provide a '"+o+"' method"),u=1);i=t}else if((e=(f=p.n<0)?c:r.call(n,p))!==a)break}catch(e){i=t,u=1,c=e}finally{s=1}}return{value:e,done:f}}}(r,o,i),!0),s}var a={};function u(){}function c(){}function s(){}e=Object.getPrototypeOf;var l=[][n]?e(e([][n]())):(Os(e={},n,function(){return this}),e),f=s.prototype=u.prototype=Object.create(l);function p(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,s):(t.__proto__=s,Os(t,o,"GeneratorFunction")),t.prototype=Object.create(f),t}return c.prototype=s,Os(f,"constructor",s),Os(s,"constructor",c),c.displayName="GeneratorFunction",Os(s,o,"GeneratorFunction"),Os(f),Os(f,o,"Generator"),Os(f,n,function(){return this}),Os(f,"toString",function(){return"[object Generator]"}),(ws=function(){return{w:i,m:p}})()}function Os(t,e,r,n){var o=Object.defineProperty;try{o({},"",{})}catch(t){o=0}Os=function(t,e,r,n){function i(e,r){Os(t,e,function(t){return this._invoke(e,r,t)})}e?o?o(t,e,{value:r,enumerable:!n,configurable:!n,writable:!n}):t[e]=r:(i("next",0),i("throw",1),i("return",2))},Os(t,e,r,n)}function Ss(t,e,r,n,o,i,a){try{var u=t[i](a),c=u.value}catch(t){return void r(t)}u.done?e(c):Promise.resolve(c).then(n,o)}function js(t){return function(){var e=this,r=arguments;return new Promise(function(n,o){var i=t.apply(e,r);function a(t){Ss(i,n,o,a,u,"next",t)}function u(t){Ss(i,n,o,a,u,"throw",t)}a(void 0)})}}function _s(t){return function(t){if(Array.isArray(t))return ks(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||Ps(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Es(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,o,i,a,u=[],c=!0,s=!1;try{if(i=(r=r.call(t)).next,0===e){if(Object(r)!==r)return;c=!1}else for(;!(c=(n=i.call(r)).done)&&(u.push(n.value),u.length!==e);c=!0);}catch(t){s=!0,o=t}finally{try{if(!c&&null!=r.return&&(a=r.return(),Object(a)!==a))return}finally{if(s)throw o}}return u}}(t,e)||Ps(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 Ps(t,e){if(t){if("string"==typeof t)return ks(t,e);var r={}.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)?ks(t,e):void 0}}function ks(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r5&&void 0!==arguments[5]&&arguments[5],a="Input"===o?r.getInputs:r.getState,u=[],c=0,s=a(t).map(function(i,a){var s=Es(Qs(t,i.map(function(t){var r=t.id,n=t.property,o=t.path;return{id:r,property:n,value:Oe([].concat(_s(o),["props",n]),e)}}),n[a],r.anyVals,o),2),l=s[0],f=s[1];return Io(n[a])&&!l.length&&c++,f&&u.push(f),l});if(u.length){if(i&&u.length+c===s.length)return null;Zs(u,t)}return s}function Zs(t,e){var r=t[0];throw-1!==r.indexOf("logged above")&&console.error(e.objs),new ReferenceError(r)}var tl=function(t){return Array.isArray(t)?Pr("value",t):t.value},el=function(t,e){return Array.isArray(t)?e===window.dash_clientside.no_update?Br(t,[e]):Br(t,e):[[t,e]]};function rl(t){return t.split("@")[0]}function nl(t){return Yt(t).length?{patchedOutputs:t}:{}}function ol(t,e,r,n){var o={};return He(t).forEach(function(t){var i=rl(t.property),a=Wn(e,t.id),u=vo(t.id),c=[u,i],s=Oe(c,n);if(void 0!==s){nc(s)&&(o[u]=o[u]||{patchedProps:{},freshIds:{},writtenProps:{},tailAppends:{}});var l=Oe(a.concat(["props"]),r)||{},f=yc({[i]:s},l,o[u]);n=ve(c,f[i],n)}}),{data:n,patchedOutputs:o}}function il(t,e,r,n){return al.apply(this,arguments)}function al(){return al=js(ws().m(function t(e,r,n,o){var i,a,u,c,s,l,f,p,d,y,h,v,b,m,g,w,O,S;return ws().w(function(t){for(;;)switch(t.p=t.n){case 0:if((i=window.dash_clientside=window.dash_clientside||{}).no_update||(Object.defineProperty(i,"no_update",{value:{description:"Return to prevent updating an Output."},writable:!1}),Object.defineProperty(i,"PreventUpdate",{value:{description:"Throw to prevent updating all Outputs."},writable:!1})),a=o.inputs,u=o.outputs,c=o.state,s=Date.now(),l=yl(a),f=yl(c),p={},d=qi,t.p=1,v=r.namespace,b=r.function_name,m=a.map(tl),c&&(m=mr(m,c.map(tl))),i.callback_context={},i.callback_context.triggered=o.changedPropIds.map(function(t){return{prop_id:t,value:l[t]}}),i.callback_context.triggered_id=hl(o.changedPropIds),i.callback_context.inputs_list=a,i.callback_context.inputs=l,i.callback_context.states_list=c,i.callback_context.states=f,i.callback_context.outputs_list=u,g=(y=i[v])[b].apply(y,_s(m)),delete i.callback_context,"function"!=typeof(null===(h=g)||void 0===h?void 0:h.then)){t.n=3;break}return t.n=2,g;case 2:g=t.v;case 3:u&&el(u,g).forEach(function(t){var e=Es(t,2),r=e[0],n=e[1];el(r,n).forEach(function(t){var e=Es(t,2),r=e[0],n=e[1],o=r.id,a=r.property,u=vo(o),c=p[u]=p[u]||{};n!==i.no_update&&(c[rl(a)]=n)})}),t.n=6;break;case 4:if(t.p=4,(S=t.v)!==i.PreventUpdate){t.n=5;break}d=Li,t.n=6;break;case 5:throw d="CLIENTSIDE_ERROR",S;case 6:return t.p=6,delete i.callback_context,w=Date.now()-s,O={__dash_server:w,__dash_client:w,__dash_upload:0,__dash_download:0},n.ui&&e(zs({id:o.output,usage:O,status:d,result:p,inputs:a,state:c})),t.f(6);case 7:return t.a(2,p)}},t,null,[[1,4,6,7]])})),al.apply(this,arguments)}function ul(t,e){return function(r,n){Da(t).reduce(function(t,r,o){var i,a=Es(r,2),u=a[0],c=a[1],s=u,l=[];if(u.startsWith("{")){var f=Es(Yc(u),2);s=f[0],i=f[1],l=function(t,e,r,n){var o=[],i={};return Da(t).forEach(function(a){var u,c,s=(c=2,function(t){if(Array.isArray(t))return t}(u=a)||function(t,e){var r=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=r){var n,o,i,a,u=[],c=!0,s=!1;try{if(i=(r=r.call(t)).next,0===e){if(Object(r)!==r)return;c=!1}else for(;!(c=(n=i.call(r)).done)&&(u.push(n.value),u.length!==e);c=!0);}catch(t){s=!0,o=t}finally{try{if(!c&&null!=r.return&&(a=r.return(),Object(a)!==a))return}finally{if(s)throw o}}return u}}(u,c)||function(t,e){if(t){if("string"==typeof t)return Kc(t,e);var r={}.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)?Kc(t,e):void 0}}(u,c)||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.")}()),l=s[0],f=s[1];if(!o.length)if(Array.isArray(f)){var p=(e.parsedChangedPropsIds[r]||e.parsedChangedPropsIds[0])[l];f.includes("MATCH")?i[l]=p:f.includes("ALL")?o=Qc(t,n(),l):f.includes("ALLSMALLER")&&(o=Qc(t,n(),l).filter(function(t){return t[l]s)){t.n=4;break}return t.p=1,y=new Blob([o]).stream().pipeThrough(new CompressionStream("gzip")),t.n=2,new Response(y).blob();case 2:d=t.v,e["Content-Encoding"]="gzip",t.n=4;break;case 3:t.p=3,b=t.v,console.warn("Sending uncompressed payload, because compressing failed:",b);case 4:return t.a(2,fetch(n,gi(r.fetch,{method:"POST",headers:e,body:d})))}},t,null,[[1,3]])}));return function(){return t.apply(this,arguments)}}();return new Promise(function(i,u){var c=function(c){var s=c.status;if(f){var b=a().callbackJobs[f];if(null!=b&&b.outdated)return t(Ks({jobId:f})),i({})}function m(e){if(r.ui){var o={__dash_server:0,__dash_client:Date.now()-y,__dash_upload:h.length,__dash_download:Number(c.headers.get("Content-Length"))};(c.headers.get("Server-Timing")||"").split(",").forEach(function(t){var e=t.split(";")[0],r=t.match(/;dur=[0-9.]+/);r&&(o[e]=Number(r[0].slice(5)))}),t(zs({id:n.output,usage:o,status:s,result:e,inputs:n.inputs,state:n.state}))}}var g=function(t){var r,o=t.multi,a=t.response;if(e.request_post&&e.request_post(n,a),o)r=a;else{var u=n.output,c=u.substr(0,u.lastIndexOf("."));r={[c]:a.props}}m(r),i(r)},w=function(){f&&t(Ks({jobId:f})),p&&t(ul(p,n)),d&&t(ul(d,n))},O=function(){var r=js(ws().m(function r(o){var a,c,s,l,f,p,d,y,h,v,b,g,O,S,j;return ws().w(function(r){for(;;)switch(r.p=r.n){case 0:a=o.body.getReader(),c=new TextDecoder,s="",f=!1,p=function(){var r=js(ws().m(function r(o){return ws().w(function(r){for(;;)switch(r.n){case 0:if(!o.done){r.n=2;break}if(f=!0,w(),!o.error){r.n=1;break}return m({}),u(new Error(o.error.message||"Callback error")),r.a(2);case 1:return e.request_post&&e.request_post(n,l),m(l||{}),i({}),r.a(2);case 2:if(!o.dist){r.n=3;break}return r.n=3,Promise.all(o.dist.map(Ec));case 3:l=o.response,cl(t,o,n);case 4:return r.a(2)}},r)}));return function(t){return r.apply(this,arguments)}}(),r.p=1;case 2:return r.n=3,a.read();case 3:if(d=r.v,y=d.done,h=d.value,!y){r.n=4;break}return r.a(3,14);case 4:s+=c.decode(h,{stream:!0}),v=s.split("\n"),s=v.pop(),b=gs(v),r.p=5,b.s();case 6:if((g=b.n()).done){r.n=10;break}if((O=g.value).trim()){r.n=7;break}return r.a(3,9);case 7:return r.n=8,p(JSON.parse(O));case 8:if(!f){r.n=9;break}return a.cancel(),r.a(2);case 9:r.n=6;break;case 10:r.n=12;break;case 11:r.p=11,S=r.v,b.e(S);case 12:return r.p=12,b.f(),r.f(12);case 13:r.n=2;break;case 14:if(!s.trim()||f){r.n=15;break}return r.n=15,p(JSON.parse(s));case 15:r.n=17;break;case 16:if(r.p=16,j=r.v,f){r.n=17;break}return f=!0,w(),l?(m(l),i({})):(m({}),u(j)),r.a(2);case 17:f||(w(),m(l||{}),i({}));case 18:return r.a(2)}},r,null,[[5,11,12,13],[1,16]])}));return function(t){return r.apply(this,arguments)}}();if(s===qi){if((c.headers.get("Content-Type")||"").includes("application/x-ndjson")&&c.body)return void O(c);c.json().then(function(e){if(!l&&e.cacheKey&&(l=e.cacheKey),!f&&e.job){var r={jobId:e.job,cacheKey:e.cacheKey,cancelInputs:e.cancel,progressDefault:e.progressDefault,output:JSON.stringify(n.outputs)};t(Vs(r)),f=e.job}e.sideUpdate&&t(ul(e.sideUpdate,n)),e.progress&&t(ul(e.progress,n)),!d&&e.progressDefault&&(d=e.progressDefault),o&&void 0===e.response?setTimeout(v,void 0!==o.interval?o.interval:500):e.dist?Promise.all(e.dist.map(Ec)).then(function(){w(),g(e)}):(w(),g(e))})}else s===Li?(w(),m({}),i({})):(w(),u(c))},s=function(){r.ui&&t(zs({id:n.output,status:Gi,result:{},inputs:n.inputs,state:n.state})),u(new Error("Callback failed: the server did not respond."))},v=function(){b().then(c,s)};v()})}function pl(t,e,r,n,o){return dl.apply(this,arguments)}function dl(){return dl=js(ws().m(function t(e,r,n,o,i){var a,u,c,s,l,f,p,d,y,h,v,b,m,g,w,O;return ws().w(function(t){for(;;)switch(t.p=t.n){case 0:return r.request_pre&&r.request_pre(o),a=Date.now(),i&&(e(ul(i.running,o)),u=i.runningOff),c=hs(),t.p=1,t.n=2,c.ensureConnected(n);case 2:return t.n=3,c.sendCallback(o,function(t){s=null==t?void 0:t.response,cl(e,t,o)});case 3:if(l=t.v,u&&e(ul(u,o)),"prevent_update"!==l.status){t.n=4;break}return n.ui&&(f=Date.now()-a,e(zs({id:o.output,usage:{__dash_server:f,__dash_client:f,__dash_upload:0,__dash_download:0},status:Li,result:{},inputs:o.inputs,state:o.state}))),t.a(2,{});case 4:if("error"!==l.status){t.n=5;break}throw new Error(l.message||"Callback error");case 5:if(!l.stream){t.n=6;break}return r.request_post&&r.request_post(o,s),n.ui&&(p=Date.now()-a,e(zs({id:o.output,usage:{__dash_server:p,__dash_client:p,__dash_upload:0,__dash_download:0},status:qi,result:s||{},inputs:o.inputs,state:o.state}))),t.a(2,{});case 6:return null!=(d=l.data)&&d.sideUpdate&&e(ul(d.sideUpdate,o)),v=(h=d||{}).multi,b=h.response,r.request_post&&r.request_post(o,b),v?y=b:(m=o.output,g=m.substr(0,m.lastIndexOf(".")),y={[g]:null==b?void 0:b.props}),n.ui&&(w=Date.now()-a,e(zs({id:o.output,usage:{__dash_server:w,__dash_client:w,__dash_upload:0,__dash_download:0},status:qi,result:y||{},inputs:o.inputs,state:o.state}))),t.a(2,y||{});case 7:throw t.p=7,O=t.v,u&&e(ul(u,o)),n.ui&&e(zs({id:o.output,status:Gi,result:{},inputs:o.inputs,state:o.state})),O;case 8:return t.a(2)}},t,null,[[1,7]])})),dl.apply(this,arguments)}function yl(t){if(!t)return{};for(var e={},r=0;rt.length)&&(e=t.length);for(var r=0,n=Array(e);r3&&void 0!==arguments[3]&&arguments[3],c=arguments.length>4?arguments[4]:void 0,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:null,f=r().paths,d=s?s.location.length?Oe(s.location,t):t:void 0,y=s?s.location.length?Oe(s.location,n):n:void 0,h=!!s&&s.count>0&&Array.isArray(d)&&Array.isArray(y)&&d.length===y.length+s.count,v=h&&s?function(t,e,r,n){var o=Bn({},n.strs),i=Bn({},n.objs),a={},u=n.objIndex?Bn({},n.objIndex):null;return t.forEach(function(t,n){qn(t,function(t,i){var u=t.props&&t.props.id;if(u){var c=mr(e,[r+n]).concat(i);if("object"===Gn(u)){var s=Object.keys(u).sort(),l=Ie(s,u),f=s.join(",");(a[f]=a[f]||[]).push({values:l,path:c})}else o[u]=c}})}),Object.keys(a).forEach(function(t){if(i[t]=mr(i[t]||[],a[t]),u){var e=Bn({},u[t]||{});a[t].forEach(function(t){var r=t.values,n=t.path,o=Jn(r);o in e||(e[o]=n)}),u[t]=e}}),Bn(Bn({strs:o,objs:i},u?{objIndex:u}:{}),{},{events:n.events})}(d.slice(y.length),i.concat(s.location),y.length,f):$n(t,i,f);e(Iu(v)),o=mr(o,Yo(l,v,t,{chunkPath:i,patchAnalysis:c,filterRoot:u}).map(function(t){return gl(gl({},t),{},{predecessors:a})})),h||(o=mr(o,Yo(l,p,n,{removedArrayInputsOnly:!0,newPaths:v,chunkPath:i,filterRoot:u}).map(function(t){return gl(gl({},t),{},{predecessors:a})})))},w=!1;["children"].concat(m).forEach(function(t){var e,r;if(!w)if(t.includes("[]")){var n=Ol(t.split("[]").map(function(t){return t.split(".").filter(function(t){return t})}),1)[0];if(!Oe(n,h))return;g(gl(gl({},b),{},{props:gl(gl({},b.props),h)}),b,v,Yt(h),(e=d,r=Yt(u),e&&r.length&&r.every(function(t){return e.patchedProps[t]})?e:void 0)),w=!0}else{var o=t.split("."),i=Oe(o,h);if(void 0===i)return;var a=mr(Wn(p,c),["props"].concat(o)),s=Oe(a,f),l=Vn(d,o[0]);g(i,s,a,!1,l,1===o.length?function(t,e){var r=null==t?void 0:t.tailAppends[e];return r&&"object"===zn(r)?r:null}(l,o[0]):null)}});var O=Nr(function(t,e){return!(e in u)},h);if(!Ee(O)){var S=r(),j=S.graphs,_=S.paths;o=mr(o,Xo(i,O,j,_).map(function(t){return gl(gl({},t),{},{predecessors:a})}))}}}),i.push(gl(gl({},t),{},{executionMeta:{allProps:Qe(Wo,He(t.getOutputs(r().paths))),updatedProps:He(Qe(function(t){var e=Ol(t,2),r=e[0],n=e[1];return Qe(function(t){return Wo({id:r,property:t})},Yt(n))},Da(f)))}}))),void 0!==p){var h;if(t.callback.no_output){var v=Yt(t.changedPropIds).join(", ");h="Callback error with no output from input ".concat(v)}else{var b=d?Qe(Wo,He([d.outputs])).join(", "):s;h="Callback error updating ".concat(b)}if(c){var m=c.namespace,g=c.function_name;h+=" via clientside function ".concat(m,".").concat(g)}Wu(p,h,e),i.push(gl(gl({},t),{},{executionMeta:{allProps:Qe(Wo,He(t.getOutputs(r().paths))),updatedProps:[]}}))}}}),e(Ws([n.length?Ls(n):null,n.length?Cs(n.length):null,i.length?Us(i):null,o.length?Ms(o):null]))},inputs:["callbacks.executed"]},_l=jl;function El(t){return El="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},El(t)}function Pl(){var t,e,r="function"==typeof Symbol?Symbol:{},n=r.iterator||"@@iterator",o=r.toStringTag||"@@toStringTag";function i(r,n,o,i){var c=n&&n.prototype instanceof u?n:u,s=Object.create(c.prototype);return kl(s,"_invoke",function(r,n,o){var i,u,c,s=0,l=o||[],f=!1,p={p:0,n:0,v:t,a:d,f:d.bind(t,4),d:function(e,r){return i=e,u=0,c=t,p.n=r,a}};function d(r,n){for(u=r,c=n,e=0;!f&&s&&!o&&e3?(o=y===n)&&(c=i[(u=i[4])?5:(u=3,3)],i[4]=i[5]=t):i[0]<=d&&((o=r<2&&dn||n>y)&&(i[4]=r,i[5]=n,p.n=y,u=0))}if(o||r>1)return a;throw f=!0,n}return function(o,l,y){if(s>1)throw TypeError("Generator is already running");for(f&&1===l&&d(l,y),u=l,c=y;(e=u<2?t:c)||!f;){i||(u?u<3?(u>1&&(p.n=-1),d(u,c)):p.n=c:p.v=c);try{if(s=2,i){if(u||(o="next"),e=i[o]){if(!(e=e.call(i,c)))throw TypeError("iterator result is not an object");if(!e.done)return e;c=e.value,u<2&&(u=0)}else 1===u&&(e=i.return)&&e.call(i),u<2&&(c=TypeError("The iterator does not provide a '"+o+"' method"),u=1);i=t}else if((e=(f=p.n<0)?c:r.call(n,p))!==a)break}catch(e){i=t,u=1,c=e}finally{s=1}}return{value:e,done:f}}}(r,o,i),!0),s}var a={};function u(){}function c(){}function s(){}e=Object.getPrototypeOf;var l=[][n]?e(e([][n]())):(kl(e={},n,function(){return this}),e),f=s.prototype=u.prototype=Object.create(l);function p(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,s):(t.__proto__=s,kl(t,o,"GeneratorFunction")),t.prototype=Object.create(f),t}return c.prototype=s,kl(f,"constructor",s),kl(s,"constructor",c),c.displayName="GeneratorFunction",kl(s,o,"GeneratorFunction"),kl(f),kl(f,o,"Generator"),kl(f,n,function(){return this}),kl(f,"toString",function(){return"[object Generator]"}),(Pl=function(){return{w:i,m:p}})()}function kl(t,e,r,n){var o=Object.defineProperty;try{o({},"",{})}catch(t){o=0}kl=function(t,e,r,n){function i(e,r){kl(t,e,function(t){return this._invoke(e,r,t)})}e?o?o(t,e,{value:r,enumerable:!n,configurable:!n,writable:!n}):t[e]=r:(i("next",0),i("throw",1),i("return",2))},kl(t,e,r,n)}function Al(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 Tl(t){for(var e=1;et.length)&&(e=t.length);for(var r=0,n=Array(e);rt.length)&&(e=t.length);for(var r=0,n=Array(e);r3?(o=y===n)&&(c=i[(u=i[4])?5:(u=3,3)],i[4]=i[5]=t):i[0]<=d&&((o=r<2&&dn||n>y)&&(i[4]=r,i[5]=n,p.n=y,u=0))}if(o||r>1)return a;throw f=!0,n}return function(o,l,y){if(s>1)throw TypeError("Generator is already running");for(f&&1===l&&d(l,y),u=l,c=y;(e=u<2?t:c)||!f;){i||(u?u<3?(u>1&&(p.n=-1),d(u,c)):p.n=c:p.v=c);try{if(s=2,i){if(u||(o="next"),e=i[o]){if(!(e=e.call(i,c)))throw TypeError("iterator result is not an object");if(!e.done)return e;c=e.value,u<2&&(u=0)}else 1===u&&(e=i.return)&&e.call(i),u<2&&(c=TypeError("The iterator does not provide a '"+o+"' method"),u=1);i=t}else if((e=(f=p.n<0)?c:r.call(n,p))!==a)break}catch(e){i=t,u=1,c=e}finally{s=1}}return{value:e,done:f}}}(r,o,i),!0),s}var a={};function u(){}function c(){}function s(){}e=Object.getPrototypeOf;var l=[][n]?e(e([][n]())):(zl(e={},n,function(){return this}),e),f=s.prototype=u.prototype=Object.create(l);function p(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,s):(t.__proto__=s,zl(t,o,"GeneratorFunction")),t.prototype=Object.create(f),t}return c.prototype=s,zl(f,"constructor",s),zl(s,"constructor",c),c.displayName="GeneratorFunction",zl(s,o,"GeneratorFunction"),zl(f),zl(f,o,"Generator"),zl(f,n,function(){return this}),zl(f,"toString",function(){return"[object Generator]"}),(Wl=function(){return{w:i,m:p}})()}function zl(t,e,r,n){var o=Object.defineProperty;try{o({},"",{})}catch(t){o=0}zl=function(t,e,r,n){function i(e,r){zl(t,e,function(t){return this._invoke(e,r,t)})}e?o?o(t,e,{value:r,enumerable:!n,configurable:!n,writable:!n}):t[e]=r:(i("next",0),i("throw",1),i("return",2))},zl(t,e,r,n)}function Vl(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 Kl(t){for(var e=1;et.length)&&(e=t.length);for(var r=0,n=Array(e);r(null!==(n=e.priority)&&void 0!==n?n:"")?-1:1},of=function(t,e){var r=(0,t.getOutputs)(e),n=He(r),o=[],i={};return n.forEach(function(t){var e=t.id,r=t.property,n=vo(e);(i[n]=i[n]||[]).push(r),o.push(Wo({id:n,property:r}))}),{allOutputs:r,allPropIds:o}},af=function(t,e){var r=[].concat(tf(He(t.getInputs(e))),tf(He(t.getState(e)))),n=new Map(r.map(function(t){return[vo(t.id),t]}));return Array.from(n.values())},uf={observer:function(){var t=Zl(Wl().m(function t(e){var r,n,o,i,a,u,c,s,l,f,p,d,y,h,v,b,m,g,w,O,S,j,_,E,P,k,A,T,x,I,C,R,D,N;return Wl().w(function(t){for(;;)switch(t.n){case 0:if(r=e.dispatch,n=e.getState,o=n(),i=o.callbacks,a=i.executing,u=i.watched,c=o.config,s=o.hooks,l=o.layout,f=o.paths,p=o.appLifecycle,d=n(),y=d.callbacks.prioritized,p===ii("HYDRATED")){t.n=1;break}return t.a(2);case 1:h=function(t){return Jl(t,c)},v=a.filter(h).length+u.filter(h).length,b=Math.max(0,12-v),y=Fl(nf,y),m=xr(h,y),g=Ql(m,2),w=g[0],O=g[1],j=xr(S=function(t){return!0===Hl(l,f,af(t,f))},w),_=Ql(j,2),E=_[0],P=_[1],k=E.slice(0,b),A=P.slice(0,b-k.length),T=xr(S,O),x=Ql(T,2),I=x[0],C=x[1],R=[].concat(tf(I),tf(k)),D=[].concat(tf(C),tf(A)),R.length&&r(Ws([Bs(R),Ds(Qe(function(t){return vl(t,c,s,f,l,of(t,f),r,n)},R))])),D.length&&(N=Qe(function(t){return Kl(Kl(Kl({},t),of(t,f)),{},{isReady:Hl(l,f,af(t,f))})},D),r(Ws([Bs(D),Is(N)])),N.forEach(function(){var t=Zl(Wl().m(function t(e){var o,i,a;return Wl().w(function(t){for(;;)switch(t.n){case 0:return t.n=1,e.isReady;case 1:if(o=n(),i=o.callbacks.blocked,En(function(t){return t===e||t.isReady===e.isReady},i)){t.n=2;break}return t.a(2);case 2:a=vl(e,c,s,f,l,e,r,n),r(Ws([Gs([e]),Ds([a])]));case 3:return t.a(2)}},t)}));return function(e){return t.apply(this,arguments)}}()));case 2:return t.a(2)}},t)}));return function(e){return t.apply(this,arguments)}}(),inputs:["callbacks.prioritized","callbacks.completed"]},cf=uf,sf=function(){function t(t,e,r,n){this.valueFn=t,this.valueAcc=e,this.keyFn=r,this.xf=n,this.inputs={}}return t.prototype["@@transducer/init"]=Ne,t.prototype["@@transducer/result"]=function(t){var e;for(e in this.inputs)if(Ft(e,this.inputs)&&(t=this.xf["@@transducer/step"](t,this.inputs[e]))["@@transducer/reduced"]){t=t["@@transducer/value"];break}return this.inputs=null,this.xf["@@transducer/result"](t)},t.prototype["@@transducer/step"]=function(t,e){var r=this.keyFn(e);return this.inputs[r]=this.inputs[r]||[r,Ri(this.valueAcc,!1)],this.inputs[r][1]=this.valueFn(this.inputs[r][1],e),t},t}();function lf(t,e,r){return function(n){return new sf(t,e,r,n)}}var ff=qt(me("groupBy",ze(4,[],Re([],lf,function(t,e,r,n){var o=ur(function(n,o){var i=r(o),a=t(Ft(i,n)?n[i]:Ri(e,!1),o);return a&&a["@@transducer/reduced"]?gr(n):(n[i]=a,n)});return ir(o,{},n)}))(function(t,e){return t.push(e),t},[]))),pf=qt(function(t,e){return sn({},e,t)});function df(){var t,e,r="function"==typeof Symbol?Symbol:{},n=r.iterator||"@@iterator",o=r.toStringTag||"@@toStringTag";function i(r,n,o,i){var c=n&&n.prototype instanceof u?n:u,s=Object.create(c.prototype);return yf(s,"_invoke",function(r,n,o){var i,u,c,s=0,l=o||[],f=!1,p={p:0,n:0,v:t,a:d,f:d.bind(t,4),d:function(e,r){return i=e,u=0,c=t,p.n=r,a}};function d(r,n){for(u=r,c=n,e=0;!f&&s&&!o&&e3?(o=y===n)&&(c=i[(u=i[4])?5:(u=3,3)],i[4]=i[5]=t):i[0]<=d&&((o=r<2&&dn||n>y)&&(i[4]=r,i[5]=n,p.n=y,u=0))}if(o||r>1)return a;throw f=!0,n}return function(o,l,y){if(s>1)throw TypeError("Generator is already running");for(f&&1===l&&d(l,y),u=l,c=y;(e=u<2?t:c)||!f;){i||(u?u<3?(u>1&&(p.n=-1),d(u,c)):p.n=c:p.v=c);try{if(s=2,i){if(u||(o="next"),e=i[o]){if(!(e=e.call(i,c)))throw TypeError("iterator result is not an object");if(!e.done)return e;c=e.value,u<2&&(u=0)}else 1===u&&(e=i.return)&&e.call(i),u<2&&(c=TypeError("The iterator does not provide a '"+o+"' method"),u=1);i=t}else if((e=(f=p.n<0)?c:r.call(n,p))!==a)break}catch(e){i=t,u=1,c=e}finally{s=1}}return{value:e,done:f}}}(r,o,i),!0),s}var a={};function u(){}function c(){}function s(){}e=Object.getPrototypeOf;var l=[][n]?e(e([][n]())):(yf(e={},n,function(){return this}),e),f=s.prototype=u.prototype=Object.create(l);function p(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,s):(t.__proto__=s,yf(t,o,"GeneratorFunction")),t.prototype=Object.create(f),t}return c.prototype=s,yf(f,"constructor",s),yf(s,"constructor",c),c.displayName="GeneratorFunction",yf(s,o,"GeneratorFunction"),yf(f),yf(f,o,"Generator"),yf(f,n,function(){return this}),yf(f,"toString",function(){return"[object Generator]"}),(df=function(){return{w:i,m:p}})()}function yf(t,e,r,n){var o=Object.defineProperty;try{o({},"",{})}catch(t){o=0}yf=function(t,e,r,n){function i(e,r){yf(t,e,function(t){return this._invoke(e,r,t)})}e?o?o(t,e,{value:r,enumerable:!n,configurable:!n,writable:!n}):t[e]=r:(i("next",0),i("throw",1),i("return",2))},yf(t,e,r,n)}function hf(t,e,r,n,o,i,a){try{var u=t[i](a),c=u.value}catch(t){return void r(t)}u.done?e(c):Promise.resolve(c).then(n,o)}var vf=function(){var t,e=(t=df().m(function t(e){var r,n;return df().w(function(t){for(;;)if(0===t.n)return n=new Promise(function(t){return r=t}),setTimeout(r,e),t.a(2,n)},t)}),function(){var e=this,r=arguments;return new Promise(function(n,o){var i=t.apply(e,r);function a(t){hf(i,n,o,a,u,"next",t)}function u(t){hf(i,n,o,a,u,"throw",t)}a(void 0)})});return function(t){return e.apply(this,arguments)}}();function bf(t){return bf="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},bf(t)}function mf(t){if(null!=t){var e=t["function"==typeof Symbol&&Symbol.iterator||"@@iterator"],r=0;if(e)return e.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length))return{next:function(){return t&&r>=t.length&&(t=void 0),{value:t&&t[r++],done:!t}}}}throw new TypeError(bf(t)+" is not iterable")}function gf(){var t,e,r="function"==typeof Symbol?Symbol:{},n=r.iterator||"@@iterator",o=r.toStringTag||"@@toStringTag";function i(r,n,o,i){var c=n&&n.prototype instanceof u?n:u,s=Object.create(c.prototype);return wf(s,"_invoke",function(r,n,o){var i,u,c,s=0,l=o||[],f=!1,p={p:0,n:0,v:t,a:d,f:d.bind(t,4),d:function(e,r){return i=e,u=0,c=t,p.n=r,a}};function d(r,n){for(u=r,c=n,e=0;!f&&s&&!o&&e3?(o=y===n)&&(c=i[(u=i[4])?5:(u=3,3)],i[4]=i[5]=t):i[0]<=d&&((o=r<2&&dn||n>y)&&(i[4]=r,i[5]=n,p.n=y,u=0))}if(o||r>1)return a;throw f=!0,n}return function(o,l,y){if(s>1)throw TypeError("Generator is already running");for(f&&1===l&&d(l,y),u=l,c=y;(e=u<2?t:c)||!f;){i||(u?u<3?(u>1&&(p.n=-1),d(u,c)):p.n=c:p.v=c);try{if(s=2,i){if(u||(o="next"),e=i[o]){if(!(e=e.call(i,c)))throw TypeError("iterator result is not an object");if(!e.done)return e;c=e.value,u<2&&(u=0)}else 1===u&&(e=i.return)&&e.call(i),u<2&&(c=TypeError("The iterator does not provide a '"+o+"' method"),u=1);i=t}else if((e=(f=p.n<0)?c:r.call(n,p))!==a)break}catch(e){i=t,u=1,c=e}finally{s=1}}return{value:e,done:f}}}(r,o,i),!0),s}var a={};function u(){}function c(){}function s(){}e=Object.getPrototypeOf;var l=[][n]?e(e([][n]())):(wf(e={},n,function(){return this}),e),f=s.prototype=u.prototype=Object.create(l);function p(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,s):(t.__proto__=s,wf(t,o,"GeneratorFunction")),t.prototype=Object.create(f),t}return c.prototype=s,wf(f,"constructor",s),wf(s,"constructor",c),c.displayName="GeneratorFunction",wf(s,o,"GeneratorFunction"),wf(f),wf(f,o,"Generator"),wf(f,n,function(){return this}),wf(f,"toString",function(){return"[object Generator]"}),(gf=function(){return{w:i,m:p}})()}function wf(t,e,r,n){var o=Object.defineProperty;try{o({},"",{})}catch(t){o=0}wf=function(t,e,r,n){function i(e,r){wf(t,e,function(t){return this._invoke(e,r,t)})}e?o?o(t,e,{value:r,enumerable:!n,configurable:!n,writable:!n}):t[e]=r:(i("next",0),i("throw",1),i("return",2))},wf(t,e,r,n)}function Of(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 Sf(t){for(var e=1;et.length)&&(e=t.length);for(var r=0,n=Array(e);rt.length)&&(e=t.length);for(var r=0,n=Array(e);r4&&void 0!==arguments[4]?arguments[4]:null,i=[];for(var a in t)if(t.hasOwnProperty(a)){var u=void 0;try{"function"!=typeof t[a]?(u=Error((n||"React class")+": "+r+" type `"+a+"` is invalid; it must be a function, usually from the `prop-types` package, but received `"+cp(t[a])+"`.")).name="Invariant Violation":u=t[a](e,a,n,r,null,up()())}catch(t){u=t}if(!u||u instanceof Error||i.push((n||"React class")+": type specification of "+r+" `"+a+"` is invalid; the type checker function must return `null` or an `Error` but returned a "+cp(u)+". You may have forgotten to pass an argument to the type checker creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and shape all require an argument)."),u instanceof Error){var c=o&&o()||"";i.push("Failed "+r+" type: "+u.message+c)}}return i.join("\n\n")}(e.propTypes,r,"component prop",e);return i&&function(t,e,r){var n,o=t.split("`");if(ie("is marked as required",t)){var i=o[1];n="".concat(i," in ").concat(r),e.id&&(n+=' with ID "'.concat(e.id,'"')),n+=" is required but it was not provided."}else if(ie("Bad object",t))n=t.split("supplied to ")[0]+"supplied to ".concat(r)+".\nBad"+t.split(".\nBad")[1];else{if(!ie("Invalid ",t)||!ie(" supplied to ",t))throw new Error(t);var a=o[1];if(n="Invalid argument `".concat(a,"` passed into ").concat(r),e.id&&(n+=' with ID "'.concat(e.id,'"')),n+=".",ie(", expected ",t)){var u=t.split(", expected ")[1];n+="\nExpected ".concat(u)}if(ie(" of type `",t)){var c=t.split(" of type `")[1].split("`")[0];n+="\nWas supplied type `".concat(c,"`.")}if(Tn(a,e)){var s=JSON.stringify(e[a],null,2);s&&(ie("\n",s)?n+="\nValue provided: \n".concat(s):n+="\nValue provided: ".concat(s))}}throw new Error(n)}(i,r,o.type),n}var lp=w()().createContext({});function fp(t){var e=t.children,r=t.componentPath,n=(0,g().useMemo)(function(){return JSON.stringify(r)},[r]),o=dt(),i=(0,g().useCallback)(function(t){var e=t||{},i=e.extraPath,a=e.rawPath,u=e.filterFunc,c=[n];i?c=[JSON.stringify(mr(r,i))]:a&&(c=[JSON.stringify(a)]);var s=pe([],c,o.getState().loading);return u?s.filter(u).length>0:s.length>0},[n]),a=(0,g().useCallback)(function(t){var e=t||{},o=e.filterFunc,i=e.extraPath,a=e.rawPath;return U(function(t){var e=[n];i?e=[JSON.stringify(mr(r,i))]:a&&(e=[JSON.stringify(a)]);var u=pe([],e,t.loading);return o?u.filter(o).length>0:u.length>0})},[n]),u=(0,g().useMemo)(function(){return{componentPath:r,isLoading:i,useLoading:a,useSelector:U,useStore:dt,useDispatch:bt}},[n]);return w()().createElement(lp.Provider,{value:u},e)}function pp(t){return pp="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},pp(t)}var dp=["componentPath","_dashprivate_error","_passedComponent","_newRender"],yp=["_dash_error"];function hp(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 vp(t,e,r){return(e=function(t){var e=function(t){if("object"!=pp(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var r=e.call(t,"string");if("object"!=pp(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==pp(e)?e:e+""}(e))in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function bp(t){return function(t){if(Array.isArray(t))return gp(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||mp(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function mp(t,e){if(t){if("string"==typeof t)return gp(t,e);var r={}.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)?gp(t,e):void 0}}function gp(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r3&&void 0!==arguments[3]&&arguments[3];if(Array.isArray(t)){var i=ba(e),a=n?b.current[i]:void 0;return b.current[i]=t,t.map(function(t,i){if(va(t)){var u=n&&(null==a?void 0:a[i])===t;return C(t,mr(o,["props"].concat(bp(e),[i])),u?0:r)}return t})}return va(t)?C(t,mr(o,["props"].concat(bp(e))),r):t},[o]),D=function(t){for(var e=1;e3?(o=y===n)&&(c=i[(u=i[4])?5:(u=3,3)],i[4]=i[5]=t):i[0]<=d&&((o=r<2&&dn||n>y)&&(i[4]=r,i[5]=n,p.n=y,u=0))}if(o||r>1)return a;throw f=!0,n}return function(o,l,y){if(s>1)throw TypeError("Generator is already running");for(f&&1===l&&d(l,y),u=l,c=y;(e=u<2?t:c)||!f;){i||(u?u<3?(u>1&&(p.n=-1),d(u,c)):p.n=c:p.v=c);try{if(s=2,i){if(u||(o="next"),e=i[o]){if(!(e=e.call(i,c)))throw TypeError("iterator result is not an object");if(!e.done)return e;c=e.value,u<2&&(u=0)}else 1===u&&(e=i.return)&&e.call(i),u<2&&(c=TypeError("The iterator does not provide a '"+o+"' method"),u=1);i=t}else if((e=(f=p.n<0)?c:r.call(n,p))!==a)break}catch(e){i=t,u=1,c=e}finally{s=1}}return{value:e,done:f}}}(r,o,i),!0),s}var a={};function u(){}function c(){}function s(){}e=Object.getPrototypeOf;var l=[][n]?e(e([][n]())):(jp(e={},n,function(){return this}),e),f=s.prototype=u.prototype=Object.create(l);function p(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,s):(t.__proto__=s,jp(t,o,"GeneratorFunction")),t.prototype=Object.create(f),t}return c.prototype=s,jp(f,"constructor",s),jp(s,"constructor",c),c.displayName="GeneratorFunction",jp(s,o,"GeneratorFunction"),jp(f),jp(f,o,"Generator"),jp(f,n,function(){return this}),jp(f,"toString",function(){return"[object Generator]"}),(Sp=function(){return{w:i,m:p}})()}function jp(t,e,r,n){var o=Object.defineProperty;try{o({},"",{})}catch(t){o=0}jp=function(t,e,r,n){function i(e,r){jp(t,e,function(t){return this._invoke(e,r,t)})}e?o?o(t,e,{value:r,enumerable:!n,configurable:!n,writable:!n}):t[e]=r:(i("next",0),i("throw",1),i("return",2))},jp(t,e,r,n)}function _p(t,e,r,n,o,i,a){try{var u=t[i](a),c=u.value}catch(t){return void r(t)}u.done?e(c):Promise.resolve(c).then(n,o)}function Ep(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r0:t}))&&t.push(i):i.getOutputs(o).some(function(t){return Array.isArray(t)?t.length>0:t})&&t.push(i),t},[]);t(Ms([].concat(Su(a),Su(u))))}(t,e),t(Eu(ii("HYDRATED")))}))}catch(t){a.frontEnd.length||a.backEnd.length||i(_u({type:"backEnd",error:t})),p=!0}finally{r(p)}}})}Pp.propTypes={appLifecycle:_().oneOf([ii("STARTED"),ii("HYDRATED"),ii("DESTROYED")]),dispatch:_().func,dependenciesRequest:_().object,graphs:_().object,hooks:_().object,layoutRequest:_().object,layout:_().any,history:_().any,error:_().object,config:_().object};var Ap=lt(function(t){return{appLifecycle:t.appLifecycle,dependenciesRequest:t.dependenciesRequest,hooks:t.hooks,layoutRequest:t.layoutRequest,layout:t.layout,graphs:t.graphs,history:t.history,error:t.error,config:t.config}},function(t){return{dispatch:t}})(Pp);function Tp(t){return t.isLoading?w()().createElement("div",{className:"_dash-loading-callback"}):null}Tp.propTypes={isLoading:_().bool.isRequired};var xp=lt(function(t){return{isLoading:t.isLoading}})(Tp);s(),d(),l(),p(),f(),y();var Ip=r(217),Cp={};function Rp(t){var e=t.dispatch,r=t.history,n=w()().createElement("span",{key:"undoLink",className:"_dash-undo-redo-link",onClick:function(){return e(Bu)}},w()().createElement("div",{className:"_dash-icon-undo"},"↺"),w()().createElement("div",{className:"_dash-undo-redo-label"},"undo")),o=w()().createElement("span",{key:"redoLink",className:"_dash-undo-redo-link",onClick:function(){return e(Fu)}},w()().createElement("div",{className:"_dash-icon-redo"},"↻"),w()().createElement("div",{className:"_dash-undo-redo-label"},"redo"));return w()().createElement("div",{className:"_dash-undo-redo"},w()().createElement("div",null,r.past.length>0?n:null,r.future.length>0?o:null))}Cp.styleTagTransform=function t(){return t.c||(t.c=r.n(y()))}()(),Cp.setAttributes=function t(){return t.c||(t.c=r.n(p()))}()(),Cp.insert=function t(){return t.c||(t.c=r.n(l()))}()().bind(null,"head"),Cp.domAPI=function t(){return t.c||(t.c=r.n(d()))}()(),Cp.insertStyleElement=function t(){return t.c||(t.c=r.n(f()))}()(),function t(){return t.c||(t.c=r.n(s()))}()()(Ip.A,Cp),Ip.A&&Ip.A.locals&&Ip.A.locals,Rp.propTypes={history:_().object,dispatch:_().func};var Dp=lt(function(t){return{history:t.history}},function(t){return{dispatch:t}})(Rp),Np=Ot(function(t){return function(e,r){return t(e,r)?-1:t(r,e)?1:0}}),Mp=qt(function(t,e){return tt.length)&&(e=t.length);for(var r=0,n=Array(e);r=t.length?{done:!0}:{done:!1,value:t[n++]}},e:function(t){throw t},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,u=!1;return{s:function(){r=r.call(t)},n:function(){var t=r.next();return a=t.done,t},e:function(t){u=!0,i=t},f:function(){try{a||null==r.return||r.return()}finally{if(u)throw i}}}}(r.content.files);try{for(a.s();!(o=a.n()).done;){var u=o.value;if(!u.is_css){i=!1;break}i=!0;for(var c=[],s=document.evaluate('//link[contains(@href, "'.concat(u.url,'")]'),this._head),l=s.iterateNext();l;)c.push(l),l=s.iterateNext();if(we(function(t){return t.setAttribute("disabled","disabled")},c),u.modified>0){var f=document.createElement("link");f.href="".concat(u.url,"?m=").concat(u.modified),f.type="text/css",f.rel="stylesheet",this._head.appendChild(f)}}}catch(t){a.e(t)}finally{a.f()}i||window.location.reload()}else null!==this.state.intervalId&&500===r.status&&(this._retry>this.state.max_retry&&(this.clearInterval(),window.alert("Hot reloading is disabled after failing ".concat(this._retry," times. ")+"Please check your application for errors, then refresh the page.")),this._retry++)}},{key:"componentDidMount",value:function(){var t=this.props,e=t.dispatch,r=t.reloadRequest,n=this.state,o=n.disabled,i=n.interval;if(!o&&!this.state.intervalId){var a=window.setInterval(function(){"loading"!==r.status&&e(wc("_reload-hash","GET","reloadRequest"))},i);this.setState({intervalId:a})}}},{key:"componentWillUnmount",value:function(){!this.state.disabled&&this.state.intervalId&&this.clearInterval()}},{key:"render",value:function(){return null}}],o=[{key:"getDerivedStateFromProps",value:function(t){return Ee(t.reloadRequest)||"loading"===t.reloadRequest.status?null:{reloadRequest:t.reloadRequest}}}],n&&Lp(r.prototype,n),o&&Lp(r,o),Object.defineProperty(r,"prototype",{writable:!1}),r;var r,n,o}(w()().Component);Jp.defaultProps={},Jp.propTypes={id:_().string,config:_().object,reloadRequest:_().object,dispatch:_().func,interval:_().number};var $p=lt(function(t){return{config:t.config,reloadRequest:t.reloadRequest}},function(t){return{dispatch:t}})(Jp);function Wp(){var t=document.getElementById("_dash-config");return JSON.parse(null!=t&&t.textContent?null==t?void 0:t.textContent:"{}")}var zp=qt(function(t,e){var r={};return mt(e.length,function(){var n=t.apply(this,arguments);return Ft(n,r)||(r[n]=e.apply(this,arguments)),r[n]})}),Vp=zp;function Kp(t){return Kp="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},Kp(t)}function Yp(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 Qp(t){for(var e=1;et.length)&&(e=t.length);for(var r=0,n=Array(e);r=t.length)&&Tn(String(r),t))return t[r]}}function sd(t,e){if("string"==typeof e&&Tn(e,t))return t[e]}function ld(t,e){if(Array.isArray(e)){var r,n=t,o=function(t,e){var r="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!r){if(Array.isArray(t)||(r=function(t,e){if(t){if("string"==typeof t)return ud(t,e);var r={}.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)?ud(t,e):void 0}}(t))||e&&t&&"number"==typeof t.length){r&&(t=r);var n=0,o=function(){};return{s:o,n:function(){return n>=t.length?{done:!0}:{done:!1,value:t[n++]}},e:function(t){throw t},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,u=!1;return{s:function(){r=r.call(t)},n:function(){var t=r.next();return a=t.done,t},e:function(t){u=!0,i=t},f:function(){try{a||null==r.return||r.return()}finally{if(u)throw i}}}}(e);try{for(o.s();!(r=o.n()).done;){var i=r.value;if(Array.isArray(n))n=cd(n,i);else{if(null===n||"object"!==ad(n))return;n=sd(n,i)}}}catch(t){o.e(t)}finally{o.f()}return n}}function fd(t){return fd="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},fd(t)}function pd(){var t,e,r="function"==typeof Symbol?Symbol:{},n=r.iterator||"@@iterator",o=r.toStringTag||"@@toStringTag";function i(r,n,o,i){var c=n&&n.prototype instanceof u?n:u,s=Object.create(c.prototype);return dd(s,"_invoke",function(r,n,o){var i,u,c,s=0,l=o||[],f=!1,p={p:0,n:0,v:t,a:d,f:d.bind(t,4),d:function(e,r){return i=e,u=0,c=t,p.n=r,a}};function d(r,n){for(u=r,c=n,e=0;!f&&s&&!o&&e3?(o=y===n)&&(c=i[(u=i[4])?5:(u=3,3)],i[4]=i[5]=t):i[0]<=d&&((o=r<2&&dn||n>y)&&(i[4]=r,i[5]=n,p.n=y,u=0))}if(o||r>1)return a;throw f=!0,n}return function(o,l,y){if(s>1)throw TypeError("Generator is already running");for(f&&1===l&&d(l,y),u=l,c=y;(e=u<2?t:c)||!f;){i||(u?u<3?(u>1&&(p.n=-1),d(u,c)):p.n=c:p.v=c);try{if(s=2,i){if(u||(o="next"),e=i[o]){if(!(e=e.call(i,c)))throw TypeError("iterator result is not an object");if(!e.done)return e;c=e.value,u<2&&(u=0)}else 1===u&&(e=i.return)&&e.call(i),u<2&&(c=TypeError("The iterator does not provide a '"+o+"' method"),u=1);i=t}else if((e=(f=p.n<0)?c:r.call(n,p))!==a)break}catch(e){i=t,u=1,c=e}finally{s=1}}return{value:e,done:f}}}(r,o,i),!0),s}var a={};function u(){}function c(){}function s(){}e=Object.getPrototypeOf;var l=[][n]?e(e([][n]())):(dd(e={},n,function(){return this}),e),f=s.prototype=u.prototype=Object.create(l);function p(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,s):(t.__proto__=s,dd(t,o,"GeneratorFunction")),t.prototype=Object.create(f),t}return c.prototype=s,dd(f,"constructor",s),dd(s,"constructor",c),c.displayName="GeneratorFunction",dd(s,o,"GeneratorFunction"),dd(f),dd(f,o,"Generator"),dd(f,n,function(){return this}),dd(f,"toString",function(){return"[object Generator]"}),(pd=function(){return{w:i,m:p}})()}function dd(t,e,r,n){var o=Object.defineProperty;try{o({},"",{})}catch(t){o=0}dd=function(t,e,r,n){function i(e,r){dd(t,e,function(t){return this._invoke(e,r,t)})}e?o?o(t,e,{value:r,enumerable:!n,configurable:!n,writable:!n}):t[e]=r:(i("next",0),i("throw",1),i("return",2))},dd(t,e,r,n)}function yd(t){return function(t){if(Array.isArray(t))return Od(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||wd(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function hd(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 vd(t){for(var e=1;e=t.length?{done:!0}:{done:!1,value:t[n++]}},e:function(t){throw t},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,u=!1;return{s:function(){r=r.call(t)},n:function(){var t=r.next();return a=t.done,t},e:function(t){u=!0,i=t},f:function(){try{a||null==r.return||r.return()}finally{if(u)throw i}}}}function wd(t,e){if(t){if("string"==typeof t)return Od(t,e);var r={}.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)?Od(t,e):void 0}}function Od(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r0&&(console.log("[Dash] Re-triggering ".concat(r.length," persistent callback(s)")),e.dispatch(Ms(r)))}}},a.onDisconnected=function(t){console.log("[Dash] WebSocket disconnected: ".concat(t)),c=!0},a.onError=function(t,e){console.error("[Dash] WebSocket error: ".concat(t),e)},document.addEventListener("visibilitychange",function(){"visible"===document.visibilityState&&(a.connected?a.notifyTabVisible():c&&(console.log("[Dash] Tab visible, reconnecting WebSocket..."),a.ensureConnected(r).catch(function(t){return console.error("[Dash] Failed to reconnect:",t)})))}),null!==(i=r.websocket)&&void 0!==i&&i.enabled){t.n=3;break}return t.a(2);case 3:return s=Ed(r),t.p=4,t.n=5,a.connect(r.websocket.worker_url,s,r.websocket.inactivity_timeout);case 5:t.n=7;break;case 6:t.p=6,l=t.v,console.error("[Dash] Failed to connect to WebSocket worker:",l);case 7:return t.a(2)}},t,null,[[4,6]])}),_d=function(){var e=this,r=arguments;return new Promise(function(n,o){var i=t.apply(e,r);function a(t){md(i,n,o,a,u,"next",t)}function u(t){md(i,n,o,a,u,"throw",t)}a(void 0)})},_d.apply(this,arguments)}function Ed(t){var e;if(null===(e=t.websocket)||void 0===e||!e.url)throw new Error("WebSocket URL not configured");var r="https:"===window.location.protocol?"wss:":"ws:",n=window.location.host;return"".concat(r,"//").concat(n).concat(t.websocket.url)}function Pd(t){return Pd="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},Pd(t)}function kd(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 Ad(t){for(var e=1;et.length)&&(e=t.length);for(var r=0,n=Array(e);rt.length)&&(e=t.length);for(var r=0,n=Array(e);rt.length)&&(e=t.length);for(var r=0,n=Array(e);r1&&void 0!==arguments[1]?arguments[1]:"about:blank";if(""===t)return t;var r=t.replace(Kd,"").replace(Yd,"").replace(Qd,function(t,e){return String.fromCharCode(e)}).trim();return Vd.test(r)?e:t}:Xd.clean_url,Xd.Patch=ac,window.DashRenderer=Fd}(),window.dash_renderer={}}(); \ No newline at end of file diff --git a/dash/dash_table/bundle.js b/dash/dash_table/bundle.js index 2d0908d081..cba21039f8 100644 --- a/dash/dash_table/bundle.js +++ b/dash/dash_table/bundle.js @@ -1,2 +1,2 @@ -!function(){var e,t,n={4296:function(e,t,n){var r;window,e.exports=(r=n(1609),function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=1)}([function(e,t){e.exports=r},function(e,t,n){"use strict";n.r(t),n.d(t,"asyncDecorator",function(){return u}),n.d(t,"inheritAsyncDecorator",function(){return a}),n.d(t,"isReady",function(){return c}),n.d(t,"History",function(){return f});var r=n(0);function o(e,t,n,r,o,i,u){try{var a=e[i](u),c=a.value}catch(e){return void n(e)}a.done?t(c):Promise.resolve(c).then(r,o)}function i(e){return function(){var t=this,n=arguments;return new Promise(function(r,i){var u=e.apply(t,n);function a(e){o(u,r,i,a,c,"next",e)}function c(e){o(u,r,i,a,c,"throw",e)}a(void 0)})}}var u=function(e,t){var n,o={isReady:new Promise(function(e){n=e}),get:Object(r.lazy)(function(){return Promise.resolve(t()).then(function(e){return setTimeout(i(regeneratorRuntime.mark(function e(){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,n(!0);case 2:o.isReady=!0;case 3:case"end":return e.stop()}},e)})),0),e})})};return Object.defineProperty(e,"_dashprivate_isLazyComponentReady",{get:function(){return o.isReady}}),o.get},a=function(e,t){Object.defineProperty(e,"_dashprivate_isLazyComponentReady",{get:function(){return c(t)}})},c=function(e){return e&&e._dashprivate_isLazyComponentReady};function l(e,t){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:"",r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"/";if(e.enabled()){var o=new Date(Date.now()-864e5).toUTCString();document.cookie="".concat(t,"=;expires=").concat(o,";domain=").concat(n,";path=").concat(r)}}},{key:"get",value:function(t){if(t.length&&e.enabled())return t=t.toLowerCase(),(document.cookie.split(";").map(function(e){var t=e.split("=");return{id:t[0].trim(),value:t[1]}}).find(function(e){return t===e.id.toLocaleLowerCase()})||{}).value}},{key:"set",value:function(t,n){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"/";if(e.enabled()){var i=new Date(Date.now()+63072e7).toUTCString(),u="".concat(t,"=").concat(n,";expires=").concat(i,";domain=").concat(r,";path=").concat(o);e.get(t)&&e.delete(t,r,o),document.cookie=u}}}],null&&i(t.prototype,null),n&&i(t,n),Object.defineProperty(t,"prototype",{writable:!1}),t;var t,n}();a=s,c="enabled",l=r.A(function(){try{document.cookie="cookietest=1";var e=-1!==document.cookie.indexOf("cookietest=");return document.cookie="cookietest=1; expires=Thu, 01-Jan-1970 00:00:01 GMT",e}catch(e){return!1}}),(c=u(c))in a?Object.defineProperty(a,c,{value:l,enumerable:!0,configurable:!0,writable:!0}):a[c]=l;var f,d,p,y=n(2314);function b(e){return b="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},b(e)}function m(e,t){for(var n=0;n=1&&t<=31||127==t||0==o&&t>=48&&t<=57||1==o&&t>=48&&t<=57&&45==u?"\\"+t.toString(16)+" ":0==o&&1==r&&45==t||!(t>=128||45==t||95==t||t>=48&&t<=57||t>=65&&t<=90||t>=97&&t<=122)?"\\"+n.charAt(o):n.charAt(o):i+="�";return i};return e.CSS||(e.CSS={}),e.CSS.escape=t,t}(r)},6120:function(e){"use strict";e.exports=window.PropTypes},1609:function(e){"use strict";e.exports=window.React},5795:function(e){"use strict";e.exports=window.ReactDOM},3847:function(e,t,n){"use strict";var r=n(2173),o=n(2270),i=(0,r.A)(function(e,t,n){return(0,o.A)([e],t,n)});t.A=i},2270:function(e,t,n){"use strict";n.d(t,{A:function(){return c}});var r=n(2173),o=n(4279),i=n(5564),u=n(1647),a=n(320),c=(0,r.A)(function e(t,n,r){if(0===t.length)return n;var c=t[0];if(t.length>1){var l=(0,a.A)(c,r);((0,u.A)(l)||"object"!=typeof l)&&(l=(0,o.A)(t[1])?[]:{}),n=e(Array.prototype.slice.call(t,1),n,l)}return function(e,t,n){if((0,o.A)(e)&&(0,i.A)(n)){var r=e<0?n.length+e:e,u=[].concat(n);return u[r]=t,u}var a={};for(var c in n)a[c]=n[c];return a[e]=t,a}(c,n,r)})},5845:function(e,t,n){"use strict";var r=n(7660),o=n(3579),i=n(2254),u=n(9034),a=(0,i.A)(function(e,t){return 1===e?(0,o.A)(t):(0,r.A)(e,(0,u.A)(e,[],t))});t.A=a},7660:function(e,t,n){"use strict";function r(e,t){switch(e){case 0:return function(){return t.apply(this,arguments)};case 1:return function(e){return t.apply(this,arguments)};case 2:return function(e,n){return t.apply(this,arguments)};case 3:return function(e,n,r){return t.apply(this,arguments)};case 4:return function(e,n,r,o){return t.apply(this,arguments)};case 5:return function(e,n,r,o,i){return t.apply(this,arguments)};case 6:return function(e,n,r,o,i,u){return t.apply(this,arguments)};case 7:return function(e,n,r,o,i,u,a){return t.apply(this,arguments)};case 8:return function(e,n,r,o,i,u,a,c){return t.apply(this,arguments)};case 9:return function(e,n,r,o,i,u,a,c,l){return t.apply(this,arguments)};case 10:return function(e,n,r,o,i,u,a,c,l,s){return t.apply(this,arguments)};default:throw new Error("First argument to _arity must be a non-negative integer no greater than ten")}}n.d(t,{A:function(){return r}})},3430:function(e,t,n){"use strict";function r(e,t,n){for(var r=0,o=n.length;r=arguments.length)?f=t[l]:(f=arguments[a],a+=1),u[l]=f,(0,o.A)(f)?s=!0:c-=1,l+=1}return!s&&c<=0?n.apply(this,u):(0,r.A)(Math.max(0,c),i(e,u,n))}}},845:function(e,t,n){"use strict";n.d(t,{A:function(){return o}});var r=n(5564);function o(e,t,n){return function(){if(0===arguments.length)return n();var o=arguments[arguments.length-1];if(!(0,r.A)(o)){for(var i=0;i=0&&"[object Array]"===Object.prototype.toString.call(e)}},4279:function(e,t){"use strict";t.A=Number.isInteger||function(e){return(0|e)===e}},2808:function(e,t,n){"use strict";function r(e){return null!=e&&"object"==typeof e&&!0===e["@@functional/placeholder"]}n.d(t,{A:function(){return r}})},8267:function(e,t,n){"use strict";function r(e,t){for(var n=0,r=t.length,o=Array(r);n=0;)t=l[n],(0,o.A)(t,e)&&!f(r,t)&&(r[r.length]=t),n-=1;return r}):(0,r.A)(function(e){return Object(e)!==e?[]:Object.keys(e)})},2598:function(e,t,n){"use strict";var r=n(3430),o=n(2254),i=n(845),u=n(8267),a=n(9607),c=n(5845),l=n(2959),s=(0,o.A)((0,i.A)(["fantasy-land/map","map"],a.A,function(e,t){switch(Object.prototype.toString.call(t)){case"[object Function]":return(0,c.A)(t.length,function(){return e.call(this,t.apply(this,arguments))});case"[object Object]":return(0,r.A)(function(n,r){return n[r]=e(t[r]),n},{},(0,l.A)(t));default:return(0,u.A)(e,t)}}));t.A=s},2039:function(e,t,n){"use strict";var r=n(7660),o=(0,n(3579).A)(function(e){var t,n=!1;return(0,r.A)(e.length,function(){return n?t:(n=!0,t=e.apply(this,arguments))})});t.A=o},9849:function(e,t,n){"use strict";var r=n(2254),o=n(2598),i=n(5987),u=(0,r.A)(function(e,t){return(0,o.A)((0,i.A)(e),t)});t.A=u},5987:function(e,t,n){"use strict";var r=n(2254),o=n(320),i=(0,r.A)(o.A);t.A=i}},r={};function o(e){var t=r[e];if(void 0!==t)return t.exports;var i=r[e]={id:e,exports:{}};return n[e].call(i.exports,i,i.exports,o),i.exports}o.m=n,o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,{a:t}),t},o.cw=function(e){var t;return function(){if(e){var n=e;e=0,t={exports:{}},n.call(t.exports,t,t.exports)}return t.exports}},o.d=function(e,t){if(Array.isArray(t))for(var n=0;n-1&&(!e||!/^https?:/.test(e));)e=n[r--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/^blob:|[?#].*$/g,"").replace(/\/[^/]+$/,"/"),o.p=e}();var i,u=function(){var e=document.currentScript;if(!e){for(var t=document.getElementsByTagName("script"),n=[],r=0;r1&&void 0!==arguments[1]?arguments[1]:"",r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"/";if(e.enabled()){var o=new Date(Date.now()-864e5).toUTCString();document.cookie="".concat(t,"=;expires=").concat(o,";domain=").concat(n,";path=").concat(r)}}},{key:"get",value:function(t){if(t.length&&e.enabled())return t=t.toLowerCase(),(document.cookie.split(";").map(function(e){var t=e.split("=");return{id:t[0].trim(),value:t[1]}}).find(function(e){return t===e.id.toLocaleLowerCase()})||{}).value}},{key:"set",value:function(t,n){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"/";if(e.enabled()){var i=new Date(Date.now()+63072e7).toUTCString(),u="".concat(t,"=").concat(n,";expires=").concat(i,";domain=").concat(r,";path=").concat(o);e.get(t)&&e.delete(t,r,o),document.cookie=u}}}],null&&i(t.prototype,null),n&&i(t,n),Object.defineProperty(t,"prototype",{writable:!1}),t;var t,n}();a=s,c="enabled",l=r.A(function(){try{document.cookie="cookietest=1";var e=-1!==document.cookie.indexOf("cookietest=");return document.cookie="cookietest=1; expires=Thu, 01-Jan-1970 00:00:01 GMT",e}catch(e){return!1}}),(c=u(c))in a?Object.defineProperty(a,c,{value:l,enumerable:!0,configurable:!0,writable:!0}):a[c]=l;var f,d,p,y=n(2314);function b(e){return b="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},b(e)}function m(e,t){for(var n=0;n=1&&t<=31||127==t||0==o&&t>=48&&t<=57||1==o&&t>=48&&t<=57&&45==u?"\\"+t.toString(16)+" ":0==o&&1==r&&45==t||!(t>=128||45==t||95==t||t>=48&&t<=57||t>=65&&t<=90||t>=97&&t<=122)?"\\"+n.charAt(o):n.charAt(o):i+="�";return i};return e.CSS||(e.CSS={}),e.CSS.escape=t,t}(r)},6120:function(e){"use strict";e.exports=window.PropTypes},1609:function(e){"use strict";e.exports=window.React},5795:function(e){"use strict";e.exports=window.ReactDOM},3847:function(e,t,n){"use strict";var r=n(2173),o=n(2270),i=(0,r.A)(function(e,t,n){return(0,o.A)([e],t,n)});t.A=i},2270:function(e,t,n){"use strict";n.d(t,{A:function(){return c}});var r=n(2173),o=n(4279),i=n(5564),u=n(1647),a=n(320),c=(0,r.A)(function e(t,n,r){if(0===t.length)return n;var c=t[0];if(t.length>1){var l=(0,a.A)(c,r);((0,u.A)(l)||"object"!=typeof l)&&(l=(0,o.A)(t[1])?[]:{}),n=e(Array.prototype.slice.call(t,1),n,l)}return function(e,t,n){if((0,o.A)(e)&&(0,i.A)(n)){var r=e<0?n.length+e:e,u=[].concat(n);return u[r]=t,u}var a={};for(var c in n)a[c]=n[c];return a[e]=t,a}(c,n,r)})},5845:function(e,t,n){"use strict";var r=n(7660),o=n(3579),i=n(2254),u=n(9034),a=(0,i.A)(function(e,t){return 1===e?(0,o.A)(t):(0,r.A)(e,(0,u.A)(e,[],t))});t.A=a},7660:function(e,t,n){"use strict";function r(e,t){switch(e){case 0:return function(){return t.apply(this,arguments)};case 1:return function(e){return t.apply(this,arguments)};case 2:return function(e,n){return t.apply(this,arguments)};case 3:return function(e,n,r){return t.apply(this,arguments)};case 4:return function(e,n,r,o){return t.apply(this,arguments)};case 5:return function(e,n,r,o,i){return t.apply(this,arguments)};case 6:return function(e,n,r,o,i,u){return t.apply(this,arguments)};case 7:return function(e,n,r,o,i,u,a){return t.apply(this,arguments)};case 8:return function(e,n,r,o,i,u,a,c){return t.apply(this,arguments)};case 9:return function(e,n,r,o,i,u,a,c,l){return t.apply(this,arguments)};case 10:return function(e,n,r,o,i,u,a,c,l,s){return t.apply(this,arguments)};default:throw new Error("First argument to _arity must be a non-negative integer no greater than ten")}}n.d(t,{A:function(){return r}})},3430:function(e,t,n){"use strict";function r(e,t,n){for(var r=0,o=n.length;r=arguments.length)?f=t[l]:(f=arguments[a],a+=1),u[l]=f,(0,o.A)(f)?s=!0:c-=1,l+=1}return!s&&c<=0?n.apply(this,u):(0,r.A)(Math.max(0,c),i(e,u,n))}}},845:function(e,t,n){"use strict";n.d(t,{A:function(){return o}});var r=n(5564);function o(e,t,n){return function(){if(0===arguments.length)return n();var o=arguments[arguments.length-1];if(!(0,r.A)(o)){for(var i=0;i=0&&"[object Array]"===Object.prototype.toString.call(e)}},4279:function(e,t){"use strict";t.A=Number.isInteger||function(e){return(0|e)===e}},2808:function(e,t,n){"use strict";function r(e){return null!=e&&"object"==typeof e&&!0===e["@@functional/placeholder"]}n.d(t,{A:function(){return r}})},8267:function(e,t,n){"use strict";function r(e,t){for(var n=0,r=t.length,o=Array(r);n=0;)t=l[n],(0,o.A)(t,e)&&!f(r,t)&&(r[r.length]=t),n-=1;return r}):(0,r.A)(function(e){return Object(e)!==e?[]:Object.keys(e)})},2598:function(e,t,n){"use strict";var r=n(3430),o=n(2254),i=n(845),u=n(8267),a=n(9607),c=n(5845),l=n(2959),s=(0,o.A)((0,i.A)(["fantasy-land/map","map"],a.A,function(e,t){switch(Object.prototype.toString.call(t)){case"[object Function]":return(0,c.A)(t.length,function(){return e.call(this,t.apply(this,arguments))});case"[object Object]":return(0,r.A)(function(n,r){return n[r]=e(t[r]),n},{},(0,l.A)(t));default:return(0,u.A)(e,t)}}));t.A=s},2039:function(e,t,n){"use strict";var r=n(7660),o=(0,n(3579).A)(function(e){var t,n=!1;return(0,r.A)(e.length,function(){return n?t:(n=!0,t=e.apply(this,arguments))})});t.A=o},9849:function(e,t,n){"use strict";var r=n(2254),o=n(2598),i=n(5987),u=(0,r.A)(function(e,t){return(0,o.A)((0,i.A)(e),t)});t.A=u},5987:function(e,t,n){"use strict";var r=n(2254),o=n(320),i=(0,r.A)(o.A);t.A=i}},r={};function o(e){var t=r[e];if(void 0!==t)return t.exports;var i=r[e]={id:e,exports:{}};return n[e].call(i.exports,i,i.exports,o),i.exports}o.m=n,o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,{a:t}),t},o.cw=function(e){var t;return function(){if(e){var n=e;e=0,t={exports:{}},n.call(t.exports,t,t.exports)}return t.exports}},o.d=function(e,t){if(Array.isArray(t))for(var n=0;n-1&&(!e||!/^https?:/.test(e));)e=n[r--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/^blob:|[?#].*$/g,"").replace(/\/[^/]+$/,"/"),o.p=e}();var i,u=function(){var e=document.currentScript;if(!e){for(var t=document.getElementsByTagName("script"),n=[],r=0;r { };\n }\n let fn;\n let fnStyle = '';\n switch (level) {\n case LogLevel.TRACE:\n case LogLevel.INFO:\n fn = window.console.log;\n fnStyle = 'color: white; background-color: #3166A2;';\n break;\n case DebugLevel.DEBUG:\n case LogLevel.WARNING:\n fn = window.console.warn;\n fnStyle = 'color: white; background-color: #E9B606;';\n break;\n case LogLevel.ERROR:\n case LogLevel.FATAL:\n fn = window.console.error;\n fnStyle = 'color: white; background-color: #FF0000;';\n break;\n default:\n throw new Error(`Unknown log ${level}`);\n }\n const prefix = `${fnStyle && __highlightPrefix ? '%c' : ''}[${LogString[level].toUpperCase()}]`;\n if (fnStyle && __highlightPrefix) {\n return fn.bind(window.console, prefix, fnStyle);\n }\n else {\n return fn.bind(window.console, prefix);\n }\n}\nconst logger = {\n setDebugLevel(level) {\n __debugLevel = level;\n },\n setLogLevel(level) {\n __logLevel = level;\n }\n};\nObject.defineProperties(logger, {\n trace: {\n get: () => {\n return logFn(LogLevel.TRACE, __logLevel);\n },\n configurable: false,\n enumerable: false\n },\n info: {\n get: () => {\n return logFn(LogLevel.INFO, __logLevel);\n },\n configurable: false,\n enumerable: false\n },\n warning: {\n get: () => {\n return logFn(LogLevel.WARNING, __logLevel);\n },\n configurable: false,\n enumerable: false\n },\n error: {\n get: () => {\n return logFn(LogLevel.ERROR, __logLevel);\n },\n configurable: false,\n enumerable: false\n },\n fatal: {\n get: () => {\n return logFn(LogLevel.FATAL, __logLevel);\n },\n configurable: false,\n enumerable: false\n },\n debug: {\n get: () => {\n return logFn(DebugLevel.DEBUG, __debugLevel);\n },\n configurable: false,\n enumerable: false\n }\n});\nObject.freeze(logger);\nexport default logger;\nexport { DebugLevel, LogLevel };\n","import * as R from 'ramda';\nconst __1day = 86400 * 1000;\nconst __20years = 86400 * 1000 * 365 * 20;\nexport default class CookieStorage {\n // From https://github.com/Modernizr/Modernizr/blob/f4d3aa0b3c9eeb7338e8d89ed77929a8e969c502/feature-detects/cookies.js#L1\n // try..catch because some in situations `document.cookie` is exposed but throws a\n // SecurityError if you try to access it; e.g. documents created from data URIs\n // or in sandboxed iframes (depending on flags/context)\n static enabled = R.once(() => {\n try {\n // Create cookie\n document.cookie = 'cookietest=1';\n const ret = document.cookie.indexOf('cookietest=') !== -1;\n // Delete cookie\n document.cookie =\n 'cookietest=1; expires=Thu, 01-Jan-1970 00:00:01 GMT';\n return ret;\n }\n catch (e) {\n return false;\n }\n });\n static delete(id, domain = '', path = '/') {\n if (!CookieStorage.enabled()) {\n return;\n }\n const expires = new Date(Date.now() - __1day).toUTCString();\n document.cookie = `${id}=;expires=${expires};domain=${domain};path=${path}`;\n }\n static get(id) {\n if (!id.length) {\n return;\n }\n if (!CookieStorage.enabled()) {\n return;\n }\n id = id.toLowerCase();\n const cookies = document.cookie.split(';').map(cookie => {\n const fragments = cookie.split('=');\n return {\n id: fragments[0].trim(),\n value: fragments[1]\n };\n });\n return (cookies.find(cookie => id === cookie.id.toLocaleLowerCase()) ||\n {}).value;\n }\n static set(id, value, domain = '', path = '/') {\n if (!CookieStorage.enabled()) {\n return;\n }\n const expires = new Date(Date.now() + __20years).toUTCString();\n const entry = `${id}=${value};expires=${expires};domain=${domain};path=${path}`;\n if (CookieStorage.get(id)) {\n CookieStorage.delete(id, domain, path);\n }\n document.cookie = entry;\n }\n}\n","import CookieStorage from 'core/storage/Cookie';\nimport { DebugLevel, LogLevel } from 'core/Logger';\nconst DASH_DEBUG = 'dash_debug';\nconst DASH_LOG = 'dash_log';\nexport default class Environment {\n static _supportsCssVariables = Boolean(window.CSS?.supports?.('.some-selector', 'var(--some-var)'));\n static _activeEdge = Environment._supportsCssVariables\n ? '1px solid var(--accent)'\n : '1px solid hotpink';\n static get searchParams() {\n return ((typeof URL !== 'undefined' &&\n URL.prototype &&\n URL.prototype.constructor &&\n new URL(window.location.href).searchParams) || { get: () => null });\n }\n static get debugLevel() {\n const debug = this.searchParams.get(DASH_DEBUG) || CookieStorage.get(DASH_DEBUG);\n return debug\n ? DebugLevel[debug] || DebugLevel.NONE\n : DebugLevel.NONE;\n }\n static get logLevel() {\n const log = this.searchParams.get(DASH_LOG) || CookieStorage.get(DASH_LOG);\n return log ? LogLevel[log] || LogLevel.ERROR : LogLevel.ERROR;\n }\n static get defaultEdge() {\n return '1px solid #d3d3d3';\n }\n static get activeEdge() {\n return Environment._activeEdge;\n }\n static get supportsCssVariables() {\n return Environment._supportsCssVariables;\n }\n}\n","export default class LazyLoader {\n static get xlsx() {\n return import(\n /* webpackChunkName: \"export\", webpackMode: \"lazy\" */ 'xlsx');\n }\n static get hljs() {\n return Promise.resolve(window.hljs ||\n import(\n /* webpackChunkName: \"highlight\", webpackMode: \"lazy\" */ '../third-party/highlight.js').then(result => result.default));\n }\n static table() {\n return import(\n /* webpackChunkName: \"table\", webpackMode: \"lazy\" */ 'dash-table/dash/fragments/DataTable');\n }\n}\n","import _curry3 from \"./internal/_curry3.js\";\n\n/**\n * Creates a new list out of the two supplied by applying the function to each\n * equally-positioned pair in the lists. The returned list is truncated to the\n * length of the shorter of the two input lists.\n *\n * @function\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig ((a, b) -> c) -> [a] -> [b] -> [c]\n * @param {Function} fn The function used to combine the two elements into one value.\n * @param {Array} list1 The first array to consider.\n * @param {Array} list2 The second array to consider.\n * @return {Array} The list made by combining same-indexed elements of `list1` and `list2`\n * using `fn`.\n * @example\n *\n * const f = (x, y) => {\n * // ...\n * };\n * R.zipWith(f, [1, 2, 3], ['a', 'b', 'c']);\n * //=> [f(1, 'a'), f(2, 'b'), f(3, 'c')]\n * @symb R.zipWith(fn, [a, b, c], [d, e, f]) = [fn(a, d), fn(b, e), fn(c, f)]\n */\nvar zipWith = /*#__PURE__*/_curry3(function zipWith(fn, a, b) {\n var len = Math.min(a.length, b.length);\n var rv = Array(len);\n var idx = 0;\n while (idx < len) {\n rv[idx] = fn(a[idx], b[idx]);\n idx += 1;\n }\n return rv;\n});\nexport default zipWith;","\nimport * as R from 'ramda';\nimport React, {Component, Suspense} from 'react';\nimport PropTypes from 'prop-types';\nimport {asyncDecorator} from '@plotly/dash-component-plugins';\nimport LazyLoader from 'dash-table/LazyLoader';\n/**\n * Dash DataTable is an interactive table component designed for\n * viewing, editing, and exploring large datasets.\n * DataTable is rendered with standard, semantic HTML markup,\n * which makes it accessible, responsive, and easy to style. This\n * component was written from scratch in React.js specifically for the\n * Dash community. Its API was designed to be ergonomic and its behavior\n * is completely customizable through its properties.\n */\nexport default class DataTable extends Component {\n render() {\n return (\n \n \n \n );\n }\n}\nconst RealDataTable = asyncDecorator(DataTable, LazyLoader.table);\nexport const defaultProps = {\n page_action: 'native',\n page_current: 0,\n page_size: 250,\n css: [],\n filter_query: '',\n filter_action: 'none',\n sort_as_null: [],\n sort_action: 'none',\n sort_mode: 'single',\n sort_by: [],\n style_as_list_view: false,\n derived_viewport_data: [],\n derived_viewport_indices: [],\n derived_viewport_row_ids: [],\n derived_viewport_selected_rows: [],\n derived_viewport_selected_row_ids: [],\n derived_virtual_data: [],\n derived_virtual_indices: [],\n derived_virtual_row_ids: [],\n derived_virtual_selected_rows: [],\n derived_virtual_selected_row_ids: [],\n dropdown: {},\n dropdown_conditional: [],\n dropdown_data: [],\n fill_width: true,\n filter_options: {},\n fixed_columns: {\n headers: false,\n data: 0\n },\n fixed_rows: {\n headers: false,\n data: 0\n },\n markdown_options: {\n link_target: '_blank',\n html: false\n },\n tooltip: {},\n tooltip_conditional: [],\n tooltip_data: [],\n tooltip_header: {},\n tooltip_delay: 350,\n tooltip_duration: 2000,\n column_selectable: false,\n editable: false,\n export_columns: 'visible',\n export_format: 'none',\n include_headers_on_copy_paste: false,\n selected_cells: [],\n selected_columns: [],\n selected_rows: [],\n selected_row_ids: [],\n cell_selectable: true,\n row_selectable: false,\n style_table: {},\n style_cell_conditional: [],\n style_data_conditional: [],\n style_filter_conditional: [],\n style_header_conditional: [],\n virtualization: false,\n persisted_props: [\n 'columns.name',\n 'filter_query',\n 'hidden_columns',\n 'page_current',\n 'selected_columns',\n 'selected_rows',\n 'sort_by'\n ],\n persistence_type: 'local'\n};\nexport const propTypes = {\n /**\n * The contents of the table.\n * The keys of each item in data should match the column IDs.\n * Each item can also have an 'id' key, whose value is its row ID. If there\n * is a column with ID='id' this will display the row ID, otherwise it is\n * just used to reference the row for selections, filtering, etc.\n * Example:\n * [\n * {'column-1': 4.5, 'column-2': 'montreal', 'column-3': 'canada'},\n * {'column-1': 8, 'column-2': 'boston', 'column-3': 'america'}\n * ]\n */\n data: PropTypes.arrayOf(\n PropTypes.objectOf(\n PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number,\n PropTypes.bool\n ])\n )\n ),\n /**\n * Columns describes various aspects about each individual column.\n * `name` and `id` are the only required parameters.\n */\n columns: PropTypes.arrayOf(\n PropTypes.exact({\n /**\n * The `id` of the column.\n * The column `id` is used to match cells in data with particular columns.\n * The `id` is not visible in the table.\n */\n id: PropTypes.string.isRequired,\n /**\n * The `name` of the column, as it appears in the column header.\n * If `name` is a list of strings, then the columns\n * will render with multiple headers rows.\n */\n name: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.arrayOf(PropTypes.string)\n ]).isRequired,\n /**\n * The data-type provides support for per column typing and allows for data\n * validation and coercion.\n * 'numeric': represents both floats and ints.\n * 'text': represents a string.\n * 'datetime': a string representing a date or date-time, in the form:\n * 'YYYY-MM-DD HH:MM:SS.ssssss' or some truncation thereof. Years must\n * have 4 digits, unless you use `validation.allow_YY: true`. Also\n * accepts 'T' or 't' between date and time, and allows timezone info\n * at the end. To convert these strings to Python `datetime` objects,\n * use `dateutil.parser.isoparse`. In R use `parse_iso_8601` from the\n * `parsedate` library.\n * WARNING: these parsers do not work with 2-digit years, if you use\n * `validation.allow_YY: true` and do not coerce to 4-digit years.\n * And parsers that do work with 2-digit years may make a different\n * guess about the century than we make on the front end.\n * 'any': represents any type of data.\n * Defaults to 'any' if undefined.\n *\n *\n */\n type: PropTypes.oneOf(['any', 'numeric', 'text', 'datetime']),\n /**\n * The `presentation` to use to display data. Markdown can be used on\n * columns with type 'text'. See 'dropdown' for more info.\n * Defaults to 'input' for ['datetime', 'numeric', 'text', 'any'].\n */\n presentation: PropTypes.oneOf(['input', 'dropdown', 'markdown']),\n /**\n * If true, the user can select the column by clicking on the checkbox or radio button\n * in the column. If there are multiple header rows, true will display the input\n * on each row.\n * If `last`, the input will only appear on the last header row. If `first` it will only\n * appear on the first header row. These are respectively shortcut equivalents to\n * `[false, ..., false, true]` and `[true, false, ..., false]`.\n * If there are merged, multi-header columns then you can choose which column header\n * row to display the input in by supplying an array of booleans.\n * For example, `[true, false]` will display the `selectable` input on the first row,\n * but now on the second row.\n * If the `selectable` input appears on a merged columns, then clicking on that input\n * will select *all* of the merged columns associated with it.\n * The table-level prop `column_selectable` is used to determine the type of column\n * selection to use.\n *\n */\n selectable: PropTypes.oneOfType([\n PropTypes.oneOf(['first', 'last']),\n PropTypes.bool,\n PropTypes.arrayOf(PropTypes.bool)\n ]),\n /**\n * If true, the user can clear the column by clicking on the `clear`\n * action button on the column. If there are multiple header rows, true\n * will display the action button on each row.\n * If `last`, the `clear` action button will only appear on the last header\n * row. If `first` it will only appear on the first header row. These\n * are respectively shortcut equivalents to `[false, ..., false, true]` and\n * `[true, false, ..., false]`.\n * If there are merged, multi-header columns then you can choose\n * which column header row to display the `clear` action button in by\n * supplying an array of booleans.\n * For example, `[true, false]` will display the `clear` action button\n * on the first row, but not the second row.\n * If the `clear` action button appears on a merged column, then clicking\n * on that button will clear *all* of the merged columns associated with it.\n * Unlike `column.deletable`, this action does not remove the column(s)\n * from the table. It only removed the associated entries from `data`.\n */\n clearable: PropTypes.oneOfType([\n PropTypes.oneOf(['first', 'last']),\n PropTypes.bool,\n PropTypes.arrayOf(PropTypes.bool)\n ]),\n /**\n * If true, the user can remove the column by clicking on the `delete`\n * action button on the column. If there are multiple header rows, true\n * will display the action button on each row.\n * If `last`, the `delete` action button will only appear on the last header\n * row. If `first` it will only appear on the first header row. These\n * are respectively shortcut equivalents to `[false, ..., false, true]` and\n * `[true, false, ..., false]`.\n * If there are merged, multi-header columns then you can choose\n * which column header row to display the `delete` action button in by\n * supplying an array of booleans.\n * For example, `[true, false]` will display the `delete` action button\n * on the first row, but not the second row.\n * If the `delete` action button appears on a merged column, then clicking\n * on that button will remove *all* of the merged columns associated with it.\n */\n deletable: PropTypes.oneOfType([\n PropTypes.oneOf(['first', 'last']),\n PropTypes.bool,\n PropTypes.arrayOf(PropTypes.bool)\n ]),\n /**\n * There are two `editable` flags in the table.\n * This is the column-level editable flag and there is\n * also the table-level `editable` flag.\n * These flags determine whether the contents of the table\n * are editable or not.\n * If the column-level `editable` flag is set it overrides\n * the table-level `editable` flag for that column.\n */\n editable: PropTypes.bool,\n /**\n * If true, the user can hide the column by clicking on the `hide`\n * action button on the column. If there are multiple header rows, true\n * will display the action button on each row.\n * If `last`, the `hide` action button will only appear on the last header\n * row. If `first` it will only appear on the first header row. These\n * are respectively shortcut equivalents to `[false, ..., false, true]` and\n * `[true, false, ..., false]`.\n * If there are merged, multi-header columns then you can choose\n * which column header row to display the `hide` action button in by\n * supplying an array of booleans.\n * For example, `[true, false]` will display the `hide` action button\n * on the first row, but not the second row.\n * If the `hide` action button appears on a merged column, then clicking\n * on that button will hide *all* of the merged columns associated with it.\n */\n hideable: PropTypes.oneOfType([\n PropTypes.oneOf(['first', 'last']),\n PropTypes.bool,\n PropTypes.arrayOf(PropTypes.bool)\n ]),\n /**\n * If true, the user can rename the column by clicking on the `rename`\n * action button on the column. If there are multiple header rows, true\n * will display the action button on each row.\n * If `last`, the `rename` action button will only appear on the last header\n * row. If `first` it will only appear on the first header row. These\n * are respectively shortcut equivalents to `[false, ..., false, true]` and\n * `[true, false, ..., false]`.\n * If there are merged, multi-header columns then you can choose\n * which column header row to display the `rename` action button in by\n * supplying an array of booleans.\n * For example, `[true, false]` will display the `rename` action button\n * on the first row, but not the second row.\n * If the `rename` action button appears on a merged column, then clicking\n * on that button will rename *all* of the merged columns associated with it.\n */\n renamable: PropTypes.oneOfType([\n PropTypes.oneOf(['first', 'last']),\n PropTypes.bool,\n PropTypes.arrayOf(PropTypes.bool)\n ]),\n /**\n * There are two `filter_options` props in the table.\n * This is the column-level filter_options prop and there is\n * also the table-level `filter_options` prop.\n * If the column-level `filter_options` prop is set it overrides\n * the table-level `filter_options` prop for that column.\n */\n filter_options: PropTypes.shape({\n /**\n * (default: 'sensitive') Determine whether the applicable filter relational operators will default to `sensitive` or `insensitive` comparison.\n */\n case: PropTypes.oneOf(['sensitive', 'insensitive']),\n /**\n * (default: 'filter data...') The filter cell placeholder text.\n */\n placeholder_text: PropTypes.string\n }),\n /**\n * The formatting applied to the column's data.\n * This prop is derived from the [d3-format](https://github.com/d3/d3-format) library specification. Apart from\n * being structured slightly differently (under a single prop), the usage is the same.\n * See also dash_table.FormatTemplate. It contains helper functions for typical number formats.\n */\n format: PropTypes.exact({\n /**\n * Represents localization specific formatting information.\n * When left unspecified, will use the default value provided by d3-format.\n */\n locale: PropTypes.exact({\n /**\n * (default: ['$', '']). A list of two strings representing the\n * prefix and suffix symbols. Typically used for currency, and implemented using d3's\n * currency format, but you can use this for other symbols such as measurement units\n */\n symbol: PropTypes.arrayOf(PropTypes.string),\n /**\n * (default: '.'). The string used for the decimal separator\n */\n decimal: PropTypes.string,\n /**\n * (default: ','). The string used for the groups separator\n */\n group: PropTypes.string,\n /**\n * (default: [3]). A list of integers representing the grouping pattern. The default is\n * 3 for thousands.\n */\n grouping: PropTypes.arrayOf(PropTypes.number),\n /**\n * A list of ten strings used as replacements for numbers 0-9\n */\n numerals: PropTypes.arrayOf(PropTypes.string),\n /**\n * (default: '%'). The string used for the percentage symbol\n */\n percent: PropTypes.string,\n /**\n * (default: True). Separates integers with 4-digits or less\n */\n separate_4digits: PropTypes.bool\n }),\n /**\n * A value that will be used in place of the nully value during formatting.\n * If the value type matches the column type, it will be formatted normally.\n */\n nully: PropTypes.any,\n /**\n * A number representing the SI unit to use during formatting.\n * See `dash_table.Format.Prefix` enumeration for the list of valid values\n */\n prefix: PropTypes.number,\n /**\n * (default: ''). Represents the d3 rules to apply when formatting the number.\n */\n specifier: PropTypes.string\n }),\n /**\n * The `on_change` behavior of the column for user-initiated modifications.\n */\n on_change: PropTypes.exact({\n /**\n * (default 'coerce'): 'none': do not validate data;\n * 'coerce': check if the data corresponds to the destination type and\n * attempts to coerce it into the destination type if not;\n * 'validate': check if the data corresponds to the destination type (no coercion).\n */\n action: PropTypes.oneOf(['coerce', 'none', 'validate']),\n /**\n * (default 'reject'): What to do with the value if the action fails.\n * 'accept': use the invalid value;\n * 'default': replace the provided value with `validation.default`;\n * 'reject': do not modify the existing value.\n */\n failure: PropTypes.oneOf(['accept', 'default', 'reject'])\n }),\n /**\n * An array of string, number and boolean values that are treated as `null`\n * (i.e. ignored and always displayed last) when sorting.\n * This value overrides the table-level `sort_as_null`.\n */\n sort_as_null: PropTypes.arrayOf(\n PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number,\n PropTypes.bool\n ])\n ),\n /**\n * The `validation` options for user input processing that can accept, reject or apply a\n * default value.\n */\n validation: PropTypes.exact({\n /**\n * Allow the use of nully values. (undefined, null, NaN) (default: False)\n */\n allow_null: PropTypes.bool,\n /**\n * The default value to apply with on_change.failure = 'default'. (default: None)\n */\n default: PropTypes.any,\n /**\n * This is for `datetime` columns only. Allow 2-digit years (default: False).\n * If True, we interpret years as ranging from now-70 to now+29 - in 2019\n * this is 1949 to 2048 but in 2020 it will be different. If used with\n * `action: 'coerce'`, will convert user input to a 4-digit year.\n */\n allow_YY: PropTypes.bool\n })\n })\n ),\n /**\n * If True, then the data in all of the cells is editable.\n * When `editable` is True, particular columns can be made\n * uneditable by setting `editable` to `False` inside the `columns`\n * property.\n * If False, then the data in all of the cells is uneditable.\n * When `editable` is False, particular columns can be made\n * editable by setting `editable` to `True` inside the `columns`\n * property.\n */\n editable: PropTypes.bool,\n /**\n * `fixed_columns` will \"fix\" the set of columns so that\n * they remain visible when scrolling horizontally across\n * the unfixed columns. `fixed_columns` fixes columns\n * from left-to-right.\n * If `headers` is False, no columns are fixed.\n * If `headers` is True, all operation columns (see `row_deletable` and `row_selectable`)\n * are fixed. Additional data columns can be fixed by\n * assigning a number to `data`.\n *\n * Note that fixing columns introduces some changes to the\n * underlying markup of the table and may impact the\n * way that your columns are rendered or sized.\n * View the documentation examples to learn more.\n *\n */\n fixed_columns: PropTypes.exact({\n /**\n * Example `{'headers':False, 'data':0}` No columns are fixed (the default)\n */\n data: PropTypes.number,\n headers: PropTypes.bool\n }),\n /**\n * `fixed_rows` will \"fix\" the set of rows so that\n * they remain visible when scrolling vertically down\n * the table. `fixed_rows` fixes rows\n * from top-to-bottom, starting from the headers.\n * If `headers` is False, no rows are fixed.\n * If `headers` is True, all header and filter rows (see `filter_action`) are\n * fixed. Additional data rows can be fixed by assigning\n * a number to `data`. Note that fixing rows introduces some changes to the\n * underlying markup of the table and may impact the\n * way that your columns are rendered or sized.\n * View the documentation examples to learn more.\n */\n fixed_rows: PropTypes.exact({\n /**\n * Example `{'headers':False, 'data':0}` No rows are fixed (the default)\n */\n data: PropTypes.number,\n headers: PropTypes.bool\n }),\n /**\n * If `single`, then the user can select a single column or group\n * of merged columns via the radio button that will appear in the\n * header rows.\n * If `multi`, then the user can select multiple columns or groups\n * of merged columns via the checkbox that will appear in the header\n * rows.\n * If false, then the user will not be able to select columns and no\n * input will appear in the header rows.\n * When a column is selected, its id will be contained in `selected_columns`\n * and `derived_viewport_selected_columns`.\n */\n column_selectable: PropTypes.oneOf(['single', 'multi', false]),\n /**\n * If True (default), then it is possible to click and navigate\n * table cells.\n */\n cell_selectable: PropTypes.bool,\n /**\n * If `single`, then the user can select a single row\n * via a radio button that will appear next to each row.\n * If `multi`, then the user can select multiple rows\n * via a checkbox that will appear next to each row.\n * If false, then the user will not be able to select rows\n * and no additional UI elements will appear.\n * When a row is selected, its index will be contained\n * in `selected_rows`.\n */\n row_selectable: PropTypes.oneOf(['single', 'multi', false]),\n /**\n * If True, then a `x` will appear next to each `row`\n * and the user can delete the row.\n */\n row_deletable: PropTypes.bool,\n /**\n * The row and column indices and IDs of the currently active cell.\n * `row_id` is only returned if the data rows have an `id` key.\n */\n active_cell: PropTypes.exact({\n row: PropTypes.number,\n column: PropTypes.number,\n row_id: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n column_id: PropTypes.string\n }),\n /**\n * `selected_cells` represents the set of cells that are selected,\n * as an array of objects, each item similar to `active_cell`.\n * Multiple cells can be selected by holding down shift and\n * clicking on a different cell or holding down shift and navigating\n * with the arrow keys.\n */\n selected_cells: PropTypes.arrayOf(\n PropTypes.exact({\n row: PropTypes.number,\n column: PropTypes.number,\n row_id: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n column_id: PropTypes.string\n })\n ),\n /**\n * `selected_rows` contains the indices of rows that\n * are selected via the UI elements that appear when\n * `row_selectable` is `'single'` or `'multi'`.\n */\n selected_rows: PropTypes.arrayOf(PropTypes.number),\n /**\n * `selected_columns` contains the ids of columns that\n * are selected via the UI elements that appear when\n * `column_selectable` is `'single' or 'multi'`.\n */\n selected_columns: PropTypes.arrayOf(PropTypes.string),\n /**\n * `selected_row_ids` contains the ids of rows that\n * are selected via the UI elements that appear when\n * `row_selectable` is `'single'` or `'multi'`.\n */\n selected_row_ids: PropTypes.arrayOf(\n PropTypes.oneOfType([PropTypes.string, PropTypes.number])\n ),\n /**\n * When selecting multiple cells\n * (via clicking on a cell and then shift-clicking on another cell),\n * `start_cell` represents the [row, column] coordinates of the cell\n * in one of the corners of the region.\n * `end_cell` represents the coordinates of the other corner.\n */\n start_cell: PropTypes.exact({\n row: PropTypes.number,\n column: PropTypes.number,\n row_id: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n column_id: PropTypes.string\n }),\n /**\n * When selecting multiple cells\n * (via clicking on a cell and then shift-clicking on another cell),\n * `end_cell` represents the row / column coordinates and IDs of the cell\n * in one of the corners of the region.\n * `start_cell` represents the coordinates of the other corner.\n */\n end_cell: PropTypes.exact({\n row: PropTypes.number,\n column: PropTypes.number,\n row_id: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n column_id: PropTypes.string\n }),\n /**\n * The previous state of `data`. `data_previous`\n * has the same structure as `data` and it will be updated\n * whenever `data` changes, either through a callback or\n * by editing the table.\n * This is a read-only property: setting this property will not\n * have any impact on the table.\n */\n data_previous: PropTypes.arrayOf(PropTypes.object),\n /**\n * List of columns ids of the columns that are currently hidden.\n * See the associated nested prop `columns.hideable`.\n */\n hidden_columns: PropTypes.arrayOf(PropTypes.string),\n /**\n * If True, then the `active_cell` is in a focused state.\n */\n is_focused: PropTypes.bool,\n /**\n * If True, then column headers that have neighbors with duplicate names\n * will be merged into a single cell.\n * This will be applied for single column headers and multi-column\n * headers.\n */\n merge_duplicate_headers: PropTypes.bool,\n /**\n * The unix timestamp when the data was last edited.\n * Use this property with other timestamp properties\n * (such as `n_clicks_timestamp` in `dash_html_components`)\n * to determine which property has changed within a callback.\n */\n data_timestamp: PropTypes.number,\n /**\n * If true, headers are included when copying from the table to different\n * tabs and elsewhere. Note that headers are ignored when copying from the table onto itself and\n * between two tables within the same tab.\n */\n include_headers_on_copy_paste: PropTypes.bool,\n /**\n * Denotes the columns that will be used in the export data file.\n * If `all`, all columns will be used (visible + hidden). If `visible`,\n * only the visible columns will be used. Defaults to `visible`.\n */\n export_columns: PropTypes.oneOf(['all', 'visible']),\n /**\n * Denotes the type of the export data file,\n * Defaults to `'none'`\n */\n export_format: PropTypes.oneOf(['csv', 'xlsx', 'none']),\n /**\n * Denotes the format of the headers in the export data file.\n * If `'none'`, there will be no header. If `'display'`, then the header\n * of the data file will be how it is currently displayed. Note that\n * `'display'` is only supported for `'xlsx'` export_format and will behave\n * like `'names'` for `'csv'` export format. If `'ids'` or `'names'`,\n * then the headers of data file will be the column id or the column\n * names, respectively\n */\n export_headers: PropTypes.oneOf(['none', 'ids', 'names', 'display']),\n /**\n * `page_action` refers to a mode of the table where\n * not all of the rows are displayed at once: only a subset\n * are displayed (a \"page\") and the next subset of rows\n * can viewed by clicking \"Next\" or \"Previous\" buttons\n * at the bottom of the page.\n * Pagination is used to improve performance: instead of\n * rendering all of the rows at once (which can be expensive),\n * we only display a subset of them.\n * With pagination, we can either page through data that exists\n * in the table (e.g. page through `10,000` rows in `data` `100` rows at a time)\n * or we can update the data on-the-fly with callbacks\n * when the user clicks on the \"Previous\" or \"Next\" buttons.\n * These modes can be toggled with this `page_action` parameter:\n * `'native'`: all data is passed to the table up-front, paging logic is\n * handled by the table;\n * `'custom'`: data is passed to the table one page at a time, paging logic\n * is handled via callbacks;\n * `'none'`: disables paging, render all of the data at once.\n */\n page_action: PropTypes.oneOf(['custom', 'native', 'none']),\n /**\n * `page_current` represents which page the user is on.\n * Use this property to index through data in your callbacks with\n * backend paging.\n */\n page_current: PropTypes.number,\n /**\n * `page_count` represents the number of the pages in the\n * paginated table. This is really only useful when performing\n * backend pagination, since the front end is able to use the\n * full size of the table to calculate the number of pages.\n */\n page_count: PropTypes.number,\n /**\n * `page_size` represents the number of rows that will be\n * displayed on a particular page when `page_action` is `'custom'` or `'native'`\n */\n page_size: PropTypes.number,\n /**\n * If `filter_action` is enabled, then the current filtering\n * string is represented in this `filter_query`\n * property.\n */\n filter_query: PropTypes.string,\n /**\n * The `filter_action` property controls the behavior of the `filtering` UI.\n * If `'none'`, then the filtering UI is not displayed.\n * If `'native'`, then the filtering UI is displayed and the filtering\n * logic is handled by the table. That is, it is performed on the data\n * that exists in the `data` property.\n * If `'custom'`, then the filtering UI is displayed but it is the\n * responsibility of the developer to program the filtering\n * through a callback (where `filter_query` or `derived_filter_query_structure` would be the input\n * and `data` would be the output).\n */\n filter_action: PropTypes.oneOfType([\n PropTypes.oneOf(['custom', 'native', 'none']),\n PropTypes.shape({\n type: PropTypes.oneOf(['custom', 'native']).isRequired,\n operator: PropTypes.oneOf(['and', 'or'])\n })\n ]),\n /**\n * There are two `filter_options` props in the table.\n * This is the table-level filter_options prop and there is\n * also the column-level `filter_options` prop.\n * If the column-level `filter_options` prop is set it overrides\n * the table-level `filter_options` prop for that column.\n */\n filter_options: PropTypes.shape({\n /**\n * (default: 'sensitive') Determine whether the applicable filter relational operators will default to `sensitive` or `insensitive` comparison.\n */\n case: PropTypes.oneOf(['sensitive', 'insensitive']),\n /**\n * (default: 'filter data...') The filter cell placeholder text.\n */\n placeholder_text: PropTypes.string\n }),\n /**\n * The `sort_action` property enables data to be\n * sorted on a per-column basis.\n * If `'none'`, then the sorting UI is not displayed.\n * If `'native'`, then the sorting UI is displayed and the sorting\n * logic is handled by the table. That is, it is performed on the data\n * that exists in the `data` property.\n * If `'custom'`, the sorting UI is displayed but it is the\n * responsibility of the developer to program the sorting\n * through a callback (where `sort_by` would be the input and `data`\n * would be the output).\n * Clicking on the sort arrows will update the\n * `sort_by` property.\n */\n sort_action: PropTypes.oneOf(['custom', 'native', 'none']),\n /**\n * Sorting can be performed across multiple columns\n * (e.g. sort by country, sort within each country,\n * sort by year) or by a single column.\n * NOTE - With multi-column sort, it's currently\n * not possible to determine the order in which\n * the columns were sorted through the UI.\n * See [https://github.com/plotly/dash-table/issues/170](https://github.com/plotly/dash-table/issues/170)\n */\n sort_mode: PropTypes.oneOf(['single', 'multi']),\n /**\n * `sort_by` describes the current state\n * of the sorting UI.\n * That is, if the user clicked on the sort arrow\n * of a column, then this property will be updated\n * with the column ID and the direction\n * (`asc` or `desc`) of the sort.\n * For multi-column sorting, this will be a list of\n * sorting parameters, in the order in which they were\n * clicked.\n */\n sort_by: PropTypes.arrayOf(\n PropTypes.exact({\n column_id: PropTypes.string.isRequired,\n direction: PropTypes.oneOf(['asc', 'desc']).isRequired\n })\n ),\n /**\n * An array of string, number and boolean values that are treated as `None`\n * (i.e. ignored and always displayed last) when sorting.\n * This value will be used by columns without `sort_as_null`.\n * Defaults to `[]`.\n */\n sort_as_null: PropTypes.arrayOf(\n PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number,\n PropTypes.bool\n ])\n ),\n /**\n * `dropdown` specifies dropdown options for different columns.\n * Each entry refers to the column ID.\n * The `clearable` property defines whether the value can be deleted.\n * The `options` property refers to the `options` of the dropdown.\n */\n dropdown: PropTypes.objectOf(\n PropTypes.exact({\n clearable: PropTypes.bool,\n options: PropTypes.arrayOf(\n PropTypes.exact({\n label: PropTypes.string.isRequired,\n value: PropTypes.oneOfType([\n PropTypes.number,\n PropTypes.string,\n PropTypes.bool\n ]).isRequired\n })\n ).isRequired\n })\n ),\n /**\n * `dropdown_conditional` specifies dropdown options in various columns and cells.\n * This property allows you to specify different dropdowns\n * depending on certain conditions. For example, you may\n * render different \"city\" dropdowns in a row depending on the\n * current value in the \"state\" column.\n */\n dropdown_conditional: PropTypes.arrayOf(\n PropTypes.exact({\n clearable: PropTypes.bool,\n if: PropTypes.exact({\n column_id: PropTypes.string,\n filter_query: PropTypes.string\n }),\n options: PropTypes.arrayOf(\n PropTypes.exact({\n label: PropTypes.string.isRequired,\n value: PropTypes.oneOfType([\n PropTypes.number,\n PropTypes.string,\n PropTypes.bool\n ]).isRequired\n })\n ).isRequired\n })\n ),\n /**\n * `dropdown_data` specifies dropdown options on a row-by-row, column-by-column basis.\n * Each item in the array corresponds to the corresponding dropdowns for the `data` item\n * at the same index. Each entry in the item refers to the Column ID.\n */\n dropdown_data: PropTypes.arrayOf(\n PropTypes.objectOf(\n PropTypes.exact({\n clearable: PropTypes.bool,\n options: PropTypes.arrayOf(\n PropTypes.exact({\n label: PropTypes.string.isRequired,\n value: PropTypes.oneOfType([\n PropTypes.number,\n PropTypes.string,\n PropTypes.bool\n ]).isRequired\n })\n ).isRequired\n })\n )\n ),\n /**\n * `tooltip` is the column based tooltip configuration applied to all rows. The key is the column\n * id and the value is a tooltip configuration.\n * Example: {i: {'value': i, 'use_with: 'both'} for i in df.columns}\n */\n tooltip: PropTypes.objectOf(\n PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.exact({\n /**\n * Represents the delay in milliseconds before\n * the tooltip is shown when hovering a cell. This overrides\n * the table's `tooltip_delay` property. If set to `None`,\n * the tooltip will be shown immediately.\n */\n delay: PropTypes.number,\n /**\n * represents the duration in milliseconds\n * during which the tooltip is shown when hovering a cell.\n * This overrides the table's `tooltip_duration` property.\n * If set to `None`, the tooltip will not disappear.\n */\n duration: PropTypes.number,\n /**\n * refers to the type of tooltip syntax used\n * for the tooltip generation. Can either be `markdown`\n * or `text`. Defaults to `text`.\n */\n type: PropTypes.oneOf(['text', 'markdown']),\n /**\n * Refers to whether the tooltip will be shown\n * only on data or headers. Can be `both`, `data`, `header`.\n * Defaults to `both`.\n */\n use_with: PropTypes.oneOf(['both', 'data', 'header']),\n /**\n * refers to the syntax-based content of\n * the tooltip. This value is required. Alternatively, the value of the\n * property can also be a plain string. The `text` syntax will be used in\n * that case.\n */\n value: PropTypes.string.isRequired\n })\n ])\n ),\n /**\n * `tooltip_conditional` represents the tooltip shown\n * for different columns and cells.\n * This property allows you to specify different tooltips\n * depending on certain conditions. For example, you may have\n * different tooltips in the same column based on the value\n * of a certain data property.\n * Priority is from first to last defined conditional tooltip\n * in the list. Higher priority (more specific) conditional\n * tooltips should be put at the beginning of the list.\n */\n tooltip_conditional: PropTypes.arrayOf(\n PropTypes.exact({\n /**\n * The `delay` represents the delay in milliseconds before\n * the tooltip is shown when hovering a cell. This overrides\n * the table's `tooltip_delay` property. If set to `None`,\n * the tooltip will be shown immediately.\n */\n delay: PropTypes.number,\n /**\n * The `duration` represents the duration in milliseconds\n * during which the tooltip is shown when hovering a cell.\n * This overrides the table's `tooltip_duration` property.\n * If set to `None`, the tooltip will not disappear.\n */\n duration: PropTypes.number,\n /**\n * The `if` refers to the condition that needs to be fulfilled\n * in order for the associated tooltip configuration to be\n * used. If multiple conditions are defined, all conditions\n * must be met for the tooltip to be used by a cell.\n */\n if: PropTypes.exact({\n /**\n * `column_id` refers to the column ID that must be matched.\n */\n column_id: PropTypes.string,\n /**\n * `filter_query` refers to the query that must evaluate to True.\n */\n filter_query: PropTypes.string,\n /**\n * `row_index` refers to the index of the row in the source `data`.\n */\n row_index: PropTypes.oneOfType([\n PropTypes.number,\n PropTypes.oneOf(['odd', 'even'])\n ])\n }).isRequired,\n /**\n * The `type` refers to the type of tooltip syntax used\n * for the tooltip generation. Can either be `markdown`\n * or `text`. Defaults to `text`.\n */\n type: PropTypes.oneOf(['text', 'markdown']),\n /**\n * The `value` refers to the syntax-based content of the tooltip. This value is required.\n */\n value: PropTypes.string.isRequired\n })\n ),\n /**\n * `tooltip_data` represents the tooltip shown\n * for different columns and cells.\n * A list of dicts for which each key is\n * a column id and the value is a tooltip configuration.\n */\n tooltip_data: PropTypes.arrayOf(\n PropTypes.objectOf(\n PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.exact({\n /**\n * The `delay` represents the delay in milliseconds before\n * the tooltip is shown when hovering a cell. This overrides\n * the table's `tooltip_delay` property. If set to `None`,\n * the tooltip will be shown immediately.\n */\n delay: PropTypes.number,\n /**\n * The `duration` represents the duration in milliseconds\n * during which the tooltip is shown when hovering a cell.\n * This overrides the table's `tooltip_duration` property.\n * If set to `None`, the tooltip will not disappear.\n * Alternatively, the value of the property can also be\n * a plain string. The `text` syntax will be used in\n * that case.\n */\n duration: PropTypes.number,\n /**\n * For each tooltip configuration,\n * The `type` refers to the type of tooltip syntax used\n * for the tooltip generation. Can either be `markdown`\n * or `text`. Defaults to `text`.\n */\n type: PropTypes.oneOf(['text', 'markdown']),\n /**\n * The `value` refers to the syntax-based content of the tooltip. This value is required.\n */\n value: PropTypes.string.isRequired\n })\n ])\n )\n ),\n /**\n * `tooltip_header` represents the tooltip shown\n * for each header column and optionally each header row.\n * Example to show long column names in a tooltip: {i: i for i in df.columns}.\n * Example to show different column names in a tooltip: {'Rep': 'Republican', 'Dem': 'Democrat'}.\n * If the table has multiple rows of headers, then use a list as the value of the\n * `tooltip_header` items.\n *\n *\n */\n tooltip_header: PropTypes.objectOf(\n PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.exact({\n /**\n * The `delay` represents the delay in milliseconds before\n * the tooltip is shown when hovering a cell. This overrides\n * the table's `tooltip_delay` property. If set to `None`,\n * the tooltip will be shown immediately.\n */\n delay: PropTypes.number,\n /**\n * The `duration` represents the duration in milliseconds\n * during which the tooltip is shown when hovering a cell.\n * This overrides the table's `tooltip_duration` property.\n * If set to `None`, the tooltip will not disappear.\n * Alternatively, the value of the property can also be\n * a plain string. The `text` syntax will be used in\n * that case.\n */\n duration: PropTypes.number,\n /**\n * For each tooltip configuration,\n * The `type` refers to the type of tooltip syntax used\n * for the tooltip generation. Can either be `markdown`\n * or `text`. Defaults to `text`.\n */\n type: PropTypes.oneOf(['text', 'markdown']),\n /**\n * The `value` refers to the syntax-based content of the tooltip. This value is required.\n */\n value: PropTypes.string.isRequired\n }),\n PropTypes.arrayOf(\n PropTypes.oneOfType([\n PropTypes.oneOf([null]),\n PropTypes.string,\n PropTypes.exact({\n delay: PropTypes.number,\n duration: PropTypes.number,\n type: PropTypes.oneOf(['text', 'markdown']),\n value: PropTypes.string.isRequired\n })\n ])\n )\n ])\n ),\n /**\n * `tooltip_delay` represents the table-wide delay in milliseconds before\n * the tooltip is shown when hovering a cell. If set to `None`, the tooltip\n * will be shown immediately.\n * Defaults to 350.\n */\n tooltip_delay: PropTypes.number,\n /**\n * `tooltip_duration` represents the table-wide duration in milliseconds\n * during which the tooltip will be displayed when hovering a cell. If\n * set to `None`, the tooltip will not disappear.\n * Defaults to 2000.\n */\n tooltip_duration: PropTypes.number,\n /**\n * The localization specific formatting information applied to all columns in the table.\n * This prop is derived from the [d3.formatLocale](https://github.com/d3/d3-format#formatLocale) data structure specification.\n * When left unspecified, each individual nested prop will default to a pre-determined value.\n */\n locale_format: PropTypes.exact({\n /**\n * (default: ['$', '']). A list of two strings representing the\n * prefix and suffix symbols. Typically used for currency, and implemented using d3's\n * currency format, but you can use this for other symbols such as measurement units.\n */\n symbol: PropTypes.arrayOf(PropTypes.string),\n /**\n * (default: '.'). The string used for the decimal separator.\n */\n decimal: PropTypes.string,\n /**\n * (default: ','). The string used for the groups separator.\n */\n group: PropTypes.string,\n /**\n * (default: [3]). A list of integers representing the grouping pattern.\n */\n grouping: PropTypes.arrayOf(PropTypes.number),\n /**\n * A list of ten strings used as replacements for numbers 0-9.\n */\n numerals: PropTypes.arrayOf(PropTypes.string),\n /**\n * (default: '%'). The string used for the percentage symbol.\n */\n percent: PropTypes.string,\n /**\n * (default: True). Separate integers with 4-digits or less.\n */\n separate_4digits: PropTypes.bool\n }),\n /**\n * If True, then the table will be styled like a list view\n * and not have borders between the columns.\n */\n style_as_list_view: PropTypes.bool,\n /**\n * `fill_width` toggles between a set of CSS for two common behaviors:\n * True: The table container's width will grow to fill the available space;\n * False: The table container's width will equal the width of its content.\n */\n fill_width: PropTypes.bool,\n /**\n * The `markdown_options` property allows customization of the markdown cells behavior.\n */\n markdown_options: PropTypes.exact({\n /**\n * (default: '_blank'). The link's behavior (_blank opens the link in a\n * new tab, _parent opens the link in the parent frame, _self opens the link in the\n * current tab, and _top opens the link in the top frame) or a string\n */\n link_target: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.oneOf(['_blank', '_parent', '_self', '_top'])\n ]),\n /**\n * (default: False) If True, html may be used in markdown cells\n * Be careful enabling html if the content being rendered can come\n * from an untrusted user, as this may create an XSS vulnerability.\n */\n html: PropTypes.bool\n }),\n /**\n * The `css` property is a way to embed CSS selectors and rules\n * onto the page.\n * We recommend starting with the `style_*` properties\n * before using this `css` property.\n * Example:\n * [\n * {\"selector\": \".dash-spreadsheet\", \"rule\": 'font-family: \"monospace\"'}\n * ]\n */\n css: PropTypes.arrayOf(\n PropTypes.exact({\n selector: PropTypes.string.isRequired,\n rule: PropTypes.string.isRequired\n })\n ),\n /**\n * CSS styles to be applied to the outer `table` container.\n * This is commonly used for setting properties like the\n * width or the height of the table.\n */\n style_table: PropTypes.object,\n /**\n * CSS styles to be applied to each individual cell of the table.\n * This includes the header cells, the `data` cells, and the filter\n * cells.\n */\n style_cell: PropTypes.object,\n /**\n * CSS styles to be applied to each individual data cell.\n * That is, unlike `style_cell`, it excludes the header and filter cells.\n */\n style_data: PropTypes.object,\n /**\n * CSS styles to be applied to the filter cells.\n * Note that this may change in the future as we build out a\n * more complex filtering UI.\n */\n style_filter: PropTypes.object,\n /**\n * CSS styles to be applied to each individual header cell.\n * That is, unlike `style_cell`, it excludes the `data` and filter cells.\n */\n style_header: PropTypes.object,\n /**\n * Conditional CSS styles for the cells.\n * This can be used to apply styles to cells on a per-column basis.\n */\n style_cell_conditional: PropTypes.arrayOf(\n PropTypes.shape({\n if: PropTypes.exact({\n column_id: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.arrayOf(PropTypes.string)\n ]),\n column_type: PropTypes.oneOf([\n 'any',\n 'numeric',\n 'text',\n 'datetime'\n ])\n })\n })\n ),\n /**\n * Conditional CSS styles for the data cells.\n * This can be used to apply styles to data cells on a per-column basis.\n */\n style_data_conditional: PropTypes.arrayOf(\n PropTypes.shape({\n if: PropTypes.exact({\n column_id: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.arrayOf(PropTypes.string)\n ]),\n column_type: PropTypes.oneOf([\n 'any',\n 'numeric',\n 'text',\n 'datetime'\n ]),\n filter_query: PropTypes.string,\n state: PropTypes.oneOf(['active', 'selected']),\n row_index: PropTypes.oneOfType([\n PropTypes.number,\n PropTypes.oneOf(['odd', 'even']),\n PropTypes.arrayOf(PropTypes.number)\n ]),\n column_editable: PropTypes.bool\n })\n })\n ),\n /**\n * Conditional CSS styles for the filter cells.\n * This can be used to apply styles to filter cells on a per-column basis.\n */\n style_filter_conditional: PropTypes.arrayOf(\n PropTypes.shape({\n if: PropTypes.exact({\n column_id: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.arrayOf(PropTypes.string)\n ]),\n column_type: PropTypes.oneOf([\n 'any',\n 'numeric',\n 'text',\n 'datetime'\n ]),\n column_editable: PropTypes.bool\n })\n })\n ),\n /**\n * Conditional CSS styles for the header cells.\n * This can be used to apply styles to header cells on a per-column basis.\n */\n style_header_conditional: PropTypes.arrayOf(\n PropTypes.shape({\n if: PropTypes.exact({\n column_id: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.arrayOf(PropTypes.string)\n ]),\n column_type: PropTypes.oneOf([\n 'any',\n 'numeric',\n 'text',\n 'datetime'\n ]),\n header_index: PropTypes.oneOfType([\n PropTypes.number,\n PropTypes.arrayOf(PropTypes.number),\n PropTypes.oneOf(['odd', 'even'])\n ]),\n column_editable: PropTypes.bool\n })\n })\n ),\n /**\n * This property tells the table to use virtualization when rendering.\n * Assumptions are that:\n * the width of the columns is fixed;\n * the height of the rows is always the same; and\n * runtime styling changes will not affect width and height vs. first rendering\n */\n virtualization: PropTypes.bool,\n /**\n * This property represents the current structure of\n * `filter_query` as a tree structure. Each node of the\n * query structure has:\n * type (string; required):\n * 'open-block',\n * 'logical-operator',\n * 'relational-operator',\n * 'unary-operator', or\n * 'expression';\n * subType (string; optional):\n * 'open-block': '()',\n * 'logical-operator': '&&', '||',\n * 'relational-operator': '=', '>=', '>', '<=', '<', '!=', 'contains',\n * 'unary-operator': '!', 'is bool', 'is even', 'is nil', 'is num', 'is object', 'is odd', 'is prime', 'is str',\n * 'expression': 'value', 'field';\n * value (any):\n * 'expression, value': passed value,\n * 'expression, field': the field/prop name.\n * block (nested query structure; optional).\n * left (nested query structure; optional).\n * right (nested query structure; optional).\n * If the query is invalid or empty, the `derived_filter_query_structure` will\n * be `None`.\n */\n derived_filter_query_structure: PropTypes.object,\n /**\n * This property represents the current state of `data`\n * on the current page. This property will be updated\n * on paging, sorting, and filtering.\n */\n derived_viewport_data: PropTypes.arrayOf(PropTypes.object),\n /**\n * `derived_viewport_indices` indicates the order in which the original\n * rows appear after being filtered, sorted, and/or paged.\n * `derived_viewport_indices` contains indices for the current page,\n * while `derived_virtual_indices` contains indices across all pages.\n */\n derived_viewport_indices: PropTypes.arrayOf(PropTypes.number),\n /**\n * `derived_viewport_row_ids` lists row IDs in the order they appear\n * after being filtered, sorted, and/or paged.\n * `derived_viewport_row_ids` contains IDs for the current page,\n * while `derived_virtual_row_ids` contains IDs across all pages.\n */\n derived_viewport_row_ids: PropTypes.arrayOf(\n PropTypes.oneOfType([PropTypes.string, PropTypes.number])\n ),\n /**\n * `derived_viewport_selected_columns` contains the ids of the\n * `selected_columns` that are not currently hidden.\n */\n derived_viewport_selected_columns: PropTypes.arrayOf(PropTypes.string),\n /**\n * `derived_viewport_selected_rows` represents the indices of the\n * `selected_rows` from the perspective of the `derived_viewport_indices`.\n */\n derived_viewport_selected_rows: PropTypes.arrayOf(PropTypes.number),\n /**\n * `derived_viewport_selected_row_ids` represents the IDs of the\n * `selected_rows` on the currently visible page.\n */\n derived_viewport_selected_row_ids: PropTypes.arrayOf(\n PropTypes.oneOfType([PropTypes.string, PropTypes.number])\n ),\n /**\n * This property represents the visible state of `data`\n * across all pages after the front-end sorting and filtering\n * as been applied.\n */\n derived_virtual_data: PropTypes.arrayOf(PropTypes.object),\n /**\n * `derived_virtual_indices` indicates the order in which the original\n * rows appear after being filtered and sorted.\n * `derived_viewport_indices` contains indices for the current page,\n * while `derived_virtual_indices` contains indices across all pages.\n */\n derived_virtual_indices: PropTypes.arrayOf(PropTypes.number),\n /**\n * `derived_virtual_row_ids` indicates the row IDs in the order in which\n * they appear after being filtered and sorted.\n * `derived_viewport_row_ids` contains IDs for the current page,\n * while `derived_virtual_row_ids` contains IDs across all pages.\n */\n derived_virtual_row_ids: PropTypes.arrayOf(\n PropTypes.oneOfType([PropTypes.string, PropTypes.number])\n ),\n /**\n * `derived_virtual_selected_rows` represents the indices of the\n * `selected_rows` from the perspective of the `derived_virtual_indices`.\n */\n derived_virtual_selected_rows: PropTypes.arrayOf(PropTypes.number),\n /**\n * `derived_virtual_selected_row_ids` represents the IDs of the\n * `selected_rows` as they appear after filtering and sorting,\n * across all pages.\n */\n derived_virtual_selected_row_ids: PropTypes.arrayOf(\n PropTypes.oneOfType([PropTypes.string, PropTypes.number])\n ),\n /**\n * The ID of the table.\n */\n id: PropTypes.string,\n /**\n * Dash-assigned callback that gets fired when the user makes changes.\n */\n setProps: PropTypes.func,\n /**\n * Object that holds the loading state object coming from dash-renderer\n */\n loading_state: PropTypes.shape({\n /**\n * Determines if the component is loading or not\n */\n is_loading: PropTypes.bool,\n /**\n * Holds which property is loading\n */\n prop_name: PropTypes.string,\n /**\n * Holds the name of the component that is loading\n */\n component_name: PropTypes.string\n }),\n /**\n * Used to allow user interactions in this component to be persisted when\n * the component - or the page - is refreshed. If `persisted` is truthy and\n * hasn't changed from its previous value, any `persisted_props` that the\n * user has changed while using the app will keep those changes, as long as\n * the new prop value also matches what was given originally.\n * Used in conjunction with `persistence_type` and `persisted_props`.\n */\n persistence: PropTypes.oneOfType([\n PropTypes.bool,\n PropTypes.string,\n PropTypes.number\n ]),\n /**\n * Properties whose user interactions will persist after refreshing the\n * component or the page.\n */\n persisted_props: PropTypes.arrayOf(\n PropTypes.oneOf([\n 'columns.name',\n 'data',\n 'filter_query',\n 'hidden_columns',\n 'page_current',\n 'selected_columns',\n 'selected_rows',\n 'sort_by'\n ])\n ),\n /**\n * Where persisted user changes will be stored:\n * memory: only kept in memory, reset on page refresh.\n * local: window.localStorage, data is kept after the browser quit.\n * session: window.sessionStorage, data is cleared once the browser quit.\n */\n persistence_type: PropTypes.oneOf(['local', 'session', 'memory'])\n};\nDataTable.persistenceTransforms = {\n columns: {\n name: {\n extract: propValue => R.pluck('name', propValue),\n apply: (storedValue, propValue) =>\n R.zipWith(R.assoc('name'), storedValue, propValue)\n }\n }\n};\nDataTable.defaultProps = defaultProps;\nDataTable.propTypes = propTypes;\n","/*! https://mths.be/cssescape v1.5.1 by @mathias | MIT license */\n;(function(root, factory) {\n\t// https://github.com/umdjs/umd/blob/master/returnExports.js\n\tif (typeof exports == 'object') {\n\t\t// For Node.js.\n\t\tmodule.exports = factory(root);\n\t} else if (typeof define == 'function' && define.amd) {\n\t\t// For AMD. Register as an anonymous module.\n\t\tdefine([], factory.bind(root, root));\n\t} else {\n\t\t// For browser globals (not exposing the function separately).\n\t\tfactory(root);\n\t}\n}(typeof global != 'undefined' ? global : this, function(root) {\n\n\tif (root.CSS && root.CSS.escape) {\n\t\treturn root.CSS.escape;\n\t}\n\n\t// https://drafts.csswg.org/cssom/#serialize-an-identifier\n\tvar cssEscape = function(value) {\n\t\tif (arguments.length == 0) {\n\t\t\tthrow new TypeError('`CSS.escape` requires an argument.');\n\t\t}\n\t\tvar string = String(value);\n\t\tvar length = string.length;\n\t\tvar index = -1;\n\t\tvar codeUnit;\n\t\tvar result = '';\n\t\tvar firstCodeUnit = string.charCodeAt(0);\n\t\twhile (++index < length) {\n\t\t\tcodeUnit = string.charCodeAt(index);\n\t\t\t// Note: there’s no need to special-case astral symbols, surrogate\n\t\t\t// pairs, or lone surrogates.\n\n\t\t\t// If the character is NULL (U+0000), then the REPLACEMENT CHARACTER\n\t\t\t// (U+FFFD).\n\t\t\tif (codeUnit == 0x0000) {\n\t\t\t\tresult += '\\uFFFD';\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t// If the character is in the range [\\1-\\1F] (U+0001 to U+001F) or is\n\t\t\t\t// U+007F, […]\n\t\t\t\t(codeUnit >= 0x0001 && codeUnit <= 0x001F) || codeUnit == 0x007F ||\n\t\t\t\t// If the character is the first character and is in the range [0-9]\n\t\t\t\t// (U+0030 to U+0039), […]\n\t\t\t\t(index == 0 && codeUnit >= 0x0030 && codeUnit <= 0x0039) ||\n\t\t\t\t// If the character is the second character and is in the range [0-9]\n\t\t\t\t// (U+0030 to U+0039) and the first character is a `-` (U+002D), […]\n\t\t\t\t(\n\t\t\t\t\tindex == 1 &&\n\t\t\t\t\tcodeUnit >= 0x0030 && codeUnit <= 0x0039 &&\n\t\t\t\t\tfirstCodeUnit == 0x002D\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\t// https://drafts.csswg.org/cssom/#escape-a-character-as-code-point\n\t\t\t\tresult += '\\\\' + codeUnit.toString(16) + ' ';\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t// If the character is the first character and is a `-` (U+002D), and\n\t\t\t\t// there is no second character, […]\n\t\t\t\tindex == 0 &&\n\t\t\t\tlength == 1 &&\n\t\t\t\tcodeUnit == 0x002D\n\t\t\t) {\n\t\t\t\tresult += '\\\\' + string.charAt(index);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If the character is not handled by one of the above rules and is\n\t\t\t// greater than or equal to U+0080, is `-` (U+002D) or `_` (U+005F), or\n\t\t\t// is in one of the ranges [0-9] (U+0030 to U+0039), [A-Z] (U+0041 to\n\t\t\t// U+005A), or [a-z] (U+0061 to U+007A), […]\n\t\t\tif (\n\t\t\t\tcodeUnit >= 0x0080 ||\n\t\t\t\tcodeUnit == 0x002D ||\n\t\t\t\tcodeUnit == 0x005F ||\n\t\t\t\tcodeUnit >= 0x0030 && codeUnit <= 0x0039 ||\n\t\t\t\tcodeUnit >= 0x0041 && codeUnit <= 0x005A ||\n\t\t\t\tcodeUnit >= 0x0061 && codeUnit <= 0x007A\n\t\t\t) {\n\t\t\t\t// the character itself\n\t\t\t\tresult += string.charAt(index);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Otherwise, the escaped character.\n\t\t\t// https://drafts.csswg.org/cssom/#escape-a-character\n\t\t\tresult += '\\\\' + string.charAt(index);\n\n\t\t}\n\t\treturn result;\n\t};\n\n\tif (!root.CSS) {\n\t\troot.CSS = {};\n\t}\n\n\troot.CSS.escape = cssEscape;\n\treturn cssEscape;\n\n}));\n","module.exports = window[\"PropTypes\"];","module.exports = window[\"React\"];","module.exports = window[\"ReactDOM\"];","import _curry3 from \"./internal/_curry3.js\";\nimport assocPath from \"./assocPath.js\";\n\n/**\n * Makes a shallow clone of an object, setting or overriding the specified\n * property with the given value. Note that this copies and flattens prototype\n * properties onto the new object as well. All non-primitive properties are\n * copied by reference.\n *\n * @func\n * @memberOf R\n * @since v0.8.0\n * @category Object\n * @typedefn Idx = String | Int\n * @sig Idx -> a -> {k: v} -> {k: v}\n * @param {String|Number} prop The property name to set\n * @param {*} val The new value\n * @param {Object} obj The object to clone\n * @return {Object} A new object equivalent to the original except for the changed property.\n * @see R.dissoc, R.pick\n * @example\n *\n * R.assoc('c', 3, {a: 1, b: 2}); //=> {a: 1, b: 2, c: 3}\n *\n * R.assoc(4, 3, [1, 2]); //=> [1, 2, undefined, undefined, 3]\n * R.assoc(-1, 3, [1, 2]); //=> [1, 3]\n */\nvar assoc = /*#__PURE__*/_curry3(function assoc(prop, val, obj) {\n return assocPath([prop], val, obj);\n});\nexport default assoc;","import _curry3 from \"./internal/_curry3.js\";\nimport _isInteger from \"./internal/_isInteger.js\";\nimport _assoc from \"./internal/_assoc.js\";\nimport isNil from \"./isNil.js\";\nimport _prop from \"./internal/_prop.js\";\n\n/**\n * Makes a shallow clone of an object, setting or overriding the nodes required\n * to create the given path, and placing the specific value at the tail end of\n * that path. Note that this copies and flattens prototype properties onto the\n * new object as well. All non-primitive properties are copied by reference.\n *\n * @func\n * @memberOf R\n * @since v0.8.0\n * @category Object\n * @typedefn Idx = String | Int | Symbol\n * @sig [Idx] -> a -> {a} -> {a}\n * @param {Array} path the path to set\n * @param {*} val The new value\n * @param {Object} obj The object to clone\n * @return {Object} A new object equivalent to the original except along the specified path.\n * @see R.dissocPath\n * @example\n *\n * R.assocPath(['a', 'b', 'c'], 42, {a: {b: {c: 0}}}); //=> {a: {b: {c: 42}}}\n *\n * // Any missing or non-object keys in path will be overridden\n * R.assocPath(['a', 'b', 'c'], 42, {a: 5}); //=> {a: {b: {c: 42}}}\n * R.assocPath(['a', 1, 'c'], 42, {a: []}); // => {a: [undefined, {c: 42}]}\n * R.assocPath(['a', -1], 42, {a: [1, 2]}); // => {a: [1, 42]}\n */\nvar assocPath = /*#__PURE__*/_curry3(function assocPath(path, val, obj) {\n if (path.length === 0) {\n return val;\n }\n var idx = path[0];\n if (path.length > 1) {\n var nextObj = _prop(idx, obj);\n if (isNil(nextObj) || typeof nextObj !== 'object') {\n nextObj = _isInteger(path[1]) ? [] : {};\n }\n val = assocPath(Array.prototype.slice.call(path, 1), val, nextObj);\n }\n return _assoc(idx, val, obj);\n});\nexport default assocPath;","import _isArray from \"./_isArray.js\";\nimport _isInteger from \"./_isInteger.js\";\n\n/**\n * Makes a shallow clone of an object, setting or overriding the specified\n * property with the given value. Note that this copies and flattens prototype\n * properties onto the new object as well. All non-primitive properties are\n * copied by reference.\n *\n * @private\n * @param {String|Number} prop The property name to set\n * @param {*} val The new value\n * @param {Object|Array} obj The object to clone\n * @return {Object|Array} A new object equivalent to the original except for the changed property.\n */\nexport default function _assoc(prop, val, obj) {\n if (_isInteger(prop) && _isArray(obj)) {\n var _idx = prop < 0 ? obj.length + prop : prop;\n var arr = [].concat(obj);\n arr[_idx] = val;\n return arr;\n }\n var result = {};\n for (var p in obj) {\n result[p] = obj[p];\n }\n result[prop] = val;\n return result;\n}","import _arity from \"./internal/_arity.js\";\nimport _curry1 from \"./internal/_curry1.js\";\nimport _curry2 from \"./internal/_curry2.js\";\nimport _curryN from \"./internal/_curryN.js\";\n\n/**\n * Returns a curried equivalent of the provided function, with the specified\n * arity. The curried function has two unusual capabilities. First, its\n * arguments needn't be provided one at a time. If `g` is `R.curryN(3, f)`, the\n * following are equivalent:\n *\n * - `g(1)(2)(3)`\n * - `g(1)(2, 3)`\n * - `g(1, 2)(3)`\n * - `g(1, 2, 3)`\n *\n * Secondly, the special placeholder value [`R.__`](#__) may be used to specify\n * \"gaps\", allowing partial application of any combination of arguments,\n * regardless of their positions. If `g` is as above and `_` is [`R.__`](#__),\n * the following are equivalent:\n *\n * - `g(1, 2, 3)`\n * - `g(_, 2, 3)(1)`\n * - `g(_, _, 3)(1)(2)`\n * - `g(_, _, 3)(1, 2)`\n * - `g(_, 2)(1)(3)`\n * - `g(_, 2)(1, 3)`\n * - `g(_, 2)(_, 3)(1)`\n *\n * @func\n * @memberOf R\n * @since v0.5.0\n * @category Function\n * @sig Number -> (* -> a) -> (* -> a)\n * @param {Number} length The arity for the returned function.\n * @param {Function} fn The function to curry.\n * @return {Function} A new, curried function.\n * @see R.curry\n * @example\n *\n * const sumArgs = (...args) => R.sum(args);\n *\n * const curriedAddFourNumbers = R.curryN(4, sumArgs);\n * const f = curriedAddFourNumbers(1, 2);\n * const g = f(3);\n * g(4); //=> 10\n */\nvar curryN = /*#__PURE__*/_curry2(function curryN(length, fn) {\n if (length === 1) {\n return _curry1(fn);\n }\n return _arity(length, _curryN(length, [], fn));\n});\nexport default curryN;","export default function _arity(n, fn) {\n /* eslint-disable no-unused-vars */\n switch (n) {\n case 0:\n return function () {\n return fn.apply(this, arguments);\n };\n case 1:\n return function (a0) {\n return fn.apply(this, arguments);\n };\n case 2:\n return function (a0, a1) {\n return fn.apply(this, arguments);\n };\n case 3:\n return function (a0, a1, a2) {\n return fn.apply(this, arguments);\n };\n case 4:\n return function (a0, a1, a2, a3) {\n return fn.apply(this, arguments);\n };\n case 5:\n return function (a0, a1, a2, a3, a4) {\n return fn.apply(this, arguments);\n };\n case 6:\n return function (a0, a1, a2, a3, a4, a5) {\n return fn.apply(this, arguments);\n };\n case 7:\n return function (a0, a1, a2, a3, a4, a5, a6) {\n return fn.apply(this, arguments);\n };\n case 8:\n return function (a0, a1, a2, a3, a4, a5, a6, a7) {\n return fn.apply(this, arguments);\n };\n case 9:\n return function (a0, a1, a2, a3, a4, a5, a6, a7, a8) {\n return fn.apply(this, arguments);\n };\n case 10:\n return function (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) {\n return fn.apply(this, arguments);\n };\n default:\n throw new Error('First argument to _arity must be a non-negative integer no greater than ten');\n }\n}","export default function _arrayReduce(reducer, acc, list) {\n var index = 0;\n var length = list.length;\n while (index < length) {\n acc = reducer(acc, list[index]);\n index += 1;\n }\n return acc;\n}","import _isPlaceholder from \"./_isPlaceholder.js\";\n\n/**\n * Optimized internal one-arity curry function.\n *\n * @private\n * @category Function\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */\nexport default function _curry1(fn) {\n return function f1(a) {\n if (arguments.length === 0 || _isPlaceholder(a)) {\n return f1;\n } else {\n return fn.apply(this, arguments);\n }\n };\n}","import _curry1 from \"./_curry1.js\";\nimport _isPlaceholder from \"./_isPlaceholder.js\";\n\n/**\n * Optimized internal two-arity curry function.\n *\n * @private\n * @category Function\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */\nexport default function _curry2(fn) {\n return function f2(a, b) {\n switch (arguments.length) {\n case 0:\n return f2;\n case 1:\n return _isPlaceholder(a) ? f2 : _curry1(function (_b) {\n return fn(a, _b);\n });\n default:\n return _isPlaceholder(a) && _isPlaceholder(b) ? f2 : _isPlaceholder(a) ? _curry1(function (_a) {\n return fn(_a, b);\n }) : _isPlaceholder(b) ? _curry1(function (_b) {\n return fn(a, _b);\n }) : fn(a, b);\n }\n };\n}","import _curry1 from \"./_curry1.js\";\nimport _curry2 from \"./_curry2.js\";\nimport _isPlaceholder from \"./_isPlaceholder.js\";\n\n/**\n * Optimized internal three-arity curry function.\n *\n * @private\n * @category Function\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */\nexport default function _curry3(fn) {\n return function f3(a, b, c) {\n switch (arguments.length) {\n case 0:\n return f3;\n case 1:\n return _isPlaceholder(a) ? f3 : _curry2(function (_b, _c) {\n return fn(a, _b, _c);\n });\n case 2:\n return _isPlaceholder(a) && _isPlaceholder(b) ? f3 : _isPlaceholder(a) ? _curry2(function (_a, _c) {\n return fn(_a, b, _c);\n }) : _isPlaceholder(b) ? _curry2(function (_b, _c) {\n return fn(a, _b, _c);\n }) : _curry1(function (_c) {\n return fn(a, b, _c);\n });\n default:\n return _isPlaceholder(a) && _isPlaceholder(b) && _isPlaceholder(c) ? f3 : _isPlaceholder(a) && _isPlaceholder(b) ? _curry2(function (_a, _b) {\n return fn(_a, _b, c);\n }) : _isPlaceholder(a) && _isPlaceholder(c) ? _curry2(function (_a, _c) {\n return fn(_a, b, _c);\n }) : _isPlaceholder(b) && _isPlaceholder(c) ? _curry2(function (_b, _c) {\n return fn(a, _b, _c);\n }) : _isPlaceholder(a) ? _curry1(function (_a) {\n return fn(_a, b, c);\n }) : _isPlaceholder(b) ? _curry1(function (_b) {\n return fn(a, _b, c);\n }) : _isPlaceholder(c) ? _curry1(function (_c) {\n return fn(a, b, _c);\n }) : fn(a, b, c);\n }\n };\n}","import _arity from \"./_arity.js\";\nimport _isPlaceholder from \"./_isPlaceholder.js\";\n\n/**\n * Internal curryN function.\n *\n * @private\n * @category Function\n * @param {Number} length The arity of the curried function.\n * @param {Array} received An array of arguments received thus far.\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */\nexport default function _curryN(length, received, fn) {\n return function () {\n var combined = [];\n var argsIdx = 0;\n var left = length;\n var combinedIdx = 0;\n var hasPlaceholder = false;\n while (combinedIdx < received.length || argsIdx < arguments.length) {\n var result;\n if (combinedIdx < received.length && (!_isPlaceholder(received[combinedIdx]) || argsIdx >= arguments.length)) {\n result = received[combinedIdx];\n } else {\n result = arguments[argsIdx];\n argsIdx += 1;\n }\n combined[combinedIdx] = result;\n if (!_isPlaceholder(result)) {\n left -= 1;\n } else {\n hasPlaceholder = true;\n }\n combinedIdx += 1;\n }\n return !hasPlaceholder && left <= 0 ? fn.apply(this, combined) : _arity(Math.max(0, left), _curryN(length, combined, fn));\n };\n}","import _isArray from \"./_isArray.js\";\nimport _isTransformer from \"./_isTransformer.js\";\n\n/**\n * Returns a function that dispatches with different strategies based on the\n * object in list position (last argument). If it is an array, executes [fn].\n * Otherwise, if it has a function with one of the given method names, it will\n * execute that function (functor case). Otherwise, if it is a transformer,\n * uses transducer created by [transducerCreator] to return a new transformer\n * (transducer case).\n * Otherwise, it will default to executing [fn].\n *\n * @private\n * @param {Array} methodNames properties to check for a custom implementation\n * @param {Function} transducerCreator transducer factory if object is transformer\n * @param {Function} fn default ramda implementation\n * @return {Function} A function that dispatches on object in list position\n */\nexport default function _dispatchable(methodNames, transducerCreator, fn) {\n return function () {\n if (arguments.length === 0) {\n return fn();\n }\n var obj = arguments[arguments.length - 1];\n if (!_isArray(obj)) {\n var idx = 0;\n while (idx < methodNames.length) {\n if (typeof obj[methodNames[idx]] === 'function') {\n return obj[methodNames[idx]].apply(obj, Array.prototype.slice.call(arguments, 0, -1));\n }\n idx += 1;\n }\n if (_isTransformer(obj)) {\n var transducer = transducerCreator.apply(null, Array.prototype.slice.call(arguments, 0, -1));\n return transducer(obj);\n }\n }\n return fn.apply(this, arguments);\n };\n}","export default function _isTransformer(obj) {\n return obj != null && typeof obj['@@transducer/step'] === 'function';\n}","export default function _has(prop, obj) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}","/**\n * Tests whether or not an object is an array.\n *\n * @private\n * @param {*} val The object to test.\n * @return {Boolean} `true` if `val` is an array, `false` otherwise.\n * @example\n *\n * _isArray([]); //=> true\n * _isArray(null); //=> false\n * _isArray({}); //=> false\n */\nexport default Array.isArray || function _isArray(val) {\n return val != null && val.length >= 0 && Object.prototype.toString.call(val) === '[object Array]';\n};","/**\n * Determine if the passed argument is an integer.\n *\n * @private\n * @param {*} n\n * @category Type\n * @return {Boolean}\n */\nexport default Number.isInteger || function _isInteger(n) {\n return n << 0 === n;\n};","export default function _isPlaceholder(a) {\n return a != null && typeof a === 'object' && a['@@functional/placeholder'] === true;\n}","export default function _map(fn, functor) {\n var idx = 0;\n var len = functor.length;\n var result = Array(len);\n while (idx < len) {\n result[idx] = fn(functor[idx]);\n idx += 1;\n }\n return result;\n}","export default function _nth(offset, list) {\n var idx = offset < 0 ? list.length + offset : offset;\n return list[idx];\n}","import _isInteger from \"./_isInteger.js\";\nimport _nth from \"./_nth.js\";\nfunction _prop(p, obj) {\n if (obj == null) {\n return;\n }\n return _isInteger(p) ? _nth(p, obj) : obj[p];\n}\nexport default _prop;","export default {\n init: function () {\n return this.xf['@@transducer/init']();\n },\n result: function (result) {\n return this.xf['@@transducer/result'](result);\n }\n};","import _xfBase from \"./_xfBase.js\";\nvar XMap = /*#__PURE__*/function () {\n function XMap(f, xf) {\n this.xf = xf;\n this.f = f;\n }\n XMap.prototype['@@transducer/init'] = _xfBase.init;\n XMap.prototype['@@transducer/result'] = _xfBase.result;\n XMap.prototype['@@transducer/step'] = function (result, input) {\n return this.xf['@@transducer/step'](result, this.f(input));\n };\n return XMap;\n}();\nvar _xmap = function _xmap(f) {\n return function (xf) {\n return new XMap(f, xf);\n };\n};\nexport default _xmap;","import _curry1 from \"./internal/_curry1.js\";\n\n/**\n * Checks if the input value is `null` or `undefined`.\n *\n * @func\n * @memberOf R\n * @since v0.9.0\n * @category Type\n * @sig * -> Boolean\n * @param {*} x The value to test.\n * @return {Boolean} `true` if `x` is `undefined` or `null`, otherwise `false`.\n * @example\n *\n * R.isNil(null); //=> true\n * R.isNil(undefined); //=> true\n * R.isNil(0); //=> false\n * R.isNil([]); //=> false\n */\nvar isNil = /*#__PURE__*/_curry1(function isNil(x) {\n return x == null;\n});\nexport default isNil;","import _has from \"./_has.js\";\nvar toString = Object.prototype.toString;\nvar _isArguments = /*#__PURE__*/function () {\n return toString.call(arguments) === '[object Arguments]' ? function _isArguments(x) {\n return toString.call(x) === '[object Arguments]';\n } : function _isArguments(x) {\n return _has('callee', x);\n };\n}();\nexport default _isArguments;","import _curry1 from \"./internal/_curry1.js\";\nimport _has from \"./internal/_has.js\";\nimport _isArguments from \"./internal/_isArguments.js\";\n\n// cover IE < 9 keys issues\nvar hasEnumBug = ! /*#__PURE__*/{\n toString: null\n}.propertyIsEnumerable('toString');\nvar nonEnumerableProps = ['constructor', 'valueOf', 'isPrototypeOf', 'toString', 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];\n// Safari bug\nvar hasArgsEnumBug = /*#__PURE__*/function () {\n 'use strict';\n\n return arguments.propertyIsEnumerable('length');\n}();\nvar contains = function contains(list, item) {\n var idx = 0;\n while (idx < list.length) {\n if (list[idx] === item) {\n return true;\n }\n idx += 1;\n }\n return false;\n};\n\n/**\n * Returns a list containing the names of all the enumerable own properties of\n * the supplied object.\n * Note that the order of the output array is not guaranteed to be consistent\n * across different JS platforms.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category Object\n * @sig {k: v} -> [k]\n * @param {Object} obj The object to extract properties from\n * @return {Array} An array of the object's own properties.\n * @see R.keysIn, R.values, R.toPairs\n * @example\n *\n * R.keys({a: 1, b: 2, c: 3}); //=> ['a', 'b', 'c']\n */\nvar keys = typeof Object.keys === 'function' && !hasArgsEnumBug ? /*#__PURE__*/_curry1(function keys(obj) {\n return Object(obj) !== obj ? [] : Object.keys(obj);\n}) : /*#__PURE__*/_curry1(function keys(obj) {\n if (Object(obj) !== obj) {\n return [];\n }\n var prop, nIdx;\n var ks = [];\n var checkArgsLength = hasArgsEnumBug && _isArguments(obj);\n for (prop in obj) {\n if (_has(prop, obj) && (!checkArgsLength || prop !== 'length')) {\n ks[ks.length] = prop;\n }\n }\n if (hasEnumBug) {\n nIdx = nonEnumerableProps.length - 1;\n while (nIdx >= 0) {\n prop = nonEnumerableProps[nIdx];\n if (_has(prop, obj) && !contains(ks, prop)) {\n ks[ks.length] = prop;\n }\n nIdx -= 1;\n }\n }\n return ks;\n});\nexport default keys;","import _arrayReduce from \"./internal/_arrayReduce.js\";\nimport _curry2 from \"./internal/_curry2.js\";\nimport _dispatchable from \"./internal/_dispatchable.js\";\nimport _map from \"./internal/_map.js\";\nimport _xmap from \"./internal/_xmap.js\";\nimport curryN from \"./curryN.js\";\nimport keys from \"./keys.js\";\n\n/**\n * Takes a function and\n * a [functor](https://github.com/fantasyland/fantasy-land#functor),\n * applies the function to each of the functor's values, and returns\n * a functor of the same shape.\n *\n * Ramda provides suitable `map` implementations for `Array` and `Object`,\n * so this function may be applied to `[1, 2, 3]` or `{x: 1, y: 2, z: 3}`.\n *\n * Dispatches to the `map` method of the second argument, if present.\n *\n * Acts as a transducer if a transformer is given in list position.\n *\n * Also treats functions as functors and will compose them together.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig Functor f => (a -> b) -> f a -> f b\n * @param {Function} fn The function to be called on every element of the input `list`.\n * @param {Array} list The list to be iterated over.\n * @return {Array} The new list.\n * @see R.transduce, R.addIndex, R.pluck, R.project\n * @example\n *\n * const double = x => x * 2;\n *\n * R.map(double, [1, 2, 3]); //=> [2, 4, 6]\n *\n * R.map(double, {x: 1, y: 2, z: 3}); //=> {x: 2, y: 4, z: 6}\n * @symb R.map(f, [a, b]) = [f(a), f(b)]\n * @symb R.map(f, { x: a, y: b }) = { x: f(a), y: f(b) }\n * @symb R.map(f, functor_o) = functor_o.map(f)\n */\nvar map = /*#__PURE__*/_curry2( /*#__PURE__*/_dispatchable(['fantasy-land/map', 'map'], _xmap, function map(fn, functor) {\n switch (Object.prototype.toString.call(functor)) {\n case '[object Function]':\n return curryN(functor.length, function () {\n return fn.call(this, functor.apply(this, arguments));\n });\n case '[object Object]':\n return _arrayReduce(function (acc, key) {\n acc[key] = fn(functor[key]);\n return acc;\n }, {}, keys(functor));\n default:\n return _map(fn, functor);\n }\n}));\nexport default map;","import _arity from \"./internal/_arity.js\";\nimport _curry1 from \"./internal/_curry1.js\";\n\n/**\n * Accepts a function `fn` and returns a function that guards invocation of\n * `fn` such that `fn` can only ever be called once, no matter how many times\n * the returned function is invoked. The first value calculated is returned in\n * subsequent invocations.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category Function\n * @sig (a... -> b) -> (a... -> b)\n * @param {Function} fn The function to wrap in a call-only-once wrapper.\n * @return {Function} The wrapped function.\n * @example\n *\n * const addOneOnce = R.once(x => x + 1);\n * addOneOnce(10); //=> 11\n * addOneOnce(addOneOnce(50)); //=> 11\n */\nvar once = /*#__PURE__*/_curry1(function once(fn) {\n var called = false;\n var result;\n return _arity(fn.length, function () {\n if (called) {\n return result;\n }\n called = true;\n result = fn.apply(this, arguments);\n return result;\n });\n});\nexport default once;","import _curry2 from \"./internal/_curry2.js\";\nimport map from \"./map.js\";\nimport prop from \"./prop.js\";\n\n/**\n * Returns a new list by plucking the same named property off all objects in\n * the list supplied.\n *\n * `pluck` will work on\n * any [functor](https://github.com/fantasyland/fantasy-land#functor) in\n * addition to arrays, as it is equivalent to `R.map(R.prop(k), f)`.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig Functor f => k -> f {k: v} -> f v\n * @param {Number|String} key The key name to pluck off of each object.\n * @param {Array} f The array or functor to consider.\n * @return {Array} The list of values for the given key.\n * @see R.project, R.prop, R.props\n * @example\n *\n * var getAges = R.pluck('age');\n * getAges([{name: 'fred', age: 29}, {name: 'wilma', age: 27}]); //=> [29, 27]\n *\n * R.pluck(0, [[1, 2], [3, 4]]); //=> [1, 3]\n * R.pluck('val', {a: {val: 3}, b: {val: 5}}); //=> {a: 3, b: 5}\n * @symb R.pluck('x', [{x: 1, y: 2}, {x: 3, y: 4}, {x: 5, y: 6}]) = [1, 3, 5]\n * @symb R.pluck(0, [[1, 2], [3, 4], [5, 6]]) = [1, 3, 5]\n */\nvar pluck = /*#__PURE__*/_curry2(function pluck(p, list) {\n return map(prop(p), list);\n});\nexport default pluck;","import _curry2 from \"./internal/_curry2.js\";\nimport _prop from \"./internal/_prop.js\";\n\n/**\n * Returns a function that when supplied an object returns the indicated\n * property of that object, if it exists.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category Object\n * @typedefn Idx = String | Int | Symbol\n * @sig Idx -> {s: a} -> a | Undefined\n * @param {String|Number} p The property name or array index\n * @param {Object} obj The object to query\n * @return {*} The value at `obj.p`.\n * @see R.path, R.props, R.pluck, R.project, R.nth\n * @example\n *\n * R.prop('x', {x: 100}); //=> 100\n * R.prop('x', {}); //=> undefined\n * R.prop(0, [100]); //=> 100\n * R.compose(R.inc, R.prop('x'))({ x: 3 }) //=> 4\n */\n\nvar prop = /*#__PURE__*/_curry2(_prop);\nexport default prop;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// wrap a concatenated module body as a lazy, memoized accessor; mod is\n// set before the body runs so re-entrant calls (require cycles) observe\n// the partial exports like Node.js\n__webpack_require__.cw = function(body) {\n\tvar mod;\n\treturn function() {\n\t\tif (body) {\n\t\t\tvar fn = body;\n\t\t\tbody = 0;\n\t\t\tmod = { exports: {} };\n\t\t\tfn.call(mod.exports, mod, mod.exports);\n\t\t}\n\t\treturn mod.exports;\n\t};\n};","// define getter/value functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tif(Array.isArray(definition)) {\n\t\tvar i = 0;\n\t\twhile(i < definition.length) {\n\t\t\tvar key = definition[i++];\n\t\t\tvar binding = definition[i++];\n\t\t\tvar descriptor = binding === 0 ? { enumerable: true, value: definition[i++] } : { enumerable: true, get: binding };\n\t\t\tif(!__webpack_require__.o(exports, key)) Object.defineProperty(exports, key, descriptor);\n\t\t}\n\t} else {\n\t\tfor(var key in definition) {\n\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t\t}\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = function(chunkId) {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce(function(promises, key) {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = function(chunkId) { return {\"214\":\"async-table\",\"254\":\"async-highlight\",\"404\":\"async-export\"}[chunkId] + \".js\"; };","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); };","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT')\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && (!scriptUrl || !/^https?:/.test(scriptUrl))) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/^blob:|[?#].*$/g, \"\").replace(/\\/[^/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","var getCurrentScript = function() {\n var script = document.currentScript;\n if (!script) {\n /* Shim for IE11 and below */\n /* Do not take into account async scripts and inline scripts */\n\n var doc_scripts = document.getElementsByTagName('script');\n var scripts = [];\n\n for (var i = 0; i < doc_scripts.length; i++) {\n scripts.push(doc_scripts[i]);\n }\n\n scripts = scripts.filter(function(s) { return !s.async && !s.text && !s.textContent; });\n script = scripts.slice(-1)[0];\n }\n\n return script;\n};\n\nvar isLocalScript = function(script) {\n return /\\/_dash-component-suites\\//.test(script.src);\n};\n\nObject.defineProperty(__webpack_require__, 'p', {\n get: (function () {\n var script = getCurrentScript();\n\n var url = script.src.split('/').slice(0, -1).join('/') + '/';\n\n return function() {\n return url;\n };\n })()\n});\n\nif (typeof jsonpScriptSrc !== 'undefined') {\n var __jsonpScriptSrc__ = jsonpScriptSrc;\n jsonpScriptSrc = function(chunkId) {\n var script = getCurrentScript();\n var isLocal = isLocalScript(script);\n\n var src = __jsonpScriptSrc__(chunkId);\n\n if(!isLocal) {\n return src;\n }\n\n var srcFragments = src.split('/');\n var fileFragments = srcFragments.slice(-1)[0].split('.');\n\n fileFragments.splice(1, 0, \"v7_5_1m1792087471\");\n srcFragments.splice(-1, 1, fileFragments.join('.'))\n\n return srcFragments.join('/');\n };\n}\n","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t23: 0\n};\n\n__webpack_require__.f.j = function(chunkId, promises) {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise(function(resolve, reject) { installedChunkData = installedChunks[chunkId] = [resolve, reject]; });\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = function(event) {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\terror.event = event;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(__webpack_require__.p + __webpack_require__.u(chunkId), loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkdash_table\"] = self[\"webpackChunkdash_table\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;","import 'css.escape'; // polyfill\nimport Environment from 'core/environment';\nimport Logger from 'core/Logger';\nimport DataTable from 'dash-table/dash/DataTable';\nLogger.setDebugLevel(Environment.debugLevel);\nLogger.setLogLevel(Environment.logLevel);\nexport { DataTable };\n"],"names":["inProgress","dataWebpackPrefix","e","window","module","exports","__webpack_require__","n","t","r","o","i","l","call","m","c","d","Object","defineProperty","enumerable","get","Symbol","toStringTag","value","__esModule","create","bind","default","prototype","hasOwnProperty","p","s","u","a","done","Promise","resolve","then","this","arguments","apply","isReady","lazy","setTimeout","regeneratorRuntime","mark","wrap","prev","next","stop","_dashprivate_isLazyComponentReady","f","length","configurable","writable","key","TypeError","dispatchEvent","CustomEvent","addEventListener","removeEventListener","DebugLevel","LogLevel","Logger_DebugLevel","Logger_LogLevel","LogString","TRACE","INFO","WARNING","ERROR","FATAL","NONE","DEBUG","__logLevel","__debugLevel","logFn","level","currentLevel","fn","console","log","warn","error","Error","concat","prefix","toUpperCase","logger","setDebugLevel","setLogLevel","defineProperties","trace","info","warning","fatal","debug","freeze","Logger","CookieStorage","_classCallCheck","id","domain","undefined","path","enabled","expires","Date","now","toUTCString","document","cookie","toLowerCase","split","map","fragments","trim","find","toLocaleLowerCase","entry","delete","R","ret","indexOf","DASH_DEBUG","DASH_LOG","Environment","_createClass","URL","constructor","location","href","searchParams","_activeEdge","_supportsCssVariables","_Environment","_defineProperty","Boolean","_window$CSS","CSS","_window$CSS$supports","supports","LazyLoader","hljs","result","all","es_zipWith","A","b","len","Math","min","rv","Array","idx","DataTable","_Component","_callSuper","_inherits","React","Suspense","fallback","RealDataTable","props","Component","asyncDecorator","table","propTypes","data","PropTypes","columns","isRequired","name","type","presentation","selectable","clearable","deletable","editable","hideable","renamable","filter_options","case","placeholder_text","format","locale","symbol","decimal","group","grouping","numerals","percent","separate_4digits","nully","specifier","on_change","action","failure","sort_as_null","validation","allow_null","allow_YY","fixed_columns","headers","fixed_rows","column_selectable","cell_selectable","row_selectable","row_deletable","active_cell","row","column","row_id","column_id","selected_cells","selected_rows","selected_columns","selected_row_ids","start_cell","end_cell","data_previous","hidden_columns","is_focused","merge_duplicate_headers","data_timestamp","include_headers_on_copy_paste","export_columns","export_format","export_headers","page_action","page_current","page_count","page_size","filter_query","filter_action","operator","sort_action","sort_mode","sort_by","direction","dropdown","options","label","dropdown_conditional","if","dropdown_data","tooltip","delay","duration","use_with","tooltip_conditional","row_index","tooltip_data","tooltip_header","tooltip_delay","tooltip_duration","locale_format","style_as_list_view","fill_width","markdown_options","link_target","html","css","selector","rule","style_table","style_cell","style_data","style_filter","style_header","style_cell_conditional","column_type","style_data_conditional","state","column_editable","style_filter_conditional","style_header_conditional","header_index","virtualization","derived_filter_query_structure","derived_viewport_data","derived_viewport_indices","derived_viewport_row_ids","derived_viewport_selected_columns","derived_viewport_selected_rows","derived_viewport_selected_row_ids","derived_virtual_data","derived_virtual_indices","derived_virtual_row_ids","derived_virtual_selected_rows","derived_virtual_selected_row_ids","setProps","loading_state","is_loading","prop_name","component_name","persistence","persisted_props","persistence_type","persistenceTransforms","extract","propValue","storedValue","defaultProps","root","g","escape","cssEscape","codeUnit","string","String","index","firstCodeUnit","charCodeAt","toString","charAt","factory","assoc","_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__","prop","val","obj","_assocPath_js__WEBPACK_IMPORTED_MODULE_1__","__webpack_exports__","es_assocPath","_curry3","assocPath","nextObj","_prop","isNil","_isInteger","slice","_isArray","_idx","arr","_assoc","curryN","_internal_curry2_js__WEBPACK_IMPORTED_MODULE_2__","_internal_curry1_js__WEBPACK_IMPORTED_MODULE_1__","_internal_arity_js__WEBPACK_IMPORTED_MODULE_0__","_internal_curryN_js__WEBPACK_IMPORTED_MODULE_3__","_arity","a0","a1","a2","a3","a4","a5","a6","a7","a8","a9","_arrayReduce","reducer","acc","list","_curry1","f1","_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_0__","_curry2","f2","_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_1__","_curry1_js__WEBPACK_IMPORTED_MODULE_0__","_b","_a","f3","_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_2__","_curry2_js__WEBPACK_IMPORTED_MODULE_1__","_c","_curryN","received","combined","argsIdx","left","combinedIdx","hasPlaceholder","_arity_js__WEBPACK_IMPORTED_MODULE_0__","max","_dispatchable","methodNames","transducerCreator","_isTransformer","transducer","_has","isArray","Number","isInteger","_isPlaceholder","_map","functor","_nth","offset","_isInteger_js__WEBPACK_IMPORTED_MODULE_0__","_nth_js__WEBPACK_IMPORTED_MODULE_1__","init","xf","XMap","_xfBase_js__WEBPACK_IMPORTED_MODULE_0__","input","x","_isArguments_toString","_isArguments","internal_isArguments","hasEnumBug","propertyIsEnumerable","nonEnumerableProps","hasArgsEnumBug","contains","item","es_keys","keys","nIdx","ks","checkArgsLength","_internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__","_internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_2__","_internal_xmap_js__WEBPACK_IMPORTED_MODULE_4__","_curryN_js__WEBPACK_IMPORTED_MODULE_5__","_internal_arrayReduce_js__WEBPACK_IMPORTED_MODULE_0__","_keys_js__WEBPACK_IMPORTED_MODULE_6__","_internal_map_js__WEBPACK_IMPORTED_MODULE_3__","once","called","pluck","_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__","_map_js__WEBPACK_IMPORTED_MODULE_1__","_prop_js__WEBPACK_IMPORTED_MODULE_2__","_internal_prop_js__WEBPACK_IMPORTED_MODULE_1__","__webpack_module_cache__","moduleId","cachedModule","__webpack_modules__","getter","cw","body","mod","definition","binding","descriptor","chunkId","reduce","promises","globalThis","Function","url","push","script","needAttach","scripts","getElementsByTagName","getAttribute","createElement","charset","nc","setAttribute","src","onScriptComplete","event","onerror","onload","clearTimeout","timeout","doneFns","parentNode","removeChild","forEach","target","head","appendChild","scriptUrl","importScripts","currentScript","tagName","test","replace","getCurrentScript","doc_scripts","filter","async","text","textContent","join","jsonpScriptSrc","__jsonpScriptSrc__","isLocal","srcFragments","fileFragments","splice","installedChunks","j","installedChunkData","promise","reject","errorType","realSrc","message","request","webpackJsonpCallback","parentChunkLoadingFunction","chunkIds","moreModules","runtime","some","chunkLoadingGlobal","self","debugLevel","logLevel"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"bundle.js","mappings":"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","sources":["webpack://dash_table/webpack/runtime/load script","webpack://dash_table/./node_modules/@plotly/dash-component-plugins/dist/index.js","webpack://dash_table/./src/core/Logger/DebugLevel.ts","webpack://dash_table/./src/core/Logger/LogLevel.ts","webpack://dash_table/./src/core/Logger/index.ts","webpack://dash_table/./src/core/storage/Cookie.ts","webpack://dash_table/./src/core/environment/index.ts","webpack://dash_table/./src/dash-table/LazyLoader.ts","webpack://dash_table/./node_modules/ramda/es/zipWith.js","webpack://dash_table/./src/dash-table/dash/DataTable.js","webpack://dash_table/./node_modules/css.escape/css.escape.js","webpack://dash_table/external window \"PropTypes\"","webpack://dash_table/external window \"React\"","webpack://dash_table/external window \"ReactDOM\"","webpack://dash_table/./node_modules/ramda/es/assoc.js","webpack://dash_table/./node_modules/ramda/es/assocPath.js","webpack://dash_table/./node_modules/ramda/es/internal/_assoc.js","webpack://dash_table/./node_modules/ramda/es/curryN.js","webpack://dash_table/./node_modules/ramda/es/internal/_arity.js","webpack://dash_table/./node_modules/ramda/es/internal/_arrayReduce.js","webpack://dash_table/./node_modules/ramda/es/internal/_curry1.js","webpack://dash_table/./node_modules/ramda/es/internal/_curry2.js","webpack://dash_table/./node_modules/ramda/es/internal/_curry3.js","webpack://dash_table/./node_modules/ramda/es/internal/_curryN.js","webpack://dash_table/./node_modules/ramda/es/internal/_dispatchable.js","webpack://dash_table/./node_modules/ramda/es/internal/_isTransformer.js","webpack://dash_table/./node_modules/ramda/es/internal/_has.js","webpack://dash_table/./node_modules/ramda/es/internal/_isArray.js","webpack://dash_table/./node_modules/ramda/es/internal/_isInteger.js","webpack://dash_table/./node_modules/ramda/es/internal/_isPlaceholder.js","webpack://dash_table/./node_modules/ramda/es/internal/_map.js","webpack://dash_table/./node_modules/ramda/es/internal/_nth.js","webpack://dash_table/./node_modules/ramda/es/internal/_prop.js","webpack://dash_table/./node_modules/ramda/es/internal/_xfBase.js","webpack://dash_table/./node_modules/ramda/es/internal/_xmap.js","webpack://dash_table/./node_modules/ramda/es/isNil.js","webpack://dash_table/./node_modules/ramda/es/internal/_isArguments.js","webpack://dash_table/./node_modules/ramda/es/keys.js","webpack://dash_table/./node_modules/ramda/es/map.js","webpack://dash_table/./node_modules/ramda/es/once.js","webpack://dash_table/./node_modules/ramda/es/pluck.js","webpack://dash_table/./node_modules/ramda/es/prop.js","webpack://dash_table/webpack/bootstrap","webpack://dash_table/webpack/runtime/compat get default export","webpack://dash_table/webpack/runtime/concatenation wrap","webpack://dash_table/webpack/runtime/define property getters","webpack://dash_table/webpack/runtime/ensure chunk","webpack://dash_table/webpack/runtime/get javascript chunk filename","webpack://dash_table/webpack/runtime/global","webpack://dash_table/webpack/runtime/hasOwnProperty shorthand","webpack://dash_table/webpack/runtime/make namespace object","webpack://dash_table/webpack/runtime/publicPath","webpack://dash_table/webpack/runtime/compat","webpack://dash_table/webpack/runtime/jsonp chunk loading","webpack://dash_table/webpack/runtime/nonce","webpack://dash_table/./src/dash-table/index.ts"],"sourcesContent":["var inProgress = {};\nvar dataWebpackPrefix = \"dash_table:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = function(url, done, key, chunkId) {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = function(prev, event) {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach(function(fn) { return fn(event); });\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","!function(e,n){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=n(require(\"react\")):\"function\"==typeof define&&define.amd?define([\"react\"],n):\"object\"==typeof exports?exports[\"dash-component-plugins\"]=n(require(\"react\")):e[\"dash-component-plugins\"]=n(e.React)}(window,(function(e){return function(e){var n={};function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}return t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{enumerable:!0,get:r})},t.r=function(e){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},t.t=function(e,n){if(1&n&&(e=t(e)),8&n)return e;if(4&n&&\"object\"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(t.r(r),Object.defineProperty(r,\"default\",{enumerable:!0,value:e}),2&n&&\"string\"!=typeof e)for(var o in e)t.d(r,o,function(n){return e[n]}.bind(null,o));return r},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,\"a\",n),n},t.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},t.p=\"\",t(t.s=1)}([function(n,t){n.exports=e},function(e,n,t){\"use strict\";t.r(n),t.d(n,\"asyncDecorator\",(function(){return u})),t.d(n,\"inheritAsyncDecorator\",(function(){return a})),t.d(n,\"isReady\",(function(){return c})),t.d(n,\"History\",(function(){return d}));var r=t(0);function o(e,n,t,r,o,i,u){try{var a=e[i](u),c=a.value}catch(e){return void t(e)}a.done?n(c):Promise.resolve(c).then(r,o)}function i(e){return function(){var n=this,t=arguments;return new Promise((function(r,i){var u=e.apply(n,t);function a(e){o(u,r,i,a,c,\"next\",e)}function c(e){o(u,r,i,a,c,\"throw\",e)}a(void 0)}))}}var u=function(e,n){var t,o={isReady:new Promise((function(e){t=e})),get:Object(r.lazy)((function(){return Promise.resolve(n()).then((function(e){return setTimeout(i(regeneratorRuntime.mark((function e(){return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t(!0);case 2:o.isReady=!0;case 3:case\"end\":return e.stop()}}),e)}))),0),e}))}))};return Object.defineProperty(e,\"_dashprivate_isLazyComponentReady\",{get:function(){return o.isReady}}),o.get},a=function(e,n){Object.defineProperty(e,\"_dashprivate_isLazyComponentReady\",{get:function(){return c(n)}})},c=function(e){return e&&e._dashprivate_isLazyComponentReady};function f(e,n){for(var t=0;t { };\n }\n let fn;\n let fnStyle = '';\n switch (level) {\n case LogLevel.TRACE:\n case LogLevel.INFO:\n fn = window.console.log;\n fnStyle = 'color: white; background-color: #3166A2;';\n break;\n case DebugLevel.DEBUG:\n case LogLevel.WARNING:\n fn = window.console.warn;\n fnStyle = 'color: white; background-color: #E9B606;';\n break;\n case LogLevel.ERROR:\n case LogLevel.FATAL:\n fn = window.console.error;\n fnStyle = 'color: white; background-color: #FF0000;';\n break;\n default:\n throw new Error(`Unknown log ${level}`);\n }\n const prefix = `${fnStyle && __highlightPrefix ? '%c' : ''}[${LogString[level].toUpperCase()}]`;\n if (fnStyle && __highlightPrefix) {\n return fn.bind(window.console, prefix, fnStyle);\n }\n else {\n return fn.bind(window.console, prefix);\n }\n}\nconst logger = {\n setDebugLevel(level) {\n __debugLevel = level;\n },\n setLogLevel(level) {\n __logLevel = level;\n }\n};\nObject.defineProperties(logger, {\n trace: {\n get: () => {\n return logFn(LogLevel.TRACE, __logLevel);\n },\n configurable: false,\n enumerable: false\n },\n info: {\n get: () => {\n return logFn(LogLevel.INFO, __logLevel);\n },\n configurable: false,\n enumerable: false\n },\n warning: {\n get: () => {\n return logFn(LogLevel.WARNING, __logLevel);\n },\n configurable: false,\n enumerable: false\n },\n error: {\n get: () => {\n return logFn(LogLevel.ERROR, __logLevel);\n },\n configurable: false,\n enumerable: false\n },\n fatal: {\n get: () => {\n return logFn(LogLevel.FATAL, __logLevel);\n },\n configurable: false,\n enumerable: false\n },\n debug: {\n get: () => {\n return logFn(DebugLevel.DEBUG, __debugLevel);\n },\n configurable: false,\n enumerable: false\n }\n});\nObject.freeze(logger);\nexport default logger;\nexport { DebugLevel, LogLevel };\n","import * as R from 'ramda';\nconst __1day = 86400 * 1000;\nconst __20years = 86400 * 1000 * 365 * 20;\nexport default class CookieStorage {\n // From https://github.com/Modernizr/Modernizr/blob/f4d3aa0b3c9eeb7338e8d89ed77929a8e969c502/feature-detects/cookies.js#L1\n // try..catch because some in situations `document.cookie` is exposed but throws a\n // SecurityError if you try to access it; e.g. documents created from data URIs\n // or in sandboxed iframes (depending on flags/context)\n static enabled = R.once(() => {\n try {\n // Create cookie\n document.cookie = 'cookietest=1';\n const ret = document.cookie.indexOf('cookietest=') !== -1;\n // Delete cookie\n document.cookie =\n 'cookietest=1; expires=Thu, 01-Jan-1970 00:00:01 GMT';\n return ret;\n }\n catch (e) {\n return false;\n }\n });\n static delete(id, domain = '', path = '/') {\n if (!CookieStorage.enabled()) {\n return;\n }\n const expires = new Date(Date.now() - __1day).toUTCString();\n document.cookie = `${id}=;expires=${expires};domain=${domain};path=${path}`;\n }\n static get(id) {\n if (!id.length) {\n return;\n }\n if (!CookieStorage.enabled()) {\n return;\n }\n id = id.toLowerCase();\n const cookies = document.cookie.split(';').map(cookie => {\n const fragments = cookie.split('=');\n return {\n id: fragments[0].trim(),\n value: fragments[1]\n };\n });\n return (cookies.find(cookie => id === cookie.id.toLocaleLowerCase()) ||\n {}).value;\n }\n static set(id, value, domain = '', path = '/') {\n if (!CookieStorage.enabled()) {\n return;\n }\n const expires = new Date(Date.now() + __20years).toUTCString();\n const entry = `${id}=${value};expires=${expires};domain=${domain};path=${path}`;\n if (CookieStorage.get(id)) {\n CookieStorage.delete(id, domain, path);\n }\n document.cookie = entry;\n }\n}\n","import CookieStorage from 'core/storage/Cookie';\nimport { DebugLevel, LogLevel } from 'core/Logger';\nconst DASH_DEBUG = 'dash_debug';\nconst DASH_LOG = 'dash_log';\nexport default class Environment {\n static _supportsCssVariables = Boolean(window.CSS?.supports?.('.some-selector', 'var(--some-var)'));\n static _activeEdge = Environment._supportsCssVariables\n ? '1px solid var(--accent)'\n : '1px solid hotpink';\n static get searchParams() {\n return ((typeof URL !== 'undefined' &&\n URL.prototype &&\n URL.prototype.constructor &&\n new URL(window.location.href).searchParams) || { get: () => null });\n }\n static get debugLevel() {\n const debug = this.searchParams.get(DASH_DEBUG) || CookieStorage.get(DASH_DEBUG);\n return debug\n ? DebugLevel[debug] || DebugLevel.NONE\n : DebugLevel.NONE;\n }\n static get logLevel() {\n const log = this.searchParams.get(DASH_LOG) || CookieStorage.get(DASH_LOG);\n return log ? LogLevel[log] || LogLevel.ERROR : LogLevel.ERROR;\n }\n static get defaultEdge() {\n return '1px solid #d3d3d3';\n }\n static get activeEdge() {\n return Environment._activeEdge;\n }\n static get supportsCssVariables() {\n return Environment._supportsCssVariables;\n }\n}\n","export default class LazyLoader {\n static get xlsx() {\n return import(\n /* webpackChunkName: \"export\", webpackMode: \"lazy\" */ 'xlsx');\n }\n static get hljs() {\n return Promise.resolve(window.hljs ||\n import(\n /* webpackChunkName: \"highlight\", webpackMode: \"lazy\" */ '../third-party/highlight.js').then(result => result.default));\n }\n static table() {\n return import(\n /* webpackChunkName: \"table\", webpackMode: \"lazy\" */ 'dash-table/dash/fragments/DataTable');\n }\n}\n","import _curry3 from \"./internal/_curry3.js\";\n\n/**\n * Creates a new list out of the two supplied by applying the function to each\n * equally-positioned pair in the lists. The returned list is truncated to the\n * length of the shorter of the two input lists.\n *\n * @function\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig ((a, b) -> c) -> [a] -> [b] -> [c]\n * @param {Function} fn The function used to combine the two elements into one value.\n * @param {Array} list1 The first array to consider.\n * @param {Array} list2 The second array to consider.\n * @return {Array} The list made by combining same-indexed elements of `list1` and `list2`\n * using `fn`.\n * @example\n *\n * const f = (x, y) => {\n * // ...\n * };\n * R.zipWith(f, [1, 2, 3], ['a', 'b', 'c']);\n * //=> [f(1, 'a'), f(2, 'b'), f(3, 'c')]\n * @symb R.zipWith(fn, [a, b, c], [d, e, f]) = [fn(a, d), fn(b, e), fn(c, f)]\n */\nvar zipWith = /*#__PURE__*/_curry3(function zipWith(fn, a, b) {\n var len = Math.min(a.length, b.length);\n var rv = Array(len);\n var idx = 0;\n while (idx < len) {\n rv[idx] = fn(a[idx], b[idx]);\n idx += 1;\n }\n return rv;\n});\nexport default zipWith;","\nimport * as R from 'ramda';\nimport React, {Component, Suspense} from 'react';\nimport PropTypes from 'prop-types';\nimport {asyncDecorator} from '@plotly/dash-component-plugins';\nimport LazyLoader from 'dash-table/LazyLoader';\n/**\n * Dash DataTable is an interactive table component designed for\n * viewing, editing, and exploring large datasets.\n * DataTable is rendered with standard, semantic HTML
markup,\n * which makes it accessible, responsive, and easy to style. This\n * component was written from scratch in React.js specifically for the\n * Dash community. Its API was designed to be ergonomic and its behavior\n * is completely customizable through its properties.\n */\nexport default class DataTable extends Component {\n render() {\n return (\n \n \n \n );\n }\n}\nconst RealDataTable = asyncDecorator(DataTable, LazyLoader.table);\nexport const defaultProps = {\n page_action: 'native',\n page_current: 0,\n page_size: 250,\n css: [],\n filter_query: '',\n filter_action: 'none',\n sort_as_null: [],\n sort_action: 'none',\n sort_mode: 'single',\n sort_by: [],\n style_as_list_view: false,\n derived_viewport_data: [],\n derived_viewport_indices: [],\n derived_viewport_row_ids: [],\n derived_viewport_selected_rows: [],\n derived_viewport_selected_row_ids: [],\n derived_virtual_data: [],\n derived_virtual_indices: [],\n derived_virtual_row_ids: [],\n derived_virtual_selected_rows: [],\n derived_virtual_selected_row_ids: [],\n dropdown: {},\n dropdown_conditional: [],\n dropdown_data: [],\n fill_width: true,\n filter_options: {},\n fixed_columns: {\n headers: false,\n data: 0\n },\n fixed_rows: {\n headers: false,\n data: 0\n },\n markdown_options: {\n link_target: '_blank',\n html: false\n },\n tooltip: {},\n tooltip_conditional: [],\n tooltip_data: [],\n tooltip_header: {},\n tooltip_delay: 350,\n tooltip_duration: 2000,\n column_selectable: false,\n editable: false,\n export_columns: 'visible',\n export_format: 'none',\n include_headers_on_copy_paste: false,\n selected_cells: [],\n selected_columns: [],\n selected_rows: [],\n selected_row_ids: [],\n cell_selectable: true,\n row_selectable: false,\n style_table: {},\n style_cell_conditional: [],\n style_data_conditional: [],\n style_filter_conditional: [],\n style_header_conditional: [],\n virtualization: false,\n persisted_props: [\n 'columns.name',\n 'filter_query',\n 'hidden_columns',\n 'page_current',\n 'selected_columns',\n 'selected_rows',\n 'sort_by'\n ],\n persistence_type: 'local'\n};\nexport const propTypes = {\n /**\n * The contents of the table.\n * The keys of each item in data should match the column IDs.\n * Each item can also have an 'id' key, whose value is its row ID. If there\n * is a column with ID='id' this will display the row ID, otherwise it is\n * just used to reference the row for selections, filtering, etc.\n * Example:\n * [\n * {'column-1': 4.5, 'column-2': 'montreal', 'column-3': 'canada'},\n * {'column-1': 8, 'column-2': 'boston', 'column-3': 'america'}\n * ]\n */\n data: PropTypes.arrayOf(\n PropTypes.objectOf(\n PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number,\n PropTypes.bool\n ])\n )\n ),\n /**\n * Columns describes various aspects about each individual column.\n * `name` and `id` are the only required parameters.\n */\n columns: PropTypes.arrayOf(\n PropTypes.exact({\n /**\n * The `id` of the column.\n * The column `id` is used to match cells in data with particular columns.\n * The `id` is not visible in the table.\n */\n id: PropTypes.string.isRequired,\n /**\n * The `name` of the column, as it appears in the column header.\n * If `name` is a list of strings, then the columns\n * will render with multiple headers rows.\n */\n name: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.arrayOf(PropTypes.string)\n ]).isRequired,\n /**\n * The data-type provides support for per column typing and allows for data\n * validation and coercion.\n * 'numeric': represents both floats and ints.\n * 'text': represents a string.\n * 'datetime': a string representing a date or date-time, in the form:\n * 'YYYY-MM-DD HH:MM:SS.ssssss' or some truncation thereof. Years must\n * have 4 digits, unless you use `validation.allow_YY: true`. Also\n * accepts 'T' or 't' between date and time, and allows timezone info\n * at the end. To convert these strings to Python `datetime` objects,\n * use `dateutil.parser.isoparse`. In R use `parse_iso_8601` from the\n * `parsedate` library.\n * WARNING: these parsers do not work with 2-digit years, if you use\n * `validation.allow_YY: true` and do not coerce to 4-digit years.\n * And parsers that do work with 2-digit years may make a different\n * guess about the century than we make on the front end.\n * 'any': represents any type of data.\n * Defaults to 'any' if undefined.\n *\n *\n */\n type: PropTypes.oneOf(['any', 'numeric', 'text', 'datetime']),\n /**\n * The `presentation` to use to display data. Markdown can be used on\n * columns with type 'text'. See 'dropdown' for more info.\n * Defaults to 'input' for ['datetime', 'numeric', 'text', 'any'].\n */\n presentation: PropTypes.oneOf(['input', 'dropdown', 'markdown']),\n /**\n * If true, the user can select the column by clicking on the checkbox or radio button\n * in the column. If there are multiple header rows, true will display the input\n * on each row.\n * If `last`, the input will only appear on the last header row. If `first` it will only\n * appear on the first header row. These are respectively shortcut equivalents to\n * `[false, ..., false, true]` and `[true, false, ..., false]`.\n * If there are merged, multi-header columns then you can choose which column header\n * row to display the input in by supplying an array of booleans.\n * For example, `[true, false]` will display the `selectable` input on the first row,\n * but now on the second row.\n * If the `selectable` input appears on a merged columns, then clicking on that input\n * will select *all* of the merged columns associated with it.\n * The table-level prop `column_selectable` is used to determine the type of column\n * selection to use.\n *\n */\n selectable: PropTypes.oneOfType([\n PropTypes.oneOf(['first', 'last']),\n PropTypes.bool,\n PropTypes.arrayOf(PropTypes.bool)\n ]),\n /**\n * If true, the user can clear the column by clicking on the `clear`\n * action button on the column. If there are multiple header rows, true\n * will display the action button on each row.\n * If `last`, the `clear` action button will only appear on the last header\n * row. If `first` it will only appear on the first header row. These\n * are respectively shortcut equivalents to `[false, ..., false, true]` and\n * `[true, false, ..., false]`.\n * If there are merged, multi-header columns then you can choose\n * which column header row to display the `clear` action button in by\n * supplying an array of booleans.\n * For example, `[true, false]` will display the `clear` action button\n * on the first row, but not the second row.\n * If the `clear` action button appears on a merged column, then clicking\n * on that button will clear *all* of the merged columns associated with it.\n * Unlike `column.deletable`, this action does not remove the column(s)\n * from the table. It only removed the associated entries from `data`.\n */\n clearable: PropTypes.oneOfType([\n PropTypes.oneOf(['first', 'last']),\n PropTypes.bool,\n PropTypes.arrayOf(PropTypes.bool)\n ]),\n /**\n * If true, the user can remove the column by clicking on the `delete`\n * action button on the column. If there are multiple header rows, true\n * will display the action button on each row.\n * If `last`, the `delete` action button will only appear on the last header\n * row. If `first` it will only appear on the first header row. These\n * are respectively shortcut equivalents to `[false, ..., false, true]` and\n * `[true, false, ..., false]`.\n * If there are merged, multi-header columns then you can choose\n * which column header row to display the `delete` action button in by\n * supplying an array of booleans.\n * For example, `[true, false]` will display the `delete` action button\n * on the first row, but not the second row.\n * If the `delete` action button appears on a merged column, then clicking\n * on that button will remove *all* of the merged columns associated with it.\n */\n deletable: PropTypes.oneOfType([\n PropTypes.oneOf(['first', 'last']),\n PropTypes.bool,\n PropTypes.arrayOf(PropTypes.bool)\n ]),\n /**\n * There are two `editable` flags in the table.\n * This is the column-level editable flag and there is\n * also the table-level `editable` flag.\n * These flags determine whether the contents of the table\n * are editable or not.\n * If the column-level `editable` flag is set it overrides\n * the table-level `editable` flag for that column.\n */\n editable: PropTypes.bool,\n /**\n * If true, the user can hide the column by clicking on the `hide`\n * action button on the column. If there are multiple header rows, true\n * will display the action button on each row.\n * If `last`, the `hide` action button will only appear on the last header\n * row. If `first` it will only appear on the first header row. These\n * are respectively shortcut equivalents to `[false, ..., false, true]` and\n * `[true, false, ..., false]`.\n * If there are merged, multi-header columns then you can choose\n * which column header row to display the `hide` action button in by\n * supplying an array of booleans.\n * For example, `[true, false]` will display the `hide` action button\n * on the first row, but not the second row.\n * If the `hide` action button appears on a merged column, then clicking\n * on that button will hide *all* of the merged columns associated with it.\n */\n hideable: PropTypes.oneOfType([\n PropTypes.oneOf(['first', 'last']),\n PropTypes.bool,\n PropTypes.arrayOf(PropTypes.bool)\n ]),\n /**\n * If true, the user can rename the column by clicking on the `rename`\n * action button on the column. If there are multiple header rows, true\n * will display the action button on each row.\n * If `last`, the `rename` action button will only appear on the last header\n * row. If `first` it will only appear on the first header row. These\n * are respectively shortcut equivalents to `[false, ..., false, true]` and\n * `[true, false, ..., false]`.\n * If there are merged, multi-header columns then you can choose\n * which column header row to display the `rename` action button in by\n * supplying an array of booleans.\n * For example, `[true, false]` will display the `rename` action button\n * on the first row, but not the second row.\n * If the `rename` action button appears on a merged column, then clicking\n * on that button will rename *all* of the merged columns associated with it.\n */\n renamable: PropTypes.oneOfType([\n PropTypes.oneOf(['first', 'last']),\n PropTypes.bool,\n PropTypes.arrayOf(PropTypes.bool)\n ]),\n /**\n * There are two `filter_options` props in the table.\n * This is the column-level filter_options prop and there is\n * also the table-level `filter_options` prop.\n * If the column-level `filter_options` prop is set it overrides\n * the table-level `filter_options` prop for that column.\n */\n filter_options: PropTypes.shape({\n /**\n * (default: 'sensitive') Determine whether the applicable filter relational operators will default to `sensitive` or `insensitive` comparison.\n */\n case: PropTypes.oneOf(['sensitive', 'insensitive']),\n /**\n * (default: 'filter data...') The filter cell placeholder text.\n */\n placeholder_text: PropTypes.string\n }),\n /**\n * The formatting applied to the column's data.\n * This prop is derived from the [d3-format](https://github.com/d3/d3-format) library specification. Apart from\n * being structured slightly differently (under a single prop), the usage is the same.\n * See also dash_table.FormatTemplate. It contains helper functions for typical number formats.\n */\n format: PropTypes.exact({\n /**\n * Represents localization specific formatting information.\n * When left unspecified, will use the default value provided by d3-format.\n */\n locale: PropTypes.exact({\n /**\n * (default: ['$', '']). A list of two strings representing the\n * prefix and suffix symbols. Typically used for currency, and implemented using d3's\n * currency format, but you can use this for other symbols such as measurement units\n */\n symbol: PropTypes.arrayOf(PropTypes.string),\n /**\n * (default: '.'). The string used for the decimal separator\n */\n decimal: PropTypes.string,\n /**\n * (default: ','). The string used for the groups separator\n */\n group: PropTypes.string,\n /**\n * (default: [3]). A list of integers representing the grouping pattern. The default is\n * 3 for thousands.\n */\n grouping: PropTypes.arrayOf(PropTypes.number),\n /**\n * A list of ten strings used as replacements for numbers 0-9\n */\n numerals: PropTypes.arrayOf(PropTypes.string),\n /**\n * (default: '%'). The string used for the percentage symbol\n */\n percent: PropTypes.string,\n /**\n * (default: True). Separates integers with 4-digits or less\n */\n separate_4digits: PropTypes.bool\n }),\n /**\n * A value that will be used in place of the nully value during formatting.\n * If the value type matches the column type, it will be formatted normally.\n */\n nully: PropTypes.any,\n /**\n * A number representing the SI unit to use during formatting.\n * See `dash_table.Format.Prefix` enumeration for the list of valid values\n */\n prefix: PropTypes.number,\n /**\n * (default: ''). Represents the d3 rules to apply when formatting the number.\n */\n specifier: PropTypes.string\n }),\n /**\n * The `on_change` behavior of the column for user-initiated modifications.\n */\n on_change: PropTypes.exact({\n /**\n * (default 'coerce'): 'none': do not validate data;\n * 'coerce': check if the data corresponds to the destination type and\n * attempts to coerce it into the destination type if not;\n * 'validate': check if the data corresponds to the destination type (no coercion).\n */\n action: PropTypes.oneOf(['coerce', 'none', 'validate']),\n /**\n * (default 'reject'): What to do with the value if the action fails.\n * 'accept': use the invalid value;\n * 'default': replace the provided value with `validation.default`;\n * 'reject': do not modify the existing value.\n */\n failure: PropTypes.oneOf(['accept', 'default', 'reject'])\n }),\n /**\n * An array of string, number and boolean values that are treated as `null`\n * (i.e. ignored and always displayed last) when sorting.\n * This value overrides the table-level `sort_as_null`.\n */\n sort_as_null: PropTypes.arrayOf(\n PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number,\n PropTypes.bool\n ])\n ),\n /**\n * The `validation` options for user input processing that can accept, reject or apply a\n * default value.\n */\n validation: PropTypes.exact({\n /**\n * Allow the use of nully values. (undefined, null, NaN) (default: False)\n */\n allow_null: PropTypes.bool,\n /**\n * The default value to apply with on_change.failure = 'default'. (default: None)\n */\n default: PropTypes.any,\n /**\n * This is for `datetime` columns only. Allow 2-digit years (default: False).\n * If True, we interpret years as ranging from now-70 to now+29 - in 2019\n * this is 1949 to 2048 but in 2020 it will be different. If used with\n * `action: 'coerce'`, will convert user input to a 4-digit year.\n */\n allow_YY: PropTypes.bool\n })\n })\n ),\n /**\n * If True, then the data in all of the cells is editable.\n * When `editable` is True, particular columns can be made\n * uneditable by setting `editable` to `False` inside the `columns`\n * property.\n * If False, then the data in all of the cells is uneditable.\n * When `editable` is False, particular columns can be made\n * editable by setting `editable` to `True` inside the `columns`\n * property.\n */\n editable: PropTypes.bool,\n /**\n * `fixed_columns` will \"fix\" the set of columns so that\n * they remain visible when scrolling horizontally across\n * the unfixed columns. `fixed_columns` fixes columns\n * from left-to-right.\n * If `headers` is False, no columns are fixed.\n * If `headers` is True, all operation columns (see `row_deletable` and `row_selectable`)\n * are fixed. Additional data columns can be fixed by\n * assigning a number to `data`.\n *\n * Note that fixing columns introduces some changes to the\n * underlying markup of the table and may impact the\n * way that your columns are rendered or sized.\n * View the documentation examples to learn more.\n *\n */\n fixed_columns: PropTypes.exact({\n /**\n * Example `{'headers':False, 'data':0}` No columns are fixed (the default)\n */\n data: PropTypes.number,\n headers: PropTypes.bool\n }),\n /**\n * `fixed_rows` will \"fix\" the set of rows so that\n * they remain visible when scrolling vertically down\n * the table. `fixed_rows` fixes rows\n * from top-to-bottom, starting from the headers.\n * If `headers` is False, no rows are fixed.\n * If `headers` is True, all header and filter rows (see `filter_action`) are\n * fixed. Additional data rows can be fixed by assigning\n * a number to `data`. Note that fixing rows introduces some changes to the\n * underlying markup of the table and may impact the\n * way that your columns are rendered or sized.\n * View the documentation examples to learn more.\n */\n fixed_rows: PropTypes.exact({\n /**\n * Example `{'headers':False, 'data':0}` No rows are fixed (the default)\n */\n data: PropTypes.number,\n headers: PropTypes.bool\n }),\n /**\n * If `single`, then the user can select a single column or group\n * of merged columns via the radio button that will appear in the\n * header rows.\n * If `multi`, then the user can select multiple columns or groups\n * of merged columns via the checkbox that will appear in the header\n * rows.\n * If false, then the user will not be able to select columns and no\n * input will appear in the header rows.\n * When a column is selected, its id will be contained in `selected_columns`\n * and `derived_viewport_selected_columns`.\n */\n column_selectable: PropTypes.oneOf(['single', 'multi', false]),\n /**\n * If True (default), then it is possible to click and navigate\n * table cells.\n */\n cell_selectable: PropTypes.bool,\n /**\n * If `single`, then the user can select a single row\n * via a radio button that will appear next to each row.\n * If `multi`, then the user can select multiple rows\n * via a checkbox that will appear next to each row.\n * If false, then the user will not be able to select rows\n * and no additional UI elements will appear.\n * When a row is selected, its index will be contained\n * in `selected_rows`.\n */\n row_selectable: PropTypes.oneOf(['single', 'multi', false]),\n /**\n * If True, then a `x` will appear next to each `row`\n * and the user can delete the row.\n */\n row_deletable: PropTypes.bool,\n /**\n * The row and column indices and IDs of the currently active cell.\n * `row_id` is only returned if the data rows have an `id` key.\n */\n active_cell: PropTypes.exact({\n row: PropTypes.number,\n column: PropTypes.number,\n row_id: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n column_id: PropTypes.string\n }),\n /**\n * `selected_cells` represents the set of cells that are selected,\n * as an array of objects, each item similar to `active_cell`.\n * Multiple cells can be selected by holding down shift and\n * clicking on a different cell or holding down shift and navigating\n * with the arrow keys.\n */\n selected_cells: PropTypes.arrayOf(\n PropTypes.exact({\n row: PropTypes.number,\n column: PropTypes.number,\n row_id: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n column_id: PropTypes.string\n })\n ),\n /**\n * `selected_rows` contains the indices of rows that\n * are selected via the UI elements that appear when\n * `row_selectable` is `'single'` or `'multi'`.\n */\n selected_rows: PropTypes.arrayOf(PropTypes.number),\n /**\n * `selected_columns` contains the ids of columns that\n * are selected via the UI elements that appear when\n * `column_selectable` is `'single' or 'multi'`.\n */\n selected_columns: PropTypes.arrayOf(PropTypes.string),\n /**\n * `selected_row_ids` contains the ids of rows that\n * are selected via the UI elements that appear when\n * `row_selectable` is `'single'` or `'multi'`.\n */\n selected_row_ids: PropTypes.arrayOf(\n PropTypes.oneOfType([PropTypes.string, PropTypes.number])\n ),\n /**\n * When selecting multiple cells\n * (via clicking on a cell and then shift-clicking on another cell),\n * `start_cell` represents the [row, column] coordinates of the cell\n * in one of the corners of the region.\n * `end_cell` represents the coordinates of the other corner.\n */\n start_cell: PropTypes.exact({\n row: PropTypes.number,\n column: PropTypes.number,\n row_id: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n column_id: PropTypes.string\n }),\n /**\n * When selecting multiple cells\n * (via clicking on a cell and then shift-clicking on another cell),\n * `end_cell` represents the row / column coordinates and IDs of the cell\n * in one of the corners of the region.\n * `start_cell` represents the coordinates of the other corner.\n */\n end_cell: PropTypes.exact({\n row: PropTypes.number,\n column: PropTypes.number,\n row_id: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n column_id: PropTypes.string\n }),\n /**\n * The previous state of `data`. `data_previous`\n * has the same structure as `data` and it will be updated\n * whenever `data` changes, either through a callback or\n * by editing the table.\n * This is a read-only property: setting this property will not\n * have any impact on the table.\n */\n data_previous: PropTypes.arrayOf(PropTypes.object),\n /**\n * List of columns ids of the columns that are currently hidden.\n * See the associated nested prop `columns.hideable`.\n */\n hidden_columns: PropTypes.arrayOf(PropTypes.string),\n /**\n * If True, then the `active_cell` is in a focused state.\n */\n is_focused: PropTypes.bool,\n /**\n * If True, then column headers that have neighbors with duplicate names\n * will be merged into a single cell.\n * This will be applied for single column headers and multi-column\n * headers.\n */\n merge_duplicate_headers: PropTypes.bool,\n /**\n * The unix timestamp when the data was last edited.\n * Use this property with other timestamp properties\n * (such as `n_clicks_timestamp` in `dash_html_components`)\n * to determine which property has changed within a callback.\n */\n data_timestamp: PropTypes.number,\n /**\n * If true, headers are included when copying from the table to different\n * tabs and elsewhere. Note that headers are ignored when copying from the table onto itself and\n * between two tables within the same tab.\n */\n include_headers_on_copy_paste: PropTypes.bool,\n /**\n * Denotes the columns that will be used in the export data file.\n * If `all`, all columns will be used (visible + hidden). If `visible`,\n * only the visible columns will be used. Defaults to `visible`.\n */\n export_columns: PropTypes.oneOf(['all', 'visible']),\n /**\n * Denotes the type of the export data file,\n * Defaults to `'none'`\n */\n export_format: PropTypes.oneOf(['csv', 'xlsx', 'none']),\n /**\n * Denotes the format of the headers in the export data file.\n * If `'none'`, there will be no header. If `'display'`, then the header\n * of the data file will be how it is currently displayed. Note that\n * `'display'` is only supported for `'xlsx'` export_format and will behave\n * like `'names'` for `'csv'` export format. If `'ids'` or `'names'`,\n * then the headers of data file will be the column id or the column\n * names, respectively\n */\n export_headers: PropTypes.oneOf(['none', 'ids', 'names', 'display']),\n /**\n * `page_action` refers to a mode of the table where\n * not all of the rows are displayed at once: only a subset\n * are displayed (a \"page\") and the next subset of rows\n * can viewed by clicking \"Next\" or \"Previous\" buttons\n * at the bottom of the page.\n * Pagination is used to improve performance: instead of\n * rendering all of the rows at once (which can be expensive),\n * we only display a subset of them.\n * With pagination, we can either page through data that exists\n * in the table (e.g. page through `10,000` rows in `data` `100` rows at a time)\n * or we can update the data on-the-fly with callbacks\n * when the user clicks on the \"Previous\" or \"Next\" buttons.\n * These modes can be toggled with this `page_action` parameter:\n * `'native'`: all data is passed to the table up-front, paging logic is\n * handled by the table;\n * `'custom'`: data is passed to the table one page at a time, paging logic\n * is handled via callbacks;\n * `'none'`: disables paging, render all of the data at once.\n */\n page_action: PropTypes.oneOf(['custom', 'native', 'none']),\n /**\n * `page_current` represents which page the user is on.\n * Use this property to index through data in your callbacks with\n * backend paging.\n */\n page_current: PropTypes.number,\n /**\n * `page_count` represents the number of the pages in the\n * paginated table. This is really only useful when performing\n * backend pagination, since the front end is able to use the\n * full size of the table to calculate the number of pages.\n */\n page_count: PropTypes.number,\n /**\n * `page_size` represents the number of rows that will be\n * displayed on a particular page when `page_action` is `'custom'` or `'native'`\n */\n page_size: PropTypes.number,\n /**\n * If `filter_action` is enabled, then the current filtering\n * string is represented in this `filter_query`\n * property.\n */\n filter_query: PropTypes.string,\n /**\n * The `filter_action` property controls the behavior of the `filtering` UI.\n * If `'none'`, then the filtering UI is not displayed.\n * If `'native'`, then the filtering UI is displayed and the filtering\n * logic is handled by the table. That is, it is performed on the data\n * that exists in the `data` property.\n * If `'custom'`, then the filtering UI is displayed but it is the\n * responsibility of the developer to program the filtering\n * through a callback (where `filter_query` or `derived_filter_query_structure` would be the input\n * and `data` would be the output).\n */\n filter_action: PropTypes.oneOfType([\n PropTypes.oneOf(['custom', 'native', 'none']),\n PropTypes.shape({\n type: PropTypes.oneOf(['custom', 'native']).isRequired,\n operator: PropTypes.oneOf(['and', 'or'])\n })\n ]),\n /**\n * There are two `filter_options` props in the table.\n * This is the table-level filter_options prop and there is\n * also the column-level `filter_options` prop.\n * If the column-level `filter_options` prop is set it overrides\n * the table-level `filter_options` prop for that column.\n */\n filter_options: PropTypes.shape({\n /**\n * (default: 'sensitive') Determine whether the applicable filter relational operators will default to `sensitive` or `insensitive` comparison.\n */\n case: PropTypes.oneOf(['sensitive', 'insensitive']),\n /**\n * (default: 'filter data...') The filter cell placeholder text.\n */\n placeholder_text: PropTypes.string\n }),\n /**\n * The `sort_action` property enables data to be\n * sorted on a per-column basis.\n * If `'none'`, then the sorting UI is not displayed.\n * If `'native'`, then the sorting UI is displayed and the sorting\n * logic is handled by the table. That is, it is performed on the data\n * that exists in the `data` property.\n * If `'custom'`, the sorting UI is displayed but it is the\n * responsibility of the developer to program the sorting\n * through a callback (where `sort_by` would be the input and `data`\n * would be the output).\n * Clicking on the sort arrows will update the\n * `sort_by` property.\n */\n sort_action: PropTypes.oneOf(['custom', 'native', 'none']),\n /**\n * Sorting can be performed across multiple columns\n * (e.g. sort by country, sort within each country,\n * sort by year) or by a single column.\n * NOTE - With multi-column sort, it's currently\n * not possible to determine the order in which\n * the columns were sorted through the UI.\n * See [https://github.com/plotly/dash-table/issues/170](https://github.com/plotly/dash-table/issues/170)\n */\n sort_mode: PropTypes.oneOf(['single', 'multi']),\n /**\n * `sort_by` describes the current state\n * of the sorting UI.\n * That is, if the user clicked on the sort arrow\n * of a column, then this property will be updated\n * with the column ID and the direction\n * (`asc` or `desc`) of the sort.\n * For multi-column sorting, this will be a list of\n * sorting parameters, in the order in which they were\n * clicked.\n */\n sort_by: PropTypes.arrayOf(\n PropTypes.exact({\n column_id: PropTypes.string.isRequired,\n direction: PropTypes.oneOf(['asc', 'desc']).isRequired\n })\n ),\n /**\n * An array of string, number and boolean values that are treated as `None`\n * (i.e. ignored and always displayed last) when sorting.\n * This value will be used by columns without `sort_as_null`.\n * Defaults to `[]`.\n */\n sort_as_null: PropTypes.arrayOf(\n PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number,\n PropTypes.bool\n ])\n ),\n /**\n * `dropdown` specifies dropdown options for different columns.\n * Each entry refers to the column ID.\n * The `clearable` property defines whether the value can be deleted.\n * The `options` property refers to the `options` of the dropdown.\n */\n dropdown: PropTypes.objectOf(\n PropTypes.exact({\n clearable: PropTypes.bool,\n options: PropTypes.arrayOf(\n PropTypes.exact({\n label: PropTypes.string.isRequired,\n value: PropTypes.oneOfType([\n PropTypes.number,\n PropTypes.string,\n PropTypes.bool\n ]).isRequired\n })\n ).isRequired\n })\n ),\n /**\n * `dropdown_conditional` specifies dropdown options in various columns and cells.\n * This property allows you to specify different dropdowns\n * depending on certain conditions. For example, you may\n * render different \"city\" dropdowns in a row depending on the\n * current value in the \"state\" column.\n */\n dropdown_conditional: PropTypes.arrayOf(\n PropTypes.exact({\n clearable: PropTypes.bool,\n if: PropTypes.exact({\n column_id: PropTypes.string,\n filter_query: PropTypes.string\n }),\n options: PropTypes.arrayOf(\n PropTypes.exact({\n label: PropTypes.string.isRequired,\n value: PropTypes.oneOfType([\n PropTypes.number,\n PropTypes.string,\n PropTypes.bool\n ]).isRequired\n })\n ).isRequired\n })\n ),\n /**\n * `dropdown_data` specifies dropdown options on a row-by-row, column-by-column basis.\n * Each item in the array corresponds to the corresponding dropdowns for the `data` item\n * at the same index. Each entry in the item refers to the Column ID.\n */\n dropdown_data: PropTypes.arrayOf(\n PropTypes.objectOf(\n PropTypes.exact({\n clearable: PropTypes.bool,\n options: PropTypes.arrayOf(\n PropTypes.exact({\n label: PropTypes.string.isRequired,\n value: PropTypes.oneOfType([\n PropTypes.number,\n PropTypes.string,\n PropTypes.bool\n ]).isRequired\n })\n ).isRequired\n })\n )\n ),\n /**\n * `tooltip` is the column based tooltip configuration applied to all rows. The key is the column\n * id and the value is a tooltip configuration.\n * Example: {i: {'value': i, 'use_with: 'both'} for i in df.columns}\n */\n tooltip: PropTypes.objectOf(\n PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.exact({\n /**\n * Represents the delay in milliseconds before\n * the tooltip is shown when hovering a cell. This overrides\n * the table's `tooltip_delay` property. If set to `None`,\n * the tooltip will be shown immediately.\n */\n delay: PropTypes.number,\n /**\n * represents the duration in milliseconds\n * during which the tooltip is shown when hovering a cell.\n * This overrides the table's `tooltip_duration` property.\n * If set to `None`, the tooltip will not disappear.\n */\n duration: PropTypes.number,\n /**\n * refers to the type of tooltip syntax used\n * for the tooltip generation. Can either be `markdown`\n * or `text`. Defaults to `text`.\n */\n type: PropTypes.oneOf(['text', 'markdown']),\n /**\n * Refers to whether the tooltip will be shown\n * only on data or headers. Can be `both`, `data`, `header`.\n * Defaults to `both`.\n */\n use_with: PropTypes.oneOf(['both', 'data', 'header']),\n /**\n * refers to the syntax-based content of\n * the tooltip. This value is required. Alternatively, the value of the\n * property can also be a plain string. The `text` syntax will be used in\n * that case.\n */\n value: PropTypes.string.isRequired\n })\n ])\n ),\n /**\n * `tooltip_conditional` represents the tooltip shown\n * for different columns and cells.\n * This property allows you to specify different tooltips\n * depending on certain conditions. For example, you may have\n * different tooltips in the same column based on the value\n * of a certain data property.\n * Priority is from first to last defined conditional tooltip\n * in the list. Higher priority (more specific) conditional\n * tooltips should be put at the beginning of the list.\n */\n tooltip_conditional: PropTypes.arrayOf(\n PropTypes.exact({\n /**\n * The `delay` represents the delay in milliseconds before\n * the tooltip is shown when hovering a cell. This overrides\n * the table's `tooltip_delay` property. If set to `None`,\n * the tooltip will be shown immediately.\n */\n delay: PropTypes.number,\n /**\n * The `duration` represents the duration in milliseconds\n * during which the tooltip is shown when hovering a cell.\n * This overrides the table's `tooltip_duration` property.\n * If set to `None`, the tooltip will not disappear.\n */\n duration: PropTypes.number,\n /**\n * The `if` refers to the condition that needs to be fulfilled\n * in order for the associated tooltip configuration to be\n * used. If multiple conditions are defined, all conditions\n * must be met for the tooltip to be used by a cell.\n */\n if: PropTypes.exact({\n /**\n * `column_id` refers to the column ID that must be matched.\n */\n column_id: PropTypes.string,\n /**\n * `filter_query` refers to the query that must evaluate to True.\n */\n filter_query: PropTypes.string,\n /**\n * `row_index` refers to the index of the row in the source `data`.\n */\n row_index: PropTypes.oneOfType([\n PropTypes.number,\n PropTypes.oneOf(['odd', 'even'])\n ])\n }).isRequired,\n /**\n * The `type` refers to the type of tooltip syntax used\n * for the tooltip generation. Can either be `markdown`\n * or `text`. Defaults to `text`.\n */\n type: PropTypes.oneOf(['text', 'markdown']),\n /**\n * The `value` refers to the syntax-based content of the tooltip. This value is required.\n */\n value: PropTypes.string.isRequired\n })\n ),\n /**\n * `tooltip_data` represents the tooltip shown\n * for different columns and cells.\n * A list of dicts for which each key is\n * a column id and the value is a tooltip configuration.\n */\n tooltip_data: PropTypes.arrayOf(\n PropTypes.objectOf(\n PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.exact({\n /**\n * The `delay` represents the delay in milliseconds before\n * the tooltip is shown when hovering a cell. This overrides\n * the table's `tooltip_delay` property. If set to `None`,\n * the tooltip will be shown immediately.\n */\n delay: PropTypes.number,\n /**\n * The `duration` represents the duration in milliseconds\n * during which the tooltip is shown when hovering a cell.\n * This overrides the table's `tooltip_duration` property.\n * If set to `None`, the tooltip will not disappear.\n * Alternatively, the value of the property can also be\n * a plain string. The `text` syntax will be used in\n * that case.\n */\n duration: PropTypes.number,\n /**\n * For each tooltip configuration,\n * The `type` refers to the type of tooltip syntax used\n * for the tooltip generation. Can either be `markdown`\n * or `text`. Defaults to `text`.\n */\n type: PropTypes.oneOf(['text', 'markdown']),\n /**\n * The `value` refers to the syntax-based content of the tooltip. This value is required.\n */\n value: PropTypes.string.isRequired\n })\n ])\n )\n ),\n /**\n * `tooltip_header` represents the tooltip shown\n * for each header column and optionally each header row.\n * Example to show long column names in a tooltip: {i: i for i in df.columns}.\n * Example to show different column names in a tooltip: {'Rep': 'Republican', 'Dem': 'Democrat'}.\n * If the table has multiple rows of headers, then use a list as the value of the\n * `tooltip_header` items.\n *\n *\n */\n tooltip_header: PropTypes.objectOf(\n PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.exact({\n /**\n * The `delay` represents the delay in milliseconds before\n * the tooltip is shown when hovering a cell. This overrides\n * the table's `tooltip_delay` property. If set to `None`,\n * the tooltip will be shown immediately.\n */\n delay: PropTypes.number,\n /**\n * The `duration` represents the duration in milliseconds\n * during which the tooltip is shown when hovering a cell.\n * This overrides the table's `tooltip_duration` property.\n * If set to `None`, the tooltip will not disappear.\n * Alternatively, the value of the property can also be\n * a plain string. The `text` syntax will be used in\n * that case.\n */\n duration: PropTypes.number,\n /**\n * For each tooltip configuration,\n * The `type` refers to the type of tooltip syntax used\n * for the tooltip generation. Can either be `markdown`\n * or `text`. Defaults to `text`.\n */\n type: PropTypes.oneOf(['text', 'markdown']),\n /**\n * The `value` refers to the syntax-based content of the tooltip. This value is required.\n */\n value: PropTypes.string.isRequired\n }),\n PropTypes.arrayOf(\n PropTypes.oneOfType([\n PropTypes.oneOf([null]),\n PropTypes.string,\n PropTypes.exact({\n delay: PropTypes.number,\n duration: PropTypes.number,\n type: PropTypes.oneOf(['text', 'markdown']),\n value: PropTypes.string.isRequired\n })\n ])\n )\n ])\n ),\n /**\n * `tooltip_delay` represents the table-wide delay in milliseconds before\n * the tooltip is shown when hovering a cell. If set to `None`, the tooltip\n * will be shown immediately.\n * Defaults to 350.\n */\n tooltip_delay: PropTypes.number,\n /**\n * `tooltip_duration` represents the table-wide duration in milliseconds\n * during which the tooltip will be displayed when hovering a cell. If\n * set to `None`, the tooltip will not disappear.\n * Defaults to 2000.\n */\n tooltip_duration: PropTypes.number,\n /**\n * The localization specific formatting information applied to all columns in the table.\n * This prop is derived from the [d3.formatLocale](https://github.com/d3/d3-format#formatLocale) data structure specification.\n * When left unspecified, each individual nested prop will default to a pre-determined value.\n */\n locale_format: PropTypes.exact({\n /**\n * (default: ['$', '']). A list of two strings representing the\n * prefix and suffix symbols. Typically used for currency, and implemented using d3's\n * currency format, but you can use this for other symbols such as measurement units.\n */\n symbol: PropTypes.arrayOf(PropTypes.string),\n /**\n * (default: '.'). The string used for the decimal separator.\n */\n decimal: PropTypes.string,\n /**\n * (default: ','). The string used for the groups separator.\n */\n group: PropTypes.string,\n /**\n * (default: [3]). A list of integers representing the grouping pattern.\n */\n grouping: PropTypes.arrayOf(PropTypes.number),\n /**\n * A list of ten strings used as replacements for numbers 0-9.\n */\n numerals: PropTypes.arrayOf(PropTypes.string),\n /**\n * (default: '%'). The string used for the percentage symbol.\n */\n percent: PropTypes.string,\n /**\n * (default: True). Separate integers with 4-digits or less.\n */\n separate_4digits: PropTypes.bool\n }),\n /**\n * If True, then the table will be styled like a list view\n * and not have borders between the columns.\n */\n style_as_list_view: PropTypes.bool,\n /**\n * `fill_width` toggles between a set of CSS for two common behaviors:\n * True: The table container's width will grow to fill the available space;\n * False: The table container's width will equal the width of its content.\n */\n fill_width: PropTypes.bool,\n /**\n * The `markdown_options` property allows customization of the markdown cells behavior.\n */\n markdown_options: PropTypes.exact({\n /**\n * (default: '_blank'). The link's behavior (_blank opens the link in a\n * new tab, _parent opens the link in the parent frame, _self opens the link in the\n * current tab, and _top opens the link in the top frame) or a string\n */\n link_target: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.oneOf(['_blank', '_parent', '_self', '_top'])\n ]),\n /**\n * (default: False) If True, html may be used in markdown cells\n * Be careful enabling html if the content being rendered can come\n * from an untrusted user, as this may create an XSS vulnerability.\n */\n html: PropTypes.bool\n }),\n /**\n * The `css` property is a way to embed CSS selectors and rules\n * onto the page.\n * We recommend starting with the `style_*` properties\n * before using this `css` property.\n * Example:\n * [\n * {\"selector\": \".dash-spreadsheet\", \"rule\": 'font-family: \"monospace\"'}\n * ]\n */\n css: PropTypes.arrayOf(\n PropTypes.exact({\n selector: PropTypes.string.isRequired,\n rule: PropTypes.string.isRequired\n })\n ),\n /**\n * CSS styles to be applied to the outer `table` container.\n * This is commonly used for setting properties like the\n * width or the height of the table.\n */\n style_table: PropTypes.object,\n /**\n * CSS styles to be applied to each individual cell of the table.\n * This includes the header cells, the `data` cells, and the filter\n * cells.\n */\n style_cell: PropTypes.object,\n /**\n * CSS styles to be applied to each individual data cell.\n * That is, unlike `style_cell`, it excludes the header and filter cells.\n */\n style_data: PropTypes.object,\n /**\n * CSS styles to be applied to the filter cells.\n * Note that this may change in the future as we build out a\n * more complex filtering UI.\n */\n style_filter: PropTypes.object,\n /**\n * CSS styles to be applied to each individual header cell.\n * That is, unlike `style_cell`, it excludes the `data` and filter cells.\n */\n style_header: PropTypes.object,\n /**\n * Conditional CSS styles for the cells.\n * This can be used to apply styles to cells on a per-column basis.\n */\n style_cell_conditional: PropTypes.arrayOf(\n PropTypes.shape({\n if: PropTypes.exact({\n column_id: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.arrayOf(PropTypes.string)\n ]),\n column_type: PropTypes.oneOf([\n 'any',\n 'numeric',\n 'text',\n 'datetime'\n ])\n })\n })\n ),\n /**\n * Conditional CSS styles for the data cells.\n * This can be used to apply styles to data cells on a per-column basis.\n */\n style_data_conditional: PropTypes.arrayOf(\n PropTypes.shape({\n if: PropTypes.exact({\n column_id: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.arrayOf(PropTypes.string)\n ]),\n column_type: PropTypes.oneOf([\n 'any',\n 'numeric',\n 'text',\n 'datetime'\n ]),\n filter_query: PropTypes.string,\n state: PropTypes.oneOf(['active', 'selected']),\n row_index: PropTypes.oneOfType([\n PropTypes.number,\n PropTypes.oneOf(['odd', 'even']),\n PropTypes.arrayOf(PropTypes.number)\n ]),\n column_editable: PropTypes.bool\n })\n })\n ),\n /**\n * Conditional CSS styles for the filter cells.\n * This can be used to apply styles to filter cells on a per-column basis.\n */\n style_filter_conditional: PropTypes.arrayOf(\n PropTypes.shape({\n if: PropTypes.exact({\n column_id: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.arrayOf(PropTypes.string)\n ]),\n column_type: PropTypes.oneOf([\n 'any',\n 'numeric',\n 'text',\n 'datetime'\n ]),\n column_editable: PropTypes.bool\n })\n })\n ),\n /**\n * Conditional CSS styles for the header cells.\n * This can be used to apply styles to header cells on a per-column basis.\n */\n style_header_conditional: PropTypes.arrayOf(\n PropTypes.shape({\n if: PropTypes.exact({\n column_id: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.arrayOf(PropTypes.string)\n ]),\n column_type: PropTypes.oneOf([\n 'any',\n 'numeric',\n 'text',\n 'datetime'\n ]),\n header_index: PropTypes.oneOfType([\n PropTypes.number,\n PropTypes.arrayOf(PropTypes.number),\n PropTypes.oneOf(['odd', 'even'])\n ]),\n column_editable: PropTypes.bool\n })\n })\n ),\n /**\n * This property tells the table to use virtualization when rendering.\n * Assumptions are that:\n * the width of the columns is fixed;\n * the height of the rows is always the same; and\n * runtime styling changes will not affect width and height vs. first rendering\n */\n virtualization: PropTypes.bool,\n /**\n * This property represents the current structure of\n * `filter_query` as a tree structure. Each node of the\n * query structure has:\n * type (string; required):\n * 'open-block',\n * 'logical-operator',\n * 'relational-operator',\n * 'unary-operator', or\n * 'expression';\n * subType (string; optional):\n * 'open-block': '()',\n * 'logical-operator': '&&', '||',\n * 'relational-operator': '=', '>=', '>', '<=', '<', '!=', 'contains',\n * 'unary-operator': '!', 'is bool', 'is even', 'is nil', 'is num', 'is object', 'is odd', 'is prime', 'is str',\n * 'expression': 'value', 'field';\n * value (any):\n * 'expression, value': passed value,\n * 'expression, field': the field/prop name.\n * block (nested query structure; optional).\n * left (nested query structure; optional).\n * right (nested query structure; optional).\n * If the query is invalid or empty, the `derived_filter_query_structure` will\n * be `None`.\n */\n derived_filter_query_structure: PropTypes.object,\n /**\n * This property represents the current state of `data`\n * on the current page. This property will be updated\n * on paging, sorting, and filtering.\n */\n derived_viewport_data: PropTypes.arrayOf(PropTypes.object),\n /**\n * `derived_viewport_indices` indicates the order in which the original\n * rows appear after being filtered, sorted, and/or paged.\n * `derived_viewport_indices` contains indices for the current page,\n * while `derived_virtual_indices` contains indices across all pages.\n */\n derived_viewport_indices: PropTypes.arrayOf(PropTypes.number),\n /**\n * `derived_viewport_row_ids` lists row IDs in the order they appear\n * after being filtered, sorted, and/or paged.\n * `derived_viewport_row_ids` contains IDs for the current page,\n * while `derived_virtual_row_ids` contains IDs across all pages.\n */\n derived_viewport_row_ids: PropTypes.arrayOf(\n PropTypes.oneOfType([PropTypes.string, PropTypes.number])\n ),\n /**\n * `derived_viewport_selected_columns` contains the ids of the\n * `selected_columns` that are not currently hidden.\n */\n derived_viewport_selected_columns: PropTypes.arrayOf(PropTypes.string),\n /**\n * `derived_viewport_selected_rows` represents the indices of the\n * `selected_rows` from the perspective of the `derived_viewport_indices`.\n */\n derived_viewport_selected_rows: PropTypes.arrayOf(PropTypes.number),\n /**\n * `derived_viewport_selected_row_ids` represents the IDs of the\n * `selected_rows` on the currently visible page.\n */\n derived_viewport_selected_row_ids: PropTypes.arrayOf(\n PropTypes.oneOfType([PropTypes.string, PropTypes.number])\n ),\n /**\n * This property represents the visible state of `data`\n * across all pages after the front-end sorting and filtering\n * as been applied.\n */\n derived_virtual_data: PropTypes.arrayOf(PropTypes.object),\n /**\n * `derived_virtual_indices` indicates the order in which the original\n * rows appear after being filtered and sorted.\n * `derived_viewport_indices` contains indices for the current page,\n * while `derived_virtual_indices` contains indices across all pages.\n */\n derived_virtual_indices: PropTypes.arrayOf(PropTypes.number),\n /**\n * `derived_virtual_row_ids` indicates the row IDs in the order in which\n * they appear after being filtered and sorted.\n * `derived_viewport_row_ids` contains IDs for the current page,\n * while `derived_virtual_row_ids` contains IDs across all pages.\n */\n derived_virtual_row_ids: PropTypes.arrayOf(\n PropTypes.oneOfType([PropTypes.string, PropTypes.number])\n ),\n /**\n * `derived_virtual_selected_rows` represents the indices of the\n * `selected_rows` from the perspective of the `derived_virtual_indices`.\n */\n derived_virtual_selected_rows: PropTypes.arrayOf(PropTypes.number),\n /**\n * `derived_virtual_selected_row_ids` represents the IDs of the\n * `selected_rows` as they appear after filtering and sorting,\n * across all pages.\n */\n derived_virtual_selected_row_ids: PropTypes.arrayOf(\n PropTypes.oneOfType([PropTypes.string, PropTypes.number])\n ),\n /**\n * The ID of the table.\n */\n id: PropTypes.string,\n /**\n * Dash-assigned callback that gets fired when the user makes changes.\n */\n setProps: PropTypes.func,\n /**\n * Object that holds the loading state object coming from dash-renderer\n */\n loading_state: PropTypes.shape({\n /**\n * Determines if the component is loading or not\n */\n is_loading: PropTypes.bool,\n /**\n * Holds which property is loading\n */\n prop_name: PropTypes.string,\n /**\n * Holds the name of the component that is loading\n */\n component_name: PropTypes.string\n }),\n /**\n * Used to allow user interactions in this component to be persisted when\n * the component - or the page - is refreshed. If `persisted` is truthy and\n * hasn't changed from its previous value, any `persisted_props` that the\n * user has changed while using the app will keep those changes, as long as\n * the new prop value also matches what was given originally.\n * Used in conjunction with `persistence_type` and `persisted_props`.\n */\n persistence: PropTypes.oneOfType([\n PropTypes.bool,\n PropTypes.string,\n PropTypes.number\n ]),\n /**\n * Properties whose user interactions will persist after refreshing the\n * component or the page.\n */\n persisted_props: PropTypes.arrayOf(\n PropTypes.oneOf([\n 'columns.name',\n 'data',\n 'filter_query',\n 'hidden_columns',\n 'page_current',\n 'selected_columns',\n 'selected_rows',\n 'sort_by'\n ])\n ),\n /**\n * Where persisted user changes will be stored:\n * memory: only kept in memory, reset on page refresh.\n * local: window.localStorage, data is kept after the browser quit.\n * session: window.sessionStorage, data is cleared once the browser quit.\n */\n persistence_type: PropTypes.oneOf(['local', 'session', 'memory'])\n};\nDataTable.persistenceTransforms = {\n columns: {\n name: {\n extract: propValue => R.pluck('name', propValue),\n apply: (storedValue, propValue) =>\n R.zipWith(R.assoc('name'), storedValue, propValue)\n }\n }\n};\nDataTable.defaultProps = defaultProps;\nDataTable.propTypes = propTypes;\n","/*! https://mths.be/cssescape v1.5.1 by @mathias | MIT license */\n;(function(root, factory) {\n\t// https://github.com/umdjs/umd/blob/master/returnExports.js\n\tif (typeof exports == 'object') {\n\t\t// For Node.js.\n\t\tmodule.exports = factory(root);\n\t} else if (typeof define == 'function' && define.amd) {\n\t\t// For AMD. Register as an anonymous module.\n\t\tdefine([], factory.bind(root, root));\n\t} else {\n\t\t// For browser globals (not exposing the function separately).\n\t\tfactory(root);\n\t}\n}(typeof global != 'undefined' ? global : this, function(root) {\n\n\tif (root.CSS && root.CSS.escape) {\n\t\treturn root.CSS.escape;\n\t}\n\n\t// https://drafts.csswg.org/cssom/#serialize-an-identifier\n\tvar cssEscape = function(value) {\n\t\tif (arguments.length == 0) {\n\t\t\tthrow new TypeError('`CSS.escape` requires an argument.');\n\t\t}\n\t\tvar string = String(value);\n\t\tvar length = string.length;\n\t\tvar index = -1;\n\t\tvar codeUnit;\n\t\tvar result = '';\n\t\tvar firstCodeUnit = string.charCodeAt(0);\n\t\twhile (++index < length) {\n\t\t\tcodeUnit = string.charCodeAt(index);\n\t\t\t// Note: there’s no need to special-case astral symbols, surrogate\n\t\t\t// pairs, or lone surrogates.\n\n\t\t\t// If the character is NULL (U+0000), then the REPLACEMENT CHARACTER\n\t\t\t// (U+FFFD).\n\t\t\tif (codeUnit == 0x0000) {\n\t\t\t\tresult += '\\uFFFD';\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t// If the character is in the range [\\1-\\1F] (U+0001 to U+001F) or is\n\t\t\t\t// U+007F, […]\n\t\t\t\t(codeUnit >= 0x0001 && codeUnit <= 0x001F) || codeUnit == 0x007F ||\n\t\t\t\t// If the character is the first character and is in the range [0-9]\n\t\t\t\t// (U+0030 to U+0039), […]\n\t\t\t\t(index == 0 && codeUnit >= 0x0030 && codeUnit <= 0x0039) ||\n\t\t\t\t// If the character is the second character and is in the range [0-9]\n\t\t\t\t// (U+0030 to U+0039) and the first character is a `-` (U+002D), […]\n\t\t\t\t(\n\t\t\t\t\tindex == 1 &&\n\t\t\t\t\tcodeUnit >= 0x0030 && codeUnit <= 0x0039 &&\n\t\t\t\t\tfirstCodeUnit == 0x002D\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\t// https://drafts.csswg.org/cssom/#escape-a-character-as-code-point\n\t\t\t\tresult += '\\\\' + codeUnit.toString(16) + ' ';\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t// If the character is the first character and is a `-` (U+002D), and\n\t\t\t\t// there is no second character, […]\n\t\t\t\tindex == 0 &&\n\t\t\t\tlength == 1 &&\n\t\t\t\tcodeUnit == 0x002D\n\t\t\t) {\n\t\t\t\tresult += '\\\\' + string.charAt(index);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If the character is not handled by one of the above rules and is\n\t\t\t// greater than or equal to U+0080, is `-` (U+002D) or `_` (U+005F), or\n\t\t\t// is in one of the ranges [0-9] (U+0030 to U+0039), [A-Z] (U+0041 to\n\t\t\t// U+005A), or [a-z] (U+0061 to U+007A), […]\n\t\t\tif (\n\t\t\t\tcodeUnit >= 0x0080 ||\n\t\t\t\tcodeUnit == 0x002D ||\n\t\t\t\tcodeUnit == 0x005F ||\n\t\t\t\tcodeUnit >= 0x0030 && codeUnit <= 0x0039 ||\n\t\t\t\tcodeUnit >= 0x0041 && codeUnit <= 0x005A ||\n\t\t\t\tcodeUnit >= 0x0061 && codeUnit <= 0x007A\n\t\t\t) {\n\t\t\t\t// the character itself\n\t\t\t\tresult += string.charAt(index);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Otherwise, the escaped character.\n\t\t\t// https://drafts.csswg.org/cssom/#escape-a-character\n\t\t\tresult += '\\\\' + string.charAt(index);\n\n\t\t}\n\t\treturn result;\n\t};\n\n\tif (!root.CSS) {\n\t\troot.CSS = {};\n\t}\n\n\troot.CSS.escape = cssEscape;\n\treturn cssEscape;\n\n}));\n","module.exports = window[\"PropTypes\"];","module.exports = window[\"React\"];","module.exports = window[\"ReactDOM\"];","import _curry3 from \"./internal/_curry3.js\";\nimport assocPath from \"./assocPath.js\";\n\n/**\n * Makes a shallow clone of an object, setting or overriding the specified\n * property with the given value. Note that this copies and flattens prototype\n * properties onto the new object as well. All non-primitive properties are\n * copied by reference.\n *\n * @func\n * @memberOf R\n * @since v0.8.0\n * @category Object\n * @typedefn Idx = String | Int\n * @sig Idx -> a -> {k: v} -> {k: v}\n * @param {String|Number} prop The property name to set\n * @param {*} val The new value\n * @param {Object} obj The object to clone\n * @return {Object} A new object equivalent to the original except for the changed property.\n * @see R.dissoc, R.pick\n * @example\n *\n * R.assoc('c', 3, {a: 1, b: 2}); //=> {a: 1, b: 2, c: 3}\n *\n * R.assoc(4, 3, [1, 2]); //=> [1, 2, undefined, undefined, 3]\n * R.assoc(-1, 3, [1, 2]); //=> [1, 3]\n */\nvar assoc = /*#__PURE__*/_curry3(function assoc(prop, val, obj) {\n return assocPath([prop], val, obj);\n});\nexport default assoc;","import _curry3 from \"./internal/_curry3.js\";\nimport _isInteger from \"./internal/_isInteger.js\";\nimport _assoc from \"./internal/_assoc.js\";\nimport isNil from \"./isNil.js\";\nimport _prop from \"./internal/_prop.js\";\n\n/**\n * Makes a shallow clone of an object, setting or overriding the nodes required\n * to create the given path, and placing the specific value at the tail end of\n * that path. Note that this copies and flattens prototype properties onto the\n * new object as well. All non-primitive properties are copied by reference.\n *\n * @func\n * @memberOf R\n * @since v0.8.0\n * @category Object\n * @typedefn Idx = String | Int | Symbol\n * @sig [Idx] -> a -> {a} -> {a}\n * @param {Array} path the path to set\n * @param {*} val The new value\n * @param {Object} obj The object to clone\n * @return {Object} A new object equivalent to the original except along the specified path.\n * @see R.dissocPath\n * @example\n *\n * R.assocPath(['a', 'b', 'c'], 42, {a: {b: {c: 0}}}); //=> {a: {b: {c: 42}}}\n *\n * // Any missing or non-object keys in path will be overridden\n * R.assocPath(['a', 'b', 'c'], 42, {a: 5}); //=> {a: {b: {c: 42}}}\n * R.assocPath(['a', 1, 'c'], 42, {a: []}); // => {a: [undefined, {c: 42}]}\n * R.assocPath(['a', -1], 42, {a: [1, 2]}); // => {a: [1, 42]}\n */\nvar assocPath = /*#__PURE__*/_curry3(function assocPath(path, val, obj) {\n if (path.length === 0) {\n return val;\n }\n var idx = path[0];\n if (path.length > 1) {\n var nextObj = _prop(idx, obj);\n if (isNil(nextObj) || typeof nextObj !== 'object') {\n nextObj = _isInteger(path[1]) ? [] : {};\n }\n val = assocPath(Array.prototype.slice.call(path, 1), val, nextObj);\n }\n return _assoc(idx, val, obj);\n});\nexport default assocPath;","import _isArray from \"./_isArray.js\";\nimport _isInteger from \"./_isInteger.js\";\n\n/**\n * Makes a shallow clone of an object, setting or overriding the specified\n * property with the given value. Note that this copies and flattens prototype\n * properties onto the new object as well. All non-primitive properties are\n * copied by reference.\n *\n * @private\n * @param {String|Number} prop The property name to set\n * @param {*} val The new value\n * @param {Object|Array} obj The object to clone\n * @return {Object|Array} A new object equivalent to the original except for the changed property.\n */\nexport default function _assoc(prop, val, obj) {\n if (_isInteger(prop) && _isArray(obj)) {\n var _idx = prop < 0 ? obj.length + prop : prop;\n var arr = [].concat(obj);\n arr[_idx] = val;\n return arr;\n }\n var result = {};\n for (var p in obj) {\n result[p] = obj[p];\n }\n result[prop] = val;\n return result;\n}","import _arity from \"./internal/_arity.js\";\nimport _curry1 from \"./internal/_curry1.js\";\nimport _curry2 from \"./internal/_curry2.js\";\nimport _curryN from \"./internal/_curryN.js\";\n\n/**\n * Returns a curried equivalent of the provided function, with the specified\n * arity. The curried function has two unusual capabilities. First, its\n * arguments needn't be provided one at a time. If `g` is `R.curryN(3, f)`, the\n * following are equivalent:\n *\n * - `g(1)(2)(3)`\n * - `g(1)(2, 3)`\n * - `g(1, 2)(3)`\n * - `g(1, 2, 3)`\n *\n * Secondly, the special placeholder value [`R.__`](#__) may be used to specify\n * \"gaps\", allowing partial application of any combination of arguments,\n * regardless of their positions. If `g` is as above and `_` is [`R.__`](#__),\n * the following are equivalent:\n *\n * - `g(1, 2, 3)`\n * - `g(_, 2, 3)(1)`\n * - `g(_, _, 3)(1)(2)`\n * - `g(_, _, 3)(1, 2)`\n * - `g(_, 2)(1)(3)`\n * - `g(_, 2)(1, 3)`\n * - `g(_, 2)(_, 3)(1)`\n *\n * @func\n * @memberOf R\n * @since v0.5.0\n * @category Function\n * @sig Number -> (* -> a) -> (* -> a)\n * @param {Number} length The arity for the returned function.\n * @param {Function} fn The function to curry.\n * @return {Function} A new, curried function.\n * @see R.curry\n * @example\n *\n * const sumArgs = (...args) => R.sum(args);\n *\n * const curriedAddFourNumbers = R.curryN(4, sumArgs);\n * const f = curriedAddFourNumbers(1, 2);\n * const g = f(3);\n * g(4); //=> 10\n */\nvar curryN = /*#__PURE__*/_curry2(function curryN(length, fn) {\n if (length === 1) {\n return _curry1(fn);\n }\n return _arity(length, _curryN(length, [], fn));\n});\nexport default curryN;","export default function _arity(n, fn) {\n /* eslint-disable no-unused-vars */\n switch (n) {\n case 0:\n return function () {\n return fn.apply(this, arguments);\n };\n case 1:\n return function (a0) {\n return fn.apply(this, arguments);\n };\n case 2:\n return function (a0, a1) {\n return fn.apply(this, arguments);\n };\n case 3:\n return function (a0, a1, a2) {\n return fn.apply(this, arguments);\n };\n case 4:\n return function (a0, a1, a2, a3) {\n return fn.apply(this, arguments);\n };\n case 5:\n return function (a0, a1, a2, a3, a4) {\n return fn.apply(this, arguments);\n };\n case 6:\n return function (a0, a1, a2, a3, a4, a5) {\n return fn.apply(this, arguments);\n };\n case 7:\n return function (a0, a1, a2, a3, a4, a5, a6) {\n return fn.apply(this, arguments);\n };\n case 8:\n return function (a0, a1, a2, a3, a4, a5, a6, a7) {\n return fn.apply(this, arguments);\n };\n case 9:\n return function (a0, a1, a2, a3, a4, a5, a6, a7, a8) {\n return fn.apply(this, arguments);\n };\n case 10:\n return function (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) {\n return fn.apply(this, arguments);\n };\n default:\n throw new Error('First argument to _arity must be a non-negative integer no greater than ten');\n }\n}","export default function _arrayReduce(reducer, acc, list) {\n var index = 0;\n var length = list.length;\n while (index < length) {\n acc = reducer(acc, list[index]);\n index += 1;\n }\n return acc;\n}","import _isPlaceholder from \"./_isPlaceholder.js\";\n\n/**\n * Optimized internal one-arity curry function.\n *\n * @private\n * @category Function\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */\nexport default function _curry1(fn) {\n return function f1(a) {\n if (arguments.length === 0 || _isPlaceholder(a)) {\n return f1;\n } else {\n return fn.apply(this, arguments);\n }\n };\n}","import _curry1 from \"./_curry1.js\";\nimport _isPlaceholder from \"./_isPlaceholder.js\";\n\n/**\n * Optimized internal two-arity curry function.\n *\n * @private\n * @category Function\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */\nexport default function _curry2(fn) {\n return function f2(a, b) {\n switch (arguments.length) {\n case 0:\n return f2;\n case 1:\n return _isPlaceholder(a) ? f2 : _curry1(function (_b) {\n return fn(a, _b);\n });\n default:\n return _isPlaceholder(a) && _isPlaceholder(b) ? f2 : _isPlaceholder(a) ? _curry1(function (_a) {\n return fn(_a, b);\n }) : _isPlaceholder(b) ? _curry1(function (_b) {\n return fn(a, _b);\n }) : fn(a, b);\n }\n };\n}","import _curry1 from \"./_curry1.js\";\nimport _curry2 from \"./_curry2.js\";\nimport _isPlaceholder from \"./_isPlaceholder.js\";\n\n/**\n * Optimized internal three-arity curry function.\n *\n * @private\n * @category Function\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */\nexport default function _curry3(fn) {\n return function f3(a, b, c) {\n switch (arguments.length) {\n case 0:\n return f3;\n case 1:\n return _isPlaceholder(a) ? f3 : _curry2(function (_b, _c) {\n return fn(a, _b, _c);\n });\n case 2:\n return _isPlaceholder(a) && _isPlaceholder(b) ? f3 : _isPlaceholder(a) ? _curry2(function (_a, _c) {\n return fn(_a, b, _c);\n }) : _isPlaceholder(b) ? _curry2(function (_b, _c) {\n return fn(a, _b, _c);\n }) : _curry1(function (_c) {\n return fn(a, b, _c);\n });\n default:\n return _isPlaceholder(a) && _isPlaceholder(b) && _isPlaceholder(c) ? f3 : _isPlaceholder(a) && _isPlaceholder(b) ? _curry2(function (_a, _b) {\n return fn(_a, _b, c);\n }) : _isPlaceholder(a) && _isPlaceholder(c) ? _curry2(function (_a, _c) {\n return fn(_a, b, _c);\n }) : _isPlaceholder(b) && _isPlaceholder(c) ? _curry2(function (_b, _c) {\n return fn(a, _b, _c);\n }) : _isPlaceholder(a) ? _curry1(function (_a) {\n return fn(_a, b, c);\n }) : _isPlaceholder(b) ? _curry1(function (_b) {\n return fn(a, _b, c);\n }) : _isPlaceholder(c) ? _curry1(function (_c) {\n return fn(a, b, _c);\n }) : fn(a, b, c);\n }\n };\n}","import _arity from \"./_arity.js\";\nimport _isPlaceholder from \"./_isPlaceholder.js\";\n\n/**\n * Internal curryN function.\n *\n * @private\n * @category Function\n * @param {Number} length The arity of the curried function.\n * @param {Array} received An array of arguments received thus far.\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */\nexport default function _curryN(length, received, fn) {\n return function () {\n var combined = [];\n var argsIdx = 0;\n var left = length;\n var combinedIdx = 0;\n var hasPlaceholder = false;\n while (combinedIdx < received.length || argsIdx < arguments.length) {\n var result;\n if (combinedIdx < received.length && (!_isPlaceholder(received[combinedIdx]) || argsIdx >= arguments.length)) {\n result = received[combinedIdx];\n } else {\n result = arguments[argsIdx];\n argsIdx += 1;\n }\n combined[combinedIdx] = result;\n if (!_isPlaceholder(result)) {\n left -= 1;\n } else {\n hasPlaceholder = true;\n }\n combinedIdx += 1;\n }\n return !hasPlaceholder && left <= 0 ? fn.apply(this, combined) : _arity(Math.max(0, left), _curryN(length, combined, fn));\n };\n}","import _isArray from \"./_isArray.js\";\nimport _isTransformer from \"./_isTransformer.js\";\n\n/**\n * Returns a function that dispatches with different strategies based on the\n * object in list position (last argument). If it is an array, executes [fn].\n * Otherwise, if it has a function with one of the given method names, it will\n * execute that function (functor case). Otherwise, if it is a transformer,\n * uses transducer created by [transducerCreator] to return a new transformer\n * (transducer case).\n * Otherwise, it will default to executing [fn].\n *\n * @private\n * @param {Array} methodNames properties to check for a custom implementation\n * @param {Function} transducerCreator transducer factory if object is transformer\n * @param {Function} fn default ramda implementation\n * @return {Function} A function that dispatches on object in list position\n */\nexport default function _dispatchable(methodNames, transducerCreator, fn) {\n return function () {\n if (arguments.length === 0) {\n return fn();\n }\n var obj = arguments[arguments.length - 1];\n if (!_isArray(obj)) {\n var idx = 0;\n while (idx < methodNames.length) {\n if (typeof obj[methodNames[idx]] === 'function') {\n return obj[methodNames[idx]].apply(obj, Array.prototype.slice.call(arguments, 0, -1));\n }\n idx += 1;\n }\n if (_isTransformer(obj)) {\n var transducer = transducerCreator.apply(null, Array.prototype.slice.call(arguments, 0, -1));\n return transducer(obj);\n }\n }\n return fn.apply(this, arguments);\n };\n}","export default function _isTransformer(obj) {\n return obj != null && typeof obj['@@transducer/step'] === 'function';\n}","export default function _has(prop, obj) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}","/**\n * Tests whether or not an object is an array.\n *\n * @private\n * @param {*} val The object to test.\n * @return {Boolean} `true` if `val` is an array, `false` otherwise.\n * @example\n *\n * _isArray([]); //=> true\n * _isArray(null); //=> false\n * _isArray({}); //=> false\n */\nexport default Array.isArray || function _isArray(val) {\n return val != null && val.length >= 0 && Object.prototype.toString.call(val) === '[object Array]';\n};","/**\n * Determine if the passed argument is an integer.\n *\n * @private\n * @param {*} n\n * @category Type\n * @return {Boolean}\n */\nexport default Number.isInteger || function _isInteger(n) {\n return n << 0 === n;\n};","export default function _isPlaceholder(a) {\n return a != null && typeof a === 'object' && a['@@functional/placeholder'] === true;\n}","export default function _map(fn, functor) {\n var idx = 0;\n var len = functor.length;\n var result = Array(len);\n while (idx < len) {\n result[idx] = fn(functor[idx]);\n idx += 1;\n }\n return result;\n}","export default function _nth(offset, list) {\n var idx = offset < 0 ? list.length + offset : offset;\n return list[idx];\n}","import _isInteger from \"./_isInteger.js\";\nimport _nth from \"./_nth.js\";\nfunction _prop(p, obj) {\n if (obj == null) {\n return;\n }\n return _isInteger(p) ? _nth(p, obj) : obj[p];\n}\nexport default _prop;","export default {\n init: function () {\n return this.xf['@@transducer/init']();\n },\n result: function (result) {\n return this.xf['@@transducer/result'](result);\n }\n};","import _xfBase from \"./_xfBase.js\";\nvar XMap = /*#__PURE__*/function () {\n function XMap(f, xf) {\n this.xf = xf;\n this.f = f;\n }\n XMap.prototype['@@transducer/init'] = _xfBase.init;\n XMap.prototype['@@transducer/result'] = _xfBase.result;\n XMap.prototype['@@transducer/step'] = function (result, input) {\n return this.xf['@@transducer/step'](result, this.f(input));\n };\n return XMap;\n}();\nvar _xmap = function _xmap(f) {\n return function (xf) {\n return new XMap(f, xf);\n };\n};\nexport default _xmap;","import _curry1 from \"./internal/_curry1.js\";\n\n/**\n * Checks if the input value is `null` or `undefined`.\n *\n * @func\n * @memberOf R\n * @since v0.9.0\n * @category Type\n * @sig * -> Boolean\n * @param {*} x The value to test.\n * @return {Boolean} `true` if `x` is `undefined` or `null`, otherwise `false`.\n * @example\n *\n * R.isNil(null); //=> true\n * R.isNil(undefined); //=> true\n * R.isNil(0); //=> false\n * R.isNil([]); //=> false\n */\nvar isNil = /*#__PURE__*/_curry1(function isNil(x) {\n return x == null;\n});\nexport default isNil;","import _has from \"./_has.js\";\nvar toString = Object.prototype.toString;\nvar _isArguments = /*#__PURE__*/function () {\n return toString.call(arguments) === '[object Arguments]' ? function _isArguments(x) {\n return toString.call(x) === '[object Arguments]';\n } : function _isArguments(x) {\n return _has('callee', x);\n };\n}();\nexport default _isArguments;","import _curry1 from \"./internal/_curry1.js\";\nimport _has from \"./internal/_has.js\";\nimport _isArguments from \"./internal/_isArguments.js\";\n\n// cover IE < 9 keys issues\nvar hasEnumBug = ! /*#__PURE__*/{\n toString: null\n}.propertyIsEnumerable('toString');\nvar nonEnumerableProps = ['constructor', 'valueOf', 'isPrototypeOf', 'toString', 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];\n// Safari bug\nvar hasArgsEnumBug = /*#__PURE__*/function () {\n 'use strict';\n\n return arguments.propertyIsEnumerable('length');\n}();\nvar contains = function contains(list, item) {\n var idx = 0;\n while (idx < list.length) {\n if (list[idx] === item) {\n return true;\n }\n idx += 1;\n }\n return false;\n};\n\n/**\n * Returns a list containing the names of all the enumerable own properties of\n * the supplied object.\n * Note that the order of the output array is not guaranteed to be consistent\n * across different JS platforms.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category Object\n * @sig {k: v} -> [k]\n * @param {Object} obj The object to extract properties from\n * @return {Array} An array of the object's own properties.\n * @see R.keysIn, R.values, R.toPairs\n * @example\n *\n * R.keys({a: 1, b: 2, c: 3}); //=> ['a', 'b', 'c']\n */\nvar keys = typeof Object.keys === 'function' && !hasArgsEnumBug ? /*#__PURE__*/_curry1(function keys(obj) {\n return Object(obj) !== obj ? [] : Object.keys(obj);\n}) : /*#__PURE__*/_curry1(function keys(obj) {\n if (Object(obj) !== obj) {\n return [];\n }\n var prop, nIdx;\n var ks = [];\n var checkArgsLength = hasArgsEnumBug && _isArguments(obj);\n for (prop in obj) {\n if (_has(prop, obj) && (!checkArgsLength || prop !== 'length')) {\n ks[ks.length] = prop;\n }\n }\n if (hasEnumBug) {\n nIdx = nonEnumerableProps.length - 1;\n while (nIdx >= 0) {\n prop = nonEnumerableProps[nIdx];\n if (_has(prop, obj) && !contains(ks, prop)) {\n ks[ks.length] = prop;\n }\n nIdx -= 1;\n }\n }\n return ks;\n});\nexport default keys;","import _arrayReduce from \"./internal/_arrayReduce.js\";\nimport _curry2 from \"./internal/_curry2.js\";\nimport _dispatchable from \"./internal/_dispatchable.js\";\nimport _map from \"./internal/_map.js\";\nimport _xmap from \"./internal/_xmap.js\";\nimport curryN from \"./curryN.js\";\nimport keys from \"./keys.js\";\n\n/**\n * Takes a function and\n * a [functor](https://github.com/fantasyland/fantasy-land#functor),\n * applies the function to each of the functor's values, and returns\n * a functor of the same shape.\n *\n * Ramda provides suitable `map` implementations for `Array` and `Object`,\n * so this function may be applied to `[1, 2, 3]` or `{x: 1, y: 2, z: 3}`.\n *\n * Dispatches to the `map` method of the second argument, if present.\n *\n * Acts as a transducer if a transformer is given in list position.\n *\n * Also treats functions as functors and will compose them together.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig Functor f => (a -> b) -> f a -> f b\n * @param {Function} fn The function to be called on every element of the input `list`.\n * @param {Array} list The list to be iterated over.\n * @return {Array} The new list.\n * @see R.transduce, R.addIndex, R.pluck, R.project\n * @example\n *\n * const double = x => x * 2;\n *\n * R.map(double, [1, 2, 3]); //=> [2, 4, 6]\n *\n * R.map(double, {x: 1, y: 2, z: 3}); //=> {x: 2, y: 4, z: 6}\n * @symb R.map(f, [a, b]) = [f(a), f(b)]\n * @symb R.map(f, { x: a, y: b }) = { x: f(a), y: f(b) }\n * @symb R.map(f, functor_o) = functor_o.map(f)\n */\nvar map = /*#__PURE__*/_curry2( /*#__PURE__*/_dispatchable(['fantasy-land/map', 'map'], _xmap, function map(fn, functor) {\n switch (Object.prototype.toString.call(functor)) {\n case '[object Function]':\n return curryN(functor.length, function () {\n return fn.call(this, functor.apply(this, arguments));\n });\n case '[object Object]':\n return _arrayReduce(function (acc, key) {\n acc[key] = fn(functor[key]);\n return acc;\n }, {}, keys(functor));\n default:\n return _map(fn, functor);\n }\n}));\nexport default map;","import _arity from \"./internal/_arity.js\";\nimport _curry1 from \"./internal/_curry1.js\";\n\n/**\n * Accepts a function `fn` and returns a function that guards invocation of\n * `fn` such that `fn` can only ever be called once, no matter how many times\n * the returned function is invoked. The first value calculated is returned in\n * subsequent invocations.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category Function\n * @sig (a... -> b) -> (a... -> b)\n * @param {Function} fn The function to wrap in a call-only-once wrapper.\n * @return {Function} The wrapped function.\n * @example\n *\n * const addOneOnce = R.once(x => x + 1);\n * addOneOnce(10); //=> 11\n * addOneOnce(addOneOnce(50)); //=> 11\n */\nvar once = /*#__PURE__*/_curry1(function once(fn) {\n var called = false;\n var result;\n return _arity(fn.length, function () {\n if (called) {\n return result;\n }\n called = true;\n result = fn.apply(this, arguments);\n return result;\n });\n});\nexport default once;","import _curry2 from \"./internal/_curry2.js\";\nimport map from \"./map.js\";\nimport prop from \"./prop.js\";\n\n/**\n * Returns a new list by plucking the same named property off all objects in\n * the list supplied.\n *\n * `pluck` will work on\n * any [functor](https://github.com/fantasyland/fantasy-land#functor) in\n * addition to arrays, as it is equivalent to `R.map(R.prop(k), f)`.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig Functor f => k -> f {k: v} -> f v\n * @param {Number|String} key The key name to pluck off of each object.\n * @param {Array} f The array or functor to consider.\n * @return {Array} The list of values for the given key.\n * @see R.project, R.prop, R.props\n * @example\n *\n * var getAges = R.pluck('age');\n * getAges([{name: 'fred', age: 29}, {name: 'wilma', age: 27}]); //=> [29, 27]\n *\n * R.pluck(0, [[1, 2], [3, 4]]); //=> [1, 3]\n * R.pluck('val', {a: {val: 3}, b: {val: 5}}); //=> {a: 3, b: 5}\n * @symb R.pluck('x', [{x: 1, y: 2}, {x: 3, y: 4}, {x: 5, y: 6}]) = [1, 3, 5]\n * @symb R.pluck(0, [[1, 2], [3, 4], [5, 6]]) = [1, 3, 5]\n */\nvar pluck = /*#__PURE__*/_curry2(function pluck(p, list) {\n return map(prop(p), list);\n});\nexport default pluck;","import _curry2 from \"./internal/_curry2.js\";\nimport _prop from \"./internal/_prop.js\";\n\n/**\n * Returns a function that when supplied an object returns the indicated\n * property of that object, if it exists.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category Object\n * @typedefn Idx = String | Int | Symbol\n * @sig Idx -> {s: a} -> a | Undefined\n * @param {String|Number} p The property name or array index\n * @param {Object} obj The object to query\n * @return {*} The value at `obj.p`.\n * @see R.path, R.props, R.pluck, R.project, R.nth\n * @example\n *\n * R.prop('x', {x: 100}); //=> 100\n * R.prop('x', {}); //=> undefined\n * R.prop(0, [100]); //=> 100\n * R.compose(R.inc, R.prop('x'))({ x: 3 }) //=> 4\n */\n\nvar prop = /*#__PURE__*/_curry2(_prop);\nexport default prop;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// wrap a concatenated module body as a lazy, memoized accessor; mod is\n// set before the body runs so re-entrant calls (require cycles) observe\n// the partial exports like Node.js\n__webpack_require__.cw = function(body) {\n\tvar mod;\n\treturn function() {\n\t\tif (body) {\n\t\t\tvar fn = body;\n\t\t\tbody = 0;\n\t\t\tmod = { exports: {} };\n\t\t\tfn.call(mod.exports, mod, mod.exports);\n\t\t}\n\t\treturn mod.exports;\n\t};\n};","// define getter/value functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tif(Array.isArray(definition)) {\n\t\tvar i = 0;\n\t\twhile(i < definition.length) {\n\t\t\tvar key = definition[i++];\n\t\t\tvar binding = definition[i++];\n\t\t\tvar descriptor = binding === 0 ? { enumerable: true, value: definition[i++] } : { enumerable: true, get: binding };\n\t\t\tif(!__webpack_require__.o(exports, key)) Object.defineProperty(exports, key, descriptor);\n\t\t}\n\t} else {\n\t\tfor(var key in definition) {\n\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t\t}\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = function(chunkId) {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce(function(promises, key) {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = function(chunkId) { return {\"214\":\"async-table\",\"254\":\"async-highlight\",\"404\":\"async-export\"}[chunkId] + \".js\"; };","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); };","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT')\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && (!scriptUrl || !/^https?:/.test(scriptUrl))) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/^blob:|[?#].*$/g, \"\").replace(/\\/[^/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","var getCurrentScript = function() {\n var script = document.currentScript;\n if (!script) {\n /* Shim for IE11 and below */\n /* Do not take into account async scripts and inline scripts */\n\n var doc_scripts = document.getElementsByTagName('script');\n var scripts = [];\n\n for (var i = 0; i < doc_scripts.length; i++) {\n scripts.push(doc_scripts[i]);\n }\n\n scripts = scripts.filter(function(s) { return !s.async && !s.text && !s.textContent; });\n script = scripts.slice(-1)[0];\n }\n\n return script;\n};\n\nvar isLocalScript = function(script) {\n return /\\/_dash-component-suites\\//.test(script.src);\n};\n\nObject.defineProperty(__webpack_require__, 'p', {\n get: (function () {\n var script = getCurrentScript();\n\n var url = script.src.split('/').slice(0, -1).join('/') + '/';\n\n return function() {\n return url;\n };\n })()\n});\n\nif (typeof jsonpScriptSrc !== 'undefined') {\n var __jsonpScriptSrc__ = jsonpScriptSrc;\n jsonpScriptSrc = function(chunkId) {\n var script = getCurrentScript();\n var isLocal = isLocalScript(script);\n\n var src = __jsonpScriptSrc__(chunkId);\n\n if(!isLocal) {\n return src;\n }\n\n var srcFragments = src.split('/');\n var fileFragments = srcFragments.slice(-1)[0].split('.');\n\n fileFragments.splice(1, 0, \"v7_5_2m1792768334\");\n srcFragments.splice(-1, 1, fileFragments.join('.'))\n\n return srcFragments.join('/');\n };\n}\n","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t23: 0\n};\n\n__webpack_require__.f.j = function(chunkId, promises) {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise(function(resolve, reject) { installedChunkData = installedChunks[chunkId] = [resolve, reject]; });\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = function(event) {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\terror.event = event;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(__webpack_require__.p + __webpack_require__.u(chunkId), loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkdash_table\"] = self[\"webpackChunkdash_table\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;","import 'css.escape'; // polyfill\nimport Environment from 'core/environment';\nimport Logger from 'core/Logger';\nimport DataTable from 'dash-table/dash/DataTable';\nLogger.setDebugLevel(Environment.debugLevel);\nLogger.setLogLevel(Environment.logLevel);\nexport { DataTable };\n"],"names":["inProgress","dataWebpackPrefix","e","window","module","exports","__webpack_require__","n","t","r","o","i","l","call","m","c","d","Object","defineProperty","enumerable","get","Symbol","toStringTag","value","__esModule","create","bind","default","prototype","hasOwnProperty","p","s","u","a","done","Promise","resolve","then","this","arguments","apply","isReady","lazy","setTimeout","regeneratorRuntime","mark","wrap","prev","next","stop","_dashprivate_isLazyComponentReady","f","length","configurable","writable","key","TypeError","dispatchEvent","CustomEvent","addEventListener","removeEventListener","DebugLevel","LogLevel","Logger_DebugLevel","Logger_LogLevel","LogString","TRACE","INFO","WARNING","ERROR","FATAL","NONE","DEBUG","__logLevel","__debugLevel","logFn","level","currentLevel","fn","console","log","warn","error","Error","concat","prefix","toUpperCase","logger","setDebugLevel","setLogLevel","defineProperties","trace","info","warning","fatal","debug","freeze","Logger","CookieStorage","_classCallCheck","id","domain","undefined","path","enabled","expires","Date","now","toUTCString","document","cookie","toLowerCase","split","map","fragments","trim","find","toLocaleLowerCase","entry","delete","R","ret","indexOf","DASH_DEBUG","DASH_LOG","Environment","_createClass","URL","constructor","location","href","searchParams","_activeEdge","_supportsCssVariables","_Environment","_defineProperty","Boolean","_window$CSS","CSS","_window$CSS$supports","supports","LazyLoader","hljs","result","all","es_zipWith","A","b","len","Math","min","rv","Array","idx","DataTable","_Component","_callSuper","_inherits","React","Suspense","fallback","RealDataTable","props","Component","asyncDecorator","table","propTypes","data","PropTypes","columns","isRequired","name","type","presentation","selectable","clearable","deletable","editable","hideable","renamable","filter_options","case","placeholder_text","format","locale","symbol","decimal","group","grouping","numerals","percent","separate_4digits","nully","specifier","on_change","action","failure","sort_as_null","validation","allow_null","allow_YY","fixed_columns","headers","fixed_rows","column_selectable","cell_selectable","row_selectable","row_deletable","active_cell","row","column","row_id","column_id","selected_cells","selected_rows","selected_columns","selected_row_ids","start_cell","end_cell","data_previous","hidden_columns","is_focused","merge_duplicate_headers","data_timestamp","include_headers_on_copy_paste","export_columns","export_format","export_headers","page_action","page_current","page_count","page_size","filter_query","filter_action","operator","sort_action","sort_mode","sort_by","direction","dropdown","options","label","dropdown_conditional","if","dropdown_data","tooltip","delay","duration","use_with","tooltip_conditional","row_index","tooltip_data","tooltip_header","tooltip_delay","tooltip_duration","locale_format","style_as_list_view","fill_width","markdown_options","link_target","html","css","selector","rule","style_table","style_cell","style_data","style_filter","style_header","style_cell_conditional","column_type","style_data_conditional","state","column_editable","style_filter_conditional","style_header_conditional","header_index","virtualization","derived_filter_query_structure","derived_viewport_data","derived_viewport_indices","derived_viewport_row_ids","derived_viewport_selected_columns","derived_viewport_selected_rows","derived_viewport_selected_row_ids","derived_virtual_data","derived_virtual_indices","derived_virtual_row_ids","derived_virtual_selected_rows","derived_virtual_selected_row_ids","setProps","loading_state","is_loading","prop_name","component_name","persistence","persisted_props","persistence_type","persistenceTransforms","extract","propValue","storedValue","defaultProps","root","g","escape","cssEscape","codeUnit","string","String","index","firstCodeUnit","charCodeAt","toString","charAt","factory","assoc","_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__","prop","val","obj","_assocPath_js__WEBPACK_IMPORTED_MODULE_1__","__webpack_exports__","es_assocPath","_curry3","assocPath","nextObj","_prop","isNil","_isInteger","slice","_isArray","_idx","arr","_assoc","curryN","_internal_curry2_js__WEBPACK_IMPORTED_MODULE_2__","_internal_curry1_js__WEBPACK_IMPORTED_MODULE_1__","_internal_arity_js__WEBPACK_IMPORTED_MODULE_0__","_internal_curryN_js__WEBPACK_IMPORTED_MODULE_3__","_arity","a0","a1","a2","a3","a4","a5","a6","a7","a8","a9","_arrayReduce","reducer","acc","list","_curry1","f1","_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_0__","_curry2","f2","_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_1__","_curry1_js__WEBPACK_IMPORTED_MODULE_0__","_b","_a","f3","_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_2__","_curry2_js__WEBPACK_IMPORTED_MODULE_1__","_c","_curryN","received","combined","argsIdx","left","combinedIdx","hasPlaceholder","_arity_js__WEBPACK_IMPORTED_MODULE_0__","max","_dispatchable","methodNames","transducerCreator","_isTransformer","transducer","_has","isArray","Number","isInteger","_isPlaceholder","_map","functor","_nth","offset","_isInteger_js__WEBPACK_IMPORTED_MODULE_0__","_nth_js__WEBPACK_IMPORTED_MODULE_1__","init","xf","XMap","_xfBase_js__WEBPACK_IMPORTED_MODULE_0__","input","x","_isArguments_toString","_isArguments","internal_isArguments","hasEnumBug","propertyIsEnumerable","nonEnumerableProps","hasArgsEnumBug","contains","item","es_keys","keys","nIdx","ks","checkArgsLength","_internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__","_internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_2__","_internal_xmap_js__WEBPACK_IMPORTED_MODULE_4__","_curryN_js__WEBPACK_IMPORTED_MODULE_5__","_internal_arrayReduce_js__WEBPACK_IMPORTED_MODULE_0__","_keys_js__WEBPACK_IMPORTED_MODULE_6__","_internal_map_js__WEBPACK_IMPORTED_MODULE_3__","once","called","pluck","_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__","_map_js__WEBPACK_IMPORTED_MODULE_1__","_prop_js__WEBPACK_IMPORTED_MODULE_2__","_internal_prop_js__WEBPACK_IMPORTED_MODULE_1__","__webpack_module_cache__","moduleId","cachedModule","__webpack_modules__","getter","cw","body","mod","definition","binding","descriptor","chunkId","reduce","promises","globalThis","Function","url","push","script","needAttach","scripts","getElementsByTagName","getAttribute","createElement","charset","nc","setAttribute","src","onScriptComplete","event","onerror","onload","clearTimeout","timeout","doneFns","parentNode","removeChild","forEach","target","head","appendChild","scriptUrl","importScripts","currentScript","tagName","test","replace","getCurrentScript","doc_scripts","filter","async","text","textContent","join","jsonpScriptSrc","__jsonpScriptSrc__","isLocal","srcFragments","fileFragments","splice","installedChunks","j","installedChunkData","promise","reject","errorType","realSrc","message","request","webpackJsonpCallback","parentChunkLoadingFunction","chunkIds","moreModules","runtime","some","chunkLoadingGlobal","self","debugLevel","logLevel"],"sourceRoot":""} \ No newline at end of file diff --git a/dash/dash_table/demo.js b/dash/dash_table/demo.js index 5fd30c04c5..e34b76c509 100644 --- a/dash/dash_table/demo.js +++ b/dash/dash_table/demo.js @@ -1,2 +1,2 @@ -!function(){var t,n,e={4572:function(t,n,e){"use strict";e(2419),e(8128),e(5777),e(2681),e(5240),e(1368),e(6073),e(7739),e(4897),e(4925),e(1243),e(8978),e(3415),e(5300)},5652:function(t,n,e){e(4572)},5300:function(t){var n=function(t){"use strict";var n,e=Object.prototype,r=e.hasOwnProperty,o=Object.defineProperty||function(t,n,e){t[n]=e.value},i="function"==typeof Symbol?Symbol:{},u=i.iterator||"@@iterator",a=i.asyncIterator||"@@asyncIterator",c=i.toStringTag||"@@toStringTag";function f(t,n,e){return Object.defineProperty(t,n,{value:e,enumerable:!0,configurable:!0,writable:!0}),t[n]}try{f({},"")}catch(t){f=function(t,n,e){return t[n]=e}}function s(t,n,e,r){var i=n&&n.prototype instanceof g?n:g,u=Object.create(i.prototype),a=new k(r||[]);return o(u,"_invoke",{value:P(t,e,a)}),u}function l(t,n,e){try{return{type:"normal",arg:t.call(n,e)}}catch(t){return{type:"throw",arg:t}}}t.wrap=s;var p="suspendedStart",d="suspendedYield",v="executing",h="completed",y={};function g(){}function b(){}function m(){}var w={};f(w,u,function(){return this});var _=Object.getPrototypeOf,O=_&&_(_(N([])));O&&O!==e&&r.call(O,u)&&(w=O);var x=m.prototype=g.prototype=Object.create(w);function A(t){["next","throw","return"].forEach(function(n){f(t,n,function(t){return this._invoke(n,t)})})}function S(t,n){function e(o,i,u,a){var c=l(t[o],t,i);if("throw"!==c.type){var f=c.arg,s=f.value;return s&&"object"==typeof s&&r.call(s,"__await")?n.resolve(s.__await).then(function(t){e("next",t,u,a)},function(t){e("throw",t,u,a)}):n.resolve(s).then(function(t){f.value=t,u(f)},function(t){return e("throw",t,u,a)})}a(c.arg)}var i;o(this,"_invoke",{value:function(t,r){function o(){return new n(function(n,o){e(t,r,n,o)})}return i=i?i.then(o,o):o()}})}function P(t,n,e){var r=p;return function(o,i){if(r===v)throw new Error("Generator is already running");if(r===h){if("throw"===o)throw i;return C()}for(e.method=o,e.arg=i;;){var u=e.delegate;if(u){var a=E(u,e);if(a){if(a===y)continue;return a}}if("next"===e.method)e.sent=e._sent=e.arg;else if("throw"===e.method){if(r===p)throw r=h,e.arg;e.dispatchException(e.arg)}else"return"===e.method&&e.abrupt("return",e.arg);r=v;var c=l(t,n,e);if("normal"===c.type){if(r=e.done?h:d,c.arg===y)continue;return{value:c.arg,done:e.done}}"throw"===c.type&&(r=h,e.method="throw",e.arg=c.arg)}}}function E(t,e){var r=e.method,o=t.iterator[r];if(o===n)return e.delegate=null,"throw"===r&&t.iterator.return&&(e.method="return",e.arg=n,E(t,e),"throw"===e.method)||"return"!==r&&(e.method="throw",e.arg=new TypeError("The iterator does not provide a '"+r+"' method")),y;var i=l(o,t.iterator,e.arg);if("throw"===i.type)return e.method="throw",e.arg=i.arg,e.delegate=null,y;var u=i.arg;return u?u.done?(e[t.resultName]=u.value,e.next=t.nextLoc,"return"!==e.method&&(e.method="next",e.arg=n),e.delegate=null,y):u:(e.method="throw",e.arg=new TypeError("iterator result is not an object"),e.delegate=null,y)}function j(t){var n={tryLoc:t[0]};1 in t&&(n.catchLoc=t[1]),2 in t&&(n.finallyLoc=t[2],n.afterLoc=t[3]),this.tryEntries.push(n)}function T(t){var n=t.completion||{};n.type="normal",delete n.arg,t.completion=n}function k(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(j,this),this.reset(!0)}function N(t){if(t){var e=t[u];if(e)return e.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var o=-1,i=function e(){for(;++o=0;--i){var u=this.tryEntries[i],a=u.completion;if("root"===u.tryLoc)return o("end");if(u.tryLoc<=this.prev){var c=r.call(u,"catchLoc"),f=r.call(u,"finallyLoc");if(c&&f){if(this.prev=0;--e){var o=this.tryEntries[e];if(o.tryLoc<=this.prev&&r.call(o,"finallyLoc")&&this.prev=0;--n){var e=this.tryEntries[n];if(e.finallyLoc===t)return this.complete(e.completion,e.afterLoc),T(e),y}},catch:function(t){for(var n=this.tryEntries.length-1;n>=0;--n){var e=this.tryEntries[n];if(e.tryLoc===t){var r=e.completion;if("throw"===r.type){var o=r.arg;T(e)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(t,e,r){return this.delegate={iterator:N(t),resultName:e,nextLoc:r},"next"===this.method&&(this.arg=n),y}},t}(t.exports);try{regeneratorRuntime=n}catch(t){"object"==typeof globalThis?globalThis.regeneratorRuntime=n:Function("r","regeneratorRuntime = r")(n)}},4296:function(t,n,e){var r;window,t.exports=(r=e(1609),function(t){var n={};function e(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,e),o.l=!0,o.exports}return e.m=t,e.c=n,e.d=function(t,n,r){e.o(t,n)||Object.defineProperty(t,n,{enumerable:!0,get:r})},e.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},e.t=function(t,n){if(1&n&&(t=e(t)),8&n)return t;if(4&n&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(e.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&n&&"string"!=typeof t)for(var o in t)e.d(r,o,function(n){return t[n]}.bind(null,o));return r},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,n){return Object.prototype.hasOwnProperty.call(t,n)},e.p="",e(e.s=1)}([function(t,n){t.exports=r},function(t,n,e){"use strict";e.r(n),e.d(n,"asyncDecorator",function(){return u}),e.d(n,"inheritAsyncDecorator",function(){return a}),e.d(n,"isReady",function(){return c}),e.d(n,"History",function(){return l});var r=e(0);function o(t,n,e,r,o,i,u){try{var a=t[i](u),c=a.value}catch(t){return void e(t)}a.done?n(c):Promise.resolve(c).then(r,o)}function i(t){return function(){var n=this,e=arguments;return new Promise(function(r,i){var u=t.apply(n,e);function a(t){o(u,r,i,a,c,"next",t)}function c(t){o(u,r,i,a,c,"throw",t)}a(void 0)})}}var u=function(t,n){var e,o={isReady:new Promise(function(t){e=t}),get:Object(r.lazy)(function(){return Promise.resolve(n()).then(function(t){return setTimeout(i(regeneratorRuntime.mark(function t(){return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,e(!0);case 2:o.isReady=!0;case 3:case"end":return t.stop()}},t)})),0),t})})};return Object.defineProperty(t,"_dashprivate_isLazyComponentReady",{get:function(){return o.isReady}}),o.get},a=function(t,n){Object.defineProperty(t,"_dashprivate_isLazyComponentReady",{get:function(){return c(n)}})},c=function(t){return t&&t._dashprivate_isLazyComponentReady};function f(t,n){for(var e=0;e1&&void 0!==arguments[1]?arguments[1]:"",r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"/";if(t.enabled()){var o=new Date(Date.now()-864e5).toUTCString();document.cookie="".concat(n,"=;expires=").concat(o,";domain=").concat(e,";path=").concat(r)}}},{key:"get",value:function(n){if(n.length&&t.enabled())return n=n.toLowerCase(),(document.cookie.split(";").map(function(t){var n=t.split("=");return{id:n[0].trim(),value:n[1]}}).find(function(t){return n===t.id.toLocaleLowerCase()})||{}).value}},{key:"set",value:function(n,e){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"/";if(t.enabled()){var i=new Date(Date.now()+63072e7).toUTCString(),u="".concat(n,"=").concat(e,";expires=").concat(i,";domain=").concat(r,";path=").concat(o);t.get(n)&&t.delete(n,r,o),document.cookie=u}}}],null&&i(n.prototype,null),e&&i(n,e),Object.defineProperty(n,"prototype",{writable:!1}),n;var n,e}();a=s,c="enabled",f=r.A(function(){try{document.cookie="cookietest=1";var t=-1!==document.cookie.indexOf("cookietest=");return document.cookie="cookietest=1; expires=Thu, 01-Jan-1970 00:00:01 GMT",t}catch(t){return!1}}),(c=u(c))in a?Object.defineProperty(a,c,{value:f,enumerable:!0,configurable:!0,writable:!0}):a[c]=f;var l,p,d,v=e(2314);function h(t){return h="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},h(t)}function y(t,n){for(var e=0;e2?arguments[2]:void 0,s=Math.min((void 0===f?u:o(f,u))-c,u-a),l=1;for(c0;)c in e?e[a]=e[c]:delete e[a],a+=l,c+=l;return e}},3183:function(t,n,e){"use strict";var r=e(8270),o=e(157),i=e(1485);t.exports=function(t){for(var n=r(this),e=i(n.length),u=arguments.length,a=o(u>1?arguments[1]:void 0,e),c=u>2?arguments[2]:void 0,f=void 0===c?e:o(c,e);f>a;)n[a++]=t;return n}},1464:function(t,n,e){var r=e(7221),o=e(1485),i=e(157);t.exports=function(t){return function(n,e,u){var a,c=r(n),f=o(c.length),s=i(u,f);if(t&&e!=e){for(;f>s;)if((a=c[s++])!=a)return!0}else for(;f>s;s++)if((t||s in c)&&c[s]===e)return t||s||0;return!t&&-1}}},6179:function(t,n,e){var r=e(5052),o=e(1249),i=e(8270),u=e(1485),a=e(3191);t.exports=function(t,n){var e=1==t,c=2==t,f=3==t,s=4==t,l=6==t,p=5==t||l,d=n||a;return function(n,a,v){for(var h,y,g=i(n),b=o(g),m=r(a,v,3),w=u(b.length),_=0,O=e?d(n,w):c?d(n,0):void 0;w>_;_++)if((p||_ in b)&&(y=m(h=b[_],_,g),t))if(e)O[_]=y;else if(y)switch(t){case 3:return!0;case 5:return h;case 6:return _;case 2:O.push(h)}else if(s)return!1;return l?-1:f||s?s:O}}},6543:function(t,n,e){var r=e(3387),o=e(8270),i=e(1249),u=e(1485);t.exports=function(t,n,e,a,c){r(n);var f=o(t),s=i(f),l=u(f.length),p=c?l-1:0,d=c?-1:1;if(e<2)for(;;){if(p in s){a=s[p],p+=d;break}if(p+=d,c?p<0:l<=p)throw TypeError("Reduce of empty array with no initial value")}for(;c?p>=0:l>p;p+=d)p in s&&(a=n(a,s[p],p,f));return a}},3606:function(t,n,e){var r=e(3305),o=e(7981),i=e(7574)("species");t.exports=function(t){var n;return o(t)&&("function"!=typeof(n=t.constructor)||n!==Array&&!o(n.prototype)||(n=void 0),r(n)&&null===(n=n[i])&&(n=void 0)),void 0===n?Array:n}},3191:function(t,n,e){var r=e(3606);t.exports=function(t,n){return new(r(t))(n)}},5538:function(t,n,e){"use strict";var r=e(3387),o=e(3305),i=e(4877),u=[].slice,a={};t.exports=Function.bind||function(t){var n=r(this),e=u.call(arguments,1),c=function(){var r=e.concat(u.call(arguments));return this instanceof c?function(t,n,e){if(!(n in a)){for(var r=[],o=0;o1?arguments[1]:void 0,3);e=e?e.n:this._f;)for(r(e.v,e.k,this);e&&e.r;)e=e.p},has:function(t){return!!y(v(this,n),t)}}),p&&r(s.prototype,"size",{get:function(){return v(this,n)[h]}}),s},def:function(t,n,e){var r,o,i=y(t,n);return i?i.v=e:(t._l=i={i:o=d(n,!0),k:n,v:e,p:r=t._l,n:void 0,r:!1},t._f||(t._f=i),r&&(r.n=i),t[h]++,"F"!==o&&(t._i[o]=i)),t},getEntry:y,setStrong:function(t,n,e){f(t,n,function(t,e){this._t=v(t,n),this._k=e,this._l=void 0},function(){for(var t=this,n=t._k,e=t._l;e&&e.r;)e=e.p;return t._t&&(t._l=e=e?e.n:t._t._f)?s(0,"keys"==n?e.k:"values"==n?e.v:[e.k,e.v]):(t._t=void 0,s(1))},e?"entries":"values",!e,!0),l(n)}}},9882:function(t,n,e){"use strict";var r=e(6065),o=e(2988).getWeak,i=e(4228),u=e(3305),a=e(6440),c=e(8790),f=e(6179),s=e(7917),l=e(2888),p=f(5),d=f(6),v=0,h=function(t){return t._l||(t._l=new y)},y=function(){this.a=[]},g=function(t,n){return p(t.a,function(t){return t[0]===n})};y.prototype={get:function(t){var n=g(this,t);if(n)return n[1]},has:function(t){return!!g(this,t)},set:function(t,n){var e=g(this,t);e?e[1]=n:this.a.push([t,n])},delete:function(t){var n=d(this.a,function(n){return n[0]===t});return~n&&this.a.splice(n,1),!!~n}},t.exports={getConstructor:function(t,n,e,i){var f=t(function(t,r){a(t,f,n,"_i"),t._t=n,t._i=v++,t._l=void 0,null!=r&&c(r,e,t[i],t)});return r(f.prototype,{delete:function(t){if(!u(t))return!1;var e=o(t);return!0===e?h(l(this,n)).delete(t):e&&s(e,this._i)&&delete e[this._i]},has:function(t){if(!u(t))return!1;var e=o(t);return!0===e?h(l(this,n)).has(t):e&&s(e,this._i)}}),f},def:function(t,n,e){var r=o(i(n),!0);return!0===r?h(t).set(n,e):r[t._i]=e,t},ufstore:h}},8933:function(t,n,e){"use strict";var r=e(7526),o=e(2127),i=e(8859),u=e(6065),a=e(2988),c=e(8790),f=e(6440),s=e(3305),l=e(9448),p=e(8931),d=e(3844),v=e(8880);t.exports=function(t,n,e,h,y,g){var b=r[t],m=b,w=y?"set":"add",_=m&&m.prototype,O={},x=function(t){var n=_[t];i(_,t,"delete"==t||"has"==t?function(t){return!(g&&!s(t))&&n.call(this,0===t?0:t)}:"get"==t?function(t){return g&&!s(t)?void 0:n.call(this,0===t?0:t)}:"add"==t?function(t){return n.call(this,0===t?0:t),this}:function(t,e){return n.call(this,0===t?0:t,e),this})};if("function"==typeof m&&(g||_.forEach&&!l(function(){(new m).entries().next()}))){var A=new m,S=A[w](g?{}:-0,1)!=A,P=l(function(){A.has(1)}),E=p(function(t){new m(t)}),j=!g&&l(function(){for(var t=new m,n=5;n--;)t[w](n,n);return!t.has(-0)});E||((m=n(function(n,e){f(n,m,t);var r=v(new b,n,m);return null!=e&&c(e,y,r[w],r),r})).prototype=_,_.constructor=m),(P||j)&&(x("delete"),x("has"),y&&x("get")),(j||S)&&x(w),g&&_.clear&&delete _.clear}else m=h.getConstructor(n,t,y,w),u(m.prototype,e),a.NEED=!0;return d(m,t),O[t]=m,o(o.G+o.W+o.F*(m!=b),O),g||h.setStrong(m,t,y),m}},6094:function(t){var n=t.exports={version:"2.6.12"};"number"==typeof __e&&(__e=n)},7227:function(t,n,e){"use strict";var r=e(7967),o=e(1996);t.exports=function(t,n,e){n in t?r.f(t,n,o(0,e)):t[n]=e}},5052:function(t,n,e){var r=e(3387);t.exports=function(t,n,e){if(r(t),void 0===n)return t;switch(e){case 1:return function(e){return t.call(n,e)};case 2:return function(e,r){return t.call(n,e,r)};case 3:return function(e,r,o){return t.call(n,e,r,o)}}return function(){return t.apply(n,arguments)}}},5385:function(t,n,e){"use strict";var r=e(9448),o=Date.prototype.getTime,i=Date.prototype.toISOString,u=function(t){return t>9?t:"0"+t};t.exports=r(function(){return"0385-07-25T07:06:39.999Z"!=i.call(new Date(-50000000000001))})||!r(function(){i.call(new Date(NaN))})?function(){if(!isFinite(o.call(this)))throw RangeError("Invalid time value");var t=this,n=t.getUTCFullYear(),e=t.getUTCMilliseconds(),r=n<0?"-":n>9999?"+":"";return r+("00000"+Math.abs(n)).slice(r?-6:-4)+"-"+u(t.getUTCMonth()+1)+"-"+u(t.getUTCDate())+"T"+u(t.getUTCHours())+":"+u(t.getUTCMinutes())+":"+u(t.getUTCSeconds())+"."+(e>99?e:"0"+u(e))+"Z"}:i},107:function(t,n,e){"use strict";var r=e(4228),o=e(3048),i="number";t.exports=function(t){if("string"!==t&&t!==i&&"default"!==t)throw TypeError("Incorrect hint");return o(r(this),t!=i)}},3344:function(t){t.exports=function(t){if(null==t)throw TypeError("Can't call method on "+t);return t}},1763:function(t,n,e){t.exports=!e(9448)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},6034:function(t,n,e){var r=e(3305),o=e(7526).document,i=r(o)&&r(o.createElement);t.exports=function(t){return i?o.createElement(t):{}}},6140:function(t){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},5969:function(t,n,e){var r=e(1311),o=e(1060),i=e(8449);t.exports=function(t){var n=r(t),e=o.f;if(e)for(var u,a=e(t),c=i.f,f=0;a.length>f;)c.call(t,u=a[f++])&&n.push(u);return n}},2127:function(t,n,e){var r=e(7526),o=e(6094),i=e(3341),u=e(8859),a=e(5052),c="prototype",f=function(t,n,e){var s,l,p,d,v=t&f.F,h=t&f.G,y=t&f.S,g=t&f.P,b=t&f.B,m=h?r:y?r[n]||(r[n]={}):(r[n]||{})[c],w=h?o:o[n]||(o[n]={}),_=w[c]||(w[c]={});for(s in h&&(e=n),e)p=((l=!v&&m&&void 0!==m[s])?m:e)[s],d=b&&l?a(p,r):g&&"function"==typeof p?a(Function.call,p):p,m&&u(m,s,p,t&f.U),w[s]!=p&&i(w,s,d),g&&_[s]!=p&&(_[s]=p)};r.core=o,f.F=1,f.G=2,f.S=4,f.P=8,f.B=16,f.W=32,f.U=64,f.R=128,t.exports=f},5203:function(t,n,e){var r=e(7574)("match");t.exports=function(t){var n=/./;try{"/./"[t](n)}catch(e){try{return n[r]=!1,!"/./"[t](n)}catch(t){}}return!0}},9448:function(t){t.exports=function(t){try{return!!t()}catch(t){return!0}}},9228:function(t,n,e){"use strict";e(4116);var r=e(8859),o=e(3341),i=e(9448),u=e(3344),a=e(7574),c=e(9600),f=a("species"),s=!i(function(){var t=/./;return t.exec=function(){var t=[];return t.groups={a:"7"},t},"7"!=="".replace(t,"$")}),l=function(){var t=/(?:)/,n=t.exec;t.exec=function(){return n.apply(this,arguments)};var e="ab".split(t);return 2===e.length&&"a"===e[0]&&"b"===e[1]}();t.exports=function(t,n,e){var p=a(t),d=!i(function(){var n={};return n[p]=function(){return 7},7!=""[t](n)}),v=d?!i(function(){var n=!1,e=/a/;return e.exec=function(){return n=!0,null},"split"===t&&(e.constructor={},e.constructor[f]=function(){return e}),e[p](""),!n}):void 0;if(!d||!v||"replace"===t&&!s||"split"===t&&!l){var h=/./[p],y=e(u,p,""[t],function(t,n,e,r,o){return n.exec===c?d&&!o?{done:!0,value:h.call(n,e,r)}:{done:!0,value:t.call(e,n,r)}:{done:!1}}),g=y[0],b=y[1];r(String.prototype,t,g),o(RegExp.prototype,p,2==n?function(t,n){return b.call(t,this,n)}:function(t){return b.call(t,this)})}}},1158:function(t,n,e){"use strict";var r=e(4228);t.exports=function(){var t=r(this),n="";return t.global&&(n+="g"),t.ignoreCase&&(n+="i"),t.multiline&&(n+="m"),t.unicode&&(n+="u"),t.sticky&&(n+="y"),n}},2322:function(t,n,e){"use strict";var r=e(7981),o=e(3305),i=e(1485),u=e(5052),a=e(7574)("isConcatSpreadable");t.exports=function t(n,e,c,f,s,l,p,d){for(var v,h,y=s,g=0,b=!!p&&u(p,d,3);g0)y=t(n,e,v,i(v.length),y,l-1)-1;else{if(y>=9007199254740991)throw TypeError();n[y]=v}y++}g++}return y}},8790:function(t,n,e){var r=e(5052),o=e(7368),i=e(1508),u=e(4228),a=e(1485),c=e(762),f={},s={},l=t.exports=function(t,n,e,l,p){var d,v,h,y,g=p?function(){return t}:c(t),b=r(e,l,n?2:1),m=0;if("function"!=typeof g)throw TypeError(t+" is not iterable!");if(i(g)){for(d=a(t.length);d>m;m++)if((y=n?b(u(v=t[m])[0],v[1]):b(t[m]))===f||y===s)return y}else for(h=g.call(t);!(v=h.next()).done;)if((y=o(h,b,v.value,n))===f||y===s)return y};l.BREAK=f,l.RETURN=s},9461:function(t,n,e){t.exports=e(4556)("native-function-to-string",Function.toString)},7526:function(t){var n=t.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=n)},7917:function(t){var n={}.hasOwnProperty;t.exports=function(t,e){return n.call(t,e)}},3341:function(t,n,e){var r=e(7967),o=e(1996);t.exports=e(1763)?function(t,n,e){return r.f(t,n,o(1,e))}:function(t,n,e){return t[n]=e,t}},1308:function(t,n,e){var r=e(7526).document;t.exports=r&&r.documentElement},2956:function(t,n,e){t.exports=!e(1763)&&!e(9448)(function(){return 7!=Object.defineProperty(e(6034)("div"),"a",{get:function(){return 7}}).a})},8880:function(t,n,e){var r=e(3305),o=e(5170).set;t.exports=function(t,n,e){var i,u=n.constructor;return u!==e&&"function"==typeof u&&(i=u.prototype)!==e.prototype&&r(i)&&o&&o(t,i),t}},4877:function(t){t.exports=function(t,n,e){var r=void 0===e;switch(n.length){case 0:return r?t():t.call(e);case 1:return r?t(n[0]):t.call(e,n[0]);case 2:return r?t(n[0],n[1]):t.call(e,n[0],n[1]);case 3:return r?t(n[0],n[1],n[2]):t.call(e,n[0],n[1],n[2]);case 4:return r?t(n[0],n[1],n[2],n[3]):t.call(e,n[0],n[1],n[2],n[3])}return t.apply(e,n)}},1249:function(t,n,e){var r=e(5089);t.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==r(t)?t.split(""):Object(t)}},1508:function(t,n,e){var r=e(906),o=e(7574)("iterator"),i=Array.prototype;t.exports=function(t){return void 0!==t&&(r.Array===t||i[o]===t)}},7981:function(t,n,e){var r=e(5089);t.exports=Array.isArray||function(t){return"Array"==r(t)}},3842:function(t,n,e){var r=e(3305),o=Math.floor;t.exports=function(t){return!r(t)&&isFinite(t)&&o(t)===t}},3305:function(t){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},5411:function(t,n,e){var r=e(3305),o=e(5089),i=e(7574)("match");t.exports=function(t){var n;return r(t)&&(void 0!==(n=t[i])?!!n:"RegExp"==o(t))}},7368:function(t,n,e){var r=e(4228);t.exports=function(t,n,e,o){try{return o?n(r(e)[0],e[1]):n(e)}catch(n){var i=t.return;throw void 0!==i&&r(i.call(t)),n}}},6032:function(t,n,e){"use strict";var r=e(4719),o=e(1996),i=e(3844),u={};e(3341)(u,e(7574)("iterator"),function(){return this}),t.exports=function(t,n,e){t.prototype=r(u,{next:o(1,e)}),i(t,n+" Iterator")}},8175:function(t,n,e){"use strict";var r=e(2750),o=e(2127),i=e(8859),u=e(3341),a=e(906),c=e(6032),f=e(3844),s=e(627),l=e(7574)("iterator"),p=!([].keys&&"next"in[].keys()),d="keys",v="values",h=function(){return this};t.exports=function(t,n,e,y,g,b,m){c(e,n,y);var w,_,O,x=function(t){if(!p&&t in E)return E[t];switch(t){case d:case v:return function(){return new e(this,t)}}return function(){return new e(this,t)}},A=n+" Iterator",S=g==v,P=!1,E=t.prototype,j=E[l]||E["@@iterator"]||g&&E[g],T=j||x(g),k=g?S?x("entries"):T:void 0,N="Array"==n&&E.entries||j;if(N&&(O=s(N.call(new t)))!==Object.prototype&&O.next&&(f(O,A,!0),r||"function"==typeof O[l]||u(O,l,h)),S&&j&&j.name!==v&&(P=!0,T=function(){return j.call(this)}),r&&!m||!p&&!P&&E[l]||u(E,l,T),a[n]=T,a[A]=h,g)if(w={values:S?T:x(v),keys:b?T:x(d),entries:k},m)for(_ in w)_ in E||i(E,_,w[_]);else o(o.P+o.F*(p||P),n,w);return w}},8931:function(t,n,e){var r=e(7574)("iterator"),o=!1;try{var i=[7][r]();i.return=function(){o=!0},Array.from(i,function(){throw 2})}catch(t){}t.exports=function(t,n){if(!n&&!o)return!1;var e=!1;try{var i=[7],u=i[r]();u.next=function(){return{done:e=!0}},i[r]=function(){return u},t(i)}catch(t){}return e}},4970:function(t){t.exports=function(t,n){return{value:n,done:!!t}}},906:function(t){t.exports={}},2750:function(t){t.exports=!1},5551:function(t){var n=Math.expm1;t.exports=!n||n(10)>22025.465794806718||n(10)<22025.465794806718||-2e-17!=n(-2e-17)?function(t){return 0==(t=+t)?t:t>-1e-6&&t<1e-6?t+t*t/2:Math.exp(t)-1}:n},2122:function(t,n,e){var r=e(3733),o=Math.pow,i=o(2,-52),u=o(2,-23),a=o(2,127)*(2-u),c=o(2,-126);t.exports=Math.fround||function(t){var n,e,o=Math.abs(t),f=r(t);return oa||e!=e?f*(1/0):f*e}},1473:function(t){t.exports=Math.log1p||function(t){return(t=+t)>-1e-8&&t<1e-8?t-t*t/2:Math.log(1+t)}},3733:function(t){t.exports=Math.sign||function(t){return 0==(t=+t)||t!=t?t:t<0?-1:1}},2988:function(t,n,e){var r=e(4415)("meta"),o=e(3305),i=e(7917),u=e(7967).f,a=0,c=Object.isExtensible||function(){return!0},f=!e(9448)(function(){return c(Object.preventExtensions({}))}),s=function(t){u(t,r,{value:{i:"O"+ ++a,w:{}}})},l=t.exports={KEY:r,NEED:!1,fastKey:function(t,n){if(!o(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!i(t,r)){if(!c(t))return"F";if(!n)return"E";s(t)}return t[r].i},getWeak:function(t,n){if(!i(t,r)){if(!c(t))return!0;if(!n)return!1;s(t)}return t[r].w},onFreeze:function(t){return f&&l.NEED&&c(t)&&!i(t,r)&&s(t),t}}},1384:function(t,n,e){var r=e(7526),o=e(2780).set,i=r.MutationObserver||r.WebKitMutationObserver,u=r.process,a=r.Promise,c="process"==e(5089)(u);t.exports=function(){var t,n,e,f=function(){var r,o;for(c&&(r=u.domain)&&r.exit();t;){o=t.fn,t=t.next;try{o()}catch(r){throw t?e():n=void 0,r}}n=void 0,r&&r.enter()};if(c)e=function(){u.nextTick(f)};else if(!i||r.navigator&&r.navigator.standalone)if(a&&a.resolve){var s=a.resolve(void 0);e=function(){s.then(f)}}else e=function(){o.call(r,f)};else{var l=!0,p=document.createTextNode("");new i(f).observe(p,{characterData:!0}),e=function(){p.data=l=!l}}return function(r){var o={fn:r,next:void 0};n&&(n.next=o),t||(t=o,e()),n=o}}},4258:function(t,n,e){"use strict";var r=e(3387);function o(t){var n,e;this.promise=new t(function(t,r){if(void 0!==n||void 0!==e)throw TypeError("Bad Promise constructor");n=t,e=r}),this.resolve=r(n),this.reject=r(e)}t.exports.f=function(t){return new o(t)}},8206:function(t,n,e){"use strict";var r=e(1763),o=e(1311),i=e(1060),u=e(8449),a=e(8270),c=e(1249),f=Object.assign;t.exports=!f||e(9448)(function(){var t={},n={},e=Symbol(),r="abcdefghijklmnopqrst";return t[e]=7,r.split("").forEach(function(t){n[t]=t}),7!=f({},t)[e]||Object.keys(f({},n)).join("")!=r})?function(t,n){for(var e=a(t),f=arguments.length,s=1,l=i.f,p=u.f;f>s;)for(var d,v=c(arguments[s++]),h=l?o(v).concat(l(v)):o(v),y=h.length,g=0;y>g;)d=h[g++],r&&!p.call(v,d)||(e[d]=v[d]);return e}:f},4719:function(t,n,e){var r=e(4228),o=e(1626),i=e(6140),u=e(766)("IE_PROTO"),a=function(){},c="prototype",f=function(){var t,n=e(6034)("iframe"),r=i.length;for(n.style.display="none",e(1308).appendChild(n),n.src="javascript:",(t=n.contentWindow.document).open(),t.write("\n if (val === '') return true;\n if (val === 'false') return false;\n if (val === 'true') return true;\n return val;\n}\n\nif (DOCUMENT && typeof DOCUMENT.querySelector === 'function') {\n var attrs = [['data-family-prefix', 'familyPrefix'], ['data-replacement-class', 'replacementClass'], ['data-auto-replace-svg', 'autoReplaceSvg'], ['data-auto-add-css', 'autoAddCss'], ['data-auto-a11y', 'autoA11y'], ['data-search-pseudo-elements', 'searchPseudoElements'], ['data-observe-mutations', 'observeMutations'], ['data-mutate-approach', 'mutateApproach'], ['data-keep-original-source', 'keepOriginalSource'], ['data-measure-performance', 'measurePerformance'], ['data-show-missing-icons', 'showMissingIcons']];\n attrs.forEach(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n attr = _ref2[0],\n key = _ref2[1];\n\n var val = coerce(getAttrConfig(attr));\n\n if (val !== undefined && val !== null) {\n initial[key] = val;\n }\n });\n}\n\nvar _default = {\n familyPrefix: DEFAULT_FAMILY_PREFIX,\n replacementClass: DEFAULT_REPLACEMENT_CLASS,\n autoReplaceSvg: true,\n autoAddCss: true,\n autoA11y: true,\n searchPseudoElements: false,\n observeMutations: true,\n mutateApproach: 'async',\n keepOriginalSource: true,\n measurePerformance: false,\n showMissingIcons: true\n};\n\nvar _config = _objectSpread({}, _default, initial);\n\nif (!_config.autoReplaceSvg) _config.observeMutations = false;\n\nvar config = _objectSpread({}, _config);\n\nWINDOW.FontAwesomeConfig = config;\n\nvar w = WINDOW || {};\nif (!w[NAMESPACE_IDENTIFIER]) w[NAMESPACE_IDENTIFIER] = {};\nif (!w[NAMESPACE_IDENTIFIER].styles) w[NAMESPACE_IDENTIFIER].styles = {};\nif (!w[NAMESPACE_IDENTIFIER].hooks) w[NAMESPACE_IDENTIFIER].hooks = {};\nif (!w[NAMESPACE_IDENTIFIER].shims) w[NAMESPACE_IDENTIFIER].shims = [];\nvar namespace = w[NAMESPACE_IDENTIFIER];\n\nvar functions = [];\n\nvar listener = function listener() {\n DOCUMENT.removeEventListener('DOMContentLoaded', listener);\n loaded = 1;\n functions.map(function (fn) {\n return fn();\n });\n};\n\nvar loaded = false;\n\nif (IS_DOM) {\n loaded = (DOCUMENT.documentElement.doScroll ? /^loaded|^c/ : /^loaded|^i|^c/).test(DOCUMENT.readyState);\n if (!loaded) DOCUMENT.addEventListener('DOMContentLoaded', listener);\n}\n\nfunction domready (fn) {\n if (!IS_DOM) return;\n loaded ? setTimeout(fn, 0) : functions.push(fn);\n}\n\nvar PENDING = 'pending';\nvar SETTLED = 'settled';\nvar FULFILLED = 'fulfilled';\nvar REJECTED = 'rejected';\n\nvar NOOP = function NOOP() {};\n\nvar isNode = typeof global !== 'undefined' && typeof global.process !== 'undefined' && typeof global.process.emit === 'function';\nvar asyncSetTimer = typeof setImmediate === 'undefined' ? setTimeout : setImmediate;\nvar asyncQueue = [];\nvar asyncTimer;\n\nfunction asyncFlush() {\n // run promise callbacks\n for (var i = 0; i < asyncQueue.length; i++) {\n asyncQueue[i][0](asyncQueue[i][1]);\n } // reset async asyncQueue\n\n\n asyncQueue = [];\n asyncTimer = false;\n}\n\nfunction asyncCall(callback, arg) {\n asyncQueue.push([callback, arg]);\n\n if (!asyncTimer) {\n asyncTimer = true;\n asyncSetTimer(asyncFlush, 0);\n }\n}\n\nfunction invokeResolver(resolver, promise) {\n function resolvePromise(value) {\n resolve(promise, value);\n }\n\n function rejectPromise(reason) {\n reject(promise, reason);\n }\n\n try {\n resolver(resolvePromise, rejectPromise);\n } catch (e) {\n rejectPromise(e);\n }\n}\n\nfunction invokeCallback(subscriber) {\n var owner = subscriber.owner;\n var settled = owner._state;\n var value = owner._data;\n var callback = subscriber[settled];\n var promise = subscriber.then;\n\n if (typeof callback === 'function') {\n settled = FULFILLED;\n\n try {\n value = callback(value);\n } catch (e) {\n reject(promise, e);\n }\n }\n\n if (!handleThenable(promise, value)) {\n if (settled === FULFILLED) {\n resolve(promise, value);\n }\n\n if (settled === REJECTED) {\n reject(promise, value);\n }\n }\n}\n\nfunction handleThenable(promise, value) {\n var resolved;\n\n try {\n if (promise === value) {\n throw new TypeError('A promises callback cannot return that same promise.');\n }\n\n if (value && (typeof value === 'function' || _typeof(value) === 'object')) {\n // then should be retrieved only once\n var then = value.then;\n\n if (typeof then === 'function') {\n then.call(value, function (val) {\n if (!resolved) {\n resolved = true;\n\n if (value === val) {\n fulfill(promise, val);\n } else {\n resolve(promise, val);\n }\n }\n }, function (reason) {\n if (!resolved) {\n resolved = true;\n reject(promise, reason);\n }\n });\n return true;\n }\n }\n } catch (e) {\n if (!resolved) {\n reject(promise, e);\n }\n\n return true;\n }\n\n return false;\n}\n\nfunction resolve(promise, value) {\n if (promise === value || !handleThenable(promise, value)) {\n fulfill(promise, value);\n }\n}\n\nfunction fulfill(promise, value) {\n if (promise._state === PENDING) {\n promise._state = SETTLED;\n promise._data = value;\n asyncCall(publishFulfillment, promise);\n }\n}\n\nfunction reject(promise, reason) {\n if (promise._state === PENDING) {\n promise._state = SETTLED;\n promise._data = reason;\n asyncCall(publishRejection, promise);\n }\n}\n\nfunction publish(promise) {\n promise._then = promise._then.forEach(invokeCallback);\n}\n\nfunction publishFulfillment(promise) {\n promise._state = FULFILLED;\n publish(promise);\n}\n\nfunction publishRejection(promise) {\n promise._state = REJECTED;\n publish(promise);\n\n if (!promise._handled && isNode) {\n global.process.emit('unhandledRejection', promise._data, promise);\n }\n}\n\nfunction notifyRejectionHandled(promise) {\n global.process.emit('rejectionHandled', promise);\n}\n/**\n * @class\n */\n\n\nfunction P(resolver) {\n if (typeof resolver !== 'function') {\n throw new TypeError('Promise resolver ' + resolver + ' is not a function');\n }\n\n if (this instanceof P === false) {\n throw new TypeError('Failed to construct \\'Promise\\': Please use the \\'new\\' operator, this object constructor cannot be called as a function.');\n }\n\n this._then = [];\n invokeResolver(resolver, this);\n}\n\nP.prototype = {\n constructor: P,\n _state: PENDING,\n _then: null,\n _data: undefined,\n _handled: false,\n then: function then(onFulfillment, onRejection) {\n var subscriber = {\n owner: this,\n then: new this.constructor(NOOP),\n fulfilled: onFulfillment,\n rejected: onRejection\n };\n\n if ((onRejection || onFulfillment) && !this._handled) {\n this._handled = true;\n\n if (this._state === REJECTED && isNode) {\n asyncCall(notifyRejectionHandled, this);\n }\n }\n\n if (this._state === FULFILLED || this._state === REJECTED) {\n // already resolved, call callback async\n asyncCall(invokeCallback, subscriber);\n } else {\n // subscribe\n this._then.push(subscriber);\n }\n\n return subscriber.then;\n },\n catch: function _catch(onRejection) {\n return this.then(null, onRejection);\n }\n};\n\nP.all = function (promises) {\n if (!Array.isArray(promises)) {\n throw new TypeError('You must pass an array to Promise.all().');\n }\n\n return new P(function (resolve, reject) {\n var results = [];\n var remaining = 0;\n\n function resolver(index) {\n remaining++;\n return function (value) {\n results[index] = value;\n\n if (! --remaining) {\n resolve(results);\n }\n };\n }\n\n for (var i = 0, promise; i < promises.length; i++) {\n promise = promises[i];\n\n if (promise && typeof promise.then === 'function') {\n promise.then(resolver(i), reject);\n } else {\n results[i] = promise;\n }\n }\n\n if (!remaining) {\n resolve(results);\n }\n });\n};\n\nP.race = function (promises) {\n if (!Array.isArray(promises)) {\n throw new TypeError('You must pass an array to Promise.race().');\n }\n\n return new P(function (resolve, reject) {\n for (var i = 0, promise; i < promises.length; i++) {\n promise = promises[i];\n\n if (promise && typeof promise.then === 'function') {\n promise.then(resolve, reject);\n } else {\n resolve(promise);\n }\n }\n });\n};\n\nP.resolve = function (value) {\n if (value && _typeof(value) === 'object' && value.constructor === P) {\n return value;\n }\n\n return new P(function (resolve) {\n resolve(value);\n });\n};\n\nP.reject = function (reason) {\n return new P(function (resolve, reject) {\n reject(reason);\n });\n};\n\nvar picked = typeof Promise === 'function' ? Promise : P;\n\nvar d = UNITS_IN_GRID;\nvar meaninglessTransform = {\n size: 16,\n x: 0,\n y: 0,\n rotate: 0,\n flipX: false,\n flipY: false\n};\n\nfunction isReserved(name) {\n return ~RESERVED_CLASSES.indexOf(name);\n}\nfunction insertCss(css) {\n if (!css || !IS_DOM) {\n return;\n }\n\n var style = DOCUMENT.createElement('style');\n style.setAttribute('type', 'text/css');\n style.innerHTML = css;\n var headChildren = DOCUMENT.head.childNodes;\n var beforeChild = null;\n\n for (var i = headChildren.length - 1; i > -1; i--) {\n var child = headChildren[i];\n var tagName = (child.tagName || '').toUpperCase();\n\n if (['STYLE', 'LINK'].indexOf(tagName) > -1) {\n beforeChild = child;\n }\n }\n\n DOCUMENT.head.insertBefore(style, beforeChild);\n return css;\n}\nvar idPool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';\nfunction nextUniqueId() {\n var size = 12;\n var id = '';\n\n while (size-- > 0) {\n id += idPool[Math.random() * 62 | 0];\n }\n\n return id;\n}\nfunction toArray(obj) {\n var array = [];\n\n for (var i = (obj || []).length >>> 0; i--;) {\n array[i] = obj[i];\n }\n\n return array;\n}\nfunction classArray(node) {\n if (node.classList) {\n return toArray(node.classList);\n } else {\n return (node.getAttribute('class') || '').split(' ').filter(function (i) {\n return i;\n });\n }\n}\nfunction getIconName(familyPrefix, cls) {\n var parts = cls.split('-');\n var prefix = parts[0];\n var iconName = parts.slice(1).join('-');\n\n if (prefix === familyPrefix && iconName !== '' && !isReserved(iconName)) {\n return iconName;\n } else {\n return null;\n }\n}\nfunction htmlEscape(str) {\n return \"\".concat(str).replace(/&/g, '&').replace(/\"/g, '"').replace(/'/g, ''').replace(//g, '>');\n}\nfunction joinAttributes(attributes) {\n return Object.keys(attributes || {}).reduce(function (acc, attributeName) {\n return acc + \"\".concat(attributeName, \"=\\\"\").concat(htmlEscape(attributes[attributeName]), \"\\\" \");\n }, '').trim();\n}\nfunction joinStyles(styles) {\n return Object.keys(styles || {}).reduce(function (acc, styleName) {\n return acc + \"\".concat(styleName, \": \").concat(styles[styleName], \";\");\n }, '');\n}\nfunction transformIsMeaningful(transform) {\n return transform.size !== meaninglessTransform.size || transform.x !== meaninglessTransform.x || transform.y !== meaninglessTransform.y || transform.rotate !== meaninglessTransform.rotate || transform.flipX || transform.flipY;\n}\nfunction transformForSvg(_ref) {\n var transform = _ref.transform,\n containerWidth = _ref.containerWidth,\n iconWidth = _ref.iconWidth;\n var outer = {\n transform: \"translate(\".concat(containerWidth / 2, \" 256)\")\n };\n var innerTranslate = \"translate(\".concat(transform.x * 32, \", \").concat(transform.y * 32, \") \");\n var innerScale = \"scale(\".concat(transform.size / 16 * (transform.flipX ? -1 : 1), \", \").concat(transform.size / 16 * (transform.flipY ? -1 : 1), \") \");\n var innerRotate = \"rotate(\".concat(transform.rotate, \" 0 0)\");\n var inner = {\n transform: \"\".concat(innerTranslate, \" \").concat(innerScale, \" \").concat(innerRotate)\n };\n var path = {\n transform: \"translate(\".concat(iconWidth / 2 * -1, \" -256)\")\n };\n return {\n outer: outer,\n inner: inner,\n path: path\n };\n}\nfunction transformForCss(_ref2) {\n var transform = _ref2.transform,\n _ref2$width = _ref2.width,\n width = _ref2$width === void 0 ? UNITS_IN_GRID : _ref2$width,\n _ref2$height = _ref2.height,\n height = _ref2$height === void 0 ? UNITS_IN_GRID : _ref2$height,\n _ref2$startCentered = _ref2.startCentered,\n startCentered = _ref2$startCentered === void 0 ? false : _ref2$startCentered;\n var val = '';\n\n if (startCentered && IS_IE) {\n val += \"translate(\".concat(transform.x / d - width / 2, \"em, \").concat(transform.y / d - height / 2, \"em) \");\n } else if (startCentered) {\n val += \"translate(calc(-50% + \".concat(transform.x / d, \"em), calc(-50% + \").concat(transform.y / d, \"em)) \");\n } else {\n val += \"translate(\".concat(transform.x / d, \"em, \").concat(transform.y / d, \"em) \");\n }\n\n val += \"scale(\".concat(transform.size / d * (transform.flipX ? -1 : 1), \", \").concat(transform.size / d * (transform.flipY ? -1 : 1), \") \");\n val += \"rotate(\".concat(transform.rotate, \"deg) \");\n return val;\n}\n\nvar ALL_SPACE = {\n x: 0,\n y: 0,\n width: '100%',\n height: '100%'\n};\n\nfunction fillBlack(abstract) {\n var force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n if (abstract.attributes && (abstract.attributes.fill || force)) {\n abstract.attributes.fill = 'black';\n }\n\n return abstract;\n}\n\nfunction deGroup(abstract) {\n if (abstract.tag === 'g') {\n return abstract.children;\n } else {\n return [abstract];\n }\n}\n\nfunction makeIconMasking (_ref) {\n var children = _ref.children,\n attributes = _ref.attributes,\n main = _ref.main,\n mask = _ref.mask,\n explicitMaskId = _ref.maskId,\n transform = _ref.transform;\n var mainWidth = main.width,\n mainPath = main.icon;\n var maskWidth = mask.width,\n maskPath = mask.icon;\n var trans = transformForSvg({\n transform: transform,\n containerWidth: maskWidth,\n iconWidth: mainWidth\n });\n var maskRect = {\n tag: 'rect',\n attributes: _objectSpread({}, ALL_SPACE, {\n fill: 'white'\n })\n };\n var maskInnerGroupChildrenMixin = mainPath.children ? {\n children: mainPath.children.map(fillBlack)\n } : {};\n var maskInnerGroup = {\n tag: 'g',\n attributes: _objectSpread({}, trans.inner),\n children: [fillBlack(_objectSpread({\n tag: mainPath.tag,\n attributes: _objectSpread({}, mainPath.attributes, trans.path)\n }, maskInnerGroupChildrenMixin))]\n };\n var maskOuterGroup = {\n tag: 'g',\n attributes: _objectSpread({}, trans.outer),\n children: [maskInnerGroup]\n };\n var maskId = \"mask-\".concat(explicitMaskId || nextUniqueId());\n var clipId = \"clip-\".concat(explicitMaskId || nextUniqueId());\n var maskTag = {\n tag: 'mask',\n attributes: _objectSpread({}, ALL_SPACE, {\n id: maskId,\n maskUnits: 'userSpaceOnUse',\n maskContentUnits: 'userSpaceOnUse'\n }),\n children: [maskRect, maskOuterGroup]\n };\n var defs = {\n tag: 'defs',\n children: [{\n tag: 'clipPath',\n attributes: {\n id: clipId\n },\n children: deGroup(maskPath)\n }, maskTag]\n };\n children.push(defs, {\n tag: 'rect',\n attributes: _objectSpread({\n fill: 'currentColor',\n 'clip-path': \"url(#\".concat(clipId, \")\"),\n mask: \"url(#\".concat(maskId, \")\")\n }, ALL_SPACE)\n });\n return {\n children: children,\n attributes: attributes\n };\n}\n\nfunction makeIconStandard (_ref) {\n var children = _ref.children,\n attributes = _ref.attributes,\n main = _ref.main,\n transform = _ref.transform,\n styles = _ref.styles;\n var styleString = joinStyles(styles);\n\n if (styleString.length > 0) {\n attributes['style'] = styleString;\n }\n\n if (transformIsMeaningful(transform)) {\n var trans = transformForSvg({\n transform: transform,\n containerWidth: main.width,\n iconWidth: main.width\n });\n children.push({\n tag: 'g',\n attributes: _objectSpread({}, trans.outer),\n children: [{\n tag: 'g',\n attributes: _objectSpread({}, trans.inner),\n children: [{\n tag: main.icon.tag,\n children: main.icon.children,\n attributes: _objectSpread({}, main.icon.attributes, trans.path)\n }]\n }]\n });\n } else {\n children.push(main.icon);\n }\n\n return {\n children: children,\n attributes: attributes\n };\n}\n\nfunction asIcon (_ref) {\n var children = _ref.children,\n main = _ref.main,\n mask = _ref.mask,\n attributes = _ref.attributes,\n styles = _ref.styles,\n transform = _ref.transform;\n\n if (transformIsMeaningful(transform) && main.found && !mask.found) {\n var width = main.width,\n height = main.height;\n var offset = {\n x: width / height / 2,\n y: 0.5\n };\n attributes['style'] = joinStyles(_objectSpread({}, styles, {\n 'transform-origin': \"\".concat(offset.x + transform.x / 16, \"em \").concat(offset.y + transform.y / 16, \"em\")\n }));\n }\n\n return [{\n tag: 'svg',\n attributes: attributes,\n children: children\n }];\n}\n\nfunction asSymbol (_ref) {\n var prefix = _ref.prefix,\n iconName = _ref.iconName,\n children = _ref.children,\n attributes = _ref.attributes,\n symbol = _ref.symbol;\n var id = symbol === true ? \"\".concat(prefix, \"-\").concat(config.familyPrefix, \"-\").concat(iconName) : symbol;\n return [{\n tag: 'svg',\n attributes: {\n style: 'display: none;'\n },\n children: [{\n tag: 'symbol',\n attributes: _objectSpread({}, attributes, {\n id: id\n }),\n children: children\n }]\n }];\n}\n\nfunction makeInlineSvgAbstract(params) {\n var _params$icons = params.icons,\n main = _params$icons.main,\n mask = _params$icons.mask,\n prefix = params.prefix,\n iconName = params.iconName,\n transform = params.transform,\n symbol = params.symbol,\n title = params.title,\n maskId = params.maskId,\n titleId = params.titleId,\n extra = params.extra,\n _params$watchable = params.watchable,\n watchable = _params$watchable === void 0 ? false : _params$watchable;\n\n var _ref = mask.found ? mask : main,\n width = _ref.width,\n height = _ref.height;\n\n var isUploadedIcon = prefix === 'fak';\n var widthClass = isUploadedIcon ? '' : \"fa-w-\".concat(Math.ceil(width / height * 16));\n var attrClass = [config.replacementClass, iconName ? \"\".concat(config.familyPrefix, \"-\").concat(iconName) : '', widthClass].filter(function (c) {\n return extra.classes.indexOf(c) === -1;\n }).filter(function (c) {\n return c !== '' || !!c;\n }).concat(extra.classes).join(' ');\n var content = {\n children: [],\n attributes: _objectSpread({}, extra.attributes, {\n 'data-prefix': prefix,\n 'data-icon': iconName,\n 'class': attrClass,\n 'role': extra.attributes.role || 'img',\n 'xmlns': 'http://www.w3.org/2000/svg',\n 'viewBox': \"0 0 \".concat(width, \" \").concat(height)\n })\n };\n var uploadedIconWidthStyle = isUploadedIcon && !~extra.classes.indexOf('fa-fw') ? {\n width: \"\".concat(width / height * 16 * 0.0625, \"em\")\n } : {};\n\n if (watchable) {\n content.attributes[DATA_FA_I2SVG] = '';\n }\n\n if (title) content.children.push({\n tag: 'title',\n attributes: {\n id: content.attributes['aria-labelledby'] || \"title-\".concat(titleId || nextUniqueId())\n },\n children: [title]\n });\n\n var args = _objectSpread({}, content, {\n prefix: prefix,\n iconName: iconName,\n main: main,\n mask: mask,\n maskId: maskId,\n transform: transform,\n symbol: symbol,\n styles: _objectSpread({}, uploadedIconWidthStyle, extra.styles)\n });\n\n var _ref2 = mask.found && main.found ? makeIconMasking(args) : makeIconStandard(args),\n children = _ref2.children,\n attributes = _ref2.attributes;\n\n args.children = children;\n args.attributes = attributes;\n\n if (symbol) {\n return asSymbol(args);\n } else {\n return asIcon(args);\n }\n}\nfunction makeLayersTextAbstract(params) {\n var content = params.content,\n width = params.width,\n height = params.height,\n transform = params.transform,\n title = params.title,\n extra = params.extra,\n _params$watchable2 = params.watchable,\n watchable = _params$watchable2 === void 0 ? false : _params$watchable2;\n\n var attributes = _objectSpread({}, extra.attributes, title ? {\n 'title': title\n } : {}, {\n 'class': extra.classes.join(' ')\n });\n\n if (watchable) {\n attributes[DATA_FA_I2SVG] = '';\n }\n\n var styles = _objectSpread({}, extra.styles);\n\n if (transformIsMeaningful(transform)) {\n styles['transform'] = transformForCss({\n transform: transform,\n startCentered: true,\n width: width,\n height: height\n });\n styles['-webkit-transform'] = styles['transform'];\n }\n\n var styleString = joinStyles(styles);\n\n if (styleString.length > 0) {\n attributes['style'] = styleString;\n }\n\n var val = [];\n val.push({\n tag: 'span',\n attributes: attributes,\n children: [content]\n });\n\n if (title) {\n val.push({\n tag: 'span',\n attributes: {\n class: 'sr-only'\n },\n children: [title]\n });\n }\n\n return val;\n}\nfunction makeLayersCounterAbstract(params) {\n var content = params.content,\n title = params.title,\n extra = params.extra;\n\n var attributes = _objectSpread({}, extra.attributes, title ? {\n 'title': title\n } : {}, {\n 'class': extra.classes.join(' ')\n });\n\n var styleString = joinStyles(extra.styles);\n\n if (styleString.length > 0) {\n attributes['style'] = styleString;\n }\n\n var val = [];\n val.push({\n tag: 'span',\n attributes: attributes,\n children: [content]\n });\n\n if (title) {\n val.push({\n tag: 'span',\n attributes: {\n class: 'sr-only'\n },\n children: [title]\n });\n }\n\n return val;\n}\n\nvar noop$1 = function noop() {};\n\nvar p = config.measurePerformance && PERFORMANCE && PERFORMANCE.mark && PERFORMANCE.measure ? PERFORMANCE : {\n mark: noop$1,\n measure: noop$1\n};\nvar preamble = \"FA \\\"5.15.4\\\"\";\n\nvar begin = function begin(name) {\n p.mark(\"\".concat(preamble, \" \").concat(name, \" begins\"));\n return function () {\n return end(name);\n };\n};\n\nvar end = function end(name) {\n p.mark(\"\".concat(preamble, \" \").concat(name, \" ends\"));\n p.measure(\"\".concat(preamble, \" \").concat(name), \"\".concat(preamble, \" \").concat(name, \" begins\"), \"\".concat(preamble, \" \").concat(name, \" ends\"));\n};\n\nvar perf = {\n begin: begin,\n end: end\n};\n\n/**\n * Internal helper to bind a function known to have 4 arguments\n * to a given context.\n */\n\nvar bindInternal4 = function bindInternal4(func, thisContext) {\n return function (a, b, c, d) {\n return func.call(thisContext, a, b, c, d);\n };\n};\n\n/**\n * # Reduce\n *\n * A fast object `.reduce()` implementation.\n *\n * @param {Object} subject The object to reduce over.\n * @param {Function} fn The reducer function.\n * @param {mixed} initialValue The initial value for the reducer, defaults to subject[0].\n * @param {Object} thisContext The context for the reducer.\n * @return {mixed} The final result.\n */\n\n\nvar reduce = function fastReduceObject(subject, fn, initialValue, thisContext) {\n var keys = Object.keys(subject),\n length = keys.length,\n iterator = thisContext !== undefined ? bindInternal4(fn, thisContext) : fn,\n i,\n key,\n result;\n\n if (initialValue === undefined) {\n i = 1;\n result = subject[keys[0]];\n } else {\n i = 0;\n result = initialValue;\n }\n\n for (; i < length; i++) {\n key = keys[i];\n result = iterator(result, subject[key], key, subject);\n }\n\n return result;\n};\n\nfunction toHex(unicode) {\n var result = '';\n\n for (var i = 0; i < unicode.length; i++) {\n var hex = unicode.charCodeAt(i).toString(16);\n result += ('000' + hex).slice(-4);\n }\n\n return result;\n}\n\nfunction defineIcons(prefix, icons) {\n var params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var _params$skipHooks = params.skipHooks,\n skipHooks = _params$skipHooks === void 0 ? false : _params$skipHooks;\n var normalized = Object.keys(icons).reduce(function (acc, iconName) {\n var icon = icons[iconName];\n var expanded = !!icon.icon;\n\n if (expanded) {\n acc[icon.iconName] = icon.icon;\n } else {\n acc[iconName] = icon;\n }\n\n return acc;\n }, {});\n\n if (typeof namespace.hooks.addPack === 'function' && !skipHooks) {\n namespace.hooks.addPack(prefix, normalized);\n } else {\n namespace.styles[prefix] = _objectSpread({}, namespace.styles[prefix] || {}, normalized);\n }\n /**\n * Font Awesome 4 used the prefix of `fa` for all icons. With the introduction\n * of new styles we needed to differentiate between them. Prefix `fa` is now an alias\n * for `fas` so we'll easy the upgrade process for our users by automatically defining\n * this as well.\n */\n\n\n if (prefix === 'fas') {\n defineIcons('fa', icons);\n }\n}\n\nvar styles = namespace.styles,\n shims = namespace.shims;\nvar _byUnicode = {};\nvar _byLigature = {};\nvar _byOldName = {};\nvar build = function build() {\n var lookup = function lookup(reducer) {\n return reduce(styles, function (o, style, prefix) {\n o[prefix] = reduce(style, reducer, {});\n return o;\n }, {});\n };\n\n _byUnicode = lookup(function (acc, icon, iconName) {\n if (icon[3]) {\n acc[icon[3]] = iconName;\n }\n\n return acc;\n });\n _byLigature = lookup(function (acc, icon, iconName) {\n var ligatures = icon[2];\n acc[iconName] = iconName;\n ligatures.forEach(function (ligature) {\n acc[ligature] = iconName;\n });\n return acc;\n });\n var hasRegular = 'far' in styles;\n _byOldName = reduce(shims, function (acc, shim) {\n var oldName = shim[0];\n var prefix = shim[1];\n var iconName = shim[2];\n\n if (prefix === 'far' && !hasRegular) {\n prefix = 'fas';\n }\n\n acc[oldName] = {\n prefix: prefix,\n iconName: iconName\n };\n return acc;\n }, {});\n};\nbuild();\nfunction byUnicode(prefix, unicode) {\n return (_byUnicode[prefix] || {})[unicode];\n}\nfunction byLigature(prefix, ligature) {\n return (_byLigature[prefix] || {})[ligature];\n}\nfunction byOldName(name) {\n return _byOldName[name] || {\n prefix: null,\n iconName: null\n };\n}\n\nvar styles$1 = namespace.styles;\nvar emptyCanonicalIcon = function emptyCanonicalIcon() {\n return {\n prefix: null,\n iconName: null,\n rest: []\n };\n};\nfunction getCanonicalIcon(values) {\n return values.reduce(function (acc, cls) {\n var iconName = getIconName(config.familyPrefix, cls);\n\n if (styles$1[cls]) {\n acc.prefix = cls;\n } else if (config.autoFetchSvg && Object.keys(PREFIX_TO_STYLE).indexOf(cls) > -1) {\n acc.prefix = cls;\n } else if (iconName) {\n var shim = acc.prefix === 'fa' ? byOldName(iconName) : {};\n acc.iconName = shim.iconName || iconName;\n acc.prefix = shim.prefix || acc.prefix;\n } else if (cls !== config.replacementClass && cls.indexOf('fa-w-') !== 0) {\n acc.rest.push(cls);\n }\n\n return acc;\n }, emptyCanonicalIcon());\n}\nfunction iconFromMapping(mapping, prefix, iconName) {\n if (mapping && mapping[prefix] && mapping[prefix][iconName]) {\n return {\n prefix: prefix,\n iconName: iconName,\n icon: mapping[prefix][iconName]\n };\n }\n}\n\nfunction toHtml(abstractNodes) {\n var tag = abstractNodes.tag,\n _abstractNodes$attrib = abstractNodes.attributes,\n attributes = _abstractNodes$attrib === void 0 ? {} : _abstractNodes$attrib,\n _abstractNodes$childr = abstractNodes.children,\n children = _abstractNodes$childr === void 0 ? [] : _abstractNodes$childr;\n\n if (typeof abstractNodes === 'string') {\n return htmlEscape(abstractNodes);\n } else {\n return \"<\".concat(tag, \" \").concat(joinAttributes(attributes), \">\").concat(children.map(toHtml).join(''), \"\");\n }\n}\n\nvar noop$2 = function noop() {};\n\nfunction isWatched(node) {\n var i2svg = node.getAttribute ? node.getAttribute(DATA_FA_I2SVG) : null;\n return typeof i2svg === 'string';\n}\n\nfunction getMutator() {\n if (config.autoReplaceSvg === true) {\n return mutators.replace;\n }\n\n var mutator = mutators[config.autoReplaceSvg];\n return mutator || mutators.replace;\n}\n\nvar mutators = {\n replace: function replace(mutation) {\n var node = mutation[0];\n var abstract = mutation[1];\n var newOuterHTML = abstract.map(function (a) {\n return toHtml(a);\n }).join('\\n');\n\n if (node.parentNode && node.outerHTML) {\n node.outerHTML = newOuterHTML + (config.keepOriginalSource && node.tagName.toLowerCase() !== 'svg' ? \"\") : '');\n } else if (node.parentNode) {\n var newNode = document.createElement('span');\n node.parentNode.replaceChild(newNode, node);\n newNode.outerHTML = newOuterHTML;\n }\n },\n nest: function nest(mutation) {\n var node = mutation[0];\n var abstract = mutation[1]; // If we already have a replaced node we do not want to continue nesting within it.\n // Short-circuit to the standard replacement\n\n if (~classArray(node).indexOf(config.replacementClass)) {\n return mutators.replace(mutation);\n }\n\n var forSvg = new RegExp(\"\".concat(config.familyPrefix, \"-.*\"));\n delete abstract[0].attributes.style;\n delete abstract[0].attributes.id;\n var splitClasses = abstract[0].attributes.class.split(' ').reduce(function (acc, cls) {\n if (cls === config.replacementClass || cls.match(forSvg)) {\n acc.toSvg.push(cls);\n } else {\n acc.toNode.push(cls);\n }\n\n return acc;\n }, {\n toNode: [],\n toSvg: []\n });\n abstract[0].attributes.class = splitClasses.toSvg.join(' ');\n var newInnerHTML = abstract.map(function (a) {\n return toHtml(a);\n }).join('\\n');\n node.setAttribute('class', splitClasses.toNode.join(' '));\n node.setAttribute(DATA_FA_I2SVG, '');\n node.innerHTML = newInnerHTML;\n }\n};\n\nfunction performOperationSync(op) {\n op();\n}\n\nfunction perform(mutations, callback) {\n var callbackFunction = typeof callback === 'function' ? callback : noop$2;\n\n if (mutations.length === 0) {\n callbackFunction();\n } else {\n var frame = performOperationSync;\n\n if (config.mutateApproach === MUTATION_APPROACH_ASYNC) {\n frame = WINDOW.requestAnimationFrame || performOperationSync;\n }\n\n frame(function () {\n var mutator = getMutator();\n var mark = perf.begin('mutate');\n mutations.map(mutator);\n mark();\n callbackFunction();\n });\n }\n}\nvar disabled = false;\nfunction disableObservation() {\n disabled = true;\n}\nfunction enableObservation() {\n disabled = false;\n}\nvar mo = null;\nfunction observe(options) {\n if (!MUTATION_OBSERVER) {\n return;\n }\n\n if (!config.observeMutations) {\n return;\n }\n\n var treeCallback = options.treeCallback,\n nodeCallback = options.nodeCallback,\n pseudoElementsCallback = options.pseudoElementsCallback,\n _options$observeMutat = options.observeMutationsRoot,\n observeMutationsRoot = _options$observeMutat === void 0 ? DOCUMENT : _options$observeMutat;\n mo = new MUTATION_OBSERVER(function (objects) {\n if (disabled) return;\n toArray(objects).forEach(function (mutationRecord) {\n if (mutationRecord.type === 'childList' && mutationRecord.addedNodes.length > 0 && !isWatched(mutationRecord.addedNodes[0])) {\n if (config.searchPseudoElements) {\n pseudoElementsCallback(mutationRecord.target);\n }\n\n treeCallback(mutationRecord.target);\n }\n\n if (mutationRecord.type === 'attributes' && mutationRecord.target.parentNode && config.searchPseudoElements) {\n pseudoElementsCallback(mutationRecord.target.parentNode);\n }\n\n if (mutationRecord.type === 'attributes' && isWatched(mutationRecord.target) && ~ATTRIBUTES_WATCHED_FOR_MUTATION.indexOf(mutationRecord.attributeName)) {\n if (mutationRecord.attributeName === 'class') {\n var _getCanonicalIcon = getCanonicalIcon(classArray(mutationRecord.target)),\n prefix = _getCanonicalIcon.prefix,\n iconName = _getCanonicalIcon.iconName;\n\n if (prefix) mutationRecord.target.setAttribute('data-prefix', prefix);\n if (iconName) mutationRecord.target.setAttribute('data-icon', iconName);\n } else {\n nodeCallback(mutationRecord.target);\n }\n }\n });\n });\n if (!IS_DOM) return;\n mo.observe(observeMutationsRoot, {\n childList: true,\n attributes: true,\n characterData: true,\n subtree: true\n });\n}\nfunction disconnect() {\n if (!mo) return;\n mo.disconnect();\n}\n\nfunction styleParser (node) {\n var style = node.getAttribute('style');\n var val = [];\n\n if (style) {\n val = style.split(';').reduce(function (acc, style) {\n var styles = style.split(':');\n var prop = styles[0];\n var value = styles.slice(1);\n\n if (prop && value.length > 0) {\n acc[prop] = value.join(':').trim();\n }\n\n return acc;\n }, {});\n }\n\n return val;\n}\n\nfunction classParser (node) {\n var existingPrefix = node.getAttribute('data-prefix');\n var existingIconName = node.getAttribute('data-icon');\n var innerText = node.innerText !== undefined ? node.innerText.trim() : '';\n var val = getCanonicalIcon(classArray(node));\n\n if (existingPrefix && existingIconName) {\n val.prefix = existingPrefix;\n val.iconName = existingIconName;\n }\n\n if (val.prefix && innerText.length > 1) {\n val.iconName = byLigature(val.prefix, node.innerText);\n } else if (val.prefix && innerText.length === 1) {\n val.iconName = byUnicode(val.prefix, toHex(node.innerText));\n }\n\n return val;\n}\n\nvar parseTransformString = function parseTransformString(transformString) {\n var transform = {\n size: 16,\n x: 0,\n y: 0,\n flipX: false,\n flipY: false,\n rotate: 0\n };\n\n if (!transformString) {\n return transform;\n } else {\n return transformString.toLowerCase().split(' ').reduce(function (acc, n) {\n var parts = n.toLowerCase().split('-');\n var first = parts[0];\n var rest = parts.slice(1).join('-');\n\n if (first && rest === 'h') {\n acc.flipX = true;\n return acc;\n }\n\n if (first && rest === 'v') {\n acc.flipY = true;\n return acc;\n }\n\n rest = parseFloat(rest);\n\n if (isNaN(rest)) {\n return acc;\n }\n\n switch (first) {\n case 'grow':\n acc.size = acc.size + rest;\n break;\n\n case 'shrink':\n acc.size = acc.size - rest;\n break;\n\n case 'left':\n acc.x = acc.x - rest;\n break;\n\n case 'right':\n acc.x = acc.x + rest;\n break;\n\n case 'up':\n acc.y = acc.y - rest;\n break;\n\n case 'down':\n acc.y = acc.y + rest;\n break;\n\n case 'rotate':\n acc.rotate = acc.rotate + rest;\n break;\n }\n\n return acc;\n }, transform);\n }\n};\nfunction transformParser (node) {\n return parseTransformString(node.getAttribute('data-fa-transform'));\n}\n\nfunction symbolParser (node) {\n var symbol = node.getAttribute('data-fa-symbol');\n return symbol === null ? false : symbol === '' ? true : symbol;\n}\n\nfunction attributesParser (node) {\n var extraAttributes = toArray(node.attributes).reduce(function (acc, attr) {\n if (acc.name !== 'class' && acc.name !== 'style') {\n acc[attr.name] = attr.value;\n }\n\n return acc;\n }, {});\n var title = node.getAttribute('title');\n var titleId = node.getAttribute('data-fa-title-id');\n\n if (config.autoA11y) {\n if (title) {\n extraAttributes['aria-labelledby'] = \"\".concat(config.replacementClass, \"-title-\").concat(titleId || nextUniqueId());\n } else {\n extraAttributes['aria-hidden'] = 'true';\n extraAttributes['focusable'] = 'false';\n }\n }\n\n return extraAttributes;\n}\n\nfunction maskParser (node) {\n var mask = node.getAttribute('data-fa-mask');\n\n if (!mask) {\n return emptyCanonicalIcon();\n } else {\n return getCanonicalIcon(mask.split(' ').map(function (i) {\n return i.trim();\n }));\n }\n}\n\nfunction blankMeta() {\n return {\n iconName: null,\n title: null,\n titleId: null,\n prefix: null,\n transform: meaninglessTransform,\n symbol: false,\n mask: null,\n maskId: null,\n extra: {\n classes: [],\n styles: {},\n attributes: {}\n }\n };\n}\nfunction parseMeta(node) {\n var _classParser = classParser(node),\n iconName = _classParser.iconName,\n prefix = _classParser.prefix,\n extraClasses = _classParser.rest;\n\n var extraStyles = styleParser(node);\n var transform = transformParser(node);\n var symbol = symbolParser(node);\n var extraAttributes = attributesParser(node);\n var mask = maskParser(node);\n return {\n iconName: iconName,\n title: node.getAttribute('title'),\n titleId: node.getAttribute('data-fa-title-id'),\n prefix: prefix,\n transform: transform,\n symbol: symbol,\n mask: mask,\n maskId: node.getAttribute('data-fa-mask-id'),\n extra: {\n classes: extraClasses,\n styles: extraStyles,\n attributes: extraAttributes\n }\n };\n}\n\nfunction MissingIcon(error) {\n this.name = 'MissingIcon';\n this.message = error || 'Icon unavailable';\n this.stack = new Error().stack;\n}\nMissingIcon.prototype = Object.create(Error.prototype);\nMissingIcon.prototype.constructor = MissingIcon;\n\nvar FILL = {\n fill: 'currentColor'\n};\nvar ANIMATION_BASE = {\n attributeType: 'XML',\n repeatCount: 'indefinite',\n dur: '2s'\n};\nvar RING = {\n tag: 'path',\n attributes: _objectSpread({}, FILL, {\n d: 'M156.5,447.7l-12.6,29.5c-18.7-9.5-35.9-21.2-51.5-34.9l22.7-22.7C127.6,430.5,141.5,440,156.5,447.7z M40.6,272H8.5 c1.4,21.2,5.4,41.7,11.7,61.1L50,321.2C45.1,305.5,41.8,289,40.6,272z M40.6,240c1.4-18.8,5.2-37,11.1-54.1l-29.5-12.6 C14.7,194.3,10,216.7,8.5,240H40.6z M64.3,156.5c7.8-14.9,17.2-28.8,28.1-41.5L69.7,92.3c-13.7,15.6-25.5,32.8-34.9,51.5 L64.3,156.5z M397,419.6c-13.9,12-29.4,22.3-46.1,30.4l11.9,29.8c20.7-9.9,39.8-22.6,56.9-37.6L397,419.6z M115,92.4 c13.9-12,29.4-22.3,46.1-30.4l-11.9-29.8c-20.7,9.9-39.8,22.6-56.8,37.6L115,92.4z M447.7,355.5c-7.8,14.9-17.2,28.8-28.1,41.5 l22.7,22.7c13.7-15.6,25.5-32.9,34.9-51.5L447.7,355.5z M471.4,272c-1.4,18.8-5.2,37-11.1,54.1l29.5,12.6 c7.5-21.1,12.2-43.5,13.6-66.8H471.4z M321.2,462c-15.7,5-32.2,8.2-49.2,9.4v32.1c21.2-1.4,41.7-5.4,61.1-11.7L321.2,462z M240,471.4c-18.8-1.4-37-5.2-54.1-11.1l-12.6,29.5c21.1,7.5,43.5,12.2,66.8,13.6V471.4z M462,190.8c5,15.7,8.2,32.2,9.4,49.2h32.1 c-1.4-21.2-5.4-41.7-11.7-61.1L462,190.8z M92.4,397c-12-13.9-22.3-29.4-30.4-46.1l-29.8,11.9c9.9,20.7,22.6,39.8,37.6,56.9 L92.4,397z M272,40.6c18.8,1.4,36.9,5.2,54.1,11.1l12.6-29.5C317.7,14.7,295.3,10,272,8.5V40.6z M190.8,50 c15.7-5,32.2-8.2,49.2-9.4V8.5c-21.2,1.4-41.7,5.4-61.1,11.7L190.8,50z M442.3,92.3L419.6,115c12,13.9,22.3,29.4,30.5,46.1 l29.8-11.9C470,128.5,457.3,109.4,442.3,92.3z M397,92.4l22.7-22.7c-15.6-13.7-32.8-25.5-51.5-34.9l-12.6,29.5 C370.4,72.1,384.4,81.5,397,92.4z'\n })\n};\n\nvar OPACITY_ANIMATE = _objectSpread({}, ANIMATION_BASE, {\n attributeName: 'opacity'\n});\n\nvar DOT = {\n tag: 'circle',\n attributes: _objectSpread({}, FILL, {\n cx: '256',\n cy: '364',\n r: '28'\n }),\n children: [{\n tag: 'animate',\n attributes: _objectSpread({}, ANIMATION_BASE, {\n attributeName: 'r',\n values: '28;14;28;28;14;28;'\n })\n }, {\n tag: 'animate',\n attributes: _objectSpread({}, OPACITY_ANIMATE, {\n values: '1;0;1;1;0;1;'\n })\n }]\n};\nvar QUESTION = {\n tag: 'path',\n attributes: _objectSpread({}, FILL, {\n opacity: '1',\n d: 'M263.7,312h-16c-6.6,0-12-5.4-12-12c0-71,77.4-63.9,77.4-107.8c0-20-17.8-40.2-57.4-40.2c-29.1,0-44.3,9.6-59.2,28.7 c-3.9,5-11.1,6-16.2,2.4l-13.1-9.2c-5.6-3.9-6.9-11.8-2.6-17.2c21.2-27.2,46.4-44.7,91.2-44.7c52.3,0,97.4,29.8,97.4,80.2 c0,67.6-77.4,63.5-77.4,107.8C275.7,306.6,270.3,312,263.7,312z'\n }),\n children: [{\n tag: 'animate',\n attributes: _objectSpread({}, OPACITY_ANIMATE, {\n values: '1;0;0;0;0;1;'\n })\n }]\n};\nvar EXCLAMATION = {\n tag: 'path',\n attributes: _objectSpread({}, FILL, {\n opacity: '0',\n d: 'M232.5,134.5l7,168c0.3,6.4,5.6,11.5,12,11.5h9c6.4,0,11.7-5.1,12-11.5l7-168c0.3-6.8-5.2-12.5-12-12.5h-23 C237.7,122,232.2,127.7,232.5,134.5z'\n }),\n children: [{\n tag: 'animate',\n attributes: _objectSpread({}, OPACITY_ANIMATE, {\n values: '0;0;1;1;0;0;'\n })\n }]\n};\nvar missing = {\n tag: 'g',\n children: [RING, DOT, QUESTION, EXCLAMATION]\n};\n\nvar styles$2 = namespace.styles;\nfunction asFoundIcon(icon) {\n var width = icon[0];\n var height = icon[1];\n\n var _icon$slice = icon.slice(4),\n _icon$slice2 = _slicedToArray(_icon$slice, 1),\n vectorData = _icon$slice2[0];\n\n var element = null;\n\n if (Array.isArray(vectorData)) {\n element = {\n tag: 'g',\n attributes: {\n class: \"\".concat(config.familyPrefix, \"-\").concat(DUOTONE_CLASSES.GROUP)\n },\n children: [{\n tag: 'path',\n attributes: {\n class: \"\".concat(config.familyPrefix, \"-\").concat(DUOTONE_CLASSES.SECONDARY),\n fill: 'currentColor',\n d: vectorData[0]\n }\n }, {\n tag: 'path',\n attributes: {\n class: \"\".concat(config.familyPrefix, \"-\").concat(DUOTONE_CLASSES.PRIMARY),\n fill: 'currentColor',\n d: vectorData[1]\n }\n }]\n };\n } else {\n element = {\n tag: 'path',\n attributes: {\n fill: 'currentColor',\n d: vectorData\n }\n };\n }\n\n return {\n found: true,\n width: width,\n height: height,\n icon: element\n };\n}\nfunction findIcon(iconName, prefix) {\n return new picked(function (resolve, reject) {\n var val = {\n found: false,\n width: 512,\n height: 512,\n icon: missing\n };\n\n if (iconName && prefix && styles$2[prefix] && styles$2[prefix][iconName]) {\n var icon = styles$2[prefix][iconName];\n return resolve(asFoundIcon(icon));\n }\n\n if (iconName && prefix && !config.showMissingIcons) {\n reject(new MissingIcon(\"Icon is missing for prefix \".concat(prefix, \" with icon name \").concat(iconName)));\n } else {\n resolve(val);\n }\n });\n}\n\nvar styles$3 = namespace.styles;\n\nfunction generateSvgReplacementMutation(node, nodeMeta) {\n var iconName = nodeMeta.iconName,\n title = nodeMeta.title,\n titleId = nodeMeta.titleId,\n prefix = nodeMeta.prefix,\n transform = nodeMeta.transform,\n symbol = nodeMeta.symbol,\n mask = nodeMeta.mask,\n maskId = nodeMeta.maskId,\n extra = nodeMeta.extra;\n return new picked(function (resolve, reject) {\n picked.all([findIcon(iconName, prefix), findIcon(mask.iconName, mask.prefix)]).then(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n main = _ref2[0],\n mask = _ref2[1];\n\n resolve([node, makeInlineSvgAbstract({\n icons: {\n main: main,\n mask: mask\n },\n prefix: prefix,\n iconName: iconName,\n transform: transform,\n symbol: symbol,\n mask: mask,\n maskId: maskId,\n title: title,\n titleId: titleId,\n extra: extra,\n watchable: true\n })]);\n });\n });\n}\n\nfunction generateLayersText(node, nodeMeta) {\n var title = nodeMeta.title,\n transform = nodeMeta.transform,\n extra = nodeMeta.extra;\n var width = null;\n var height = null;\n\n if (IS_IE) {\n var computedFontSize = parseInt(getComputedStyle(node).fontSize, 10);\n var boundingClientRect = node.getBoundingClientRect();\n width = boundingClientRect.width / computedFontSize;\n height = boundingClientRect.height / computedFontSize;\n }\n\n if (config.autoA11y && !title) {\n extra.attributes['aria-hidden'] = 'true';\n }\n\n return picked.resolve([node, makeLayersTextAbstract({\n content: node.innerHTML,\n width: width,\n height: height,\n transform: transform,\n title: title,\n extra: extra,\n watchable: true\n })]);\n}\n\nfunction generateMutation(node) {\n var nodeMeta = parseMeta(node);\n\n if (~nodeMeta.extra.classes.indexOf(LAYERS_TEXT_CLASSNAME)) {\n return generateLayersText(node, nodeMeta);\n } else {\n return generateSvgReplacementMutation(node, nodeMeta);\n }\n}\n\nfunction onTree(root) {\n var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n if (!IS_DOM) return;\n var htmlClassList = DOCUMENT.documentElement.classList;\n\n var hclAdd = function hclAdd(suffix) {\n return htmlClassList.add(\"\".concat(HTML_CLASS_I2SVG_BASE_CLASS, \"-\").concat(suffix));\n };\n\n var hclRemove = function hclRemove(suffix) {\n return htmlClassList.remove(\"\".concat(HTML_CLASS_I2SVG_BASE_CLASS, \"-\").concat(suffix));\n };\n\n var prefixes = config.autoFetchSvg ? Object.keys(PREFIX_TO_STYLE) : Object.keys(styles$3);\n var prefixesDomQuery = [\".\".concat(LAYERS_TEXT_CLASSNAME, \":not([\").concat(DATA_FA_I2SVG, \"])\")].concat(prefixes.map(function (p) {\n return \".\".concat(p, \":not([\").concat(DATA_FA_I2SVG, \"])\");\n })).join(', ');\n\n if (prefixesDomQuery.length === 0) {\n return;\n }\n\n var candidates = [];\n\n try {\n candidates = toArray(root.querySelectorAll(prefixesDomQuery));\n } catch (e) {// noop\n }\n\n if (candidates.length > 0) {\n hclAdd('pending');\n hclRemove('complete');\n } else {\n return;\n }\n\n var mark = perf.begin('onTree');\n var mutations = candidates.reduce(function (acc, node) {\n try {\n var mutation = generateMutation(node);\n\n if (mutation) {\n acc.push(mutation);\n }\n } catch (e) {\n if (!PRODUCTION) {\n if (e instanceof MissingIcon) {\n console.error(e);\n }\n }\n }\n\n return acc;\n }, []);\n return new picked(function (resolve, reject) {\n picked.all(mutations).then(function (resolvedMutations) {\n perform(resolvedMutations, function () {\n hclAdd('active');\n hclAdd('complete');\n hclRemove('pending');\n if (typeof callback === 'function') callback();\n mark();\n resolve();\n });\n }).catch(function () {\n mark();\n reject();\n });\n });\n}\nfunction onNode(node) {\n var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n generateMutation(node).then(function (mutation) {\n if (mutation) {\n perform([mutation], callback);\n }\n });\n}\n\nfunction replaceForPosition(node, position) {\n var pendingAttribute = \"\".concat(DATA_FA_PSEUDO_ELEMENT_PENDING).concat(position.replace(':', '-'));\n return new picked(function (resolve, reject) {\n if (node.getAttribute(pendingAttribute) !== null) {\n // This node is already being processed\n return resolve();\n }\n\n var children = toArray(node.children);\n var alreadyProcessedPseudoElement = children.filter(function (c) {\n return c.getAttribute(DATA_FA_PSEUDO_ELEMENT) === position;\n })[0];\n var styles = WINDOW.getComputedStyle(node, position);\n var fontFamily = styles.getPropertyValue('font-family').match(FONT_FAMILY_PATTERN);\n var fontWeight = styles.getPropertyValue('font-weight');\n var content = styles.getPropertyValue('content');\n\n if (alreadyProcessedPseudoElement && !fontFamily) {\n // If we've already processed it but the current computed style does not result in a font-family,\n // that probably means that a class name that was previously present to make the icon has been\n // removed. So we now should delete the icon.\n node.removeChild(alreadyProcessedPseudoElement);\n return resolve();\n } else if (fontFamily && content !== 'none' && content !== '') {\n var _content = styles.getPropertyValue('content');\n\n var prefix = ~['Solid', 'Regular', 'Light', 'Duotone', 'Brands', 'Kit'].indexOf(fontFamily[2]) ? STYLE_TO_PREFIX[fontFamily[2].toLowerCase()] : FONT_WEIGHT_TO_PREFIX[fontWeight];\n var hexValue = toHex(_content.length === 3 ? _content.substr(1, 1) : _content);\n var iconName = byUnicode(prefix, hexValue);\n var iconIdentifier = iconName; // Only convert the pseudo element in this :before/:after position into an icon if we haven't\n // already done so with the same prefix and iconName\n\n if (iconName && (!alreadyProcessedPseudoElement || alreadyProcessedPseudoElement.getAttribute(DATA_PREFIX) !== prefix || alreadyProcessedPseudoElement.getAttribute(DATA_ICON) !== iconIdentifier)) {\n node.setAttribute(pendingAttribute, iconIdentifier);\n\n if (alreadyProcessedPseudoElement) {\n // Delete the old one, since we're replacing it with a new one\n node.removeChild(alreadyProcessedPseudoElement);\n }\n\n var meta = blankMeta();\n var extra = meta.extra;\n extra.attributes[DATA_FA_PSEUDO_ELEMENT] = position;\n findIcon(iconName, prefix).then(function (main) {\n var abstract = makeInlineSvgAbstract(_objectSpread({}, meta, {\n icons: {\n main: main,\n mask: emptyCanonicalIcon()\n },\n prefix: prefix,\n iconName: iconIdentifier,\n extra: extra,\n watchable: true\n }));\n var element = DOCUMENT.createElement('svg');\n\n if (position === ':before') {\n node.insertBefore(element, node.firstChild);\n } else {\n node.appendChild(element);\n }\n\n element.outerHTML = abstract.map(function (a) {\n return toHtml(a);\n }).join('\\n');\n node.removeAttribute(pendingAttribute);\n resolve();\n }).catch(reject);\n } else {\n resolve();\n }\n } else {\n resolve();\n }\n });\n}\n\nfunction replace(node) {\n return picked.all([replaceForPosition(node, ':before'), replaceForPosition(node, ':after')]);\n}\n\nfunction processable(node) {\n return node.parentNode !== document.head && !~TAGNAMES_TO_SKIP_FOR_PSEUDOELEMENTS.indexOf(node.tagName.toUpperCase()) && !node.getAttribute(DATA_FA_PSEUDO_ELEMENT) && (!node.parentNode || node.parentNode.tagName !== 'svg');\n}\n\nfunction searchPseudoElements (root) {\n if (!IS_DOM) return;\n return new picked(function (resolve, reject) {\n var operations = toArray(root.querySelectorAll('*')).filter(processable).map(replace);\n var end = perf.begin('searchPseudoElements');\n disableObservation();\n picked.all(operations).then(function () {\n end();\n enableObservation();\n resolve();\n }).catch(function () {\n end();\n enableObservation();\n reject();\n });\n });\n}\n\nvar baseStyles = \"svg:not(:root).svg-inline--fa {\\n overflow: visible;\\n}\\n\\n.svg-inline--fa {\\n display: inline-block;\\n font-size: inherit;\\n height: 1em;\\n overflow: visible;\\n vertical-align: -0.125em;\\n}\\n.svg-inline--fa.fa-lg {\\n vertical-align: -0.225em;\\n}\\n.svg-inline--fa.fa-w-1 {\\n width: 0.0625em;\\n}\\n.svg-inline--fa.fa-w-2 {\\n width: 0.125em;\\n}\\n.svg-inline--fa.fa-w-3 {\\n width: 0.1875em;\\n}\\n.svg-inline--fa.fa-w-4 {\\n width: 0.25em;\\n}\\n.svg-inline--fa.fa-w-5 {\\n width: 0.3125em;\\n}\\n.svg-inline--fa.fa-w-6 {\\n width: 0.375em;\\n}\\n.svg-inline--fa.fa-w-7 {\\n width: 0.4375em;\\n}\\n.svg-inline--fa.fa-w-8 {\\n width: 0.5em;\\n}\\n.svg-inline--fa.fa-w-9 {\\n width: 0.5625em;\\n}\\n.svg-inline--fa.fa-w-10 {\\n width: 0.625em;\\n}\\n.svg-inline--fa.fa-w-11 {\\n width: 0.6875em;\\n}\\n.svg-inline--fa.fa-w-12 {\\n width: 0.75em;\\n}\\n.svg-inline--fa.fa-w-13 {\\n width: 0.8125em;\\n}\\n.svg-inline--fa.fa-w-14 {\\n width: 0.875em;\\n}\\n.svg-inline--fa.fa-w-15 {\\n width: 0.9375em;\\n}\\n.svg-inline--fa.fa-w-16 {\\n width: 1em;\\n}\\n.svg-inline--fa.fa-w-17 {\\n width: 1.0625em;\\n}\\n.svg-inline--fa.fa-w-18 {\\n width: 1.125em;\\n}\\n.svg-inline--fa.fa-w-19 {\\n width: 1.1875em;\\n}\\n.svg-inline--fa.fa-w-20 {\\n width: 1.25em;\\n}\\n.svg-inline--fa.fa-pull-left {\\n margin-right: 0.3em;\\n width: auto;\\n}\\n.svg-inline--fa.fa-pull-right {\\n margin-left: 0.3em;\\n width: auto;\\n}\\n.svg-inline--fa.fa-border {\\n height: 1.5em;\\n}\\n.svg-inline--fa.fa-li {\\n width: 2em;\\n}\\n.svg-inline--fa.fa-fw {\\n width: 1.25em;\\n}\\n\\n.fa-layers svg.svg-inline--fa {\\n bottom: 0;\\n left: 0;\\n margin: auto;\\n position: absolute;\\n right: 0;\\n top: 0;\\n}\\n\\n.fa-layers {\\n display: inline-block;\\n height: 1em;\\n position: relative;\\n text-align: center;\\n vertical-align: -0.125em;\\n width: 1em;\\n}\\n.fa-layers svg.svg-inline--fa {\\n -webkit-transform-origin: center center;\\n transform-origin: center center;\\n}\\n\\n.fa-layers-counter, .fa-layers-text {\\n display: inline-block;\\n position: absolute;\\n text-align: center;\\n}\\n\\n.fa-layers-text {\\n left: 50%;\\n top: 50%;\\n -webkit-transform: translate(-50%, -50%);\\n transform: translate(-50%, -50%);\\n -webkit-transform-origin: center center;\\n transform-origin: center center;\\n}\\n\\n.fa-layers-counter {\\n background-color: #ff253a;\\n border-radius: 1em;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n color: #fff;\\n height: 1.5em;\\n line-height: 1;\\n max-width: 5em;\\n min-width: 1.5em;\\n overflow: hidden;\\n padding: 0.25em;\\n right: 0;\\n text-overflow: ellipsis;\\n top: 0;\\n -webkit-transform: scale(0.25);\\n transform: scale(0.25);\\n -webkit-transform-origin: top right;\\n transform-origin: top right;\\n}\\n\\n.fa-layers-bottom-right {\\n bottom: 0;\\n right: 0;\\n top: auto;\\n -webkit-transform: scale(0.25);\\n transform: scale(0.25);\\n -webkit-transform-origin: bottom right;\\n transform-origin: bottom right;\\n}\\n\\n.fa-layers-bottom-left {\\n bottom: 0;\\n left: 0;\\n right: auto;\\n top: auto;\\n -webkit-transform: scale(0.25);\\n transform: scale(0.25);\\n -webkit-transform-origin: bottom left;\\n transform-origin: bottom left;\\n}\\n\\n.fa-layers-top-right {\\n right: 0;\\n top: 0;\\n -webkit-transform: scale(0.25);\\n transform: scale(0.25);\\n -webkit-transform-origin: top right;\\n transform-origin: top right;\\n}\\n\\n.fa-layers-top-left {\\n left: 0;\\n right: auto;\\n top: 0;\\n -webkit-transform: scale(0.25);\\n transform: scale(0.25);\\n -webkit-transform-origin: top left;\\n transform-origin: top left;\\n}\\n\\n.fa-lg {\\n font-size: 1.3333333333em;\\n line-height: 0.75em;\\n vertical-align: -0.0667em;\\n}\\n\\n.fa-xs {\\n font-size: 0.75em;\\n}\\n\\n.fa-sm {\\n font-size: 0.875em;\\n}\\n\\n.fa-1x {\\n font-size: 1em;\\n}\\n\\n.fa-2x {\\n font-size: 2em;\\n}\\n\\n.fa-3x {\\n font-size: 3em;\\n}\\n\\n.fa-4x {\\n font-size: 4em;\\n}\\n\\n.fa-5x {\\n font-size: 5em;\\n}\\n\\n.fa-6x {\\n font-size: 6em;\\n}\\n\\n.fa-7x {\\n font-size: 7em;\\n}\\n\\n.fa-8x {\\n font-size: 8em;\\n}\\n\\n.fa-9x {\\n font-size: 9em;\\n}\\n\\n.fa-10x {\\n font-size: 10em;\\n}\\n\\n.fa-fw {\\n text-align: center;\\n width: 1.25em;\\n}\\n\\n.fa-ul {\\n list-style-type: none;\\n margin-left: 2.5em;\\n padding-left: 0;\\n}\\n.fa-ul > li {\\n position: relative;\\n}\\n\\n.fa-li {\\n left: -2em;\\n position: absolute;\\n text-align: center;\\n width: 2em;\\n line-height: inherit;\\n}\\n\\n.fa-border {\\n border: solid 0.08em #eee;\\n border-radius: 0.1em;\\n padding: 0.2em 0.25em 0.15em;\\n}\\n\\n.fa-pull-left {\\n float: left;\\n}\\n\\n.fa-pull-right {\\n float: right;\\n}\\n\\n.fa.fa-pull-left,\\n.fas.fa-pull-left,\\n.far.fa-pull-left,\\n.fal.fa-pull-left,\\n.fab.fa-pull-left {\\n margin-right: 0.3em;\\n}\\n.fa.fa-pull-right,\\n.fas.fa-pull-right,\\n.far.fa-pull-right,\\n.fal.fa-pull-right,\\n.fab.fa-pull-right {\\n margin-left: 0.3em;\\n}\\n\\n.fa-spin {\\n -webkit-animation: fa-spin 2s infinite linear;\\n animation: fa-spin 2s infinite linear;\\n}\\n\\n.fa-pulse {\\n -webkit-animation: fa-spin 1s infinite steps(8);\\n animation: fa-spin 1s infinite steps(8);\\n}\\n\\n@-webkit-keyframes fa-spin {\\n 0% {\\n -webkit-transform: rotate(0deg);\\n transform: rotate(0deg);\\n }\\n 100% {\\n -webkit-transform: rotate(360deg);\\n transform: rotate(360deg);\\n }\\n}\\n\\n@keyframes fa-spin {\\n 0% {\\n -webkit-transform: rotate(0deg);\\n transform: rotate(0deg);\\n }\\n 100% {\\n -webkit-transform: rotate(360deg);\\n transform: rotate(360deg);\\n }\\n}\\n.fa-rotate-90 {\\n -ms-filter: \\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)\\\";\\n -webkit-transform: rotate(90deg);\\n transform: rotate(90deg);\\n}\\n\\n.fa-rotate-180 {\\n -ms-filter: \\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)\\\";\\n -webkit-transform: rotate(180deg);\\n transform: rotate(180deg);\\n}\\n\\n.fa-rotate-270 {\\n -ms-filter: \\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)\\\";\\n -webkit-transform: rotate(270deg);\\n transform: rotate(270deg);\\n}\\n\\n.fa-flip-horizontal {\\n -ms-filter: \\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)\\\";\\n -webkit-transform: scale(-1, 1);\\n transform: scale(-1, 1);\\n}\\n\\n.fa-flip-vertical {\\n -ms-filter: \\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)\\\";\\n -webkit-transform: scale(1, -1);\\n transform: scale(1, -1);\\n}\\n\\n.fa-flip-both, .fa-flip-horizontal.fa-flip-vertical {\\n -ms-filter: \\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)\\\";\\n -webkit-transform: scale(-1, -1);\\n transform: scale(-1, -1);\\n}\\n\\n:root .fa-rotate-90,\\n:root .fa-rotate-180,\\n:root .fa-rotate-270,\\n:root .fa-flip-horizontal,\\n:root .fa-flip-vertical,\\n:root .fa-flip-both {\\n -webkit-filter: none;\\n filter: none;\\n}\\n\\n.fa-stack {\\n display: inline-block;\\n height: 2em;\\n position: relative;\\n width: 2.5em;\\n}\\n\\n.fa-stack-1x,\\n.fa-stack-2x {\\n bottom: 0;\\n left: 0;\\n margin: auto;\\n position: absolute;\\n right: 0;\\n top: 0;\\n}\\n\\n.svg-inline--fa.fa-stack-1x {\\n height: 1em;\\n width: 1.25em;\\n}\\n.svg-inline--fa.fa-stack-2x {\\n height: 2em;\\n width: 2.5em;\\n}\\n\\n.fa-inverse {\\n color: #fff;\\n}\\n\\n.sr-only {\\n border: 0;\\n clip: rect(0, 0, 0, 0);\\n height: 1px;\\n margin: -1px;\\n overflow: hidden;\\n padding: 0;\\n position: absolute;\\n width: 1px;\\n}\\n\\n.sr-only-focusable:active, .sr-only-focusable:focus {\\n clip: auto;\\n height: auto;\\n margin: 0;\\n overflow: visible;\\n position: static;\\n width: auto;\\n}\\n\\n.svg-inline--fa .fa-primary {\\n fill: var(--fa-primary-color, currentColor);\\n opacity: 1;\\n opacity: var(--fa-primary-opacity, 1);\\n}\\n\\n.svg-inline--fa .fa-secondary {\\n fill: var(--fa-secondary-color, currentColor);\\n opacity: 0.4;\\n opacity: var(--fa-secondary-opacity, 0.4);\\n}\\n\\n.svg-inline--fa.fa-swap-opacity .fa-primary {\\n opacity: 0.4;\\n opacity: var(--fa-secondary-opacity, 0.4);\\n}\\n\\n.svg-inline--fa.fa-swap-opacity .fa-secondary {\\n opacity: 1;\\n opacity: var(--fa-primary-opacity, 1);\\n}\\n\\n.svg-inline--fa mask .fa-primary,\\n.svg-inline--fa mask .fa-secondary {\\n fill: black;\\n}\\n\\n.fad.fa-inverse {\\n color: #fff;\\n}\";\n\nfunction css () {\n var dfp = DEFAULT_FAMILY_PREFIX;\n var drc = DEFAULT_REPLACEMENT_CLASS;\n var fp = config.familyPrefix;\n var rc = config.replacementClass;\n var s = baseStyles;\n\n if (fp !== dfp || rc !== drc) {\n var dPatt = new RegExp(\"\\\\.\".concat(dfp, \"\\\\-\"), 'g');\n var customPropPatt = new RegExp(\"\\\\--\".concat(dfp, \"\\\\-\"), 'g');\n var rPatt = new RegExp(\"\\\\.\".concat(drc), 'g');\n s = s.replace(dPatt, \".\".concat(fp, \"-\")).replace(customPropPatt, \"--\".concat(fp, \"-\")).replace(rPatt, \".\".concat(rc));\n }\n\n return s;\n}\n\nvar Library =\n/*#__PURE__*/\nfunction () {\n function Library() {\n _classCallCheck(this, Library);\n\n this.definitions = {};\n }\n\n _createClass(Library, [{\n key: \"add\",\n value: function add() {\n var _this = this;\n\n for (var _len = arguments.length, definitions = new Array(_len), _key = 0; _key < _len; _key++) {\n definitions[_key] = arguments[_key];\n }\n\n var additions = definitions.reduce(this._pullDefinitions, {});\n Object.keys(additions).forEach(function (key) {\n _this.definitions[key] = _objectSpread({}, _this.definitions[key] || {}, additions[key]);\n defineIcons(key, additions[key]);\n build();\n });\n }\n }, {\n key: \"reset\",\n value: function reset() {\n this.definitions = {};\n }\n }, {\n key: \"_pullDefinitions\",\n value: function _pullDefinitions(additions, definition) {\n var normalized = definition.prefix && definition.iconName && definition.icon ? {\n 0: definition\n } : definition;\n Object.keys(normalized).map(function (key) {\n var _normalized$key = normalized[key],\n prefix = _normalized$key.prefix,\n iconName = _normalized$key.iconName,\n icon = _normalized$key.icon;\n if (!additions[prefix]) additions[prefix] = {};\n additions[prefix][iconName] = icon;\n });\n return additions;\n }\n }]);\n\n return Library;\n}();\n\nfunction ensureCss() {\n if (config.autoAddCss && !_cssInserted) {\n insertCss(css());\n\n _cssInserted = true;\n }\n}\n\nfunction apiObject(val, abstractCreator) {\n Object.defineProperty(val, 'abstract', {\n get: abstractCreator\n });\n Object.defineProperty(val, 'html', {\n get: function get() {\n return val.abstract.map(function (a) {\n return toHtml(a);\n });\n }\n });\n Object.defineProperty(val, 'node', {\n get: function get() {\n if (!IS_DOM) return;\n var container = DOCUMENT.createElement('div');\n container.innerHTML = val.html;\n return container.children;\n }\n });\n return val;\n}\n\nfunction findIconDefinition(iconLookup) {\n var _iconLookup$prefix = iconLookup.prefix,\n prefix = _iconLookup$prefix === void 0 ? 'fa' : _iconLookup$prefix,\n iconName = iconLookup.iconName;\n if (!iconName) return;\n return iconFromMapping(library.definitions, prefix, iconName) || iconFromMapping(namespace.styles, prefix, iconName);\n}\n\nfunction resolveIcons(next) {\n return function (maybeIconDefinition) {\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var iconDefinition = (maybeIconDefinition || {}).icon ? maybeIconDefinition : findIconDefinition(maybeIconDefinition || {});\n var mask = params.mask;\n\n if (mask) {\n mask = (mask || {}).icon ? mask : findIconDefinition(mask || {});\n }\n\n return next(iconDefinition, _objectSpread({}, params, {\n mask: mask\n }));\n };\n}\n\nvar library = new Library();\nvar noAuto = function noAuto() {\n config.autoReplaceSvg = false;\n config.observeMutations = false;\n disconnect();\n};\nvar _cssInserted = false;\nvar dom = {\n i2svg: function i2svg() {\n var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n if (IS_DOM) {\n ensureCss();\n var _params$node = params.node,\n node = _params$node === void 0 ? DOCUMENT : _params$node,\n _params$callback = params.callback,\n callback = _params$callback === void 0 ? function () {} : _params$callback;\n\n if (config.searchPseudoElements) {\n searchPseudoElements(node);\n }\n\n return onTree(node, callback);\n } else {\n return picked.reject('Operation requires a DOM of some kind.');\n }\n },\n css: css,\n insertCss: function insertCss$$1() {\n if (!_cssInserted) {\n insertCss(css());\n\n _cssInserted = true;\n }\n },\n watch: function watch() {\n var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var autoReplaceSvgRoot = params.autoReplaceSvgRoot,\n observeMutationsRoot = params.observeMutationsRoot;\n\n if (config.autoReplaceSvg === false) {\n config.autoReplaceSvg = true;\n }\n\n config.observeMutations = true;\n domready(function () {\n autoReplace({\n autoReplaceSvgRoot: autoReplaceSvgRoot\n });\n observe({\n treeCallback: onTree,\n nodeCallback: onNode,\n pseudoElementsCallback: searchPseudoElements,\n observeMutationsRoot: observeMutationsRoot\n });\n });\n }\n};\nvar parse = {\n transform: function transform(transformString) {\n return parseTransformString(transformString);\n }\n};\nvar icon = resolveIcons(function (iconDefinition) {\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _params$transform = params.transform,\n transform = _params$transform === void 0 ? meaninglessTransform : _params$transform,\n _params$symbol = params.symbol,\n symbol = _params$symbol === void 0 ? false : _params$symbol,\n _params$mask = params.mask,\n mask = _params$mask === void 0 ? null : _params$mask,\n _params$maskId = params.maskId,\n maskId = _params$maskId === void 0 ? null : _params$maskId,\n _params$title = params.title,\n title = _params$title === void 0 ? null : _params$title,\n _params$titleId = params.titleId,\n titleId = _params$titleId === void 0 ? null : _params$titleId,\n _params$classes = params.classes,\n classes = _params$classes === void 0 ? [] : _params$classes,\n _params$attributes = params.attributes,\n attributes = _params$attributes === void 0 ? {} : _params$attributes,\n _params$styles = params.styles,\n styles = _params$styles === void 0 ? {} : _params$styles;\n if (!iconDefinition) return;\n var prefix = iconDefinition.prefix,\n iconName = iconDefinition.iconName,\n icon = iconDefinition.icon;\n return apiObject(_objectSpread({\n type: 'icon'\n }, iconDefinition), function () {\n ensureCss();\n\n if (config.autoA11y) {\n if (title) {\n attributes['aria-labelledby'] = \"\".concat(config.replacementClass, \"-title-\").concat(titleId || nextUniqueId());\n } else {\n attributes['aria-hidden'] = 'true';\n attributes['focusable'] = 'false';\n }\n }\n\n return makeInlineSvgAbstract({\n icons: {\n main: asFoundIcon(icon),\n mask: mask ? asFoundIcon(mask.icon) : {\n found: false,\n width: null,\n height: null,\n icon: {}\n }\n },\n prefix: prefix,\n iconName: iconName,\n transform: _objectSpread({}, meaninglessTransform, transform),\n symbol: symbol,\n title: title,\n maskId: maskId,\n titleId: titleId,\n extra: {\n attributes: attributes,\n styles: styles,\n classes: classes\n }\n });\n });\n});\nvar text = function text(content) {\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _params$transform2 = params.transform,\n transform = _params$transform2 === void 0 ? meaninglessTransform : _params$transform2,\n _params$title2 = params.title,\n title = _params$title2 === void 0 ? null : _params$title2,\n _params$classes2 = params.classes,\n classes = _params$classes2 === void 0 ? [] : _params$classes2,\n _params$attributes2 = params.attributes,\n attributes = _params$attributes2 === void 0 ? {} : _params$attributes2,\n _params$styles2 = params.styles,\n styles = _params$styles2 === void 0 ? {} : _params$styles2;\n return apiObject({\n type: 'text',\n content: content\n }, function () {\n ensureCss();\n return makeLayersTextAbstract({\n content: content,\n transform: _objectSpread({}, meaninglessTransform, transform),\n title: title,\n extra: {\n attributes: attributes,\n styles: styles,\n classes: [\"\".concat(config.familyPrefix, \"-layers-text\")].concat(_toConsumableArray(classes))\n }\n });\n });\n};\nvar counter = function counter(content) {\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _params$title3 = params.title,\n title = _params$title3 === void 0 ? null : _params$title3,\n _params$classes3 = params.classes,\n classes = _params$classes3 === void 0 ? [] : _params$classes3,\n _params$attributes3 = params.attributes,\n attributes = _params$attributes3 === void 0 ? {} : _params$attributes3,\n _params$styles3 = params.styles,\n styles = _params$styles3 === void 0 ? {} : _params$styles3;\n return apiObject({\n type: 'counter',\n content: content\n }, function () {\n ensureCss();\n return makeLayersCounterAbstract({\n content: content.toString(),\n title: title,\n extra: {\n attributes: attributes,\n styles: styles,\n classes: [\"\".concat(config.familyPrefix, \"-layers-counter\")].concat(_toConsumableArray(classes))\n }\n });\n });\n};\nvar layer = function layer(assembler) {\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _params$classes4 = params.classes,\n classes = _params$classes4 === void 0 ? [] : _params$classes4;\n return apiObject({\n type: 'layer'\n }, function () {\n ensureCss();\n var children = [];\n assembler(function (args) {\n Array.isArray(args) ? args.map(function (a) {\n children = children.concat(a.abstract);\n }) : children = children.concat(args.abstract);\n });\n return [{\n tag: 'span',\n attributes: {\n class: [\"\".concat(config.familyPrefix, \"-layers\")].concat(_toConsumableArray(classes)).join(' ')\n },\n children: children\n }];\n });\n};\nvar api = {\n noAuto: noAuto,\n config: config,\n dom: dom,\n library: library,\n parse: parse,\n findIconDefinition: findIconDefinition,\n icon: icon,\n text: text,\n counter: counter,\n layer: layer,\n toHtml: toHtml\n};\n\nvar autoReplace = function autoReplace() {\n var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var _params$autoReplaceSv = params.autoReplaceSvgRoot,\n autoReplaceSvgRoot = _params$autoReplaceSv === void 0 ? DOCUMENT : _params$autoReplaceSv;\n if ((Object.keys(namespace.styles).length > 0 || config.autoFetchSvg) && IS_DOM && config.autoReplaceSvg) api.dom.i2svg({\n node: autoReplaceSvgRoot\n });\n};\n\nexport { icon, noAuto, config, toHtml, layer, text, counter, library, dom, parse, findIconDefinition };\n","import { parse, icon } from '@fortawesome/fontawesome-svg-core';\nimport PropTypes from 'prop-types';\nimport React from 'react';\n\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n enumerableOnly && (symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n })), keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = null != arguments[i] ? arguments[i] : {};\n i % 2 ? ownKeys(Object(source), !0).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n\n return target;\n}\n\nfunction _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) {\n return typeof obj;\n } : function (obj) {\n return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n }, _typeof(obj);\n}\n\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n}\n\nfunction _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n\n var target = _objectWithoutPropertiesLoose(source, excluded);\n\n var key, i;\n\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n\n return target;\n}\n\nfunction _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n}\n\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n}\n\nfunction _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}\n\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\n\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n return arr2;\n}\n\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\n// Get CSS class list from a props object\nfunction classList(props) {\n var _classes;\n\n var beat = props.beat,\n fade = props.fade,\n beatFade = props.beatFade,\n bounce = props.bounce,\n shake = props.shake,\n flash = props.flash,\n spin = props.spin,\n spinPulse = props.spinPulse,\n spinReverse = props.spinReverse,\n pulse = props.pulse,\n fixedWidth = props.fixedWidth,\n inverse = props.inverse,\n border = props.border,\n listItem = props.listItem,\n flip = props.flip,\n size = props.size,\n rotation = props.rotation,\n pull = props.pull; // map of CSS class names to properties\n\n var classes = (_classes = {\n 'fa-beat': beat,\n 'fa-fade': fade,\n 'fa-beat-fade': beatFade,\n 'fa-bounce': bounce,\n 'fa-shake': shake,\n 'fa-flash': flash,\n 'fa-spin': spin,\n 'fa-spin-reverse': spinReverse,\n 'fa-spin-pulse': spinPulse,\n 'fa-pulse': pulse,\n 'fa-fw': fixedWidth,\n 'fa-inverse': inverse,\n 'fa-border': border,\n 'fa-li': listItem,\n 'fa-flip': flip === true,\n 'fa-flip-horizontal': flip === 'horizontal' || flip === 'both',\n 'fa-flip-vertical': flip === 'vertical' || flip === 'both'\n }, _defineProperty(_classes, \"fa-\".concat(size), typeof size !== 'undefined' && size !== null), _defineProperty(_classes, \"fa-rotate-\".concat(rotation), typeof rotation !== 'undefined' && rotation !== null && rotation !== 0), _defineProperty(_classes, \"fa-pull-\".concat(pull), typeof pull !== 'undefined' && pull !== null), _defineProperty(_classes, 'fa-swap-opacity', props.swapOpacity), _classes); // map over all the keys in the classes object\n // return an array of the keys where the value for the key is not null\n\n return Object.keys(classes).map(function (key) {\n return classes[key] ? key : null;\n }).filter(function (key) {\n return key;\n });\n}\n\n// Camelize taken from humps\n// humps is copyright © 2012+ Dom Christie\n// Released under the MIT license.\n// Performant way to determine if object coerces to a number\nfunction _isNumerical(obj) {\n obj = obj - 0; // eslint-disable-next-line no-self-compare\n\n return obj === obj;\n}\n\nfunction camelize(string) {\n if (_isNumerical(string)) {\n return string;\n } // eslint-disable-next-line no-useless-escape\n\n\n string = string.replace(/[\\-_\\s]+(.)?/g, function (match, chr) {\n return chr ? chr.toUpperCase() : '';\n }); // Ensure 1st char is always lowercase\n\n return string.substr(0, 1).toLowerCase() + string.substr(1);\n}\n\nvar _excluded$1 = [\"style\"];\n\nfunction capitalize(val) {\n return val.charAt(0).toUpperCase() + val.slice(1);\n}\n\nfunction styleToObject(style) {\n return style.split(';').map(function (s) {\n return s.trim();\n }).filter(function (s) {\n return s;\n }).reduce(function (acc, pair) {\n var i = pair.indexOf(':');\n var prop = camelize(pair.slice(0, i));\n var value = pair.slice(i + 1).trim();\n prop.startsWith('webkit') ? acc[capitalize(prop)] = value : acc[prop] = value;\n return acc;\n }, {});\n}\n\nfunction convert(createElement, element) {\n var extraProps = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n if (typeof element === 'string') {\n return element;\n }\n\n var children = (element.children || []).map(function (child) {\n return convert(createElement, child);\n });\n /* eslint-disable dot-notation */\n\n var mixins = Object.keys(element.attributes || {}).reduce(function (acc, key) {\n var val = element.attributes[key];\n\n switch (key) {\n case 'class':\n acc.attrs['className'] = val;\n delete element.attributes['class'];\n break;\n\n case 'style':\n acc.attrs['style'] = styleToObject(val);\n break;\n\n default:\n if (key.indexOf('aria-') === 0 || key.indexOf('data-') === 0) {\n acc.attrs[key.toLowerCase()] = val;\n } else {\n acc.attrs[camelize(key)] = val;\n }\n\n }\n\n return acc;\n }, {\n attrs: {}\n });\n\n var _extraProps$style = extraProps.style,\n existingStyle = _extraProps$style === void 0 ? {} : _extraProps$style,\n remaining = _objectWithoutProperties(extraProps, _excluded$1);\n\n mixins.attrs['style'] = _objectSpread2(_objectSpread2({}, mixins.attrs['style']), existingStyle);\n /* eslint-enable */\n\n return createElement.apply(void 0, [element.tag, _objectSpread2(_objectSpread2({}, mixins.attrs), remaining)].concat(_toConsumableArray(children)));\n}\n\nvar PRODUCTION = false;\n\ntry {\n PRODUCTION = process.env.NODE_ENV === 'production';\n} catch (e) {}\n\nfunction log () {\n if (!PRODUCTION && console && typeof console.error === 'function') {\n var _console;\n\n (_console = console).error.apply(_console, arguments);\n }\n}\n\nfunction normalizeIconArgs(icon) {\n // this has everything that it needs to be rendered which means it was probably imported\n // directly from an icon svg package\n if (icon && _typeof(icon) === 'object' && icon.prefix && icon.iconName && icon.icon) {\n return icon;\n }\n\n if (parse.icon) {\n return parse.icon(icon);\n } // if the icon is null, there's nothing to do\n\n\n if (icon === null) {\n return null;\n } // if the icon is an object and has a prefix and an icon name, return it\n\n\n if (icon && _typeof(icon) === 'object' && icon.prefix && icon.iconName) {\n return icon;\n } // if it's an array with length of two\n\n\n if (Array.isArray(icon) && icon.length === 2) {\n // use the first item as prefix, second as icon name\n return {\n prefix: icon[0],\n iconName: icon[1]\n };\n } // if it's a string, use it as the icon name\n\n\n if (typeof icon === 'string') {\n return {\n prefix: 'fas',\n iconName: icon\n };\n }\n}\n\n// creates an object with a key of key\n// and a value of value\n// if certain conditions are met\nfunction objectWithKey(key, value) {\n // if the value is a non-empty array\n // or it's not an array but it is truthy\n // then create the object with the key and the value\n // if not, return an empty array\n return Array.isArray(value) && value.length > 0 || !Array.isArray(value) && value ? _defineProperty({}, key, value) : {};\n}\n\nvar _excluded = [\"forwardedRef\"];\nfunction FontAwesomeIcon(_ref) {\n var forwardedRef = _ref.forwardedRef,\n props = _objectWithoutProperties(_ref, _excluded);\n\n var iconArgs = props.icon,\n maskArgs = props.mask,\n symbol = props.symbol,\n className = props.className,\n title = props.title,\n titleId = props.titleId,\n maskId = props.maskId;\n var iconLookup = normalizeIconArgs(iconArgs);\n var classes = objectWithKey('classes', [].concat(_toConsumableArray(classList(props)), _toConsumableArray(className.split(' '))));\n var transform = objectWithKey('transform', typeof props.transform === 'string' ? parse.transform(props.transform) : props.transform);\n var mask = objectWithKey('mask', normalizeIconArgs(maskArgs));\n var renderedIcon = icon(iconLookup, _objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2({}, classes), transform), mask), {}, {\n symbol: symbol,\n title: title,\n titleId: titleId,\n maskId: maskId\n }));\n\n if (!renderedIcon) {\n log('Could not find icon', iconLookup);\n return null;\n }\n\n var abstract = renderedIcon.abstract;\n var extraProps = {\n ref: forwardedRef\n };\n Object.keys(props).forEach(function (key) {\n // eslint-disable-next-line no-prototype-builtins\n if (!FontAwesomeIcon.defaultProps.hasOwnProperty(key)) {\n extraProps[key] = props[key];\n }\n });\n return convertCurry(abstract[0], extraProps);\n}\nFontAwesomeIcon.displayName = 'FontAwesomeIcon';\nFontAwesomeIcon.propTypes = {\n beat: PropTypes.bool,\n border: PropTypes.bool,\n beatFade: PropTypes.bool,\n bounce: PropTypes.bool,\n className: PropTypes.string,\n fade: PropTypes.bool,\n flash: PropTypes.bool,\n mask: PropTypes.oneOfType([PropTypes.object, PropTypes.array, PropTypes.string]),\n maskId: PropTypes.string,\n fixedWidth: PropTypes.bool,\n inverse: PropTypes.bool,\n flip: PropTypes.oneOf([true, false, 'horizontal', 'vertical', 'both']),\n icon: PropTypes.oneOfType([PropTypes.object, PropTypes.array, PropTypes.string]),\n listItem: PropTypes.bool,\n pull: PropTypes.oneOf(['right', 'left']),\n pulse: PropTypes.bool,\n rotation: PropTypes.oneOf([0, 90, 180, 270]),\n shake: PropTypes.bool,\n size: PropTypes.oneOf(['2xs', 'xs', 'sm', 'lg', 'xl', '2xl', '1x', '2x', '3x', '4x', '5x', '6x', '7x', '8x', '9x', '10x']),\n spin: PropTypes.bool,\n spinPulse: PropTypes.bool,\n spinReverse: PropTypes.bool,\n symbol: PropTypes.oneOfType([PropTypes.bool, PropTypes.string]),\n title: PropTypes.string,\n titleId: PropTypes.string,\n transform: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\n swapOpacity: PropTypes.bool\n};\nFontAwesomeIcon.defaultProps = {\n border: false,\n className: '',\n mask: null,\n maskId: null,\n fixedWidth: false,\n inverse: false,\n flip: false,\n icon: null,\n listItem: false,\n pull: null,\n pulse: false,\n rotation: null,\n size: null,\n spin: false,\n spinPulse: false,\n spinReverse: false,\n beat: false,\n fade: false,\n beatFade: false,\n bounce: false,\n shake: false,\n symbol: false,\n title: '',\n titleId: null,\n transform: null,\n swapOpacity: false\n};\nvar convertCurry = convert.bind(null, React.createElement);\n\nexport { FontAwesomeIcon };\n","/*!\n * Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com\n * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)\n */\nvar prefix = \"far\";\nvar faAddressBook = {\n prefix: 'far',\n iconName: 'address-book',\n icon: [448, 512, [], \"f2b9\", \"M436 160c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-20V48c0-26.5-21.5-48-48-48H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h320c26.5 0 48-21.5 48-48v-48h20c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-20v-64h20c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-20v-64h20zm-68 304H48V48h320v416zM208 256c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm-89.6 128h179.2c12.4 0 22.4-8.6 22.4-19.2v-19.2c0-31.8-30.1-57.6-67.2-57.6-10.8 0-18.7 8-44.8 8-26.9 0-33.4-8-44.8-8-37.1 0-67.2 25.8-67.2 57.6v19.2c0 10.6 10 19.2 22.4 19.2z\"]\n};\nvar faAddressCard = {\n prefix: 'far',\n iconName: 'address-card',\n icon: [576, 512, [], \"f2bb\", \"M528 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h480c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm0 400H48V80h480v352zM208 256c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm-89.6 128h179.2c12.4 0 22.4-8.6 22.4-19.2v-19.2c0-31.8-30.1-57.6-67.2-57.6-10.8 0-18.7 8-44.8 8-26.9 0-33.4-8-44.8-8-37.1 0-67.2 25.8-67.2 57.6v19.2c0 10.6 10 19.2 22.4 19.2zM360 320h112c4.4 0 8-3.6 8-8v-16c0-4.4-3.6-8-8-8H360c-4.4 0-8 3.6-8 8v16c0 4.4 3.6 8 8 8zm0-64h112c4.4 0 8-3.6 8-8v-16c0-4.4-3.6-8-8-8H360c-4.4 0-8 3.6-8 8v16c0 4.4 3.6 8 8 8zm0-64h112c4.4 0 8-3.6 8-8v-16c0-4.4-3.6-8-8-8H360c-4.4 0-8 3.6-8 8v16c0 4.4 3.6 8 8 8z\"]\n};\nvar faAngry = {\n prefix: 'far',\n iconName: 'angry',\n icon: [496, 512, [], \"f556\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm0-144c-33.6 0-65.2 14.8-86.8 40.6-8.5 10.2-7.1 25.3 3.1 33.8s25.3 7.2 33.8-3c24.8-29.7 75-29.7 99.8 0 8.1 9.7 23.2 11.9 33.8 3 10.2-8.5 11.5-23.6 3.1-33.8-21.6-25.8-53.2-40.6-86.8-40.6zm-48-72c10.3 0 19.9-6.7 23-17.1 3.8-12.7-3.4-26.1-16.1-29.9l-80-24c-12.8-3.9-26.1 3.4-29.9 16.1-3.8 12.7 3.4 26.1 16.1 29.9l28.2 8.5c-3.1 4.9-5.3 10.4-5.3 16.6 0 17.7 14.3 32 32 32s32-14.4 32-32.1zm199-54.9c-3.8-12.7-17.1-19.9-29.9-16.1l-80 24c-12.7 3.8-19.9 17.2-16.1 29.9 3.1 10.4 12.7 17.1 23 17.1 0 17.7 14.3 32 32 32s32-14.3 32-32c0-6.2-2.2-11.7-5.3-16.6l28.2-8.5c12.7-3.7 19.9-17.1 16.1-29.8z\"]\n};\nvar faArrowAltCircleDown = {\n prefix: 'far',\n iconName: 'arrow-alt-circle-down',\n icon: [512, 512, [], \"f358\", \"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm0 448c-110.5 0-200-89.5-200-200S145.5 56 256 56s200 89.5 200 200-89.5 200-200 200zm-32-316v116h-67c-10.7 0-16 12.9-8.5 20.5l99 99c4.7 4.7 12.3 4.7 17 0l99-99c7.6-7.6 2.2-20.5-8.5-20.5h-67V140c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12z\"]\n};\nvar faArrowAltCircleLeft = {\n prefix: 'far',\n iconName: 'arrow-alt-circle-left',\n icon: [512, 512, [], \"f359\", \"M8 256c0 137 111 248 248 248s248-111 248-248S393 8 256 8 8 119 8 256zm448 0c0 110.5-89.5 200-200 200S56 366.5 56 256 145.5 56 256 56s200 89.5 200 200zm-72-20v40c0 6.6-5.4 12-12 12H256v67c0 10.7-12.9 16-20.5 8.5l-99-99c-4.7-4.7-4.7-12.3 0-17l99-99c7.6-7.6 20.5-2.2 20.5 8.5v67h116c6.6 0 12 5.4 12 12z\"]\n};\nvar faArrowAltCircleRight = {\n prefix: 'far',\n iconName: 'arrow-alt-circle-right',\n icon: [512, 512, [], \"f35a\", \"M504 256C504 119 393 8 256 8S8 119 8 256s111 248 248 248 248-111 248-248zm-448 0c0-110.5 89.5-200 200-200s200 89.5 200 200-89.5 200-200 200S56 366.5 56 256zm72 20v-40c0-6.6 5.4-12 12-12h116v-67c0-10.7 12.9-16 20.5-8.5l99 99c4.7 4.7 4.7 12.3 0 17l-99 99c-7.6 7.6-20.5 2.2-20.5-8.5v-67H140c-6.6 0-12-5.4-12-12z\"]\n};\nvar faArrowAltCircleUp = {\n prefix: 'far',\n iconName: 'arrow-alt-circle-up',\n icon: [512, 512, [], \"f35b\", \"M256 504c137 0 248-111 248-248S393 8 256 8 8 119 8 256s111 248 248 248zm0-448c110.5 0 200 89.5 200 200s-89.5 200-200 200S56 366.5 56 256 145.5 56 256 56zm20 328h-40c-6.6 0-12-5.4-12-12V256h-67c-10.7 0-16-12.9-8.5-20.5l99-99c4.7-4.7 12.3-4.7 17 0l99 99c7.6 7.6 2.2 20.5-8.5 20.5h-67v116c0 6.6-5.4 12-12 12z\"]\n};\nvar faBell = {\n prefix: 'far',\n iconName: 'bell',\n icon: [448, 512, [], \"f0f3\", \"M439.39 362.29c-19.32-20.76-55.47-51.99-55.47-154.29 0-77.7-54.48-139.9-127.94-155.16V32c0-17.67-14.32-32-31.98-32s-31.98 14.33-31.98 32v20.84C118.56 68.1 64.08 130.3 64.08 208c0 102.3-36.15 133.53-55.47 154.29-6 6.45-8.66 14.16-8.61 21.71.11 16.4 12.98 32 32.1 32h383.8c19.12 0 32-15.6 32.1-32 .05-7.55-2.61-15.27-8.61-21.71zM67.53 368c21.22-27.97 44.42-74.33 44.53-159.42 0-.2-.06-.38-.06-.58 0-61.86 50.14-112 112-112s112 50.14 112 112c0 .2-.06.38-.06.58.11 85.1 23.31 131.46 44.53 159.42H67.53zM224 512c35.32 0 63.97-28.65 63.97-64H160.03c0 35.35 28.65 64 63.97 64z\"]\n};\nvar faBellSlash = {\n prefix: 'far',\n iconName: 'bell-slash',\n icon: [640, 512, [], \"f1f6\", \"M633.99 471.02L36 3.51C29.1-2.01 19.03-.9 13.51 6l-10 12.49C-2.02 25.39-.9 35.46 6 40.98l598 467.51c6.9 5.52 16.96 4.4 22.49-2.49l10-12.49c5.52-6.9 4.41-16.97-2.5-22.49zM163.53 368c16.71-22.03 34.48-55.8 41.4-110.58l-45.47-35.55c-3.27 90.73-36.47 120.68-54.84 140.42-6 6.45-8.66 14.16-8.61 21.71.11 16.4 12.98 32 32.1 32h279.66l-61.4-48H163.53zM320 96c61.86 0 112 50.14 112 112 0 .2-.06.38-.06.58.02 16.84 1.16 31.77 2.79 45.73l59.53 46.54c-8.31-22.13-14.34-51.49-14.34-92.85 0-77.7-54.48-139.9-127.94-155.16V32c0-17.67-14.32-32-31.98-32s-31.98 14.33-31.98 32v20.84c-26.02 5.41-49.45 16.94-69.13 32.72l38.17 29.84C275 103.18 296.65 96 320 96zm0 416c35.32 0 63.97-28.65 63.97-64H256.03c0 35.35 28.65 64 63.97 64z\"]\n};\nvar faBookmark = {\n prefix: 'far',\n iconName: 'bookmark',\n icon: [384, 512, [], \"f02e\", \"M336 0H48C21.49 0 0 21.49 0 48v464l192-112 192 112V48c0-26.51-21.49-48-48-48zm0 428.43l-144-84-144 84V54a6 6 0 0 1 6-6h276c3.314 0 6 2.683 6 5.996V428.43z\"]\n};\nvar faBuilding = {\n prefix: 'far',\n iconName: 'building',\n icon: [448, 512, [], \"f1ad\", \"M128 148v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12zm140 12h40c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12zm-128 96h40c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12zm128 0h40c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12zm-76 84v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm76 12h40c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12zm180 124v36H0v-36c0-6.6 5.4-12 12-12h19.5V24c0-13.3 10.7-24 24-24h337c13.3 0 24 10.7 24 24v440H436c6.6 0 12 5.4 12 12zM79.5 463H192v-67c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v67h112.5V49L80 48l-.5 415z\"]\n};\nvar faCalendar = {\n prefix: 'far',\n iconName: 'calendar',\n icon: [448, 512, [], \"f133\", \"M400 64h-48V12c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v52H160V12c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v52H48C21.5 64 0 85.5 0 112v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48zm-6 400H54c-3.3 0-6-2.7-6-6V160h352v298c0 3.3-2.7 6-6 6z\"]\n};\nvar faCalendarAlt = {\n prefix: 'far',\n iconName: 'calendar-alt',\n icon: [448, 512, [], \"f073\", \"M148 288h-40c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12zm108-12v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm96 0v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm-96 96v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm-96 0v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm192 0v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm96-260v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V112c0-26.5 21.5-48 48-48h48V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h128V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h48c26.5 0 48 21.5 48 48zm-48 346V160H48v298c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z\"]\n};\nvar faCalendarCheck = {\n prefix: 'far',\n iconName: 'calendar-check',\n icon: [448, 512, [], \"f274\", \"M400 64h-48V12c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v52H160V12c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v52H48C21.49 64 0 85.49 0 112v352c0 26.51 21.49 48 48 48h352c26.51 0 48-21.49 48-48V112c0-26.51-21.49-48-48-48zm-6 400H54a6 6 0 0 1-6-6V160h352v298a6 6 0 0 1-6 6zm-52.849-200.65L198.842 404.519c-4.705 4.667-12.303 4.637-16.971-.068l-75.091-75.699c-4.667-4.705-4.637-12.303.068-16.971l22.719-22.536c4.705-4.667 12.303-4.637 16.97.069l44.104 44.461 111.072-110.181c4.705-4.667 12.303-4.637 16.971.068l22.536 22.718c4.667 4.705 4.636 12.303-.069 16.97z\"]\n};\nvar faCalendarMinus = {\n prefix: 'far',\n iconName: 'calendar-minus',\n icon: [448, 512, [], \"f272\", \"M124 328c-6.6 0-12-5.4-12-12v-24c0-6.6 5.4-12 12-12h200c6.6 0 12 5.4 12 12v24c0 6.6-5.4 12-12 12H124zm324-216v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V112c0-26.5 21.5-48 48-48h48V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h128V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h48c26.5 0 48 21.5 48 48zm-48 346V160H48v298c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z\"]\n};\nvar faCalendarPlus = {\n prefix: 'far',\n iconName: 'calendar-plus',\n icon: [448, 512, [], \"f271\", \"M336 292v24c0 6.6-5.4 12-12 12h-76v76c0 6.6-5.4 12-12 12h-24c-6.6 0-12-5.4-12-12v-76h-76c-6.6 0-12-5.4-12-12v-24c0-6.6 5.4-12 12-12h76v-76c0-6.6 5.4-12 12-12h24c6.6 0 12 5.4 12 12v76h76c6.6 0 12 5.4 12 12zm112-180v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V112c0-26.5 21.5-48 48-48h48V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h128V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h48c26.5 0 48 21.5 48 48zm-48 346V160H48v298c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z\"]\n};\nvar faCalendarTimes = {\n prefix: 'far',\n iconName: 'calendar-times',\n icon: [448, 512, [], \"f273\", \"M311.7 374.7l-17 17c-4.7 4.7-12.3 4.7-17 0L224 337.9l-53.7 53.7c-4.7 4.7-12.3 4.7-17 0l-17-17c-4.7-4.7-4.7-12.3 0-17l53.7-53.7-53.7-53.7c-4.7-4.7-4.7-12.3 0-17l17-17c4.7-4.7 12.3-4.7 17 0l53.7 53.7 53.7-53.7c4.7-4.7 12.3-4.7 17 0l17 17c4.7 4.7 4.7 12.3 0 17L257.9 304l53.7 53.7c4.8 4.7 4.8 12.3.1 17zM448 112v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V112c0-26.5 21.5-48 48-48h48V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h128V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h48c26.5 0 48 21.5 48 48zm-48 346V160H48v298c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z\"]\n};\nvar faCaretSquareDown = {\n prefix: 'far',\n iconName: 'caret-square-down',\n icon: [448, 512, [], \"f150\", \"M125.1 208h197.8c10.7 0 16.1 13 8.5 20.5l-98.9 98.3c-4.7 4.7-12.2 4.7-16.9 0l-98.9-98.3c-7.7-7.5-2.3-20.5 8.4-20.5zM448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-48 346V86c0-3.3-2.7-6-6-6H54c-3.3 0-6 2.7-6 6v340c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z\"]\n};\nvar faCaretSquareLeft = {\n prefix: 'far',\n iconName: 'caret-square-left',\n icon: [448, 512, [], \"f191\", \"M272 157.1v197.8c0 10.7-13 16.1-20.5 8.5l-98.3-98.9c-4.7-4.7-4.7-12.2 0-16.9l98.3-98.9c7.5-7.7 20.5-2.3 20.5 8.4zM448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-48 346V86c0-3.3-2.7-6-6-6H54c-3.3 0-6 2.7-6 6v340c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z\"]\n};\nvar faCaretSquareRight = {\n prefix: 'far',\n iconName: 'caret-square-right',\n icon: [448, 512, [], \"f152\", \"M176 354.9V157.1c0-10.7 13-16.1 20.5-8.5l98.3 98.9c4.7 4.7 4.7 12.2 0 16.9l-98.3 98.9c-7.5 7.7-20.5 2.3-20.5-8.4zM448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-48 346V86c0-3.3-2.7-6-6-6H54c-3.3 0-6 2.7-6 6v340c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z\"]\n};\nvar faCaretSquareUp = {\n prefix: 'far',\n iconName: 'caret-square-up',\n icon: [448, 512, [], \"f151\", \"M322.9 304H125.1c-10.7 0-16.1-13-8.5-20.5l98.9-98.3c4.7-4.7 12.2-4.7 16.9 0l98.9 98.3c7.7 7.5 2.3 20.5-8.4 20.5zM448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-48 346V86c0-3.3-2.7-6-6-6H54c-3.3 0-6 2.7-6 6v340c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z\"]\n};\nvar faChartBar = {\n prefix: 'far',\n iconName: 'chart-bar',\n icon: [512, 512, [], \"f080\", \"M396.8 352h22.4c6.4 0 12.8-6.4 12.8-12.8V108.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v230.4c0 6.4 6.4 12.8 12.8 12.8zm-192 0h22.4c6.4 0 12.8-6.4 12.8-12.8V140.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v198.4c0 6.4 6.4 12.8 12.8 12.8zm96 0h22.4c6.4 0 12.8-6.4 12.8-12.8V204.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v134.4c0 6.4 6.4 12.8 12.8 12.8zM496 400H48V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v336c0 17.67 14.33 32 32 32h464c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16zm-387.2-48h22.4c6.4 0 12.8-6.4 12.8-12.8v-70.4c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v70.4c0 6.4 6.4 12.8 12.8 12.8z\"]\n};\nvar faCheckCircle = {\n prefix: 'far',\n iconName: 'check-circle',\n icon: [512, 512, [], \"f058\", \"M256 8C119.033 8 8 119.033 8 256s111.033 248 248 248 248-111.033 248-248S392.967 8 256 8zm0 48c110.532 0 200 89.451 200 200 0 110.532-89.451 200-200 200-110.532 0-200-89.451-200-200 0-110.532 89.451-200 200-200m140.204 130.267l-22.536-22.718c-4.667-4.705-12.265-4.736-16.97-.068L215.346 303.697l-59.792-60.277c-4.667-4.705-12.265-4.736-16.97-.069l-22.719 22.536c-4.705 4.667-4.736 12.265-.068 16.971l90.781 91.516c4.667 4.705 12.265 4.736 16.97.068l172.589-171.204c4.704-4.668 4.734-12.266.067-16.971z\"]\n};\nvar faCheckSquare = {\n prefix: 'far',\n iconName: 'check-square',\n icon: [448, 512, [], \"f14a\", \"M400 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h352c26.51 0 48-21.49 48-48V80c0-26.51-21.49-48-48-48zm0 400H48V80h352v352zm-35.864-241.724L191.547 361.48c-4.705 4.667-12.303 4.637-16.97-.068l-90.781-91.516c-4.667-4.705-4.637-12.303.069-16.971l22.719-22.536c4.705-4.667 12.303-4.637 16.97.069l59.792 60.277 141.352-140.216c4.705-4.667 12.303-4.637 16.97.068l22.536 22.718c4.667 4.706 4.637 12.304-.068 16.971z\"]\n};\nvar faCircle = {\n prefix: 'far',\n iconName: 'circle',\n icon: [512, 512, [], \"f111\", \"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm0 448c-110.5 0-200-89.5-200-200S145.5 56 256 56s200 89.5 200 200-89.5 200-200 200z\"]\n};\nvar faClipboard = {\n prefix: 'far',\n iconName: 'clipboard',\n icon: [384, 512, [], \"f328\", \"M336 64h-80c0-35.3-28.7-64-64-64s-64 28.7-64 64H48C21.5 64 0 85.5 0 112v352c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48zM192 40c13.3 0 24 10.7 24 24s-10.7 24-24 24-24-10.7-24-24 10.7-24 24-24zm144 418c0 3.3-2.7 6-6 6H54c-3.3 0-6-2.7-6-6V118c0-3.3 2.7-6 6-6h42v36c0 6.6 5.4 12 12 12h168c6.6 0 12-5.4 12-12v-36h42c3.3 0 6 2.7 6 6z\"]\n};\nvar faClock = {\n prefix: 'far',\n iconName: 'clock',\n icon: [512, 512, [], \"f017\", \"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm0 448c-110.5 0-200-89.5-200-200S145.5 56 256 56s200 89.5 200 200-89.5 200-200 200zm61.8-104.4l-84.9-61.7c-3.1-2.3-4.9-5.9-4.9-9.7V116c0-6.6 5.4-12 12-12h32c6.6 0 12 5.4 12 12v141.7l66.8 48.6c5.4 3.9 6.5 11.4 2.6 16.8L334.6 349c-3.9 5.3-11.4 6.5-16.8 2.6z\"]\n};\nvar faClone = {\n prefix: 'far',\n iconName: 'clone',\n icon: [512, 512, [], \"f24d\", \"M464 0H144c-26.51 0-48 21.49-48 48v48H48c-26.51 0-48 21.49-48 48v320c0 26.51 21.49 48 48 48h320c26.51 0 48-21.49 48-48v-48h48c26.51 0 48-21.49 48-48V48c0-26.51-21.49-48-48-48zM362 464H54a6 6 0 0 1-6-6V150a6 6 0 0 1 6-6h42v224c0 26.51 21.49 48 48 48h224v42a6 6 0 0 1-6 6zm96-96H150a6 6 0 0 1-6-6V54a6 6 0 0 1 6-6h308a6 6 0 0 1 6 6v308a6 6 0 0 1-6 6z\"]\n};\nvar faClosedCaptioning = {\n prefix: 'far',\n iconName: 'closed-captioning',\n icon: [512, 512, [], \"f20a\", \"M464 64H48C21.5 64 0 85.5 0 112v288c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48zm-6 336H54c-3.3 0-6-2.7-6-6V118c0-3.3 2.7-6 6-6h404c3.3 0 6 2.7 6 6v276c0 3.3-2.7 6-6 6zm-211.1-85.7c1.7 2.4 1.5 5.6-.5 7.7-53.6 56.8-172.8 32.1-172.8-67.9 0-97.3 121.7-119.5 172.5-70.1 2.1 2 2.5 3.2 1 5.7l-17.5 30.5c-1.9 3.1-6.2 4-9.1 1.7-40.8-32-94.6-14.9-94.6 31.2 0 48 51 70.5 92.2 32.6 2.8-2.5 7.1-2.1 9.2.9l19.6 27.7zm190.4 0c1.7 2.4 1.5 5.6-.5 7.7-53.6 56.9-172.8 32.1-172.8-67.9 0-97.3 121.7-119.5 172.5-70.1 2.1 2 2.5 3.2 1 5.7L420 220.2c-1.9 3.1-6.2 4-9.1 1.7-40.8-32-94.6-14.9-94.6 31.2 0 48 51 70.5 92.2 32.6 2.8-2.5 7.1-2.1 9.2.9l19.6 27.7z\"]\n};\nvar faComment = {\n prefix: 'far',\n iconName: 'comment',\n icon: [512, 512, [], \"f075\", \"M256 32C114.6 32 0 125.1 0 240c0 47.6 19.9 91.2 52.9 126.3C38 405.7 7 439.1 6.5 439.5c-6.6 7-8.4 17.2-4.6 26S14.4 480 24 480c61.5 0 110-25.7 139.1-46.3C192 442.8 223.2 448 256 448c141.4 0 256-93.1 256-208S397.4 32 256 32zm0 368c-26.7 0-53.1-4.1-78.4-12.1l-22.7-7.2-19.5 13.8c-14.3 10.1-33.9 21.4-57.5 29 7.3-12.1 14.4-25.7 19.9-40.2l10.6-28.1-20.6-21.8C69.7 314.1 48 282.2 48 240c0-88.2 93.3-160 208-160s208 71.8 208 160-93.3 160-208 160z\"]\n};\nvar faCommentAlt = {\n prefix: 'far',\n iconName: 'comment-alt',\n icon: [512, 512, [], \"f27a\", \"M448 0H64C28.7 0 0 28.7 0 64v288c0 35.3 28.7 64 64 64h96v84c0 7.1 5.8 12 12 12 2.4 0 4.9-.7 7.1-2.4L304 416h144c35.3 0 64-28.7 64-64V64c0-35.3-28.7-64-64-64zm16 352c0 8.8-7.2 16-16 16H288l-12.8 9.6L208 428v-60H64c-8.8 0-16-7.2-16-16V64c0-8.8 7.2-16 16-16h384c8.8 0 16 7.2 16 16v288z\"]\n};\nvar faCommentDots = {\n prefix: 'far',\n iconName: 'comment-dots',\n icon: [512, 512, [], \"f4ad\", \"M144 208c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm112 0c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm112 0c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zM256 32C114.6 32 0 125.1 0 240c0 47.6 19.9 91.2 52.9 126.3C38 405.7 7 439.1 6.5 439.5c-6.6 7-8.4 17.2-4.6 26S14.4 480 24 480c61.5 0 110-25.7 139.1-46.3C192 442.8 223.2 448 256 448c141.4 0 256-93.1 256-208S397.4 32 256 32zm0 368c-26.7 0-53.1-4.1-78.4-12.1l-22.7-7.2-19.5 13.8c-14.3 10.1-33.9 21.4-57.5 29 7.3-12.1 14.4-25.7 19.9-40.2l10.6-28.1-20.6-21.8C69.7 314.1 48 282.2 48 240c0-88.2 93.3-160 208-160s208 71.8 208 160-93.3 160-208 160z\"]\n};\nvar faComments = {\n prefix: 'far',\n iconName: 'comments',\n icon: [576, 512, [], \"f086\", \"M532 386.2c27.5-27.1 44-61.1 44-98.2 0-80-76.5-146.1-176.2-157.9C368.3 72.5 294.3 32 208 32 93.1 32 0 103.6 0 192c0 37 16.5 71 44 98.2-15.3 30.7-37.3 54.5-37.7 54.9-6.3 6.7-8.1 16.5-4.4 25 3.6 8.5 12 14 21.2 14 53.5 0 96.7-20.2 125.2-38.8 9.2 2.1 18.7 3.7 28.4 4.9C208.1 407.6 281.8 448 368 448c20.8 0 40.8-2.4 59.8-6.8C456.3 459.7 499.4 480 553 480c9.2 0 17.5-5.5 21.2-14 3.6-8.5 1.9-18.3-4.4-25-.4-.3-22.5-24.1-37.8-54.8zm-392.8-92.3L122.1 305c-14.1 9.1-28.5 16.3-43.1 21.4 2.7-4.7 5.4-9.7 8-14.8l15.5-31.1L77.7 256C64.2 242.6 48 220.7 48 192c0-60.7 73.3-112 160-112s160 51.3 160 112-73.3 112-160 112c-16.5 0-33-1.9-49-5.6l-19.8-4.5zM498.3 352l-24.7 24.4 15.5 31.1c2.6 5.1 5.3 10.1 8 14.8-14.6-5.1-29-12.3-43.1-21.4l-17.1-11.1-19.9 4.6c-16 3.7-32.5 5.6-49 5.6-54 0-102.2-20.1-131.3-49.7C338 339.5 416 272.9 416 192c0-3.4-.4-6.7-.7-10C479.7 196.5 528 238.8 528 288c0 28.7-16.2 50.6-29.7 64z\"]\n};\nvar faCompass = {\n prefix: 'far',\n iconName: 'compass',\n icon: [496, 512, [], \"f14e\", \"M347.94 129.86L203.6 195.83a31.938 31.938 0 0 0-15.77 15.77l-65.97 144.34c-7.61 16.65 9.54 33.81 26.2 26.2l144.34-65.97a31.938 31.938 0 0 0 15.77-15.77l65.97-144.34c7.61-16.66-9.54-33.81-26.2-26.2zm-77.36 148.72c-12.47 12.47-32.69 12.47-45.16 0-12.47-12.47-12.47-32.69 0-45.16 12.47-12.47 32.69-12.47 45.16 0 12.47 12.47 12.47 32.69 0 45.16zM248 8C111.03 8 0 119.03 0 256s111.03 248 248 248 248-111.03 248-248S384.97 8 248 8zm0 448c-110.28 0-200-89.72-200-200S137.72 56 248 56s200 89.72 200 200-89.72 200-200 200z\"]\n};\nvar faCopy = {\n prefix: 'far',\n iconName: 'copy',\n icon: [448, 512, [], \"f0c5\", \"M433.941 65.941l-51.882-51.882A48 48 0 0 0 348.118 0H176c-26.51 0-48 21.49-48 48v48H48c-26.51 0-48 21.49-48 48v320c0 26.51 21.49 48 48 48h224c26.51 0 48-21.49 48-48v-48h80c26.51 0 48-21.49 48-48V99.882a48 48 0 0 0-14.059-33.941zM266 464H54a6 6 0 0 1-6-6V150a6 6 0 0 1 6-6h74v224c0 26.51 21.49 48 48 48h96v42a6 6 0 0 1-6 6zm128-96H182a6 6 0 0 1-6-6V54a6 6 0 0 1 6-6h106v88c0 13.255 10.745 24 24 24h88v202a6 6 0 0 1-6 6zm6-256h-64V48h9.632c1.591 0 3.117.632 4.243 1.757l48.368 48.368a6 6 0 0 1 1.757 4.243V112z\"]\n};\nvar faCopyright = {\n prefix: 'far',\n iconName: 'copyright',\n icon: [512, 512, [], \"f1f9\", \"M256 8C119.033 8 8 119.033 8 256s111.033 248 248 248 248-111.033 248-248S392.967 8 256 8zm0 448c-110.532 0-200-89.451-200-200 0-110.531 89.451-200 200-200 110.532 0 200 89.451 200 200 0 110.532-89.451 200-200 200zm107.351-101.064c-9.614 9.712-45.53 41.396-104.065 41.396-82.43 0-140.484-61.425-140.484-141.567 0-79.152 60.275-139.401 139.762-139.401 55.531 0 88.738 26.62 97.593 34.779a11.965 11.965 0 0 1 1.936 15.322l-18.155 28.113c-3.841 5.95-11.966 7.282-17.499 2.921-8.595-6.776-31.814-22.538-61.708-22.538-48.303 0-77.916 35.33-77.916 80.082 0 41.589 26.888 83.692 78.277 83.692 32.657 0 56.843-19.039 65.726-27.225 5.27-4.857 13.596-4.039 17.82 1.738l19.865 27.17a11.947 11.947 0 0 1-1.152 15.518z\"]\n};\nvar faCreditCard = {\n prefix: 'far',\n iconName: 'credit-card',\n icon: [576, 512, [], \"f09d\", \"M527.9 32H48.1C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48.1 48h479.8c26.6 0 48.1-21.5 48.1-48V80c0-26.5-21.5-48-48.1-48zM54.1 80h467.8c3.3 0 6 2.7 6 6v42H48.1V86c0-3.3 2.7-6 6-6zm467.8 352H54.1c-3.3 0-6-2.7-6-6V256h479.8v170c0 3.3-2.7 6-6 6zM192 332v40c0 6.6-5.4 12-12 12h-72c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h72c6.6 0 12 5.4 12 12zm192 0v40c0 6.6-5.4 12-12 12H236c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h136c6.6 0 12 5.4 12 12z\"]\n};\nvar faDizzy = {\n prefix: 'far',\n iconName: 'dizzy',\n icon: [496, 512, [], \"f567\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm-33.8-217.9c7.8-7.8 7.8-20.5 0-28.3L196.3 192l17.9-17.9c7.8-7.8 7.8-20.5 0-28.3-7.8-7.8-20.5-7.8-28.3 0L168 163.7l-17.8-17.8c-7.8-7.8-20.5-7.8-28.3 0-7.8 7.8-7.8 20.5 0 28.3l17.9 17.9-17.9 17.9c-7.8 7.8-7.8 20.5 0 28.3 7.8 7.8 20.5 7.8 28.3 0l17.8-17.8 17.8 17.8c7.9 7.7 20.5 7.7 28.4-.2zm160-92.2c-7.8-7.8-20.5-7.8-28.3 0L328 163.7l-17.8-17.8c-7.8-7.8-20.5-7.8-28.3 0-7.8 7.8-7.8 20.5 0 28.3l17.9 17.9-17.9 17.9c-7.8 7.8-7.8 20.5 0 28.3 7.8 7.8 20.5 7.8 28.3 0l17.8-17.8 17.8 17.8c7.8 7.8 20.5 7.8 28.3 0 7.8-7.8 7.8-20.5 0-28.3l-17.8-18 17.9-17.9c7.7-7.8 7.7-20.4 0-28.2zM248 272c-35.3 0-64 28.7-64 64s28.7 64 64 64 64-28.7 64-64-28.7-64-64-64z\"]\n};\nvar faDotCircle = {\n prefix: 'far',\n iconName: 'dot-circle',\n icon: [512, 512, [], \"f192\", \"M256 56c110.532 0 200 89.451 200 200 0 110.532-89.451 200-200 200-110.532 0-200-89.451-200-200 0-110.532 89.451-200 200-200m0-48C119.033 8 8 119.033 8 256s111.033 248 248 248 248-111.033 248-248S392.967 8 256 8zm0 168c-44.183 0-80 35.817-80 80s35.817 80 80 80 80-35.817 80-80-35.817-80-80-80z\"]\n};\nvar faEdit = {\n prefix: 'far',\n iconName: 'edit',\n icon: [576, 512, [], \"f044\", \"M402.3 344.9l32-32c5-5 13.7-1.5 13.7 5.7V464c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V112c0-26.5 21.5-48 48-48h273.5c7.1 0 10.7 8.6 5.7 13.7l-32 32c-1.5 1.5-3.5 2.3-5.7 2.3H48v352h352V350.5c0-2.1.8-4.1 2.3-5.6zm156.6-201.8L296.3 405.7l-90.4 10c-26.2 2.9-48.5-19.2-45.6-45.6l10-90.4L432.9 17.1c22.9-22.9 59.9-22.9 82.7 0l43.2 43.2c22.9 22.9 22.9 60 .1 82.8zM460.1 174L402 115.9 216.2 301.8l-7.3 65.3 65.3-7.3L460.1 174zm64.8-79.7l-43.2-43.2c-4.1-4.1-10.8-4.1-14.8 0L436 82l58.1 58.1 30.9-30.9c4-4.2 4-10.8-.1-14.9z\"]\n};\nvar faEnvelope = {\n prefix: 'far',\n iconName: 'envelope',\n icon: [512, 512, [], \"f0e0\", \"M464 64H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V112c0-26.51-21.49-48-48-48zm0 48v40.805c-22.422 18.259-58.168 46.651-134.587 106.49-16.841 13.247-50.201 45.072-73.413 44.701-23.208.375-56.579-31.459-73.413-44.701C106.18 199.465 70.425 171.067 48 152.805V112h416zM48 400V214.398c22.914 18.251 55.409 43.862 104.938 82.646 21.857 17.205 60.134 55.186 103.062 54.955 42.717.231 80.509-37.199 103.053-54.947 49.528-38.783 82.032-64.401 104.947-82.653V400H48z\"]\n};\nvar faEnvelopeOpen = {\n prefix: 'far',\n iconName: 'envelope-open',\n icon: [512, 512, [], \"f2b6\", \"M494.586 164.516c-4.697-3.883-111.723-89.95-135.251-108.657C337.231 38.191 299.437 0 256 0c-43.205 0-80.636 37.717-103.335 55.859-24.463 19.45-131.07 105.195-135.15 108.549A48.004 48.004 0 0 0 0 201.485V464c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V201.509a48 48 0 0 0-17.414-36.993zM464 458a6 6 0 0 1-6 6H54a6 6 0 0 1-6-6V204.347c0-1.813.816-3.526 2.226-4.665 15.87-12.814 108.793-87.554 132.364-106.293C200.755 78.88 232.398 48 256 48c23.693 0 55.857 31.369 73.41 45.389 23.573 18.741 116.503 93.493 132.366 106.316a5.99 5.99 0 0 1 2.224 4.663V458zm-31.991-187.704c4.249 5.159 3.465 12.795-1.745 16.981-28.975 23.283-59.274 47.597-70.929 56.863C336.636 362.283 299.205 400 256 400c-43.452 0-81.287-38.237-103.335-55.86-11.279-8.967-41.744-33.413-70.927-56.865-5.21-4.187-5.993-11.822-1.745-16.981l15.258-18.528c4.178-5.073 11.657-5.843 16.779-1.726 28.618 23.001 58.566 47.035 70.56 56.571C200.143 320.631 232.307 352 256 352c23.602 0 55.246-30.88 73.41-45.389 11.994-9.535 41.944-33.57 70.563-56.568 5.122-4.116 12.601-3.346 16.778 1.727l15.258 18.526z\"]\n};\nvar faEye = {\n prefix: 'far',\n iconName: 'eye',\n icon: [576, 512, [], \"f06e\", \"M288 144a110.94 110.94 0 0 0-31.24 5 55.4 55.4 0 0 1 7.24 27 56 56 0 0 1-56 56 55.4 55.4 0 0 1-27-7.24A111.71 111.71 0 1 0 288 144zm284.52 97.4C518.29 135.59 410.93 64 288 64S57.68 135.64 3.48 241.41a32.35 32.35 0 0 0 0 29.19C57.71 376.41 165.07 448 288 448s230.32-71.64 284.52-177.41a32.35 32.35 0 0 0 0-29.19zM288 400c-98.65 0-189.09-55-237.93-144C98.91 167 189.34 112 288 112s189.09 55 237.93 144C477.1 345 386.66 400 288 400z\"]\n};\nvar faEyeSlash = {\n prefix: 'far',\n iconName: 'eye-slash',\n icon: [640, 512, [], \"f070\", \"M634 471L36 3.51A16 16 0 0 0 13.51 6l-10 12.49A16 16 0 0 0 6 41l598 467.49a16 16 0 0 0 22.49-2.49l10-12.49A16 16 0 0 0 634 471zM296.79 146.47l134.79 105.38C429.36 191.91 380.48 144 320 144a112.26 112.26 0 0 0-23.21 2.47zm46.42 219.07L208.42 260.16C210.65 320.09 259.53 368 320 368a113 113 0 0 0 23.21-2.46zM320 112c98.65 0 189.09 55 237.93 144a285.53 285.53 0 0 1-44 60.2l37.74 29.5a333.7 333.7 0 0 0 52.9-75.11 32.35 32.35 0 0 0 0-29.19C550.29 135.59 442.93 64 320 64c-36.7 0-71.71 7-104.63 18.81l46.41 36.29c18.94-4.3 38.34-7.1 58.22-7.1zm0 288c-98.65 0-189.08-55-237.93-144a285.47 285.47 0 0 1 44.05-60.19l-37.74-29.5a333.6 333.6 0 0 0-52.89 75.1 32.35 32.35 0 0 0 0 29.19C89.72 376.41 197.08 448 320 448c36.7 0 71.71-7.05 104.63-18.81l-46.41-36.28C359.28 397.2 339.89 400 320 400z\"]\n};\nvar faFile = {\n prefix: 'far',\n iconName: 'file',\n icon: [384, 512, [], \"f15b\", \"M369.9 97.9L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM332.1 128H256V51.9l76.1 76.1zM48 464V48h160v104c0 13.3 10.7 24 24 24h104v288H48z\"]\n};\nvar faFileAlt = {\n prefix: 'far',\n iconName: 'file-alt',\n icon: [384, 512, [], \"f15c\", \"M288 248v28c0 6.6-5.4 12-12 12H108c-6.6 0-12-5.4-12-12v-28c0-6.6 5.4-12 12-12h168c6.6 0 12 5.4 12 12zm-12 72H108c-6.6 0-12 5.4-12 12v28c0 6.6 5.4 12 12 12h168c6.6 0 12-5.4 12-12v-28c0-6.6-5.4-12-12-12zm108-188.1V464c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V48C0 21.5 21.5 0 48 0h204.1C264.8 0 277 5.1 286 14.1L369.9 98c9 8.9 14.1 21.2 14.1 33.9zm-128-80V128h76.1L256 51.9zM336 464V176H232c-13.3 0-24-10.7-24-24V48H48v416h288z\"]\n};\nvar faFileArchive = {\n prefix: 'far',\n iconName: 'file-archive',\n icon: [384, 512, [], \"f1c6\", \"M128.3 160v32h32v-32zm64-96h-32v32h32zm-64 32v32h32V96zm64 32h-32v32h32zm177.6-30.1L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM256 51.9l76.1 76.1H256zM336 464H48V48h79.7v16h32V48H208v104c0 13.3 10.7 24 24 24h104zM194.2 265.7c-1.1-5.6-6-9.7-11.8-9.7h-22.1v-32h-32v32l-19.7 97.1C102 385.6 126.8 416 160 416c33.1 0 57.9-30.2 51.5-62.6zm-33.9 124.4c-17.9 0-32.4-12.1-32.4-27s14.5-27 32.4-27 32.4 12.1 32.4 27-14.5 27-32.4 27zm32-198.1h-32v32h32z\"]\n};\nvar faFileAudio = {\n prefix: 'far',\n iconName: 'file-audio',\n icon: [384, 512, [], \"f1c7\", \"M369.941 97.941l-83.882-83.882A48 48 0 0 0 252.118 0H48C21.49 0 0 21.49 0 48v416c0 26.51 21.49 48 48 48h288c26.51 0 48-21.49 48-48V131.882a48 48 0 0 0-14.059-33.941zM332.118 128H256V51.882L332.118 128zM48 464V48h160v104c0 13.255 10.745 24 24 24h104v288H48zm144-76.024c0 10.691-12.926 16.045-20.485 8.485L136 360.486h-28c-6.627 0-12-5.373-12-12v-56c0-6.627 5.373-12 12-12h28l35.515-36.947c7.56-7.56 20.485-2.206 20.485 8.485v135.952zm41.201-47.13c9.051-9.297 9.06-24.133.001-33.439-22.149-22.752 12.235-56.246 34.395-33.481 27.198 27.94 27.212 72.444.001 100.401-21.793 22.386-56.947-10.315-34.397-33.481z\"]\n};\nvar faFileCode = {\n prefix: 'far',\n iconName: 'file-code',\n icon: [384, 512, [], \"f1c9\", \"M149.9 349.1l-.2-.2-32.8-28.9 32.8-28.9c3.6-3.2 4-8.8.8-12.4l-.2-.2-17.4-18.6c-3.4-3.6-9-3.7-12.4-.4l-57.7 54.1c-3.7 3.5-3.7 9.4 0 12.8l57.7 54.1c1.6 1.5 3.8 2.4 6 2.4 2.4 0 4.8-1 6.4-2.8l17.4-18.6c3.3-3.5 3.1-9.1-.4-12.4zm220-251.2L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM256 51.9l76.1 76.1H256zM336 464H48V48h160v104c0 13.3 10.7 24 24 24h104zM209.6 214c-4.7-1.4-9.5 1.3-10.9 6L144 408.1c-1.4 4.7 1.3 9.6 6 10.9l24.4 7.1c4.7 1.4 9.6-1.4 10.9-6L240 231.9c1.4-4.7-1.3-9.6-6-10.9zm24.5 76.9l.2.2 32.8 28.9-32.8 28.9c-3.6 3.2-4 8.8-.8 12.4l.2.2 17.4 18.6c3.3 3.5 8.9 3.7 12.4.4l57.7-54.1c3.7-3.5 3.7-9.4 0-12.8l-57.7-54.1c-3.5-3.3-9.1-3.2-12.4.4l-17.4 18.6c-3.3 3.5-3.1 9.1.4 12.4z\"]\n};\nvar faFileExcel = {\n prefix: 'far',\n iconName: 'file-excel',\n icon: [384, 512, [], \"f1c3\", \"M369.9 97.9L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM332.1 128H256V51.9l76.1 76.1zM48 464V48h160v104c0 13.3 10.7 24 24 24h104v288H48zm212-240h-28.8c-4.4 0-8.4 2.4-10.5 6.3-18 33.1-22.2 42.4-28.6 57.7-13.9-29.1-6.9-17.3-28.6-57.7-2.1-3.9-6.2-6.3-10.6-6.3H124c-9.3 0-15 10-10.4 18l46.3 78-46.3 78c-4.7 8 1.1 18 10.4 18h28.9c4.4 0 8.4-2.4 10.5-6.3 21.7-40 23-45 28.6-57.7 14.9 30.2 5.9 15.9 28.6 57.7 2.1 3.9 6.2 6.3 10.6 6.3H260c9.3 0 15-10 10.4-18L224 320c.7-1.1 30.3-50.5 46.3-78 4.7-8-1.1-18-10.3-18z\"]\n};\nvar faFileImage = {\n prefix: 'far',\n iconName: 'file-image',\n icon: [384, 512, [], \"f1c5\", \"M369.9 97.9L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM332.1 128H256V51.9l76.1 76.1zM48 464V48h160v104c0 13.3 10.7 24 24 24h104v288H48zm32-48h224V288l-23.5-23.5c-4.7-4.7-12.3-4.7-17 0L176 352l-39.5-39.5c-4.7-4.7-12.3-4.7-17 0L80 352v64zm48-240c-26.5 0-48 21.5-48 48s21.5 48 48 48 48-21.5 48-48-21.5-48-48-48z\"]\n};\nvar faFilePdf = {\n prefix: 'far',\n iconName: 'file-pdf',\n icon: [384, 512, [], \"f1c1\", \"M369.9 97.9L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM332.1 128H256V51.9l76.1 76.1zM48 464V48h160v104c0 13.3 10.7 24 24 24h104v288H48zm250.2-143.7c-12.2-12-47-8.7-64.4-6.5-17.2-10.5-28.7-25-36.8-46.3 3.9-16.1 10.1-40.6 5.4-56-4.2-26.2-37.8-23.6-42.6-5.9-4.4 16.1-.4 38.5 7 67.1-10 23.9-24.9 56-35.4 74.4-20 10.3-47 26.2-51 46.2-3.3 15.8 26 55.2 76.1-31.2 22.4-7.4 46.8-16.5 68.4-20.1 18.9 10.2 41 17 55.8 17 25.5 0 28-28.2 17.5-38.7zm-198.1 77.8c5.1-13.7 24.5-29.5 30.4-35-19 30.3-30.4 35.7-30.4 35zm81.6-190.6c7.4 0 6.7 32.1 1.8 40.8-4.4-13.9-4.3-40.8-1.8-40.8zm-24.4 136.6c9.7-16.9 18-37 24.7-54.7 8.3 15.1 18.9 27.2 30.1 35.5-20.8 4.3-38.9 13.1-54.8 19.2zm131.6-5s-5 6-37.3-7.8c35.1-2.6 40.9 5.4 37.3 7.8z\"]\n};\nvar faFilePowerpoint = {\n prefix: 'far',\n iconName: 'file-powerpoint',\n icon: [384, 512, [], \"f1c4\", \"M369.9 97.9L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM332.1 128H256V51.9l76.1 76.1zM48 464V48h160v104c0 13.3 10.7 24 24 24h104v288H48zm72-60V236c0-6.6 5.4-12 12-12h69.2c36.7 0 62.8 27 62.8 66.3 0 74.3-68.7 66.5-95.5 66.5V404c0 6.6-5.4 12-12 12H132c-6.6 0-12-5.4-12-12zm48.5-87.4h23c7.9 0 13.9-2.4 18.1-7.2 8.5-9.8 8.4-28.5.1-37.8-4.1-4.6-9.9-7-17.4-7h-23.9v52z\"]\n};\nvar faFileVideo = {\n prefix: 'far',\n iconName: 'file-video',\n icon: [384, 512, [], \"f1c8\", \"M369.941 97.941l-83.882-83.882A48 48 0 0 0 252.118 0H48C21.49 0 0 21.49 0 48v416c0 26.51 21.49 48 48 48h288c26.51 0 48-21.49 48-48V131.882a48 48 0 0 0-14.059-33.941zM332.118 128H256V51.882L332.118 128zM48 464V48h160v104c0 13.255 10.745 24 24 24h104v288H48zm228.687-211.303L224 305.374V268c0-11.046-8.954-20-20-20H100c-11.046 0-20 8.954-20 20v104c0 11.046 8.954 20 20 20h104c11.046 0 20-8.954 20-20v-37.374l52.687 52.674C286.704 397.318 304 390.28 304 375.986V264.011c0-14.311-17.309-21.319-27.313-11.314z\"]\n};\nvar faFileWord = {\n prefix: 'far',\n iconName: 'file-word',\n icon: [384, 512, [], \"f1c2\", \"M369.9 97.9L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM332.1 128H256V51.9l76.1 76.1zM48 464V48h160v104c0 13.3 10.7 24 24 24h104v288H48zm220.1-208c-5.7 0-10.6 4-11.7 9.5-20.6 97.7-20.4 95.4-21 103.5-.2-1.2-.4-2.6-.7-4.3-.8-5.1.3.2-23.6-99.5-1.3-5.4-6.1-9.2-11.7-9.2h-13.3c-5.5 0-10.3 3.8-11.7 9.1-24.4 99-24 96.2-24.8 103.7-.1-1.1-.2-2.5-.5-4.2-.7-5.2-14.1-73.3-19.1-99-1.1-5.6-6-9.7-11.8-9.7h-16.8c-7.8 0-13.5 7.3-11.7 14.8 8 32.6 26.7 109.5 33.2 136 1.3 5.4 6.1 9.1 11.7 9.1h25.2c5.5 0 10.3-3.7 11.6-9.1l17.9-71.4c1.5-6.2 2.5-12 3-17.3l2.9 17.3c.1.4 12.6 50.5 17.9 71.4 1.3 5.3 6.1 9.1 11.6 9.1h24.7c5.5 0 10.3-3.7 11.6-9.1 20.8-81.9 30.2-119 34.5-136 1.9-7.6-3.8-14.9-11.6-14.9h-15.8z\"]\n};\nvar faFlag = {\n prefix: 'far',\n iconName: 'flag',\n icon: [512, 512, [], \"f024\", \"M336.174 80c-49.132 0-93.305-32-161.913-32-31.301 0-58.303 6.482-80.721 15.168a48.04 48.04 0 0 0 2.142-20.727C93.067 19.575 74.167 1.594 51.201.104 23.242-1.71 0 20.431 0 48c0 17.764 9.657 33.262 24 41.562V496c0 8.837 7.163 16 16 16h16c8.837 0 16-7.163 16-16v-83.443C109.869 395.28 143.259 384 199.826 384c49.132 0 93.305 32 161.913 32 58.479 0 101.972-22.617 128.548-39.981C503.846 367.161 512 352.051 512 335.855V95.937c0-34.459-35.264-57.768-66.904-44.117C409.193 67.309 371.641 80 336.174 80zM464 336c-21.783 15.412-60.824 32-102.261 32-59.945 0-102.002-32-161.913-32-43.361 0-96.379 9.403-127.826 24V128c21.784-15.412 60.824-32 102.261-32 59.945 0 102.002 32 161.913 32 43.271 0 96.32-17.366 127.826-32v240z\"]\n};\nvar faFlushed = {\n prefix: 'far',\n iconName: 'flushed',\n icon: [496, 512, [], \"f579\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm96-312c-44.2 0-80 35.8-80 80s35.8 80 80 80 80-35.8 80-80-35.8-80-80-80zm0 128c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zm0-72c-13.3 0-24 10.7-24 24s10.7 24 24 24 24-10.7 24-24-10.7-24-24-24zm-112 24c0-44.2-35.8-80-80-80s-80 35.8-80 80 35.8 80 80 80 80-35.8 80-80zm-80 48c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zm0-72c-13.3 0-24 10.7-24 24s10.7 24 24 24 24-10.7 24-24-10.7-24-24-24zm160 144H184c-13.2 0-24 10.8-24 24s10.8 24 24 24h128c13.2 0 24-10.8 24-24s-10.8-24-24-24z\"]\n};\nvar faFolder = {\n prefix: 'far',\n iconName: 'folder',\n icon: [512, 512, [], \"f07b\", \"M464 128H272l-54.63-54.63c-6-6-14.14-9.37-22.63-9.37H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V176c0-26.51-21.49-48-48-48zm0 272H48V112h140.12l54.63 54.63c6 6 14.14 9.37 22.63 9.37H464v224z\"]\n};\nvar faFolderOpen = {\n prefix: 'far',\n iconName: 'folder-open',\n icon: [576, 512, [], \"f07c\", \"M527.9 224H480v-48c0-26.5-21.5-48-48-48H272l-64-64H48C21.5 64 0 85.5 0 112v288c0 26.5 21.5 48 48 48h400c16.5 0 31.9-8.5 40.7-22.6l79.9-128c20-31.9-3-73.4-40.7-73.4zM48 118c0-3.3 2.7-6 6-6h134.1l64 64H426c3.3 0 6 2.7 6 6v42H152c-16.8 0-32.4 8.8-41.1 23.2L48 351.4zm400 282H72l77.2-128H528z\"]\n};\nvar faFontAwesomeLogoFull = {\n prefix: 'far',\n iconName: 'font-awesome-logo-full',\n icon: [3992, 512, [\"Font Awesome\"], \"f4e6\", \"M454.6 0H57.4C25.9 0 0 25.9 0 57.4v397.3C0 486.1 25.9 512 57.4 512h397.3c31.4 0 57.4-25.9 57.4-57.4V57.4C512 25.9 486.1 0 454.6 0zm-58.9 324.9c0 4.8-4.1 6.9-8.9 8.9-19.2 8.1-39.7 15.7-61.5 15.7-40.5 0-68.7-44.8-163.2 2.5v51.8c0 30.3-45.7 30.2-45.7 0v-250c-9-7-15-17.9-15-30.3 0-21 17.1-38.2 38.2-38.2 21 0 38.2 17.1 38.2 38.2 0 12.2-5.8 23.2-14.9 30.2v21c37.1-12 65.5-34.4 146.1-3.4 26.6 11.4 68.7-15.7 76.5-15.7 5.5 0 10.3 4.1 10.3 8.9v160.4zm432.9-174.2h-137v70.1H825c39.8 0 40.4 62.2 0 62.2H691.6v105.6c0 45.5-70.7 46.4-70.7 0V128.3c0-22 18-39.8 39.8-39.8h167.8c39.6 0 40.5 62.2.1 62.2zm191.1 23.4c-169.3 0-169.1 252.4 0 252.4 169.9 0 169.9-252.4 0-252.4zm0 196.1c-81.6 0-82.1-139.8 0-139.8 82.5 0 82.4 139.8 0 139.8zm372.4 53.4c-17.5 0-31.4-13.9-31.4-31.4v-117c0-62.4-72.6-52.5-99.1-16.4v133.4c0 41.5-63.3 41.8-63.3 0V208c0-40 63.1-41.6 63.1 0v3.4c43.3-51.6 162.4-60.4 162.4 39.3v141.5c.3 30.4-31.5 31.4-31.7 31.4zm179.7 2.9c-44.3 0-68.3-22.9-68.3-65.8V235.2H1488c-35.6 0-36.7-55.3 0-55.3h15.5v-37.3c0-41.3 63.8-42.1 63.8 0v37.5h24.9c35.4 0 35.7 55.3 0 55.3h-24.9v108.5c0 29.6 26.1 26.3 27.4 26.3 31.4 0 52.6 56.3-22.9 56.3zM1992 123c-19.5-50.2-95.5-50-114.5 0-107.3 275.7-99.5 252.7-99.5 262.8 0 42.8 58.3 51.2 72.1 14.4l13.5-35.9H2006l13 35.9c14.2 37.7 72.1 27.2 72.1-14.4 0-10.1 5.3 6.8-99.1-262.8zm-108.9 179.1l51.7-142.9 51.8 142.9h-103.5zm591.3-85.6l-53.7 176.3c-12.4 41.2-72 41-84 0l-42.3-135.9-42.3 135.9c-12.4 40.9-72 41.2-84.5 0l-54.2-176.3c-12.5-39.4 49.8-56.1 60.2-16.9L2213 342l45.3-139.5c10.9-32.7 59.6-34.7 71.2 0l45.3 139.5 39.3-142.4c10.3-38.3 72.6-23.8 60.3 16.9zm275.4 75.1c0-42.4-33.9-117.5-119.5-117.5-73.2 0-124.4 56.3-124.4 126 0 77.2 55.3 126.4 128.5 126.4 31.7 0 93-11.5 93-39.8 0-18.3-21.1-31.5-39.3-22.4-49.4 26.2-109 8.4-115.9-43.8h148.3c16.3 0 29.3-13.4 29.3-28.9zM2571 277.7c9.5-73.4 113.9-68.6 118.6 0H2571zm316.7 148.8c-31.4 0-81.6-10.5-96.6-31.9-12.4-17 2.5-39.8 21.8-39.8 16.3 0 36.8 22.9 77.7 22.9 27.4 0 40.4-11 40.4-25.8 0-39.8-142.9-7.4-142.9-102 0-40.4 35.3-75.7 98.6-75.7 31.4 0 74.1 9.9 87.6 29.4 10.8 14.8-1.4 36.2-20.9 36.2-15.1 0-26.7-17.3-66.2-17.3-22.9 0-37.8 10.5-37.8 23.8 0 35.9 142.4 6 142.4 103.1-.1 43.7-37.4 77.1-104.1 77.1zm266.8-252.4c-169.3 0-169.1 252.4 0 252.4 170.1 0 169.6-252.4 0-252.4zm0 196.1c-81.8 0-82-139.8 0-139.8 82.5 0 82.4 139.8 0 139.8zm476.9 22V268.7c0-53.8-61.4-45.8-85.7-10.5v134c0 41.3-63.8 42.1-63.8 0V268.7c0-52.1-59.5-47.4-85.7-10.1v133.6c0 41.5-63.3 41.8-63.3 0V208c0-40 63.1-41.6 63.1 0v3.4c9.9-14.4 41.8-37.3 78.6-37.3 35.3 0 57.7 16.4 66.7 43.8 13.9-21.8 45.8-43.8 82.6-43.8 44.3 0 70.7 23.4 70.7 72.7v145.3c.5 17.3-13.5 31.4-31.9 31.4 3.5.1-31.3 1.1-31.3-31.3zM3992 291.6c0-42.4-32.4-117.5-117.9-117.5-73.2 0-127.5 56.3-127.5 126 0 77.2 58.3 126.4 131.6 126.4 31.7 0 91.5-11.5 91.5-39.8 0-18.3-21.1-31.5-39.3-22.4-49.4 26.2-110.5 8.4-117.5-43.8h149.8c16.3 0 29.1-13.4 29.3-28.9zm-180.5-13.9c9.7-74.4 115.9-68.3 120.1 0h-120.1z\"]\n};\nvar faFrown = {\n prefix: 'far',\n iconName: 'frown',\n icon: [496, 512, [], \"f119\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm-80-216c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm160-64c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm-80 128c-40.2 0-78 17.7-103.8 48.6-8.5 10.2-7.1 25.3 3.1 33.8 10.2 8.4 25.3 7.1 33.8-3.1 16.6-19.9 41-31.4 66.9-31.4s50.3 11.4 66.9 31.4c8.1 9.7 23.1 11.9 33.8 3.1 10.2-8.5 11.5-23.6 3.1-33.8C326 321.7 288.2 304 248 304z\"]\n};\nvar faFrownOpen = {\n prefix: 'far',\n iconName: 'frown-open',\n icon: [496, 512, [], \"f57a\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm-48-248c0-17.7-14.3-32-32-32s-32 14.3-32 32 14.3 32 32 32 32-14.3 32-32zm128-32c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm-80 112c-35.6 0-88.8 21.3-95.8 61.2-2 11.8 9 21.5 20.5 18.1 31.2-9.6 59.4-15.3 75.3-15.3s44.1 5.7 75.3 15.3c11.4 3.5 22.5-6.3 20.5-18.1-7-39.9-60.2-61.2-95.8-61.2z\"]\n};\nvar faFutbol = {\n prefix: 'far',\n iconName: 'futbol',\n icon: [496, 512, [], \"f1e3\", \"M483.8 179.4C449.8 74.6 352.6 8 248.1 8c-25.4 0-51.2 3.9-76.7 12.2C41.2 62.5-30.1 202.4 12.2 332.6 46.2 437.4 143.4 504 247.9 504c25.4 0 51.2-3.9 76.7-12.2 130.2-42.3 201.5-182.2 159.2-312.4zm-74.5 193.7l-52.2 6.4-43.7-60.9 24.4-75.2 71.1-22.1 38.9 36.4c-.2 30.7-7.4 61.1-21.7 89.2-4.7 9.3-10.7 17.8-16.8 26.2zm0-235.4l-10.4 53.1-70.7 22-64.2-46.5V92.5l47.4-26.2c39.2 13 73.4 38 97.9 71.4zM184.9 66.4L232 92.5v73.8l-64.2 46.5-70.6-22-10.1-52.5c24.3-33.4 57.9-58.6 97.8-71.9zM139 379.5L85.9 373c-14.4-20.1-37.3-59.6-37.8-115.3l39-36.4 71.1 22.2 24.3 74.3-43.5 61.7zm48.2 67l-22.4-48.1 43.6-61.7H287l44.3 61.7-22.4 48.1c-6.2 1.8-57.6 20.4-121.7 0z\"]\n};\nvar faGem = {\n prefix: 'far',\n iconName: 'gem',\n icon: [576, 512, [], \"f3a5\", \"M464 0H112c-4 0-7.8 2-10 5.4L2 152.6c-2.9 4.4-2.6 10.2.7 14.2l276 340.8c4.8 5.9 13.8 5.9 18.6 0l276-340.8c3.3-4.1 3.6-9.8.7-14.2L474.1 5.4C471.8 2 468.1 0 464 0zm-19.3 48l63.3 96h-68.4l-51.7-96h56.8zm-202.1 0h90.7l51.7 96H191l51.6-96zm-111.3 0h56.8l-51.7 96H68l63.3-96zm-43 144h51.4L208 352 88.3 192zm102.9 0h193.6L288 435.3 191.2 192zM368 352l68.2-160h51.4L368 352z\"]\n};\nvar faGrimace = {\n prefix: 'far',\n iconName: 'grimace',\n icon: [496, 512, [], \"f57f\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm-80-216c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm160 0c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm16 16H152c-26.5 0-48 21.5-48 48v32c0 26.5 21.5 48 48 48h192c26.5 0 48-21.5 48-48v-32c0-26.5-21.5-48-48-48zm-168 96h-24c-8.8 0-16-7.2-16-16v-8h40v24zm0-40h-40v-8c0-8.8 7.2-16 16-16h24v24zm64 40h-48v-24h48v24zm0-40h-48v-24h48v24zm64 40h-48v-24h48v24zm0-40h-48v-24h48v24zm56 24c0 8.8-7.2 16-16 16h-24v-24h40v8zm0-24h-40v-24h24c8.8 0 16 7.2 16 16v8z\"]\n};\nvar faGrin = {\n prefix: 'far',\n iconName: 'grin',\n icon: [496, 512, [], \"f580\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm105.6-151.4c-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.9-3.1-19.4 5.4-17.7 15.3 7.9 47.1 71.3 80 123.3 80s115.3-32.9 123.3-80c1.6-9.8-7.7-18.4-17.7-15.3zM168 240c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm160 0c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32z\"]\n};\nvar faGrinAlt = {\n prefix: 'far',\n iconName: 'grin-alt',\n icon: [496, 512, [], \"f581\", \"M200.3 248c12.4-18.7 15.1-37.3 15.7-56-.5-18.7-3.3-37.3-15.7-56-8-12-25.1-11.4-32.7 0-12.4 18.7-15.1 37.3-15.7 56 .5 18.7 3.3 37.3 15.7 56 8.1 12 25.2 11.4 32.7 0zm128 0c12.4-18.7 15.1-37.3 15.7-56-.5-18.7-3.3-37.3-15.7-56-8-12-25.1-11.4-32.7 0-12.4 18.7-15.1 37.3-15.7 56 .5 18.7 3.3 37.3 15.7 56 8.1 12 25.2 11.4 32.7 0zM248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm105.6-151.4c-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.9-3.1-19.4 5.3-17.7 15.3 7.9 47.2 71.3 80 123.3 80s115.3-32.9 123.3-80c1.6-9.8-7.7-18.4-17.7-15.3z\"]\n};\nvar faGrinBeam = {\n prefix: 'far',\n iconName: 'grin-beam',\n icon: [496, 512, [], \"f582\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm105.6-151.4c-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.8-3.1-19.4 5.3-17.7 15.3 7.9 47.1 71.3 80 123.3 80s115.3-32.9 123.3-80c1.6-9.8-7.7-18.4-17.7-15.3zm-235.9-72.9c3.5 1.1 7.4-.5 9.3-3.7l9.5-17c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c2.1 3.7 6.2 4.7 9.3 3.7 3.6-1.1 6-4.5 5.7-8.3-3.3-42.1-32.2-71.4-56-71.4s-52.7 29.3-56 71.4c-.3 3.7 2.1 7.2 5.7 8.3zm160 0c3.5 1.1 7.4-.5 9.3-3.7l9.5-17c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c2.1 3.7 6.2 4.7 9.3 3.7 3.6-1.1 6-4.5 5.7-8.3-3.3-42.1-32.2-71.4-56-71.4s-52.7 29.3-56 71.4c-.3 3.7 2.1 7.2 5.7 8.3z\"]\n};\nvar faGrinBeamSweat = {\n prefix: 'far',\n iconName: 'grin-beam-sweat',\n icon: [496, 512, [], \"f583\", \"M440 160c29.5 0 53.3-26.3 53.3-58.7 0-25-31.7-75.5-46.2-97.3-3.6-5.3-10.7-5.3-14.2 0-14.5 21.8-46.2 72.3-46.2 97.3 0 32.4 23.8 58.7 53.3 58.7zM248 400c51.9 0 115.3-32.9 123.3-80 1.7-9.9-7.7-18.5-17.7-15.3-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.8-3.1-19.4 5.3-17.7 15.3 8 47.1 71.4 80 123.3 80zm130.3-168.3c3.6-1.1 6-4.5 5.7-8.3-3.3-42.1-32.2-71.4-56-71.4s-52.7 29.3-56 71.4c-.3 3.7 2.1 7.2 5.7 8.3 3.5 1.1 7.4-.5 9.3-3.7l9.5-17c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c2.1 3.6 6.2 4.6 9.3 3.7zm105.3-52.9c-24.6 15.7-46 12.9-46.4 12.9 6.9 20.2 10.8 41.8 10.8 64.3 0 110.3-89.7 200-200 200S48 366.3 48 256 137.7 56 248 56c39.8 0 76.8 11.8 108 31.9 1.7-9.5 6.3-24.1 17.2-45.7C336.4 20.6 293.7 8 248 8 111 8 0 119 0 256s111 248 248 248 248-111 248-248c0-27-4.4-52.9-12.4-77.2zM168 189.4c12.3 0 23.8 7.9 31.5 21.6l9.5 17c2.1 3.7 6.2 4.7 9.3 3.7 3.6-1.1 6-4.5 5.7-8.3-3.3-42.1-32.2-71.4-56-71.4s-52.7 29.3-56 71.4c-.3 3.7 2.1 7.2 5.7 8.3 3.5 1.1 7.4-.5 9.3-3.7l9.5-17c7.7-13.8 19.2-21.6 31.5-21.6z\"]\n};\nvar faGrinHearts = {\n prefix: 'far',\n iconName: 'grin-hearts',\n icon: [496, 512, [], \"f584\", \"M353.6 304.6c-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.8-3.1-19.4 5.3-17.7 15.3 7.9 47.2 71.3 80 123.3 80s115.3-32.9 123.3-80c1.6-9.8-7.7-18.4-17.7-15.3zm-152.8-48.9c4.5 1.2 9.2-1.5 10.5-6l19.4-69.9c5.6-20.3-7.4-41.1-28.8-44.5-18.6-3-36.4 9.8-41.5 27.9l-2 7.1-7.1-1.9c-18.2-4.7-38.2 4.3-44.9 22-7.7 20.2 3.8 41.9 24.2 47.2l70.2 18.1zm188.8-65.3c-6.7-17.6-26.7-26.7-44.9-22l-7.1 1.9-2-7.1c-5-18.1-22.8-30.9-41.5-27.9-21.4 3.4-34.4 24.2-28.8 44.5l19.4 69.9c1.2 4.5 5.9 7.2 10.5 6l70.2-18.2c20.4-5.3 31.9-26.9 24.2-47.1zM248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200z\"]\n};\nvar faGrinSquint = {\n prefix: 'far',\n iconName: 'grin-squint',\n icon: [496, 512, [], \"f585\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm105.6-151.4c-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.9-3.1-19.4 5.4-17.7 15.3 7.9 47.1 71.3 80 123.3 80s115.3-32.9 123.3-80c1.6-9.8-7.7-18.4-17.7-15.3zm-234.7-40.8c3.6 4.2 9.9 5.7 15.3 2.5l80-48c3.6-2.2 5.8-6.1 5.8-10.3s-2.2-8.1-5.8-10.3l-80-48c-5.1-3-11.4-1.9-15.3 2.5-3.8 4.5-3.8 11-.1 15.5l33.6 40.3-33.6 40.3c-3.8 4.5-3.7 11.1.1 15.5zm242.9 2.5c5.4 3.2 11.7 1.7 15.3-2.5 3.8-4.5 3.8-11 .1-15.5L343.6 208l33.6-40.3c3.8-4.5 3.7-11-.1-15.5-3.8-4.4-10.2-5.4-15.3-2.5l-80 48c-3.6 2.2-5.8 6.1-5.8 10.3s2.2 8.1 5.8 10.3l80 48z\"]\n};\nvar faGrinSquintTears = {\n prefix: 'far',\n iconName: 'grin-squint-tears',\n icon: [512, 512, [], \"f586\", \"M117.1 384.1c-25.8 3.7-84 13.7-100.9 30.6-21.9 21.9-21.5 57.9.9 80.3s58.3 22.8 80.3.9C114.3 479 124.3 420.8 128 395c.8-6.4-4.6-11.8-10.9-10.9zm-41.2-41.7C40.3 268 53 176.1 114.6 114.6 152.4 76.8 202.6 56 256 56c36.2 0 70.8 9.8 101.2 27.7 3.8-20.3 8-36.1 12-48.3C333.8 17.2 294.9 8 256 8 192.5 8 129.1 32.2 80.6 80.6c-74.1 74.1-91.3 183.4-52 274 12.2-4.1 27.7-8.3 47.3-12.2zm352.3-187.6c45 76.6 34.9 176.9-30.8 242.6-37.8 37.8-88 58.6-141.4 58.6-30.5 0-59.8-7-86.4-19.8-3.9 19.5-8 35-12.2 47.2 31.4 13.6 65 20.6 98.7 20.6 63.5 0 126.9-24.2 175.4-72.6 78.1-78.1 93.1-195.4 45.2-288.6-12.3 4-28.2 8.1-48.5 12zm-33.3-26.9c25.8-3.7 84-13.7 100.9-30.6 21.9-21.9 21.5-57.9-.9-80.3s-58.3-22.8-80.3-.9C397.7 33 387.7 91.2 384 117c-.8 6.4 4.6 11.8 10.9 10.9zm-187 108.3c-3-3-7.2-4.2-11.4-3.2L106 255.7c-5.7 1.4-9.5 6.7-9.1 12.6.5 5.8 5.1 10.5 10.9 11l52.3 4.8 4.8 52.3c.5 5.8 5.2 10.4 11 10.9h.9c5.5 0 10.3-3.7 11.7-9.1l22.6-90.5c1-4.2-.2-8.5-3.2-11.5zm39.7-25.1l90.5-22.6c5.7-1.4 9.5-6.7 9.1-12.6-.5-5.8-5.1-10.5-10.9-11l-52.3-4.8-4.8-52.3c-.5-5.8-5.2-10.4-11-10.9-5.6-.1-11.2 3.4-12.6 9.1L233 196.5c-1 4.1.2 8.4 3.2 11.4 5 5 11.3 3.2 11.4 3.2zm52 88.5c-29.1 29.1-59.7 52.9-83.9 65.4-9.2 4.8-10 17.5-1.7 23.4 38.9 27.7 107 6.2 143.7-30.6S416 253 388.3 214.1c-5.8-8.2-18.5-7.6-23.4 1.7-12.3 24.2-36.2 54.7-65.3 83.8z\"]\n};\nvar faGrinStars = {\n prefix: 'far',\n iconName: 'grin-stars',\n icon: [496, 512, [], \"f587\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm105.6-151.4c-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.8-3.1-19.4 5.3-17.7 15.3 7.9 47.2 71.3 80 123.3 80s115.3-32.9 123.3-80c1.6-9.8-7.7-18.4-17.7-15.3zm-227.9-57.5c-1 6.2 5.4 11 11 7.9l31.3-16.3 31.3 16.3c5.6 3.1 12-1.7 11-7.9l-6-34.9 25.4-24.6c4.5-4.5 1.9-12.2-4.3-13.2l-34.9-5-15.5-31.6c-2.9-5.8-11-5.8-13.9 0l-15.5 31.6-34.9 5c-6.2.9-8.9 8.6-4.3 13.2l25.4 24.6-6.1 34.9zm259.7-72.7l-34.9-5-15.5-31.6c-2.9-5.8-11-5.8-13.9 0l-15.5 31.6-34.9 5c-6.2.9-8.9 8.6-4.3 13.2l25.4 24.6-6 34.9c-1 6.2 5.4 11 11 7.9l31.3-16.3 31.3 16.3c5.6 3.1 12-1.7 11-7.9l-6-34.9 25.4-24.6c4.5-4.6 1.8-12.2-4.4-13.2z\"]\n};\nvar faGrinTears = {\n prefix: 'far',\n iconName: 'grin-tears',\n icon: [640, 512, [], \"f588\", \"M117.1 256.1c-25.8 3.7-84 13.7-100.9 30.6-21.9 21.9-21.5 57.9.9 80.3s58.3 22.8 80.3.9C114.3 351 124.3 292.8 128 267c.8-6.4-4.6-11.8-10.9-10.9zm506.7 30.6c-16.9-16.9-75.1-26.9-100.9-30.6-6.3-.9-11.7 4.5-10.8 10.8 3.7 25.8 13.7 84 30.6 100.9 21.9 21.9 57.9 21.5 80.3-.9 22.3-22.3 22.7-58.3.8-80.2zm-126.6 61.7C463.8 412.3 396.9 456 320 456c-76.9 0-143.8-43.7-177.2-107.6-12.5 37.4-25.2 43.9-28.3 46.5C159.1 460.7 234.5 504 320 504s160.9-43.3 205.5-109.1c-3.2-2.7-15.9-9.2-28.3-46.5zM122.7 224.5C137.9 129.2 220.5 56 320 56c99.5 0 182.1 73.2 197.3 168.5 2.1-.2 5.2-2.4 49.5 7C554.4 106 448.7 8 320 8S85.6 106 73.2 231.4c44.5-9.4 47.1-7.2 49.5-6.9zM320 400c51.9 0 115.3-32.9 123.3-80 1.7-9.9-7.7-18.5-17.7-15.3-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.8-3.1-19.4 5.3-17.7 15.3 8 47.1 71.4 80 123.3 80zm130.3-168.3c3.6-1.1 6-4.5 5.7-8.3-3.3-42.1-32.2-71.4-56-71.4s-52.7 29.3-56 71.4c-.3 3.7 2.1 7.2 5.7 8.3 3.5 1.1 7.4-.5 9.3-3.7l9.5-17c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c2.1 3.6 6.2 4.6 9.3 3.7zM240 189.4c12.3 0 23.8 7.9 31.5 21.6l9.5 17c2.1 3.7 6.2 4.7 9.3 3.7 3.6-1.1 6-4.5 5.7-8.3-3.3-42.1-32.2-71.4-56-71.4s-52.7 29.3-56 71.4c-.3 3.7 2.1 7.2 5.7 8.3 3.5 1.1 7.4-.5 9.3-3.7l9.5-17c7.7-13.8 19.2-21.6 31.5-21.6z\"]\n};\nvar faGrinTongue = {\n prefix: 'far',\n iconName: 'grin-tongue',\n icon: [496, 512, [], \"f589\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm64 400c0 35.6-29.1 64.5-64.9 64-35.1-.5-63.1-29.8-63.1-65v-42.8l17.7-8.8c15-7.5 31.5 1.7 34.9 16.5l2.8 12.1c2.1 9.2 15.2 9.2 17.3 0l2.8-12.1c3.4-14.8 19.8-24.1 34.9-16.5l17.7 8.8V408zm28.2 25.3c2.2-8.1 3.8-16.5 3.8-25.3v-43.5c14.2-12.4 24.4-27.5 27.3-44.5 1.7-9.9-7.7-18.5-17.7-15.3-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.9-3.1-19.4 5.3-17.7 15.3 2.9 17 13.1 32.1 27.3 44.5V408c0 8.8 1.6 17.2 3.8 25.3C91.8 399.9 48 333 48 256c0-110.3 89.7-200 200-200s200 89.7 200 200c0 77-43.8 143.9-107.8 177.3zM168 176c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm160 0c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32z\"]\n};\nvar faGrinTongueSquint = {\n prefix: 'far',\n iconName: 'grin-tongue-squint',\n icon: [496, 512, [], \"f58a\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm64 400c0 35.6-29.1 64.5-64.9 64-35.1-.5-63.1-29.8-63.1-65v-42.8l17.7-8.8c15-7.5 31.5 1.7 34.9 16.5l2.8 12.1c2.1 9.2 15.2 9.2 17.3 0l2.8-12.1c3.4-14.8 19.8-24.1 34.9-16.5l17.7 8.8V408zm28.2 25.3c2.2-8.1 3.8-16.5 3.8-25.3v-43.5c14.2-12.4 24.4-27.5 27.3-44.5 1.7-9.9-7.7-18.5-17.7-15.3-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.9-3.1-19.4 5.3-17.7 15.3 2.9 17 13.1 32.1 27.3 44.5V408c0 8.8 1.6 17.2 3.8 25.3C91.8 399.9 48 333 48 256c0-110.3 89.7-200 200-200s200 89.7 200 200c0 77-43.8 143.9-107.8 177.3zm36.9-281.1c-3.8-4.4-10.3-5.5-15.3-2.5l-80 48c-3.6 2.2-5.8 6.1-5.8 10.3s2.2 8.1 5.8 10.3l80 48c5.4 3.2 11.7 1.7 15.3-2.5 3.8-4.5 3.8-11 .1-15.5L343.6 208l33.6-40.3c3.8-4.5 3.7-11.1-.1-15.5zm-162.9 45.5l-80-48c-5-3-11.4-2-15.3 2.5-3.8 4.5-3.8 11-.1 15.5l33.6 40.3-33.6 40.3c-3.8 4.5-3.7 11 .1 15.5 3.6 4.2 9.9 5.7 15.3 2.5l80-48c3.6-2.2 5.8-6.1 5.8-10.3s-2.2-8.1-5.8-10.3z\"]\n};\nvar faGrinTongueWink = {\n prefix: 'far',\n iconName: 'grin-tongue-wink',\n icon: [496, 512, [], \"f58b\", \"M152 180c-25.7 0-55.9 16.9-59.8 42.1-.8 5 1.7 10 6.1 12.4 4.4 2.4 9.9 1.8 13.7-1.6l9.5-8.5c14.8-13.2 46.2-13.2 61 0l9.5 8.5c2.5 2.2 8 4.7 13.7 1.6 4.4-2.4 6.9-7.4 6.1-12.4-3.9-25.2-34.1-42.1-59.8-42.1zm176-52c-44.2 0-80 35.8-80 80s35.8 80 80 80 80-35.8 80-80-35.8-80-80-80zm0 128c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zm0-72c-13.3 0-24 10.7-24 24s10.7 24 24 24 24-10.7 24-24-10.7-24-24-24zM248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm64 400c0 35.6-29.1 64.5-64.9 64-35.1-.5-63.1-29.8-63.1-65v-42.8l17.7-8.8c15-7.5 31.5 1.7 34.9 16.5l2.8 12.1c2.1 9.2 15.2 9.2 17.3 0l2.8-12.1c3.4-14.8 19.8-24.1 34.9-16.5l17.7 8.8V408zm28.2 25.3c2.2-8.1 3.8-16.5 3.8-25.3v-43.5c14.2-12.4 24.4-27.5 27.3-44.5 1.7-9.9-7.7-18.5-17.7-15.3-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.9-3.1-19.4 5.3-17.7 15.3 2.9 17 13.1 32.1 27.3 44.5V408c0 8.8 1.6 17.2 3.8 25.3C91.8 399.9 48 333 48 256c0-110.3 89.7-200 200-200s200 89.7 200 200c0 77-43.8 143.9-107.8 177.3z\"]\n};\nvar faGrinWink = {\n prefix: 'far',\n iconName: 'grin-wink',\n icon: [496, 512, [], \"f58c\", \"M328 180c-25.69 0-55.88 16.92-59.86 42.12-1.75 11.22 11.5 18.24 19.83 10.84l9.55-8.48c14.81-13.19 46.16-13.19 60.97 0l9.55 8.48c8.48 7.43 21.56.25 19.83-10.84C383.88 196.92 353.69 180 328 180zm-160 60c17.67 0 32-14.33 32-32s-14.33-32-32-32-32 14.33-32 32 14.33 32 32 32zm185.55 64.64c-25.93 8.3-64.4 13.06-105.55 13.06s-79.62-4.75-105.55-13.06c-9.94-3.13-19.4 5.37-17.71 15.34C132.67 367.13 196.06 400 248 400s115.33-32.87 123.26-80.02c1.68-9.89-7.67-18.48-17.71-15.34zM248 8C111.03 8 0 119.03 0 256s111.03 248 248 248 248-111.03 248-248S384.97 8 248 8zm0 448c-110.28 0-200-89.72-200-200S137.72 56 248 56s200 89.72 200 200-89.72 200-200 200z\"]\n};\nvar faHandLizard = {\n prefix: 'far',\n iconName: 'hand-lizard',\n icon: [576, 512, [], \"f258\", \"M556.686 290.542L410.328 64.829C397.001 44.272 374.417 32 349.917 32H56C25.121 32 0 57.122 0 88v8c0 44.112 35.888 80 80 80h196.042l-18.333 48H144c-48.523 0-88 39.477-88 88 0 30.879 25.121 56 56 56h131.552c2.987 0 5.914.549 8.697 1.631L352 408.418V480h224V355.829c0-23.225-6.679-45.801-19.314-65.287zM528 432H400v-23.582c0-19.948-12.014-37.508-30.604-44.736l-99.751-38.788A71.733 71.733 0 0 0 243.552 320H112c-4.411 0-8-3.589-8-8 0-22.056 17.944-40 40-40h113.709c19.767 0 37.786-12.407 44.84-30.873l24.552-64.281c8.996-23.553-8.428-48.846-33.63-48.846H80c-17.645 0-32-14.355-32-32v-8c0-4.411 3.589-8 8-8h293.917c8.166 0 15.693 4.09 20.137 10.942l146.358 225.715A71.84 71.84 0 0 1 528 355.829V432z\"]\n};\nvar faHandPaper = {\n prefix: 'far',\n iconName: 'hand-paper',\n icon: [448, 512, [], \"f256\", \"M372.57 112.641v-10.825c0-43.612-40.52-76.691-83.039-65.546-25.629-49.5-94.09-47.45-117.982.747C130.269 26.456 89.144 57.945 89.144 102v126.13c-19.953-7.427-43.308-5.068-62.083 8.871-29.355 21.796-35.794 63.333-14.55 93.153L132.48 498.569a32 32 0 0 0 26.062 13.432h222.897c14.904 0 27.835-10.289 31.182-24.813l30.184-130.958A203.637 203.637 0 0 0 448 310.564V179c0-40.62-35.523-71.992-75.43-66.359zm27.427 197.922c0 11.731-1.334 23.469-3.965 34.886L368.707 464h-201.92L51.591 302.303c-14.439-20.27 15.023-42.776 29.394-22.605l27.128 38.079c8.995 12.626 29.031 6.287 29.031-9.283V102c0-25.645 36.571-24.81 36.571.691V256c0 8.837 7.163 16 16 16h6.856c8.837 0 16-7.163 16-16V67c0-25.663 36.571-24.81 36.571.691V256c0 8.837 7.163 16 16 16h6.856c8.837 0 16-7.163 16-16V101.125c0-25.672 36.57-24.81 36.57.691V256c0 8.837 7.163 16 16 16h6.857c8.837 0 16-7.163 16-16v-76.309c0-26.242 36.57-25.64 36.57-.691v131.563z\"]\n};\nvar faHandPeace = {\n prefix: 'far',\n iconName: 'hand-peace',\n icon: [448, 512, [], \"f25b\", \"M362.146 191.976c-13.71-21.649-38.761-34.016-65.006-30.341V74c0-40.804-32.811-74-73.141-74-40.33 0-73.14 33.196-73.14 74L160 168l-18.679-78.85C126.578 50.843 83.85 32.11 46.209 47.208 8.735 62.238-9.571 104.963 5.008 142.85l55.757 144.927c-30.557 24.956-43.994 57.809-24.733 92.218l54.853 97.999C102.625 498.97 124.73 512 148.575 512h205.702c30.744 0 57.558-21.44 64.555-51.797l27.427-118.999a67.801 67.801 0 0 0 1.729-15.203L448 256c0-44.956-43.263-77.343-85.854-64.024zM399.987 326c0 1.488-.169 2.977-.502 4.423l-27.427 119.001c-1.978 8.582-9.29 14.576-17.782 14.576H148.575c-6.486 0-12.542-3.621-15.805-9.449l-54.854-98c-4.557-8.141-2.619-18.668 4.508-24.488l26.647-21.764a16 16 0 0 0 4.812-18.139l-64.09-166.549C37.226 92.956 84.37 74.837 96.51 106.389l59.784 155.357A16 16 0 0 0 171.227 272h11.632c8.837 0 16-7.163 16-16V74c0-34.375 50.281-34.43 50.281 0v182c0 8.837 7.163 16 16 16h6.856c8.837 0 16-7.163 16-16v-28c0-25.122 36.567-25.159 36.567 0v28c0 8.837 7.163 16 16 16h6.856c8.837 0 16-7.163 16-16 0-25.12 36.567-25.16 36.567 0v70z\"]\n};\nvar faHandPointDown = {\n prefix: 'far',\n iconName: 'hand-point-down',\n icon: [448, 512, [], \"f0a7\", \"M188.8 512c45.616 0 83.2-37.765 83.2-83.2v-35.647a93.148 93.148 0 0 0 22.064-7.929c22.006 2.507 44.978-3.503 62.791-15.985C409.342 368.1 448 331.841 448 269.299V248c0-60.063-40-98.512-40-127.2v-2.679c4.952-5.747 8-13.536 8-22.12V32c0-17.673-12.894-32-28.8-32H156.8C140.894 0 128 14.327 128 32v64c0 8.584 3.048 16.373 8 22.12v2.679c0 6.964-6.193 14.862-23.668 30.183l-.148.129-.146.131c-9.937 8.856-20.841 18.116-33.253 25.851C48.537 195.798 0 207.486 0 252.8c0 56.928 35.286 92 83.2 92 8.026 0 15.489-.814 22.4-2.176V428.8c0 45.099 38.101 83.2 83.2 83.2zm0-48c-18.7 0-35.2-16.775-35.2-35.2V270.4c-17.325 0-35.2 26.4-70.4 26.4-26.4 0-35.2-20.625-35.2-44 0-8.794 32.712-20.445 56.1-34.926 14.575-9.074 27.225-19.524 39.875-30.799 18.374-16.109 36.633-33.836 39.596-59.075h176.752C364.087 170.79 400 202.509 400 248v21.299c0 40.524-22.197 57.124-61.325 50.601-8.001 14.612-33.979 24.151-53.625 12.925-18.225 19.365-46.381 17.787-61.05 4.95V428.8c0 18.975-16.225 35.2-35.2 35.2zM328 64c0-13.255 10.745-24 24-24s24 10.745 24 24-10.745 24-24 24-24-10.745-24-24z\"]\n};\nvar faHandPointLeft = {\n prefix: 'far',\n iconName: 'hand-point-left',\n icon: [512, 512, [], \"f0a5\", \"M0 220.8C0 266.416 37.765 304 83.2 304h35.647a93.148 93.148 0 0 0 7.929 22.064c-2.507 22.006 3.503 44.978 15.985 62.791C143.9 441.342 180.159 480 242.701 480H264c60.063 0 98.512-40 127.2-40h2.679c5.747 4.952 13.536 8 22.12 8h64c17.673 0 32-12.894 32-28.8V188.8c0-15.906-14.327-28.8-32-28.8h-64c-8.584 0-16.373 3.048-22.12 8H391.2c-6.964 0-14.862-6.193-30.183-23.668l-.129-.148-.131-.146c-8.856-9.937-18.116-20.841-25.851-33.253C316.202 80.537 304.514 32 259.2 32c-56.928 0-92 35.286-92 83.2 0 8.026.814 15.489 2.176 22.4H83.2C38.101 137.6 0 175.701 0 220.8zm48 0c0-18.7 16.775-35.2 35.2-35.2h158.4c0-17.325-26.4-35.2-26.4-70.4 0-26.4 20.625-35.2 44-35.2 8.794 0 20.445 32.712 34.926 56.1 9.074 14.575 19.524 27.225 30.799 39.875 16.109 18.374 33.836 36.633 59.075 39.596v176.752C341.21 396.087 309.491 432 264 432h-21.299c-40.524 0-57.124-22.197-50.601-61.325-14.612-8.001-24.151-33.979-12.925-53.625-19.365-18.225-17.787-46.381-4.95-61.05H83.2C64.225 256 48 239.775 48 220.8zM448 360c13.255 0 24 10.745 24 24s-10.745 24-24 24-24-10.745-24-24 10.745-24 24-24z\"]\n};\nvar faHandPointRight = {\n prefix: 'far',\n iconName: 'hand-point-right',\n icon: [512, 512, [], \"f0a4\", \"M428.8 137.6h-86.177a115.52 115.52 0 0 0 2.176-22.4c0-47.914-35.072-83.2-92-83.2-45.314 0-57.002 48.537-75.707 78.784-7.735 12.413-16.994 23.317-25.851 33.253l-.131.146-.129.148C135.662 161.807 127.764 168 120.8 168h-2.679c-5.747-4.952-13.536-8-22.12-8H32c-17.673 0-32 12.894-32 28.8v230.4C0 435.106 14.327 448 32 448h64c8.584 0 16.373-3.048 22.12-8h2.679c28.688 0 67.137 40 127.2 40h21.299c62.542 0 98.8-38.658 99.94-91.145 12.482-17.813 18.491-40.785 15.985-62.791A93.148 93.148 0 0 0 393.152 304H428.8c45.435 0 83.2-37.584 83.2-83.2 0-45.099-38.101-83.2-83.2-83.2zm0 118.4h-91.026c12.837 14.669 14.415 42.825-4.95 61.05 11.227 19.646 1.687 45.624-12.925 53.625 6.524 39.128-10.076 61.325-50.6 61.325H248c-45.491 0-77.21-35.913-120-39.676V215.571c25.239-2.964 42.966-21.222 59.075-39.596 11.275-12.65 21.725-25.3 30.799-39.875C232.355 112.712 244.006 80 252.8 80c23.375 0 44 8.8 44 35.2 0 35.2-26.4 53.075-26.4 70.4h158.4c18.425 0 35.2 16.5 35.2 35.2 0 18.975-16.225 35.2-35.2 35.2zM88 384c0 13.255-10.745 24-24 24s-24-10.745-24-24 10.745-24 24-24 24 10.745 24 24z\"]\n};\nvar faHandPointUp = {\n prefix: 'far',\n iconName: 'hand-point-up',\n icon: [448, 512, [], \"f0a6\", \"M105.6 83.2v86.177a115.52 115.52 0 0 0-22.4-2.176c-47.914 0-83.2 35.072-83.2 92 0 45.314 48.537 57.002 78.784 75.707 12.413 7.735 23.317 16.994 33.253 25.851l.146.131.148.129C129.807 376.338 136 384.236 136 391.2v2.679c-4.952 5.747-8 13.536-8 22.12v64c0 17.673 12.894 32 28.8 32h230.4c15.906 0 28.8-14.327 28.8-32v-64c0-8.584-3.048-16.373-8-22.12V391.2c0-28.688 40-67.137 40-127.2v-21.299c0-62.542-38.658-98.8-91.145-99.94-17.813-12.482-40.785-18.491-62.791-15.985A93.148 93.148 0 0 0 272 118.847V83.2C272 37.765 234.416 0 188.8 0c-45.099 0-83.2 38.101-83.2 83.2zm118.4 0v91.026c14.669-12.837 42.825-14.415 61.05 4.95 19.646-11.227 45.624-1.687 53.625 12.925 39.128-6.524 61.325 10.076 61.325 50.6V264c0 45.491-35.913 77.21-39.676 120H183.571c-2.964-25.239-21.222-42.966-39.596-59.075-12.65-11.275-25.3-21.725-39.875-30.799C80.712 279.645 48 267.994 48 259.2c0-23.375 8.8-44 35.2-44 35.2 0 53.075 26.4 70.4 26.4V83.2c0-18.425 16.5-35.2 35.2-35.2 18.975 0 35.2 16.225 35.2 35.2zM352 424c13.255 0 24 10.745 24 24s-10.745 24-24 24-24-10.745-24-24 10.745-24 24-24z\"]\n};\nvar faHandPointer = {\n prefix: 'far',\n iconName: 'hand-pointer',\n icon: [448, 512, [], \"f25a\", \"M358.182 179.361c-19.493-24.768-52.679-31.945-79.872-19.098-15.127-15.687-36.182-22.487-56.595-19.629V67c0-36.944-29.736-67-66.286-67S89.143 30.056 89.143 67v161.129c-19.909-7.41-43.272-5.094-62.083 8.872-29.355 21.795-35.793 63.333-14.55 93.152l109.699 154.001C134.632 501.59 154.741 512 176 512h178.286c30.802 0 57.574-21.5 64.557-51.797l27.429-118.999A67.873 67.873 0 0 0 448 326v-84c0-46.844-46.625-79.273-89.818-62.639zM80.985 279.697l27.126 38.079c8.995 12.626 29.031 6.287 29.031-9.283V67c0-25.12 36.571-25.16 36.571 0v175c0 8.836 7.163 16 16 16h6.857c8.837 0 16-7.164 16-16v-35c0-25.12 36.571-25.16 36.571 0v35c0 8.836 7.163 16 16 16H272c8.837 0 16-7.164 16-16v-21c0-25.12 36.571-25.16 36.571 0v21c0 8.836 7.163 16 16 16h6.857c8.837 0 16-7.164 16-16 0-25.121 36.571-25.16 36.571 0v84c0 1.488-.169 2.977-.502 4.423l-27.43 119.001c-1.978 8.582-9.29 14.576-17.782 14.576H176c-5.769 0-11.263-2.878-14.697-7.697l-109.712-154c-14.406-20.223 14.994-42.818 29.394-22.606zM176.143 400v-96c0-8.837 6.268-16 14-16h6c7.732 0 14 7.163 14 16v96c0 8.837-6.268 16-14 16h-6c-7.733 0-14-7.163-14-16zm75.428 0v-96c0-8.837 6.268-16 14-16h6c7.732 0 14 7.163 14 16v96c0 8.837-6.268 16-14 16h-6c-7.732 0-14-7.163-14-16zM327 400v-96c0-8.837 6.268-16 14-16h6c7.732 0 14 7.163 14 16v96c0 8.837-6.268 16-14 16h-6c-7.732 0-14-7.163-14-16z\"]\n};\nvar faHandRock = {\n prefix: 'far',\n iconName: 'hand-rock',\n icon: [512, 512, [], \"f255\", \"M408.864 79.052c-22.401-33.898-66.108-42.273-98.813-23.588-29.474-31.469-79.145-31.093-108.334-.022-47.16-27.02-108.71 5.055-110.671 60.806C44.846 105.407 0 140.001 0 187.429v56.953c0 32.741 14.28 63.954 39.18 85.634l97.71 85.081c4.252 3.702 3.11 5.573 3.11 32.903 0 17.673 14.327 32 32 32h252c17.673 0 32-14.327 32-32 0-23.513-1.015-30.745 3.982-42.37l42.835-99.656c6.094-14.177 9.183-29.172 9.183-44.568V146.963c0-52.839-54.314-88.662-103.136-67.911zM464 261.406a64.505 64.505 0 0 1-5.282 25.613l-42.835 99.655c-5.23 12.171-7.883 25.04-7.883 38.25V432H188v-10.286c0-16.37-7.14-31.977-19.59-42.817l-97.71-85.08C56.274 281.255 48 263.236 48 244.381v-56.953c0-33.208 52-33.537 52 .677v41.228a16 16 0 0 0 5.493 12.067l7 6.095A16 16 0 0 0 139 235.429V118.857c0-33.097 52-33.725 52 .677v26.751c0 8.836 7.164 16 16 16h7c8.836 0 16-7.164 16-16v-41.143c0-33.134 52-33.675 52 .677v40.466c0 8.836 7.163 16 16 16h7c8.837 0 16-7.164 16-16v-27.429c0-33.03 52-33.78 52 .677v26.751c0 8.836 7.163 16 16 16h7c8.837 0 16-7.164 16-16 0-33.146 52-33.613 52 .677v114.445z\"]\n};\nvar faHandScissors = {\n prefix: 'far',\n iconName: 'hand-scissors',\n icon: [512, 512, [], \"f257\", \"M256 480l70-.013c5.114 0 10.231-.583 15.203-1.729l118.999-27.427C490.56 443.835 512 417.02 512 386.277V180.575c0-23.845-13.03-45.951-34.005-57.69l-97.999-54.853c-34.409-19.261-67.263-5.824-92.218 24.733L142.85 37.008c-37.887-14.579-80.612 3.727-95.642 41.201-15.098 37.642 3.635 80.37 41.942 95.112L168 192l-94-9.141c-40.804 0-74 32.811-74 73.14 0 40.33 33.196 73.141 74 73.141h87.635c-3.675 26.245 8.692 51.297 30.341 65.006C178.657 436.737 211.044 480 256 480zm0-48.013c-25.16 0-25.12-36.567 0-36.567 8.837 0 16-7.163 16-16v-6.856c0-8.837-7.163-16-16-16h-28c-25.159 0-25.122-36.567 0-36.567h28c8.837 0 16-7.163 16-16v-6.856c0-8.837-7.163-16-16-16H74c-34.43 0-34.375-50.281 0-50.281h182c8.837 0 16-7.163 16-16v-11.632a16 16 0 0 0-10.254-14.933L106.389 128.51c-31.552-12.14-13.432-59.283 19.222-46.717l166.549 64.091a16.001 16.001 0 0 0 18.139-4.812l21.764-26.647c5.82-7.127 16.348-9.064 24.488-4.508l98 54.854c5.828 3.263 9.449 9.318 9.449 15.805v205.701c0 8.491-5.994 15.804-14.576 17.782l-119.001 27.427a19.743 19.743 0 0 1-4.423.502h-70z\"]\n};\nvar faHandSpock = {\n prefix: 'far',\n iconName: 'hand-spock',\n icon: [512, 512, [], \"f259\", \"M501.03053,116.17605c-19.39059-31.50779-51.24406-35.72849-66.31044-35.01756-14.11325-50.81051-62.0038-54.08-70.73816-54.08a74.03091,74.03091,0,0,0-72.23816,58.916l-4.64648,22.66014-13.68357-53.207c-9.09569-35.37107-46.412-64.05074-89.66-53.07223a73.89749,73.89749,0,0,0-55.121,78.94722,73.68273,73.68273,0,0,0-64.8495,94.42181l24.35933,82.19721c-38.24017-7.54492-62.79677,16.18358-68.11512,21.84764a73.6791,73.6791,0,0,0,3.19921,104.19329l91.36509,85.9765A154.164,154.164,0,0,0,220.62279,512h107.4549A127.30079,127.30079,0,0,0,452.3392,413.86139l57.623-241.96272A73.20274,73.20274,0,0,0,501.03053,116.17605Zm-37.7597,44.60544L405.64788,402.74812a79.46616,79.46616,0,0,1-77.57019,61.25972H220.62279a106.34052,106.34052,0,0,1-73.1366-28.998l-91.369-85.98041C31.34381,325.72669,66.61133,288.131,91.39644,311.5392l51.123,48.10739c5.42577,5.10937,13.48239.71679,13.48239-5.82617a246.79914,246.79914,0,0,0-10.17771-70.1523l-36.01362-121.539c-9.7324-32.88279,39.69916-47.27145,49.38664-14.625l31.3437,105.77923c5.59374,18.90428,33.78119,10.71288,28.9648-8.00781L177.06427,80.23662c-8.50389-33.1035,41.43157-45.64646,49.86515-12.83593l47.32609,184.035c4.42773,17.24218,29.16207,16.5039,32.71089-.80468l31.791-154.9706c6.81054-33.1074,57.51748-24.10741,50.11906,11.96288L360.32764,246.78924c-3.72265,18.10936,23.66793,24.63084,28.05659,6.21679L413.185,148.85962C421.1498,115.512,471.14,127.79713,463.27083,160.78149Z\"]\n};\nvar faHandshake = {\n prefix: 'far',\n iconName: 'handshake',\n icon: [640, 512, [], \"f2b5\", \"M519.2 127.9l-47.6-47.6A56.252 56.252 0 0 0 432 64H205.2c-14.8 0-29.1 5.9-39.6 16.3L118 127.9H0v255.7h64c17.6 0 31.8-14.2 31.9-31.7h9.1l84.6 76.4c30.9 25.1 73.8 25.7 105.6 3.8 12.5 10.8 26 15.9 41.1 15.9 18.2 0 35.3-7.4 48.8-24 22.1 8.7 48.2 2.6 64-16.8l26.2-32.3c5.6-6.9 9.1-14.8 10.9-23h57.9c.1 17.5 14.4 31.7 31.9 31.7h64V127.9H519.2zM48 351.6c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16c0 8.9-7.2 16-16 16zm390-6.9l-26.1 32.2c-2.8 3.4-7.8 4-11.3 1.2l-23.9-19.4-30 36.5c-6 7.3-15 4.8-18 2.4l-36.8-31.5-15.6 19.2c-13.9 17.1-39.2 19.7-55.3 6.6l-97.3-88H96V175.8h41.9l61.7-61.6c2-.8 3.7-1.5 5.7-2.3H262l-38.7 35.5c-29.4 26.9-31.1 72.3-4.4 101.3 14.8 16.2 61.2 41.2 101.5 4.4l8.2-7.5 108.2 87.8c3.4 2.8 3.9 7.9 1.2 11.3zm106-40.8h-69.2c-2.3-2.8-4.9-5.4-7.7-7.7l-102.7-83.4 12.5-11.4c6.5-6 7-16.1 1-22.6L367 167.1c-6-6.5-16.1-6.9-22.6-1l-55.2 50.6c-9.5 8.7-25.7 9.4-34.6 0-9.3-9.9-8.5-25.1 1.2-33.9l65.6-60.1c7.4-6.8 17-10.5 27-10.5l83.7-.2c2.1 0 4.1.8 5.5 2.3l61.7 61.6H544v128zm48 47.7c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16c0 8.9-7.2 16-16 16z\"]\n};\nvar faHdd = {\n prefix: 'far',\n iconName: 'hdd',\n icon: [576, 512, [], \"f0a0\", \"M567.403 235.642L462.323 84.589A48 48 0 0 0 422.919 64H153.081a48 48 0 0 0-39.404 20.589L8.597 235.642A48.001 48.001 0 0 0 0 263.054V400c0 26.51 21.49 48 48 48h480c26.51 0 48-21.49 48-48V263.054c0-9.801-3-19.366-8.597-27.412zM153.081 112h269.838l77.913 112H75.168l77.913-112zM528 400H48V272h480v128zm-32-64c0 17.673-14.327 32-32 32s-32-14.327-32-32 14.327-32 32-32 32 14.327 32 32zm-96 0c0 17.673-14.327 32-32 32s-32-14.327-32-32 14.327-32 32-32 32 14.327 32 32z\"]\n};\nvar faHeart = {\n prefix: 'far',\n iconName: 'heart',\n icon: [512, 512, [], \"f004\", \"M458.4 64.3C400.6 15.7 311.3 23 256 79.3 200.7 23 111.4 15.6 53.6 64.3-21.6 127.6-10.6 230.8 43 285.5l175.4 178.7c10 10.2 23.4 15.9 37.6 15.9 14.3 0 27.6-5.6 37.6-15.8L469 285.6c53.5-54.7 64.7-157.9-10.6-221.3zm-23.6 187.5L259.4 430.5c-2.4 2.4-4.4 2.4-6.8 0L77.2 251.8c-36.5-37.2-43.9-107.6 7.3-150.7 38.9-32.7 98.9-27.8 136.5 10.5l35 35.7 35-35.7c37.8-38.5 97.8-43.2 136.5-10.6 51.1 43.1 43.5 113.9 7.3 150.8z\"]\n};\nvar faHospital = {\n prefix: 'far',\n iconName: 'hospital',\n icon: [448, 512, [], \"f0f8\", \"M128 244v-40c0-6.627 5.373-12 12-12h40c6.627 0 12 5.373 12 12v40c0 6.627-5.373 12-12 12h-40c-6.627 0-12-5.373-12-12zm140 12h40c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12zm-76 84v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm76 12h40c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12zm180 124v36H0v-36c0-6.627 5.373-12 12-12h19.5V85.035C31.5 73.418 42.245 64 55.5 64H144V24c0-13.255 10.745-24 24-24h112c13.255 0 24 10.745 24 24v40h88.5c13.255 0 24 9.418 24 21.035V464H436c6.627 0 12 5.373 12 12zM79.5 463H192v-67c0-6.627 5.373-12 12-12h40c6.627 0 12 5.373 12 12v67h112.5V112H304v24c0 13.255-10.745 24-24 24H168c-13.255 0-24-10.745-24-24v-24H79.5v351zM266 64h-26V38a6 6 0 0 0-6-6h-20a6 6 0 0 0-6 6v26h-26a6 6 0 0 0-6 6v20a6 6 0 0 0 6 6h26v26a6 6 0 0 0 6 6h20a6 6 0 0 0 6-6V96h26a6 6 0 0 0 6-6V70a6 6 0 0 0-6-6z\"]\n};\nvar faHourglass = {\n prefix: 'far',\n iconName: 'hourglass',\n icon: [384, 512, [], \"f254\", \"M368 48h4c6.627 0 12-5.373 12-12V12c0-6.627-5.373-12-12-12H12C5.373 0 0 5.373 0 12v24c0 6.627 5.373 12 12 12h4c0 80.564 32.188 165.807 97.18 208C47.899 298.381 16 383.9 16 464h-4c-6.627 0-12 5.373-12 12v24c0 6.627 5.373 12 12 12h360c6.627 0 12-5.373 12-12v-24c0-6.627-5.373-12-12-12h-4c0-80.564-32.188-165.807-97.18-208C336.102 213.619 368 128.1 368 48zM64 48h256c0 101.62-57.307 184-128 184S64 149.621 64 48zm256 416H64c0-101.62 57.308-184 128-184s128 82.38 128 184z\"]\n};\nvar faIdBadge = {\n prefix: 'far',\n iconName: 'id-badge',\n icon: [384, 512, [], \"f2c1\", \"M336 0H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V48c0-26.5-21.5-48-48-48zm0 464H48V48h288v416zM144 112h96c8.8 0 16-7.2 16-16s-7.2-16-16-16h-96c-8.8 0-16 7.2-16 16s7.2 16 16 16zm48 176c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm-89.6 128h179.2c12.4 0 22.4-8.6 22.4-19.2v-19.2c0-31.8-30.1-57.6-67.2-57.6-10.8 0-18.7 8-44.8 8-26.9 0-33.4-8-44.8-8-37.1 0-67.2 25.8-67.2 57.6v19.2c0 10.6 10 19.2 22.4 19.2z\"]\n};\nvar faIdCard = {\n prefix: 'far',\n iconName: 'id-card',\n icon: [576, 512, [], \"f2c2\", \"M528 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h480c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm0 400H303.2c.9-4.5.8 3.6.8-22.4 0-31.8-30.1-57.6-67.2-57.6-10.8 0-18.7 8-44.8 8-26.9 0-33.4-8-44.8-8-37.1 0-67.2 25.8-67.2 57.6 0 26-.2 17.9.8 22.4H48V144h480v288zm-168-80h112c4.4 0 8-3.6 8-8v-16c0-4.4-3.6-8-8-8H360c-4.4 0-8 3.6-8 8v16c0 4.4 3.6 8 8 8zm0-64h112c4.4 0 8-3.6 8-8v-16c0-4.4-3.6-8-8-8H360c-4.4 0-8 3.6-8 8v16c0 4.4 3.6 8 8 8zm0-64h112c4.4 0 8-3.6 8-8v-16c0-4.4-3.6-8-8-8H360c-4.4 0-8 3.6-8 8v16c0 4.4 3.6 8 8 8zm-168 96c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64z\"]\n};\nvar faImage = {\n prefix: 'far',\n iconName: 'image',\n icon: [512, 512, [], \"f03e\", \"M464 64H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V112c0-26.51-21.49-48-48-48zm-6 336H54a6 6 0 0 1-6-6V118a6 6 0 0 1 6-6h404a6 6 0 0 1 6 6v276a6 6 0 0 1-6 6zM128 152c-22.091 0-40 17.909-40 40s17.909 40 40 40 40-17.909 40-40-17.909-40-40-40zM96 352h320v-80l-87.515-87.515c-4.686-4.686-12.284-4.686-16.971 0L192 304l-39.515-39.515c-4.686-4.686-12.284-4.686-16.971 0L96 304v48z\"]\n};\nvar faImages = {\n prefix: 'far',\n iconName: 'images',\n icon: [576, 512, [], \"f302\", \"M480 416v16c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48V176c0-26.51 21.49-48 48-48h16v48H54a6 6 0 0 0-6 6v244a6 6 0 0 0 6 6h372a6 6 0 0 0 6-6v-10h48zm42-336H150a6 6 0 0 0-6 6v244a6 6 0 0 0 6 6h372a6 6 0 0 0 6-6V86a6 6 0 0 0-6-6zm6-48c26.51 0 48 21.49 48 48v256c0 26.51-21.49 48-48 48H144c-26.51 0-48-21.49-48-48V80c0-26.51 21.49-48 48-48h384zM264 144c0 22.091-17.909 40-40 40s-40-17.909-40-40 17.909-40 40-40 40 17.909 40 40zm-72 96l39.515-39.515c4.686-4.686 12.284-4.686 16.971 0L288 240l103.515-103.515c4.686-4.686 12.284-4.686 16.971 0L480 208v80H192v-48z\"]\n};\nvar faKeyboard = {\n prefix: 'far',\n iconName: 'keyboard',\n icon: [576, 512, [], \"f11c\", \"M528 64H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h480c26.51 0 48-21.49 48-48V112c0-26.51-21.49-48-48-48zm8 336c0 4.411-3.589 8-8 8H48c-4.411 0-8-3.589-8-8V112c0-4.411 3.589-8 8-8h480c4.411 0 8 3.589 8 8v288zM170 270v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm96 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm96 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm96 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm-336 82v-28c0-6.627-5.373-12-12-12H82c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm384 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zM122 188v-28c0-6.627-5.373-12-12-12H82c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm96 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm96 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm96 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm96 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm-98 158v-16c0-6.627-5.373-12-12-12H180c-6.627 0-12 5.373-12 12v16c0 6.627 5.373 12 12 12h216c6.627 0 12-5.373 12-12z\"]\n};\nvar faKiss = {\n prefix: 'far',\n iconName: 'kiss',\n icon: [496, 512, [], \"f596\", \"M168 176c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm136 132c0-19.2-28.8-41.5-71.5-44-3.8-.4-7.4 2.4-8.2 6.2-.9 3.8 1.1 7.7 4.7 9.2l16.9 7.2c13 5.5 20.8 13.5 20.8 21.5s-7.8 16-20.7 21.5l-17 7.2c-5.7 2.4-6 12.2 0 14.8l16.9 7.2c13 5.5 20.8 13.5 20.8 21.5s-7.8 16-20.7 21.5l-17 7.2c-3.6 1.5-5.6 5.4-4.7 9.2.8 3.6 4.1 6.2 7.8 6.2h.5c42.8-2.5 71.5-24.8 71.5-44 0-13-13.4-27.3-35.2-36C290.6 335.3 304 321 304 308zM248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm80-280c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32z\"]\n};\nvar faKissBeam = {\n prefix: 'far',\n iconName: 'kiss-beam',\n icon: [496, 512, [], \"f597\", \"M168 152c-23.8 0-52.7 29.3-56 71.4-.3 3.7 2 7.2 5.6 8.3 3.5 1 7.5-.5 9.3-3.7l9.5-17c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c2.1 3.7 6.2 4.7 9.3 3.7 3.6-1.1 5.9-4.5 5.6-8.3-3.1-42.1-32-71.4-55.8-71.4zM248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm56-148c0-19.2-28.8-41.5-71.5-44-3.8-.4-7.4 2.4-8.2 6.2-.9 3.8 1.1 7.7 4.7 9.2l16.9 7.2c13 5.5 20.8 13.5 20.8 21.5s-7.8 16-20.7 21.5l-17 7.2c-5.7 2.4-6 12.2 0 14.8l16.9 7.2c13 5.5 20.8 13.5 20.8 21.5s-7.8 16-20.7 21.5l-17 7.2c-3.6 1.5-5.6 5.4-4.7 9.2.8 3.6 4.1 6.2 7.8 6.2h.5c42.8-2.5 71.5-24.8 71.5-44 0-13-13.4-27.3-35.2-36C290.6 335.3 304 321 304 308zm24-156c-23.8 0-52.7 29.3-56 71.4-.3 3.7 2 7.2 5.6 8.3 3.5 1 7.5-.5 9.3-3.7l9.5-17c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c2.1 3.7 6.2 4.7 9.3 3.7 3.6-1.1 5.9-4.5 5.6-8.3-3.1-42.1-32-71.4-55.8-71.4z\"]\n};\nvar faKissWinkHeart = {\n prefix: 'far',\n iconName: 'kiss-wink-heart',\n icon: [504, 512, [], \"f598\", \"M304 308.5c0-19.2-28.8-41.5-71.5-44-3.8-.4-7.4 2.4-8.2 6.2-.9 3.8 1.1 7.7 4.7 9.2l16.9 7.2c13 5.5 20.8 13.5 20.8 21.5s-7.8 16-20.7 21.5l-17 7.2c-5.7 2.4-6 12.2 0 14.8l16.9 7.2c13 5.5 20.8 13.5 20.8 21.5s-7.8 16-20.7 21.5l-17 7.2c-3.6 1.5-5.6 5.4-4.7 9.2.8 3.6 4.1 6.2 7.8 6.2h.5c42.8-2.5 71.5-24.8 71.5-44 0-13-13.4-27.3-35.2-36 21.7-9.1 35.1-23.4 35.1-36.4zm70.5-83.5l9.5 8.5c3.8 3.3 9.3 4 13.7 1.6 4.4-2.4 6.9-7.4 6.1-12.4-4-25.2-34.2-42.1-59.8-42.1s-55.9 16.9-59.8 42.1c-.8 5 1.7 10 6.1 12.4 5.8 3.1 11.2.7 13.7-1.6l9.5-8.5c14.8-13.2 46.2-13.2 61 0zM136 208.5c0 17.7 14.3 32 32 32s32-14.3 32-32-14.3-32-32-32-32 14.3-32 32zm365.1 194c-8-20.8-31.5-31.5-53.1-25.9l-8.4 2.2-2.3-8.4c-5.9-21.4-27-36.5-49-33-25.2 4-40.6 28.6-34 52.6l22.9 82.6c1.5 5.3 7 8.5 12.4 7.1l83-21.5c24.1-6.3 37.7-31.8 28.5-55.7zM334 436.3c-26.1 12.5-55.2 19.7-86 19.7-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200c0 22.1-3.7 43.3-10.4 63.2 9 6.4 17 14.2 22.6 23.9 6.4.1 12.6 1.4 18.6 2.9 10.9-27.9 17.1-58.2 17.1-90C496 119 385 8 248 8S0 119 0 256s111 248 248 248c35.4 0 68.9-7.5 99.4-20.9-2.5-7.3 4.3 17.2-13.4-46.8z\"]\n};\nvar faLaugh = {\n prefix: 'far',\n iconName: 'laugh',\n icon: [496, 512, [], \"f599\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm141.4 389.4c-37.8 37.8-88 58.6-141.4 58.6s-103.6-20.8-141.4-58.6S48 309.4 48 256s20.8-103.6 58.6-141.4S194.6 56 248 56s103.6 20.8 141.4 58.6S448 202.6 448 256s-20.8 103.6-58.6 141.4zM328 224c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm-160 0c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm194.4 64H133.6c-8.2 0-14.5 7-13.5 15 7.5 59.2 58.9 105 121.1 105h13.6c62.2 0 113.6-45.8 121.1-105 1-8-5.3-15-13.5-15z\"]\n};\nvar faLaughBeam = {\n prefix: 'far',\n iconName: 'laugh-beam',\n icon: [496, 512, [], \"f59a\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm141.4 389.4c-37.8 37.8-88 58.6-141.4 58.6s-103.6-20.8-141.4-58.6S48 309.4 48 256s20.8-103.6 58.6-141.4S194.6 56 248 56s103.6 20.8 141.4 58.6S448 202.6 448 256s-20.8 103.6-58.6 141.4zM328 152c-23.8 0-52.7 29.3-56 71.4-.7 8.6 10.8 11.9 14.9 4.5l9.5-17c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c4.1 7.4 15.6 4 14.9-4.5-3.1-42.1-32-71.4-55.8-71.4zm-201 75.9l9.5-17c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c4.1 7.4 15.6 4 14.9-4.5-3.3-42.1-32.2-71.4-56-71.4s-52.7 29.3-56 71.4c-.6 8.5 10.9 11.9 15.1 4.5zM362.4 288H133.6c-8.2 0-14.5 7-13.5 15 7.5 59.2 58.9 105 121.1 105h13.6c62.2 0 113.6-45.8 121.1-105 1-8-5.3-15-13.5-15z\"]\n};\nvar faLaughSquint = {\n prefix: 'far',\n iconName: 'laugh-squint',\n icon: [496, 512, [], \"f59b\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm141.4 389.4c-37.8 37.8-88 58.6-141.4 58.6s-103.6-20.8-141.4-58.6S48 309.4 48 256s20.8-103.6 58.6-141.4S194.6 56 248 56s103.6 20.8 141.4 58.6S448 202.6 448 256s-20.8 103.6-58.6 141.4zM343.6 196l33.6-40.3c8.6-10.3-3.8-24.8-15.4-18l-80 48c-7.8 4.7-7.8 15.9 0 20.6l80 48c11.5 6.8 24-7.6 15.4-18L343.6 196zm-209.4 58.3l80-48c7.8-4.7 7.8-15.9 0-20.6l-80-48c-11.6-6.9-24 7.7-15.4 18l33.6 40.3-33.6 40.3c-8.7 10.4 3.8 24.8 15.4 18zM362.4 288H133.6c-8.2 0-14.5 7-13.5 15 7.5 59.2 58.9 105 121.1 105h13.6c62.2 0 113.6-45.8 121.1-105 1-8-5.3-15-13.5-15z\"]\n};\nvar faLaughWink = {\n prefix: 'far',\n iconName: 'laugh-wink',\n icon: [496, 512, [], \"f59c\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm141.4 389.4c-37.8 37.8-88 58.6-141.4 58.6s-103.6-20.8-141.4-58.6C68.8 359.6 48 309.4 48 256s20.8-103.6 58.6-141.4C144.4 76.8 194.6 56 248 56s103.6 20.8 141.4 58.6c37.8 37.8 58.6 88 58.6 141.4s-20.8 103.6-58.6 141.4zM328 164c-25.7 0-55.9 16.9-59.9 42.1-1.7 11.2 11.5 18.2 19.8 10.8l9.5-8.5c14.8-13.2 46.2-13.2 61 0l9.5 8.5c8.5 7.4 21.6.3 19.8-10.8-3.8-25.2-34-42.1-59.7-42.1zm-160 60c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm194.4 64H133.6c-8.2 0-14.5 7-13.5 15 7.5 59.2 58.9 105 121.1 105h13.6c62.2 0 113.6-45.8 121.1-105 1-8-5.3-15-13.5-15z\"]\n};\nvar faLemon = {\n prefix: 'far',\n iconName: 'lemon',\n icon: [512, 512, [], \"f094\", \"M484.112 27.889C455.989-.233 416.108-8.057 387.059 8.865 347.604 31.848 223.504-41.111 91.196 91.197-41.277 223.672 31.923 347.472 8.866 387.058c-16.922 29.051-9.1 68.932 19.022 97.054 28.135 28.135 68.011 35.938 97.057 19.021 39.423-22.97 163.557 49.969 295.858-82.329 132.474-132.477 59.273-256.277 82.331-295.861 16.922-29.05 9.1-68.931-19.022-97.054zm-22.405 72.894c-38.8 66.609 45.6 165.635-74.845 286.08-120.44 120.443-219.475 36.048-286.076 74.843-22.679 13.207-64.035-27.241-50.493-50.488 38.8-66.609-45.6-165.635 74.845-286.08C245.573 4.702 344.616 89.086 411.219 50.292c22.73-13.24 64.005 27.288 50.488 50.491zm-169.861 8.736c1.37 10.96-6.404 20.957-17.365 22.327-54.846 6.855-135.779 87.787-142.635 142.635-1.373 10.989-11.399 18.734-22.326 17.365-10.961-1.37-18.735-11.366-17.365-22.326 9.162-73.286 104.167-168.215 177.365-177.365 10.953-1.368 20.956 6.403 22.326 17.364z\"]\n};\nvar faLifeRing = {\n prefix: 'far',\n iconName: 'life-ring',\n icon: [512, 512, [], \"f1cd\", \"M256 504c136.967 0 248-111.033 248-248S392.967 8 256 8 8 119.033 8 256s111.033 248 248 248zm-103.398-76.72l53.411-53.411c31.806 13.506 68.128 13.522 99.974 0l53.411 53.411c-63.217 38.319-143.579 38.319-206.796 0zM336 256c0 44.112-35.888 80-80 80s-80-35.888-80-80 35.888-80 80-80 80 35.888 80 80zm91.28 103.398l-53.411-53.411c13.505-31.806 13.522-68.128 0-99.974l53.411-53.411c38.319 63.217 38.319 143.579 0 206.796zM359.397 84.72l-53.411 53.411c-31.806-13.505-68.128-13.522-99.973 0L152.602 84.72c63.217-38.319 143.579-38.319 206.795 0zM84.72 152.602l53.411 53.411c-13.506 31.806-13.522 68.128 0 99.974L84.72 359.398c-38.319-63.217-38.319-143.579 0-206.796z\"]\n};\nvar faLightbulb = {\n prefix: 'far',\n iconName: 'lightbulb',\n icon: [352, 512, [], \"f0eb\", \"M176 80c-52.94 0-96 43.06-96 96 0 8.84 7.16 16 16 16s16-7.16 16-16c0-35.3 28.72-64 64-64 8.84 0 16-7.16 16-16s-7.16-16-16-16zM96.06 459.17c0 3.15.93 6.22 2.68 8.84l24.51 36.84c2.97 4.46 7.97 7.14 13.32 7.14h78.85c5.36 0 10.36-2.68 13.32-7.14l24.51-36.84c1.74-2.62 2.67-5.7 2.68-8.84l.05-43.18H96.02l.04 43.18zM176 0C73.72 0 0 82.97 0 176c0 44.37 16.45 84.85 43.56 115.78 16.64 18.99 42.74 58.8 52.42 92.16v.06h48v-.12c-.01-4.77-.72-9.51-2.15-14.07-5.59-17.81-22.82-64.77-62.17-109.67-20.54-23.43-31.52-53.15-31.61-84.14-.2-73.64 59.67-128 127.95-128 70.58 0 128 57.42 128 128 0 30.97-11.24 60.85-31.65 84.14-39.11 44.61-56.42 91.47-62.1 109.46a47.507 47.507 0 0 0-2.22 14.3v.1h48v-.05c9.68-33.37 35.78-73.18 52.42-92.16C335.55 260.85 352 220.37 352 176 352 78.8 273.2 0 176 0z\"]\n};\nvar faListAlt = {\n prefix: 'far',\n iconName: 'list-alt',\n icon: [512, 512, [], \"f022\", \"M464 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V80c0-26.51-21.49-48-48-48zm-6 400H54a6 6 0 0 1-6-6V86a6 6 0 0 1 6-6h404a6 6 0 0 1 6 6v340a6 6 0 0 1-6 6zm-42-92v24c0 6.627-5.373 12-12 12H204c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h200c6.627 0 12 5.373 12 12zm0-96v24c0 6.627-5.373 12-12 12H204c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h200c6.627 0 12 5.373 12 12zm0-96v24c0 6.627-5.373 12-12 12H204c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h200c6.627 0 12 5.373 12 12zm-252 12c0 19.882-16.118 36-36 36s-36-16.118-36-36 16.118-36 36-36 36 16.118 36 36zm0 96c0 19.882-16.118 36-36 36s-36-16.118-36-36 16.118-36 36-36 36 16.118 36 36zm0 96c0 19.882-16.118 36-36 36s-36-16.118-36-36 16.118-36 36-36 36 16.118 36 36z\"]\n};\nvar faMap = {\n prefix: 'far',\n iconName: 'map',\n icon: [576, 512, [], \"f279\", \"M560.02 32c-1.96 0-3.98.37-5.96 1.16L384.01 96H384L212 35.28A64.252 64.252 0 0 0 191.76 32c-6.69 0-13.37 1.05-19.81 3.14L20.12 87.95A32.006 32.006 0 0 0 0 117.66v346.32C0 473.17 7.53 480 15.99 480c1.96 0 3.97-.37 5.96-1.16L192 416l172 60.71a63.98 63.98 0 0 0 40.05.15l151.83-52.81A31.996 31.996 0 0 0 576 394.34V48.02c0-9.19-7.53-16.02-15.98-16.02zM224 90.42l128 45.19v285.97l-128-45.19V90.42zM48 418.05V129.07l128-44.53v286.2l-.64.23L48 418.05zm480-35.13l-128 44.53V141.26l.64-.24L528 93.95v288.97z\"]\n};\nvar faMeh = {\n prefix: 'far',\n iconName: 'meh',\n icon: [496, 512, [], \"f11a\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm-80-216c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm160-64c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm8 144H160c-13.2 0-24 10.8-24 24s10.8 24 24 24h176c13.2 0 24-10.8 24-24s-10.8-24-24-24z\"]\n};\nvar faMehBlank = {\n prefix: 'far',\n iconName: 'meh-blank',\n icon: [496, 512, [], \"f5a4\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm-80-280c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm160 0c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32z\"]\n};\nvar faMehRollingEyes = {\n prefix: 'far',\n iconName: 'meh-rolling-eyes',\n icon: [496, 512, [], \"f5a5\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm88-304c-39.8 0-72 32.2-72 72s32.2 72 72 72 72-32.2 72-72-32.2-72-72-72zm0 112c-22.1 0-40-17.9-40-40 0-13.6 7.3-25.1 17.7-32.3-1 2.6-1.7 5.3-1.7 8.3 0 13.3 10.7 24 24 24s24-10.7 24-24c0-2.9-.7-5.7-1.7-8.3 10.4 7.2 17.7 18.7 17.7 32.3 0 22.1-17.9 40-40 40zm-104-40c0-39.8-32.2-72-72-72s-72 32.2-72 72 32.2 72 72 72 72-32.2 72-72zm-112 0c0-13.6 7.3-25.1 17.7-32.3-1 2.6-1.7 5.3-1.7 8.3 0 13.3 10.7 24 24 24s24-10.7 24-24c0-2.9-.7-5.7-1.7-8.3 10.4 7.2 17.7 18.7 17.7 32.3 0 22.1-17.9 40-40 40s-40-17.9-40-40zm192 128H184c-13.2 0-24 10.8-24 24s10.8 24 24 24h128c13.2 0 24-10.8 24-24s-10.8-24-24-24z\"]\n};\nvar faMinusSquare = {\n prefix: 'far',\n iconName: 'minus-square',\n icon: [448, 512, [], \"f146\", \"M108 284c-6.6 0-12-5.4-12-12v-32c0-6.6 5.4-12 12-12h232c6.6 0 12 5.4 12 12v32c0 6.6-5.4 12-12 12H108zM448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-48 346V86c0-3.3-2.7-6-6-6H54c-3.3 0-6 2.7-6 6v340c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z\"]\n};\nvar faMoneyBillAlt = {\n prefix: 'far',\n iconName: 'money-bill-alt',\n icon: [640, 512, [], \"f3d1\", \"M320 144c-53.02 0-96 50.14-96 112 0 61.85 42.98 112 96 112 53 0 96-50.13 96-112 0-61.86-42.98-112-96-112zm40 168c0 4.42-3.58 8-8 8h-64c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h16v-55.44l-.47.31a7.992 7.992 0 0 1-11.09-2.22l-8.88-13.31a7.992 7.992 0 0 1 2.22-11.09l15.33-10.22a23.99 23.99 0 0 1 13.31-4.03H328c4.42 0 8 3.58 8 8v88h16c4.42 0 8 3.58 8 8v16zM608 64H32C14.33 64 0 78.33 0 96v320c0 17.67 14.33 32 32 32h576c17.67 0 32-14.33 32-32V96c0-17.67-14.33-32-32-32zm-16 272c-35.35 0-64 28.65-64 64H112c0-35.35-28.65-64-64-64V176c35.35 0 64-28.65 64-64h416c0 35.35 28.65 64 64 64v160z\"]\n};\nvar faMoon = {\n prefix: 'far',\n iconName: 'moon',\n icon: [512, 512, [], \"f186\", \"M279.135 512c78.756 0 150.982-35.804 198.844-94.775 28.27-34.831-2.558-85.722-46.249-77.401-82.348 15.683-158.272-47.268-158.272-130.792 0-48.424 26.06-92.292 67.434-115.836 38.745-22.05 28.999-80.788-15.022-88.919A257.936 257.936 0 0 0 279.135 0c-141.36 0-256 114.575-256 256 0 141.36 114.576 256 256 256zm0-464c12.985 0 25.689 1.201 38.016 3.478-54.76 31.163-91.693 90.042-91.693 157.554 0 113.848 103.641 199.2 215.252 177.944C402.574 433.964 344.366 464 279.135 464c-114.875 0-208-93.125-208-208s93.125-208 208-208z\"]\n};\nvar faNewspaper = {\n prefix: 'far',\n iconName: 'newspaper',\n icon: [576, 512, [], \"f1ea\", \"M552 64H112c-20.858 0-38.643 13.377-45.248 32H24c-13.255 0-24 10.745-24 24v272c0 30.928 25.072 56 56 56h496c13.255 0 24-10.745 24-24V88c0-13.255-10.745-24-24-24zM48 392V144h16v248c0 4.411-3.589 8-8 8s-8-3.589-8-8zm480 8H111.422c.374-2.614.578-5.283.578-8V112h416v288zM172 280h136c6.627 0 12-5.373 12-12v-96c0-6.627-5.373-12-12-12H172c-6.627 0-12 5.373-12 12v96c0 6.627 5.373 12 12 12zm28-80h80v40h-80v-40zm-40 140v-24c0-6.627 5.373-12 12-12h136c6.627 0 12 5.373 12 12v24c0 6.627-5.373 12-12 12H172c-6.627 0-12-5.373-12-12zm192 0v-24c0-6.627 5.373-12 12-12h104c6.627 0 12 5.373 12 12v24c0 6.627-5.373 12-12 12H364c-6.627 0-12-5.373-12-12zm0-144v-24c0-6.627 5.373-12 12-12h104c6.627 0 12 5.373 12 12v24c0 6.627-5.373 12-12 12H364c-6.627 0-12-5.373-12-12zm0 72v-24c0-6.627 5.373-12 12-12h104c6.627 0 12 5.373 12 12v24c0 6.627-5.373 12-12 12H364c-6.627 0-12-5.373-12-12z\"]\n};\nvar faObjectGroup = {\n prefix: 'far',\n iconName: 'object-group',\n icon: [512, 512, [], \"f247\", \"M500 128c6.627 0 12-5.373 12-12V44c0-6.627-5.373-12-12-12h-72c-6.627 0-12 5.373-12 12v12H96V44c0-6.627-5.373-12-12-12H12C5.373 32 0 37.373 0 44v72c0 6.627 5.373 12 12 12h12v256H12c-6.627 0-12 5.373-12 12v72c0 6.627 5.373 12 12 12h72c6.627 0 12-5.373 12-12v-12h320v12c0 6.627 5.373 12 12 12h72c6.627 0 12-5.373 12-12v-72c0-6.627-5.373-12-12-12h-12V128h12zm-52-64h32v32h-32V64zM32 64h32v32H32V64zm32 384H32v-32h32v32zm416 0h-32v-32h32v32zm-40-64h-12c-6.627 0-12 5.373-12 12v12H96v-12c0-6.627-5.373-12-12-12H72V128h12c6.627 0 12-5.373 12-12v-12h320v12c0 6.627 5.373 12 12 12h12v256zm-36-192h-84v-52c0-6.628-5.373-12-12-12H108c-6.627 0-12 5.372-12 12v168c0 6.628 5.373 12 12 12h84v52c0 6.628 5.373 12 12 12h200c6.627 0 12-5.372 12-12V204c0-6.628-5.373-12-12-12zm-268-24h144v112H136V168zm240 176H232v-24h76c6.627 0 12-5.372 12-12v-76h56v112z\"]\n};\nvar faObjectUngroup = {\n prefix: 'far',\n iconName: 'object-ungroup',\n icon: [576, 512, [], \"f248\", \"M564 224c6.627 0 12-5.373 12-12v-72c0-6.627-5.373-12-12-12h-72c-6.627 0-12 5.373-12 12v12h-88v-24h12c6.627 0 12-5.373 12-12V44c0-6.627-5.373-12-12-12h-72c-6.627 0-12 5.373-12 12v12H96V44c0-6.627-5.373-12-12-12H12C5.373 32 0 37.373 0 44v72c0 6.627 5.373 12 12 12h12v160H12c-6.627 0-12 5.373-12 12v72c0 6.627 5.373 12 12 12h72c6.627 0 12-5.373 12-12v-12h88v24h-12c-6.627 0-12 5.373-12 12v72c0 6.627 5.373 12 12 12h72c6.627 0 12-5.373 12-12v-12h224v12c0 6.627 5.373 12 12 12h72c6.627 0 12-5.373 12-12v-72c0-6.627-5.373-12-12-12h-12V224h12zM352 64h32v32h-32V64zm0 256h32v32h-32v-32zM64 352H32v-32h32v32zm0-256H32V64h32v32zm32 216v-12c0-6.627-5.373-12-12-12H72V128h12c6.627 0 12-5.373 12-12v-12h224v12c0 6.627 5.373 12 12 12h12v160h-12c-6.627 0-12 5.373-12 12v12H96zm128 136h-32v-32h32v32zm280-64h-12c-6.627 0-12 5.373-12 12v12H256v-12c0-6.627-5.373-12-12-12h-12v-24h88v12c0 6.627 5.373 12 12 12h72c6.627 0 12-5.373 12-12v-72c0-6.627-5.373-12-12-12h-12v-88h88v12c0 6.627 5.373 12 12 12h12v160zm40 64h-32v-32h32v32zm0-256h-32v-32h32v32z\"]\n};\nvar faPaperPlane = {\n prefix: 'far',\n iconName: 'paper-plane',\n icon: [512, 512, [], \"f1d8\", \"M440 6.5L24 246.4c-34.4 19.9-31.1 70.8 5.7 85.9L144 379.6V464c0 46.4 59.2 65.5 86.6 28.6l43.8-59.1 111.9 46.2c5.9 2.4 12.1 3.6 18.3 3.6 8.2 0 16.3-2.1 23.6-6.2 12.8-7.2 21.6-20 23.9-34.5l59.4-387.2c6.1-40.1-36.9-68.8-71.5-48.9zM192 464v-64.6l36.6 15.1L192 464zm212.6-28.7l-153.8-63.5L391 169.5c10.7-15.5-9.5-33.5-23.7-21.2L155.8 332.6 48 288 464 48l-59.4 387.3z\"]\n};\nvar faPauseCircle = {\n prefix: 'far',\n iconName: 'pause-circle',\n icon: [512, 512, [], \"f28b\", \"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm0 448c-110.5 0-200-89.5-200-200S145.5 56 256 56s200 89.5 200 200-89.5 200-200 200zm96-280v160c0 8.8-7.2 16-16 16h-48c-8.8 0-16-7.2-16-16V176c0-8.8 7.2-16 16-16h48c8.8 0 16 7.2 16 16zm-112 0v160c0 8.8-7.2 16-16 16h-48c-8.8 0-16-7.2-16-16V176c0-8.8 7.2-16 16-16h48c8.8 0 16 7.2 16 16z\"]\n};\nvar faPlayCircle = {\n prefix: 'far',\n iconName: 'play-circle',\n icon: [512, 512, [], \"f144\", \"M371.7 238l-176-107c-15.8-8.8-35.7 2.5-35.7 21v208c0 18.4 19.8 29.8 35.7 21l176-101c16.4-9.1 16.4-32.8 0-42zM504 256C504 119 393 8 256 8S8 119 8 256s111 248 248 248 248-111 248-248zm-448 0c0-110.5 89.5-200 200-200s200 89.5 200 200-89.5 200-200 200S56 366.5 56 256z\"]\n};\nvar faPlusSquare = {\n prefix: 'far',\n iconName: 'plus-square',\n icon: [448, 512, [], \"f0fe\", \"M352 240v32c0 6.6-5.4 12-12 12h-88v88c0 6.6-5.4 12-12 12h-32c-6.6 0-12-5.4-12-12v-88h-88c-6.6 0-12-5.4-12-12v-32c0-6.6 5.4-12 12-12h88v-88c0-6.6 5.4-12 12-12h32c6.6 0 12 5.4 12 12v88h88c6.6 0 12 5.4 12 12zm96-160v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-48 346V86c0-3.3-2.7-6-6-6H54c-3.3 0-6 2.7-6 6v340c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z\"]\n};\nvar faQuestionCircle = {\n prefix: 'far',\n iconName: 'question-circle',\n icon: [512, 512, [], \"f059\", \"M256 8C119.043 8 8 119.083 8 256c0 136.997 111.043 248 248 248s248-111.003 248-248C504 119.083 392.957 8 256 8zm0 448c-110.532 0-200-89.431-200-200 0-110.495 89.472-200 200-200 110.491 0 200 89.471 200 200 0 110.53-89.431 200-200 200zm107.244-255.2c0 67.052-72.421 68.084-72.421 92.863V300c0 6.627-5.373 12-12 12h-45.647c-6.627 0-12-5.373-12-12v-8.659c0-35.745 27.1-50.034 47.579-61.516 17.561-9.845 28.324-16.541 28.324-29.579 0-17.246-21.999-28.693-39.784-28.693-23.189 0-33.894 10.977-48.942 29.969-4.057 5.12-11.46 6.071-16.666 2.124l-27.824-21.098c-5.107-3.872-6.251-11.066-2.644-16.363C184.846 131.491 214.94 112 261.794 112c49.071 0 101.45 38.304 101.45 88.8zM298 368c0 23.159-18.841 42-42 42s-42-18.841-42-42 18.841-42 42-42 42 18.841 42 42z\"]\n};\nvar faRegistered = {\n prefix: 'far',\n iconName: 'registered',\n icon: [512, 512, [], \"f25d\", \"M256 8C119.033 8 8 119.033 8 256s111.033 248 248 248 248-111.033 248-248S392.967 8 256 8zm0 448c-110.532 0-200-89.451-200-200 0-110.531 89.451-200 200-200 110.532 0 200 89.451 200 200 0 110.532-89.451 200-200 200zm110.442-81.791c-53.046-96.284-50.25-91.468-53.271-96.085 24.267-13.879 39.482-41.563 39.482-73.176 0-52.503-30.247-85.252-101.498-85.252h-78.667c-6.617 0-12 5.383-12 12V380c0 6.617 5.383 12 12 12h38.568c6.617 0 12-5.383 12-12v-83.663h31.958l47.515 89.303a11.98 11.98 0 0 0 10.593 6.36h42.81c9.14 0 14.914-9.799 10.51-17.791zM256.933 239.906h-33.875v-64.14h27.377c32.417 0 38.929 12.133 38.929 31.709-.001 20.913-11.518 32.431-32.431 32.431z\"]\n};\nvar faSadCry = {\n prefix: 'far',\n iconName: 'sad-cry',\n icon: [496, 512, [], \"f5b3\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm144 386.4V280c0-13.2-10.8-24-24-24s-24 10.8-24 24v151.4C315.5 447 282.8 456 248 456s-67.5-9-96-24.6V280c0-13.2-10.8-24-24-24s-24 10.8-24 24v114.4c-34.6-36-56-84.7-56-138.4 0-110.3 89.7-200 200-200s200 89.7 200 200c0 53.7-21.4 102.5-56 138.4zM205.8 234.5c4.4-2.4 6.9-7.4 6.1-12.4-4-25.2-34.2-42.1-59.8-42.1s-55.9 16.9-59.8 42.1c-.8 5 1.7 10 6.1 12.4 4.4 2.4 9.9 1.8 13.7-1.6l9.5-8.5c14.8-13.2 46.2-13.2 61 0l9.5 8.5c2.5 2.3 7.9 4.8 13.7 1.6zM344 180c-25.7 0-55.9 16.9-59.8 42.1-.8 5 1.7 10 6.1 12.4 4.5 2.4 9.9 1.8 13.7-1.6l9.5-8.5c14.8-13.2 46.2-13.2 61 0l9.5 8.5c2.5 2.2 8 4.7 13.7 1.6 4.4-2.4 6.9-7.4 6.1-12.4-3.9-25.2-34.1-42.1-59.8-42.1zm-96 92c-30.9 0-56 28.7-56 64s25.1 64 56 64 56-28.7 56-64-25.1-64-56-64z\"]\n};\nvar faSadTear = {\n prefix: 'far',\n iconName: 'sad-tear',\n icon: [496, 512, [], \"f5b4\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm8-152c-13.2 0-24 10.8-24 24s10.8 24 24 24c23.8 0 46.3 10.5 61.6 28.8 8.1 9.8 23.2 11.9 33.8 3.1 10.2-8.5 11.6-23.6 3.1-33.8C330 320.8 294.1 304 256 304zm-88-64c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm160-64c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm-165.6 98.8C151 290.1 126 325.4 126 342.9c0 22.7 18.8 41.1 42 41.1s42-18.4 42-41.1c0-17.5-25-52.8-36.4-68.1-2.8-3.7-8.4-3.7-11.2 0z\"]\n};\nvar faSave = {\n prefix: 'far',\n iconName: 'save',\n icon: [448, 512, [], \"f0c7\", \"M433.941 129.941l-83.882-83.882A48 48 0 0 0 316.118 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h352c26.51 0 48-21.49 48-48V163.882a48 48 0 0 0-14.059-33.941zM272 80v80H144V80h128zm122 352H54a6 6 0 0 1-6-6V86a6 6 0 0 1 6-6h42v104c0 13.255 10.745 24 24 24h176c13.255 0 24-10.745 24-24V83.882l78.243 78.243a6 6 0 0 1 1.757 4.243V426a6 6 0 0 1-6 6zM224 232c-48.523 0-88 39.477-88 88s39.477 88 88 88 88-39.477 88-88-39.477-88-88-88zm0 128c-22.056 0-40-17.944-40-40s17.944-40 40-40 40 17.944 40 40-17.944 40-40 40z\"]\n};\nvar faShareSquare = {\n prefix: 'far',\n iconName: 'share-square',\n icon: [576, 512, [], \"f14d\", \"M561.938 158.06L417.94 14.092C387.926-15.922 336 5.097 336 48.032v57.198c-42.45 1.88-84.03 6.55-120.76 17.99-35.17 10.95-63.07 27.58-82.91 49.42C108.22 199.2 96 232.6 96 271.94c0 61.697 33.178 112.455 84.87 144.76 37.546 23.508 85.248-12.651 71.02-55.74-15.515-47.119-17.156-70.923 84.11-78.76V336c0 42.993 51.968 63.913 81.94 33.94l143.998-144c18.75-18.74 18.75-49.14 0-67.88zM384 336V232.16C255.309 234.082 166.492 255.35 206.31 376 176.79 357.55 144 324.08 144 271.94c0-109.334 129.14-118.947 240-119.85V48l144 144-144 144zm24.74 84.493a82.658 82.658 0 0 0 20.974-9.303c7.976-4.952 18.286.826 18.286 10.214V464c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48V112c0-26.51 21.49-48 48-48h132c6.627 0 12 5.373 12 12v4.486c0 4.917-2.987 9.369-7.569 11.152-13.702 5.331-26.396 11.537-38.05 18.585a12.138 12.138 0 0 1-6.28 1.777H54a6 6 0 0 0-6 6v340a6 6 0 0 0 6 6h340a6 6 0 0 0 6-6v-25.966c0-5.37 3.579-10.059 8.74-11.541z\"]\n};\nvar faSmile = {\n prefix: 'far',\n iconName: 'smile',\n icon: [496, 512, [], \"f118\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm-80-216c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm160 0c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm4 72.6c-20.8 25-51.5 39.4-84 39.4s-63.2-14.3-84-39.4c-8.5-10.2-23.7-11.5-33.8-3.1-10.2 8.5-11.5 23.6-3.1 33.8 30 36 74.1 56.6 120.9 56.6s90.9-20.6 120.9-56.6c8.5-10.2 7.1-25.3-3.1-33.8-10.1-8.4-25.3-7.1-33.8 3.1z\"]\n};\nvar faSmileBeam = {\n prefix: 'far',\n iconName: 'smile-beam',\n icon: [496, 512, [], \"f5b8\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm84-143.4c-20.8 25-51.5 39.4-84 39.4s-63.2-14.3-84-39.4c-8.5-10.2-23.6-11.5-33.8-3.1-10.2 8.5-11.5 23.6-3.1 33.8 30 36 74.1 56.6 120.9 56.6s90.9-20.6 120.9-56.6c8.5-10.2 7.1-25.3-3.1-33.8-10.2-8.4-25.3-7.1-33.8 3.1zM136.5 211c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c2.1 3.7 6.2 4.7 9.3 3.7 3.6-1.1 6-4.5 5.7-8.3-3.3-42.1-32.2-71.4-56-71.4s-52.7 29.3-56 71.4c-.3 3.7 2.1 7.2 5.7 8.3 3.4 1.1 7.4-.5 9.3-3.7l9.5-17zM328 152c-23.8 0-52.7 29.3-56 71.4-.3 3.7 2.1 7.2 5.7 8.3 3.5 1.1 7.4-.5 9.3-3.7l9.5-17c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c2.1 3.7 6.2 4.7 9.3 3.7 3.6-1.1 6-4.5 5.7-8.3-3.3-42.1-32.2-71.4-56-71.4z\"]\n};\nvar faSmileWink = {\n prefix: 'far',\n iconName: 'smile-wink',\n icon: [496, 512, [], \"f4da\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm117.8-146.4c-10.2-8.5-25.3-7.1-33.8 3.1-20.8 25-51.5 39.4-84 39.4s-63.2-14.3-84-39.4c-8.5-10.2-23.7-11.5-33.8-3.1-10.2 8.5-11.5 23.6-3.1 33.8 30 36 74.1 56.6 120.9 56.6s90.9-20.6 120.9-56.6c8.5-10.2 7.1-25.3-3.1-33.8zM168 240c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm160-60c-25.7 0-55.9 16.9-59.9 42.1-1.7 11.2 11.5 18.2 19.8 10.8l9.5-8.5c14.8-13.2 46.2-13.2 61 0l9.5 8.5c8.5 7.4 21.6.3 19.8-10.8-3.8-25.2-34-42.1-59.7-42.1z\"]\n};\nvar faSnowflake = {\n prefix: 'far',\n iconName: 'snowflake',\n icon: [448, 512, [], \"f2dc\", \"M440.1 355.2l-39.2-23 34.1-9.3c8.4-2.3 13.4-11.1 11.1-19.6l-4.1-15.5c-2.2-8.5-10.9-13.6-19.3-11.3L343 298.2 271.2 256l71.9-42.2 79.7 21.7c8.4 2.3 17-2.8 19.3-11.3l4.1-15.5c2.2-8.5-2.7-17.3-11.1-19.6l-34.1-9.3 39.2-23c7.5-4.4 10.1-14.2 5.8-21.9l-7.9-13.9c-4.3-7.7-14-10.3-21.5-5.9l-39.2 23 9.1-34.7c2.2-8.5-2.7-17.3-11.1-19.6l-15.2-4.1c-8.4-2.3-17 2.8-19.3 11.3l-21.3 81-71.9 42.2v-84.5L306 70.4c6.1-6.2 6.1-16.4 0-22.6l-11.1-11.3c-6.1-6.2-16.1-6.2-22.2 0l-24.9 25.4V16c0-8.8-7-16-15.7-16h-15.7c-8.7 0-15.7 7.2-15.7 16v46.1l-24.9-25.4c-6.1-6.2-16.1-6.2-22.2 0L142.1 48c-6.1 6.2-6.1 16.4 0 22.6l58.3 59.3v84.5l-71.9-42.2-21.3-81c-2.2-8.5-10.9-13.6-19.3-11.3L72.7 84c-8.4 2.3-13.4 11.1-11.1 19.6l9.1 34.7-39.2-23c-7.5-4.4-17.1-1.8-21.5 5.9l-7.9 13.9c-4.3 7.7-1.8 17.4 5.8 21.9l39.2 23-34.1 9.1c-8.4 2.3-13.4 11.1-11.1 19.6L6 224.2c2.2 8.5 10.9 13.6 19.3 11.3l79.7-21.7 71.9 42.2-71.9 42.2-79.7-21.7c-8.4-2.3-17 2.8-19.3 11.3l-4.1 15.5c-2.2 8.5 2.7 17.3 11.1 19.6l34.1 9.3-39.2 23c-7.5 4.4-10.1 14.2-5.8 21.9L10 391c4.3 7.7 14 10.3 21.5 5.9l39.2-23-9.1 34.7c-2.2 8.5 2.7 17.3 11.1 19.6l15.2 4.1c8.4 2.3 17-2.8 19.3-11.3l21.3-81 71.9-42.2v84.5l-58.3 59.3c-6.1 6.2-6.1 16.4 0 22.6l11.1 11.3c6.1 6.2 16.1 6.2 22.2 0l24.9-25.4V496c0 8.8 7 16 15.7 16h15.7c8.7 0 15.7-7.2 15.7-16v-46.1l24.9 25.4c6.1 6.2 16.1 6.2 22.2 0l11.1-11.3c6.1-6.2 6.1-16.4 0-22.6l-58.3-59.3v-84.5l71.9 42.2 21.3 81c2.2 8.5 10.9 13.6 19.3 11.3L375 428c8.4-2.3 13.4-11.1 11.1-19.6l-9.1-34.7 39.2 23c7.5 4.4 17.1 1.8 21.5-5.9l7.9-13.9c4.6-7.5 2.1-17.3-5.5-21.7z\"]\n};\nvar faSquare = {\n prefix: 'far',\n iconName: 'square',\n icon: [448, 512, [], \"f0c8\", \"M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm-6 400H54c-3.3 0-6-2.7-6-6V86c0-3.3 2.7-6 6-6h340c3.3 0 6 2.7 6 6v340c0 3.3-2.7 6-6 6z\"]\n};\nvar faStar = {\n prefix: 'far',\n iconName: 'star',\n icon: [576, 512, [], \"f005\", \"M528.1 171.5L382 150.2 316.7 17.8c-11.7-23.6-45.6-23.9-57.4 0L194 150.2 47.9 171.5c-26.2 3.8-36.7 36.1-17.7 54.6l105.7 103-25 145.5c-4.5 26.3 23.2 46 46.4 33.7L288 439.6l130.7 68.7c23.2 12.2 50.9-7.4 46.4-33.7l-25-145.5 105.7-103c19-18.5 8.5-50.8-17.7-54.6zM388.6 312.3l23.7 138.4L288 385.4l-124.3 65.3 23.7-138.4-100.6-98 139-20.2 62.2-126 62.2 126 139 20.2-100.6 98z\"]\n};\nvar faStarHalf = {\n prefix: 'far',\n iconName: 'star-half',\n icon: [576, 512, [], \"f089\", \"M288 385.3l-124.3 65.4 23.7-138.4-100.6-98 139-20.2 62.2-126V0c-11.4 0-22.8 5.9-28.7 17.8L194 150.2 47.9 171.4c-26.2 3.8-36.7 36.1-17.7 54.6l105.7 103-25 145.5c-4.5 26.1 23 46 46.4 33.7L288 439.6v-54.3z\"]\n};\nvar faStickyNote = {\n prefix: 'far',\n iconName: 'sticky-note',\n icon: [448, 512, [], \"f249\", \"M448 348.106V80c0-26.51-21.49-48-48-48H48C21.49 32 0 53.49 0 80v351.988c0 26.51 21.49 48 48 48h268.118a48 48 0 0 0 33.941-14.059l83.882-83.882A48 48 0 0 0 448 348.106zm-128 80v-76.118h76.118L320 428.106zM400 80v223.988H296c-13.255 0-24 10.745-24 24v104H48V80h352z\"]\n};\nvar faStopCircle = {\n prefix: 'far',\n iconName: 'stop-circle',\n icon: [512, 512, [], \"f28d\", \"M504 256C504 119 393 8 256 8S8 119 8 256s111 248 248 248 248-111 248-248zm-448 0c0-110.5 89.5-200 200-200s200 89.5 200 200-89.5 200-200 200S56 366.5 56 256zm296-80v160c0 8.8-7.2 16-16 16H176c-8.8 0-16-7.2-16-16V176c0-8.8 7.2-16 16-16h160c8.8 0 16 7.2 16 16z\"]\n};\nvar faSun = {\n prefix: 'far',\n iconName: 'sun',\n icon: [512, 512, [], \"f185\", \"M494.2 221.9l-59.8-40.5 13.7-71c2.6-13.2-1.6-26.8-11.1-36.4-9.6-9.5-23.2-13.7-36.2-11.1l-70.9 13.7-40.4-59.9c-15.1-22.3-51.9-22.3-67 0l-40.4 59.9-70.8-13.7C98 60.4 84.5 64.5 75 74.1c-9.5 9.6-13.7 23.1-11.1 36.3l13.7 71-59.8 40.5C6.6 229.5 0 242 0 255.5s6.7 26 17.8 33.5l59.8 40.5-13.7 71c-2.6 13.2 1.6 26.8 11.1 36.3 9.5 9.5 22.9 13.7 36.3 11.1l70.8-13.7 40.4 59.9C230 505.3 242.6 512 256 512s26-6.7 33.5-17.8l40.4-59.9 70.9 13.7c13.4 2.7 26.8-1.6 36.3-11.1 9.5-9.5 13.6-23.1 11.1-36.3l-13.7-71 59.8-40.5c11.1-7.5 17.8-20.1 17.8-33.5-.1-13.6-6.7-26.1-17.9-33.7zm-112.9 85.6l17.6 91.2-91-17.6L256 458l-51.9-77-90.9 17.6 17.6-91.2-76.8-52 76.8-52-17.6-91.2 91 17.6L256 53l51.9 76.9 91-17.6-17.6 91.1 76.8 52-76.8 52.1zM256 152c-57.3 0-104 46.7-104 104s46.7 104 104 104 104-46.7 104-104-46.7-104-104-104zm0 160c-30.9 0-56-25.1-56-56s25.1-56 56-56 56 25.1 56 56-25.1 56-56 56z\"]\n};\nvar faSurprise = {\n prefix: 'far',\n iconName: 'surprise',\n icon: [496, 512, [], \"f5c2\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm0-176c-35.3 0-64 28.7-64 64s28.7 64 64 64 64-28.7 64-64-28.7-64-64-64zm-48-72c0-17.7-14.3-32-32-32s-32 14.3-32 32 14.3 32 32 32 32-14.3 32-32zm128-32c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32z\"]\n};\nvar faThumbsDown = {\n prefix: 'far',\n iconName: 'thumbs-down',\n icon: [512, 512, [], \"f165\", \"M466.27 225.31c4.674-22.647.864-44.538-8.99-62.99 2.958-23.868-4.021-48.565-17.34-66.99C438.986 39.423 404.117 0 327 0c-7 0-15 .01-22.22.01C201.195.01 168.997 40 128 40h-10.845c-5.64-4.975-13.042-8-21.155-8H32C14.327 32 0 46.327 0 64v240c0 17.673 14.327 32 32 32h64c11.842 0 22.175-6.438 27.708-16h7.052c19.146 16.953 46.013 60.653 68.76 83.4 13.667 13.667 10.153 108.6 71.76 108.6 57.58 0 95.27-31.936 95.27-104.73 0-18.41-3.93-33.73-8.85-46.54h36.48c48.602 0 85.82-41.565 85.82-85.58 0-19.15-4.96-34.99-13.73-49.84zM64 296c-13.255 0-24-10.745-24-24s10.745-24 24-24 24 10.745 24 24-10.745 24-24 24zm330.18 16.73H290.19c0 37.82 28.36 55.37 28.36 94.54 0 23.75 0 56.73-47.27 56.73-18.91-18.91-9.46-66.18-37.82-94.54C206.9 342.89 167.28 272 138.92 272H128V85.83c53.611 0 100.001-37.82 171.64-37.82h37.82c35.512 0 60.82 17.12 53.12 65.9 15.2 8.16 26.5 36.44 13.94 57.57 21.581 20.384 18.699 51.065 5.21 65.62 9.45 0 22.36 18.91 22.27 37.81-.09 18.91-16.71 37.82-37.82 37.82z\"]\n};\nvar faThumbsUp = {\n prefix: 'far',\n iconName: 'thumbs-up',\n icon: [512, 512, [], \"f164\", \"M466.27 286.69C475.04 271.84 480 256 480 236.85c0-44.015-37.218-85.58-85.82-85.58H357.7c4.92-12.81 8.85-28.13 8.85-46.54C366.55 31.936 328.86 0 271.28 0c-61.607 0-58.093 94.933-71.76 108.6-22.747 22.747-49.615 66.447-68.76 83.4H32c-17.673 0-32 14.327-32 32v240c0 17.673 14.327 32 32 32h64c14.893 0 27.408-10.174 30.978-23.95 44.509 1.001 75.06 39.94 177.802 39.94 7.22 0 15.22.01 22.22.01 77.117 0 111.986-39.423 112.94-95.33 13.319-18.425 20.299-43.122 17.34-66.99 9.854-18.452 13.664-40.343 8.99-62.99zm-61.75 53.83c12.56 21.13 1.26 49.41-13.94 57.57 7.7 48.78-17.608 65.9-53.12 65.9h-37.82c-71.639 0-118.029-37.82-171.64-37.82V240h10.92c28.36 0 67.98-70.89 94.54-97.46 28.36-28.36 18.91-75.63 37.82-94.54 47.27 0 47.27 32.98 47.27 56.73 0 39.17-28.36 56.72-28.36 94.54h103.99c21.11 0 37.73 18.91 37.82 37.82.09 18.9-12.82 37.81-22.27 37.81 13.489 14.555 16.371 45.236-5.21 65.62zM88 432c0 13.255-10.745 24-24 24s-24-10.745-24-24 10.745-24 24-24 24 10.745 24 24z\"]\n};\nvar faTimesCircle = {\n prefix: 'far',\n iconName: 'times-circle',\n icon: [512, 512, [], \"f057\", \"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm0 448c-110.5 0-200-89.5-200-200S145.5 56 256 56s200 89.5 200 200-89.5 200-200 200zm101.8-262.2L295.6 256l62.2 62.2c4.7 4.7 4.7 12.3 0 17l-22.6 22.6c-4.7 4.7-12.3 4.7-17 0L256 295.6l-62.2 62.2c-4.7 4.7-12.3 4.7-17 0l-22.6-22.6c-4.7-4.7-4.7-12.3 0-17l62.2-62.2-62.2-62.2c-4.7-4.7-4.7-12.3 0-17l22.6-22.6c4.7-4.7 12.3-4.7 17 0l62.2 62.2 62.2-62.2c4.7-4.7 12.3-4.7 17 0l22.6 22.6c4.7 4.7 4.7 12.3 0 17z\"]\n};\nvar faTired = {\n prefix: 'far',\n iconName: 'tired',\n icon: [496, 512, [], \"f5c8\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm129.1-303.8c-3.8-4.4-10.3-5.4-15.3-2.5l-80 48c-3.6 2.2-5.8 6.1-5.8 10.3s2.2 8.1 5.8 10.3l80 48c5.4 3.2 11.8 1.6 15.3-2.5 3.8-4.5 3.9-11 .1-15.5L343.6 208l33.6-40.3c3.8-4.5 3.7-11.1-.1-15.5zM220 208c0-4.2-2.2-8.1-5.8-10.3l-80-48c-5-3-11.5-1.9-15.3 2.5-3.8 4.5-3.9 11-.1 15.5l33.6 40.3-33.6 40.3c-3.8 4.5-3.7 11 .1 15.5 3.5 4.1 9.9 5.7 15.3 2.5l80-48c3.6-2.2 5.8-6.1 5.8-10.3zm28 64c-45.4 0-100.9 38.3-107.8 93.3-1.5 11.8 6.9 21.6 15.5 17.9C178.4 373.5 212 368 248 368s69.6 5.5 92.3 15.2c8.5 3.7 17-6 15.5-17.9-6.9-55-62.4-93.3-107.8-93.3z\"]\n};\nvar faTrashAlt = {\n prefix: 'far',\n iconName: 'trash-alt',\n icon: [448, 512, [], \"f2ed\", \"M268 416h24a12 12 0 0 0 12-12V188a12 12 0 0 0-12-12h-24a12 12 0 0 0-12 12v216a12 12 0 0 0 12 12zM432 80h-82.41l-34-56.7A48 48 0 0 0 274.41 0H173.59a48 48 0 0 0-41.16 23.3L98.41 80H16A16 16 0 0 0 0 96v16a16 16 0 0 0 16 16h16v336a48 48 0 0 0 48 48h288a48 48 0 0 0 48-48V128h16a16 16 0 0 0 16-16V96a16 16 0 0 0-16-16zM171.84 50.91A6 6 0 0 1 177 48h94a6 6 0 0 1 5.15 2.91L293.61 80H154.39zM368 464H80V128h288zm-212-48h24a12 12 0 0 0 12-12V188a12 12 0 0 0-12-12h-24a12 12 0 0 0-12 12v216a12 12 0 0 0 12 12z\"]\n};\nvar faUser = {\n prefix: 'far',\n iconName: 'user',\n icon: [448, 512, [], \"f007\", \"M313.6 304c-28.7 0-42.5 16-89.6 16-47.1 0-60.8-16-89.6-16C60.2 304 0 364.2 0 438.4V464c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48v-25.6c0-74.2-60.2-134.4-134.4-134.4zM400 464H48v-25.6c0-47.6 38.8-86.4 86.4-86.4 14.6 0 38.3 16 89.6 16 51.7 0 74.9-16 89.6-16 47.6 0 86.4 38.8 86.4 86.4V464zM224 288c79.5 0 144-64.5 144-144S303.5 0 224 0 80 64.5 80 144s64.5 144 144 144zm0-240c52.9 0 96 43.1 96 96s-43.1 96-96 96-96-43.1-96-96 43.1-96 96-96z\"]\n};\nvar faUserCircle = {\n prefix: 'far',\n iconName: 'user-circle',\n icon: [496, 512, [], \"f2bd\", \"M248 104c-53 0-96 43-96 96s43 96 96 96 96-43 96-96-43-96-96-96zm0 144c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zm0-240C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-49.7 0-95.1-18.3-130.1-48.4 14.9-23 40.4-38.6 69.6-39.5 20.8 6.4 40.6 9.6 60.5 9.6s39.7-3.1 60.5-9.6c29.2 1 54.7 16.5 69.6 39.5-35 30.1-80.4 48.4-130.1 48.4zm162.7-84.1c-24.4-31.4-62.1-51.9-105.1-51.9-10.2 0-26 9.6-57.6 9.6-31.5 0-47.4-9.6-57.6-9.6-42.9 0-80.6 20.5-105.1 51.9C61.9 339.2 48 299.2 48 256c0-110.3 89.7-200 200-200s200 89.7 200 200c0 43.2-13.9 83.2-37.3 115.9z\"]\n};\nvar faWindowClose = {\n prefix: 'far',\n iconName: 'window-close',\n icon: [512, 512, [], \"f410\", \"M464 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm0 394c0 3.3-2.7 6-6 6H54c-3.3 0-6-2.7-6-6V86c0-3.3 2.7-6 6-6h404c3.3 0 6 2.7 6 6v340zM356.5 194.6L295.1 256l61.4 61.4c4.6 4.6 4.6 12.1 0 16.8l-22.3 22.3c-4.6 4.6-12.1 4.6-16.8 0L256 295.1l-61.4 61.4c-4.6 4.6-12.1 4.6-16.8 0l-22.3-22.3c-4.6-4.6-4.6-12.1 0-16.8l61.4-61.4-61.4-61.4c-4.6-4.6-4.6-12.1 0-16.8l22.3-22.3c4.6-4.6 12.1-4.6 16.8 0l61.4 61.4 61.4-61.4c4.6-4.6 12.1-4.6 16.8 0l22.3 22.3c4.7 4.6 4.7 12.1 0 16.8z\"]\n};\nvar faWindowMaximize = {\n prefix: 'far',\n iconName: 'window-maximize',\n icon: [512, 512, [], \"f2d0\", \"M464 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm0 394c0 3.3-2.7 6-6 6H54c-3.3 0-6-2.7-6-6V192h416v234z\"]\n};\nvar faWindowMinimize = {\n prefix: 'far',\n iconName: 'window-minimize',\n icon: [512, 512, [], \"f2d1\", \"M480 480H32c-17.7 0-32-14.3-32-32s14.3-32 32-32h448c17.7 0 32 14.3 32 32s-14.3 32-32 32z\"]\n};\nvar faWindowRestore = {\n prefix: 'far',\n iconName: 'window-restore',\n icon: [512, 512, [], \"f2d2\", \"M464 0H144c-26.5 0-48 21.5-48 48v48H48c-26.5 0-48 21.5-48 48v320c0 26.5 21.5 48 48 48h320c26.5 0 48-21.5 48-48v-48h48c26.5 0 48-21.5 48-48V48c0-26.5-21.5-48-48-48zm-96 464H48V256h320v208zm96-96h-48V144c0-26.5-21.5-48-48-48H144V48h320v320z\"]\n};\nvar _iconsCache = {\n faAddressBook: faAddressBook,\n faAddressCard: faAddressCard,\n faAngry: faAngry,\n faArrowAltCircleDown: faArrowAltCircleDown,\n faArrowAltCircleLeft: faArrowAltCircleLeft,\n faArrowAltCircleRight: faArrowAltCircleRight,\n faArrowAltCircleUp: faArrowAltCircleUp,\n faBell: faBell,\n faBellSlash: faBellSlash,\n faBookmark: faBookmark,\n faBuilding: faBuilding,\n faCalendar: faCalendar,\n faCalendarAlt: faCalendarAlt,\n faCalendarCheck: faCalendarCheck,\n faCalendarMinus: faCalendarMinus,\n faCalendarPlus: faCalendarPlus,\n faCalendarTimes: faCalendarTimes,\n faCaretSquareDown: faCaretSquareDown,\n faCaretSquareLeft: faCaretSquareLeft,\n faCaretSquareRight: faCaretSquareRight,\n faCaretSquareUp: faCaretSquareUp,\n faChartBar: faChartBar,\n faCheckCircle: faCheckCircle,\n faCheckSquare: faCheckSquare,\n faCircle: faCircle,\n faClipboard: faClipboard,\n faClock: faClock,\n faClone: faClone,\n faClosedCaptioning: faClosedCaptioning,\n faComment: faComment,\n faCommentAlt: faCommentAlt,\n faCommentDots: faCommentDots,\n faComments: faComments,\n faCompass: faCompass,\n faCopy: faCopy,\n faCopyright: faCopyright,\n faCreditCard: faCreditCard,\n faDizzy: faDizzy,\n faDotCircle: faDotCircle,\n faEdit: faEdit,\n faEnvelope: faEnvelope,\n faEnvelopeOpen: faEnvelopeOpen,\n faEye: faEye,\n faEyeSlash: faEyeSlash,\n faFile: faFile,\n faFileAlt: faFileAlt,\n faFileArchive: faFileArchive,\n faFileAudio: faFileAudio,\n faFileCode: faFileCode,\n faFileExcel: faFileExcel,\n faFileImage: faFileImage,\n faFilePdf: faFilePdf,\n faFilePowerpoint: faFilePowerpoint,\n faFileVideo: faFileVideo,\n faFileWord: faFileWord,\n faFlag: faFlag,\n faFlushed: faFlushed,\n faFolder: faFolder,\n faFolderOpen: faFolderOpen,\n faFontAwesomeLogoFull: faFontAwesomeLogoFull,\n faFrown: faFrown,\n faFrownOpen: faFrownOpen,\n faFutbol: faFutbol,\n faGem: faGem,\n faGrimace: faGrimace,\n faGrin: faGrin,\n faGrinAlt: faGrinAlt,\n faGrinBeam: faGrinBeam,\n faGrinBeamSweat: faGrinBeamSweat,\n faGrinHearts: faGrinHearts,\n faGrinSquint: faGrinSquint,\n faGrinSquintTears: faGrinSquintTears,\n faGrinStars: faGrinStars,\n faGrinTears: faGrinTears,\n faGrinTongue: faGrinTongue,\n faGrinTongueSquint: faGrinTongueSquint,\n faGrinTongueWink: faGrinTongueWink,\n faGrinWink: faGrinWink,\n faHandLizard: faHandLizard,\n faHandPaper: faHandPaper,\n faHandPeace: faHandPeace,\n faHandPointDown: faHandPointDown,\n faHandPointLeft: faHandPointLeft,\n faHandPointRight: faHandPointRight,\n faHandPointUp: faHandPointUp,\n faHandPointer: faHandPointer,\n faHandRock: faHandRock,\n faHandScissors: faHandScissors,\n faHandSpock: faHandSpock,\n faHandshake: faHandshake,\n faHdd: faHdd,\n faHeart: faHeart,\n faHospital: faHospital,\n faHourglass: faHourglass,\n faIdBadge: faIdBadge,\n faIdCard: faIdCard,\n faImage: faImage,\n faImages: faImages,\n faKeyboard: faKeyboard,\n faKiss: faKiss,\n faKissBeam: faKissBeam,\n faKissWinkHeart: faKissWinkHeart,\n faLaugh: faLaugh,\n faLaughBeam: faLaughBeam,\n faLaughSquint: faLaughSquint,\n faLaughWink: faLaughWink,\n faLemon: faLemon,\n faLifeRing: faLifeRing,\n faLightbulb: faLightbulb,\n faListAlt: faListAlt,\n faMap: faMap,\n faMeh: faMeh,\n faMehBlank: faMehBlank,\n faMehRollingEyes: faMehRollingEyes,\n faMinusSquare: faMinusSquare,\n faMoneyBillAlt: faMoneyBillAlt,\n faMoon: faMoon,\n faNewspaper: faNewspaper,\n faObjectGroup: faObjectGroup,\n faObjectUngroup: faObjectUngroup,\n faPaperPlane: faPaperPlane,\n faPauseCircle: faPauseCircle,\n faPlayCircle: faPlayCircle,\n faPlusSquare: faPlusSquare,\n faQuestionCircle: faQuestionCircle,\n faRegistered: faRegistered,\n faSadCry: faSadCry,\n faSadTear: faSadTear,\n faSave: faSave,\n faShareSquare: faShareSquare,\n faSmile: faSmile,\n faSmileBeam: faSmileBeam,\n faSmileWink: faSmileWink,\n faSnowflake: faSnowflake,\n faSquare: faSquare,\n faStar: faStar,\n faStarHalf: faStarHalf,\n faStickyNote: faStickyNote,\n faStopCircle: faStopCircle,\n faSun: faSun,\n faSurprise: faSurprise,\n faThumbsDown: faThumbsDown,\n faThumbsUp: faThumbsUp,\n faTimesCircle: faTimesCircle,\n faTired: faTired,\n faTrashAlt: faTrashAlt,\n faUser: faUser,\n faUserCircle: faUserCircle,\n faWindowClose: faWindowClose,\n faWindowMaximize: faWindowMaximize,\n faWindowMinimize: faWindowMinimize,\n faWindowRestore: faWindowRestore\n};\n\nexport { _iconsCache as far, prefix, faAddressBook, faAddressCard, faAngry, faArrowAltCircleDown, faArrowAltCircleLeft, faArrowAltCircleRight, faArrowAltCircleUp, faBell, faBellSlash, faBookmark, faBuilding, faCalendar, faCalendarAlt, faCalendarCheck, faCalendarMinus, faCalendarPlus, faCalendarTimes, faCaretSquareDown, faCaretSquareLeft, faCaretSquareRight, faCaretSquareUp, faChartBar, faCheckCircle, faCheckSquare, faCircle, faClipboard, faClock, faClone, faClosedCaptioning, faComment, faCommentAlt, faCommentDots, faComments, faCompass, faCopy, faCopyright, faCreditCard, faDizzy, faDotCircle, faEdit, faEnvelope, faEnvelopeOpen, faEye, faEyeSlash, faFile, faFileAlt, faFileArchive, faFileAudio, faFileCode, faFileExcel, faFileImage, faFilePdf, faFilePowerpoint, faFileVideo, faFileWord, faFlag, faFlushed, faFolder, faFolderOpen, faFontAwesomeLogoFull, faFrown, faFrownOpen, faFutbol, faGem, faGrimace, faGrin, faGrinAlt, faGrinBeam, faGrinBeamSweat, faGrinHearts, faGrinSquint, faGrinSquintTears, faGrinStars, faGrinTears, faGrinTongue, faGrinTongueSquint, faGrinTongueWink, faGrinWink, faHandLizard, faHandPaper, faHandPeace, faHandPointDown, faHandPointLeft, faHandPointRight, faHandPointUp, faHandPointer, faHandRock, faHandScissors, faHandSpock, faHandshake, faHdd, faHeart, faHospital, faHourglass, faIdBadge, faIdCard, faImage, faImages, faKeyboard, faKiss, faKissBeam, faKissWinkHeart, faLaugh, faLaughBeam, faLaughSquint, faLaughWink, faLemon, faLifeRing, faLightbulb, faListAlt, faMap, faMeh, faMehBlank, faMehRollingEyes, faMinusSquare, faMoneyBillAlt, faMoon, faNewspaper, faObjectGroup, faObjectUngroup, faPaperPlane, faPauseCircle, faPlayCircle, faPlusSquare, faQuestionCircle, faRegistered, faSadCry, faSadTear, faSave, faShareSquare, faSmile, faSmileBeam, faSmileWink, faSnowflake, faSquare, faStar, faStarHalf, faStickyNote, faStopCircle, faSun, faSurprise, faThumbsDown, faThumbsUp, faTimesCircle, faTired, faTrashAlt, faUser, faUserCircle, faWindowClose, faWindowMaximize, faWindowMinimize, faWindowRestore };\n","import React, {Component} from 'react'; // eslint-disable-line no-unused-vars\nimport PropTypes from 'prop-types';\nimport {FontAwesomeIcon} from '@fortawesome/react-fontawesome';\nimport {faCopy, faCheckCircle} from '@fortawesome/free-regular-svg-icons';\n\nimport LoadingElement from '../utils/LoadingElement';\n\nconst clipboardAPI = navigator.clipboard;\n\nfunction wait(ms) {\n return new Promise(r => setTimeout(r, ms));\n}\n\n/**\n * The Clipboard component copies text to the clipboard\n */\n\nexport default class Clipboard extends React.Component {\n static contextType = window.dash_component_api.DashContext;\n\n constructor(props) {\n super(props);\n this.copyToClipboard = this.copyToClipboard.bind(this);\n this.onClickHandler = this.onClickHandler.bind(this);\n this.copySuccess = this.copySuccess.bind(this);\n this.getTargetText = this.getTargetText.bind(this);\n this.loading = this.loading.bind(this);\n this.stringifyId = this.stringifyId.bind(this);\n this.state = {\n copied: false,\n };\n }\n\n onClickHandler() {\n this.props.setProps({n_clicks: this.props.n_clicks + 1});\n }\n\n componentDidUpdate(prevProps) {\n // If the clicks has not changed, do nothing\n if (\n !this.props.n_clicks ||\n this.props.n_clicks === prevProps.n_clicks\n ) {\n return;\n }\n // If the clicks has changed, copy to clipboard\n this.copyToClipboard();\n }\n\n // stringifies object ids used in pattern matching callbacks\n stringifyId(id) {\n if (typeof id !== 'object') {\n return id;\n }\n const stringifyVal = v => (v && v.wild) || JSON.stringify(v);\n const parts = Object.keys(id)\n .sort()\n .map(k => JSON.stringify(k) + ':' + stringifyVal(id[k]));\n return '{' + parts.join(',') + '}';\n }\n\n async copySuccess(content, htmlContent) {\n const showCopiedIcon = 1000;\n if (htmlContent) {\n const blobHtml = new Blob([htmlContent], {type: 'text/html'});\n const blobText = new Blob([content ?? htmlContent], {\n type: 'text/plain',\n });\n const data = [\n new ClipboardItem({\n ['text/plain']: blobText,\n ['text/html']: blobHtml,\n }),\n ];\n await navigator.clipboard.write(data);\n } else {\n await clipboardAPI.writeText(content);\n }\n this.setState({copied: true});\n await wait(showCopiedIcon);\n this.setState({copied: false});\n }\n\n getTargetText() {\n // get the inner text. If none, use the content of the value param\n const id = this.stringifyId(this.props.target_id);\n const target = document.getElementById(id);\n if (!target) {\n throw new Error(\n 'Clipboard copy failed: no element found for target_id ' +\n this.props.target_id\n );\n }\n let content = target.innerText;\n if (!content) {\n content = target.value;\n content = content === undefined ? null : content;\n }\n return content;\n }\n\n async loading() {\n while (this.context.isLoading()) {\n await wait(100);\n }\n }\n\n async copyToClipboard() {\n let content;\n let htmlContent;\n if (this.props.target_id) {\n content = this.getTargetText();\n } else {\n await wait(100); // gives time for callback to start\n await this.loading();\n content = this.props.content;\n htmlContent = this.props.html_content;\n }\n if (content || htmlContent) {\n this.copySuccess(content, htmlContent);\n }\n }\n\n componentDidMount() {\n if (!clipboardAPI) {\n console.warn('Copy to clipboard not available with this browser'); // eslint-disable-line no-console\n }\n }\n\n render() {\n const {id, title, className, style, children, copied_children} =\n this.props;\n\n const isCopied = this.state.copied;\n\n const button_children = isCopied\n ? copied_children ?? \n : children ?? ;\n\n return clipboardAPI ? (\n \n {button_children}\n \n ) : null;\n }\n}\n\nClipboard.defaultProps = {\n content: null,\n html_content: null,\n target_id: null,\n n_clicks: 0,\n};\n\nClipboard.propTypes = {\n /**\n * The ID used to identify this component.\n */\n id: PropTypes.string,\n\n /**\n * Children rendered inside the Clipboard button before copying. By default, a copy icon.\n */\n children: PropTypes.node,\n\n /**\n * Children rendered inside the Clipboard button after the value has been copied. By default, a check icon.\n */\n copied_children: PropTypes.node,\n\n /**\n * The id of target component containing text to copy to the clipboard.\n * The inner text of the `children` prop will be copied to the clipboard. If none, then the text from the\n * `value` prop will be copied.\n */\n target_id: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\n\n /**\n * The text to be copied to the clipboard if the `target_id` is None.\n */\n content: PropTypes.string,\n\n /**\n * The number of times Clipboard button was clicked\n */\n n_clicks: PropTypes.number,\n\n /**\n * The clipboard html text be copied to the clipboard if the `target_id` is None.\n */\n html_content: PropTypes.string,\n\n /**\n * The text shown as a tooltip when hovering over the copy icon.\n */\n title: PropTypes.string,\n\n /**\n * The icon's styles\n */\n style: PropTypes.object,\n\n /**\n * The class name of the icon element\n */\n className: PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the value changes.\n */\n setProps: PropTypes.func,\n};\n","import PropTypes from 'prop-types';\nimport {Component} from 'react';\n\n/**\n * ConfirmDialog is used to display the browser's native \"confirm\" modal,\n * with an optional message and two buttons (\"OK\" and \"Cancel\").\n * This ConfirmDialog can be used in conjunction with buttons when the user\n * is performing an action that should require an extra step of verification.\n */\nexport default class ConfirmDialog extends Component {\n componentDidUpdate(prevProps) {\n this._update(!prevProps.displayed && this.props.displayed);\n }\n\n componentDidMount() {\n this._update(this.props.displayed);\n }\n\n _update(shouldTriggerDisplay) {\n const {message, setProps, cancel_n_clicks, submit_n_clicks} =\n this.props;\n\n if (shouldTriggerDisplay) {\n new Promise(resolve => resolve(window.confirm(message))).then(\n result => {\n if (result) {\n setProps({\n submit_n_clicks: submit_n_clicks + 1,\n submit_n_clicks_timestamp: Date.now(),\n displayed: false,\n });\n } else {\n setProps({\n cancel_n_clicks: cancel_n_clicks + 1,\n cancel_n_clicks_timestamp: Date.now(),\n displayed: false,\n });\n }\n }\n );\n }\n }\n\n render() {\n return null;\n }\n}\n\nConfirmDialog.defaultProps = {\n submit_n_clicks: 0,\n submit_n_clicks_timestamp: -1,\n cancel_n_clicks: 0,\n cancel_n_clicks_timestamp: -1,\n};\n\nConfirmDialog.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n id: PropTypes.string,\n\n /**\n * Message to show in the popup.\n */\n message: PropTypes.string,\n /**\n * Number of times the submit button was clicked\n */\n submit_n_clicks: PropTypes.number,\n /**\n * Last time the submit button was clicked.\n */\n submit_n_clicks_timestamp: PropTypes.number,\n /**\n * Number of times the popup was canceled.\n */\n cancel_n_clicks: PropTypes.number,\n /**\n * Last time the cancel button was clicked.\n */\n cancel_n_clicks_timestamp: PropTypes.number,\n /**\n * Set to true to send the ConfirmDialog.\n */\n displayed: PropTypes.bool,\n\n /**\n * Dash-assigned callback that gets fired when the value changes.\n */\n setProps: PropTypes.func,\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport ConfirmDialog from './ConfirmDialog.react';\nimport LoadingElement from '../utils/LoadingElement';\n\n/**\n * A wrapper component that will display a confirmation dialog\n * when its child component has been clicked on.\n *\n * For example:\n * ```\n * dcc.ConfirmDialogProvider(\n * html.Button('click me', id='btn'),\n * message='Danger - Are you sure you want to continue.'\n * id='confirm')\n * ```\n */\nexport default class ConfirmDialogProvider extends React.Component {\n render() {\n const {displayed, id, setProps, children} = this.props;\n\n // Will lose the previous onClick of the child\n const wrapClick = child =>\n React.cloneElement(child, {\n onClick: () => setProps({displayed: true}),\n });\n\n return (\n \n {Array.isArray(children)\n ? children.map(wrapClick)\n : wrapClick(children)}\n \n \n );\n }\n}\n\nConfirmDialogProvider.defaultProps = {\n submit_n_clicks: 0,\n submit_n_clicks_timestamp: -1,\n cancel_n_clicks: 0,\n cancel_n_clicks_timestamp: -1,\n};\n\nConfirmDialogProvider.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n id: PropTypes.string,\n\n /**\n * Message to show in the popup.\n */\n message: PropTypes.string,\n /**\n * Number of times the submit was clicked\n */\n submit_n_clicks: PropTypes.number,\n /**\n * Last time the submit button was clicked.\n */\n submit_n_clicks_timestamp: PropTypes.number,\n /**\n * Number of times the popup was canceled.\n */\n cancel_n_clicks: PropTypes.number,\n /**\n * Last time the cancel button was clicked.\n */\n cancel_n_clicks_timestamp: PropTypes.number,\n /**\n * Is the modal currently displayed.\n */\n displayed: PropTypes.bool,\n\n /**\n * Dash-assigned callback that gets fired when the value changes.\n */\n setProps: PropTypes.func,\n /**\n * The children to hijack clicks from and display the popup.\n */\n children: PropTypes.any,\n};\n","export default () =>\n import(\n /* webpackChunkName: \"datepicker\" */ '../../fragments/DatePickerRange'\n );\n","import {format, startOfDay, parseISO} from 'date-fns';\nimport {isNil} from 'ramda';\n\nexport default {\n extract: (propValue?: string) => {\n if (isNil(propValue)) {\n return propValue;\n }\n\n const parsed = parseISO(propValue);\n return format(startOfDay(parsed), 'yyyy-MM-dd');\n },\n apply: (storedValue?: string) => storedValue,\n};\n","import React, {lazy, Suspense} from 'react';\nimport datePickerRange from '../utils/LazyLoader/datePickerRange';\nimport transformDate from '../utils/DatePickerPersistence';\nimport {DatePickerRangeProps, PersistedProps, PersistenceTypes} from '../types';\n\nconst RealDatePickerRange = lazy(datePickerRange);\n\n/**\n * DatePickerRange is designed for selecting a timespan across multiple days off\n * of a calendar.\n *\n * The DatePicker integrates well with the Python datetime module with the\n * startDate and endDate being returned in a string format suitable for\n * creating datetime objects.\n *\n */\nexport default function DatePickerRange({\n calendar_orientation = 'horizontal',\n is_RTL = false,\n // eslint-disable-next-line no-magic-numbers\n day_size = 34,\n with_portal = false,\n with_full_screen_portal = false,\n first_day_of_week = 0,\n number_of_months_shown = 2,\n stay_open_on_select = false,\n reopen_calendar_on_clear = false,\n show_outside_days = false,\n clearable = false,\n disabled = false,\n updatemode = 'singledate',\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persisted_props = [PersistedProps.start_date, PersistedProps.end_date],\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persistence_type = PersistenceTypes.local,\n disabled_days = [],\n ...props\n}: DatePickerRangeProps) {\n return (\n \n \n \n );\n}\n\nDatePickerRange.dashPersistence = {\n persisted_props: [PersistedProps.start_date, PersistedProps.end_date],\n persistence_type: PersistenceTypes.local,\n};\n\nDatePickerRange.persistenceTransforms = {\n end_date: transformDate,\n start_date: transformDate,\n};\n","export default () =>\n import(\n /* webpackChunkName: \"datepicker\" */ '../../fragments/DatePickerSingle'\n );\n","import React, {lazy, Suspense} from 'react';\nimport datePickerSingle from '../utils/LazyLoader/datePickerSingle';\nimport transformDate from '../utils/DatePickerPersistence';\nimport {\n DatePickerSingleProps,\n PersistedProps,\n PersistenceTypes,\n} from '../types';\n\nconst RealDatePickerSingle = lazy(datePickerSingle);\n\n/**\n * DatePickerSingle is a tailor made component designed for selecting\n * a single day off of a calendar.\n *\n * The DatePicker integrates well with the Python datetime module with the\n * startDate and endDate being returned in a string format suitable for\n * creating datetime objects.\n */\nexport default function DatePickerSingle({\n placeholder = 'Select Date',\n calendar_orientation = 'horizontal',\n is_RTL = false,\n // eslint-disable-next-line no-magic-numbers\n day_size = 34,\n with_portal = false,\n with_full_screen_portal = false,\n show_outside_days = true,\n first_day_of_week = 0,\n number_of_months_shown = 1,\n stay_open_on_select = false,\n reopen_calendar_on_clear = false,\n clearable = false,\n disabled = false,\n disabled_days = [],\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persisted_props = [PersistedProps.date],\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persistence_type = PersistenceTypes.local,\n ...props\n}: DatePickerSingleProps) {\n return (\n \n \n \n );\n}\n\nDatePickerSingle.dashPersistence = {\n persisted_props: [PersistedProps.date],\n persistence_type: PersistenceTypes.local,\n};\n\nDatePickerSingle.persistenceTransforms = {\n date: transformDate,\n};\n","import PropTypes from 'prop-types';\nimport {Component} from 'react';\nimport {toByteArray} from 'base64-js';\nimport {saveAs} from 'file-saver';\n\nconst getValue = (src, fallback, key) =>\n key in src ? src[key] : fallback[key];\n\n/**\n * The Download component opens a download dialog when the data property changes.\n */\nexport default class Download extends Component {\n componentDidUpdate(prevProps) {\n const {data} = this.props;\n // If the data hasn't changed, do nothing.\n if (!data || data === prevProps.data) {\n return;\n }\n // Extract options from data if provided, fallback to props.\n const type = getValue(data, this.props, 'type');\n const base64 = getValue(data, this.props, 'base64');\n // Invoke the download using a Blob.\n const content = base64 ? toByteArray(data.content) : data.content;\n const blob = new Blob([content], {type: type});\n saveAs(blob, data.filename);\n }\n\n render() {\n return null;\n }\n}\n\nDownload.propTypes = {\n /**\n * The ID of this component, used to identify dash components in callbacks.\n */\n id: PropTypes.string,\n\n /**\n * On change, a download is invoked.\n */\n data: PropTypes.exact({\n /**\n * Suggested filename in the download dialogue.\n */\n filename: PropTypes.string.isRequired,\n /**\n * File content.\n */\n content: PropTypes.string.isRequired,\n /**\n * Set to true, when data is base64 encoded.\n */\n base64: PropTypes.bool,\n /**\n * Blob type, usually a MIME-type.\n */\n type: PropTypes.string,\n }),\n\n /**\n * Default value for base64, used when not set as part of the data property.\n */\n base64: PropTypes.bool,\n\n /**\n * Default value for type, used when not set as part of the data property.\n */\n type: PropTypes.string,\n\n /**\n * Dash-supplied function for updating props.\n */\n setProps: PropTypes.func,\n};\n\nDownload.defaultProps = {\n type: 'text/plain',\n base64: false,\n};\n","import {Component} from 'react';\nimport PropTypes from 'prop-types';\n\n/**\n * The CurrentLocation component gets geolocation of the device from the web browser. See more info here:\n * https://developer.mozilla.org/en-US/docs/Web/API/Geolocation_API\n */\n\nexport default class Geolocation extends Component {\n constructor(props) {\n super(props);\n this.success = this.success.bind(this);\n this.error = this.error.bind(this);\n }\n updatePosition() {\n if (this.props.update_now) {\n this.props.setProps({\n update_now: false,\n });\n }\n if (!navigator.geolocation) {\n this.error({\n code: 999,\n message: 'Your browser does not support Geolocation',\n });\n } else {\n const positionOptions = {\n enableHighAccuracy: this.props.high_accuracy,\n maximumAge: this.props.maximum_age,\n timeout: this.props.timeout,\n };\n\n navigator.geolocation.getCurrentPosition(\n this.success,\n this.error,\n positionOptions\n );\n }\n }\n\n componentDidMount() {\n this.updatePosition();\n }\n\n componentDidUpdate(prevProps) {\n if (\n this.props.update_now ||\n prevProps.maximum_age !== this.props.maximum_age ||\n prevProps.timeout !== this.props.timeout ||\n prevProps.high_accuracy !== this.props.high_accuracy\n ) {\n this.updatePosition();\n }\n }\n\n success(pos) {\n const crd = pos.coords;\n const position_obj = {\n lat: crd.latitude ?? null,\n lon: crd.longitude ?? null,\n accuracy: crd.accuracy ?? null,\n alt: crd.altitude ?? null,\n alt_accuracy: crd.altitudeAccuracy ?? null,\n speed: crd.speed ?? null,\n heading: crd.heading ?? null,\n };\n\n this.props.setProps({\n local_date: new Date(pos.timestamp).toLocaleString(),\n timestamp: pos.timestamp,\n position: position_obj,\n position_error: null,\n });\n }\n\n error(err) {\n if (this.props.show_alert) {\n alert(`ERROR(${err.code}): ${err.message}`);\n }\n this.props.setProps({\n position: null,\n position_error: {\n code: err.code,\n message: err.message,\n },\n });\n }\n\n render() {\n return null;\n }\n}\n\nGeolocation.defaultProps = {\n update_now: false,\n high_accuracy: false,\n position_error: null,\n maximum_age: 0,\n timeout: Infinity,\n show_alert: false,\n};\n\nGeolocation.propTypes = {\n /**\n * The ID used to identify this component in Dash callbacks.\n */\n id: PropTypes.string,\n\n /**\n * The local date and time when the device position was updated.\n * Format: MM/DD/YYYY, hh:mm:ss p where p is AM or PM\n */\n local_date: PropTypes.string,\n\n /**\n * The Unix timestamp from when the position was updated\n */\n timestamp: PropTypes.number,\n\n /**\n * The position of the device. `lat`, `lon`, and `accuracy` will always be returned. The other data will be included\n * when available, otherwise it will be NaN.\n *\n * `lat` is latitude in degrees.\n * `lon` is longitude in degrees.\n * `accuracy` is the accuracy of the lat/lon in meters. *\n *\n * `alt` is altitude above mean sea level in meters.\n * `alt_accuracy` is the accuracy of the altitude in meters.\n * `heading` is the compass heading in degrees.\n * `speed` is the speed in meters per second.\n *\n */\n position: PropTypes.shape({\n lat: PropTypes.number,\n lon: PropTypes.number,\n accuracy: PropTypes.number,\n alt: PropTypes.number,\n alt_accuracy: PropTypes.number,\n heading: PropTypes.number,\n speed: PropTypes.number,\n }),\n\n /**\n * Position error\n */\n position_error: PropTypes.shape({\n code: PropTypes.number,\n message: PropTypes.string,\n }),\n\n /**\n * If true, error messages will be displayed as an alert\n */\n show_alert: PropTypes.bool,\n\n /**\n * Forces a one-time update of the position data. If set to True in a callback, the browser\n * will update the position data and reset update_now back to False. This can, for example, be used to update the\n * position with a button or an interval timer.\n */\n update_now: PropTypes.bool,\n\n /**\n * If true and if the device is able to provide a more accurate position,\n * it will do so. Note that this can result in slower response times or increased power consumption (with a GPS\n * chip on a mobile device for example). If false (the default value), the device can save resources by\n * responding more quickly and/or using less power.\n */\n high_accuracy: PropTypes.bool,\n\n /**\n * The maximum age in milliseconds of a possible cached position that is acceptable to return. If set to 0,\n * it means that the device cannot use a cached position and must attempt to retrieve the real current position.\n * If set to Infinity the device must return a cached position regardless of its age. Default: 0.\n */\n maximum_age: PropTypes.number,\n\n /**\n * The maximum length of time (in milliseconds) the device is allowed to take in order to return a position.\n * The default value is Infinity, meaning that data will not be return until the position is available.\n */\n timeout: PropTypes.number,\n\n /**\n * Dash-assigned callback that should be called to report property changes\n * to Dash, to make them available for callbacks.\n */\n setProps: PropTypes.func,\n};\n","import PropTypes from 'prop-types';\nimport React, {Component} from 'react'; // eslint-disable-line no-unused-vars\n\n/**\n * A component that repeatedly increments a counter `n_intervals`\n * with a fixed time delay between each increment.\n * Interval is good for triggering a component on a recurring basis.\n * The time delay is set with the property \"interval\" in milliseconds.\n */\nexport default class Interval extends Component {\n constructor(props) {\n super(props);\n this.intervalId = null;\n this.reportInterval = this.reportInterval.bind(this);\n this.handleTimer = this.handleTimer.bind(this);\n }\n\n handleTimer(props) {\n // Check if timer should stop or shouldn't even start\n if (\n props.max_intervals === 0 ||\n props.disabled ||\n (props.n_intervals >= props.max_intervals &&\n props.max_intervals !== -1)\n ) {\n // stop existing timer\n if (this.intervalId) {\n this.clearTimer();\n }\n // and don't start a timer\n return;\n }\n\n // keep the existing timer running\n if (this.intervalId) {\n return;\n }\n\n // it hasn't started yet (& it should start)\n this.intervalId = window.setInterval(\n this.reportInterval,\n props.interval\n );\n }\n\n resetTimer(props) {\n this.clearTimer();\n this.handleTimer(props);\n }\n\n clearTimer() {\n window.clearInterval(this.intervalId);\n this.intervalId = null;\n }\n\n reportInterval() {\n const {setProps, n_intervals} = this.props;\n setProps({n_intervals: n_intervals + 1});\n }\n\n componentDidMount() {\n this.handleTimer(this.props);\n }\n\n UNSAFE_componentWillReceiveProps(nextProps) {\n if (nextProps.interval !== this.props.interval) {\n this.resetTimer(nextProps);\n } else {\n this.handleTimer(nextProps);\n }\n }\n\n componentWillUnmount() {\n this.clearTimer();\n }\n\n render() {\n return null;\n }\n}\n\nInterval.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n id: PropTypes.string,\n /**\n * This component will increment the counter `n_intervals` every\n * `interval` milliseconds\n */\n interval: PropTypes.number,\n\n /**\n * If True, the counter will no longer update\n */\n disabled: PropTypes.bool,\n\n /**\n * Number of times the interval has passed\n */\n n_intervals: PropTypes.number,\n\n /**\n * Number of times the interval will be fired.\n * If -1, then the interval has no limit (the default)\n * and if 0 then the interval stops running.\n */\n max_intervals: PropTypes.number,\n\n /**\n * Dash assigned callback\n */\n setProps: PropTypes.func,\n};\n\nInterval.defaultProps = {\n interval: 1000,\n n_intervals: 0,\n max_intervals: -1,\n};\n","import _has from \"./_has.js\";\nexport default function _toPairs(obj) {\n var pairs = [];\n for (var prop in obj) {\n if (_has(prop, obj)) {\n pairs[pairs.length] = [prop, obj[prop]];\n }\n }\n return pairs;\n}","import _curry1 from \"./internal/_curry1.js\";\nimport _toPairs from \"./internal/_toPairs.js\";\n\n/**\n * Converts an object into an array of key, value arrays. Only the object's\n * own properties are used.\n * Note that the order of the output array is not guaranteed to be consistent\n * across different JS platforms.\n *\n * @func\n * @memberOf R\n * @since v0.4.0\n * @category Object\n * @sig {String: *} -> [[String,*]]\n * @param {Object} obj The object to extract from\n * @return {Array} An array of key, value arrays from the object's own properties.\n * @see R.fromPairs, R.keys, R.values\n * @example\n *\n * R.toPairs({a: 1, b: 2, c: 3}); //=> [['a', 1], ['b', 2], ['c', 3]]\n */\nvar toPairs = /*#__PURE__*/_curry1(_toPairs);\nexport default toPairs;","import _reduced from \"./_reduced.js\";\nimport _xfBase from \"./_xfBase.js\";\nvar XAny = /*#__PURE__*/function () {\n function XAny(f, xf) {\n this.xf = xf;\n this.f = f;\n this.any = false;\n }\n XAny.prototype['@@transducer/init'] = _xfBase.init;\n XAny.prototype['@@transducer/result'] = function (result) {\n if (!this.any) {\n result = this.xf['@@transducer/step'](result, false);\n }\n return this.xf['@@transducer/result'](result);\n };\n XAny.prototype['@@transducer/step'] = function (result, input) {\n if (this.f(input)) {\n this.any = true;\n result = _reduced(this.xf['@@transducer/step'](result, true));\n }\n return result;\n };\n return XAny;\n}();\nexport default function _xany(f) {\n return function (xf) {\n return new XAny(f, xf);\n };\n}","export default function _reduced(x) {\n return x && x['@@transducer/reduced'] ? x : {\n '@@transducer/value': x,\n '@@transducer/reduced': true\n };\n}","import _curry2 from \"./internal/_curry2.js\";\nimport _dispatchable from \"./internal/_dispatchable.js\";\nimport _xany from \"./internal/_xany.js\";\n\n/**\n * Returns `true` if at least one of the elements of the list match the predicate,\n * `false` otherwise.\n *\n * Dispatches to the `any` method of the second argument, if present.\n *\n * Acts as a transducer if a transformer is given in list position.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig (a -> Boolean) -> [a] -> Boolean\n * @param {Function} fn The predicate function.\n * @param {Array} list The array to consider.\n * @return {Boolean} `true` if the predicate is satisfied by at least one element, `false`\n * otherwise.\n * @see R.all, R.none, R.transduce\n * @example\n *\n * const lessThan0 = R.flip(R.lt)(0);\n * const lessThan2 = R.flip(R.lt)(2);\n * R.any(lessThan0)([1, 2]); //=> false\n * R.any(lessThan2)([1, 2]); //=> true\n */\nvar any = /*#__PURE__*/_curry2( /*#__PURE__*/_dispatchable(['any'], _xany, function any(fn, list) {\n var idx = 0;\n while (idx < list.length) {\n if (fn(list[idx])) {\n return true;\n }\n idx += 1;\n }\n return false;\n}));\nexport default any;","import React from 'react';\nimport {DebugTitleProps} from '../types';\n\nexport default function DebugTitle({id, property}: DebugTitleProps) {\n return (\n

\n Loading #{id}\n 's {property}\n

\n );\n}\n","import React, {useState, useRef, useMemo, useEffect} from 'react';\nimport {equals, concat, includes, toPairs, any} from 'ramda';\n\nimport GraphSpinner from '../fragments/Loading/spinners/GraphSpinner';\nimport DefaultSpinner from '../fragments/Loading/spinners/DefaultSpinner';\nimport CubeSpinner from '../fragments/Loading/spinners/CubeSpinner';\nimport CircleSpinner from '../fragments/Loading/spinners/CircleSpinner';\nimport DotSpinner from '../fragments/Loading/spinners/DotSpinner';\nimport {LoadingProps} from 'src/types';\nimport {DebugTitleProps} from '../fragments/Loading/types';\nimport {DashLayoutPath} from '@dash-renderer/types/component';\n\nconst spinnerComponentOptions = {\n graph: GraphSpinner,\n cube: CubeSpinner,\n circle: CircleSpinner,\n dot: DotSpinner,\n default: DefaultSpinner,\n} as const;\n\nconst getSpinner = (spinnerType: keyof typeof spinnerComponentOptions) =>\n spinnerComponentOptions[spinnerType];\n\nconst coveringSpinner: React.CSSProperties = {\n visibility: 'visible',\n position: 'absolute',\n top: '0',\n height: '100%',\n width: '100%',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n};\n\ntype LoadingState = {\n loading: Record;\n};\n\nconst loadingSelector =\n (\n componentPath: DashLayoutPath,\n targetComponents?: Record\n ) =>\n (state: LoadingState): DebugTitleProps[] | null => {\n let stringPath = JSON.stringify(componentPath);\n // Remove the last ] for easy match and add `,` to make sure only children\n // trigger the loading. See issue: https://github.com/plotly/dash/issues/3276\n stringPath = stringPath.substring(0, stringPath.length - 1) + ',';\n const loadingChildren = toPairs(state.loading).reduce(\n (acc, [path, load]) => {\n if (path.startsWith(stringPath) && load.length) {\n if (\n targetComponents &&\n !any((l: DebugTitleProps) => {\n const target = targetComponents[l.id];\n if (!target) {\n return false;\n }\n if (target === '*') {\n return true;\n }\n if (Array.isArray(target)) {\n return includes(l.property, target);\n }\n return l.property === target;\n }, load)\n ) {\n return acc;\n }\n return concat(acc, load);\n }\n return acc;\n },\n [] as DebugTitleProps[]\n );\n if (loadingChildren.length) {\n return loadingChildren;\n }\n return null;\n };\n\nfunction Loading({\n children,\n display = 'auto',\n color = 'var(--Dash-Fill-Interactive-Strong)',\n id,\n className,\n style,\n parent_className,\n parent_style,\n overlay_style,\n fullscreen,\n debug,\n show_initially = true,\n type: spinnerType = 'default',\n delay_hide = 0,\n delay_show = 0,\n target_components,\n custom_spinner,\n}: LoadingProps) {\n const ctx = window.dash_component_api.useDashContext();\n\n const loading = ctx.useSelector(\n loadingSelector(ctx.componentPath, target_components),\n equals\n );\n\n const [showSpinner, setShowSpinner] = useState(show_initially);\n const dismissTimer = useRef();\n const showTimer = useRef();\n\n const containerStyle: React.CSSProperties = useMemo(() => {\n if (showSpinner) {\n return {visibility: 'hidden', ...overlay_style, ...parent_style};\n }\n return parent_style ?? {};\n }, [showSpinner, parent_style]);\n\n useEffect(() => {\n if (display === 'show' || display === 'hide') {\n setShowSpinner(display === 'show');\n return;\n }\n\n if (loading) {\n // if component is currently loading and there's a dismiss timer active\n // we need to clear it.\n if (dismissTimer.current) {\n dismissTimer.current = window.clearTimeout(\n dismissTimer.current\n );\n }\n // if component is currently loading but the spinner is not showing and\n // there is no timer set to show, then set a timeout to show\n if (!showSpinner && !showTimer.current) {\n showTimer.current = window.setTimeout(() => {\n setShowSpinner(true);\n showTimer.current = undefined;\n }, delay_show);\n }\n } else {\n // if component is not currently loading and there's a show timer\n // active we need to clear it\n if (showTimer.current) {\n showTimer.current = window.clearTimeout(showTimer.current);\n }\n // if component is not currently loading and the spinner is showing and\n // there's no timer set to dismiss it, then set a timeout to hide it\n if (showSpinner && !dismissTimer.current) {\n dismissTimer.current = window.setTimeout(() => {\n setShowSpinner(false);\n dismissTimer.current = undefined;\n }, delay_hide);\n }\n }\n }, [delay_hide, delay_show, loading, display, showSpinner]);\n\n const Spinner = getSpinner(spinnerType);\n\n return (\n \n
\n {children}\n
\n
\n {showSpinner &&\n (custom_spinner || (\n \n ))}\n
\n \n );\n}\n\nexport default Loading;\n","import React from 'react';\nimport DebugTitle from './DebugTitle';\nimport {SpinnerProps} from '../types';\n\nconst GraphSpinner = ({\n status,\n fullscreen,\n debug,\n className,\n style,\n}: SpinnerProps) => {\n let debugTitle;\n if (debug && status) {\n debugTitle = status.map((s, i) => );\n }\n let spinnerClass = fullscreen ? 'dash-spinner-container' : '';\n if (className) {\n spinnerClass += ` ${className}`;\n }\n return (\n
\n
\n {debugTitle}\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n );\n};\n\nexport default GraphSpinner;\n","import React from 'react';\nimport DebugTitle from './DebugTitle';\nimport {SpinnerProps} from '../types';\n\nconst CubeSpinner = ({\n status,\n color,\n fullscreen,\n debug,\n className,\n style,\n}: SpinnerProps) => {\n let debugTitle;\n if (debug && status) {\n debugTitle = status.map((s, i) => );\n }\n let spinnerClass = fullscreen ? 'dash-spinner-container' : '';\n if (className) {\n spinnerClass += ` ${className}`;\n }\n /* eslint-disable no-magic-numbers */\n return (\n
\n {debugTitle}\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n );\n};\n\nexport default CubeSpinner;\n","import React from 'react';\nimport DebugTitle from './DebugTitle';\nimport {SpinnerProps} from '../types';\n\n/**\n * Spinner created by Tobias Ahlin, https://github.com/tobiasahlin/SpinKit\n */\nconst CircleSpinner = ({\n status,\n color,\n fullscreen,\n debug,\n className,\n style,\n}: SpinnerProps) => {\n let debugTitle;\n if (debug && status) {\n debugTitle = status.map((s, i) => );\n }\n let spinnerClass = fullscreen ? 'dash-spinner-container' : '';\n if (className) {\n spinnerClass += ` ${className}`;\n }\n return (\n
\n {debugTitle}\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n );\n};\n\nexport default CircleSpinner;\n","import React from 'react';\nimport DebugTitle from './DebugTitle';\nimport {SpinnerProps} from '../types';\n\n/**\n * Spinner created by Tobias Ahlin, https://github.com/tobiasahlin/SpinKit\n */\nconst DotSpinner = ({\n status,\n color,\n fullscreen,\n debug,\n className,\n style,\n}: SpinnerProps) => {\n let debugTitle;\n if (debug && status) {\n debugTitle = status.map((s, i) => );\n }\n let spinnerClass = fullscreen ? 'dash-spinner-container' : '';\n if (className) {\n spinnerClass += ` ${className}`;\n }\n return (\n
\n {debugTitle}\n
\n
\n
\n
\n
\n \n
\n );\n};\n\nexport default DotSpinner;\n","import React from 'react';\nimport DebugTitle from './DebugTitle';\nimport {SpinnerProps} from '../types';\n\n/**\n * Spinner created by Tobias Ahlin, https://github.com/tobiasahlin/SpinKit\n */\nconst DefaultSpinner = ({\n status,\n color,\n fullscreen,\n debug,\n className,\n style,\n}: SpinnerProps) => {\n let debugTitle;\n if (debug && status) {\n debugTitle = status.map((s, i) => );\n }\n let spinnerClass = fullscreen ? 'dash-spinner-container' : '';\n if (className) {\n spinnerClass += ` ${className}`;\n }\n return (\n
\n {debugTitle}\n
\n
\n
\n
\n
\n
\n
\n \n
\n );\n};\n\nexport default DefaultSpinner;\n","import {Component} from 'react';\nimport PropTypes from 'prop-types';\nimport {type} from 'ramda';\n\nimport {History} from '@plotly/dash-component-plugins';\n\n/**\n * Update and track the current window.location object through the window.history state.\n * Use in conjunction with the `dash_core_components.Link` component to make apps with multiple pages.\n */\nexport default class Location extends Component {\n constructor(props) {\n super(props);\n this.updateLocation = this.updateLocation.bind(this);\n this.onLocationChange = this.onLocationChange.bind(this);\n }\n\n updateLocation(props) {\n const {hash, href, pathname, refresh, search, setProps} = props;\n\n // Keep track of props relating to window.location that may need to be updated via setProps\n const propsToSet = {};\n\n /**\n * Check if the field exists in props. If the prop with \"fieldName\" is not defined,\n * then it was not set by the user and needs to be equal to the value in window.location.\n * This only happens on page load (since props will no longer be undefined after componentDidMount).\n *\n * @param {string} fieldName\n * The name of the prop in window.location and in the component's prop\n *\n * @returns {boolean}\n * Returns true if the prop with fieldName is different and the window state needs to be updated\n */\n const checkExistsUpdateWindowLocation = fieldName => {\n const propVal = props[fieldName];\n\n if (\n (type(propVal) === 'Undefined' || propVal === null) &&\n type(window.location[fieldName]) !== 'Undefined'\n ) {\n // propVal is undefined or null, but window.location has this fieldName defined\n propsToSet[fieldName] = window.location[fieldName];\n } else if (propVal !== window.location[fieldName]) {\n // Prop has changed?\n if (refresh === true) {\n // Refresh the page?\n window.location[fieldName] = propVal;\n } else if (this.props[fieldName] !== propVal) {\n // If this prop has changed, need to setProps\n propsToSet[fieldName] = propVal;\n // This (`${fieldName}`: propVal) needs to be pushed in the window.history\n return true;\n }\n }\n // This (`${fieldName}`: propVal) DOES NOT need to be pushed in the window.history\n return false;\n };\n\n // Check if the prop value needs to be updated (note that this mutates propsToSet)\n const pathnameUpdated = checkExistsUpdateWindowLocation('pathname');\n const hrefUpdated = checkExistsUpdateWindowLocation('href');\n const hashUpdated = checkExistsUpdateWindowLocation('hash');\n const searchUpdated = checkExistsUpdateWindowLocation('search');\n\n // propsToSet has been updated -- batch update to Dash\n if (Object.keys(propsToSet).length > 0) {\n setProps(propsToSet);\n }\n\n // Special case -- overrides everything!\n if (hrefUpdated) {\n window.history.pushState({}, '', href);\n if (refresh === 'callback-nav') {\n window.dispatchEvent(new CustomEvent('_dashprivate_pushstate'));\n }\n } else if (pathnameUpdated || hashUpdated || searchUpdated) {\n // Otherwise, we can mash everything together\n const searchVal = type(search) !== 'Undefined' ? search : '';\n const hashVal = type(hash) !== 'Undefined' ? hash : '';\n window.history.pushState(\n {},\n '',\n `${pathname}${searchVal}${hashVal}`\n );\n if (refresh === 'callback-nav') {\n window.dispatchEvent(new CustomEvent('_dashprivate_pushstate'));\n }\n }\n }\n\n onLocationChange() {\n const {setProps} = this.props;\n const propsToChange = {};\n\n if (this.props.pathname !== window.location.pathname) {\n propsToChange.pathname = window.location.pathname;\n }\n if (this.props.href !== window.location.href) {\n propsToChange.href = window.location.href;\n }\n if (this.props.hash !== window.location.hash) {\n propsToChange.hash = window.location.hash;\n }\n if (this.props.search !== window.location.search) {\n propsToChange.search = window.location.search;\n }\n\n setProps(propsToChange);\n\n History.dispatchChangeEvent();\n }\n\n componentDidMount() {\n window.addEventListener('popstate', this.onLocationChange);\n\n window.addEventListener(\n '_dashprivate_pushstate',\n this.onLocationChange\n );\n this.updateLocation(this.props);\n }\n\n componentWillUnmount() {\n window.removeEventListener('popstate', this.onLocationChange);\n window.removeEventListener(\n '_dashprivate_pushstate',\n this.onLocationChange\n );\n }\n\n UNSAFE_componentWillReceiveProps(nextProps) {\n this.updateLocation(nextProps);\n }\n\n render() {\n return null;\n }\n}\n\nLocation.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n id: PropTypes.string.isRequired,\n\n /** pathname in window.location - e.g., \"/my/full/pathname\" */\n pathname: PropTypes.string,\n /** search in window.location - e.g., \"?myargument=1\" */\n search: PropTypes.string,\n /** hash in window.location - e.g., \"#myhash\" */\n hash: PropTypes.string,\n /** href in window.location - e.g., \"/my/full/pathname?myargument=1#myhash\" */\n href: PropTypes.string,\n\n /**\n * Use `True` to navigate outside the Dash app or to manually refresh a page.\n * Use `False` if the same callback that updates the Location component is also\n * updating the page content - typically used in multi-page apps that do not use Pages.\n * Use 'callback-nav' if you are updating the URL in a callback, or a different\n * callback will respond to the new Location with updated content. This is\n * typical with multi-page apps that use Pages. This will allow for\n * navigating to a new page without refreshing the page.\n */\n refresh: PropTypes.oneOfType([\n PropTypes.oneOf(['callback-nav']),\n PropTypes.bool,\n ]),\n\n /**\n * Dash-assigned callback that gets fired when the value changes.\n */\n setProps: PropTypes.func,\n};\n\nLocation.defaultProps = {\n refresh: true,\n};\n","export default () =>\n import(/* webpackChunkName: \"markdown\" */ '../../fragments/Markdown');\n","import React, {lazy, Suspense, useEffect} from 'react';\nimport {MarkdownProps} from '../types';\nimport markdown from '../utils/LazyLoader/markdown';\nimport lazyLoadMathJax from '../utils/LazyLoader/third-party/mathjax';\n\nconst RealMarkdown = lazy(markdown);\n\n/**\n * A component that renders Markdown text as specified by the\n * GitHub Markdown spec. These component uses\n * [react-markdown](https://github.com/remarkjs/react-markdown) under the hood.\n */\nexport default function Markdown({\n mathjax = false,\n dangerously_allow_html = false,\n dedent = true,\n ...props\n}: MarkdownProps) {\n useEffect(() => {\n if (mathjax) {\n lazyLoadMathJax();\n }\n }, [mathjax]);\n\n return (\n \n \n \n );\n}\n","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n \n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./radioitems.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = function insertAtTop(element) {\n var parent = document.querySelector('head');\n // eslint-disable-next-line no-underscore-dangle\n var lastInsertedElement =\n window._lastElementInsertedByStyleLoader;\n\n if (!lastInsertedElement) {\n parent.insertBefore(element, parent.firstChild);\n } else if (lastInsertedElement.nextSibling) {\n parent.insertBefore(element, lastInsertedElement.nextSibling);\n } else {\n parent.appendChild(element);\n }\n\n // eslint-disable-next-line no-underscore-dangle\n window._lastElementInsertedByStyleLoader = element;\n };\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!./radioitems.css\";\n export default content && content.locals ? content.locals : undefined;\n","import React, {useMemo} from 'react';\nimport {RadioItemsProps, PersistedProps, PersistenceTypes} from '../types';\nimport './css/radioitems.css';\n\nimport {sanitizeOptions} from '../utils/optionTypes';\nimport LoadingElement from '../utils/_LoadingElement';\nimport {OptionsList} from '../utils/optionRendering';\nimport {isNil} from 'ramda';\n\n/**\n * RadioItems is a component that encapsulates several radio item inputs.\n * The values and labels of the RadioItems is specified in the `options`\n * property and the seleced item is specified with the `value` property.\n * Each radio item is rendered as an input with a surrounding label.\n */\nexport default function RadioItems({\n className,\n id,\n style,\n setProps,\n value,\n inputStyle = {},\n inputClassName = '',\n labelStyle = {},\n labelClassName = '',\n options = [],\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persisted_props = [PersistedProps.value],\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persistence_type = PersistenceTypes.local,\n inline = false,\n}: RadioItemsProps) {\n const sanitizedOptions = useMemo(() => {\n return sanitizeOptions(options).options;\n }, [options]);\n\n const stylingProps = {\n id,\n className: 'dash-radioitems ' + (className ?? ''),\n style,\n optionClassName: inline ? 'dash-radioitems-inline' : undefined,\n inputStyle,\n inputClassName,\n labelStyle,\n labelClassName,\n };\n\n return (\n \n {loadingProps => (\n {\n if (selection.length) {\n setProps({value: selection[selection.length - 1]});\n }\n }}\n {...stylingProps}\n />\n )}\n \n );\n}\n\nRadioItems.dashPersistence = {\n persisted_props: [PersistedProps.value],\n persistence_type: PersistenceTypes.local,\n};\n","export default () =>\n import(/* webpackChunkName: \"slider\" */ '../../fragments/RangeSlider');\n","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n \n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./sliders.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = function insertAtTop(element) {\n var parent = document.querySelector('head');\n // eslint-disable-next-line no-underscore-dangle\n var lastInsertedElement =\n window._lastElementInsertedByStyleLoader;\n\n if (!lastInsertedElement) {\n parent.insertBefore(element, parent.firstChild);\n } else if (lastInsertedElement.nextSibling) {\n parent.insertBefore(element, lastInsertedElement.nextSibling);\n } else {\n parent.appendChild(element);\n }\n\n // eslint-disable-next-line no-underscore-dangle\n window._lastElementInsertedByStyleLoader = element;\n };\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!./sliders.css\";\n export default content && content.locals ? content.locals : undefined;\n","import React, {lazy, Suspense} from 'react';\nimport {PersistedProps, PersistenceTypes, RangeSliderProps} from '../types';\nimport rangeSlider from '../utils/LazyLoader/rangeSlider';\n\nimport './css/sliders.css';\n\nconst RealRangeSlider = lazy(rangeSlider);\n\n/**\n * A double slider with two handles.\n * Used for specifying a range of numerical values.\n */\nexport default function RangeSlider({\n updatemode = 'mouseup',\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persisted_props = [PersistedProps.value],\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persistence_type = PersistenceTypes.local,\n // eslint-disable-next-line no-magic-numbers\n verticalHeight = 400,\n step = undefined,\n allow_direct_input = true,\n ...props\n}: RangeSliderProps) {\n // Some considerations for the default value of `step`:\n // If the range consists of integers, default to a value of `1`\n // Otherwise, leave it undefined\n if (\n typeof step === 'undefined' &&\n Number.isInteger(props.min) &&\n Number.isInteger(props.max)\n ) {\n step = 1;\n }\n\n return (\n \n \n \n );\n}\n\nRangeSlider.dashPersistence = {\n persisted_props: [PersistedProps.value],\n persistence_type: PersistenceTypes.local,\n};\n","import {omit} from 'ramda';\nimport React, {lazy, Suspense, useCallback, useMemo} from 'react';\nimport {\n PersistedProps,\n PersistenceTypes,\n RangeSliderProps,\n SliderProps,\n} from '../types';\nimport rangeSlider from '../utils/LazyLoader/rangeSlider';\nimport './css/sliders.css';\n\nconst RealSlider = lazy(rangeSlider);\n\n/**\n * A slider component with a single handle.\n */\nexport default function Slider({\n updatemode = 'mouseup',\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persisted_props = [PersistedProps.value],\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persistence_type = PersistenceTypes.local,\n // eslint-disable-next-line no-magic-numbers\n verticalHeight = 400,\n step = undefined,\n allow_direct_input = true,\n setProps,\n value,\n drag_value,\n ...props\n}: SliderProps) {\n // This is actually a wrapper around a RangeSlider.\n // We'll modify key `Slider` props to be compatible with a Range Slider.\n\n // Some considerations for the default value of `step`:\n // If the range consists of integers, default to a value of `1`\n // Otherwise, leave it undefined\n if (\n typeof step === 'undefined' &&\n Number.isInteger(props.min) &&\n Number.isInteger(props.max)\n ) {\n step = 1;\n }\n\n const mappedValue: RangeSliderProps['value'] = useMemo(() => {\n return typeof value === 'number' ? [value] : value;\n }, [value]);\n\n const mappedDragValue: RangeSliderProps['drag_value'] = useMemo(() => {\n return typeof drag_value === 'number' ? [drag_value] : drag_value;\n }, [drag_value]);\n\n const mappedSetProps: RangeSliderProps['setProps'] = useCallback(\n newProps => {\n const {value, drag_value} = newProps;\n const mappedProps: Partial = omit(\n ['value', 'drag_value', 'setProps'],\n newProps\n );\n if ('value' in newProps) {\n mappedProps.value = value ? value[0] : value;\n }\n if ('drag_value' in newProps) {\n mappedProps.drag_value = drag_value\n ? drag_value[0]\n : drag_value;\n }\n\n setProps(mappedProps);\n },\n [setProps]\n );\n\n return (\n \n \n \n );\n}\n\nSlider.dashPersistence = {\n persisted_props: [PersistedProps.value],\n persistence_type: PersistenceTypes.local,\n};\n","import {equals, isNil} from 'ramda';\nimport React from 'react';\nimport PropTypes from 'prop-types';\n\n/**\n * Abstraction for the memory storage_type to work the same way as local/session\n *\n * Each memory Store component get it's own MemStore.\n */\nclass MemStore {\n constructor() {\n this._data = {};\n this._modified = -1;\n }\n\n getItem(key) {\n return this._data[key];\n }\n\n setItem(key, value) {\n this._data[key] = value;\n this.setModified(key);\n }\n\n removeItem(key) {\n delete this._data[key];\n this.setModified(key);\n }\n\n // noinspection JSUnusedLocalSymbols\n setModified(_) {\n this._modified = Date.now();\n }\n\n // noinspection JSUnusedLocalSymbols\n getModified(_) {\n return this._modified;\n }\n}\n\n/**\n * Abstraction for local/session storage_type.\n *\n * Single instances for localStorage, sessionStorage\n */\nclass WebStore {\n constructor(storage) {\n this._storage = storage;\n }\n\n getItem(key) {\n try {\n return JSON.parse(this._storage.getItem(key));\n } catch (e) {\n // in case we somehow got a non-JSON value in storage,\n // just ignore it.\n return null;\n }\n }\n\n setItem(key, value) {\n this._storage.setItem(key, JSON.stringify(value));\n this.setModified(key);\n }\n\n removeItem(key) {\n this._storage.removeItem(key);\n this._storage.removeItem(`${key}-timestamp`);\n }\n\n setModified(key) {\n this._storage.setItem(`${key}-timestamp`, Date.now());\n }\n\n getModified(key) {\n return (\n Number.parseInt(this._storage.getItem(`${key}-timestamp`), 10) || -1\n );\n }\n}\n\n/**\n * Easily keep data on the client side with this component.\n * The data is not inserted in the DOM.\n * Data can be in memory, localStorage or sessionStorage.\n * The data will be kept with the id as key.\n */\nexport default class Store extends React.Component {\n constructor(props) {\n super(props);\n\n if (props.storage_type === 'local') {\n this._backstore = new WebStore(window.localStorage);\n } else if (props.storage_type === 'session') {\n this._backstore = new WebStore(window.sessionStorage);\n } else if (props.storage_type === 'memory') {\n this._backstore = new MemStore();\n }\n\n this.onStorageChange = this.onStorageChange.bind(this);\n }\n\n onStorageChange(e) {\n const {id, setProps} = this.props;\n if (e.key === id && setProps && e.newValue !== e.oldValue) {\n setProps({\n data: JSON.parse(e.newValue),\n modified_timestamp: this._backstore.getModified(id),\n });\n }\n }\n\n UNSAFE_componentWillMount() {\n const {setProps, id, data, storage_type} = this.props;\n if (storage_type !== 'memory') {\n window.addEventListener('storage', this.onStorageChange);\n }\n\n const old = this._backstore.getItem(id);\n if (isNil(old) && !isNil(data)) {\n // Initial data mount\n this._backstore.setItem(id, data);\n setProps({\n modified_timestamp: this._backstore.getModified(id),\n });\n return;\n }\n\n if (!equals(old, data)) {\n setProps({\n data: old,\n modified_timestamp: this._backstore.getModified(id),\n });\n }\n }\n\n componentWillUnmount() {\n if (this.props.storage_type !== 'memory') {\n window.removeEventListener('storage', this.onStorageChange);\n }\n }\n\n componentDidUpdate() {\n const {data, id, clear_data, setProps} = this.props;\n if (clear_data) {\n this._backstore.removeItem(id);\n setProps({\n clear_data: false,\n data: null,\n modified_timestamp: this._backstore.getModified(id),\n });\n return;\n }\n const old = this._backstore.getItem(id);\n // Only set the data if it's not the same data.\n // If the new data is undefined, we got here by overwriting the entire\n // component with a new copy that has no `data` specified - so pull back\n // out the old value.\n // Note: this still allows you to set data to null\n if (!equals(data, old)) {\n if (data === undefined) {\n setProps({data: old});\n } else {\n this._backstore.setItem(id, data);\n setProps({\n modified_timestamp: this._backstore.getModified(id),\n });\n }\n }\n }\n\n render() {\n return null;\n }\n}\n\nStore.defaultProps = {\n storage_type: 'memory',\n clear_data: false,\n modified_timestamp: -1,\n};\n\nStore.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n id: PropTypes.string.isRequired,\n\n /**\n * The type of the web storage.\n *\n * memory: only kept in memory, reset on page refresh.\n * local: window.localStorage, data is kept after the browser quit.\n * session: window.sessionStorage, data is cleared once the browser quit.\n */\n storage_type: PropTypes.oneOf(['local', 'session', 'memory']),\n\n /**\n * The stored data for the id.\n */\n data: PropTypes.oneOfType([\n PropTypes.object,\n PropTypes.array,\n PropTypes.number,\n PropTypes.string,\n PropTypes.bool,\n ]),\n\n /**\n * Set to true to remove the data contained in `data_key`.\n */\n clear_data: PropTypes.bool,\n\n /**\n * The last time the storage was modified.\n */\n modified_timestamp: PropTypes.number,\n\n /**\n * Dash-assigned callback that gets fired when the value changes.\n */\n setProps: PropTypes.func,\n};\n","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n \n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./tabs.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = function insertAtTop(element) {\n var parent = document.querySelector('head');\n // eslint-disable-next-line no-underscore-dangle\n var lastInsertedElement =\n window._lastElementInsertedByStyleLoader;\n\n if (!lastInsertedElement) {\n parent.insertBefore(element, parent.firstChild);\n } else if (lastInsertedElement.nextSibling) {\n parent.insertBefore(element, lastInsertedElement.nextSibling);\n } else {\n parent.appendChild(element);\n }\n\n // eslint-disable-next-line no-underscore-dangle\n window._lastElementInsertedByStyleLoader = element;\n };\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!./tabs.css\";\n export default content && content.locals ? content.locals : undefined;\n","import React from 'react';\nimport './css/tabs.css';\nimport {TabProps} from '../types';\n\n/**\n * Part of dcc.Tabs - this is the child Tab component used to render a tabbed page.\n * Its children will be set as the content of that tab, which if clicked will become visible.\n */\nfunction Tab({\n children,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n disabled = false,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n disabled_style = {color: 'var(--Dash-Text-Disabled)'},\n}: TabProps) {\n return <>{children};\n}\n\nexport default Tab;\n","import React, {useCallback, useEffect, useMemo, useRef, useState} from 'react';\nimport {has, isNil} from 'ramda';\n\nimport LoadingElement from '../utils/_LoadingElement';\nimport {PersistedProps, PersistenceTypes, TabProps, TabsProps} from '../types';\nimport './css/tabs.css';\nimport {DashComponent} from '@dash-renderer/types';\n\ninterface EnhancedTabProps extends TabProps {\n selected: boolean;\n componentPath?: (string | number)[];\n}\n\n// EnhancedTab is defined here instead of in Tab.tsx because if exported there,\n// it will mess up the Python imports and metadata.json\nconst EnhancedTab = ({\n id,\n label,\n selected,\n className,\n style,\n selected_className,\n selected_style,\n setProps: selectHandler,\n value,\n disabled = false,\n disabled_style = {color: 'var(--Dash-Text-Disabled)'},\n disabled_className,\n componentPath,\n}: EnhancedTabProps) => {\n const ExternalWrapper = window.dash_component_api.ExternalWrapper;\n const ctx = window.dash_component_api.useDashContext();\n componentPath = componentPath ?? ctx.componentPath;\n // We use the raw path here since it's up one level from\n // the tabs child.\n const isLoading = ctx.useLoading({rawPath: componentPath});\n const tabStyle = useMemo(() => {\n return {\n ...style,\n ...(disabled ? disabled_style : {}),\n ...(selected ? selected_style : {}),\n };\n }, [style, disabled, disabled_style, selected, selected_style]);\n\n const tabClassNames = useMemo(() => {\n let names = 'tab';\n if (disabled) {\n names += ' tab--disabled';\n if (disabled_className) {\n names += ` ${disabled_className}`;\n }\n }\n if (selected) {\n names += ' tab--selected';\n if (selected_className) {\n names += ` ${selected_className}`;\n }\n }\n if (className) {\n names += ` ${className}`;\n }\n return names;\n }, [className, disabled, disabled_className, selected, selected_className]);\n\n let labelDisplay;\n if (typeof label === 'object') {\n labelDisplay = (\n \n );\n } else {\n labelDisplay = {label};\n }\n\n return (\n {\n if (!disabled) {\n selectHandler({value});\n }\n }}\n >\n {labelDisplay}\n
\n );\n};\n\n/**\n * A Dash component that lets you render pages with tabs - the Tabs component's children\n * can be dcc.Tab components, which can hold a label that will be displayed as a tab, and can in turn hold\n * children components that will be that tab's content.\n */\nfunction Tabs({\n // eslint-disable-next-line no-magic-numbers\n mobile_breakpoint = 800,\n colors = {\n border: 'var(--Dash-Stroke-Weak)',\n primary: 'var(--Dash-Fill-Interactive-Strong)',\n background: 'var(--Dash-Fill-Interactive-Weak)',\n },\n vertical = false,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persisted_props = [PersistedProps.value],\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persistence_type = PersistenceTypes.local,\n children,\n ...props\n}: TabsProps) {\n const initializedRef = useRef(false);\n const [isAboveBreakpoint, setIsAboveBreakpoint] = useState(false);\n\n const parseChildrenToArray = useCallback((): DashComponent[] => {\n if (!children) {\n return [];\n }\n if (children instanceof Array) {\n return children;\n }\n return [children];\n }, [children]);\n\n const valueOrDefault = (): string | undefined => {\n if (has('value', props)) {\n return props.value;\n }\n const children = parseChildrenToArray();\n if (children && children.length && children[0].props.componentPath) {\n const firstChildren: TabProps = window.dash_component_api.getLayout(\n [...children[0].props.componentPath, 'props']\n );\n return firstChildren.value ?? 'tab-1';\n }\n return 'tab-1';\n };\n\n // Initialize value on mount if not set\n useEffect(() => {\n if (!initializedRef.current && !has('value', props)) {\n props.setProps({\n value: `${valueOrDefault()}`,\n });\n initializedRef.current = true;\n }\n }, []);\n\n // Setup matchMedia for responsive breakpoint\n useEffect(() => {\n const mediaQuery = window.matchMedia(\n `(min-width: ${mobile_breakpoint}px)`\n );\n\n // Set initial value\n setIsAboveBreakpoint(mediaQuery.matches);\n\n // Listen for changes\n const handler = (e: MediaQueryListEvent) =>\n setIsAboveBreakpoint(e.matches);\n mediaQuery.addEventListener('change', handler);\n\n return () => mediaQuery.removeEventListener('change', handler);\n }, [mobile_breakpoint]);\n\n let EnhancedTabs: JSX.Element[];\n let selectedTab;\n\n const value = valueOrDefault();\n\n if (children) {\n const children = parseChildrenToArray();\n\n EnhancedTabs = children.map((child, index) => {\n // TODO: handle components that are not dcc.Tab components (throw error)\n // enhance Tab components coming from Dash (as dcc.Tab) with methods needed for handling logic\n let childProps: Omit;\n\n if (React.isValidElement(child) && child.props.componentPath) {\n childProps = window.dash_component_api.getLayout([\n ...child.props.componentPath,\n 'props',\n ]);\n } else {\n // In case the selected tab is a string.\n childProps = {};\n }\n\n if (!childProps.value) {\n childProps = {...childProps, value: `tab-${index + 1}`};\n }\n\n // check if this child/Tab is currently selected\n if (childProps.value === value) {\n selectedTab = child;\n }\n\n const style = childProps.style ?? {};\n if (typeof childProps.width === 'number') {\n style.width = `${childProps.width}px`;\n style.flex = '0 0 auto';\n } else if (typeof childProps.width === 'string') {\n style.width = childProps.width;\n style.flex = '0 0 auto';\n }\n\n return (\n \n );\n });\n }\n\n const selectedTabContent = !isNil(selectedTab) ? selectedTab : '';\n\n const tabContainerClassNames = useMemo(() => {\n let names = 'tab-container';\n if (vertical) {\n names += ` tab-container--vert`;\n }\n if (props.className) {\n names += ` ${props.className}`;\n }\n return names;\n }, [vertical, props.className]);\n\n const tabContentClassNames = useMemo(() => {\n let names = 'tab-content';\n if (vertical) {\n names += ` tab-content--vert`;\n }\n if (props.content_className) {\n names += ` ${props.content_className}`;\n }\n return names;\n }, [vertical, props.content_className]);\n\n const tabParentClassNames = useMemo(() => {\n let names = 'tab-parent';\n if (vertical) {\n names += ` tab-parent--vert`;\n }\n if (isAboveBreakpoint) {\n names += ' tab-parent--above-breakpoint';\n }\n if (props.parent_className) {\n names += ` ${props.parent_className}`;\n }\n return names;\n }, [vertical, isAboveBreakpoint, props.parent_className]);\n\n // Set CSS variables for dynamic styling\n const cssVars = {\n '--tabs-border': colors.border,\n '--tabs-primary': colors.primary,\n '--tabs-background': colors.background,\n } as const;\n\n return (\n \n {loadingProps => (\n \n \n {EnhancedTabs}\n
\n \n {selectedTabContent || ''}\n
\n
\n )}\n \n );\n}\n\nTabs.dashPersistence = {\n persisted_props: [PersistedProps.value],\n persistence_type: PersistenceTypes.local,\n};\n\nTabs.dashChildrenUpdate = true;\n\nexport default Tabs;\n","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n \n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./textarea.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = function insertAtTop(element) {\n var parent = document.querySelector('head');\n // eslint-disable-next-line no-underscore-dangle\n var lastInsertedElement =\n window._lastElementInsertedByStyleLoader;\n\n if (!lastInsertedElement) {\n parent.insertBefore(element, parent.firstChild);\n } else if (lastInsertedElement.nextSibling) {\n parent.insertBefore(element, lastInsertedElement.nextSibling);\n } else {\n parent.appendChild(element);\n }\n\n // eslint-disable-next-line no-underscore-dangle\n window._lastElementInsertedByStyleLoader = element;\n };\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!./textarea.css\";\n export default content && content.locals ? content.locals : undefined;\n","/* eslint-disable no-unused-vars */\nimport React from 'react';\nimport {pick} from 'ramda';\nimport {PersistedProps, PersistenceTypes, TextAreaProps} from '../types';\nimport './css/textarea.css';\n\nconst textAreaProps = [\n 'id',\n 'cols',\n 'rows',\n 'minLength',\n 'maxLength',\n 'contentEditable',\n 'tabIndex',\n 'form',\n 'name',\n 'placeholder',\n 'wrap',\n 'accessKey',\n 'contextMenu',\n 'dir',\n 'draggable',\n 'lang',\n 'spellCheck',\n 'style',\n 'title',\n] as const;\n\n/**\n * A basic HTML textarea for entering multiline text.\n *\n */\nconst Textarea = ({\n setProps,\n n_blur = 0,\n n_blur_timestamp = -1,\n n_clicks = 0,\n n_clicks_timestamp = -1,\n ...props\n}: TextAreaProps) => {\n const ctx = window.dash_component_api.useDashContext();\n const isLoading = ctx.useLoading();\n\n return (\n
\n
\n \n );\n};\n\nexport default Tooltip;\n","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n \n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./dcc.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = function insertAtTop(element) {\n var parent = document.querySelector('head');\n // eslint-disable-next-line no-underscore-dangle\n var lastInsertedElement =\n window._lastElementInsertedByStyleLoader;\n\n if (!lastInsertedElement) {\n parent.insertBefore(element, parent.firstChild);\n } else if (lastInsertedElement.nextSibling) {\n parent.insertBefore(element, lastInsertedElement.nextSibling);\n } else {\n parent.appendChild(element);\n }\n\n // eslint-disable-next-line no-underscore-dangle\n window._lastElementInsertedByStyleLoader = element;\n };\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!./dcc.css\";\n export default content && content.locals ? content.locals : undefined;\n"],"names":["leafPrototypes","getProto","inProgress","dataWebpackPrefix","e","window","module","exports","__webpack_require__","n","t","r","o","i","l","call","m","c","d","Object","defineProperty","enumerable","get","Symbol","toStringTag","value","__esModule","create","bind","default","prototype","hasOwnProperty","p","s","u","a","done","Promise","resolve","then","this","arguments","apply","isReady","lazy","setTimeout","regeneratorRuntime","mark","wrap","prev","next","stop","_dashprivate_isLazyComponentReady","f","length","configurable","writable","key","TypeError","dispatchEvent","CustomEvent","addEventListener","removeEventListener","_typeof","iterator","constructor","_defineProperties","target","props","descriptor","_toPropertyKey","_createClass","Constructor","protoProps","staticProps","arg","input","prim","toPrimitive","undefined","res","hint","String","_toPrimitive","isDeepEqual","isDeepStrictEqual","_require$codes","codes","ERR_AMBIGUOUS_ARGUMENT","ERR_INVALID_ARG_TYPE","ERR_INVALID_ARG_VALUE","ERR_INVALID_RETURN_VALUE","ERR_MISSING_ARGS","AssertionError","inspect","_require$types","isPromise","isRegExp","objectAssign","objectIs","RegExpPrototypeTest","lazyLoadComparison","comparison","Map","warned","assert","ok","NO_EXCEPTION_SENTINEL","innerFail","obj","message","Error","innerOk","fn","argLen","generatedMessage","err","actual","expected","operator","stackStartFn","_len","args","Array","_key","concat","fail","internalMessage","argsLen","process","emitWarning","console","warn","errArgs","equal","notEqual","deepEqual","notDeepEqual","deepStrictEqual","notDeepStrictEqual","strictEqual","notStrictEqual","Comparison","keys","_this","instance","_classCallCheck","forEach","expectedException","msg","name","push","b","compareExceptionKey","isPrototypeOf","getActual","checkIsPromise","catch","waitForActual","promiseFn","resultPromise","expectsError","error","details","fnType","expectsNoError","internalMatch","string","regexp","fnName","match","strict","_len6","_key6","throws","_len2","_key2","rejects","_len3","_key3","result","doesNotThrow","_len4","_key4","doesNotReject","_len5","_key5","ifError","newErr","origStack","stack","tmp2","split","shift","tmp1","pos","indexOf","slice","join","doesNotMatch","ownKeys","getOwnPropertySymbols","filter","getOwnPropertyDescriptor","_objectSpread","getOwnPropertyDescriptors","defineProperties","_possibleConstructorReturn","self","_assertThisInitialized","ReferenceError","_wrapNativeSuper","Class","_cache","Function","toString","has","set","Wrapper","_construct","_getPrototypeOf","_setPrototypeOf","Parent","_isNativeReflectConstruct","Reflect","construct","sham","Proxy","Boolean","valueOf","setPrototypeOf","__proto__","getPrototypeOf","endsWith","str","search","this_len","substring","blue","green","red","white","kReadableOperator","strictEqualObject","notStrictEqualObject","notIdentical","copyError","source","inspectValue","val","compact","customInspect","depth","maxArrayLength","Infinity","showHidden","breakLength","showProxy","sorted","getters","_Error","_inspect$custom","subClass","superClass","_inherits","Derived","hasNativeReflectConstruct","_super","Super","NewTarget","options","limit","stackTraceLimit","stderr","isTTY","getColorDepth","other","lastPos","end","skipped","actualInspected","actualLines","expectedLines","indicator","inputLength","columns","count","Math","floor","maxCount","log","repeat","pop","maxLines","max","_actualLines","printedLines","skippedMsg","cur","expectedLine","actualLine","divergingLines","createErrDiff","base","_res","knownOperators","code","captureStackTrace","recurseTimes","ctx","custom","util","createErrorType","Base","NodeError","_Base","arg1","arg2","arg3","getMessage","oneOf","thing","isArray","len","map","determiner","start","substr","replace","type","reason","inspected","RangeError","_slicedToArray","arr","_arrayWithHoles","return","_iterableToArrayLimit","minLen","_arrayLikeToArray","from","test","_unsupportedIterableToArray","_nonIterableRest","arr2","regexFlagsSupported","flags","arrayFromSet","array","arrayFromMap","is","objectGetOwnPropertySymbols","numberIsNaN","Number","isNaN","uncurryThis","propertyIsEnumerable","objectToString","isAnyArrayBuffer","isArrayBufferView","isDate","isMap","isSet","isNativeError","isBoxedPrimitive","isNumberObject","isStringObject","isBooleanObject","isBigIntObject","isSymbolObject","isFloat32Array","isFloat64Array","isNonIndex","charCodeAt","pow","getOwnNonIndexProperties","compare","x","y","min","innerDeepEqual","val1","val2","memos","buf1","buf2","val1Tag","keys1","keys2","keyCheck","Date","getTime","RegExp","byteLength","Uint8Array","buffer","byteOffset","areSimilarTypedArrays","offset","areSimilarFloatArrays","_keys","_keys2","size","BigInt","isEqualBoxedPrimitive","getEnumerables","k","iterationType","aKeys","bKeys","symbolKeysA","symbolKeysB","_symbolKeysB","position","val2MemoA","val2MemoB","areEq","memo","aValues","Set","add","setMightHaveLoosePrim","bValues","_i","_val","setHasEqualElement","setEquiv","aEntries","_aEntries$i","item1","item2","mapMightHaveLoosePrim","bEntries","_i2","_bEntries$_i","item","mapHasEqualEntry","mapEquiv","keysA","objEquiv","delete","setValues","findLooseMatchingPrimitives","altValue","curB","key1","key2","privatePropTypes","_dashprivate_transformConfig","PropTypes","_dashprivate_transformFigure","_dashprivate_onFigureModified","EMPTY_DATA","PlotlyGraph","_Component","_callSuper","mathjax","_loadMathjax","state","prependData","extendData","clearState","setState","nextProps","figure","dataKey","data","React","ControlledPlotlyGraph","_extends","Component","RealPlotlyGraph","asyncDecorator","all","Plotly","reject","timeoutId","element","document","createElement","src","_dashPlotlyJSURL","async","onload","clearTimeout","onerror","querySelector","appendChild","lazyLoadMathJax","_ref","className","id","extendedClassName","Suspense","fallback","displayName","propTypes","responsive","clickData","clickAnnotationData","hoverData","clear_on_unhover","selectedData","relayoutData","restyleData","layout","frames","style","animate","animation_options","config","staticPlot","plotlyServerURL","editable","editSelection","edits","annotationPosition","annotationTail","annotationText","axisTitleText","colorbarPosition","colorbarTitleText","legendPosition","legendText","shapePosition","titleText","autosizable","queueLength","fillFrame","frameMargins","scrollZoom","doubleClick","doubleClickDelay","showTips","showAxisDragHandles","showAxisRangeEntryBoxes","showLink","sendData","linkText","displayModeBar","showSendToCloud","showEditInChartStudio","modeBarButtonsToRemove","modeBarButtonsToAdd","modeBarButtons","toImageButtonOptions","format","filename","width","height","scale","displaylogo","watermark","plotGlPixelRatio","topojsonURL","mapboxAccessToken","locale","locales","displayNotifier","setProps","defaultProps","frame","redraw","transition","duration","ease","graphPropTypes","graphDefaultProps","Graph_react","upload","RealUpload","Upload","contents","last_modified","children","accept","disabled","disable_click","max_size","min_size","multiple","enable_folder_selection","className_active","className_reject","className_disabled","style_active","style_reject","style_disabled","borderStyle","borderColor","backgroundColor","opacity","LoadingElement","ref","_ref$elementType","elementType","_objectWithoutProperties","_excluded","loading","dash_component_api","useDashContext","useLoading","givenProps","__webpack_exports__","A","dropdown","RealDropdown","defaultLabels","select_all","deselect_all","selected_count","clear_search","clear_selection","no_options_found","Dropdown","_ref$clearable","clearable","_ref$disabled","_ref$multi","multi","_ref$searchable","searchable","_ref$labels","labels","_ref$optionHeight","optionHeight","_ref$maxHeight","maxHeight","_ref$closeOnSelect","closeOnSelect","persisted_props","PersistedProps","persistence_type","PersistenceTypes","local","dashPersistence","allBlankCharCodes","is_string_blank_namespaceFn","original","styleTagTransform","styleTagTransform_default","setAttributes","setAttributesWithoutAttributes_default","insert","parent","lastInsertedElement","_lastElementInsertedByStyleLoader","nextSibling","insertBefore","firstChild","domAPI","styleDomAPI_default","insertStyleElement","insertStyleElement_default","injectStylesIntoStyleTag_default","locals","convert","fastIsNumeric","isNumeric","NaN","isEquivalent","v1","v2","inputProps","Input","_ref$type","HTMLInputTypes","text","_ref$inputMode","inputMode","_ref$n_blur","n_blur","_ref$n_submit","n_blur_timestamp","n_submit","_ref$debounce","n_submit_timestamp","debounce","_ref$step","step","_ref$autoComplete","autoComplete","useRef","_useState2","useState","setValue","_useState4","pendingEvent","setPendingEvent","inputId","uniqid","valprops","number","setPropValue","useCallback","current","checkValidity","onEvent","inputValue","valueAsNumber","propValue","onBlur","now","onChange","onKeyDown","setInputValue","debounceEvent","seconds","handleStepperClick","direction","currentValue","parseFloat","stepAsNum","decimalPlaces","constrainedValue","roundedValue","toFixed","useEffect","cursorPosition","selectionStart","isFinite","setSelectionRange","disabledAsBool","includes","pickedInputs","pick","isNumberInput","currentNumericValue","minValue","maxValue","isDecrementDisabled","isIncrementDisabled","loadingProps","hidden","trim","onClick","components_Input","_ref$refresh","refresh","_ref$scrollToTop","scrollToTop","href","title","cleanUrl","dash_clientside","clean_url","sanitizedUrl","useMemo","updateLocation","metaKey","shiftKey","altKey","ctrlKey","isNil","preventDefault","location","history","pushState","scrollTo","_dash_error","CalendarDirection","MathJax","additionalProps","assign","safeIsNaN","isEqual","first","second","areInputsEqual","newInputs","lastInputs","memoize_one_esm","resultFn","lastThis","lastResult","lastArgs","calledOnce","newArgs","performance","cancelTimeout","timeoutID","cancelAnimationFrame","getScrollbarSize","recalculate","div","overflow","body","offsetWidth","clientWidth","removeChild","cachedRTLResult","getRTLOffsetType","outerDiv","outerStyle","innerDiv","innerStyle","scrollLeft","defaultItemKey$1","index","createListComponent","_class","getItemOffset","getEstimatedTotalSize","getItemSize","getOffsetForIndexAndAlignment","getStartIndexForOffset","getStopIndexForStartIndex","initInstanceProps","shouldResetStyleCacheOnItemSizeChange","validateProps","_PureComponent","List","_instanceProps","_outerRef","_resetIsScrollingTimeoutId","isScrolling","scrollDirection","scrollOffset","initialScrollOffset","scrollUpdateWasRequested","_callOnItemsRendered","memoizeOne","overscanStartIndex","overscanStopIndex","visibleStartIndex","visibleStopIndex","onItemsRendered","_callOnScroll","onScroll","_getItemStyle","_this$props","itemSize","itemStyleCache","_getItemStyleCache","isHorizontal","isRtl","offsetHorizontal","left","right","top","_offset","_","__","___","_onScrollHorizontal","event","_event$currentTarget","currentTarget","scrollWidth","prevState","_resetIsScrollingDebounced","_onScrollVertical","_event$currentTarget2","clientHeight","scrollHeight","scrollTop","_outerRefSetter","outerRef","callback","delay","_resetIsScrolling","requestAnimationFrame","tick","getDerivedStateFromProps","validateSharedProps","_proto","scrollToItem","align","_this$props2","itemCount","scrollbarSize","componentDidMount","_this$props3","_callPropsCallbacks","componentDidUpdate","_this$props4","_this$state","componentWillUnmount","render","_this$props5","innerRef","innerElementType","innerTagName","itemData","_this$props5$itemKey","itemKey","outerElementType","outerTagName","useIsScrolling","_this$_getRangeToRend","_getRangeToRender","startIndex","stopIndex","items","_index","estimatedTotalSize","WebkitOverflowScrolling","willChange","pointerEvents","_this$_getRangeToRend2","_overscanStartIndex","_overscanStopIndex","_visibleStartIndex","_visibleStopIndex","_this$state2","_scrollDirection","_scrollOffset","_scrollUpdateWasRequested","_this$props6","overscanCount","_this$state3","overscanBackward","overscanForward","PureComponent","validateSharedProps$1","_ref2","_ref3","getItemMetadata$1","instanceProps","itemMetadataMap","lastMeasuredIndex","itemMetadata","findNearestItemBinarySearch$1","high","low","middle","currentOffset","estimatedItemSize","totalSizeOfMeasuredItems","VariableSizeList","maxOffset","minOffset","round","findNearestItemBinarySearch","interval","findNearestItemExponentialSearch","findNearestItem$1","getItemMetadata","resetAfterIndex","shouldForceUpdate","forceUpdate","_ref5","optionslist","OptionLabel","label","ExternalWrapper","component","componentPath","displayLabel","Option","option","isSelected","optionClassName","optionStyle","_ref2$inputType","inputType","inputClassName","inputStyle","labelClassName","labelStyle","classNames","inputClassNames","labelClassNames","role","checked","onKeyUp","readOnly","Row","selected","passThruProps","setOptionHeight","measureRef","el","immediateHeight","getBoundingClientRect","ResizeObserver","_ref4","_entry$borderBoxSize$","_entry$borderBoxSize","entry","borderBoxSize","blockSize","contentRect","observe","OptionsList","forwardRef","_ref6","onSelectionChange","_ref6$maxHeight","innerHeight","listRef","containerRef","pendingFocusRef","heightsRef","measuredHeight","setMeasuredHeight","defaultOptionHeight","getOptionHeight","_heightsRef$current$g","_listRef$current","useLayoutEffect","_listRef$current2","h","defaultListHeight","listHeight","focusOption","optionIndex","_containerRef$current","deferred","HTMLElement","focus","useImperativeHandle","focusItem","handleChange","newValue","without","append","handleItemsRendered","sizerDiv","longestOption","maxLen","_data$options$index$v","_data$options$index","sanitizeOptions","valueSet","opt","isOptionValue","entries","$apply","$call","$reflectApply","actualApply","$TypeError","$actualApply","GetIntrinsic","callBind","$indexOf","allowMissing","intrinsic","setFunctionLength","$defineProperty","callBindBasic","applyBind","originalFunction","func","adjustedLength","times","g","functions","time","object","expression","tuple","___CSS_LOADER_EXPORT___","_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default","_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default","version","sources","names","mappings","sourcesContent","sourceRoot","cssWithMappingToString","list","content","needLayer","modules","media","dedupe","supports","layer","alreadyImportedModules","_k","cssMapping","btoa","base64","unescape","encodeURIComponent","JSON","stringify","sourceMapping","$SyntaxError","gopd","property","nonEnumerable","nonWritable","nonConfigurable","loose","desc","hasSymbols","toStr","defineDataProperty","supportsDescriptors","predicate","predicates","hasProtoAccessor","gOPD","$Object","$getPrototypeOf","EvalError","SyntaxError","URIError","__WEBPACK_AMD_DEFINE_FACTORY__","__WEBPACK_AMD_DEFINE_RESULT__","XMLHttpRequest","open","responseType","response","send","status","MouseEvent","createEvent","initMouseEvent","global","navigator","userAgent","saveAs","HTMLAnchorElement","URL","webkitURL","j","download","rel","origin","createObjectURL","revokeObjectURL","msSaveOrOpenBlob","autoBom","Blob","innerText","safari","FileReader","onloadend","readAsDataURL","isCallable","thisArg","receiver","forEachArray","charAt","forEachString","forEachObject","concatty","that","bound","arrLike","slicy","boundLength","boundArgs","joiny","Empty","implementation","$Error","$EvalError","$RangeError","$ReferenceError","$URIError","abs","sign","$Function","getEvalledConstructor","expressionSyntax","$gOPD","throwTypeError","ThrowTypeError","calleeThrows","gOPDthrows","$ObjectGPO","$ReflectGPO","needsEval","TypedArray","INTRINSICS","AggregateError","ArrayBuffer","Atomics","BigInt64Array","BigUint64Array","DataView","decodeURI","decodeURIComponent","encodeURI","eval","Float16Array","Float32Array","Float64Array","FinalizationRegistry","Int8Array","Int16Array","Int32Array","parseInt","SharedArrayBuffer","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","WeakRef","WeakSet","errorProto","doEval","gen","LEGACY_ALIASES","hasOwn","$concat","$spliceApply","splice","$replace","$strSlice","$exec","exec","rePropName","reEscapeChar","getBaseIntrinsic","alias","intrinsicName","parts","last","quote","subString","stringToPath","intrinsicBaseName","intrinsicRealName","skipFurtherCaching","isOwn","part","reflectGetProto","originalGetProto","getDunderProto","O","hasPropertyDescriptors","hasArrayLengthDefineBug","origSymbol","hasSymbolSham","sym","symObj","getOwnPropertyNames","syms","$hasOwn","ctor","superCtor","super_","TempCtor","hasToStringTag","$toString","callBound","isStandardArguments","isLegacyArguments","callee","supportsStandardArguments","badArrayLike","isCallableMarker","fnToStr","reflectApply","constructorRegex","isES6ClassFn","fnStr","tryFunctionObject","isIE68","isDDA","strClass","isFnRegex","safeRegexTest","getGeneratorFunction","GeneratorFunction","define","getPolyfill","shim","polyfill","isRegexMarker","throwRegexMarker","badStringifier","whichTypedArray","$isNaN","keysShim","isArgs","isEnumerable","hasDontEnumBug","hasProtoEnumBug","dontEnums","equalsConstructorPrototype","excludedKeys","$applicationCache","$console","$external","$frame","$frameElement","$frames","$innerHeight","$innerWidth","$onmozfullscreenchange","$onmozfullscreenerror","$outerHeight","$outerWidth","$pageXOffset","$pageYOffset","$parent","$scrollLeft","$scrollTop","$scrollX","$scrollY","$self","$webkitIndexedDB","$webkitStorageInfo","$window","hasAutomationEqualityBug","isObject","isFunction","isArguments","isString","theKeys","skipProto","skipConstructor","equalsConstructorPrototypeIfNotBuggy","origKeys","originalKeys","keysWorksWithArguments","objectKeys","$push","$propIsEnumerable","originalGetSymbols","source1","to","getSymbols","nextKey","letters","lacksProperEnumerationOrder","preventExtensions","thrower","assignHasPendingExceptions","cachedSetTimeout","cachedClearTimeout","defaultSetTimout","defaultClearTimeout","runTimeout","fun","currentQueue","queue","draining","queueIndex","cleanUpNextTick","drainQueue","timeout","run","marker","runClearTimeout","Item","noop","nextTick","browser","env","argv","versions","on","addListener","once","off","removeListener","removeAllListeners","emit","prependListener","prependOnceListener","listeners","binding","cwd","chdir","dir","umask","isRegex","regex","hasDescriptors","$floor","functionLengthIsConfigurable","functionLengthIsWritable","stylesInDOM","getIndexByIdentifier","identifier","modulesToDom","idCountMap","identifiers","indexByIdentifier","css","sourceMap","references","updater","addElementStyle","byIndex","api","update","newObj","remove","lastIdentifiers","newList","newLastIdentifiers","attributes","styleElement","nonce","nc","setAttribute","parentNode","removeStyleElement","styleSheet","cssText","createTextNode","pid","prefix","suffix","copy","fill","readUInt8","isArgumentsObject","isGeneratorFunction","isTypedArray","BigIntSupported","SymbolSupported","ObjectToString","numberValue","stringValue","booleanValue","bigIntValue","symbolValue","checkBoxedPrimitive","prototypeValueOf","isMapToString","isSetToString","isWeakMapToString","isWeakSetToString","isArrayBufferToString","isArrayBuffer","working","isDataViewToString","isDataView","isView","isUint8Array","isUint8ClampedArray","isUint16Array","isUint32Array","isInt8Array","isInt16Array","isInt32Array","isBigInt64Array","isBigUint64Array","isWeakMap","isWeakSet","SharedArrayBufferCopy","isSharedArrayBufferToString","isSharedArrayBuffer","isAsyncFunction","isMapIterator","isSetIterator","isGeneratorObject","isWebAssemblyCompiledModule","method","descriptors","formatRegExp","objects","isNull","deprecate","noDeprecation","throwDeprecation","traceDeprecation","trace","debugs","debugEnvRegex","NODE_DEBUG","debugEnv","toUpperCase","opts","seen","stylize","stylizeNoColor","colors","isBoolean","_extend","isUndefined","stylizeWithColor","formatValue","styleType","styles","ret","primitive","simple","isNumber","formatPrimitive","visibleKeys","hash","idx","arrayToHash","isError","formatError","output","braces","toUTCString","formatProperty","formatArray","reduce","reduceToSingleString","line","ar","re","pad","debuglog","bold","italic","underline","inverse","grey","black","cyan","magenta","yellow","special","boolean","null","date","types","isNullOrUndefined","isSymbol","isPrimitive","isBuffer","months","prop","getHours","getMinutes","getSeconds","getDate","getMonth","inherits","kCustomPromisifiedSymbol","callbackifyOnRejected","cb","newReason","promisify","promiseResolve","promiseReject","promise","callbackify","callbackified","maybeCb","rej","availableTypedArrays","globalThis","typedArrays","$slice","cache","typedArray","proto","superProto","tag","isTATag","found","getter","trySlices","tryTypedArrays","ReactJSXRuntime","jsx","maybeKey","propName","jsxs","jsxDEV","Fragment","possibleNames","out","defaultOptions","getDefaultOptions","dateLongFormatter","pattern","formatLong","timeLongFormatter","longFormatters","P","dateTimeLongFormatter","dateTimeFormat","matchResult","datePattern","timePattern","dateTime","getTimezoneOffsetInMilliseconds","_date","toDate","utcDate","UTC","getFullYear","getMilliseconds","setUTCFullYear","normalizeDates","context","dates","normalize","constructFrom","find","dayOfYearTokenRE","weekYearTokenRE","throwTokens","isProtectedDayOfYearToken","token","isProtectedWeekYearToken","warnOrThrowProtectedError","_message","subject","toLowerCase","millisecondsInWeek","millisecondsInDay","millisecondsInMinute","millisecondsInHour","millisecondsInSecond","constructFromSymbol","for","differenceInCalendarDays","laterDate","earlierDate","_normalizeDates2","in","laterDate_","earlierDate_","laterStartOfDay","startOfDay","earlierStartOfDay","laterTimestamp","earlierTimestamp","getDayOfYear","date_","setFullYear","setHours","startOfYear","addLeadingZeros","targetLength","padStart","lightFormatters","signedYear","year","M","month","dayPeriodEnumValue","H","S","numberOfDigits","milliseconds","trunc","formatters","G","localize","era","ordinalNumber","unit","Y","signedWeekYear","getWeekYear","weekYear","R","getISOWeekYear","Q","quarter","ceil","q","L","w","week","getWeek","I","isoWeek","getISOWeek","D","dayOfYear","E","dayOfWeek","getDay","day","localDayOfWeek","weekStartsOn","isoDayOfWeek","dayPeriod","hours","B","K","X","_localize","timezoneOffset","getTimezoneOffset","formatTimezoneWithOptionalMinutes","formatTimezone","formatTimezoneShort","z","T","delimiter","absOffset","minutes","formattingTokensRegExp","longFormattingTokensRegExp","escapedStringRegExp","doubleQuoteRegExp","unescapedLatinCharacterRegExp","formatStr","_options$locale","_options$firstWeekCon","_options$locale2","_defaultOptions$local","_ref7","_options$weekStartsOn","_options$locale3","_defaultOptions$local2","defaultLocale","firstWeekContainsDate","originalDate","isValid","firstCharacter","longFormatter","isToken","matched","preprocessor","formatterOptions","useAdditionalWeekYearTokens","useAdditionalDayOfYearTokens","formatter","diff","startOfISOWeek","fourthOfJanuary","startOfISOWeekYear","fourthOfJanuaryOfNextYear","startOfNextYear","fourthOfJanuaryOfThisYear","startOfThisYear","startOfWeek","firstWeek","startOfWeekYear","firstWeekOfNextYear","firstWeekOfThisYear","formatDistanceLocale","lessThanXSeconds","one","xSeconds","halfAMinute","lessThanXMinutes","xMinutes","aboutXHours","xHours","xDays","aboutXWeeks","xWeeks","aboutXMonths","xMonths","aboutXYears","xYears","overXYears","almostXYears","buildFormatLongFn","defaultWidth","formats","full","long","medium","short","formatRelativeLocale","lastWeek","yesterday","today","tomorrow","nextWeek","buildLocalizeFn","valuesArray","formattingValues","defaultFormattingWidth","values","argumentCallback","dirtyNumber","_options","rem100","narrow","abbreviated","wide","am","pm","midnight","noon","morning","afternoon","evening","night","buildMatchFn","matchPattern","matchPatterns","defaultMatchWidth","matchedString","parsePatterns","defaultParseWidth","findIndex","findKey","valueCallback","rest","parsePattern","parseResult","any","enUS","formatDistance","tokenValue","addSuffix","formatRelative","_baseDate","parseISO","argument","_options$additionalDi","invalidDate","additionalDigits","dateStrings","dateString","timeString","patterns","dateTimeDelimiter","timeZoneDelimiter","timezone","splitDateString","parseYearResult","captures","restDateString","century","parseYear","dateRegex","isWeekDate","parseDateUnit","_year","validateWeekDate","isoWeekYear","getUTCDay","setUTCDate","getUTCDate","dayOfISOWeekYear","daysInMonths","isLeapYearIndex","validateDate","validateDayOfYearDate","parseDate","timestamp","timeRegex","parseTimeUnit","validateTime","parseTime","tmpDate","getUTCFullYear","getUTCMonth","getUTCHours","getUTCMinutes","getUTCSeconds","getUTCMilliseconds","timezoneString","timezoneRegex","_hours","validateTimezone","parseTimezone","setDate","cached","es_append","set1","set2","len1","len2","_concat","_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__","_internal_isArray_js__WEBPACK_IMPORTED_MODULE_1__","_toString_js__WEBPACK_IMPORTED_MODULE_4__","_internal_isString_js__WEBPACK_IMPORTED_MODULE_3__","_internal_isFunction_js__WEBPACK_IMPORTED_MODULE_2__","_arrayFromIterator","iter","_includesWith","pred","internal_objectIs","_uniqContentEquals","aIterator","bIterator","stackA","stackB","eq","_a","_b","_equals","aItem","typeA","equals","ignoreCase","multiline","sticky","unicode","extendedStackA","extendedStackB","_has","es_equals","_curry2","XFilter","xf","_xfBase","init","_xfilter","es_filter","_dispatchable","filterable","_isObject","reducer","acc","_arrayReduce","_filterMap","_filter","es_hasPath","_path","es_has","_internal_includes_js__WEBPACK_IMPORTED_MODULE_0__","_curry1","f1","_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_0__","f2","_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_1__","_curry1_js__WEBPACK_IMPORTED_MODULE_0__","methodNames","transducerCreator","_isArray","_isTransformer","transducer","_includes","inf","_indexOf","_isArguments","_has_js__WEBPACK_IMPORTED_MODULE_0__","_isFunction","_isPlaceholder","_isString","hasEnumBug","nonEnumerableProps","hasArgsEnumBug","contains","_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__","nIdx","ks","checkArgsLength","_internal_isArguments_js__WEBPACK_IMPORTED_MODULE_2__","_internal_has_js__WEBPACK_IMPORTED_MODULE_1__","omit","es_reject","_map","functor","_quote","internal_toISOString","toISOString","_toString","recur","xs","mapPairs","sort","repr","es_toString","hasOrAdd","shouldAdd","prevSize","_items","_nativeSet","bIdx","internal_Set","_Set","es_without","toRemove","__webpack_module_cache__","moduleId","cachedModule","__webpack_modules__","cw","mod","mode","ns","def","definition","chunkId","promises","url","script","needAttach","scripts","getElementsByTagName","getAttribute","charset","onScriptComplete","doneFns","head","scriptUrl","importScripts","currentScript","tagName","getCurrentScript","doc_scripts","textContent","jsonpScriptSrc","__jsonpScriptSrc__","isLocal","srcFragments","fileFragments","installedChunks","installedChunkData","errorType","realSrc","request","webpackJsonpCallback","parentChunkLoadingFunction","chunkIds","moreModules","runtime","some","chunkLoadingGlobal","bg","b64","tmp","lens","validLen","getLens","placeHoldersLen","Arr","_byteLength","curByte","revLookup","lookup","css_button","components_Button","_ref$n_clicks","n_clicks","n_clicks_timestamp","isLoading","checklist_options","checklist","Checklist","_ref$inputStyle","_ref$inputClassName","_ref$labelStyle","_ref$labelClassName","_ref$options","_ref$value","_ref$inline","inline","sanitizedOptions","stylingProps","selection","_defineProperty","_arr","_n","_d","_e","_s","_WINDOW","_DOCUMENT","_PERFORMANCE","measure","MutationObserver","_ref$userAgent","WINDOW","DOCUMENT","PERFORMANCE","IS_DOM","documentElement","NAMESPACE_IDENTIFIER","DEFAULT_REPLACEMENT_CLASS","oneToTen","oneToTwenty","DUOTONE_CLASSES","GROUP","SWAP_OPACITY","PRIMARY","SECONDARY","initial","FontAwesomeConfig","attr","coerce","getAttrConfig","_config","familyPrefix","replacementClass","autoReplaceSvg","autoAddCss","autoA11y","searchPseudoElements","observeMutations","mutateApproach","keepOriginalSource","measurePerformance","showMissingIcons","hooks","shims","namespace","doScroll","readyState","listener","asyncTimer","PENDING","SETTLED","FULFILLED","REJECTED","NOOP","isNode","asyncSetTimer","setImmediate","asyncQueue","asyncFlush","asyncCall","invokeCallback","subscriber","owner","settled","_state","_data","handleThenable","resolved","fulfill","publishFulfillment","publishRejection","publish","_then","_handled","notifyRejectionHandled","resolver","rejectPromise","invokeResolver","onFulfillment","onRejection","fulfilled","rejected","results","remaining","race","meaninglessTransform","rotate","flipX","flipY","nextUniqueId","random","htmlEscape","joinStyles","styleName","transformIsMeaningful","transform","transformForSvg","containerWidth","iconWidth","outer","innerTranslate","innerScale","innerRotate","inner","path","ALL_SPACE","fillBlack","abstract","force","initialValue","thisContext","bindInternal4","defineIcons","icons","_params$skipHooks","skipHooks","normalized","iconName","icon","addPack","build","ligatures","ligature","hasRegular","oldName","iconFromMapping","mapping","toHtml","abstractNodes","_abstractNodes$attrib","_abstractNodes$childr","attributeName","joinAttributes","MissingIcon","FILL","ANIMATION_BASE","attributeType","repeatCount","dur","OPACITY_ANIMATE","asFoundIcon","vectorData","class","cx","cy","Library","definitions","additions","_pullDefinitions","_normalized$key","ensureCss","_cssInserted","innerHTML","headChildren","childNodes","beforeChild","child","insertCss","dfp","drc","fp","rc","dPatt","customPropPatt","rPatt","findIconDefinition","iconLookup","_iconLookup$prefix","library","parse","transformString","parseTransformString","iconDefinition","abstractCreator","params","_params$transform","_params$symbol","symbol","_params$mask","mask","_params$maskId","maskId","_params$title","_params$titleId","titleId","_params$classes","classes","_params$attributes","_params$styles","_params$icons","main","extra","_params$watchable","watchable","isUploadedIcon","widthClass","attrClass","xmlns","viewBox","uploadedIconWidthStyle","explicitMaskId","mainWidth","mainPath","maskWidth","maskPath","trans","maskRect","maskInnerGroupChildrenMixin","maskInnerGroup","maskOuterGroup","clipId","maskTag","maskUnits","maskContentUnits","defs","makeIconMasking","styleString","makeIconStandard","asSymbol","asIcon","makeInlineSvgAbstract","container","html","maybeIconDefinition","enumerableOnly","symbols","_objectSpread2","index_es_defineProperty","index_es_typeof","index_es_objectWithoutProperties","excluded","sourceKeys","index_es_objectWithoutPropertiesLoose","sourceSymbolKeys","index_es_toConsumableArray","index_es_arrayWithoutHoles","index_es_iterableToArray","index_es_nonIterableSpread","camelize","chr","_excluded$1","index_es_PRODUCTION","normalizeIconArgs","objectWithKey","index_es_excluded","FontAwesomeIcon","forwardedRef","iconArgs","maskArgs","_classes","beat","fade","beatFade","bounce","shake","flash","spin","spinPulse","spinReverse","pulse","fixedWidth","border","listItem","flip","rotation","pull","swapOpacity","classList","renderedIcon","_console","index_es_console","extraProps","convertCurry","external_PropTypes_default","bool","oneOfType","mixins","attrs","pair","startsWith","_extraProps$style","existingStyle","external_React_default","faCheckCircle","faCopy","Generator","_regeneratorDefine2","v","GeneratorFunctionPrototype","_regenerator","_invoke","asyncGeneratorStep","_asyncToGenerator","_next","_throw","clipboardAPI","clipboard","wait","ms","Clipboard","_React$Component","copyToClipboard","onClickHandler","copySuccess","getTargetText","stringifyId","copied","prevProps","wild","_copySuccess","_callee","htmlContent","showCopiedIcon","blobHtml","blobText","_context","ClipboardItem","write","writeText","_x","_x2","target_id","getElementById","_loading","_callee2","_context2","_copyToClipboard","_callee3","_context3","html_content","copied_children","button_children","DashContext","ConfirmDialog","_update","displayed","shouldTriggerDisplay","cancel_n_clicks","submit_n_clicks","confirm","submit_n_clicks_timestamp","cancel_n_clicks_timestamp","ConfirmDialogProvider","wrapClick","datePickerRange","DatePickerPersistence","extract","parsed","storedValue","RealDatePickerRange","DatePickerRange","_ref$calendar_orienta","calendar_orientation","_ref$is_RTL","is_RTL","_ref$day_size","day_size","_ref$with_portal","with_portal","_ref$with_full_screen","with_full_screen_portal","_ref$first_day_of_wee","first_day_of_week","_ref$number_of_months","number_of_months_shown","_ref$stay_open_on_sel","stay_open_on_select","_ref$reopen_calendar_","reopen_calendar_on_clear","_ref$show_outside_day","show_outside_days","_ref$updatemode","updatemode","_ref$disabled_days","start_date","end_date","disabled_days","persistenceTransforms","transformDate","datePickerSingle","RealDatePickerSingle","DatePickerSingle","_ref$placeholder","placeholder","getValue","Download","toByteArray","blob","isRequired","Geolocation","success","update_now","geolocation","positionOptions","enableHighAccuracy","high_accuracy","maximumAge","maximum_age","getCurrentPosition","updatePosition","_crd$latitude","_crd$longitude","_crd$accuracy","_crd$altitude","_crd$altitudeAccuracy","_crd$speed","_crd$heading","crd","coords","position_obj","lat","latitude","lon","longitude","accuracy","alt","altitude","alt_accuracy","altitudeAccuracy","speed","heading","local_date","toLocaleString","position_error","show_alert","alert","Interval","intervalId","reportInterval","handleTimer","max_intervals","n_intervals","clearTimer","setInterval","clearInterval","resetTimer","_toPairs","pairs","es_toPairs","XAny","_xany","es_any","DebugTitle","spinnerComponentOptions","graph","debugTitle","fullscreen","debug","spinnerClass","cube","color","circle","dot","coveringSpinner","visibility","display","justifyContent","alignItems","components_Loading","targetComponents","_ref3$display","_ref3$color","parent_className","parent_style","overlay_style","_ref3$show_initially","show_initially","_ref3$type","spinnerType","_ref3$delay_hide","delay_hide","_ref3$delay_show","delay_show","target_components","custom_spinner","useSelector","stringPath","loadingChildren","toPairs","load","showSpinner","setShowSpinner","dismissTimer","showTimer","containerStyle","Spinner","getSpinner","Location","onLocationChange","_this2","pathname","propsToSet","checkExistsUpdateWindowLocation","fieldName","propVal","pathnameUpdated","hrefUpdated","hashUpdated","searchUpdated","searchVal","hashVal","propsToChange","History","dispatchChangeEvent","markdown","RealMarkdown","Markdown","_ref$mathjax","_ref$dangerously_allo","dangerously_allow_html","_ref$dedent","dedent","radioitems_options","RadioItems","radioitems","rangeSlider","sliders_options","sliders","RealRangeSlider","RangeSlider","_ref$verticalHeight","verticalHeight","_ref$allow_direct_inp","allow_direct_input","isInteger","RealSlider","Slider","drag_value","mappedValue","mappedDragValue","mappedSetProps","newProps","mappedProps","MemStore","_modified","setModified","WebStore","storage","_storage","getItem","setItem","removeItem","Store","storage_type","_backstore","localStorage","sessionStorage","onStorageChange","oldValue","modified_timestamp","getModified","old","clear_data","tabs_options","tabs","components_Tab","disabled_style","EnhancedTab","selected_className","selected_style","selectHandler","_ref$disabled_style","disabled_className","labelDisplay","rawPath","tabStyle","tabClassNames","_toConsumableArray","Tabs","EnhancedTabs","selectedTab","_ref2$mobile_breakpoi","mobile_breakpoint","_ref2$colors","primary","background","_ref2$vertical","vertical","initializedRef","isAboveBreakpoint","setIsAboveBreakpoint","parseChildrenToArray","valueOrDefault","_firstChildren$value","getLayout","mediaQuery","matchMedia","matches","handler","_childProps$style","childProps","flex","selectedTabContent","tabContainerClassNames","tabContentClassNames","content_className","tabParentClassNames","cssVars","content_style","dashChildrenUpdate","components_Tabs","textarea_options","css_textarea","textAreaProps","Textarea","required","autoFocus","components_Textarea","tooltip_options","tooltip","components_Tooltip","_ref$show","show","_ref$targetable","targetable","_ref$direction","_ref$border_color","border_color","_ref$background_color","background_color","_ref$className","_ref$zindex","zindex","_ref$loading_text","loading_text","bbox","show_tooltip","is_loading","x0","x1","y0","y1","dcc_options","dcc"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"dash_core_components.js","mappings":"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","sources":["webpack:///webpack/runtime/create fake namespace object","webpack:///webpack/runtime/load script","webpack:///./node_modules/@plotly/dash-component-plugins/dist/index.js","webpack:///./node_modules/assert/build/assert.js","webpack:///./node_modules/assert/build/internal/assert/assertion_error.js","webpack:///./node_modules/assert/build/internal/errors.js","webpack:///./node_modules/assert/build/internal/util/comparisons.js","webpack:///./src/fragments/Graph.privateprops.js","webpack:///./src/components/Graph.react.js","webpack:///./src/utils/LazyLoader/graph.js","webpack:///./src/utils/LazyLoader/plotly.js","webpack:///./src/utils/LazyLoader/upload.js","webpack:///./src/components/Upload.react.js","webpack:///./src/utils/LoadingElement.js","webpack:///./src/utils/LazyLoader/dropdown.ts","webpack:///./src/components/Dropdown.tsx","webpack:///./node_modules/fast-isnumeric/index.js","webpack:///./src/components/css/input.css?ceae","webpack:///./src/components/Input.tsx","webpack:///./src/components/Link.tsx","webpack:///./src/types.ts","webpack:///./src/utils/LazyLoader/third-party/mathjax.ts","webpack:///./src/utils/_LoadingElement.tsx","webpack:///./node_modules/@babel/runtime/helpers/esm/extends.js","webpack:///./node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js","webpack:///./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","webpack:///./node_modules/memoize-one/dist/memoize-one.esm.js","webpack:///../src/timer.js","webpack:///../src/domHelpers.js","webpack:///../src/createGridComponent.js","webpack:///../src/createListComponent.js","webpack:///./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","webpack:///../src/VariableSizeList.js","webpack:///./src/components/css/optionslist.css?1ebf","webpack:///./src/utils/optionRendering.tsx","webpack:///./src/utils/optionTypes.ts","webpack:///./node_modules/call-bind-apply-helpers/actualApply.js","webpack:///./node_modules/call-bind-apply-helpers/applyBind.js","webpack:///./node_modules/call-bind-apply-helpers/functionApply.js","webpack:///./node_modules/call-bind-apply-helpers/functionCall.js","webpack:///./node_modules/call-bind-apply-helpers/index.js","webpack:///./node_modules/call-bind-apply-helpers/reflectApply.js","webpack:///./node_modules/call-bind/callBound.js","webpack:///./node_modules/call-bind/index.js","webpack:///./node_modules/call-bound/index.js","webpack:///./node_modules/console-browserify/index.js","webpack:///./src/components/css/button.css","webpack:///./src/components/css/checklist.css","webpack:///./src/components/css/dcc.css","webpack:///./src/components/css/input.css","webpack:///./src/components/css/optionslist.css","webpack:///./src/components/css/radioitems.css","webpack:///./src/components/css/sliders.css","webpack:///./src/components/css/tabs.css","webpack:///./src/components/css/textarea.css","webpack:///./src/components/css/tooltip.css","webpack:///./node_modules/css-loader/dist/runtime/api.js","webpack:///./node_modules/css-loader/dist/runtime/sourceMaps.js","webpack:///./node_modules/define-data-property/index.js","webpack:///./node_modules/define-properties/index.js","webpack:///./node_modules/dunder-proto/get.js","webpack:///./node_modules/es-define-property/index.js","webpack:///./node_modules/es-errors/eval.js","webpack:///./node_modules/es-errors/index.js","webpack:///./node_modules/es-errors/range.js","webpack:///./node_modules/es-errors/ref.js","webpack:///./node_modules/es-errors/syntax.js","webpack:///./node_modules/es-errors/type.js","webpack:///./node_modules/es-errors/uri.js","webpack:///./node_modules/es-object-atoms/index.js","webpack:///./node_modules/file-saver/dist/FileSaver.min.js","webpack:///./node_modules/for-each/index.js","webpack:///./node_modules/function-bind/implementation.js","webpack:///./node_modules/function-bind/index.js","webpack:///./node_modules/get-intrinsic/index.js","webpack:///./node_modules/get-proto/Object.getPrototypeOf.js","webpack:///./node_modules/get-proto/Reflect.getPrototypeOf.js","webpack:///./node_modules/get-proto/index.js","webpack:///./node_modules/gopd/gOPD.js","webpack:///./node_modules/gopd/index.js","webpack:///./node_modules/has-property-descriptors/index.js","webpack:///./node_modules/has-symbols/index.js","webpack:///./node_modules/has-symbols/shams.js","webpack:///./node_modules/has-tostringtag/shams.js","webpack:///./node_modules/hasown/index.js","webpack:///./node_modules/inherits/inherits_browser.js","webpack:///./node_modules/is-arguments/index.js","webpack:///./node_modules/is-callable/index.js","webpack:///./node_modules/is-generator-function/index.js","webpack:///./node_modules/is-nan/implementation.js","webpack:///./node_modules/is-nan/index.js","webpack:///./node_modules/is-nan/polyfill.js","webpack:///./node_modules/is-nan/shim.js","webpack:///./node_modules/is-regex/index.js","webpack:///./node_modules/is-string-blank/index.js","webpack:///./node_modules/is-typed-array/index.js","webpack:///./node_modules/math-intrinsics/abs.js","webpack:///./node_modules/math-intrinsics/floor.js","webpack:///./node_modules/math-intrinsics/isNaN.js","webpack:///./node_modules/math-intrinsics/max.js","webpack:///./node_modules/math-intrinsics/min.js","webpack:///./node_modules/math-intrinsics/pow.js","webpack:///./node_modules/math-intrinsics/round.js","webpack:///./node_modules/math-intrinsics/sign.js","webpack:///./node_modules/object-is/implementation.js","webpack:///./node_modules/object-is/index.js","webpack:///./node_modules/object-is/polyfill.js","webpack:///./node_modules/object-is/shim.js","webpack:///./node_modules/object-keys/implementation.js","webpack:///./node_modules/object-keys/index.js","webpack:///./node_modules/object-keys/isArguments.js","webpack:///./node_modules/object.assign/implementation.js","webpack:///./node_modules/object.assign/polyfill.js","webpack:///./node_modules/possible-typed-array-names/index.js","webpack:///./node_modules/process/browser.js","webpack:///./node_modules/safe-regex-test/index.js","webpack:///./node_modules/set-function-length/index.js","webpack:///./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js","webpack:///./node_modules/style-loader/dist/runtime/insertStyleElement.js","webpack:///./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js","webpack:///./node_modules/style-loader/dist/runtime/styleDomAPI.js","webpack:///./node_modules/style-loader/dist/runtime/styleTagTransform.js","webpack:///./node_modules/uniqid/index.js","webpack:///./node_modules/util/support/isBufferBrowser.js","webpack:///./node_modules/util/support/types.js","webpack:///./node_modules/util/util.js","webpack:///./node_modules/which-typed-array/index.js","webpack:///== undefined) {\\n props.key = '' + maybeKey;\\n }\\n if (children === null || children === undefined) {\\n return React.createElement(type, props);\\n }\\n return Array.isArray(children)\\n ","webpack:///external window \"PropTypes\"","webpack:///external window \"React\"","webpack:///external window \"ReactDOM\"","webpack:///./node_modules/available-typed-arrays/index.js","webpack:///./node_modules/date-fns/_lib/defaultOptions.js","webpack:///./node_modules/date-fns/_lib/format/longFormatters.js","webpack:///./node_modules/date-fns/_lib/getTimezoneOffsetInMilliseconds.js","webpack:///./node_modules/date-fns/_lib/normalizeDates.js","webpack:///./node_modules/date-fns/_lib/protectedTokens.js","webpack:///./node_modules/date-fns/constants.js","webpack:///./node_modules/date-fns/constructFrom.js","webpack:///./node_modules/date-fns/differenceInCalendarDays.js","webpack:///./node_modules/date-fns/getDayOfYear.js","webpack:///./node_modules/date-fns/startOfYear.js","webpack:///./node_modules/date-fns/_lib/addLeadingZeros.js","webpack:///./node_modules/date-fns/_lib/format/lightFormatters.js","webpack:///./node_modules/date-fns/_lib/format/formatters.js","webpack:///./node_modules/date-fns/format.js","webpack:///./node_modules/date-fns/startOfISOWeekYear.js","webpack:///./node_modules/date-fns/getISOWeek.js","webpack:///./node_modules/date-fns/getISOWeekYear.js","webpack:///./node_modules/date-fns/startOfWeekYear.js","webpack:///./node_modules/date-fns/getWeek.js","webpack:///./node_modules/date-fns/getWeekYear.js","webpack:///./node_modules/date-fns/isDate.js","webpack:///./node_modules/date-fns/isValid.js","webpack:///./node_modules/date-fns/locale/en-US/_lib/formatDistance.js","webpack:///./node_modules/date-fns/locale/_lib/buildFormatLongFn.js","webpack:///./node_modules/date-fns/locale/en-US/_lib/formatLong.js","webpack:///./node_modules/date-fns/locale/en-US/_lib/formatRelative.js","webpack:///./node_modules/date-fns/locale/_lib/buildLocalizeFn.js","webpack:///./node_modules/date-fns/locale/en-US/_lib/localize.js","webpack:///./node_modules/date-fns/locale/_lib/buildMatchFn.js","webpack:///./node_modules/date-fns/locale/en-US/_lib/match.js","webpack:///./node_modules/date-fns/locale/_lib/buildMatchPatternFn.js","webpack:///./node_modules/date-fns/locale/en-US.js","webpack:///./node_modules/date-fns/parseISO.js","webpack:///./node_modules/date-fns/startOfDay.js","webpack:///./node_modules/date-fns/startOfISOWeek.js","webpack:///./node_modules/date-fns/startOfWeek.js","webpack:///./node_modules/date-fns/toDate.js","webpack:///./node_modules/generator-function/index.js","webpack:///./node_modules/ramda/es/append.js","webpack:///./node_modules/ramda/es/internal/_concat.js","webpack:///./node_modules/ramda/es/concat.js","webpack:///./node_modules/ramda/es/internal/_arrayFromIterator.js","webpack:///./node_modules/ramda/es/internal/_includesWith.js","webpack:///./node_modules/ramda/es/internal/_objectIs.js","webpack:///./node_modules/ramda/es/internal/_equals.js","webpack:///./node_modules/ramda/es/internal/_functionName.js","webpack:///./node_modules/ramda/es/equals.js","webpack:///./node_modules/ramda/es/internal/_xfilter.js","webpack:///./node_modules/ramda/es/filter.js","webpack:///./node_modules/ramda/es/internal/_arrayReduce.js","webpack:///./node_modules/ramda/es/internal/_isMap.js","webpack:///./node_modules/ramda/es/internal/_filterMap.js","webpack:///./node_modules/ramda/es/internal/_filter.js","webpack:///./node_modules/ramda/es/hasPath.js","webpack:///./node_modules/ramda/es/has.js","webpack:///./node_modules/ramda/es/includes.js","webpack:///./node_modules/ramda/es/internal/_curry1.js","webpack:///./node_modules/ramda/es/internal/_curry2.js","webpack:///./node_modules/ramda/es/internal/_dispatchable.js","webpack:///./node_modules/ramda/es/internal/_isTransformer.js","webpack:///./node_modules/ramda/es/internal/_has.js","webpack:///./node_modules/ramda/es/internal/_includes.js","webpack:///./node_modules/ramda/es/internal/_indexOf.js","webpack:///./node_modules/ramda/es/internal/_isArguments.js","webpack:///./node_modules/ramda/es/internal/_isArray.js","webpack:///./node_modules/ramda/es/internal/_isFunction.js","webpack:///./node_modules/ramda/es/internal/_isObject.js","webpack:///./node_modules/ramda/es/internal/_isPlaceholder.js","webpack:///./node_modules/ramda/es/internal/_isString.js","webpack:///./node_modules/ramda/es/internal/_xfBase.js","webpack:///./node_modules/ramda/es/isNil.js","webpack:///./node_modules/ramda/es/keys.js","webpack:///./node_modules/ramda/es/omit.js","webpack:///./node_modules/ramda/es/pick.js","webpack:///./node_modules/ramda/es/reject.js","webpack:///./node_modules/ramda/es/internal/_complement.js","webpack:///./node_modules/ramda/es/internal/_map.js","webpack:///./node_modules/ramda/es/internal/_quote.js","webpack:///./node_modules/ramda/es/internal/_toISOString.js","webpack:///./node_modules/ramda/es/internal/_toString.js","webpack:///./node_modules/ramda/es/toString.js","webpack:///./node_modules/ramda/es/type.js","webpack:///./node_modules/ramda/es/internal/_Set.js","webpack:///./node_modules/ramda/es/without.js","webpack:///webpack/bootstrap","webpack:///webpack/runtime/compat get default export","webpack:///webpack/runtime/concatenation wrap","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/ensure chunk","webpack:///webpack/runtime/get javascript chunk filename","webpack:///webpack/runtime/global","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///webpack/runtime/make namespace object","webpack:///webpack/runtime/publicPath","webpack:///webpack/runtime/compat","webpack:///webpack/runtime/jsonp chunk loading","webpack:///webpack/runtime/nonce","webpack:///./node_modules/base64-js/index.js","webpack:///./src/components/css/button.css?4110","webpack:///./src/components/Button.tsx","webpack:///./src/components/css/checklist.css?4b9a","webpack:///./src/components/Checklist.tsx","webpack:///./node_modules/@fortawesome/fontawesome-svg-core/index.es.js","webpack:///./node_modules/@fortawesome/react-fontawesome/index.es.js","webpack:///./node_modules/@fortawesome/free-regular-svg-icons/index.es.js","webpack:///./src/components/Clipboard.react.js","webpack:///./src/components/ConfirmDialog.react.js","webpack:///./src/components/ConfirmDialogProvider.react.js","webpack:///./src/utils/LazyLoader/datePickerRange.ts","webpack:///./src/utils/DatePickerPersistence.ts","webpack:///./src/components/DatePickerRange.tsx","webpack:///./src/utils/LazyLoader/datePickerSingle.ts","webpack:///./src/components/DatePickerSingle.tsx","webpack:///./src/components/Download.react.js","webpack:///./src/components/Geolocation.react.js","webpack:///./src/components/Interval.react.js","webpack:///./node_modules/ramda/es/internal/_toPairs.js","webpack:///./node_modules/ramda/es/toPairs.js","webpack:///./node_modules/ramda/es/internal/_xany.js","webpack:///./node_modules/ramda/es/internal/_reduced.js","webpack:///./node_modules/ramda/es/any.js","webpack:///./src/fragments/Loading/spinners/DebugTitle.tsx","webpack:///./src/components/Loading.tsx","webpack:///./src/fragments/Loading/spinners/GraphSpinner.tsx","webpack:///./src/fragments/Loading/spinners/CubeSpinner.tsx","webpack:///./src/fragments/Loading/spinners/CircleSpinner.tsx","webpack:///./src/fragments/Loading/spinners/DotSpinner.tsx","webpack:///./src/fragments/Loading/spinners/DefaultSpinner.tsx","webpack:///./src/components/Location.react.js","webpack:///./src/utils/LazyLoader/markdown.ts","webpack:///./src/components/Markdown.tsx","webpack:///./src/components/css/radioitems.css?af42","webpack:///./src/components/RadioItems.tsx","webpack:///./src/utils/LazyLoader/rangeSlider.ts","webpack:///./src/components/css/sliders.css?9e50","webpack:///./src/components/RangeSlider.tsx","webpack:///./src/components/Slider.tsx","webpack:///./src/components/Store.react.js","webpack:///./src/components/css/tabs.css?ebc8","webpack:///./src/components/Tab.tsx","webpack:///./src/components/Tabs.tsx","webpack:///./src/components/css/textarea.css?4273","webpack:///./src/components/Textarea.tsx","webpack:///./src/components/css/tooltip.css?1c92","webpack:///./src/components/Tooltip.tsx","webpack:///./src/components/css/dcc.css?95b0"],"sourcesContent":["var getProto = Object.getPrototypeOf;\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; (typeof current == 'object' || typeof current == 'function') && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach(function(key) { def[key] = function() { return value[key]; }; });\n\t}\n\tdef['default'] = function() { return value; };\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"dash_core_components:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = function(url, done, key, chunkId) {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = function(prev, event) {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach(function(fn) { return fn(event); });\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","!function(e,n){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=n(require(\"react\")):\"function\"==typeof define&&define.amd?define([\"react\"],n):\"object\"==typeof exports?exports[\"dash-component-plugins\"]=n(require(\"react\")):e[\"dash-component-plugins\"]=n(e.React)}(window,(function(e){return function(e){var n={};function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}return t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{enumerable:!0,get:r})},t.r=function(e){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},t.t=function(e,n){if(1&n&&(e=t(e)),8&n)return e;if(4&n&&\"object\"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(t.r(r),Object.defineProperty(r,\"default\",{enumerable:!0,value:e}),2&n&&\"string\"!=typeof e)for(var o in e)t.d(r,o,function(n){return e[n]}.bind(null,o));return r},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,\"a\",n),n},t.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},t.p=\"\",t(t.s=1)}([function(n,t){n.exports=e},function(e,n,t){\"use strict\";t.r(n),t.d(n,\"asyncDecorator\",(function(){return u})),t.d(n,\"inheritAsyncDecorator\",(function(){return a})),t.d(n,\"isReady\",(function(){return c})),t.d(n,\"History\",(function(){return d}));var r=t(0);function o(e,n,t,r,o,i,u){try{var a=e[i](u),c=a.value}catch(e){return void t(e)}a.done?n(c):Promise.resolve(c).then(r,o)}function i(e){return function(){var n=this,t=arguments;return new Promise((function(r,i){var u=e.apply(n,t);function a(e){o(u,r,i,a,c,\"next\",e)}function c(e){o(u,r,i,a,c,\"throw\",e)}a(void 0)}))}}var u=function(e,n){var t,o={isReady:new Promise((function(e){t=e})),get:Object(r.lazy)((function(){return Promise.resolve(n()).then((function(e){return setTimeout(i(regeneratorRuntime.mark((function e(){return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t(!0);case 2:o.isReady=!0;case 3:case\"end\":return e.stop()}}),e)}))),0),e}))}))};return Object.defineProperty(e,\"_dashprivate_isLazyComponentReady\",{get:function(){return o.isReady}}),o.get},a=function(e,n){Object.defineProperty(e,\"_dashprivate_isLazyComponentReady\",{get:function(){return c(n)}})},c=function(e){return e&&e._dashprivate_isLazyComponentReady};function f(e,n){for(var t=0;t\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the 'Software'), to\n// deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n// sell copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\nvar _require = require('./internal/errors'),\n _require$codes = _require.codes,\n ERR_AMBIGUOUS_ARGUMENT = _require$codes.ERR_AMBIGUOUS_ARGUMENT,\n ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE,\n ERR_INVALID_ARG_VALUE = _require$codes.ERR_INVALID_ARG_VALUE,\n ERR_INVALID_RETURN_VALUE = _require$codes.ERR_INVALID_RETURN_VALUE,\n ERR_MISSING_ARGS = _require$codes.ERR_MISSING_ARGS;\nvar AssertionError = require('./internal/assert/assertion_error');\nvar _require2 = require('util/'),\n inspect = _require2.inspect;\nvar _require$types = require('util/').types,\n isPromise = _require$types.isPromise,\n isRegExp = _require$types.isRegExp;\nvar objectAssign = require('object.assign/polyfill')();\nvar objectIs = require('object-is/polyfill')();\nvar RegExpPrototypeTest = require('call-bind/callBound')('RegExp.prototype.test');\nvar errorCache = new Map();\nvar isDeepEqual;\nvar isDeepStrictEqual;\nvar parseExpressionAt;\nvar findNodeAround;\nvar decoder;\nfunction lazyLoadComparison() {\n var comparison = require('./internal/util/comparisons');\n isDeepEqual = comparison.isDeepEqual;\n isDeepStrictEqual = comparison.isDeepStrictEqual;\n}\n\n// Escape control characters but not \\n and \\t to keep the line breaks and\n// indentation intact.\n// eslint-disable-next-line no-control-regex\nvar escapeSequencesRegExp = /[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f]/g;\nvar meta = [\"\\\\u0000\", \"\\\\u0001\", \"\\\\u0002\", \"\\\\u0003\", \"\\\\u0004\", \"\\\\u0005\", \"\\\\u0006\", \"\\\\u0007\", '\\\\b', '', '', \"\\\\u000b\", '\\\\f', '', \"\\\\u000e\", \"\\\\u000f\", \"\\\\u0010\", \"\\\\u0011\", \"\\\\u0012\", \"\\\\u0013\", \"\\\\u0014\", \"\\\\u0015\", \"\\\\u0016\", \"\\\\u0017\", \"\\\\u0018\", \"\\\\u0019\", \"\\\\u001a\", \"\\\\u001b\", \"\\\\u001c\", \"\\\\u001d\", \"\\\\u001e\", \"\\\\u001f\"];\nvar escapeFn = function escapeFn(str) {\n return meta[str.charCodeAt(0)];\n};\nvar warned = false;\n\n// The assert module provides functions that throw\n// AssertionError's when particular conditions are not met. The\n// assert module must conform to the following interface.\n\nvar assert = module.exports = ok;\nvar NO_EXCEPTION_SENTINEL = {};\n\n// All of the following functions must throw an AssertionError\n// when a corresponding condition is not met, with a message that\n// may be undefined if not provided. All assertion methods provide\n// both the actual and expected values to the assertion error for\n// display purposes.\n\nfunction innerFail(obj) {\n if (obj.message instanceof Error) throw obj.message;\n throw new AssertionError(obj);\n}\nfunction fail(actual, expected, message, operator, stackStartFn) {\n var argsLen = arguments.length;\n var internalMessage;\n if (argsLen === 0) {\n internalMessage = 'Failed';\n } else if (argsLen === 1) {\n message = actual;\n actual = undefined;\n } else {\n if (warned === false) {\n warned = true;\n var warn = process.emitWarning ? process.emitWarning : console.warn.bind(console);\n warn('assert.fail() with more than one argument is deprecated. ' + 'Please use assert.strictEqual() instead or only pass a message.', 'DeprecationWarning', 'DEP0094');\n }\n if (argsLen === 2) operator = '!=';\n }\n if (message instanceof Error) throw message;\n var errArgs = {\n actual: actual,\n expected: expected,\n operator: operator === undefined ? 'fail' : operator,\n stackStartFn: stackStartFn || fail\n };\n if (message !== undefined) {\n errArgs.message = message;\n }\n var err = new AssertionError(errArgs);\n if (internalMessage) {\n err.message = internalMessage;\n err.generatedMessage = true;\n }\n throw err;\n}\nassert.fail = fail;\n\n// The AssertionError is defined in internal/error.\nassert.AssertionError = AssertionError;\nfunction innerOk(fn, argLen, value, message) {\n if (!value) {\n var generatedMessage = false;\n if (argLen === 0) {\n generatedMessage = true;\n message = 'No value argument passed to `assert.ok()`';\n } else if (message instanceof Error) {\n throw message;\n }\n var err = new AssertionError({\n actual: value,\n expected: true,\n message: message,\n operator: '==',\n stackStartFn: fn\n });\n err.generatedMessage = generatedMessage;\n throw err;\n }\n}\n\n// Pure assertion tests whether a value is truthy, as determined\n// by !!value.\nfunction ok() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n innerOk.apply(void 0, [ok, args.length].concat(args));\n}\nassert.ok = ok;\n\n// The equality assertion tests shallow, coercive equality with ==.\n/* eslint-disable no-restricted-properties */\nassert.equal = function equal(actual, expected, message) {\n if (arguments.length < 2) {\n throw new ERR_MISSING_ARGS('actual', 'expected');\n }\n // eslint-disable-next-line eqeqeq\n if (actual != expected) {\n innerFail({\n actual: actual,\n expected: expected,\n message: message,\n operator: '==',\n stackStartFn: equal\n });\n }\n};\n\n// The non-equality assertion tests for whether two objects are not\n// equal with !=.\nassert.notEqual = function notEqual(actual, expected, message) {\n if (arguments.length < 2) {\n throw new ERR_MISSING_ARGS('actual', 'expected');\n }\n // eslint-disable-next-line eqeqeq\n if (actual == expected) {\n innerFail({\n actual: actual,\n expected: expected,\n message: message,\n operator: '!=',\n stackStartFn: notEqual\n });\n }\n};\n\n// The equivalence assertion tests a deep equality relation.\nassert.deepEqual = function deepEqual(actual, expected, message) {\n if (arguments.length < 2) {\n throw new ERR_MISSING_ARGS('actual', 'expected');\n }\n if (isDeepEqual === undefined) lazyLoadComparison();\n if (!isDeepEqual(actual, expected)) {\n innerFail({\n actual: actual,\n expected: expected,\n message: message,\n operator: 'deepEqual',\n stackStartFn: deepEqual\n });\n }\n};\n\n// The non-equivalence assertion tests for any deep inequality.\nassert.notDeepEqual = function notDeepEqual(actual, expected, message) {\n if (arguments.length < 2) {\n throw new ERR_MISSING_ARGS('actual', 'expected');\n }\n if (isDeepEqual === undefined) lazyLoadComparison();\n if (isDeepEqual(actual, expected)) {\n innerFail({\n actual: actual,\n expected: expected,\n message: message,\n operator: 'notDeepEqual',\n stackStartFn: notDeepEqual\n });\n }\n};\n/* eslint-enable */\n\nassert.deepStrictEqual = function deepStrictEqual(actual, expected, message) {\n if (arguments.length < 2) {\n throw new ERR_MISSING_ARGS('actual', 'expected');\n }\n if (isDeepEqual === undefined) lazyLoadComparison();\n if (!isDeepStrictEqual(actual, expected)) {\n innerFail({\n actual: actual,\n expected: expected,\n message: message,\n operator: 'deepStrictEqual',\n stackStartFn: deepStrictEqual\n });\n }\n};\nassert.notDeepStrictEqual = notDeepStrictEqual;\nfunction notDeepStrictEqual(actual, expected, message) {\n if (arguments.length < 2) {\n throw new ERR_MISSING_ARGS('actual', 'expected');\n }\n if (isDeepEqual === undefined) lazyLoadComparison();\n if (isDeepStrictEqual(actual, expected)) {\n innerFail({\n actual: actual,\n expected: expected,\n message: message,\n operator: 'notDeepStrictEqual',\n stackStartFn: notDeepStrictEqual\n });\n }\n}\nassert.strictEqual = function strictEqual(actual, expected, message) {\n if (arguments.length < 2) {\n throw new ERR_MISSING_ARGS('actual', 'expected');\n }\n if (!objectIs(actual, expected)) {\n innerFail({\n actual: actual,\n expected: expected,\n message: message,\n operator: 'strictEqual',\n stackStartFn: strictEqual\n });\n }\n};\nassert.notStrictEqual = function notStrictEqual(actual, expected, message) {\n if (arguments.length < 2) {\n throw new ERR_MISSING_ARGS('actual', 'expected');\n }\n if (objectIs(actual, expected)) {\n innerFail({\n actual: actual,\n expected: expected,\n message: message,\n operator: 'notStrictEqual',\n stackStartFn: notStrictEqual\n });\n }\n};\nvar Comparison = /*#__PURE__*/_createClass(function Comparison(obj, keys, actual) {\n var _this = this;\n _classCallCheck(this, Comparison);\n keys.forEach(function (key) {\n if (key in obj) {\n if (actual !== undefined && typeof actual[key] === 'string' && isRegExp(obj[key]) && RegExpPrototypeTest(obj[key], actual[key])) {\n _this[key] = actual[key];\n } else {\n _this[key] = obj[key];\n }\n }\n });\n});\nfunction compareExceptionKey(actual, expected, key, message, keys, fn) {\n if (!(key in actual) || !isDeepStrictEqual(actual[key], expected[key])) {\n if (!message) {\n // Create placeholder objects to create a nice output.\n var a = new Comparison(actual, keys);\n var b = new Comparison(expected, keys, actual);\n var err = new AssertionError({\n actual: a,\n expected: b,\n operator: 'deepStrictEqual',\n stackStartFn: fn\n });\n err.actual = actual;\n err.expected = expected;\n err.operator = fn.name;\n throw err;\n }\n innerFail({\n actual: actual,\n expected: expected,\n message: message,\n operator: fn.name,\n stackStartFn: fn\n });\n }\n}\nfunction expectedException(actual, expected, msg, fn) {\n if (typeof expected !== 'function') {\n if (isRegExp(expected)) return RegExpPrototypeTest(expected, actual);\n // assert.doesNotThrow does not accept objects.\n if (arguments.length === 2) {\n throw new ERR_INVALID_ARG_TYPE('expected', ['Function', 'RegExp'], expected);\n }\n\n // Handle primitives properly.\n if (_typeof(actual) !== 'object' || actual === null) {\n var err = new AssertionError({\n actual: actual,\n expected: expected,\n message: msg,\n operator: 'deepStrictEqual',\n stackStartFn: fn\n });\n err.operator = fn.name;\n throw err;\n }\n var keys = Object.keys(expected);\n // Special handle errors to make sure the name and the message are compared\n // as well.\n if (expected instanceof Error) {\n keys.push('name', 'message');\n } else if (keys.length === 0) {\n throw new ERR_INVALID_ARG_VALUE('error', expected, 'may not be an empty object');\n }\n if (isDeepEqual === undefined) lazyLoadComparison();\n keys.forEach(function (key) {\n if (typeof actual[key] === 'string' && isRegExp(expected[key]) && RegExpPrototypeTest(expected[key], actual[key])) {\n return;\n }\n compareExceptionKey(actual, expected, key, msg, keys, fn);\n });\n return true;\n }\n // Guard instanceof against arrow functions as they don't have a prototype.\n if (expected.prototype !== undefined && actual instanceof expected) {\n return true;\n }\n if (Error.isPrototypeOf(expected)) {\n return false;\n }\n return expected.call({}, actual) === true;\n}\nfunction getActual(fn) {\n if (typeof fn !== 'function') {\n throw new ERR_INVALID_ARG_TYPE('fn', 'Function', fn);\n }\n try {\n fn();\n } catch (e) {\n return e;\n }\n return NO_EXCEPTION_SENTINEL;\n}\nfunction checkIsPromise(obj) {\n // Accept native ES6 promises and promises that are implemented in a similar\n // way. Do not accept thenables that use a function as `obj` and that have no\n // `catch` handler.\n\n // TODO: thenables are checked up until they have the correct methods,\n // but according to documentation, the `then` method should receive\n // the `fulfill` and `reject` arguments as well or it may be never resolved.\n\n return isPromise(obj) || obj !== null && _typeof(obj) === 'object' && typeof obj.then === 'function' && typeof obj.catch === 'function';\n}\nfunction waitForActual(promiseFn) {\n return Promise.resolve().then(function () {\n var resultPromise;\n if (typeof promiseFn === 'function') {\n // Return a rejected promise if `promiseFn` throws synchronously.\n resultPromise = promiseFn();\n // Fail in case no promise is returned.\n if (!checkIsPromise(resultPromise)) {\n throw new ERR_INVALID_RETURN_VALUE('instance of Promise', 'promiseFn', resultPromise);\n }\n } else if (checkIsPromise(promiseFn)) {\n resultPromise = promiseFn;\n } else {\n throw new ERR_INVALID_ARG_TYPE('promiseFn', ['Function', 'Promise'], promiseFn);\n }\n return Promise.resolve().then(function () {\n return resultPromise;\n }).then(function () {\n return NO_EXCEPTION_SENTINEL;\n }).catch(function (e) {\n return e;\n });\n });\n}\nfunction expectsError(stackStartFn, actual, error, message) {\n if (typeof error === 'string') {\n if (arguments.length === 4) {\n throw new ERR_INVALID_ARG_TYPE('error', ['Object', 'Error', 'Function', 'RegExp'], error);\n }\n if (_typeof(actual) === 'object' && actual !== null) {\n if (actual.message === error) {\n throw new ERR_AMBIGUOUS_ARGUMENT('error/message', \"The error message \\\"\".concat(actual.message, \"\\\" is identical to the message.\"));\n }\n } else if (actual === error) {\n throw new ERR_AMBIGUOUS_ARGUMENT('error/message', \"The error \\\"\".concat(actual, \"\\\" is identical to the message.\"));\n }\n message = error;\n error = undefined;\n } else if (error != null && _typeof(error) !== 'object' && typeof error !== 'function') {\n throw new ERR_INVALID_ARG_TYPE('error', ['Object', 'Error', 'Function', 'RegExp'], error);\n }\n if (actual === NO_EXCEPTION_SENTINEL) {\n var details = '';\n if (error && error.name) {\n details += \" (\".concat(error.name, \")\");\n }\n details += message ? \": \".concat(message) : '.';\n var fnType = stackStartFn.name === 'rejects' ? 'rejection' : 'exception';\n innerFail({\n actual: undefined,\n expected: error,\n operator: stackStartFn.name,\n message: \"Missing expected \".concat(fnType).concat(details),\n stackStartFn: stackStartFn\n });\n }\n if (error && !expectedException(actual, error, message, stackStartFn)) {\n throw actual;\n }\n}\nfunction expectsNoError(stackStartFn, actual, error, message) {\n if (actual === NO_EXCEPTION_SENTINEL) return;\n if (typeof error === 'string') {\n message = error;\n error = undefined;\n }\n if (!error || expectedException(actual, error)) {\n var details = message ? \": \".concat(message) : '.';\n var fnType = stackStartFn.name === 'doesNotReject' ? 'rejection' : 'exception';\n innerFail({\n actual: actual,\n expected: error,\n operator: stackStartFn.name,\n message: \"Got unwanted \".concat(fnType).concat(details, \"\\n\") + \"Actual message: \\\"\".concat(actual && actual.message, \"\\\"\"),\n stackStartFn: stackStartFn\n });\n }\n throw actual;\n}\nassert.throws = function throws(promiseFn) {\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n expectsError.apply(void 0, [throws, getActual(promiseFn)].concat(args));\n};\nassert.rejects = function rejects(promiseFn) {\n for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {\n args[_key3 - 1] = arguments[_key3];\n }\n return waitForActual(promiseFn).then(function (result) {\n return expectsError.apply(void 0, [rejects, result].concat(args));\n });\n};\nassert.doesNotThrow = function doesNotThrow(fn) {\n for (var _len4 = arguments.length, args = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) {\n args[_key4 - 1] = arguments[_key4];\n }\n expectsNoError.apply(void 0, [doesNotThrow, getActual(fn)].concat(args));\n};\nassert.doesNotReject = function doesNotReject(fn) {\n for (var _len5 = arguments.length, args = new Array(_len5 > 1 ? _len5 - 1 : 0), _key5 = 1; _key5 < _len5; _key5++) {\n args[_key5 - 1] = arguments[_key5];\n }\n return waitForActual(fn).then(function (result) {\n return expectsNoError.apply(void 0, [doesNotReject, result].concat(args));\n });\n};\nassert.ifError = function ifError(err) {\n if (err !== null && err !== undefined) {\n var message = 'ifError got unwanted exception: ';\n if (_typeof(err) === 'object' && typeof err.message === 'string') {\n if (err.message.length === 0 && err.constructor) {\n message += err.constructor.name;\n } else {\n message += err.message;\n }\n } else {\n message += inspect(err);\n }\n var newErr = new AssertionError({\n actual: err,\n expected: null,\n operator: 'ifError',\n message: message,\n stackStartFn: ifError\n });\n\n // Make sure we actually have a stack trace!\n var origStack = err.stack;\n if (typeof origStack === 'string') {\n // This will remove any duplicated frames from the error frames taken\n // from within `ifError` and add the original error frames to the newly\n // created ones.\n var tmp2 = origStack.split('\\n');\n tmp2.shift();\n // Filter all frames existing in err.stack.\n var tmp1 = newErr.stack.split('\\n');\n for (var i = 0; i < tmp2.length; i++) {\n // Find the first occurrence of the frame.\n var pos = tmp1.indexOf(tmp2[i]);\n if (pos !== -1) {\n // Only keep new frames.\n tmp1 = tmp1.slice(0, pos);\n break;\n }\n }\n newErr.stack = \"\".concat(tmp1.join('\\n'), \"\\n\").concat(tmp2.join('\\n'));\n }\n throw newErr;\n }\n};\n\n// Currently in sync with Node.js lib/assert.js\n// https://github.com/nodejs/node/commit/2a871df3dfb8ea663ef5e1f8f62701ec51384ecb\nfunction internalMatch(string, regexp, message, fn, fnName) {\n if (!isRegExp(regexp)) {\n throw new ERR_INVALID_ARG_TYPE('regexp', 'RegExp', regexp);\n }\n var match = fnName === 'match';\n if (typeof string !== 'string' || RegExpPrototypeTest(regexp, string) !== match) {\n if (message instanceof Error) {\n throw message;\n }\n var generatedMessage = !message;\n\n // 'The input was expected to not match the regular expression ' +\n message = message || (typeof string !== 'string' ? 'The \"string\" argument must be of type string. Received type ' + \"\".concat(_typeof(string), \" (\").concat(inspect(string), \")\") : (match ? 'The input did not match the regular expression ' : 'The input was expected to not match the regular expression ') + \"\".concat(inspect(regexp), \". Input:\\n\\n\").concat(inspect(string), \"\\n\"));\n var err = new AssertionError({\n actual: string,\n expected: regexp,\n message: message,\n operator: fnName,\n stackStartFn: fn\n });\n err.generatedMessage = generatedMessage;\n throw err;\n }\n}\nassert.match = function match(string, regexp, message) {\n internalMatch(string, regexp, message, match, 'match');\n};\nassert.doesNotMatch = function doesNotMatch(string, regexp, message) {\n internalMatch(string, regexp, message, doesNotMatch, 'doesNotMatch');\n};\n\n// Expose a strict only variant of assert\nfunction strict() {\n for (var _len6 = arguments.length, args = new Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {\n args[_key6] = arguments[_key6];\n }\n innerOk.apply(void 0, [strict, args.length].concat(args));\n}\nassert.strict = objectAssign(strict, assert, {\n equal: assert.strictEqual,\n deepEqual: assert.deepStrictEqual,\n notEqual: assert.notStrictEqual,\n notDeepEqual: assert.notDeepStrictEqual\n});\nassert.strict.strict = assert.strict;","// Currently in sync with Node.js lib/internal/assert/assertion_error.js\n// https://github.com/nodejs/node/commit/0817840f775032169ddd70c85ac059f18ffcc81c\n\n'use strict';\n\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, \"prototype\", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } else if (call !== void 0) { throw new TypeError(\"Derived constructors may only return object or undefined\"); } return _assertThisInitialized(self); }\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\nfunction _wrapNativeSuper(Class) { var _cache = typeof Map === \"function\" ? new Map() : undefined; _wrapNativeSuper = function _wrapNativeSuper(Class) { if (Class === null || !_isNativeFunction(Class)) return Class; if (typeof Class !== \"function\") { throw new TypeError(\"Super expression must either be null or a function\"); } if (typeof _cache !== \"undefined\") { if (_cache.has(Class)) return _cache.get(Class); _cache.set(Class, Wrapper); } function Wrapper() { return _construct(Class, arguments, _getPrototypeOf(this).constructor); } Wrapper.prototype = Object.create(Class.prototype, { constructor: { value: Wrapper, enumerable: false, writable: true, configurable: true } }); return _setPrototypeOf(Wrapper, Class); }; return _wrapNativeSuper(Class); }\nfunction _construct(Parent, args, Class) { if (_isNativeReflectConstruct()) { _construct = Reflect.construct.bind(); } else { _construct = function _construct(Parent, args, Class) { var a = [null]; a.push.apply(a, args); var Constructor = Function.bind.apply(Parent, a); var instance = new Constructor(); if (Class) _setPrototypeOf(instance, Class.prototype); return instance; }; } return _construct.apply(null, arguments); }\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\nfunction _isNativeFunction(fn) { return Function.toString.call(fn).indexOf(\"[native code]\") !== -1; }\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nvar _require = require('util/'),\n inspect = _require.inspect;\nvar _require2 = require('../errors'),\n ERR_INVALID_ARG_TYPE = _require2.codes.ERR_INVALID_ARG_TYPE;\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith\nfunction endsWith(str, search, this_len) {\n if (this_len === undefined || this_len > str.length) {\n this_len = str.length;\n }\n return str.substring(this_len - search.length, this_len) === search;\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat\nfunction repeat(str, count) {\n count = Math.floor(count);\n if (str.length == 0 || count == 0) return '';\n var maxCount = str.length * count;\n count = Math.floor(Math.log(count) / Math.log(2));\n while (count) {\n str += str;\n count--;\n }\n str += str.substring(0, maxCount - str.length);\n return str;\n}\nvar blue = '';\nvar green = '';\nvar red = '';\nvar white = '';\nvar kReadableOperator = {\n deepStrictEqual: 'Expected values to be strictly deep-equal:',\n strictEqual: 'Expected values to be strictly equal:',\n strictEqualObject: 'Expected \"actual\" to be reference-equal to \"expected\":',\n deepEqual: 'Expected values to be loosely deep-equal:',\n equal: 'Expected values to be loosely equal:',\n notDeepStrictEqual: 'Expected \"actual\" not to be strictly deep-equal to:',\n notStrictEqual: 'Expected \"actual\" to be strictly unequal to:',\n notStrictEqualObject: 'Expected \"actual\" not to be reference-equal to \"expected\":',\n notDeepEqual: 'Expected \"actual\" not to be loosely deep-equal to:',\n notEqual: 'Expected \"actual\" to be loosely unequal to:',\n notIdentical: 'Values identical but not reference-equal:'\n};\n\n// Comparing short primitives should just show === / !== instead of using the\n// diff.\nvar kMaxShortLength = 10;\nfunction copyError(source) {\n var keys = Object.keys(source);\n var target = Object.create(Object.getPrototypeOf(source));\n keys.forEach(function (key) {\n target[key] = source[key];\n });\n Object.defineProperty(target, 'message', {\n value: source.message\n });\n return target;\n}\nfunction inspectValue(val) {\n // The util.inspect default values could be changed. This makes sure the\n // error messages contain the necessary information nevertheless.\n return inspect(val, {\n compact: false,\n customInspect: false,\n depth: 1000,\n maxArrayLength: Infinity,\n // Assert compares only enumerable properties (with a few exceptions).\n showHidden: false,\n // Having a long line as error is better than wrapping the line for\n // comparison for now.\n // TODO(BridgeAR): `breakLength` should be limited as soon as soon as we\n // have meta information about the inspected properties (i.e., know where\n // in what line the property starts and ends).\n breakLength: Infinity,\n // Assert does not detect proxies currently.\n showProxy: false,\n sorted: true,\n // Inspect getters as we also check them when comparing entries.\n getters: true\n });\n}\nfunction createErrDiff(actual, expected, operator) {\n var other = '';\n var res = '';\n var lastPos = 0;\n var end = '';\n var skipped = false;\n var actualInspected = inspectValue(actual);\n var actualLines = actualInspected.split('\\n');\n var expectedLines = inspectValue(expected).split('\\n');\n var i = 0;\n var indicator = '';\n\n // In case both values are objects explicitly mark them as not reference equal\n // for the `strictEqual` operator.\n if (operator === 'strictEqual' && _typeof(actual) === 'object' && _typeof(expected) === 'object' && actual !== null && expected !== null) {\n operator = 'strictEqualObject';\n }\n\n // If \"actual\" and \"expected\" fit on a single line and they are not strictly\n // equal, check further special handling.\n if (actualLines.length === 1 && expectedLines.length === 1 && actualLines[0] !== expectedLines[0]) {\n var inputLength = actualLines[0].length + expectedLines[0].length;\n // If the character length of \"actual\" and \"expected\" together is less than\n // kMaxShortLength and if neither is an object and at least one of them is\n // not `zero`, use the strict equal comparison to visualize the output.\n if (inputLength <= kMaxShortLength) {\n if ((_typeof(actual) !== 'object' || actual === null) && (_typeof(expected) !== 'object' || expected === null) && (actual !== 0 || expected !== 0)) {\n // -0 === +0\n return \"\".concat(kReadableOperator[operator], \"\\n\\n\") + \"\".concat(actualLines[0], \" !== \").concat(expectedLines[0], \"\\n\");\n }\n } else if (operator !== 'strictEqualObject') {\n // If the stderr is a tty and the input length is lower than the current\n // columns per line, add a mismatch indicator below the output. If it is\n // not a tty, use a default value of 80 characters.\n var maxLength = process.stderr && process.stderr.isTTY ? process.stderr.columns : 80;\n if (inputLength < maxLength) {\n while (actualLines[0][i] === expectedLines[0][i]) {\n i++;\n }\n // Ignore the first characters.\n if (i > 2) {\n // Add position indicator for the first mismatch in case it is a\n // single line and the input length is less than the column length.\n indicator = \"\\n \".concat(repeat(' ', i), \"^\");\n i = 0;\n }\n }\n }\n }\n\n // Remove all ending lines that match (this optimizes the output for\n // readability by reducing the number of total changed lines).\n var a = actualLines[actualLines.length - 1];\n var b = expectedLines[expectedLines.length - 1];\n while (a === b) {\n if (i++ < 2) {\n end = \"\\n \".concat(a).concat(end);\n } else {\n other = a;\n }\n actualLines.pop();\n expectedLines.pop();\n if (actualLines.length === 0 || expectedLines.length === 0) break;\n a = actualLines[actualLines.length - 1];\n b = expectedLines[expectedLines.length - 1];\n }\n var maxLines = Math.max(actualLines.length, expectedLines.length);\n // Strict equal with identical objects that are not identical by reference.\n // E.g., assert.deepStrictEqual({ a: Symbol() }, { a: Symbol() })\n if (maxLines === 0) {\n // We have to get the result again. The lines were all removed before.\n var _actualLines = actualInspected.split('\\n');\n\n // Only remove lines in case it makes sense to collapse those.\n // TODO: Accept env to always show the full error.\n if (_actualLines.length > 30) {\n _actualLines[26] = \"\".concat(blue, \"...\").concat(white);\n while (_actualLines.length > 27) {\n _actualLines.pop();\n }\n }\n return \"\".concat(kReadableOperator.notIdentical, \"\\n\\n\").concat(_actualLines.join('\\n'), \"\\n\");\n }\n if (i > 3) {\n end = \"\\n\".concat(blue, \"...\").concat(white).concat(end);\n skipped = true;\n }\n if (other !== '') {\n end = \"\\n \".concat(other).concat(end);\n other = '';\n }\n var printedLines = 0;\n var msg = kReadableOperator[operator] + \"\\n\".concat(green, \"+ actual\").concat(white, \" \").concat(red, \"- expected\").concat(white);\n var skippedMsg = \" \".concat(blue, \"...\").concat(white, \" Lines skipped\");\n for (i = 0; i < maxLines; i++) {\n // Only extra expected lines exist\n var cur = i - lastPos;\n if (actualLines.length < i + 1) {\n // If the last diverging line is more than one line above and the\n // current line is at least line three, add some of the former lines and\n // also add dots to indicate skipped entries.\n if (cur > 1 && i > 2) {\n if (cur > 4) {\n res += \"\\n\".concat(blue, \"...\").concat(white);\n skipped = true;\n } else if (cur > 3) {\n res += \"\\n \".concat(expectedLines[i - 2]);\n printedLines++;\n }\n res += \"\\n \".concat(expectedLines[i - 1]);\n printedLines++;\n }\n // Mark the current line as the last diverging one.\n lastPos = i;\n // Add the expected line to the cache.\n other += \"\\n\".concat(red, \"-\").concat(white, \" \").concat(expectedLines[i]);\n printedLines++;\n // Only extra actual lines exist\n } else if (expectedLines.length < i + 1) {\n // If the last diverging line is more than one line above and the\n // current line is at least line three, add some of the former lines and\n // also add dots to indicate skipped entries.\n if (cur > 1 && i > 2) {\n if (cur > 4) {\n res += \"\\n\".concat(blue, \"...\").concat(white);\n skipped = true;\n } else if (cur > 3) {\n res += \"\\n \".concat(actualLines[i - 2]);\n printedLines++;\n }\n res += \"\\n \".concat(actualLines[i - 1]);\n printedLines++;\n }\n // Mark the current line as the last diverging one.\n lastPos = i;\n // Add the actual line to the result.\n res += \"\\n\".concat(green, \"+\").concat(white, \" \").concat(actualLines[i]);\n printedLines++;\n // Lines diverge\n } else {\n var expectedLine = expectedLines[i];\n var actualLine = actualLines[i];\n // If the lines diverge, specifically check for lines that only diverge by\n // a trailing comma. In that case it is actually identical and we should\n // mark it as such.\n var divergingLines = actualLine !== expectedLine && (!endsWith(actualLine, ',') || actualLine.slice(0, -1) !== expectedLine);\n // If the expected line has a trailing comma but is otherwise identical,\n // add a comma at the end of the actual line. Otherwise the output could\n // look weird as in:\n //\n // [\n // 1 // No comma at the end!\n // + 2\n // ]\n //\n if (divergingLines && endsWith(expectedLine, ',') && expectedLine.slice(0, -1) === actualLine) {\n divergingLines = false;\n actualLine += ',';\n }\n if (divergingLines) {\n // If the last diverging line is more than one line above and the\n // current line is at least line three, add some of the former lines and\n // also add dots to indicate skipped entries.\n if (cur > 1 && i > 2) {\n if (cur > 4) {\n res += \"\\n\".concat(blue, \"...\").concat(white);\n skipped = true;\n } else if (cur > 3) {\n res += \"\\n \".concat(actualLines[i - 2]);\n printedLines++;\n }\n res += \"\\n \".concat(actualLines[i - 1]);\n printedLines++;\n }\n // Mark the current line as the last diverging one.\n lastPos = i;\n // Add the actual line to the result and cache the expected diverging\n // line so consecutive diverging lines show up as +++--- and not +-+-+-.\n res += \"\\n\".concat(green, \"+\").concat(white, \" \").concat(actualLine);\n other += \"\\n\".concat(red, \"-\").concat(white, \" \").concat(expectedLine);\n printedLines += 2;\n // Lines are identical\n } else {\n // Add all cached information to the result before adding other things\n // and reset the cache.\n res += other;\n other = '';\n // If the last diverging line is exactly one line above or if it is the\n // very first line, add the line to the result.\n if (cur === 1 || i === 0) {\n res += \"\\n \".concat(actualLine);\n printedLines++;\n }\n }\n }\n // Inspected object to big (Show ~20 rows max)\n if (printedLines > 20 && i < maxLines - 2) {\n return \"\".concat(msg).concat(skippedMsg, \"\\n\").concat(res, \"\\n\").concat(blue, \"...\").concat(white).concat(other, \"\\n\") + \"\".concat(blue, \"...\").concat(white);\n }\n }\n return \"\".concat(msg).concat(skipped ? skippedMsg : '', \"\\n\").concat(res).concat(other).concat(end).concat(indicator);\n}\nvar AssertionError = /*#__PURE__*/function (_Error, _inspect$custom) {\n _inherits(AssertionError, _Error);\n var _super = _createSuper(AssertionError);\n function AssertionError(options) {\n var _this;\n _classCallCheck(this, AssertionError);\n if (_typeof(options) !== 'object' || options === null) {\n throw new ERR_INVALID_ARG_TYPE('options', 'Object', options);\n }\n var message = options.message,\n operator = options.operator,\n stackStartFn = options.stackStartFn;\n var actual = options.actual,\n expected = options.expected;\n var limit = Error.stackTraceLimit;\n Error.stackTraceLimit = 0;\n if (message != null) {\n _this = _super.call(this, String(message));\n } else {\n if (process.stderr && process.stderr.isTTY) {\n // Reset on each call to make sure we handle dynamically set environment\n // variables correct.\n if (process.stderr && process.stderr.getColorDepth && process.stderr.getColorDepth() !== 1) {\n blue = \"\\x1B[34m\";\n green = \"\\x1B[32m\";\n white = \"\\x1B[39m\";\n red = \"\\x1B[31m\";\n } else {\n blue = '';\n green = '';\n white = '';\n red = '';\n }\n }\n // Prevent the error stack from being visible by duplicating the error\n // in a very close way to the original in case both sides are actually\n // instances of Error.\n if (_typeof(actual) === 'object' && actual !== null && _typeof(expected) === 'object' && expected !== null && 'stack' in actual && actual instanceof Error && 'stack' in expected && expected instanceof Error) {\n actual = copyError(actual);\n expected = copyError(expected);\n }\n if (operator === 'deepStrictEqual' || operator === 'strictEqual') {\n _this = _super.call(this, createErrDiff(actual, expected, operator));\n } else if (operator === 'notDeepStrictEqual' || operator === 'notStrictEqual') {\n // In case the objects are equal but the operator requires unequal, show\n // the first object and say A equals B\n var base = kReadableOperator[operator];\n var res = inspectValue(actual).split('\\n');\n\n // In case \"actual\" is an object, it should not be reference equal.\n if (operator === 'notStrictEqual' && _typeof(actual) === 'object' && actual !== null) {\n base = kReadableOperator.notStrictEqualObject;\n }\n\n // Only remove lines in case it makes sense to collapse those.\n // TODO: Accept env to always show the full error.\n if (res.length > 30) {\n res[26] = \"\".concat(blue, \"...\").concat(white);\n while (res.length > 27) {\n res.pop();\n }\n }\n\n // Only print a single input.\n if (res.length === 1) {\n _this = _super.call(this, \"\".concat(base, \" \").concat(res[0]));\n } else {\n _this = _super.call(this, \"\".concat(base, \"\\n\\n\").concat(res.join('\\n'), \"\\n\"));\n }\n } else {\n var _res = inspectValue(actual);\n var other = '';\n var knownOperators = kReadableOperator[operator];\n if (operator === 'notDeepEqual' || operator === 'notEqual') {\n _res = \"\".concat(kReadableOperator[operator], \"\\n\\n\").concat(_res);\n if (_res.length > 1024) {\n _res = \"\".concat(_res.slice(0, 1021), \"...\");\n }\n } else {\n other = \"\".concat(inspectValue(expected));\n if (_res.length > 512) {\n _res = \"\".concat(_res.slice(0, 509), \"...\");\n }\n if (other.length > 512) {\n other = \"\".concat(other.slice(0, 509), \"...\");\n }\n if (operator === 'deepEqual' || operator === 'equal') {\n _res = \"\".concat(knownOperators, \"\\n\\n\").concat(_res, \"\\n\\nshould equal\\n\\n\");\n } else {\n other = \" \".concat(operator, \" \").concat(other);\n }\n }\n _this = _super.call(this, \"\".concat(_res).concat(other));\n }\n }\n Error.stackTraceLimit = limit;\n _this.generatedMessage = !message;\n Object.defineProperty(_assertThisInitialized(_this), 'name', {\n value: 'AssertionError [ERR_ASSERTION]',\n enumerable: false,\n writable: true,\n configurable: true\n });\n _this.code = 'ERR_ASSERTION';\n _this.actual = actual;\n _this.expected = expected;\n _this.operator = operator;\n if (Error.captureStackTrace) {\n // eslint-disable-next-line no-restricted-syntax\n Error.captureStackTrace(_assertThisInitialized(_this), stackStartFn);\n }\n // Create error message including the error code in the name.\n _this.stack;\n // Reset the name.\n _this.name = 'AssertionError';\n return _possibleConstructorReturn(_this);\n }\n _createClass(AssertionError, [{\n key: \"toString\",\n value: function toString() {\n return \"\".concat(this.name, \" [\").concat(this.code, \"]: \").concat(this.message);\n }\n }, {\n key: _inspect$custom,\n value: function value(recurseTimes, ctx) {\n // This limits the `actual` and `expected` property default inspection to\n // the minimum depth. Otherwise those values would be too verbose compared\n // to the actual error message which contains a combined view of these two\n // input values.\n return inspect(this, _objectSpread(_objectSpread({}, ctx), {}, {\n customInspect: false,\n depth: 0\n }));\n }\n }]);\n return AssertionError;\n}( /*#__PURE__*/_wrapNativeSuper(Error), inspect.custom);\nmodule.exports = AssertionError;","// Currently in sync with Node.js lib/internal/errors.js\n// https://github.com/nodejs/node/commit/3b044962c48fe313905877a96b5d0894a5404f6f\n\n/* eslint node-core/documented-errors: \"error\" */\n/* eslint node-core/alphabetize-errors: \"error\" */\n/* eslint node-core/prefer-util-format-errors: \"error\" */\n\n'use strict';\n\n// The whole point behind this internal module is to allow Node.js to no\n// longer be forced to treat every error message change as a semver-major\n// change. The NodeError classes here all expose a `code` property whose\n// value statically and permanently identifies the error. While the error\n// message may change, the code should not.\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, \"prototype\", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } else if (call !== void 0) { throw new TypeError(\"Derived constructors may only return object or undefined\"); } return _assertThisInitialized(self); }\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\nvar codes = {};\n\n// Lazy loaded\nvar assert;\nvar util;\nfunction createErrorType(code, message, Base) {\n if (!Base) {\n Base = Error;\n }\n function getMessage(arg1, arg2, arg3) {\n if (typeof message === 'string') {\n return message;\n } else {\n return message(arg1, arg2, arg3);\n }\n }\n var NodeError = /*#__PURE__*/function (_Base) {\n _inherits(NodeError, _Base);\n var _super = _createSuper(NodeError);\n function NodeError(arg1, arg2, arg3) {\n var _this;\n _classCallCheck(this, NodeError);\n _this = _super.call(this, getMessage(arg1, arg2, arg3));\n _this.code = code;\n return _this;\n }\n return _createClass(NodeError);\n }(Base);\n codes[code] = NodeError;\n}\n\n// https://github.com/nodejs/node/blob/v10.8.0/lib/internal/errors.js\nfunction oneOf(expected, thing) {\n if (Array.isArray(expected)) {\n var len = expected.length;\n expected = expected.map(function (i) {\n return String(i);\n });\n if (len > 2) {\n return \"one of \".concat(thing, \" \").concat(expected.slice(0, len - 1).join(', '), \", or \") + expected[len - 1];\n } else if (len === 2) {\n return \"one of \".concat(thing, \" \").concat(expected[0], \" or \").concat(expected[1]);\n } else {\n return \"of \".concat(thing, \" \").concat(expected[0]);\n }\n } else {\n return \"of \".concat(thing, \" \").concat(String(expected));\n }\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith\nfunction startsWith(str, search, pos) {\n return str.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search;\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith\nfunction endsWith(str, search, this_len) {\n if (this_len === undefined || this_len > str.length) {\n this_len = str.length;\n }\n return str.substring(this_len - search.length, this_len) === search;\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes\nfunction includes(str, search, start) {\n if (typeof start !== 'number') {\n start = 0;\n }\n if (start + search.length > str.length) {\n return false;\n } else {\n return str.indexOf(search, start) !== -1;\n }\n}\ncreateErrorType('ERR_AMBIGUOUS_ARGUMENT', 'The \"%s\" argument is ambiguous. %s', TypeError);\ncreateErrorType('ERR_INVALID_ARG_TYPE', function (name, expected, actual) {\n if (assert === undefined) assert = require('../assert');\n assert(typeof name === 'string', \"'name' must be a string\");\n\n // determiner: 'must be' or 'must not be'\n var determiner;\n if (typeof expected === 'string' && startsWith(expected, 'not ')) {\n determiner = 'must not be';\n expected = expected.replace(/^not /, '');\n } else {\n determiner = 'must be';\n }\n var msg;\n if (endsWith(name, ' argument')) {\n // For cases like 'first argument'\n msg = \"The \".concat(name, \" \").concat(determiner, \" \").concat(oneOf(expected, 'type'));\n } else {\n var type = includes(name, '.') ? 'property' : 'argument';\n msg = \"The \\\"\".concat(name, \"\\\" \").concat(type, \" \").concat(determiner, \" \").concat(oneOf(expected, 'type'));\n }\n\n // TODO(BridgeAR): Improve the output by showing `null` and similar.\n msg += \". Received type \".concat(_typeof(actual));\n return msg;\n}, TypeError);\ncreateErrorType('ERR_INVALID_ARG_VALUE', function (name, value) {\n var reason = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'is invalid';\n if (util === undefined) util = require('util/');\n var inspected = util.inspect(value);\n if (inspected.length > 128) {\n inspected = \"\".concat(inspected.slice(0, 128), \"...\");\n }\n return \"The argument '\".concat(name, \"' \").concat(reason, \". Received \").concat(inspected);\n}, TypeError, RangeError);\ncreateErrorType('ERR_INVALID_RETURN_VALUE', function (input, name, value) {\n var type;\n if (value && value.constructor && value.constructor.name) {\n type = \"instance of \".concat(value.constructor.name);\n } else {\n type = \"type \".concat(_typeof(value));\n }\n return \"Expected \".concat(input, \" to be returned from the \\\"\").concat(name, \"\\\"\") + \" function but got \".concat(type, \".\");\n}, TypeError);\ncreateErrorType('ERR_MISSING_ARGS', function () {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n if (assert === undefined) assert = require('../assert');\n assert(args.length > 0, 'At least one arg needs to be specified');\n var msg = 'The ';\n var len = args.length;\n args = args.map(function (a) {\n return \"\\\"\".concat(a, \"\\\"\");\n });\n switch (len) {\n case 1:\n msg += \"\".concat(args[0], \" argument\");\n break;\n case 2:\n msg += \"\".concat(args[0], \" and \").concat(args[1], \" arguments\");\n break;\n default:\n msg += args.slice(0, len - 1).join(', ');\n msg += \", and \".concat(args[len - 1], \" arguments\");\n break;\n }\n return \"\".concat(msg, \" must be specified\");\n}, TypeError);\nmodule.exports.codes = codes;","// Currently in sync with Node.js lib/internal/util/comparisons.js\n// https://github.com/nodejs/node/commit/112cc7c27551254aa2b17098fb774867f05ed0d9\n\n'use strict';\n\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nvar regexFlagsSupported = /a/g.flags !== undefined;\nvar arrayFromSet = function arrayFromSet(set) {\n var array = [];\n set.forEach(function (value) {\n return array.push(value);\n });\n return array;\n};\nvar arrayFromMap = function arrayFromMap(map) {\n var array = [];\n map.forEach(function (value, key) {\n return array.push([key, value]);\n });\n return array;\n};\nvar objectIs = Object.is ? Object.is : require('object-is');\nvar objectGetOwnPropertySymbols = Object.getOwnPropertySymbols ? Object.getOwnPropertySymbols : function () {\n return [];\n};\nvar numberIsNaN = Number.isNaN ? Number.isNaN : require('is-nan');\nfunction uncurryThis(f) {\n return f.call.bind(f);\n}\nvar hasOwnProperty = uncurryThis(Object.prototype.hasOwnProperty);\nvar propertyIsEnumerable = uncurryThis(Object.prototype.propertyIsEnumerable);\nvar objectToString = uncurryThis(Object.prototype.toString);\nvar _require$types = require('util/').types,\n isAnyArrayBuffer = _require$types.isAnyArrayBuffer,\n isArrayBufferView = _require$types.isArrayBufferView,\n isDate = _require$types.isDate,\n isMap = _require$types.isMap,\n isRegExp = _require$types.isRegExp,\n isSet = _require$types.isSet,\n isNativeError = _require$types.isNativeError,\n isBoxedPrimitive = _require$types.isBoxedPrimitive,\n isNumberObject = _require$types.isNumberObject,\n isStringObject = _require$types.isStringObject,\n isBooleanObject = _require$types.isBooleanObject,\n isBigIntObject = _require$types.isBigIntObject,\n isSymbolObject = _require$types.isSymbolObject,\n isFloat32Array = _require$types.isFloat32Array,\n isFloat64Array = _require$types.isFloat64Array;\nfunction isNonIndex(key) {\n if (key.length === 0 || key.length > 10) return true;\n for (var i = 0; i < key.length; i++) {\n var code = key.charCodeAt(i);\n if (code < 48 || code > 57) return true;\n }\n // The maximum size for an array is 2 ** 32 -1.\n return key.length === 10 && key >= Math.pow(2, 32);\n}\nfunction getOwnNonIndexProperties(value) {\n return Object.keys(value).filter(isNonIndex).concat(objectGetOwnPropertySymbols(value).filter(Object.prototype.propertyIsEnumerable.bind(value)));\n}\n\n// Taken from https://github.com/feross/buffer/blob/680e9e5e488f22aac27599a57dc844a6315928dd/index.js\n// original notice:\n/*!\n * The buffer module from node.js, for the browser.\n *\n * @author Feross Aboukhadijeh \n * @license MIT\n */\nfunction compare(a, b) {\n if (a === b) {\n return 0;\n }\n var x = a.length;\n var y = b.length;\n for (var i = 0, len = Math.min(x, y); i < len; ++i) {\n if (a[i] !== b[i]) {\n x = a[i];\n y = b[i];\n break;\n }\n }\n if (x < y) {\n return -1;\n }\n if (y < x) {\n return 1;\n }\n return 0;\n}\nvar ONLY_ENUMERABLE = undefined;\nvar kStrict = true;\nvar kLoose = false;\nvar kNoIterator = 0;\nvar kIsArray = 1;\nvar kIsSet = 2;\nvar kIsMap = 3;\n\n// Check if they have the same source and flags\nfunction areSimilarRegExps(a, b) {\n return regexFlagsSupported ? a.source === b.source && a.flags === b.flags : RegExp.prototype.toString.call(a) === RegExp.prototype.toString.call(b);\n}\nfunction areSimilarFloatArrays(a, b) {\n if (a.byteLength !== b.byteLength) {\n return false;\n }\n for (var offset = 0; offset < a.byteLength; offset++) {\n if (a[offset] !== b[offset]) {\n return false;\n }\n }\n return true;\n}\nfunction areSimilarTypedArrays(a, b) {\n if (a.byteLength !== b.byteLength) {\n return false;\n }\n return compare(new Uint8Array(a.buffer, a.byteOffset, a.byteLength), new Uint8Array(b.buffer, b.byteOffset, b.byteLength)) === 0;\n}\nfunction areEqualArrayBuffers(buf1, buf2) {\n return buf1.byteLength === buf2.byteLength && compare(new Uint8Array(buf1), new Uint8Array(buf2)) === 0;\n}\nfunction isEqualBoxedPrimitive(val1, val2) {\n if (isNumberObject(val1)) {\n return isNumberObject(val2) && objectIs(Number.prototype.valueOf.call(val1), Number.prototype.valueOf.call(val2));\n }\n if (isStringObject(val1)) {\n return isStringObject(val2) && String.prototype.valueOf.call(val1) === String.prototype.valueOf.call(val2);\n }\n if (isBooleanObject(val1)) {\n return isBooleanObject(val2) && Boolean.prototype.valueOf.call(val1) === Boolean.prototype.valueOf.call(val2);\n }\n if (isBigIntObject(val1)) {\n return isBigIntObject(val2) && BigInt.prototype.valueOf.call(val1) === BigInt.prototype.valueOf.call(val2);\n }\n return isSymbolObject(val2) && Symbol.prototype.valueOf.call(val1) === Symbol.prototype.valueOf.call(val2);\n}\n\n// Notes: Type tags are historical [[Class]] properties that can be set by\n// FunctionTemplate::SetClassName() in C++ or Symbol.toStringTag in JS\n// and retrieved using Object.prototype.toString.call(obj) in JS\n// See https://tc39.github.io/ecma262/#sec-object.prototype.tostring\n// for a list of tags pre-defined in the spec.\n// There are some unspecified tags in the wild too (e.g. typed array tags).\n// Since tags can be altered, they only serve fast failures\n//\n// Typed arrays and buffers are checked by comparing the content in their\n// underlying ArrayBuffer. This optimization requires that it's\n// reasonable to interpret their underlying memory in the same way,\n// which is checked by comparing their type tags.\n// (e.g. a Uint8Array and a Uint16Array with the same memory content\n// could still be different because they will be interpreted differently).\n//\n// For strict comparison, objects should have\n// a) The same built-in type tags\n// b) The same prototypes.\n\nfunction innerDeepEqual(val1, val2, strict, memos) {\n // All identical values are equivalent, as determined by ===.\n if (val1 === val2) {\n if (val1 !== 0) return true;\n return strict ? objectIs(val1, val2) : true;\n }\n\n // Check more closely if val1 and val2 are equal.\n if (strict) {\n if (_typeof(val1) !== 'object') {\n return typeof val1 === 'number' && numberIsNaN(val1) && numberIsNaN(val2);\n }\n if (_typeof(val2) !== 'object' || val1 === null || val2 === null) {\n return false;\n }\n if (Object.getPrototypeOf(val1) !== Object.getPrototypeOf(val2)) {\n return false;\n }\n } else {\n if (val1 === null || _typeof(val1) !== 'object') {\n if (val2 === null || _typeof(val2) !== 'object') {\n // eslint-disable-next-line eqeqeq\n return val1 == val2;\n }\n return false;\n }\n if (val2 === null || _typeof(val2) !== 'object') {\n return false;\n }\n }\n var val1Tag = objectToString(val1);\n var val2Tag = objectToString(val2);\n if (val1Tag !== val2Tag) {\n return false;\n }\n if (Array.isArray(val1)) {\n // Check for sparse arrays and general fast path\n if (val1.length !== val2.length) {\n return false;\n }\n var keys1 = getOwnNonIndexProperties(val1, ONLY_ENUMERABLE);\n var keys2 = getOwnNonIndexProperties(val2, ONLY_ENUMERABLE);\n if (keys1.length !== keys2.length) {\n return false;\n }\n return keyCheck(val1, val2, strict, memos, kIsArray, keys1);\n }\n // [browserify] This triggers on certain types in IE (Map/Set) so we don't\n // wan't to early return out of the rest of the checks. However we can check\n // if the second value is one of these values and the first isn't.\n if (val1Tag === '[object Object]') {\n // return keyCheck(val1, val2, strict, memos, kNoIterator);\n if (!isMap(val1) && isMap(val2) || !isSet(val1) && isSet(val2)) {\n return false;\n }\n }\n if (isDate(val1)) {\n if (!isDate(val2) || Date.prototype.getTime.call(val1) !== Date.prototype.getTime.call(val2)) {\n return false;\n }\n } else if (isRegExp(val1)) {\n if (!isRegExp(val2) || !areSimilarRegExps(val1, val2)) {\n return false;\n }\n } else if (isNativeError(val1) || val1 instanceof Error) {\n // Do not compare the stack as it might differ even though the error itself\n // is otherwise identical.\n if (val1.message !== val2.message || val1.name !== val2.name) {\n return false;\n }\n } else if (isArrayBufferView(val1)) {\n if (!strict && (isFloat32Array(val1) || isFloat64Array(val1))) {\n if (!areSimilarFloatArrays(val1, val2)) {\n return false;\n }\n } else if (!areSimilarTypedArrays(val1, val2)) {\n return false;\n }\n // Buffer.compare returns true, so val1.length === val2.length. If they both\n // only contain numeric keys, we don't need to exam further than checking\n // the symbols.\n var _keys = getOwnNonIndexProperties(val1, ONLY_ENUMERABLE);\n var _keys2 = getOwnNonIndexProperties(val2, ONLY_ENUMERABLE);\n if (_keys.length !== _keys2.length) {\n return false;\n }\n return keyCheck(val1, val2, strict, memos, kNoIterator, _keys);\n } else if (isSet(val1)) {\n if (!isSet(val2) || val1.size !== val2.size) {\n return false;\n }\n return keyCheck(val1, val2, strict, memos, kIsSet);\n } else if (isMap(val1)) {\n if (!isMap(val2) || val1.size !== val2.size) {\n return false;\n }\n return keyCheck(val1, val2, strict, memos, kIsMap);\n } else if (isAnyArrayBuffer(val1)) {\n if (!areEqualArrayBuffers(val1, val2)) {\n return false;\n }\n } else if (isBoxedPrimitive(val1) && !isEqualBoxedPrimitive(val1, val2)) {\n return false;\n }\n return keyCheck(val1, val2, strict, memos, kNoIterator);\n}\nfunction getEnumerables(val, keys) {\n return keys.filter(function (k) {\n return propertyIsEnumerable(val, k);\n });\n}\nfunction keyCheck(val1, val2, strict, memos, iterationType, aKeys) {\n // For all remaining Object pairs, including Array, objects and Maps,\n // equivalence is determined by having:\n // a) The same number of owned enumerable properties\n // b) The same set of keys/indexes (although not necessarily the same order)\n // c) Equivalent values for every corresponding key/index\n // d) For Sets and Maps, equal contents\n // Note: this accounts for both named and indexed properties on Arrays.\n if (arguments.length === 5) {\n aKeys = Object.keys(val1);\n var bKeys = Object.keys(val2);\n\n // The pair must have the same number of owned properties.\n if (aKeys.length !== bKeys.length) {\n return false;\n }\n }\n\n // Cheap key test\n var i = 0;\n for (; i < aKeys.length; i++) {\n if (!hasOwnProperty(val2, aKeys[i])) {\n return false;\n }\n }\n if (strict && arguments.length === 5) {\n var symbolKeysA = objectGetOwnPropertySymbols(val1);\n if (symbolKeysA.length !== 0) {\n var count = 0;\n for (i = 0; i < symbolKeysA.length; i++) {\n var key = symbolKeysA[i];\n if (propertyIsEnumerable(val1, key)) {\n if (!propertyIsEnumerable(val2, key)) {\n return false;\n }\n aKeys.push(key);\n count++;\n } else if (propertyIsEnumerable(val2, key)) {\n return false;\n }\n }\n var symbolKeysB = objectGetOwnPropertySymbols(val2);\n if (symbolKeysA.length !== symbolKeysB.length && getEnumerables(val2, symbolKeysB).length !== count) {\n return false;\n }\n } else {\n var _symbolKeysB = objectGetOwnPropertySymbols(val2);\n if (_symbolKeysB.length !== 0 && getEnumerables(val2, _symbolKeysB).length !== 0) {\n return false;\n }\n }\n }\n if (aKeys.length === 0 && (iterationType === kNoIterator || iterationType === kIsArray && val1.length === 0 || val1.size === 0)) {\n return true;\n }\n\n // Use memos to handle cycles.\n if (memos === undefined) {\n memos = {\n val1: new Map(),\n val2: new Map(),\n position: 0\n };\n } else {\n // We prevent up to two map.has(x) calls by directly retrieving the value\n // and checking for undefined. The map can only contain numbers, so it is\n // safe to check for undefined only.\n var val2MemoA = memos.val1.get(val1);\n if (val2MemoA !== undefined) {\n var val2MemoB = memos.val2.get(val2);\n if (val2MemoB !== undefined) {\n return val2MemoA === val2MemoB;\n }\n }\n memos.position++;\n }\n memos.val1.set(val1, memos.position);\n memos.val2.set(val2, memos.position);\n var areEq = objEquiv(val1, val2, strict, aKeys, memos, iterationType);\n memos.val1.delete(val1);\n memos.val2.delete(val2);\n return areEq;\n}\nfunction setHasEqualElement(set, val1, strict, memo) {\n // Go looking.\n var setValues = arrayFromSet(set);\n for (var i = 0; i < setValues.length; i++) {\n var val2 = setValues[i];\n if (innerDeepEqual(val1, val2, strict, memo)) {\n // Remove the matching element to make sure we do not check that again.\n set.delete(val2);\n return true;\n }\n }\n return false;\n}\n\n// See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness#Loose_equality_using\n// Sadly it is not possible to detect corresponding values properly in case the\n// type is a string, number, bigint or boolean. The reason is that those values\n// can match lots of different string values (e.g., 1n == '+00001').\nfunction findLooseMatchingPrimitives(prim) {\n switch (_typeof(prim)) {\n case 'undefined':\n return null;\n case 'object':\n // Only pass in null as object!\n return undefined;\n case 'symbol':\n return false;\n case 'string':\n prim = +prim;\n // Loose equal entries exist only if the string is possible to convert to\n // a regular number and not NaN.\n // Fall through\n case 'number':\n if (numberIsNaN(prim)) {\n return false;\n }\n }\n return true;\n}\nfunction setMightHaveLoosePrim(a, b, prim) {\n var altValue = findLooseMatchingPrimitives(prim);\n if (altValue != null) return altValue;\n return b.has(altValue) && !a.has(altValue);\n}\nfunction mapMightHaveLoosePrim(a, b, prim, item, memo) {\n var altValue = findLooseMatchingPrimitives(prim);\n if (altValue != null) {\n return altValue;\n }\n var curB = b.get(altValue);\n if (curB === undefined && !b.has(altValue) || !innerDeepEqual(item, curB, false, memo)) {\n return false;\n }\n return !a.has(altValue) && innerDeepEqual(item, curB, false, memo);\n}\nfunction setEquiv(a, b, strict, memo) {\n // This is a lazily initiated Set of entries which have to be compared\n // pairwise.\n var set = null;\n var aValues = arrayFromSet(a);\n for (var i = 0; i < aValues.length; i++) {\n var val = aValues[i];\n // Note: Checking for the objects first improves the performance for object\n // heavy sets but it is a minor slow down for primitives. As they are fast\n // to check this improves the worst case scenario instead.\n if (_typeof(val) === 'object' && val !== null) {\n if (set === null) {\n set = new Set();\n }\n // If the specified value doesn't exist in the second set its an not null\n // object (or non strict only: a not matching primitive) we'll need to go\n // hunting for something thats deep-(strict-)equal to it. To make this\n // O(n log n) complexity we have to copy these values in a new set first.\n set.add(val);\n } else if (!b.has(val)) {\n if (strict) return false;\n\n // Fast path to detect missing string, symbol, undefined and null values.\n if (!setMightHaveLoosePrim(a, b, val)) {\n return false;\n }\n if (set === null) {\n set = new Set();\n }\n set.add(val);\n }\n }\n if (set !== null) {\n var bValues = arrayFromSet(b);\n for (var _i = 0; _i < bValues.length; _i++) {\n var _val = bValues[_i];\n // We have to check if a primitive value is already\n // matching and only if it's not, go hunting for it.\n if (_typeof(_val) === 'object' && _val !== null) {\n if (!setHasEqualElement(set, _val, strict, memo)) return false;\n } else if (!strict && !a.has(_val) && !setHasEqualElement(set, _val, strict, memo)) {\n return false;\n }\n }\n return set.size === 0;\n }\n return true;\n}\nfunction mapHasEqualEntry(set, map, key1, item1, strict, memo) {\n // To be able to handle cases like:\n // Map([[{}, 'a'], [{}, 'b']]) vs Map([[{}, 'b'], [{}, 'a']])\n // ... we need to consider *all* matching keys, not just the first we find.\n var setValues = arrayFromSet(set);\n for (var i = 0; i < setValues.length; i++) {\n var key2 = setValues[i];\n if (innerDeepEqual(key1, key2, strict, memo) && innerDeepEqual(item1, map.get(key2), strict, memo)) {\n set.delete(key2);\n return true;\n }\n }\n return false;\n}\nfunction mapEquiv(a, b, strict, memo) {\n var set = null;\n var aEntries = arrayFromMap(a);\n for (var i = 0; i < aEntries.length; i++) {\n var _aEntries$i = _slicedToArray(aEntries[i], 2),\n key = _aEntries$i[0],\n item1 = _aEntries$i[1];\n if (_typeof(key) === 'object' && key !== null) {\n if (set === null) {\n set = new Set();\n }\n set.add(key);\n } else {\n // By directly retrieving the value we prevent another b.has(key) check in\n // almost all possible cases.\n var item2 = b.get(key);\n if (item2 === undefined && !b.has(key) || !innerDeepEqual(item1, item2, strict, memo)) {\n if (strict) return false;\n // Fast path to detect missing string, symbol, undefined and null\n // keys.\n if (!mapMightHaveLoosePrim(a, b, key, item1, memo)) return false;\n if (set === null) {\n set = new Set();\n }\n set.add(key);\n }\n }\n }\n if (set !== null) {\n var bEntries = arrayFromMap(b);\n for (var _i2 = 0; _i2 < bEntries.length; _i2++) {\n var _bEntries$_i = _slicedToArray(bEntries[_i2], 2),\n _key = _bEntries$_i[0],\n item = _bEntries$_i[1];\n if (_typeof(_key) === 'object' && _key !== null) {\n if (!mapHasEqualEntry(set, a, _key, item, strict, memo)) return false;\n } else if (!strict && (!a.has(_key) || !innerDeepEqual(a.get(_key), item, false, memo)) && !mapHasEqualEntry(set, a, _key, item, false, memo)) {\n return false;\n }\n }\n return set.size === 0;\n }\n return true;\n}\nfunction objEquiv(a, b, strict, keys, memos, iterationType) {\n // Sets and maps don't have their entries accessible via normal object\n // properties.\n var i = 0;\n if (iterationType === kIsSet) {\n if (!setEquiv(a, b, strict, memos)) {\n return false;\n }\n } else if (iterationType === kIsMap) {\n if (!mapEquiv(a, b, strict, memos)) {\n return false;\n }\n } else if (iterationType === kIsArray) {\n for (; i < a.length; i++) {\n if (hasOwnProperty(a, i)) {\n if (!hasOwnProperty(b, i) || !innerDeepEqual(a[i], b[i], strict, memos)) {\n return false;\n }\n } else if (hasOwnProperty(b, i)) {\n return false;\n } else {\n // Array is sparse.\n var keysA = Object.keys(a);\n for (; i < keysA.length; i++) {\n var key = keysA[i];\n if (!hasOwnProperty(b, key) || !innerDeepEqual(a[key], b[key], strict, memos)) {\n return false;\n }\n }\n if (keysA.length !== Object.keys(b).length) {\n return false;\n }\n return true;\n }\n }\n }\n\n // The pair must have equivalent values for every corresponding key.\n // Possibly expensive deep test:\n for (i = 0; i < keys.length; i++) {\n var _key2 = keys[i];\n if (!innerDeepEqual(a[_key2], b[_key2], strict, memos)) {\n return false;\n }\n }\n return true;\n}\nfunction isDeepEqual(val1, val2) {\n return innerDeepEqual(val1, val2, kLoose);\n}\nfunction isDeepStrictEqual(val1, val2) {\n return innerDeepEqual(val1, val2, kStrict);\n}\nmodule.exports = {\n isDeepEqual: isDeepEqual,\n isDeepStrictEqual: isDeepStrictEqual\n};","import PropTypes from 'prop-types';\n\nexport const privatePropTypes = {\n _dashprivate_transformConfig: PropTypes.func,\n _dashprivate_transformFigure: PropTypes.func,\n _dashprivate_onFigureModified: PropTypes.func,\n};\n\nexport const privateDefaultProps = {\n _dashprivate_transformConfig: c => c,\n _dashprivate_transformFigure: f => f,\n _dashprivate_onFigureModified: f => f,\n};\n","import React, {Component, memo, Suspense} from 'react';\nimport PropTypes from 'prop-types';\n\nimport {asyncDecorator} from '@plotly/dash-component-plugins';\nimport graph from '../utils/LazyLoader/graph';\nimport plotly from '../utils/LazyLoader/plotly';\nimport lazyLoadMathJax from '../utils/LazyLoader/third-party/mathjax';\nimport {\n privatePropTypes,\n privateDefaultProps,\n} from '../fragments/Graph.privateprops';\n\nconst EMPTY_DATA = [];\n\n/**\n * Graph can be used to render any plotly.js-powered data visualization.\n *\n * You can define callbacks based on user interaction with Graphs such as\n * hovering, clicking or selecting\n */\nclass PlotlyGraph extends Component {\n constructor(props) {\n super(props);\n\n if (props.mathjax) {\n PlotlyGraph._loadMathjax = true;\n }\n\n this.state = {\n prependData: [],\n extendData: [],\n };\n\n this.clearState = this.clearState.bind(this);\n }\n\n componentDidMount() {\n if (this.props.prependData) {\n this.setState({\n prependData: [this.props.prependData],\n });\n }\n if (this.props.extendData) {\n this.setState({\n extendData: [this.props.extendData],\n });\n }\n }\n\n componentWillUnmount() {\n this.setState({\n prependData: [],\n extendData: [],\n });\n }\n\n UNSAFE_componentWillReceiveProps(nextProps) {\n let prependData = this.state.prependData.slice(0);\n\n if (this.props.figure !== nextProps.figure) {\n prependData = EMPTY_DATA;\n }\n\n if (\n nextProps.prependData &&\n this.props.prependData !== nextProps.prependData\n ) {\n prependData.push(nextProps.prependData);\n } else {\n prependData = EMPTY_DATA;\n }\n\n if (prependData !== EMPTY_DATA) {\n this.setState({\n prependData,\n });\n }\n\n let extendData = this.state.extendData.slice(0);\n\n if (this.props.figure !== nextProps.figure) {\n extendData = EMPTY_DATA;\n }\n\n if (\n nextProps.extendData &&\n this.props.extendData !== nextProps.extendData\n ) {\n extendData.push(nextProps.extendData);\n } else {\n extendData = EMPTY_DATA;\n }\n\n if (extendData !== EMPTY_DATA) {\n this.setState({\n extendData,\n });\n }\n }\n\n clearState(dataKey) {\n this.setState(props => {\n var data = props[dataKey];\n const res =\n data && data.length\n ? {\n [dataKey]: EMPTY_DATA,\n }\n : undefined;\n\n return res;\n });\n }\n\n render() {\n return (\n \n );\n }\n}\n\nconst RealPlotlyGraph = asyncDecorator(PlotlyGraph, () =>\n Promise.all([\n graph(),\n plotly(),\n PlotlyGraph._loadMathjax ? lazyLoadMathJax() : undefined,\n ]).then(([graph]) => graph)\n);\n\nconst ControlledPlotlyGraph = memo(props => {\n const {className, id} = props;\n\n const extendedClassName = className\n ? 'dash-graph ' + className\n : 'dash-graph';\n\n return (\n \n }\n >\n \n \n );\n});\n\nControlledPlotlyGraph.displayName = 'ControlledPlotlyGraph';\n\nPlotlyGraph.propTypes = {\n ...privatePropTypes,\n\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n id: PropTypes.string,\n\n /**\n * If True, the Plotly.js plot will be fully responsive to window resize\n * and parent element resize event. This is achieved by overriding\n * `config.responsive` to True, `figure.layout.autosize` to True and unsetting\n * `figure.layout.height` and `figure.layout.width`.\n * If False, the Plotly.js plot not be responsive to window resize and\n * parent element resize event. This is achieved by overriding `config.responsive`\n * to False and `figure.layout.autosize` to False.\n * If 'auto' (default), the Graph will determine if the Plotly.js plot can be made fully\n * responsive (True) or not (False) based on the values in `config.responsive`,\n * `figure.layout.autosize`, `figure.layout.height`, `figure.layout.width`.\n * This is the legacy behavior of the Graph component.\n *\n * Needs to be combined with appropriate dimension / styling through the `style` prop\n * to fully take effect.\n */\n responsive: PropTypes.oneOf([true, false, 'auto']),\n\n /**\n * Data from latest click event. Read-only.\n */\n clickData: PropTypes.object,\n\n /**\n * Data from latest click annotation event. Read-only.\n */\n clickAnnotationData: PropTypes.object,\n\n /**\n * Data from latest hover event. Read-only.\n */\n hoverData: PropTypes.object,\n\n /**\n * If True, `clear_on_unhover` will clear the `hoverData` property\n * when the user \"unhovers\" from a point.\n * If False, then the `hoverData` property will be equal to the\n * data from the last point that was hovered over.\n */\n clear_on_unhover: PropTypes.bool,\n\n /**\n * Data from latest select event. Read-only.\n */\n selectedData: PropTypes.object,\n\n /**\n * Data from latest relayout event which occurs\n * when the user zooms or pans on the plot or other\n * layout-level edits. Has the form `{: }`\n * describing the changes made. Read-only.\n */\n relayoutData: PropTypes.object,\n\n /**\n * Data that should be appended to existing traces. Has the form\n * `[updateData, traceIndices, maxPoints]`, where `updateData` is an object\n * containing the data to extend, `traceIndices` (optional) is an array of\n * trace indices that should be extended, and `maxPoints` (optional) is\n * either an integer defining the maximum number of points allowed or an\n * object with key:value pairs matching `updateData`\n * Reference the Plotly.extendTraces API for full usage:\n * https://plotly.com/javascript/plotlyjs-function-reference/#plotlyextendtraces\n */\n extendData: PropTypes.oneOfType([PropTypes.array, PropTypes.object]),\n\n /**\n * Data that should be prepended to existing traces. Has the form\n * `[updateData, traceIndices, maxPoints]`, where `updateData` is an object\n * containing the data to prepend, `traceIndices` (optional) is an array of\n * trace indices that should be prepended, and `maxPoints` (optional) is\n * either an integer defining the maximum number of points allowed or an\n * object with key:value pairs matching `updateData`\n * Reference the Plotly.prependTraces API for full usage:\n * https://plotly.com/javascript/plotlyjs-function-reference/#plotlyprependtraces\n */\n prependData: PropTypes.oneOfType([PropTypes.array, PropTypes.object]),\n\n /**\n * Data from latest restyle event which occurs\n * when the user toggles a legend item, changes\n * parcoords selections, or other trace-level edits.\n * Has the form `[edits, indices]`, where `edits` is an object\n * `{: }` describing the changes made,\n * and `indices` is an array of trace indices that were edited.\n * Read-only.\n */\n restyleData: PropTypes.array,\n\n /**\n * Plotly `figure` object. See schema:\n * https://plotly.com/javascript/reference\n *\n * `config` is set separately by the `config` property\n */\n figure: PropTypes.exact({\n data: PropTypes.arrayOf(PropTypes.object),\n layout: PropTypes.object,\n frames: PropTypes.arrayOf(PropTypes.object),\n }),\n\n /**\n * Generic style overrides on the plot div\n */\n style: PropTypes.object,\n\n /**\n * className of the parent div\n */\n className: PropTypes.string,\n\n /**\n * If true, loads mathjax v3 (tex-svg) into the page and use it in the graph\n */\n mathjax: PropTypes.bool,\n\n /**\n * Beta: If true, animate between updates using\n * plotly.js's `animate` function\n */\n animate: PropTypes.bool,\n\n /**\n * Beta: Object containing animation settings.\n * Only applies if `animate` is `true`\n */\n animation_options: PropTypes.object,\n\n /**\n * Plotly.js config options.\n * See https://plotly.com/javascript/configuration-options/\n * for more info.\n */\n config: PropTypes.exact({\n /**\n * No interactivity, for export or image generation\n */\n staticPlot: PropTypes.bool,\n\n /**\n * Base URL for a Plotly cloud instance, if `showSendToCloud` is enabled\n */\n plotlyServerURL: PropTypes.string,\n\n /**\n * We can edit titles, move annotations, etc - sets all pieces of `edits`\n * unless a separate `edits` config item overrides individual parts\n */\n editable: PropTypes.bool,\n\n /**\n * Enables moving selections\n */\n editSelection: PropTypes.bool,\n\n /**\n * A set of editable properties\n */\n edits: PropTypes.exact({\n /**\n * The main anchor of the annotation, which is the\n * text (if no arrow) or the arrow (which drags the whole thing leaving\n * the arrow length & direction unchanged)\n */\n annotationPosition: PropTypes.bool,\n\n /**\n * Just for annotations with arrows, change the length and direction of the arrow\n */\n annotationTail: PropTypes.bool,\n\n annotationText: PropTypes.bool,\n\n axisTitleText: PropTypes.bool,\n\n colorbarPosition: PropTypes.bool,\n\n colorbarTitleText: PropTypes.bool,\n\n legendPosition: PropTypes.bool,\n\n /**\n * Edit the trace name fields from the legend\n */\n legendText: PropTypes.bool,\n\n shapePosition: PropTypes.bool,\n\n /**\n * The global `layout.title`\n */\n titleText: PropTypes.bool,\n }),\n\n /**\n * DO autosize once regardless of layout.autosize\n * (use default width or height values otherwise)\n */\n autosizable: PropTypes.bool,\n\n /**\n * Whether to change layout size when the window size changes\n */\n responsive: PropTypes.bool,\n\n /**\n * Set the length of the undo/redo queue\n */\n queueLength: PropTypes.number,\n\n /**\n * If we DO autosize, do we fill the container or the screen?\n */\n fillFrame: PropTypes.bool,\n\n /**\n * If we DO autosize, set the frame margins in percents of plot size\n */\n frameMargins: PropTypes.number,\n\n /**\n * Mousewheel or two-finger scroll zooms the plot\n */\n scrollZoom: PropTypes.bool,\n\n /**\n * Double click interaction (false, 'reset', 'autosize' or 'reset+autosize')\n */\n doubleClick: PropTypes.oneOf([\n false,\n 'reset',\n 'autosize',\n 'reset+autosize',\n ]),\n\n /**\n * Delay for registering a double-click event in ms. The\n * minimum value is 100 and the maximum value is 1000. By\n * default this is 300.\n */\n doubleClickDelay: PropTypes.number,\n\n /**\n * New users see some hints about interactivity\n */\n showTips: PropTypes.bool,\n\n /**\n * Enable axis pan/zoom drag handles\n */\n showAxisDragHandles: PropTypes.bool,\n\n /**\n * Enable direct range entry at the pan/zoom drag points\n * (drag handles must be enabled above)\n */\n showAxisRangeEntryBoxes: PropTypes.bool,\n\n /**\n * Link to open this plot in plotly\n */\n showLink: PropTypes.bool,\n\n /**\n * If we show a link, does it contain data or just link to a plotly file?\n */\n sendData: PropTypes.bool,\n\n /**\n * Text appearing in the sendData link\n */\n linkText: PropTypes.string,\n\n /**\n * Display the mode bar (true, false, or 'hover')\n */\n displayModeBar: PropTypes.oneOf([true, false, 'hover']),\n\n /**\n * Should we include a modebar button to send this data to a\n * Plotly Cloud instance, linked by `plotlyServerURL`.\n * By default this is false.\n */\n showSendToCloud: PropTypes.bool,\n\n /**\n * Should we show a modebar button to send this data to a\n * Plotly Chart Studio plot. If both this and showSendToCloud\n * are selected, only showEditInChartStudio will be\n * honored. By default this is false.\n */\n showEditInChartStudio: PropTypes.bool,\n\n /**\n * Remove mode bar button by name.\n * All modebar button names at https://github.com/plotly/plotly.js/blob/master/src/components/modebar/buttons.js\n * Common names include:\n * sendDataToCloud;\n * (2D) zoom2d, pan2d, select2d, lasso2d, zoomIn2d, zoomOut2d, autoScale2d, resetScale2d;\n * (Cartesian) hoverClosestCartesian, hoverCompareCartesian;\n * (3D) zoom3d, pan3d, orbitRotation, tableRotation, handleDrag3d, resetCameraDefault3d, resetCameraLastSave3d, hoverClosest3d;\n * (Geo) zoomInGeo, zoomOutGeo, resetGeo, hoverClosestGeo;\n * hoverClosestGl2d, hoverClosestPie, toggleHover, resetViews.\n */\n modeBarButtonsToRemove: PropTypes.array,\n\n /**\n * Add mode bar button using config objects\n */\n modeBarButtonsToAdd: PropTypes.array,\n\n /**\n * Fully custom mode bar buttons as nested array,\n * where the outer arrays represents button groups, and\n * the inner arrays have buttons config objects or names of default buttons\n */\n modeBarButtons: PropTypes.any,\n\n /**\n * Modifications to how the toImage modebar button works\n */\n toImageButtonOptions: PropTypes.exact({\n /**\n * The file format to create\n */\n format: PropTypes.oneOf(['jpeg', 'png', 'webp', 'svg']),\n /**\n * The name given to the downloaded file\n */\n filename: PropTypes.string,\n /**\n * Width of the downloaded file, in px\n */\n width: PropTypes.number,\n /**\n * Height of the downloaded file, in px\n */\n height: PropTypes.number,\n /**\n * Extra resolution to give the file after\n * rendering it with the given width and height\n */\n scale: PropTypes.number,\n }),\n\n /**\n * Add the plotly logo on the end of the mode bar\n */\n displaylogo: PropTypes.bool,\n\n /**\n * Add the plotly logo even with no modebar\n */\n watermark: PropTypes.bool,\n\n /**\n * Increase the pixel ratio for Gl plot images\n */\n plotGlPixelRatio: PropTypes.number,\n\n /**\n * URL to topojson files used in geo charts\n */\n topojsonURL: PropTypes.string,\n\n /**\n * Mapbox access token (required to plot mapbox trace types)\n * If using an Mapbox Atlas server, set this option to '',\n * so that plotly.js won't attempt to authenticate to the public Mapbox server.\n */\n mapboxAccessToken: PropTypes.any,\n\n /**\n * The locale to use. Locales may be provided with the plot\n * (`locales` below) or by loading them on the page, see:\n * https://github.com/plotly/plotly.js/blob/master/dist/README.md#to-include-localization\n */\n locale: PropTypes.string,\n\n /**\n * Localization definitions, if you choose to provide them with the\n * plot rather than registering them globally.\n */\n locales: PropTypes.object,\n\n /**\n * Determines whether or not notifier is displayed\n */\n displayNotifier: PropTypes.bool,\n }),\n\n /**\n * Function that updates the state tree.\n */\n setProps: PropTypes.func,\n};\n\nControlledPlotlyGraph.propTypes = PlotlyGraph.propTypes;\n\nPlotlyGraph.defaultProps = {\n ...privateDefaultProps,\n\n clickData: null,\n clickAnnotationData: null,\n hoverData: null,\n selectedData: null,\n relayoutData: null,\n prependData: null,\n extendData: null,\n restyleData: null,\n figure: {\n data: [],\n layout: {},\n frames: [],\n },\n responsive: 'auto',\n mathjax: false,\n animate: false,\n animation_options: {\n frame: {\n redraw: false,\n },\n transition: {\n duration: 750,\n ease: 'cubic-in-out',\n },\n },\n clear_on_unhover: false,\n config: {},\n};\n\nexport const graphPropTypes = PlotlyGraph.propTypes;\nexport const graphDefaultProps = PlotlyGraph.defaultProps;\n\nexport default PlotlyGraph;\n","export default () => import(/* webpackChunkName: \"graph\" */ '../../fragments/Graph.react');\n\n","export default () => {\n return Promise.resolve(window.Plotly || new Promise((resolve, reject) => {\n /* eslint-disable prefer-const */\n let timeoutId;\n\n const element = document.createElement('script');\n element.src = window._dashPlotlyJSURL;\n element.async = true;\n element.onload = () => {\n clearTimeout(timeoutId);\n resolve();\n };\n element.onerror = (error) => {\n clearTimeout(timeoutId);\n reject(error);\n };\n\n timeoutId = setTimeout(() => {\n element.src = '';\n reject(new Error(`plotly.js did not load after 30 seconds`));\n }, 3 * 10 * 1000);\n\n document.querySelector('body').appendChild(element);\n }));\n}\n","export default () => import(/* webpackChunkName: \"upload\" */ '../../fragments/Upload.react');\n","import PropTypes from 'prop-types';\nimport React, {Component, lazy, Suspense} from 'react';\nimport upload from '../utils/LazyLoader/upload';\n\nconst RealUpload = lazy(upload);\n\n/**\n * Upload components allow your app to accept user-uploaded files via drag'n'drop\n */\nexport default class Upload extends Component {\n render() {\n return (\n \n \n \n );\n }\n}\n\nUpload.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n id: PropTypes.string,\n\n /**\n * The contents of the uploaded file as a binary string\n */\n contents: PropTypes.oneOfType([\n /**\n * If `multiple` is `false`, then the contents will be a string\n */\n PropTypes.string,\n\n /**\n * If `multiple` is `true`, then the contents will be a list of strings\n */\n PropTypes.arrayOf(PropTypes.string),\n ]),\n\n /**\n * The name of the file(s) that was(were) uploaded.\n * Note that this does not include the path of the file\n * (for security reasons).\n */\n filename: PropTypes.oneOfType([\n /**\n * If `multiple` is `false`, then the contents will be a string\n */\n PropTypes.string,\n\n /**\n * If `multiple` is `true`, then the contents will be a list of strings\n */\n PropTypes.arrayOf(PropTypes.string),\n ]),\n\n /**\n * The last modified date of the file that was uploaded in unix time\n * (seconds since 1970).\n */\n last_modified: PropTypes.oneOfType([\n /**\n * If `multiple` is `false`, then the contents will be a number\n */\n PropTypes.number,\n\n /**\n * If `multiple` is `true`, then the contents will be a list of numbers\n */\n PropTypes.arrayOf(PropTypes.number),\n ]),\n\n /**\n * Contents of the upload component\n */\n children: PropTypes.oneOfType([PropTypes.node, PropTypes.string]),\n\n /**\n * Allow specific types of files.\n * See https://github.com/okonet/attr-accept for more information.\n * Keep in mind that mime type determination is not reliable across\n * platforms. CSV files, for example, are reported as text/plain\n * under macOS but as application/vnd.ms-excel under Windows.\n * In some cases there might not be a mime type set at all.\n * See: https://github.com/react-dropzone/react-dropzone/issues/276\n */\n accept: PropTypes.string,\n\n /**\n * Enable/disable the upload component entirely\n */\n disabled: PropTypes.bool,\n\n /**\n * Disallow clicking on the component to open the file dialog\n */\n disable_click: PropTypes.bool,\n\n /**\n * Maximum file size in bytes. If `-1`, then infinite\n */\n max_size: PropTypes.number,\n\n /**\n * Minimum file size in bytes\n */\n min_size: PropTypes.number,\n\n /**\n * Allow dropping multiple files.\n * When true, enables folder drag-and-drop support.\n * The folder hierarchy is preserved in filenames (e.g., 'folder/subfolder/file.txt').\n * Note: Folder drag-and-drop is supported in Chrome, Edge, and Opera.\n */\n multiple: PropTypes.bool,\n\n /**\n * Enable folder selection in the file picker dialog.\n * When true with multiple=True, the file picker allows selecting folders instead of files.\n * Note: When folder selection is enabled, individual files cannot be selected via the button.\n * Use separate Upload components if you need both file and folder selection options.\n * Folder selection is supported in Chrome, Edge, and Opera.\n */\n enable_folder_selection: PropTypes.bool,\n\n /**\n * HTML class name of the component\n */\n className: PropTypes.string,\n\n /**\n * HTML class name of the component while active\n */\n className_active: PropTypes.string,\n\n /**\n * HTML class name of the component if rejected\n */\n className_reject: PropTypes.string,\n\n /**\n * HTML class name of the component if disabled\n */\n className_disabled: PropTypes.string,\n\n /**\n * CSS styles to apply\n */\n style: PropTypes.object,\n\n /**\n * CSS styles to apply while active\n */\n style_active: PropTypes.object,\n\n /**\n * CSS styles if rejected\n */\n style_reject: PropTypes.object,\n\n /**\n * CSS styles if disabled\n */\n style_disabled: PropTypes.object,\n\n /**\n * Dash-supplied function for updating props\n */\n setProps: PropTypes.func,\n};\n\nUpload.defaultProps = {\n disabled: false,\n disable_click: false,\n max_size: -1,\n min_size: 0,\n multiple: false,\n enable_folder_selection: false,\n style: {},\n style_active: {\n borderStyle: 'solid',\n borderColor: '#6c6',\n backgroundColor: '#eee',\n },\n style_disabled: {\n opacity: 0.5,\n },\n style_reject: {\n borderStyle: 'solid',\n borderColor: '#c66',\n backgroundColor: '#eee',\n },\n};\n\nexport const propTypes = Upload.propTypes;\nexport const defaultProps = Upload.defaultProps;\n","import React from 'react';\n\n/**\n * The loading element is used to add `data-dash-is-loading` attribute\n * on html elements. This is used to customize CSS when a component is\n * loading.\n *\n * See: https://dash.plotly.com/loading-states#check-loading-states-from-components\n */\n// eslint-disable-next-line react/prop-types\nfunction LoadingElement({elementType = 'div', ...props}, ref) {\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n\n const givenProps = {\n ...props,\n ref,\n };\n if (loading) {\n givenProps['data-dash-is-loading'] = true;\n }\n\n return React.createElement(elementType, givenProps);\n}\n\nexport default React.forwardRef(LoadingElement);\n","export default () =>\n import(/* webpackChunkName: \"dropdown\" */ '../../fragments/Dropdown');\n","import React, {lazy, Suspense} from 'react';\nimport {DropdownProps, PersistedProps, PersistenceTypes} from '../types';\nimport dropdown from '../utils/LazyLoader/dropdown';\n\nconst RealDropdown = lazy(dropdown);\n\nconst defaultLabels: DropdownProps['labels'] = {\n select_all: 'Select All',\n deselect_all: 'Deselect All',\n selected_count: '{num_selected} selected',\n search: 'Search',\n clear_search: 'Clear search',\n clear_selection: 'Clear selection',\n no_options_found: 'No options found',\n};\n\n/**\n * Dropdown is an interactive dropdown element for selecting one or more\n * items.\n * The values and labels of the dropdown items are specified in the `options`\n * property and the selected item(s) are specified with the `value` property.\n *\n * Use a dropdown when you have many options (more than 5) or when you are\n * constrained for space. Otherwise, you can use RadioItems or a Checklist,\n * which have the benefit of showing the users all of the items at once.\n */\nexport default function Dropdown({\n clearable = true,\n disabled = false,\n multi = false,\n searchable = true,\n labels = defaultLabels,\n optionHeight = 'auto',\n // eslint-disable-next-line no-magic-numbers\n maxHeight = 200,\n closeOnSelect = !multi,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persisted_props = [PersistedProps.value],\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persistence_type = PersistenceTypes.local,\n ...props\n}: DropdownProps) {\n labels = {\n ...defaultLabels,\n ...labels,\n };\n\n return (\n \n \n \n );\n}\n\nDropdown.dashPersistence = {\n persisted_props: [PersistedProps.value],\n persistence_type: PersistenceTypes.local,\n};\n","/**\n * inspired by is-number \n * but significantly simplified and sped up by ignoring number and string constructors\n * ie these return false:\n * new Number(1)\n * new String('1')\n */\n\n'use strict';\n\nvar allBlankCharCodes = require('is-string-blank');\n\nmodule.exports = function(n) {\n var type = typeof n;\n if(type === 'string') {\n var original = n;\n n = +n;\n // whitespace strings cast to zero - filter them out\n if(n===0 && allBlankCharCodes(original)) return false;\n }\n else if(type !== 'number') return false;\n\n return n - n < 1;\n};\n","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n \n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./input.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = function insertAtTop(element) {\n var parent = document.querySelector('head');\n // eslint-disable-next-line no-underscore-dangle\n var lastInsertedElement =\n window._lastElementInsertedByStyleLoader;\n\n if (!lastInsertedElement) {\n parent.insertBefore(element, parent.firstChild);\n } else if (lastInsertedElement.nextSibling) {\n parent.insertBefore(element, lastInsertedElement.nextSibling);\n } else {\n parent.appendChild(element);\n }\n\n // eslint-disable-next-line no-underscore-dangle\n window._lastElementInsertedByStyleLoader = element;\n };\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!./input.css\";\n export default content && content.locals ? content.locals : undefined;\n","import {pick} from 'ramda';\nimport React, {\n InputHTMLAttributes,\n KeyboardEvent,\n KeyboardEventHandler,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport uniqid from 'uniqid';\nimport fastIsNumeric from 'fast-isnumeric';\nimport LoadingElement from '../utils/_LoadingElement';\nimport {\n HTMLInputTypes,\n InputProps,\n PersistedProps,\n PersistenceTypes,\n} from '../types';\nimport './css/input.css';\n\nconst isNumeric = (val: unknown): val is number => fastIsNumeric(val);\nconst convert = (val: unknown) => (isNumeric(val) ? +val : NaN);\n\nconst isEquivalent = (v1: number, v2: number) =>\n v1 === v2 || (isNaN(v1) && isNaN(v2));\n\nconst inputProps = [\n 'type',\n 'placeholder',\n 'inputMode',\n 'autoComplete',\n 'readOnly',\n 'required',\n 'autoFocus',\n 'list',\n 'multiple',\n 'spellCheck',\n 'name',\n 'min',\n 'max',\n 'step',\n 'minLength',\n 'maxLength',\n 'pattern',\n 'size',\n] as const;\n\ntype HTMLInputProps = Extract<\n (typeof inputProps)[number],\n keyof InputHTMLAttributes\n>;\n\n/**\n * A basic HTML input control for entering text, numbers, or passwords.\n *\n * Note that checkbox and radio types are supported through\n * the Checklist and RadioItems component. Dates, times, and file uploads\n * are also supported through separate components.\n */\nfunction Input({\n type = HTMLInputTypes.text,\n inputMode = 'verbatim',\n n_blur = 0,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n n_blur_timestamp = -1,\n n_submit = 0,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n n_submit_timestamp = -1,\n debounce = false,\n step = 'any',\n autoComplete = 'off',\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persisted_props = [PersistedProps.value],\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persistence_type = PersistenceTypes.local,\n disabled,\n ...props\n}: InputProps) {\n const input = useRef(document.createElement('input'));\n const [value, setValue] = useState(props.value);\n const [pendingEvent, setPendingEvent] = useState();\n const inputId = useState(() => uniqid('input-'))[0];\n\n const valprops = type === HTMLInputTypes.number ? {} : {value: value ?? ''};\n let {className} = props;\n className = 'dash-input' + (className ? ` ${className}` : '');\n\n const setPropValue = useCallback(\n (base: InputProps['value'], value: InputProps['value']) => {\n const {setProps} = props;\n base = convert(base);\n value = input.current.checkValidity() ? convert(value) : NaN;\n\n if (!isEquivalent(base, value)) {\n setProps({value});\n }\n },\n [props.setProps]\n );\n\n const onEvent = () => {\n const {value: inputValue} = input.current;\n const valueAsNumber = convert(inputValue);\n if (type === HTMLInputTypes.number) {\n setPropValue(props.value, valueAsNumber ?? value);\n } else {\n const propValue =\n inputValue === '' && props.value === undefined\n ? undefined\n : inputValue;\n props.setProps({value: propValue});\n }\n setPendingEvent(undefined);\n };\n\n const onBlur = useCallback(() => {\n props.setProps({\n n_blur: (n_blur ?? 0) + 1,\n n_blur_timestamp: Date.now(),\n });\n input.current.checkValidity();\n return debounce === true && onEvent();\n }, [n_blur, debounce]);\n\n const onChange = useCallback(() => {\n const {value} = input.current;\n setValue(value);\n }, []);\n\n const onKeyDown: KeyboardEventHandler = useCallback(\n (e: KeyboardEvent) => {\n if (e.key === 'Enter') {\n props.setProps({\n n_submit: (n_submit ?? 0) + 1,\n n_submit_timestamp: Date.now(),\n });\n }\n return debounce === true && e.key === 'Enter' && onEvent();\n },\n [n_submit, debounce]\n );\n\n const setInputValue = useCallback(\n (base: InputProps['value'], value: InputProps['value']) => {\n base = input.current.checkValidity() ? convert(base) : NaN;\n value = convert(value);\n\n if (!isEquivalent(base, value)) {\n if (typeof value === 'undefined') {\n input.current.value = '';\n } else {\n input.current.value = `${value}`;\n }\n }\n },\n []\n );\n\n const debounceEvent = useCallback(\n (seconds = 0.5) => {\n const {value} = input.current;\n window.clearTimeout(pendingEvent);\n setPendingEvent(\n window.setTimeout(() => {\n onEvent();\n }, seconds * 1000)\n );\n\n setValue(value);\n },\n [pendingEvent]\n );\n\n const handleStepperClick = useCallback(\n (direction: 'increment' | 'decrement') => {\n const currentValue = parseFloat(input.current.value) || 0;\n const stepAsNum = parseFloat(step as string) || 1;\n\n // Count decimal places to avoid floating point precision issues\n const decimalPlaces = (stepAsNum.toString().split('.')[1] || '')\n .length;\n\n const newValue =\n direction === 'increment'\n ? currentValue + stepAsNum\n : currentValue - stepAsNum;\n\n // Apply min/max constraints\n let constrainedValue = newValue;\n if (props.min !== null && props.min !== undefined) {\n constrainedValue = Math.max(\n constrainedValue,\n parseFloat(props.min as string)\n );\n }\n if (props.max !== null && props.max !== undefined) {\n constrainedValue = Math.min(\n constrainedValue,\n parseFloat(props.max as string)\n );\n }\n\n // Round to the step's decimal precision\n const roundedValue = parseFloat(\n constrainedValue.toFixed(decimalPlaces)\n );\n\n input.current.value = roundedValue.toString();\n setValue(roundedValue.toString());\n onEvent();\n },\n [step, props.min, props.max, onEvent]\n );\n\n useEffect(() => {\n const {value} = input.current;\n if (pendingEvent || props.value === value) {\n return;\n }\n const valueAsNumber = convert(value);\n setInputValue(valueAsNumber ?? value, props.value);\n if (type !== HTMLInputTypes.number) {\n setValue(props.value);\n }\n }, [props.value, type, pendingEvent]);\n\n useEffect(() => {\n // Skip this effect if the value change came from props update (not user input)\n if (value === props.value) {\n return;\n }\n\n const {selectionStart: cursorPosition} = input.current;\n if (debounce) {\n if (typeof debounce === 'number' && Number.isFinite(debounce)) {\n debounceEvent(debounce);\n }\n if (type !== HTMLInputTypes.number) {\n setTimeout(() => {\n input.current.setSelectionRange(\n cursorPosition,\n cursorPosition\n );\n }, 0);\n }\n } else {\n onEvent();\n }\n }, [value, debounce, type]);\n\n const disabledAsBool = [true, 'disabled', 'DISABLED'].includes(\n disabled ?? false\n );\n\n const pickedInputs = pick(inputProps, {\n ...props,\n type,\n inputMode,\n step,\n autoComplete,\n disabled: disabledAsBool,\n }) as Pick, HTMLInputProps>;\n\n const isNumberInput = type === HTMLInputTypes.number;\n const currentNumericValue = parseFloat(String(value ?? 0)) || 0;\n const minValue = convert(props.min);\n const maxValue = convert(props.max);\n const isDecrementDisabled =\n disabledAsBool || currentNumericValue <= minValue;\n const isIncrementDisabled =\n disabledAsBool || currentNumericValue >= maxValue;\n\n return (\n \n {loadingProps => (\n \n \n {isNumberInput && (\n handleStepperClick('decrement')}\n disabled={isDecrementDisabled}\n aria-controls={props.id || inputId}\n aria-label=\"Decrease value\"\n >\n −\n \n )}\n {isNumberInput && (\n handleStepperClick('increment')}\n disabled={isIncrementDisabled}\n aria-controls={props.id || inputId}\n aria-label=\"Increase value\"\n >\n +\n \n )}\n
\n )}\n \n );\n}\n\nInput.dashPersistence = {\n persisted_props: [PersistedProps.value],\n persistence_type: PersistenceTypes.local,\n};\n\nexport default Input;\n","import React, {useEffect, useMemo} from 'react';\nimport {isNil} from 'ramda';\n\nimport LoadingElement from '../utils/_LoadingElement';\nimport {LinkProps} from '../types';\n\ntype LinkComponentProps = LinkProps & {\n setProps?: (props: Record) => void;\n};\n\n/**\n * Link allows you to create a clickable link within a multi-page app.\n *\n * For links with destinations outside the current app, `html.A` is a better\n * component to use.\n */\nconst Link = ({\n refresh = false,\n scrollToTop = true,\n ...props\n}: LinkComponentProps) => {\n const {className, style, id, href, children, title, target, setProps} =\n props;\n const cleanUrl = window.dash_clientside.clean_url;\n const sanitizedUrl = useMemo(() => {\n return href ? cleanUrl(href) : undefined;\n }, [href]);\n\n const updateLocation = (e: React.MouseEvent) => {\n const hasModifiers = e.metaKey || e.shiftKey || e.altKey || e.ctrlKey;\n\n if (hasModifiers) {\n return;\n }\n if (target !== '_self' && !isNil(target)) {\n return;\n }\n // prevent anchor from updating location\n e.preventDefault();\n if (refresh) {\n window.location.href = sanitizedUrl as string;\n } else {\n window.history.pushState({}, '', sanitizedUrl);\n window.dispatchEvent(new CustomEvent('_dashprivate_pushstate'));\n }\n if (scrollToTop) {\n window.scrollTo(0, 0);\n }\n };\n\n useEffect(() => {\n if (sanitizedUrl && sanitizedUrl !== href) {\n setProps?.({\n _dash_error: new Error(`Dangerous link detected:: ${href}`),\n });\n }\n }, [href, sanitizedUrl]);\n\n return (\n \n {loadingProps => (\n \n {isNil(children) ? sanitizedUrl : children}\n \n )}\n \n );\n};\n\nexport default Link;\n","import React, {ButtonHTMLAttributes, DetailedHTMLProps} from 'react';\nimport {BaseDashProps, DashComponent} from '@dash-renderer/types';\n\nexport enum PersistenceTypes {\n 'local' = 'local',\n 'session' = 'session',\n 'memory' = 'memory',\n}\n\nexport enum PersistedProps {\n 'value' = 'value',\n 'date' = 'date',\n 'start_date' = 'start_date',\n 'end_date' = 'end_date',\n}\n\nexport interface BaseDccProps\n extends Pick {\n /**\n * Additional CSS class for the root DOM node\n */\n className?: string;\n\n /**\n * Dash-assigned callback that gets fired when component properties change\n */\n setProps: (props: Partial) => void;\n\n /**\n * Used to allow user interactions in this component to be persisted when\n * the component - or the page - is refreshed. If `persisted` is truthy and\n * hasn't changed from its previous value, a `value` that the user has\n * changed while using the app will keep that change, as long as\n * the new `value` also matches what was given originally.\n * Used in conjunction with `persistence_type`.\n */\n persistence?: boolean | string | number;\n\n /**\n * Properties whose user interactions will persist after refreshing the\n * component or the page. Since only `value` is allowed this prop can\n * normally be ignored.\n */\n persisted_props?: PersistedProps[];\n\n /**\n * Where persisted user changes will be stored:\n * memory: only kept in memory, reset on page refresh.\n * local: window.localStorage, data is kept after the browser quit.\n * session: window.sessionStorage, data is cleared once the browser quit.\n */\n persistence_type?: PersistenceTypes;\n}\n\nexport type ButtonProps = BaseDccProps & {\n /**\n * The children of this component.\n */\n children?: React.ReactNode;\n /**\n * Defines the type of the element.\n */\n type?: 'submit' | 'reset' | 'button';\n /**\n * The element should be automatically focused after the page loaded.\n */\n autoFocus?: boolean;\n /**\n * Indicates whether the user can interact with the element.\n */\n disabled?: boolean;\n /**\n * Indicates the form that is the owner of the element.\n */\n form?: string;\n /**\n * Indicates the action of the element, overriding the action defined in the
.\n */\n formAction?: string;\n /**\n * If the button/input is a submit button (type=\"submit\"), this attribute sets the encoding type to use during form submission. If this attribute is specified, it overrides the enctype attribute of the button's form owner.\n */\n formEncType?: string;\n /**\n * If the button/input is a submit button (type=\"submit\"), this attribute sets the submission method to use during form submission (GET, POST, etc.). If this attribute is specified, it overrides the method attribute of the button's form owner.\n */\n formMethod?: string;\n /**\n * If the button/input is a submit button (type=\"submit\"), this boolean attribute specifies that the form is not to be validated when it is submitted. If this attribute is specified, it overrides the novalidate attribute of the button's form owner.\n */\n formNoValidate?: boolean;\n /**\n * If the button/input is a submit button (type=\"submit\"), this attribute specifies the browsing context (for example, tab, window, or inline frame) in which to display the response that is received after submitting the form. If this attribute is specified, it overrides the target attribute of the button's form owner.\n */\n formTarget?: string;\n /**\n * Name of the element. For example used by the server to identify the fields in form submits.\n */\n name?: string;\n /**\n * Defines a default value which will be displayed in the element on page load.\n */\n value?: string | string[] | number;\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n accessKey?: string;\n /**\n * Indicates whether the element's content is editable.\n */\n contentEditable?: boolean | 'true' | 'false' | 'inherit';\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left).\n */\n dir?: string;\n /**\n * Defines whether the element can be dragged.\n */\n draggable?: boolean;\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n hidden?: boolean;\n /**\n * Defines the language used in the element.\n */\n lang?: string;\n /**\n * Defines the role of an element in the context of accessibility.\n */\n role?: string;\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n spellCheck?: boolean;\n /**\n * Defines CSS styles which will override styles previously set.\n */\n style?: React.CSSProperties;\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n tabIndex?: number;\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n title?: string;\n /**\n * Number of times the button lost focus.\n */\n n_blur?: number;\n /**\n * Last time the button lost focus.\n */\n n_blur_timestamp?: number;\n /**\n * Number of times the button has been clicked.\n */\n n_clicks?: number;\n /**\n * Last time the button was clicked.\n */\n n_clicks_timestamp?: number;\n};\n\nexport enum HTMLInputTypes {\n // Only allowing the input types with wide browser compatibility\n 'text' = 'text',\n 'number' = 'number',\n 'password' = 'password',\n 'email' = 'email',\n 'range' = 'range',\n 'search' = 'search',\n 'tel' = 'tel',\n 'url' = 'url',\n 'hidden' = 'hidden',\n}\n\nexport interface InputProps extends BaseDccProps {\n /**\n * The value of the input\n */\n value?: string | number;\n /**\n * The type of control to render.\n */\n type?: HTMLInputTypes;\n /**\n * If true, changes to input will be sent back to the Dash server only on enter or when losing focus.\n * If it's false, it will send the value back on every change.\n * If a number, it will not send anything back to the Dash server until the user has stopped\n * typing for that number of seconds.\n */\n debounce?: boolean | number;\n /**\n * A hint to the user of what can be entered in the control . The placeholder text must not contain carriage returns or line-feeds. Note: Do not use the placeholder attribute instead of a
\n );\n }\n\n return (\n \n \n String(data.options[index]?.value ?? index)\n }\n >\n {Row}\n \n {sizerDiv && (\n
\n {sizerDiv}\n
\n )}\n
\n );\n }\n);\n\nOptionsList.displayName = 'OptionsList';\n","import React from 'react';\nimport {DetailedOption, DropdownProps, OptionValue} from '../types';\n\nconst isOptionValue = (option: unknown): option is OptionValue => {\n return ['string', 'number', 'boolean'].includes(typeof option);\n};\n\nexport interface SanitizedResult {\n options: DetailedOption[];\n valueSet: Set;\n}\n\nexport const sanitizeOptions = (\n options: DropdownProps['options']\n): SanitizedResult => {\n const valueSet = new Set();\n let result: DetailedOption[];\n\n if (typeof options === 'object' && !(options instanceof Array)) {\n result = Object.entries(options).map(([value, label]) => {\n const opt = {\n label: React.isValidElement(label) ? label : String(label),\n value,\n };\n valueSet.add(value);\n return opt;\n });\n } else if (options instanceof Array) {\n result = options.map(option => {\n const opt = isOptionValue(option)\n ? {label: String(option), value: option}\n : option;\n valueSet.add(opt.value);\n return opt;\n });\n } else {\n result = [];\n }\n\n return {options: result, valueSet};\n};\n","'use strict';\n\nvar bind = require('function-bind');\n\nvar $apply = require('./functionApply');\nvar $call = require('./functionCall');\nvar $reflectApply = require('./reflectApply');\n\n/** @type {import('./actualApply')} */\nmodule.exports = $reflectApply || bind.call($call, $apply);\n","'use strict';\n\nvar bind = require('function-bind');\nvar $apply = require('./functionApply');\nvar actualApply = require('./actualApply');\n\n/** @type {import('./applyBind')} */\nmodule.exports = function applyBind() {\n\treturn actualApply(bind, $apply, arguments);\n};\n","'use strict';\n\n/** @type {import('./functionApply')} */\nmodule.exports = Function.prototype.apply;\n","'use strict';\n\n/** @type {import('./functionCall')} */\nmodule.exports = Function.prototype.call;\n","'use strict';\n\nvar bind = require('function-bind');\nvar $TypeError = require('es-errors/type');\n\nvar $call = require('./functionCall');\nvar $actualApply = require('./actualApply');\n\n/** @type {(args: [Function, thisArg?: unknown, ...args: unknown[]]) => Function} TODO FIXME, find a way to use import('.') */\nmodule.exports = function callBindBasic(args) {\n\tif (args.length < 1 || typeof args[0] !== 'function') {\n\t\tthrow new $TypeError('a function is required');\n\t}\n\treturn $actualApply(bind, $call, args);\n};\n","'use strict';\n\n/** @type {import('./reflectApply')} */\nmodule.exports = typeof Reflect !== 'undefined' && Reflect && Reflect.apply;\n","'use strict';\n\nvar GetIntrinsic = require('get-intrinsic');\n\nvar callBind = require('./');\n\nvar $indexOf = callBind(GetIntrinsic('String.prototype.indexOf'));\n\nmodule.exports = function callBoundIntrinsic(name, allowMissing) {\n\tvar intrinsic = GetIntrinsic(name, !!allowMissing);\n\tif (typeof intrinsic === 'function' && $indexOf(name, '.prototype.') > -1) {\n\t\treturn callBind(intrinsic);\n\t}\n\treturn intrinsic;\n};\n","'use strict';\n\nvar setFunctionLength = require('set-function-length');\n\nvar $defineProperty = require('es-define-property');\n\nvar callBindBasic = require('call-bind-apply-helpers');\nvar applyBind = require('call-bind-apply-helpers/applyBind');\n\nmodule.exports = function callBind(originalFunction) {\n\tvar func = callBindBasic(arguments);\n\tvar adjustedLength = 1 + originalFunction.length - (arguments.length - 1);\n\treturn setFunctionLength(\n\t\tfunc,\n\t\tadjustedLength > 0 ? adjustedLength : 0,\n\t\ttrue\n\t);\n};\n\nif ($defineProperty) {\n\t$defineProperty(module.exports, 'apply', { value: applyBind });\n} else {\n\tmodule.exports.apply = applyBind;\n}\n","'use strict';\n\nvar GetIntrinsic = require('get-intrinsic');\n\nvar callBindBasic = require('call-bind-apply-helpers');\n\n/** @type {(thisArg: string, searchString: string, position?: number) => number} */\nvar $indexOf = callBindBasic([GetIntrinsic('%String.prototype.indexOf%')]);\n\n/** @type {import('.')} */\nmodule.exports = function callBoundIntrinsic(name, allowMissing) {\n\t/* eslint no-extra-parens: 0 */\n\n\tvar intrinsic = /** @type {(this: unknown, ...args: unknown[]) => unknown} */ (GetIntrinsic(name, !!allowMissing));\n\tif (typeof intrinsic === 'function' && $indexOf(name, '.prototype.') > -1) {\n\t\treturn callBindBasic(/** @type {const} */ ([intrinsic]));\n\t}\n\treturn intrinsic;\n};\n","/*global window, global*/\nvar util = require(\"util\")\nvar assert = require(\"assert\")\nfunction now() { return new Date().getTime() }\n\nvar slice = Array.prototype.slice\nvar console\nvar times = {}\n\nif (typeof global !== \"undefined\" && global.console) {\n console = global.console\n} else if (typeof window !== \"undefined\" && window.console) {\n console = window.console\n} else {\n console = {}\n}\n\nvar functions = [\n [log, \"log\"],\n [info, \"info\"],\n [warn, \"warn\"],\n [error, \"error\"],\n [time, \"time\"],\n [timeEnd, \"timeEnd\"],\n [trace, \"trace\"],\n [dir, \"dir\"],\n [consoleAssert, \"assert\"]\n]\n\nfor (var i = 0; i < functions.length; i++) {\n var tuple = functions[i]\n var f = tuple[0]\n var name = tuple[1]\n\n if (!console[name]) {\n console[name] = f\n }\n}\n\nmodule.exports = console\n\nfunction log() {}\n\nfunction info() {\n console.log.apply(console, arguments)\n}\n\nfunction warn() {\n console.log.apply(console, arguments)\n}\n\nfunction error() {\n console.warn.apply(console, arguments)\n}\n\nfunction time(label) {\n times[label] = now()\n}\n\nfunction timeEnd(label) {\n var time = times[label]\n if (!time) {\n throw new Error(\"No such label: \" + label)\n }\n\n delete times[label]\n var duration = now() - time\n console.log(label + \": \" + duration + \"ms\")\n}\n\nfunction trace() {\n var err = new Error()\n err.name = \"Trace\"\n err.message = util.format.apply(null, arguments)\n console.error(err.stack)\n}\n\nfunction dir(object) {\n console.log(util.inspect(object) + \"\\n\")\n}\n\nfunction consoleAssert(expression) {\n if (!expression) {\n var arr = slice.call(arguments, 1)\n assert.ok(false, util.format.apply(null, arr))\n }\n}\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".dash-button {\\n line-height: 32px;\\n background: var(--Dash-Fill-Interactive-Weak);\\n color: var(--Dash-Fill-Interactive-Strong);\\n padding: 0 calc(var(--Dash-Spacing) * 2);\\n border-radius: 4px;\\n border: 1px solid var(--Dash-Fill-Interactive-Strong);\\n box-sizing: border-box;\\n vertical-align: middle;\\n font-family: inherit;\\n font-size: inherit;\\n}\\n\\n/* Hover state - stronger background */\\n.dash-button:hover {\\n cursor: pointer;\\n background: var(--Dash-Fill-Inverse-Strong);\\n color: var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n/* Active state (clicking) - inverted colors */\\n.dash-button:active {\\n background: var(--Dash-Fill-Interactive-Strong);\\n color: var(--Dash-Fill-Inverse-Strong);\\n}\\n\\n/* Keyboard focus - inverted colors */\\n.dash-button:focus-visible {\\n outline: 1px solid var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n/* Hover after keyboard focus - keep inverted but acknowledge hover */\\n.dash-button:focus-visible:hover {\\n outline: 1px solid var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n/* Active state after keyboard focus - inverted colors */\\n.dash-button:focus-visible:active {\\n background: var(--Dash-Fill-Interactive-Strong);\\n color: var(--Dash-Fill-Inverse-Strong);\\n}\\n\\n/* Disabled state */\\n.dash-button:disabled {\\n opacity: 0.6;\\n cursor: not-allowed;\\n background: var(--Dash-Fill-Disabled);\\n color: var(--Dash-Text-Strong);\\n border-color: var(--Dash-Stroke-Weak);\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/css/button.css\"],\"names\":[],\"mappings\":\"AAAA;IACI,iBAAiB;IACjB,6CAA6C;IAC7C,0CAA0C;IAC1C,wCAAwC;IACxC,kBAAkB;IAClB,qDAAqD;IACrD,sBAAsB;IACtB,sBAAsB;IACtB,oBAAoB;IACpB,kBAAkB;AACtB;;AAEA,sCAAsC;AACtC;IACI,eAAe;IACf,2CAA2C;IAC3C,0CAA0C;AAC9C;;AAEA,8CAA8C;AAC9C;IACI,+CAA+C;IAC/C,sCAAsC;AAC1C;;AAEA,qCAAqC;AACrC;IACI,sDAAsD;AAC1D;;AAEA,qEAAqE;AACrE;IACI,sDAAsD;AAC1D;;AAEA,wDAAwD;AACxD;IACI,+CAA+C;IAC/C,sCAAsC;AAC1C;;AAEA,mBAAmB;AACnB;IACI,YAAY;IACZ,mBAAmB;IACnB,qCAAqC;IACrC,8BAA8B;IAC9B,qCAAqC;AACzC\",\"sourcesContent\":[\".dash-button {\\n line-height: 32px;\\n background: var(--Dash-Fill-Interactive-Weak);\\n color: var(--Dash-Fill-Interactive-Strong);\\n padding: 0 calc(var(--Dash-Spacing) * 2);\\n border-radius: 4px;\\n border: 1px solid var(--Dash-Fill-Interactive-Strong);\\n box-sizing: border-box;\\n vertical-align: middle;\\n font-family: inherit;\\n font-size: inherit;\\n}\\n\\n/* Hover state - stronger background */\\n.dash-button:hover {\\n cursor: pointer;\\n background: var(--Dash-Fill-Inverse-Strong);\\n color: var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n/* Active state (clicking) - inverted colors */\\n.dash-button:active {\\n background: var(--Dash-Fill-Interactive-Strong);\\n color: var(--Dash-Fill-Inverse-Strong);\\n}\\n\\n/* Keyboard focus - inverted colors */\\n.dash-button:focus-visible {\\n outline: 1px solid var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n/* Hover after keyboard focus - keep inverted but acknowledge hover */\\n.dash-button:focus-visible:hover {\\n outline: 1px solid var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n/* Active state after keyboard focus - inverted colors */\\n.dash-button:focus-visible:active {\\n background: var(--Dash-Fill-Interactive-Strong);\\n color: var(--Dash-Fill-Inverse-Strong);\\n}\\n\\n/* Disabled state */\\n.dash-button:disabled {\\n opacity: 0.6;\\n cursor: not-allowed;\\n background: var(--Dash-Fill-Disabled);\\n color: var(--Dash-Text-Strong);\\n border-color: var(--Dash-Stroke-Weak);\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".dash-options-list-option.dash-checklist-inline {\\n display: inline-flex;\\n margin-right: calc(var(--Dash-Spacing) * 4);\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/css/checklist.css\"],\"names\":[],\"mappings\":\"AAAA;IACI,oBAAoB;IACpB,2CAA2C;AAC/C\",\"sourcesContent\":[\".dash-options-list-option.dash-checklist-inline {\\n display: inline-flex;\\n margin-right: calc(var(--Dash-Spacing) * 4);\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \":root {\\n --Dash-Spacing: 4px;\\n --Dash-Stroke-Strong: rgba(0, 18, 77, 0.45);\\n --Dash-Stroke-Weak: rgba(0, 24, 102, 0.1);\\n --Dash-Fill-Interactive-Strong: #7f4bc4;\\n --Dash-Fill-Interactive-Weak: rgba(0, 30, 128, 0.04);\\n --Dash-Fill-Inverse-Strong: #fff;\\n --Dash-Text-Primary: rgba(0, 18, 77, 0.87);\\n --Dash-Text-Strong: rgba(0, 9, 38, 0.9);\\n --Dash-Text-Weak: rgba(0, 12, 51, 0.65);\\n --Dash-Text-Disabled: rgba(0, 21, 89, 0.6);\\n --Dash-Fill-Primary-Hover: rgba(0, 18, 77, 0.04);\\n --Dash-Fill-Primary-Active: rgba(0, 18, 77, 0.08);\\n --Dash-Fill-Disabled: rgba(0, 24, 102, 0.1);\\n --Dash-Shading-Strong: rgba(22, 23, 24, 0.35);\\n --Dash-Shading-Weak: rgba(22, 23, 24, 0.2);\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/css/dcc.css\"],\"names\":[],\"mappings\":\"AAAA;IACI,mBAAmB;IACnB,2CAA2C;IAC3C,yCAAyC;IACzC,uCAAuC;IACvC,oDAAoD;IACpD,gCAAgC;IAChC,0CAA0C;IAC1C,uCAAuC;IACvC,uCAAuC;IACvC,0CAA0C;IAC1C,gDAAgD;IAChD,iDAAiD;IACjD,2CAA2C;IAC3C,6CAA6C;IAC7C,0CAA0C;AAC9C\",\"sourcesContent\":[\":root {\\n --Dash-Spacing: 4px;\\n --Dash-Stroke-Strong: rgba(0, 18, 77, 0.45);\\n --Dash-Stroke-Weak: rgba(0, 24, 102, 0.1);\\n --Dash-Fill-Interactive-Strong: #7f4bc4;\\n --Dash-Fill-Interactive-Weak: rgba(0, 30, 128, 0.04);\\n --Dash-Fill-Inverse-Strong: #fff;\\n --Dash-Text-Primary: rgba(0, 18, 77, 0.87);\\n --Dash-Text-Strong: rgba(0, 9, 38, 0.9);\\n --Dash-Text-Weak: rgba(0, 12, 51, 0.65);\\n --Dash-Text-Disabled: rgba(0, 21, 89, 0.6);\\n --Dash-Fill-Primary-Hover: rgba(0, 18, 77, 0.04);\\n --Dash-Fill-Primary-Active: rgba(0, 18, 77, 0.08);\\n --Dash-Fill-Disabled: rgba(0, 24, 102, 0.1);\\n --Dash-Shading-Strong: rgba(22, 23, 24, 0.35);\\n --Dash-Shading-Weak: rgba(22, 23, 24, 0.2);\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"/* Input container styles */\\n.dash-input-container {\\n position: relative;\\n display: inline-flex;\\n align-items: center;\\n width: 100%;\\n height: 34px;\\n background: var(--Dash-Fill-Inverse-Strong);\\n border-radius: var(--Dash-Spacing);\\n border: 1px solid var(--Dash-Stroke-Strong);\\n box-sizing: border-box;\\n container-type: inline-size;\\n vertical-align: middle;\\n color: inherit;\\n overflow: hidden;\\n}\\n\\n.dash-input-container:focus-within {\\n border: 1px solid var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n.dash-input-container:has(:focus-visible) {\\n outline: 1px solid var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n.dash-input-container:has(.dash-input-element:disabled) {\\n opacity: 0.6;\\n cursor: not-allowed;\\n}\\n\\n.dash-input-container input:focus {\\n outline: none;\\n}\\n\\n.dash-input-container:has(input[type='range']) {\\n background: inherit;\\n}\\n\\n/* Input field styles */\\n.dash-input-element {\\n padding: var(--Dash-Spacing) calc(2 * var(--Dash-Spacing));\\n color: inherit;\\n background: inherit;\\n border: none;\\n border-radius: var(--Dash-Spacing);\\n flex: 1 1 0;\\n min-width: 0;\\n height: 100%;\\n box-sizing: border-box;\\n z-index: 1;\\n order: 2;\\n accent-color: var(--Dash-Fill-Interactive-Strong);\\n font-family: inherit;\\n font-size: inherit;\\n}\\n\\n.dash-input-element::selection,\\n.dash-input-element::-webkit-selection {\\n color: var(--Dash-Fill-Inverse-Strong);\\n background: var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n.dash-input-element:disabled {\\n cursor: not-allowed;\\n}\\n\\n/* Hide native steppers for number inputs */\\n.dash-input-element[type='number'] {\\n -moz-appearance: textfield;\\n border-radius: 0;\\n}\\n\\n.dash-input-element[type='number']::-webkit-outer-spin-button,\\n.dash-input-element[type='number']::-webkit-inner-spin-button {\\n -webkit-appearance: none;\\n margin: 0;\\n}\\n\\n/* Show native steppers when container is narrow and input is number type */\\n@container (max-width: 99px) {\\n .dash-input-element[type='number'] {\\n -moz-appearance: number-input;\\n }\\n\\n .dash-input-element[type='number']::-webkit-outer-spin-button,\\n .dash-input-element[type='number']::-webkit-inner-spin-button {\\n -webkit-appearance: inner-spin-button;\\n margin: 0;\\n }\\n}\\n\\n/* Stepper button base styles */\\n.dash-input-stepper {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n width: 32px;\\n height: 100%;\\n border: none;\\n background: var(--Dash-Fill-Inverse-Strong);\\n cursor: pointer;\\n font-size: 16px;\\n font-weight: bold;\\n color: var(--Dash-Text-Primary);\\n}\\n\\n.dash-input-stepper:hover,\\n.dash-input-stepper:focus {\\n background: var(--Dash-Fill-Primary-Hover);\\n}\\n\\n.dash-input-stepper:active {\\n background: var(--Dash-Fill-Primary-Active);\\n}\\n\\n.dash-input-stepper:disabled {\\n background: var(--Dash-Fill-Inverse-Strong);\\n opacity: 0.5;\\n cursor: default;\\n}\\n\\n@container (max-width: 99px) {\\n .dash-input-stepper {\\n display: none;\\n }\\n}\\n\\n/* Decrement button specific styles */\\n.dash-input-stepper.dash-stepper-decrement {\\n border-right: 1px solid var(--Dash-Stroke-Weak);\\n border-radius: var(--Dash-Spacing) 0 0 var(--Dash-Spacing);\\n order: 1;\\n}\\n\\n/* Increment button specific styles */\\n.dash-input-stepper.dash-stepper-increment {\\n border-left: 1px solid var(--Dash-Stroke-Weak);\\n border-radius: 0 var(--Dash-Spacing) var(--Dash-Spacing) 0;\\n order: 3;\\n}\\n\\n/* Hidden input type */\\n.dash-input-container.dash-input-hidden {\\n display: none;\\n}\\n\\ninput.dash-input-element:invalid {\\n color: red;\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/css/input.css\"],\"names\":[],\"mappings\":\"AAAA,2BAA2B;AAC3B;IACI,kBAAkB;IAClB,oBAAoB;IACpB,mBAAmB;IACnB,WAAW;IACX,YAAY;IACZ,2CAA2C;IAC3C,kCAAkC;IAClC,2CAA2C;IAC3C,sBAAsB;IACtB,2BAA2B;IAC3B,sBAAsB;IACtB,cAAc;IACd,gBAAgB;AACpB;;AAEA;IACI,qDAAqD;AACzD;;AAEA;IACI,sDAAsD;AAC1D;;AAEA;IACI,YAAY;IACZ,mBAAmB;AACvB;;AAEA;IACI,aAAa;AACjB;;AAEA;IACI,mBAAmB;AACvB;;AAEA,uBAAuB;AACvB;IACI,0DAA0D;IAC1D,cAAc;IACd,mBAAmB;IACnB,YAAY;IACZ,kCAAkC;IAClC,WAAW;IACX,YAAY;IACZ,YAAY;IACZ,sBAAsB;IACtB,UAAU;IACV,QAAQ;IACR,iDAAiD;IACjD,oBAAoB;IACpB,kBAAkB;AACtB;;AAEA;;IAEI,sCAAsC;IACtC,+CAA+C;AACnD;;AAEA;IACI,mBAAmB;AACvB;;AAEA,2CAA2C;AAC3C;IACI,0BAA0B;IAC1B,gBAAgB;AACpB;;AAEA;;IAEI,wBAAwB;IACxB,SAAS;AACb;;AAEA,2EAA2E;AAC3E;IACI;QACI,6BAA6B;IACjC;;IAEA;;QAEI,qCAAqC;QACrC,SAAS;IACb;AACJ;;AAEA,+BAA+B;AAC/B;IACI,aAAa;IACb,mBAAmB;IACnB,uBAAuB;IACvB,WAAW;IACX,YAAY;IACZ,YAAY;IACZ,2CAA2C;IAC3C,eAAe;IACf,eAAe;IACf,iBAAiB;IACjB,+BAA+B;AACnC;;AAEA;;IAEI,0CAA0C;AAC9C;;AAEA;IACI,2CAA2C;AAC/C;;AAEA;IACI,2CAA2C;IAC3C,YAAY;IACZ,eAAe;AACnB;;AAEA;IACI;QACI,aAAa;IACjB;AACJ;;AAEA,qCAAqC;AACrC;IACI,+CAA+C;IAC/C,0DAA0D;IAC1D,QAAQ;AACZ;;AAEA,qCAAqC;AACrC;IACI,8CAA8C;IAC9C,0DAA0D;IAC1D,QAAQ;AACZ;;AAEA,sBAAsB;AACtB;IACI,aAAa;AACjB;;AAEA;IACI,UAAU;AACd\",\"sourcesContent\":[\"/* Input container styles */\\n.dash-input-container {\\n position: relative;\\n display: inline-flex;\\n align-items: center;\\n width: 100%;\\n height: 34px;\\n background: var(--Dash-Fill-Inverse-Strong);\\n border-radius: var(--Dash-Spacing);\\n border: 1px solid var(--Dash-Stroke-Strong);\\n box-sizing: border-box;\\n container-type: inline-size;\\n vertical-align: middle;\\n color: inherit;\\n overflow: hidden;\\n}\\n\\n.dash-input-container:focus-within {\\n border: 1px solid var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n.dash-input-container:has(:focus-visible) {\\n outline: 1px solid var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n.dash-input-container:has(.dash-input-element:disabled) {\\n opacity: 0.6;\\n cursor: not-allowed;\\n}\\n\\n.dash-input-container input:focus {\\n outline: none;\\n}\\n\\n.dash-input-container:has(input[type='range']) {\\n background: inherit;\\n}\\n\\n/* Input field styles */\\n.dash-input-element {\\n padding: var(--Dash-Spacing) calc(2 * var(--Dash-Spacing));\\n color: inherit;\\n background: inherit;\\n border: none;\\n border-radius: var(--Dash-Spacing);\\n flex: 1 1 0;\\n min-width: 0;\\n height: 100%;\\n box-sizing: border-box;\\n z-index: 1;\\n order: 2;\\n accent-color: var(--Dash-Fill-Interactive-Strong);\\n font-family: inherit;\\n font-size: inherit;\\n}\\n\\n.dash-input-element::selection,\\n.dash-input-element::-webkit-selection {\\n color: var(--Dash-Fill-Inverse-Strong);\\n background: var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n.dash-input-element:disabled {\\n cursor: not-allowed;\\n}\\n\\n/* Hide native steppers for number inputs */\\n.dash-input-element[type='number'] {\\n -moz-appearance: textfield;\\n border-radius: 0;\\n}\\n\\n.dash-input-element[type='number']::-webkit-outer-spin-button,\\n.dash-input-element[type='number']::-webkit-inner-spin-button {\\n -webkit-appearance: none;\\n margin: 0;\\n}\\n\\n/* Show native steppers when container is narrow and input is number type */\\n@container (max-width: 99px) {\\n .dash-input-element[type='number'] {\\n -moz-appearance: number-input;\\n }\\n\\n .dash-input-element[type='number']::-webkit-outer-spin-button,\\n .dash-input-element[type='number']::-webkit-inner-spin-button {\\n -webkit-appearance: inner-spin-button;\\n margin: 0;\\n }\\n}\\n\\n/* Stepper button base styles */\\n.dash-input-stepper {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n width: 32px;\\n height: 100%;\\n border: none;\\n background: var(--Dash-Fill-Inverse-Strong);\\n cursor: pointer;\\n font-size: 16px;\\n font-weight: bold;\\n color: var(--Dash-Text-Primary);\\n}\\n\\n.dash-input-stepper:hover,\\n.dash-input-stepper:focus {\\n background: var(--Dash-Fill-Primary-Hover);\\n}\\n\\n.dash-input-stepper:active {\\n background: var(--Dash-Fill-Primary-Active);\\n}\\n\\n.dash-input-stepper:disabled {\\n background: var(--Dash-Fill-Inverse-Strong);\\n opacity: 0.5;\\n cursor: default;\\n}\\n\\n@container (max-width: 99px) {\\n .dash-input-stepper {\\n display: none;\\n }\\n}\\n\\n/* Decrement button specific styles */\\n.dash-input-stepper.dash-stepper-decrement {\\n border-right: 1px solid var(--Dash-Stroke-Weak);\\n border-radius: var(--Dash-Spacing) 0 0 var(--Dash-Spacing);\\n order: 1;\\n}\\n\\n/* Increment button specific styles */\\n.dash-input-stepper.dash-stepper-increment {\\n border-left: 1px solid var(--Dash-Stroke-Weak);\\n border-radius: 0 var(--Dash-Spacing) var(--Dash-Spacing) 0;\\n order: 3;\\n}\\n\\n/* Hidden input type */\\n.dash-input-container.dash-input-hidden {\\n display: none;\\n}\\n\\ninput.dash-input-element:invalid {\\n color: red;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".dash-options-list-option {\\n padding: var(--Dash-Spacing) 0;\\n background: var(--Dash-Fill-Inverse-strong);\\n color: var(--Dash-Text-Strong);\\n cursor: pointer;\\n display: flex;\\n align-items: baseline;\\n user-select: none;\\n}\\n\\n.dash-options-list-option:not(:has(input[disabled])):hover,\\n.dash-options-list-option:not(:has(input[disabled])):focus-within {\\n color: var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n.dash-options-list-option:has(input[disabled]) {\\n color: var(--Dash-Text-Disabled);\\n cursor: not-allowed;\\n}\\n\\n.dash-options-list-option-wrapper,\\n.dash-options-list-option-text {\\n display: flex;\\n align-items: center;\\n}\\n\\n.dash-options-list-option-checkbox {\\n display: inline-block;\\n margin: 0 calc(var(--Dash-Spacing) * 2) 0 0;\\n box-sizing: border-box;\\n border: 1px solid var(--Dash-Stroke-Strong);\\n accent-color: var(--Dash-Fill-Interactive-Strong);\\n outline-color: var(--Dash-Fill-Interactive-Strong);\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/css/optionslist.css\"],\"names\":[],\"mappings\":\"AAAA;IACI,8BAA8B;IAC9B,2CAA2C;IAC3C,8BAA8B;IAC9B,eAAe;IACf,aAAa;IACb,qBAAqB;IACrB,iBAAiB;AACrB;;AAEA;;IAEI,0CAA0C;AAC9C;;AAEA;IACI,gCAAgC;IAChC,mBAAmB;AACvB;;AAEA;;IAEI,aAAa;IACb,mBAAmB;AACvB;;AAEA;IACI,qBAAqB;IACrB,2CAA2C;IAC3C,sBAAsB;IACtB,2CAA2C;IAC3C,iDAAiD;IACjD,kDAAkD;AACtD\",\"sourcesContent\":[\".dash-options-list-option {\\n padding: var(--Dash-Spacing) 0;\\n background: var(--Dash-Fill-Inverse-strong);\\n color: var(--Dash-Text-Strong);\\n cursor: pointer;\\n display: flex;\\n align-items: baseline;\\n user-select: none;\\n}\\n\\n.dash-options-list-option:not(:has(input[disabled])):hover,\\n.dash-options-list-option:not(:has(input[disabled])):focus-within {\\n color: var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n.dash-options-list-option:has(input[disabled]) {\\n color: var(--Dash-Text-Disabled);\\n cursor: not-allowed;\\n}\\n\\n.dash-options-list-option-wrapper,\\n.dash-options-list-option-text {\\n display: flex;\\n align-items: center;\\n}\\n\\n.dash-options-list-option-checkbox {\\n display: inline-block;\\n margin: 0 calc(var(--Dash-Spacing) * 2) 0 0;\\n box-sizing: border-box;\\n border: 1px solid var(--Dash-Stroke-Strong);\\n accent-color: var(--Dash-Fill-Interactive-Strong);\\n outline-color: var(--Dash-Fill-Interactive-Strong);\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".dash-options-list-option.dash-radioitems-inline {\\n display: inline-flex;\\n margin-right: calc(var(--Dash-Spacing) * 4);\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/css/radioitems.css\"],\"names\":[],\"mappings\":\"AAAA;IACI,oBAAoB;IACpB,2CAA2C;AAC/C\",\"sourcesContent\":[\".dash-options-list-option.dash-radioitems-inline {\\n display: inline-flex;\\n margin-right: calc(var(--Dash-Spacing) * 4);\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".dash-slider-root {\\n position: relative;\\n z-index: 0;\\n display: flex;\\n align-items: center;\\n user-select: none;\\n touch-action: none;\\n width: 100%;\\n height: 14px;\\n padding: 17px 0 17px 0;\\n box-sizing: border-box;\\n /* Override Radix's default margin/padding behavior */\\n --radix-slider-thumb-width: 16px;\\n}\\n\\n.dash-slider-root.has-marks {\\n padding: 6px 0 28px 0;\\n}\\n\\n.dash-slider-root[data-orientation='vertical'].has-marks {\\n padding-bottom: 0px;\\n}\\n\\n.dash-slider-root[data-orientation='vertical'] {\\n flex-direction: column;\\n width: 20px;\\n height: 100%;\\n}\\n\\n.dash-slider-track {\\n position: relative;\\n flex-grow: 1;\\n border-radius: 9999px;\\n height: 4px;\\n background-color: var(--Dash-Fill-Disabled);\\n}\\n\\n.dash-slider-root[data-orientation='vertical'] .dash-slider-track {\\n width: 4px;\\n height: auto;\\n overflow-y: hidden;\\n}\\n\\n.dash-slider-range {\\n position: absolute;\\n border-radius: 9999px;\\n height: 100%;\\n background-color: var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n.dash-slider-root[data-orientation='vertical'] .dash-slider-range {\\n width: 100%;\\n height: auto;\\n}\\n\\n.dash-slider-thumb {\\n position: relative;\\n z-index: 1;\\n display: block;\\n width: 16px;\\n height: 16px;\\n background-color: var(--Dash-Fill-Interactive-Strong);\\n border: 2px solid var(--Dash-Fill-Inverse-Strong);\\n border-radius: 50%;\\n box-shadow: 0 1px 3px 0 var(--Dash-Shading-Weak);\\n cursor: pointer;\\n outline: none;\\n transition: all 0.15s ease-in-out;\\n}\\n\\n.dash-slider-thumb:focus,\\n.dash-slider-thumb:hover {\\n transform: scale(1.125); /* Scale to make 16px thumb appear as 18px */\\n box-shadow: 0 4px 6px -1px var(--Dash-Shading-Weak);\\n}\\n\\n.dash-slider-thumb:focus {\\n outline: 2px solid var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n.dash-slider-thumb:focus .dash-slider-tooltip,\\n.dash-slider-thumb:hover .dash-slider-tooltip {\\n display: block;\\n}\\n\\n.dash-slider-thumb[data-disabled],\\n.dash-range-slider-input:disabled {\\n cursor: not-allowed;\\n opacity: 0.5;\\n}\\n\\n.dash-slider-mark {\\n position: absolute;\\n font-size: 12px;\\n height: 12px;\\n line-height: 12px;\\n color: var(--Dash-Text-Strong);\\n white-space: nowrap;\\n pointer-events: none;\\n}\\n\\n.dash-slider-mark-outside-selection {\\n color: var(--Dash-Text-Disabled);\\n}\\n\\n.dash-slider-mark:before {\\n content: '';\\n position: absolute;\\n bottom: 100%;\\n left: 50%;\\n transform: translateX(-50%);\\n background-color: var(--Dash-Fill-Disabled);\\n width: 4px;\\n height: 6px;\\n border-radius: 2px;\\n margin-bottom: 2px;\\n}\\n.dash-slider-mark.with-dots:before {\\n content: initial;\\n}\\n\\n.dash-slider-root[data-orientation='vertical'] .dash-slider-mark:before {\\n content: initial;\\n}\\n\\n.dash-slider-dot {\\n pointer-events: none;\\n position: absolute;\\n width: 8px;\\n height: 8px;\\n border-radius: 50%;\\n background-color: var(--Dash-Fill-Primary-Active);\\n}\\n\\n.dash-slider-dot-outside-selection {\\n background-color: var(--Dash-Fill-Disabled);\\n}\\n\\n.dash-slider-tooltip {\\n display: none;\\n position: absolute;\\n border-radius: var(--Dash-Spacing);\\n padding: calc(var(--Dash-Spacing) * 3);\\n font-size: 12px;\\n line-height: 1;\\n box-shadow: 0 0 8px var(--Dash-Shading-Strong);\\n background-color: var(--Dash-Fill-Inverse-Strong);\\n user-select: none;\\n z-index: 1000;\\n fill: var(--Dash-Fill-Inverse-Strong);\\n}\\n\\n.dash-slider-tooltip.always-visible {\\n display: block;\\n}\\n\\n/* Include property to mimic rc-slider behavior */\\n.dash-slider-root:not([data-included='false']) .dash-slider-range {\\n background-color: var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n.dash-slider-root[data-included='false'] .dash-slider-range {\\n background-color: transparent;\\n}\\n\\n/* Disabled state */\\n.dash-slider-root[data-disabled] {\\n opacity: 0.5;\\n cursor: not-allowed;\\n}\\n\\n.dash-slider-root[data-disabled] .dash-slider-track {\\n background-color: var(--Dash-Fill-Disabled);\\n}\\n\\n.dash-slider-root[data-disabled] .dash-slider-range {\\n background-color: var(--Dash-Fill-Disabled);\\n}\\n\\n.dash-slider-root[data-disabled] .dash-slider-thumb {\\n cursor: not-allowed;\\n border-color: var(--Dash-Fill-Disabled);\\n}\\n\\n.dash-slider-container {\\n display: flex;\\n align-items: center;\\n gap: 16px;\\n width: 100%;\\n container-type: inline-size;\\n}\\n\\n.dash-slider-wrapper {\\n flex: 1;\\n min-width: 0;\\n}\\n\\n.dash-range-slider-inputs {\\n display: flex;\\n flex-direction: column;\\n gap: 4px;\\n min-width: 64px;\\n}\\n\\n.dash-range-slider-min-input {\\n text-align: center;\\n}\\n\\n.dash-range-slider-max-input {\\n order: 1;\\n}\\n\\n.dash-range-slider-input {\\n min-width: 5cqw; /* 5% of container width */\\n max-width: 25cqw; /* 25% of container width */\\n text-align: center;\\n -webkit-appearance: textfield;\\n -moz-appearance: textfield;\\n appearance: textfield;\\n font-family: inherit;\\n font-size: inherit;\\n box-sizing: content-box;\\n height: 30px;\\n}\\n\\n.dash-range-slider-input:only-of-type {\\n max-width: 33cqw;\\n}\\n\\n.dash-range-slider-input::selection,\\n.dash-range-slider-input::-webkit-selection {\\n color: var(--Dash-Fill-Inverse-Strong);\\n background: var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n.dash-range-slider-input:focus {\\n outline: 1px solid var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n/* Hide the number input spinners */\\n.dash-range-slider-input::-webkit-inner-spin-button,\\n.dash-range-slider-input::-webkit-outer-spin-button {\\n -webkit-appearance: none;\\n margin: 0;\\n}\\n\\n/* Hide inputs on small containers using container queries */\\n/* single slider input */\\n@container (max-width: 200px) {\\n .dash-slider-container .dash-range-slider-input:only-of-type {\\n display: none;\\n }\\n}\\n\\n/* range slider inputs */\\n@container (max-width: 300px) {\\n .dash-slider-container .dash-range-slider-min-input,\\n .dash-slider-container .dash-range-slider-max-input {\\n display: none;\\n }\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/css/sliders.css\"],\"names\":[],\"mappings\":\"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\",\"sourcesContent\":[\".dash-slider-root {\\n position: relative;\\n z-index: 0;\\n display: flex;\\n align-items: center;\\n user-select: none;\\n touch-action: none;\\n width: 100%;\\n height: 14px;\\n padding: 17px 0 17px 0;\\n box-sizing: border-box;\\n /* Override Radix's default margin/padding behavior */\\n --radix-slider-thumb-width: 16px;\\n}\\n\\n.dash-slider-root.has-marks {\\n padding: 6px 0 28px 0;\\n}\\n\\n.dash-slider-root[data-orientation='vertical'].has-marks {\\n padding-bottom: 0px;\\n}\\n\\n.dash-slider-root[data-orientation='vertical'] {\\n flex-direction: column;\\n width: 20px;\\n height: 100%;\\n}\\n\\n.dash-slider-track {\\n position: relative;\\n flex-grow: 1;\\n border-radius: 9999px;\\n height: 4px;\\n background-color: var(--Dash-Fill-Disabled);\\n}\\n\\n.dash-slider-root[data-orientation='vertical'] .dash-slider-track {\\n width: 4px;\\n height: auto;\\n overflow-y: hidden;\\n}\\n\\n.dash-slider-range {\\n position: absolute;\\n border-radius: 9999px;\\n height: 100%;\\n background-color: var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n.dash-slider-root[data-orientation='vertical'] .dash-slider-range {\\n width: 100%;\\n height: auto;\\n}\\n\\n.dash-slider-thumb {\\n position: relative;\\n z-index: 1;\\n display: block;\\n width: 16px;\\n height: 16px;\\n background-color: var(--Dash-Fill-Interactive-Strong);\\n border: 2px solid var(--Dash-Fill-Inverse-Strong);\\n border-radius: 50%;\\n box-shadow: 0 1px 3px 0 var(--Dash-Shading-Weak);\\n cursor: pointer;\\n outline: none;\\n transition: all 0.15s ease-in-out;\\n}\\n\\n.dash-slider-thumb:focus,\\n.dash-slider-thumb:hover {\\n transform: scale(1.125); /* Scale to make 16px thumb appear as 18px */\\n box-shadow: 0 4px 6px -1px var(--Dash-Shading-Weak);\\n}\\n\\n.dash-slider-thumb:focus {\\n outline: 2px solid var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n.dash-slider-thumb:focus .dash-slider-tooltip,\\n.dash-slider-thumb:hover .dash-slider-tooltip {\\n display: block;\\n}\\n\\n.dash-slider-thumb[data-disabled],\\n.dash-range-slider-input:disabled {\\n cursor: not-allowed;\\n opacity: 0.5;\\n}\\n\\n.dash-slider-mark {\\n position: absolute;\\n font-size: 12px;\\n height: 12px;\\n line-height: 12px;\\n color: var(--Dash-Text-Strong);\\n white-space: nowrap;\\n pointer-events: none;\\n}\\n\\n.dash-slider-mark-outside-selection {\\n color: var(--Dash-Text-Disabled);\\n}\\n\\n.dash-slider-mark:before {\\n content: '';\\n position: absolute;\\n bottom: 100%;\\n left: 50%;\\n transform: translateX(-50%);\\n background-color: var(--Dash-Fill-Disabled);\\n width: 4px;\\n height: 6px;\\n border-radius: 2px;\\n margin-bottom: 2px;\\n}\\n.dash-slider-mark.with-dots:before {\\n content: initial;\\n}\\n\\n.dash-slider-root[data-orientation='vertical'] .dash-slider-mark:before {\\n content: initial;\\n}\\n\\n.dash-slider-dot {\\n pointer-events: none;\\n position: absolute;\\n width: 8px;\\n height: 8px;\\n border-radius: 50%;\\n background-color: var(--Dash-Fill-Primary-Active);\\n}\\n\\n.dash-slider-dot-outside-selection {\\n background-color: var(--Dash-Fill-Disabled);\\n}\\n\\n.dash-slider-tooltip {\\n display: none;\\n position: absolute;\\n border-radius: var(--Dash-Spacing);\\n padding: calc(var(--Dash-Spacing) * 3);\\n font-size: 12px;\\n line-height: 1;\\n box-shadow: 0 0 8px var(--Dash-Shading-Strong);\\n background-color: var(--Dash-Fill-Inverse-Strong);\\n user-select: none;\\n z-index: 1000;\\n fill: var(--Dash-Fill-Inverse-Strong);\\n}\\n\\n.dash-slider-tooltip.always-visible {\\n display: block;\\n}\\n\\n/* Include property to mimic rc-slider behavior */\\n.dash-slider-root:not([data-included='false']) .dash-slider-range {\\n background-color: var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n.dash-slider-root[data-included='false'] .dash-slider-range {\\n background-color: transparent;\\n}\\n\\n/* Disabled state */\\n.dash-slider-root[data-disabled] {\\n opacity: 0.5;\\n cursor: not-allowed;\\n}\\n\\n.dash-slider-root[data-disabled] .dash-slider-track {\\n background-color: var(--Dash-Fill-Disabled);\\n}\\n\\n.dash-slider-root[data-disabled] .dash-slider-range {\\n background-color: var(--Dash-Fill-Disabled);\\n}\\n\\n.dash-slider-root[data-disabled] .dash-slider-thumb {\\n cursor: not-allowed;\\n border-color: var(--Dash-Fill-Disabled);\\n}\\n\\n.dash-slider-container {\\n display: flex;\\n align-items: center;\\n gap: 16px;\\n width: 100%;\\n container-type: inline-size;\\n}\\n\\n.dash-slider-wrapper {\\n flex: 1;\\n min-width: 0;\\n}\\n\\n.dash-range-slider-inputs {\\n display: flex;\\n flex-direction: column;\\n gap: 4px;\\n min-width: 64px;\\n}\\n\\n.dash-range-slider-min-input {\\n text-align: center;\\n}\\n\\n.dash-range-slider-max-input {\\n order: 1;\\n}\\n\\n.dash-range-slider-input {\\n min-width: 5cqw; /* 5% of container width */\\n max-width: 25cqw; /* 25% of container width */\\n text-align: center;\\n -webkit-appearance: textfield;\\n -moz-appearance: textfield;\\n appearance: textfield;\\n font-family: inherit;\\n font-size: inherit;\\n box-sizing: content-box;\\n height: 30px;\\n}\\n\\n.dash-range-slider-input:only-of-type {\\n max-width: 33cqw;\\n}\\n\\n.dash-range-slider-input::selection,\\n.dash-range-slider-input::-webkit-selection {\\n color: var(--Dash-Fill-Inverse-Strong);\\n background: var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n.dash-range-slider-input:focus {\\n outline: 1px solid var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n/* Hide the number input spinners */\\n.dash-range-slider-input::-webkit-inner-spin-button,\\n.dash-range-slider-input::-webkit-outer-spin-button {\\n -webkit-appearance: none;\\n margin: 0;\\n}\\n\\n/* Hide inputs on small containers using container queries */\\n/* single slider input */\\n@container (max-width: 200px) {\\n .dash-slider-container .dash-range-slider-input:only-of-type {\\n display: none;\\n }\\n}\\n\\n/* range slider inputs */\\n@container (max-width: 300px) {\\n .dash-slider-container .dash-range-slider-min-input,\\n .dash-slider-container .dash-range-slider-max-input {\\n display: none;\\n }\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"/* Tab parent container */\\n.tab-parent {\\n display: flex;\\n flex-direction: column;\\n overflow: hidden;\\n}\\n\\n/* Tab container (holds all tabs) */\\n.tab-container {\\n display: flex;\\n flex-direction: column;\\n}\\n\\n.tab-container--vert {\\n display: inline-flex;\\n}\\n\\n/* Individual tab */\\n.tab {\\n flex: 1 1 0;\\n min-width: 0;\\n background-color: var(--tabs-background);\\n border: 1px solid var(--tabs-border);\\n border-bottom: none;\\n padding: 20px 25px;\\n transition: background-color, color 200ms;\\n text-align: center;\\n box-sizing: border-box;\\n cursor: pointer;\\n}\\n\\n/* Tab selected state */\\n.tab--selected {\\n border-top: 2px solid var(--tabs-primary);\\n color: var(--Dash-Text-Primary);\\n background-color: var(--Dash-Fill-Inverse-Strong);\\n}\\n\\n.tab--selected:hover {\\n background-color: var(--Dash-Fill-Inverse-Strong);\\n}\\n\\n/* Tab disabled state */\\n.tab--disabled {\\n opacity: 0.6;\\n cursor: not-allowed;\\n}\\n\\n/* Tab content area */\\n.tab-content--vert {\\n display: inline-flex;\\n flex-direction: column;\\n}\\n\\n/* Desktop/tablet styles (when above breakpoint) */\\n.tab-parent--above-breakpoint .tab {\\n border: 1px solid var(--tabs-border);\\n border-right: none;\\n}\\n\\n.tab-parent--above-breakpoint .tab:last-child {\\n border-right: 1px solid var(--tabs-border);\\n border-bottom: 1px solid var(--tabs-border);\\n}\\n\\n.tab-parent--above-breakpoint .tab--selected,\\n.tab-parent--above-breakpoint .tab:last-child.tab--selected {\\n border-bottom: none;\\n}\\n\\n/* Vertical tabs: left border for selected */\\n.tab-parent--above-breakpoint .tab-container--vert .tab--selected {\\n border-left: 2px solid var(--tabs-primary);\\n}\\n\\n/* Horizontal tabs: top border for selected */\\n.tab-parent--above-breakpoint\\n .tab-container:not(.tab-container--vert)\\n .tab--selected,\\n.tab-parent--above-breakpoint\\n .tab-container:not(.tab-container--vert)\\n .tab:last-child.tab--selected {\\n border-top: 2px solid var(--tabs-primary);\\n}\\n\\n.tab-parent--above-breakpoint .tab-container--vert .tab {\\n width: auto;\\n border-right: none !important;\\n border-bottom: none !important;\\n}\\n\\n.tab-parent--above-breakpoint .tab-container--vert .tab:last-child {\\n border-bottom: 1px solid var(--tabs-border) !important;\\n}\\n\\n.tab-parent--above-breakpoint .tab-container--vert .tab--selected {\\n border-top: 1px solid var(--tabs-border);\\n border-left: 2px solid var(--tabs-primary);\\n border-right: none;\\n}\\n\\n.tab-parent--above-breakpoint .tab-container {\\n flex-direction: row;\\n}\\n\\n.tab-parent--above-breakpoint .tab-container--vert {\\n flex-direction: column;\\n}\\n\\n.tab-parent--above-breakpoint.tab-parent--vert {\\n display: inline-flex;\\n flex-direction: row;\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/css/tabs.css\"],\"names\":[],\"mappings\":\"AAAA,yBAAyB;AACzB;IACI,aAAa;IACb,sBAAsB;IACtB,gBAAgB;AACpB;;AAEA,mCAAmC;AACnC;IACI,aAAa;IACb,sBAAsB;AAC1B;;AAEA;IACI,oBAAoB;AACxB;;AAEA,mBAAmB;AACnB;IACI,WAAW;IACX,YAAY;IACZ,wCAAwC;IACxC,oCAAoC;IACpC,mBAAmB;IACnB,kBAAkB;IAClB,yCAAyC;IACzC,kBAAkB;IAClB,sBAAsB;IACtB,eAAe;AACnB;;AAEA,uBAAuB;AACvB;IACI,yCAAyC;IACzC,+BAA+B;IAC/B,iDAAiD;AACrD;;AAEA;IACI,iDAAiD;AACrD;;AAEA,uBAAuB;AACvB;IACI,YAAY;IACZ,mBAAmB;AACvB;;AAEA,qBAAqB;AACrB;IACI,oBAAoB;IACpB,sBAAsB;AAC1B;;AAEA,kDAAkD;AAClD;IACI,oCAAoC;IACpC,kBAAkB;AACtB;;AAEA;IACI,0CAA0C;IAC1C,2CAA2C;AAC/C;;AAEA;;IAEI,mBAAmB;AACvB;;AAEA,4CAA4C;AAC5C;IACI,0CAA0C;AAC9C;;AAEA,6CAA6C;AAC7C;;;;;;IAMI,yCAAyC;AAC7C;;AAEA;IACI,WAAW;IACX,6BAA6B;IAC7B,8BAA8B;AAClC;;AAEA;IACI,sDAAsD;AAC1D;;AAEA;IACI,wCAAwC;IACxC,0CAA0C;IAC1C,kBAAkB;AACtB;;AAEA;IACI,mBAAmB;AACvB;;AAEA;IACI,sBAAsB;AAC1B;;AAEA;IACI,oBAAoB;IACpB,mBAAmB;AACvB\",\"sourcesContent\":[\"/* Tab parent container */\\n.tab-parent {\\n display: flex;\\n flex-direction: column;\\n overflow: hidden;\\n}\\n\\n/* Tab container (holds all tabs) */\\n.tab-container {\\n display: flex;\\n flex-direction: column;\\n}\\n\\n.tab-container--vert {\\n display: inline-flex;\\n}\\n\\n/* Individual tab */\\n.tab {\\n flex: 1 1 0;\\n min-width: 0;\\n background-color: var(--tabs-background);\\n border: 1px solid var(--tabs-border);\\n border-bottom: none;\\n padding: 20px 25px;\\n transition: background-color, color 200ms;\\n text-align: center;\\n box-sizing: border-box;\\n cursor: pointer;\\n}\\n\\n/* Tab selected state */\\n.tab--selected {\\n border-top: 2px solid var(--tabs-primary);\\n color: var(--Dash-Text-Primary);\\n background-color: var(--Dash-Fill-Inverse-Strong);\\n}\\n\\n.tab--selected:hover {\\n background-color: var(--Dash-Fill-Inverse-Strong);\\n}\\n\\n/* Tab disabled state */\\n.tab--disabled {\\n opacity: 0.6;\\n cursor: not-allowed;\\n}\\n\\n/* Tab content area */\\n.tab-content--vert {\\n display: inline-flex;\\n flex-direction: column;\\n}\\n\\n/* Desktop/tablet styles (when above breakpoint) */\\n.tab-parent--above-breakpoint .tab {\\n border: 1px solid var(--tabs-border);\\n border-right: none;\\n}\\n\\n.tab-parent--above-breakpoint .tab:last-child {\\n border-right: 1px solid var(--tabs-border);\\n border-bottom: 1px solid var(--tabs-border);\\n}\\n\\n.tab-parent--above-breakpoint .tab--selected,\\n.tab-parent--above-breakpoint .tab:last-child.tab--selected {\\n border-bottom: none;\\n}\\n\\n/* Vertical tabs: left border for selected */\\n.tab-parent--above-breakpoint .tab-container--vert .tab--selected {\\n border-left: 2px solid var(--tabs-primary);\\n}\\n\\n/* Horizontal tabs: top border for selected */\\n.tab-parent--above-breakpoint\\n .tab-container:not(.tab-container--vert)\\n .tab--selected,\\n.tab-parent--above-breakpoint\\n .tab-container:not(.tab-container--vert)\\n .tab:last-child.tab--selected {\\n border-top: 2px solid var(--tabs-primary);\\n}\\n\\n.tab-parent--above-breakpoint .tab-container--vert .tab {\\n width: auto;\\n border-right: none !important;\\n border-bottom: none !important;\\n}\\n\\n.tab-parent--above-breakpoint .tab-container--vert .tab:last-child {\\n border-bottom: 1px solid var(--tabs-border) !important;\\n}\\n\\n.tab-parent--above-breakpoint .tab-container--vert .tab--selected {\\n border-top: 1px solid var(--tabs-border);\\n border-left: 2px solid var(--tabs-primary);\\n border-right: none;\\n}\\n\\n.tab-parent--above-breakpoint .tab-container {\\n flex-direction: row;\\n}\\n\\n.tab-parent--above-breakpoint .tab-container--vert {\\n flex-direction: column;\\n}\\n\\n.tab-parent--above-breakpoint.tab-parent--vert {\\n display: inline-flex;\\n flex-direction: row;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"/* Input container styles */\\n.dash-textarea {\\n background: var(--Dash-Fill-Inverse-Strong);\\n border-radius: var(--Dash-Spacing);\\n border: 1px solid var(--Dash-Stroke-Strong);\\n box-sizing: border-box;\\n color: inherit;\\n padding: var(--Dash-Spacing) calc(2 * var(--Dash-Spacing));\\n width: 100%;\\n accent-color: var(--Dash-Fill-Interactive-Strong);\\n outline-color: var(--Dash-Fill-Interactive-Strong);\\n font-family: inherit;\\n font-size: inherit;\\n}\\n\\n.dash-textarea:focus-within {\\n border: 1px solid var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n.dash-textarea:focus-visible {\\n outline: 1px solid var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n.dash-textarea:disabled {\\n opacity: 0.6;\\n cursor: not-allowed;\\n}\\n\\n.dash-textarea:invalid {\\n outline: solid red;\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/css/textarea.css\"],\"names\":[],\"mappings\":\"AAAA,2BAA2B;AAC3B;IACI,2CAA2C;IAC3C,kCAAkC;IAClC,2CAA2C;IAC3C,sBAAsB;IACtB,cAAc;IACd,0DAA0D;IAC1D,WAAW;IACX,iDAAiD;IACjD,kDAAkD;IAClD,oBAAoB;IACpB,kBAAkB;AACtB;;AAEA;IACI,qDAAqD;AACzD;;AAEA;IACI,sDAAsD;AAC1D;;AAEA;IACI,YAAY;IACZ,mBAAmB;AACvB;;AAEA;IACI,kBAAkB;AACtB\",\"sourcesContent\":[\"/* Input container styles */\\n.dash-textarea {\\n background: var(--Dash-Fill-Inverse-Strong);\\n border-radius: var(--Dash-Spacing);\\n border: 1px solid var(--Dash-Stroke-Strong);\\n box-sizing: border-box;\\n color: inherit;\\n padding: var(--Dash-Spacing) calc(2 * var(--Dash-Spacing));\\n width: 100%;\\n accent-color: var(--Dash-Fill-Interactive-Strong);\\n outline-color: var(--Dash-Fill-Interactive-Strong);\\n font-family: inherit;\\n font-size: inherit;\\n}\\n\\n.dash-textarea:focus-within {\\n border: 1px solid var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n.dash-textarea:focus-visible {\\n outline: 1px solid var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n.dash-textarea:disabled {\\n opacity: 0.6;\\n cursor: not-allowed;\\n}\\n\\n.dash-textarea:invalid {\\n outline: solid red;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".dash-tooltip {\\n position: absolute;\\n}\\n\\n.hover {\\n position: absolute;\\n}\\n.hover-right {\\n /* Offset so that the triangle caret lands directly on what's hovered */\\n transform: translate(5px, 0);\\n top: 50%;\\n left: 100%;\\n}\\n.hover-left {\\n transform: translate(-5px, 0);\\n top: 50%;\\n}\\n.hover-bottom {\\n transform: translate(0, 6px);\\n top: 100%;\\n left: 50%;\\n}\\n.hover-top {\\n transform: translate(0, -5px);\\n left: 50%;\\n}\\n.hover-content {\\n position: absolute;\\n border: 1px solid var(--Dash-Tooltip-Border-Color);\\n border-radius: 2px;\\n padding: 5px 10px;\\n background: var(--Dash-Tooltip-Background-Color);\\n white-space: nowrap;\\n z-index: var(--Dash-Tooltip-ZIndex);\\n pointer-events: var(--Dash-Tooltip-PointerEvents);\\n box-shadow: 0px 10px 38px -10px var(--Dash-Shading-Strong),\\n 0px 10px 20px -15px var(--Dash-Shading-Weak);\\n}\\n.hover .hover-content,\\n.hover-right .hover-content {\\n transform: translate(0, -50%);\\n}\\n.hover-left .hover-content {\\n transform: translate(-100%, -50%);\\n}\\n.hover-top .hover-content {\\n transform: translate(-50%, -100%);\\n}\\n.hover-bottom .hover-content {\\n transform: translate(-50%, 0);\\n}\\n/* Add a small triangle on the left side of the box */\\n.hover:before,\\n.hover:after {\\n content: '';\\n width: 0;\\n height: 0;\\n position: absolute;\\n border-style: solid;\\n top: -6px;\\n z-index: var(--Dash-Tooltip-ZIndex);\\n}\\n.hover:before,\\n.hover:after,\\n.hover-right:before,\\n.hover-right:after {\\n border-width: 6px 6px 6px 0;\\n}\\n.hover-top:before,\\n.hover-top:after {\\n border-width: 6px 6px 0 6px;\\n}\\n.hover-bottom:before,\\n.hover-bottom:after {\\n border-width: 0 6px 6px 6px;\\n}\\n.hover-left:before,\\n.hover-left:after {\\n border-width: 6px 0 6px 6px;\\n}\\n.hover:before,\\n.hover-right:before {\\n border-color: transparent var(--Dash-Tooltip-Border-Color) transparent\\n transparent;\\n left: -5px;\\n}\\n.hover:after,\\n.hover-right:after {\\n border-color: transparent var(--Dash-Tooltip-Background-Color) transparent\\n transparent;\\n left: -4px;\\n}\\n.hover-left:before {\\n border-color: transparent transparent transparent\\n var(--Dash-Tooltip-Border-Color);\\n left: -1px;\\n}\\n.hover-left:after {\\n border-color: transparent transparent transparent\\n var(--Dash-Tooltip-Background-Color);\\n left: -2px;\\n}\\n.hover-top:before,\\n.hover-top:after,\\n.hover-bottom:before,\\n.hover-bottom:after {\\n left: -6px;\\n}\\n.hover-bottom:before {\\n border-color: transparent transparent var(--Dash-Tooltip-Border-Color)\\n transparent;\\n}\\n.hover-bottom:after {\\n border-color: transparent transparent var(--Dash-Tooltip-Background-Color)\\n transparent;\\n top: -5px;\\n}\\n.hover-top:before {\\n border-color: var(--Dash-Tooltip-Border-Color) transparent transparent\\n transparent;\\n top: -1px;\\n}\\n.hover-top:after {\\n border-color: var(--Dash-Tooltip-Border-Color) transparent transparent\\n transparent;\\n top: -2px;\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/css/tooltip.css\"],\"names\":[],\"mappings\":\"AAAA;IACI,kBAAkB;AACtB;;AAEA;IACI,kBAAkB;AACtB;AACA;IACI,uEAAuE;IACvE,4BAA4B;IAC5B,QAAQ;IACR,UAAU;AACd;AACA;IACI,6BAA6B;IAC7B,QAAQ;AACZ;AACA;IACI,4BAA4B;IAC5B,SAAS;IACT,SAAS;AACb;AACA;IACI,6BAA6B;IAC7B,SAAS;AACb;AACA;IACI,kBAAkB;IAClB,kDAAkD;IAClD,kBAAkB;IAClB,iBAAiB;IACjB,gDAAgD;IAChD,mBAAmB;IACnB,mCAAmC;IACnC,iDAAiD;IACjD;oDACgD;AACpD;AACA;;IAEI,6BAA6B;AACjC;AACA;IACI,iCAAiC;AACrC;AACA;IACI,iCAAiC;AACrC;AACA;IACI,6BAA6B;AACjC;AACA,qDAAqD;AACrD;;IAEI,WAAW;IACX,QAAQ;IACR,SAAS;IACT,kBAAkB;IAClB,mBAAmB;IACnB,SAAS;IACT,mCAAmC;AACvC;AACA;;;;IAII,2BAA2B;AAC/B;AACA;;IAEI,2BAA2B;AAC/B;AACA;;IAEI,2BAA2B;AAC/B;AACA;;IAEI,2BAA2B;AAC/B;AACA;;IAEI;mBACe;IACf,UAAU;AACd;AACA;;IAEI;mBACe;IACf,UAAU;AACd;AACA;IACI;wCACoC;IACpC,UAAU;AACd;AACA;IACI;4CACwC;IACxC,UAAU;AACd;AACA;;;;IAII,UAAU;AACd;AACA;IACI;mBACe;AACnB;AACA;IACI;mBACe;IACf,SAAS;AACb;AACA;IACI;mBACe;IACf,SAAS;AACb;AACA;IACI;mBACe;IACf,SAAS;AACb\",\"sourcesContent\":[\".dash-tooltip {\\n position: absolute;\\n}\\n\\n.hover {\\n position: absolute;\\n}\\n.hover-right {\\n /* Offset so that the triangle caret lands directly on what's hovered */\\n transform: translate(5px, 0);\\n top: 50%;\\n left: 100%;\\n}\\n.hover-left {\\n transform: translate(-5px, 0);\\n top: 50%;\\n}\\n.hover-bottom {\\n transform: translate(0, 6px);\\n top: 100%;\\n left: 50%;\\n}\\n.hover-top {\\n transform: translate(0, -5px);\\n left: 50%;\\n}\\n.hover-content {\\n position: absolute;\\n border: 1px solid var(--Dash-Tooltip-Border-Color);\\n border-radius: 2px;\\n padding: 5px 10px;\\n background: var(--Dash-Tooltip-Background-Color);\\n white-space: nowrap;\\n z-index: var(--Dash-Tooltip-ZIndex);\\n pointer-events: var(--Dash-Tooltip-PointerEvents);\\n box-shadow: 0px 10px 38px -10px var(--Dash-Shading-Strong),\\n 0px 10px 20px -15px var(--Dash-Shading-Weak);\\n}\\n.hover .hover-content,\\n.hover-right .hover-content {\\n transform: translate(0, -50%);\\n}\\n.hover-left .hover-content {\\n transform: translate(-100%, -50%);\\n}\\n.hover-top .hover-content {\\n transform: translate(-50%, -100%);\\n}\\n.hover-bottom .hover-content {\\n transform: translate(-50%, 0);\\n}\\n/* Add a small triangle on the left side of the box */\\n.hover:before,\\n.hover:after {\\n content: '';\\n width: 0;\\n height: 0;\\n position: absolute;\\n border-style: solid;\\n top: -6px;\\n z-index: var(--Dash-Tooltip-ZIndex);\\n}\\n.hover:before,\\n.hover:after,\\n.hover-right:before,\\n.hover-right:after {\\n border-width: 6px 6px 6px 0;\\n}\\n.hover-top:before,\\n.hover-top:after {\\n border-width: 6px 6px 0 6px;\\n}\\n.hover-bottom:before,\\n.hover-bottom:after {\\n border-width: 0 6px 6px 6px;\\n}\\n.hover-left:before,\\n.hover-left:after {\\n border-width: 6px 0 6px 6px;\\n}\\n.hover:before,\\n.hover-right:before {\\n border-color: transparent var(--Dash-Tooltip-Border-Color) transparent\\n transparent;\\n left: -5px;\\n}\\n.hover:after,\\n.hover-right:after {\\n border-color: transparent var(--Dash-Tooltip-Background-Color) transparent\\n transparent;\\n left: -4px;\\n}\\n.hover-left:before {\\n border-color: transparent transparent transparent\\n var(--Dash-Tooltip-Border-Color);\\n left: -1px;\\n}\\n.hover-left:after {\\n border-color: transparent transparent transparent\\n var(--Dash-Tooltip-Background-Color);\\n left: -2px;\\n}\\n.hover-top:before,\\n.hover-top:after,\\n.hover-bottom:before,\\n.hover-bottom:after {\\n left: -6px;\\n}\\n.hover-bottom:before {\\n border-color: transparent transparent var(--Dash-Tooltip-Border-Color)\\n transparent;\\n}\\n.hover-bottom:after {\\n border-color: transparent transparent var(--Dash-Tooltip-Background-Color)\\n transparent;\\n top: -5px;\\n}\\n.hover-top:before {\\n border-color: var(--Dash-Tooltip-Border-Color) transparent transparent\\n transparent;\\n top: -1px;\\n}\\n.hover-top:after {\\n border-color: var(--Dash-Tooltip-Border-Color) transparent transparent\\n transparent;\\n top: -2px;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","\"use strict\";\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\nmodule.exports = function (cssWithMappingToString) {\n var list = [];\n\n // return the list of modules as css string\n list.toString = function toString() {\n return this.map(function (item) {\n var content = \"\";\n var needLayer = typeof item[5] !== \"undefined\";\n if (item[4]) {\n content += \"@supports (\".concat(item[4], \") {\");\n }\n if (item[2]) {\n content += \"@media \".concat(item[2], \" {\");\n }\n if (needLayer) {\n content += \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\");\n }\n content += cssWithMappingToString(item);\n if (needLayer) {\n content += \"}\";\n }\n if (item[2]) {\n content += \"}\";\n }\n if (item[4]) {\n content += \"}\";\n }\n return content;\n }).join(\"\");\n };\n\n // import a list of modules into the list\n list.i = function i(modules, media, dedupe, supports, layer) {\n if (typeof modules === \"string\") {\n modules = [[null, modules, undefined]];\n }\n var alreadyImportedModules = {};\n if (dedupe) {\n for (var k = 0; k < this.length; k++) {\n var id = this[k][0];\n if (id != null) {\n alreadyImportedModules[id] = true;\n }\n }\n }\n for (var _k = 0; _k < modules.length; _k++) {\n var item = [].concat(modules[_k]);\n if (dedupe && alreadyImportedModules[item[0]]) {\n continue;\n }\n if (typeof layer !== \"undefined\") {\n if (typeof item[5] === \"undefined\") {\n item[5] = layer;\n } else {\n item[1] = \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\").concat(item[1], \"}\");\n item[5] = layer;\n }\n }\n if (media) {\n if (!item[2]) {\n item[2] = media;\n } else {\n item[1] = \"@media \".concat(item[2], \" {\").concat(item[1], \"}\");\n item[2] = media;\n }\n }\n if (supports) {\n if (!item[4]) {\n item[4] = \"\".concat(supports);\n } else {\n item[1] = \"@supports (\".concat(item[4], \") {\").concat(item[1], \"}\");\n item[4] = supports;\n }\n }\n list.push(item);\n }\n };\n return list;\n};","\"use strict\";\n\nmodule.exports = function (item) {\n var content = item[1];\n var cssMapping = item[3];\n if (!cssMapping) {\n return content;\n }\n if (typeof btoa === \"function\") {\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\n var data = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(base64);\n var sourceMapping = \"/*# \".concat(data, \" */\");\n return [content].concat([sourceMapping]).join(\"\\n\");\n }\n return [content].join(\"\\n\");\n};","'use strict';\n\nvar $defineProperty = require('es-define-property');\n\nvar $SyntaxError = require('es-errors/syntax');\nvar $TypeError = require('es-errors/type');\n\nvar gopd = require('gopd');\n\n/** @type {import('.')} */\nmodule.exports = function defineDataProperty(\n\tobj,\n\tproperty,\n\tvalue\n) {\n\tif (!obj || (typeof obj !== 'object' && typeof obj !== 'function')) {\n\t\tthrow new $TypeError('`obj` must be an object or a function`');\n\t}\n\tif (typeof property !== 'string' && typeof property !== 'symbol') {\n\t\tthrow new $TypeError('`property` must be a string or a symbol`');\n\t}\n\tif (arguments.length > 3 && typeof arguments[3] !== 'boolean' && arguments[3] !== null) {\n\t\tthrow new $TypeError('`nonEnumerable`, if provided, must be a boolean or null');\n\t}\n\tif (arguments.length > 4 && typeof arguments[4] !== 'boolean' && arguments[4] !== null) {\n\t\tthrow new $TypeError('`nonWritable`, if provided, must be a boolean or null');\n\t}\n\tif (arguments.length > 5 && typeof arguments[5] !== 'boolean' && arguments[5] !== null) {\n\t\tthrow new $TypeError('`nonConfigurable`, if provided, must be a boolean or null');\n\t}\n\tif (arguments.length > 6 && typeof arguments[6] !== 'boolean') {\n\t\tthrow new $TypeError('`loose`, if provided, must be a boolean');\n\t}\n\n\tvar nonEnumerable = arguments.length > 3 ? arguments[3] : null;\n\tvar nonWritable = arguments.length > 4 ? arguments[4] : null;\n\tvar nonConfigurable = arguments.length > 5 ? arguments[5] : null;\n\tvar loose = arguments.length > 6 ? arguments[6] : false;\n\n\t/* @type {false | TypedPropertyDescriptor} */\n\tvar desc = !!gopd && gopd(obj, property);\n\n\tif ($defineProperty) {\n\t\t$defineProperty(obj, property, {\n\t\t\tconfigurable: nonConfigurable === null && desc ? desc.configurable : !nonConfigurable,\n\t\t\tenumerable: nonEnumerable === null && desc ? desc.enumerable : !nonEnumerable,\n\t\t\tvalue: value,\n\t\t\twritable: nonWritable === null && desc ? desc.writable : !nonWritable\n\t\t});\n\t} else if (loose || (!nonEnumerable && !nonWritable && !nonConfigurable)) {\n\t\t// must fall back to [[Set]], and was not explicitly asked to make non-enumerable, non-writable, or non-configurable\n\t\tobj[property] = value; // eslint-disable-line no-param-reassign\n\t} else {\n\t\tthrow new $SyntaxError('This environment does not support defining a property as non-configurable, non-writable, or non-enumerable.');\n\t}\n};\n","'use strict';\n\nvar keys = require('object-keys');\nvar hasSymbols = typeof Symbol === 'function' && typeof Symbol('foo') === 'symbol';\n\nvar toStr = Object.prototype.toString;\nvar concat = Array.prototype.concat;\nvar defineDataProperty = require('define-data-property');\n\nvar isFunction = function (fn) {\n\treturn typeof fn === 'function' && toStr.call(fn) === '[object Function]';\n};\n\nvar supportsDescriptors = require('has-property-descriptors')();\n\nvar defineProperty = function (object, name, value, predicate) {\n\tif (name in object) {\n\t\tif (predicate === true) {\n\t\t\tif (object[name] === value) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t} else if (!isFunction(predicate) || !predicate()) {\n\t\t\treturn;\n\t\t}\n\t}\n\n\tif (supportsDescriptors) {\n\t\tdefineDataProperty(object, name, value, true);\n\t} else {\n\t\tdefineDataProperty(object, name, value);\n\t}\n};\n\nvar defineProperties = function (object, map) {\n\tvar predicates = arguments.length > 2 ? arguments[2] : {};\n\tvar props = keys(map);\n\tif (hasSymbols) {\n\t\tprops = concat.call(props, Object.getOwnPropertySymbols(map));\n\t}\n\tfor (var i = 0; i < props.length; i += 1) {\n\t\tdefineProperty(object, props[i], map[props[i]], predicates[props[i]]);\n\t}\n};\n\ndefineProperties.supportsDescriptors = !!supportsDescriptors;\n\nmodule.exports = defineProperties;\n","'use strict';\n\nvar callBind = require('call-bind-apply-helpers');\nvar gOPD = require('gopd');\n\nvar hasProtoAccessor;\ntry {\n\t// eslint-disable-next-line no-extra-parens, no-proto\n\thasProtoAccessor = /** @type {{ __proto__?: typeof Array.prototype }} */ ([]).__proto__ === Array.prototype;\n} catch (e) {\n\tif (!e || typeof e !== 'object' || !('code' in e) || e.code !== 'ERR_PROTO_ACCESS') {\n\t\tthrow e;\n\t}\n}\n\n// eslint-disable-next-line no-extra-parens\nvar desc = !!hasProtoAccessor && gOPD && gOPD(Object.prototype, /** @type {keyof typeof Object.prototype} */ ('__proto__'));\n\nvar $Object = Object;\nvar $getPrototypeOf = $Object.getPrototypeOf;\n\n/** @type {import('./get')} */\nmodule.exports = desc && typeof desc.get === 'function'\n\t? callBind([desc.get])\n\t: typeof $getPrototypeOf === 'function'\n\t\t? /** @type {import('./get')} */ function getDunder(value) {\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\treturn $getPrototypeOf(value == null ? value : $Object(value));\n\t\t}\n\t\t: false;\n","'use strict';\n\n/** @type {import('.')} */\nvar $defineProperty = Object.defineProperty || false;\nif ($defineProperty) {\n\ttry {\n\t\t$defineProperty({}, 'a', { value: 1 });\n\t} catch (e) {\n\t\t// IE 8 has a broken defineProperty\n\t\t$defineProperty = false;\n\t}\n}\n\nmodule.exports = $defineProperty;\n","'use strict';\n\n/** @type {import('./eval')} */\nmodule.exports = EvalError;\n","'use strict';\n\n/** @type {import('.')} */\nmodule.exports = Error;\n","'use strict';\n\n/** @type {import('./range')} */\nmodule.exports = RangeError;\n","'use strict';\n\n/** @type {import('./ref')} */\nmodule.exports = ReferenceError;\n","'use strict';\n\n/** @type {import('./syntax')} */\nmodule.exports = SyntaxError;\n","'use strict';\n\n/** @type {import('./type')} */\nmodule.exports = TypeError;\n","'use strict';\n\n/** @type {import('./uri')} */\nmodule.exports = URIError;\n","'use strict';\n\n/** @type {import('.')} */\nmodule.exports = Object;\n","(function(a,b){if(\"function\"==typeof define&&define.amd)define([],b);else if(\"undefined\"!=typeof exports)b();else{b(),a.FileSaver={exports:{}}.exports}})(this,function(){\"use strict\";function b(a,b){return\"undefined\"==typeof b?b={autoBom:!1}:\"object\"!=typeof b&&(console.warn(\"Deprecated: Expected third argument to be a object\"),b={autoBom:!b}),b.autoBom&&/^\\s*(?:text\\/\\S*|application\\/xml|\\S*\\/\\S*\\+xml)\\s*;.*charset\\s*=\\s*utf-8/i.test(a.type)?new Blob([\"\\uFEFF\",a],{type:a.type}):a}function c(a,b,c){var d=new XMLHttpRequest;d.open(\"GET\",a),d.responseType=\"blob\",d.onload=function(){g(d.response,b,c)},d.onerror=function(){console.error(\"could not download file\")},d.send()}function d(a){var b=new XMLHttpRequest;b.open(\"HEAD\",a,!1);try{b.send()}catch(a){}return 200<=b.status&&299>=b.status}function e(a){try{a.dispatchEvent(new MouseEvent(\"click\"))}catch(c){var b=document.createEvent(\"MouseEvents\");b.initMouseEvent(\"click\",!0,!0,window,0,0,0,80,20,!1,!1,!1,!1,0,null),a.dispatchEvent(b)}}var f=\"object\"==typeof window&&window.window===window?window:\"object\"==typeof self&&self.self===self?self:\"object\"==typeof global&&global.global===global?global:void 0,a=f.navigator&&/Macintosh/.test(navigator.userAgent)&&/AppleWebKit/.test(navigator.userAgent)&&!/Safari/.test(navigator.userAgent),g=f.saveAs||(\"object\"!=typeof window||window!==f?function(){}:\"download\"in HTMLAnchorElement.prototype&&!a?function(b,g,h){var i=f.URL||f.webkitURL,j=document.createElement(\"a\");g=g||b.name||\"download\",j.download=g,j.rel=\"noopener\",\"string\"==typeof b?(j.href=b,j.origin===location.origin?e(j):d(j.href)?c(b,g,h):e(j,j.target=\"_blank\")):(j.href=i.createObjectURL(b),setTimeout(function(){i.revokeObjectURL(j.href)},4E4),setTimeout(function(){e(j)},0))}:\"msSaveOrOpenBlob\"in navigator?function(f,g,h){if(g=g||f.name||\"download\",\"string\"!=typeof f)navigator.msSaveOrOpenBlob(b(f,h),g);else if(d(f))c(f,g,h);else{var i=document.createElement(\"a\");i.href=f,i.target=\"_blank\",setTimeout(function(){e(i)})}}:function(b,d,e,g){if(g=g||open(\"\",\"_blank\"),g&&(g.document.title=g.document.body.innerText=\"downloading...\"),\"string\"==typeof b)return c(b,d,e);var h=\"application/octet-stream\"===b.type,i=/constructor/i.test(f.HTMLElement)||f.safari,j=/CriOS\\/[\\d]+/.test(navigator.userAgent);if((j||h&&i||a)&&\"undefined\"!=typeof FileReader){var k=new FileReader;k.onloadend=function(){var a=k.result;a=j?a:a.replace(/^data:[^;]*;/,\"data:attachment/file;\"),g?g.location.href=a:location=a,g=null},k.readAsDataURL(b)}else{var l=f.URL||f.webkitURL,m=l.createObjectURL(b);g?g.location=m:location.href=m,g=null,setTimeout(function(){l.revokeObjectURL(m)},4E4)}});f.saveAs=g.saveAs=g,\"undefined\"!=typeof module&&(module.exports=g)});\n\n//# sourceMappingURL=FileSaver.min.js.map","'use strict';\n\nvar isCallable = require('is-callable');\n\nvar toStr = Object.prototype.toString;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\n/** @type {(arr: A, iterator: (this: This | void, value: A[number], index: number, arr: A) => void, receiver: This | undefined) => void} */\nvar forEachArray = function forEachArray(array, iterator, receiver) {\n for (var i = 0, len = array.length; i < len; i++) {\n if (hasOwnProperty.call(array, i)) {\n if (receiver == null) {\n iterator(array[i], i, array);\n } else {\n iterator.call(receiver, array[i], i, array);\n }\n }\n }\n};\n\n/** @type {(string: S, iterator: (this: This | void, value: S[number], index: number, string: S) => void, receiver: This | undefined) => void} */\nvar forEachString = function forEachString(string, iterator, receiver) {\n for (var i = 0, len = string.length; i < len; i++) {\n // no such thing as a sparse string.\n if (receiver == null) {\n iterator(string.charAt(i), i, string);\n } else {\n iterator.call(receiver, string.charAt(i), i, string);\n }\n }\n};\n\n/** @type {(obj: O, iterator: (this: This | void, value: O[keyof O], index: keyof O, obj: O) => void, receiver: This | undefined) => void} */\nvar forEachObject = function forEachObject(object, iterator, receiver) {\n for (var k in object) {\n if (hasOwnProperty.call(object, k)) {\n if (receiver == null) {\n iterator(object[k], k, object);\n } else {\n iterator.call(receiver, object[k], k, object);\n }\n }\n }\n};\n\n/** @type {(x: unknown) => x is readonly unknown[]} */\nfunction isArray(x) {\n return toStr.call(x) === '[object Array]';\n}\n\n/** @type {import('.')._internal} */\nmodule.exports = function forEach(list, iterator, thisArg) {\n if (!isCallable(iterator)) {\n throw new TypeError('iterator must be a function');\n }\n\n var receiver;\n if (arguments.length >= 3) {\n receiver = thisArg;\n }\n\n if (isArray(list)) {\n forEachArray(list, iterator, receiver);\n } else if (typeof list === 'string') {\n forEachString(list, iterator, receiver);\n } else {\n forEachObject(list, iterator, receiver);\n }\n};\n","'use strict';\n\n/* eslint no-invalid-this: 1 */\n\nvar ERROR_MESSAGE = 'Function.prototype.bind called on incompatible ';\nvar toStr = Object.prototype.toString;\nvar max = Math.max;\nvar funcType = '[object Function]';\n\nvar concatty = function concatty(a, b) {\n var arr = [];\n\n for (var i = 0; i < a.length; i += 1) {\n arr[i] = a[i];\n }\n for (var j = 0; j < b.length; j += 1) {\n arr[j + a.length] = b[j];\n }\n\n return arr;\n};\n\nvar slicy = function slicy(arrLike, offset) {\n var arr = [];\n for (var i = offset || 0, j = 0; i < arrLike.length; i += 1, j += 1) {\n arr[j] = arrLike[i];\n }\n return arr;\n};\n\nvar joiny = function (arr, joiner) {\n var str = '';\n for (var i = 0; i < arr.length; i += 1) {\n str += arr[i];\n if (i + 1 < arr.length) {\n str += joiner;\n }\n }\n return str;\n};\n\nmodule.exports = function bind(that) {\n var target = this;\n if (typeof target !== 'function' || toStr.apply(target) !== funcType) {\n throw new TypeError(ERROR_MESSAGE + target);\n }\n var args = slicy(arguments, 1);\n\n var bound;\n var binder = function () {\n if (this instanceof bound) {\n var result = target.apply(\n this,\n concatty(args, arguments)\n );\n if (Object(result) === result) {\n return result;\n }\n return this;\n }\n return target.apply(\n that,\n concatty(args, arguments)\n );\n\n };\n\n var boundLength = max(0, target.length - args.length);\n var boundArgs = [];\n for (var i = 0; i < boundLength; i++) {\n boundArgs[i] = '$' + i;\n }\n\n bound = Function('binder', 'return function (' + joiny(boundArgs, ',') + '){ return binder.apply(this,arguments); }')(binder);\n\n if (target.prototype) {\n var Empty = function Empty() {};\n Empty.prototype = target.prototype;\n bound.prototype = new Empty();\n Empty.prototype = null;\n }\n\n return bound;\n};\n","'use strict';\n\nvar implementation = require('./implementation');\n\nmodule.exports = Function.prototype.bind || implementation;\n","'use strict';\n\nvar undefined;\n\nvar $Object = require('es-object-atoms');\n\nvar $Error = require('es-errors');\nvar $EvalError = require('es-errors/eval');\nvar $RangeError = require('es-errors/range');\nvar $ReferenceError = require('es-errors/ref');\nvar $SyntaxError = require('es-errors/syntax');\nvar $TypeError = require('es-errors/type');\nvar $URIError = require('es-errors/uri');\n\nvar abs = require('math-intrinsics/abs');\nvar floor = require('math-intrinsics/floor');\nvar max = require('math-intrinsics/max');\nvar min = require('math-intrinsics/min');\nvar pow = require('math-intrinsics/pow');\nvar round = require('math-intrinsics/round');\nvar sign = require('math-intrinsics/sign');\n\nvar $Function = Function;\n\n// eslint-disable-next-line consistent-return\nvar getEvalledConstructor = function (expressionSyntax) {\n\ttry {\n\t\treturn $Function('\"use strict\"; return (' + expressionSyntax + ').constructor;')();\n\t} catch (e) {}\n};\n\nvar $gOPD = require('gopd');\nvar $defineProperty = require('es-define-property');\n\nvar throwTypeError = function () {\n\tthrow new $TypeError();\n};\nvar ThrowTypeError = $gOPD\n\t? (function () {\n\t\ttry {\n\t\t\t// eslint-disable-next-line no-unused-expressions, no-caller, no-restricted-properties\n\t\t\targuments.callee; // IE 8 does not throw here\n\t\t\treturn throwTypeError;\n\t\t} catch (calleeThrows) {\n\t\t\ttry {\n\t\t\t\t// IE 8 throws on Object.getOwnPropertyDescriptor(arguments, '')\n\t\t\t\treturn $gOPD(arguments, 'callee').get;\n\t\t\t} catch (gOPDthrows) {\n\t\t\t\treturn throwTypeError;\n\t\t\t}\n\t\t}\n\t}())\n\t: throwTypeError;\n\nvar hasSymbols = require('has-symbols')();\n\nvar getProto = require('get-proto');\nvar $ObjectGPO = require('get-proto/Object.getPrototypeOf');\nvar $ReflectGPO = require('get-proto/Reflect.getPrototypeOf');\n\nvar $apply = require('call-bind-apply-helpers/functionApply');\nvar $call = require('call-bind-apply-helpers/functionCall');\n\nvar needsEval = {};\n\nvar TypedArray = typeof Uint8Array === 'undefined' || !getProto ? undefined : getProto(Uint8Array);\n\nvar INTRINSICS = {\n\t__proto__: null,\n\t'%AggregateError%': typeof AggregateError === 'undefined' ? undefined : AggregateError,\n\t'%Array%': Array,\n\t'%ArrayBuffer%': typeof ArrayBuffer === 'undefined' ? undefined : ArrayBuffer,\n\t'%ArrayIteratorPrototype%': hasSymbols && getProto ? getProto([][Symbol.iterator]()) : undefined,\n\t'%AsyncFromSyncIteratorPrototype%': undefined,\n\t'%AsyncFunction%': needsEval,\n\t'%AsyncGenerator%': needsEval,\n\t'%AsyncGeneratorFunction%': needsEval,\n\t'%AsyncIteratorPrototype%': needsEval,\n\t'%Atomics%': typeof Atomics === 'undefined' ? undefined : Atomics,\n\t'%BigInt%': typeof BigInt === 'undefined' ? undefined : BigInt,\n\t'%BigInt64Array%': typeof BigInt64Array === 'undefined' ? undefined : BigInt64Array,\n\t'%BigUint64Array%': typeof BigUint64Array === 'undefined' ? undefined : BigUint64Array,\n\t'%Boolean%': Boolean,\n\t'%DataView%': typeof DataView === 'undefined' ? undefined : DataView,\n\t'%Date%': Date,\n\t'%decodeURI%': decodeURI,\n\t'%decodeURIComponent%': decodeURIComponent,\n\t'%encodeURI%': encodeURI,\n\t'%encodeURIComponent%': encodeURIComponent,\n\t'%Error%': $Error,\n\t'%eval%': eval, // eslint-disable-line no-eval\n\t'%EvalError%': $EvalError,\n\t'%Float16Array%': typeof Float16Array === 'undefined' ? undefined : Float16Array,\n\t'%Float32Array%': typeof Float32Array === 'undefined' ? undefined : Float32Array,\n\t'%Float64Array%': typeof Float64Array === 'undefined' ? undefined : Float64Array,\n\t'%FinalizationRegistry%': typeof FinalizationRegistry === 'undefined' ? undefined : FinalizationRegistry,\n\t'%Function%': $Function,\n\t'%GeneratorFunction%': needsEval,\n\t'%Int8Array%': typeof Int8Array === 'undefined' ? undefined : Int8Array,\n\t'%Int16Array%': typeof Int16Array === 'undefined' ? undefined : Int16Array,\n\t'%Int32Array%': typeof Int32Array === 'undefined' ? undefined : Int32Array,\n\t'%isFinite%': isFinite,\n\t'%isNaN%': isNaN,\n\t'%IteratorPrototype%': hasSymbols && getProto ? getProto(getProto([][Symbol.iterator]())) : undefined,\n\t'%JSON%': typeof JSON === 'object' ? JSON : undefined,\n\t'%Map%': typeof Map === 'undefined' ? undefined : Map,\n\t'%MapIteratorPrototype%': typeof Map === 'undefined' || !hasSymbols || !getProto ? undefined : getProto(new Map()[Symbol.iterator]()),\n\t'%Math%': Math,\n\t'%Number%': Number,\n\t'%Object%': $Object,\n\t'%Object.getOwnPropertyDescriptor%': $gOPD,\n\t'%parseFloat%': parseFloat,\n\t'%parseInt%': parseInt,\n\t'%Promise%': typeof Promise === 'undefined' ? undefined : Promise,\n\t'%Proxy%': typeof Proxy === 'undefined' ? undefined : Proxy,\n\t'%RangeError%': $RangeError,\n\t'%ReferenceError%': $ReferenceError,\n\t'%Reflect%': typeof Reflect === 'undefined' ? undefined : Reflect,\n\t'%RegExp%': RegExp,\n\t'%Set%': typeof Set === 'undefined' ? undefined : Set,\n\t'%SetIteratorPrototype%': typeof Set === 'undefined' || !hasSymbols || !getProto ? undefined : getProto(new Set()[Symbol.iterator]()),\n\t'%SharedArrayBuffer%': typeof SharedArrayBuffer === 'undefined' ? undefined : SharedArrayBuffer,\n\t'%String%': String,\n\t'%StringIteratorPrototype%': hasSymbols && getProto ? getProto(''[Symbol.iterator]()) : undefined,\n\t'%Symbol%': hasSymbols ? Symbol : undefined,\n\t'%SyntaxError%': $SyntaxError,\n\t'%ThrowTypeError%': ThrowTypeError,\n\t'%TypedArray%': TypedArray,\n\t'%TypeError%': $TypeError,\n\t'%Uint8Array%': typeof Uint8Array === 'undefined' ? undefined : Uint8Array,\n\t'%Uint8ClampedArray%': typeof Uint8ClampedArray === 'undefined' ? undefined : Uint8ClampedArray,\n\t'%Uint16Array%': typeof Uint16Array === 'undefined' ? undefined : Uint16Array,\n\t'%Uint32Array%': typeof Uint32Array === 'undefined' ? undefined : Uint32Array,\n\t'%URIError%': $URIError,\n\t'%WeakMap%': typeof WeakMap === 'undefined' ? undefined : WeakMap,\n\t'%WeakRef%': typeof WeakRef === 'undefined' ? undefined : WeakRef,\n\t'%WeakSet%': typeof WeakSet === 'undefined' ? undefined : WeakSet,\n\n\t'%Function.prototype.call%': $call,\n\t'%Function.prototype.apply%': $apply,\n\t'%Object.defineProperty%': $defineProperty,\n\t'%Object.getPrototypeOf%': $ObjectGPO,\n\t'%Math.abs%': abs,\n\t'%Math.floor%': floor,\n\t'%Math.max%': max,\n\t'%Math.min%': min,\n\t'%Math.pow%': pow,\n\t'%Math.round%': round,\n\t'%Math.sign%': sign,\n\t'%Reflect.getPrototypeOf%': $ReflectGPO\n};\n\nif (getProto) {\n\ttry {\n\t\tnull.error; // eslint-disable-line no-unused-expressions\n\t} catch (e) {\n\t\t// https://github.com/tc39/proposal-shadowrealm/pull/384#issuecomment-1364264229\n\t\tvar errorProto = getProto(getProto(e));\n\t\tINTRINSICS['%Error.prototype%'] = errorProto;\n\t}\n}\n\nvar doEval = function doEval(name) {\n\tvar value;\n\tif (name === '%AsyncFunction%') {\n\t\tvalue = getEvalledConstructor('async function () {}');\n\t} else if (name === '%GeneratorFunction%') {\n\t\tvalue = getEvalledConstructor('function* () {}');\n\t} else if (name === '%AsyncGeneratorFunction%') {\n\t\tvalue = getEvalledConstructor('async function* () {}');\n\t} else if (name === '%AsyncGenerator%') {\n\t\tvar fn = doEval('%AsyncGeneratorFunction%');\n\t\tif (fn) {\n\t\t\tvalue = fn.prototype;\n\t\t}\n\t} else if (name === '%AsyncIteratorPrototype%') {\n\t\tvar gen = doEval('%AsyncGenerator%');\n\t\tif (gen && getProto) {\n\t\t\tvalue = getProto(gen.prototype);\n\t\t}\n\t}\n\n\tINTRINSICS[name] = value;\n\n\treturn value;\n};\n\nvar LEGACY_ALIASES = {\n\t__proto__: null,\n\t'%ArrayBufferPrototype%': ['ArrayBuffer', 'prototype'],\n\t'%ArrayPrototype%': ['Array', 'prototype'],\n\t'%ArrayProto_entries%': ['Array', 'prototype', 'entries'],\n\t'%ArrayProto_forEach%': ['Array', 'prototype', 'forEach'],\n\t'%ArrayProto_keys%': ['Array', 'prototype', 'keys'],\n\t'%ArrayProto_values%': ['Array', 'prototype', 'values'],\n\t'%AsyncFunctionPrototype%': ['AsyncFunction', 'prototype'],\n\t'%AsyncGenerator%': ['AsyncGeneratorFunction', 'prototype'],\n\t'%AsyncGeneratorPrototype%': ['AsyncGeneratorFunction', 'prototype', 'prototype'],\n\t'%BooleanPrototype%': ['Boolean', 'prototype'],\n\t'%DataViewPrototype%': ['DataView', 'prototype'],\n\t'%DatePrototype%': ['Date', 'prototype'],\n\t'%ErrorPrototype%': ['Error', 'prototype'],\n\t'%EvalErrorPrototype%': ['EvalError', 'prototype'],\n\t'%Float32ArrayPrototype%': ['Float32Array', 'prototype'],\n\t'%Float64ArrayPrototype%': ['Float64Array', 'prototype'],\n\t'%FunctionPrototype%': ['Function', 'prototype'],\n\t'%Generator%': ['GeneratorFunction', 'prototype'],\n\t'%GeneratorPrototype%': ['GeneratorFunction', 'prototype', 'prototype'],\n\t'%Int8ArrayPrototype%': ['Int8Array', 'prototype'],\n\t'%Int16ArrayPrototype%': ['Int16Array', 'prototype'],\n\t'%Int32ArrayPrototype%': ['Int32Array', 'prototype'],\n\t'%JSONParse%': ['JSON', 'parse'],\n\t'%JSONStringify%': ['JSON', 'stringify'],\n\t'%MapPrototype%': ['Map', 'prototype'],\n\t'%NumberPrototype%': ['Number', 'prototype'],\n\t'%ObjectPrototype%': ['Object', 'prototype'],\n\t'%ObjProto_toString%': ['Object', 'prototype', 'toString'],\n\t'%ObjProto_valueOf%': ['Object', 'prototype', 'valueOf'],\n\t'%PromisePrototype%': ['Promise', 'prototype'],\n\t'%PromiseProto_then%': ['Promise', 'prototype', 'then'],\n\t'%Promise_all%': ['Promise', 'all'],\n\t'%Promise_reject%': ['Promise', 'reject'],\n\t'%Promise_resolve%': ['Promise', 'resolve'],\n\t'%RangeErrorPrototype%': ['RangeError', 'prototype'],\n\t'%ReferenceErrorPrototype%': ['ReferenceError', 'prototype'],\n\t'%RegExpPrototype%': ['RegExp', 'prototype'],\n\t'%SetPrototype%': ['Set', 'prototype'],\n\t'%SharedArrayBufferPrototype%': ['SharedArrayBuffer', 'prototype'],\n\t'%StringPrototype%': ['String', 'prototype'],\n\t'%SymbolPrototype%': ['Symbol', 'prototype'],\n\t'%SyntaxErrorPrototype%': ['SyntaxError', 'prototype'],\n\t'%TypedArrayPrototype%': ['TypedArray', 'prototype'],\n\t'%TypeErrorPrototype%': ['TypeError', 'prototype'],\n\t'%Uint8ArrayPrototype%': ['Uint8Array', 'prototype'],\n\t'%Uint8ClampedArrayPrototype%': ['Uint8ClampedArray', 'prototype'],\n\t'%Uint16ArrayPrototype%': ['Uint16Array', 'prototype'],\n\t'%Uint32ArrayPrototype%': ['Uint32Array', 'prototype'],\n\t'%URIErrorPrototype%': ['URIError', 'prototype'],\n\t'%WeakMapPrototype%': ['WeakMap', 'prototype'],\n\t'%WeakSetPrototype%': ['WeakSet', 'prototype']\n};\n\nvar bind = require('function-bind');\nvar hasOwn = require('hasown');\nvar $concat = bind.call($call, Array.prototype.concat);\nvar $spliceApply = bind.call($apply, Array.prototype.splice);\nvar $replace = bind.call($call, String.prototype.replace);\nvar $strSlice = bind.call($call, String.prototype.slice);\nvar $exec = bind.call($call, RegExp.prototype.exec);\n\n/* adapted from https://github.com/lodash/lodash/blob/4.17.15/dist/lodash.js#L6735-L6744 */\nvar rePropName = /[^%.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|%$))/g;\nvar reEscapeChar = /\\\\(\\\\)?/g; /** Used to match backslashes in property paths. */\nvar stringToPath = function stringToPath(string) {\n\tvar first = $strSlice(string, 0, 1);\n\tvar last = $strSlice(string, -1);\n\tif (first === '%' && last !== '%') {\n\t\tthrow new $SyntaxError('invalid intrinsic syntax, expected closing `%`');\n\t} else if (last === '%' && first !== '%') {\n\t\tthrow new $SyntaxError('invalid intrinsic syntax, expected opening `%`');\n\t}\n\tvar result = [];\n\t$replace(string, rePropName, function (match, number, quote, subString) {\n\t\tresult[result.length] = quote ? $replace(subString, reEscapeChar, '$1') : number || match;\n\t});\n\treturn result;\n};\n/* end adaptation */\n\nvar getBaseIntrinsic = function getBaseIntrinsic(name, allowMissing) {\n\tvar intrinsicName = name;\n\tvar alias;\n\tif (hasOwn(LEGACY_ALIASES, intrinsicName)) {\n\t\talias = LEGACY_ALIASES[intrinsicName];\n\t\tintrinsicName = '%' + alias[0] + '%';\n\t}\n\n\tif (hasOwn(INTRINSICS, intrinsicName)) {\n\t\tvar value = INTRINSICS[intrinsicName];\n\t\tif (value === needsEval) {\n\t\t\tvalue = doEval(intrinsicName);\n\t\t}\n\t\tif (typeof value === 'undefined' && !allowMissing) {\n\t\t\tthrow new $TypeError('intrinsic ' + name + ' exists, but is not available. Please file an issue!');\n\t\t}\n\n\t\treturn {\n\t\t\talias: alias,\n\t\t\tname: intrinsicName,\n\t\t\tvalue: value\n\t\t};\n\t}\n\n\tthrow new $SyntaxError('intrinsic ' + name + ' does not exist!');\n};\n\nmodule.exports = function GetIntrinsic(name, allowMissing) {\n\tif (typeof name !== 'string' || name.length === 0) {\n\t\tthrow new $TypeError('intrinsic name must be a non-empty string');\n\t}\n\tif (arguments.length > 1 && typeof allowMissing !== 'boolean') {\n\t\tthrow new $TypeError('\"allowMissing\" argument must be a boolean');\n\t}\n\n\tif ($exec(/^%?[^%]*%?$/, name) === null) {\n\t\tthrow new $SyntaxError('`%` may not be present anywhere but at the beginning and end of the intrinsic name');\n\t}\n\tvar parts = stringToPath(name);\n\tvar intrinsicBaseName = parts.length > 0 ? parts[0] : '';\n\n\tvar intrinsic = getBaseIntrinsic('%' + intrinsicBaseName + '%', allowMissing);\n\tvar intrinsicRealName = intrinsic.name;\n\tvar value = intrinsic.value;\n\tvar skipFurtherCaching = false;\n\n\tvar alias = intrinsic.alias;\n\tif (alias) {\n\t\tintrinsicBaseName = alias[0];\n\t\t$spliceApply(parts, $concat([0, 1], alias));\n\t}\n\n\tfor (var i = 1, isOwn = true; i < parts.length; i += 1) {\n\t\tvar part = parts[i];\n\t\tvar first = $strSlice(part, 0, 1);\n\t\tvar last = $strSlice(part, -1);\n\t\tif (\n\t\t\t(\n\t\t\t\t(first === '\"' || first === \"'\" || first === '`')\n\t\t\t\t|| (last === '\"' || last === \"'\" || last === '`')\n\t\t\t)\n\t\t\t&& first !== last\n\t\t) {\n\t\t\tthrow new $SyntaxError('property names with quotes must have matching quotes');\n\t\t}\n\t\tif (part === 'constructor' || !isOwn) {\n\t\t\tskipFurtherCaching = true;\n\t\t}\n\n\t\tintrinsicBaseName += '.' + part;\n\t\tintrinsicRealName = '%' + intrinsicBaseName + '%';\n\n\t\tif (hasOwn(INTRINSICS, intrinsicRealName)) {\n\t\t\tvalue = INTRINSICS[intrinsicRealName];\n\t\t} else if (value != null) {\n\t\t\tif (!(part in value)) {\n\t\t\t\tif (!allowMissing) {\n\t\t\t\t\tthrow new $TypeError('base intrinsic for ' + name + ' exists, but the property is not available.');\n\t\t\t\t}\n\t\t\t\treturn void undefined;\n\t\t\t}\n\t\t\tif ($gOPD && (i + 1) >= parts.length) {\n\t\t\t\tvar desc = $gOPD(value, part);\n\t\t\t\tisOwn = !!desc;\n\n\t\t\t\t// By convention, when a data property is converted to an accessor\n\t\t\t\t// property to emulate a data property that does not suffer from\n\t\t\t\t// the override mistake, that accessor's getter is marked with\n\t\t\t\t// an `originalValue` property. Here, when we detect this, we\n\t\t\t\t// uphold the illusion by pretending to see that original data\n\t\t\t\t// property, i.e., returning the value rather than the getter\n\t\t\t\t// itself.\n\t\t\t\tif (isOwn && 'get' in desc && !('originalValue' in desc.get)) {\n\t\t\t\t\tvalue = desc.get;\n\t\t\t\t} else {\n\t\t\t\t\tvalue = value[part];\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tisOwn = hasOwn(value, part);\n\t\t\t\tvalue = value[part];\n\t\t\t}\n\n\t\t\tif (isOwn && !skipFurtherCaching) {\n\t\t\t\tINTRINSICS[intrinsicRealName] = value;\n\t\t\t}\n\t\t}\n\t}\n\treturn value;\n};\n","'use strict';\n\nvar $Object = require('es-object-atoms');\n\n/** @type {import('./Object.getPrototypeOf')} */\nmodule.exports = $Object.getPrototypeOf || null;\n","'use strict';\n\n/** @type {import('./Reflect.getPrototypeOf')} */\nmodule.exports = (typeof Reflect !== 'undefined' && Reflect.getPrototypeOf) || null;\n","'use strict';\n\nvar reflectGetProto = require('./Reflect.getPrototypeOf');\nvar originalGetProto = require('./Object.getPrototypeOf');\n\nvar getDunderProto = require('dunder-proto/get');\n\n/** @type {import('.')} */\nmodule.exports = reflectGetProto\n\t? function getProto(O) {\n\t\t// @ts-expect-error TS can't narrow inside a closure, for some reason\n\t\treturn reflectGetProto(O);\n\t}\n\t: originalGetProto\n\t\t? function getProto(O) {\n\t\t\tif (!O || (typeof O !== 'object' && typeof O !== 'function')) {\n\t\t\t\tthrow new TypeError('getProto: not an object');\n\t\t\t}\n\t\t\t// @ts-expect-error TS can't narrow inside a closure, for some reason\n\t\t\treturn originalGetProto(O);\n\t\t}\n\t\t: getDunderProto\n\t\t\t? function getProto(O) {\n\t\t\t\t// @ts-expect-error TS can't narrow inside a closure, for some reason\n\t\t\t\treturn getDunderProto(O);\n\t\t\t}\n\t\t\t: null;\n","'use strict';\n\n/** @type {import('./gOPD')} */\nmodule.exports = Object.getOwnPropertyDescriptor;\n","'use strict';\n\n/** @type {import('.')} */\nvar $gOPD = require('./gOPD');\n\nif ($gOPD) {\n\ttry {\n\t\t$gOPD([], 'length');\n\t} catch (e) {\n\t\t// IE 8 has a broken gOPD\n\t\t$gOPD = null;\n\t}\n}\n\nmodule.exports = $gOPD;\n","'use strict';\n\nvar $defineProperty = require('es-define-property');\n\nvar hasPropertyDescriptors = function hasPropertyDescriptors() {\n\treturn !!$defineProperty;\n};\n\nhasPropertyDescriptors.hasArrayLengthDefineBug = function hasArrayLengthDefineBug() {\n\t// node v0.6 has a bug where array lengths can be Set but not Defined\n\tif (!$defineProperty) {\n\t\treturn null;\n\t}\n\ttry {\n\t\treturn $defineProperty([], 'length', { value: 1 }).length !== 1;\n\t} catch (e) {\n\t\t// In Firefox 4-22, defining length on an array throws an exception.\n\t\treturn true;\n\t}\n};\n\nmodule.exports = hasPropertyDescriptors;\n","'use strict';\n\nvar origSymbol = typeof Symbol !== 'undefined' && Symbol;\nvar hasSymbolSham = require('./shams');\n\n/** @type {import('.')} */\nmodule.exports = function hasNativeSymbols() {\n\tif (typeof origSymbol !== 'function') { return false; }\n\tif (typeof Symbol !== 'function') { return false; }\n\tif (typeof origSymbol('foo') !== 'symbol') { return false; }\n\tif (typeof Symbol('bar') !== 'symbol') { return false; }\n\n\treturn hasSymbolSham();\n};\n","'use strict';\n\n/** @type {import('./shams')} */\n/* eslint complexity: [2, 18], max-statements: [2, 33] */\nmodule.exports = function hasSymbols() {\n\tif (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; }\n\tif (typeof Symbol.iterator === 'symbol') { return true; }\n\n\t/** @type {{ [k in symbol]?: unknown }} */\n\tvar obj = {};\n\tvar sym = Symbol('test');\n\tvar symObj = Object(sym);\n\tif (typeof sym === 'string') { return false; }\n\n\tif (Object.prototype.toString.call(sym) !== '[object Symbol]') { return false; }\n\tif (Object.prototype.toString.call(symObj) !== '[object Symbol]') { return false; }\n\n\t// temp disabled per https://github.com/ljharb/object.assign/issues/17\n\t// if (sym instanceof Symbol) { return false; }\n\t// temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4\n\t// if (!(symObj instanceof Symbol)) { return false; }\n\n\t// if (typeof Symbol.prototype.toString !== 'function') { return false; }\n\t// if (String(sym) !== Symbol.prototype.toString.call(sym)) { return false; }\n\n\tvar symVal = 42;\n\tobj[sym] = symVal;\n\tfor (var _ in obj) { return false; } // eslint-disable-line no-restricted-syntax, no-unreachable-loop\n\tif (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; }\n\n\tif (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; }\n\n\tvar syms = Object.getOwnPropertySymbols(obj);\n\tif (syms.length !== 1 || syms[0] !== sym) { return false; }\n\n\tif (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; }\n\n\tif (typeof Object.getOwnPropertyDescriptor === 'function') {\n\t\t// eslint-disable-next-line no-extra-parens\n\t\tvar descriptor = /** @type {PropertyDescriptor} */ (Object.getOwnPropertyDescriptor(obj, sym));\n\t\tif (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; }\n\t}\n\n\treturn true;\n};\n","'use strict';\n\nvar hasSymbols = require('has-symbols/shams');\n\n/** @type {import('.')} */\nmodule.exports = function hasToStringTagShams() {\n\treturn hasSymbols() && !!Symbol.toStringTag;\n};\n","'use strict';\n\nvar call = Function.prototype.call;\nvar $hasOwn = Object.prototype.hasOwnProperty;\nvar bind = require('function-bind');\n\n/** @type {import('.')} */\nmodule.exports = bind.call(call, $hasOwn);\n","if (typeof Object.create === 'function') {\n // implementation from standard node.js 'util' module\n module.exports = function inherits(ctor, superCtor) {\n if (superCtor) {\n ctor.super_ = superCtor\n ctor.prototype = Object.create(superCtor.prototype, {\n constructor: {\n value: ctor,\n enumerable: false,\n writable: true,\n configurable: true\n }\n })\n }\n };\n} else {\n // old school shim for old browsers\n module.exports = function inherits(ctor, superCtor) {\n if (superCtor) {\n ctor.super_ = superCtor\n var TempCtor = function () {}\n TempCtor.prototype = superCtor.prototype\n ctor.prototype = new TempCtor()\n ctor.prototype.constructor = ctor\n }\n }\n}\n","'use strict';\n\nvar hasToStringTag = require('has-tostringtag/shams')();\nvar callBound = require('call-bound');\n\nvar $toString = callBound('Object.prototype.toString');\n\n/** @type {import('.')} */\nvar isStandardArguments = function isArguments(value) {\n\tif (\n\t\thasToStringTag\n\t\t&& value\n\t\t&& typeof value === 'object'\n\t\t&& Symbol.toStringTag in value\n\t) {\n\t\treturn false;\n\t}\n\treturn $toString(value) === '[object Arguments]';\n};\n\n/** @type {import('.')} */\nvar isLegacyArguments = function isArguments(value) {\n\tif (isStandardArguments(value)) {\n\t\treturn true;\n\t}\n\treturn value !== null\n\t\t&& typeof value === 'object'\n\t\t&& 'length' in value\n\t\t&& typeof value.length === 'number'\n\t\t&& value.length >= 0\n\t\t&& $toString(value) !== '[object Array]'\n\t\t&& 'callee' in value\n\t\t&& $toString(value.callee) === '[object Function]';\n};\n\nvar supportsStandardArguments = (function () {\n\treturn isStandardArguments(arguments);\n}());\n\n// @ts-expect-error TODO make this not error\nisStandardArguments.isLegacyArguments = isLegacyArguments; // for tests\n\n/** @type {import('.')} */\nmodule.exports = supportsStandardArguments ? isStandardArguments : isLegacyArguments;\n","'use strict';\n\nvar fnToStr = Function.prototype.toString;\nvar reflectApply = typeof Reflect === 'object' && Reflect !== null && Reflect.apply;\nvar badArrayLike;\nvar isCallableMarker;\nif (typeof reflectApply === 'function' && typeof Object.defineProperty === 'function') {\n\ttry {\n\t\tbadArrayLike = Object.defineProperty({}, 'length', {\n\t\t\tget: function () {\n\t\t\t\tthrow isCallableMarker;\n\t\t\t}\n\t\t});\n\t\tisCallableMarker = {};\n\t\t// eslint-disable-next-line no-throw-literal\n\t\treflectApply(function () { throw 42; }, null, badArrayLike);\n\t} catch (_) {\n\t\tif (_ !== isCallableMarker) {\n\t\t\treflectApply = null;\n\t\t}\n\t}\n} else {\n\treflectApply = null;\n}\n\nvar constructorRegex = /^\\s*class\\b/;\nvar isES6ClassFn = function isES6ClassFunction(value) {\n\ttry {\n\t\tvar fnStr = fnToStr.call(value);\n\t\treturn constructorRegex.test(fnStr);\n\t} catch (e) {\n\t\treturn false; // not a function\n\t}\n};\n\nvar tryFunctionObject = function tryFunctionToStr(value) {\n\ttry {\n\t\tif (isES6ClassFn(value)) { return false; }\n\t\tfnToStr.call(value);\n\t\treturn true;\n\t} catch (e) {\n\t\treturn false;\n\t}\n};\nvar toStr = Object.prototype.toString;\nvar objectClass = '[object Object]';\nvar fnClass = '[object Function]';\nvar genClass = '[object GeneratorFunction]';\nvar ddaClass = '[object HTMLAllCollection]'; // IE 11\nvar ddaClass2 = '[object HTML document.all class]';\nvar ddaClass3 = '[object HTMLCollection]'; // IE 9-10\nvar hasToStringTag = typeof Symbol === 'function' && !!Symbol.toStringTag; // better: use `has-tostringtag`\n\nvar isIE68 = !(0 in [,]); // eslint-disable-line no-sparse-arrays, comma-spacing\n\nvar isDDA = function isDocumentDotAll() { return false; };\nif (typeof document === 'object') {\n\t// Firefox 3 canonicalizes DDA to undefined when it's not accessed directly\n\tvar all = document.all;\n\tif (toStr.call(all) === toStr.call(document.all)) {\n\t\tisDDA = function isDocumentDotAll(value) {\n\t\t\t/* globals document: false */\n\t\t\t// in IE 6-8, typeof document.all is \"object\" and it's truthy\n\t\t\tif ((isIE68 || !value) && (typeof value === 'undefined' || typeof value === 'object')) {\n\t\t\t\ttry {\n\t\t\t\t\tvar str = toStr.call(value);\n\t\t\t\t\treturn (\n\t\t\t\t\t\tstr === ddaClass\n\t\t\t\t\t\t|| str === ddaClass2\n\t\t\t\t\t\t|| str === ddaClass3 // opera 12.16\n\t\t\t\t\t\t|| str === objectClass // IE 6-8\n\t\t\t\t\t) && value('') == null; // eslint-disable-line eqeqeq\n\t\t\t\t} catch (e) { /**/ }\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\t}\n}\n\nmodule.exports = reflectApply\n\t? function isCallable(value) {\n\t\tif (isDDA(value)) { return true; }\n\t\tif (!value) { return false; }\n\t\tif (typeof value !== 'function' && typeof value !== 'object') { return false; }\n\t\ttry {\n\t\t\treflectApply(value, null, badArrayLike);\n\t\t} catch (e) {\n\t\t\tif (e !== isCallableMarker) { return false; }\n\t\t}\n\t\treturn !isES6ClassFn(value) && tryFunctionObject(value);\n\t}\n\t: function isCallable(value) {\n\t\tif (isDDA(value)) { return true; }\n\t\tif (!value) { return false; }\n\t\tif (typeof value !== 'function' && typeof value !== 'object') { return false; }\n\t\tif (hasToStringTag) { return tryFunctionObject(value); }\n\t\tif (isES6ClassFn(value)) { return false; }\n\t\tvar strClass = toStr.call(value);\n\t\tif (strClass !== fnClass && strClass !== genClass && !(/^\\[object HTML/).test(strClass)) { return false; }\n\t\treturn tryFunctionObject(value);\n\t};\n","'use strict';\n\nvar callBound = require('call-bound');\nvar safeRegexTest = require('safe-regex-test');\nvar isFnRegex = safeRegexTest(/^\\s*(?:function)?\\*/);\nvar hasToStringTag = require('has-tostringtag/shams')();\nvar getProto = require('get-proto');\n\nvar toStr = callBound('Object.prototype.toString');\nvar fnToStr = callBound('Function.prototype.toString');\n\nvar getGeneratorFunction = require('generator-function');\n\n/** @type {import('.')} */\nmodule.exports = function isGeneratorFunction(fn) {\n\tif (typeof fn !== 'function') {\n\t\treturn false;\n\t}\n\tif (isFnRegex(fnToStr(fn))) {\n\t\treturn true;\n\t}\n\tif (!hasToStringTag) {\n\t\tvar str = toStr(fn);\n\t\treturn str === '[object GeneratorFunction]';\n\t}\n\tif (!getProto) {\n\t\treturn false;\n\t}\n\tvar GeneratorFunction = getGeneratorFunction();\n\treturn GeneratorFunction && getProto(fn) === GeneratorFunction.prototype;\n};\n","'use strict';\n\n/* http://www.ecma-international.org/ecma-262/6.0/#sec-number.isnan */\n\nmodule.exports = function isNaN(value) {\n\treturn value !== value;\n};\n","'use strict';\n\nvar callBind = require('call-bind');\nvar define = require('define-properties');\n\nvar implementation = require('./implementation');\nvar getPolyfill = require('./polyfill');\nvar shim = require('./shim');\n\nvar polyfill = callBind(getPolyfill(), Number);\n\n/* http://www.ecma-international.org/ecma-262/6.0/#sec-number.isnan */\n\ndefine(polyfill, {\n\tgetPolyfill: getPolyfill,\n\timplementation: implementation,\n\tshim: shim\n});\n\nmodule.exports = polyfill;\n","'use strict';\n\nvar implementation = require('./implementation');\n\nmodule.exports = function getPolyfill() {\n\tif (Number.isNaN && Number.isNaN(NaN) && !Number.isNaN('a')) {\n\t\treturn Number.isNaN;\n\t}\n\treturn implementation;\n};\n","'use strict';\n\nvar define = require('define-properties');\nvar getPolyfill = require('./polyfill');\n\n/* http://www.ecma-international.org/ecma-262/6.0/#sec-number.isnan */\n\nmodule.exports = function shimNumberIsNaN() {\n\tvar polyfill = getPolyfill();\n\tdefine(Number, { isNaN: polyfill }, {\n\t\tisNaN: function testIsNaN() {\n\t\t\treturn Number.isNaN !== polyfill;\n\t\t}\n\t});\n\treturn polyfill;\n};\n","'use strict';\n\nvar callBound = require('call-bound');\nvar hasToStringTag = require('has-tostringtag/shams')();\nvar hasOwn = require('hasown');\nvar gOPD = require('gopd');\n\n/** @type {import('.')} */\nvar fn;\n\nif (hasToStringTag) {\n\t/** @type {(receiver: ThisParameterType, ...args: Parameters) => ReturnType} */\n\tvar $exec = callBound('RegExp.prototype.exec');\n\t/** @type {object} */\n\tvar isRegexMarker = {};\n\n\tvar throwRegexMarker = function () {\n\t\tthrow isRegexMarker;\n\t};\n\t/** @type {{ toString(): never, valueOf(): never, [Symbol.toPrimitive]?(): never }} */\n\tvar badStringifier = {\n\t\ttoString: throwRegexMarker,\n\t\tvalueOf: throwRegexMarker\n\t};\n\n\tif (typeof Symbol.toPrimitive === 'symbol') {\n\t\tbadStringifier[Symbol.toPrimitive] = throwRegexMarker;\n\t}\n\n\t/** @type {import('.')} */\n\t// @ts-expect-error TS can't figure out that the $exec call always throws\n\t// eslint-disable-next-line consistent-return\n\tfn = function isRegex(value) {\n\t\tif (!value || typeof value !== 'object') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// eslint-disable-next-line no-extra-parens\n\t\tvar descriptor = /** @type {NonNullable} */ (gOPD)(/** @type {{ lastIndex?: unknown }} */ (value), 'lastIndex');\n\t\tvar hasLastIndexDataProperty = descriptor && hasOwn(descriptor, 'value');\n\t\tif (!hasLastIndexDataProperty) {\n\t\t\treturn false;\n\t\t}\n\n\t\ttry {\n\t\t\t// eslint-disable-next-line no-extra-parens\n\t\t\t$exec(value, /** @type {string} */ (/** @type {unknown} */ (badStringifier)));\n\t\t} catch (e) {\n\t\t\treturn e === isRegexMarker;\n\t\t}\n\t};\n} else {\n\t/** @type {(receiver: ThisParameterType, ...args: Parameters) => ReturnType} */\n\tvar $toString = callBound('Object.prototype.toString');\n\t/** @const @type {'[object RegExp]'} */\n\tvar regexClass = '[object RegExp]';\n\n\t/** @type {import('.')} */\n\tfn = function isRegex(value) {\n\t\t// In older browsers, typeof regex incorrectly returns 'function'\n\t\tif (!value || (typeof value !== 'object' && typeof value !== 'function')) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn $toString(value) === regexClass;\n\t};\n}\n\nmodule.exports = fn;\n","'use strict';\r\n\r\n/**\r\n * Is this string all whitespace?\r\n * This solution kind of makes my brain hurt, but it's significantly faster\r\n * than !str.trim() or any other solution I could find.\r\n *\r\n * whitespace codes from: http://en.wikipedia.org/wiki/Whitespace_character\r\n * and verified with:\r\n *\r\n * for(var i = 0; i < 65536; i++) {\r\n * var s = String.fromCharCode(i);\r\n * if(+s===0 && !s.trim()) console.log(i, s);\r\n * }\r\n *\r\n * which counts a couple of these as *not* whitespace, but finds nothing else\r\n * that *is* whitespace. Note that charCodeAt stops at 16 bits, but it appears\r\n * that there are no whitespace characters above this, and code points above\r\n * this do not map onto white space characters.\r\n */\r\n\r\nmodule.exports = function(str){\r\n var l = str.length,\r\n a;\r\n for(var i = 0; i < l; i++) {\r\n a = str.charCodeAt(i);\r\n if((a < 9 || a > 13) && (a !== 32) && (a !== 133) && (a !== 160) &&\r\n (a !== 5760) && (a !== 6158) && (a < 8192 || a > 8205) &&\r\n (a !== 8232) && (a !== 8233) && (a !== 8239) && (a !== 8287) &&\r\n (a !== 8288) && (a !== 12288) && (a !== 65279)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\n","'use strict';\n\nvar whichTypedArray = require('which-typed-array');\n\n/** @type {import('.')} */\nmodule.exports = function isTypedArray(value) {\n\treturn !!whichTypedArray(value);\n};\n","'use strict';\n\n/** @type {import('./abs')} */\nmodule.exports = Math.abs;\n","'use strict';\n\n/** @type {import('./floor')} */\nmodule.exports = Math.floor;\n","'use strict';\n\n/** @type {import('./isNaN')} */\nmodule.exports = Number.isNaN || function isNaN(a) {\n\treturn a !== a;\n};\n","'use strict';\n\n/** @type {import('./max')} */\nmodule.exports = Math.max;\n","'use strict';\n\n/** @type {import('./min')} */\nmodule.exports = Math.min;\n","'use strict';\n\n/** @type {import('./pow')} */\nmodule.exports = Math.pow;\n","'use strict';\n\n/** @type {import('./round')} */\nmodule.exports = Math.round;\n","'use strict';\n\nvar $isNaN = require('./isNaN');\n\n/** @type {import('./sign')} */\nmodule.exports = function sign(number) {\n\tif ($isNaN(number) || number === 0) {\n\t\treturn number;\n\t}\n\treturn number < 0 ? -1 : +1;\n};\n","'use strict';\n\nvar numberIsNaN = function (value) {\n\treturn value !== value;\n};\n\nmodule.exports = function is(a, b) {\n\tif (a === 0 && b === 0) {\n\t\treturn 1 / a === 1 / b;\n\t}\n\tif (a === b) {\n\t\treturn true;\n\t}\n\tif (numberIsNaN(a) && numberIsNaN(b)) {\n\t\treturn true;\n\t}\n\treturn false;\n};\n\n","'use strict';\n\nvar define = require('define-properties');\nvar callBind = require('call-bind');\n\nvar implementation = require('./implementation');\nvar getPolyfill = require('./polyfill');\nvar shim = require('./shim');\n\nvar polyfill = callBind(getPolyfill(), Object);\n\ndefine(polyfill, {\n\tgetPolyfill: getPolyfill,\n\timplementation: implementation,\n\tshim: shim\n});\n\nmodule.exports = polyfill;\n","'use strict';\n\nvar implementation = require('./implementation');\n\nmodule.exports = function getPolyfill() {\n\treturn typeof Object.is === 'function' ? Object.is : implementation;\n};\n","'use strict';\n\nvar getPolyfill = require('./polyfill');\nvar define = require('define-properties');\n\nmodule.exports = function shimObjectIs() {\n\tvar polyfill = getPolyfill();\n\tdefine(Object, { is: polyfill }, {\n\t\tis: function testObjectIs() {\n\t\t\treturn Object.is !== polyfill;\n\t\t}\n\t});\n\treturn polyfill;\n};\n","'use strict';\n\nvar keysShim;\nif (!Object.keys) {\n\t// modified from https://github.com/es-shims/es5-shim\n\tvar has = Object.prototype.hasOwnProperty;\n\tvar toStr = Object.prototype.toString;\n\tvar isArgs = require('./isArguments'); // eslint-disable-line global-require\n\tvar isEnumerable = Object.prototype.propertyIsEnumerable;\n\tvar hasDontEnumBug = !isEnumerable.call({ toString: null }, 'toString');\n\tvar hasProtoEnumBug = isEnumerable.call(function () {}, 'prototype');\n\tvar dontEnums = [\n\t\t'toString',\n\t\t'toLocaleString',\n\t\t'valueOf',\n\t\t'hasOwnProperty',\n\t\t'isPrototypeOf',\n\t\t'propertyIsEnumerable',\n\t\t'constructor'\n\t];\n\tvar equalsConstructorPrototype = function (o) {\n\t\tvar ctor = o.constructor;\n\t\treturn ctor && ctor.prototype === o;\n\t};\n\tvar excludedKeys = {\n\t\t$applicationCache: true,\n\t\t$console: true,\n\t\t$external: true,\n\t\t$frame: true,\n\t\t$frameElement: true,\n\t\t$frames: true,\n\t\t$innerHeight: true,\n\t\t$innerWidth: true,\n\t\t$onmozfullscreenchange: true,\n\t\t$onmozfullscreenerror: true,\n\t\t$outerHeight: true,\n\t\t$outerWidth: true,\n\t\t$pageXOffset: true,\n\t\t$pageYOffset: true,\n\t\t$parent: true,\n\t\t$scrollLeft: true,\n\t\t$scrollTop: true,\n\t\t$scrollX: true,\n\t\t$scrollY: true,\n\t\t$self: true,\n\t\t$webkitIndexedDB: true,\n\t\t$webkitStorageInfo: true,\n\t\t$window: true\n\t};\n\tvar hasAutomationEqualityBug = (function () {\n\t\t/* global window */\n\t\tif (typeof window === 'undefined') { return false; }\n\t\tfor (var k in window) {\n\t\t\ttry {\n\t\t\t\tif (!excludedKeys['$' + k] && has.call(window, k) && window[k] !== null && typeof window[k] === 'object') {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tequalsConstructorPrototype(window[k]);\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}());\n\tvar equalsConstructorPrototypeIfNotBuggy = function (o) {\n\t\t/* global window */\n\t\tif (typeof window === 'undefined' || !hasAutomationEqualityBug) {\n\t\t\treturn equalsConstructorPrototype(o);\n\t\t}\n\t\ttry {\n\t\t\treturn equalsConstructorPrototype(o);\n\t\t} catch (e) {\n\t\t\treturn false;\n\t\t}\n\t};\n\n\tkeysShim = function keys(object) {\n\t\tvar isObject = object !== null && typeof object === 'object';\n\t\tvar isFunction = toStr.call(object) === '[object Function]';\n\t\tvar isArguments = isArgs(object);\n\t\tvar isString = isObject && toStr.call(object) === '[object String]';\n\t\tvar theKeys = [];\n\n\t\tif (!isObject && !isFunction && !isArguments) {\n\t\t\tthrow new TypeError('Object.keys called on a non-object');\n\t\t}\n\n\t\tvar skipProto = hasProtoEnumBug && isFunction;\n\t\tif (isString && object.length > 0 && !has.call(object, 0)) {\n\t\t\tfor (var i = 0; i < object.length; ++i) {\n\t\t\t\ttheKeys.push(String(i));\n\t\t\t}\n\t\t}\n\n\t\tif (isArguments && object.length > 0) {\n\t\t\tfor (var j = 0; j < object.length; ++j) {\n\t\t\t\ttheKeys.push(String(j));\n\t\t\t}\n\t\t} else {\n\t\t\tfor (var name in object) {\n\t\t\t\tif (!(skipProto && name === 'prototype') && has.call(object, name)) {\n\t\t\t\t\ttheKeys.push(String(name));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (hasDontEnumBug) {\n\t\t\tvar skipConstructor = equalsConstructorPrototypeIfNotBuggy(object);\n\n\t\t\tfor (var k = 0; k < dontEnums.length; ++k) {\n\t\t\t\tif (!(skipConstructor && dontEnums[k] === 'constructor') && has.call(object, dontEnums[k])) {\n\t\t\t\t\ttheKeys.push(dontEnums[k]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn theKeys;\n\t};\n}\nmodule.exports = keysShim;\n","'use strict';\n\nvar slice = Array.prototype.slice;\nvar isArgs = require('./isArguments');\n\nvar origKeys = Object.keys;\nvar keysShim = origKeys ? function keys(o) { return origKeys(o); } : require('./implementation');\n\nvar originalKeys = Object.keys;\n\nkeysShim.shim = function shimObjectKeys() {\n\tif (Object.keys) {\n\t\tvar keysWorksWithArguments = (function () {\n\t\t\t// Safari 5.0 bug\n\t\t\tvar args = Object.keys(arguments);\n\t\t\treturn args && args.length === arguments.length;\n\t\t}(1, 2));\n\t\tif (!keysWorksWithArguments) {\n\t\t\tObject.keys = function keys(object) { // eslint-disable-line func-name-matching\n\t\t\t\tif (isArgs(object)) {\n\t\t\t\t\treturn originalKeys(slice.call(object));\n\t\t\t\t}\n\t\t\t\treturn originalKeys(object);\n\t\t\t};\n\t\t}\n\t} else {\n\t\tObject.keys = keysShim;\n\t}\n\treturn Object.keys || keysShim;\n};\n\nmodule.exports = keysShim;\n","'use strict';\n\nvar toStr = Object.prototype.toString;\n\nmodule.exports = function isArguments(value) {\n\tvar str = toStr.call(value);\n\tvar isArgs = str === '[object Arguments]';\n\tif (!isArgs) {\n\t\tisArgs = str !== '[object Array]' &&\n\t\t\tvalue !== null &&\n\t\t\ttypeof value === 'object' &&\n\t\t\ttypeof value.length === 'number' &&\n\t\t\tvalue.length >= 0 &&\n\t\t\ttoStr.call(value.callee) === '[object Function]';\n\t}\n\treturn isArgs;\n};\n","'use strict';\n\n// modified from https://github.com/es-shims/es6-shim\nvar objectKeys = require('object-keys');\nvar hasSymbols = require('has-symbols/shams')();\nvar callBound = require('call-bound');\nvar $Object = require('es-object-atoms');\nvar $push = callBound('Array.prototype.push');\nvar $propIsEnumerable = callBound('Object.prototype.propertyIsEnumerable');\nvar originalGetSymbols = hasSymbols ? $Object.getOwnPropertySymbols : null;\n\n// eslint-disable-next-line no-unused-vars\nmodule.exports = function assign(target, source1) {\n\tif (target == null) { throw new TypeError('target must be an object'); }\n\tvar to = $Object(target); // step 1\n\tif (arguments.length === 1) {\n\t\treturn to; // step 2\n\t}\n\tfor (var s = 1; s < arguments.length; ++s) {\n\t\tvar from = $Object(arguments[s]); // step 3.a.i\n\n\t\t// step 3.a.ii:\n\t\tvar keys = objectKeys(from);\n\t\tvar getSymbols = hasSymbols && ($Object.getOwnPropertySymbols || originalGetSymbols);\n\t\tif (getSymbols) {\n\t\t\tvar syms = getSymbols(from);\n\t\t\tfor (var j = 0; j < syms.length; ++j) {\n\t\t\t\tvar key = syms[j];\n\t\t\t\tif ($propIsEnumerable(from, key)) {\n\t\t\t\t\t$push(keys, key);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// step 3.a.iii:\n\t\tfor (var i = 0; i < keys.length; ++i) {\n\t\t\tvar nextKey = keys[i];\n\t\t\tif ($propIsEnumerable(from, nextKey)) { // step 3.a.iii.2\n\t\t\t\tvar propValue = from[nextKey]; // step 3.a.iii.2.a\n\t\t\t\tto[nextKey] = propValue; // step 3.a.iii.2.b\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to; // step 4\n};\n","'use strict';\n\nvar implementation = require('./implementation');\n\nvar lacksProperEnumerationOrder = function () {\n\tif (!Object.assign) {\n\t\treturn false;\n\t}\n\t/*\n\t * v8, specifically in node 4.x, has a bug with incorrect property enumeration order\n\t * note: this does not detect the bug unless there's 20 characters\n\t */\n\tvar str = 'abcdefghijklmnopqrst';\n\tvar letters = str.split('');\n\tvar map = {};\n\tfor (var i = 0; i < letters.length; ++i) {\n\t\tmap[letters[i]] = letters[i];\n\t}\n\tvar obj = Object.assign({}, map);\n\tvar actual = '';\n\tfor (var k in obj) {\n\t\tactual += k;\n\t}\n\treturn str !== actual;\n};\n\nvar assignHasPendingExceptions = function () {\n\tif (!Object.assign || !Object.preventExtensions) {\n\t\treturn false;\n\t}\n\t/*\n\t * Firefox 37 still has \"pending exception\" logic in its Object.assign implementation,\n\t * which is 72% slower than our shim, and Firefox 40's native implementation.\n\t */\n\tvar thrower = Object.preventExtensions({ 1: 2 });\n\ttry {\n\t\tObject.assign(thrower, 'xy');\n\t} catch (e) {\n\t\treturn thrower[1] === 'y';\n\t}\n\treturn false;\n};\n\nmodule.exports = function getPolyfill() {\n\tif (!Object.assign) {\n\t\treturn implementation;\n\t}\n\tif (lacksProperEnumerationOrder()) {\n\t\treturn implementation;\n\t}\n\tif (assignHasPendingExceptions()) {\n\t\treturn implementation;\n\t}\n\treturn Object.assign;\n};\n","'use strict';\n\n/** @type {import('.')} */\nmodule.exports = [\n\t'Float16Array',\n\t'Float32Array',\n\t'Float64Array',\n\t'Int8Array',\n\t'Int16Array',\n\t'Int32Array',\n\t'Uint8Array',\n\t'Uint8ClampedArray',\n\t'Uint16Array',\n\t'Uint32Array',\n\t'BigInt64Array',\n\t'BigUint64Array'\n];\n","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n","'use strict';\n\nvar callBound = require('call-bound');\nvar isRegex = require('is-regex');\n\nvar $exec = callBound('RegExp.prototype.exec');\nvar $TypeError = require('es-errors/type');\n\n/** @type {import('.')} */\nmodule.exports = function regexTester(regex) {\n\tif (!isRegex(regex)) {\n\t\tthrow new $TypeError('`regex` must be a RegExp');\n\t}\n\treturn function test(s) {\n\t\treturn $exec(regex, s) !== null;\n\t};\n};\n","'use strict';\n\nvar GetIntrinsic = require('get-intrinsic');\nvar define = require('define-data-property');\nvar hasDescriptors = require('has-property-descriptors')();\nvar gOPD = require('gopd');\n\nvar $TypeError = require('es-errors/type');\nvar $floor = GetIntrinsic('%Math.floor%');\n\n/** @type {import('.')} */\nmodule.exports = function setFunctionLength(fn, length) {\n\tif (typeof fn !== 'function') {\n\t\tthrow new $TypeError('`fn` is not a function');\n\t}\n\tif (typeof length !== 'number' || length < 0 || length > 0xFFFFFFFF || $floor(length) !== length) {\n\t\tthrow new $TypeError('`length` must be a positive 32-bit integer');\n\t}\n\n\tvar loose = arguments.length > 2 && !!arguments[2];\n\n\tvar functionLengthIsConfigurable = true;\n\tvar functionLengthIsWritable = true;\n\tif ('length' in fn && gOPD) {\n\t\tvar desc = gOPD(fn, 'length');\n\t\tif (desc && !desc.configurable) {\n\t\t\tfunctionLengthIsConfigurable = false;\n\t\t}\n\t\tif (desc && !desc.writable) {\n\t\t\tfunctionLengthIsWritable = false;\n\t\t}\n\t}\n\n\tif (functionLengthIsConfigurable || functionLengthIsWritable || !loose) {\n\t\tif (hasDescriptors) {\n\t\t\tdefine(/** @type {Parameters[0]} */ (fn), 'length', length, true, true);\n\t\t} else {\n\t\t\tdefine(/** @type {Parameters[0]} */ (fn), 'length', length);\n\t\t}\n\t}\n\treturn fn;\n};\n","\"use strict\";\n\nvar stylesInDOM = [];\nfunction getIndexByIdentifier(identifier) {\n var result = -1;\n for (var i = 0; i < stylesInDOM.length; i++) {\n if (stylesInDOM[i].identifier === identifier) {\n result = i;\n break;\n }\n }\n return result;\n}\nfunction modulesToDom(list, options) {\n var idCountMap = {};\n var identifiers = [];\n for (var i = 0; i < list.length; i++) {\n var item = list[i];\n var id = options.base ? item[0] + options.base : item[0];\n var count = idCountMap[id] || 0;\n var identifier = \"\".concat(id, \" \").concat(count);\n idCountMap[id] = count + 1;\n var indexByIdentifier = getIndexByIdentifier(identifier);\n var obj = {\n css: item[1],\n media: item[2],\n sourceMap: item[3],\n supports: item[4],\n layer: item[5]\n };\n if (indexByIdentifier !== -1) {\n stylesInDOM[indexByIdentifier].references++;\n stylesInDOM[indexByIdentifier].updater(obj);\n } else {\n var updater = addElementStyle(obj, options);\n options.byIndex = i;\n stylesInDOM.splice(i, 0, {\n identifier: identifier,\n updater: updater,\n references: 1\n });\n }\n identifiers.push(identifier);\n }\n return identifiers;\n}\nfunction addElementStyle(obj, options) {\n var api = options.domAPI(options);\n api.update(obj);\n var updater = function updater(newObj) {\n if (newObj) {\n if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap && newObj.supports === obj.supports && newObj.layer === obj.layer) {\n return;\n }\n api.update(obj = newObj);\n } else {\n api.remove();\n }\n };\n return updater;\n}\nmodule.exports = function (list, options) {\n options = options || {};\n list = list || [];\n var lastIdentifiers = modulesToDom(list, options);\n return function update(newList) {\n newList = newList || [];\n for (var i = 0; i < lastIdentifiers.length; i++) {\n var identifier = lastIdentifiers[i];\n var index = getIndexByIdentifier(identifier);\n stylesInDOM[index].references--;\n }\n var newLastIdentifiers = modulesToDom(newList, options);\n for (var _i = 0; _i < lastIdentifiers.length; _i++) {\n var _identifier = lastIdentifiers[_i];\n var _index = getIndexByIdentifier(_identifier);\n if (stylesInDOM[_index].references === 0) {\n stylesInDOM[_index].updater();\n stylesInDOM.splice(_index, 1);\n }\n }\n lastIdentifiers = newLastIdentifiers;\n };\n};","\"use strict\";\n\n/* istanbul ignore next */\nfunction insertStyleElement(options) {\n var element = document.createElement(\"style\");\n options.setAttributes(element, options.attributes);\n options.insert(element, options.options);\n return element;\n}\nmodule.exports = insertStyleElement;","\"use strict\";\n\n/* istanbul ignore next */\nfunction setAttributesWithoutAttributes(styleElement) {\n var nonce = typeof __webpack_nonce__ !== \"undefined\" ? __webpack_nonce__ : null;\n if (nonce) {\n styleElement.setAttribute(\"nonce\", nonce);\n }\n}\nmodule.exports = setAttributesWithoutAttributes;","\"use strict\";\n\n/* istanbul ignore next */\nfunction apply(styleElement, options, obj) {\n var css = \"\";\n if (obj.supports) {\n css += \"@supports (\".concat(obj.supports, \") {\");\n }\n if (obj.media) {\n css += \"@media \".concat(obj.media, \" {\");\n }\n var needLayer = typeof obj.layer !== \"undefined\";\n if (needLayer) {\n css += \"@layer\".concat(obj.layer.length > 0 ? \" \".concat(obj.layer) : \"\", \" {\");\n }\n css += obj.css;\n if (needLayer) {\n css += \"}\";\n }\n if (obj.media) {\n css += \"}\";\n }\n if (obj.supports) {\n css += \"}\";\n }\n var sourceMap = obj.sourceMap;\n if (sourceMap && typeof btoa !== \"undefined\") {\n css += \"\\n/*# sourceMappingURL=data:application/json;base64,\".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), \" */\");\n }\n\n // For old IE\n /* istanbul ignore if */\n options.styleTagTransform(css, styleElement, options.options);\n}\nfunction removeStyleElement(styleElement) {\n // istanbul ignore if\n if (styleElement.parentNode === null) {\n return false;\n }\n styleElement.parentNode.removeChild(styleElement);\n}\n\n/* istanbul ignore next */\nfunction domAPI(options) {\n if (typeof document === \"undefined\") {\n return {\n update: function update() {},\n remove: function remove() {}\n };\n }\n var styleElement = options.insertStyleElement(options);\n return {\n update: function update(obj) {\n apply(styleElement, options, obj);\n },\n remove: function remove() {\n removeStyleElement(styleElement);\n }\n };\n}\nmodule.exports = domAPI;","\"use strict\";\n\n/* istanbul ignore next */\nfunction styleTagTransform(css, styleElement) {\n if (styleElement.styleSheet) {\n styleElement.styleSheet.cssText = css;\n } else {\n while (styleElement.firstChild) {\n styleElement.removeChild(styleElement.firstChild);\n }\n styleElement.appendChild(document.createTextNode(css));\n }\n}\nmodule.exports = styleTagTransform;","/* \n(The MIT License)\nCopyright (c) 2014-2021 Halász Ádám \nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n\n// Unique Hexatridecimal ID Generator\n// ================================================\n\n// Dependencies\n// ================================================\nvar pid = typeof process !== 'undefined' && process.pid ? process.pid.toString(36) : '' ;\nvar address = '';\nif(typeof __webpack_require__ !== 'function' && typeof require !== 'undefined'){\n var mac = '', os = require('os'); \n if(os.networkInterfaces) var networkInterfaces = os.networkInterfaces();\n if(networkInterfaces){\n loop:\n for(let interface_key in networkInterfaces){\n const networkInterface = networkInterfaces[interface_key];\n const length = networkInterface.length;\n for(var i = 0; i < length; i++){\n if(networkInterface[i] !== undefined && networkInterface[i].mac && networkInterface[i].mac != '00:00:00:00:00:00'){\n mac = networkInterface[i].mac; break loop;\n }\n }\n }\n address = mac ? parseInt(mac.replace(/\\:|\\D+/gi, '')).toString(36) : '' ;\n }\n} \n\n// Exports\n// ================================================\nmodule.exports = module.exports.default = function(prefix, suffix){ return (prefix ? prefix : '') + address + pid + now().toString(36) + (suffix ? suffix : ''); }\nmodule.exports.process = function(prefix, suffix){ return (prefix ? prefix : '') + pid + now().toString(36) + (suffix ? suffix : ''); }\nmodule.exports.time = function(prefix, suffix){ return (prefix ? prefix : '') + now().toString(36) + (suffix ? suffix : ''); }\n\n// Helpers\n// ================================================\nfunction now(){\n var time = Date.now();\n var last = now.last || time;\n return now.last = time > last ? time : last + 1;\n}\n","module.exports = function isBuffer(arg) {\n return arg && typeof arg === 'object'\n && typeof arg.copy === 'function'\n && typeof arg.fill === 'function'\n && typeof arg.readUInt8 === 'function';\n}","// Currently in sync with Node.js lib/internal/util/types.js\n// https://github.com/nodejs/node/commit/112cc7c27551254aa2b17098fb774867f05ed0d9\n\n'use strict';\n\nvar isArgumentsObject = require('is-arguments');\nvar isGeneratorFunction = require('is-generator-function');\nvar whichTypedArray = require('which-typed-array');\nvar isTypedArray = require('is-typed-array');\n\nfunction uncurryThis(f) {\n return f.call.bind(f);\n}\n\nvar BigIntSupported = typeof BigInt !== 'undefined';\nvar SymbolSupported = typeof Symbol !== 'undefined';\n\nvar ObjectToString = uncurryThis(Object.prototype.toString);\n\nvar numberValue = uncurryThis(Number.prototype.valueOf);\nvar stringValue = uncurryThis(String.prototype.valueOf);\nvar booleanValue = uncurryThis(Boolean.prototype.valueOf);\n\nif (BigIntSupported) {\n var bigIntValue = uncurryThis(BigInt.prototype.valueOf);\n}\n\nif (SymbolSupported) {\n var symbolValue = uncurryThis(Symbol.prototype.valueOf);\n}\n\nfunction checkBoxedPrimitive(value, prototypeValueOf) {\n if (typeof value !== 'object') {\n return false;\n }\n try {\n prototypeValueOf(value);\n return true;\n } catch(e) {\n return false;\n }\n}\n\nexports.isArgumentsObject = isArgumentsObject;\nexports.isGeneratorFunction = isGeneratorFunction;\nexports.isTypedArray = isTypedArray;\n\n// Taken from here and modified for better browser support\n// https://github.com/sindresorhus/p-is-promise/blob/cda35a513bda03f977ad5cde3a079d237e82d7ef/index.js\nfunction isPromise(input) {\n\treturn (\n\t\t(\n\t\t\ttypeof Promise !== 'undefined' &&\n\t\t\tinput instanceof Promise\n\t\t) ||\n\t\t(\n\t\t\tinput !== null &&\n\t\t\ttypeof input === 'object' &&\n\t\t\ttypeof input.then === 'function' &&\n\t\t\ttypeof input.catch === 'function'\n\t\t)\n\t);\n}\nexports.isPromise = isPromise;\n\nfunction isArrayBufferView(value) {\n if (typeof ArrayBuffer !== 'undefined' && ArrayBuffer.isView) {\n return ArrayBuffer.isView(value);\n }\n\n return (\n isTypedArray(value) ||\n isDataView(value)\n );\n}\nexports.isArrayBufferView = isArrayBufferView;\n\n\nfunction isUint8Array(value) {\n return whichTypedArray(value) === 'Uint8Array';\n}\nexports.isUint8Array = isUint8Array;\n\nfunction isUint8ClampedArray(value) {\n return whichTypedArray(value) === 'Uint8ClampedArray';\n}\nexports.isUint8ClampedArray = isUint8ClampedArray;\n\nfunction isUint16Array(value) {\n return whichTypedArray(value) === 'Uint16Array';\n}\nexports.isUint16Array = isUint16Array;\n\nfunction isUint32Array(value) {\n return whichTypedArray(value) === 'Uint32Array';\n}\nexports.isUint32Array = isUint32Array;\n\nfunction isInt8Array(value) {\n return whichTypedArray(value) === 'Int8Array';\n}\nexports.isInt8Array = isInt8Array;\n\nfunction isInt16Array(value) {\n return whichTypedArray(value) === 'Int16Array';\n}\nexports.isInt16Array = isInt16Array;\n\nfunction isInt32Array(value) {\n return whichTypedArray(value) === 'Int32Array';\n}\nexports.isInt32Array = isInt32Array;\n\nfunction isFloat32Array(value) {\n return whichTypedArray(value) === 'Float32Array';\n}\nexports.isFloat32Array = isFloat32Array;\n\nfunction isFloat64Array(value) {\n return whichTypedArray(value) === 'Float64Array';\n}\nexports.isFloat64Array = isFloat64Array;\n\nfunction isBigInt64Array(value) {\n return whichTypedArray(value) === 'BigInt64Array';\n}\nexports.isBigInt64Array = isBigInt64Array;\n\nfunction isBigUint64Array(value) {\n return whichTypedArray(value) === 'BigUint64Array';\n}\nexports.isBigUint64Array = isBigUint64Array;\n\nfunction isMapToString(value) {\n return ObjectToString(value) === '[object Map]';\n}\nisMapToString.working = (\n typeof Map !== 'undefined' &&\n isMapToString(new Map())\n);\n\nfunction isMap(value) {\n if (typeof Map === 'undefined') {\n return false;\n }\n\n return isMapToString.working\n ? isMapToString(value)\n : value instanceof Map;\n}\nexports.isMap = isMap;\n\nfunction isSetToString(value) {\n return ObjectToString(value) === '[object Set]';\n}\nisSetToString.working = (\n typeof Set !== 'undefined' &&\n isSetToString(new Set())\n);\nfunction isSet(value) {\n if (typeof Set === 'undefined') {\n return false;\n }\n\n return isSetToString.working\n ? isSetToString(value)\n : value instanceof Set;\n}\nexports.isSet = isSet;\n\nfunction isWeakMapToString(value) {\n return ObjectToString(value) === '[object WeakMap]';\n}\nisWeakMapToString.working = (\n typeof WeakMap !== 'undefined' &&\n isWeakMapToString(new WeakMap())\n);\nfunction isWeakMap(value) {\n if (typeof WeakMap === 'undefined') {\n return false;\n }\n\n return isWeakMapToString.working\n ? isWeakMapToString(value)\n : value instanceof WeakMap;\n}\nexports.isWeakMap = isWeakMap;\n\nfunction isWeakSetToString(value) {\n return ObjectToString(value) === '[object WeakSet]';\n}\nisWeakSetToString.working = (\n typeof WeakSet !== 'undefined' &&\n isWeakSetToString(new WeakSet())\n);\nfunction isWeakSet(value) {\n return isWeakSetToString(value);\n}\nexports.isWeakSet = isWeakSet;\n\nfunction isArrayBufferToString(value) {\n return ObjectToString(value) === '[object ArrayBuffer]';\n}\nisArrayBufferToString.working = (\n typeof ArrayBuffer !== 'undefined' &&\n isArrayBufferToString(new ArrayBuffer())\n);\nfunction isArrayBuffer(value) {\n if (typeof ArrayBuffer === 'undefined') {\n return false;\n }\n\n return isArrayBufferToString.working\n ? isArrayBufferToString(value)\n : value instanceof ArrayBuffer;\n}\nexports.isArrayBuffer = isArrayBuffer;\n\nfunction isDataViewToString(value) {\n return ObjectToString(value) === '[object DataView]';\n}\nisDataViewToString.working = (\n typeof ArrayBuffer !== 'undefined' &&\n typeof DataView !== 'undefined' &&\n isDataViewToString(new DataView(new ArrayBuffer(1), 0, 1))\n);\nfunction isDataView(value) {\n if (typeof DataView === 'undefined') {\n return false;\n }\n\n return isDataViewToString.working\n ? isDataViewToString(value)\n : value instanceof DataView;\n}\nexports.isDataView = isDataView;\n\n// Store a copy of SharedArrayBuffer in case it's deleted elsewhere\nvar SharedArrayBufferCopy = typeof SharedArrayBuffer !== 'undefined' ? SharedArrayBuffer : undefined;\nfunction isSharedArrayBufferToString(value) {\n return ObjectToString(value) === '[object SharedArrayBuffer]';\n}\nfunction isSharedArrayBuffer(value) {\n if (typeof SharedArrayBufferCopy === 'undefined') {\n return false;\n }\n\n if (typeof isSharedArrayBufferToString.working === 'undefined') {\n isSharedArrayBufferToString.working = isSharedArrayBufferToString(new SharedArrayBufferCopy());\n }\n\n return isSharedArrayBufferToString.working\n ? isSharedArrayBufferToString(value)\n : value instanceof SharedArrayBufferCopy;\n}\nexports.isSharedArrayBuffer = isSharedArrayBuffer;\n\nfunction isAsyncFunction(value) {\n return ObjectToString(value) === '[object AsyncFunction]';\n}\nexports.isAsyncFunction = isAsyncFunction;\n\nfunction isMapIterator(value) {\n return ObjectToString(value) === '[object Map Iterator]';\n}\nexports.isMapIterator = isMapIterator;\n\nfunction isSetIterator(value) {\n return ObjectToString(value) === '[object Set Iterator]';\n}\nexports.isSetIterator = isSetIterator;\n\nfunction isGeneratorObject(value) {\n return ObjectToString(value) === '[object Generator]';\n}\nexports.isGeneratorObject = isGeneratorObject;\n\nfunction isWebAssemblyCompiledModule(value) {\n return ObjectToString(value) === '[object WebAssembly.Module]';\n}\nexports.isWebAssemblyCompiledModule = isWebAssemblyCompiledModule;\n\nfunction isNumberObject(value) {\n return checkBoxedPrimitive(value, numberValue);\n}\nexports.isNumberObject = isNumberObject;\n\nfunction isStringObject(value) {\n return checkBoxedPrimitive(value, stringValue);\n}\nexports.isStringObject = isStringObject;\n\nfunction isBooleanObject(value) {\n return checkBoxedPrimitive(value, booleanValue);\n}\nexports.isBooleanObject = isBooleanObject;\n\nfunction isBigIntObject(value) {\n return BigIntSupported && checkBoxedPrimitive(value, bigIntValue);\n}\nexports.isBigIntObject = isBigIntObject;\n\nfunction isSymbolObject(value) {\n return SymbolSupported && checkBoxedPrimitive(value, symbolValue);\n}\nexports.isSymbolObject = isSymbolObject;\n\nfunction isBoxedPrimitive(value) {\n return (\n isNumberObject(value) ||\n isStringObject(value) ||\n isBooleanObject(value) ||\n isBigIntObject(value) ||\n isSymbolObject(value)\n );\n}\nexports.isBoxedPrimitive = isBoxedPrimitive;\n\nfunction isAnyArrayBuffer(value) {\n return typeof Uint8Array !== 'undefined' && (\n isArrayBuffer(value) ||\n isSharedArrayBuffer(value)\n );\n}\nexports.isAnyArrayBuffer = isAnyArrayBuffer;\n\n['isProxy', 'isExternal', 'isModuleNamespaceObject'].forEach(function(method) {\n Object.defineProperty(exports, method, {\n enumerable: false,\n value: function() {\n throw new Error(method + ' is not supported in userland');\n }\n });\n});\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nvar getOwnPropertyDescriptors = Object.getOwnPropertyDescriptors ||\n function getOwnPropertyDescriptors(obj) {\n var keys = Object.keys(obj);\n var descriptors = {};\n for (var i = 0; i < keys.length; i++) {\n descriptors[keys[i]] = Object.getOwnPropertyDescriptor(obj, keys[i]);\n }\n return descriptors;\n };\n\nvar formatRegExp = /%[sdj%]/g;\nexports.format = function(f) {\n if (!isString(f)) {\n var objects = [];\n for (var i = 0; i < arguments.length; i++) {\n objects.push(inspect(arguments[i]));\n }\n return objects.join(' ');\n }\n\n var i = 1;\n var args = arguments;\n var len = args.length;\n var str = String(f).replace(formatRegExp, function(x) {\n if (x === '%%') return '%';\n if (i >= len) return x;\n switch (x) {\n case '%s': return String(args[i++]);\n case '%d': return Number(args[i++]);\n case '%j':\n try {\n return JSON.stringify(args[i++]);\n } catch (_) {\n return '[Circular]';\n }\n default:\n return x;\n }\n });\n for (var x = args[i]; i < len; x = args[++i]) {\n if (isNull(x) || !isObject(x)) {\n str += ' ' + x;\n } else {\n str += ' ' + inspect(x);\n }\n }\n return str;\n};\n\n\n// Mark that a method should not be used.\n// Returns a modified function which warns once by default.\n// If --no-deprecation is set, then it is a no-op.\nexports.deprecate = function(fn, msg) {\n if (typeof process !== 'undefined' && process.noDeprecation === true) {\n return fn;\n }\n\n // Allow for deprecating things in the process of starting up.\n if (typeof process === 'undefined') {\n return function() {\n return exports.deprecate(fn, msg).apply(this, arguments);\n };\n }\n\n var warned = false;\n function deprecated() {\n if (!warned) {\n if (process.throwDeprecation) {\n throw new Error(msg);\n } else if (process.traceDeprecation) {\n console.trace(msg);\n } else {\n console.error(msg);\n }\n warned = true;\n }\n return fn.apply(this, arguments);\n }\n\n return deprecated;\n};\n\n\nvar debugs = {};\nvar debugEnvRegex = /^$/;\n\nif (process.env.NODE_DEBUG) {\n var debugEnv = process.env.NODE_DEBUG;\n debugEnv = debugEnv.replace(/[|\\\\{}()[\\]^$+?.]/g, '\\\\$&')\n .replace(/\\*/g, '.*')\n .replace(/,/g, '$|^')\n .toUpperCase();\n debugEnvRegex = new RegExp('^' + debugEnv + '$', 'i');\n}\nexports.debuglog = function(set) {\n set = set.toUpperCase();\n if (!debugs[set]) {\n if (debugEnvRegex.test(set)) {\n var pid = process.pid;\n debugs[set] = function() {\n var msg = exports.format.apply(exports, arguments);\n console.error('%s %d: %s', set, pid, msg);\n };\n } else {\n debugs[set] = function() {};\n }\n }\n return debugs[set];\n};\n\n\n/**\n * Echos the value of a value. Trys to print the value out\n * in the best way possible given the different types.\n *\n * @param {Object} obj The object to print out.\n * @param {Object} opts Optional options object that alters the output.\n */\n/* legacy: obj, showHidden, depth, colors*/\nfunction inspect(obj, opts) {\n // default options\n var ctx = {\n seen: [],\n stylize: stylizeNoColor\n };\n // legacy...\n if (arguments.length >= 3) ctx.depth = arguments[2];\n if (arguments.length >= 4) ctx.colors = arguments[3];\n if (isBoolean(opts)) {\n // legacy...\n ctx.showHidden = opts;\n } else if (opts) {\n // got an \"options\" object\n exports._extend(ctx, opts);\n }\n // set default options\n if (isUndefined(ctx.showHidden)) ctx.showHidden = false;\n if (isUndefined(ctx.depth)) ctx.depth = 2;\n if (isUndefined(ctx.colors)) ctx.colors = false;\n if (isUndefined(ctx.customInspect)) ctx.customInspect = true;\n if (ctx.colors) ctx.stylize = stylizeWithColor;\n return formatValue(ctx, obj, ctx.depth);\n}\nexports.inspect = inspect;\n\n\n// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics\ninspect.colors = {\n 'bold' : [1, 22],\n 'italic' : [3, 23],\n 'underline' : [4, 24],\n 'inverse' : [7, 27],\n 'white' : [37, 39],\n 'grey' : [90, 39],\n 'black' : [30, 39],\n 'blue' : [34, 39],\n 'cyan' : [36, 39],\n 'green' : [32, 39],\n 'magenta' : [35, 39],\n 'red' : [31, 39],\n 'yellow' : [33, 39]\n};\n\n// Don't use 'blue' not visible on cmd.exe\ninspect.styles = {\n 'special': 'cyan',\n 'number': 'yellow',\n 'boolean': 'yellow',\n 'undefined': 'grey',\n 'null': 'bold',\n 'string': 'green',\n 'date': 'magenta',\n // \"name\": intentionally not styling\n 'regexp': 'red'\n};\n\n\nfunction stylizeWithColor(str, styleType) {\n var style = inspect.styles[styleType];\n\n if (style) {\n return '\\u001b[' + inspect.colors[style][0] + 'm' + str +\n '\\u001b[' + inspect.colors[style][1] + 'm';\n } else {\n return str;\n }\n}\n\n\nfunction stylizeNoColor(str, styleType) {\n return str;\n}\n\n\nfunction arrayToHash(array) {\n var hash = {};\n\n array.forEach(function(val, idx) {\n hash[val] = true;\n });\n\n return hash;\n}\n\n\nfunction formatValue(ctx, value, recurseTimes) {\n // Provide a hook for user-specified inspect functions.\n // Check that value is an object with an inspect function on it\n if (ctx.customInspect &&\n value &&\n isFunction(value.inspect) &&\n // Filter out the util module, it's inspect function is special\n value.inspect !== exports.inspect &&\n // Also filter out any prototype objects using the circular check.\n !(value.constructor && value.constructor.prototype === value)) {\n var ret = value.inspect(recurseTimes, ctx);\n if (!isString(ret)) {\n ret = formatValue(ctx, ret, recurseTimes);\n }\n return ret;\n }\n\n // Primitive types cannot have properties\n var primitive = formatPrimitive(ctx, value);\n if (primitive) {\n return primitive;\n }\n\n // Look up the keys of the object.\n var keys = Object.keys(value);\n var visibleKeys = arrayToHash(keys);\n\n if (ctx.showHidden) {\n keys = Object.getOwnPropertyNames(value);\n }\n\n // IE doesn't make error fields non-enumerable\n // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx\n if (isError(value)\n && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {\n return formatError(value);\n }\n\n // Some type of object without properties can be shortcutted.\n if (keys.length === 0) {\n if (isFunction(value)) {\n var name = value.name ? ': ' + value.name : '';\n return ctx.stylize('[Function' + name + ']', 'special');\n }\n if (isRegExp(value)) {\n return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n }\n if (isDate(value)) {\n return ctx.stylize(Date.prototype.toString.call(value), 'date');\n }\n if (isError(value)) {\n return formatError(value);\n }\n }\n\n var base = '', array = false, braces = ['{', '}'];\n\n // Make Array say that they are Array\n if (isArray(value)) {\n array = true;\n braces = ['[', ']'];\n }\n\n // Make functions say that they are functions\n if (isFunction(value)) {\n var n = value.name ? ': ' + value.name : '';\n base = ' [Function' + n + ']';\n }\n\n // Make RegExps say that they are RegExps\n if (isRegExp(value)) {\n base = ' ' + RegExp.prototype.toString.call(value);\n }\n\n // Make dates with properties first say the date\n if (isDate(value)) {\n base = ' ' + Date.prototype.toUTCString.call(value);\n }\n\n // Make error with message first say the error\n if (isError(value)) {\n base = ' ' + formatError(value);\n }\n\n if (keys.length === 0 && (!array || value.length == 0)) {\n return braces[0] + base + braces[1];\n }\n\n if (recurseTimes < 0) {\n if (isRegExp(value)) {\n return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n } else {\n return ctx.stylize('[Object]', 'special');\n }\n }\n\n ctx.seen.push(value);\n\n var output;\n if (array) {\n output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);\n } else {\n output = keys.map(function(key) {\n return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);\n });\n }\n\n ctx.seen.pop();\n\n return reduceToSingleString(output, base, braces);\n}\n\n\nfunction formatPrimitive(ctx, value) {\n if (isUndefined(value))\n return ctx.stylize('undefined', 'undefined');\n if (isString(value)) {\n var simple = '\\'' + JSON.stringify(value).replace(/^\"|\"$/g, '')\n .replace(/'/g, \"\\\\'\")\n .replace(/\\\\\"/g, '\"') + '\\'';\n return ctx.stylize(simple, 'string');\n }\n if (isNumber(value))\n return ctx.stylize('' + value, 'number');\n if (isBoolean(value))\n return ctx.stylize('' + value, 'boolean');\n // For some reason typeof null is \"object\", so special case here.\n if (isNull(value))\n return ctx.stylize('null', 'null');\n}\n\n\nfunction formatError(value) {\n return '[' + Error.prototype.toString.call(value) + ']';\n}\n\n\nfunction formatArray(ctx, value, recurseTimes, visibleKeys, keys) {\n var output = [];\n for (var i = 0, l = value.length; i < l; ++i) {\n if (hasOwnProperty(value, String(i))) {\n output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n String(i), true));\n } else {\n output.push('');\n }\n }\n keys.forEach(function(key) {\n if (!key.match(/^\\d+$/)) {\n output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n key, true));\n }\n });\n return output;\n}\n\n\nfunction formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {\n var name, str, desc;\n desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };\n if (desc.get) {\n if (desc.set) {\n str = ctx.stylize('[Getter/Setter]', 'special');\n } else {\n str = ctx.stylize('[Getter]', 'special');\n }\n } else {\n if (desc.set) {\n str = ctx.stylize('[Setter]', 'special');\n }\n }\n if (!hasOwnProperty(visibleKeys, key)) {\n name = '[' + key + ']';\n }\n if (!str) {\n if (ctx.seen.indexOf(desc.value) < 0) {\n if (isNull(recurseTimes)) {\n str = formatValue(ctx, desc.value, null);\n } else {\n str = formatValue(ctx, desc.value, recurseTimes - 1);\n }\n if (str.indexOf('\\n') > -1) {\n if (array) {\n str = str.split('\\n').map(function(line) {\n return ' ' + line;\n }).join('\\n').slice(2);\n } else {\n str = '\\n' + str.split('\\n').map(function(line) {\n return ' ' + line;\n }).join('\\n');\n }\n }\n } else {\n str = ctx.stylize('[Circular]', 'special');\n }\n }\n if (isUndefined(name)) {\n if (array && key.match(/^\\d+$/)) {\n return str;\n }\n name = JSON.stringify('' + key);\n if (name.match(/^\"([a-zA-Z_][a-zA-Z_0-9]*)\"$/)) {\n name = name.slice(1, -1);\n name = ctx.stylize(name, 'name');\n } else {\n name = name.replace(/'/g, \"\\\\'\")\n .replace(/\\\\\"/g, '\"')\n .replace(/(^\"|\"$)/g, \"'\");\n name = ctx.stylize(name, 'string');\n }\n }\n\n return name + ': ' + str;\n}\n\n\nfunction reduceToSingleString(output, base, braces) {\n var numLinesEst = 0;\n var length = output.reduce(function(prev, cur) {\n numLinesEst++;\n if (cur.indexOf('\\n') >= 0) numLinesEst++;\n return prev + cur.replace(/\\u001b\\[\\d\\d?m/g, '').length + 1;\n }, 0);\n\n if (length > 60) {\n return braces[0] +\n (base === '' ? '' : base + '\\n ') +\n ' ' +\n output.join(',\\n ') +\n ' ' +\n braces[1];\n }\n\n return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];\n}\n\n\n// NOTE: These type checking functions intentionally don't use `instanceof`\n// because it is fragile and can be easily faked with `Object.create()`.\nexports.types = require('./support/types');\n\nfunction isArray(ar) {\n return Array.isArray(ar);\n}\nexports.isArray = isArray;\n\nfunction isBoolean(arg) {\n return typeof arg === 'boolean';\n}\nexports.isBoolean = isBoolean;\n\nfunction isNull(arg) {\n return arg === null;\n}\nexports.isNull = isNull;\n\nfunction isNullOrUndefined(arg) {\n return arg == null;\n}\nexports.isNullOrUndefined = isNullOrUndefined;\n\nfunction isNumber(arg) {\n return typeof arg === 'number';\n}\nexports.isNumber = isNumber;\n\nfunction isString(arg) {\n return typeof arg === 'string';\n}\nexports.isString = isString;\n\nfunction isSymbol(arg) {\n return typeof arg === 'symbol';\n}\nexports.isSymbol = isSymbol;\n\nfunction isUndefined(arg) {\n return arg === void 0;\n}\nexports.isUndefined = isUndefined;\n\nfunction isRegExp(re) {\n return isObject(re) && objectToString(re) === '[object RegExp]';\n}\nexports.isRegExp = isRegExp;\nexports.types.isRegExp = isRegExp;\n\nfunction isObject(arg) {\n return typeof arg === 'object' && arg !== null;\n}\nexports.isObject = isObject;\n\nfunction isDate(d) {\n return isObject(d) && objectToString(d) === '[object Date]';\n}\nexports.isDate = isDate;\nexports.types.isDate = isDate;\n\nfunction isError(e) {\n return isObject(e) &&\n (objectToString(e) === '[object Error]' || e instanceof Error);\n}\nexports.isError = isError;\nexports.types.isNativeError = isError;\n\nfunction isFunction(arg) {\n return typeof arg === 'function';\n}\nexports.isFunction = isFunction;\n\nfunction isPrimitive(arg) {\n return arg === null ||\n typeof arg === 'boolean' ||\n typeof arg === 'number' ||\n typeof arg === 'string' ||\n typeof arg === 'symbol' || // ES6 symbol\n typeof arg === 'undefined';\n}\nexports.isPrimitive = isPrimitive;\n\nexports.isBuffer = require('./support/isBuffer');\n\nfunction objectToString(o) {\n return Object.prototype.toString.call(o);\n}\n\n\nfunction pad(n) {\n return n < 10 ? '0' + n.toString(10) : n.toString(10);\n}\n\n\nvar months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',\n 'Oct', 'Nov', 'Dec'];\n\n// 26 Feb 16:19:34\nfunction timestamp() {\n var d = new Date();\n var time = [pad(d.getHours()),\n pad(d.getMinutes()),\n pad(d.getSeconds())].join(':');\n return [d.getDate(), months[d.getMonth()], time].join(' ');\n}\n\n\n// log is just a thin wrapper to console.log that prepends a timestamp\nexports.log = function() {\n console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));\n};\n\n\n/**\n * Inherit the prototype methods from one constructor into another.\n *\n * The Function.prototype.inherits from lang.js rewritten as a standalone\n * function (not on Function.prototype). NOTE: If this file is to be loaded\n * during bootstrapping this function needs to be rewritten using some native\n * functions as prototype setup using normal JavaScript does not work as\n * expected during bootstrapping (see mirror.js in r114903).\n *\n * @param {function} ctor Constructor function which needs to inherit the\n * prototype.\n * @param {function} superCtor Constructor function to inherit prototype from.\n */\nexports.inherits = require('inherits');\n\nexports._extend = function(origin, add) {\n // Don't do anything if add isn't an object\n if (!add || !isObject(add)) return origin;\n\n var keys = Object.keys(add);\n var i = keys.length;\n while (i--) {\n origin[keys[i]] = add[keys[i]];\n }\n return origin;\n};\n\nfunction hasOwnProperty(obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\nvar kCustomPromisifiedSymbol = typeof Symbol !== 'undefined' ? Symbol('util.promisify.custom') : undefined;\n\nexports.promisify = function promisify(original) {\n if (typeof original !== 'function')\n throw new TypeError('The \"original\" argument must be of type Function');\n\n if (kCustomPromisifiedSymbol && original[kCustomPromisifiedSymbol]) {\n var fn = original[kCustomPromisifiedSymbol];\n if (typeof fn !== 'function') {\n throw new TypeError('The \"util.promisify.custom\" argument must be of type Function');\n }\n Object.defineProperty(fn, kCustomPromisifiedSymbol, {\n value: fn, enumerable: false, writable: false, configurable: true\n });\n return fn;\n }\n\n function fn() {\n var promiseResolve, promiseReject;\n var promise = new Promise(function (resolve, reject) {\n promiseResolve = resolve;\n promiseReject = reject;\n });\n\n var args = [];\n for (var i = 0; i < arguments.length; i++) {\n args.push(arguments[i]);\n }\n args.push(function (err, value) {\n if (err) {\n promiseReject(err);\n } else {\n promiseResolve(value);\n }\n });\n\n try {\n original.apply(this, args);\n } catch (err) {\n promiseReject(err);\n }\n\n return promise;\n }\n\n Object.setPrototypeOf(fn, Object.getPrototypeOf(original));\n\n if (kCustomPromisifiedSymbol) Object.defineProperty(fn, kCustomPromisifiedSymbol, {\n value: fn, enumerable: false, writable: false, configurable: true\n });\n return Object.defineProperties(\n fn,\n getOwnPropertyDescriptors(original)\n );\n}\n\nexports.promisify.custom = kCustomPromisifiedSymbol\n\nfunction callbackifyOnRejected(reason, cb) {\n // `!reason` guard inspired by bluebird (Ref: https://goo.gl/t5IS6M).\n // Because `null` is a special error value in callbacks which means \"no error\n // occurred\", we error-wrap so the callback consumer can distinguish between\n // \"the promise rejected with null\" or \"the promise fulfilled with undefined\".\n if (!reason) {\n var newReason = new Error('Promise was rejected with a falsy value');\n newReason.reason = reason;\n reason = newReason;\n }\n return cb(reason);\n}\n\nfunction callbackify(original) {\n if (typeof original !== 'function') {\n throw new TypeError('The \"original\" argument must be of type Function');\n }\n\n // We DO NOT return the promise as it gives the user a false sense that\n // the promise is actually somehow related to the callback's execution\n // and that the callback throwing will reject the promise.\n function callbackified() {\n var args = [];\n for (var i = 0; i < arguments.length; i++) {\n args.push(arguments[i]);\n }\n\n var maybeCb = args.pop();\n if (typeof maybeCb !== 'function') {\n throw new TypeError('The last argument must be of type Function');\n }\n var self = this;\n var cb = function() {\n return maybeCb.apply(self, arguments);\n };\n // In true node style we process the callback on `nextTick` with all the\n // implications (stack, `uncaughtException`, `async_hooks`)\n original.apply(this, args)\n .then(function(ret) { process.nextTick(cb.bind(null, null, ret)) },\n function(rej) { process.nextTick(callbackifyOnRejected.bind(null, rej, cb)) });\n }\n\n Object.setPrototypeOf(callbackified, Object.getPrototypeOf(original));\n Object.defineProperties(callbackified,\n getOwnPropertyDescriptors(original));\n return callbackified;\n}\nexports.callbackify = callbackify;\n","'use strict';\n\nvar forEach = require('for-each');\nvar availableTypedArrays = require('available-typed-arrays');\nvar callBind = require('call-bind');\nvar callBound = require('call-bound');\nvar gOPD = require('gopd');\nvar getProto = require('get-proto');\n\nvar $toString = callBound('Object.prototype.toString');\nvar hasToStringTag = require('has-tostringtag/shams')();\n\nvar g = typeof globalThis === 'undefined' ? global : globalThis;\nvar typedArrays = availableTypedArrays();\n\nvar $slice = callBound('String.prototype.slice');\n\n/** @import { BoundSet, BoundSlice, Cache, Getter } from './types' */\n/** @import { TypedArrayName } from '.' */\n\n/** @type {(array: readonly T[], value: unknown) => number} */\nvar $indexOf = callBound('Array.prototype.indexOf', true) || function indexOf(array, value) {\n\tfor (var i = 0; i < array.length; i += 1) {\n\t\tif (array[i] === value) {\n\t\t\treturn i;\n\t\t}\n\t}\n\treturn -1;\n};\n\n/** @type {Cache} */\nvar cache = { __proto__: null };\nif (hasToStringTag && gOPD && getProto) {\n\tforEach(typedArrays, function (typedArray) {\n\t\tvar arr = new g[typedArray]();\n\t\tif (Symbol.toStringTag in arr && getProto) {\n\t\t\tvar proto = getProto(arr);\n\t\t\t// @ts-expect-error TS won't narrow inside a closure\n\t\t\tvar descriptor = gOPD(proto, Symbol.toStringTag);\n\t\t\tif (!descriptor && proto) {\n\t\t\t\tvar superProto = getProto(proto);\n\t\t\t\t// @ts-expect-error TS won't narrow inside a closure\n\t\t\t\tdescriptor = gOPD(superProto, Symbol.toStringTag);\n\t\t\t}\n\t\t\tif (descriptor && descriptor.get) {\n\t\t\t\tvar bound = callBind(descriptor.get);\n\t\t\t\tcache[\n\t\t\t\t\t/** @type {`$${TypedArrayName}`} */\n\t\t\t\t\t('$' + typedArray)\n\t\t\t\t] = bound;\n\t\t\t}\n\t\t}\n\t});\n} else {\n\tforEach(typedArrays, function (typedArray) {\n\t\tvar arr = new g[typedArray]();\n\t\tvar fn = arr.slice || arr.set;\n\t\tif (fn) {\n\t\t\tvar bound = /** @type {BoundSlice | BoundSet} */ (\n\t\t\t\t// @ts-expect-error TODO FIXME\n\t\t\t\tcallBind(fn)\n\t\t\t);\n\t\t\tcache[\n\t\t\t\t/** @type {`$${TypedArrayName}`} */\n\t\t\t\t('$' + typedArray)\n\t\t\t] = bound;\n\t\t}\n\t});\n}\n\n/** @type {(value: object) => false | TypedArrayName} */\nfunction tryTypedArrays(value) {\n\t/** @type {ReturnType} */ var found = false;\n\tforEach(\n\t\t/** @type {Record<`$${TypedArrayName}`, Getter>} */ (cache),\n\t\t/** @param {Getter} getter @param {`$${TypedArrayName}`} typedArray */\n\t\tfunction (getter, typedArray) {\n\t\t\tif (!found) {\n\t\t\t\ttry {\n\t\t\t\t\t// @ts-expect-error a throw is fine here\n\t\t\t\t\tif ('$' + getter(value) === typedArray) {\n\t\t\t\t\t\tfound = /** @type {TypedArrayName} */ ($slice(typedArray, 1));\n\t\t\t\t\t}\n\t\t\t\t} catch (e) { /**/ }\n\t\t\t}\n\t\t}\n\t);\n\treturn found;\n}\n\n/** @type {(value: object) => false | TypedArrayName} */\nfunction trySlices(value) {\n\t/** @type {ReturnType} */ var found = false;\n\tforEach(\n\t\t/** @type {Record<`$${TypedArrayName}`, Getter>} */(cache),\n\t\t/** @param {Getter} getter @param {`$${TypedArrayName}`} name */ function (getter, name) {\n\t\t\tif (!found) {\n\t\t\t\ttry {\n\t\t\t\t\t// @ts-expect-error a throw is fine here\n\t\t\t\t\tgetter(value);\n\t\t\t\t\tfound = /** @type {TypedArrayName} */ ($slice(name, 1));\n\t\t\t\t} catch (e) { /**/ }\n\t\t\t}\n\t\t}\n\t);\n\treturn found;\n}\n\n/** @type {(tag: unknown) => tag is typeof typedArrays[number]} */\nfunction isTATag(tag) {\n\treturn $indexOf(typedArrays, tag) > -1;\n}\n\n/**\n * @type {import('.')}\n * @param {unknown} value\n */\nmodule.exports = function whichTypedArray(value) {\n\tif (!value || typeof value !== 'object') {\n\t\treturn false;\n\t}\n\tif (!hasToStringTag) {\n\t\tvar tag = $slice($toString(value), 8, -1);\n\t\tif (isTATag(tag)) {\n\t\t\treturn tag;\n\t\t}\n\t\tif (tag !== 'Object') {\n\t\t\treturn false;\n\t\t}\n\t\t// node < 0.6 hits here on real Typed Arrays\n\t\treturn trySlices(value);\n\t}\n\tif (!gOPD) { return null; } // unknown engine\n\treturn tryTypedArrays(value);\n};\n","module.exports = (window.ReactJSXRuntime || (window.ReactJSXRuntime = (function (React) {\n function jsx(type, config, maybeKey) {\n var props = {};\n var children = null;\n if (config != null) {\n if (config.key !== undefined) {\n props.key = '' + config.key;\n }\n for (var propName in config) {\n if (\n Object.prototype.hasOwnProperty.call(config, propName) &&\n propName !== 'key' &&\n propName !== '__self' &&\n propName !== '__source'\n ) {\n if (propName === 'children') {\n children = config[propName];\n } else {\n props[propName] = config[propName];\n }\n }\n }\n }\n if (maybeKey !== undefined) {\n props.key = '' + maybeKey;\n }\n if (children === null || children === undefined) {\n return React.createElement(type, props);\n }\n return Array.isArray(children)\n ? React.createElement.apply(React, [type, props].concat(children))\n : React.createElement(type, props, children);\n }\n return {jsx: jsx, jsxs: jsx, jsxDEV: jsx, Fragment: React.Fragment};\n})(window.React)));","module.exports = window[\"PropTypes\"];","module.exports = window[\"React\"];","module.exports = window[\"ReactDOM\"];","'use strict';\n\nvar possibleNames = require('possible-typed-array-names');\n\nvar g = typeof globalThis === 'undefined' ? global : globalThis;\n\n/** @type {import('.')} */\nmodule.exports = function availableTypedArrays() {\n\tvar /** @type {ReturnType} */ out = [];\n\tfor (var i = 0; i < possibleNames.length; i++) {\n\t\tif (typeof g[possibleNames[i]] === 'function') {\n\t\t\t// @ts-expect-error\n\t\t\tout[out.length] = possibleNames[i];\n\t\t}\n\t}\n\treturn out;\n};\n","let defaultOptions = {};\n\nexport function getDefaultOptions() {\n return defaultOptions;\n}\n\nexport function setDefaultOptions(newOptions) {\n defaultOptions = newOptions;\n}\n","const dateLongFormatter = (pattern, formatLong) => {\n switch (pattern) {\n case \"P\":\n return formatLong.date({ width: \"short\" });\n case \"PP\":\n return formatLong.date({ width: \"medium\" });\n case \"PPP\":\n return formatLong.date({ width: \"long\" });\n case \"PPPP\":\n default:\n return formatLong.date({ width: \"full\" });\n }\n};\n\nconst timeLongFormatter = (pattern, formatLong) => {\n switch (pattern) {\n case \"p\":\n return formatLong.time({ width: \"short\" });\n case \"pp\":\n return formatLong.time({ width: \"medium\" });\n case \"ppp\":\n return formatLong.time({ width: \"long\" });\n case \"pppp\":\n default:\n return formatLong.time({ width: \"full\" });\n }\n};\n\nconst dateTimeLongFormatter = (pattern, formatLong) => {\n const matchResult = pattern.match(/(P+)(p+)?/) || [];\n const datePattern = matchResult[1];\n const timePattern = matchResult[2];\n\n if (!timePattern) {\n return dateLongFormatter(pattern, formatLong);\n }\n\n let dateTimeFormat;\n\n switch (datePattern) {\n case \"P\":\n dateTimeFormat = formatLong.dateTime({ width: \"short\" });\n break;\n case \"PP\":\n dateTimeFormat = formatLong.dateTime({ width: \"medium\" });\n break;\n case \"PPP\":\n dateTimeFormat = formatLong.dateTime({ width: \"long\" });\n break;\n case \"PPPP\":\n default:\n dateTimeFormat = formatLong.dateTime({ width: \"full\" });\n break;\n }\n\n return dateTimeFormat\n .replace(\"{{date}}\", dateLongFormatter(datePattern, formatLong))\n .replace(\"{{time}}\", timeLongFormatter(timePattern, formatLong));\n};\n\nexport const longFormatters = {\n p: timeLongFormatter,\n P: dateTimeLongFormatter,\n};\n","import { toDate } from \"../toDate.js\";\n\n/**\n * Google Chrome as of 67.0.3396.87 introduced timezones with offset that includes seconds.\n * They usually appear for dates that denote time before the timezones were introduced\n * (e.g. for 'Europe/Prague' timezone the offset is GMT+00:57:44 before 1 October 1891\n * and GMT+01:00:00 after that date)\n *\n * Date#getTimezoneOffset returns the offset in minutes and would return 57 for the example above,\n * which would lead to incorrect calculations.\n *\n * This function returns the timezone offset in milliseconds that takes seconds in account.\n */\nexport function getTimezoneOffsetInMilliseconds(date) {\n const _date = toDate(date);\n const utcDate = new Date(\n Date.UTC(\n _date.getFullYear(),\n _date.getMonth(),\n _date.getDate(),\n _date.getHours(),\n _date.getMinutes(),\n _date.getSeconds(),\n _date.getMilliseconds(),\n ),\n );\n utcDate.setUTCFullYear(_date.getFullYear());\n return +date - +utcDate;\n}\n","import { constructFrom } from \"../constructFrom.js\";\n\nexport function normalizeDates(context, ...dates) {\n const normalize = constructFrom.bind(\n null,\n context || dates.find((date) => typeof date === \"object\"),\n );\n return dates.map(normalize);\n}\n","const dayOfYearTokenRE = /^D+$/;\nconst weekYearTokenRE = /^Y+$/;\n\nconst throwTokens = [\"D\", \"DD\", \"YY\", \"YYYY\"];\n\nexport function isProtectedDayOfYearToken(token) {\n return dayOfYearTokenRE.test(token);\n}\n\nexport function isProtectedWeekYearToken(token) {\n return weekYearTokenRE.test(token);\n}\n\nexport function warnOrThrowProtectedError(token, format, input) {\n const _message = message(token, format, input);\n console.warn(_message);\n if (throwTokens.includes(token)) throw new RangeError(_message);\n}\n\nfunction message(token, format, input) {\n const subject = token[0] === \"Y\" ? \"years\" : \"days of the month\";\n return `Use \\`${token.toLowerCase()}\\` instead of \\`${token}\\` (in \\`${format}\\`) for formatting ${subject} to the input \\`${input}\\`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md`;\n}\n","/**\n * @module constants\n * @summary Useful constants\n * @description\n * Collection of useful date constants.\n *\n * The constants could be imported from `date-fns/constants`:\n *\n * ```ts\n * import { maxTime, minTime } from \"./constants/date-fns/constants\";\n *\n * function isAllowedTime(time) {\n * return time <= maxTime && time >= minTime;\n * }\n * ```\n */\n\n/**\n * @constant\n * @name daysInWeek\n * @summary Days in 1 week.\n */\nexport const daysInWeek = 7;\n\n/**\n * @constant\n * @name daysInYear\n * @summary Days in 1 year.\n *\n * @description\n * How many days in a year.\n *\n * One years equals 365.2425 days according to the formula:\n *\n * > Leap year occurs every 4 years, except for years that are divisible by 100 and not divisible by 400.\n * > 1 mean year = (365+1/4-1/100+1/400) days = 365.2425 days\n */\nexport const daysInYear = 365.2425;\n\n/**\n * @constant\n * @name maxTime\n * @summary Maximum allowed time.\n *\n * @example\n * import { maxTime } from \"./constants/date-fns/constants\";\n *\n * const isValid = 8640000000000001 <= maxTime;\n * //=> false\n *\n * new Date(8640000000000001);\n * //=> Invalid Date\n */\nexport const maxTime = Math.pow(10, 8) * 24 * 60 * 60 * 1000;\n\n/**\n * @constant\n * @name minTime\n * @summary Minimum allowed time.\n *\n * @example\n * import { minTime } from \"./constants/date-fns/constants\";\n *\n * const isValid = -8640000000000001 >= minTime;\n * //=> false\n *\n * new Date(-8640000000000001)\n * //=> Invalid Date\n */\nexport const minTime = -maxTime;\n\n/**\n * @constant\n * @name millisecondsInWeek\n * @summary Milliseconds in 1 week.\n */\nexport const millisecondsInWeek = 604800000;\n\n/**\n * @constant\n * @name millisecondsInDay\n * @summary Milliseconds in 1 day.\n */\nexport const millisecondsInDay = 86400000;\n\n/**\n * @constant\n * @name millisecondsInMinute\n * @summary Milliseconds in 1 minute\n */\nexport const millisecondsInMinute = 60000;\n\n/**\n * @constant\n * @name millisecondsInHour\n * @summary Milliseconds in 1 hour\n */\nexport const millisecondsInHour = 3600000;\n\n/**\n * @constant\n * @name millisecondsInSecond\n * @summary Milliseconds in 1 second\n */\nexport const millisecondsInSecond = 1000;\n\n/**\n * @constant\n * @name minutesInYear\n * @summary Minutes in 1 year.\n */\nexport const minutesInYear = 525600;\n\n/**\n * @constant\n * @name minutesInMonth\n * @summary Minutes in 1 month.\n */\nexport const minutesInMonth = 43200;\n\n/**\n * @constant\n * @name minutesInDay\n * @summary Minutes in 1 day.\n */\nexport const minutesInDay = 1440;\n\n/**\n * @constant\n * @name minutesInHour\n * @summary Minutes in 1 hour.\n */\nexport const minutesInHour = 60;\n\n/**\n * @constant\n * @name monthsInQuarter\n * @summary Months in 1 quarter.\n */\nexport const monthsInQuarter = 3;\n\n/**\n * @constant\n * @name monthsInYear\n * @summary Months in 1 year.\n */\nexport const monthsInYear = 12;\n\n/**\n * @constant\n * @name quartersInYear\n * @summary Quarters in 1 year\n */\nexport const quartersInYear = 4;\n\n/**\n * @constant\n * @name secondsInHour\n * @summary Seconds in 1 hour.\n */\nexport const secondsInHour = 3600;\n\n/**\n * @constant\n * @name secondsInMinute\n * @summary Seconds in 1 minute.\n */\nexport const secondsInMinute = 60;\n\n/**\n * @constant\n * @name secondsInDay\n * @summary Seconds in 1 day.\n */\nexport const secondsInDay = secondsInHour * 24;\n\n/**\n * @constant\n * @name secondsInWeek\n * @summary Seconds in 1 week.\n */\nexport const secondsInWeek = secondsInDay * 7;\n\n/**\n * @constant\n * @name secondsInYear\n * @summary Seconds in 1 year.\n */\nexport const secondsInYear = secondsInDay * daysInYear;\n\n/**\n * @constant\n * @name secondsInMonth\n * @summary Seconds in 1 month\n */\nexport const secondsInMonth = secondsInYear / 12;\n\n/**\n * @constant\n * @name secondsInQuarter\n * @summary Seconds in 1 quarter.\n */\nexport const secondsInQuarter = secondsInMonth * 3;\n\n/**\n * @constant\n * @name constructFromSymbol\n * @summary Symbol enabling Date extensions to inherit properties from the reference date.\n *\n * The symbol is used to enable the `constructFrom` function to construct a date\n * using a reference date and a value. It allows to transfer extra properties\n * from the reference date to the new date. It's useful for extensions like\n * [`TZDate`](https://github.com/date-fns/tz) that accept a time zone as\n * a constructor argument.\n */\nexport const constructFromSymbol = Symbol.for(\"constructDateFrom\");\n","import { constructFromSymbol } from \"./constants.js\";\n\n/**\n * @name constructFrom\n * @category Generic Helpers\n * @summary Constructs a date using the reference date and the value\n *\n * @description\n * The function constructs a new date using the constructor from the reference\n * date and the given value. It helps to build generic functions that accept\n * date extensions.\n *\n * It defaults to `Date` if the passed reference date is a number or a string.\n *\n * Starting from v3.7.0, it allows to construct a date using `[Symbol.for(\"constructDateFrom\")]`\n * enabling to transfer extra properties from the reference date to the new date.\n * It's useful for extensions like [`TZDate`](https://github.com/date-fns/tz)\n * that accept a time zone as a constructor argument.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The reference date to take constructor from\n * @param value - The value to create the date\n *\n * @returns Date initialized using the given date and value\n *\n * @example\n * import { constructFrom } from \"./constructFrom/date-fns\";\n *\n * // A function that clones a date preserving the original type\n * function cloneDate(date: DateType): DateType {\n * return constructFrom(\n * date, // Use constructor from the given date\n * date.getTime() // Use the date value to create a new date\n * );\n * }\n */\nexport function constructFrom(date, value) {\n if (typeof date === \"function\") return date(value);\n\n if (date && typeof date === \"object\" && constructFromSymbol in date)\n return date[constructFromSymbol](value);\n\n if (date instanceof Date) return new date.constructor(value);\n\n return new Date(value);\n}\n\n// Fallback for modularized imports:\nexport default constructFrom;\n","import { getTimezoneOffsetInMilliseconds } from \"./_lib/getTimezoneOffsetInMilliseconds.js\";\nimport { normalizeDates } from \"./_lib/normalizeDates.js\";\nimport { millisecondsInDay } from \"./constants.js\";\nimport { startOfDay } from \"./startOfDay.js\";\n\n/**\n * The {@link differenceInCalendarDays} function options.\n */\n\n/**\n * @name differenceInCalendarDays\n * @category Day Helpers\n * @summary Get the number of calendar days between the given dates.\n *\n * @description\n * Get the number of calendar days between the given dates. This means that the times are removed\n * from the dates and then the difference in days is calculated.\n *\n * @param laterDate - The later date\n * @param earlierDate - The earlier date\n * @param options - The options object\n *\n * @returns The number of calendar days\n *\n * @example\n * // How many calendar days are between\n * // 2 July 2011 23:00:00 and 2 July 2012 00:00:00?\n * const result = differenceInCalendarDays(\n * new Date(2012, 6, 2, 0, 0),\n * new Date(2011, 6, 2, 23, 0)\n * )\n * //=> 366\n * // How many calendar days are between\n * // 2 July 2011 23:59:00 and 3 July 2011 00:01:00?\n * const result = differenceInCalendarDays(\n * new Date(2011, 6, 3, 0, 1),\n * new Date(2011, 6, 2, 23, 59)\n * )\n * //=> 1\n */\nexport function differenceInCalendarDays(laterDate, earlierDate, options) {\n const [laterDate_, earlierDate_] = normalizeDates(\n options?.in,\n laterDate,\n earlierDate,\n );\n\n const laterStartOfDay = startOfDay(laterDate_);\n const earlierStartOfDay = startOfDay(earlierDate_);\n\n const laterTimestamp =\n +laterStartOfDay - getTimezoneOffsetInMilliseconds(laterStartOfDay);\n const earlierTimestamp =\n +earlierStartOfDay - getTimezoneOffsetInMilliseconds(earlierStartOfDay);\n\n // Round the number of days to the nearest integer because the number of\n // milliseconds in a day is not constant (e.g. it's different in the week of\n // the daylight saving time clock shift).\n return Math.round((laterTimestamp - earlierTimestamp) / millisecondsInDay);\n}\n\n// Fallback for modularized imports:\nexport default differenceInCalendarDays;\n","import { differenceInCalendarDays } from \"./differenceInCalendarDays.js\";\nimport { startOfYear } from \"./startOfYear.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getDayOfYear} function options.\n */\n\n/**\n * @name getDayOfYear\n * @category Day Helpers\n * @summary Get the day of the year of the given date.\n *\n * @description\n * Get the day of the year of the given date.\n *\n * @param date - The given date\n * @param options - The options\n *\n * @returns The day of year\n *\n * @example\n * // Which day of the year is 2 July 2014?\n * const result = getDayOfYear(new Date(2014, 6, 2))\n * //=> 183\n */\nexport function getDayOfYear(date, options) {\n const _date = toDate(date, options?.in);\n const diff = differenceInCalendarDays(_date, startOfYear(_date));\n const dayOfYear = diff + 1;\n return dayOfYear;\n}\n\n// Fallback for modularized imports:\nexport default getDayOfYear;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link startOfYear} function options.\n */\n\n/**\n * @name startOfYear\n * @category Year Helpers\n * @summary Return the start of a year for the given date.\n *\n * @description\n * Return the start of a year for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - The options\n *\n * @returns The start of a year\n *\n * @example\n * // The start of a year for 2 September 2014 11:55:00:\n * const result = startOfYear(new Date(2014, 8, 2, 11, 55, 00))\n * //=> Wed Jan 01 2014 00:00:00\n */\nexport function startOfYear(date, options) {\n const date_ = toDate(date, options?.in);\n date_.setFullYear(date_.getFullYear(), 0, 1);\n date_.setHours(0, 0, 0, 0);\n return date_;\n}\n\n// Fallback for modularized imports:\nexport default startOfYear;\n","export function addLeadingZeros(number, targetLength) {\n const sign = number < 0 ? \"-\" : \"\";\n const output = Math.abs(number).toString().padStart(targetLength, \"0\");\n return sign + output;\n}\n","import { addLeadingZeros } from \"../addLeadingZeros.js\";\n\n/*\n * | | Unit | | Unit |\n * |-----|--------------------------------|-----|--------------------------------|\n * | a | AM, PM | A* | |\n * | d | Day of month | D | |\n * | h | Hour [1-12] | H | Hour [0-23] |\n * | m | Minute | M | Month |\n * | s | Second | S | Fraction of second |\n * | y | Year (abs) | Y | |\n *\n * Letters marked by * are not implemented but reserved by Unicode standard.\n */\n\nexport const lightFormatters = {\n // Year\n y(date, token) {\n // From http://www.unicode.org/reports/tr35/tr35-31/tr35-dates.html#Date_Format_tokens\n // | Year | y | yy | yyy | yyyy | yyyyy |\n // |----------|-------|----|-------|-------|-------|\n // | AD 1 | 1 | 01 | 001 | 0001 | 00001 |\n // | AD 12 | 12 | 12 | 012 | 0012 | 00012 |\n // | AD 123 | 123 | 23 | 123 | 0123 | 00123 |\n // | AD 1234 | 1234 | 34 | 1234 | 1234 | 01234 |\n // | AD 12345 | 12345 | 45 | 12345 | 12345 | 12345 |\n\n const signedYear = date.getFullYear();\n // Returns 1 for 1 BC (which is year 0 in JavaScript)\n const year = signedYear > 0 ? signedYear : 1 - signedYear;\n return addLeadingZeros(token === \"yy\" ? year % 100 : year, token.length);\n },\n\n // Month\n M(date, token) {\n const month = date.getMonth();\n return token === \"M\" ? String(month + 1) : addLeadingZeros(month + 1, 2);\n },\n\n // Day of the month\n d(date, token) {\n return addLeadingZeros(date.getDate(), token.length);\n },\n\n // AM or PM\n a(date, token) {\n const dayPeriodEnumValue = date.getHours() / 12 >= 1 ? \"pm\" : \"am\";\n\n switch (token) {\n case \"a\":\n case \"aa\":\n return dayPeriodEnumValue.toUpperCase();\n case \"aaa\":\n return dayPeriodEnumValue;\n case \"aaaaa\":\n return dayPeriodEnumValue[0];\n case \"aaaa\":\n default:\n return dayPeriodEnumValue === \"am\" ? \"a.m.\" : \"p.m.\";\n }\n },\n\n // Hour [1-12]\n h(date, token) {\n return addLeadingZeros(date.getHours() % 12 || 12, token.length);\n },\n\n // Hour [0-23]\n H(date, token) {\n return addLeadingZeros(date.getHours(), token.length);\n },\n\n // Minute\n m(date, token) {\n return addLeadingZeros(date.getMinutes(), token.length);\n },\n\n // Second\n s(date, token) {\n return addLeadingZeros(date.getSeconds(), token.length);\n },\n\n // Fraction of second\n S(date, token) {\n const numberOfDigits = token.length;\n const milliseconds = date.getMilliseconds();\n const fractionalSeconds = Math.trunc(\n milliseconds * Math.pow(10, numberOfDigits - 3),\n );\n return addLeadingZeros(fractionalSeconds, token.length);\n },\n};\n","import { getDayOfYear } from \"../../getDayOfYear.js\";\nimport { getISOWeek } from \"../../getISOWeek.js\";\nimport { getISOWeekYear } from \"../../getISOWeekYear.js\";\nimport { getWeek } from \"../../getWeek.js\";\nimport { getWeekYear } from \"../../getWeekYear.js\";\n\nimport { addLeadingZeros } from \"../addLeadingZeros.js\";\nimport { lightFormatters } from \"./lightFormatters.js\";\n\nconst dayPeriodEnum = {\n am: \"am\",\n pm: \"pm\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n};\n\n/*\n * | | Unit | | Unit |\n * |-----|--------------------------------|-----|--------------------------------|\n * | a | AM, PM | A* | Milliseconds in day |\n * | b | AM, PM, noon, midnight | B | Flexible day period |\n * | c | Stand-alone local day of week | C* | Localized hour w/ day period |\n * | d | Day of month | D | Day of year |\n * | e | Local day of week | E | Day of week |\n * | f | | F* | Day of week in month |\n * | g* | Modified Julian day | G | Era |\n * | h | Hour [1-12] | H | Hour [0-23] |\n * | i! | ISO day of week | I! | ISO week of year |\n * | j* | Localized hour w/ day period | J* | Localized hour w/o day period |\n * | k | Hour [1-24] | K | Hour [0-11] |\n * | l* | (deprecated) | L | Stand-alone month |\n * | m | Minute | M | Month |\n * | n | | N | |\n * | o! | Ordinal number modifier | O | Timezone (GMT) |\n * | p! | Long localized time | P! | Long localized date |\n * | q | Stand-alone quarter | Q | Quarter |\n * | r* | Related Gregorian year | R! | ISO week-numbering year |\n * | s | Second | S | Fraction of second |\n * | t! | Seconds timestamp | T! | Milliseconds timestamp |\n * | u | Extended year | U* | Cyclic year |\n * | v* | Timezone (generic non-locat.) | V* | Timezone (location) |\n * | w | Local week of year | W* | Week of month |\n * | x | Timezone (ISO-8601 w/o Z) | X | Timezone (ISO-8601) |\n * | y | Year (abs) | Y | Local week-numbering year |\n * | z | Timezone (specific non-locat.) | Z* | Timezone (aliases) |\n *\n * Letters marked by * are not implemented but reserved by Unicode standard.\n *\n * Letters marked by ! are non-standard, but implemented by date-fns:\n * - `o` modifies the previous token to turn it into an ordinal (see `format` docs)\n * - `i` is ISO day of week. For `i` and `ii` is returns numeric ISO week days,\n * i.e. 7 for Sunday, 1 for Monday, etc.\n * - `I` is ISO week of year, as opposed to `w` which is local week of year.\n * - `R` is ISO week-numbering year, as opposed to `Y` which is local week-numbering year.\n * `R` is supposed to be used in conjunction with `I` and `i`\n * for universal ISO week-numbering date, whereas\n * `Y` is supposed to be used in conjunction with `w` and `e`\n * for week-numbering date specific to the locale.\n * - `P` is long localized date format\n * - `p` is long localized time format\n */\n\nexport const formatters = {\n // Era\n G: function (date, token, localize) {\n const era = date.getFullYear() > 0 ? 1 : 0;\n switch (token) {\n // AD, BC\n case \"G\":\n case \"GG\":\n case \"GGG\":\n return localize.era(era, { width: \"abbreviated\" });\n // A, B\n case \"GGGGG\":\n return localize.era(era, { width: \"narrow\" });\n // Anno Domini, Before Christ\n case \"GGGG\":\n default:\n return localize.era(era, { width: \"wide\" });\n }\n },\n\n // Year\n y: function (date, token, localize) {\n // Ordinal number\n if (token === \"yo\") {\n const signedYear = date.getFullYear();\n // Returns 1 for 1 BC (which is year 0 in JavaScript)\n const year = signedYear > 0 ? signedYear : 1 - signedYear;\n return localize.ordinalNumber(year, { unit: \"year\" });\n }\n\n return lightFormatters.y(date, token);\n },\n\n // Local week-numbering year\n Y: function (date, token, localize, options) {\n const signedWeekYear = getWeekYear(date, options);\n // Returns 1 for 1 BC (which is year 0 in JavaScript)\n const weekYear = signedWeekYear > 0 ? signedWeekYear : 1 - signedWeekYear;\n\n // Two digit year\n if (token === \"YY\") {\n const twoDigitYear = weekYear % 100;\n return addLeadingZeros(twoDigitYear, 2);\n }\n\n // Ordinal number\n if (token === \"Yo\") {\n return localize.ordinalNumber(weekYear, { unit: \"year\" });\n }\n\n // Padding\n return addLeadingZeros(weekYear, token.length);\n },\n\n // ISO week-numbering year\n R: function (date, token) {\n const isoWeekYear = getISOWeekYear(date);\n\n // Padding\n return addLeadingZeros(isoWeekYear, token.length);\n },\n\n // Extended year. This is a single number designating the year of this calendar system.\n // The main difference between `y` and `u` localizers are B.C. years:\n // | Year | `y` | `u` |\n // |------|-----|-----|\n // | AC 1 | 1 | 1 |\n // | BC 1 | 1 | 0 |\n // | BC 2 | 2 | -1 |\n // Also `yy` always returns the last two digits of a year,\n // while `uu` pads single digit years to 2 characters and returns other years unchanged.\n u: function (date, token) {\n const year = date.getFullYear();\n return addLeadingZeros(year, token.length);\n },\n\n // Quarter\n Q: function (date, token, localize) {\n const quarter = Math.ceil((date.getMonth() + 1) / 3);\n switch (token) {\n // 1, 2, 3, 4\n case \"Q\":\n return String(quarter);\n // 01, 02, 03, 04\n case \"QQ\":\n return addLeadingZeros(quarter, 2);\n // 1st, 2nd, 3rd, 4th\n case \"Qo\":\n return localize.ordinalNumber(quarter, { unit: \"quarter\" });\n // Q1, Q2, Q3, Q4\n case \"QQQ\":\n return localize.quarter(quarter, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // 1, 2, 3, 4 (narrow quarter; could be not numerical)\n case \"QQQQQ\":\n return localize.quarter(quarter, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // 1st quarter, 2nd quarter, ...\n case \"QQQQ\":\n default:\n return localize.quarter(quarter, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // Stand-alone quarter\n q: function (date, token, localize) {\n const quarter = Math.ceil((date.getMonth() + 1) / 3);\n switch (token) {\n // 1, 2, 3, 4\n case \"q\":\n return String(quarter);\n // 01, 02, 03, 04\n case \"qq\":\n return addLeadingZeros(quarter, 2);\n // 1st, 2nd, 3rd, 4th\n case \"qo\":\n return localize.ordinalNumber(quarter, { unit: \"quarter\" });\n // Q1, Q2, Q3, Q4\n case \"qqq\":\n return localize.quarter(quarter, {\n width: \"abbreviated\",\n context: \"standalone\",\n });\n // 1, 2, 3, 4 (narrow quarter; could be not numerical)\n case \"qqqqq\":\n return localize.quarter(quarter, {\n width: \"narrow\",\n context: \"standalone\",\n });\n // 1st quarter, 2nd quarter, ...\n case \"qqqq\":\n default:\n return localize.quarter(quarter, {\n width: \"wide\",\n context: \"standalone\",\n });\n }\n },\n\n // Month\n M: function (date, token, localize) {\n const month = date.getMonth();\n switch (token) {\n case \"M\":\n case \"MM\":\n return lightFormatters.M(date, token);\n // 1st, 2nd, ..., 12th\n case \"Mo\":\n return localize.ordinalNumber(month + 1, { unit: \"month\" });\n // Jan, Feb, ..., Dec\n case \"MMM\":\n return localize.month(month, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // J, F, ..., D\n case \"MMMMM\":\n return localize.month(month, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // January, February, ..., December\n case \"MMMM\":\n default:\n return localize.month(month, { width: \"wide\", context: \"formatting\" });\n }\n },\n\n // Stand-alone month\n L: function (date, token, localize) {\n const month = date.getMonth();\n switch (token) {\n // 1, 2, ..., 12\n case \"L\":\n return String(month + 1);\n // 01, 02, ..., 12\n case \"LL\":\n return addLeadingZeros(month + 1, 2);\n // 1st, 2nd, ..., 12th\n case \"Lo\":\n return localize.ordinalNumber(month + 1, { unit: \"month\" });\n // Jan, Feb, ..., Dec\n case \"LLL\":\n return localize.month(month, {\n width: \"abbreviated\",\n context: \"standalone\",\n });\n // J, F, ..., D\n case \"LLLLL\":\n return localize.month(month, {\n width: \"narrow\",\n context: \"standalone\",\n });\n // January, February, ..., December\n case \"LLLL\":\n default:\n return localize.month(month, { width: \"wide\", context: \"standalone\" });\n }\n },\n\n // Local week of year\n w: function (date, token, localize, options) {\n const week = getWeek(date, options);\n\n if (token === \"wo\") {\n return localize.ordinalNumber(week, { unit: \"week\" });\n }\n\n return addLeadingZeros(week, token.length);\n },\n\n // ISO week of year\n I: function (date, token, localize) {\n const isoWeek = getISOWeek(date);\n\n if (token === \"Io\") {\n return localize.ordinalNumber(isoWeek, { unit: \"week\" });\n }\n\n return addLeadingZeros(isoWeek, token.length);\n },\n\n // Day of the month\n d: function (date, token, localize) {\n if (token === \"do\") {\n return localize.ordinalNumber(date.getDate(), { unit: \"date\" });\n }\n\n return lightFormatters.d(date, token);\n },\n\n // Day of year\n D: function (date, token, localize) {\n const dayOfYear = getDayOfYear(date);\n\n if (token === \"Do\") {\n return localize.ordinalNumber(dayOfYear, { unit: \"dayOfYear\" });\n }\n\n return addLeadingZeros(dayOfYear, token.length);\n },\n\n // Day of week\n E: function (date, token, localize) {\n const dayOfWeek = date.getDay();\n switch (token) {\n // Tue\n case \"E\":\n case \"EE\":\n case \"EEE\":\n return localize.day(dayOfWeek, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // T\n case \"EEEEE\":\n return localize.day(dayOfWeek, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // Tu\n case \"EEEEEE\":\n return localize.day(dayOfWeek, {\n width: \"short\",\n context: \"formatting\",\n });\n // Tuesday\n case \"EEEE\":\n default:\n return localize.day(dayOfWeek, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // Local day of week\n e: function (date, token, localize, options) {\n const dayOfWeek = date.getDay();\n const localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7;\n switch (token) {\n // Numerical value (Nth day of week with current locale or weekStartsOn)\n case \"e\":\n return String(localDayOfWeek);\n // Padded numerical value\n case \"ee\":\n return addLeadingZeros(localDayOfWeek, 2);\n // 1st, 2nd, ..., 7th\n case \"eo\":\n return localize.ordinalNumber(localDayOfWeek, { unit: \"day\" });\n case \"eee\":\n return localize.day(dayOfWeek, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // T\n case \"eeeee\":\n return localize.day(dayOfWeek, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // Tu\n case \"eeeeee\":\n return localize.day(dayOfWeek, {\n width: \"short\",\n context: \"formatting\",\n });\n // Tuesday\n case \"eeee\":\n default:\n return localize.day(dayOfWeek, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // Stand-alone local day of week\n c: function (date, token, localize, options) {\n const dayOfWeek = date.getDay();\n const localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7;\n switch (token) {\n // Numerical value (same as in `e`)\n case \"c\":\n return String(localDayOfWeek);\n // Padded numerical value\n case \"cc\":\n return addLeadingZeros(localDayOfWeek, token.length);\n // 1st, 2nd, ..., 7th\n case \"co\":\n return localize.ordinalNumber(localDayOfWeek, { unit: \"day\" });\n case \"ccc\":\n return localize.day(dayOfWeek, {\n width: \"abbreviated\",\n context: \"standalone\",\n });\n // T\n case \"ccccc\":\n return localize.day(dayOfWeek, {\n width: \"narrow\",\n context: \"standalone\",\n });\n // Tu\n case \"cccccc\":\n return localize.day(dayOfWeek, {\n width: \"short\",\n context: \"standalone\",\n });\n // Tuesday\n case \"cccc\":\n default:\n return localize.day(dayOfWeek, {\n width: \"wide\",\n context: \"standalone\",\n });\n }\n },\n\n // ISO day of week\n i: function (date, token, localize) {\n const dayOfWeek = date.getDay();\n const isoDayOfWeek = dayOfWeek === 0 ? 7 : dayOfWeek;\n switch (token) {\n // 2\n case \"i\":\n return String(isoDayOfWeek);\n // 02\n case \"ii\":\n return addLeadingZeros(isoDayOfWeek, token.length);\n // 2nd\n case \"io\":\n return localize.ordinalNumber(isoDayOfWeek, { unit: \"day\" });\n // Tue\n case \"iii\":\n return localize.day(dayOfWeek, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // T\n case \"iiiii\":\n return localize.day(dayOfWeek, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // Tu\n case \"iiiiii\":\n return localize.day(dayOfWeek, {\n width: \"short\",\n context: \"formatting\",\n });\n // Tuesday\n case \"iiii\":\n default:\n return localize.day(dayOfWeek, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // AM or PM\n a: function (date, token, localize) {\n const hours = date.getHours();\n const dayPeriodEnumValue = hours / 12 >= 1 ? \"pm\" : \"am\";\n\n switch (token) {\n case \"a\":\n case \"aa\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n case \"aaa\":\n return localize\n .dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n })\n .toLowerCase();\n case \"aaaaa\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"narrow\",\n context: \"formatting\",\n });\n case \"aaaa\":\n default:\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // AM, PM, midnight, noon\n b: function (date, token, localize) {\n const hours = date.getHours();\n let dayPeriodEnumValue;\n if (hours === 12) {\n dayPeriodEnumValue = dayPeriodEnum.noon;\n } else if (hours === 0) {\n dayPeriodEnumValue = dayPeriodEnum.midnight;\n } else {\n dayPeriodEnumValue = hours / 12 >= 1 ? \"pm\" : \"am\";\n }\n\n switch (token) {\n case \"b\":\n case \"bb\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n case \"bbb\":\n return localize\n .dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n })\n .toLowerCase();\n case \"bbbbb\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"narrow\",\n context: \"formatting\",\n });\n case \"bbbb\":\n default:\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // in the morning, in the afternoon, in the evening, at night\n B: function (date, token, localize) {\n const hours = date.getHours();\n let dayPeriodEnumValue;\n if (hours >= 17) {\n dayPeriodEnumValue = dayPeriodEnum.evening;\n } else if (hours >= 12) {\n dayPeriodEnumValue = dayPeriodEnum.afternoon;\n } else if (hours >= 4) {\n dayPeriodEnumValue = dayPeriodEnum.morning;\n } else {\n dayPeriodEnumValue = dayPeriodEnum.night;\n }\n\n switch (token) {\n case \"B\":\n case \"BB\":\n case \"BBB\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n case \"BBBBB\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"narrow\",\n context: \"formatting\",\n });\n case \"BBBB\":\n default:\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // Hour [1-12]\n h: function (date, token, localize) {\n if (token === \"ho\") {\n let hours = date.getHours() % 12;\n if (hours === 0) hours = 12;\n return localize.ordinalNumber(hours, { unit: \"hour\" });\n }\n\n return lightFormatters.h(date, token);\n },\n\n // Hour [0-23]\n H: function (date, token, localize) {\n if (token === \"Ho\") {\n return localize.ordinalNumber(date.getHours(), { unit: \"hour\" });\n }\n\n return lightFormatters.H(date, token);\n },\n\n // Hour [0-11]\n K: function (date, token, localize) {\n const hours = date.getHours() % 12;\n\n if (token === \"Ko\") {\n return localize.ordinalNumber(hours, { unit: \"hour\" });\n }\n\n return addLeadingZeros(hours, token.length);\n },\n\n // Hour [1-24]\n k: function (date, token, localize) {\n let hours = date.getHours();\n if (hours === 0) hours = 24;\n\n if (token === \"ko\") {\n return localize.ordinalNumber(hours, { unit: \"hour\" });\n }\n\n return addLeadingZeros(hours, token.length);\n },\n\n // Minute\n m: function (date, token, localize) {\n if (token === \"mo\") {\n return localize.ordinalNumber(date.getMinutes(), { unit: \"minute\" });\n }\n\n return lightFormatters.m(date, token);\n },\n\n // Second\n s: function (date, token, localize) {\n if (token === \"so\") {\n return localize.ordinalNumber(date.getSeconds(), { unit: \"second\" });\n }\n\n return lightFormatters.s(date, token);\n },\n\n // Fraction of second\n S: function (date, token) {\n return lightFormatters.S(date, token);\n },\n\n // Timezone (ISO-8601. If offset is 0, output is always `'Z'`)\n X: function (date, token, _localize) {\n const timezoneOffset = date.getTimezoneOffset();\n\n if (timezoneOffset === 0) {\n return \"Z\";\n }\n\n switch (token) {\n // Hours and optional minutes\n case \"X\":\n return formatTimezoneWithOptionalMinutes(timezoneOffset);\n\n // Hours, minutes and optional seconds without `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `XX`\n case \"XXXX\":\n case \"XX\": // Hours and minutes without `:` delimiter\n return formatTimezone(timezoneOffset);\n\n // Hours, minutes and optional seconds with `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `XXX`\n case \"XXXXX\":\n case \"XXX\": // Hours and minutes with `:` delimiter\n default:\n return formatTimezone(timezoneOffset, \":\");\n }\n },\n\n // Timezone (ISO-8601. If offset is 0, output is `'+00:00'` or equivalent)\n x: function (date, token, _localize) {\n const timezoneOffset = date.getTimezoneOffset();\n\n switch (token) {\n // Hours and optional minutes\n case \"x\":\n return formatTimezoneWithOptionalMinutes(timezoneOffset);\n\n // Hours, minutes and optional seconds without `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `xx`\n case \"xxxx\":\n case \"xx\": // Hours and minutes without `:` delimiter\n return formatTimezone(timezoneOffset);\n\n // Hours, minutes and optional seconds with `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `xxx`\n case \"xxxxx\":\n case \"xxx\": // Hours and minutes with `:` delimiter\n default:\n return formatTimezone(timezoneOffset, \":\");\n }\n },\n\n // Timezone (GMT)\n O: function (date, token, _localize) {\n const timezoneOffset = date.getTimezoneOffset();\n\n switch (token) {\n // Short\n case \"O\":\n case \"OO\":\n case \"OOO\":\n return \"GMT\" + formatTimezoneShort(timezoneOffset, \":\");\n // Long\n case \"OOOO\":\n default:\n return \"GMT\" + formatTimezone(timezoneOffset, \":\");\n }\n },\n\n // Timezone (specific non-location)\n z: function (date, token, _localize) {\n const timezoneOffset = date.getTimezoneOffset();\n\n switch (token) {\n // Short\n case \"z\":\n case \"zz\":\n case \"zzz\":\n return \"GMT\" + formatTimezoneShort(timezoneOffset, \":\");\n // Long\n case \"zzzz\":\n default:\n return \"GMT\" + formatTimezone(timezoneOffset, \":\");\n }\n },\n\n // Seconds timestamp\n t: function (date, token, _localize) {\n const timestamp = Math.trunc(+date / 1000);\n return addLeadingZeros(timestamp, token.length);\n },\n\n // Milliseconds timestamp\n T: function (date, token, _localize) {\n return addLeadingZeros(+date, token.length);\n },\n};\n\nfunction formatTimezoneShort(offset, delimiter = \"\") {\n const sign = offset > 0 ? \"-\" : \"+\";\n const absOffset = Math.abs(offset);\n const hours = Math.trunc(absOffset / 60);\n const minutes = absOffset % 60;\n if (minutes === 0) {\n return sign + String(hours);\n }\n return sign + String(hours) + delimiter + addLeadingZeros(minutes, 2);\n}\n\nfunction formatTimezoneWithOptionalMinutes(offset, delimiter) {\n if (offset % 60 === 0) {\n const sign = offset > 0 ? \"-\" : \"+\";\n return sign + addLeadingZeros(Math.abs(offset) / 60, 2);\n }\n return formatTimezone(offset, delimiter);\n}\n\nfunction formatTimezone(offset, delimiter = \"\") {\n const sign = offset > 0 ? \"-\" : \"+\";\n const absOffset = Math.abs(offset);\n const hours = addLeadingZeros(Math.trunc(absOffset / 60), 2);\n const minutes = addLeadingZeros(absOffset % 60, 2);\n return sign + hours + delimiter + minutes;\n}\n","import { defaultLocale } from \"./_lib/defaultLocale.js\";\nimport { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { formatters } from \"./_lib/format/formatters.js\";\nimport { longFormatters } from \"./_lib/format/longFormatters.js\";\nimport {\n isProtectedDayOfYearToken,\n isProtectedWeekYearToken,\n warnOrThrowProtectedError,\n} from \"./_lib/protectedTokens.js\";\nimport { isValid } from \"./isValid.js\";\nimport { toDate } from \"./toDate.js\";\n\n// Rexports of internal for libraries to use.\n// See: https://github.com/date-fns/date-fns/issues/3638#issuecomment-1877082874\nexport { formatters, longFormatters };\n\n// This RegExp consists of three parts separated by `|`:\n// - [yYQqMLwIdDecihHKkms]o matches any available ordinal number token\n// (one of the certain letters followed by `o`)\n// - (\\w)\\1* matches any sequences of the same letter\n// - '' matches two quote characters in a row\n// - '(''|[^'])+('|$) matches anything surrounded by two quote characters ('),\n// except a single quote symbol, which ends the sequence.\n// Two quote characters do not end the sequence.\n// If there is no matching single quote\n// then the sequence will continue until the end of the string.\n// - . matches any single character unmatched by previous parts of the RegExps\nconst formattingTokensRegExp =\n /[yYQqMLwIdDecihHKkms]o|(\\w)\\1*|''|'(''|[^'])+('|$)|./g;\n\n// This RegExp catches symbols escaped by quotes, and also\n// sequences of symbols P, p, and the combinations like `PPPPPPPppppp`\nconst longFormattingTokensRegExp = /P+p+|P+|p+|''|'(''|[^'])+('|$)|./g;\n\nconst escapedStringRegExp = /^'([^]*?)'?$/;\nconst doubleQuoteRegExp = /''/g;\nconst unescapedLatinCharacterRegExp = /[a-zA-Z]/;\n\nexport { format as formatDate };\n\n/**\n * The {@link format} function options.\n */\n\n/**\n * @name format\n * @alias formatDate\n * @category Common Helpers\n * @summary Format the date.\n *\n * @description\n * Return the formatted date string in the given format. The result may vary by locale.\n *\n * > ⚠️ Please note that the `format` tokens differ from Moment.js and other libraries.\n * > See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * The characters wrapped between two single quotes characters (') are escaped.\n * Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.\n * (see the last example)\n *\n * Format of the string is based on Unicode Technical Standard #35:\n * https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table\n * with a few additions (see note 7 below the table).\n *\n * Accepted patterns:\n * | Unit | Pattern | Result examples | Notes |\n * |---------------------------------|---------|-----------------------------------|-------|\n * | Era | G..GGG | AD, BC | |\n * | | GGGG | Anno Domini, Before Christ | 2 |\n * | | GGGGG | A, B | |\n * | Calendar year | y | 44, 1, 1900, 2017 | 5 |\n * | | yo | 44th, 1st, 0th, 17th | 5,7 |\n * | | yy | 44, 01, 00, 17 | 5 |\n * | | yyy | 044, 001, 1900, 2017 | 5 |\n * | | yyyy | 0044, 0001, 1900, 2017 | 5 |\n * | | yyyyy | ... | 3,5 |\n * | Local week-numbering year | Y | 44, 1, 1900, 2017 | 5 |\n * | | Yo | 44th, 1st, 1900th, 2017th | 5,7 |\n * | | YY | 44, 01, 00, 17 | 5,8 |\n * | | YYY | 044, 001, 1900, 2017 | 5 |\n * | | YYYY | 0044, 0001, 1900, 2017 | 5,8 |\n * | | YYYYY | ... | 3,5 |\n * | ISO week-numbering year | R | -43, 0, 1, 1900, 2017 | 5,7 |\n * | | RR | -43, 00, 01, 1900, 2017 | 5,7 |\n * | | RRR | -043, 000, 001, 1900, 2017 | 5,7 |\n * | | RRRR | -0043, 0000, 0001, 1900, 2017 | 5,7 |\n * | | RRRRR | ... | 3,5,7 |\n * | Extended year | u | -43, 0, 1, 1900, 2017 | 5 |\n * | | uu | -43, 01, 1900, 2017 | 5 |\n * | | uuu | -043, 001, 1900, 2017 | 5 |\n * | | uuuu | -0043, 0001, 1900, 2017 | 5 |\n * | | uuuuu | ... | 3,5 |\n * | Quarter (formatting) | Q | 1, 2, 3, 4 | |\n * | | Qo | 1st, 2nd, 3rd, 4th | 7 |\n * | | QQ | 01, 02, 03, 04 | |\n * | | QQQ | Q1, Q2, Q3, Q4 | |\n * | | QQQQ | 1st quarter, 2nd quarter, ... | 2 |\n * | | QQQQQ | 1, 2, 3, 4 | 4 |\n * | Quarter (stand-alone) | q | 1, 2, 3, 4 | |\n * | | qo | 1st, 2nd, 3rd, 4th | 7 |\n * | | qq | 01, 02, 03, 04 | |\n * | | qqq | Q1, Q2, Q3, Q4 | |\n * | | qqqq | 1st quarter, 2nd quarter, ... | 2 |\n * | | qqqqq | 1, 2, 3, 4 | 4 |\n * | Month (formatting) | M | 1, 2, ..., 12 | |\n * | | Mo | 1st, 2nd, ..., 12th | 7 |\n * | | MM | 01, 02, ..., 12 | |\n * | | MMM | Jan, Feb, ..., Dec | |\n * | | MMMM | January, February, ..., December | 2 |\n * | | MMMMM | J, F, ..., D | |\n * | Month (stand-alone) | L | 1, 2, ..., 12 | |\n * | | Lo | 1st, 2nd, ..., 12th | 7 |\n * | | LL | 01, 02, ..., 12 | |\n * | | LLL | Jan, Feb, ..., Dec | |\n * | | LLLL | January, February, ..., December | 2 |\n * | | LLLLL | J, F, ..., D | |\n * | Local week of year | w | 1, 2, ..., 53 | |\n * | | wo | 1st, 2nd, ..., 53th | 7 |\n * | | ww | 01, 02, ..., 53 | |\n * | ISO week of year | I | 1, 2, ..., 53 | 7 |\n * | | Io | 1st, 2nd, ..., 53th | 7 |\n * | | II | 01, 02, ..., 53 | 7 |\n * | Day of month | d | 1, 2, ..., 31 | |\n * | | do | 1st, 2nd, ..., 31st | 7 |\n * | | dd | 01, 02, ..., 31 | |\n * | Day of year | D | 1, 2, ..., 365, 366 | 9 |\n * | | Do | 1st, 2nd, ..., 365th, 366th | 7 |\n * | | DD | 01, 02, ..., 365, 366 | 9 |\n * | | DDD | 001, 002, ..., 365, 366 | |\n * | | DDDD | ... | 3 |\n * | Day of week (formatting) | E..EEE | Mon, Tue, Wed, ..., Sun | |\n * | | EEEE | Monday, Tuesday, ..., Sunday | 2 |\n * | | EEEEE | M, T, W, T, F, S, S | |\n * | | EEEEEE | Mo, Tu, We, Th, Fr, Sa, Su | |\n * | ISO day of week (formatting) | i | 1, 2, 3, ..., 7 | 7 |\n * | | io | 1st, 2nd, ..., 7th | 7 |\n * | | ii | 01, 02, ..., 07 | 7 |\n * | | iii | Mon, Tue, Wed, ..., Sun | 7 |\n * | | iiii | Monday, Tuesday, ..., Sunday | 2,7 |\n * | | iiiii | M, T, W, T, F, S, S | 7 |\n * | | iiiiii | Mo, Tu, We, Th, Fr, Sa, Su | 7 |\n * | Local day of week (formatting) | e | 2, 3, 4, ..., 1 | |\n * | | eo | 2nd, 3rd, ..., 1st | 7 |\n * | | ee | 02, 03, ..., 01 | |\n * | | eee | Mon, Tue, Wed, ..., Sun | |\n * | | eeee | Monday, Tuesday, ..., Sunday | 2 |\n * | | eeeee | M, T, W, T, F, S, S | |\n * | | eeeeee | Mo, Tu, We, Th, Fr, Sa, Su | |\n * | Local day of week (stand-alone) | c | 2, 3, 4, ..., 1 | |\n * | | co | 2nd, 3rd, ..., 1st | 7 |\n * | | cc | 02, 03, ..., 01 | |\n * | | ccc | Mon, Tue, Wed, ..., Sun | |\n * | | cccc | Monday, Tuesday, ..., Sunday | 2 |\n * | | ccccc | M, T, W, T, F, S, S | |\n * | | cccccc | Mo, Tu, We, Th, Fr, Sa, Su | |\n * | AM, PM | a..aa | AM, PM | |\n * | | aaa | am, pm | |\n * | | aaaa | a.m., p.m. | 2 |\n * | | aaaaa | a, p | |\n * | AM, PM, noon, midnight | b..bb | AM, PM, noon, midnight | |\n * | | bbb | am, pm, noon, midnight | |\n * | | bbbb | a.m., p.m., noon, midnight | 2 |\n * | | bbbbb | a, p, n, mi | |\n * | Flexible day period | B..BBB | at night, in the morning, ... | |\n * | | BBBB | at night, in the morning, ... | 2 |\n * | | BBBBB | at night, in the morning, ... | |\n * | Hour [1-12] | h | 1, 2, ..., 11, 12 | |\n * | | ho | 1st, 2nd, ..., 11th, 12th | 7 |\n * | | hh | 01, 02, ..., 11, 12 | |\n * | Hour [0-23] | H | 0, 1, 2, ..., 23 | |\n * | | Ho | 0th, 1st, 2nd, ..., 23rd | 7 |\n * | | HH | 00, 01, 02, ..., 23 | |\n * | Hour [0-11] | K | 1, 2, ..., 11, 0 | |\n * | | Ko | 1st, 2nd, ..., 11th, 0th | 7 |\n * | | KK | 01, 02, ..., 11, 00 | |\n * | Hour [1-24] | k | 24, 1, 2, ..., 23 | |\n * | | ko | 24th, 1st, 2nd, ..., 23rd | 7 |\n * | | kk | 24, 01, 02, ..., 23 | |\n * | Minute | m | 0, 1, ..., 59 | |\n * | | mo | 0th, 1st, ..., 59th | 7 |\n * | | mm | 00, 01, ..., 59 | |\n * | Second | s | 0, 1, ..., 59 | |\n * | | so | 0th, 1st, ..., 59th | 7 |\n * | | ss | 00, 01, ..., 59 | |\n * | Fraction of second | S | 0, 1, ..., 9 | |\n * | | SS | 00, 01, ..., 99 | |\n * | | SSS | 000, 001, ..., 999 | |\n * | | SSSS | ... | 3 |\n * | Timezone (ISO-8601 w/ Z) | X | -08, +0530, Z | |\n * | | XX | -0800, +0530, Z | |\n * | | XXX | -08:00, +05:30, Z | |\n * | | XXXX | -0800, +0530, Z, +123456 | 2 |\n * | | XXXXX | -08:00, +05:30, Z, +12:34:56 | |\n * | Timezone (ISO-8601 w/o Z) | x | -08, +0530, +00 | |\n * | | xx | -0800, +0530, +0000 | |\n * | | xxx | -08:00, +05:30, +00:00 | 2 |\n * | | xxxx | -0800, +0530, +0000, +123456 | |\n * | | xxxxx | -08:00, +05:30, +00:00, +12:34:56 | |\n * | Timezone (GMT) | O...OOO | GMT-8, GMT+5:30, GMT+0 | |\n * | | OOOO | GMT-08:00, GMT+05:30, GMT+00:00 | 2 |\n * | Timezone (specific non-locat.) | z...zzz | GMT-8, GMT+5:30, GMT+0 | 6 |\n * | | zzzz | GMT-08:00, GMT+05:30, GMT+00:00 | 2,6 |\n * | Seconds timestamp | t | 512969520 | 7 |\n * | | tt | ... | 3,7 |\n * | Milliseconds timestamp | T | 512969520900 | 7 |\n * | | TT | ... | 3,7 |\n * | Long localized date | P | 04/29/1453 | 7 |\n * | | PP | Apr 29, 1453 | 7 |\n * | | PPP | April 29th, 1453 | 7 |\n * | | PPPP | Friday, April 29th, 1453 | 2,7 |\n * | Long localized time | p | 12:00 AM | 7 |\n * | | pp | 12:00:00 AM | 7 |\n * | | ppp | 12:00:00 AM GMT+2 | 7 |\n * | | pppp | 12:00:00 AM GMT+02:00 | 2,7 |\n * | Combination of date and time | Pp | 04/29/1453, 12:00 AM | 7 |\n * | | PPpp | Apr 29, 1453, 12:00:00 AM | 7 |\n * | | PPPppp | April 29th, 1453 at ... | 7 |\n * | | PPPPpppp| Friday, April 29th, 1453 at ... | 2,7 |\n * Notes:\n * 1. \"Formatting\" units (e.g. formatting quarter) in the default en-US locale\n * are the same as \"stand-alone\" units, but are different in some languages.\n * \"Formatting\" units are declined according to the rules of the language\n * in the context of a date. \"Stand-alone\" units are always nominative singular:\n *\n * `format(new Date(2017, 10, 6), 'do LLLL', {locale: cs}) //=> '6. listopad'`\n *\n * `format(new Date(2017, 10, 6), 'do MMMM', {locale: cs}) //=> '6. listopadu'`\n *\n * 2. Any sequence of the identical letters is a pattern, unless it is escaped by\n * the single quote characters (see below).\n * If the sequence is longer than listed in table (e.g. `EEEEEEEEEEE`)\n * the output will be the same as default pattern for this unit, usually\n * the longest one (in case of ISO weekdays, `EEEE`). Default patterns for units\n * are marked with \"2\" in the last column of the table.\n *\n * `format(new Date(2017, 10, 6), 'MMM') //=> 'Nov'`\n *\n * `format(new Date(2017, 10, 6), 'MMMM') //=> 'November'`\n *\n * `format(new Date(2017, 10, 6), 'MMMMM') //=> 'N'`\n *\n * `format(new Date(2017, 10, 6), 'MMMMMM') //=> 'November'`\n *\n * `format(new Date(2017, 10, 6), 'MMMMMMM') //=> 'November'`\n *\n * 3. Some patterns could be unlimited length (such as `yyyyyyyy`).\n * The output will be padded with zeros to match the length of the pattern.\n *\n * `format(new Date(2017, 10, 6), 'yyyyyyyy') //=> '00002017'`\n *\n * 4. `QQQQQ` and `qqqqq` could be not strictly numerical in some locales.\n * These tokens represent the shortest form of the quarter.\n *\n * 5. The main difference between `y` and `u` patterns are B.C. years:\n *\n * | Year | `y` | `u` |\n * |------|-----|-----|\n * | AC 1 | 1 | 1 |\n * | BC 1 | 1 | 0 |\n * | BC 2 | 2 | -1 |\n *\n * Also `yy` always returns the last two digits of a year,\n * while `uu` pads single digit years to 2 characters and returns other years unchanged:\n *\n * | Year | `yy` | `uu` |\n * |------|------|------|\n * | 1 | 01 | 01 |\n * | 14 | 14 | 14 |\n * | 376 | 76 | 376 |\n * | 1453 | 53 | 1453 |\n *\n * The same difference is true for local and ISO week-numbering years (`Y` and `R`),\n * except local week-numbering years are dependent on `options.weekStartsOn`\n * and `options.firstWeekContainsDate` (compare [getISOWeekYear](https://date-fns.org/docs/getISOWeekYear)\n * and [getWeekYear](https://date-fns.org/docs/getWeekYear)).\n *\n * 6. Specific non-location timezones are currently unavailable in `date-fns`,\n * so right now these tokens fall back to GMT timezones.\n *\n * 7. These patterns are not in the Unicode Technical Standard #35:\n * - `i`: ISO day of week\n * - `I`: ISO week of year\n * - `R`: ISO week-numbering year\n * - `t`: seconds timestamp\n * - `T`: milliseconds timestamp\n * - `o`: ordinal number modifier\n * - `P`: long localized date\n * - `p`: long localized time\n *\n * 8. `YY` and `YYYY` tokens represent week-numbering years but they are often confused with years.\n * You should enable `options.useAdditionalWeekYearTokens` to use them. See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * 9. `D` and `DD` tokens represent days of the year but they are often confused with days of the month.\n * You should enable `options.useAdditionalDayOfYearTokens` to use them. See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * @param date - The original date\n * @param format - The string of tokens\n * @param options - An object with options\n *\n * @returns The formatted date string\n *\n * @throws `date` must not be Invalid Date\n * @throws `options.locale` must contain `localize` property\n * @throws `options.locale` must contain `formatLong` property\n * @throws use `yyyy` instead of `YYYY` for formatting years using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws use `yy` instead of `YY` for formatting years using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws use `d` instead of `D` for formatting days of the month using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws use `dd` instead of `DD` for formatting days of the month using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws format string contains an unescaped latin alphabet character\n *\n * @example\n * // Represent 11 February 2014 in middle-endian format:\n * const result = format(new Date(2014, 1, 11), 'MM/dd/yyyy')\n * //=> '02/11/2014'\n *\n * @example\n * // Represent 2 July 2014 in Esperanto:\n * import { eoLocale } from 'date-fns/locale/eo'\n * const result = format(new Date(2014, 6, 2), \"do 'de' MMMM yyyy\", {\n * locale: eoLocale\n * })\n * //=> '2-a de julio 2014'\n *\n * @example\n * // Escape string by single quote characters:\n * const result = format(new Date(2014, 6, 2, 15), \"h 'o''clock'\")\n * //=> \"3 o'clock\"\n */\nexport function format(date, formatStr, options) {\n const defaultOptions = getDefaultOptions();\n const locale = options?.locale ?? defaultOptions.locale ?? defaultLocale;\n\n const firstWeekContainsDate =\n options?.firstWeekContainsDate ??\n options?.locale?.options?.firstWeekContainsDate ??\n defaultOptions.firstWeekContainsDate ??\n defaultOptions.locale?.options?.firstWeekContainsDate ??\n 1;\n\n const weekStartsOn =\n options?.weekStartsOn ??\n options?.locale?.options?.weekStartsOn ??\n defaultOptions.weekStartsOn ??\n defaultOptions.locale?.options?.weekStartsOn ??\n 0;\n\n const originalDate = toDate(date, options?.in);\n\n if (!isValid(originalDate)) {\n throw new RangeError(\"Invalid time value\");\n }\n\n let parts = formatStr\n .match(longFormattingTokensRegExp)\n .map((substring) => {\n const firstCharacter = substring[0];\n if (firstCharacter === \"p\" || firstCharacter === \"P\") {\n const longFormatter = longFormatters[firstCharacter];\n return longFormatter(substring, locale.formatLong);\n }\n return substring;\n })\n .join(\"\")\n .match(formattingTokensRegExp)\n .map((substring) => {\n // Replace two single quote characters with one single quote character\n if (substring === \"''\") {\n return { isToken: false, value: \"'\" };\n }\n\n const firstCharacter = substring[0];\n if (firstCharacter === \"'\") {\n return { isToken: false, value: cleanEscapedString(substring) };\n }\n\n if (formatters[firstCharacter]) {\n return { isToken: true, value: substring };\n }\n\n if (firstCharacter.match(unescapedLatinCharacterRegExp)) {\n throw new RangeError(\n \"Format string contains an unescaped latin alphabet character `\" +\n firstCharacter +\n \"`\",\n );\n }\n\n return { isToken: false, value: substring };\n });\n\n // invoke localize preprocessor (only for french locales at the moment)\n if (locale.localize.preprocessor) {\n parts = locale.localize.preprocessor(originalDate, parts);\n }\n\n const formatterOptions = {\n firstWeekContainsDate,\n weekStartsOn,\n locale,\n };\n\n return parts\n .map((part) => {\n if (!part.isToken) return part.value;\n\n const token = part.value;\n\n if (\n (!options?.useAdditionalWeekYearTokens &&\n isProtectedWeekYearToken(token)) ||\n (!options?.useAdditionalDayOfYearTokens &&\n isProtectedDayOfYearToken(token))\n ) {\n warnOrThrowProtectedError(token, formatStr, String(date));\n }\n\n const formatter = formatters[token[0]];\n return formatter(originalDate, token, locale.localize, formatterOptions);\n })\n .join(\"\");\n}\n\nfunction cleanEscapedString(input) {\n const matched = input.match(escapedStringRegExp);\n\n if (!matched) {\n return input;\n }\n\n return matched[1].replace(doubleQuoteRegExp, \"'\");\n}\n\n// Fallback for modularized imports:\nexport default format;\n","import { constructFrom } from \"./constructFrom.js\";\nimport { getISOWeekYear } from \"./getISOWeekYear.js\";\nimport { startOfISOWeek } from \"./startOfISOWeek.js\";\n\n/**\n * The {@link startOfISOWeekYear} function options.\n */\n\n/**\n * @name startOfISOWeekYear\n * @category ISO Week-Numbering Year Helpers\n * @summary Return the start of an ISO week-numbering year for the given date.\n *\n * @description\n * Return the start of an ISO week-numbering year,\n * which always starts 3 days before the year's first Thursday.\n * The result will be in the local timezone.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of an ISO week-numbering year\n *\n * @example\n * // The start of an ISO week-numbering year for 2 July 2005:\n * const result = startOfISOWeekYear(new Date(2005, 6, 2))\n * //=> Mon Jan 03 2005 00:00:00\n */\nexport function startOfISOWeekYear(date, options) {\n const year = getISOWeekYear(date, options);\n const fourthOfJanuary = constructFrom(options?.in || date, 0);\n fourthOfJanuary.setFullYear(year, 0, 4);\n fourthOfJanuary.setHours(0, 0, 0, 0);\n return startOfISOWeek(fourthOfJanuary);\n}\n\n// Fallback for modularized imports:\nexport default startOfISOWeekYear;\n","import { millisecondsInWeek } from \"./constants.js\";\nimport { startOfISOWeek } from \"./startOfISOWeek.js\";\nimport { startOfISOWeekYear } from \"./startOfISOWeekYear.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getISOWeek} function options.\n */\n\n/**\n * @name getISOWeek\n * @category ISO Week Helpers\n * @summary Get the ISO week of the given date.\n *\n * @description\n * Get the ISO week of the given date.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @param date - The given date\n * @param options - The options\n *\n * @returns The ISO week\n *\n * @example\n * // Which week of the ISO-week numbering year is 2 January 2005?\n * const result = getISOWeek(new Date(2005, 0, 2))\n * //=> 53\n */\nexport function getISOWeek(date, options) {\n const _date = toDate(date, options?.in);\n const diff = +startOfISOWeek(_date) - +startOfISOWeekYear(_date);\n\n // Round the number of weeks to the nearest integer because the number of\n // milliseconds in a week is not constant (e.g. it's different in the week of\n // the daylight saving time clock shift).\n return Math.round(diff / millisecondsInWeek) + 1;\n}\n\n// Fallback for modularized imports:\nexport default getISOWeek;\n","import { constructFrom } from \"./constructFrom.js\";\nimport { startOfISOWeek } from \"./startOfISOWeek.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getISOWeekYear} function options.\n */\n\n/**\n * @name getISOWeekYear\n * @category ISO Week-Numbering Year Helpers\n * @summary Get the ISO week-numbering year of the given date.\n *\n * @description\n * Get the ISO week-numbering year of the given date,\n * which always starts 3 days before the year's first Thursday.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @param date - The given date\n *\n * @returns The ISO week-numbering year\n *\n * @example\n * // Which ISO-week numbering year is 2 January 2005?\n * const result = getISOWeekYear(new Date(2005, 0, 2))\n * //=> 2004\n */\nexport function getISOWeekYear(date, options) {\n const _date = toDate(date, options?.in);\n const year = _date.getFullYear();\n\n const fourthOfJanuaryOfNextYear = constructFrom(_date, 0);\n fourthOfJanuaryOfNextYear.setFullYear(year + 1, 0, 4);\n fourthOfJanuaryOfNextYear.setHours(0, 0, 0, 0);\n const startOfNextYear = startOfISOWeek(fourthOfJanuaryOfNextYear);\n\n const fourthOfJanuaryOfThisYear = constructFrom(_date, 0);\n fourthOfJanuaryOfThisYear.setFullYear(year, 0, 4);\n fourthOfJanuaryOfThisYear.setHours(0, 0, 0, 0);\n const startOfThisYear = startOfISOWeek(fourthOfJanuaryOfThisYear);\n\n if (_date.getTime() >= startOfNextYear.getTime()) {\n return year + 1;\n } else if (_date.getTime() >= startOfThisYear.getTime()) {\n return year;\n } else {\n return year - 1;\n }\n}\n\n// Fallback for modularized imports:\nexport default getISOWeekYear;\n","import { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { constructFrom } from \"./constructFrom.js\";\nimport { getWeekYear } from \"./getWeekYear.js\";\nimport { startOfWeek } from \"./startOfWeek.js\";\n\n/**\n * The {@link startOfWeekYear} function options.\n */\n\n/**\n * @name startOfWeekYear\n * @category Week-Numbering Year Helpers\n * @summary Return the start of a local week-numbering year for the given date.\n *\n * @description\n * Return the start of a local week-numbering year.\n * The exact calculation depends on the values of\n * `options.weekStartsOn` (which is the index of the first day of the week)\n * and `options.firstWeekContainsDate` (which is the day of January, which is always in\n * the first week of the week-numbering year)\n *\n * Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of a week-numbering year\n *\n * @example\n * // The start of an a week-numbering year for 2 July 2005 with default settings:\n * const result = startOfWeekYear(new Date(2005, 6, 2))\n * //=> Sun Dec 26 2004 00:00:00\n *\n * @example\n * // The start of a week-numbering year for 2 July 2005\n * // if Monday is the first day of week\n * // and 4 January is always in the first week of the year:\n * const result = startOfWeekYear(new Date(2005, 6, 2), {\n * weekStartsOn: 1,\n * firstWeekContainsDate: 4\n * })\n * //=> Mon Jan 03 2005 00:00:00\n */\nexport function startOfWeekYear(date, options) {\n const defaultOptions = getDefaultOptions();\n const firstWeekContainsDate =\n options?.firstWeekContainsDate ??\n options?.locale?.options?.firstWeekContainsDate ??\n defaultOptions.firstWeekContainsDate ??\n defaultOptions.locale?.options?.firstWeekContainsDate ??\n 1;\n\n const year = getWeekYear(date, options);\n const firstWeek = constructFrom(options?.in || date, 0);\n firstWeek.setFullYear(year, 0, firstWeekContainsDate);\n firstWeek.setHours(0, 0, 0, 0);\n const _date = startOfWeek(firstWeek, options);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfWeekYear;\n","import { millisecondsInWeek } from \"./constants.js\";\nimport { startOfWeek } from \"./startOfWeek.js\";\nimport { startOfWeekYear } from \"./startOfWeekYear.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getWeek} function options.\n */\n\n/**\n * @name getWeek\n * @category Week Helpers\n * @summary Get the local week index of the given date.\n *\n * @description\n * Get the local week index of the given date.\n * The exact calculation depends on the values of\n * `options.weekStartsOn` (which is the index of the first day of the week)\n * and `options.firstWeekContainsDate` (which is the day of January, which is always in\n * the first week of the week-numbering year)\n *\n * Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system\n *\n * @param date - The given date\n * @param options - An object with options\n *\n * @returns The week\n *\n * @example\n * // Which week of the local week numbering year is 2 January 2005 with default options?\n * const result = getWeek(new Date(2005, 0, 2))\n * //=> 2\n *\n * @example\n * // Which week of the local week numbering year is 2 January 2005,\n * // if Monday is the first day of the week,\n * // and the first week of the year always contains 4 January?\n * const result = getWeek(new Date(2005, 0, 2), {\n * weekStartsOn: 1,\n * firstWeekContainsDate: 4\n * })\n * //=> 53\n */\nexport function getWeek(date, options) {\n const _date = toDate(date, options?.in);\n const diff = +startOfWeek(_date, options) - +startOfWeekYear(_date, options);\n\n // Round the number of weeks to the nearest integer because the number of\n // milliseconds in a week is not constant (e.g. it's different in the week of\n // the daylight saving time clock shift).\n return Math.round(diff / millisecondsInWeek) + 1;\n}\n\n// Fallback for modularized imports:\nexport default getWeek;\n","import { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { constructFrom } from \"./constructFrom.js\";\nimport { startOfWeek } from \"./startOfWeek.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getWeekYear} function options.\n */\n\n/**\n * @name getWeekYear\n * @category Week-Numbering Year Helpers\n * @summary Get the local week-numbering year of the given date.\n *\n * @description\n * Get the local week-numbering year of the given date.\n * The exact calculation depends on the values of\n * `options.weekStartsOn` (which is the index of the first day of the week)\n * and `options.firstWeekContainsDate` (which is the day of January, which is always in\n * the first week of the week-numbering year)\n *\n * Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system\n *\n * @param date - The given date\n * @param options - An object with options.\n *\n * @returns The local week-numbering year\n *\n * @example\n * // Which week numbering year is 26 December 2004 with the default settings?\n * const result = getWeekYear(new Date(2004, 11, 26))\n * //=> 2005\n *\n * @example\n * // Which week numbering year is 26 December 2004 if week starts on Saturday?\n * const result = getWeekYear(new Date(2004, 11, 26), { weekStartsOn: 6 })\n * //=> 2004\n *\n * @example\n * // Which week numbering year is 26 December 2004 if the first week contains 4 January?\n * const result = getWeekYear(new Date(2004, 11, 26), { firstWeekContainsDate: 4 })\n * //=> 2004\n */\nexport function getWeekYear(date, options) {\n const _date = toDate(date, options?.in);\n const year = _date.getFullYear();\n\n const defaultOptions = getDefaultOptions();\n const firstWeekContainsDate =\n options?.firstWeekContainsDate ??\n options?.locale?.options?.firstWeekContainsDate ??\n defaultOptions.firstWeekContainsDate ??\n defaultOptions.locale?.options?.firstWeekContainsDate ??\n 1;\n\n const firstWeekOfNextYear = constructFrom(options?.in || date, 0);\n firstWeekOfNextYear.setFullYear(year + 1, 0, firstWeekContainsDate);\n firstWeekOfNextYear.setHours(0, 0, 0, 0);\n const startOfNextYear = startOfWeek(firstWeekOfNextYear, options);\n\n const firstWeekOfThisYear = constructFrom(options?.in || date, 0);\n firstWeekOfThisYear.setFullYear(year, 0, firstWeekContainsDate);\n firstWeekOfThisYear.setHours(0, 0, 0, 0);\n const startOfThisYear = startOfWeek(firstWeekOfThisYear, options);\n\n if (+_date >= +startOfNextYear) {\n return year + 1;\n } else if (+_date >= +startOfThisYear) {\n return year;\n } else {\n return year - 1;\n }\n}\n\n// Fallback for modularized imports:\nexport default getWeekYear;\n","/**\n * @name isDate\n * @category Common Helpers\n * @summary Is the given value a date?\n *\n * @description\n * Returns true if the given value is an instance of Date. The function works for dates transferred across iframes.\n *\n * @param value - The value to check\n *\n * @returns True if the given value is a date\n *\n * @example\n * // For a valid date:\n * const result = isDate(new Date())\n * //=> true\n *\n * @example\n * // For an invalid date:\n * const result = isDate(new Date(NaN))\n * //=> true\n *\n * @example\n * // For some value:\n * const result = isDate('2014-02-31')\n * //=> false\n *\n * @example\n * // For an object:\n * const result = isDate({})\n * //=> false\n */\nexport function isDate(value) {\n return (\n value instanceof Date ||\n (typeof value === \"object\" &&\n Object.prototype.toString.call(value) === \"[object Date]\")\n );\n}\n\n// Fallback for modularized imports:\nexport default isDate;\n","import { isDate } from \"./isDate.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * @name isValid\n * @category Common Helpers\n * @summary Is the given date valid?\n *\n * @description\n * Returns false if argument is Invalid Date and true otherwise.\n * Argument is converted to Date using `toDate`. See [toDate](https://date-fns.org/docs/toDate)\n * Invalid Date is a Date, whose time value is NaN.\n *\n * Time value of Date: http://es5.github.io/#x15.9.1.1\n *\n * @param date - The date to check\n *\n * @returns The date is valid\n *\n * @example\n * // For the valid date:\n * const result = isValid(new Date(2014, 1, 31))\n * //=> true\n *\n * @example\n * // For the value, convertible into a date:\n * const result = isValid(1393804800000)\n * //=> true\n *\n * @example\n * // For the invalid date:\n * const result = isValid(new Date(''))\n * //=> false\n */\nexport function isValid(date) {\n return !((!isDate(date) && typeof date !== \"number\") || isNaN(+toDate(date)));\n}\n\n// Fallback for modularized imports:\nexport default isValid;\n","const formatDistanceLocale = {\n lessThanXSeconds: {\n one: \"less than a second\",\n other: \"less than {{count}} seconds\",\n },\n\n xSeconds: {\n one: \"1 second\",\n other: \"{{count}} seconds\",\n },\n\n halfAMinute: \"half a minute\",\n\n lessThanXMinutes: {\n one: \"less than a minute\",\n other: \"less than {{count}} minutes\",\n },\n\n xMinutes: {\n one: \"1 minute\",\n other: \"{{count}} minutes\",\n },\n\n aboutXHours: {\n one: \"about 1 hour\",\n other: \"about {{count}} hours\",\n },\n\n xHours: {\n one: \"1 hour\",\n other: \"{{count}} hours\",\n },\n\n xDays: {\n one: \"1 day\",\n other: \"{{count}} days\",\n },\n\n aboutXWeeks: {\n one: \"about 1 week\",\n other: \"about {{count}} weeks\",\n },\n\n xWeeks: {\n one: \"1 week\",\n other: \"{{count}} weeks\",\n },\n\n aboutXMonths: {\n one: \"about 1 month\",\n other: \"about {{count}} months\",\n },\n\n xMonths: {\n one: \"1 month\",\n other: \"{{count}} months\",\n },\n\n aboutXYears: {\n one: \"about 1 year\",\n other: \"about {{count}} years\",\n },\n\n xYears: {\n one: \"1 year\",\n other: \"{{count}} years\",\n },\n\n overXYears: {\n one: \"over 1 year\",\n other: \"over {{count}} years\",\n },\n\n almostXYears: {\n one: \"almost 1 year\",\n other: \"almost {{count}} years\",\n },\n};\n\nexport const formatDistance = (token, count, options) => {\n let result;\n\n const tokenValue = formatDistanceLocale[token];\n if (typeof tokenValue === \"string\") {\n result = tokenValue;\n } else if (count === 1) {\n result = tokenValue.one;\n } else {\n result = tokenValue.other.replace(\"{{count}}\", count.toString());\n }\n\n if (options?.addSuffix) {\n if (options.comparison && options.comparison > 0) {\n return \"in \" + result;\n } else {\n return result + \" ago\";\n }\n }\n\n return result;\n};\n","export function buildFormatLongFn(args) {\n return (options = {}) => {\n // TODO: Remove String()\n const width = options.width ? String(options.width) : args.defaultWidth;\n const format = args.formats[width] || args.formats[args.defaultWidth];\n return format;\n };\n}\n","import { buildFormatLongFn } from \"../../_lib/buildFormatLongFn.js\";\n\nconst dateFormats = {\n full: \"EEEE, MMMM do, y\",\n long: \"MMMM do, y\",\n medium: \"MMM d, y\",\n short: \"MM/dd/yyyy\",\n};\n\nconst timeFormats = {\n full: \"h:mm:ss a zzzz\",\n long: \"h:mm:ss a z\",\n medium: \"h:mm:ss a\",\n short: \"h:mm a\",\n};\n\nconst dateTimeFormats = {\n full: \"{{date}} 'at' {{time}}\",\n long: \"{{date}} 'at' {{time}}\",\n medium: \"{{date}}, {{time}}\",\n short: \"{{date}}, {{time}}\",\n};\n\nexport const formatLong = {\n date: buildFormatLongFn({\n formats: dateFormats,\n defaultWidth: \"full\",\n }),\n\n time: buildFormatLongFn({\n formats: timeFormats,\n defaultWidth: \"full\",\n }),\n\n dateTime: buildFormatLongFn({\n formats: dateTimeFormats,\n defaultWidth: \"full\",\n }),\n};\n","const formatRelativeLocale = {\n lastWeek: \"'last' eeee 'at' p\",\n yesterday: \"'yesterday at' p\",\n today: \"'today at' p\",\n tomorrow: \"'tomorrow at' p\",\n nextWeek: \"eeee 'at' p\",\n other: \"P\",\n};\n\nexport const formatRelative = (token, _date, _baseDate, _options) =>\n formatRelativeLocale[token];\n","/**\n * The localize function argument callback which allows to convert raw value to\n * the actual type.\n *\n * @param value - The value to convert\n *\n * @returns The converted value\n */\n\n/**\n * The map of localized values for each width.\n */\n\n/**\n * The index type of the locale unit value. It types conversion of units of\n * values that don't start at 0 (i.e. quarters).\n */\n\n/**\n * Converts the unit value to the tuple of values.\n */\n\n/**\n * The tuple of localized era values. The first element represents BC,\n * the second element represents AD.\n */\n\n/**\n * The tuple of localized quarter values. The first element represents Q1.\n */\n\n/**\n * The tuple of localized day values. The first element represents Sunday.\n */\n\n/**\n * The tuple of localized month values. The first element represents January.\n */\n\nexport function buildLocalizeFn(args) {\n return (value, options) => {\n const context = options?.context ? String(options.context) : \"standalone\";\n\n let valuesArray;\n if (context === \"formatting\" && args.formattingValues) {\n const defaultWidth = args.defaultFormattingWidth || args.defaultWidth;\n const width = options?.width ? String(options.width) : defaultWidth;\n\n valuesArray =\n args.formattingValues[width] || args.formattingValues[defaultWidth];\n } else {\n const defaultWidth = args.defaultWidth;\n const width = options?.width ? String(options.width) : args.defaultWidth;\n\n valuesArray = args.values[width] || args.values[defaultWidth];\n }\n const index = args.argumentCallback ? args.argumentCallback(value) : value;\n\n // @ts-expect-error - For some reason TypeScript just don't want to match it, no matter how hard we try. I challenge you to try to remove it!\n return valuesArray[index];\n };\n}\n","import { buildLocalizeFn } from \"../../_lib/buildLocalizeFn.js\";\n\nconst eraValues = {\n narrow: [\"B\", \"A\"],\n abbreviated: [\"BC\", \"AD\"],\n wide: [\"Before Christ\", \"Anno Domini\"],\n};\n\nconst quarterValues = {\n narrow: [\"1\", \"2\", \"3\", \"4\"],\n abbreviated: [\"Q1\", \"Q2\", \"Q3\", \"Q4\"],\n wide: [\"1st quarter\", \"2nd quarter\", \"3rd quarter\", \"4th quarter\"],\n};\n\n// Note: in English, the names of days of the week and months are capitalized.\n// If you are making a new locale based on this one, check if the same is true for the language you're working on.\n// Generally, formatted dates should look like they are in the middle of a sentence,\n// e.g. in Spanish language the weekdays and months should be in the lowercase.\nconst monthValues = {\n narrow: [\"J\", \"F\", \"M\", \"A\", \"M\", \"J\", \"J\", \"A\", \"S\", \"O\", \"N\", \"D\"],\n abbreviated: [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\",\n ],\n\n wide: [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n ],\n};\n\nconst dayValues = {\n narrow: [\"S\", \"M\", \"T\", \"W\", \"T\", \"F\", \"S\"],\n short: [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"],\n abbreviated: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n wide: [\n \"Sunday\",\n \"Monday\",\n \"Tuesday\",\n \"Wednesday\",\n \"Thursday\",\n \"Friday\",\n \"Saturday\",\n ],\n};\n\nconst dayPeriodValues = {\n narrow: {\n am: \"a\",\n pm: \"p\",\n midnight: \"mi\",\n noon: \"n\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n },\n abbreviated: {\n am: \"AM\",\n pm: \"PM\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n },\n wide: {\n am: \"a.m.\",\n pm: \"p.m.\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n },\n};\n\nconst formattingDayPeriodValues = {\n narrow: {\n am: \"a\",\n pm: \"p\",\n midnight: \"mi\",\n noon: \"n\",\n morning: \"in the morning\",\n afternoon: \"in the afternoon\",\n evening: \"in the evening\",\n night: \"at night\",\n },\n abbreviated: {\n am: \"AM\",\n pm: \"PM\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"in the morning\",\n afternoon: \"in the afternoon\",\n evening: \"in the evening\",\n night: \"at night\",\n },\n wide: {\n am: \"a.m.\",\n pm: \"p.m.\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"in the morning\",\n afternoon: \"in the afternoon\",\n evening: \"in the evening\",\n night: \"at night\",\n },\n};\n\nconst ordinalNumber = (dirtyNumber, _options) => {\n const number = Number(dirtyNumber);\n\n // If ordinal numbers depend on context, for example,\n // if they are different for different grammatical genders,\n // use `options.unit`.\n //\n // `unit` can be 'year', 'quarter', 'month', 'week', 'date', 'dayOfYear',\n // 'day', 'hour', 'minute', 'second'.\n\n const rem100 = number % 100;\n if (rem100 > 20 || rem100 < 10) {\n switch (rem100 % 10) {\n case 1:\n return number + \"st\";\n case 2:\n return number + \"nd\";\n case 3:\n return number + \"rd\";\n }\n }\n return number + \"th\";\n};\n\nexport const localize = {\n ordinalNumber,\n\n era: buildLocalizeFn({\n values: eraValues,\n defaultWidth: \"wide\",\n }),\n\n quarter: buildLocalizeFn({\n values: quarterValues,\n defaultWidth: \"wide\",\n argumentCallback: (quarter) => quarter - 1,\n }),\n\n month: buildLocalizeFn({\n values: monthValues,\n defaultWidth: \"wide\",\n }),\n\n day: buildLocalizeFn({\n values: dayValues,\n defaultWidth: \"wide\",\n }),\n\n dayPeriod: buildLocalizeFn({\n values: dayPeriodValues,\n defaultWidth: \"wide\",\n formattingValues: formattingDayPeriodValues,\n defaultFormattingWidth: \"wide\",\n }),\n};\n","export function buildMatchFn(args) {\n return (string, options = {}) => {\n const width = options.width;\n\n const matchPattern =\n (width && args.matchPatterns[width]) ||\n args.matchPatterns[args.defaultMatchWidth];\n const matchResult = string.match(matchPattern);\n\n if (!matchResult) {\n return null;\n }\n const matchedString = matchResult[0];\n\n const parsePatterns =\n (width && args.parsePatterns[width]) ||\n args.parsePatterns[args.defaultParseWidth];\n\n const key = Array.isArray(parsePatterns)\n ? findIndex(parsePatterns, (pattern) => pattern.test(matchedString))\n : // [TODO] -- I challenge you to fix the type\n findKey(parsePatterns, (pattern) => pattern.test(matchedString));\n\n let value;\n\n value = args.valueCallback ? args.valueCallback(key) : key;\n value = options.valueCallback\n ? // [TODO] -- I challenge you to fix the type\n options.valueCallback(value)\n : value;\n\n const rest = string.slice(matchedString.length);\n\n return { value, rest };\n };\n}\n\nfunction findKey(object, predicate) {\n for (const key in object) {\n if (\n Object.prototype.hasOwnProperty.call(object, key) &&\n predicate(object[key])\n ) {\n return key;\n }\n }\n return undefined;\n}\n\nfunction findIndex(array, predicate) {\n for (let key = 0; key < array.length; key++) {\n if (predicate(array[key])) {\n return key;\n }\n }\n return undefined;\n}\n","import { buildMatchFn } from \"../../_lib/buildMatchFn.js\";\nimport { buildMatchPatternFn } from \"../../_lib/buildMatchPatternFn.js\";\n\nconst matchOrdinalNumberPattern = /^(\\d+)(th|st|nd|rd)?/i;\nconst parseOrdinalNumberPattern = /\\d+/i;\n\nconst matchEraPatterns = {\n narrow: /^(b|a)/i,\n abbreviated: /^(b\\.?\\s?c\\.?|b\\.?\\s?c\\.?\\s?e\\.?|a\\.?\\s?d\\.?|c\\.?\\s?e\\.?)/i,\n wide: /^(before christ|before common era|anno domini|common era)/i,\n};\nconst parseEraPatterns = {\n any: [/^b/i, /^(a|c)/i],\n};\n\nconst matchQuarterPatterns = {\n narrow: /^[1234]/i,\n abbreviated: /^q[1234]/i,\n wide: /^[1234](th|st|nd|rd)? quarter/i,\n};\nconst parseQuarterPatterns = {\n any: [/1/i, /2/i, /3/i, /4/i],\n};\n\nconst matchMonthPatterns = {\n narrow: /^[jfmasond]/i,\n abbreviated: /^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,\n wide: /^(january|february|march|april|may|june|july|august|september|october|november|december)/i,\n};\nconst parseMonthPatterns = {\n narrow: [\n /^j/i,\n /^f/i,\n /^m/i,\n /^a/i,\n /^m/i,\n /^j/i,\n /^j/i,\n /^a/i,\n /^s/i,\n /^o/i,\n /^n/i,\n /^d/i,\n ],\n\n any: [\n /^ja/i,\n /^f/i,\n /^mar/i,\n /^ap/i,\n /^may/i,\n /^jun/i,\n /^jul/i,\n /^au/i,\n /^s/i,\n /^o/i,\n /^n/i,\n /^d/i,\n ],\n};\n\nconst matchDayPatterns = {\n narrow: /^[smtwf]/i,\n short: /^(su|mo|tu|we|th|fr|sa)/i,\n abbreviated: /^(sun|mon|tue|wed|thu|fri|sat)/i,\n wide: /^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i,\n};\nconst parseDayPatterns = {\n narrow: [/^s/i, /^m/i, /^t/i, /^w/i, /^t/i, /^f/i, /^s/i],\n any: [/^su/i, /^m/i, /^tu/i, /^w/i, /^th/i, /^f/i, /^sa/i],\n};\n\nconst matchDayPeriodPatterns = {\n narrow: /^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,\n any: /^([ap]\\.?\\s?m\\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i,\n};\nconst parseDayPeriodPatterns = {\n any: {\n am: /^a/i,\n pm: /^p/i,\n midnight: /^mi/i,\n noon: /^no/i,\n morning: /morning/i,\n afternoon: /afternoon/i,\n evening: /evening/i,\n night: /night/i,\n },\n};\n\nexport const match = {\n ordinalNumber: buildMatchPatternFn({\n matchPattern: matchOrdinalNumberPattern,\n parsePattern: parseOrdinalNumberPattern,\n valueCallback: (value) => parseInt(value, 10),\n }),\n\n era: buildMatchFn({\n matchPatterns: matchEraPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseEraPatterns,\n defaultParseWidth: \"any\",\n }),\n\n quarter: buildMatchFn({\n matchPatterns: matchQuarterPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseQuarterPatterns,\n defaultParseWidth: \"any\",\n valueCallback: (index) => index + 1,\n }),\n\n month: buildMatchFn({\n matchPatterns: matchMonthPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseMonthPatterns,\n defaultParseWidth: \"any\",\n }),\n\n day: buildMatchFn({\n matchPatterns: matchDayPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseDayPatterns,\n defaultParseWidth: \"any\",\n }),\n\n dayPeriod: buildMatchFn({\n matchPatterns: matchDayPeriodPatterns,\n defaultMatchWidth: \"any\",\n parsePatterns: parseDayPeriodPatterns,\n defaultParseWidth: \"any\",\n }),\n};\n","export function buildMatchPatternFn(args) {\n return (string, options = {}) => {\n const matchResult = string.match(args.matchPattern);\n if (!matchResult) return null;\n const matchedString = matchResult[0];\n\n const parseResult = string.match(args.parsePattern);\n if (!parseResult) return null;\n let value = args.valueCallback\n ? args.valueCallback(parseResult[0])\n : parseResult[0];\n\n // [TODO] I challenge you to fix the type\n value = options.valueCallback ? options.valueCallback(value) : value;\n\n const rest = string.slice(matchedString.length);\n\n return { value, rest };\n };\n}\n","import { formatDistance } from \"./en-US/_lib/formatDistance.js\";\nimport { formatLong } from \"./en-US/_lib/formatLong.js\";\nimport { formatRelative } from \"./en-US/_lib/formatRelative.js\";\nimport { localize } from \"./en-US/_lib/localize.js\";\nimport { match } from \"./en-US/_lib/match.js\";\n\n/**\n * @category Locales\n * @summary English locale (United States).\n * @language English\n * @iso-639-2 eng\n * @author Sasha Koss [@kossnocorp](https://github.com/kossnocorp)\n * @author Lesha Koss [@leshakoss](https://github.com/leshakoss)\n */\nexport const enUS = {\n code: \"en-US\",\n formatDistance: formatDistance,\n formatLong: formatLong,\n formatRelative: formatRelative,\n localize: localize,\n match: match,\n options: {\n weekStartsOn: 0 /* Sunday */,\n firstWeekContainsDate: 1,\n },\n};\n\n// Fallback for modularized imports:\nexport default enUS;\n","import {\n millisecondsInHour,\n millisecondsInMinute,\n} from \"./constants.js\";\nimport { constructFrom } from \"./constructFrom.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link parseISO} function options.\n */\n\n/**\n * @name parseISO\n * @category Common Helpers\n * @summary Parse ISO string\n *\n * @description\n * Parse the given string in ISO 8601 format and return an instance of Date.\n *\n * Function accepts complete ISO 8601 formats as well as partial implementations.\n * ISO 8601: http://en.wikipedia.org/wiki/ISO_8601\n *\n * If the argument isn't a string, the function cannot parse the string or\n * the values are invalid, it returns Invalid Date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param argument - The value to convert\n * @param options - An object with options\n *\n * @returns The parsed date in the local time zone\n *\n * @example\n * // Convert string '2014-02-11T11:30:30' to date:\n * const result = parseISO('2014-02-11T11:30:30')\n * //=> Tue Feb 11 2014 11:30:30\n *\n * @example\n * // Convert string '+02014101' to date,\n * // if the additional number of digits in the extended year format is 1:\n * const result = parseISO('+02014101', { additionalDigits: 1 })\n * //=> Fri Apr 11 2014 00:00:00\n */\nexport function parseISO(argument, options) {\n const invalidDate = () => constructFrom(options?.in, NaN);\n\n const additionalDigits = options?.additionalDigits ?? 2;\n const dateStrings = splitDateString(argument);\n\n let date;\n if (dateStrings.date) {\n const parseYearResult = parseYear(dateStrings.date, additionalDigits);\n date = parseDate(parseYearResult.restDateString, parseYearResult.year);\n }\n\n if (!date || isNaN(+date)) return invalidDate();\n\n const timestamp = +date;\n let time = 0;\n let offset;\n\n if (dateStrings.time) {\n time = parseTime(dateStrings.time);\n if (isNaN(time)) return invalidDate();\n }\n\n if (dateStrings.timezone) {\n offset = parseTimezone(dateStrings.timezone);\n if (isNaN(offset)) return invalidDate();\n } else {\n const tmpDate = new Date(timestamp + time);\n const result = toDate(0, options?.in);\n result.setFullYear(\n tmpDate.getUTCFullYear(),\n tmpDate.getUTCMonth(),\n tmpDate.getUTCDate(),\n );\n result.setHours(\n tmpDate.getUTCHours(),\n tmpDate.getUTCMinutes(),\n tmpDate.getUTCSeconds(),\n tmpDate.getUTCMilliseconds(),\n );\n return result;\n }\n\n return toDate(timestamp + time + offset, options?.in);\n}\n\nconst patterns = {\n dateTimeDelimiter: /[T ]/,\n timeZoneDelimiter: /[Z ]/i,\n timezone: /([Z+-].*)$/,\n};\n\nconst dateRegex =\n /^-?(?:(\\d{3})|(\\d{2})(?:-?(\\d{2}))?|W(\\d{2})(?:-?(\\d{1}))?|)$/;\nconst timeRegex =\n /^(\\d{2}(?:[.,]\\d*)?)(?::?(\\d{2}(?:[.,]\\d*)?))?(?::?(\\d{2}(?:[.,]\\d*)?))?$/;\nconst timezoneRegex = /^([+-])(\\d{2})(?::?(\\d{2}))?$/;\n\nfunction splitDateString(dateString) {\n const dateStrings = {};\n const array = dateString.split(patterns.dateTimeDelimiter);\n let timeString;\n\n // The regex match should only return at maximum two array elements.\n // [date], [time], or [date, time].\n if (array.length > 2) {\n return dateStrings;\n }\n\n if (/:/.test(array[0])) {\n timeString = array[0];\n } else {\n dateStrings.date = array[0];\n timeString = array[1];\n if (patterns.timeZoneDelimiter.test(dateStrings.date)) {\n dateStrings.date = dateString.split(patterns.timeZoneDelimiter)[0];\n timeString = dateString.substr(\n dateStrings.date.length,\n dateString.length,\n );\n }\n }\n\n if (timeString) {\n const token = patterns.timezone.exec(timeString);\n if (token) {\n dateStrings.time = timeString.replace(token[1], \"\");\n dateStrings.timezone = token[1];\n } else {\n dateStrings.time = timeString;\n }\n }\n\n return dateStrings;\n}\n\nfunction parseYear(dateString, additionalDigits) {\n const regex = new RegExp(\n \"^(?:(\\\\d{4}|[+-]\\\\d{\" +\n (4 + additionalDigits) +\n \"})|(\\\\d{2}|[+-]\\\\d{\" +\n (2 + additionalDigits) +\n \"})$)\",\n );\n\n const captures = dateString.match(regex);\n // Invalid ISO-formatted year\n if (!captures) return { year: NaN, restDateString: \"\" };\n\n const year = captures[1] ? parseInt(captures[1]) : null;\n const century = captures[2] ? parseInt(captures[2]) : null;\n\n // either year or century is null, not both\n return {\n year: century === null ? year : century * 100,\n restDateString: dateString.slice((captures[1] || captures[2]).length),\n };\n}\n\nfunction parseDate(dateString, year) {\n // Invalid ISO-formatted year\n if (year === null) return new Date(NaN);\n\n const captures = dateString.match(dateRegex);\n // Invalid ISO-formatted string\n if (!captures) return new Date(NaN);\n\n const isWeekDate = !!captures[4];\n const dayOfYear = parseDateUnit(captures[1]);\n const month = parseDateUnit(captures[2]) - 1;\n const day = parseDateUnit(captures[3]);\n const week = parseDateUnit(captures[4]);\n const dayOfWeek = parseDateUnit(captures[5]) - 1;\n\n if (isWeekDate) {\n if (!validateWeekDate(year, week, dayOfWeek)) {\n return new Date(NaN);\n }\n return dayOfISOWeekYear(year, week, dayOfWeek);\n } else {\n const date = new Date(0);\n if (\n !validateDate(year, month, day) ||\n !validateDayOfYearDate(year, dayOfYear)\n ) {\n return new Date(NaN);\n }\n date.setUTCFullYear(year, month, Math.max(dayOfYear, day));\n return date;\n }\n}\n\nfunction parseDateUnit(value) {\n return value ? parseInt(value) : 1;\n}\n\nfunction parseTime(timeString) {\n const captures = timeString.match(timeRegex);\n if (!captures) return NaN; // Invalid ISO-formatted time\n\n const hours = parseTimeUnit(captures[1]);\n const minutes = parseTimeUnit(captures[2]);\n const seconds = parseTimeUnit(captures[3]);\n\n if (!validateTime(hours, minutes, seconds)) {\n return NaN;\n }\n\n return (\n hours * millisecondsInHour + minutes * millisecondsInMinute + seconds * 1000\n );\n}\n\nfunction parseTimeUnit(value) {\n return (value && parseFloat(value.replace(\",\", \".\"))) || 0;\n}\n\nfunction parseTimezone(timezoneString) {\n if (timezoneString === \"Z\") return 0;\n\n const captures = timezoneString.match(timezoneRegex);\n if (!captures) return 0;\n\n const sign = captures[1] === \"+\" ? -1 : 1;\n const hours = parseInt(captures[2]);\n const minutes = (captures[3] && parseInt(captures[3])) || 0;\n\n if (!validateTimezone(hours, minutes)) {\n return NaN;\n }\n\n return sign * (hours * millisecondsInHour + minutes * millisecondsInMinute);\n}\n\nfunction dayOfISOWeekYear(isoWeekYear, week, day) {\n const date = new Date(0);\n date.setUTCFullYear(isoWeekYear, 0, 4);\n const fourthOfJanuaryDay = date.getUTCDay() || 7;\n const diff = (week - 1) * 7 + day + 1 - fourthOfJanuaryDay;\n date.setUTCDate(date.getUTCDate() + diff);\n return date;\n}\n\n// Validation functions\n\n// February is null to handle the leap year (using ||)\nconst daysInMonths = [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n\nfunction isLeapYearIndex(year) {\n return year % 400 === 0 || (year % 4 === 0 && year % 100 !== 0);\n}\n\nfunction validateDate(year, month, date) {\n return (\n month >= 0 &&\n month <= 11 &&\n date >= 1 &&\n date <= (daysInMonths[month] || (isLeapYearIndex(year) ? 29 : 28))\n );\n}\n\nfunction validateDayOfYearDate(year, dayOfYear) {\n return dayOfYear >= 1 && dayOfYear <= (isLeapYearIndex(year) ? 366 : 365);\n}\n\nfunction validateWeekDate(_year, week, day) {\n return week >= 1 && week <= 53 && day >= 0 && day <= 6;\n}\n\nfunction validateTime(hours, minutes, seconds) {\n if (hours === 24) {\n return minutes === 0 && seconds === 0;\n }\n\n return (\n seconds >= 0 &&\n seconds < 60 &&\n minutes >= 0 &&\n minutes < 60 &&\n hours >= 0 &&\n hours < 25\n );\n}\n\nfunction validateTimezone(_hours, minutes) {\n return minutes >= 0 && minutes <= 59;\n}\n\n// Fallback for modularized imports:\nexport default parseISO;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link startOfDay} function options.\n */\n\n/**\n * @name startOfDay\n * @category Day Helpers\n * @summary Return the start of a day for the given date.\n *\n * @description\n * Return the start of a day for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - The options\n *\n * @returns The start of a day\n *\n * @example\n * // The start of a day for 2 September 2014 11:55:00:\n * const result = startOfDay(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Tue Sep 02 2014 00:00:00\n */\nexport function startOfDay(date, options) {\n const _date = toDate(date, options?.in);\n _date.setHours(0, 0, 0, 0);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfDay;\n","import { startOfWeek } from \"./startOfWeek.js\";\n\n/**\n * The {@link startOfISOWeek} function options.\n */\n\n/**\n * @name startOfISOWeek\n * @category ISO Week Helpers\n * @summary Return the start of an ISO week for the given date.\n *\n * @description\n * Return the start of an ISO week for the given date.\n * The result will be in the local timezone.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of an ISO week\n *\n * @example\n * // The start of an ISO week for 2 September 2014 11:55:00:\n * const result = startOfISOWeek(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Mon Sep 01 2014 00:00:00\n */\nexport function startOfISOWeek(date, options) {\n return startOfWeek(date, { ...options, weekStartsOn: 1 });\n}\n\n// Fallback for modularized imports:\nexport default startOfISOWeek;\n","import { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link startOfWeek} function options.\n */\n\n/**\n * @name startOfWeek\n * @category Week Helpers\n * @summary Return the start of a week for the given date.\n *\n * @description\n * Return the start of a week for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of a week\n *\n * @example\n * // The start of a week for 2 September 2014 11:55:00:\n * const result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Sun Aug 31 2014 00:00:00\n *\n * @example\n * // If the week starts on Monday, the start of the week for 2 September 2014 11:55:00:\n * const result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0), { weekStartsOn: 1 })\n * //=> Mon Sep 01 2014 00:00:00\n */\nexport function startOfWeek(date, options) {\n const defaultOptions = getDefaultOptions();\n const weekStartsOn =\n options?.weekStartsOn ??\n options?.locale?.options?.weekStartsOn ??\n defaultOptions.weekStartsOn ??\n defaultOptions.locale?.options?.weekStartsOn ??\n 0;\n\n const _date = toDate(date, options?.in);\n const day = _date.getDay();\n const diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn;\n\n _date.setDate(_date.getDate() - diff);\n _date.setHours(0, 0, 0, 0);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfWeek;\n","import { constructFrom } from \"./constructFrom.js\";\n\n/**\n * @name toDate\n * @category Common Helpers\n * @summary Convert the given argument to an instance of Date.\n *\n * @description\n * Convert the given argument to an instance of Date.\n *\n * If the argument is an instance of Date, the function returns its clone.\n *\n * If the argument is a number, it is treated as a timestamp.\n *\n * If the argument is none of the above, the function returns Invalid Date.\n *\n * Starting from v3.7.0, it clones a date using `[Symbol.for(\"constructDateFrom\")]`\n * enabling to transfer extra properties from the reference date to the new date.\n * It's useful for extensions like [`TZDate`](https://github.com/date-fns/tz)\n * that accept a time zone as a constructor argument.\n *\n * **Note**: *all* Date arguments passed to any *date-fns* function is processed by `toDate`.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param argument - The value to convert\n *\n * @returns The parsed date in the local time zone\n *\n * @example\n * // Clone the date:\n * const result = toDate(new Date(2014, 1, 11, 11, 30, 30))\n * //=> Tue Feb 11 2014 11:30:30\n *\n * @example\n * // Convert the timestamp to date:\n * const result = toDate(1392098430000)\n * //=> Tue Feb 11 2014 11:30:30\n */\nexport function toDate(argument, context) {\n // [TODO] Get rid of `toDate` or `constructFrom`?\n return constructFrom(context || argument, argument);\n}\n\n// Fallback for modularized imports:\nexport default toDate;\n","'use strict';\n\n// eslint-disable-next-line no-extra-parens, no-empty-function\nconst cached = /** @type {GeneratorFunctionConstructor} */ (function* () {}.constructor);\n\n/** @type {import('.')} */\nmodule.exports = () => cached;\n\n","import _concat from \"./internal/_concat.js\";\nimport _curry2 from \"./internal/_curry2.js\";\n\n/**\n * Returns a new list containing the contents of the given list, followed by\n * the given element.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig a -> [a] -> [a]\n * @param {*} el The element to add to the end of the new list.\n * @param {Array} list The list of elements to add a new item to.\n * list.\n * @return {Array} A new list containing the elements of the old list followed by `el`.\n * @see R.prepend\n * @example\n *\n * R.append('tests', ['write', 'more']); //=> ['write', 'more', 'tests']\n * R.append('tests', []); //=> ['tests']\n * R.append(['tests'], ['write', 'more']); //=> ['write', 'more', ['tests']]\n */\nvar append = /*#__PURE__*/_curry2(function append(el, list) {\n return _concat(list, [el]);\n});\nexport default append;","/**\n * Private `concat` function to merge two array-like objects.\n *\n * @private\n * @param {Array|Arguments} [set1=[]] An array-like object.\n * @param {Array|Arguments} [set2=[]] An array-like object.\n * @return {Array} A new, merged array.\n * @example\n *\n * _concat([4, 5, 6], [1, 2, 3]); //=> [4, 5, 6, 1, 2, 3]\n */\nexport default function _concat(set1, set2) {\n set1 = set1 || [];\n set2 = set2 || [];\n var idx;\n var len1 = set1.length;\n var len2 = set2.length;\n var result = [];\n idx = 0;\n while (idx < len1) {\n result[result.length] = set1[idx];\n idx += 1;\n }\n idx = 0;\n while (idx < len2) {\n result[result.length] = set2[idx];\n idx += 1;\n }\n return result;\n}","import _curry2 from \"./internal/_curry2.js\";\nimport _isArray from \"./internal/_isArray.js\";\nimport _isFunction from \"./internal/_isFunction.js\";\nimport _isString from \"./internal/_isString.js\";\nimport toString from \"./toString.js\";\n\n/**\n * Returns the result of concatenating the given lists or strings.\n *\n * Note: `R.concat` expects both arguments to be of the same type,\n * unlike the native `Array.prototype.concat` method. It will throw\n * an error if you `concat` an Array with a non-Array value.\n *\n * Dispatches to the `concat` method of the first argument, if present.\n * Can also concatenate two members of a [fantasy-land\n * compatible semigroup](https://github.com/fantasyland/fantasy-land#semigroup).\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig [a] -> [a] -> [a]\n * @sig String -> String -> String\n * @param {Array|String} firstList The first list\n * @param {Array|String} secondList The second list\n * @return {Array|String} A list consisting of the elements of `firstList` followed by the elements of\n * `secondList`.\n *\n * @example\n *\n * R.concat('ABC', 'DEF'); // 'ABCDEF'\n * R.concat([4, 5, 6], [1, 2, 3]); //=> [4, 5, 6, 1, 2, 3]\n * R.concat([], []); //=> []\n */\nvar concat = /*#__PURE__*/_curry2(function concat(a, b) {\n if (_isArray(a)) {\n if (_isArray(b)) {\n return a.concat(b);\n }\n throw new TypeError(toString(b) + ' is not an array');\n }\n if (_isString(a)) {\n if (_isString(b)) {\n return a + b;\n }\n throw new TypeError(toString(b) + ' is not a string');\n }\n if (a != null && _isFunction(a['fantasy-land/concat'])) {\n return a['fantasy-land/concat'](b);\n }\n if (a != null && _isFunction(a.concat)) {\n return a.concat(b);\n }\n throw new TypeError(toString(a) + ' does not have a method named \"concat\" or \"fantasy-land/concat\"');\n});\nexport default concat;","export default function _arrayFromIterator(iter) {\n var list = [];\n var next;\n while (!(next = iter.next()).done) {\n list.push(next.value);\n }\n return list;\n}","export default function _includesWith(pred, x, list) {\n var idx = 0;\n var len = list.length;\n while (idx < len) {\n if (pred(x, list[idx])) {\n return true;\n }\n idx += 1;\n }\n return false;\n}","// Based on https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\nfunction _objectIs(a, b) {\n // SameValue algorithm\n if (a === b) {\n // Steps 1-5, 7-10\n // Steps 6.b-6.e: +0 != -0\n return a !== 0 || 1 / a === 1 / b;\n } else {\n // Step 6.a: NaN == NaN\n return a !== a && b !== b;\n }\n}\nexport default typeof Object.is === 'function' ? Object.is : _objectIs;","import _arrayFromIterator from \"./_arrayFromIterator.js\";\nimport _includesWith from \"./_includesWith.js\";\nimport _functionName from \"./_functionName.js\";\nimport _has from \"./_has.js\";\nimport _objectIs from \"./_objectIs.js\";\nimport keys from \"../keys.js\";\nimport type from \"../type.js\";\n\n/**\n * private _uniqContentEquals function.\n * That function is checking equality of 2 iterator contents with 2 assumptions\n * - iterators lengths are the same\n * - iterators values are unique\n *\n * false-positive result will be returned for comparison of, e.g.\n * - [1,2,3] and [1,2,3,4]\n * - [1,1,1] and [1,2,3]\n * */\n\nfunction _uniqContentEquals(aIterator, bIterator, stackA, stackB) {\n var a = _arrayFromIterator(aIterator);\n var b = _arrayFromIterator(bIterator);\n function eq(_a, _b) {\n return _equals(_a, _b, stackA.slice(), stackB.slice());\n }\n\n // if *a* array contains any element that is not included in *b*\n return !_includesWith(function (b, aItem) {\n return !_includesWith(eq, aItem, b);\n }, b, a);\n}\nexport default function _equals(a, b, stackA, stackB) {\n if (_objectIs(a, b)) {\n return true;\n }\n var typeA = type(a);\n if (typeA !== type(b)) {\n return false;\n }\n if (typeof a['fantasy-land/equals'] === 'function' || typeof b['fantasy-land/equals'] === 'function') {\n return typeof a['fantasy-land/equals'] === 'function' && a['fantasy-land/equals'](b) && typeof b['fantasy-land/equals'] === 'function' && b['fantasy-land/equals'](a);\n }\n if (typeof a.equals === 'function' || typeof b.equals === 'function') {\n return typeof a.equals === 'function' && a.equals(b) && typeof b.equals === 'function' && b.equals(a);\n }\n switch (typeA) {\n case 'Arguments':\n case 'Array':\n case 'Object':\n if (typeof a.constructor === 'function' && _functionName(a.constructor) === 'Promise') {\n return a === b;\n }\n break;\n case 'Boolean':\n case 'Number':\n case 'String':\n if (!(typeof a === typeof b && _objectIs(a.valueOf(), b.valueOf()))) {\n return false;\n }\n break;\n case 'Date':\n if (!_objectIs(a.valueOf(), b.valueOf())) {\n return false;\n }\n break;\n case 'Error':\n return a.name === b.name && a.message === b.message;\n case 'RegExp':\n if (!(a.source === b.source && a.global === b.global && a.ignoreCase === b.ignoreCase && a.multiline === b.multiline && a.sticky === b.sticky && a.unicode === b.unicode)) {\n return false;\n }\n break;\n }\n var idx = stackA.length - 1;\n while (idx >= 0) {\n if (stackA[idx] === a) {\n return stackB[idx] === b;\n }\n idx -= 1;\n }\n switch (typeA) {\n case 'Map':\n if (a.size !== b.size) {\n return false;\n }\n return _uniqContentEquals(a.entries(), b.entries(), stackA.concat([a]), stackB.concat([b]));\n case 'Set':\n if (a.size !== b.size) {\n return false;\n }\n return _uniqContentEquals(a.values(), b.values(), stackA.concat([a]), stackB.concat([b]));\n case 'Arguments':\n case 'Array':\n case 'Object':\n case 'Boolean':\n case 'Number':\n case 'String':\n case 'Date':\n case 'Error':\n case 'RegExp':\n case 'Int8Array':\n case 'Uint8Array':\n case 'Uint8ClampedArray':\n case 'Int16Array':\n case 'Uint16Array':\n case 'Int32Array':\n case 'Uint32Array':\n case 'Float32Array':\n case 'Float64Array':\n case 'ArrayBuffer':\n break;\n default:\n // Values of other types are only equal if identical.\n return false;\n }\n var keysA = keys(a);\n if (keysA.length !== keys(b).length) {\n return false;\n }\n var extendedStackA = stackA.concat([a]);\n var extendedStackB = stackB.concat([b]);\n idx = keysA.length - 1;\n while (idx >= 0) {\n var key = keysA[idx];\n if (!(_has(key, b) && _equals(b[key], a[key], extendedStackA, extendedStackB))) {\n return false;\n }\n idx -= 1;\n }\n return true;\n}","export default function _functionName(f) {\n // String(x => x) evaluates to \"x => x\", so the pattern may not match.\n var match = String(f).match(/^function (\\w*)/);\n return match == null ? '' : match[1];\n}","import _curry2 from \"./internal/_curry2.js\";\nimport _equals from \"./internal/_equals.js\";\n\n/**\n * Returns `true` if its arguments are equivalent, `false` otherwise. Handles\n * cyclical data structures.\n *\n * Dispatches symmetrically to the `equals` methods of both arguments, if\n * present.\n *\n * @func\n * @memberOf R\n * @since v0.15.0\n * @category Relation\n * @sig a -> b -> Boolean\n * @param {*} a\n * @param {*} b\n * @return {Boolean}\n * @example\n *\n * R.equals(1, 1); //=> true\n * R.equals(1, '1'); //=> false\n * R.equals([1, 2, 3], [1, 2, 3]); //=> true\n *\n * const a = {}; a.v = a;\n * const b = {}; b.v = b;\n * R.equals(a, b); //=> true\n */\nvar equals = /*#__PURE__*/_curry2(function equals(a, b) {\n return _equals(a, b, [], []);\n});\nexport default equals;","import _xfBase from \"./_xfBase.js\";\nvar XFilter = /*#__PURE__*/function () {\n function XFilter(f, xf) {\n this.xf = xf;\n this.f = f;\n }\n XFilter.prototype['@@transducer/init'] = _xfBase.init;\n XFilter.prototype['@@transducer/result'] = _xfBase.result;\n XFilter.prototype['@@transducer/step'] = function (result, input) {\n return this.f(input) ? this.xf['@@transducer/step'](result, input) : result;\n };\n return XFilter;\n}();\nexport default function _xfilter(f) {\n return function (xf) {\n return new XFilter(f, xf);\n };\n}","import _arrayReduce from \"./internal/_arrayReduce.js\";\nimport _curry2 from \"./internal/_curry2.js\";\nimport _dispatchable from \"./internal/_dispatchable.js\";\nimport _filter from \"./internal/_filter.js\";\nimport _filterMap from \"./internal/_filterMap.js\";\nimport _isMap from \"./internal/_isMap.js\";\nimport _isObject from \"./internal/_isObject.js\";\nimport _xfilter from \"./internal/_xfilter.js\";\nimport keys from \"./keys.js\";\n\n/**\n * Takes a predicate and a `Filterable`, and returns a new filterable of the\n * same type containing the members of the given filterable which satisfy the\n * given predicate. Filterable objects include plain objects, Maps, or any object\n * that has a filter method such as `Array`.\n *\n * Dispatches to the `filter` method of the second argument, if present.\n *\n * Acts as a transducer if a transformer is given in list position.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @category Object\n * @sig Filterable f => (a -> Boolean) -> f a -> f a\n * @param {Function} pred\n * @param {Array} filterable\n * @return {Array} Filterable\n * @see R.reject, R.transduce, R.addIndex\n * @example\n *\n * const isEven = n => n % 2 === 0;\n *\n * R.filter(isEven, [1, 2, 3, 4]); //=> [2, 4]\n *\n * R.filter(isEven, {a: 1, b: 2, c: 3, d: 4}); //=> {b: 2, d: 4}\n */\nvar filter = /*#__PURE__*/_curry2( /*#__PURE__*/_dispatchable(['fantasy-land/filter', 'filter'], _xfilter, function (pred, filterable) {\n return _isObject(filterable) ? _arrayReduce(function (acc, key) {\n if (pred(filterable[key])) {\n acc[key] = filterable[key];\n }\n return acc;\n }, {}, keys(filterable)) : _isMap(filterable) ? _filterMap(pred, filterable) :\n // else\n _filter(pred, filterable);\n}));\nexport default filter;","export default function _arrayReduce(reducer, acc, list) {\n var index = 0;\n var length = list.length;\n while (index < length) {\n acc = reducer(acc, list[index]);\n index += 1;\n }\n return acc;\n}","export default function _isMap(x) {\n return Object.prototype.toString.call(x) === '[object Map]';\n}","export default function _filterMap(fn, map) {\n var result = new Map();\n var iterator = map.entries();\n var current = iterator.next();\n while (!current.done) {\n if (fn(current.value[1])) {\n result.set(current.value[0], current.value[1]);\n }\n current = iterator.next();\n }\n return result;\n}","export default function _filter(fn, list) {\n var idx = 0;\n var len = list.length;\n var result = [];\n while (idx < len) {\n if (fn(list[idx])) {\n result[result.length] = list[idx];\n }\n idx += 1;\n }\n return result;\n}","import _curry2 from \"./internal/_curry2.js\";\nimport _has from \"./internal/_has.js\";\nimport isNil from \"./isNil.js\";\n\n/**\n * Returns whether or not a path exists in an object. Only the object's\n * own properties are checked.\n *\n * @func\n * @memberOf R\n * @since v0.26.0\n * @category Object\n * @typedefn Idx = String | Int | Symbol\n * @sig [Idx] -> {a} -> Boolean\n * @param {Array} path The path to use.\n * @param {Object} obj The object to check the path in.\n * @return {Boolean} Whether the path exists.\n * @see R.has\n * @example\n *\n * R.hasPath(['a', 'b'], {a: {b: 2}}); // => true\n * R.hasPath(['a', 'b'], {a: {b: undefined}}); // => true\n * R.hasPath(['a', 'b'], {a: {c: 2}}); // => false\n * R.hasPath(['a', 'b'], {}); // => false\n */\nvar hasPath = /*#__PURE__*/_curry2(function hasPath(_path, obj) {\n if (_path.length === 0 || isNil(obj)) {\n return false;\n }\n var val = obj;\n var idx = 0;\n while (idx < _path.length) {\n if (!isNil(val) && _has(_path[idx], val)) {\n val = val[_path[idx]];\n idx += 1;\n } else {\n return false;\n }\n }\n return true;\n});\nexport default hasPath;","import _curry2 from \"./internal/_curry2.js\";\nimport hasPath from \"./hasPath.js\";\n\n/**\n * Returns whether or not an object has an own property with the specified name\n *\n * @func\n * @memberOf R\n * @since v0.7.0\n * @category Object\n * @sig s -> {s: x} -> Boolean\n * @param {String} prop The name of the property to check for.\n * @param {Object} obj The object to query.\n * @return {Boolean} Whether the property exists.\n * @example\n *\n * const hasName = R.has('name');\n * hasName({name: 'alice'}); //=> true\n * hasName({name: 'bob'}); //=> true\n * hasName({}); //=> false\n *\n * const point = {x: 0, y: 0};\n * const pointHas = R.has(R.__, point);\n * pointHas('x'); //=> true\n * pointHas('y'); //=> true\n * pointHas('z'); //=> false\n */\nvar has = /*#__PURE__*/_curry2(function has(prop, obj) {\n return hasPath([prop], obj);\n});\nexport default has;","import _includes from \"./internal/_includes.js\";\nimport _curry2 from \"./internal/_curry2.js\";\n\n/**\n * Returns `true` if the specified value is equal, in [`R.equals`](#equals)\n * terms, to at least one element of the given list; `false` otherwise.\n * Also works with strings.\n *\n * @func\n * @memberOf R\n * @since v0.26.0\n * @category List\n * @sig a -> [a] -> Boolean\n * @param {Object} a The item to compare against.\n * @param {Array} list The array to consider.\n * @return {Boolean} `true` if an equivalent item is in the list, `false` otherwise.\n * @see R.any\n * @example\n *\n * R.includes(3, [1, 2, 3]); //=> true\n * R.includes(4, [1, 2, 3]); //=> false\n * R.includes({ name: 'Fred' }, [{ name: 'Fred' }]); //=> true\n * R.includes([42], [[42]]); //=> true\n * R.includes('ba', 'banana'); //=>true\n */\nvar includes = /*#__PURE__*/_curry2(_includes);\nexport default includes;","import _isPlaceholder from \"./_isPlaceholder.js\";\n\n/**\n * Optimized internal one-arity curry function.\n *\n * @private\n * @category Function\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */\nexport default function _curry1(fn) {\n return function f1(a) {\n if (arguments.length === 0 || _isPlaceholder(a)) {\n return f1;\n } else {\n return fn.apply(this, arguments);\n }\n };\n}","import _curry1 from \"./_curry1.js\";\nimport _isPlaceholder from \"./_isPlaceholder.js\";\n\n/**\n * Optimized internal two-arity curry function.\n *\n * @private\n * @category Function\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */\nexport default function _curry2(fn) {\n return function f2(a, b) {\n switch (arguments.length) {\n case 0:\n return f2;\n case 1:\n return _isPlaceholder(a) ? f2 : _curry1(function (_b) {\n return fn(a, _b);\n });\n default:\n return _isPlaceholder(a) && _isPlaceholder(b) ? f2 : _isPlaceholder(a) ? _curry1(function (_a) {\n return fn(_a, b);\n }) : _isPlaceholder(b) ? _curry1(function (_b) {\n return fn(a, _b);\n }) : fn(a, b);\n }\n };\n}","import _isArray from \"./_isArray.js\";\nimport _isTransformer from \"./_isTransformer.js\";\n\n/**\n * Returns a function that dispatches with different strategies based on the\n * object in list position (last argument). If it is an array, executes [fn].\n * Otherwise, if it has a function with one of the given method names, it will\n * execute that function (functor case). Otherwise, if it is a transformer,\n * uses transducer created by [transducerCreator] to return a new transformer\n * (transducer case).\n * Otherwise, it will default to executing [fn].\n *\n * @private\n * @param {Array} methodNames properties to check for a custom implementation\n * @param {Function} transducerCreator transducer factory if object is transformer\n * @param {Function} fn default ramda implementation\n * @return {Function} A function that dispatches on object in list position\n */\nexport default function _dispatchable(methodNames, transducerCreator, fn) {\n return function () {\n if (arguments.length === 0) {\n return fn();\n }\n var obj = arguments[arguments.length - 1];\n if (!_isArray(obj)) {\n var idx = 0;\n while (idx < methodNames.length) {\n if (typeof obj[methodNames[idx]] === 'function') {\n return obj[methodNames[idx]].apply(obj, Array.prototype.slice.call(arguments, 0, -1));\n }\n idx += 1;\n }\n if (_isTransformer(obj)) {\n var transducer = transducerCreator.apply(null, Array.prototype.slice.call(arguments, 0, -1));\n return transducer(obj);\n }\n }\n return fn.apply(this, arguments);\n };\n}","export default function _isTransformer(obj) {\n return obj != null && typeof obj['@@transducer/step'] === 'function';\n}","export default function _has(prop, obj) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}","import _indexOf from \"./_indexOf.js\";\nexport default function _includes(a, list) {\n return _indexOf(list, a, 0) >= 0;\n}","import equals from \"../equals.js\";\nexport default function _indexOf(list, a, idx) {\n var inf, item;\n // Array.prototype.indexOf doesn't exist below IE9\n if (typeof list.indexOf === 'function') {\n switch (typeof a) {\n case 'number':\n if (a === 0) {\n // manually crawl the list to distinguish between +0 and -0\n inf = 1 / a;\n while (idx < list.length) {\n item = list[idx];\n if (item === 0 && 1 / item === inf) {\n return idx;\n }\n idx += 1;\n }\n return -1;\n } else if (a !== a) {\n // NaN\n while (idx < list.length) {\n item = list[idx];\n if (typeof item === 'number' && item !== item) {\n return idx;\n }\n idx += 1;\n }\n return -1;\n }\n // non-zero numbers can utilise Set\n return list.indexOf(a, idx);\n\n // all these types can utilise Set\n case 'string':\n case 'boolean':\n case 'function':\n case 'undefined':\n return list.indexOf(a, idx);\n case 'object':\n if (a === null) {\n // null can utilise Set\n return list.indexOf(a, idx);\n }\n }\n }\n // anything else not covered above, defer to R.equals\n while (idx < list.length) {\n if (equals(list[idx], a)) {\n return idx;\n }\n idx += 1;\n }\n return -1;\n}","import _has from \"./_has.js\";\nvar toString = Object.prototype.toString;\nvar _isArguments = /*#__PURE__*/function () {\n return toString.call(arguments) === '[object Arguments]' ? function _isArguments(x) {\n return toString.call(x) === '[object Arguments]';\n } : function _isArguments(x) {\n return _has('callee', x);\n };\n}();\nexport default _isArguments;","/**\n * Tests whether or not an object is an array.\n *\n * @private\n * @param {*} val The object to test.\n * @return {Boolean} `true` if `val` is an array, `false` otherwise.\n * @example\n *\n * _isArray([]); //=> true\n * _isArray(null); //=> false\n * _isArray({}); //=> false\n */\nexport default Array.isArray || function _isArray(val) {\n return val != null && val.length >= 0 && Object.prototype.toString.call(val) === '[object Array]';\n};","export default function _isFunction(x) {\n var type = Object.prototype.toString.call(x);\n return type === '[object Function]' || type === '[object AsyncFunction]' || type === '[object GeneratorFunction]' || type === '[object AsyncGeneratorFunction]';\n}","export default function _isObject(x) {\n return Object.prototype.toString.call(x) === '[object Object]';\n}","export default function _isPlaceholder(a) {\n return a != null && typeof a === 'object' && a['@@functional/placeholder'] === true;\n}","export default function _isString(x) {\n return Object.prototype.toString.call(x) === '[object String]';\n}","export default {\n init: function () {\n return this.xf['@@transducer/init']();\n },\n result: function (result) {\n return this.xf['@@transducer/result'](result);\n }\n};","import _curry1 from \"./internal/_curry1.js\";\n\n/**\n * Checks if the input value is `null` or `undefined`.\n *\n * @func\n * @memberOf R\n * @since v0.9.0\n * @category Type\n * @sig * -> Boolean\n * @param {*} x The value to test.\n * @return {Boolean} `true` if `x` is `undefined` or `null`, otherwise `false`.\n * @example\n *\n * R.isNil(null); //=> true\n * R.isNil(undefined); //=> true\n * R.isNil(0); //=> false\n * R.isNil([]); //=> false\n */\nvar isNil = /*#__PURE__*/_curry1(function isNil(x) {\n return x == null;\n});\nexport default isNil;","import _curry1 from \"./internal/_curry1.js\";\nimport _has from \"./internal/_has.js\";\nimport _isArguments from \"./internal/_isArguments.js\";\n\n// cover IE < 9 keys issues\nvar hasEnumBug = ! /*#__PURE__*/{\n toString: null\n}.propertyIsEnumerable('toString');\nvar nonEnumerableProps = ['constructor', 'valueOf', 'isPrototypeOf', 'toString', 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];\n// Safari bug\nvar hasArgsEnumBug = /*#__PURE__*/function () {\n 'use strict';\n\n return arguments.propertyIsEnumerable('length');\n}();\nvar contains = function contains(list, item) {\n var idx = 0;\n while (idx < list.length) {\n if (list[idx] === item) {\n return true;\n }\n idx += 1;\n }\n return false;\n};\n\n/**\n * Returns a list containing the names of all the enumerable own properties of\n * the supplied object.\n * Note that the order of the output array is not guaranteed to be consistent\n * across different JS platforms.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category Object\n * @sig {k: v} -> [k]\n * @param {Object} obj The object to extract properties from\n * @return {Array} An array of the object's own properties.\n * @see R.keysIn, R.values, R.toPairs\n * @example\n *\n * R.keys({a: 1, b: 2, c: 3}); //=> ['a', 'b', 'c']\n */\nvar keys = typeof Object.keys === 'function' && !hasArgsEnumBug ? /*#__PURE__*/_curry1(function keys(obj) {\n return Object(obj) !== obj ? [] : Object.keys(obj);\n}) : /*#__PURE__*/_curry1(function keys(obj) {\n if (Object(obj) !== obj) {\n return [];\n }\n var prop, nIdx;\n var ks = [];\n var checkArgsLength = hasArgsEnumBug && _isArguments(obj);\n for (prop in obj) {\n if (_has(prop, obj) && (!checkArgsLength || prop !== 'length')) {\n ks[ks.length] = prop;\n }\n }\n if (hasEnumBug) {\n nIdx = nonEnumerableProps.length - 1;\n while (nIdx >= 0) {\n prop = nonEnumerableProps[nIdx];\n if (_has(prop, obj) && !contains(ks, prop)) {\n ks[ks.length] = prop;\n }\n nIdx -= 1;\n }\n }\n return ks;\n});\nexport default keys;","import _curry2 from \"./internal/_curry2.js\";\n\n/**\n * Returns a partial copy of an object omitting the keys specified.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category Object\n * @sig [String] -> {String: *} -> {String: *}\n * @param {Array} names an array of String property names to omit from the new object\n * @param {Object} obj The object to copy from\n * @return {Object} A new object with properties from `names` not on it.\n * @see R.pick\n * @example\n *\n * R.omit(['a', 'd'], {a: 1, b: 2, c: 3, d: 4}); //=> {b: 2, c: 3}\n */\nvar omit = /*#__PURE__*/_curry2(function omit(names, obj) {\n var result = {};\n var index = {};\n var idx = 0;\n var len = names.length;\n while (idx < len) {\n index[names[idx]] = 1;\n idx += 1;\n }\n for (var prop in obj) {\n if (!index.hasOwnProperty(prop)) {\n result[prop] = obj[prop];\n }\n }\n return result;\n});\nexport default omit;","import _curry2 from \"./internal/_curry2.js\";\n\n/**\n * Returns a partial copy of an object containing only the keys specified. If\n * the key does not exist, the property is ignored.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category Object\n * @sig [k] -> {k: v} -> {k: v}\n * @param {Array} names an array of String property names to copy onto a new object\n * @param {Object} obj The object to copy from\n * @return {Object} A new object with only properties from `names` on it.\n * @see R.omit, R.props\n * @example\n *\n * R.pick(['a', 'd'], {a: 1, b: 2, c: 3, d: 4}); //=> {a: 1, d: 4}\n * R.pick(['a', 'e', 'f'], {a: 1, b: 2, c: 3, d: 4}); //=> {a: 1}\n */\nvar pick = /*#__PURE__*/_curry2(function pick(names, obj) {\n var result = {};\n var idx = 0;\n while (idx < names.length) {\n if (names[idx] in obj) {\n result[names[idx]] = obj[names[idx]];\n }\n idx += 1;\n }\n return result;\n});\nexport default pick;","import _complement from \"./internal/_complement.js\";\nimport _curry2 from \"./internal/_curry2.js\";\nimport filter from \"./filter.js\";\n\n/**\n * The complement of [`filter`](#filter).\n *\n * Acts as a transducer if a transformer is given in list position. Filterable\n * objects include plain objects or any object that has a filter method such\n * as `Array`.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig Filterable f => (a -> Boolean) -> f a -> f a\n * @param {Function} pred\n * @param {Array} filterable\n * @return {Array}\n * @see R.filter, R.transduce, R.addIndex\n * @example\n *\n * const isOdd = (n) => n % 2 !== 0;\n *\n * R.reject(isOdd, [1, 2, 3, 4]); //=> [2, 4]\n *\n * R.reject(isOdd, {a: 1, b: 2, c: 3, d: 4}); //=> {b: 2, d: 4}\n */\nvar reject = /*#__PURE__*/_curry2(function reject(pred, filterable) {\n return filter(_complement(pred), filterable);\n});\nexport default reject;","export default function _complement(f) {\n return function () {\n return !f.apply(this, arguments);\n };\n}","export default function _map(fn, functor) {\n var idx = 0;\n var len = functor.length;\n var result = Array(len);\n while (idx < len) {\n result[idx] = fn(functor[idx]);\n idx += 1;\n }\n return result;\n}","export default function _quote(s) {\n var escaped = s.replace(/\\\\/g, '\\\\\\\\').replace(/[\\b]/g, '\\\\b') // \\b matches word boundary; [\\b] matches backspace\n .replace(/\\f/g, '\\\\f').replace(/\\n/g, '\\\\n').replace(/\\r/g, '\\\\r').replace(/\\t/g, '\\\\t').replace(/\\v/g, '\\\\v').replace(/\\0/g, '\\\\0');\n return '\"' + escaped.replace(/\"/g, '\\\\\"') + '\"';\n}","/**\n * Polyfill from .\n */\nvar pad = function pad(n) {\n return (n < 10 ? '0' : '') + n;\n};\nvar _toISOString = typeof Date.prototype.toISOString === 'function' ? function _toISOString(d) {\n return d.toISOString();\n} : function _toISOString(d) {\n return d.getUTCFullYear() + '-' + pad(d.getUTCMonth() + 1) + '-' + pad(d.getUTCDate()) + 'T' + pad(d.getUTCHours()) + ':' + pad(d.getUTCMinutes()) + ':' + pad(d.getUTCSeconds()) + '.' + (d.getUTCMilliseconds() / 1000).toFixed(3).slice(2, 5) + 'Z';\n};\nexport default _toISOString;","import _includes from \"./_includes.js\";\nimport _map from \"./_map.js\";\nimport _quote from \"./_quote.js\";\nimport _toISOString from \"./_toISOString.js\";\nimport keys from \"../keys.js\";\nimport reject from \"../reject.js\";\nexport default function _toString(x, seen) {\n var recur = function recur(y) {\n var xs = seen.concat([x]);\n return _includes(y, xs) ? '' : _toString(y, xs);\n };\n\n // mapPairs :: (Object, [String]) -> [String]\n var mapPairs = function (obj, keys) {\n return _map(function (k) {\n return _quote(k) + ': ' + recur(obj[k]);\n }, keys.slice().sort());\n };\n switch (Object.prototype.toString.call(x)) {\n case '[object Arguments]':\n return '(function() { return arguments; }(' + _map(recur, x).join(', ') + '))';\n case '[object Array]':\n return '[' + _map(recur, x).concat(mapPairs(x, reject(function (k) {\n return /^\\d+$/.test(k);\n }, keys(x)))).join(', ') + ']';\n case '[object Boolean]':\n return typeof x === 'object' ? 'new Boolean(' + recur(x.valueOf()) + ')' : x.toString();\n case '[object Date]':\n return 'new Date(' + (isNaN(x.valueOf()) ? recur(NaN) : _quote(_toISOString(x))) + ')';\n case '[object Map]':\n return 'new Map(' + recur(Array.from(x)) + ')';\n case '[object Null]':\n return 'null';\n case '[object Number]':\n return typeof x === 'object' ? 'new Number(' + recur(x.valueOf()) + ')' : 1 / x === -Infinity ? '-0' : x.toString(10);\n case '[object Set]':\n return 'new Set(' + recur(Array.from(x).sort()) + ')';\n case '[object String]':\n return typeof x === 'object' ? 'new String(' + recur(x.valueOf()) + ')' : _quote(x);\n case '[object Undefined]':\n return 'undefined';\n default:\n if (typeof x.toString === 'function') {\n var repr = x.toString();\n if (repr !== '[object Object]') {\n return repr;\n }\n }\n return '{' + mapPairs(x, keys(x)).join(', ') + '}';\n }\n}","import _curry1 from \"./internal/_curry1.js\";\nimport _toString from \"./internal/_toString.js\";\n\n/**\n * Returns the string representation of the given value. `eval`'ing the output\n * should result in a value equivalent to the input value. Many of the built-in\n * `toString` methods do not satisfy this requirement.\n *\n * If the given value is an `[object Object]` with a `toString` method other\n * than `Object.prototype.toString`, this method is invoked with no arguments\n * to produce the return value. This means user-defined constructor functions\n * can provide a suitable `toString` method. For example:\n *\n * function Point(x, y) {\n * this.x = x;\n * this.y = y;\n * }\n *\n * Point.prototype.toString = function() {\n * return 'new Point(' + this.x + ', ' + this.y + ')';\n * };\n *\n * R.toString(new Point(1, 2)); //=> 'new Point(1, 2)'\n *\n * @func\n * @memberOf R\n * @since v0.14.0\n * @category String\n * @sig * -> String\n * @param {*} val\n * @return {String}\n * @example\n *\n * R.toString(42); //=> '42'\n * R.toString('abc'); //=> '\"abc\"'\n * R.toString([1, 2, 3]); //=> '[1, 2, 3]'\n * R.toString({foo: 1, bar: 2, baz: 3}); //=> '{\"bar\": 2, \"baz\": 3, \"foo\": 1}'\n * R.toString(new Date('2001-02-03T04:05:06Z')); //=> 'new Date(\"2001-02-03T04:05:06.000Z\")'\n */\nvar toString = /*#__PURE__*/_curry1(function toString(val) {\n return _toString(val, []);\n});\nexport default toString;","import _curry1 from \"./internal/_curry1.js\";\n\n/**\n * Gives a single-word string description of the (native) type of a value,\n * returning such answers as 'Object', 'Number', 'Array', or 'Null'. Does not\n * attempt to distinguish user Object types any further, reporting them all as\n * 'Object'.\n *\n * @func\n * @memberOf R\n * @since v0.8.0\n * @category Type\n * @sig * -> String\n * @param {*} val The value to test\n * @return {String}\n * @example\n *\n * R.type({}); //=> \"Object\"\n * R.type(new Map); //=> \"Map\"\n * R.type(new Set); //=> \"Set\"\n * R.type(1); //=> \"Number\"\n * R.type(false); //=> \"Boolean\"\n * R.type('s'); //=> \"String\"\n * R.type(null); //=> \"Null\"\n * R.type([]); //=> \"Array\"\n * R.type(/[A-z]/); //=> \"RegExp\"\n * R.type(() => {}); //=> \"Function\"\n * R.type(async () => {}); //=> \"AsyncFunction\"\n * R.type(undefined); //=> \"Undefined\"\n * R.type(BigInt(123)); //=> \"BigInt\"\n */\nvar type = /*#__PURE__*/_curry1(function type(val) {\n return val === null ? 'Null' : val === undefined ? 'Undefined' : Object.prototype.toString.call(val).slice(8, -1);\n});\nexport default type;","import _includes from \"./_includes.js\";\nvar _Set = /*#__PURE__*/function () {\n function _Set() {\n /* globals Set */\n this._nativeSet = typeof Set === 'function' ? new Set() : null;\n this._items = {};\n }\n // until we figure out why jsdoc chokes on this\n // @param item The item to add to the Set\n // @returns {boolean} true if the item did not exist prior, otherwise false\n //\n _Set.prototype.add = function (item) {\n return !hasOrAdd(item, true, this);\n };\n\n //\n // @param item The item to check for existence in the Set\n // @returns {boolean} true if the item exists in the Set, otherwise false\n //\n _Set.prototype.has = function (item) {\n return hasOrAdd(item, false, this);\n };\n\n //\n // Combines the logic for checking whether an item is a member of the set and\n // for adding a new item to the set.\n //\n // @param item The item to check or add to the Set instance.\n // @param shouldAdd If true, the item will be added to the set if it doesn't\n // already exist.\n // @param set The set instance to check or add to.\n // @return {boolean} true if the item already existed, otherwise false.\n //\n return _Set;\n}();\nfunction hasOrAdd(item, shouldAdd, set) {\n var type = typeof item;\n var prevSize, newSize;\n switch (type) {\n case 'string':\n case 'number':\n // distinguish between +0 and -0\n if (item === 0 && 1 / item === -Infinity) {\n if (set._items['-0']) {\n return true;\n } else {\n if (shouldAdd) {\n set._items['-0'] = true;\n }\n return false;\n }\n }\n // these types can all utilise the native Set\n if (set._nativeSet !== null) {\n if (shouldAdd) {\n prevSize = set._nativeSet.size;\n set._nativeSet.add(item);\n newSize = set._nativeSet.size;\n return newSize === prevSize;\n } else {\n return set._nativeSet.has(item);\n }\n } else {\n if (!(type in set._items)) {\n if (shouldAdd) {\n set._items[type] = {};\n set._items[type][item] = true;\n }\n return false;\n } else if (item in set._items[type]) {\n return true;\n } else {\n if (shouldAdd) {\n set._items[type][item] = true;\n }\n return false;\n }\n }\n case 'boolean':\n // set._items['boolean'] holds a two element array\n // representing [ falseExists, trueExists ]\n if (type in set._items) {\n var bIdx = item ? 1 : 0;\n if (set._items[type][bIdx]) {\n return true;\n } else {\n if (shouldAdd) {\n set._items[type][bIdx] = true;\n }\n return false;\n }\n } else {\n if (shouldAdd) {\n set._items[type] = item ? [false, true] : [true, false];\n }\n return false;\n }\n case 'function':\n // compare functions for reference equality\n if (set._nativeSet !== null) {\n if (shouldAdd) {\n prevSize = set._nativeSet.size;\n set._nativeSet.add(item);\n newSize = set._nativeSet.size;\n return newSize === prevSize;\n } else {\n return set._nativeSet.has(item);\n }\n } else {\n if (!(type in set._items)) {\n if (shouldAdd) {\n set._items[type] = [item];\n }\n return false;\n }\n if (!_includes(item, set._items[type])) {\n if (shouldAdd) {\n set._items[type].push(item);\n }\n return false;\n }\n return true;\n }\n case 'undefined':\n if (set._items[type]) {\n return true;\n } else {\n if (shouldAdd) {\n set._items[type] = true;\n }\n return false;\n }\n case 'object':\n if (item === null) {\n if (!set._items['null']) {\n if (shouldAdd) {\n set._items['null'] = true;\n }\n return false;\n }\n return true;\n }\n /* falls through */\n default:\n // reduce the search size of heterogeneous sets by creating buckets\n // for each type.\n type = Object.prototype.toString.call(item);\n if (!(type in set._items)) {\n if (shouldAdd) {\n set._items[type] = [item];\n }\n return false;\n }\n // scan through all previously applied items\n if (!_includes(item, set._items[type])) {\n if (shouldAdd) {\n set._items[type].push(item);\n }\n return false;\n }\n return true;\n }\n}\n\n// A simple Set type that honours R.equals semantics\nexport default _Set;","import _curry2 from \"./internal/_curry2.js\";\nimport _Set from \"./internal/_Set.js\";\nimport reject from \"./reject.js\";\n\n/**\n * Returns a new list without values in the first argument.\n * [`R.equals`](#equals) is used to determine equality.\n *\n * Acts as a transducer if a transformer is given in list position.\n *\n * @func\n * @memberOf R\n * @since v0.19.0\n * @category List\n * @sig [a] -> [a] -> [a]\n * @param {Array} list1 The values to be removed from `list2`.\n * @param {Array} list2 The array to remove values from.\n * @return {Array} The new array without values in `list1`.\n * @see R.transduce, R.difference, R.remove\n * @example\n *\n * R.without([1, 2], [1, 2, 1, 3, 4]); //=> [3, 4]\n */\nvar without = /*#__PURE__*/_curry2(function without(xs, list) {\n var toRemove = new _Set();\n for (var i = 0; i < xs.length; i += 1) {\n toRemove.add(xs[i]);\n }\n return reject(toRemove.has.bind(toRemove), list);\n});\nexport default without;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// wrap a concatenated module body as a lazy, memoized accessor; mod is\n// set before the body runs so re-entrant calls (require cycles) observe\n// the partial exports like Node.js\n__webpack_require__.cw = function(body) {\n\tvar mod;\n\treturn function() {\n\t\tif (body) {\n\t\t\tvar fn = body;\n\t\t\tbody = 0;\n\t\t\tmod = { exports: {} };\n\t\t\tfn.call(mod.exports, mod, mod.exports);\n\t\t}\n\t\treturn mod.exports;\n\t};\n};","// define getter/value functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = function(chunkId) {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce(function(promises, key) {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = function(chunkId) { return {\"81\":\"async-mathjax\",\"113\":\"async-upload\",\"157\":\"async-dropdown\",\"254\":\"async-highlight\",\"384\":\"dash_core_components-shared\",\"400\":\"async-datepicker\",\"641\":\"async-markdown\",\"737\":\"async-slider\",\"746\":\"async-graph\"}[chunkId] + \".js\"; };","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); };","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT')\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && (!scriptUrl || !/^https?:/.test(scriptUrl))) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/^blob:|[?#].*$/g, \"\").replace(/\\/[^/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","var getCurrentScript = function() {\n var script = document.currentScript;\n if (!script) {\n /* Shim for IE11 and below */\n /* Do not take into account async scripts and inline scripts */\n\n var doc_scripts = document.getElementsByTagName('script');\n var scripts = [];\n\n for (var i = 0; i < doc_scripts.length; i++) {\n scripts.push(doc_scripts[i]);\n }\n\n scripts = scripts.filter(function(s) { return !s.async && !s.text && !s.textContent; });\n script = scripts.slice(-1)[0];\n }\n\n return script;\n};\n\nvar isLocalScript = function(script) {\n return /\\/_dash-component-suites\\//.test(script.src);\n};\n\nObject.defineProperty(__webpack_require__, 'p', {\n get: (function () {\n var script = getCurrentScript();\n\n var url = script.src.split('/').slice(0, -1).join('/') + '/';\n\n return function() {\n return url;\n };\n })()\n});\n\nif (typeof jsonpScriptSrc !== 'undefined') {\n var __jsonpScriptSrc__ = jsonpScriptSrc;\n jsonpScriptSrc = function(chunkId) {\n var script = getCurrentScript();\n var isLocal = isLocalScript(script);\n\n var src = __jsonpScriptSrc__(chunkId);\n\n if(!isLocal) {\n return src;\n }\n\n var srcFragments = src.split('/');\n var fileFragments = srcFragments.slice(-1)[0].split('.');\n\n fileFragments.splice(1, 0, \"v4_5_2m1792768347\");\n srcFragments.splice(-1, 1, fileFragments.join('.'))\n\n return srcFragments.join('/');\n };\n}\n","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t792: 0\n};\n\n__webpack_require__.f.j = function(chunkId, promises) {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise(function(resolve, reject) { installedChunkData = installedChunks[chunkId] = [resolve, reject]; });\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = function(event) {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\terror.event = event;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(__webpack_require__.p + __webpack_require__.u(chunkId), loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkdash_core_components\"] = self[\"webpackChunkdash_core_components\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;","'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i]\n revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n var len = b64.length\n\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n\n // Trim off extra bytes after placeholder bytes are found\n // See: https://github.com/beatgammit/base64-js/issues/42\n var validLen = b64.indexOf('=')\n if (validLen === -1) validLen = len\n\n var placeHoldersLen = validLen === len\n ? 0\n : 4 - (validLen % 4)\n\n return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n var tmp\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n\n var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n var curByte = 0\n\n // if there are placeholders, only get up to the last complete 4 chars\n var len = placeHoldersLen > 0\n ? validLen - 4\n : validLen\n\n var i\n for (i = 0; i < len; i += 4) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 18) |\n (revLookup[b64.charCodeAt(i + 1)] << 12) |\n (revLookup[b64.charCodeAt(i + 2)] << 6) |\n revLookup[b64.charCodeAt(i + 3)]\n arr[curByte++] = (tmp >> 16) & 0xFF\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 2) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 2) |\n (revLookup[b64.charCodeAt(i + 1)] >> 4)\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 1) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 10) |\n (revLookup[b64.charCodeAt(i + 1)] << 4) |\n (revLookup[b64.charCodeAt(i + 2)] >> 2)\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n return arr\n}\n\nfunction tripletToBase64 (num) {\n return lookup[num >> 18 & 0x3F] +\n lookup[num >> 12 & 0x3F] +\n lookup[num >> 6 & 0x3F] +\n lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n var tmp\n var output = []\n for (var i = start; i < end; i += 3) {\n tmp =\n ((uint8[i] << 16) & 0xFF0000) +\n ((uint8[i + 1] << 8) & 0xFF00) +\n (uint8[i + 2] & 0xFF)\n output.push(tripletToBase64(tmp))\n }\n return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n var tmp\n var len = uint8.length\n var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n var parts = []\n var maxChunkLength = 16383 // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1]\n parts.push(\n lookup[tmp >> 2] +\n lookup[(tmp << 4) & 0x3F] +\n '=='\n )\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n parts.push(\n lookup[tmp >> 10] +\n lookup[(tmp >> 4) & 0x3F] +\n lookup[(tmp << 2) & 0x3F] +\n '='\n )\n }\n\n return parts.join('')\n}\n","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n \n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./button.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = function insertAtTop(element) {\n var parent = document.querySelector('head');\n // eslint-disable-next-line no-underscore-dangle\n var lastInsertedElement =\n window._lastElementInsertedByStyleLoader;\n\n if (!lastInsertedElement) {\n parent.insertBefore(element, parent.firstChild);\n } else if (lastInsertedElement.nextSibling) {\n parent.insertBefore(element, lastInsertedElement.nextSibling);\n } else {\n parent.appendChild(element);\n }\n\n // eslint-disable-next-line no-underscore-dangle\n window._lastElementInsertedByStyleLoader = element;\n };\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!./button.css\";\n export default content && content.locals ? content.locals : undefined;\n","import React from 'react';\nimport {ButtonProps} from '../types';\nimport './css/button.css';\n\n/**\n * Similar to dash.html.Button, but with theming and styles applied.\n */\nconst Button = ({\n setProps,\n n_blur = 0,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n n_blur_timestamp = -1,\n n_clicks = 0,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n n_clicks_timestamp = -1,\n type = 'button',\n className,\n children,\n ...props\n}: ButtonProps) => {\n const ctx = window.dash_component_api.useDashContext();\n const isLoading = ctx.useLoading();\n\n return (\n {\n setProps({\n n_blur: n_blur + 1,\n n_blur_timestamp: Date.now(),\n });\n }}\n onClick={() => {\n setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now(),\n });\n }}\n type={type}\n {...props}\n >\n {children}\n \n );\n};\n\nexport default Button;\n","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n \n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./checklist.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = function insertAtTop(element) {\n var parent = document.querySelector('head');\n // eslint-disable-next-line no-underscore-dangle\n var lastInsertedElement =\n window._lastElementInsertedByStyleLoader;\n\n if (!lastInsertedElement) {\n parent.insertBefore(element, parent.firstChild);\n } else if (lastInsertedElement.nextSibling) {\n parent.insertBefore(element, lastInsertedElement.nextSibling);\n } else {\n parent.appendChild(element);\n }\n\n // eslint-disable-next-line no-underscore-dangle\n window._lastElementInsertedByStyleLoader = element;\n };\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!./checklist.css\";\n export default content && content.locals ? content.locals : undefined;\n","import React, {useMemo} from 'react';\nimport {ChecklistProps, PersistedProps, PersistenceTypes} from '../types';\nimport './css/checklist.css';\n\nimport {sanitizeOptions} from '../utils/optionTypes';\nimport LoadingElement from '../utils/_LoadingElement';\nimport {OptionsList} from '../utils/optionRendering';\n\n/**\n * Checklist is a component that encapsulates several checkboxes.\n * The values and labels of the checklist are specified in the `options`\n * property and the checked items are specified with the `value` property.\n * Each checkbox is rendered as an input with a surrounding label.\n */\nexport default function Checklist({\n className,\n id,\n style,\n setProps,\n inputStyle = {},\n inputClassName = '',\n labelStyle = {},\n labelClassName = '',\n options = [],\n value = [],\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persisted_props = [PersistedProps.value],\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persistence_type = PersistenceTypes.local,\n inline = false,\n}: ChecklistProps) {\n const sanitizedOptions = useMemo(() => {\n return sanitizeOptions(options).options;\n }, [options]);\n\n const stylingProps = {\n id,\n className: 'dash-checklist ' + (className ?? ''),\n style,\n optionClassName: inline ? 'dash-checklist-inline' : undefined,\n inputStyle,\n inputClassName,\n labelStyle,\n labelClassName,\n };\n\n return (\n \n {loadingProps => (\n {\n setProps({value: selection});\n }}\n {...stylingProps}\n />\n )}\n \n );\n}\n\nChecklist.dashPersistence = {\n persisted_props: [PersistedProps.value],\n persistence_type: PersistenceTypes.local,\n};\n","/*!\n * Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com\n * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)\n */\nfunction _typeof(obj) {\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function (obj) {\n return typeof obj;\n };\n } else {\n _typeof = function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n\n return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nfunction _objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n var ownKeys = Object.keys(source);\n\n if (typeof Object.getOwnPropertySymbols === 'function') {\n ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {\n return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n }));\n }\n\n ownKeys.forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n }\n\n return target;\n}\n\nfunction _slicedToArray(arr, i) {\n return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest();\n}\n\nfunction _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread();\n}\n\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) {\n for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];\n\n return arr2;\n }\n}\n\nfunction _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\n\nfunction _iterableToArray(iter) {\n if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === \"[object Arguments]\") return Array.from(iter);\n}\n\nfunction _iterableToArrayLimit(arr, i) {\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n}\n\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance\");\n}\n\nfunction _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n}\n\nvar noop = function noop() {};\n\nvar _WINDOW = {};\nvar _DOCUMENT = {};\nvar _MUTATION_OBSERVER = null;\nvar _PERFORMANCE = {\n mark: noop,\n measure: noop\n};\n\ntry {\n if (typeof window !== 'undefined') _WINDOW = window;\n if (typeof document !== 'undefined') _DOCUMENT = document;\n if (typeof MutationObserver !== 'undefined') _MUTATION_OBSERVER = MutationObserver;\n if (typeof performance !== 'undefined') _PERFORMANCE = performance;\n} catch (e) {}\n\nvar _ref = _WINDOW.navigator || {},\n _ref$userAgent = _ref.userAgent,\n userAgent = _ref$userAgent === void 0 ? '' : _ref$userAgent;\n\nvar WINDOW = _WINDOW;\nvar DOCUMENT = _DOCUMENT;\nvar MUTATION_OBSERVER = _MUTATION_OBSERVER;\nvar PERFORMANCE = _PERFORMANCE;\nvar IS_BROWSER = !!WINDOW.document;\nvar IS_DOM = !!DOCUMENT.documentElement && !!DOCUMENT.head && typeof DOCUMENT.addEventListener === 'function' && typeof DOCUMENT.createElement === 'function';\nvar IS_IE = ~userAgent.indexOf('MSIE') || ~userAgent.indexOf('Trident/');\n\nvar NAMESPACE_IDENTIFIER = '___FONT_AWESOME___';\nvar UNITS_IN_GRID = 16;\nvar DEFAULT_FAMILY_PREFIX = 'fa';\nvar DEFAULT_REPLACEMENT_CLASS = 'svg-inline--fa';\nvar DATA_FA_I2SVG = 'data-fa-i2svg';\nvar DATA_FA_PSEUDO_ELEMENT = 'data-fa-pseudo-element';\nvar DATA_FA_PSEUDO_ELEMENT_PENDING = 'data-fa-pseudo-element-pending';\nvar DATA_PREFIX = 'data-prefix';\nvar DATA_ICON = 'data-icon';\nvar HTML_CLASS_I2SVG_BASE_CLASS = 'fontawesome-i2svg';\nvar MUTATION_APPROACH_ASYNC = 'async';\nvar TAGNAMES_TO_SKIP_FOR_PSEUDOELEMENTS = ['HTML', 'HEAD', 'STYLE', 'SCRIPT'];\nvar PRODUCTION = function () {\n try {\n return process.env.NODE_ENV === 'production';\n } catch (e) {\n return false;\n }\n}();\nvar PREFIX_TO_STYLE = {\n 'fas': 'solid',\n 'far': 'regular',\n 'fal': 'light',\n 'fad': 'duotone',\n 'fab': 'brands',\n 'fak': 'kit',\n 'fa': 'solid'\n};\nvar STYLE_TO_PREFIX = {\n 'solid': 'fas',\n 'regular': 'far',\n 'light': 'fal',\n 'duotone': 'fad',\n 'brands': 'fab',\n 'kit': 'fak'\n};\nvar LAYERS_TEXT_CLASSNAME = 'fa-layers-text';\nvar FONT_FAMILY_PATTERN = /Font Awesome ([5 ]*)(Solid|Regular|Light|Duotone|Brands|Free|Pro|Kit).*/i; // TODO: do we need to handle font-weight for kit SVG pseudo-elements?\n\nvar FONT_WEIGHT_TO_PREFIX = {\n '900': 'fas',\n '400': 'far',\n 'normal': 'far',\n '300': 'fal'\n};\nvar oneToTen = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];\nvar oneToTwenty = oneToTen.concat([11, 12, 13, 14, 15, 16, 17, 18, 19, 20]);\nvar ATTRIBUTES_WATCHED_FOR_MUTATION = ['class', 'data-prefix', 'data-icon', 'data-fa-transform', 'data-fa-mask'];\nvar DUOTONE_CLASSES = {\n GROUP: 'group',\n SWAP_OPACITY: 'swap-opacity',\n PRIMARY: 'primary',\n SECONDARY: 'secondary'\n};\nvar RESERVED_CLASSES = ['xs', 'sm', 'lg', 'fw', 'ul', 'li', 'border', 'pull-left', 'pull-right', 'spin', 'pulse', 'rotate-90', 'rotate-180', 'rotate-270', 'flip-horizontal', 'flip-vertical', 'flip-both', 'stack', 'stack-1x', 'stack-2x', 'inverse', 'layers', 'layers-text', 'layers-counter', DUOTONE_CLASSES.GROUP, DUOTONE_CLASSES.SWAP_OPACITY, DUOTONE_CLASSES.PRIMARY, DUOTONE_CLASSES.SECONDARY].concat(oneToTen.map(function (n) {\n return \"\".concat(n, \"x\");\n})).concat(oneToTwenty.map(function (n) {\n return \"w-\".concat(n);\n}));\n\nvar initial = WINDOW.FontAwesomeConfig || {};\n\nfunction getAttrConfig(attr) {\n var element = DOCUMENT.querySelector('script[' + attr + ']');\n\n if (element) {\n return element.getAttribute(attr);\n }\n}\n\nfunction coerce(val) {\n // Getting an empty string will occur if the attribute is set on the HTML tag but without a value\n // We'll assume that this is an indication that it should be toggled to true\n // For example \n if (val === '') return true;\n if (val === 'false') return false;\n if (val === 'true') return true;\n return val;\n}\n\nif (DOCUMENT && typeof DOCUMENT.querySelector === 'function') {\n var attrs = [['data-family-prefix', 'familyPrefix'], ['data-replacement-class', 'replacementClass'], ['data-auto-replace-svg', 'autoReplaceSvg'], ['data-auto-add-css', 'autoAddCss'], ['data-auto-a11y', 'autoA11y'], ['data-search-pseudo-elements', 'searchPseudoElements'], ['data-observe-mutations', 'observeMutations'], ['data-mutate-approach', 'mutateApproach'], ['data-keep-original-source', 'keepOriginalSource'], ['data-measure-performance', 'measurePerformance'], ['data-show-missing-icons', 'showMissingIcons']];\n attrs.forEach(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n attr = _ref2[0],\n key = _ref2[1];\n\n var val = coerce(getAttrConfig(attr));\n\n if (val !== undefined && val !== null) {\n initial[key] = val;\n }\n });\n}\n\nvar _default = {\n familyPrefix: DEFAULT_FAMILY_PREFIX,\n replacementClass: DEFAULT_REPLACEMENT_CLASS,\n autoReplaceSvg: true,\n autoAddCss: true,\n autoA11y: true,\n searchPseudoElements: false,\n observeMutations: true,\n mutateApproach: 'async',\n keepOriginalSource: true,\n measurePerformance: false,\n showMissingIcons: true\n};\n\nvar _config = _objectSpread({}, _default, initial);\n\nif (!_config.autoReplaceSvg) _config.observeMutations = false;\n\nvar config = _objectSpread({}, _config);\n\nWINDOW.FontAwesomeConfig = config;\n\nvar w = WINDOW || {};\nif (!w[NAMESPACE_IDENTIFIER]) w[NAMESPACE_IDENTIFIER] = {};\nif (!w[NAMESPACE_IDENTIFIER].styles) w[NAMESPACE_IDENTIFIER].styles = {};\nif (!w[NAMESPACE_IDENTIFIER].hooks) w[NAMESPACE_IDENTIFIER].hooks = {};\nif (!w[NAMESPACE_IDENTIFIER].shims) w[NAMESPACE_IDENTIFIER].shims = [];\nvar namespace = w[NAMESPACE_IDENTIFIER];\n\nvar functions = [];\n\nvar listener = function listener() {\n DOCUMENT.removeEventListener('DOMContentLoaded', listener);\n loaded = 1;\n functions.map(function (fn) {\n return fn();\n });\n};\n\nvar loaded = false;\n\nif (IS_DOM) {\n loaded = (DOCUMENT.documentElement.doScroll ? /^loaded|^c/ : /^loaded|^i|^c/).test(DOCUMENT.readyState);\n if (!loaded) DOCUMENT.addEventListener('DOMContentLoaded', listener);\n}\n\nfunction domready (fn) {\n if (!IS_DOM) return;\n loaded ? setTimeout(fn, 0) : functions.push(fn);\n}\n\nvar PENDING = 'pending';\nvar SETTLED = 'settled';\nvar FULFILLED = 'fulfilled';\nvar REJECTED = 'rejected';\n\nvar NOOP = function NOOP() {};\n\nvar isNode = typeof global !== 'undefined' && typeof global.process !== 'undefined' && typeof global.process.emit === 'function';\nvar asyncSetTimer = typeof setImmediate === 'undefined' ? setTimeout : setImmediate;\nvar asyncQueue = [];\nvar asyncTimer;\n\nfunction asyncFlush() {\n // run promise callbacks\n for (var i = 0; i < asyncQueue.length; i++) {\n asyncQueue[i][0](asyncQueue[i][1]);\n } // reset async asyncQueue\n\n\n asyncQueue = [];\n asyncTimer = false;\n}\n\nfunction asyncCall(callback, arg) {\n asyncQueue.push([callback, arg]);\n\n if (!asyncTimer) {\n asyncTimer = true;\n asyncSetTimer(asyncFlush, 0);\n }\n}\n\nfunction invokeResolver(resolver, promise) {\n function resolvePromise(value) {\n resolve(promise, value);\n }\n\n function rejectPromise(reason) {\n reject(promise, reason);\n }\n\n try {\n resolver(resolvePromise, rejectPromise);\n } catch (e) {\n rejectPromise(e);\n }\n}\n\nfunction invokeCallback(subscriber) {\n var owner = subscriber.owner;\n var settled = owner._state;\n var value = owner._data;\n var callback = subscriber[settled];\n var promise = subscriber.then;\n\n if (typeof callback === 'function') {\n settled = FULFILLED;\n\n try {\n value = callback(value);\n } catch (e) {\n reject(promise, e);\n }\n }\n\n if (!handleThenable(promise, value)) {\n if (settled === FULFILLED) {\n resolve(promise, value);\n }\n\n if (settled === REJECTED) {\n reject(promise, value);\n }\n }\n}\n\nfunction handleThenable(promise, value) {\n var resolved;\n\n try {\n if (promise === value) {\n throw new TypeError('A promises callback cannot return that same promise.');\n }\n\n if (value && (typeof value === 'function' || _typeof(value) === 'object')) {\n // then should be retrieved only once\n var then = value.then;\n\n if (typeof then === 'function') {\n then.call(value, function (val) {\n if (!resolved) {\n resolved = true;\n\n if (value === val) {\n fulfill(promise, val);\n } else {\n resolve(promise, val);\n }\n }\n }, function (reason) {\n if (!resolved) {\n resolved = true;\n reject(promise, reason);\n }\n });\n return true;\n }\n }\n } catch (e) {\n if (!resolved) {\n reject(promise, e);\n }\n\n return true;\n }\n\n return false;\n}\n\nfunction resolve(promise, value) {\n if (promise === value || !handleThenable(promise, value)) {\n fulfill(promise, value);\n }\n}\n\nfunction fulfill(promise, value) {\n if (promise._state === PENDING) {\n promise._state = SETTLED;\n promise._data = value;\n asyncCall(publishFulfillment, promise);\n }\n}\n\nfunction reject(promise, reason) {\n if (promise._state === PENDING) {\n promise._state = SETTLED;\n promise._data = reason;\n asyncCall(publishRejection, promise);\n }\n}\n\nfunction publish(promise) {\n promise._then = promise._then.forEach(invokeCallback);\n}\n\nfunction publishFulfillment(promise) {\n promise._state = FULFILLED;\n publish(promise);\n}\n\nfunction publishRejection(promise) {\n promise._state = REJECTED;\n publish(promise);\n\n if (!promise._handled && isNode) {\n global.process.emit('unhandledRejection', promise._data, promise);\n }\n}\n\nfunction notifyRejectionHandled(promise) {\n global.process.emit('rejectionHandled', promise);\n}\n/**\n * @class\n */\n\n\nfunction P(resolver) {\n if (typeof resolver !== 'function') {\n throw new TypeError('Promise resolver ' + resolver + ' is not a function');\n }\n\n if (this instanceof P === false) {\n throw new TypeError('Failed to construct \\'Promise\\': Please use the \\'new\\' operator, this object constructor cannot be called as a function.');\n }\n\n this._then = [];\n invokeResolver(resolver, this);\n}\n\nP.prototype = {\n constructor: P,\n _state: PENDING,\n _then: null,\n _data: undefined,\n _handled: false,\n then: function then(onFulfillment, onRejection) {\n var subscriber = {\n owner: this,\n then: new this.constructor(NOOP),\n fulfilled: onFulfillment,\n rejected: onRejection\n };\n\n if ((onRejection || onFulfillment) && !this._handled) {\n this._handled = true;\n\n if (this._state === REJECTED && isNode) {\n asyncCall(notifyRejectionHandled, this);\n }\n }\n\n if (this._state === FULFILLED || this._state === REJECTED) {\n // already resolved, call callback async\n asyncCall(invokeCallback, subscriber);\n } else {\n // subscribe\n this._then.push(subscriber);\n }\n\n return subscriber.then;\n },\n catch: function _catch(onRejection) {\n return this.then(null, onRejection);\n }\n};\n\nP.all = function (promises) {\n if (!Array.isArray(promises)) {\n throw new TypeError('You must pass an array to Promise.all().');\n }\n\n return new P(function (resolve, reject) {\n var results = [];\n var remaining = 0;\n\n function resolver(index) {\n remaining++;\n return function (value) {\n results[index] = value;\n\n if (! --remaining) {\n resolve(results);\n }\n };\n }\n\n for (var i = 0, promise; i < promises.length; i++) {\n promise = promises[i];\n\n if (promise && typeof promise.then === 'function') {\n promise.then(resolver(i), reject);\n } else {\n results[i] = promise;\n }\n }\n\n if (!remaining) {\n resolve(results);\n }\n });\n};\n\nP.race = function (promises) {\n if (!Array.isArray(promises)) {\n throw new TypeError('You must pass an array to Promise.race().');\n }\n\n return new P(function (resolve, reject) {\n for (var i = 0, promise; i < promises.length; i++) {\n promise = promises[i];\n\n if (promise && typeof promise.then === 'function') {\n promise.then(resolve, reject);\n } else {\n resolve(promise);\n }\n }\n });\n};\n\nP.resolve = function (value) {\n if (value && _typeof(value) === 'object' && value.constructor === P) {\n return value;\n }\n\n return new P(function (resolve) {\n resolve(value);\n });\n};\n\nP.reject = function (reason) {\n return new P(function (resolve, reject) {\n reject(reason);\n });\n};\n\nvar picked = typeof Promise === 'function' ? Promise : P;\n\nvar d = UNITS_IN_GRID;\nvar meaninglessTransform = {\n size: 16,\n x: 0,\n y: 0,\n rotate: 0,\n flipX: false,\n flipY: false\n};\n\nfunction isReserved(name) {\n return ~RESERVED_CLASSES.indexOf(name);\n}\nfunction insertCss(css) {\n if (!css || !IS_DOM) {\n return;\n }\n\n var style = DOCUMENT.createElement('style');\n style.setAttribute('type', 'text/css');\n style.innerHTML = css;\n var headChildren = DOCUMENT.head.childNodes;\n var beforeChild = null;\n\n for (var i = headChildren.length - 1; i > -1; i--) {\n var child = headChildren[i];\n var tagName = (child.tagName || '').toUpperCase();\n\n if (['STYLE', 'LINK'].indexOf(tagName) > -1) {\n beforeChild = child;\n }\n }\n\n DOCUMENT.head.insertBefore(style, beforeChild);\n return css;\n}\nvar idPool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';\nfunction nextUniqueId() {\n var size = 12;\n var id = '';\n\n while (size-- > 0) {\n id += idPool[Math.random() * 62 | 0];\n }\n\n return id;\n}\nfunction toArray(obj) {\n var array = [];\n\n for (var i = (obj || []).length >>> 0; i--;) {\n array[i] = obj[i];\n }\n\n return array;\n}\nfunction classArray(node) {\n if (node.classList) {\n return toArray(node.classList);\n } else {\n return (node.getAttribute('class') || '').split(' ').filter(function (i) {\n return i;\n });\n }\n}\nfunction getIconName(familyPrefix, cls) {\n var parts = cls.split('-');\n var prefix = parts[0];\n var iconName = parts.slice(1).join('-');\n\n if (prefix === familyPrefix && iconName !== '' && !isReserved(iconName)) {\n return iconName;\n } else {\n return null;\n }\n}\nfunction htmlEscape(str) {\n return \"\".concat(str).replace(/&/g, '&').replace(/\"/g, '"').replace(/'/g, ''').replace(//g, '>');\n}\nfunction joinAttributes(attributes) {\n return Object.keys(attributes || {}).reduce(function (acc, attributeName) {\n return acc + \"\".concat(attributeName, \"=\\\"\").concat(htmlEscape(attributes[attributeName]), \"\\\" \");\n }, '').trim();\n}\nfunction joinStyles(styles) {\n return Object.keys(styles || {}).reduce(function (acc, styleName) {\n return acc + \"\".concat(styleName, \": \").concat(styles[styleName], \";\");\n }, '');\n}\nfunction transformIsMeaningful(transform) {\n return transform.size !== meaninglessTransform.size || transform.x !== meaninglessTransform.x || transform.y !== meaninglessTransform.y || transform.rotate !== meaninglessTransform.rotate || transform.flipX || transform.flipY;\n}\nfunction transformForSvg(_ref) {\n var transform = _ref.transform,\n containerWidth = _ref.containerWidth,\n iconWidth = _ref.iconWidth;\n var outer = {\n transform: \"translate(\".concat(containerWidth / 2, \" 256)\")\n };\n var innerTranslate = \"translate(\".concat(transform.x * 32, \", \").concat(transform.y * 32, \") \");\n var innerScale = \"scale(\".concat(transform.size / 16 * (transform.flipX ? -1 : 1), \", \").concat(transform.size / 16 * (transform.flipY ? -1 : 1), \") \");\n var innerRotate = \"rotate(\".concat(transform.rotate, \" 0 0)\");\n var inner = {\n transform: \"\".concat(innerTranslate, \" \").concat(innerScale, \" \").concat(innerRotate)\n };\n var path = {\n transform: \"translate(\".concat(iconWidth / 2 * -1, \" -256)\")\n };\n return {\n outer: outer,\n inner: inner,\n path: path\n };\n}\nfunction transformForCss(_ref2) {\n var transform = _ref2.transform,\n _ref2$width = _ref2.width,\n width = _ref2$width === void 0 ? UNITS_IN_GRID : _ref2$width,\n _ref2$height = _ref2.height,\n height = _ref2$height === void 0 ? UNITS_IN_GRID : _ref2$height,\n _ref2$startCentered = _ref2.startCentered,\n startCentered = _ref2$startCentered === void 0 ? false : _ref2$startCentered;\n var val = '';\n\n if (startCentered && IS_IE) {\n val += \"translate(\".concat(transform.x / d - width / 2, \"em, \").concat(transform.y / d - height / 2, \"em) \");\n } else if (startCentered) {\n val += \"translate(calc(-50% + \".concat(transform.x / d, \"em), calc(-50% + \").concat(transform.y / d, \"em)) \");\n } else {\n val += \"translate(\".concat(transform.x / d, \"em, \").concat(transform.y / d, \"em) \");\n }\n\n val += \"scale(\".concat(transform.size / d * (transform.flipX ? -1 : 1), \", \").concat(transform.size / d * (transform.flipY ? -1 : 1), \") \");\n val += \"rotate(\".concat(transform.rotate, \"deg) \");\n return val;\n}\n\nvar ALL_SPACE = {\n x: 0,\n y: 0,\n width: '100%',\n height: '100%'\n};\n\nfunction fillBlack(abstract) {\n var force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n if (abstract.attributes && (abstract.attributes.fill || force)) {\n abstract.attributes.fill = 'black';\n }\n\n return abstract;\n}\n\nfunction deGroup(abstract) {\n if (abstract.tag === 'g') {\n return abstract.children;\n } else {\n return [abstract];\n }\n}\n\nfunction makeIconMasking (_ref) {\n var children = _ref.children,\n attributes = _ref.attributes,\n main = _ref.main,\n mask = _ref.mask,\n explicitMaskId = _ref.maskId,\n transform = _ref.transform;\n var mainWidth = main.width,\n mainPath = main.icon;\n var maskWidth = mask.width,\n maskPath = mask.icon;\n var trans = transformForSvg({\n transform: transform,\n containerWidth: maskWidth,\n iconWidth: mainWidth\n });\n var maskRect = {\n tag: 'rect',\n attributes: _objectSpread({}, ALL_SPACE, {\n fill: 'white'\n })\n };\n var maskInnerGroupChildrenMixin = mainPath.children ? {\n children: mainPath.children.map(fillBlack)\n } : {};\n var maskInnerGroup = {\n tag: 'g',\n attributes: _objectSpread({}, trans.inner),\n children: [fillBlack(_objectSpread({\n tag: mainPath.tag,\n attributes: _objectSpread({}, mainPath.attributes, trans.path)\n }, maskInnerGroupChildrenMixin))]\n };\n var maskOuterGroup = {\n tag: 'g',\n attributes: _objectSpread({}, trans.outer),\n children: [maskInnerGroup]\n };\n var maskId = \"mask-\".concat(explicitMaskId || nextUniqueId());\n var clipId = \"clip-\".concat(explicitMaskId || nextUniqueId());\n var maskTag = {\n tag: 'mask',\n attributes: _objectSpread({}, ALL_SPACE, {\n id: maskId,\n maskUnits: 'userSpaceOnUse',\n maskContentUnits: 'userSpaceOnUse'\n }),\n children: [maskRect, maskOuterGroup]\n };\n var defs = {\n tag: 'defs',\n children: [{\n tag: 'clipPath',\n attributes: {\n id: clipId\n },\n children: deGroup(maskPath)\n }, maskTag]\n };\n children.push(defs, {\n tag: 'rect',\n attributes: _objectSpread({\n fill: 'currentColor',\n 'clip-path': \"url(#\".concat(clipId, \")\"),\n mask: \"url(#\".concat(maskId, \")\")\n }, ALL_SPACE)\n });\n return {\n children: children,\n attributes: attributes\n };\n}\n\nfunction makeIconStandard (_ref) {\n var children = _ref.children,\n attributes = _ref.attributes,\n main = _ref.main,\n transform = _ref.transform,\n styles = _ref.styles;\n var styleString = joinStyles(styles);\n\n if (styleString.length > 0) {\n attributes['style'] = styleString;\n }\n\n if (transformIsMeaningful(transform)) {\n var trans = transformForSvg({\n transform: transform,\n containerWidth: main.width,\n iconWidth: main.width\n });\n children.push({\n tag: 'g',\n attributes: _objectSpread({}, trans.outer),\n children: [{\n tag: 'g',\n attributes: _objectSpread({}, trans.inner),\n children: [{\n tag: main.icon.tag,\n children: main.icon.children,\n attributes: _objectSpread({}, main.icon.attributes, trans.path)\n }]\n }]\n });\n } else {\n children.push(main.icon);\n }\n\n return {\n children: children,\n attributes: attributes\n };\n}\n\nfunction asIcon (_ref) {\n var children = _ref.children,\n main = _ref.main,\n mask = _ref.mask,\n attributes = _ref.attributes,\n styles = _ref.styles,\n transform = _ref.transform;\n\n if (transformIsMeaningful(transform) && main.found && !mask.found) {\n var width = main.width,\n height = main.height;\n var offset = {\n x: width / height / 2,\n y: 0.5\n };\n attributes['style'] = joinStyles(_objectSpread({}, styles, {\n 'transform-origin': \"\".concat(offset.x + transform.x / 16, \"em \").concat(offset.y + transform.y / 16, \"em\")\n }));\n }\n\n return [{\n tag: 'svg',\n attributes: attributes,\n children: children\n }];\n}\n\nfunction asSymbol (_ref) {\n var prefix = _ref.prefix,\n iconName = _ref.iconName,\n children = _ref.children,\n attributes = _ref.attributes,\n symbol = _ref.symbol;\n var id = symbol === true ? \"\".concat(prefix, \"-\").concat(config.familyPrefix, \"-\").concat(iconName) : symbol;\n return [{\n tag: 'svg',\n attributes: {\n style: 'display: none;'\n },\n children: [{\n tag: 'symbol',\n attributes: _objectSpread({}, attributes, {\n id: id\n }),\n children: children\n }]\n }];\n}\n\nfunction makeInlineSvgAbstract(params) {\n var _params$icons = params.icons,\n main = _params$icons.main,\n mask = _params$icons.mask,\n prefix = params.prefix,\n iconName = params.iconName,\n transform = params.transform,\n symbol = params.symbol,\n title = params.title,\n maskId = params.maskId,\n titleId = params.titleId,\n extra = params.extra,\n _params$watchable = params.watchable,\n watchable = _params$watchable === void 0 ? false : _params$watchable;\n\n var _ref = mask.found ? mask : main,\n width = _ref.width,\n height = _ref.height;\n\n var isUploadedIcon = prefix === 'fak';\n var widthClass = isUploadedIcon ? '' : \"fa-w-\".concat(Math.ceil(width / height * 16));\n var attrClass = [config.replacementClass, iconName ? \"\".concat(config.familyPrefix, \"-\").concat(iconName) : '', widthClass].filter(function (c) {\n return extra.classes.indexOf(c) === -1;\n }).filter(function (c) {\n return c !== '' || !!c;\n }).concat(extra.classes).join(' ');\n var content = {\n children: [],\n attributes: _objectSpread({}, extra.attributes, {\n 'data-prefix': prefix,\n 'data-icon': iconName,\n 'class': attrClass,\n 'role': extra.attributes.role || 'img',\n 'xmlns': 'http://www.w3.org/2000/svg',\n 'viewBox': \"0 0 \".concat(width, \" \").concat(height)\n })\n };\n var uploadedIconWidthStyle = isUploadedIcon && !~extra.classes.indexOf('fa-fw') ? {\n width: \"\".concat(width / height * 16 * 0.0625, \"em\")\n } : {};\n\n if (watchable) {\n content.attributes[DATA_FA_I2SVG] = '';\n }\n\n if (title) content.children.push({\n tag: 'title',\n attributes: {\n id: content.attributes['aria-labelledby'] || \"title-\".concat(titleId || nextUniqueId())\n },\n children: [title]\n });\n\n var args = _objectSpread({}, content, {\n prefix: prefix,\n iconName: iconName,\n main: main,\n mask: mask,\n maskId: maskId,\n transform: transform,\n symbol: symbol,\n styles: _objectSpread({}, uploadedIconWidthStyle, extra.styles)\n });\n\n var _ref2 = mask.found && main.found ? makeIconMasking(args) : makeIconStandard(args),\n children = _ref2.children,\n attributes = _ref2.attributes;\n\n args.children = children;\n args.attributes = attributes;\n\n if (symbol) {\n return asSymbol(args);\n } else {\n return asIcon(args);\n }\n}\nfunction makeLayersTextAbstract(params) {\n var content = params.content,\n width = params.width,\n height = params.height,\n transform = params.transform,\n title = params.title,\n extra = params.extra,\n _params$watchable2 = params.watchable,\n watchable = _params$watchable2 === void 0 ? false : _params$watchable2;\n\n var attributes = _objectSpread({}, extra.attributes, title ? {\n 'title': title\n } : {}, {\n 'class': extra.classes.join(' ')\n });\n\n if (watchable) {\n attributes[DATA_FA_I2SVG] = '';\n }\n\n var styles = _objectSpread({}, extra.styles);\n\n if (transformIsMeaningful(transform)) {\n styles['transform'] = transformForCss({\n transform: transform,\n startCentered: true,\n width: width,\n height: height\n });\n styles['-webkit-transform'] = styles['transform'];\n }\n\n var styleString = joinStyles(styles);\n\n if (styleString.length > 0) {\n attributes['style'] = styleString;\n }\n\n var val = [];\n val.push({\n tag: 'span',\n attributes: attributes,\n children: [content]\n });\n\n if (title) {\n val.push({\n tag: 'span',\n attributes: {\n class: 'sr-only'\n },\n children: [title]\n });\n }\n\n return val;\n}\nfunction makeLayersCounterAbstract(params) {\n var content = params.content,\n title = params.title,\n extra = params.extra;\n\n var attributes = _objectSpread({}, extra.attributes, title ? {\n 'title': title\n } : {}, {\n 'class': extra.classes.join(' ')\n });\n\n var styleString = joinStyles(extra.styles);\n\n if (styleString.length > 0) {\n attributes['style'] = styleString;\n }\n\n var val = [];\n val.push({\n tag: 'span',\n attributes: attributes,\n children: [content]\n });\n\n if (title) {\n val.push({\n tag: 'span',\n attributes: {\n class: 'sr-only'\n },\n children: [title]\n });\n }\n\n return val;\n}\n\nvar noop$1 = function noop() {};\n\nvar p = config.measurePerformance && PERFORMANCE && PERFORMANCE.mark && PERFORMANCE.measure ? PERFORMANCE : {\n mark: noop$1,\n measure: noop$1\n};\nvar preamble = \"FA \\\"5.15.4\\\"\";\n\nvar begin = function begin(name) {\n p.mark(\"\".concat(preamble, \" \").concat(name, \" begins\"));\n return function () {\n return end(name);\n };\n};\n\nvar end = function end(name) {\n p.mark(\"\".concat(preamble, \" \").concat(name, \" ends\"));\n p.measure(\"\".concat(preamble, \" \").concat(name), \"\".concat(preamble, \" \").concat(name, \" begins\"), \"\".concat(preamble, \" \").concat(name, \" ends\"));\n};\n\nvar perf = {\n begin: begin,\n end: end\n};\n\n/**\n * Internal helper to bind a function known to have 4 arguments\n * to a given context.\n */\n\nvar bindInternal4 = function bindInternal4(func, thisContext) {\n return function (a, b, c, d) {\n return func.call(thisContext, a, b, c, d);\n };\n};\n\n/**\n * # Reduce\n *\n * A fast object `.reduce()` implementation.\n *\n * @param {Object} subject The object to reduce over.\n * @param {Function} fn The reducer function.\n * @param {mixed} initialValue The initial value for the reducer, defaults to subject[0].\n * @param {Object} thisContext The context for the reducer.\n * @return {mixed} The final result.\n */\n\n\nvar reduce = function fastReduceObject(subject, fn, initialValue, thisContext) {\n var keys = Object.keys(subject),\n length = keys.length,\n iterator = thisContext !== undefined ? bindInternal4(fn, thisContext) : fn,\n i,\n key,\n result;\n\n if (initialValue === undefined) {\n i = 1;\n result = subject[keys[0]];\n } else {\n i = 0;\n result = initialValue;\n }\n\n for (; i < length; i++) {\n key = keys[i];\n result = iterator(result, subject[key], key, subject);\n }\n\n return result;\n};\n\nfunction toHex(unicode) {\n var result = '';\n\n for (var i = 0; i < unicode.length; i++) {\n var hex = unicode.charCodeAt(i).toString(16);\n result += ('000' + hex).slice(-4);\n }\n\n return result;\n}\n\nfunction defineIcons(prefix, icons) {\n var params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var _params$skipHooks = params.skipHooks,\n skipHooks = _params$skipHooks === void 0 ? false : _params$skipHooks;\n var normalized = Object.keys(icons).reduce(function (acc, iconName) {\n var icon = icons[iconName];\n var expanded = !!icon.icon;\n\n if (expanded) {\n acc[icon.iconName] = icon.icon;\n } else {\n acc[iconName] = icon;\n }\n\n return acc;\n }, {});\n\n if (typeof namespace.hooks.addPack === 'function' && !skipHooks) {\n namespace.hooks.addPack(prefix, normalized);\n } else {\n namespace.styles[prefix] = _objectSpread({}, namespace.styles[prefix] || {}, normalized);\n }\n /**\n * Font Awesome 4 used the prefix of `fa` for all icons. With the introduction\n * of new styles we needed to differentiate between them. Prefix `fa` is now an alias\n * for `fas` so we'll easy the upgrade process for our users by automatically defining\n * this as well.\n */\n\n\n if (prefix === 'fas') {\n defineIcons('fa', icons);\n }\n}\n\nvar styles = namespace.styles,\n shims = namespace.shims;\nvar _byUnicode = {};\nvar _byLigature = {};\nvar _byOldName = {};\nvar build = function build() {\n var lookup = function lookup(reducer) {\n return reduce(styles, function (o, style, prefix) {\n o[prefix] = reduce(style, reducer, {});\n return o;\n }, {});\n };\n\n _byUnicode = lookup(function (acc, icon, iconName) {\n if (icon[3]) {\n acc[icon[3]] = iconName;\n }\n\n return acc;\n });\n _byLigature = lookup(function (acc, icon, iconName) {\n var ligatures = icon[2];\n acc[iconName] = iconName;\n ligatures.forEach(function (ligature) {\n acc[ligature] = iconName;\n });\n return acc;\n });\n var hasRegular = 'far' in styles;\n _byOldName = reduce(shims, function (acc, shim) {\n var oldName = shim[0];\n var prefix = shim[1];\n var iconName = shim[2];\n\n if (prefix === 'far' && !hasRegular) {\n prefix = 'fas';\n }\n\n acc[oldName] = {\n prefix: prefix,\n iconName: iconName\n };\n return acc;\n }, {});\n};\nbuild();\nfunction byUnicode(prefix, unicode) {\n return (_byUnicode[prefix] || {})[unicode];\n}\nfunction byLigature(prefix, ligature) {\n return (_byLigature[prefix] || {})[ligature];\n}\nfunction byOldName(name) {\n return _byOldName[name] || {\n prefix: null,\n iconName: null\n };\n}\n\nvar styles$1 = namespace.styles;\nvar emptyCanonicalIcon = function emptyCanonicalIcon() {\n return {\n prefix: null,\n iconName: null,\n rest: []\n };\n};\nfunction getCanonicalIcon(values) {\n return values.reduce(function (acc, cls) {\n var iconName = getIconName(config.familyPrefix, cls);\n\n if (styles$1[cls]) {\n acc.prefix = cls;\n } else if (config.autoFetchSvg && Object.keys(PREFIX_TO_STYLE).indexOf(cls) > -1) {\n acc.prefix = cls;\n } else if (iconName) {\n var shim = acc.prefix === 'fa' ? byOldName(iconName) : {};\n acc.iconName = shim.iconName || iconName;\n acc.prefix = shim.prefix || acc.prefix;\n } else if (cls !== config.replacementClass && cls.indexOf('fa-w-') !== 0) {\n acc.rest.push(cls);\n }\n\n return acc;\n }, emptyCanonicalIcon());\n}\nfunction iconFromMapping(mapping, prefix, iconName) {\n if (mapping && mapping[prefix] && mapping[prefix][iconName]) {\n return {\n prefix: prefix,\n iconName: iconName,\n icon: mapping[prefix][iconName]\n };\n }\n}\n\nfunction toHtml(abstractNodes) {\n var tag = abstractNodes.tag,\n _abstractNodes$attrib = abstractNodes.attributes,\n attributes = _abstractNodes$attrib === void 0 ? {} : _abstractNodes$attrib,\n _abstractNodes$childr = abstractNodes.children,\n children = _abstractNodes$childr === void 0 ? [] : _abstractNodes$childr;\n\n if (typeof abstractNodes === 'string') {\n return htmlEscape(abstractNodes);\n } else {\n return \"<\".concat(tag, \" \").concat(joinAttributes(attributes), \">\").concat(children.map(toHtml).join(''), \"\");\n }\n}\n\nvar noop$2 = function noop() {};\n\nfunction isWatched(node) {\n var i2svg = node.getAttribute ? node.getAttribute(DATA_FA_I2SVG) : null;\n return typeof i2svg === 'string';\n}\n\nfunction getMutator() {\n if (config.autoReplaceSvg === true) {\n return mutators.replace;\n }\n\n var mutator = mutators[config.autoReplaceSvg];\n return mutator || mutators.replace;\n}\n\nvar mutators = {\n replace: function replace(mutation) {\n var node = mutation[0];\n var abstract = mutation[1];\n var newOuterHTML = abstract.map(function (a) {\n return toHtml(a);\n }).join('\\n');\n\n if (node.parentNode && node.outerHTML) {\n node.outerHTML = newOuterHTML + (config.keepOriginalSource && node.tagName.toLowerCase() !== 'svg' ? \"\") : '');\n } else if (node.parentNode) {\n var newNode = document.createElement('span');\n node.parentNode.replaceChild(newNode, node);\n newNode.outerHTML = newOuterHTML;\n }\n },\n nest: function nest(mutation) {\n var node = mutation[0];\n var abstract = mutation[1]; // If we already have a replaced node we do not want to continue nesting within it.\n // Short-circuit to the standard replacement\n\n if (~classArray(node).indexOf(config.replacementClass)) {\n return mutators.replace(mutation);\n }\n\n var forSvg = new RegExp(\"\".concat(config.familyPrefix, \"-.*\"));\n delete abstract[0].attributes.style;\n delete abstract[0].attributes.id;\n var splitClasses = abstract[0].attributes.class.split(' ').reduce(function (acc, cls) {\n if (cls === config.replacementClass || cls.match(forSvg)) {\n acc.toSvg.push(cls);\n } else {\n acc.toNode.push(cls);\n }\n\n return acc;\n }, {\n toNode: [],\n toSvg: []\n });\n abstract[0].attributes.class = splitClasses.toSvg.join(' ');\n var newInnerHTML = abstract.map(function (a) {\n return toHtml(a);\n }).join('\\n');\n node.setAttribute('class', splitClasses.toNode.join(' '));\n node.setAttribute(DATA_FA_I2SVG, '');\n node.innerHTML = newInnerHTML;\n }\n};\n\nfunction performOperationSync(op) {\n op();\n}\n\nfunction perform(mutations, callback) {\n var callbackFunction = typeof callback === 'function' ? callback : noop$2;\n\n if (mutations.length === 0) {\n callbackFunction();\n } else {\n var frame = performOperationSync;\n\n if (config.mutateApproach === MUTATION_APPROACH_ASYNC) {\n frame = WINDOW.requestAnimationFrame || performOperationSync;\n }\n\n frame(function () {\n var mutator = getMutator();\n var mark = perf.begin('mutate');\n mutations.map(mutator);\n mark();\n callbackFunction();\n });\n }\n}\nvar disabled = false;\nfunction disableObservation() {\n disabled = true;\n}\nfunction enableObservation() {\n disabled = false;\n}\nvar mo = null;\nfunction observe(options) {\n if (!MUTATION_OBSERVER) {\n return;\n }\n\n if (!config.observeMutations) {\n return;\n }\n\n var treeCallback = options.treeCallback,\n nodeCallback = options.nodeCallback,\n pseudoElementsCallback = options.pseudoElementsCallback,\n _options$observeMutat = options.observeMutationsRoot,\n observeMutationsRoot = _options$observeMutat === void 0 ? DOCUMENT : _options$observeMutat;\n mo = new MUTATION_OBSERVER(function (objects) {\n if (disabled) return;\n toArray(objects).forEach(function (mutationRecord) {\n if (mutationRecord.type === 'childList' && mutationRecord.addedNodes.length > 0 && !isWatched(mutationRecord.addedNodes[0])) {\n if (config.searchPseudoElements) {\n pseudoElementsCallback(mutationRecord.target);\n }\n\n treeCallback(mutationRecord.target);\n }\n\n if (mutationRecord.type === 'attributes' && mutationRecord.target.parentNode && config.searchPseudoElements) {\n pseudoElementsCallback(mutationRecord.target.parentNode);\n }\n\n if (mutationRecord.type === 'attributes' && isWatched(mutationRecord.target) && ~ATTRIBUTES_WATCHED_FOR_MUTATION.indexOf(mutationRecord.attributeName)) {\n if (mutationRecord.attributeName === 'class') {\n var _getCanonicalIcon = getCanonicalIcon(classArray(mutationRecord.target)),\n prefix = _getCanonicalIcon.prefix,\n iconName = _getCanonicalIcon.iconName;\n\n if (prefix) mutationRecord.target.setAttribute('data-prefix', prefix);\n if (iconName) mutationRecord.target.setAttribute('data-icon', iconName);\n } else {\n nodeCallback(mutationRecord.target);\n }\n }\n });\n });\n if (!IS_DOM) return;\n mo.observe(observeMutationsRoot, {\n childList: true,\n attributes: true,\n characterData: true,\n subtree: true\n });\n}\nfunction disconnect() {\n if (!mo) return;\n mo.disconnect();\n}\n\nfunction styleParser (node) {\n var style = node.getAttribute('style');\n var val = [];\n\n if (style) {\n val = style.split(';').reduce(function (acc, style) {\n var styles = style.split(':');\n var prop = styles[0];\n var value = styles.slice(1);\n\n if (prop && value.length > 0) {\n acc[prop] = value.join(':').trim();\n }\n\n return acc;\n }, {});\n }\n\n return val;\n}\n\nfunction classParser (node) {\n var existingPrefix = node.getAttribute('data-prefix');\n var existingIconName = node.getAttribute('data-icon');\n var innerText = node.innerText !== undefined ? node.innerText.trim() : '';\n var val = getCanonicalIcon(classArray(node));\n\n if (existingPrefix && existingIconName) {\n val.prefix = existingPrefix;\n val.iconName = existingIconName;\n }\n\n if (val.prefix && innerText.length > 1) {\n val.iconName = byLigature(val.prefix, node.innerText);\n } else if (val.prefix && innerText.length === 1) {\n val.iconName = byUnicode(val.prefix, toHex(node.innerText));\n }\n\n return val;\n}\n\nvar parseTransformString = function parseTransformString(transformString) {\n var transform = {\n size: 16,\n x: 0,\n y: 0,\n flipX: false,\n flipY: false,\n rotate: 0\n };\n\n if (!transformString) {\n return transform;\n } else {\n return transformString.toLowerCase().split(' ').reduce(function (acc, n) {\n var parts = n.toLowerCase().split('-');\n var first = parts[0];\n var rest = parts.slice(1).join('-');\n\n if (first && rest === 'h') {\n acc.flipX = true;\n return acc;\n }\n\n if (first && rest === 'v') {\n acc.flipY = true;\n return acc;\n }\n\n rest = parseFloat(rest);\n\n if (isNaN(rest)) {\n return acc;\n }\n\n switch (first) {\n case 'grow':\n acc.size = acc.size + rest;\n break;\n\n case 'shrink':\n acc.size = acc.size - rest;\n break;\n\n case 'left':\n acc.x = acc.x - rest;\n break;\n\n case 'right':\n acc.x = acc.x + rest;\n break;\n\n case 'up':\n acc.y = acc.y - rest;\n break;\n\n case 'down':\n acc.y = acc.y + rest;\n break;\n\n case 'rotate':\n acc.rotate = acc.rotate + rest;\n break;\n }\n\n return acc;\n }, transform);\n }\n};\nfunction transformParser (node) {\n return parseTransformString(node.getAttribute('data-fa-transform'));\n}\n\nfunction symbolParser (node) {\n var symbol = node.getAttribute('data-fa-symbol');\n return symbol === null ? false : symbol === '' ? true : symbol;\n}\n\nfunction attributesParser (node) {\n var extraAttributes = toArray(node.attributes).reduce(function (acc, attr) {\n if (acc.name !== 'class' && acc.name !== 'style') {\n acc[attr.name] = attr.value;\n }\n\n return acc;\n }, {});\n var title = node.getAttribute('title');\n var titleId = node.getAttribute('data-fa-title-id');\n\n if (config.autoA11y) {\n if (title) {\n extraAttributes['aria-labelledby'] = \"\".concat(config.replacementClass, \"-title-\").concat(titleId || nextUniqueId());\n } else {\n extraAttributes['aria-hidden'] = 'true';\n extraAttributes['focusable'] = 'false';\n }\n }\n\n return extraAttributes;\n}\n\nfunction maskParser (node) {\n var mask = node.getAttribute('data-fa-mask');\n\n if (!mask) {\n return emptyCanonicalIcon();\n } else {\n return getCanonicalIcon(mask.split(' ').map(function (i) {\n return i.trim();\n }));\n }\n}\n\nfunction blankMeta() {\n return {\n iconName: null,\n title: null,\n titleId: null,\n prefix: null,\n transform: meaninglessTransform,\n symbol: false,\n mask: null,\n maskId: null,\n extra: {\n classes: [],\n styles: {},\n attributes: {}\n }\n };\n}\nfunction parseMeta(node) {\n var _classParser = classParser(node),\n iconName = _classParser.iconName,\n prefix = _classParser.prefix,\n extraClasses = _classParser.rest;\n\n var extraStyles = styleParser(node);\n var transform = transformParser(node);\n var symbol = symbolParser(node);\n var extraAttributes = attributesParser(node);\n var mask = maskParser(node);\n return {\n iconName: iconName,\n title: node.getAttribute('title'),\n titleId: node.getAttribute('data-fa-title-id'),\n prefix: prefix,\n transform: transform,\n symbol: symbol,\n mask: mask,\n maskId: node.getAttribute('data-fa-mask-id'),\n extra: {\n classes: extraClasses,\n styles: extraStyles,\n attributes: extraAttributes\n }\n };\n}\n\nfunction MissingIcon(error) {\n this.name = 'MissingIcon';\n this.message = error || 'Icon unavailable';\n this.stack = new Error().stack;\n}\nMissingIcon.prototype = Object.create(Error.prototype);\nMissingIcon.prototype.constructor = MissingIcon;\n\nvar FILL = {\n fill: 'currentColor'\n};\nvar ANIMATION_BASE = {\n attributeType: 'XML',\n repeatCount: 'indefinite',\n dur: '2s'\n};\nvar RING = {\n tag: 'path',\n attributes: _objectSpread({}, FILL, {\n d: 'M156.5,447.7l-12.6,29.5c-18.7-9.5-35.9-21.2-51.5-34.9l22.7-22.7C127.6,430.5,141.5,440,156.5,447.7z M40.6,272H8.5 c1.4,21.2,5.4,41.7,11.7,61.1L50,321.2C45.1,305.5,41.8,289,40.6,272z M40.6,240c1.4-18.8,5.2-37,11.1-54.1l-29.5-12.6 C14.7,194.3,10,216.7,8.5,240H40.6z M64.3,156.5c7.8-14.9,17.2-28.8,28.1-41.5L69.7,92.3c-13.7,15.6-25.5,32.8-34.9,51.5 L64.3,156.5z M397,419.6c-13.9,12-29.4,22.3-46.1,30.4l11.9,29.8c20.7-9.9,39.8-22.6,56.9-37.6L397,419.6z M115,92.4 c13.9-12,29.4-22.3,46.1-30.4l-11.9-29.8c-20.7,9.9-39.8,22.6-56.8,37.6L115,92.4z M447.7,355.5c-7.8,14.9-17.2,28.8-28.1,41.5 l22.7,22.7c13.7-15.6,25.5-32.9,34.9-51.5L447.7,355.5z M471.4,272c-1.4,18.8-5.2,37-11.1,54.1l29.5,12.6 c7.5-21.1,12.2-43.5,13.6-66.8H471.4z M321.2,462c-15.7,5-32.2,8.2-49.2,9.4v32.1c21.2-1.4,41.7-5.4,61.1-11.7L321.2,462z M240,471.4c-18.8-1.4-37-5.2-54.1-11.1l-12.6,29.5c21.1,7.5,43.5,12.2,66.8,13.6V471.4z M462,190.8c5,15.7,8.2,32.2,9.4,49.2h32.1 c-1.4-21.2-5.4-41.7-11.7-61.1L462,190.8z M92.4,397c-12-13.9-22.3-29.4-30.4-46.1l-29.8,11.9c9.9,20.7,22.6,39.8,37.6,56.9 L92.4,397z M272,40.6c18.8,1.4,36.9,5.2,54.1,11.1l12.6-29.5C317.7,14.7,295.3,10,272,8.5V40.6z M190.8,50 c15.7-5,32.2-8.2,49.2-9.4V8.5c-21.2,1.4-41.7,5.4-61.1,11.7L190.8,50z M442.3,92.3L419.6,115c12,13.9,22.3,29.4,30.5,46.1 l29.8-11.9C470,128.5,457.3,109.4,442.3,92.3z M397,92.4l22.7-22.7c-15.6-13.7-32.8-25.5-51.5-34.9l-12.6,29.5 C370.4,72.1,384.4,81.5,397,92.4z'\n })\n};\n\nvar OPACITY_ANIMATE = _objectSpread({}, ANIMATION_BASE, {\n attributeName: 'opacity'\n});\n\nvar DOT = {\n tag: 'circle',\n attributes: _objectSpread({}, FILL, {\n cx: '256',\n cy: '364',\n r: '28'\n }),\n children: [{\n tag: 'animate',\n attributes: _objectSpread({}, ANIMATION_BASE, {\n attributeName: 'r',\n values: '28;14;28;28;14;28;'\n })\n }, {\n tag: 'animate',\n attributes: _objectSpread({}, OPACITY_ANIMATE, {\n values: '1;0;1;1;0;1;'\n })\n }]\n};\nvar QUESTION = {\n tag: 'path',\n attributes: _objectSpread({}, FILL, {\n opacity: '1',\n d: 'M263.7,312h-16c-6.6,0-12-5.4-12-12c0-71,77.4-63.9,77.4-107.8c0-20-17.8-40.2-57.4-40.2c-29.1,0-44.3,9.6-59.2,28.7 c-3.9,5-11.1,6-16.2,2.4l-13.1-9.2c-5.6-3.9-6.9-11.8-2.6-17.2c21.2-27.2,46.4-44.7,91.2-44.7c52.3,0,97.4,29.8,97.4,80.2 c0,67.6-77.4,63.5-77.4,107.8C275.7,306.6,270.3,312,263.7,312z'\n }),\n children: [{\n tag: 'animate',\n attributes: _objectSpread({}, OPACITY_ANIMATE, {\n values: '1;0;0;0;0;1;'\n })\n }]\n};\nvar EXCLAMATION = {\n tag: 'path',\n attributes: _objectSpread({}, FILL, {\n opacity: '0',\n d: 'M232.5,134.5l7,168c0.3,6.4,5.6,11.5,12,11.5h9c6.4,0,11.7-5.1,12-11.5l7-168c0.3-6.8-5.2-12.5-12-12.5h-23 C237.7,122,232.2,127.7,232.5,134.5z'\n }),\n children: [{\n tag: 'animate',\n attributes: _objectSpread({}, OPACITY_ANIMATE, {\n values: '0;0;1;1;0;0;'\n })\n }]\n};\nvar missing = {\n tag: 'g',\n children: [RING, DOT, QUESTION, EXCLAMATION]\n};\n\nvar styles$2 = namespace.styles;\nfunction asFoundIcon(icon) {\n var width = icon[0];\n var height = icon[1];\n\n var _icon$slice = icon.slice(4),\n _icon$slice2 = _slicedToArray(_icon$slice, 1),\n vectorData = _icon$slice2[0];\n\n var element = null;\n\n if (Array.isArray(vectorData)) {\n element = {\n tag: 'g',\n attributes: {\n class: \"\".concat(config.familyPrefix, \"-\").concat(DUOTONE_CLASSES.GROUP)\n },\n children: [{\n tag: 'path',\n attributes: {\n class: \"\".concat(config.familyPrefix, \"-\").concat(DUOTONE_CLASSES.SECONDARY),\n fill: 'currentColor',\n d: vectorData[0]\n }\n }, {\n tag: 'path',\n attributes: {\n class: \"\".concat(config.familyPrefix, \"-\").concat(DUOTONE_CLASSES.PRIMARY),\n fill: 'currentColor',\n d: vectorData[1]\n }\n }]\n };\n } else {\n element = {\n tag: 'path',\n attributes: {\n fill: 'currentColor',\n d: vectorData\n }\n };\n }\n\n return {\n found: true,\n width: width,\n height: height,\n icon: element\n };\n}\nfunction findIcon(iconName, prefix) {\n return new picked(function (resolve, reject) {\n var val = {\n found: false,\n width: 512,\n height: 512,\n icon: missing\n };\n\n if (iconName && prefix && styles$2[prefix] && styles$2[prefix][iconName]) {\n var icon = styles$2[prefix][iconName];\n return resolve(asFoundIcon(icon));\n }\n\n if (iconName && prefix && !config.showMissingIcons) {\n reject(new MissingIcon(\"Icon is missing for prefix \".concat(prefix, \" with icon name \").concat(iconName)));\n } else {\n resolve(val);\n }\n });\n}\n\nvar styles$3 = namespace.styles;\n\nfunction generateSvgReplacementMutation(node, nodeMeta) {\n var iconName = nodeMeta.iconName,\n title = nodeMeta.title,\n titleId = nodeMeta.titleId,\n prefix = nodeMeta.prefix,\n transform = nodeMeta.transform,\n symbol = nodeMeta.symbol,\n mask = nodeMeta.mask,\n maskId = nodeMeta.maskId,\n extra = nodeMeta.extra;\n return new picked(function (resolve, reject) {\n picked.all([findIcon(iconName, prefix), findIcon(mask.iconName, mask.prefix)]).then(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n main = _ref2[0],\n mask = _ref2[1];\n\n resolve([node, makeInlineSvgAbstract({\n icons: {\n main: main,\n mask: mask\n },\n prefix: prefix,\n iconName: iconName,\n transform: transform,\n symbol: symbol,\n mask: mask,\n maskId: maskId,\n title: title,\n titleId: titleId,\n extra: extra,\n watchable: true\n })]);\n });\n });\n}\n\nfunction generateLayersText(node, nodeMeta) {\n var title = nodeMeta.title,\n transform = nodeMeta.transform,\n extra = nodeMeta.extra;\n var width = null;\n var height = null;\n\n if (IS_IE) {\n var computedFontSize = parseInt(getComputedStyle(node).fontSize, 10);\n var boundingClientRect = node.getBoundingClientRect();\n width = boundingClientRect.width / computedFontSize;\n height = boundingClientRect.height / computedFontSize;\n }\n\n if (config.autoA11y && !title) {\n extra.attributes['aria-hidden'] = 'true';\n }\n\n return picked.resolve([node, makeLayersTextAbstract({\n content: node.innerHTML,\n width: width,\n height: height,\n transform: transform,\n title: title,\n extra: extra,\n watchable: true\n })]);\n}\n\nfunction generateMutation(node) {\n var nodeMeta = parseMeta(node);\n\n if (~nodeMeta.extra.classes.indexOf(LAYERS_TEXT_CLASSNAME)) {\n return generateLayersText(node, nodeMeta);\n } else {\n return generateSvgReplacementMutation(node, nodeMeta);\n }\n}\n\nfunction onTree(root) {\n var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n if (!IS_DOM) return;\n var htmlClassList = DOCUMENT.documentElement.classList;\n\n var hclAdd = function hclAdd(suffix) {\n return htmlClassList.add(\"\".concat(HTML_CLASS_I2SVG_BASE_CLASS, \"-\").concat(suffix));\n };\n\n var hclRemove = function hclRemove(suffix) {\n return htmlClassList.remove(\"\".concat(HTML_CLASS_I2SVG_BASE_CLASS, \"-\").concat(suffix));\n };\n\n var prefixes = config.autoFetchSvg ? Object.keys(PREFIX_TO_STYLE) : Object.keys(styles$3);\n var prefixesDomQuery = [\".\".concat(LAYERS_TEXT_CLASSNAME, \":not([\").concat(DATA_FA_I2SVG, \"])\")].concat(prefixes.map(function (p) {\n return \".\".concat(p, \":not([\").concat(DATA_FA_I2SVG, \"])\");\n })).join(', ');\n\n if (prefixesDomQuery.length === 0) {\n return;\n }\n\n var candidates = [];\n\n try {\n candidates = toArray(root.querySelectorAll(prefixesDomQuery));\n } catch (e) {// noop\n }\n\n if (candidates.length > 0) {\n hclAdd('pending');\n hclRemove('complete');\n } else {\n return;\n }\n\n var mark = perf.begin('onTree');\n var mutations = candidates.reduce(function (acc, node) {\n try {\n var mutation = generateMutation(node);\n\n if (mutation) {\n acc.push(mutation);\n }\n } catch (e) {\n if (!PRODUCTION) {\n if (e instanceof MissingIcon) {\n console.error(e);\n }\n }\n }\n\n return acc;\n }, []);\n return new picked(function (resolve, reject) {\n picked.all(mutations).then(function (resolvedMutations) {\n perform(resolvedMutations, function () {\n hclAdd('active');\n hclAdd('complete');\n hclRemove('pending');\n if (typeof callback === 'function') callback();\n mark();\n resolve();\n });\n }).catch(function () {\n mark();\n reject();\n });\n });\n}\nfunction onNode(node) {\n var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n generateMutation(node).then(function (mutation) {\n if (mutation) {\n perform([mutation], callback);\n }\n });\n}\n\nfunction replaceForPosition(node, position) {\n var pendingAttribute = \"\".concat(DATA_FA_PSEUDO_ELEMENT_PENDING).concat(position.replace(':', '-'));\n return new picked(function (resolve, reject) {\n if (node.getAttribute(pendingAttribute) !== null) {\n // This node is already being processed\n return resolve();\n }\n\n var children = toArray(node.children);\n var alreadyProcessedPseudoElement = children.filter(function (c) {\n return c.getAttribute(DATA_FA_PSEUDO_ELEMENT) === position;\n })[0];\n var styles = WINDOW.getComputedStyle(node, position);\n var fontFamily = styles.getPropertyValue('font-family').match(FONT_FAMILY_PATTERN);\n var fontWeight = styles.getPropertyValue('font-weight');\n var content = styles.getPropertyValue('content');\n\n if (alreadyProcessedPseudoElement && !fontFamily) {\n // If we've already processed it but the current computed style does not result in a font-family,\n // that probably means that a class name that was previously present to make the icon has been\n // removed. So we now should delete the icon.\n node.removeChild(alreadyProcessedPseudoElement);\n return resolve();\n } else if (fontFamily && content !== 'none' && content !== '') {\n var _content = styles.getPropertyValue('content');\n\n var prefix = ~['Solid', 'Regular', 'Light', 'Duotone', 'Brands', 'Kit'].indexOf(fontFamily[2]) ? STYLE_TO_PREFIX[fontFamily[2].toLowerCase()] : FONT_WEIGHT_TO_PREFIX[fontWeight];\n var hexValue = toHex(_content.length === 3 ? _content.substr(1, 1) : _content);\n var iconName = byUnicode(prefix, hexValue);\n var iconIdentifier = iconName; // Only convert the pseudo element in this :before/:after position into an icon if we haven't\n // already done so with the same prefix and iconName\n\n if (iconName && (!alreadyProcessedPseudoElement || alreadyProcessedPseudoElement.getAttribute(DATA_PREFIX) !== prefix || alreadyProcessedPseudoElement.getAttribute(DATA_ICON) !== iconIdentifier)) {\n node.setAttribute(pendingAttribute, iconIdentifier);\n\n if (alreadyProcessedPseudoElement) {\n // Delete the old one, since we're replacing it with a new one\n node.removeChild(alreadyProcessedPseudoElement);\n }\n\n var meta = blankMeta();\n var extra = meta.extra;\n extra.attributes[DATA_FA_PSEUDO_ELEMENT] = position;\n findIcon(iconName, prefix).then(function (main) {\n var abstract = makeInlineSvgAbstract(_objectSpread({}, meta, {\n icons: {\n main: main,\n mask: emptyCanonicalIcon()\n },\n prefix: prefix,\n iconName: iconIdentifier,\n extra: extra,\n watchable: true\n }));\n var element = DOCUMENT.createElement('svg');\n\n if (position === ':before') {\n node.insertBefore(element, node.firstChild);\n } else {\n node.appendChild(element);\n }\n\n element.outerHTML = abstract.map(function (a) {\n return toHtml(a);\n }).join('\\n');\n node.removeAttribute(pendingAttribute);\n resolve();\n }).catch(reject);\n } else {\n resolve();\n }\n } else {\n resolve();\n }\n });\n}\n\nfunction replace(node) {\n return picked.all([replaceForPosition(node, ':before'), replaceForPosition(node, ':after')]);\n}\n\nfunction processable(node) {\n return node.parentNode !== document.head && !~TAGNAMES_TO_SKIP_FOR_PSEUDOELEMENTS.indexOf(node.tagName.toUpperCase()) && !node.getAttribute(DATA_FA_PSEUDO_ELEMENT) && (!node.parentNode || node.parentNode.tagName !== 'svg');\n}\n\nfunction searchPseudoElements (root) {\n if (!IS_DOM) return;\n return new picked(function (resolve, reject) {\n var operations = toArray(root.querySelectorAll('*')).filter(processable).map(replace);\n var end = perf.begin('searchPseudoElements');\n disableObservation();\n picked.all(operations).then(function () {\n end();\n enableObservation();\n resolve();\n }).catch(function () {\n end();\n enableObservation();\n reject();\n });\n });\n}\n\nvar baseStyles = \"svg:not(:root).svg-inline--fa {\\n overflow: visible;\\n}\\n\\n.svg-inline--fa {\\n display: inline-block;\\n font-size: inherit;\\n height: 1em;\\n overflow: visible;\\n vertical-align: -0.125em;\\n}\\n.svg-inline--fa.fa-lg {\\n vertical-align: -0.225em;\\n}\\n.svg-inline--fa.fa-w-1 {\\n width: 0.0625em;\\n}\\n.svg-inline--fa.fa-w-2 {\\n width: 0.125em;\\n}\\n.svg-inline--fa.fa-w-3 {\\n width: 0.1875em;\\n}\\n.svg-inline--fa.fa-w-4 {\\n width: 0.25em;\\n}\\n.svg-inline--fa.fa-w-5 {\\n width: 0.3125em;\\n}\\n.svg-inline--fa.fa-w-6 {\\n width: 0.375em;\\n}\\n.svg-inline--fa.fa-w-7 {\\n width: 0.4375em;\\n}\\n.svg-inline--fa.fa-w-8 {\\n width: 0.5em;\\n}\\n.svg-inline--fa.fa-w-9 {\\n width: 0.5625em;\\n}\\n.svg-inline--fa.fa-w-10 {\\n width: 0.625em;\\n}\\n.svg-inline--fa.fa-w-11 {\\n width: 0.6875em;\\n}\\n.svg-inline--fa.fa-w-12 {\\n width: 0.75em;\\n}\\n.svg-inline--fa.fa-w-13 {\\n width: 0.8125em;\\n}\\n.svg-inline--fa.fa-w-14 {\\n width: 0.875em;\\n}\\n.svg-inline--fa.fa-w-15 {\\n width: 0.9375em;\\n}\\n.svg-inline--fa.fa-w-16 {\\n width: 1em;\\n}\\n.svg-inline--fa.fa-w-17 {\\n width: 1.0625em;\\n}\\n.svg-inline--fa.fa-w-18 {\\n width: 1.125em;\\n}\\n.svg-inline--fa.fa-w-19 {\\n width: 1.1875em;\\n}\\n.svg-inline--fa.fa-w-20 {\\n width: 1.25em;\\n}\\n.svg-inline--fa.fa-pull-left {\\n margin-right: 0.3em;\\n width: auto;\\n}\\n.svg-inline--fa.fa-pull-right {\\n margin-left: 0.3em;\\n width: auto;\\n}\\n.svg-inline--fa.fa-border {\\n height: 1.5em;\\n}\\n.svg-inline--fa.fa-li {\\n width: 2em;\\n}\\n.svg-inline--fa.fa-fw {\\n width: 1.25em;\\n}\\n\\n.fa-layers svg.svg-inline--fa {\\n bottom: 0;\\n left: 0;\\n margin: auto;\\n position: absolute;\\n right: 0;\\n top: 0;\\n}\\n\\n.fa-layers {\\n display: inline-block;\\n height: 1em;\\n position: relative;\\n text-align: center;\\n vertical-align: -0.125em;\\n width: 1em;\\n}\\n.fa-layers svg.svg-inline--fa {\\n -webkit-transform-origin: center center;\\n transform-origin: center center;\\n}\\n\\n.fa-layers-counter, .fa-layers-text {\\n display: inline-block;\\n position: absolute;\\n text-align: center;\\n}\\n\\n.fa-layers-text {\\n left: 50%;\\n top: 50%;\\n -webkit-transform: translate(-50%, -50%);\\n transform: translate(-50%, -50%);\\n -webkit-transform-origin: center center;\\n transform-origin: center center;\\n}\\n\\n.fa-layers-counter {\\n background-color: #ff253a;\\n border-radius: 1em;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n color: #fff;\\n height: 1.5em;\\n line-height: 1;\\n max-width: 5em;\\n min-width: 1.5em;\\n overflow: hidden;\\n padding: 0.25em;\\n right: 0;\\n text-overflow: ellipsis;\\n top: 0;\\n -webkit-transform: scale(0.25);\\n transform: scale(0.25);\\n -webkit-transform-origin: top right;\\n transform-origin: top right;\\n}\\n\\n.fa-layers-bottom-right {\\n bottom: 0;\\n right: 0;\\n top: auto;\\n -webkit-transform: scale(0.25);\\n transform: scale(0.25);\\n -webkit-transform-origin: bottom right;\\n transform-origin: bottom right;\\n}\\n\\n.fa-layers-bottom-left {\\n bottom: 0;\\n left: 0;\\n right: auto;\\n top: auto;\\n -webkit-transform: scale(0.25);\\n transform: scale(0.25);\\n -webkit-transform-origin: bottom left;\\n transform-origin: bottom left;\\n}\\n\\n.fa-layers-top-right {\\n right: 0;\\n top: 0;\\n -webkit-transform: scale(0.25);\\n transform: scale(0.25);\\n -webkit-transform-origin: top right;\\n transform-origin: top right;\\n}\\n\\n.fa-layers-top-left {\\n left: 0;\\n right: auto;\\n top: 0;\\n -webkit-transform: scale(0.25);\\n transform: scale(0.25);\\n -webkit-transform-origin: top left;\\n transform-origin: top left;\\n}\\n\\n.fa-lg {\\n font-size: 1.3333333333em;\\n line-height: 0.75em;\\n vertical-align: -0.0667em;\\n}\\n\\n.fa-xs {\\n font-size: 0.75em;\\n}\\n\\n.fa-sm {\\n font-size: 0.875em;\\n}\\n\\n.fa-1x {\\n font-size: 1em;\\n}\\n\\n.fa-2x {\\n font-size: 2em;\\n}\\n\\n.fa-3x {\\n font-size: 3em;\\n}\\n\\n.fa-4x {\\n font-size: 4em;\\n}\\n\\n.fa-5x {\\n font-size: 5em;\\n}\\n\\n.fa-6x {\\n font-size: 6em;\\n}\\n\\n.fa-7x {\\n font-size: 7em;\\n}\\n\\n.fa-8x {\\n font-size: 8em;\\n}\\n\\n.fa-9x {\\n font-size: 9em;\\n}\\n\\n.fa-10x {\\n font-size: 10em;\\n}\\n\\n.fa-fw {\\n text-align: center;\\n width: 1.25em;\\n}\\n\\n.fa-ul {\\n list-style-type: none;\\n margin-left: 2.5em;\\n padding-left: 0;\\n}\\n.fa-ul > li {\\n position: relative;\\n}\\n\\n.fa-li {\\n left: -2em;\\n position: absolute;\\n text-align: center;\\n width: 2em;\\n line-height: inherit;\\n}\\n\\n.fa-border {\\n border: solid 0.08em #eee;\\n border-radius: 0.1em;\\n padding: 0.2em 0.25em 0.15em;\\n}\\n\\n.fa-pull-left {\\n float: left;\\n}\\n\\n.fa-pull-right {\\n float: right;\\n}\\n\\n.fa.fa-pull-left,\\n.fas.fa-pull-left,\\n.far.fa-pull-left,\\n.fal.fa-pull-left,\\n.fab.fa-pull-left {\\n margin-right: 0.3em;\\n}\\n.fa.fa-pull-right,\\n.fas.fa-pull-right,\\n.far.fa-pull-right,\\n.fal.fa-pull-right,\\n.fab.fa-pull-right {\\n margin-left: 0.3em;\\n}\\n\\n.fa-spin {\\n -webkit-animation: fa-spin 2s infinite linear;\\n animation: fa-spin 2s infinite linear;\\n}\\n\\n.fa-pulse {\\n -webkit-animation: fa-spin 1s infinite steps(8);\\n animation: fa-spin 1s infinite steps(8);\\n}\\n\\n@-webkit-keyframes fa-spin {\\n 0% {\\n -webkit-transform: rotate(0deg);\\n transform: rotate(0deg);\\n }\\n 100% {\\n -webkit-transform: rotate(360deg);\\n transform: rotate(360deg);\\n }\\n}\\n\\n@keyframes fa-spin {\\n 0% {\\n -webkit-transform: rotate(0deg);\\n transform: rotate(0deg);\\n }\\n 100% {\\n -webkit-transform: rotate(360deg);\\n transform: rotate(360deg);\\n }\\n}\\n.fa-rotate-90 {\\n -ms-filter: \\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)\\\";\\n -webkit-transform: rotate(90deg);\\n transform: rotate(90deg);\\n}\\n\\n.fa-rotate-180 {\\n -ms-filter: \\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)\\\";\\n -webkit-transform: rotate(180deg);\\n transform: rotate(180deg);\\n}\\n\\n.fa-rotate-270 {\\n -ms-filter: \\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)\\\";\\n -webkit-transform: rotate(270deg);\\n transform: rotate(270deg);\\n}\\n\\n.fa-flip-horizontal {\\n -ms-filter: \\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)\\\";\\n -webkit-transform: scale(-1, 1);\\n transform: scale(-1, 1);\\n}\\n\\n.fa-flip-vertical {\\n -ms-filter: \\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)\\\";\\n -webkit-transform: scale(1, -1);\\n transform: scale(1, -1);\\n}\\n\\n.fa-flip-both, .fa-flip-horizontal.fa-flip-vertical {\\n -ms-filter: \\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)\\\";\\n -webkit-transform: scale(-1, -1);\\n transform: scale(-1, -1);\\n}\\n\\n:root .fa-rotate-90,\\n:root .fa-rotate-180,\\n:root .fa-rotate-270,\\n:root .fa-flip-horizontal,\\n:root .fa-flip-vertical,\\n:root .fa-flip-both {\\n -webkit-filter: none;\\n filter: none;\\n}\\n\\n.fa-stack {\\n display: inline-block;\\n height: 2em;\\n position: relative;\\n width: 2.5em;\\n}\\n\\n.fa-stack-1x,\\n.fa-stack-2x {\\n bottom: 0;\\n left: 0;\\n margin: auto;\\n position: absolute;\\n right: 0;\\n top: 0;\\n}\\n\\n.svg-inline--fa.fa-stack-1x {\\n height: 1em;\\n width: 1.25em;\\n}\\n.svg-inline--fa.fa-stack-2x {\\n height: 2em;\\n width: 2.5em;\\n}\\n\\n.fa-inverse {\\n color: #fff;\\n}\\n\\n.sr-only {\\n border: 0;\\n clip: rect(0, 0, 0, 0);\\n height: 1px;\\n margin: -1px;\\n overflow: hidden;\\n padding: 0;\\n position: absolute;\\n width: 1px;\\n}\\n\\n.sr-only-focusable:active, .sr-only-focusable:focus {\\n clip: auto;\\n height: auto;\\n margin: 0;\\n overflow: visible;\\n position: static;\\n width: auto;\\n}\\n\\n.svg-inline--fa .fa-primary {\\n fill: var(--fa-primary-color, currentColor);\\n opacity: 1;\\n opacity: var(--fa-primary-opacity, 1);\\n}\\n\\n.svg-inline--fa .fa-secondary {\\n fill: var(--fa-secondary-color, currentColor);\\n opacity: 0.4;\\n opacity: var(--fa-secondary-opacity, 0.4);\\n}\\n\\n.svg-inline--fa.fa-swap-opacity .fa-primary {\\n opacity: 0.4;\\n opacity: var(--fa-secondary-opacity, 0.4);\\n}\\n\\n.svg-inline--fa.fa-swap-opacity .fa-secondary {\\n opacity: 1;\\n opacity: var(--fa-primary-opacity, 1);\\n}\\n\\n.svg-inline--fa mask .fa-primary,\\n.svg-inline--fa mask .fa-secondary {\\n fill: black;\\n}\\n\\n.fad.fa-inverse {\\n color: #fff;\\n}\";\n\nfunction css () {\n var dfp = DEFAULT_FAMILY_PREFIX;\n var drc = DEFAULT_REPLACEMENT_CLASS;\n var fp = config.familyPrefix;\n var rc = config.replacementClass;\n var s = baseStyles;\n\n if (fp !== dfp || rc !== drc) {\n var dPatt = new RegExp(\"\\\\.\".concat(dfp, \"\\\\-\"), 'g');\n var customPropPatt = new RegExp(\"\\\\--\".concat(dfp, \"\\\\-\"), 'g');\n var rPatt = new RegExp(\"\\\\.\".concat(drc), 'g');\n s = s.replace(dPatt, \".\".concat(fp, \"-\")).replace(customPropPatt, \"--\".concat(fp, \"-\")).replace(rPatt, \".\".concat(rc));\n }\n\n return s;\n}\n\nvar Library =\n/*#__PURE__*/\nfunction () {\n function Library() {\n _classCallCheck(this, Library);\n\n this.definitions = {};\n }\n\n _createClass(Library, [{\n key: \"add\",\n value: function add() {\n var _this = this;\n\n for (var _len = arguments.length, definitions = new Array(_len), _key = 0; _key < _len; _key++) {\n definitions[_key] = arguments[_key];\n }\n\n var additions = definitions.reduce(this._pullDefinitions, {});\n Object.keys(additions).forEach(function (key) {\n _this.definitions[key] = _objectSpread({}, _this.definitions[key] || {}, additions[key]);\n defineIcons(key, additions[key]);\n build();\n });\n }\n }, {\n key: \"reset\",\n value: function reset() {\n this.definitions = {};\n }\n }, {\n key: \"_pullDefinitions\",\n value: function _pullDefinitions(additions, definition) {\n var normalized = definition.prefix && definition.iconName && definition.icon ? {\n 0: definition\n } : definition;\n Object.keys(normalized).map(function (key) {\n var _normalized$key = normalized[key],\n prefix = _normalized$key.prefix,\n iconName = _normalized$key.iconName,\n icon = _normalized$key.icon;\n if (!additions[prefix]) additions[prefix] = {};\n additions[prefix][iconName] = icon;\n });\n return additions;\n }\n }]);\n\n return Library;\n}();\n\nfunction ensureCss() {\n if (config.autoAddCss && !_cssInserted) {\n insertCss(css());\n\n _cssInserted = true;\n }\n}\n\nfunction apiObject(val, abstractCreator) {\n Object.defineProperty(val, 'abstract', {\n get: abstractCreator\n });\n Object.defineProperty(val, 'html', {\n get: function get() {\n return val.abstract.map(function (a) {\n return toHtml(a);\n });\n }\n });\n Object.defineProperty(val, 'node', {\n get: function get() {\n if (!IS_DOM) return;\n var container = DOCUMENT.createElement('div');\n container.innerHTML = val.html;\n return container.children;\n }\n });\n return val;\n}\n\nfunction findIconDefinition(iconLookup) {\n var _iconLookup$prefix = iconLookup.prefix,\n prefix = _iconLookup$prefix === void 0 ? 'fa' : _iconLookup$prefix,\n iconName = iconLookup.iconName;\n if (!iconName) return;\n return iconFromMapping(library.definitions, prefix, iconName) || iconFromMapping(namespace.styles, prefix, iconName);\n}\n\nfunction resolveIcons(next) {\n return function (maybeIconDefinition) {\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var iconDefinition = (maybeIconDefinition || {}).icon ? maybeIconDefinition : findIconDefinition(maybeIconDefinition || {});\n var mask = params.mask;\n\n if (mask) {\n mask = (mask || {}).icon ? mask : findIconDefinition(mask || {});\n }\n\n return next(iconDefinition, _objectSpread({}, params, {\n mask: mask\n }));\n };\n}\n\nvar library = new Library();\nvar noAuto = function noAuto() {\n config.autoReplaceSvg = false;\n config.observeMutations = false;\n disconnect();\n};\nvar _cssInserted = false;\nvar dom = {\n i2svg: function i2svg() {\n var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n if (IS_DOM) {\n ensureCss();\n var _params$node = params.node,\n node = _params$node === void 0 ? DOCUMENT : _params$node,\n _params$callback = params.callback,\n callback = _params$callback === void 0 ? function () {} : _params$callback;\n\n if (config.searchPseudoElements) {\n searchPseudoElements(node);\n }\n\n return onTree(node, callback);\n } else {\n return picked.reject('Operation requires a DOM of some kind.');\n }\n },\n css: css,\n insertCss: function insertCss$$1() {\n if (!_cssInserted) {\n insertCss(css());\n\n _cssInserted = true;\n }\n },\n watch: function watch() {\n var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var autoReplaceSvgRoot = params.autoReplaceSvgRoot,\n observeMutationsRoot = params.observeMutationsRoot;\n\n if (config.autoReplaceSvg === false) {\n config.autoReplaceSvg = true;\n }\n\n config.observeMutations = true;\n domready(function () {\n autoReplace({\n autoReplaceSvgRoot: autoReplaceSvgRoot\n });\n observe({\n treeCallback: onTree,\n nodeCallback: onNode,\n pseudoElementsCallback: searchPseudoElements,\n observeMutationsRoot: observeMutationsRoot\n });\n });\n }\n};\nvar parse = {\n transform: function transform(transformString) {\n return parseTransformString(transformString);\n }\n};\nvar icon = resolveIcons(function (iconDefinition) {\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _params$transform = params.transform,\n transform = _params$transform === void 0 ? meaninglessTransform : _params$transform,\n _params$symbol = params.symbol,\n symbol = _params$symbol === void 0 ? false : _params$symbol,\n _params$mask = params.mask,\n mask = _params$mask === void 0 ? null : _params$mask,\n _params$maskId = params.maskId,\n maskId = _params$maskId === void 0 ? null : _params$maskId,\n _params$title = params.title,\n title = _params$title === void 0 ? null : _params$title,\n _params$titleId = params.titleId,\n titleId = _params$titleId === void 0 ? null : _params$titleId,\n _params$classes = params.classes,\n classes = _params$classes === void 0 ? [] : _params$classes,\n _params$attributes = params.attributes,\n attributes = _params$attributes === void 0 ? {} : _params$attributes,\n _params$styles = params.styles,\n styles = _params$styles === void 0 ? {} : _params$styles;\n if (!iconDefinition) return;\n var prefix = iconDefinition.prefix,\n iconName = iconDefinition.iconName,\n icon = iconDefinition.icon;\n return apiObject(_objectSpread({\n type: 'icon'\n }, iconDefinition), function () {\n ensureCss();\n\n if (config.autoA11y) {\n if (title) {\n attributes['aria-labelledby'] = \"\".concat(config.replacementClass, \"-title-\").concat(titleId || nextUniqueId());\n } else {\n attributes['aria-hidden'] = 'true';\n attributes['focusable'] = 'false';\n }\n }\n\n return makeInlineSvgAbstract({\n icons: {\n main: asFoundIcon(icon),\n mask: mask ? asFoundIcon(mask.icon) : {\n found: false,\n width: null,\n height: null,\n icon: {}\n }\n },\n prefix: prefix,\n iconName: iconName,\n transform: _objectSpread({}, meaninglessTransform, transform),\n symbol: symbol,\n title: title,\n maskId: maskId,\n titleId: titleId,\n extra: {\n attributes: attributes,\n styles: styles,\n classes: classes\n }\n });\n });\n});\nvar text = function text(content) {\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _params$transform2 = params.transform,\n transform = _params$transform2 === void 0 ? meaninglessTransform : _params$transform2,\n _params$title2 = params.title,\n title = _params$title2 === void 0 ? null : _params$title2,\n _params$classes2 = params.classes,\n classes = _params$classes2 === void 0 ? [] : _params$classes2,\n _params$attributes2 = params.attributes,\n attributes = _params$attributes2 === void 0 ? {} : _params$attributes2,\n _params$styles2 = params.styles,\n styles = _params$styles2 === void 0 ? {} : _params$styles2;\n return apiObject({\n type: 'text',\n content: content\n }, function () {\n ensureCss();\n return makeLayersTextAbstract({\n content: content,\n transform: _objectSpread({}, meaninglessTransform, transform),\n title: title,\n extra: {\n attributes: attributes,\n styles: styles,\n classes: [\"\".concat(config.familyPrefix, \"-layers-text\")].concat(_toConsumableArray(classes))\n }\n });\n });\n};\nvar counter = function counter(content) {\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _params$title3 = params.title,\n title = _params$title3 === void 0 ? null : _params$title3,\n _params$classes3 = params.classes,\n classes = _params$classes3 === void 0 ? [] : _params$classes3,\n _params$attributes3 = params.attributes,\n attributes = _params$attributes3 === void 0 ? {} : _params$attributes3,\n _params$styles3 = params.styles,\n styles = _params$styles3 === void 0 ? {} : _params$styles3;\n return apiObject({\n type: 'counter',\n content: content\n }, function () {\n ensureCss();\n return makeLayersCounterAbstract({\n content: content.toString(),\n title: title,\n extra: {\n attributes: attributes,\n styles: styles,\n classes: [\"\".concat(config.familyPrefix, \"-layers-counter\")].concat(_toConsumableArray(classes))\n }\n });\n });\n};\nvar layer = function layer(assembler) {\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _params$classes4 = params.classes,\n classes = _params$classes4 === void 0 ? [] : _params$classes4;\n return apiObject({\n type: 'layer'\n }, function () {\n ensureCss();\n var children = [];\n assembler(function (args) {\n Array.isArray(args) ? args.map(function (a) {\n children = children.concat(a.abstract);\n }) : children = children.concat(args.abstract);\n });\n return [{\n tag: 'span',\n attributes: {\n class: [\"\".concat(config.familyPrefix, \"-layers\")].concat(_toConsumableArray(classes)).join(' ')\n },\n children: children\n }];\n });\n};\nvar api = {\n noAuto: noAuto,\n config: config,\n dom: dom,\n library: library,\n parse: parse,\n findIconDefinition: findIconDefinition,\n icon: icon,\n text: text,\n counter: counter,\n layer: layer,\n toHtml: toHtml\n};\n\nvar autoReplace = function autoReplace() {\n var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var _params$autoReplaceSv = params.autoReplaceSvgRoot,\n autoReplaceSvgRoot = _params$autoReplaceSv === void 0 ? DOCUMENT : _params$autoReplaceSv;\n if ((Object.keys(namespace.styles).length > 0 || config.autoFetchSvg) && IS_DOM && config.autoReplaceSvg) api.dom.i2svg({\n node: autoReplaceSvgRoot\n });\n};\n\nexport { icon, noAuto, config, toHtml, layer, text, counter, library, dom, parse, findIconDefinition };\n","import { parse, icon } from '@fortawesome/fontawesome-svg-core';\nimport PropTypes from 'prop-types';\nimport React from 'react';\n\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n enumerableOnly && (symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n })), keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = null != arguments[i] ? arguments[i] : {};\n i % 2 ? ownKeys(Object(source), !0).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n\n return target;\n}\n\nfunction _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) {\n return typeof obj;\n } : function (obj) {\n return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n }, _typeof(obj);\n}\n\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n}\n\nfunction _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n\n var target = _objectWithoutPropertiesLoose(source, excluded);\n\n var key, i;\n\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n\n return target;\n}\n\nfunction _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n}\n\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n}\n\nfunction _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}\n\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\n\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n return arr2;\n}\n\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\n// Get CSS class list from a props object\nfunction classList(props) {\n var _classes;\n\n var beat = props.beat,\n fade = props.fade,\n beatFade = props.beatFade,\n bounce = props.bounce,\n shake = props.shake,\n flash = props.flash,\n spin = props.spin,\n spinPulse = props.spinPulse,\n spinReverse = props.spinReverse,\n pulse = props.pulse,\n fixedWidth = props.fixedWidth,\n inverse = props.inverse,\n border = props.border,\n listItem = props.listItem,\n flip = props.flip,\n size = props.size,\n rotation = props.rotation,\n pull = props.pull; // map of CSS class names to properties\n\n var classes = (_classes = {\n 'fa-beat': beat,\n 'fa-fade': fade,\n 'fa-beat-fade': beatFade,\n 'fa-bounce': bounce,\n 'fa-shake': shake,\n 'fa-flash': flash,\n 'fa-spin': spin,\n 'fa-spin-reverse': spinReverse,\n 'fa-spin-pulse': spinPulse,\n 'fa-pulse': pulse,\n 'fa-fw': fixedWidth,\n 'fa-inverse': inverse,\n 'fa-border': border,\n 'fa-li': listItem,\n 'fa-flip': flip === true,\n 'fa-flip-horizontal': flip === 'horizontal' || flip === 'both',\n 'fa-flip-vertical': flip === 'vertical' || flip === 'both'\n }, _defineProperty(_classes, \"fa-\".concat(size), typeof size !== 'undefined' && size !== null), _defineProperty(_classes, \"fa-rotate-\".concat(rotation), typeof rotation !== 'undefined' && rotation !== null && rotation !== 0), _defineProperty(_classes, \"fa-pull-\".concat(pull), typeof pull !== 'undefined' && pull !== null), _defineProperty(_classes, 'fa-swap-opacity', props.swapOpacity), _classes); // map over all the keys in the classes object\n // return an array of the keys where the value for the key is not null\n\n return Object.keys(classes).map(function (key) {\n return classes[key] ? key : null;\n }).filter(function (key) {\n return key;\n });\n}\n\n// Camelize taken from humps\n// humps is copyright © 2012+ Dom Christie\n// Released under the MIT license.\n// Performant way to determine if object coerces to a number\nfunction _isNumerical(obj) {\n obj = obj - 0; // eslint-disable-next-line no-self-compare\n\n return obj === obj;\n}\n\nfunction camelize(string) {\n if (_isNumerical(string)) {\n return string;\n } // eslint-disable-next-line no-useless-escape\n\n\n string = string.replace(/[\\-_\\s]+(.)?/g, function (match, chr) {\n return chr ? chr.toUpperCase() : '';\n }); // Ensure 1st char is always lowercase\n\n return string.substr(0, 1).toLowerCase() + string.substr(1);\n}\n\nvar _excluded$1 = [\"style\"];\n\nfunction capitalize(val) {\n return val.charAt(0).toUpperCase() + val.slice(1);\n}\n\nfunction styleToObject(style) {\n return style.split(';').map(function (s) {\n return s.trim();\n }).filter(function (s) {\n return s;\n }).reduce(function (acc, pair) {\n var i = pair.indexOf(':');\n var prop = camelize(pair.slice(0, i));\n var value = pair.slice(i + 1).trim();\n prop.startsWith('webkit') ? acc[capitalize(prop)] = value : acc[prop] = value;\n return acc;\n }, {});\n}\n\nfunction convert(createElement, element) {\n var extraProps = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n if (typeof element === 'string') {\n return element;\n }\n\n var children = (element.children || []).map(function (child) {\n return convert(createElement, child);\n });\n /* eslint-disable dot-notation */\n\n var mixins = Object.keys(element.attributes || {}).reduce(function (acc, key) {\n var val = element.attributes[key];\n\n switch (key) {\n case 'class':\n acc.attrs['className'] = val;\n delete element.attributes['class'];\n break;\n\n case 'style':\n acc.attrs['style'] = styleToObject(val);\n break;\n\n default:\n if (key.indexOf('aria-') === 0 || key.indexOf('data-') === 0) {\n acc.attrs[key.toLowerCase()] = val;\n } else {\n acc.attrs[camelize(key)] = val;\n }\n\n }\n\n return acc;\n }, {\n attrs: {}\n });\n\n var _extraProps$style = extraProps.style,\n existingStyle = _extraProps$style === void 0 ? {} : _extraProps$style,\n remaining = _objectWithoutProperties(extraProps, _excluded$1);\n\n mixins.attrs['style'] = _objectSpread2(_objectSpread2({}, mixins.attrs['style']), existingStyle);\n /* eslint-enable */\n\n return createElement.apply(void 0, [element.tag, _objectSpread2(_objectSpread2({}, mixins.attrs), remaining)].concat(_toConsumableArray(children)));\n}\n\nvar PRODUCTION = false;\n\ntry {\n PRODUCTION = process.env.NODE_ENV === 'production';\n} catch (e) {}\n\nfunction log () {\n if (!PRODUCTION && console && typeof console.error === 'function') {\n var _console;\n\n (_console = console).error.apply(_console, arguments);\n }\n}\n\nfunction normalizeIconArgs(icon) {\n // this has everything that it needs to be rendered which means it was probably imported\n // directly from an icon svg package\n if (icon && _typeof(icon) === 'object' && icon.prefix && icon.iconName && icon.icon) {\n return icon;\n }\n\n if (parse.icon) {\n return parse.icon(icon);\n } // if the icon is null, there's nothing to do\n\n\n if (icon === null) {\n return null;\n } // if the icon is an object and has a prefix and an icon name, return it\n\n\n if (icon && _typeof(icon) === 'object' && icon.prefix && icon.iconName) {\n return icon;\n } // if it's an array with length of two\n\n\n if (Array.isArray(icon) && icon.length === 2) {\n // use the first item as prefix, second as icon name\n return {\n prefix: icon[0],\n iconName: icon[1]\n };\n } // if it's a string, use it as the icon name\n\n\n if (typeof icon === 'string') {\n return {\n prefix: 'fas',\n iconName: icon\n };\n }\n}\n\n// creates an object with a key of key\n// and a value of value\n// if certain conditions are met\nfunction objectWithKey(key, value) {\n // if the value is a non-empty array\n // or it's not an array but it is truthy\n // then create the object with the key and the value\n // if not, return an empty array\n return Array.isArray(value) && value.length > 0 || !Array.isArray(value) && value ? _defineProperty({}, key, value) : {};\n}\n\nvar _excluded = [\"forwardedRef\"];\nfunction FontAwesomeIcon(_ref) {\n var forwardedRef = _ref.forwardedRef,\n props = _objectWithoutProperties(_ref, _excluded);\n\n var iconArgs = props.icon,\n maskArgs = props.mask,\n symbol = props.symbol,\n className = props.className,\n title = props.title,\n titleId = props.titleId,\n maskId = props.maskId;\n var iconLookup = normalizeIconArgs(iconArgs);\n var classes = objectWithKey('classes', [].concat(_toConsumableArray(classList(props)), _toConsumableArray(className.split(' '))));\n var transform = objectWithKey('transform', typeof props.transform === 'string' ? parse.transform(props.transform) : props.transform);\n var mask = objectWithKey('mask', normalizeIconArgs(maskArgs));\n var renderedIcon = icon(iconLookup, _objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2({}, classes), transform), mask), {}, {\n symbol: symbol,\n title: title,\n titleId: titleId,\n maskId: maskId\n }));\n\n if (!renderedIcon) {\n log('Could not find icon', iconLookup);\n return null;\n }\n\n var abstract = renderedIcon.abstract;\n var extraProps = {\n ref: forwardedRef\n };\n Object.keys(props).forEach(function (key) {\n // eslint-disable-next-line no-prototype-builtins\n if (!FontAwesomeIcon.defaultProps.hasOwnProperty(key)) {\n extraProps[key] = props[key];\n }\n });\n return convertCurry(abstract[0], extraProps);\n}\nFontAwesomeIcon.displayName = 'FontAwesomeIcon';\nFontAwesomeIcon.propTypes = {\n beat: PropTypes.bool,\n border: PropTypes.bool,\n beatFade: PropTypes.bool,\n bounce: PropTypes.bool,\n className: PropTypes.string,\n fade: PropTypes.bool,\n flash: PropTypes.bool,\n mask: PropTypes.oneOfType([PropTypes.object, PropTypes.array, PropTypes.string]),\n maskId: PropTypes.string,\n fixedWidth: PropTypes.bool,\n inverse: PropTypes.bool,\n flip: PropTypes.oneOf([true, false, 'horizontal', 'vertical', 'both']),\n icon: PropTypes.oneOfType([PropTypes.object, PropTypes.array, PropTypes.string]),\n listItem: PropTypes.bool,\n pull: PropTypes.oneOf(['right', 'left']),\n pulse: PropTypes.bool,\n rotation: PropTypes.oneOf([0, 90, 180, 270]),\n shake: PropTypes.bool,\n size: PropTypes.oneOf(['2xs', 'xs', 'sm', 'lg', 'xl', '2xl', '1x', '2x', '3x', '4x', '5x', '6x', '7x', '8x', '9x', '10x']),\n spin: PropTypes.bool,\n spinPulse: PropTypes.bool,\n spinReverse: PropTypes.bool,\n symbol: PropTypes.oneOfType([PropTypes.bool, PropTypes.string]),\n title: PropTypes.string,\n titleId: PropTypes.string,\n transform: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\n swapOpacity: PropTypes.bool\n};\nFontAwesomeIcon.defaultProps = {\n border: false,\n className: '',\n mask: null,\n maskId: null,\n fixedWidth: false,\n inverse: false,\n flip: false,\n icon: null,\n listItem: false,\n pull: null,\n pulse: false,\n rotation: null,\n size: null,\n spin: false,\n spinPulse: false,\n spinReverse: false,\n beat: false,\n fade: false,\n beatFade: false,\n bounce: false,\n shake: false,\n symbol: false,\n title: '',\n titleId: null,\n transform: null,\n swapOpacity: false\n};\nvar convertCurry = convert.bind(null, React.createElement);\n\nexport { FontAwesomeIcon };\n","/*!\n * Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com\n * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)\n */\nvar prefix = \"far\";\nvar faAddressBook = {\n prefix: 'far',\n iconName: 'address-book',\n icon: [448, 512, [], \"f2b9\", \"M436 160c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-20V48c0-26.5-21.5-48-48-48H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h320c26.5 0 48-21.5 48-48v-48h20c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-20v-64h20c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-20v-64h20zm-68 304H48V48h320v416zM208 256c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm-89.6 128h179.2c12.4 0 22.4-8.6 22.4-19.2v-19.2c0-31.8-30.1-57.6-67.2-57.6-10.8 0-18.7 8-44.8 8-26.9 0-33.4-8-44.8-8-37.1 0-67.2 25.8-67.2 57.6v19.2c0 10.6 10 19.2 22.4 19.2z\"]\n};\nvar faAddressCard = {\n prefix: 'far',\n iconName: 'address-card',\n icon: [576, 512, [], \"f2bb\", \"M528 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h480c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm0 400H48V80h480v352zM208 256c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm-89.6 128h179.2c12.4 0 22.4-8.6 22.4-19.2v-19.2c0-31.8-30.1-57.6-67.2-57.6-10.8 0-18.7 8-44.8 8-26.9 0-33.4-8-44.8-8-37.1 0-67.2 25.8-67.2 57.6v19.2c0 10.6 10 19.2 22.4 19.2zM360 320h112c4.4 0 8-3.6 8-8v-16c0-4.4-3.6-8-8-8H360c-4.4 0-8 3.6-8 8v16c0 4.4 3.6 8 8 8zm0-64h112c4.4 0 8-3.6 8-8v-16c0-4.4-3.6-8-8-8H360c-4.4 0-8 3.6-8 8v16c0 4.4 3.6 8 8 8zm0-64h112c4.4 0 8-3.6 8-8v-16c0-4.4-3.6-8-8-8H360c-4.4 0-8 3.6-8 8v16c0 4.4 3.6 8 8 8z\"]\n};\nvar faAngry = {\n prefix: 'far',\n iconName: 'angry',\n icon: [496, 512, [], \"f556\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm0-144c-33.6 0-65.2 14.8-86.8 40.6-8.5 10.2-7.1 25.3 3.1 33.8s25.3 7.2 33.8-3c24.8-29.7 75-29.7 99.8 0 8.1 9.7 23.2 11.9 33.8 3 10.2-8.5 11.5-23.6 3.1-33.8-21.6-25.8-53.2-40.6-86.8-40.6zm-48-72c10.3 0 19.9-6.7 23-17.1 3.8-12.7-3.4-26.1-16.1-29.9l-80-24c-12.8-3.9-26.1 3.4-29.9 16.1-3.8 12.7 3.4 26.1 16.1 29.9l28.2 8.5c-3.1 4.9-5.3 10.4-5.3 16.6 0 17.7 14.3 32 32 32s32-14.4 32-32.1zm199-54.9c-3.8-12.7-17.1-19.9-29.9-16.1l-80 24c-12.7 3.8-19.9 17.2-16.1 29.9 3.1 10.4 12.7 17.1 23 17.1 0 17.7 14.3 32 32 32s32-14.3 32-32c0-6.2-2.2-11.7-5.3-16.6l28.2-8.5c12.7-3.7 19.9-17.1 16.1-29.8z\"]\n};\nvar faArrowAltCircleDown = {\n prefix: 'far',\n iconName: 'arrow-alt-circle-down',\n icon: [512, 512, [], \"f358\", \"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm0 448c-110.5 0-200-89.5-200-200S145.5 56 256 56s200 89.5 200 200-89.5 200-200 200zm-32-316v116h-67c-10.7 0-16 12.9-8.5 20.5l99 99c4.7 4.7 12.3 4.7 17 0l99-99c7.6-7.6 2.2-20.5-8.5-20.5h-67V140c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12z\"]\n};\nvar faArrowAltCircleLeft = {\n prefix: 'far',\n iconName: 'arrow-alt-circle-left',\n icon: [512, 512, [], \"f359\", \"M8 256c0 137 111 248 248 248s248-111 248-248S393 8 256 8 8 119 8 256zm448 0c0 110.5-89.5 200-200 200S56 366.5 56 256 145.5 56 256 56s200 89.5 200 200zm-72-20v40c0 6.6-5.4 12-12 12H256v67c0 10.7-12.9 16-20.5 8.5l-99-99c-4.7-4.7-4.7-12.3 0-17l99-99c7.6-7.6 20.5-2.2 20.5 8.5v67h116c6.6 0 12 5.4 12 12z\"]\n};\nvar faArrowAltCircleRight = {\n prefix: 'far',\n iconName: 'arrow-alt-circle-right',\n icon: [512, 512, [], \"f35a\", \"M504 256C504 119 393 8 256 8S8 119 8 256s111 248 248 248 248-111 248-248zm-448 0c0-110.5 89.5-200 200-200s200 89.5 200 200-89.5 200-200 200S56 366.5 56 256zm72 20v-40c0-6.6 5.4-12 12-12h116v-67c0-10.7 12.9-16 20.5-8.5l99 99c4.7 4.7 4.7 12.3 0 17l-99 99c-7.6 7.6-20.5 2.2-20.5-8.5v-67H140c-6.6 0-12-5.4-12-12z\"]\n};\nvar faArrowAltCircleUp = {\n prefix: 'far',\n iconName: 'arrow-alt-circle-up',\n icon: [512, 512, [], \"f35b\", \"M256 504c137 0 248-111 248-248S393 8 256 8 8 119 8 256s111 248 248 248zm0-448c110.5 0 200 89.5 200 200s-89.5 200-200 200S56 366.5 56 256 145.5 56 256 56zm20 328h-40c-6.6 0-12-5.4-12-12V256h-67c-10.7 0-16-12.9-8.5-20.5l99-99c4.7-4.7 12.3-4.7 17 0l99 99c7.6 7.6 2.2 20.5-8.5 20.5h-67v116c0 6.6-5.4 12-12 12z\"]\n};\nvar faBell = {\n prefix: 'far',\n iconName: 'bell',\n icon: [448, 512, [], \"f0f3\", \"M439.39 362.29c-19.32-20.76-55.47-51.99-55.47-154.29 0-77.7-54.48-139.9-127.94-155.16V32c0-17.67-14.32-32-31.98-32s-31.98 14.33-31.98 32v20.84C118.56 68.1 64.08 130.3 64.08 208c0 102.3-36.15 133.53-55.47 154.29-6 6.45-8.66 14.16-8.61 21.71.11 16.4 12.98 32 32.1 32h383.8c19.12 0 32-15.6 32.1-32 .05-7.55-2.61-15.27-8.61-21.71zM67.53 368c21.22-27.97 44.42-74.33 44.53-159.42 0-.2-.06-.38-.06-.58 0-61.86 50.14-112 112-112s112 50.14 112 112c0 .2-.06.38-.06.58.11 85.1 23.31 131.46 44.53 159.42H67.53zM224 512c35.32 0 63.97-28.65 63.97-64H160.03c0 35.35 28.65 64 63.97 64z\"]\n};\nvar faBellSlash = {\n prefix: 'far',\n iconName: 'bell-slash',\n icon: [640, 512, [], \"f1f6\", \"M633.99 471.02L36 3.51C29.1-2.01 19.03-.9 13.51 6l-10 12.49C-2.02 25.39-.9 35.46 6 40.98l598 467.51c6.9 5.52 16.96 4.4 22.49-2.49l10-12.49c5.52-6.9 4.41-16.97-2.5-22.49zM163.53 368c16.71-22.03 34.48-55.8 41.4-110.58l-45.47-35.55c-3.27 90.73-36.47 120.68-54.84 140.42-6 6.45-8.66 14.16-8.61 21.71.11 16.4 12.98 32 32.1 32h279.66l-61.4-48H163.53zM320 96c61.86 0 112 50.14 112 112 0 .2-.06.38-.06.58.02 16.84 1.16 31.77 2.79 45.73l59.53 46.54c-8.31-22.13-14.34-51.49-14.34-92.85 0-77.7-54.48-139.9-127.94-155.16V32c0-17.67-14.32-32-31.98-32s-31.98 14.33-31.98 32v20.84c-26.02 5.41-49.45 16.94-69.13 32.72l38.17 29.84C275 103.18 296.65 96 320 96zm0 416c35.32 0 63.97-28.65 63.97-64H256.03c0 35.35 28.65 64 63.97 64z\"]\n};\nvar faBookmark = {\n prefix: 'far',\n iconName: 'bookmark',\n icon: [384, 512, [], \"f02e\", \"M336 0H48C21.49 0 0 21.49 0 48v464l192-112 192 112V48c0-26.51-21.49-48-48-48zm0 428.43l-144-84-144 84V54a6 6 0 0 1 6-6h276c3.314 0 6 2.683 6 5.996V428.43z\"]\n};\nvar faBuilding = {\n prefix: 'far',\n iconName: 'building',\n icon: [448, 512, [], \"f1ad\", \"M128 148v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12zm140 12h40c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12zm-128 96h40c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12zm128 0h40c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12zm-76 84v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm76 12h40c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12zm180 124v36H0v-36c0-6.6 5.4-12 12-12h19.5V24c0-13.3 10.7-24 24-24h337c13.3 0 24 10.7 24 24v440H436c6.6 0 12 5.4 12 12zM79.5 463H192v-67c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v67h112.5V49L80 48l-.5 415z\"]\n};\nvar faCalendar = {\n prefix: 'far',\n iconName: 'calendar',\n icon: [448, 512, [], \"f133\", \"M400 64h-48V12c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v52H160V12c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v52H48C21.5 64 0 85.5 0 112v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48zm-6 400H54c-3.3 0-6-2.7-6-6V160h352v298c0 3.3-2.7 6-6 6z\"]\n};\nvar faCalendarAlt = {\n prefix: 'far',\n iconName: 'calendar-alt',\n icon: [448, 512, [], \"f073\", \"M148 288h-40c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12zm108-12v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm96 0v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm-96 96v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm-96 0v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm192 0v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm96-260v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V112c0-26.5 21.5-48 48-48h48V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h128V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h48c26.5 0 48 21.5 48 48zm-48 346V160H48v298c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z\"]\n};\nvar faCalendarCheck = {\n prefix: 'far',\n iconName: 'calendar-check',\n icon: [448, 512, [], \"f274\", \"M400 64h-48V12c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v52H160V12c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v52H48C21.49 64 0 85.49 0 112v352c0 26.51 21.49 48 48 48h352c26.51 0 48-21.49 48-48V112c0-26.51-21.49-48-48-48zm-6 400H54a6 6 0 0 1-6-6V160h352v298a6 6 0 0 1-6 6zm-52.849-200.65L198.842 404.519c-4.705 4.667-12.303 4.637-16.971-.068l-75.091-75.699c-4.667-4.705-4.637-12.303.068-16.971l22.719-22.536c4.705-4.667 12.303-4.637 16.97.069l44.104 44.461 111.072-110.181c4.705-4.667 12.303-4.637 16.971.068l22.536 22.718c4.667 4.705 4.636 12.303-.069 16.97z\"]\n};\nvar faCalendarMinus = {\n prefix: 'far',\n iconName: 'calendar-minus',\n icon: [448, 512, [], \"f272\", \"M124 328c-6.6 0-12-5.4-12-12v-24c0-6.6 5.4-12 12-12h200c6.6 0 12 5.4 12 12v24c0 6.6-5.4 12-12 12H124zm324-216v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V112c0-26.5 21.5-48 48-48h48V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h128V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h48c26.5 0 48 21.5 48 48zm-48 346V160H48v298c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z\"]\n};\nvar faCalendarPlus = {\n prefix: 'far',\n iconName: 'calendar-plus',\n icon: [448, 512, [], \"f271\", \"M336 292v24c0 6.6-5.4 12-12 12h-76v76c0 6.6-5.4 12-12 12h-24c-6.6 0-12-5.4-12-12v-76h-76c-6.6 0-12-5.4-12-12v-24c0-6.6 5.4-12 12-12h76v-76c0-6.6 5.4-12 12-12h24c6.6 0 12 5.4 12 12v76h76c6.6 0 12 5.4 12 12zm112-180v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V112c0-26.5 21.5-48 48-48h48V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h128V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h48c26.5 0 48 21.5 48 48zm-48 346V160H48v298c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z\"]\n};\nvar faCalendarTimes = {\n prefix: 'far',\n iconName: 'calendar-times',\n icon: [448, 512, [], \"f273\", \"M311.7 374.7l-17 17c-4.7 4.7-12.3 4.7-17 0L224 337.9l-53.7 53.7c-4.7 4.7-12.3 4.7-17 0l-17-17c-4.7-4.7-4.7-12.3 0-17l53.7-53.7-53.7-53.7c-4.7-4.7-4.7-12.3 0-17l17-17c4.7-4.7 12.3-4.7 17 0l53.7 53.7 53.7-53.7c4.7-4.7 12.3-4.7 17 0l17 17c4.7 4.7 4.7 12.3 0 17L257.9 304l53.7 53.7c4.8 4.7 4.8 12.3.1 17zM448 112v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V112c0-26.5 21.5-48 48-48h48V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h128V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h48c26.5 0 48 21.5 48 48zm-48 346V160H48v298c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z\"]\n};\nvar faCaretSquareDown = {\n prefix: 'far',\n iconName: 'caret-square-down',\n icon: [448, 512, [], \"f150\", \"M125.1 208h197.8c10.7 0 16.1 13 8.5 20.5l-98.9 98.3c-4.7 4.7-12.2 4.7-16.9 0l-98.9-98.3c-7.7-7.5-2.3-20.5 8.4-20.5zM448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-48 346V86c0-3.3-2.7-6-6-6H54c-3.3 0-6 2.7-6 6v340c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z\"]\n};\nvar faCaretSquareLeft = {\n prefix: 'far',\n iconName: 'caret-square-left',\n icon: [448, 512, [], \"f191\", \"M272 157.1v197.8c0 10.7-13 16.1-20.5 8.5l-98.3-98.9c-4.7-4.7-4.7-12.2 0-16.9l98.3-98.9c7.5-7.7 20.5-2.3 20.5 8.4zM448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-48 346V86c0-3.3-2.7-6-6-6H54c-3.3 0-6 2.7-6 6v340c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z\"]\n};\nvar faCaretSquareRight = {\n prefix: 'far',\n iconName: 'caret-square-right',\n icon: [448, 512, [], \"f152\", \"M176 354.9V157.1c0-10.7 13-16.1 20.5-8.5l98.3 98.9c4.7 4.7 4.7 12.2 0 16.9l-98.3 98.9c-7.5 7.7-20.5 2.3-20.5-8.4zM448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-48 346V86c0-3.3-2.7-6-6-6H54c-3.3 0-6 2.7-6 6v340c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z\"]\n};\nvar faCaretSquareUp = {\n prefix: 'far',\n iconName: 'caret-square-up',\n icon: [448, 512, [], \"f151\", \"M322.9 304H125.1c-10.7 0-16.1-13-8.5-20.5l98.9-98.3c4.7-4.7 12.2-4.7 16.9 0l98.9 98.3c7.7 7.5 2.3 20.5-8.4 20.5zM448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-48 346V86c0-3.3-2.7-6-6-6H54c-3.3 0-6 2.7-6 6v340c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z\"]\n};\nvar faChartBar = {\n prefix: 'far',\n iconName: 'chart-bar',\n icon: [512, 512, [], \"f080\", \"M396.8 352h22.4c6.4 0 12.8-6.4 12.8-12.8V108.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v230.4c0 6.4 6.4 12.8 12.8 12.8zm-192 0h22.4c6.4 0 12.8-6.4 12.8-12.8V140.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v198.4c0 6.4 6.4 12.8 12.8 12.8zm96 0h22.4c6.4 0 12.8-6.4 12.8-12.8V204.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v134.4c0 6.4 6.4 12.8 12.8 12.8zM496 400H48V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v336c0 17.67 14.33 32 32 32h464c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16zm-387.2-48h22.4c6.4 0 12.8-6.4 12.8-12.8v-70.4c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v70.4c0 6.4 6.4 12.8 12.8 12.8z\"]\n};\nvar faCheckCircle = {\n prefix: 'far',\n iconName: 'check-circle',\n icon: [512, 512, [], \"f058\", \"M256 8C119.033 8 8 119.033 8 256s111.033 248 248 248 248-111.033 248-248S392.967 8 256 8zm0 48c110.532 0 200 89.451 200 200 0 110.532-89.451 200-200 200-110.532 0-200-89.451-200-200 0-110.532 89.451-200 200-200m140.204 130.267l-22.536-22.718c-4.667-4.705-12.265-4.736-16.97-.068L215.346 303.697l-59.792-60.277c-4.667-4.705-12.265-4.736-16.97-.069l-22.719 22.536c-4.705 4.667-4.736 12.265-.068 16.971l90.781 91.516c4.667 4.705 12.265 4.736 16.97.068l172.589-171.204c4.704-4.668 4.734-12.266.067-16.971z\"]\n};\nvar faCheckSquare = {\n prefix: 'far',\n iconName: 'check-square',\n icon: [448, 512, [], \"f14a\", \"M400 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h352c26.51 0 48-21.49 48-48V80c0-26.51-21.49-48-48-48zm0 400H48V80h352v352zm-35.864-241.724L191.547 361.48c-4.705 4.667-12.303 4.637-16.97-.068l-90.781-91.516c-4.667-4.705-4.637-12.303.069-16.971l22.719-22.536c4.705-4.667 12.303-4.637 16.97.069l59.792 60.277 141.352-140.216c4.705-4.667 12.303-4.637 16.97.068l22.536 22.718c4.667 4.706 4.637 12.304-.068 16.971z\"]\n};\nvar faCircle = {\n prefix: 'far',\n iconName: 'circle',\n icon: [512, 512, [], \"f111\", \"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm0 448c-110.5 0-200-89.5-200-200S145.5 56 256 56s200 89.5 200 200-89.5 200-200 200z\"]\n};\nvar faClipboard = {\n prefix: 'far',\n iconName: 'clipboard',\n icon: [384, 512, [], \"f328\", \"M336 64h-80c0-35.3-28.7-64-64-64s-64 28.7-64 64H48C21.5 64 0 85.5 0 112v352c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48zM192 40c13.3 0 24 10.7 24 24s-10.7 24-24 24-24-10.7-24-24 10.7-24 24-24zm144 418c0 3.3-2.7 6-6 6H54c-3.3 0-6-2.7-6-6V118c0-3.3 2.7-6 6-6h42v36c0 6.6 5.4 12 12 12h168c6.6 0 12-5.4 12-12v-36h42c3.3 0 6 2.7 6 6z\"]\n};\nvar faClock = {\n prefix: 'far',\n iconName: 'clock',\n icon: [512, 512, [], \"f017\", \"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm0 448c-110.5 0-200-89.5-200-200S145.5 56 256 56s200 89.5 200 200-89.5 200-200 200zm61.8-104.4l-84.9-61.7c-3.1-2.3-4.9-5.9-4.9-9.7V116c0-6.6 5.4-12 12-12h32c6.6 0 12 5.4 12 12v141.7l66.8 48.6c5.4 3.9 6.5 11.4 2.6 16.8L334.6 349c-3.9 5.3-11.4 6.5-16.8 2.6z\"]\n};\nvar faClone = {\n prefix: 'far',\n iconName: 'clone',\n icon: [512, 512, [], \"f24d\", \"M464 0H144c-26.51 0-48 21.49-48 48v48H48c-26.51 0-48 21.49-48 48v320c0 26.51 21.49 48 48 48h320c26.51 0 48-21.49 48-48v-48h48c26.51 0 48-21.49 48-48V48c0-26.51-21.49-48-48-48zM362 464H54a6 6 0 0 1-6-6V150a6 6 0 0 1 6-6h42v224c0 26.51 21.49 48 48 48h224v42a6 6 0 0 1-6 6zm96-96H150a6 6 0 0 1-6-6V54a6 6 0 0 1 6-6h308a6 6 0 0 1 6 6v308a6 6 0 0 1-6 6z\"]\n};\nvar faClosedCaptioning = {\n prefix: 'far',\n iconName: 'closed-captioning',\n icon: [512, 512, [], \"f20a\", \"M464 64H48C21.5 64 0 85.5 0 112v288c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48zm-6 336H54c-3.3 0-6-2.7-6-6V118c0-3.3 2.7-6 6-6h404c3.3 0 6 2.7 6 6v276c0 3.3-2.7 6-6 6zm-211.1-85.7c1.7 2.4 1.5 5.6-.5 7.7-53.6 56.8-172.8 32.1-172.8-67.9 0-97.3 121.7-119.5 172.5-70.1 2.1 2 2.5 3.2 1 5.7l-17.5 30.5c-1.9 3.1-6.2 4-9.1 1.7-40.8-32-94.6-14.9-94.6 31.2 0 48 51 70.5 92.2 32.6 2.8-2.5 7.1-2.1 9.2.9l19.6 27.7zm190.4 0c1.7 2.4 1.5 5.6-.5 7.7-53.6 56.9-172.8 32.1-172.8-67.9 0-97.3 121.7-119.5 172.5-70.1 2.1 2 2.5 3.2 1 5.7L420 220.2c-1.9 3.1-6.2 4-9.1 1.7-40.8-32-94.6-14.9-94.6 31.2 0 48 51 70.5 92.2 32.6 2.8-2.5 7.1-2.1 9.2.9l19.6 27.7z\"]\n};\nvar faComment = {\n prefix: 'far',\n iconName: 'comment',\n icon: [512, 512, [], \"f075\", \"M256 32C114.6 32 0 125.1 0 240c0 47.6 19.9 91.2 52.9 126.3C38 405.7 7 439.1 6.5 439.5c-6.6 7-8.4 17.2-4.6 26S14.4 480 24 480c61.5 0 110-25.7 139.1-46.3C192 442.8 223.2 448 256 448c141.4 0 256-93.1 256-208S397.4 32 256 32zm0 368c-26.7 0-53.1-4.1-78.4-12.1l-22.7-7.2-19.5 13.8c-14.3 10.1-33.9 21.4-57.5 29 7.3-12.1 14.4-25.7 19.9-40.2l10.6-28.1-20.6-21.8C69.7 314.1 48 282.2 48 240c0-88.2 93.3-160 208-160s208 71.8 208 160-93.3 160-208 160z\"]\n};\nvar faCommentAlt = {\n prefix: 'far',\n iconName: 'comment-alt',\n icon: [512, 512, [], \"f27a\", \"M448 0H64C28.7 0 0 28.7 0 64v288c0 35.3 28.7 64 64 64h96v84c0 7.1 5.8 12 12 12 2.4 0 4.9-.7 7.1-2.4L304 416h144c35.3 0 64-28.7 64-64V64c0-35.3-28.7-64-64-64zm16 352c0 8.8-7.2 16-16 16H288l-12.8 9.6L208 428v-60H64c-8.8 0-16-7.2-16-16V64c0-8.8 7.2-16 16-16h384c8.8 0 16 7.2 16 16v288z\"]\n};\nvar faCommentDots = {\n prefix: 'far',\n iconName: 'comment-dots',\n icon: [512, 512, [], \"f4ad\", \"M144 208c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm112 0c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm112 0c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zM256 32C114.6 32 0 125.1 0 240c0 47.6 19.9 91.2 52.9 126.3C38 405.7 7 439.1 6.5 439.5c-6.6 7-8.4 17.2-4.6 26S14.4 480 24 480c61.5 0 110-25.7 139.1-46.3C192 442.8 223.2 448 256 448c141.4 0 256-93.1 256-208S397.4 32 256 32zm0 368c-26.7 0-53.1-4.1-78.4-12.1l-22.7-7.2-19.5 13.8c-14.3 10.1-33.9 21.4-57.5 29 7.3-12.1 14.4-25.7 19.9-40.2l10.6-28.1-20.6-21.8C69.7 314.1 48 282.2 48 240c0-88.2 93.3-160 208-160s208 71.8 208 160-93.3 160-208 160z\"]\n};\nvar faComments = {\n prefix: 'far',\n iconName: 'comments',\n icon: [576, 512, [], \"f086\", \"M532 386.2c27.5-27.1 44-61.1 44-98.2 0-80-76.5-146.1-176.2-157.9C368.3 72.5 294.3 32 208 32 93.1 32 0 103.6 0 192c0 37 16.5 71 44 98.2-15.3 30.7-37.3 54.5-37.7 54.9-6.3 6.7-8.1 16.5-4.4 25 3.6 8.5 12 14 21.2 14 53.5 0 96.7-20.2 125.2-38.8 9.2 2.1 18.7 3.7 28.4 4.9C208.1 407.6 281.8 448 368 448c20.8 0 40.8-2.4 59.8-6.8C456.3 459.7 499.4 480 553 480c9.2 0 17.5-5.5 21.2-14 3.6-8.5 1.9-18.3-4.4-25-.4-.3-22.5-24.1-37.8-54.8zm-392.8-92.3L122.1 305c-14.1 9.1-28.5 16.3-43.1 21.4 2.7-4.7 5.4-9.7 8-14.8l15.5-31.1L77.7 256C64.2 242.6 48 220.7 48 192c0-60.7 73.3-112 160-112s160 51.3 160 112-73.3 112-160 112c-16.5 0-33-1.9-49-5.6l-19.8-4.5zM498.3 352l-24.7 24.4 15.5 31.1c2.6 5.1 5.3 10.1 8 14.8-14.6-5.1-29-12.3-43.1-21.4l-17.1-11.1-19.9 4.6c-16 3.7-32.5 5.6-49 5.6-54 0-102.2-20.1-131.3-49.7C338 339.5 416 272.9 416 192c0-3.4-.4-6.7-.7-10C479.7 196.5 528 238.8 528 288c0 28.7-16.2 50.6-29.7 64z\"]\n};\nvar faCompass = {\n prefix: 'far',\n iconName: 'compass',\n icon: [496, 512, [], \"f14e\", \"M347.94 129.86L203.6 195.83a31.938 31.938 0 0 0-15.77 15.77l-65.97 144.34c-7.61 16.65 9.54 33.81 26.2 26.2l144.34-65.97a31.938 31.938 0 0 0 15.77-15.77l65.97-144.34c7.61-16.66-9.54-33.81-26.2-26.2zm-77.36 148.72c-12.47 12.47-32.69 12.47-45.16 0-12.47-12.47-12.47-32.69 0-45.16 12.47-12.47 32.69-12.47 45.16 0 12.47 12.47 12.47 32.69 0 45.16zM248 8C111.03 8 0 119.03 0 256s111.03 248 248 248 248-111.03 248-248S384.97 8 248 8zm0 448c-110.28 0-200-89.72-200-200S137.72 56 248 56s200 89.72 200 200-89.72 200-200 200z\"]\n};\nvar faCopy = {\n prefix: 'far',\n iconName: 'copy',\n icon: [448, 512, [], \"f0c5\", \"M433.941 65.941l-51.882-51.882A48 48 0 0 0 348.118 0H176c-26.51 0-48 21.49-48 48v48H48c-26.51 0-48 21.49-48 48v320c0 26.51 21.49 48 48 48h224c26.51 0 48-21.49 48-48v-48h80c26.51 0 48-21.49 48-48V99.882a48 48 0 0 0-14.059-33.941zM266 464H54a6 6 0 0 1-6-6V150a6 6 0 0 1 6-6h74v224c0 26.51 21.49 48 48 48h96v42a6 6 0 0 1-6 6zm128-96H182a6 6 0 0 1-6-6V54a6 6 0 0 1 6-6h106v88c0 13.255 10.745 24 24 24h88v202a6 6 0 0 1-6 6zm6-256h-64V48h9.632c1.591 0 3.117.632 4.243 1.757l48.368 48.368a6 6 0 0 1 1.757 4.243V112z\"]\n};\nvar faCopyright = {\n prefix: 'far',\n iconName: 'copyright',\n icon: [512, 512, [], \"f1f9\", \"M256 8C119.033 8 8 119.033 8 256s111.033 248 248 248 248-111.033 248-248S392.967 8 256 8zm0 448c-110.532 0-200-89.451-200-200 0-110.531 89.451-200 200-200 110.532 0 200 89.451 200 200 0 110.532-89.451 200-200 200zm107.351-101.064c-9.614 9.712-45.53 41.396-104.065 41.396-82.43 0-140.484-61.425-140.484-141.567 0-79.152 60.275-139.401 139.762-139.401 55.531 0 88.738 26.62 97.593 34.779a11.965 11.965 0 0 1 1.936 15.322l-18.155 28.113c-3.841 5.95-11.966 7.282-17.499 2.921-8.595-6.776-31.814-22.538-61.708-22.538-48.303 0-77.916 35.33-77.916 80.082 0 41.589 26.888 83.692 78.277 83.692 32.657 0 56.843-19.039 65.726-27.225 5.27-4.857 13.596-4.039 17.82 1.738l19.865 27.17a11.947 11.947 0 0 1-1.152 15.518z\"]\n};\nvar faCreditCard = {\n prefix: 'far',\n iconName: 'credit-card',\n icon: [576, 512, [], \"f09d\", \"M527.9 32H48.1C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48.1 48h479.8c26.6 0 48.1-21.5 48.1-48V80c0-26.5-21.5-48-48.1-48zM54.1 80h467.8c3.3 0 6 2.7 6 6v42H48.1V86c0-3.3 2.7-6 6-6zm467.8 352H54.1c-3.3 0-6-2.7-6-6V256h479.8v170c0 3.3-2.7 6-6 6zM192 332v40c0 6.6-5.4 12-12 12h-72c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h72c6.6 0 12 5.4 12 12zm192 0v40c0 6.6-5.4 12-12 12H236c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h136c6.6 0 12 5.4 12 12z\"]\n};\nvar faDizzy = {\n prefix: 'far',\n iconName: 'dizzy',\n icon: [496, 512, [], \"f567\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm-33.8-217.9c7.8-7.8 7.8-20.5 0-28.3L196.3 192l17.9-17.9c7.8-7.8 7.8-20.5 0-28.3-7.8-7.8-20.5-7.8-28.3 0L168 163.7l-17.8-17.8c-7.8-7.8-20.5-7.8-28.3 0-7.8 7.8-7.8 20.5 0 28.3l17.9 17.9-17.9 17.9c-7.8 7.8-7.8 20.5 0 28.3 7.8 7.8 20.5 7.8 28.3 0l17.8-17.8 17.8 17.8c7.9 7.7 20.5 7.7 28.4-.2zm160-92.2c-7.8-7.8-20.5-7.8-28.3 0L328 163.7l-17.8-17.8c-7.8-7.8-20.5-7.8-28.3 0-7.8 7.8-7.8 20.5 0 28.3l17.9 17.9-17.9 17.9c-7.8 7.8-7.8 20.5 0 28.3 7.8 7.8 20.5 7.8 28.3 0l17.8-17.8 17.8 17.8c7.8 7.8 20.5 7.8 28.3 0 7.8-7.8 7.8-20.5 0-28.3l-17.8-18 17.9-17.9c7.7-7.8 7.7-20.4 0-28.2zM248 272c-35.3 0-64 28.7-64 64s28.7 64 64 64 64-28.7 64-64-28.7-64-64-64z\"]\n};\nvar faDotCircle = {\n prefix: 'far',\n iconName: 'dot-circle',\n icon: [512, 512, [], \"f192\", \"M256 56c110.532 0 200 89.451 200 200 0 110.532-89.451 200-200 200-110.532 0-200-89.451-200-200 0-110.532 89.451-200 200-200m0-48C119.033 8 8 119.033 8 256s111.033 248 248 248 248-111.033 248-248S392.967 8 256 8zm0 168c-44.183 0-80 35.817-80 80s35.817 80 80 80 80-35.817 80-80-35.817-80-80-80z\"]\n};\nvar faEdit = {\n prefix: 'far',\n iconName: 'edit',\n icon: [576, 512, [], \"f044\", \"M402.3 344.9l32-32c5-5 13.7-1.5 13.7 5.7V464c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V112c0-26.5 21.5-48 48-48h273.5c7.1 0 10.7 8.6 5.7 13.7l-32 32c-1.5 1.5-3.5 2.3-5.7 2.3H48v352h352V350.5c0-2.1.8-4.1 2.3-5.6zm156.6-201.8L296.3 405.7l-90.4 10c-26.2 2.9-48.5-19.2-45.6-45.6l10-90.4L432.9 17.1c22.9-22.9 59.9-22.9 82.7 0l43.2 43.2c22.9 22.9 22.9 60 .1 82.8zM460.1 174L402 115.9 216.2 301.8l-7.3 65.3 65.3-7.3L460.1 174zm64.8-79.7l-43.2-43.2c-4.1-4.1-10.8-4.1-14.8 0L436 82l58.1 58.1 30.9-30.9c4-4.2 4-10.8-.1-14.9z\"]\n};\nvar faEnvelope = {\n prefix: 'far',\n iconName: 'envelope',\n icon: [512, 512, [], \"f0e0\", \"M464 64H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V112c0-26.51-21.49-48-48-48zm0 48v40.805c-22.422 18.259-58.168 46.651-134.587 106.49-16.841 13.247-50.201 45.072-73.413 44.701-23.208.375-56.579-31.459-73.413-44.701C106.18 199.465 70.425 171.067 48 152.805V112h416zM48 400V214.398c22.914 18.251 55.409 43.862 104.938 82.646 21.857 17.205 60.134 55.186 103.062 54.955 42.717.231 80.509-37.199 103.053-54.947 49.528-38.783 82.032-64.401 104.947-82.653V400H48z\"]\n};\nvar faEnvelopeOpen = {\n prefix: 'far',\n iconName: 'envelope-open',\n icon: [512, 512, [], \"f2b6\", \"M494.586 164.516c-4.697-3.883-111.723-89.95-135.251-108.657C337.231 38.191 299.437 0 256 0c-43.205 0-80.636 37.717-103.335 55.859-24.463 19.45-131.07 105.195-135.15 108.549A48.004 48.004 0 0 0 0 201.485V464c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V201.509a48 48 0 0 0-17.414-36.993zM464 458a6 6 0 0 1-6 6H54a6 6 0 0 1-6-6V204.347c0-1.813.816-3.526 2.226-4.665 15.87-12.814 108.793-87.554 132.364-106.293C200.755 78.88 232.398 48 256 48c23.693 0 55.857 31.369 73.41 45.389 23.573 18.741 116.503 93.493 132.366 106.316a5.99 5.99 0 0 1 2.224 4.663V458zm-31.991-187.704c4.249 5.159 3.465 12.795-1.745 16.981-28.975 23.283-59.274 47.597-70.929 56.863C336.636 362.283 299.205 400 256 400c-43.452 0-81.287-38.237-103.335-55.86-11.279-8.967-41.744-33.413-70.927-56.865-5.21-4.187-5.993-11.822-1.745-16.981l15.258-18.528c4.178-5.073 11.657-5.843 16.779-1.726 28.618 23.001 58.566 47.035 70.56 56.571C200.143 320.631 232.307 352 256 352c23.602 0 55.246-30.88 73.41-45.389 11.994-9.535 41.944-33.57 70.563-56.568 5.122-4.116 12.601-3.346 16.778 1.727l15.258 18.526z\"]\n};\nvar faEye = {\n prefix: 'far',\n iconName: 'eye',\n icon: [576, 512, [], \"f06e\", \"M288 144a110.94 110.94 0 0 0-31.24 5 55.4 55.4 0 0 1 7.24 27 56 56 0 0 1-56 56 55.4 55.4 0 0 1-27-7.24A111.71 111.71 0 1 0 288 144zm284.52 97.4C518.29 135.59 410.93 64 288 64S57.68 135.64 3.48 241.41a32.35 32.35 0 0 0 0 29.19C57.71 376.41 165.07 448 288 448s230.32-71.64 284.52-177.41a32.35 32.35 0 0 0 0-29.19zM288 400c-98.65 0-189.09-55-237.93-144C98.91 167 189.34 112 288 112s189.09 55 237.93 144C477.1 345 386.66 400 288 400z\"]\n};\nvar faEyeSlash = {\n prefix: 'far',\n iconName: 'eye-slash',\n icon: [640, 512, [], \"f070\", \"M634 471L36 3.51A16 16 0 0 0 13.51 6l-10 12.49A16 16 0 0 0 6 41l598 467.49a16 16 0 0 0 22.49-2.49l10-12.49A16 16 0 0 0 634 471zM296.79 146.47l134.79 105.38C429.36 191.91 380.48 144 320 144a112.26 112.26 0 0 0-23.21 2.47zm46.42 219.07L208.42 260.16C210.65 320.09 259.53 368 320 368a113 113 0 0 0 23.21-2.46zM320 112c98.65 0 189.09 55 237.93 144a285.53 285.53 0 0 1-44 60.2l37.74 29.5a333.7 333.7 0 0 0 52.9-75.11 32.35 32.35 0 0 0 0-29.19C550.29 135.59 442.93 64 320 64c-36.7 0-71.71 7-104.63 18.81l46.41 36.29c18.94-4.3 38.34-7.1 58.22-7.1zm0 288c-98.65 0-189.08-55-237.93-144a285.47 285.47 0 0 1 44.05-60.19l-37.74-29.5a333.6 333.6 0 0 0-52.89 75.1 32.35 32.35 0 0 0 0 29.19C89.72 376.41 197.08 448 320 448c36.7 0 71.71-7.05 104.63-18.81l-46.41-36.28C359.28 397.2 339.89 400 320 400z\"]\n};\nvar faFile = {\n prefix: 'far',\n iconName: 'file',\n icon: [384, 512, [], \"f15b\", \"M369.9 97.9L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM332.1 128H256V51.9l76.1 76.1zM48 464V48h160v104c0 13.3 10.7 24 24 24h104v288H48z\"]\n};\nvar faFileAlt = {\n prefix: 'far',\n iconName: 'file-alt',\n icon: [384, 512, [], \"f15c\", \"M288 248v28c0 6.6-5.4 12-12 12H108c-6.6 0-12-5.4-12-12v-28c0-6.6 5.4-12 12-12h168c6.6 0 12 5.4 12 12zm-12 72H108c-6.6 0-12 5.4-12 12v28c0 6.6 5.4 12 12 12h168c6.6 0 12-5.4 12-12v-28c0-6.6-5.4-12-12-12zm108-188.1V464c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V48C0 21.5 21.5 0 48 0h204.1C264.8 0 277 5.1 286 14.1L369.9 98c9 8.9 14.1 21.2 14.1 33.9zm-128-80V128h76.1L256 51.9zM336 464V176H232c-13.3 0-24-10.7-24-24V48H48v416h288z\"]\n};\nvar faFileArchive = {\n prefix: 'far',\n iconName: 'file-archive',\n icon: [384, 512, [], \"f1c6\", \"M128.3 160v32h32v-32zm64-96h-32v32h32zm-64 32v32h32V96zm64 32h-32v32h32zm177.6-30.1L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM256 51.9l76.1 76.1H256zM336 464H48V48h79.7v16h32V48H208v104c0 13.3 10.7 24 24 24h104zM194.2 265.7c-1.1-5.6-6-9.7-11.8-9.7h-22.1v-32h-32v32l-19.7 97.1C102 385.6 126.8 416 160 416c33.1 0 57.9-30.2 51.5-62.6zm-33.9 124.4c-17.9 0-32.4-12.1-32.4-27s14.5-27 32.4-27 32.4 12.1 32.4 27-14.5 27-32.4 27zm32-198.1h-32v32h32z\"]\n};\nvar faFileAudio = {\n prefix: 'far',\n iconName: 'file-audio',\n icon: [384, 512, [], \"f1c7\", \"M369.941 97.941l-83.882-83.882A48 48 0 0 0 252.118 0H48C21.49 0 0 21.49 0 48v416c0 26.51 21.49 48 48 48h288c26.51 0 48-21.49 48-48V131.882a48 48 0 0 0-14.059-33.941zM332.118 128H256V51.882L332.118 128zM48 464V48h160v104c0 13.255 10.745 24 24 24h104v288H48zm144-76.024c0 10.691-12.926 16.045-20.485 8.485L136 360.486h-28c-6.627 0-12-5.373-12-12v-56c0-6.627 5.373-12 12-12h28l35.515-36.947c7.56-7.56 20.485-2.206 20.485 8.485v135.952zm41.201-47.13c9.051-9.297 9.06-24.133.001-33.439-22.149-22.752 12.235-56.246 34.395-33.481 27.198 27.94 27.212 72.444.001 100.401-21.793 22.386-56.947-10.315-34.397-33.481z\"]\n};\nvar faFileCode = {\n prefix: 'far',\n iconName: 'file-code',\n icon: [384, 512, [], \"f1c9\", \"M149.9 349.1l-.2-.2-32.8-28.9 32.8-28.9c3.6-3.2 4-8.8.8-12.4l-.2-.2-17.4-18.6c-3.4-3.6-9-3.7-12.4-.4l-57.7 54.1c-3.7 3.5-3.7 9.4 0 12.8l57.7 54.1c1.6 1.5 3.8 2.4 6 2.4 2.4 0 4.8-1 6.4-2.8l17.4-18.6c3.3-3.5 3.1-9.1-.4-12.4zm220-251.2L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM256 51.9l76.1 76.1H256zM336 464H48V48h160v104c0 13.3 10.7 24 24 24h104zM209.6 214c-4.7-1.4-9.5 1.3-10.9 6L144 408.1c-1.4 4.7 1.3 9.6 6 10.9l24.4 7.1c4.7 1.4 9.6-1.4 10.9-6L240 231.9c1.4-4.7-1.3-9.6-6-10.9zm24.5 76.9l.2.2 32.8 28.9-32.8 28.9c-3.6 3.2-4 8.8-.8 12.4l.2.2 17.4 18.6c3.3 3.5 8.9 3.7 12.4.4l57.7-54.1c3.7-3.5 3.7-9.4 0-12.8l-57.7-54.1c-3.5-3.3-9.1-3.2-12.4.4l-17.4 18.6c-3.3 3.5-3.1 9.1.4 12.4z\"]\n};\nvar faFileExcel = {\n prefix: 'far',\n iconName: 'file-excel',\n icon: [384, 512, [], \"f1c3\", \"M369.9 97.9L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM332.1 128H256V51.9l76.1 76.1zM48 464V48h160v104c0 13.3 10.7 24 24 24h104v288H48zm212-240h-28.8c-4.4 0-8.4 2.4-10.5 6.3-18 33.1-22.2 42.4-28.6 57.7-13.9-29.1-6.9-17.3-28.6-57.7-2.1-3.9-6.2-6.3-10.6-6.3H124c-9.3 0-15 10-10.4 18l46.3 78-46.3 78c-4.7 8 1.1 18 10.4 18h28.9c4.4 0 8.4-2.4 10.5-6.3 21.7-40 23-45 28.6-57.7 14.9 30.2 5.9 15.9 28.6 57.7 2.1 3.9 6.2 6.3 10.6 6.3H260c9.3 0 15-10 10.4-18L224 320c.7-1.1 30.3-50.5 46.3-78 4.7-8-1.1-18-10.3-18z\"]\n};\nvar faFileImage = {\n prefix: 'far',\n iconName: 'file-image',\n icon: [384, 512, [], \"f1c5\", \"M369.9 97.9L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM332.1 128H256V51.9l76.1 76.1zM48 464V48h160v104c0 13.3 10.7 24 24 24h104v288H48zm32-48h224V288l-23.5-23.5c-4.7-4.7-12.3-4.7-17 0L176 352l-39.5-39.5c-4.7-4.7-12.3-4.7-17 0L80 352v64zm48-240c-26.5 0-48 21.5-48 48s21.5 48 48 48 48-21.5 48-48-21.5-48-48-48z\"]\n};\nvar faFilePdf = {\n prefix: 'far',\n iconName: 'file-pdf',\n icon: [384, 512, [], \"f1c1\", \"M369.9 97.9L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM332.1 128H256V51.9l76.1 76.1zM48 464V48h160v104c0 13.3 10.7 24 24 24h104v288H48zm250.2-143.7c-12.2-12-47-8.7-64.4-6.5-17.2-10.5-28.7-25-36.8-46.3 3.9-16.1 10.1-40.6 5.4-56-4.2-26.2-37.8-23.6-42.6-5.9-4.4 16.1-.4 38.5 7 67.1-10 23.9-24.9 56-35.4 74.4-20 10.3-47 26.2-51 46.2-3.3 15.8 26 55.2 76.1-31.2 22.4-7.4 46.8-16.5 68.4-20.1 18.9 10.2 41 17 55.8 17 25.5 0 28-28.2 17.5-38.7zm-198.1 77.8c5.1-13.7 24.5-29.5 30.4-35-19 30.3-30.4 35.7-30.4 35zm81.6-190.6c7.4 0 6.7 32.1 1.8 40.8-4.4-13.9-4.3-40.8-1.8-40.8zm-24.4 136.6c9.7-16.9 18-37 24.7-54.7 8.3 15.1 18.9 27.2 30.1 35.5-20.8 4.3-38.9 13.1-54.8 19.2zm131.6-5s-5 6-37.3-7.8c35.1-2.6 40.9 5.4 37.3 7.8z\"]\n};\nvar faFilePowerpoint = {\n prefix: 'far',\n iconName: 'file-powerpoint',\n icon: [384, 512, [], \"f1c4\", \"M369.9 97.9L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM332.1 128H256V51.9l76.1 76.1zM48 464V48h160v104c0 13.3 10.7 24 24 24h104v288H48zm72-60V236c0-6.6 5.4-12 12-12h69.2c36.7 0 62.8 27 62.8 66.3 0 74.3-68.7 66.5-95.5 66.5V404c0 6.6-5.4 12-12 12H132c-6.6 0-12-5.4-12-12zm48.5-87.4h23c7.9 0 13.9-2.4 18.1-7.2 8.5-9.8 8.4-28.5.1-37.8-4.1-4.6-9.9-7-17.4-7h-23.9v52z\"]\n};\nvar faFileVideo = {\n prefix: 'far',\n iconName: 'file-video',\n icon: [384, 512, [], \"f1c8\", \"M369.941 97.941l-83.882-83.882A48 48 0 0 0 252.118 0H48C21.49 0 0 21.49 0 48v416c0 26.51 21.49 48 48 48h288c26.51 0 48-21.49 48-48V131.882a48 48 0 0 0-14.059-33.941zM332.118 128H256V51.882L332.118 128zM48 464V48h160v104c0 13.255 10.745 24 24 24h104v288H48zm228.687-211.303L224 305.374V268c0-11.046-8.954-20-20-20H100c-11.046 0-20 8.954-20 20v104c0 11.046 8.954 20 20 20h104c11.046 0 20-8.954 20-20v-37.374l52.687 52.674C286.704 397.318 304 390.28 304 375.986V264.011c0-14.311-17.309-21.319-27.313-11.314z\"]\n};\nvar faFileWord = {\n prefix: 'far',\n iconName: 'file-word',\n icon: [384, 512, [], \"f1c2\", \"M369.9 97.9L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM332.1 128H256V51.9l76.1 76.1zM48 464V48h160v104c0 13.3 10.7 24 24 24h104v288H48zm220.1-208c-5.7 0-10.6 4-11.7 9.5-20.6 97.7-20.4 95.4-21 103.5-.2-1.2-.4-2.6-.7-4.3-.8-5.1.3.2-23.6-99.5-1.3-5.4-6.1-9.2-11.7-9.2h-13.3c-5.5 0-10.3 3.8-11.7 9.1-24.4 99-24 96.2-24.8 103.7-.1-1.1-.2-2.5-.5-4.2-.7-5.2-14.1-73.3-19.1-99-1.1-5.6-6-9.7-11.8-9.7h-16.8c-7.8 0-13.5 7.3-11.7 14.8 8 32.6 26.7 109.5 33.2 136 1.3 5.4 6.1 9.1 11.7 9.1h25.2c5.5 0 10.3-3.7 11.6-9.1l17.9-71.4c1.5-6.2 2.5-12 3-17.3l2.9 17.3c.1.4 12.6 50.5 17.9 71.4 1.3 5.3 6.1 9.1 11.6 9.1h24.7c5.5 0 10.3-3.7 11.6-9.1 20.8-81.9 30.2-119 34.5-136 1.9-7.6-3.8-14.9-11.6-14.9h-15.8z\"]\n};\nvar faFlag = {\n prefix: 'far',\n iconName: 'flag',\n icon: [512, 512, [], \"f024\", \"M336.174 80c-49.132 0-93.305-32-161.913-32-31.301 0-58.303 6.482-80.721 15.168a48.04 48.04 0 0 0 2.142-20.727C93.067 19.575 74.167 1.594 51.201.104 23.242-1.71 0 20.431 0 48c0 17.764 9.657 33.262 24 41.562V496c0 8.837 7.163 16 16 16h16c8.837 0 16-7.163 16-16v-83.443C109.869 395.28 143.259 384 199.826 384c49.132 0 93.305 32 161.913 32 58.479 0 101.972-22.617 128.548-39.981C503.846 367.161 512 352.051 512 335.855V95.937c0-34.459-35.264-57.768-66.904-44.117C409.193 67.309 371.641 80 336.174 80zM464 336c-21.783 15.412-60.824 32-102.261 32-59.945 0-102.002-32-161.913-32-43.361 0-96.379 9.403-127.826 24V128c21.784-15.412 60.824-32 102.261-32 59.945 0 102.002 32 161.913 32 43.271 0 96.32-17.366 127.826-32v240z\"]\n};\nvar faFlushed = {\n prefix: 'far',\n iconName: 'flushed',\n icon: [496, 512, [], \"f579\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm96-312c-44.2 0-80 35.8-80 80s35.8 80 80 80 80-35.8 80-80-35.8-80-80-80zm0 128c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zm0-72c-13.3 0-24 10.7-24 24s10.7 24 24 24 24-10.7 24-24-10.7-24-24-24zm-112 24c0-44.2-35.8-80-80-80s-80 35.8-80 80 35.8 80 80 80 80-35.8 80-80zm-80 48c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zm0-72c-13.3 0-24 10.7-24 24s10.7 24 24 24 24-10.7 24-24-10.7-24-24-24zm160 144H184c-13.2 0-24 10.8-24 24s10.8 24 24 24h128c13.2 0 24-10.8 24-24s-10.8-24-24-24z\"]\n};\nvar faFolder = {\n prefix: 'far',\n iconName: 'folder',\n icon: [512, 512, [], \"f07b\", \"M464 128H272l-54.63-54.63c-6-6-14.14-9.37-22.63-9.37H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V176c0-26.51-21.49-48-48-48zm0 272H48V112h140.12l54.63 54.63c6 6 14.14 9.37 22.63 9.37H464v224z\"]\n};\nvar faFolderOpen = {\n prefix: 'far',\n iconName: 'folder-open',\n icon: [576, 512, [], \"f07c\", \"M527.9 224H480v-48c0-26.5-21.5-48-48-48H272l-64-64H48C21.5 64 0 85.5 0 112v288c0 26.5 21.5 48 48 48h400c16.5 0 31.9-8.5 40.7-22.6l79.9-128c20-31.9-3-73.4-40.7-73.4zM48 118c0-3.3 2.7-6 6-6h134.1l64 64H426c3.3 0 6 2.7 6 6v42H152c-16.8 0-32.4 8.8-41.1 23.2L48 351.4zm400 282H72l77.2-128H528z\"]\n};\nvar faFontAwesomeLogoFull = {\n prefix: 'far',\n iconName: 'font-awesome-logo-full',\n icon: [3992, 512, [\"Font Awesome\"], \"f4e6\", \"M454.6 0H57.4C25.9 0 0 25.9 0 57.4v397.3C0 486.1 25.9 512 57.4 512h397.3c31.4 0 57.4-25.9 57.4-57.4V57.4C512 25.9 486.1 0 454.6 0zm-58.9 324.9c0 4.8-4.1 6.9-8.9 8.9-19.2 8.1-39.7 15.7-61.5 15.7-40.5 0-68.7-44.8-163.2 2.5v51.8c0 30.3-45.7 30.2-45.7 0v-250c-9-7-15-17.9-15-30.3 0-21 17.1-38.2 38.2-38.2 21 0 38.2 17.1 38.2 38.2 0 12.2-5.8 23.2-14.9 30.2v21c37.1-12 65.5-34.4 146.1-3.4 26.6 11.4 68.7-15.7 76.5-15.7 5.5 0 10.3 4.1 10.3 8.9v160.4zm432.9-174.2h-137v70.1H825c39.8 0 40.4 62.2 0 62.2H691.6v105.6c0 45.5-70.7 46.4-70.7 0V128.3c0-22 18-39.8 39.8-39.8h167.8c39.6 0 40.5 62.2.1 62.2zm191.1 23.4c-169.3 0-169.1 252.4 0 252.4 169.9 0 169.9-252.4 0-252.4zm0 196.1c-81.6 0-82.1-139.8 0-139.8 82.5 0 82.4 139.8 0 139.8zm372.4 53.4c-17.5 0-31.4-13.9-31.4-31.4v-117c0-62.4-72.6-52.5-99.1-16.4v133.4c0 41.5-63.3 41.8-63.3 0V208c0-40 63.1-41.6 63.1 0v3.4c43.3-51.6 162.4-60.4 162.4 39.3v141.5c.3 30.4-31.5 31.4-31.7 31.4zm179.7 2.9c-44.3 0-68.3-22.9-68.3-65.8V235.2H1488c-35.6 0-36.7-55.3 0-55.3h15.5v-37.3c0-41.3 63.8-42.1 63.8 0v37.5h24.9c35.4 0 35.7 55.3 0 55.3h-24.9v108.5c0 29.6 26.1 26.3 27.4 26.3 31.4 0 52.6 56.3-22.9 56.3zM1992 123c-19.5-50.2-95.5-50-114.5 0-107.3 275.7-99.5 252.7-99.5 262.8 0 42.8 58.3 51.2 72.1 14.4l13.5-35.9H2006l13 35.9c14.2 37.7 72.1 27.2 72.1-14.4 0-10.1 5.3 6.8-99.1-262.8zm-108.9 179.1l51.7-142.9 51.8 142.9h-103.5zm591.3-85.6l-53.7 176.3c-12.4 41.2-72 41-84 0l-42.3-135.9-42.3 135.9c-12.4 40.9-72 41.2-84.5 0l-54.2-176.3c-12.5-39.4 49.8-56.1 60.2-16.9L2213 342l45.3-139.5c10.9-32.7 59.6-34.7 71.2 0l45.3 139.5 39.3-142.4c10.3-38.3 72.6-23.8 60.3 16.9zm275.4 75.1c0-42.4-33.9-117.5-119.5-117.5-73.2 0-124.4 56.3-124.4 126 0 77.2 55.3 126.4 128.5 126.4 31.7 0 93-11.5 93-39.8 0-18.3-21.1-31.5-39.3-22.4-49.4 26.2-109 8.4-115.9-43.8h148.3c16.3 0 29.3-13.4 29.3-28.9zM2571 277.7c9.5-73.4 113.9-68.6 118.6 0H2571zm316.7 148.8c-31.4 0-81.6-10.5-96.6-31.9-12.4-17 2.5-39.8 21.8-39.8 16.3 0 36.8 22.9 77.7 22.9 27.4 0 40.4-11 40.4-25.8 0-39.8-142.9-7.4-142.9-102 0-40.4 35.3-75.7 98.6-75.7 31.4 0 74.1 9.9 87.6 29.4 10.8 14.8-1.4 36.2-20.9 36.2-15.1 0-26.7-17.3-66.2-17.3-22.9 0-37.8 10.5-37.8 23.8 0 35.9 142.4 6 142.4 103.1-.1 43.7-37.4 77.1-104.1 77.1zm266.8-252.4c-169.3 0-169.1 252.4 0 252.4 170.1 0 169.6-252.4 0-252.4zm0 196.1c-81.8 0-82-139.8 0-139.8 82.5 0 82.4 139.8 0 139.8zm476.9 22V268.7c0-53.8-61.4-45.8-85.7-10.5v134c0 41.3-63.8 42.1-63.8 0V268.7c0-52.1-59.5-47.4-85.7-10.1v133.6c0 41.5-63.3 41.8-63.3 0V208c0-40 63.1-41.6 63.1 0v3.4c9.9-14.4 41.8-37.3 78.6-37.3 35.3 0 57.7 16.4 66.7 43.8 13.9-21.8 45.8-43.8 82.6-43.8 44.3 0 70.7 23.4 70.7 72.7v145.3c.5 17.3-13.5 31.4-31.9 31.4 3.5.1-31.3 1.1-31.3-31.3zM3992 291.6c0-42.4-32.4-117.5-117.9-117.5-73.2 0-127.5 56.3-127.5 126 0 77.2 58.3 126.4 131.6 126.4 31.7 0 91.5-11.5 91.5-39.8 0-18.3-21.1-31.5-39.3-22.4-49.4 26.2-110.5 8.4-117.5-43.8h149.8c16.3 0 29.1-13.4 29.3-28.9zm-180.5-13.9c9.7-74.4 115.9-68.3 120.1 0h-120.1z\"]\n};\nvar faFrown = {\n prefix: 'far',\n iconName: 'frown',\n icon: [496, 512, [], \"f119\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm-80-216c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm160-64c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm-80 128c-40.2 0-78 17.7-103.8 48.6-8.5 10.2-7.1 25.3 3.1 33.8 10.2 8.4 25.3 7.1 33.8-3.1 16.6-19.9 41-31.4 66.9-31.4s50.3 11.4 66.9 31.4c8.1 9.7 23.1 11.9 33.8 3.1 10.2-8.5 11.5-23.6 3.1-33.8C326 321.7 288.2 304 248 304z\"]\n};\nvar faFrownOpen = {\n prefix: 'far',\n iconName: 'frown-open',\n icon: [496, 512, [], \"f57a\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm-48-248c0-17.7-14.3-32-32-32s-32 14.3-32 32 14.3 32 32 32 32-14.3 32-32zm128-32c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm-80 112c-35.6 0-88.8 21.3-95.8 61.2-2 11.8 9 21.5 20.5 18.1 31.2-9.6 59.4-15.3 75.3-15.3s44.1 5.7 75.3 15.3c11.4 3.5 22.5-6.3 20.5-18.1-7-39.9-60.2-61.2-95.8-61.2z\"]\n};\nvar faFutbol = {\n prefix: 'far',\n iconName: 'futbol',\n icon: [496, 512, [], \"f1e3\", \"M483.8 179.4C449.8 74.6 352.6 8 248.1 8c-25.4 0-51.2 3.9-76.7 12.2C41.2 62.5-30.1 202.4 12.2 332.6 46.2 437.4 143.4 504 247.9 504c25.4 0 51.2-3.9 76.7-12.2 130.2-42.3 201.5-182.2 159.2-312.4zm-74.5 193.7l-52.2 6.4-43.7-60.9 24.4-75.2 71.1-22.1 38.9 36.4c-.2 30.7-7.4 61.1-21.7 89.2-4.7 9.3-10.7 17.8-16.8 26.2zm0-235.4l-10.4 53.1-70.7 22-64.2-46.5V92.5l47.4-26.2c39.2 13 73.4 38 97.9 71.4zM184.9 66.4L232 92.5v73.8l-64.2 46.5-70.6-22-10.1-52.5c24.3-33.4 57.9-58.6 97.8-71.9zM139 379.5L85.9 373c-14.4-20.1-37.3-59.6-37.8-115.3l39-36.4 71.1 22.2 24.3 74.3-43.5 61.7zm48.2 67l-22.4-48.1 43.6-61.7H287l44.3 61.7-22.4 48.1c-6.2 1.8-57.6 20.4-121.7 0z\"]\n};\nvar faGem = {\n prefix: 'far',\n iconName: 'gem',\n icon: [576, 512, [], \"f3a5\", \"M464 0H112c-4 0-7.8 2-10 5.4L2 152.6c-2.9 4.4-2.6 10.2.7 14.2l276 340.8c4.8 5.9 13.8 5.9 18.6 0l276-340.8c3.3-4.1 3.6-9.8.7-14.2L474.1 5.4C471.8 2 468.1 0 464 0zm-19.3 48l63.3 96h-68.4l-51.7-96h56.8zm-202.1 0h90.7l51.7 96H191l51.6-96zm-111.3 0h56.8l-51.7 96H68l63.3-96zm-43 144h51.4L208 352 88.3 192zm102.9 0h193.6L288 435.3 191.2 192zM368 352l68.2-160h51.4L368 352z\"]\n};\nvar faGrimace = {\n prefix: 'far',\n iconName: 'grimace',\n icon: [496, 512, [], \"f57f\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm-80-216c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm160 0c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm16 16H152c-26.5 0-48 21.5-48 48v32c0 26.5 21.5 48 48 48h192c26.5 0 48-21.5 48-48v-32c0-26.5-21.5-48-48-48zm-168 96h-24c-8.8 0-16-7.2-16-16v-8h40v24zm0-40h-40v-8c0-8.8 7.2-16 16-16h24v24zm64 40h-48v-24h48v24zm0-40h-48v-24h48v24zm64 40h-48v-24h48v24zm0-40h-48v-24h48v24zm56 24c0 8.8-7.2 16-16 16h-24v-24h40v8zm0-24h-40v-24h24c8.8 0 16 7.2 16 16v8z\"]\n};\nvar faGrin = {\n prefix: 'far',\n iconName: 'grin',\n icon: [496, 512, [], \"f580\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm105.6-151.4c-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.9-3.1-19.4 5.4-17.7 15.3 7.9 47.1 71.3 80 123.3 80s115.3-32.9 123.3-80c1.6-9.8-7.7-18.4-17.7-15.3zM168 240c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm160 0c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32z\"]\n};\nvar faGrinAlt = {\n prefix: 'far',\n iconName: 'grin-alt',\n icon: [496, 512, [], \"f581\", \"M200.3 248c12.4-18.7 15.1-37.3 15.7-56-.5-18.7-3.3-37.3-15.7-56-8-12-25.1-11.4-32.7 0-12.4 18.7-15.1 37.3-15.7 56 .5 18.7 3.3 37.3 15.7 56 8.1 12 25.2 11.4 32.7 0zm128 0c12.4-18.7 15.1-37.3 15.7-56-.5-18.7-3.3-37.3-15.7-56-8-12-25.1-11.4-32.7 0-12.4 18.7-15.1 37.3-15.7 56 .5 18.7 3.3 37.3 15.7 56 8.1 12 25.2 11.4 32.7 0zM248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm105.6-151.4c-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.9-3.1-19.4 5.3-17.7 15.3 7.9 47.2 71.3 80 123.3 80s115.3-32.9 123.3-80c1.6-9.8-7.7-18.4-17.7-15.3z\"]\n};\nvar faGrinBeam = {\n prefix: 'far',\n iconName: 'grin-beam',\n icon: [496, 512, [], \"f582\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm105.6-151.4c-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.8-3.1-19.4 5.3-17.7 15.3 7.9 47.1 71.3 80 123.3 80s115.3-32.9 123.3-80c1.6-9.8-7.7-18.4-17.7-15.3zm-235.9-72.9c3.5 1.1 7.4-.5 9.3-3.7l9.5-17c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c2.1 3.7 6.2 4.7 9.3 3.7 3.6-1.1 6-4.5 5.7-8.3-3.3-42.1-32.2-71.4-56-71.4s-52.7 29.3-56 71.4c-.3 3.7 2.1 7.2 5.7 8.3zm160 0c3.5 1.1 7.4-.5 9.3-3.7l9.5-17c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c2.1 3.7 6.2 4.7 9.3 3.7 3.6-1.1 6-4.5 5.7-8.3-3.3-42.1-32.2-71.4-56-71.4s-52.7 29.3-56 71.4c-.3 3.7 2.1 7.2 5.7 8.3z\"]\n};\nvar faGrinBeamSweat = {\n prefix: 'far',\n iconName: 'grin-beam-sweat',\n icon: [496, 512, [], \"f583\", \"M440 160c29.5 0 53.3-26.3 53.3-58.7 0-25-31.7-75.5-46.2-97.3-3.6-5.3-10.7-5.3-14.2 0-14.5 21.8-46.2 72.3-46.2 97.3 0 32.4 23.8 58.7 53.3 58.7zM248 400c51.9 0 115.3-32.9 123.3-80 1.7-9.9-7.7-18.5-17.7-15.3-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.8-3.1-19.4 5.3-17.7 15.3 8 47.1 71.4 80 123.3 80zm130.3-168.3c3.6-1.1 6-4.5 5.7-8.3-3.3-42.1-32.2-71.4-56-71.4s-52.7 29.3-56 71.4c-.3 3.7 2.1 7.2 5.7 8.3 3.5 1.1 7.4-.5 9.3-3.7l9.5-17c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c2.1 3.6 6.2 4.6 9.3 3.7zm105.3-52.9c-24.6 15.7-46 12.9-46.4 12.9 6.9 20.2 10.8 41.8 10.8 64.3 0 110.3-89.7 200-200 200S48 366.3 48 256 137.7 56 248 56c39.8 0 76.8 11.8 108 31.9 1.7-9.5 6.3-24.1 17.2-45.7C336.4 20.6 293.7 8 248 8 111 8 0 119 0 256s111 248 248 248 248-111 248-248c0-27-4.4-52.9-12.4-77.2zM168 189.4c12.3 0 23.8 7.9 31.5 21.6l9.5 17c2.1 3.7 6.2 4.7 9.3 3.7 3.6-1.1 6-4.5 5.7-8.3-3.3-42.1-32.2-71.4-56-71.4s-52.7 29.3-56 71.4c-.3 3.7 2.1 7.2 5.7 8.3 3.5 1.1 7.4-.5 9.3-3.7l9.5-17c7.7-13.8 19.2-21.6 31.5-21.6z\"]\n};\nvar faGrinHearts = {\n prefix: 'far',\n iconName: 'grin-hearts',\n icon: [496, 512, [], \"f584\", \"M353.6 304.6c-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.8-3.1-19.4 5.3-17.7 15.3 7.9 47.2 71.3 80 123.3 80s115.3-32.9 123.3-80c1.6-9.8-7.7-18.4-17.7-15.3zm-152.8-48.9c4.5 1.2 9.2-1.5 10.5-6l19.4-69.9c5.6-20.3-7.4-41.1-28.8-44.5-18.6-3-36.4 9.8-41.5 27.9l-2 7.1-7.1-1.9c-18.2-4.7-38.2 4.3-44.9 22-7.7 20.2 3.8 41.9 24.2 47.2l70.2 18.1zm188.8-65.3c-6.7-17.6-26.7-26.7-44.9-22l-7.1 1.9-2-7.1c-5-18.1-22.8-30.9-41.5-27.9-21.4 3.4-34.4 24.2-28.8 44.5l19.4 69.9c1.2 4.5 5.9 7.2 10.5 6l70.2-18.2c20.4-5.3 31.9-26.9 24.2-47.1zM248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200z\"]\n};\nvar faGrinSquint = {\n prefix: 'far',\n iconName: 'grin-squint',\n icon: [496, 512, [], \"f585\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm105.6-151.4c-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.9-3.1-19.4 5.4-17.7 15.3 7.9 47.1 71.3 80 123.3 80s115.3-32.9 123.3-80c1.6-9.8-7.7-18.4-17.7-15.3zm-234.7-40.8c3.6 4.2 9.9 5.7 15.3 2.5l80-48c3.6-2.2 5.8-6.1 5.8-10.3s-2.2-8.1-5.8-10.3l-80-48c-5.1-3-11.4-1.9-15.3 2.5-3.8 4.5-3.8 11-.1 15.5l33.6 40.3-33.6 40.3c-3.8 4.5-3.7 11.1.1 15.5zm242.9 2.5c5.4 3.2 11.7 1.7 15.3-2.5 3.8-4.5 3.8-11 .1-15.5L343.6 208l33.6-40.3c3.8-4.5 3.7-11-.1-15.5-3.8-4.4-10.2-5.4-15.3-2.5l-80 48c-3.6 2.2-5.8 6.1-5.8 10.3s2.2 8.1 5.8 10.3l80 48z\"]\n};\nvar faGrinSquintTears = {\n prefix: 'far',\n iconName: 'grin-squint-tears',\n icon: [512, 512, [], \"f586\", \"M117.1 384.1c-25.8 3.7-84 13.7-100.9 30.6-21.9 21.9-21.5 57.9.9 80.3s58.3 22.8 80.3.9C114.3 479 124.3 420.8 128 395c.8-6.4-4.6-11.8-10.9-10.9zm-41.2-41.7C40.3 268 53 176.1 114.6 114.6 152.4 76.8 202.6 56 256 56c36.2 0 70.8 9.8 101.2 27.7 3.8-20.3 8-36.1 12-48.3C333.8 17.2 294.9 8 256 8 192.5 8 129.1 32.2 80.6 80.6c-74.1 74.1-91.3 183.4-52 274 12.2-4.1 27.7-8.3 47.3-12.2zm352.3-187.6c45 76.6 34.9 176.9-30.8 242.6-37.8 37.8-88 58.6-141.4 58.6-30.5 0-59.8-7-86.4-19.8-3.9 19.5-8 35-12.2 47.2 31.4 13.6 65 20.6 98.7 20.6 63.5 0 126.9-24.2 175.4-72.6 78.1-78.1 93.1-195.4 45.2-288.6-12.3 4-28.2 8.1-48.5 12zm-33.3-26.9c25.8-3.7 84-13.7 100.9-30.6 21.9-21.9 21.5-57.9-.9-80.3s-58.3-22.8-80.3-.9C397.7 33 387.7 91.2 384 117c-.8 6.4 4.6 11.8 10.9 10.9zm-187 108.3c-3-3-7.2-4.2-11.4-3.2L106 255.7c-5.7 1.4-9.5 6.7-9.1 12.6.5 5.8 5.1 10.5 10.9 11l52.3 4.8 4.8 52.3c.5 5.8 5.2 10.4 11 10.9h.9c5.5 0 10.3-3.7 11.7-9.1l22.6-90.5c1-4.2-.2-8.5-3.2-11.5zm39.7-25.1l90.5-22.6c5.7-1.4 9.5-6.7 9.1-12.6-.5-5.8-5.1-10.5-10.9-11l-52.3-4.8-4.8-52.3c-.5-5.8-5.2-10.4-11-10.9-5.6-.1-11.2 3.4-12.6 9.1L233 196.5c-1 4.1.2 8.4 3.2 11.4 5 5 11.3 3.2 11.4 3.2zm52 88.5c-29.1 29.1-59.7 52.9-83.9 65.4-9.2 4.8-10 17.5-1.7 23.4 38.9 27.7 107 6.2 143.7-30.6S416 253 388.3 214.1c-5.8-8.2-18.5-7.6-23.4 1.7-12.3 24.2-36.2 54.7-65.3 83.8z\"]\n};\nvar faGrinStars = {\n prefix: 'far',\n iconName: 'grin-stars',\n icon: [496, 512, [], \"f587\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm105.6-151.4c-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.8-3.1-19.4 5.3-17.7 15.3 7.9 47.2 71.3 80 123.3 80s115.3-32.9 123.3-80c1.6-9.8-7.7-18.4-17.7-15.3zm-227.9-57.5c-1 6.2 5.4 11 11 7.9l31.3-16.3 31.3 16.3c5.6 3.1 12-1.7 11-7.9l-6-34.9 25.4-24.6c4.5-4.5 1.9-12.2-4.3-13.2l-34.9-5-15.5-31.6c-2.9-5.8-11-5.8-13.9 0l-15.5 31.6-34.9 5c-6.2.9-8.9 8.6-4.3 13.2l25.4 24.6-6.1 34.9zm259.7-72.7l-34.9-5-15.5-31.6c-2.9-5.8-11-5.8-13.9 0l-15.5 31.6-34.9 5c-6.2.9-8.9 8.6-4.3 13.2l25.4 24.6-6 34.9c-1 6.2 5.4 11 11 7.9l31.3-16.3 31.3 16.3c5.6 3.1 12-1.7 11-7.9l-6-34.9 25.4-24.6c4.5-4.6 1.8-12.2-4.4-13.2z\"]\n};\nvar faGrinTears = {\n prefix: 'far',\n iconName: 'grin-tears',\n icon: [640, 512, [], \"f588\", \"M117.1 256.1c-25.8 3.7-84 13.7-100.9 30.6-21.9 21.9-21.5 57.9.9 80.3s58.3 22.8 80.3.9C114.3 351 124.3 292.8 128 267c.8-6.4-4.6-11.8-10.9-10.9zm506.7 30.6c-16.9-16.9-75.1-26.9-100.9-30.6-6.3-.9-11.7 4.5-10.8 10.8 3.7 25.8 13.7 84 30.6 100.9 21.9 21.9 57.9 21.5 80.3-.9 22.3-22.3 22.7-58.3.8-80.2zm-126.6 61.7C463.8 412.3 396.9 456 320 456c-76.9 0-143.8-43.7-177.2-107.6-12.5 37.4-25.2 43.9-28.3 46.5C159.1 460.7 234.5 504 320 504s160.9-43.3 205.5-109.1c-3.2-2.7-15.9-9.2-28.3-46.5zM122.7 224.5C137.9 129.2 220.5 56 320 56c99.5 0 182.1 73.2 197.3 168.5 2.1-.2 5.2-2.4 49.5 7C554.4 106 448.7 8 320 8S85.6 106 73.2 231.4c44.5-9.4 47.1-7.2 49.5-6.9zM320 400c51.9 0 115.3-32.9 123.3-80 1.7-9.9-7.7-18.5-17.7-15.3-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.8-3.1-19.4 5.3-17.7 15.3 8 47.1 71.4 80 123.3 80zm130.3-168.3c3.6-1.1 6-4.5 5.7-8.3-3.3-42.1-32.2-71.4-56-71.4s-52.7 29.3-56 71.4c-.3 3.7 2.1 7.2 5.7 8.3 3.5 1.1 7.4-.5 9.3-3.7l9.5-17c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c2.1 3.6 6.2 4.6 9.3 3.7zM240 189.4c12.3 0 23.8 7.9 31.5 21.6l9.5 17c2.1 3.7 6.2 4.7 9.3 3.7 3.6-1.1 6-4.5 5.7-8.3-3.3-42.1-32.2-71.4-56-71.4s-52.7 29.3-56 71.4c-.3 3.7 2.1 7.2 5.7 8.3 3.5 1.1 7.4-.5 9.3-3.7l9.5-17c7.7-13.8 19.2-21.6 31.5-21.6z\"]\n};\nvar faGrinTongue = {\n prefix: 'far',\n iconName: 'grin-tongue',\n icon: [496, 512, [], \"f589\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm64 400c0 35.6-29.1 64.5-64.9 64-35.1-.5-63.1-29.8-63.1-65v-42.8l17.7-8.8c15-7.5 31.5 1.7 34.9 16.5l2.8 12.1c2.1 9.2 15.2 9.2 17.3 0l2.8-12.1c3.4-14.8 19.8-24.1 34.9-16.5l17.7 8.8V408zm28.2 25.3c2.2-8.1 3.8-16.5 3.8-25.3v-43.5c14.2-12.4 24.4-27.5 27.3-44.5 1.7-9.9-7.7-18.5-17.7-15.3-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.9-3.1-19.4 5.3-17.7 15.3 2.9 17 13.1 32.1 27.3 44.5V408c0 8.8 1.6 17.2 3.8 25.3C91.8 399.9 48 333 48 256c0-110.3 89.7-200 200-200s200 89.7 200 200c0 77-43.8 143.9-107.8 177.3zM168 176c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm160 0c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32z\"]\n};\nvar faGrinTongueSquint = {\n prefix: 'far',\n iconName: 'grin-tongue-squint',\n icon: [496, 512, [], \"f58a\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm64 400c0 35.6-29.1 64.5-64.9 64-35.1-.5-63.1-29.8-63.1-65v-42.8l17.7-8.8c15-7.5 31.5 1.7 34.9 16.5l2.8 12.1c2.1 9.2 15.2 9.2 17.3 0l2.8-12.1c3.4-14.8 19.8-24.1 34.9-16.5l17.7 8.8V408zm28.2 25.3c2.2-8.1 3.8-16.5 3.8-25.3v-43.5c14.2-12.4 24.4-27.5 27.3-44.5 1.7-9.9-7.7-18.5-17.7-15.3-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.9-3.1-19.4 5.3-17.7 15.3 2.9 17 13.1 32.1 27.3 44.5V408c0 8.8 1.6 17.2 3.8 25.3C91.8 399.9 48 333 48 256c0-110.3 89.7-200 200-200s200 89.7 200 200c0 77-43.8 143.9-107.8 177.3zm36.9-281.1c-3.8-4.4-10.3-5.5-15.3-2.5l-80 48c-3.6 2.2-5.8 6.1-5.8 10.3s2.2 8.1 5.8 10.3l80 48c5.4 3.2 11.7 1.7 15.3-2.5 3.8-4.5 3.8-11 .1-15.5L343.6 208l33.6-40.3c3.8-4.5 3.7-11.1-.1-15.5zm-162.9 45.5l-80-48c-5-3-11.4-2-15.3 2.5-3.8 4.5-3.8 11-.1 15.5l33.6 40.3-33.6 40.3c-3.8 4.5-3.7 11 .1 15.5 3.6 4.2 9.9 5.7 15.3 2.5l80-48c3.6-2.2 5.8-6.1 5.8-10.3s-2.2-8.1-5.8-10.3z\"]\n};\nvar faGrinTongueWink = {\n prefix: 'far',\n iconName: 'grin-tongue-wink',\n icon: [496, 512, [], \"f58b\", \"M152 180c-25.7 0-55.9 16.9-59.8 42.1-.8 5 1.7 10 6.1 12.4 4.4 2.4 9.9 1.8 13.7-1.6l9.5-8.5c14.8-13.2 46.2-13.2 61 0l9.5 8.5c2.5 2.2 8 4.7 13.7 1.6 4.4-2.4 6.9-7.4 6.1-12.4-3.9-25.2-34.1-42.1-59.8-42.1zm176-52c-44.2 0-80 35.8-80 80s35.8 80 80 80 80-35.8 80-80-35.8-80-80-80zm0 128c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zm0-72c-13.3 0-24 10.7-24 24s10.7 24 24 24 24-10.7 24-24-10.7-24-24-24zM248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm64 400c0 35.6-29.1 64.5-64.9 64-35.1-.5-63.1-29.8-63.1-65v-42.8l17.7-8.8c15-7.5 31.5 1.7 34.9 16.5l2.8 12.1c2.1 9.2 15.2 9.2 17.3 0l2.8-12.1c3.4-14.8 19.8-24.1 34.9-16.5l17.7 8.8V408zm28.2 25.3c2.2-8.1 3.8-16.5 3.8-25.3v-43.5c14.2-12.4 24.4-27.5 27.3-44.5 1.7-9.9-7.7-18.5-17.7-15.3-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.9-3.1-19.4 5.3-17.7 15.3 2.9 17 13.1 32.1 27.3 44.5V408c0 8.8 1.6 17.2 3.8 25.3C91.8 399.9 48 333 48 256c0-110.3 89.7-200 200-200s200 89.7 200 200c0 77-43.8 143.9-107.8 177.3z\"]\n};\nvar faGrinWink = {\n prefix: 'far',\n iconName: 'grin-wink',\n icon: [496, 512, [], \"f58c\", \"M328 180c-25.69 0-55.88 16.92-59.86 42.12-1.75 11.22 11.5 18.24 19.83 10.84l9.55-8.48c14.81-13.19 46.16-13.19 60.97 0l9.55 8.48c8.48 7.43 21.56.25 19.83-10.84C383.88 196.92 353.69 180 328 180zm-160 60c17.67 0 32-14.33 32-32s-14.33-32-32-32-32 14.33-32 32 14.33 32 32 32zm185.55 64.64c-25.93 8.3-64.4 13.06-105.55 13.06s-79.62-4.75-105.55-13.06c-9.94-3.13-19.4 5.37-17.71 15.34C132.67 367.13 196.06 400 248 400s115.33-32.87 123.26-80.02c1.68-9.89-7.67-18.48-17.71-15.34zM248 8C111.03 8 0 119.03 0 256s111.03 248 248 248 248-111.03 248-248S384.97 8 248 8zm0 448c-110.28 0-200-89.72-200-200S137.72 56 248 56s200 89.72 200 200-89.72 200-200 200z\"]\n};\nvar faHandLizard = {\n prefix: 'far',\n iconName: 'hand-lizard',\n icon: [576, 512, [], \"f258\", \"M556.686 290.542L410.328 64.829C397.001 44.272 374.417 32 349.917 32H56C25.121 32 0 57.122 0 88v8c0 44.112 35.888 80 80 80h196.042l-18.333 48H144c-48.523 0-88 39.477-88 88 0 30.879 25.121 56 56 56h131.552c2.987 0 5.914.549 8.697 1.631L352 408.418V480h224V355.829c0-23.225-6.679-45.801-19.314-65.287zM528 432H400v-23.582c0-19.948-12.014-37.508-30.604-44.736l-99.751-38.788A71.733 71.733 0 0 0 243.552 320H112c-4.411 0-8-3.589-8-8 0-22.056 17.944-40 40-40h113.709c19.767 0 37.786-12.407 44.84-30.873l24.552-64.281c8.996-23.553-8.428-48.846-33.63-48.846H80c-17.645 0-32-14.355-32-32v-8c0-4.411 3.589-8 8-8h293.917c8.166 0 15.693 4.09 20.137 10.942l146.358 225.715A71.84 71.84 0 0 1 528 355.829V432z\"]\n};\nvar faHandPaper = {\n prefix: 'far',\n iconName: 'hand-paper',\n icon: [448, 512, [], \"f256\", \"M372.57 112.641v-10.825c0-43.612-40.52-76.691-83.039-65.546-25.629-49.5-94.09-47.45-117.982.747C130.269 26.456 89.144 57.945 89.144 102v126.13c-19.953-7.427-43.308-5.068-62.083 8.871-29.355 21.796-35.794 63.333-14.55 93.153L132.48 498.569a32 32 0 0 0 26.062 13.432h222.897c14.904 0 27.835-10.289 31.182-24.813l30.184-130.958A203.637 203.637 0 0 0 448 310.564V179c0-40.62-35.523-71.992-75.43-66.359zm27.427 197.922c0 11.731-1.334 23.469-3.965 34.886L368.707 464h-201.92L51.591 302.303c-14.439-20.27 15.023-42.776 29.394-22.605l27.128 38.079c8.995 12.626 29.031 6.287 29.031-9.283V102c0-25.645 36.571-24.81 36.571.691V256c0 8.837 7.163 16 16 16h6.856c8.837 0 16-7.163 16-16V67c0-25.663 36.571-24.81 36.571.691V256c0 8.837 7.163 16 16 16h6.856c8.837 0 16-7.163 16-16V101.125c0-25.672 36.57-24.81 36.57.691V256c0 8.837 7.163 16 16 16h6.857c8.837 0 16-7.163 16-16v-76.309c0-26.242 36.57-25.64 36.57-.691v131.563z\"]\n};\nvar faHandPeace = {\n prefix: 'far',\n iconName: 'hand-peace',\n icon: [448, 512, [], \"f25b\", \"M362.146 191.976c-13.71-21.649-38.761-34.016-65.006-30.341V74c0-40.804-32.811-74-73.141-74-40.33 0-73.14 33.196-73.14 74L160 168l-18.679-78.85C126.578 50.843 83.85 32.11 46.209 47.208 8.735 62.238-9.571 104.963 5.008 142.85l55.757 144.927c-30.557 24.956-43.994 57.809-24.733 92.218l54.853 97.999C102.625 498.97 124.73 512 148.575 512h205.702c30.744 0 57.558-21.44 64.555-51.797l27.427-118.999a67.801 67.801 0 0 0 1.729-15.203L448 256c0-44.956-43.263-77.343-85.854-64.024zM399.987 326c0 1.488-.169 2.977-.502 4.423l-27.427 119.001c-1.978 8.582-9.29 14.576-17.782 14.576H148.575c-6.486 0-12.542-3.621-15.805-9.449l-54.854-98c-4.557-8.141-2.619-18.668 4.508-24.488l26.647-21.764a16 16 0 0 0 4.812-18.139l-64.09-166.549C37.226 92.956 84.37 74.837 96.51 106.389l59.784 155.357A16 16 0 0 0 171.227 272h11.632c8.837 0 16-7.163 16-16V74c0-34.375 50.281-34.43 50.281 0v182c0 8.837 7.163 16 16 16h6.856c8.837 0 16-7.163 16-16v-28c0-25.122 36.567-25.159 36.567 0v28c0 8.837 7.163 16 16 16h6.856c8.837 0 16-7.163 16-16 0-25.12 36.567-25.16 36.567 0v70z\"]\n};\nvar faHandPointDown = {\n prefix: 'far',\n iconName: 'hand-point-down',\n icon: [448, 512, [], \"f0a7\", \"M188.8 512c45.616 0 83.2-37.765 83.2-83.2v-35.647a93.148 93.148 0 0 0 22.064-7.929c22.006 2.507 44.978-3.503 62.791-15.985C409.342 368.1 448 331.841 448 269.299V248c0-60.063-40-98.512-40-127.2v-2.679c4.952-5.747 8-13.536 8-22.12V32c0-17.673-12.894-32-28.8-32H156.8C140.894 0 128 14.327 128 32v64c0 8.584 3.048 16.373 8 22.12v2.679c0 6.964-6.193 14.862-23.668 30.183l-.148.129-.146.131c-9.937 8.856-20.841 18.116-33.253 25.851C48.537 195.798 0 207.486 0 252.8c0 56.928 35.286 92 83.2 92 8.026 0 15.489-.814 22.4-2.176V428.8c0 45.099 38.101 83.2 83.2 83.2zm0-48c-18.7 0-35.2-16.775-35.2-35.2V270.4c-17.325 0-35.2 26.4-70.4 26.4-26.4 0-35.2-20.625-35.2-44 0-8.794 32.712-20.445 56.1-34.926 14.575-9.074 27.225-19.524 39.875-30.799 18.374-16.109 36.633-33.836 39.596-59.075h176.752C364.087 170.79 400 202.509 400 248v21.299c0 40.524-22.197 57.124-61.325 50.601-8.001 14.612-33.979 24.151-53.625 12.925-18.225 19.365-46.381 17.787-61.05 4.95V428.8c0 18.975-16.225 35.2-35.2 35.2zM328 64c0-13.255 10.745-24 24-24s24 10.745 24 24-10.745 24-24 24-24-10.745-24-24z\"]\n};\nvar faHandPointLeft = {\n prefix: 'far',\n iconName: 'hand-point-left',\n icon: [512, 512, [], \"f0a5\", \"M0 220.8C0 266.416 37.765 304 83.2 304h35.647a93.148 93.148 0 0 0 7.929 22.064c-2.507 22.006 3.503 44.978 15.985 62.791C143.9 441.342 180.159 480 242.701 480H264c60.063 0 98.512-40 127.2-40h2.679c5.747 4.952 13.536 8 22.12 8h64c17.673 0 32-12.894 32-28.8V188.8c0-15.906-14.327-28.8-32-28.8h-64c-8.584 0-16.373 3.048-22.12 8H391.2c-6.964 0-14.862-6.193-30.183-23.668l-.129-.148-.131-.146c-8.856-9.937-18.116-20.841-25.851-33.253C316.202 80.537 304.514 32 259.2 32c-56.928 0-92 35.286-92 83.2 0 8.026.814 15.489 2.176 22.4H83.2C38.101 137.6 0 175.701 0 220.8zm48 0c0-18.7 16.775-35.2 35.2-35.2h158.4c0-17.325-26.4-35.2-26.4-70.4 0-26.4 20.625-35.2 44-35.2 8.794 0 20.445 32.712 34.926 56.1 9.074 14.575 19.524 27.225 30.799 39.875 16.109 18.374 33.836 36.633 59.075 39.596v176.752C341.21 396.087 309.491 432 264 432h-21.299c-40.524 0-57.124-22.197-50.601-61.325-14.612-8.001-24.151-33.979-12.925-53.625-19.365-18.225-17.787-46.381-4.95-61.05H83.2C64.225 256 48 239.775 48 220.8zM448 360c13.255 0 24 10.745 24 24s-10.745 24-24 24-24-10.745-24-24 10.745-24 24-24z\"]\n};\nvar faHandPointRight = {\n prefix: 'far',\n iconName: 'hand-point-right',\n icon: [512, 512, [], \"f0a4\", \"M428.8 137.6h-86.177a115.52 115.52 0 0 0 2.176-22.4c0-47.914-35.072-83.2-92-83.2-45.314 0-57.002 48.537-75.707 78.784-7.735 12.413-16.994 23.317-25.851 33.253l-.131.146-.129.148C135.662 161.807 127.764 168 120.8 168h-2.679c-5.747-4.952-13.536-8-22.12-8H32c-17.673 0-32 12.894-32 28.8v230.4C0 435.106 14.327 448 32 448h64c8.584 0 16.373-3.048 22.12-8h2.679c28.688 0 67.137 40 127.2 40h21.299c62.542 0 98.8-38.658 99.94-91.145 12.482-17.813 18.491-40.785 15.985-62.791A93.148 93.148 0 0 0 393.152 304H428.8c45.435 0 83.2-37.584 83.2-83.2 0-45.099-38.101-83.2-83.2-83.2zm0 118.4h-91.026c12.837 14.669 14.415 42.825-4.95 61.05 11.227 19.646 1.687 45.624-12.925 53.625 6.524 39.128-10.076 61.325-50.6 61.325H248c-45.491 0-77.21-35.913-120-39.676V215.571c25.239-2.964 42.966-21.222 59.075-39.596 11.275-12.65 21.725-25.3 30.799-39.875C232.355 112.712 244.006 80 252.8 80c23.375 0 44 8.8 44 35.2 0 35.2-26.4 53.075-26.4 70.4h158.4c18.425 0 35.2 16.5 35.2 35.2 0 18.975-16.225 35.2-35.2 35.2zM88 384c0 13.255-10.745 24-24 24s-24-10.745-24-24 10.745-24 24-24 24 10.745 24 24z\"]\n};\nvar faHandPointUp = {\n prefix: 'far',\n iconName: 'hand-point-up',\n icon: [448, 512, [], \"f0a6\", \"M105.6 83.2v86.177a115.52 115.52 0 0 0-22.4-2.176c-47.914 0-83.2 35.072-83.2 92 0 45.314 48.537 57.002 78.784 75.707 12.413 7.735 23.317 16.994 33.253 25.851l.146.131.148.129C129.807 376.338 136 384.236 136 391.2v2.679c-4.952 5.747-8 13.536-8 22.12v64c0 17.673 12.894 32 28.8 32h230.4c15.906 0 28.8-14.327 28.8-32v-64c0-8.584-3.048-16.373-8-22.12V391.2c0-28.688 40-67.137 40-127.2v-21.299c0-62.542-38.658-98.8-91.145-99.94-17.813-12.482-40.785-18.491-62.791-15.985A93.148 93.148 0 0 0 272 118.847V83.2C272 37.765 234.416 0 188.8 0c-45.099 0-83.2 38.101-83.2 83.2zm118.4 0v91.026c14.669-12.837 42.825-14.415 61.05 4.95 19.646-11.227 45.624-1.687 53.625 12.925 39.128-6.524 61.325 10.076 61.325 50.6V264c0 45.491-35.913 77.21-39.676 120H183.571c-2.964-25.239-21.222-42.966-39.596-59.075-12.65-11.275-25.3-21.725-39.875-30.799C80.712 279.645 48 267.994 48 259.2c0-23.375 8.8-44 35.2-44 35.2 0 53.075 26.4 70.4 26.4V83.2c0-18.425 16.5-35.2 35.2-35.2 18.975 0 35.2 16.225 35.2 35.2zM352 424c13.255 0 24 10.745 24 24s-10.745 24-24 24-24-10.745-24-24 10.745-24 24-24z\"]\n};\nvar faHandPointer = {\n prefix: 'far',\n iconName: 'hand-pointer',\n icon: [448, 512, [], \"f25a\", \"M358.182 179.361c-19.493-24.768-52.679-31.945-79.872-19.098-15.127-15.687-36.182-22.487-56.595-19.629V67c0-36.944-29.736-67-66.286-67S89.143 30.056 89.143 67v161.129c-19.909-7.41-43.272-5.094-62.083 8.872-29.355 21.795-35.793 63.333-14.55 93.152l109.699 154.001C134.632 501.59 154.741 512 176 512h178.286c30.802 0 57.574-21.5 64.557-51.797l27.429-118.999A67.873 67.873 0 0 0 448 326v-84c0-46.844-46.625-79.273-89.818-62.639zM80.985 279.697l27.126 38.079c8.995 12.626 29.031 6.287 29.031-9.283V67c0-25.12 36.571-25.16 36.571 0v175c0 8.836 7.163 16 16 16h6.857c8.837 0 16-7.164 16-16v-35c0-25.12 36.571-25.16 36.571 0v35c0 8.836 7.163 16 16 16H272c8.837 0 16-7.164 16-16v-21c0-25.12 36.571-25.16 36.571 0v21c0 8.836 7.163 16 16 16h6.857c8.837 0 16-7.164 16-16 0-25.121 36.571-25.16 36.571 0v84c0 1.488-.169 2.977-.502 4.423l-27.43 119.001c-1.978 8.582-9.29 14.576-17.782 14.576H176c-5.769 0-11.263-2.878-14.697-7.697l-109.712-154c-14.406-20.223 14.994-42.818 29.394-22.606zM176.143 400v-96c0-8.837 6.268-16 14-16h6c7.732 0 14 7.163 14 16v96c0 8.837-6.268 16-14 16h-6c-7.733 0-14-7.163-14-16zm75.428 0v-96c0-8.837 6.268-16 14-16h6c7.732 0 14 7.163 14 16v96c0 8.837-6.268 16-14 16h-6c-7.732 0-14-7.163-14-16zM327 400v-96c0-8.837 6.268-16 14-16h6c7.732 0 14 7.163 14 16v96c0 8.837-6.268 16-14 16h-6c-7.732 0-14-7.163-14-16z\"]\n};\nvar faHandRock = {\n prefix: 'far',\n iconName: 'hand-rock',\n icon: [512, 512, [], \"f255\", \"M408.864 79.052c-22.401-33.898-66.108-42.273-98.813-23.588-29.474-31.469-79.145-31.093-108.334-.022-47.16-27.02-108.71 5.055-110.671 60.806C44.846 105.407 0 140.001 0 187.429v56.953c0 32.741 14.28 63.954 39.18 85.634l97.71 85.081c4.252 3.702 3.11 5.573 3.11 32.903 0 17.673 14.327 32 32 32h252c17.673 0 32-14.327 32-32 0-23.513-1.015-30.745 3.982-42.37l42.835-99.656c6.094-14.177 9.183-29.172 9.183-44.568V146.963c0-52.839-54.314-88.662-103.136-67.911zM464 261.406a64.505 64.505 0 0 1-5.282 25.613l-42.835 99.655c-5.23 12.171-7.883 25.04-7.883 38.25V432H188v-10.286c0-16.37-7.14-31.977-19.59-42.817l-97.71-85.08C56.274 281.255 48 263.236 48 244.381v-56.953c0-33.208 52-33.537 52 .677v41.228a16 16 0 0 0 5.493 12.067l7 6.095A16 16 0 0 0 139 235.429V118.857c0-33.097 52-33.725 52 .677v26.751c0 8.836 7.164 16 16 16h7c8.836 0 16-7.164 16-16v-41.143c0-33.134 52-33.675 52 .677v40.466c0 8.836 7.163 16 16 16h7c8.837 0 16-7.164 16-16v-27.429c0-33.03 52-33.78 52 .677v26.751c0 8.836 7.163 16 16 16h7c8.837 0 16-7.164 16-16 0-33.146 52-33.613 52 .677v114.445z\"]\n};\nvar faHandScissors = {\n prefix: 'far',\n iconName: 'hand-scissors',\n icon: [512, 512, [], \"f257\", \"M256 480l70-.013c5.114 0 10.231-.583 15.203-1.729l118.999-27.427C490.56 443.835 512 417.02 512 386.277V180.575c0-23.845-13.03-45.951-34.005-57.69l-97.999-54.853c-34.409-19.261-67.263-5.824-92.218 24.733L142.85 37.008c-37.887-14.579-80.612 3.727-95.642 41.201-15.098 37.642 3.635 80.37 41.942 95.112L168 192l-94-9.141c-40.804 0-74 32.811-74 73.14 0 40.33 33.196 73.141 74 73.141h87.635c-3.675 26.245 8.692 51.297 30.341 65.006C178.657 436.737 211.044 480 256 480zm0-48.013c-25.16 0-25.12-36.567 0-36.567 8.837 0 16-7.163 16-16v-6.856c0-8.837-7.163-16-16-16h-28c-25.159 0-25.122-36.567 0-36.567h28c8.837 0 16-7.163 16-16v-6.856c0-8.837-7.163-16-16-16H74c-34.43 0-34.375-50.281 0-50.281h182c8.837 0 16-7.163 16-16v-11.632a16 16 0 0 0-10.254-14.933L106.389 128.51c-31.552-12.14-13.432-59.283 19.222-46.717l166.549 64.091a16.001 16.001 0 0 0 18.139-4.812l21.764-26.647c5.82-7.127 16.348-9.064 24.488-4.508l98 54.854c5.828 3.263 9.449 9.318 9.449 15.805v205.701c0 8.491-5.994 15.804-14.576 17.782l-119.001 27.427a19.743 19.743 0 0 1-4.423.502h-70z\"]\n};\nvar faHandSpock = {\n prefix: 'far',\n iconName: 'hand-spock',\n icon: [512, 512, [], \"f259\", \"M501.03053,116.17605c-19.39059-31.50779-51.24406-35.72849-66.31044-35.01756-14.11325-50.81051-62.0038-54.08-70.73816-54.08a74.03091,74.03091,0,0,0-72.23816,58.916l-4.64648,22.66014-13.68357-53.207c-9.09569-35.37107-46.412-64.05074-89.66-53.07223a73.89749,73.89749,0,0,0-55.121,78.94722,73.68273,73.68273,0,0,0-64.8495,94.42181l24.35933,82.19721c-38.24017-7.54492-62.79677,16.18358-68.11512,21.84764a73.6791,73.6791,0,0,0,3.19921,104.19329l91.36509,85.9765A154.164,154.164,0,0,0,220.62279,512h107.4549A127.30079,127.30079,0,0,0,452.3392,413.86139l57.623-241.96272A73.20274,73.20274,0,0,0,501.03053,116.17605Zm-37.7597,44.60544L405.64788,402.74812a79.46616,79.46616,0,0,1-77.57019,61.25972H220.62279a106.34052,106.34052,0,0,1-73.1366-28.998l-91.369-85.98041C31.34381,325.72669,66.61133,288.131,91.39644,311.5392l51.123,48.10739c5.42577,5.10937,13.48239.71679,13.48239-5.82617a246.79914,246.79914,0,0,0-10.17771-70.1523l-36.01362-121.539c-9.7324-32.88279,39.69916-47.27145,49.38664-14.625l31.3437,105.77923c5.59374,18.90428,33.78119,10.71288,28.9648-8.00781L177.06427,80.23662c-8.50389-33.1035,41.43157-45.64646,49.86515-12.83593l47.32609,184.035c4.42773,17.24218,29.16207,16.5039,32.71089-.80468l31.791-154.9706c6.81054-33.1074,57.51748-24.10741,50.11906,11.96288L360.32764,246.78924c-3.72265,18.10936,23.66793,24.63084,28.05659,6.21679L413.185,148.85962C421.1498,115.512,471.14,127.79713,463.27083,160.78149Z\"]\n};\nvar faHandshake = {\n prefix: 'far',\n iconName: 'handshake',\n icon: [640, 512, [], \"f2b5\", \"M519.2 127.9l-47.6-47.6A56.252 56.252 0 0 0 432 64H205.2c-14.8 0-29.1 5.9-39.6 16.3L118 127.9H0v255.7h64c17.6 0 31.8-14.2 31.9-31.7h9.1l84.6 76.4c30.9 25.1 73.8 25.7 105.6 3.8 12.5 10.8 26 15.9 41.1 15.9 18.2 0 35.3-7.4 48.8-24 22.1 8.7 48.2 2.6 64-16.8l26.2-32.3c5.6-6.9 9.1-14.8 10.9-23h57.9c.1 17.5 14.4 31.7 31.9 31.7h64V127.9H519.2zM48 351.6c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16c0 8.9-7.2 16-16 16zm390-6.9l-26.1 32.2c-2.8 3.4-7.8 4-11.3 1.2l-23.9-19.4-30 36.5c-6 7.3-15 4.8-18 2.4l-36.8-31.5-15.6 19.2c-13.9 17.1-39.2 19.7-55.3 6.6l-97.3-88H96V175.8h41.9l61.7-61.6c2-.8 3.7-1.5 5.7-2.3H262l-38.7 35.5c-29.4 26.9-31.1 72.3-4.4 101.3 14.8 16.2 61.2 41.2 101.5 4.4l8.2-7.5 108.2 87.8c3.4 2.8 3.9 7.9 1.2 11.3zm106-40.8h-69.2c-2.3-2.8-4.9-5.4-7.7-7.7l-102.7-83.4 12.5-11.4c6.5-6 7-16.1 1-22.6L367 167.1c-6-6.5-16.1-6.9-22.6-1l-55.2 50.6c-9.5 8.7-25.7 9.4-34.6 0-9.3-9.9-8.5-25.1 1.2-33.9l65.6-60.1c7.4-6.8 17-10.5 27-10.5l83.7-.2c2.1 0 4.1.8 5.5 2.3l61.7 61.6H544v128zm48 47.7c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16c0 8.9-7.2 16-16 16z\"]\n};\nvar faHdd = {\n prefix: 'far',\n iconName: 'hdd',\n icon: [576, 512, [], \"f0a0\", \"M567.403 235.642L462.323 84.589A48 48 0 0 0 422.919 64H153.081a48 48 0 0 0-39.404 20.589L8.597 235.642A48.001 48.001 0 0 0 0 263.054V400c0 26.51 21.49 48 48 48h480c26.51 0 48-21.49 48-48V263.054c0-9.801-3-19.366-8.597-27.412zM153.081 112h269.838l77.913 112H75.168l77.913-112zM528 400H48V272h480v128zm-32-64c0 17.673-14.327 32-32 32s-32-14.327-32-32 14.327-32 32-32 32 14.327 32 32zm-96 0c0 17.673-14.327 32-32 32s-32-14.327-32-32 14.327-32 32-32 32 14.327 32 32z\"]\n};\nvar faHeart = {\n prefix: 'far',\n iconName: 'heart',\n icon: [512, 512, [], \"f004\", \"M458.4 64.3C400.6 15.7 311.3 23 256 79.3 200.7 23 111.4 15.6 53.6 64.3-21.6 127.6-10.6 230.8 43 285.5l175.4 178.7c10 10.2 23.4 15.9 37.6 15.9 14.3 0 27.6-5.6 37.6-15.8L469 285.6c53.5-54.7 64.7-157.9-10.6-221.3zm-23.6 187.5L259.4 430.5c-2.4 2.4-4.4 2.4-6.8 0L77.2 251.8c-36.5-37.2-43.9-107.6 7.3-150.7 38.9-32.7 98.9-27.8 136.5 10.5l35 35.7 35-35.7c37.8-38.5 97.8-43.2 136.5-10.6 51.1 43.1 43.5 113.9 7.3 150.8z\"]\n};\nvar faHospital = {\n prefix: 'far',\n iconName: 'hospital',\n icon: [448, 512, [], \"f0f8\", \"M128 244v-40c0-6.627 5.373-12 12-12h40c6.627 0 12 5.373 12 12v40c0 6.627-5.373 12-12 12h-40c-6.627 0-12-5.373-12-12zm140 12h40c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12zm-76 84v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm76 12h40c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12zm180 124v36H0v-36c0-6.627 5.373-12 12-12h19.5V85.035C31.5 73.418 42.245 64 55.5 64H144V24c0-13.255 10.745-24 24-24h112c13.255 0 24 10.745 24 24v40h88.5c13.255 0 24 9.418 24 21.035V464H436c6.627 0 12 5.373 12 12zM79.5 463H192v-67c0-6.627 5.373-12 12-12h40c6.627 0 12 5.373 12 12v67h112.5V112H304v24c0 13.255-10.745 24-24 24H168c-13.255 0-24-10.745-24-24v-24H79.5v351zM266 64h-26V38a6 6 0 0 0-6-6h-20a6 6 0 0 0-6 6v26h-26a6 6 0 0 0-6 6v20a6 6 0 0 0 6 6h26v26a6 6 0 0 0 6 6h20a6 6 0 0 0 6-6V96h26a6 6 0 0 0 6-6V70a6 6 0 0 0-6-6z\"]\n};\nvar faHourglass = {\n prefix: 'far',\n iconName: 'hourglass',\n icon: [384, 512, [], \"f254\", \"M368 48h4c6.627 0 12-5.373 12-12V12c0-6.627-5.373-12-12-12H12C5.373 0 0 5.373 0 12v24c0 6.627 5.373 12 12 12h4c0 80.564 32.188 165.807 97.18 208C47.899 298.381 16 383.9 16 464h-4c-6.627 0-12 5.373-12 12v24c0 6.627 5.373 12 12 12h360c6.627 0 12-5.373 12-12v-24c0-6.627-5.373-12-12-12h-4c0-80.564-32.188-165.807-97.18-208C336.102 213.619 368 128.1 368 48zM64 48h256c0 101.62-57.307 184-128 184S64 149.621 64 48zm256 416H64c0-101.62 57.308-184 128-184s128 82.38 128 184z\"]\n};\nvar faIdBadge = {\n prefix: 'far',\n iconName: 'id-badge',\n icon: [384, 512, [], \"f2c1\", \"M336 0H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V48c0-26.5-21.5-48-48-48zm0 464H48V48h288v416zM144 112h96c8.8 0 16-7.2 16-16s-7.2-16-16-16h-96c-8.8 0-16 7.2-16 16s7.2 16 16 16zm48 176c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm-89.6 128h179.2c12.4 0 22.4-8.6 22.4-19.2v-19.2c0-31.8-30.1-57.6-67.2-57.6-10.8 0-18.7 8-44.8 8-26.9 0-33.4-8-44.8-8-37.1 0-67.2 25.8-67.2 57.6v19.2c0 10.6 10 19.2 22.4 19.2z\"]\n};\nvar faIdCard = {\n prefix: 'far',\n iconName: 'id-card',\n icon: [576, 512, [], \"f2c2\", \"M528 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h480c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm0 400H303.2c.9-4.5.8 3.6.8-22.4 0-31.8-30.1-57.6-67.2-57.6-10.8 0-18.7 8-44.8 8-26.9 0-33.4-8-44.8-8-37.1 0-67.2 25.8-67.2 57.6 0 26-.2 17.9.8 22.4H48V144h480v288zm-168-80h112c4.4 0 8-3.6 8-8v-16c0-4.4-3.6-8-8-8H360c-4.4 0-8 3.6-8 8v16c0 4.4 3.6 8 8 8zm0-64h112c4.4 0 8-3.6 8-8v-16c0-4.4-3.6-8-8-8H360c-4.4 0-8 3.6-8 8v16c0 4.4 3.6 8 8 8zm0-64h112c4.4 0 8-3.6 8-8v-16c0-4.4-3.6-8-8-8H360c-4.4 0-8 3.6-8 8v16c0 4.4 3.6 8 8 8zm-168 96c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64z\"]\n};\nvar faImage = {\n prefix: 'far',\n iconName: 'image',\n icon: [512, 512, [], \"f03e\", \"M464 64H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V112c0-26.51-21.49-48-48-48zm-6 336H54a6 6 0 0 1-6-6V118a6 6 0 0 1 6-6h404a6 6 0 0 1 6 6v276a6 6 0 0 1-6 6zM128 152c-22.091 0-40 17.909-40 40s17.909 40 40 40 40-17.909 40-40-17.909-40-40-40zM96 352h320v-80l-87.515-87.515c-4.686-4.686-12.284-4.686-16.971 0L192 304l-39.515-39.515c-4.686-4.686-12.284-4.686-16.971 0L96 304v48z\"]\n};\nvar faImages = {\n prefix: 'far',\n iconName: 'images',\n icon: [576, 512, [], \"f302\", \"M480 416v16c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48V176c0-26.51 21.49-48 48-48h16v48H54a6 6 0 0 0-6 6v244a6 6 0 0 0 6 6h372a6 6 0 0 0 6-6v-10h48zm42-336H150a6 6 0 0 0-6 6v244a6 6 0 0 0 6 6h372a6 6 0 0 0 6-6V86a6 6 0 0 0-6-6zm6-48c26.51 0 48 21.49 48 48v256c0 26.51-21.49 48-48 48H144c-26.51 0-48-21.49-48-48V80c0-26.51 21.49-48 48-48h384zM264 144c0 22.091-17.909 40-40 40s-40-17.909-40-40 17.909-40 40-40 40 17.909 40 40zm-72 96l39.515-39.515c4.686-4.686 12.284-4.686 16.971 0L288 240l103.515-103.515c4.686-4.686 12.284-4.686 16.971 0L480 208v80H192v-48z\"]\n};\nvar faKeyboard = {\n prefix: 'far',\n iconName: 'keyboard',\n icon: [576, 512, [], \"f11c\", \"M528 64H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h480c26.51 0 48-21.49 48-48V112c0-26.51-21.49-48-48-48zm8 336c0 4.411-3.589 8-8 8H48c-4.411 0-8-3.589-8-8V112c0-4.411 3.589-8 8-8h480c4.411 0 8 3.589 8 8v288zM170 270v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm96 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm96 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm96 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm-336 82v-28c0-6.627-5.373-12-12-12H82c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm384 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zM122 188v-28c0-6.627-5.373-12-12-12H82c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm96 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm96 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm96 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm96 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm-98 158v-16c0-6.627-5.373-12-12-12H180c-6.627 0-12 5.373-12 12v16c0 6.627 5.373 12 12 12h216c6.627 0 12-5.373 12-12z\"]\n};\nvar faKiss = {\n prefix: 'far',\n iconName: 'kiss',\n icon: [496, 512, [], \"f596\", \"M168 176c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm136 132c0-19.2-28.8-41.5-71.5-44-3.8-.4-7.4 2.4-8.2 6.2-.9 3.8 1.1 7.7 4.7 9.2l16.9 7.2c13 5.5 20.8 13.5 20.8 21.5s-7.8 16-20.7 21.5l-17 7.2c-5.7 2.4-6 12.2 0 14.8l16.9 7.2c13 5.5 20.8 13.5 20.8 21.5s-7.8 16-20.7 21.5l-17 7.2c-3.6 1.5-5.6 5.4-4.7 9.2.8 3.6 4.1 6.2 7.8 6.2h.5c42.8-2.5 71.5-24.8 71.5-44 0-13-13.4-27.3-35.2-36C290.6 335.3 304 321 304 308zM248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm80-280c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32z\"]\n};\nvar faKissBeam = {\n prefix: 'far',\n iconName: 'kiss-beam',\n icon: [496, 512, [], \"f597\", \"M168 152c-23.8 0-52.7 29.3-56 71.4-.3 3.7 2 7.2 5.6 8.3 3.5 1 7.5-.5 9.3-3.7l9.5-17c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c2.1 3.7 6.2 4.7 9.3 3.7 3.6-1.1 5.9-4.5 5.6-8.3-3.1-42.1-32-71.4-55.8-71.4zM248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm56-148c0-19.2-28.8-41.5-71.5-44-3.8-.4-7.4 2.4-8.2 6.2-.9 3.8 1.1 7.7 4.7 9.2l16.9 7.2c13 5.5 20.8 13.5 20.8 21.5s-7.8 16-20.7 21.5l-17 7.2c-5.7 2.4-6 12.2 0 14.8l16.9 7.2c13 5.5 20.8 13.5 20.8 21.5s-7.8 16-20.7 21.5l-17 7.2c-3.6 1.5-5.6 5.4-4.7 9.2.8 3.6 4.1 6.2 7.8 6.2h.5c42.8-2.5 71.5-24.8 71.5-44 0-13-13.4-27.3-35.2-36C290.6 335.3 304 321 304 308zm24-156c-23.8 0-52.7 29.3-56 71.4-.3 3.7 2 7.2 5.6 8.3 3.5 1 7.5-.5 9.3-3.7l9.5-17c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c2.1 3.7 6.2 4.7 9.3 3.7 3.6-1.1 5.9-4.5 5.6-8.3-3.1-42.1-32-71.4-55.8-71.4z\"]\n};\nvar faKissWinkHeart = {\n prefix: 'far',\n iconName: 'kiss-wink-heart',\n icon: [504, 512, [], \"f598\", \"M304 308.5c0-19.2-28.8-41.5-71.5-44-3.8-.4-7.4 2.4-8.2 6.2-.9 3.8 1.1 7.7 4.7 9.2l16.9 7.2c13 5.5 20.8 13.5 20.8 21.5s-7.8 16-20.7 21.5l-17 7.2c-5.7 2.4-6 12.2 0 14.8l16.9 7.2c13 5.5 20.8 13.5 20.8 21.5s-7.8 16-20.7 21.5l-17 7.2c-3.6 1.5-5.6 5.4-4.7 9.2.8 3.6 4.1 6.2 7.8 6.2h.5c42.8-2.5 71.5-24.8 71.5-44 0-13-13.4-27.3-35.2-36 21.7-9.1 35.1-23.4 35.1-36.4zm70.5-83.5l9.5 8.5c3.8 3.3 9.3 4 13.7 1.6 4.4-2.4 6.9-7.4 6.1-12.4-4-25.2-34.2-42.1-59.8-42.1s-55.9 16.9-59.8 42.1c-.8 5 1.7 10 6.1 12.4 5.8 3.1 11.2.7 13.7-1.6l9.5-8.5c14.8-13.2 46.2-13.2 61 0zM136 208.5c0 17.7 14.3 32 32 32s32-14.3 32-32-14.3-32-32-32-32 14.3-32 32zm365.1 194c-8-20.8-31.5-31.5-53.1-25.9l-8.4 2.2-2.3-8.4c-5.9-21.4-27-36.5-49-33-25.2 4-40.6 28.6-34 52.6l22.9 82.6c1.5 5.3 7 8.5 12.4 7.1l83-21.5c24.1-6.3 37.7-31.8 28.5-55.7zM334 436.3c-26.1 12.5-55.2 19.7-86 19.7-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200c0 22.1-3.7 43.3-10.4 63.2 9 6.4 17 14.2 22.6 23.9 6.4.1 12.6 1.4 18.6 2.9 10.9-27.9 17.1-58.2 17.1-90C496 119 385 8 248 8S0 119 0 256s111 248 248 248c35.4 0 68.9-7.5 99.4-20.9-2.5-7.3 4.3 17.2-13.4-46.8z\"]\n};\nvar faLaugh = {\n prefix: 'far',\n iconName: 'laugh',\n icon: [496, 512, [], \"f599\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm141.4 389.4c-37.8 37.8-88 58.6-141.4 58.6s-103.6-20.8-141.4-58.6S48 309.4 48 256s20.8-103.6 58.6-141.4S194.6 56 248 56s103.6 20.8 141.4 58.6S448 202.6 448 256s-20.8 103.6-58.6 141.4zM328 224c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm-160 0c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm194.4 64H133.6c-8.2 0-14.5 7-13.5 15 7.5 59.2 58.9 105 121.1 105h13.6c62.2 0 113.6-45.8 121.1-105 1-8-5.3-15-13.5-15z\"]\n};\nvar faLaughBeam = {\n prefix: 'far',\n iconName: 'laugh-beam',\n icon: [496, 512, [], \"f59a\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm141.4 389.4c-37.8 37.8-88 58.6-141.4 58.6s-103.6-20.8-141.4-58.6S48 309.4 48 256s20.8-103.6 58.6-141.4S194.6 56 248 56s103.6 20.8 141.4 58.6S448 202.6 448 256s-20.8 103.6-58.6 141.4zM328 152c-23.8 0-52.7 29.3-56 71.4-.7 8.6 10.8 11.9 14.9 4.5l9.5-17c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c4.1 7.4 15.6 4 14.9-4.5-3.1-42.1-32-71.4-55.8-71.4zm-201 75.9l9.5-17c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c4.1 7.4 15.6 4 14.9-4.5-3.3-42.1-32.2-71.4-56-71.4s-52.7 29.3-56 71.4c-.6 8.5 10.9 11.9 15.1 4.5zM362.4 288H133.6c-8.2 0-14.5 7-13.5 15 7.5 59.2 58.9 105 121.1 105h13.6c62.2 0 113.6-45.8 121.1-105 1-8-5.3-15-13.5-15z\"]\n};\nvar faLaughSquint = {\n prefix: 'far',\n iconName: 'laugh-squint',\n icon: [496, 512, [], \"f59b\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm141.4 389.4c-37.8 37.8-88 58.6-141.4 58.6s-103.6-20.8-141.4-58.6S48 309.4 48 256s20.8-103.6 58.6-141.4S194.6 56 248 56s103.6 20.8 141.4 58.6S448 202.6 448 256s-20.8 103.6-58.6 141.4zM343.6 196l33.6-40.3c8.6-10.3-3.8-24.8-15.4-18l-80 48c-7.8 4.7-7.8 15.9 0 20.6l80 48c11.5 6.8 24-7.6 15.4-18L343.6 196zm-209.4 58.3l80-48c7.8-4.7 7.8-15.9 0-20.6l-80-48c-11.6-6.9-24 7.7-15.4 18l33.6 40.3-33.6 40.3c-8.7 10.4 3.8 24.8 15.4 18zM362.4 288H133.6c-8.2 0-14.5 7-13.5 15 7.5 59.2 58.9 105 121.1 105h13.6c62.2 0 113.6-45.8 121.1-105 1-8-5.3-15-13.5-15z\"]\n};\nvar faLaughWink = {\n prefix: 'far',\n iconName: 'laugh-wink',\n icon: [496, 512, [], \"f59c\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm141.4 389.4c-37.8 37.8-88 58.6-141.4 58.6s-103.6-20.8-141.4-58.6C68.8 359.6 48 309.4 48 256s20.8-103.6 58.6-141.4C144.4 76.8 194.6 56 248 56s103.6 20.8 141.4 58.6c37.8 37.8 58.6 88 58.6 141.4s-20.8 103.6-58.6 141.4zM328 164c-25.7 0-55.9 16.9-59.9 42.1-1.7 11.2 11.5 18.2 19.8 10.8l9.5-8.5c14.8-13.2 46.2-13.2 61 0l9.5 8.5c8.5 7.4 21.6.3 19.8-10.8-3.8-25.2-34-42.1-59.7-42.1zm-160 60c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm194.4 64H133.6c-8.2 0-14.5 7-13.5 15 7.5 59.2 58.9 105 121.1 105h13.6c62.2 0 113.6-45.8 121.1-105 1-8-5.3-15-13.5-15z\"]\n};\nvar faLemon = {\n prefix: 'far',\n iconName: 'lemon',\n icon: [512, 512, [], \"f094\", \"M484.112 27.889C455.989-.233 416.108-8.057 387.059 8.865 347.604 31.848 223.504-41.111 91.196 91.197-41.277 223.672 31.923 347.472 8.866 387.058c-16.922 29.051-9.1 68.932 19.022 97.054 28.135 28.135 68.011 35.938 97.057 19.021 39.423-22.97 163.557 49.969 295.858-82.329 132.474-132.477 59.273-256.277 82.331-295.861 16.922-29.05 9.1-68.931-19.022-97.054zm-22.405 72.894c-38.8 66.609 45.6 165.635-74.845 286.08-120.44 120.443-219.475 36.048-286.076 74.843-22.679 13.207-64.035-27.241-50.493-50.488 38.8-66.609-45.6-165.635 74.845-286.08C245.573 4.702 344.616 89.086 411.219 50.292c22.73-13.24 64.005 27.288 50.488 50.491zm-169.861 8.736c1.37 10.96-6.404 20.957-17.365 22.327-54.846 6.855-135.779 87.787-142.635 142.635-1.373 10.989-11.399 18.734-22.326 17.365-10.961-1.37-18.735-11.366-17.365-22.326 9.162-73.286 104.167-168.215 177.365-177.365 10.953-1.368 20.956 6.403 22.326 17.364z\"]\n};\nvar faLifeRing = {\n prefix: 'far',\n iconName: 'life-ring',\n icon: [512, 512, [], \"f1cd\", \"M256 504c136.967 0 248-111.033 248-248S392.967 8 256 8 8 119.033 8 256s111.033 248 248 248zm-103.398-76.72l53.411-53.411c31.806 13.506 68.128 13.522 99.974 0l53.411 53.411c-63.217 38.319-143.579 38.319-206.796 0zM336 256c0 44.112-35.888 80-80 80s-80-35.888-80-80 35.888-80 80-80 80 35.888 80 80zm91.28 103.398l-53.411-53.411c13.505-31.806 13.522-68.128 0-99.974l53.411-53.411c38.319 63.217 38.319 143.579 0 206.796zM359.397 84.72l-53.411 53.411c-31.806-13.505-68.128-13.522-99.973 0L152.602 84.72c63.217-38.319 143.579-38.319 206.795 0zM84.72 152.602l53.411 53.411c-13.506 31.806-13.522 68.128 0 99.974L84.72 359.398c-38.319-63.217-38.319-143.579 0-206.796z\"]\n};\nvar faLightbulb = {\n prefix: 'far',\n iconName: 'lightbulb',\n icon: [352, 512, [], \"f0eb\", \"M176 80c-52.94 0-96 43.06-96 96 0 8.84 7.16 16 16 16s16-7.16 16-16c0-35.3 28.72-64 64-64 8.84 0 16-7.16 16-16s-7.16-16-16-16zM96.06 459.17c0 3.15.93 6.22 2.68 8.84l24.51 36.84c2.97 4.46 7.97 7.14 13.32 7.14h78.85c5.36 0 10.36-2.68 13.32-7.14l24.51-36.84c1.74-2.62 2.67-5.7 2.68-8.84l.05-43.18H96.02l.04 43.18zM176 0C73.72 0 0 82.97 0 176c0 44.37 16.45 84.85 43.56 115.78 16.64 18.99 42.74 58.8 52.42 92.16v.06h48v-.12c-.01-4.77-.72-9.51-2.15-14.07-5.59-17.81-22.82-64.77-62.17-109.67-20.54-23.43-31.52-53.15-31.61-84.14-.2-73.64 59.67-128 127.95-128 70.58 0 128 57.42 128 128 0 30.97-11.24 60.85-31.65 84.14-39.11 44.61-56.42 91.47-62.1 109.46a47.507 47.507 0 0 0-2.22 14.3v.1h48v-.05c9.68-33.37 35.78-73.18 52.42-92.16C335.55 260.85 352 220.37 352 176 352 78.8 273.2 0 176 0z\"]\n};\nvar faListAlt = {\n prefix: 'far',\n iconName: 'list-alt',\n icon: [512, 512, [], \"f022\", \"M464 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V80c0-26.51-21.49-48-48-48zm-6 400H54a6 6 0 0 1-6-6V86a6 6 0 0 1 6-6h404a6 6 0 0 1 6 6v340a6 6 0 0 1-6 6zm-42-92v24c0 6.627-5.373 12-12 12H204c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h200c6.627 0 12 5.373 12 12zm0-96v24c0 6.627-5.373 12-12 12H204c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h200c6.627 0 12 5.373 12 12zm0-96v24c0 6.627-5.373 12-12 12H204c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h200c6.627 0 12 5.373 12 12zm-252 12c0 19.882-16.118 36-36 36s-36-16.118-36-36 16.118-36 36-36 36 16.118 36 36zm0 96c0 19.882-16.118 36-36 36s-36-16.118-36-36 16.118-36 36-36 36 16.118 36 36zm0 96c0 19.882-16.118 36-36 36s-36-16.118-36-36 16.118-36 36-36 36 16.118 36 36z\"]\n};\nvar faMap = {\n prefix: 'far',\n iconName: 'map',\n icon: [576, 512, [], \"f279\", \"M560.02 32c-1.96 0-3.98.37-5.96 1.16L384.01 96H384L212 35.28A64.252 64.252 0 0 0 191.76 32c-6.69 0-13.37 1.05-19.81 3.14L20.12 87.95A32.006 32.006 0 0 0 0 117.66v346.32C0 473.17 7.53 480 15.99 480c1.96 0 3.97-.37 5.96-1.16L192 416l172 60.71a63.98 63.98 0 0 0 40.05.15l151.83-52.81A31.996 31.996 0 0 0 576 394.34V48.02c0-9.19-7.53-16.02-15.98-16.02zM224 90.42l128 45.19v285.97l-128-45.19V90.42zM48 418.05V129.07l128-44.53v286.2l-.64.23L48 418.05zm480-35.13l-128 44.53V141.26l.64-.24L528 93.95v288.97z\"]\n};\nvar faMeh = {\n prefix: 'far',\n iconName: 'meh',\n icon: [496, 512, [], \"f11a\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm-80-216c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm160-64c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm8 144H160c-13.2 0-24 10.8-24 24s10.8 24 24 24h176c13.2 0 24-10.8 24-24s-10.8-24-24-24z\"]\n};\nvar faMehBlank = {\n prefix: 'far',\n iconName: 'meh-blank',\n icon: [496, 512, [], \"f5a4\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm-80-280c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm160 0c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32z\"]\n};\nvar faMehRollingEyes = {\n prefix: 'far',\n iconName: 'meh-rolling-eyes',\n icon: [496, 512, [], \"f5a5\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm88-304c-39.8 0-72 32.2-72 72s32.2 72 72 72 72-32.2 72-72-32.2-72-72-72zm0 112c-22.1 0-40-17.9-40-40 0-13.6 7.3-25.1 17.7-32.3-1 2.6-1.7 5.3-1.7 8.3 0 13.3 10.7 24 24 24s24-10.7 24-24c0-2.9-.7-5.7-1.7-8.3 10.4 7.2 17.7 18.7 17.7 32.3 0 22.1-17.9 40-40 40zm-104-40c0-39.8-32.2-72-72-72s-72 32.2-72 72 32.2 72 72 72 72-32.2 72-72zm-112 0c0-13.6 7.3-25.1 17.7-32.3-1 2.6-1.7 5.3-1.7 8.3 0 13.3 10.7 24 24 24s24-10.7 24-24c0-2.9-.7-5.7-1.7-8.3 10.4 7.2 17.7 18.7 17.7 32.3 0 22.1-17.9 40-40 40s-40-17.9-40-40zm192 128H184c-13.2 0-24 10.8-24 24s10.8 24 24 24h128c13.2 0 24-10.8 24-24s-10.8-24-24-24z\"]\n};\nvar faMinusSquare = {\n prefix: 'far',\n iconName: 'minus-square',\n icon: [448, 512, [], \"f146\", \"M108 284c-6.6 0-12-5.4-12-12v-32c0-6.6 5.4-12 12-12h232c6.6 0 12 5.4 12 12v32c0 6.6-5.4 12-12 12H108zM448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-48 346V86c0-3.3-2.7-6-6-6H54c-3.3 0-6 2.7-6 6v340c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z\"]\n};\nvar faMoneyBillAlt = {\n prefix: 'far',\n iconName: 'money-bill-alt',\n icon: [640, 512, [], \"f3d1\", \"M320 144c-53.02 0-96 50.14-96 112 0 61.85 42.98 112 96 112 53 0 96-50.13 96-112 0-61.86-42.98-112-96-112zm40 168c0 4.42-3.58 8-8 8h-64c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h16v-55.44l-.47.31a7.992 7.992 0 0 1-11.09-2.22l-8.88-13.31a7.992 7.992 0 0 1 2.22-11.09l15.33-10.22a23.99 23.99 0 0 1 13.31-4.03H328c4.42 0 8 3.58 8 8v88h16c4.42 0 8 3.58 8 8v16zM608 64H32C14.33 64 0 78.33 0 96v320c0 17.67 14.33 32 32 32h576c17.67 0 32-14.33 32-32V96c0-17.67-14.33-32-32-32zm-16 272c-35.35 0-64 28.65-64 64H112c0-35.35-28.65-64-64-64V176c35.35 0 64-28.65 64-64h416c0 35.35 28.65 64 64 64v160z\"]\n};\nvar faMoon = {\n prefix: 'far',\n iconName: 'moon',\n icon: [512, 512, [], \"f186\", \"M279.135 512c78.756 0 150.982-35.804 198.844-94.775 28.27-34.831-2.558-85.722-46.249-77.401-82.348 15.683-158.272-47.268-158.272-130.792 0-48.424 26.06-92.292 67.434-115.836 38.745-22.05 28.999-80.788-15.022-88.919A257.936 257.936 0 0 0 279.135 0c-141.36 0-256 114.575-256 256 0 141.36 114.576 256 256 256zm0-464c12.985 0 25.689 1.201 38.016 3.478-54.76 31.163-91.693 90.042-91.693 157.554 0 113.848 103.641 199.2 215.252 177.944C402.574 433.964 344.366 464 279.135 464c-114.875 0-208-93.125-208-208s93.125-208 208-208z\"]\n};\nvar faNewspaper = {\n prefix: 'far',\n iconName: 'newspaper',\n icon: [576, 512, [], \"f1ea\", \"M552 64H112c-20.858 0-38.643 13.377-45.248 32H24c-13.255 0-24 10.745-24 24v272c0 30.928 25.072 56 56 56h496c13.255 0 24-10.745 24-24V88c0-13.255-10.745-24-24-24zM48 392V144h16v248c0 4.411-3.589 8-8 8s-8-3.589-8-8zm480 8H111.422c.374-2.614.578-5.283.578-8V112h416v288zM172 280h136c6.627 0 12-5.373 12-12v-96c0-6.627-5.373-12-12-12H172c-6.627 0-12 5.373-12 12v96c0 6.627 5.373 12 12 12zm28-80h80v40h-80v-40zm-40 140v-24c0-6.627 5.373-12 12-12h136c6.627 0 12 5.373 12 12v24c0 6.627-5.373 12-12 12H172c-6.627 0-12-5.373-12-12zm192 0v-24c0-6.627 5.373-12 12-12h104c6.627 0 12 5.373 12 12v24c0 6.627-5.373 12-12 12H364c-6.627 0-12-5.373-12-12zm0-144v-24c0-6.627 5.373-12 12-12h104c6.627 0 12 5.373 12 12v24c0 6.627-5.373 12-12 12H364c-6.627 0-12-5.373-12-12zm0 72v-24c0-6.627 5.373-12 12-12h104c6.627 0 12 5.373 12 12v24c0 6.627-5.373 12-12 12H364c-6.627 0-12-5.373-12-12z\"]\n};\nvar faObjectGroup = {\n prefix: 'far',\n iconName: 'object-group',\n icon: [512, 512, [], \"f247\", \"M500 128c6.627 0 12-5.373 12-12V44c0-6.627-5.373-12-12-12h-72c-6.627 0-12 5.373-12 12v12H96V44c0-6.627-5.373-12-12-12H12C5.373 32 0 37.373 0 44v72c0 6.627 5.373 12 12 12h12v256H12c-6.627 0-12 5.373-12 12v72c0 6.627 5.373 12 12 12h72c6.627 0 12-5.373 12-12v-12h320v12c0 6.627 5.373 12 12 12h72c6.627 0 12-5.373 12-12v-72c0-6.627-5.373-12-12-12h-12V128h12zm-52-64h32v32h-32V64zM32 64h32v32H32V64zm32 384H32v-32h32v32zm416 0h-32v-32h32v32zm-40-64h-12c-6.627 0-12 5.373-12 12v12H96v-12c0-6.627-5.373-12-12-12H72V128h12c6.627 0 12-5.373 12-12v-12h320v12c0 6.627 5.373 12 12 12h12v256zm-36-192h-84v-52c0-6.628-5.373-12-12-12H108c-6.627 0-12 5.372-12 12v168c0 6.628 5.373 12 12 12h84v52c0 6.628 5.373 12 12 12h200c6.627 0 12-5.372 12-12V204c0-6.628-5.373-12-12-12zm-268-24h144v112H136V168zm240 176H232v-24h76c6.627 0 12-5.372 12-12v-76h56v112z\"]\n};\nvar faObjectUngroup = {\n prefix: 'far',\n iconName: 'object-ungroup',\n icon: [576, 512, [], \"f248\", \"M564 224c6.627 0 12-5.373 12-12v-72c0-6.627-5.373-12-12-12h-72c-6.627 0-12 5.373-12 12v12h-88v-24h12c6.627 0 12-5.373 12-12V44c0-6.627-5.373-12-12-12h-72c-6.627 0-12 5.373-12 12v12H96V44c0-6.627-5.373-12-12-12H12C5.373 32 0 37.373 0 44v72c0 6.627 5.373 12 12 12h12v160H12c-6.627 0-12 5.373-12 12v72c0 6.627 5.373 12 12 12h72c6.627 0 12-5.373 12-12v-12h88v24h-12c-6.627 0-12 5.373-12 12v72c0 6.627 5.373 12 12 12h72c6.627 0 12-5.373 12-12v-12h224v12c0 6.627 5.373 12 12 12h72c6.627 0 12-5.373 12-12v-72c0-6.627-5.373-12-12-12h-12V224h12zM352 64h32v32h-32V64zm0 256h32v32h-32v-32zM64 352H32v-32h32v32zm0-256H32V64h32v32zm32 216v-12c0-6.627-5.373-12-12-12H72V128h12c6.627 0 12-5.373 12-12v-12h224v12c0 6.627 5.373 12 12 12h12v160h-12c-6.627 0-12 5.373-12 12v12H96zm128 136h-32v-32h32v32zm280-64h-12c-6.627 0-12 5.373-12 12v12H256v-12c0-6.627-5.373-12-12-12h-12v-24h88v12c0 6.627 5.373 12 12 12h72c6.627 0 12-5.373 12-12v-72c0-6.627-5.373-12-12-12h-12v-88h88v12c0 6.627 5.373 12 12 12h12v160zm40 64h-32v-32h32v32zm0-256h-32v-32h32v32z\"]\n};\nvar faPaperPlane = {\n prefix: 'far',\n iconName: 'paper-plane',\n icon: [512, 512, [], \"f1d8\", \"M440 6.5L24 246.4c-34.4 19.9-31.1 70.8 5.7 85.9L144 379.6V464c0 46.4 59.2 65.5 86.6 28.6l43.8-59.1 111.9 46.2c5.9 2.4 12.1 3.6 18.3 3.6 8.2 0 16.3-2.1 23.6-6.2 12.8-7.2 21.6-20 23.9-34.5l59.4-387.2c6.1-40.1-36.9-68.8-71.5-48.9zM192 464v-64.6l36.6 15.1L192 464zm212.6-28.7l-153.8-63.5L391 169.5c10.7-15.5-9.5-33.5-23.7-21.2L155.8 332.6 48 288 464 48l-59.4 387.3z\"]\n};\nvar faPauseCircle = {\n prefix: 'far',\n iconName: 'pause-circle',\n icon: [512, 512, [], \"f28b\", \"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm0 448c-110.5 0-200-89.5-200-200S145.5 56 256 56s200 89.5 200 200-89.5 200-200 200zm96-280v160c0 8.8-7.2 16-16 16h-48c-8.8 0-16-7.2-16-16V176c0-8.8 7.2-16 16-16h48c8.8 0 16 7.2 16 16zm-112 0v160c0 8.8-7.2 16-16 16h-48c-8.8 0-16-7.2-16-16V176c0-8.8 7.2-16 16-16h48c8.8 0 16 7.2 16 16z\"]\n};\nvar faPlayCircle = {\n prefix: 'far',\n iconName: 'play-circle',\n icon: [512, 512, [], \"f144\", \"M371.7 238l-176-107c-15.8-8.8-35.7 2.5-35.7 21v208c0 18.4 19.8 29.8 35.7 21l176-101c16.4-9.1 16.4-32.8 0-42zM504 256C504 119 393 8 256 8S8 119 8 256s111 248 248 248 248-111 248-248zm-448 0c0-110.5 89.5-200 200-200s200 89.5 200 200-89.5 200-200 200S56 366.5 56 256z\"]\n};\nvar faPlusSquare = {\n prefix: 'far',\n iconName: 'plus-square',\n icon: [448, 512, [], \"f0fe\", \"M352 240v32c0 6.6-5.4 12-12 12h-88v88c0 6.6-5.4 12-12 12h-32c-6.6 0-12-5.4-12-12v-88h-88c-6.6 0-12-5.4-12-12v-32c0-6.6 5.4-12 12-12h88v-88c0-6.6 5.4-12 12-12h32c6.6 0 12 5.4 12 12v88h88c6.6 0 12 5.4 12 12zm96-160v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-48 346V86c0-3.3-2.7-6-6-6H54c-3.3 0-6 2.7-6 6v340c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z\"]\n};\nvar faQuestionCircle = {\n prefix: 'far',\n iconName: 'question-circle',\n icon: [512, 512, [], \"f059\", \"M256 8C119.043 8 8 119.083 8 256c0 136.997 111.043 248 248 248s248-111.003 248-248C504 119.083 392.957 8 256 8zm0 448c-110.532 0-200-89.431-200-200 0-110.495 89.472-200 200-200 110.491 0 200 89.471 200 200 0 110.53-89.431 200-200 200zm107.244-255.2c0 67.052-72.421 68.084-72.421 92.863V300c0 6.627-5.373 12-12 12h-45.647c-6.627 0-12-5.373-12-12v-8.659c0-35.745 27.1-50.034 47.579-61.516 17.561-9.845 28.324-16.541 28.324-29.579 0-17.246-21.999-28.693-39.784-28.693-23.189 0-33.894 10.977-48.942 29.969-4.057 5.12-11.46 6.071-16.666 2.124l-27.824-21.098c-5.107-3.872-6.251-11.066-2.644-16.363C184.846 131.491 214.94 112 261.794 112c49.071 0 101.45 38.304 101.45 88.8zM298 368c0 23.159-18.841 42-42 42s-42-18.841-42-42 18.841-42 42-42 42 18.841 42 42z\"]\n};\nvar faRegistered = {\n prefix: 'far',\n iconName: 'registered',\n icon: [512, 512, [], \"f25d\", \"M256 8C119.033 8 8 119.033 8 256s111.033 248 248 248 248-111.033 248-248S392.967 8 256 8zm0 448c-110.532 0-200-89.451-200-200 0-110.531 89.451-200 200-200 110.532 0 200 89.451 200 200 0 110.532-89.451 200-200 200zm110.442-81.791c-53.046-96.284-50.25-91.468-53.271-96.085 24.267-13.879 39.482-41.563 39.482-73.176 0-52.503-30.247-85.252-101.498-85.252h-78.667c-6.617 0-12 5.383-12 12V380c0 6.617 5.383 12 12 12h38.568c6.617 0 12-5.383 12-12v-83.663h31.958l47.515 89.303a11.98 11.98 0 0 0 10.593 6.36h42.81c9.14 0 14.914-9.799 10.51-17.791zM256.933 239.906h-33.875v-64.14h27.377c32.417 0 38.929 12.133 38.929 31.709-.001 20.913-11.518 32.431-32.431 32.431z\"]\n};\nvar faSadCry = {\n prefix: 'far',\n iconName: 'sad-cry',\n icon: [496, 512, [], \"f5b3\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm144 386.4V280c0-13.2-10.8-24-24-24s-24 10.8-24 24v151.4C315.5 447 282.8 456 248 456s-67.5-9-96-24.6V280c0-13.2-10.8-24-24-24s-24 10.8-24 24v114.4c-34.6-36-56-84.7-56-138.4 0-110.3 89.7-200 200-200s200 89.7 200 200c0 53.7-21.4 102.5-56 138.4zM205.8 234.5c4.4-2.4 6.9-7.4 6.1-12.4-4-25.2-34.2-42.1-59.8-42.1s-55.9 16.9-59.8 42.1c-.8 5 1.7 10 6.1 12.4 4.4 2.4 9.9 1.8 13.7-1.6l9.5-8.5c14.8-13.2 46.2-13.2 61 0l9.5 8.5c2.5 2.3 7.9 4.8 13.7 1.6zM344 180c-25.7 0-55.9 16.9-59.8 42.1-.8 5 1.7 10 6.1 12.4 4.5 2.4 9.9 1.8 13.7-1.6l9.5-8.5c14.8-13.2 46.2-13.2 61 0l9.5 8.5c2.5 2.2 8 4.7 13.7 1.6 4.4-2.4 6.9-7.4 6.1-12.4-3.9-25.2-34.1-42.1-59.8-42.1zm-96 92c-30.9 0-56 28.7-56 64s25.1 64 56 64 56-28.7 56-64-25.1-64-56-64z\"]\n};\nvar faSadTear = {\n prefix: 'far',\n iconName: 'sad-tear',\n icon: [496, 512, [], \"f5b4\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm8-152c-13.2 0-24 10.8-24 24s10.8 24 24 24c23.8 0 46.3 10.5 61.6 28.8 8.1 9.8 23.2 11.9 33.8 3.1 10.2-8.5 11.6-23.6 3.1-33.8C330 320.8 294.1 304 256 304zm-88-64c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm160-64c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm-165.6 98.8C151 290.1 126 325.4 126 342.9c0 22.7 18.8 41.1 42 41.1s42-18.4 42-41.1c0-17.5-25-52.8-36.4-68.1-2.8-3.7-8.4-3.7-11.2 0z\"]\n};\nvar faSave = {\n prefix: 'far',\n iconName: 'save',\n icon: [448, 512, [], \"f0c7\", \"M433.941 129.941l-83.882-83.882A48 48 0 0 0 316.118 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h352c26.51 0 48-21.49 48-48V163.882a48 48 0 0 0-14.059-33.941zM272 80v80H144V80h128zm122 352H54a6 6 0 0 1-6-6V86a6 6 0 0 1 6-6h42v104c0 13.255 10.745 24 24 24h176c13.255 0 24-10.745 24-24V83.882l78.243 78.243a6 6 0 0 1 1.757 4.243V426a6 6 0 0 1-6 6zM224 232c-48.523 0-88 39.477-88 88s39.477 88 88 88 88-39.477 88-88-39.477-88-88-88zm0 128c-22.056 0-40-17.944-40-40s17.944-40 40-40 40 17.944 40 40-17.944 40-40 40z\"]\n};\nvar faShareSquare = {\n prefix: 'far',\n iconName: 'share-square',\n icon: [576, 512, [], \"f14d\", \"M561.938 158.06L417.94 14.092C387.926-15.922 336 5.097 336 48.032v57.198c-42.45 1.88-84.03 6.55-120.76 17.99-35.17 10.95-63.07 27.58-82.91 49.42C108.22 199.2 96 232.6 96 271.94c0 61.697 33.178 112.455 84.87 144.76 37.546 23.508 85.248-12.651 71.02-55.74-15.515-47.119-17.156-70.923 84.11-78.76V336c0 42.993 51.968 63.913 81.94 33.94l143.998-144c18.75-18.74 18.75-49.14 0-67.88zM384 336V232.16C255.309 234.082 166.492 255.35 206.31 376 176.79 357.55 144 324.08 144 271.94c0-109.334 129.14-118.947 240-119.85V48l144 144-144 144zm24.74 84.493a82.658 82.658 0 0 0 20.974-9.303c7.976-4.952 18.286.826 18.286 10.214V464c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48V112c0-26.51 21.49-48 48-48h132c6.627 0 12 5.373 12 12v4.486c0 4.917-2.987 9.369-7.569 11.152-13.702 5.331-26.396 11.537-38.05 18.585a12.138 12.138 0 0 1-6.28 1.777H54a6 6 0 0 0-6 6v340a6 6 0 0 0 6 6h340a6 6 0 0 0 6-6v-25.966c0-5.37 3.579-10.059 8.74-11.541z\"]\n};\nvar faSmile = {\n prefix: 'far',\n iconName: 'smile',\n icon: [496, 512, [], \"f118\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm-80-216c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm160 0c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm4 72.6c-20.8 25-51.5 39.4-84 39.4s-63.2-14.3-84-39.4c-8.5-10.2-23.7-11.5-33.8-3.1-10.2 8.5-11.5 23.6-3.1 33.8 30 36 74.1 56.6 120.9 56.6s90.9-20.6 120.9-56.6c8.5-10.2 7.1-25.3-3.1-33.8-10.1-8.4-25.3-7.1-33.8 3.1z\"]\n};\nvar faSmileBeam = {\n prefix: 'far',\n iconName: 'smile-beam',\n icon: [496, 512, [], \"f5b8\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm84-143.4c-20.8 25-51.5 39.4-84 39.4s-63.2-14.3-84-39.4c-8.5-10.2-23.6-11.5-33.8-3.1-10.2 8.5-11.5 23.6-3.1 33.8 30 36 74.1 56.6 120.9 56.6s90.9-20.6 120.9-56.6c8.5-10.2 7.1-25.3-3.1-33.8-10.2-8.4-25.3-7.1-33.8 3.1zM136.5 211c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c2.1 3.7 6.2 4.7 9.3 3.7 3.6-1.1 6-4.5 5.7-8.3-3.3-42.1-32.2-71.4-56-71.4s-52.7 29.3-56 71.4c-.3 3.7 2.1 7.2 5.7 8.3 3.4 1.1 7.4-.5 9.3-3.7l9.5-17zM328 152c-23.8 0-52.7 29.3-56 71.4-.3 3.7 2.1 7.2 5.7 8.3 3.5 1.1 7.4-.5 9.3-3.7l9.5-17c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c2.1 3.7 6.2 4.7 9.3 3.7 3.6-1.1 6-4.5 5.7-8.3-3.3-42.1-32.2-71.4-56-71.4z\"]\n};\nvar faSmileWink = {\n prefix: 'far',\n iconName: 'smile-wink',\n icon: [496, 512, [], \"f4da\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm117.8-146.4c-10.2-8.5-25.3-7.1-33.8 3.1-20.8 25-51.5 39.4-84 39.4s-63.2-14.3-84-39.4c-8.5-10.2-23.7-11.5-33.8-3.1-10.2 8.5-11.5 23.6-3.1 33.8 30 36 74.1 56.6 120.9 56.6s90.9-20.6 120.9-56.6c8.5-10.2 7.1-25.3-3.1-33.8zM168 240c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm160-60c-25.7 0-55.9 16.9-59.9 42.1-1.7 11.2 11.5 18.2 19.8 10.8l9.5-8.5c14.8-13.2 46.2-13.2 61 0l9.5 8.5c8.5 7.4 21.6.3 19.8-10.8-3.8-25.2-34-42.1-59.7-42.1z\"]\n};\nvar faSnowflake = {\n prefix: 'far',\n iconName: 'snowflake',\n icon: [448, 512, [], \"f2dc\", \"M440.1 355.2l-39.2-23 34.1-9.3c8.4-2.3 13.4-11.1 11.1-19.6l-4.1-15.5c-2.2-8.5-10.9-13.6-19.3-11.3L343 298.2 271.2 256l71.9-42.2 79.7 21.7c8.4 2.3 17-2.8 19.3-11.3l4.1-15.5c2.2-8.5-2.7-17.3-11.1-19.6l-34.1-9.3 39.2-23c7.5-4.4 10.1-14.2 5.8-21.9l-7.9-13.9c-4.3-7.7-14-10.3-21.5-5.9l-39.2 23 9.1-34.7c2.2-8.5-2.7-17.3-11.1-19.6l-15.2-4.1c-8.4-2.3-17 2.8-19.3 11.3l-21.3 81-71.9 42.2v-84.5L306 70.4c6.1-6.2 6.1-16.4 0-22.6l-11.1-11.3c-6.1-6.2-16.1-6.2-22.2 0l-24.9 25.4V16c0-8.8-7-16-15.7-16h-15.7c-8.7 0-15.7 7.2-15.7 16v46.1l-24.9-25.4c-6.1-6.2-16.1-6.2-22.2 0L142.1 48c-6.1 6.2-6.1 16.4 0 22.6l58.3 59.3v84.5l-71.9-42.2-21.3-81c-2.2-8.5-10.9-13.6-19.3-11.3L72.7 84c-8.4 2.3-13.4 11.1-11.1 19.6l9.1 34.7-39.2-23c-7.5-4.4-17.1-1.8-21.5 5.9l-7.9 13.9c-4.3 7.7-1.8 17.4 5.8 21.9l39.2 23-34.1 9.1c-8.4 2.3-13.4 11.1-11.1 19.6L6 224.2c2.2 8.5 10.9 13.6 19.3 11.3l79.7-21.7 71.9 42.2-71.9 42.2-79.7-21.7c-8.4-2.3-17 2.8-19.3 11.3l-4.1 15.5c-2.2 8.5 2.7 17.3 11.1 19.6l34.1 9.3-39.2 23c-7.5 4.4-10.1 14.2-5.8 21.9L10 391c4.3 7.7 14 10.3 21.5 5.9l39.2-23-9.1 34.7c-2.2 8.5 2.7 17.3 11.1 19.6l15.2 4.1c8.4 2.3 17-2.8 19.3-11.3l21.3-81 71.9-42.2v84.5l-58.3 59.3c-6.1 6.2-6.1 16.4 0 22.6l11.1 11.3c6.1 6.2 16.1 6.2 22.2 0l24.9-25.4V496c0 8.8 7 16 15.7 16h15.7c8.7 0 15.7-7.2 15.7-16v-46.1l24.9 25.4c6.1 6.2 16.1 6.2 22.2 0l11.1-11.3c6.1-6.2 6.1-16.4 0-22.6l-58.3-59.3v-84.5l71.9 42.2 21.3 81c2.2 8.5 10.9 13.6 19.3 11.3L375 428c8.4-2.3 13.4-11.1 11.1-19.6l-9.1-34.7 39.2 23c7.5 4.4 17.1 1.8 21.5-5.9l7.9-13.9c4.6-7.5 2.1-17.3-5.5-21.7z\"]\n};\nvar faSquare = {\n prefix: 'far',\n iconName: 'square',\n icon: [448, 512, [], \"f0c8\", \"M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm-6 400H54c-3.3 0-6-2.7-6-6V86c0-3.3 2.7-6 6-6h340c3.3 0 6 2.7 6 6v340c0 3.3-2.7 6-6 6z\"]\n};\nvar faStar = {\n prefix: 'far',\n iconName: 'star',\n icon: [576, 512, [], \"f005\", \"M528.1 171.5L382 150.2 316.7 17.8c-11.7-23.6-45.6-23.9-57.4 0L194 150.2 47.9 171.5c-26.2 3.8-36.7 36.1-17.7 54.6l105.7 103-25 145.5c-4.5 26.3 23.2 46 46.4 33.7L288 439.6l130.7 68.7c23.2 12.2 50.9-7.4 46.4-33.7l-25-145.5 105.7-103c19-18.5 8.5-50.8-17.7-54.6zM388.6 312.3l23.7 138.4L288 385.4l-124.3 65.3 23.7-138.4-100.6-98 139-20.2 62.2-126 62.2 126 139 20.2-100.6 98z\"]\n};\nvar faStarHalf = {\n prefix: 'far',\n iconName: 'star-half',\n icon: [576, 512, [], \"f089\", \"M288 385.3l-124.3 65.4 23.7-138.4-100.6-98 139-20.2 62.2-126V0c-11.4 0-22.8 5.9-28.7 17.8L194 150.2 47.9 171.4c-26.2 3.8-36.7 36.1-17.7 54.6l105.7 103-25 145.5c-4.5 26.1 23 46 46.4 33.7L288 439.6v-54.3z\"]\n};\nvar faStickyNote = {\n prefix: 'far',\n iconName: 'sticky-note',\n icon: [448, 512, [], \"f249\", \"M448 348.106V80c0-26.51-21.49-48-48-48H48C21.49 32 0 53.49 0 80v351.988c0 26.51 21.49 48 48 48h268.118a48 48 0 0 0 33.941-14.059l83.882-83.882A48 48 0 0 0 448 348.106zm-128 80v-76.118h76.118L320 428.106zM400 80v223.988H296c-13.255 0-24 10.745-24 24v104H48V80h352z\"]\n};\nvar faStopCircle = {\n prefix: 'far',\n iconName: 'stop-circle',\n icon: [512, 512, [], \"f28d\", \"M504 256C504 119 393 8 256 8S8 119 8 256s111 248 248 248 248-111 248-248zm-448 0c0-110.5 89.5-200 200-200s200 89.5 200 200-89.5 200-200 200S56 366.5 56 256zm296-80v160c0 8.8-7.2 16-16 16H176c-8.8 0-16-7.2-16-16V176c0-8.8 7.2-16 16-16h160c8.8 0 16 7.2 16 16z\"]\n};\nvar faSun = {\n prefix: 'far',\n iconName: 'sun',\n icon: [512, 512, [], \"f185\", \"M494.2 221.9l-59.8-40.5 13.7-71c2.6-13.2-1.6-26.8-11.1-36.4-9.6-9.5-23.2-13.7-36.2-11.1l-70.9 13.7-40.4-59.9c-15.1-22.3-51.9-22.3-67 0l-40.4 59.9-70.8-13.7C98 60.4 84.5 64.5 75 74.1c-9.5 9.6-13.7 23.1-11.1 36.3l13.7 71-59.8 40.5C6.6 229.5 0 242 0 255.5s6.7 26 17.8 33.5l59.8 40.5-13.7 71c-2.6 13.2 1.6 26.8 11.1 36.3 9.5 9.5 22.9 13.7 36.3 11.1l70.8-13.7 40.4 59.9C230 505.3 242.6 512 256 512s26-6.7 33.5-17.8l40.4-59.9 70.9 13.7c13.4 2.7 26.8-1.6 36.3-11.1 9.5-9.5 13.6-23.1 11.1-36.3l-13.7-71 59.8-40.5c11.1-7.5 17.8-20.1 17.8-33.5-.1-13.6-6.7-26.1-17.9-33.7zm-112.9 85.6l17.6 91.2-91-17.6L256 458l-51.9-77-90.9 17.6 17.6-91.2-76.8-52 76.8-52-17.6-91.2 91 17.6L256 53l51.9 76.9 91-17.6-17.6 91.1 76.8 52-76.8 52.1zM256 152c-57.3 0-104 46.7-104 104s46.7 104 104 104 104-46.7 104-104-46.7-104-104-104zm0 160c-30.9 0-56-25.1-56-56s25.1-56 56-56 56 25.1 56 56-25.1 56-56 56z\"]\n};\nvar faSurprise = {\n prefix: 'far',\n iconName: 'surprise',\n icon: [496, 512, [], \"f5c2\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm0-176c-35.3 0-64 28.7-64 64s28.7 64 64 64 64-28.7 64-64-28.7-64-64-64zm-48-72c0-17.7-14.3-32-32-32s-32 14.3-32 32 14.3 32 32 32 32-14.3 32-32zm128-32c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32z\"]\n};\nvar faThumbsDown = {\n prefix: 'far',\n iconName: 'thumbs-down',\n icon: [512, 512, [], \"f165\", \"M466.27 225.31c4.674-22.647.864-44.538-8.99-62.99 2.958-23.868-4.021-48.565-17.34-66.99C438.986 39.423 404.117 0 327 0c-7 0-15 .01-22.22.01C201.195.01 168.997 40 128 40h-10.845c-5.64-4.975-13.042-8-21.155-8H32C14.327 32 0 46.327 0 64v240c0 17.673 14.327 32 32 32h64c11.842 0 22.175-6.438 27.708-16h7.052c19.146 16.953 46.013 60.653 68.76 83.4 13.667 13.667 10.153 108.6 71.76 108.6 57.58 0 95.27-31.936 95.27-104.73 0-18.41-3.93-33.73-8.85-46.54h36.48c48.602 0 85.82-41.565 85.82-85.58 0-19.15-4.96-34.99-13.73-49.84zM64 296c-13.255 0-24-10.745-24-24s10.745-24 24-24 24 10.745 24 24-10.745 24-24 24zm330.18 16.73H290.19c0 37.82 28.36 55.37 28.36 94.54 0 23.75 0 56.73-47.27 56.73-18.91-18.91-9.46-66.18-37.82-94.54C206.9 342.89 167.28 272 138.92 272H128V85.83c53.611 0 100.001-37.82 171.64-37.82h37.82c35.512 0 60.82 17.12 53.12 65.9 15.2 8.16 26.5 36.44 13.94 57.57 21.581 20.384 18.699 51.065 5.21 65.62 9.45 0 22.36 18.91 22.27 37.81-.09 18.91-16.71 37.82-37.82 37.82z\"]\n};\nvar faThumbsUp = {\n prefix: 'far',\n iconName: 'thumbs-up',\n icon: [512, 512, [], \"f164\", \"M466.27 286.69C475.04 271.84 480 256 480 236.85c0-44.015-37.218-85.58-85.82-85.58H357.7c4.92-12.81 8.85-28.13 8.85-46.54C366.55 31.936 328.86 0 271.28 0c-61.607 0-58.093 94.933-71.76 108.6-22.747 22.747-49.615 66.447-68.76 83.4H32c-17.673 0-32 14.327-32 32v240c0 17.673 14.327 32 32 32h64c14.893 0 27.408-10.174 30.978-23.95 44.509 1.001 75.06 39.94 177.802 39.94 7.22 0 15.22.01 22.22.01 77.117 0 111.986-39.423 112.94-95.33 13.319-18.425 20.299-43.122 17.34-66.99 9.854-18.452 13.664-40.343 8.99-62.99zm-61.75 53.83c12.56 21.13 1.26 49.41-13.94 57.57 7.7 48.78-17.608 65.9-53.12 65.9h-37.82c-71.639 0-118.029-37.82-171.64-37.82V240h10.92c28.36 0 67.98-70.89 94.54-97.46 28.36-28.36 18.91-75.63 37.82-94.54 47.27 0 47.27 32.98 47.27 56.73 0 39.17-28.36 56.72-28.36 94.54h103.99c21.11 0 37.73 18.91 37.82 37.82.09 18.9-12.82 37.81-22.27 37.81 13.489 14.555 16.371 45.236-5.21 65.62zM88 432c0 13.255-10.745 24-24 24s-24-10.745-24-24 10.745-24 24-24 24 10.745 24 24z\"]\n};\nvar faTimesCircle = {\n prefix: 'far',\n iconName: 'times-circle',\n icon: [512, 512, [], \"f057\", \"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm0 448c-110.5 0-200-89.5-200-200S145.5 56 256 56s200 89.5 200 200-89.5 200-200 200zm101.8-262.2L295.6 256l62.2 62.2c4.7 4.7 4.7 12.3 0 17l-22.6 22.6c-4.7 4.7-12.3 4.7-17 0L256 295.6l-62.2 62.2c-4.7 4.7-12.3 4.7-17 0l-22.6-22.6c-4.7-4.7-4.7-12.3 0-17l62.2-62.2-62.2-62.2c-4.7-4.7-4.7-12.3 0-17l22.6-22.6c4.7-4.7 12.3-4.7 17 0l62.2 62.2 62.2-62.2c4.7-4.7 12.3-4.7 17 0l22.6 22.6c4.7 4.7 4.7 12.3 0 17z\"]\n};\nvar faTired = {\n prefix: 'far',\n iconName: 'tired',\n icon: [496, 512, [], \"f5c8\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm129.1-303.8c-3.8-4.4-10.3-5.4-15.3-2.5l-80 48c-3.6 2.2-5.8 6.1-5.8 10.3s2.2 8.1 5.8 10.3l80 48c5.4 3.2 11.8 1.6 15.3-2.5 3.8-4.5 3.9-11 .1-15.5L343.6 208l33.6-40.3c3.8-4.5 3.7-11.1-.1-15.5zM220 208c0-4.2-2.2-8.1-5.8-10.3l-80-48c-5-3-11.5-1.9-15.3 2.5-3.8 4.5-3.9 11-.1 15.5l33.6 40.3-33.6 40.3c-3.8 4.5-3.7 11 .1 15.5 3.5 4.1 9.9 5.7 15.3 2.5l80-48c3.6-2.2 5.8-6.1 5.8-10.3zm28 64c-45.4 0-100.9 38.3-107.8 93.3-1.5 11.8 6.9 21.6 15.5 17.9C178.4 373.5 212 368 248 368s69.6 5.5 92.3 15.2c8.5 3.7 17-6 15.5-17.9-6.9-55-62.4-93.3-107.8-93.3z\"]\n};\nvar faTrashAlt = {\n prefix: 'far',\n iconName: 'trash-alt',\n icon: [448, 512, [], \"f2ed\", \"M268 416h24a12 12 0 0 0 12-12V188a12 12 0 0 0-12-12h-24a12 12 0 0 0-12 12v216a12 12 0 0 0 12 12zM432 80h-82.41l-34-56.7A48 48 0 0 0 274.41 0H173.59a48 48 0 0 0-41.16 23.3L98.41 80H16A16 16 0 0 0 0 96v16a16 16 0 0 0 16 16h16v336a48 48 0 0 0 48 48h288a48 48 0 0 0 48-48V128h16a16 16 0 0 0 16-16V96a16 16 0 0 0-16-16zM171.84 50.91A6 6 0 0 1 177 48h94a6 6 0 0 1 5.15 2.91L293.61 80H154.39zM368 464H80V128h288zm-212-48h24a12 12 0 0 0 12-12V188a12 12 0 0 0-12-12h-24a12 12 0 0 0-12 12v216a12 12 0 0 0 12 12z\"]\n};\nvar faUser = {\n prefix: 'far',\n iconName: 'user',\n icon: [448, 512, [], \"f007\", \"M313.6 304c-28.7 0-42.5 16-89.6 16-47.1 0-60.8-16-89.6-16C60.2 304 0 364.2 0 438.4V464c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48v-25.6c0-74.2-60.2-134.4-134.4-134.4zM400 464H48v-25.6c0-47.6 38.8-86.4 86.4-86.4 14.6 0 38.3 16 89.6 16 51.7 0 74.9-16 89.6-16 47.6 0 86.4 38.8 86.4 86.4V464zM224 288c79.5 0 144-64.5 144-144S303.5 0 224 0 80 64.5 80 144s64.5 144 144 144zm0-240c52.9 0 96 43.1 96 96s-43.1 96-96 96-96-43.1-96-96 43.1-96 96-96z\"]\n};\nvar faUserCircle = {\n prefix: 'far',\n iconName: 'user-circle',\n icon: [496, 512, [], \"f2bd\", \"M248 104c-53 0-96 43-96 96s43 96 96 96 96-43 96-96-43-96-96-96zm0 144c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zm0-240C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-49.7 0-95.1-18.3-130.1-48.4 14.9-23 40.4-38.6 69.6-39.5 20.8 6.4 40.6 9.6 60.5 9.6s39.7-3.1 60.5-9.6c29.2 1 54.7 16.5 69.6 39.5-35 30.1-80.4 48.4-130.1 48.4zm162.7-84.1c-24.4-31.4-62.1-51.9-105.1-51.9-10.2 0-26 9.6-57.6 9.6-31.5 0-47.4-9.6-57.6-9.6-42.9 0-80.6 20.5-105.1 51.9C61.9 339.2 48 299.2 48 256c0-110.3 89.7-200 200-200s200 89.7 200 200c0 43.2-13.9 83.2-37.3 115.9z\"]\n};\nvar faWindowClose = {\n prefix: 'far',\n iconName: 'window-close',\n icon: [512, 512, [], \"f410\", \"M464 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm0 394c0 3.3-2.7 6-6 6H54c-3.3 0-6-2.7-6-6V86c0-3.3 2.7-6 6-6h404c3.3 0 6 2.7 6 6v340zM356.5 194.6L295.1 256l61.4 61.4c4.6 4.6 4.6 12.1 0 16.8l-22.3 22.3c-4.6 4.6-12.1 4.6-16.8 0L256 295.1l-61.4 61.4c-4.6 4.6-12.1 4.6-16.8 0l-22.3-22.3c-4.6-4.6-4.6-12.1 0-16.8l61.4-61.4-61.4-61.4c-4.6-4.6-4.6-12.1 0-16.8l22.3-22.3c4.6-4.6 12.1-4.6 16.8 0l61.4 61.4 61.4-61.4c4.6-4.6 12.1-4.6 16.8 0l22.3 22.3c4.7 4.6 4.7 12.1 0 16.8z\"]\n};\nvar faWindowMaximize = {\n prefix: 'far',\n iconName: 'window-maximize',\n icon: [512, 512, [], \"f2d0\", \"M464 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm0 394c0 3.3-2.7 6-6 6H54c-3.3 0-6-2.7-6-6V192h416v234z\"]\n};\nvar faWindowMinimize = {\n prefix: 'far',\n iconName: 'window-minimize',\n icon: [512, 512, [], \"f2d1\", \"M480 480H32c-17.7 0-32-14.3-32-32s14.3-32 32-32h448c17.7 0 32 14.3 32 32s-14.3 32-32 32z\"]\n};\nvar faWindowRestore = {\n prefix: 'far',\n iconName: 'window-restore',\n icon: [512, 512, [], \"f2d2\", \"M464 0H144c-26.5 0-48 21.5-48 48v48H48c-26.5 0-48 21.5-48 48v320c0 26.5 21.5 48 48 48h320c26.5 0 48-21.5 48-48v-48h48c26.5 0 48-21.5 48-48V48c0-26.5-21.5-48-48-48zm-96 464H48V256h320v208zm96-96h-48V144c0-26.5-21.5-48-48-48H144V48h320v320z\"]\n};\nvar _iconsCache = {\n faAddressBook: faAddressBook,\n faAddressCard: faAddressCard,\n faAngry: faAngry,\n faArrowAltCircleDown: faArrowAltCircleDown,\n faArrowAltCircleLeft: faArrowAltCircleLeft,\n faArrowAltCircleRight: faArrowAltCircleRight,\n faArrowAltCircleUp: faArrowAltCircleUp,\n faBell: faBell,\n faBellSlash: faBellSlash,\n faBookmark: faBookmark,\n faBuilding: faBuilding,\n faCalendar: faCalendar,\n faCalendarAlt: faCalendarAlt,\n faCalendarCheck: faCalendarCheck,\n faCalendarMinus: faCalendarMinus,\n faCalendarPlus: faCalendarPlus,\n faCalendarTimes: faCalendarTimes,\n faCaretSquareDown: faCaretSquareDown,\n faCaretSquareLeft: faCaretSquareLeft,\n faCaretSquareRight: faCaretSquareRight,\n faCaretSquareUp: faCaretSquareUp,\n faChartBar: faChartBar,\n faCheckCircle: faCheckCircle,\n faCheckSquare: faCheckSquare,\n faCircle: faCircle,\n faClipboard: faClipboard,\n faClock: faClock,\n faClone: faClone,\n faClosedCaptioning: faClosedCaptioning,\n faComment: faComment,\n faCommentAlt: faCommentAlt,\n faCommentDots: faCommentDots,\n faComments: faComments,\n faCompass: faCompass,\n faCopy: faCopy,\n faCopyright: faCopyright,\n faCreditCard: faCreditCard,\n faDizzy: faDizzy,\n faDotCircle: faDotCircle,\n faEdit: faEdit,\n faEnvelope: faEnvelope,\n faEnvelopeOpen: faEnvelopeOpen,\n faEye: faEye,\n faEyeSlash: faEyeSlash,\n faFile: faFile,\n faFileAlt: faFileAlt,\n faFileArchive: faFileArchive,\n faFileAudio: faFileAudio,\n faFileCode: faFileCode,\n faFileExcel: faFileExcel,\n faFileImage: faFileImage,\n faFilePdf: faFilePdf,\n faFilePowerpoint: faFilePowerpoint,\n faFileVideo: faFileVideo,\n faFileWord: faFileWord,\n faFlag: faFlag,\n faFlushed: faFlushed,\n faFolder: faFolder,\n faFolderOpen: faFolderOpen,\n faFontAwesomeLogoFull: faFontAwesomeLogoFull,\n faFrown: faFrown,\n faFrownOpen: faFrownOpen,\n faFutbol: faFutbol,\n faGem: faGem,\n faGrimace: faGrimace,\n faGrin: faGrin,\n faGrinAlt: faGrinAlt,\n faGrinBeam: faGrinBeam,\n faGrinBeamSweat: faGrinBeamSweat,\n faGrinHearts: faGrinHearts,\n faGrinSquint: faGrinSquint,\n faGrinSquintTears: faGrinSquintTears,\n faGrinStars: faGrinStars,\n faGrinTears: faGrinTears,\n faGrinTongue: faGrinTongue,\n faGrinTongueSquint: faGrinTongueSquint,\n faGrinTongueWink: faGrinTongueWink,\n faGrinWink: faGrinWink,\n faHandLizard: faHandLizard,\n faHandPaper: faHandPaper,\n faHandPeace: faHandPeace,\n faHandPointDown: faHandPointDown,\n faHandPointLeft: faHandPointLeft,\n faHandPointRight: faHandPointRight,\n faHandPointUp: faHandPointUp,\n faHandPointer: faHandPointer,\n faHandRock: faHandRock,\n faHandScissors: faHandScissors,\n faHandSpock: faHandSpock,\n faHandshake: faHandshake,\n faHdd: faHdd,\n faHeart: faHeart,\n faHospital: faHospital,\n faHourglass: faHourglass,\n faIdBadge: faIdBadge,\n faIdCard: faIdCard,\n faImage: faImage,\n faImages: faImages,\n faKeyboard: faKeyboard,\n faKiss: faKiss,\n faKissBeam: faKissBeam,\n faKissWinkHeart: faKissWinkHeart,\n faLaugh: faLaugh,\n faLaughBeam: faLaughBeam,\n faLaughSquint: faLaughSquint,\n faLaughWink: faLaughWink,\n faLemon: faLemon,\n faLifeRing: faLifeRing,\n faLightbulb: faLightbulb,\n faListAlt: faListAlt,\n faMap: faMap,\n faMeh: faMeh,\n faMehBlank: faMehBlank,\n faMehRollingEyes: faMehRollingEyes,\n faMinusSquare: faMinusSquare,\n faMoneyBillAlt: faMoneyBillAlt,\n faMoon: faMoon,\n faNewspaper: faNewspaper,\n faObjectGroup: faObjectGroup,\n faObjectUngroup: faObjectUngroup,\n faPaperPlane: faPaperPlane,\n faPauseCircle: faPauseCircle,\n faPlayCircle: faPlayCircle,\n faPlusSquare: faPlusSquare,\n faQuestionCircle: faQuestionCircle,\n faRegistered: faRegistered,\n faSadCry: faSadCry,\n faSadTear: faSadTear,\n faSave: faSave,\n faShareSquare: faShareSquare,\n faSmile: faSmile,\n faSmileBeam: faSmileBeam,\n faSmileWink: faSmileWink,\n faSnowflake: faSnowflake,\n faSquare: faSquare,\n faStar: faStar,\n faStarHalf: faStarHalf,\n faStickyNote: faStickyNote,\n faStopCircle: faStopCircle,\n faSun: faSun,\n faSurprise: faSurprise,\n faThumbsDown: faThumbsDown,\n faThumbsUp: faThumbsUp,\n faTimesCircle: faTimesCircle,\n faTired: faTired,\n faTrashAlt: faTrashAlt,\n faUser: faUser,\n faUserCircle: faUserCircle,\n faWindowClose: faWindowClose,\n faWindowMaximize: faWindowMaximize,\n faWindowMinimize: faWindowMinimize,\n faWindowRestore: faWindowRestore\n};\n\nexport { _iconsCache as far, prefix, faAddressBook, faAddressCard, faAngry, faArrowAltCircleDown, faArrowAltCircleLeft, faArrowAltCircleRight, faArrowAltCircleUp, faBell, faBellSlash, faBookmark, faBuilding, faCalendar, faCalendarAlt, faCalendarCheck, faCalendarMinus, faCalendarPlus, faCalendarTimes, faCaretSquareDown, faCaretSquareLeft, faCaretSquareRight, faCaretSquareUp, faChartBar, faCheckCircle, faCheckSquare, faCircle, faClipboard, faClock, faClone, faClosedCaptioning, faComment, faCommentAlt, faCommentDots, faComments, faCompass, faCopy, faCopyright, faCreditCard, faDizzy, faDotCircle, faEdit, faEnvelope, faEnvelopeOpen, faEye, faEyeSlash, faFile, faFileAlt, faFileArchive, faFileAudio, faFileCode, faFileExcel, faFileImage, faFilePdf, faFilePowerpoint, faFileVideo, faFileWord, faFlag, faFlushed, faFolder, faFolderOpen, faFontAwesomeLogoFull, faFrown, faFrownOpen, faFutbol, faGem, faGrimace, faGrin, faGrinAlt, faGrinBeam, faGrinBeamSweat, faGrinHearts, faGrinSquint, faGrinSquintTears, faGrinStars, faGrinTears, faGrinTongue, faGrinTongueSquint, faGrinTongueWink, faGrinWink, faHandLizard, faHandPaper, faHandPeace, faHandPointDown, faHandPointLeft, faHandPointRight, faHandPointUp, faHandPointer, faHandRock, faHandScissors, faHandSpock, faHandshake, faHdd, faHeart, faHospital, faHourglass, faIdBadge, faIdCard, faImage, faImages, faKeyboard, faKiss, faKissBeam, faKissWinkHeart, faLaugh, faLaughBeam, faLaughSquint, faLaughWink, faLemon, faLifeRing, faLightbulb, faListAlt, faMap, faMeh, faMehBlank, faMehRollingEyes, faMinusSquare, faMoneyBillAlt, faMoon, faNewspaper, faObjectGroup, faObjectUngroup, faPaperPlane, faPauseCircle, faPlayCircle, faPlusSquare, faQuestionCircle, faRegistered, faSadCry, faSadTear, faSave, faShareSquare, faSmile, faSmileBeam, faSmileWink, faSnowflake, faSquare, faStar, faStarHalf, faStickyNote, faStopCircle, faSun, faSurprise, faThumbsDown, faThumbsUp, faTimesCircle, faTired, faTrashAlt, faUser, faUserCircle, faWindowClose, faWindowMaximize, faWindowMinimize, faWindowRestore };\n","import React, {Component} from 'react'; // eslint-disable-line no-unused-vars\nimport PropTypes from 'prop-types';\nimport {FontAwesomeIcon} from '@fortawesome/react-fontawesome';\nimport {faCopy, faCheckCircle} from '@fortawesome/free-regular-svg-icons';\n\nimport LoadingElement from '../utils/LoadingElement';\n\nconst clipboardAPI = navigator.clipboard;\n\nfunction wait(ms) {\n return new Promise(r => setTimeout(r, ms));\n}\n\n/**\n * The Clipboard component copies text to the clipboard\n */\n\nexport default class Clipboard extends React.Component {\n static contextType = window.dash_component_api.DashContext;\n\n constructor(props) {\n super(props);\n this.copyToClipboard = this.copyToClipboard.bind(this);\n this.onClickHandler = this.onClickHandler.bind(this);\n this.copySuccess = this.copySuccess.bind(this);\n this.getTargetText = this.getTargetText.bind(this);\n this.loading = this.loading.bind(this);\n this.stringifyId = this.stringifyId.bind(this);\n this.state = {\n copied: false,\n };\n }\n\n onClickHandler() {\n this.props.setProps({n_clicks: this.props.n_clicks + 1});\n }\n\n componentDidUpdate(prevProps) {\n // If the clicks has not changed, do nothing\n if (\n !this.props.n_clicks ||\n this.props.n_clicks === prevProps.n_clicks\n ) {\n return;\n }\n // If the clicks has changed, copy to clipboard\n this.copyToClipboard();\n }\n\n // stringifies object ids used in pattern matching callbacks\n stringifyId(id) {\n if (typeof id !== 'object') {\n return id;\n }\n const stringifyVal = v => (v && v.wild) || JSON.stringify(v);\n const parts = Object.keys(id)\n .sort()\n .map(k => JSON.stringify(k) + ':' + stringifyVal(id[k]));\n return '{' + parts.join(',') + '}';\n }\n\n async copySuccess(content, htmlContent) {\n const showCopiedIcon = 1000;\n if (htmlContent) {\n const blobHtml = new Blob([htmlContent], {type: 'text/html'});\n const blobText = new Blob([content ?? htmlContent], {\n type: 'text/plain',\n });\n const data = [\n new ClipboardItem({\n ['text/plain']: blobText,\n ['text/html']: blobHtml,\n }),\n ];\n await navigator.clipboard.write(data);\n } else {\n await clipboardAPI.writeText(content);\n }\n this.setState({copied: true});\n await wait(showCopiedIcon);\n this.setState({copied: false});\n }\n\n getTargetText() {\n // get the inner text. If none, use the content of the value param\n const id = this.stringifyId(this.props.target_id);\n const target = document.getElementById(id);\n if (!target) {\n throw new Error(\n 'Clipboard copy failed: no element found for target_id ' +\n this.props.target_id\n );\n }\n let content = target.innerText;\n if (!content) {\n content = target.value;\n content = content === undefined ? null : content;\n }\n return content;\n }\n\n async loading() {\n while (this.context.isLoading()) {\n await wait(100);\n }\n }\n\n async copyToClipboard() {\n let content;\n let htmlContent;\n if (this.props.target_id) {\n content = this.getTargetText();\n } else {\n await wait(100); // gives time for callback to start\n await this.loading();\n content = this.props.content;\n htmlContent = this.props.html_content;\n }\n if (content || htmlContent) {\n this.copySuccess(content, htmlContent);\n }\n }\n\n componentDidMount() {\n if (!clipboardAPI) {\n console.warn('Copy to clipboard not available with this browser'); // eslint-disable-line no-console\n }\n }\n\n render() {\n const {id, title, className, style, children, copied_children} =\n this.props;\n\n const isCopied = this.state.copied;\n\n const button_children = isCopied\n ? copied_children ?? \n : children ?? ;\n\n return clipboardAPI ? (\n \n {button_children}\n \n ) : null;\n }\n}\n\nClipboard.defaultProps = {\n content: null,\n html_content: null,\n target_id: null,\n n_clicks: 0,\n};\n\nClipboard.propTypes = {\n /**\n * The ID used to identify this component.\n */\n id: PropTypes.string,\n\n /**\n * Children rendered inside the Clipboard button before copying. By default, a copy icon.\n */\n children: PropTypes.node,\n\n /**\n * Children rendered inside the Clipboard button after the value has been copied. By default, a check icon.\n */\n copied_children: PropTypes.node,\n\n /**\n * The id of target component containing text to copy to the clipboard.\n * The inner text of the `children` prop will be copied to the clipboard. If none, then the text from the\n * `value` prop will be copied.\n */\n target_id: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\n\n /**\n * The text to be copied to the clipboard if the `target_id` is None.\n */\n content: PropTypes.string,\n\n /**\n * The number of times Clipboard button was clicked\n */\n n_clicks: PropTypes.number,\n\n /**\n * The clipboard html text be copied to the clipboard if the `target_id` is None.\n */\n html_content: PropTypes.string,\n\n /**\n * The text shown as a tooltip when hovering over the copy icon.\n */\n title: PropTypes.string,\n\n /**\n * The icon's styles\n */\n style: PropTypes.object,\n\n /**\n * The class name of the icon element\n */\n className: PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the value changes.\n */\n setProps: PropTypes.func,\n};\n","import PropTypes from 'prop-types';\nimport {Component} from 'react';\n\n/**\n * ConfirmDialog is used to display the browser's native \"confirm\" modal,\n * with an optional message and two buttons (\"OK\" and \"Cancel\").\n * This ConfirmDialog can be used in conjunction with buttons when the user\n * is performing an action that should require an extra step of verification.\n */\nexport default class ConfirmDialog extends Component {\n componentDidUpdate(prevProps) {\n this._update(!prevProps.displayed && this.props.displayed);\n }\n\n componentDidMount() {\n this._update(this.props.displayed);\n }\n\n _update(shouldTriggerDisplay) {\n const {message, setProps, cancel_n_clicks, submit_n_clicks} =\n this.props;\n\n if (shouldTriggerDisplay) {\n new Promise(resolve => resolve(window.confirm(message))).then(\n result => {\n if (result) {\n setProps({\n submit_n_clicks: submit_n_clicks + 1,\n submit_n_clicks_timestamp: Date.now(),\n displayed: false,\n });\n } else {\n setProps({\n cancel_n_clicks: cancel_n_clicks + 1,\n cancel_n_clicks_timestamp: Date.now(),\n displayed: false,\n });\n }\n }\n );\n }\n }\n\n render() {\n return null;\n }\n}\n\nConfirmDialog.defaultProps = {\n submit_n_clicks: 0,\n submit_n_clicks_timestamp: -1,\n cancel_n_clicks: 0,\n cancel_n_clicks_timestamp: -1,\n};\n\nConfirmDialog.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n id: PropTypes.string,\n\n /**\n * Message to show in the popup.\n */\n message: PropTypes.string,\n /**\n * Number of times the submit button was clicked\n */\n submit_n_clicks: PropTypes.number,\n /**\n * Last time the submit button was clicked.\n */\n submit_n_clicks_timestamp: PropTypes.number,\n /**\n * Number of times the popup was canceled.\n */\n cancel_n_clicks: PropTypes.number,\n /**\n * Last time the cancel button was clicked.\n */\n cancel_n_clicks_timestamp: PropTypes.number,\n /**\n * Set to true to send the ConfirmDialog.\n */\n displayed: PropTypes.bool,\n\n /**\n * Dash-assigned callback that gets fired when the value changes.\n */\n setProps: PropTypes.func,\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport ConfirmDialog from './ConfirmDialog.react';\nimport LoadingElement from '../utils/LoadingElement';\n\n/**\n * A wrapper component that will display a confirmation dialog\n * when its child component has been clicked on.\n *\n * For example:\n * ```\n * dcc.ConfirmDialogProvider(\n * html.Button('click me', id='btn'),\n * message='Danger - Are you sure you want to continue.'\n * id='confirm')\n * ```\n */\nexport default class ConfirmDialogProvider extends React.Component {\n render() {\n const {displayed, id, setProps, children} = this.props;\n\n // Will lose the previous onClick of the child\n const wrapClick = child =>\n React.cloneElement(child, {\n onClick: () => setProps({displayed: true}),\n });\n\n return (\n \n {Array.isArray(children)\n ? children.map(wrapClick)\n : wrapClick(children)}\n \n \n );\n }\n}\n\nConfirmDialogProvider.defaultProps = {\n submit_n_clicks: 0,\n submit_n_clicks_timestamp: -1,\n cancel_n_clicks: 0,\n cancel_n_clicks_timestamp: -1,\n};\n\nConfirmDialogProvider.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n id: PropTypes.string,\n\n /**\n * Message to show in the popup.\n */\n message: PropTypes.string,\n /**\n * Number of times the submit was clicked\n */\n submit_n_clicks: PropTypes.number,\n /**\n * Last time the submit button was clicked.\n */\n submit_n_clicks_timestamp: PropTypes.number,\n /**\n * Number of times the popup was canceled.\n */\n cancel_n_clicks: PropTypes.number,\n /**\n * Last time the cancel button was clicked.\n */\n cancel_n_clicks_timestamp: PropTypes.number,\n /**\n * Is the modal currently displayed.\n */\n displayed: PropTypes.bool,\n\n /**\n * Dash-assigned callback that gets fired when the value changes.\n */\n setProps: PropTypes.func,\n /**\n * The children to hijack clicks from and display the popup.\n */\n children: PropTypes.any,\n};\n","export default () =>\n import(\n /* webpackChunkName: \"datepicker\" */ '../../fragments/DatePickerRange'\n );\n","import {format, startOfDay, parseISO} from 'date-fns';\nimport {isNil} from 'ramda';\n\nexport default {\n extract: (propValue?: string) => {\n if (isNil(propValue)) {\n return propValue;\n }\n\n const parsed = parseISO(propValue);\n return format(startOfDay(parsed), 'yyyy-MM-dd');\n },\n apply: (storedValue?: string) => storedValue,\n};\n","import React, {lazy, Suspense} from 'react';\nimport datePickerRange from '../utils/LazyLoader/datePickerRange';\nimport transformDate from '../utils/DatePickerPersistence';\nimport {DatePickerRangeProps, PersistedProps, PersistenceTypes} from '../types';\n\nconst RealDatePickerRange = lazy(datePickerRange);\n\n/**\n * DatePickerRange is designed for selecting a timespan across multiple days off\n * of a calendar.\n *\n * The DatePicker integrates well with the Python datetime module with the\n * startDate and endDate being returned in a string format suitable for\n * creating datetime objects.\n *\n */\nexport default function DatePickerRange({\n calendar_orientation = 'horizontal',\n is_RTL = false,\n // eslint-disable-next-line no-magic-numbers\n day_size = 34,\n with_portal = false,\n with_full_screen_portal = false,\n first_day_of_week = 0,\n number_of_months_shown = 2,\n stay_open_on_select = false,\n reopen_calendar_on_clear = false,\n show_outside_days = false,\n clearable = false,\n disabled = false,\n updatemode = 'singledate',\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persisted_props = [PersistedProps.start_date, PersistedProps.end_date],\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persistence_type = PersistenceTypes.local,\n disabled_days = [],\n ...props\n}: DatePickerRangeProps) {\n return (\n \n \n \n );\n}\n\nDatePickerRange.dashPersistence = {\n persisted_props: [PersistedProps.start_date, PersistedProps.end_date],\n persistence_type: PersistenceTypes.local,\n};\n\nDatePickerRange.persistenceTransforms = {\n end_date: transformDate,\n start_date: transformDate,\n};\n","export default () =>\n import(\n /* webpackChunkName: \"datepicker\" */ '../../fragments/DatePickerSingle'\n );\n","import React, {lazy, Suspense} from 'react';\nimport datePickerSingle from '../utils/LazyLoader/datePickerSingle';\nimport transformDate from '../utils/DatePickerPersistence';\nimport {\n DatePickerSingleProps,\n PersistedProps,\n PersistenceTypes,\n} from '../types';\n\nconst RealDatePickerSingle = lazy(datePickerSingle);\n\n/**\n * DatePickerSingle is a tailor made component designed for selecting\n * a single day off of a calendar.\n *\n * The DatePicker integrates well with the Python datetime module with the\n * startDate and endDate being returned in a string format suitable for\n * creating datetime objects.\n */\nexport default function DatePickerSingle({\n placeholder = 'Select Date',\n calendar_orientation = 'horizontal',\n is_RTL = false,\n // eslint-disable-next-line no-magic-numbers\n day_size = 34,\n with_portal = false,\n with_full_screen_portal = false,\n show_outside_days = true,\n first_day_of_week = 0,\n number_of_months_shown = 1,\n stay_open_on_select = false,\n reopen_calendar_on_clear = false,\n clearable = false,\n disabled = false,\n disabled_days = [],\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persisted_props = [PersistedProps.date],\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persistence_type = PersistenceTypes.local,\n ...props\n}: DatePickerSingleProps) {\n return (\n \n \n \n );\n}\n\nDatePickerSingle.dashPersistence = {\n persisted_props: [PersistedProps.date],\n persistence_type: PersistenceTypes.local,\n};\n\nDatePickerSingle.persistenceTransforms = {\n date: transformDate,\n};\n","import PropTypes from 'prop-types';\nimport {Component} from 'react';\nimport {toByteArray} from 'base64-js';\nimport {saveAs} from 'file-saver';\n\nconst getValue = (src, fallback, key) =>\n key in src ? src[key] : fallback[key];\n\n/**\n * The Download component opens a download dialog when the data property changes.\n */\nexport default class Download extends Component {\n componentDidUpdate(prevProps) {\n const {data} = this.props;\n // If the data hasn't changed, do nothing.\n if (!data || data === prevProps.data) {\n return;\n }\n // Extract options from data if provided, fallback to props.\n const type = getValue(data, this.props, 'type');\n const base64 = getValue(data, this.props, 'base64');\n // Invoke the download using a Blob.\n const content = base64 ? toByteArray(data.content) : data.content;\n const blob = new Blob([content], {type: type});\n saveAs(blob, data.filename);\n }\n\n render() {\n return null;\n }\n}\n\nDownload.propTypes = {\n /**\n * The ID of this component, used to identify dash components in callbacks.\n */\n id: PropTypes.string,\n\n /**\n * On change, a download is invoked.\n */\n data: PropTypes.exact({\n /**\n * Suggested filename in the download dialogue.\n */\n filename: PropTypes.string.isRequired,\n /**\n * File content.\n */\n content: PropTypes.string.isRequired,\n /**\n * Set to true, when data is base64 encoded.\n */\n base64: PropTypes.bool,\n /**\n * Blob type, usually a MIME-type.\n */\n type: PropTypes.string,\n }),\n\n /**\n * Default value for base64, used when not set as part of the data property.\n */\n base64: PropTypes.bool,\n\n /**\n * Default value for type, used when not set as part of the data property.\n */\n type: PropTypes.string,\n\n /**\n * Dash-supplied function for updating props.\n */\n setProps: PropTypes.func,\n};\n\nDownload.defaultProps = {\n type: 'text/plain',\n base64: false,\n};\n","import {Component} from 'react';\nimport PropTypes from 'prop-types';\n\n/**\n * The CurrentLocation component gets geolocation of the device from the web browser. See more info here:\n * https://developer.mozilla.org/en-US/docs/Web/API/Geolocation_API\n */\n\nexport default class Geolocation extends Component {\n constructor(props) {\n super(props);\n this.success = this.success.bind(this);\n this.error = this.error.bind(this);\n }\n updatePosition() {\n if (this.props.update_now) {\n this.props.setProps({\n update_now: false,\n });\n }\n if (!navigator.geolocation) {\n this.error({\n code: 999,\n message: 'Your browser does not support Geolocation',\n });\n } else {\n const positionOptions = {\n enableHighAccuracy: this.props.high_accuracy,\n maximumAge: this.props.maximum_age,\n timeout: this.props.timeout,\n };\n\n navigator.geolocation.getCurrentPosition(\n this.success,\n this.error,\n positionOptions\n );\n }\n }\n\n componentDidMount() {\n this.updatePosition();\n }\n\n componentDidUpdate(prevProps) {\n if (\n this.props.update_now ||\n prevProps.maximum_age !== this.props.maximum_age ||\n prevProps.timeout !== this.props.timeout ||\n prevProps.high_accuracy !== this.props.high_accuracy\n ) {\n this.updatePosition();\n }\n }\n\n success(pos) {\n const crd = pos.coords;\n const position_obj = {\n lat: crd.latitude ?? null,\n lon: crd.longitude ?? null,\n accuracy: crd.accuracy ?? null,\n alt: crd.altitude ?? null,\n alt_accuracy: crd.altitudeAccuracy ?? null,\n speed: crd.speed ?? null,\n heading: crd.heading ?? null,\n };\n\n this.props.setProps({\n local_date: new Date(pos.timestamp).toLocaleString(),\n timestamp: pos.timestamp,\n position: position_obj,\n position_error: null,\n });\n }\n\n error(err) {\n if (this.props.show_alert) {\n alert(`ERROR(${err.code}): ${err.message}`);\n }\n this.props.setProps({\n position: null,\n position_error: {\n code: err.code,\n message: err.message,\n },\n });\n }\n\n render() {\n return null;\n }\n}\n\nGeolocation.defaultProps = {\n update_now: false,\n high_accuracy: false,\n position_error: null,\n maximum_age: 0,\n timeout: Infinity,\n show_alert: false,\n};\n\nGeolocation.propTypes = {\n /**\n * The ID used to identify this component in Dash callbacks.\n */\n id: PropTypes.string,\n\n /**\n * The local date and time when the device position was updated.\n * Format: MM/DD/YYYY, hh:mm:ss p where p is AM or PM\n */\n local_date: PropTypes.string,\n\n /**\n * The Unix timestamp from when the position was updated\n */\n timestamp: PropTypes.number,\n\n /**\n * The position of the device. `lat`, `lon`, and `accuracy` will always be returned. The other data will be included\n * when available, otherwise it will be NaN.\n *\n * `lat` is latitude in degrees.\n * `lon` is longitude in degrees.\n * `accuracy` is the accuracy of the lat/lon in meters. *\n *\n * `alt` is altitude above mean sea level in meters.\n * `alt_accuracy` is the accuracy of the altitude in meters.\n * `heading` is the compass heading in degrees.\n * `speed` is the speed in meters per second.\n *\n */\n position: PropTypes.shape({\n lat: PropTypes.number,\n lon: PropTypes.number,\n accuracy: PropTypes.number,\n alt: PropTypes.number,\n alt_accuracy: PropTypes.number,\n heading: PropTypes.number,\n speed: PropTypes.number,\n }),\n\n /**\n * Position error\n */\n position_error: PropTypes.shape({\n code: PropTypes.number,\n message: PropTypes.string,\n }),\n\n /**\n * If true, error messages will be displayed as an alert\n */\n show_alert: PropTypes.bool,\n\n /**\n * Forces a one-time update of the position data. If set to True in a callback, the browser\n * will update the position data and reset update_now back to False. This can, for example, be used to update the\n * position with a button or an interval timer.\n */\n update_now: PropTypes.bool,\n\n /**\n * If true and if the device is able to provide a more accurate position,\n * it will do so. Note that this can result in slower response times or increased power consumption (with a GPS\n * chip on a mobile device for example). If false (the default value), the device can save resources by\n * responding more quickly and/or using less power.\n */\n high_accuracy: PropTypes.bool,\n\n /**\n * The maximum age in milliseconds of a possible cached position that is acceptable to return. If set to 0,\n * it means that the device cannot use a cached position and must attempt to retrieve the real current position.\n * If set to Infinity the device must return a cached position regardless of its age. Default: 0.\n */\n maximum_age: PropTypes.number,\n\n /**\n * The maximum length of time (in milliseconds) the device is allowed to take in order to return a position.\n * The default value is Infinity, meaning that data will not be return until the position is available.\n */\n timeout: PropTypes.number,\n\n /**\n * Dash-assigned callback that should be called to report property changes\n * to Dash, to make them available for callbacks.\n */\n setProps: PropTypes.func,\n};\n","import PropTypes from 'prop-types';\nimport React, {Component} from 'react'; // eslint-disable-line no-unused-vars\n\n/**\n * A component that repeatedly increments a counter `n_intervals`\n * with a fixed time delay between each increment.\n * Interval is good for triggering a component on a recurring basis.\n * The time delay is set with the property \"interval\" in milliseconds.\n */\nexport default class Interval extends Component {\n constructor(props) {\n super(props);\n this.intervalId = null;\n this.reportInterval = this.reportInterval.bind(this);\n this.handleTimer = this.handleTimer.bind(this);\n }\n\n handleTimer(props) {\n // Check if timer should stop or shouldn't even start\n if (\n props.max_intervals === 0 ||\n props.disabled ||\n (props.n_intervals >= props.max_intervals &&\n props.max_intervals !== -1)\n ) {\n // stop existing timer\n if (this.intervalId) {\n this.clearTimer();\n }\n // and don't start a timer\n return;\n }\n\n // keep the existing timer running\n if (this.intervalId) {\n return;\n }\n\n // it hasn't started yet (& it should start)\n this.intervalId = window.setInterval(\n this.reportInterval,\n props.interval\n );\n }\n\n resetTimer(props) {\n this.clearTimer();\n this.handleTimer(props);\n }\n\n clearTimer() {\n window.clearInterval(this.intervalId);\n this.intervalId = null;\n }\n\n reportInterval() {\n const {setProps, n_intervals} = this.props;\n setProps({n_intervals: n_intervals + 1});\n }\n\n componentDidMount() {\n this.handleTimer(this.props);\n }\n\n UNSAFE_componentWillReceiveProps(nextProps) {\n if (nextProps.interval !== this.props.interval) {\n this.resetTimer(nextProps);\n } else {\n this.handleTimer(nextProps);\n }\n }\n\n componentWillUnmount() {\n this.clearTimer();\n }\n\n render() {\n return null;\n }\n}\n\nInterval.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n id: PropTypes.string,\n /**\n * This component will increment the counter `n_intervals` every\n * `interval` milliseconds\n */\n interval: PropTypes.number,\n\n /**\n * If True, the counter will no longer update\n */\n disabled: PropTypes.bool,\n\n /**\n * Number of times the interval has passed\n */\n n_intervals: PropTypes.number,\n\n /**\n * Number of times the interval will be fired.\n * If -1, then the interval has no limit (the default)\n * and if 0 then the interval stops running.\n */\n max_intervals: PropTypes.number,\n\n /**\n * Dash assigned callback\n */\n setProps: PropTypes.func,\n};\n\nInterval.defaultProps = {\n interval: 1000,\n n_intervals: 0,\n max_intervals: -1,\n};\n","import _has from \"./_has.js\";\nexport default function _toPairs(obj) {\n var pairs = [];\n for (var prop in obj) {\n if (_has(prop, obj)) {\n pairs[pairs.length] = [prop, obj[prop]];\n }\n }\n return pairs;\n}","import _curry1 from \"./internal/_curry1.js\";\nimport _toPairs from \"./internal/_toPairs.js\";\n\n/**\n * Converts an object into an array of key, value arrays. Only the object's\n * own properties are used.\n * Note that the order of the output array is not guaranteed to be consistent\n * across different JS platforms.\n *\n * @func\n * @memberOf R\n * @since v0.4.0\n * @category Object\n * @sig {String: *} -> [[String,*]]\n * @param {Object} obj The object to extract from\n * @return {Array} An array of key, value arrays from the object's own properties.\n * @see R.fromPairs, R.keys, R.values\n * @example\n *\n * R.toPairs({a: 1, b: 2, c: 3}); //=> [['a', 1], ['b', 2], ['c', 3]]\n */\nvar toPairs = /*#__PURE__*/_curry1(_toPairs);\nexport default toPairs;","import _reduced from \"./_reduced.js\";\nimport _xfBase from \"./_xfBase.js\";\nvar XAny = /*#__PURE__*/function () {\n function XAny(f, xf) {\n this.xf = xf;\n this.f = f;\n this.any = false;\n }\n XAny.prototype['@@transducer/init'] = _xfBase.init;\n XAny.prototype['@@transducer/result'] = function (result) {\n if (!this.any) {\n result = this.xf['@@transducer/step'](result, false);\n }\n return this.xf['@@transducer/result'](result);\n };\n XAny.prototype['@@transducer/step'] = function (result, input) {\n if (this.f(input)) {\n this.any = true;\n result = _reduced(this.xf['@@transducer/step'](result, true));\n }\n return result;\n };\n return XAny;\n}();\nexport default function _xany(f) {\n return function (xf) {\n return new XAny(f, xf);\n };\n}","export default function _reduced(x) {\n return x && x['@@transducer/reduced'] ? x : {\n '@@transducer/value': x,\n '@@transducer/reduced': true\n };\n}","import _curry2 from \"./internal/_curry2.js\";\nimport _dispatchable from \"./internal/_dispatchable.js\";\nimport _xany from \"./internal/_xany.js\";\n\n/**\n * Returns `true` if at least one of the elements of the list match the predicate,\n * `false` otherwise.\n *\n * Dispatches to the `any` method of the second argument, if present.\n *\n * Acts as a transducer if a transformer is given in list position.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig (a -> Boolean) -> [a] -> Boolean\n * @param {Function} fn The predicate function.\n * @param {Array} list The array to consider.\n * @return {Boolean} `true` if the predicate is satisfied by at least one element, `false`\n * otherwise.\n * @see R.all, R.none, R.transduce\n * @example\n *\n * const lessThan0 = R.flip(R.lt)(0);\n * const lessThan2 = R.flip(R.lt)(2);\n * R.any(lessThan0)([1, 2]); //=> false\n * R.any(lessThan2)([1, 2]); //=> true\n */\nvar any = /*#__PURE__*/_curry2( /*#__PURE__*/_dispatchable(['any'], _xany, function any(fn, list) {\n var idx = 0;\n while (idx < list.length) {\n if (fn(list[idx])) {\n return true;\n }\n idx += 1;\n }\n return false;\n}));\nexport default any;","import React from 'react';\nimport {DebugTitleProps} from '../types';\n\nexport default function DebugTitle({id, property}: DebugTitleProps) {\n return (\n

\n Loading #{id}\n 's {property}\n

\n );\n}\n","import React, {useState, useRef, useMemo, useEffect} from 'react';\nimport {equals, concat, includes, toPairs, any} from 'ramda';\n\nimport GraphSpinner from '../fragments/Loading/spinners/GraphSpinner';\nimport DefaultSpinner from '../fragments/Loading/spinners/DefaultSpinner';\nimport CubeSpinner from '../fragments/Loading/spinners/CubeSpinner';\nimport CircleSpinner from '../fragments/Loading/spinners/CircleSpinner';\nimport DotSpinner from '../fragments/Loading/spinners/DotSpinner';\nimport {LoadingProps} from 'src/types';\nimport {DebugTitleProps} from '../fragments/Loading/types';\nimport {DashLayoutPath} from '@dash-renderer/types/component';\n\nconst spinnerComponentOptions = {\n graph: GraphSpinner,\n cube: CubeSpinner,\n circle: CircleSpinner,\n dot: DotSpinner,\n default: DefaultSpinner,\n} as const;\n\nconst getSpinner = (spinnerType: keyof typeof spinnerComponentOptions) =>\n spinnerComponentOptions[spinnerType];\n\nconst coveringSpinner: React.CSSProperties = {\n visibility: 'visible',\n position: 'absolute',\n top: '0',\n height: '100%',\n width: '100%',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n};\n\ntype LoadingState = {\n loading: Record;\n};\n\nconst loadingSelector =\n (\n componentPath: DashLayoutPath,\n targetComponents?: Record\n ) =>\n (state: LoadingState): DebugTitleProps[] | null => {\n let stringPath = JSON.stringify(componentPath);\n // Remove the last ] for easy match and add `,` to make sure only children\n // trigger the loading. See issue: https://github.com/plotly/dash/issues/3276\n stringPath = stringPath.substring(0, stringPath.length - 1) + ',';\n const loadingChildren = toPairs(state.loading).reduce(\n (acc, [path, load]) => {\n if (path.startsWith(stringPath) && load.length) {\n if (\n targetComponents &&\n !any((l: DebugTitleProps) => {\n const target = targetComponents[l.id];\n if (!target) {\n return false;\n }\n if (target === '*') {\n return true;\n }\n if (Array.isArray(target)) {\n return includes(l.property, target);\n }\n return l.property === target;\n }, load)\n ) {\n return acc;\n }\n return concat(acc, load);\n }\n return acc;\n },\n [] as DebugTitleProps[]\n );\n if (loadingChildren.length) {\n return loadingChildren;\n }\n return null;\n };\n\nfunction Loading({\n children,\n display = 'auto',\n color = 'var(--Dash-Fill-Interactive-Strong)',\n id,\n className,\n style,\n parent_className,\n parent_style,\n overlay_style,\n fullscreen,\n debug,\n show_initially = true,\n type: spinnerType = 'default',\n delay_hide = 0,\n delay_show = 0,\n target_components,\n custom_spinner,\n}: LoadingProps) {\n const ctx = window.dash_component_api.useDashContext();\n\n const loading = ctx.useSelector(\n loadingSelector(ctx.componentPath, target_components),\n equals\n );\n\n const [showSpinner, setShowSpinner] = useState(show_initially);\n const dismissTimer = useRef();\n const showTimer = useRef();\n\n const containerStyle: React.CSSProperties = useMemo(() => {\n if (showSpinner) {\n return {visibility: 'hidden', ...overlay_style, ...parent_style};\n }\n return parent_style ?? {};\n }, [showSpinner, parent_style]);\n\n useEffect(() => {\n if (display === 'show' || display === 'hide') {\n setShowSpinner(display === 'show');\n return;\n }\n\n if (loading) {\n // if component is currently loading and there's a dismiss timer active\n // we need to clear it.\n if (dismissTimer.current) {\n dismissTimer.current = window.clearTimeout(\n dismissTimer.current\n );\n }\n // if component is currently loading but the spinner is not showing and\n // there is no timer set to show, then set a timeout to show\n if (!showSpinner && !showTimer.current) {\n showTimer.current = window.setTimeout(() => {\n setShowSpinner(true);\n showTimer.current = undefined;\n }, delay_show);\n }\n } else {\n // if component is not currently loading and there's a show timer\n // active we need to clear it\n if (showTimer.current) {\n showTimer.current = window.clearTimeout(showTimer.current);\n }\n // if component is not currently loading and the spinner is showing and\n // there's no timer set to dismiss it, then set a timeout to hide it\n if (showSpinner && !dismissTimer.current) {\n dismissTimer.current = window.setTimeout(() => {\n setShowSpinner(false);\n dismissTimer.current = undefined;\n }, delay_hide);\n }\n }\n }, [delay_hide, delay_show, loading, display, showSpinner]);\n\n const Spinner = getSpinner(spinnerType);\n\n return (\n \n
\n {children}\n
\n
\n {showSpinner &&\n (custom_spinner || (\n \n ))}\n
\n
\n );\n}\n\nexport default Loading;\n","import React from 'react';\nimport DebugTitle from './DebugTitle';\nimport {SpinnerProps} from '../types';\n\nconst GraphSpinner = ({\n status,\n fullscreen,\n debug,\n className,\n style,\n}: SpinnerProps) => {\n let debugTitle;\n if (debug && status) {\n debugTitle = status.map((s, i) => );\n }\n let spinnerClass = fullscreen ? 'dash-spinner-container' : '';\n if (className) {\n spinnerClass += ` ${className}`;\n }\n return (\n
\n
\n {debugTitle}\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n );\n};\n\nexport default GraphSpinner;\n","import React from 'react';\nimport DebugTitle from './DebugTitle';\nimport {SpinnerProps} from '../types';\n\nconst CubeSpinner = ({\n status,\n color,\n fullscreen,\n debug,\n className,\n style,\n}: SpinnerProps) => {\n let debugTitle;\n if (debug && status) {\n debugTitle = status.map((s, i) => );\n }\n let spinnerClass = fullscreen ? 'dash-spinner-container' : '';\n if (className) {\n spinnerClass += ` ${className}`;\n }\n /* eslint-disable no-magic-numbers */\n return (\n
\n {debugTitle}\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n );\n};\n\nexport default CubeSpinner;\n","import React from 'react';\nimport DebugTitle from './DebugTitle';\nimport {SpinnerProps} from '../types';\n\n/**\n * Spinner created by Tobias Ahlin, https://github.com/tobiasahlin/SpinKit\n */\nconst CircleSpinner = ({\n status,\n color,\n fullscreen,\n debug,\n className,\n style,\n}: SpinnerProps) => {\n let debugTitle;\n if (debug && status) {\n debugTitle = status.map((s, i) => );\n }\n let spinnerClass = fullscreen ? 'dash-spinner-container' : '';\n if (className) {\n spinnerClass += ` ${className}`;\n }\n return (\n
\n {debugTitle}\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n );\n};\n\nexport default CircleSpinner;\n","import React from 'react';\nimport DebugTitle from './DebugTitle';\nimport {SpinnerProps} from '../types';\n\n/**\n * Spinner created by Tobias Ahlin, https://github.com/tobiasahlin/SpinKit\n */\nconst DotSpinner = ({\n status,\n color,\n fullscreen,\n debug,\n className,\n style,\n}: SpinnerProps) => {\n let debugTitle;\n if (debug && status) {\n debugTitle = status.map((s, i) => );\n }\n let spinnerClass = fullscreen ? 'dash-spinner-container' : '';\n if (className) {\n spinnerClass += ` ${className}`;\n }\n return (\n
\n {debugTitle}\n
\n
\n
\n
\n
\n \n
\n );\n};\n\nexport default DotSpinner;\n","import React from 'react';\nimport DebugTitle from './DebugTitle';\nimport {SpinnerProps} from '../types';\n\n/**\n * Spinner created by Tobias Ahlin, https://github.com/tobiasahlin/SpinKit\n */\nconst DefaultSpinner = ({\n status,\n color,\n fullscreen,\n debug,\n className,\n style,\n}: SpinnerProps) => {\n let debugTitle;\n if (debug && status) {\n debugTitle = status.map((s, i) => );\n }\n let spinnerClass = fullscreen ? 'dash-spinner-container' : '';\n if (className) {\n spinnerClass += ` ${className}`;\n }\n return (\n
\n {debugTitle}\n
\n
\n
\n
\n
\n
\n
\n \n
\n );\n};\n\nexport default DefaultSpinner;\n","import {Component} from 'react';\nimport PropTypes from 'prop-types';\nimport {type} from 'ramda';\n\nimport {History} from '@plotly/dash-component-plugins';\n\n/**\n * Update and track the current window.location object through the window.history state.\n * Use in conjunction with the `dash_core_components.Link` component to make apps with multiple pages.\n */\nexport default class Location extends Component {\n constructor(props) {\n super(props);\n this.updateLocation = this.updateLocation.bind(this);\n this.onLocationChange = this.onLocationChange.bind(this);\n }\n\n updateLocation(props) {\n const {hash, href, pathname, refresh, search, setProps} = props;\n\n // Keep track of props relating to window.location that may need to be updated via setProps\n const propsToSet = {};\n\n /**\n * Check if the field exists in props. If the prop with \"fieldName\" is not defined,\n * then it was not set by the user and needs to be equal to the value in window.location.\n * This only happens on page load (since props will no longer be undefined after componentDidMount).\n *\n * @param {string} fieldName\n * The name of the prop in window.location and in the component's prop\n *\n * @returns {boolean}\n * Returns true if the prop with fieldName is different and the window state needs to be updated\n */\n const checkExistsUpdateWindowLocation = fieldName => {\n const propVal = props[fieldName];\n\n if (\n (type(propVal) === 'Undefined' || propVal === null) &&\n type(window.location[fieldName]) !== 'Undefined'\n ) {\n // propVal is undefined or null, but window.location has this fieldName defined\n propsToSet[fieldName] = window.location[fieldName];\n } else if (propVal !== window.location[fieldName]) {\n // Prop has changed?\n if (refresh === true) {\n // Refresh the page?\n if (\n fieldName === 'href' &&\n window.dash_clientside.clean_url(propVal) !== propVal\n ) {\n setProps({\n _dash_error: new Error(\n `Dangerous link detected: ${propVal}`\n ),\n });\n return false;\n }\n window.location[fieldName] = propVal;\n } else if (this.props[fieldName] !== propVal) {\n // If this prop has changed, need to setProps\n propsToSet[fieldName] = propVal;\n // This (`${fieldName}`: propVal) needs to be pushed in the window.history\n return true;\n }\n }\n // This (`${fieldName}`: propVal) DOES NOT need to be pushed in the window.history\n return false;\n };\n\n // Check if the prop value needs to be updated (note that this mutates propsToSet)\n const pathnameUpdated = checkExistsUpdateWindowLocation('pathname');\n const hrefUpdated = checkExistsUpdateWindowLocation('href');\n const hashUpdated = checkExistsUpdateWindowLocation('hash');\n const searchUpdated = checkExistsUpdateWindowLocation('search');\n\n // propsToSet has been updated -- batch update to Dash\n if (Object.keys(propsToSet).length > 0) {\n setProps(propsToSet);\n }\n\n // Special case -- overrides everything!\n if (hrefUpdated) {\n window.history.pushState({}, '', href);\n if (refresh === 'callback-nav') {\n window.dispatchEvent(new CustomEvent('_dashprivate_pushstate'));\n }\n } else if (pathnameUpdated || hashUpdated || searchUpdated) {\n // Otherwise, we can mash everything together\n const searchVal = type(search) !== 'Undefined' ? search : '';\n const hashVal = type(hash) !== 'Undefined' ? hash : '';\n window.history.pushState(\n {},\n '',\n `${pathname}${searchVal}${hashVal}`\n );\n if (refresh === 'callback-nav') {\n window.dispatchEvent(new CustomEvent('_dashprivate_pushstate'));\n }\n }\n }\n\n onLocationChange() {\n const {setProps} = this.props;\n const propsToChange = {};\n\n if (this.props.pathname !== window.location.pathname) {\n propsToChange.pathname = window.location.pathname;\n }\n if (this.props.href !== window.location.href) {\n propsToChange.href = window.location.href;\n }\n if (this.props.hash !== window.location.hash) {\n propsToChange.hash = window.location.hash;\n }\n if (this.props.search !== window.location.search) {\n propsToChange.search = window.location.search;\n }\n\n setProps(propsToChange);\n\n History.dispatchChangeEvent();\n }\n\n componentDidMount() {\n window.addEventListener('popstate', this.onLocationChange);\n\n window.addEventListener(\n '_dashprivate_pushstate',\n this.onLocationChange\n );\n this.updateLocation(this.props);\n }\n\n componentWillUnmount() {\n window.removeEventListener('popstate', this.onLocationChange);\n window.removeEventListener(\n '_dashprivate_pushstate',\n this.onLocationChange\n );\n }\n\n UNSAFE_componentWillReceiveProps(nextProps) {\n this.updateLocation(nextProps);\n }\n\n render() {\n return null;\n }\n}\n\nLocation.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n id: PropTypes.string.isRequired,\n\n /** pathname in window.location - e.g., \"/my/full/pathname\" */\n pathname: PropTypes.string,\n /** search in window.location - e.g., \"?myargument=1\" */\n search: PropTypes.string,\n /** hash in window.location - e.g., \"#myhash\" */\n hash: PropTypes.string,\n /** href in window.location - e.g., \"/my/full/pathname?myargument=1#myhash\" */\n href: PropTypes.string,\n\n /**\n * Use `True` to navigate outside the Dash app or to manually refresh a page.\n * Use `False` if the same callback that updates the Location component is also\n * updating the page content - typically used in multi-page apps that do not use Pages.\n * Use 'callback-nav' if you are updating the URL in a callback, or a different\n * callback will respond to the new Location with updated content. This is\n * typical with multi-page apps that use Pages. This will allow for\n * navigating to a new page without refreshing the page.\n */\n refresh: PropTypes.oneOfType([\n PropTypes.oneOf(['callback-nav']),\n PropTypes.bool,\n ]),\n\n /**\n * Dash-assigned callback that gets fired when the value changes.\n */\n setProps: PropTypes.func,\n};\n\nLocation.defaultProps = {\n refresh: true,\n};\n","export default () =>\n import(/* webpackChunkName: \"markdown\" */ '../../fragments/Markdown');\n","import React, {lazy, Suspense, useEffect} from 'react';\nimport {MarkdownProps} from '../types';\nimport markdown from '../utils/LazyLoader/markdown';\nimport lazyLoadMathJax from '../utils/LazyLoader/third-party/mathjax';\n\nconst RealMarkdown = lazy(markdown);\n\n/**\n * A component that renders Markdown text as specified by the\n * GitHub Markdown spec. These component uses\n * [react-markdown](https://github.com/remarkjs/react-markdown) under the hood.\n */\nexport default function Markdown({\n mathjax = false,\n dangerously_allow_html = false,\n dedent = true,\n ...props\n}: MarkdownProps) {\n useEffect(() => {\n if (mathjax) {\n lazyLoadMathJax();\n }\n }, [mathjax]);\n\n return (\n \n \n \n );\n}\n","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n \n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./radioitems.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = function insertAtTop(element) {\n var parent = document.querySelector('head');\n // eslint-disable-next-line no-underscore-dangle\n var lastInsertedElement =\n window._lastElementInsertedByStyleLoader;\n\n if (!lastInsertedElement) {\n parent.insertBefore(element, parent.firstChild);\n } else if (lastInsertedElement.nextSibling) {\n parent.insertBefore(element, lastInsertedElement.nextSibling);\n } else {\n parent.appendChild(element);\n }\n\n // eslint-disable-next-line no-underscore-dangle\n window._lastElementInsertedByStyleLoader = element;\n };\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!./radioitems.css\";\n export default content && content.locals ? content.locals : undefined;\n","import React, {useMemo} from 'react';\nimport {RadioItemsProps, PersistedProps, PersistenceTypes} from '../types';\nimport './css/radioitems.css';\n\nimport {sanitizeOptions} from '../utils/optionTypes';\nimport LoadingElement from '../utils/_LoadingElement';\nimport {OptionsList} from '../utils/optionRendering';\nimport {isNil} from 'ramda';\n\n/**\n * RadioItems is a component that encapsulates several radio item inputs.\n * The values and labels of the RadioItems is specified in the `options`\n * property and the seleced item is specified with the `value` property.\n * Each radio item is rendered as an input with a surrounding label.\n */\nexport default function RadioItems({\n className,\n id,\n style,\n setProps,\n value,\n inputStyle = {},\n inputClassName = '',\n labelStyle = {},\n labelClassName = '',\n options = [],\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persisted_props = [PersistedProps.value],\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persistence_type = PersistenceTypes.local,\n inline = false,\n}: RadioItemsProps) {\n const sanitizedOptions = useMemo(() => {\n return sanitizeOptions(options).options;\n }, [options]);\n\n const stylingProps = {\n id,\n className: 'dash-radioitems ' + (className ?? ''),\n style,\n optionClassName: inline ? 'dash-radioitems-inline' : undefined,\n inputStyle,\n inputClassName,\n labelStyle,\n labelClassName,\n };\n\n return (\n \n {loadingProps => (\n {\n if (selection.length) {\n setProps({value: selection[selection.length - 1]});\n }\n }}\n {...stylingProps}\n />\n )}\n \n );\n}\n\nRadioItems.dashPersistence = {\n persisted_props: [PersistedProps.value],\n persistence_type: PersistenceTypes.local,\n};\n","export default () =>\n import(/* webpackChunkName: \"slider\" */ '../../fragments/RangeSlider');\n","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n \n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./sliders.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = function insertAtTop(element) {\n var parent = document.querySelector('head');\n // eslint-disable-next-line no-underscore-dangle\n var lastInsertedElement =\n window._lastElementInsertedByStyleLoader;\n\n if (!lastInsertedElement) {\n parent.insertBefore(element, parent.firstChild);\n } else if (lastInsertedElement.nextSibling) {\n parent.insertBefore(element, lastInsertedElement.nextSibling);\n } else {\n parent.appendChild(element);\n }\n\n // eslint-disable-next-line no-underscore-dangle\n window._lastElementInsertedByStyleLoader = element;\n };\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!./sliders.css\";\n export default content && content.locals ? content.locals : undefined;\n","import React, {lazy, Suspense} from 'react';\nimport {PersistedProps, PersistenceTypes, RangeSliderProps} from '../types';\nimport rangeSlider from '../utils/LazyLoader/rangeSlider';\n\nimport './css/sliders.css';\n\nconst RealRangeSlider = lazy(rangeSlider);\n\n/**\n * A double slider with two handles.\n * Used for specifying a range of numerical values.\n */\nexport default function RangeSlider({\n updatemode = 'mouseup',\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persisted_props = [PersistedProps.value],\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persistence_type = PersistenceTypes.local,\n // eslint-disable-next-line no-magic-numbers\n verticalHeight = 400,\n step = undefined,\n allow_direct_input = true,\n ...props\n}: RangeSliderProps) {\n // Some considerations for the default value of `step`:\n // If the range consists of integers, default to a value of `1`\n // Otherwise, leave it undefined\n if (\n typeof step === 'undefined' &&\n Number.isInteger(props.min) &&\n Number.isInteger(props.max)\n ) {\n step = 1;\n }\n\n return (\n \n \n \n );\n}\n\nRangeSlider.dashPersistence = {\n persisted_props: [PersistedProps.value],\n persistence_type: PersistenceTypes.local,\n};\n","import {omit} from 'ramda';\nimport React, {lazy, Suspense, useCallback, useMemo} from 'react';\nimport {\n PersistedProps,\n PersistenceTypes,\n RangeSliderProps,\n SliderProps,\n} from '../types';\nimport rangeSlider from '../utils/LazyLoader/rangeSlider';\nimport './css/sliders.css';\n\nconst RealSlider = lazy(rangeSlider);\n\n/**\n * A slider component with a single handle.\n */\nexport default function Slider({\n updatemode = 'mouseup',\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persisted_props = [PersistedProps.value],\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persistence_type = PersistenceTypes.local,\n // eslint-disable-next-line no-magic-numbers\n verticalHeight = 400,\n step = undefined,\n allow_direct_input = true,\n setProps,\n value,\n drag_value,\n ...props\n}: SliderProps) {\n // This is actually a wrapper around a RangeSlider.\n // We'll modify key `Slider` props to be compatible with a Range Slider.\n\n // Some considerations for the default value of `step`:\n // If the range consists of integers, default to a value of `1`\n // Otherwise, leave it undefined\n if (\n typeof step === 'undefined' &&\n Number.isInteger(props.min) &&\n Number.isInteger(props.max)\n ) {\n step = 1;\n }\n\n const mappedValue: RangeSliderProps['value'] = useMemo(() => {\n return typeof value === 'number' ? [value] : value;\n }, [value]);\n\n const mappedDragValue: RangeSliderProps['drag_value'] = useMemo(() => {\n return typeof drag_value === 'number' ? [drag_value] : drag_value;\n }, [drag_value]);\n\n const mappedSetProps: RangeSliderProps['setProps'] = useCallback(\n newProps => {\n const {value, drag_value} = newProps;\n const mappedProps: Partial = omit(\n ['value', 'drag_value', 'setProps'],\n newProps\n );\n if ('value' in newProps) {\n mappedProps.value = value ? value[0] : value;\n }\n if ('drag_value' in newProps) {\n mappedProps.drag_value = drag_value\n ? drag_value[0]\n : drag_value;\n }\n\n setProps(mappedProps);\n },\n [setProps]\n );\n\n return (\n \n \n \n );\n}\n\nSlider.dashPersistence = {\n persisted_props: [PersistedProps.value],\n persistence_type: PersistenceTypes.local,\n};\n","import {equals, isNil} from 'ramda';\nimport React from 'react';\nimport PropTypes from 'prop-types';\n\n/**\n * Abstraction for the memory storage_type to work the same way as local/session\n *\n * Each memory Store component get it's own MemStore.\n */\nclass MemStore {\n constructor() {\n this._data = {};\n this._modified = -1;\n }\n\n getItem(key) {\n return this._data[key];\n }\n\n setItem(key, value) {\n this._data[key] = value;\n this.setModified(key);\n }\n\n removeItem(key) {\n delete this._data[key];\n this.setModified(key);\n }\n\n // noinspection JSUnusedLocalSymbols\n setModified(_) {\n this._modified = Date.now();\n }\n\n // noinspection JSUnusedLocalSymbols\n getModified(_) {\n return this._modified;\n }\n}\n\n/**\n * Abstraction for local/session storage_type.\n *\n * Single instances for localStorage, sessionStorage\n */\nclass WebStore {\n constructor(storage) {\n this._storage = storage;\n }\n\n getItem(key) {\n try {\n return JSON.parse(this._storage.getItem(key));\n } catch (e) {\n // in case we somehow got a non-JSON value in storage,\n // just ignore it.\n return null;\n }\n }\n\n setItem(key, value) {\n this._storage.setItem(key, JSON.stringify(value));\n this.setModified(key);\n }\n\n removeItem(key) {\n this._storage.removeItem(key);\n this._storage.removeItem(`${key}-timestamp`);\n }\n\n setModified(key) {\n this._storage.setItem(`${key}-timestamp`, Date.now());\n }\n\n getModified(key) {\n return (\n Number.parseInt(this._storage.getItem(`${key}-timestamp`), 10) || -1\n );\n }\n}\n\n/**\n * Easily keep data on the client side with this component.\n * The data is not inserted in the DOM.\n * Data can be in memory, localStorage or sessionStorage.\n * The data will be kept with the id as key.\n */\nexport default class Store extends React.Component {\n constructor(props) {\n super(props);\n\n if (props.storage_type === 'local') {\n this._backstore = new WebStore(window.localStorage);\n } else if (props.storage_type === 'session') {\n this._backstore = new WebStore(window.sessionStorage);\n } else if (props.storage_type === 'memory') {\n this._backstore = new MemStore();\n }\n\n this.onStorageChange = this.onStorageChange.bind(this);\n }\n\n onStorageChange(e) {\n const {id, setProps} = this.props;\n if (e.key === id && setProps && e.newValue !== e.oldValue) {\n setProps({\n data: JSON.parse(e.newValue),\n modified_timestamp: this._backstore.getModified(id),\n });\n }\n }\n\n UNSAFE_componentWillMount() {\n const {setProps, id, data, storage_type} = this.props;\n if (storage_type !== 'memory') {\n window.addEventListener('storage', this.onStorageChange);\n }\n\n const old = this._backstore.getItem(id);\n if (isNil(old) && !isNil(data)) {\n // Initial data mount\n this._backstore.setItem(id, data);\n setProps({\n modified_timestamp: this._backstore.getModified(id),\n });\n return;\n }\n\n if (!equals(old, data)) {\n setProps({\n data: old,\n modified_timestamp: this._backstore.getModified(id),\n });\n }\n }\n\n componentWillUnmount() {\n if (this.props.storage_type !== 'memory') {\n window.removeEventListener('storage', this.onStorageChange);\n }\n }\n\n componentDidUpdate() {\n const {data, id, clear_data, setProps} = this.props;\n if (clear_data) {\n this._backstore.removeItem(id);\n setProps({\n clear_data: false,\n data: null,\n modified_timestamp: this._backstore.getModified(id),\n });\n return;\n }\n const old = this._backstore.getItem(id);\n // Only set the data if it's not the same data.\n // If the new data is undefined, we got here by overwriting the entire\n // component with a new copy that has no `data` specified - so pull back\n // out the old value.\n // Note: this still allows you to set data to null\n if (!equals(data, old)) {\n if (data === undefined) {\n setProps({data: old});\n } else {\n this._backstore.setItem(id, data);\n setProps({\n modified_timestamp: this._backstore.getModified(id),\n });\n }\n }\n }\n\n render() {\n return null;\n }\n}\n\nStore.defaultProps = {\n storage_type: 'memory',\n clear_data: false,\n modified_timestamp: -1,\n};\n\nStore.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n id: PropTypes.string.isRequired,\n\n /**\n * The type of the web storage.\n *\n * memory: only kept in memory, reset on page refresh.\n * local: window.localStorage, data is kept after the browser quit.\n * session: window.sessionStorage, data is cleared once the browser quit.\n */\n storage_type: PropTypes.oneOf(['local', 'session', 'memory']),\n\n /**\n * The stored data for the id.\n */\n data: PropTypes.oneOfType([\n PropTypes.object,\n PropTypes.array,\n PropTypes.number,\n PropTypes.string,\n PropTypes.bool,\n ]),\n\n /**\n * Set to true to remove the data contained in `data_key`.\n */\n clear_data: PropTypes.bool,\n\n /**\n * The last time the storage was modified.\n */\n modified_timestamp: PropTypes.number,\n\n /**\n * Dash-assigned callback that gets fired when the value changes.\n */\n setProps: PropTypes.func,\n};\n","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n \n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./tabs.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = function insertAtTop(element) {\n var parent = document.querySelector('head');\n // eslint-disable-next-line no-underscore-dangle\n var lastInsertedElement =\n window._lastElementInsertedByStyleLoader;\n\n if (!lastInsertedElement) {\n parent.insertBefore(element, parent.firstChild);\n } else if (lastInsertedElement.nextSibling) {\n parent.insertBefore(element, lastInsertedElement.nextSibling);\n } else {\n parent.appendChild(element);\n }\n\n // eslint-disable-next-line no-underscore-dangle\n window._lastElementInsertedByStyleLoader = element;\n };\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!./tabs.css\";\n export default content && content.locals ? content.locals : undefined;\n","import React from 'react';\nimport './css/tabs.css';\nimport {TabProps} from '../types';\n\n/**\n * Part of dcc.Tabs - this is the child Tab component used to render a tabbed page.\n * Its children will be set as the content of that tab, which if clicked will become visible.\n */\nfunction Tab({\n children,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n disabled = false,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n disabled_style = {color: 'var(--Dash-Text-Disabled)'},\n}: TabProps) {\n return <>{children};\n}\n\nexport default Tab;\n","import React, {useCallback, useEffect, useMemo, useRef, useState} from 'react';\nimport {has, isNil} from 'ramda';\n\nimport LoadingElement from '../utils/_LoadingElement';\nimport {PersistedProps, PersistenceTypes, TabProps, TabsProps} from '../types';\nimport './css/tabs.css';\nimport {DashComponent} from '@dash-renderer/types';\n\ninterface EnhancedTabProps extends TabProps {\n selected: boolean;\n componentPath?: (string | number)[];\n}\n\n// EnhancedTab is defined here instead of in Tab.tsx because if exported there,\n// it will mess up the Python imports and metadata.json\nconst EnhancedTab = ({\n id,\n label,\n selected,\n className,\n style,\n selected_className,\n selected_style,\n setProps: selectHandler,\n value,\n disabled = false,\n disabled_style = {color: 'var(--Dash-Text-Disabled)'},\n disabled_className,\n componentPath,\n}: EnhancedTabProps) => {\n const ExternalWrapper = window.dash_component_api.ExternalWrapper;\n const ctx = window.dash_component_api.useDashContext();\n componentPath = componentPath ?? ctx.componentPath;\n // We use the raw path here since it's up one level from\n // the tabs child.\n const isLoading = ctx.useLoading({rawPath: componentPath});\n const tabStyle = useMemo(() => {\n return {\n ...style,\n ...(disabled ? disabled_style : {}),\n ...(selected ? selected_style : {}),\n };\n }, [style, disabled, disabled_style, selected, selected_style]);\n\n const tabClassNames = useMemo(() => {\n let names = 'tab';\n if (disabled) {\n names += ' tab--disabled';\n if (disabled_className) {\n names += ` ${disabled_className}`;\n }\n }\n if (selected) {\n names += ' tab--selected';\n if (selected_className) {\n names += ` ${selected_className}`;\n }\n }\n if (className) {\n names += ` ${className}`;\n }\n return names;\n }, [className, disabled, disabled_className, selected, selected_className]);\n\n let labelDisplay;\n if (typeof label === 'object') {\n labelDisplay = (\n \n );\n } else {\n labelDisplay = {label};\n }\n\n return (\n {\n if (!disabled) {\n selectHandler({value});\n }\n }}\n >\n {labelDisplay}\n
\n );\n};\n\n/**\n * A Dash component that lets you render pages with tabs - the Tabs component's children\n * can be dcc.Tab components, which can hold a label that will be displayed as a tab, and can in turn hold\n * children components that will be that tab's content.\n */\nfunction Tabs({\n // eslint-disable-next-line no-magic-numbers\n mobile_breakpoint = 800,\n colors = {\n border: 'var(--Dash-Stroke-Weak)',\n primary: 'var(--Dash-Fill-Interactive-Strong)',\n background: 'var(--Dash-Fill-Interactive-Weak)',\n },\n vertical = false,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persisted_props = [PersistedProps.value],\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persistence_type = PersistenceTypes.local,\n children,\n ...props\n}: TabsProps) {\n const initializedRef = useRef(false);\n const [isAboveBreakpoint, setIsAboveBreakpoint] = useState(false);\n\n const parseChildrenToArray = useCallback((): DashComponent[] => {\n if (!children) {\n return [];\n }\n if (children instanceof Array) {\n return children;\n }\n return [children];\n }, [children]);\n\n const valueOrDefault = (): string | undefined => {\n if (has('value', props)) {\n return props.value;\n }\n const children = parseChildrenToArray();\n if (children && children.length && children[0].props.componentPath) {\n const firstChildren: TabProps = window.dash_component_api.getLayout(\n [...children[0].props.componentPath, 'props']\n );\n return firstChildren.value ?? 'tab-1';\n }\n return 'tab-1';\n };\n\n // Initialize value on mount if not set\n useEffect(() => {\n if (!initializedRef.current && !has('value', props)) {\n props.setProps({\n value: `${valueOrDefault()}`,\n });\n initializedRef.current = true;\n }\n }, []);\n\n // Setup matchMedia for responsive breakpoint\n useEffect(() => {\n const mediaQuery = window.matchMedia(\n `(min-width: ${mobile_breakpoint}px)`\n );\n\n // Set initial value\n setIsAboveBreakpoint(mediaQuery.matches);\n\n // Listen for changes\n const handler = (e: MediaQueryListEvent) =>\n setIsAboveBreakpoint(e.matches);\n mediaQuery.addEventListener('change', handler);\n\n return () => mediaQuery.removeEventListener('change', handler);\n }, [mobile_breakpoint]);\n\n let EnhancedTabs: JSX.Element[];\n let selectedTab;\n\n const value = valueOrDefault();\n\n if (children) {\n const children = parseChildrenToArray();\n\n EnhancedTabs = children.map((child, index) => {\n // TODO: handle components that are not dcc.Tab components (throw error)\n // enhance Tab components coming from Dash (as dcc.Tab) with methods needed for handling logic\n let childProps: Omit;\n\n if (React.isValidElement(child) && child.props.componentPath) {\n childProps = window.dash_component_api.getLayout([\n ...child.props.componentPath,\n 'props',\n ]);\n } else {\n // In case the selected tab is a string.\n childProps = {};\n }\n\n if (!childProps.value) {\n childProps = {...childProps, value: `tab-${index + 1}`};\n }\n\n // check if this child/Tab is currently selected\n if (childProps.value === value) {\n selectedTab = child;\n }\n\n const style = childProps.style ?? {};\n if (typeof childProps.width === 'number') {\n style.width = `${childProps.width}px`;\n style.flex = '0 0 auto';\n } else if (typeof childProps.width === 'string') {\n style.width = childProps.width;\n style.flex = '0 0 auto';\n }\n\n return (\n \n );\n });\n }\n\n const selectedTabContent = !isNil(selectedTab) ? selectedTab : '';\n\n const tabContainerClassNames = useMemo(() => {\n let names = 'tab-container';\n if (vertical) {\n names += ` tab-container--vert`;\n }\n if (props.className) {\n names += ` ${props.className}`;\n }\n return names;\n }, [vertical, props.className]);\n\n const tabContentClassNames = useMemo(() => {\n let names = 'tab-content';\n if (vertical) {\n names += ` tab-content--vert`;\n }\n if (props.content_className) {\n names += ` ${props.content_className}`;\n }\n return names;\n }, [vertical, props.content_className]);\n\n const tabParentClassNames = useMemo(() => {\n let names = 'tab-parent';\n if (vertical) {\n names += ` tab-parent--vert`;\n }\n if (isAboveBreakpoint) {\n names += ' tab-parent--above-breakpoint';\n }\n if (props.parent_className) {\n names += ` ${props.parent_className}`;\n }\n return names;\n }, [vertical, isAboveBreakpoint, props.parent_className]);\n\n // Set CSS variables for dynamic styling\n const cssVars = {\n '--tabs-border': colors.border,\n '--tabs-primary': colors.primary,\n '--tabs-background': colors.background,\n } as const;\n\n return (\n \n {loadingProps => (\n \n \n {EnhancedTabs}\n
\n \n {selectedTabContent || ''}\n
\n
\n )}\n \n );\n}\n\nTabs.dashPersistence = {\n persisted_props: [PersistedProps.value],\n persistence_type: PersistenceTypes.local,\n};\n\nTabs.dashChildrenUpdate = true;\n\nexport default Tabs;\n","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n \n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./textarea.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = function insertAtTop(element) {\n var parent = document.querySelector('head');\n // eslint-disable-next-line no-underscore-dangle\n var lastInsertedElement =\n window._lastElementInsertedByStyleLoader;\n\n if (!lastInsertedElement) {\n parent.insertBefore(element, parent.firstChild);\n } else if (lastInsertedElement.nextSibling) {\n parent.insertBefore(element, lastInsertedElement.nextSibling);\n } else {\n parent.appendChild(element);\n }\n\n // eslint-disable-next-line no-underscore-dangle\n window._lastElementInsertedByStyleLoader = element;\n };\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!./textarea.css\";\n export default content && content.locals ? content.locals : undefined;\n","/* eslint-disable no-unused-vars */\nimport React from 'react';\nimport {pick} from 'ramda';\nimport {PersistedProps, PersistenceTypes, TextAreaProps} from '../types';\nimport './css/textarea.css';\n\nconst textAreaProps = [\n 'id',\n 'cols',\n 'rows',\n 'minLength',\n 'maxLength',\n 'contentEditable',\n 'tabIndex',\n 'form',\n 'name',\n 'placeholder',\n 'wrap',\n 'accessKey',\n 'contextMenu',\n 'dir',\n 'draggable',\n 'lang',\n 'spellCheck',\n 'style',\n 'title',\n] as const;\n\n/**\n * A basic HTML textarea for entering multiline text.\n *\n */\nconst Textarea = ({\n setProps,\n n_blur = 0,\n n_blur_timestamp = -1,\n n_clicks = 0,\n n_clicks_timestamp = -1,\n ...props\n}: TextAreaProps) => {\n const ctx = window.dash_component_api.useDashContext();\n const isLoading = ctx.useLoading();\n\n return (\n
\n
\n \n );\n};\n\nexport default Tooltip;\n","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n \n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./dcc.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = function insertAtTop(element) {\n var parent = document.querySelector('head');\n // eslint-disable-next-line no-underscore-dangle\n var lastInsertedElement =\n window._lastElementInsertedByStyleLoader;\n\n if (!lastInsertedElement) {\n parent.insertBefore(element, parent.firstChild);\n } else if (lastInsertedElement.nextSibling) {\n parent.insertBefore(element, lastInsertedElement.nextSibling);\n } else {\n parent.appendChild(element);\n }\n\n // eslint-disable-next-line no-underscore-dangle\n window._lastElementInsertedByStyleLoader = element;\n };\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!./dcc.css\";\n export default content && content.locals ? content.locals : undefined;\n"],"names":["leafPrototypes","getProto","inProgress","dataWebpackPrefix","e","window","module","exports","__webpack_require__","n","t","r","o","i","l","call","m","c","d","Object","defineProperty","enumerable","get","Symbol","toStringTag","value","__esModule","create","bind","default","prototype","hasOwnProperty","p","s","u","a","done","Promise","resolve","then","this","arguments","apply","isReady","lazy","setTimeout","regeneratorRuntime","mark","wrap","prev","next","stop","_dashprivate_isLazyComponentReady","f","length","configurable","writable","key","TypeError","dispatchEvent","CustomEvent","addEventListener","removeEventListener","_typeof","iterator","constructor","_defineProperties","target","props","descriptor","_toPropertyKey","_createClass","Constructor","protoProps","staticProps","arg","input","prim","toPrimitive","undefined","res","hint","String","_toPrimitive","isDeepEqual","isDeepStrictEqual","_require$codes","codes","ERR_AMBIGUOUS_ARGUMENT","ERR_INVALID_ARG_TYPE","ERR_INVALID_ARG_VALUE","ERR_INVALID_RETURN_VALUE","ERR_MISSING_ARGS","AssertionError","inspect","_require$types","isPromise","isRegExp","objectAssign","objectIs","RegExpPrototypeTest","lazyLoadComparison","comparison","Map","warned","assert","ok","NO_EXCEPTION_SENTINEL","innerFail","obj","message","Error","innerOk","fn","argLen","generatedMessage","err","actual","expected","operator","stackStartFn","_len","args","Array","_key","concat","fail","internalMessage","argsLen","process","emitWarning","console","warn","errArgs","equal","notEqual","deepEqual","notDeepEqual","deepStrictEqual","notDeepStrictEqual","strictEqual","notStrictEqual","Comparison","keys","_this","instance","_classCallCheck","forEach","expectedException","msg","name","push","b","compareExceptionKey","isPrototypeOf","getActual","checkIsPromise","catch","waitForActual","promiseFn","resultPromise","expectsError","error","details","fnType","expectsNoError","internalMatch","string","regexp","fnName","match","strict","_len6","_key6","throws","_len2","_key2","rejects","_len3","_key3","result","doesNotThrow","_len4","_key4","doesNotReject","_len5","_key5","ifError","newErr","origStack","stack","tmp2","split","shift","tmp1","pos","indexOf","slice","join","doesNotMatch","ownKeys","getOwnPropertySymbols","filter","getOwnPropertyDescriptor","_objectSpread","getOwnPropertyDescriptors","defineProperties","_possibleConstructorReturn","self","_assertThisInitialized","ReferenceError","_wrapNativeSuper","Class","_cache","Function","toString","has","set","Wrapper","_construct","_getPrototypeOf","_setPrototypeOf","Parent","_isNativeReflectConstruct","Reflect","construct","sham","Proxy","Boolean","valueOf","setPrototypeOf","__proto__","getPrototypeOf","endsWith","str","search","this_len","substring","blue","green","red","white","kReadableOperator","strictEqualObject","notStrictEqualObject","notIdentical","copyError","source","inspectValue","val","compact","customInspect","depth","maxArrayLength","Infinity","showHidden","breakLength","showProxy","sorted","getters","_Error","_inspect$custom","subClass","superClass","_inherits","Derived","hasNativeReflectConstruct","_super","Super","NewTarget","options","limit","stackTraceLimit","stderr","isTTY","getColorDepth","other","lastPos","end","skipped","actualInspected","actualLines","expectedLines","indicator","inputLength","columns","count","Math","floor","maxCount","log","repeat","pop","maxLines","max","_actualLines","printedLines","skippedMsg","cur","expectedLine","actualLine","divergingLines","createErrDiff","base","_res","knownOperators","code","captureStackTrace","recurseTimes","ctx","custom","util","createErrorType","Base","NodeError","_Base","arg1","arg2","arg3","getMessage","oneOf","thing","isArray","len","map","determiner","start","substr","replace","type","reason","inspected","RangeError","_slicedToArray","arr","_arrayWithHoles","return","_iterableToArrayLimit","minLen","_arrayLikeToArray","from","test","_unsupportedIterableToArray","_nonIterableRest","arr2","regexFlagsSupported","flags","arrayFromSet","array","arrayFromMap","is","objectGetOwnPropertySymbols","numberIsNaN","Number","isNaN","uncurryThis","propertyIsEnumerable","objectToString","isAnyArrayBuffer","isArrayBufferView","isDate","isMap","isSet","isNativeError","isBoxedPrimitive","isNumberObject","isStringObject","isBooleanObject","isBigIntObject","isSymbolObject","isFloat32Array","isFloat64Array","isNonIndex","charCodeAt","pow","getOwnNonIndexProperties","compare","x","y","min","innerDeepEqual","val1","val2","memos","buf1","buf2","val1Tag","keys1","keys2","keyCheck","Date","getTime","RegExp","byteLength","Uint8Array","buffer","byteOffset","areSimilarTypedArrays","offset","areSimilarFloatArrays","_keys","_keys2","size","BigInt","isEqualBoxedPrimitive","getEnumerables","k","iterationType","aKeys","bKeys","symbolKeysA","symbolKeysB","_symbolKeysB","position","val2MemoA","val2MemoB","areEq","memo","aValues","Set","add","setMightHaveLoosePrim","bValues","_i","_val","setHasEqualElement","setEquiv","aEntries","_aEntries$i","item1","item2","mapMightHaveLoosePrim","bEntries","_i2","_bEntries$_i","item","mapHasEqualEntry","mapEquiv","keysA","objEquiv","delete","setValues","findLooseMatchingPrimitives","altValue","curB","key1","key2","privatePropTypes","_dashprivate_transformConfig","PropTypes","_dashprivate_transformFigure","_dashprivate_onFigureModified","EMPTY_DATA","PlotlyGraph","_Component","_callSuper","mathjax","_loadMathjax","state","prependData","extendData","clearState","setState","nextProps","figure","dataKey","data","React","ControlledPlotlyGraph","_extends","Component","RealPlotlyGraph","asyncDecorator","all","Plotly","reject","timeoutId","element","document","createElement","src","_dashPlotlyJSURL","async","onload","clearTimeout","onerror","querySelector","appendChild","lazyLoadMathJax","_ref","className","id","extendedClassName","Suspense","fallback","displayName","propTypes","responsive","clickData","clickAnnotationData","hoverData","clear_on_unhover","selectedData","relayoutData","restyleData","layout","frames","style","animate","animation_options","config","staticPlot","plotlyServerURL","editable","editSelection","edits","annotationPosition","annotationTail","annotationText","axisTitleText","colorbarPosition","colorbarTitleText","legendPosition","legendText","shapePosition","titleText","autosizable","queueLength","fillFrame","frameMargins","scrollZoom","doubleClick","doubleClickDelay","showTips","showAxisDragHandles","showAxisRangeEntryBoxes","showLink","sendData","linkText","displayModeBar","showSendToCloud","showEditInChartStudio","modeBarButtonsToRemove","modeBarButtonsToAdd","modeBarButtons","toImageButtonOptions","format","filename","width","height","scale","displaylogo","watermark","plotGlPixelRatio","topojsonURL","mapboxAccessToken","locale","locales","displayNotifier","setProps","defaultProps","frame","redraw","transition","duration","ease","graphPropTypes","graphDefaultProps","Graph_react","upload","RealUpload","Upload","contents","last_modified","children","accept","disabled","disable_click","max_size","min_size","multiple","enable_folder_selection","className_active","className_reject","className_disabled","style_active","style_reject","style_disabled","borderStyle","borderColor","backgroundColor","opacity","LoadingElement","ref","_ref$elementType","elementType","_objectWithoutProperties","_excluded","loading","dash_component_api","useDashContext","useLoading","givenProps","__webpack_exports__","A","dropdown","RealDropdown","defaultLabels","select_all","deselect_all","selected_count","clear_search","clear_selection","no_options_found","Dropdown","_ref$clearable","clearable","_ref$disabled","_ref$multi","multi","_ref$searchable","searchable","_ref$labels","labels","_ref$optionHeight","optionHeight","_ref$maxHeight","maxHeight","_ref$closeOnSelect","closeOnSelect","persisted_props","PersistedProps","persistence_type","PersistenceTypes","local","dashPersistence","allBlankCharCodes","is_string_blank_namespaceFn","original","styleTagTransform","styleTagTransform_default","setAttributes","setAttributesWithoutAttributes_default","insert","parent","lastInsertedElement","_lastElementInsertedByStyleLoader","nextSibling","insertBefore","firstChild","domAPI","styleDomAPI_default","insertStyleElement","insertStyleElement_default","injectStylesIntoStyleTag_default","locals","convert","fastIsNumeric","isNumeric","NaN","isEquivalent","v1","v2","inputProps","Input","_ref$type","HTMLInputTypes","text","_ref$inputMode","inputMode","_ref$n_blur","n_blur","_ref$n_submit","n_blur_timestamp","n_submit","_ref$debounce","n_submit_timestamp","debounce","_ref$step","step","_ref$autoComplete","autoComplete","useRef","_useState2","useState","setValue","_useState4","pendingEvent","setPendingEvent","inputId","uniqid","valprops","number","setPropValue","useCallback","current","checkValidity","onEvent","inputValue","valueAsNumber","propValue","onBlur","now","onChange","onKeyDown","setInputValue","debounceEvent","seconds","handleStepperClick","direction","currentValue","parseFloat","stepAsNum","decimalPlaces","constrainedValue","roundedValue","toFixed","useEffect","cursorPosition","selectionStart","isFinite","setSelectionRange","disabledAsBool","includes","pickedInputs","pick","isNumberInput","currentNumericValue","minValue","maxValue","isDecrementDisabled","isIncrementDisabled","loadingProps","hidden","trim","onClick","components_Input","_ref$refresh","refresh","_ref$scrollToTop","scrollToTop","href","title","cleanUrl","dash_clientside","clean_url","sanitizedUrl","useMemo","updateLocation","metaKey","shiftKey","altKey","ctrlKey","isNil","preventDefault","location","history","pushState","scrollTo","_dash_error","CalendarDirection","MathJax","additionalProps","assign","safeIsNaN","isEqual","first","second","areInputsEqual","newInputs","lastInputs","memoize_one_esm","resultFn","lastThis","lastResult","lastArgs","calledOnce","newArgs","performance","cancelTimeout","timeoutID","cancelAnimationFrame","getScrollbarSize","recalculate","div","overflow","body","offsetWidth","clientWidth","removeChild","cachedRTLResult","getRTLOffsetType","outerDiv","outerStyle","innerDiv","innerStyle","scrollLeft","defaultItemKey$1","index","createListComponent","_class","getItemOffset","getEstimatedTotalSize","getItemSize","getOffsetForIndexAndAlignment","getStartIndexForOffset","getStopIndexForStartIndex","initInstanceProps","shouldResetStyleCacheOnItemSizeChange","validateProps","_PureComponent","List","_instanceProps","_outerRef","_resetIsScrollingTimeoutId","isScrolling","scrollDirection","scrollOffset","initialScrollOffset","scrollUpdateWasRequested","_callOnItemsRendered","memoizeOne","overscanStartIndex","overscanStopIndex","visibleStartIndex","visibleStopIndex","onItemsRendered","_callOnScroll","onScroll","_getItemStyle","_this$props","itemSize","itemStyleCache","_getItemStyleCache","isHorizontal","isRtl","offsetHorizontal","left","right","top","_offset","_","__","___","_onScrollHorizontal","event","_event$currentTarget","currentTarget","scrollWidth","prevState","_resetIsScrollingDebounced","_onScrollVertical","_event$currentTarget2","clientHeight","scrollHeight","scrollTop","_outerRefSetter","outerRef","callback","delay","_resetIsScrolling","requestAnimationFrame","tick","getDerivedStateFromProps","validateSharedProps","_proto","scrollToItem","align","_this$props2","itemCount","scrollbarSize","componentDidMount","_this$props3","_callPropsCallbacks","componentDidUpdate","_this$props4","_this$state","componentWillUnmount","render","_this$props5","innerRef","innerElementType","innerTagName","itemData","_this$props5$itemKey","itemKey","outerElementType","outerTagName","useIsScrolling","_this$_getRangeToRend","_getRangeToRender","startIndex","stopIndex","items","_index","estimatedTotalSize","WebkitOverflowScrolling","willChange","pointerEvents","_this$_getRangeToRend2","_overscanStartIndex","_overscanStopIndex","_visibleStartIndex","_visibleStopIndex","_this$state2","_scrollDirection","_scrollOffset","_scrollUpdateWasRequested","_this$props6","overscanCount","_this$state3","overscanBackward","overscanForward","PureComponent","validateSharedProps$1","_ref2","_ref3","getItemMetadata$1","instanceProps","itemMetadataMap","lastMeasuredIndex","itemMetadata","findNearestItemBinarySearch$1","high","low","middle","currentOffset","estimatedItemSize","totalSizeOfMeasuredItems","VariableSizeList","maxOffset","minOffset","round","findNearestItemBinarySearch","interval","findNearestItemExponentialSearch","findNearestItem$1","getItemMetadata","resetAfterIndex","shouldForceUpdate","forceUpdate","_ref5","optionslist","OptionLabel","label","ExternalWrapper","component","componentPath","displayLabel","Option","option","isSelected","optionClassName","optionStyle","_ref2$inputType","inputType","inputClassName","inputStyle","labelClassName","labelStyle","classNames","inputClassNames","labelClassNames","role","checked","onKeyUp","readOnly","Row","selected","passThruProps","setOptionHeight","measureRef","el","immediateHeight","getBoundingClientRect","ResizeObserver","_ref4","_entry$borderBoxSize$","_entry$borderBoxSize","entry","borderBoxSize","blockSize","contentRect","observe","OptionsList","forwardRef","_ref6","onSelectionChange","_ref6$maxHeight","innerHeight","listRef","containerRef","pendingFocusRef","heightsRef","measuredHeight","setMeasuredHeight","defaultOptionHeight","getOptionHeight","_heightsRef$current$g","_listRef$current","useLayoutEffect","_listRef$current2","h","defaultListHeight","listHeight","focusOption","optionIndex","_containerRef$current","deferred","HTMLElement","focus","useImperativeHandle","focusItem","handleChange","newValue","without","append","handleItemsRendered","sizerDiv","longestOption","maxLen","_data$options$index$v","_data$options$index","sanitizeOptions","valueSet","opt","isOptionValue","entries","$apply","$call","$reflectApply","actualApply","$TypeError","$actualApply","GetIntrinsic","callBind","$indexOf","allowMissing","intrinsic","setFunctionLength","$defineProperty","callBindBasic","applyBind","originalFunction","func","adjustedLength","times","g","functions","time","object","expression","tuple","___CSS_LOADER_EXPORT___","_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default","_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default","version","sources","names","mappings","sourcesContent","sourceRoot","cssWithMappingToString","list","content","needLayer","modules","media","dedupe","supports","layer","alreadyImportedModules","_k","cssMapping","btoa","base64","unescape","encodeURIComponent","JSON","stringify","sourceMapping","$SyntaxError","gopd","property","nonEnumerable","nonWritable","nonConfigurable","loose","desc","hasSymbols","toStr","defineDataProperty","supportsDescriptors","predicate","predicates","hasProtoAccessor","gOPD","$Object","$getPrototypeOf","EvalError","SyntaxError","URIError","__WEBPACK_AMD_DEFINE_FACTORY__","__WEBPACK_AMD_DEFINE_RESULT__","XMLHttpRequest","open","responseType","response","send","status","MouseEvent","createEvent","initMouseEvent","global","navigator","userAgent","saveAs","HTMLAnchorElement","URL","webkitURL","j","download","rel","origin","createObjectURL","revokeObjectURL","msSaveOrOpenBlob","autoBom","Blob","innerText","safari","FileReader","onloadend","readAsDataURL","isCallable","thisArg","receiver","forEachArray","charAt","forEachString","forEachObject","concatty","that","bound","arrLike","slicy","boundLength","boundArgs","joiny","Empty","implementation","$Error","$EvalError","$RangeError","$ReferenceError","$URIError","abs","sign","$Function","getEvalledConstructor","expressionSyntax","$gOPD","throwTypeError","ThrowTypeError","calleeThrows","gOPDthrows","$ObjectGPO","$ReflectGPO","needsEval","TypedArray","INTRINSICS","AggregateError","ArrayBuffer","Atomics","BigInt64Array","BigUint64Array","DataView","decodeURI","decodeURIComponent","encodeURI","eval","Float16Array","Float32Array","Float64Array","FinalizationRegistry","Int8Array","Int16Array","Int32Array","parseInt","SharedArrayBuffer","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","WeakRef","WeakSet","errorProto","doEval","gen","LEGACY_ALIASES","hasOwn","$concat","$spliceApply","splice","$replace","$strSlice","$exec","exec","rePropName","reEscapeChar","getBaseIntrinsic","alias","intrinsicName","parts","last","quote","subString","stringToPath","intrinsicBaseName","intrinsicRealName","skipFurtherCaching","isOwn","part","reflectGetProto","originalGetProto","getDunderProto","O","hasPropertyDescriptors","hasArrayLengthDefineBug","origSymbol","hasSymbolSham","sym","symObj","getOwnPropertyNames","syms","$hasOwn","ctor","superCtor","super_","TempCtor","hasToStringTag","$toString","callBound","isStandardArguments","isLegacyArguments","callee","supportsStandardArguments","badArrayLike","isCallableMarker","fnToStr","reflectApply","constructorRegex","isES6ClassFn","fnStr","tryFunctionObject","isIE68","isDDA","strClass","isFnRegex","safeRegexTest","getGeneratorFunction","GeneratorFunction","define","getPolyfill","shim","polyfill","isRegexMarker","throwRegexMarker","badStringifier","whichTypedArray","$isNaN","keysShim","isArgs","isEnumerable","hasDontEnumBug","hasProtoEnumBug","dontEnums","equalsConstructorPrototype","excludedKeys","$applicationCache","$console","$external","$frame","$frameElement","$frames","$innerHeight","$innerWidth","$onmozfullscreenchange","$onmozfullscreenerror","$outerHeight","$outerWidth","$pageXOffset","$pageYOffset","$parent","$scrollLeft","$scrollTop","$scrollX","$scrollY","$self","$webkitIndexedDB","$webkitStorageInfo","$window","hasAutomationEqualityBug","isObject","isFunction","isArguments","isString","theKeys","skipProto","skipConstructor","equalsConstructorPrototypeIfNotBuggy","origKeys","originalKeys","keysWorksWithArguments","objectKeys","$push","$propIsEnumerable","originalGetSymbols","source1","to","getSymbols","nextKey","letters","lacksProperEnumerationOrder","preventExtensions","thrower","assignHasPendingExceptions","cachedSetTimeout","cachedClearTimeout","defaultSetTimout","defaultClearTimeout","runTimeout","fun","currentQueue","queue","draining","queueIndex","cleanUpNextTick","drainQueue","timeout","run","marker","runClearTimeout","Item","noop","nextTick","browser","env","argv","versions","on","addListener","once","off","removeListener","removeAllListeners","emit","prependListener","prependOnceListener","listeners","binding","cwd","chdir","dir","umask","isRegex","regex","hasDescriptors","$floor","functionLengthIsConfigurable","functionLengthIsWritable","stylesInDOM","getIndexByIdentifier","identifier","modulesToDom","idCountMap","identifiers","indexByIdentifier","css","sourceMap","references","updater","addElementStyle","byIndex","api","update","newObj","remove","lastIdentifiers","newList","newLastIdentifiers","attributes","styleElement","nonce","nc","setAttribute","parentNode","removeStyleElement","styleSheet","cssText","createTextNode","pid","prefix","suffix","copy","fill","readUInt8","isArgumentsObject","isGeneratorFunction","isTypedArray","BigIntSupported","SymbolSupported","ObjectToString","numberValue","stringValue","booleanValue","bigIntValue","symbolValue","checkBoxedPrimitive","prototypeValueOf","isMapToString","isSetToString","isWeakMapToString","isWeakSetToString","isArrayBufferToString","isArrayBuffer","working","isDataViewToString","isDataView","isView","isUint8Array","isUint8ClampedArray","isUint16Array","isUint32Array","isInt8Array","isInt16Array","isInt32Array","isBigInt64Array","isBigUint64Array","isWeakMap","isWeakSet","SharedArrayBufferCopy","isSharedArrayBufferToString","isSharedArrayBuffer","isAsyncFunction","isMapIterator","isSetIterator","isGeneratorObject","isWebAssemblyCompiledModule","method","descriptors","formatRegExp","objects","isNull","deprecate","noDeprecation","throwDeprecation","traceDeprecation","trace","debugs","debugEnvRegex","NODE_DEBUG","debugEnv","toUpperCase","opts","seen","stylize","stylizeNoColor","colors","isBoolean","_extend","isUndefined","stylizeWithColor","formatValue","styleType","styles","ret","primitive","simple","isNumber","formatPrimitive","visibleKeys","hash","idx","arrayToHash","isError","formatError","output","braces","toUTCString","formatProperty","formatArray","reduce","reduceToSingleString","line","ar","re","pad","debuglog","bold","italic","underline","inverse","grey","black","cyan","magenta","yellow","special","boolean","null","date","types","isNullOrUndefined","isSymbol","isPrimitive","isBuffer","months","prop","getHours","getMinutes","getSeconds","getDate","getMonth","inherits","kCustomPromisifiedSymbol","callbackifyOnRejected","cb","newReason","promisify","promiseResolve","promiseReject","promise","callbackify","callbackified","maybeCb","rej","availableTypedArrays","globalThis","typedArrays","$slice","cache","typedArray","proto","superProto","tag","isTATag","found","getter","trySlices","tryTypedArrays","ReactJSXRuntime","jsx","maybeKey","propName","jsxs","jsxDEV","Fragment","possibleNames","out","defaultOptions","getDefaultOptions","dateLongFormatter","pattern","formatLong","timeLongFormatter","longFormatters","P","dateTimeLongFormatter","dateTimeFormat","matchResult","datePattern","timePattern","dateTime","getTimezoneOffsetInMilliseconds","_date","toDate","utcDate","UTC","getFullYear","getMilliseconds","setUTCFullYear","normalizeDates","context","dates","normalize","constructFrom","find","dayOfYearTokenRE","weekYearTokenRE","throwTokens","isProtectedDayOfYearToken","token","isProtectedWeekYearToken","warnOrThrowProtectedError","_message","subject","toLowerCase","millisecondsInWeek","millisecondsInDay","millisecondsInMinute","millisecondsInHour","millisecondsInSecond","constructFromSymbol","for","differenceInCalendarDays","laterDate","earlierDate","_normalizeDates2","in","laterDate_","earlierDate_","laterStartOfDay","startOfDay","earlierStartOfDay","laterTimestamp","earlierTimestamp","getDayOfYear","date_","setFullYear","setHours","startOfYear","addLeadingZeros","targetLength","padStart","lightFormatters","signedYear","year","M","month","dayPeriodEnumValue","H","S","numberOfDigits","milliseconds","trunc","formatters","G","localize","era","ordinalNumber","unit","Y","signedWeekYear","getWeekYear","weekYear","R","getISOWeekYear","Q","quarter","ceil","q","L","w","week","getWeek","I","isoWeek","getISOWeek","D","dayOfYear","E","dayOfWeek","getDay","day","localDayOfWeek","weekStartsOn","isoDayOfWeek","dayPeriod","hours","B","K","X","_localize","timezoneOffset","getTimezoneOffset","formatTimezoneWithOptionalMinutes","formatTimezone","formatTimezoneShort","z","T","delimiter","absOffset","minutes","formattingTokensRegExp","longFormattingTokensRegExp","escapedStringRegExp","doubleQuoteRegExp","unescapedLatinCharacterRegExp","formatStr","_options$locale","_options$firstWeekCon","_options$locale2","_defaultOptions$local","_ref7","_options$weekStartsOn","_options$locale3","_defaultOptions$local2","defaultLocale","firstWeekContainsDate","originalDate","isValid","firstCharacter","longFormatter","isToken","matched","preprocessor","formatterOptions","useAdditionalWeekYearTokens","useAdditionalDayOfYearTokens","formatter","diff","startOfISOWeek","fourthOfJanuary","startOfISOWeekYear","fourthOfJanuaryOfNextYear","startOfNextYear","fourthOfJanuaryOfThisYear","startOfThisYear","startOfWeek","firstWeek","startOfWeekYear","firstWeekOfNextYear","firstWeekOfThisYear","formatDistanceLocale","lessThanXSeconds","one","xSeconds","halfAMinute","lessThanXMinutes","xMinutes","aboutXHours","xHours","xDays","aboutXWeeks","xWeeks","aboutXMonths","xMonths","aboutXYears","xYears","overXYears","almostXYears","buildFormatLongFn","defaultWidth","formats","full","long","medium","short","formatRelativeLocale","lastWeek","yesterday","today","tomorrow","nextWeek","buildLocalizeFn","valuesArray","formattingValues","defaultFormattingWidth","values","argumentCallback","dirtyNumber","_options","rem100","narrow","abbreviated","wide","am","pm","midnight","noon","morning","afternoon","evening","night","buildMatchFn","matchPattern","matchPatterns","defaultMatchWidth","matchedString","parsePatterns","defaultParseWidth","findIndex","findKey","valueCallback","rest","parsePattern","parseResult","any","enUS","formatDistance","tokenValue","addSuffix","formatRelative","_baseDate","parseISO","argument","_options$additionalDi","invalidDate","additionalDigits","dateStrings","dateString","timeString","patterns","dateTimeDelimiter","timeZoneDelimiter","timezone","splitDateString","parseYearResult","captures","restDateString","century","parseYear","dateRegex","isWeekDate","parseDateUnit","_year","validateWeekDate","isoWeekYear","getUTCDay","setUTCDate","getUTCDate","dayOfISOWeekYear","daysInMonths","isLeapYearIndex","validateDate","validateDayOfYearDate","parseDate","timestamp","timeRegex","parseTimeUnit","validateTime","parseTime","tmpDate","getUTCFullYear","getUTCMonth","getUTCHours","getUTCMinutes","getUTCSeconds","getUTCMilliseconds","timezoneString","timezoneRegex","_hours","validateTimezone","parseTimezone","setDate","cached","es_append","set1","set2","len1","len2","_concat","_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__","_internal_isArray_js__WEBPACK_IMPORTED_MODULE_1__","_toString_js__WEBPACK_IMPORTED_MODULE_4__","_internal_isString_js__WEBPACK_IMPORTED_MODULE_3__","_internal_isFunction_js__WEBPACK_IMPORTED_MODULE_2__","_arrayFromIterator","iter","_includesWith","pred","internal_objectIs","_uniqContentEquals","aIterator","bIterator","stackA","stackB","eq","_a","_b","_equals","aItem","typeA","equals","ignoreCase","multiline","sticky","unicode","extendedStackA","extendedStackB","_has","es_equals","_curry2","XFilter","xf","_xfBase","init","_xfilter","es_filter","_dispatchable","filterable","_isObject","reducer","acc","_arrayReduce","_filterMap","_filter","es_hasPath","_path","es_has","_internal_includes_js__WEBPACK_IMPORTED_MODULE_0__","_curry1","f1","_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_0__","f2","_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_1__","_curry1_js__WEBPACK_IMPORTED_MODULE_0__","methodNames","transducerCreator","_isArray","_isTransformer","transducer","_includes","inf","_indexOf","_isArguments","_has_js__WEBPACK_IMPORTED_MODULE_0__","_isFunction","_isPlaceholder","_isString","hasEnumBug","nonEnumerableProps","hasArgsEnumBug","contains","_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__","nIdx","ks","checkArgsLength","_internal_isArguments_js__WEBPACK_IMPORTED_MODULE_2__","_internal_has_js__WEBPACK_IMPORTED_MODULE_1__","omit","es_reject","_map","functor","_quote","internal_toISOString","toISOString","_toString","recur","xs","mapPairs","sort","repr","es_toString","hasOrAdd","shouldAdd","prevSize","_items","_nativeSet","bIdx","internal_Set","_Set","es_without","toRemove","__webpack_module_cache__","moduleId","cachedModule","__webpack_modules__","cw","mod","mode","ns","def","definition","chunkId","promises","url","script","needAttach","scripts","getElementsByTagName","getAttribute","charset","onScriptComplete","doneFns","head","scriptUrl","importScripts","currentScript","tagName","getCurrentScript","doc_scripts","textContent","jsonpScriptSrc","__jsonpScriptSrc__","isLocal","srcFragments","fileFragments","installedChunks","installedChunkData","errorType","realSrc","request","webpackJsonpCallback","parentChunkLoadingFunction","chunkIds","moreModules","runtime","some","chunkLoadingGlobal","bg","b64","tmp","lens","validLen","getLens","placeHoldersLen","Arr","_byteLength","curByte","revLookup","lookup","css_button","components_Button","_ref$n_clicks","n_clicks","n_clicks_timestamp","isLoading","checklist_options","checklist","Checklist","_ref$inputStyle","_ref$inputClassName","_ref$labelStyle","_ref$labelClassName","_ref$options","_ref$value","_ref$inline","inline","sanitizedOptions","stylingProps","selection","_defineProperty","_arr","_n","_d","_e","_s","_WINDOW","_DOCUMENT","_PERFORMANCE","measure","MutationObserver","_ref$userAgent","WINDOW","DOCUMENT","PERFORMANCE","IS_DOM","documentElement","NAMESPACE_IDENTIFIER","DEFAULT_REPLACEMENT_CLASS","oneToTen","oneToTwenty","DUOTONE_CLASSES","GROUP","SWAP_OPACITY","PRIMARY","SECONDARY","initial","FontAwesomeConfig","attr","coerce","getAttrConfig","_config","familyPrefix","replacementClass","autoReplaceSvg","autoAddCss","autoA11y","searchPseudoElements","observeMutations","mutateApproach","keepOriginalSource","measurePerformance","showMissingIcons","hooks","shims","namespace","doScroll","readyState","listener","asyncTimer","PENDING","SETTLED","FULFILLED","REJECTED","NOOP","isNode","asyncSetTimer","setImmediate","asyncQueue","asyncFlush","asyncCall","invokeCallback","subscriber","owner","settled","_state","_data","handleThenable","resolved","fulfill","publishFulfillment","publishRejection","publish","_then","_handled","notifyRejectionHandled","resolver","rejectPromise","invokeResolver","onFulfillment","onRejection","fulfilled","rejected","results","remaining","race","meaninglessTransform","rotate","flipX","flipY","nextUniqueId","random","htmlEscape","joinStyles","styleName","transformIsMeaningful","transform","transformForSvg","containerWidth","iconWidth","outer","innerTranslate","innerScale","innerRotate","inner","path","ALL_SPACE","fillBlack","abstract","force","initialValue","thisContext","bindInternal4","defineIcons","icons","_params$skipHooks","skipHooks","normalized","iconName","icon","addPack","build","ligatures","ligature","hasRegular","oldName","iconFromMapping","mapping","toHtml","abstractNodes","_abstractNodes$attrib","_abstractNodes$childr","attributeName","joinAttributes","MissingIcon","FILL","ANIMATION_BASE","attributeType","repeatCount","dur","OPACITY_ANIMATE","asFoundIcon","vectorData","class","cx","cy","Library","definitions","additions","_pullDefinitions","_normalized$key","ensureCss","_cssInserted","innerHTML","headChildren","childNodes","beforeChild","child","insertCss","dfp","drc","fp","rc","dPatt","customPropPatt","rPatt","findIconDefinition","iconLookup","_iconLookup$prefix","library","parse","transformString","parseTransformString","iconDefinition","abstractCreator","params","_params$transform","_params$symbol","symbol","_params$mask","mask","_params$maskId","maskId","_params$title","_params$titleId","titleId","_params$classes","classes","_params$attributes","_params$styles","_params$icons","main","extra","_params$watchable","watchable","isUploadedIcon","widthClass","attrClass","xmlns","viewBox","uploadedIconWidthStyle","explicitMaskId","mainWidth","mainPath","maskWidth","maskPath","trans","maskRect","maskInnerGroupChildrenMixin","maskInnerGroup","maskOuterGroup","clipId","maskTag","maskUnits","maskContentUnits","defs","makeIconMasking","styleString","makeIconStandard","asSymbol","asIcon","makeInlineSvgAbstract","container","html","maybeIconDefinition","enumerableOnly","symbols","_objectSpread2","index_es_defineProperty","index_es_typeof","index_es_objectWithoutProperties","excluded","sourceKeys","index_es_objectWithoutPropertiesLoose","sourceSymbolKeys","index_es_toConsumableArray","index_es_arrayWithoutHoles","index_es_iterableToArray","index_es_nonIterableSpread","camelize","chr","_excluded$1","index_es_PRODUCTION","normalizeIconArgs","objectWithKey","index_es_excluded","FontAwesomeIcon","forwardedRef","iconArgs","maskArgs","_classes","beat","fade","beatFade","bounce","shake","flash","spin","spinPulse","spinReverse","pulse","fixedWidth","border","listItem","flip","rotation","pull","swapOpacity","classList","renderedIcon","_console","index_es_console","extraProps","convertCurry","external_PropTypes_default","bool","oneOfType","mixins","attrs","pair","startsWith","_extraProps$style","existingStyle","external_React_default","faCheckCircle","faCopy","Generator","_regeneratorDefine2","v","GeneratorFunctionPrototype","_regenerator","_invoke","asyncGeneratorStep","_asyncToGenerator","_next","_throw","clipboardAPI","clipboard","wait","ms","Clipboard","_React$Component","copyToClipboard","onClickHandler","copySuccess","getTargetText","stringifyId","copied","prevProps","wild","_copySuccess","_callee","htmlContent","showCopiedIcon","blobHtml","blobText","_context","ClipboardItem","write","writeText","_x","_x2","target_id","getElementById","_loading","_callee2","_context2","_copyToClipboard","_callee3","_context3","html_content","copied_children","button_children","DashContext","ConfirmDialog","_update","displayed","shouldTriggerDisplay","cancel_n_clicks","submit_n_clicks","confirm","submit_n_clicks_timestamp","cancel_n_clicks_timestamp","ConfirmDialogProvider","wrapClick","datePickerRange","DatePickerPersistence","extract","parsed","storedValue","RealDatePickerRange","DatePickerRange","_ref$calendar_orienta","calendar_orientation","_ref$is_RTL","is_RTL","_ref$day_size","day_size","_ref$with_portal","with_portal","_ref$with_full_screen","with_full_screen_portal","_ref$first_day_of_wee","first_day_of_week","_ref$number_of_months","number_of_months_shown","_ref$stay_open_on_sel","stay_open_on_select","_ref$reopen_calendar_","reopen_calendar_on_clear","_ref$show_outside_day","show_outside_days","_ref$updatemode","updatemode","_ref$disabled_days","start_date","end_date","disabled_days","persistenceTransforms","transformDate","datePickerSingle","RealDatePickerSingle","DatePickerSingle","_ref$placeholder","placeholder","getValue","Download","toByteArray","blob","isRequired","Geolocation","success","update_now","geolocation","positionOptions","enableHighAccuracy","high_accuracy","maximumAge","maximum_age","getCurrentPosition","updatePosition","_crd$latitude","_crd$longitude","_crd$accuracy","_crd$altitude","_crd$altitudeAccuracy","_crd$speed","_crd$heading","crd","coords","position_obj","lat","latitude","lon","longitude","accuracy","alt","altitude","alt_accuracy","altitudeAccuracy","speed","heading","local_date","toLocaleString","position_error","show_alert","alert","Interval","intervalId","reportInterval","handleTimer","max_intervals","n_intervals","clearTimer","setInterval","clearInterval","resetTimer","_toPairs","pairs","es_toPairs","XAny","_xany","es_any","DebugTitle","spinnerComponentOptions","graph","debugTitle","fullscreen","debug","spinnerClass","cube","color","circle","dot","coveringSpinner","visibility","display","justifyContent","alignItems","components_Loading","targetComponents","_ref3$display","_ref3$color","parent_className","parent_style","overlay_style","_ref3$show_initially","show_initially","_ref3$type","spinnerType","_ref3$delay_hide","delay_hide","_ref3$delay_show","delay_show","target_components","custom_spinner","useSelector","stringPath","loadingChildren","toPairs","load","showSpinner","setShowSpinner","dismissTimer","showTimer","containerStyle","Spinner","getSpinner","Location","onLocationChange","_this2","pathname","propsToSet","checkExistsUpdateWindowLocation","fieldName","propVal","pathnameUpdated","hrefUpdated","hashUpdated","searchUpdated","searchVal","hashVal","propsToChange","History","dispatchChangeEvent","markdown","RealMarkdown","Markdown","_ref$mathjax","_ref$dangerously_allo","dangerously_allow_html","_ref$dedent","dedent","radioitems_options","RadioItems","radioitems","rangeSlider","sliders_options","sliders","RealRangeSlider","RangeSlider","_ref$verticalHeight","verticalHeight","_ref$allow_direct_inp","allow_direct_input","isInteger","RealSlider","Slider","drag_value","mappedValue","mappedDragValue","mappedSetProps","newProps","mappedProps","MemStore","_modified","setModified","WebStore","storage","_storage","getItem","setItem","removeItem","Store","storage_type","_backstore","localStorage","sessionStorage","onStorageChange","oldValue","modified_timestamp","getModified","old","clear_data","tabs_options","tabs","components_Tab","disabled_style","EnhancedTab","selected_className","selected_style","selectHandler","_ref$disabled_style","disabled_className","labelDisplay","rawPath","tabStyle","tabClassNames","_toConsumableArray","Tabs","EnhancedTabs","selectedTab","_ref2$mobile_breakpoi","mobile_breakpoint","_ref2$colors","primary","background","_ref2$vertical","vertical","initializedRef","isAboveBreakpoint","setIsAboveBreakpoint","parseChildrenToArray","valueOrDefault","_firstChildren$value","getLayout","mediaQuery","matchMedia","matches","handler","_childProps$style","childProps","flex","selectedTabContent","tabContainerClassNames","tabContentClassNames","content_className","tabParentClassNames","cssVars","content_style","dashChildrenUpdate","components_Tabs","textarea_options","css_textarea","textAreaProps","Textarea","required","autoFocus","components_Textarea","tooltip_options","tooltip","components_Tooltip","_ref$show","show","_ref$targetable","targetable","_ref$direction","_ref$border_color","border_color","_ref$background_color","background_color","_ref$className","_ref$zindex","zindex","_ref$loading_text","loading_text","bbox","show_tooltip","is_loading","x0","x1","y0","y1","dcc_options","dcc"],"sourceRoot":""} \ No newline at end of file diff --git a/dash/dcc/package-info.json b/dash/dcc/package-info.json index 3b1c929a3f..67011908dd 100644 --- a/dash/dcc/package-info.json +++ b/dash/dcc/package-info.json @@ -1,6 +1,6 @@ { "name": "dash-core-components", - "version": "4.5.1", + "version": "4.5.2", "description": "Core component suite for Dash", "repository": { "type": "git", diff --git a/dash/html/dash_html_components.min.js b/dash/html/dash_html_components.min.js index 07385d5433..b06f3f5423 100644 --- a/dash/html/dash_html_components.min.js +++ b/dash/html/dash_html_components.min.js @@ -1,2 +1,2 @@ -!function(){"use strict";var n={n:function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,{a:t}),t},d:function(e,t){for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},o:function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},r:function(n){Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})}},e={};n.r(e),n.d(e,{A:function(){return p},Abbr:function(){return m},Acronym:function(){return h},Address:function(){return j},Area:function(){return T},Article:function(){return N},Aside:function(){return A},Audio:function(){return R},B:function(){return z},Base:function(){return X},Basefont:function(){return $},Bdi:function(){return rn},Bdo:function(){return ln},Big:function(){return gn},Blink:function(){return bn},Blockquote:function(){return On},Br:function(){return Pn},Button:function(){return xn},Canvas:function(){return Sn},Caption:function(){return Kn},Center:function(){return Bn},Cite:function(){return Vn},Code:function(){return Wn},Col:function(){return Zn},Colgroup:function(){return te},Content:function(){return ce},Data:function(){return de},Datalist:function(){return _e},Dd:function(){return ke},Del:function(){return ve},Details:function(){return Ee},Dfn:function(){return Ce},Dialog:function(){return Le},Div:function(){return Me},Dl:function(){return Ue},Dt:function(){return Ye},Em:function(){return Ge},Embed:function(){return nt},Fieldset:function(){return it},Figcaption:function(){return lt},Figure:function(){return gt},Font:function(){return bt},Footer:function(){return Ot},Form:function(){return Pt},Frame:function(){return xt},Frameset:function(){return St},H1:function(){return Kt},H2:function(){return Bt},H3:function(){return Vt},H4:function(){return Wt},H5:function(){return Zt},H6:function(){return tr},Header:function(){return cr},Hgroup:function(){return dr},Hr:function(){return _r},I:function(){return kr},Iframe:function(){return vr},Img:function(){return Er},Ins:function(){return Cr},Kbd:function(){return Lr},Keygen:function(){return Mr},Label:function(){return Ur},Legend:function(){return Yr},Li:function(){return Gr},Link:function(){return ni},Main:function(){return ii},MapEl:function(){return li},Mark:function(){return gi},Marquee:function(){return bi},Meta:function(){return Oi},Meter:function(){return Pi},Nav:function(){return xi},Nobr:function(){return Si},Noscript:function(){return Ki},ObjectEl:function(){return Bi},Ol:function(){return Vi},Optgroup:function(){return Wi},Option:function(){return Zi},Output:function(){return ts},P:function(){return cs},Param:function(){return ds},Picture:function(){return _s},Plaintext:function(){return ks},Pre:function(){return vs},Progress:function(){return Es},Q:function(){return Cs},Rb:function(){return Ls},Rp:function(){return Ms},Rt:function(){return Us},Rtc:function(){return Ys},Ruby:function(){return Gs},S:function(){return nc},Samp:function(){return ic},Script:function(){return lc},Section:function(){return gc},Select:function(){return bc},Shadow:function(){return Oc},Slot:function(){return Pc},Small:function(){return xc},Source:function(){return Sc},Spacer:function(){return Kc},Span:function(){return Bc},Strike:function(){return Vc},Strong:function(){return Wc},Sub:function(){return Zc},Summary:function(){return ta},Sup:function(){return ca},Table:function(){return da},Tbody:function(){return _a},Td:function(){return ka},Template:function(){return va},Textarea:function(){return Ea},Tfoot:function(){return Ca},Th:function(){return La},Thead:function(){return Ma},Time:function(){return Ua},Title:function(){return Ya},Tr:function(){return Ga},Track:function(){return nl},U:function(){return il},Ul:function(){return ll},Var:function(){return gl},Video:function(){return bl},Wbr:function(){return Ol},Xmp:function(){return Pl}});var t=window.React,r=n.n(t),i=window.PropTypes,s=n.n(i);function c(n){return null!=n&&"object"==typeof n&&!0===n["@@functional/placeholder"]}function a(n){return function e(t){return 0===arguments.length||c(t)?e:n.apply(this,arguments)}}function l(n){return function e(t,r){switch(arguments.length){case 0:return e;case 1:return c(t)?e:a(function(e){return n(t,e)});default:return c(t)&&c(r)?e:c(t)?a(function(e){return n(e,r)}):c(r)?a(function(e){return n(t,e)}):n(t,r)}}}var o=l(function(n,e){for(var t={},r={},i=0,s=n.length;i {String: *} -> {String: *}\n * @param {Array} names an array of String property names to omit from the new object\n * @param {Object} obj The object to copy from\n * @return {Object} A new object with properties from `names` not on it.\n * @see R.pick\n * @example\n *\n * R.omit(['a', 'd'], {a: 1, b: 2, c: 3, d: 4}); //=> {b: 2, c: 3}\n */\nvar omit = /*#__PURE__*/_curry2(function omit(names, obj) {\n var result = {};\n var index = {};\n var idx = 0;\n var len = names.length;\n while (idx < len) {\n index[names[idx]] = 1;\n idx += 1;\n }\n for (var prop in obj) {\n if (!index.hasOwnProperty(prop)) {\n result[prop] = obj[prop];\n }\n }\n return result;\n});\nexport default omit;","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * A is a wrapper for the HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a\n */\nconst A = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n const cleanUrl = window.dash_clientside.clean_url;\n const href = React.useMemo(() => props.href && cleanUrl(props.href), [props.href]);\n \n if (href) {\n extraProps.href = href;\n }\n \n React.useEffect(() => {\n if (href && href !== props.href) {\n props.setProps({_dash_error: new Error(`Dangerous link detected: ${props.href}`)})\n }\n }, [props.href, href]);\n \n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n \n );\n};\n\n\nA.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Indicates that the hyperlink is to be used for downloading a resource.\n */\n 'download': PropTypes.string,\n\n /**\n * The URL of a linked resource.\n */\n 'href': PropTypes.string,\n\n /**\n * Specifies the language of the linked resource.\n */\n 'hrefLang': PropTypes.string,\n\n /**\n * Specifies a hint of the media for which the linked resource was designed.\n */\n 'media': PropTypes.string,\n\n /**\n * Specifies which referrer is sent when fetching the resource.\n */\n 'referrerPolicy': PropTypes.string,\n\n /**\n * Specifies the relationship of the target object to the link object.\n */\n 'rel': PropTypes.string,\n\n /**\n *\n */\n 'shape': PropTypes.string,\n\n /**\n * Specifies where to open the linked document (in the case of an element) or where to display the response received (in the case of a element)\n */\n 'target': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default A;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Abbr is a wrapper for the HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/abbr\n */\nconst Abbr = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n \n );\n};\n\n\nAbbr.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Abbr;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Acronym is a wrapper for the HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/acronym\n */\nconst Acronym = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n \n );\n};\n\n\nAcronym.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Acronym;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Address is a wrapper for the
HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/address\n */\nconst Address = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n
\n );\n};\n\n\nAddress.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Address;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Area is a wrapper for the HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/area\n */\nconst Area = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n \n );\n};\n\n\nArea.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Alternative text in case an image can't be displayed.\n */\n 'alt': PropTypes.string,\n\n /**\n * A set of values specifying the coordinates of the hot-spot region.\n */\n 'coords': PropTypes.string,\n\n /**\n * Indicates that the hyperlink is to be used for downloading a resource.\n */\n 'download': PropTypes.string,\n\n /**\n * The URL of a linked resource.\n */\n 'href': PropTypes.string,\n\n /**\n * Specifies a hint of the media for which the linked resource was designed.\n */\n 'media': PropTypes.string,\n\n /**\n * Specifies which referrer is sent when fetching the resource.\n */\n 'referrerPolicy': PropTypes.string,\n\n /**\n * Specifies the relationship of the target object to the link object.\n */\n 'rel': PropTypes.string,\n\n /**\n *\n */\n 'shape': PropTypes.string,\n\n /**\n * Specifies where to open the linked document (in the case of an
element) or where to display the response received (in the case of a element)\n */\n 'target': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Area;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Article is a wrapper for the
HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/article\n */\nconst Article = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n
\n );\n};\n\n\nArticle.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Article;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Aside is a wrapper for the \n );\n};\n\n\nAside.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Aside;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Audio is a wrapper for the \n );\n};\n\n\nAudio.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * The audio or video should play as soon as possible.\n */\n 'autoPlay': PropTypes.oneOfType([\n PropTypes.oneOf(['autoPlay', 'autoplay', 'AUTOPLAY']),\n PropTypes.bool\n ]),\n\n /**\n * Indicates whether the browser should show playback controls to the user.\n */\n 'controls': PropTypes.oneOfType([\n PropTypes.oneOf(['controls', 'CONTROLS']),\n PropTypes.bool\n ]),\n\n /**\n * How the element handles cross-origin requests\n */\n 'crossOrigin': PropTypes.string,\n\n /**\n * Indicates whether the media should start playing from the start when it's finished.\n */\n 'loop': PropTypes.oneOfType([\n PropTypes.oneOf(['loop', 'LOOP']),\n PropTypes.bool\n ]),\n\n /**\n * Indicates whether the audio will be initially silenced on page load.\n */\n 'muted': PropTypes.oneOfType([\n PropTypes.oneOf(['muted', 'MUTED']),\n PropTypes.bool\n ]),\n\n /**\n * Indicates whether the whole resource, parts of it or nothing should be preloaded.\n */\n 'preload': PropTypes.string,\n\n /**\n * The URL of the embeddable content.\n */\n 'src': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Audio;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * B is a wrapper for the HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/b\n */\nconst B = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n \n );\n};\n\n\nB.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default B;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Base is a wrapper for the HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base\n */\nconst Base = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n \n );\n};\n\n\nBase.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * The URL of a linked resource.\n */\n 'href': PropTypes.string,\n\n /**\n * Specifies where to open the linked document (in the case of an
element) or where to display the response received (in the case of a element)\n */\n 'target': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Base;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Basefont is a wrapper for the HTML5 element.\n *\n * OBSOLETE: is included for completeness, but should be avoided\n * as it is only supported by Internet Explorer.\n *\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/basefont\n */\nconst Basefont = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n \n );\n};\n\n\nBasefont.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Basefont;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Bdi is a wrapper for the HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/bdi\n */\nconst Bdi = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n \n );\n};\n\n\nBdi.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Bdi;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Bdo is a wrapper for the HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/bdo\n */\nconst Bdo = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n \n );\n};\n\n\nBdo.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Bdo;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Big is a wrapper for the HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/big\n */\nconst Big = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n \n );\n};\n\n\nBig.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Big;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Blink is a wrapper for the HTML5 element.\n *\n * OBSOLETE: is included for completeness, but should be avoided\n * as it is not supported by any modern browsers.\n *\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/blink\n */\nconst Blink = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n \n );\n};\n\n\nBlink.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Blink;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Blockquote is a wrapper for the
HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/blockquote\n */\nconst Blockquote = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n
\n );\n};\n\n\nBlockquote.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Contains a URI which points to the source of the quote or change.\n */\n 'cite': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Blockquote;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Br is a wrapper for the
HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/br\n */\nconst Br = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n
\n );\n};\n\n\nBr.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Br;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Button is a wrapper for the \n );\n};\n\n\nButton.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * The element should be automatically focused after the page loaded.\n */\n 'autoFocus': PropTypes.oneOfType([\n PropTypes.oneOf(['autoFocus', 'autofocus', 'AUTOFOCUS']),\n PropTypes.bool\n ]),\n\n /**\n * Indicates whether the user can interact with the element.\n */\n 'disabled': PropTypes.oneOfType([\n PropTypes.oneOf(['disabled', 'DISABLED']),\n PropTypes.bool\n ]),\n\n /**\n * Indicates the form that is the owner of the element.\n */\n 'form': PropTypes.string,\n\n /**\n * Indicates the action of the element, overriding the action defined in the .\n */\n 'formAction': PropTypes.string,\n\n /**\n * If the button/input is a submit button (e.g., type=\"submit\"), this attribute sets the encoding type to use during form submission. If this attribute is specified, it overrides the enctype attribute of the button's form owner.\n */\n 'formEncType': PropTypes.string,\n\n /**\n * If the button/input is a submit button (e.g., type=\"submit\"), this attribute sets the submission method to use during form submission (GET, POST, etc.). If this attribute is specified, it overrides the method attribute of the button's form owner.\n */\n 'formMethod': PropTypes.string,\n\n /**\n * If the button/input is a submit button (e.g., type=\"submit\"), this boolean attribute specifies that the form is not to be validated when it is submitted. If this attribute is specified, it overrides the novalidate attribute of the button's form owner.\n */\n 'formNoValidate': PropTypes.oneOfType([\n PropTypes.oneOf(['formNoValidate', 'formnovalidate', 'FORMNOVALIDATE']),\n PropTypes.bool\n ]),\n\n /**\n * If the button/input is a submit button (e.g., type=\"submit\"), this attribute specifies the browsing context (for example, tab, window, or inline frame) in which to display the response that is received after submitting the form. If this attribute is specified, it overrides the target attribute of the button's form owner.\n */\n 'formTarget': PropTypes.string,\n\n /**\n * Name of the element. For example used by the server to identify the fields in form submits.\n */\n 'name': PropTypes.string,\n\n /**\n * Defines the type of the element.\n */\n 'type': PropTypes.string,\n\n /**\n * Defines a default value which will be displayed in the element on page load.\n */\n 'value': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Button;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Canvas is a wrapper for the HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/canvas\n */\nconst Canvas = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n \n );\n};\n\n\nCanvas.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Specifies the height of elements listed here. For all other elements, use the CSS height property. Note: In some instances, such as
, this is a legacy attribute, in which case the CSS height property should be used instead.\n */\n 'height': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * For the elements listed here, this establishes the element's width. Note: For all other instances, such as
, this is a legacy attribute, in which case the CSS width property should be used instead.\n */\n 'width': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Canvas;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Caption is a wrapper for the
\n );\n};\n\n\nCaption.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Caption;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Center is a wrapper for the
HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/center\n */\nconst Center = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n
\n );\n};\n\n\nCenter.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Center;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Cite is a wrapper for the HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/cite\n */\nconst Cite = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n \n );\n};\n\n\nCite.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Cite;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Code is a wrapper for the HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/code\n */\nconst Code = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n \n );\n};\n\n\nCode.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Code;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Col is a wrapper for the
HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/col\n */\nconst Col = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n \n );\n};\n\n\nCol.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n *\n */\n 'span': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Col;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Colgroup is a wrapper for the HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/colgroup\n */\nconst Colgroup = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n \n );\n};\n\n\nColgroup.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n *\n */\n 'span': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Colgroup;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Content is a wrapper for the HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/content\n */\nconst Content = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n \n );\n};\n\n\nContent.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Content;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Data is a wrapper for the HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/data\n */\nconst Data = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n \n );\n};\n\n\nData.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Defines a default value which will be displayed in the element on page load.\n */\n 'value': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Data;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Datalist is a wrapper for the HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/datalist\n */\nconst Datalist = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n \n );\n};\n\n\nDatalist.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Datalist;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Dd is a wrapper for the
HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dd\n */\nconst Dd = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n
\n );\n};\n\n\nDd.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Dd;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Del is a wrapper for the HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/del\n */\nconst Del = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n \n );\n};\n\n\nDel.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Contains a URI which points to the source of the quote or change.\n */\n 'cite': PropTypes.string,\n\n /**\n * Indicates the date and time associated with the element.\n */\n 'dateTime': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Del;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Details is a wrapper for the
HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/details\n */\nconst Details = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n
\n );\n};\n\n\nDetails.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Indicates whether the contents are currently visible (in the case of a
element) or whether the dialog is active and can be interacted with (in the case of a element).\n */\n 'open': PropTypes.oneOfType([\n PropTypes.oneOf(['open', 'OPEN']),\n PropTypes.bool\n ]),\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Details;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Dfn is a wrapper for the HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dfn\n */\nconst Dfn = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n \n );\n};\n\n\nDfn.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Dfn;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Dialog is a wrapper for the HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dialog\n */\nconst Dialog = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n \n );\n};\n\n\nDialog.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Indicates whether the contents are currently visible (in the case of a
element) or whether the dialog is active and can be interacted with (in the case of a element).\n */\n 'open': PropTypes.oneOfType([\n PropTypes.oneOf(['open', 'OPEN']),\n PropTypes.bool\n ]),\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Dialog;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Div is a wrapper for the
HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/div\n */\nconst Div = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n
\n );\n};\n\n\nDiv.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Div;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Dl is a wrapper for the
HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dl\n */\nconst Dl = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n
\n );\n};\n\n\nDl.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Dl;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Dt is a wrapper for the
HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dt\n */\nconst Dt = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n
\n );\n};\n\n\nDt.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Dt;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Em is a wrapper for the HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/em\n */\nconst Em = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n \n );\n};\n\n\nEm.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Em;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Embed is a wrapper for the HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/embed\n */\nconst Embed = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n const cleanUrl = window.dash_clientside.clean_url;\n const src = React.useMemo(() => props.src && cleanUrl(props.src), [props.src]);\n \n if (src) {\n extraProps.src = src;\n }\n \n React.useEffect(() => {\n if (src && src !== props.src) {\n props.setProps({_dash_error: new Error(`Dangerous link detected: ${props.src}`)})\n }\n }, [props.src, src]);\n \n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n \n );\n};\n\n\nEmbed.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Specifies the height of elements listed here. For all other elements, use the CSS height property. Note: In some instances, such as
, this is a legacy attribute, in which case the CSS height property should be used instead.\n */\n 'height': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * The URL of the embeddable content.\n */\n 'src': PropTypes.string,\n\n /**\n * Defines the type of the element.\n */\n 'type': PropTypes.string,\n\n /**\n * For the elements listed here, this establishes the element's width. Note: For all other instances, such as
, this is a legacy attribute, in which case the CSS width property should be used instead.\n */\n 'width': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Embed;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Fieldset is a wrapper for the
HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/fieldset\n */\nconst Fieldset = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n
\n );\n};\n\n\nFieldset.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Indicates whether the user can interact with the element.\n */\n 'disabled': PropTypes.oneOfType([\n PropTypes.oneOf(['disabled', 'DISABLED']),\n PropTypes.bool\n ]),\n\n /**\n * Indicates the form that is the owner of the element.\n */\n 'form': PropTypes.string,\n\n /**\n * Name of the element. For example used by the server to identify the fields in form submits.\n */\n 'name': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Fieldset;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Figcaption is a wrapper for the
HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/figcaption\n */\nconst Figcaption = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n
\n );\n};\n\n\nFigcaption.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Figcaption;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Figure is a wrapper for the
HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/figure\n */\nconst Figure = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n
\n );\n};\n\n\nFigure.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Figure;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Font is a wrapper for the HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/font\n */\nconst Font = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n \n );\n};\n\n\nFont.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Font;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Footer is a wrapper for the
HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/footer\n */\nconst Footer = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n
\n );\n};\n\n\nFooter.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Footer;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Form is a wrapper for the HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form\n */\nconst Form = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n const cleanUrl = window.dash_clientside.clean_url;\n const action = React.useMemo(() => props.action && cleanUrl(props.action), [props.action]);\n \n if (action) {\n extraProps.action = action;\n }\n \n React.useEffect(() => {\n if (action && action !== props.action) {\n props.setProps({_dash_error: new Error(`Dangerous link detected: ${props.action}`)})\n }\n }, [props.action, action]);\n \n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n \n );\n};\n\n\nForm.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * List of types the server accepts, typically a file type.\n */\n 'accept': PropTypes.string,\n\n /**\n * The character set, which if provided must be \"UTF-8\".\n */\n 'acceptCharset': PropTypes.string,\n\n /**\n * The URI of a program that processes the information submitted via the form.\n */\n 'action': PropTypes.string,\n\n /**\n * Indicates whether controls in this form can by default have their values automatically completed by the browser.\n */\n 'autoComplete': PropTypes.string,\n\n /**\n * Defines the content type of the form data when the method is POST.\n */\n 'encType': PropTypes.string,\n\n /**\n * Defines which HTTP method to use when submitting the form. Can be GET (default) or POST.\n */\n 'method': PropTypes.string,\n\n /**\n * Name of the element. For example used by the server to identify the fields in form submits.\n */\n 'name': PropTypes.string,\n\n /**\n * This attribute indicates that the form shouldn't be validated when submitted.\n */\n 'noValidate': PropTypes.oneOfType([\n PropTypes.oneOf(['noValidate', 'novalidate', 'NOVALIDATE']),\n PropTypes.bool\n ]),\n\n /**\n * Specifies where to open the linked document (in the case of an
element) or where to display the response received (in the case of a
element)\n */\n 'target': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Form;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Frame is a wrapper for the HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/frame\n */\nconst Frame = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n \n );\n};\n\n\nFrame.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Frame;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Frameset is a wrapper for the HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/frameset\n */\nconst Frameset = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n \n );\n};\n\n\nFrameset.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Frameset;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * H1 is a wrapper for the

HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/h1\n */\nconst H1 = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n

\n );\n};\n\n\nH1.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default H1;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * H2 is a wrapper for the

HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/h2\n */\nconst H2 = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n

\n );\n};\n\n\nH2.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default H2;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * H3 is a wrapper for the

HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/h3\n */\nconst H3 = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n

\n );\n};\n\n\nH3.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default H3;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * H4 is a wrapper for the

HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/h4\n */\nconst H4 = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n

\n );\n};\n\n\nH4.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default H4;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * H5 is a wrapper for the
HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/h5\n */\nconst H5 = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n
\n );\n};\n\n\nH5.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default H5;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * H6 is a wrapper for the
HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/h6\n */\nconst H6 = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n
\n );\n};\n\n\nH6.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default H6;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Header is a wrapper for the
HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/header\n */\nconst Header = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n
\n );\n};\n\n\nHeader.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Header;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Hgroup is a wrapper for the
HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/hgroup\n */\nconst Hgroup = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n
\n );\n};\n\n\nHgroup.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Hgroup;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Hr is a wrapper for the
HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/hr\n */\nconst Hr = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n \n );\n};\n\n\nHr.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Hr;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * I is a wrapper for the HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/i\n */\nconst I = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n \n );\n};\n\n\nI.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default I;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Iframe is a wrapper for the \n );\n};\n\n\nIframe.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Specifies a feature-policy for the iframe.\n */\n 'allow': PropTypes.string,\n\n /**\n * Specifies the height of elements listed here. For all other elements, use the CSS height property. Note: In some instances, such as
, this is a legacy attribute, in which case the CSS height property should be used instead.\n */\n 'height': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Name of the element. For example used by the server to identify the fields in form submits.\n */\n 'name': PropTypes.string,\n\n /**\n * Specifies which referrer is sent when fetching the resource.\n */\n 'referrerPolicy': PropTypes.string,\n\n /**\n * Stops a document loaded in an iframe from using certain features (such as submitting forms or opening new windows).\n */\n 'sandbox': PropTypes.string,\n\n /**\n * The URL of the embeddable content.\n */\n 'src': PropTypes.string,\n\n /**\n *\n */\n 'srcDoc': PropTypes.string,\n\n /**\n * For the elements listed here, this establishes the element's width. Note: For all other instances, such as
, this is a legacy attribute, in which case the CSS width property should be used instead.\n */\n 'width': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Iframe;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Img is a wrapper for the HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img\n */\nconst Img = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n \n );\n};\n\n\nImg.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Alternative text in case an image can't be displayed.\n */\n 'alt': PropTypes.string,\n\n /**\n * How the element handles cross-origin requests\n */\n 'crossOrigin': PropTypes.string,\n\n /**\n * Specifies the height of elements listed here. For all other elements, use the CSS height property. Note: In some instances, such as
, this is a legacy attribute, in which case the CSS height property should be used instead.\n */\n 'height': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Specifies which referrer is sent when fetching the resource.\n */\n 'referrerPolicy': PropTypes.string,\n\n /**\n *\n */\n 'sizes': PropTypes.string,\n\n /**\n * The URL of the embeddable content.\n */\n 'src': PropTypes.string,\n\n /**\n * One or more responsive image candidates.\n */\n 'srcSet': PropTypes.string,\n\n /**\n *\n */\n 'useMap': PropTypes.string,\n\n /**\n * For the elements listed here, this establishes the element's width. Note: For all other instances, such as
, this is a legacy attribute, in which case the CSS width property should be used instead.\n */\n 'width': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Img;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Ins is a wrapper for the HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ins\n */\nconst Ins = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n \n );\n};\n\n\nIns.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Contains a URI which points to the source of the quote or change.\n */\n 'cite': PropTypes.string,\n\n /**\n * Indicates the date and time associated with the element.\n */\n 'dateTime': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Ins;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Kbd is a wrapper for the HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/kbd\n */\nconst Kbd = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n \n );\n};\n\n\nKbd.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Kbd;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Keygen is a wrapper for the HTML5 element.\n *\n * DEPRECATED: is included for completeness, but should be avoided\n * as it is not supported by all browsers and may be removed at any time from\n * those that do support it.\n *\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/keygen\n */\nconst Keygen = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n \n );\n};\n\n\nKeygen.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Keygen;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Label is a wrapper for the \n );\n};\n\n\nLabel.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Describes elements which belongs to this one.\n */\n 'htmlFor': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Label;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Legend is a wrapper for the HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/legend\n */\nconst Legend = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n \n );\n};\n\n\nLegend.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Legend;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Li is a wrapper for the
  • HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/li\n */\nconst Li = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n
  • \n );\n};\n\n\nLi.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Defines a default value which will be displayed in the element on page load.\n */\n 'value': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Li;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Link is a wrapper for the HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link\n */\nconst Link = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n \n );\n};\n\n\nLink.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * How the element handles cross-origin requests\n */\n 'crossOrigin': PropTypes.string,\n\n /**\n * The URL of a linked resource.\n */\n 'href': PropTypes.string,\n\n /**\n * Specifies the language of the linked resource.\n */\n 'hrefLang': PropTypes.string,\n\n /**\n * This attribute contains one or more hashes of the resource, and is used to ensure that the content of the resource is what the developer expects it to be, and has not been replaced with a malicious copy in a supply chain attack. See Subresource Integrity.\n */\n 'integrity': PropTypes.string,\n\n /**\n * Specifies a hint of the media for which the linked resource was designed.\n */\n 'media': PropTypes.string,\n\n /**\n * Specifies which referrer is sent when fetching the resource.\n */\n 'referrerPolicy': PropTypes.string,\n\n /**\n * Specifies the relationship of the target object to the link object.\n */\n 'rel': PropTypes.string,\n\n /**\n *\n */\n 'sizes': PropTypes.string,\n\n /**\n * Defines the type of the element.\n */\n 'type': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Link;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Main is a wrapper for the
    HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/main\n */\nconst Main = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n
    \n );\n};\n\n\nMain.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Main;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * MapEl is a wrapper for the HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/map\n */\nconst MapEl = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n \n );\n};\n\n\nMapEl.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Name of the element. For example used by the server to identify the fields in form submits.\n */\n 'name': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default MapEl;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Mark is a wrapper for the HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/mark\n */\nconst Mark = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n \n );\n};\n\n\nMark.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Mark;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Marquee is a wrapper for the HTML5 element.\n *\n * DEPRECATED: is included for completeness, but should be avoided\n * as browsers may remove it at any time.\n *\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/marquee\n */\nconst Marquee = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n \n );\n};\n\n\nMarquee.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Indicates whether the media should start playing from the start when it's finished.\n */\n 'loop': PropTypes.oneOfType([\n PropTypes.oneOf(['loop', 'LOOP']),\n PropTypes.bool\n ]),\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Marquee;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Meta is a wrapper for the HTML5 element.\n *\n * CAUTION: is included for completeness, but generally will not behave\n * as expected since tags should be static HTML content in the of\n * the document. Dash components are dynamic content.\n *\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta\n */\nconst Meta = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n \n );\n};\n\n\nMeta.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Declares the character encoding of the page or script.\n */\n 'charSet': PropTypes.string,\n\n /**\n * A value associated with http-equiv or name depending on the context.\n */\n 'content': PropTypes.string,\n\n /**\n * Defines a pragma directive.\n */\n 'httpEquiv': PropTypes.string,\n\n /**\n * Name of the element. For example used by the server to identify the fields in form submits.\n */\n 'name': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Meta;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Meter is a wrapper for the HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meter\n */\nconst Meter = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n \n );\n};\n\n\nMeter.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Indicates the lower bound of the upper range.\n */\n 'high': PropTypes.string,\n\n /**\n * Indicates the upper bound of the lower range.\n */\n 'low': PropTypes.string,\n\n /**\n * Indicates the maximum value allowed.\n */\n 'max': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Indicates the minimum value allowed.\n */\n 'min': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Indicates the optimal numeric value.\n */\n 'optimum': PropTypes.string,\n\n /**\n * Defines a default value which will be displayed in the element on page load.\n */\n 'value': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Meter;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Nav is a wrapper for the \n );\n};\n\n\nNav.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Nav;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Nobr is a wrapper for the HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/nobr\n */\nconst Nobr = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n \n );\n};\n\n\nNobr.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Nobr;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Noscript is a wrapper for the \n );\n};\n\n\nNoscript.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Noscript;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * ObjectEl is a wrapper for the HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/object\n */\nconst ObjectEl = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n const cleanUrl = window.dash_clientside.clean_url;\n const data = React.useMemo(() => props.data && cleanUrl(props.data), [props.data]);\n \n if (data) {\n extraProps.data = data;\n }\n \n React.useEffect(() => {\n if (data && data !== props.data) {\n props.setProps({_dash_error: new Error(`Dangerous link detected: ${props.data}`)})\n }\n }, [props.data, data]);\n \n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n \n );\n};\n\n\nObjectEl.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Specifies the URL of the resource.\n */\n 'data': PropTypes.string,\n\n /**\n * Indicates the form that is the owner of the element.\n */\n 'form': PropTypes.string,\n\n /**\n * Specifies the height of elements listed here. For all other elements, use the CSS height property. Note: In some instances, such as
    , this is a legacy attribute, in which case the CSS height property should be used instead.\n */\n 'height': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Name of the element. For example used by the server to identify the fields in form submits.\n */\n 'name': PropTypes.string,\n\n /**\n * Defines the type of the element.\n */\n 'type': PropTypes.string,\n\n /**\n *\n */\n 'useMap': PropTypes.string,\n\n /**\n * For the elements listed here, this establishes the element's width. Note: For all other instances, such as
    , this is a legacy attribute, in which case the CSS width property should be used instead.\n */\n 'width': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default ObjectEl;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Ol is a wrapper for the
      HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ol\n */\nconst Ol = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n
    \n );\n};\n\n\nOl.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Indicates whether the list should be displayed in a descending order instead of an ascending order.\n */\n 'reversed': PropTypes.oneOfType([\n PropTypes.oneOf(['reversed', 'REVERSED']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the first number if other than 1.\n */\n 'start': PropTypes.string,\n\n /**\n * Defines the type of the element.\n */\n 'type': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Ol;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Optgroup is a wrapper for the HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/optgroup\n */\nconst Optgroup = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n \n );\n};\n\n\nOptgroup.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Indicates whether the user can interact with the element.\n */\n 'disabled': PropTypes.oneOfType([\n PropTypes.oneOf(['disabled', 'DISABLED']),\n PropTypes.bool\n ]),\n\n /**\n * Specifies a user-readable title of the element.\n */\n 'label': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Optgroup;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Option is a wrapper for the \n );\n};\n\n\nOption.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Indicates whether the user can interact with the element.\n */\n 'disabled': PropTypes.oneOfType([\n PropTypes.oneOf(['disabled', 'DISABLED']),\n PropTypes.bool\n ]),\n\n /**\n * Specifies a user-readable title of the element.\n */\n 'label': PropTypes.string,\n\n /**\n * Defines a value which will be selected on page load.\n */\n 'selected': PropTypes.oneOfType([\n PropTypes.oneOf(['selected', 'SELECTED']),\n PropTypes.bool\n ]),\n\n /**\n * Defines a default value which will be displayed in the element on page load.\n */\n 'value': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Option;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Output is a wrapper for the HTML5 element.\n *\n * CAUTION: is included for completeness, but its typical usage\n * requires the oninput attribute of the enclosing element, which\n * is not accessible to Dash.\n *\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/output\n */\nconst Output = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n \n );\n};\n\n\nOutput.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Describes elements which belongs to this one.\n */\n 'htmlFor': PropTypes.string,\n\n /**\n * Indicates the form that is the owner of the element.\n */\n 'form': PropTypes.string,\n\n /**\n * Name of the element. For example used by the server to identify the fields in form submits.\n */\n 'name': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Output;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * P is a wrapper for the

    HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/p\n */\nconst P = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n

    \n );\n};\n\n\nP.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default P;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Param is a wrapper for the HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/param\n */\nconst Param = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n \n );\n};\n\n\nParam.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Name of the element. For example used by the server to identify the fields in form submits.\n */\n 'name': PropTypes.string,\n\n /**\n * Defines a default value which will be displayed in the element on page load.\n */\n 'value': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Param;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Picture is a wrapper for the HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/picture\n */\nconst Picture = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n \n );\n};\n\n\nPicture.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Picture;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Plaintext is a wrapper for the HTML5 element.\n *\n * OBSOLETE: <plaintext> is included for completeness, but should be avoided\n * as browsers may remove it at any time, and its behavior when added\n * dynamically by Dash is not what it would be statically on page load.\n * Use <pre> or <code> instead.\n *\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/plaintext\n */\nconst Plaintext = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <plaintext\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </plaintext>\n );\n};\n\n\nPlaintext.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Plaintext;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Pre is a wrapper for the <pre> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/pre\n */\nconst Pre = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <pre\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </pre>\n );\n};\n\n\nPre.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Pre;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Progress is a wrapper for the <progress> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/progress\n */\nconst Progress = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <progress\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </progress>\n );\n};\n\n\nProgress.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Indicates the maximum value allowed.\n */\n 'max': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Defines a default value which will be displayed in the element on page load.\n */\n 'value': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Progress;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Q is a wrapper for the <q> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/q\n */\nconst Q = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <q\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </q>\n );\n};\n\n\nQ.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Contains a URI which points to the source of the quote or change.\n */\n 'cite': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Q;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Rb is a wrapper for the <rb> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/rb\n */\nconst Rb = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <rb\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </rb>\n );\n};\n\n\nRb.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Rb;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Rp is a wrapper for the <rp> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/rp\n */\nconst Rp = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <rp\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </rp>\n );\n};\n\n\nRp.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Rp;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Rt is a wrapper for the <rt> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/rt\n */\nconst Rt = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <rt\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </rt>\n );\n};\n\n\nRt.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Rt;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Rtc is a wrapper for the <rtc> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/rtc\n */\nconst Rtc = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <rtc\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </rtc>\n );\n};\n\n\nRtc.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Rtc;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Ruby is a wrapper for the <ruby> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ruby\n */\nconst Ruby = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <ruby\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </ruby>\n );\n};\n\n\nRuby.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Ruby;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * S is a wrapper for the <s> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/s\n */\nconst S = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <s\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </s>\n );\n};\n\n\nS.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default S;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Samp is a wrapper for the <samp> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/samp\n */\nconst Samp = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <samp\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </samp>\n );\n};\n\n\nSamp.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Samp;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Script is a wrapper for the <script> HTML5 element.\n *\n * CAUTION: <script> is included for completeness, but you cannot execute\n * JavaScript code by providing it to a <script> element. Use a clientside\n * callback for this purpose instead.\n *\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script\n */\nconst Script = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <script\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </script>\n );\n};\n\n\nScript.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Executes the script asynchronously.\n */\n 'async': PropTypes.oneOfType([\n PropTypes.oneOf(['async', 'ASYNC']),\n PropTypes.bool\n ]),\n\n /**\n * How the element handles cross-origin requests\n */\n 'crossOrigin': PropTypes.string,\n\n /**\n * Indicates that the script should be executed after the page has been parsed.\n */\n 'defer': PropTypes.oneOfType([\n PropTypes.oneOf(['defer', 'DEFER']),\n PropTypes.bool\n ]),\n\n /**\n * This attribute contains one or more hashes of the resource, and is used to ensure that the content of the resource is what the developer expects it to be, and has not been replaced with a malicious copy in a supply chain attack. See Subresource Integrity.\n */\n 'integrity': PropTypes.string,\n\n /**\n * Specifies which referrer is sent when fetching the resource.\n */\n 'referrerPolicy': PropTypes.string,\n\n /**\n * The URL of the embeddable content.\n */\n 'src': PropTypes.string,\n\n /**\n * Defines the type of the element.\n */\n 'type': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Script;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Section is a wrapper for the <section> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/section\n */\nconst Section = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <section\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </section>\n );\n};\n\n\nSection.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Section;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Select is a wrapper for the <select> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/select\n */\nconst Select = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <select\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </select>\n );\n};\n\n\nSelect.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * The element should be automatically focused after the page loaded.\n */\n 'autoFocus': PropTypes.oneOfType([\n PropTypes.oneOf(['autoFocus', 'autofocus', 'AUTOFOCUS']),\n PropTypes.bool\n ]),\n\n /**\n * Indicates whether controls in this form can by default have their values automatically completed by the browser.\n */\n 'autoComplete': PropTypes.string,\n\n /**\n * Indicates whether the user can interact with the element.\n */\n 'disabled': PropTypes.oneOfType([\n PropTypes.oneOf(['disabled', 'DISABLED']),\n PropTypes.bool\n ]),\n\n /**\n * Indicates the form that is the owner of the element.\n */\n 'form': PropTypes.string,\n\n /**\n * Indicates whether multiple values can be entered in an input of the type email or file.\n */\n 'multiple': PropTypes.oneOfType([\n PropTypes.oneOf(['multiple', 'MULTIPLE']),\n PropTypes.bool\n ]),\n\n /**\n * Name of the element. For example used by the server to identify the fields in form submits.\n */\n 'name': PropTypes.string,\n\n /**\n * Indicates whether this element is required to fill out or not.\n */\n 'required': PropTypes.oneOfType([\n PropTypes.oneOf(['required', 'REQUIRED']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the width of the element (in pixels). If the element's type attribute is text or password then it's the number of characters.\n */\n 'size': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Select;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Shadow is a wrapper for the <shadow> HTML5 element.\n *\n * DEPRECATED: <shadow> is included for completeness, but should be avoided\n * as it is not supported by all browsers and may be removed at any time from\n * those that do support it.\n *\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/shadow\n */\nconst Shadow = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <shadow\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </shadow>\n );\n};\n\n\nShadow.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Shadow;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Slot is a wrapper for the <slot> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/slot\n */\nconst Slot = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <slot\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </slot>\n );\n};\n\n\nSlot.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Slot;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Small is a wrapper for the <small> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/small\n */\nconst Small = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <small\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </small>\n );\n};\n\n\nSmall.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Small;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Source is a wrapper for the <source> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/source\n */\nconst Source = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <source\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </source>\n );\n};\n\n\nSource.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Specifies a hint of the media for which the linked resource was designed.\n */\n 'media': PropTypes.string,\n\n /**\n *\n */\n 'sizes': PropTypes.string,\n\n /**\n * The URL of the embeddable content.\n */\n 'src': PropTypes.string,\n\n /**\n * One or more responsive image candidates.\n */\n 'srcSet': PropTypes.string,\n\n /**\n * Defines the type of the element.\n */\n 'type': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Source;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Spacer is a wrapper for the <spacer> HTML5 element.\n *\n * OBSOLETE: <spacer> is included for completeness, but should be avoided\n * as it is not supported by any modern browsers.\n *\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/spacer\n */\nconst Spacer = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <spacer\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </spacer>\n );\n};\n\n\nSpacer.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Spacer;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Span is a wrapper for the <span> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/span\n */\nconst Span = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <span\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </span>\n );\n};\n\n\nSpan.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Span;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Strike is a wrapper for the <strike> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/strike\n */\nconst Strike = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <strike\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </strike>\n );\n};\n\n\nStrike.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Strike;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Strong is a wrapper for the <strong> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/strong\n */\nconst Strong = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <strong\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </strong>\n );\n};\n\n\nStrong.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Strong;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Sub is a wrapper for the <sub> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/sub\n */\nconst Sub = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <sub\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </sub>\n );\n};\n\n\nSub.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Sub;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Summary is a wrapper for the <summary> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/summary\n */\nconst Summary = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <summary\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </summary>\n );\n};\n\n\nSummary.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Summary;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Sup is a wrapper for the <sup> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/sup\n */\nconst Sup = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <sup\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </sup>\n );\n};\n\n\nSup.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Sup;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Table is a wrapper for the <table> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/table\n */\nconst Table = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <table\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </table>\n );\n};\n\n\nTable.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n *\n */\n 'summary': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Table;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Tbody is a wrapper for the <tbody> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/tbody\n */\nconst Tbody = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <tbody\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </tbody>\n );\n};\n\n\nTbody.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Tbody;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Td is a wrapper for the <td> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/td\n */\nconst Td = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <td\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </td>\n );\n};\n\n\nTd.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * The colspan attribute defines the number of columns a cell should span.\n */\n 'colSpan': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * IDs of the <th> elements which applies to this element.\n */\n 'headers': PropTypes.string,\n\n /**\n * Defines the number of rows a table cell should span over.\n */\n 'rowSpan': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Td;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Template is a wrapper for the <template> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/template\n */\nconst Template = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <template\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </template>\n );\n};\n\n\nTemplate.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Template;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Textarea is a wrapper for the <textarea> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/textarea\n */\nconst Textarea = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <textarea\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </textarea>\n );\n};\n\n\nTextarea.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * The element should be automatically focused after the page loaded.\n */\n 'autoFocus': PropTypes.oneOfType([\n PropTypes.oneOf(['autoFocus', 'autofocus', 'AUTOFOCUS']),\n PropTypes.bool\n ]),\n\n /**\n * Indicates whether controls in this form can by default have their values automatically completed by the browser.\n */\n 'autoComplete': PropTypes.string,\n\n /**\n * Defines the number of columns in a textarea.\n */\n 'cols': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Indicates whether the user can interact with the element.\n */\n 'disabled': PropTypes.oneOfType([\n PropTypes.oneOf(['disabled', 'DISABLED']),\n PropTypes.bool\n ]),\n\n /**\n * Indicates the form that is the owner of the element.\n */\n 'form': PropTypes.string,\n\n /**\n * Provides a hint as to the type of data that might be entered by the user while editing the element or its contents. The attribute can be used with form controls (such as the value of textarea elements), or in elements in an editing host (e.g., using contenteditable attribute).\n */\n 'inputMode': PropTypes.string,\n\n /**\n * Defines the maximum number of characters allowed in the element.\n */\n 'maxLength': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Defines the minimum number of characters allowed in the element.\n */\n 'minLength': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Name of the element. For example used by the server to identify the fields in form submits.\n */\n 'name': PropTypes.string,\n\n /**\n * Provides a hint to the user of what can be entered in the field.\n */\n 'placeholder': PropTypes.string,\n\n /**\n * Indicates whether the element can be edited.\n */\n 'readOnly': PropTypes.string,\n\n /**\n * Indicates whether this element is required to fill out or not.\n */\n 'required': PropTypes.oneOfType([\n PropTypes.oneOf(['required', 'REQUIRED']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the number of rows in a text area.\n */\n 'rows': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Indicates whether the text should be wrapped.\n */\n 'wrap': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Textarea;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Tfoot is a wrapper for the <tfoot> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/tfoot\n */\nconst Tfoot = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <tfoot\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </tfoot>\n );\n};\n\n\nTfoot.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Tfoot;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Th is a wrapper for the <th> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/th\n */\nconst Th = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <th\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </th>\n );\n};\n\n\nTh.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * The colspan attribute defines the number of columns a cell should span.\n */\n 'colSpan': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * IDs of the <th> elements which applies to this element.\n */\n 'headers': PropTypes.string,\n\n /**\n * Defines the number of rows a table cell should span over.\n */\n 'rowSpan': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Defines the cells that the header test (defined in the th element) relates to.\n */\n 'scope': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Th;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Thead is a wrapper for the <thead> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/thead\n */\nconst Thead = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <thead\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </thead>\n );\n};\n\n\nThead.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Thead;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Time is a wrapper for the <time> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/time\n */\nconst Time = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <time\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </time>\n );\n};\n\n\nTime.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Indicates the date and time associated with the element.\n */\n 'dateTime': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Time;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Title is a wrapper for the <title> HTML5 element.\n *\n * CAUTION: <title> is included for completeness, but is not expected to\n * do anything outside of <head>. Dash components are always created in the\n * <body>.\n *\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/title\n */\nconst Title = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <title\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </title>\n );\n};\n\n\nTitle.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Title;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Tr is a wrapper for the <tr> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/tr\n */\nconst Tr = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <tr\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </tr>\n );\n};\n\n\nTr.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Tr;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Track is a wrapper for the <track> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/track\n */\nconst Track = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <track\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </track>\n );\n};\n\n\nTrack.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Indicates that the track should be enabled unless the user's preferences indicate something different.\n */\n 'default': PropTypes.oneOfType([\n PropTypes.oneOf(['default', 'DEFAULT']),\n PropTypes.bool\n ]),\n\n /**\n * Specifies the kind of text track.\n */\n 'kind': PropTypes.string,\n\n /**\n * Specifies a user-readable title of the element.\n */\n 'label': PropTypes.string,\n\n /**\n * The URL of the embeddable content.\n */\n 'src': PropTypes.string,\n\n /**\n *\n */\n 'srcLang': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Track;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * U is a wrapper for the <u> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/u\n */\nconst U = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <u\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </u>\n );\n};\n\n\nU.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default U;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Ul is a wrapper for the <ul> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ul\n */\nconst Ul = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <ul\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </ul>\n );\n};\n\n\nUl.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Ul;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Var is a wrapper for the <var> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/var\n */\nconst Var = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <var\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </var>\n );\n};\n\n\nVar.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Var;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Video is a wrapper for the <video> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/video\n */\nconst Video = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <video\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </video>\n );\n};\n\n\nVideo.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * The audio or video should play as soon as possible.\n */\n 'autoPlay': PropTypes.oneOfType([\n PropTypes.oneOf(['autoPlay', 'autoplay', 'AUTOPLAY']),\n PropTypes.bool\n ]),\n\n /**\n * Indicates whether the browser should show playback controls to the user.\n */\n 'controls': PropTypes.oneOfType([\n PropTypes.oneOf(['controls', 'CONTROLS']),\n PropTypes.bool\n ]),\n\n /**\n * How the element handles cross-origin requests\n */\n 'crossOrigin': PropTypes.string,\n\n /**\n * Specifies the height of elements listed here. For all other elements, use the CSS height property. Note: In some instances, such as <div>, this is a legacy attribute, in which case the CSS height property should be used instead.\n */\n 'height': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Indicates whether the media should start playing from the start when it's finished.\n */\n 'loop': PropTypes.oneOfType([\n PropTypes.oneOf(['loop', 'LOOP']),\n PropTypes.bool\n ]),\n\n /**\n * Indicates whether the audio will be initially silenced on page load.\n */\n 'muted': PropTypes.oneOfType([\n PropTypes.oneOf(['muted', 'MUTED']),\n PropTypes.bool\n ]),\n\n /**\n * A Boolean attribute indicating that the video is to be played \"inline\"; that is, within the element's playback area. Note that the absence of this attribute does not imply that the video will always be played in fullscreen.\n */\n 'playsInline': PropTypes.oneOfType([\n PropTypes.oneOf(['playsInline', 'playsinline', 'PLAYSINLINE']),\n PropTypes.bool\n ]),\n\n /**\n * A URL indicating a poster frame to show until the user plays or seeks.\n */\n 'poster': PropTypes.string,\n\n /**\n * Indicates whether the whole resource, parts of it or nothing should be preloaded.\n */\n 'preload': PropTypes.string,\n\n /**\n * The URL of the embeddable content.\n */\n 'src': PropTypes.string,\n\n /**\n * For the elements listed here, this establishes the element's width. Note: For all other instances, such as <div>, this is a legacy attribute, in which case the CSS width property should be used instead.\n */\n 'width': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Video;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Wbr is a wrapper for the <wbr> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/wbr\n */\nconst Wbr = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <wbr\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </wbr>\n );\n};\n\n\nWbr.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Wbr;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Xmp is a wrapper for the <xmp> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/xmp\n */\nconst Xmp = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <xmp\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </xmp>\n );\n};\n\n\nXmp.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Xmp;\n"],"names":["__webpack_require__","module","getter","__esModule","d","a","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","external_React_namespaceObject","window","external_PropTypes_namespaceObject","_isPlaceholder","_curry1","fn","f1","arguments","length","apply","this","_curry2","f2","b","_b","_a","es_omit","names","result","index","idx","len","A","_ref","_ref$n_clicks","n_clicks","props","n_clicks_timestamp","_objectWithoutProperties","_excluded","extraProps","dash_component_api","useDashContext","useLoading","cleanUrl","dash_clientside","clean_url","href","React","setProps","_dash_error","Error","concat","isStatic","disable_n_clicks","id","_extends","onClick","Date","now","omit","children","propTypes","PropTypes","download","hrefLang","media","referrerPolicy","rel","shape","target","accessKey","className","contentEditable","dir","draggable","hidden","lang","role","spellCheck","style","tabIndex","title","A_react","Abbr","Abbr_react","Acronym","Acronym_react","Address","Address_react","Area","alt","coords","Area_react","Article","Article_react","Aside","Aside_react","Audio","autoPlay","controls","crossOrigin","loop","muted","preload","src","Audio_react","B","B_react","Base","Base_react","Basefont","Basefont_react","Bdi","Bdi_react","Bdo","Bdo_react","Big","Big_react","Blink","Blink_react","Blockquote","cite","Blockquote_react","Br","Br_react","Button","formAction","autoFocus","disabled","form","formEncType","formMethod","formNoValidate","formTarget","name","type","Button_react","Canvas","height","width","Canvas_react","Caption","Caption_react","Center","Center_react","Cite","Cite_react","Code","Code_react","Col","span","Col_react","Colgroup","Colgroup_react","Content","Content_react","Data","Data_react","Datalist","Datalist_react","Dd","Dd_react","Del","dateTime","Del_react","Details","open","Details_react","Dfn","Dfn_react","Dialog","Dialog_react","Div","Div_react","Dl","Dl_react","Dt","Dt_react","Em","Em_react","Embed","Embed_react","Fieldset","Fieldset_react","Figcaption","Figcaption_react","Figure","Figure_react","Font","Font_react","Footer","Footer_react","Form","action","accept","acceptCharset","autoComplete","encType","method","noValidate","Form_react","Frame","Frame_react","Frameset","Frameset_react","H1","H1_react","H2","H2_react","H3","H3_react","H4","H4_react","H5","H5_react","H6","H6_react","Header","Header_react","Hgroup","Hgroup_react","Hr","Hr_react","I","I_react","Iframe","allow","sandbox","srcDoc","Iframe_react","Img","sizes","srcSet","useMap","Img_react","Ins","Ins_react","Kbd","Kbd_react","Keygen","Keygen_react","Label","htmlFor","Label_react","Legend","Legend_react","Li","Li_react","Link","integrity","Link_react","Main","Main_react","MapEl","MapEl_react","Mark","Mark_react","Marquee","Marquee_react","Meta","charSet","content","httpEquiv","Meta_react","Meter","high","low","max","min","optimum","Meter_react","Nav","Nav_react","Nobr","Nobr_react","Noscript","Noscript_react","ObjectEl","data","ObjectEl_react","Ol","reversed","start","Ol_react","Optgroup","label","Optgroup_react","Option","selected","Option_react","Output","Output_react","P","P_react","Param","Param_react","Picture","Picture_react","Plaintext","Plaintext_react","Pre","Pre_react","Progress","Progress_react","Q","Q_react","Rb","Rb_react","Rp","Rp_react","Rt","Rt_react","Rtc","Rtc_react","Ruby","Ruby_react","S","S_react","Samp","Samp_react","Script","async","defer","Script_react","Section","Section_react","Select","multiple","required","size","Select_react","Shadow","Shadow_react","Slot","Slot_react","Small","Small_react","Source","Source_react","Spacer","Spacer_react","Span","Span_react","Strike","Strike_react","Strong","Strong_react","Sub","Sub_react","Summary","Summary_react","Sup","Sup_react","Table","summary","Table_react","Tbody","Tbody_react","Td","colSpan","headers","rowSpan","Td_react","Template","Template_react","Textarea","cols","inputMode","maxLength","minLength","placeholder","readOnly","rows","wrap","Textarea_react","Tfoot","Tfoot_react","Th","scope","Th_react","Thead","Thead_react","Time","Time_react","Title","Title_react","Tr","Tr_react","Track","default","kind","srcLang","Track_react","U","U_react","Ul","Ul_react","Var","Var_react","Video","playsInline","poster","Video_react","Wbr","Wbr_react","Xmp","Xmp_react"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"dash_html_components.min.js","mappings":"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","sources":["webpack://dash_html_components/webpack/bootstrap","webpack://dash_html_components/webpack/runtime/compat get default export","webpack://dash_html_components/webpack/runtime/define property getters","webpack://dash_html_components/webpack/runtime/hasOwnProperty shorthand","webpack://dash_html_components/webpack/runtime/make namespace object","webpack://dash_html_components/external window \"React\"","webpack://dash_html_components/external window \"PropTypes\"","webpack://dash_html_components/./node_modules/ramda/es/internal/_isPlaceholder.js","webpack://dash_html_components/./node_modules/ramda/es/internal/_curry1.js","webpack://dash_html_components/./node_modules/ramda/es/internal/_curry2.js","webpack://dash_html_components/./node_modules/ramda/es/omit.js","webpack://dash_html_components/./src/components/A.react.js","webpack://dash_html_components/./src/components/Abbr.react.js","webpack://dash_html_components/./src/components/Acronym.react.js","webpack://dash_html_components/./src/components/Address.react.js","webpack://dash_html_components/./src/components/Area.react.js","webpack://dash_html_components/./src/components/Article.react.js","webpack://dash_html_components/./src/components/Aside.react.js","webpack://dash_html_components/./src/components/Audio.react.js","webpack://dash_html_components/./src/components/B.react.js","webpack://dash_html_components/./src/components/Base.react.js","webpack://dash_html_components/./src/components/Basefont.react.js","webpack://dash_html_components/./src/components/Bdi.react.js","webpack://dash_html_components/./src/components/Bdo.react.js","webpack://dash_html_components/./src/components/Big.react.js","webpack://dash_html_components/./src/components/Blink.react.js","webpack://dash_html_components/./src/components/Blockquote.react.js","webpack://dash_html_components/./src/components/Br.react.js","webpack://dash_html_components/./src/components/Button.react.js","webpack://dash_html_components/./src/components/Canvas.react.js","webpack://dash_html_components/./src/components/Caption.react.js","webpack://dash_html_components/./src/components/Center.react.js","webpack://dash_html_components/./src/components/Cite.react.js","webpack://dash_html_components/./src/components/Code.react.js","webpack://dash_html_components/./src/components/Col.react.js","webpack://dash_html_components/./src/components/Colgroup.react.js","webpack://dash_html_components/./src/components/Content.react.js","webpack://dash_html_components/./src/components/Data.react.js","webpack://dash_html_components/./src/components/Datalist.react.js","webpack://dash_html_components/./src/components/Dd.react.js","webpack://dash_html_components/./src/components/Del.react.js","webpack://dash_html_components/./src/components/Details.react.js","webpack://dash_html_components/./src/components/Dfn.react.js","webpack://dash_html_components/./src/components/Dialog.react.js","webpack://dash_html_components/./src/components/Div.react.js","webpack://dash_html_components/./src/components/Dl.react.js","webpack://dash_html_components/./src/components/Dt.react.js","webpack://dash_html_components/./src/components/Em.react.js","webpack://dash_html_components/./src/components/Embed.react.js","webpack://dash_html_components/./src/components/Fieldset.react.js","webpack://dash_html_components/./src/components/Figcaption.react.js","webpack://dash_html_components/./src/components/Figure.react.js","webpack://dash_html_components/./src/components/Font.react.js","webpack://dash_html_components/./src/components/Footer.react.js","webpack://dash_html_components/./src/components/Form.react.js","webpack://dash_html_components/./src/components/Frame.react.js","webpack://dash_html_components/./src/components/Frameset.react.js","webpack://dash_html_components/./src/components/H1.react.js","webpack://dash_html_components/./src/components/H2.react.js","webpack://dash_html_components/./src/components/H3.react.js","webpack://dash_html_components/./src/components/H4.react.js","webpack://dash_html_components/./src/components/H5.react.js","webpack://dash_html_components/./src/components/H6.react.js","webpack://dash_html_components/./src/components/Header.react.js","webpack://dash_html_components/./src/components/Hgroup.react.js","webpack://dash_html_components/./src/components/Hr.react.js","webpack://dash_html_components/./src/components/I.react.js","webpack://dash_html_components/./src/components/Iframe.react.js","webpack://dash_html_components/./src/components/Img.react.js","webpack://dash_html_components/./src/components/Ins.react.js","webpack://dash_html_components/./src/components/Kbd.react.js","webpack://dash_html_components/./src/components/Keygen.react.js","webpack://dash_html_components/./src/components/Label.react.js","webpack://dash_html_components/./src/components/Legend.react.js","webpack://dash_html_components/./src/components/Li.react.js","webpack://dash_html_components/./src/components/Link.react.js","webpack://dash_html_components/./src/components/Main.react.js","webpack://dash_html_components/./src/components/MapEl.react.js","webpack://dash_html_components/./src/components/Mark.react.js","webpack://dash_html_components/./src/components/Marquee.react.js","webpack://dash_html_components/./src/components/Meta.react.js","webpack://dash_html_components/./src/components/Meter.react.js","webpack://dash_html_components/./src/components/Nav.react.js","webpack://dash_html_components/./src/components/Nobr.react.js","webpack://dash_html_components/./src/components/Noscript.react.js","webpack://dash_html_components/./src/components/ObjectEl.react.js","webpack://dash_html_components/./src/components/Ol.react.js","webpack://dash_html_components/./src/components/Optgroup.react.js","webpack://dash_html_components/./src/components/Option.react.js","webpack://dash_html_components/./src/components/Output.react.js","webpack://dash_html_components/./src/components/P.react.js","webpack://dash_html_components/./src/components/Param.react.js","webpack://dash_html_components/./src/components/Picture.react.js","webpack://dash_html_components/./src/components/Plaintext.react.js","webpack://dash_html_components/./src/components/Pre.react.js","webpack://dash_html_components/./src/components/Progress.react.js","webpack://dash_html_components/./src/components/Q.react.js","webpack://dash_html_components/./src/components/Rb.react.js","webpack://dash_html_components/./src/components/Rp.react.js","webpack://dash_html_components/./src/components/Rt.react.js","webpack://dash_html_components/./src/components/Rtc.react.js","webpack://dash_html_components/./src/components/Ruby.react.js","webpack://dash_html_components/./src/components/S.react.js","webpack://dash_html_components/./src/components/Samp.react.js","webpack://dash_html_components/./src/components/Script.react.js","webpack://dash_html_components/./src/components/Section.react.js","webpack://dash_html_components/./src/components/Select.react.js","webpack://dash_html_components/./src/components/Shadow.react.js","webpack://dash_html_components/./src/components/Slot.react.js","webpack://dash_html_components/./src/components/Small.react.js","webpack://dash_html_components/./src/components/Source.react.js","webpack://dash_html_components/./src/components/Spacer.react.js","webpack://dash_html_components/./src/components/Span.react.js","webpack://dash_html_components/./src/components/Strike.react.js","webpack://dash_html_components/./src/components/Strong.react.js","webpack://dash_html_components/./src/components/Sub.react.js","webpack://dash_html_components/./src/components/Summary.react.js","webpack://dash_html_components/./src/components/Sup.react.js","webpack://dash_html_components/./src/components/Table.react.js","webpack://dash_html_components/./src/components/Tbody.react.js","webpack://dash_html_components/./src/components/Td.react.js","webpack://dash_html_components/./src/components/Template.react.js","webpack://dash_html_components/./src/components/Textarea.react.js","webpack://dash_html_components/./src/components/Tfoot.react.js","webpack://dash_html_components/./src/components/Th.react.js","webpack://dash_html_components/./src/components/Thead.react.js","webpack://dash_html_components/./src/components/Time.react.js","webpack://dash_html_components/./src/components/Title.react.js","webpack://dash_html_components/./src/components/Tr.react.js","webpack://dash_html_components/./src/components/Track.react.js","webpack://dash_html_components/./src/components/U.react.js","webpack://dash_html_components/./src/components/Ul.react.js","webpack://dash_html_components/./src/components/Var.react.js","webpack://dash_html_components/./src/components/Video.react.js","webpack://dash_html_components/./src/components/Wbr.react.js","webpack://dash_html_components/./src/components/Xmp.react.js"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter/value functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); };","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","var __WEBPACK_NAMESPACE_OBJECT__ = window[\"React\"];","var __WEBPACK_NAMESPACE_OBJECT__ = window[\"PropTypes\"];","export default function _isPlaceholder(a) {\n return a != null && typeof a === 'object' && a['@@functional/placeholder'] === true;\n}","import _isPlaceholder from \"./_isPlaceholder.js\";\n\n/**\n * Optimized internal one-arity curry function.\n *\n * @private\n * @category Function\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */\nexport default function _curry1(fn) {\n return function f1(a) {\n if (arguments.length === 0 || _isPlaceholder(a)) {\n return f1;\n } else {\n return fn.apply(this, arguments);\n }\n };\n}","import _curry1 from \"./_curry1.js\";\nimport _isPlaceholder from \"./_isPlaceholder.js\";\n\n/**\n * Optimized internal two-arity curry function.\n *\n * @private\n * @category Function\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */\nexport default function _curry2(fn) {\n return function f2(a, b) {\n switch (arguments.length) {\n case 0:\n return f2;\n case 1:\n return _isPlaceholder(a) ? f2 : _curry1(function (_b) {\n return fn(a, _b);\n });\n default:\n return _isPlaceholder(a) && _isPlaceholder(b) ? f2 : _isPlaceholder(a) ? _curry1(function (_a) {\n return fn(_a, b);\n }) : _isPlaceholder(b) ? _curry1(function (_b) {\n return fn(a, _b);\n }) : fn(a, b);\n }\n };\n}","import _curry2 from \"./internal/_curry2.js\";\n\n/**\n * Returns a partial copy of an object omitting the keys specified.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category Object\n * @sig [String] -> {String: *} -> {String: *}\n * @param {Array} names an array of String property names to omit from the new object\n * @param {Object} obj The object to copy from\n * @return {Object} A new object with properties from `names` not on it.\n * @see R.pick\n * @example\n *\n * R.omit(['a', 'd'], {a: 1, b: 2, c: 3, d: 4}); //=> {b: 2, c: 3}\n */\nvar omit = /*#__PURE__*/_curry2(function omit(names, obj) {\n var result = {};\n var index = {};\n var idx = 0;\n var len = names.length;\n while (idx < len) {\n index[names[idx]] = 1;\n idx += 1;\n }\n for (var prop in obj) {\n if (!index.hasOwnProperty(prop)) {\n result[prop] = obj[prop];\n }\n }\n return result;\n});\nexport default omit;","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * A is a wrapper for the <a> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a\n */\nconst A = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n const cleanUrl = window.dash_clientside.clean_url;\n const href = React.useMemo(() => props.href && cleanUrl(props.href), [props.href]);\n \n if (href) {\n extraProps.href = href;\n }\n \n React.useEffect(() => {\n if (href && href !== props.href) {\n props.setProps({_dash_error: new Error(`Dangerous link detected: ${props.href}`)})\n }\n }, [props.href, href]);\n \n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <a\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </a>\n );\n};\n\n\nA.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Indicates that the hyperlink is to be used for downloading a resource.\n */\n 'download': PropTypes.string,\n\n /**\n * The URL of a linked resource.\n */\n 'href': PropTypes.string,\n\n /**\n * Specifies the language of the linked resource.\n */\n 'hrefLang': PropTypes.string,\n\n /**\n * Specifies a hint of the media for which the linked resource was designed.\n */\n 'media': PropTypes.string,\n\n /**\n * Specifies which referrer is sent when fetching the resource.\n */\n 'referrerPolicy': PropTypes.string,\n\n /**\n * Specifies the relationship of the target object to the link object.\n */\n 'rel': PropTypes.string,\n\n /**\n *\n */\n 'shape': PropTypes.string,\n\n /**\n * Specifies where to open the linked document (in the case of an <a> element) or where to display the response received (in the case of a <form> element)\n */\n 'target': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default A;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Abbr is a wrapper for the <abbr> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/abbr\n */\nconst Abbr = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <abbr\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </abbr>\n );\n};\n\n\nAbbr.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Abbr;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Acronym is a wrapper for the <acronym> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/acronym\n */\nconst Acronym = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <acronym\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </acronym>\n );\n};\n\n\nAcronym.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Acronym;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Address is a wrapper for the <address> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/address\n */\nconst Address = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <address\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </address>\n );\n};\n\n\nAddress.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Address;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Area is a wrapper for the <area> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/area\n */\nconst Area = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n const cleanUrl = window.dash_clientside.clean_url;\n const href = React.useMemo(() => props.href && cleanUrl(props.href), [props.href]);\n \n if (href) {\n extraProps.href = href;\n }\n \n React.useEffect(() => {\n if (href && href !== props.href) {\n props.setProps({_dash_error: new Error(`Dangerous link detected: ${props.href}`)})\n }\n }, [props.href, href]);\n \n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <area\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </area>\n );\n};\n\n\nArea.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Alternative text in case an image can't be displayed.\n */\n 'alt': PropTypes.string,\n\n /**\n * A set of values specifying the coordinates of the hot-spot region.\n */\n 'coords': PropTypes.string,\n\n /**\n * Indicates that the hyperlink is to be used for downloading a resource.\n */\n 'download': PropTypes.string,\n\n /**\n * The URL of a linked resource.\n */\n 'href': PropTypes.string,\n\n /**\n * Specifies a hint of the media for which the linked resource was designed.\n */\n 'media': PropTypes.string,\n\n /**\n * Specifies which referrer is sent when fetching the resource.\n */\n 'referrerPolicy': PropTypes.string,\n\n /**\n * Specifies the relationship of the target object to the link object.\n */\n 'rel': PropTypes.string,\n\n /**\n *\n */\n 'shape': PropTypes.string,\n\n /**\n * Specifies where to open the linked document (in the case of an <a> element) or where to display the response received (in the case of a <form> element)\n */\n 'target': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Area;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Article is a wrapper for the <article> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/article\n */\nconst Article = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <article\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </article>\n );\n};\n\n\nArticle.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Article;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Aside is a wrapper for the <aside> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/aside\n */\nconst Aside = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <aside\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </aside>\n );\n};\n\n\nAside.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Aside;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Audio is a wrapper for the <audio> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/audio\n */\nconst Audio = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <audio\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </audio>\n );\n};\n\n\nAudio.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * The audio or video should play as soon as possible.\n */\n 'autoPlay': PropTypes.oneOfType([\n PropTypes.oneOf(['autoPlay', 'autoplay', 'AUTOPLAY']),\n PropTypes.bool\n ]),\n\n /**\n * Indicates whether the browser should show playback controls to the user.\n */\n 'controls': PropTypes.oneOfType([\n PropTypes.oneOf(['controls', 'CONTROLS']),\n PropTypes.bool\n ]),\n\n /**\n * How the element handles cross-origin requests\n */\n 'crossOrigin': PropTypes.string,\n\n /**\n * Indicates whether the media should start playing from the start when it's finished.\n */\n 'loop': PropTypes.oneOfType([\n PropTypes.oneOf(['loop', 'LOOP']),\n PropTypes.bool\n ]),\n\n /**\n * Indicates whether the audio will be initially silenced on page load.\n */\n 'muted': PropTypes.oneOfType([\n PropTypes.oneOf(['muted', 'MUTED']),\n PropTypes.bool\n ]),\n\n /**\n * Indicates whether the whole resource, parts of it or nothing should be preloaded.\n */\n 'preload': PropTypes.string,\n\n /**\n * The URL of the embeddable content.\n */\n 'src': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Audio;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * B is a wrapper for the <b> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/b\n */\nconst B = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <b\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </b>\n );\n};\n\n\nB.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default B;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Base is a wrapper for the <base> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base\n */\nconst Base = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n const cleanUrl = window.dash_clientside.clean_url;\n const href = React.useMemo(() => props.href && cleanUrl(props.href), [props.href]);\n \n if (href) {\n extraProps.href = href;\n }\n \n React.useEffect(() => {\n if (href && href !== props.href) {\n props.setProps({_dash_error: new Error(`Dangerous link detected: ${props.href}`)})\n }\n }, [props.href, href]);\n \n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <base\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </base>\n );\n};\n\n\nBase.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * The URL of a linked resource.\n */\n 'href': PropTypes.string,\n\n /**\n * Specifies where to open the linked document (in the case of an <a> element) or where to display the response received (in the case of a <form> element)\n */\n 'target': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Base;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Basefont is a wrapper for the <basefont> HTML5 element.\n *\n * OBSOLETE: <basefont> is included for completeness, but should be avoided\n * as it is only supported by Internet Explorer.\n *\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/basefont\n */\nconst Basefont = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <basefont\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </basefont>\n );\n};\n\n\nBasefont.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Basefont;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Bdi is a wrapper for the <bdi> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/bdi\n */\nconst Bdi = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <bdi\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </bdi>\n );\n};\n\n\nBdi.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Bdi;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Bdo is a wrapper for the <bdo> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/bdo\n */\nconst Bdo = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <bdo\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </bdo>\n );\n};\n\n\nBdo.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Bdo;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Big is a wrapper for the <big> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/big\n */\nconst Big = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <big\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </big>\n );\n};\n\n\nBig.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Big;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Blink is a wrapper for the <blink> HTML5 element.\n *\n * OBSOLETE: <blink> is included for completeness, but should be avoided\n * as it is not supported by any modern browsers.\n *\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/blink\n */\nconst Blink = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <blink\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </blink>\n );\n};\n\n\nBlink.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Blink;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Blockquote is a wrapper for the <blockquote> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/blockquote\n */\nconst Blockquote = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <blockquote\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </blockquote>\n );\n};\n\n\nBlockquote.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Contains a URI which points to the source of the quote or change.\n */\n 'cite': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Blockquote;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Br is a wrapper for the <br> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/br\n */\nconst Br = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <br\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </br>\n );\n};\n\n\nBr.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Br;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Button is a wrapper for the <button> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button\n */\nconst Button = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n const cleanUrl = window.dash_clientside.clean_url;\n const formAction = React.useMemo(() => props.formAction && cleanUrl(props.formAction), [props.formAction]);\n \n if (formAction) {\n extraProps.formAction = formAction;\n }\n \n React.useEffect(() => {\n if (formAction && formAction !== props.formAction) {\n props.setProps({_dash_error: new Error(`Dangerous link detected: ${props.formAction}`)})\n }\n }, [props.formAction, formAction]);\n \n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <button\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </button>\n );\n};\n\n\nButton.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * The element should be automatically focused after the page loaded.\n */\n 'autoFocus': PropTypes.oneOfType([\n PropTypes.oneOf(['autoFocus', 'autofocus', 'AUTOFOCUS']),\n PropTypes.bool\n ]),\n\n /**\n * Indicates whether the user can interact with the element.\n */\n 'disabled': PropTypes.oneOfType([\n PropTypes.oneOf(['disabled', 'DISABLED']),\n PropTypes.bool\n ]),\n\n /**\n * Indicates the form that is the owner of the element.\n */\n 'form': PropTypes.string,\n\n /**\n * Indicates the action of the element, overriding the action defined in the <form>.\n */\n 'formAction': PropTypes.string,\n\n /**\n * If the button/input is a submit button (e.g., type=\"submit\"), this attribute sets the encoding type to use during form submission. If this attribute is specified, it overrides the enctype attribute of the button's form owner.\n */\n 'formEncType': PropTypes.string,\n\n /**\n * If the button/input is a submit button (e.g., type=\"submit\"), this attribute sets the submission method to use during form submission (GET, POST, etc.). If this attribute is specified, it overrides the method attribute of the button's form owner.\n */\n 'formMethod': PropTypes.string,\n\n /**\n * If the button/input is a submit button (e.g., type=\"submit\"), this boolean attribute specifies that the form is not to be validated when it is submitted. If this attribute is specified, it overrides the novalidate attribute of the button's form owner.\n */\n 'formNoValidate': PropTypes.oneOfType([\n PropTypes.oneOf(['formNoValidate', 'formnovalidate', 'FORMNOVALIDATE']),\n PropTypes.bool\n ]),\n\n /**\n * If the button/input is a submit button (e.g., type=\"submit\"), this attribute specifies the browsing context (for example, tab, window, or inline frame) in which to display the response that is received after submitting the form. If this attribute is specified, it overrides the target attribute of the button's form owner.\n */\n 'formTarget': PropTypes.string,\n\n /**\n * Name of the element. For example used by the server to identify the fields in form submits.\n */\n 'name': PropTypes.string,\n\n /**\n * Defines the type of the element.\n */\n 'type': PropTypes.string,\n\n /**\n * Defines a default value which will be displayed in the element on page load.\n */\n 'value': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Button;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Canvas is a wrapper for the <canvas> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/canvas\n */\nconst Canvas = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <canvas\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </canvas>\n );\n};\n\n\nCanvas.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Specifies the height of elements listed here. For all other elements, use the CSS height property. Note: In some instances, such as <div>, this is a legacy attribute, in which case the CSS height property should be used instead.\n */\n 'height': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * For the elements listed here, this establishes the element's width. Note: For all other instances, such as <div>, this is a legacy attribute, in which case the CSS width property should be used instead.\n */\n 'width': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Canvas;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Caption is a wrapper for the <caption> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/caption\n */\nconst Caption = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <caption\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </caption>\n );\n};\n\n\nCaption.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Caption;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Center is a wrapper for the <center> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/center\n */\nconst Center = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <center\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </center>\n );\n};\n\n\nCenter.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Center;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Cite is a wrapper for the <cite> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/cite\n */\nconst Cite = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <cite\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </cite>\n );\n};\n\n\nCite.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Cite;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Code is a wrapper for the <code> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/code\n */\nconst Code = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <code\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </code>\n );\n};\n\n\nCode.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Code;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Col is a wrapper for the <col> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/col\n */\nconst Col = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <col\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </col>\n );\n};\n\n\nCol.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n *\n */\n 'span': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Col;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Colgroup is a wrapper for the <colgroup> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/colgroup\n */\nconst Colgroup = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <colgroup\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </colgroup>\n );\n};\n\n\nColgroup.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n *\n */\n 'span': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Colgroup;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Content is a wrapper for the <content> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/content\n */\nconst Content = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <content\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </content>\n );\n};\n\n\nContent.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Content;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Data is a wrapper for the <data> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/data\n */\nconst Data = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <data\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </data>\n );\n};\n\n\nData.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Defines a default value which will be displayed in the element on page load.\n */\n 'value': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Data;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Datalist is a wrapper for the <datalist> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/datalist\n */\nconst Datalist = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <datalist\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </datalist>\n );\n};\n\n\nDatalist.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Datalist;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Dd is a wrapper for the <dd> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dd\n */\nconst Dd = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <dd\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </dd>\n );\n};\n\n\nDd.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Dd;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Del is a wrapper for the <del> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/del\n */\nconst Del = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <del\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </del>\n );\n};\n\n\nDel.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Contains a URI which points to the source of the quote or change.\n */\n 'cite': PropTypes.string,\n\n /**\n * Indicates the date and time associated with the element.\n */\n 'dateTime': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Del;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Details is a wrapper for the <details> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/details\n */\nconst Details = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <details\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </details>\n );\n};\n\n\nDetails.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Indicates whether the contents are currently visible (in the case of a <details> element) or whether the dialog is active and can be interacted with (in the case of a <dialog> element).\n */\n 'open': PropTypes.oneOfType([\n PropTypes.oneOf(['open', 'OPEN']),\n PropTypes.bool\n ]),\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Details;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Dfn is a wrapper for the <dfn> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dfn\n */\nconst Dfn = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <dfn\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </dfn>\n );\n};\n\n\nDfn.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Dfn;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Dialog is a wrapper for the <dialog> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dialog\n */\nconst Dialog = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <dialog\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </dialog>\n );\n};\n\n\nDialog.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Indicates whether the contents are currently visible (in the case of a <details> element) or whether the dialog is active and can be interacted with (in the case of a <dialog> element).\n */\n 'open': PropTypes.oneOfType([\n PropTypes.oneOf(['open', 'OPEN']),\n PropTypes.bool\n ]),\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Dialog;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Div is a wrapper for the <div> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/div\n */\nconst Div = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <div\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </div>\n );\n};\n\n\nDiv.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Div;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Dl is a wrapper for the <dl> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dl\n */\nconst Dl = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <dl\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </dl>\n );\n};\n\n\nDl.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Dl;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Dt is a wrapper for the <dt> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dt\n */\nconst Dt = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <dt\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </dt>\n );\n};\n\n\nDt.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Dt;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Em is a wrapper for the <em> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/em\n */\nconst Em = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <em\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </em>\n );\n};\n\n\nEm.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Em;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Embed is a wrapper for the <embed> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/embed\n */\nconst Embed = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n const cleanUrl = window.dash_clientside.clean_url;\n const src = React.useMemo(() => props.src && cleanUrl(props.src), [props.src]);\n \n if (src) {\n extraProps.src = src;\n }\n \n React.useEffect(() => {\n if (src && src !== props.src) {\n props.setProps({_dash_error: new Error(`Dangerous link detected: ${props.src}`)})\n }\n }, [props.src, src]);\n \n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <embed\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </embed>\n );\n};\n\n\nEmbed.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Specifies the height of elements listed here. For all other elements, use the CSS height property. Note: In some instances, such as <div>, this is a legacy attribute, in which case the CSS height property should be used instead.\n */\n 'height': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * The URL of the embeddable content.\n */\n 'src': PropTypes.string,\n\n /**\n * Defines the type of the element.\n */\n 'type': PropTypes.string,\n\n /**\n * For the elements listed here, this establishes the element's width. Note: For all other instances, such as <div>, this is a legacy attribute, in which case the CSS width property should be used instead.\n */\n 'width': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Embed;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Fieldset is a wrapper for the <fieldset> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/fieldset\n */\nconst Fieldset = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <fieldset\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </fieldset>\n );\n};\n\n\nFieldset.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Indicates whether the user can interact with the element.\n */\n 'disabled': PropTypes.oneOfType([\n PropTypes.oneOf(['disabled', 'DISABLED']),\n PropTypes.bool\n ]),\n\n /**\n * Indicates the form that is the owner of the element.\n */\n 'form': PropTypes.string,\n\n /**\n * Name of the element. For example used by the server to identify the fields in form submits.\n */\n 'name': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Fieldset;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Figcaption is a wrapper for the <figcaption> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/figcaption\n */\nconst Figcaption = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <figcaption\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </figcaption>\n );\n};\n\n\nFigcaption.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Figcaption;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Figure is a wrapper for the <figure> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/figure\n */\nconst Figure = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <figure\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </figure>\n );\n};\n\n\nFigure.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Figure;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Font is a wrapper for the <font> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/font\n */\nconst Font = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <font\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </font>\n );\n};\n\n\nFont.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Font;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Footer is a wrapper for the <footer> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/footer\n */\nconst Footer = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <footer\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </footer>\n );\n};\n\n\nFooter.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Footer;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Form is a wrapper for the <form> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form\n */\nconst Form = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n const cleanUrl = window.dash_clientside.clean_url;\n const action = React.useMemo(() => props.action && cleanUrl(props.action), [props.action]);\n \n if (action) {\n extraProps.action = action;\n }\n \n React.useEffect(() => {\n if (action && action !== props.action) {\n props.setProps({_dash_error: new Error(`Dangerous link detected: ${props.action}`)})\n }\n }, [props.action, action]);\n \n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <form\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </form>\n );\n};\n\n\nForm.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * List of types the server accepts, typically a file type.\n */\n 'accept': PropTypes.string,\n\n /**\n * The character set, which if provided must be \"UTF-8\".\n */\n 'acceptCharset': PropTypes.string,\n\n /**\n * The URI of a program that processes the information submitted via the form.\n */\n 'action': PropTypes.string,\n\n /**\n * Indicates whether controls in this form can by default have their values automatically completed by the browser.\n */\n 'autoComplete': PropTypes.string,\n\n /**\n * Defines the content type of the form data when the method is POST.\n */\n 'encType': PropTypes.string,\n\n /**\n * Defines which HTTP method to use when submitting the form. Can be GET (default) or POST.\n */\n 'method': PropTypes.string,\n\n /**\n * Name of the element. For example used by the server to identify the fields in form submits.\n */\n 'name': PropTypes.string,\n\n /**\n * This attribute indicates that the form shouldn't be validated when submitted.\n */\n 'noValidate': PropTypes.oneOfType([\n PropTypes.oneOf(['noValidate', 'novalidate', 'NOVALIDATE']),\n PropTypes.bool\n ]),\n\n /**\n * Specifies where to open the linked document (in the case of an <a> element) or where to display the response received (in the case of a <form> element)\n */\n 'target': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Form;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Frame is a wrapper for the <frame> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/frame\n */\nconst Frame = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <frame\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </frame>\n );\n};\n\n\nFrame.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Frame;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Frameset is a wrapper for the <frameset> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/frameset\n */\nconst Frameset = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <frameset\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </frameset>\n );\n};\n\n\nFrameset.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Frameset;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * H1 is a wrapper for the <h1> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/h1\n */\nconst H1 = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <h1\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </h1>\n );\n};\n\n\nH1.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default H1;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * H2 is a wrapper for the <h2> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/h2\n */\nconst H2 = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <h2\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </h2>\n );\n};\n\n\nH2.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default H2;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * H3 is a wrapper for the <h3> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/h3\n */\nconst H3 = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <h3\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </h3>\n );\n};\n\n\nH3.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default H3;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * H4 is a wrapper for the <h4> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/h4\n */\nconst H4 = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <h4\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </h4>\n );\n};\n\n\nH4.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default H4;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * H5 is a wrapper for the <h5> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/h5\n */\nconst H5 = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <h5\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </h5>\n );\n};\n\n\nH5.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default H5;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * H6 is a wrapper for the <h6> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/h6\n */\nconst H6 = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <h6\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </h6>\n );\n};\n\n\nH6.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default H6;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Header is a wrapper for the <header> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/header\n */\nconst Header = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <header\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </header>\n );\n};\n\n\nHeader.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Header;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Hgroup is a wrapper for the <hgroup> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/hgroup\n */\nconst Hgroup = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <hgroup\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </hgroup>\n );\n};\n\n\nHgroup.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Hgroup;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Hr is a wrapper for the <hr> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/hr\n */\nconst Hr = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <hr\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </hr>\n );\n};\n\n\nHr.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Hr;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * I is a wrapper for the <i> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/i\n */\nconst I = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <i\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </i>\n );\n};\n\n\nI.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default I;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Iframe is a wrapper for the <iframe> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe\n */\nconst Iframe = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n const cleanUrl = window.dash_clientside.clean_url;\n const src = React.useMemo(() => props.src && cleanUrl(props.src), [props.src]);\n \n if (src) {\n extraProps.src = src;\n }\n \n React.useEffect(() => {\n if (src && src !== props.src) {\n props.setProps({_dash_error: new Error(`Dangerous link detected: ${props.src}`)})\n }\n }, [props.src, src]);\n \n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <iframe\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </iframe>\n );\n};\n\n\nIframe.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Specifies a feature-policy for the iframe.\n */\n 'allow': PropTypes.string,\n\n /**\n * Specifies the height of elements listed here. For all other elements, use the CSS height property. Note: In some instances, such as <div>, this is a legacy attribute, in which case the CSS height property should be used instead.\n */\n 'height': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Name of the element. For example used by the server to identify the fields in form submits.\n */\n 'name': PropTypes.string,\n\n /**\n * Specifies which referrer is sent when fetching the resource.\n */\n 'referrerPolicy': PropTypes.string,\n\n /**\n * Stops a document loaded in an iframe from using certain features (such as submitting forms or opening new windows).\n */\n 'sandbox': PropTypes.string,\n\n /**\n * The URL of the embeddable content.\n */\n 'src': PropTypes.string,\n\n /**\n *\n */\n 'srcDoc': PropTypes.string,\n\n /**\n * For the elements listed here, this establishes the element's width. Note: For all other instances, such as <div>, this is a legacy attribute, in which case the CSS width property should be used instead.\n */\n 'width': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Iframe;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Img is a wrapper for the <img> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img\n */\nconst Img = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <img\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </img>\n );\n};\n\n\nImg.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Alternative text in case an image can't be displayed.\n */\n 'alt': PropTypes.string,\n\n /**\n * How the element handles cross-origin requests\n */\n 'crossOrigin': PropTypes.string,\n\n /**\n * Specifies the height of elements listed here. For all other elements, use the CSS height property. Note: In some instances, such as <div>, this is a legacy attribute, in which case the CSS height property should be used instead.\n */\n 'height': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Specifies which referrer is sent when fetching the resource.\n */\n 'referrerPolicy': PropTypes.string,\n\n /**\n *\n */\n 'sizes': PropTypes.string,\n\n /**\n * The URL of the embeddable content.\n */\n 'src': PropTypes.string,\n\n /**\n * One or more responsive image candidates.\n */\n 'srcSet': PropTypes.string,\n\n /**\n *\n */\n 'useMap': PropTypes.string,\n\n /**\n * For the elements listed here, this establishes the element's width. Note: For all other instances, such as <div>, this is a legacy attribute, in which case the CSS width property should be used instead.\n */\n 'width': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Img;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Ins is a wrapper for the <ins> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ins\n */\nconst Ins = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <ins\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </ins>\n );\n};\n\n\nIns.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Contains a URI which points to the source of the quote or change.\n */\n 'cite': PropTypes.string,\n\n /**\n * Indicates the date and time associated with the element.\n */\n 'dateTime': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Ins;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Kbd is a wrapper for the <kbd> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/kbd\n */\nconst Kbd = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <kbd\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </kbd>\n );\n};\n\n\nKbd.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Kbd;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Keygen is a wrapper for the <keygen> HTML5 element.\n *\n * DEPRECATED: <keygen> is included for completeness, but should be avoided\n * as it is not supported by all browsers and may be removed at any time from\n * those that do support it.\n *\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/keygen\n */\nconst Keygen = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <keygen\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </keygen>\n );\n};\n\n\nKeygen.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Keygen;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Label is a wrapper for the <label> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/label\n */\nconst Label = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <label\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </label>\n );\n};\n\n\nLabel.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Describes elements which belongs to this one.\n */\n 'htmlFor': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Label;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Legend is a wrapper for the <legend> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/legend\n */\nconst Legend = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <legend\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </legend>\n );\n};\n\n\nLegend.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Legend;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Li is a wrapper for the <li> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/li\n */\nconst Li = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <li\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </li>\n );\n};\n\n\nLi.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Defines a default value which will be displayed in the element on page load.\n */\n 'value': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Li;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Link is a wrapper for the <link> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link\n */\nconst Link = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <link\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </link>\n );\n};\n\n\nLink.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * How the element handles cross-origin requests\n */\n 'crossOrigin': PropTypes.string,\n\n /**\n * The URL of a linked resource.\n */\n 'href': PropTypes.string,\n\n /**\n * Specifies the language of the linked resource.\n */\n 'hrefLang': PropTypes.string,\n\n /**\n * This attribute contains one or more hashes of the resource, and is used to ensure that the content of the resource is what the developer expects it to be, and has not been replaced with a malicious copy in a supply chain attack. See Subresource Integrity.\n */\n 'integrity': PropTypes.string,\n\n /**\n * Specifies a hint of the media for which the linked resource was designed.\n */\n 'media': PropTypes.string,\n\n /**\n * Specifies which referrer is sent when fetching the resource.\n */\n 'referrerPolicy': PropTypes.string,\n\n /**\n * Specifies the relationship of the target object to the link object.\n */\n 'rel': PropTypes.string,\n\n /**\n *\n */\n 'sizes': PropTypes.string,\n\n /**\n * Defines the type of the element.\n */\n 'type': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Link;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Main is a wrapper for the <main> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/main\n */\nconst Main = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <main\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </main>\n );\n};\n\n\nMain.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Main;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * MapEl is a wrapper for the <map> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/map\n */\nconst MapEl = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <map\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </map>\n );\n};\n\n\nMapEl.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Name of the element. For example used by the server to identify the fields in form submits.\n */\n 'name': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default MapEl;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Mark is a wrapper for the <mark> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/mark\n */\nconst Mark = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <mark\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </mark>\n );\n};\n\n\nMark.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Mark;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Marquee is a wrapper for the <marquee> HTML5 element.\n *\n * DEPRECATED: <marquee> is included for completeness, but should be avoided\n * as browsers may remove it at any time.\n *\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/marquee\n */\nconst Marquee = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <marquee\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </marquee>\n );\n};\n\n\nMarquee.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Indicates whether the media should start playing from the start when it's finished.\n */\n 'loop': PropTypes.oneOfType([\n PropTypes.oneOf(['loop', 'LOOP']),\n PropTypes.bool\n ]),\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Marquee;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Meta is a wrapper for the <meta> HTML5 element.\n *\n * CAUTION: <meta> is included for completeness, but generally will not behave\n * as expected since <meta> tags should be static HTML content in the <head> of\n * the document. Dash components are dynamic <body> content.\n *\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta\n */\nconst Meta = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <meta\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </meta>\n );\n};\n\n\nMeta.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Declares the character encoding of the page or script.\n */\n 'charSet': PropTypes.string,\n\n /**\n * A value associated with http-equiv or name depending on the context.\n */\n 'content': PropTypes.string,\n\n /**\n * Defines a pragma directive.\n */\n 'httpEquiv': PropTypes.string,\n\n /**\n * Name of the element. For example used by the server to identify the fields in form submits.\n */\n 'name': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Meta;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Meter is a wrapper for the <meter> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meter\n */\nconst Meter = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <meter\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </meter>\n );\n};\n\n\nMeter.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Indicates the lower bound of the upper range.\n */\n 'high': PropTypes.string,\n\n /**\n * Indicates the upper bound of the lower range.\n */\n 'low': PropTypes.string,\n\n /**\n * Indicates the maximum value allowed.\n */\n 'max': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Indicates the minimum value allowed.\n */\n 'min': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Indicates the optimal numeric value.\n */\n 'optimum': PropTypes.string,\n\n /**\n * Defines a default value which will be displayed in the element on page load.\n */\n 'value': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Meter;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Nav is a wrapper for the <nav> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/nav\n */\nconst Nav = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <nav\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </nav>\n );\n};\n\n\nNav.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Nav;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Nobr is a wrapper for the <nobr> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/nobr\n */\nconst Nobr = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <nobr\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </nobr>\n );\n};\n\n\nNobr.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Nobr;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Noscript is a wrapper for the <noscript> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/noscript\n */\nconst Noscript = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <noscript\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </noscript>\n );\n};\n\n\nNoscript.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Noscript;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * ObjectEl is a wrapper for the <object> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/object\n */\nconst ObjectEl = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n const cleanUrl = window.dash_clientside.clean_url;\n const data = React.useMemo(() => props.data && cleanUrl(props.data), [props.data]);\n \n if (data) {\n extraProps.data = data;\n }\n \n React.useEffect(() => {\n if (data && data !== props.data) {\n props.setProps({_dash_error: new Error(`Dangerous link detected: ${props.data}`)})\n }\n }, [props.data, data]);\n \n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <object\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </object>\n );\n};\n\n\nObjectEl.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Specifies the URL of the resource.\n */\n 'data': PropTypes.string,\n\n /**\n * Indicates the form that is the owner of the element.\n */\n 'form': PropTypes.string,\n\n /**\n * Specifies the height of elements listed here. For all other elements, use the CSS height property. Note: In some instances, such as <div>, this is a legacy attribute, in which case the CSS height property should be used instead.\n */\n 'height': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Name of the element. For example used by the server to identify the fields in form submits.\n */\n 'name': PropTypes.string,\n\n /**\n * Defines the type of the element.\n */\n 'type': PropTypes.string,\n\n /**\n *\n */\n 'useMap': PropTypes.string,\n\n /**\n * For the elements listed here, this establishes the element's width. Note: For all other instances, such as <div>, this is a legacy attribute, in which case the CSS width property should be used instead.\n */\n 'width': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default ObjectEl;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Ol is a wrapper for the <ol> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ol\n */\nconst Ol = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <ol\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </ol>\n );\n};\n\n\nOl.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Indicates whether the list should be displayed in a descending order instead of an ascending order.\n */\n 'reversed': PropTypes.oneOfType([\n PropTypes.oneOf(['reversed', 'REVERSED']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the first number if other than 1.\n */\n 'start': PropTypes.string,\n\n /**\n * Defines the type of the element.\n */\n 'type': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Ol;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Optgroup is a wrapper for the <optgroup> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/optgroup\n */\nconst Optgroup = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <optgroup\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </optgroup>\n );\n};\n\n\nOptgroup.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Indicates whether the user can interact with the element.\n */\n 'disabled': PropTypes.oneOfType([\n PropTypes.oneOf(['disabled', 'DISABLED']),\n PropTypes.bool\n ]),\n\n /**\n * Specifies a user-readable title of the element.\n */\n 'label': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Optgroup;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Option is a wrapper for the <option> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/option\n */\nconst Option = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <option\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </option>\n );\n};\n\n\nOption.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Indicates whether the user can interact with the element.\n */\n 'disabled': PropTypes.oneOfType([\n PropTypes.oneOf(['disabled', 'DISABLED']),\n PropTypes.bool\n ]),\n\n /**\n * Specifies a user-readable title of the element.\n */\n 'label': PropTypes.string,\n\n /**\n * Defines a value which will be selected on page load.\n */\n 'selected': PropTypes.oneOfType([\n PropTypes.oneOf(['selected', 'SELECTED']),\n PropTypes.bool\n ]),\n\n /**\n * Defines a default value which will be displayed in the element on page load.\n */\n 'value': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Option;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Output is a wrapper for the <output> HTML5 element.\n *\n * CAUTION: <output> is included for completeness, but its typical usage\n * requires the oninput attribute of the enclosing <form> element, which\n * is not accessible to Dash.\n *\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/output\n */\nconst Output = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <output\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </output>\n );\n};\n\n\nOutput.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Describes elements which belongs to this one.\n */\n 'htmlFor': PropTypes.string,\n\n /**\n * Indicates the form that is the owner of the element.\n */\n 'form': PropTypes.string,\n\n /**\n * Name of the element. For example used by the server to identify the fields in form submits.\n */\n 'name': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Output;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * P is a wrapper for the <p> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/p\n */\nconst P = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <p\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </p>\n );\n};\n\n\nP.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default P;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Param is a wrapper for the <param> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/param\n */\nconst Param = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <param\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </param>\n );\n};\n\n\nParam.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Name of the element. For example used by the server to identify the fields in form submits.\n */\n 'name': PropTypes.string,\n\n /**\n * Defines a default value which will be displayed in the element on page load.\n */\n 'value': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Param;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Picture is a wrapper for the <picture> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/picture\n */\nconst Picture = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <picture\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </picture>\n );\n};\n\n\nPicture.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Picture;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Plaintext is a wrapper for the <plaintext> HTML5 element.\n *\n * OBSOLETE: <plaintext> is included for completeness, but should be avoided\n * as browsers may remove it at any time, and its behavior when added\n * dynamically by Dash is not what it would be statically on page load.\n * Use <pre> or <code> instead.\n *\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/plaintext\n */\nconst Plaintext = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <plaintext\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </plaintext>\n );\n};\n\n\nPlaintext.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Plaintext;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Pre is a wrapper for the <pre> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/pre\n */\nconst Pre = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <pre\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </pre>\n );\n};\n\n\nPre.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Pre;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Progress is a wrapper for the <progress> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/progress\n */\nconst Progress = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <progress\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </progress>\n );\n};\n\n\nProgress.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Indicates the maximum value allowed.\n */\n 'max': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Defines a default value which will be displayed in the element on page load.\n */\n 'value': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Progress;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Q is a wrapper for the <q> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/q\n */\nconst Q = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <q\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </q>\n );\n};\n\n\nQ.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Contains a URI which points to the source of the quote or change.\n */\n 'cite': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Q;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Rb is a wrapper for the <rb> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/rb\n */\nconst Rb = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <rb\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </rb>\n );\n};\n\n\nRb.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Rb;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Rp is a wrapper for the <rp> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/rp\n */\nconst Rp = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <rp\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </rp>\n );\n};\n\n\nRp.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Rp;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Rt is a wrapper for the <rt> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/rt\n */\nconst Rt = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <rt\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </rt>\n );\n};\n\n\nRt.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Rt;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Rtc is a wrapper for the <rtc> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/rtc\n */\nconst Rtc = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <rtc\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </rtc>\n );\n};\n\n\nRtc.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Rtc;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Ruby is a wrapper for the <ruby> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ruby\n */\nconst Ruby = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <ruby\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </ruby>\n );\n};\n\n\nRuby.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Ruby;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * S is a wrapper for the <s> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/s\n */\nconst S = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <s\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </s>\n );\n};\n\n\nS.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default S;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Samp is a wrapper for the <samp> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/samp\n */\nconst Samp = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <samp\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </samp>\n );\n};\n\n\nSamp.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Samp;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Script is a wrapper for the <script> HTML5 element.\n *\n * CAUTION: <script> is included for completeness, but you cannot execute\n * JavaScript code by providing it to a <script> element. Use a clientside\n * callback for this purpose instead.\n *\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script\n */\nconst Script = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <script\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </script>\n );\n};\n\n\nScript.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Executes the script asynchronously.\n */\n 'async': PropTypes.oneOfType([\n PropTypes.oneOf(['async', 'ASYNC']),\n PropTypes.bool\n ]),\n\n /**\n * How the element handles cross-origin requests\n */\n 'crossOrigin': PropTypes.string,\n\n /**\n * Indicates that the script should be executed after the page has been parsed.\n */\n 'defer': PropTypes.oneOfType([\n PropTypes.oneOf(['defer', 'DEFER']),\n PropTypes.bool\n ]),\n\n /**\n * This attribute contains one or more hashes of the resource, and is used to ensure that the content of the resource is what the developer expects it to be, and has not been replaced with a malicious copy in a supply chain attack. See Subresource Integrity.\n */\n 'integrity': PropTypes.string,\n\n /**\n * Specifies which referrer is sent when fetching the resource.\n */\n 'referrerPolicy': PropTypes.string,\n\n /**\n * The URL of the embeddable content.\n */\n 'src': PropTypes.string,\n\n /**\n * Defines the type of the element.\n */\n 'type': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Script;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Section is a wrapper for the <section> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/section\n */\nconst Section = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <section\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </section>\n );\n};\n\n\nSection.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Section;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Select is a wrapper for the <select> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/select\n */\nconst Select = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <select\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </select>\n );\n};\n\n\nSelect.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * The element should be automatically focused after the page loaded.\n */\n 'autoFocus': PropTypes.oneOfType([\n PropTypes.oneOf(['autoFocus', 'autofocus', 'AUTOFOCUS']),\n PropTypes.bool\n ]),\n\n /**\n * Indicates whether controls in this form can by default have their values automatically completed by the browser.\n */\n 'autoComplete': PropTypes.string,\n\n /**\n * Indicates whether the user can interact with the element.\n */\n 'disabled': PropTypes.oneOfType([\n PropTypes.oneOf(['disabled', 'DISABLED']),\n PropTypes.bool\n ]),\n\n /**\n * Indicates the form that is the owner of the element.\n */\n 'form': PropTypes.string,\n\n /**\n * Indicates whether multiple values can be entered in an input of the type email or file.\n */\n 'multiple': PropTypes.oneOfType([\n PropTypes.oneOf(['multiple', 'MULTIPLE']),\n PropTypes.bool\n ]),\n\n /**\n * Name of the element. For example used by the server to identify the fields in form submits.\n */\n 'name': PropTypes.string,\n\n /**\n * Indicates whether this element is required to fill out or not.\n */\n 'required': PropTypes.oneOfType([\n PropTypes.oneOf(['required', 'REQUIRED']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the width of the element (in pixels). If the element's type attribute is text or password then it's the number of characters.\n */\n 'size': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Select;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Shadow is a wrapper for the <shadow> HTML5 element.\n *\n * DEPRECATED: <shadow> is included for completeness, but should be avoided\n * as it is not supported by all browsers and may be removed at any time from\n * those that do support it.\n *\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/shadow\n */\nconst Shadow = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <shadow\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </shadow>\n );\n};\n\n\nShadow.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Shadow;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Slot is a wrapper for the <slot> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/slot\n */\nconst Slot = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <slot\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </slot>\n );\n};\n\n\nSlot.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Slot;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Small is a wrapper for the <small> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/small\n */\nconst Small = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <small\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </small>\n );\n};\n\n\nSmall.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Small;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Source is a wrapper for the <source> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/source\n */\nconst Source = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <source\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </source>\n );\n};\n\n\nSource.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Specifies a hint of the media for which the linked resource was designed.\n */\n 'media': PropTypes.string,\n\n /**\n *\n */\n 'sizes': PropTypes.string,\n\n /**\n * The URL of the embeddable content.\n */\n 'src': PropTypes.string,\n\n /**\n * One or more responsive image candidates.\n */\n 'srcSet': PropTypes.string,\n\n /**\n * Defines the type of the element.\n */\n 'type': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Source;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Spacer is a wrapper for the <spacer> HTML5 element.\n *\n * OBSOLETE: <spacer> is included for completeness, but should be avoided\n * as it is not supported by any modern browsers.\n *\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/spacer\n */\nconst Spacer = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <spacer\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </spacer>\n );\n};\n\n\nSpacer.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Spacer;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Span is a wrapper for the <span> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/span\n */\nconst Span = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <span\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </span>\n );\n};\n\n\nSpan.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Span;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Strike is a wrapper for the <strike> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/strike\n */\nconst Strike = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <strike\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </strike>\n );\n};\n\n\nStrike.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Strike;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Strong is a wrapper for the <strong> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/strong\n */\nconst Strong = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <strong\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </strong>\n );\n};\n\n\nStrong.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Strong;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Sub is a wrapper for the <sub> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/sub\n */\nconst Sub = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <sub\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </sub>\n );\n};\n\n\nSub.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Sub;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Summary is a wrapper for the <summary> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/summary\n */\nconst Summary = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <summary\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </summary>\n );\n};\n\n\nSummary.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Summary;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Sup is a wrapper for the <sup> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/sup\n */\nconst Sup = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <sup\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </sup>\n );\n};\n\n\nSup.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Sup;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Table is a wrapper for the <table> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/table\n */\nconst Table = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <table\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </table>\n );\n};\n\n\nTable.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n *\n */\n 'summary': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Table;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Tbody is a wrapper for the <tbody> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/tbody\n */\nconst Tbody = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <tbody\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </tbody>\n );\n};\n\n\nTbody.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Tbody;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Td is a wrapper for the <td> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/td\n */\nconst Td = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <td\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </td>\n );\n};\n\n\nTd.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * The colspan attribute defines the number of columns a cell should span.\n */\n 'colSpan': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * IDs of the <th> elements which applies to this element.\n */\n 'headers': PropTypes.string,\n\n /**\n * Defines the number of rows a table cell should span over.\n */\n 'rowSpan': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Td;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Template is a wrapper for the <template> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/template\n */\nconst Template = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <template\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </template>\n );\n};\n\n\nTemplate.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Template;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Textarea is a wrapper for the <textarea> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/textarea\n */\nconst Textarea = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <textarea\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </textarea>\n );\n};\n\n\nTextarea.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * The element should be automatically focused after the page loaded.\n */\n 'autoFocus': PropTypes.oneOfType([\n PropTypes.oneOf(['autoFocus', 'autofocus', 'AUTOFOCUS']),\n PropTypes.bool\n ]),\n\n /**\n * Indicates whether controls in this form can by default have their values automatically completed by the browser.\n */\n 'autoComplete': PropTypes.string,\n\n /**\n * Defines the number of columns in a textarea.\n */\n 'cols': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Indicates whether the user can interact with the element.\n */\n 'disabled': PropTypes.oneOfType([\n PropTypes.oneOf(['disabled', 'DISABLED']),\n PropTypes.bool\n ]),\n\n /**\n * Indicates the form that is the owner of the element.\n */\n 'form': PropTypes.string,\n\n /**\n * Provides a hint as to the type of data that might be entered by the user while editing the element or its contents. The attribute can be used with form controls (such as the value of textarea elements), or in elements in an editing host (e.g., using contenteditable attribute).\n */\n 'inputMode': PropTypes.string,\n\n /**\n * Defines the maximum number of characters allowed in the element.\n */\n 'maxLength': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Defines the minimum number of characters allowed in the element.\n */\n 'minLength': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Name of the element. For example used by the server to identify the fields in form submits.\n */\n 'name': PropTypes.string,\n\n /**\n * Provides a hint to the user of what can be entered in the field.\n */\n 'placeholder': PropTypes.string,\n\n /**\n * Indicates whether the element can be edited.\n */\n 'readOnly': PropTypes.string,\n\n /**\n * Indicates whether this element is required to fill out or not.\n */\n 'required': PropTypes.oneOfType([\n PropTypes.oneOf(['required', 'REQUIRED']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the number of rows in a text area.\n */\n 'rows': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Indicates whether the text should be wrapped.\n */\n 'wrap': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Textarea;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Tfoot is a wrapper for the <tfoot> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/tfoot\n */\nconst Tfoot = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <tfoot\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </tfoot>\n );\n};\n\n\nTfoot.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Tfoot;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Th is a wrapper for the <th> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/th\n */\nconst Th = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <th\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </th>\n );\n};\n\n\nTh.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * The colspan attribute defines the number of columns a cell should span.\n */\n 'colSpan': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * IDs of the <th> elements which applies to this element.\n */\n 'headers': PropTypes.string,\n\n /**\n * Defines the number of rows a table cell should span over.\n */\n 'rowSpan': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Defines the cells that the header test (defined in the th element) relates to.\n */\n 'scope': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Th;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Thead is a wrapper for the <thead> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/thead\n */\nconst Thead = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <thead\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </thead>\n );\n};\n\n\nThead.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Thead;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Time is a wrapper for the <time> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/time\n */\nconst Time = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <time\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </time>\n );\n};\n\n\nTime.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Indicates the date and time associated with the element.\n */\n 'dateTime': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Time;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Title is a wrapper for the <title> HTML5 element.\n *\n * CAUTION: <title> is included for completeness, but is not expected to\n * do anything outside of <head>. Dash components are always created in the\n * <body>.\n *\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/title\n */\nconst Title = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <title\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </title>\n );\n};\n\n\nTitle.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Title;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Tr is a wrapper for the <tr> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/tr\n */\nconst Tr = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <tr\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </tr>\n );\n};\n\n\nTr.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Tr;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Track is a wrapper for the <track> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/track\n */\nconst Track = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <track\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </track>\n );\n};\n\n\nTrack.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Indicates that the track should be enabled unless the user's preferences indicate something different.\n */\n 'default': PropTypes.oneOfType([\n PropTypes.oneOf(['default', 'DEFAULT']),\n PropTypes.bool\n ]),\n\n /**\n * Specifies the kind of text track.\n */\n 'kind': PropTypes.string,\n\n /**\n * Specifies a user-readable title of the element.\n */\n 'label': PropTypes.string,\n\n /**\n * The URL of the embeddable content.\n */\n 'src': PropTypes.string,\n\n /**\n *\n */\n 'srcLang': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Track;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * U is a wrapper for the <u> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/u\n */\nconst U = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <u\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </u>\n );\n};\n\n\nU.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default U;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Ul is a wrapper for the <ul> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ul\n */\nconst Ul = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <ul\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </ul>\n );\n};\n\n\nUl.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Ul;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Var is a wrapper for the <var> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/var\n */\nconst Var = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <var\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </var>\n );\n};\n\n\nVar.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Var;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Video is a wrapper for the <video> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/video\n */\nconst Video = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <video\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </video>\n );\n};\n\n\nVideo.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * The audio or video should play as soon as possible.\n */\n 'autoPlay': PropTypes.oneOfType([\n PropTypes.oneOf(['autoPlay', 'autoplay', 'AUTOPLAY']),\n PropTypes.bool\n ]),\n\n /**\n * Indicates whether the browser should show playback controls to the user.\n */\n 'controls': PropTypes.oneOfType([\n PropTypes.oneOf(['controls', 'CONTROLS']),\n PropTypes.bool\n ]),\n\n /**\n * How the element handles cross-origin requests\n */\n 'crossOrigin': PropTypes.string,\n\n /**\n * Specifies the height of elements listed here. For all other elements, use the CSS height property. Note: In some instances, such as <div>, this is a legacy attribute, in which case the CSS height property should be used instead.\n */\n 'height': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Indicates whether the media should start playing from the start when it's finished.\n */\n 'loop': PropTypes.oneOfType([\n PropTypes.oneOf(['loop', 'LOOP']),\n PropTypes.bool\n ]),\n\n /**\n * Indicates whether the audio will be initially silenced on page load.\n */\n 'muted': PropTypes.oneOfType([\n PropTypes.oneOf(['muted', 'MUTED']),\n PropTypes.bool\n ]),\n\n /**\n * A Boolean attribute indicating that the video is to be played \"inline\"; that is, within the element's playback area. Note that the absence of this attribute does not imply that the video will always be played in fullscreen.\n */\n 'playsInline': PropTypes.oneOfType([\n PropTypes.oneOf(['playsInline', 'playsinline', 'PLAYSINLINE']),\n PropTypes.bool\n ]),\n\n /**\n * A URL indicating a poster frame to show until the user plays or seeks.\n */\n 'poster': PropTypes.string,\n\n /**\n * Indicates whether the whole resource, parts of it or nothing should be preloaded.\n */\n 'preload': PropTypes.string,\n\n /**\n * The URL of the embeddable content.\n */\n 'src': PropTypes.string,\n\n /**\n * For the elements listed here, this establishes the element's width. Note: For all other instances, such as <div>, this is a legacy attribute, in which case the CSS width property should be used instead.\n */\n 'width': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Video;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Wbr is a wrapper for the <wbr> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/wbr\n */\nconst Wbr = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <wbr\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </wbr>\n );\n};\n\n\nWbr.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Wbr;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {omit} from 'ramda';\n\n\n/**\n * Xmp is a wrapper for the <xmp> HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/xmp\n */\nconst Xmp = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n <xmp\n {...(!isStatic && {onClick:\n () => props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n </xmp>\n );\n};\n\n\nXmp.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n 'id': PropTypes.string,\n\n /**\n * The children of this component\n */\n 'children': PropTypes.node,\n\n /**\n * An integer that represents the number of times\n * that this element has been clicked on.\n */\n 'n_clicks': PropTypes.number,\n\n /**\n * An integer that represents the time (in ms since 1970)\n * at which n_clicks changed. This can be used to tell\n * which button was changed most recently.\n */\n 'n_clicks_timestamp': PropTypes.number,\n\n /**\n * When True, this will disable the n_clicks prop. Use this to remove\n * event listeners that may interfere with screen readers.\n */\n 'disable_n_clicks': PropTypes.bool,\n\n /**\n * A unique identifier for the component, used to improve\n * performance by React.js while rendering components\n * See https://reactjs.org/docs/lists-and-keys.html for more info\n */\n 'key': PropTypes.string,\n\n /**\n * A wildcard data attribute\n */\n 'data-*': PropTypes.string,\n\n /**\n * A wildcard aria attribute\n */\n 'aria-*': PropTypes.string,\n\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n 'accessKey': PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n 'className': PropTypes.string,\n\n /**\n * Indicates whether the element's content is editable.\n */\n 'contentEditable': PropTypes.string,\n\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)\n */\n 'dir': PropTypes.string,\n\n /**\n * Defines whether the element can be dragged.\n */\n 'draggable': PropTypes.string,\n\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n 'hidden': PropTypes.oneOfType([\n PropTypes.oneOf(['hidden', 'HIDDEN']),\n PropTypes.bool\n ]),\n\n /**\n * Defines the language used in the element.\n */\n 'lang': PropTypes.string,\n\n /**\n * Defines an explicit role for an element for use by assistive technologies.\n */\n 'role': PropTypes.string,\n\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n 'spellCheck': PropTypes.string,\n\n /**\n * Defines CSS styles which will override styles previously set.\n */\n 'style': PropTypes.object,\n\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n 'tabIndex': PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n 'title': PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the element is clicked.\n */\n 'setProps': PropTypes.func\n};\n\nexport default Xmp;\n"],"names":["__webpack_require__","module","getter","__esModule","d","a","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","external_React_namespaceObject","window","external_PropTypes_namespaceObject","_isPlaceholder","_curry1","fn","f1","arguments","length","apply","this","_curry2","f2","b","_b","_a","es_omit","names","result","index","idx","len","A","_ref","_ref$n_clicks","n_clicks","props","n_clicks_timestamp","_objectWithoutProperties","_excluded","extraProps","dash_component_api","useDashContext","useLoading","cleanUrl","dash_clientside","clean_url","href","React","setProps","_dash_error","Error","concat","isStatic","disable_n_clicks","id","_extends","onClick","Date","now","omit","children","propTypes","PropTypes","download","hrefLang","media","referrerPolicy","rel","shape","target","accessKey","className","contentEditable","dir","draggable","hidden","lang","role","spellCheck","style","tabIndex","title","A_react","Abbr","Abbr_react","Acronym","Acronym_react","Address","Address_react","Area","alt","coords","Area_react","Article","Article_react","Aside","Aside_react","Audio","autoPlay","controls","crossOrigin","loop","muted","preload","src","Audio_react","B","B_react","Base","Base_react","Basefont","Basefont_react","Bdi","Bdi_react","Bdo","Bdo_react","Big","Big_react","Blink","Blink_react","Blockquote","cite","Blockquote_react","Br","Br_react","Button","formAction","autoFocus","disabled","form","formEncType","formMethod","formNoValidate","formTarget","name","type","Button_react","Canvas","height","width","Canvas_react","Caption","Caption_react","Center","Center_react","Cite","Cite_react","Code","Code_react","Col","span","Col_react","Colgroup","Colgroup_react","Content","Content_react","Data","Data_react","Datalist","Datalist_react","Dd","Dd_react","Del","dateTime","Del_react","Details","open","Details_react","Dfn","Dfn_react","Dialog","Dialog_react","Div","Div_react","Dl","Dl_react","Dt","Dt_react","Em","Em_react","Embed","Embed_react","Fieldset","Fieldset_react","Figcaption","Figcaption_react","Figure","Figure_react","Font","Font_react","Footer","Footer_react","Form","action","accept","acceptCharset","autoComplete","encType","method","noValidate","Form_react","Frame","Frame_react","Frameset","Frameset_react","H1","H1_react","H2","H2_react","H3","H3_react","H4","H4_react","H5","H5_react","H6","H6_react","Header","Header_react","Hgroup","Hgroup_react","Hr","Hr_react","I","I_react","Iframe","allow","sandbox","srcDoc","Iframe_react","Img","sizes","srcSet","useMap","Img_react","Ins","Ins_react","Kbd","Kbd_react","Keygen","Keygen_react","Label","htmlFor","Label_react","Legend","Legend_react","Li","Li_react","Link","integrity","Link_react","Main","Main_react","MapEl","MapEl_react","Mark","Mark_react","Marquee","Marquee_react","Meta","charSet","content","httpEquiv","Meta_react","Meter","high","low","max","min","optimum","Meter_react","Nav","Nav_react","Nobr","Nobr_react","Noscript","Noscript_react","ObjectEl","data","ObjectEl_react","Ol","reversed","start","Ol_react","Optgroup","label","Optgroup_react","Option","selected","Option_react","Output","Output_react","P","P_react","Param","Param_react","Picture","Picture_react","Plaintext","Plaintext_react","Pre","Pre_react","Progress","Progress_react","Q","Q_react","Rb","Rb_react","Rp","Rp_react","Rt","Rt_react","Rtc","Rtc_react","Ruby","Ruby_react","S","S_react","Samp","Samp_react","Script","async","defer","Script_react","Section","Section_react","Select","multiple","required","size","Select_react","Shadow","Shadow_react","Slot","Slot_react","Small","Small_react","Source","Source_react","Spacer","Spacer_react","Span","Span_react","Strike","Strike_react","Strong","Strong_react","Sub","Sub_react","Summary","Summary_react","Sup","Sup_react","Table","summary","Table_react","Tbody","Tbody_react","Td","colSpan","headers","rowSpan","Td_react","Template","Template_react","Textarea","cols","inputMode","maxLength","minLength","placeholder","readOnly","rows","wrap","Textarea_react","Tfoot","Tfoot_react","Th","scope","Th_react","Thead","Thead_react","Time","Time_react","Title","Title_react","Tr","Tr_react","Track","default","kind","srcLang","Track_react","U","U_react","Ul","Ul_react","Var","Var_react","Video","playsInline","poster","Video_react","Wbr","Wbr_react","Xmp","Xmp_react"],"sourceRoot":""} \ No newline at end of file diff --git a/dash/html/package-info.json b/dash/html/package-info.json index 485de51b27..c8a91b33f9 100644 --- a/dash/html/package-info.json +++ b/dash/html/package-info.json @@ -1,6 +1,6 @@ { "name": "dash-html-components", - "version": "4.5.1", + "version": "4.5.2", "description": "Vanilla HTML components for Dash", "main": "lib/index.js", "repository": {
    HTML5 element.\n * For detailed attribute info see:\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/caption\n */\nconst Caption = ({n_clicks = 0, n_clicks_timestamp = -1, ...props}) => {\n const extraProps = {};\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n if (loading) {\n extraProps['data-dash-is-loading'] = true;\n }\n\n /* remove unnecessary onClick event listeners */\n const isStatic = props.disable_n_clicks || !props.id;\n return (\n props.setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now()\n })\n })}\n {...omit(['n_clicks', 'n_clicks_timestamp', 'loading_state', 'setProps', 'disable_n_clicks'], props)}\n {...extraProps}\n >\n {props.children}\n